ZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IDUyMWYwMGQuLjhlNTc3Y2UgMTAwNjQ0Ci0tLSBhL0NSRURJVFMKKysrIGIvQ1JFRElUUwpAQCAtMzIwMyw3ICszMjAzLDcgQEAKIEU6IGVic0BlYnNob21lLm5ldAogVzogaHR0cDovL2tlcm5lbC5lYnNob21lLm5ldC8KIFA6IDEwMjREL0FFNTQ2N0YxIEZGMjIgMzlGMSA2NzI4IDg5RjYgNkU2QyAgMjM2NSA3NjAyIEYzM0QgQUU1NCA2N0YxCi1EOiBFbWJlZGRlZCBQb3dlclBDIDR4eDogSTJDLCBQSUMgYW5kIHJhbmRvbSBoYWNrcy9maXhlcworRDogRW1iZWRkZWQgUG93ZXJQQyA0eHg6IEVNQUMsIEkyQywgUElDIGFuZCByYW5kb20gaGFja3MvZml4ZXMKIFM6IFN1bm55dmFsZSwgQ2FsaWZvcm5pYSA5NDA4NQogUzogVVNBCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQ2hhbmdlcyBiL0RvY3VtZW50YXRpb24vQ2hhbmdlcwppbmRleCA4NmI4NjM5Li5mZTVhZTBmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0NoYW5nZXMKKysrIGIvRG9jdW1lbnRhdGlvbi9DaGFuZ2VzCkBAIC0zMSw4ICszMSw2IEBACiBFaW5lIGRldXRzY2hlIFZlcnNpb24gZGllc2VyIERhdGVpIGZpbmRlbiBTaWUgdW50ZXIKIDxodHRwOi8vd3d3LnN0ZWZhbi13aW50ZXIuZGUvQ2hhbmdlcy0yLjQuMC50eHQ+LgogCi1MYXN0IHVwZGF0ZWQ6IE9jdG9iZXIgMjl0aCwgMjAwMgotCiBDaHJpcyBSaWNrZXIgKGthYm9vbUBnYXRlY2guZWR1IG9yIGNocmlzLnJpY2tlckBnZW5ldGljcy51dGFoLmVkdSkuCiAKIEN1cnJlbnQgTWluaW1hbCBSZXF1aXJlbWVudHMKQEAgLTQ4LDcgKzQ2LDcgQEAKIGhhcmR3YXJlLCBmb3IgZXhhbXBsZSwgeW91IHByb2JhYmx5IG5lZWRuJ3QgY29uY2VybiB5b3Vyc2VsZiB3aXRoCiBpc2RuNGstdXRpbHMuCiAKLW8gIEdudSBDICAgICAgICAgICAgICAgICAgMi45NS4zICAgICAgICAgICAgICAgICAgIyBnY2MgLS12ZXJzaW9uCitvICBHbnUgQyAgICAgICAgICAgICAgICAgIDMuMiAgICAgICAgICAgICAgICAgICAgICMgZ2NjIC0tdmVyc2lvbgogbyAgR251IG1ha2UgICAgICAgICAgICAgICAzLjc5LjEgICAgICAgICAgICAgICAgICAjIG1ha2UgLS12ZXJzaW9uCiBvICBiaW51dGlscyAgICAgICAgICAgICAgIDIuMTIgICAgICAgICAgICAgICAgICAgICMgbGQgLXYKIG8gIHV0aWwtbGludXggICAgICAgICAgICAgMi4xMG8gICAgICAgICAgICAgICAgICAgIyBmZGZvcm1hdCAtLXZlcnNpb24KQEAgLTc0LDI2ICs3Miw3IEBACiAtLS0KIAogVGhlIGdjYyB2ZXJzaW9uIHJlcXVpcmVtZW50cyBtYXkgdmFyeSBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgQ1BVIGluIHlvdXIKLWNvbXB1dGVyLiBUaGUgbmV4dCBwYXJhZ3JhcGggYXBwbGllcyB0byB1c2VycyBvZiB4ODYgQ1BVcywgYnV0IG5vdAotbmVjZXNzYXJpbHkgdG8gdXNlcnMgb2Ygb3RoZXIgQ1BVcy4gVXNlcnMgb2Ygb3RoZXIgQ1BVcyBzaG91bGQgb2J0YWluCi1pbmZvcm1hdGlvbiBhYm91dCB0aGVpciBnY2MgdmVyc2lvbiByZXF1aXJlbWVudHMgZnJvbSBhbm90aGVyIHNvdXJjZS4KLQotVGhlIHJlY29tbWVuZGVkIGNvbXBpbGVyIGZvciB0aGUga2VybmVsIGlzIGdjYyAyLjk1LnggKHggPj0gMyksIGFuZCBpdAotc2hvdWxkIGJlIHVzZWQgd2hlbiB5b3UgbmVlZCBhYnNvbHV0ZSBzdGFiaWxpdHkuIFlvdSBtYXkgdXNlIGdjYyAzLjAueAotaW5zdGVhZCBpZiB5b3Ugd2lzaCwgYWx0aG91Z2ggaXQgbWF5IGNhdXNlIHByb2JsZW1zLiBMYXRlciB2ZXJzaW9ucyBvZiBnY2MgCi1oYXZlIG5vdCByZWNlaXZlZCBtdWNoIHRlc3RpbmcgZm9yIExpbnV4IGtlcm5lbCBjb21waWxhdGlvbiwgYW5kIHRoZXJlIGFyZSAKLWFsbW9zdCBjZXJ0YWlubHkgYnVncyAobWFpbmx5LCBidXQgbm90IGV4Y2x1c2l2ZWx5LCBpbiB0aGUga2VybmVsKSB0aGF0Ci13aWxsIG5lZWQgdG8gYmUgZml4ZWQgaW4gb3JkZXIgdG8gdXNlIHRoZXNlIGNvbXBpbGVycy4gSW4gYW55IGNhc2UsIHVzaW5nCi1wZ2NjIGluc3RlYWQgb2YgcGxhaW4gZ2NjIGlzIGp1c3QgYXNraW5nIGZvciB0cm91YmxlLgotCi1UaGUgUmVkIEhhdCBnY2MgMi45NiBjb21waWxlciBzdWJ0cmVlIGNhbiBhbHNvIGJlIHVzZWQgdG8gYnVpbGQgdGhpcyB0cmVlLgotWW91IHNob3VsZCBlbnN1cmUgeW91IHVzZSBnY2MtMi45Ni03NCBvciBsYXRlci4gZ2NjLTIuOTYtNTQgd2lsbCBub3QgYnVpbGQKLXRoZSBrZXJuZWwgY29ycmVjdGx5LgotCi1JbiBhZGRpdGlvbiwgcGxlYXNlIHBheSBhdHRlbnRpb24gdG8gY29tcGlsZXIgb3B0aW1pemF0aW9uLiAgQW55dGhpbmcKLWdyZWF0ZXIgdGhhbiAtTzIgbWF5IG5vdCBiZSB3aXNlLiAgU2ltaWxhcmx5LCBpZiB5b3UgY2hvb3NlIHRvIHVzZSBnY2MtMi45NS54Ci1vciBkZXJpdmF0aXZlcywgYmUgc3VyZSBub3QgdG8gdXNlIC1mc3RyaWN0LWFsaWFzaW5nICh3aGljaCwgZGVwZW5kaW5nIG9uCi15b3VyIHZlcnNpb24gb2YgZ2NjIDIuOTUueCwgbWF5IG5lY2Vzc2l0YXRlIHVzaW5nIC1mbm8tc3RyaWN0LWFsaWFzaW5nKS4KK2NvbXB1dGVyLgogCiBNYWtlCiAtLS0tCkBAIC0zMjIsOSArMzAxLDkgQEAKIEtlcm5lbCBjb21waWxhdGlvbgogKioqKioqKioqKioqKioqKioqCiAKLWdjYyAyLjk1LjMKLS0tLS0tLS0tLS0KLW8gIDxmdHA6Ly9mdHAuZ251Lm9yZy9nbnUvZ2NjL2djYy0yLjk1LjMudGFyLmd6PgorZ2NjCistLS0KK28gIDxmdHA6Ly9mdHAuZ251Lm9yZy9nbnUvZ2NjLz4KIAogTWFrZQogLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZSBiL0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKaW5kZXggZWI3ZGIzYy4uY2U1ZDJjMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQorKysgYi9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlCkBAIC0xOTksNyArMTk5LDcgQEAKICAgICBtb2RpZmljYXRpb25zIGFyZSBwcmV2ZW50ZWQKIC0gc2F2ZXMgdGhlIGNvbXBpbGVyIHdvcmsgdG8gb3B0aW1pemUgcmVkdW5kYW50IGNvZGUgYXdheSA7KQogCi1pbnQgZnVuKGludCApCitpbnQgZnVuKGludCBhKQogewogCWludCByZXN1bHQgPSAwOwogCWNoYXIgKmJ1ZmZlciA9IGttYWxsb2MoU0laRSk7CkBAIC0zNDQsNyArMzQ0LDcgQEAKIGhhdmUgYSByZWZlcmVuY2UgY291bnQgb24gaXQsIHlvdSBhbG1vc3QgY2VydGFpbmx5IGhhdmUgYSBidWcuCiAKIAotCQlDaGFwdGVyIDExOiBNYWNyb3MsIEVudW1zLCBJbmxpbmUgZnVuY3Rpb25zIGFuZCBSVEwKKwkJQ2hhcHRlciAxMTogTWFjcm9zLCBFbnVtcyBhbmQgUlRMCiAKIE5hbWVzIG9mIG1hY3JvcyBkZWZpbmluZyBjb25zdGFudHMgYW5kIGxhYmVscyBpbiBlbnVtcyBhcmUgY2FwaXRhbGl6ZWQuCiAKQEAgLTQyOSw3ICs0MjksMzUgQEAKIGxhbmd1YWdlLgogCiAKLQkJQ2hhcHRlciAxNDogUmVmZXJlbmNlcworCQlDaGFwdGVyIDE0OiBUaGUgaW5saW5lIGRpc2Vhc2UKKworVGhlcmUgYXBwZWFycyB0byBiZSBhIGNvbW1vbiBtaXNwZXJjZXB0aW9uIHRoYXQgZ2NjIGhhcyBhIG1hZ2ljICJtYWtlIG1lCitmYXN0ZXIiIHNwZWVkdXAgb3B0aW9uIGNhbGxlZCAiaW5saW5lIi4gV2hpbGUgdGhlIHVzZSBvZiBpbmxpbmVzIGNhbiBiZQorYXBwcm9wcmlhdGUgKGZvciBleGFtcGxlIGFzIGEgbWVhbnMgb2YgcmVwbGFjaW5nIG1hY3Jvcywgc2VlIENoYXB0ZXIgMTEpLCBpdAordmVyeSBvZnRlbiBpcyBub3QuIEFidW5kYW50IHVzZSBvZiB0aGUgaW5saW5lIGtleXdvcmQgbGVhZHMgdG8gYSBtdWNoIGJpZ2dlcgora2VybmVsLCB3aGljaCBpbiB0dXJuIHNsb3dzIHRoZSBzeXN0ZW0gYXMgYSB3aG9sZSBkb3duLCBkdWUgdG8gYSBiaWdnZXIKK2ljYWNoZSBmb290cHJpbnQgZm9yIHRoZSBDUFUgYW5kIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIGxlc3MgbWVtb3J5CithdmFpbGFibGUgZm9yIHRoZSBwYWdlY2FjaGUuIEp1c3QgdGhpbmsgYWJvdXQgaXQ7IGEgcGFnZWNhY2hlIG1pc3MgY2F1c2VzIGEKK2Rpc2sgc2Vlaywgd2hpY2ggZWFzaWx5IHRha2VzIDUgbWlsaXNlY29uZHMuIFRoZXJlIGFyZSBhIExPVCBvZiBjcHUgY3ljbGVzCit0aGF0IGNhbiBnbyBpbnRvIHRoZXNlIDUgbWlsaXNlY29uZHMuCisKK0EgcmVhc29uYWJsZSBydWxlIG9mIHRodW1iIGlzIHRvIG5vdCBwdXQgaW5saW5lIGF0IGZ1bmN0aW9ucyB0aGF0IGhhdmUgbW9yZQordGhhbiAzIGxpbmVzIG9mIGNvZGUgaW4gdGhlbS4gQW4gZXhjZXB0aW9uIHRvIHRoaXMgcnVsZSBhcmUgdGhlIGNhc2VzIHdoZXJlCithIHBhcmFtZXRlciBpcyBrbm93biB0byBiZSBhIGNvbXBpbGV0aW1lIGNvbnN0YW50LCBhbmQgYXMgYSByZXN1bHQgb2YgdGhpcworY29uc3RhbnRuZXNzIHlvdSAqa25vdyogdGhlIGNvbXBpbGVyIHdpbGwgYmUgYWJsZSB0byBvcHRpbWl6ZSBtb3N0IG9mIHlvdXIKK2Z1bmN0aW9uIGF3YXkgYXQgY29tcGlsZSB0aW1lLiBGb3IgYSBnb29kIGV4YW1wbGUgb2YgdGhpcyBsYXRlciBjYXNlLCBzZWUKK3RoZSBrbWFsbG9jKCkgaW5saW5lIGZ1bmN0aW9uLgorCitPZnRlbiBwZW9wbGUgYXJndWUgdGhhdCBhZGRpbmcgaW5saW5lIHRvIGZ1bmN0aW9ucyB0aGF0IGFyZSBzdGF0aWMgYW5kIHVzZWQKK29ubHkgb25jZSBpcyBhbHdheXMgYSB3aW4gc2luY2UgdGhlcmUgaXMgbm8gc3BhY2UgdHJhZGVvZmYuIFdoaWxlIHRoaXMgaXMKK3RlY2huaWNhbGx5IGNvcnJlY3QsIGdjYyBpcyBjYXBhYmxlIG9mIGlubGluaW5nIHRoZXNlIGF1dG9tYXRpY2FsbHkgd2l0aG91dAoraGVscCwgYW5kIHRoZSBtYWludGVuYW5jZSBpc3N1ZSBvZiByZW1vdmluZyB0aGUgaW5saW5lIHdoZW4gYSBzZWNvbmQgdXNlcgorYXBwZWFycyBvdXR3ZWlnaHMgdGhlIHBvdGVudGlhbCB2YWx1ZSBvZiB0aGUgaGludCB0aGF0IHRlbGxzIGdjYyB0byBkbworc29tZXRoaW5nIGl0IHdvdWxkIGhhdmUgZG9uZSBhbnl3YXkuCisKKworCisJCUNoYXB0ZXIgMTU6IFJlZmVyZW5jZXMKIAogVGhlIEMgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UsIFNlY29uZCBFZGl0aW9uCiBieSBCcmlhbiBXLiBLZXJuaWdoYW4gYW5kIERlbm5pcyBNLiBSaXRjaGllLgpAQCAtNDQ0LDEwICs0NzIsMTMgQEAKIFVSTDogaHR0cDovL2NtLmJlbGwtbGFicy5jb20vY20vY3MvdHBvcC8KIAogR05VIG1hbnVhbHMgLSB3aGVyZSBpbiBjb21wbGlhbmNlIHdpdGggSyZSIGFuZCB0aGlzIHRleHQgLSBmb3IgY3BwLCBnY2MsCi1nY2MgaW50ZXJuYWxzIGFuZCBpbmRlbnQsIGFsbCBhdmFpbGFibGUgZnJvbSBodHRwOi8vd3d3LmdudS5vcmcKK2djYyBpbnRlcm5hbHMgYW5kIGluZGVudCwgYWxsIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly93d3cuZ251Lm9yZy9tYW51YWwvCiAKIFdHMTQgaXMgdGhlIGludGVybmF0aW9uYWwgc3RhbmRhcmRpemF0aW9uIHdvcmtpbmcgZ3JvdXAgZm9yIHRoZSBwcm9ncmFtbWluZwotbGFuZ3VhZ2UgQywgVVJMOiBodHRwOi8vc3RkLmRrdXVnLmRrL0pUQzEvU0MyMi9XRzE0LworbGFuZ3VhZ2UgQywgVVJMOiBodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9KVEMxL1NDMjIvV0cxNC8KKworS2VybmVsIENvZGluZ1N0eWxlLCBieSBncmVnQGtyb2FoLmNvbSBhdCBPTFMgMjAwMjoKK2h0dHA6Ly93d3cua3JvYWguY29tL2xpbnV4L3RhbGtzL29sc18yMDAyX2tlcm5lbF9jb2RpbmdzdHlsZV90YWxrL2h0bWwvCiAKIC0tCi1MYXN0IHVwZGF0ZWQgb24gMTYgRmVicnVhcnkgMjAwNCBieSBhIGNvbW11bml0eSBlZmZvcnQgb24gTEtNTC4KK0xhc3QgdXBkYXRlZCBvbiAzMCBEZWNlbWJlciAyMDA1IGJ5IGEgY29tbXVuaXR5IGVmZm9ydCBvbiBMS01MLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rLy5naXRpZ25vcmUgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTAyYzAyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rLy5naXRpZ25vcmUKQEAgLTAsMCArMSw2IEBACisqLnhtbAorKi5wcworKi5wZGYKKyouaHRtbAorKi45Lmd6CisqLjkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWFwaS50bXBsCmluZGV4IDc2NzQzM2IuLjhjOWM2NzAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1hcGkudG1wbApAQCAtNTQsNiArNTQsMTEgQEAKICFFa2VybmVsL3NjaGVkLmMKICFFa2VybmVsL3RpbWVyLmMKICAgICAgPC9zZWN0MT4KKyAgICAgPHNlY3QxPjx0aXRsZT5IaWdoLXJlc29sdXRpb24gdGltZXJzPC90aXRsZT4KKyFJaW5jbHVkZS9saW51eC9rdGltZS5oCishSWluY2x1ZGUvbGludXgvaHJ0aW1lci5oCishRWtlcm5lbC9ocnRpbWVyLmMKKyAgICAgPC9zZWN0MT4KICAgICAgPHNlY3QxPjx0aXRsZT5JbnRlcm5hbCBGdW5jdGlvbnM8L3RpdGxlPgogIUlrZXJuZWwvZXhpdC5jCiAhSWtlcm5lbC9zaWduYWwuYwpAQCAtMzY5LDYgKzM3NCw3IEBACiBYIUVkcml2ZXJzL2FjcGkvYnVzLmMKIC0tPgogIUVkcml2ZXJzL2FjcGkvc2Nhbi5jCishSWRyaXZlcnMvYWNwaS9zY2FuLmMKIDwhLS0gTm8gY29ycmVjdCBzdHJ1Y3R1cmVkIGNvbW1lbnRzCiBYIUVkcml2ZXJzL2FjcGkvcGNpX2JpbmQuYwogLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWxvY2tpbmcudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtbG9ja2luZy50bXBsCmluZGV4IDkwZGMyZGUuLjE1OGZmZTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtbG9ja2luZy50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtbG9ja2luZy50bXBsCkBAIC0yMjIsNyArMjIyLDcgQEAKICAgIDx0aXRsZT5Ud28gTWFpbiBUeXBlcyBvZiBLZXJuZWwgTG9ja3M6IFNwaW5sb2NrcyBhbmQgU2VtYXBob3JlczwvdGl0bGU+CiAKICAgIDxwYXJhPgotICAgICBUaGVyZSBhcmUgdHdvIG1haW4gdHlwZXMgb2Yga2VybmVsIGxvY2tzLiAgVGhlIGZ1bmRhbWVudGFsIHR5cGUKKyAgICAgVGhlcmUgYXJlIHRocmVlIG1haW4gdHlwZXMgb2Yga2VybmVsIGxvY2tzLiAgVGhlIGZ1bmRhbWVudGFsIHR5cGUKICAgICAgaXMgdGhlIHNwaW5sb2NrIAogICAgICAoPGZpbGVuYW1lIGNsYXNzPSJoZWFkZXJmaWxlIj5pbmNsdWRlL2FzbS9zcGlubG9jay5oPC9maWxlbmFtZT4pLAogICAgICB3aGljaCBpcyBhIHZlcnkgc2ltcGxlIHNpbmdsZS1ob2xkZXIgbG9jazogaWYgeW91IGNhbid0IGdldCB0aGUgCkBAIC0yMzAsMTYgKzIzMCwyMiBAQAogICAgICB2ZXJ5IHNtYWxsIGFuZCBmYXN0LCBhbmQgY2FuIGJlIHVzZWQgYW55d2hlcmUuCiAgICA8L3BhcmE+CiAgICA8cGFyYT4KLSAgICAgVGhlIHNlY29uZCB0eXBlIGlzIGEgc2VtYXBob3JlCisgICAgIFRoZSBzZWNvbmQgdHlwZSBpcyBhIG11dGV4CisgICAgICg8ZmlsZW5hbWUgY2xhc3M9ImhlYWRlcmZpbGUiPmluY2x1ZGUvbGludXgvbXV0ZXguaDwvZmlsZW5hbWU+KTogaXQKKyAgICAgaXMgbGlrZSBhIHNwaW5sb2NrLCBidXQgeW91IG1heSBibG9jayBob2xkaW5nIGEgbXV0ZXguCisgICAgIElmIHlvdSBjYW4ndCBsb2NrIGEgbXV0ZXgsIHlvdXIgdGFzayB3aWxsIHN1c3BlbmQgaXRzZWxmLCBhbmQgYmUgd29rZW4KKyAgICAgdXAgd2hlbiB0aGUgbXV0ZXggaXMgcmVsZWFzZWQuICBUaGlzIG1lYW5zIHRoZSBDUFUgY2FuIGRvIHNvbWV0aGluZworICAgICBlbHNlIHdoaWxlIHlvdSBhcmUgd2FpdGluZy4gIFRoZXJlIGFyZSBtYW55IGNhc2VzIHdoZW4geW91IHNpbXBseQorICAgICBjYW4ndCBzbGVlcCAoc2VlIDx4cmVmIGxpbmtlbmQ9InNsZWVwaW5nLXRoaW5ncyIvPiksIGFuZCBzbyBoYXZlIHRvCisgICAgIHVzZSBhIHNwaW5sb2NrIGluc3RlYWQuCisgICA8L3BhcmE+CisgICA8cGFyYT4KKyAgICAgVGhlIHRoaXJkIHR5cGUgaXMgYSBzZW1hcGhvcmUKICAgICAgKDxmaWxlbmFtZSBjbGFzcz0iaGVhZGVyZmlsZSI+aW5jbHVkZS9hc20vc2VtYXBob3JlLmg8L2ZpbGVuYW1lPik6IGl0CiAgICAgIGNhbiBoYXZlIG1vcmUgdGhhbiBvbmUgaG9sZGVyIGF0IGFueSB0aW1lICh0aGUgbnVtYmVyIGRlY2lkZWQgYXQKICAgICAgaW5pdGlhbGl6YXRpb24gdGltZSksIGFsdGhvdWdoIGl0IGlzIG1vc3QgY29tbW9ubHkgdXNlZCBhcyBhCi0gICAgIHNpbmdsZS1ob2xkZXIgbG9jayAoYSBtdXRleCkuICBJZiB5b3UgY2FuJ3QgZ2V0IGEgc2VtYXBob3JlLAotICAgICB5b3VyIHRhc2sgd2lsbCBwdXQgaXRzZWxmIG9uIHRoZSBxdWV1ZSwgYW5kIGJlIHdva2VuIHVwIHdoZW4gdGhlCi0gICAgIHNlbWFwaG9yZSBpcyByZWxlYXNlZC4gIFRoaXMgbWVhbnMgdGhlIENQVSB3aWxsIGRvIHNvbWV0aGluZwotICAgICBlbHNlIHdoaWxlIHlvdSBhcmUgd2FpdGluZywgYnV0IHRoZXJlIGFyZSBtYW55IGNhc2VzIHdoZW4geW91Ci0gICAgIHNpbXBseSBjYW4ndCBzbGVlcCAoc2VlIDx4cmVmIGxpbmtlbmQ9InNsZWVwaW5nLXRoaW5ncyIvPiksIGFuZCBzbwotICAgICBoYXZlIHRvIHVzZSBhIHNwaW5sb2NrIGluc3RlYWQuCisgICAgIHNpbmdsZS1ob2xkZXIgbG9jayAoYSBtdXRleCkuICBJZiB5b3UgY2FuJ3QgZ2V0IGEgc2VtYXBob3JlLCB5b3VyCisgICAgIHRhc2sgd2lsbCBiZSBzdXNwZW5kZWQgYW5kIGxhdGVyIG9uIHdva2VuIHVwIC0ganVzdCBsaWtlIGZvciBtdXRleGVzLgogICAgPC9wYXJhPgogICAgPHBhcmE+CiAgICAgIE5laXRoZXIgdHlwZSBvZiBsb2NrIGlzIHJlY3Vyc2l2ZTogc2VlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdmlkZW9ib29rLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdmlkZW9ib29rLnRtcGwKaW5kZXggM2VjNmM4Ny4uZmRmZjk4NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3ZpZGVvYm9vay50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay92aWRlb2Jvb2sudG1wbApAQCAtMjI5LDcgKzIyOSw3IEBACiAKIHN0YXRpYyBpbnQgdXNlcnMgPSAwOwogCi1zdGF0aWMgaW50IHJhZGlvX29wZW4oc3R1Y3QgdmlkZW9fZGV2aWNlICpkZXYsIGludCBmbGFncykKK3N0YXRpYyBpbnQgcmFkaW9fb3BlbihzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYsIGludCBmbGFncykKIHsKICAgICAgICAgaWYodXNlcnMpCiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKQEAgLTk0OSw3ICs5NDksNyBAQAogCiBzdGF0aWMgaW50IHVzZXJzID0gMDsKIAotc3RhdGljIGludCBjYW1lcmFfb3BlbihzdHVjdCB2aWRlb19kZXZpY2UgKmRldiwgaW50IGZsYWdzKQorc3RhdGljIGludCBjYW1lcmFfb3BlbihzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYsIGludCBmbGFncykKIHsKICAgICAgICAgaWYodXNlcnMpCiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUkNVL3JjdXJlZi50eHQgYi9Eb2N1bWVudGF0aW9uL1JDVS9yY3VyZWYudHh0CmluZGV4IGEyM2ZlZTYuLjNmNjBkYjQxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1JDVS9yY3VyZWYudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL3JjdXJlZi50eHQKQEAgLTEsNzQgKzEsNjcgQEAKLVJlZmNvdW50ZXIgZnJhbWV3b3JrIGZvciBlbGVtZW50cyBvZiBsaXN0cy9hcnJheXMgcHJvdGVjdGVkIGJ5Ci1SQ1UuCitSZWZjb3VudGVyIGRlc2lnbiBmb3IgZWxlbWVudHMgb2YgbGlzdHMvYXJyYXlzIHByb3RlY3RlZCBieSBSQ1UuCiAKIFJlZmNvdW50aW5nIG9uIGVsZW1lbnRzIG9mICBsaXN0cyB3aGljaCBhcmUgcHJvdGVjdGVkIGJ5IHRyYWRpdGlvbmFsCiByZWFkZXIvd3JpdGVyIHNwaW5sb2NrcyBvciBzZW1hcGhvcmVzIGFyZSBzdHJhaWdodCBmb3J3YXJkIGFzIGluOgogCi0xLgkJCQkJMi4KLWFkZCgpCQkJCQlzZWFyY2hfYW5kX3JlZmVyZW5jZSgpCi17CQkJCQl7Ci0JYWxsb2Nfb2JqZWN0CQkJCXJlYWRfbG9jaygmbGlzdF9sb2NrKTsKLQkuLi4JCQkJCXNlYXJjaF9mb3JfZWxlbWVudAotCWF0b21pY19zZXQoJmVsLT5yYywgMSk7CQkJYXRvbWljX2luYygmZWwtPnJjKTsKLQl3cml0ZV9sb2NrKCZsaXN0X2xvY2spOwkJCS4uLgotCWFkZF9lbGVtZW50CQkJCXJlYWRfdW5sb2NrKCZsaXN0X2xvY2spOwotCS4uLgkJCQkJLi4uCi0Jd3JpdGVfdW5sb2NrKCZsaXN0X2xvY2spOwl9CisxLgkJCQkyLgorYWRkKCkJCQkJc2VhcmNoX2FuZF9yZWZlcmVuY2UoKQorewkJCQl7CisgICAgYWxsb2Nfb2JqZWN0CQkgICAgcmVhZF9sb2NrKCZsaXN0X2xvY2spOworICAgIC4uLgkJCQkgICAgc2VhcmNoX2Zvcl9lbGVtZW50CisgICAgYXRvbWljX3NldCgmZWwtPnJjLCAxKTsJICAgIGF0b21pY19pbmMoJmVsLT5yYyk7CisgICAgd3JpdGVfbG9jaygmbGlzdF9sb2NrKTsJICAgICAuLi4KKyAgICBhZGRfZWxlbWVudAkJCSAgICByZWFkX3VubG9jaygmbGlzdF9sb2NrKTsKKyAgICAuLi4JCQkJICAgIC4uLgorICAgIHdyaXRlX3VubG9jaygmbGlzdF9sb2NrKTsJfQogfQogCiAzLgkJCQkJNC4KIHJlbGVhc2VfcmVmZXJlbmNlZCgpCQkJZGVsZXRlKCkKIHsJCQkJCXsKLQkuLi4JCQkJd3JpdGVfbG9jaygmbGlzdF9sb2NrKTsKLQlhdG9taWNfZGVjKCZlbC0+cmMsIHJlbGZ1bmMpCS4uLgotCS4uLgkJCQlkZWxldGVfZWxlbWVudAotfQkJCQkJd3JpdGVfdW5sb2NrKCZsaXN0X2xvY2spOwotIAkJCQkJLi4uCi0JCQkJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZlbC0+cmMpKQotCQkJCQkJa2ZyZWUoZWwpOwotCQkJCQkuLi4KKyAgICAuLi4JCQkJCSAgICB3cml0ZV9sb2NrKCZsaXN0X2xvY2spOworICAgIGF0b21pY19kZWMoJmVsLT5yYywgcmVsZnVuYykJICAgIC4uLgorICAgIC4uLgkJCQkJICAgIGRlbGV0ZV9lbGVtZW50Cit9CQkJCQkgICAgd3JpdGVfdW5sb2NrKCZsaXN0X2xvY2spOworIAkJCQkJICAgIC4uLgorCQkJCQkgICAgaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmVsLT5yYykpCisJCQkJCSAgICAgICAga2ZyZWUoZWwpOworCQkJCQkgICAgLi4uCiAJCQkJCX0KIAogSWYgdGhpcyBsaXN0L2FycmF5IGlzIG1hZGUgbG9jayBmcmVlIHVzaW5nIHJjdSBhcyBpbiBjaGFuZ2luZyB0aGUKIHdyaXRlX2xvY2sgaW4gYWRkKCkgYW5kIGRlbGV0ZSgpIHRvIHNwaW5fbG9jayBhbmQgY2hhbmdpbmcgcmVhZF9sb2NrCi1pbiBzZWFyY2hfYW5kX3JlZmVyZW5jZSB0byByY3VfcmVhZF9sb2NrKCksIHRoZSByY3VyZWZfZ2V0IGluCitpbiBzZWFyY2hfYW5kX3JlZmVyZW5jZSB0byByY3VfcmVhZF9sb2NrKCksIHRoZSBhdG9taWNfZ2V0IGluCiBzZWFyY2hfYW5kX3JlZmVyZW5jZSBjb3VsZCBwb3RlbnRpYWxseSBob2xkIHJlZmVyZW5jZSB0byBhbiBlbGVtZW50IHdoaWNoCi1oYXMgYWxyZWFkeSBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgbGlzdC9hcnJheS4gIHJjdXJlZl9sZl9nZXRfcmN1IHRha2VzCitoYXMgYWxyZWFkeSBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgbGlzdC9hcnJheS4gIGF0b21pY19pbmNfbm90X3plcm8gdGFrZXMKIGNhcmUgb2YgdGhpcyBzY2VuYXJpby4gc2VhcmNoX2FuZF9yZWZlcmVuY2Ugc2hvdWxkIGxvb2sgYXM7CiAKIDEuCQkJCQkyLgogYWRkKCkJCQkJCXNlYXJjaF9hbmRfcmVmZXJlbmNlKCkKIHsJCQkJCXsKLSAJYWxsb2Nfb2JqZWN0CQkJCXJjdV9yZWFkX2xvY2soKTsKLQkuLi4JCQkJCXNlYXJjaF9mb3JfZWxlbWVudAotCWF0b21pY19zZXQoJmVsLT5yYywgMSk7CQkJaWYgKHJjdXJlZl9pbmNfbGYoJmVsLT5yYykpIHsKLQl3cml0ZV9sb2NrKCZsaXN0X2xvY2spOwkJCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJCQkJCQlyZXR1cm4gRkFJTDsKLQlhZGRfZWxlbWVudAkJCQl9Ci0JLi4uCQkJCQkuLi4KLQl3cml0ZV91bmxvY2soJmxpc3RfbG9jayk7CQlyY3VfcmVhZF91bmxvY2soKTsKKyAgICBhbGxvY19vYmplY3QJCQkgICAgcmN1X3JlYWRfbG9jaygpOworICAgIC4uLgkJCQkJICAgIHNlYXJjaF9mb3JfZWxlbWVudAorICAgIGF0b21pY19zZXQoJmVsLT5yYywgMSk7CQkgICAgaWYgKGF0b21pY19pbmNfbm90X3plcm8oJmVsLT5yYykpIHsKKyAgICB3cml0ZV9sb2NrKCZsaXN0X2xvY2spOwkJICAgICAgICByY3VfcmVhZF91bmxvY2soKTsKKwkJCQkJICAgICAgICByZXR1cm4gRkFJTDsKKyAgICBhZGRfZWxlbWVudAkJCQkgICAgfQorICAgIC4uLgkJCQkJICAgIC4uLgorICAgIHdyaXRlX3VubG9jaygmbGlzdF9sb2NrKTsJCSAgICByY3VfcmVhZF91bmxvY2soKTsKIH0JCQkJCX0KIDMuCQkJCQk0LgogcmVsZWFzZV9yZWZlcmVuY2VkKCkJCQlkZWxldGUoKQogewkJCQkJewotCS4uLgkJCQl3cml0ZV9sb2NrKCZsaXN0X2xvY2spOwotCXJjdXJlZl9kZWMoJmVsLT5yYywgcmVsZnVuYykJLi4uCi0JLi4uCQkJCWRlbGV0ZV9lbGVtZW50Ci19CQkJCQl3cml0ZV91bmxvY2soJmxpc3RfbG9jayk7Ci0gCQkJCQkuLi4KLQkJCQkJaWYgKHJjdXJlZl9kZWNfYW5kX3Rlc3QoJmVsLT5yYykpCi0JCQkJCQljYWxsX3JjdSgmZWwtPmhlYWQsIGVsX2ZyZWUpOwotCQkJCQkuLi4KKyAgICAuLi4JCQkJCSAgICB3cml0ZV9sb2NrKCZsaXN0X2xvY2spOworICAgIGF0b21pY19kZWMoJmVsLT5yYywgcmVsZnVuYykJICAgIC4uLgorICAgIC4uLgkJCQkJICAgIGRlbGV0ZV9lbGVtZW50Cit9CQkJCQkgICAgd3JpdGVfdW5sb2NrKCZsaXN0X2xvY2spOworIAkJCQkJICAgIC4uLgorCQkJCQkgICAgaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmVsLT5yYykpCisJCQkJCSAgICAgICAgY2FsbF9yY3UoJmVsLT5oZWFkLCBlbF9mcmVlKTsKKwkJCQkJICAgIC4uLgogCQkJCQl9CiAKIFNvbWV0aW1lcywgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IG5lZWQgdG8gYmUgb2J0YWluZWQgaW4gdGhlCi11cGRhdGUgKHdyaXRlKSBzdHJlYW0uICBJbiBzdWNoIGNhc2VzLCByY3VyZWZfaW5jX2xmIG1pZ2h0IGJlIGFuIG92ZXJraWxsCi1zaW5jZSB0aGUgc3BpbmxvY2sgc2VyaWFsaXNpbmcgbGlzdCB1cGRhdGVzIGFyZSBoZWxkLiByY3VyZWZfaW5jCit1cGRhdGUgKHdyaXRlKSBzdHJlYW0uICBJbiBzdWNoIGNhc2VzLCBhdG9taWNfaW5jX25vdF96ZXJvIG1pZ2h0IGJlIGFuCitvdmVya2lsbCBzaW5jZSB0aGUgc3BpbmxvY2sgc2VyaWFsaXNpbmcgbGlzdCB1cGRhdGVzIGFyZSBoZWxkLiBhdG9taWNfaW5jCiBpcyB0byBiZSB1c2VkIGluIHN1Y2ggY2FzZXMuCi1Gb3IgYXJjaGVzIHdoaWNoIGRvIG5vdCBoYXZlIGNtcHhjaGcgcmN1cmVmX2luY19sZgotYXBpIHVzZXMgYSBoYXNoZWQgc3BpbmxvY2sgaW1wbGVtZW50YXRpb24gYW5kIHRoZSBzYW1lIGhhc2hlZCBzcGlubG9jawotaXMgYWNxdWlyZWQgaW4gYWxsIHJjdXJlZl94eHggcHJpbWl0aXZlcyB0byBwcmVzZXJ2ZSBhdG9taWNpdHkuCi1Ob3RlOiBVc2UgcmN1cmVmX2luYyBhcGkgb25seSBpZiB5b3UgbmVlZCB0byB1c2UgcmN1cmVmX2luY19sZiBvbiB0aGUKLXJlZmNvdW50ZXIgYXRsZWFzdCBhdCBvbmUgcGxhY2UuICBNaXhpbmcgcmN1cmVmX2luYyBhbmQgYXRvbWljX3h4eCBhcGkKLW1pZ2h0IGxlYWQgdG8gcmFjZXMuIHJjdXJlZl9pbmNfbGYoKSBtdXN0IGJlIHVzZWQgaW4gbG9ja2ZyZWUKLVJDVSBjcml0aWNhbCBzZWN0aW9ucyBvbmx5LgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdEcml2ZXJzIGIvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nRHJpdmVycwppbmRleCBjM2NjYTkyLi42YmQzMGZkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdEcml2ZXJzCisrKyBiL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnMKQEAgLTI3LDE4ICsyNywxNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIExpbnV4IDIuMDoKLQlObyBuZXcgZHJpdmVycyBhcmUgYWNjZXB0ZWQgZm9yIHRoaXMga2VybmVsIHRyZWUKKwlObyBuZXcgZHJpdmVycyBhcmUgYWNjZXB0ZWQgZm9yIHRoaXMga2VybmVsIHRyZWUuCiAKIExpbnV4IDIuMjoKKwlObyBuZXcgZHJpdmVycyBhcmUgYWNjZXB0ZWQgZm9yIHRoaXMga2VybmVsIHRyZWUuCisKK0xpbnV4IDIuNDoKIAlJZiB0aGUgY29kZSBhcmVhIGhhcyBhIGdlbmVyYWwgbWFpbnRhaW5lciB0aGVuIHBsZWFzZSBzdWJtaXQgaXQgdG8KIAl0aGUgbWFpbnRhaW5lciBsaXN0ZWQgaW4gTUFJTlRBSU5FUlMgaW4gdGhlIGtlcm5lbCBmaWxlLiBJZiB0aGUKIAltYWludGFpbmVyIGRvZXMgbm90IHJlc3BvbmQgb3IgeW91IGNhbm5vdCBmaW5kIHRoZSBhcHByb3ByaWF0ZQotCW1haW50YWluZXIgdGhlbiBwbGVhc2UgY29udGFjdCB0aGUgMi4yIGtlcm5lbCBtYWludGFpbmVyOgotCU1hcmMtQ2hyaXN0aWFuIFBldGVyc2VuIDxtLmMucEB3b2xrLXByb2plY3QuZGU+LgotCi1MaW51eCAyLjQ6Ci0JVGhlIHNhbWUgcnVsZXMgYXBwbHkgYXMgMi4yLiBUaGUgZmluYWwgY29udGFjdCBwb2ludCBmb3IgTGludXggMi40Ci0Jc3VibWlzc2lvbnMgaXMgTWFyY2VsbyBUb3NhdHRpIDxtYXJjZWxvLnRvc2F0dGlAY3ljbGFkZXMuY29tPi4KKwltYWludGFpbmVyIHRoZW4gcGxlYXNlIGNvbnRhY3QgTWFyY2VsbyBUb3NhdHRpCisJPG1hcmNlbG8udG9zYXR0aUBjeWNsYWRlcy5jb20+LgogCiBMaW51eCAyLjY6CiAJVGhlIHNhbWUgcnVsZXMgYXBwbHkgYXMgMi40IGV4Y2VwdCB0aGF0IHlvdSBzaG91bGQgZm9sbG93IGxpbnV4LWtlcm5lbApAQCAtNTMsNiArNTIsNyBAQAogCQlvZiBleGNsdXNpdmUgR1BMIGxpY2Vuc2luZywgYW5kIGlmIHlvdSB3aXNoIHRoZSBkcml2ZXIKIAkJdG8gYmUgdXNlZnVsIHRvIG90aGVyIGNvbW11bml0aWVzIHN1Y2ggYXMgQlNEIHlvdSBtYXkgd2VsbAogCQl3aXNoIHRvIHJlbGVhc2UgdW5kZXIgbXVsdGlwbGUgbGljZW5zZXMuCisJCVNlZSBhY2NlcHRlZCBsaWNlbnNlcyBhdCBpbmNsdWRlL2xpbnV4L21vZHVsZS5oCiAKIENvcHlyaWdodDoJVGhlIGNvcHlyaWdodCBvd25lciBtdXN0IGFncmVlIHRvIHVzZSBvZiBHUEwuCiAJCUl0J3MgYmVzdCBpZiB0aGUgc3VibWl0dGVyIGFuZCBjb3B5cmlnaHQgb3duZXIKQEAgLTE0Myw1ICsxNDMsMTMgQEAKIAlodHRwOi8va2VybmVsbmV3Ymllcy5vcmcvCiAKIExpbnV4IFVTQiBwcm9qZWN0OgotCWh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGludXgtdXNiLworCWh0dHA6Ly93d3cubGludXgtdXNiLm9yZy8KIAorSG93IHRvIE5PVCB3cml0ZSBrZXJuZWwgZHJpdmVyIGJ5IGFyamFudkByZWRoYXQuY29tCisJaHR0cDovL3Blb3BsZS5yZWRoYXQuY29tL2FyamFudi9vbHNwYXBlci5wZGYKKworS2VybmVsIEphbml0b3I6CisJaHR0cDovL2phbml0b3Iua2VybmVsbmV3Ymllcy5vcmcvCisKKy0tCitMYXN0IHVwZGF0ZWQgb24gMTcgTm92IDIwMDUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzIGIvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcwppbmRleCAxZDQ3ZTZjLi5jMmM4NWJjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzCisrKyBiL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMKQEAgLTc4LDcgKzc4LDkgQEAKIGh0dHA6Ly93d3cueGVub3RpbWUubmV0L2xpbnV4L3NjcmlwdHMvcGF0Y2hpbmctc2NyaXB0cy0wMDIudGFyLmd6CiAKIEFuZHJldyBNb3J0b24ncyBwYXRjaCBzY3JpcHRzOgotaHR0cDovL3d3dy56aXAuY29tLmF1L35ha3BtL2xpbnV4L3BhdGNoZXMvcGF0Y2gtc2NyaXB0cy0wLjIwCitodHRwOi8vd3d3LnppcC5jb20uYXUvfmFrcG0vbGludXgvcGF0Y2hlcy8KK0luc3RlYWQgb2YgdGhlc2Ugc2NyaXB0cywgcXVpbHQgaXMgdGhlIHJlY29tbWVuZGVkIHBhdGNoIG1hbmFnZW1lbnQKK3Rvb2wgKHNlZSBhYm92ZSkuCiAKIAogCkBAIC05Nyw3ICs5OSw3IEBACiAKIDMpIFNlcGFyYXRlIHlvdXIgY2hhbmdlcy4KIAotU2VwYXJhdGUgZWFjaCBsb2dpY2FsIGNoYW5nZSBpbnRvIGl0cyBvd24gcGF0Y2guCitTZXBhcmF0ZSBfbG9naWNhbCBjaGFuZ2VzXyBpbnRvIGEgc2luZ2xlIHBhdGNoIGZpbGUuCiAKIEZvciBleGFtcGxlLCBpZiB5b3VyIGNoYW5nZXMgaW5jbHVkZSBib3RoIGJ1ZyBmaXhlcyBhbmQgcGVyZm9ybWFuY2UKIGVuaGFuY2VtZW50cyBmb3IgYSBzaW5nbGUgZHJpdmVyLCBzZXBhcmF0ZSB0aG9zZSBjaGFuZ2VzIGludG8gdHdvCkBAIC0xMTIsNiArMTE0LDEwIEBACiBjb21wbGV0ZSwgdGhhdCBpcyBPSy4gIFNpbXBseSBub3RlICJ0aGlzIHBhdGNoIGRlcGVuZHMgb24gcGF0Y2ggWCIKIGluIHlvdXIgcGF0Y2ggZGVzY3JpcHRpb24uCiAKK0lmIHlvdSBjYW5ub3QgY29uZGVuc2UgeW91ciBwYXRjaCBzZXQgaW50byBhIHNtYWxsZXIgc2V0IG9mIHBhdGNoZXMsCit0aGVuIG9ubHkgcG9zdCBzYXkgMTUgb3Igc28gYXQgYSB0aW1lIGFuZCB3YWl0IGZvciByZXZpZXcgYW5kIGludGVncmF0aW9uLgorCisKIAogNCkgU2VsZWN0IGUtbWFpbCBkZXN0aW5hdGlvbi4KIApAQCAtMTI0LDYgKzEzMCwxMCBAQAogbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZy4gIE1vc3Qga2VybmVsIGRldmVsb3BlcnMgbW9uaXRvciB0aGlzCiBlLW1haWwgbGlzdCwgYW5kIGNhbiBjb21tZW50IG9uIHlvdXIgY2hhbmdlcy4KIAorCitEbyBub3Qgc2VuZCBtb3JlIHRoYW4gMTUgcGF0Y2hlcyBhdCBvbmNlIHRvIHRoZSB2Z2VyIG1haWxpbmcgbGlzdHMhISEKKworCiBMaW51cyBUb3J2YWxkcyBpcyB0aGUgZmluYWwgYXJiaXRlciBvZiBhbGwgY2hhbmdlcyBhY2NlcHRlZCBpbnRvIHRoZQogTGludXgga2VybmVsLiAgSGlzIGUtbWFpbCBhZGRyZXNzIGlzIDx0b3J2YWxkc0Bvc2RsLm9yZz4uICBIZSBnZXRzCiBhIGxvdCBvZiBlLW1haWwsIHNvIHR5cGljYWxseSB5b3Ugc2hvdWxkIGRvIHlvdXIgYmVzdCB0byAtYXZvaWQtIHNlbmRpbmcKQEAgLTE0OSw2ICsxNTksOSBAQAogTUFJTlRBSU5FUlMgZmlsZSBmb3IgYSBtYWlsaW5nIGxpc3QgdGhhdCByZWxhdGVzIHNwZWNpZmljYWxseSB0bwogeW91ciBjaGFuZ2UuCiAKK01ham9yZG9tbyBsaXN0cyBvZiBWR0VSLktFUk5FTC5PUkcgYXQ6CisJPGh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvdmdlci1saXN0cy5odG1sPgorCiBJZiBjaGFuZ2VzIGFmZmVjdCB1c2VybGFuZC1rZXJuZWwgaW50ZXJmYWNlcywgcGxlYXNlIHNlbmQKIHRoZSBNQU4tUEFHRVMgbWFpbnRhaW5lciAoYXMgbGlzdGVkIGluIHRoZSBNQUlOVEFJTkVSUyBmaWxlKQogYSBtYW4tcGFnZXMgcGF0Y2gsIG9yIGF0IGxlYXN0IGEgbm90aWZpY2F0aW9uIG9mIHRoZSBjaGFuZ2UsCkBAIC0zNzMsMjcgKzM4NiwxNCBAQAogYW5kIGRlbGV0ZWQgbGluZXMgcGVyIGZpbGUuICBBIGRpZmZzdGF0IGlzIGVzcGVjaWFsbHkgdXNlZnVsIG9uIGJpZ2dlcgogcGF0Y2hlcy4gIE90aGVyIGNvbW1lbnRzIHJlbGV2YW50IG9ubHkgdG8gdGhlIG1vbWVudCBvciB0aGUgbWFpbnRhaW5lciwKIG5vdCBzdWl0YWJsZSBmb3IgdGhlIHBlcm1hbmVudCBjaGFuZ2Vsb2csIHNob3VsZCBhbHNvIGdvIGhlcmUuCitVc2UgZGlmZnN0YXQgb3B0aW9ucyAiLXAgMSAtdyA3MCIgc28gdGhhdCBmaWxlbmFtZXMgYXJlIGxpc3RlZCBmcm9tIHRoZQordG9wIG9mIHRoZSBrZXJuZWwgc291cmNlIHRyZWUgYW5kIGRvbid0IHVzZSB0b28gbXVjaCBob3Jpem9udGFsIHNwYWNlCisoZWFzaWx5IGZpdCBpbiA4MCBjb2x1bW5zLCBtYXliZSB3aXRoIHNvbWUgaW5kZW50YXRpb24pLgogCiBTZWUgbW9yZSBkZXRhaWxzIG9uIHRoZSBwcm9wZXIgcGF0Y2ggZm9ybWF0IGluIHRoZSBmb2xsb3dpbmcKIHJlZmVyZW5jZXMuCiAKIAotMTMpIE1vcmUgcmVmZXJlbmNlcyBmb3Igc3VibWl0dGluZyBwYXRjaGVzCi0KLUFuZHJldyBNb3J0b24sICJUaGUgcGVyZmVjdCBwYXRjaCIgKHRwcCkuCi0gIDxodHRwOi8vd3d3LnppcC5jb20uYXUvfmFrcG0vbGludXgvcGF0Y2hlcy9zdHVmZi90cHAudHh0PgotCi1KZWZmIEdhcnppaywgIkxpbnV4IGtlcm5lbCBwYXRjaCBzdWJtaXNzaW9uIGZvcm1hdC4iCi0gIDxodHRwOi8vbGludXgueXl6LnVzL3BhdGNoLWZvcm1hdC5odG1sPgotCi1HcmVnIEtILCAiSG93IHRvIHBpc3Mgb2ZmIGEga2VybmVsIHN1YnN5c3RlbSBtYWludGFpbmVyIgotICA8aHR0cDovL3d3dy5rcm9haC5jb20vbG9nLzIwMDUvMDMvMzEvPgotCi1LZXJuZWwgRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQotICA8aHR0cDovL3Nvc2RnLm9yZy9+Y295d29sZi9seHIvc291cmNlL0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGU+Ci0KLUxpbnVzIFRvcnZhbGQncyBtYWlsIG9uIHRoZSBjYW5vbmljYWwgcGF0Y2ggZm9ybWF0OgotICA8aHR0cDovL2xrbWwub3JnL2xrbWwvMjAwNS80LzcvMTgzPgogCiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00NjYsMyArNDY2LDMxIEBACiBEb24ndCB0cnkgdG8gYW50aWNpcGF0ZSBuZWJ1bG91cyBmdXR1cmUgY2FzZXMgd2hpY2ggbWF5IG9yIG1heSBub3QKIGJlIHVzZWZ1bDogICJNYWtlIGl0IGFzIHNpbXBsZSBhcyB5b3UgY2FuLCBhbmQgbm8gc2ltcGxlci4iCiAKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTRUNUSU9OIDMgLSBSRUZFUkVOQ0VTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FuZHJldyBNb3J0b24sICJUaGUgcGVyZmVjdCBwYXRjaCIgKHRwcCkuCisgIDxodHRwOi8vd3d3LnppcC5jb20uYXUvfmFrcG0vbGludXgvcGF0Y2hlcy9zdHVmZi90cHAudHh0PgorCitKZWZmIEdhcnppaywgIkxpbnV4IGtlcm5lbCBwYXRjaCBzdWJtaXNzaW9uIGZvcm1hdC4iCisgIDxodHRwOi8vbGludXgueXl6LnVzL3BhdGNoLWZvcm1hdC5odG1sPgorCitHcmVnIEtyb2FoLUhhcnRtYW4gIkhvdyB0byBwaXNzIG9mZiBhIGtlcm5lbCBzdWJzeXN0ZW0gbWFpbnRhaW5lciIuCisgIDxodHRwOi8vd3d3Lmtyb2FoLmNvbS9sb2cvMjAwNS8wMy8zMS8+CisgIDxodHRwOi8vd3d3Lmtyb2FoLmNvbS9sb2cvMjAwNS8wNy8wOC8+CisgIDxodHRwOi8vd3d3Lmtyb2FoLmNvbS9sb2cvMjAwNS8xMC8xOS8+CisgIDxodHRwOi8vd3d3Lmtyb2FoLmNvbS9sb2cvMjAwNi8wMS8xMS8+CisKK05PISEhISBObyBtb3JlIGh1Z2UgcGF0Y2ggYm9tYnMgdG8gbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZyBwZW9wbGUhLgorICA8aHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1saW51eC1rZXJuZWwmbT0xMTIxMTI3NDk5MTI5NDQmdz0yPgorCitLZXJuZWwgRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQorICA8aHR0cDovL3Nvc2RnLm9yZy9+Y295d29sZi9seHIvc291cmNlL0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGU+CisKK0xpbnVzIFRvcnZhbGQncyBtYWlsIG9uIHRoZSBjYW5vbmljYWwgcGF0Y2ggZm9ybWF0OgorICA8aHR0cDovL2xrbWwub3JnL2xrbWwvMjAwNS80LzcvMTgzPgorLS0KK0xhc3QgdXBkYXRlZCBvbiAxNyBOb3YgMjAwNS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYXBwbHlpbmctcGF0Y2hlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2FwcGx5aW5nLXBhdGNoZXMudHh0CmluZGV4IDY4MWU0MjYuLmEwODNiYTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYXBwbHlpbmctcGF0Y2hlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9hcHBseWluZy1wYXRjaGVzLnR4dApAQCAtMiw4ICsyLDggQEAKIAlBcHBseWluZyBQYXRjaGVzIFRvIFRoZSBMaW51eCBLZXJuZWwKIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotCShXcml0dGVuIGJ5IEplc3BlciBKdWhsLCBBdWd1c3QgMjAwNSkKLQorCU9yaWdpbmFsIGJ5OiBKZXNwZXIgSnVobCwgQXVndXN0IDIwMDUKKwlMYXN0IHVwZGF0ZTogMjAwNi0wMS0wNQogCiAKIEEgZnJlcXVlbnRseSBhc2tlZCBxdWVzdGlvbiBvbiB0aGUgTGludXggS2VybmVsIE1haWxpbmcgTGlzdCBpcyBob3cgdG8gYXBwbHkKQEAgLTc2LDcgKzc2LDcgQEAKIAogSWYgeW91IHdpc2ggdG8gdW5jb21wcmVzcyB0aGUgcGF0Y2ggZmlsZSBieSBoYW5kIGZpcnN0IGJlZm9yZSBhcHBseWluZyBpdAogKHdoYXQgSSBhc3N1bWUgeW91J3ZlIGRvbmUgaW4gdGhlIGV4YW1wbGVzIGJlbG93KSwgdGhlbiB5b3Ugc2ltcGx5IHJ1bgotZ3VuemlwIG9yIGJ1bnppcDIgb24gdGhlIGZpbGUgLSBsaWtlIHRoaXM6CitndW56aXAgb3IgYnVuemlwMiBvbiB0aGUgZmlsZSAtLSBsaWtlIHRoaXM6CiAJZ3VuemlwIHBhdGNoLXgueS56Lmd6CiAJYnVuemlwMiBwYXRjaC14Lnkuei5iejIKIApAQCAtOTQsNyArOTQsNyBAQAogLS0tCiAgV2hlbiBwYXRjaCBhcHBsaWVzIGEgcGF0Y2ggZmlsZSBpdCBhdHRlbXB0cyB0byB2ZXJpZnkgdGhlIHNhbml0eSBvZiB0aGUKIGZpbGUgaW4gZGlmZmVyZW50IHdheXMuCi1DaGVja2luZyB0aGF0IHRoZSBmaWxlIGxvb2tzIGxpa2UgYSB2YWxpZCBwYXRjaCBmaWxlLCBjaGVja2luZyB0aGUgY29kZQorQ2hlY2tpbmcgdGhhdCB0aGUgZmlsZSBsb29rcyBsaWtlIGEgdmFsaWQgcGF0Y2ggZmlsZSAmIGNoZWNraW5nIHRoZSBjb2RlCiBhcm91bmQgdGhlIGJpdHMgYmVpbmcgbW9kaWZpZWQgbWF0Y2hlcyB0aGUgY29udGV4dCBwcm92aWRlZCBpbiB0aGUgcGF0Y2ggYXJlCiBqdXN0IHR3byBvZiB0aGUgYmFzaWMgc2FuaXR5IGNoZWNrcyBwYXRjaCBkb2VzLgogCkBAIC0xMTgsMTYgKzExOCwxNiBAQAogCiBXaGVuIHBhdGNoIGVuY291bnRlcnMgYSBjaGFuZ2UgdGhhdCBpdCBjYW4ndCBmaXggdXAgd2l0aCBmdXp6IGl0IHJlamVjdHMgaXQKIG91dHJpZ2h0IGFuZCBsZWF2ZXMgYSBmaWxlIHdpdGggYSAucmVqIGV4dGVuc2lvbiAoYSByZWplY3QgZmlsZSkuIFlvdSBjYW4KLXJlYWQgdGhpcyBmaWxlIHRvIHNlZSBleGFjdGVseSB3aGF0IGNoYW5nZSBjb3VsZG4ndCBiZSBhcHBsaWVkLCBzbyB5b3UgY2FuCityZWFkIHRoaXMgZmlsZSB0byBzZWUgZXhhY3RseSB3aGF0IGNoYW5nZSBjb3VsZG4ndCBiZSBhcHBsaWVkLCBzbyB5b3UgY2FuCiBnbyBmaXggaXQgdXAgYnkgaGFuZCBpZiB5b3Ugd2lzaC4KIAotSWYgeW91IGRvbid0IGhhdmUgYW55IHRoaXJkIHBhcnR5IHBhdGNoZXMgYXBwbGllZCB0byB5b3VyIGtlcm5lbCBzb3VyY2UsIGJ1dAorSWYgeW91IGRvbid0IGhhdmUgYW55IHRoaXJkLXBhcnR5IHBhdGNoZXMgYXBwbGllZCB0byB5b3VyIGtlcm5lbCBzb3VyY2UsIGJ1dAogb25seSBwYXRjaGVzIGZyb20ga2VybmVsLm9yZyBhbmQgeW91IGFwcGx5IHRoZSBwYXRjaGVzIGluIHRoZSBjb3JyZWN0IG9yZGVyLAogYW5kIGhhdmUgbWFkZSBubyBtb2RpZmljYXRpb25zIHlvdXJzZWxmIHRvIHRoZSBzb3VyY2UgZmlsZXMsIHRoZW4geW91IHNob3VsZAogbmV2ZXIgc2VlIGEgZnV6eiBvciByZWplY3QgbWVzc2FnZSBmcm9tIHBhdGNoLiBJZiB5b3UgZG8gc2VlIHN1Y2ggbWVzc2FnZXMKIGFueXdheSwgdGhlbiB0aGVyZSdzIGEgaGlnaCByaXNrIHRoYXQgZWl0aGVyIHlvdXIgbG9jYWwgc291cmNlIHRyZWUgb3IgdGhlCiBwYXRjaCBmaWxlIGlzIGNvcnJ1cHRlZCBpbiBzb21lIHdheS4gSW4gdGhhdCBjYXNlIHlvdSBzaG91bGQgcHJvYmFibHkgdHJ5Ci1yZWRvd25sb2FkaW5nIHRoZSBwYXRjaCBhbmQgaWYgdGhpbmdzIGFyZSBzdGlsbCBub3QgT0sgdGhlbiB5b3UnZCBiZSBhZHZpc2VkCityZS1kb3dubG9hZGluZyB0aGUgcGF0Y2ggYW5kIGlmIHRoaW5ncyBhcmUgc3RpbGwgbm90IE9LIHRoZW4geW91J2QgYmUgYWR2aXNlZAogdG8gc3RhcnQgd2l0aCBhIGZyZXNoIHRyZWUgZG93bmxvYWRlZCBpbiBmdWxsIGZyb20ga2VybmVsLm9yZy4KIAogTGV0J3MgbG9vayBhIGJpdCBtb3JlIGF0IHNvbWUgb2YgdGhlIG1lc3NhZ2VzIHBhdGNoIGNhbiBwcm9kdWNlLgpAQCAtMTM2LDcgKzEzNiw3IEBACiBmaW5kIGEgZmlsZSB0byBiZSBwYXRjaGVkLiBNb3N0IGxpa2VseSB5b3UgZm9yZ290IHRvIHNwZWNpZnkgLXAxIG9yIHlvdSBhcmUKIGluIHRoZSB3cm9uZyBkaXJlY3RvcnkuIExlc3Mgb2Z0ZW4sIHlvdSdsbCBmaW5kIHBhdGNoZXMgdGhhdCBuZWVkIHRvIGJlCiBhcHBsaWVkIHdpdGggLXAwIGluc3RlYWQgb2YgLXAxIChyZWFkaW5nIHRoZSBwYXRjaCBmaWxlIHNob3VsZCByZXZlYWwgaWYKLXRoaXMgaXMgdGhlIGNhc2UgLSBpZiBzbywgdGhlbiB0aGlzIGlzIGFuIGVycm9yIGJ5IHRoZSBwZXJzb24gd2hvIGNyZWF0ZWQKK3RoaXMgaXMgdGhlIGNhc2UgLS0gaWYgc28sIHRoZW4gdGhpcyBpcyBhbiBlcnJvciBieSB0aGUgcGVyc29uIHdobyBjcmVhdGVkCiB0aGUgcGF0Y2ggYnV0IGlzIG5vdCBmYXRhbCkuCiAKIElmIHlvdSBnZXQgIkh1bmsgIzIgc3VjY2VlZGVkIGF0IDE4ODcgd2l0aCBmdXp6IDIgKG9mZnNldCA3IGxpbmVzKS4iIG9yIGEKQEAgLTE2NywyMiArMTY3LDI4IEBACiAKIEEgbWVzc2FnZSBzaW1pbGFyIHRvICJwYXRjaDogKioqKiB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIHBhdGNoIiBvciAicGF0Y2gKIHVuZXhwZWN0ZWRseSBlbmRzIGluIG1pZGRsZSBvZiBsaW5lIiBtZWFucyB0aGF0IHBhdGNoIGNvdWxkIG1ha2Ugbm8gc2Vuc2Ugb2YKLXRoZSBmaWxlIHlvdSBmZWQgdG8gaXQuIEVpdGhlciB5b3VyIGRvd25sb2FkIGlzIGJyb2tlbiBvciB5b3UgdHJpZWQgdG8gZmVlZAotcGF0Y2ggYSBjb21wcmVzc2VkIHBhdGNoIGZpbGUgd2l0aG91dCB1bmNvbXByZXNzaW5nIGl0IGZpcnN0LgordGhlIGZpbGUgeW91IGZlZCB0byBpdC4gRWl0aGVyIHlvdXIgZG93bmxvYWQgaXMgYnJva2VuLCB5b3UgdHJpZWQgdG8gZmVlZAorcGF0Y2ggYSBjb21wcmVzc2VkIHBhdGNoIGZpbGUgd2l0aG91dCB1bmNvbXByZXNzaW5nIGl0IGZpcnN0LCBvciB0aGUgcGF0Y2gKK2ZpbGUgdGhhdCB5b3UgYXJlIHVzaW5nIGhhcyBiZWVuIG1hbmdsZWQgYnkgYSBtYWlsIGNsaWVudCBvciBtYWlsIHRyYW5zZmVyCithZ2VudCBhbG9uZyB0aGUgd2F5IHNvbWV3aGVyZSwgZS5nLiwgYnkgc3BsaXR0aW5nIGEgbG9uZyBsaW5lIGludG8gdHdvIGxpbmVzLgorT2Z0ZW4gdGhlc2Ugd2FybmluZ3MgY2FuIGVhc2lseSBiZSBmaXhlZCBieSBqb2luaW5nIChjb25jYXRlbmF0aW5nKSB0aGUKK3R3byBsaW5lcyB0aGF0IGhhZCBiZWVuIHNwbGl0LgogCiBBcyBJIGFscmVhZHkgbWVudGlvbmVkIGFib3ZlLCB0aGVzZSBlcnJvcnMgc2hvdWxkIG5ldmVyIGhhcHBlbiBpZiB5b3UgYXBwbHkKIGEgcGF0Y2ggZnJvbSBrZXJuZWwub3JnIHRvIHRoZSBjb3JyZWN0IHZlcnNpb24gb2YgYW4gdW5tb2RpZmllZCBzb3VyY2UgdHJlZS4KIFNvIGlmIHlvdSBnZXQgdGhlc2UgZXJyb3JzIHdpdGgga2VybmVsLm9yZyBwYXRjaGVzIHRoZW4geW91IHNob3VsZCBwcm9iYWJseQotYXNzdW1lIHRoYXQgZWl0aGVyIHlvdXIgcGF0Y2ggZmlsZSBvciB5b3VyIHRyZWUgaXMgYnJva2VuIGFuZCBJJ2QgYWR2aWNlIHlvdQorYXNzdW1lIHRoYXQgZWl0aGVyIHlvdXIgcGF0Y2ggZmlsZSBvciB5b3VyIHRyZWUgaXMgYnJva2VuIGFuZCBJJ2QgYWR2aXNlIHlvdQogdG8gc3RhcnQgb3ZlciB3aXRoIGEgZnJlc2ggZG93bmxvYWQgb2YgYSBmdWxsIGtlcm5lbCB0cmVlIGFuZCB0aGUgcGF0Y2ggeW91CiB3aXNoIHRvIGFwcGx5LgogCiAKIEFyZSB0aGVyZSBhbnkgYWx0ZXJuYXRpdmVzIHRvIGBwYXRjaCc/CiAtLS0KLSBZZXMgdGhlcmUgYXJlIGFsdGVybmF0aXZlcy4gWW91IGNhbiB1c2UgdGhlIGBpbnRlcmRpZmYnIHByb2dyYW0KLShodHRwOi8vY3liZXJlbGsubmV0L3RpbS9wYXRjaHV0aWxzLykgdG8gZ2VuZXJhdGUgYSBwYXRjaCByZXByZXNlbnRpbmcgdGhlCi1kaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byBwYXRjaGVzIGFuZCB0aGVuIGFwcGx5IHRoZSByZXN1bHQuCisgWWVzIHRoZXJlIGFyZSBhbHRlcm5hdGl2ZXMuCisKKyBZb3UgY2FuIHVzZSB0aGUgYGludGVyZGlmZicgcHJvZ3JhbSAoaHR0cDovL2N5YmVyZWxrLm5ldC90aW0vcGF0Y2h1dGlscy8pIHRvCitnZW5lcmF0ZSBhIHBhdGNoIHJlcHJlc2VudGluZyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gcGF0Y2hlcyBhbmQgdGhlbgorYXBwbHkgdGhlIHJlc3VsdC4KIFRoaXMgd2lsbCBsZXQgeW91IG1vdmUgZnJvbSBzb21ldGhpbmcgbGlrZSAyLjYuMTIuMiB0byAyLjYuMTIuMyBpbiBhIHNpbmdsZQogc3RlcC4gVGhlIC16IGZsYWcgdG8gaW50ZXJkaWZmIHdpbGwgZXZlbiBsZXQgeW91IGZlZWQgaXQgcGF0Y2hlcyBpbiBnemlwIG9yCiBiemlwMiBjb21wcmVzc2VkIGZvcm0gZGlyZWN0bHkgd2l0aG91dCB0aGUgdXNlIG9mIHpjYXQgb3IgYnpjYXQgb3IgbWFudWFsCkBAIC0xOTcsMTAgKzIwMywxMCBAQAogIEFub3RoZXIgYWx0ZXJuYXRpdmUgaXMgYGtldGNodXAnLCB3aGljaCBpcyBhIHB5dGhvbiBzY3JpcHQgZm9yIGF1dG9tYXRpYwogZG93bmxvYWRpbmcgYW5kIGFwcGx5aW5nIG9mIHBhdGNoZXMgKGh0dHA6Ly93d3cuc2VsZW5pYy5jb20va2V0Y2h1cC8pLgogCi1PdGhlciBuaWNlIHRvb2xzIGFyZSBkaWZmc3RhdCB3aGljaCBzaG93cyBhIHN1bW1hcnkgb2YgY2hhbmdlcyBtYWRlIGJ5IGEKLXBhdGNoLCBsc2RpZmYgd2hpY2ggZGlzcGxheXMgYSBzaG9ydCBsaXN0aW5nIG9mIGFmZmVjdGVkIGZpbGVzIGluIGEgcGF0Y2gKLWZpbGUsIGFsb25nIHdpdGggKG9wdGlvbmFsbHkpIHRoZSBsaW5lIG51bWJlcnMgb2YgdGhlIHN0YXJ0IG9mIGVhY2ggcGF0Y2gKLWFuZCBncmVwZGlmZiB3aGljaCBkaXNwbGF5cyBhIGxpc3Qgb2YgdGhlIGZpbGVzIG1vZGlmaWVkIGJ5IGEgcGF0Y2ggd2hlcmUKKyBPdGhlciBuaWNlIHRvb2xzIGFyZSBkaWZmc3RhdCwgd2hpY2ggc2hvd3MgYSBzdW1tYXJ5IG9mIGNoYW5nZXMgbWFkZSBieSBhCitwYXRjaDsgbHNkaWZmLCB3aGljaCBkaXNwbGF5cyBhIHNob3J0IGxpc3Rpbmcgb2YgYWZmZWN0ZWQgZmlsZXMgaW4gYSBwYXRjaAorZmlsZSwgYWxvbmcgd2l0aCAob3B0aW9uYWxseSkgdGhlIGxpbmUgbnVtYmVycyBvZiB0aGUgc3RhcnQgb2YgZWFjaCBwYXRjaDsKK2FuZCBncmVwZGlmZiwgd2hpY2ggZGlzcGxheXMgYSBsaXN0IG9mIHRoZSBmaWxlcyBtb2RpZmllZCBieSBhIHBhdGNoIHdoZXJlCiB0aGUgcGF0Y2ggY29udGFpbnMgYSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24uCiAKIApAQCAtMjI1LDggKzIzMSw4IEBACiBJbiBwbGFjZSBvZiBmdHAua2VybmVsLm9yZyB5b3UgY2FuIHVzZSBmdHAuY2Mua2VybmVsLm9yZywgd2hlcmUgY2MgaXMgYQogY291bnRyeSBjb2RlLiBUaGlzIHdheSB5b3UnbGwgYmUgZG93bmxvYWRpbmcgZnJvbSBhIG1pcnJvciBzaXRlIHRoYXQncyBtb3N0CiBsaWtlbHkgZ2VvZ3JhcGhpY2FsbHkgY2xvc2VyIHRvIHlvdSwgcmVzdWx0aW5nIGluIGZhc3RlciBkb3dubG9hZHMgZm9yIHlvdSwKLWxlc3MgYmFuZHdpZHRoIHVzZWQgZ2xvYmFsbHkgYW5kIGxlc3MgbG9hZCBvbiB0aGUgbWFpbiBrZXJuZWwub3JnIHNlcnZlcnMgLQotdGhlc2UgYXJlIGdvb2QgdGhpbmdzLCBkbyB1c2UgbWlycm9ycyB3aGVuIHBvc3NpYmxlLgorbGVzcyBiYW5kd2lkdGggdXNlZCBnbG9iYWxseSBhbmQgbGVzcyBsb2FkIG9uIHRoZSBtYWluIGtlcm5lbC5vcmcgc2VydmVycyAtLQordGhlc2UgYXJlIGdvb2QgdGhpbmdzLCBzbyBkbyB1c2UgbWlycm9ycyB3aGVuIHBvc3NpYmxlLgogCiAKIFRoZSAyLjYueCBrZXJuZWxzCkBAIC0yMzQsMTQgKzI0MCwxNCBAQAogIFRoZXNlIGFyZSB0aGUgYmFzZSBzdGFibGUgcmVsZWFzZXMgcmVsZWFzZWQgYnkgTGludXMuIFRoZSBoaWdoZXN0IG51bWJlcmVkCiByZWxlYXNlIGlzIHRoZSBtb3N0IHJlY2VudC4KIAotSWYgcmVncmVzc2lvbnMgb3Igb3RoZXIgc2VyaW91cyBmbGF3cyBhcmUgZm91bmQgdGhlbiBhIC1zdGFibGUgZml4IHBhdGNoCitJZiByZWdyZXNzaW9ucyBvciBvdGhlciBzZXJpb3VzIGZsYXdzIGFyZSBmb3VuZCwgdGhlbiBhIC1zdGFibGUgZml4IHBhdGNoCiB3aWxsIGJlIHJlbGVhc2VkIChzZWUgYmVsb3cpIG9uIHRvcCBvZiB0aGlzIGJhc2UuIE9uY2UgYSBuZXcgMi42LnggYmFzZQoga2VybmVsIGlzIHJlbGVhc2VkLCBhIHBhdGNoIGlzIG1hZGUgYXZhaWxhYmxlIHRoYXQgaXMgYSBkZWx0YSBiZXR3ZWVuIHRoZQogcHJldmlvdXMgMi42Lngga2VybmVsIGFuZCB0aGUgbmV3IG9uZS4KIAotVG8gYXBwbHkgYSBwYXRjaCBtb3ZpbmcgZnJvbSAyLjYuMTEgdG8gMi42LjEyIHlvdSdkIGRvIHRoZSBmb2xsb3dpbmcgKG5vdGUKK1RvIGFwcGx5IGEgcGF0Y2ggbW92aW5nIGZyb20gMi42LjExIHRvIDIuNi4xMiwgeW91J2QgZG8gdGhlIGZvbGxvd2luZyAobm90ZQogdGhhdCBzdWNoIHBhdGNoZXMgZG8gKk5PVCogYXBwbHkgb24gdG9wIG9mIDIuNi54Lnkga2VybmVscyBidXQgb24gdG9wIG9mIHRoZQotYmFzZSAyLjYueCBrZXJuZWwgLSBpZiB5b3UgbmVlZCB0byBtb3ZlIGZyb20gMi42LngueSB0byAyLjYueCsxIHlvdSBuZWVkIHRvCitiYXNlIDIuNi54IGtlcm5lbCAtLSBpZiB5b3UgbmVlZCB0byBtb3ZlIGZyb20gMi42LngueSB0byAyLjYueCsxIHlvdSBuZWVkIHRvCiBmaXJzdCByZXZlcnQgdGhlIDIuNi54LnkgcGF0Y2gpLgogCiBIZXJlIGFyZSBzb21lIGV4YW1wbGVzOgpAQCAtMjU4LDEyICsyNjQsMTIgQEAKIAkJCQkJIyBzb3VyY2UgZGlyIGlzIG5vdyAyLjYuMTEKICQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtMi42LjEyCQkjIGFwcGx5IG5ldyAyLjYuMTIgcGF0Y2gKICQgY2QgLi4KLSQgbXYgbGludXgtMi42LjExLjEgaW51eC0yLjYuMTIJCSMgcmVuYW1lIHNvdXJjZSBkaXIKKyQgbXYgbGludXgtMi42LjExLjEgbGludXgtMi42LjEyCQkjIHJlbmFtZSBzb3VyY2UgZGlyCiAKIAogVGhlIDIuNi54Lnkga2VybmVscwogLS0tCi0gS2VybmVscyB3aXRoIDQgZGlnaXQgdmVyc2lvbnMgYXJlIC1zdGFibGUga2VybmVscy4gVGhleSBjb250YWluIHNtYWxsKGlzaCkKKyBLZXJuZWxzIHdpdGggNC1kaWdpdCB2ZXJzaW9ucyBhcmUgLXN0YWJsZSBrZXJuZWxzLiBUaGV5IGNvbnRhaW4gc21hbGwoaXNoKQogY3JpdGljYWwgZml4ZXMgZm9yIHNlY3VyaXR5IHByb2JsZW1zIG9yIHNpZ25pZmljYW50IHJlZ3Jlc3Npb25zIGRpc2NvdmVyZWQKIGluIGEgZ2l2ZW4gMi42Lngga2VybmVsLgogCkBAIC0yNzQsOSArMjgwLDE0IEBACiBJZiBubyAyLjYueC55IGtlcm5lbCBpcyBhdmFpbGFibGUsIHRoZW4gdGhlIGhpZ2hlc3QgbnVtYmVyZWQgMi42Lngga2VybmVsIGlzCiB0aGUgY3VycmVudCBzdGFibGUga2VybmVsLgogCisgbm90ZTogdGhlIC1zdGFibGUgdGVhbSB1c3VhbGx5IGRvIG1ha2UgaW5jcmVtZW50YWwgcGF0Y2hlcyBhdmFpbGFibGUgYXMgd2VsbAorIGFzIHBhdGNoZXMgYWdhaW5zdCB0aGUgbGF0ZXN0IG1haW5saW5lIHJlbGVhc2UsIGJ1dCBJIG9ubHkgY292ZXIgdGhlCisgbm9uLWluY3JlbWVudGFsIG9uZXMgYmVsb3cuIFRoZSBpbmNyZW1lbnRhbCBvbmVzIGNhbiBiZSBmb3VuZCBhdAorIGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvdjIuNi9pbmNyLworCiBUaGVzZSBwYXRjaGVzIGFyZSBub3QgaW5jcmVtZW50YWwsIG1lYW5pbmcgdGhhdCBmb3IgZXhhbXBsZSB0aGUgMi42LjEyLjMKIHBhdGNoIGRvZXMgbm90IGFwcGx5IG9uIHRvcCBvZiB0aGUgMi42LjEyLjIga2VybmVsIHNvdXJjZSwgYnV0IHJhdGhlciBvbiB0b3AKLW9mIHRoZSBiYXNlIDIuNi4xMiBrZXJuZWwgc291cmNlLgorb2YgdGhlIGJhc2UgMi42LjEyIGtlcm5lbCBzb3VyY2UgLgogU28sIGluIG9yZGVyIHRvIGFwcGx5IHRoZSAyLjYuMTIuMyBwYXRjaCB0byB5b3VyIGV4aXN0aW5nIDIuNi4xMi4yIGtlcm5lbAogc291cmNlIHlvdSBoYXZlIHRvIGZpcnN0IGJhY2sgb3V0IHRoZSAyLjYuMTIuMiBwYXRjaCAoc28geW91IGFyZSBsZWZ0IHdpdGggYQogYmFzZSAyLjYuMTIga2VybmVsIHNvdXJjZSkgYW5kIHRoZW4gYXBwbHkgdGhlIG5ldyAyLjYuMTIuMyBwYXRjaC4KQEAgLTM0MiwxMiArMzUzLDEyIEBACiByZXBvc2l0b3J5LCBoZW5jZSB0aGUgbmFtZSkuCiAKIFRoZXNlIHBhdGNoZXMgYXJlIHVzdWFsbHkgcmVsZWFzZWQgZGFpbHkgYW5kIHJlcHJlc2VudCB0aGUgY3VycmVudCBzdGF0ZSBvZgotTGludXMnIHRyZWUuIFRoZXkgYXJlIG1vcmUgZXhwZXJpbWVudGFsIHRoYW4gLXJjIGtlcm5lbHMgc2luY2UgdGhleSBhcmUKK0xpbnVzJ3MgdHJlZS4gVGhleSBhcmUgbW9yZSBleHBlcmltZW50YWwgdGhhbiAtcmMga2VybmVscyBzaW5jZSB0aGV5IGFyZQogZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgd2l0aG91dCBldmVuIGEgY3Vyc29yeSBnbGFuY2UgdG8gc2VlIGlmIHRoZXkgYXJlCiBzYW5lLgogCiAtZ2l0IHBhdGNoZXMgYXJlIG5vdCBpbmNyZW1lbnRhbCBhbmQgYXBwbHkgZWl0aGVyIHRvIGEgYmFzZSAyLjYueCBrZXJuZWwgb3IKLWEgYmFzZSAyLjYueC1yYyBrZXJuZWwgLSB5b3UgY2FuIHNlZSB3aGljaCBmcm9tIHRoZWlyIG5hbWUuCithIGJhc2UgMi42LngtcmMga2VybmVsIC0tIHlvdSBjYW4gc2VlIHdoaWNoIGZyb20gdGhlaXIgbmFtZS4KIEEgcGF0Y2ggbmFtZWQgMi42LjEyLWdpdDEgYXBwbGllcyB0byB0aGUgMi42LjEyIGtlcm5lbCBzb3VyY2UgYW5kIGEgcGF0Y2gKIG5hbWVkIDIuNi4xMy1yYzMtZ2l0MiBhcHBsaWVzIHRvIHRoZSBzb3VyY2Ugb2YgdGhlIDIuNi4xMy1yYzMga2VybmVsLgogCkBAIC0zOTAsMTIgKzQwMSwxMiBAQAogZW5zdXJlIG1heGltdW0gdGVzdGluZy4KIAogVGhpcyBicmFuY2ggaXMgaW4gY29uc3RhbnQgZmx1eCBhbmQgY29udGFpbnMgbWFueSBleHBlcmltZW50YWwgZmVhdHVyZXMsIGEKLWxvdCBvZiBkZWJ1Z2dpbmcgcGF0Y2hlcyBub3QgYXBwcm9wcmlhdGUgZm9yIG1haW5saW5lIGV0YyBhbmQgaXMgdGhlIG1vc3QKK2xvdCBvZiBkZWJ1Z2dpbmcgcGF0Y2hlcyBub3QgYXBwcm9wcmlhdGUgZm9yIG1haW5saW5lIGV0Yy4sIGFuZCBpcyB0aGUgbW9zdAogZXhwZXJpbWVudGFsIG9mIHRoZSBicmFuY2hlcyBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4KIAogVGhlc2Uga2VybmVscyBhcmUgbm90IGFwcHJvcHJpYXRlIGZvciB1c2Ugb24gc3lzdGVtcyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZQogc3RhYmxlIGFuZCB0aGV5IGFyZSBtb3JlIHJpc2t5IHRvIHJ1biB0aGFuIGFueSBvZiB0aGUgb3RoZXIgYnJhbmNoZXMgKG1ha2UKLXN1cmUgeW91IGhhdmUgdXAtdG8tZGF0ZSBiYWNrdXBzIC0gdGhhdCBnb2VzIGZvciBhbnkgZXhwZXJpbWVudGFsIGtlcm5lbCBidXQKK3N1cmUgeW91IGhhdmUgdXAtdG8tZGF0ZSBiYWNrdXBzIC0tIHRoYXQgZ29lcyBmb3IgYW55IGV4cGVyaW1lbnRhbCBrZXJuZWwgYnV0CiBldmVuIG1vcmUgc28gZm9yIC1tbSBrZXJuZWxzKS4KIAogVGhlc2Uga2VybmVscyBpbiBhZGRpdGlvbiB0byBhbGwgdGhlIG90aGVyIGV4cGVyaW1lbnRhbCBwYXRjaGVzIHRoZXkgY29udGFpbgpAQCAtNDMzLDcgKzQ0NCwxMSBAQAogJCBtdiBsaW51eC0yLjYuMTItbW0xIGxpbnV4LTIuNi4xMy1yYzMtbW0zCSMgcmVuYW1lIHRoZSBzb3VyY2UgZGlyCiAKIAotVGhpcyBjb25jbHVkZXMgdGhpcyBsaXN0IG9mIGV4cGxhbmF0aW9ucyBvZiB0aGUgdmFyaW91cyBrZXJuZWwgdHJlZXMgYW5kIEkKLWhvcGUgeW91IGFyZSBub3cgY3J5c3RhbCBjbGVhciBvbiBob3cgdG8gYXBwbHkgdGhlIHZhcmlvdXMgcGF0Y2hlcyBhbmQgaGVscAotdGVzdGluZyB0aGUga2VybmVsLgorVGhpcyBjb25jbHVkZXMgdGhpcyBsaXN0IG9mIGV4cGxhbmF0aW9ucyBvZiB0aGUgdmFyaW91cyBrZXJuZWwgdHJlZXMuCitJIGhvcGUgeW91IGFyZSBub3cgY2xlYXIgb24gaG93IHRvIGFwcGx5IHRoZSB2YXJpb3VzIHBhdGNoZXMgYW5kIGhlbHAgdGVzdGluZwordGhlIGtlcm5lbC4KKworVGhhbmsgeW91J3MgdG8gUmFuZHkgRHVubGFwLCBSb2xmIEVpa2UgQmVlciwgTGludXMgVG9ydmFsZHMsIEJvZG8gRWdnZXJ0LAorSm9oYW5uZXMgU3RlemVuYmFjaCwgR3JhbnQgQ29hZHksIFBhdmVsIE1hY2hlayBhbmQgb3RoZXJzIHRoYXQgSSBtYXkgaGF2ZQorZm9yZ290dGVuIGZvciB0aGVpciByZXZpZXdzIGFuZCBjb250cmlidXRpb25zIHRvIHRoaXMgZG9jdW1lbnQuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYmxvY2svYmFycmllci50eHQgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrL2JhcnJpZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOTcxNTEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrL2JhcnJpZXIudHh0CkBAIC0wLDAgKzEsMjcxIEBACitJL08gQmFycmllcnMKKz09PT09PT09PT09PQorVGVqdW4gSGVvIDxodGVqdW5AZ21haWwuY29tPiwgSnVseSAyMiAyMDA1CisKK0kvTyBiYXJyaWVyIHJlcXVlc3RzIGFyZSB1c2VkIHRvIGd1YXJhbnRlZSBvcmRlcmluZyBhcm91bmQgdGhlIGJhcnJpZXIKK3JlcXVlc3RzLiAgVW5sZXNzIHlvdSdyZSBjcmF6eSBlbm91Z2ggdG8gdXNlIGRpc2sgZHJpdmVzIGZvcgoraW1wbGVtZW50aW5nIHN5bmNocm9uaXphdGlvbiBjb25zdHJ1Y3RzICh3b3csIHNvdW5kcyBpbnRlcmVzdGluZy4uLiksCit0aGUgb3JkZXJpbmcgaXMgbWVhbmluZ2Z1bCBvbmx5IGZvciB3cml0ZSByZXF1ZXN0cyBmb3IgdGhpbmdzIGxpa2UKK2pvdXJuYWwgY2hlY2twb2ludHMuICBBbGwgcmVxdWVzdHMgcXVldWVkIGJlZm9yZSBhIGJhcnJpZXIgcmVxdWVzdAorbXVzdCBiZSBmaW5pc2hlZCAobWFkZSBpdCB0byB0aGUgcGh5c2ljYWwgbWVkaXVtKSBiZWZvcmUgdGhlIGJhcnJpZXIKK3JlcXVlc3QgaXMgc3RhcnRlZCwgYW5kIGFsbCByZXF1ZXN0cyBxdWV1ZWQgYWZ0ZXIgdGhlIGJhcnJpZXIgcmVxdWVzdAorbXVzdCBiZSBzdGFydGVkIG9ubHkgYWZ0ZXIgdGhlIGJhcnJpZXIgcmVxdWVzdCBpcyBmaW5pc2hlZCAoYWdhaW4sCittYWRlIGl0IHRvIHRoZSBwaHlzaWNhbCBtZWRpdW0pLgorCitJbiBvdGhlciB3b3JkcywgSS9PIGJhcnJpZXIgcmVxdWVzdHMgaGF2ZSB0aGUgZm9sbG93aW5nIHR3byBwcm9wZXJ0aWVzLgorCisxLiBSZXF1ZXN0IG9yZGVyaW5nCisKK1JlcXVlc3RzIGNhbm5vdCBwYXNzIHRoZSBiYXJyaWVyIHJlcXVlc3QuICBQcmVjZWRpbmcgcmVxdWVzdHMgYXJlCitwcm9jZXNzZWQgYmVmb3JlIHRoZSBiYXJyaWVyIGFuZCBmb2xsb3dpbmcgcmVxdWVzdHMgYWZ0ZXIuCisKK0RlcGVuZGluZyBvbiB3aGF0IGZlYXR1cmVzIGEgZHJpdmUgc3VwcG9ydHMsIHRoaXMgY2FuIGJlIGRvbmUgaW4gb25lCitvZiB0aGUgZm9sbG93aW5nIHRocmVlIHdheXMuCisKK2kuIEZvciBkZXZpY2VzIHdoaWNoIGhhdmUgcXVldWUgZGVwdGggZ3JlYXRlciB0aGFuIDEgKFRDUSBkZXZpY2VzKSBhbmQKK3N1cHBvcnQgb3JkZXJlZCB0YWdzLCBibG9jayBsYXllciBjYW4ganVzdCBpc3N1ZSB0aGUgYmFycmllciBhcyBhbgorb3JkZXJlZCByZXF1ZXN0IGFuZCB0aGUgbG93ZXIgbGV2ZWwgZHJpdmVyLCBjb250cm9sbGVyIGFuZCBkcml2ZQoraXRzZWxmIGFyZSByZXNwb25zaWJsZSBmb3IgbWFraW5nIHN1cmUgdGhhdCB0aGUgb3JkZXJpbmcgY29udHJhaW50IGlzCittZXQuICBNb3N0IG1vZGVybiBTQ1NJIGNvbnRyb2xsZXJzL2RyaXZlcyBzaG91bGQgc3VwcG9ydCB0aGlzLgorCitOT1RFOiBTQ1NJIG9yZGVyZWQgdGFnIGlzbid0IGN1cnJlbnRseSB1c2VkIGR1ZSB0byBsaW1pdGF0aW9uIGluIHRoZQorICAgICAgU0NTSSBtaWRsYXllciwgc2VlIHRoZSBmb2xsb3dpbmcgcmFuZG9tIG5vdGVzIHNlY3Rpb24uCisKK2lpLiBGb3IgZGV2aWNlcyB3aGljaCBoYXZlIHF1ZXVlIGRlcHRoIGdyZWF0ZXIgdGhhbiAxIGJ1dCBkb24ndAorc3VwcG9ydCBvcmRlcmVkIHRhZ3MsIGJsb2NrIGxheWVyIGVuc3VyZXMgdGhhdCB0aGUgcmVxdWVzdHMgcHJlY2VkaW5nCithIGJhcnJpZXIgcmVxdWVzdCBmaW5pc2hlcyBiZWZvcmUgaXNzdWluZyB0aGUgYmFycmllciByZXF1ZXN0LiAgQWxzbywKK2l0IGRlZmVycyByZXF1ZXN0cyBmb2xsb3dpbmcgdGhlIGJhcnJpZXIgdW50aWwgdGhlIGJhcnJpZXIgcmVxdWVzdCBpcworZmluaXNoZWQuICBPbGRlciBTQ1NJIGNvbnRyb2xsZXJzL2RyaXZlcyBhbmQgU0FUQSBkcml2ZXMgZmFsbCBpbiB0aGlzCitjYXRlZ29yeS4KKworaWlpLiBEZXZpY2VzIHdoaWNoIGhhdmUgcXVldWUgZGVwdGggb2YgMS4gIFRoaXMgaXMgYSBkZWdlbmVyYXRlIGNhc2UKK29mIGlpLiAgSnVzdCBrZWVwaW5nIGlzc3VlIG9yZGVyIHN1ZmZpY2VzLiAgQW5jaWVudCBTQ1NJCitjb250cm9sbGVycy9kcml2ZXMgYW5kIElERSBkcml2ZXMgYXJlIGluIHRoaXMgY2F0ZWdvcnkuCisKKzIuIEZvcmNlZCBmbHVzaGluZyB0byBwaHlzY2lhbCBtZWRpdW0KKworQWdhaW4sIGlmIHlvdSdyZSBub3QgZ29ubmEgZG8gc3luY2hyb25pemF0aW9uIHdpdGggZGlzayBkcml2ZXMgKGRhbmcsCitpdCBzb3VuZHMgZXZlbiBtb3JlIGFwcGVhbGluZyBub3chKSwgdGhlIHJlYXNvbiB5b3UgdXNlIEkvTyBiYXJyaWVycworaXMgbWFpbmx5IHRvIHByb3RlY3QgZmlsZXN5c3RlbSBpbnRlZ3JpdHkgd2hlbiBwb3dlciBmYWlsdXJlIG9yIHNvbWUKK290aGVyIGV2ZW50cyBhYnJ1cHRseSBzdG9wIHRoZSBkcml2ZSBmcm9tIG9wZXJhdGluZyBhbmQgcG9zc2libHkgbWFrZQordGhlIGRyaXZlIGxvc2UgZGF0YSBpbiBpdHMgY2FjaGUuICBTbywgSS9PIGJhcnJpZXJzIG5lZWQgdG8gZ3VhcmFudGVlCit0aGF0IHJlcXVlc3RzIGFjdHVhbGx5IGdldCB3cml0dGVuIHRvIG5vbi12b2xhdGlsZSBtZWRpdW0gaW4gb3JkZXIuCisKK1RoZXJlIGFyZSBmb3VyIGNhc2VzLAorCitpLiBObyB3cml0ZS1iYWNrIGNhY2hlLiAgS2VlcGluZyByZXF1ZXN0cyBvcmRlcmVkIGlzIGVub3VnaC4KKworaWkuIFdyaXRlLWJhY2sgY2FjaGUgYnV0IG5vIGZsdXNoIG9wZXJhdGlvbi4gIFRoZXJlJ3Mgbm8gd2F5IHRvCitndXJhbnRlZSBwaHlzaWNhbC1tZWRpdW0gY29tbWl0IG9yZGVyLiAgVGhpcyBraW5kIG9mIGRldmljZXMgY2FuJ3QgdG8KK0kvTyBiYXJyaWVycy4KKworaWlpLiBXcml0ZS1iYWNrIGNhY2hlIGFuZCBmbHVzaCBvcGVyYXRpb24gYnV0IG5vIEZVQSAoZm9yY2VkIHVuaXQKK2FjY2VzcykuICBXZSBuZWVkIHR3byBjYWNoZSBmbHVzaGVzIC0gYmVmb3JlIGFuZCBhZnRlciB0aGUgYmFycmllcgorcmVxdWVzdC4KKworaXYuIFdyaXRlLWJhY2sgY2FjaGUsIGZsdXNoIG9wZXJhdGlvbiBhbmQgRlVBLiAgV2Ugc3RpbGwgbmVlZCBvbmUKK2ZsdXNoIHRvIG1ha2Ugc3VyZSByZXF1ZXN0cyBwcmVjZWRpbmcgYSBiYXJyaWVyIGFyZSB3cml0dGVuIHRvIG1lZGl1bSwKK2J1dCBwb3N0LWJhcnJpZXIgZmx1c2ggY2FuIGJlIGF2b2lkZWQgYnkgdXNpbmcgRlVBIHdyaXRlIG9uIHRoZQorYmFycmllciBpdHNlbGYuCisKKworSG93IHRvIHN1cHBvcnQgYmFycmllciByZXF1ZXN0cyBpbiBkcml2ZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQWxsIGJhcnJpZXIgaGFuZGxpbmcgaXMgZG9uZSBpbnNpZGUgYmxvY2sgbGF5ZXIgcHJvcGVyLiAgQWxsIGxvdyBsZXZlbAorZHJpdmVycyBoYXZlIHRvIGFyZSBpbXBsZW1lbnRpbmcgaXRzIHByZXBhcmVfZmx1c2hfZm4gYW5kIHVzaW5nIG9uZQordGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIHRvIGluZGljYXRlIHdoYXQgYmFycmllciB0eXBlIGl0IHN1cHBvcnRzCithbmQgaG93IHRvIHByZXBhcmUgZmx1c2ggcmVxdWVzdHMuICBOb3RlIHRoYXQgdGhlIHRlcm0gJ29yZGVyZWQnIGlzCit1c2VkIHRvIGluZGljYXRlIHRoZSB3aG9sZSBzZXF1ZW5jZSBvZiBwZXJmb3JtaW5nIGJhcnJpZXIgcmVxdWVzdHMKK2luY2x1ZGluZyBkcmFpbmluZyBhbmQgZmx1c2hpbmcuCisKK3R5cGVkZWYgdm9pZCAocHJlcGFyZV9mbHVzaF9mbikocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpOworCitpbnQgYmxrX3F1ZXVlX29yZGVyZWQocmVxdWVzdF9xdWV1ZV90ICpxLCB1bnNpZ25lZCBvcmRlcmVkLAorCQkgICAgICBwcmVwYXJlX2ZsdXNoX2ZuICpwcmVwYXJlX2ZsdXNoX2ZuLAorCQkgICAgICB1bnNpZ25lZCBnZnBfbWFzayk7CisKK2ludCBibGtfcXVldWVfb3JkZXJlZF9sb2NrZWQocmVxdWVzdF9xdWV1ZV90ICpxLCB1bnNpZ25lZCBvcmRlcmVkLAorCQkJICAgICBwcmVwYXJlX2ZsdXNoX2ZuICpwcmVwYXJlX2ZsdXNoX2ZuLAorCQkJICAgICB1bnNpZ25lZCBnZnBfbWFzayk7CisKK1RoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGZ1bmN0aW9ucyBpcyB3aGV0aGVyIG9yIG5vdCB0aGUKK2NhbGxlciBpcyBob2xkaW5nIHEtPnF1ZXVlX2xvY2sgb24gZW50cnkuICBUaGUgbGF0dGVyIGV4cGVjdHMgdGhlCitjYWxsZXIgaXMgaG9sZGluZyB0aGUgbG9jay4KKworQHEJCQk6IHRoZSBxdWV1ZSBpbiBxdWVzdGlvbgorQG9yZGVyZWQJCTogdGhlIG9yZGVyZWQgbW9kZSB0aGUgZHJpdmVyL2RldmljZSBzdXBwb3J0cworQHByZXBhcmVfZmx1c2hfZm4JOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBwcmVwYXJlIEBycSBzdWNoIHRoYXQgaXQKKwkJCSAgZmx1c2hlcyBjYWNoZSB0byBwaHlzaWNhbCBtZWRpdW0gd2hlbiBleGVjdXRlZAorQGdmcF9tYXNrCQk6IGdmcF9tYXNrIHVzZWQgd2hlbiBhbGxvY2F0aW5nIGRhdGEgc3RydWN0dXJlcworCQkJICBmb3Igb3JkZXJlZCBwcm9jZXNzaW5nCisKK0ZvciBleGFtcGxlLCBTQ1NJIGRpc2sgZHJpdmVyJ3MgcHJlcGFyZV9mbHVzaF9mbiBsb29rcyBsaWtlIHRoZQorZm9sbG93aW5nLgorCitzdGF0aWMgdm9pZCBzZF9wcmVwYXJlX2ZsdXNoKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQoreworCW1lbXNldChycS0+Y21kLCAwLCBzaXplb2YocnEtPmNtZCkpOworCXJxLT5mbGFncyB8PSBSRVFfQkxPQ0tfUEM7CisJcnEtPnRpbWVvdXQgPSBTRF9USU1FT1VUOworCXJxLT5jbWRbMF0gPSBTWU5DSFJPTklaRV9DQUNIRTsKK30KKworVGhlIGZvbGxvd2luZyBzZXZlbiBvcmRlcmVkIG1vZGVzIGFyZSBzdXBwb3J0ZWQuICBUaGUgZm9sbG93aW5nIHRhYmxlCitzaG93cyB3aGljaCBtb2RlIHNob3VsZCBiZSB1c2VkIGRlcGVuZGluZyBvbiB3aGF0IGZlYXR1cmVzIGEKK2RldmljZS9kcml2ZXIgc3VwcG9ydHMuICBJbiB0aGUgbGVmdG1vc3QgY29sdW1uIG9mIHRhYmxlLAorUVVFVUVfT1JERVJFRF8gcHJlZml4IGlzIG9taXR0ZWQgZnJvbSB0aGUgbW9kZSBuYW1lcyB0byBzYXZlIHNwYWNlLgorCitUaGUgdGFibGUgaXMgZm9sbG93ZWQgYnkgZGVzY3JpcHRpb24gb2YgZWFjaCBtb2RlLiAgTm90ZSB0aGF0IGluIHRoZQorZGVzY3JpcHRpb25zIG9mIFFVRVVFX09SREVSRURfRFJBSU4qLCAnPT4nIGlzIHVzZWQgd2hlcmVhcyAnLT4nIGlzCit1c2VkIGZvciBRVUVVRV9PUkRFUkVEX1RBRyogZGVzY3JpcHRpb25zLiAgJz0+JyBpbmRpY2F0ZXMgdGhhdCB0aGUKK3ByZWNlZGluZyBzdGVwIG11c3QgYmUgY29tcGxldGUgYmVmb3JlIHByb2NlZWRpbmcgdG8gdGhlIG5leHQgc3RlcC4KKyctPicgaW5kaWNhdGVzIHRoYXQgdGhlIG5leHQgc3RlcCBjYW4gc3RhcnQgYXMgc29vbiBhcyB0aGUgcHJldmlvdXMKK3N0ZXAgaXMgaXNzdWVkLgorCisJICAgIHdyaXRlLWJhY2sgY2FjaGUJb3JkZXJlZCB0YWcJZmx1c2gJCUZVQQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK05PTkUJCXllcy9ubwkJTi9BCQlubwkJTi9BCitEUkFJTgkJbm8JCW5vCQlOL0EJCU4vQQorRFJBSU5fRkxVU0gJeWVzCQlubwkJeWVzCQlubworRFJBSU5fRlVBCXllcwkJbm8JCXllcwkJeWVzCitUQUcJCW5vCQl5ZXMJCU4vQQkJTi9BCitUQUdfRkxVU0gJeWVzCQl5ZXMJCXllcwkJbm8KK1RBR19GVUEJCXllcwkJeWVzCQl5ZXMJCXllcworCisKK1FVRVVFX09SREVSRURfTk9ORQorCUkvTyBiYXJyaWVycyBhcmUgbm90IG5lZWRlZCBhbmQvb3Igc3VwcG9ydGVkLgorCisJU2VxdWVuY2U6IE4vQQorCitRVUVVRV9PUkRFUkVEX0RSQUlOCisJUmVxdWVzdHMgYXJlIG9yZGVyZWQgYnkgZHJhaW5pbmcgdGhlIHJlcXVlc3QgcXVldWUgYW5kIGNhY2hlCisJZmx1c2hpbmcgaXNuJ3QgbmVlZGVkLgorCisJU2VxdWVuY2U6IGRyYWluID0+IGJhcnJpZXIKKworUVVFVUVfT1JERVJFRF9EUkFJTl9GTFVTSAorCVJlcXVlc3RzIGFyZSBvcmRlcmVkIGJ5IGRyYWluaW5nIHRoZSByZXF1ZXN0IHF1ZXVlIGFuZCBib3RoCisJcHJlLWJhcnJpZXIgYW5kIHBvc3QtYmFycmllciBjYWNoZSBmbHVzaGluZ3MgYXJlIG5lZWRlZC4KKworCVNlcXVlbmNlOiBkcmFpbiA9PiBwcmVmbHVzaCA9PiBiYXJyaWVyID0+IHBvc3RmbHVzaAorCitRVUVVRV9PUkRFUkVEX0RSQUlOX0ZVQQorCVJlcXVlc3RzIGFyZSBvcmRlcmVkIGJ5IGRyYWluaW5nIHRoZSByZXF1ZXN0IHF1ZXVlIGFuZAorCXByZS1iYXJyaWVyIGNhY2hlIGZsdXNoaW5nIGlzIG5lZWRlZC4gIEJ5IHVzaW5nIEZVQSBvbiBiYXJyaWVyCisJcmVxdWVzdCwgcG9zdC1iYXJyaWVyIGZsdXNoaW5nIGNhbiBiZSBza2lwcGVkLgorCisJU2VxdWVuY2U6IGRyYWluID0+IHByZWZsdXNoID0+IGJhcnJpZXIKKworUVVFVUVfT1JERVJFRF9UQUcKKwlSZXF1ZXN0cyBhcmUgb3JkZXJlZCBieSBvcmRlcmVkIHRhZyBhbmQgY2FjaGUgZmx1c2hpbmcgaXNuJ3QKKwluZWVkZWQuCisKKwlTZXF1ZW5jZTogYmFycmllcgorCitRVUVVRV9PUkRFUkVEX1RBR19GTFVTSAorCVJlcXVlc3RzIGFyZSBvcmRlcmVkIGJ5IG9yZGVyZWQgdGFnIGFuZCBib3RoIHByZS1iYXJyaWVyIGFuZAorCXBvc3QtYmFycmllciBjYWNoZSBmbHVzaGluZ3MgYXJlIG5lZWRlZC4KKworCVNlcXVlbmNlOiBwcmVmbHVzaCAtPiBiYXJyaWVyIC0+IHBvc3RmbHVzaAorCitRVUVVRV9PUkRFUkVEX1RBR19GVUEKKwlSZXF1ZXN0cyBhcmUgb3JkZXJlZCBieSBvcmRlcmVkIHRhZyBhbmQgcHJlLWJhcnJpZXIgY2FjaGUKKwlmbHVzaGluZyBpcyBuZWVkZWQuICBCeSB1c2luZyBGVUEgb24gYmFycmllciByZXF1ZXN0LAorCXBvc3QtYmFycmllciBmbHVzaGluZyBjYW4gYmUgc2tpcHBlZC4KKworCVNlcXVlbmNlOiBwcmVmbHVzaCAtPiBiYXJyaWVyCisKKworUmFuZG9tIG5vdGVzL2NhdmVhdHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogU0NTSSBsYXllciBjdXJyZW50bHkgY2FuJ3QgdXNlIFRBRyBvcmRlcmluZyBldmVuIGlmIHRoZSBkcml2ZSwKK2NvbnRyb2xsZXIgYW5kIGRyaXZlciBzdXBwb3J0IGl0LiAgVGhlIHByb2JsZW0gaXMgdGhhdCBTQ1NJIG1pZGxheWVyCityZXF1ZXN0IGRpc3BhdGNoIGZ1bmN0aW9uIGlzIG5vdCBhdG9taWMuICBJdCByZWxlYXNlcyBxdWV1ZSBsb2NrIGFuZAorc3dpdGNoIHRvIFNDU0kgaG9zdCBsb2NrIGR1cmluZyBpc3N1ZSBhbmQgaXQncyBwb3NzaWJsZSBhbmQgbGlrZWx5IHRvCitoYXBwZW4gaW4gdGltZSB0aGF0IHJlcXVlc3RzIGNoYW5nZSB0aGVpciByZWxhdGl2ZSBwb3NpdGlvbnMuICBPbmNlCit0aGlzIHByb2JsZW0gaXMgc29sdmVkLCBUQUcgb3JkZXJpbmcgY2FuIGJlIGVuYWJsZWQuCisKKyogQ3VycmVudGx5LCBubyBtYXR0ZXIgd2hpY2ggb3JkZXJlZCBtb2RlIGlzIHVzZWQsIHRoZXJlIGNhbiBiZSBvbmx5CitvbmUgYmFycmllciByZXF1ZXN0IGluIHByb2dyZXNzLiAgQWxsIEkvTyBiYXJyaWVycyBhcmUgaGVsZCBvZmYgYnkKK2Jsb2NrIGxheWVyIHVudGlsIHRoZSBwcmV2aW91cyBJL08gYmFycmllciBpcyBjb21wbGV0ZS4gIFRoaXMgZG9lc24ndAorbWFrZSBhbnkgZGlmZmVyZW5jZSBmb3IgRFJBSU4gb3JkZXJlZCBkZXZpY2VzLCBidXQsIGZvciBUQUcgb3JkZXJlZAorZGV2aWNlcyB3aXRoIHZlcnkgaGlnaCBjb21tYW5kIGxhdGVuY3ksIHBhc3NpbmcgbXVsdGlwbGUgSS9PIGJhcnJpZXJzCit0byBsb3cgbGV2ZWwgKm1pZ2h0KiBiZSBoZWxwZnVsIGlmIHRoZXkgYXJlIHZlcnkgZnJlcXVlbnQuICBXZWxsLCB0aGlzCitjZXJ0YWlubHkgaXMgYSBub24taXNzdWUuICBJJ20gd3JpdGluZyB0aGlzIGp1c3QgdG8gbWFrZSBjbGVhciB0aGF0IG5vCit0d28gSS9PIGJhcnJpZXIgaXMgZXZlciBwYXNzZWQgdG8gbG93LWxldmVsIGRyaXZlci4KKworKiBDb21wbGV0aW9uIG9yZGVyLiAgUmVxdWVzdHMgaW4gb3JkZXJlZCBzZXF1ZW5jZSBhcmUgaXNzdWVkIGluIG9yZGVyCitidXQgbm90IHJlcXVpcmVkIHRvIGZpbmlzaCBpbiBvcmRlci4gIEJhcnJpZXIgaW1wbGVtZW50YXRpb24gY2FuCitoYW5kbGUgb3V0LW9mLW9yZGVyIGNvbXBsZXRpb24gb2Ygb3JkZXJlZCBzZXF1ZW5jZS4gIElPVywgdGhlIHJlcXVlc3RzCitNVVNUIGJlIHByb2Nlc3NlZCBpbiBvcmRlciBidXQgdGhlIGhhcmR3YXJlL3NvZnR3YXJlIGNvbXBsZXRpb24gcGF0aHMKK2FyZSBhbGxvd2VkIHRvIHJlb3JkZXIgY29tcGxldGlvbiBub3RpZmljYXRpb25zIC0gZWcuIGN1cnJlbnQgU0NTSQorbWlkbGF5ZXIgZG9lc24ndCBwcmVzZXJ2ZSBjb21wbGV0aW9uIG9yZGVyIGR1cmluZyBlcnJvciBoYW5kbGluZy4KKworKiBSZXF1ZXVlaW5nIG9yZGVyLiAgTG93LWxldmVsIGRyaXZlcnMgYXJlIGZyZWUgdG8gcmVxdWV1ZSBhbnkgcmVxdWVzdAorYWZ0ZXIgdGhleSByZW1vdmVkIGl0IGZyb20gdGhlIHJlcXVlc3QgcXVldWUgd2l0aAorYmxrZGV2X2RlcXVldWVfcmVxdWVzdCgpLiAgQXMgYmFycmllciBzZXF1ZW5jZSBzaG91bGQgYmUga2VwdCBpbiBvcmRlcgord2hlbiByZXF1ZXVlZCwgZ2VuZXJpYyBlbGV2YXRvciBjb2RlIHRha2VzIGNhcmUgb2YgcHV0dGluZyByZXF1ZXN0cyBpbgorb3JkZXIgYXJvdW5kIGJhcnJpZXIuICBTZWUgYmxrX29yZGVyZWRfcmVxX3NlcSgpIGFuZAorRUxFVkFUT1JfSU5TRVJUX1JFUVVFVUUgaGFuZGxpbmcgaW4gX19lbHZfYWRkX3JlcXVlc3QoKSBmb3IgZGV0YWlscy4KKworTm90ZSB0aGF0IGJsb2NrIGRyaXZlcnMgbXVzdCBub3QgcmVxdWV1ZSBwcmVjZWRpbmcgcmVxdWVzdHMgd2hpbGUKK2NvbXBsZXRpbmcgbGF0dGVyIHJlcXVlc3RzIGluIGFuIG9yZGVyZWQgc2VxdWVuY2UuICBDdXJyZW50bHksIG5vCitlcnJvciBjaGVja2luZyBpcyBkb25lIGFnYWluc3QgdGhpcy4KKworKiBFcnJvciBoYW5kbGluZy4gIEN1cnJlbnRseSwgYmxvY2sgbGF5ZXIgd2lsbCByZXBvcnQgZXJyb3IgdG8gdXBwZXIKK2xheWVyIGlmIGFueSBvZiByZXF1ZXN0cyBpbiBhbiBvcmRlcmVkIHNlcXVlbmNlIGZhaWxzLiAgVW5mb3J0dW5hdGVseSwKK3RoaXMgZG9lc24ndCBzZWVtIHRvIGJlIGVub3VnaC4gIExvb2sgYXQgdGhlIGZvbGxvd2luZyByZXF1ZXN0IGZsb3cuCitRVUVVRV9PUkRFUkVEX1RBR19GTFVTSCBpcyBpbiB1c2UuCisKKyBbMF0gWzFdIFsyXSBbM10gW3ByZV0gW2JhcnJpZXJdIFtwb3N0XSA8IFs0XSBbNV0gWzZdIC4uLiA+CisJCQkJCSAgc3RpbGwgaW4gZWxldmF0b3IKKworTGV0J3Mgc2F5IHJlcXVlc3QgWzJdLCBbM10gYXJlIHdyaXRlIHJlcXVlc3RzIHRvIHVwZGF0ZSBmaWxlIHN5c3RlbQorbWV0YWRhdGEgKGpvdXJuYWwgb3Igd2hhdGV2ZXIpIGFuZCBbYmFycmllcl0gaXMgdXNlZCB0byBtYXJrIHRoYXQKK3Rob3NlIHVwZGF0ZXMgYXJlIHZhbGlkLiAgQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZS4KKworIGkuCVJlcXVlc3RzIFswXSB+IFtwb3N0XSBsZWF2ZXMgdGhlIHJlcXVlc3QgcXVldWUgYW5kIGVudGVycworCWxvdy1sZXZlbCBkcml2ZXIuCisgaWkuCUFmdGVyIGEgd2hpbGUsIHVuZm9ydHVuYXRlbHksIHNvbWV0aGluZyBnb2VzIHdyb25nIGFuZCB0aGUKKwlkcml2ZSBmYWlscyBbMl0uICBOb3RlIHRoYXQgYW55IG9mIFswXSwgWzFdIGFuZCBbM10gY291bGQgaGF2ZQorCWNvbXBsZXRlZCBieSB0aGlzIHRpbWUsIGJ1dCBbcHJlXSBjb3VsZG4ndCBoYXZlIGJlZW4gZmluaXNoZWQKKwlhcyB0aGUgZHJpdmUgbXVzdCBwcm9jZXNzIGl0IGluIG9yZGVyIGFuZCBpdCBmYWlsZWQgYmVmb3JlCisJcHJvY2Vzc2luZyB0aGF0IGNvbW1hbmQuCisgaWlpLglFcnJvciBoYW5kbGluZyBraWNrcyBpbiBhbmQgZGV0ZXJtaW5lcyB0aGF0IHRoZSBlcnJvciBpcworCXVucmVjb3ZlcmFibGUgYW5kIGZhaWxzIFsyXSwgYW5kIHJlc3VtZXMgb3BlcmF0aW9uLgorIGl2LglbcHJlXSBbYmFycmllcl0gW3Bvc3RdIGdldHMgcHJvY2Vzc2VkLgorIHYuCSpCT09NKiBwb3dlciBmYWlscworCitUaGUgcHJvYmxlbSBoZXJlIGlzIHRoYXQgdGhlIGJhcnJpZXIgcmVxdWVzdCBpcyAqc3VwcG9zZWQqIHRvIGluZGljYXRlCit0aGF0IGZpbGVzeXN0ZW0gdXBkYXRlIHJlcXVlc3RzIFsyXSBhbmQgWzNdIG1hZGUgaXQgc2FmZWx5IHRvIHRoZQorcGh5c2ljYWwgbWVkaXVtIGFuZCwgaWYgdGhlIG1hY2hpbmUgY3Jhc2hlcyBhZnRlciB0aGUgYmFycmllciBpcword3JpdHRlbiwgZmlsZXN5c3RlbSByZWNvdmVyeSBjb2RlIGNhbiBkZXBlbmQgb24gdGhhdC4gIFNhZGx5LCB0aGF0Citpc24ndCB0cnVlIGluIHRoaXMgY2FzZSBhbnltb3JlLiAgSU9XLCB0aGUgc3VjY2VzcyBvZiBhIEkvTyBiYXJyaWVyCitzaG91bGQgYWxzbyBiZSBkZXBlbmRlbnQgb24gc3VjY2VzcyBvZiBzb21lIG9mIHRoZSBwcmVjZWRpbmcgcmVxdWVzdHMsCit3aGVyZSBvbmx5IHVwcGVyIGxheWVyIChmaWxlc3lzdGVtKSBrbm93cyB3aGF0ICdzb21lJyBpcy4KKworVGhpcyBjYW4gYmUgc29sdmVkIGJ5IGltcGxlbWVudGluZyBhIHdheSB0byB0ZWxsIHRoZSBibG9jayBsYXllciB3aGljaAorcmVxdWVzdHMgYWZmZWN0IHRoZSBzdWNjZXNzIG9mIHRoZSBmb2xsb3dpbmcgYmFycmllciByZXF1ZXN0IGFuZAorbWFraW5nIGxvd2VyIGxldmVyIGRyaXZlcnMgdG8gcmVzdW1lIG9wZXJhdGlvbiBvbiBlcnJvciBvbmx5IGFmdGVyCitibG9jayBsYXllciB0ZWxscyBpdCB0byBkbyBzby4KKworQXMgdGhlIHByb2JhYmlsaXR5IG9mIHRoaXMgaGFwcGVuaW5nIGlzIHZlcnkgbG93IGFuZCB0aGUgZHJpdmUgc2hvdWxkCitiZSBmYXVsdHksIGltcGxlbWVudGluZyB0aGUgZml4IGlzIHByb2JhYmx5IGFuIG92ZXJraWxsLiAgQnV0LCBzdGlsbCwKK2l0J3MgdGhlcmUuCisKKyogSW4gcHJldmlvdXMgZHJhZnRzIG9mIGJhcnJpZXIgaW1wbGVtZW50YXRpb24sIHRoZXJlIHdhcyBmYWxsYmFjaworbWVjaGFuaXNtIHN1Y2ggdGhhdCwgaWYgRlVBIG9yIG9yZGVyZWQgVEFHIGZhaWxzLCBsZXNzIGZhbmN5IG9yZGVyZWQKK21vZGUgY2FuIGJlIHNlbGVjdGVkIGFuZCB0aGUgZmFpbGVkIGJhcnJpZXIgcmVxdWVzdCBpcyByZXRyaWVkCithdXRvbWF0aWNhbGx5LiAgVGhlIHJhdGlvbmFsZSBmb3IgdGhpcyBmZWF0dXJlIHdhcyB0aGF0IGFzIEZVQSBpcworcHJldHR5IG5ldyBpbiBBVEEgd29ybGQgYW5kIG9yZGVyZWQgdGFnIHdhcyBuZXZlciB1c2VkIHdpZGVseSwgdGhlcmUKK2NvdWxkIGJlIGRldmljZXMgd2hpY2ggcmVwb3J0IHRvIHN1cHBvcnQgdGhvc2UgZmVhdHVyZXMgYnV0IGNob2tlIHdoZW4KK2FjdHVhbGx5IGdpdmVuIHN1Y2ggcmVxdWVzdHMuCisKKyBUaGlzIHdhcyByZW1vdmVkIGZvciB0d28gcmVhc29ucyAxLiBpdCdzIGFuIG92ZXJraWxsIDIuIGl0J3MKK2ltcG9zc2libGUgdG8gaW1wbGVtZW50IHByb3Blcmx5IHdoZW4gVEFHIG9yZGVyaW5nIGlzIHVzZWQgYXMgbG93CitsZXZlbCBkcml2ZXJzIHJlc3VtZSBhZnRlciBhbiBlcnJvciBhdXRvbWF0aWNhbGx5LiAgSWYgaXQncyBldmVyCituZWVkZWQgYWRkaW5nIGl0IGJhY2sgYW5kIG1vZGlmeWluZyBsb3cgbGV2ZWwgZHJpdmVycyBhY2NvcmRpbmdseQorc2hvdWxkbid0IGJlIGRpZmZpY3VsdC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYmxvY2svc3RhdC50eHQgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrL3N0YXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYmM5NDYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrL3N0YXQudHh0CkBAIC0wLDAgKzEsODIgQEAKK0Jsb2NrIGxheWVyIHN0YXRpc3RpY3MgaW4gL3N5cy9ibG9jay88ZGV2Pi9zdGF0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBjb250ZW50cyBvZiB0aGUgL3N5cy9ibG9jay88ZGV2Pi9zdGF0IGZpbGUuCisKK1RoZSBzdGF0IGZpbGUgcHJvdmlkZXMgc2V2ZXJhbCBzdGF0aXN0aWNzIGFib3V0IHRoZSBzdGF0ZSBvZiBibG9jaworZGV2aWNlIDxkZXY+LgorCitRLiBXaHkgYXJlIHRoZXJlIG11bHRpcGxlIHN0YXRpc3RpY3MgaW4gYSBzaW5nbGUgZmlsZT8gIERvZXNuJ3Qgc3lzZnMKKyAgIG5vcm1hbGx5IGNvbnRhaW4gYSBzaW5nbGUgdmFsdWUgcGVyIGZpbGU/CitBLiBCeSBoYXZpbmcgYSBzaW5nbGUgZmlsZSwgdGhlIGtlcm5lbCBjYW4gZ3VhcmFudGVlIHRoYXQgdGhlIHN0YXRpc3RpY3MKKyAgIHJlcHJlc2VudCBhIGNvbnNpc3RlbnQgc25hcHNob3Qgb2YgdGhlIHN0YXRlIG9mIHRoZSBkZXZpY2UuICBJZiB0aGUKKyAgIHN0YXRpc3RpY3Mgd2VyZSBleHBvcnRlZCBhcyBtdWx0aXBsZSBmaWxlcyBjb250YWluaW5nIG9uZSBzdGF0aXN0aWMKKyAgIGVhY2gsIGl0IHdvdWxkIGJlIGltcG9zc2libGUgdG8gZ3VhcmFudGVlIHRoYXQgYSBzZXQgb2YgcmVhZGluZ3MKKyAgIHJlcHJlc2VudCBhIHNpbmdsZSBwb2ludCBpbiB0aW1lLgorCitUaGUgc3RhdCBmaWxlIGNvbnNpc3RzIG9mIGEgc2luZ2xlIGxpbmUgb2YgdGV4dCBjb250YWluaW5nIDExIGRlY2ltYWwKK3ZhbHVlcyBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4gIFRoZSBmaWVsZHMgYXJlIHN1bW1hcml6ZWQgaW4gdGhlCitmb2xsb3dpbmcgdGFibGUsIGFuZCBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgYmVsb3cuCisKK05hbWUgICAgICAgICAgICB1bml0cyAgICAgICAgIGRlc2NyaXB0aW9uCistLS0tICAgICAgICAgICAgLS0tLS0gICAgICAgICAtLS0tLS0tLS0tLQorcmVhZCBJL09zICAgICAgIHJlcXVlc3RzICAgICAgbnVtYmVyIG9mIHJlYWQgSS9PcyBwcm9jZXNzZWQKK3JlYWQgbWVyZ2VzICAgICByZXF1ZXN0cyAgICAgIG51bWJlciBvZiByZWFkIEkvT3MgbWVyZ2VkIHdpdGggaW4tcXVldWUgSS9PCityZWFkIHNlY3RvcnMgICAgc2VjdG9ycyAgICAgICBudW1iZXIgb2Ygc2VjdG9ycyByZWFkCityZWFkIHRpY2tzICAgICAgbWlsbGlzZWNvbmRzICB0b3RhbCB3YWl0IHRpbWUgZm9yIHJlYWQgcmVxdWVzdHMKK3dyaXRlIEkvT3MgICAgICByZXF1ZXN0cyAgICAgIG51bWJlciBvZiB3cml0ZSBJL09zIHByb2Nlc3NlZAord3JpdGUgbWVyZ2VzICAgIHJlcXVlc3RzICAgICAgbnVtYmVyIG9mIHdyaXRlIEkvT3MgbWVyZ2VkIHdpdGggaW4tcXVldWUgSS9PCit3cml0ZSBzZWN0b3JzICAgc2VjdG9ycyAgICAgICBudW1iZXIgb2Ygc2VjdG9ycyB3cml0dGVuCit3cml0ZSB0aWNrcyAgICAgbWlsbGlzZWNvbmRzICB0b3RhbCB3YWl0IHRpbWUgZm9yIHdyaXRlIHJlcXVlc3RzCitpbl9mbGlnaHQgICAgICAgcmVxdWVzdHMgICAgICBudW1iZXIgb2YgSS9PcyBjdXJyZW50bHkgaW4gZmxpZ2h0Citpb190aWNrcyAgICAgICAgbWlsbGlzZWNvbmRzICB0b3RhbCB0aW1lIHRoaXMgYmxvY2sgZGV2aWNlIGhhcyBiZWVuIGFjdGl2ZQordGltZV9pbl9xdWV1ZSAgIG1pbGxpc2Vjb25kcyAgdG90YWwgd2FpdCB0aW1lIGZvciBhbGwgcmVxdWVzdHMKKworcmVhZCBJL09zLCB3cml0ZSBJL09zCis9PT09PT09PT09PT09PT09PT09PT0KKworVGhlc2UgdmFsdWVzIGluY3JlbWVudCB3aGVuIGFuIEkvTyByZXF1ZXN0IGNvbXBsZXRlcy4KKworcmVhZCBtZXJnZXMsIHdyaXRlIG1lcmdlcworPT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGVzZSB2YWx1ZXMgaW5jcmVtZW50IHdoZW4gYW4gSS9PIHJlcXVlc3QgaXMgbWVyZ2VkIHdpdGggYW4KK2FscmVhZHktcXVldWVkIEkvTyByZXF1ZXN0LgorCityZWFkIHNlY3RvcnMsIHdyaXRlIHNlY3RvcnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGVzZSB2YWx1ZXMgY291bnQgdGhlIG51bWJlciBvZiBzZWN0b3JzIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIHRoaXMKK2Jsb2NrIGRldmljZS4gIFRoZSAic2VjdG9ycyIgaW4gcXVlc3Rpb24gYXJlIHRoZSBzdGFuZGFyZCBVTklYIDUxMi1ieXRlCitzZWN0b3JzLCBub3QgYW55IGRldmljZS0gb3IgZmlsZXN5c3RlbS1zcGVjaWZpYyBibG9jayBzaXplLiAgVGhlCitjb3VudGVycyBhcmUgaW5jcmVtZW50ZWQgd2hlbiB0aGUgSS9PIGNvbXBsZXRlcy4KKworcmVhZCB0aWNrcywgd3JpdGUgdGlja3MKKz09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZXNlIHZhbHVlcyBjb3VudCB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IEkvTyByZXF1ZXN0cyBoYXZlCit3YWl0ZWQgb24gdGhpcyBibG9jayBkZXZpY2UuICBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgSS9PIHJlcXVlc3RzIHdhaXRpbmcsCit0aGVzZSB2YWx1ZXMgd2lsbCBpbmNyZWFzZSBhdCBhIHJhdGUgZ3JlYXRlciB0aGFuIDEwMDAvc2Vjb25kOyBmb3IKK2V4YW1wbGUsIGlmIDYwIHJlYWQgcmVxdWVzdHMgd2FpdCBmb3IgYW4gYXZlcmFnZSBvZiAzMCBtcywgdGhlIHJlYWRfdGlja3MKK2ZpZWxkIHdpbGwgaW5jcmVhc2UgYnkgNjAqMzAgPSAxODAwLgorCitpbl9mbGlnaHQKKz09PT09PT09PQorCitUaGlzIHZhbHVlIGNvdW50cyB0aGUgbnVtYmVyIG9mIEkvTyByZXF1ZXN0cyB0aGF0IGhhdmUgYmVlbiBpc3N1ZWQgdG8KK3RoZSBkZXZpY2UgZHJpdmVyIGJ1dCBoYXZlIG5vdCB5ZXQgY29tcGxldGVkLiAgSXQgZG9lcyBub3QgaW5jbHVkZSBJL08KK3JlcXVlc3RzIHRoYXQgYXJlIGluIHRoZSBxdWV1ZSBidXQgbm90IHlldCBpc3N1ZWQgdG8gdGhlIGRldmljZSBkcml2ZXIuCisKK2lvX3RpY2tzCis9PT09PT09PQorCitUaGlzIHZhbHVlIGNvdW50cyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBkdXJpbmcgd2hpY2ggdGhlIGRldmljZSBoYXMKK2hhZCBJL08gcmVxdWVzdHMgcXVldWVkLgorCit0aW1lX2luX3F1ZXVlCis9PT09PT09PT09PT09CisKK1RoaXMgdmFsdWUgY291bnRzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgSS9PIHJlcXVlc3RzIGhhdmUgd2FpdGVkCitvbiB0aGlzIGJsb2NrIGRldmljZS4gIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBJL08gcmVxdWVzdHMgd2FpdGluZywgdGhpcwordmFsdWUgd2lsbCBpbmNyZWFzZSBhcyB0aGUgcHJvZHVjdCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aW1lcyB0aGUKK251bWJlciBvZiByZXF1ZXN0cyB3YWl0aW5nIChzZWUgInJlYWQgdGlja3MiIGFib3ZlIGZvciBhbiBleGFtcGxlKS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2FjaGV0bGIudHh0IGIvRG9jdW1lbnRhdGlvbi9jYWNoZXRsYi50eHQKaW5kZXggN2ViNzE1ZS4uNGFlNDE4OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jYWNoZXRsYi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jYWNoZXRsYi50eHQKQEAgLTEzNiw3ICsxMzYsNyBAQAogOCkgdm9pZCBsYXp5X21tdV9wcm90X3VwZGF0ZShwdGVfdCBwdGUpCiAJVGhpcyBpbnRlcmZhY2UgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBwcm90ZWN0aW9uIG9uCiAJYW55IHVzZXIgUFRFcyBjaGFuZ2UuICBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBhIG5vdGlmaWNhdGlvbgotCXRvIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlIHRvIHRha2UgYXBwcm9waWF0ZSBhY3Rpb24uCisJdG8gYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGNvZGUgdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24uCiAKIAogTmV4dCwgd2UgaGF2ZSB0aGUgY2FjaGUgZmx1c2hpbmcgaW50ZXJmYWNlcy4gIEluIGdlbmVyYWwsIHdoZW4gTGludXgKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY3B1LWhvdHBsdWcudHh0IGIvRG9jdW1lbnRhdGlvbi9jcHUtaG90cGx1Zy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhjNWQwNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY3B1LWhvdHBsdWcudHh0CkBAIC0wLDAgKzEsMzU3IEBACisJCUNQVSBob3RwbHVnIFN1cHBvcnQgaW4gTGludXgodG0pIEtlcm5lbAorCisJCU1haW50YWluZXJzOgorCQlDUFUgSG90cGx1ZyBDb3JlOgorCQkJUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVzdHljb3JwLmNvbS5hdT4KKwkJCVNyaXZhdHNhIFZhZGRhZ2lyaSA8dmF0c2FAaW4uaWJtLmNvbT4KKwkJaTM4NjoKKwkJCVp3YW5lIE13YWlrYW1ibyA8endhbmVAYXJtLmxpbnV4Lm9yZy51az4KKwkJcHBjNjQ6CisJCQlOYXRoYW4gTHluY2ggPG5hdGhhbmxAYXVzdGluLmlibS5jb20+CisJCQlKb2VsIFNjaG9wcCA8anNjaG9wcEBhdXN0aW4uaWJtLmNvbT4KKwkJaWE2NC94ODZfNjQ6CisJCQlBc2hvayBSYWogPGFzaG9rLnJhakBpbnRlbC5jb20+CisKK0F1dGhvcnM6IEFzaG9rIFJhaiA8YXNob2sucmFqQGludGVsLmNvbT4KK0xvdHMgb2YgZmVlZGJhY2s6IE5hdGhhbiBMeW5jaCA8bmF0aGFubEBhdXN0aW4uaWJtLmNvbT4sCisJICAgICBKb2VsIFNjaG9wcCA8anNjaG9wcEBhdXN0aW4uaWJtLmNvbT4KKworSW50cm9kdWN0aW9uCisKK01vZGVybiBhZHZhbmNlcyBpbiBzeXN0ZW0gYXJjaGl0ZWN0dXJlcyBoYXZlIGludHJvZHVjZWQgYWR2YW5jZWQgZXJyb3IKK3JlcG9ydGluZyBhbmQgY29ycmVjdGlvbiBjYXBhYmlsaXRpZXMgaW4gcHJvY2Vzc29ycy4gQ1BVIGFyY2hpdGVjdHVyZXMgcGVybWl0CitwYXJ0aXRpb25pbmcgc3VwcG9ydCwgd2hlcmUgY29tcHV0ZSByZXNvdXJjZXMgb2YgYSBzaW5nbGUgQ1BVIGNvdWxkIGJlIG1hZGUKK2F2YWlsYWJsZSB0byB2aXJ0dWFsIG1hY2hpbmUgZW52aXJvbm1lbnRzLiBUaGVyZSBhcmUgY291cGxlIE9FTVMgdGhhdAorc3VwcG9ydCBOVU1BIGhhcmR3YXJlIHdoaWNoIGFyZSBob3QgcGx1Z2dhYmxlIGFzIHdlbGwsIHdoZXJlIHBoeXNpY2FsCitub2RlIGluc2VydGlvbiBhbmQgcmVtb3ZhbCByZXF1aXJlIHN1cHBvcnQgZm9yIENQVSBob3RwbHVnLgorCitTdWNoIGFkdmFuY2VzIHJlcXVpcmUgQ1BVcyBhdmFpbGFibGUgdG8gYSBrZXJuZWwgdG8gYmUgcmVtb3ZlZCBlaXRoZXIgZm9yCitwcm92aXNpb25pbmcgcmVhc29ucywgb3IgZm9yIFJBUyBwdXJwb3NlcyB0byBrZWVwIGFuIG9mZmVuZGluZyBDUFUgb2ZmCitzeXN0ZW0gZXhlY3V0aW9uIHBhdGguIEhlbmNlIHRoZSBuZWVkIGZvciBDUFUgaG90cGx1ZyBzdXBwb3J0IGluIHRoZQorTGludXgga2VybmVsLgorCitBIG1vcmUgbm92ZWwgdXNlIG9mIENQVS1ob3RwbHVnIHN1cHBvcnQgaXMgaXRzIHVzZSB0b2RheSBpbiBzdXNwZW5kCityZXN1bWUgc3VwcG9ydCBmb3IgU01QLiBEdWFsLWNvcmUgYW5kIEhUIHN1cHBvcnQgbWFrZXMgZXZlbgorYSBsYXB0b3AgcnVuIFNNUCBrZXJuZWxzIHdoaWNoIGRpZG4ndCBzdXBwb3J0IHRoZXNlIG1ldGhvZHMuIFNNUCBzdXBwb3J0Citmb3Igc3VzcGVuZC9yZXN1bWUgaXMgYSB3b3JrIGluIHByb2dyZXNzLgorCitHZW5lcmFsIFN0dWZmIGFib3V0IENQVSBIb3RwbHVnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDb21tYW5kIExpbmUgU3dpdGNoZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbWF4Y3B1cz1uICAgIFJlc3RyaWN0IGJvb3QgdGltZSBjcHVzIHRvIG4uIFNheSBpZiB5b3UgaGF2ZSA0IGNwdXMsIHVzaW5nCisgICAgICAgICAgICAgbWF4Y3B1cz0yIHdpbGwgb25seSBib290IDIuIFlvdSBjYW4gY2hvb3NlIHRvIGJyaW5nIHRoZQorICAgICAgICAgICAgIG90aGVyIGNwdXMgbGF0ZXIgb25saW5lLCByZWFkIEZBUSdzIGZvciBtb3JlIGluZm8uCisKK2FkZGl0aW9uYWxfY3B1cz1uCVt4ODZfNjQgb25seV0gdXNlIHRoaXMgdG8gbGltaXQgaG90cGx1Z2dhYmxlIGNwdXMuCisgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBzZXRzCisJCQljcHVfcG9zc2libGVfbWFwID0gY3B1X3ByZXNlbnRfbWFwICsgYWRkaXRpb25hbF9jcHVzCisKK0NQVSBtYXBzIGFuZCBzdWNoCistLS0tLS0tLS0tLS0tLS0tLQorW01vcmUgb24gY3B1bWFwcyBhbmQgcHJpbWl0aXZlIHRvIG1hbmlwdWxhdGUsIHBsZWFzZSBjaGVjaworaW5jbHVkZS9saW51eC9jcHVtYXNrLmggdGhhdCBoYXMgbW9yZSBkZXNjcmlwdGl2ZSB0ZXh0Ll0KKworY3B1X3Bvc3NpYmxlX21hcDogQml0bWFwIG9mIHBvc3NpYmxlIENQVXMgdGhhdCBjYW4gZXZlciBiZSBhdmFpbGFibGUgaW4gdGhlCitzeXN0ZW0uIFRoaXMgaXMgdXNlZCB0byBhbGxvY2F0ZSBzb21lIGJvb3QgdGltZSBtZW1vcnkgZm9yIHBlcl9jcHUgdmFyaWFibGVzCit0aGF0IGFyZW4ndCBkZXNpZ25lZCB0byBncm93L3NocmluayBhcyBDUFVzIGFyZSBtYWRlIGF2YWlsYWJsZSBvciByZW1vdmVkLgorT25jZSBzZXQgZHVyaW5nIGJvb3QgdGltZSBkaXNjb3ZlcnkgcGhhc2UsIHRoZSBtYXAgaXMgc3RhdGljLCBpLmUgbm8gYml0cworYXJlIGFkZGVkIG9yIHJlbW92ZWQgYW55dGltZS4gIFRyaW1taW5nIGl0IGFjY3VyYXRlbHkgZm9yIHlvdXIgc3lzdGVtIG5lZWRzCit1cGZyb250IGNhbiBzYXZlIHNvbWUgYm9vdCB0aW1lIG1lbW9yeS4gU2VlIGJlbG93IGZvciBob3cgd2UgdXNlIGhldXJpc3RpY3MKK2luIHg4Nl82NCBjYXNlIHRvIGtlZXAgdGhpcyB1bmRlciBjaGVjay4KKworY3B1X29ubGluZV9tYXA6IEJpdG1hcCBvZiBhbGwgQ1BVcyBjdXJyZW50bHkgb25saW5lLiBJdHMgc2V0IGluIF9fY3B1X3VwKCkKK2FmdGVyIGEgY3B1IGlzIGF2YWlsYWJsZSBmb3Iga2VybmVsIHNjaGVkdWxpbmcgYW5kIHJlYWR5IHRvIHJlY2VpdmUKK2ludGVycnVwdHMgZnJvbSBkZXZpY2VzLiBJdHMgY2xlYXJlZCB3aGVuIGEgY3B1IGlzIGJyb3VnaHQgZG93biB1c2luZworX19jcHVfZGlzYWJsZSgpLCBiZWZvcmUgd2hpY2ggYWxsIE9TIHNlcnZpY2VzIGluY2x1ZGluZyBpbnRlcnJ1cHRzIGFyZQorbWlncmF0ZWQgdG8gYW5vdGhlciB0YXJnZXQgQ1BVLgorCitjcHVfcHJlc2VudF9tYXA6IEJpdG1hcCBvZiBDUFVzIGN1cnJlbnRseSBwcmVzZW50IGluIHRoZSBzeXN0ZW0uIE5vdCBhbGwKK29mIHRoZW0gbWF5IGJlIG9ubGluZS4gV2hlbiBwaHlzaWNhbCBob3RwbHVnIGlzIHByb2Nlc3NlZCBieSB0aGUgcmVsZXZhbnQKK3N1YnN5c3RlbSAoZS5nIEFDUEkpIGNhbiBjaGFuZ2UgYW5kIG5ldyBiaXQgZWl0aGVyIGJlIGFkZGVkIG9yIHJlbW92ZWQKK2Zyb20gdGhlIG1hcCBkZXBlbmRpbmcgb24gdGhlIGV2ZW50IGlzIGhvdC1hZGQvaG90LXJlbW92ZS4gVGhlcmUgYXJlIGN1cnJlbnRseQorbm8gbG9ja2luZyBydWxlcyBhcyBvZiBub3cuIFR5cGljYWwgdXNhZ2UgaXMgdG8gaW5pdCB0b3BvbG9neSBkdXJpbmcgYm9vdCwKK2F0IHdoaWNoIHRpbWUgaG90cGx1ZyBpcyBkaXNhYmxlZC4KKworWW91IHJlYWxseSBkb250IG5lZWQgdG8gbWFuaXB1bGF0ZSBhbnkgb2YgdGhlIHN5c3RlbSBjcHUgbWFwcy4gVGhleSBzaG91bGQKK2JlIHJlYWQtb25seSBmb3IgbW9zdCB1c2UuIFdoZW4gc2V0dGluZyB1cCBwZXItY3B1IHJlc291cmNlcyBhbG1vc3QgYWx3YXlzIHVzZQorY3B1X3Bvc3NpYmxlX21hcC9mb3JfZWFjaF9jcHUoKSB0byBpdGVyYXRlLgorCitOZXZlciB1c2UgYW55dGhpbmcgb3RoZXIgdGhhbiBjcHVtYXNrX3QgdG8gcmVwcmVzZW50IGJpdG1hcCBvZiBDUFVzLgorCisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorCitmb3JfZWFjaF9jcHUgICAgICAgICAgICAgIC0gSXRlcmF0ZSBvdmVyIGNwdV9wb3NzaWJsZV9tYXAKK2Zvcl9lYWNoX29ubGluZV9jcHUgICAgICAgLSBJdGVyYXRlIG92ZXIgY3B1X29ubGluZV9tYXAKK2Zvcl9lYWNoX3ByZXNlbnRfY3B1ICAgICAgLSBJdGVyYXRlIG92ZXIgY3B1X3ByZXNlbnRfbWFwCitmb3JfZWFjaF9jcHVfbWFzayh4LG1hc2spIC0gSXRlcmF0ZSBvdmVyIHNvbWUgcmFuZG9tIGNvbGxlY3Rpb24gb2YgY3B1IG1hc2suCisKKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KK2xvY2tfY3B1X2hvdHBsdWcoKSBhbmQgdW5sb2NrX2NwdV9ob3RwbHVnKCk6CisKK1RoZSBhYm92ZSBjYWxscyBhcmUgdXNlZCB0byBpbmhpYml0IGNwdSBob3RwbHVnIG9wZXJhdGlvbnMuIFdoaWxlIGhvbGRpbmcgdGhlCitjcHVjb250cm9sIG11dGV4LCBjcHVfb25saW5lX21hcCB3aWxsIG5vdCBjaGFuZ2UuIElmIHlvdSBtZXJlbHkgbmVlZCB0byBhdm9pZAorY3B1cyBnb2luZyBhd2F5LCB5b3UgY291bGQgYWxzbyB1c2UgcHJlZW1wdF9kaXNhYmxlKCkgYW5kIHByZWVtcHRfZW5hYmxlKCkKK2ZvciB0aG9zZSBzZWN0aW9ucy4gSnVzdCByZW1lbWJlciB0aGUgY3JpdGljYWwgc2VjdGlvbiBjYW5ub3QgY2FsbCBhbnkKK2Z1bmN0aW9uIHRoYXQgY2FuIHNsZWVwIG9yIHNjaGVkdWxlIHRoaXMgcHJvY2VzcyBhd2F5LiBUaGUgcHJlZW1wdF9kaXNhYmxlKCkKK3dpbGwgd29yayBhcyBsb25nIGFzIHN0b3BfbWFjaGluZV9ydW4oKSBpcyB1c2VkIHRvIHRha2UgYSBjcHUgZG93bi4KKworQ1BVIEhvdHBsdWcgLSBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucy4KKworUTogSG93IHRvIGkgZW5hYmxlIG15IGtlcm5lbCB0byBzdXBwb3J0IENQVSBob3RwbHVnPworQTogV2hlbiBkb2luZyBtYWtlIGRlZmNvbmZpZywgRW5hYmxlIENQVSBob3RwbHVnIHN1cHBvcnQKKworICAgIlByb2Nlc3NvciB0eXBlIGFuZCBGZWF0dXJlcyIgLT4gU3VwcG9ydCBmb3IgSG90cGx1Z2dhYmxlIENQVXMKKworTWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgQ09ORklHX0hPVFBMVUcsIGFuZCBDT05GSUdfU01QIHR1cm5lZCBvbiBhcyB3ZWxsLgorCitZb3Ugd291bGQgbmVlZCB0byBlbmFibGUgQ09ORklHX0hPVFBMVUdfQ1BVIGZvciBTTVAgc3VzcGVuZC9yZXN1bWUgc3VwcG9ydAorYXMgd2VsbC4KKworUTogV2hhdCBhcmNoaXRlY3R1cmVzIHN1cHBvcnQgQ1BVIGhvdHBsdWc/CitBOiBBcyBvZiAyLjYuMTQsIHRoZSBmb2xsb3dpbmcgYXJjaGl0ZWN0dXJlcyBzdXBwb3J0IENQVSBob3RwbHVnLgorCitpMzg2IChJbnRlbCksIHBwYywgcHBjNjQsIHBhcmlzYywgczM5MCwgaWE2NCBhbmQgeDg2XzY0CisKK1E6IEhvdyB0byB0ZXN0IGlmIGhvdHBsdWcgaXMgc3VwcG9ydGVkIG9uIHRoZSBuZXdseSBidWlsdCBrZXJuZWw/CitBOiBZb3Ugc2hvdWxkIG5vdyBub3RpY2UgYW4gZW50cnkgaW4gc3lzZnMuCisKK0NoZWNrIGlmIHN5c2ZzIGlzIG1vdW50ZWQsIHVzaW5nIHRoZSAibW91bnQiIGNvbW1hbmQuIFlvdSBzaG91bGQgbm90aWNlCithbiBlbnRyeSBhcyBzaG93biBiZWxvdyBpbiB0aGUgb3V0cHV0LgorCisuLi4uCitub25lIG9uIC9zeXMgdHlwZSBzeXNmcyAocncpCisuLi4uCisKK2lmIHRoaXMgaXMgbm90IG1vdW50ZWQsIGRvIHRoZSBmb2xsb3dpbmcuCisKKyNta2RpciAvc3lzZnMKKyNtb3VudCAtdCBzeXNmcyBzeXMgL3N5cworCitub3cgeW91IHNob3VsZCBzZWUgZW50cmllcyBmb3IgYWxsIHByZXNlbnQgY3B1LCB0aGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUKK2luIGEgOC13YXkgc3lzdGVtLgorCisjcHdkCisjL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUKKyNscyAtbAordG90YWwgMAorZHJ3eHIteHIteCAgMTAgcm9vdCByb290IDAgU2VwIDE5IDA3OjQ0IC4KK2Ryd3hyLXhyLXggIDEzIHJvb3Qgcm9vdCAwIFNlcCAxOSAwNzo0NSAuLgorZHJ3eHIteHIteCAgIDMgcm9vdCByb290IDAgU2VwIDE5IDA3OjQ0IGNwdTAKK2Ryd3hyLXhyLXggICAzIHJvb3Qgcm9vdCAwIFNlcCAxOSAwNzo0NCBjcHUxCitkcnd4ci14ci14ICAgMyByb290IHJvb3QgMCBTZXAgMTkgMDc6NDQgY3B1MgorZHJ3eHIteHIteCAgIDMgcm9vdCByb290IDAgU2VwIDE5IDA3OjQ0IGNwdTMKK2Ryd3hyLXhyLXggICAzIHJvb3Qgcm9vdCAwIFNlcCAxOSAwNzo0NCBjcHU0Citkcnd4ci14ci14ICAgMyByb290IHJvb3QgMCBTZXAgMTkgMDc6NDQgY3B1NQorZHJ3eHIteHIteCAgIDMgcm9vdCByb290IDAgU2VwIDE5IDA3OjQ0IGNwdTYKK2Ryd3hyLXhyLXggICAzIHJvb3Qgcm9vdCAwIFNlcCAxOSAwNzo0OCBjcHU3CisKK1VuZGVyIGVhY2ggZGlyZWN0b3J5IHlvdSB3b3VsZCBmaW5kIGFuICJvbmxpbmUiIGZpbGUgd2hpY2ggaXMgdGhlIGNvbnRyb2wKK2ZpbGUgdG8gbG9naWNhbGx5IG9ubGluZS9vZmZsaW5lIGEgcHJvY2Vzc29yLgorCitROiBEb2VzIGhvdC1hZGQvaG90LXJlbW92ZSByZWZlciB0byBwaHlzaWNhbCBhZGQvcmVtb3ZlIG9mIGNwdXM/CitBOiBUaGUgdXNhZ2Ugb2YgaG90LWFkZC9yZW1vdmUgbWF5IG5vdCBiZSB2ZXJ5IGNvbnNpc3RlbnRseSB1c2VkIGluIHRoZSBjb2RlLgorQ09ORklHX0NQVV9IT1RQTFVHIGVuYWJsZXMgbG9naWNhbCBvbmxpbmUvb2ZmbGluZSBjYXBhYmlsaXR5IGluIHRoZSBrZXJuZWwuCitUbyBzdXBwb3J0IHBoeXNpY2FsIGFkZGl0aW9uL3JlbW92YWwsIG9uZSB3b3VsZCBuZWVkIHNvbWUgQklPUyBob29rcyBhbmQKK3RoZSBwbGF0Zm9ybSBzaG91bGQgaGF2ZSBzb21ldGhpbmcgbGlrZSBhbiBhdHRlbnRpb24gYnV0dG9uIGluIFBDSSBob3RwbHVnLgorQ09ORklHX0FDUElfSE9UUExVR19DUFUgZW5hYmxlcyBBQ1BJIHN1cHBvcnQgZm9yIHBoeXNpY2FsIGFkZC9yZW1vdmUgb2YgQ1BVcy4KKworUTogSG93IGRvIGkgbG9naWNhbGx5IG9mZmxpbmUgYSBDUFU/CitBOiBEbyB0aGUgZm9sbG93aW5nLgorCisjZWNobyAwID4gL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1WC9vbmxpbmUKKworb25jZSB0aGUgbG9naWNhbCBvZmZsaW5lIGlzIHN1Y2Nlc3NmdWwsIGNoZWNrCisKKyNjYXQgL3Byb2MvaW50ZXJydXB0cworCit5b3Ugc2hvdWxkIG5vdyBub3Qgc2VlIHRoZSBDUFUgdGhhdCB5b3UgcmVtb3ZlZC4gQWxzbyBvbmxpbmUgZmlsZSB3aWxsIHJlcG9ydAordGhlIHN0YXRlIGFzIDAgd2hlbiBhIGNwdSBpZiBvZmZsaW5lIGFuZCAxIHdoZW4gaXRzIG9ubGluZS4KKworI1RvIGRpc3BsYXkgdGhlIGN1cnJlbnQgY3B1IHN0YXRlLgorI2NhdCAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHVYL29ubGluZQorCitROiBXaHkgY2FudCBpIHJlbW92ZSBDUFUwIG9uIHNvbWUgc3lzdGVtcz8KK0E6IFNvbWUgYXJjaGl0ZWN0dXJlcyBtYXkgaGF2ZSBzb21lIHNwZWNpYWwgZGVwZW5kZW5jeSBvbiBhIGNlcnRhaW4gQ1BVLgorCitGb3IgZS5nIGluIElBNjQgcGxhdGZvcm1zIHdlIGhhdmUgYWJpbGl0eSB0byBzZW50IHBsYXRmb3JtIGludGVycnVwdHMgdG8gdGhlCitPUy4gYS5rLmEgQ29ycmVjdGVkIFBsYXRmb3JtIEVycm9yIEludGVycnVwdHMgKENQRUkpLiBJbiBjdXJyZW50IEFDUEkKK3NwZWNpZmljYXRpb25zLCB3ZSBkaWRuJ3QgaGF2ZSBhIHdheSB0byBjaGFuZ2UgdGhlIHRhcmdldCBDUFUuIEhlbmNlIGlmIHRoZQorY3VycmVudCBBQ1BJIHZlcnNpb24gZG9lc24ndCBzdXBwb3J0IHN1Y2ggcmUtZGlyZWN0aW9uLCB3ZSBkaXNhYmxlIHRoYXQgQ1BVCitieSBtYWtpbmcgaXQgbm90LXJlbW92YWJsZS4KKworSW4gc3VjaCBjYXNlcyB5b3Ugd2lsbCBhbHNvIG5vdGljZSB0aGF0IHRoZSBvbmxpbmUgZmlsZSBpcyBtaXNzaW5nIHVuZGVyIGNwdTAuCisKK1E6IEhvdyBkbyBpIGZpbmQgb3V0IGlmIGEgcGFydGljdWxhciBDUFUgaXMgbm90IHJlbW92YWJsZT8KK0E6IERlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24sIHNvbWUgYXJjaGl0ZWN0dXJlcyBtYXkgc2hvdyB0aGlzIGJ5IHRoZQorYWJzZW5jZSBvZiB0aGUgIm9ubGluZSIgZmlsZS4gVGhpcyBpcyBkb25lIGlmIGl0IGNhbiBiZSBkZXRlcm1pbmVkIGFoZWFkIG9mCit0aW1lIHRoYXQgdGhpcyBDUFUgY2Fubm90IGJlIHJlbW92ZWQuCisKK0luIHNvbWUgc2l0dWF0aW9ucywgdGhpcyBjYW4gYmUgYSBydW4gdGltZSBjaGVjaywgaS5lIGlmIHlvdSB0cnkgdG8gcmVtb3ZlIHRoZQorbGFzdCBDUFUsIHRoaXMgd2lsbCBub3QgYmUgcGVybWl0dGVkLiBZb3UgY2FuIGZpbmQgc3VjaCBmYWlsdXJlcyBieQoraW52ZXN0aWdhdGluZyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSAiZWNobyIgY29tbWFuZC4KKworUTogV2hhdCBoYXBwZW5zIHdoZW4gYSBDUFUgaXMgYmVpbmcgbG9naWNhbGx5IG9mZmxpbmVkPworQTogVGhlIGZvbGxvd2luZyBoYXBwZW4sIGxpc3RlZCBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyIDotKQorCistIEEgbm90aWZpY2F0aW9uIGlzIHNlbnQgdG8gaW4ta2VybmVsIHJlZ2lzdGVyZWQgbW9kdWxlcyBieSBzZW5kaW5nIGFuIGV2ZW50CisgIENQVV9ET1dOX1BSRVBBUkUKKy0gQWxsIHByb2Nlc3MgaXMgbWlncmF0ZWQgYXdheSBmcm9tIHRoaXMgb3V0Z29pbmcgQ1BVIHRvIGEgbmV3IENQVQorLSBBbGwgaW50ZXJydXB0cyB0YXJnZXRlZCB0byB0aGlzIENQVSBpcyBtaWdyYXRlZCB0byBhIG5ldyBDUFUKKy0gdGltZXJzL2JvdHRvbSBoYWxmL3Rhc2sgbGV0cyBhcmUgYWxzbyBtaWdyYXRlZCB0byBhIG5ldyBDUFUKKy0gT25jZSBhbGwgc2VydmljZXMgYXJlIG1pZ3JhdGVkLCBrZXJuZWwgY2FsbHMgYW4gYXJjaCBzcGVjaWZpYyByb3V0aW5lCisgIF9fY3B1X2Rpc2FibGUoKSB0byBwZXJmb3JtIGFyY2ggc3BlY2lmaWMgY2xlYW51cC4KKy0gT25jZSB0aGlzIGlzIHN1Y2Nlc3NmdWwsIGFuIGV2ZW50IGZvciBzdWNjZXNzZnVsIGNsZWFudXAgaXMgc2VudCBieSBhbiBldmVudAorICBDUFVfREVBRC4KKworICAiSXQgaXMgZXhwZWN0ZWQgdGhhdCBlYWNoIHNlcnZpY2UgY2xlYW5zIHVwIHdoZW4gdGhlIENQVV9ET1dOX1BSRVBBUkUKKyAgbm90aWZpZXIgaXMgY2FsbGVkLCB3aGVuIENQVV9ERUFEIGlzIGNhbGxlZCBpdHMgZXhwZWN0ZWQgdGhlcmUgaXMgbm90aGluZworICBydW5uaW5nIG9uIGJlaGFsZiBvZiB0aGlzIENQVSB0aGF0IHdhcyBvZmZsaW5lZCIKKworUTogSWYgaSBoYXZlIHNvbWUga2VybmVsIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBhd2FyZSBvZiBDUFUgYXJyaXZhbCBhbmQKKyAgIGRlcGFydHVyZSwgaG93IHRvIGkgYXJyYW5nZSBmb3IgcHJvcGVyIG5vdGlmaWNhdGlvbj8KK0E6IFRoaXMgaXMgd2hhdCB5b3Ugd291bGQgbmVlZCBpbiB5b3VyIGtlcm5lbCBjb2RlIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy4KKworICAgICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyAgICBzdGF0aWMgaW50IF9fY3B1aW5pdCBmb29iYXJfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCisJeworCQl1bnNpZ25lZCBpbnQgY3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKKworCQlzd2l0Y2ggKGFjdGlvbikgeworCQljYXNlIENQVV9PTkxJTkU6CisJCQlmb29iYXJfb25saW5lX2FjdGlvbihjcHUpOworCQkJYnJlYWs7CisJCWNhc2UgQ1BVX0RFQUQ6CisJCQlmb29iYXJfZGVhZF9hY3Rpb24oY3B1KTsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiBOT1RJRllfT0s7CisJfQorCisJc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBmb29iYXJfY3B1X25vdGlmZXIgPQorCXsKKwkgICAubm90aWZpZXJfY2FsbCA9IGZvb2Jhcl9jcHVfY2FsbGJhY2ssCisJfTsKKworCitJbiB5b3VyIGluaXQgZnVuY3Rpb24sCisKKwlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmZvb2Jhcl9jcHVfbm90aWZpZXIpOworCitZb3UgY2FuIGZhaWwgUFJFUEFSRSBub3RpZmllcnMgaWYgc29tZXRoaW5nIGRvZXNuJ3Qgd29yayB0byBwcmVwYXJlIHJlc291cmNlcy4KK1RoaXMgd2lsbCBzdG9wIHRoZSBhY3Rpdml0eSBhbmQgc2VuZCBhIGZvbGxvd2luZyBDQU5DRUxFRCBldmVudCBiYWNrLgorCitDUFVfREVBRCBzaG91bGQgbm90IGJlIGZhaWxlZCwgaXRzIGp1c3QgYSBnb29kbmVzcyBpbmRpY2F0aW9uLCBidXQgYmFkCit0aGluZ3Mgd2lsbCBoYXBwZW4gaWYgYSBub3RpZmllciBpbiBwYXRoIHNlbnQgYSBCQUQgbm90aWZ5IGNvZGUuCisKK1E6IEkgZG9uJ3Qgc2VlIG15IGFjdGlvbiBiZWluZyBjYWxsZWQgZm9yIGFsbCBDUFVzIGFscmVhZHkgdXAgYW5kIHJ1bm5pbmc/CitBOiBZZXMsIENQVSBub3RpZmllcnMgYXJlIGNhbGxlZCBvbmx5IHdoZW4gbmV3IENQVXMgYXJlIG9uLWxpbmVkIG9yIG9mZmxpbmVkLgorICAgSWYgeW91IG5lZWQgdG8gcGVyZm9ybSBzb21lIGFjdGlvbiBmb3IgZWFjaCBjcHUgYWxyZWFkeSBpbiB0aGUgc3lzdGVtLCB0aGVuCisKKyAgZm9yX2VhY2hfb25saW5lX2NwdShpKSB7CisJCWZvb2Jhcl9jcHVfY2FsbGJhY2soJmZvb2Jhcl9jcHVfbm90aWZpZXIsIENQVV9VUF9QUkVQQVJFLCBpKTsKKwkJZm9vYmFyX2NwdV9jYWxsYmFjaygmZm9vYmFyLWNwdV9ub3RpZmllciwgQ1BVX09OTElORSwgaSk7CisgIH0KKworUTogSWYgaSB3b3VsZCBsaWtlIHRvIGRldmVsb3AgY3B1IGhvdHBsdWcgc3VwcG9ydCBmb3IgYSBuZXcgYXJjaGl0ZWN0dXJlLAorICAgd2hhdCBkbyBpIG5lZWQgYXQgYSBtaW5pbXVtPworQTogVGhlIGZvbGxvd2luZyBhcmUgd2hhdCBpcyByZXF1aXJlZCBmb3IgQ1BVIGhvdHBsdWcgaW5mcmFzdHJ1Y3R1cmUgdG8gd29yaworICAgY29ycmVjdGx5LgorCisgICAgLSBNYWtlIHN1cmUgeW91IGhhdmUgYW4gZW50cnkgaW4gS2NvbmZpZyB0byBlbmFibGUgQ09ORklHX0hPVFBMVUdfQ1BVCisgICAgLSBfX2NwdV91cCgpICAgICAgICAtIEFyY2ggaW50ZXJmYWNlIHRvIGJyaW5nIHVwIGEgQ1BVCisgICAgLSBfX2NwdV9kaXNhYmxlKCkgICAtIEFyY2ggaW50ZXJmYWNlIHRvIHNodXRkb3duIGEgQ1BVLCBubyBtb3JlIGludGVycnVwdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGhhbmRsZWQgYnkgdGhlIGtlcm5lbCBhZnRlciB0aGUgcm91dGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zLiBJbmNsdWRpbmcgbG9jYWwgQVBJQyB0aW1lcnMgZXRjIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICBzaHV0ZG93bi4KKyAgICAgLSBfX2NwdV9kaWUoKSAgICAgIC0gVGhpcyBhY3R1YWxseSBzdXBwb3NlZCB0byBlbnN1cmUgZGVhdGggb2YgdGhlIENQVS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0dWFsbHkgbG9vayBhdCBzb21lIGV4YW1wbGUgY29kZSBpbiBvdGhlciBhcmNoCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgaW1wbGVtZW50IENQVSBob3RwbHVnLiBUaGUgcHJvY2Vzc29yIGlzIHRha2VuCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd24gZnJvbSB0aGUgaWRsZSgpIGxvb3AgZm9yIHRoYXQgc3BlY2lmaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGl0ZWN0dXJlLiBfX2NwdV9kaWUoKSB0eXBpY2FsbHkgd2FpdHMgZm9yIHNvbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyX2NwdSBzdGF0ZSB0byBiZSBzZXQsIHRvIGVuc3VyZSB0aGUgcHJvY2Vzc29yCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYWQgcm91dGluZSBpcyBjYWxsZWQgdG8gYmUgc3VyZSBwb3NpdGl2ZWx5LgorCitROiBJIG5lZWQgdG8gZW5zdXJlIHRoYXQgYSBwYXJ0aWN1bGFyIGNwdSBpcyBub3QgcmVtb3ZlZCB3aGVuIHRoZXJlIGlzIHNvbWUKKyAgIHdvcmsgc3BlY2lmaWMgdG8gdGhpcyBjcHUgaXMgaW4gcHJvZ3Jlc3MuCitBOiBGaXJzdCBzd2l0Y2ggdGhlIGN1cnJlbnQgdGhyZWFkIGNvbnRleHQgdG8gcHJlZmVycmVkIGNwdQorCisgICBpbnQgbXlfZnVuY19vbl9jcHUoaW50IGNwdSkKKyAgIHsKKyAgICAgICBjcHVtYXNrX3Qgc2F2ZWRfbWFzaywgbmV3X21hc2sgPSBDUFVfTUFTS19OT05FOworICAgICAgIGludCBjdXJyX2NwdSwgZXJyID0gMDsKKworICAgICAgIHNhdmVkX21hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisgICAgICAgY3B1X3NldChjcHUsIG5ld19tYXNrKTsKKyAgICAgICBlcnIgPSBzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIG5ld19tYXNrKTsKKworICAgICAgIGlmIChlcnIpCisgICAgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAgICAvKgorICAgICAgICAqIElmIHdlIGdvdCBzY2hlZHVsZWQgb3V0IGp1c3QgYWZ0ZXIgdGhlIHJldHVybiBmcm9tCisgICAgICAgICogc2V0X2NwdXNfYWxsb3dlZCgpIGJlZm9yZSBydW5uaW5nIHRoZSB3b3JrLCB0aGlzIGVuc3VyZXMKKyAgICAgICAgKiB3ZSBzdGF5IGxvY2tlZC4KKyAgICAgICAgKi8KKyAgICAgICBjdXJyX2NwdSA9IGdldF9jcHUoKTsKKworICAgICAgIGlmIChjdXJyX2NwdSAhPSBjcHUpIHsKKwkgICBlcnIgPSAtRUFHQUlOOworICAgICAgICAgICBnb3RvIHJldDsKKyAgICAgICB9IGVsc2UgeworICAgICAgIAkgICAvKgorCSAgICAqIERvIHdvcmsgOiBCdXQgY2FudCBzbGVlcCwgc2luY2UgZ2V0X2NwdSgpIGRpc2FibGVzIHByZWVtcHQKKwkgICAgKi8KKyAgICAgICB9CisgICAgcmV0OgorICAgIAlwdXRfY3B1KCk7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBzYXZlZF9tYXNrKTsKKwlyZXR1cm4gZXJyOworICAgIH0KKworCitROiBIb3cgZG8gd2UgZGV0ZXJtaW5lIGhvdyBtYW55IENQVXMgYXJlIGF2YWlsYWJsZSBmb3IgaG90cGx1Zy4KK0E6IFRoZXJlIGlzIG5vIGNsZWFyIHNwZWMgZGVmaW5lZCB3YXkgZnJvbSBBQ1BJIHRoYXQgY2FuIGdpdmUgdXMgdGhhdAorICAgaW5mb3JtYXRpb24gdG9kYXkuIEJhc2VkIG9uIHNvbWUgaW5wdXQgZnJvbSBOYXRhbGllIG9mIFVuaXN5cywKKyAgIHRoYXQgdGhlIEFDUEkgTUFEVCAoTXVsdGlwbGUgQVBJQyBEZXNjcmlwdGlvbiBUYWJsZXMpIG1hcmtzIHRob3NlIHBvc3NpYmxlCisgICBDUFVzIGluIGEgc3lzdGVtIHdpdGggZGlzYWJsZWQgc3RhdHVzLgorCisgICBBbmRpIGltcGxlbWVudGVkIHNvbWUgc2ltcGxlIGhldXJpc3RpY3MgdGhhdCBjb3VudCB0aGUgbnVtYmVyIG9mIGRpc2FibGVkCisgICBDUFVzIGluIE1BRFQgYXMgaG90cGx1Z2dhYmxlIENQVVMuICBJbiB0aGUgY2FzZSB0aGVyZSBhcmUgbm8gZGlzYWJsZWQgQ1BVUworICAgd2UgYXNzdW1lIDEvMiB0aGUgbnVtYmVyIG9mIENQVXMgY3VycmVudGx5IHByZXNlbnQgY2FuIGJlIGhvdHBsdWdnZWQuCisKKyAgIENhdmVhdDogVG9kYXkncyBBQ1BJIE1BRFQgY2FuIG9ubHkgcHJvdmlkZSAyNTYgZW50cmllcyBzaW5jZSB0aGUgYXBpY2lkIGZpZWxkCisgICBpbiBNQURUIGlzIG9ubHkgOCBiaXRzLgorCitVc2VyIFNwYWNlIE5vdGlmaWNhdGlvbgorCitIb3RwbHVnIHN1cHBvcnQgZm9yIGRldmljZXMgaXMgY29tbW9uIGluIExpbnV4IHRvZGF5LiBJdHMgYmVpbmcgdXNlZCB0b2RheSB0bworc3VwcG9ydCBhdXRvbWF0aWMgY29uZmlndXJhdGlvbiBvZiBuZXR3b3JrLCB1c2IgYW5kIHBjaSBkZXZpY2VzLiBBIGhvdHBsdWcKK2V2ZW50IGNhbiBiZSB1c2VkIHRvIGludm9rZSBhbiBhZ2VudCBzY3JpcHQgdG8gcGVyZm9ybSB0aGUgY29uZmlndXJhdGlvbiB0YXNrLgorCitZb3UgY2FuIGFkZCAvZXRjL2hvdHBsdWcvY3B1LmFnZW50IHRvIGhhbmRsZSBob3RwbHVnIG5vdGlmaWNhdGlvbiB1c2VyIHNwYWNlCitzY3JpcHRzLgorCisJIyEvYmluL2Jhc2gKKwkjICRJZDogY3B1LmFnZW50CisJIyBLZXJuZWwgaG90cGx1ZyBwYXJhbXMgaW5jbHVkZToKKwkjQUNUSU9OPSVzIFtvbmxpbmUgb3Igb2ZmbGluZV0KKwkjREVWUEFUSD0lcworCSMKKwljZCAvZXRjL2hvdHBsdWcKKwkuIC4vaG90cGx1Zy5mdW5jdGlvbnMKKworCWNhc2UgJEFDVElPTiBpbgorCQlvbmxpbmUpCisJCQllY2hvIGBkYXRlYCAiOmNwdS5hZ2VudCIgYWRkIGNwdSA+PiAvdG1wL2hvdHBsdWcudHh0CisJCQk7OworCQlvZmZsaW5lKQorCQkJZWNobyBgZGF0ZWAgIjpjcHUuYWdlbnQiIHJlbW92ZSBjcHUgPj4vdG1wL2hvdHBsdWcudHh0CisJCQk7OworCQkqKQorCQkJZGVidWdfbWVzZyBDUFUgJEFDVElPTiBldmVudCBub3Qgc3VwcG9ydGVkCisgICAgICAgIGV4aXQgMQorICAgICAgICA7OworCWVzYWMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY3B1c2V0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2NwdXNldHMudHh0CmluZGV4IGEwOWE4ZWIuLjk5MDk5OGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY3B1c2V0cy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jcHVzZXRzLnR4dApAQCAtMTQsNyArMTQsMTAgQEAKICAgMS4xIFdoYXQgYXJlIGNwdXNldHMgPwogICAxLjIgV2h5IGFyZSBjcHVzZXRzIG5lZWRlZCA/CiAgIDEuMyBIb3cgYXJlIGNwdXNldHMgaW1wbGVtZW50ZWQgPwotICAxLjQgSG93IGRvIEkgdXNlIGNwdXNldHMgPworICAxLjQgV2hhdCBhcmUgZXhjbHVzaXZlIGNwdXNldHMgPworICAxLjUgV2hhdCBkb2VzIG5vdGlmeV9vbl9yZWxlYXNlIGRvID8KKyAgMS42IFdoYXQgaXMgbWVtb3J5X3ByZXNzdXJlID8KKyAgMS43IEhvdyBkbyBJIHVzZSBjcHVzZXRzID8KIDIuIFVzYWdlIEV4YW1wbGVzIGFuZCBTeW50YXgKICAgMi4xIEJhc2ljIFVzYWdlCiAgIDIuMiBBZGRpbmcvcmVtb3ZpbmcgY3B1cwpAQCAtNDksMjkgKzUyLDYgQEAKIGFsbG9jYXRlIGEgcGFnZSBvbiBhIG5vZGUgdGhhdCBpcyBub3QgYWxsb3dlZCBpbiB0aGUgcmVxdWVzdGluZyB0YXNrcwogbWVtc19hbGxvd2VkIHZlY3Rvci4KIAotSWYgYSBjcHVzZXQgaXMgY3B1IG9yIG1lbSBleGNsdXNpdmUsIG5vIG90aGVyIGNwdXNldCwgb3RoZXIgdGhhbiBhIGRpcmVjdAotYW5jZXN0b3Igb3IgZGVzY2VuZGVudCwgbWF5IHNoYXJlIGFueSBvZiB0aGUgc2FtZSBDUFVzIG9yIE1lbW9yeSBOb2Rlcy4KLUEgY3B1c2V0IHRoYXQgaXMgY3B1IGV4Y2x1c2l2ZSBoYXMgYSBzY2hlZCBkb21haW4gYXNzb2NpYXRlZCB3aXRoIGl0LgotVGhlIHNjaGVkIGRvbWFpbiBjb25zaXN0cyBvZiBhbGwgY3B1cyBpbiB0aGUgY3VycmVudCBjcHVzZXQgdGhhdCBhcmUgbm90Ci1wYXJ0IG9mIGFueSBleGNsdXNpdmUgY2hpbGQgY3B1c2V0cy4KLVRoaXMgZW5zdXJlcyB0aGF0IHRoZSBzY2hlZHVsZXIgbG9hZCBiYWxhY2luZyBjb2RlIG9ubHkgYmFsYW5jZXMKLWFnYWluc3QgdGhlIGNwdXMgdGhhdCBhcmUgaW4gdGhlIHNjaGVkIGRvbWFpbiBhcyBkZWZpbmVkIGFib3ZlIGFuZCBub3QKLWFsbCBvZiB0aGUgY3B1cyBpbiB0aGUgc3lzdGVtLiBUaGlzIHJlbW92ZXMgYW55IG92ZXJoZWFkIGR1ZSB0bwotbG9hZCBiYWxhbmNpbmcgY29kZSB0cnlpbmcgdG8gcHVsbCB0YXNrcyBvdXRzaWRlIG9mIHRoZSBjcHUgZXhjbHVzaXZlCi1jcHVzZXQgb25seSB0byBiZSBwcmV2ZW50ZWQgYnkgdGhlIHRhc2tzJyBjcHVzX2FsbG93ZWQgbWFzay4KLQotQSBjcHVzZXQgdGhhdCBpcyBtZW1fZXhjbHVzaXZlIHJlc3RyaWN0cyBrZXJuZWwgYWxsb2NhdGlvbnMgZm9yCi1wYWdlLCBidWZmZXIgYW5kIG90aGVyIGRhdGEgY29tbW9ubHkgc2hhcmVkIGJ5IHRoZSBrZXJuZWwgYWNyb3NzCi1tdWx0aXBsZSB1c2Vycy4gIEFsbCBjcHVzZXRzLCB3aGV0aGVyIG1lbV9leGNsdXNpdmUgb3Igbm90LCByZXN0cmljdAotYWxsb2NhdGlvbnMgb2YgbWVtb3J5IGZvciB1c2VyIHNwYWNlLiAgVGhpcyBlbmFibGVzIGNvbmZpZ3VyaW5nIGEKLXN5c3RlbSBzbyB0aGF0IHNldmVyYWwgaW5kZXBlbmRlbnQgam9icyBjYW4gc2hhcmUgY29tbW9uIGtlcm5lbAotZGF0YSwgc3VjaCBhcyBmaWxlIHN5c3RlbSBwYWdlcywgd2hpbGUgaXNvbGF0aW5nIGVhY2ggam9icyB1c2VyCi1hbGxvY2F0aW9uIGluIGl0cyBvd24gY3B1c2V0LiAgVG8gZG8gdGhpcywgY29uc3RydWN0IGEgbGFyZ2UKLW1lbV9leGNsdXNpdmUgY3B1c2V0IHRvIGhvbGQgYWxsIHRoZSBqb2JzLCBhbmQgY29uc3RydWN0IGNoaWxkLAotbm9uLW1lbV9leGNsdXNpdmUgY3B1c2V0cyBmb3IgZWFjaCBpbmRpdmlkdWFsIGpvYi4gIE9ubHkgYSBzbWFsbAotYW1vdW50IG9mIHR5cGljYWwga2VybmVsIG1lbW9yeSwgc3VjaCBhcyByZXF1ZXN0cyBmcm9tIGludGVycnVwdAotaGFuZGxlcnMsIGlzIGFsbG93ZWQgdG8gYmUgdGFrZW4gb3V0c2lkZSBldmVuIGEgbWVtX2V4Y2x1c2l2ZSBjcHVzZXQuCi0KIFVzZXIgbGV2ZWwgY29kZSBtYXkgY3JlYXRlIGFuZCBkZXN0cm95IGNwdXNldHMgYnkgbmFtZSBpbiB0aGUgY3B1c2V0CiB2aXJ0dWFsIGZpbGUgc3lzdGVtLCBtYW5hZ2UgdGhlIGF0dHJpYnV0ZXMgYW5kIHBlcm1pc3Npb25zIG9mIHRoZXNlCiBjcHVzZXRzIGFuZCB3aGljaCBDUFVzIGFuZCBNZW1vcnkgTm9kZXMgYXJlIGFzc2lnbmVkIHRvIGVhY2ggY3B1c2V0LApAQCAtMTU1LDcgKzEzNSw3IEBACiBUaGUgaW1wbGVtZW50YXRpb24gb2YgY3B1c2V0cyByZXF1aXJlcyBhIGZldywgc2ltcGxlIGhvb2tzCiBpbnRvIHRoZSByZXN0IG9mIHRoZSBrZXJuZWwsIG5vbmUgaW4gcGVyZm9ybWFuY2UgY3JpdGljYWwgcGF0aHM6CiAKLSAtIGluIG1haW4vaW5pdC5jLCB0byBpbml0aWFsaXplIHRoZSByb290IGNwdXNldCBhdCBzeXN0ZW0gYm9vdC4KKyAtIGluIGluaXQvbWFpbi5jLCB0byBpbml0aWFsaXplIHRoZSByb290IGNwdXNldCBhdCBzeXN0ZW0gYm9vdC4KICAtIGluIGZvcmsgYW5kIGV4aXQsIHRvIGF0dGFjaCBhbmQgZGV0YWNoIGEgdGFzayBmcm9tIGl0cyBjcHVzZXQuCiAgLSBpbiBzY2hlZF9zZXRhZmZpbml0eSwgdG8gbWFzayB0aGUgcmVxdWVzdGVkIENQVXMgYnkgd2hhdCdzCiAgICBhbGxvd2VkIGluIHRoYXQgdGFza3MgY3B1c2V0LgpAQCAtMTY2LDcgKzE0Niw3IEBACiAgICBhbmQgcmVsYXRlZCBjaGFuZ2VzIGluIGJvdGggc2NoZWQuYyBhbmQgYXJjaC9pYTY0L2tlcm5lbC9kb21haW4uYwogIC0gaW4gdGhlIG1iaW5kIGFuZCBzZXRfbWVtcG9saWN5IHN5c3RlbSBjYWxscywgdG8gbWFzayB0aGUgcmVxdWVzdGVkCiAgICBNZW1vcnkgTm9kZXMgYnkgd2hhdCdzIGFsbG93ZWQgaW4gdGhhdCB0YXNrcyBjcHVzZXQuCi0gLSBpbiBwYWdlX2FsbG9jLCB0byByZXN0cmljdCBtZW1vcnkgdG8gYWxsb3dlZCBub2Rlcy4KKyAtIGluIHBhZ2VfYWxsb2MuYywgdG8gcmVzdHJpY3QgbWVtb3J5IHRvIGFsbG93ZWQgbm9kZXMuCiAgLSBpbiB2bXNjYW4uYywgdG8gcmVzdHJpY3QgcGFnZSByZWNvdmVyeSB0byB0aGUgY3VycmVudCBjcHVzZXQuCiAKIEluIGFkZGl0aW9uIGEgbmV3IGZpbGUgc3lzdGVtLCBvZiB0eXBlICJjcHVzZXQiIG1heSBiZSBtb3VudGVkLApAQCAtMTkyLDkgKzE3MiwxNSBAQAogCiAgLSBjcHVzOiBsaXN0IG9mIENQVXMgaW4gdGhhdCBjcHVzZXQKICAtIG1lbXM6IGxpc3Qgb2YgTWVtb3J5IE5vZGVzIGluIHRoYXQgY3B1c2V0CisgLSBtZW1vcnlfbWlncmF0ZSBmbGFnOiBpZiBzZXQsIG1vdmUgcGFnZXMgdG8gY3B1c2V0cyBub2RlcwogIC0gY3B1X2V4Y2x1c2l2ZSBmbGFnOiBpcyBjcHUgcGxhY2VtZW50IGV4Y2x1c2l2ZT8KICAtIG1lbV9leGNsdXNpdmUgZmxhZzogaXMgbWVtb3J5IHBsYWNlbWVudCBleGNsdXNpdmU/CiAgLSB0YXNrczogbGlzdCBvZiB0YXNrcyAoYnkgcGlkKSBhdHRhY2hlZCB0byB0aGF0IGNwdXNldAorIC0gbm90aWZ5X29uX3JlbGVhc2UgZmxhZzogcnVuIC9zYmluL2NwdXNldF9yZWxlYXNlX2FnZW50IG9uIGV4aXQ/CisgLSBtZW1vcnlfcHJlc3N1cmU6IG1lYXN1cmUgb2YgaG93IG11Y2ggcGFnaW5nIHByZXNzdXJlIGluIGNwdXNldAorCitJbiBhZGRpdGlvbiwgdGhlIHJvb3QgY3B1c2V0IG9ubHkgaGFzIHRoZSBmb2xsb3dpbmcgZmlsZToKKyAtIG1lbW9yeV9wcmVzc3VyZV9lbmFibGVkIGZsYWc6IGNvbXB1dGUgbWVtb3J5X3ByZXNzdXJlPwogCiBOZXcgY3B1c2V0cyBhcmUgY3JlYXRlZCB1c2luZyB0aGUgbWtkaXIgc3lzdGVtIGNhbGwgb3Igc2hlbGwKIGNvbW1hbmQuICBUaGUgcHJvcGVydGllcyBvZiBhIGNwdXNldCwgc3VjaCBhcyBpdHMgZmxhZ3MsIGFsbG93ZWQKQEAgLTIyOCw3ICsyMTQsMTA4IEBACiB0byByZXByZXNlbnQgdGhlIGNwdXNldCBoaWVyYXJjaHkgcHJvdmlkZXMgZm9yIGEgZmFtaWxpYXIgcGVybWlzc2lvbgogYW5kIG5hbWUgc3BhY2UgZm9yIGNwdXNldHMsIHdpdGggYSBtaW5pbXVtIG9mIGFkZGl0aW9uYWwga2VybmVsIGNvZGUuCiAKLTEuNCBIb3cgZG8gSSB1c2UgY3B1c2V0cyA/CisKKzEuNCBXaGF0IGFyZSBleGNsdXNpdmUgY3B1c2V0cyA/CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiBhIGNwdXNldCBpcyBjcHUgb3IgbWVtIGV4Y2x1c2l2ZSwgbm8gb3RoZXIgY3B1c2V0LCBvdGhlciB0aGFuCithIGRpcmVjdCBhbmNlc3RvciBvciBkZXNjZW5kZW50LCBtYXkgc2hhcmUgYW55IG9mIHRoZSBzYW1lIENQVXMgb3IKK01lbW9yeSBOb2Rlcy4KKworQSBjcHVzZXQgdGhhdCBpcyBjcHVfZXhjbHVzaXZlIGhhcyBhIHNjaGVkdWxlciAoc2NoZWQpIGRvbWFpbgorYXNzb2NpYXRlZCB3aXRoIGl0LiAgVGhlIHNjaGVkIGRvbWFpbiBjb25zaXN0cyBvZiBhbGwgQ1BVcyBpbiB0aGUKK2N1cnJlbnQgY3B1c2V0IHRoYXQgYXJlIG5vdCBwYXJ0IG9mIGFueSBleGNsdXNpdmUgY2hpbGQgY3B1c2V0cy4KK1RoaXMgZW5zdXJlcyB0aGF0IHRoZSBzY2hlZHVsZXIgbG9hZCBiYWxhbmNpbmcgY29kZSBvbmx5IGJhbGFuY2VzCithZ2FpbnN0IHRoZSBDUFVzIHRoYXQgYXJlIGluIHRoZSBzY2hlZCBkb21haW4gYXMgZGVmaW5lZCBhYm92ZSBhbmQKK25vdCBhbGwgb2YgdGhlIENQVXMgaW4gdGhlIHN5c3RlbS4gVGhpcyByZW1vdmVzIGFueSBvdmVyaGVhZCBkdWUgdG8KK2xvYWQgYmFsYW5jaW5nIGNvZGUgdHJ5aW5nIHRvIHB1bGwgdGFza3Mgb3V0c2lkZSBvZiB0aGUgY3B1X2V4Y2x1c2l2ZQorY3B1c2V0IG9ubHkgdG8gYmUgcHJldmVudGVkIGJ5IHRoZSB0YXNrcycgY3B1c19hbGxvd2VkIG1hc2suCisKK0EgY3B1c2V0IHRoYXQgaXMgbWVtX2V4Y2x1c2l2ZSByZXN0cmljdHMga2VybmVsIGFsbG9jYXRpb25zIGZvcgorcGFnZSwgYnVmZmVyIGFuZCBvdGhlciBkYXRhIGNvbW1vbmx5IHNoYXJlZCBieSB0aGUga2VybmVsIGFjcm9zcworbXVsdGlwbGUgdXNlcnMuICBBbGwgY3B1c2V0cywgd2hldGhlciBtZW1fZXhjbHVzaXZlIG9yIG5vdCwgcmVzdHJpY3QKK2FsbG9jYXRpb25zIG9mIG1lbW9yeSBmb3IgdXNlciBzcGFjZS4gIFRoaXMgZW5hYmxlcyBjb25maWd1cmluZyBhCitzeXN0ZW0gc28gdGhhdCBzZXZlcmFsIGluZGVwZW5kZW50IGpvYnMgY2FuIHNoYXJlIGNvbW1vbiBrZXJuZWwgZGF0YSwKK3N1Y2ggYXMgZmlsZSBzeXN0ZW0gcGFnZXMsIHdoaWxlIGlzb2xhdGluZyBlYWNoIGpvYnMgdXNlciBhbGxvY2F0aW9uIGluCitpdHMgb3duIGNwdXNldC4gIFRvIGRvIHRoaXMsIGNvbnN0cnVjdCBhIGxhcmdlIG1lbV9leGNsdXNpdmUgY3B1c2V0IHRvCitob2xkIGFsbCB0aGUgam9icywgYW5kIGNvbnN0cnVjdCBjaGlsZCwgbm9uLW1lbV9leGNsdXNpdmUgY3B1c2V0cyBmb3IKK2VhY2ggaW5kaXZpZHVhbCBqb2IuICBPbmx5IGEgc21hbGwgYW1vdW50IG9mIHR5cGljYWwga2VybmVsIG1lbW9yeSwKK3N1Y2ggYXMgcmVxdWVzdHMgZnJvbSBpbnRlcnJ1cHQgaGFuZGxlcnMsIGlzIGFsbG93ZWQgdG8gYmUgdGFrZW4KK291dHNpZGUgZXZlbiBhIG1lbV9leGNsdXNpdmUgY3B1c2V0LgorCisKKzEuNSBXaGF0IGRvZXMgbm90aWZ5X29uX3JlbGVhc2UgZG8gPworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHRoZSBub3RpZnlfb25fcmVsZWFzZSBmbGFnIGlzIGVuYWJsZWQgKDEpIGluIGEgY3B1c2V0LCB0aGVuIHdoZW5ldmVyCit0aGUgbGFzdCB0YXNrIGluIHRoZSBjcHVzZXQgbGVhdmVzIChleGl0cyBvciBhdHRhY2hlcyB0byBzb21lIG90aGVyCitjcHVzZXQpIGFuZCB0aGUgbGFzdCBjaGlsZCBjcHVzZXQgb2YgdGhhdCBjcHVzZXQgaXMgcmVtb3ZlZCwgdGhlbgordGhlIGtlcm5lbCBydW5zIHRoZSBjb21tYW5kIC9zYmluL2NwdXNldF9yZWxlYXNlX2FnZW50LCBzdXBwbHlpbmcgdGhlCitwYXRobmFtZSAocmVsYXRpdmUgdG8gdGhlIG1vdW50IHBvaW50IG9mIHRoZSBjcHVzZXQgZmlsZSBzeXN0ZW0pIG9mIHRoZQorYWJhbmRvbmVkIGNwdXNldC4gIFRoaXMgZW5hYmxlcyBhdXRvbWF0aWMgcmVtb3ZhbCBvZiBhYmFuZG9uZWQgY3B1c2V0cy4KK1RoZSBkZWZhdWx0IHZhbHVlIG9mIG5vdGlmeV9vbl9yZWxlYXNlIGluIHRoZSByb290IGNwdXNldCBhdCBzeXN0ZW0KK2Jvb3QgaXMgZGlzYWJsZWQgKDApLiAgVGhlIGRlZmF1bHQgdmFsdWUgb2Ygb3RoZXIgY3B1c2V0cyBhdCBjcmVhdGlvbgoraXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlaXIgcGFyZW50cyBub3RpZnlfb25fcmVsZWFzZSBzZXR0aW5nLgorCisKKzEuNiBXaGF0IGlzIG1lbW9yeV9wcmVzc3VyZSA/CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIG1lbW9yeV9wcmVzc3VyZSBvZiBhIGNwdXNldCBwcm92aWRlcyBhIHNpbXBsZSBwZXItY3B1c2V0IG1ldHJpYworb2YgdGhlIHJhdGUgdGhhdCB0aGUgdGFza3MgaW4gYSBjcHVzZXQgYXJlIGF0dGVtcHRpbmcgdG8gZnJlZSB1cCBpbgordXNlIG1lbW9yeSBvbiB0aGUgbm9kZXMgb2YgdGhlIGNwdXNldCB0byBzYXRpc2Z5IGFkZGl0aW9uYWwgbWVtb3J5CityZXF1ZXN0cy4KKworVGhpcyBlbmFibGVzIGJhdGNoIG1hbmFnZXJzIG1vbml0b3Jpbmcgam9icyBydW5uaW5nIGluIGRlZGljYXRlZAorY3B1c2V0cyB0byBlZmZpY2llbnRseSBkZXRlY3Qgd2hhdCBsZXZlbCBvZiBtZW1vcnkgcHJlc3N1cmUgdGhhdCBqb2IKK2lzIGNhdXNpbmcuCisKK1RoaXMgaXMgdXNlZnVsIGJvdGggb24gdGlnaHRseSBtYW5hZ2VkIHN5c3RlbXMgcnVubmluZyBhIHdpZGUgbWl4IG9mCitzdWJtaXR0ZWQgam9icywgd2hpY2ggbWF5IGNob29zZSB0byB0ZXJtaW5hdGUgb3IgcmUtcHJpb3JpdGl6ZSBqb2JzIHRoYXQKK2FyZSB0cnlpbmcgdG8gdXNlIG1vcmUgbWVtb3J5IHRoYW4gYWxsb3dlZCBvbiB0aGUgbm9kZXMgYXNzaWduZWQgdGhlbSwKK2FuZCB3aXRoIHRpZ2h0bHkgY291cGxlZCwgbG9uZyBydW5uaW5nLCBtYXNzaXZlbHkgcGFyYWxsZWwgc2NpZW50aWZpYworY29tcHV0aW5nIGpvYnMgdGhhdCB3aWxsIGRyYW1hdGljYWxseSBmYWlsIHRvIG1lZXQgcmVxdWlyZWQgcGVyZm9ybWFuY2UKK2dvYWxzIGlmIHRoZXkgc3RhcnQgdG8gdXNlIG1vcmUgbWVtb3J5IHRoYW4gYWxsb3dlZCB0byB0aGVtLgorCitUaGlzIG1lY2hhbmlzbSBwcm92aWRlcyBhIHZlcnkgZWNvbm9taWNhbCB3YXkgZm9yIHRoZSBiYXRjaCBtYW5hZ2VyCit0byBtb25pdG9yIGEgY3B1c2V0IGZvciBzaWducyBvZiBtZW1vcnkgcHJlc3N1cmUuICBJdCdzIHVwIHRvIHRoZQorYmF0Y2ggbWFuYWdlciBvciBvdGhlciB1c2VyIGNvZGUgdG8gZGVjaWRlIHdoYXQgdG8gZG8gYWJvdXQgaXQgYW5kCit0YWtlIGFjdGlvbi4KKworPT0+IFVubGVzcyB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCBieSB3cml0aW5nICIxIiB0byB0aGUgc3BlY2lhbCBmaWxlCisgICAgL2Rldi9jcHVzZXQvbWVtb3J5X3ByZXNzdXJlX2VuYWJsZWQsIHRoZSBob29rIGluIHRoZSByZWJhbGFuY2UKKyAgICBjb2RlIG9mIF9fYWxsb2NfcGFnZXMoKSBmb3IgdGhpcyBtZXRyaWMgcmVkdWNlcyB0byBzaW1wbHkgbm90aWNpbmcKKyAgICB0aGF0IHRoZSBjcHVzZXRfbWVtb3J5X3ByZXNzdXJlX2VuYWJsZWQgZmxhZyBpcyB6ZXJvLiAgU28gb25seQorICAgIHN5c3RlbXMgdGhhdCBlbmFibGUgdGhpcyBmZWF0dXJlIHdpbGwgY29tcHV0ZSB0aGUgbWV0cmljLgorCitXaHkgYSBwZXItY3B1c2V0LCBydW5uaW5nIGF2ZXJhZ2U6CisKKyAgICBCZWNhdXNlIHRoaXMgbWV0ZXIgaXMgcGVyLWNwdXNldCwgcmF0aGVyIHRoYW4gcGVyLXRhc2sgb3IgbW0sCisgICAgdGhlIHN5c3RlbSBsb2FkIGltcG9zZWQgYnkgYSBiYXRjaCBzY2hlZHVsZXIgbW9uaXRvcmluZyB0aGlzCisgICAgbWV0cmljIGlzIHNoYXJwbHkgcmVkdWNlZCBvbiBsYXJnZSBzeXN0ZW1zLCBiZWNhdXNlIGEgc2NhbiBvZgorICAgIHRoZSB0YXNrbGlzdCBjYW4gYmUgYXZvaWRlZCBvbiBlYWNoIHNldCBvZiBxdWVyaWVzLgorCisgICAgQmVjYXVzZSB0aGlzIG1ldGVyIGlzIGEgcnVubmluZyBhdmVyYWdlLCBpbnN0ZWFkIG9mIGFuIGFjY3VtdWxhdGluZworICAgIGNvdW50ZXIsIGEgYmF0Y2ggc2NoZWR1bGVyIGNhbiBkZXRlY3QgbWVtb3J5IHByZXNzdXJlIHdpdGggYQorICAgIHNpbmdsZSByZWFkLCBpbnN0ZWFkIG9mIGhhdmluZyB0byByZWFkIGFuZCBhY2N1bXVsYXRlIHJlc3VsdHMKKyAgICBmb3IgYSBwZXJpb2Qgb2YgdGltZS4KKworICAgIEJlY2F1c2UgdGhpcyBtZXRlciBpcyBwZXItY3B1c2V0IHJhdGhlciB0aGFuIHBlci10YXNrIG9yIG1tLAorICAgIHRoZSBiYXRjaCBzY2hlZHVsZXIgY2FuIG9idGFpbiB0aGUga2V5IGluZm9ybWF0aW9uLCBtZW1vcnkKKyAgICBwcmVzc3VyZSBpbiBhIGNwdXNldCwgd2l0aCBhIHNpbmdsZSByZWFkLCByYXRoZXIgdGhhbiBoYXZpbmcgdG8KKyAgICBxdWVyeSBhbmQgYWNjdW11bGF0ZSByZXN1bHRzIG92ZXIgYWxsIHRoZSAoZHluYW1pY2FsbHkgY2hhbmdpbmcpCisgICAgc2V0IG9mIHRhc2tzIGluIHRoZSBjcHVzZXQuCisKK0EgcGVyLWNwdXNldCBzaW1wbGUgZGlnaXRhbCBmaWx0ZXIgKHJlcXVpcmVzIGEgc3BpbmxvY2sgYW5kIDMgd29yZHMKK29mIGRhdGEgcGVyLWNwdXNldCkgaXMga2VwdCwgYW5kIHVwZGF0ZWQgYnkgYW55IHRhc2sgYXR0YWNoZWQgdG8gdGhhdAorY3B1c2V0LCBpZiBpdCBlbnRlcnMgdGhlIHN5bmNocm9ub3VzIChkaXJlY3QpIHBhZ2UgcmVjbGFpbSBjb2RlLgorCitBIHBlci1jcHVzZXQgZmlsZSBwcm92aWRlcyBhbiBpbnRlZ2VyIG51bWJlciByZXByZXNlbnRpbmcgdGhlIHJlY2VudAorKGhhbGYtbGlmZSBvZiAxMCBzZWNvbmRzKSByYXRlIG9mIGRpcmVjdCBwYWdlIHJlY2xhaW1zIGNhdXNlZCBieQordGhlIHRhc2tzIGluIHRoZSBjcHVzZXQsIGluIHVuaXRzIG9mIHJlY2xhaW1zIGF0dGVtcHRlZCBwZXIgc2Vjb25kLAordGltZXMgMTAwMC4KKworCisxLjcgSG93IGRvIEkgdXNlIGNwdXNldHMgPwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogSW4gb3JkZXIgdG8gbWluaW1pemUgdGhlIGltcGFjdCBvZiBjcHVzZXRzIG9uIGNyaXRpY2FsIGtlcm5lbApAQCAtMjc3LDYgKzM2NCwzMCBAQAogaW1wYWN0aW5nIHRoZSBzY2hlZHVsZXIgY29kZSBpbiB0aGUga2VybmVsIHdpdGggYSBjaGVjayBmb3IgY2hhbmdlcwogaW4gYSB0YXNrcyBwcm9jZXNzb3IgcGxhY2VtZW50LgogCitOb3JtYWxseSwgb25jZSBhIHBhZ2UgaXMgYWxsb2NhdGVkIChnaXZlbiBhIHBoeXNpY2FsIHBhZ2UKK29mIG1haW4gbWVtb3J5KSB0aGVuIHRoYXQgcGFnZSBzdGF5cyBvbiB3aGF0ZXZlciBub2RlIGl0Cit3YXMgYWxsb2NhdGVkLCBzbyBsb25nIGFzIGl0IHJlbWFpbnMgYWxsb2NhdGVkLCBldmVuIGlmIHRoZQorY3B1c2V0cyBtZW1vcnkgcGxhY2VtZW50IHBvbGljeSAnbWVtcycgc3Vic2VxdWVudGx5IGNoYW5nZXMuCitJZiB0aGUgY3B1c2V0IGZsYWcgZmlsZSAnbWVtb3J5X21pZ3JhdGUnIGlzIHNldCB0cnVlLCB0aGVuIHdoZW4KK3Rhc2tzIGFyZSBhdHRhY2hlZCB0byB0aGF0IGNwdXNldCwgYW55IHBhZ2VzIHRoYXQgdGFzayBoYWQKK2FsbG9jYXRlZCB0byBpdCBvbiBub2RlcyBpbiBpdHMgcHJldmlvdXMgY3B1c2V0IGFyZSBtaWdyYXRlZAordG8gdGhlIHRhc2tzIG5ldyBjcHVzZXQuICBEZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uLAordGhpcyBtaWdyYXRpb24gbWF5IGVpdGhlciBiZSBkb25lIGJ5IHN3YXBwaW5nIHRoZSBwYWdlIG91dCwKK3NvIHRoYXQgdGhlIG5leHQgdGltZSB0aGUgcGFnZSBpcyByZWZlcmVuY2VkLCBpdCB3aWxsIGJlIHBhZ2VkCitpbnRvIHRoZSB0YXNrcyBuZXcgY3B1c2V0LCB1c3VhbGx5IG9uIHRoZSBub2RlIHdoZXJlIGl0IHdhcworcmVmZXJlbmNlZCwgb3IgdGhpcyBtaWdyYXRpb24gbWF5IGJlIGRvbmUgYnkgZGlyZWN0bHkgY29weWluZwordGhlIHBhZ2VzIGZyb20gdGhlIHRhc2tzIHByZXZpb3VzIGNwdXNldCB0byB0aGUgbmV3IGNwdXNldCwKK3doZXJlIHBvc3NpYmxlIHRvIHRoZSBzYW1lIG5vZGUsIHJlbGF0aXZlIHRvIHRoZSBuZXcgY3B1c2V0LAorYXMgdGhlIG5vZGUgdGhhdCBoZWxkIHRoZSBwYWdlLCByZWxhdGl2ZSB0byB0aGUgb2xkIGNwdXNldC4KK0Fsc28gaWYgJ21lbW9yeV9taWdyYXRlJyBpcyBzZXQgdHJ1ZSwgdGhlbiBpZiB0aGF0IGNwdXNldHMKKydtZW1zJyBmaWxlIGlzIG1vZGlmaWVkLCBwYWdlcyBhbGxvY2F0ZWQgdG8gdGFza3MgaW4gdGhhdAorY3B1c2V0LCB0aGF0IHdlcmUgb24gbm9kZXMgaW4gdGhlIHByZXZpb3VzIHNldHRpbmcgb2YgJ21lbXMnLAord2lsbCBiZSBtb3ZlZCB0byBub2RlcyBpbiB0aGUgbmV3IHNldHRpbmcgb2YgJ21lbXMuJyAgQWdhaW4sCitkZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uLCB0aGlzIG1pZ2h0IGJlIGRvbmUgYnkgc3dhcHBpbmcsCitvciBieSBkaXJlY3QgY29weWluZy4gIEluIGVpdGhlciBjYXNlLCBwYWdlcyB0aGF0IHdlcmUgbm90IGluCit0aGUgdGFza3MgcHJpb3IgY3B1c2V0LCBvciBpbiB0aGUgY3B1c2V0cyBwcmlvciAnbWVtcycgc2V0dGluZywKK3dpbGwgbm90IGJlIG1vdmVkLgorCiBUaGVyZSBpcyBhbiBleGNlcHRpb24gdG8gdGhlIGFib3ZlLiAgSWYgaG90cGx1ZyBmdW5jdGlvbmFsaXR5IGlzIHVzZWQKIHRvIHJlbW92ZSBhbGwgdGhlIENQVXMgdGhhdCBhcmUgY3VycmVudGx5IGFzc2lnbmVkIHRvIGEgY3B1c2V0LAogdGhlbiB0aGUga2VybmVsIHdpbGwgYXV0b21hdGljYWxseSB1cGRhdGUgdGhlIGNwdXNfYWxsb3dlZCBvZiBhbGwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHJpdmVycy9lZGFjL2VkYWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXJzL2VkYWMvZWRhYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM3MTkxZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVycy9lZGFjL2VkYWMudHh0CkBAIC0wLDAgKzEsNjczIEBACisKKworRURBQyAtIEVycm9yIERldGVjdGlvbiBBbmQgQ29ycmVjdGlvbgorCitXcml0dGVuIGJ5IERvdWcgVGhvbXBzb24gPG5vcnNrNUB4bWlzc2lvbi5jb20+Cis3IERlYyAyMDA1CisKKworRURBQyB3YXMgd3JpdHRlbiBieToKKwlUaGF5bmUgSGFyYmF1Z2gsCisJbW9kaWZpZWQgYnkgRGF2ZSBQZXRlcnNvbiwgRG91ZyBUaG9tcHNvbiwgZXQgYWwsCisJZnJvbSB0aGUgYmx1ZXNtb2tlLnNvdXJjZWZvcmdlLm5ldCBwcm9qZWN0LgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0VEQUMgUFVSUE9TRQorCitUaGUgJ2VkYWMnIGtlcm5lbCBtb2R1bGUgZ29hbCBpcyB0byBkZXRlY3QgYW5kIHJlcG9ydCBlcnJvcnMgdGhhdCBvY2N1cgord2l0aGluIHRoZSBjb21wdXRlciBzeXN0ZW0uIEluIHRoZSBpbml0aWFsIHJlbGVhc2UsIG1lbW9yeSBDb3JyZWN0YWJsZSBFcnJvcnMKKyhDRSkgYW5kIFVuY29ycmVjdGFibGUgRXJyb3JzIChVRSkgYXJlIHRoZSBwcmltYXJ5IGVycm9ycyBiZWluZyBoYXJ2ZXN0ZWQuCisKK0RldGVjdGluZyBDRSBldmVudHMsIHRoZW4gaGFydmVzdGluZyB0aG9zZSBldmVudHMgYW5kIHJlcG9ydGluZyB0aGVtLAorQ0FOIGJlIGEgcHJlZGljdG9yIG9mIGZ1dHVyZSBVRSBldmVudHMuICBXaXRoIENFIGV2ZW50cywgdGhlIHN5c3RlbSBjYW4KK2NvbnRpbnVlIHRvIG9wZXJhdGUsIGJ1dCB3aXRoIGxlc3Mgc2FmZXR5LiBQcmV2ZW50aXZlIG1haW50YWluZW5jZSBhbmQKK3Byb2FjdGl2ZSBwYXJ0IHJlcGxhY2VtZW50IG9mIG1lbW9yeSBESU1NcyBleGhpYml0aW5nIENFcyBjYW4gcmVkdWNlCit0aGUgbGlrZWxpaG9vZCBvZiB0aGUgZHJlYWRlZCBVRSBldmVudHMgYW5kIHN5c3RlbSAncGFuaWNzJy4KKworCitJbiBhZGRpdGlvbiwgUENJIEJ1cyBQYXJpdHkgYW5kIFNFUlIgRXJyb3JzIGFyZSBzY2FubmVkIGZvciBvbiBQQ0kgZGV2aWNlcworaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGlmIGVycm9ycyBhcmUgb2NjdXJyaW5nIG9uIGRhdGEgdHJhbnNmZXJzLgorVGhlIHByZXNlbmNlIG9mIFBDSSBQYXJpdHkgZXJyb3JzIG11c3QgYmUgZXhhbWluZWQgd2l0aCBhIGdyYWluIG9mIHNhbHQuCitUaGVyZSBhcmUgc2V2ZXJhbCBhZGRpbiBhZGFwdGVycyB0aGF0IGRvIE5PVCBmb2xsb3cgdGhlIFBDSSBzcGVjaWZpY2F0aW9uCit3aXRoIHJlZ2FyZHMgdG8gUGFyaXR5IGdlbmVyYXRpb24gYW5kIHJlcG9ydGluZy4gVGhlIHNwZWNpZmljYXRpb24gc2F5cwordGhlIHZlbmRvciBzaG91bGQgdGllIHRoZSBwYXJpdHkgc3RhdHVzIGJpdHMgdG8gMCBpZiB0aGV5IGRvIG5vdCBpbnRlbmQKK3RvIGdlbmVyYXRlIHBhcml0eS4gIFNvbWUgdmVuZG9ycyBkbyBub3QgZG8gdGhpcywgYW5kIHRodXMgdGhlIHBhcml0eSBiaXQKK2NhbiAiZmxvYXQiIGdpdmluZyBmYWxzZSBwb3NpdGl2ZXMuCisKK1RoZSBQQ0kgUGFyaXR5IEVEQUMgZGV2aWNlIGhhcyB0aGUgYWJpbGl0eSB0byAic2tpcCIga25vd24gZmxha2V5CitjYXJkcyBkdXJpbmcgdGhlIHBhcml0eSBzY2FuLiBUaGVzZSBhcmUgc2V0IGJ5IHRoZSBwYXJpdHkgImJsYWNrbGlzdCIKK2ludGVyZmFjZSBpbiB0aGUgc3lzZnMgZm9yIFBDSSBQYXJpdHkuIChTZWUgdGhlIFBDSSBzZWN0aW9uIGluIHRoZSBzeXNmcworc2VjdGlvbiBiZWxvdy4pIFRoZXJlIGlzIGFsc28gYSBwYXJpdHkgIndoaXRlbGlzdCIgd2hpY2ggaXMgdXNlZCBhcworYW4gZXhwbGljaXQgbGlzdCBvZiBkZXZpY2VzIHRvIHNjYW4sIHdoaWxlIHRoZSBibGFja2xpc3QgaXMgYSBsaXN0CitvZiBkZXZpY2VzIHRvIHNraXAuCisKK0VEQUMgd2lsbCBoYXZlIGZ1dHVyZSBlcnJvciBkZXRlY3RvcnMgdGhhdCB3aWxsIGJlIGFkZGVkIG9yIGludGVncmF0ZWQKK2ludG8gRURBQyBpbiB0aGUgZm9sbG93aW5nIGxpc3Q6CisKKwlNQ0UJTWFjaGluZSBDaGVjayBFeGNlcHRpb24KKwlNQ0EJTWFjaGluZSBDaGVjayBBcmNoaXRlY3R1cmUKKwlOTUkJTk1JIG5vdGlmaWNhdGlvbiBvZiBFQ0MgZXJyb3JzCisJTVNScyAJTWFjaGluZSBTcGVjaWZpYyBSZWdpc3RlciBlcnJvciBjYXNlcworCWFuZCBvdGhlciBtZWNoYW5pc21zLgorCitUaGVzZSBlcnJvcnMgYXJlIHVzdWFsbHkgYnVzIGVycm9ycywgRUNDIGVycm9ycywgdGhlcm1hbCB0aHJvdHRsaW5nCithbmQgdGhlIGxpa2UuCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorRURBQyBWRVJTSU9OSU5HCisKK0VEQUMgaXMgY29tcG9zZWQgb2YgYSAiY29yZSIgbW9kdWxlIChlZGFjX21jLmtvKSBhbmQgc2V2ZXJhbCBNZW1vcnkKK0NvbnRyb2xsZXIgKE1DKSBkcml2ZXIgbW9kdWxlcy4gT24gYSBnaXZlbiBzeXN0ZW0sIHRoZSBDT1JFCitpcyBsb2FkZWQgYW5kIG9uZSBNQyBkcml2ZXIgd2lsbCBiZSBsb2FkZWQuIEJvdGggdGhlIENPUkUgYW5kCit0aGUgTUMgZHJpdmVyIGhhdmUgaW5kaXZpZHVhbCB2ZXJzaW9ucyB0aGF0IHJlZmxlY3QgY3VycmVudCByZWxlYXNlCitsZXZlbCBvZiB0aGVpciByZXNwZWN0aXZlIG1vZHVsZXMuICBUaHVzLCB0byAicmVwb3J0IiBvbiB3aGF0IHZlcnNpb24KK2Egc3lzdGVtIGlzIHJ1bm5pbmcsIG9uZSBtdXN0IHJlcG9ydCBib3RoIHRoZSBDT1JFJ3MgYW5kIHRoZQorTUMgZHJpdmVyJ3MgdmVyc2lvbnMuCisKKworTE9BRElORworCitJZiAnZWRhYycgd2FzIHN0YXRpY2FsbHkgbGlua2VkIHdpdGggdGhlIGtlcm5lbCB0aGVuIG5vIGxvYWRpbmcgaXMKK25lY2Vzc2FyeS4gIElmICdlZGFjJyB3YXMgYnVpbHQgYXMgbW9kdWxlcyB0aGVuIHNpbXBseSBtb2Rwcm9iZSB0aGUKKydlZGFjJyBwaWVjZXMgdGhhdCB5b3UgbmVlZC4gIFlvdSBzaG91bGQgYmUgYWJsZSB0byBtb2Rwcm9iZQoraGFyZHdhcmUtc3BlY2lmaWMgbW9kdWxlcyBhbmQgaGF2ZSB0aGUgZGVwZW5kZW5jaWVzIGxvYWQgdGhlIG5lY2Vzc2FyeSBjb3JlCittb2R1bGVzLgorCitFeGFtcGxlOgorCiskPiBtb2Rwcm9iZSBhbWQ3NnhfZWRhYworCitsb2FkcyBib3RoIHRoZSBhbWQ3NnhfZWRhYy5rbyBtZW1vcnkgY29udHJvbGxlciBtb2R1bGUgYW5kIHRoZSBlZGFjX21jLmtvCitjb3JlIG1vZHVsZS4KKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitFREFDIHN5c2ZzIElOVEVSRkFDRQorCitFREFDIHByZXNlbnRzIGEgJ3N5c2ZzJyBpbnRlcmZhY2UgZm9yIGNvbnRyb2wsIHJlcG9ydGluZyBhbmQgYXR0cmlidXRlCityZXBvcnRpbmcgcHVycG9zZXMuCisKK0VEQUMgbGl2ZXMgaW4gdGhlIC9zeXMvZGV2aWNlcy9zeXN0ZW0vZWRhYyBkaXJlY3RvcnkuIFdpdGhpbiB0aGlzIGRpcmVjdG9yeQordGhlcmUgY3VycmVudGx5IHJlc2lkZSAyICdlZGFjJyBjb21wb25lbnRzOgorCisJbWMJbWVtb3J5IGNvbnRyb2xsZXIocykgc3lzdGVtCisJcGNpCVBDSSBzdGF0dXMgc3lzdGVtCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTWVtb3J5IENvbnRyb2xsZXIgKG1jKSBNb2RlbAorCitGaXJzdCBhIGJhY2tncm91bmQgb24gdGhlIG1lbW9yeSBjb250cm9sbGVyJ3MgbW9kZWwgYWJzdHJhY3RlZCBpbiBFREFDLgorRWFjaCBtYyBkZXZpY2UgY29udHJvbHMgYSBzZXQgb2YgRElNTSBtZW1vcnkgbW9kdWxlcy4gVGhlc2UgbW9kdWxlcyBhcmUKK2xheWVkIG91dCBpbiBhIENoaXAtU2VsZWN0IFJvdyAoY3Nyb3dYKSBhbmQgQ2hhbm5lbCB0YWJsZSAoY2hYKS4gVGhlcmUgY2FuCitiZSBtdWx0aXBsZSBjc3Jvd3MgYW5kIHR3byBjaGFubmVscy4KKworTWVtb3J5IGNvbnRyb2xsZXJzIGFsbG93IGZvciBzZXZlcmFsIGNzcm93cywgd2l0aCA4IGNzcm93cyBiZWluZyBhIHR5cGljYWwgdmFsdWUuCitZZXQsIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGNzcm93cyBkZXBlbmRzIG9uIHRoZSBlbGVjdHJpY2FsICJsb2FkaW5nIgorb2YgYSBnaXZlbiBtb3RoZXJib2FyZCwgbWVtb3J5IGNvbnRyb2xsZXIgYW5kIERJTU0gY2hhcmFjdGVyaXN0aWNzLgorCitEdWFsIGNoYW5uZWxzIGFsbG93cyBmb3IgMTI4IGJpdCBkYXRhIHRyYW5zZmVycyB0byB0aGUgQ1BVIGZyb20gbWVtb3J5LgorCisKKwkJQ2hhbm5lbCAwCUNoYW5uZWwgMQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJY3Nyb3cwCXwgRElNTV9BMAl8IERJTU1fQjAgfAorCWNzcm93MQl8IERJTU1fQTAJfCBESU1NX0IwIHwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwljc3JvdzIJfCBESU1NX0ExCXwgRElNTV9CMSB8CisJY3Nyb3czCXwgRElNTV9BMQl8IERJTU1fQjEgfAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0luIHRoZSBhYm92ZSBleGFtcGxlIHRhYmxlIHRoZXJlIGFyZSA0IHBoeXNpY2FsIHNsb3RzIG9uIHRoZSBtb3RoZXJib2FyZAorZm9yIG1lbW9yeSBESU1NczoKKworCURJTU1fQTAKKwlESU1NX0IwCisJRElNTV9BMQorCURJTU1fQjEKKworTGFiZWxzIGZvciB0aGVzZSBzbG90cyBhcmUgdXN1YWxseSBzaWxrIHNjcmVlbmVkIG9uIHRoZSBtb3RoZXJib2FyZC4gU2xvdHMKK2xhYmVsZWQgJ0EnIGFyZSBjaGFubmVsIDAgaW4gdGhpcyBleGFtcGxlLiBTbG90cyBsYWJsZWQgJ0InCithcmUgY2hhbm5lbCAxLiBOb3RpY2UgdGhhdCB0aGVyZSBhcmUgdHdvIGNzcm93cyBwb3NzaWJsZSBvbiBhCitwaHlzaWNhbCBESU1NLiBUaGVzZSBjc3Jvd3MgYXJlIGFsbG9jYXRlZCB0aGVpciBjc3JvdyBhc3NpZ25tZW50CitiYXNlZCBvbiB0aGUgc2xvdCBpbnRvIHdoaWNoIHRoZSBtZW1vcnkgRElNTSBpcyBwbGFjZWQuIFRodXMsIHdoZW4gMSBESU1NCitpcyBwbGFjZWQgaW4gZWFjaCBDaGFubmVsLCB0aGUgY3Nyb3dzIGNyb3NzIGJvdGggRElNTXMuCisKK01lbW9yeSBESU1NcyBjb21lIHNpbmdsZSBvciBkdWFsICJyYW5rZWQiLiBBIHJhbmsgaXMgYSBwb3B1bGF0ZWQgY3Nyb3cuCitUaHVzLCAyIHNpbmdsZSByYW5rZWQgRElNTXMsIHBsYWNlZCBpbiBzbG90cyBESU1NX0EwIGFuZCBESU1NX0IwIGFib3ZlCit3aWxsIGhhdmUgMSBjc3JvdywgY3Nyb3cwLiBjc3JvdzEgd2lsbCBiZSBlbXB0eS4gT24gdGhlIG90aGVyIGhhbmQsCit3aGVuIDIgZHVhbCByYW5rZWQgRElNTXMgYXJlIHNpbWlsaWFyeWx5IHBsYWNlZCwgdGhlbiBib3RoIGNzcm93MCBhbmQKK2Nzcm93MSB3aWxsIGJlIHBvcHVsYXRlZC4gVGhlIHBhdHRlcm4gcmVwZWF0cyBpdHNlbGYgZm9yIGNzcm93MiBhbmQKK2Nzcm93My4KKworVGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhYm92ZSBpcyByZWZsZWN0ZWQgaW4gdGhlIGRpcmVjdG9yeSB0cmVlCitpbiBFREFDJ3Mgc3lzZnMgaW50ZXJmYWNlLiBTdGFydGluZyBpbiBkaXJlY3RvcnkKKy9zeXMvZGV2aWNlcy9zeXN0ZW0vZWRhYy9tYyBlYWNoIG1lbW9yeSBjb250cm9sbGVyIHdpbGwgYmUgcmVwcmVzZW50ZWQKK2J5IGl0cyBvd24gJ21jWCcgZGlyZWN0b3J5LCB3aGVyZSAnWCIgaXMgdGhlIGluZGV4IG9mIHRoZSBNQy4KKworCisJLi4uLi9lZGFjL21jLworCQkgICB8CisJCSAgIHwtPm1jMAorCQkgICB8LT5tYzEKKwkJICAgfC0+bWMyCisJCSAgIC4uLi4KKworVW5kZXIgZWFjaCAnbWNYJyBkaXJlY3RvcnkgZWFjaCAnY3Nyb3dYJyBpcyBhZ2FpbiByZXByZXNlbnRlZCBieSBhCisnY3Nyb3dYJywgd2hlcmUgJ1giIGlzIHRoZSBjc3JvdyBpbmRleDoKKworCisJLi4uL21jL21jMC8KKwkJfAorCQl8LT5jc3JvdzAKKwkJfC0+Y3Nyb3cyCisJCXwtPmNzcm93MworCQkuLi4uCisKK05vdGljZSB0aGF0IHRoZXJlIGlzIG5vIGNzcm93MSwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgY3Nyb3cwIGlzCitjb21wb3NlZCBvZiBhIHNpbmdsZSByYW5rZWQgRElNTXMuIFRoaXMgc2hvdWxkIGFsc28gYXBwbHkgaW4gYm90aAorQ2hhbm5lbHMsIGluIG9yZGVyIHRvIGhhdmUgZHVhbC1jaGFubmVsIG1vZGUgYmUgb3BlcmF0aW9uYWwuIFNpbmNlCitib3RoIGNzcm93MiBhbmQgY3Nyb3czIGFyZSBwb3B1bGF0ZWQsIHRoaXMgaW5kaWNhdGVzIGEgZHVhbCByYW5rZWQKK3NldCBvZiBESU1NcyBmb3IgY2hhbm5lbHMgMCBhbmQgMS4KKworCitXaXRoaW4gZWFjaCBvZiB0aGUgJ21jJywnbWNYJyBhbmQgJ2Nzcm93WCcgZGlyZWN0b3JpZXMgYXJlIHNldmVyYWwKK0VEQUMgY29udHJvbCBhbmQgYXR0cmlidXRlIGZpbGVzLgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0RJUkVDVE9SWSAnbWMnCisKK0luIGRpcmVjdG9yeSAnbWMnIGFyZSBFREFDIHN5c3RlbSBvdmVyYWxsIGNvbnRyb2wgYW5kIGF0dHJpYnV0ZSBmaWxlczoKKworCitQYW5pYyBvbiBVRSBjb250cm9sIGZpbGU6CisKKwkncGFuaWNfb25fdWUnCisKKwlBbiB1bmNvcnJlY3RhYmxlIGVycm9yIHdpbGwgY2F1c2UgYSBtYWNoaW5lIHBhbmljLiAgVGhpcyBpcyB1c3VhbGx5CisJZGVzaXJhYmxlLiAgSXQgaXMgYSBiYWQgaWRlYSB0byBjb250aW51ZSB3aGVuIGFuIHVuY29ycmVjdGFibGUgZXJyb3IKKwlvY2N1cnMgLSBpdCBpcyBpbmRldGVybWluYXRlIHdoYXQgd2FzIHVuY29ycmVjdGVkIGFuZCB0aGUgb3BlcmF0aW5nCisJc3lzdGVtIGNvbnRleHQgbWlnaHQgYmUgc28gbWFuZ2xlZCB0aGF0IGNvbnRpbnVpbmcgd2lsbCBsZWFkIHRvIGZ1cnRoZXIKKwljb3JydXB0aW9uLiBJZiB0aGUga2VybmVsIGhhcyBNQ0UgY29uZmlndXJlZCwgdGhlbiBFREFDIHdpbGwgbmV2ZXIKKwlub3RpY2UgdGhlIFVFLgorCisJTE9BRCBUSU1FOiBtb2R1bGUva2VybmVsIHBhcmFtZXRlcjogcGFuaWNfb25fdWU9WzB8MV0KKworCVJVTiBUSU1FOiAgZWNobyAiMSIgPi9zeXMvZGV2aWNlcy9zeXN0ZW0vZWRhYy9tYy9wYW5pY19vbl91ZQorCisKK0xvZyBVRSBjb250cm9sIGZpbGU6CisKKwknbG9nX3VlJworCisJR2VuZXJhdGUga2VybmVsIG1lc3NhZ2VzIGRlc2NyaWJpbmcgdW5jb3JyZWN0YWJsZSBlcnJvcnMuICBUaGVzZSBlcnJvcnMKKwlhcmUgcmVwb3J0ZWQgdGhyb3VnaCB0aGUgc3lzdGVtIG1lc3NhZ2UgbG9nIHN5c3RlbS4gIFVFIHN0YXRpc3RpY3MKKwl3aWxsIGJlIGFjY3VtdWxhdGVkIGV2ZW4gd2hlbiBVRSBsb2dnaW5nIGlzIGRpc2FibGVkLgorCisJTE9BRCBUSU1FOiBtb2R1bGUva2VybmVsIHBhcmFtZXRlcjogbG9nX3VlPVswfDFdCisKKwlSVU4gVElNRTogZWNobyAiMSIgPi9zeXMvZGV2aWNlcy9zeXN0ZW0vZWRhYy9tYy9sb2dfdWUKKworCitMb2cgQ0UgY29udHJvbCBmaWxlOgorCisJJ2xvZ19jZScKKworCUdlbmVyYXRlIGtlcm5lbCBtZXNzYWdlcyBkZXNjcmliaW5nIGNvcnJlY3RhYmxlIGVycm9ycy4gIFRoZXNlCisJZXJyb3JzIGFyZSByZXBvcnRlZCB0aHJvdWdoIHRoZSBzeXN0ZW0gbWVzc2FnZSBsb2cgc3lzdGVtLgorCUNFIHN0YXRpc3RpY3Mgd2lsbCBiZSBhY2N1bXVsYXRlZCBldmVuIHdoZW4gQ0UgbG9nZ2luZyBpcyBkaXNhYmxlZC4KKworCUxPQUQgVElNRTogbW9kdWxlL2tlcm5lbCBwYXJhbWV0ZXI6IGxvZ19jZT1bMHwxXQorCisJUlVOIFRJTUU6IGVjaG8gIjEiID4vc3lzL2RldmljZXMvc3lzdGVtL2VkYWMvbWMvbG9nX2NlCisKKworUG9sbGluZyBwZXJpb2QgY29udHJvbCBmaWxlOgorCisJJ3BvbGxfbXNlYycKKworCVRoZSB0aW1lIHBlcmlvZCwgaW4gbWlsbGlzZWNvbmRzLCBmb3IgcG9sbGluZyBmb3IgZXJyb3IgaW5mb3JtYXRpb24uCisJVG9vIHNtYWxsIGEgdmFsdWUgd2FzdGVzIHJlc291cmNlcy4gIFRvbyBsYXJnZSBhIHZhbHVlIG1pZ2h0IGRlbGF5CisJbmVjZXNzYXJ5IGhhbmRsaW5nIG9mIGVycm9ycyBhbmQgbWlnaHQgbG9vc2UgdmFsdWFibGUgaW5mb3JtYXRpb24gZm9yCisJbG9jYXRpbmcgdGhlIGVycm9yLiAgMTAwMCBtaWxsaXNlY29uZHMgKG9uY2UgZWFjaCBzZWNvbmQpIGlzIGFib3V0CisJcmlnaHQgZm9yIG1vc3QgdXNlcy4KKworCUxPQUQgVElNRTogbW9kdWxlL2tlcm5lbCBwYXJhbWV0ZXI6IHBvbGxfbXNlYz1bMHwxXQorCisJUlVOIFRJTUU6IGVjaG8gIjEwMDAiID4vc3lzL2RldmljZXMvc3lzdGVtL2VkYWMvbWMvcG9sbF9tc2VjCisKKworTW9kdWxlIFZlcnNpb24gcmVhZC1vbmx5IGF0dHJpYnV0ZSBmaWxlOgorCisJJ21jX3ZlcnNpb24nCisKKwlUaGUgRURBQyBDT1JFIG1vZHVsZXMncyB2ZXJzaW9uIGFuZCBjb21waWxlIGRhdGUgYXJlIHNob3duIGhlcmUgdG8KKwlpbmRpY2F0ZSB3aGF0IEVEQUMgaXMgcnVubmluZy4KKworCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKydtY1gnIERJUkVDVE9SSUVTCisKKworSW4gJ21jWCcgZGlyZWN0b3JpZXMgYXJlIEVEQUMgY29udHJvbCBhbmQgYXR0cmlidXRlIGZpbGVzIGZvcgordGhpcyAnWCIgaW5zdGFuY2Ugb2YgdGhlIG1lbW9yeSBjb250cm9sbGVyczoKKworCitDb3VudGVyIHJlc2V0IGNvbnRyb2wgZmlsZToKKworCSdyZXNldF9jb3VudGVycycKKworCVRoaXMgd3JpdGUtb25seSBjb250cm9sIGZpbGUgd2lsbCB6ZXJvIGFsbCB0aGUgc3RhdGlzdGljYWwgY291bnRlcnMKKwlmb3IgVUUgYW5kIENFIGVycm9ycy4gIFplcm9pbmcgdGhlIGNvdW50ZXJzIHdpbGwgYWxzbyByZXNldCB0aGUgdGltZXIKKwlpbmRpY2F0aW5nIGhvdyBsb25nIHNpbmNlIHRoZSBsYXN0IGNvdW50ZXIgemVyby4gIFRoaXMgaXMgdXNlZnVsCisJZm9yIGNvbXB1dGluZyBlcnJvcnMvdGltZS4gIFNpbmNlIHRoZSBjb3VudGVycyBhcmUgYWx3YXlzIHJlc2V0IGF0CisJZHJpdmVyIGluaXRpYWxpemF0aW9uIHRpbWUsIG5vIG1vZHVsZS9rZXJuZWwgcGFyYW1ldGVyIGlzIGF2YWlsYWJsZS4KKworCVJVTiBUSU1FOiBlY2hvICJhbnl0aGluZyIgPi9zeXMvZGV2aWNlcy9zeXN0ZW0vZWRhYy9tYy9tYzAvY291bnRlcl9yZXNldAorCisJCVRoaXMgcmVzZXRzIHRoZSBjb3VudGVycyBvbiBtZW1vcnkgY29udHJvbGxlciAwCisKKworU2Vjb25kcyBzaW5jZSBsYXN0IGNvdW50ZXIgcmVzZXQgY29udHJvbCBmaWxlOgorCisJJ3NlY29uZHNfc2luY2VfcmVzZXQnCisKKwlUaGlzIGF0dHJpYnV0ZSBmaWxlIGRpc3BsYXlzIGhvdyBtYW55IHNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZQorCWxhc3QgY291bnRlciByZXNldC4gVGhpcyBjYW4gYmUgdXNlZCB3aXRoIHRoZSBlcnJvciBjb3VudGVycyB0bworCW1lYXN1cmUgZXJyb3IgcmF0ZXMuCisKKworCitESU1NIGNhcGFiaWxpdHkgYXR0cmlidXRlIGZpbGU6CisKKwknZWRhY19jYXBhYmlsaXR5JworCisJVGhlIEVEQUMgKEVycm9yIERldGVjdGlvbiBhbmQgQ29ycmVjdGlvbikgY2FwYWJpbGl0aWVzL21vZGVzIG9mCisJdGhlIG1lbW9yeSBjb250cm9sbGVyIGhhcmR3YXJlLgorCisKK0RJTU0gQ3VycmVudCBDYXBhYmlsaXR5IGF0dHJpYnV0ZSBmaWxlOgorCisJJ2VkYWNfY3VycmVudF9jYXBhYmlsaXR5JworCisJVGhlIEVEQUMgY2FwYWJpbGl0aWVzIGF2YWlsYWJsZSB3aXRoIHRoZSBoYXJkd2FyZQorCWNvbmZpZ3VyYXRpb24uICBUaGlzIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgIkVEQUMgY2FwYWJpbGl0eSIKKwlpZiB0aGUgY29ycmVjdCBtZW1vcnkgaXMgbm90IHVzZWQuICBJZiBhIG1lbW9yeSBjb250cm9sbGVyIGlzCisJY2FwYWJsZSBvZiBFREFDLCBidXQgRElNTXMgd2l0aG91dCBjaGVjayBiaXRzIGFyZSBpbiB1c2UsIHRoZW4KKwlQYXJpdHksIFNFQ0RFRCwgUzRFQ0Q0RUQgY2FwYWJpbGl0aWVzIHdpbGwgbm90IGJlIGF2YWlsYWJsZQorCWV2ZW4gdGhvdWdoIHRoZSBtZW1vcnkgY29udHJvbGxlciBtaWdodCBiZSBjYXBhYmxlIG9mIHRob3NlCisJbW9kZXMgd2l0aCB0aGUgcHJvcGVyIG1lbW9yeSBsb2FkZWQuCisKKworTWVtb3J5IFR5cGUgc3VwcG9ydGVkIG9uIHRoaXMgY29udHJvbGxlciBhdHRyaWJ1dGUgZmlsZToKKworCSdzdXBwb3J0ZWRfbWVtX3R5cGUnCisKKwlUaGlzIGF0dHJpYnV0ZSBmaWxlIGRpc3BsYXlzIHRoZSBtZW1vcnkgdHlwZSwgdXN1YWxseQorCWJ1ZmZlcmVkIGFuZCB1bmJ1ZmZlcmVkIERJTU1zLgorCisKK01lbW9yeSBDb250cm9sbGVyIG5hbWUgYXR0cmlidXRlIGZpbGU6CisKKwknbWNfbmFtZScKKworCVRoaXMgYXR0cmlidXRlIGZpbGUgZGlzcGxheXMgdGhlIHR5cGUgb2YgbWVtb3J5IGNvbnRyb2xsZXIKKwl0aGF0IGlzIGJlaW5nIHV0aWxpemVkLgorCisKK01lbW9yeSBDb250cm9sbGVyIE1vZHVsZSBuYW1lIGF0dHJpYnV0ZSBmaWxlOgorCisJJ21vZHVsZV9uYW1lJworCisJVGhpcyBhdHRyaWJ1dGUgZmlsZSBkaXNwbGF5cyB0aGUgbWVtb3J5IGNvbnRyb2xsZXIgbW9kdWxlIG5hbWUsCisJdmVyc2lvbiBhbmQgZGF0ZSBidWlsdC4gIFRoZSBuYW1lIG9mIHRoZSBtZW1vcnkgY29udHJvbGxlcgorCWhhcmR3YXJlIC0gc29tZSBkcml2ZXJzIHdvcmsgd2l0aCBtdWx0aXBsZSBjb250cm9sbGVycyBhbmQKKwl0aGlzIGZpZWxkIHNob3dzIHdoaWNoIGhhcmR3YXJlIGlzIHByZXNlbnQuCisKKworVG90YWwgbWVtb3J5IG1hbmFnZWQgYnkgdGhpcyBtZW1vcnkgY29udHJvbGxlciBhdHRyaWJ1dGUgZmlsZToKKworCSdzaXplX21iJworCisJVGhpcyBhdHRyaWJ1dGUgZmlsZSBkaXNwbGF5cywgaW4gY291bnQgb2YgbWVnYWJ5dGVzLCBvZiBtZW1vcnkKKwl0aGF0IHRoaXMgaW5zdGFuY2Ugb2YgbWVtb3J5IGNvbnRyb2xsZXIgbWFuYWdlcy4KKworCitUb3RhbCBVbmNvcnJlY3RhYmxlIEVycm9ycyBjb3VudCBhdHRyaWJ1dGUgZmlsZToKKworCSd1ZV9jb3VudCcKKworCVRoaXMgYXR0cmlidXRlIGZpbGUgZGlzcGxheXMgdGhlIHRvdGFsIGNvdW50IG9mIHVuY29ycmVjdGFibGUKKwllcnJvcnMgdGhhdCBoYXZlIG9jY3VycmVkIG9uIHRoaXMgbWVtb3J5IGNvbnRyb2xsZXIuIElmIHBhbmljX29uX3VlCisJaXMgc2V0IHRoaXMgY291bnRlciB3aWxsIG5vdCBoYXZlIGEgY2hhbmNlIHRvIGluY3JlbWVudCwKKwlzaW5jZSBFREFDIHdpbGwgcGFuaWMgdGhlIHN5c3RlbS4KKworCitUb3RhbCBVRSBjb3VudCB0aGF0IGhhZCBubyBpbmZvcm1hdGlvbiBhdHRyaWJ1dGUgZmlsZVk6CisKKwkndWVfbm9pbmZvX2NvdW50JworCisJVGhpcyBhdHRyaWJ1dGUgZmlsZSBkaXNwbGF5cyB0aGUgbnVtYmVyIG9mIFVFcyB0aGF0CisJaGF2ZSBvY2N1cnJlZCBoYXZlIG9jY3VycmVkIHdpdGggIG5vIGluZm9ybWF0aW9ucyBhcyB0byB3aGljaCBESU1NCisJc2xvdCBpcyBoYXZpbmcgZXJyb3JzLgorCisKK1RvdGFsIENvcnJlY3RhYmxlIEVycm9ycyBjb3VudCBhdHRyaWJ1dGUgZmlsZToKKworCSdjZV9jb3VudCcKKworCVRoaXMgYXR0cmlidXRlIGZpbGUgZGlzcGxheXMgdGhlIHRvdGFsIGNvdW50IG9mIGNvcnJlY3RhYmxlCisJZXJyb3JzIHRoYXQgaGF2ZSBvY2N1cnJlZCBvbiB0aGlzIG1lbW9yeSBjb250cm9sbGVyLiBUaGlzCisJY291bnQgaXMgdmVyeSBpbXBvcnRhbnQgdG8gZXhhbWluZS4gQ0VzIHByb3ZpZGUgZWFybHkKKwlpbmRpY2F0aW9ucyB0aGF0IGEgRElNTSBpcyBiZWdpbm5pbmcgdG8gZmFpbC4gVGhpcyBjb3VudAorCWZpZWxkIHNob3VsZCBiZSBtb25pdG9yZWQgZm9yIG5vbi16ZXJvIHZhbHVlcyBhbmQgcmVwb3J0CisJc3VjaCBpbmZvcm1hdGlvbiB0byB0aGUgc3lzdGVtIGFkbWluaXN0cmF0b3IuCisKKworVG90YWwgQ29ycmVjdGFibGUgRXJyb3JzIGNvdW50IGF0dHJpYnV0ZSBmaWxlOgorCisJJ2NlX25vaW5mb19jb3VudCcKKworCVRoaXMgYXR0cmlidXRlIGZpbGUgZGlzcGxheXMgdGhlIG51bWJlciBvZiBDRXMgdGhhdAorCWhhdmUgb2NjdXJyZWQgd2hlcmV3aXRoIG5vIGluZm9ybWF0aW9ucyBhcyB0byB3aGljaCBESU1NIHNsb3QKKwlpcyBoYXZpbmcgZXJyb3JzLiBNZW1vcnkgaXMgaGFuZGljYXBwZWQsIGJ1dCBvcGVyYXRpb25hbCwKKwl5ZXQgbm8gaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIHRvIGluZGljYXRlIHdoaWNoIHNsb3QKKwl0aGUgZmFpbGluZyBtZW1vcnkgaXMgaW4uIFRoaXMgY291bnQgZmllbGQgc2hvdWxkIGJlIGFsc28KKwliZSBtb25pdG9yZWQgZm9yIG5vbi16ZXJvIHZhbHVlcy4KKworRGV2aWNlIFN5bWxpbms6CisKKwknZGV2aWNlJworCisJU3ltbGluayB0byB0aGUgbWVtb3J5IGNvbnRyb2xsZXIgZGV2aWNlCisKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisnY3Nyb3dYJyBESVJFQ1RPUklFUworCitJbiB0aGUgJ2Nzcm93WCcgZGlyZWN0b3JpZXMgYXJlIEVEQUMgY29udHJvbCBhbmQgYXR0cmlidXRlIGZpbGVzIGZvcgordGhpcyAnWCIgaW5zdGFuY2Ugb2YgY3Nyb3c6CisKKworVG90YWwgVW5jb3JyZWN0YWJsZSBFcnJvcnMgY291bnQgYXR0cmlidXRlIGZpbGU6CisKKwkndWVfY291bnQnCisKKwlUaGlzIGF0dHJpYnV0ZSBmaWxlIGRpc3BsYXlzIHRoZSB0b3RhbCBjb3VudCBvZiB1bmNvcnJlY3RhYmxlCisJZXJyb3JzIHRoYXQgaGF2ZSBvY2N1cnJlZCBvbiB0aGlzIGNzcm93LiBJZiBwYW5pY19vbl91ZSBpcyBzZXQKKwl0aGlzIGNvdW50ZXIgd2lsbCBub3QgaGF2ZSBhIGNoYW5jZSB0byBpbmNyZW1lbnQsIHNpbmNlIEVEQUMKKwl3aWxsIHBhbmljIHRoZSBzeXN0ZW0uCisKKworVG90YWwgQ29ycmVjdGFibGUgRXJyb3JzIGNvdW50IGF0dHJpYnV0ZSBmaWxlOgorCisJJ2NlX2NvdW50JworCisJVGhpcyBhdHRyaWJ1dGUgZmlsZSBkaXNwbGF5cyB0aGUgdG90YWwgY291bnQgb2YgY29ycmVjdGFibGUKKwllcnJvcnMgdGhhdCBoYXZlIG9jY3VycmVkIG9uIHRoaXMgY3Nyb3cuIFRoaXMKKwljb3VudCBpcyB2ZXJ5IGltcG9ydGFudCB0byBleGFtaW5lLiBDRXMgcHJvdmlkZSBlYXJseQorCWluZGljYXRpb25zIHRoYXQgYSBESU1NIGlzIGJlZ2lubmluZyB0byBmYWlsLiBUaGlzIGNvdW50CisJZmllbGQgc2hvdWxkIGJlIG1vbml0b3JlZCBmb3Igbm9uLXplcm8gdmFsdWVzIGFuZCByZXBvcnQKKwlzdWNoIGluZm9ybWF0aW9uIHRvIHRoZSBzeXN0ZW0gYWRtaW5pc3RyYXRvci4KKworCitUb3RhbCBtZW1vcnkgbWFuYWdlZCBieSB0aGlzIGNzcm93IGF0dHJpYnV0ZSBmaWxlOgorCisJJ3NpemVfbWInCisKKwlUaGlzIGF0dHJpYnV0ZSBmaWxlIGRpc3BsYXlzLCBpbiBjb3VudCBvZiBtZWdhYnl0ZXMsIG9mIG1lbW9yeQorCXRoYXQgdGhpcyBjc3JvdyBjb250YXRpbnMuCisKKworTWVtb3J5IFR5cGUgYXR0cmlidXRlIGZpbGU6CisKKwknbWVtX3R5cGUnCisKKwlUaGlzIGF0dHJpYnV0ZSBmaWxlIHdpbGwgZGlzcGxheSB3aGF0IHR5cGUgb2YgbWVtb3J5IGlzIGN1cnJlbnRseQorCW9uIHRoaXMgY3Nyb3cuIE5vcm1hbGx5LCBlaXRoZXIgYnVmZmVyZWQgb3IgdW5idWZmZXJlZCBtZW1vcnkuCisKKworRURBQyBNb2RlIG9mIG9wZXJhdGlvbiBhdHRyaWJ1dGUgZmlsZToKKworCSdlZGFjX21vZGUnCisKKwlUaGlzIGF0dHJpYnV0ZSBmaWxlIHdpbGwgZGlzcGxheSB3aGF0IHR5cGUgb2YgRXJyb3IgZGV0ZWN0aW9uCisJYW5kIGNvcnJlY3Rpb24gaXMgYmVpbmcgdXRpbGl6ZWQuCisKKworRGV2aWNlIHR5cGUgYXR0cmlidXRlIGZpbGU6CisKKwknZGV2X3R5cGUnCisKKwlUaGlzIGF0dHJpYnV0ZSBmaWxlIHdpbGwgZGlzcGxheSB3aGF0IHR5cGUgb2YgRElNTSBkZXZpY2UgaXMKKwliZWluZyB1dGlsaXplZC4gRXhhbXBsZTogIHg0CisKKworQ2hhbm5lbCAwIENFIENvdW50IGF0dHJpYnV0ZSBmaWxlOgorCisJJ2NoMF9jZV9jb3VudCcKKworCVRoaXMgYXR0cmlidXRlIGZpbGUgd2lsbCBkaXNwbGF5IHRoZSBjb3VudCBvZiBDRXMgb24gdGhpcworCURJTU0gbG9jYXRlZCBpbiBjaGFubmVsIDAuCisKKworQ2hhbm5lbCAwIFVFIENvdW50IGF0dHJpYnV0ZSBmaWxlOgorCisJJ2NoMF91ZV9jb3VudCcKKworCVRoaXMgYXR0cmlidXRlIGZpbGUgd2lsbCBkaXNwbGF5IHRoZSBjb3VudCBvZiBVRXMgb24gdGhpcworCURJTU0gbG9jYXRlZCBpbiBjaGFubmVsIDAuCisKKworQ2hhbm5lbCAwIERJTU0gTGFiZWwgY29udHJvbCBmaWxlOgorCisJJ2NoMF9kaW1tX2xhYmVsJworCisJVGhpcyBjb250cm9sIGZpbGUgYWxsb3dzIHRoaXMgRElNTSB0byBoYXZlIGEgbGFiZWwgYXNzaWduZWQKKwl0byBpdC4gV2l0aCB0aGlzIGxhYmVsIGluIHRoZSBtb2R1bGUsIHdoZW4gZXJyb3JzIG9jY3VyCisJdGhlIG91dHB1dCBjYW4gcHJvdmlkZSB0aGUgRElNTSBsYWJlbCBpbiB0aGUgc3lzdGVtIGxvZy4KKwlUaGlzIGJlY29tZXMgdml0YWwgZm9yIHBhbmljIGV2ZW50cyB0byBpc29sYXRlIHRoZQorCWNhdXNlIG9mIHRoZSBVRSBldmVudC4KKworCURJTU0gTGFiZWxzIG11c3QgYmUgYXNzaWduZWQgYWZ0ZXIgYm9vdGluZywgd2l0aCBpbmZvcm1hdGlvbgorCXRoYXQgY29ycmVjdGx5IGlkZW50aWZpZXMgdGhlIHBoeXNpY2FsIHNsb3Qgd2l0aCBpdHMKKwlzaWxrIHNjcmVlbiBsYWJlbC4gVGhpcyBpbmZvcm1hdGlvbiBpcyBjdXJyZW50bHkgdmVyeQorCW1vdGhlcmJvYXJkIHNwZWNpZmljIGFuZCBkZXRlcm1pbmF0aW9uIG9mIHRoaXMgaW5mb3JtYXRpb24KKwltdXN0IG9jY3VyIGluIHVzZXJsYW5kIGF0IHRoaXMgdGltZS4KKworCitDaGFubmVsIDEgQ0UgQ291bnQgYXR0cmlidXRlIGZpbGU6CisKKwknY2gxX2NlX2NvdW50JworCisJVGhpcyBhdHRyaWJ1dGUgZmlsZSB3aWxsIGRpc3BsYXkgdGhlIGNvdW50IG9mIENFcyBvbiB0aGlzCisJRElNTSBsb2NhdGVkIGluIGNoYW5uZWwgMS4KKworCitDaGFubmVsIDEgVUUgQ291bnQgYXR0cmlidXRlIGZpbGU6CisKKwknY2gxX3VlX2NvdW50JworCisJVGhpcyBhdHRyaWJ1dGUgZmlsZSB3aWxsIGRpc3BsYXkgdGhlIGNvdW50IG9mIFVFcyBvbiB0aGlzCisJRElNTSBsb2NhdGVkIGluIGNoYW5uZWwgMC4KKworCitDaGFubmVsIDEgRElNTSBMYWJlbCBjb250cm9sIGZpbGU6CisKKwknY2gxX2RpbW1fbGFiZWwnCisKKwlUaGlzIGNvbnRyb2wgZmlsZSBhbGxvd3MgdGhpcyBESU1NIHRvIGhhdmUgYSBsYWJlbCBhc3NpZ25lZAorCXRvIGl0LiBXaXRoIHRoaXMgbGFiZWwgaW4gdGhlIG1vZHVsZSwgd2hlbiBlcnJvcnMgb2NjdXIKKwl0aGUgb3V0cHV0IGNhbiBwcm92aWRlIHRoZSBESU1NIGxhYmVsIGluIHRoZSBzeXN0ZW0gbG9nLgorCVRoaXMgYmVjb21lcyB2aXRhbCBmb3IgcGFuaWMgZXZlbnRzIHRvIGlzb2xhdGUgdGhlCisJY2F1c2Ugb2YgdGhlIFVFIGV2ZW50LgorCisJRElNTSBMYWJlbHMgbXVzdCBiZSBhc3NpZ25lZCBhZnRlciBib290aW5nLCB3aXRoIGluZm9ybWF0aW9uCisJdGhhdCBjb3JyZWN0bHkgaWRlbnRpZmllcyB0aGUgcGh5c2ljYWwgc2xvdCB3aXRoIGl0cworCXNpbGsgc2NyZWVuIGxhYmVsLiBUaGlzIGluZm9ybWF0aW9uIGlzIGN1cnJlbnRseSB2ZXJ5CisJbW90aGVyYm9hcmQgc3BlY2lmaWMgYW5kIGRldGVybWluYXRpb24gb2YgdGhpcyBpbmZvcm1hdGlvbgorCW11c3Qgb2NjdXIgaW4gdXNlcmxhbmQgYXQgdGhpcyB0aW1lLgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1NZU1RFTSBMT0dHSU5HCisKK0lmIGxvZ2dpbmcgZm9yIFVFcyBhbmQgQ0VzIGFyZSBlbmFibGVkIHRoZW4gc3lzdGVtIGxvZ3Mgd2lsbCBoYXZlCitlcnJvciBub3RpY2VzIGluZGljYXRpbmcgZXJyb3JzIHRoYXQgaGF2ZSBiZWVuIGRldGVjdGVkOgorCitNQzA6IENFIHBhZ2UgMHgyODMsIG9mZnNldCAweGNlMCwgZ3JhaW4gOCwgc3luZHJvbWUgMHg2ZWMzLCByb3cgMCwKK2NoYW5uZWwgMSAiRElNTV9CMSI6IGFtZDc2eF9lZGFjCisKK01DMDogQ0UgcGFnZSAweDFlNSwgb2Zmc2V0IDB4ZmIwLCBncmFpbiA4LCBzeW5kcm9tZSAweGI3NDEsIHJvdyAwLAorY2hhbm5lbCAxICJESU1NX0IxIjogYW1kNzZ4X2VkYWMKKworCitUaGUgc3RydWN0dXJlIG9mIHRoZSBtZXNzYWdlIGlzOgorCXRoZSBtZW1vcnkgY29udHJvbGxlcgkJCShNQzApCisJRXJyb3IgdHlwZQkJCQkoQ0UpCisJbWVtb3J5IHBhZ2UJCQkJKDB4MjgzKQorCW9mZnNldCBpbiB0aGUgcGFnZQkJCSgweGNlMCkKKwl0aGUgYnl0ZSBncmFudWxhcml0eSAJCQkoZ3JhaW4gOCkKKwkJb3IgcmVzb2x1dGlvbiBvZiB0aGUgZXJyb3IKKwl0aGUgZXJyb3Igc3luZHJvbWUJCQkoMHhiNzQxKQorCW1lbW9yeSByb3cJCQkJKHJvdyAwKQorCW1lbW9yeSBjaGFubmVsCQkJCShjaGFubmVsIDEpCisJRElNTSBsYWJlbCwgaWYgc2V0IHByaW9yCQkoRElNTSBCMQorCWFuZCB0aGVuIGFuIG9wdGlvbmFsLCBkcml2ZXItc3BlY2lmaWMgbWVzc2FnZSB0aGF0IG1heQorCQloYXZlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCisKK0JvdGggVUVzIGFuZCBDRXMgd2l0aCBubyBpbmZvIHdpbGwgbGFjayBhbGwgYnV0IG1lbW9yeSBjb250cm9sbGVyLAorZXJyb3IgdHlwZSwgYSBub3RpY2Ugb2YgIm5vIGluZm8iIGFuZCB0aGVuIGFuIG9wdGlvbmFsLAorZHJpdmVyLXNwZWNpZmljIGVycm9yIG1lc3NhZ2UuCisKKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitQQ0kgQnVzIFBhcml0eSBEZXRlY3Rpb24KKworCitPbiBIZWFkZXIgVHlwZSAwMCBkZXZpY2VzIHRoZSBwcmltYXJ5IHN0YXR1cyBpcyBsb29rZWQgYXQKK2ZvciBhbnkgcGFyaXR5IGVycm9yIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBQYXJpdHkgaXMgZW5hYmxlZCBvbiB0aGUKK2RldmljZS4gIChUaGUgc3BlYyBpbmRpY2F0ZXMgcGFyaXR5IGlzIGdlbmVyYXRlZCBpbiBzb21lIGNhc2VzKS4KK09uIEhlYWRlciBUeXBlIDAxIGJyaWRnZXMsIHRoZSBzZWNvbmRhcnkgc3RhdHVzIHJlZ2lzdGVyIGlzIGFsc28KK2xvb2tlZCBhdCB0byBzZWUgaWYgcGFyaXR5IG9jdXJyZWQgb24gdGhlIGJ1cyBvbiB0aGUgb3RoZXIgc2lkZSBvZgordGhlIGJyaWRnZS4KKworCitTWVNGUyBDT05GSUdVUkFUSU9OCisKK1VuZGVyIC9zeXMvZGV2aWNlcy9zeXN0ZW0vZWRhYy9wY2kgYXJlIGNvbnRyb2wgYW5kIGF0dHJpYnV0ZSBmaWxlcyBhcyBmb2xsb3dzOgorCisKK0VuYWJsZS9EaXNhYmxlIFBDSSBQYXJpdHkgY2hlY2tpbmcgY29udHJvbCBmaWxlOgorCisJJ2NoZWNrX3BjaV9wYXJpdHknCisKKworCVRoaXMgY29udHJvbCBmaWxlIGVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFBDSSBCdXMgUGFyaXR5IHNjYW5uaW5nCisJb3BlcmF0aW9uLiBXcml0aW5nIGEgMSB0byB0aGlzIGZpbGUgZW5hYmxlcyB0aGUgc2Nhbm5pbmcuIFdyaXRpbmcKKwlhIDAgdG8gdGhpcyBmaWxlIGRpc2FibGVzIHRoZSBzY2FubmluZy4KKworCUVuYWJsZToKKwllY2hvICIxIiA+L3N5cy9kZXZpY2VzL3N5c3RlbS9lZGFjL3BjaS9jaGVja19wY2lfcGFyaXR5CisKKwlEaXNhYmxlOgorCWVjaG8gIjAiID4vc3lzL2RldmljZXMvc3lzdGVtL2VkYWMvcGNpL2NoZWNrX3BjaV9wYXJpdHkKKworCisKK1BhbmljIG9uIFBDSSBQQVJJVFkgRXJyb3I6CisKKwkncGFuaWNfb25fcGNpX3Bhcml0eScKKworCisJVGhpcyBjb250cm9sIGZpbGVzIGVuYWJsZXMgb3IgZGlzYWJsZXMgcGFuaWMnaW5nIHdoZW4gYSBwYXJpdHkKKwllcnJvciBoYXMgYmVlbiBkZXRlY3RlZC4KKworCisJbW9kdWxlL2tlcm5lbCBwYXJhbWV0ZXI6IHBhbmljX29uX3BjaV9wYXJpdHk9WzB8MV0KKworCUVuYWJsZToKKwllY2hvICIxIiA+L3N5cy9kZXZpY2VzL3N5c3RlbS9lZGFjL3BjaS9wYW5pY19vbl9wY2lfcGFyaXR5CisKKwlEaXNhYmxlOgorCWVjaG8gIjAiID4vc3lzL2RldmljZXMvc3lzdGVtL2VkYWMvcGNpL3BhbmljX29uX3BjaV9wYXJpdHkKKworCitQYXJpdHkgQ291bnQ6CisKKwkncGNpX3Bhcml0eV9jb3VudCcKKworCVRoaXMgYXR0cmlidXRlIGZpbGUgd2lsbCBkaXNwbGF5IHRoZSBudW1iZXIgb2YgcGFyaXR5IGVycm9ycyB0aGF0CisJaGF2ZSBiZWVuIGRldGVjdGVkLgorCisKKworUENJIERldmljZSBXaGl0ZWxpc3Q6CisKKwkncGNpX3Bhcml0eV93aGl0ZWxpc3QnCisKKwlUaGlzIGNvbnRyb2wgZmlsZSBhbGxvd3MgZm9yIGFuIGV4cGxpY2l0IGxpc3Qgb2YgUENJIGRldmljZXMgdG8gYmUKKwlzY2FubmVkIGZvciBwYXJpdHkgZXJyb3JzLiBPbmx5IGRldmljZXMgZm91bmQgb24gdGhpcyBsaXN0IHdpbGwKKwliZSBleGFtaW5lZC4gIFRoZSBsaXN0IGlzIGEgbGluZSBvZiBoZXhhZGVjaW1lbCBWRU5ET1IgYW5kIERFVklDRQorCUlEIHR1cGxlczoKKworCTEwMjI6NzQ1MCwxNDM0OjE2YTYKKworCU9uZSBvciBtb3JlIGNhbiBiZSBpbnNlcnRlZCwgc2VwZXJhdGVkIGJ5IGEgY29tbWEuCisKKwlUbyB3cml0ZSB0aGUgYWJvdmUgbGlzdCBkb2luZyB0aGUgZm9sbG93aW5nIGFzIG9uZSBjb21tYW5kIGxpbmU6CisKKwllY2hvICIxMDIyOjc0NTAsMTQzNDoxNmE2IgorCQk+IC9zeXMvZGV2aWNlcy9zeXN0ZW0vZWRhYy9wY2kvcGNpX3Bhcml0eV93aGl0ZWxpc3QKKworCisKKwlUbyBkaXNwbGF5IHdoYXQgdGhlIHdoaXRlbGlzdCBpcywgc2ltcGx5ICdjYXQnIHRoZSBzYW1lIGZpbGUuCisKKworUENJIERldmljZSBCbGFja2xpc3Q6CisKKwkncGNpX3Bhcml0eV9ibGFja2xpc3QnCisKKwlUaGlzIGNvbnRyb2wgZmlsZSBhbGxvd3MgZm9yIGEgbGlzdCBvZiBQQ0kgZGV2aWNlcyB0byBiZQorCXNraXBwZWQgZm9yIHNjYW5uaW5nLgorCVRoZSBsaXN0IGlzIGEgbGluZSBvZiBoZXhhZGVjaW1lbCBWRU5ET1IgYW5kIERFVklDRSBJRCB0dXBsZXM6CisKKwkxMDIyOjc0NTAsMTQzNDoxNmE2CisKKwlPbmUgb3IgbW9yZSBjYW4gYmUgaW5zZXJ0ZWQsIHNlcGVyYXRlZCBieSBhIGNvbW1hLgorCisJVG8gd3JpdGUgdGhlIGFib3ZlIGxpc3QgZG9pbmcgdGhlIGZvbGxvd2luZyBhcyBvbmUgY29tbWFuZCBsaW5lOgorCisJZWNobyAiMTAyMjo3NDUwLDE0MzQ6MTZhNiIKKwkJPiAvc3lzL2RldmljZXMvc3lzdGVtL2VkYWMvcGNpL3BjaV9wYXJpdHlfYmxhY2tsaXN0CisKKworCVRvIGRpc3BsYXkgd2hhdCB0aGUgd2hpdGVsaXN0IGN1cnJlbnQgY29udGF0aW5zLAorCXNpbXBseSAnY2F0JyB0aGUgc2FtZSBmaWxlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitQQ0kgVmVuZG9yIGFuZCBEZXZpY2VzIElEcyBjYW4gYmUgb2J0YWluZWQgd2l0aCB0aGUgbHNwY2kgY29tbWFuZC4gVXNpbmcKK3RoZSAtbiBvcHRpb24gbHNwY2kgd2lsbCBkaXNwbGF5IHRoZSB2ZW5kb3IgYW5kIGRldmljZSBJRHMuIFRoZSBzeXN0ZW0KK2FkbWluc3RyYXRvciB3aWxsIGhhdmUgdG8gZGV0ZXJtaW5lIHdoaWNoIGRldmljZXMgc2hvdWxkIGJlIHNjYW5uZWQgb3IKK3NraXBwZWQuCisKKworCitUaGUgdHdvIGxpc3RzICh3aGl0ZSBhbmQgYmxhY2spIGFyZSBwcmlvcml0aXplZC4gYmxhY2tsaXN0IGlzIHRoZSBsb3dlcgorcHJpb3JpdHkgYW5kIHdpbGwgTk9UIGJlIHV0aWxpemVkIHdoZW4gYSB3aGl0ZWxpc3QgaGFzIGJlZW4gc2V0LgorVHVybiBPRkYgYSB3aGl0ZWxpc3QgYnkgYW4gZW1wdHkgZWNobyBjb21tYW5kOgorCisJZWNobyA+IC9zeXMvZGV2aWNlcy9zeXN0ZW0vZWRhYy9wY2kvcGNpX3Bhcml0eV93aGl0ZWxpc3QKKworYW5kIGFueSBwcmV2aW91cyBibGFja2xpc3Qgd2lsbCBiZSB1dGlsaWx6ZWQuCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHZiL2F2ZXJtZWRpYS50eHQgYi9Eb2N1bWVudGF0aW9uL2R2Yi9hdmVybWVkaWEudHh0CmluZGV4IDJkYzI2MGIuLjA2ODA3MGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZHZiL2F2ZXJtZWRpYS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kdmIvYXZlcm1lZGlhLnR4dApAQCAtMTUwLDcgKzE1MCw4IEBACiAKICAgIFRoZSBmcm9udGVuZCBtb2R1bGUgc3A4ODd4Lm8sIHJlcXVpcmVzIGFuIGV4dGVybmFsICAgZmlybXdhcmUuCiAgICBQbGVhc2UgdXNlICB0aGUgIGNvbW1hbmQgImdldF9kdmJfZmlybXdhcmUgc3A4ODd4IiB0byBkb3dubG9hZAotICAgaXQuIFRoZW4gY29weSBpdCB0byAvdXNyL2xpYi9ob3RwbHVnL2Zpcm13YXJlLgorICAgaXQuIFRoZW4gY29weSBpdCB0byAvdXNyL2xpYi9ob3RwbHVnL2Zpcm13YXJlIG9yIC9saWIvZmlybXdhcmUvCisgICAoZGVwZW5kaW5nIG9uIGNvbmZpZ3VyYXRpb24gb2YgZmlybXdhcmUgaG90cGx1ZykuCiAKIFJlY2VpdmluZyBEVkItVCBpbiBBdXN0cmFsaWEKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kdmIvZ2V0X2R2Yl9maXJtd2FyZSBiL0RvY3VtZW50YXRpb24vZHZiL2dldF9kdmJfZmlybXdhcmUKaW5kZXggYmU2ZWI0Yy4uNzVjMjhhMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kdmIvZ2V0X2R2Yl9maXJtd2FyZQorKysgYi9Eb2N1bWVudGF0aW9uL2R2Yi9nZXRfZHZiX2Zpcm13YXJlCkBAIC0yMyw3ICsyMyw3IEBACiAKIEBjb21wb25lbnRzID0gKCAic3A4ODcwIiwgInNwODg3eCIsICJ0ZGExMDA0NSIsICJ0ZGExMDA0NiIsICJhdjcxMTAiLCAiZGVjMjAwMHQiLAogCQkiZGVjMjU0MHQiLCAiZGVjMzAwMHMiLCAidnA3MDQxIiwgImRpYnVzYiIsICJueHQyMDAyIiwgIm54dDIwMDQiLAotCQkib3I1MTIxMSIsICJvcjUxMTMyX3FhbSIsICJvcjUxMTMyX3ZzYiIpOworCQkib3I1MTIxMSIsICJvcjUxMTMyX3FhbSIsICJvcjUxMTMyX3ZzYiIsICJibHVlYmlyZCIpOwogCiAjIENoZWNrIGFyZ3MKIHN5bnRheCgpIGlmIChzY2FsYXIoQEFSR1YpICE9IDEpOwpAQCAtMzQsNyArMzQsMTEgQEAKICAgICBpZiAoJGNpZCBlcSAkY29tcG9uZW50c1skaV0pIHsKIAkkb3V0ZmlsZSA9IGV2YWwoJGNpZCk7CiAJZGllICRAIGlmICRAOwotCXByaW50IFNUREVSUiAiRmlybXdhcmUgJG91dGZpbGUgZXh0cmFjdGVkIHN1Y2Nlc3NmdWxseS4gTm93IGNvcHkgaXQgdG8gZWl0aGVyIC9saWIvZmlybXdhcmUgb3IgL3Vzci9saWIvaG90cGx1Zy9maXJtd2FyZS8gKGRlcGVuZGluZyBvbiB5b3VyIGhvdHBsdWcgdmVyc2lvbikuXG4iOworCXByaW50IFNUREVSUiA8PEVPRjsKK0Zpcm13YXJlICRvdXRmaWxlIGV4dHJhY3RlZCBzdWNjZXNzZnVsbHkuCitOb3cgY29weSBpdCB0byBlaXRoZXIgL3Vzci9saWIvaG90cGx1Zy9maXJtd2FyZSBvciAvbGliL2Zpcm13YXJlCisoZGVwZW5kaW5nIG9uIGNvbmZpZ3VyYXRpb24gb2YgZmlybXdhcmUgaG90cGx1ZykuCitFT0YKIAlleGl0KDApOwogICAgIH0KIH0KQEAgLTI0Myw3ICsyNDcsNyBAQAogICAgIG15ICR0bXBkaXIgPSB0ZW1wZGlyKERJUiA9PiAiL3RtcCIsIENMRUFOVVAgPT4gMSk7CiAKICAgICBjaGVja3N0YW5kYXJkKCk7Ci0gICAgCisKICAgICB3Z2V0ZmlsZSgkc291cmNlZmlsZSwgJHVybCk7CiAgICAgdW56aXAoJHNvdXJjZWZpbGUsICR0bXBkaXIpOwogICAgIHZlcmlmeSgiJHRtcGRpci9Ta3lORVRVLnN5cyIsICRoYXNoKTsKQEAgLTMwOCw2ICszMTIsMTkgQEAKICAgICAkZndmaWxlOwogfQogCitzdWIgYmx1ZWJpcmQgeworCW15ICR1cmwgPSAiaHR0cDovL3d3dy5saW51eHR2Lm9yZy9kb3dubG9hZC9kdmIvZmlybXdhcmUvZHZiLXVzYi1ibHVlYmlyZC0wMS5mdyI7CisJbXkgJG91dGZpbGUgPSAiZHZiLXVzYi1ibHVlYmlyZC0wMS5mdyI7CisJbXkgJGhhc2ggPSAiNjU4Mzk3Y2I5ZWJhOTEwMWFmOTAzMTMwMjY3MWY0OWQiOworCisJY2hlY2tzdGFuZGFyZCgpOworCisJd2dldGZpbGUoJG91dGZpbGUsICR1cmwpOworCXZlcmlmeSgkb3V0ZmlsZSwkaGFzaCk7CisKKwkkb3V0ZmlsZTsKK30KKwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgVXRpbGl0aWVzCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHZiL3R0dXNiLWRlYy50eHQgYi9Eb2N1bWVudGF0aW9uL2R2Yi90dHVzYi1kZWMudHh0CmluZGV4IDVjMWU5ODQuLmIyZjI3MWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZHZiL3R0dXNiLWRlYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kdmIvdHR1c2ItZGVjLnR4dApAQCAtNDEsNCArNDEsNSBAQAogRm9yIDIuNiBrZXJuZWxzIHRoZSBmaXJtd2FyZSBpcyBsb2FkZWQgYXQgdGhlIHBvaW50IHRoYXQgdGhlIGRyaXZlciBtb2R1bGUgaXMKIGxvYWRlZC4gIFNlZSBsaW51eC9Eb2N1bWVudGF0aW9uL2R2Yi9maXJtd2FyZS50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKLUNvcHkgdGhlIHRocmVlIGZpbGVzIGRvd25sb2FkZWQgYWJvdmUgaW50byB0aGUgL3Vzci9saWIvaG90cGx1Zy9maXJtd2FyZSBkaXJlY3RvcnkuCitDb3B5IHRoZSB0aHJlZSBmaWxlcyBkb3dubG9hZGVkIGFib3ZlIGludG8gdGhlIC91c3IvbGliL2hvdHBsdWcvZmlybXdhcmUgb3IKKy9saWIvZmlybXdhcmUgZGlyZWN0b3J5IChkZXBlbmRpbmcgb24gY29uZmlndXJhdGlvbiBvZiBmaXJtd2FyZSBob3RwbHVnKS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi9idWdzIGIvRG9jdW1lbnRhdGlvbi9mYi9jeWJsYWZiL2J1Z3MKaW5kZXggZjkwY2M2Ni4uOTQ0M2E2ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mYi9jeWJsYWZiL2J1Z3MKKysrIGIvRG9jdW1lbnRhdGlvbi9mYi9jeWJsYWZiL2J1Z3MKQEAgLTExLDQgKzExLDMgQEAKIAogQWxsIExDRCBzdHVmZiBpcyB1bnRlc3RlZC4gSWYgaXQgd29ya2VkIGluIHRyaWRlbnRmYiwgaXQgc2hvdWxkIHdvcmsgaW4KIGN5YmxhZmIuIFBsZWFzZSB0ZXN0IGFuZCByZXBvcnQgdGhlIHJlc3VsdHMgdG8gS251dF9QZXRlcnNlbkB0LW9ubGluZS5kZS4KLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mYi9jeWJsYWZiL2ZiLm1vZGVzIGIvRG9jdW1lbnRhdGlvbi9mYi9jeWJsYWZiL2ZiLm1vZGVzCmluZGV4IGNmNDM1MWYuLmZlMGU1MjIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi9mYi5tb2RlcworKysgYi9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvZmIubW9kZXMKQEAgLTE0LDE0MiArMTQsMTQxIEBACiAjCiAKIG1vZGUgIjY0MHg0ODAtNTAiCi0gICAgZ2VvbWV0cnkgNjQwIDQ4MCA2NDAgMzc1NiA4CisgICAgZ2VvbWV0cnkgNjQwIDQ4MCAyMDQ4IDQwOTYgOAogICAgIHRpbWluZ3MgNDc2MTkgNDI5NDk2NzI1NiAyNCAxNyAwIDIxNiAzCiBlbmRtb2RlCiAKIG1vZGUgIjY0MHg0ODAtNjAiCi0gICAgZ2VvbWV0cnkgNjQwIDQ4MCA2NDAgMzc1NiA4CisgICAgZ2VvbWV0cnkgNjQwIDQ4MCAyMDQ4IDQwOTYgOAogICAgIHRpbWluZ3MgMzk2ODIgNDI5NDk2NzI1NiAyNCAxNyAwIDIxNiAzCiBlbmRtb2RlCiAKIG1vZGUgIjY0MHg0ODAtNzAiCi0gICAgZ2VvbWV0cnkgNjQwIDQ4MCA2NDAgMzc1NiA4CisgICAgZ2VvbWV0cnkgNjQwIDQ4MCAyMDQ4IDQwOTYgOAogICAgIHRpbWluZ3MgMzQwMTMgNDI5NDk2NzI1NiAyNCAxNyAwIDIxNiAzCiBlbmRtb2RlCiAKIG1vZGUgIjY0MHg0ODAtNzIiCi0gICAgZ2VvbWV0cnkgNjQwIDQ4MCA2NDAgMzc1NiA4CisgICAgZ2VvbWV0cnkgNjQwIDQ4MCAyMDQ4IDQwOTYgOAogICAgIHRpbWluZ3MgMzMwNjggNDI5NDk2NzI1NiAyNCAxNyAwIDIxNiAzCiBlbmRtb2RlCiAKIG1vZGUgIjY0MHg0ODAtNzUiCi0gICAgZ2VvbWV0cnkgNjQwIDQ4MCA2NDAgMzc1NiA4CisgICAgZ2VvbWV0cnkgNjQwIDQ4MCAyMDQ4IDQwOTYgOAogICAgIHRpbWluZ3MgMzE3NDYgNDI5NDk2NzI1NiAyNCAxNyAwIDIxNiAzCiBlbmRtb2RlCiAKIG1vZGUgIjY0MHg0ODAtODAiCi0gICAgZ2VvbWV0cnkgNjQwIDQ4MCA2NDAgMzc1NiA4CisgICAgZ2VvbWV0cnkgNjQwIDQ4MCAyMDQ4IDQwOTYgOAogICAgIHRpbWluZ3MgMjk3NjEgNDI5NDk2NzI1NiAyNCAxNyAwIDIxNiAzCiBlbmRtb2RlCiAKIG1vZGUgIjY0MHg0ODAtODUiCi0gICAgZ2VvbWV0cnkgNjQwIDQ4MCA2NDAgMzc1NiA4CisgICAgZ2VvbWV0cnkgNjQwIDQ4MCAyMDQ4IDQwOTYgOAogICAgIHRpbWluZ3MgMjgwMTEgNDI5NDk2NzI1NiAyNCAxNyAwIDIxNiAzCiBlbmRtb2RlCiAKIG1vZGUgIjgwMHg2MDAtNTAiCi0gICAgZ2VvbWV0cnkgODAwIDYwMCA4MDAgMzIyMSA4CisgICAgZ2VvbWV0cnkgODAwIDYwMCAyMDQ4IDQwOTYgOAogICAgIHRpbWluZ3MgMzAzMDMgOTYgMjQgMTQgMCAxMzYgMTEKIGVuZG1vZGUKIAogbW9kZSAiODAweDYwMC02MCIKLSAgICBnZW9tZXRyeSA4MDAgNjAwIDgwMCAzMjIxIDgKKyAgICBnZW9tZXRyeSA4MDAgNjAwIDIwNDggNDA5NiA4CiAgICAgdGltaW5ncyAyNTI1MiA5NiAyNCAxNCAwIDEzNiAxMQogZW5kbW9kZQogCiBtb2RlICI4MDB4NjAwLTcwIgotICAgIGdlb21ldHJ5IDgwMCA2MDAgODAwIDMyMjEgOAorICAgIGdlb21ldHJ5IDgwMCA2MDAgMjA0OCA0MDk2IDgKICAgICB0aW1pbmdzIDIxNjQ1IDk2IDI0IDE0IDAgMTM2IDExCiBlbmRtb2RlCiAKIG1vZGUgIjgwMHg2MDAtNzIiCi0gICAgZ2VvbWV0cnkgODAwIDYwMCA4MDAgMzIyMSA4CisgICAgZ2VvbWV0cnkgODAwIDYwMCAyMDQ4IDQwOTYgOAogICAgIHRpbWluZ3MgMjEwNDMgOTYgMjQgMTQgMCAxMzYgMTEKIGVuZG1vZGUKIAogbW9kZSAiODAweDYwMC03NSIKLSAgICBnZW9tZXRyeSA4MDAgNjAwIDgwMCAzMjIxIDgKKyAgICBnZW9tZXRyeSA4MDAgNjAwIDIwNDggNDA5NiA4CiAgICAgdGltaW5ncyAyMDIwMiA5NiAyNCAxNCAwIDEzNiAxMQogZW5kbW9kZQogCiBtb2RlICI4MDB4NjAwLTgwIgotICAgIGdlb21ldHJ5IDgwMCA2MDAgODAwIDMyMjEgOAorICAgIGdlb21ldHJ5IDgwMCA2MDAgMjA0OCA0MDk2IDgKICAgICB0aW1pbmdzIDE4OTM5IDk2IDI0IDE0IDAgMTM2IDExCiBlbmRtb2RlCiAKIG1vZGUgIjgwMHg2MDAtODUiCi0gICAgZ2VvbWV0cnkgODAwIDYwMCA4MDAgMzIyMSA4CisgICAgZ2VvbWV0cnkgODAwIDYwMCAyMDQ4IDQwOTYgOAogICAgIHRpbWluZ3MgMTc4MjUgOTYgMjQgMTQgMCAxMzYgMTEKIGVuZG1vZGUKIAogbW9kZSAiMTAyNHg3NjgtNTAiCi0gICAgZ2VvbWV0cnkgMTAyNCA3NjggMTAyNCAyODE1IDgKKyAgICBnZW9tZXRyeSAxMDI0IDc2OCAyMDQ4IDQwOTYgOAogICAgIHRpbWluZ3MgMTkwNTQgMTQ0IDI0IDI5IDAgMTIwIDMKIGVuZG1vZGUKIAogbW9kZSAiMTAyNHg3NjgtNjAiCi0gICAgZ2VvbWV0cnkgMTAyNCA3NjggMTAyNCAyODE1IDgKKyAgICBnZW9tZXRyeSAxMDI0IDc2OCAyMDQ4IDQwOTYgOAogICAgIHRpbWluZ3MgMTU4ODAgMTQ0IDI0IDI5IDAgMTIwIDMKIGVuZG1vZGUKIAogbW9kZSAiMTAyNHg3NjgtNzAiCi0gICAgZ2VvbWV0cnkgMTAyNCA3NjggMTAyNCAyODE1IDgKKyAgICBnZW9tZXRyeSAxMDI0IDc2OCAyMDQ4IDQwOTYgOAogICAgIHRpbWluZ3MgMTM2MTAgMTQ0IDI0IDI5IDAgMTIwIDMKIGVuZG1vZGUKIAogbW9kZSAiMTAyNHg3NjgtNzIiCi0gICAgZ2VvbWV0cnkgMTAyNCA3NjggMTAyNCAyODE1IDgKKyAgICBnZW9tZXRyeSAxMDI0IDc2OCAyMDQ4IDQwOTYgOAogICAgIHRpbWluZ3MgMTMyMzIgMTQ0IDI0IDI5IDAgMTIwIDMKIGVuZG1vZGUKIAogbW9kZSAiMTAyNHg3NjgtNzUiCi0gICAgZ2VvbWV0cnkgMTAyNCA3NjggMTAyNCAyODE1IDgKKyAgICBnZW9tZXRyeSAxMDI0IDc2OCAyMDQ4IDQwOTYgOAogICAgIHRpbWluZ3MgMTI3MDMgMTQ0IDI0IDI5IDAgMTIwIDMKIGVuZG1vZGUKIAogbW9kZSAiMTAyNHg3NjgtODAiCi0gICAgZ2VvbWV0cnkgMTAyNCA3NjggMTAyNCAyODE1IDgKKyAgICBnZW9tZXRyeSAxMDI0IDc2OCAyMDQ4IDQwOTYgOAogICAgIHRpbWluZ3MgMTE5MTAgMTQ0IDI0IDI5IDAgMTIwIDMKIGVuZG1vZGUKIAogbW9kZSAiMTAyNHg3NjgtODUiCi0gICAgZ2VvbWV0cnkgMTAyNCA3NjggMTAyNCAyODE1IDgKKyAgICBnZW9tZXRyeSAxMDI0IDc2OCAyMDQ4IDQwOTYgOAogICAgIHRpbWluZ3MgMTEyMDkgMTQ0IDI0IDI5IDAgMTIwIDMKIGVuZG1vZGUKIAogbW9kZSAiMTI4MHgxMDI0LTUwIgotICAgIGdlb21ldHJ5IDEyODAgMTAyNCAxMjgwIDI2NjIgOAorICAgIGdlb21ldHJ5IDEyODAgMTAyNCAyMDQ4IDQwOTYgOAogICAgIHRpbWluZ3MgMTExMTQgMjMyIDE2IDM5IDAgMTYwIDMKIGVuZG1vZGUKIAogbW9kZSAiMTI4MHgxMDI0LTYwIgotICAgIGdlb21ldHJ5IDEyODAgMTAyNCAxMjgwIDI2NjIgOAorICAgIGdlb21ldHJ5IDEyODAgMTAyNCAyMDQ4IDQwOTYgOAogICAgIHRpbWluZ3MgOTI2MiAyMzIgMTYgMzkgMCAxNjAgMwogZW5kbW9kZQogCiBtb2RlICIxMjgweDEwMjQtNzAiCi0gICAgZ2VvbWV0cnkgMTI4MCAxMDI0IDEyODAgMjY2MiA4CisgICAgZ2VvbWV0cnkgMTI4MCAxMDI0IDIwNDggNDA5NiA4CiAgICAgdGltaW5ncyA3OTM5IDIzMiAxNiAzOSAwIDE2MCAzCiBlbmRtb2RlCiAKIG1vZGUgIjEyODB4MTAyNC03MiIKLSAgICBnZW9tZXRyeSAxMjgwIDEwMjQgMTI4MCAyNjYyIDgKKyAgICBnZW9tZXRyeSAxMjgwIDEwMjQgMjA0OCA0MDk2IDgKICAgICB0aW1pbmdzIDc3MTkgMjMyIDE2IDM5IDAgMTYwIDMKIGVuZG1vZGUKIAogbW9kZSAiMTI4MHgxMDI0LTc1IgotICAgIGdlb21ldHJ5IDEyODAgMTAyNCAxMjgwIDI2NjIgOAorICAgIGdlb21ldHJ5IDEyODAgMTAyNCAyMDQ4IDQwOTYgOAogICAgIHRpbWluZ3MgNzQxMCAyMzIgMTYgMzkgMCAxNjAgMwogZW5kbW9kZQogCiBtb2RlICIxMjgweDEwMjQtODAiCi0gICAgZ2VvbWV0cnkgMTI4MCAxMDI0IDEyODAgMjY2MiA4CisgICAgZ2VvbWV0cnkgMTI4MCAxMDI0IDIwNDggNDA5NiA4CiAgICAgdGltaW5ncyA2OTQ2IDIzMiAxNiAzOSAwIDE2MCAzCiBlbmRtb2RlCiAKIG1vZGUgIjEyODB4MTAyNC04NSIKLSAgICBnZW9tZXRyeSAxMjgwIDEwMjQgMTI4MCAyNjYyIDgKKyAgICBnZW9tZXRyeSAxMjgwIDEwMjQgMjA0OCA0MDk2IDgKICAgICB0aW1pbmdzIDY1MzggMjMyIDE2IDM5IDAgMTYwIDMKIGVuZG1vZGUKLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mYi9jeWJsYWZiL3BlcmZvcm1hbmNlIGIvRG9jdW1lbnRhdGlvbi9mYi9jeWJsYWZiL3BlcmZvcm1hbmNlCmluZGV4IGViNGU0N2EuLjhkMTVkNWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi9wZXJmb3JtYW5jZQorKysgYi9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvcGVyZm9ybWFuY2UKQEAgLTc3LDQgKzc3LDMgQEAKIHwJICAgIHwJCSAgICAgIHwgCQl8CQkgIHwKIHwJICAgIHwJCSAgICAgIHwgCQl8CQkgIHwKICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSsKLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mYi9jeWJsYWZiL3RvZG8gYi9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvdG9kbwppbmRleCA4MGZiMmY4Li5jNWY2ZDBlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvdG9kbworKysgYi9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvdG9kbwpAQCAtMjIsMTEgKzIyLDEwIEBACiAJCQkJZXZlcnl0aGluZyBlbHNlIGlzIGRvbmUgdXNpbmcgY29sb3IgZXhwYW5kaW5nCiAJCQkJYmxpdHRpbmcgb2YgMWJwcCBjaGFyYWN0ZXIgYml0bWFwcy4KIAoteHBhbm5pbmcJCQlXaG8gbmVlZHMgaXQ/Ci0KIGlvY3RscwkJCQlXaG8gbmVlZHMgaXQ/CiAKLVRWLW91dAkJCQlXaWxsIGJlIGRvbmUgbGF0ZXIKK1RWLW91dAkJCQlXaWxsIGJlIGRvbmUgbGF0ZXIuIFVzZSAidmdhPSAiIGF0IGJvb3QgdGltZQorCQkJCXRvIHNldCBhIHN1aXRhYmxlIHZpZGVvIG1vZGUuCiAKID8/PwkJCQlGZWVsIGZyZWUgdG8gY29udGFjdCBtZSBpZiB5b3UgaGF2ZSBhbnkKIAkJCQlmZWF0dXJlIHJlcXVlc3RzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvdXNhZ2UgYi9Eb2N1bWVudGF0aW9uL2ZiL2N5YmxhZmIvdXNhZ2UKaW5kZXggZTYyN2M4Zi4uYTM5YmIzZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mYi9jeWJsYWZiL3VzYWdlCisrKyBiL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi91c2FnZQpAQCAtNDAsNiArNDAsMTYgQEAKIAlOb25lIG9mIHRoZSBtb2RlcyBwb3NzaWJsZSB0byBzZWxlY3QgYXMgc3RhcnR1cCBtb2RlcyBhcmUgYWZmZWN0ZWQgYnkKIAl0aGUgcHJvYmxlbXMgZGVzY3JpYmVkIGF0IHRoZSBlbmQgb2YgdGhlIG5leHQgc3Vic2VjdGlvbi4KIAorCUZvciBhbGwgc3RhcnR1cCBtb2RlcyBjeWJsYWZiIGNob29zZXMgYSB2aXJ0dWFsIHggcmVzb2x1dGlvbiBvZiAyMDQ4LAorCXRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBtb2RlIDEyODB4MTAyNCBpbiBjb21iaW5hdGlvbiB3aXRoIDMyIGJwcC4gVGhpcworCWFsbG93cyB5d3JhcCBzY3JvbGxpbmcgZm9yIGFsbCB0aG9zZSBtb2RlcyBpZiByb3RhdGlvbiBpcyAwIG9yIDIsIGFuZAorCWFsc28gZmFzdCBzY3JvbGxpbmcgaWYgcm90YXRpb24gaXMgMSBvciAzLiBUaGUgZGVmYXVsdCB2aXJ0dWFsIHkgcmVzby0KKwlsdXRpb24gaXMgNDA5NiBmb3IgYnBwID09IDgsIDIwNDggZm9yIGJwcD09MTYgYW5kIDEwMjQgZm9yIGJwcCA9PSAzMiwKKwlhZ2FpbiB3aXRoIHRoZSBvbmx5IGV4Y2VwdGlvbiBvZiAxMjgweDEwMjQgYXQgMzIgYnBwLgorCisJUGxlYXNlIGRvIHNldCB5b3VyIHZpZGVvIG1lbW9yeSBzaXplIHRvIDggTWIgaW4gdGhlIEJpb3Mgc2V0dXAuIE90aGVyCisJdmFsdWVzIHdpbGwgd29yaywgYnV0IHBlcmZvcm1hY2UgaXMgZGVjcmVhc2VkIGZvciBhIGxvdCBvZiBtb2Rlcy4KKwogCU1vZGUgY2hhbmdlcyB1c2luZyBmYnNldAogCT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC01NCwyMCArNjQsMjYgQEAKIAkJLSBpZiBhIGZsYXQgcGFuZWwgaXMgZm91bmQsIGN5YmxhZmIgZG9lcyBub3QgYWxsb3cgeW91CiAJCSAgdG8gcHJvZ3JhbSBhIHJlc29sdXRpb24gaGlnaGVyIHRoYW4gdGhlIHBoeXNpY2FsCiAJCSAgcmVzb2x1dGlvbiBvZiB0aGUgZmxhdCBwYW5lbCBtb25pdG9yCi0JCS0gY3libGFmYiBkb2VzIG5vdCBhbGxvdyB4cmVzIHRvIGRpZmZlciBmcm9tIHhyZXNfdmlydHVhbAogCQktIGN5YmxhZmIgZG9lcyBub3QgYWxsb3cgdmNsayB0byBleGNlZWQgMjMwIE1Iei4gQXMgMzIgYnBwCiAJCSAgYW5kIChjdXJyZW50bHkpIDI0IGJpdCBtb2RlcyB1c2UgYSBkb3VibGVkIHZjbGsgaW50ZXJuYWxseSwKIAkJICB0aGUgZG90Y2xvY2sgbGltaXQgYXMgc2VlbiBieSBmYnNldCBpcyAxMTUgTUh6IGZvciB0aG9zZQogCQkgIG1vZGVzIGFuZCAyMzAgTUh6IGZvciA4IGFuZCAxNiBicHAgbW9kZXMuCisJCS0gY3libGFmYiB3aWxsIGFsbG93IHlvdSB0byBzZWxlY3QgdmVyeSBoaWdoIHJlc29sdXRpb25zIGFzCisJCSAgbG9uZyBhcyB0aGUgaGFyZHdhcmUgY2FuIGJlIHByb2dyYW1tZWQgdG8gdGhlc2UgbW9kZXMuIFRoZQorCQkgIGRvY3VtZW50ZWQgbGltaXQgMTYwMHgxMjAwIGlzIG5vdCBlbmZvcmNlZCwgYnV0IGRvbid0IGV4cGVjdAorCQkgIHBlcmZlY3Qgc2lnbmFsIHF1YWxpdHkuCiAKLQlBbnkgcmVxdWVzdCB0aGF0IHZpb2xhdGVzIHRoZSBydWxlcyBnaXZlbiBhYm92ZSB3aWxsIGJlIGlnbm9yZWQgYW5kCi0JZmJzZXQgd2lsbCByZXR1cm4gYW4gZXJyb3IuCisJQW55IHJlcXVlc3QgdGhhdCB2aW9sYXRlcyB0aGUgcnVsZXMgZ2l2ZW4gYWJvdmUgd2lsbCBiZSBlaXRoZXIgY2hhbmdlZAorCXRvIHNvbWV0aGluZyB0aGUgaGFyZHdhcmUgc3VwcG9ydHMgb3IgYW4gZXJyb3IgdmFsdWUgd2lsbCBiZSByZXR1cm5lZC4KIAogCUlmIHlvdSBwcm9ncmFtIGEgdmlydHVhbCB5IHJlc29sdXRpb24gaGlnaGVyIHRoYW4gdGhlIGhhcmR3YXJlIGxpbWl0LAogCWN5YmxhZmIgd2lsbCBzaWxlbnRseSBkZWNyZWFzZSB0aGF0IHZhbHVlIHRvIHRoZSBoaWdoZXN0IHBvc3NpYmxlCi0JdmFsdWUuCisJdmFsdWUuIFRoZSBzYW1lIGlzIHRydWUgZm9yIGEgdmlydHVhbCB4IHJlc29sdXRpb24gdGhhdCBpcyBub3QKKwlzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlLiBDeWJsYWZiIHRyaWVzIHRvIGFkYXB0IHZ5cmVzIGZpcnN0IGJlY2F1c2UKKwl2eHJlcyBkZWNpZGVzIGlmIHl3cmFwIHNjcm9sbGluZyBpcyBwb3NzaWJsZSBvciBub3QuCiAKLQlBdHRlbXB0cyB0byBkaXNhYmxlIGFjY2VsZXJhdGlvbiBhcmUgaWdub3JlZC4KKwlBdHRlbXB0cyB0byBkaXNhYmxlIGFjY2VsZXJhdGlvbiBhcmUgaWdub3JlZCwgSSBiZWxpZXZlIHRoYXQgdGhpcyBpcworCXNhZmUuCiAKIAlTb21lIHZpZGVvIG1vZGVzIHRoYXQgc2hvdWxkIHdvcmsgZG8gbm90IHdvcmsgYXMgZXhwZWN0ZWQuIElmIHlvdSB1c2UKIAl0aGUgc3RhbmRhcmQgZmIubW9kZXMsIGZic2V0IDY0MHg0ODAtNjAgd2lsbCBwcm9ncmFtIHRoYXQgbW9kZSwgYnV0CkBAIC0xMjksMTAgKzE0NSw2IEBACiB2ZXJib3NpdHkJMCBpcyB0aGUgZGVmYXVsdCwgaW5jcmVhc2UgdG8gYXQgbGVhc3QgMiBmb3IgZXZlcnkKIAkJYnVnIHJlcG9ydCEKIAotdmVzYWZiCQlhbGxvd3MgY3libGFmYiB0byBiZSBsb2FkZWQgYWZ0ZXIgdmVzYWZiIGhhcyBiZWVuCi0JCWxvYWRlZC4gU2VlIHNlY3Rpb25zICJNb2R1bGUgdW5sb2FkaW5nIC4uLiIuCi0KLQogRGV2ZWxvcG1lbnQgaGludHMKID09PT09PT09PT09PT09PT09CiAKQEAgLTE5NSw3ICsyMDcsNyBAQAogQWZ0ZXIgYm9vdGluZywgbG9hZCBjeWJsYWZiIHdpdGhvdXQgYW55IG1vZGUgYW5kIGJwcCBwYXJhbWV0ZXIgYW5kIGFzc2lnbgogY3libGFmYiB0byBpbmRpdmlkdWFsIHR0eXMgdXNpbmcgY29uMmZiLCBlLmcuOgogCi0JbW9kcHJvYmUgY3libGFmYiB2ZXNhZmI9MQorCW1vZHByb2JlIGN5YmxhZmIKIAljb24yZmIgL2Rldi9mYjEgL2Rldi90dHkxCiAKIFVubG9hZGluZyBjeWJsYWZiIHdvcmtzIHdpdGhvdXQgcHJvYmxlbXMgYWZ0ZXIgeW91IGFzc2lnbiB2ZXNhZmIgdG8gYWxsCkBAIC0yMDMsNCArMjE1LDMgQEAKIAogCWNvbjJmYiAvZGV2L2ZiMCAvZGV2L3R0eTEKIAlybW1vZCBjeWJsYWZiCi0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi93aGF0c25ldyBiL0RvY3VtZW50YXRpb24vZmIvY3libGFmYi93aGF0c25ldwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmMwN2EyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9mYi9jeWJsYWZiL3doYXRzbmV3CkBAIC0wLDAgKzEsMjkgQEAKKzAuNjIKKz09PT0KKworICAgICAgLSB0aGUgdmVzYWZiIHBhcmFtZXRlciBoYXMgYmVlbiByZW1vdmVkIGFzIEkgZGVjaWRlZCB0byBhbGxvdyB0aGUKKyAgICAgIAlmZWF0dXJlIHdpdGhvdXQgYW55IHNwZWNpYWwgcGFyYW1ldGVyLgorCisgICAgICAtIEN5YmxhZmIgZG9lcyBub3QgdXNlIHRoZSB2Z2Egc3R5bGUgb2YgcGFubmluZyBhbnkgbG9uZ2VyLCBub3cgdGhlCisgICAgICAJInJpZ2h0IHZpZXciIHJlZ2lzdGVyIGluIHRoZSBncmFwaGljcyBlbmdpbmUgSU8gc3BhY2UgaXMgdXNlZC4gV2l0aG91dAorCXRoYXQgY2hhbmdlIGl0IHdhcyBpbXBvc3NpYmxlIHRvIHVzZSBhbGwgYXZhaWxhYmxlIG1lbW9yeSwgYW5kIHdpdGhvdXQKKwlhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBtZW1vcnkgaXQgaXMgaW1wb3NzaWJsZSB0byB5d3JhcC4KKworICAgICAgLSBUaGUgaW1hZ2VibGl0IGZ1bmN0aW9uIG5vdyB1c2VzIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBmb3IgYWxsIGZvbnQKKyAgICAgICAgd2lkdGhzLiBIYXJkd2FyZSBibGl0dGluZyBhY3Jvc3MgcGl4ZWwgY29sdW1uIDIwNDggaXMgYnJva2VuIGluIHRoZQorCWN5YmVyYmxhZGUvaTEgZ3JhcGhpY3MgY29yZSwgYnV0IHdlIHdvcmsgYXJvdW5kIHRoYXQgaGFyZHdhcmUgYnVnLgorCisgICAgICAtIG1vZGVzIHdpdGggdnhyZXMgIT0geHJlcyBhcmUgc3VwcG9ydGVkIG5vdy4KKworICAgICAgLSB5d3JhcCBzY3JvbGxpbmcgaXMgc3VwcG9ydGVkIG5vdyBhbmQgdGhlIGRlZmF1bHQuIFRoaXMgaXMgYSBiaWcKKyAgICAgICAgcGVyZm9ybWFuY2UgZ2Fpbi4KKworICAgICAgLSBkZWZhdWx0IHZpZGVvIG1vZGVzIHVzZSB2eXJlcyA+IHlyZXMgYW5kIHZ4cmVzID4geHJlcyB0byBhbGxvdworICAgICAgICBhbG1vc3Qgb3B0aW1hbCBzY3JvbGxpbmcgc3BlZWQgZm9yIG5vcm1hbCBhbmQgcm90YXRlZCBzY3JlZW5zCisKKyAgICAgIC0gc29tZSBmZWF0dXJlcyBtYWlubHkgdXNlZnVsbCBmb3IgZGVidWdnaW5nIHRoZSB1cHBlciBsYXllcnMgb2YgdGhlCisgICAgICAgIGZyYW1lYnVmZmVyIHN5c3RlbSBoYXZlIGJlZW4gYWRkZWQsIGhhdmUgYSBsb29rIGF0IHRoZSBjb2RlCisKKyAgICAgIC0gZml4ZWQ6IE9vcHMgYWZ0ZXIgdW5sb2FkaW5nIGN5YmxhZmIgd2hlbiByZWFkaW5nIC9wcm9jL2lvKgorCisgICAgICAtIHdlIHdvcmsgYXJvdW5kIHNvbWUgYnVncyBvZiB0aGUgaGlnaGVyIGZyYW1lYnVmZmVyIGxheWVycy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAppbmRleCA5NDc0NTAxLi5iNGExZWE3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CkBAIC0xMjMsNiArMTIzLDE1IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitXaGF0OglDT05GSUdfRk9SQ0VEX0lOTElOSU5HCitXaGVuOglKdW5lIDIwMDYKK1doeToJQ29uZmlnIG9wdGlvbiBpcyB0aGVyZSB0byBzZWUgaWYgZ2NjIGlzIGdvb2QgZW5vdWdoLiAoaW4gamFudWFyeQorICAgICAgICAyMDA2KS4gSWYgaXQgaXMsIHRoZSBiZWhhdmlvciBzaG91bGQganVzdCBiZSB0aGUgZGVmYXVsdC4gSWYgaXQncyBub3QsCisJdGhlIG9wdGlvbiBzaG91bGQganVzdCBnbyBhd2F5IGVudGlyZWx5LgorV2hvOiAgICBBcmphbiB2YW4gZGUgVmVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiBXaGF0OglTVEFSVF9BUlJBWSBpb2N0bCBmb3IgbWQKIFdoZW46CUp1bHkgMjAwNgogRmlsZXM6CWRyaXZlcnMvbWQvbWQuYwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0My50eHQKaW5kZXggOTg0MGQ1Yi4uYWZiMTMzNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDMudHh0CkBAIC0yLDExICsyLDExIEBACiBFeHQzIEZpbGVzeXN0ZW0KID09PT09PT09PT09PT09PQogCi1leHQzIHdhcyBvcmlnaW5hbGx5IHJlbGVhc2VkIGluIFNlcHRlbWJlciAxOTk5LiBXcml0dGVuIGJ5IFN0ZXBoZW4gVHdlZWRpZQotZm9yIDIuMiBicmFuY2gsIGFuZCBwb3J0ZWQgdG8gMi40IGtlcm5lbHMgYnkgUGV0ZXIgQnJhYW0sIEFuZHJlYXMgRGlsZ2VyLCAKK0V4dDMgd2FzIG9yaWdpbmFsbHkgcmVsZWFzZWQgaW4gU2VwdGVtYmVyIDE5OTkuIFdyaXR0ZW4gYnkgU3RlcGhlbiBUd2VlZGllCitmb3IgdGhlIDIuMiBicmFuY2gsIGFuZCBwb3J0ZWQgdG8gMi40IGtlcm5lbHMgYnkgUGV0ZXIgQnJhYW0sIEFuZHJlYXMgRGlsZ2VyLAogQW5kcmV3IE1vcnRvbiwgQWxleGFuZGVyIFZpcm8sIFRlZCBUcydvIGFuZCBTdGVwaGVuIFR3ZWVkaWUuCiAKLWV4dDMgaXMgZXh0MiBmaWxlc3lzdGVtIGVuaGFuY2VkIHdpdGggam91cm5hbGxpbmcgY2FwYWJpbGl0aWVzLiAKK0V4dDMgaXMgdGhlIGV4dDIgZmlsZXN5c3RlbSBlbmhhbmNlZCB3aXRoIGpvdXJuYWxsaW5nIGNhcGFiaWxpdGllcy4KIAogT3B0aW9ucwogPT09PT09PQpAQCAtMTQsNzYgKzE0LDgxIEBACiBXaGVuIG1vdW50aW5nIGFuIGV4dDMgZmlsZXN5c3RlbSwgdGhlIGZvbGxvd2luZyBvcHRpb24gYXJlIGFjY2VwdGVkOgogKCopID09IGRlZmF1bHQKIAotam91bmFsPXVwZGF0ZQkJVXBkYXRlIHRoZSBleHQzIGZpbGUgc3lzdGVtJ3Mgam91cm5hbCB0byB0aGUgCi0JCQljdXJyZW50IGZvcm1hdC4KK2pvdXJuYWw9dXBkYXRlCQlVcGRhdGUgdGhlIGV4dDMgZmlsZSBzeXN0ZW0ncyBqb3VybmFsIHRvIHRoZSBjdXJyZW50CisJCQlmb3JtYXQuCiAKLWpvdXJuYWw9aW51bQkJV2hlbiBhIGpvdXJuYWwgYWxyZWFkeSBleGlzdHMsIHRoaXMgb3B0aW9uIGlzIAotCQkJaWdub3JlZC4gT3RoZXJ3aXNlLCBpdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZgotCQkJdGhlIGlub2RlIHdoaWNoIHdpbGwgcmVwcmVzZW50IHRoZSBleHQzIGZpbGUKLQkJCXN5c3RlbSdzIGpvdXJuYWwgZmlsZS4KK2pvdXJuYWw9aW51bQkJV2hlbiBhIGpvdXJuYWwgYWxyZWFkeSBleGlzdHMsIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQuCisJCQlPdGhlcndpc2UsIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRoZSBpbm9kZSB3aGljaAorCQkJd2lsbCByZXByZXNlbnQgdGhlIGV4dDMgZmlsZSBzeXN0ZW0ncyBqb3VybmFsIGZpbGUuCisKK2pvdXJuYWxfZGV2PWRldm51bQlXaGVuIHRoZSBleHRlcm5hbCBqb3VybmFsIGRldmljZSdzIG1ham9yL21pbm9yIG51bWJlcnMKKwkJCWhhdmUgY2hhbmdlZCwgdGhpcyBvcHRpb24gYWxsb3dzIHRoZSB1c2VyIHRvIHNwZWNpZnkKKwkJCXRoZSBuZXcgam91cm5hbCBsb2NhdGlvbi4gIFRoZSBqb3VybmFsIGRldmljZSBpcworCQkJaWRlbnRpZmllZCB0aHJvdWdoIGl0cyBuZXcgbWFqb3IvbWlub3IgbnVtYmVycyBlbmNvZGVkCisJCQlpbiBkZXZudW0uCiAKIG5vbG9hZAkJCURvbid0IGxvYWQgdGhlIGpvdXJuYWwgb24gbW91bnRpbmcuCiAKLWRhdGE9am91cm5hbAkJQWxsIGRhdGEgYXJlIGNvbW1pdHRlZCBpbnRvIHRoZSBqb3VybmFsIHByaW9yCi0JCQl0byBiZWluZyB3cml0dGVuIGludG8gdGhlIG1haW4gZmlsZSBzeXN0ZW0uCitkYXRhPWpvdXJuYWwJCUFsbCBkYXRhIGFyZSBjb21taXR0ZWQgaW50byB0aGUgam91cm5hbCBwcmlvciB0byBiZWluZworCQkJd3JpdHRlbiBpbnRvIHRoZSBtYWluIGZpbGUgc3lzdGVtLgogCiBkYXRhPW9yZGVyZWQJKCopCUFsbCBkYXRhIGFyZSBmb3JjZWQgZGlyZWN0bHkgb3V0IHRvIHRoZSBtYWluIGZpbGUKLQkJCXN5c3RlbSBwcmlvciB0byBpdHMgbWV0YWRhdGEgYmVpbmcgY29tbWl0dGVkIHRvCi0JCQl0aGUgam91cm5hbC4KKwkJCXN5c3RlbSBwcmlvciB0byBpdHMgbWV0YWRhdGEgYmVpbmcgY29tbWl0dGVkIHRvIHRoZQorCQkJam91cm5hbC4KIAotZGF0YT13cml0ZWJhY2sJCURhdGEgb3JkZXJpbmcgaXMgbm90IHByZXNlcnZlZCwgZGF0YSBtYXkgYmUKLQkJCXdyaXR0ZW4gaW50byB0aGUgbWFpbiBmaWxlIHN5c3RlbSBhZnRlciBpdHMKLQkJCW1ldGFkYXRhIGhhcyBiZWVuIGNvbW1pdHRlZCB0byB0aGUgam91cm5hbC4KK2RhdGE9d3JpdGViYWNrCQlEYXRhIG9yZGVyaW5nIGlzIG5vdCBwcmVzZXJ2ZWQsIGRhdGEgbWF5IGJlIHdyaXR0ZW4KKwkJCWludG8gdGhlIG1haW4gZmlsZSBzeXN0ZW0gYWZ0ZXIgaXRzIG1ldGFkYXRhIGhhcyBiZWVuCisJCQljb21taXR0ZWQgdG8gdGhlIGpvdXJuYWwuCiAKIGNvbW1pdD1ucnNlYwkoKikJRXh0MyBjYW4gYmUgdG9sZCB0byBzeW5jIGFsbCBpdHMgZGF0YSBhbmQgbWV0YWRhdGEKIAkJCWV2ZXJ5ICducnNlYycgc2Vjb25kcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgNSBzZWNvbmRzLgotCQkJVGhpcyBtZWFucyB0aGF0IGlmIHlvdSBsb3NlIHlvdXIgcG93ZXIsIHlvdSB3aWxsIGxvc2UsCi0JCQlhcyBtdWNoLCB0aGUgbGF0ZXN0IDUgc2Vjb25kcyBvZiB3b3JrICh5b3VyIGZpbGVzeXN0ZW0KLQkJCXdpbGwgbm90IGJlIGRhbWFnZWQgdGhvdWdoLCB0aGFua3MgdG8gam91cm5hbGluZykuIFRoaXMKLQkJCWRlZmF1bHQgdmFsdWUgKG9yIGFueSBsb3cgdmFsdWUpIHdpbGwgaHVydCBwZXJmb3JtYW5jZSwKLQkJCWJ1dCBpdCdzIGdvb2QgZm9yIGRhdGEtc2FmZXR5LiBTZXR0aW5nIGl0IHRvIDAgd2lsbAotCQkJaGF2ZSB0aGUgc2FtZSBlZmZlY3QgdGhhbiBsZWF2aW5nIHRoZSBkZWZhdWx0IDUgc2VjLgorCQkJVGhpcyBtZWFucyB0aGF0IGlmIHlvdSBsb3NlIHlvdXIgcG93ZXIsIHlvdSB3aWxsIGxvc2UKKwkJCWFzIG11Y2ggYXMgdGhlIGxhdGVzdCA1IHNlY29uZHMgb2Ygd29yayAoeW91cgorCQkJZmlsZXN5c3RlbSB3aWxsIG5vdCBiZSBkYW1hZ2VkIHRob3VnaCwgdGhhbmtzIHRvIHRoZQorCQkJam91cm5hbGluZykuICBUaGlzIGRlZmF1bHQgdmFsdWUgKG9yIGFueSBsb3cgdmFsdWUpCisJCQl3aWxsIGh1cnQgcGVyZm9ybWFuY2UsIGJ1dCBpdCdzIGdvb2QgZm9yIGRhdGEtc2FmZXR5LgorCQkJU2V0dGluZyBpdCB0byAwIHdpbGwgaGF2ZSB0aGUgc2FtZSBlZmZlY3QgYXMgbGVhdmluZworCQkJaXQgYXQgdGhlIGRlZmF1bHQgKDUgc2Vjb25kcykuCiAJCQlTZXR0aW5nIGl0IHRvIHZlcnkgbGFyZ2UgdmFsdWVzIHdpbGwgaW1wcm92ZQogCQkJcGVyZm9ybWFuY2UuCiAKLWJhcnJpZXI9MQkJVGhpcyBlbmFibGVzL2Rpc2FibGVzIGJhcnJpZXJzLiBiYXJyaWVyPTAgZGlzYWJsZXMgaXQsCi0JCQliYXJyaWVyPTEgZW5hYmxlcyBpdC4KK2JhcnJpZXI9MQkJVGhpcyBlbmFibGVzL2Rpc2FibGVzIGJhcnJpZXJzLiAgYmFycmllcj0wIGRpc2FibGVzCisJCQlpdCwgYmFycmllcj0xIGVuYWJsZXMgaXQuCiAKLW9ybG92CQkoKikJVGhpcyBlbmFibGVzIHRoZSBuZXcgT3Jsb3YgYmxvY2sgYWxsb2NhdG9yLiBJdCdzIGVuYWJsZWQKLQkJCWJ5IGRlZmF1bHQuCitvcmxvdgkJKCopCVRoaXMgZW5hYmxlcyB0aGUgbmV3IE9ybG92IGJsb2NrIGFsbG9jYXRvci4gSXQgaXMKKwkJCWVuYWJsZWQgYnkgZGVmYXVsdC4KIAotb2xkYWxsb2MJCVRoaXMgZGlzYWJsZXMgdGhlIE9ybG92IGJsb2NrIGFsbG9jYXRvciBhbmQgZW5hYmxlcyB0aGUKLQkJCW9sZCBibG9jayBhbGxvY2F0b3IuIE9ybG92IHNob3VsZCBoYXZlIGJldHRlciBwZXJmb3JtYW5jZSwKLQkJCXdlJ2QgbGlrZSB0byBnZXQgc29tZSBmZWVkYmFjayBpZiBpdCdzIHRoZSBjb250cmFyeSBmb3IKLQkJCXlvdS4KK29sZGFsbG9jCQlUaGlzIGRpc2FibGVzIHRoZSBPcmxvdiBibG9jayBhbGxvY2F0b3IgYW5kIGVuYWJsZXMKKwkJCXRoZSBvbGQgYmxvY2sgYWxsb2NhdG9yLiAgT3Jsb3Ygc2hvdWxkIGhhdmUgYmV0dGVyCisJCQlwZXJmb3JtYW5jZSAtIHdlJ2QgbGlrZSB0byBnZXQgc29tZSBmZWVkYmFjayBpZiBpdCdzCisJCQl0aGUgY29udHJhcnkgZm9yIHlvdS4KIAotdXNlcl94YXR0cgkJRW5hYmxlcyBFeHRlbmRlZCBVc2VyIEF0dHJpYnV0ZXMuIEFkZGl0aW9uYWxseSwgeW91IG5lZWQKLQkJCXRvIGhhdmUgZXh0ZW5kZWQgYXR0cmlidXRlIHN1cHBvcnQgZW5hYmxlZCBpbiB0aGUga2VybmVsCi0JCQljb25maWd1cmF0aW9uIChDT05GSUdfRVhUM19GU19YQVRUUikuIFNlZSB0aGUgYXR0cig1KQotCQkJbWFudWFsIHBhZ2UgYW5kIGh0dHA6Ly9hY2wuYmVzdGJpdHMuYXQgdG8gbGVhcm4gbW9yZQotCQkJYWJvdXQgZXh0ZW5kZWQgYXR0cmlidXRlcy4KK3VzZXJfeGF0dHIJCUVuYWJsZXMgRXh0ZW5kZWQgVXNlciBBdHRyaWJ1dGVzLiAgQWRkaXRpb25hbGx5LCB5b3UKKwkJCW5lZWQgdG8gaGF2ZSBleHRlbmRlZCBhdHRyaWJ1dGUgc3VwcG9ydCBlbmFibGVkIGluIHRoZQorCQkJa2VybmVsIGNvbmZpZ3VyYXRpb24gKENPTkZJR19FWFQzX0ZTX1hBVFRSKS4gIFNlZSB0aGUKKwkJCWF0dHIoNSkgbWFudWFsIHBhZ2UgYW5kIGh0dHA6Ly9hY2wuYmVzdGJpdHMuYXQvIHRvCisJCQlsZWFybiBtb3JlIGFib3V0IGV4dGVuZGVkIGF0dHJpYnV0ZXMuCiAKIG5vdXNlcl94YXR0cgkJRGlzYWJsZXMgRXh0ZW5kZWQgVXNlciBBdHRyaWJ1dGVzLgogCi1hY2wJCQlFbmFibGVzIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzIHN1cHBvcnQuICBBZGRpdGlvbmFsbHksCi0JCQl5b3UgbmVlZCB0byBoYXZlIEFDTCBzdXBwb3J0IGVuYWJsZWQgaW4gdGhlIGtlcm5lbAotCQkJY29uZmlndXJhdGlvbiAoQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMKS4gU2VlIHRoZSBhY2woNSkKLQkJCW1hbnVhbCBwYWdlIGFuZCBodHRwOi8vYWNsLmJlc3RiaXRzLmF0IGZvciBtb3JlCi0JCQlpbmZvcm1hdGlvbi4KK2FjbAkJCUVuYWJsZXMgUE9TSVggQWNjZXNzIENvbnRyb2wgTGlzdHMgc3VwcG9ydC4KKwkJCUFkZGl0aW9uYWxseSwgeW91IG5lZWQgdG8gaGF2ZSBBQ0wgc3VwcG9ydCBlbmFibGVkIGluCisJCQl0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gKENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCkuCisJCQlTZWUgdGhlIGFjbCg1KSBtYW51YWwgcGFnZSBhbmQgaHR0cDovL2FjbC5iZXN0Yml0cy5hdC8KKwkJCWZvciBtb3JlIGluZm9ybWF0aW9uLgogCi1ub2FjbAkJCVRoaXMgb3B0aW9uIGRpc2FibGVzIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3Qgc3VwcG9ydC4KK25vYWNsCQkJVGhpcyBvcHRpb24gZGlzYWJsZXMgUE9TSVggQWNjZXNzIENvbnRyb2wgTGlzdAorCQkJc3VwcG9ydC4KIAogcmVzZXJ2YXRpb24KIAogbm9yZXNlcnZhdGlvbgogCi1yZXNpemU9Ci0KIGJzZGRmIAkJKCopCU1ha2UgJ2RmJyBhY3QgbGlrZSBCU0QuCiBtaW5peGRmCQkJTWFrZSAnZGYnIGFjdCBsaWtlIE1pbml4LgogCiBjaGVjaz1ub25lCQlEb24ndCBkbyBleHRyYSBjaGVja2luZyBvZiBiaXRtYXBzIG9uIG1vdW50Lgotbm9jaGVjawkJCitub2NoZWNrCiAKIGRlYnVnCQkJRXh0cmEgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIHNlbnQgdG8gc3lzbG9nLgogCkBAIC05Miw3ICs5Nyw3IEBACiBlcnJvcnM9cGFuaWMJCVBhbmljIGFuZCBoYWx0IHRoZSBtYWNoaW5lIGlmIGFuIGVycm9yIG9jY3Vycy4KIAogZ3JwaWQJCQlHaXZlIG9iamVjdHMgdGhlIHNhbWUgZ3JvdXAgSUQgYXMgdGhlaXIgY3JlYXRvci4KLWJzZGdyb3VwcwkJCitic2Rncm91cHMKIAogbm9ncnBpZAkJKCopCU5ldyBvYmplY3RzIGhhdmUgdGhlIGdyb3VwIElEIG9mIHRoZWlyIGNyZWF0b3IuCiBzeXN2Z3JvdXBzCkBAIC0xMDMsODEgKzEwOCw4MyBAQAogCiBzYj1uCQkJVXNlIGFsdGVybmF0ZSBzdXBlcmJsb2NrIGF0IHRoaXMgbG9jYXRpb24uCiAKLXF1b3RhCQkJUXVvdGEgb3B0aW9ucyBhcmUgY3VycmVudGx5IHNpbGVudGx5IGlnbm9yZWQuCi1ub3F1b3RhCQkJKHNlZSBmcy9leHQzL3N1cGVyLmMsIGxpbmUgNTk0KQorcXVvdGEKK25vcXVvdGEKIGdycHF1b3RhCiB1c3JxdW90YQogCiAKIFNwZWNpZmljYXRpb24KID09PT09PT09PT09PT0KLWV4dDMgc2hhcmVzIGFsbCBkaXNrIGltcGxlbWVudGF0aW9uIHdpdGggZXh0MiBmaWxlc3lzdGVtLCBhbmQgYWRkCi10cmFuc2FjdGlvbnMgY2FwYWJpbGl0aWVzIHRvIGV4dDIuICBKb3VybmFsaW5nIGlzIGRvbmUgYnkgdGhlCi1Kb3VybmFsaW5nIGJsb2NrIGRldmljZSBsYXllci4KK0V4dDMgc2hhcmVzIGFsbCBkaXNrIGltcGxlbWVudGF0aW9uIHdpdGggdGhlIGV4dDIgZmlsZXN5c3RlbSwgYW5kIGFkZHMKK3RyYW5zYWN0aW9ucyBjYXBhYmlsaXRpZXMgdG8gZXh0Mi4gIEpvdXJuYWxpbmcgaXMgZG9uZSBieSB0aGUgSm91cm5hbGluZyBCbG9jaworRGV2aWNlIGxheWVyLgogCiBKb3VybmFsaW5nIEJsb2NrIERldmljZSBsYXllcgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVRoZSBKb3VybmFsaW5nIEJsb2NrIERldmljZSBsYXllciAoSkJEKSBpc24ndCBleHQzIHNwZWNpZmljLiAgSXQgd2FzCi1kZXNpZ24gdG8gYWRkIGpvdXJuYWxpbmcgY2FwYWJpbGl0aWVzIG9uIGEgYmxvY2sgZGV2aWNlLiAgVGhlIGV4dDMKLWZpbGVzeXN0ZW0gY29kZSB3aWxsIGluZm9ybSB0aGUgSkJEIG9mIG1vZGlmaWNhdGlvbnMgaXQgaXMgcGVyZm9ybWluZwotKENhbGwgYSB0cmFuc2FjdGlvbikuICB0aGUgam91cm5hbCBzdXBwb3J0IHRoZSB0cmFuc2FjdGlvbnMgc3RhcnQgYW5kCi1zdG9wLCBhbmQgaW4gY2FzZSBvZiBjcmFzaCwgdGhlIGpvdXJuYWwgY2FuIHJlcGxheWVkIHRoZSB0cmFuc2FjdGlvbnMKLXRvIHB1dCB0aGUgcGFydGl0aW9uIG9uIGEgY29uc2lzdGVudCBzdGF0ZSBmYXN0bHkuCitUaGUgSm91cm5hbGluZyBCbG9jayBEZXZpY2UgbGF5ZXIgKEpCRCkgaXNuJ3QgZXh0MyBzcGVjaWZpYy4gIEl0IHdhcyBkZXNpZ24gdG8KK2FkZCBqb3VybmFsaW5nIGNhcGFiaWxpdGllcyBvbiBhIGJsb2NrIGRldmljZS4gIFRoZSBleHQzIGZpbGVzeXN0ZW0gY29kZSB3aWxsCitpbmZvcm0gdGhlIEpCRCBvZiBtb2RpZmljYXRpb25zIGl0IGlzIHBlcmZvcm1pbmcgKGNhbGxlZCBhIHRyYW5zYWN0aW9uKS4gIFRoZQoram91cm5hbCBzdXBwb3J0cyB0aGUgdHJhbnNhY3Rpb25zIHN0YXJ0IGFuZCBzdG9wLCBhbmQgaW4gY2FzZSBvZiBjcmFzaCwgdGhlCitqb3VybmFsIGNhbiByZXBsYXllZCB0aGUgdHJhbnNhY3Rpb25zIHRvIHB1dCB0aGUgcGFydGl0aW9uIGJhY2sgaW4gYQorY29uc2lzdGVudCBzdGF0ZSBmYXN0LgogCi1oYW5kbGVzIHJlcHJlc2VudCBhIHNpbmdsZSBhdG9taWMgdXBkYXRlIHRvIGEgZmlsZXN5c3RlbS4gIEpCRCBjYW4KLWhhbmRsZSBleHRlcm5hbCBqb3VybmFsIG9uIGEgYmxvY2sgZGV2aWNlLgorSGFuZGxlcyByZXByZXNlbnQgYSBzaW5nbGUgYXRvbWljIHVwZGF0ZSB0byBhIGZpbGVzeXN0ZW0uICBKQkQgY2FuIGhhbmRsZSBhbgorZXh0ZXJuYWwgam91cm5hbCBvbiBhIGJsb2NrIGRldmljZS4KIAogRGF0YSBNb2RlCiAtLS0tLS0tLS0KLVRoZXJlJ3MgMyBkaWZmZXJlbnQgZGF0YSBtb2RlczoKK1RoZXJlIGFyZSAzIGRpZmZlcmVudCBkYXRhIG1vZGVzOgogCiAqIHdyaXRlYmFjayBtb2RlCi1JbiBkYXRhPXdyaXRlYmFjayBtb2RlLCBleHQzIGRvZXMgbm90IGpvdXJuYWwgZGF0YSBhdCBhbGwuICBUaGlzIG1vZGUKLXByb3ZpZGVzIGEgc2ltaWxhciBsZXZlbCBvZiBqb3VybmFsaW5nIGFzIFhGUywgSkZTLCBhbmQgUmVpc2VyRlMgaW4gaXRzCi1kZWZhdWx0IG1vZGUgLSBtZXRhZGF0YSBqb3VybmFsaW5nLiAgQSBjcmFzaCtyZWNvdmVyeSBjYW4gY2F1c2UKLWluY29ycmVjdCBkYXRhIHRvIGFwcGVhciBpbiBmaWxlcyB3aGljaCB3ZXJlIHdyaXR0ZW4gc2hvcnRseSBiZWZvcmUgdGhlCi1jcmFzaC4gIFRoaXMgbW9kZSB3aWxsIHR5cGljYWxseSBwcm92aWRlIHRoZSBiZXN0IGV4dDMgcGVyZm9ybWFuY2UuCitJbiBkYXRhPXdyaXRlYmFjayBtb2RlLCBleHQzIGRvZXMgbm90IGpvdXJuYWwgZGF0YSBhdCBhbGwuICBUaGlzIG1vZGUgcHJvdmlkZXMKK2Egc2ltaWxhciBsZXZlbCBvZiBqb3VybmFsaW5nIGFzIHRoYXQgb2YgWEZTLCBKRlMsIGFuZCBSZWlzZXJGUyBpbiBpdHMgZGVmYXVsdAorbW9kZSAtIG1ldGFkYXRhIGpvdXJuYWxpbmcuICBBIGNyYXNoK3JlY292ZXJ5IGNhbiBjYXVzZSBpbmNvcnJlY3QgZGF0YSB0bworYXBwZWFyIGluIGZpbGVzIHdoaWNoIHdlcmUgd3JpdHRlbiBzaG9ydGx5IGJlZm9yZSB0aGUgY3Jhc2guICBUaGlzIG1vZGUgd2lsbAordHlwaWNhbGx5IHByb3ZpZGUgdGhlIGJlc3QgZXh0MyBwZXJmb3JtYW5jZS4KIAogKiBvcmRlcmVkIG1vZGUKLUluIGRhdGE9b3JkZXJlZCBtb2RlLCBleHQzIG9ubHkgb2ZmaWNpYWxseSBqb3VybmFscyBtZXRhZGF0YSwgYnV0IGl0Ci1sb2dpY2FsbHkgZ3JvdXBzIG1ldGFkYXRhIGFuZCBkYXRhIGJsb2NrcyBpbnRvIGEgc2luZ2xlIHVuaXQgY2FsbGVkIGEKLXRyYW5zYWN0aW9uLiAgV2hlbiBpdCdzIHRpbWUgdG8gd3JpdGUgdGhlIG5ldyBtZXRhZGF0YSBvdXQgdG8gZGlzaywgdGhlCi1hc3NvY2lhdGVkIGRhdGEgYmxvY2tzIGFyZSB3cml0dGVuIGZpcnN0LiAgSW4gZ2VuZXJhbCwgdGhpcyBtb2RlCi1wZXJmb3JtIHNsaWdodGx5IHNsb3dlciB0aGFuIHdyaXRlYmFjayBidXQgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdGhhbgotam91cm5hbCBtb2RlLgorSW4gZGF0YT1vcmRlcmVkIG1vZGUsIGV4dDMgb25seSBvZmZpY2lhbGx5IGpvdXJuYWxzIG1ldGFkYXRhLCBidXQgaXQgbG9naWNhbGx5Citncm91cHMgbWV0YWRhdGEgYW5kIGRhdGEgYmxvY2tzIGludG8gYSBzaW5nbGUgdW5pdCBjYWxsZWQgYSB0cmFuc2FjdGlvbi4gIFdoZW4KK2l0J3MgdGltZSB0byB3cml0ZSB0aGUgbmV3IG1ldGFkYXRhIG91dCB0byBkaXNrLCB0aGUgYXNzb2NpYXRlZCBkYXRhIGJsb2NrcworYXJlIHdyaXR0ZW4gZmlyc3QuICBJbiBnZW5lcmFsLCB0aGlzIG1vZGUgcGVyZm9ybXMgc2xpZ2h0bHkgc2xvd2VyIHRoYW4KK3dyaXRlYmFjayBidXQgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdGhhbiBqb3VybmFsIG1vZGUuCiAKICogam91cm5hbCBtb2RlCi1kYXRhPWpvdXJuYWwgbW9kZSBwcm92aWRlcyBmdWxsIGRhdGEgYW5kIG1ldGFkYXRhIGpvdXJuYWxpbmcuICBBbGwgbmV3Ci1kYXRhIGlzIHdyaXR0ZW4gdG8gdGhlIGpvdXJuYWwgZmlyc3QsIGFuZCB0aGVuIHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gCi1JbiB0aGUgZXZlbnQgb2YgYSBjcmFzaCwgdGhlIGpvdXJuYWwgY2FuIGJlIHJlcGxheWVkLCBicmluZ2luZyBib3RoCi1kYXRhIGFuZCBtZXRhZGF0YSBpbnRvIGEgY29uc2lzdGVudCBzdGF0ZS4gIFRoaXMgbW9kZSBpcyB0aGUgc2xvd2VzdAotZXhjZXB0IHdoZW4gZGF0YSBuZWVkcyB0byBiZSByZWFkIGZyb20gYW5kIHdyaXR0ZW4gdG8gZGlzayBhdCB0aGUgc2FtZQotdGltZSB3aGVyZSBpdCBvdXRwZXJmb3JtIGFsbCBvdGhlcnMgbW9kZS4KK2RhdGE9am91cm5hbCBtb2RlIHByb3ZpZGVzIGZ1bGwgZGF0YSBhbmQgbWV0YWRhdGEgam91cm5hbGluZy4gIEFsbCBuZXcgZGF0YSBpcword3JpdHRlbiB0byB0aGUgam91cm5hbCBmaXJzdCwgYW5kIHRoZW4gdG8gaXRzIGZpbmFsIGxvY2F0aW9uLgorSW4gdGhlIGV2ZW50IG9mIGEgY3Jhc2gsIHRoZSBqb3VybmFsIGNhbiBiZSByZXBsYXllZCwgYnJpbmdpbmcgYm90aCBkYXRhIGFuZAorbWV0YWRhdGEgaW50byBhIGNvbnNpc3RlbnQgc3RhdGUuICBUaGlzIG1vZGUgaXMgdGhlIHNsb3dlc3QgZXhjZXB0IHdoZW4gZGF0YQorbmVlZHMgdG8gYmUgcmVhZCBmcm9tIGFuZCB3cml0dGVuIHRvIGRpc2sgYXQgdGhlIHNhbWUgdGltZSB3aGVyZSBpdAorb3V0cGVyZm9ybXMgYWxsIG90aGVycyBtb2Rlcy4KIAogQ29tcGF0aWJpbGl0eQogLS0tLS0tLS0tLS0tLQogCiBFeHQyIHBhcnRpdGlvbnMgY2FuIGJlIGVhc2lseSBjb252ZXJ0IHRvIGV4dDMsIHdpdGggYHR1bmUyZnMgLWogPGRldj5gLgotRXh0MyBpcyBmdWxseSBjb21wYXRpYmxlIHdpdGggRXh0Mi4gIEV4dDMgcGFydGl0aW9ucyBjYW4gZWFzaWx5IGJlCi1tb3VudGVkIGFzIEV4dDIuCitFeHQzIGlzIGZ1bGx5IGNvbXBhdGlibGUgd2l0aCBFeHQyLiAgRXh0MyBwYXJ0aXRpb25zIGNhbiBlYXNpbHkgYmUgbW91bnRlZCBhcworRXh0Mi4KKwogCiBFeHRlcm5hbCBUb29scwogPT09PT09PT09PT09PT0KLXNlZSBtYW51YWwgcGFnZXMgdG8ga25vdyBtb3JlLgorU2VlIG1hbnVhbCBwYWdlcyB0byBsZWFybiBtb3JlLgogCi10dW5lMmZzOiAJY3JlYXRlIGEgZXh0MyBqb3VybmFsIG9uIGEgZXh0MiBwYXJ0aXRpb24gd2l0aCB0aGUgLWogZmxhZ3MKLW1rZTJmczogCWNyZWF0ZSBhIGV4dDMgcGFydGl0aW9uIHdpdGggdGhlIC1qIGZsYWdzCi1kZWJ1Z2ZzOiAJZXh0MiBhbmQgZXh0MyBmaWxlIHN5c3RlbSBkZWJ1Z2dlcgordHVuZTJmczogCWNyZWF0ZSBhIGV4dDMgam91cm5hbCBvbiBhIGV4dDIgcGFydGl0aW9uIHdpdGggdGhlIC1qIGZsYWcuCitta2UyZnM6IAljcmVhdGUgYSBleHQzIHBhcnRpdGlvbiB3aXRoIHRoZSAtaiBmbGFnLgorZGVidWdmczogCWV4dDIgYW5kIGV4dDMgZmlsZSBzeXN0ZW0gZGVidWdnZXIuCitleHQyb25saW5lOglvbmxpbmUgKG1vdW50ZWQpIGV4dDIgYW5kIGV4dDMgZmlsZXN5c3RlbSByZXNpemVyCisKIAogUmVmZXJlbmNlcwogPT09PT09PT09PQogCi1rZXJuZWwgc291cmNlOglmaWxlOi91c3Ivc3JjL2xpbnV4L2ZzL2V4dDMKLQkJZmlsZTovdXNyL3NyYy9saW51eC9mcy9qYmQKK2tlcm5lbCBzb3VyY2U6CTxmaWxlOmZzL2V4dDMvPgorCQk8ZmlsZTpmcy9qYmQvPgogCi1wcm9ncmFtczogCWh0dHA6Ly9lMmZzcHJvZ3Muc291cmNlZm9yZ2UubmV0Citwcm9ncmFtczogCWh0dHA6Ly9lMmZzcHJvZ3Muc291cmNlZm9yZ2UubmV0LworCQlodHRwOi8vZXh0MnJlc2l6ZS5zb3VyY2Vmb3JnZS5uZXQKIAotdXNlZnVsIGxpbms6Ci0JCWh0dHA6Ly93d3cuemlwLmNvbS5hdS9+YWtwbS9saW51eC9leHQzL2V4dDMtdXNhZ2UuaHRtbAordXNlZnVsIGxpbmtzOglodHRwOi8vd3d3LnppcC5jb20uYXUvfmFrcG0vbGludXgvZXh0My9leHQzLXVzYWdlLmh0bWwKIAkJaHR0cDovL3d3dy0xMDYuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saW51eC9saWJyYXJ5L2wtZnM3LwogCQlodHRwOi8vd3d3LTEwNi5pYm0uY29tL2RldmVsb3BlcndvcmtzL2xpbnV4L2xpYnJhcnkvbC1mczgvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2Z1c2UudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9mdXNlLnR4dAppbmRleCA2YjU3NDFlLi4zM2Y3NDMxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2Z1c2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZnVzZS50eHQKQEAgLTg2LDYgKzg2LDYyIEBACiAgIFRoZSBkZWZhdWx0IGlzIGluZmluaXRlLiAgTm90ZSB0aGF0IHRoZSBzaXplIG9mIHJlYWQgcmVxdWVzdHMgaXMKICAgbGltaXRlZCBhbnl3YXkgdG8gMzIgcGFnZXMgKHdoaWNoIGlzIDEyOGtieXRlIG9uIGkzODYpLgogCitTeXNmcworfn5+fn4KKworRlVTRSBzZXRzIHVwIHRoZSBmb2xsb3dpbmcgaGllcmFyY2h5IGluIHN5c2ZzOgorCisgIC9zeXMvZnMvZnVzZS9jb25uZWN0aW9ucy9OLworCit3aGVyZSBOIGlzIGFuIGluY3JlYXNpbmcgbnVtYmVyIGFsbG9jYXRlZCB0byBlYWNoIG5ldyBjb25uZWN0aW9uLgorCitGb3IgZWFjaCBjb25uZWN0aW9uIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgZGVmaW5lZDoKKworICd3YWl0aW5nJworCisgIFRoZSBudW1iZXIgb2YgcmVxdWVzdHMgd2hpY2ggYXJlIHdhaXRpbmcgdG8gYmUgdHJhbnNmZXJlZCB0bworICB1c2Vyc3BhY2Ugb3IgYmVpbmcgcHJvY2Vzc2VkIGJ5IHRoZSBmaWxlc3lzdGVtIGRhZW1vbi4gIElmIHRoZXJlIGlzCisgIG5vIGZpbGVzeXN0ZW0gYWN0aXZpdHkgYW5kICd3YWl0aW5nJyBpcyBub24temVybywgdGhlbiB0aGUKKyAgZmlsZXN5c3RlbSBpcyBodW5nIG9yIGRlYWRsb2NrZWQuCisKKyAnYWJvcnQnCisKKyAgV3JpdGluZyBhbnl0aGluZyBpbnRvIHRoaXMgZmlsZSB3aWxsIGFib3J0IHRoZSBmaWxlc3lzdGVtCisgIGNvbm5lY3Rpb24uICBUaGlzIG1lYW5zIHRoYXQgYWxsIHdhaXRpbmcgcmVxdWVzdHMgd2lsbCBiZSBhYm9ydGVkIGFuCisgIGVycm9yIHJldHVybmVkIGZvciBhbGwgYWJvcnRlZCBhbmQgbmV3IHJlcXVlc3RzLgorCitPbmx5IGEgcHJpdmlsZWdlZCB1c2VyIG1heSByZWFkIG9yIHdyaXRlIHRoZXNlIGF0dHJpYnV0ZXMuCisKK0Fib3J0aW5nIGEgZmlsZXN5c3RlbSBjb25uZWN0aW9uCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitJdCBpcyBwb3NzaWJsZSB0byBnZXQgaW50byBjZXJ0YWluIHNpdHVhdGlvbnMgd2hlcmUgdGhlIGZpbGVzeXN0ZW0gaXMKK25vdCByZXNwb25kaW5nLiAgUmVhc29ucyBmb3IgdGhpcyBtYXkgYmU6CisKKyAgYSkgQnJva2VuIHVzZXJzcGFjZSBmaWxlc3lzdGVtIGltcGxlbWVudGF0aW9uCisKKyAgYikgTmV0d29yayBjb25uZWN0aW9uIGRvd24KKworICBjKSBBY2NpZGVudGFsIGRlYWRsb2NrCisKKyAgZCkgTWFsaWNpb3VzIGRlYWRsb2NrCisKKyhGb3IgbW9yZSBvbiBjKSBhbmQgZCkgc2VlIGxhdGVyIHNlY3Rpb25zKQorCitJbiBlaXRoZXIgb2YgdGhlc2UgY2FzZXMgaXQgbWF5IGJlIHVzZWZ1bCB0byBhYm9ydCB0aGUgY29ubmVjdGlvbiB0bwordGhlIGZpbGVzeXN0ZW0uICBUaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIGRvIHRoaXM6CisKKyAgLSBLaWxsIHRoZSBmaWxlc3lzdGVtIGRhZW1vbi4gIFdvcmtzIGluIGNhc2Ugb2YgYSkgYW5kIGIpCisKKyAgLSBLaWxsIHRoZSBmaWxlc3lzdGVtIGRhZW1vbiBhbmQgYWxsIHVzZXJzIG9mIHRoZSBmaWxlc3lzdGVtLiAgV29ya3MKKyAgICBpbiBhbGwgY2FzZXMgZXhjZXB0IHNvbWUgbWFsaWNpb3VzIGRlYWRsb2NrcworCisgIC0gVXNlIGZvcmNlZCB1bW91bnQgKHVtb3VudCAtZikuICBXb3JrcyBpbiBhbGwgY2FzZXMgYnV0IG9ubHkgaWYKKyAgICBmaWxlc3lzdGVtIGlzIHN0aWxsIGF0dGFjaGVkIChpdCBoYXNuJ3QgYmVlbiBsYXp5IHVubW91bnRlZCkKKworICAtIEFib3J0IGZpbGVzeXN0ZW0gdGhyb3VnaCB0aGUgc3lzZnMgaW50ZXJmYWNlLiAgTW9zdCBwb3dlcmZ1bAorICAgIG1ldGhvZCwgYWx3YXlzIHdvcmtzLgorCiBIb3cgZG8gbm9uLXByaXZpbGVnZWQgbW91bnRzIHdvcms/CiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiAKQEAgLTMxMywzICszNjksMTAgQEAKIHdoZW4gdGhlIGNvcHkgaXMgdGFraW5nIHBsYWNlLCBhbmQgaW50ZXJydXB0aW9uIGlzIGRlbGF5ZWQgdW50aWwKIHRoaXMgZmxhZyBpcyB1bnNldC4KIAorU2NlbmFyaW8gMyAtIFRyaWNreSBkZWFkbG9jayB3aXRoIGFzeW5jaHJvbm91cyByZWFkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHNhbWUgc2l0dWF0aW9uIGFzIGFib3ZlLCBleGNlcHQgdGhyZWFkLTEgd2lsbCB3YWl0IG9uIHBhZ2UgbG9jaworYW5kIGhlbmNlIGl0IHdpbGwgYmUgdW5pbnRlcnJ1cHRpYmxlIGFzIHdlbGwuICBUaGUgc29sdXRpb24gaXMgdG8KK2Fib3J0IHRoZSBjb25uZWN0aW9uIHdpdGggZm9yY2VkIHVtb3VudCAoaWYgbW91bnQgaXMgYXR0YWNoZWQpIG9yCit0aHJvdWdoIHRoZSBhYm9ydCBhdHRyaWJ1dGUgaW4gc3lzZnMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAppbmRleCBkNDc3MzU2Li45NDRjZjEwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKQEAgLTQxOCw3ICs0MTgsNyBAQAogICAgICAgIERpcnR5OiBNZW1vcnkgd2hpY2ggaXMgd2FpdGluZyB0byBnZXQgd3JpdHRlbiBiYWNrIHRvIHRoZSBkaXNrCiAgICBXcml0ZWJhY2s6IE1lbW9yeSB3aGljaCBpcyBhY3RpdmVseSBiZWluZyB3cml0dGVuIGJhY2sgdG8gdGhlIGRpc2sKICAgICAgIE1hcHBlZDogZmlsZXMgd2hpY2ggaGF2ZSBiZWVuIG1tYXBlZCwgc3VjaCBhcyBsaWJyYXJpZXMKLSAgICAgICAgICAgICAgU2xhYjogaW4ta2VybmVsIGRhdGEgc3RydWN0dXJlcyBjYWNoZQorICAgICAgICBTbGFiOiBpbi1rZXJuZWwgZGF0YSBzdHJ1Y3R1cmVzIGNhY2hlCiAgQ29tbWl0TGltaXQ6IEJhc2VkIG9uIHRoZSBvdmVyY29tbWl0IHJhdGlvICgndm0ub3ZlcmNvbW1pdF9yYXRpbycpLAogICAgICAgICAgICAgICB0aGlzIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgIG1lbW9yeSBjdXJyZW50bHkgYXZhaWxhYmxlIHRvCiAgICAgICAgICAgICAgIGJlIGFsbG9jYXRlZCBvbiB0aGUgc3lzdGVtLiBUaGlzIGxpbWl0IGlzIG9ubHkgYWRoZXJlZCB0bwpAQCAtMTMwMiw2ICsxMzAyLDIzIEBACiB1bm5lY2Vzc2FyeSBwYWdlIGZhdWx0cyBpbiB0aHJhc2hpbmcgc2l0dWF0aW9uLiBUaGUgdW5pdCBvZiB0aGUgdmFsdWUgaXMKIHNlY29uZC4gVGhlIHZhbHVlIHdvdWxkIGJlIHVzZWZ1bCB0byB0dW5lIHRocmFzaGluZyBiZWhhdmlvci4KIAorZHJvcF9jYWNoZXMKKy0tLS0tLS0tLS0tCisKK1dyaXRpbmcgdG8gdGhpcyB3aWxsIGNhdXNlIHRoZSBrZXJuZWwgdG8gZHJvcCBjbGVhbiBjYWNoZXMsIGRlbnRyaWVzIGFuZAoraW5vZGVzIGZyb20gbWVtb3J5LCBjYXVzaW5nIHRoYXQgbWVtb3J5IHRvIGJlY29tZSBmcmVlLgorCitUbyBmcmVlIHBhZ2VjYWNoZToKKwllY2hvIDEgPiAvcHJvYy9zeXMvdm0vZHJvcF9jYWNoZXMKK1RvIGZyZWUgZGVudHJpZXMgYW5kIGlub2RlczoKKwllY2hvIDIgPiAvcHJvYy9zeXMvdm0vZHJvcF9jYWNoZXMKK1RvIGZyZWUgcGFnZWNhY2hlLCBkZW50cmllcyBhbmQgaW5vZGVzOgorCWVjaG8gMyA+IC9wcm9jL3N5cy92bS9kcm9wX2NhY2hlcworCitBcyB0aGlzIGlzIGEgbm9uLWRlc3RydWN0aXZlIG9wZXJhdGlvbiBhbmQgZGlydHkgb2JqZWN0cyBhcmUgbm90IGZyZWVhYmxlLCB0aGUKK3VzZXIgc2hvdWxkIHJ1biBgc3luYycgZmlyc3QuCisKKwogMi41IC9wcm9jL3N5cy9kZXYgLSBEZXZpY2Ugc3BlY2lmaWMgcGFyYW1ldGVycwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3JhbWZzLXJvb3Rmcy1pbml0cmFtZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9yYW1mcy1yb290ZnMtaW5pdHJhbWZzLnR4dAppbmRleCBiMzQwNGEwLi42MGFiNjFlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3JhbWZzLXJvb3Rmcy1pbml0cmFtZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcmFtZnMtcm9vdGZzLWluaXRyYW1mcy50eHQKQEAgLTE0MywxMiArMTQzLDI2IEBACiAgIGRpciAvbW50IDc1NSAwIDAKICAgZmlsZSAvaW5pdCBpbml0cmFtZnMvaW5pdC5zaCA3NTUgMCAwCiAKK1J1biAidXNyL2dlbl9pbml0X2NwaW8iIChhZnRlciB0aGUga2VybmVsIGJ1aWxkKSB0byBnZXQgYSB1c2FnZSBtZXNzYWdlCitkb2N1bWVudGluZyB0aGUgYWJvdmUgZmlsZSBmb3JtYXQuCisKIE9uZSBhZHZhbnRhZ2Ugb2YgdGhlIHRleHQgZmlsZSBpcyB0aGF0IHJvb3QgYWNjZXNzIGlzIG5vdCByZXF1aXJlZCB0bwogc2V0IHBlcm1pc3Npb25zIG9yIGNyZWF0ZSBkZXZpY2Ugbm9kZXMgaW4gdGhlIG5ldyBhcmNoaXZlLiAgKE5vdGUgdGhhdCB0aG9zZQogdHdvIGV4YW1wbGUgImZpbGUiIGVudHJpZXMgZXhwZWN0IHRvIGZpbmQgZmlsZXMgbmFtZWQgImluaXQuc2giIGFuZCAiYnVzeWJveCIgaW4KIGEgZGlyZWN0b3J5IGNhbGxlZCAiaW5pdHJhbWZzIiwgdW5kZXIgdGhlIGxpbnV4LTIuNi4qIGRpcmVjdG9yeS4gIFNlZQogRG9jdW1lbnRhdGlvbi9lYXJseS11c2Vyc3BhY2UvUkVBRE1FIGZvciBtb3JlIGRldGFpbHMuKQogCitUaGUga2VybmVsIGRvZXMgbm90IGRlcGVuZCBvbiBleHRlcm5hbCBjcGlvIHRvb2xzLCBnZW5faW5pdF9jcGlvIGlzIGNyZWF0ZWQKK2Zyb20gdXNyL2dlbl9pbml0X2NwaW8uYyB3aGljaCBpcyBlbnRpcmVseSBzZWxmLWNvbnRhaW5lZCwgYW5kIHRoZSBrZXJuZWwncworYm9vdC10aW1lIGV4dHJhY3RvciBpcyBhbHNvIChvYnZpb3VzbHkpIHNlbGYtY29udGFpbmVkLiAgSG93ZXZlciwgaWYgeW91IF9kb18KK2hhcHBlbiB0byBoYXZlIGNwaW8gaW5zdGFsbGVkLCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgbGluZSBjYW4gZXh0cmFjdCB0aGUKK2dlbmVyYXRlZCBjcGlvIGltYWdlIGJhY2sgaW50byBpdHMgY29tcG9uZW50IGZpbGVzOgorCisgIGNwaW8gLWkgLWQgLUggbmV3YyAtRiBpbml0cmFtZnNfZGF0YS5jcGlvIC0tbm8tYWJzb2x1dGUtZmlsZW5hbWVzCisKK0NvbnRlbnRzIG9mIGluaXRyYW1mczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogSWYgeW91IGRvbid0IGFscmVhZHkgdW5kZXJzdGFuZCB3aGF0IHNoYXJlZCBsaWJyYXJpZXMsIGRldmljZXMsIGFuZCBwYXRocwogeW91IG5lZWQgdG8gZ2V0IGEgbWluaW1hbCByb290IGZpbGVzeXN0ZW0gdXAgYW5kIHJ1bm5pbmcsIGhlcmUgYXJlIHNvbWUKIHJlZmVyZW5jZXM6CkBAIC0xNjEsMTMgKzE3NSw2OSBAQAogY29kZSBhZ2FpbnN0LCBhbG9uZyB3aXRoIHNvbWUgcmVsYXRlZCB1dGlsaXRpZXMuICBJdCBpcyBCU0QgbGljZW5zZWQuCiAKIEkgdXNlIHVDbGliYyAoaHR0cDovL3d3dy51Y2xpYmMub3JnKSBhbmQgYnVzeWJveCAoaHR0cDovL3d3dy5idXN5Ym94Lm5ldCkKLW15c2VsZi4gIFRoZXNlIGFyZSBMR1BMIGFuZCBHUEwsIHJlc3BlY3RpdmVseS4KK215c2VsZi4gIFRoZXNlIGFyZSBMR1BMIGFuZCBHUEwsIHJlc3BlY3RpdmVseS4gIChBIHNlbGYtY29udGFpbmVkIGluaXRyYW1mcworcGFja2FnZSBpcyBwbGFubmVkIGZvciB0aGUgYnVzeWJveCAxLjIgcmVsZWFzZS4pCiAKIEluIHRoZW9yeSB5b3UgY291bGQgdXNlIGdsaWJjLCBidXQgdGhhdCdzIG5vdCB3ZWxsIHN1aXRlZCBmb3Igc21hbGwgZW1iZWRkZWQKIHVzZXMgbGlrZSB0aGlzLiAgKEEgImhlbGxvIHdvcmxkIiBwcm9ncmFtIHN0YXRpY2FsbHkgbGlua2VkIGFnYWluc3QgZ2xpYmMgaXMKIG92ZXIgNDAway4gIFdpdGggdUNsaWJjIGl0J3MgN2suICBBbHNvIG5vdGUgdGhhdCBnbGliYyBkbG9wZW5zIGxpYm5zcyB0byBkbwogbmFtZSBsb29rdXBzLCBldmVuIHdoZW4gb3RoZXJ3aXNlIHN0YXRpY2FsbHkgbGlua2VkLikKIAorV2h5IGNwaW8gcmF0aGVyIHRoYW4gdGFyPworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGRlY2lzaW9uIHdhcyBtYWRlIGJhY2sgaW4gRGVjZW1iZXIsIDIwMDEuICBUaGUgZGlzY3Vzc2lvbiBzdGFydGVkIGhlcmU6CisKKyAgaHR0cDovL3d3dy51d3NnLml1LmVkdS9oeXBlcm1haWwvbGludXgva2VybmVsLzAxMTIuMi8xNTM4Lmh0bWwKKworQW5kIHNwYXduZWQgYSBzZWNvbmQgdGhyZWFkIChzcGVjaWZpY2FsbHkgb24gdGFyIHZzIGNwaW8pLCBzdGFydGluZyBoZXJlOgorCisgIGh0dHA6Ly93d3cudXdzZy5pdS5lZHUvaHlwZXJtYWlsL2xpbnV4L2tlcm5lbC8wMTEyLjIvMTU4Ny5odG1sCisKK1RoZSBxdWljayBhbmQgZGlydHkgc3VtbWFyeSB2ZXJzaW9uICh3aGljaCBpcyBubyBzdWJzdGl0dXRlIGZvciByZWFkaW5nCit0aGUgYWJvdmUgdGhyZWFkcykgaXM6CisKKzEpIGNwaW8gaXMgYSBzdGFuZGFyZC4gIEl0J3MgZGVjYWRlcyBvbGQgKGZyb20gdGhlIEFUJlQgZGF5cyksIGFuZCBhbHJlYWR5CisgICB3aWRlbHkgdXNlZCBvbiBMaW51eCAoaW5zaWRlIFJQTSwgUmVkIEhhdCdzIGRldmljZSBkcml2ZXIgZGlza3MpLiAgSGVyZSdzCisgICBhIExpbnV4IEpvdXJuYWwgYXJ0aWNsZSBhYm91dCBpdCBmcm9tIDE5OTY6CisKKyAgICAgIGh0dHA6Ly93d3cubGludXhqb3VybmFsLmNvbS9hcnRpY2xlLzEyMTMKKworICAgSXQncyBub3QgYXMgcG9wdWxhciBhcyB0YXIgYmVjYXVzZSB0aGUgdHJhZGl0aW9uYWwgY3BpbyBjb21tYW5kIGxpbmUgdG9vbHMKKyAgIHJlcXVpcmUgX3RydWx5X2hpZGVvdXNfIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuICBCdXQgdGhhdCBzYXlzIG5vdGhpbmcKKyAgIGVpdGhlciB3YXkgYWJvdXQgdGhlIGFyY2hpdmUgZm9ybWF0LCBhbmQgdGhlcmUgYXJlIGFsdGVybmF0aXZlIHRvb2xzLAorICAgc3VjaCBhczoKKworICAgICBodHRwOi8vZnJlc2htZWF0Lm5ldC9wcm9qZWN0cy9hZmlvLworCisyKSBUaGUgY3BpbyBhcmNoaXZlIGZvcm1hdCBjaG9zZW4gYnkgdGhlIGtlcm5lbCBpcyBzaW1wbGVyIGFuZCBjbGVhbmVyIChhbmQKKyAgIHRodXMgZWFzaWVyIHRvIGNyZWF0ZSBhbmQgcGFyc2UpIHRoYW4gYW55IG9mIHRoZSAobGl0ZXJhbGx5IGRvemVucyBvZikKKyAgIHZhcmlvdXMgdGFyIGFyY2hpdmUgZm9ybWF0cy4gIFRoZSBjb21wbGV0ZSBpbml0cmFtZnMgYXJjaGl2ZSBmb3JtYXQgaXMKKyAgIGV4cGxhaW5lZCBpbiBidWZmZXItZm9ybWF0LnR4dCwgY3JlYXRlZCBpbiB1c3IvZ2VuX2luaXRfY3Bpby5jLCBhbmQKKyAgIGV4dHJhY3RlZCBpbiBpbml0L2luaXRyYW1mcy5jLiAgQWxsIHRocmVlIHRvZ2V0aGVyIGNvbWUgdG8gbGVzcyB0aGFuIDI2aworICAgdG90YWwgb2YgaHVtYW4tcmVhZGFibGUgdGV4dC4KKworMykgVGhlIEdOVSBwcm9qZWN0IHN0YW5kYXJkaXppbmcgb24gdGFyIGlzIGFwcHJveGltYXRlbHkgYXMgcmVsZXZhbnQgYXMKKyAgIFdpbmRvd3Mgc3RhbmRhcmRpemluZyBvbiB6aXAuICBMaW51eCBpcyBub3QgcGFydCBvZiBlaXRoZXIsIGFuZCBpcyBmcmVlCisgICB0byBtYWtlIGl0cyBvd24gdGVjaG5pY2FsIGRlY2lzaW9ucy4KKworNCkgU2luY2UgdGhpcyBpcyBhIGtlcm5lbCBpbnRlcm5hbCBmb3JtYXQsIGl0IGNvdWxkIGVhc2lseSBoYXZlIGJlZW4KKyAgIHNvbWV0aGluZyBicmFuZCBuZXcuICBUaGUga2VybmVsIHByb3ZpZGVzIGl0cyBvd24gdG9vbHMgdG8gY3JlYXRlIGFuZAorICAgZXh0cmFjdCB0aGlzIGZvcm1hdCBhbnl3YXkuICBVc2luZyBhbiBleGlzdGluZyBzdGFuZGFyZCB3YXMgcHJlZmVyYWJsZSwKKyAgIGJ1dCBub3QgZXNzZW50aWFsLgorCis1KSBBbCBWaXJvIG1hZGUgdGhlIGRlY2lzaW9uIChxdW90ZTogInRhciBpcyB1Z2x5IGFzIGhlbGwgYW5kIG5vdCBnb2luZyB0byBiZQorICAgc3VwcG9ydGVkIG9uIHRoZSBrZXJuZWwgc2lkZSIpOgorCisgICAgICBodHRwOi8vd3d3LnV3c2cuaXUuZWR1L2h5cGVybWFpbC9saW51eC9rZXJuZWwvMDExMi4yLzE1NDAuaHRtbAorCisgICBleHBsYWluZWQgaGlzIHJlYXNvbmluZzoKKworICAgICAgaHR0cDovL3d3dy51d3NnLml1LmVkdS9oeXBlcm1haWwvbGludXgva2VybmVsLzAxMTIuMi8xNTUwLmh0bWwKKyAgICAgIGh0dHA6Ly93d3cudXdzZy5pdS5lZHUvaHlwZXJtYWlsL2xpbnV4L2tlcm5lbC8wMTEyLjIvMTYzOC5odG1sCisKKyAgIGFuZCwgbW9zdCBpbXBvcnRhbnRseSwgZGVzaWduZWQgYW5kIGltcGxlbWVudGVkIHRoZSBpbml0cmFtZnMgY29kZS4KKwogRnV0dXJlIGRpcmVjdGlvbnM6CiAtLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9yZWxheWZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcmVsYXlmcy50eHQKaW5kZXggZDgwM2FiZS4uNTgzMjM3NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9yZWxheWZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3JlbGF5ZnMudHh0CkBAIC00NCwzMCArNDQsNDEgQEAKIGNvbGxlY3RlZCBieSB1c2Vyc3BhY2UsIGFuZCBub3Qgd2FpdCBmb3IgaXQgdG8gY29uc3VtZSBpdC4KIAogcmVsYXlmcyBpdHNlbGYgZG9lcyBub3QgcHJvdmlkZSBmb3IgY29tbXVuaWNhdGlvbiBvZiBzdWNoIGRhdGEgYmV0d2VlbgotdXNlcnNwYWNlIGFuZCBrZXJuZWwsIGFsbG93aW5nIHRoZSBrZXJuZWwgc2lkZSB0byByZW1haW4gc2ltcGxlIGFuZCBub3QKLWltcG9zZSBhIHNpbmdsZSBpbnRlcmZhY2Ugb24gdXNlcnNwYWNlLiBJdCBkb2VzIHByb3ZpZGUgYSBzZXBhcmF0ZQotaGVscGVyIHRob3VnaCwgZGVzY3JpYmVkIGJlbG93LgordXNlcnNwYWNlIGFuZCBrZXJuZWwsIGFsbG93aW5nIHRoZSBrZXJuZWwgc2lkZSB0byByZW1haW4gc2ltcGxlIGFuZAorbm90IGltcG9zZSBhIHNpbmdsZSBpbnRlcmZhY2Ugb24gdXNlcnNwYWNlLiBJdCBkb2VzIHByb3ZpZGUgYSBzZXQgb2YKK2V4YW1wbGVzIGFuZCBhIHNlcGFyYXRlIGhlbHBlciB0aG91Z2gsIGRlc2NyaWJlZCBiZWxvdy4KIAota2xvZywgcmVsYXktYXBwICYgbGlicmVsYXkKLT09PT09PT09PT09PT09PT09PT09PT09PT09CitrbG9nIGFuZCByZWxheS1hcHBzIGV4YW1wbGUgY29kZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotcmVsYXlmcyBpdHNlbGYgaXMgcmVhZHkgdG8gdXNlLCBidXQgdG8gbWFrZSB0aGluZ3MgZWFzaWVyLCB0d28KLWFkZGl0aW9uYWwgc3lzdGVtcyBhcmUgcHJvdmlkZWQuICBrbG9nIGlzIGEgc2ltcGxlIHdyYXBwZXIgdG8gbWFrZQotd3JpdGluZyBmb3JtYXR0ZWQgdGV4dCBvciByYXcgZGF0YSB0byBhIGNoYW5uZWwgc2ltcGxlciwgcmVnYXJkbGVzcyBvZgotd2hldGhlciBhIGNoYW5uZWwgdG8gd3JpdGUgaW50byBleGlzdHMgb3Igbm90LCBvciB3aGV0aGVyIHJlbGF5ZnMgaXMKLWNvbXBpbGVkIGludG8gdGhlIGtlcm5lbCBvciBpcyBjb25maWd1cmVkIGFzIGEgbW9kdWxlLiAgcmVsYXktYXBwIGlzCi10aGUga2VybmVsIGNvdW50ZXJwYXJ0IG9mIHVzZXJzcGFjZSBsaWJyZWxheS5jLCBjb21iaW5lZCB0aGVzZSB0d28KLWZpbGVzIHByb3ZpZGUgZ2x1ZSB0byBlYXNpbHkgc3RyZWFtIGRhdGEgdG8gZGlzaywgd2l0aG91dCBoYXZpbmcgdG8KLWJvdGhlciB3aXRoIGhvdXNla2VlcGluZy4gIGtsb2cgYW5kIHJlbGF5LWFwcCBjYW4gYmUgdXNlZCB0b2dldGhlciwKLXdpdGgga2xvZyBwcm92aWRpbmcgaGlnaC1sZXZlbCBsb2dnaW5nIGZ1bmN0aW9ucyB0byB0aGUga2VybmVsIGFuZAotcmVsYXktYXBwIHRha2luZyBjYXJlIG9mIGtlcm5lbC11c2VyIGNvbnRyb2wgYW5kIGRpc2stbG9nZ2luZyBjaG9yZXMuCityZWxheWZzIGl0c2VsZiBpcyByZWFkeSB0byB1c2UsIGJ1dCB0byBtYWtlIHRoaW5ncyBlYXNpZXIsIGEgY291cGxlCitzaW1wbGUgdXRpbGl0eSBmdW5jdGlvbnMgYW5kIGEgc2V0IG9mIGV4YW1wbGVzIGFyZSBwcm92aWRlZC4KIAotSXQgaXMgcG9zc2libGUgdG8gdXNlIHJlbGF5ZnMgd2l0aG91dCByZWxheS1hcHAgJiBsaWJyZWxheSwgYnV0IHlvdSdsbAotaGF2ZSB0byBpbXBsZW1lbnQgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHVzZXJzcGFjZSBhbmQga2VybmVsLCBhbGxvd2luZwotYm90aCB0byBjb252ZXkgdGhlIHN0YXRlIG9mIGJ1ZmZlcnMgKGZ1bGwsIGVtcHR5LCBhbW91bnQgb2YgcGFkZGluZykuCitUaGUgcmVsYXktYXBwcyBleGFtcGxlIHRhcmJhbGwsIGF2YWlsYWJsZSBvbiB0aGUgcmVsYXlmcyBzb3VyY2Vmb3JnZQorc2l0ZSwgY29udGFpbnMgYSBzZXQgb2Ygc2VsZi1jb250YWluZWQgZXhhbXBsZXMsIGVhY2ggY29uc2lzdGluZyBvZiBhCitwYWlyIG9mIC5jIGZpbGVzIGNvbnRhaW5pbmcgYm9pbGVycGxhdGUgY29kZSBmb3IgZWFjaCBvZiB0aGUgdXNlciBhbmQKK2tlcm5lbCBzaWRlcyBvZiBhIHJlbGF5ZnMgYXBwbGljYXRpb247IGNvbWJpbmVkIHRoZXNlIHR3byBzZXRzIG9mCitib2lsZXJwbGF0ZSBjb2RlIHByb3ZpZGUgZ2x1ZSB0byBlYXNpbHkgc3RyZWFtIGRhdGEgdG8gZGlzaywgd2l0aG91dAoraGF2aW5nIHRvIGJvdGhlciB3aXRoIG11bmRhbmUgaG91c2VrZWVwaW5nIGNob3Jlcy4KIAota2xvZywgcmVsYXktYXBwIGFuZCBsaWJyZWxheSBjYW4gYmUgZm91bmQgaW4gdGhlIHJlbGF5LWFwcHMgdGFyYmFsbCBvbgotaHR0cDovL3JlbGF5ZnMuc291cmNlZm9yZ2UubmV0CitUaGUgJ2tsb2cgZGVidWdnaW5nIGZ1bmN0aW9ucycgcGF0Y2ggKGtsb2cucGF0Y2ggaW4gdGhlIHJlbGF5LWFwcHMKK3RhcmJhbGwpIHByb3ZpZGVzIGEgY291cGxlIG9mIGhpZ2gtbGV2ZWwgbG9nZ2luZyBmdW5jdGlvbnMgdG8gdGhlCitrZXJuZWwgd2hpY2ggYWxsb3cgd3JpdGluZyBmb3JtYXR0ZWQgdGV4dCBvciByYXcgZGF0YSB0byBhIGNoYW5uZWwsCityZWdhcmRsZXNzIG9mIHdoZXRoZXIgYSBjaGFubmVsIHRvIHdyaXRlIGludG8gZXhpc3RzIG9yIG5vdCwgb3IKK3doZXRoZXIgcmVsYXlmcyBpcyBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwgb3IgaXMgY29uZmlndXJlZCBhcyBhCittb2R1bGUuICBUaGVzZSBmdW5jdGlvbnMgYWxsb3cgeW91IHRvIHB1dCB1bmNvbmRpdGlvbmFsICd0cmFjZScKK3N0YXRlbWVudHMgYW55d2hlcmUgaW4gdGhlIGtlcm5lbCBvciBrZXJuZWwgbW9kdWxlczsgb25seSB3aGVuIHRoZXJlCitpcyBhICdrbG9nIGhhbmRsZXInIHJlZ2lzdGVyZWQgd2lsbCBkYXRhIGFjdHVhbGx5IGJlIGxvZ2dlZCAoc2VlIHRoZQora2xvZyBhbmQga2xlYWsgZXhhbXBsZXMgZm9yIGRldGFpbHMpLgorCitJdCBpcyBvZiBjb3Vyc2UgcG9zc2libGUgdG8gdXNlIHJlbGF5ZnMgZnJvbSBzY3JhdGNoIGkuZS4gd2l0aG91dAordXNpbmcgYW55IG9mIHRoZSByZWxheS1hcHBzIGV4YW1wbGUgY29kZSBvciBrbG9nLCBidXQgeW91J2xsIGhhdmUgdG8KK2ltcGxlbWVudCBjb21tdW5pY2F0aW9uIGJldHdlZW4gdXNlcnNwYWNlIGFuZCBrZXJuZWwsIGFsbG93aW5nIGJvdGggdG8KK2NvbnZleSB0aGUgc3RhdGUgb2YgYnVmZmVycyAoZnVsbCwgZW1wdHksIGFtb3VudCBvZiBwYWRkaW5nKS4KKwora2xvZyBhbmQgdGhlIHJlbGF5LWFwcHMgZXhhbXBsZXMgY2FuIGJlIGZvdW5kIGluIHRoZSByZWxheS1hcHBzCit0YXJiYWxsIG9uIGh0dHA6Ly9yZWxheWZzLnNvdXJjZWZvcmdlLm5ldAorCiAKIFRoZSByZWxheWZzIHVzZXIgc3BhY2UgQVBJCiA9PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTI1LDYgKzEzNiw4IEBACiAgICAgcmVsYXlfcmVzZXQoY2hhbikKICAgICByZWxheWZzX2NyZWF0ZV9kaXIobmFtZSwgcGFyZW50KQogICAgIHJlbGF5ZnNfcmVtb3ZlX2RpcihkZW50cnkpCisgICAgcmVsYXlmc19jcmVhdGVfZmlsZShuYW1lLCBwYXJlbnQsIG1vZGUsIGZvcHMsIGRhdGEpCisgICAgcmVsYXlmc19yZW1vdmVfZmlsZShkZW50cnkpCiAKICAgY2hhbm5lbCBtYW5hZ2VtZW50IHR5cGljYWxseSBjYWxsZWQgb24gaW5zdGlnYXRpb24gb2YgdXNlcnNwYWNlOgogCkBAIC0xNDEsNiArMTU0LDggQEAKICAgICBzdWJidWZfc3RhcnQoYnVmLCBzdWJidWYsIHByZXZfc3ViYnVmLCBwcmV2X3BhZGRpbmcpCiAgICAgYnVmX21hcHBlZChidWYsIGZpbHApCiAgICAgYnVmX3VubWFwcGVkKGJ1ZiwgZmlscCkKKyAgICBjcmVhdGVfYnVmX2ZpbGUoZmlsZW5hbWUsIHBhcmVudCwgbW9kZSwgYnVmLCBpc19nbG9iYWwpCisgICAgcmVtb3ZlX2J1Zl9maWxlKGRlbnRyeSkKIAogICBoZWxwZXIgZnVuY3Rpb25zOgogCkBAIC0zMjAsNiArMzM1LDcxIEBACiB0byBmaW5hbGl6ZSBhbmQgcHJvY2VzcyB0aGUgbGFzdCBzdWItYnVmZmVycyBiZWZvcmUgdGhlIGNoYW5uZWwgaXMKIGNsb3NlZC4KIAorQ3JlYXRpbmcgbm9uLXJlbGF5IGZpbGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcmVsYXlfb3BlbigpIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBmaWxlcyBpbiB0aGUgcmVsYXlmcyBmaWxlc3lzdGVtIHRvCityZXByZXNlbnQgdGhlIHBlci1jcHUga2VybmVsIGJ1ZmZlcnM7IGl0J3Mgb2Z0ZW4gdXNlZnVsIGZvcgorYXBwbGljYXRpb25zIHRvIGJlIGFibGUgdG8gY3JlYXRlIHRoZWlyIG93biBmaWxlcyBhbG9uZ3NpZGUgdGhlIHJlbGF5CitmaWxlcyBpbiB0aGUgcmVsYXlmcyBmaWxlc3lzdGVtIGFzIHdlbGwgZS5nLiAnY29udHJvbCcgZmlsZXMgbXVjaCBsaWtlCit0aG9zZSBjcmVhdGVkIGluIC9wcm9jIG9yIGRlYnVnZnMgZm9yIHNpbWlsYXIgcHVycG9zZXMsIHVzZWQgdG8KK2NvbW11bmljYXRlIGNvbnRyb2wgaW5mb3JtYXRpb24gYmV0d2VlbiB0aGUga2VybmVsIGFuZCB1c2VyIHNpZGVzIG9mIGEKK3JlbGF5ZnMgYXBwbGljYXRpb24uICBGb3IgdGhpcyBwdXJwb3NlIHRoZSByZWxheWZzX2NyZWF0ZV9maWxlKCkgYW5kCityZWxheWZzX3JlbW92ZV9maWxlKCkgQVBJIGZ1bmN0aW9ucyBleGlzdC4gIEZvciByZWxheWZzX2NyZWF0ZV9maWxlKCksCit0aGUgY2FsbGVyIHBhc3NlcyBpbiBhIHNldCBvZiB1c2VyLWRlZmluZWQgZmlsZSBvcGVyYXRpb25zIHRvIGJlIHVzZWQKK2ZvciB0aGUgZmlsZSBhbmQgYW4gb3B0aW9uYWwgdm9pZCAqIHRvIGEgdXNlci1zcGVjaWZpZWQgZGF0YSBpdGVtLAord2hpY2ggd2lsbCBiZSBhY2Nlc3NpYmxlIHZpYSBpbm9kZS0+dS5nZW5lcmljX2lwIChzZWUgdGhlIHJlbGF5LWFwcHMKK3RhcmJhbGwgZm9yIGV4YW1wbGVzKS4gIFRoZSBmaWxlX29wZXJhdGlvbnMgYXJlIGEgcmVxdWlyZWQgcGFyYW1ldGVyCit0byByZWxheWZzX2NyZWF0ZV9maWxlKCkgYW5kIHRodXMgdGhlIHNlbWFudGljcyBvZiB0aGVzZSBmaWxlcyBhcmUKK2NvbXBsZXRlbHkgZGVmaW5lZCBieSB0aGUgY2FsbGVyLgorCitTZWUgdGhlIHJlbGF5LWFwcHMgdGFyYmFsbCBhdCBodHRwOi8vcmVsYXlmcy5zb3VyY2Vmb3JnZS5uZXQgZm9yCitleGFtcGxlcyBvZiBob3cgdGhlc2Ugbm9uLXJlbGF5IGZpbGVzIGFyZSBtZWFudCB0byBiZSB1c2VkLgorCitDcmVhdGluZyByZWxheSBmaWxlcyBpbiBvdGhlciBmaWxlc3lzdGVtcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQnkgZGVmYXVsdCBvZiBjb3Vyc2UsIHJlbGF5X29wZW4oKSBjcmVhdGVzIHJlbGF5IGZpbGVzIGluIHRoZSByZWxheWZzCitmaWxlc3lzdGVtLiAgQmVjYXVzZSByZWxheV9maWxlX29wZXJhdGlvbnMgaXMgZXhwb3J0ZWQsIGhvd2V2ZXIsIGl0J3MKK2Fsc28gcG9zc2libGUgdG8gY3JlYXRlIGFuZCB1c2UgcmVsYXkgZmlsZXMgaW4gb3RoZXIgcHNldWRvLWZpbGVzeXRlbXMKK3N1Y2ggYXMgZGVidWdmcy4KKworRm9yIHRoaXMgcHVycG9zZSwgdHdvIGNhbGxiYWNrIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQsCitjcmVhdGVfYnVmX2ZpbGUoKSBhbmQgcmVtb3ZlX2J1Zl9maWxlKCkuICBjcmVhdGVfYnVmX2ZpbGUoKSBpcyBjYWxsZWQKK29uY2UgZm9yIGVhY2ggcGVyLWNwdSBidWZmZXIgZnJvbSByZWxheV9vcGVuKCkgdG8gYWxsb3cgdGhlIGNsaWVudCB0bworY3JlYXRlIGEgZmlsZSB0byBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY29ycmVzcG9uZGluZyBidWZmZXI7IGlmCit0aGlzIGNhbGxiYWNrIGlzIG5vdCBkZWZpbmVkLCB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGNyZWF0ZQorYW5kIHJldHVybiBhIGZpbGUgaW4gdGhlIHJlbGF5ZnMgZmlsZXN5c3RlbSB0byByZXByZXNlbnQgdGhlIGJ1ZmZlci4KK1RoZSBjYWxsYmFjayBzaG91bGQgcmV0dXJuIHRoZSBkZW50cnkgb2YgdGhlIGZpbGUgY3JlYXRlZCB0byByZXByZXNlbnQKK3RoZSByZWxheSBidWZmZXIuICBOb3RlIHRoYXQgdGhlIHBhcmVudCBkaXJlY3RvcnkgcGFzc2VkIHRvCityZWxheV9vcGVuKCkgKGFuZCBwYXNzZWQgYWxvbmcgdG8gdGhlIGNhbGxiYWNrKSwgaWYgc3BlY2lmaWVkLCBtdXN0CitleGlzdCBpbiB0aGUgc2FtZSBmaWxlc3lzdGVtIHRoZSBuZXcgcmVsYXkgZmlsZSBpcyBjcmVhdGVkIGluLiAgSWYKK2NyZWF0ZV9idWZfZmlsZSgpIGlzIGRlZmluZWQsIHJlbW92ZV9idWZfZmlsZSgpIG11c3QgYWxzbyBiZSBkZWZpbmVkOworaXQncyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIGZpbGUocykgY3JlYXRlZCBpbiBjcmVhdGVfYnVmX2ZpbGUoKQorYW5kIGlzIGNhbGxlZCBkdXJpbmcgcmVsYXlfY2xvc2UoKS4KKworVGhlIGNyZWF0ZV9idWZfZmlsZSgpIGltcGxlbWVudGF0aW9uIGNhbiBhbHNvIGJlIGRlZmluZWQgaW4gc3VjaCBhIHdheQorYXMgdG8gYWxsb3cgdGhlIGNyZWF0aW9uIG9mIGEgc2luZ2xlICdnbG9iYWwnIGJ1ZmZlciBpbnN0ZWFkIG9mIHRoZQorZGVmYXVsdCBwZXItY3B1IHNldC4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgYXBwbGljYXRpb25zIGludGVyZXN0ZWQKK21haW5seSBpbiBzZWVpbmcgdGhlIHJlbGF0aXZlIG9yZGVyaW5nIG9mIHN5c3RlbS13aWRlIGV2ZW50cyB3aXRob3V0Cit0aGUgbmVlZCB0byBib3RoZXIgd2l0aCBzYXZpbmcgZXhwbGljaXQgdGltZXN0YW1wcyBmb3IgdGhlIHB1cnBvc2Ugb2YKK21lcmdpbmcvc29ydGluZyBwZXItY3B1IGZpbGVzIGluIGEgcG9zdHByb2Nlc3Npbmcgc3RlcC4KKworVG8gaGF2ZSByZWxheV9vcGVuKCkgY3JlYXRlIGEgZ2xvYmFsIGJ1ZmZlciwgdGhlIGNyZWF0ZV9idWZfZmlsZSgpCitpbXBsZW1lbnRhdGlvbiBzaG91bGQgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgaXNfZ2xvYmFsIG91dHBhcmFtIHRvIGEKK25vbi16ZXJvIHZhbHVlIGluIGFkZGl0aW9uIHRvIGNyZWF0aW5nIHRoZSBmaWxlIHRoYXQgd2lsbCBiZSB1c2VkIHRvCityZXByZXNlbnQgdGhlIHNpbmdsZSBidWZmZXIuICBJbiB0aGUgY2FzZSBvZiBhIGdsb2JhbCBidWZmZXIsCitjcmVhdGVfYnVmX2ZpbGUoKSBhbmQgcmVtb3ZlX2J1Zl9maWxlKCkgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlLiAgVGhlCitub3JtYWwgY2hhbm5lbC13cml0aW5nIGZ1bmN0aW9ucyBlLmcuIHJlbGF5X3dyaXRlKCkgY2FuIHN0aWxsIGJlIHVzZWQKKy0gd3JpdGVzIGZyb20gYW55IGNwdSB3aWxsIHRyYW5zcGFyZW50bHkgZW5kIHVwIGluIHRoZSBnbG9iYWwgYnVmZmVyIC0KK2J1dCBzaW5jZSBpdCBpcyBhIGdsb2JhbCBidWZmZXIsIGNhbGxlcnMgc2hvdWxkIG1ha2Ugc3VyZSB0aGV5IHVzZSB0aGUKK3Byb3BlciBsb2NraW5nIGZvciBzdWNoIGEgYnVmZmVyLCBlaXRoZXIgYnkgd3JhcHBpbmcgd3JpdGVzIGluIGEKK3NwaW5sb2NrLCBvciBieSBjb3B5aW5nIGEgd3JpdGUgZnVuY3Rpb24gZnJvbSByZWxheWZzX2ZzLmggYW5kCitjcmVhdGluZyBhIGxvY2FsIHZlcnNpb24gdGhhdCBpbnRlcm5hbGx5IGRvZXMgdGhlIHByb3BlciBsb2NraW5nLgorCitTZWUgdGhlICdleHBvcnRlZC1yZWxheWZpbGUnIGV4YW1wbGVzIGluIHRoZSByZWxheS1hcHBzIHRhcmJhbGwgZm9yCitleGFtcGxlcyBvZiBjcmVhdGluZyBhbmQgdXNpbmcgcmVsYXkgZmlsZXMgaW4gZGVidWdmcy4KKwogTWlzYwogLS0tLQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3NwdWZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc3B1ZnMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZGMzOTUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3NwdWZzLnR4dApAQCAtMCwwICsxLDUyMSBAQAorU1BVRlMoMikgICAgICAgICAgICAgICAgICAgTGludXggUHJvZ3JhbW1lcidzIE1hbnVhbCAgICAgICAgICAgICAgICAgIFNQVUZTKDIpCisKKworCitOQU1FCisgICAgICAgc3B1ZnMgLSB0aGUgU1BVIGZpbGUgc3lzdGVtCisKKworREVTQ1JJUFRJT04KKyAgICAgICBUaGUgU1BVIGZpbGUgc3lzdGVtIGlzIHVzZWQgb24gUG93ZXJQQyBtYWNoaW5lcyB0aGF0IGltcGxlbWVudCB0aGUgQ2VsbAorICAgICAgIEJyb2FkYmFuZCBFbmdpbmUgQXJjaGl0ZWN0dXJlIGluIG9yZGVyIHRvIGFjY2VzcyBTeW5lcmdpc3RpYyAgUHJvY2Vzc29yCisgICAgICAgVW5pdHMgKFNQVXMpLgorCisgICAgICAgVGhlIGZpbGUgc3lzdGVtIHByb3ZpZGVzIGEgbmFtZSBzcGFjZSBzaW1pbGFyIHRvIHBvc2l4IHNoYXJlZCBtZW1vcnkgb3IKKyAgICAgICBtZXNzYWdlIHF1ZXVlcy4gVXNlcnMgdGhhdCBoYXZlIHdyaXRlIHBlcm1pc3Npb25zIG9uICB0aGUgIGZpbGUgIHN5c3RlbQorICAgICAgIGNhbiB1c2Ugc3B1X2NyZWF0ZSgyKSB0byBlc3RhYmxpc2ggU1BVIGNvbnRleHRzIGluIHRoZSBzcHVmcyByb290LgorCisgICAgICAgRXZlcnkgU1BVIGNvbnRleHQgaXMgcmVwcmVzZW50ZWQgYnkgYSBkaXJlY3RvcnkgY29udGFpbmluZyBhIHByZWRlZmluZWQKKyAgICAgICBzZXQgb2YgZmlsZXMuIFRoZXNlIGZpbGVzIGNhbiBiZSB1c2VkIGZvciBtYW5pcHVsYXRpbmcgdGhlIHN0YXRlIG9mIHRoZQorICAgICAgIGxvZ2ljYWwgU1BVLiBVc2VycyBjYW4gY2hhbmdlIHBlcm1pc3Npb25zIG9uIHRob3NlIGZpbGVzLCBidXQgbm90IGFjdHUtCisgICAgICAgYWxseSBhZGQgb3IgcmVtb3ZlIGZpbGVzLgorCisKK01PVU5UIE9QVElPTlMKKyAgICAgICB1aWQ9PHVpZD4KKyAgICAgICAgICAgICAgc2V0IHRoZSB1c2VyIG93bmluZyB0aGUgbW91bnQgcG9pbnQsIHRoZSBkZWZhdWx0IGlzIDAgKHJvb3QpLgorCisgICAgICAgZ2lkPTxnaWQ+CisgICAgICAgICAgICAgIHNldCB0aGUgZ3JvdXAgb3duaW5nIHRoZSBtb3VudCBwb2ludCwgdGhlIGRlZmF1bHQgaXMgMCAocm9vdCkuCisKKworRklMRVMKKyAgICAgICBUaGUgZmlsZXMgaW4gc3B1ZnMgbW9zdGx5IGZvbGxvdyB0aGUgc3RhbmRhcmQgYmVoYXZpb3IgZm9yIHJlZ3VsYXIgc3lzLQorICAgICAgIHRlbSAgY2FsbHMgbGlrZSByZWFkKDIpIG9yIHdyaXRlKDIpLCBidXQgb2Z0ZW4gc3VwcG9ydCBvbmx5IGEgc3Vic2V0IG9mCisgICAgICAgdGhlIG9wZXJhdGlvbnMgc3VwcG9ydGVkIG9uIHJlZ3VsYXIgZmlsZSBzeXN0ZW1zLiBUaGlzIGxpc3QgZGV0YWlscyB0aGUKKyAgICAgICBzdXBwb3J0ZWQgIG9wZXJhdGlvbnMgIGFuZCAgdGhlICBkZXZpYXRpb25zICBmcm9tICB0aGUgYmVoYXZpb3VyIGluIHRoZQorICAgICAgIHJlc3BlY3RpdmUgbWFuIHBhZ2VzLgorCisgICAgICAgQWxsIGZpbGVzIHRoYXQgc3VwcG9ydCB0aGUgcmVhZCgyKSBvcGVyYXRpb24gYWxzbyBzdXBwb3J0IHJlYWR2KDIpICBhbmQKKyAgICAgICBhbGwgIGZpbGVzICB0aGF0IHN1cHBvcnQgdGhlIHdyaXRlKDIpIG9wZXJhdGlvbiBhbHNvIHN1cHBvcnQgd3JpdGV2KDIpLgorICAgICAgIEFsbCBmaWxlcyBzdXBwb3J0IHRoZSBhY2Nlc3MoMikgYW5kIHN0YXQoMikgZmFtaWx5IG9mICBvcGVyYXRpb25zLCAgYnV0CisgICAgICAgb25seSAgdGhlICBzdF9tb2RlLCAgc3RfbmxpbmssICBzdF91aWQgYW5kIHN0X2dpZCBmaWVsZHMgb2Ygc3RydWN0IHN0YXQKKyAgICAgICBjb250YWluIHJlbGlhYmxlIGluZm9ybWF0aW9uLgorCisgICAgICAgQWxsIGZpbGVzIHN1cHBvcnQgdGhlIGNobW9kKDIpL2ZjaG1vZCgyKSBhbmQgY2hvd24oMikvZmNob3duKDIpICBvcGVyYS0KKyAgICAgICB0aW9ucywgIGJ1dCAgd2lsbCAgbm90IGJlIGFibGUgdG8gZ3JhbnQgcGVybWlzc2lvbnMgdGhhdCBjb250cmFkaWN0IHRoZQorICAgICAgIHBvc3NpYmxlIG9wZXJhdGlvbnMsIGUuZy4gcmVhZCBhY2Nlc3Mgb24gdGhlIHdib3ggZmlsZS4KKworICAgICAgIFRoZSBjdXJyZW50IHNldCBvZiBmaWxlcyBpczoKKworCisgICAvbWVtCisgICAgICAgdGhlIGNvbnRlbnRzIG9mIHRoZSBsb2NhbCBzdG9yYWdlIG1lbW9yeSAgb2YgIHRoZSAgU1BVLiAgIFRoaXMgIGNhbiAgYmUKKyAgICAgICBhY2Nlc3NlZCAgbGlrZSAgYSByZWd1bGFyIHNoYXJlZCBtZW1vcnkgZmlsZSBhbmQgY29udGFpbnMgYm90aCBjb2RlIGFuZAorICAgICAgIGRhdGEgaW4gdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIFNQVS4gIFRoZSBwb3NzaWJsZSAgb3BlcmF0aW9ucyAgb24gIGFuCisgICAgICAgb3BlbiBtZW0gZmlsZSBhcmU6CisKKyAgICAgICByZWFkKDIpLCBwcmVhZCgyKSwgd3JpdGUoMiksIHB3cml0ZSgyKSwgbHNlZWsoMikKKyAgICAgICAgICAgICAgVGhlc2UgIG9wZXJhdGUgIGFzICBkb2N1bWVudGVkLCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCBzZWVrKDIpLAorICAgICAgICAgICAgICB3cml0ZSgyKSBhbmQgcHdyaXRlKDIpIGFyZSBub3Qgc3VwcG9ydGVkIGJleW9uZCB0aGUgZW5kICBvZiAgdGhlCisgICAgICAgICAgICAgIGZpbGUuIFRoZSBmaWxlIHNpemUgaXMgdGhlIHNpemUgb2YgdGhlIGxvY2FsIHN0b3JhZ2Ugb2YgdGhlIFNQVSwKKyAgICAgICAgICAgICAgd2hpY2ggbm9ybWFsbHkgaXMgMjU2IGtpbG9ieXRlcy4KKworICAgICAgIG1tYXAoMikKKyAgICAgICAgICAgICAgTWFwcGluZyBtZW0gaW50byB0aGUgcHJvY2VzcyBhZGRyZXNzIHNwYWNlIGdpdmVzIGFjY2VzcyAgdG8gIHRoZQorICAgICAgICAgICAgICBTUFUgIGxvY2FsICBzdG9yYWdlICB3aXRoaW4gIHRoZSAgcHJvY2VzcyAgYWRkcmVzcyAgc3BhY2UuICBPbmx5CisgICAgICAgICAgICAgIE1BUF9TSEFSRUQgbWFwcGluZ3MgYXJlIGFsbG93ZWQuCisKKworICAgL21ib3gKKyAgICAgICBUaGUgZmlyc3QgU1BVIHRvIENQVSBjb21tdW5pY2F0aW9uIG1haWxib3guIFRoaXMgZmlsZSBpcyByZWFkLW9ubHkgIGFuZAorICAgICAgIGNhbiAgYmUgIHJlYWQgIGluICB1bml0cyBvZiAzMiBiaXRzLiAgVGhlIGZpbGUgY2FuIG9ubHkgYmUgdXNlZCBpbiBub24tCisgICAgICAgYmxvY2tpbmcgbW9kZSBhbmQgaXQgZXZlbiBwb2xsKCkgd2lsbCBub3QgYmxvY2sgb24gIGl0LiAgIFRoZSAgcG9zc2libGUKKyAgICAgICBvcGVyYXRpb25zIG9uIGFuIG9wZW4gbWJveCBmaWxlIGFyZToKKworICAgICAgIHJlYWQoMikKKyAgICAgICAgICAgICAgSWYgIGEgIGNvdW50IHNtYWxsZXIgdGhhbiBmb3VyIGlzIHJlcXVlc3RlZCwgcmVhZCByZXR1cm5zIC0xIGFuZAorICAgICAgICAgICAgICBzZXRzIGVycm5vIHRvIEVJTlZBTC4gIElmIHRoZXJlIGlzIG5vIGRhdGEgYXZhaWxhYmxlIGluIHRoZSBtYWlsCisgICAgICAgICAgICAgIGJveCwgIHRoZSAgcmV0dXJuICB2YWx1ZSAgaXMgc2V0IHRvIC0xIGFuZCBlcnJubyBiZWNvbWVzIEVBR0FJTi4KKyAgICAgICAgICAgICAgV2hlbiBkYXRhIGhhcyBiZWVuIHJlYWQgc3VjY2Vzc2Z1bGx5LCBmb3VyIGJ5dGVzIGFyZSAgcGxhY2VkICBpbgorICAgICAgICAgICAgICB0aGUgZGF0YSBidWZmZXIgYW5kIHRoZSB2YWx1ZSBmb3VyIGlzIHJldHVybmVkLgorCisKKyAgIC9pYm94CisgICAgICAgVGhlICBzZWNvbmQgIFNQVSAgdG8gQ1BVIGNvbW11bmljYXRpb24gbWFpbGJveC4gVGhpcyBmaWxlIGlzIHNpbWlsYXIgdG8KKyAgICAgICB0aGUgZmlyc3QgbWFpbGJveCBmaWxlLCBidXQgY2FuIGJlIHJlYWQgaW4gYmxvY2tpbmcgSS9PIG1vZGUsICBhbmQgIHRoZQorICAgICAgIHBvbGwgIGZhbWlsaXkgb2Ygc3lzdGVtIGNhbGxzIGNhbiBiZSB1c2VkIHRvIHdhaXQgZm9yIGl0LiAgVGhlIHBvc3NpYmxlCisgICAgICAgb3BlcmF0aW9ucyBvbiBhbiBvcGVuIGlib3ggZmlsZSBhcmU6CisKKyAgICAgICByZWFkKDIpCisgICAgICAgICAgICAgIElmIGEgY291bnQgc21hbGxlciB0aGFuIGZvdXIgaXMgcmVxdWVzdGVkLCByZWFkIHJldHVybnMgIC0xICBhbmQKKyAgICAgICAgICAgICAgc2V0cyBlcnJubyB0byBFSU5WQUwuICBJZiB0aGVyZSBpcyBubyBkYXRhIGF2YWlsYWJsZSBpbiB0aGUgbWFpbAorICAgICAgICAgICAgICBib3ggYW5kIHRoZSBmaWxlIGRlc2NyaXB0b3IgaGFzIGJlZW4gb3BlbmVkIHdpdGggT19OT05CTE9DSywgdGhlCisgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSBpcyBzZXQgdG8gLTEgYW5kIGVycm5vIGJlY29tZXMgRUFHQUlOLgorCisgICAgICAgICAgICAgIElmICB0aGVyZSAgaXMgIG5vICBkYXRhICBhdmFpbGFibGUgIGluIHRoZSBtYWlsIGJveCBhbmQgdGhlIGZpbGUKKyAgICAgICAgICAgICAgZGVzY3JpcHRvciBoYXMgYmVlbiBvcGVuZWQgd2l0aG91dCAgT19OT05CTE9DSywgIHRoZSAgY2FsbCAgd2lsbAorICAgICAgICAgICAgICBibG9jayAgdW50aWwgIHRoZSAgU1BVICB3cml0ZXMgdG8gaXRzIGludGVycnVwdCBtYWlsYm94IGNoYW5uZWwuCisgICAgICAgICAgICAgIFdoZW4gZGF0YSBoYXMgYmVlbiByZWFkIHN1Y2Nlc3NmdWxseSwgZm91ciBieXRlcyBhcmUgIHBsYWNlZCAgaW4KKyAgICAgICAgICAgICAgdGhlIGRhdGEgYnVmZmVyIGFuZCB0aGUgdmFsdWUgZm91ciBpcyByZXR1cm5lZC4KKworICAgICAgIHBvbGwoMikKKyAgICAgICAgICAgICAgUG9sbCAgb24gIHRoZSAgaWJveCAgZmlsZSByZXR1cm5zIChQT0xMSU4gfCBQT0xMUkROT1JNKSB3aGVuZXZlcgorICAgICAgICAgICAgICBkYXRhIGlzIGF2YWlsYWJsZSBmb3IgcmVhZGluZy4KKworCisgICAvd2JveAorICAgICAgIFRoZSBDUFUgdG8gU1BVIGNvbW11bmF0aW9uIG1haWxib3guIEl0IGlzIHdyaXRlLW9ubHkgY2FuIGNhbiBiZSB3cml0dGVuCisgICAgICAgaW4gIHVuaXRzICBvZiAgMzIgIGJpdHMuIElmIHRoZSBtYWlsYm94IGlzIGZ1bGwsIHdyaXRlKCkgd2lsbCBibG9jayBhbmQKKyAgICAgICBwb2xsIGNhbiBiZSB1c2VkIHRvIHdhaXQgZm9yIGl0IGJlY29taW5nICBlbXB0eSAgYWdhaW4uICAgVGhlICBwb3NzaWJsZQorICAgICAgIG9wZXJhdGlvbnMgIG9uICBhbiBvcGVuIHdib3ggZmlsZSBhcmU6IHdyaXRlKDIpIElmIGEgY291bnQgc21hbGxlciB0aGFuCisgICAgICAgZm91ciBpcyByZXF1ZXN0ZWQsIHdyaXRlIHJldHVybnMgLTEgYW5kIHNldHMgZXJybm8gdG8gRUlOVkFMLiAgSWYgdGhlcmUKKyAgICAgICBpcyAgbm8gc3BhY2UgYXZhaWxhYmxlIGluIHRoZSBtYWlsIGJveCBhbmQgdGhlIGZpbGUgZGVzY3JpcHRvciBoYXMgYmVlbgorICAgICAgIG9wZW5lZCB3aXRoIE9fTk9OQkxPQ0ssIHRoZSByZXR1cm4gdmFsdWUgaXMgc2V0IHRvIC0xIGFuZCBlcnJubyBiZWNvbWVzCisgICAgICAgRUFHQUlOLgorCisgICAgICAgSWYgIHRoZXJlIGlzIG5vIHNwYWNlIGF2YWlsYWJsZSBpbiB0aGUgbWFpbCBib3ggYW5kIHRoZSBmaWxlIGRlc2NyaXB0b3IKKyAgICAgICBoYXMgYmVlbiBvcGVuZWQgd2l0aG91dCBPX05PTkJMT0NLLCB0aGUgY2FsbCB3aWxsIGJsb2NrIHVudGlsICB0aGUgIFNQVQorICAgICAgIHJlYWRzICBmcm9tICBpdHMgUFBFIG1haWxib3ggY2hhbm5lbC4gIFdoZW4gZGF0YSBoYXMgYmVlbiByZWFkIHN1Y2Nlc3MtCisgICAgICAgZnVsbHksIGZvdXIgYnl0ZXMgYXJlIHBsYWNlZCBpbiB0aGUgZGF0YSBidWZmZXIgYW5kIHRoZSB2YWx1ZSAgZm91ciAgaXMKKyAgICAgICByZXR1cm5lZC4KKworICAgICAgIHBvbGwoMikKKyAgICAgICAgICAgICAgUG9sbCAgb24gIHRoZSAgaWJveCBmaWxlIHJldHVybnMgKFBPTExPVVQgfCBQT0xMV1JOT1JNKSB3aGVuZXZlcgorICAgICAgICAgICAgICBzcGFjZSBpcyBhdmFpbGFibGUgZm9yIHdyaXRpbmcuCisKKworICAgL21ib3hfc3RhdAorICAgL2lib3hfc3RhdAorICAgL3dib3hfc3RhdAorICAgICAgIFJlYWQtb25seSBmaWxlcyB0aGF0IGNvbnRhaW4gdGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCBxdWV1ZSwgaS5lLiAgaG93CisgICAgICAgbWFueSAgd29yZHMgIGNhbiAgYmUgIHJlYWQgIGZyb20gIG1ib3ggb3IgaWJveCBvciBob3cgbWFueSB3b3JkcyBjYW4gYmUKKyAgICAgICB3cml0dGVuIHRvIHdib3ggd2l0aG91dCBibG9ja2luZy4gIFRoZSBmaWxlcyBjYW4gYmUgcmVhZCBvbmx5IGluIDQtYnl0ZQorICAgICAgIHVuaXRzICBhbmQgIHJldHVybiAgYSAgYmlnLWVuZGlhbiAgYmluYXJ5IGludGVnZXIgbnVtYmVyLiAgVGhlIHBvc3NpYmxlCisgICAgICAgb3BlcmF0aW9ucyBvbiBhbiBvcGVuICpib3hfc3RhdCBmaWxlIGFyZToKKworICAgICAgIHJlYWQoMikKKyAgICAgICAgICAgICAgSWYgYSBjb3VudCBzbWFsbGVyIHRoYW4gZm91ciBpcyByZXF1ZXN0ZWQsIHJlYWQgcmV0dXJucyAgLTEgIGFuZAorICAgICAgICAgICAgICBzZXRzIGVycm5vIHRvIEVJTlZBTC4gIE90aGVyd2lzZSwgYSBmb3VyIGJ5dGUgdmFsdWUgaXMgcGxhY2VkIGluCisgICAgICAgICAgICAgIHRoZSBkYXRhIGJ1ZmZlciwgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgIGNhbiAgYmUKKyAgICAgICAgICAgICAgcmVhZCAgZnJvbSAgKGZvciAgbWJveF9zdGF0ICBhbmQgIGlib3hfc3RhdCkgIG9yIHdyaXR0ZW4gdG8gKGZvcgorICAgICAgICAgICAgICB3Ym94X3N0YXQpIHRoZSByZXNwZWN0aXZlIG1haWwgYm94IHdpdGhvdXQgYmxvY2tpbmcgb3IgcmVzdWx0aW5nCisgICAgICAgICAgICAgIGluIEVBR0FJTi4KKworCisgICAvbnBjCisgICAvZGVjcgorICAgL2RlY3Jfc3RhdHVzCisgICAvc3B1X3RhZ19tYXNrCisgICAvZXZlbnRfbWFzaworICAgL3NycjAKKyAgICAgICBJbnRlcm5hbCAgcmVnaXN0ZXJzICBvZiAgdGhlIFNQVS4gVGhlIHJlcHJlc2VudGF0aW9uIGlzIGFuIEFTQ0lJIHN0cmluZworICAgICAgIHdpdGggdGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gdG8gIGJlICBleGVjdXRlZC4gIFRoZXNlCisgICAgICAgY2FuICBiZSAgdXNlZCBpbiByZWFkL3dyaXRlIG1vZGUgZm9yIGRlYnVnZ2luZywgYnV0IG5vcm1hbCBvcGVyYXRpb24gb2YKKyAgICAgICBwcm9ncmFtcyBzaG91bGQgbm90IHJlbHkgb24gdGhlbSBiZWNhdXNlIGFjY2VzcyB0byBhbnkgb2YgIHRoZW0gIGV4Y2VwdAorICAgICAgIG5wYyByZXF1aXJlcyBhbiBTUFUgY29udGV4dCBzYXZlIGFuZCBpcyB0aGVyZWZvcmUgdmVyeSBpbmVmZmljaWVudC4KKworICAgICAgIFRoZSBjb250ZW50cyBvZiB0aGVzZSBmaWxlcyBhcmU6CisKKyAgICAgICBucGMgICAgICAgICAgICAgICAgIE5leHQgUHJvZ3JhbSBDb3VudGVyCisKKyAgICAgICBkZWNyICAgICAgICAgICAgICAgIFNQVSBEZWNyZW1lbnRlcgorCisgICAgICAgZGVjcl9zdGF0dXMgICAgICAgICBEZWNyZW1lbnRlciBTdGF0dXMKKworICAgICAgIHNwdV90YWdfbWFzayAgICAgICAgTUZDIHRhZyBtYXNrIGZvciBTUFUgRE1BCisKKyAgICAgICBldmVudF9tYXNrICAgICAgICAgIEV2ZW50IG1hc2sgZm9yIFNQVSBpbnRlcnJ1cHRzCisKKyAgICAgICBzcnIwICAgICAgICAgICAgICAgIEludGVycnVwdCBSZXR1cm4gYWRkcmVzcyByZWdpc3RlcgorCisKKyAgICAgICBUaGUgICBwb3NzaWJsZSAgIG9wZXJhdGlvbnMgICBvbiAgIGFuICAgb3BlbiAgbnBjLCAgZGVjciwgIGRlY3Jfc3RhdHVzLAorICAgICAgIHNwdV90YWdfbWFzaywgZXZlbnRfbWFzayBvciBzcnIwIGZpbGUgYXJlOgorCisgICAgICAgcmVhZCgyKQorICAgICAgICAgICAgICBXaGVuIHRoZSBjb3VudCBzdXBwbGllZCB0byB0aGUgcmVhZCBjYWxsICBpcyAgc2hvcnRlciAgdGhhbiAgdGhlCisgICAgICAgICAgICAgIHJlcXVpcmVkICBsZW5ndGggZm9yIHRoZSBwb2ludGVyIHZhbHVlIHBsdXMgYSBuZXdsaW5lIGNoYXJhY3RlciwKKyAgICAgICAgICAgICAgc3Vic2VxdWVudCByZWFkcyBmcm9tIHRoZSBzYW1lIGZpbGUgZGVzY3JpcHRvciAgd2lsbCAgcmVzdWx0ICBpbgorICAgICAgICAgICAgICBjb21wbGV0aW5nICB0aGUgc3RyaW5nLCByZWdhcmRsZXNzIG9mIGNoYW5nZXMgdG8gdGhlIHJlZ2lzdGVyIGJ5CisgICAgICAgICAgICAgIGEgcnVubmluZyBTUFUgdGFzay4gIFdoZW4gYSBjb21wbGV0ZSBzdHJpbmcgaGFzIGJlZW4gIHJlYWQsICBhbGwKKyAgICAgICAgICAgICAgc3Vic2VxdWVudCByZWFkIG9wZXJhdGlvbnMgd2lsbCByZXR1cm4gemVybyBieXRlcyBhbmQgYSBuZXcgZmlsZQorICAgICAgICAgICAgICBkZXNjcmlwdG9yIG5lZWRzIHRvIGJlIG9wZW5lZCB0byByZWFkIHRoZSB2YWx1ZSBhZ2Fpbi4KKworICAgICAgIHdyaXRlKDIpCisgICAgICAgICAgICAgIEEgd3JpdGUgb3BlcmF0aW9uIG9uIHRoZSBmaWxlIHJlc3VsdHMgaW4gc2V0dGluZyB0aGUgcmVnaXN0ZXIgdG8KKyAgICAgICAgICAgICAgdGhlICB2YWx1ZSAgZ2l2ZW4gIGluICB0aGUgc3RyaW5nLiBUaGUgc3RyaW5nIGlzIHBhcnNlZCBmcm9tIHRoZQorICAgICAgICAgICAgICBiZWdpbm5pbmcgdG8gdGhlIGZpcnN0IG5vbi1udW1lcmljIGNoYXJhY3RlciBvciB0aGUgZW5kICBvZiAgdGhlCisgICAgICAgICAgICAgIGJ1ZmZlci4gIFN1YnNlcXVlbnQgd3JpdGVzIHRvIHRoZSBzYW1lIGZpbGUgZGVzY3JpcHRvciBvdmVyd3JpdGUKKyAgICAgICAgICAgICAgdGhlIHByZXZpb3VzIHNldHRpbmcuCisKKworICAgL2ZwY3IKKyAgICAgICBUaGlzIGZpbGUgZ2l2ZXMgYWNjZXNzIHRvIHRoZSBGbG9hdGluZyBQb2ludCBTdGF0dXMgYW5kIENvbnRyb2wgIFJlZ2lzLQorICAgICAgIHRlciBhcyBhIGZvdXIgYnl0ZSBsb25nIGZpbGUuIFRoZSBvcGVyYXRpb25zIG9uIHRoZSBmcGNyIGZpbGUgYXJlOgorCisgICAgICAgcmVhZCgyKQorICAgICAgICAgICAgICBJZiAgYSAgY291bnQgc21hbGxlciB0aGFuIGZvdXIgaXMgcmVxdWVzdGVkLCByZWFkIHJldHVybnMgLTEgYW5kCisgICAgICAgICAgICAgIHNldHMgZXJybm8gdG8gRUlOVkFMLiAgT3RoZXJ3aXNlLCBhIGZvdXIgYnl0ZSB2YWx1ZSBpcyBwbGFjZWQgaW4KKyAgICAgICAgICAgICAgdGhlIGRhdGEgYnVmZmVyLCBjb250YWluaW5nIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmcGNyIHJlZ2lzLQorICAgICAgICAgICAgICB0ZXIuCisKKyAgICAgICB3cml0ZSgyKQorICAgICAgICAgICAgICBJZiBhIGNvdW50IHNtYWxsZXIgdGhhbiBmb3VyIGlzIHJlcXVlc3RlZCwgd3JpdGUgcmV0dXJucyAtMSAgYW5kCisgICAgICAgICAgICAgIHNldHMgIGVycm5vICB0byAgRUlOVkFMLiAgT3RoZXJ3aXNlLCBhIGZvdXIgYnl0ZSB2YWx1ZSBpcyBjb3BpZWQKKyAgICAgICAgICAgICAgZnJvbSB0aGUgZGF0YSBidWZmZXIsIHVwZGF0aW5nIHRoZSB2YWx1ZSBvZiB0aGUgZnBjciByZWdpc3Rlci4KKworCisgICAvc2lnbmFsMQorICAgL3NpZ25hbDIKKyAgICAgICBUaGUgdHdvIHNpZ25hbCBub3RpZmljYXRpb24gY2hhbm5lbHMgb2YgYW4gU1BVLiAgVGhlc2UgIGFyZSAgcmVhZC13cml0ZQorICAgICAgIGZpbGVzICB0aGF0ICBvcGVyYXRlICBvbiAgYSAzMiBiaXQgd29yZC4gIFdyaXRpbmcgdG8gb25lIG9mIHRoZXNlIGZpbGVzCisgICAgICAgdHJpZ2dlcnMgYW4gaW50ZXJydXB0IG9uIHRoZSBTUFUuIFRoZSAgdmFsdWUgIHdyaXR0aW5nICB0byAgdGhlICBzaWduYWwKKyAgICAgICBmaWxlcyBjYW4gYmUgcmVhZCBmcm9tIHRoZSBTUFUgdGhyb3VnaCBhIGNoYW5uZWwgcmVhZCBvciBmcm9tIGhvc3QgdXNlcgorICAgICAgIHNwYWNlIHRocm91Z2ggdGhlIGZpbGUuICBBZnRlciB0aGUgdmFsdWUgaGFzIGJlZW4gcmVhZCBieSB0aGUgIFNQVSwgIGl0CisgICAgICAgaXMgIHJlc2V0ICB0byB6ZXJvLiAgVGhlIHBvc3NpYmxlIG9wZXJhdGlvbnMgb24gYW4gb3BlbiBzaWduYWwxIG9yIHNpZy0KKyAgICAgICBuYWwyIGZpbGUgYXJlOgorCisgICAgICAgcmVhZCgyKQorICAgICAgICAgICAgICBJZiBhIGNvdW50IHNtYWxsZXIgdGhhbiBmb3VyIGlzIHJlcXVlc3RlZCwgcmVhZCByZXR1cm5zICAtMSAgYW5kCisgICAgICAgICAgICAgIHNldHMgZXJybm8gdG8gRUlOVkFMLiAgT3RoZXJ3aXNlLCBhIGZvdXIgYnl0ZSB2YWx1ZSBpcyBwbGFjZWQgaW4KKyAgICAgICAgICAgICAgdGhlIGRhdGEgYnVmZmVyLCBjb250YWluaW5nIHRoZSBjdXJyZW50IHZhbHVlIG9mICB0aGUgIHNwZWNpZmllZAorICAgICAgICAgICAgICBzaWduYWwgbm90aWZpY2F0aW9uIHJlZ2lzdGVyLgorCisgICAgICAgd3JpdGUoMikKKyAgICAgICAgICAgICAgSWYgIGEgY291bnQgc21hbGxlciB0aGFuIGZvdXIgaXMgcmVxdWVzdGVkLCB3cml0ZSByZXR1cm5zIC0xIGFuZAorICAgICAgICAgICAgICBzZXRzIGVycm5vIHRvIEVJTlZBTC4gIE90aGVyd2lzZSwgYSBmb3VyIGJ5dGUgIHZhbHVlICBpcyAgY29waWVkCisgICAgICAgICAgICAgIGZyb20gdGhlIGRhdGEgYnVmZmVyLCB1cGRhdGluZyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBzaWduYWwKKyAgICAgICAgICAgICAgbm90aWZpY2F0aW9uIHJlZ2lzdGVyLiAgVGhlIHNpZ25hbCAgbm90aWZpY2F0aW9uICByZWdpc3RlciAgd2lsbAorICAgICAgICAgICAgICBlaXRoZXIgYmUgcmVwbGFjZWQgd2l0aCB0aGUgaW5wdXQgZGF0YSBvciB3aWxsIGJlIHVwZGF0ZWQgdG8gdGhlCisgICAgICAgICAgICAgIGJpdHdpc2UgT1Igb3IgdGhlIG9sZCB2YWx1ZSBhbmQgdGhlIGlucHV0IGRhdGEsIGRlcGVuZGluZyBvbiB0aGUKKyAgICAgICAgICAgICAgY29udGVudHMgIG9mICB0aGUgIHNpZ25hbDFfdHlwZSwgIG9yICBzaWduYWwyX3R5cGUgcmVzcGVjdGl2ZWx5LAorICAgICAgICAgICAgICBmaWxlLgorCisKKyAgIC9zaWduYWwxX3R5cGUKKyAgIC9zaWduYWwyX3R5cGUKKyAgICAgICBUaGVzZSB0d28gZmlsZXMgY2hhbmdlIHRoZSBiZWhhdmlvciBvZiB0aGUgc2lnbmFsMSBhbmQgc2lnbmFsMiAgbm90aWZpLQorICAgICAgIGNhdGlvbiAgZmlsZXMuICBUaGUgIGNvbnRhaW4gIGEgbnVtZXJpY2FsIEFTQ0lJIHN0cmluZyB3aGljaCBpcyByZWFkIGFzCisgICAgICAgZWl0aGVyICIxIiBvciAiMCIuICBJbiBtb2RlIDAgKG92ZXJ3cml0ZSksIHRoZSAgaGFyZHdhcmUgIHJlcGxhY2VzICB0aGUKKyAgICAgICBjb250ZW50cyBvZiB0aGUgc2lnbmFsIGNoYW5uZWwgd2l0aCB0aGUgZGF0YSB0aGF0IGlzIHdyaXR0ZW4gdG8gaXQuICBpbgorICAgICAgIG1vZGUgMSAobG9naWNhbCBPUiksIHRoZSBoYXJkd2FyZSBhY2N1bXVsYXRlcyB0aGUgYml0cyB0aGF0IGFyZSAgc3Vic2UtCisgICAgICAgcXVlbnRseSB3cml0dGVuIHRvIGl0LiAgVGhlIHBvc3NpYmxlIG9wZXJhdGlvbnMgb24gYW4gb3BlbiBzaWduYWwxX3R5cGUKKyAgICAgICBvciBzaWduYWwyX3R5cGUgZmlsZSBhcmU6CisKKyAgICAgICByZWFkKDIpCisgICAgICAgICAgICAgIFdoZW4gdGhlIGNvdW50IHN1cHBsaWVkIHRvIHRoZSByZWFkIGNhbGwgIGlzICBzaG9ydGVyICB0aGFuICB0aGUKKyAgICAgICAgICAgICAgcmVxdWlyZWQgIGxlbmd0aCAgZm9yIHRoZSBkaWdpdCBwbHVzIGEgbmV3bGluZSBjaGFyYWN0ZXIsIHN1YnNlLQorICAgICAgICAgICAgICBxdWVudCByZWFkcyBmcm9tIHRoZSBzYW1lIGZpbGUgZGVzY3JpcHRvciB3aWxsICByZXN1bHQgIGluICBjb20tCisgICAgICAgICAgICAgIHBsZXRpbmcgIHRoZSAgc3RyaW5nLiAgV2hlbiBhIGNvbXBsZXRlIHN0cmluZyBoYXMgYmVlbiByZWFkLCBhbGwKKyAgICAgICAgICAgICAgc3Vic2VxdWVudCByZWFkIG9wZXJhdGlvbnMgd2lsbCByZXR1cm4gemVybyBieXRlcyBhbmQgYSBuZXcgZmlsZQorICAgICAgICAgICAgICBkZXNjcmlwdG9yIG5lZWRzIHRvIGJlIG9wZW5lZCB0byByZWFkIHRoZSB2YWx1ZSBhZ2Fpbi4KKworICAgICAgIHdyaXRlKDIpCisgICAgICAgICAgICAgIEEgd3JpdGUgb3BlcmF0aW9uIG9uIHRoZSBmaWxlIHJlc3VsdHMgaW4gc2V0dGluZyB0aGUgcmVnaXN0ZXIgdG8KKyAgICAgICAgICAgICAgdGhlIHZhbHVlIGdpdmVuIGluIHRoZSBzdHJpbmcuIFRoZSBzdHJpbmcgIGlzICBwYXJzZWQgIGZyb20gIHRoZQorICAgICAgICAgICAgICBiZWdpbm5pbmcgIHRvICB0aGUgZmlyc3Qgbm9uLW51bWVyaWMgY2hhcmFjdGVyIG9yIHRoZSBlbmQgb2YgdGhlCisgICAgICAgICAgICAgIGJ1ZmZlci4gIFN1YnNlcXVlbnQgd3JpdGVzIHRvIHRoZSBzYW1lIGZpbGUgZGVzY3JpcHRvciBvdmVyd3JpdGUKKyAgICAgICAgICAgICAgdGhlIHByZXZpb3VzIHNldHRpbmcuCisKKworRVhBTVBMRVMKKyAgICAgICAvZXRjL2ZzdGFiIGVudHJ5CisgICAgICAgICAgICAgIG5vbmUgICAgICAvc3B1ICAgICAgc3B1ZnMgICAgIGdpZD1zcHUgICAwICAgIDAKKworCitBVVRIT1JTCisgICAgICAgQXJuZCAgQmVyZ21hbm4gIDxhcm5kYkBkZS5pYm0uY29tPiwgIE1hcmsgIE51dHRlciA8bW51dHRlckB1cy5pYm0uY29tPiwKKyAgICAgICBVbHJpY2ggV2VpZ2FuZCA8VWxyaWNoLldlaWdhbmRAZGUuaWJtLmNvbT4KKworU0VFIEFMU08KKyAgICAgICBjYXBhYmlsaXRpZXMoNyksIGNsb3NlKDIpLCBzcHVfY3JlYXRlKDIpLCBzcHVfcnVuKDIpLCBzcHVmcyg3KQorCisKKworTGludXggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDUtMDktMjggICAgICAgICAgICAgICAgICAgICAgICAgIFNQVUZTKDIpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTUFVfUlVOKDIpICAgICAgICAgICAgICAgICBMaW51eCBQcm9ncmFtbWVyJ3MgTWFudWFsICAgICAgICAgICAgICAgIFNQVV9SVU4oMikKKworCisKK05BTUUKKyAgICAgICBzcHVfcnVuIC0gZXhlY3V0ZSBhbiBzcHUgY29udGV4dAorCisKK1NZTk9QU0lTCisgICAgICAgI2luY2x1ZGUgPHN5cy9zcHUuaD4KKworICAgICAgIGludCBzcHVfcnVuKGludCBmZCwgdW5zaWduZWQgaW50ICpucGMsIHVuc2lnbmVkIGludCAqZXZlbnQpOworCitERVNDUklQVElPTgorICAgICAgIFRoZSAgc3B1X3J1biBzeXN0ZW0gY2FsbCBpcyB1c2VkIG9uIFBvd2VyUEMgbWFjaGluZXMgdGhhdCBpbXBsZW1lbnQgdGhlCisgICAgICAgQ2VsbCBCcm9hZGJhbmQgRW5naW5lIEFyY2hpdGVjdHVyZSBpbiBvcmRlciB0byBhY2Nlc3MgU3luZXJnaXN0aWMgIFByby0KKyAgICAgICBjZXNzb3IgIFVuaXRzICAoU1BVcykuICBJdCAgdXNlcyB0aGUgZmQgdGhhdCB3YXMgcmV0dXJuZWQgZnJvbSBzcHVfY3JlLQorICAgICAgIGF0ZSgyKSB0byBhZGRyZXNzIGEgc3BlY2lmaWMgU1BVIGNvbnRleHQuIFdoZW4gdGhlIGNvbnRleHQgZ2V0cyAgc2NoZWQtCisgICAgICAgdWxlZCAgdG8gYSBwaHlzaWNhbCBTUFUsIGl0IHN0YXJ0cyBleGVjdXRpb24gYXQgdGhlIGluc3RydWN0aW9uIHBvaW50ZXIKKyAgICAgICBwYXNzZWQgaW4gbnBjLgorCisgICAgICAgRXhlY3V0aW9uIG9mIFNQVSBjb2RlIGhhcHBlbnMgc3luY2hyb25vdXNseSwgbWVhbmluZyB0aGF0IHNwdV9ydW4gIGRvZXMKKyAgICAgICBub3QgIHJldHVybiAgd2hpbGUgdGhlIFNQVSBpcyBzdGlsbCBydW5uaW5nLiBJZiB0aGVyZSBpcyBhIG5lZWQgdG8gZXhlLQorICAgICAgIGN1dGUgU1BVIGNvZGUgaW4gcGFyYWxsZWwgd2l0aCBvdGhlciBjb2RlIG9uIGVpdGhlciAgdGhlICBtYWluICBDUFUgIG9yCisgICAgICAgb3RoZXIgIFNQVXMsICB5b3UgIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHRocmVhZCBvZiBleGVjdXRpb24gZmlyc3QsIGUuZy4KKyAgICAgICB1c2luZyB0aGUgcHRocmVhZF9jcmVhdGUoMykgY2FsbC4KKworICAgICAgIFdoZW4gc3B1X3J1biByZXR1cm5zLCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgU1BVIGluc3RydWN0aW9uICBwb2ludGVyCisgICAgICAgaXMgIHdyaXR0ZW4gYmFjayB0byBucGMsIHNvIHlvdSBjYW4gY2FsbCBzcHVfcnVuIGFnYWluIHdpdGhvdXQgdXBkYXRpbmcKKyAgICAgICB0aGUgcG9pbnRlcnMuCisKKyAgICAgICBldmVudCBjYW4gYmUgYSBOVUxMIHBvaW50ZXIgb3IgcG9pbnQgdG8gYW4gZXh0ZW5kZWQgIHN0YXR1cyAgY29kZSAgdGhhdAorICAgICAgIGdldHMgIGZpbGxlZCAgd2hlbiBzcHVfcnVuIHJldHVybnMuIEl0IGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb24tCisgICAgICAgc3RhbnRzOgorCisgICAgICAgU1BFX0VWRU5UX0RNQV9BTElHTk1FTlQKKyAgICAgICAgICAgICAgQSBETUEgYWxpZ25tZW50IGVycm9yCisKKyAgICAgICBTUEVfRVZFTlRfU1BFX0RBVEFfU0VHTUVOVAorICAgICAgICAgICAgICBBIERNQSBzZWdtZW50YXRpb24gZXJyb3IKKworICAgICAgIFNQRV9FVkVOVF9TUEVfREFUQV9TVE9SQUdFCisgICAgICAgICAgICAgIEEgRE1BIHN0b3JhZ2UgZXJyb3IKKworICAgICAgIElmIE5VTEwgaXMgcGFzc2VkIGFzIHRoZSBldmVudCBhcmd1bWVudCwgdGhlc2UgZXJyb3JzIHdpbGwgcmVzdWx0IGluICBhCisgICAgICAgc2lnbmFsIGRlbGl2ZXJlZCB0byB0aGUgY2FsbGluZyBwcm9jZXNzLgorCitSRVRVUk4gVkFMVUUKKyAgICAgICBzcHVfcnVuICByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3B1X3N0YXR1cyByZWdpc3RlciBvciAtMSB0byBpbmRpY2F0ZQorICAgICAgIGFuIGVycm9yIGFuZCBzZXQgZXJybm8gdG8gb25lIG9mIHRoZSBlcnJvciAgY29kZXMgIGxpc3RlZCAgYmVsb3cuICAgVGhlCisgICAgICAgc3B1X3N0YXR1cyAgcmVnaXN0ZXIgIHZhbHVlICBjb250YWlucyAgYSAgYml0ICBtYXNrIG9mIHN0YXR1cyBjb2RlcyBhbmQKKyAgICAgICBvcHRpb25hbGx5IGEgMTQgYml0IGNvZGUgcmV0dXJuZWQgZnJvbSB0aGUgc3RvcC1hbmQtc2lnbmFsICBpbnN0cnVjdGlvbgorICAgICAgIG9uIHRoZSBTUFUuIFRoZSBiaXQgbWFza3MgZm9yIHRoZSBzdGF0dXMgY29kZXMgYXJlOgorCisgICAgICAgMHgwMiAgIFNQVSB3YXMgc3RvcHBlZCBieSBzdG9wLWFuZC1zaWduYWwuCisKKyAgICAgICAweDA0ICAgU1BVIHdhcyBzdG9wcGVkIGJ5IGhhbHQuCisKKyAgICAgICAweDA4ICAgU1BVIGlzIHdhaXRpbmcgZm9yIGEgY2hhbm5lbC4KKworICAgICAgIDB4MTAgICBTUFUgaXMgaW4gc2luZ2xlLXN0ZXAgbW9kZS4KKworICAgICAgIDB4MjAgICBTUFUgaGFzIHRyaWVkIHRvIGV4ZWN1dGUgYW4gaW52YWxpZCBpbnN0cnVjdGlvbi4KKworICAgICAgIDB4NDAgICBTUFUgaGFzIHRyaWVkIHRvIGFjY2VzcyBhbiBpbnZhbGlkIGNoYW5uZWwuCisKKyAgICAgICAweDNmZmYwMDAwCisgICAgICAgICAgICAgIFRoZSAgYml0cyAgbWFza2VkIHdpdGggdGhpcyB2YWx1ZSBjb250YWluIHRoZSBjb2RlIHJldHVybmVkIGZyb20KKyAgICAgICAgICAgICAgc3RvcC1hbmQtc2lnbmFsLgorCisgICAgICAgVGhlcmUgYXJlIGFsd2F5cyBvbmUgb3IgbW9yZSBvZiB0aGUgbG93ZXIgZWlnaHQgYml0cyBzZXQgIG9yICBhbiAgZXJyb3IKKyAgICAgICBjb2RlIGlzIHJldHVybmVkIGZyb20gc3B1X3J1bi4KKworRVJST1JTCisgICAgICAgRUFHQUlOIG9yIEVXT1VMREJMT0NLCisgICAgICAgICAgICAgIGZkIGlzIGluIG5vbi1ibG9ja2luZyBtb2RlIGFuZCBzcHVfcnVuIHdvdWxkIGJsb2NrLgorCisgICAgICAgRUJBREYgIGZkIGlzIG5vdCBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvci4KKworICAgICAgIEVGQVVMVCBucGMgaXMgbm90IGEgdmFsaWQgcG9pbnRlciBvciBzdGF0dXMgaXMgbmVpdGhlciBOVUxMIG5vciBhIHZhbGlkCisgICAgICAgICAgICAgIHBvaW50ZXIuCisKKyAgICAgICBFSU5UUiAgQSBzaWduYWwgb2NjdXJlZCB3aGlsZSBzcHVfcnVuIHdhcyBpbiBwcm9ncmVzcy4gIFRoZSAgbnBjICB2YWx1ZQorICAgICAgICAgICAgICBoYXMgIGJlZW4gdXBkYXRlZCB0byB0aGUgbmV3IHByb2dyYW0gY291bnRlciB2YWx1ZSBpZiBuZWNlc3NhcnkuCisKKyAgICAgICBFSU5WQUwgZmQgaXMgbm90IGEgZmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGZyb20gc3B1X2NyZWF0ZSgyKS4KKworICAgICAgIEVOT01FTSBJbnN1ZmZpY2llbnQgbWVtb3J5IHdhcyBhdmFpbGFibGUgdG8gaGFuZGxlIGEgcGFnZSBmYXVsdCByZXN1bHQtCisgICAgICAgICAgICAgIGluZyBmcm9tIGFuIE1GQyBkaXJlY3QgbWVtb3J5IGFjY2Vzcy4KKworICAgICAgIEVOT1NZUyB0aGUgZnVuY3Rpb25hbGl0eSBpcyBub3QgcHJvdmlkZWQgYnkgdGhlIGN1cnJlbnQgc3lzdGVtLCBiZWNhdXNlCisgICAgICAgICAgICAgIGVpdGhlciB0aGUgaGFyZHdhcmUgZG9lcyBub3QgcHJvdmlkZSBTUFVzIG9yIHRoZSBzcHVmcyBtb2R1bGUgaXMKKyAgICAgICAgICAgICAgbm90IGxvYWRlZC4KKworCitOT1RFUworICAgICAgIHNwdV9ydW4gIGlzICBtZWFudCAgdG8gIGJlICB1c2VkICBmcm9tICBsaWJyYXJpZXMgdGhhdCBpbXBsZW1lbnQgYSBtb3JlCisgICAgICAgYWJzdHJhY3QgaW50ZXJmYWNlIHRvIFNQVXMsIG5vdCB0byBiZSB1c2VkIGZyb20gIHJlZ3VsYXIgIGFwcGxpY2F0aW9ucy4KKyAgICAgICBTZWUgIGh0dHA6Ly93d3cuYnNjLmVzL3Byb2plY3RzL2RlZXBjb21wdXRpbmcvbGludXhvbmNlbGwvIGZvciB0aGUgcmVjLQorICAgICAgIG9tbWVuZGVkIGxpYnJhcmllcy4KKworCitDT05GT1JNSU5HIFRPCisgICAgICAgVGhpcyBjYWxsIGlzIExpbnV4IHNwZWNpZmljIGFuZCBvbmx5IGltcGxlbWVudGVkIGJ5IHRoZSBwcGM2NCBhcmNoaXRlYy0KKyAgICAgICB0dXJlLiBQcm9ncmFtcyB1c2luZyB0aGlzIHN5c3RlbSBjYWxsIGFyZSBub3QgcG9ydGFibGUuCisKKworQlVHUworICAgICAgIFRoZSBjb2RlIGRvZXMgbm90IHlldCBmdWxseSBpbXBsZW1lbnQgYWxsIGZlYXR1cmVzIGxpbmVkIG91dCBoZXJlLgorCisKK0FVVEhPUgorICAgICAgIEFybmQgQmVyZ21hbm4gPGFybmRiQGRlLmlibS5jb20+CisKK1NFRSBBTFNPCisgICAgICAgY2FwYWJpbGl0aWVzKDcpLCBjbG9zZSgyKSwgc3B1X2NyZWF0ZSgyKSwgc3B1ZnMoNykKKworCisKK0xpbnV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDA1LTA5LTI4ICAgICAgICAgICAgICAgICAgICAgICAgU1BVX1JVTigyKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU1BVX0NSRUFURSgyKSAgICAgICAgICAgICAgTGludXggUHJvZ3JhbW1lcidzIE1hbnVhbCAgICAgICAgICAgICBTUFVfQ1JFQVRFKDIpCisKKworCitOQU1FCisgICAgICAgc3B1X2NyZWF0ZSAtIGNyZWF0ZSBhIG5ldyBzcHUgY29udGV4dAorCisKK1NZTk9QU0lTCisgICAgICAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorICAgICAgICNpbmNsdWRlIDxzeXMvc3B1Lmg+CisKKyAgICAgICBpbnQgc3B1X2NyZWF0ZShjb25zdCBjaGFyICpwYXRobmFtZSwgaW50IGZsYWdzLCBtb2RlX3QgbW9kZSk7CisKK0RFU0NSSVBUSU9OCisgICAgICAgVGhlICBzcHVfY3JlYXRlICBzeXN0ZW0gY2FsbCBpcyB1c2VkIG9uIFBvd2VyUEMgbWFjaGluZXMgdGhhdCBpbXBsZW1lbnQKKyAgICAgICB0aGUgQ2VsbCBCcm9hZGJhbmQgRW5naW5lIEFyY2hpdGVjdHVyZSBpbiBvcmRlciB0byAgYWNjZXNzICBTeW5lcmdpc3RpYworICAgICAgIFByb2Nlc3NvciAgVW5pdHMgKFNQVXMpLiBJdCBjcmVhdGVzIGEgbmV3IGxvZ2ljYWwgY29udGV4dCBmb3IgYW4gU1BVIGluCisgICAgICAgcGF0aG5hbWUgYW5kIHJldHVybnMgYSBoYW5kbGUgdG8gYXNzb2NpYXRlZCAgd2l0aCAgaXQuICAgcGF0aG5hbWUgIG11c3QKKyAgICAgICBwb2ludCAgdG8gIGEgIG5vbi1leGlzdGluZyBkaXJlY3RvcnkgaW4gdGhlIG1vdW50IHBvaW50IG9mIHRoZSBTUFUgZmlsZQorICAgICAgIHN5c3RlbSAoc3B1ZnMpLiAgV2hlbiBzcHVfY3JlYXRlIGlzIHN1Y2Nlc3NmdWwsIGEgZGlyZWN0b3J5ICBnZXRzICBjcmUtCisgICAgICAgYXRlZCBvbiBwYXRobmFtZSBhbmQgaXQgaXMgcG9wdWxhdGVkIHdpdGggZmlsZXMuCisKKyAgICAgICBUaGUgIHJldHVybmVkICBmaWxlICBoYW5kbGUgY2FuIG9ubHkgYmUgcGFzc2VkIHRvIHNwdV9ydW4oMikgb3IgY2xvc2VkLAorICAgICAgIG90aGVyIG9wZXJhdGlvbnMgYXJlIG5vdCBkZWZpbmVkIG9uIGl0LiBXaGVuIGl0IGlzIGNsb3NlZCwgYWxsICBhc3NvY2ktCisgICAgICAgYXRlZCAgZGlyZWN0b3J5IGVudHJpZXMgaW4gc3B1ZnMgYXJlIHJlbW92ZWQuIFdoZW4gdGhlIGxhc3QgZmlsZSBoYW5kbGUKKyAgICAgICBwb2ludGluZyBlaXRoZXIgaW5zaWRlICBvZiAgdGhlICBjb250ZXh0ICBkaXJlY3RvcnkgIG9yICB0byAgdGhpcyAgZmlsZQorICAgICAgIGRlc2NyaXB0b3IgaXMgY2xvc2VkLCB0aGUgbG9naWNhbCBTUFUgY29udGV4dCBpcyBkZXN0cm95ZWQuCisKKyAgICAgICBUaGUgIHBhcmFtZXRlciBmbGFncyBjYW4gYmUgemVybyBvciBhbnkgYml0d2lzZSBvcidkIGNvbWJpbmF0aW9uIG9mIHRoZQorICAgICAgIGZvbGxvd2luZyBjb25zdGFudHM6CisKKyAgICAgICBTUFVfUkFXSU8KKyAgICAgICAgICAgICAgQWxsb3cgbWFwcGluZyBvZiBzb21lIG9mIHRoZSBoYXJkd2FyZSByZWdpc3RlcnMgb2YgdGhlIFNQVSAgaW50bworICAgICAgICAgICAgICB1c2VyIHNwYWNlLiBUaGlzIGZsYWcgcmVxdWlyZXMgdGhlIENBUF9TWVNfUkFXSU8gY2FwYWJpbGl0eSwgc2VlCisgICAgICAgICAgICAgIGNhcGFiaWxpdGllcyg3KS4KKworICAgICAgIFRoZSBtb2RlIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHBlcm1pc3Npb25zIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSAgbmV3CisgICAgICAgZGlyZWN0b3J5ICBpbiAgc3B1ZnMuICAgbW9kZSBpcyBtb2RpZmllZCB3aXRoIHRoZSB1c2VyJ3MgdW1hc2soMikgdmFsdWUKKyAgICAgICBhbmQgdGhlbiB1c2VkIGZvciBib3RoIHRoZSBkaXJlY3RvcnkgYW5kIHRoZSBmaWxlcyBjb250YWluZWQgaW4gaXQuIFRoZQorICAgICAgIGZpbGUgcGVybWlzc2lvbnMgbWFzayBvdXQgc29tZSBtb3JlIGJpdHMgb2YgbW9kZSBiZWNhdXNlIHRoZXkgdHlwaWNhbGx5CisgICAgICAgc3VwcG9ydCBvbmx5IHJlYWQgb3Igd3JpdGUgYWNjZXNzLiBTZWUgc3RhdCgyKSBmb3IgYSBmdWxsIGxpc3QgIG9mICB0aGUKKyAgICAgICBwb3NzaWJsZSBtb2RlIHZhbHVlcy4KKworCitSRVRVUk4gVkFMVUUKKyAgICAgICBzcHVfY3JlYXRlICByZXR1cm5zIGEgbmV3IGZpbGUgZGVzY3JpcHRvci4gSXQgbWF5IHJldHVybiAtMSB0byBpbmRpY2F0ZQorICAgICAgIGFuIGVycm9yIGNvbmRpdGlvbiBhbmQgc2V0IGVycm5vIHRvICBvbmUgIG9mICB0aGUgIGVycm9yICBjb2RlcyAgbGlzdGVkCisgICAgICAgYmVsb3cuCisKKworRVJST1JTCisgICAgICAgRUFDQ0VTUworICAgICAgICAgICAgICBUaGUgIGN1cnJlbnQgIHVzZXIgZG9lcyBub3QgaGF2ZSB3cml0ZSBhY2Nlc3Mgb24gdGhlIHNwdWZzIG1vdW50CisgICAgICAgICAgICAgIHBvaW50LgorCisgICAgICAgRUVYSVNUIEFuIFNQVSBjb250ZXh0IGFscmVhZHkgZXhpc3RzIGF0IHRoZSBnaXZlbiBwYXRoIG5hbWUuCisKKyAgICAgICBFRkFVTFQgcGF0aG5hbWUgaXMgbm90IGEgdmFsaWQgc3RyaW5nIHBvaW50ZXIgaW4gIHRoZSAgY3VycmVudCAgYWRkcmVzcworICAgICAgICAgICAgICBzcGFjZS4KKworICAgICAgIEVJTlZBTCBwYXRobmFtZSBpcyBub3QgYSBkaXJlY3RvcnkgaW4gdGhlIHNwdWZzIG1vdW50IHBvaW50LgorCisgICAgICAgRUxPT1AgIFRvbyBtYW55IHN5bWxpbmtzIHdlcmUgZm91bmQgd2hpbGUgcmVzb2x2aW5nIHBhdGhuYW1lLgorCisgICAgICAgRU1GSUxFIFRoZSBwcm9jZXNzIGhhcyByZWFjaGVkIGl0cyBtYXhpbXVtIG9wZW4gZmlsZSBsaW1pdC4KKworICAgICAgIEVOQU1FVE9PTE9ORworICAgICAgICAgICAgICBwYXRobmFtZSB3YXMgdG9vIGxvbmcuCisKKyAgICAgICBFTkZJTEUgVGhlIHN5c3RlbSBoYXMgcmVhY2hlZCB0aGUgZ2xvYmFsIG9wZW4gZmlsZSBsaW1pdC4KKworICAgICAgIEVOT0VOVCBQYXJ0IG9mIHBhdGhuYW1lIGNvdWxkIG5vdCBiZSByZXNvbHZlZC4KKworICAgICAgIEVOT01FTSBUaGUga2VybmVsIGNvdWxkIG5vdCBhbGxvY2F0ZSBhbGwgcmVzb3VyY2VzIHJlcXVpcmVkLgorCisgICAgICAgRU5PU1BDIFRoZXJlICBhcmUgIG5vdCAgZW5vdWdoICBTUFUgcmVzb3VyY2VzIGF2YWlsYWJsZSB0byBjcmVhdGUgYSBuZXcKKyAgICAgICAgICAgICAgY29udGV4dCBvciB0aGUgdXNlciBzcGVjaWZpYyBsaW1pdCBmb3IgdGhlIG51bWJlciAgb2YgIFNQVSAgY29uLQorICAgICAgICAgICAgICB0ZXh0cyBoYXMgYmVlbiByZWFjaGVkLgorCisgICAgICAgRU5PU1lTIHRoZSBmdW5jdGlvbmFsaXR5IGlzIG5vdCBwcm92aWRlZCBieSB0aGUgY3VycmVudCBzeXN0ZW0sIGJlY2F1c2UKKyAgICAgICAgICAgICAgZWl0aGVyIHRoZSBoYXJkd2FyZSBkb2VzIG5vdCBwcm92aWRlIFNQVXMgb3IgdGhlIHNwdWZzIG1vZHVsZSBpcworICAgICAgICAgICAgICBub3QgbG9hZGVkLgorCisgICAgICAgRU5PVERJUgorICAgICAgICAgICAgICBBIHBhcnQgb2YgcGF0aG5hbWUgaXMgbm90IGEgZGlyZWN0b3J5LgorCisKKworTk9URVMKKyAgICAgICBzcHVfY3JlYXRlICBpcyAgbWVhbnQgIHRvICBiZSB1c2VkIGZyb20gbGlicmFyaWVzIHRoYXQgaW1wbGVtZW50IGEgbW9yZQorICAgICAgIGFic3RyYWN0IGludGVyZmFjZSB0byBTUFVzLCBub3QgdG8gYmUgdXNlZCBmcm9tICByZWd1bGFyICBhcHBsaWNhdGlvbnMuCisgICAgICAgU2VlICBodHRwOi8vd3d3LmJzYy5lcy9wcm9qZWN0cy9kZWVwY29tcHV0aW5nL2xpbnV4b25jZWxsLyBmb3IgdGhlIHJlYy0KKyAgICAgICBvbW1lbmRlZCBsaWJyYXJpZXMuCisKKworRklMRVMKKyAgICAgICBwYXRobmFtZSBtdXN0IHBvaW50IHRvIGEgbG9jYXRpb24gYmVuZWF0aCB0aGUgbW91bnQgcG9pbnQgb2Ygc3B1ZnMuICBCeQorICAgICAgIGNvbnZlbnRpb24sIGl0IGdldHMgbW91bnRlZCBpbiAvc3B1LgorCisKK0NPTkZPUk1JTkcgVE8KKyAgICAgICBUaGlzIGNhbGwgaXMgTGludXggc3BlY2lmaWMgYW5kIG9ubHkgaW1wbGVtZW50ZWQgYnkgdGhlIHBwYzY0IGFyY2hpdGVjLQorICAgICAgIHR1cmUuIFByb2dyYW1zIHVzaW5nIHRoaXMgc3lzdGVtIGNhbGwgYXJlIG5vdCBwb3J0YWJsZS4KKworCitCVUdTCisgICAgICAgVGhlIGNvZGUgZG9lcyBub3QgeWV0IGZ1bGx5IGltcGxlbWVudCBhbGwgZmVhdHVyZXMgbGluZWQgb3V0IGhlcmUuCisKKworQVVUSE9SCisgICAgICAgQXJuZCBCZXJnbWFubiA8YXJuZGJAZGUuaWJtLmNvbT4KKworU0VFIEFMU08KKyAgICAgICBjYXBhYmlsaXRpZXMoNyksIGNsb3NlKDIpLCBzcHVfcnVuKDIpLCBzcHVmcyg3KQorCisKKworTGludXggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDUtMDktMjggICAgICAgICAgICAgICAgICAgICBTUFVfQ1JFQVRFKDIpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3N5c2ZzLXBjaS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3N5c2ZzLXBjaS50eHQKaW5kZXggOTg4YTYyZi4uN2JhMmJhYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zeXNmcy1wY2kudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc3lzZnMtcGNpLnR4dApAQCAtMSw0ICsxLDUgQEAKIEFjY2Vzc2luZyBQQ0kgZGV2aWNlIHJlc291cmNlcyB0aHJvdWdoIHN5c2ZzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzeXNmcywgdXN1YWxseSBtb3VudGVkIGF0IC9zeXMsIHByb3ZpZGVzIGFjY2VzcyB0byBQQ0kgcmVzb3VyY2VzIG9uIHBsYXRmb3JtcwogdGhhdCBzdXBwb3J0IGl0LiAgRm9yIGV4YW1wbGUsIGEgZ2l2ZW4gYnVzIG1pZ2h0IGxvb2sgbGlrZSB0aGlzOgpAQCAtNDcsMTQgKzQ4LDIxIEBACiAgIGJpbmFyeSAtIGZpbGUgY29udGFpbnMgYmluYXJ5IGRhdGEKICAgY3B1bWFzayAtIGZpbGUgY29udGFpbnMgYSBjcHVtYXNrIHR5cGUKIAotVGhlIHJlYWQgb25seSBmaWxlcyBhcmUgaW5mb3JtYXRpb25hbCwgd3JpdGVzIHRvIHRoZW0gd2lsbCBiZSBpZ25vcmVkLgotV3JpdGFibGUgZmlsZXMgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBhY3Rpb25zIG9uIHRoZSBkZXZpY2UgKGUuZy4gY2hhbmdpbmcKLWNvbmZpZyBzcGFjZSwgZGV0YWNoaW5nIGEgZGV2aWNlKS4gIG1tYXBhYmxlIGZpbGVzIGFyZSBhdmFpbGFibGUgdmlhIGFuCi1tbWFwIG9mIHRoZSBmaWxlIGF0IG9mZnNldCAwIGFuZCBjYW4gYmUgdXNlZCB0byBkbyBhY3R1YWwgZGV2aWNlIHByb2dyYW1taW5nCi1mcm9tIHVzZXJzcGFjZS4gIE5vdGUgdGhhdCBzb21lIHBsYXRmb3JtcyBkb24ndCBzdXBwb3J0IG1tYXBwaW5nIG9mIGNlcnRhaW4KLXJlc291cmNlcywgc28gYmUgc3VyZSB0byBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIGZyb20gYW55IGF0dGVtcHRlZCBtbWFwLgorVGhlIHJlYWQgb25seSBmaWxlcyBhcmUgaW5mb3JtYXRpb25hbCwgd3JpdGVzIHRvIHRoZW0gd2lsbCBiZSBpZ25vcmVkLCB3aXRoCit0aGUgZXhjZXB0aW9uIG9mIHRoZSAncm9tJyBmaWxlLiAgV3JpdGFibGUgZmlsZXMgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybQorYWN0aW9ucyBvbiB0aGUgZGV2aWNlIChlLmcuIGNoYW5naW5nIGNvbmZpZyBzcGFjZSwgZGV0YWNoaW5nIGEgZGV2aWNlKS4KK21tYXBhYmxlIGZpbGVzIGFyZSBhdmFpbGFibGUgdmlhIGFuIG1tYXAgb2YgdGhlIGZpbGUgYXQgb2Zmc2V0IDAgYW5kIGNhbiBiZQordXNlZCB0byBkbyBhY3R1YWwgZGV2aWNlIHByb2dyYW1taW5nIGZyb20gdXNlcnNwYWNlLiAgTm90ZSB0aGF0IHNvbWUgcGxhdGZvcm1zCitkb24ndCBzdXBwb3J0IG1tYXBwaW5nIG9mIGNlcnRhaW4gcmVzb3VyY2VzLCBzbyBiZSBzdXJlIHRvIGNoZWNrIHRoZSByZXR1cm4KK3ZhbHVlIGZyb20gYW55IGF0dGVtcHRlZCBtbWFwLgorCitUaGUgJ3JvbScgZmlsZSBpcyBzcGVjaWFsIGluIHRoYXQgaXQgcHJvdmlkZXMgcmVhZC1vbmx5IGFjY2VzcyB0byB0aGUgZGV2aWNlJ3MKK1JPTSBmaWxlLCBpZiBhdmFpbGFibGUuICBJdCdzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGhvd2V2ZXIsIHNvIGFwcGxpY2F0aW9ucworc2hvdWxkIHdyaXRlIHRoZSBzdHJpbmcgIjEiIHRvIHRoZSBmaWxlIHRvIGVuYWJsZSBpdCBiZWZvcmUgYXR0ZW1wdGluZyBhIHJlYWQKK2NhbGwsIGFuZCBkaXNhYmxlIGl0IGZvbGxvd2luZyB0aGUgYWNjZXNzIGJ5IHdyaXRpbmcgIjAiIHRvIHRoZSBmaWxlLgogCiBBY2Nlc3NpbmcgbGVnYWN5IHJlc291cmNlcyB0aHJvdWdoIHN5c2ZzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIExlZ2FjeSBJL08gcG9ydCBhbmQgSVNBIG1lbW9yeSByZXNvdXJjZXMgYXJlIGFsc28gcHJvdmlkZWQgaW4gc3lzZnMgaWYgdGhlCiB1bmRlcmx5aW5nIHBsYXRmb3JtIHN1cHBvcnRzIHRoZW0uICBUaGV5J3JlIGxvY2F0ZWQgaW4gdGhlIFBDSSBjbGFzcyBoZWlyYXJjaHksCkBAIC03NSw2ICs4Myw3IEBACiB0byBhY2Nlc3MgbGVnYWN5IG1lbW9yeSBzcGFjZS4KIAogU3VwcG9ydGluZyBQQ0kgYWNjZXNzIG9uIG5ldyBwbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEluIG9yZGVyIHRvIHN1cHBvcnQgUENJIHJlc291cmNlIG1hcHBpbmcgYXMgZGVzY3JpYmVkIGFib3ZlLCBMaW51eCBwbGF0Zm9ybQogY29kZSBtdXN0IGRlZmluZSBIQVZFX1BDSV9NTUFQIGFuZCBwcm92aWRlIGEgcGNpX21tYXBfcGFnZV9yYW5nZSBmdW5jdGlvbi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdG1wZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy90bXBmcy50eHQKaW5kZXggMGQ3ODNjNS4uZGJlNGQ4NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy90bXBmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy90bXBmcy50eHQKQEAgLTc4LDYgKzc4LDE4IEBACiB0aGF0IGluc3RhbmNlIGluIGEgc3lzdGVtIHdpdGggbWFueSBjcHVzIG1ha2luZyBpbnRlbnNpdmUgdXNlIG9mIGl0LgogCiAKK3RtcGZzIGhhcyBhIG1vdW50IG9wdGlvbiB0byBzZXQgdGhlIE5VTUEgbWVtb3J5IGFsbG9jYXRpb24gcG9saWN5IGZvcgorYWxsIGZpbGVzIGluIHRoYXQgaW5zdGFuY2U6CittcG9sPWludGVybGVhdmUJCXByZWZlcnMgdG8gYWxsb2NhdGUgbWVtb3J5IGZyb20gZWFjaCBub2RlIGluIHR1cm4KK21wb2w9ZGVmYXVsdAkJcHJlZmVycyB0byBhbGxvY2F0ZSBtZW1vcnkgZnJvbSB0aGUgbG9jYWwgbm9kZQorbXBvbD1iaW5kCQlwcmVmZXJzIHRvIGFsbG9jYXRlIGZyb20gbXBvbF9ub2RlbGlzdAorbXBvbD1wcmVmZXJyZWQJCXByZWZlcnMgdG8gYWxsb2NhdGUgZnJvbSBmaXJzdCBub2RlIGluIG1wb2xfbm9kZWxpc3QKKworVGhlIGZvbGxvd2luZyBtb3VudCBvcHRpb24gaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIG1wb2w9aW50ZXJsZWF2ZSwKK21wb2w9YmluZCBvciBtcG9sPXByZWZlcnJlZDoKK21wb2xfbm9kZWxpc3Q6CW5vZGVsaXN0IHN1aXRhYmxlIGZvciBwYXJzaW5nIHdpdGggbm9kZWxpc3RfcGFyc2UuCisKKwogVG8gc3BlY2lmeSB0aGUgaW5pdGlhbCByb290IGRpcmVjdG9yeSB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIG1vdW50CiBvcHRpb25zOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hwZXQudHh0IGIvRG9jdW1lbnRhdGlvbi9ocGV0LnR4dAppbmRleCBlNTI0NTc1Li5iN2EzZGMzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2hwZXQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaHBldC50eHQKQEAgLTIsNyArMiw3IEBACiAKIFRoZSBIaWdoIFByZWNpc2lvbiBFdmVudCBUaW1lciAoSFBFVCkgaGFyZHdhcmUgaXMgdGhlIGZ1dHVyZSByZXBsYWNlbWVudAogZm9yIHRoZSA4MjU0IGFuZCBSZWFsIFRpbWUgQ2xvY2sgKFJUQykgcGVyaW9kaWMgdGltZXIgZnVuY3Rpb25hbGl0eS4KLUVhY2ggSFBFVCBjYW4gaGF2ZSB1cCB0d28gMzIgdGltZXJzLiAgSXQgaXMgcG9zc2libGUgdG8gY29uZmlndXJlIHRoZQorRWFjaCBIUEVUIGNhbiBoYXZlIHVwIHRvIDMyIHRpbWVycy4gIEl0IGlzIHBvc3NpYmxlIHRvIGNvbmZpZ3VyZSB0aGUKIGZpcnN0IHR3byB0aW1lcnMgYXMgbGVnYWN5IHJlcGxhY2VtZW50cyBmb3IgODI1NCBhbmQgUlRDIHBlcmlvZGljIHRpbWVycy4KIEEgc3BlY2lmaWNhdGlvbiBkb25lIGJ5IEludGVsIGFuZCBNaWNyb3NvZnQgY2FuIGJlIGZvdW5kIGF0CiA8aHR0cDovL3d3dy5pbnRlbC5jb20vaGFyZHdhcmVkZXNpZ24vaHBldHNwZWMuaHRtPi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHJ0aW1lcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9ocnRpbWVycy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyMGZmNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaHJ0aW1lcnMudHh0CkBAIC0wLDAgKzEsMTc4IEBACisKK2hydGltZXJzIC0gc3Vic3lzdGVtIGZvciBoaWdoLXJlc29sdXRpb24ga2VybmVsIHRpbWVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgc3Vic3lzdGVtIGZvciBoaWdoLXJlc29sdXRpb24ga2VybmVsIHRpbWVycy4KKworT25lIG1pZ2h0IGFzayB0aGUgcXVlc3Rpb246IHdlIGFscmVhZHkgaGF2ZSBhIHRpbWVyIHN1YnN5c3RlbQorKGtlcm5lbC90aW1lcnMuYyksIHdoeSBkbyB3ZSBuZWVkIHR3byB0aW1lciBzdWJzeXN0ZW1zPyBBZnRlciBhIGxvdCBvZgorYmFjayBhbmQgZm9ydGggdHJ5aW5nIHRvIGludGVncmF0ZSBoaWdoLXJlc29sdXRpb24gYW5kIGhpZ2gtcHJlY2lzaW9uCitmZWF0dXJlcyBpbnRvIHRoZSBleGlzdGluZyB0aW1lciBmcmFtZXdvcmssIGFuZCBhZnRlciB0ZXN0aW5nIHZhcmlvdXMKK3N1Y2ggaGlnaC1yZXNvbHV0aW9uIHRpbWVyIGltcGxlbWVudGF0aW9ucyBpbiBwcmFjdGljZSwgd2UgY2FtZSB0byB0aGUKK2NvbmNsdXNpb24gdGhhdCB0aGUgdGltZXIgd2hlZWwgY29kZSBpcyBmdW5kYW1lbnRhbGx5IG5vdCBzdWl0YWJsZSBmb3IKK3N1Y2ggYW4gYXBwcm9hY2guIFdlIGluaXRpYWxseSBkaWRudCBiZWxpZXZlIHRoaXMgKCd0aGVyZSBtdXN0IGJlIGEgd2F5Cit0byBzb2x2ZSB0aGlzJyksIGFuZCBzcGVudCBhIGNvbnNpZGVyYWJsZSBlZmZvcnQgdHJ5aW5nIHRvIGludGVncmF0ZQordGhpbmdzIGludG8gdGhlIHRpbWVyIHdoZWVsLCBidXQgd2UgZmFpbGVkLiBJbiBoaW5kc2lnaHQsIHRoZXJlIGFyZQorc2V2ZXJhbCByZWFzb25zIHdoeSBzdWNoIGludGVncmF0aW9uIGlzIGhhcmQvaW1wb3NzaWJsZToKKworLSB0aGUgZm9yY2VkIGhhbmRsaW5nIG9mIGxvdy1yZXNvbHV0aW9uIGFuZCBoaWdoLXJlc29sdXRpb24gdGltZXJzIGluCisgIHRoZSBzYW1lIHdheSBsZWFkcyB0byBhIGxvdCBvZiBjb21wcm9taXNlcywgbWFjcm8gbWFnaWMgYW5kICNpZmRlZgorICBtZXNzLiBUaGUgdGltZXJzLmMgY29kZSBpcyB2ZXJ5ICJ0aWdodGx5IGNvZGVkIiBhcm91bmQgamlmZmllcyBhbmQKKyAgMzItYml0bmVzcyBhc3N1bXB0aW9ucywgYW5kIGhhcyBiZWVuIGhvbmVkIGFuZCBtaWNyby1vcHRpbWl6ZWQgZm9yIGEKKyAgcmVsYXRpdmVseSBuYXJyb3cgdXNlIGNhc2UgKGppZmZpZXMgaW4gYSByZWxhdGl2ZWx5IG5hcnJvdyBIWiByYW5nZSkKKyAgZm9yIG1hbnkgeWVhcnMgLSBhbmQgdGh1cyBldmVuIHNtYWxsIGV4dGVuc2lvbnMgdG8gaXQgZWFzaWx5IGJyZWFrCisgIHRoZSB3aGVlbCBjb25jZXB0LCBsZWFkaW5nIHRvIGV2ZW4gd29yc2UgY29tcHJvbWlzZXMuIFRoZSB0aW1lciB3aGVlbAorICBjb2RlIGlzIHZlcnkgZ29vZCBhbmQgdGlnaHQgY29kZSwgdGhlcmUncyB6ZXJvIHByb2JsZW1zIHdpdGggaXQgaW4gaXRzCisgIGN1cnJlbnQgdXNhZ2UgLSBidXQgaXQgaXMgc2ltcGx5IG5vdCBzdWl0YWJsZSB0byBiZSBleHRlbmRlZCBmb3IKKyAgaGlnaC1yZXMgdGltZXJzLgorCistIHRoZSB1bnByZWRpY3RhYmxlIFtPKE4pXSBvdmVyaGVhZCBvZiBjYXNjYWRpbmcgbGVhZHMgdG8gZGVsYXlzIHdoaWNoCisgIG5lY2Vzc2lhdGUgYSBtb3JlIGNvbXBsZXggaGFuZGxpbmcgb2YgaGlnaCByZXNvbHV0aW9uIHRpbWVycywgd2hpY2gKKyAgaW4gdHVybiBkZWNyZWFzZXMgcm9idXN0bmVzcy4gU3VjaCBhIGRlc2lnbiBzdGlsbCBsZWQgdG8gcmF0aGVyIGxhcmdlCisgIHRpbWluZyBpbmFjY3VyYWNpZXMuIENhc2NhZGluZyBpcyBhIGZ1bmRhbWVudGFsIHByb3BlcnR5IG9mIHRoZSB0aW1lcgorICB3aGVlbCBjb25jZXB0LCBpdCBjYW5ub3QgYmUgJ2Rlc2lnbmVkIG91dCcgd2l0aG91dCB1bmV2aXRhYmx5CisgIGRlZ3JhZGluZyBvdGhlciBwb3J0aW9ucyBvZiB0aGUgdGltZXJzLmMgY29kZSBpbiBhbiB1bmFjY2VwdGFibGUgd2F5LgorCistIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY3VycmVudCBwb3NpeC10aW1lciBzdWJzeXN0ZW0gb24gdG9wIG9mCisgIHRoZSB0aW1lciB3aGVlbCBoYXMgYWxyZWFkeSBpbnRyb2R1Y2VkIGEgcXVpdGUgY29tcGxleCBoYW5kbGluZyBvZgorICB0aGUgcmVxdWlyZWQgcmVhZGp1c3Rpbmcgb2YgYWJzb2x1dGUgQ0xPQ0tfUkVBTFRJTUUgdGltZXJzIGF0CisgIHNldHRpbWVvZmRheSBvciBOVFAgdGltZSAtIGZ1cnRoZXIgdW5kZXJseWluZyBvdXIgZXhwZXJpZW5jZSBieQorICBleGFtcGxlOiB0aGF0IHRoZSB0aW1lciB3aGVlbCBkYXRhIHN0cnVjdHVyZSBpcyB0b28gcmlnaWQgZm9yIGhpZ2gtcmVzCisgIHRpbWVycy4KKworLSB0aGUgdGltZXIgd2hlZWwgY29kZSBpcyBtb3N0IG9wdGltYWwgZm9yIHVzZSBjYXNlcyB3aGljaCBjYW4gYmUKKyAgaWRlbnRpZmllZCBhcyAidGltZW91dHMiLiBTdWNoIHRpbWVvdXRzIGFyZSB1c3VhbGx5IHNldCB1cCB0byBjb3ZlcgorICBlcnJvciBjb25kaXRpb25zIGluIHZhcmlvdXMgSS9PIHBhdGhzLCBzdWNoIGFzIG5ldHdvcmtpbmcgYW5kIGJsb2NrCisgIEkvTy4gVGhlIHZhc3QgbWFqb3JpdHkgb2YgdGhvc2UgdGltZXJzIG5ldmVyIGV4cGlyZSBhbmQgYXJlIHJhcmVseQorICByZWNhc2NhZGVkIGJlY2F1c2UgdGhlIGV4cGVjdGVkIGNvcnJlY3QgZXZlbnQgYXJyaXZlcyBpbiB0aW1lIHNvIHRoZXkKKyAgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgdGltZXIgd2hlZWwgYmVmb3JlIGFueSBmdXJ0aGVyIHByb2Nlc3Npbmcgb2YKKyAgdGhlbSBiZWNvbWVzIG5lY2Vzc2FyeS4gVGh1cyB0aGUgdXNlcnMgb2YgdGhlc2UgdGltZW91dHMgY2FuIGFjY2VwdAorICB0aGUgZ3JhbnVsYXJpdHkgYW5kIHByZWNpc2lvbiB0cmFkZW9mZnMgb2YgdGhlIHRpbWVyIHdoZWVsLCBhbmQKKyAgbGFyZ2VseSBleHBlY3QgdGhlIHRpbWVyIHN1YnN5c3RlbSB0byBoYXZlIG5lYXItemVybyBvdmVyaGVhZC4KKyAgQWNjdXJhdGUgdGltaW5nIGZvciB0aGVtIGlzIG5vdCBhIGNvcmUgcHVycG9zZSAtIGluIGZhY3QgbW9zdCBvZiB0aGUKKyAgdGltZW91dCB2YWx1ZXMgdXNlZCBhcmUgYWQtaG9jLiBGb3IgdGhlbSBpdCBpcyBhdCBtb3N0IGEgbmVjZXNzYXJ5CisgIGV2aWwgdG8gZ3VhcmFudGVlIHRoZSBwcm9jZXNzaW5nIG9mIGFjdHVhbCB0aW1lb3V0IGNvbXBsZXRpb25zCisgIChiZWNhdXNlIG1vc3Qgb2YgdGhlIHRpbWVvdXRzIGFyZSBkZWxldGVkIGJlZm9yZSBjb21wbGV0aW9uKSwgd2hpY2gKKyAgc2hvdWxkIHRodXMgYmUgYXMgY2hlYXAgYW5kIHVuaW50cnVzaXZlIGFzIHBvc3NpYmxlLgorCitUaGUgcHJpbWFyeSB1c2VycyBvZiBwcmVjaXNpb24gdGltZXJzIGFyZSB1c2VyLXNwYWNlIGFwcGxpY2F0aW9ucyB0aGF0Cit1dGlsaXplIG5hbm9zbGVlcCwgcG9zaXgtdGltZXJzIGFuZCBpdGltZXIgaW50ZXJmYWNlcy4gQWxzbywgaW4ta2VybmVsCit1c2VycyBsaWtlIGRyaXZlcnMgYW5kIHN1YnN5c3RlbXMgd2hpY2ggcmVxdWlyZSBwcmVjaXNlIHRpbWVkIGV2ZW50cworKGUuZy4gbXVsdGltZWRpYSkgY2FuIGJlbmVmaXQgZnJvbSB0aGUgYXZhaWxhYmlsaXR5IG9mIGEgc2VwZXJhdGUKK2hpZ2gtcmVzb2x1dGlvbiB0aW1lciBzdWJzeXN0ZW0gYXMgd2VsbC4KKworV2hpbGUgdGhpcyBzdWJzeXN0ZW0gZG9lcyBub3Qgb2ZmZXIgaGlnaC1yZXNvbHV0aW9uIGNsb2NrIHNvdXJjZXMganVzdAoreWV0LCB0aGUgaHJ0aW1lciBzdWJzeXN0ZW0gY2FuIGJlIGVhc2lseSBleHRlbmRlZCB3aXRoIGhpZ2gtcmVzb2x1dGlvbgorY2xvY2sgY2FwYWJpbGl0aWVzLCBhbmQgcGF0Y2hlcyBmb3IgdGhhdCBleGlzdCBhbmQgYXJlIG1hdHVyaW5nIHF1aWNrbHkuCitUaGUgaW5jcmVhc2luZyBkZW1hbmQgZm9yIHJlYWx0aW1lIGFuZCBtdWx0aW1lZGlhIGFwcGxpY2F0aW9ucyBhbG9uZword2l0aCBvdGhlciBwb3RlbnRpYWwgdXNlcnMgZm9yIHByZWNpc2UgdGltZXJzIGdpdmVzIGFub3RoZXIgcmVhc29uIHRvCitzZXBhcmF0ZSB0aGUgInRpbWVvdXQiIGFuZCAicHJlY2lzZSB0aW1lciIgc3Vic3lzdGVtcy4KKworQW5vdGhlciBwb3RlbnRpYWwgYmVuZWZpdCBpcyB0aGF0IHN1Y2ggYSBzZXBlcmF0aW9uIGFsbG93cyBldmVuIG1vcmUKK3NwZWNpYWwtcHVycG9zZSBvcHRpbWl6YXRpb24gb2YgdGhlIGV4aXN0aW5nIHRpbWVyIHdoZWVsIGZvciB0aGUgbG93CityZXNvbHV0aW9uIGFuZCBsb3cgcHJlY2lzaW9uIHVzZSBjYXNlcyAtIG9uY2UgdGhlIHByZWNpc2lvbi1zZW5zaXRpdmUKK0FQSXMgYXJlIHNlcGFyYXRlZCBmcm9tIHRoZSB0aW1lciB3aGVlbCBhbmQgYXJlIG1pZ3JhdGVkIG92ZXIgdG8KK2hydGltZXJzLiBFLmcuIHdlIGNvdWxkIGRlY3JlYXNlIHRoZSBmcmVxdWVuY3kgb2YgdGhlIHRpbWVvdXQgc3Vic3lzdGVtCitmcm9tIDI1MCBIeiB0byAxMDAgSFogKG9yIGV2ZW4gc21hbGxlcikuCisKK2hydGltZXIgc3Vic3lzdGVtIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGhlIGJhc2ljIGRlc2lnbiBjb25zaWRlcmF0aW9ucyB3ZXJlOgorCistIHNpbXBsaWNpdHkKKworLSBkYXRhIHN0cnVjdHVyZSBub3QgYm91bmQgdG8gamlmZmllcyBvciBhbnkgb3RoZXIgZ3JhbnVsYXJpdHkuIEFsbCB0aGUKKyAga2VybmVsIGxvZ2ljIHdvcmtzIGF0IDY0LWJpdCBuYW5vc2Vjb25kcyByZXNvbHV0aW9uIC0gbm8gY29tcHJvbWlzZXMuCisKKy0gc2ltcGxpZmljYXRpb24gb2YgZXhpc3RpbmcsIHRpbWluZyByZWxhdGVkIGtlcm5lbCBjb2RlCisKK2Fub3RoZXIgYmFzaWMgcmVxdWlyZW1lbnQgd2FzIHRoZSBpbW1lZGlhdGUgZW5xdWV1ZWluZyBhbmQgb3JkZXJpbmcgb2YKK3RpbWVycyBhdCBhY3RpdmF0aW9uIHRpbWUuIEFmdGVyIGxvb2tpbmcgYXQgc2V2ZXJhbCBwb3NzaWJsZSBzb2x1dGlvbnMKK3N1Y2ggYXMgcmFkaXggdHJlZXMgYW5kIGhhc2hlcywgd2UgY2hvc2UgdGhlIHJlZCBibGFjayB0cmVlIGFzIHRoZSBiYXNpYworZGF0YSBzdHJ1Y3R1cmUuIFJidHJlZXMgYXJlIGF2YWlsYWJsZSBhcyBhIGxpYnJhcnkgaW4gdGhlIGtlcm5lbCBhbmQgYXJlCit1c2VkIGluIHZhcmlvdXMgcGVyZm9ybWFuY2UtY3JpdGljYWwgYXJlYXMgb2YgZS5nLiBtZW1vcnkgbWFuYWdlbWVudCBhbmQKK2ZpbGUgc3lzdGVtcy4gVGhlIHJidHJlZSBpcyBzb2xlbHkgdXNlZCBmb3IgdGltZSBzb3J0ZWQgb3JkZXJpbmcsIHdoaWxlCithIHNlcGFyYXRlIGxpc3QgaXMgdXNlZCB0byBnaXZlIHRoZSBleHBpcnkgY29kZSBmYXN0IGFjY2VzcyB0byB0aGUKK3F1ZXVlZCB0aW1lcnMsIHdpdGhvdXQgaGF2aW5nIHRvIHdhbGsgdGhlIHJidHJlZS4KKworKFRoaXMgc2VwZXJhdGUgbGlzdCBpcyBhbHNvIHVzZWZ1bCBmb3IgbGF0ZXIgd2hlbiB3ZSdsbCBpbnRyb2R1Y2UKK2hpZ2gtcmVzb2x1dGlvbiBjbG9ja3MsIHdoZXJlIHdlIG5lZWQgc2VwZXJhdGUgcGVuZGluZyBhbmQgZXhwaXJlZAorcXVldWVzIHdoaWxlIGtlZXBpbmcgdGhlIHRpbWUtb3JkZXIgaW50YWN0LikKKworVGltZS1vcmRlcmVkIGVucXVldWVpbmcgaXMgbm90IHB1cmVseSBmb3IgdGhlIHB1cnBvc2VzIG9mCitoaWdoLXJlc29sdXRpb24gY2xvY2tzIHRob3VnaCwgaXQgYWxzbyBzaW1wbGlmaWVzIHRoZSBoYW5kbGluZyBvZgorYWJzb2x1dGUgdGltZXJzIGJhc2VkIG9uIGEgbG93LXJlc29sdXRpb24gQ0xPQ0tfUkVBTFRJTUUuIFRoZSBleGlzdGluZworaW1wbGVtZW50YXRpb24gbmVlZGVkIHRvIGtlZXAgYW4gZXh0cmEgbGlzdCBvZiBhbGwgYXJtZWQgYWJzb2x1dGUKK0NMT0NLX1JFQUxUSU1FIHRpbWVycyBhbG9uZyB3aXRoIGNvbXBsZXggbG9ja2luZy4gSW4gY2FzZSBvZgorc2V0dGltZW9mZGF5IGFuZCBOVFAsIGFsbCB0aGUgdGltZXJzICghKSBoYWQgdG8gYmUgZGVxdWV1ZWQsIHRoZQordGltZS1jaGFuZ2luZyBjb2RlIGhhZCB0byBmaXggdGhlbSB1cCBvbmUgYnkgb25lLCBhbmQgYWxsIG9mIHRoZW0gaGFkIHRvCitiZSBlbnF1ZXVlZCBhZ2Fpbi4gVGhlIHRpbWUtb3JkZXJlZCBlbnF1ZXVlaW5nIGFuZCB0aGUgc3RvcmFnZSBvZiB0aGUKK2V4cGlyeSB0aW1lIGluIGFic29sdXRlIHRpbWUgdW5pdHMgcmVtb3ZlcyBhbGwgdGhpcyBjb21wbGV4IGFuZCBwb29ybHkKK3NjYWxpbmcgY29kZSBmcm9tIHRoZSBwb3NpeC10aW1lciBpbXBsZW1lbnRhdGlvbiAtIHRoZSBjbG9jayBjYW4gc2ltcGx5CitiZSBzZXQgd2l0aG91dCBoYXZpbmcgdG8gdG91Y2ggdGhlIHJidHJlZS4gVGhpcyBhbHNvIG1ha2VzIHRoZSBoYW5kbGluZworb2YgcG9zaXgtdGltZXJzIHNpbXBsZXIgaW4gZ2VuZXJhbC4KKworVGhlIGxvY2tpbmcgYW5kIHBlci1DUFUgYmVoYXZpb3Igb2YgaHJ0aW1lcnMgd2FzIG1vc3RseSB0YWtlbiBmcm9tIHRoZQorZXhpc3RpbmcgdGltZXIgd2hlZWwgY29kZSwgYXMgaXQgaXMgbWF0dXJlIGFuZCB3ZWxsIHN1aXRlZC4gU2hhcmluZyBjb2RlCit3YXMgbm90IHJlYWxseSBhIHdpbiwgZHVlIHRvIHRoZSBkaWZmZXJlbnQgZGF0YSBzdHJ1Y3R1cmVzLiBBbHNvLCB0aGUKK2hydGltZXIgZnVuY3Rpb25zIG5vdyBoYXZlIGNsZWFyZXIgYmVoYXZpb3IgYW5kIGNsZWFyZXIgbmFtZXMgLSBzdWNoIGFzCitocnRpbWVyX3RyeV90b19jYW5jZWwoKSBhbmQgaHJ0aW1lcl9jYW5jZWwoKSBbd2hpY2ggYXJlIHJvdWdobHkKK2VxdWl2YWxlbnQgdG8gZGVsX3RpbWVyKCkgYW5kIGRlbF90aW1lcl9zeW5jKCldIC0gc28gdGhlcmUncyBubyBkaXJlY3QKKzE6MSBtYXBwaW5nIGJldHdlZW4gdGhlbSBvbiB0aGUgYWxnb3JpdGhtaWNhbCBsZXZlbCwgYW5kIHRodXMgbm8gcmVhbAorcG90ZW50aWFsIGZvciBjb2RlIHNoYXJpbmcgZWl0aGVyLgorCitCYXNpYyBkYXRhIHR5cGVzOiBldmVyeSB0aW1lIHZhbHVlLCBhYnNvbHV0ZSBvciByZWxhdGl2ZSwgaXMgaW4gYQorc3BlY2lhbCBuYW5vc2Vjb25kLXJlc29sdXRpb24gdHlwZToga3RpbWVfdC4gVGhlIGtlcm5lbC1pbnRlcm5hbAorcmVwcmVzZW50YXRpb24gb2Yga3RpbWVfdCB2YWx1ZXMgYW5kIG9wZXJhdGlvbnMgaXMgaW1wbGVtZW50ZWQgdmlhCittYWNyb3MgYW5kIGlubGluZSBmdW5jdGlvbnMsIGFuZCBjYW4gYmUgc3dpdGNoZWQgYmV0d2VlbiBhICJoeWJyaWQKK3VuaW9uIiB0eXBlIGFuZCBhIHBsYWluICJzY2FsYXIiIDY0Yml0IG5hbm9zZWNvbmRzIHJlcHJlc2VudGF0aW9uIChhdAorY29tcGlsZSB0aW1lKS4gVGhlIGh5YnJpZCB1bmlvbiB0eXBlIG9wdGltaXplcyB0aW1lIGNvbnZlcnNpb25zIG9uIDMyYml0CitDUFVzLiBUaGlzIGJ1aWxkLXRpbWUtc2VsZWN0YWJsZSBrdGltZV90IHN0b3JhZ2UgZm9ybWF0IHdhcyBpbXBsZW1lbnRlZAordG8gYXZvaWQgdGhlIHBlcmZvcm1hbmNlIGltcGFjdCBvZiA2NC1iaXQgbXVsdGlwbGljYXRpb25zIGFuZCBkaXZpc2lvbnMKK29uIDMyYml0IENQVXMuIFN1Y2ggb3BlcmF0aW9ucyBhcmUgZnJlcXVlbnRseSBuZWNlc3NhcnkgdG8gY29udmVydAorYmV0d2VlbiB0aGUgc3RvcmFnZSBmb3JtYXRzIHByb3ZpZGVkIGJ5IGtlcm5lbCBhbmQgdXNlcnNwYWNlIGludGVyZmFjZXMKK2FuZCB0aGUgaW50ZXJuYWwgdGltZSBmb3JtYXQuIChTZWUgaW5jbHVkZS9saW51eC9rdGltZS5oIGZvciBmdXJ0aGVyCitkZXRhaWxzLikKKworaHJ0aW1lcnMgLSByb3VuZGluZyBvZiB0aW1lciB2YWx1ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RoZSBocnRpbWVyIGNvZGUgd2lsbCByb3VuZCB0aW1lciBldmVudHMgdG8gbG93ZXItcmVzb2x1dGlvbiBjbG9ja3MKK2JlY2F1c2UgaXQgaGFzIHRvLiBPdGhlcndpc2UgaXQgd2lsbCBkbyBubyBhcnRpZmljaWFsIHJvdW5kaW5nIGF0IGFsbC4KKworb25lIHF1ZXN0aW9uIGlzLCB3aGF0IHJlc29sdXRpb24gdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkIHRvIHRoZSB1c2VyIGJ5Cit0aGUgY2xvY2tfZ2V0cmVzKCkgaW50ZXJmYWNlLiBUaGlzIHdpbGwgcmV0dXJuIHdoYXRldmVyIHJlYWwgcmVzb2x1dGlvbgorYSBnaXZlbiBjbG9jayBoYXMgLSBiZSBpdCBsb3ctcmVzLCBoaWdoLXJlcywgb3IgYXJ0aWZpY2lhbGx5LWxvdy1yZXMuCisKK2hydGltZXJzIC0gdGVzdGluZyBhbmQgdmVyaWZpY2F0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dlIHVzZWQgdGhlIGhpZ2gtcmVzb2x1dGlvbiBjbG9jayBzdWJzeXN0ZW0gb250b3Agb2YgaHJ0aW1lcnMgdG8gdmVyaWZ5Cit0aGUgaHJ0aW1lciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGluIHByYXhpcywgYW5kIHdlIGFsc28gcmFuIHRoZSBwb3NpeAordGltZXIgdGVzdHMgaW4gb3JkZXIgdG8gZW5zdXJlIHNwZWNpZmljYXRpb24gY29tcGxpYW5jZS4gV2UgYWxzbyByYW4KK3Rlc3RzIG9uIGxvdy1yZXNvbHV0aW9uIGNsb2Nrcy4KKworVGhlIGhydGltZXIgcGF0Y2ggY29udmVydHMgdGhlIGZvbGxvd2luZyBrZXJuZWwgZnVuY3Rpb25hbGl0eSB0byB1c2UKK2hydGltZXJzOgorCisgLSBuYW5vc2xlZXAKKyAtIGl0aW1lcnMKKyAtIHBvc2l4LXRpbWVycworCitUaGUgY29udmVyc2lvbiBvZiBuYW5vc2xlZXAgYW5kIHBvc2l4LXRpbWVycyBlbmFibGVkIHRoZSB1bmlmaWNhdGlvbiBvZgorbmFub3NsZWVwIGFuZCBjbG9ja19uYW5vc2xlZXAuCisKK1RoZSBjb2RlIHdhcyBzdWNjZXNzZnVsbHkgY29tcGlsZWQgZm9yIHRoZSBmb2xsb3dpbmcgcGxhdGZvcm1zOgorCisgaTM4NiwgeDg2XzY0LCBBUk0sIFBQQywgUFBDNjQsIElBNjQKKworVGhlIGNvZGUgd2FzIHJ1bi10ZXN0ZWQgb24gdGhlIGZvbGxvd2luZyBwbGF0Zm9ybXM6CisKKyBpMzg2KFVQL1NNUCksIHg4Nl82NChVUC9TTVApLCBBUk0sIFBQQworCitocnRpbWVycyB3ZXJlIGFsc28gaW50ZWdyYXRlZCBpbnRvIHRoZSAtcnQgdHJlZSwgYWxvbmcgd2l0aCBhCitocnRpbWVycy1iYXNlZCBoaWdoLXJlc29sdXRpb24gY2xvY2sgaW1wbGVtZW50YXRpb24sIHNvIHRoZSBocnRpbWVycworY29kZSBnb3QgYSBoZWFsdGh5IGFtb3VudCBvZiB0ZXN0aW5nIGFuZCB1c2UgaW4gcHJhY3RpY2UuCisKKwlUaG9tYXMgR2xlaXhuZXIsIEluZ28gTW9sbmFyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyby9pb2N0bCBiL0RvY3VtZW50YXRpb24vaTJvL2lvY3RsCmluZGV4IDNlMTc0OTcuLjFlNzdmYWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaTJvL2lvY3RsCisrKyBiL0RvY3VtZW50YXRpb24vaTJvL2lvY3RsCkBAIC0xODUsNyArMTg1LDcgQEAKICAgICAgIEVOT01FTSAgICAgIEtlcm5lbCBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvcgogCiAgICBBIHJldHVybiB2YWx1ZSBvZiAwIGRvZXMgbm90IG1lYW4gdGhhdCB0aGUgdmFsdWUgd2FzIGFjdHVhbGx5Ci0gICBwcm9wZXJseSByZXRyZWl2ZWQuICBUaGUgdXNlciBzaG91bGQgY2hlY2sgdGhlIHJlc3VsdCBsaXN0CisgICBwcm9wZXJseSByZXRyaWV2ZWQuICBUaGUgdXNlciBzaG91bGQgY2hlY2sgdGhlIHJlc3VsdCBsaXN0CiAgICB0byBkZXRlcm1pbmUgdGhlIHNwZWNpZmljIHN0YXR1cyBvZiB0aGUgdHJhbnNhY3Rpb24uCiAKIFZJSUkuIERvd25sb2FkaW5nIFNvZnR3YXJlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lucHV0L2FwcGxldG91Y2gudHh0IGIvRG9jdW1lbnRhdGlvbi9pbnB1dC9hcHBsZXRvdWNoLnR4dAppbmRleCBiNDhkMTFkLi40ZjdjNjMzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2lucHV0L2FwcGxldG91Y2gudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW5wdXQvYXBwbGV0b3VjaC50eHQKQEAgLTMsNyArMyw3IEBACiAJQ29weXJpZ2h0IChDKSAyMDA1IFN0ZWxpYW4gUG9wIDxzdGVsaWFuQHBvcGllcy5uZXQ+CiAKIGFwcGxldG91Y2ggaXMgYSBMaW51eCBrZXJuZWwgZHJpdmVyIGZvciB0aGUgVVNCIHRvdWNocGFkIGZvdW5kIG9uIHBvc3QKLUZlYnJ1YXJ5IDIwMDUgQXBwbGUgQWx1IFBvd2VyYm9va3MuCitGZWJydWFyeSAyMDA1IGFuZCBPY3RvYmVyIDIwMDUgQXBwbGUgQWx1bWluaXVtIFBvd2VyYm9va3MuCiAKIFRoaXMgZHJpdmVyIGlzIGRlcml2ZWQgZnJvbSBKb2hhbm5lcyBCZXJnJ3MgYXBwbGV0cmFja3BhZCBkcml2ZXJbMV0sIGJ1dCBpdCBoYXMKIGJlZW4gaW1wcm92ZWQgaW4gc29tZSBhcmVhczoKQEAgLTEzLDcgKzEzLDggQEAKIAogQ3JlZGl0cyBnbyB0byBKb2hhbm5lcyBCZXJnIGZvciByZXZlcnNlLWVuZ2luZWVyaW5nIHRoZSB0b3VjaHBhZCBwcm90b2NvbCwKIEZyYW5rIEFybm9sZCBmb3IgZnVydGhlciBpbXByb3ZlbWVudHMsIGFuZCBBbGV4IEhhcnBlciBmb3Igc29tZSBhZGRpdGlvbmFsCi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5uZXIgd29ya2luZ3Mgb2YgdGhlIHRvdWNocGFkIHNlbnNvcnMuCitpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5uZXIgd29ya2luZ3Mgb2YgdGhlIHRvdWNocGFkIHNlbnNvcnMuIE1pY2hhZWwKK0hhbnNlbG1hbm4gYWRkZWQgc3VwcG9ydCBmb3IgdGhlIE9jdG9iZXIgMjAwNSBtb2RlbHMuCiAKIFVzYWdlOgogLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lucHV0L2ZmLnR4dCBiL0RvY3VtZW50YXRpb24vaW5wdXQvZmYudHh0CmluZGV4IGVmYTdkZDYuLmM3ZTEwZWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW5wdXQvZmYudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW5wdXQvZmYudHh0CkBAIC0xMjAsNyArMTIwLDcgQEAKIHNvbWUgb3BlcmF0aW9ucyAocmVtb3ZpbmcgYW4gZWZmZWN0LCBjb250cm9sbGluZyB0aGUgcGxheWJhY2spLgogVGhpcyBpZiBmaWVsZCBtdXN0IGJlIHNldCB0byAtMSBieSB0aGUgdXNlciBpbiBvcmRlciB0byB0ZWxsIHRoZSBkcml2ZXIgdG8KIGFsbG9jYXRlIGEgbmV3IGVmZmVjdC4KLVNlZSA8bGludXgvaW5wdXQuaD4gZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGZmX2VmZmVjdCBzdHVjdC4gWW91IHNob3VsZCBhbHNvCitTZWUgPGxpbnV4L2lucHV0Lmg+IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmZl9lZmZlY3Qgc3RydWN0LiBZb3Ugc2hvdWxkIGFsc28KIGZpbmQgaGVscCBpbiBhIGZldyBza2V0Y2hlcywgY29udGFpbmVkIGluIGZpbGVzIHNoYXBlLmZpZyBhbmQgaW50ZXJhY3RpdmUuZmlnLgogWW91IG5lZWQgeGZpZyB0byB2aXN1YWxpemUgdGhlc2UgZmlsZXMuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW9jdGwvaGRpby50eHQgYi9Eb2N1bWVudGF0aW9uL2lvY3RsL2hkaW8udHh0CmluZGV4IDlhN2FlYTAuLjExYzliZTQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW9jdGwvaGRpby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pb2N0bC9oZGlvLnR4dApAQCAtOTQ2LDcgKzk0Niw3IEBACiAKIAkgIFRoaXMgaW9jdGwgaW5pdGlhbGl6ZXMgdGhlIGFkZHJlc3NlcyBhbmQgaXJxIGZvciBhIGRpc2sKIAkgIGNvbnRyb2xsZXIsIHByb2JlcyBmb3IgZHJpdmVzLCBhbmQgY3JlYXRlcyAvcHJvYy9pZGUKLQkgIGludGVyZmFjZXMgYXMgYXBwcm9waWF0ZS4KKwkgIGludGVyZmFjZXMgYXMgYXBwcm9wcmlhdGUuCiAKIAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQvbWFrZWZpbGVzLnR4dAppbmRleCBkODAyY2U4Li40NDMyMzBiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlcy50eHQKQEAgLTEwMzMsOSArMTAzMyw5IEBACiAKIAlFeGFtcGxlOgogCQkjYXJjaC9pMzg2L01ha2VmaWxlCi0JCUdDQ19WRVJTSU9OIDo9ICQoY2FsbCBjYy12ZXJzaW9uKQogCQljZmxhZ3MteSArPSAkKHNoZWxsIFwKLQkJaWYgWyAkKEdDQ19WRVJTSU9OKSAtZ2UgMDMwMCBdIDsgdGhlbiBlY2hvICItbXJlZ3Bhcm09MyI7IGZpIDspCisJCWlmIFsgJChjYWxsIGNjLXZlcnNpb24pIC1nZSAwMzAwIF0gOyB0aGVuIFwKKwkJCWVjaG8gIi1tcmVncGFybT0zIjsgZmkgOykKIAogCUluIHRoZSBhYm92ZSBleGFtcGxlIC1tcmVncGFybT0zIGlzIG9ubHkgdXNlZCBmb3IgZ2NjIHZlcnNpb24gZ3JlYXRlcgogCXRoYW4gb3IgZXF1YWwgdG8gZ2NjIDMuMC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2R1bXAvZ2RibWFjcm9zLnR4dCBiL0RvY3VtZW50YXRpb24va2R1bXAvZ2RibWFjcm9zLnR4dAppbmRleCBiYzFiOWViLi5kY2Y1NTgwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tkdW1wL2dkYm1hY3Jvcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZHVtcC9nZGJtYWNyb3MudHh0CkBAIC0xNzcsMyArMTc3LDI1IEBACiAJJ3RyYXBpbmZvIDxwaWQ+JyB3aWxsIHRlbGwgeW91IGJ5IHdoaWNoIHRyYXAgJiBwb3NzaWJseQogCWFkZHJlc3RoZSBrZXJuZWwgcGFuaWNlZC4KIGVuZAorCisKK2RlZmluZSBkbWVzZworCXNldCAkaSA9IDAKKwlzZXQgJGVuZF9pZHggPSAobG9nX2VuZCAtIDEpICYgKGxvZ19idWZfbGVuIC0gMSkKKworCXdoaWxlICgkaSA8IGxvZ2dlZF9jaGFycykKKwkJc2V0ICRpZHggPSAobG9nX2VuZCAtIDEgLSBsb2dnZWRfY2hhcnMgKyAkaSkgJiAobG9nX2J1Zl9sZW4gLSAxKQorCisJCWlmICgkaWR4ICsgMTAwIDw9ICRlbmRfaWR4KSB8fCBcCisJCSAgICgkZW5kX2lkeCA8PSAkaWR4ICYmICRpZHggKyAxMDAgPCBsb2dfYnVmX2xlbikKKwkJCXByaW50ZiAiJS4xMDBzIiwgJmxvZ19idWZbJGlkeF0KKwkJCXNldCAkaSA9ICRpICsgMTAwCisJCWVsc2UKKwkJCXByaW50ZiAiJWMiLCBsb2dfYnVmWyRpZHhdCisJCQlzZXQgJGkgPSAkaSArIDEKKwkJZW5kCisJZW5kCitlbmQKK2RvY3VtZW50IGRtZXNnCisJcHJpbnQgdGhlIGtlcm5lbCByaW5nIGJ1ZmZlcgorZW5kCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tkdW1wL2tkdW1wLnR4dCBiL0RvY3VtZW50YXRpb24va2R1bXAva2R1bXAudHh0CmluZGV4IDVmMDhmOWMuLjIxMmNmM2MgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2R1bXAva2R1bXAudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2R1bXAva2R1bXAudHh0CkBAIC00LDEwICs0LDEwIEBACiBERVNJR04KID09PT09PQogCi1LZHVtcCB1c2VzIGtleGVjIHRvIHJlYm9vdCB0byBhIHNlY29uZCBrZXJuZWwgd2hlbmV2ZXIgYSBkdW1wIG5lZWRzIHRvIGJlIHRha2VuLgotVGhpcyBzZWNvbmQga2VybmVsIGlzIGJvb3RlZCB3aXRoIHZlcnkgbGl0dGxlIG1lbW9yeS4gVGhlIGZpcnN0IGtlcm5lbCByZXNlcnZlcwotdGhlIHNlY3Rpb24gb2YgbWVtb3J5IHRoYXQgdGhlIHNlY29uZCBrZXJuZWwgdXNlcy4gVGhpcyBlbnN1cmVzIHRoYXQgb24tZ29pbmcKLURNQSBmcm9tIHRoZSBmaXJzdCBrZXJuZWwgZG9lcyBub3QgY29ycnVwdCB0aGUgc2Vjb25kIGtlcm5lbC4KK0tkdW1wIHVzZXMga2V4ZWMgdG8gcmVib290IHRvIGEgc2Vjb25kIGtlcm5lbCB3aGVuZXZlciBhIGR1bXAgbmVlZHMgdG8gYmUKK3Rha2VuLiBUaGlzIHNlY29uZCBrZXJuZWwgaXMgYm9vdGVkIHdpdGggdmVyeSBsaXR0bGUgbWVtb3J5LiBUaGUgZmlyc3Qga2VybmVsCityZXNlcnZlcyB0aGUgc2VjdGlvbiBvZiBtZW1vcnkgdGhhdCB0aGUgc2Vjb25kIGtlcm5lbCB1c2VzLiBUaGlzIGVuc3VyZXMgdGhhdAorb24tZ29pbmcgRE1BIGZyb20gdGhlIGZpcnN0IGtlcm5lbCBkb2VzIG5vdCBjb3JydXB0IHRoZSBzZWNvbmQga2VybmVsLgogCiBBbGwgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBhYm91dCBDb3JlIGltYWdlIGlzIGVuY29kZWQgaW4gRUxGIGZvcm1hdCBhbmQKIHN0b3JlZCBpbiByZXNlcnZlZCBhcmVhIG9mIG1lbW9yeSBiZWZvcmUgY3Jhc2guIFBoeXNpY2FsIGFkZHJlc3Mgb2Ygc3RhcnQgb2YKQEAgLTM1LDc3ICszNSw4MiBAQAogU0VUVVAKID09PT09CiAKLTEpIERvd25sb2FkIGh0dHA6Ly93d3cueG1pc3Npb24uY29tL35lYmllZGVybS9maWxlcy9rZXhlYy9rZXhlYy10b29scy0xLjEwMS50YXIuZ3oKLSAgIGFuZCBhcHBseSBodHRwOi8vbHNlLnNvdXJjZWZvcmdlLm5ldC9rZHVtcC9wYXRjaGVzL2tleGVjLXRvb2xzLTEuMTAxLWtkdW1wLnBhdGNoCi0gICBhbmQgYWZ0ZXIgdGhhdCBidWlsZCB0aGUgc291cmNlLgorMSkgRG93bmxvYWQgdGhlIHVwc3RyZWFtIGtleGVjLXRvb2xzIHVzZXJzcGFjZSBwYWNrYWdlIGZyb20KKyAgIGh0dHA6Ly93d3cueG1pc3Npb24uY29tL35lYmllZGVybS9maWxlcy9rZXhlYy9rZXhlYy10b29scy0xLjEwMS50YXIuZ3ouCiAKLTIpIERvd25sb2FkIGFuZCBidWlsZCB0aGUgYXBwcm9wcmlhdGUgKDIuNi4xMy1yYzEgb253YXJkcykgdmFuaWxsYSBrZXJuZWwuCisgICBBcHBseSB0aGUgbGF0ZXN0IGNvbnNvbGlkYXRlZCBrZHVtcCBwYXRjaCBvbiB0b3Agb2Yga2V4ZWMtdG9vbHMtMS4xMDEKKyAgIGZyb20gaHR0cDovL2xzZS5zb3VyY2Vmb3JnZS5uZXQva2R1bXAvLiBUaGlzIGFycmFuZ21lbnQgaGFzIGJlZW4gbWFkZQorICAgdGlsbCBhbGwgdGhlIHVzZXJzcGFjZSBwYXRjaGVzIHN1cHBvcnRpbmcga2R1bXAgYXJlIGludGVncmF0ZWQgd2l0aAorICAgdXBzdHJlYW0ga2V4ZWMtdG9vbHMgdXNlcnNwYWNlLgogCisyKSBEb3dubG9hZCBhbmQgYnVpbGQgdGhlIGFwcHJvcHJpYXRlICgyLjYuMTMtcmMxIG9ud2FyZHMpIHZhbmlsbGEga2VybmVscy4KICAgIFR3byBrZXJuZWxzIG5lZWQgdG8gYmUgYnVpbHQgaW4gb3JkZXIgdG8gZ2V0IHRoaXMgZmVhdHVyZSB3b3JraW5nLgorICAgRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdG8gcHJvcGVybHkgY29uZmlndXJlIHRoZSB0d28ga2VybmVscyBzcGVjaWZpYworICAgdG8ga2V4ZWMgYW5kIGtkdW1wIGZlYXR1cmVzOgogCi0gIEEpIEZpcnN0IGtlcm5lbDoKKyAgQSkgRmlyc3Qga2VybmVsIG9yIHJlZ3VsYXIga2VybmVsOgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBhKSBFbmFibGUgImtleGVjIHN5c3RlbSBjYWxsIiBmZWF0dXJlIChpbiBQcm9jZXNzb3IgdHlwZSBhbmQgZmVhdHVyZXMpLgotCUNPTkZJR19LRVhFQz15Ci0gICBiKSBUaGlzIGtlcm5lbCdzIHBoeXNpY2FsIGxvYWQgYWRkcmVzcyBzaG91bGQgYmUgdGhlIGRlZmF1bHQgdmFsdWUgb2YKLSAgICAgIDB4MTAwMDAwICgweDEwMDAwMCwgMSBNQikgKGluIFByb2Nlc3NvciB0eXBlIGFuZCBmZWF0dXJlcykuCi0JQ09ORklHX1BIWVNJQ0FMX1NUQVJUPTB4MTAwMDAwCi0gICBjKSBFbmFibGUgInN5c2ZzIGZpbGUgc3lzdGVtIHN1cHBvcnQiIChpbiBQc2V1ZG8gZmlsZXN5c3RlbXMpLgotCUNPTkZJR19TWVNGUz15CisgICAgICBDT05GSUdfS0VYRUM9eQorICAgYikgRW5hYmxlICJzeXNmcyBmaWxlIHN5c3RlbSBzdXBwb3J0IiAoaW4gUHNldWRvIGZpbGVzeXN0ZW1zKS4KKyAgICAgIENPTkZJR19TWVNGUz15CisgICBjKSBtYWtlCiAgICBkKSBCb290IGludG8gZmlyc3Qga2VybmVsIHdpdGggdGhlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgImNyYXNoa2VybmVsPVlAWCIuCiAgICAgICBVc2UgYXBwcm9wcmlhdGUgdmFsdWVzIGZvciBYIGFuZCBZLiBZIGRlbm90ZXMgaG93IG11Y2ggbWVtb3J5IHRvIHJlc2VydmUKLSAgICAgIGZvciB0aGUgc2Vjb25kIGtlcm5lbCwgYW5kIFggZGVub3RlcyBhdCB3aGF0IHBoeXNpY2FsIGFkZHJlc3MgdGhlIHJlc2VydmVkCi0gICAgICBtZW1vcnkgc2VjdGlvbiBzdGFydHMuIEZvciBleGFtcGxlOiAiY3Jhc2hrZXJuZWw9NjRNQDE2TSIuCisgICAgICBmb3IgdGhlIHNlY29uZCBrZXJuZWwsIGFuZCBYIGRlbm90ZXMgYXQgd2hhdCBwaHlzaWNhbCBhZGRyZXNzIHRoZQorICAgICAgcmVzZXJ2ZWQgbWVtb3J5IHNlY3Rpb24gc3RhcnRzLiBGb3IgZXhhbXBsZTogImNyYXNoa2VybmVsPTY0TUAxNk0iLgogCi0gIEIpIFNlY29uZCBrZXJuZWw6Ci0gICBhKSBFbmFibGUgImtlcm5lbCBjcmFzaCBkdW1wcyIgZmVhdHVyZSAoaW4gUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzKS4KLQlDT05GSUdfQ1JBU0hfRFVNUD15Ci0gICBiKSBTcGVjaWZ5IGEgc3VpdGFibGUgdmFsdWUgZm9yICJQaHlzaWNhbCBhZGRyZXNzIHdoZXJlIHRoZSBrZXJuZWwgaXMKLSAgICAgIGxvYWRlZCIgKGluIFByb2Nlc3NvciB0eXBlIGFuZCBmZWF0dXJlcykuIFR5cGljYWxseSB0aGlzIHZhbHVlCi0gICAgICBzaG91bGQgYmUgc2FtZSBhcyBYIChTZWUgb3B0aW9uIGQpIGFib3ZlLCBlLmcuLCAxNiBNQiBvciAweDEwMDAwMDAuCi0JQ09ORklHX1BIWVNJQ0FMX1NUQVJUPTB4MTAwMDAwMAotICAgYykgRW5hYmxlICIvcHJvYy92bWNvcmUgc3VwcG9ydCIgKE9wdGlvbmFsLCBpbiBQc2V1ZG8gZmlsZXN5c3RlbXMpLgotCUNPTkZJR19QUk9DX1ZNQ09SRT15Ci0gICBkKSBEaXNhYmxlIFNNUCBzdXBwb3J0IGFuZCBidWlsZCBhIFVQIGtlcm5lbCAoVW50aWwgaXQgaXMgZml4ZWQpLgotCUNPTkZJR19TTVA9bgotICAgZSkgRW5hYmxlICJMb2NhbCBBUElDIHN1cHBvcnQgb24gdW5pcHJvY2Vzc29ycyIuCi0JQ09ORklHX1g4Nl9VUF9BUElDPXkKLSAgIGYpIEVuYWJsZSAiSU8tQVBJQyBzdXBwb3J0IG9uIHVuaXByb2Nlc3NvcnMiCi0JQ09ORklHX1g4Nl9VUF9JT0FQSUM9eQogCi0gIE5vdGU6ICAgaSkgT3B0aW9ucyBhKSBhbmQgYikgZGVwZW5kIHVwb24gIkNvbmZpZ3VyZSBzdGFuZGFyZCBrZXJuZWwgZmVhdHVyZXMKLQkgICAgIChmb3Igc21hbGwgc3lzdGVtcykiICh1bmRlciBHZW5lcmFsIHNldHVwKS4KLQkgaWkpIE9wdGlvbiBhKSBhbHNvIGRlcGVuZHMgb24gQ09ORklHX0hJR0hNRU0gKHVuZGVyIFByb2Nlc3NvcgotCQl0eXBlIGFuZCBmZWF0dXJlcykuCi0JaWlpKSBCb3RoIG9wdGlvbiBhKSBhbmQgYikgYXJlIHVuZGVyICJQcm9jZXNzb3IgdHlwZSBhbmQgZmVhdHVyZXMiLgorICBCKSBTZWNvbmQga2VybmVsIG9yIGR1bXAgY2FwdHVyZSBrZXJuZWw6CisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgYSkgRm9yIGkzODYgYXJjaGl0ZWN0dXJlIGVuYWJsZSBIaWdobWVtIHN1cHBvcnQKKyAgICAgIENPTkZJR19ISUdITUVNPXkKKyAgIGIpIEVuYWJsZSAia2VybmVsIGNyYXNoIGR1bXBzIiBmZWF0dXJlICh1bmRlciAiUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIikKKyAgICAgIENPTkZJR19DUkFTSF9EVU1QPXkKKyAgIGMpIE1ha2Ugc3VyZSBhIHN1aXRhYmxlIHZhbHVlIGZvciAiUGh5c2ljYWwgYWRkcmVzcyB3aGVyZSB0aGUga2VybmVsIGlzCisgICAgICBsb2FkZWQiICh1bmRlciAiUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIikuIEJ5IGRlZmF1bHQgdGhpcyB2YWx1ZQorICAgICAgaXMgMHgxMDAwMDAwICgxNk1CKSBhbmQgaXQgc2hvdWxkIGJlIHNhbWUgYXMgWCAoU2VlIG9wdGlvbiBkIGFib3ZlKSwKKyAgICAgIGUuZy4sIDE2IE1CIG9yIDB4MTAwMDAwMC4KKyAgICAgIENPTkZJR19QSFlTSUNBTF9TVEFSVD0weDEwMDAwMDAKKyAgIGQpIEVuYWJsZSAiL3Byb2Mvdm1jb3JlIHN1cHBvcnQiIChPcHRpb25hbCwgdW5kZXIgIlBzZXVkbyBmaWxlc3lzdGVtcyIpLgorICAgICAgQ09ORklHX1BST0NfVk1DT1JFPXkKIAotMykgQm9vdCBpbnRvIHRoZSBmaXJzdCBrZXJuZWwuIFlvdSBhcmUgbm93IHJlYWR5IHRvIHRyeSBvdXQga2V4ZWMtYmFzZWQgY3Jhc2gKLSAgIGR1bXBzLgotCi00KSBMb2FkIHRoZSBzZWNvbmQga2VybmVsIHRvIGJlIGJvb3RlZCB1c2luZzoKKzMpIEFmdGVyIGJvb3RpbmcgdG8gcmVndWxhciBrZXJuZWwgb3IgZmlyc3Qga2VybmVsLCBsb2FkIHRoZSBzZWNvbmQga2VybmVsCisgICB1c2luZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CiAKICAgIGtleGVjIC1wIDxzZWNvbmQta2VybmVsPiAtLWFyZ3MtbGludXggLS1lbGYzMi1jb3JlLWhlYWRlcnMKLSAgIC0tYXBwZW5kPSJyb290PTxyb290LWRldj4gaW5pdCAxIGlycXBvbGwiCisgICAtLWFwcGVuZD0icm9vdD08cm9vdC1kZXY+IGluaXQgMSBpcnFwb2xsIG1heGNwdXM9MSIKIAotICAgTm90ZTogaSkgPHNlY29uZC1rZXJuZWw+IGhhcyB0byBiZSBhIHZtbGludXggaW1hZ2UuIGJ6SW1hZ2Ugd2lsbCBub3Qgd29yaywKLQkgICAgYXMgb2Ygbm93LgotCWlpKSBCeSBkZWZhdWx0IEVMRiBoZWFkZXJzIGFyZSBzdG9yZWQgaW4gRUxGNjQgZm9ybWF0LiBPcHRpb24KLQkgICAgLS1lbGYzMi1jb3JlLWhlYWRlcnMgZm9yY2VzIGdlbmVyYXRpb24gb2YgRUxGMzIgaGVhZGVycy4gZ2RiIGNhbgotCSAgICBub3Qgb3BlbiBFTEY2NCBoZWFkZXJzIG9uIDMyIGJpdCBzeXN0ZW1zLiBTbyBjcmVhdGluZyBFTEYzMgotCSAgICBoZWFkZXJzIGNhbiBjb21lIGhhbmR5IGZvciB1c2VycyB3aG8gaGF2ZSBnb3Qgbm9uLVBBRSBzeXN0ZW1zIGFuZAotCSAgICBoZW5jZSBoYXZlIG1lbW9yeSBsZXNzIHRoYW4gNEdCLgotICAgICAgIGlpaSkgU3BlY2lmeSAiaXJxcG9sbCIgYXMgY29tbWFuZCBsaW5lIHBhcmFtZXRlci4gVGhpcyByZWR1Y2VzIGRyaXZlcgotICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gZmFpbHVyZXMgaW4gc2Vjb25kIGtlcm5lbCBkdWUgdG8gc2hhcmVkIGludGVycnVwdHMuCi0gICAgICAgIGl2KSA8cm9vdC1kZXY+IG5lZWRzIHRvIGJlIHNwZWNpZmllZCBpbiBhIGZvcm1hdCBjb3JyZXNwb25kaW5nIHRvCi0gICAgICAgICAgICB0aGUgcm9vdCBkZXZpY2UgbmFtZSBpbiB0aGUgb3V0cHV0IG9mIG1vdW50IGNvbW1hbmQuCi0gICAgICAgICB2KSBJZiB5b3UgaGF2ZSBidWlsdCB0aGUgZHJpdmVycyByZXF1aXJlZCB0byBtb3VudCByb290IGZpbGUKLSAgICAgICAgICAgIHN5c3RlbSBhcyBtb2R1bGVzIGluIDxzZWNvbmQta2VybmVsPiwgdGhlbiwgc3BlY2lmeQotICAgICAgICAgICAgLS1pbml0cmQ9PGluaXRyZC1mb3Itc2Vjb25kLWtlcm5lbD4uCisgICBOb3RlczoKKyAgID09PT09PQorICAgICBpKSA8c2Vjb25kLWtlcm5lbD4gaGFzIHRvIGJlIGEgdm1saW51eCBpbWFnZSBpZSB1bmNvbXByZXNzZWQgZWxmIGltYWdlLgorICAgICAgICBiekltYWdlIHdpbGwgbm90IHdvcmssIGFzIG9mIG5vdy4KKyAgICBpaSkgLS1hcmdzLWxpbnV4IGhhcyB0byBiZSBzcGVpY2ZpZWQgYXMgaWYga2V4ZWMgaXQgbG9hZGluZyBhbiBlbGYgaW1hZ2UsCisgICAgICAgIGl0IG5lZWRzIHRvIGtub3cgdGhhdCB0aGUgYXJndW1lbnRzIHN1cHBsaWVkIGFyZSBvZiBsaW51eCB0eXBlLgorICAgaWlpKSBCeSBkZWZhdWx0IEVMRiBoZWFkZXJzIGFyZSBzdG9yZWQgaW4gRUxGNjQgZm9ybWF0IHRvIHN1cHBvcnQgc3lzdGVtcworICAgICAgICB3aXRoIG1vcmUgdGhhbiA0R0IgbWVtb3J5LiBPcHRpb24gLS1lbGYzMi1jb3JlLWhlYWRlcnMgZm9yY2VzIGdlbmVyYXRpb24KKyAgICAgICAgb2YgRUxGMzIgaGVhZGVycy4gVGhlIHJlYXNvbiBmb3IgdGhpcyBvcHRpb24gYmVpbmcsIGFzIG9mIG5vdyBnZGIgY2FuCisgICAgICAgIG5vdCBvcGVuIHZtY29yZSBmaWxlIHdpdGggRUxGNjQgaGVhZGVycyBvbiBhIDMyIGJpdCBzeXN0ZW1zLiBTbyBFTEYzMgorICAgICAgICBoZWFkZXJzIGNhbiBiZSB1c2VkIGlmIG9uZSBoYXMgbm9uLVBBRSBzeXN0ZW1zIGFuZCBoZW5jZSBtZW1vcnkgbGVzcworICAgICAgICB0aGFuIDRHQi4KKyAgICBpdikgU3BlY2lmeSAiaXJxcG9sbCIgYXMgY29tbWFuZCBsaW5lIHBhcmFtZXRlci4gVGhpcyByZWR1Y2VzIGRyaXZlcgorICAgICAgICAgaW5pdGlhbGl6YXRpb24gZmFpbHVyZXMgaW4gc2Vjb25kIGtlcm5lbCBkdWUgdG8gc2hhcmVkIGludGVycnVwdHMuCisgICAgIHYpIDxyb290LWRldj4gbmVlZHMgdG8gYmUgc3BlY2lmaWVkIGluIGEgZm9ybWF0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJvb3QKKyAgICAgICAgZGV2aWNlIG5hbWUgaW4gdGhlIG91dHB1dCBvZiBtb3VudCBjb21tYW5kLgorICAgIHZpKSBJZiB5b3UgaGF2ZSBidWlsdCB0aGUgZHJpdmVycyByZXF1aXJlZCB0byBtb3VudCByb290IGZpbGUgc3lzdGVtIGFzCisgICAgICAgIG1vZHVsZXMgaW4gPHNlY29uZC1rZXJuZWw+LCB0aGVuLCBzcGVjaWZ5CisgICAgICAgIC0taW5pdHJkPTxpbml0cmQtZm9yLXNlY29uZC1rZXJuZWw+LgorICAgdmlpKSBTcGVjaWZ5IG1heGNwdXM9MSBhcywgaWYgZHVyaW5nIGZpcnN0IGtlcm5lbCBydW4sIGlmIHBhbmljIGhhcHBlbnMgb24KKyAgICAgICAgbm9uLWJvb3QgY3B1cywgc2Vjb25kIGtlcm5lbCBkb2Vzbid0IHNlZW0gdG8gYmUgYm9vdCB1cCBhbGwgdGhlIGNwdXMuCisgICAgICAgIFRoZSBvdGhlciBvcHRpb24gaXMgdG8gYWx3YXlzIGJ1aWx0IHRoZSBzZWNvbmQga2VybmVsIHdpdGhvdXQgU01QCisgICAgICAgIHN1cHBvcnQgaWUgQ09ORklHX1NNUD1uCiAKLTUpIFN5c3RlbSByZWJvb3RzIGludG8gdGhlIHNlY29uZCBrZXJuZWwgd2hlbiBhIHBhbmljIG9jY3Vycy4gQSBtb2R1bGUgY2FuIGJlCi0gICB3cml0dGVuIHRvIGZvcmNlIHRoZSBwYW5pYyBvciAiQUxULVN5c1JxLWMiIGNhbiBiZSB1c2VkIGluaXRpYXRlIGEgY3Jhc2gKLSAgIGR1bXAgZm9yIHRlc3RpbmcgcHVycG9zZXMuCis0KSBBZnRlciBzdWNjZXNzZnVsbHkgbG9hZGluZyB0aGUgc2Vjb25kIGtlcm5lbCBhcyBhYm92ZSwgaWYgYSBwYW5pYyBvY2N1cnMKKyAgIHN5c3RlbSByZWJvb3RzIGludG8gdGhlIHNlY29uZCBrZXJuZWwuIEEgbW9kdWxlIGNhbiBiZSB3cml0dGVuIHRvIGZvcmNlCisgICB0aGUgcGFuaWMgb3IgIkFMVC1TeXNScS1jIiBjYW4gYmUgdXNlZCBpbml0aWF0ZSBhIGNyYXNoIGR1bXAgZm9yIHRlc3RpbmcKKyAgIHB1cnBvc2VzLgogCi02KSBXcml0ZSBvdXQgdGhlIGR1bXAgZmlsZSB1c2luZworNSkgT25jZSB0aGUgc2Vjb25kIGtlcm5lbCBoYXMgYm9vdGVkLCB3cml0ZSBvdXQgdGhlIGR1bXAgZmlsZSB1c2luZwogCiAgICBjcCAvcHJvYy92bWNvcmUgPGR1bXAtZmlsZT4KIApAQCAtMTE5LDkgKzEyNCw5IEBACiAKICAgIEVudGlyZSBtZW1vcnk6ICBkZCBpZj0vZGV2L29sZG1lbSBvZj1vbGRtZW0uMDAxCiAKKwogQU5BTFlTSVMKID09PT09PT09Ci0KIExpbWl0ZWQgYW5hbHlzaXMgY2FuIGJlIGRvbmUgdXNpbmcgZ2RiIG9uIHRoZSBkdW1wIGZpbGUgY29waWVkIG91dCBvZgogL3Byb2Mvdm1jb3JlLiBVc2Ugdm1saW51eCBidWlsdCB3aXRoIC1nIGFuZCBydW4KIApAQCAtMTMyLDE1ICsxMzcsMTkgQEAKIAogTm90ZTogZ2RiIGNhbm5vdCBhbmFseXNlIGNvcmUgZmlsZXMgZ2VuZXJhdGVkIGluIEVMRjY0IGZvcm1hdCBmb3IgaTM4Ni4KIAorTGF0ZXN0ICJjcmFzaCIgKGNyYXNoLTQuMC0yLjE4KSBhcyBhdmFpbGFibGUgb24gRGF2ZSBBbmRlcnNvbidzIHNpdGUKK2h0dHA6Ly9wZW9wbGUucmVkaGF0LmNvbS9+YW5kZXJzb24vIHdvcmtzIHdlbGwgd2l0aCBrZHVtcCBmb3JtYXQuCisKKwogVE9ETwogPT09PQotCiAxKSBQcm92aWRlIGEga2VybmVsIHBhZ2VzIGZpbHRlcmluZyBtZWNoYW5pc20gc28gdGhhdCBjb3JlIGZpbGUgc2l6ZSBpcyBub3QKICAgIGluc2FuZSBvbiBzeXN0ZW1zIGhhdmluZyBodWdlIG1lbW9yeSBiYW5rcy4KLTIpIE1vZGlmeSAiY3Jhc2giIHRvb2wgdG8gbWFrZSBpdCByZWNvZ25pemUgdGhpcyBkdW1wLgorMikgUmVsb2NhdGFibGUga2VybmVsIGNhbiBoZWxwIGluIG1haW50YWluaW5nIG11bHRpcGxlIGtlcm5lbHMgZm9yIGNyYXNoZHVtcAorICAgYW5kIHNhbWUga2VybmVsIGFzIHRoZSBmaXJzdCBrZXJuZWwgY2FuIGJlIHVzZWQgdG8gY2FwdHVyZSB0aGUgZHVtcC4KKwogCiBDT05UQUNUCiA9PT09PT09Ci0KIFZpdmVrIEdveWFsICh2Z295YWxAaW4uaWJtLmNvbSkKIE1hbmVlc2ggU29uaSAobWFuZWVzaEBpbi5pYm0uY29tKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCBhNDgyZmRlLi44NDM3MDM2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtNDUyLDYgKzQ1MiwxMSBAQAogCiAJZWF0YT0JCVtIVyxTQ1NJXQogCisJZWNfaW50cj0JW0hXLEFDUEldIEFDUEkgRW1iZWRkZWQgQ29udHJvbGxlciBpbnRlcnJ1cHQgbW9kZQorCQkJRm9ybWF0OiA8aW50PgorCQkJMDogcG9sbGluZyBtb2RlCisJCQlub24tMDogaW50ZXJydXB0IG1vZGUgKGRlZmF1bHQpCisKIAllZGE9CQlbSFcsUFMyXQogCiAJZWRiPQkJW0hXLFBTMl0KQEAgLTQ3MSwxNCArNDc2LDE1IEBACiAJCQlhcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2VsYW5mcmVxLmMuCiAKIAllbGV2YXRvcj0JW0lPU0NIRURdCi0JCQlGb3JtYXQ6IHsiYXMiIHwgImNmcSIgfCAiZGVhZGxpbmUiIHwgIm5vb3AifQorCQkJRm9ybWF0OiB7ImFudGljaXBhdG9yeSIgfCAiY2ZxIiB8ICJkZWFkbGluZSIgfCAibm9vcCJ9CiAJCQlTZWUgRG9jdW1lbnRhdGlvbi9ibG9jay9hcy1pb3NjaGVkLnR4dCBhbmQKIAkJCURvY3VtZW50YXRpb24vYmxvY2svZGVhZGxpbmUtaW9zY2hlZC50eHQgZm9yIGRldGFpbHMuCiAKLQllbGZjb3JlaGRyPQlbSUEtMzJdCisJZWxmY29yZWhkcj0JW0lBLTMyLCBYODZfNjRdCiAJCQlTcGVjaWZpZXMgcGh5c2ljYWwgYWRkcmVzcyBvZiBzdGFydCBvZiBrZXJuZWwgY29yZQotCQkJaW1hZ2UgZWxmIGhlYWRlci4KLQkJCVNlZSBEb2N1bWVudGF0aW9uL2tkdW1wLnR4dCBmb3IgZGV0YWlscy4KKwkJCWltYWdlIGVsZiBoZWFkZXIuIEdlbmVyYWxseSBrZXhlYyBsb2FkZXIgd2lsbAorCQkJcGFzcyB0aGlzIG9wdGlvbiB0byBjYXB0dXJlIGtlcm5lbC4KKwkJCVNlZSBEb2N1bWVudGF0aW9uL2tkdW1wL2tkdW1wLnR4dCBmb3IgZGV0YWlscy4KIAogCWVuZm9yY2luZwlbU0VMSU5VWF0gU2V0IGluaXRpYWwgZW5mb3JjaW5nIHN0YXR1cy4KIAkJCUZvcm1hdDogeyIwIiB8ICIxIn0KQEAgLTcxMSw5ICs3MTcsMTcgQEAKIAlsb2FkX3JhbWRpc2s9CVtSQU1dIExpc3Qgb2YgcmFtZGlza3MgdG8gbG9hZCBmcm9tIGZsb3BweQogCQkJU2VlIERvY3VtZW50YXRpb24vcmFtZGlzay50eHQuCiAKLQlsb2NrZC51ZHBwb3J0PQlbTkZTXQorCWxvY2tkLm5sbV9ncmFjZV9wZXJpb2Q9UCAgW05GU10gQXNzaWduIGdyYWNlIHBlcmlvZC4KKwkJCUZvcm1hdDogPGludGVnZXI+CiAKLQlsb2NrZC50Y3Bwb3J0PQlbTkZTXQorCWxvY2tkLm5sbV90Y3Bwb3J0PU4JW05GU10gQXNzaWduIFRDUCBwb3J0LgorCQkJRm9ybWF0OiA8aW50ZWdlcj4KKworCWxvY2tkLm5sbV90aW1lb3V0PVQJW05GU10gQXNzaWduIHRpbWVvdXQgdmFsdWUuCisJCQlGb3JtYXQ6IDxpbnRlZ2VyPgorCisJbG9ja2QubmxtX3VkcHBvcnQ9TQlbTkZTXSBBc3NpZ24gVURQIHBvcnQuCisJCQlGb3JtYXQ6IDxpbnRlZ2VyPgogCiAJbG9naWJtLmlycT0JW0hXLE1PVVNFXSBMb2dpdGVjaCBCdXMgTW91c2UgRHJpdmVyCiAJCQlGb3JtYXQ6IDxpcnE+CkBAIC04MzIsNyArODQ2LDcgQEAKIAltZW09bm9wZW50aXVtCVtCVUdTPUlBLTMyXSBEaXNhYmxlIHVzYWdlIG9mIDRNQiBwYWdlcyBmb3Iga2VybmVsCiAJCQltZW1vcnkuCiAKLQltZW1tYXA9ZXhhY3RtYXAJW0tOTCxJQS0zMl0gRW5hYmxlIHNldHRpbmcgb2YgYW4gZXhhY3QKKwltZW1tYXA9ZXhhY3RtYXAJW0tOTCxJQS0zMixYODZfNjRdIEVuYWJsZSBzZXR0aW5nIG9mIGFuIGV4YWN0CiAJCQlFODIwIG1lbW9yeSBtYXAsIGFzIHNwZWNpZmllZCBieSB0aGUgdXNlci4KIAkJCVN1Y2ggbWVtbWFwPWV4YWN0bWFwIGxpbmVzIGNhbiBiZSBjb25zdHJ1Y3RlZCBiYXNlZCBvbgogCQkJQklPUyBvdXRwdXQgb3Igb3RoZXIgcmVxdWlyZW1lbnRzLiBTZWUgdGhlIG1lbW1hcD1ubkBzcwpAQCAtODU1LDYgKzg2OSw0OSBAQAogCiAJbWdhPQkJW0hXLERSTV0KIAorCW1pZ3JhdGlvbl9jb3N0PQorCQkJW0tOTCxTTVBdIGRlYnVnOiBvdmVycmlkZSBzY2hlZHVsZXIgbWlncmF0aW9uIGNvc3RzCisJCQlGb3JtYXQ6IDxsZXZlbC0xLXVzZWNzPiw8bGV2ZWwtMi11c2Vjcz4sLi4uCisJCQlUaGlzIGRlYnVnZ2luZyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlCisJCQlkZWZhdWx0IHNjaGVkdWxlciBtaWdyYXRpb24gY29zdCBtYXRyaXguIFRoZSBudW1iZXJzCisJCQlhcmUgaW5kZXhlZCBieSAnQ1BVIGRvbWFpbiBkaXN0YW5jZScuCisJCQlFLmcuIG1pZ3JhdGlvbl9jb3N0PTEwMDAsMjAwMCwzMDAwIG9uIGFuIFNNVCBOVU1BCisJCQlib3ggd2lsbCBzZXQgdXAgYW4gaW50cmEtY29yZSBtaWdyYXRpb24gY29zdCBvZgorCQkJMSBtc2VjLCBhbiBpbnRlci1jb3JlIG1pZ3JhdGlvbiBjb3N0IG9mIDIgbXNlY3MsCisJCQlhbmQgYW4gaW50ZXItbm9kZSBtaWdyYXRpb24gY29zdCBvZiAzIG1zZWNzLgorCisJCQlXQVJOSU5HOiB1c2luZyB0aGUgd3JvbmcgdmFsdWVzIGhlcmUgY2FuIGJyZWFrCisJCQlzY2hlZHVsZXIgcGVyZm9ybWFuY2UsIHNvIGl0J3Mgb25seSBmb3Igc2NoZWR1bGVyCisJCQlkZXZlbG9wbWVudCBwdXJwb3Nlcywgbm90IHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzLgorCisJbWlncmF0aW9uX2RlYnVnPQorCQkJW0tOTCxTTVBdIG1pZ3JhdGlvbiBjb3N0IGF1dG8tZGV0ZWN0IHZlcmJvc2l0eQorCQkJRm9ybWF0PTwwfDF8Mj4KKwkJCUlmIGEgc3lzdGVtJ3MgbWlncmF0aW9uIG1hdHJpeCByZXBvcnRlZCBhdCBib290dXAKKwkJCXNlZW1zIGVycm9uZW91cyB0aGVuIHRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvCisJCQlpbmNyZWFzZSB2ZXJib3NpdHkgb2YgdGhlIGRldGVjdGlvbiBwcm9jZXNzLgorCQkJV2UgZGVmYXVsdCB0byAwIChubyBleHRyYSBtZXNzYWdlcyksIDEgd2lsbCBwcmludAorCQkJc29tZSBtb3JlIGluZm9ybWF0aW9uLCBhbmQgMiB3aWxsIGJlIHJlYWxseQorCQkJdmVyYm9zZSAocHJvYmFibHkgb25seSB1c2VmdWwgaWYgeW91IGFsc28gaGF2ZSBhCisJCQlzZXJpYWwgY29uc29sZSBhdHRhY2hlZCB0byB0aGUgc3lzdGVtKS4KKworCW1pZ3JhdGlvbl9mYWN0b3I9CisJCQlbS05MLFNNUF0gbXVsdGlwbHkvZGl2aWRlIG1pZ3JhdGlvbiBjb3N0cyBieSBhIGZhY3RvcgorCQkJRm9ybWF0PTxwZXJjZW50PgorCQkJVGhpcyBkZWJ1ZyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gcHJvcG9ydGlvbmFsbHkKKwkJCWluY3JlYXNlIG9yIGRlY3JlYXNlIHRoZSBhdXRvLWRldGVjdGVkIG1pZ3JhdGlvbgorCQkJY29zdHMgZm9yIGFsbCBlbnRyaWVzIG9mIHRoZSBtaWdyYXRpb24gbWF0cml4LgorCQkJRS5nLiBtaWdyYXRpb25fZmFjdG9yPTE1MCB3aWxsIGluY3JlYXNlIG1pZ3JhdGlvbgorCQkJY29zdHMgYnkgNTAlLiAoYW5kIHRodXMgdGhlIHNjaGVkdWxlciB3aWxsIGJlIGxlc3MKKwkJCWVhZ2VyIG1pZ3JhdGluZyBjYWNoZS1ob3QgdGFza3MpCisJCQltaWdyYXRpb25fZmFjdG9yPTgwIHdpbGwgZGVjcmVhc2UgbWlncmF0aW9uIGNvc3RzCisJCQlieSAyMCUuICh0aHVzIHRoZSBzY2hlZHVsZXIgd2lsbCBiZSBtb3JlIGVhZ2VyIHRvCisJCQltaWdyYXRlIHRhc2tzKQorCisJCQlXQVJOSU5HOiB1c2luZyB0aGUgd3JvbmcgdmFsdWVzIGhlcmUgY2FuIGJyZWFrCisJCQlzY2hlZHVsZXIgcGVyZm9ybWFuY2UsIHNvIGl0J3Mgb25seSBmb3Igc2NoZWR1bGVyCisJCQlkZXZlbG9wbWVudCBwdXJwb3Nlcywgbm90IHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzLgorCiAJbW91c2VkZXYudGFwX3RpbWU9CiAJCQlbTU9VU0VdIE1heGltdW0gdGltZSBiZXR3ZWVuIGZpbmdlciB0b3VjaGluZyBhbmQKIAkJCWxlYXZpbmcgdG91Y2hwYWQgc3VyZmFjZSBmb3IgdG91Y2ggdG8gYmUgY29uc2lkZXJlZApAQCAtOTk4LDYgKzEwNTUsOCBAQAogCiAJbm93YgkJW0FSTV0KIAorCW5yX3VhcnRzPQlbU0VSSUFMXSBtYXhpbXVtIG51bWJlciBvZiBVQVJUcyB0byBiZSByZWdpc3RlcmVkLgorCiAJb3BsMz0JCVtIVyxPU1NdCiAJCQlGb3JtYXQ6IDxpbz4KIApAQCAtMTE3Niw2ICsxMjM1LDEwIEBACiAJCQlMaW1pdCBwcm9jZXNzb3IgdG8gbWF4aW11bSBDLXN0YXRlCiAJCQltYXhfY3N0YXRlPTkgb3ZlcnJpZGVzIGFueSBETUkgYmxhY2tsaXN0IGxpbWl0LgogCisJcHJvY2Vzc29yLm5vY3N0CVtIVyxBQ1BJXQorCQkJSWdub3JlIHRoZSBfQ1NUIG1ldGhvZCB0byBkZXRlcm1pbmUgQy1zdGF0ZXMsCisJCQlpbnN0ZWFkIHVzaW5nIHRoZSBsZWdhY3kgRkFEVCBtZXRob2QKKwogCXByb21wdF9yYW1kaXNrPQlbUkFNXSBMaXN0IG9mIFJBTSBkaXNrcyB0byBwcm9tcHQgZm9yIGZsb3BweSBkaXNrCiAJCQliZWZvcmUgbG9hZGluZy4KIAkJCVNlZSBEb2N1bWVudGF0aW9uL3JhbWRpc2sudHh0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXlzLXJlcXVlc3Qta2V5LnR4dCBiL0RvY3VtZW50YXRpb24va2V5cy1yZXF1ZXN0LWtleS50eHQKaW5kZXggNWYyYjljNS4uMjI0ODhkNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXlzLXJlcXVlc3Qta2V5LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tleXMtcmVxdWVzdC1rZXkudHh0CkBAIC01NiwxMCArNTYsMTIgQEAKICAoNCkgcmVxdWVzdF9rZXkoKSB0aGVuIGZvcmtzIGFuZCBleGVjdXRlcyAvc2Jpbi9yZXF1ZXN0LWtleSB3aXRoIGEgbmV3IHNlc3Npb24KICAgICAga2V5cmluZyB0aGF0IGNvbnRhaW5zIGEgbGluayB0byBhdXRoIGtleSBWLgogCi0gKDUpIC9zYmluL3JlcXVlc3Qta2V5IGV4ZWNzIGFuIGFwcHJvcHJpYXRlIHByb2dyYW0gdG8gcGVyZm9ybSB0aGUgYWN0dWFsCisgKDUpIC9zYmluL3JlcXVlc3Qta2V5IGFzc3VtZXMgdGhlIGF1dGhvcml0eSBhc3NvY2lhdGVkIHdpdGgga2V5IFUuCisKKyAoNikgL3NiaW4vcmVxdWVzdC1rZXkgZXhlY3MgYW4gYXBwcm9wcmlhdGUgcHJvZ3JhbSB0byBwZXJmb3JtIHRoZSBhY3R1YWwKICAgICAgaW5zdGFudGlhdGlvbi4KIAotICg2KSBUaGUgcHJvZ3JhbSBtYXkgd2FudCB0byBhY2Nlc3MgYW5vdGhlciBrZXkgZnJvbSBBJ3MgY29udGV4dCAoc2F5IGEKKyAoNykgVGhlIHByb2dyYW0gbWF5IHdhbnQgdG8gYWNjZXNzIGFub3RoZXIga2V5IGZyb20gQSdzIGNvbnRleHQgKHNheSBhCiAgICAgIEtlcmJlcm9zIFRHVCBrZXkpLiBJdCBqdXN0IHJlcXVlc3RzIHRoZSBhcHByb3ByaWF0ZSBrZXksIGFuZCB0aGUga2V5cmluZwogICAgICBzZWFyY2ggbm90ZXMgdGhhdCB0aGUgc2Vzc2lvbiBrZXlyaW5nIGhhcyBhdXRoIGtleSBWIGluIGl0cyBib3R0b20gbGV2ZWwuCiAKQEAgLTY3LDE5ICs2OSwxOSBAQAogICAgICBVSUQsIEdJRCwgZ3JvdXBzIGFuZCBzZWN1cml0eSBpbmZvIG9mIHByb2Nlc3MgQSBhcyBpZiBpdCB3YXMgcHJvY2VzcyBBLAogICAgICBhbmQgY29tZSB1cCB3aXRoIGtleSBXLgogCi0gKDcpIFRoZSBwcm9ncmFtIHRoZW4gZG9lcyB3aGF0IGl0IG11c3QgdG8gZ2V0IHRoZSBkYXRhIHdpdGggd2hpY2ggdG8KKyAoOCkgVGhlIHByb2dyYW0gdGhlbiBkb2VzIHdoYXQgaXQgbXVzdCB0byBnZXQgdGhlIGRhdGEgd2l0aCB3aGljaCB0bwogICAgICBpbnN0YW50aWF0ZSBrZXkgVSwgdXNpbmcga2V5IFcgYXMgYSByZWZlcmVuY2UgKHBlcmhhcHMgaXQgY29udGFjdHMgYQogICAgICBLZXJiZXJvcyBzZXJ2ZXIgdXNpbmcgdGhlIFRHVCkgYW5kIHRoZW4gaW5zdGFudGlhdGVzIGtleSBVLgogCi0gKDgpIFVwb24gaW5zdGFudGlhdGluZyBrZXkgVSwgYXV0aCBrZXkgViBpcyBhdXRvbWF0aWNhbGx5IHJldm9rZWQgc28gdGhhdCBpdAorICg5KSBVcG9uIGluc3RhbnRpYXRpbmcga2V5IFUsIGF1dGgga2V5IFYgaXMgYXV0b21hdGljYWxseSByZXZva2VkIHNvIHRoYXQgaXQKICAgICAgbWF5IG5vdCBiZSB1c2VkIGFnYWluLgogCi0gKDkpIFRoZSBwcm9ncmFtIHRoZW4gZXhpdHMgMCBhbmQgcmVxdWVzdF9rZXkoKSBkZWxldGVzIGtleSBWIGFuZCByZXR1cm5zIGtleQorKDEwKSBUaGUgcHJvZ3JhbSB0aGVuIGV4aXRzIDAgYW5kIHJlcXVlc3Rfa2V5KCkgZGVsZXRlcyBrZXkgViBhbmQgcmV0dXJucyBrZXkKICAgICAgVSB0byB0aGUgY2FsbGVyLgogCi1UaGlzIGFsc28gZXh0ZW5kcyBmdXJ0aGVyLiBJZiBrZXkgVyAoc3RlcCA1IGFib3ZlKSBkaWRuJ3QgZXhpc3QsIGtleSBXIHdvdWxkIGJlCi1jcmVhdGVkIHVuaW5zdGFudGlhdGVkLCBhbm90aGVyIGF1dGgga2V5IChYKSB3b3VsZCBiZSBjcmVhdGVkIFthcyBwZXIgc3RlcCAzXQotYW5kIGFub3RoZXIgY29weSBvZiAvc2Jpbi9yZXF1ZXN0LWtleSBzcGF3bmVkIFthcyBwZXIgc3RlcCA0XTsgYnV0IHRoZSBjb250ZXh0CitUaGlzIGFsc28gZXh0ZW5kcyBmdXJ0aGVyLiBJZiBrZXkgVyAoc3RlcCA3IGFib3ZlKSBkaWRuJ3QgZXhpc3QsIGtleSBXIHdvdWxkIGJlCitjcmVhdGVkIHVuaW5zdGFudGlhdGVkLCBhbm90aGVyIGF1dGgga2V5IChYKSB3b3VsZCBiZSBjcmVhdGVkIChhcyBwZXIgc3RlcCAzKQorYW5kIGFub3RoZXIgY29weSBvZiAvc2Jpbi9yZXF1ZXN0LWtleSBzcGF3bmVkIChhcyBwZXIgc3RlcCA0KTsgYnV0IHRoZSBjb250ZXh0CiBzcGVjaWZpZWQgYnkgYXV0aCBrZXkgWCB3aWxsIHN0aWxsIGJlIHByb2Nlc3MgQSwgYXMgaXQgd2FzIGluIGF1dGgga2V5IFYuCiAKIFRoaXMgaXMgYmVjYXVzZSBwcm9jZXNzIEEncyBrZXlyaW5ncyBjYW4ndCBzaW1wbHkgYmUgYXR0YWNoZWQgdG8KQEAgLTEzOCw4ICsxNDAsOCBAQAogCiAgKDMpIFRoZSBwcm9jZXNzJ3Mgc2Vzc2lvbiBrZXlyaW5nIGlzIHNlYXJjaGVkLgogCi0gKDQpIElmIHRoZSBwcm9jZXNzIGhhcyBhIHJlcXVlc3Rfa2V5KCkgYXV0aG9yaXNhdGlvbiBrZXkgaW4gaXRzIHNlc3Npb24KLSAgICAga2V5cmluZyB0aGVuOgorICg0KSBJZiB0aGUgcHJvY2VzcyBoYXMgYXNzdW1lZCB0aGUgYXV0aG9yaXR5IGFzc29jaWF0ZWQgd2l0aCBhIHJlcXVlc3Rfa2V5KCkKKyAgICAgYXV0aG9yaXNhdGlvbiBrZXkgdGhlbjoKIAogICAgICAoYSkgSWYgZXh0YW50LCB0aGUgY2FsbGluZyBwcm9jZXNzJ3MgdGhyZWFkIGtleXJpbmcgaXMgc2VhcmNoZWQuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2V5cy50eHQgYi9Eb2N1bWVudGF0aW9uL2tleXMudHh0CmluZGV4IDYzMDRkYjUuLmFhYTAxYjAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2V5cy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXlzLnR4dApAQCAtMzA4LDYgKzMwOCw4IEBACiAJS0VZX1NQRUNfVVNFUl9LRVlSSU5HCQktNAlVSUQtc3BlY2lmaWMga2V5cmluZwogCUtFWV9TUEVDX1VTRVJfU0VTU0lPTl9LRVlSSU5HCS01CVVJRC1zZXNzaW9uIGtleXJpbmcKIAlLRVlfU1BFQ19HUk9VUF9LRVlSSU5HCQktNglHSUQtc3BlY2lmaWMga2V5cmluZworCUtFWV9TUEVDX1JFUUtFWV9BVVRIX0tFWQktNwlhc3N1bWVkIHJlcXVlc3Rfa2V5KCkKKwkJCQkJCSAgYXV0aG9yaXNhdGlvbiBrZXkKIAogCiBUaGUgbWFpbiBzeXNjYWxscyBhcmU6CkBAIC00OTgsNyArNTAwLDExIEBACiAgICAgIGtleXJpbmcgaXMgZnVsbCwgZXJyb3IgRU5GSUxFIHdpbGwgcmVzdWx0LgogCiAgICAgIFRoZSBsaW5rIHByb2NlZHVyZSBjaGVja3MgdGhlIG5lc3Rpbmcgb2YgdGhlIGtleXJpbmdzLCByZXR1cm5pbmcgRUxPT1AgaWYKLSAgICAgaXQgYXBwZWFycyB0byBkZWVwIG9yIEVERUFETEsgaWYgdGhlIGxpbmsgd291bGQgaW50cm9kdWNlIGEgY3ljbGUuCisgICAgIGl0IGFwcGVhcnMgdG9vIGRlZXAgb3IgRURFQURMSyBpZiB0aGUgbGluayB3b3VsZCBpbnRyb2R1Y2UgYSBjeWNsZS4KKworICAgICBBbnkgbGlua3Mgd2l0aGluIHRoZSBrZXlyaW5nIHRvIGtleXMgdGhhdCBtYXRjaCB0aGUgbmV3IGtleSBpbiB0ZXJtcyBvZgorICAgICB0eXBlIGFuZCBkZXNjcmlwdGlvbiB3aWxsIGJlIGRpc2NhcmRlZCBmcm9tIHRoZSBrZXlyaW5nIGFzIHRoZSBuZXcgb25lIGlzCisgICAgIGFkZGVkLgogCiAKICAoKikgVW5saW5rIGEga2V5IG9yIGtleXJpbmcgZnJvbSBhbm90aGVyIGtleXJpbmc6CkBAIC02MjgsNiArNjM0LDQxIEBACiAgICAgIHRoZXJlIGlzIG9uZSwgb3RoZXJ3aXNlIHRoZSB1c2VyIGRlZmF1bHQgc2Vzc2lvbiBrZXlyaW5nLgogCiAKKyAoKikgU2V0IHRoZSB0aW1lb3V0IG9uIGEga2V5LgorCisJbG9uZyBrZXljdGwoS0VZQ1RMX1NFVF9USU1FT1VULCBrZXlfc2VyaWFsX3Qga2V5LCB1bnNpZ25lZCB0aW1lb3V0KTsKKworICAgICBUaGlzIHNldHMgb3IgY2xlYXJzIHRoZSB0aW1lb3V0IG9uIGEga2V5LiBUaGUgdGltZW91dCBjYW4gYmUgMCB0byBjbGVhcgorICAgICB0aGUgdGltZW91dCBvciBhIG51bWJlciBvZiBzZWNvbmRzIHRvIHNldCB0aGUgZXhwaXJ5IHRpbWUgdGhhdCBmYXIgaW50bworICAgICB0aGUgZnV0dXJlLgorCisgICAgIFRoZSBwcm9jZXNzIG11c3QgaGF2ZSBhdHRyaWJ1dGUgbW9kaWZpY2F0aW9uIGFjY2VzcyBvbiBhIGtleSB0byBzZXQgaXRzCisgICAgIHRpbWVvdXQuIFRpbWVvdXRzIG1heSBub3QgYmUgc2V0IHdpdGggdGhpcyBmdW5jdGlvbiBvbiBuZWdhdGl2ZSwgcmV2b2tlZAorICAgICBvciBleHBpcmVkIGtleXMuCisKKworICgqKSBBc3N1bWUgdGhlIGF1dGhvcml0eSBncmFudGVkIHRvIGluc3RhbnRpYXRlIGEga2V5CisKKwlsb25nIGtleWN0bChLRVlDVExfQVNTVU1FX0FVVEhPUklUWSwga2V5X3NlcmlhbF90IGtleSk7CisKKyAgICAgVGhpcyBhc3N1bWVzIG9yIGRpdmVzdHMgdGhlIGF1dGhvcml0eSByZXF1aXJlZCB0byBpbnN0YW50aWF0ZSB0aGUKKyAgICAgc3BlY2lmaWVkIGtleS4gQXV0aG9yaXR5IGNhbiBvbmx5IGJlIGFzc3VtZWQgaWYgdGhlIHRocmVhZCBoYXMgdGhlCisgICAgIGF1dGhvcmlzYXRpb24ga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBpbiBpdHMga2V5cmluZ3MKKyAgICAgc29tZXdoZXJlLgorCisgICAgIE9uY2UgYXV0aG9yaXR5IGlzIGFzc3VtZWQsIHNlYXJjaGVzIGZvciBrZXlzIHdpbGwgYWxzbyBzZWFyY2ggdGhlCisgICAgIHJlcXVlc3RlcidzIGtleXJpbmdzIHVzaW5nIHRoZSByZXF1ZXN0ZXIncyBzZWN1cml0eSBsYWJlbCwgVUlELCBHSUQgYW5kCisgICAgIGdyb3Vwcy4KKworICAgICBJZiB0aGUgcmVxdWVzdGVkIGF1dGhvcml0eSBpcyB1bmF2YWlsYWJsZSwgZXJyb3IgRVBFUk0gd2lsbCBiZSByZXR1cm5lZCwKKyAgICAgbGlrZXdpc2UgaWYgdGhlIGF1dGhvcml0eSBoYXMgYmVlbiByZXZva2VkIGJlY2F1c2UgdGhlIHRhcmdldCBrZXkgaXMKKyAgICAgYWxyZWFkeSBpbnN0YW50aWF0ZWQuCisKKyAgICAgSWYgdGhlIHNwZWNpZmllZCBrZXkgaXMgMCwgdGhlbiBhbnkgYXNzdW1lZCBhdXRob3JpdHkgd2lsbCBiZSBkaXZlc3RlZC4KKworICAgICBUaGUgYXNzdW1lZCBhdXRob3JpdGl0aXZlIGtleSBpcyBpbmhlcml0ZWQgYWNyb3NzIGZvcmsgYW5kIGV4ZWMuCisKKwogPT09PT09PT09PT09PT09CiBLRVJORUwgU0VSVklDRVMKID09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rcHJvYmVzLnR4dCBiL0RvY3VtZW50YXRpb24va3Byb2Jlcy50eHQKaW5kZXggMDU0MWZlMS4uMGVhNWEwYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rcHJvYmVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2twcm9iZXMudHh0CkBAIC00MTEsNyArNDExLDggQEAKIAkJcHJpbnRrKCJDb3VsZG4ndCBmaW5kICVzIHRvIHBsYW50IGtwcm9iZVxuIiwgImRvX2ZvcmsiKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlpZiAoKHJldCA9IHJlZ2lzdGVyX2twcm9iZSgma3ApIDwgMCkpIHsKKwlyZXQgPSByZWdpc3Rlcl9rcHJvYmUoJmtwKTsKKwlpZiAocmV0IDwgMCkgewogCQlwcmludGsoInJlZ2lzdGVyX2twcm9iZSBmYWlsZWQsIHJldHVybmVkICVkXG4iLCByZXQpOwogCQlyZXR1cm4gLTE7CiAJfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9sYXB0b3AtbW9kZS50eHQgYi9Eb2N1bWVudGF0aW9uL2xhcHRvcC1tb2RlLnR4dAppbmRleCBkYzRlODEwLi5iMThlMjE2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2xhcHRvcC1tb2RlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2xhcHRvcC1tb2RlLnR4dApAQCAtMyw3ICszLDcgQEAKIAogRG9jdW1lbnQgQXV0aG9yOiBCYXJ0IFNhbXdlbCAoYmFydEBzYW13ZWwudGspCiBEYXRlIGNyZWF0ZWQ6IEphbnVhcnkgMiwgMjAwNAotTGFzdCBtb2RpZmllZDogSnVseSAxMCwgMjAwNAorTGFzdCBtb2RpZmllZDogRGVjZW1iZXIgMDYsIDIwMDQKIAogSW50cm9kdWN0aW9uCiAtLS0tLS0tLS0tLS0KQEAgLTMzLDcgKzMzLDcgQEAKIGxhcHRvcCBtb2RlIHdpbGwgYXV0b21hdGljYWxseSBiZSBzdGFydGVkIHdoZW4geW91J3JlIG9uIGJhdHRlcnkuIEZvcgogeW91ciBjb252ZW5pZW5jZSwgYSB0YXJiYWxsIGNvbnRhaW5pbmcgYW4gaW5zdGFsbGVyIGNhbiBiZSBkb3dubG9hZGVkIGF0OgogCi1odHRwOi8vd3d3LnhzNGFsbC5ubC9+YnNhbXdlbC9sYXB0b3BfbW9kZS90b29scworaHR0cDovL3d3dy54czRhbGwubmwvfmJzYW13ZWwvbGFwdG9wX21vZGUvdG9vbHMvCiAKIFRvIGNvbmZpZ3VyZSBsYXB0b3AgbW9kZSwgeW91IG5lZWQgdG8gZWRpdCB0aGUgY29uZmlndXJhdGlvbiBmaWxlLCB3aGljaCBpcwogbG9jYXRlZCBpbiAvZXRjL2RlZmF1bHQvbGFwdG9wLW1vZGUgb24gRGViaWFuLWJhc2VkIHN5c3RlbXMsIG9yIGluCkBAIC0zNTcsNyArMzU3LDcgQEAKICMgUmVhZC1haGVhZCwgaW4ga2lsb2J5dGVzCiBSRUFEQUhFQUQ9JHtSRUFEQUhFQUQ6LSc0MDk2J30KIAotIyBTaGFsbCB3ZSByZW1vdW50IGpvdXJuYWxlZCBmcy4gd2l0aCBhcHByb3BpYXRlIGNvbW1pdCBpbnRlcnZhbD8gKDE9eWVzKQorIyBTaGFsbCB3ZSByZW1vdW50IGpvdXJuYWxlZCBmcy4gd2l0aCBhcHByb3ByaWF0ZSBjb21taXQgaW50ZXJ2YWw/ICgxPXllcykKIERPX1JFTU9VTlRTPSR7RE9fUkVNT1VOVFM6LScxJ30KIAogIyBBbmQgc2hhbGwgd2UgYWRkIHRoZSAibm9hdGltZSIgb3B0aW9uIHRvIHRoYXQgYXMgd2VsbD8gKDE9eWVzKQpAQCAtOTEyLDcgKzkxMiw3IEBACiAgICAgZXhpdCgwKTsKIH0KIAotaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7CiAgICAgaW50IGZkOwogICAgIGNoYXIgKmRpc2sgPSAwOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9sb2Nrcy50eHQgYi9Eb2N1bWVudGF0aW9uL2xvY2tzLnR4dAppbmRleCBjZTFiZTc5Li5lM2I0MDJlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2xvY2tzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2xvY2tzLnR4dApAQCAtNjUsMjAgKzY1LDMgQEAKIG1hbmRhdG9yeSBsb2NraW5nIG9ubHkgYmUgZW5hYmxlZCBvbiBhIGxvY2FsIGZpbGVzeXN0ZW0gYXMgdGhlIHNwZWNpZmljIG5lZWQKIGFyaXNlcy4KIAotVW50aWwgYW4gdXBkYXRlZCB2ZXJzaW9uIG9mIG1vdW50KDgpIGJlY29tZXMgYXZhaWxhYmxlIHlvdSBtYXkgaGF2ZSB0byBhcHBseQotdGhpcyBwYXRjaCB0byB0aGUgbW91bnQgc291cmNlcyAoYmFzZWQgb24gdGhlIHZlcnNpb24gZGlzdHJpYnV0ZWQgd2l0aCBSaWNrCi1GYWl0aCdzIHV0aWwtbGludXgtMi41IHBhY2thZ2UpOgotCi0qKiogbW91bnQuYy5vcmlnCVNhdCBKdW4gIDggMDk6MTQ6MzEgMTk5NgotLS0tIG1vdW50LmMJU2F0IEp1biAgOCAwOToxMzowMiAxOTk2Ci0qKioqKioqKioqKioqKioKLSoqKiAxMDAsMTA1ICoqKioKLS0tLSAxMDAsMTA3IC0tLS0KLSAgICB7ICJub2F1dG8iLAkwLCBNU19OT0FVVE8JfSwJLyogQ2FuICBvbmx5IGJlIG1vdW50ZWQgZXhwbGljaXRseSAqLwotICAgIHsgInVzZXIiLAkwLCBNU19VU0VSCX0sCS8qIEFsbG93IG9yZGluYXJ5IHVzZXIgdG8gbW91bnQgKi8KLSAgICB7ICJub3VzZXIiLAkxLCBNU19VU0VSCX0sCS8qIEZvcmJpZCBvcmRpbmFyeSB1c2VyIHRvIG1vdW50ICovCi0rICAgeyAibWFuZCIsCTAsIE1TX01BTkRMT0NLCX0sCS8qIEFsbG93IG1hbmRhdG9yeSBsb2NrcyBvbiB0aGlzIEZTICovCi0rICAgeyAibm9tYW5kIiwJMSwgTVNfTUFORExPQ0sJfSwJLyogRm9yYmlkIG1hbmRhdG9yeSBsb2NrcyBvbiB0aGlzIEZTICovCi0gICAgLyogYWRkIG5ldyBvcHRpb25zIGhlcmUgKi8KLSAgI2lmZGVmIE1TX05PU1VCCi0gICAgeyAic3ViIiwJMSwgTVNfTk9TVUIJfSwJLyogYWxsb3cgc3VibW91bnRzICovCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL211dGV4LWRlc2lnbi50eHQgYi9Eb2N1bWVudGF0aW9uL211dGV4LWRlc2lnbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JmNzk4OAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbXV0ZXgtZGVzaWduLnR4dApAQCAtMCwwICsxLDEzNSBAQAorR2VuZXJpYyBNdXRleCBTdWJzeXN0ZW0KKworc3RhcnRlZCBieSBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KKworICAiV2h5IG9uIGVhcnRoIGRvIHdlIG5lZWQgYSBuZXcgbXV0ZXggc3Vic3lzdGVtLCBhbmQgd2hhdCdzIHdyb25nCisgICB3aXRoIHNlbWFwaG9yZXM/IgorCitmaXJzdGx5LCB0aGVyZSdzIG5vdGhpbmcgd3Jvbmcgd2l0aCBzZW1hcGhvcmVzLiBCdXQgaWYgdGhlIHNpbXBsZXIKK211dGV4IHNlbWFudGljcyBhcmUgc3VmZmljaWVudCBmb3IgeW91ciBjb2RlLCB0aGVuIHRoZXJlIGFyZSBhIGNvdXBsZQorb2YgYWR2YW50YWdlcyBvZiBtdXRleGVzOgorCisgLSAnc3RydWN0IG11dGV4JyBpcyBzbWFsbGVyIG9uIG1vc3QgYXJjaGl0ZWN0dXJlczogLmUuZyBvbiB4ODYsCisgICAnc3RydWN0IHNlbWFwaG9yZScgaXMgMjAgYnl0ZXMsICdzdHJ1Y3QgbXV0ZXgnIGlzIDE2IGJ5dGVzLgorICAgQSBzbWFsbGVyIHN0cnVjdHVyZSBzaXplIG1lYW5zIGxlc3MgUkFNIGZvb3RwcmludCwgYW5kIGJldHRlcgorICAgQ1BVLWNhY2hlIHV0aWxpemF0aW9uLgorCisgLSB0aWdodGVyIGNvZGUuIE9uIHg4NiBpIGdldCB0aGUgZm9sbG93aW5nIC50ZXh0IHNpemVzIHdoZW4KKyAgIHN3aXRjaGluZyBhbGwgbXV0ZXgtYWxpa2Ugc2VtYXBob3JlcyBpbiB0aGUga2VybmVsIHRvIHRoZSBtdXRleAorICAgc3Vic3lzdGVtOgorCisgICAgICAgIHRleHQgICAgZGF0YSAgICAgYnNzICAgICBkZWMgICAgIGhleCBmaWxlbmFtZQorICAgICAzMjgwMzgwICA4NjgxODggIDM5Njg2MCA0NTQ1NDI4ICA0NTViOTQgdm1saW51eC1zZW1hcGhvcmUKKyAgICAgMzI1NTMyOSAgODY1Mjk2ICAzOTY3MzIgNDUxNzM1NyAgNDRlZGVkIHZtbGludXgtbXV0ZXgKKworICAgdGhhdCdzIDI1MDUxIGJ5dGVzIG9mIGNvZGUgc2F2ZWQsIG9yIGEgMC43NiUgd2luIC0gb2ZmIHRoZSBob3R0ZXN0CisgICBjb2RlcGF0aHMgb2YgdGhlIGtlcm5lbC4gKFRoZSAuZGF0YSBzYXZpbmdzIGFyZSAyODkyIGJ5dGVzLCBvciAwLjMzJSkKKyAgIFNtYWxsZXIgY29kZSBtZWFucyBiZXR0ZXIgaWNhY2hlIGZvb3RwcmludCwgd2hpY2ggaXMgb25lIG9mIHRoZQorICAgbWFqb3Igb3B0aW1pemF0aW9uIGdvYWxzIGluIHRoZSBMaW51eCBrZXJuZWwgY3VycmVudGx5LgorCisgLSB0aGUgbXV0ZXggc3Vic3lzdGVtIGlzIHNsaWdodGx5IGZhc3RlciBhbmQgaGFzIGJldHRlciBzY2FsYWJpbGl0eSBmb3IKKyAgIGNvbnRlbmRlZCB3b3JrbG9hZHMuIE9uIGFuIDgtd2F5IHg4NiBzeXN0ZW0sIHJ1bm5pbmcgYSBtdXRleC1iYXNlZAorICAga2VybmVsIGFuZCB0ZXN0aW5nIGNyZWF0K3VubGluaytjbG9zZSAob2Ygc2VwYXJhdGUsIHBlci10YXNrIGZpbGVzKQorICAgaW4gL3RtcCB3aXRoIDE2IHBhcmFsbGVsIHRhc2tzLCB0aGUgYXZlcmFnZSBudW1iZXIgb2Ygb3BzL3NlYyBpczoKKworICAgIFNlbWFwaG9yZXM6ICAgICAgICAgICAgICAgICAgICAgICAgTXV0ZXhlczoKKworICAgICQgLi90ZXN0LW11dGV4IFYgMTYgMTAgICAgICAgICAgICAgJCAuL3Rlc3QtbXV0ZXggViAxNiAxMAorICAgIDggQ1BVcywgcnVubmluZyAxNiB0YXNrcy4gICAgICAgICAgOCBDUFVzLCBydW5uaW5nIDE2IHRhc2tzLgorICAgIGNoZWNraW5nIFZGUyBwZXJmb3JtYW5jZS4gICAgICAgICAgY2hlY2tpbmcgVkZTIHBlcmZvcm1hbmNlLgorICAgIGF2ZyBsb29wcy9zZWM6ICAgICAgMzQ3MTMgICAgICAgICAgYXZnIGxvb3BzL3NlYzogICAgICA4NDE1MworICAgIENQVSB1dGlsaXphdGlvbjogICAgNjMlICAgICAgICAgICAgQ1BVIHV0aWxpemF0aW9uOiAgICAyMiUKKworICAgaS5lLiBpbiB0aGlzIHdvcmtsb2FkLCB0aGUgbXV0ZXggYmFzZWQga2VybmVsIHdhcyAyLjQgdGltZXMgZmFzdGVyCisgICB0aGFuIHRoZSBzZW1hcGhvcmUgYmFzZWQga2VybmVsLCBfYW5kXyBpdCBhbHNvIGhhZCAyLjggdGltZXMgbGVzcyBDUFUKKyAgIHV0aWxpemF0aW9uLiAoSW4gdGVybXMgb2YgJ29wcyBwZXIgQ1BVIGN5Y2xlJywgdGhlIHNlbWFwaG9yZSBrZXJuZWwKKyAgIHBlcmZvcm1lZCA1NTEgb3BzL3NlYyBwZXIgMSUgb2YgQ1BVIHRpbWUgdXNlZCwgd2hpbGUgdGhlIG11dGV4IGtlcm5lbAorICAgcGVyZm9ybWVkIDM4MjUgb3BzL3NlYyBwZXIgMSUgb2YgQ1BVIHRpbWUgdXNlZCAtIGl0IHdhcyA2LjkgdGltZXMKKyAgIG1vcmUgZWZmaWNpZW50LikKKworICAgdGhlIHNjYWxhYmlsaXR5IGRpZmZlcmVuY2UgaXMgdmlzaWJsZSBldmVuIG9uIGEgMi13YXkgUDQgSFQgYm94OgorCisgICAgU2VtYXBob3JlczogICAgICAgICAgICAgICAgICAgICAgICBNdXRleGVzOgorCisgICAgJCAuL3Rlc3QtbXV0ZXggViAxNiAxMCAgICAgICAgICAgICAkIC4vdGVzdC1tdXRleCBWIDE2IDEwCisgICAgNCBDUFVzLCBydW5uaW5nIDE2IHRhc2tzLiAgICAgICAgICA4IENQVXMsIHJ1bm5pbmcgMTYgdGFza3MuCisgICAgY2hlY2tpbmcgVkZTIHBlcmZvcm1hbmNlLiAgICAgICAgICBjaGVja2luZyBWRlMgcGVyZm9ybWFuY2UuCisgICAgYXZnIGxvb3BzL3NlYzogICAgICAxMjc2NTkgICAgICAgICBhdmcgbG9vcHMvc2VjOiAgICAgIDE4MTA4MgorICAgIENQVSB1dGlsaXphdGlvbjogICAgMTAwJSAgICAgICAgICAgQ1BVIHV0aWxpemF0aW9uOiAgICAzNCUKKworICAgKHRoZSBzdHJhaWdodCBwZXJmb3JtYW5jZSBhZHZhbnRhZ2Ugb2YgbXV0ZXhlcyBpcyA0MSUsIHRoZSBwZXItY3ljbGUKKyAgICBlZmZpY2llbmN5IG9mIG11dGV4ZXMgaXMgNC4xIHRpbWVzIGJldHRlci4pCisKKyAtIHRoZXJlIGFyZSBubyBmYXN0cGF0aCB0cmFkZW9mZnMsIHRoZSBtdXRleCBmYXN0cGF0aCBpcyBqdXN0IGFzIHRpZ2h0CisgICBhcyB0aGUgc2VtYXBob3JlIGZhc3RwYXRoLiBPbiB4ODYsIHRoZSBsb2NraW5nIGZhc3RwYXRoIGlzIDIKKyAgIGluc3RydWN0aW9uczoKKworICAgIGMwMzc3Y2NiIDxtdXRleF9sb2NrPjoKKyAgICBjMDM3N2NjYjogICAgICAgZjAgZmYgMDggICAgICAgICAgICAgICAgbG9jayBkZWNsICglZWF4KQorICAgIGMwMzc3Y2NlOiAgICAgICA3OCAwZSAgICAgICAgICAgICAgICAgICBqcyAgICAgYzAzNzdjZGUgPC50ZXh0LmxvY2subXV0ZXg+CisgICAgYzAzNzdjZDA6ICAgICAgIGMzICAgICAgICAgICAgICAgICAgICAgIHJldAorCisgICB0aGUgdW5sb2NraW5nIGZhc3RwYXRoIGlzIGVxdWFsbHkgdGlnaHQ6CisKKyAgICBjMDM3N2NkMSA8bXV0ZXhfdW5sb2NrPjoKKyAgICBjMDM3N2NkMTogICAgICAgZjAgZmYgMDAgICAgICAgICAgICAgICAgbG9jayBpbmNsICglZWF4KQorICAgIGMwMzc3Y2Q0OiAgICAgICA3ZSAwZiAgICAgICAgICAgICAgICAgICBqbGUgICAgYzAzNzdjZTUgPC50ZXh0LmxvY2subXV0ZXgrMHg3PgorICAgIGMwMzc3Y2Q2OiAgICAgICBjMyAgICAgICAgICAgICAgICAgICAgICByZXQKKworIC0gJ3N0cnVjdCBtdXRleCcgc2VtYW50aWNzIGFyZSB3ZWxsLWRlZmluZWQgYW5kIGFyZSBlbmZvcmNlZCBpZgorICAgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgdHVybmVkIG9uLiBTZW1hcGhvcmVzIG9uIHRoZSBvdGhlciBoYW5kIGhhdmUKKyAgIHZpcnR1YWxseSBubyBkZWJ1Z2dpbmcgY29kZSBvciBpbnN0cnVtZW50YXRpb24uIFRoZSBtdXRleCBzdWJzeXN0ZW0KKyAgIGNoZWNrcyBhbmQgZW5mb3JjZXMgdGhlIGZvbGxvd2luZyBydWxlczoKKworICAgKiAtIG9ubHkgb25lIHRhc2sgY2FuIGhvbGQgdGhlIG11dGV4IGF0IGEgdGltZQorICAgKiAtIG9ubHkgdGhlIG93bmVyIGNhbiB1bmxvY2sgdGhlIG11dGV4CisgICAqIC0gbXVsdGlwbGUgdW5sb2NrcyBhcmUgbm90IHBlcm1pdHRlZAorICAgKiAtIHJlY3Vyc2l2ZSBsb2NraW5nIGlzIG5vdCBwZXJtaXR0ZWQKKyAgICogLSBhIG11dGV4IG9iamVjdCBtdXN0IGJlIGluaXRpYWxpemVkIHZpYSB0aGUgQVBJCisgICAqIC0gYSBtdXRleCBvYmplY3QgbXVzdCBub3QgYmUgaW5pdGlhbGl6ZWQgdmlhIG1lbXNldCBvciBjb3B5aW5nCisgICAqIC0gdGFzayBtYXkgbm90IGV4aXQgd2l0aCBtdXRleCBoZWxkCisgICAqIC0gbWVtb3J5IGFyZWFzIHdoZXJlIGhlbGQgbG9ja3MgcmVzaWRlIG11c3Qgbm90IGJlIGZyZWVkCisgICAqIC0gaGVsZCBtdXRleGVzIG11c3Qgbm90IGJlIHJlaW5pdGlhbGl6ZWQKKyAgICogLSBtdXRleGVzIG1heSBub3QgYmUgdXNlZCBpbiBpcnEgY29udGV4dHMKKworICAgZnVydGhlcm1vcmUsIHRoZXJlIGFyZSBhbHNvIGNvbnZlbmllbmNlIGZlYXR1cmVzIGluIHRoZSBkZWJ1Z2dpbmcKKyAgIGNvZGU6CisKKyAgICogLSB1c2VzIHN5bWJvbGljIG5hbWVzIG9mIG11dGV4ZXMsIHdoZW5ldmVyIHRoZXkgYXJlIHByaW50ZWQgaW4gZGVidWcgb3V0cHV0CisgICAqIC0gcG9pbnQtb2YtYWNxdWlyZSB0cmFja2luZywgc3ltYm9saWMgbG9va3VwIG9mIGZ1bmN0aW9uIG5hbWVzCisgICAqIC0gbGlzdCBvZiBhbGwgbG9ja3MgaGVsZCBpbiB0aGUgc3lzdGVtLCBwcmludG91dCBvZiB0aGVtCisgICAqIC0gb3duZXIgdHJhY2tpbmcKKyAgICogLSBkZXRlY3RzIHNlbGYtcmVjdXJzaW5nIGxvY2tzIGFuZCBwcmludHMgb3V0IGFsbCByZWxldmFudCBpbmZvCisgICAqIC0gZGV0ZWN0cyBtdWx0aS10YXNrIGNpcmN1bGFyIGRlYWRsb2NrcyBhbmQgcHJpbnRzIG91dCBhbGwgYWZmZWN0ZWQKKyAgICogICBsb2NrcyBhbmQgdGFza3MgKGFuZCBvbmx5IHRob3NlIHRhc2tzKQorCitEaXNhZHZhbnRhZ2VzCistLS0tLS0tLS0tLS0tCisKK1RoZSBzdHJpY3RlciBtdXRleCBBUEkgbWVhbnMgeW91IGNhbm5vdCB1c2UgbXV0ZXhlcyB0aGUgc2FtZSB3YXkgeW91CitjYW4gdXNlIHNlbWFwaG9yZXM6IGUuZy4gdGhleSBjYW5ub3QgYmUgdXNlZCBmcm9tIGFuIGludGVycnVwdCBjb250ZXh0LAorbm9yIGNhbiB0aGV5IGJlIHVubG9ja2VkIGZyb20gYSBkaWZmZXJlbnQgY29udGV4dCB0aGF0IHdoaWNoIGFjcXVpcmVkCitpdC4gWyBJJ20gbm90IGF3YXJlIG9mIGFueSBvdGhlciAoZS5nLiBwZXJmb3JtYW5jZSkgZGlzYWR2YW50YWdlcyBmcm9tCit1c2luZyBtdXRleGVzIGF0IHRoZSBtb21lbnQsIHBsZWFzZSBsZXQgbWUga25vdyBpZiB5b3UgZmluZCBhbnkuIF0KKworSW1wbGVtZW50YXRpb24gb2YgbXV0ZXhlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisnc3RydWN0IG11dGV4JyBpcyB0aGUgbmV3IG11dGV4IHR5cGUsIGRlZmluZWQgaW4gaW5jbHVkZS9saW51eC9tdXRleC5oCithbmQgaW1wbGVtZW50ZWQgaW4ga2VybmVsL211dGV4LmMuIEl0IGlzIGEgY291bnRlci1iYXNlZCBtdXRleCB3aXRoIGEKK3NwaW5sb2NrIGFuZCBhIHdhaXQtbGlzdC4gVGhlIGNvdW50ZXIgaGFzIDMgc3RhdGVzOiAxIGZvciAidW5sb2NrZWQiLAorMCBmb3IgImxvY2tlZCIgYW5kIG5lZ2F0aXZlIG51bWJlcnMgKHVzdWFsbHkgLTEpIGZvciAibG9ja2VkLCBwb3RlbnRpYWwKK3dhaXRlcnMgcXVldWVkIi4KKwordGhlIEFQSXMgb2YgJ3N0cnVjdCBtdXRleCcgaGF2ZSBiZWVuIHN0cmVhbWxpbmVkOgorCisgREVGSU5FX01VVEVYKG5hbWUpOworCisgbXV0ZXhfaW5pdChtdXRleCk7CisKKyB2b2lkIG11dGV4X2xvY2soc3RydWN0IG11dGV4ICpsb2NrKTsKKyBpbnQgIG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZShzdHJ1Y3QgbXV0ZXggKmxvY2spOworIGludCAgbXV0ZXhfdHJ5bG9jayhzdHJ1Y3QgbXV0ZXggKmxvY2spOworIHZvaWQgbXV0ZXhfdW5sb2NrKHN0cnVjdCBtdXRleCAqbG9jayk7CisgaW50ICBtdXRleF9pc19sb2NrZWQoc3RydWN0IG11dGV4ICpsb2NrKTsKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JvbmRpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JvbmRpbmcudHh0CmluZGV4IGIwZmU0MWQuLjhkOGI0ZTUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9ib25kaW5nLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYm9uZGluZy50eHQKQEAgLTk0NSw3ICs5NDUsNiBAQAogICAgICAgICAgIGNvbGxpc2lvbnM6MCB0eHF1ZXVlbGVuOjAKIAogZXRoMCAgICAgIExpbmsgZW5jYXA6RXRoZXJuZXQgIEhXYWRkciAwMDpDMDpGMDoxRjozNzpCNAotICAgICAgICAgIGluZXQgYWRkcjpYWFguWFhYLlhYWC5ZWVkgIEJjYXN0OlhYWC5YWFguWFhYLjI1NSAgTWFzazoyNTUuMjU1LjI1Mi4wCiAgICAgICAgICAgVVAgQlJPQURDQVNUIFJVTk5JTkcgU0xBVkUgTVVMVElDQVNUICBNVFU6MTUwMCAgTWV0cmljOjEKICAgICAgICAgICBSWCBwYWNrZXRzOjM1NzMwMjUgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5zOjAgZnJhbWU6MAogICAgICAgICAgIFRYIHBhY2tldHM6MTY0MzE2NyBlcnJvcnM6MSBkcm9wcGVkOjAgb3ZlcnJ1bnM6MSBjYXJyaWVyOjAKQEAgLTk1Myw3ICs5NTIsNiBAQAogICAgICAgICAgIEludGVycnVwdDoxMCBCYXNlIGFkZHJlc3M6MHgxMDgwCiAKIGV0aDEgICAgICBMaW5rIGVuY2FwOkV0aGVybmV0ICBIV2FkZHIgMDA6QzA6RjA6MUY6Mzc6QjQKLSAgICAgICAgICBpbmV0IGFkZHI6WFhYLlhYWC5YWFguWVlZICBCY2FzdDpYWFguWFhYLlhYWC4yNTUgIE1hc2s6MjU1LjI1NS4yNTIuMAogICAgICAgICAgIFVQIEJST0FEQ0FTVCBSVU5OSU5HIFNMQVZFIE1VTFRJQ0FTVCAgTVRVOjE1MDAgIE1ldHJpYzoxCiAgICAgICAgICAgUlggcGFja2V0czozNjUxNzY5IGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGZyYW1lOjAKICAgICAgICAgICBUWCBwYWNrZXRzOjE2NDM0ODAgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5zOjAgY2FycmllcjowCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc2s5OGxpbi50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc2s5OGxpbi50eHQKaW5kZXggODUxZmM5Ny4uNzgzN2M1MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3NrOThsaW4udHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9zazk4bGluLnR4dApAQCAtOTEsNyArOTEsNyBAQAogICAgd2l0aCAoTSkKIDUuIEV4ZWN1dGUgdGhlIGNvbW1hbmQgIm1ha2UgbW9kdWxlcyIuCiA2LiBFeGVjdXRlIHRoZSBjb21tYW5kICJtYWtlIG1vZHVsZXNfaW5zdGFsbCIuCi0gICBUaGUgYXBwcm9waWF0ZSBtb2R1bGVzIHdpbGwgYmUgaW5zdGFsbGVkLgorICAgVGhlIGFwcHJvcHJpYXRlIG1vZHVsZXMgd2lsbCBiZSBpbnN0YWxsZWQuCiA3LiBSZWJvb3QgeW91ciBzeXN0ZW0uCiAKIApAQCAtMjQ1LDcgKzI0NSw3IEBACiBUaGlzIHBhcmFtZXRlcnMgaXMgb25seSByZWxldmFudCBpZiBhdXRvLW5lZ290aWF0aW9uIGZvciB0aGlzIHBvcnQgaXMgCiBub3Qgc2V0IHRvICJTZW5zZSIuIElmIGF1dG8tbmVnb3RpYXRpb24gaXMgc2V0IHRvICJPbiIsIGFsbCB0aHJlZSB2YWx1ZXMKIGFyZSBwb3NzaWJsZS4gSWYgaXQgaXMgc2V0IHRvICJPZmYiLCBvbmx5ICJGdWxsIiBhbmQgIkhhbGYiIGFyZSBhbGxvd2VkLgotVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZnVsbCBpZiB5b3VyIGxpbmsgcGFydG5lciBkb2VzIG5vdCBzdXBwb3J0IGFsbAorVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZnVsIGlmIHlvdXIgbGluayBwYXJ0bmVyIGRvZXMgbm90IHN1cHBvcnQgYWxsCiBwb3NzaWJsZSBjb21iaW5hdGlvbnMuCiAKIEZsb3cgQ29udHJvbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9vb3BzLXRyYWNpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9vb3BzLXRyYWNpbmcudHh0CmluZGV4IDA1OTYwZjguLjI1MDM0MDQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vb29wcy10cmFjaW5nLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL29vcHMtdHJhY2luZy50eHQKQEAgLTQxLDExICs0MSw5IEBACiAgICAgcnVuIGEgbnVsbCBtb2RlbSB0byBhIHNlY29uZCBtYWNoaW5lIGFuZCBjYXB0dXJlIHRoZSBvdXRwdXQgdGhlcmUKICAgICB1c2luZyB5b3VyIGZhdm91cml0ZSBjb21tdW5pY2F0aW9uIHByb2dyYW0uICBNaW5pY29tIHdvcmtzIHdlbGwuCiAKLSgzKSBQYXRjaCB0aGUga2VybmVsIHdpdGggb25lIG9mIHRoZSBjcmFzaCBkdW1wIHBhdGNoZXMuICBUaGVzZSBzYXZlCi0gICAgZGF0YSB0byBhIGZsb3BweSBkaXNrIG9yIHZpZGVvIHJvbSBvciBhIHN3YXAgcGFydGl0aW9uLiAgTm9uZSBvZgotICAgIHRoZXNlIGFyZSBzdGFuZGFyZCBrZXJuZWwgcGF0Y2hlcyBzbyB5b3UgaGF2ZSB0byBmaW5kIGFuZCBhcHBseQotICAgIHRoZW0geW91cnNlbGYuICBTZWFyY2gga2VybmVsIGFyY2hpdmVzIGZvciBrbXNnZHVtcCwgbGtjZCBhbmQKLSAgICBvb3BzK3NtcmFtLgorKDMpIFVzZSBLZHVtcCAoc2VlIERvY3VtZW50YXRpb24va2R1bXAva2R1bXAudHh0KSwKKyAgICBleHRyYWN0IHRoZSBrZXJuZWwgcmluZyBidWZmZXIgZnJvbSBvbGQgbWVtb3J5IHdpdGggdXNpbmcgZG1lc2cKKyAgICBnZGJtYWNybyBpbiBEb2N1bWVudGF0aW9uL2tkdW1wL2dkYm1hY3Jvcy50eHQuCiAKIAogRnVsbCBJbmZvcm1hdGlvbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wY2ktZXJyb3ItcmVjb3ZlcnkudHh0IGIvRG9jdW1lbnRhdGlvbi9wY2ktZXJyb3ItcmVjb3ZlcnkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwODk5NjcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3BjaS1lcnJvci1yZWNvdmVyeS50eHQKQEAgLTAsMCArMSwyNDYgQEAKKworICAgICAgICAgICAgICAgICAgICAgICBQQ0kgRXJyb3IgUmVjb3ZlcnkKKyAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgTWF5IDMxLCAyMDA1CisKKyAgICAgICAgICAgICAgIEN1cnJlbnQgZG9jdW1lbnQgbWFpbnRhaW5lcjoKKyAgICAgICAgICAgTGluYXMgVmVwc3RhcyA8bGluYXNAYXVzdGluLmlibS5jb20+CisKKworU29tZSBQQ0kgYnVzIGNvbnRyb2xsZXJzIGFyZSBhYmxlIHRvIGRldGVjdCBjZXJ0YWluICJoYXJkIiBQQ0kgZXJyb3JzCitvbiB0aGUgYnVzLCBzdWNoIGFzIHBhcml0eSBlcnJvcnMgb24gdGhlIGRhdGEgYW5kIGFkZHJlc3MgYnVzc2VzLCBhcword2VsbCBhcyBTRVJSIGFuZCBQRVJSIGVycm9ycy4gIFRoZXNlIGNoaXBzZXRzIGFyZSB0aGVuIGFibGUgdG8gZGlzYWJsZQorSS9PIHRvL2Zyb20gdGhlIGFmZmVjdGVkIGRldmljZSwgc28gdGhhdCwgZm9yIGV4YW1wbGUsIGEgYmFkIERNQQorYWRkcmVzcyBkb2Vzbid0IGVuZCB1cCBjb3JydXB0aW5nIHN5c3RlbSBtZW1vcnkuICBUaGVzZSBzYW1lIGNoaXBzZXRzCithcmUgYWxzbyBhYmxlIHRvIHJlc2V0IHRoZSBhZmZlY3RlZCBQQ0kgZGV2aWNlLCBhbmQgcmV0dXJuIGl0IHRvCit3b3JraW5nIGNvbmRpdGlvbi4gIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGEgZ2VuZXJpYyBBUEkgZm9ybQorcGVyZm9ybWluZyBlcnJvciByZWNvdmVyeS4KKworVGhlIGNvcmUgaWRlYSBpcyB0aGF0IGFmdGVyIGEgUENJIGVycm9yIGhhcyBiZWVuIGRldGVjdGVkLCB0aGVyZSBtdXN0CitiZSBhIHdheSBmb3IgdGhlIGtlcm5lbCB0byBjb29yZGluYXRlIHdpdGggYWxsIGFmZmVjdGVkIGRldmljZSBkcml2ZXJzCitzbyB0aGF0IHRoZSBwY2kgY2FyZCBjYW4gYmUgbWFkZSBvcGVyYXRpb25hbCBhZ2FpbiwgcG9zc2libHkgYWZ0ZXIKK3BlcmZvcm1pbmcgYSBmdWxsIGVsZWN0cmljYWwgI1JTVCBvZiB0aGUgUENJIGNhcmQuICBUaGUgQVBJIGJlbG93Citwcm92aWRlcyBhIGdlbmVyaWMgQVBJIGZvciBkZXZpY2UgZHJpdmVycyB0byBiZSBub3RpZmllZCBvZiBQQ0kKK2Vycm9ycywgYW5kIHRvIGJlIG5vdGlmaWVkIG9mLCBhbmQgcmVzcG9uZCB0bywgYSByZXNldCBzZXF1ZW5jZS4KKworUHJlbGltaW5hcnkgc2tldGNoIG9mIEFQSSwgY3V0LW4tcGFzdGVkLW4tbW9kaWZpZWQgZW1haWwgZnJvbQorQmVuIEhlcnJlbnNjaG1pZHQsIGNpcmNhIDUgYXByaWwgMjAwNQorCitUaGUgZXJyb3IgcmVjb3ZlcnkgQVBJIHN1cHBvcnQgaXMgZXhwb3NlZCB0byB0aGUgZHJpdmVyIGluIHRoZSBmb3JtIG9mCithIHN0cnVjdHVyZSBvZiBmdW5jdGlvbiBwb2ludGVycyBwb2ludGVkIHRvIGJ5IGEgbmV3IGZpZWxkIGluIHN0cnVjdAorcGNpX2RyaXZlci4gVGhlIGFic2VuY2Ugb2YgdGhpcyBwb2ludGVyIGluIHBjaV9kcml2ZXIgZGVub3RlcyBhbgorIm5vbi1hd2FyZSIgZHJpdmVyLCBiZWhhdmlvdXIgb24gdGhlc2UgaXMgcGxhdGZvcm0gZGVwZW5kYW50LgorUGxhdGZvcm1zIGxpa2UgcHBjNjQgY2FuIHRyeSB0byBzaW11bGF0ZSBwY2kgaG90cGx1ZyByZW1vdmUvYWRkLgorCitUaGUgZGVmaW5pdGlvbiBvZiAicGNpX2Vycm9yX3Rva2VuIiBpcyBub3QgY292ZXJlZCBoZXJlLiBJdCBpcyBiYXNlZCBvbgorU2V0bydzIHdvcmsgb24gdGhlIHN5bmNocm9ub3VzIGVycm9yIGRldGVjdGlvbi4gV2Ugc3RpbGwgbmVlZCB0byBkZWZpbmUKK2Z1bmN0aW9ucyBmb3IgZXh0cmFjdGluZyBpbmZvcyBvdXQgb2YgYW4gb3BhcXVlIGVycm9yIHRva2VuLiBUaGlzIGlzCitzZXBhcmF0ZSBmcm9tIHRoaXMgQVBJLgorCitUaGlzIHN0cnVjdHVyZSBoYXMgdGhlIGZvcm06CisKK3N0cnVjdCBwY2lfZXJyb3JfaGFuZGxlcnMKK3sKKwlpbnQgKCplcnJvcl9kZXRlY3RlZCkoc3RydWN0IHBjaV9kZXYgKmRldiwgcGNpX2Vycm9yX3Rva2VuIGVycm9yKTsKKwlpbnQgKCptbWlvX2VuYWJsZWQpKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCWludCAoKnJlc3VtZSkoc3RydWN0IHBjaV9kZXYgKmRldik7CisJaW50ICgqbGlua19yZXNldCkoc3RydWN0IHBjaV9kZXYgKmRldik7CisJaW50ICgqc2xvdF9yZXNldCkoc3RydWN0IHBjaV9kZXYgKmRldik7Cit9OworCitBIGRyaXZlciBkb2Vzbid0IGhhdmUgdG8gaW1wbGVtZW50IGFsbCBvZiB0aGVzZSBjYWxsYmFja3MuIFRoZQorb25seSBtYW5kYXRvcnkgb25lIGlzIGVycm9yX2RldGVjdGVkKCkuIElmIGEgY2FsbGJhY2sgaXMgbm90CitpbXBsZW1lbnRlZCwgdGhlIGNvcnJlc3BvbmRpbmcgZmVhdHVyZSBpcyBjb25zaWRlcmVkIHVuc3VwcG9ydGVkLgorRm9yIGV4YW1wbGUsIGlmIG1taW9fZW5hYmxlZCgpIGFuZCByZXN1bWUoKSBhcmVuJ3QgdGhlcmUsIHRoZW4gdGhlCitkcml2ZXIgaXMgYXNzdW1lZCBhcyBub3QgZG9pbmcgYW55IGRpcmVjdCByZWNvdmVyeSBhbmQgcmVxdWlyZXMKK2EgcmVzZXQuIElmIGxpbmtfcmVzZXQoKSBpcyBub3QgaW1wbGVtZW50ZWQsIHRoZSBjYXJkIGlzIGFzc3VtZWQgYXMKK25vdCBjYXJpbmcgYWJvdXQgbGluayByZXNldHMsIGluIHdoaWNoIGNhc2UsIGlmIHJlY292ZXIgaXMgc3VwcG9ydGVkLAordGhlIGNvcmUgY2FuIHRyeSByZWNvdmVyIChidXQgbm90IHNsb3RfcmVzZXQoKSB1bmxlc3MgaXQgcmVhbGx5IGRpZAorcmVzZXQgdGhlIHNsb3QpLiBJZiBzbG90X3Jlc2V0KCkgaXMgbm90IHN1cHBvcnRlZCwgbGlua19yZXNldCgpIGNhbgorYmUgY2FsbGVkIGluc3RlYWQgb24gYSBzbG90IHJlc2V0LgorCitBdCBmaXJzdCwgdGhlIGNhbGwgd2lsbCBhbHdheXMgYmUgOgorCisJMSkgZXJyb3JfZGV0ZWN0ZWQoKQorCisJRXJyb3IgZGV0ZWN0ZWQuIFRoaXMgaXMgc2VudCBvbmNlIGFmdGVyIGFuIGVycm9yIGhhcyBiZWVuIGRldGVjdGVkLiBBdAordGhpcyBwb2ludCwgdGhlIGRldmljZSBtaWdodCBub3QgYmUgYWNjZXNzaWJsZSBhbnltb3JlIGRlcGVuZGluZyBvbiB0aGUKK3BsYXRmb3JtICh0aGUgc2xvdCB3aWxsIGJlIGlzb2xhdGVkIG9uIHBwYzY0KS4gVGhlIGRyaXZlciBtYXkgYWxyZWFkeQoraGF2ZSAibm90aWNlZCIgdGhlIGVycm9yIGJlY2F1c2Ugb2YgYSBmYWlsaW5nIElPLCBidXQgdGhpcyBpcyB0aGUgcHJvcGVyCisic3luY2hyb25pc2F0aW9uIHBvaW50IiwgdGhhdCBpcywgaXQgZ2l2ZXMgYSBjaGFuY2UgdG8gdGhlIGRyaXZlciB0bworY2xlYW51cCwgd2FpdGluZyBmb3IgcGVuZGluZyBzdHVmZiAodGltZXJzLCB3aGF0ZXZlciwgZXRjLi4uKSB0bworY29tcGxldGU7IGl0IGNhbiB0YWtlIHNlbWFwaG9yZXMsIHNjaGVkdWxlLCBldGMuLi4gZXZlcnl0aGluZyBidXQgdG91Y2gKK3RoZSBkZXZpY2UuIFdpdGhpbiB0aGlzIGZ1bmN0aW9uIGFuZCBhZnRlciBpdCByZXR1cm5zLCB0aGUgZHJpdmVyCitzaG91bGRuJ3QgZG8gYW55IG5ldyBJT3MuIENhbGxlZCBpbiB0YXNrIGNvbnRleHQuIFRoaXMgaXMgc29ydCBvZiBhCisicXVpZXNjZSIgcG9pbnQuIFNlZSBub3RlIGFib3V0IGludGVycnVwdHMgYXQgdGhlIGVuZCBvZiB0aGlzIGRvYy4KKworCVJlc3VsdCBjb2RlczoKKwkJLSBQQ0lFUlJfUkVTVUxUX0NBTl9SRUNPVkVSOgorCQkgIERyaWV2ZXIgcmV0dXJucyB0aGlzIGlmIGl0IHRoaW5rcyBpdCBtaWdodCBiZSBhYmxlIHRvIHJlY292ZXIKKwkJICB0aGUgSFcgYnkganVzdCBiYW5naW5nIElPcyBvciBpZiBpdCB3YW50cyB0byBiZSBnaXZlbgorCQkgIGEgY2hhbmNlIHRvIGV4dHJhY3Qgc29tZSBkaWFnbm9zdGljIGluZm9ybWF0aW9ucyAoc2VlCisJCSAgYmVsb3cpLgorCQktIFBDSUVSUl9SRVNVTFRfTkVFRF9SRVNFVDoKKwkJICBEcml2ZXIgcmV0dXJucyB0aGlzIGlmIGl0IHRoaW5rcyBpdCBjYW4ndCByZWNvdmVyIHVubGVzcyB0aGUKKwkJICBzbG90IGlzIHJlc2V0LgorCQktIFBDSUVSUl9SRVNVTFRfRElTQ09OTkVDVDoKKwkJICBSZXR1cm4gdGhpcyBpZiBkcml2ZXIgdGhpbmtzIGl0IHdvbid0IHJlY292ZXIgYXQgYWxsLAorCQkgICh0aGlzIHdpbGwgZGV0YWNoIHRoZSBkcml2ZXIgPyBvciBqdXN0IGxlYXZlIGl0CisJCSAgZGFuZ2xpbmcgPyB0byBiZSBkZWNpZGVkKQorCitTbyBhdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGNhbGxlZCBlcnJvcl9kZXRlY3RlZCgpIGZvciBhbGwgZHJpdmVycworb24gdGhlIHNlZ21lbnQgdGhhdCBoYWQgdGhlIGVycm9yLiBPbiBwcGM2NCwgdGhlIHNsb3QgaXMgaXNvbGF0ZWQuIFdoYXQKK2hhcHBlbnMgbm93IHR5cGljYWxseSBkZXBlbmRzIG9uIHRoZSByZXN1bHQgZnJvbSB0aGUgZHJpdmVycy4gSWYgYWxsCitkcml2ZXJzIG9uIHRoZSBzZWdtZW50L3Nsb3QgcmV0dXJuIFBDSUVSUl9SRVNVTFRfQ0FOX1JFQ09WRVIsIHdlIHdvdWxkCityZS1lbmFibGUgSU9zIG9uIHRoZSBzbG90IChvciBkbyBub3RoaW5nIHNwZWNpYWwgaWYgdGhlIHBsYXRmb3JtIGRvZXNuJ3QKK2lzb2xhdGUgc2xvdHMpIGFuZCBjYWxsIDIpLiBJZiBub3QgYW5kIHdlIGNhbiByZXNldCBzbG90cywgd2UgZ28gdG8gNCksCitpZiBuZWl0aGVyLCB3ZSBoYXZlIGEgZGVhZCBzbG90LiBJZiBpdCdzIGFuIGhvdHBsdWcgc2xvdCwgd2UgbWlnaHQKKyJzaW11bGF0ZSIgcmVzZXQgYnkgdHJpZ2dlcmluZyBIVyB1bnBsdWcvcmVwbHVnIHRob3VnaC4KKworPj4+IEN1cnJlbnQgcHBjNjQgaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0IGEgZGV2aWNlIGRyaXZlciB3aWxsCis+Pj4gKm5vdCogc2NoZWR1bGUgb3Igc2VtYXBob3JlIGluIHRoaXMgcm91dGluZTsgdGhlIGN1cnJlbnQgcHBjNjQKKz4+PiBpbXBsZW1lbnRhdGlvbiB1c2VzIG9uZSBrZXJuZWwgdGhyZWFkIHRvIG5vdGlmeSBhbGwgZGV2aWNlczsKKz4+PiB0aHVzLCBvZiBvbmUgZGV2aWNlIHNsZWVwcy9zY2hlZHVsZXMsIGFsbCBkZXZpY2VzIGFyZSBhZmZlY3RlZC4KKz4+PiBEb2luZyBiZXR0ZXIgcmVxdWlyZXMgY29tcGxleCBtdWx0aS10aHJlYWRlZCBsb2dpYyBpbiB0aGUgZXJyb3IKKz4+PiByZWNvdmVyeSBpbXBsZW1lbnRhdGlvbiAoZS5nLiB3YWl0aW5nIGZvciBhbGwgbm90aWZpY2F0aW9uIHRocmVhZHMKKz4+PiB0byAiam9pbiIgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCByZWNvdmVyeS4pICBUaGlzIHNlZW1zIGV4Y2Vzc2l2ZWx5Cis+Pj4gY29tcGxleCBhbmQgbm90IHdvcnRoIGltcGxlbWVudGluZy4KKworPj4+IFRoZSBjdXJyZW50IHBwYzY0IGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgbXVjaCBjYXJlIGlmIHRoZSBkZXZpY2UKKz4+PiBhdHRlbXB0cyBpL28gYXQgdGhpcyBwb2ludCwgb3Igbm90LiAgSS9PJ3Mgd2lsbCBmYWlsLCByZXR1cm5pbmcKKz4+PiBhIHZhbHVlIG9mIDB4ZmYgb24gcmVhZCwgYW5kIHdyaXRlcyB3aWxsIGJlIGRyb3BwZWQuIElmIHRoZSBkZXZpY2UKKz4+PiBkcml2ZXIgYXR0ZW1wdHMgbW9yZSB0aGFuIDEwSyBJL08ncyB0byBhIGZyb3plbiBhZGFwdGVyLCBpdCB3aWxsCis+Pj4gYXNzdW1lIHRoYXQgdGhlIGRldmljZSBkcml2ZXIgaGFzIGdvbmUgaW50byBhbiBpbmZpbml0ZSBsb29wLCBhbmQKKz4+PiBpdCB3aWxsIHBhbmljIHRoZSB0aGUga2VybmVsLgorCisJMikgbW1pb19lbmFibGVkKCkKKworCVRoaXMgaXMgdGhlICJlYXJseSByZWNvdmVyeSIgY2FsbC4gSU9zIGFyZSBhbGxvd2VkIGFnYWluLCBidXQgRE1BIGlzCitub3QgKGhybS4uLiB0byBiZSBkaXNjdXNzZWQsIEkgcHJlZmVyIG5vdCksIHdpdGggc29tZSByZXN0cmljdGlvbnMuIFRoaXMKK2lzIE5PVCBhIGNhbGxiYWNrIGZvciB0aGUgZHJpdmVyIHRvIHN0YXJ0IG9wZXJhdGlvbnMgYWdhaW4sIG9ubHkgdG8KK3BlZWsvcG9rZSBhdCB0aGUgZGV2aWNlLCBleHRyYWN0IGRpYWdub3N0aWMgaW5mb3JtYXRpb24sIGlmIGFueSwgYW5kCitldmVudHVhbGx5IGRvIHRoaW5ncyBsaWtlIHRyaWdnZXIgYSBkZXZpY2UgbG9jYWwgcmVzZXQgb3Igc29tZSBzdWNoLAorYnV0IG5vdCByZXN0YXJ0IG9wZXJhdGlvbnMuIFRoaXMgaXMgc2VudCBpZiBhbGwgZHJpdmVycyBvbiBhIHNlZ21lbnQKK2FncmVlIHRoYXQgdGhleSBjYW4gdHJ5IHRvIHJlY292ZXIgYW5kIG5vIGF1dG9tYXRpYyBsaW5rIHJlc2V0IHdhcworcGVyZm9ybWVkIGJ5IHRoZSBIVy4gSWYgdGhlIHBsYXRmb3JtIGNhbid0IGp1c3QgcmUtZW5hYmxlIElPcyB3aXRob3V0CithIHNsb3QgcmVzZXQgb3IgYSBsaW5rIHJlc2V0LCBpdCBkb2Vzbid0IGNhbGwgdGhpcyBjYWxsYmFjayBhbmQgZ29lcworZGlyZWN0bHkgdG8gMykgb3IgNCkuIEFsbCBJT3Mgc2hvdWxkIGJlIGRvbmUgX3N5bmNocm9ub3VzbHlfIGZyb20KK3dpdGhpbiB0aGlzIGNhbGxiYWNrLCBlcnJvcnMgdHJpZ2dlcmVkIGJ5IHRoZW0gd2lsbCBiZSByZXR1cm5lZCB2aWEKK3RoZSBub3JtYWwgcGNpX2NoZWNrX3doYXRldmVyKCkgYXBpLCBubyBuZXcgZXJyb3JfZGV0ZWN0ZWQoKSBjYWxsYmFjaword2lsbCBiZSBpc3N1ZWQgZHVlIHRvIGFuIGVycm9yIGhhcHBlbmluZyBoZXJlLiBIb3dldmVyLCBzdWNoIGFuIGVycm9yCittaWdodCBjYXVzZSBJT3MgdG8gYmUgcmUtYmxvY2tlZCBmb3IgdGhlIHdob2xlIHNlZ21lbnQsIGFuZCB0aHVzCitpbnZhbGlkYXRlIHRoZSByZWNvdmVyeSB0aGF0IG90aGVyIGRldmljZXMgb24gdGhlIHNhbWUgc2VnbWVudCBtaWdodAoraGF2ZSBkb25lLCBmb3JjaW5nIHRoZSB3aG9sZSBzZWdtZW50IGludG8gb25lIG9mIHRoZSBuZXh0IHN0YXRlcywKK3RoYXQgaXMgbGluayByZXNldCBvciBzbG90IHJlc2V0LgorCisJUmVzdWx0IGNvZGVzOgorCQktIFBDSUVSUl9SRVNVTFRfUkVDT1ZFUkVECisJCSAgRHJpdmVyIHJldHVybnMgdGhpcyBpZiBpdCB0aGlua3MgdGhlIGRldmljZSBpcyBmdWxseQorCQkgIGZ1bmN0aW9ubmFsIGFuZCB0aGlua3MgaXQgaXMgcmVhZHkgdG8gc3RhcnQKKwkJICBub3JtYWwgZHJpdmVyIG9wZXJhdGlvbnMgYWdhaW4uIFRoZXJlIGlzIG5vCisJCSAgZ3VhcmFudGVlIHRoYXQgdGhlIGRyaXZlciB3aWxsIGFjdHVhbGx5IGJlCisJCSAgYWxsb3dlZCB0byBwcm9jZWVkLCBhcyBhbm90aGVyIGRyaXZlciBvbiB0aGUKKwkJICBzYW1lIHNlZ21lbnQgbWlnaHQgaGF2ZSBmYWlsZWQgYW5kIHRodXMgdHJpZ2dlcmVkIGEKKwkJICBzbG90IHJlc2V0IG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgaXQuCisKKwkJLSBQQ0lFUlJfUkVTVUxUX05FRURfUkVTRVQKKwkJICBEcml2ZXIgcmV0dXJucyB0aGlzIGlmIGl0IHRoaW5rcyB0aGUgZGV2aWNlIGlzIG5vdAorCQkgIHJlY292ZXJhYmxlIGluIGl0J3MgY3VycmVudCBzdGF0ZSBhbmQgaXQgbmVlZHMgYSBzbG90CisJCSAgcmVzZXQgdG8gcHJvY2VlZC4KKworCQktIFBDSUVSUl9SRVNVTFRfRElTQ09OTkVDVAorCQkgIFNhbWUgYXMgYWJvdmUuIFRvdGFsIGZhaWx1cmUsIG5vIHJlY292ZXJ5IGV2ZW4gYWZ0ZXIKKwkJICByZXNldCBkcml2ZXIgZGVhZC4gKFRvIGJlIGRlZmluZWQgbW9yZSBwcmVjaXNlbHkpCisKKz4+PiBUaGUgY3VycmVudCBwcGM2NCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBjYWxsYmFjay4KKworCTMpIGxpbmtfcmVzZXQoKQorCisJVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGxpbmsgaGFzIGJlZW4gcmVzZXQuIFRoaXMgaXMgdHlwaWNhbGx5CithIFBDSSBFeHByZXNzIHNwZWNpZmljIHN0YXRlIGF0IHRoaXMgcG9pbnQgYW5kIGlzIGRvbmUgd2hlbmV2ZXIgYQorbm9uLWZhdGFsIGVycm9yIGhhcyBiZWVuIGRldGVjdGVkIHRoYXQgY2FuIGJlICJzb2x2ZWQiIGJ5IHJlc2V0dGluZwordGhlIGxpbmsuIFRoaXMgY2FsbCBpbmZvcm1zIHRoZSBkcml2ZXIgb2YgdGhlIHJlc2V0IGFuZCB0aGUgZHJpdmVyCitzaG91bGQgY2hlY2sgaWYgdGhlIGRldmljZSBhcHBlYXJzIHRvIGJlIGluIHdvcmtpbmcgY29uZGl0aW9uLgorVGhpcyBmdW5jdGlvbiBhY3RzIGEgYml0IGxpa2UgMikgbW1pb19lbmFibGVkKCksIGluIHRoYXQgdGhlIGRyaXZlcgoraXMgbm90IHN1cHBvc2VkIHRvIHJlc3RhcnQgbm9ybWFsIGRyaXZlciBJL08gb3BlcmF0aW9ucyByaWdodCBhd2F5LgorSW5zdGVhZCwgaXQgc2hvdWxkIGp1c3QgInByb2JlIiB0aGUgZGV2aWNlIHRvIGNoZWNrIGl0J3MgcmVjb3ZlcmFiaWxpdHkKK3N0YXR1cy4gSWYgYWxsIGlzIHJpZ2h0LCB0aGVuIHRoZSBjb3JlIHdpbGwgY2FsbCByZXN1bWUoKSBvbmNlIGFsbAorZHJpdmVycyBoYXZlIGFjaydkIGxpbmtfcmVzZXQoKS4KKworCVJlc3VsdCBjb2RlczoKKwkJKGlkZW50aWNhbCB0byBtbWlvX2VuYWJsZWQpCisKKz4+PiBUaGUgY3VycmVudCBwcGM2NCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBjYWxsYmFjay4KKworCTQpIHNsb3RfcmVzZXQoKQorCisJVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNsb3QgaGFzIGJlZW4gc29mdCBvciBoYXJkIHJlc2V0IGJ5IHRoZQorcGxhdGZvcm0uICBBIHNvZnQgcmVzZXQgY29uc2lzdHMgb2YgYXNzZXJ0aW5nIHRoZSBhZGFwdGVyICNSU1QgbGluZQorYW5kIHRoZW4gcmVzdG9yaW5nIHRoZSBQQ0kgQkFScyBhbmQgUENJIGNvbmZpZ3VyYXRpb24gaGVhZGVyLiBJZiB0aGUKK3BsYXRmb3JtIHN1cHBvcnRzIFBDSSBob3RwbHVnLCB0aGVuIGl0IG1pZ2h0IGluc3RlYWQgcGVyZm9ybSBhIGhhcmQKK3Jlc2V0IGJ5IHRvZ2dsaW5nIHBvd2VyIG9uIHRoZSBzbG90IG9mZi9vbi4gVGhpcyBjYWxsIGdpdmVzIGRyaXZlcnMKK3RoZSBjaGFuY2UgdG8gcmUtaW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUgKHJlLWRvd25sb2FkIGZpcm13YXJlLCBldGMuKSwKK2J1dCBkcml2ZXJzIHNob3VsZG4ndCByZXN0YXJ0IG5vcm1hbCBJL08gcHJvY2Vzc2luZyBvcGVyYXRpb25zIGF0Cit0aGlzIHBvaW50LiAgKFNlZSBub3RlIGFib3V0IGludGVycnVwdHM7IGludGVycnVwdHMgYXJlbid0IGd1YXJhbnRlZWQKK3RvIGJlIGRlbGl2ZXJlZCB1bnRpbCB0aGUgcmVzdW1lKCkgY2FsbGJhY2sgaGFzIGJlZW4gY2FsbGVkKS4gSWYgYWxsCitkZXZpY2UgZHJpdmVycyByZXBvcnQgc3VjY2VzcyBvbiB0aGlzIGNhbGxiYWNrLCB0aGUgcGF0Zm9ybSB3aWxsIGNhbGwKK3Jlc3VtZSgpIHRvIGNvbXBsZXRlIHRoZSBlcnJvciBoYW5kbGluZyBhbmQgbGV0IHRoZSBkcml2ZXIgcmVzdGFydAorbm9ybWFsIEkvTyBwcm9jZXNzaW5nLgorCitBIGRyaXZlciBjYW4gc3RpbGwgcmV0dXJuIGEgY3JpdGljYWwgZmFpbHVyZSBmb3IgdGhpcyBmdW5jdGlvbiBpZgoraXQgY2FuJ3QgZ2V0IHRoZSBkZXZpY2Ugb3BlcmF0aW9uYWwgYWZ0ZXIgcmVzZXQuICBJZiB0aGUgcGxhdGZvcm0KK3ByZXZpb3VzbHkgdHJpZWQgYSBzb2Z0IHJlc2V0LCBpdCBtaWdoIG5vdyB0cnkgYSBoYXJkIHJlc2V0IChwb3dlcgorY3ljbGUpIGFuZCB0aGVuIGNhbGwgc2xvdF9yZXNldCgpIGFnYWluLiAgSXQgdGhlIGRldmljZSBzdGlsbCBjYW4ndAorYmUgcmVjb3ZlcmVkLCB0aGVyZSBpcyBub3RoaW5nIG1vcmUgdGhhdCBjYW4gYmUgZG9uZTsgIHRoZSBwbGF0Zm9ybQord2lsbCB0eXBpY2FsbHkgcmVwb3J0IGEgInBlcm1hbmVudCBmYWlsdXJlIiBpbiBzdWNoIGEgY2FzZS4gIFRoZQorZGV2aWNlIHdpbGwgYmUgY29uc2lkZXJlZCAiZGVhZCIgaW4gdGhpcyBjYXNlLgorCisJUmVzdWx0IGNvZGVzOgorCQktIFBDSUVSUl9SRVNVTFRfRElTQ09OTkVDVAorCQlTYW1lIGFzIGFib3ZlLgorCis+Pj4gVGhlIGN1cnJlbnQgcHBjNjQgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgdHJ5IGEgcG93ZXItY3ljbGUgcmVzZXQKKz4+PiBpZiB0aGUgZHJpdmVyIHJldHVybmVkIFBDSUVSUl9SRVNVTFRfRElTQ09OTkVDVC4gSG93ZXZlciwgaXQgc2hvdWxkLgorCisJNSkgcmVzdW1lKCkKKworCVRoaXMgaXMgY2FsbGVkIGlmIGFsbCBkcml2ZXJzIG9uIHRoZSBzZWdtZW50IGhhdmUgcmV0dXJuZWQKK1BDSUVSUl9SRVNVTFRfUkVDT1ZFUkVEIGZyb20gb25lIG9mIHRoZSAzIHByZXZvdXMgY2FsbGJhY2tzLgorVGhhdCBiYXNpY2FsbHkgdGVsbHMgdGhlIGRyaXZlciB0byByZXN0YXJ0IGFjdGl2aXR5LCB0aHQgZXZlcnl0aGluZworaXMgYmFjayBhbmQgcnVubmluZy4gTm8gcmVzdWx0IGNvZGUgaXMgdGFrZW4gaW50byBhY2NvdW50IGhlcmUuIElmCithIG5ldyBlcnJvciBoYXBwZW5zLCBpdCB3aWxsIHJlc3RhcnQgYSBuZXcgZXJyb3IgaGFuZGxpbmcgcHJvY2Vzcy4KKworVGhhdCdzIGl0LiBJIHRoaW5rIHRoaXMgY292ZXJzIGFsbCB0aGUgcG9zc2liaWxpdGllcy4gVGhlIHdheSB0aG9zZQorY2FsbGJhY2tzIGFyZSBjYWxsZWQgaXMgcGxhdGZvcm0gcG9saWN5LiBBIHBsYXRmb3JtIHdpdGggbm8gc2xvdCByZXNldAorY2FwYWJpbGl0eSBmb3IgZXhhbXBsZSBtYXkgd2FudCB0byBqdXN0ICJpZ25vcmUiIGRyaXZlcnMgdGhhdCBjYW4ndAorcmVjb3ZlciAoZGlzY29ubmVjdCB0aGVtKSBhbmQgdHJ5IHRvIGxldCBvdGhlciBjYXJkcyBvbiB0aGUgc2FtZSBzZWdtZW50CityZWNvdmVyLiBLZWVwIGluIG1pbmQgdGhhdCBpbiBtb3N0IHJlYWwgbGlmZSBjYXNlcywgdGhvdWdoLCB0aGVyZSB3aWxsCitiZSBvbmx5IG9uZSBkcml2ZXIgcGVyIHNlZ21lbnQuCisKK05vdywgdGhlcmUgaXMgYSBub3RlIGFib3V0IGludGVycnVwdHMuIElmIHlvdSBnZXQgYW4gaW50ZXJydXB0IGFuZCB5b3VyCitkZXZpY2UgaXMgZGVhZCBvciBoYXMgYmVlbiBpc29sYXRlZCwgdGhlcmUgaXMgYSBwcm9ibGVtIDopCisKK0FmdGVyIG11Y2ggdGhpbmtpbmcsIEkgZGVjaWRlZCB0byBsZWF2ZSB0aGF0IHRvIHRoZSBwbGF0Zm9ybS4gVGhhdCBpcywKK3RoZSByZWNvdmVyeSBBUEkgb25seSBwcmVjaWVzIHRoYXQ6CisKKyAtIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGludGVycnVwdCBkZWxpdmVyeSBjYW4gcHJvY2VlZCBmcm9tIGFueQorZGV2aWNlIG9uIHRoZSBzZWdtZW50IHN0YXJ0aW5nIGZyb20gdGhlIGVycm9yIGRldGVjdGlvbiBhbmQgdW50aWwgdGhlCityZXN0YXJ0IGNhbGxiYWNrIGlzIHNlbnQsIGF0IHdoaWNoIHBvaW50IGludGVycnVwdHMgYXJlIGV4cGVjdGVkIHRvIGJlCitmdWxseSBvcGVyYXRpb25hbC4KKworIC0gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgaW50ZXJydXB0IGRlbGl2ZXJ5IGlzIHN0b3BwZWQsIHRoYXQgaXMsIGFkCityaXZlciB0aGF0IGdldHMgYW4gaW50ZXJydXB0cyBhZnRlciBkZXRlY3RpbmcgYW4gZXJyb3IsIG9yIHRoYXQgZGV0ZWN0cworYW5kIGVycm9yIHdpdGhpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgc3VjaCB0aGF0IGl0IHByZXZlbnRzIHByb3BlcgorYWNrJ2luZyBvZiB0aGUgaW50ZXJydXB0IChhbmQgdGh1cyByZW1vdmFsIG9mIHRoZSBzb3VyY2UpIHNob3VsZCBqdXN0CityZXR1cm4gSVJRX05PVEhBTkRMRUQuIEl0J3MgdXAgdG8gdGhlIHBsYXRmb3JtIHRvIGRlYWwgd2l0aCB0YWh0Citjb25kaXRpb24sIHR5cGljYWxseSBieSBtYXNraW5nIHRoZSBpcnEgc291cmNlIGR1cmluZyB0aGUgZHVyYXRpb24gb2YKK3RoZSBlcnJvciBoYW5kbGluZy4gSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgcGxhdGZvcm0gImtub3dzIiB3aGljaAoraW50ZXJydXB0cyBhcmUgcm91dGVkIHRvIGVycm9yLW1hbmFnZW1lbnQgY2FwYWJsZSBzbG90cyBhbmQgY2FuIGRlYWwKK3dpdGggdGVtcG9yYXJpbHkgZGlzYWJsaW5nIHRoYXQgaXJxIG51bWJlciBkdXJpbmcgZXJyb3IgcHJvY2Vzc2luZyAodGhpcworaXNuJ3QgdGVycmlibHkgY29tcGxleCkuIFRoYXQgbWVhbnMgc29tZSBJUlEgbGF0ZW5jeSBmb3Igb3RoZXIgZGV2aWNlcworc2hhcmluZyB0aGUgaW50ZXJydXB0LCBidXQgdGhlcmUgaXMgc2ltcGx5IG5vIG90aGVyIHdheS4gSGlnaCBlbmQKK3BsYXRmb3JtcyBhcmVuJ3Qgc3VwcG9zZWQgdG8gc2hhcmUgaW50ZXJydXB0cyBiZXR3ZWVuIG1hbnkgZGV2aWNlcworYW55d2F5IDopCisKKworUmV2aXNlZDogMzEgTWF5IDIwMDUgTGluYXMgVmVwc3RhcyA8bGluYXNAYXVzdGluLmlibS5jb20+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3BtLnR4dCBiL0RvY3VtZW50YXRpb24vcG0udHh0CmluZGV4IDJlYTExNDkuLjc5YzBmMzIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG0udHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG0udHh0CkBAIC0yMTgsNyArMjE4LDcgQEAKIFE6IFdobyBkbyBJIGNvbnRhY3QgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQKICAgIGVuYWJsaW5nIHBvd2VyIG1hbmFnZW1lbnQgZm9yIG15IHNwZWNpZmljIGRyaXZlci9kZXZpY2U/CiAKLUFDUEkgRGV2ZWxvcG1lbnQgbWFpbGluZyBsaXN0OiBhY3BpLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorQUNQSSBEZXZlbG9wbWVudCBtYWlsaW5nIGxpc3Q6IGxpbnV4LWFjcGlAdmdlci5rZXJuZWwub3JnCiAKIFN5c3RlbSBJbnRlcmZhY2UgLS0gT0JTT0xFVEUsIERPIE5PVCBVU0UhCiAtLS0tLS0tLS0tLS0tLS0tKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0CmluZGV4IGNkMGZjZDguLjA4Yzc5ZDQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvc3dzdXNwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N3c3VzcC50eHQKQEAgLTIxMiw3ICsyMTIsNyBAQAogCiBjYXQgYGNhdCAvcHJvYy9bMC05XSovbWFwcyB8IGdyZXAgLyB8IHNlZCAnczouKiAvOi86JyB8IHNvcnQgLXVgID4gL2Rldi9udWxsCiAKLWFmdGVyIHJlc3VtZS4gc3dhcG9mZiAtYTsgc3dhcG9uIC1hIG1heSBhbHNvIGJlIHVzZWZ1bGwuCithZnRlciByZXN1bWUuIHN3YXBvZmYgLWE7IHN3YXBvbiAtYSBtYXkgYWxzbyBiZSB1c2VmdWwuCiAKIFE6IFdoYXQgaGFwcGVucyB0byBkZXZpY2VzIGR1cmluZyBzd3N1c3A/IFRoZXkgc2VlbSB0byBiZSByZXN1bWVkCiBkdXJpbmcgc3lzdGVtIHN1c3BlbmQ/CkBAIC0zMjMsNyArMzIzLDcgQEAKIEE6IE5vLCBpdCBzaG91bGQgd29yayBva2F5LCBhcyBsb25nIGFzIHlvdXIgYXBwIGRvZXMgbm90IG1sb2NrKCkKIGl0LiBKdXN0IHByZXBhcmUgYmlnIGVub3VnaCBzd2FwIHBhcnRpdGlvbi4KIAotUTogV2hhdCBpbmZvcm1hdGlvbiBpcyB1c2VmdWxsIGZvciBkZWJ1Z2dpbmcgc3VzcGVuZC10by1kaXNrIHByb2JsZW1zPworUTogV2hhdCBpbmZvcm1hdGlvbiBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBzdXNwZW5kLXRvLWRpc2sgcHJvYmxlbXM/CiAKIEE6IFdlbGwsIGxhc3QgbWVzc2FnZXMgb24gdGhlIHNjcmVlbiBhcmUgYWx3YXlzIHVzZWZ1bC4gSWYgc29tZXRoaW5nCiBpcyBicm9rZW4sIGl0IGlzIHVzdWFsbHkgc29tZSBrZXJuZWwgZHJpdmVyLCB0aGVyZWZvcmUgdHJ5aW5nIHdpdGggYXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy8wMC1JTkRFWAppbmRleCBlN2JlYTBhLi5kNmQ2NWI5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjLzAwLUlOREVYCkBAIC04LDEyICs4LDE4IEBACiBjcHVfZmVhdHVyZXMudHh0CiAJLSBpbmZvIG9uIGhvdyB3ZSBzdXBwb3J0IGEgdmFyaWV0eSBvZiBDUFVzIHdpdGggbWluaW1hbCBjb21waWxlLXRpbWUKIAlvcHRpb25zLgorZWVoLXBjaS1lcnJvci1yZWNvdmVyeS50eHQKKwktIGluZm8gb24gUENJIEJ1cyBFRUggRXJyb3IgUmVjb3ZlcnkKK2h2Y3MudHh0CisJLSBJQk0gIkh5cGVydmlzb3IgVmlydHVhbCBDb25zb2xlIFNlcnZlciIgSW5zdGFsbGF0aW9uIEd1aWRlCittcGM1Mnh4LnR4dAorCS0gTGludXggMi42Lnggb24gTVBDNTJ4eCBmYW1pbHkKIHBwY19odGFiLnR4dAogCS0gaW5mbyBhYm91dCB0aGUgTGludXgvUFBDIC9wcm9jL3BwY19odGFiIGVudHJ5Ci1zbXAudHh0Ci0JLSB1c2UgYW5kIHN0YXRlIGluZm8gYWJvdXQgTGludXgvUFBDIG9uIE1QIG1hY2hpbmVzCiBTQkM4MjYwX21lbW9yeV9tYXBwaW5nLnR4dAogCS0gRVNUIFNCQzgyNjAgYm9hcmQgaW5mbworc21wLnR4dAorCS0gdXNlIGFuZCBzdGF0ZSBpbmZvIGFib3V0IExpbnV4L1BQQyBvbiBNUCBtYWNoaW5lcwogc291bmQudHh0CiAJLSBpbmZvIG9uIHNvdW5kIHN1cHBvcnQgdW5kZXIgTGludXgvUFBDCiB6SW1hZ2VfbGF5b3V0LnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL2FhY3JhaWQudHh0IGIvRG9jdW1lbnRhdGlvbi9zY3NpL2FhY3JhaWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMGZkMDcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvYWFjcmFpZC50eHQKQEAgLTAsMCArMSwxMDggQEAKK0FBQ1JBSUQgRHJpdmVyIGZvciBMaW51eCAodGFrZSB0d28pCisKK0ludHJvZHVjdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIGFhY3JhaWQgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgQWRhcHRlYyAoaHR0cDovL3d3dy5hZGFwdGVjLmNvbSkKK1JBSUQgY29udHJvbGxlcnMuIFRoaXMgaXMgYSBtYWpvciByZXdyaXRlIGZyb20gdGhlIG9yaWdpbmFsCitBZGFwdGVjIHN1cHBsaWVkIGRyaXZlci4gSXQgaGFzIHNpZ25maWNhbnRseSBjbGVhbmVkIHVwIGJvdGggdGhlIGNvZGUKK2FuZCB0aGUgcnVubmluZyBiaW5hcnkgc2l6ZSAodGhlIG1vZHVsZSBpcyBsZXNzIHRoYW4gaGFsZiB0aGUgc2l6ZSBvZgordGhlIG9yaWdpbmFsKS4KKworU3VwcG9ydGVkIENhcmRzL0NoaXBzZXRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUENJIElEIChwY2kuaWRzKQlPRU0JUHJvZHVjdAorCTkwMDU6MDI4NTo5MDA1OjAyOGEJQWRhcHRlYwkyMDIwWkNSIChTa3loYXdrKQorCTkwMDU6MDI4NTo5MDA1OjAyOGUJQWRhcHRlYwkyMDIwU0EgKFNreWhhd2spCisJOTAwNTowMjg1OjkwMDU6MDI4YglBZGFwdGVjIDIwMjVaQ1IgKFRlcm1pbmF0b3IpCisJOTAwNTowMjg1OjkwMDU6MDI4ZglBZGFwdGVjIDIwMjVTQSAoVGVybWluYXRvcikKKwk5MDA1OjAyODU6OTAwNTowMjg2CUFkYXB0ZWMJMjEyMFMgKENydXNhZGVyKQorCTkwMDU6MDI4Njo5MDA1OjAyOGQJQWRhcHRlYwkyMTMwUyAoTGFuY2VyKQorCTkwMDU6MDI4NTo5MDA1OjAyODUJQWRhcHRlYwkyMjAwUyAoVnVsY2FuKQorCTkwMDU6MDI4NTo5MDA1OjAyODcJQWRhcHRlYwkyMjAwUyAoVnVsY2FuLTJtKQorCTkwMDU6MDI4Njo5MDA1OjAyOGMJQWRhcHRlYwkyMjMwUyAoTGFuY2VyKQorCTkwMDU6MDI4Njo5MDA1OjAyOGMJQWRhcHRlYwkyMjMwU0xQIChMYW5jZXIpCisJOTAwNTowMjg1OjkwMDU6MDI5NglBZGFwdGVjCTIyNDBTIChTYWJyZUV4cHJlc3MpCisJOTAwNTowMjg1OjkwMDU6MDI5MAlBZGFwdGVjCTI0MTBTQSAoSmFndWFyKQorCTkwMDU6MDI4NTo5MDA1OjAyOTMJQWRhcHRlYyAyMTYxMFNBIChDb3JzYWlyLTE2KQorCTkwMDU6MDI4NToxMDNjOjMyMjcJQWRhcHRlYyAyNjEwU0EgKEJlYXJjYXQpCisJOTAwNTowMjg1OjkwMDU6MDI5MglBZGFwdGVjCTI4MTBTQSAoQ29yc2Fpci04KQorCTkwMDU6MDI4NTo5MDA1OjAyOTQJQWRhcHRlYwlQcm93bGVyCisJOTAwNTowMjg2OjkwMDU6MDI5ZAlBZGFwdGVjCTI0MjBTQSAoSW50cnVkZXIpCisJOTAwNTowMjg2OjkwMDU6MDI5YwlBZGFwdGVjCTI2MjBTQSAoSW50cnVkZXIpCisJOTAwNTowMjg2OjkwMDU6MDI5YglBZGFwdGVjCTI4MjBTQSAoSW50cnVkZXIpCisJOTAwNTowMjg2OjkwMDU6MDJhNwlBZGFwdGVjCTI4MzBTQSAoU2t5cmF5KQorCTkwMDU6MDI4Njo5MDA1OjAyYTgJQWRhcHRlYwkyNDMwU0EgKFNreXJheSkKKwk5MDA1OjAyODU6OTAwNTowMjg4CUFkYXB0ZWMJMzIzMFMgKEhhcnJpZXIpCisJOTAwNTowMjg1OjkwMDU6MDI4OQlBZGFwdGVjCTMyNDBTIChUb3JuYWRvKQorCTkwMDU6MDI4NTo5MDA1OjAyOTgJQWRhcHRlYwk0MDAwU0FTIChCbGFja0JpcmQpCisJOTAwNTowMjg1OjkwMDU6MDI5NwlBZGFwdGVjCTQwMDVTQVMgKEF2b25QYXJrKQorCTkwMDU6MDI4NTo5MDA1OjAyOTkJQWRhcHRlYwk0ODAwU0FTIChNYXJhdWRlci1YKQorCTkwMDU6MDI4NTo5MDA1OjAyOWEJQWRhcHRlYwk0ODA1U0FTIChNYXJhdWRlci1FKQorCTkwMDU6MDI4Njo5MDA1OjAyYTIJQWRhcHRlYwk0ODEwU0FTIChIdXJyaWNhbmUpCisJMTAxMTowMDQ2OjkwMDU6MDM2NAlBZGFwdGVjCTU0MDBTIChNdXN0YW5nKQorCTEwMTE6MDA0Njo5MDA1OjAzNjUJQWRhcHRlYwk1NDAwUyAoTXVzdGFuZykKKwk5MDA1OjAyODM6OTAwNTowMjgzCUFkYXB0ZWMJQ2F0YXB1bHQgKDMyMTBTIHdpdGggYXJjIGZpcm13YXJlKQorCTkwMDU6MDI4NDo5MDA1OjAyODQJQWRhcHRlYwlUb21jYXQgKDM0MTBTIHdpdGggYXJjIGZpcm13YXJlKQorCTkwMDU6MDI4Nzo5MDA1OjA4MDAJQWRhcHRlYwlUaGVtaXN0byAoSnVwaXRlcikKKwk5MDA1OjAyMDA6OTAwNTowMjAwCUFkYXB0ZWMJVGhlbWlzdG8gKEp1cGl0ZXIpCisJOTAwNTowMjg2OjkwMDU6MDgwMAlBZGFwdGVjCUNhbGxpc3RvIChKdXBpdGVyKQorCTEwMTE6MDA0Njo5MDA1OjEzNjQJRGVsbAlQRVJDIDIvUUMgKFF1YWQgQ2hhbm5lbCwgTXVzdGFuZykKKwkxMDI4OjAwMDE6MTAyODowMDAxCURlbGwJUEVSQyAyL1NpIChJZ3VhbmEpCisJMTAyODowMDAzOjEwMjg6MDAwMwlEZWxsCVBFUkMgMy9TaSAoU2xpbUZhc3QpCisJMTAyODowMDAyOjEwMjg6MDAwMglEZWxsCVBFUkMgMy9EaSAoT3BhbCkKKwkxMDI4OjAwMDQ6MTAyODowMDA0CURlbGwJUEVSQyAzL0RpRiAoSWd1YW5hKQorCTEwMjg6MDAwMjoxMDI4OjAwZDEJRGVsbAlQRVJDIDMvRGlWIChWaXBlcikKKwkxMDI4OjAwMDI6MTAyODowMGQ5CURlbGwJUEVSQyAzL0RpTCAoTGV4dXMpCisJMTAyODowMDBhOjEwMjg6MDEwNglEZWxsCVBFUkMgMy9EaUogKEphZ3VhcikKKwkxMDI4OjAwMGE6MTAyODowMTFiCURlbGwJUEVSQyAzL0RpRCAoRGFnZ2VyKQorCTEwMjg6MDAwYToxMDI4OjAxMjEJRGVsbAlQRVJDIDMvRGlCIChCb3hzdGVyKQorCTkwMDU6MDI4NToxMDI4OjAyODcJRGVsbAlQRVJDIDMyMC9EQyAoVnVsY2FuKQorCTkwMDU6MDI4NToxMDI4OjAyOTEJRGVsbAlDRVJDIDIgKERlbGxDb3JzYWlyKQorCTEwMTE6MDA0NjoxMDNjOjEwYzIJSFAJTmV0UkFJRC00TSAoTXVzdGFuZykKKwk5MDA1OjAyODU6MTdhYTowMjg2CUxlZ2VuZAlTMjIwIChDcnVzYWRlcikKKwk5MDA1OjAyODU6MTdhYTowMjg3CUxlZ2VuZAlTMjMwIChWdWxjYW4pCisJOTAwNTowMjg1OjkwMDU6MDI5MAlJQk0JU2VydmVSQUlEIDd0IChKYWd1YXIpCisJOTAwNTowMjg1OjEwMTQ6MDJGMglJQk0JU2VydmVSQUlEIDhpIChBdm9uUGFyaykKKwk5MDA1OjAyODU6MTAxNDowMzEyCUlCTQlTZXJ2ZVJBSUQgOGkgKEF2b25QYXJrTGl0ZSkKKwk5MDA1OjAyODY6MTAxNDo5NTgwCUlCTQlTZXJ2ZVJBSUQgOGsvOGstbDggKEF1cm9yYSkKKwk5MDA1OjAyODY6MTAxNDo5NTQwCUlCTQlTZXJ2ZVJBSUQgOGsvOGstbDQgKEF1cm9yYUxpdGUpCisJOTAwNTowMjg2OjkwMDU6MDI5ZglJQ1AJSUNQOTAxNFIwIChMYW5jZXIpCisJOTAwNTowMjg2OjkwMDU6MDI5ZQlJQ1AJSUNQOTAyNFIwIChMYW5jZXIpCisJOTAwNTowMjg2OjkwMDU6MDJhMAlJQ1AJSUNQOTA0N01BIChMYW5jZXIpCisJOTAwNTowMjg2OjkwMDU6MDJhMQlJQ1AJSUNQOTA4N01BIChMYW5jZXIpCisJOTAwNTowMjg2OjkwMDU6MDJhNAlJQ1AJSUNQOTA4NUxJIChNYXJhdWRlci1YKQorCTkwMDU6MDI4Njo5MDA1OjAyYTUJSUNQCUlDUDUwODVCUiAoTWFyYXVkZXItRSkKKwk5MDA1OjAyODY6OTAwNTowMmEzCUlDUAlJQ1A1MDg1QVUgKEh1cnJpY2FuZSkKKwk5MDA1OjAyODY6OTAwNTowMmE2CUlDUAlJQ1A5MDY3TUEgKEludHJ1ZGVyLTYpCisJOTAwNTowMjg2OjkwMDU6MDJhOQlJQ1AJSUNQNTA4N0FVIChTa3lyYXkpCisJOTAwNTowMjg2OjkwMDU6MDJhYQlJQ1AJSUNQNTA0N0FVIChTa3lyYXkpCisKK1Blb3BsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KK0NocmlzdG9waCBIZWxsd2lnIDxoY2hAaW5mcmFkZWFkLm9yZz4JKHVwZGF0ZXMgZm9yIG5ldy1zdHlsZSBQQ0kgcHJvYmluZyBhbmQgU0NTSSBob3N0IHJlZ2lzdHJhdGlvbiwKKwkJCQkJIHNtYWxsIGNsZWFudXBzL2ZpeGVzKQorTWF0dCBEb21zY2ggPG1hdHRfZG9tc2NoQGRlbGwuY29tPgkocmV2aXNpb24gaW9jdGwsIGFkYXB0ZXIgbWVzc2FnZXMpCitEZWFubmEgQm9uZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vbi1EQVNEIHN1cHBvcnQsIFBBRSBmaWJzIGFuZCA2NCBiaXQsIGFkZGVkIG5ldyBhZGFwdGVjIGNvbnRyb2xsZXJzCisJCQkJCSBhZGRlZCBuZXcgaW9jdGxzLCBjaGFuZ2VkIHNjc2kgaW50ZXJmYWNlIHRvIHVzZSBuZXcgZXJyb3IgaGFuZGxlciwKKwkJCQkJIGluY3JlYXNlZCB0aGUgbnVtYmVyIG9mIGZpYnMgYW5kIG91dHN0YW5kaW5nIGNvbW1hbmRzIHRvIGEgY29udGFpbmVyKQorCisJCQkJCShmaXhlZCA2NGJpdCBhbmQgNjRHIG1lbW9yeSBtb2RlbCwgY2hhbmdlZCBjb25mdXNpbmcgbmFtaW5nIGNvbnZlbnRpb24KKwkJCQkJIHdoZXJlIGZpYnMgdGhhdCBnbyB0byB0aGUgaGFyZHdhcmUgYXJlIGNvbnNpc3RlbnRseSBjYWxsZWQgaHdfZmlicyBhbmQKKwkJCQkJIG5vdCBqdXN0IGZpYnMgbGlrZSB0aGUgbmFtZSBvZiB0aGUgZHJpdmVyIHRyYWNraW5nIHN0cnVjdHVyZSkKK01hcmsgU2FseXp5biA8TWFya19TYWx5enluQGFkYXB0ZWMuY29tPiBGaXhlZCBwYW5pYyBpc3N1ZXMgYW5kIGFkZGVkIHNvbWUgbmV3IHByb2R1Y3QgaWRzIGZvciB1cGNvbWluZyBoYmFzLiBQZXJmb3JtYW5jZSB0dW5pbmcsIGNhcmQgZmFpbG92ZXIgYW5kIGJ1ZyBtaXRpZ2F0aW9ucy4KKworT3JpZ2luYWwgRHJpdmVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBZGFwdGVjIFVuaXggT0VNIFByb2R1Y3QgR3JvdXAKKworTWFpbGluZyBMaXN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZyAoSW50ZXJlc3RlZCBwYXJ0aWVzIHRyb2xsIGhlcmUpCitBbHNvIG5vdGUgdGhpcyBpcyB2ZXJ5IGRpZmZlcmVudCB0byBCcmlhbidzIG9yaWdpbmFsIGRyaXZlcgorc28gZG9uJ3QgZXhwZWN0IGhpbSB0byBzdXBwb3J0IGl0LgorQWRhcHRlYyBkb2VzIHN1cHBvcnQgdGhpcyBkcml2ZXIuICBDb250YWN0IEFkYXB0ZWMgdGVjaCBzdXBwb3J0IG9yCithYWNyYWlkQGFkYXB0ZWMuY29tCisKK09yaWdpbmFsIGJ5IEJyaWFuIEJvZXJuZXIgRmVicnVhcnkgMjAwMQorUmV3cml0dGVuIGJ5IEFsYW4gQ294LCBOb3ZlbWJlciAyMDAxCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvRG9jQm9vay93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnRtcGwgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvRG9jQm9vay93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnRtcGwKaW5kZXggNDk2M2Q4My4uZTY1MWVkOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0RvY0Jvb2svd3JpdGluZy1hbi1hbHNhLWRyaXZlci50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9Eb2NCb29rL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIudG1wbApAQCAtNTU3Nyw3ICs1NTc3LDcgQEAKICAgICAgIDxpbmZvcm1hbGV4YW1wbGU+CiAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KIDwhW0NEQVRBWwotICBzdGF0aWMgaW50IG15Y2hpcF9zdXNwZW5kKHN0cnV0IHBjaV9kZXYgKnBjaSwgcG1fbWVzc2FnZV90IHN0YXRlKQorICBzdGF0aWMgaW50IG15Y2hpcF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwY2ksIHBtX21lc3NhZ2VfdCBzdGF0ZSkKICAgewogICAgICAgICAgIC8qICgxKSAqLwogICAgICAgICAgIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2kpOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGkvYnV0dGVyZmx5IGIvRG9jdW1lbnRhdGlvbi9zcGkvYnV0dGVyZmx5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZThjOGQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3NwaS9idXR0ZXJmbHkKQEAgLTAsMCArMSw1NyBAQAorc3BpX2J1dHRlcmZseSAtIHBhcnBvcnQtdG8tYnV0dGVyZmx5IGFkYXB0ZXIgZHJpdmVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBpcyBhIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSBwcm9qZWN0IHRoYXQgaW5jbHVkZXMgYnVpbGRpbmcgYW5kIHVzaW5nCithIHBhcmFsbGVsIHBvcnQgYWRhcHRlciBjYWJsZSwgdG9nZXRoZXIgd2l0aCBhbiAiQVZSIEJ1dHRlcmZseSIgdG8gcnVuCitmaXJtd2FyZSBmb3IgdXNlciBpbnRlcmZhY2luZyBhbmQvb3Igc2Vuc29ycy4gIEEgQnV0dGVyZmx5IGlzIGEgJFVTMjAKK2JhdHRlcnkgcG93ZXJlZCBjYXJkIHdpdGggYW4gQVZSIG1pY3JvY29udHJvbGxlciBhbmQgbG90cyBvZiBnb29kaWVzOgorc2Vuc29ycywgTENELCBmbGFzaCwgdG9nZ2xlIHN0aWNrLCBhbmQgbW9yZS4gIFlvdSBjYW4gdXNlIEFWUi1HQ0MgdG8KK2RldmVsb3AgZmlybXdhcmUgZm9yIHRoaXMsIGFuZCBmbGFzaCBpdCB1c2luZyB0aGlzIGFkYXB0ZXIgY2FibGUuCisKK1lvdSBjYW4gbWFrZSB0aGlzIGFkYXB0ZXIgZnJvbSBhbiBvbGQgcHJpbnRlciBjYWJsZSBhbmQgc29sZGVyIHRoaW5ncworZGlyZWN0bHkgdG8gdGhlIEJ1dHRlcmZseS4gIE9yIChpZiB5b3UgaGF2ZSB0aGUgcGFydHMgYW5kIHNraWxscykgeW91CitjYW4gY29tZSB1cCB3aXRoIHNvbWV0aGluZyBmYW5jaWVyLCBwcm92aWRpbmcgY2lydWl0IHByb3RlY3Rpb24gdG8gdGhlCitCdXR0ZXJmbHkgYW5kIHRoZSBwcmludGVyIHBvcnQsIG9yIHdpdGggYSBiZXR0ZXIgcG93ZXIgc3VwcGx5IHRoYW4gdHdvCitzaWduYWwgcGlucyBmcm9tIHRoZSBwcmludGVyIHBvcnQuCisKKworVGhlIGZpcnN0IGNhYmxlIGNvbm5lY3Rpb25zIHdpbGwgaG9vayBMaW51eCB1cCB0byBvbmUgU1BJIGJ1cywgd2l0aCB0aGUKK0FWUiBhbmQgYSBEYXRhRmxhc2ggY2hpcDsgYW5kIHRvIHRoZSBBVlIgcmVzZXQgbGluZS4gIFRoaXMgaXMgYWxsIHlvdQorbmVlZCB0byByZWZsYXNoIHRoZSBmaXJtd2FyZSwgYW5kIHRoZSBwaW5zIGFyZSB0aGUgc3RhbmRhcmQgQXRtZWwgIklTUCIKK2Nvbm5lY3RvciBwaW5zICh1c2VkIGFsc28gb24gbm9uLUJ1dHRlcmZseSBBVlIgYm9hcmRzKS4KKworCVNpZ25hbAkgIEJ1dHRlcmZseQkgIFBhcnBvcnQgKERCLTI1KQorCS0tLS0tLQkgIC0tLS0tLS0tLQkgIC0tLS0tLS0tLS0tLS0tLQorCVNDSwk9IEo0MDMuUEIxL1NDSwk9IHBpbiAyL0QwCisJUkVTRVQJPSBKNDAzLm5SU1QJPSBwaW4gMy9EMQorCVZDQwk9IEo0MDMuVkNDX0VYVAk9IHBpbiA4L0Q2CisJTU9TSQk9IEo0MDMuUEIyL01PU0kJPSBwaW4gOS9ENworCU1JU08JPSBKNDAzLlBCMy9NSVNPCT0gcGluIDExL1M3LG5CVVNZCisJR05ECT0gSjQwMy5HTkQJPSBwaW4gMjMvR05ECisKK1RoZW4gdG8gbGV0IExpbnV4IG1hc3RlciB0aGF0IGJ1cyB0byB0YWxrIHRvIHRoZSBEYXRhRmxhc2ggY2hpcCwgeW91IG11c3QKKyhhKSBmbGFzaCBuZXcgZmlybXdhcmUgdGhhdCBkaXNhYmxlcyBTUEkgKHNldCBQUlIuMiwgYW5kIGRpc2FibGUgcHVsbHVwcworYnkgY2xlYXJpbmcgUE9SVEIuWzAtM10pOyAoYikgY29uZmlndXJlIHRoZSBtdGRfZGF0YWZsYXNoIGRyaXZlcjsgYW5kCisoYykgY2FibGUgaW4gdGhlIGNoaXBzZWxlY3QuCisKKwlTaWduYWwJICBCdXR0ZXJmbHkJICBQYXJwb3J0IChEQi0yNSkKKwktLS0tLS0JICAtLS0tLS0tLS0JICAtLS0tLS0tLS0tLS0tLS0KKwlWQ0MJPSBKNDAwLlZDQ19FWFQJPSBwaW4gNy9ENQorCVNFTEVDVAk9IEo0MDAuUEIwL25TUwk9IHBpbiAxNy9DMyxuU0VMRUNUCisJR05ECT0gSjQwMC5HTkQJPSBwaW4gMjQvR05ECisKK1RoZSAiVVNJIiBjb250cm9sbGVyLCB1c2luZyBKNDA1LCBjYW4gYmUgdXNlZCBmb3IgYSBzZWNvbmQgU1BJIGJ1cy4gIFRoYXQKK3dvdWxkIGxldCB5b3UgdGFsayB0byB0aGUgQVZSIG92ZXIgU1BJLCBydW5uaW5nIGZpcm13YXJlIHRoYXQgbWFrZXMgaXQgYWN0CithcyBhbiBTUEkgc2xhdmUsIHdoaWxlIGxldHRpbmcgZWl0aGVyIExpbnV4IG9yIHRoZSBBVlIgdXNlIHRoZSBEYXRhRmxhc2guCitUaGVyZSBhcmUgcGxlbnR5IG9mIHNwYXJlIHBhcnBvcnQgcGlucyB0byB3aXJlIHRoaXMgb25lIHVwLCBzdWNoIGFzOgorCisJU2lnbmFsCSAgQnV0dGVyZmx5CSAgUGFycG9ydCAoREItMjUpCisJLS0tLS0tCSAgLS0tLS0tLS0tCSAgLS0tLS0tLS0tLS0tLS0tCisJU0NLCT0gSjQwMy5QRTQvVVNDSwk9IHBpbiA1L0QzCisJTU9TSQk9IEo0MDMuUEU1L0RJCT0gcGluIDYvRDQKKwlNSVNPCT0gSjQwMy5QRTYvRE8JPSBwaW4gMTIvUzUsblBBUEVST1VUCisJR05ECT0gSjQwMy5HTkQJPSBwaW4gMjIvR05ECisKKwlJUlEJPSBKNDAyLlBGNAk9IHBpbiAxMC9TNixBQ0sKKwlHTkQJPSBKNDAyLkdORChQMikJPSBwaW4gMjUvR05ECisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3BpL3NwaS1zdW1tYXJ5IGIvRG9jdW1lbnRhdGlvbi9zcGkvc3BpLXN1bW1hcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVmZmJhMwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vc3BpL3NwaS1zdW1tYXJ5CkBAIC0wLDAgKzEsNDU3IEBACitPdmVydmlldyBvZiBMaW51eCBrZXJuZWwgU1BJIHN1cHBvcnQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCiswMi1EZWMtMjAwNQorCitXaGF0IGlzIFNQST8KKy0tLS0tLS0tLS0tLQorVGhlICJTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UiIChTUEkpIGlzIGEgc3luY2hyb25vdXMgZm91ciB3aXJlIHNlcmlhbAorbGluayB1c2VkIHRvIGNvbm5lY3QgbWljcm9jb250cm9sbGVycyB0byBzZW5zb3JzLCBtZW1vcnksIGFuZCBwZXJpcGhlcmFscy4KKworVGhlIHRocmVlIHNpZ25hbCB3aXJlcyBob2xkIGEgY2xvY2sgKFNDTEssIG9mdGVuIG9uIHRoZSBvcmRlciBvZiAxMCBNSHopLAorYW5kIHBhcmFsbGVsIGRhdGEgbGluZXMgd2l0aCAiTWFzdGVyIE91dCwgU2xhdmUgSW4iIChNT1NJKSBvciAiTWFzdGVyIEluLAorU2xhdmUgT3V0IiAoTUlTTykgc2lnbmFscy4gIChPdGhlciBuYW1lcyBhcmUgYWxzbyB1c2VkLikgIFRoZXJlIGFyZSBmb3VyCitjbG9ja2luZyBtb2RlcyB0aHJvdWdoIHdoaWNoIGRhdGEgaXMgZXhjaGFuZ2VkOyBtb2RlLTAgYW5kIG1vZGUtMyBhcmUgbW9zdAorY29tbW9ubHkgdXNlZC4gIEVhY2ggY2xvY2sgY3ljbGUgc2hpZnRzIGRhdGEgb3V0IGFuZCBkYXRhIGluOyB0aGUgY2xvY2sKK2RvZXNuJ3QgY3ljbGUgZXhjZXB0IHdoZW4gdGhlcmUgaXMgZGF0YSB0byBzaGlmdC4KKworU1BJIG1hc3RlcnMgbWF5IHVzZSBhICJjaGlwIHNlbGVjdCIgbGluZSB0byBhY3RpdmF0ZSBhIGdpdmVuIFNQSSBzbGF2ZQorZGV2aWNlLCBzbyB0aG9zZSB0aHJlZSBzaWduYWwgd2lyZXMgbWF5IGJlIGNvbm5lY3RlZCB0byBzZXZlcmFsIGNoaXBzCitpbiBwYXJhbGxlbC4gIEFsbCBTUEkgc2xhdmVzIHN1cHBvcnQgY2hpcHNlbGVjdHMuICBTb21lIGRldmljZXMgaGF2ZQorb3RoZXIgc2lnbmFscywgb2Z0ZW4gaW5jbHVkaW5nIGFuIGludGVycnVwdCB0byB0aGUgbWFzdGVyLgorCitVbmxpa2Ugc2VyaWFsIGJ1c3NlcyBsaWtlIFVTQiBvciBTTUJVUywgZXZlbiBsb3cgbGV2ZWwgcHJvdG9jb2xzIGZvcgorU1BJIHNsYXZlIGZ1bmN0aW9ucyBhcmUgdXN1YWxseSBub3QgaW50ZXJvcGVyYWJsZSBiZXR3ZWVuIHZlbmRvcnMKKyhleGNlcHQgZm9yIGNhc2VzIGxpa2UgU1BJIG1lbW9yeSBjaGlwcykuCisKKyAgLSBTUEkgbWF5IGJlIHVzZWQgZm9yIHJlcXVlc3QvcmVzcG9uc2Ugc3R5bGUgZGV2aWNlIHByb3RvY29scywgYXMgd2l0aAorICAgIHRvdWNoc2NyZWVuIHNlbnNvcnMgYW5kIG1lbW9yeSBjaGlwcy4KKworICAtIEl0IG1heSBhbHNvIGJlIHVzZWQgdG8gc3RyZWFtIGRhdGEgaW4gZWl0aGVyIGRpcmVjdGlvbiAoaGFsZiBkdXBsZXgpLAorICAgIG9yIGJvdGggb2YgdGhlbSBhdCB0aGUgc2FtZSB0aW1lIChmdWxsIGR1cGxleCkuCisKKyAgLSBTb21lIGRldmljZXMgbWF5IHVzZSBlaWdodCBiaXQgd29yZHMuICBPdGhlcnMgbWF5IGRpZmZlcmVudCB3b3JkCisgICAgbGVuZ3Rocywgc3VjaCBhcyBzdHJlYW1zIG9mIDEyLWJpdCBvciAyMC1iaXQgZGlnaXRhbCBzYW1wbGVzLgorCitJbiB0aGUgc2FtZSB3YXksIFNQSSBzbGF2ZXMgd2lsbCBvbmx5IHJhcmVseSBzdXBwb3J0IGFueSBraW5kIG9mIGF1dG9tYXRpYworZGlzY292ZXJ5L2VudW1lcmF0aW9uIHByb3RvY29sLiAgVGhlIHRyZWUgb2Ygc2xhdmUgZGV2aWNlcyBhY2Nlc3NpYmxlIGZyb20KK2EgZ2l2ZW4gU1BJIG1hc3RlciB3aWxsIG5vcm1hbGx5IGJlIHNldCB1cCBtYW51YWxseSwgd2l0aCBjb25maWd1cmF0aW9uCit0YWJsZXMuCisKK1NQSSBpcyBvbmx5IG9uZSBvZiB0aGUgbmFtZXMgdXNlZCBieSBzdWNoIGZvdXItd2lyZSBwcm90b2NvbHMsIGFuZAorbW9zdCBjb250cm9sbGVycyBoYXZlIG5vIHByb2JsZW0gaGFuZGxpbmcgIk1pY3JvV2lyZSIgKHRoaW5rIG9mIGl0IGFzCitoYWxmLWR1cGxleCBTUEksIGZvciByZXF1ZXN0L3Jlc3BvbnNlIHByb3RvY29scyksIFNTUCAoIlN5bmNocm9ub3VzCitTZXJpYWwgUHJvdG9jb2wiKSwgUFNQICgiUHJvZ3JhbW1hYmxlIFNlcmlhbCBQcm90b2NvbCIpLCBhbmQgb3RoZXIKK3JlbGF0ZWQgcHJvdG9jb2xzLgorCitNaWNyb2NvbnRyb2xsZXJzIG9mdGVuIHN1cHBvcnQgYm90aCBtYXN0ZXIgYW5kIHNsYXZlIHNpZGVzIG9mIHRoZSBTUEkKK3Byb3RvY29sLiAgVGhpcyBkb2N1bWVudCAoYW5kIExpbnV4KSBjdXJyZW50bHkgb25seSBzdXBwb3J0cyB0aGUgbWFzdGVyCitzaWRlIG9mIFNQSSBpbnRlcmFjdGlvbnMuCisKKworV2hvIHVzZXMgaXQ/ICBPbiB3aGF0IGtpbmRzIG9mIHN5c3RlbXM/CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xpbnV4IGRldmVsb3BlcnMgdXNpbmcgU1BJIGFyZSBwcm9iYWJseSB3cml0aW5nIGRldmljZSBkcml2ZXJzIGZvciBlbWJlZGRlZAorc3lzdGVtcyBib2FyZHMuICBTUEkgaXMgdXNlZCB0byBjb250cm9sIGV4dGVybmFsIGNoaXBzLCBhbmQgaXQgaXMgYWxzbyBhCitwcm90b2NvbCBzdXBwb3J0ZWQgYnkgZXZlcnkgTU1DIG9yIFNEIG1lbW9yeSBjYXJkLiAgKFRoZSBvbGRlciAiRGF0YUZsYXNoIgorY2FyZHMsIHByZWRhdGluZyBNTUMgY2FyZHMgYnV0IHVzaW5nIHRoZSBzYW1lIGNvbm5lY3RvcnMgYW5kIGNhcmQgc2hhcGUsCitzdXBwb3J0IG9ubHkgU1BJLikgIFNvbWUgUEMgaGFyZHdhcmUgdXNlcyBTUEkgZmxhc2ggZm9yIEJJT1MgY29kZS4KKworU1BJIHNsYXZlIGNoaXBzIHJhbmdlIGZyb20gZGlnaXRhbC9hbmFsb2cgY29udmVydGVycyB1c2VkIGZvciBhbmFsb2cKK3NlbnNvcnMgYW5kIGNvZGVjcywgdG8gbWVtb3J5LCB0byBwZXJpcGhlcmFscyBsaWtlIFVTQiBjb250cm9sbGVycworb3IgRXRoZXJuZXQgYWRhcHRlcnM7IGFuZCBtb3JlLgorCitNb3N0IHN5c3RlbXMgdXNpbmcgU1BJIHdpbGwgaW50ZWdyYXRlIGEgZmV3IGRldmljZXMgb24gYSBtYWluYm9hcmQuCitTb21lIHByb3ZpZGUgU1BJIGxpbmtzIG9uIGV4cGFuc2lvbiBjb25uZWN0b3JzOyBpbiBjYXNlcyB3aGVyZSBubworZGVkaWNhdGVkIFNQSSBjb250cm9sbGVyIGV4aXN0cywgR1BJTyBwaW5zIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhCitsb3cgc3BlZWQgImJpdGJhbmdpbmciIGFkYXB0ZXIuICBWZXJ5IGZldyBzeXN0ZW1zIHdpbGwgImhvdHBsdWciIGFuIFNQSQorY29udHJvbGxlcjsgdGhlIHJlYXNvbnMgdG8gdXNlIFNQSSBmb2N1cyBvbiBsb3cgY29zdCBhbmQgc2ltcGxlIG9wZXJhdGlvbiwKK2FuZCBpZiBkeW5hbWljIHJlY29uZmlndXJhdGlvbiBpcyBpbXBvcnRhbnQsIFVTQiB3aWxsIG9mdGVuIGJlIGEgbW9yZQorYXBwcm9wcmlhdGUgbG93LXBpbmNvdW50IHBlcmlwaGVyYWwgYnVzLgorCitNYW55IG1pY3JvY29udHJvbGxlcnMgdGhhdCBjYW4gcnVuIExpbnV4IGludGVncmF0ZSBvbmUgb3IgbW9yZSBJL08KK2ludGVyZmFjZXMgd2l0aCBTUEkgbW9kZXMuICBHaXZlbiBTUEkgc3VwcG9ydCwgdGhleSBjb3VsZCB1c2UgTU1DIG9yIFNECitjYXJkcyB3aXRob3V0IG5lZWRpbmcgYSBzcGVjaWFsIHB1cnBvc2UgTU1DL1NEL1NESU8gY29udHJvbGxlci4KKworCitIb3cgZG8gdGhlc2UgZHJpdmVyIHByb2dyYW1taW5nIGludGVyZmFjZXMgd29yaz8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIDxsaW51eC9zcGkvc3BpLmg+IGhlYWRlciBmaWxlIGluY2x1ZGVzIGtlcm5lbGRvYywgYXMgZG9lcyB0aGUKK21haW4gc291cmNlIGNvZGUsIGFuZCB5b3Ugc2hvdWxkIGNlcnRhaW5seSByZWFkIHRoYXQuICBUaGlzIGlzIGp1c3QKK2FuIG92ZXJ2aWV3LCBzbyB5b3UgZ2V0IHRoZSBiaWcgcGljdHVyZSBiZWZvcmUgdGhlIGRldGFpbHMuCisKK1NQSSByZXF1ZXN0cyBhbHdheXMgZ28gaW50byBJL08gcXVldWVzLiAgUmVxdWVzdHMgZm9yIGEgZ2l2ZW4gU1BJIGRldmljZQorYXJlIGFsd2F5cyBleGVjdXRlZCBpbiBGSUZPIG9yZGVyLCBhbmQgY29tcGxldGUgYXN5bmNocm9ub3VzbHkgdGhyb3VnaAorY29tcGxldGlvbiBjYWxsYmFja3MuICBUaGVyZSBhcmUgYWxzbyBzb21lIHNpbXBsZSBzeW5jaHJvbm91cyB3cmFwcGVycworZm9yIHRob3NlIGNhbGxzLCBpbmNsdWRpbmcgb25lcyBmb3IgY29tbW9uIHRyYW5zYWN0aW9uIHR5cGVzIGxpa2Ugd3JpdGluZworYSBjb21tYW5kIGFuZCB0aGVuIHJlYWRpbmcgaXRzIHJlc3BvbnNlLgorCitUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIFNQSSBkcml2ZXIsIGhlcmUgY2FsbGVkOgorCisgIENvbnRyb2xsZXIgZHJpdmVycyAuLi4gdGhlc2UgYXJlIG9mdGVuIGJ1aWx0IGluIHRvIFN5c3RlbS1Pbi1DaGlwCisJcHJvY2Vzc29ycywgYW5kIG9mdGVuIHN1cHBvcnQgYm90aCBNYXN0ZXIgYW5kIFNsYXZlIHJvbGVzLgorCVRoZXNlIGRyaXZlcnMgdG91Y2ggaGFyZHdhcmUgcmVnaXN0ZXJzIGFuZCBtYXkgdXNlIERNQS4KKwlPciB0aGV5IGNhbiBiZSBQSU8gYml0YmFuZ2VycywgbmVlZGluZyBqdXN0IEdQSU8gcGlucy4KKworICBQcm90b2NvbCBkcml2ZXJzIC4uLiB0aGVzZSBwYXNzIG1lc3NhZ2VzIHRocm91Z2ggdGhlIGNvbnRyb2xsZXIKKwlkcml2ZXIgdG8gY29tbXVuaWNhdGUgd2l0aCBhIFNsYXZlIG9yIE1hc3RlciBkZXZpY2Ugb24gdGhlCisJb3RoZXIgc2lkZSBvZiBhbiBTUEkgbGluay4KKworU28gZm9yIGV4YW1wbGUgb25lIHByb3RvY29sIGRyaXZlciBtaWdodCB0YWxrIHRvIHRoZSBNVEQgbGF5ZXIgdG8gZXhwb3J0CitkYXRhIHRvIGZpbGVzeXN0ZW1zIHN0b3JlZCBvbiBTUEkgZmxhc2ggbGlrZSBEYXRhRmxhc2g7IGFuZCBvdGhlcnMgbWlnaHQKK2NvbnRyb2wgYXVkaW8gaW50ZXJmYWNlcywgcHJlc2VudCB0b3VjaHNjcmVlbiBzZW5zb3JzIGFzIGlucHV0IGludGVyZmFjZXMsCitvciBtb25pdG9yIHRlbXBlcmF0dXJlIGFuZCB2b2x0YWdlIGxldmVscyBkdXJpbmcgaW5kdXN0cmlhbCBwcm9jZXNzaW5nLgorQW5kIHRob3NlIG1pZ2h0IGFsbCBiZSBzaGFyaW5nIHRoZSBzYW1lIGNvbnRyb2xsZXIgZHJpdmVyLgorCitBICJzdHJ1Y3Qgc3BpX2RldmljZSIgZW5jYXBzdWxhdGVzIHRoZSBtYXN0ZXItc2lkZSBpbnRlcmZhY2UgYmV0d2VlbgordGhvc2UgdHdvIHR5cGVzIG9mIGRyaXZlci4gIEF0IHRoaXMgd3JpdGluZywgTGludXggaGFzIG5vIHNsYXZlIHNpZGUKK3Byb2dyYW1taW5nIGludGVyZmFjZS4KKworVGhlcmUgaXMgYSBtaW5pbWFsIGNvcmUgb2YgU1BJIHByb2dyYW1taW5nIGludGVyZmFjZXMsIGZvY3Vzc2luZyBvbgordXNpbmcgZHJpdmVyIG1vZGVsIHRvIGNvbm5lY3QgY29udHJvbGxlciBhbmQgcHJvdG9jb2wgZHJpdmVycyB1c2luZworZGV2aWNlIHRhYmxlcyBwcm92aWRlZCBieSBib2FyZCBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiBjb2RlLiAgU1BJCitzaG93cyB1cCBpbiBzeXNmcyBpbiBzZXZlcmFsIGxvY2F0aW9uczoKKworICAgL3N5cy9kZXZpY2VzLy4uLi9DVExSL3NwaUIuQyAuLi4gc3BpX2RldmljZSBmb3Igb24gYnVzICJCIiwKKwljaGlwc2VsZWN0IEMsIGFjY2Vzc2VkIHRocm91Z2ggQ1RMUi4KKworICAgL3N5cy9kZXZpY2VzLy4uLi9DVExSL3NwaUIuQy9tb2RhbGlhcyAuLi4gaWRlbnRpZmllcyB0aGUgZHJpdmVyCisJdGhhdCBzaG91bGQgYmUgdXNlZCB3aXRoIHRoaXMgZGV2aWNlIChmb3IgaG90cGx1Zy9jb2xkcGx1ZykKKworICAgL3N5cy9idXMvc3BpL2RldmljZXMvc3BpQi5DIC4uLiBzeW1saW5rIHRvIHRoZSBwaHlzaWNhbAorICAgCXNwaUItQyBkZXZpY2UKKworICAgL3N5cy9idXMvc3BpL2RyaXZlcnMvRCAuLi4gZHJpdmVyIGZvciBvbmUgb3IgbW9yZSBzcGkqLiogZGV2aWNlcworCisgICAvc3lzL2NsYXNzL3NwaV9tYXN0ZXIvc3BpQiAuLi4gY2xhc3MgZGV2aWNlIGZvciB0aGUgY29udHJvbGxlcgorCW1hbmFnaW5nIGJ1cyAiQiIuICBBbGwgdGhlIHNwaUIuKiBkZXZpY2VzIHNoYXJlIHRoZSBzYW1lCisJcGh5c2ljYWwgU1BJIGJ1cyBzZWdtZW50LCB3aXRoIFNDTEssIE1PU0ksIGFuZCBNSVNPLgorCisKK0hvdyBkb2VzIGJvYXJkLXNwZWNpZmljIGluaXQgY29kZSBkZWNsYXJlIFNQSSBkZXZpY2VzPworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMaW51eCBuZWVkcyBzZXZlcmFsIGtpbmRzIG9mIGluZm9ybWF0aW9uIHRvIHByb3Blcmx5IGNvbmZpZ3VyZSBTUEkgZGV2aWNlcy4KK1RoYXQgaW5mb3JtYXRpb24gaXMgbm9ybWFsbHkgcHJvdmlkZWQgYnkgYm9hcmQtc3BlY2lmaWMgY29kZSwgZXZlbiBmb3IKK2NoaXBzIHRoYXQgZG8gc3VwcG9ydCBzb21lIG9mIGF1dG9tYXRlZCBkaXNjb3ZlcnkvZW51bWVyYXRpb24uCisKK0RFQ0xBUkUgQ09OVFJPTExFUlMKKworVGhlIGZpcnN0IGtpbmQgb2YgaW5mb3JtYXRpb24gaXMgYSBsaXN0IG9mIHdoYXQgU1BJIGNvbnRyb2xsZXJzIGV4aXN0LgorRm9yIFN5c3RlbS1vbi1DaGlwIChTT0MpIGJhc2VkIGJvYXJkcywgdGhlc2Ugd2lsbCB1c3VhbGx5IGJlIHBsYXRmb3JtCitkZXZpY2VzLCBhbmQgdGhlIGNvbnRyb2xsZXIgbWF5IG5lZWQgc29tZSBwbGF0Zm9ybV9kYXRhIGluIG9yZGVyIHRvCitvcGVyYXRlIHByb3Blcmx5LiAgVGhlICJzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIiB3aWxsIGluY2x1ZGUgcmVzb3VyY2VzCitsaWtlIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBjb250cm9sbGVyJ3MgZmlyc3QgcmVnaXN0ZXIgYW5kIGl0cyBJUlEuCisKK1BsYXRmb3JtcyB3aWxsIG9mdGVuIGFic3RyYWN0IHRoZSAicmVnaXN0ZXIgU1BJIGNvbnRyb2xsZXIiIG9wZXJhdGlvbiwKK21heWJlIGNvdXBsaW5nIGl0IHdpdGggY29kZSB0byBpbml0aWFsaXplIHBpbiBjb25maWd1cmF0aW9ucywgc28gdGhhdAordGhlIGFyY2gvLi4uL21hY2gtKi9ib2FyZC0qLmMgZmlsZXMgZm9yIHNldmVyYWwgYm9hcmRzIGNhbiBhbGwgc2hhcmUgdGhlCitzYW1lIGJhc2ljIGNvbnRyb2xsZXIgc2V0dXAgY29kZS4gIFRoaXMgaXMgYmVjYXVzZSBtb3N0IFNPQ3MgaGF2ZSBzZXZlcmFsCitTUEktY2FwYWJsZSBjb250cm9sbGVycywgYW5kIG9ubHkgdGhlIG9uZXMgYWN0dWFsbHkgdXNhYmxlIG9uIGEgZ2l2ZW4KK2JvYXJkIHNob3VsZCBub3JtYWxseSBiZSBzZXQgdXAgYW5kIHJlZ2lzdGVyZWQuCisKK1NvIGZvciBleGFtcGxlIGFyY2gvLi4uL21hY2gtKi9ib2FyZC0qLmMgZmlsZXMgbWlnaHQgaGF2ZSBjb2RlIGxpa2U6CisKKwkjaW5jbHVkZSA8YXNtL2FyY2gvc3BpLmg+CS8qIGZvciBteXNvY19zcGlfZGF0YSAqLworCisJLyogaWYgeW91ciBtYWNoLSogaW5mcmFzdHJ1Y3R1cmUgZG9lc24ndCBzdXBwb3J0IGtlcm5lbHMgdGhhdCBjYW4KKwkgKiBydW4gb24gbXVsdGlwbGUgYm9hcmRzLCBwZGF0YSB3b3VsZG4ndCBiZW5lZml0IGZyb20gIl9faW5pdCIuCisJICovCisJc3RhdGljIHN0cnVjdCBteXNvY19zcGlfZGF0YSBfX2luaXQgcGRhdGEgPSB7IC4uLiB9OworCisJc3RhdGljIF9faW5pdCBib2FyZF9pbml0KHZvaWQpCisJeworCQkuLi4KKwkJLyogdGhpcyBib2FyZCBvbmx5IHVzZXMgU1BJIGNvbnRyb2xsZXIgIzIgKi8KKwkJbXlzb2NfcmVnaXN0ZXJfc3BpKDIsICZwZGF0YSk7CisJCS4uLgorCX0KKworQW5kIFNPQy1zcGVjaWZpYyB1dGlsaXR5IGNvZGUgbWlnaHQgbG9vayBzb21ldGhpbmcgbGlrZToKKworCSNpbmNsdWRlIDxhc20vYXJjaC9zcGkuaD4KKworCXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNwaTIgPSB7IC4uLiB9OworCisJdm9pZCBteXNvY19yZWdpc3Rlcl9zcGkodW5zaWduZWQgbiwgc3RydWN0IG15c29jX3NwaV9kYXRhICpwZGF0YSkKKwl7CisJCXN0cnVjdCBteXNvY19zcGlfZGF0YSAqcGRhdGEyOworCisJCXBkYXRhMiA9IGttYWxsb2Moc2l6ZW9mICpwZGF0YTIsIEdGUF9LRVJORUwpOworCQkqcGRhdGEyID0gcGRhdGE7CisJCS4uLgorCQlpZiAobiA9PSAyKSB7CisJCQlzcGkyLT5kZXYucGxhdGZvcm1fZGF0YSA9IHBkYXRhMjsKKwkJCXJlZ2lzdGVyX3BsYXRmb3JtX2RldmljZSgmc3BpMik7CisKKwkJCS8qIGFsc286IHNldCB1cCBwaW4gbW9kZXMgc28gdGhlIHNwaTIgc2lnbmFscyBhcmUKKwkJCSAqIHZpc2libGUgb24gdGhlIHJlbGV2YW50IHBpbnMgLi4uIGJvb3Rsb2FkZXJzIG9uCisJCQkgKiBwcm9kdWN0aW9uIGJvYXJkcyBtYXkgYWxyZWFkeSBoYXZlIGRvbmUgdGhpcywgYnV0CisJCQkgKiBkZXZlbG9wZXIgYm9hcmRzIHdpbGwgb2Z0ZW4gbmVlZCBMaW51eCB0byBkbyBpdC4KKwkJCSAqLworCQl9CisJCS4uLgorCX0KKworTm90aWNlIGhvdyB0aGUgcGxhdGZvcm1fZGF0YSBmb3IgYm9hcmRzIG1heSBiZSBkaWZmZXJlbnQsIGV2ZW4gaWYgdGhlCitzYW1lIFNPQyBjb250cm9sbGVyIGlzIHVzZWQuICBGb3IgZXhhbXBsZSwgb24gb25lIGJvYXJkIFNQSSBtaWdodCB1c2UKK2FuIGV4dGVybmFsIGNsb2NrLCB3aGVyZSBhbm90aGVyIGRlcml2ZXMgdGhlIFNQSSBjbG9jayBmcm9tIGN1cnJlbnQKK3NldHRpbmdzIG9mIHNvbWUgbWFzdGVyIGNsb2NrLgorCisKK0RFQ0xBUkUgU0xBVkUgREVWSUNFUworCitUaGUgc2Vjb25kIGtpbmQgb2YgaW5mb3JtYXRpb24gaXMgYSBsaXN0IG9mIHdoYXQgU1BJIHNsYXZlIGRldmljZXMgZXhpc3QKK29uIHRoZSB0YXJnZXQgYm9hcmQsIG9mdGVuIHdpdGggc29tZSBib2FyZC1zcGVjaWZpYyBkYXRhIG5lZWRlZCBmb3IgdGhlCitkcml2ZXIgdG8gd29yayBjb3JyZWN0bHkuCisKK05vcm1hbGx5IHlvdXIgYXJjaC8uLi4vbWFjaC0qL2JvYXJkLSouYyBmaWxlcyB3b3VsZCBwcm92aWRlIGEgc21hbGwgdGFibGUKK2xpc3RpbmcgdGhlIFNQSSBkZXZpY2VzIG9uIGVhY2ggYm9hcmQuICAoVGhpcyB3b3VsZCB0eXBpY2FsbHkgYmUgb25seSBhCitzbWFsbCBoYW5kZnVsLikgIFRoYXQgbWlnaHQgbG9vayBsaWtlOgorCisJc3RhdGljIHN0cnVjdCBhZHM3ODQ2X3BsYXRmb3JtX2RhdGEgYWRzX2luZm8gPSB7CisJCS52cmVmX2RlbGF5X3VzZWNzCT0gMTAwLAorCQkueF9wbGF0ZV9vaG1zCQk9IDU4MCwKKwkJLnlfcGxhdGVfb2htcwkJPSA0MTAsCisJfTsKKworCXN0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gc3BpX2JvYXJkX2luZm9bXSBfX2luaXRkYXRhID0geworCXsKKwkJLm1vZGFsaWFzCT0gImFkczc4NDYiLAorCQkucGxhdGZvcm1fZGF0YQk9ICZhZHNfaW5mbywKKwkJLm1vZGUJCT0gU1BJX01PREVfMCwKKwkJLmlycQkJPSBHUElPX0lSUSgzMSksCisJCS5tYXhfc3BlZWRfaHoJPSAxMjAwMDAgLyogbWF4IHNhbXBsZSByYXRlIGF0IDNWICovICogMTYsCisJCS5idXNfbnVtCT0gMSwKKwkJLmNoaXBfc2VsZWN0CT0gMCwKKwl9LAorCX07CisKK0FnYWluLCBub3RpY2UgaG93IGJvYXJkLXNwZWNpZmljIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkOyBlYWNoIGNoaXAgbWF5IG5lZWQKK3NldmVyYWwgdHlwZXMuICBUaGlzIGV4YW1wbGUgc2hvd3MgZ2VuZXJpYyBjb25zdHJhaW50cyBsaWtlIHRoZSBmYXN0ZXN0IFNQSQorY2xvY2sgdG8gYWxsb3cgKGEgZnVuY3Rpb24gb2YgYm9hcmQgdm9sdGFnZSBpbiB0aGlzIGNhc2UpIG9yIGhvdyBhbiBJUlEgcGluCitpcyB3aXJlZCwgcGx1cyBjaGlwLXNwZWNpZmljIGNvbnN0cmFpbnRzIGxpa2UgYW4gaW1wb3J0YW50IGRlbGF5IHRoYXQncworY2hhbmdlZCBieSB0aGUgY2FwYWNpdGFuY2UgYXQgb25lIHBpbi4KKworKFRoZXJlJ3MgYWxzbyAiY29udHJvbGxlcl9kYXRhIiwgaW5mb3JtYXRpb24gdGhhdCBtYXkgYmUgdXNlZnVsIHRvIHRoZQorY29udHJvbGxlciBkcml2ZXIuICBBbiBleGFtcGxlIHdvdWxkIGJlIHBlcmlwaGVyYWwtc3BlY2lmaWMgRE1BIHR1bmluZworZGF0YSBvciBjaGlwc2VsZWN0IGNhbGxiYWNrcy4gIFRoaXMgaXMgc3RvcmVkIGluIHNwaV9kZXZpY2UgbGF0ZXIuKQorCitUaGUgYm9hcmRfaW5mbyBzaG91bGQgcHJvdmlkZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gbGV0IHRoZSBzeXN0ZW0gd29yaword2l0aG91dCB0aGUgY2hpcCdzIGRyaXZlciBiZWluZyBsb2FkZWQuICBUaGUgbW9zdCB0cm91Ymxlc29tZSBhc3BlY3Qgb2YKK3RoYXQgaXMgbGlrZWx5IHRoZSBTUElfQ1NfSElHSCBiaXQgaW4gdGhlIHNwaV9kZXZpY2UubW9kZSBmaWVsZCwgc2luY2UKK3NoYXJpbmcgYSBidXMgd2l0aCBhIGRldmljZSB0aGF0IGludGVycHJldHMgY2hpcHNlbGVjdCAiYmFja3dhcmRzIiBpcworbm90IHBvc3NpYmxlLgorCitUaGVuIHlvdXIgYm9hcmQgaW5pdGlhbGl6YXRpb24gY29kZSB3b3VsZCByZWdpc3RlciB0aGF0IHRhYmxlIHdpdGggdGhlIFNQSQoraW5mcmFzdHJ1Y3R1cmUsIHNvIHRoYXQgaXQncyBhdmFpbGFibGUgbGF0ZXIgd2hlbiB0aGUgU1BJIG1hc3RlciBjb250cm9sbGVyCitkcml2ZXIgaXMgcmVnaXN0ZXJlZDoKKworCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKHNwaV9ib2FyZF9pbmZvLCBBUlJBWV9TSVpFKHNwaV9ib2FyZF9pbmZvKSk7CisKK0xpa2Ugd2l0aCBvdGhlciBzdGF0aWMgYm9hcmQtc3BlY2lmaWMgc2V0dXAsIHlvdSB3b24ndCB1bnJlZ2lzdGVyIHRob3NlLgorCitUaGUgd2lkZWx5IHVzZWQgImNhcmQiIHN0eWxlIGNvbXB1dGVycyBidW5kbGUgbWVtb3J5LCBjcHUsIGFuZCBsaXR0bGUgZWxzZQorb250byBhIGNhcmQgdGhhdCdzIG1heWJlIGp1c3QgdGhpcnR5IHNxdWFyZSBjZW50aW1ldGVycy4gIE9uIHN1Y2ggc3lzdGVtcywKK3lvdXIgYXJjaC8uLi4vbWFjaC0uLi4vYm9hcmQtKi5jIGZpbGUgd291bGQgcHJpbWFyaWx5IHByb3ZpZGUgaW5mb3JtYXRpb24KK2Fib3V0IHRoZSBkZXZpY2VzIG9uIHRoZSBtYWluYm9hcmQgaW50byB3aGljaCBzdWNoIGEgY2FyZCBpcyBwbHVnZ2VkLiAgVGhhdAorY2VydGFpbmx5IGluY2x1ZGVzIFNQSSBkZXZpY2VzIGhvb2tlZCB1cCB0aHJvdWdoIHRoZSBjYXJkIGNvbm5lY3RvcnMhCisKKworTk9OLVNUQVRJQyBDT05GSUdVUkFUSU9OUworCitEZXZlbG9wZXIgYm9hcmRzIG9mdGVuIHBsYXkgYnkgZGlmZmVyZW50IHJ1bGVzIHRoYW4gcHJvZHVjdCBib2FyZHMsIGFuZCBvbmUKK2V4YW1wbGUgaXMgdGhlIHBvdGVudGlhbCBuZWVkIHRvIGhvdHBsdWcgU1BJIGRldmljZXMgYW5kL29yIGNvbnRyb2xsZXJzLgorCitGb3IgdGhvc2UgY2FzZXMgeW91IG1pZ2h0IG5lZWQgdG8gdXNlIHVzZSBzcGlfYnVzbnVtX3RvX21hc3RlcigpIHRvIGxvb2sKK3VwIHRoZSBzcGkgYnVzIG1hc3RlciwgYW5kIHdpbGwgbGlrZWx5IG5lZWQgc3BpX25ld19kZXZpY2UoKSB0byBwcm92aWRlIHRoZQorYm9hcmQgaW5mbyBiYXNlZCBvbiB0aGUgYm9hcmQgdGhhdCB3YXMgaG90cGx1Z2dlZC4gIE9mIGNvdXJzZSwgeW91J2QgbGF0ZXIKK2NhbGwgYXQgbGVhc3Qgc3BpX3VucmVnaXN0ZXJfZGV2aWNlKCkgd2hlbiB0aGF0IGJvYXJkIGlzIHJlbW92ZWQuCisKK1doZW4gTGludXggaW5jbHVkZXMgc3VwcG9ydCBmb3IgTU1DL1NEL1NESU8vRGF0YUZsYXNoIGNhcmRzIHRocm91Z2ggU1BJLCB0aG9zZQorY29uZmlndXJhdGlvbnMgd2lsbCBhbHNvIGJlIGR5bmFtaWMuICBGb3J0dW5hdGVseSwgdGhvc2UgZGV2aWNlcyBhbGwgc3VwcG9ydAorYmFzaWMgZGV2aWNlIGlkZW50aWZpY2F0aW9uIHByb2Jlcywgc28gdGhhdCBzdXBwb3J0IHNob3VsZCBob3RwbHVnIG5vcm1hbGx5LgorCisKK0hvdyBkbyBJIHdyaXRlIGFuICJTUEkgUHJvdG9jb2wgRHJpdmVyIj8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FsbCBTUEkgZHJpdmVycyBhcmUgY3VycmVudGx5IGtlcm5lbCBkcml2ZXJzLiAgQSB1c2Vyc3BhY2UgZHJpdmVyIEFQSQord291bGQganVzdCBiZSBhbm90aGVyIGtlcm5lbCBkcml2ZXIsIHByb2JhYmx5IG9mZmVyaW5nIHNvbWUgbG93bGV2ZWwKK2FjY2VzcyB0aHJvdWdoIGFpb19yZWFkKCksIGFpb193cml0ZSgpLCBhbmQgaW9jdGwoKSBjYWxscyBhbmQgdXNpbmcgdGhlCitzdGFuZGFyZCB1c2Vyc3BhY2Ugc3lzZnMgbWVjaGFuaXNtcyB0byBiaW5kIHRvIGEgZ2l2ZW4gU1BJIGRldmljZS4KKworU1BJIHByb3RvY29sIGRyaXZlcnMgc29tZXdoYXQgcmVzZW1ibGUgcGxhdGZvcm0gZGV2aWNlIGRyaXZlcnM6CisKKwlzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgQ0hJUF9kcml2ZXIgPSB7CisJCS5kcml2ZXIgPSB7CisJCQkubmFtZQkJPSAiQ0hJUCIsCisJCQkuYnVzCQk9ICZzcGlfYnVzX3R5cGUsCisJCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCX0sCisKKwkJLnByb2JlCQk9IENISVBfcHJvYmUsCisJCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoQ0hJUF9yZW1vdmUpLAorCQkuc3VzcGVuZAk9IENISVBfc3VzcGVuZCwKKwkJLnJlc3VtZQkJPSBDSElQX3Jlc3VtZSwKKwl9OworCitUaGUgZHJpdmVyIGNvcmUgd2lsbCBhdXRtYXRpY2FsbHkgYXR0ZW1wdCB0byBiaW5kIHRoaXMgZHJpdmVyIHRvIGFueSBTUEkKK2RldmljZSB3aG9zZSBib2FyZF9pbmZvIGdhdmUgYSBtb2RhbGlhcyBvZiAiQ0hJUCIuICBZb3VyIHByb2JlKCkgY29kZQorbWlnaHQgbG9vayBsaWtlIHRoaXMgdW5sZXNzIHlvdSdyZSBjcmVhdGluZyBhIGNsYXNzX2RldmljZToKKworCXN0YXRpYyBpbnQgX19kZXZpbml0IENISVBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKKwl7CisJCXN0cnVjdCBDSElQCQkJKmNoaXA7CisJCXN0cnVjdCBDSElQX3BsYXRmb3JtX2RhdGEJKnBkYXRhOworCisJCS8qIGFzc3VtaW5nIHRoZSBkcml2ZXIgcmVxdWlyZXMgYm9hcmQtc3BlY2lmaWMgZGF0YTogKi8KKwkJcGRhdGEgPSAmc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKKwkJaWYgKCFwZGF0YSkKKwkJCXJldHVybiAtRU5PREVWOworCisJCS8qIGdldCBtZW1vcnkgZm9yIGRyaXZlcidzIHBlci1jaGlwIHN0YXRlICovCisJCWNoaXAgPSBremFsbG9jKHNpemVvZiAqY2hpcCwgR0ZQX0tFUk5FTCk7CisJCWlmICghY2hpcCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBjaGlwKTsKKworCQkuLi4gZXRjCisJCXJldHVybiAwOworCX0KKworQXMgc29vbiBhcyBpdCBlbnRlcnMgcHJvYmUoKSwgdGhlIGRyaXZlciBtYXkgaXNzdWUgSS9PIHJlcXVlc3RzIHRvCit0aGUgU1BJIGRldmljZSB1c2luZyAic3RydWN0IHNwaV9tZXNzYWdlIi4gIFdoZW4gcmVtb3ZlKCkgcmV0dXJucywKK3RoZSBkcml2ZXIgZ3VhcmFudGVlcyB0aGF0IGl0IHdvbid0IHN1Ym1pdCBhbnkgbW9yZSBzdWNoIG1lc3NhZ2VzLgorCisgIC0gQW4gc3BpX21lc3NhZ2UgaXMgYSBzZXF1ZW5jZSBvZiBvZiBwcm90b2NvbCBvcGVyYXRpb25zLCBleGVjdXRlZAorICAgIGFzIG9uZSBhdG9taWMgc2VxdWVuY2UuICBTUEkgZHJpdmVyIGNvbnRyb2xzIGluY2x1ZGU6CisKKyAgICAgICsgd2hlbiBiaWRpcmVjdGlvbmFsIHJlYWRzIGFuZCB3cml0ZXMgc3RhcnQgLi4uIGJ5IGhvdyBpdHMKKyAgICAgICAgc2VxdWVuY2Ugb2Ygc3BpX3RyYW5zZmVyIHJlcXVlc3RzIGlzIGFycmFuZ2VkOworCisgICAgICArIG9wdGlvbmFsbHkgZGVmaW5pbmcgc2hvcnQgZGVsYXlzIGFmdGVyIHRyYW5zZmVycyAuLi4gdXNpbmcKKyAgICAgICAgdGhlIHNwaV90cmFuc2Zlci5kZWxheV91c2VjcyBzZXR0aW5nOworCisgICAgICArIHdoZXRoZXIgdGhlIGNoaXBzZWxlY3QgYmVjb21lcyBpbmFjdGl2ZSBhZnRlciBhIHRyYW5zZmVyIGFuZAorICAgICAgICBhbnkgZGVsYXkgLi4uIGJ5IHVzaW5nIHRoZSBzcGlfdHJhbnNmZXIuY3NfY2hhbmdlIGZsYWc7CisKKyAgICAgICsgaGludGluZyB3aGV0aGVyIHRoZSBuZXh0IG1lc3NhZ2UgaXMgbGlrZWx5IHRvIGdvIHRvIHRoaXMgc2FtZQorICAgICAgICBkZXZpY2UgLi4uIHVzaW5nIHRoZSBzcGlfdHJhbnNmZXIuY3NfY2hhbmdlIGZsYWcgb24gdGhlIGxhc3QKKwl0cmFuc2ZlciBpbiB0aGF0IGF0b21pYyBncm91cCwgYW5kIHBvdGVudGlhbGx5IHNhdmluZyBjb3N0cworCWZvciBjaGlwIGRlc2VsZWN0IGFuZCBzZWxlY3Qgb3BlcmF0aW9ucy4KKworICAtIEZvbGxvdyBzdGFuZGFyZCBrZXJuZWwgcnVsZXMsIGFuZCBwcm92aWRlIERNQS1zYWZlIGJ1ZmZlcnMgaW4KKyAgICB5b3VyIG1lc3NhZ2VzLiAgVGhhdCB3YXkgY29udHJvbGxlciBkcml2ZXJzIHVzaW5nIERNQSBhcmVuJ3QgZm9yY2VkCisgICAgdG8gbWFrZSBleHRyYSBjb3BpZXMgdW5sZXNzIHRoZSBoYXJkd2FyZSByZXF1aXJlcyBpdCAoZS5nLiB3b3JraW5nCisgICAgYXJvdW5kIGhhcmR3YXJlIGVycmF0YSB0aGF0IGZvcmNlIHRoZSB1c2Ugb2YgYm91bmNlIGJ1ZmZlcmluZykuCisKKyAgICBJZiBzdGFuZGFyZCBkbWFfbWFwX3NpbmdsZSgpIGhhbmRsaW5nIG9mIHRoZXNlIGJ1ZmZlcnMgaXMgaW5hcHByb3ByaWF0ZSwKKyAgICB5b3UgY2FuIHVzZSBzcGlfbWVzc2FnZS5pc19kbWFfbWFwcGVkIHRvIHRlbGwgdGhlIGNvbnRyb2xsZXIgZHJpdmVyCisgICAgdGhhdCB5b3UndmUgYWxyZWFkeSBwcm92aWRlZCB0aGUgcmVsZXZhbnQgRE1BIGFkZHJlc3Nlcy4KKworICAtIFRoZSBiYXNpYyBJL08gcHJpbWl0aXZlIGlzIHNwaV9hc3luYygpLiAgQXN5bmMgcmVxdWVzdHMgbWF5IGJlCisgICAgaXNzdWVkIGluIGFueSBjb250ZXh0IChpcnEgaGFuZGxlciwgdGFzaywgZXRjKSBhbmQgY29tcGxldGlvbgorICAgIGlzIHJlcG9ydGVkIHVzaW5nIGEgY2FsbGJhY2sgcHJvdmlkZWQgd2l0aCB0aGUgbWVzc2FnZS4KKyAgICBBZnRlciBhbnkgZGV0ZWN0ZWQgZXJyb3IsIHRoZSBjaGlwIGlzIGRlc2VsZWN0ZWQgYW5kIHByb2Nlc3NpbmcKKyAgICBvZiB0aGF0IHNwaV9tZXNzYWdlIGlzIGFib3J0ZWQuCisKKyAgLSBUaGVyZSBhcmUgYWxzbyBzeW5jaHJvbm91cyB3cmFwcGVycyBsaWtlIHNwaV9zeW5jKCksIGFuZCB3cmFwcGVycworICAgIGxpa2Ugc3BpX3JlYWQoKSwgc3BpX3dyaXRlKCksIGFuZCBzcGlfd3JpdGVfdGhlbl9yZWFkKCkuICBUaGVzZQorICAgIG1heSBiZSBpc3N1ZWQgb25seSBpbiBjb250ZXh0cyB0aGF0IG1heSBzbGVlcCwgYW5kIHRoZXkncmUgYWxsCisgICAgY2xlYW4gKGFuZCBzbWFsbCwgYW5kICJvcHRpb25hbCIpIGxheWVycyBvdmVyIHNwaV9hc3luYygpLgorCisgIC0gVGhlIHNwaV93cml0ZV90aGVuX3JlYWQoKSBjYWxsLCBhbmQgY29udmVuaWVuY2Ugd3JhcHBlcnMgYXJvdW5kCisgICAgaXQsIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCBzbWFsbCBhbW91bnRzIG9mIGRhdGEgd2hlcmUgdGhlCisgICAgY29zdCBvZiBhbiBleHRyYSBjb3B5IG1heSBiZSBpZ25vcmVkLiAgSXQncyBkZXNpZ25lZCB0byBzdXBwb3J0CisgICAgY29tbW9uIFJQQy1zdHlsZSByZXF1ZXN0cywgc3VjaCBhcyB3cml0aW5nIGFuIGVpZ2h0IGJpdCBjb21tYW5kCisgICAgYW5kIHJlYWRpbmcgYSBzaXh0ZWVuIGJpdCByZXNwb25zZSAtLSBzcGlfdzhyMTYoKSBiZWluZyBvbmUgaXRzCisgICAgd3JhcHBlcnMsIGRvaW5nIGV4YWN0bHkgdGhhdC4KKworU29tZSBkcml2ZXJzIG1heSBuZWVkIHRvIG1vZGlmeSBzcGlfZGV2aWNlIGNoYXJhY3RlcmlzdGljcyBsaWtlIHRoZQordHJhbnNmZXIgbW9kZSwgd29yZHNpemUsIG9yIGNsb2NrIHJhdGUuICBUaGlzIGlzIGRvbmUgd2l0aCBzcGlfc2V0dXAoKSwKK3doaWNoIHdvdWxkIG5vcm1hbGx5IGJlIGNhbGxlZCBmcm9tIHByb2JlKCkgYmVmb3JlIHRoZSBmaXJzdCBJL08gaXMKK2RvbmUgdG8gdGhlIGRldmljZS4KKworV2hpbGUgInNwaV9kZXZpY2UiIHdvdWxkIGJlIHRoZSBib3R0b20gYm91bmRhcnkgb2YgdGhlIGRyaXZlciwgdGhlCit1cHBlciBib3VuZGFyaWVzIG1pZ2h0IGluY2x1ZGUgc3lzZnMgKGVzcGVjaWFsbHkgZm9yIHNlbnNvciByZWFkaW5ncyksCit0aGUgaW5wdXQgbGF5ZXIsIEFMU0EsIG5ldHdvcmtpbmcsIE1URCwgdGhlIGNoYXJhY3RlciBkZXZpY2UgZnJhbWV3b3JrLAorb3Igb3RoZXIgTGludXggc3Vic3lzdGVtcy4KKworTm90ZSB0aGF0IHRoZXJlIGFyZSB0d28gdHlwZXMgb2YgbWVtb3J5IHlvdXIgZHJpdmVyIG11c3QgbWFuYWdlIGFzIHBhcnQKK29mIGludGVyYWN0aW5nIHdpdGggU1BJIGRldmljZXMuCisKKyAgLSBJL08gYnVmZmVycyB1c2UgdGhlIHVzdWFsIExpbnV4IHJ1bGVzLCBhbmQgbXVzdCBiZSBETUEtc2FmZS4KKyAgICBZb3UnZCBub3JtYWxseSBhbGxvY2F0ZSB0aGVtIGZyb20gdGhlIGhlYXAgb3IgZnJlZSBwYWdlIHBvb2wuCisgICAgRG9uJ3QgdXNlIHRoZSBzdGFjaywgb3IgYW55dGhpbmcgdGhhdCdzIGRlY2xhcmVkICJzdGF0aWMiLgorCisgIC0gVGhlIHNwaV9tZXNzYWdlIGFuZCBzcGlfdHJhbnNmZXIgbWV0YWRhdGEgdXNlZCB0byBnbHVlIHRob3NlCisgICAgSS9PIGJ1ZmZlcnMgaW50byBhIGdyb3VwIG9mIHByb3RvY29sIHRyYW5zYWN0aW9ucy4gIFRoZXNlIGNhbgorICAgIGJlIGFsbG9jYXRlZCBhbnl3aGVyZSBpdCdzIGNvbnZlbmllbnQsIGluY2x1ZGluZyBhcyBwYXJ0IG9mCisgICAgb3RoZXIgYWxsb2NhdGUtb25jZSBkcml2ZXIgZGF0YSBzdHJ1Y3R1cmVzLiAgWmVyby1pbml0IHRoZXNlLgorCitJZiB5b3UgbGlrZSwgc3BpX21lc3NhZ2VfYWxsb2MoKSBhbmQgc3BpX21lc3NhZ2VfZnJlZSgpIGNvbnZlbmllbmNlCityb3V0aW5lcyBhcmUgYXZhaWxhYmxlIHRvIGFsbG9jYXRlIGFuZCB6ZXJvLWluaXRpYWxpemUgYW4gc3BpX21lc3NhZ2UKK3dpdGggc2V2ZXJhbCB0cmFuc2ZlcnMuCisKKworSG93IGRvIEkgd3JpdGUgYW4gIlNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXIiPworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQW4gU1BJIGNvbnRyb2xsZXIgd2lsbCBwcm9iYWJseSBiZSByZWdpc3RlcmVkIG9uIHRoZSBwbGF0Zm9ybV9idXM7IHdyaXRlCithIGRyaXZlciB0byBiaW5kIHRvIHRoZSBkZXZpY2UsIHdoaWNoZXZlciBidXMgaXMgaW52b2x2ZWQuCisKK1RoZSBtYWluIHRhc2sgb2YgdGhpcyB0eXBlIG9mIGRyaXZlciBpcyB0byBwcm92aWRlIGFuICJzcGlfbWFzdGVyIi4KK1VzZSBzcGlfYWxsb2NfbWFzdGVyKCkgdG8gYWxsb2NhdGUgdGhlIG1hc3RlciwgYW5kIGNsYXNzX2dldF9kZXZkYXRhKCkKK3RvIGdldCB0aGUgZHJpdmVyLXByaXZhdGUgZGF0YSBhbGxvY2F0ZWQgZm9yIHRoYXQgZGV2aWNlLgorCisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKKwlzdHJ1Y3QgQ09OVFJPTExFUgkqYzsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoZGV2LCBzaXplb2YgKmMpOworCWlmICghbWFzdGVyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWMgPSBjbGFzc19nZXRfZGV2ZGF0YSgmbWFzdGVyLT5jZGV2KTsKKworVGhlIGRyaXZlciB3aWxsIGluaXRpYWxpemUgdGhlIGZpZWxkcyBvZiB0aGF0IHNwaV9tYXN0ZXIsIGluY2x1ZGluZyB0aGUKK2J1cyBudW1iZXIgKG1heWJlIHRoZSBzYW1lIGFzIHRoZSBwbGF0Zm9ybSBkZXZpY2UgSUQpIGFuZCB0aHJlZSBtZXRob2RzCit1c2VkIHRvIGludGVyYWN0IHdpdGggdGhlIFNQSSBjb3JlIGFuZCBTUEkgcHJvdG9jb2wgZHJpdmVycy4gIEl0IHdpbGwKK2Fsc28gaW5pdGlhbGl6ZSBpdHMgb3duIGludGVybmFsIHN0YXRlLgorCisgICAgbWFzdGVyLT5zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQorCVRoaXMgc2V0cyB1cCB0aGUgZGV2aWNlIGNsb2NrIHJhdGUsIFNQSSBtb2RlLCBhbmQgd29yZCBzaXplcy4KKwlEcml2ZXJzIG1heSBjaGFuZ2UgdGhlIGRlZmF1bHRzIHByb3ZpZGVkIGJ5IGJvYXJkX2luZm8sIGFuZCB0aGVuCisJY2FsbCBzcGlfc2V0dXAoc3BpKSB0byBpbnZva2UgdGhpcyByb3V0aW5lLiAgSXQgbWF5IHNsZWVwLgorCisgICAgbWFzdGVyLT50cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc3NhZ2UpCisgICAgCVRoaXMgbXVzdCBub3Qgc2xlZXAuICBJdHMgcmVzcG9uc2liaWxpdHkgaXMgYXJyYW5nZSB0aGF0IHRoZQorCXRyYW5zZmVyIGhhcHBlbnMgYW5kIGl0cyBjb21wbGV0ZSgpIGNhbGxiYWNrIGlzIGlzc3VlZDsgdGhlIHR3bworCXdpbGwgbm9ybWFsbHkgaGFwcGVuIGxhdGVyLCBhZnRlciBvdGhlciB0cmFuc2ZlcnMgY29tcGxldGUuCisKKyAgICBtYXN0ZXItPmNsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKKwlZb3VyIGNvbnRyb2xsZXIgZHJpdmVyIG1heSB1c2Ugc3BpX2RldmljZS5jb250cm9sbGVyX3N0YXRlIHRvIGhvbGQKKwlzdGF0ZSBpdCBkeW5hbWljYWxseSBhc3NvY2lhdGVzIHdpdGggdGhhdCBkZXZpY2UuICBJZiB5b3UgZG8gdGhhdCwKKwliZSBzdXJlIHRvIHByb3ZpZGUgdGhlIGNsZWFudXAoKSBtZXRob2QgdG8gZnJlZSB0aGF0IHN0YXRlLgorCitUaGUgYnVsayBvZiB0aGUgZHJpdmVyIHdpbGwgYmUgbWFuYWdpbmcgdGhlIEkvTyBxdWV1ZSBmZWQgYnkgdHJhbnNmZXIoKS4KKworVGhhdCBxdWV1ZSBjb3VsZCBiZSBwdXJlbHkgY29uY2VwdHVhbC4gIEZvciBleGFtcGxlLCBhIGRyaXZlciB1c2VkIG9ubHkKK2ZvciBsb3ctZnJlcXVlbmN5IHNlbnNvciBhY2VzcyBtaWdodCBiZSBmaW5lIHVzaW5nIHN5bmNocm9ub3VzIFBJTy4KKworQnV0IHRoZSBxdWV1ZSB3aWxsIHByb2JhYmx5IGJlIHZlcnkgcmVhbCwgdXNpbmcgbWVzc2FnZS0+cXVldWUsIFBJTywKK29mdGVuIERNQSAoZXNwZWNpYWxseSBpZiB0aGUgcm9vdCBmaWxlc3lzdGVtIGlzIGluIFNQSSBmbGFzaCksIGFuZAorZXhlY3V0aW9uIGNvbnRleHRzIGxpa2UgSVJRIGhhbmRsZXJzLCB0YXNrbGV0cywgb3Igd29ya3F1ZXVlcyAoc3VjaAorYXMga2V2ZW50ZCkuICBZb3VyIGRyaXZlciBjYW4gYmUgYXMgZmFuY3ksIG9yIGFzIHNpbXBsZSwgYXMgeW91IG5lZWQuCisKKworVEhBTktTIFRPCistLS0tLS0tLS0KK0NvbnRyaWJ1dG9ycyB0byBMaW51eC1TUEkgZGlzY3Vzc2lvbnMgaW5jbHVkZSAoaW4gYWxwaGFiZXRpY2FsIG9yZGVyLAorYnkgbGFzdCBuYW1lKToKKworRGF2aWQgQnJvd25lbGwKK1J1c3NlbGwgS2luZworRG1pdHJ5IFBlcnZ1c2hpbgorU3RlcGhlbiBTdHJlZXQKK01hcmsgVW5kZXJ3b29kCitBbmRyZXcgVmljdG9yCitWaXRhbHkgV29vbAorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3N0YWJsZV9rZXJuZWxfcnVsZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9zdGFibGVfa2VybmVsX3J1bGVzLnR4dAppbmRleCAyYzgxMzA1Li5lNDA5ZTVkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N0YWJsZV9rZXJuZWxfcnVsZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc3RhYmxlX2tlcm5lbF9ydWxlcy50eHQKQEAgLTEsNTggKzEsNTYgQEAKIEV2ZXJ5dGhpbmcgeW91IGV2ZXIgd2FudGVkIHRvIGtub3cgYWJvdXQgTGludXggMi42IC1zdGFibGUgcmVsZWFzZXMuCiAKLVJ1bGVzIG9uIHdoYXQga2luZCBvZiBwYXRjaGVzIGFyZSBhY2NlcHRlZCwgYW5kIHdoYXQgb25lcyBhcmUgbm90LCBpbnRvCi10aGUgIi1zdGFibGUiIHRyZWU6CitSdWxlcyBvbiB3aGF0IGtpbmQgb2YgcGF0Y2hlcyBhcmUgYWNjZXB0ZWQsIGFuZCB3aGljaCBvbmVzIGFyZSBub3QsIGludG8gdGhlCisiLXN0YWJsZSIgdHJlZToKIAogIC0gSXQgbXVzdCBiZSBvYnZpb3VzbHkgY29ycmVjdCBhbmQgdGVzdGVkLgotIC0gSXQgY2FuIG5vdCBiaWdnZXIgdGhhbiAxMDAgbGluZXMsIHdpdGggY29udGV4dC4KKyAtIEl0IGNhbiBub3QgYmUgYmlnZ2VyIHRoYW4gMTAwIGxpbmVzLCB3aXRoIGNvbnRleHQuCiAgLSBJdCBtdXN0IGZpeCBvbmx5IG9uZSB0aGluZy4KICAtIEl0IG11c3QgZml4IGEgcmVhbCBidWcgdGhhdCBib3RoZXJzIHBlb3BsZSAobm90IGEsICJUaGlzIGNvdWxkIGJlIGEKLSAgIHByb2JsZW0uLi4iIHR5cGUgdGhpbmcuKQorICAgcHJvYmxlbS4uLiIgdHlwZSB0aGluZykuCiAgLSBJdCBtdXN0IGZpeCBhIHByb2JsZW0gdGhhdCBjYXVzZXMgYSBidWlsZCBlcnJvciAoYnV0IG5vdCBmb3IgdGhpbmdzCiAgICBtYXJrZWQgQ09ORklHX0JST0tFTiksIGFuIG9vcHMsIGEgaGFuZywgZGF0YSBjb3JydXB0aW9uLCBhIHJlYWwKLSAgIHNlY3VyaXR5IGlzc3VlLCBvciBzb21lICJvaCwgdGhhdCdzIG5vdCBnb29kIiBpc3N1ZS4gIEluIHNob3J0LAotICAgc29tZXRoaW5nIGNyaXRpY2FsLgotIC0gTm8gInRoZW9yZXRpY2FsIHJhY2UgY29uZGl0aW9uIiBpc3N1ZXMsIHVubGVzcyBhbiBleHBsYW5hdGlvbiBvZiBob3cKLSAgIHRoZSByYWNlIGNhbiBiZSBleHBsb2l0ZWQuCisgICBzZWN1cml0eSBpc3N1ZSwgb3Igc29tZSAib2gsIHRoYXQncyBub3QgZ29vZCIgaXNzdWUuICBJbiBzaG9ydCwgc29tZXRoaW5nCisgICBjcml0aWNhbC4KKyAtIE5vICJ0aGVvcmV0aWNhbCByYWNlIGNvbmRpdGlvbiIgaXNzdWVzLCB1bmxlc3MgYW4gZXhwbGFuYXRpb24gb2YgaG93IHRoZQorICAgcmFjZSBjYW4gYmUgZXhwbG9pdGVkIGlzIGFsc28gcHJvdmlkZWQuCiAgLSBJdCBjYW4gbm90IGNvbnRhaW4gYW55ICJ0cml2aWFsIiBmaXhlcyBpbiBpdCAoc3BlbGxpbmcgY2hhbmdlcywKLSAgIHdoaXRlc3BhY2UgY2xlYW51cHMsIGV0Yy4pCisgICB3aGl0ZXNwYWNlIGNsZWFudXBzLCBldGMpLgogIC0gSXQgbXVzdCBiZSBhY2NlcHRlZCBieSB0aGUgcmVsZXZhbnQgc3Vic3lzdGVtIG1haW50YWluZXIuCi0gLSBJdCBtdXN0IGZvbGxvdyBEb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzIHJ1bGVzLgorIC0gSXQgbXVzdCBmb2xsb3cgdGhlIERvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMgcnVsZXMuCiAKIAogUHJvY2VkdXJlIGZvciBzdWJtaXR0aW5nIHBhdGNoZXMgdG8gdGhlIC1zdGFibGUgdHJlZToKIAogIC0gU2VuZCB0aGUgcGF0Y2gsIGFmdGVyIHZlcmlmeWluZyB0aGF0IGl0IGZvbGxvd3MgdGhlIGFib3ZlIHJ1bGVzLCB0bwogICAgc3RhYmxlQGtlcm5lbC5vcmcuCi0gLSBUaGUgc2VuZGVyIHdpbGwgcmVjZWl2ZSBhbiBhY2sgd2hlbiB0aGUgcGF0Y2ggaGFzIGJlZW4gYWNjZXB0ZWQgaW50bwotICAgdGhlIHF1ZXVlLCBvciBhIG5hayBpZiB0aGUgcGF0Y2ggaXMgcmVqZWN0ZWQuICBUaGlzIHJlc3BvbnNlIG1pZ2h0Ci0gICB0YWtlIGEgZmV3IGRheXMsIGFjY29yZGluZyB0byB0aGUgZGV2ZWxvcGVyJ3Mgc2NoZWR1bGVzLgotIC0gSWYgYWNjZXB0ZWQsIHRoZSBwYXRjaCB3aWxsIGJlIGFkZGVkIHRvIHRoZSAtc3RhYmxlIHF1ZXVlLCBmb3IgcmV2aWV3Ci0gICBieSBvdGhlciBkZXZlbG9wZXJzLgorIC0gVGhlIHNlbmRlciB3aWxsIHJlY2VpdmUgYW4gQUNLIHdoZW4gdGhlIHBhdGNoIGhhcyBiZWVuIGFjY2VwdGVkIGludG8gdGhlCisgICBxdWV1ZSwgb3IgYSBOQUsgaWYgdGhlIHBhdGNoIGlzIHJlamVjdGVkLiAgVGhpcyByZXNwb25zZSBtaWdodCB0YWtlIGEgZmV3CisgICBkYXlzLCBhY2NvcmRpbmcgdG8gdGhlIGRldmVsb3BlcidzIHNjaGVkdWxlcy4KKyAtIElmIGFjY2VwdGVkLCB0aGUgcGF0Y2ggd2lsbCBiZSBhZGRlZCB0byB0aGUgLXN0YWJsZSBxdWV1ZSwgZm9yIHJldmlldyBieQorICAgb3RoZXIgZGV2ZWxvcGVycy4KICAtIFNlY3VyaXR5IHBhdGNoZXMgc2hvdWxkIG5vdCBiZSBzZW50IHRvIHRoaXMgYWxpYXMsIGJ1dCBpbnN0ZWFkIHRvIHRoZQotICAgZG9jdW1lbnRlZCBzZWN1cml0eUBrZXJuZWwub3JnLgorICAgZG9jdW1lbnRlZCBzZWN1cml0eUBrZXJuZWwub3JnIGFkZHJlc3MuCiAKIAogUmV2aWV3IGN5Y2xlOgogCi0gLSBXaGVuIHRoZSAtc3RhYmxlIG1haW50YWluZXJzIGRlY2lkZSBmb3IgYSByZXZpZXcgY3ljbGUsIHRoZSBwYXRjaGVzCi0gICB3aWxsIGJlIHNlbnQgdG8gdGhlIHJldmlldyBjb21taXR0ZWUsIGFuZCB0aGUgbWFpbnRhaW5lciBvZiB0aGUKLSAgIGFmZmVjdGVkIGFyZWEgb2YgdGhlIHBhdGNoICh1bmxlc3MgdGhlIHN1Ym1pdHRlciBpcyB0aGUgbWFpbnRhaW5lciBvZgotICAgdGhlIGFyZWEpIGFuZCBDQzogdG8gdGhlIGxpbnV4LWtlcm5lbCBtYWlsaW5nIGxpc3QuCi0gLSBUaGUgcmV2aWV3IGNvbW1pdHRlZSBoYXMgNDggaG91cnMgaW4gd2hpY2ggdG8gYWNrIG9yIG5hayB0aGUgcGF0Y2guCisgLSBXaGVuIHRoZSAtc3RhYmxlIG1haW50YWluZXJzIGRlY2lkZSBmb3IgYSByZXZpZXcgY3ljbGUsIHRoZSBwYXRjaGVzIHdpbGwgYmUKKyAgIHNlbnQgdG8gdGhlIHJldmlldyBjb21taXR0ZWUsIGFuZCB0aGUgbWFpbnRhaW5lciBvZiB0aGUgYWZmZWN0ZWQgYXJlYSBvZgorICAgdGhlIHBhdGNoICh1bmxlc3MgdGhlIHN1Ym1pdHRlciBpcyB0aGUgbWFpbnRhaW5lciBvZiB0aGUgYXJlYSkgYW5kIENDOiB0bworICAgdGhlIGxpbnV4LWtlcm5lbCBtYWlsaW5nIGxpc3QuCisgLSBUaGUgcmV2aWV3IGNvbW1pdHRlZSBoYXMgNDggaG91cnMgaW4gd2hpY2ggdG8gQUNLIG9yIE5BSyB0aGUgcGF0Y2guCiAgLSBJZiB0aGUgcGF0Y2ggaXMgcmVqZWN0ZWQgYnkgYSBtZW1iZXIgb2YgdGhlIGNvbW1pdHRlZSwgb3IgbGludXgta2VybmVsCi0gICBtZW1iZXJzIG9iamVjdCB0byB0aGUgcGF0Y2gsIGJyaW5naW5nIHVwIGlzc3VlcyB0aGF0IHRoZSBtYWludGFpbmVycwotICAgYW5kIG1lbWJlcnMgZGlkIG5vdCByZWFsaXplLCB0aGUgcGF0Y2ggd2lsbCBiZSBkcm9wcGVkIGZyb20gdGhlCi0gICBxdWV1ZS4KLSAtIEF0IHRoZSBlbmQgb2YgdGhlIHJldmlldyBjeWNsZSwgdGhlIGFja2VkIHBhdGNoZXMgd2lsbCBiZSBhZGRlZCB0bwotICAgdGhlIGxhdGVzdCAtc3RhYmxlIHJlbGVhc2UsIGFuZCBhIG5ldyAtc3RhYmxlIHJlbGVhc2Ugd2lsbCBoYXBwZW4uCi0gLSBTZWN1cml0eSBwYXRjaGVzIHdpbGwgYmUgYWNjZXB0ZWQgaW50byB0aGUgLXN0YWJsZSB0cmVlIGRpcmVjdGx5IGZyb20KLSAgIHRoZSBzZWN1cml0eSBrZXJuZWwgdGVhbSwgYW5kIG5vdCBnbyB0aHJvdWdoIHRoZSBub3JtYWwgcmV2aWV3IGN5Y2xlLgorICAgbWVtYmVycyBvYmplY3QgdG8gdGhlIHBhdGNoLCBicmluZ2luZyB1cCBpc3N1ZXMgdGhhdCB0aGUgbWFpbnRhaW5lcnMgYW5kCisgICBtZW1iZXJzIGRpZCBub3QgcmVhbGl6ZSwgdGhlIHBhdGNoIHdpbGwgYmUgZHJvcHBlZCBmcm9tIHRoZSBxdWV1ZS4KKyAtIEF0IHRoZSBlbmQgb2YgdGhlIHJldmlldyBjeWNsZSwgdGhlIEFDS2VkIHBhdGNoZXMgd2lsbCBiZSBhZGRlZCB0byB0aGUKKyAgIGxhdGVzdCAtc3RhYmxlIHJlbGVhc2UsIGFuZCBhIG5ldyAtc3RhYmxlIHJlbGVhc2Ugd2lsbCBoYXBwZW4uCisgLSBTZWN1cml0eSBwYXRjaGVzIHdpbGwgYmUgYWNjZXB0ZWQgaW50byB0aGUgLXN0YWJsZSB0cmVlIGRpcmVjdGx5IGZyb20gdGhlCisgICBzZWN1cml0eSBrZXJuZWwgdGVhbSwgYW5kIG5vdCBnbyB0aHJvdWdoIHRoZSBub3JtYWwgcmV2aWV3IGN5Y2xlLgogICAgQ29udGFjdCB0aGUga2VybmVsIHNlY3VyaXR5IHRlYW0gZm9yIG1vcmUgZGV0YWlscyBvbiB0aGlzIHByb2NlZHVyZS4KIAogCiBSZXZpZXcgY29tbWl0dGU6CiAKLSAtIFRoaXMgd2lsbCBiZSBtYWRlIHVwIG9mIGEgbnVtYmVyIG9mIGtlcm5lbCBkZXZlbG9wZXJzIHdobyBoYXZlCi0gICB2b2x1bnRlZXJlZCBmb3IgdGhpcyB0YXNrLCBhbmQgYSBmZXcgdGhhdCBoYXZlbid0LgotCisgLSBUaGlzIGlzIG1hZGUgdXAgb2YgYSBudW1iZXIgb2Yga2VybmVsIGRldmVsb3BlcnMgd2hvIGhhdmUgdm9sdW50ZWVyZWQgZm9yCisgICB0aGlzIHRhc2ssIGFuZCBhIGZldyB0aGF0IGhhdmVuJ3QuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQKaW5kZXggMmYxYWFlMy4uMzkxZGQ2NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0CisrKyBiL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dApAQCAtMjYsMTIgKzI2LDE0IEBACiAtIG1pbl9mcmVlX2tieXRlcwogLSBsYXB0b3BfbW9kZQogLSBibG9ja19kdW1wCistIGRyb3AtY2FjaGVzCistIHpvbmVfcmVjbGFpbV9tb2RlCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIGRpcnR5X3JhdGlvLCBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvLCBkaXJ0eV9leHBpcmVfY2VudGlzZWNzLAogZGlydHlfd3JpdGViYWNrX2NlbnRpc2VjcywgdmZzX2NhY2hlX3ByZXNzdXJlLCBsYXB0b3BfbW9kZSwKLWJsb2NrX2R1bXAsIHN3YXBfdG9rZW5fdGltZW91dDoKK2Jsb2NrX2R1bXAsIHN3YXBfdG9rZW5fdGltZW91dCwgZHJvcC1jYWNoZXM6CiAKIFNlZSBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CiAKQEAgLTEwMiwzICsxMDQsMzcgQEAKIG9mIGtpbG9ieXRlcyBmcmVlLiAgVGhlIFZNIHVzZXMgdGhpcyBudW1iZXIgdG8gY29tcHV0ZSBhIHBhZ2VzX21pbgogdmFsdWUgZm9yIGVhY2ggbG93bWVtIHpvbmUgaW4gdGhlIHN5c3RlbS4gIEVhY2ggbG93bWVtIHpvbmUgZ2V0cyAKIGEgbnVtYmVyIG9mIHJlc2VydmVkIGZyZWUgcGFnZXMgYmFzZWQgcHJvcG9ydGlvbmFsbHkgb24gaXRzIHNpemUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3BlcmNwdV9wYWdlbGlzdF9mcmFjdGlvbgorCitUaGlzIGlzIHRoZSBmcmFjdGlvbiBvZiBwYWdlcyBhdCBtb3N0IChoaWdoIG1hcmsgcGNwLT5oaWdoKSBpbiBlYWNoIHpvbmUgdGhhdAorYXJlIGFsbG9jYXRlZCBmb3IgZWFjaCBwZXIgY3B1IHBhZ2UgbGlzdC4gIFRoZSBtaW4gdmFsdWUgZm9yIHRoaXMgaXMgOC4gIEl0CittZWFucyB0aGF0IHdlIGRvbid0IGFsbG93IG1vcmUgdGhhbiAxLzh0aCBvZiBwYWdlcyBpbiBlYWNoIHpvbmUgdG8gYmUKK2FsbG9jYXRlZCBpbiBhbnkgc2luZ2xlIHBlcl9jcHVfcGFnZWxpc3QuICBUaGlzIGVudHJ5IG9ubHkgY2hhbmdlcyB0aGUgdmFsdWUKK29mIGhvdCBwZXIgY3B1IHBhZ2VsaXN0cy4gIFVzZXIgY2FuIHNwZWNpZnkgYSBudW1iZXIgbGlrZSAxMDAgdG8gYWxsb2NhdGUKKzEvMTAwdGggb2YgZWFjaCB6b25lIHRvIGVhY2ggcGVyIGNwdSBwYWdlIGxpc3QuCisKK1RoZSBiYXRjaCB2YWx1ZSBvZiBlYWNoIHBlciBjcHUgcGFnZWxpc3QgaXMgYWxzbyB1cGRhdGVkIGFzIGEgcmVzdWx0LiAgSXQgaXMKK3NldCB0byBwY3AtPmhpZ2gvNC4gIFRoZSB1cHBlciBsaW1pdCBvZiBiYXRjaCBpcyAoUEFHRV9TSElGVCAqIDgpCisKK1RoZSBpbml0aWFsIHZhbHVlIGlzIHplcm8uICBLZXJuZWwgZG9lcyBub3QgdXNlIHRoaXMgdmFsdWUgYXQgYm9vdCB0aW1lIHRvIHNldAordGhlIGhpZ2ggd2F0ZXIgbWFya3MgZm9yIGVhY2ggcGVyIGNwdSBwYWdlIGxpc3QuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit6b25lX3JlY2xhaW1fbW9kZToKKworVGhpcyBpcyBzZXQgZHVyaW5nIGJvb3R1cCB0byAxIGlmIGl0IGlzIGRldGVybWluZWQgdGhhdCBwYWdlcyBmcm9tCityZW1vdGUgem9uZXMgd2lsbCBjYXVzZSBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIHJlZHVjdGlvbi4gVGhlCitwYWdlIGFsbG9jYXRvciB3aWxsIHRoZW4gcmVjbGFpbSBlYXNpbHkgcmV1c2FibGUgcGFnZXMgKHRob3NlIHBhZ2UKK2NhY2hlIHBhZ2VzIHRoYXQgYXJlIGN1cnJlbnRseSBub3QgdXNlZCkgYmVmb3JlIGdvaW5nIG9mZiBub2RlLgorCitUaGUgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyBzZXR0aW5nLiBJdCBtYXkgYmUgYmVuZWZpY2lhbCB0byBzd2l0Y2gKK29mZiB6b25lIHJlY2xhaW0gaWYgdGhlIHN5c3RlbSBpcyB1c2VkIGZvciBhIGZpbGUgc2VydmVyIGFuZCBhbGwKK29mIG1lbW9yeSBzaG91bGQgYmUgdXNlZCBmb3IgY2FjaGluZyBmaWxlcyBmcm9tIGRpc2suCisKK0l0IG1heSBiZSBiZW5lZmljaWFsIHRvIHN3aXRjaCB0aGlzIG9uIGlmIG9uZSB3YW50cyB0byBkbyB6b25lCityZWNsYWltIHJlZ2FyZGxlc3Mgb2YgdGhlIG51bWEgZGlzdGFuY2VzIGluIHRoZSBzeXN0ZW0uCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuYnR0diBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuYnR0dgppbmRleCAzMzAyNDZhLi5iNzI3MDZjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmJ0dHYKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5idHR2CkBAIC0xNDEsMyArMTQxLDUgQEAKIDE0MCAtPiBPc3ByZXkgNDQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAwNzA6ZmYwN10KIDE0MSAtPiBBc291bmQgU2t5ZXllIFBDVFYKIDE0MiAtPiBTYWJyZW50IFRWLUZNIChidHR2IHZlcnNpb24pCisxNDMgLT4gSGF1cHBhdWdlIEltcGFjdFZDQiAoYnQ4NzgpICAgICAgICAgICAgICAgICAgICAgICAgIFswMDcwOjEzZWJdCisxNDQgLT4gTWFnaWNUVgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDg4IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDg4CmluZGV4IGExMDE3ZDEuLjU2ZTE5NGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3g4OAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4ODgKQEAgLTE2LDEwICsxNiwxMCBAQAogIDE1IC0+IERWaUNPIEZ1c2lvbkhEVFYgRFZCLVQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMThhYzpkYjAwXQogIDE2IC0+IEtXb3JsZCBMVFY4ODNSRgogIDE3IC0+IERWaUNPIEZ1c2lvbkhEVFYgMyBHb2xkLVEgICAgICAgICAgICAgICAgICAgICAgICAgICBbMThhYzpkODEwXQotIDE4IC0+IEhhdXBwYXVnZSBOb3ZhLVQgRFZCLVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDA3MDo5MDAyXQorIDE4IC0+IEhhdXBwYXVnZSBOb3ZhLVQgRFZCLVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDA3MDo5MDAyLDAwNzA6OTAwMV0KICAxOSAtPiBDb25leGFudCBEVkItVCByZWZlcmVuY2UgZGVzaWduICAgICAgICAgICAgICAgICAgICAgWzE0ZjE6MDE4N10KICAyMCAtPiBQcm92aWRlbyBQVjI1OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzE1NDA6MjU4MF0KLSAyMSAtPiBEVmlDTyBGdXNpb25IRFRWIERWQi1UIFBsdXMgICAgICAgICAgICAgICAgICAgICAgICAgWzE4YWM6ZGIxMF0KKyAyMSAtPiBEVmlDTyBGdXNpb25IRFRWIERWQi1UIFBsdXMgICAgICAgICAgICAgICAgICAgICAgICAgWzE4YWM6ZGIxMCwxOGFjOmRiMTFdCiAgMjIgLT4gcGNIRFRWIEhEMzAwMCBIRFRWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs3MDYzOjMwMDBdCiAgMjMgLT4gZGlnaXRhbG5vdyBETlRWIExpdmUhIERWQi1UICAgICAgICAgICAgICAgICAgICAgICAgIFsxN2RlOmE4YTZdCiAgMjQgLT4gSGF1cHBhdWdlIFdpblRWIDI4eHh4IChSb3NseW4pIG1vZGVscyAgICAgICAgICAgICAgIFswMDcwOjI4MDFdCkBAIC0zNSwzICszNSwxMSBAQAogIDM0IC0+IEFUSSBIRFRWIFdvbmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTAwMjphMTAxXQogIDM1IC0+IFdpbkZhc3QgRFRWMTAwMC1UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTA3ZDo2NjVmXQogIDM2IC0+IEFWZXJUViAzMDMgKE0xMjYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTQ2MTowMDBhXQorIDM3IC0+IEhhdXBwYXVnZSBOb3ZhLVMtUGx1cyBEVkItUyAgICAgICAgICAgICAgICAgICAgICAgICBbMDA3MDo5MjAxLDAwNzA6OTIwMl0KKyAzOCAtPiBIYXVwcGF1Z2UgTm92YS1TRTIgRFZCLVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAwNzA6OTIwMF0KKyAzOSAtPiBLV29ybGQgRFZCLVMgMTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzE3ZGU6MDhiMl0KKyA0MCAtPiBIYXVwcGF1Z2UgV2luVFYtSFZSMTEwMCBEVkItVC9IeWJyaWQgICAgICAgICAgICAgICAgWzAwNzA6OTQwMCwwMDcwOjk0MDJdCisgNDEgLT4gSGF1cHBhdWdlIFdpblRWLUhWUjExMDAgRFZCLVQvSHlicmlkIChMb3cgUHJvZmlsZSkgIFswMDcwOjk4MDAsMDA3MDo5ODAyXQorIDQyIC0+IGRpZ2l0YWxub3cgRE5UViBMaXZlISBEVkItVCBQcm8gICAgICAgICAgICAgICAgICAgICBbMTgyMjowMDI1XQorIDQzIC0+IEtXb3JsZC9WU3RyZWFtIFhQZXJ0IERWQi1UIHdpdGggY3gyMjcwMiAgICAgICAgICAgICBbMTdkZTowOGExXQorIDQ0IC0+IERWaUNPIEZ1c2lvbkhEVFYgRFZCLVQgRHVhbCBEaWdpdGFsICAgICAgICAgICAgICAgICBbMThhYzpkYjUwXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0CmluZGV4IGVmYjcwOGUuLmNiM2E1OWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQKQEAgLTU2LDcgKzU2LDcgQEAKICA1NSAtPiBMaWZlVmlldyBGbHlEVkItVCBEVU8gICAgICAgICAgICAgICAgICAgIFs1MTY4OjA1MDIsNTE2ODowMzA2XQogIDU2IC0+IEF2ZXJtZWRpYSBBVmVyVFYgMzA3ICAgICAgICAgICAgICAgICAgICAgWzE0NjE6YTcwYV0KICA1NyAtPiBBdmVybWVkaWEgQVZlclRWIEdPIDAwNyBGTSAgICAgICAgICAgICAgIFsxNDYxOmYzMWZdCi0gNTggLT4gQURTIFRlY2ggSW5zdGFudCBUViAoc2FhNzEzNSkgICAgICAgICAgICBbMTQyMTowMzUwLDE0MjE6MDM3MCwxNDIxOjEzNzBdCisgNTggLT4gQURTIFRlY2ggSW5zdGFudCBUViAoc2FhNzEzNSkgICAgICAgICAgICBbMTQyMTowMzUwLDE0MjE6MDM1MSwxNDIxOjAzNzAsMTQyMToxMzcwXQogIDU5IC0+IEt3b3JsZC9UZXZpb24gVi1TdHJlYW0gWHBlcnQgVFYgUFZSNzEzNAogIDYwIC0+IFR5cGhvb24gRFZCLVQgRHVvIERpZ2l0YWwvQW5hbG9nIENhcmRidXMgWzRlNDI6MDUwMl0KICA2MSAtPiBQaGlsaXBzIFRPVUdIIERWQi1UIHJlZmVyZW5jZSBkZXNpZ24gICAgIFsxMTMxOjIwMDRdCkBAIC04MSw0ICs4MSw1IEBACiAgODAgLT4gQVNVUyBEaWdpbWF0cml4IFRWICAgICAgICAgICAgICAgICAgICAgICBbMTA0MzowMjEwXQogIDgxIC0+IFBoaWxpcHMgVGlnZXIgcmVmZXJlbmNlIGRlc2lnbiAgICAgICAgICAgWzExMzE6MjAxOF0KICA4MiAtPiBNU0kgVFZAQW55d2hlcmUgcGx1cyAgICAgICAgICAgICAgICAgICAgIFsxNDYyOjYyMzFdCi0KKyA4MyAtPiBUZXJyYXRlYyBDaW5lcmd5IDI1MCBQQ0kgVFYgICAgICAgICAgICAgIFsxNTNiOjExNjBdCisgODQgLT4gTGlmZVZpZXcgRmx5RFZCIFRyaW8gICAgICAgICAgICAgICAgICAgICBbNTE2ODowMzE5XQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC50dW5lciBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QudHVuZXIKaW5kZXggOWQ2NTQ0ZS4uZjZkMGNmNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC50dW5lcgorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnR1bmVyCkBAIC00MCw3ICs0MCw3IEBACiB0dW5lcj0zOSAtIExHIE5UU0MgKG5ld2VyIFRBUEMgc2VyaWVzKQogdHVuZXI9NDAgLSBISVRBQ0hJIFY3LUoxODBBVAogdHVuZXI9NDEgLSBQaGlsaXBzIFBBTF9NSyAoRkkxMjE2IE1LKQotdHVuZXI9NDIgLSBQaGlsaXBzIDEyMzZEIEFUU0MvTlRTQyBkYXVsIGluCit0dW5lcj00MiAtIFBoaWxpcHMgMTIzNkQgQVRTQy9OVFNDIGR1YWwgaW4KIHR1bmVyPTQzIC0gUGhpbGlwcyBOVFNDIE1LMyAoRk0xMjM2TUszIG9yIEZNMTIzNi9GKQogdHVuZXI9NDQgLSBQaGlsaXBzIDQgaW4gMSAoQVRJIFRWIFdvbmRlciBQcm8vQ29uZXhhbnQpCiB0dW5lcj00NSAtIE1pY3JvdHVuZSA0MDQ5IEZNNQpAQCAtNTAsNyArNTAsNyBAQAogdHVuZXI9NDkgLSBNaWNyb3R1bmUgNDA0MiBGSTUgQVRTQy9OVFNDIGR1YWwgaW4KIHR1bmVyPTUwIC0gVENMIDIwMDJOCiB0dW5lcj01MSAtIFBoaWxpcHMgUEFML1NFQ0FNX0QgKEZNIDEyNTYgSS1IMykKLXR1bmVyPTUyIC0gVGhvbXNvbiBERFQgNzYxMCAoQVRTQy9OVFNDKQordHVuZXI9NTIgLSBUaG9tc29uIERUVCA3NjEwIChBVFNDL05UU0MpCiB0dW5lcj01MyAtIFBoaWxpcHMgRlExMjg2CiB0dW5lcj01NCAtIHRkYTgyOTArNzUKIHR1bmVyPTU1IC0gVENMIDIwMDJNQgpAQCAtNTgsNyArNTgsNyBAQAogdHVuZXI9NTcgLSBQaGlsaXBzIEZRMTIzNkEgTUs0CiB0dW5lcj01OCAtIFltZWMgVFZpc2lvbiBUVkYtODUzMU1GLzg4MzFNRi84NzMxTUYKIHR1bmVyPTU5IC0gWW1lYyBUVmlzaW9uIFRWRi01NTMzTUYKLXR1bmVyPTYwIC0gVGhvbXNvbiBERFQgNzYxMSAoQVRTQy9OVFNDKQordHVuZXI9NjAgLSBUaG9tc29uIERUVCA3NjFYIChBVFNDL05UU0MpCiB0dW5lcj02MSAtIFRlbmEgVE5GOTUzMy1EL0lGL1RORjk1MzMtQi9ERgogdHVuZXI9NjIgLSBQaGlsaXBzIFRFQTU3NjdITiBGTSBSYWRpbwogdHVuZXI9NjMgLSBQaGlsaXBzIEZNRDEyMTZNRSBNSzMgSHlicmlkIFR1bmVyCkBAIC02OCwzICs2OCw0IEBACiB0dW5lcj02NyAtIFBoaWxpcHMgVEQxMzE2IEh5YnJpZCBUdW5lcgogdHVuZXI9NjggLSBQaGlsaXBzIFRVVjEyMzZEIEFUU0MvTlRTQyBkdWFsIGluCiB0dW5lcj02OSAtIFRlbmEgVE5GIDUzMzUgTUYKK3R1bmVyPTcwIC0gU2Ftc3VuZyBUQ1BOIDIxMjFQMzBBCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3g4Nl82NC9ib290LW9wdGlvbnMudHh0IGIvRG9jdW1lbnRhdGlvbi94ODZfNjQvYm9vdC1vcHRpb25zLnR4dAppbmRleCBlNTY2YWZmLi45YzVmYzE1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3g4Nl82NC9ib290LW9wdGlvbnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24veDg2XzY0L2Jvb3Qtb3B0aW9ucy50eHQKQEAgLTEyNSw3ICsxMjUsNyBAQAogICBjcHVtYXNrPU1BU0sgICBvbmx5IHVzZSBjcHVzIHdpdGggYml0cyBzZXQgaW4gbWFzawogCiAgIGFkZGl0aW9uYWxfY3B1cz1OVU0gQWxsb3cgTlVNIG1vcmUgQ1BVcyBmb3IgaG90cGx1ZwotCQkgKGRlZmF1bHRzIGFyZSBzcGVjaWZpZWQgYnkgdGhlIEJJT1Mgb3IgaGFsZiB0aGUgYXZhaWxhYmxlIENQVXMpCisJCSAoZGVmYXVsdHMgYXJlIHNwZWNpZmllZCBieSB0aGUgQklPUywgc2VlIERvY3VtZW50YXRpb24veDg2XzY0L2NwdS1ob3RwbHVnLXNwZWMpCiAKIE5VTUEKIApAQCAtMTk4LDYgKzE5OCw2IEBACiAKIE1pc2MKIAotICBub3JlcGxhY2VtZW50ICBEb24ndCByZXBsYWNlIGluc3RydWN0aW9ucyB3aXRoIG1vcmUgYXBwcm9waWF0ZSBvbmVzCisgIG5vcmVwbGFjZW1lbnQgIERvbid0IHJlcGxhY2UgaW5zdHJ1Y3Rpb25zIHdpdGggbW9yZSBhcHByb3ByaWF0ZSBvbmVzCiAJCSBmb3IgdGhlIENQVS4gVGhpcyBtYXkgYmUgdXNlZnVsIG9uIGFzeW1tZXRyaWMgTVAgc3lzdGVtcwogCQkgd2hlcmUgc29tZSBDUFUgaGF2ZSBsZXNzIGNhcGFiaWxpdGllcyB0aGFuIHRoZSBvdGhlcnMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3g4Nl82NC9jcHUtaG90cGx1Zy1zcGVjIGIvRG9jdW1lbnRhdGlvbi94ODZfNjQvY3B1LWhvdHBsdWctc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzBmYTM0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi94ODZfNjQvY3B1LWhvdHBsdWctc3BlYwpAQCAtMCwwICsxLDIxIEBACitGaXJtd2FyZSBzdXBwb3J0IGZvciBDUFUgaG90cGx1ZyB1bmRlciBMaW51eC94ODYtNjQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMaW51eC94ODYtNjQgc3VwcG9ydHMgQ1BVIGhvdHBsdWcgbm93LiBGb3IgdmFyaW91cyByZWFzb25zIExpbnV4IHdhbnRzIHRvCitrbm93IGluIGFkdmFuY2UgYm9vdCB0aW1lIHRoZSBtYXhpbXVtIG51bWJlciBvZiBDUFVzIHRoYXQgY291bGQgYmUgcGx1Z2dlZAoraW50byB0aGUgc3lzdGVtLiBBQ1BJIDMuMCBjdXJyZW50bHkgaGFzIG5vIG9mZmljaWFsIHdheSB0byBzdXBwbHkKK3RoaXMgaW5mb3JtYXRpb24gZnJvbSB0aGUgZmlybXdhcmUgdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0uCisKK0luIEFDUEkgZWFjaCBDUFUgbmVlZHMgYW4gTEFQSUMgb2JqZWN0IGluIHRoZSBNQURUIHRhYmxlICg1LjIuMTEuNSBpbiB0aGUKK0FDUEkgMy4wIHNwZWNpZmljYXRpb24pLiAgQUNQSSBhbHJlYWR5IGhhcyB0aGUgY29uY2VwdCBvZiBkaXNhYmxlZCBMQVBJQworb2JqZWN0cyBieSBzZXR0aW5nIHRoZSBFbmFibGVkIGJpdCBpbiB0aGUgTEFQSUMgb2JqZWN0IHRvIHplcm8uCisKK0ZvciBDUFUgaG90cGx1ZyBMaW51eC94ODYtNjQgZXhwZWN0cyBub3cgdGhhdCBhbnkgcG9zc2libGUgZnV0dXJlIGhvdHBsdWdnYWJsZQorQ1BVIGlzIGFscmVhZHkgYXZhaWxhYmxlIGluIHRoZSBNQURULiBJZiB0aGUgQ1BVIGlzIG5vdCBhdmFpbGFibGUgeWV0CitpdCBzaG91bGQgaGF2ZSBpdHMgTEFQSUMgRW5hYmxlZCBiaXQgc2V0IHRvIDAuIExpbnV4IHdpbGwgdXNlIHRoZSBudW1iZXIKK29mIGRpc2FibGVkIExBUElDcyB0byBjb21wdXRlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmdXR1cmUgQ1BVcy4KKworSW4gdGhlIHdvcnN0IGNhc2UgdGhlIHVzZXIgY2FuIG92ZXJ3cml0ZSB0aGlzIGNob2ljZSB1c2luZyBhIGNvbW1hbmQgbGluZQorb3B0aW9uIChhZGRpdGlvbmFsX2NwdXM9Li4uKSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIHN1cHBseSB0aGUgY29ycmVjdAorbnVtYmVyIChvciBhIHJlYXNvbmFibGUgYXBwcm94aW1hdGlvbiBvZiBpdCwgd2l0aCBlcnJpbmcgdG93YXJkcyBtb3JlIG5vdCBsZXNzKQoraW4gdGhlIE1BRFQgdG8gYXZvaWQgbWFudWFsIGNvbmZpZ3VyYXRpb24uCmRpZmYgLS1naXQgYS9LYnVpbGQgYi9LYnVpbGQKaW5kZXggNzkwMDM5MS4uOTVkNmEwMCAxMDA2NDQKLS0tIGEvS2J1aWxkCisrKyBiL0tidWlsZApAQCAtMjIsOCArMjIsNiBAQAogCiBxdWlldF9jbWRfb2Zmc2V0cyA9IEdFTiAgICAgJEAKIGRlZmluZSBjbWRfb2Zmc2V0cwotCW1rZGlyIC1wICQoZGlyICRAKTsgXAotCWNhdCAkPCB8IFwKIAkoc2V0IC1lOyBcCiAJIGVjaG8gIiNpZm5kZWYgX19BU01fT0ZGU0VUU19IX18iOyBcCiAJIGVjaG8gIiNkZWZpbmUgX19BU01fT0ZGU0VUU19IX18iOyBcCkBAIC0zNCw3ICszMiw3IEBACiAJIGVjaG8gIiAqIjsgXAogCSBlY2hvICIgKi8iOyBcCiAJIGVjaG8gIiI7IFwKLQkgc2VkIC1uZSAkKHNlZC15KTsgXAorCSBzZWQgLW5lICQoc2VkLXkpICQ8OyBcCiAJIGVjaG8gIiI7IFwKIAkgZWNobyAiI2VuZGlmIiApID4gJEAKIGVuZGVmCkBAIC00NSw1ICs0Myw2IEBACiAJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGNjX3NfYykKIAogJChvYmopLyQob2Zmc2V0cy1maWxlKTogYXJjaC8kKEFSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5zIEtidWlsZAorCSQoUSlta2RpciAtcCAkKGRpciAkQCkKIAkkKGNhbGwgY21kLG9mZnNldHMpCiAKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggYmNlNzEyMy4uM2Y4YTkwYSAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTE4Miw3ICsxODIsNyBAQAogQUNQSQogUDoJTGVuIEJyb3duCiBNOglsZW4uYnJvd25AaW50ZWwuY29tCi1MOglhY3BpLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorTDoJbGludXgtYWNwaUB2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly9hY3BpLnNvdXJjZWZvcmdlLm5ldC8KIFQ6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbGVuYi9saW51eC1hY3BpLTIuNi5naXQKIFM6CU1haW50YWluZWQKQEAgLTU0NiwxNiArNTQ2LDEwIEBACiBUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvdjRsLWR2Yi5naXQKIFM6CU1haW50YWluZWQKIAotQlVTTE9HSUMgU0NTSSBEUklWRVIKLVA6CUxlb25hcmQgTi4gWnVia29mZgotTToJTGVvbmFyZCBOLiBadWJrb2ZmIDxsbnpAZGFuZGVsaW9uLmNvbT4KLUw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCi1XOglodHRwOi8vd3d3LmRhbmRlbGlvbi5jb20vTGludXgvCi1TOglNYWludGFpbmVkCi0KIENPTU1PTiBJTlRFUk5FVCBGSUxFIFNZU1RFTSAoQ0lGUykKIFA6CVN0ZXZlIEZyZW5jaAogTToJc2ZyZW5jaEBzYW1iYS5vcmcKK0w6CWxpbnV4LWNpZnMtY2xpZW50QGxpc3RzLnNhbWJhLm9yZwogTDoJc2FtYmEtdGVjaG5pY2FsQGxpc3RzLnNhbWJhLm9yZwogVzoJaHR0cDovL3VzMS5zYW1iYS5vcmcvc2FtYmEvTGludXhfQ0lGU19jbGllbnQuaHRtbAogVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9zZnJlbmNoL2NpZnMtMi42LmdpdApAQCAtODExLDYgKzgwNSw3IEBACiBET0NCT09LIEZPUiBET0NVTUVOVEFUSU9OCiBQOglNYXJ0aW4gV2FpdHoKIE06CXRhbGlAYWRtaW5naWxkZS5vcmcKK1Q6CWdpdCBodHRwOi8vdGFsaS5hZG1pbmdpbGRlLm9yZy9naXQvbGludXgtZG9jYm9vay5naXQKIFM6CU1haW50YWluZWQKIAogRE9VQkxFVEFMSyBEUklWRVIKQEAgLTg3Miw2ICs4NjcsMTUgQEAKIFc6CWh0dHA6Ly9lYnRhYmxlcy5zb3VyY2Vmb3JnZS5uZXQvCiBTOglNYWludGFpbmVkCiAKK0VEQUMtQ09SRQorUDogICAgICBEb3VnIFRob21wc29uCitNOiAgICAgIG5vcnNrNUB4bWlzc2lvbi5jb20sIGR0aG9tcHNvbkBsaW51eG5ldHdvcnguY29tCitQOiAgICAgIERhdmUgUGV0ZXJzb24KK006ICAgICAgZHNwQGxsbmwuZ292LCBkYXZlX3BldGVyc29uQHBvYm94LmNvbQorTDogICAgICBibHVlc21va2UtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CitXOiAgICAgIGJsdWVzbW9rZS5zb3VyY2Vmb3JnZS5uZXQKK1M6ICAgICAgTWFpbnRhaW5lZAorCiBFRVBSTzEwMCBORVRXT1JLIERSSVZFUgogUDoJQW5kcmV5IFYuIFNhdm9jaGtpbgogTToJc2F3QHNhdy5zdy5jb20uc2cKQEAgLTkyNyw3ICs5MzEsNiBAQAogRkFSU1lOQyBTWU5DSFJPTk9VUyBEUklWRVIKIFA6CUtldmluIEN1cnRpcwogTToJa2V2aW4uY3VydGlzQGZhcnNpdGUuY28udWsKLU06CWtldmluLmN1cnRpc0BmYXJzaXRlLmNvLnVrCiBXOglodHRwOi8vd3d3LmZhcnNpdGUuY28udWsvCiBTOglTdXBwb3J0ZWQKIApAQCAtMTMwNyw2ICsxMzEwLDEyIEBACiBMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKK0lOVEVMIEZSQU1FQlVGRkVSIERSSVZFUiAoZXhjbHVkaW5nIDgxMCBhbmQgODE1KQorUDogICAgICBTeWx2YWluIE1leWVyCitNOiAgICAgIHN5bHZhaW4ubWV5ZXJAd29ybGRvbmxpbmUuZnIKK0w6ICAgICAgbGludXgtZmJkZXYtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CitTOiAgICAgIE1haW50YWluZWQKKwogSU5URUwgODEwLzgxNSBGUkFNRUJVRkZFUiBEUklWRVIKIFA6ICAgICAgQW50b25pbm8gRGFwbGFzCiBNOiAgICAgIGFkYXBsYXNAcG9sLm5ldApAQCAtMTM5OCw3ICsxNDA3LDcgQEAKIFA6CUplYW4gVG91cnJpbGhlcwogTDoJaXJkYS11c2Vyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgKHN1YnNjcmliZXJzLW9ubHkpCiBXOglodHRwOi8vaXJkYS5zb3VyY2Vmb3JnZS5uZXQvCi1TOglNYWludGFpbmVkCitTOglPZGQgRml4ZXMKIAogSVNBUE5QCiBQOglKYXJvc2xhdiBLeXNlbGEKQEAgLTE2OTYsMTIgKzE3MDUsMTMgQEAKIFc6IGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9kb2NzL21hbnBhZ2VzCiBTOiBNYWludGFpbmVkCiAKLU1BUlZFTEwgTVY2NDM0MCBFVEhFUk5FVCBEUklWRVIKK01BUlZFTEwgTVY2NDNYWCBFVEhFUk5FVCBEUklWRVIKK1A6CURhbGUgRmFybnN3b3J0aAorTToJZGFsZUBmYXJuc3dvcnRoLm9yZwogUDoJTWFuaXNoIExhY2h3YW5pCi1NOglNYW5pc2hfTGFjaHdhbmlAcG1jLXNpZXJyYS5jb20KLUw6CWxpbnV4LW1pcHNAbGludXgtbWlwcy5vcmcKK006CW1sYWNod2FuaUBtdmlzdGEuY29tCiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCi1TOglTdXBwb3J0ZWQKK1M6CU9kZCBGaXhlcyBmb3IgMi40OyBNYWludGFpbmVkIGZvciAyLjYuCiAKIE1BVFJPWCBGUkFNRUJVRkZFUiBEUklWRVIKIFA6CVBldHIgVmFuZHJvdmVjCkBAIC0xODQyLDcgKzE4NTIsMTQgQEAKIFA6CVBhdHJpY2sgTWNIYXJkeQogTToJa2FiZXJAY29yZXdvcmtzLmRlCiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCi1UOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZGF2ZW0vbmV0LTIuNi5naXQKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvZGF2ZW0vbmV0LTIuNi5naXQKK1M6CU1haW50YWluZWQKKworTkVUV09SS0lORyBbV0lSRUxFU1NdCitQOglKb2huIFcuIExpbnZpbGxlCitNOglsaW52aWxsZUB0dXhkcml2ZXIuY29tCitMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2xpbnZpbGxlL3dpcmVsZXNzLTIuNi5naXQKIFM6CU1haW50YWluZWQKIAogSVBWUwpAQCAtMTg5NywxMSArMTkxNCwxMSBAQAogVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9haWEyMS9udGZzLTIuNi5naXQKIFM6CU1haW50YWluZWQKIAotTlZJRElBIChSSVZBKSBGUkFNRUJVRkZFUiBEUklWRVIKLVA6CUFuaSBKb3NoaQotTToJYWpvc2hpQHNoZWxsLnVuaXhib3guY29tCi1MOglsaW51eC1udmlkaWFAbGlzdHMuc3VyZnNvdXRoLmNvbQotUzoJTWFpbnRhaW5lZAorTlZJRElBIChyaXZhZmIgYW5kIG52aWRpYWZiKSBGUkFNRUJVRkZFUiBEUklWRVIKK1A6ICAgICAgQW50b25pbm8gRGFwbGFzCitNOiAgICAgIGFkYXBsYXNAcG9sLm5ldAorTDogICAgICBsaW51eC1mYmRldi1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK1M6ICAgICAgTWFpbnRhaW5lZAogCiBPUkFDTEUgQ0xVU1RFUiBGSUxFU1lTVEVNIDIgKE9DRlMyKQogUDoJTWFyayBGYXNoZWgKQEAgLTE5OTYsNiArMjAxMywxMyBAQAogTDoJbGludXgtYWJpLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAogUzoJTWFpbnRhaW5lZAogCitQQ0kgRVJST1IgUkVDT1ZFUlkKK1A6CUxpbmFzIFZlcHN0YXMKK006CWxpbmFzQGF1c3Rpbi5pYm0uY29tCitMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCitMOglsaW51eC1wY2lAYXRyZXkua2FybGluLm1mZi5jdW5pLmN6CitTOglTdXBwb3J0ZWQKKwogUENJIFNPVU5EIERSSVZFUlMgKEVTMTM3MCwgRVMxMzcxIGFuZCBTT05JQ1ZJQkVTKQogUDoJVGhvbWFzIFNhaWxlcgogTToJc2FpbGVyQGlmZS5lZS5ldGh6LmNoCkBAIC0yMDU0LDcgKzIwNzgsNyBAQAogUE9TSVggQ0xPQ0tTIGFuZCBUSU1FUlMKIFA6CUdlb3JnZSBBbnppbmdlcgogTToJZ2VvcmdlQG12aXN0YS5jb20KLUw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK0w6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKIFM6CVN1cHBvcnRlZAogCiBQT1dFUlBDIDR4eCBFTUFDIERSSVZFUgpAQCAtMjE4OSw2ICsyMjEzLDEyIEBACiBXOgl3d3cucnRsaW51eC5vcmcKIFM6CU1haW50YWluZWQKIAorUzMgU0FWQUdFIEZSQU1FQlVGRkVSIERSSVZFUgorUDogICAgICBBbnRvbmlubyBEYXBsYXMKK006ICAgICAgYWRhcGxhc0Bwb2wubmV0CitMOiAgICAgIGxpbnV4LWZiZGV2LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorUzogICAgICBNYWludGFpbmVkCisKIFMzOTAKIFA6CU1hcnRpbiBTY2h3aWRlZnNreQogTToJc2Nod2lkZWZza3lAZGUuaWJtLmNvbQpAQCAtMjM2MCwxMyArMjM5MCw2IEBACiBNOgluaWNvQGNhbS5vcmcKIFM6CU1haW50YWluZWQKIAotU05BIE5FVFdPUksgTEFZRVIKLVA6CUpheSBTY2h1bGlzdAotTToJanNjaGxzdEBzYW1iYS5vcmcKLUw6CWxpbnV4LXNuYUB0dXJib2xpbnV4LmNvbQotVzoJaHR0cDovL3d3dy5saW51eC1zbmEub3JnCi1TOglTdXBwb3J0ZWQKLQogU09GVFdBUkUgUkFJRCAoTXVsdGlwbGUgRGlza3MpIFNVUFBPUlQKIFA6CUluZ28gTW9sbmFyCiBNOgltaW5nb0ByZWRoYXQuY29tCkBAIC0yNDg4LDcgKzI1MTEsNyBAQAogTToJbGV0aGFsQGxpbnV4LXNoLm9yZwogUDoJS2F6dW1vdG8gS29qaW1hCiBNOglra29qaW1hQHJyLmlpajR1Lm9yLmpwCi1MOglsaW51eC1zaEBtMTduLm9yZworTDoJbGludXhzaC1kZXZAbGlzdHMuc291cmNlZm9yZ2UubmV0CiBXOglodHRwOi8vd3d3LmxpbnV4LXNoLm9yZwogVzoJaHR0cDovL3d3dy5tMTduLm9yZy9saW51eC1zaC8KIFc6CWh0dHA6Ly93d3cucnIuaWlqNHUub3IuanAvfmtrb2ppbWEvbGludXgtc2g0Lmh0bWwKQEAgLTI1MjcsNiArMjU1MCwxOSBAQAogTTogICAgIHJvbXNAbHBnLnRpY2FsYy5vcmcKIFM6ICAgICBNYWludGFpbmVkCiAKK1RJUEMgTkVUV09SSyBMQVlFUgorUDoJUGVyIExpZGVuCitNOglwZXIubGlkZW5AZXJpY3Nzb24uY29tCitQOglKb24gTWFsb3kKK006CWpvbi5tYWxveUBlcmljc3Nvbi5jb20KK1A6CUFsbGFuIFN0ZXBoZW5zCitNOglhbGxhbi5zdGVwaGVuc0B3aW5kcml2ZXIuY29tCitMOgl0aXBjLWRpc2N1c3Npb25AbGlzdHMuc291cmNlZm9yZ2UubmV0CitXOglodHRwOi8vdGlwYy5zb3VyY2Vmb3JnZS5uZXQvCitXOglodHRwOi8vdGlwYy5jc2xhYi5lcmljc3Nvbi5uZXQvCitUOglnaXQgdGlwYy5jc2xhYi5lcmljc3Nvbi5uZXQ6L3B1Yi9naXQvdGlwYy5naXQKK1M6CU1haW50YWluZWQKKwogVExBTiBORVRXT1JLIERSSVZFUgogUDoJU2FtdWVsIENoZXNzbWFuCiBNOgljaGVzc21hbkB0dXgub3JnCkBAIC0yOTQ4LDYgKzI5ODQsMTIgQEAKIFc6CWh0dHA6Ly93d3cuc2FuZ29tYS5jb20KIFM6CVN1cHBvcnRlZAogCitXQVRDSERPRyBERVZJQ0UgRFJJVkVSUworUDoJV2ltIFZhbiBTZWJyb2VjaworTToJd2ltQGlndWFuYS5iZQorVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC93aW0vbGludXgtMi42LXdhdGNoZG9nLmdpdAorUzoJTWFpbnRhaW5lZAorCiBXQVZFTEFOIE5FVFdPUksgRFJJVkVSICYgV0lSRUxFU1MgRVhURU5TSU9OUwogUDoJSmVhbiBUb3VycmlsaGVzCiBNOglqdEBocGwuaHAuY29tCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IDU5OWU3NDQuLjI1MmE2NTkgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogVkVSU0lPTiA9IDIKIFBBVENITEVWRUwgPSA2Ci1TVUJMRVZFTCA9IDE1Ci1FWFRSQVZFUlNJT04gPQorU1VCTEVWRUwgPSAxNgorRVhUUkFWRVJTSU9OID0tcmMxCiBOQU1FPVNsaWRpbmcgU25vdyBMZW9wYXJkCiAKICMgKkRPQ1VNRU5UQVRJT04qCkBAIC0xMDYsMTIgKzEwNiwxMyBAQAogJChpZiAkKEtCVUlMRF9PVVRQVVQpLCwgXAogICAgICAkKGVycm9yIG91dHB1dCBkaXJlY3RvcnkgIiQoc2F2ZWQtb3V0cHV0KSIgZG9lcyBub3QgZXhpc3QpKQogCi0uUEhPTlk6ICQoTUFLRUNNREdPQUxTKQorLlBIT05ZOiAkKE1BS0VDTURHT0FMUykgY2RidWlsZGRpcgorJChNQUtFQ01ER09BTFMpIF9hbGw6IGNkYnVpbGRkaXIKIAotJChmaWx0ZXItb3V0IF9hbGwsJChNQUtFQ01ER09BTFMpKSBfYWxsOgorY2RidWlsZGRpcjoKIAkkKGlmICQoS0JVSUxEX1ZFUkJPU0U6MT0pLEApJChNQUtFKSAtQyAkKEtCVUlMRF9PVVRQVVQpIFwKIAlLQlVJTERfU1JDPSQoQ1VSRElSKSBcCi0JS0JVSUxEX0VYVE1PRD0iJChLQlVJTERfRVhUTU9EKSIgLWYgJChDVVJESVIpL01ha2VmaWxlICRACisJS0JVSUxEX0VYVE1PRD0iJChLQlVJTERfRVhUTU9EKSIgLWYgJChDVVJESVIpL01ha2VmaWxlICQoTUFLRUNNREdPQUxTKQogCiAjIExlYXZlIHByb2Nlc3NpbmcgdG8gYWJvdmUgaW52b2NhdGlvbiBvZiBtYWtlCiBza2lwLW1ha2VmaWxlIDo9IDEKQEAgLTE0MSwyNCArMTQyLDYgQEAKIAogZXhwb3J0IHNyY3RyZWUgb2JqdHJlZSBWUEFUSCBUT1BESVIKIAotbnVsbHN0cmluZyA6PQotc3BhY2UgICAgICA6PSAkKG51bGxzdHJpbmcpICMgZW5kIG9mIGxpbmUKLQotIyBUYWtlIHRoZSBjb250ZW50cyBvZiBhbnkgZmlsZXMgY2FsbGVkIGxvY2FsdmVyc2lvbiogYW5kIHRoZSBjb25maWcKLSMgdmFyaWFibGUgQ09ORklHX0xPQ0FMVkVSU0lPTiBhbmQgYXBwZW5kIHRoZW0gdG8gS0VSTkVMUkVMRUFTRS4gQmUKLSMgY2FyZWZ1bCBub3QgdG8gaW5jbHVkZSBmaWxlcyB0d2ljZSBpZiBidWlsZGluZyBpbiB0aGUgc291cmNlCi0jIGRpcmVjdG9yeS4gTE9DQUxWRVJTSU9OIGZyb20gdGhlIGNvbW1hbmQgbGluZSBvdmVycmlkZSBhbGwgb2YgdGhpcwotCi1sb2NhbHZlciA6PSAkKG9ianRyZWUpL2xvY2FsdmVyc2lvbiogJChzcmN0cmVlKS9sb2NhbHZlcnNpb24qCi1sb2NhbHZlciA6PSAkKHNvcnQgJCh3aWxkY2FyZCAkKGxvY2FsdmVyKSkpCi0jIHNraXAgYmFja3VwIGZpbGVzIChjb250YWluaW5nICd+JykKLWxvY2FsdmVyIDo9ICQoZm9yZWFjaCBmLCAkKGxvY2FsdmVyKSwgJChpZiAkKGZpbmRzdHJpbmcgfiwgJChmKSksLCQoZikpKQotCi1MT0NBTFZFUlNJT04gPSAkKHN1YnN0ICQoc3BhY2UpLCwgXAotCSAgICAgICAkKHNoZWxsIGNhdCAvZGV2L251bGwgJChsb2NhbHZlcikpIFwKLQkgICAgICAgJChwYXRzdWJzdCAiJSIsJSwkKENPTkZJR19MT0NBTFZFUlNJT04pKSkKLQotS0VSTkVMUkVMRUFTRT0kKFZFUlNJT04pLiQoUEFUQ0hMRVZFTCkuJChTVUJMRVZFTCkkKEVYVFJBVkVSU0lPTikkKExPQ0FMVkVSU0lPTikKIAogIyBTVUJBUkNIIHRlbGxzIHRoZSB1c2VybW9kZSBidWlsZCB3aGF0IHRoZSB1bmRlcmx5aW5nIGFyY2ggaXMuICBUaGF0IGlzIHNldAogIyBmaXJzdCwgYW5kIGlmIGEgdXNlcm1vZGUgYnVpbGQgaXMgaGFwcGVuaW5nLCB0aGUgIkFSQ0g9dW0iIG9uIHRoZSBjb21tYW5kCkBAIC0xNjksNyArMTUyLDcgQEAKIFNVQkFSQ0ggOj0gJChzaGVsbCB1bmFtZSAtbSB8IHNlZCAtZSBzL2kuODYvaTM4Ni8gLWUgcy9zdW40dS9zcGFyYzY0LyBcCiAJCQkJICAtZSBzL2FybS4qL2FybS8gLWUgcy9zYTExMC9hcm0vIFwKIAkJCQkgIC1lIHMvczM5MHgvczM5MC8gLWUgcy9wYXJpc2M2NC9wYXJpc2MvIFwKLQkJCQkgIC1lIHMvcHBjNjQvcG93ZXJwYy8gKQorCQkJCSAgLWUgcy9wcGMuKi9wb3dlcnBjLyApCiAKICMgQ3Jvc3MgY29tcGlsaW5nIGFuZCBzZWxlY3RpbmcgZGlmZmVyZW50IHNldCBvZiBnY2MvYmluLXV0aWxzCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjUxLDcgKzIzNCw3IEBACiAjIElmIGl0IGlzIHNldCB0byAic2lsZW50XyIsIG5vdGhpbmcgd2lsIGJlIHByaW50ZWQgYXQgYWxsLCBzaW5jZQogIyB0aGUgdmFyaWFibGUgJChzaWxlbnRfY21kX2NjX29fYykgZG9lc24ndCBleGlzdC4KICMKLSMgQSBzaW1wbGUgdmFyaWFudCBpcyB0byBwcmVmaXggY29tbWFuZHMgd2l0aCAkKFEpIC0gdGhhdCdzIHVzZWZ1bGwKKyMgQSBzaW1wbGUgdmFyaWFudCBpcyB0byBwcmVmaXggY29tbWFuZHMgd2l0aCAkKFEpIC0gdGhhdCdzIHVzZWZ1bAogIyBmb3IgY29tbWFuZHMgdGhhdCBzaGFsbCBiZSBoaWRkZW4gaW4gbm9uLXZlcmJvc2UgbW9kZS4KICMKICMJJChRKWxuICRAIDo8CkBAIC0yODAsNiArMjYzLDEzIEBACiAjIGNjIHN1cHBvcnQgZnVuY3Rpb25zIHRvIGJlIHVzZWQgKG9ubHkpIGluIGFyY2gvJChBUkNIKS9NYWtlZmlsZQogIyBTZWUgZG9jdW1lbnRhdGlvbiBpbiBEb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0CiAKKyMgYXMtb3B0aW9uCisjIFVzYWdlOiBjZmxhZ3MteSArPSAkKGNhbGwgYXMtb3B0aW9uLCAtV2EkKGNvbW1hKS1pc2E9Zm9vLCkKKworYXMtb3B0aW9uID0gJChzaGVsbCBpZiAkKENDKSAkKENGTEFHUykgJCgxKSAtV2EsLVogLWMgLW8gL2Rldi9udWxsIFwKKwkgICAgIC14YXNzZW1ibGVyIC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIGVjaG8gIiQoMSkiOyBcCisJICAgICBlbHNlIGVjaG8gIiQoMikiOyBmaSA7KQorCiAjIGNjLW9wdGlvbgogIyBVc2FnZTogY2ZsYWdzLXkgKz0gJChjYWxsIGNjLW9wdGlvbiwgLW1hcmNoPXdpbmNoaXAtYzYsIC1tYXJjaD1pNTg2KQogCkBAIC0zNTMsNyArMzQzLDExIEBACiAJCSAgIC1mZnJlZXN0YW5kaW5nCiBBRkxBR1MJCTo9IC1EX19BU1NFTUJMWV9fCiAKLWV4cG9ydAlWRVJTSU9OIFBBVENITEVWRUwgU1VCTEVWRUwgRVhUUkFWRVJTSU9OIExPQ0FMVkVSU0lPTiBLRVJORUxSRUxFQVNFIFwKKyMgUmVhZCBLRVJORUxSRUxFQVNFIGZyb20gLmtlcm5lbHJlbGVhc2UgKGlmIGl0IGV4aXN0cykKK0tFUk5FTFJFTEVBU0UgPSAkKHNoZWxsIGNhdCAua2VybmVscmVsZWFzZSAyPiAvZGV2L251bGwpCitLRVJORUxWRVJTSU9OID0gJChWRVJTSU9OKS4kKFBBVENITEVWRUwpLiQoU1VCTEVWRUwpJChFWFRSQVZFUlNJT04pCisKK2V4cG9ydAlWRVJTSU9OIFBBVENITEVWRUwgU1VCTEVWRUwgS0VSTkVMUkVMRUFTRSBLRVJORUxWRVJTSU9OIFwKIAlBUkNIIENPTkZJR19TSEVMTCBIT1NUQ0MgSE9TVENGTEFHUyBDUk9TU19DT01QSUxFIEFTIExEIENDIFwKIAlDUFAgQVIgTk0gU1RSSVAgT0JKQ09QWSBPQkpEVU1QIE1BS0UgQVdLIEdFTktTWU1TIFBFUkwgVVRTX01BQ0hJTkUgXAogCUhPU1RDWFggSE9TVENYWEZMQUdTIExERkxBR1NfTU9EVUxFIENIRUNLIENIRUNLRkxBR1MKQEAgLTQ0OCw2ICs0NDIsNyBAQAogY29uZmlnICVjb25maWc6IHNjcmlwdHNfYmFzaWMgb3V0cHV0bWFrZWZpbGUgRk9SQ0UKIAkkKFEpbWtkaXIgLXAgaW5jbHVkZS9saW51eAogCSQoUSkkKE1BS0UpICQoYnVpbGQpPXNjcmlwdHMva2NvbmZpZyAkQAorCSQoUSkkKE1BS0UpIC5rZXJuZWxyZWxlYXNlCiAKIGVsc2UKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC01NTEsMzMgKzU0NiwxMyBAQAogIyBpbWFnZXMuIERlZmF1bHQgaXMgL2Jvb3QsIGJ1dCB5b3UgY2FuIHNldCBpdCB0byBvdGhlciB2YWx1ZXMKIGV4cG9ydAlJTlNUQUxMX1BBVEggPz0gL2Jvb3QKIAotIyBJZiBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgc2V0LCB3ZSBhdXRvbWF0aWNhbGx5IHBlcmZvcm0gc29tZSB0ZXN0cwotIyBhbmQgdHJ5IHRvIGRldGVybWluZSBpZiB0aGUgY3VycmVudCBzb3VyY2UgdHJlZSBpcyBhIHJlbGVhc2UgdHJlZSwgb2YgYW55IHNvcnQsCi0jIG9yIGlmIGlzIGEgcHVyZSBkZXZlbG9wbWVudCB0cmVlLgotIwotIyBBICdyZWxlYXNlIHRyZWUnIGlzIGFueSB0cmVlIHdpdGggYSBnaXQgVEFHIGFzc29jaWF0ZWQKLSMgd2l0aCBpdC4gIFRoZSBwcmltYXJ5IGdvYWwgb2YgdGhpcyBpcyB0byBtYWtlIGl0IHNhZmUgZm9yIGEgbmF0aXZlCi0jIGdpdC9DVlMvU1ZOIHVzZXIgdG8gYnVpbGQgYSByZWxlYXNlIHRyZWUgKGkuZSwgMi42LjkpIGFuZCBhbHNvIHRvCi0jIGNvbnRpbnVlIGRldmVsb3BpbmcgYWdhaW5zdCB0aGUgY3VycmVudCBMaW51cyB0cmVlLCB3aXRob3V0IGhhdmluZyB0aGUgTGludXMKLSMgdHJlZSBvdmVyd3JpdGUgdGhlIDIuNi45IHRyZWUgd2hlbiBpbnN0YWxsZWQuCi0jCi0jIEN1cnJlbnRseSwgb25seSBnaXQgaXMgc3VwcG9ydGVkLgotIyBPdGhlciBTQ01zIGNhbiBlZGl0IHNjcmlwdHMvc2V0bG9jYWx2ZXJzaW9uIGFuZCBhZGQgdGhlIGFwcHJvcHJpYXRlCi0jIGNoZWNrcyBhcyBuZWVkZWQuCi0KLQotaWZkZWYgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPCi0JbG9jYWx2ZXJzaW9uLWF1dG8gOj0gJChzaGVsbCAkKFBFUkwpICQoc3JjdHJlZSkvc2NyaXB0cy9zZXRsb2NhbHZlcnNpb24gJChzcmN0cmVlKSkKLQlMT0NBTFZFUlNJT04gOj0gJChMT0NBTFZFUlNJT04pJChsb2NhbHZlcnNpb24tYXV0bykKLWVuZGlmCi0KICMKICMgSU5TVEFMTF9NT0RfUEFUSCBzcGVjaWZpZXMgYSBwcmVmaXggdG8gTU9ETElCIGZvciBtb2R1bGUgZGlyZWN0b3J5CiAjIHJlbG9jYXRpb25zIHJlcXVpcmVkIGJ5IGJ1aWxkIHJvb3RzLiAgVGhpcyBpcyBub3QgZGVmaW5lZCBpbiB0aGUKICMgbWFrZWZpbGUgYnV0IHRoZSBhcmd1ZW1lbnQgY2FuIGJlIHBhc3NlZCB0byBtYWtlIGlmIG5lZWRlZC4KICMKIAotTU9ETElCCTo9ICQoSU5TVEFMTF9NT0RfUEFUSCkvbGliL21vZHVsZXMvJChLRVJORUxSRUxFQVNFKQorTU9ETElCCT0gJChJTlNUQUxMX01PRF9QQVRIKS9saWIvbW9kdWxlcy8kKEtFUk5FTFJFTEVBU0UpCiBleHBvcnQgTU9ETElCCiAKIApAQCAtNzgyLDYgKzc1Nyw0OCBAQAogJCh2bWxpbnV4LWRpcnMpOiBwcmVwYXJlIHNjcmlwdHMKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kQAogCisjIEJ1aWxkIHRoZSBrZXJuZWwgcmVsZWFzZSBzdHJpbmcKKyMgVGhlIEtFUk5FTFJFTEVBU0UgaXMgc3RvcmVkIGluIGEgZmlsZSBuYW1lZCAua2VybmVscmVsZWFzZQorIyB0byBiZSB1c2VkIHdoZW4gZXhlY3V0aW5nIGZvciBleGFtcGxlIG1ha2UgaW5zdGFsbCBvciBtYWtlIG1vZHVsZXNfaW5zdGFsbAorIworIyBUYWtlIHRoZSBjb250ZW50cyBvZiBhbnkgZmlsZXMgY2FsbGVkIGxvY2FsdmVyc2lvbiogYW5kIHRoZSBjb25maWcKKyMgdmFyaWFibGUgQ09ORklHX0xPQ0FMVkVSU0lPTiBhbmQgYXBwZW5kIHRoZW0gdG8gS0VSTkVMUkVMRUFTRS4KKyMgTE9DQUxWRVJTSU9OIGZyb20gdGhlIGNvbW1hbmQgbGluZSBvdmVycmlkZSBhbGwgb2YgdGhpcworCitudWxsc3RyaW5nIDo9CitzcGFjZSAgICAgIDo9ICQobnVsbHN0cmluZykgIyBlbmQgb2YgbGluZQorCitfX19sb2NhbHZlciA9ICQob2JqdHJlZSkvbG9jYWx2ZXJzaW9uKiAkKHNyY3RyZWUpL2xvY2FsdmVyc2lvbioKK19fbG9jYWx2ZXIgID0gJChzb3J0ICQod2lsZGNhcmQgJChfX19sb2NhbHZlcikpKQorIyBza2lwIGJhY2t1cCBmaWxlcyAoY29udGFpbmluZyAnficpCitfbG9jYWx2ZXIgPSAkKGZvcmVhY2ggZiwgJChfX2xvY2FsdmVyKSwgJChpZiAkKGZpbmRzdHJpbmcgfiwgJChmKSksLCQoZikpKQorCitsb2NhbHZlciA9ICQoc3Vic3QgJChzcGFjZSksLCBcCisJICAgJChzaGVsbCBjYXQgL2Rldi9udWxsICQoX2xvY2FsdmVyKSkgXAorCSAgICQocGF0c3Vic3QgIiUiLCUsJChDT05GSUdfTE9DQUxWRVJTSU9OKSkpCisJICAgICAgIAorIyBJZiBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgc2V0IHNjcmlwdHMvc2V0bG9jYWx2ZXJzaW9uIGlzIGNhbGxlZAorIyBhbmQgaWYgdGhlIFNDTSBpcyBrbm93IGEgdGFnIGZyb20gdGhlIFNDTSBpcyBhcHBlbmRlZC4KKyMgVGhlIGFwcGVuZGVkIHRhZyBpcyBkZXRlcm1pbmRlZCBieSB0aGUgU0NNIHVzZWQuCisjCisjIEN1cnJlbnRseSwgb25seSBnaXQgaXMgc3VwcG9ydGVkLgorIyBPdGhlciBTQ01zIGNhbiBlZGl0IHNjcmlwdHMvc2V0bG9jYWx2ZXJzaW9uIGFuZCBhZGQgdGhlIGFwcHJvcHJpYXRlCisjIGNoZWNrcyBhcyBuZWVkZWQuCitpZmRlZiBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8KKwlfbG9jYWx2ZXItYXV0byA9ICQoc2hlbGwgJChDT05GSUdfU0hFTEwpIFwKKwkgICAgICAgICAgICAgICAgICAkKHNyY3RyZWUpL3NjcmlwdHMvc2V0bG9jYWx2ZXJzaW9uICQoc3JjdHJlZSkpCisJbG9jYWx2ZXItYXV0byAgPSAkKExPQ0FMVkVSU0lPTikkKF9sb2NhbHZlci1hdXRvKQorZW5kaWYKKworbG9jYWx2ZXItZnVsbCA9ICQobG9jYWx2ZXIpJChsb2NhbHZlci1hdXRvKQorCisjIFN0b3JlIChuZXcpIEtFUk5FTFJFTEFTRSBzdHJpbmcgaW4gLmtlcm5lbHJlbGVhc2UKK2tlcm5lbHJlbGVhc2UgPSAkKEtFUk5FTFZFUlNJT04pJChsb2NhbHZlci1mdWxsKQorLmtlcm5lbHJlbGVhc2U6IEZPUkNFCisJJChRKXJtIC1mICRACisJJChRKWVjaG8gJChrZXJuZWxyZWxlYXNlKSA+ICRACisKKwogIyBUaGluZ3Mgd2UgbmVlZCB0byBkbyBiZWZvcmUgd2UgcmVjdXJzaXZlbHkgc3RhcnQgYnVpbGRpbmcgdGhlIGtlcm5lbAogIyBvciB0aGUgbW9kdWxlcyBhcmUgbGlzdGVkIGluICJwcmVwYXJlIi4KICMgQSBtdWx0aSBsZXZlbCBhcHByb2FjaCBpcyB1c2VkLiBwcmVwYXJlTiBpcyBwcm9jZXNzZWQgYmVmb3JlIHByZXBhcmVOLTEuCkBAIC03OTgsOCArODE1LDcgQEAKICMgYW5kIGlmIHNvIGRvOgogIyAxKSBDaGVjayB0aGF0IG1ha2UgaGFzIG5vdCBiZWVuIGV4ZWN1dGVkIGluIHRoZSBrZXJuZWwgc3JjICQoc3JjdHJlZSkKICMgMikgQ3JlYXRlIHRoZSBpbmNsdWRlMiBkaXJlY3RvcnksIHVzZWQgZm9yIHRoZSBzZWNvbmQgYXNtIHN5bWxpbmsKLQotcHJlcGFyZTM6CitwcmVwYXJlMzogLmtlcm5lbHJlbGVhc2UKIGlmbmVxICgkKEtCVUlMRF9TUkMpLCkKIAlAZWNobyAnICBVc2luZyAkKHNyY3RyZWUpIGFzIHNvdXJjZSBmb3Iga2VybmVsJwogCSQoUSlpZiBbIC1mICQoc3JjdHJlZSkvLmNvbmZpZyBdOyB0aGVuIFwKQEAgLTg5MCw3ICs5MDYsNyBAQAogCSkKIGVuZGVmCiAKLWluY2x1ZGUvbGludXgvdmVyc2lvbi5oOiAkKHNyY3RyZWUpL01ha2VmaWxlIEZPUkNFCitpbmNsdWRlL2xpbnV4L3ZlcnNpb24uaDogJChzcmN0cmVlKS9NYWtlZmlsZSAuY29uZmlnIEZPUkNFCiAJJChjYWxsIGZpbGVjaGssdmVyc2lvbi5oKQogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtOTg0LDkgKzEwMDAsOSBAQAogCiAjIERpcmVjdG9yaWVzICYgZmlsZXMgcmVtb3ZlZCB3aXRoICdtYWtlIG1ycHJvcGVyJwogTVJQUk9QRVJfRElSUyAgKz0gaW5jbHVkZS9jb25maWcgaW5jbHVkZTIKLU1SUFJPUEVSX0ZJTEVTICs9IC5jb25maWcgLmNvbmZpZy5vbGQgaW5jbHVkZS9hc20gLnZlcnNpb24gXAorTVJQUk9QRVJfRklMRVMgKz0gLmNvbmZpZyAuY29uZmlnLm9sZCBpbmNsdWRlL2FzbSAudmVyc2lvbiAub2xkX3ZlcnNpb24gXAogICAgICAgICAgICAgICAgICAgaW5jbHVkZS9saW51eC9hdXRvY29uZi5oIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIFwKLSAgICAgICAgICAgICAgICAgIE1vZHVsZS5zeW12ZXJzIHRhZ3MgVEFHUyBjc2NvcGUqCisJCSAgLmtlcm5lbHJlbGVhc2UgTW9kdWxlLnN5bXZlcnMgdGFncyBUQUdTIGNzY29wZSoKIAogIyBjbGVhbiAtIERlbGV0ZSBtb3N0LCBidXQgbGVhdmUgZW5vdWdoIHRvIGJ1aWxkIGV4dGVybmFsIG1vZHVsZXMKICMKQEAgLTEwNzIsNiArMTA4OCw3IEBACiAJQGVjaG8gICcgIHRhZ3MvVEFHUwkgIC0gR2VuZXJhdGUgdGFncyBmaWxlIGZvciBlZGl0b3JzJwogCUBlY2hvICAnICBjc2NvcGUJICAtIEdlbmVyYXRlIGNzY29wZSBpbmRleCcKIAlAZWNobyAgJyAga2VybmVscmVsZWFzZQkgIC0gT3V0cHV0IHRoZSByZWxlYXNlIHZlcnNpb24gc3RyaW5nJworCUBlY2hvICAnICBrZXJuZWx2ZXJzaW9uCSAgLSBPdXRwdXQgdGhlIHZlcnNpb24gc3RvcmVkIGluIE1ha2VmaWxlJwogCUBlY2hvICAnJwogCUBlY2hvICAnU3RhdGljIGFuYWx5c2VycycKIAlAZWNobyAgJyAgYnVpbGRjaGVjayAgICAgIC0gTGlzdCBkYW5nbGluZyByZWZlcmVuY2VzIHRvIHZtbGludXggZGlzY2FyZGVkIHNlY3Rpb25zJwpAQCAtMTI5Miw3ICsxMzA5LDEwIEBACiAJJChQRVJMKSAkKHNyYykvc2NyaXB0cy9jaGVja3N0YWNrLnBsICQoQVJDSCkKIAoga2VybmVscmVsZWFzZToKLQlAZWNobyAkKEtFUk5FTFJFTEVBU0UpCisJJChpZiAkKHdpbGRjYXJkIC5rZXJuZWxyZWxlYXNlKSwgJChRKWVjaG8gJChLRVJORUxSRUxFQVNFKSwgXAorCSQoZXJyb3Iga2VybmVscmVsZWFzZSBub3QgdmFsaWQgLSBydW4gJ21ha2UgKmNvbmZpZycgdG8gdXBkYXRlIGl0KSkKK2tlcm5lbHZlcnNpb246CisJQGVjaG8gJChLRVJORUxWRVJTSU9OKQogCiAjIEZJWE1FIFNob3VsZCBnbyBpbnRvIGEgbWFrZS5saWIgb3Igc29tZXRoaW5nIAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQppbmRleCA2MWM0Zjc0Li4wZDMxOGFiIDEwMDY0NAotLS0gYS9SRUFETUUKKysrIGIvUkVBRE1FCkBAIC0xLDQgKzEsNCBAQAotCUxpbnV4IGtlcm5lbCByZWxlYXNlIDIuNi54eAorCUxpbnV4IGtlcm5lbCByZWxlYXNlIDIuNi54eCA8aHR0cDovL2tlcm5lbC5vcmc+CiAKIFRoZXNlIGFyZSB0aGUgcmVsZWFzZSBub3RlcyBmb3IgTGludXggdmVyc2lvbiAyLjYuICBSZWFkIHRoZW0gY2FyZWZ1bGx5LAogYXMgdGhleSB0ZWxsIHlvdSB3aGF0IHRoaXMgaXMgYWxsIGFib3V0LCBleHBsYWluIGhvdyB0byBpbnN0YWxsIHRoZQpAQCAtNiwyMyArNiwzMSBAQAogCiBXSEFUIElTIExJTlVYPwogCi0gIExpbnV4IGlzIGEgVW5peCBjbG9uZSB3cml0dGVuIGZyb20gc2NyYXRjaCBieSBMaW51cyBUb3J2YWxkcyB3aXRoCi0gIGFzc2lzdGFuY2UgZnJvbSBhIGxvb3NlbHkta25pdCB0ZWFtIG9mIGhhY2tlcnMgYWNyb3NzIHRoZSBOZXQuCi0gIEl0IGFpbXMgdG93YXJkcyBQT1NJWCBjb21wbGlhbmNlLiAKKyAgTGludXggaXMgYSBjbG9uZSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBVbml4LCB3cml0dGVuIGZyb20gc2NyYXRjaCBieQorICBMaW51cyBUb3J2YWxkcyB3aXRoIGFzc2lzdGFuY2UgZnJvbSBhIGxvb3NlbHkta25pdCB0ZWFtIG9mIGhhY2tlcnMgYWNyb3NzCisgIHRoZSBOZXQuIEl0IGFpbXMgdG93YXJkcyBQT1NJWCBhbmQgU2luZ2xlIFVOSVggU3BlY2lmaWNhdGlvbiBjb21wbGlhbmNlLgogCi0gIEl0IGhhcyBhbGwgdGhlIGZlYXR1cmVzIHlvdSB3b3VsZCBleHBlY3QgaW4gYSBtb2Rlcm4gZnVsbHktZmxlZGdlZAotICBVbml4LCBpbmNsdWRpbmcgdHJ1ZSBtdWx0aXRhc2tpbmcsIHZpcnR1YWwgbWVtb3J5LCBzaGFyZWQgbGlicmFyaWVzLAotICBkZW1hbmQgbG9hZGluZywgc2hhcmVkIGNvcHktb24td3JpdGUgZXhlY3V0YWJsZXMsIHByb3BlciBtZW1vcnkKLSAgbWFuYWdlbWVudCBhbmQgVENQL0lQIG5ldHdvcmtpbmcuIAorICBJdCBoYXMgYWxsIHRoZSBmZWF0dXJlcyB5b3Ugd291bGQgZXhwZWN0IGluIGEgbW9kZXJuIGZ1bGx5LWZsZWRnZWQgVW5peCwKKyAgaW5jbHVkaW5nIHRydWUgbXVsdGl0YXNraW5nLCB2aXJ0dWFsIG1lbW9yeSwgc2hhcmVkIGxpYnJhcmllcywgZGVtYW5kCisgIGxvYWRpbmcsIHNoYXJlZCBjb3B5LW9uLXdyaXRlIGV4ZWN1dGFibGVzLCBwcm9wZXIgbWVtb3J5IG1hbmFnZW1lbnQsCisgIGFuZCBtdWx0aXN0YWNrIG5ldHdvcmtpbmcgaW5jbHVkaW5nIElQdjQgYW5kIElQdjYuCiAKICAgSXQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIC0gc2VlIHRoZQogICBhY2NvbXBhbnlpbmcgQ09QWUlORyBmaWxlIGZvciBtb3JlIGRldGFpbHMuIAogCiBPTiBXSEFUIEhBUkRXQVJFIERPRVMgSVQgUlVOPwogCi0gIExpbnV4IHdhcyBmaXJzdCBkZXZlbG9wZWQgZm9yIDM4Ni80ODYtYmFzZWQgUENzLiAgVGhlc2UgZGF5cyBpdCBhbHNvCi0gIHJ1bnMgb24gQVJNcywgREVDIEFscGhhcywgU1VOIFNwYXJjcywgTTY4MDAwIG1hY2hpbmVzIChsaWtlIEF0YXJpIGFuZAotICBBbWlnYSksIE1JUFMgYW5kIFBvd2VyUEMsIGFuZCBvdGhlcnMuCisgIEFsdGhvdWdoIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGZpcnN0IGZvciAzMi1iaXQgeDg2LWJhc2VkIFBDcyAoMzg2IG9yIGhpZ2hlciksCisgIHRvZGF5IExpbnV4IGFsc28gcnVucyBvbiAoYXQgbGVhc3QpIHRoZSBDb21wYXEgQWxwaGEgQVhQLCBTdW4gU1BBUkMgYW5kCisgIFVsdHJhU1BBUkMsIE1vdG9yb2xhIDY4MDAwLCBQb3dlclBDLCBQb3dlclBDNjQsIEFSTSwgSGl0YWNoaSBTdXBlckgsCisgIElCTSBTLzM5MCwgTUlQUywgSFAgUEEtUklTQywgSW50ZWwgSUEtNjQsIERFQyBWQVgsIEFNRCB4ODYtNjQsIEFYSVMgQ1JJUywKKyAgYW5kIFJlbmVzYXMgTTMyUiBhcmNoaXRlY3R1cmVzLgorCisgIExpbnV4IGlzIGVhc2lseSBwb3J0YWJsZSB0byBtb3N0IGdlbmVyYWwtcHVycG9zZSAzMi0gb3IgNjQtYml0IGFyY2hpdGVjdHVyZXMKKyAgYXMgbG9uZyBhcyB0aGV5IGhhdmUgYSBwYWdlZCBtZW1vcnkgbWFuYWdlbWVudCB1bml0IChQTU1VKSBhbmQgYSBwb3J0IG9mIHRoZQorICBHTlUgQyBjb21waWxlciAoZ2NjKSAocGFydCBvZiBUaGUgR05VIENvbXBpbGVyIENvbGxlY3Rpb24sIEdDQykuIExpbnV4IGhhcworICBhbHNvIGJlZW4gcG9ydGVkIHRvIGEgbnVtYmVyIG9mIGFyY2hpdGVjdHVyZXMgd2l0aG91dCBhIFBNTVUsIGFsdGhvdWdoCisgIGZ1bmN0aW9uYWxpdHkgaXMgdGhlbiBvYnZpb3VzbHkgc29tZXdoYXQgbGltaXRlZC4KIAogRE9DVU1FTlRBVElPTjoKIApAQCAtMTgzLDExICsxOTEsOCBAQAogCiBDT01QSUxJTkcgdGhlIGtlcm5lbDoKIAotIC0gTWFrZSBzdXJlIHlvdSBoYXZlIGdjYyAyLjk1LjMgYXZhaWxhYmxlLgotICAgZ2NjIDIuOTEuNjYgKGVnY3MtMS4xLjIpLCBhbmQgZ2NjIDIuNy4yLjMgYXJlIGtub3duIHRvIG1pc2NvbXBpbGUKLSAgIHNvbWUgcGFydHMgb2YgdGhlIGtlcm5lbCwgYW5kIGFyZSAqbm8gbG9uZ2VyIHN1cHBvcnRlZCouCi0gICBBbHNvIHJlbWVtYmVyIHRvIHVwZ3JhZGUgeW91ciBiaW51dGlscyBwYWNrYWdlIChmb3IgYXMvbGQvbm0gYW5kIGNvbXBhbnkpCi0gICBpZiBuZWNlc3NhcnkuIEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byBEb2N1bWVudGF0aW9uL0NoYW5nZXMuCisgLSBNYWtlIHN1cmUgeW91IGhhdmUgYXQgbGVhc3QgZ2NjIDMuMiBhdmFpbGFibGUuCisgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9DaGFuZ2VzLgogCiAgICBQbGVhc2Ugbm90ZSB0aGF0IHlvdSBjYW4gc3RpbGwgcnVuIGEub3V0IHVzZXIgcHJvZ3JhbXMgd2l0aCB0aGlzIGtlcm5lbC4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9LY29uZmlnIGIvYXJjaC9hbHBoYS9LY29uZmlnCmluZGV4IDE1MzMzN2YuLmVlZGY0MWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvS2NvbmZpZworKysgYi9hcmNoL2FscGhhL0tjb25maWcKQEAgLTE4LDkgKzE4LDYgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKLWNvbmZpZyBVSUQxNgotCWJvb2wKLQogY29uZmlnIFJXU0VNX0dFTkVSSUNfU1BJTkxPQ0sKIAlib29sCiAKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL2FscGhhX2tzeW1zLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9hbHBoYV9rc3ltcy5jCmluZGV4IGYzZTk4ZjguLjE4OThlYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL2FscGhhX2tzeW1zLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvYWxwaGFfa3N5bXMuYwpAQCAtNDAsNyArNDAsNiBAQAogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KIAogZXh0ZXJuIHN0cnVjdCBod3JwYl9zdHJ1Y3QgKmh3cnBiOwotZXh0ZXJuIHZvaWQgZHVtcF90aHJlYWQoc3RydWN0IHB0X3JlZ3MgKiwgc3RydWN0IHVzZXIgKik7CiBleHRlcm4gc3BpbmxvY2tfdCBydGNfbG9jazsKIAogLyogdGhlc2UgYXJlIEMgcnVudGltZSBmdW5jdGlvbnMgd2l0aCBzcGVjaWFsIGNhbGxpbmcgY29udmVudGlvbnM6ICovCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9vc2Zfc3lzLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9vc2Zfc3lzLmMKaW5kZXggMDFmZTk5MGQuLjdmYjE0ZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL29zZl9zeXMuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9vc2Zfc3lzLmMKQEAgLTk2MCw3ICs5NjAsNyBAQAogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JcmV0dXJuIGRvX3V0aW1lcyhmaWxlbmFtZSwgdHZzID8ga3R2cyA6IE5VTEwpOworCXJldHVybiBkb191dGltZXMoQVRfRkRDV0QsIGZpbGVuYW1lLCB0dnMgPyBrdHZzIDogTlVMTCk7CiB9CiAKICNkZWZpbmUgTUFYX1NFTEVDVF9TRUNPTkRTIFwKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3BjaS1ub29wLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9wY2ktbm9vcC5jCmluZGV4IDk5MDNlM2EuLmZmZjVjZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3BjaS1ub29wLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvcGNpLW5vb3AuYwpAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvYWxwaGEva2VybmVsL3Byb2Nlc3MuYwppbmRleCBhODY4MjYxLi45OTI0ZmQwIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC00Myw2ICs0MywxMSBAQAogI2luY2x1ZGUgInByb3RvLmgiCiAjaW5jbHVkZSAicGNpX2ltcGwuaCIKIAorLyoKKyAqIFBvd2VyIG9mZiBmdW5jdGlvbiwgaWYgYW55CisgKi8KK3ZvaWQgKCpwbV9wb3dlcl9vZmYpKHZvaWQpID0gbWFjaGluZV9wb3dlcl9vZmY7CisKIHZvaWQKIGNwdV9pZGxlKHZvaWQpCiB7CkBAIC0yNzEsNyArMjc2LDcgQEAKIHsKIAlleHRlcm4gdm9pZCByZXRfZnJvbV9mb3JrKHZvaWQpOwogCi0Jc3RydWN0IHRocmVhZF9pbmZvICpjaGlsZHRpID0gcC0+dGhyZWFkX2luZm87CisJc3RydWN0IHRocmVhZF9pbmZvICpjaGlsZHRpID0gdGFza190aHJlYWRfaW5mbyhwKTsKIAlzdHJ1Y3QgcHRfcmVncyAqIGNoaWxkcmVnczsKIAlzdHJ1Y3Qgc3dpdGNoX3N0YWNrICogY2hpbGRzdGFjaywgKnN0YWNrOwogCXVuc2lnbmVkIGxvbmcgc3RhY2tfb2Zmc2V0LCBzZXR0bHM7CkBAIC0yODAsNyArMjg1LDcgQEAKIAlpZiAoIShyZWdzLT5wcyAmIDgpKQogCQlzdGFja19vZmZzZXQgPSAoUEFHRV9TSVpFLTEpICYgKHVuc2lnbmVkIGxvbmcpIHJlZ3M7CiAJY2hpbGRyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopCi0JICAoc3RhY2tfb2Zmc2V0ICsgUEFHRV9TSVpFICsgKGxvbmcpIGNoaWxkdGkpOworCSAgKHN0YWNrX29mZnNldCArIFBBR0VfU0laRSArIHRhc2tfc3RhY2tfcGFnZShwKSk7CiAJCQogCSpjaGlsZHJlZ3MgPSAqcmVnczsKIAlzZXR0bHMgPSByZWdzLT5yMjA7CkBAIC00MjMsMzAgKzQyOCwxNSBAQAogaW50CiBkdW1wX2VsZl90YXNrKGVsZl9ncmVnX3QgKmRlc3QsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpOwotCXN0cnVjdCBwdF9yZWdzICpwdDsKLQotCXRpID0gdGFzay0+dGhyZWFkX2luZm87Ci0JcHQgPSAoc3RydWN0IHB0X3JlZ3MgKikoKHVuc2lnbmVkIGxvbmcpdGkgKyAyKlBBR0VfU0laRSkgLSAxOwotCi0JZHVtcF9lbGZfdGhyZWFkKGRlc3QsIHB0LCB0aSk7Ci0KKwlkdW1wX2VsZl90aHJlYWQoZGVzdCwgdGFza19wdF9yZWdzKHRhc2spLCB0YXNrX3RocmVhZF9pbmZvKHRhc2spKTsKIAlyZXR1cm4gMTsKIH0KIAogaW50CiBkdW1wX2VsZl90YXNrX2ZwKGVsZl9mcHJlZ190ICpkZXN0LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0Jc3RydWN0IHRocmVhZF9pbmZvICp0aTsKLQlzdHJ1Y3QgcHRfcmVncyAqcHQ7Ci0Jc3RydWN0IHN3aXRjaF9zdGFjayAqc3c7Ci0KLQl0aSA9IHRhc2stPnRocmVhZF9pbmZvOwotCXB0ID0gKHN0cnVjdCBwdF9yZWdzICopKCh1bnNpZ25lZCBsb25nKXRpICsgMipQQUdFX1NJWkUpIC0gMTsKLQlzdyA9IChzdHJ1Y3Qgc3dpdGNoX3N0YWNrICopcHQgLSAxOwotCisJc3RydWN0IHN3aXRjaF9zdGFjayAqc3cgPSAoc3RydWN0IHN3aXRjaF9zdGFjayAqKXRhc2tfcHRfcmVncyh0YXNrKSAtIDE7CiAJbWVtY3B5KGRlc3QsIHN3LT5mcCwgMzIgKiA4KTsKLQogCXJldHVybiAxOwogfQogCkBAIC00ODcsOCArNDc3LDggQEAKIHVuc2lnbmVkIGxvbmcKIHRocmVhZF9zYXZlZF9wYyh0YXNrX3QgKnQpCiB7Ci0JdW5zaWduZWQgbG9uZyBiYXNlID0gKHVuc2lnbmVkIGxvbmcpdC0+dGhyZWFkX2luZm87Ci0JdW5zaWduZWQgbG9uZyBmcCwgc3AgPSB0LT50aHJlYWRfaW5mby0+cGNiLmtzcDsKKwl1bnNpZ25lZCBsb25nIGJhc2UgPSAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UodCk7CisJdW5zaWduZWQgbG9uZyBmcCwgc3AgPSB0YXNrX3RocmVhZF9pbmZvKHQpLT5wY2Iua3NwOwogCiAJaWYgKHNwID4gYmFzZSAmJiBzcCs2KjggPCBiYXNlICsgMTYqMTAyNCkgewogCQlmcCA9ICgodW5zaWduZWQgbG9uZyopc3ApWzZdOwpAQCAtNTE4LDcgKzUwOCw3IEBACiAKIAlwYyA9IHRocmVhZF9zYXZlZF9wYyhwKTsKIAlpZiAoaW5fc2NoZWRfZnVuY3Rpb25zKHBjKSkgewotCQlzY2hlZHVsZV9mcmFtZSA9ICgodW5zaWduZWQgbG9uZyAqKXAtPnRocmVhZF9pbmZvLT5wY2Iua3NwKVs2XTsKKwkJc2NoZWR1bGVfZnJhbWUgPSAoKHVuc2lnbmVkIGxvbmcgKil0YXNrX3RocmVhZF9pbmZvKHApLT5wY2Iua3NwKVs2XTsKIAkJcmV0dXJuICgodW5zaWduZWQgbG9uZyAqKXNjaGVkdWxlX2ZyYW1lKVsxMl07CiAJfQogCXJldHVybiBwYzsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvcHRyYWNlLmMKaW5kZXggYmJkMzc1My4uMGNkMDYwNSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvcHRyYWNlLmMKQEAgLTcyLDYgKzcyLDEzIEBACiAJUkVHX1IwID0gMCwgUkVHX0YwID0gMzIsIFJFR19GUENSID0gNjMsIFJFR19QQyA9IDY0CiB9OwogCisjZGVmaW5lIFBUX1JFRyhyZWcpIFwKKyAgKFBBR0VfU0laRSoyIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSArIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWcpKQorCisjZGVmaW5lIFNXX1JFRyhyZWcpIFwKKyAoUEFHRV9TSVpFKjIgLSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpIC0gc2l6ZW9mKHN0cnVjdCBzd2l0Y2hfc3RhY2spIFwKKyAgKyBvZmZzZXRvZihzdHJ1Y3Qgc3dpdGNoX3N0YWNrLCByZWcpKQorCiBzdGF0aWMgaW50IHJlZ29mZltdID0gewogCVBUX1JFRygJICAgcjApLCBQVF9SRUcoCSAgIHIxKSwgUFRfUkVHKAkgICByMiksIFBUX1JFRygJICByMyksCiAJUFRfUkVHKAkgICByNCksIFBUX1JFRygJICAgcjUpLCBQVF9SRUcoCSAgIHI2KSwgUFRfUkVHKAkgIHI3KSwKQEAgLTEwMywxNCArMTEwLDE0IEBACiAJdW5zaWduZWQgbG9uZyAqYWRkcjsKIAogCWlmIChyZWdubyA9PSAzMCkgewotCQlhZGRyID0gJnRhc2stPnRocmVhZF9pbmZvLT5wY2IudXNwOworCQlhZGRyID0gJnRhc2tfdGhyZWFkX2luZm8odGFzayktPnBjYi51c3A7CiAJfSBlbHNlIGlmIChyZWdubyA9PSA2NSkgewotCQlhZGRyID0gJnRhc2stPnRocmVhZF9pbmZvLT5wY2IudW5pcXVlOworCQlhZGRyID0gJnRhc2tfdGhyZWFkX2luZm8odGFzayktPnBjYi51bmlxdWU7CiAJfSBlbHNlIGlmIChyZWdubyA9PSAzMSB8fCByZWdubyA+IDY1KSB7CiAJCXplcm8gPSAwOwogCQlhZGRyID0gJnplcm87CiAJfSBlbHNlIHsKLQkJYWRkciA9ICh2b2lkICopdGFzay0+dGhyZWFkX2luZm8gKyByZWdvZmZbcmVnbm9dOworCQlhZGRyID0gdGFza19zdGFja19wYWdlKHRhc2spICsgcmVnb2ZmW3JlZ25vXTsKIAl9CiAJcmV0dXJuIGFkZHI7CiB9CkBAIC0xMjUsNyArMTMyLDcgQEAKIAlpZiAocmVnbm8gPT0gNjMpIHsKIAkJdW5zaWduZWQgbG9uZyBmcGNyID0gKmdldF9yZWdfYWRkcih0YXNrLCByZWdubyk7CiAJCXVuc2lnbmVkIGxvbmcgc3djcgotCQkgID0gdGFzay0+dGhyZWFkX2luZm8tPmllZWVfc3RhdGUgJiBJRUVFX1NXX01BU0s7CisJCSAgPSB0YXNrX3RocmVhZF9pbmZvKHRhc2spLT5pZWVlX3N0YXRlICYgSUVFRV9TV19NQVNLOwogCQlzd2NyID0gc3djcl91cGRhdGVfc3RhdHVzKHN3Y3IsIGZwY3IpOwogCQlyZXR1cm4gZnBjciB8IHN3Y3I7CiAJfQpAQCAtMTM5LDggKzE0Niw4IEBACiBwdXRfcmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyByZWdubywgdW5zaWduZWQgbG9uZyBkYXRhKQogewogCWlmIChyZWdubyA9PSA2MykgewotCQl0YXNrLT50aHJlYWRfaW5mby0+aWVlZV9zdGF0ZQotCQkgID0gKCh0YXNrLT50aHJlYWRfaW5mby0+aWVlZV9zdGF0ZSAmIH5JRUVFX1NXX01BU0spCisJCXRhc2tfdGhyZWFkX2luZm8odGFzayktPmllZWVfc3RhdGUKKwkJICA9ICgodGFza190aHJlYWRfaW5mbyh0YXNrKS0+aWVlZV9zdGF0ZSAmIH5JRUVFX1NXX01BU0spCiAJCSAgICAgfCAoZGF0YSAmIElFRUVfU1dfTUFTSykpOwogCQlkYXRhID0gKGRhdGEgJiBGUENSX0RZTl9NQVNLKSB8IGllZWVfc3djcl90b19mcGNyKGRhdGEpOwogCX0KQEAgLTE4OCwzNSArMTk1LDM1IEBACiAJCSAqIGJyYW5jaCAoZW11bGF0aW9uIGNhbiBiZSB0cmlja3kgZm9yIGZwIGJyYW5jaGVzKS4KIAkJICovCiAJCWRpc3BsID0gKChzMzIpKGluc24gPDwgMTEpKSA+PiA5OwotCQljaGlsZC0+dGhyZWFkX2luZm8tPmJwdF9hZGRyW25zYXZlZCsrXSA9IHBjICsgNDsKKwkJdGFza190aHJlYWRfaW5mbyhjaGlsZCktPmJwdF9hZGRyW25zYXZlZCsrXSA9IHBjICsgNDsKIAkJaWYgKGRpc3BsKQkJLyogZ3VhcmQgYWdhaW5zdCB1bm9wdGltaXplZCBjb2RlICovCi0JCQljaGlsZC0+dGhyZWFkX2luZm8tPmJwdF9hZGRyW25zYXZlZCsrXQorCQkJdGFza190aHJlYWRfaW5mbyhjaGlsZCktPmJwdF9hZGRyW25zYXZlZCsrXQogCQkJICA9IHBjICsgNCArIGRpc3BsOwogCQlEQkcoREJHX0JQVCwgKCJleGVjaW5nIGJyYW5jaFxuIikpOwogCX0gZWxzZSBpZiAob3BfY29kZSA9PSAweDFhKSB7CiAJCXJlZ19iID0gKGluc24gPj4gMTYpICYgMHgxZjsKLQkJY2hpbGQtPnRocmVhZF9pbmZvLT5icHRfYWRkcltuc2F2ZWQrK10gPSBnZXRfcmVnKGNoaWxkLCByZWdfYik7CisJCXRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5icHRfYWRkcltuc2F2ZWQrK10gPSBnZXRfcmVnKGNoaWxkLCByZWdfYik7CiAJCURCRyhEQkdfQlBULCAoImV4ZWNpbmcganVtcFxuIikpOwogCX0gZWxzZSB7Ci0JCWNoaWxkLT50aHJlYWRfaW5mby0+YnB0X2FkZHJbbnNhdmVkKytdID0gcGMgKyA0OworCQl0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+YnB0X2FkZHJbbnNhdmVkKytdID0gcGMgKyA0OwogCQlEQkcoREJHX0JQVCwgKCJleGVjaW5nIG5vcm1hbCBpbnNuXG4iKSk7CiAJfQogCiAJLyogaW5zdGFsbCBicmVha3BvaW50czogKi8KIAlmb3IgKGkgPSAwOyBpIDwgbnNhdmVkOyArK2kpIHsKLQkJcmVzID0gcmVhZF9pbnQoY2hpbGQsIGNoaWxkLT50aHJlYWRfaW5mby0+YnB0X2FkZHJbaV0sCisJCXJlcyA9IHJlYWRfaW50KGNoaWxkLCB0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+YnB0X2FkZHJbaV0sCiAJCQkgICAgICAgKGludCAqKSAmaW5zbik7CiAJCWlmIChyZXMgPCAwKQogCQkJcmV0dXJuIHJlczsKLQkJY2hpbGQtPnRocmVhZF9pbmZvLT5icHRfaW5zbltpXSA9IGluc247CisJCXRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5icHRfaW5zbltpXSA9IGluc247CiAJCURCRyhEQkdfQlBULCAoIiAgICAtPiBuZXh0X3BjPSVseFxuIiwKLQkJCSAgICAgIGNoaWxkLT50aHJlYWRfaW5mby0+YnB0X2FkZHJbaV0pKTsKLQkJcmVzID0gd3JpdGVfaW50KGNoaWxkLCBjaGlsZC0+dGhyZWFkX2luZm8tPmJwdF9hZGRyW2ldLAorCQkJICAgICAgdGFza190aHJlYWRfaW5mbyhjaGlsZCktPmJwdF9hZGRyW2ldKSk7CisJCXJlcyA9IHdyaXRlX2ludChjaGlsZCwgdGFza190aHJlYWRfaW5mbyhjaGlsZCktPmJwdF9hZGRyW2ldLAogCQkJCUJSRUFLSU5TVCk7CiAJCWlmIChyZXMgPCAwKQogCQkJcmV0dXJuIHJlczsKIAl9Ci0JY2hpbGQtPnRocmVhZF9pbmZvLT5icHRfbnNhdmVkID0gbnNhdmVkOworCXRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5icHRfbnNhdmVkID0gbnNhdmVkOwogCXJldHVybiAwOwogfQogCkBAIC0yMjcsOSArMjM0LDkgQEAKIGludAogcHRyYWNlX2NhbmNlbF9icHQoc3RydWN0IHRhc2tfc3RydWN0ICogY2hpbGQpCiB7Ci0JaW50IGksIG5zYXZlZCA9IGNoaWxkLT50aHJlYWRfaW5mby0+YnB0X25zYXZlZDsKKwlpbnQgaSwgbnNhdmVkID0gdGFza190aHJlYWRfaW5mbyhjaGlsZCktPmJwdF9uc2F2ZWQ7CiAKLQljaGlsZC0+dGhyZWFkX2luZm8tPmJwdF9uc2F2ZWQgPSAwOworCXRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5icHRfbnNhdmVkID0gMDsKIAogCWlmIChuc2F2ZWQgPiAyKSB7CiAJCXByaW50aygicHRyYWNlX2NhbmNlbF9icHQ6IGJvZ3VzIG5zYXZlZDogJWQhXG4iLCBuc2F2ZWQpOwpAQCAtMjM3LDggKzI0NCw4IEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IG5zYXZlZDsgKytpKSB7Ci0JCXdyaXRlX2ludChjaGlsZCwgY2hpbGQtPnRocmVhZF9pbmZvLT5icHRfYWRkcltpXSwKLQkJCSAgY2hpbGQtPnRocmVhZF9pbmZvLT5icHRfaW5zbltpXSk7CisJCXdyaXRlX2ludChjaGlsZCwgdGFza190aHJlYWRfaW5mbyhjaGlsZCktPmJwdF9hZGRyW2ldLAorCQkJICB0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+YnB0X2luc25baV0pOwogCX0KIAlyZXR1cm4gKG5zYXZlZCAhPSAwKTsKIH0KQEAgLTI2NSwzMCArMjcyLDE2IEBACiAJbG9ja19rZXJuZWwoKTsKIAlEQkcoREJHX01FTSwgKCJyZXF1ZXN0PSVsZCBwaWQ9JWxkIGFkZHI9MHglbHggZGF0YT0weCVseFxuIiwKIAkJICAgICAgcmVxdWVzdCwgcGlkLCBhZGRyLCBkYXRhKSk7Ci0JcmV0ID0gLUVQRVJNOwogCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9UUkFDRU1FKSB7Ci0JCS8qIGFyZSB3ZSBhbHJlYWR5IGJlaW5nIHRyYWNlZD8gKi8KLQkJaWYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpCi0JCQlnb3RvIG91dF9ub3RzazsKLQkJcmV0ID0gc2VjdXJpdHlfcHRyYWNlKGN1cnJlbnQtPnBhcmVudCwgY3VycmVudCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dF9ub3RzazsKLQkJLyogc2V0IHRoZSBwdHJhY2UgYml0IGluIHRoZSBwcm9jZXNzIHB0cmFjZSBmbGFncy4gKi8KLQkJY3VycmVudC0+cHRyYWNlIHw9IFBUX1BUUkFDRUQ7Ci0JCXJldCA9IDA7CisJCXJldCA9IHB0cmFjZV90cmFjZW1lKCk7CiAJCWdvdG8gb3V0X25vdHNrOwogCX0KLQlpZiAocGlkID09IDEpCQkvKiB5b3UgbWF5IG5vdCBtZXNzIHdpdGggaW5pdCAqLwotCQlnb3RvIG91dF9ub3RzazsKIAotCXJldCA9IC1FU1JDSDsKLQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwotCWNoaWxkID0gZmluZF90YXNrX2J5X3BpZChwaWQpOwotCWlmIChjaGlsZCkKLQkJZ2V0X3Rhc2tfc3RydWN0KGNoaWxkKTsKLQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7Ci0JaWYgKCFjaGlsZCkKKwljaGlsZCA9IHB0cmFjZV9nZXRfdGFza19zdHJ1Y3QocGlkKTsKKwlpZiAoSVNfRVJSKGNoaWxkKSkgeworCQlyZXQgPSBQVFJfRVJSKGNoaWxkKTsKIAkJZ290byBvdXRfbm90c2s7CisJfQogCiAJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX0FUVEFDSCkgewogCQlyZXQgPSBwdHJhY2VfYXR0YWNoKGNoaWxkKTsKQEAgLTM2OSw3ICszNjIsNyBAQAogCQlpZiAoIXZhbGlkX3NpZ25hbChkYXRhKSkKIAkJCWJyZWFrOwogCQkvKiBNYXJrIHNpbmdsZSBzdGVwcGluZy4gICovCi0JCWNoaWxkLT50aHJlYWRfaW5mby0+YnB0X25zYXZlZCA9IC0xOworCQl0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+YnB0X25zYXZlZCA9IC0xOwogCQljbGVhcl90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9TWVNDQUxMX1RSQUNFKTsKIAkJY2hpbGQtPmV4aXRfY29kZSA9IGRhdGE7CiAJCXdha2VfdXBfcHJvY2VzcyhjaGlsZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYyBiL2FyY2gvYWxwaGEva2VybmVsL3NtcC5jCmluZGV4IGRhMGJlMzQuLjRiODczNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3NtcC5jCkBAIC0zMDIsNyArMzAyLDcgQEAKIAkJICsgaHdycGItPnByb2Nlc3Nvcl9vZmZzZXQKIAkJICsgY3B1aWQgKiBod3JwYi0+cHJvY2Vzc29yX3NpemUpOwogCWh3cGNiID0gKHN0cnVjdCBwY2Jfc3RydWN0ICopIGNwdS0+aHdwY2I7Ci0JaXBjYiA9ICZpZGxlLT50aHJlYWRfaW5mby0+cGNiOworCWlwY2IgPSAmdGFza190aHJlYWRfaW5mbyhpZGxlKS0+cGNiOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgQ1BVJ3MgSFdQQ0IgdG8gc29tZXRoaW5nIGp1c3QgZ29vZCBlbm91Z2ggZm9yCiAJICAgdXMgdG8gZ2V0IHN0YXJ0ZWQuICBJbW1lZGlhdGVseSBhZnRlciBzdGFydGluZywgd2UnbGwgc3dwY3R4CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfYWxjb3IuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19hbGNvci5jCmluZGV4IDE0NWRjZGUuLmQ3ZjBlOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19hbGNvci5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19hbGNvci5jCkBAIC0yNTQsNyArMjU0LDcgQEAKIAkgKiBtb3RoZXJib2FyZCwgYnkgbG9va2luZyBmb3IgYSAyMTA0MCBUVUxJUCBpbiBzbG90IDYsIHdoaWNoIGlzCiAJICogYnVpbHQgaW50byBYTFQgYW5kIEJSRVQvTUFWRVJJQ0ssIGJ1dCBub3QgYXZhaWxhYmxlIG9uIEFMQ09SLgogCSAqLwotCWRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0RFQywKKwlkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0RFQywKIAkJCSAgICAgIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQLAogCQkJICAgICAgTlVMTCk7CiAJaWYgKGRldiAmJiBkZXYtPmRldmZuID09IFBDSV9ERVZGTig2LDApKSB7CkBAIC0yNjIsNiArMjYyLDcgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERldGVjdGVkIEFTNTAwIG9yIFhMVCBtb3RoZXJib2FyZC5cbiIsCiAJCSAgICAgICBfX0ZVTkNUSU9OX18pOwogCX0KKwlwY2lfZGV2X3B1dChkZXYpOwogfQogCiAKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19zaW8uYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19zaW8uYwppbmRleCA0N2RmNDhhLi4xMzFhMmQ5IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfc2lvLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3Npby5jCkBAIC0xMDUsNyArMTA1LDcgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKIAogCS8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZGV2aWNlcywgY29sbGVjdGluZyBJUlEgbGV2ZWxzLiAgKi8KLQl3aGlsZSAoKGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBkZXYpKSAhPSBOVUxMKSB7CisJZm9yX2VhY2hfcGNpX2RldihkZXYpIHsKIAkJaWYgKChkZXYtPmNsYXNzID4+IDE2ID09IFBDSV9CQVNFX0NMQVNTX0JSSURHRSkgJiYKIAkJICAgIChkZXYtPmNsYXNzID4+IDggIT0gUENJX0NMQVNTX0JSSURHRV9QQ01DSUEpKQogCQkJY29udGludWU7CkBAIC0yMjksOCArMjI5LDggQEAKIAkgKi8KIAogCWRldiA9IE5VTEw7Ci0Jd2hpbGUgKChkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9OQ1IsIFBDSV9BTllfSUQsIGRldikpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTkNSXzUzQzgxMAorCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9OQ1IsIFBDSV9BTllfSUQsIGRldikpKSB7CisJCWlmIChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX05DUl81M0M4MTAKIAkJICAgIHx8IGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTkNSXzUzQzgxNQogCQkgICAgfHwgZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9OQ1JfNTNDODIwCiAJCSAgICB8fCBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX05DUl81M0M4MjUpIHsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvbW0vaW5pdC5jIGIvYXJjaC9hbHBoYS9tbS9pbml0LmMKaW5kZXggOTA3NTJmNi4uNDg2ZDc5NCAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9tbS9pbml0LmMKKysrIGIvYXJjaC9hbHBoYS9tbS9pbml0LmMKQEAgLTcsNiArNyw3IEBACiAvKiAyLjMueCB6b25lIGFsbG9jYXRvciwgMTk5OSBBbmRyZWEgQXJjYW5nZWxpIDxhbmRyZWFAc3VzZS5kZT4gKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vS2NvbmZpZyBiL2FyY2gvYXJtL0tjb25maWcKaW5kZXggNGIxNWY1Zi4uNTk1OWUzNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vS2NvbmZpZworKysgYi9hcmNoL2FybS9LY29uZmlnCkBAIC00NiwxMCArNDYsNiBAQAogCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tY2EudHh0PiAoYW5kIGVzcGVjaWFsbHkgdGhlIHdlYiBwYWdlIGdpdmVuCiAJICB0aGVyZSkgYmVmb3JlIGF0dGVtcHRpbmcgdG8gYnVpbGQgYW4gTUNBIGJ1cyBrZXJuZWwuCiAKLWNvbmZpZyBVSUQxNgotCWJvb2wKLQlkZWZhdWx0IHkKLQogY29uZmlnIFJXU0VNX0dFTkVSSUNfU1BJTkxPQ0sKIAlib29sCiAJZGVmYXVsdCB5CkBAIC0xMDMsMTMgKzk5LDYgQEAKIAkgIEV0aGVybmV0IGludGVyZmFjZSwgdHdvIFBDTUNJQSBzb2NrZXRzLCB0d28gc2VyaWFsIHBvcnRzIGFuZCBhCiAJICBwYXJhbGxlbCBwb3J0LgogCi1jb25maWcgQVJDSF9DQU1FTE9UCi0JYm9vbCAiRXB4YTEwZGIiCi0JaGVscAotCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIEFsdGVyYSdzIEV4Y2FsaWJ1ciBYQTEwIGRldmVsb3BtZW50IGJvYXJkLgotCSAgSWYgeW91IHdvdWxkIGxpa2UgdG8gYnVpbGQgeW91ciBrZXJuZWwgdG8gcnVuIG9uIG9uZSBvZiB0aGVzZSBib2FyZHMKLQkgIHRoZW4geW91IG11c3Qgc2F5ICdZJyBoZXJlLiBPdGhlcndpc2Ugc2F5ICdOJwotCiBjb25maWcgQVJDSF9GT09UQlJJREdFCiAJYm9vbCAiRm9vdEJyaWRnZSIKIAlzZWxlY3QgRk9PVEJSSURHRQpAQCAtMTU0LDYgKzE0Myw3IEBACiAJc2VsZWN0IEZJUQogCXNlbGVjdCBUSU1FUl9BQ09STgogCXNlbGVjdCBBUkNIX01BWV9IQVZFX1BDX0ZEQworCXNlbGVjdCBJU0FfRE1BX0FQSQogCWhlbHAKIAkgIE9uIHRoZSBBY29ybiBSaXNjLVBDLCBMaW51eCBjYW4gc3VwcG9ydCB0aGUgaW50ZXJuYWwgSURFIGRpc2sgYW5kCiAJICBDRC1ST00gaW50ZXJmYWNlLCBzZXJpYWwgYW5kIHBhcmFsbGVsIHBvcnQsIGFuZCB0aGUgZmxvcHB5IGRyaXZlLgpAQCAtMTkwLDYgKzE4MCw3IEBACiBjb25maWcgQVJDSF9WRVJTQVRJTEUKIAlib29sICJWZXJzYXRpbGUiCiAJc2VsZWN0IEFSTV9BTUJBCisJc2VsZWN0IEFSTV9WSUMKIAlzZWxlY3QgSUNTVDMwNwogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBBUk0gTHRkIFZlcnNhdGlsZSBib2FyZC4KQEAgLTIwNiw2ICsxOTcsNyBAQAogCiBjb25maWcgQVJDSF9INzIwWAogCWJvb2wgIkh5bml4LUhNUzcyMHgtYmFzZWQiCisJc2VsZWN0IElTQV9ETUFfQVBJCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHN5c3RlbXMgYmFzZWQgb24gdGhlIEh5bml4IEhNUzcyMHgKIApAQCAtMjE1LDEyICsyMDcsMTYgQEAKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyBiYXNlZCBvbiB0aGUgQWdpbGVudCBBQUVDLTIwMDAKIAorY29uZmlnIEFSQ0hfQVQ5MVJNOTIwMAorCWJvb2wgIkFUOTFSTTkyMDAiCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIHJ1biB0aGlzIGtlcm5lbCBvbiBhbiBBVDkxUk05MjAwLWJhc2VkCisJICBib2FyZC4KKwogZW5kY2hvaWNlCiAKIHNvdXJjZSAiYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9LY29uZmlnIgogCi1zb3VyY2UgImFyY2gvYXJtL21hY2gtZXB4YTEwZGIvS2NvbmZpZyIKLQogc291cmNlICJhcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvS2NvbmZpZyIKIAogc291cmNlICJhcmNoL2FybS9tYWNoLWludGVncmF0b3IvS2NvbmZpZyIKQEAgLTI1NSw2ICsyNTEsOCBAQAogCiBzb3VyY2UgImFyY2gvYXJtL21hY2gtcmVhbHZpZXcvS2NvbmZpZyIKIAorc291cmNlICJhcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvS2NvbmZpZyIKKwogIyBEZWZpbml0aW9ucyB0byBtYWtlIGxpZmUgZWFzaWVyCiBjb25maWcgQVJDSF9BQ09STgogCWJvb2wKQEAgLTI5MCwxMiArMjg4LDE0IEBACiAJICAoTUNBKSBvciBWRVNBLiAgSVNBIGlzIGFuIG9sZGVyIHN5c3RlbSwgbm93IGJlaW5nIGRpc3BsYWNlZCBieSBQQ0k7CiAJICBuZXdlciBib2FyZHMgZG9uJ3Qgc3VwcG9ydCBpdC4gIElmIHlvdSBoYXZlIElTQSwgc2F5IFksIG90aGVyd2lzZSBOLgogCisjIFNlbGVjdCBJU0EgRE1BIGNvbnRyb2xsZXIgc3VwcG9ydAogY29uZmlnIElTQV9ETUEKIAlib29sCisJc2VsZWN0IElTQV9ETUFfQVBJCiAKKyMgU2VsZWN0IElTQSBETUEgaW50ZXJmYWNlCiBjb25maWcgSVNBX0RNQV9BUEkKIAlib29sCi0JZGVmYXVsdCB5CiAKIGNvbmZpZyBQQ0kKIAlib29sICJQQ0kgc3VwcG9ydCIgaWYgQVJDSF9JTlRFR1JBVE9SX0FQIHx8IEFSQ0hfVkVSU0FUSUxFX1BCCkBAIC00MDEsNiArNDAxLDM4IEBACiAJICBDdXJyZW50bHkgYXQgbGVhc3QgT01BUCwgUFhBMnh4IGFuZCBTQTExeDAgcGxhdGZvcm1zIGFyZSBrbm93bgogCSAgdG8gaGF2ZSBhY2N1cmF0ZSB0aW1la2VlcGluZyB3aXRoIGR5bmFtaWMgdGljay4KIAorY29uZmlnIEFFQUJJCisJYm9vbCAiVXNlIHRoZSBBUk0gRUFCSSB0byBjb21waWxlIHRoZSBrZXJuZWwiCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIGZvciB0aGUga2VybmVsIHRvIGJlIGNvbXBpbGVkIHVzaW5nIHRoZSBsYXRlc3QKKwkgIEFSTSBBQkkgKGFrYSBFQUJJKS4gIFRoaXMgaXMgb25seSB1c2VmdWwgaWYgeW91IGFyZSB1c2luZyBhIHVzZXIKKwkgIHNwYWNlIGVudmlyb25tZW50IHRoYXQgaXMgYWxzbyBjb21waWxlZCB3aXRoIEVBQkkuCisKKwkgIFNpbmNlIHRoZXJlIGFyZSBtYWpvciBpbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuIHRoZSBsZWdhY3kgQUJJIGFuZAorCSAgRUFCSSwgZXNwZWNpYWxseSB3aXRoIHJlZ2FyZCB0byBzdHJ1Y3R1cmUgbWVtYmVyIGFsaWdubWVudCwgdGhpcworCSAgb3B0aW9uIGFsc28gY2hhbmdlcyB0aGUga2VybmVsIHN5c2NhbGwgY2FsbGluZyBjb252ZW50aW9uIHRvCisJICBkaXNhbWJpZ3VhdGUgYm90aCBBQklzIGFuZCBhbGxvdyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBzdXBwb3J0CisJICAoc2VsZWN0ZWQgd2l0aCBDT05GSUdfT0FCSV9DT01QQVQpLgorCisJICBUbyB1c2UgdGhpcyB5b3UgbmVlZCBHQ0MgdmVyc2lvbiA0LjAuMCBvciBsYXRlci4KKworY29uZmlnIE9BQklfQ09NUEFUCisJYm9vbCAiQWxsb3cgb2xkIEFCSSBiaW5hcmllcyB0byBydW4gd2l0aCB0aGlzIGtlcm5lbCIKKwlkZXBlbmRzIG9uIEFFQUJJCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBvcHRpb24gcHJlc2VydmVzIHRoZSBvbGQgc3lzY2FsbCBpbnRlcmZhY2UgYWxvbmcgd2l0aCB0aGUKKwkgIG5ldyAoQVJNIEVBQkkpIG9uZS4gSXQgYWxzbyBwcm92aWRlcyBhIGNvbXBhdGliaWxpdHkgbGF5ZXIgdG8KKwkgIGludGVyY2VwdCBzeXNjYWxscyB0aGF0IGhhdmUgc3RydWN0dXJlIGFyZ3VtZW50cyB3aGljaCBsYXlvdXQKKwkgIGluIG1lbW9yeSBkaWZmZXJzIGJldHdlZW4gdGhlIGxlZ2FjeSBBQkkgYW5kIHRoZSBuZXcgQVJNIEVBQkkKKwkgIChvbmx5IGZvciBub24gInRodW1iIiBiaW5hcmllcykuIFRoaXMgb3B0aW9uIGFkZHMgYSB0aW55CisJICBvdmVyaGVhZCB0byBhbGwgc3lzY2FsbHMgYW5kIHByb2R1Y2VzIGEgc2xpZ2h0bHkgbGFyZ2VyIGtlcm5lbC4KKwkgIElmIHlvdSBrbm93IHlvdSdsbCBiZSB1c2luZyBvbmx5IHB1cmUgRUFCSSB1c2VyIHNwYWNlIHRoZW4geW91CisJICBjYW4gc2F5IE4gaGVyZS4gSWYgdGhpcyBvcHRpb24gaXMgbm90IHNlbGVjdGVkIGFuZCB5b3UgYXR0ZW1wdAorCSAgdG8gZXhlY3V0ZSBhIGxlZ2FjeSBBQkkgYmluYXJ5IHRoZW4gdGhlIHJlc3VsdCB3aWxsIGJlCisJICBVTlBSRURJQ1RBQkxFIChpbiBmYWN0IGl0IGNhbiBiZSBwcmVkaWN0ZWQgdGhhdCBpdCB3b24ndCB3b3JrCisJICBhdCBhbGwpLiBJZiBpbiBkb3VidCBzYXkgWS4KKwogY29uZmlnIEFSQ0hfRElTQ09OVElHTUVNX0VOQUJMRQogCWJvb2wKIAlkZWZhdWx0IChBUkNIX0xIN0E0MFggJiYgIUxIN0E0MFhfQ09OVElHTUVNKQpAQCAtNDE4LDcgKzQ1MCw4IEBACiAJCSAgIEFSQ0hfRUJTQTI4NSB8fCBBUkNIX0lNWCB8fCBBUkNIX0lOVEVHUkFUT1IgfHwgXAogCQkgICBBUkNIX0xVQkJPQ0sgfHwgTUFDSF9NQUlOU1RPTkUgfHwgQVJDSF9ORVRXSU5ERVIgfHwgXAogCQkgICBBUkNIX09NQVAgfHwgQVJDSF9QNzIwVCB8fCBBUkNIX1BYQV9JRFAgfHwgXAotCQkgICBBUkNIX1NBMTEwMCB8fCBBUkNIX1NIQVJLIHx8IEFSQ0hfVkVSU0FUSUxFCisJCSAgIEFSQ0hfU0ExMTAwIHx8IEFSQ0hfU0hBUksgfHwgQVJDSF9WRVJTQVRJTEUgfHwgXAorCQkgICBBUkNIX0FUOTFSTTkyMDAKIAloZWxwCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlIExFRHMgb24geW91ciBtYWNoaW5lIHdpbGwgYmUgdXNlZAogCSAgdG8gcHJvdmlkZSB1c2VmdWwgaW5mb3JtYXRpb24gYWJvdXQgeW91ciBjdXJyZW50IHN5c3RlbSBzdGF0dXMuCkBAIC01ODYsNiArNjE5LDcgQEAKIAogY29uZmlnIEZQRV9OV0ZQRQogCWJvb2wgIk5XRlBFIG1hdGggZW11bGF0aW9uIgorCWRlcGVuZHMgb24gIUFFQUJJIHx8IE9BQklfQ09NUEFUCiAJLS0taGVscC0tLQogCSAgU2F5IFkgdG8gaW5jbHVkZSB0aGUgTldGUEUgZmxvYXRpbmcgcG9pbnQgZW11bGF0b3IgaW4gdGhlIGtlcm5lbC4KIAkgIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHJ1biBtb3N0IGJpbmFyaWVzLiBMaW51eCBkb2VzIG5vdCBjdXJyZW50bHkKQEAgLTYwOSw3ICs2NDMsNyBAQAogCiBjb25maWcgRlBFX0ZBU1RGUEUKIAlib29sICJGYXN0RlBFIG1hdGggZW11bGF0aW9uIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gIUNQVV8zMnYzICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gKCFBRUFCSSB8fCBPQUJJX0NPTVBBVCkgJiYgIUNQVV8zMnYzICYmIEVYUEVSSU1FTlRBTAogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSB0aGUgRkFTVCBmbG9hdGluZyBwb2ludCBlbXVsYXRvciBpbiB0aGUga2VybmVsLgogCSAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgbXVjaCBmYXN0ZXIgZW11bGF0b3Igd2hpY2ggbm93IGFsc28gaGFzIGZ1bGwKQEAgLTY0MSw2ICs2NzUsNyBAQAogCiBjb25maWcgQVJUSFVSCiAJdHJpc3RhdGUgIlJJU0MgT1MgcGVyc29uYWxpdHkiCisJZGVwZW5kcyBvbiAhQUVBQkkKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgdGhlIGtlcm5lbCBjb2RlIG5lY2Vzc2FyeSBpZiB5b3Ugd2FudCB0byBydW4KIAkgIEFjb3JuIFJJU0MgT1MvQXJ0aHVyIGJpbmFyaWVzIHVuZGVyIExpbnV4LiBUaGlzIGNvZGUgaXMgc3RpbGwgdmVyeQpAQCAtNjU2LDcgKzY5MSw2IEBACiAKIGNvbmZpZyBBUE0KIAl0cmlzdGF0ZSAiQWR2YW5jZWQgUG93ZXIgTWFuYWdlbWVudCBFbXVsYXRpb24iCi0JZGVwZW5kcyBvbiBQTV9MRUdBQ1kKIAktLS1oZWxwLS0tCiAJICBBUE0gaXMgYSBCSU9TIHNwZWNpZmljYXRpb24gZm9yIHNhdmluZyBwb3dlciB1c2luZyBzZXZlcmFsIGRpZmZlcmVudAogCSAgdGVjaG5pcXVlcy4gVGhpcyBpcyBtb3N0bHkgdXNlZnVsIGZvciBiYXR0ZXJ5IHBvd2VyZWQgbGFwdG9wcyB3aXRoCkBAIC03MzAsNiArNzY0LDggQEAKIAogc291cmNlICJkcml2ZXJzL2kyYy9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc3BpL0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9od21vbi9LY29uZmlnIgogCiAjc291cmNlICJkcml2ZXJzL2wzL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL2FybS9NYWtlZmlsZSBiL2FyY2gvYXJtL01ha2VmaWxlCmluZGV4IDgxYmQyMTkuLmZiZmMxNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL01ha2VmaWxlCkBAIC04LDcgKzgsNyBAQAogIyBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMSBieSBSdXNzZWxsIEtpbmcKIAogTERGTEFHU192bWxpbnV4CTo9LXAgLS1uby11bmRlZmluZWQgLVgKLUNQUEZMQUdTX3ZtbGludXgubGRzID0gLURLRVJORUxfUkFNX0FERFI9JChURVhUQUREUikKK0NQUEZMQUdTX3ZtbGludXgubGRzID0gLURURVhUX09GRlNFVD0kKFRFWFRfT0ZGU0VUKQogT0JKQ09QWUZMQUdTCTo9LU8gYmluYXJ5IC1SIC5ub3RlIC1SIC5jb21tZW50IC1TCiBHWkZMQUdTCQk6PS05CiAjQ0ZMQUdTCQkrPS1waXBlCkBAIC01Niw4ICs1NiwxMyBAQAogdHVuZS0kKENPTkZJR19DUFVfWFNDQUxFKQk6PSQoY2FsbCBjYy1vcHRpb24sLW10dW5lPXhzY2FsZSwtbXR1bmU9c3Ryb25nYXJtMTEwKSAtV2EsLW1jcHU9eHNjYWxlCiB0dW5lLSQoQ09ORklHX0NQVV9WNikJCTo9JChjYWxsIGNjLW9wdGlvbiwtbXR1bmU9YXJtMTEzNmotcywtbXR1bmU9c3Ryb25nYXJtKQogCi0jIE5lZWQgLVVhcm0gZm9yIGdjYyA8IDMueAoraWZlcSAoJChDT05GSUdfQUVBQkkpLHkpCitDRkxBR1NfQUJJCTo9LW1hYmk9YWFwY3MgLW1uby10aHVtYi1pbnRlcndvcmsKK2Vsc2UKIENGTEFHU19BQkkJOj0kKGNhbGwgY2Mtb3B0aW9uLC1tYXBjcy0zMiwtbWFiaT1hcGNzLWdudSkgJChjYWxsIGNjLW9wdGlvbiwtbW5vLXRodW1iLWludGVyd29yaywpCitlbmRpZgorCisjIE5lZWQgLVVhcm0gZm9yIGdjYyA8IDMueAogQ0ZMQUdTCQkrPSQoQ0ZMQUdTX0FCSSkgJChhcmNoLXkpICQodHVuZS15KSAkKGNhbGwgY2Mtb3B0aW9uLC1tc2hvcnQtbG9hZC1ieXRlcywkKGNhbGwgY2Mtb3B0aW9uLC1tYWxpZ25tZW50LXRyYXBzLCkpIC1tc29mdC1mbG9hdCAtVWFybQogQUZMQUdTCQkrPSQoQ0ZMQUdTX0FCSSkgJChhcmNoLXkpICQodHVuZS15KSAtbXNvZnQtZmxvYXQKIApAQCAtNjUsNyArNzAsNyBAQAogCiAjRGVmYXVsdCB2YWx1ZQogaGVhZC15CQk6PSBhcmNoL2FybS9rZXJuZWwvaGVhZC5vIGFyY2gvYXJtL2tlcm5lbC9pbml0X3Rhc2subwotdGV4dGFkZHIteQk6PSAweEMwMDA4MDAwCit0ZXh0b2ZzLXkJOj0gMHgwMDAwODAwMAogCiAgbWFjaGluZS0kKENPTkZJR19BUkNIX1JQQykJICAgOj0gcnBjCiAgbWFjaGluZS0kKENPTkZJR19BUkNIX0VCU0ExMTApCSAgIDo9IGVic2ExMTAKQEAgLTczLDIyICs3OCwxOSBAQAogICBpbmNkaXItJChDT05GSUdfQVJDSF9DTFBTNzUwMCkgICA6PSBjbDc1MDAKICBtYWNoaW5lLSQoQ09ORklHX0ZPT1RCUklER0UpCSAgIDo9IGZvb3RicmlkZ2UKICAgaW5jZGlyLSQoQ09ORklHX0ZPT1RCUklER0UpCSAgIDo9IGVic2EyODUKLXRleHRhZGRyLSQoQ09ORklHX0FSQ0hfQ08yODUpCSAgIDo9IDB4NjAwMDgwMDAKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfQ08yODUpCSAgIDo9IGZvb3RicmlkZ2UKICAgaW5jZGlyLSQoQ09ORklHX0FSQ0hfQ08yODUpCSAgIDo9IGVic2EyODUKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfU0hBUkspCSAgIDo9IHNoYXJrCiAgbWFjaGluZS0kKENPTkZJR19BUkNIX1NBMTEwMCkJICAgOj0gc2ExMTAwCiBpZmVxICgkKENPTkZJR19BUkNIX1NBMTEwMCkseSkKICMgU0ExMTExIERNQSBidWc6IHdlIGRvbid0IHdhbnQgdGhlIGtlcm5lbCB0byBsaXZlIGluIHByZWNpb3VzIERNQS1hYmxlIG1lbW9yeQotdGV4dGFkZHItJChDT05GSUdfU0ExMTExKQkgICA6PSAweGMwMjA4MDAwCisgdGV4dG9mcy0kKENPTkZJR19TQTExMTEpCSAgIDo9IDB4MDAyMDgwMDAKIGVuZGlmCiAgbWFjaGluZS0kKENPTkZJR19BUkNIX1BYQSkJICAgOj0gcHhhCiAgbWFjaGluZS0kKENPTkZJR19BUkNIX0w3MjAwKQkgICA6PSBsNzIwMAogIG1hY2hpbmUtJChDT05GSUdfQVJDSF9JTlRFR1JBVE9SKSA6PSBpbnRlZ3JhdG9yCi0gbWFjaGluZS0kKENPTkZJR19BUkNIX0NBTUVMT1QpCSAgIDo9IGVweGExMGRiCi10ZXh0YWRkci0kKENPTkZJR19BUkNIX0NMUFM3MTFYKSAgIDo9IDB4YzAwMjgwMDAKKyB0ZXh0b2ZzLSQoQ09ORklHX0FSQ0hfQ0xQUzcxMVgpICAgOj0gMHgwMDAyODAwMAogIG1hY2hpbmUtJChDT05GSUdfQVJDSF9DTFBTNzExWCkgICA6PSBjbHBzNzExeAotdGV4dGFkZHItJChDT05GSUdfQVJDSF9GT1JUVU5FVCkgICA6PSAweGMwMDA4MDAwCiAgbWFjaGluZS0kKENPTkZJR19BUkNIX0lPUDNYWCkJICAgOj0gaW9wM3h4CiAgbWFjaGluZS0kKENPTkZJR19BUkNIX0lYUDRYWCkJICAgOj0gaXhwNHh4CiAgbWFjaGluZS0kKENPTkZJR19BUkNIX0lYUDIwMDApICAgIDo9IGl4cDIwMDAKQEAgLTEwMiw2ICsxMDQsNyBAQAogIG1hY2hpbmUtJChDT05GSUdfQVJDSF9INzIwWCkJICAgOj0gaDcyMHgKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfQUFFQzIwMDApICAgOj0gYWFlYzIwMDAKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfUkVBTFZJRVcpICAgOj0gcmVhbHZpZXcKKyBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMCkgOj0gYXQ5MXJtOTIwMAogCiBpZmVxICgkKENPTkZJR19BUkNIX0VCU0ExMTApLHkpCiAjIFRoaXMgaXMgd2hhdCBoYXBwZW5zIGlmIHlvdSBmb3JnZXQgdGhlIElPQ1MxNiBsaW5lLgpAQCAtMTEwLDcgKzExMyw4IEBACiBleHBvcnQgQ0ZMQUdTXzNjNTg5X2NzLm8KIGVuZGlmCiAKLVRFWFRBRERSIDo9ICQodGV4dGFkZHIteSkKKyMgVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBrZXJuZWwgaW1hZ2UgaW4gUkFNIGZyb20gdGhlIHN0YXJ0IG9mIFJBTS4KK1RFWFRfT0ZGU0VUIDo9ICQodGV4dG9mcy15KQogCiBpZmVxICgkKGluY2Rpci15KSwpCiBpbmNkaXIteSA6PSAkKG1hY2hpbmUteSkKQEAgLTEyMyw3ICsxMjcsNyBAQAogTUFDSElORSAgOj0KIGVuZGlmCiAgIAotZXhwb3J0CVRFWFRBRERSIEdaRkxBR1MKK2V4cG9ydAlURVhUX09GRlNFVCBHWkZMQUdTCiAKICMgRG8gd2UgaGF2ZSBGQVNURlBFPwogRkFTVEZQRQkJOj1hcmNoL2FybS9mYXN0ZnBlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L01ha2VmaWxlIGIvYXJjaC9hcm0vYm9vdC9NYWtlZmlsZQppbmRleCA5MzdhMzUzLi5hMTc0ZDYzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL2Jvb3QvTWFrZWZpbGUKQEAgLTE1LDcgKzE1LDcgQEAKIGVuZGlmCiAKICMgTm90ZTogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIG11c3QgYWx3YXlzIGJlIHRydWU6Ci0jICAgWlJFTEFERFIgPT0gdmlydF90b19waHlzKFRFWFRBRERSKQorIyAgIFpSRUxBRERSID09IHZpcnRfdG9fcGh5cyhQQUdFX09GRlNFVCArIFRFWFRfT0ZGU0VUKQogIyAgIFBBUkFNU19QSFlTIG11c3QgYmUgd2l0aGluIDRNQiBvZiBaUkVMQUREUgogIyAgIElOSVRSRF9QSFlTIG11c3QgYmUgaW4gUkFNCiBaUkVMQUREUiAgICA6PSAkKHpyZWxhZGRyLXkpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKaW5kZXggNmI1MDVjZS4uMzVmZmUwZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQpAQCAtMjEsMTAgKzIxLDYgQEAKIE9CSlMJCSs9IGhlYWQtc2hhcmsubyBvZnctc2hhcmsubwogZW5kaWYKIAotaWZlcSAoJChDT05GSUdfQVJDSF9DQU1FTE9UKSx5KQotT0JKUwkJKz0gaGVhZC1lcHhhMTBkYi5vCi1lbmRpZgotCiBpZmVxICgkKENPTkZJR19BUkNIX0w3MjAwKSx5KQogT0JKUwkJKz0gaGVhZC1sNzIwMC5vCiBlbmRpZgpAQCAtNTAsNiArNDYsMTAgQEAKIE9CSlMJCSs9IGhlYWQtc2hhcnBzbC5vCiBlbmRpZgogCitpZmVxICgkKENPTkZJR19BUkNIX0FUOTFSTTkyMDApLHkpCitPQkpTCQkrPSBoZWFkLWF0OTFybTkyMDAubworZW5kaWYKKwogaWZlcSAoJChDT05GSUdfREVCVUdfSUNFRENDKSx5KQogT0JKUyAgICAgICAgICAgICs9IGljZS1kY2MubwogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLWF0OTFybTkyMDAuUyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLWF0OTFybTkyMDAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTE5ZWE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQtYXQ5MXJtOTIwMC5TCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC1hdDkxcm05MjAwLlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIFNBTiBQZW9wbGUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKwkJLnNlY3Rpb24JIi5zdGFydCIsICJheCIKKworCQlAIEF0bWVsIEFUOTFSTTkyMDAtREsgOiAyNjIKKwkJbW92CXIzLAkjKE1BQ0hfVFlQRV9BVDkxUk05MjAwREsgJiAweGZmKQorCQlvcnIJcjMsIHIzLCAjKE1BQ0hfVFlQRV9BVDkxUk05MjAwREsgJiAweGZmMDApCisJCWNtcAlyNywgcjMKKwkJYmVxCTk5ZgorCisJCUAgQ29nZW50IENTQjMzNyA6IDM5OQorCQltb3YJcjMsCSMoTUFDSF9UWVBFX0NTQjMzNyAmIDB4ZmYpCisJCW9ycglyMywgcjMsICMoTUFDSF9UWVBFX0NTQjMzNyAmIDB4ZmYwMCkKKwkJY21wCXI3LCByMworCQliZXEJOTlmCisKKwkJQCBDb2dlbnQgQ1NCNjM3IDogNjQ4CisJCW1vdglyMywJIyhNQUNIX1RZUEVfQ1NCNjM3ICYgMHhmZikKKwkJb3JyCXIzLCByMywJIyhNQUNIX1RZUEVfQ1NCNjM3ICYgMHhmZjAwKQorCQljbXAJcjcsIHIzCisJCWJlcQk5OWYKKworCQlAIEF0bWVsIEFUOTFSTTkyMDAtRUsgOiA3MDUKKwkJbW92CXIzLAkjKE1BQ0hfVFlQRV9BVDkxUk05MjAwRUsgJiAweGZmKQorCQlvcnIJcjMsIHIzLCAjKE1BQ0hfVFlQRV9BVDkxUk05MjAwRUsgJiAweGZmMDApCisJCWNtcAlyNywgcjMKKwkJYmVxCTk5ZgorCisJCUAgQ29uaXRlYyBDYXJtZXZhIDogNzY5CisJCW1vdglyMywJIyhNQUNIX1RZUEVfQ0FSTUVWQSAmIDB4ZmYpCisJCW9ycglyMywgcjMsICMoTUFDSF9UWVBFX0NBUk1FVkEgJiAweGZmMDApCisJCWNtcAlyNywgcjMKKwkJYmVxCTk5ZgorCisJCUAgS3dpa0J5dGUgS0I5MjB4IDogNjEyCisJCW1vdglyMywJIyhNQUNIX1RZUEVfS0I5MjAwICYgMHhmZikKKwkJb3JyCXIzLCByMywgIyhNQUNIX1RZUEVfS0I5MjAwICYgMHhmZjAwKQorCQljbXAJcjcsIHIzCisJCWJlcQk5OWYKKworCQlAIFVua25vd24gYm9hcmQsIHVzZSB0aGUgQVQ5MVJNOTIwMERLIGJvYXJkCisJCUAgbW92CXI3LCAjTUFDSF9UWVBFX0FUOTFSTTkyMDAKKwkJbW92CXI3LAkjKE1BQ0hfVFlQRV9BVDkxUk05MjAwREsgJiAweGZmKQorCQlvcnIJcjcsIHI3LCAjKE1BQ0hfVFlQRV9BVDkxUk05MjAwREsgJiAweGZmMDApCisKKzk5OgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQtZXB4YTEwZGIuUyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLWVweGExMGRiLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NzY4MWYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQtZXB4YTEwZGIuUworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvZXhjYWxpYnVyLmg+Ci0KLQkJLnNlY3Rpb24JIi5zdGFydCIsICJheCIKLQkJbW92CXI3LCAjTUFDSF9UWVBFX0NBTUVMT1QKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC5TCmluZGV4IDZhYmFmYjYuLmRiMzM4OWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQuUwpAQCAtODQsNyArODQsNyBAQAogCQlrcHV0YwkjJ1xuJwogCQlrcGhleAlyNSwgOAkJLyogZGVjb21wcmVzc2VkIGtlcm5lbCBzdGFydCAqLwogCQlrcHV0YwkjJy0nCi0JCWtwaGV4CXI4LCA4CQkvKiBkZWNvbXByZXNzZWQga2VybmVsIGVuZCAgKi8KKwkJa3BoZXgJcjksIDgJCS8qIGRlY29tcHJlc3NlZCBrZXJuZWwgZW5kICAqLwogCQlrcHV0YwkjJz4nCiAJCWtwaGV4CXI0LCA4CQkvKiBrZXJuZWwgZXhlY3V0aW9uIGFkZHJlc3MgKi8KIAkJa3B1dGMJIydcbicKQEAgLTExNiw3ICsxMTYsNyBAQAogCQkud29yZAlzdGFydAkJCUAgYWJzb2x1dGUgbG9hZC9ydW4gekltYWdlIGFkZHJlc3MKIAkJLndvcmQJX2VkYXRhCQkJQCB6SW1hZ2UgZW5kIGFkZHJlc3MKIDE6CQltb3YJcjcsIHIxCQkJQCBzYXZlIGFyY2hpdGVjdHVyZSBJRAotCQltb3YJcjgsICMwCQkJQCBzYXZlIHIwCisJCW1vdglyOCwgcjIJCQlAIHNhdmUgYXRhZ3MgcG9pbnRlcgogCiAjaWZuZGVmIF9fQVJNX0FSQ0hfMl9fCiAJCS8qCkBAIC0xNDQsNyArMTQ0LDcgQEAKIAogCQkvKgogCQkgKiBzb21lIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlIGNhbiBiZSBpbnNlcnRlZAotCQkgKiBieSB0aGUgbGlua2VyIGhlcmUsIGJ1dCBpdCBzaG91bGQgcHJlc2VydmUgcjcgYW5kIHI4LgorCQkgKiBieSB0aGUgbGlua2VyIGhlcmUsIGJ1dCBpdCBzaG91bGQgcHJlc2VydmUgcjcsIHI4LCBhbmQgcjkuCiAJCSAqLwogCiAJCS50ZXh0CkBAIC0yNDksMTYgKzI0OSwxNyBAQAogICogcjUgICAgID0gZGVjb21wcmVzc2VkIGtlcm5lbCBzdGFydAogICogcjYgICAgID0gcHJvY2Vzc29yIElECiAgKiByNyAgICAgPSBhcmNoaXRlY3R1cmUgSUQKLSAqIHI4LXIxNCA9IHVudXNlZAorICogcjggICAgID0gYXRhZ3MgcG9pbnRlcgorICogcjktcjE0ID0gY29ycnVwdGVkCiAgKi8KIAkJYWRkCXIxLCByNSwgcjAJCUAgZW5kIG9mIGRlY29tcHJlc3NlZCBrZXJuZWwKIAkJYWRyCXIyLCByZWxvY19zdGFydAogCQlsZHIJcjMsIExDMQogCQlhZGQJcjMsIHIyLCByMwotMToJCWxkbWlhCXIyISwge3I4IC0gcjEzfQkJQCBjb3B5IHJlbG9jYXRpb24gY29kZQotCQlzdG1pYQlyMSEsIHtyOCAtIHIxM30KLQkJbGRtaWEJcjIhLCB7cjggLSByMTN9Ci0JCXN0bWlhCXIxISwge3I4IC0gcjEzfQorMToJCWxkbWlhCXIyISwge3I5IC0gcjE0fQkJQCBjb3B5IHJlbG9jYXRpb24gY29kZQorCQlzdG1pYQlyMSEsIHtyOSAtIHIxNH0KKwkJbGRtaWEJcjIhLCB7cjkgLSByMTR9CisJCXN0bWlhCXIxISwge3I5IC0gcjE0fQogCQljbXAJcjIsIHIzCiAJCWJsbwkxYgogCkBAIC0zMDgsMTEgKzMwOSwxMiBAQAogICogIHI0ID0ga2VybmVsIGV4ZWN1dGlvbiBhZGRyZXNzCiAgKiAgcjYgPSBwcm9jZXNzb3IgSUQKICAqICByNyA9IGFyY2hpdGVjdHVyZSBudW1iZXIKLSAqICByOCA9IHJ1bi10aW1lIGFkZHJlc3Mgb2YgInN0YXJ0IgorICogIHI4ID0gYXRhZ3MgcG9pbnRlcgorICogIHI5ID0gcnVuLXRpbWUgYWRkcmVzcyBvZiAic3RhcnQiICAoPz8/KQogICogT24gZXhpdCwKLSAqICByMSwgcjIsIHIzLCByOCwgcjksIHIxMiBjb3JydXB0ZWQKKyAqICByMSwgcjIsIHIzLCByOSwgcjEwLCByMTIgY29ycnVwdGVkCiAgKiBUaGlzIHJvdXRpbmUgbXVzdCBwcmVzZXJ2ZToKLSAqICByNCwgcjUsIHI2LCByNworICogIHI0LCByNSwgcjYsIHI3LCByOAogICovCiAJCS5hbGlnbgk1CiBjYWNoZV9vbjoJbW92CXIzLCAjOAkJCUAgY2FjaGVfb24gZnVuY3Rpb24KQEAgLTMyNiwxNSArMzI4LDE1IEBACiAgKiBiaXRzIGZvciB0aGUgUkFNIGFyZWEgb25seS4KICAqLwogCQltb3YJcjAsIHIzCi0JCW1vdglyOCwgcjAsIGxzciAjMTgKLQkJbW92CXI4LCByOCwgbHNsICMxOAkJQCBzdGFydCBvZiBSQU0KLQkJYWRkCXI5LCByOCwgIzB4MTAwMDAwMDAJQCBhIHJlYXNvbmFibGUgUkFNIHNpemUKKwkJbW92CXI5LCByMCwgbHNyICMxOAorCQltb3YJcjksIHI5LCBsc2wgIzE4CQlAIHN0YXJ0IG9mIFJBTQorCQlhZGQJcjEwLCByOSwgIzB4MTAwMDAwMDAJQCBhIHJlYXNvbmFibGUgUkFNIHNpemUKIAkJbW92CXIxLCAjMHgxMgogCQlvcnIJcjEsIHIxLCAjMyA8PCAxMAogCQlhZGQJcjIsIHIzLCAjMTYzODQKLTE6CQljbXAJcjEsIHI4CQkJQCBpZiB2aXJ0ID4gc3RhcnQgb2YgUkFNCisxOgkJY21wCXIxLCByOQkJCUAgaWYgdmlydCA+IHN0YXJ0IG9mIFJBTQogCQlvcnJocwlyMSwgcjEsICMweDBjCQlAIHNldCBjYWNoZWFibGUsIGJ1ZmZlcmFibGUKLQkJY21wCXIxLCByOQkJCUAgaWYgdmlydCA+IGVuZCBvZiBSQU0KKwkJY21wCXIxLCByMTAJCQlAIGlmIHZpcnQgPiBlbmQgb2YgUkFNCiAJCWJpY2hzCXIxLCByMSwgIzB4MGMJCUAgY2xlYXIgY2FjaGVhYmxlLCBidWZmZXJhYmxlCiAJCXN0cglyMSwgW3IwXSwgIzQJCUAgMToxIG1hcHBpbmcKIAkJYWRkCXIxLCByMSwgIzEwNDg1NzYKQEAgLTQwMywyNiArNDA1LDI4IEBACiAgKiByNSAgICAgPSBkZWNvbXByZXNzZWQga2VybmVsIHN0YXJ0CiAgKiByNiAgICAgPSBwcm9jZXNzb3IgSUQKICAqIHI3ICAgICA9IGFyY2hpdGVjdHVyZSBJRAotICogcjgtcjE0ID0gdW51c2VkCisgKiByOCAgICAgPSBhdGFncyBwb2ludGVyCisgKiByOS1yMTQgPSBjb3JydXB0ZWQKICAqLwogCQkuYWxpZ24JNQotcmVsb2Nfc3RhcnQ6CWFkZAlyOCwgcjUsIHIwCityZWxvY19zdGFydDoJYWRkCXI5LCByNSwgcjAKIAkJZGVidWdfcmVsb2Nfc3RhcnQKIAkJbW92CXIxLCByNAogMToKIAkJLnJlcHQJNAotCQlsZG1pYQlyNSEsIHtyMCwgcjIsIHIzLCByOSAtIHIxM30JQCByZWxvY2F0ZSBrZXJuZWwKLQkJc3RtaWEJcjEhLCB7cjAsIHIyLCByMywgcjkgLSByMTN9CisJCWxkbWlhCXI1ISwge3IwLCByMiwgcjMsIHIxMCAtIHIxNH0JQCByZWxvY2F0ZSBrZXJuZWwKKwkJc3RtaWEJcjEhLCB7cjAsIHIyLCByMywgcjEwIC0gcjE0fQogCQkuZW5kcgogCi0JCWNtcAlyNSwgcjgKKwkJY21wCXI1LCByOQogCQlibG8JMWIKIAkJZGVidWdfcmVsb2NfZW5kCiAKIGNhbGxfa2VybmVsOglibAljYWNoZV9jbGVhbl9mbHVzaAogCQlibAljYWNoZV9vZmYKLQkJbW92CXIwLCAjMAorCQltb3YJcjAsICMwCQkJQCBtdXN0IGJlIHplcm8KIAkJbW92CXIxLCByNwkJCUAgcmVzdG9yZSBhcmNoaXRlY3R1cmUgbnVtYmVyCisJCW1vdglyMiwgcjgJCQlAIHJlc3RvcmUgYXRhZ3MgcG9pbnRlcgogCQltb3YJcGMsIHI0CQkJQCBjYWxsIGtlcm5lbAogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL0tjb25maWcgYi9hcmNoL2FybS9jb21tb24vS2NvbmZpZwppbmRleCA2NjZiYTM5Li41ZTM0Y2E2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vS2NvbmZpZworKysgYi9hcmNoL2FybS9jb21tb24vS2NvbmZpZwpAQCAtMSw3ICsxLDEwIEBACi1jb25maWcgSUNTVDUyNQorY29uZmlnIEFSTV9HSUMKIAlib29sCiAKLWNvbmZpZyBBUk1fR0lDCitjb25maWcgQVJNX1ZJQworCWJvb2wKKworY29uZmlnIElDU1Q1MjUKIAlib29sCiAKIGNvbmZpZyBJQ1NUMzA3CkBAIC0yMyw1ICsyNiw4IEBACiBjb25maWcgU0hBUlBfUEFSQU0KIAlib29sCiAKK2NvbmZpZyBTSEFSUFNMX1BNCisJYm9vbAorCiBjb25maWcgU0hBUlBfU0NPT1AKIAlib29sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vTWFrZWZpbGUgYi9hcmNoL2FybS9jb21tb24vTWFrZWZpbGUKaW5kZXggYTg3ODg2NS4uYzgxYTJmZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9NYWtlZmlsZQpAQCAtMyw4ICszLDggQEAKICMKIAogb2JqLXkJCQkJKz0gcnRjdGltZS5vCi1vYmotJChDT05GSUdfQVJNX0FNQkEpCQkrPSBhbWJhLm8KIG9iai0kKENPTkZJR19BUk1fR0lDKQkJKz0gZ2ljLm8KK29iai0kKENPTkZJR19BUk1fVklDKQkJKz0gdmljLm8KIG9iai0kKENPTkZJR19JQ1NUNTI1KQkJKz0gaWNzdDUyNS5vCiBvYmotJChDT05GSUdfSUNTVDMwNykJCSs9IGljc3QzMDcubwogb2JqLSQoQ09ORklHX1NBMTExMSkJCSs9IHNhMTExMS5vCkBAIC0xMyw0ICsxMyw1IEBACiBvYmotJChDT05GSUdfVElNRVJfQUNPUk4pCSs9IHRpbWUtYWNvcm4ubwogb2JqLSQoQ09ORklHX1NIQVJQX0xPQ09NTykJKz0gbG9jb21vLm8KIG9iai0kKENPTkZJR19TSEFSUF9QQVJBTSkJKz0gc2hhcnBzbF9wYXJhbS5vCitvYmotJChDT05GSUdfU0hBUlBTTF9QTSkJKz0gc2hhcnBzbF9wbS5vCiBvYmotJChDT05GSUdfU0hBUlBfU0NPT1ApCSs9IHNjb29wLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9hbWJhLmMgYi9hcmNoL2FybS9jb21tb24vYW1iYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTVlYzllLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL2NvbW1vbi9hbWJhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL2FybS9jb21tb24vYW1iYS5jCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMyBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZCwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYW1iYS5oPgotI2luY2x1ZGUgPGFzbS9zaXplcy5oPgotCi0jZGVmaW5lIHRvX2FtYmFfZGV2aWNlKGQpCWNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgYW1iYV9kZXZpY2UsIGRldikKLSNkZWZpbmUgdG9fYW1iYV9kcml2ZXIoZCkJY29udGFpbmVyX29mKGQsIHN0cnVjdCBhbWJhX2RyaXZlciwgZHJ2KQotCi1zdGF0aWMgc3RydWN0IGFtYmFfaWQgKgotYW1iYV9sb29rdXAoc3RydWN0IGFtYmFfaWQgKnRhYmxlLCBzdHJ1Y3QgYW1iYV9kZXZpY2UgKmRldikKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXdoaWxlICh0YWJsZS0+bWFzaykgewotCQlyZXQgPSAoZGV2LT5wZXJpcGhpZCAmIHRhYmxlLT5tYXNrKSA9PSB0YWJsZS0+aWQ7Ci0JCWlmIChyZXQpCi0JCQlicmVhazsKLQkJdGFibGUrKzsKLQl9Ci0KLQlyZXR1cm4gcmV0ID8gdGFibGUgOiBOVUxMOwotfQotCi1zdGF0aWMgaW50IGFtYmFfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQotewotCXN0cnVjdCBhbWJhX2RldmljZSAqcGNkZXYgPSB0b19hbWJhX2RldmljZShkZXYpOwotCXN0cnVjdCBhbWJhX2RyaXZlciAqcGNkcnYgPSB0b19hbWJhX2RyaXZlcihkcnYpOwotCi0JcmV0dXJuIGFtYmFfbG9va3VwKHBjZHJ2LT5pZF90YWJsZSwgcGNkZXYpICE9IE5VTEw7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSE9UUExVRwotc3RhdGljIGludCBhbWJhX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnJfZW52LCBjaGFyICpidWYsIGludCBidWZzeikKLXsKLQlzdHJ1Y3QgYW1iYV9kZXZpY2UgKnBjZGV2ID0gdG9fYW1iYV9kZXZpY2UoZGV2KTsKLQotCWlmIChucl9lbnYgPCAyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNucHJpbnRmKGJ1ZiwgYnVmc3osICJBTUJBX0lEPSUwOHgiLCBwY2Rldi0+cGVyaXBoaWQpOwotCSplbnZwKysgPSBidWY7Ci0JKmVudnArKyA9IE5VTEw7Ci0JcmV0dXJuIDA7Ci19Ci0jZWxzZQotI2RlZmluZSBhbWJhX3VldmVudCBOVUxMCi0jZW5kaWYKLQotc3RhdGljIGludCBhbWJhX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IGFtYmFfZHJpdmVyICpkcnYgPSB0b19hbWJhX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoZGV2LT5kcml2ZXIgJiYgZHJ2LT5zdXNwZW5kKQotCQlyZXQgPSBkcnYtPnN1c3BlbmQodG9fYW1iYV9kZXZpY2UoZGV2KSwgc3RhdGUpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYW1iYV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBhbWJhX2RyaXZlciAqZHJ2ID0gdG9fYW1iYV9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCWludCByZXQgPSAwOwotCi0JaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+cmVzdW1lKQotCQlyZXQgPSBkcnYtPnJlc3VtZSh0b19hbWJhX2RldmljZShkZXYpKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogUHJpbWVjZWxscyBhcmUgcGFydCBvZiB0aGUgQWR2YW5jZWQgTWljcm9jb250cm9sbGVyIEJ1cyBBcmNoaXRlY3R1cmUsCi0gKiBzbyB3ZSBjYWxsIHRoZSBidXMgImFtYmEiLgotICovCi1zdGF0aWMgc3RydWN0IGJ1c190eXBlIGFtYmFfYnVzdHlwZSA9IHsKLQkubmFtZQkJPSAiYW1iYSIsCi0JLm1hdGNoCQk9IGFtYmFfbWF0Y2gsCi0JLnVldmVudAkJPSBhbWJhX3VldmVudCwKLQkuc3VzcGVuZAk9IGFtYmFfc3VzcGVuZCwKLQkucmVzdW1lCQk9IGFtYmFfcmVzdW1lLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYW1iYV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGJ1c19yZWdpc3RlcigmYW1iYV9idXN0eXBlKTsKLX0KLQotcG9zdGNvcmVfaW5pdGNhbGwoYW1iYV9pbml0KTsKLQotLyoKLSAqIFRoZXNlIGFyZSB0aGUgZGV2aWNlIG1vZGVsIGNvbnZlcnNpb24gdmVuZWVyczsgdGhleSBjb252ZXJ0IHRoZQotICogZGV2aWNlIG1vZGVsIHN0cnVjdHVyZXMgdG8gb3VyIG1vcmUgc3BlY2lmaWMgc3RydWN0dXJlcy4KLSAqLwotc3RhdGljIGludCBhbWJhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYW1iYV9kZXZpY2UgKnBjZGV2ID0gdG9fYW1iYV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgYW1iYV9kcml2ZXIgKnBjZHJ2ID0gdG9fYW1iYV9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCXN0cnVjdCBhbWJhX2lkICppZDsKLQotCWlkID0gYW1iYV9sb29rdXAocGNkcnYtPmlkX3RhYmxlLCBwY2Rldik7Ci0KLQlyZXR1cm4gcGNkcnYtPnByb2JlKHBjZGV2LCBpZCk7Ci19Ci0KLXN0YXRpYyBpbnQgYW1iYV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBhbWJhX2RyaXZlciAqZHJ2ID0gdG9fYW1iYV9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCXJldHVybiBkcnYtPnJlbW92ZSh0b19hbWJhX2RldmljZShkZXYpKTsKLX0KLQotc3RhdGljIHZvaWQgYW1iYV9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGFtYmFfZHJpdmVyICpkcnYgPSB0b19hbWJhX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0JZHJ2LT5zaHV0ZG93bih0b19hbWJhX2RldmljZShkZXYpKTsKLX0KLQotLyoqCi0gKglhbWJhX2RyaXZlcl9yZWdpc3RlciAtIHJlZ2lzdGVyIGFuIEFNQkEgZGV2aWNlIGRyaXZlcgotICoJQGRydjogYW1iYSBkZXZpY2UgZHJpdmVyIHN0cnVjdHVyZQotICoKLSAqCVJlZ2lzdGVyIGFuIEFNQkEgZGV2aWNlIGRyaXZlciB3aXRoIHRoZSBMaW51eCBkZXZpY2UgbW9kZWwKLSAqCWNvcmUuICBJZiBkZXZpY2VzIHByZS1leGlzdCwgdGhlIGRyaXZlcnMgcHJvYmUgZnVuY3Rpb24gd2lsbAotICoJYmUgY2FsbGVkLgotICovCi1pbnQgYW1iYV9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGFtYmFfZHJpdmVyICpkcnYpCi17Ci0JZHJ2LT5kcnYuYnVzID0gJmFtYmFfYnVzdHlwZTsKLQotI2RlZmluZSBTRVRGTihmbikJaWYgKGRydi0+Zm4pIGRydi0+ZHJ2LmZuID0gYW1iYV8jI2ZuCi0JU0VURk4ocHJvYmUpOwotCVNFVEZOKHJlbW92ZSk7Ci0JU0VURk4oc2h1dGRvd24pOwotCi0JcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcnYpOwotfQotCi0vKioKLSAqCWFtYmFfZHJpdmVyX3VucmVnaXN0ZXIgLSByZW1vdmUgYW4gQU1CQSBkZXZpY2UgZHJpdmVyCi0gKglAZHJ2OiBBTUJBIGRldmljZSBkcml2ZXIgc3RydWN0dXJlIHRvIHJlbW92ZQotICoKLSAqCVVucmVnaXN0ZXIgYW4gQU1CQSBkZXZpY2UgZHJpdmVyIGZyb20gdGhlIExpbnV4IGRldmljZQotICoJbW9kZWwuICBUaGUgZGV2aWNlIG1vZGVsIHdpbGwgY2FsbCB0aGUgZHJpdmVycyByZW1vdmUgZnVuY3Rpb24KLSAqCWZvciBlYWNoIGRldmljZSB0aGUgZGV2aWNlIGRyaXZlciBpcyBjdXJyZW50bHkgaGFuZGxpbmcuCi0gKi8KLXZvaWQgYW1iYV9kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgYW1iYV9kcml2ZXIgKmRydikKLXsKLQlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5kcnYpOwotfQotCi0KLXN0YXRpYyB2b2lkIGFtYmFfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBhbWJhX2RldmljZSAqZCA9IHRvX2FtYmFfZGV2aWNlKGRldik7Ci0KLQlpZiAoZC0+cmVzLnBhcmVudCkKLQkJcmVsZWFzZV9yZXNvdXJjZSgmZC0+cmVzKTsKLQlrZnJlZShkKTsKLX0KLQotI2RlZmluZSBhbWJhX2F0dHIobmFtZSxmbXQsYXJnLi4uKQkJCQlcCi1zdGF0aWMgc3NpemVfdCBzaG93XyMjbmFtZShzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCi17CQkJCQkJCQlcCi0Jc3RydWN0IGFtYmFfZGV2aWNlICpkZXYgPSB0b19hbWJhX2RldmljZShfZGV2KTsJCVwKLQlyZXR1cm4gc3ByaW50ZihidWYsIGZtdCwgYXJnKTsJCQkJXAotfQkJCQkJCQkJXAotc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfIyNuYW1lLCBOVUxMKQotCi1hbWJhX2F0dHIoaWQsICIlMDh4XG4iLCBkZXYtPnBlcmlwaGlkKTsKLWFtYmFfYXR0cihpcnEwLCAiJXVcbiIsIGRldi0+aXJxWzBdKTsKLWFtYmFfYXR0cihpcnExLCAiJXVcbiIsIGRldi0+aXJxWzFdKTsKLWFtYmFfYXR0cihyZXNvdXJjZSwgIlx0JTA4bHhcdCUwOGx4XHQlMDhseFxuIiwKLQkgIGRldi0+cmVzLnN0YXJ0LCBkZXYtPnJlcy5lbmQsIGRldi0+cmVzLmZsYWdzKTsKLQotLyoqCi0gKglhbWJhX2RldmljZV9yZWdpc3RlciAtIHJlZ2lzdGVyIGFuIEFNQkEgZGV2aWNlCi0gKglAZGV2OiBBTUJBIGRldmljZSB0byByZWdpc3RlcgotICoJQHBhcmVudDogcGFyZW50IG1lbW9yeSByZXNvdXJjZQotICoKLSAqCVNldHVwIHRoZSBBTUJBIGRldmljZSwgcmVhZGluZyB0aGUgY2VsbCBJRCBpZiBwcmVzZW50LgotICoJQ2xhaW0gdGhlIHJlc291cmNlLCBhbmQgcmVnaXN0ZXIgdGhlIEFNQkEgZGV2aWNlIHdpdGgKLSAqCXRoZSBMaW51eCBkZXZpY2UgbWFuYWdlci4KLSAqLwotaW50IGFtYmFfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBhbWJhX2RldmljZSAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnBhcmVudCkKLXsKLQl1MzIgcGlkLCBjaWQ7Ci0Jdm9pZCBfX2lvbWVtICp0bXA7Ci0JaW50IGksIHJldDsKLQotCWRldi0+ZGV2LnJlbGVhc2UgPSBhbWJhX2RldmljZV9yZWxlYXNlOwotCWRldi0+ZGV2LmJ1cyA9ICZhbWJhX2J1c3R5cGU7Ci0JZGV2LT5kZXYuZG1hX21hc2sgPSAmZGV2LT5kbWFfbWFzazsKLQlkZXYtPnJlcy5uYW1lID0gZGV2LT5kZXYuYnVzX2lkOwotCi0JaWYgKCFkZXYtPmRldi5jb2hlcmVudF9kbWFfbWFzayAmJiBkZXYtPmRtYV9tYXNrKQotCQlkZXZfd2FybigmZGV2LT5kZXYsICJjb2hlcmVudCBkbWEgbWFzayBpcyB1bnNldFxuIik7Ci0KLQlyZXQgPSByZXF1ZXN0X3Jlc291cmNlKHBhcmVudCwgJmRldi0+cmVzKTsKLQlpZiAocmV0ID09IDApIHsKLQkJdG1wID0gaW9yZW1hcChkZXYtPnJlcy5zdGFydCwgU1pfNEspOwotCQlpZiAoIXRtcCkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJZm9yIChwaWQgPSAwLCBpID0gMDsgaSA8IDQ7IGkrKykKLQkJCXBpZCB8PSAocmVhZGwodG1wICsgMHhmZTAgKyA0ICogaSkgJiAyNTUpIDw8IChpICogOCk7Ci0JCWZvciAoY2lkID0gMCwgaSA9IDA7IGkgPCA0OyBpKyspCi0JCQljaWQgfD0gKHJlYWRsKHRtcCArIDB4ZmYwICsgNCAqIGkpICYgMjU1KSA8PCAoaSAqIDgpOwotCi0JCWlvdW5tYXAodG1wKTsKLQotCQlpZiAoY2lkID09IDB4YjEwNWYwMGQpCi0JCQlkZXYtPnBlcmlwaGlkID0gcGlkOwotCi0JCWlmIChkZXYtPnBlcmlwaGlkKQotCQkJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZkZXYtPmRldik7Ci0JCWVsc2UKLQkJCXJldCA9IC1FTk9ERVY7Ci0KLQkJaWYgKHJldCA9PSAwKSB7Ci0JCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfaWQpOwotCQkJaWYgKGRldi0+aXJxWzBdICE9IE5PX0lSUSkKLQkJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfaXJxMCk7Ci0JCQlpZiAoZGV2LT5pcnFbMV0gIT0gTk9fSVJRKQotCQkJCWRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9pcnExKTsKLQkJCWRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9yZXNvdXJjZSk7Ci0JCX0gZWxzZSB7Ci0gb3V0OgotCQkJcmVsZWFzZV9yZXNvdXJjZSgmZGV2LT5yZXMpOwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICoJYW1iYV9kZXZpY2VfdW5yZWdpc3RlciAtIHVucmVnaXN0ZXIgYW4gQU1CQSBkZXZpY2UKLSAqCUBkZXY6IEFNQkEgZGV2aWNlIHRvIHJlbW92ZQotICoKLSAqCVJlbW92ZSB0aGUgc3BlY2lmaWVkIEFNQkEgZGV2aWNlIGZyb20gdGhlIExpbnV4IGRldmljZQotICoJbWFuYWdlci4gIEFsbCBmaWxlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3Qgd2lsbCBiZQotICoJZGVzdHJveWVkLCBhbmQgZGV2aWNlIGRyaXZlcnMgbm90aWZpZWQgdGhhdCB0aGUgZGV2aWNlIGhhcwotICoJYmVlbiByZW1vdmVkLiAgVGhlIEFNQkEgZGV2aWNlJ3MgcmVzb3VyY2VzIGluY2x1ZGluZwotICoJdGhlIGFtYmFfZGV2aWNlIHN0cnVjdHVyZSB3aWxsIGJlIGZyZWVkIG9uY2UgYWxsCi0gKglyZWZlcmVuY2VzIHRvIGl0IGhhdmUgYmVlbiBkcm9wcGVkLgotICovCi12b2lkIGFtYmFfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGFtYmFfZGV2aWNlICpkZXYpCi17Ci0JZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+ZGV2KTsKLX0KLQotCi1zdHJ1Y3QgZmluZF9kYXRhIHsKLQlzdHJ1Y3QgYW1iYV9kZXZpY2UgKmRldjsKLQlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQ7Ci0JY29uc3QgY2hhciAqYnVzaWQ7Ci0JdW5zaWduZWQgaW50IGlkOwotCXVuc2lnbmVkIGludCBtYXNrOwotfTsKLQotc3RhdGljIGludCBhbWJhX2ZpbmRfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBmaW5kX2RhdGEgKmQgPSBkYXRhOwotCXN0cnVjdCBhbWJhX2RldmljZSAqcGNkZXYgPSB0b19hbWJhX2RldmljZShkZXYpOwotCWludCByOwotCi0JciA9IChwY2Rldi0+cGVyaXBoaWQgJiBkLT5tYXNrKSA9PSBkLT5pZDsKLQlpZiAoZC0+cGFyZW50KQotCQlyICY9IGQtPnBhcmVudCA9PSBkZXYtPnBhcmVudDsKLQlpZiAoZC0+YnVzaWQpCi0JCXIgJj0gc3RyY21wKGRldi0+YnVzX2lkLCBkLT5idXNpZCkgPT0gMDsKLQotCWlmIChyKSB7Ci0JCWdldF9kZXZpY2UoZGV2KTsKLQkJZC0+ZGV2ID0gcGNkZXY7Ci0JfQotCi0JcmV0dXJuIHI7Ci19Ci0KLS8qKgotICoJYW1iYV9maW5kX2RldmljZSAtIGxvY2F0ZSBhbiBBTUJBIGRldmljZSBnaXZlbiBhIGJ1cyBpZAotICoJQGJ1c2lkOiBidXMgaWQgZm9yIGRldmljZSAob3IgTlVMTCkKLSAqCUBwYXJlbnQ6IHBhcmVudCBkZXZpY2UgKG9yIE5VTEwpCi0gKglAaWQ6IHBlcmlwaGVyYWwgSUQgKG9yIDApCi0gKglAbWFzazogcGVyaXBoZXJhbCBJRCBtYXNrIChvciAwKQotICoKLSAqCVJldHVybiB0aGUgQU1CQSBkZXZpY2UgY29ycmVzcG9uZGluZyB0byB0aGUgc3VwcGxpZWQgcGFyYW1ldGVycy4KLSAqCUlmIG5vIGRldmljZSBtYXRjaGVzLCByZXR1cm5zIE5VTEwuCi0gKgotICoJTk9URTogV2hlbiBhIHZhbGlkIGRldmljZSBpcyBmb3VuZCwgaXRzIHJlZmNvdW50IGlzCi0gKglpbmNyZW1lbnRlZCwgYW5kIG11c3QgYmUgZGVjcmVtZW50ZWQgYmVmb3JlIHRoZSByZXR1cm5lZAotICoJcmVmZXJlbmNlLgotICovCi1zdHJ1Y3QgYW1iYV9kZXZpY2UgKgotYW1iYV9maW5kX2RldmljZShjb25zdCBjaGFyICpidXNpZCwgc3RydWN0IGRldmljZSAqcGFyZW50LCB1bnNpZ25lZCBpbnQgaWQsCi0JCSB1bnNpZ25lZCBpbnQgbWFzaykKLXsKLQlzdHJ1Y3QgZmluZF9kYXRhIGRhdGE7Ci0KLQlkYXRhLmRldiA9IE5VTEw7Ci0JZGF0YS5wYXJlbnQgPSBwYXJlbnQ7Ci0JZGF0YS5idXNpZCA9IGJ1c2lkOwotCWRhdGEuaWQgPSBpZDsKLQlkYXRhLm1hc2sgPSBtYXNrOwotCi0JYnVzX2Zvcl9lYWNoX2RldigmYW1iYV9idXN0eXBlLCBOVUxMLCAmZGF0YSwgYW1iYV9maW5kX21hdGNoKTsKLQotCXJldHVybiBkYXRhLmRldjsKLX0KLQotLyoqCi0gKglhbWJhX3JlcXVlc3RfcmVnaW9ucyAtIHJlcXVlc3QgYWxsIG1lbSByZWdpb25zIGFzc29jaWF0ZWQgd2l0aCBkZXZpY2UKLSAqCUBkZXY6IGFtYmFfZGV2aWNlIHN0cnVjdHVyZSBmb3IgZGV2aWNlCi0gKglAbmFtZTogbmFtZSwgb3IgTlVMTCB0byB1c2UgZHJpdmVyIG5hbWUKLSAqLwotaW50IGFtYmFfcmVxdWVzdF9yZWdpb25zKHN0cnVjdCBhbWJhX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQotewotCWludCByZXQgPSAwOwotCi0JaWYgKCFuYW1lKQotCQluYW1lID0gZGV2LT5kZXYuZHJpdmVyLT5uYW1lOwotCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oZGV2LT5yZXMuc3RhcnQsIFNaXzRLLCBuYW1lKSkKLQkJcmV0ID0gLUVCVVNZOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKglhbWJhX3JlbGVhc2VfcmVnaW9ucyAtIHJlbGVhc2UgbWVtIHJlZ2lvbnMgYXNzb2ljYXRlZCB3aXRoIGRldmljZQotICoJQGRldjogYW1iYV9kZXZpY2Ugc3RydWN0dXJlIGZvciBkZXZpY2UKLSAqCi0gKglSZWxlYXNlIHJlZ2lvbnMgY2xhaW1lZCBieSBhIHN1Y2Nlc3NmdWwgY2FsbCB0byBhbWJhX3JlcXVlc3RfcmVnaW9ucy4KLSAqLwotdm9pZCBhbWJhX3JlbGVhc2VfcmVnaW9ucyhzdHJ1Y3QgYW1iYV9kZXZpY2UgKmRldikKLXsKLQlyZWxlYXNlX21lbV9yZWdpb24oZGV2LT5yZXMuc3RhcnQsIFNaXzRLKTsKLX0KLQotRVhQT1JUX1NZTUJPTChhbWJhX2RyaXZlcl9yZWdpc3Rlcik7Ci1FWFBPUlRfU1lNQk9MKGFtYmFfZHJpdmVyX3VucmVnaXN0ZXIpOwotRVhQT1JUX1NZTUJPTChhbWJhX2RldmljZV9yZWdpc3Rlcik7Ci1FWFBPUlRfU1lNQk9MKGFtYmFfZGV2aWNlX3VucmVnaXN0ZXIpOwotRVhQT1JUX1NZTUJPTChhbWJhX2ZpbmRfZGV2aWNlKTsKLUVYUE9SVF9TWU1CT0woYW1iYV9yZXF1ZXN0X3JlZ2lvbnMpOwotRVhQT1JUX1NZTUJPTChhbWJhX3JlbGVhc2VfcmVnaW9ucyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vbG9jb21vLmMgYi9hcmNoL2FybS9jb21tb24vbG9jb21vLmMKaW5kZXggMWI3ZWFhYi4uMTU5YWQ3ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9sb2NvbW8uYwpAQCAtMTEwMywxNCArMTEwMywxNCBAQAogc3RydWN0IGJ1c190eXBlIGxvY29tb19idXNfdHlwZSA9IHsKIAkubmFtZQkJPSAibG9jb21vLWJ1cyIsCiAJLm1hdGNoCQk9IGxvY29tb19tYXRjaCwKKwkucHJvYmUJCT0gbG9jb21vX2J1c19wcm9iZSwKKwkucmVtb3ZlCQk9IGxvY29tb19idXNfcmVtb3ZlLAogCS5zdXNwZW5kCT0gbG9jb21vX2J1c19zdXNwZW5kLAogCS5yZXN1bWUJCT0gbG9jb21vX2J1c19yZXN1bWUsCiB9OwogCiBpbnQgbG9jb21vX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgbG9jb21vX2RyaXZlciAqZHJpdmVyKQogewotCWRyaXZlci0+ZHJ2LnByb2JlID0gbG9jb21vX2J1c19wcm9iZTsKLQlkcml2ZXItPmRydi5yZW1vdmUgPSBsb2NvbW9fYnVzX3JlbW92ZTsKIAlkcml2ZXItPmRydi5idXMgPSAmbG9jb21vX2J1c190eXBlOwogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRyaXZlci0+ZHJ2KTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9ydGN0aW1lLmMgYi9hcmNoL2FybS9jb21tb24vcnRjdGltZS5jCmluZGV4IDcyYjAzZjIuLjQ4YjFlMTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi9ydGN0aW1lLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL3J0Y3RpbWUuYwpAQCAtMTcsNyArMTcsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS9ydGMuaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CkBAIC0zNCw3ICszNiw3IEBACiAvKgogICogcnRjX3NlbSBwcm90ZWN0cyBydGNfaW51c2UgYW5kIHJ0Y19vcHMKICAqLwotc3RhdGljIERFQ0xBUkVfTVVURVgocnRjX3NlbSk7CitzdGF0aWMgREVGSU5FX01VVEVYKHJ0Y19tdXRleCk7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBydGNfaW51c2U7CiBzdGF0aWMgc3RydWN0IHJ0Y19vcHMgKnJ0Y19vcHM7CiAKQEAgLTM1NSw3ICszNTcsNyBAQAogewogCWludCByZXQ7CiAKLQlkb3duKCZydGNfc2VtKTsKKwltdXRleF9sb2NrKCZydGNfbXV0ZXgpOwogCiAJaWYgKHJ0Y19pbnVzZSkgewogCQlyZXQgPSAtRUJVU1k7CkBAIC0zNzMsNyArMzc1LDcgQEAKIAkJCXJ0Y19pbnVzZSA9IDE7CiAJCX0KIAl9Ci0JdXAoJnJ0Y19zZW0pOworCW11dGV4X3VubG9jaygmcnRjX211dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC00NzksNyArNDgxLDcgQEAKIHsKIAlpbnQgcmV0ID0gLUVCVVNZOwogCi0JZG93bigmcnRjX3NlbSk7CisJbXV0ZXhfbG9jaygmcnRjX211dGV4KTsKIAlpZiAocnRjX29wcyA9PSBOVUxMKSB7CiAJCXJ0Y19vcHMgPSBvcHM7CiAKQEAgLTQ4OCw3ICs0OTAsNyBAQAogCQkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZHJpdmVyL3J0YyIsIDAsIE5VTEwsCiAJCQkJCSAgICAgICBydGNfcmVhZF9wcm9jLCBvcHMpOwogCX0KLQl1cCgmcnRjX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZydGNfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTQ5NiwxMiArNDk4LDEyIEBACiAKIHZvaWQgdW5yZWdpc3Rlcl9ydGMoc3RydWN0IHJ0Y19vcHMgKnJ0YykKIHsKLQlkb3duKCZydGNfc2VtKTsKKwltdXRleF9sb2NrKCZydGNfbXV0ZXgpOwogCWlmIChydGMgPT0gcnRjX29wcykgewogCQlyZW1vdmVfcHJvY19lbnRyeSgiZHJpdmVyL3J0YyIsIE5VTEwpOwogCQltaXNjX2RlcmVnaXN0ZXIoJnJ0Y19taXNjZGV2KTsKIAkJcnRjX29wcyA9IE5VTEw7CiAJfQotCXVwKCZydGNfc2VtKTsKKwltdXRleF91bmxvY2soJnJ0Y19tdXRleCk7CiB9CiBFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfcnRjKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9zYTExMTEuYyBiL2FyY2gvYXJtL2NvbW1vbi9zYTExMTEuYwppbmRleCBkMGQ2ZTZkLi4xNDc1MDg5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vc2ExMTExLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL3NhMTExMS5jCkBAIC0xMjQ3LDE0ICsxMjQ3LDE0IEBACiBzdHJ1Y3QgYnVzX3R5cGUgc2ExMTExX2J1c190eXBlID0gewogCS5uYW1lCQk9ICJzYTExMTEtcmFiIiwKIAkubWF0Y2gJCT0gc2ExMTExX21hdGNoLAorCS5wcm9iZQkJPSBzYTExMTFfYnVzX3Byb2JlLAorCS5yZW1vdmUJCT0gc2ExMTExX2J1c19yZW1vdmUsCiAJLnN1c3BlbmQJPSBzYTExMTFfYnVzX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBzYTExMTFfYnVzX3Jlc3VtZSwKIH07CiAKIGludCBzYTExMTFfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBzYTExMTFfZHJpdmVyICpkcml2ZXIpCiB7Ci0JZHJpdmVyLT5kcnYucHJvYmUgPSBzYTExMTFfYnVzX3Byb2JlOwotCWRyaXZlci0+ZHJ2LnJlbW92ZSA9IHNhMTExMV9idXNfcmVtb3ZlOwogCWRyaXZlci0+ZHJ2LmJ1cyA9ICZzYTExMTFfYnVzX3R5cGU7CiAJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZHJpdmVyLT5kcnYpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL3Njb29wLmMgYi9hcmNoL2FybS9jb21tb24vc2Nvb3AuYwppbmRleCAwYzNjYmQ5Li5hMmRmZTBiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vc2Nvb3AuYworKysgYi9hcmNoL2FybS9jb21tb24vc2Nvb3AuYwpAQCAtMTMsNiArMTMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zY29vcC5oPgpAQCAtMzMsNyArMzQsNiBAQAogCiAJU0NPT1BfUkVHKHNkZXYtPmJhc2UsU0NPT1BfTUNSKSA9IDB4MDEwMDsgIC8vIDAwCiAJU0NPT1BfUkVHKHNkZXYtPmJhc2UsU0NPT1BfQ0RSKSA9IDB4MDAwMDsgIC8vIDA0Ci0JU0NPT1BfUkVHKHNkZXYtPmJhc2UsU0NPT1BfQ1BSKSA9IDB4MDAwMDsgIC8vIDBDCiAJU0NPT1BfUkVHKHNkZXYtPmJhc2UsU0NPT1BfQ0NSKSA9IDB4MDAwMDsgIC8vIDEwCiAJU0NPT1BfUkVHKHNkZXYtPmJhc2UsU0NPT1BfSU1SKSA9IDB4MDAwMDsgIC8vIDE4CiAJU0NPT1BfUkVHKHNkZXYtPmJhc2UsU0NPT1BfSVJNKSA9IDB4MDBGRjsgIC8vIDE0CkBAIC0xNTQsNiArMTU0LDcgQEAKIAogCVNDT09QX1JFRyhkZXZwdHItPmJhc2UsIFNDT09QX01DUikgPSAweDAxNDA7CiAJcmVzZXRfc2Nvb3AoJnBkZXYtPmRldik7CisJU0NPT1BfUkVHKGRldnB0ci0+YmFzZSwgU0NPT1BfQ1BSKSA9IDB4MDAwMDsKIAlTQ09PUF9SRUcoZGV2cHRyLT5iYXNlLCBTQ09PUF9HUENSKSA9IGluZi0+aW9fZGlyICYgMHhmZmZmOwogCVNDT09QX1JFRyhkZXZwdHItPmJhc2UsIFNDT09QX0dQV1IpID0gaW5mLT5pb19vdXQgJiAweGZmZmY7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9zaGFycHNsX3BtLmMgYi9hcmNoL2FybS9jb21tb24vc2hhcnBzbF9wbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OGQzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb21tb24vc2hhcnBzbF9wbS5jCkBAIC0wLDAgKzEsODM5IEBACisvKgorICogQmF0dGVyeSBhbmQgUG93ZXIgTWFuYWdlbWVudCBjb2RlIGZvciB0aGUgU2hhcnAgU0wtQzd4eCBhbmQgU0wtQ3h4MDAKKyAqIHNlcmllcyBvZiBQREFzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgUmljaGFyZCBQdXJkaWUKKyAqCisgKiBCYXNlZCBvbiBjb2RlIHdyaXR0ZW4gYnkgU2hhcnAgZm9yIDIuNCBrZXJuZWxzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI3VuZGVmIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9hcG1fYmlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYXBtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcG0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3NoYXJwc2wuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvc2hhcnBzbF9wbS5oPgorCisvKgorICogQ29uc3RhbnRzCisgKi8KKyNkZWZpbmUgU0hBUlBTTF9DSEFSR0VfT05fVElNRV9JTlRFUlZBTCAgICAgICAgKG1zZWNzX3RvX2ppZmZpZXMoMSo2MCoxMDAwKSkgIC8qIDEgbWluICovCisjZGVmaW5lIFNIQVJQU0xfQ0hBUkdFX0ZJTklTSF9USU1FICAgICAgICAgICAgIChtc2Vjc190b19qaWZmaWVzKDEwKjYwKjEwMDApKSAvKiAxMCBtaW4gKi8KKyNkZWZpbmUgU0hBUlBTTF9CQVRDSEtfVElNRSAgICAgICAgICAgICAgICAgICAgKG1zZWNzX3RvX2ppZmZpZXMoMTUqMTAwMCkpICAgIC8qIDE1IHNlYyAqLworI2RlZmluZSBTSEFSUFNMX0JBVENIS19USU1FX1NVU1BFTkQgICAgICAgICAgICAoNjAqMTApICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAgbWluICovCisjZGVmaW5lIFNIQVJQU0xfV0FJVF9DT19USU1FICAgICAgICAgICAgICAgICAgIDE1ICAvKiAxNSBzZWMgKi8KKyNkZWZpbmUgU0hBUlBTTF9XQUlUX0RJU0NIQVJHRV9PTiAgICAgICAgICAgICAgMTAwIC8qIDEwMCBtc2VjICovCisjZGVmaW5lIFNIQVJQU0xfQ0hFQ0tfQkFUVEVSWV9XQUlUX1RJTUVfVEVNUCAgIDEwICAvKiAxMCBtc2VjICovCisjZGVmaW5lIFNIQVJQU0xfQ0hFQ0tfQkFUVEVSWV9XQUlUX1RJTUVfVk9MVCAgIDEwICAvKiAxMCBtc2VjICovCisjZGVmaW5lIFNIQVJQU0xfQ0hFQ0tfQkFUVEVSWV9XQUlUX1RJTUVfQUNJTiAgIDEwICAvKiAxMCBtc2VjICovCisjZGVmaW5lIFNIQVJQU0xfQ0hBUkdFX1dBSVRfVElNRSAgICAgICAgICAgICAgIDE1ICAvKiAxNSBtc2VjICovCisjZGVmaW5lIFNIQVJQU0xfQ0hBUkdFX0NPX0NIRUNLX1RJTUUgICAgICAgICAgIDUgICAvKiA1IG1zZWMgKi8KKyNkZWZpbmUgU0hBUlBTTF9DSEFSR0VfUkVUUllfQ05UICAgICAgICAgICAgICAgMSAgIC8qIGVxdi4gMTAgbWluICovCisKKyNkZWZpbmUgU0hBUlBTTF9DSEFSR0VfT05fVk9MVCAgICAgICAgIDB4OTkgIC8qIDIuOVYgKi8KKyNkZWZpbmUgU0hBUlBTTF9DSEFSR0VfT05fVEVNUCAgICAgICAgIDB4ZTAgIC8qIDIuOVYgKi8KKyNkZWZpbmUgU0hBUlBTTF9DSEFSR0VfT05fQUNJTl9ISUdIICAgIDB4OWIgIC8qIDZWICovCisjZGVmaW5lIFNIQVJQU0xfQ0hBUkdFX09OX0FDSU5fTE9XICAgICAweDM0ICAvKiAyViAqLworI2RlZmluZSBTSEFSUFNMX0ZBVEFMX0FDSU5fVk9MVCAgICAgICAgMTgyICAgLyogMy40NVYgKi8KKyNkZWZpbmUgU0hBUlBTTF9GQVRBTF9OT0FDSU5fVk9MVCAgICAgIDE3MCAgIC8qIDMuNDBWICovCisKKy8qCisgKiBQcm90b3R5cGVzCisgKi8KK3N0YXRpYyBpbnQgc2hhcnBzbF9vZmZfY2hhcmdlX2JhdHRlcnkodm9pZCk7CitzdGF0aWMgaW50IHNoYXJwc2xfY2hlY2tfYmF0dGVyeV90ZW1wKHZvaWQpOworc3RhdGljIGludCBzaGFycHNsX2NoZWNrX2JhdHRlcnlfdm9sdGFnZSh2b2lkKTsKK3N0YXRpYyBpbnQgc2hhcnBzbF9hY19jaGVjayh2b2lkKTsKK3N0YXRpYyBpbnQgc2hhcnBzbF9mYXRhbF9jaGVjayh2b2lkKTsKK3N0YXRpYyBpbnQgc2hhcnBzbF9hdmVyYWdlX3ZhbHVlKGludCBhZCk7CitzdGF0aWMgdm9pZCBzaGFycHNsX2F2ZXJhZ2VfY2xlYXIodm9pZCk7CitzdGF0aWMgdm9pZCBzaGFycHNsX2NoYXJnZV90b2dnbGUodm9pZCAqcHJpdmF0ZV8pOworc3RhdGljIHZvaWQgc2hhcnBzbF9iYXR0ZXJ5X3RocmVhZCh2b2lkICpwcml2YXRlXyk7CisKKworLyoKKyAqIFZhcmlhYmxlcworICovCitzdHJ1Y3Qgc2hhcnBzbF9wbV9zdGF0dXMgc2hhcnBzbF9wbTsKK0RFQ0xBUkVfV09SSyh0b2dnbGVfY2hhcmdlciwgc2hhcnBzbF9jaGFyZ2VfdG9nZ2xlLCBOVUxMKTsKK0RFQ0xBUkVfV09SSyhzaGFycHNsX2JhdCwgc2hhcnBzbF9iYXR0ZXJ5X3RocmVhZCwgTlVMTCk7CisKKworc3RhdGljIGludCBnZXRfcGVyY2VudGFnZShpbnQgdm9sdGFnZSkKK3sKKwlpbnQgaSA9IHNoYXJwc2xfcG0ubWFjaGluZm8tPmJhdF9sZXZlbHMgLSAxOworCXN0cnVjdCBiYXR0ZXJ5X3RocmVzaCAqdGhyZXNoOworCisJaWYgKHNoYXJwc2xfcG0uY2hhcmdlX21vZGUgPT0gQ0hSR19PTikKKwkJdGhyZXNoPXNoYXJwc2xfcG0ubWFjaGluZm8tPmJhdF9sZXZlbHNfYWNpbjsKKwllbHNlCisJCXRocmVzaD1zaGFycHNsX3BtLm1hY2hpbmZvLT5iYXRfbGV2ZWxzX25vYWM7CisKKwl3aGlsZSAoaSA+IDAgJiYgKHZvbHRhZ2UgPiB0aHJlc2hbaV0udm9sdGFnZSkpCisJCWktLTsKKworCXJldHVybiB0aHJlc2hbaV0ucGVyY2VudGFnZTsKK30KKworc3RhdGljIGludCBnZXRfYXBtX3N0YXR1cyhpbnQgdm9sdGFnZSkKK3sKKwlpbnQgbG93X3RocmVzaCwgaGlnaF90aHJlc2g7CisKKwlpZiAoc2hhcnBzbF9wbS5jaGFyZ2VfbW9kZSA9PSBDSFJHX09OKSB7CisJCWhpZ2hfdGhyZXNoID0gc2hhcnBzbF9wbS5tYWNoaW5mby0+c3RhdHVzX2hpZ2hfYWNpbjsKKwkJbG93X3RocmVzaCA9IHNoYXJwc2xfcG0ubWFjaGluZm8tPnN0YXR1c19sb3dfYWNpbjsKKwl9IGVsc2UgeworCQloaWdoX3RocmVzaCA9IHNoYXJwc2xfcG0ubWFjaGluZm8tPnN0YXR1c19oaWdoX25vYWM7CisJCWxvd190aHJlc2ggPSBzaGFycHNsX3BtLm1hY2hpbmZvLT5zdGF0dXNfbG93X25vYWM7CisJfQorCisJaWYgKHZvbHRhZ2UgPj0gaGlnaF90aHJlc2gpCisJCXJldHVybiBBUE1fQkFUVEVSWV9TVEFUVVNfSElHSDsKKwlpZiAodm9sdGFnZSA+PSBsb3dfdGhyZXNoKQorCQlyZXR1cm4gQVBNX0JBVFRFUllfU1RBVFVTX0xPVzsKKwlyZXR1cm4gQVBNX0JBVFRFUllfU1RBVFVTX0NSSVRJQ0FMOworfQorCit2b2lkIHNoYXJwc2xfYmF0dGVyeV9raWNrKHZvaWQpCit7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZzaGFycHNsX2JhdCwgbXNlY3NfdG9famlmZmllcygxMjUpKTsKK30KK0VYUE9SVF9TWU1CT0woc2hhcnBzbF9iYXR0ZXJ5X2tpY2spOworCisKK3N0YXRpYyB2b2lkIHNoYXJwc2xfYmF0dGVyeV90aHJlYWQodm9pZCAqcHJpdmF0ZV8pCit7CisJaW50IHZvbHRhZ2UsIHBlcmNlbnQsIGFwbV9zdGF0dXMsIGkgPSAwOworCisJaWYgKCFzaGFycHNsX3BtLm1hY2hpbmZvKQorCQlyZXR1cm47CisKKwlzaGFycHNsX3BtLmJhdHRzdGF0LmFjX3N0YXR1cyA9IChzaGFycHNsX3BtLm1hY2hpbmZvLT5yZWFkX2RldmRhdGEoU0hBUlBTTF9TVEFUVVNfQUNJTikgPyBBUE1fQUNfT05MSU5FIDogQVBNX0FDX09GRkxJTkUpOworCisJLyogQ29yZ2kgY2Fubm90IGNvbmZpcm0gd2hlbiBiYXR0ZXJ5IGZ1bGx5IGNoYXJnZWQgc28gcGVyaW9kaWNhbGx5IGtpY2shICovCisJaWYgKG1hY2hpbmVfaXNfY29yZ2koKSAmJiAoc2hhcnBzbF9wbS5jaGFyZ2VfbW9kZSA9PSBDSFJHX09OKQorCQkJJiYgdGltZV9hZnRlcihqaWZmaWVzLCBzaGFycHNsX3BtLmNoYXJnZV9zdGFydF90aW1lICsgIFNIQVJQU0xfQ0hBUkdFX09OX1RJTUVfSU5URVJWQUwpKQorCQlzY2hlZHVsZV93b3JrKCZ0b2dnbGVfY2hhcmdlcik7CisKKwl3aGlsZSgxKSB7CisJCXZvbHRhZ2UgPSBzaGFycHNsX3BtLm1hY2hpbmZvLT5yZWFkX2RldmRhdGEoU0hBUlBTTF9CQVRUX1ZPTFQpOworCisJCWlmICh2b2x0YWdlID4gMCkgYnJlYWs7CisJCWlmIChpKysgPiA1KSB7CisJCQl2b2x0YWdlID0gc2hhcnBzbF9wbS5tYWNoaW5mby0+YmF0X2xldmVsc19ub2FjWzBdLnZvbHRhZ2U7CisJCQlkZXZfd2FybihzaGFycHNsX3BtLmRldiwgIldhcm5pbmc6IENhbm5vdCByZWFkIG1haW4gYmF0dGVyeSFcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwl2b2x0YWdlID0gc2hhcnBzbF9hdmVyYWdlX3ZhbHVlKHZvbHRhZ2UpOworCWFwbV9zdGF0dXMgPSBnZXRfYXBtX3N0YXR1cyh2b2x0YWdlKTsKKwlwZXJjZW50ID0gZ2V0X3BlcmNlbnRhZ2Uodm9sdGFnZSk7CisKKwkvKiBBdCBsb3cgYmF0dGVyeSB2b2x0YWdlcywgdGhlIHZvbHRhZ2UgaGFzIGEgdGVuZGVuY3kgdG8gc3RhcnQKKyAgICAgICAgICAgY3JlZXBpbmcgYmFjayB1cCBzbyB3ZSB0cnkgdG8gYXZvaWQgdGhpcyBoZXJlICovCisJaWYgKChzaGFycHNsX3BtLmJhdHRzdGF0LmFjX3N0YXR1cyA9PSBBUE1fQUNfT05MSU5FKSB8fCAoYXBtX3N0YXR1cyA9PSBBUE1fQkFUVEVSWV9TVEFUVVNfSElHSCkgfHwgIHBlcmNlbnQgPD0gc2hhcnBzbF9wbS5iYXR0c3RhdC5tYWluYmF0X3BlcmNlbnQpIHsKKwkJc2hhcnBzbF9wbS5iYXR0c3RhdC5tYWluYmF0X3ZvbHRhZ2UgPSB2b2x0YWdlOworCQlzaGFycHNsX3BtLmJhdHRzdGF0Lm1haW5iYXRfc3RhdHVzID0gYXBtX3N0YXR1czsKKwkJc2hhcnBzbF9wbS5iYXR0c3RhdC5tYWluYmF0X3BlcmNlbnQgPSBwZXJjZW50OworCX0KKworCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJCYXR0ZXJ5OiB2b2x0YWdlOiAlZCwgc3RhdHVzOiAlZCwgcGVyY2VudGFnZTogJWQsIHRpbWU6ICVkXG4iLCB2b2x0YWdlLAorCQkJc2hhcnBzbF9wbS5iYXR0c3RhdC5tYWluYmF0X3N0YXR1cywgc2hhcnBzbF9wbS5iYXR0c3RhdC5tYWluYmF0X3BlcmNlbnQsIGppZmZpZXMpOworCisJLyogSWYgYmF0dGVyeSBpcyBsb3cuIGxpbWl0IGJhY2tsaWdodCBpbnRlbnNpdHkgdG8gc2F2ZSBwb3dlci4gKi8KKwlpZiAoKHNoYXJwc2xfcG0uYmF0dHN0YXQuYWNfc3RhdHVzICE9IEFQTV9BQ19PTkxJTkUpCisJCQkmJiAoKHNoYXJwc2xfcG0uYmF0dHN0YXQubWFpbmJhdF9zdGF0dXMgPT0gQVBNX0JBVFRFUllfU1RBVFVTX0xPVykgfHwKKwkJCShzaGFycHNsX3BtLmJhdHRzdGF0Lm1haW5iYXRfc3RhdHVzID09IEFQTV9CQVRURVJZX1NUQVRVU19DUklUSUNBTCkpKSB7CisJCWlmICghKHNoYXJwc2xfcG0uZmxhZ3MgJiBTSEFSUFNMX0JMX0xJTUlUKSkgeworCQkJY29yZ2libF9saW1pdF9pbnRlbnNpdHkoMSk7CisJCQlzaGFycHNsX3BtLmZsYWdzIHw9IFNIQVJQU0xfQkxfTElNSVQ7CisJCX0KKwl9IGVsc2UgaWYgKHNoYXJwc2xfcG0uZmxhZ3MgJiBTSEFSUFNMX0JMX0xJTUlUKSB7CisJCWNvcmdpYmxfbGltaXRfaW50ZW5zaXR5KDApOworCQlzaGFycHNsX3BtLmZsYWdzICY9IH5TSEFSUFNMX0JMX0xJTUlUOworCX0KKworCS8qIFN1c3BlbmQgaWYgY3JpdGljYWwgYmF0dGVyeSBsZXZlbCAqLworCWlmICgoc2hhcnBzbF9wbS5iYXR0c3RhdC5hY19zdGF0dXMgIT0gQVBNX0FDX09OTElORSkKKwkJCSYmIChzaGFycHNsX3BtLmJhdHRzdGF0Lm1haW5iYXRfc3RhdHVzID09IEFQTV9CQVRURVJZX1NUQVRVU19DUklUSUNBTCkKKwkJCSYmICEoc2hhcnBzbF9wbS5mbGFncyAmIFNIQVJQU0xfQVBNX1FVRVVFRCkpIHsKKwkJc2hhcnBzbF9wbS5mbGFncyB8PSBTSEFSUFNMX0FQTV9RVUVVRUQ7CisJCWRldl9lcnIoc2hhcnBzbF9wbS5kZXYsICJGYXRhbCBPZmZcbiIpOworCQlhcG1fcXVldWVfZXZlbnQoQVBNX0NSSVRJQ0FMX1NVU1BFTkQpOworCX0KKworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmc2hhcnBzbF9iYXQsIFNIQVJQU0xfQkFUQ0hLX1RJTUUpOworfQorCit2b2lkIHNoYXJwc2xfcG1fbGVkKGludCB2YWwpCit7CisJaWYgKHZhbCA9PSBTSEFSUFNMX0xFRF9FUlJPUikgeworCQlkZXZfZXJyKHNoYXJwc2xfcG0uZGV2LCAiQ2hhcmdpbmcgRXJyb3IhXG4iKTsKKwl9IGVsc2UgaWYgKHZhbCA9PSBTSEFSUFNMX0xFRF9PTikgeworCQlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiQ2hhcmdlIExFRCBPblxuIik7CisKKwl9IGVsc2UgeworCQlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiQ2hhcmdlIExFRCBPZmZcbiIpOworCisJfQorfQorCitzdGF0aWMgdm9pZCBzaGFycHNsX2NoYXJnZV9vbih2b2lkKQoreworCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJUdXJuaW5nIENoYXJnZXIgT25cbiIpOworCisJc2hhcnBzbF9wbS5mdWxsX2NvdW50ID0gMDsKKwlzaGFycHNsX3BtLmNoYXJnZV9tb2RlID0gQ0hSR19PTjsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnRvZ2dsZV9jaGFyZ2VyLCBtc2Vjc190b19qaWZmaWVzKDI1MCkpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmc2hhcnBzbF9iYXQsIG1zZWNzX3RvX2ppZmZpZXMoNTAwKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNoYXJwc2xfY2hhcmdlX29mZih2b2lkKQoreworCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJUdXJuaW5nIENoYXJnZXIgT2ZmXG4iKTsKKworCXNoYXJwc2xfcG0ubWFjaGluZm8tPmNoYXJnZSgwKTsKKwlzaGFycHNsX3BtX2xlZChTSEFSUFNMX0xFRF9PRkYpOworCXNoYXJwc2xfcG0uY2hhcmdlX21vZGUgPSBDSFJHX09GRjsKKworCXNjaGVkdWxlX3dvcmsoJnNoYXJwc2xfYmF0KTsKK30KKworc3RhdGljIHZvaWQgc2hhcnBzbF9jaGFyZ2VfZXJyb3Iodm9pZCkKK3sKKwlzaGFycHNsX3BtX2xlZChTSEFSUFNMX0xFRF9FUlJPUik7CisJc2hhcnBzbF9wbS5tYWNoaW5mby0+Y2hhcmdlKDApOworCXNoYXJwc2xfcG0uY2hhcmdlX21vZGUgPSBDSFJHX0VSUk9SOworfQorCitzdGF0aWMgdm9pZCBzaGFycHNsX2NoYXJnZV90b2dnbGUodm9pZCAqcHJpdmF0ZV8pCit7CisJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIlRvb2dsaW5nIENoYXJnZXIgYXQgdGltZTogJWx4XG4iLCBqaWZmaWVzKTsKKworCWlmICghc2hhcnBzbF9wbS5tYWNoaW5mby0+cmVhZF9kZXZkYXRhKFNIQVJQU0xfU1RBVFVTX0FDSU4pKSB7CisJCXNoYXJwc2xfY2hhcmdlX29mZigpOworCQlyZXR1cm47CisJfSBlbHNlIGlmICgoc2hhcnBzbF9jaGVja19iYXR0ZXJ5X3RlbXAoKSA8IDApIHx8IChzaGFycHNsX2FjX2NoZWNrKCkgPCAwKSkgeworCQlzaGFycHNsX2NoYXJnZV9lcnJvcigpOworCQlyZXR1cm47CisJfQorCisJc2hhcnBzbF9wbV9sZWQoU0hBUlBTTF9MRURfT04pOworCXNoYXJwc2xfcG0ubWFjaGluZm8tPmNoYXJnZSgwKTsKKwltZGVsYXkoU0hBUlBTTF9DSEFSR0VfV0FJVF9USU1FKTsKKwlzaGFycHNsX3BtLm1hY2hpbmZvLT5jaGFyZ2UoMSk7CisKKwlzaGFycHNsX3BtLmNoYXJnZV9zdGFydF90aW1lID0gamlmZmllczsKK30KKworc3RhdGljIHZvaWQgc2hhcnBzbF9hY190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJaW50IGFjaW4gPSBzaGFycHNsX3BtLm1hY2hpbmZvLT5yZWFkX2RldmRhdGEoU0hBUlBTTF9TVEFUVVNfQUNJTik7CisKKwlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiQUMgU3RhdHVzOiAlZFxuIixhY2luKTsKKworCXNoYXJwc2xfYXZlcmFnZV9jbGVhcigpOworCWlmIChhY2luICYmIChzaGFycHNsX3BtLmNoYXJnZV9tb2RlICE9IENIUkdfT04pKQorCQlzaGFycHNsX2NoYXJnZV9vbigpOworCWVsc2UgaWYgKHNoYXJwc2xfcG0uY2hhcmdlX21vZGUgPT0gQ0hSR19PTikKKwkJc2hhcnBzbF9jaGFyZ2Vfb2ZmKCk7CisKKwlzY2hlZHVsZV93b3JrKCZzaGFycHNsX2JhdCk7Cit9CisKKworaXJxcmV0dXJuX3Qgc2hhcnBzbF9hY19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCit7CisJLyogRGVsYXkgdGhlIGV2ZW50IHNsaWdodGx5IHRvIGRlYm91bmNlICovCisJLyogTXVzdCBiZSBhIHNtYWxsZXIgZGVsYXkgdGhhbiB0aGUgY2hyZ19mdWxsX2lzciBiZWxvdyAqLworCW1vZF90aW1lcigmc2hhcnBzbF9wbS5hY190aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjUwKSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHNoYXJwc2xfY2hyZ19mdWxsX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiQ2hhcmdlIEZ1bGwgYXQgdGltZTogJWx4XG4iLCBqaWZmaWVzKTsKKworCXNoYXJwc2xfcG0uZnVsbF9jb3VudCsrOworCisJaWYgKCFzaGFycHNsX3BtLm1hY2hpbmZvLT5yZWFkX2RldmRhdGEoU0hBUlBTTF9TVEFUVVNfQUNJTikpIHsKKwkJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIkNoYXJnZSBGdWxsOiBBQyByZW1vdmVkIC0gc3RvcCBjaGFyZ2luZyFcbiIpOworCQlpZiAoc2hhcnBzbF9wbS5jaGFyZ2VfbW9kZSA9PSBDSFJHX09OKQorCQkJc2hhcnBzbF9jaGFyZ2Vfb2ZmKCk7CisJfSBlbHNlIGlmIChzaGFycHNsX3BtLmZ1bGxfY291bnQgPCAyKSB7CisJCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJDaGFyZ2UgRnVsbDogQ291bnQgdG9vIGxvd1xuIik7CisJCXNjaGVkdWxlX3dvcmsoJnRvZ2dsZV9jaGFyZ2VyKTsKKwl9IGVsc2UgaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc2hhcnBzbF9wbS5jaGFyZ2Vfc3RhcnRfdGltZSArIFNIQVJQU0xfQ0hBUkdFX0ZJTklTSF9USU1FKSkgeworCQlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiQ2hhcmdlIEZ1bGw6IEludGVycnVwdCBnZW5lcmF0ZWQgdG9vIHNsb3dseSAtIHJldHJ5LlxuIik7CisJCXNjaGVkdWxlX3dvcmsoJnRvZ2dsZV9jaGFyZ2VyKTsKKwl9IGVsc2UgeworCQlzaGFycHNsX2NoYXJnZV9vZmYoKTsKKwkJc2hhcnBzbF9wbS5jaGFyZ2VfbW9kZSA9IENIUkdfRE9ORTsKKwkJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIkNoYXJnZSBGdWxsOiBDaGFyZ2luZyBGaW5pc2hlZFxuIik7CisJfQorfQorCisvKiBDaGFyZ2luZyBGaW5pc2hlZCBJbnRlcnJ1cHQgKE5vdCBwcmVzZW50IG9uIENvcmdpKSAqLworLyogQ2FuIHRyaWdnZXIgYXQgdGhlIHNhbWUgdGltZSBhcyBhbiBBQyBzdGF1cyBjaGFuZ2Ugc28KKyAgIGRlbGF5IHVudGlsIGFmdGVyIHRoYXQgaGFzIGJlZW4gcHJvY2Vzc2VkICovCitpcnFyZXR1cm5fdCBzaGFycHNsX2NocmdfZnVsbF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCit7CisJaWYgKHNoYXJwc2xfcG0uZmxhZ3MgJiBTSEFSUFNMX1NVU1BFTkRFRCkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJLyogZGVsYXkgdW50aWwgYWZ0ZXIgYW55IGFjIGludGVycnVwdCAqLworCW1vZF90aW1lcigmc2hhcnBzbF9wbS5jaHJnX2Z1bGxfdGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwMCkpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpcnFyZXR1cm5fdCBzaGFycHNsX2ZhdGFsX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKwlpbnQgaXNfZmF0YWwgPSAwOworCisJaWYgKCFzaGFycHNsX3BtLm1hY2hpbmZvLT5yZWFkX2RldmRhdGEoU0hBUlBTTF9TVEFUVVNfTE9DSykpIHsKKwkJZGV2X2VycihzaGFycHNsX3BtLmRldiwgIkJhdHRlcnkgbm93IFVubG9ja2VkISBTdXNwZW5kaW5nLlxuIik7CisJCWlzX2ZhdGFsID0gMTsKKwl9CisKKwlpZiAoIXNoYXJwc2xfcG0ubWFjaGluZm8tPnJlYWRfZGV2ZGF0YShTSEFSUFNMX1NUQVRVU19GQVRBTCkpIHsKKwkJZGV2X2VycihzaGFycHNsX3BtLmRldiwgIkZhdGFsIEJhdHQgRXJyb3IhIFN1c3BlbmRpbmcuXG4iKTsKKwkJaXNfZmF0YWwgPSAxOworCX0KKworCWlmICghKHNoYXJwc2xfcG0uZmxhZ3MgJiBTSEFSUFNMX0FQTV9RVUVVRUQpICYmIGlzX2ZhdGFsKSB7CisJCXNoYXJwc2xfcG0uZmxhZ3MgfD0gU0hBUlBTTF9BUE1fUVVFVUVEOworCQlhcG1fcXVldWVfZXZlbnQoQVBNX0NSSVRJQ0FMX1NVU1BFTkQpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIE1haW50YWluIGFuIGF2ZXJhZ2Ugb2YgdGhlIGxhc3QgMTAgcmVhZGluZ3MKKyAqLworI2RlZmluZSBTSEFSUFNMX0NOVl9WQUxVRV9OVU0gICAgMTAKK3N0YXRpYyBpbnQgc2hhcnBzbF9hZF9pbmRleDsKKworc3RhdGljIHZvaWQgc2hhcnBzbF9hdmVyYWdlX2NsZWFyKHZvaWQpCit7CisJc2hhcnBzbF9hZF9pbmRleCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgc2hhcnBzbF9hdmVyYWdlX3ZhbHVlKGludCBhZCkKK3sKKwlpbnQgaSwgYWRfdmFsID0gMDsKKwlzdGF0aWMgaW50IHNoYXJwc2xfYWRbU0hBUlBTTF9DTlZfVkFMVUVfTlVNKzFdOworCisJaWYgKHNoYXJwc2xfcG0uYmF0dHN0YXQubWFpbmJhdF9zdGF0dXMgIT0gQVBNX0JBVFRFUllfU1RBVFVTX0hJR0gpIHsKKwkJc2hhcnBzbF9hZF9pbmRleCA9IDA7CisJCXJldHVybiBhZDsKKwl9CisKKwlzaGFycHNsX2FkW3NoYXJwc2xfYWRfaW5kZXhdID0gYWQ7CisJc2hhcnBzbF9hZF9pbmRleCsrOworCWlmIChzaGFycHNsX2FkX2luZGV4ID49IFNIQVJQU0xfQ05WX1ZBTFVFX05VTSkgeworCQlmb3IgKGk9MDsgaSA8IChTSEFSUFNMX0NOVl9WQUxVRV9OVU0tMSk7IGkrKykKKwkJCXNoYXJwc2xfYWRbaV0gPSBzaGFycHNsX2FkW2krMV07CisJCXNoYXJwc2xfYWRfaW5kZXggPSBTSEFSUFNMX0NOVl9WQUxVRV9OVU0gLSAxOworCX0KKwlmb3IgKGk9MDsgaSA8IHNoYXJwc2xfYWRfaW5kZXg7IGkrKykKKwkJYWRfdmFsICs9IHNoYXJwc2xfYWRbaV07CisKKwlyZXR1cm4gKGFkX3ZhbCAvIHNoYXJwc2xfYWRfaW5kZXgpOworfQorCisvKgorICogVGFrZSBhbiBhcnJheSBvZiA1IGludGVnZXJzLCByZW1vdmUgdGhlIG1heGltdW0gYW5kIG1pbmltdW0gdmFsdWVzCisgKiBhbmQgcmV0dXJuIHRoZSBhdmVyYWdlLgorICovCitzdGF0aWMgaW50IGdldF9zZWxlY3RfdmFsKGludCAqdmFsKQoreworCWludCBpLCBqLCBrLCB0ZW1wLCBzdW0gPSAwOworCisJLyogRmluZCBNQVggdmFsICovCisJdGVtcCA9IHZhbFswXTsKKwlqPTA7CisJZm9yIChpPTE7IGk8NTsgaSsrKSB7CisJCWlmICh0ZW1wIDwgdmFsW2ldKSB7CisJCQl0ZW1wID0gdmFsW2ldOworCQkJaiA9IGk7CisJCX0KKwl9CisKKwkvKiBGaW5kIE1JTiB2YWwgKi8KKwl0ZW1wID0gdmFsWzRdOworCWs9NDsKKwlmb3IgKGk9MzsgaT49MDsgaS0tKSB7CisJCWlmICh0ZW1wID4gdmFsW2ldKSB7CisJCQl0ZW1wID0gdmFsW2ldOworCQkJayA9IGk7CisJCX0KKwl9CisKKwlmb3IgKGk9MDsgaTw1OyBpKyspCisJCWlmIChpICE9IGogJiYgaSAhPSBrICkKKwkJCXN1bSArPSB2YWxbaV07CisKKwlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiQXZlcmFnZTogJWQgZnJvbSB2YWx1ZXM6ICVkLCAlZCwgJWQsICVkLCAlZFxuIiwgc3VtLzMsIHZhbFswXSwgdmFsWzFdLCB2YWxbMl0sIHZhbFszXSwgdmFsWzRdKTsKKworCXJldHVybiAoc3VtLzMpOworfQorCitzdGF0aWMgaW50IHNoYXJwc2xfY2hlY2tfYmF0dGVyeV90ZW1wKHZvaWQpCit7CisJaW50IHZhbCwgaSwgYnVmZls1XTsKKworCS8qIENoZWNrIGJhdHRlcnkgdGVtcGVyYXR1cmUgKi8KKwlmb3IgKGk9MDsgaTw1OyBpKyspIHsKKwkJbWRlbGF5KFNIQVJQU0xfQ0hFQ0tfQkFUVEVSWV9XQUlUX1RJTUVfVEVNUCk7CisJCXNoYXJwc2xfcG0ubWFjaGluZm8tPm1lYXN1cmVfdGVtcCgxKTsKKwkJbWRlbGF5KFNIQVJQU0xfQ0hFQ0tfQkFUVEVSWV9XQUlUX1RJTUVfVEVNUCk7CisJCWJ1ZmZbaV0gPSBzaGFycHNsX3BtLm1hY2hpbmZvLT5yZWFkX2RldmRhdGEoU0hBUlBTTF9CQVRUX1RFTVApOworCQlzaGFycHNsX3BtLm1hY2hpbmZvLT5tZWFzdXJlX3RlbXAoMCk7CisJfQorCisJdmFsID0gZ2V0X3NlbGVjdF92YWwoYnVmZik7CisKKwlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiVGVtcGVyYXR1cmU6ICVkXG4iLCB2YWwpOworCWlmICh2YWwgPiBTSEFSUFNMX0NIQVJHRV9PTl9URU1QKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaGFycHNsX2NoZWNrX2JhdHRlcnlfdm9sdGFnZSh2b2lkKQoreworCWludCB2YWwsIGksIGJ1ZmZbNV07CisKKwkvKiBkaXNhYmxlIGNoYXJnZSwgZW5hYmxlIGRpc2NoYXJnZSAqLworCXNoYXJwc2xfcG0ubWFjaGluZm8tPmNoYXJnZSgwKTsKKwlzaGFycHNsX3BtLm1hY2hpbmZvLT5kaXNjaGFyZ2UoMSk7CisJbWRlbGF5KFNIQVJQU0xfV0FJVF9ESVNDSEFSR0VfT04pOworCisJaWYgKHNoYXJwc2xfcG0ubWFjaGluZm8tPmRpc2NoYXJnZTEpCisJCXNoYXJwc2xfcG0ubWFjaGluZm8tPmRpc2NoYXJnZTEoMSk7CisKKwkvKiBDaGVjayBiYXR0ZXJ5IHZvbHRhZ2UgKi8KKwlmb3IgKGk9MDsgaTw1OyBpKyspIHsKKwkJYnVmZltpXSA9IHNoYXJwc2xfcG0ubWFjaGluZm8tPnJlYWRfZGV2ZGF0YShTSEFSUFNMX0JBVFRfVk9MVCk7CisJCW1kZWxheShTSEFSUFNMX0NIRUNLX0JBVFRFUllfV0FJVF9USU1FX1ZPTFQpOworCX0KKworCWlmIChzaGFycHNsX3BtLm1hY2hpbmZvLT5kaXNjaGFyZ2UxKQorCQlzaGFycHNsX3BtLm1hY2hpbmZvLT5kaXNjaGFyZ2UxKDApOworCisJc2hhcnBzbF9wbS5tYWNoaW5mby0+ZGlzY2hhcmdlKDApOworCisJdmFsID0gZ2V0X3NlbGVjdF92YWwoYnVmZik7CisJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIkJhdHRlcnkgVm9sdGFnZTogJWRcbiIsIHZhbCk7CisKKwlpZiAodmFsIDwgU0hBUlBTTF9DSEFSR0VfT05fVk9MVCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hhcnBzbF9hY19jaGVjayh2b2lkKQoreworCWludCB0ZW1wLCBpLCBidWZmWzVdOworCisJZm9yIChpPTA7IGk8NTsgaSsrKSB7CisJCWJ1ZmZbaV0gPSBzaGFycHNsX3BtLm1hY2hpbmZvLT5yZWFkX2RldmRhdGEoU0hBUlBTTF9BQ0lOX1ZPTFQpOworCQltZGVsYXkoU0hBUlBTTF9DSEVDS19CQVRURVJZX1dBSVRfVElNRV9BQ0lOKTsKKwl9CisKKwl0ZW1wID0gZ2V0X3NlbGVjdF92YWwoYnVmZik7CisJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIkFDIFZvbHRhZ2U6ICVkXG4iLHRlbXApOworCisJaWYgKCh0ZW1wID4gU0hBUlBTTF9DSEFSR0VfT05fQUNJTl9ISUdIKSB8fCAodGVtcCA8IFNIQVJQU0xfQ0hBUkdFX09OX0FDSU5fTE9XKSkgeworCQlkZXZfZXJyKHNoYXJwc2xfcG0uZGV2LCAiRXJyb3I6IEFDIGNoZWNrIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgc2hhcnBzbF9wbV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzaGFycHNsX3BtLmZsYWdzIHw9IFNIQVJQU0xfU1VTUEVOREVEOworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwlpZiAoc2hhcnBzbF9wbS5jaGFyZ2VfbW9kZSA9PSBDSFJHX09OKQorCQlzaGFycHNsX3BtLmZsYWdzIHw9IFNIQVJQU0xfRE9fT0ZGTElORV9DSFJHOworCWVsc2UKKwkJc2hhcnBzbF9wbS5mbGFncyAmPSB+U0hBUlBTTF9ET19PRkZMSU5FX0NIUkc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaGFycHNsX3BtX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCS8qIENsZWFyIHRoZSByZXNldCBzb3VyY2UgaW5kaWNhdG9ycyBhcyB0aGV5IGJyZWFrIHRoZSBib290bG9hZGVyIHVwb24gcmVib290ICovCisJUkNTUiA9IDB4MGY7CisJc2hhcnBzbF9hdmVyYWdlX2NsZWFyKCk7CisJc2hhcnBzbF9wbS5mbGFncyAmPSB+U0hBUlBTTF9BUE1fUVVFVUVEOworCXNoYXJwc2xfcG0uZmxhZ3MgJj0gflNIQVJQU0xfU1VTUEVOREVEOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvcmdpX2dvdG9fc2xlZXAodW5zaWduZWQgbG9uZyBhbGFybV90aW1lLCB1bnNpZ25lZCBpbnQgYWxhcm1fZW5hYmxlLCBzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCit7CisJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIlRpbWUgaXM6ICUwOHhcbiIsUkNOUik7CisKKwlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiT2ZmbGluZSBDaGFyZ2UgQWN0aXZhdGUgPSAlZFxuIixzaGFycHNsX3BtLmZsYWdzICYgU0hBUlBTTF9ET19PRkZMSU5FX0NIUkcpOworCS8qIG5vdCBjaGFyZ2luZyBhbmQgQUMtSU4hICovCisKKwlpZiAoKHNoYXJwc2xfcG0uZmxhZ3MgJiBTSEFSUFNMX0RPX09GRkxJTkVfQ0hSRykgJiYgKHNoYXJwc2xfcG0ubWFjaGluZm8tPnJlYWRfZGV2ZGF0YShTSEFSUFNMX1NUQVRVU19BQ0lOKSkpIHsKKwkJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIkFjdGl2YXRpbmcgT2ZmbGluZSBDaGFyZ2VyLi4uXG4iKTsKKwkJc2hhcnBzbF9wbS5jaGFyZ2VfbW9kZSA9IENIUkdfT0ZGOworCQlzaGFycHNsX3BtLmZsYWdzICY9IH5TSEFSUFNMX0RPX09GRkxJTkVfQ0hSRzsKKwkJc2hhcnBzbF9vZmZfY2hhcmdlX2JhdHRlcnkoKTsKKwl9CisKKwlzaGFycHNsX3BtLm1hY2hpbmZvLT5wcmVzdXNwZW5kKCk7CisKKwlQRURSID0gMHhmZmZmZmZmZjsgLyogY2xlYXIgaXQgKi8KKworCXNoYXJwc2xfcG0uZmxhZ3MgJj0gflNIQVJQU0xfQUxBUk1fQUNUSVZFOworCWlmICgoc2hhcnBzbF9wbS5jaGFyZ2VfbW9kZSA9PSBDSFJHX09OKSAmJiAoKGFsYXJtX2VuYWJsZSAmJiAoKGFsYXJtX3RpbWUgLSBSQ05SKSA+IChTSEFSUFNMX0JBVENIS19USU1FX1NVU1BFTkQgKyAzMCkpKSB8fCAhYWxhcm1fZW5hYmxlKSkgeworCQlSVFNSICY9IFJUU1JfQUxFOworCQlSVEFSID0gUkNOUiArIFNIQVJQU0xfQkFUQ0hLX1RJTUVfU1VTUEVORDsKKwkJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIkNoYXJnaW5nIGFsYXJtIGF0OiAlMDh4XG4iLFJUQVIpOworCQlzaGFycHNsX3BtLmZsYWdzIHw9IFNIQVJQU0xfQUxBUk1fQUNUSVZFOworCX0gZWxzZSBpZiAoYWxhcm1fZW5hYmxlKSB7CisJCVJUU1IgJj0gUlRTUl9BTEU7CisJCVJUQVIgPSBhbGFybV90aW1lOworCQlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiVXNlciBhbGFybSBhdDogJTA4eFxuIixSVEFSKTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiTm8gYWxhcm1zIHNldC5cbiIpOworCX0KKworCXB4YV9wbV9lbnRlcihzdGF0ZSk7CisKKwlzaGFycHNsX3BtLm1hY2hpbmZvLT5wb3N0c3VzcGVuZCgpOworCisJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIkNvcmdpIHdva2VuIHVwIGZyb20gc3VzcGVuZDogJTA4eFxuIixQRURSKTsKK30KKworc3RhdGljIGludCBjb3JnaV9lbnRlcl9zdXNwZW5kKHVuc2lnbmVkIGxvbmcgYWxhcm1fdGltZSwgdW5zaWduZWQgaW50IGFsYXJtX2VuYWJsZSwgc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQoreworCWlmICghc2hhcnBzbF9wbS5tYWNoaW5mby0+c2hvdWxkX3dha2V1cCghKHNoYXJwc2xfcG0uZmxhZ3MgJiBTSEFSUFNMX0FMQVJNX0FDVElWRSkgJiYgYWxhcm1fZW5hYmxlKSApCisJeworCQlpZiAoIShzaGFycHNsX3BtLmZsYWdzICYgU0hBUlBTTF9BTEFSTV9BQ1RJVkUpKSB7CisJCQlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiTm8gdXNlciB0cmlnZ2VyZWQgd2FrZXVwIGV2ZW50cyBhbmQgbm90IGNoYXJnaW5nLiBTdHJhbmdlLiBTdXNwZW5kLlxuIik7CisJCQljb3JnaV9nb3RvX3NsZWVwKGFsYXJtX3RpbWUsIGFsYXJtX2VuYWJsZSwgc3RhdGUpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYoc2hhcnBzbF9vZmZfY2hhcmdlX2JhdHRlcnkoKSkgeworCQkJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIkNoYXJnaW5nLiBTdXNwZW5kLi4uXG4iKTsKKwkJCWNvcmdpX2dvdG9fc2xlZXAoYWxhcm1fdGltZSwgYWxhcm1fZW5hYmxlLCBzdGF0ZSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiVXNlciB0cmlnZ2VyZWQgd2FrZXVwIGluIG9mZmxpbmUgY2hhcmdlci5cbiIpOworCX0KKworCWlmICgoIXNoYXJwc2xfcG0ubWFjaGluZm8tPnJlYWRfZGV2ZGF0YShTSEFSUFNMX1NUQVRVU19MT0NLKSkgfHwgKHNoYXJwc2xfZmF0YWxfY2hlY2soKSA8IDApICkKKwl7CisJCWRldl9lcnIoc2hhcnBzbF9wbS5kZXYsICJGYXRhbCBjb25kaXRpb24uIFN1c3BlbmQuXG4iKTsKKwkJY29yZ2lfZ290b19zbGVlcChhbGFybV90aW1lLCBhbGFybV9lbmFibGUsIHN0YXRlKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29yZ2lfcHhhX3BtX2VudGVyKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGFsYXJtX3RpbWUgPSBSVEFSOworCXVuc2lnbmVkIGludCBhbGFybV9zdGF0dXMgPSAoKFJUU1IgJiBSVFNSX0FMRSkgIT0gMCk7CisKKwlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiU2hhcnBTTCBzdXNwZW5kaW5nIGZvciBmaXJzdCB0aW1lLlxuIik7CisKKwljb3JnaV9nb3RvX3NsZWVwKGFsYXJtX3RpbWUsIGFsYXJtX3N0YXR1cywgc3RhdGUpOworCisJd2hpbGUgKGNvcmdpX2VudGVyX3N1c3BlbmQoYWxhcm1fdGltZSxhbGFybV9zdGF0dXMsc3RhdGUpKQorCQl7fQorCisJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIlNoYXJwU0wgcmVzdW1pbmcuLi5cbiIpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCisvKgorICogQ2hlY2sgZm9yIGZhdGFsIGJhdHRlcnkgZXJyb3JzCisgKiBGYXRhbCByZXR1cm5zIC0xCisgKi8KK3N0YXRpYyBpbnQgc2hhcnBzbF9mYXRhbF9jaGVjayh2b2lkKQoreworCWludCBidWZmWzVdLCB0ZW1wLCBpLCBhY2luOworCisJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgInNoYXJwc2xfZmF0YWxfY2hlY2sgZW50ZXJlZFxuIik7CisKKwkvKiBDaGVjayBBQy1BZGFwdGVyICovCisJYWNpbiA9IHNoYXJwc2xfcG0ubWFjaGluZm8tPnJlYWRfZGV2ZGF0YShTSEFSUFNMX1NUQVRVU19BQ0lOKTsKKworCWlmIChhY2luICYmIChzaGFycHNsX3BtLmNoYXJnZV9tb2RlID09IENIUkdfT04pKSB7CisJCXNoYXJwc2xfcG0ubWFjaGluZm8tPmNoYXJnZSgwKTsKKwkJdWRlbGF5KDEwMCk7CisJCXNoYXJwc2xfcG0ubWFjaGluZm8tPmRpc2NoYXJnZSgxKTsJLyogZW5hYmxlIGRpc2NoYXJnZSAqLworCQltZGVsYXkoU0hBUlBTTF9XQUlUX0RJU0NIQVJHRV9PTik7CisJfQorCisJaWYgKHNoYXJwc2xfcG0ubWFjaGluZm8tPmRpc2NoYXJnZTEpCisJCXNoYXJwc2xfcG0ubWFjaGluZm8tPmRpc2NoYXJnZTEoMSk7CisKKwkvKiBDaGVjayBiYXR0ZXJ5IDogY2hlY2sgaW5zZXJ0aW5nIGJhdHRlcnkgPyAqLworCWZvciAoaT0wOyBpPDU7IGkrKykgeworCQlidWZmW2ldID0gc2hhcnBzbF9wbS5tYWNoaW5mby0+cmVhZF9kZXZkYXRhKFNIQVJQU0xfQkFUVF9WT0xUKTsKKwkJbWRlbGF5KFNIQVJQU0xfQ0hFQ0tfQkFUVEVSWV9XQUlUX1RJTUVfVk9MVCk7CisJfQorCisJaWYgKHNoYXJwc2xfcG0ubWFjaGluZm8tPmRpc2NoYXJnZTEpCisJCXNoYXJwc2xfcG0ubWFjaGluZm8tPmRpc2NoYXJnZTEoMCk7CisKKwlpZiAoYWNpbiAmJiAoc2hhcnBzbF9wbS5jaGFyZ2VfbW9kZSA9PSBDSFJHX09OKSkgeworCQl1ZGVsYXkoMTAwKTsKKwkJc2hhcnBzbF9wbS5tYWNoaW5mby0+Y2hhcmdlKDEpOworCQlzaGFycHNsX3BtLm1hY2hpbmZvLT5kaXNjaGFyZ2UoMCk7CisJfQorCisJdGVtcCA9IGdldF9zZWxlY3RfdmFsKGJ1ZmYpOworCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJzaGFycHNsX2ZhdGFsX2NoZWNrOiBhY2luOiAlZCwgZGlzY2hhcmdlIHZvbHRhZ2U6ICVkLCBubyBkaXNjaGFyZ2U6ICVkXG4iLCBhY2luLCB0ZW1wLCBzaGFycHNsX3BtLm1hY2hpbmZvLT5yZWFkX2RldmRhdGEoU0hBUlBTTF9CQVRUX1ZPTFQpKTsKKworCWlmICgoYWNpbiAmJiAodGVtcCA8IFNIQVJQU0xfRkFUQUxfQUNJTl9WT0xUKSkgfHwKKwkJCSghYWNpbiAmJiAodGVtcCA8IFNIQVJQU0xfRkFUQUxfTk9BQ0lOX1ZPTFQpKSkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNoYXJwc2xfb2ZmX2NoYXJnZV9lcnJvcih2b2lkKQoreworCWRldl9lcnIoc2hhcnBzbF9wbS5kZXYsICJPZmZsaW5lIENoYXJnZXI6IEVycm9yIG9jY3VyZWQuXG4iKTsKKwlzaGFycHNsX3BtLm1hY2hpbmZvLT5jaGFyZ2UoMCk7CisJc2hhcnBzbF9wbV9sZWQoU0hBUlBTTF9MRURfRVJST1IpOworCXNoYXJwc2xfcG0uY2hhcmdlX21vZGUgPSBDSFJHX0VSUk9SOworCXJldHVybiAxOworfQorCisvKgorICogQ2hhcmdpbmcgQ29udHJvbCB3aGlsZSBzdXNwZW5kZWQKKyAqIFJldHVybiAxIC0gZ28gc3RyYWlnaHQgdG8gc2xlZXAKKyAqIFJldHVybiAwIC0gc2xlZXAgb3Igd2FrZXVwIGRlcGVuZGluZyBvbiBvdGhlciBmYWN0b3JzCisgKi8KK3N0YXRpYyBpbnQgc2hhcnBzbF9vZmZfY2hhcmdlX2JhdHRlcnkodm9pZCkKK3sKKwlpbnQgdGltZTsKKworCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJDaGFyZ2UgTW9kZTogJWRcbiIsIHNoYXJwc2xfcG0uY2hhcmdlX21vZGUpOworCisJaWYgKHNoYXJwc2xfcG0uY2hhcmdlX21vZGUgPT0gQ0hSR19PRkYpIHsKKwkJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIk9mZmxpbmUgQ2hhcmdlcjogU3RlcCAxXG4iKTsKKworCQkvKiBBQyBDaGVjayAqLworCQlpZiAoKHNoYXJwc2xfYWNfY2hlY2soKSA8IDApIHx8IChzaGFycHNsX2NoZWNrX2JhdHRlcnlfdGVtcCgpIDwgMCkpCisJCQlyZXR1cm4gc2hhcnBzbF9vZmZfY2hhcmdlX2Vycm9yKCk7CisKKwkJLyogU3RhcnQgQ2hhcmdpbmcgKi8KKwkJc2hhcnBzbF9wbV9sZWQoU0hBUlBTTF9MRURfT04pOworCQlzaGFycHNsX3BtLm1hY2hpbmZvLT5jaGFyZ2UoMCk7CisJCW1kZWxheShTSEFSUFNMX0NIQVJHRV9XQUlUX1RJTUUpOworCQlzaGFycHNsX3BtLm1hY2hpbmZvLT5jaGFyZ2UoMSk7CisKKwkJc2hhcnBzbF9wbS5jaGFyZ2VfbW9kZSA9IENIUkdfT047CisJCXNoYXJwc2xfcG0uZnVsbF9jb3VudCA9IDA7CisKKwkJcmV0dXJuIDE7CisJfSBlbHNlIGlmIChzaGFycHNsX3BtLmNoYXJnZV9tb2RlICE9IENIUkdfT04pIHsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHNoYXJwc2xfcG0uZnVsbF9jb3VudCA9PSAwKSB7CisJCWludCB0aW1lOworCisJCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJPZmZsaW5lIENoYXJnZXI6IFN0ZXAgMlxuIik7CisKKwkJaWYgKChzaGFycHNsX2NoZWNrX2JhdHRlcnlfdGVtcCgpIDwgMCkgfHwgKHNoYXJwc2xfY2hlY2tfYmF0dGVyeV92b2x0YWdlKCkgPCAwKSkKKwkJCXJldHVybiBzaGFycHNsX29mZl9jaGFyZ2VfZXJyb3IoKTsKKworCQlzaGFycHNsX3BtLm1hY2hpbmZvLT5jaGFyZ2UoMCk7CisJCW1kZWxheShTSEFSUFNMX0NIQVJHRV9XQUlUX1RJTUUpOworCQlzaGFycHNsX3BtLm1hY2hpbmZvLT5jaGFyZ2UoMSk7CisJCXNoYXJwc2xfcG0uY2hhcmdlX21vZGUgPSBDSFJHX09OOworCisJCW1kZWxheShTSEFSUFNMX0NIQVJHRV9DT19DSEVDS19USU1FKTsKKworCQl0aW1lID0gUkNOUjsKKwkJd2hpbGUoMSkgeworCQkJLyogQ2hlY2sgaWYgYW55IHdha2V1cCBldmVudCBoYWQgb2NjdXJlZCAqLworCQkJaWYgKHNoYXJwc2xfcG0ubWFjaGluZm8tPmNoYXJnZXJfd2FrZXVwKCkgIT0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJCS8qIENoZWNrIGZvciB0aW1lb3V0ICovCisJCQlpZiAoKFJDTlIgLSB0aW1lKSA+IFNIQVJQU0xfV0FJVF9DT19USU1FKQorCQkJCXJldHVybiAxOworCQkJaWYgKHNoYXJwc2xfcG0ubWFjaGluZm8tPnJlYWRfZGV2ZGF0YShTSEFSUFNMX1NUQVRVU19DSFJHRlVMTCkpIHsKKwkJCQlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiT2ZmbGluZSBDaGFyZ2VyOiBDaGFyZ2UgZnVsbCBvY2N1cmVkLiBSZXRyeWluZyB0byBjaGVja1xuIik7CisJICAgCQkJc2hhcnBzbF9wbS5mdWxsX2NvdW50Kys7CisJCQkJc2hhcnBzbF9wbS5tYWNoaW5mby0+Y2hhcmdlKDApOworCQkJCW1kZWxheShTSEFSUFNMX0NIQVJHRV9XQUlUX1RJTUUpOworCQkJCXNoYXJwc2xfcG0ubWFjaGluZm8tPmNoYXJnZSgxKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKworCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJPZmZsaW5lIENoYXJnZXI6IFN0ZXAgM1xuIik7CisKKwltZGVsYXkoU0hBUlBTTF9DSEFSR0VfQ09fQ0hFQ0tfVElNRSk7CisKKwl0aW1lID0gUkNOUjsKKwl3aGlsZSgxKSB7CisJCS8qIENoZWNrIGlmIGFueSB3YWtldXAgZXZlbnQgaGFkIG9jY3VyZWQgKi8KKwkJaWYgKHNoYXJwc2xfcG0ubWFjaGluZm8tPmNoYXJnZXJfd2FrZXVwKCkgIT0gMCkKKwkJCXJldHVybiAwOworCQkvKiBDaGVjayBmb3IgdGltZW91dCAqLworCQlpZiAoKFJDTlItdGltZSkgPiBTSEFSUFNMX1dBSVRfQ09fVElNRSkgeworCQkJaWYgKHNoYXJwc2xfcG0uZnVsbF9jb3VudCA+IFNIQVJQU0xfQ0hBUkdFX1JFVFJZX0NOVCkgeworCQkJCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJPZmZsaW5lIENoYXJnZXI6IE5vdCBjaGFyZ2VkIHN1ZmZpY2llbnRseS4gUmV0cnlpbmcuXG4iKTsKKwkJCQlzaGFycHNsX3BtLmZ1bGxfY291bnQgPSAwOworCQkJfQorCQkJc2hhcnBzbF9wbS5mdWxsX2NvdW50Kys7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAoc2hhcnBzbF9wbS5tYWNoaW5mby0+cmVhZF9kZXZkYXRhKFNIQVJQU0xfU1RBVFVTX0NIUkdGVUxMKSkgeworCQkJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIk9mZmxpbmUgQ2hhcmdlcjogQ2hhcmdpbmcgY29tcGxldGUuXG4iKTsKKwkJCXNoYXJwc2xfcG1fbGVkKFNIQVJQU0xfTEVEX09GRik7CisJCQlzaGFycHNsX3BtLm1hY2hpbmZvLT5jaGFyZ2UoMCk7CisJCQlzaGFycHNsX3BtLmNoYXJnZV9tb2RlID0gQ0hSR19ET05FOworCQkJcmV0dXJuIDE7CisJCX0KKwl9Cit9CisKKworc3RhdGljIHNzaXplX3QgYmF0dGVyeV9wZXJjZW50YWdlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLHNoYXJwc2xfcG0uYmF0dHN0YXQubWFpbmJhdF9wZXJjZW50KTsKK30KKworc3RhdGljIHNzaXplX3QgYmF0dGVyeV92b2x0YWdlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLHNoYXJwc2xfcG0uYmF0dHN0YXQubWFpbmJhdF92b2x0YWdlKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGJhdHRlcnlfcGVyY2VudGFnZSwgMDQ0NCwgYmF0dGVyeV9wZXJjZW50YWdlX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGJhdHRlcnlfdm9sdGFnZSwgMDQ0NCwgYmF0dGVyeV92b2x0YWdlX3Nob3csIE5VTEwpOworCitleHRlcm4gdm9pZCAoKmFwbV9nZXRfcG93ZXJfc3RhdHVzKShzdHJ1Y3QgYXBtX3Bvd2VyX2luZm8gKik7CisKK3N0YXRpYyB2b2lkIHNoYXJwc2xfYXBtX2dldF9wb3dlcl9zdGF0dXMoc3RydWN0IGFwbV9wb3dlcl9pbmZvICppbmZvKQoreworCWluZm8tPmFjX2xpbmVfc3RhdHVzID0gc2hhcnBzbF9wbS5iYXR0c3RhdC5hY19zdGF0dXM7CisKKwlpZiAoc2hhcnBzbF9wbS5jaGFyZ2VfbW9kZSA9PSBDSFJHX09OKQorCQlpbmZvLT5iYXR0ZXJ5X3N0YXR1cyA9IEFQTV9CQVRURVJZX1NUQVRVU19DSEFSR0lORzsKKwllbHNlCisJCWluZm8tPmJhdHRlcnlfc3RhdHVzID0gc2hhcnBzbF9wbS5iYXR0c3RhdC5tYWluYmF0X3N0YXR1czsKKworCWluZm8tPmJhdHRlcnlfZmxhZyA9ICgxIDw8IGluZm8tPmJhdHRlcnlfc3RhdHVzKTsKKwlpbmZvLT5iYXR0ZXJ5X2xpZmUgPSBzaGFycHNsX3BtLmJhdHRzdGF0Lm1haW5iYXRfcGVyY2VudDsKK30KKworc3RhdGljIHN0cnVjdCBwbV9vcHMgc2hhcnBzbF9wbV9vcHMgPSB7CisJLnBtX2Rpc2tfbW9kZQk9IFBNX0RJU0tfRklSTVdBUkUsCisJLnByZXBhcmUJPSBweGFfcG1fcHJlcGFyZSwKKwkuZW50ZXIJCT0gY29yZ2lfcHhhX3BtX2VudGVyLAorCS5maW5pc2gJCT0gcHhhX3BtX2ZpbmlzaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNoYXJwc2xfcG1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpZiAoIXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNoYXJwc2xfcG0uZGV2ID0gJnBkZXYtPmRldjsKKwlzaGFycHNsX3BtLm1hY2hpbmZvID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc2hhcnBzbF9wbS5jaGFyZ2VfbW9kZSA9IENIUkdfT0ZGOworCXNoYXJwc2xfcG0uZmxhZ3MgPSAwOworCisJaW5pdF90aW1lcigmc2hhcnBzbF9wbS5hY190aW1lcik7CisJc2hhcnBzbF9wbS5hY190aW1lci5mdW5jdGlvbiA9IHNoYXJwc2xfYWNfdGltZXI7CisKKwlpbml0X3RpbWVyKCZzaGFycHNsX3BtLmNocmdfZnVsbF90aW1lcik7CisJc2hhcnBzbF9wbS5jaHJnX2Z1bGxfdGltZXIuZnVuY3Rpb24gPSBzaGFycHNsX2NocmdfZnVsbF90aW1lcjsKKworCXNoYXJwc2xfcG0ubWFjaGluZm8tPmluaXQoKTsKKworCWRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfYmF0dGVyeV9wZXJjZW50YWdlKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2JhdHRlcnlfdm9sdGFnZSk7CisKKwlhcG1fZ2V0X3Bvd2VyX3N0YXR1cyA9IHNoYXJwc2xfYXBtX2dldF9wb3dlcl9zdGF0dXM7CisKKwlwbV9zZXRfb3BzKCZzaGFycHNsX3BtX29wcyk7CisKKwltb2RfdGltZXIoJnNoYXJwc2xfcG0uYWNfdGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDI1MCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hhcnBzbF9wbV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlwbV9zZXRfb3BzKE5VTEwpOworCisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9iYXR0ZXJ5X3BlcmNlbnRhZ2UpOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfYmF0dGVyeV92b2x0YWdlKTsKKworCXNoYXJwc2xfcG0ubWFjaGluZm8tPmV4aXQoKTsKKworCWRlbF90aW1lcl9zeW5jKCZzaGFycHNsX3BtLmNocmdfZnVsbF90aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJnNoYXJwc2xfcG0uYWNfdGltZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNoYXJwc2xfcG1fZHJpdmVyID0geworCS5wcm9iZQkJPSBzaGFycHNsX3BtX3Byb2JlLAorCS5yZW1vdmUJCT0gc2hhcnBzbF9wbV9yZW1vdmUsCisJLnN1c3BlbmQJPSBzaGFycHNsX3BtX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzaGFycHNsX3BtX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJCT0gInNoYXJwc2wtcG0iLAorCX0sCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzaGFycHNsX3BtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzaGFycHNsX3BtX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIHNoYXJwc2xfcG1fZXhpdCh2b2lkKQoreworIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2hhcnBzbF9wbV9kcml2ZXIpOworfQorCitsYXRlX2luaXRjYWxsKHNoYXJwc2xfcG1faW5pdCk7Cittb2R1bGVfZXhpdChzaGFycHNsX3BtX2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL3ZpYy5jIGIvYXJjaC9hcm0vY29tbW9uL3ZpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NWVkMTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb21tb24vdmljLmMKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9jb21tb24vdmljLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5IC0gMjAwMyBBUk0gTGltaXRlZAorICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3ZpYy5oPgorCitzdGF0aWMgdm9pZCBfX2lvbWVtICp2aWNfYmFzZTsKKworc3RhdGljIHZvaWQgdmljX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJaXJxIC09IElSUV9WSUNfU1RBUlQ7CisJd3JpdGVsKDEgPDwgaXJxLCB2aWNfYmFzZSArIFZJQ19JTlRfRU5BQkxFX0NMRUFSKTsKK30KKworc3RhdGljIHZvaWQgdmljX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpcnEgLT0gSVJRX1ZJQ19TVEFSVDsKKwl3cml0ZWwoMSA8PCBpcnEsIHZpY19iYXNlICsgVklDX0lOVF9FTkFCTEUpOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgdmljX2NoaXAgPSB7CisJLmFjawk9IHZpY19tYXNrX2lycSwKKwkubWFzawk9IHZpY19tYXNrX2lycSwKKwkudW5tYXNrCT0gdmljX3VubWFza19pcnEsCit9OworCit2b2lkIF9faW5pdCB2aWNfaW5pdCh2b2lkIF9faW9tZW0gKmJhc2UsIHUzMiB2aWNfc291cmNlcykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCXZpY19iYXNlID0gYmFzZTsKKworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgaW5pdGlhbGx5LiAqLworCisJd3JpdGVsKDAsIHZpY19iYXNlICsgVklDX0lOVF9TRUxFQ1QpOworCXdyaXRlbCgwLCB2aWNfYmFzZSArIFZJQ19JTlRfRU5BQkxFKTsKKwl3cml0ZWwofjAsIHZpY19iYXNlICsgVklDX0lOVF9FTkFCTEVfQ0xFQVIpOworCXdyaXRlbCgwLCB2aWNfYmFzZSArIFZJQ19JUlFfU1RBVFVTKTsKKwl3cml0ZWwoMCwgdmljX2Jhc2UgKyBWSUNfSVRDUik7CisJd3JpdGVsKH4wLCB2aWNfYmFzZSArIFZJQ19JTlRfU09GVF9DTEVBUik7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB3ZSBjbGVhciBhbGwgZXhpc3RpbmcgaW50ZXJydXB0cworCSAqLworCXdyaXRlbCgwLCB2aWNfYmFzZSArIFZJQ19WRUNUX0FERFIpOworCWZvciAoaSA9IDA7IGkgPCAxOTsgaSsrKSB7CisJCXVuc2lnbmVkIGludCB2YWx1ZTsKKworCQl2YWx1ZSA9IHJlYWRsKHZpY19iYXNlICsgVklDX1ZFQ1RfQUREUik7CisJCXdyaXRlbCh2YWx1ZSwgdmljX2Jhc2UgKyBWSUNfVkVDVF9BRERSKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQl2b2lkIF9faW9tZW0gKnJlZyA9IHZpY19iYXNlICsgVklDX1ZFQ1RfQ05UTDAgKyAoaSAqIDQpOworCQl3cml0ZWwoVklDX1ZFQ1RfQ05UTF9FTkFCTEUgfCBpLCByZWcpOworCX0KKworCXdyaXRlbCgzMiwgdmljX2Jhc2UgKyBWSUNfREVGX1ZFQ1RfQUREUik7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgaXJxID0gSVJRX1ZJQ19TVEFSVCArIGk7CisKKwkJc2V0X2lycV9jaGlwKGlycSwgJnZpY19jaGlwKTsKKworCQlpZiAodmljX3NvdXJjZXMgJiAoMSA8PCBpKSkgeworCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2Fzc2FiZXRfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9hc3NhYmV0X2RlZmNvbmZpZwppbmRleCBjY2JiNGMwLi4wODljOWQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2Fzc2FiZXRfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvYXNzYWJldF9kZWZjb25maWcKQEAgLTYzLDcgKzYzLDYgQEAKICMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9hdDkxcm05MjAwZGtfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9hdDkxcm05MjAwZGtfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZGQxM2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL2F0OTFybTkyMDBka19kZWZjb25maWcKQEAgLTAsMCArMSwxMDA5IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTUKKyMgTW9uIEphbiAgOSAyMDo1NDozMCAyMDA2CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19LT0JKRUNUX1VFVkVOVD15CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorCisjCisjIEJsb2NrIGxheWVyCisjCisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CisjIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0FTPXkKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQUFFQzIwMDAgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMD15CisKKyMKKyMgQVQ5MVJNOTIwMCBJbXBsZW1lbnRhdGlvbnMKKyMKKworIworIyBBVDkxUk05MjAwIEJvYXJkIFR5cGUKKyMKK0NPTkZJR19BUkNIX0FUOTFSTTkyMDBESz15CisjIENPTkZJR19NQUNIX0FUOTFSTTkyMDBFSyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0NTQjMzNyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0NTQjYzNyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0NBUk1FVkEgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9LQjkyMDAgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9BVEVCOTIwMCBpcyBub3Qgc2V0CisKKyMKKyMgQVQ5MVJNOTIwMCBGZWF0dXJlIFNlbGVjdGlvbnMKKyMKK0NPTkZJR19BVDkxX1BST0dSQU1NQUJMRV9DTE9DS1M9eQorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfQVJNOTIwVD15CitDT05GSUdfQ1BVXzMydjQ9eQorQ09ORklHX0NQVV9BQlJUX0VWNFQ9eQorQ09ORklHX0NQVV9DQUNIRV9WNFdUPXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX0NPUFlfVjRXQj15CitDT05GSUdfQ1BVX1RMQl9WNFdCST15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisjIENPTkZJR19BUk1fVEhVTUIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworQ09ORklHX1BDQ0FSRD15CisjIENPTkZJR19QQ01DSUFfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BDTUNJQT15CitDT05GSUdfUENNQ0lBX0xPQURfQ0lTPXkKK0NPTkZJR19QQ01DSUFfSU9DVEw9eQorCisjCisjIFBDLWNhcmQgYnJpZGdlcworIworQ09ORklHX0FUOTFfQ0Y9eQorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19OT19JRExFX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00MDk2CitDT05GSUdfTEVEUz15CitDT05GSUdfTEVEU19USU1FUj15CisjIENPTkZJR19MRURTX0NQVSBpcyBub3Qgc2V0CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0ibWVtPTMyTSBjb25zb2xlPXR0eVMwLDExNTIwMCBpbml0cmQ9MHgyMDQxMDAwMCwzMTQ1NzI4IHJvb3Q9L2Rldi9yYW0wIHJ3IgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUlRIVVIgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorIyBDT05GSUdfSVBfUE5QX0RIQ1AgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUF9CT09UUD15CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0JJQz15CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKK0NPTkZJR19GV19MT0FERVI9eQorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKK0NPTkZJR19NVERfSkVERUNQUk9CRT15CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSU5URUxFWFQgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfQU1EU1REPXkKK0NPTkZJR19NVERfQ0ZJX0FNRFNURF9SRVRSWT0wCisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BIWVNNQVA9eQorQ09ORklHX01URF9QSFlTTUFQX1NUQVJUPTB4MTAwMDAwMDAKK0NPTkZJR19NVERfUEhZU01BUF9MRU49MHgyMDAwMDAKK0NPTkZJR19NVERfUEhZU01BUF9CQU5LV0lEVEg9MgorIyBDT05GSUdfTVREX0FSTV9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9JTVBBNyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0FUOTFfREFUQUZMQVNIPXkKK0NPTkZJR19NVERfQVQ5MV9EQVRBRkxBU0hfQ0FSRD15CisKKyMKKyMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorCisjCisjIE9uZU5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VQiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT04MTkyCitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgUEhZIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKK0NPTkZJR19BUk1fQVQ5MV9FVEhFUj15CisjIENPTkZJR19TTUM5MVggaXMgbm90IHNldAorIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBQQ01DSUEgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUX1BDTUNJQSBpcyBub3Qgc2V0CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorIyBDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVggaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQVQ5MT15CitDT05GSUdfU0VSSUFMX0FUOTFfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfQVQ5MV9UVFlBVCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCitDT05GSUdfV0FUQ0hET0c9eQorQ09ORklHX1dBVENIRE9HX05PV0FZT1VUPXkKKworIworIyBXYXRjaGRvZyBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfQVQ5MV9XQVRDSERPRz15CisKKyMKKyMgVVNCLWJhc2VkIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19VU0JQQ1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CitDT05GSUdfQVQ5MV9SVEM9eQorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisKKyMKKyMgUENNQ0lBIGNoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19TWU5DTElOS19DUyBpcyBub3Qgc2V0CisjIENPTkZJR19DQVJETUFOXzQwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ0FSRE1BTl80MDQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFTENMT0NLIGlzIG5vdCBzZXQKK0NPTkZJR19BVDkxX1NQST15CitDT05GSUdfQVQ5MV9TUElERVY9eQorCisjCisjIEkyQyBzdXBwb3J0CisjCitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CisKKyMKKyMgSTJDIEFsZ29yaXRobXMKKyMKKyMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKK0NPTkZJR19JMkNfQVQ5MT15CisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19YMTIwNV9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjCitDT05GSUdfSFdNT049eQorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBDYXBhYmlsaXRpZXMgUG9ydCBkcml2ZXJzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CitDT05GSUdfVVNCPXkKK0NPTkZJR19VU0JfREVCVUc9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKK0NPTkZJR19VU0JfREVWSUNFRlM9eQorIyBDT05GSUdfVVNCX0JBTkRXSURUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0hDRD15CisjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfT0hDSV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMKKyMgQ09ORklHX1VTQl9TVE9SQUdFIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW5wdXQgRGV2aWNlcworIworIyBDT05GSUdfVVNCX0hJRCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhJRCBCb290IFByb3RvY29sIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9LQkQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BSVBURUsgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dBQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BQ0VDQUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tCVEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QT1dFUk1BVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01UT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVRNVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VHQUxBWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWUVBTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWFBBRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVRJX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFVE9VQ0ggaXMgbm90IHNldAorCisjCisjIFVTQiBJbWFnaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAorCisjCisjIFVTQiBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAorCisjCisjIFZpZGVvNExpbnV4IHN1cHBvcnQgaXMgbmVlZGVkIGZvciBVU0IgTXVsdGltZWRpYSBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCisjCisjIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAorQ09ORklHX1VTQl9NT049eQorCisjCisjIFVTQiBwb3J0IGRyaXZlcnMKKyMKKworIworIyBVU0IgU2VyaWFsIENvbnZlcnRlciBzdXBwb3J0CisjCisjIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVUVSU1dBTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVEtJVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVFNFUlZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERTTCBtb2RlbSBzdXBwb3J0CisjCisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCitDT05GSUdfVVNCX0dBREdFVD15CisjIENPTkZJR19VU0JfR0FER0VUX0RFQlVHX0ZJTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUX1NFTEVDVEVEPXkKKyMgQ09ORklHX1VTQl9HQURHRVRfTkVUMjI4MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX1BYQTJYWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0dPS1UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfT01BUCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dBREdFVF9BVDkxPXkKK0NPTkZJR19VU0JfQVQ5MT15CisjIENPTkZJR19VU0JfR0FER0VUX0RVTU1ZX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0RVQUxTUEVFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWkVSTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRGUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRklMRV9TVE9SQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HX1NFUklBTCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworQ09ORklHX01NQz15CisjIENPTkZJR19NTUNfREVCVUcgaXMgbm90IHNldAorQ09ORklHX01NQ19CTE9DSz15CisjIENPTkZJR19NTUNfV0JTRCBpcyBub3Qgc2V0CitDT05GSUdfTU1DX0FUOTFSTTkyMDA9eQorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pCRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisjIENPTkZJR19SRUxBWUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAorQ09ORklHX0NSQU1GUz15CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworIyBDT05GSUdfTkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVVNFUj15CisjIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19FUlJPUlMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0xMPXkKKyMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2F0OTFybTkyMDBla19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2F0OTFybTkyMDBla19kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA4MzhjYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvYXQ5MXJtOTIwMGVrX2RlZmNvbmZpZwpAQCAtMCwwICsxLDk5OCBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE1CisjIE1vbiBKYW4gIDkgMjA6NTc6MzEgMjAwNgorIworQ09ORklHX0FSTT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAorIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19LT0JKRUNUX1VFVkVOVD15CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorCisjCisjIEJsb2NrIGxheWVyCisjCisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CisjIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0FTPXkKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQUFFQzIwMDAgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMD15CisKKyMKKyMgQVQ5MVJNOTIwMCBJbXBsZW1lbnRhdGlvbnMKKyMKKworIworIyBBVDkxUk05MjAwIEJvYXJkIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMERLIGlzIG5vdCBzZXQKK0NPTkZJR19NQUNIX0FUOTFSTTkyMDBFSz15CisjIENPTkZJR19NQUNIX0NTQjMzNyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0NTQjYzNyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0NBUk1FVkEgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9LQjkyMDAgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9BVEVCOTIwMCBpcyBub3Qgc2V0CisKKyMKKyMgQVQ5MVJNOTIwMCBGZWF0dXJlIFNlbGVjdGlvbnMKKyMKK0NPTkZJR19BVDkxX1BST0dSQU1NQUJMRV9DTE9DS1M9eQorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfQVJNOTIwVD15CitDT05GSUdfQ1BVXzMydjQ9eQorQ09ORklHX0NQVV9BQlJUX0VWNFQ9eQorQ09ORklHX0NQVV9DQUNIRV9WNFdUPXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX0NPUFlfVjRXQj15CitDT05GSUdfQ1BVX1RMQl9WNFdCST15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisjIENPTkZJR19BUk1fVEhVTUIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfTk9fSURMRV9IWiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NDA5NgorQ09ORklHX0xFRFM9eQorQ09ORklHX0xFRFNfVElNRVI9eQorQ09ORklHX0xFRFNfQ1BVPXkKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSJtZW09MzJNIGNvbnNvbGU9dHR5UzAsMTE1MjAwIGluaXRyZD0weDIwNDEwMDAwLDMxNDU3Mjggcm9vdD0vZGV2L3JhbTAgcnciCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19GUEVfTldGUEU9eQorIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CisjIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQklDPXkKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgorIworIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CitDT05GSUdfTVREX0pFREVDUFJPQkU9eQorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0lOVEVMRVhUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CitDT05GSUdfTVREX0NGSV9BTURTVERfUkVUUlk9MAorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorQ09ORklHX01URF9QSFlTTUFQPXkKK0NPTkZJR19NVERfUEhZU01BUF9TVEFSVD0weDEwMDAwMDAwCitDT05GSUdfTVREX1BIWVNNQVBfTEVOPTB4ODAwMDAwCitDT05GSUdfTVREX1BIWVNNQVBfQkFOS1dJRFRIPTIKKyMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfSU1QQTcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTEtNVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorQ09ORklHX01URF9BVDkxX0RBVEFGTEFTSD15CitDT05GSUdfTVREX0FUOTFfREFUQUZMQVNIX0NBUkQ9eQorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBPbmVOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBQSFkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorQ09ORklHX0FSTV9BVDkxX0VUSEVSPXkKKyMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CisjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0FUOTE9eQorQ09ORklHX1NFUklBTF9BVDkxX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX0FUOTFfVFRZQVQgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworQ09ORklHX1dBVENIRE9HPXkKK0NPTkZJR19XQVRDSERPR19OT1dBWU9VVD15CisKKyMKKyMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX0FUOTFfV0FUQ0hET0c9eQorCisjCisjIFVTQi1iYXNlZCBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfVVNCUENXQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorQ09ORklHX0FUOTFfUlRDPXkKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAorQ09ORklHX0FUOTFfU1BJPXkKK0NPTkZJR19BVDkxX1NQSURFVj15CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19DSEFSREVWPXkKKworIworIyBJMkMgQWxnb3JpdGhtcworIworIyBDT05GSUdfSTJDX0FMR09CSVQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworQ09ORklHX0kyQ19BVDkxPXkKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUlRDODU2NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX1gxMjA1X0kyQyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMKK0NPTkZJR19IV01PTj15CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIENhcGFiaWxpdGllcyBQb3J0IGRyaXZlcnMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCitDT05GSUdfRkI9eQorQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CitDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKK0NPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKKyMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorQ09ORklHX0ZCX1MxRDEzWFhYPXkKKyMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRSBpcyBub3Qgc2V0CisKKyMKKyMgTG9nbyBjb25maWd1cmF0aW9uCisjCisjIENPTkZJR19MT0dPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKK0NPTkZJR19VU0I9eQorQ09ORklHX1VTQl9ERUJVRz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucworIworQ09ORklHX1VTQl9ERVZJQ0VGUz15CisjIENPTkZJR19VU0JfQkFORFdJRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKKworIworIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisKKyMKKyMgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgorIworIyBDT05GSUdfVVNCX1NUT1JBR0UgaXMgbm90IHNldAorCisjCisjIFVTQiBJbnB1dCBEZXZpY2VzCisjCisjIENPTkZJR19VU0JfSElEIGlzIG5vdCBzZXQKKworIworIyBVU0IgSElEIEJvb3QgUHJvdG9jb2wgZHJpdmVycworIworIyBDT05GSUdfVVNCX0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV0FDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FDRUNBRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JVE1UT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRUdBTEFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ZRUFMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9YUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVElfUkVNT1RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEltYWdpbmcgZGV2aWNlcworIworIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVVNCX0RBQlVTQiBpcyBub3Qgc2V0CisKKyMKKyMgVmlkZW80TGludXggc3VwcG9ydCBpcyBuZWVkZWQgZm9yIFVTQiBNdWx0aW1lZGlhIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKKyMKKyMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX01PTj15CisKKyMKKyMgVVNCIHBvcnQgZHJpdmVycworIworCisjCisjIFVTQiBTZXJpYWwgQ29udmVydGVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9TRVJJQUwgaXMgbm90IHNldAorCisjCisjIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUS0lUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUU0VSVk8gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKKworIworIyBVU0IgRFNMIG1vZGVtIHN1cHBvcnQKKyMKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKK0NPTkZJR19VU0JfR0FER0VUPXkKKyMgQ09ORklHX1VTQl9HQURHRVRfREVCVUdfRklMRVMgaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVRfU0VMRUNURUQ9eQorIyBDT05GSUdfVVNCX0dBREdFVF9ORVQyMjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUFhBMlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfR09LVSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9PTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUX0FUOTE9eQorQ09ORklHX1VTQl9BVDkxPXkKKyMgQ09ORklHX1VTQl9HQURHRVRfRFVNTVlfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfRFVBTFNQRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9aRVJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GSUxFX1NUT1JBR0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCitDT05GSUdfTU1DPXkKKyMgQ09ORklHX01NQ19ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfTU1DX0JMT0NLPXkKKyMgQ09ORklHX01NQ19XQlNEIGlzIG5vdCBzZXQKK0NPTkZJR19NTUNfQVQ5MVJNOTIwMD15CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKyMgQ09ORklHX1JFTEFZRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JBTUZTPXkKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCisjIENPTkZJR19ORlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19VU0VSPXkKKyMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0VSUk9SUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfTEw9eQorIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvYmFkZ2U0X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvYmFkZ2U0X2RlZmNvbmZpZwppbmRleCA1ZDkyYWY5Li5jZmU2YmQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2JhZGdlNF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9iYWRnZTRfZGVmY29uZmlnCkBAIC02Niw3ICs2Niw2IEBACiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvYmFzdF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2Jhc3RfZGVmY29uZmlnCmluZGV4IDM1ZTNhOTkuLjY4ODYwMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvYmFzdF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9iYXN0X2RlZmNvbmZpZwpAQCAtNjQsNyArNjQsNiBAQAogIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2NlcmZjdWJlX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvY2VyZmN1YmVfZGVmY29uZmlnCmluZGV4IGQ4ZmUwZjQuLmY4MWE2MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvY2VyZmN1YmVfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvY2VyZmN1YmVfZGVmY29uZmlnCkBAIC02NSw3ICs2NSw2IEBACiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvY2xwczc1MDBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9jbHBzNzUwMF9kZWZjb25maWcKaW5kZXggOTA4NzU4My4uYWY5YWU1MzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvY2xwczc1MDBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvY2xwczc1MDBfZGVmY29uZmlnCkBAIC01Nyw3ICs1Nyw2IEBACiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvY29sbGllX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvY29sbGllX2RlZmNvbmZpZwppbmRleCA0MGRmZTA3Li4xNTQ2OGEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2NvbGxpZV9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9jb2xsaWVfZGVmY29uZmlnCkBAIC03MSw3ICs3MSw2IEBACiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvY29yZ2lfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9jb3JnaV9kZWZjb25maWcKaW5kZXggMDYyMjkwMi4uM2MzNDYxZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9jb3JnaV9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9jb3JnaV9kZWZjb25maWcKQEAgLTg3LDcgKzg3LDYgQEAKICMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9jc2IzMzdfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9jc2IzMzdfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NWEzMTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL2NzYjMzN19kZWZjb25maWcKQEAgLTAsMCArMSwxMTM2IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTUKKyMgTW9uIEphbiAgOSAyMTo1MTozMSAyMDA2CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19LT0JKRUNUX1VFVkVOVD15CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorCisjCisjIEJsb2NrIGxheWVyCisjCisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorQ09ORklHX0RFRkFVTFRfQVM9eQorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorCisjCisjIFN5c3RlbSBUeXBlCisjCisjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JFQUxWSUVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9BVDkxUk05MjAwPXkKKworIworIyBBVDkxUk05MjAwIEltcGxlbWVudGF0aW9ucworIworCisjCisjIEFUOTFSTTkyMDAgQm9hcmQgVHlwZQorIworIyBDT05GSUdfQVJDSF9BVDkxUk05MjAwREsgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9BVDkxUk05MjAwRUsgaXMgbm90IHNldAorQ09ORklHX01BQ0hfQ1NCMzM3PXkKKyMgQ09ORklHX01BQ0hfQ1NCNjM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfQ0FSTUVWQSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0tCOTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0FURUI5MjAwIGlzIG5vdCBzZXQKKworIworIyBBVDkxUk05MjAwIEZlYXR1cmUgU2VsZWN0aW9ucworIworQ09ORklHX0FUOTFfUFJPR1JBTU1BQkxFX0NMT0NLUz15CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9BUk05MjBUPXkKK0NPTkZJR19DUFVfMzJ2ND15CitDT05GSUdfQ1BVX0FCUlRfRVY0VD15CitDT05GSUdfQ1BVX0NBQ0hFX1Y0V1Q9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfQ09QWV9WNFdCPXkKK0NPTkZJR19DUFVfVExCX1Y0V0JJPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKKyMgQ09ORklHX0FSTV9USFVNQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKKworIworIyBCdXMgc3VwcG9ydAorIworQ09ORklHX0lTQV9ETUFfQVBJPXkKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCitDT05GSUdfUENDQVJEPXkKKyMgQ09ORklHX1BDTUNJQV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfUENNQ0lBPXkKK0NPTkZJR19QQ01DSUFfTE9BRF9DSVM9eQorQ09ORklHX1BDTUNJQV9JT0NUTD15CisKKyMKKyMgUEMtY2FyZCBicmlkZ2VzCisjCitDT05GSUdfQVQ5MV9DRj15CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0lETEVfSFogaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKKyMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQwOTYKK0NPTkZJR19MRURTPXkKK0NPTkZJR19MRURTX1RJTUVSPXkKK0NPTkZJR19MRURTX0NQVT15CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0ibWVtPTMyTSBjb25zb2xlPXR0eVMwLDM4NDAwIGluaXRyZD0weDIwNDEwMDAwLDMxNDU3Mjggcm9vdD0vZGV2L3JhbTAgcnciCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19GUEVfTldGUEU9eQorIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0JJQz15CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKK0NPTkZJR19GV19MT0FERVI9eQorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKKyMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQorIyBDT05GSUdfTVREX0NGSV9BTURTVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FSTV9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ1NCMzM3PXkKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BVDkxX0RBVEFGTEFTSCBpcyBub3Qgc2V0CisKKyMKKyMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorCisjCisjIE9uZU5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTgxOTIKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJPXkKK0NPTkZJR19TQ1NJX1BST0NfRlM9eQorCisjCisjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCisjCisjIENPTkZJR19CTEtfREVWX1NEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TRyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorCisjCisjIFNDU0kgVHJhbnNwb3J0IEF0dHJpYnV0ZXMKKyMKKyMgQ09ORklHX1NDU0lfU1BJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRkNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JU0NTSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19BVFRSUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycworIworIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBQQ01DSUEgU0NTSSBhZGFwdGVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDTUNJQV9BSEExNTJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9GRE9NQUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9OSU5KQV9TQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9RTE9HSUMgaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX1NZTTUzQzUwMCBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIFBIWSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CitDT05GSUdfQVJNX0FUOTFfRVRIRVI9eQorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKKyMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0CisKKyMKKyMgUENNQ0lBIG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX05FVF9QQ01DSUEgaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9BVDkxPXkKK0NPTkZJR19TRVJJQUxfQVQ5MV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9BVDkxX1RUWUFUIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKK0NPTkZJR19XQVRDSERPRz15CitDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQ9eQorCisjCisjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19BVDkxX1dBVENIRE9HPXkKKworIworIyBVU0ItYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1VTQlBDV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorQ09ORklHX1JUQz15CisjIENPTkZJR19BVDkxX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKworIworIyBQQ01DSUEgY2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1NZTkNMSU5LX0NTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBUkRNQU5fNDAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DQVJETUFOXzQwNDAgaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAorQ09ORklHX0FUOTFfU1BJPXkKK0NPTkZJR19BVDkxX1NQSURFVj15CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19DSEFSREVWPXkKKworIworIyBJMkMgQWxnb3JpdGhtcworIworIyBDT05GSUdfSTJDX0FMR09CSVQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworQ09ORklHX0kyQ19BVDkxPXkKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUlRDODU2NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX1gxMjA1X0kyQyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMKK0NPTkZJR19IV01PTj15CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIENhcGFiaWxpdGllcyBQb3J0IGRyaXZlcnMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKK0NPTkZJR19VU0I9eQorQ09ORklHX1VTQl9ERUJVRz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucworIworQ09ORklHX1VTQl9ERVZJQ0VGUz15CisjIENPTkZJR19VU0JfQkFORFdJRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKKworIworIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisKKyMKKyMgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgorIworQ09ORklHX1VTQl9TVE9SQUdFPXkKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RBVEFGQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfRlJFRUNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EUENNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1VTQkFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFIwOSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSNTUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1QgaXMgbm90IHNldAorCisjCisjIFVTQiBJbnB1dCBEZXZpY2VzCisjCisjIENPTkZJR19VU0JfSElEIGlzIG5vdCBzZXQKKworIworIyBVU0IgSElEIEJvb3QgUHJvdG9jb2wgZHJpdmVycworIworIyBDT05GSUdfVVNCX0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV0FDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FDRUNBRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JVE1UT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRUdBTEFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ZRUFMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9YUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVElfUkVNT1RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEltYWdpbmcgZGV2aWNlcworIworIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAorCisjCisjIFVTQiBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAorCisjCisjIFZpZGVvNExpbnV4IHN1cHBvcnQgaXMgbmVlZGVkIGZvciBVU0IgTXVsdGltZWRpYSBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCisjCisjIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAorQ09ORklHX1VTQl9NT049eQorCisjCisjIFVTQiBwb3J0IGRyaXZlcnMKKyMKKworIworIyBVU0IgU2VyaWFsIENvbnZlcnRlciBzdXBwb3J0CisjCitDT05GSUdfVVNCX1NFUklBTD15CitDT05GSUdfVVNCX1NFUklBTF9DT05TT0xFPXkKK0NPTkZJR19VU0JfU0VSSUFMX0dFTkVSSUM9eQorIyBDT05GSUdfVVNCX1NFUklBTF9BSVJQUklNRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0FOWURBVEEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9CRUxLSU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9XSElURUhFQVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9ESUdJX0FDQ0VMRVBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9DUDIxMDEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9DWVBSRVNTX004IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRU1QRUcgaXMgbm90IHNldAorQ09ORklHX1VTQl9TRVJJQUxfRlRESV9TSU89eQorIyBDT05GSUdfVVNCX1NFUklBTF9WSVNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0lQQVEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9JUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0VER0VQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRURHRVBPUlRfVEkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9HQVJNSU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9JUFcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1BEQSBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fTVBSPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMjg9eQorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0EyOFg9eQorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0EyOFhBPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMjhYQj15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTE5PXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMThYPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMTlXPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMTlRVz15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTE5UUk9eQorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0E0OVc9eQorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0E0OVdMQz15CisjIENPTkZJR19VU0JfU0VSSUFMX0tMU0kgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9LT0JJTF9TQ1QgaXMgbm90IHNldAorQ09ORklHX1VTQl9TRVJJQUxfTUNUX1UyMzI9eQorIyBDT05GSUdfVVNCX1NFUklBTF9QTDIzMDMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9IUDRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfU0FGRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1RJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQ1lCRVJKQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfWElSQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfT1BUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfT01OSU5FVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0VaVVNCPXkKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVUVSU1dBTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVEtJVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVFNFUlZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERTTCBtb2RlbSBzdXBwb3J0CisjCisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCitDT05GSUdfVVNCX0dBREdFVD15CisjIENPTkZJR19VU0JfR0FER0VUX0RFQlVHX0ZJTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUX1NFTEVDVEVEPXkKKyMgQ09ORklHX1VTQl9HQURHRVRfTkVUMjI4MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX1BYQTJYWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0dPS1UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfT01BUCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dBREdFVF9BVDkxPXkKK0NPTkZJR19VU0JfQVQ5MT15CisjIENPTkZJR19VU0JfR0FER0VUX0RVTU1ZX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0RVQUxTUEVFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWkVSTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRGUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRklMRV9TVE9SQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HX1NFUklBTCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworQ09ORklHX01NQz15CisjIENPTkZJR19NTUNfREVCVUcgaXMgbm90IHNldAorQ09ORklHX01NQ19CTE9DSz15CisjIENPTkZJR19NTUNfV0JTRCBpcyBub3Qgc2V0CitDT05GSUdfTU1DX0FUOTFSTTkyMDA9eQorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pCRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisjIENPTkZJR19SRUxBWUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAorQ09ORklHX0NSQU1GUz15CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorQ09ORklHX05GU19WND15CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfTkZTX0NPTU1PTj15CitDT05GSUdfU1VOUlBDPXkKK0NPTkZJR19TVU5SUENfR1NTPXkKK0NPTkZJR19SUENTRUNfR1NTX0tSQjU9eQorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19VU0VSPXkKKyMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0VSUk9SUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfTEw9eQorIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKK0NPTkZJR19DUllQVE89eQorIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX01ENT15CisjIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19ERVM9eQorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvY3NiNjM3X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvY3NiNjM3X2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWE5NmE1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9jc2I2MzdfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTExNiBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE1CisjIE1vbiBKYW4gIDkgMjE6NTI6MDAgMjAwNgorIworQ09ORklHX0FSTT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKKyMgQ09ORklHX1NXQVAgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CisjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCitDT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKK0NPTkZJR19DQ19BTElHTl9MT09QUz0wCitDT05GSUdfQ0NfQUxJR05fSlVNUFM9MAorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAorQ09ORklHX09CU09MRVRFX01PRFBBUk09eQorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKKworIworIyBCbG9jayBsYXllcgorIworCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKK0NPTkZJR19ERUZBVUxUX0FTPXkKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQUFFQzIwMDAgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMD15CisKKyMKKyMgQVQ5MVJNOTIwMCBJbXBsZW1lbnRhdGlvbnMKKyMKKworIworIyBBVDkxUk05MjAwIEJvYXJkIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMERLIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfQVQ5MVJNOTIwMEVLIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfQ1NCMzM3IGlzIG5vdCBzZXQKK0NPTkZJR19NQUNIX0NTQjYzNz15CisjIENPTkZJR19NQUNIX0NBUk1FVkEgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9LQjkyMDAgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9BVEVCOTIwMCBpcyBub3Qgc2V0CisKKyMKKyMgQVQ5MVJNOTIwMCBGZWF0dXJlIFNlbGVjdGlvbnMKKyMKK0NPTkZJR19BVDkxX1BST0dSQU1NQUJMRV9DTE9DS1M9eQorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfQVJNOTIwVD15CitDT05GSUdfQ1BVXzMydjQ9eQorQ09ORklHX0NQVV9BQlJUX0VWNFQ9eQorQ09ORklHX0NQVV9DQUNIRV9WNFdUPXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX0NPUFlfVjRXQj15CitDT05GSUdfQ1BVX1RMQl9WNFdCST15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisjIENPTkZJR19BUk1fVEhVTUIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworQ09ORklHX1BDQ0FSRD15CisjIENPTkZJR19QQ01DSUFfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BDTUNJQT15CitDT05GSUdfUENNQ0lBX0xPQURfQ0lTPXkKK0NPTkZJR19QQ01DSUFfSU9DVEw9eQorCisjCisjIFBDLWNhcmQgYnJpZGdlcworIworQ09ORklHX0FUOTFfQ0Y9eQorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19OT19JRExFX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00MDk2CitDT05GSUdfTEVEUz15CitDT05GSUdfTEVEU19USU1FUj15CitDT05GSUdfTEVEU19DUFU9eQorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9Im1lbT0zMk0gY29uc29sZT10dHlTMCwzODQwMCBpbml0cmQ9MHgyMDQxMDAwMCwzMTQ1NzI4IHJvb3Q9L2Rldi9yYW0wIHJ3IgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUlRIVVIgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19CSUM9eQorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CitDT05GSUdfRldfTE9BREVSPXkKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgorIworIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKKyMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NTQjYzNz15CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVQ5MV9EQVRBRkxBU0ggaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBPbmVOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VQiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT04MTkyCitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTST15CitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworIyBDT05GSUdfQkxLX0RFVl9TRCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0cgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAorCisjCisjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcworIworIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIFRyYW5zcG9ydCBBdHRyaWJ1dGVzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAorCisjCisjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKKyMKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBVEEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUENNQ0lBIFNDU0kgYWRhcHRlciBzdXBwb3J0CisjCisjIENPTkZJR19QQ01DSUFfQUhBMTUyWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfRkRPTUFJTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfTklOSkFfU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfUUxPR0lDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9TWU01M0M1MDAgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBQSFkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorQ09ORklHX0FSTV9BVDkxX0VUSEVSPXkKKyMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CisjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFBDTUNJQSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ORVRfUENNQ0lBIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQVQ5MT15CitDT05GSUdfU0VSSUFMX0FUOTFfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfQVQ5MV9UVFlBVCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCitDT05GSUdfV0FUQ0hET0c9eQorQ09ORklHX1dBVENIRE9HX05PV0FZT1VUPXkKKworIworIyBXYXRjaGRvZyBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfQVQ5MV9XQVRDSERPRz15CisKKyMKKyMgVVNCLWJhc2VkIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19VU0JQQ1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19SVEM9eQorIyBDT05GSUdfQVQ5MV9SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisKKyMKKyMgUENNQ0lBIGNoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19TWU5DTElOS19DUyBpcyBub3Qgc2V0CisjIENPTkZJR19DQVJETUFOXzQwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ0FSRE1BTl80MDQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFTENMT0NLIGlzIG5vdCBzZXQKK0NPTkZJR19BVDkxX1NQST15CitDT05GSUdfQVQ5MV9TUElERVY9eQorCisjCisjIEkyQyBzdXBwb3J0CisjCitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CisKKyMKKyMgSTJDIEFsZ29yaXRobXMKKyMKKyMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKK0NPTkZJR19JMkNfQVQ5MT15CisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19YMTIwNV9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjCitDT05GSUdfSFdNT049eQorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBDYXBhYmlsaXRpZXMgUG9ydCBkcml2ZXJzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CitDT05GSUdfVVNCPXkKK0NPTkZJR19VU0JfREVCVUc9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKK0NPTkZJR19VU0JfREVWSUNFRlM9eQorIyBDT05GSUdfVVNCX0JBTkRXSURUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0hDRD15CisjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfT0hDSV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMKK0NPTkZJR19VU0JfU1RPUkFHRT15CisjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfRFBDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9VU0JBVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW5wdXQgRGV2aWNlcworIworIyBDT05GSUdfVVNCX0hJRCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhJRCBCb290IFByb3RvY29sIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9LQkQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BSVBURUsgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dBQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BQ0VDQUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tCVEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QT1dFUk1BVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01UT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVRNVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VHQUxBWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWUVBTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWFBBRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVRJX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFVE9VQ0ggaXMgbm90IHNldAorCisjCisjIFVTQiBJbWFnaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKKworIworIyBVU0IgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19VU0JfREFCVVNCIGlzIG5vdCBzZXQKKworIworIyBWaWRlbzRMaW51eCBzdXBwb3J0IGlzIG5lZWRlZCBmb3IgVVNCIE11bHRpbWVkaWEgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBVU0IgTmV0d29yayBBZGFwdGVycworIworIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTU9OPXkKKworIworIyBVU0IgcG9ydCBkcml2ZXJzCisjCisKKyMKKyMgVVNCIFNlcmlhbCBDb252ZXJ0ZXIgc3VwcG9ydAorIworQ09ORklHX1VTQl9TRVJJQUw9eQorQ09ORklHX1VTQl9TRVJJQUxfQ09OU09MRT15CitDT05GSUdfVVNCX1NFUklBTF9HRU5FUklDPXkKKyMgQ09ORklHX1VTQl9TRVJJQUxfQUlSUFJJTUUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9BTllEQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQkVMS0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfV0hJVEVIRUFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRElHSV9BQ0NFTEVQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQ1AyMTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQ1lQUkVTU19NOCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0VNUEVHIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfU0VSSUFMX0ZURElfU0lPPXkKKyMgQ09ORklHX1VTQl9TRVJJQUxfVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9JUEFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfSVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9FREdFUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0VER0VQT1JUX1RJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfR0FSTUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfSVBXIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9QREEgaXMgbm90IHNldAorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTj15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX01QUj15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTI4PXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMjhYPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMjhYQT15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTI4WEI9eQorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0ExOT15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTE4WD15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTE5Vz15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTE5UVc9eQorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0ExOVFJPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBNDlXPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBNDlXTEM9eQorIyBDT05GSUdfVVNCX1NFUklBTF9LTFNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfS09CSUxfU0NUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfU0VSSUFMX01DVF9VMjMyPXkKKyMgQ09ORklHX1VTQl9TRVJJQUxfUEwyMzAzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfSFA0WCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1NBRkUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9USSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0NZQkVSSkFDSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1hJUkNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX09QVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX09NTklORVQgaXMgbm90IHNldAorQ09ORklHX1VTQl9FWlVTQj15CisKKyMKKyMgVVNCIE1pc2NlbGxhbmVvdXMgZHJpdmVycworIworIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BISURHRVRLSVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BISURHRVRTRVJWTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSURNT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAorCisjCisjIFVTQiBEU0wgbW9kZW0gc3VwcG9ydAorIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KQkQgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorIyBDT05GSUdfUkVMQVlGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19DUkFNRlM9eQorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNfVjQ9eQorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CitDT05GSUdfU1VOUlBDX0dTUz15CitDT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVVNFUj15CisjIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19FUlJPUlMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0xMPXkKKyMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCitDT05GSUdfQ1JZUFRPPXkKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19NRDU9eQorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fREVTPXkKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2Vic2ExMTBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9lYnNhMTEwX2RlZmNvbmZpZwppbmRleCA2ZjYxOTI5Li5hZmNmZmY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2Vic2ExMTBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvZWJzYTExMF9kZWZjb25maWcKQEAgLTYzLDcgKzYzLDYgQEAKICMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9FQlNBMTEwPXkKLSMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvZWRiNzIxMV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2VkYjcyMTFfZGVmY29uZmlnCmluZGV4IDc4YjA4ZWQuLjZiYTczNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvZWRiNzIxMV9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9lZGI3MjExX2RlZmNvbmZpZwpAQCAtNTcsNyArNTcsNiBAQAogQ09ORklHX0FSQ0hfQ0xQUzcxMVg9eQogIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9lbnAyNjExX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvZW5wMjYxMV9kZWZjb25maWcKaW5kZXggZmQ3YzAwNC4uOTU5MmUzOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9lbnAyNjExX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2VucDI2MTFfZGVmY29uZmlnCkBAIC04Niw3ICs4Niw2IEBACiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvZXA4MDIxOV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2VwODAyMTlfZGVmY29uZmlnCmluZGV4IDk2MzQyYWYuLjNjNzNiNzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvZXA4MDIxOV9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9lcDgwMjE5X2RlZmNvbmZpZwpAQCAtNjQsNyArNjQsNiBAQAogIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9JT1AzWFg9eQpAQCAtNTIzLDYgKzUyMiw3IEBACiAjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKIENPTkZJR19FMTAwMD15CiBDT05GSUdfRTEwMDBfTkFQST15CisjIENPTkZJR19FMTAwMF9ESVNBQkxFX1BBQ0tFVF9TUExJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAogIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvZXB4YTEwZGJfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9lcHhhMTBkYl9kZWZjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYjhiNTguLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9lcHhhMTBkYl9kZWZjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw2NDQgKzAsMCBAQAotIwotIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKLSMgU3VuIE1hciAyNyAyMjo0Njo1MSAyMDA1Ci0jCi1DT05GSUdfQVJNPXkKLUNPTkZJR19NTVU9eQotQ09ORklHX1VJRDE2PXkKLUNPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKLUNPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15Ci1DT05GSUdfR0VORVJJQ19JT01BUD15Ci0KLSMKLSMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCi0jCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLUNPTkZJR19DTEVBTl9DT01QSUxFPXkKLUNPTkZJR19CUk9LRU5fT05fU01QPXkKLQotIwotIyBHZW5lcmFsIHNldHVwCi0jCi1DT05GSUdfTE9DQUxWRVJTSU9OPSIiCi1DT05GSUdfU1dBUD15Ci1DT05GSUdfU1lTVklQQz15Ci0jIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAotIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMPXkKLSMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAotQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKLSMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKLUNPTkZJR19LQUxMU1lNUz15Ci0jIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKLUNPTkZJR19CQVNFX0ZVTEw9eQotQ09ORklHX0ZVVEVYPXkKLUNPTkZJR19FUE9MTD15Ci1DT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQotQ09ORklHX1NITUVNPXkKLUNPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAotQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCi1DT05GSUdfQ0NfQUxJR05fTE9PUFM9MAotQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKLSMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAotQ09ORklHX0JBU0VfU01BTEw9MAotCi0jCi0jIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0Ci0jCi1DT05GSUdfTU9EVUxFUz15Ci1DT05GSUdfTU9EVUxFX1VOTE9BRD15Ci0jIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKLSMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LTU9EIGlzIG5vdCBzZXQKLQotIwotIyBTeXN0ZW0gVHlwZQotIwotIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLUNPTkZJR19BUkNIX0NBTUVMT1Q9eQotIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAotCi0jCi0jIEVweGExMGRiCi0jCi0KLSMKLSMgUExEIGhvdHN3YXAgc3VwcG9ydAotIwotQ09ORklHX1BMRD15Ci0jIENPTkZJR19QTERfSE9UU1dBUCBpcyBub3Qgc2V0Ci0KLSMKLSMgUHJvY2Vzc29yIFR5cGUKLSMKLUNPTkZJR19DUFVfMzI9eQotQ09ORklHX0NQVV9BUk05MjJUPXkKLUNPTkZJR19DUFVfMzJ2ND15Ci1DT05GSUdfQ1BVX0FCUlRfRVY0VD15Ci1DT05GSUdfQ1BVX0NBQ0hFX1Y0V1Q9eQotQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKLUNPTkZJR19DUFVfQ09QWV9WNFdCPXkKLUNPTkZJR19DUFVfVExCX1Y0V0JJPXkKLQotIwotIyBQcm9jZXNzb3IgRmVhdHVyZXMKLSMKLSMgQ09ORklHX0FSTV9USFVNQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKLQotIwotIyBCdXMgc3VwcG9ydAotIwotCi0jCi0jIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgS2VybmVsIEZlYXR1cmVzCi0jCi0jIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKLUNPTkZJR19BTElHTk1FTlRfVFJBUD15Ci0KLSMKLSMgQm9vdCBvcHRpb25zCi0jCi1DT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCi1DT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKLUNPTkZJR19DTURMSU5FPSJtZW09MzJNIGNvbnNvbGU9dHR5VUEwLDExNTIwMCBpbml0cmQ9MHgwMDIwMDAwMCw4TSByb290PS9kZXYvcmFtMCBydyIKLSMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAotCi0jCi0jIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgotIwotCi0jCi0jIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAotIwotQ09ORklHX0ZQRV9OV0ZQRT15Ci0jIENPTkZJR19GUEVfTldGUEVfWFAgaXMgbm90IHNldAotIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAotCi0jCi0jIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cwotIwotQ09ORklHX0JJTkZNVF9FTEY9eQotIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAotIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAotIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKLQotIwotIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKLSMKLSMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLQotIwotIyBEZXZpY2UgRHJpdmVycwotIwotCi0jCi0jIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKLSMKLUNPTkZJR19TVEFOREFMT05FPXkKLUNPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKLSMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwotIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKLQotIwotIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKLSMKLSMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAotCi0jCi0jIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAotIwotCi0jCi0jIEJsb2NrIGRldmljZXMKLSMKLSMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0xPT1A9eQotIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX1JBTT15Ci1DT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKLUNPTkZJR19CTEtfREVWX1JBTV9TSVpFPTgxOTIKLUNPTkZJR19CTEtfREVWX0lOSVRSRD15Ci1DT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgotIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0Ci0KLSMKLSMgSU8gU2NoZWR1bGVycwotIwotQ09ORklHX0lPU0NIRURfTk9PUD15Ci1DT05GSUdfSU9TQ0hFRF9BUz15Ci1DT05GSUdfSU9TQ0hFRF9ERUFETElORT15Ci1DT05GSUdfSU9TQ0hFRF9DRlE9eQotIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKLQotIwotIyBTQ1NJIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQotIwotIyBDT05GSUdfTUQgaXMgbm90IHNldAotCi0jCi0jIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKLSMKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgTmV0d29ya2luZyBzdXBwb3J0Ci0jCi1DT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLUNPTkZJR19QQUNLRVQ9eQotIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAotQ09ORklHX1VOSVg9eQotIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVD15Ci1DT05GSUdfSVBfTVVMVElDQVNUPXkKLSMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfUE5QPXkKLSMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSUEQgaXMgbm90IHNldAotIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCi0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayB0ZXN0aW5nCi0jCi0jIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JUIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRERVZJQ0VTPXkKLSMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAotIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RVTiBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCi0jCi0jIENPTkZJR19ORVRfRVRIRVJORVQgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCi0jCi0KLSMKLSMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCi0jCi0KLSMKLSMgVG9rZW4gUmluZyBkZXZpY2VzCi0jCi0KLSMKLSMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCi0jCi0jIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAotCi0jCi0jIFdhbiBpbnRlcmZhY2VzCi0jCi0jIENPTkZJR19XQU4gaXMgbm90IHNldAotQ09ORklHX1BQUD15Ci1DT05GSUdfUFBQX01VTFRJTElOSz15Ci0jIENPTkZJR19QUFBfRklMVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19QUFBfQVNZTkM9eQotQ09ORklHX1BQUF9TWU5DX1RUWT15Ci1DT05GSUdfUFBQX0RFRkxBVEU9eQotIyBDT05GSUdfUFBQX0JTRENPTVAgaXMgbm90IHNldAotIyBDT05GSUdfUFBQT0UgaXMgbm90IHNldAotIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0Ci0KLSMKLSMgSVNETiBzdWJzeXN0ZW0KLSMKLSMgQ09ORklHX0lTRE4gaXMgbm90IHNldAotCi0jCi0jIElucHV0IGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfSU5QVVQ9eQotCi0jCi0jIFVzZXJsYW5kIGludGVyZmFjZXMKLSMKLUNPTkZJR19JTlBVVF9NT1VTRURFVj15Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKLSMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgRGV2aWNlIERyaXZlcnMKLSMKLSMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIEkvTyBwb3J0cwotIwotQ09ORklHX1NFUklPPXkKLUNPTkZJR19TRVJJT19TRVJQT1JUPXkKLSMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfU09VTkRfR0FNRVBPUlQ9eQotCi0jCi0jIENoYXJhY3RlciBkZXZpY2VzCi0jCi1DT05GSUdfVlQ9eQotQ09ORklHX1ZUX0NPTlNPTEU9eQotQ09ORklHX0hXX0NPTlNPTEU9eQotIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKLQotIwotIyBTZXJpYWwgZHJpdmVycwotIwotIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAotCi0jCi0jIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKLSMKLUNPTkZJR19TRVJJQUxfVUFSVDAwPXkKLUNPTkZJR19TRVJJQUxfVUFSVDAwX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF9DT1JFPXkKLUNPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKLUNPTkZJR19VTklYOThfUFRZUz15Ci1DT05GSUdfTEVHQUNZX1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2Ci0KLSMKLSMgSVBNSQotIwotIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwotIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAotIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAotIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RUTEsgaXMgbm90IHNldAotIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAotCi0jCi0jIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgotIwotIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAotCi0jCi0jIFRQTSBkZXZpY2VzCi0jCi0jIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgc3VwcG9ydAotIwotIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjIGRldmljZXMKLSMKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKLQotIwotIyBHcmFwaGljcyBzdXBwb3J0Ci0jCi0jIENPTkZJR19GQiBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0Ci0jCi0jIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0Ci1DT05GSUdfRFVNTVlfQ09OU09MRT15Ci0KLSMKLSMgU291bmQKLSMKLSMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKLQotIwotIyBVU0Igc3VwcG9ydAotIwotQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQotIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAotIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKLSMgQ09ORklHX01NQyBpcyBub3Qgc2V0Ci0KLSMKLSMgRmlsZSBzeXN0ZW1zCi0jCi1DT05GSUdfRVhUMl9GUz15Ci0jIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgWEZTIHN1cHBvcnQKLSMKLSMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci1DT05GSUdfRE5PVElGWT15Ci1DT05GSUdfQVVUT0ZTX0ZTPXkKLUNPTkZJR19BVVRPRlM0X0ZTPXkKLQotIwotIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQc2V1ZG8gZmlsZXN5c3RlbXMKLSMKLUNPTkZJR19QUk9DX0ZTPXkKLUNPTkZJR19TWVNGUz15Ci0jIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAotIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKLUNPTkZJR19SQU1GUz15Ci0KLSMKLSMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcwotIwotIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAotIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayBGaWxlIFN5c3RlbXMKLSMKLSMgQ09ORklHX05GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKLUNPTkZJR19TTUJfRlM9eQotIyBDT05GSUdfU01CX05MU19ERUZBVUxUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQYXJ0aXRpb24gVHlwZXMKLSMKLSMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLQotIwotIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAotIwotQ09ORklHX05MUz15Ci1DT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKLSMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKLQotIwotIyBQcm9maWxpbmcgc3VwcG9ydAotIwotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci1DT05GSUdfREVCVUdfQlVHVkVSQk9TRT15Ci1DT05GSUdfRlJBTUVfUE9JTlRFUj15Ci0jIENPTkZJR19ERUJVR19VU0VSIGlzIG5vdCBzZXQKLQotIwotIyBTZWN1cml0eSBvcHRpb25zCi0jCi0jIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLQotIwotIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKLSMKLSMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKLSMKLQotIwotIyBMaWJyYXJ5IHJvdXRpbmVzCi0jCi1DT05GSUdfQ1JDX0NDSVRUPXkKLUNPTkZJR19DUkMzMj15Ci0jIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAotQ09ORklHX1pMSUJfSU5GTEFURT15Ci1DT05GSUdfWkxJQl9ERUZMQVRFPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvZm9vdGJyaWRnZV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2Zvb3RicmlkZ2VfZGVmY29uZmlnCmluZGV4IDk3MzdjNDguLjJhNjEyZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvZm9vdGJyaWRnZV9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9mb290YnJpZGdlX2RlZmNvbmZpZwpAQCAtNjMsNyArNjMsNiBAQAogIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfRk9PVEJSSURHRT15CiAjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9mb3J0dW5ldF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2ZvcnR1bmV0X2RlZmNvbmZpZwppbmRleCBiNmY2ODhkLi42NWRjNzNhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2ZvcnR1bmV0X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2ZvcnR1bmV0X2RlZmNvbmZpZwpAQCAtNTcsNyArNTcsNiBAQAogQ09ORklHX0FSQ0hfQ0xQUzcxMVg9eQogIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9oMzYwMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2gzNjAwX2RlZmNvbmZpZwppbmRleCBiOWRlMDdkLi43YTBkYTBiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2gzNjAwX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2gzNjAwX2RlZmNvbmZpZwpAQCAtNjUsNyArNjUsNiBAQAogIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2g3MjAxX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaDcyMDFfZGVmY29uZmlnCmluZGV4IDM5YzEzYTMuLjExNjkyMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvaDcyMDFfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvaDcyMDFfZGVmY29uZmlnCkBAIC02MCw3ICs2MCw2IEBACiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvaDcyMDJfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9oNzIwMl9kZWZjb25maWcKaW5kZXggZmJmNWMyNC4uOWQ2MmVkMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9oNzIwMl9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9oNzIwMl9kZWZjb25maWcKQEAgLTYzLDcgKzYzLDYgQEAKICMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9oYWNra2l0X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaGFja2tpdF9kZWZjb25maWcKaW5kZXggZmI0MWEzNi4uYTQ1YjU3NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9oYWNra2l0X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2hhY2traXRfZGVmY29uZmlnCkBAIC02Niw3ICs2Niw2IEBACiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvaW50ZWdyYXRvcl9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2ludGVncmF0b3JfZGVmY29uZmlnCmluZGV4IDI3ZWU3NjguLmQxYmE3ZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvaW50ZWdyYXRvcl9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9pbnRlZ3JhdG9yX2RlZmNvbmZpZwpAQCAtNjUsNyArNjUsNiBAQAogIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0lOVEVHUkFUT1I9eQogIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9pcTMxMjQ0X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXEzMTI0NF9kZWZjb25maWcKaW5kZXggZTcxNDQzYi4uMzI0NjcxNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9pcTMxMjQ0X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2lxMzEyNDRfZGVmY29uZmlnCkBAIC02NSw3ICs2NSw2IEBACiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0lPUDNYWD15CkBAIC00OTQsNiArNDkzLDcgQEAKICMgQ09ORklHX0RMMksgaXMgbm90IHNldAogQ09ORklHX0UxMDAwPXkKIENPTkZJR19FMTAwMF9OQVBJPXkKKyMgQ09ORklHX0UxMDAwX0RJU0FCTEVfUEFDS0VUX1NQTElUIGlzIG5vdCBzZXQKICMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9pcTgwMzIxX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXE4MDMyMV9kZWZjb25maWcKaW5kZXggYWI1YWQyMy4uYjAwMGRhNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9pcTgwMzIxX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2lxODAzMjFfZGVmY29uZmlnCkBAIC02NCw3ICs2NCw2IEBACiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0lPUDNYWD15CkBAIC00MTYsNiArNDE1LDcgQEAKICMgQ09ORklHX0RMMksgaXMgbm90IHNldAogQ09ORklHX0UxMDAwPXkKIENPTkZJR19FMTAwMF9OQVBJPXkKKyMgQ09ORklHX0UxMDAwX0RJU0FCTEVfUEFDS0VUX1NQTElUIGlzIG5vdCBzZXQKICMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9pcTgwMzMxX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXE4MDMzMV9kZWZjb25maWcKaW5kZXggYmI1MzYxMy4uNDZjNzllMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9pcTgwMzMxX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2lxODAzMzFfZGVmY29uZmlnCkBAIC02NCw3ICs2NCw2IEBACiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0lPUDNYWD15CkBAIC00OTcsNiArNDk2LDcgQEAKICMgQ09ORklHX0RMMksgaXMgbm90IHNldAogQ09ORklHX0UxMDAwPXkKIENPTkZJR19FMTAwMF9OQVBJPXkKKyMgQ09ORklHX0UxMDAwX0RJU0FCTEVfUEFDS0VUX1NQTElUIGlzIG5vdCBzZXQKICMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9pcTgwMzMyX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXE4MDMzMl9kZWZjb25maWcKaW5kZXggMzA1ZjAxZi4uMTE5NTliNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9pcTgwMzMyX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2lxODAzMzJfZGVmY29uZmlnCkBAIC02NCw3ICs2NCw2IEBACiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0lPUDNYWD15CkBAIC00OTcsNiArNDk2LDcgQEAKICMgQ09ORklHX0RMMksgaXMgbm90IHNldAogQ09ORklHX0UxMDAwPXkKIENPTkZJR19FMTAwMF9OQVBJPXkKKyMgQ09ORklHX0UxMDAwX0RJU0FCTEVfUEFDS0VUX1NQTElUIGlzIG5vdCBzZXQKICMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9peGRwMjQwMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2l4ZHAyNDAwX2RlZmNvbmZpZwppbmRleCBlNmE0ZDI2Li5kOWQ2YmI4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2l4ZHAyNDAwX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2l4ZHAyNDAwX2RlZmNvbmZpZwpAQCAtODYsNyArODYsNiBAQAogIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2l4ZHAyNDAxX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI0MDFfZGVmY29uZmlnCmluZGV4IDU1NzJjZjkuLjJkYzlkNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI0MDFfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI0MDFfZGVmY29uZmlnCkBAIC04Niw3ICs4Niw2IEBACiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI4MDBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9peGRwMjgwMF9kZWZjb25maWcKaW5kZXggMGZkZGJkZS4uNDI0ODEyMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9peGRwMjgwMF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9peGRwMjgwMF9kZWZjb25maWcKQEAgLTg2LDcgKzg2LDYgQEAKICMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9peGRwMjgwMV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2l4ZHAyODAxX2RlZmNvbmZpZwppbmRleCA4OWI5YWEwLi5lYThmNGI0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2l4ZHAyODAxX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2l4ZHAyODAxX2RlZmNvbmZpZwpAQCAtODYsNyArODYsNiBAQAogIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2l4cDR4eF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2l4cDR4eF9kZWZjb25maWcKaW5kZXggZjc0YzkyNi4uNDk3NWI5MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9peHA0eHhfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXhwNHh4X2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xNC1yYzEtZ2l0NQotIyBUdWUgU2VwIDIwIDE3OjI2OjI4IDIwMDUKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xNQorIyBUdWUgSmFuICAzIDAzOjIwOjQwIDIwMDYKICMKIENPTkZJR19BUk09eQogQ09ORklHX01NVT15CkBAIC0zMyw2ICszMyw3IEBACiBDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiBDT05GSUdfRU1CRURERUQ9eQogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CkBAIC00Miw3ICs0Myw2IEBACiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfRVBPTEw9eQotQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKIENPTkZJR19DQ19BTElHTl9MQUJFTFM9MApAQCAtNjIsMTMgKzYyLDI5IEBACiBDT05GSUdfS01PRD15CiAKICMKKyMgQmxvY2sgbGF5ZXIKKyMKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CitDT05GSUdfREVGQVVMVF9BUz15CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCisKKyMKICMgU3lzdGVtIFR5cGUKICMKICMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CkBAIC04Myw2ICs5OSw3IEBACiAjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUkVBTFZJRVcgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0FBRUMyMDAwIGlzIG5vdCBzZXQKQEAgLTEwMiw2ICsxMTksNyBAQAogQ09ORklHX01BQ0hfSVhEUDQ2NT15CiBDT05GSUdfQVJDSF9JWENEUDExMDA9eQogQ09ORklHX0FSQ0hfUFJQTUMxMTAwPXkKK0NPTkZJR19NQUNIX05BUzEwMEQ9eQogQ09ORklHX0FSQ0hfSVhEUDRYWD15CiBDT05GSUdfQ1BVX0lYUDQ2WD15CiAjIENPTkZJR19NQUNIX0dUV1g1NzE1IGlzIG5vdCBzZXQKQEAgLTE1NSw2ICsxNzMsNyBAQAogQ09ORklHX0ZMQVRNRU09eQogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKICMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQwOTYKIENPTkZJR19BTElHTk1FTlRfVFJBUD15CiAKICMKQEAgLTE3Myw2ICsxOTIsNyBAQAogIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKICMKIENPTkZJR19GUEVfTldGUEU9eQorIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKIAogIwpAQCAtMTg3LDYgKzIwNyw4IEBACiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogQ09ORklHX1BNPXkKK0NPTkZJR19QTV9MRUdBQ1k9eQorIyBDT05GSUdfUE1fREVCVUcgaXMgbm90IHNldAogQ09ORklHX0FQTT15CiAKICMKQEAgLTI3MSw2ICsyOTMsMTAgQEAKIENPTkZJR19ORVRGSUxURVI9eQogIyBDT05GSUdfTkVURklMVEVSX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19CUklER0VfTkVURklMVEVSPXkKKworIworIyBDb3JlIE5ldGZpbHRlciBDb25maWd1cmF0aW9uCisjCiAjIENPTkZJR19ORVRGSUxURVJfTkVUTElOSyBpcyBub3Qgc2V0CiAKICMKQEAgLTI4Niw2ICszMTIsNyBAQAogIyBDT05GSUdfSVBfTkZfTkVUQklPU19OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9ORl9URlRQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX05GX0FNQU5EQSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9QUFRQIGlzIG5vdCBzZXQKIENPTkZJR19JUF9ORl9RVUVVRT1tCiBDT05GSUdfSVBfTkZfSVBUQUJMRVM9bQogQ09ORklHX0lQX05GX01BVENIX0xJTUlUPW0KQEAgLTMxOSw2ICszNDYsNyBAQAogQ09ORklHX0lQX05GX1RBUkdFVF9MT0c9bQogQ09ORklHX0lQX05GX1RBUkdFVF9VTE9HPW0KIENPTkZJR19JUF9ORl9UQVJHRVRfVENQTVNTPW0KKyMgQ09ORklHX0lQX05GX1RBUkdFVF9ORlFVRVVFIGlzIG5vdCBzZXQKIENPTkZJR19JUF9ORl9OQVQ9bQogQ09ORklHX0lQX05GX05BVF9ORUVERUQ9eQogQ09ORklHX0lQX05GX1RBUkdFVF9NQVNRVUVSQURFPW0KQEAgLTM4MCwxMCArNDA4LDE4IEBACiBDT05GSUdfRUNPTkVUX0FVTlVEUD15CiBDT05GSUdfRUNPTkVUX05BVElWRT15CiBDT05GSUdfV0FOX1JPVVRFUj1tCisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCiBDT05GSUdfTkVUX1NDSEVEPXkKIENPTkZJR19ORVRfU0NIX0NMS19KSUZGSUVTPXkKICMgQ09ORklHX05FVF9TQ0hfQ0xLX0dFVFRJTUVPRkRBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfU0NIX0NMS19DUFUgaXMgbm90IHNldAorCisjCisjIFF1ZXVlaW5nL1NjaGVkdWxpbmcKKyMKIENPTkZJR19ORVRfU0NIX0NCUT1tCiBDT05GSUdfTkVUX1NDSF9IVEI9bQogIyBDT05GSUdfTkVUX1NDSF9IRlNDIGlzIG5vdCBzZXQKQEAgLTM5Nyw4ICs0MzMsMTAgQEAKIENPTkZJR19ORVRfU0NIX0RTTUFSSz1tCiAjIENPTkZJR19ORVRfU0NIX05FVEVNIGlzIG5vdCBzZXQKIENPTkZJR19ORVRfU0NIX0lOR1JFU1M9bQotQ09ORklHX05FVF9RT1M9eQotQ09ORklHX05FVF9FU1RJTUFUT1I9eQorCisjCisjIENsYXNzaWZpY2F0aW9uCisjCiBDT05GSUdfTkVUX0NMUz15CiAjIENPTkZJR19ORVRfQ0xTX0JBU0lDIGlzIG5vdCBzZXQKIENPTkZJR19ORVRfQ0xTX1RDSU5ERVg9bQpAQCAtNDA3LDEzICs0NDUsMTQgQEAKIENPTkZJR19ORVRfQ0xTX0ZXPW0KIENPTkZJR19ORVRfQ0xTX1UzMj1tCiAjIENPTkZJR19DTFNfVTMyX1BFUkYgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0NMU19JTkQgaXMgbm90IHNldAogIyBDT05GSUdfQ0xTX1UzMl9NQVJLIGlzIG5vdCBzZXQKIENPTkZJR19ORVRfQ0xTX1JTVlA9bQogQ09ORklHX05FVF9DTFNfUlNWUDY9bQogIyBDT05GSUdfTkVUX0VNQVRDSCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfQ0xTX0FDVCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUX0NMU19QT0xJQ0U9eQorIyBDT05GSUdfTkVUX0NMU19JTkQgaXMgbm90IHNldAorQ09ORklHX05FVF9FU1RJTUFUT1I9eQogCiAjCiAjIE5ldHdvcmsgdGVzdGluZwpAQCAtNDM3LDYgKzQ3NiwxMSBAQAogIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKIAogIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorCisjCiAjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKICMKIENPTkZJR19NVEQ9eQpAQCAtNDU4LDYgKzUwMiw3IEBACiAjIENPTkZJR19GVEwgaXMgbm90IHNldAogIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKIAogIwogIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycwpAQCAtNDkyLDcgKzUzNyw2IEBACiAjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQVJNX0lOVEVHUkFUT1IgaXMgbm90IHNldAogQ09ORklHX01URF9JWFA0WFg9eQotIyBDT05GSUdfTVREX0VEQjczMTIgaXMgbm90IHNldAogIyBDT05GSUdfTVREX1BDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CiAKQEAgLTUyMyw2ICs1NjcsMTEgQEAKICMgQ09ORklHX01URF9OQU5EX05BTkRTSU0gaXMgbm90IHNldAogCiAjCisjIE9uZU5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIwogIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKICMKICMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldApAQCAtNTQ4LDE0ICs1OTcsNiBAQAogQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAotCi0jCi0jIElPIFNjaGVkdWxlcnMKLSMKLUNPTkZJR19JT1NDSEVEX05PT1A9eQotQ09ORklHX0lPU0NIRURfQVM9eQotQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQotQ09ORklHX0lPU0NIRURfQ0ZRPXkKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CiAKICMKQEAgLTY2OCw2ICs3MDksNyBAQAogQ09ORklHX01JST15CiAjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAogIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBU1NJTkkgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CiAjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldApAQCAtNzM5LDYgKzc4MSw3IEBACiAjCiAjIFdpcmVsZXNzIDgwMi4xMWIgSVNBL1BDSSBjYXJkcyBzdXBwb3J0CiAjCisjIENPTkZJR19BSVJPIGlzIG5vdCBzZXQKIENPTkZJR19IRVJNRVM9eQogIyBDT05GSUdfUExYX0hFUk1FUyBpcyBub3Qgc2V0CiAjIENPTkZJR19UTURfSEVSTUVTIGlzIG5vdCBzZXQKQEAgLTc4Miw2ICs4MjUsNyBAQAogIwogIyBBVE0gZHJpdmVycwogIworIyBDT05GSUdfQVRNX0RVTU1ZIGlzIG5vdCBzZXQKIENPTkZJR19BVE1fVENQPW0KICMgQ09ORklHX0FUTV9MQU5BSSBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE1fRU5JIGlzIG5vdCBzZXQKQEAgLTkwMiw2ICs5NDYsNyBAQAogIyBUUE0gZGV2aWNlcwogIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisjIENPTkZJR19URUxDTE9DSyBpcyBub3Qgc2V0CiAKICMKICMgSTJDIHN1cHBvcnQKQEAgLTk1NCw2ICs5OTksNyBAQAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUlRDODU2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX1gxMjA1X0kyQyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKQEAgLTEwMzYsNiArMTA4MiwxMCBAQAogIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKIAogIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisKKyMKICMgVVNCIEdhZGdldCBTdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKQEAgLTExMTAsNiArMTE2MCw3IEBACiBDT05GSUdfSkZGUzJfRlM9eQogQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKIENPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUj15CisjIENPTkZJR19KRkZTMl9TVU1NQVJZIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAogQ09ORklHX0pGRlMyX1pMSUI9eQogQ09ORklHX0pGRlMyX1JUSU1FPXkKQEAgLTExOTAsNyArMTI0MSw5IEBACiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CiAjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKIENPTkZJR19GUkFNRV9QT0lOVEVSPXkKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfVVNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRVJST1JTPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvam9ybmFkYTcyMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2pvcm5hZGE3MjBfZGVmY29uZmlnCmluZGV4IGI4OGFlYmEuLmFkMTA0OGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3Mvam9ybmFkYTcyMF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9qb3JuYWRhNzIwX2RlZmNvbmZpZwpAQCAtNjMsNyArNjMsNiBAQAogIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2xhcnRfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9sYXJ0X2RlZmNvbmZpZwppbmRleCA3MDMzODI5Li5jM2E5MzI4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2xhcnRfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvbGFydF9kZWZjb25maWcKQEAgLTYyLDcgKzYyLDYgQEAKICMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9scGQ3YTQwMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2xwZDdhNDAwX2RlZmNvbmZpZwppbmRleCBkNjQ3MDZkLi42N2VhYTI2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2xwZDdhNDAwX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2xwZDdhNDAwX2RlZmNvbmZpZwpAQCAtNjAsNyArNjAsNiBAQAogIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2xwZDdhNDA0X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbHBkN2E0MDRfZGVmY29uZmlnCmluZGV4IDg3Y2JlZGYuLjIwOGQ1OTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvbHBkN2E0MDRfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvbHBkN2E0MDRfZGVmY29uZmlnCkBAIC02MCw3ICs2MCw2IEBACiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbHViYm9ja19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2x1YmJvY2tfZGVmY29uZmlnCmluZGV4IDRiYzg3MTcuLjgxZGFhZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvbHViYm9ja19kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9sdWJib2NrX2RlZmNvbmZpZwpAQCAtNjMsNyArNjMsNiBAQAogIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2x1c2w3MjAwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbHVzbDcyMDBfZGVmY29uZmlnCmluZGV4IDNjYTY0Y2EuLjQyZjZhNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvbHVzbDcyMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvbHVzbDcyMDBfZGVmY29uZmlnCkBAIC02Miw3ICs2Miw2IEBACiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbWFpbnN0b25lX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbWFpbnN0b25lX2RlZmNvbmZpZwppbmRleCAxNTNkNjg1Li5iMTEyYmQ3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL21haW5zdG9uZV9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9tYWluc3RvbmVfZGVmY29uZmlnCkBAIC02Myw3ICs2Myw2IEBACiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbXgxYWRzX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbXgxYWRzX2RlZmNvbmZpZwppbmRleCA2NTE3ZDE2Li5kMTZmNmNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL214MWFkc19kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9teDFhZHNfZGVmY29uZmlnCkBAIC02Myw3ICs2Myw2IEBACiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbmVwb25zZXRfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9uZXBvbnNldF9kZWZjb25maWcKaW5kZXggN2ZiMWY3Yy4uM2QzNTI1NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9uZXBvbnNldF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9uZXBvbnNldF9kZWZjb25maWcKQEAgLTY1LDcgKzY1LDYgQEAKICMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9uZXR3aW5kZXJfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9uZXR3aW5kZXJfZGVmY29uZmlnCmluZGV4IDZlODFhY2YuLjJjYWUxZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvbmV0d2luZGVyX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL25ldHdpbmRlcl9kZWZjb25maWcKQEAgLTU4LDcgKzU4LDYgQEAKICMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0ZPT1RCUklER0U9eQogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcF9oMl8xNjEwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcF9oMl8xNjEwX2RlZmNvbmZpZwppbmRleCA1MjlmMGY3Li5lZTNlY2JkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL29tYXBfaDJfMTYxMF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9vbWFwX2gyXzE2MTBfZGVmY29uZmlnCkBAIC04NSw3ICs4NSw2IEBACiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvcGxlYl9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3BsZWJfZGVmY29uZmlnCmluZGV4IDEwZmVjODkuLjI0ZThiZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvcGxlYl9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9wbGViX2RlZmNvbmZpZwpAQCAtNjMsNyArNjMsNiBAQAogIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL3B4YTI1NS1pZHBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9weGEyNTUtaWRwX2RlZmNvbmZpZwppbmRleCAyMWMzMjc4Li5iNzFkMzFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL3B4YTI1NS1pZHBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvcHhhMjU1LWlkcF9kZWZjb25maWcKQEAgLTYzLDcgKzYzLDYgQEAKICMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9yZWFsdmlld19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3JlYWx2aWV3X2RlZmNvbmZpZwppbmRleCAwNDg1YjJmLi4zZjFlYzRlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL3JlYWx2aWV3X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL3JlYWx2aWV3X2RlZmNvbmZpZwpAQCAtNjUsNyArNjUsNiBAQAogIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL3JwY19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3JwY19kZWZjb25maWcKaW5kZXggMTkxODRjMS4uYjQ5OGFmZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9ycGNfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvcnBjX2RlZmNvbmZpZwpAQCAtNjYsNyArNjYsNiBAQAogIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL3MzYzI0MTBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9zM2MyNDEwX2RlZmNvbmZpZwppbmRleCAzZjk3NTkwLi4zM2YzMTA4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL3MzYzI0MTBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvczNjMjQxMF9kZWZjb25maWcKQEAgLTg1LDcgKzg1LDYgQEAKICMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9zaGFubm9uX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mvc2hhbm5vbl9kZWZjb25maWcKaW5kZXggZTNmYWNjNC4uZDA1MmM4ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9zaGFubm9uX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL3NoYW5ub25fZGVmY29uZmlnCkBAIC02Miw3ICs2Miw2IEBACiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvc2hhcmtfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9zaGFya19kZWZjb25maWcKaW5kZXggMjcxODIzZi4uYzQ4ZDE3MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9zaGFya19kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9zaGFya19kZWZjb25maWcKQEAgLTY2LDcgKzY2LDYgQEAKICMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9zaW1wYWRfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9zaW1wYWRfZGVmY29uZmlnCmluZGV4IDUzNzNlZWIuLjJlNWE2MTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3Mvc2ltcGFkX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL3NpbXBhZF9kZWZjb25maWcKQEAgLTY0LDcgKzY0LDYgQEAKICMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9zbWRrMjQxMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3NtZGsyNDEwX2RlZmNvbmZpZwppbmRleCAyYzYwODY1Li40ZDEyM2QzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL3NtZGsyNDEwX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL3NtZGsyNDEwX2RlZmNvbmZpZwpAQCAtNTgsNyArNTgsNiBAQAogIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NBTUVMT1QgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL3NwaXR6X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mvc3BpdHpfZGVmY29uZmlnCmluZGV4IDk4OTU1MzkuLmQxYWNlM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3Mvc3BpdHpfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3Mvc3BpdHpfZGVmY29uZmlnCkBAIC04Nyw3ICs4Nyw2IEBACiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvdmVyc2F0aWxlX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvdmVyc2F0aWxlX2RlZmNvbmZpZwppbmRleCBkNzJmMmM3Li4yNjg3YTIyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL3ZlcnNhdGlsZV9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy92ZXJzYXRpbGVfZGVmY29uZmlnCkBAIC02NCw3ICs2NCw2IEBACiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0FNRUxPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvYXJtL2tlcm5lbC9NYWtlZmlsZQppbmRleCBjMTExNjliLi4yY2UwZTNhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0va2VybmVsL01ha2VmaWxlCkBAIC0yLDE1ICsyLDE2IEBACiAjIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgogIwogCi1BRkxBR1NfaGVhZC5vIDo9IC1ES0VSTkVMX1JBTV9BRERSPSQoVEVYVEFERFIpCitBRkxBR1NfaGVhZC5vIDo9IC1EVEVYVF9PRkZTRVQ9JChURVhUX09GRlNFVCkKIAogIyBPYmplY3QgZmlsZSBsaXN0cy4KIAotb2JqLXkJCTo9IGNvbXBhdC5vIGRtYS5vIGVudHJ5LWFybXYubyBlbnRyeS1jb21tb24ubyBpcnEubyBcCitvYmoteQkJOj0gY29tcGF0Lm8gZW50cnktYXJtdi5vIGVudHJ5LWNvbW1vbi5vIGlycS5vIFwKIAkJICAgcHJvY2Vzcy5vIHB0cmFjZS5vIHNlbWFwaG9yZS5vIHNldHVwLm8gc2lnbmFsLm8gc3lzX2FybS5vIFwKIAkJICAgdGltZS5vIHRyYXBzLm8KIAogb2JqLSQoQ09ORklHX0FQTSkJCSs9IGFwbS5vCitvYmotJChDT05GSUdfSVNBX0RNQV9BUEkpCSs9IGRtYS5vCiBvYmotJChDT05GSUdfQVJDSF9BQ09STikJKz0gZWNhcmQubyAKIG9iai0kKENPTkZJR19GT09UQlJJREdFKQkrPSBpc2Eubwogb2JqLSQoQ09ORklHX0ZJUSkJCSs9IGZpcS5vCkBAIC0xOSw2ICsyMCw3IEBACiBvYmotJChDT05GSUdfSVNBX0RNQSkJCSs9IGRtYS1pc2Eubwogb2JqLSQoQ09ORklHX1BDSSkJCSs9IGJpb3MzMi5vCiBvYmotJChDT05GSUdfU01QKQkJKz0gc21wLm8KK29iai0kKENPTkZJR19PQUJJX0NPTVBBVCkJKz0gc3lzX29hYmktY29tcGF0Lm8KIAogb2JqLSQoQ09ORklHX0lXTU1YVCkJCSs9IGl3bW14dC5vCiBBRkxBR1NfaXdtbXh0Lm8JCQk6PSAtV2EsLW1jcHU9aXdtbXh0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvYXBtLmMgYi9hcmNoL2FybS9rZXJuZWwvYXBtLmMKaW5kZXggYTI4NDNiZS4uNzY2YjZjMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2FwbS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9hcG0uYwpAQCAtMTgsOSArMTgsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvYXBtX2Jpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX2xlZ2FjeS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KQEAgLTgxLDYgKzgxLDcgQEAKICAqLwogc3RhdGljIGludCBzdXNwZW5kc19wZW5kaW5nOwogc3RhdGljIGludCBhcG1fZGlzYWJsZWQ7CitzdGF0aWMgaW50IGFybV9hcG1fYWN0aXZlOwogCiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoYXBtX3dhaXRxdWV1ZSk7CiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoYXBtX3N1c3BlbmRfd2FpdHF1ZXVlKTsKQEAgLTQ3Nyw5ICs0NzgsOSBAQAogCQlhcG1fZXZlbnRfdCBldmVudDsKIAogCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoa2FwbWRfd2FpdCwKLQkJCQkhcXVldWVfZW1wdHkoJmthcG1kX3F1ZXVlKSB8fCAhcG1fYWN0aXZlKTsKKwkJCQkhcXVldWVfZW1wdHkoJmthcG1kX3F1ZXVlKSB8fCAhYXJtX2FwbV9hY3RpdmUpOwogCi0JCWlmICghcG1fYWN0aXZlKQorCQlpZiAoIWFybV9hcG1fYWN0aXZlKQogCQkJYnJlYWs7CiAKIAkJc3Bpbl9sb2NrX2lycSgma2FwbWRfcXVldWVfbG9jayk7CkBAIC01MjIsMTYgKzUyMywxMSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAoUE1fSVNfQUNUSVZFKCkpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJhcG06IG92ZXJyaWRkZW4gYnkgQUNQSS5cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwbV9hY3RpdmUgPSAxOworCWFybV9hcG1fYWN0aXZlID0gMTsKIAogCXJldCA9IGtlcm5lbF90aHJlYWQoa2FwbWQsIE5VTEwsIENMT05FX0tFUk5FTCk7CiAJaWYgKHJldCA8IDApIHsKLQkJcG1fYWN0aXZlID0gMDsKKwkJYXJtX2FwbV9hY3RpdmUgPSAwOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtNTQzLDcgKzUzOSw3IEBACiAJaWYgKHJldCAhPSAwKSB7CiAJCXJlbW92ZV9wcm9jX2VudHJ5KCJhcG0iLCBOVUxMKTsKIAotCQlwbV9hY3RpdmUgPSAwOworCQlhcm1fYXBtX2FjdGl2ZSA9IDA7CiAJCXdha2VfdXAoJmthcG1kX3dhaXQpOwogCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZrYXBtZF9leGl0KTsKIAl9CkBAIC01NTYsNyArNTUyLDcgQEAKIAltaXNjX2RlcmVnaXN0ZXIoJmFwbV9kZXZpY2UpOwogCXJlbW92ZV9wcm9jX2VudHJ5KCJhcG0iLCBOVUxMKTsKIAotCXBtX2FjdGl2ZSA9IDA7CisJYXJtX2FwbV9hY3RpdmUgPSAwOwogCXdha2VfdXAoJmthcG1kX3dhaXQpOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmthcG1kX2V4aXQpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2FybWtzeW1zLmMgYi9hcmNoL2FybS9rZXJuZWwvYXJta3N5bXMuYwppbmRleCA5OTk3MDk4Li4xNTc0OTQxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvYXJta3N5bXMuYworKysgYi9hcmNoL2FybS9rZXJuZWwvYXJta3N5bXMuYwpAQCAtMzUsNiArMzUsMTYgQEAKIGV4dGVybiB2b2lkIF9fdW1vZHNpMyh2b2lkKTsKIGV4dGVybiB2b2lkIF9fZG9fZGl2NjQodm9pZCk7CiAKK2V4dGVybiB2b2lkIF9fYWVhYmlfaWRpdih2b2lkKTsKK2V4dGVybiB2b2lkIF9fYWVhYmlfaWRpdm1vZCh2b2lkKTsKK2V4dGVybiB2b2lkIF9fYWVhYmlfbGFzcih2b2lkKTsKK2V4dGVybiB2b2lkIF9fYWVhYmlfbGxzbCh2b2lkKTsKK2V4dGVybiB2b2lkIF9fYWVhYmlfbGxzcih2b2lkKTsKK2V4dGVybiB2b2lkIF9fYWVhYmlfbG11bCh2b2lkKTsKK2V4dGVybiB2b2lkIF9fYWVhYmlfdWlkaXYodm9pZCk7CitleHRlcm4gdm9pZCBfX2FlYWJpX3VpZGl2bW9kKHZvaWQpOworZXh0ZXJuIHZvaWQgX19hZWFiaV91bGNtcCh2b2lkKTsKKwogZXh0ZXJuIHZvaWQgZnB1bmRlZmluc3RyKHZvaWQpOwogZXh0ZXJuIHZvaWQgZnBfZW50ZXIodm9pZCk7CiAKQEAgLTE0MSw2ICsxNTEsMTggQEAKIEVYUE9SVF9TWU1CT0woX191bW9kc2kzKTsKIEVYUE9SVF9TWU1CT0woX19kb19kaXY2NCk7CiAKKyNpZmRlZiBDT05GSUdfQUVBQkkKK0VYUE9SVF9TWU1CT0woX19hZWFiaV9pZGl2KTsKK0VYUE9SVF9TWU1CT0woX19hZWFiaV9pZGl2bW9kKTsKK0VYUE9SVF9TWU1CT0woX19hZWFiaV9sYXNyKTsKK0VYUE9SVF9TWU1CT0woX19hZWFiaV9sbHNsKTsKK0VYUE9SVF9TWU1CT0woX19hZWFiaV9sbHNyKTsKK0VYUE9SVF9TWU1CT0woX19hZWFiaV9sbXVsKTsKK0VYUE9SVF9TWU1CT0woX19hZWFiaV91aWRpdik7CitFWFBPUlRfU1lNQk9MKF9fYWVhYmlfdWlkaXZtb2QpOworRVhQT1JUX1NZTUJPTChfX2FlYWJpX3VsY21wKTsKKyNlbmRpZgorCiAJLyogYml0b3BzICovCiBFWFBPUlRfU1lNQk9MKF9zZXRfYml0X2xlKTsKIEVYUE9SVF9TWU1CT0woX3Rlc3RfYW5kX3NldF9iaXRfbGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL2FybS9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCAwNGQzMDgyLi4wYWJiY2U4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL2FybS9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMjMsMjAgKzIzLDE1IEBACiAjZXJyb3IgU29ycnksIHlvdXIgY29tcGlsZXIgdGFyZ2V0cyBBUENTLTI2IGJ1dCB0aGlzIGtlcm5lbCByZXF1aXJlcyBBUENTLTMyCiAjZW5kaWYKIC8qCi0gKiBHQ0MgMi45NS4xLCAyLjk1LjI6IGlnbm9yZXMgcmVnaXN0ZXIgY2xvYmJlciBsaXN0IGluIGFzbSgpLgogICogR0NDIDMuMCwgMy4xOiBnZW5lcmFsIGJhZCBjb2RlIGdlbmVyYXRpb24uCiAgKiBHQ0MgMy4yLjA6IGluY29ycmVjdCBmdW5jdGlvbiBhcmd1bWVudCBvZmZzZXQgY2FsY3VsYXRpb24uCiAgKiBHQ0MgMy4yLng6IG1pc2NvbXBpbGVzIE5FV19BVVhfRU5UIGluIGZzL2JpbmZtdF9lbGYuYwogICogICAgICAgICAgICAoaHR0cDovL2djYy5nbnUub3JnL1BSODg5NikgYW5kIGluY29ycmVjdCBzdHJ1Y3R1cmUKICAqCSAgICAgIGluaXRpYWxpc2F0aW9uIGluIGZzL2pmZnMyL2VyYXNlLmMKICAqLwotI2lmIF9fR05VQ19fIDwgMiB8fCBcCi0gICAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8IDk1KSB8fCBcCi0gICAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA9PSA5NSAmJiBfX0dOVUNfUEFUQ0hMRVZFTF9fICE9IDAgJiYgXAotCQkJCQkgICAgIF9fR05VQ19QQVRDSExFVkVMX18gPCAzKSB8fCBcCi0gICAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA8IDMpCisjaWYgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPCAzKQogI2Vycm9yIFlvdXIgY29tcGlsZXIgaXMgdG9vIGJ1Z2d5OyBpdCBpcyBrbm93biB0byBtaXNjb21waWxlIGtlcm5lbHMuCi0jZXJyb3IgICAgS25vd24gZ29vZCBjb21waWxlcnM6IDIuOTUuMywgMi45NS40LCAyLjk2LCAzLjMKKyNlcnJvciAgICBLbm93biBnb29kIGNvbXBpbGVyczogMy4zCiAjZW5kaWYKIAogLyogVXNlIG1hcmtlciBpZiB5b3UgbmVlZCB0byBzZXBhcmF0ZSB0aGUgdmFsdWVzIGxhdGVyICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvY2FsbHMuUyBiL2FyY2gvYXJtL2tlcm5lbC9jYWxscy5TCmluZGV4IDU1MDc2YTcuLjc1ZTZmOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9jYWxscy5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9jYWxscy5TCkBAIC0xMyw3ICsxMyw3IEBACiAjZGVmaW5lIE5SX3N5c2NhbGxzIDMyOAogI2Vsc2UKIAotX19zeXNjYWxsX3N0YXJ0OgorMTAwOgogLyogMCAqLwkJLmxvbmcJc3lzX3Jlc3RhcnRfc3lzY2FsbAogCQkubG9uZwlzeXNfZXhpdAogCQkubG9uZwlzeXNfZm9ya193cmFwcGVyCkBAIC0yNyw3ICsyNyw3IEBACiAvKiAxMCAqLwkubG9uZwlzeXNfdW5saW5rCiAJCS5sb25nCXN5c19leGVjdmVfd3JhcHBlcgogCQkubG9uZwlzeXNfY2hkaXIKLQkJLmxvbmcJc3lzX3RpbWUJCS8qIHVzZWQgYnkgbGliYzQgKi8KKwkJLmxvbmcJT0JTT0xFVEUoc3lzX3RpbWUpCS8qIHVzZWQgYnkgbGliYzQgKi8KIAkJLmxvbmcJc3lzX21rbm9kCiAvKiAxNSAqLwkubG9uZwlzeXNfY2htb2QKIAkJLmxvbmcJc3lzX2xjaG93bjE2CkBAIC0zNiwxNSArMzYsMTUgQEAKIAkJLmxvbmcJc3lzX2xzZWVrCiAvKiAyMCAqLwkubG9uZwlzeXNfZ2V0cGlkCiAJCS5sb25nCXN5c19tb3VudAotCQkubG9uZwlzeXNfb2xkdW1vdW50CQkvKiB1c2VkIGJ5IGxpYmM0ICovCisJCS5sb25nCU9CU09MRVRFKHN5c19vbGR1bW91bnQpCS8qIHVzZWQgYnkgbGliYzQgKi8KIAkJLmxvbmcJc3lzX3NldHVpZDE2CiAJCS5sb25nCXN5c19nZXR1aWQxNgotLyogMjUgKi8JLmxvbmcJc3lzX3N0aW1lCisvKiAyNSAqLwkubG9uZwlPQlNPTEVURShzeXNfc3RpbWUpCiAJCS5sb25nCXN5c19wdHJhY2UKLQkJLmxvbmcJc3lzX2FsYXJtCQkvKiB1c2VkIGJ5IGxpYmM0ICovCisJCS5sb25nCU9CU09MRVRFKHN5c19hbGFybSkJLyogdXNlZCBieSBsaWJjNCAqLwogCQkubG9uZwlzeXNfbmlfc3lzY2FsbAkJLyogd2FzIHN5c19mc3RhdCAqLwogCQkubG9uZwlzeXNfcGF1c2UKLS8qIDMwICovCS5sb25nCXN5c191dGltZQkJLyogdXNlZCBieSBsaWJjNCAqLworLyogMzAgKi8JLmxvbmcJT0JTT0xFVEUoc3lzX3V0aW1lKQkvKiB1c2VkIGJ5IGxpYmM0ICovCiAJCS5sb25nCXN5c19uaV9zeXNjYWxsCQkvKiB3YXMgc3lzX3N0dHkgKi8KIAkJLmxvbmcJc3lzX25pX3N5c2NhbGwJCS8qIHdhcyBzeXNfZ2V0dHkgKi8KIAkJLmxvbmcJc3lzX2FjY2VzcwpAQCAtOTAsMjEgKzkwLDIxIEBACiAJCS5sb25nCXN5c19zaWdwZW5kaW5nCiAJCS5sb25nCXN5c19zZXRob3N0bmFtZQogLyogNzUgKi8JLmxvbmcJc3lzX3NldHJsaW1pdAotCQkubG9uZwlzeXNfb2xkX2dldHJsaW1pdAkvKiB1c2VkIGJ5IGxpYmM0ICovCisJCS5sb25nCU9CU09MRVRFKHN5c19vbGRfZ2V0cmxpbWl0KSAvKiB1c2VkIGJ5IGxpYmM0ICovCiAJCS5sb25nCXN5c19nZXRydXNhZ2UKIAkJLmxvbmcJc3lzX2dldHRpbWVvZmRheQogCQkubG9uZwlzeXNfc2V0dGltZW9mZGF5CiAvKiA4MCAqLwkubG9uZwlzeXNfZ2V0Z3JvdXBzMTYKIAkJLmxvbmcJc3lzX3NldGdyb3VwczE2Ci0JCS5sb25nCW9sZF9zZWxlY3QJCS8qIHVzZWQgYnkgbGliYzQgKi8KKwkJLmxvbmcJT0JTT0xFVEUob2xkX3NlbGVjdCkJLyogdXNlZCBieSBsaWJjNCAqLwogCQkubG9uZwlzeXNfc3ltbGluawogCQkubG9uZwlzeXNfbmlfc3lzY2FsbAkJLyogd2FzIHN5c19sc3RhdCAqLwogLyogODUgKi8JLmxvbmcJc3lzX3JlYWRsaW5rCiAJCS5sb25nCXN5c191c2VsaWIKIAkJLmxvbmcJc3lzX3N3YXBvbgogCQkubG9uZwlzeXNfcmVib290Ci0JCS5sb25nCW9sZF9yZWFkZGlyCQkvKiB1c2VkIGJ5IGxpYmM0ICovCi0vKiA5MCAqLwkubG9uZwlvbGRfbW1hcAkJLyogdXNlZCBieSBsaWJjNCAqLworCQkubG9uZwlPQlNPTEVURShvbGRfcmVhZGRpcikJLyogdXNlZCBieSBsaWJjNCAqLworLyogOTAgKi8JLmxvbmcJT0JTT0xFVEUob2xkX21tYXApCS8qIHVzZWQgYnkgbGliYzQgKi8KIAkJLmxvbmcJc3lzX211bm1hcAogCQkubG9uZwlzeXNfdHJ1bmNhdGUKIAkJLmxvbmcJc3lzX2Z0cnVuY2F0ZQpAQCAtMTE2LDcgKzExNiw3IEBACiAJCS5sb25nCXN5c19zdGF0ZnMKIC8qIDEwMCAqLwkubG9uZwlzeXNfZnN0YXRmcwogCQkubG9uZwlzeXNfbmlfc3lzY2FsbAotCQkubG9uZwlzeXNfc29ja2V0Y2FsbAorCQkubG9uZwlPQlNPTEVURShzeXNfc29ja2V0Y2FsbCkKIAkJLmxvbmcJc3lzX3N5c2xvZwogCQkubG9uZwlzeXNfc2V0aXRpbWVyCiAvKiAxMDUgKi8JLmxvbmcJc3lzX2dldGl0aW1lcgpAQCAtMTI3LDExICsxMjcsMTEgQEAKIC8qIDExMCAqLwkubG9uZwlzeXNfbmlfc3lzY2FsbAkJLyogd2FzIHN5c19pb3BsICovCiAJCS5sb25nCXN5c192aGFuZ3VwCiAJCS5sb25nCXN5c19uaV9zeXNjYWxsCi0JCS5sb25nCXN5c19zeXNjYWxsCQkvKiBjYWxsIGEgc3lzY2FsbCAqLworCQkubG9uZwlPQlNPTEVURShzeXNfc3lzY2FsbCkJLyogY2FsbCBhIHN5c2NhbGwgKi8KIAkJLmxvbmcJc3lzX3dhaXQ0CiAvKiAxMTUgKi8JLmxvbmcJc3lzX3N3YXBvZmYKIAkJLmxvbmcJc3lzX3N5c2luZm8KLQkJLmxvbmcJc3lzX2lwYworCQkubG9uZwlPQlNPTEVURShBQkkoc3lzX2lwYywgc3lzX29hYmlfaXBjKSkKIAkJLmxvbmcJc3lzX2ZzeW5jCiAJCS5sb25nCXN5c19zaWdyZXR1cm5fd3JhcHBlcgogLyogMTIwICovCS5sb25nCXN5c19jbG9uZV93cmFwcGVyCkBAIC0xOTQsOCArMTk0LDggQEAKIAkJLmxvbmcJc3lzX3J0X3NpZ3RpbWVkd2FpdAogCQkubG9uZwlzeXNfcnRfc2lncXVldWVpbmZvCiAJCS5sb25nCXN5c19ydF9zaWdzdXNwZW5kX3dyYXBwZXIKLS8qIDE4MCAqLwkubG9uZwlzeXNfcHJlYWQ2NAotCQkubG9uZwlzeXNfcHdyaXRlNjQKKy8qIDE4MCAqLwkubG9uZwlBQkkoc3lzX3ByZWFkNjQsIHN5c19vYWJpX3ByZWFkNjQpCisJCS5sb25nCUFCSShzeXNfcHdyaXRlNjQsIHN5c19vYWJpX3B3cml0ZTY0KQogCQkubG9uZwlzeXNfY2hvd24xNgogCQkubG9uZwlzeXNfZ2V0Y3dkCiAJCS5sb25nCXN5c19jYXBnZXQKQEAgLTIwNywxMSArMjA3LDExIEBACiAvKiAxOTAgKi8JLmxvbmcJc3lzX3Zmb3JrX3dyYXBwZXIKIAkJLmxvbmcJc3lzX2dldHJsaW1pdAogCQkubG9uZwlzeXNfbW1hcDIKLQkJLmxvbmcJc3lzX3RydW5jYXRlNjQKLQkJLmxvbmcJc3lzX2Z0cnVuY2F0ZTY0Ci0vKiAxOTUgKi8JLmxvbmcJc3lzX3N0YXQ2NAotCQkubG9uZwlzeXNfbHN0YXQ2NAotCQkubG9uZwlzeXNfZnN0YXQ2NAorCQkubG9uZwlBQkkoc3lzX3RydW5jYXRlNjQsIHN5c19vYWJpX3RydW5jYXRlNjQpCisJCS5sb25nCUFCSShzeXNfZnRydW5jYXRlNjQsIHN5c19vYWJpX2Z0cnVuY2F0ZTY0KQorLyogMTk1ICovCS5sb25nCUFCSShzeXNfc3RhdDY0LCBzeXNfb2FiaV9zdGF0NjQpCisJCS5sb25nCUFCSShzeXNfbHN0YXQ2NCwgc3lzX29hYmlfbHN0YXQ2NCkKKwkJLmxvbmcJQUJJKHN5c19mc3RhdDY0LCBzeXNfb2FiaV9mc3RhdDY0KQogCQkubG9uZwlzeXNfbGNob3duCiAJCS5sb25nCXN5c19nZXR1aWQKIC8qIDIwMCAqLwkubG9uZwlzeXNfZ2V0Z2lkCkBAIC0yMzUsMTEgKzIzNSwxMSBAQAogCQkubG9uZwlzeXNfcGl2b3Rfcm9vdAogCQkubG9uZwlzeXNfbWluY29yZQogLyogMjIwICovCS5sb25nCXN5c19tYWR2aXNlCi0JCS5sb25nCXN5c19mY250bDY0CisJCS5sb25nCUFCSShzeXNfZmNudGw2NCwgc3lzX29hYmlfZmNudGw2NCkKIAkJLmxvbmcJc3lzX25pX3N5c2NhbGwgLyogVFVYICovCiAJCS5sb25nCXN5c19uaV9zeXNjYWxsCiAJCS5sb25nCXN5c19nZXR0aWQKLS8qIDIyNSAqLwkubG9uZwlzeXNfcmVhZGFoZWFkCisvKiAyMjUgKi8JLmxvbmcJQUJJKHN5c19yZWFkYWhlYWQsIHN5c19vYWJpX3JlYWRhaGVhZCkKIAkJLmxvbmcJc3lzX3NldHhhdHRyCiAJCS5sb25nCXN5c19sc2V0eGF0dHIKIAkJLmxvbmcJc3lzX2ZzZXR4YXR0cgpAQCAtMjY1LDggKzI2NSw4IEBACiAJCS5sb25nCXN5c19leGl0X2dyb3VwCiAJCS5sb25nCXN5c19sb29rdXBfZGNvb2tpZQogLyogMjUwICovCS5sb25nCXN5c19lcG9sbF9jcmVhdGUKLQkJLmxvbmcJc3lzX2Vwb2xsX2N0bAotCQkubG9uZwlzeXNfZXBvbGxfd2FpdAorCQkubG9uZwlBQkkoc3lzX2Vwb2xsX2N0bCwgc3lzX29hYmlfZXBvbGxfY3RsKQorCQkubG9uZwlBQkkoc3lzX2Vwb2xsX3dhaXQsIHN5c19vYWJpX2Vwb2xsX3dhaXQpCiAJIAkubG9uZwlzeXNfcmVtYXBfZmlsZV9wYWdlcwogCQkubG9uZwlzeXNfbmlfc3lzY2FsbAkvKiBzeXNfc2V0X3RocmVhZF9hcmVhICovCiAvKiAyNTUgKi8JLmxvbmcJc3lzX25pX3N5c2NhbGwJLyogc3lzX2dldF90aHJlYWRfYXJlYSAqLwpAQCAtMjgwLDggKzI4MCw4IEBACiAJCS5sb25nCXN5c19jbG9ja19nZXR0aW1lCiAJCS5sb25nCXN5c19jbG9ja19nZXRyZXMKIC8qIDI2NSAqLwkubG9uZwlzeXNfY2xvY2tfbmFub3NsZWVwCi0JCS5sb25nCXN5c19zdGF0ZnM2NAotCQkubG9uZwlzeXNfZnN0YXRmczY0CisJCS5sb25nCXN5c19zdGF0ZnM2NF93cmFwcGVyCisJCS5sb25nCXN5c19mc3RhdGZzNjRfd3JhcHBlcgogCQkubG9uZwlzeXNfdGdraWxsCiAJCS5sb25nCXN5c191dGltZXMKIC8qIDI3MCAqLwkubG9uZwlzeXNfYXJtX2ZhZHZpc2U2NF82NApAQCAtMzEyLDcgKzMxMiw3IEBACiAvKiAyOTUgKi8JLmxvbmcJc3lzX2dldHNvY2tvcHQKIAkJLmxvbmcJc3lzX3NlbmRtc2cKIAkJLmxvbmcJc3lzX3JlY3Ztc2cKLQkJLmxvbmcJc3lzX3NlbW9wCisJCS5sb25nCUFCSShzeXNfc2Vtb3AsIHN5c19vYWJpX3NlbW9wKQogCQkubG9uZwlzeXNfc2VtZ2V0CiAvKiAzMDAgKi8JLmxvbmcJc3lzX3NlbWN0bAogCQkubG9uZwlzeXNfbXNnc25kCkBAIC0zMjYsNyArMzI2LDcgQEAKIAkJLmxvbmcJc3lzX2FkZF9rZXkKIC8qIDMxMCAqLwkubG9uZwlzeXNfcmVxdWVzdF9rZXkKIAkJLmxvbmcJc3lzX2tleWN0bAotCQkubG9uZwlzeXNfc2VtdGltZWRvcAorCQkubG9uZwlBQkkoc3lzX3NlbXRpbWVkb3AsIHN5c19vYWJpX3NlbXRpbWVkb3ApCiAvKiB2c2VydmVyICovCS5sb25nCXN5c19uaV9zeXNjYWxsCiAJCS5sb25nCXN5c19pb3ByaW9fc2V0CiAvKiAzMTUgKi8JLmxvbmcJc3lzX2lvcHJpb19nZXQKQEAgLTMzNiw5ICszMzYsOCBAQAogCQkubG9uZwlzeXNfbWJpbmQKIC8qIDMyMCAqLwkubG9uZwlzeXNfZ2V0X21lbXBvbGljeQogCQkubG9uZwlzeXNfc2V0X21lbXBvbGljeQotX19zeXNjYWxsX2VuZDoKIAotCQkucmVwdAlOUl9zeXNjYWxscyAtIChfX3N5c2NhbGxfZW5kIC0gX19zeXNjYWxsX3N0YXJ0KSAvIDQKKwkJLnJlcHQJTlJfc3lzY2FsbHMgLSAoLiAtIDEwMGIpIC8gNAogCQkJLmxvbmcJc3lzX25pX3N5c2NhbGwKIAkJLmVuZHIKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2RtYS1pc2EuYyBiL2FyY2gvYXJtL2tlcm5lbC9kbWEtaXNhLmMKaW5kZXggZTlhMzYzMC4uMDM1MzI3NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2RtYS1pc2EuYworKysgYi9hcmNoL2FybS9rZXJuZWwvZG1hLWlzYS5jCkBAIC0xOCw3ICsxOCw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTY1LDM3ICs2NSw0MSBAQAogewogCWlmIChkbWEtPmludmFsaWQpIHsKIAkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBsZW5ndGg7Ci0JCXVuc2lnbmVkIGludCBtb2RlLCBkaXJlY3Rpb247CisJCXVuc2lnbmVkIGludCBtb2RlOworCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb247CiAKIAkJbW9kZSA9IGNoYW5uZWwgJiAzOwogCQlzd2l0Y2ggKGRtYS0+ZG1hX21vZGUgJiBETUFfTU9ERV9NQVNLKSB7CiAJCWNhc2UgRE1BX01PREVfUkVBRDoKIAkJCW1vZGUgfD0gSVNBX0RNQV9NT0RFX1JFQUQ7Ci0JCQlkaXJlY3Rpb24gPSBQQ0lfRE1BX0ZST01ERVZJQ0U7CisJCQlkaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CiAJCQlicmVhazsKIAogCQljYXNlIERNQV9NT0RFX1dSSVRFOgogCQkJbW9kZSB8PSBJU0FfRE1BX01PREVfV1JJVEU7Ci0JCQlkaXJlY3Rpb24gPSBQQ0lfRE1BX1RPREVWSUNFOworCQkJZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgRE1BX01PREVfQ0FTQ0FERToKIAkJCW1vZGUgfD0gSVNBX0RNQV9NT0RFX0NBU0NBREU7Ci0JCQlkaXJlY3Rpb24gPSBQQ0lfRE1BX0JJRElSRUNUSU9OQUw7CisJCQlkaXJlY3Rpb24gPSBETUFfQklESVJFQ1RJT05BTDsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlkaXJlY3Rpb24gPSBQQ0lfRE1BX05PTkU7CisJCQlkaXJlY3Rpb24gPSBETUFfTk9ORTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKCFkbWEtPnVzaW5nX3NnKSB7CisJCWlmICghZG1hLT5zZykgewogCQkJLyoKIAkJCSAqIENvcGUgd2l0aCBJU0Etc3R5bGUgZHJpdmVycyB3aGljaCBleHBlY3QgY2FjaGUKIAkJCSAqIGNvaGVyZW5jZS4KIAkJCSAqLwotCQkJZG1hLT5idWYuZG1hX2FkZHJlc3MgPSBwY2lfbWFwX3NpbmdsZShOVUxMLAotCQkJCWRtYS0+YnVmLl9fYWRkcmVzcywgZG1hLT5idWYubGVuZ3RoLAorCQkJZG1hLT5zZyA9ICZkbWEtPmJ1ZjsKKwkJCWRtYS0+c2djb3VudCA9IDE7CisJCQlkbWEtPmJ1Zi5sZW5ndGggPSBkbWEtPmNvdW50OworCQkJZG1hLT5idWYuZG1hX2FkZHJlc3MgPSBkbWFfbWFwX3NpbmdsZShOVUxMLAorCQkJCWRtYS0+YWRkciwgZG1hLT5jb3VudCwKIAkJCQlkaXJlY3Rpb24pOwogCQl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9kbWEuYyBiL2FyY2gvYXJtL2tlcm5lbC9kbWEuYwppbmRleCAyYjc4ODM4Li41YTBmNGJjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZG1hLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2RtYS5jCkBAIC0xMiw4ICsxMiw2IEBACiAgKiAgRE1BIGZhY2lsaXRpZXMuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CkBAIC0yMyw4ICsyMSw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvZG1hLmg+CiAKIERFRklORV9TUElOTE9DSyhkbWFfc3Bpbl9sb2NrKTsKLQotI2lmIE1BWF9ETUFfQ0hBTk5FTFMgPiAwCitFWFBPUlRfU1lNQk9MKGRtYV9zcGluX2xvY2spOwogCiBzdGF0aWMgZG1hX3QgZG1hX2NoYW5bTUFYX0RNQV9DSEFOTkVMU107CiAKQEAgLTgxLDYgKzc4LDcgQEAKIGJ1c3k6CiAJcmV0dXJuIC1FQlVTWTsKIH0KK0VYUE9SVF9TWU1CT0wocmVxdWVzdF9kbWEpOwogCiAvKgogICogRnJlZSBETUEgY2hhbm5lbApAQCAtMTEyLDYgKzExMCw3IEBACiBiYWRfZG1hOgogCXByaW50ayhLRVJOX0VSUiAiZG1hOiB0cnlpbmcgdG8gZnJlZSBETUElZFxuIiwgY2hhbm5lbCk7CiB9CitFWFBPUlRfU1lNQk9MKGZyZWVfZG1hKTsKIAogLyogU2V0IERNQSBTY2F0dGVyLUdhdGhlciBsaXN0CiAgKi8KQEAgLTEyNSwxNSArMTI0LDE1IEBACiAKIAlkbWEtPnNnID0gc2c7CiAJZG1hLT5zZ2NvdW50ID0gbnJfc2c7Ci0JZG1hLT51c2luZ19zZyA9IDE7CiAJZG1hLT5pbnZhbGlkID0gMTsKIH0KK0VYUE9SVF9TWU1CT0woc2V0X2RtYV9zZyk7CiAKIC8qIFNldCBETUEgYWRkcmVzcwogICoKICAqIENvcHkgYWRkcmVzcyB0byB0aGUgc3RydWN0dXJlLCBhbmQgc2V0IHRoZSBpbnZhbGlkIGJpdAogICovCi12b2lkIHNldF9kbWFfYWRkciAoZG1hY2hfdCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIHBoeXNhZGRyKQordm9pZCBfX3NldF9kbWFfYWRkciAoZG1hY2hfdCBjaGFubmVsLCB2b2lkICphZGRyKQogewogCWRtYV90ICpkbWEgPSBkbWFfY2hhbiArIGNoYW5uZWw7CiAKQEAgLTE0MSwxMiArMTQwLDExIEBACiAJCXByaW50ayhLRVJOX0VSUiAiZG1hJWQ6IGFsdGVyaW5nIERNQSBhZGRyZXNzIHdoaWxlICIKIAkJICAgICAgICJETUEgYWN0aXZlXG4iLCBjaGFubmVsKTsKIAotCWRtYS0+c2cgPSAmZG1hLT5idWY7Ci0JZG1hLT5zZ2NvdW50ID0gMTsKLQlkbWEtPmJ1Zi5fX2FkZHJlc3MgPSBidXNfdG9fdmlydChwaHlzYWRkcik7Ci0JZG1hLT51c2luZ19zZyA9IDA7CisJZG1hLT5zZyA9IE5VTEw7CisJZG1hLT5hZGRyID0gYWRkcjsKIAlkbWEtPmludmFsaWQgPSAxOwogfQorRVhQT1JUX1NZTUJPTChfX3NldF9kbWFfYWRkcik7CiAKIC8qIFNldCBETUEgYnl0ZSBjb3VudAogICoKQEAgLTE2MCwxMiArMTU4LDExIEBACiAJCXByaW50ayhLRVJOX0VSUiAiZG1hJWQ6IGFsdGVyaW5nIERNQSBjb3VudCB3aGlsZSAiCiAJCSAgICAgICAiRE1BIGFjdGl2ZVxuIiwgY2hhbm5lbCk7CiAKLQlkbWEtPnNnID0gJmRtYS0+YnVmOwotCWRtYS0+c2djb3VudCA9IDE7Ci0JZG1hLT5idWYubGVuZ3RoID0gY291bnQ7Ci0JZG1hLT51c2luZ19zZyA9IDA7CisJZG1hLT5zZyA9IE5VTEw7CisJZG1hLT5jb3VudCA9IGNvdW50OwogCWRtYS0+aW52YWxpZCA9IDE7CiB9CitFWFBPUlRfU1lNQk9MKHNldF9kbWFfY291bnQpOwogCiAvKiBTZXQgRE1BIGRpcmVjdGlvbiBtb2RlCiAgKi8KQEAgLTE4MCw2ICsxNzcsNyBAQAogCWRtYS0+ZG1hX21vZGUgPSBtb2RlOwogCWRtYS0+aW52YWxpZCA9IDE7CiB9CitFWFBPUlRfU1lNQk9MKHNldF9kbWFfbW9kZSk7CiAKIC8qIEVuYWJsZSBETUEgY2hhbm5lbAogICovCkBAIC0yMDAsNiArMTk4LDcgQEAKIAlwcmludGsoS0VSTl9FUlIgImRtYSVkOiB0cnlpbmcgdG8gZW5hYmxlIGZyZWUgRE1BXG4iLCBjaGFubmVsKTsKIAlCVUcoKTsKIH0KK0VYUE9SVF9TWU1CT0woZW5hYmxlX2RtYSk7CiAKIC8qIERpc2FibGUgRE1BIGNoYW5uZWwKICAqLwpAQCAtMjIwLDYgKzIxOSw3IEBACiAJcHJpbnRrKEtFUk5fRVJSICJkbWElZDogdHJ5aW5nIHRvIGRpc2FibGUgZnJlZSBETUFcbiIsIGNoYW5uZWwpOwogCUJVRygpOwogfQorRVhQT1JUX1NZTUJPTChkaXNhYmxlX2RtYSk7CiAKIC8qCiAgKiBJcyB0aGUgc3BlY2lmaWVkIERNQSBjaGFubmVsIGFjdGl2ZT8KQEAgLTIzMyw2ICsyMzMsNyBAQAogewogCXByaW50ayhLRVJOX0VSUiAiZG1hJWQ6IHRyeWluZyB0byBzZXRfZG1hX3BhZ2VcbiIsIGNoYW5uZWwpOwogfQorRVhQT1JUX1NZTUJPTChzZXRfZG1hX3BhZ2UpOwogCiB2b2lkIHNldF9kbWFfc3BlZWQoZG1hY2hfdCBjaGFubmVsLCBpbnQgY3ljbGVfbnMpCiB7CkBAIC0yNDMsNiArMjQ0LDcgQEAKIAkJcmV0ID0gZG1hLT5kX29wcy0+c2V0c3BlZWQoY2hhbm5lbCwgZG1hLCBjeWNsZV9ucyk7CiAJZG1hLT5zcGVlZCA9IHJldDsKIH0KK0VYUE9SVF9TWU1CT0woc2V0X2RtYV9zcGVlZCk7CiAKIGludCBnZXRfZG1hX3Jlc2lkdWUoZG1hY2hfdCBjaGFubmVsKQogewpAQCAtMjU0LDQ5ICsyNTYsMTIgQEAKIAogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MKGdldF9kbWFfcmVzaWR1ZSk7CiAKLXZvaWQgX19pbml0IGluaXRfZG1hKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2RtYSh2b2lkKQogewogCWFyY2hfZG1hX2luaXQoZG1hX2NoYW4pOwotfQotCi0jZWxzZQotCi1pbnQgcmVxdWVzdF9kbWEoZG1hY2hfdCBjaGFubmVsLCBjb25zdCBjaGFyICpkZXZpY2VfaWQpCi17Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLWludCBnZXRfZG1hX3Jlc2lkdWUoZG1hY2hfdCBjaGFubmVsKQotewogCXJldHVybiAwOwogfQogCi0jZGVmaW5lIEdMT0JBTF9BTElBUyhfYSxfYikgYXNtICgiLnNldCAiICNfYSAiLCIgI19iICI7IC5nbG9ibCAiICNfYSkKLUdMT0JBTF9BTElBUyhkaXNhYmxlX2RtYSwgZ2V0X2RtYV9yZXNpZHVlKTsKLUdMT0JBTF9BTElBUyhlbmFibGVfZG1hLCBnZXRfZG1hX3Jlc2lkdWUpOwotR0xPQkFMX0FMSUFTKGZyZWVfZG1hLCBnZXRfZG1hX3Jlc2lkdWUpOwotR0xPQkFMX0FMSUFTKGdldF9kbWFfbGlzdCwgZ2V0X2RtYV9yZXNpZHVlKTsKLUdMT0JBTF9BTElBUyhzZXRfZG1hX21vZGUsIGdldF9kbWFfcmVzaWR1ZSk7Ci1HTE9CQUxfQUxJQVMoc2V0X2RtYV9wYWdlLCBnZXRfZG1hX3Jlc2lkdWUpOwotR0xPQkFMX0FMSUFTKHNldF9kbWFfY291bnQsIGdldF9kbWFfcmVzaWR1ZSk7Ci1HTE9CQUxfQUxJQVMoc2V0X2RtYV9hZGRyLCBnZXRfZG1hX3Jlc2lkdWUpOwotR0xPQkFMX0FMSUFTKHNldF9kbWFfc2csIGdldF9kbWFfcmVzaWR1ZSk7Ci1HTE9CQUxfQUxJQVMoc2V0X2RtYV9zcGVlZCwgZ2V0X2RtYV9yZXNpZHVlKTsKLUdMT0JBTF9BTElBUyhpbml0X2RtYSwgZ2V0X2RtYV9yZXNpZHVlKTsKLQotI2VuZGlmCi0KLUVYUE9SVF9TWU1CT0wocmVxdWVzdF9kbWEpOwotRVhQT1JUX1NZTUJPTChmcmVlX2RtYSk7Ci1FWFBPUlRfU1lNQk9MKGVuYWJsZV9kbWEpOwotRVhQT1JUX1NZTUJPTChkaXNhYmxlX2RtYSk7Ci1FWFBPUlRfU1lNQk9MKHNldF9kbWFfYWRkcik7Ci1FWFBPUlRfU1lNQk9MKHNldF9kbWFfY291bnQpOwotRVhQT1JUX1NZTUJPTChzZXRfZG1hX21vZGUpOwotRVhQT1JUX1NZTUJPTChzZXRfZG1hX3BhZ2UpOwotRVhQT1JUX1NZTUJPTChnZXRfZG1hX3Jlc2lkdWUpOwotRVhQT1JUX1NZTUJPTChzZXRfZG1hX3NnKTsKLUVYUE9SVF9TWU1CT0woc2V0X2RtYV9zcGVlZCk7Ci0KLUVYUE9SVF9TWU1CT0woZG1hX3NwaW5fbG9jayk7Citjb3JlX2luaXRjYWxsKGluaXRfZG1hKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9lY2FyZC5jIGIvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKaW5kZXggZGNlYjgyNi4uNzRlYTI5YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2VjYXJkLmg+CkBAIC0yMDYsNyArMjA3LDcgQEAKIAogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGVjYXJkX3dhaXQpOwogc3RhdGljIHN0cnVjdCBlY2FyZF9yZXF1ZXN0ICplY2FyZF9yZXE7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWChlY2FyZF9zZW0pOworc3RhdGljIERFRklORV9NVVRFWChlY2FyZF9tdXRleCk7CiAKIC8qCiAgKiBTZXQgdXAgdGhlIGV4cGFuc2lvbiBjYXJkIGRhZW1vbidzIHBhZ2UgdGFibGVzLgpAQCAtMjk5LDcgKzMwMCw3IEBACiAKIAlyZXEtPmNvbXBsZXRlID0gJmNvbXBsZXRpb247CiAKLQlkb3duKCZlY2FyZF9zZW0pOworCW11dGV4X2xvY2soJmVjYXJkX211dGV4KTsKIAllY2FyZF9yZXEgPSByZXE7CiAJd2FrZV91cCgmZWNhcmRfd2FpdCk7CiAKQEAgLTMwNyw3ICszMDgsNyBAQAogCSAqIE5vdyB3YWl0IGZvciBrZWNhcmRkIHRvIHJ1bi4KIAkgKi8KIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wbGV0aW9uKTsKLQl1cCgmZWNhcmRfc2VtKTsKKwltdXRleF91bmxvY2soJmVjYXJkX211dGV4KTsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT0gTWlkLWxldmVsIGNhcmQgY29udHJvbCA9PT09PT09PT09PT09PT09PT09PT0gKi8KQEAgLTExNDYsOSArMTE0NywxMSBAQAogCXN0cnVjdCBlY2FyZF9kcml2ZXIgKmRydiA9IEVDQVJEX0RSVihkZXYtPmRyaXZlcik7CiAJc3RydWN0IGVjYXJkX3JlcXVlc3QgcmVxOwogCi0JaWYgKGRydi0+c2h1dGRvd24pCi0JCWRydi0+c2h1dGRvd24oZWMpOwotCWVjYXJkX3JlbGVhc2UoZWMpOworCWlmIChkZXYtPmRyaXZlcikgeworCQlpZiAoZHJ2LT5zaHV0ZG93bikKKwkJCWRydi0+c2h1dGRvd24oZWMpOworCQllY2FyZF9yZWxlYXNlKGVjKTsKKwl9CiAKIAkvKgogCSAqIElmIHRoaXMgY2FyZCBoYXMgYSBsb2FkZXIsIGNhbGwgdGhlIHJlc2V0IGhhbmRsZXIuCkBAIC0xMTYzLDkgKzExNjYsNiBAQAogaW50IGVjYXJkX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgZWNhcmRfZHJpdmVyICpkcnYpCiB7CiAJZHJ2LT5kcnYuYnVzID0gJmVjYXJkX2J1c190eXBlOwotCWRydi0+ZHJ2LnByb2JlID0gZWNhcmRfZHJ2X3Byb2JlOwotCWRydi0+ZHJ2LnJlbW92ZSA9IGVjYXJkX2Rydl9yZW1vdmU7Ci0JZHJ2LT5kcnYuc2h1dGRvd24gPSBlY2FyZF9kcnZfc2h1dGRvd247CiAKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRydik7CiB9CkBAIC0xMTk0LDYgKzExOTQsOSBAQAogCS5uYW1lCQk9ICJlY2FyZCIsCiAJLmRldl9hdHRycwk9IGVjYXJkX2Rldl9hdHRycywKIAkubWF0Y2gJCT0gZWNhcmRfbWF0Y2gsCisJLnByb2JlCQk9IGVjYXJkX2Rydl9wcm9iZSwKKwkucmVtb3ZlCQk9IGVjYXJkX2Rydl9yZW1vdmUsCisJLnNodXRkb3duCT0gZWNhcmRfZHJ2X3NodXRkb3duLAogfTsKIAogc3RhdGljIGludCBlY2FyZF9idXNfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2VudHJ5LWFybXYuUyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1hcm12LlMKaW5kZXggMmE4ZDI3ZS4uZDQwMWQ5MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2VudHJ5LWFybXYuUworKysgYi9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TCkBAIC0zLDYgKzMsNyBAQAogICoKICAqICBDb3B5cmlnaHQgKEMpIDE5OTYsMTk5NywxOTk4IFJ1c3NlbGwgS2luZy4KICAqICBBUk03MDAgZml4IGJ5IE1hdHRoZXcgR29kYm9sdCAobGludXgtdXNlckB3aWxsb3RoZXdpc3AuZGVtb24uY28udWspCisgKiAgbm9tbXUgc3VwcG9ydCBieSBIeW9rIFMuIENob2kgKGh5b2suY2hvaUBzYW1zdW5nLmNvbSkKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTE4LDggKzE5LDYgQEAKICNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CiAjaW5jbHVkZSA8YXNtL2dsdWUuaD4KICNpbmNsdWRlIDxhc20vdmZwbWFjcm9zLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CQkvKiBzaG91bGQgYmUgbW92ZWQgaW50byBlbnRyeS1tYWNyby5TICovCi0jaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgkJLyogc2hvdWxkIGJlIG1vdmVkIGludG8gZW50cnktbWFjcm8uUyAqLwogI2luY2x1ZGUgPGFzbS9hcmNoL2VudHJ5LW1hY3JvLlM+CiAKICNpbmNsdWRlICJlbnRyeS1oZWFkZXIuUyIKQEAgLTEwNiwxNCArMTA1LDI0IEBACiAvKgogICogU1ZDIG1vZGUgaGFuZGxlcnMKICAqLworCisjaWYgZGVmaW5lZChDT05GSUdfQUVBQkkpICYmIChfX0xJTlVYX0FSTV9BUkNIX18gPj0gNSkKKyNkZWZpbmUgU1BGSVgoY29kZS4uLikgY29kZQorI2Vsc2UKKyNkZWZpbmUgU1BGSVgoY29kZS4uLikKKyNlbmRpZgorCiAJLm1hY3JvCXN2Y19lbnRyeQogCXN1YglzcCwgc3AsICNTX0ZSQU1FX1NJWkUKKyBTUEZJWCgJdHN0CXNwLCAjNAkJKQorIFNQRklYKAliaWNuZQlzcCwgc3AsICM0CSkKIAlzdG1pYglzcCwge3IxIC0gcjEyfQogCiAJbGRtaWEJcjAsIHtyMSAtIHIzfQogCWFkZAlyNSwgc3AsICNTX1NQCQlAIGhlcmUgZm9yIGludGVybG9jayBhdm9pZGFuY2UKIAltb3YJcjQsICMtMQkJCUAgICIiICAiIiAgICAgICIiICAgICAgICIiCiAJYWRkCXIwLCBzcCwgI1NfRlJBTUVfU0laRSAgIEAgICIiICAiIiAgICAgICIiICAgICAgICIiCisgU1BGSVgoCWFkZG5lCXIwLCByMCwgIzQJKQogCXN0cglyMSwgW3NwXQkJQCBzYXZlIHRoZSAicmVhbCIgcjAgY29waWVkCiAJCQkJCUAgZnJvbSB0aGUgZXhjZXB0aW9uIHN0YWNrCiAKQEAgLTMwNCw3ICszMTMsMTQgQEAKIAogLyoKICAqIFVzZXIgbW9kZSBoYW5kbGVycworICoKKyAqIEVBQkkgbm90ZTogc3Bfc3ZjIGlzIGFsd2F5cyA2NC1iaXQgYWxpZ25lZCBoZXJlLCBzbyBzaG91bGQgU19GUkFNRV9TSVpFCiAgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0FFQUJJKSAmJiAoX19MSU5VWF9BUk1fQVJDSF9fID49IDUpICYmIChTX0ZSQU1FX1NJWkUgJiA3KQorI2Vycm9yICJzaXplb2Yoc3RydWN0IHB0X3JlZ3MpIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IgorI2VuZGlmCisKIAkubWFjcm8JdXNyX2VudHJ5CiAJc3ViCXNwLCBzcCwgI1NfRlJBTUVfU0laRQogCXN0bWliCXNwLCB7cjEgLSByMTJ9CkBAIC01NDAsNyArNTU2LDExIEBACiAJYWRkCWlwLCByMSwgI1RJX0NQVV9TQVZFCiAJbGRyCXIzLCBbcjIsICNUSV9UUF9WQUxVRV0KIAlzdG1pYQlpcCEsIHtyNCAtIHNsLCBmcCwgc3AsIGxyfQlAIFN0b3JlIG1vc3QgcmVncyBvbiBzdGFjaworI2lmbmRlZiBDT05GSUdfTU1VCisJYWRkCXIyLCByMiwgI1RJX0NQVV9ET01BSU4KKyNlbHNlCiAJbGRyCXI2LCBbcjIsICNUSV9DUFVfRE9NQUlOXSEKKyNlbmRpZgogI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA2CiAjaWZkZWYgQ09ORklHX0NQVV9NUENPUkUKIAljbHJleApAQCAtNTU4LDcgKzU3OCw5IEBACiAJbW92CXI0LCAjMHhmZmZmMGZmZgogCXN0cglyMywgW3I0LCAjLTE1XQkJCUAgVExTIHZhbCBhdCAweGZmZmYwZmYwCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfTU1VCiAJbWNyCXAxNSwgMCwgcjYsIGMzLCBjMCwgMAkJQCBTZXQgZG9tYWluIHJlZ2lzdGVyCisjZW5kaWYKICNpZmRlZiBDT05GSUdfVkZQCiAJQCBBbHdheXMgZGlzYWJsZSBWRlAgc28gd2UgY2FuIGxhemlseSBzYXZlL3Jlc3RvcmUgdGhlIG9sZAogCUAgc3RhdGUuIFRoaXMgb2NjdXJzIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwcmV2aW91cyB0aHJlYWQuCkBAIC03MTMsOCArNzM1LDExIEBACiAJICogVGhlIGtlcm5lbCBpdHNlbGYgbXVzdCBwZXJmb3JtIHRoZSBvcGVyYXRpb24uCiAJICogQSBzcGVjaWFsIGdob3N0IHN5c2NhbGwgaXMgdXNlZCBmb3IgdGhhdCAoc2VlIHRyYXBzLmMpLgogCSAqLworCXN0bWZkCXNwISwge3I3LCBscn0KKwltb3YJcjcsICMweGZmMDAJCUAgMHhmZmYwIGludG8gcjcgZm9yIEVBQkkKKwlvcnIJcjcsIHI3LCAjMHhmMAogCXN3aQkjMHg5ZmZmZjAKLQltb3YJcGMsIGxyCisJbGRtZmQJc3AhLCB7cjcsIHBjfQogCiAjZWxpZiBfX0xJTlVYX0FSTV9BUkNIX18gPCA2CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1jb21tb24uUyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1jb21tb24uUwppbmRleCBlMmI0Mjk5Li4yYjkyY2U4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZW50cnktY29tbW9uLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWNvbW1vbi5TCkBAIC05OCwyMCArOTgsMTQgQEAKIAkgICBydW4gb24gYW4gQVJNNyBhbmQgd2UgY2FuIHNhdmUgYSBjb3VwbGUgb2YgaW5zdHJ1Y3Rpb25zLiAgCiAJCQkJCQkJCS0tcGIgKi8KICNpZmRlZiBDT05GSUdfQ1BVX0FSTTcxMAotCS5tYWNybwlhcm03MTBfYnVnX2NoZWNrLCBpbnN0ciwgdGVtcAotCWFuZAlcdGVtcCwgXGluc3RyLCAjMHgwZjAwMDAwMAlAIGNoZWNrIGZvciBTV0kKLQl0ZXEJXHRlbXAsICMweDBmMDAwMDAwCi0JYm5lCS5MYXJtNzAwYnVnCi0JLmVuZG0KLQotLkxhcm03MDBidWc6CisjZGVmaW5lIEE3MTAoY29kZS4uLikgY29kZQorLkxhcm03MTBidWc6CiAJbGRtaWEJc3AsIHtyMCAtIGxyfV4JCQlAIEdldCBjYWxsaW5nIHIwIC0gbHIKIAltb3YJcjAsIHIwCiAJYWRkCXNwLCBzcCwgI1NfRlJBTUVfU0laRQogCXN1YnMJcGMsIGxyLCAjNAogI2Vsc2UKLQkubWFjcm8JYXJtNzEwX2J1Z19jaGVjaywgaW5zdHIsIHRlbXAKLQkuZW5kbQorI2RlZmluZSBBNzEwKGNvZGUuLi4pCiAjZW5kaWYKIAogCS5hbGlnbgk1CkBAIC0xMjksMTQgKzEyMyw1MCBAQAogCS8qCiAJICogR2V0IHRoZSBzeXN0ZW0gY2FsbCBudW1iZXIuCiAJICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19PQUJJX0NPTVBBVCkKKworCS8qCisJICogSWYgd2UgaGF2ZSBDT05GSUdfT0FCSV9DT01QQVQgdGhlbiB3ZSBuZWVkIHRvIGxvb2sgYXQgdGhlIHN3aQorCSAqIHZhbHVlIHRvIGRldGVybWluZSBpZiBpdCBpcyBhbiBFQUJJIG9yIGFuIG9sZCBBQkkgY2FsbC4KKwkgKi8KICNpZmRlZiBDT05GSUdfQVJNX1RIVU1CCisJdHN0CXI4LCAjUFNSX1RfQklUCisJbW92bmUJcjEwLCAjMAkJCQlAIG5vIHRodW1iIE9BQkkgZW11bGF0aW9uCisJbGRyZXEJcjEwLCBbbHIsICMtNF0JCQlAIGdldCBTV0kgaW5zdHJ1Y3Rpb24KKyNlbHNlCisJbGRyCXIxMCwgW2xyLCAjLTRdCQkJQCBnZXQgU1dJIGluc3RydWN0aW9uCisgIEE3MTAoCWFuZAlpcCwgcjEwLCAjMHgwZjAwMDAwMAkJQCBjaGVjayBmb3IgU1dJCQkpCisgIEE3MTAoCXRlcQlpcCwgIzB4MGYwMDAwMDAJCQkJCQkpCisgIEE3MTAoCWJuZQkuTGFybTcxMGJ1ZwkJCQkJCSkKKyNlbmRpZgorCisjZWxpZiBkZWZpbmVkKENPTkZJR19BRUFCSSkKKworCS8qCisJICogUHVyZSBFQUJJIHVzZXIgc3BhY2UgYWx3YXlzIHB1dCBzeXNjYWxsIG51bWJlciBpbnRvIHNjbm8gKHI3KS4KKwkgKi8KKyAgQTcxMCgJbGRyCWlwLCBbbHIsICMtNF0JCQlAIGdldCBTV0kgaW5zdHJ1Y3Rpb24JKQorICBBNzEwKAlhbmQJaXAsIGlwLCAjMHgwZjAwMDAwMAkJQCBjaGVjayBmb3IgU1dJCQkpCisgIEE3MTAoCXRlcQlpcCwgIzB4MGYwMDAwMDAJCQkJCQkpCisgIEE3MTAoCWJuZQkuTGFybTcxMGJ1ZwkJCQkJCSkKKworI2VsaWYgZGVmaW5lZChDT05GSUdfQVJNX1RIVU1CKQorCisJLyogTGVnYWN5IEFCSSBvbmx5LCBwb3NzaWJseSB0aHVtYiBtb2RlLiAqLwogCXRzdAlyOCwgI1BTUl9UX0JJVAkJCUAgdGhpcyBpcyBTUFNSIGZyb20gc2F2ZV91c2VyX3JlZ3MKIAlhZGRuZQlzY25vLCByNywgI19fTlJfU1lTQ0FMTF9CQVNFCUAgcHV0IE9TIG51bWJlciBpbgogCWxkcmVxCXNjbm8sIFtsciwgIy00XQorCiAjZWxzZQorCisJLyogTGVnYWN5IEFCSSBvbmx5LiAqLwogCWxkcglzY25vLCBbbHIsICMtNF0JCQlAIGdldCBTV0kgaW5zdHJ1Y3Rpb24KKyAgQTcxMCgJYW5kCWlwLCBzY25vLCAjMHgwZjAwMDAwMAkJQCBjaGVjayBmb3IgU1dJCQkpCisgIEE3MTAoCXRlcQlpcCwgIzB4MGYwMDAwMDAJCQkJCQkpCisgIEE3MTAoCWJuZQkuTGFybTcxMGJ1ZwkJCQkJCSkKKwogI2VuZGlmCi0JYXJtNzEwX2J1Z19jaGVjayBzY25vLCBpcAogCiAjaWZkZWYgQ09ORklHX0FMSUdOTUVOVF9UUkFQCiAJbGRyCWlwLCBfX2NyX2FsaWdubWVudApAQCAtMTQ1LDE4ICsxNzUsMzEgQEAKICNlbmRpZgogCWVuYWJsZV9pcnEKIAotCXN0bWRiCXNwISwge3I0LCByNX0JCQlAIHB1c2ggZmlmdGggYW5kIHNpeHRoIGFyZ3MKLQogCWdldF90aHJlYWRfaW5mbyB0c2sKKwlhZHIJdGJsLCBzeXNfY2FsbF90YWJsZQkJQCBsb2FkIHN5c2NhbGwgdGFibGUgcG9pbnRlcgogCWxkcglpcCwgW3RzaywgI1RJX0ZMQUdTXQkJQCBjaGVjayBmb3Igc3lzY2FsbCB0cmFjaW5nCisKKyNpZiBkZWZpbmVkKENPTkZJR19PQUJJX0NPTVBBVCkKKwkvKgorCSAqIElmIHRoZSBzd2kgYXJndW1lbnQgaXMgemVybywgdGhpcyBpcyBhbiBFQUJJIGNhbGwgYW5kIHdlIGRvIG5vdGhpbmcuCisJICoKKwkgKiBJZiB0aGlzIGlzIGFuIG9sZCBBQkkgY2FsbCwgZ2V0IHRoZSBzeXNjYWxsIG51bWJlciBpbnRvIHNjbm8gYW5kCisJICogZ2V0IHRoZSBvbGQgQUJJIHN5c2NhbGwgdGFibGUgYWRkcmVzcy4KKwkgKi8KKwliaWNzCXIxMCwgcjEwLCAjMHhmZjAwMDAwMAorCWVvcm5lCXNjbm8sIHIxMCwgI19fTlJfT0FCSV9TWVNDQUxMX0JBU0UKKwlsZHJuZQl0YmwsID1zeXNfb2FiaV9jYWxsX3RhYmxlCisjZWxpZiAhZGVmaW5lZChDT05GSUdfQUVBQkkpCiAJYmljCXNjbm8sIHNjbm8sICMweGZmMDAwMDAwCQlAIG1hc2sgb2ZmIFNXSSBvcC1jb2RlCiAJZW9yCXNjbm8sIHNjbm8sICNfX05SX1NZU0NBTExfQkFTRQlAIGNoZWNrIE9TIG51bWJlcgotCWFkcgl0YmwsIHN5c19jYWxsX3RhYmxlCQlAIGxvYWQgc3lzY2FsbCB0YWJsZSBwb2ludGVyCisjZW5kaWYKKworCXN0bWRiCXNwISwge3I0LCByNX0JCQlAIHB1c2ggZmlmdGggYW5kIHNpeHRoIGFyZ3MKIAl0c3QJaXAsICNfVElGX1NZU0NBTExfVFJBQ0UJCUAgYXJlIHdlIHRyYWNpbmcgc3lzY2FsbHM/CiAJYm5lCV9fc3lzX3RyYWNlCiAKLQlhZHIJbHIsIHJldF9mYXN0X3N5c2NhbGwJCUAgcmV0dXJuIGFkZHJlc3MKIAljbXAJc2NubywgI05SX3N5c2NhbGxzCQlAIGNoZWNrIHVwcGVyIHN5c2NhbGwgbGltaXQKKwlhZHIJbHIsIHJldF9mYXN0X3N5c2NhbGwJCUAgcmV0dXJuIGFkZHJlc3MKIAlsZHJjYwlwYywgW3RibCwgc2NubywgbHNsICMyXQkJQCBjYWxsIHN5c18qIHJvdXRpbmUKIAogCWFkZAlyMSwgc3AsICNTX09GRgpAQCAtMTcxLDExICsyMTQsMTMgQEAKIAkgKiBjb250ZXh0IHN3aXRjaGVzLCBhbmQgd2FpdGluZyBmb3Igb3VyIHBhcmVudCB0byByZXNwb25kLgogCSAqLwogX19zeXNfdHJhY2U6CisJbW92CXIyLCBzY25vCiAJYWRkCXIxLCBzcCwgI1NfT0ZGCiAJbW92CXIwLCAjMAkJCQlAIHRyYWNlIGVudHJ5IFtJUCA9IDBdCiAJYmwJc3lzY2FsbF90cmFjZQogCiAJYWRyCWxyLCBfX3N5c190cmFjZV9yZXR1cm4JCUAgcmV0dXJuIGFkZHJlc3MKKwltb3YJc2NubywgcjAJCQlAIHN5c2NhbGwgbnVtYmVyIChwb3NzaWJseSBuZXcpCiAJYWRkCXIxLCBzcCwgI1NfUjAgKyBTX09GRgkJQCBwb2ludGVyIHRvIHJlZ3MKIAljbXAJc2NubywgI05SX3N5c2NhbGxzCQlAIGNoZWNrIHVwcGVyIHN5c2NhbGwgbGltaXQKIAlsZG1jY2lhCXIxLCB7cjAgLSByM30JCQlAIGhhdmUgdG8gcmVsb2FkIHIwIC0gcjMKQEAgLTE4NCw2ICsyMjksNyBAQAogCiBfX3N5c190cmFjZV9yZXR1cm46CiAJc3RyCXIwLCBbc3AsICNTX1IwICsgU19PRkZdIQlAIHNhdmUgcmV0dXJuZWQgcjAKKwltb3YJcjIsIHNjbm8KIAltb3YJcjEsIHNwCiAJbW92CXIwLCAjMQkJCQlAIHRyYWNlIGV4aXQgW0lQID0gMV0KIAlibAlzeXNjYWxsX3RyYWNlCkBAIC0xOTUsMTAgKzI0MSwyNCBAQAogX19jcl9hbGlnbm1lbnQ6CiAJLndvcmQJY3JfYWxpZ25tZW50CiAjZW5kaWYKKwkubHRvcmcKKworLyoKKyAqIFRoaXMgaXMgdGhlIHN5c2NhbGwgdGFibGUgZGVjbGFyYXRpb24gZm9yIG5hdGl2ZSBBQkkgc3lzY2FsbHMuCisgKiBXaXRoIEVBQkkgYSBjb3VwbGUgc3lzY2FsbHMgYXJlIG9ic29sZXRlIGFuZCBkZWZpbmVkIGFzIHN5c19uaV9zeXNjYWxsLgorICovCisjZGVmaW5lIEFCSShuYXRpdmUsIGNvbXBhdCkgbmF0aXZlCisjaWZkZWYgQ09ORklHX0FFQUJJCisjZGVmaW5lIE9CU09MRVRFKHN5c2NhbGwpIHN5c19uaV9zeXNjYWxsCisjZWxzZQorI2RlZmluZSBPQlNPTEVURShzeXNjYWxsKSBzeXNjYWxsCisjZW5kaWYKIAogCS50eXBlCXN5c19jYWxsX3RhYmxlLCAjb2JqZWN0CiBFTlRSWShzeXNfY2FsbF90YWJsZSkKICNpbmNsdWRlICJjYWxscy5TIgorI3VuZGVmIEFCSQorI3VuZGVmIE9CU09MRVRFCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogU3BlY2lhbCBzeXN0ZW0gY2FsbCB3cmFwcGVycwpAQCAtMjA3LDcgKzI2Nyw3IEBACiBAIHI4ID0gc3lzY2FsbCB0YWJsZQogCQkudHlwZQlzeXNfc3lzY2FsbCwgI2Z1bmN0aW9uCiBzeXNfc3lzY2FsbDoKLQkJZW9yCXNjbm8sIHIwLCAjX19OUl9TWVNDQUxMX0JBU0UKKwkJZW9yCXNjbm8sIHIwLCAjX19OUl9PQUJJX1NZU0NBTExfQkFTRQogCQljbXAJc2NubywgI19fTlJfc3lzY2FsbCAtIF9fTlJfU1lTQ0FMTF9CQVNFCiAJCWNtcG5lCXNjbm8sICNOUl9zeXNjYWxscwlAIGNoZWNrIHJhbmdlCiAJCXN0bWxvaWEJc3AsIHtyNSwgcjZ9CQlAIHNodWZmbGUgYXJncwpAQCAtMjU1LDYgKzMxNSwxNiBAQAogCQlsZHIJcjIsIFtzcCwgI1NfT0ZGICsgU19TUF0KIAkJYglkb19zaWdhbHRzdGFjawogCitzeXNfc3RhdGZzNjRfd3JhcHBlcjoKKwkJdGVxCXIxLCAjODgKKwkJbW92ZXEJcjEsICM4NAorCQliCXN5c19zdGF0ZnM2NAorCitzeXNfZnN0YXRmczY0X3dyYXBwZXI6CisJCXRlcQlyMSwgIzg4CisJCW1vdmVxCXIxLCAjODQKKwkJYglzeXNfZnN0YXRmczY0CisKIC8qCiAgKiBOb3RlOiBvZmZfNGsgKHI1KSBpcyBhbHdheXMgdW5pdHMgb2YgNEsuICBJZiB3ZSBjYW4ndCBkbyB0aGUgcmVxdWVzdGVkCiAgKiBvZmZzZXQsIHdlIHJldHVybiBFSU5WQUwuCkBAIC0yNzEsMyArMzQxLDQ5IEBACiAJCXN0cglyNSwgW3NwLCAjNF0KIAkJYglkb19tbWFwMgogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfT0FCSV9DT01QQVQKKworLyoKKyAqIFRoZXNlIGFyZSBzeXNjYWxscyB3aXRoIGFyZ3VtZW50IHJlZ2lzdGVyIGRpZmZlcmVuY2VzCisgKi8KKworc3lzX29hYmlfcHJlYWQ2NDoKKwkJc3RtaWEJc3AsIHtyMywgcjR9CisJCWIJc3lzX3ByZWFkNjQKKworc3lzX29hYmlfcHdyaXRlNjQ6CisJCXN0bWlhCXNwLCB7cjMsIHI0fQorCQliCXN5c19wd3JpdGU2NAorCitzeXNfb2FiaV90cnVuY2F0ZTY0OgorCQltb3YJcjMsIHIyCisJCW1vdglyMiwgcjEKKwkJYglzeXNfdHJ1bmNhdGU2NAorCitzeXNfb2FiaV9mdHJ1bmNhdGU2NDoKKwkJbW92CXIzLCByMgorCQltb3YJcjIsIHIxCisJCWIJc3lzX2Z0cnVuY2F0ZTY0CisKK3N5c19vYWJpX3JlYWRhaGVhZDoKKwkJc3RyCXIzLCBbc3BdCisJCW1vdglyMywgcjIKKwkJbW92CXIyLCByMQorCQliCXN5c19yZWFkYWhlYWQKKworLyoKKyAqIExldCdzIGRlY2xhcmUgYSBzZWNvbmQgc3lzY2FsbCB0YWJsZSBmb3Igb2xkIEFCSSBiaW5hcmllcworICogdXNpbmcgdGhlIGNvbXBhdGliaWxpdHkgc3lzY2FsbCBlbnRyaWVzLgorICovCisjZGVmaW5lIEFCSShuYXRpdmUsIGNvbXBhdCkgY29tcGF0CisjZGVmaW5lIE9CU09MRVRFKHN5c2NhbGwpIHN5c2NhbGwKKworCS50eXBlCXN5c19vYWJpX2NhbGxfdGFibGUsICNvYmplY3QKK0VOVFJZKHN5c19vYWJpX2NhbGxfdGFibGUpCisjaW5jbHVkZSAiY2FsbHMuUyIKKyN1bmRlZiBBQkkKKyN1bmRlZiBPQlNPTEVURQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2VudHJ5LWhlYWRlci5TIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWhlYWRlci5TCmluZGV4IDY0OGNmZmYuLjU1Yzk5Y2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1oZWFkZXIuUworKysgYi9hcmNoL2FybS9rZXJuZWwvZW50cnktaGVhZGVyLlMKQEAgLTE5LDYgKzE5LDcgQEAKIEAKIEAgTW9zdCBvZiB0aGUgc3RhY2sgZm9ybWF0IGNvbWVzIGZyb20gc3RydWN0IHB0X3JlZ3MsIGJ1dCB3aXRoCiBAIHRoZSBhZGRpdGlvbiBvZiA4IGJ5dGVzIGZvciBzdG9yaW5nIHN5c2NhbGwgYXJncyA1IGFuZCA2LgorQCBUaGlzIF9tdXN0XyByZW1haW4gYSBtdWx0aXBsZSBvZiA4IGZvciBFQUJJLgogQAogI2RlZmluZSBTX09GRgkJOAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZmlxLmMgYi9hcmNoL2FybS9rZXJuZWwvZmlxLmMKaW5kZXggOTI5OWRmYzI1Li4xZWMzZjdmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZmlxLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2ZpcS5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAlsZG1pYQklMSwge3I4IC0gcjE0fVxuXAogCW1zcgljcHNyX2MsICUwCUAgcmV0dXJuIHRvIFNWQyBtb2RlXG5cCiAJbW92CXIwLCByMFxuXAotCWxkbWVhCWZwLCB7ZnAsIHNwLCBwY30iCisJbGRtZmQJc3AsIHtmcCwgc3AsIHBjfSIKIAk6ICI9JnIiICh0bXApCiAJOiAiciIgKCZyZWdzLT5BUk1fcjgpLCAiSSIgKFBTUl9JX0JJVCB8IFBTUl9GX0JJVCB8IEZJUV9NT0RFKSk7CiB9CkBAIC0xMTksNyArMTE5LDcgQEAKIAlzdG1pYQklMSwge3I4IC0gcjE0fVxuXAogCW1zcgljcHNyX2MsICUwCUAgcmV0dXJuIHRvIFNWQyBtb2RlXG5cCiAJbW92CXIwLCByMFxuXAotCWxkbWVhCWZwLCB7ZnAsIHNwLCBwY30iCisJbGRtZmQJc3AsIHtmcCwgc3AsIHBjfSIKIAk6ICI9JnIiICh0bXApCiAJOiAiciIgKCZyZWdzLT5BUk1fcjgpLCAiSSIgKFBTUl9JX0JJVCB8IFBTUl9GX0JJVCB8IEZJUV9NT0RFKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaGVhZC5TIGIvYXJjaC9hcm0va2VybmVsL2hlYWQuUwppbmRleCBkN2Q2OWZkNy4uMWFjYTE3NzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2hlYWQuUwpAQCAtMzMsNiArMzMsOCBAQAogI2RlZmluZSBNQUNISU5GT19QR09GRklPCTEyCiAjZGVmaW5lIE1BQ0hJTkZPX05BTUUJCTE2CiAKKyNkZWZpbmUgS0VSTkVMX1JBTV9BRERSCShQQUdFX09GRlNFVCArIFRFWFRfT0ZGU0VUKQorCiAvKgogICogc3dhcHBlcl9wZ19kaXIgaXMgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgaW5pdGlhbCBwYWdlIHRhYmxlLgogICogV2UgcGxhY2UgdGhlIHBhZ2UgdGFibGVzIDE2SyBiZWxvdyBLRVJORUxfUkFNX0FERFIuICBUaGVyZWZvcmUsIHdlIG11c3QKQEAgLTI0OSwxMiArMjUxLDExIEBACiAgKiByMTAgPSBwcm9jaW5mbwogICoKICAqIFJldHVybnM6Ci0gKiAgcjAsIHIzLCByNSwgcjYsIHI3IGNvcnJ1cHRlZAorICogIHIwLCByMywgcjYsIHI3IGNvcnJ1cHRlZAogICogIHI0ID0gcGh5c2ljYWwgcGFnZSB0YWJsZSBhZGRyZXNzCiAgKi8KIAkudHlwZQlfX2NyZWF0ZV9wYWdlX3RhYmxlcywgJWZ1bmN0aW9uCiBfX2NyZWF0ZV9wYWdlX3RhYmxlczoKLQlsZHIJcjUsIFtyOCwgI01BQ0hJTkZPX1BIWVNSQU1dCUAgcGh5c3JhbQogCXBndGJsCXI0CQkJCUAgcGFnZSB0YWJsZSBhZGRyZXNzCiAKIAkvKgpAQCAtMzAxLDcgKzMwMiw3IEBACiAJICogVGhlbiBtYXAgZmlyc3QgMU1CIG9mIHJhbSBpbiBjYXNlIGl0IGNvbnRhaW5zIG91ciBib290IHBhcmFtcy4KIAkgKi8KIAlhZGQJcjAsIHI0LCAjUEFHRV9PRkZTRVQgPj4gMTgKLQlvcnIJcjYsIHI1LCByNworCW9ycglyNiwgcjcsICNQSFlTX09GRlNFVAogCXN0cglyNiwgW3IwXQogCiAjaWZkZWYgQ09ORklHX1hJUF9LRVJORUwKQEAgLTMwOSw3ICszMTAsNyBAQAogCSAqIE1hcCBzb21lIHJhbSB0byBjb3ZlciBvdXIgLmRhdGEgYW5kIC5ic3MgYXJlYXMuCiAJICogTWFwcGluZyAzTUIgc2hvdWxkIGJlIHBsZW50eS4KIAkgKi8KLQlzdWIJcjMsIHI0LCByNQorCXN1YglyMywgcjQsICNQSFlTX09GRlNFVAogCW1vdglyMywgcjMsIGxzciAjMjAKIAlhZGQJcjAsIHIwLCByMywgbHNsICMyCiAJYWRkCXI2LCByNiwgcjMsIGxzbCAjMjAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9pcnEuYyBiL2FyY2gvYXJtL2tlcm5lbC9pcnEuYwppbmRleCBkNzA5OWRiLi4xZDUwZDJiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2lycS5jCkBAIC02ODQsOCArNjg0LDEyIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKIAlwID0gJmRlc2MtPmFjdGlvbjsKIAlpZiAoKG9sZCA9ICpwKSAhPSBOVUxMKSB7Ci0JCS8qIENhbid0IHNoYXJlIGludGVycnVwdHMgdW5sZXNzIGJvdGggYWdyZWUgdG8gKi8KLQkJaWYgKCEob2xkLT5mbGFncyAmIG5ldy0+ZmxhZ3MgJiBTQV9TSElSUSkpIHsKKwkJLyoKKwkJICogQ2FuJ3Qgc2hhcmUgaW50ZXJydXB0cyB1bmxlc3MgYm90aCBhZ3JlZSB0byBhbmQgYXJlCisJCSAqIHRoZSBzYW1lIHR5cGUuCisJCSAqLworCQlpZiAoIShvbGQtPmZsYWdzICYgbmV3LT5mbGFncyAmIFNBX1NISVJRKSB8fAorCQkgICAgKH5vbGQtPmZsYWdzICYgbmV3LT5mbGFncykgJiBTQV9UUklHR0VSX01BU0spIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KQEAgLTcwNSw2ICs3MDksMTMgQEAKIAkJZGVzYy0+cnVubmluZyA9IDA7CiAJCWRlc2MtPnBlbmRpbmcgPSAwOwogCQlkZXNjLT5kaXNhYmxlX2RlcHRoID0gMTsKKworCQlpZiAobmV3LT5mbGFncyAmIFNBX1RSSUdHRVJfTUFTSyAmJgorCQkgICAgZGVzYy0+Y2hpcC0+c2V0X3R5cGUpIHsKKwkJCXVuc2lnbmVkIGludCB0eXBlID0gbmV3LT5mbGFncyAmIFNBX1RSSUdHRVJfTUFTSzsKKwkJCWRlc2MtPmNoaXAtPnNldF90eXBlKGlycSwgdHlwZSk7CisJCX0KKwogCQlpZiAoIWRlc2MtPm5vYXV0b2VuYWJsZSkgewogCQkJZGVzYy0+ZGlzYWJsZV9kZXB0aCA9IDA7CiAJCQlkZXNjLT5jaGlwLT51bm1hc2soaXJxKTsKQEAgLTEwMjcsNyArMTAzOCw2IEBACiB2b2lkIF9faW5pdCBpbml0X0lSUSh2b2lkKQogewogCXN0cnVjdCBpcnFkZXNjICpkZXNjOwotCWV4dGVybiB2b2lkIGluaXRfZG1hKHZvaWQpOwogCWludCBpcnE7CiAKICNpZmRlZiBDT05GSUdfU01QCkBAIC0xMDQxLDcgKzEwNTEsNiBAQAogCX0KIAogCWluaXRfYXJjaF9pcnEoKTsKLQlpbml0X2RtYSgpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBub2lycWRlYnVnX3NldHVwKGNoYXIgKnN0cikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDMwNDk0YWEuLjRiNGU0Y2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYwpAQCAtMjgsMTAgKzI4LDkgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAKLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogCkBAIC0zNDMsMTAgKzM0MiwxMCBAQAogdm9pZCByZWxlYXNlX3RocmVhZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmRlYWRfdGFzaykKIHsKICNpZiBkZWZpbmVkKENPTkZJR19WRlApCi0JdmZwX3JlbGVhc2VfdGhyZWFkKCZkZWFkX3Rhc2stPnRocmVhZF9pbmZvLT52ZnBzdGF0ZSk7CisJdmZwX3JlbGVhc2VfdGhyZWFkKCZ0YXNrX3RocmVhZF9pbmZvKGRlYWRfdGFzayktPnZmcHN0YXRlKTsKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0lXTU1YVCkKLQlpd21teHRfdGFza19yZWxlYXNlKGRlYWRfdGFzay0+dGhyZWFkX2luZm8pOworCWl3bW14dF90YXNrX3JlbGVhc2UodGFza190aHJlYWRfaW5mbyhkZWFkX3Rhc2spKTsKICNlbmRpZgogfQogCkBAIC0zNTYsMTAgKzM1NSw5IEBACiBjb3B5X3RocmVhZChpbnQgbnIsIHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgc3RhY2tfc3RhcnQsCiAJICAgIHVuc2lnbmVkIGxvbmcgc3RrX3N6LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkID0gcC0+dGhyZWFkX2luZm87Ci0Jc3RydWN0IHB0X3JlZ3MgKmNoaWxkcmVnczsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRocmVhZCA9IHRhc2tfdGhyZWFkX2luZm8ocCk7CisJc3RydWN0IHB0X3JlZ3MgKmNoaWxkcmVncyA9IHRhc2tfcHRfcmVncyhwKTsKIAotCWNoaWxkcmVncyA9ICh2b2lkICopdGhyZWFkICsgVEhSRUFEX1NUQVJUX1NQIC0gc2l6ZW9mKCpyZWdzKTsKIAkqY2hpbGRyZWdzID0gKnJlZ3M7CiAJY2hpbGRyZWdzLT5BUk1fcjAgPSAwOwogCWNoaWxkcmVncy0+QVJNX3NwID0gc3RhY2tfc3RhcnQ7CkBAIC00NjEsOCArNDU5LDggQEAKIAlpZiAoIXAgfHwgcCA9PSBjdXJyZW50IHx8IHAtPnN0YXRlID09IFRBU0tfUlVOTklORykKIAkJcmV0dXJuIDA7CiAKLQlzdGFja19zdGFydCA9ICh1bnNpZ25lZCBsb25nKShwLT50aHJlYWRfaW5mbyArIDEpOwotCXN0YWNrX2VuZCA9ICgodW5zaWduZWQgbG9uZylwLT50aHJlYWRfaW5mbykgKyBUSFJFQURfU0laRTsKKwlzdGFja19zdGFydCA9ICh1bnNpZ25lZCBsb25nKWVuZF9vZl9zdGFjayhwKTsKKwlzdGFja19lbmQgPSAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UocCkgKyBUSFJFQURfU0laRTsKIAogCWZwID0gdGhyZWFkX3NhdmVkX2ZwKHApOwogCWRvIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvYXJtL2tlcm5lbC9wdHJhY2UuYwppbmRleCAyYjg0Zjc4Li43YjYyNTZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3B0cmFjZS5jCkBAIC01NSwyMyArNTUsNiBAQAogI2VuZGlmCiAKIC8qCi0gKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGxpdmUgcHRfcmVncyBmb3IgdGhlIHNwZWNpZmllZCB0YXNrLgotICogVGhlc2UgYXJlIHNhdmVkIG9udG8gdGhlIHRvcCBrZXJuZWwgc3RhY2sgd2hlbiB0aGUgcHJvY2VzcwotICogaXMgbm90IHJ1bm5pbmcuCi0gKgotICogTm90ZTogaWYgYSB1c2VyIHRocmVhZCBpcyBleGVjdmUnZCBmcm9tIGtlcm5lbCBzcGFjZSwgdGhlCi0gKiBrZXJuZWwgc3RhY2sgd2lsbCBub3QgYmUgZW1wdHkgb24gZW50cnkgdG8gdGhlIGtlcm5lbCwgc28KLSAqIHB0cmFjaW5nIHRoZXNlIHRhc2tzIHdpbGwgZmFpbC4KLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgcHRfcmVncyAqCi1nZXRfdXNlcl9yZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKLXsKLQlyZXR1cm4gKHN0cnVjdCBwdF9yZWdzICopCi0JCSgodW5zaWduZWQgbG9uZyl0YXNrLT50aHJlYWRfaW5mbyArIFRIUkVBRF9TSVpFIC0KLQkJCQkgOCAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOwotfQotCi0vKgogICogdGhpcyByb3V0aW5lIHdpbGwgZ2V0IGEgd29yZCBvZmYgb2YgdGhlIHByb2Nlc3NlcyBwcml2aWxlZ2VkIHN0YWNrLgogICogdGhlIG9mZnNldCBpcyBob3cgZmFyIGZyb20gdGhlIGJhc2UgYWRkciBhcyBzdG9yZWQgaW4gdGhlIFRIUkVBRC4KICAqIHRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgYWxsIHRoZSBwcml2aWxlZ2VkIHN0YWNrcyBhcmUgaW4gb3VyCkBAIC03OSw3ICs2Miw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgbG9uZyBnZXRfdXNlcl9yZWcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgb2Zmc2V0KQogewotCXJldHVybiBnZXRfdXNlcl9yZWdzKHRhc2spLT51cmVnc1tvZmZzZXRdOworCXJldHVybiB0YXNrX3B0X3JlZ3ModGFzayktPnVyZWdzW29mZnNldF07CiB9CiAKIC8qCkBAIC05MSw3ICs3NCw3IEBACiBzdGF0aWMgaW5saW5lIGludAogcHV0X3VzZXJfcmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IG9mZnNldCwgbG9uZyBkYXRhKQogewotCXN0cnVjdCBwdF9yZWdzIG5ld3JlZ3MsICpyZWdzID0gZ2V0X3VzZXJfcmVncyh0YXNrKTsKKwlzdHJ1Y3QgcHRfcmVncyBuZXdyZWdzLCAqcmVncyA9IHRhc2tfcHRfcmVncyh0YXNrKTsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAogCW5ld3JlZ3MgPSAqcmVnczsKQEAgLTQyMSw3ICs0MDQsNyBAQAogCXUzMiBpbnNuOwogCWludCByZXM7CiAKLQlyZWdzID0gZ2V0X3VzZXJfcmVncyhjaGlsZCk7CisJcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CiAJcGMgPSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpOwogCiAJaWYgKHRodW1iX21vZGUocmVncykpIHsKQEAgLTU3Miw3ICs1NTUsNyBAQAogICovCiBzdGF0aWMgaW50IHB0cmFjZV9nZXRyZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB2b2lkIF9fdXNlciAqdXJlZ3MpCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBnZXRfdXNlcl9yZWdzKHRzayk7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3ModHNrKTsKIAogCXJldHVybiBjb3B5X3RvX3VzZXIodXJlZ3MsIHJlZ3MsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpID8gLUVGQVVMVCA6IDA7CiB9CkBAIC01ODcsNyArNTcwLDcgQEAKIAogCXJldCA9IC1FRkFVTFQ7CiAJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdyZWdzLCB1cmVncywgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSkgPT0gMCkgewotCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF91c2VyX3JlZ3ModHNrKTsKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3ModHNrKTsKIAogCQlyZXQgPSAtRUlOVkFMOwogCQlpZiAodmFsaWRfdXNlcl9yZWdzKCZuZXdyZWdzKSkgewpAQCAtNjA0LDcgKzU4Nyw3IEBACiAgKi8KIHN0YXRpYyBpbnQgcHRyYWNlX2dldGZwcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdm9pZCBfX3VzZXIgKnVmcCkKIHsKLQlyZXR1cm4gY29weV90b191c2VyKHVmcCwgJnRzay0+dGhyZWFkX2luZm8tPmZwc3RhdGUsCisJcmV0dXJuIGNvcHlfdG9fdXNlcih1ZnAsICZ0YXNrX3RocmVhZF9pbmZvKHRzayktPmZwc3RhdGUsCiAJCQkgICAgc2l6ZW9mKHN0cnVjdCB1c2VyX2ZwKSkgPyAtRUZBVUxUIDogMDsKIH0KIApAQCAtNjEzLDcgKzU5Niw3IEBACiAgKi8KIHN0YXRpYyBpbnQgcHRyYWNlX3NldGZwcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdm9pZCBfX3VzZXIgKnVmcCkKIHsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRocmVhZCA9IHRzay0+dGhyZWFkX2luZm87CisJc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQgPSB0YXNrX3RocmVhZF9pbmZvKHRzayk7CiAJdGhyZWFkLT51c2VkX2NwWzFdID0gdGhyZWFkLT51c2VkX2NwWzJdID0gMTsKIAlyZXR1cm4gY29weV9mcm9tX3VzZXIoJnRocmVhZC0+ZnBzdGF0ZSwgdWZwLAogCQkJICAgICAgc2l6ZW9mKHN0cnVjdCB1c2VyX2ZwKSkgPyAtRUZBVUxUIDogMDsKQEAgLTYyNiw3ICs2MDksNyBAQAogICovCiBzdGF0aWMgaW50IHB0cmFjZV9nZXR3bW14cmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdm9pZCBfX3VzZXIgKnVmcCkKIHsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRocmVhZCA9IHRzay0+dGhyZWFkX2luZm87CisJc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQgPSB0YXNrX3RocmVhZF9pbmZvKHRzayk7CiAJdm9pZCAqcHRyID0gJnRocmVhZC0+ZnBzdGF0ZTsKIAogCWlmICghdGVzdF90aV90aHJlYWRfZmxhZyh0aHJlYWQsIFRJRl9VU0lOR19JV01NWFQpKQpAQCAtNjQzLDcgKzYyNiw3IEBACiAgKi8KIHN0YXRpYyBpbnQgcHRyYWNlX3NldHdtbXhyZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB2b2lkIF9fdXNlciAqdWZwKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkID0gdHNrLT50aHJlYWRfaW5mbzsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRocmVhZCA9IHRhc2tfdGhyZWFkX2luZm8odHNrKTsKIAl2b2lkICpwdHIgPSAmdGhyZWFkLT5mcHN0YXRlOwogCiAJaWYgKCF0ZXN0X3RpX3RocmVhZF9mbGFnKHRocmVhZCwgVElGX1VTSU5HX0lXTU1YVCkpCkBAIC03NzksMTAgKzc2MiwxNSBAQAogI2VuZGlmCiAKIAkJY2FzZSBQVFJBQ0VfR0VUX1RIUkVBRF9BUkVBOgotCQkJcmV0ID0gcHV0X3VzZXIoY2hpbGQtPnRocmVhZF9pbmZvLT50cF92YWx1ZSwKKwkJCXJldCA9IHB1dF91c2VyKHRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT50cF92YWx1ZSwKIAkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGRhdGEpOwogCQkJYnJlYWs7CiAKKwkJY2FzZSBQVFJBQ0VfU0VUX1NZU0NBTEw6CisJCQlyZXQgPSAwOworCQkJY2hpbGQtPnB0cmFjZV9tZXNzYWdlID0gZGF0YTsKKwkJCWJyZWFrOworCiAJCWRlZmF1bHQ6CiAJCQlyZXQgPSBwdHJhY2VfcmVxdWVzdChjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CiAJCQlicmVhazsKQEAgLTc5MSwxNCArNzc5LDE0IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSB2b2lkIHN5c2NhbGxfdHJhY2UoaW50IHdoeSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCithc21saW5rYWdlIGludCBzeXNjYWxsX3RyYWNlKGludCB3aHksIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgc2NubykKIHsKIAl1bnNpZ25lZCBsb25nIGlwOwogCiAJaWYgKCF0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKSkKLQkJcmV0dXJuOworCQlyZXR1cm4gc2NubzsKIAlpZiAoIShjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSkKLQkJcmV0dXJuOworCQlyZXR1cm4gc2NubzsKIAogCS8qCiAJICogU2F2ZSBJUC4gIElQIGlzIHVzZWQgdG8gZGVub3RlIHN5c2NhbGwgZW50cnkvZXhpdDoKQEAgLTgwNyw2ICs3OTUsOCBAQAogCWlwID0gcmVncy0+QVJNX2lwOwogCXJlZ3MtPkFSTV9pcCA9IHdoeTsKIAorCWN1cnJlbnQtPnB0cmFjZV9tZXNzYWdlID0gc2NubzsKKwogCS8qIHRoZSAweDgwIHByb3ZpZGVzIGEgd2F5IGZvciB0aGUgdHJhY2luZyBwYXJlbnQgdG8gZGlzdGluZ3Vpc2gKIAkgICBiZXR3ZWVuIGEgc3lzY2FsbCBzdG9wIGFuZCBTSUdUUkFQIGRlbGl2ZXJ5ICovCiAJcHRyYWNlX25vdGlmeShTSUdUUkFQIHwgKChjdXJyZW50LT5wdHJhY2UgJiBQVF9UUkFDRVNZU0dPT0QpCkBAIC04MjEsNCArODExLDYgQEAKIAkJY3VycmVudC0+ZXhpdF9jb2RlID0gMDsKIAl9CiAJcmVncy0+QVJNX2lwID0gaXA7CisKKwlyZXR1cm4gY3VycmVudC0+cHRyYWNlX21lc3NhZ2U7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc2VtYXBob3JlLmMgYi9hcmNoL2FybS9rZXJuZWwvc2VtYXBob3JlLmMKaW5kZXggNGMzMWYyOS4uOTgxZmU1YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NlbWFwaG9yZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zZW1hcGhvcmUuYwpAQCAtMTc3LDQxICsxNzcsNDIgQEAKICAqIGlwIGNvbnRhaW5zIHRoZSBzZW1hcGhvcmUgcG9pbnRlciBvbiBlbnRyeS4gU2F2ZSB0aGUgQy1jbG9iYmVyZWQKICAqIHJlZ2lzdGVycyAocjAgdG8gcjMgYW5kIGxyKSwgYnV0IG5vdCBpcCwgYXMgd2UgdXNlIGl0IGFzIGEgcmV0dXJuCiAgKiB2YWx1ZSBpbiBzb21lIGNhc2VzLi4KKyAqIFRvIHJlbWFpbiBBQVBDUyBjb21wbGlhbnQgKDY0LWJpdCBzdGFjayBhbGlnbikgd2Ugc2F2ZSByNCBhcyB3ZWxsLgogICovCiBhc20oIgkuc2VjdGlvbiAuc2NoZWQudGV4dCxcImF4XCIsJXByb2diaXRzCVxuXAogCS5hbGlnbgk1CQkJCVxuXAogCS5nbG9ibAlfX2Rvd25fZmFpbGVkCQkJXG5cCiBfX2Rvd25fZmFpbGVkOgkJCQkJXG5cCi0Jc3RtZmQJc3AhLCB7cjAgLSByMywgbHJ9CQlcblwKKwlzdG1mZAlzcCEsIHtyMCAtIHI0LCBscn0JCVxuXAogCW1vdglyMCwgaXAJCQkJXG5cCiAJYmwJX19kb3duCQkJCVxuXAotCWxkbWZkCXNwISwge3IwIC0gcjMsIHBjfQkJXG5cCisJbGRtZmQJc3AhLCB7cjAgLSByNCwgcGN9CQlcblwKIAkJCQkJCVxuXAogCS5hbGlnbgk1CQkJCVxuXAogCS5nbG9ibAlfX2Rvd25faW50ZXJydXB0aWJsZV9mYWlsZWQJXG5cCiBfX2Rvd25faW50ZXJydXB0aWJsZV9mYWlsZWQ6CQkJXG5cCi0Jc3RtZmQJc3AhLCB7cjAgLSByMywgbHJ9CQlcblwKKwlzdG1mZAlzcCEsIHtyMCAtIHI0LCBscn0JCVxuXAogCW1vdglyMCwgaXAJCQkJXG5cCiAJYmwJX19kb3duX2ludGVycnVwdGlibGUJCVxuXAogCW1vdglpcCwgcjAJCQkJXG5cCi0JbGRtZmQJc3AhLCB7cjAgLSByMywgcGN9CQlcblwKKwlsZG1mZAlzcCEsIHtyMCAtIHI0LCBwY30JCVxuXAogCQkJCQkJXG5cCiAJLmFsaWduCTUJCQkJXG5cCiAJLmdsb2JsCV9fZG93bl90cnlsb2NrX2ZhaWxlZAkJXG5cCiBfX2Rvd25fdHJ5bG9ja19mYWlsZWQ6CQkJCVxuXAotCXN0bWZkCXNwISwge3IwIC0gcjMsIGxyfQkJXG5cCisJc3RtZmQJc3AhLCB7cjAgLSByNCwgbHJ9CQlcblwKIAltb3YJcjAsIGlwCQkJCVxuXAogCWJsCV9fZG93bl90cnlsb2NrCQkJXG5cCiAJbW92CWlwLCByMAkJCQlcblwKLQlsZG1mZAlzcCEsIHtyMCAtIHIzLCBwY30JCVxuXAorCWxkbWZkCXNwISwge3IwIC0gcjQsIHBjfQkJXG5cCiAJCQkJCQlcblwKIAkuYWxpZ24JNQkJCQlcblwKIAkuZ2xvYmwJX191cF93YWtldXAJCQlcblwKIF9fdXBfd2FrZXVwOgkJCQkJXG5cCi0Jc3RtZmQJc3AhLCB7cjAgLSByMywgbHJ9CQlcblwKKwlzdG1mZAlzcCEsIHtyMCAtIHI0LCBscn0JCVxuXAogCW1vdglyMCwgaXAJCQkJXG5cCiAJYmwJX191cAkJCQlcblwKLQlsZG1mZAlzcCEsIHtyMCAtIHIzLCBwY30JCVxuXAorCWxkbWZkCXNwISwge3IwIC0gcjQsIHBjfQkJXG5cCiAJIik7CiAKIEVYUE9SVF9TWU1CT0woX19kb3duX2ZhaWxlZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCmluZGV4IDg1Nzc0MTYuLmM0NWQxMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCkBAIC0yNiw4ICsyNiw2IEBACiAKICNpbmNsdWRlIDxhc20vY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL2VsZi5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC0yMDcsNyArMjA1LDcgQEAKIAkiNVRFIiwKIAkiNVRFSiIsCiAJIjZURUoiLAotCSI/KDEwKSIsCisJIjciLAogCSI/KDExKSIsCiAJIj8oMTIpIiwKIAkiPygxMykiLApAQCAtMjYwLDE0ICsyNTgsMTcgQEAKIHsKIAlpbnQgY3B1X2FyY2g7CiAKLQlpZiAoKHByb2Nlc3Nvcl9pZCAmIDB4MDAwMGYwMDApID09IDApIHsKKwlpZiAoKHByb2Nlc3Nvcl9pZCAmIDB4MDAwOGYwMDApID09IDApIHsKIAkJY3B1X2FyY2ggPSBDUFVfQVJDSF9VTktOT1dOOwotCX0gZWxzZSBpZiAoKHByb2Nlc3Nvcl9pZCAmIDB4MDAwMGYwMDApID09IDB4MDAwMDcwMDApIHsKKwl9IGVsc2UgaWYgKChwcm9jZXNzb3JfaWQgJiAweDAwMDhmMDAwKSA9PSAweDAwMDA3MDAwKSB7CiAJCWNwdV9hcmNoID0gKHByb2Nlc3Nvcl9pZCAmICgxIDw8IDIzKSkgPyBDUFVfQVJDSF9BUk12NFQgOiBDUFVfQVJDSF9BUk12MzsKLQl9IGVsc2UgeworCX0gZWxzZSBpZiAoKHByb2Nlc3Nvcl9pZCAmIDB4MDAwODAwMDApID09IDB4MDAwMDAwMDApIHsKIAkJY3B1X2FyY2ggPSAocHJvY2Vzc29yX2lkID4+IDE2KSAmIDc7CiAJCWlmIChjcHVfYXJjaCkKIAkJCWNwdV9hcmNoICs9IENQVV9BUkNIX0FSTXYzOworCX0gZWxzZSB7CisJCS8qIHRoZSByZXZpc2VkIENQVUlEICovCisJCWNwdV9hcmNoID0gKChwcm9jZXNzb3JfaWQgPj4gMTIpICYgMHhmKSAtIDB4YiArIENQVV9BUkNIX0FSTXY2OwogCX0KIAogCXJldHVybiBjcHVfYXJjaDsKQEAgLTg2NSwxMSArODY2LDExIEBACiAJc2VxX3ByaW50ZihtLCAiXG5DUFUgaW1wbGVtZW50ZXJcdDogMHglMDJ4XG4iLCBwcm9jZXNzb3JfaWQgPj4gMjQpOwogCXNlcV9wcmludGYobSwgIkNQVSBhcmNoaXRlY3R1cmU6ICVzXG4iLCBwcm9jX2FyY2hbY3B1X2FyY2hpdGVjdHVyZSgpXSk7CiAKLQlpZiAoKHByb2Nlc3Nvcl9pZCAmIDB4MDAwMGYwMDApID09IDB4MDAwMDAwMDApIHsKKwlpZiAoKHByb2Nlc3Nvcl9pZCAmIDB4MDAwOGYwMDApID09IDB4MDAwMDAwMDApIHsKIAkJLyogcHJlLUFSTTcgKi8KIAkJc2VxX3ByaW50ZihtLCAiQ1BVIHBhcnRcdFx0OiAlMDd4XG4iLCBwcm9jZXNzb3JfaWQgPj4gNCk7CiAJfSBlbHNlIHsKLQkJaWYgKChwcm9jZXNzb3JfaWQgJiAweDAwMDBmMDAwKSA9PSAweDAwMDA3MDAwKSB7CisJCWlmICgocHJvY2Vzc29yX2lkICYgMHgwMDA4ZjAwMCkgPT0gMHgwMDAwNzAwMCkgewogCQkJLyogQVJNNyAqLwogCQkJc2VxX3ByaW50ZihtLCAiQ1BVIHZhcmlhbnRcdDogMHglMDJ4XG4iLAogCQkJCSAgIChwcm9jZXNzb3JfaWQgPj4gMTYpICYgMTI3KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvYXJtL2tlcm5lbC9zaWduYWwuYwppbmRleCA3NjU5MjJiLi5hMGNkMGE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NpZ25hbC5jCkBAIC0zMCwxNSArMzAsMjEgQEAKICNkZWZpbmUgU1dJX1NZU19SVF9TSUdSRVRVUk4JKDB4ZWYwMDAwMDB8KF9fTlJfcnRfc2lncmV0dXJuKSkKIAogLyoKKyAqIFdpdGggRUFCSSwgdGhlIHN5c2NhbGwgbnVtYmVyIGhhcyB0byBiZSBsb2FkZWQgaW50byByNy4KKyAqLworI2RlZmluZSBNT1ZfUjdfTlJfU0lHUkVUVVJOCSgweGUzYTA3MDAwIHwgKF9fTlJfc2lncmV0dXJuIC0gX19OUl9TWVNDQUxMX0JBU0UpKQorI2RlZmluZSBNT1ZfUjdfTlJfUlRfU0lHUkVUVVJOCSgweGUzYTA3MDAwIHwgKF9fTlJfcnRfc2lncmV0dXJuIC0gX19OUl9TWVNDQUxMX0JBU0UpKQorCisvKgogICogRm9yIFRodW1iIHN5c2NhbGxzLCB3ZSBwYXNzIHRoZSBzeXNjYWxsIG51bWJlciB2aWEgcjcuICBXZSB0aGVyZWZvcmUKICAqIG5lZWQgdHdvIDE2LWJpdCBpbnN0cnVjdGlvbnMuCiAgKi8KICNkZWZpbmUgU1dJX1RIVU1CX1NJR1JFVFVSTgkoMHhkZjAwIDw8IDE2IHwgMHgyNzAwIHwgKF9fTlJfc2lncmV0dXJuIC0gX19OUl9TWVNDQUxMX0JBU0UpKQogI2RlZmluZSBTV0lfVEhVTUJfUlRfU0lHUkVUVVJOCSgweGRmMDAgPDwgMTYgfCAweDI3MDAgfCAoX19OUl9ydF9zaWdyZXR1cm4gLSBfX05SX1NZU0NBTExfQkFTRSkpCiAKLWNvbnN0IHVuc2lnbmVkIGxvbmcgc2lncmV0dXJuX2NvZGVzWzRdID0gewotCVNXSV9TWVNfU0lHUkVUVVJOLAlTV0lfVEhVTUJfU0lHUkVUVVJOLAotCVNXSV9TWVNfUlRfU0lHUkVUVVJOLAlTV0lfVEhVTUJfUlRfU0lHUkVUVVJOCitjb25zdCB1bnNpZ25lZCBsb25nIHNpZ3JldHVybl9jb2Rlc1s3XSA9IHsKKwlNT1ZfUjdfTlJfU0lHUkVUVVJOLCAgICBTV0lfU1lTX1NJR1JFVFVSTiwgICAgU1dJX1RIVU1CX1NJR1JFVFVSTiwKKwlNT1ZfUjdfTlJfUlRfU0lHUkVUVVJOLCBTV0lfU1lTX1JUX1NJR1JFVFVSTiwgU1dJX1RIVU1CX1JUX1NJR1JFVFVSTiwKIH07CiAKIHN0YXRpYyBpbnQgZG9fc2lnbmFsKHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICogcmVncywgaW50IHN5c2NhbGwpOwpAQCAtMTg5LDcgKzE5NSw3IEBACiBzdHJ1Y3Qgc2lnZnJhbWUgewogCXN0cnVjdCBzaWdjb250ZXh0IHNjOwogCXVuc2lnbmVkIGxvbmcgZXh0cmFtYXNrW19OU0lHX1dPUkRTLTFdOwotCXVuc2lnbmVkIGxvbmcgcmV0Y29kZTsKKwl1bnNpZ25lZCBsb25nIHJldGNvZGVbMl07CiAJc3RydWN0IGF1eF9zaWdmcmFtZSBhdXggX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOwogfTsKIApAQCAtMTk4LDcgKzIwNCw3IEBACiAJdm9pZCBfX3VzZXIgKnB1YzsKIAlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOwogCXN0cnVjdCB1Y29udGV4dCB1YzsKLQl1bnNpZ25lZCBsb25nIHJldGNvZGU7CisJdW5zaWduZWQgbG9uZyByZXRjb2RlWzJdOwogCXN0cnVjdCBhdXhfc2lnZnJhbWUgYXV4IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKIH07CiAKQEAgLTQzNiwxMiArNDQyLDEzIEBACiAJaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX1JFU1RPUkVSKSB7CiAJCXJldGNvZGUgPSAodW5zaWduZWQgbG9uZylrYS0+c2Euc2FfcmVzdG9yZXI7CiAJfSBlbHNlIHsKLQkJdW5zaWduZWQgaW50IGlkeCA9IHRodW1iOworCQl1bnNpZ25lZCBpbnQgaWR4ID0gdGh1bWIgPDwgMTsKIAogCQlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykKLQkJCWlkeCArPSAyOworCQkJaWR4ICs9IDM7CiAKLQkJaWYgKF9fcHV0X3VzZXIoc2lncmV0dXJuX2NvZGVzW2lkeF0sIHJjKSkKKwkJaWYgKF9fcHV0X3VzZXIoc2lncmV0dXJuX2NvZGVzW2lkeF0sICAgcmMpIHx8CisJCSAgICBfX3B1dF91c2VyKHNpZ3JldHVybl9jb2Rlc1tpZHgrMV0sIHJjKzEpKQogCQkJcmV0dXJuIDE7CiAKIAkJaWYgKGNwc3IgJiBNT0RFMzJfQklUKSB7CkBAIC00NTYsNyArNDYzLDcgQEAKIAkJCSAqIHRoZSByZXR1cm4gY29kZSB3cml0dGVuIG9udG8gdGhlIHN0YWNrLgogCQkJICovCiAJCQlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpcmMsCi0JCQkJCSAgICh1bnNpZ25lZCBsb25nKShyYyArIDEpKTsKKwkJCQkJICAgKHVuc2lnbmVkIGxvbmcpKHJjICsgMikpOwogCiAJCQlyZXRjb2RlID0gKCh1bnNpZ25lZCBsb25nKXJjKSArIHRodW1iOwogCQl9CkBAIC00ODgsNyArNDk1LDcgQEAKIAl9CiAKIAlpZiAoZXJyID09IDApCi0JCWVyciA9IHNldHVwX3JldHVybihyZWdzLCBrYSwgJmZyYW1lLT5yZXRjb2RlLCBmcmFtZSwgdXNpZyk7CisJCWVyciA9IHNldHVwX3JldHVybihyZWdzLCBrYSwgZnJhbWUtPnJldGNvZGUsIGZyYW1lLCB1c2lnKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC01MjIsNyArNTI5LDcgQEAKIAllcnIgfD0gX19jb3B5X3RvX3VzZXIoJmZyYW1lLT51Yy51Y19zaWdtYXNrLCBzZXQsIHNpemVvZigqc2V0KSk7CiAKIAlpZiAoZXJyID09IDApCi0JCWVyciA9IHNldHVwX3JldHVybihyZWdzLCBrYSwgJmZyYW1lLT5yZXRjb2RlLCBmcmFtZSwgdXNpZyk7CisJCWVyciA9IHNldHVwX3JldHVybihyZWdzLCBrYSwgZnJhbWUtPnJldGNvZGUsIGZyYW1lLCB1c2lnKTsKIAogCWlmIChlcnIgPT0gMCkgewogCQkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NpZ25hbC5oIGIvYXJjaC9hcm0va2VybmVsL3NpZ25hbC5oCmluZGV4IDkxZDI2ZmEuLjk5OTEwNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zaWduYWwuaAorKysgYi9hcmNoL2FybS9rZXJuZWwvc2lnbmFsLmgKQEAgLTksNCArOSw0IEBACiAgKi8KICNkZWZpbmUgS0VSTl9TSUdSRVRVUk5fQ09ERQkweGZmZmYwNTAwCiAKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBsb25nIHNpZ3JldHVybl9jb2Rlc1s0XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBsb25nIHNpZ3JldHVybl9jb2Rlc1s3XTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zbXAuYyBiL2FyY2gvYXJtL2tlcm5lbC9zbXAuYwppbmRleCAzNzNjMDk1Li43MzM4OTQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NtcC5jCkBAIC0xMTQsNyArMTE0LDcgQEAKIAkgKiBXZSBuZWVkIHRvIHRlbGwgdGhlIHNlY29uZGFyeSBjb3JlIHdoZXJlIHRvIGZpbmQKIAkgKiBpdHMgc3RhY2sgYW5kIHRoZSBwYWdlIHRhYmxlcy4KIAkgKi8KLQlzZWNvbmRhcnlfZGF0YS5zdGFjayA9ICh2b2lkICopaWRsZS0+dGhyZWFkX2luZm8gKyBUSFJFQURfU1RBUlRfU1A7CisJc2Vjb25kYXJ5X2RhdGEuc3RhY2sgPSB0YXNrX3N0YWNrX3BhZ2UoaWRsZSkgKyBUSFJFQURfU1RBUlRfU1A7CiAJc2Vjb25kYXJ5X2RhdGEucGdkaXIgPSB2aXJ0X3RvX3BoeXMocGdkKTsKIAl3bWIoKTsKIApAQCAtMjQ1LDcgKzI0NSw3IEBACiAJX19hc21fXygibW92CXNwLCAlMFxuIgogCSIJYglzZWNvbmRhcnlfc3RhcnRfa2VybmVsIgogCQk6Ci0JCTogInIiICgodm9pZCAqKWN1cnJlbnQtPnRocmVhZF9pbmZvICsgVEhSRUFEX1NJWkUgLSA4KSk7CisJCTogInIiICh0YXNrX3N0YWNrX3BhZ2UoY3VycmVudCkgKyBUSFJFQURfU0laRSAtIDgpKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3N5c19hcm0uYyBiL2FyY2gvYXJtL2tlcm5lbC9zeXNfYXJtLmMKaW5kZXggZWE1NjliYS4uYTQ5MWRlMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3N5c19hcm0uYworKysgYi9hcmNoL2FybS9rZXJuZWwvc3lzX2FybS5jCkBAIC0xNDcsNiArMTQ3LDcgQEAKIAlyZXR1cm4gc3lzX3NlbGVjdChhLm4sIGEuaW5wLCBhLm91dHAsIGEuZXhwLCBhLnR2cCk7CiB9CiAKKyNpZiAhZGVmaW5lZChDT05GSUdfQUVBQkkpIHx8IGRlZmluZWQoQ09ORklHX09BQklfQ09NUEFUKQogLyoKICAqIHN5c19pcGMoKSBpcyB0aGUgZGUtbXVsdGlwbGV4ZXIgZm9yIHRoZSBTeXNWIElQQyBjYWxscy4uCiAgKgpAQCAtMjI2LDYgKzIyNyw3IEBACiAJCXJldHVybiAtRU5PU1lTOwogCX0KIH0KKyNlbmRpZgogCiAvKiBGb3JrIGEgbmV3IHRhc2sgLSB0aGlzIGNyZWF0ZXMgYSBuZXcgcHJvZ3JhbSB0aHJlYWQuCiAgKiBUaGlzIGlzIGNhbGxlZCBpbmRpcmVjdGx5IHZpYSBhIHNtYWxsIHdyYXBwZXIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zeXNfb2FiaS1jb21wYXQuYyBiL2FyY2gvYXJtL2tlcm5lbC9zeXNfb2FiaS1jb21wYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWZhOGU1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL3N5c19vYWJpLWNvbXBhdC5jCkBAIC0wLDAgKzEsMzM5IEBACisvKgorICogIGFyY2gvYXJtL2tlcm5lbC9zeXNfb2FiaS1jb21wYXQuYworICoKKyAqICBDb21wYXRpYmlsaXR5IHdyYXBwZXJzIGZvciBzeXNjYWxscyB0aGF0IGFyZSB1c2VkIGZyb20KKyAqICBvbGQgQUJJIHVzZXIgc3BhY2UgYmluYXJpZXMgd2l0aCBhbiBFQUJJIGtlcm5lbC4KKyAqCisgKiAgQXV0aG9yOglOaWNvbGFzIFBpdHJlCisgKiAgQ3JlYXRlZDoJT2N0IDcsIDIwMDUKKyAqICBDb3B5cmlnaHQ6CU1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBUaGUgbGVnYWN5IEFCSSBhbmQgdGhlIG5ldyBBUk0gRUFCSSBoYXZlIGRpZmZlcmVudCBydWxlcyBtYWtpbmcgc29tZQorICogc3lzY2FsbHMgaW5jb21wYXRpYmxlIGVzcGVjaWFsbHkgd2l0aCBzdHJ1Y3R1cmUgYXJndW1lbnRzLgorICogTW9zdCBub3RhYmx5LCBFYWJpIHNheXMgNjQtYml0IG1lbWJlcnMgc2hvdWxkIGJlIDY0LWJpdCBhbGlnbmVkIGluc3RlYWQgb2YKKyAqIHNpbXBseSB3b3JkIGFsaWduZWQuICBFQUJJIGFsc28gcGFkcyBzdHJ1Y3R1cmVzIHRvIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0CisgKiBtZW1iZXIgaXQgY29udGFpbnMgaW5zdGVhZCBvZiB0aGUgaW52YXJpYW50IDMyLWJpdC4KKyAqCisgKiBUaGUgZm9sbG93aW5nIHN5c2NhbGxzIGFyZSBhZmZlY3RlZDoKKyAqCisgKiBzeXNfc3RhdDY0OgorICogc3lzX2xzdGF0NjQ6CisgKiBzeXNfZnN0YXQ2NDoKKyAqCisgKiAgIHN0cnVjdCBzdGF0NjQgaGFzIGRpZmZlcmVudCBzaXplcyBhbmQgc29tZSBtZW1iZXJzIGFyZSBzaGlmdGVkCisgKiAgIENvbXBhdGliaWxpdHkgd3JhcHBlcnMgYXJlIG5lZWRlZCBmb3IgdGhlbSBhbmQgcHJvdmlkZWQgYmVsb3cuCisgKgorICogc3lzX2ZjbnRsNjQ6CisgKgorICogICBzdHJ1Y3QgZmxvY2s2NCBoYXMgZGlmZmVyZW50IHNpemVzIGFuZCBzb21lIG1lbWJlcnMgYXJlIHNoaWZ0ZWQKKyAqICAgQSBjb21wYXRpYmlsaXR5IHdyYXBwZXIgaXMgbmVlZGVkIGFuZCBwcm92aWRlZCBiZWxvdy4KKyAqCisgKiBzeXNfc3RhdGZzNjQ6CisgKiBzeXNfZnN0YXRmczY0OgorICoKKyAqICAgc3RydWN0IHN0YXRmczY0IGhhcyBleHRyYSBwYWRkaW5nIHdpdGggRUFCSSBncm93aW5nIGl0cyBzaXplIGZyb20KKyAqICAgODQgdG8gODguICBUaGlzIHN0cnVjdCBpcyBub3cgX19hdHRyaWJ1dGVfXygocGFja2VkLGFsaWduZWQoNCkpKQorICogICB3aXRoIGEgc21hbGwgYXNzZW1ibHkgd3JhcHBlciB0byBmb3JjZSB0aGUgc3ogYXJndW1lbnQgdG8gODQgaWYgaXQgaXMgODgKKyAqICAgdG8gYXZvaWQgY29weWluZyB0aGUgZXh0cmEgcGFkZGluZyBvdmVyIHVzZXIgc3BhY2UgdW5leHBlY3RpbmcgaXQuCisgKgorICogc3lzX25ld3VuYW1lOgorICoKKyAqICAgc3RydWN0IG5ld191dHNuYW1lIGhhcyBubyBwYWRkaW5nIHdpdGggRUFCSS4gIE5vIHByb2JsZW0gdGhlcmUuCisgKgorICogc3lzX2Vwb2xsX2N0bDoKKyAqIHN5c19lcG9sbF93YWl0OgorICoKKyAqICAgc3RydWN0IGVwb2xsX2V2ZW50IGhhcyBpdHMgc2Vjb25kIG1lbWJlciBzaGlmdGVkIGFsc28gYWZmZWN0aW5nIHRoZQorICogICBzdHJ1Y3R1cmUgc2l6ZS4gQ29tcGF0aWJpbGl0eSB3cmFwcGVycyBhcmUgbmVlZGVkIGFuZCBwcm92aWRlZCBiZWxvdy4KKyAqCisgKiBzeXNfaXBjOgorICogc3lzX3NlbW9wOgorICogc3lzX3NlbXRpbWVkb3A6CisgKgorICogICBzdHJ1Y3Qgc2VtYnVmIGxvc2VzIGl0cyBwYWRkaW5nIHdpdGggRUFCSS4gIFNpbmNlIGFycmF5cyBvZiB0aGVtIGFyZQorICogICB1c2VkIHRoZXkgaGF2ZSB0byBiZSBjb3B5ZWQgdG8gcmVtb3ZlIHRoZSBwYWRkaW5nLiBDb21wYXRpYmlsaXR5IHdyYXBwZXJzCisgKiAgIHByb3ZpZGVkIGJlbG93LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2V2ZW50cG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbS5oPgorI2luY2x1ZGUgPGFzbS9pcGMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdHJ1Y3Qgb2xkYWJpX3N0YXQ2NCB7CisJdW5zaWduZWQgbG9uZyBsb25nIHN0X2RldjsKKwl1bnNpZ25lZCBpbnQJX19wYWQxOworCXVuc2lnbmVkIGxvbmcJX19zdF9pbm87CisJdW5zaWduZWQgaW50CXN0X21vZGU7CisJdW5zaWduZWQgaW50CXN0X25saW5rOworCisJdW5zaWduZWQgbG9uZwlzdF91aWQ7CisJdW5zaWduZWQgbG9uZwlzdF9naWQ7CisKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RfcmRldjsKKwl1bnNpZ25lZCBpbnQJX19wYWQyOworCisJbG9uZyBsb25nCXN0X3NpemU7CisJdW5zaWduZWQgbG9uZwlzdF9ibGtzaXplOworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdF9ibG9ja3M7CisKKwl1bnNpZ25lZCBsb25nCXN0X2F0aW1lOworCXVuc2lnbmVkIGxvbmcJc3RfYXRpbWVfbnNlYzsKKworCXVuc2lnbmVkIGxvbmcJc3RfbXRpbWU7CisJdW5zaWduZWQgbG9uZwlzdF9tdGltZV9uc2VjOworCisJdW5zaWduZWQgbG9uZwlzdF9jdGltZTsKKwl1bnNpZ25lZCBsb25nCXN0X2N0aW1lX25zZWM7CisKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RfaW5vOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkLGFsaWduZWQoNCkpKTsKKworc3RhdGljIGxvbmcgY3Bfb2xkYWJpX3N0YXQ2NChzdHJ1Y3Qga3N0YXQgKnN0YXQsCisJCQkgICAgIHN0cnVjdCBvbGRhYmlfc3RhdDY0IF9fdXNlciAqc3RhdGJ1ZikKK3sKKwlzdHJ1Y3Qgb2xkYWJpX3N0YXQ2NCB0bXA7CisKKwl0bXAuc3RfZGV2ID0gaHVnZV9lbmNvZGVfZGV2KHN0YXQtPmRldik7CisJdG1wLl9fcGFkMSA9IDA7CisJdG1wLl9fc3RfaW5vID0gc3RhdC0+aW5vOworCXRtcC5zdF9tb2RlID0gc3RhdC0+bW9kZTsKKwl0bXAuc3RfbmxpbmsgPSBzdGF0LT5ubGluazsKKwl0bXAuc3RfdWlkID0gc3RhdC0+dWlkOworCXRtcC5zdF9naWQgPSBzdGF0LT5naWQ7CisJdG1wLnN0X3JkZXYgPSBodWdlX2VuY29kZV9kZXYoc3RhdC0+cmRldik7CisJdG1wLnN0X3NpemUgPSBzdGF0LT5zaXplOworCXRtcC5zdF9ibG9ja3MgPSBzdGF0LT5ibG9ja3M7CisJdG1wLl9fcGFkMiA9IDA7CisJdG1wLnN0X2Jsa3NpemUgPSBzdGF0LT5ibGtzaXplOworCXRtcC5zdF9hdGltZSA9IHN0YXQtPmF0aW1lLnR2X3NlYzsKKwl0bXAuc3RfYXRpbWVfbnNlYyA9IHN0YXQtPmF0aW1lLnR2X25zZWM7CisJdG1wLnN0X210aW1lID0gc3RhdC0+bXRpbWUudHZfc2VjOworCXRtcC5zdF9tdGltZV9uc2VjID0gc3RhdC0+bXRpbWUudHZfbnNlYzsKKwl0bXAuc3RfY3RpbWUgPSBzdGF0LT5jdGltZS50dl9zZWM7CisJdG1wLnN0X2N0aW1lX25zZWMgPSBzdGF0LT5jdGltZS50dl9uc2VjOworCXRtcC5zdF9pbm8gPSBzdGF0LT5pbm87CisJcmV0dXJuIGNvcHlfdG9fdXNlcihzdGF0YnVmLCZ0bXAsc2l6ZW9mKHRtcCkpID8gLUVGQVVMVCA6IDA7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfb2FiaV9zdGF0NjQoY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwKKwkJCQlzdHJ1Y3Qgb2xkYWJpX3N0YXQ2NCBfX3VzZXIgKiBzdGF0YnVmKQoreworCXN0cnVjdCBrc3RhdCBzdGF0OworCWludCBlcnJvciA9IHZmc19zdGF0KGZpbGVuYW1lLCAmc3RhdCk7CisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSBjcF9vbGRhYmlfc3RhdDY0KCZzdGF0LCBzdGF0YnVmKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfb2FiaV9sc3RhdDY0KGNoYXIgX191c2VyICogZmlsZW5hbWUsCisJCQkJIHN0cnVjdCBvbGRhYmlfc3RhdDY0IF9fdXNlciAqIHN0YXRidWYpCit7CisJc3RydWN0IGtzdGF0IHN0YXQ7CisJaW50IGVycm9yID0gdmZzX2xzdGF0KGZpbGVuYW1lLCAmc3RhdCk7CisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSBjcF9vbGRhYmlfc3RhdDY0KCZzdGF0LCBzdGF0YnVmKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfb2FiaV9mc3RhdDY0KHVuc2lnbmVkIGxvbmcgZmQsCisJCQkJIHN0cnVjdCBvbGRhYmlfc3RhdDY0IF9fdXNlciAqIHN0YXRidWYpCit7CisJc3RydWN0IGtzdGF0IHN0YXQ7CisJaW50IGVycm9yID0gdmZzX2ZzdGF0KGZkLCAmc3RhdCk7CisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSBjcF9vbGRhYmlfc3RhdDY0KCZzdGF0LCBzdGF0YnVmKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0cnVjdCBvYWJpX2Zsb2NrNjQgeworCXNob3J0CWxfdHlwZTsKKwlzaG9ydAlsX3doZW5jZTsKKwlsb2ZmX3QJbF9zdGFydDsKKwlsb2ZmX3QJbF9sZW47CisJcGlkX3QJbF9waWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQsYWxpZ25lZCg0KSkpOworCithc21saW5rYWdlIGxvbmcgc3lzX29hYmlfZmNudGw2NCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBvYWJpX2Zsb2NrNjQgdXNlcjsKKwlzdHJ1Y3QgZmxvY2s2NCBrZXJuZWw7CisJbW1fc2VnbWVudF90IGZzID0gVVNFUl9EUzsgLyogaW5pdGlhbGl6ZWQgdG8ga2lsbCBhIHdhcm5pbmcgKi8KKwl1bnNpZ25lZCBsb25nIGxvY2FsX2FyZyA9IGFyZzsKKwlpbnQgcmV0OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEZfR0VUTEs2NDoKKwljYXNlIEZfU0VUTEs2NDoKKwljYXNlIEZfU0VUTEtXNjQ6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdXNlciwgKHN0cnVjdCBvYWJpX2Zsb2NrNjQgX191c2VyICopYXJnLAorCQkJCSAgIHNpemVvZih1c2VyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJa2VybmVsLmxfdHlwZQk9IHVzZXIubF90eXBlOworCQlrZXJuZWwubF93aGVuY2UJPSB1c2VyLmxfd2hlbmNlOworCQlrZXJuZWwubF9zdGFydAk9IHVzZXIubF9zdGFydDsKKwkJa2VybmVsLmxfbGVuCT0gdXNlci5sX2xlbjsKKwkJa2VybmVsLmxfcGlkCT0gdXNlci5sX3BpZDsKKwkJbG9jYWxfYXJnID0gKHVuc2lnbmVkIGxvbmcpJmtlcm5lbDsKKwkJZnMgPSBnZXRfZnMoKTsKKwkJc2V0X2ZzKEtFUk5FTF9EUyk7CisJfQorCisJcmV0ID0gc3lzX2ZjbnRsNjQoZmQsIGNtZCwgbG9jYWxfYXJnKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBGX0dFVExLNjQ6CisJCWlmICghcmV0KSB7CisJCQl1c2VyLmxfdHlwZQk9IGtlcm5lbC5sX3R5cGU7CisJCQl1c2VyLmxfd2hlbmNlCT0ga2VybmVsLmxfd2hlbmNlOworCQkJdXNlci5sX3N0YXJ0CT0ga2VybmVsLmxfc3RhcnQ7CisJCQl1c2VyLmxfbGVuCT0ga2VybmVsLmxfbGVuOworCQkJdXNlci5sX3BpZAk9IGtlcm5lbC5sX3BpZDsKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCBvYWJpX2Zsb2NrNjQgX191c2VyICopYXJnLAorCQkJCQkgJnVzZXIsIHNpemVvZih1c2VyKSkpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJfQorCWNhc2UgRl9TRVRMSzY0OgorCWNhc2UgRl9TRVRMS1c2NDoKKwkJc2V0X2ZzKGZzKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3Qgb2FiaV9lcG9sbF9ldmVudCB7CisJX191MzIgZXZlbnRzOworCV9fdTY0IGRhdGE7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQsYWxpZ25lZCg0KSkpOworCithc21saW5rYWdlIGxvbmcgc3lzX29hYmlfZXBvbGxfY3RsKGludCBlcGZkLCBpbnQgb3AsIGludCBmZCwKKwkJCQkgICBzdHJ1Y3Qgb2FiaV9lcG9sbF9ldmVudCBfX3VzZXIgKmV2ZW50KQoreworCXN0cnVjdCBvYWJpX2Vwb2xsX2V2ZW50IHVzZXI7CisJc3RydWN0IGVwb2xsX2V2ZW50IGtlcm5lbDsKKwltbV9zZWdtZW50X3QgZnM7CisJbG9uZyByZXQ7CisKKwlpZiAob3AgPT0gRVBPTExfQ1RMX0RFTCkKKwkJcmV0dXJuIHN5c19lcG9sbF9jdGwoZXBmZCwgb3AsIGZkLCBOVUxMKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnVzZXIsIGV2ZW50LCBzaXplb2YodXNlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlrZXJuZWwuZXZlbnRzID0gdXNlci5ldmVudHM7CisJa2VybmVsLmRhdGEgICA9IHVzZXIuZGF0YTsKKwlmcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCXJldCA9IHN5c19lcG9sbF9jdGwoZXBmZCwgb3AsIGZkLCAma2VybmVsKTsKKwlzZXRfZnMoZnMpOworCXJldHVybiByZXQ7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfb2FiaV9lcG9sbF93YWl0KGludCBlcGZkLAorCQkJCSAgICBzdHJ1Y3Qgb2FiaV9lcG9sbF9ldmVudCBfX3VzZXIgKmV2ZW50cywKKwkJCQkgICAgaW50IG1heGV2ZW50cywgaW50IHRpbWVvdXQpCit7CisJc3RydWN0IGVwb2xsX2V2ZW50ICprYnVmOworCW1tX3NlZ21lbnRfdCBmczsKKwlsb25nIHJldCwgZXJyLCBpOworCisJaWYgKG1heGV2ZW50cyA8PSAwIHx8IG1heGV2ZW50cyA+IChJTlRfTUFYL3NpemVvZihzdHJ1Y3QgZXBvbGxfZXZlbnQpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJa2J1ZiA9IGttYWxsb2Moc2l6ZW9mKCprYnVmKSAqIG1heGV2ZW50cywgR0ZQX0tFUk5FTCk7CisJaWYgKCFrYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlmcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCXJldCA9IHN5c19lcG9sbF93YWl0KGVwZmQsIGtidWYsIG1heGV2ZW50cywgdGltZW91dCk7CisJc2V0X2ZzKGZzKTsKKwllcnIgPSAwOworCWZvciAoaSA9IDA7IGkgPCByZXQ7IGkrKykgeworCQlfX3B1dF91c2VyX2Vycm9yKGtidWZbaV0uZXZlbnRzLCAmZXZlbnRzLT5ldmVudHMsIGVycik7CisJCV9fcHV0X3VzZXJfZXJyb3Ioa2J1ZltpXS5kYXRhLCAgICZldmVudHMtPmRhdGEsICAgZXJyKTsKKwkJZXZlbnRzKys7CisJfQorCWtmcmVlKGtidWYpOworCXJldHVybiBlcnIgPyAtRUZBVUxUIDogcmV0OworfQorCitzdHJ1Y3Qgb2FiaV9zZW1idWYgeworCXVuc2lnbmVkIHNob3J0CXNlbV9udW07CisJc2hvcnQJCXNlbV9vcDsKKwlzaG9ydAkJc2VtX2ZsZzsKKwl1bnNpZ25lZCBzaG9ydAlfX3BhZDsKK307CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfb2FiaV9zZW10aW1lZG9wKGludCBzZW1pZCwKKwkJCQkgICAgc3RydWN0IG9hYmlfc2VtYnVmIF9fdXNlciAqdHNvcHMsCisJCQkJICAgIHVuc2lnbmVkIG5zb3BzLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICp0aW1lb3V0KQoreworCXN0cnVjdCBzZW1idWYgKnNvcHM7CisJc3RydWN0IHRpbWVzcGVjIGxvY2FsX3RpbWVvdXQ7CisJbG9uZyBlcnI7CisJaW50IGk7CisKKwlpZiAobnNvcHMgPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzb3BzID0ga21hbGxvYyhzaXplb2YoKnNvcHMpICogbnNvcHMsIEdGUF9LRVJORUwpOworCWlmICghc29wcykKKwkJcmV0dXJuIC1FTk9NRU07CisJZXJyID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnNvcHM7IGkrKykgeworCQlfX2dldF91c2VyX2Vycm9yKHNvcHNbaV0uc2VtX251bSwgJnRzb3BzLT5zZW1fbnVtLCBlcnIpOworCQlfX2dldF91c2VyX2Vycm9yKHNvcHNbaV0uc2VtX29wLCAgJnRzb3BzLT5zZW1fb3AsICBlcnIpOworCQlfX2dldF91c2VyX2Vycm9yKHNvcHNbaV0uc2VtX2ZsZywgJnRzb3BzLT5zZW1fZmxnLCBlcnIpOworCQl0c29wcysrOworCX0KKwlpZiAodGltZW91dCkgeworCQkvKiBjb3B5IHRoaXMgYXMgd2VsbCBiZWZvcmUgY2hhbmdpbmcgZG9tYWluIHByb3RlY3Rpb24gKi8KKwkJZXJyIHw9IGNvcHlfZnJvbV91c2VyKCZsb2NhbF90aW1lb3V0LCB0aW1lb3V0LCBzaXplb2YoKnRpbWVvdXQpKTsKKwkJdGltZW91dCA9ICZsb2NhbF90aW1lb3V0OworCX0KKwlpZiAoZXJyKSB7CisJCWVyciA9IC1FRkFVTFQ7CisJfSBlbHNlIHsKKwkJbW1fc2VnbWVudF90IGZzID0gZ2V0X2ZzKCk7CisJCXNldF9mcyhLRVJORUxfRFMpOworCQllcnIgPSBzeXNfc2VtdGltZWRvcChzZW1pZCwgc29wcywgbnNvcHMsIHRpbWVvdXQpOworCQlzZXRfZnMoZnMpOworCX0KKwlrZnJlZShzb3BzKTsKKwlyZXR1cm4gZXJyOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX29hYmlfc2Vtb3AoaW50IHNlbWlkLCBzdHJ1Y3Qgb2FiaV9zZW1idWYgX191c2VyICp0c29wcywKKwkJCSAgICAgICB1bnNpZ25lZCBuc29wcykKK3sKKwlyZXR1cm4gc3lzX29hYmlfc2VtdGltZWRvcChzZW1pZCwgdHNvcHMsIG5zb3BzLCBOVUxMKTsKK30KKworZXh0ZXJuIGFzbWxpbmthZ2UgaW50IHN5c19pcGModWludCBjYWxsLCBpbnQgZmlyc3QsIGludCBzZWNvbmQsIGludCB0aGlyZCwKKwkJCSAgICAgIHZvaWQgX191c2VyICpwdHIsIGxvbmcgZmlmdGgpOworCithc21saW5rYWdlIGludCBzeXNfb2FiaV9pcGModWludCBjYWxsLCBpbnQgZmlyc3QsIGludCBzZWNvbmQsIGludCB0aGlyZCwKKwkJCSAgICB2b2lkIF9fdXNlciAqcHRyLCBsb25nIGZpZnRoKQoreworCXN3aXRjaCAoY2FsbCAmIDB4ZmZmZikgeworCWNhc2UgU0VNT1A6CisJCXJldHVybiAgc3lzX29hYmlfc2VtdGltZWRvcChmaXJzdCwKKwkJCQkJICAgIChzdHJ1Y3Qgb2FiaV9zZW1idWYgX191c2VyICopcHRyLAorCQkJCQkgICAgc2Vjb25kLCBOVUxMKTsKKwljYXNlIFNFTVRJTUVET1A6CisJCXJldHVybiAgc3lzX29hYmlfc2VtdGltZWRvcChmaXJzdCwKKwkJCQkJICAgIChzdHJ1Y3Qgb2FiaV9zZW1idWYgX191c2VyICopcHRyLAorCQkJCQkgICAgc2Vjb25kLAorCQkJCQkgICAgKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKilmaWZ0aCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIHN5c19pcGMoY2FsbCwgZmlyc3QsIHNlY29uZCwgdGhpcmQsIHB0ciwgZmlmdGgpOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMgYi9hcmNoL2FybS9rZXJuZWwvdGltZS5jCmluZGV4IGZjNDcyOTEuLmQ3ZDkzMmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3RpbWUuYwpAQCAtMjksOSArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAKLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jCmluZGV4IDQ1ZTllYTYuLjEwMjM1YjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jCkBAIC0yMyw3ICsyMyw2IEBACiAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CkBAIC0xNjUsNyArMTY0LDcgQEAKIAl9IGVsc2UgaWYgKHZlcmlmeV9zdGFjayhmcCkpIHsKIAkJcHJpbnRrKCJpbnZhbGlkIGZyYW1lIHBvaW50ZXIgMHglMDh4IiwgZnApOwogCQlvayA9IDA7Ci0JfSBlbHNlIGlmIChmcCA8ICh1bnNpZ25lZCBsb25nKSh0c2stPnRocmVhZF9pbmZvICsgMSkpCisJfSBlbHNlIGlmIChmcCA8ICh1bnNpZ25lZCBsb25nKWVuZF9vZl9zdGFjayh0c2spKQogCQlwcmludGsoImZyYW1lIHBvaW50ZXIgdW5kZXJmbG93Iik7CiAJcHJpbnRrKCJcbiIpOwogCkBAIC0yMTEsNyArMjEwLDcgQEAKIAogCWlmICghdXNlcl9tb2RlKHJlZ3MpIHx8IGluX2ludGVycnVwdCgpKSB7CiAJCWR1bXBfbWVtKCJTdGFjazogIiwgcmVncy0+QVJNX3NwLAotCQkJIFRIUkVBRF9TSVpFICsgKHVuc2lnbmVkIGxvbmcpdHNrLT50aHJlYWRfaW5mbyk7CisJCQkgVEhSRUFEX1NJWkUgKyAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UodHNrKSk7CiAJCWR1bXBfYmFja3RyYWNlKHJlZ3MsIHRzayk7CiAJCWR1bXBfaW5zdHIocmVncyk7CiAJfQpAQCAtNDA1LDcgKzQwNCw3IEBACiAJc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQgPSBjdXJyZW50X3RocmVhZF9pbmZvKCk7CiAJc2lnaW5mb190IGluZm87CiAKLQlpZiAoKG5vID4+IDE2KSAhPSAweDlmKQorCWlmICgobm8gPj4gMTYpICE9IChfX0FSTV9OUl9CQVNFPj4gMTYpKQogCQlyZXR1cm4gYmFkX3N5c2NhbGwobm8sIHJlZ3MpOwogCiAJc3dpdGNoIChubyAmIDB4ZmZmZikgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL2FybS9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA5YTQ3NzcwLi4yYjI1NGU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL2FybS9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMTcsMTUgKzE3LDEzIEBACiBqaWZmaWVzID0gamlmZmllc182NCArIDQ7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19YSVBfS0VSTkVMCi0jZGVmaW5lIFRFWFRBRERSICBYSVBfVklSVF9BRERSKENPTkZJR19YSVBfUEhZU19BRERSKQotI2Vsc2UKLSNkZWZpbmUgVEVYVEFERFIgIEtFUk5FTF9SQU1fQUREUgotI2VuZGlmCi0KIFNFQ1RJT05TCiB7Ci0JLiA9IFRFWFRBRERSOworI2lmZGVmIENPTkZJR19YSVBfS0VSTkVMCisJLiA9IFhJUF9WSVJUX0FERFIoQ09ORklHX1hJUF9QSFlTX0FERFIpOworI2Vsc2UKKwkuID0gUEFHRV9PRkZTRVQgKyBURVhUX09GRlNFVDsKKyNlbmRpZgogCS5pbml0IDogewkJCS8qIEluaXQgY29kZSBhbmQgZGF0YQkJKi8KIAkJX3N0ZXh0ID0gLjsKIAkJCV9zaW5pdHRleHQgPSAuOwpAQCAtMTA0LDcgKzEwMiw3IEBACiAKICNpZmRlZiBDT05GSUdfWElQX0tFUk5FTAogCV9fZGF0YV9sb2MgPSBBTElHTig0KTsJCS8qIGxvY2F0aW9uIGluIGJpbmFyeSAqLwotCS4gPSBLRVJORUxfUkFNX0FERFI7CisJLiA9IFBBR0VfT0ZGU0VUICsgVEVYVF9PRkZTRVQ7CiAjZWxzZQogCS4gPSBBTElHTihUSFJFQURfU0laRSk7CiAJX19kYXRhX2xvYyA9IC47CmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvYXNobGRpMy5TIGIvYXJjaC9hcm0vbGliL2FzaGxkaTMuUwppbmRleCA1NjFlMjA3Li41NWU1N2ExYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL2FzaGxkaTMuUworKysgYi9hcmNoL2FybS9saWIvYXNobGRpMy5TCkBAIC0zNyw2ICszNyw3IEBACiAjZW5kaWYKIAogRU5UUlkoX19hc2hsZGkzKQorRU5UUlkoX19hZWFiaV9sbHNsKQogCiAJc3VicwlyMywgcjIsICMzMgogCXJzYglpcCwgcjIsICMzMgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2FzaHJkaTMuUyBiL2FyY2gvYXJtL2xpYi9hc2hyZGkzLlMKaW5kZXggODZmYjJhOS4uMGIzMTM5OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL2FzaHJkaTMuUworKysgYi9hcmNoL2FybS9saWIvYXNocmRpMy5TCkBAIC0zNyw2ICszNyw3IEBACiAjZW5kaWYKIAogRU5UUlkoX19hc2hyZGkzKQorRU5UUlkoX19hZWFiaV9sYXNyKQogCiAJc3VicwlyMywgcjIsICMzMgogCXJzYglpcCwgcjIsICMzMgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weS5TIGIvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weS5TCmluZGV4IDk5MGVlNjMuLjIxZWZmZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbGNvcHkuUworKysgYi9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5LlMKQEAgLTE4LDExICsxOCwxMyBAQAogICovCiAKIAkJLm1hY3JvCXNhdmVfcmVncworCQltb3YJaXAsIHNwCiAJCXN0bWZkCXNwISwge3IxLCByNCAtIHI4LCBmcCwgaXAsIGxyLCBwY30KKwkJc3ViCWZwLCBpcCwgIzQKIAkJLmVuZG0KIAotCQkubWFjcm8JbG9hZF9yZWdzLGZsYWdzCi0JCUxPQURSRUdTKFxmbGFncyxmcCx7cjEsIHI0IC0gcjgsIGZwLCBzcCwgcGN9KQorCQkubWFjcm8JbG9hZF9yZWdzCisJCWxkbWZkCXNwLCB7cjEsIHI0IC0gcjgsIGZwLCBzcCwgcGN9CiAJCS5lbmRtCiAKIAkJLm1hY3JvCWxvYWQxYiwgcmVnMQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weWdlbmVyaWMuUyBiL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbGNvcHlnZW5lcmljLlMKaW5kZXggNGE0NjA5Yy4uYzUwZThmNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weWdlbmVyaWMuUworKysgYi9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5Z2VuZXJpYy5TCkBAIC0yMyw3ICsyMyw3IEBACiBzdW0JLnJlcQlyMwogCiAuTHplcm86CQltb3YJcjAsIHN1bQotCQlsb2FkX3JlZ3MJZWEKKwkJbG9hZF9yZWdzCiAKIAkJLyoKIAkJICogQWxpZ24gYW4gdW5hbGlnbmVkIGRlc3RpbmF0aW9uIHBvaW50ZXIuICBXZSBrbm93IHRoYXQKQEAgLTg3LDkgKzg3LDcgQEAKIAkJYgkuTGRvbmUKIAogRk5fRU5UUlkKLQkJbW92CWlwLCBzcAogCQlzYXZlX3JlZ3MKLQkJc3ViCWZwLCBpcCwgIzQKIAogCQljbXAJbGVuLCAjOAkJCUAgRW5zdXJlIHRoYXQgd2UgaGF2ZSBhdCBsZWFzdAogCQlibG8JLkxsZXNzOAkJCUAgOCBieXRlcyB0byBjb3B5LgpAQCAtMTYzLDcgKzE2MSw3IEBACiAJCWxkcglzdW0sIFtzcCwgIzBdCQlAIGRzdAogCQl0c3QJc3VtLCAjMQogCQltb3ZuZQlyMCwgcjAsIHJvciAjOAotCQlsb2FkX3JlZ3MJZWEKKwkJbG9hZF9yZWdzCiAKIC5Mc3JjX25vdF9hbGlnbmVkOgogCQlhZGMJc3VtLCBzdW0sICMwCQlAIGluY2x1ZGUgQyBmcm9tIGRzdCBhbGlnbm1lbnQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbGNvcHl1c2VyLlMgYi9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5dXNlci5TCmluZGV4IDMzM2JjYTIuLmMzYjkzZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbGNvcHl1c2VyLlMKKysrIGIvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weXVzZXIuUwpAQCAtMTgsMTEgKzE4LDEzIEBACiAJCS50ZXh0CiAKIAkJLm1hY3JvCXNhdmVfcmVncworCQltb3YJaXAsIHNwCiAJCXN0bWZkCXNwISwge3IxIC0gcjIsIHI0IC0gcjgsIGZwLCBpcCwgbHIsIHBjfQorCQlzdWIJZnAsIGlwLCAjNAogCQkuZW5kbQogCi0JCS5tYWNybwlsb2FkX3JlZ3MsZmxhZ3MKLQkJbGRtXGZsYWdzCWZwLCB7cjEsIHIyLCByNC1yOCwgZnAsIHNwLCBwY30KKwkJLm1hY3JvCWxvYWRfcmVncworCQlsZG1mZAlzcCwge3IxLCByMiwgcjQtcjgsIGZwLCBzcCwgcGN9CiAJCS5lbmRtCiAKIAkJLm1hY3JvCWxvYWQxYiwJcmVnMQpAQCAtMTAwLDUgKzEwMiw1IEBACiA2MDAyOgkJdGVxCXIyLCByMQogCQlzdHJuZWIJcjAsIFtyMV0sICMxCiAJCWJuZQk2MDAyYgotCQlsb2FkX3JlZ3MJZWEKKwkJbG9hZF9yZWdzCiAJCS5wcmV2aW91cwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2xpYjFmdW5jcy5TIGIvYXJjaC9hcm0vbGliL2xpYjFmdW5jcy5TCmluZGV4IDU5MDI2MDIuLjRlNDkyZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9saWIxZnVuY3MuUworKysgYi9hcmNoL2FybS9saWIvbGliMWZ1bmNzLlMKQEAgLTIwNiw2ICsyMDYsNyBAQAogCiAKIEVOVFJZKF9fdWRpdnNpMykKK0VOVFJZKF9fYWVhYmlfdWlkaXYpCiAKIAlzdWJzCXIyLCByMSwgIzEKIAltb3ZlcQlwYywgbHIKQEAgLTI0Niw2ICsyNDcsNyBAQAogCiAKIEVOVFJZKF9fZGl2c2kzKQorRU5UUlkoX19hZWFiaV9pZGl2KQogCiAJY21wCXIxLCAjMAogCWVvcglpcCwgcjAsIHIxCQkJQCBzYXZlIHRoZSBzaWduIG9mIHRoZSByZXN1bHQuCkBAIC0zMDMsMTIgKzMwNSwzMyBAQAogCXJzYm1pCXIwLCByMCwgIzAKIAltb3YJcGMsIGxyCiAKKyNpZmRlZiBDT05GSUdfQUVBQkkKKworRU5UUlkoX19hZWFiaV91aWRpdm1vZCkKKworCXN0bWZkCXNwISwge3IwLCByMSwgaXAsIGxyfQorCWJsCV9fYWVhYmlfdWlkaXYKKwlsZG1mZAlzcCEsIHtyMSwgcjIsIGlwLCBscn0KKwltdWwJcjMsIHIwLCByMgorCXN1YglyMSwgcjEsIHIzCisJbW92CXBjLCBscgorCitFTlRSWShfX2FlYWJpX2lkaXZtb2QpCisKKwlzdG1mZAlzcCEsIHtyMCwgcjEsIGlwLCBscn0KKwlibAlfX2FlYWJpX2lkaXYKKwlsZG1mZAlzcCEsIHtyMSwgcjIsIGlwLCBscn0KKwltdWwJcjMsIHIwLCByMgorCXN1YglyMSwgcjEsIHIzCisJbW92CXBjLCBscgorCisjZW5kaWYKIAogTGRpdjA6CiAKLQlzdHIJbHIsIFtzcCwgIy00XSEKKwlzdHIJbHIsIFtzcCwgIy04XSEKIAlibAlfX2RpdjAKIAltb3YJcjAsICMwCQkJQCBBYm91dCBhcyB3cm9uZyBhcyBpdCBjb3VsZCBiZS4KLQlsZHIJcGMsIFtzcF0sICM0CisJbGRyCXBjLCBbc3BdLCAjOAogCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9sc2hyZGkzLlMgYi9hcmNoL2FybS9saWIvbHNocmRpMy5TCmluZGV4IDQ2YzJlZDEuLmE4NmRiZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9sc2hyZGkzLlMKKysrIGIvYXJjaC9hcm0vbGliL2xzaHJkaTMuUwpAQCAtMzcsNiArMzcsNyBAQAogI2VuZGlmCiAKIEVOVFJZKF9fbHNocmRpMykKK0VOVFJZKF9fYWVhYmlfbGxzcikKIAogCXN1YnMJcjMsIHIyLCAjMzIKIAlyc2IJaXAsIHIyLCAjMzIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9tdWxkaTMuUyBiL2FyY2gvYXJtL2xpYi9tdWxkaTMuUwppbmRleCBjN2ZiZGYwLi43MmQ1OTQxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvbXVsZGkzLlMKKysrIGIvYXJjaC9hcm0vbGliL211bGRpMy5TCkBAIC0yNSw2ICsyNSw3IEBACiAjZW5kaWYKIAogRU5UUlkoX19tdWxkaTMpCitFTlRSWShfX2FlYWJpX2xtdWwpCiAKIAltdWwJeGgsIHlsLCB4aAogCW1sYQl4aCwgeGwsIHloLCB4aApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL3VjbXBkaTIuUyBiL2FyY2gvYXJtL2xpYi91Y21wZGkyLlMKaW5kZXggMTEyNjMwZi4uZDg0N2E2MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL3VjbXBkaTIuUworKysgYi9hcmNoL2FybS9saWIvdWNtcGRpMi5TCkBAIC0xMCw2ICsxMCw3IEBACiAgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KIAogI2lmZGVmIF9fQVJNRUJfXwpAQCAtMzMsMyArMzQsMTYgQEAKIAltb3ZoaQlyMCwgIzIKIAltb3YJcGMsIGxyCiAKKyNpZmRlZiBDT05GSUdfQUVBQkkKKworRU5UUlkoX19hZWFiaV91bGNtcCkKKworCWNtcAl4aCwgeWgKKwljbXBlcQl4bCwgeWwKKwltb3ZsbwlyMCwgIy0xCisJbW92ZXEJcjAsICMwCisJbW92aGkJcjAsICMxCisJbW92CXBjLCBscgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9hYWVkMjAwMC5jIGIvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9hYWVkMjAwMC5jCmluZGV4IGY1ZWY2OTcuLmRjNWZhOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvYWFlZDIwMDAuYworKysgYi9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2FhZWQyMDAwLmMKQEAgLTkwLDcgKzkwLDYgQEAKIAogTUFDSElORV9TVEFSVChBQUVEMjAwMCwgIkFnaWxlbnQgQUFFRC0yMDAwIERldmVsb3BtZW50IFBsYXRmb3JtIikKIAkvKiBNYWludGFpbmVyOiBOaWNvbGFzIEJlbGxpZG8gWSBPcnRlZ2EgKi8KLQkucGh5c19yYW0JPSAweGYwMDAwMDAwLAogCS5waHlzX2lvCT0gUElPX0JBU0UsCiAJLmlvX3BnX29mZnN0CT0gKChWSU9fQkFTRSkgPj4gMTgpICYgMHhmZmZjLAogCS5tYXBfaW8JCT0gYWFlZDIwMDBfbWFwX2lvLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9jbG9jay5jCmluZGV4IDAzNDBkZGMuLjc0YWE3YTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2Nsb2NrLmMKQEAgLTE1LDI3ICsxNSwyOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KIAogI2luY2x1ZGUgImNsb2NrLmgiCiAKIHN0YXRpYyBMSVNUX0hFQUQoY2xvY2tzKTsKLXN0YXRpYyBERUNMQVJFX01VVEVYKGNsb2Nrc19zZW0pOworc3RhdGljIERFRklORV9NVVRFWChjbG9ja3NfbXV0ZXgpOwogCiBzdHJ1Y3QgY2xrICpjbGtfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqaWQpCiB7CiAJc3RydWN0IGNsayAqcCwgKmNsayA9IEVSUl9QVFIoLUVOT0VOVCk7CiAKLQlkb3duKCZjbG9ja3Nfc2VtKTsKKwltdXRleF9sb2NrKCZjbG9ja3NfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmNsb2Nrcywgbm9kZSkgewogCQlpZiAoc3RyY21wKGlkLCBwLT5uYW1lKSA9PSAwICYmIHRyeV9tb2R1bGVfZ2V0KHAtPm93bmVyKSkgewogCQkJY2xrID0gcDsKIAkJCWJyZWFrOwogCQl9CiAJfQotCXVwKCZjbG9ja3Nfc2VtKTsKKwltdXRleF91bmxvY2soJmNsb2Nrc19tdXRleCk7CiAKIAlyZXR1cm4gY2xrOwogfQpAQCAtNTgsMTcgKzU5LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woY2xrX2Rpc2FibGUpOwogCi1pbnQgY2xrX3VzZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa191c2UpOwotCi12b2lkIGNsa191bnVzZShzdHJ1Y3QgY2xrICpjbGspCi17Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa191bnVzZSk7Ci0KIHVuc2lnbmVkIGxvbmcgY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlyZXR1cm4gY2xrLT5yYXRlOwpAQCAtODksMTggKzc5LDE4IEBACiAKIGludCBjbGtfcmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKQogewotCWRvd24oJmNsb2Nrc19zZW0pOworCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7CiAJbGlzdF9hZGQoJmNsay0+bm9kZSwgJmNsb2Nrcyk7Ci0JdXAoJmNsb2Nrc19zZW0pOworCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woY2xrX3JlZ2lzdGVyKTsKIAogdm9pZCBjbGtfdW5yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspCiB7Ci0JZG93bigmY2xvY2tzX3NlbSk7CisJbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKIAlsaXN0X2RlbCgmY2xrLT5ub2RlKTsKLQl1cCgmY2xvY2tzX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTChjbGtfdW5yZWdpc3Rlcik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9jb3JlLmMKaW5kZXggNGU3MDZkOS4uZGNlNDgxNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9jb3JlLmMKQEAgLTIwLDExICsyMCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KIAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYW1iYS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvY29yZS5oIGIvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9jb3JlLmgKaW5kZXggZGFlZmMwZS4uYjYwMjlhOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9jb3JlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9jb3JlLmgKQEAgLTksNyArOSw3IEBACiAgKgogICovCiAKLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYW1iYV9jbGNkLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9jbGNkLmg+CiAKIHN0cnVjdCBzeXNfdGltZXI7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI3MjE4ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9LY29uZmlnCkBAIC0wLDAgKzEsNTQgQEAKK2lmIEFSQ0hfQVQ5MVJNOTIwMAorCittZW51ICJBVDkxUk05MjAwIEltcGxlbWVudGF0aW9ucyIKKworY29tbWVudCAiQVQ5MVJNOTIwMCBCb2FyZCBUeXBlIgorCitjb25maWcgQVJDSF9BVDkxUk05MjAwREsKKwlib29sICJBdG1lbCBBVDkxUk05MjAwLURLIERldmVsb3BtZW50IGJvYXJkIgorCWRlcGVuZHMgb24gQVJDSF9BVDkxUk05MjAwCisJaGVscAorCSAgU2VsZWN0IHRoaXMgaWYgeW91IGFyZSB1c2luZyBBdG1lbCdzIEFUOTFSTTkyMDAtREsgRGV2ZWxvcG1lbnQgYm9hcmQKKworY29uZmlnIE1BQ0hfQVQ5MVJNOTIwMEVLCisJYm9vbCAiQXRtZWwgQVQ5MVJNOTIwMC1FSyBFdmFsdWF0aW9uIEtpdCIKKwlkZXBlbmRzIG9uIEFSQ0hfQVQ5MVJNOTIwMAorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIGlmIHlvdSBhcmUgdXNpbmcgQXRtZWwncyBBVDkxUk05MjAwLUVLIEV2YWx1YXRpb24gS2l0CisKK2NvbmZpZyBNQUNIX0NTQjMzNworCWJvb2wgIkNvZ2VudCBDU0IzMzcgYm9hcmQiCisJZGVwZW5kcyBvbiBBUkNIX0FUOTFSTTkyMDAKKwloZWxwCisJICBTZWxlY3QgdGhpcyBpZiB5b3UgYXJlIHVzaW5nIENvZ2VudCdzIENTQjMzNyBib2FyZAorCitjb25maWcgTUFDSF9DU0I2MzcKKwlib29sICJDb2dlbnQgQ1NCNjM3IGJvYXJkIgorCWRlcGVuZHMgb24gQVJDSF9BVDkxUk05MjAwCisJaGVscAorCSAgU2VsZWN0IHRoaXMgaWYgeW91IGFyZSB1c2luZyBDb2dlbnQncyBDU0I2MzcgYm9hcmQKKworY29uZmlnIE1BQ0hfQ0FSTUVWQQorCWJvb2wgIkNvbml0ZWMncyBBUk0mRVZBIgorCWRlcGVuZHMgb24gQVJDSF9BVDkxUk05MjAwCisJaGVscAorCSAgU2VsZWN0IHRoaXMgaWYgeW91IGFyZSB1c2luZyBDb25pdGVjJ3MgQVQ5MVJNOTIwMC1NQ1UtTW9kdWxlCisKK2NvbmZpZyBNQUNIX0tCOTIwMAorCWJvb2wgIkt3aWtCeXRlJ3MgS0I5MjB4IgorCWRlcGVuZHMgb24gQVJDSF9BVDkxUk05MjAwCisJaGVscAorCSAgU2VsZWN0IHRoaXMgaWYgeW91IGFyZSB1c2luZyBLd2lrQnl0ZSdzIEtCOTIweCBib2FyZAorCisKK2NvbW1lbnQgIkFUOTFSTTkyMDAgRmVhdHVyZSBTZWxlY3Rpb25zIgorCitjb25maWcgQVQ5MV9QUk9HUkFNTUFCTEVfQ0xPQ0tTCisJYm9vbCAiUHJvZ3JhbW1hYmxlIENsb2NrcyIKKwloZWxwCisJICBTZWxlY3QgdGhpcyBpZiB5b3UgbmVlZCB0byBwcm9ncmFtIG9uZSBvciBtb3JlIG9mIHRoZSBQQ0swLi5QQ0szCisJICBwcm9ncmFtbWFibGUgY2xvY2sgb3V0cHV0cy4KKworZW5kbWVudQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZTZlZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvTWFrZWZpbGUKQEAgLTAsMCArMSwyNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KKyMKKworb2JqLXkJCTo9IGNsb2NrLm8gaXJxLm8gdGltZS5vIGdwaW8ubyBjb21tb24ubyBkZXZpY2VzLm8KK29iai1tCQk6PQorb2JqLW4JCTo9CitvYmotCQk6PQorCisjIEJvYXJkLXNwZWNpZmljIHN1cHBvcnQKK29iai0kKENPTkZJR19BUkNIX0FUOTFSTTkyMDBESykJKz0gYm9hcmQtZGsubworb2JqLSQoQ09ORklHX01BQ0hfQVQ5MVJNOTIwMEVLKQkrPSBib2FyZC1lay5vCitvYmotJChDT05GSUdfTUFDSF9DU0IzMzcpCSs9IGJvYXJkLWNzYjMzNy5vCitvYmotJChDT05GSUdfTUFDSF9DU0I2MzcpCSs9IGJvYXJkLWNzYjYzNy5vCisjb2JqLSQoQ09ORklHX01BQ0hfQ0FSTUVWQSkJKz0gYm9hcmQtY2FybWV2YS5vCisjb2JqLSQoQ09ORklHX01BQ0hfS0I5MjAwKQkrPSBib2FyZC1rYjkyMDIubworCisjIExFRHMgc3VwcG9ydAorI2xlZC0kKENPTkZJR19BUkNIX0FUOTFSTTkyMDBESykJKz0gbGVkcy5vCisjbGVkLSQoQ09ORklHX01BQ0hfQVQ5MVJNOTIwMEVLKQkrPSBsZWRzLm8KKyNsZWQtJChDT05GSUdfTUFDSF9DU0IzMzcpCSs9IGxlZHMubworI2xlZC0kKENPTkZJR19NQUNIX0NTQjYzNykJKz0gbGVkcy5vCisjbGVkLSQoQ09ORklHX01BQ0hfS0I5MjAwKQkrPSBsZWRzLm8KK29iai0kKENPTkZJR19MRURTKSArPSAkKGxlZC15KQorCisjIFZHQSBzdXBwb3J0Cisjb2JqLSQoQ09ORklHX0ZCX1MxRDEzWFhYKQkrPSBpY3MxNTIzLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9NYWtlZmlsZS5ib290IGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL01ha2VmaWxlLmJvb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2N2RjYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9NYWtlZmlsZS5ib290CkBAIC0wLDAgKzEsOSBAQAorIyBOb3RlOiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgbXVzdCBhbHdheXMgYmUgdHJ1ZToKKyMgICBaUkVMQUREUiA9PSB2aXJ0X3RvX3BoeXMoVEVYVEFERFIpCisjICAgUEFSQU1TX1BIWVMgbXVzdCBiZSB3aXRoaW4gNE1CIG9mIFpSRUxBRERSCisjICAgSU5JVFJEX1BIWVMgbXVzdCBiZSBpbiBSQU0KKworICAgenJlbGFkZHIteQk6PSAweDIwMDA4MDAwCitwYXJhbXNfcGh5cy15CTo9IDB4MjAwMDAxMDAKK2luaXRyZF9waHlzLXkJOj0gMHgyMDQxMDAwMAorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYm9hcmQtY3NiMzM3LmMgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYm9hcmQtY3NiMzM3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQwMjJlNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1jc2IzMzcuYwpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1jc2IzMzcuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgU0FOIFBlb3BsZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9zZXJpYWxfYXQ5MXJtOTIwMC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKK3N0YXRpYyB2b2lkIF9faW5pdCBjc2IzMzdfaW5pdF9pcnEodm9pZCkKK3sKKwkvKiBJbml0aWFsaXplIEFJQyBjb250cm9sbGVyICovCisJYXQ5MXJtOTIwMF9pbml0X2lycShOVUxMKTsKKworCS8qIFNldCB1cCB0aGUgR1BJTyBpbnRlcnJ1cHRzICovCisJYXQ5MV9ncGlvX2lycV9zZXR1cChCR0FfR1BJT19CQU5LUyk7Cit9CisKKy8qCisgKiBTZXJpYWwgcG9ydCBjb25maWd1cmF0aW9uLgorICogICAgMCAuLiAzID0gVVNBUlQwIC4uIFVTQVJUMworICogICAgNCAgICAgID0gREJHVQorICovCisjZGVmaW5lIENTQjMzN19VQVJUX01BUAkJeyA0LCAxLCAtMSwgLTEsIC0xIH0JLyogdHR5UzAsIC4uLiwgdHR5UzQgKi8KKyNkZWZpbmUgQ1NCMzM3X1NFUklBTF9DT05TT0xFCTAJCQkvKiB0dHlTMCAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgY3NiMzM3X21hcF9pbyh2b2lkKQoreworCWludCBzZXJpYWxbQVQ5MV9OUl9VQVJUXSA9IENTQjMzN19VQVJUX01BUDsKKwlpbnQgaTsKKworCWF0OTFybTkyMDBfbWFwX2lvKCk7CisKKwkvKiBJbml0aWFsaXplIGNsb2NrczogMy42ODY0IE1IeiBjcnlzdGFsICovCisJYXQ5MV9jbG9ja19pbml0KDM2ODY0MDApOworCisjaWZkZWYgQ09ORklHX1NFUklBTF9BVDkxCisJYXQ5MV9jb25zb2xlX3BvcnQgPSBDU0IzMzdfU0VSSUFMX0NPTlNPTEU7CisJbWVtY3B5KGF0OTFfc2VyaWFsX21hcCwgc2VyaWFsLCBzaXplb2Yoc2VyaWFsKSk7CisKKwkvKiBSZWdpc3RlciBVQVJUcyAqLworCWZvciAoaSA9IDA7IGkgPCBBVDkxX05SX1VBUlQ7IGkrKykgeworCQlpZiAoc2VyaWFsW2ldID49IDApCisJCQlhdDkxX3JlZ2lzdGVyX3VhcnQoaSwgc2VyaWFsW2ldKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHN0cnVjdCBhdDkxX2V0aF9kYXRhIF9faW5pdGRhdGEgY3NiMzM3X2V0aF9kYXRhID0geworCS5waHlfaXJxX3Bpbgk9IEFUOTFfUElOX1BDMiwKKwkuaXNfcm1paQk9IDAsCit9OworCitzdGF0aWMgc3RydWN0IGF0OTFfdXNiaF9kYXRhIF9faW5pdGRhdGEgY3NiMzM3X3VzYmhfZGF0YSA9IHsKKwkucG9ydHMJCT0gMiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXQ5MV91ZGNfZGF0YSBfX2luaXRkYXRhIGNzYjMzN191ZGNfZGF0YSA9IHsKKwkvLyB0aGlzIGhhcyBubyBWQlVTIHNlbnNpbmcgcGluCisJLnB1bGx1cF9waW4JPSBBVDkxX1BJTl9QQTI0LAorfTsKKworc3RhdGljIHN0cnVjdCBhdDkxX2NmX2RhdGEgX19pbml0ZGF0YSBjc2IzMzdfY2ZfZGF0YSA9IHsKKwkvKgorCSAqIGNvbm5lY3RvciBQNCBvbiB0aGUgQ1NCIDMzNyBtYXRlcyB0bworCSAqIGNvbm5lY3RvciBQOCBvbiB0aGUgQ1NCIDMwMENGCisJICovCisKKwkvKiBDU0IzMzcgc3BlY2lmaWMgKi8KKwkuZGV0X3Bpbgk9IEFUOTFfUElOX1BDMywKKworCS8qIENTQjMwMENGIHNwZWNpZmljICovCisJLmlycV9waW4JPSBBVDkxX1BJTl9QQTE5LAorCS52Y2NfcGluCT0gQVQ5MV9QSU5fUEQwLAorCS5yc3RfcGluCT0gQVQ5MV9QSU5fUEQyLAorfTsKKworc3RhdGljIHN0cnVjdCBhdDkxX21tY19kYXRhIF9faW5pdGRhdGEgY3NiMzM3X21tY19kYXRhID0geworCS5kZXRfcGluCT0gQVQ5MV9QSU5fUEQ1LAorCS5pc19iCQk9IDAsCisJLndpcmU0CQk9IDEsCisJLndwX3BpbgkJPSBBVDkxX1BJTl9QRDYsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgY3NiMzM3X2JvYXJkX2luaXQodm9pZCkKK3sKKwkvKiBFdGhlcm5ldCAqLworCWF0OTFfYWRkX2RldmljZV9ldGgoJmNzYjMzN19ldGhfZGF0YSk7CisJLyogVVNCIEhvc3QgKi8KKwlhdDkxX2FkZF9kZXZpY2VfdXNiaCgmY3NiMzM3X3VzYmhfZGF0YSk7CisJLyogVVNCIERldmljZSAqLworCWF0OTFfYWRkX2RldmljZV91ZGMoJmNzYjMzN191ZGNfZGF0YSk7CisJLyogQ29tcGFjdCBGbGFzaCAqLworCWF0OTFfc2V0X2dwaW9faW5wdXQoQVQ5MV9QSU5fUEIyMiwgMSk7CQkvKiBJT0lTMTYgKi8KKwlhdDkxX2FkZF9kZXZpY2VfY2YoJmNzYjMzN19jZl9kYXRhKTsKKwkvKiBNTUMgKi8KKwlhdDkxX2FkZF9kZXZpY2VfbW1jKCZjc2IzMzdfbW1jX2RhdGEpOworfQorCitNQUNISU5FX1NUQVJUKENTQjMzNywgIkNvZ2VudCBDU0IzMzciKQorCS8qIE1haW50YWluZXI6IEJpbGwgR2F0bGlmZiAqLworCS5waHlzX2lvCT0gQVQ5MV9CQVNFX1NZUywKKwkuaW9fcGdfb2Zmc3QJPSAoQVQ5MV9WQV9CQVNFX1NZUyA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gQVQ5MV9TRFJBTV9CQVNFICsgMHgxMDAsCisJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAorCS5tYXBfaW8JCT0gY3NiMzM3X21hcF9pbywKKwkuaW5pdF9pcnEJPSBjc2IzMzdfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZQk9IGNzYjMzN19ib2FyZF9pbml0LAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1jc2I2MzcuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1jc2I2MzcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTk1ZjlkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2JvYXJkLWNzYjYzNy5jCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2JvYXJkLWNzYjYzNy5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBTQU4gUGVvcGxlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3NlcmlhbF9hdDkxcm05MjAwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KKworI2luY2x1ZGUgImdlbmVyaWMuaCIKKworc3RhdGljIHZvaWQgX19pbml0IGNzYjYzN19pbml0X2lycSh2b2lkKQoreworCS8qIEluaXRpYWxpemUgQUlDIGNvbnRyb2xsZXIgKi8KKwlhdDkxcm05MjAwX2luaXRfaXJxKE5VTEwpOworCisJLyogU2V0IHVwIHRoZSBHUElPIGludGVycnVwdHMgKi8KKwlhdDkxX2dwaW9faXJxX3NldHVwKEJHQV9HUElPX0JBTktTKTsKK30KKworLyoKKyAqIFNlcmlhbCBwb3J0IGNvbmZpZ3VyYXRpb24uCisgKiAgICAwIC4uIDMgPSBVU0FSVDAgLi4gVVNBUlQzCisgKiAgICA0ICAgICAgPSBEQkdVCisgKi8KKyNkZWZpbmUgQ1NCNjM3X1VBUlRfTUFQCQl7IDQsIDEsIC0xLCAtMSwgLTEgfQkvKiB0dHlTMCwgLi4uLCB0dHlTNCAqLworI2RlZmluZSBDU0I2MzdfU0VSSUFMX0NPTlNPTEUJMAkJCS8qIHR0eVMwICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBjc2I2MzdfbWFwX2lvKHZvaWQpCit7CisJaW50IHNlcmlhbFtBVDkxX05SX1VBUlRdID0gQ1NCNjM3X1VBUlRfTUFQOworCWludCBpOworCisJYXQ5MXJtOTIwMF9tYXBfaW8oKTsKKworCS8qIEluaXRpYWxpemUgY2xvY2tzOiAzLjY4NjQgTUh6IGNyeXN0YWwgKi8KKwlhdDkxX2Nsb2NrX2luaXQoMzY4NjQwMCk7CisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0FUOTEKKwlhdDkxX2NvbnNvbGVfcG9ydCA9IENTQjYzN19TRVJJQUxfQ09OU09MRTsKKwltZW1jcHkoYXQ5MV9zZXJpYWxfbWFwLCBzZXJpYWwsIHNpemVvZihzZXJpYWwpKTsKKworCS8qIFJlZ2lzdGVyIFVBUlRzICovCisJZm9yIChpID0gMDsgaSA8IEFUOTFfTlJfVUFSVDsgaSsrKSB7CisJCWlmIChzZXJpYWxbaV0gPj0gMCkKKwkJCWF0OTFfcmVnaXN0ZXJfdWFydChpLCBzZXJpYWxbaV0pOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgX19pbml0ZGF0YSBjc2I2MzdfZXRoX2RhdGEgPSB7CisJLnBoeV9pcnFfcGluCT0gQVQ5MV9QSU5fUEMwLAorCS5pc19ybWlpCT0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXQ5MV91c2JoX2RhdGEgX19pbml0ZGF0YSBjc2I2MzdfdXNiaF9kYXRhID0geworCS5wb3J0cwkJPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCBhdDkxX3VkY19kYXRhIF9faW5pdGRhdGEgY3NiNjM3X3VkY19kYXRhID0geworCS52YnVzX3BpbiAgICAgPSBBVDkxX1BJTl9QQjI4LAorCS5wdWxsdXBfcGluICAgPSBBVDkxX1BJTl9QQjEsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgY3NiNjM3X2JvYXJkX2luaXQodm9pZCkKK3sKKwkvKiBFdGhlcm5ldCAqLworCWF0OTFfYWRkX2RldmljZV9ldGgoJmNzYjYzN19ldGhfZGF0YSk7CisJLyogVVNCIEhvc3QgKi8KKwlhdDkxX2FkZF9kZXZpY2VfdXNiaCgmY3NiNjM3X3VzYmhfZGF0YSk7CisJLyogVVNCIERldmljZSAqLworCWF0OTFfYWRkX2RldmljZV91ZGMoJmNzYjYzN191ZGNfZGF0YSk7Cit9CisKK01BQ0hJTkVfU1RBUlQoQ1NCNjM3LCAiQ29nZW50IENTQjYzNyIpCisJLyogTWFpbnRhaW5lcjogQmlsbCBHYXRsaWZmICovCisJLnBoeXNfaW8JPSBBVDkxX0JBU0VfU1lTLAorCS5pb19wZ19vZmZzdAk9IChBVDkxX1ZBX0JBU0VfU1lTID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSBBVDkxX1NEUkFNX0JBU0UgKyAweDEwMCwKKwkudGltZXIJCT0gJmF0OTFybTkyMDBfdGltZXIsCisJLm1hcF9pbwkJPSBjc2I2MzdfbWFwX2lvLAorCS5pbml0X2lycQk9IGNzYjYzN19pbml0X2lycSwKKwkuaW5pdF9tYWNoaW5lCT0gY3NiNjM3X2JvYXJkX2luaXQsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2JvYXJkLWRrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYm9hcmQtZGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTc4MzM2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2JvYXJkLWRrLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYm9hcmQtZGsuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgU0FOIFBlb3BsZQorICoKKyAqICBFcHNvbiBTMUQgZnJhbWVidWZmZXIgZ2x1ZSBjb2RlIGlzOgorICogICAgIENvcHlyaWdodCAoQykgMjAwNSBUaGliYXV0IFZBUkVORSA8dmFyZW5ldEBwYXJpc2MtbGludXgub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9zZXJpYWxfYXQ5MXJtOTIwMC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKK3N0YXRpYyB2b2lkIF9faW5pdCBka19pbml0X2lycSh2b2lkKQoreworCS8qIEluaXRpYWxpemUgQUlDIGNvbnRyb2xsZXIgKi8KKwlhdDkxcm05MjAwX2luaXRfaXJxKE5VTEwpOworCisJLyogU2V0IHVwIHRoZSBHUElPIGludGVycnVwdHMgKi8KKwlhdDkxX2dwaW9faXJxX3NldHVwKEJHQV9HUElPX0JBTktTKTsKK30KKworLyoKKyAqIFNlcmlhbCBwb3J0IGNvbmZpZ3VyYXRpb24uCisgKiAgICAwIC4uIDMgPSBVU0FSVDAgLi4gVVNBUlQzCisgKiAgICA0ICAgICAgPSBEQkdVCisgKi8KKyNkZWZpbmUgREtfVUFSVF9NQVAJCXsgNCwgMSwgLTEsIC0xLCAtMSB9CS8qIHR0eVMwLCAuLi4sIHR0eVM0ICovCisjZGVmaW5lIERLX1NFUklBTF9DT05TT0xFCTAJCQkvKiB0dHlTMCAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgZGtfbWFwX2lvKHZvaWQpCit7CisJaW50IHNlcmlhbFtBVDkxX05SX1VBUlRdID0gREtfVUFSVF9NQVA7CisJaW50IGk7CisKKwlhdDkxcm05MjAwX21hcF9pbygpOworCisJLyogSW5pdGlhbGl6ZSBjbG9ja3M6IDE4LjQzMiBNSHogY3J5c3RhbCAqLworCWF0OTFfY2xvY2tfaW5pdCgxODQzMjAwMCk7CisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0FUOTEKKwlhdDkxX2NvbnNvbGVfcG9ydCA9IERLX1NFUklBTF9DT05TT0xFOworCW1lbWNweShhdDkxX3NlcmlhbF9tYXAsIHNlcmlhbCwgc2l6ZW9mKHNlcmlhbCkpOworCisJLyogUmVnaXN0ZXIgVUFSVHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVQ5MV9OUl9VQVJUOyBpKyspIHsKKwkJaWYgKGF0OTFfc2VyaWFsX21hcFtpXSA+PSAwKQorCQkJYXQ5MV9yZWdpc3Rlcl91YXJ0KGksIGF0OTFfc2VyaWFsX21hcFtpXSk7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyBzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSBfX2luaXRkYXRhIGRrX2V0aF9kYXRhID0geworCS5waHlfaXJxX3Bpbgk9IEFUOTFfUElOX1BDNCwKKwkuaXNfcm1paQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IGF0OTFfdXNiaF9kYXRhIF9faW5pdGRhdGEgZGtfdXNiaF9kYXRhID0geworCS5wb3J0cwkJPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCBhdDkxX3VkY19kYXRhIF9faW5pdGRhdGEgZGtfdWRjX2RhdGEgPSB7CisJLnZidXNfcGluCT0gQVQ5MV9QSU5fUEQ0LAorCS5wdWxsdXBfcGluCT0gQVQ5MV9QSU5fUEQ1LAorfTsKKworc3RhdGljIHN0cnVjdCBhdDkxX2NmX2RhdGEgX19pbml0ZGF0YSBka19jZl9kYXRhID0geworCS5kZXRfcGluCT0gQVQ5MV9QSU5fUEIwLAorCS5yc3RfcGluCT0gQVQ5MV9QSU5fUEM1LAorCS8vIC5pcnFfcGluCT0gLi4uIG5vdCBjb25uZWN0ZWQKKwkvLyAudmNjX3Bpbgk9IC4uLiBhbHdheXMgcG93ZXJlZAorfTsKKworc3RhdGljIHN0cnVjdCBhdDkxX21tY19kYXRhIF9faW5pdGRhdGEgZGtfbW1jX2RhdGEgPSB7CisJLmlzX2IJCT0gMCwKKwkud2lyZTQJCT0gMSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBka19ib2FyZF9pbml0KHZvaWQpCit7CisJLyogRXRoZXJuZXQgKi8KKwlhdDkxX2FkZF9kZXZpY2VfZXRoKCZka19ldGhfZGF0YSk7CisJLyogVVNCIEhvc3QgKi8KKwlhdDkxX2FkZF9kZXZpY2VfdXNiaCgmZGtfdXNiaF9kYXRhKTsKKwkvKiBVU0IgRGV2aWNlICovCisJYXQ5MV9hZGRfZGV2aWNlX3VkYygmZGtfdWRjX2RhdGEpOworCS8qIENvbXBhY3QgRmxhc2ggKi8KKwlhdDkxX2FkZF9kZXZpY2VfY2YoJmRrX2NmX2RhdGEpOworCS8qIE1NQyAqLworCWF0OTFfc2V0X2dwaW9fb3V0cHV0KEFUOTFfUElOX1BCNywgMSk7CS8qIHRoaXMgTU1DIGNhcmQgc2xvdCBjYW4gb3B0aW9uYWxseSB1c2UgU1BJIHNpZ25hbGluZyAoQ1MzKS4gZGVmYXVsdDogTU1DICovCisJYXQ5MV9hZGRfZGV2aWNlX21tYygmZGtfbW1jX2RhdGEpOworCS8qIFZHQSAqLworLy8JZGtfYWRkX2RldmljZV92aWRlbygpOworfQorCitNQUNISU5FX1NUQVJUKEFUOTFSTTkyMDBESywgIkF0bWVsIEFUOTFSTTkyMDAtREsiKQorCS8qIE1haW50YWluZXI6IFNBTiBQZW9wbGUvQXRtZWwgKi8KKwkucGh5c19pbwk9IEFUOTFfQkFTRV9TWVMsCisJLmlvX3BnX29mZnN0CT0gKEFUOTFfVkFfQkFTRV9TWVMgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IEFUOTFfU0RSQU1fQkFTRSArIDB4MTAwLAorCS50aW1lcgkJPSAmYXQ5MXJtOTIwMF90aW1lciwKKwkubWFwX2lvCQk9IGRrX21hcF9pbywKKwkuaW5pdF9pcnEJPSBka19pbml0X2lycSwKKwkuaW5pdF9tYWNoaW5lCT0gZGtfYm9hcmRfaW5pdCwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYm9hcmQtZWsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1lay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMDc1MmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYm9hcmQtZWsuYwpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1lay5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBTQU4gUGVvcGxlCisgKgorICogIEVwc29uIFMxRCBmcmFtZWJ1ZmZlciBnbHVlIGNvZGUgaXM6CisgKiAgICAgQ29weXJpZ2h0IChDKSAyMDA1IFRoaWJhdXQgVkFSRU5FIDx2YXJlbmV0QHBhcmlzYy1saW51eC5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3NlcmlhbF9hdDkxcm05MjAwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KKworI2luY2x1ZGUgImdlbmVyaWMuaCIKKworc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfaXJxKHZvaWQpCit7CisJLyogSW5pdGlhbGl6ZSBBSUMgY29udHJvbGxlciAqLworCWF0OTFybTkyMDBfaW5pdF9pcnEoTlVMTCk7CisKKwkvKiBTZXQgdXAgdGhlIEdQSU8gaW50ZXJydXB0cyAqLworCWF0OTFfZ3Bpb19pcnFfc2V0dXAoQkdBX0dQSU9fQkFOS1MpOworfQorCisvKgorICogU2VyaWFsIHBvcnQgY29uZmlndXJhdGlvbi4KKyAqICAgIDAgLi4gMyA9IFVTQVJUMCAuLiBVU0FSVDMKKyAqICAgIDQgICAgICA9IERCR1UKKyAqLworI2RlZmluZSBFS19VQVJUX01BUAkJeyA0LCAxLCAtMSwgLTEsIC0xIH0JLyogdHR5UzAsIC4uLiwgdHR5UzQgKi8KKyNkZWZpbmUgRUtfU0VSSUFMX0NPTlNPTEUJMAkJCS8qIHR0eVMwICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBla19tYXBfaW8odm9pZCkKK3sKKwlpbnQgc2VyaWFsW0FUOTFfTlJfVUFSVF0gPSBFS19VQVJUX01BUDsKKwlpbnQgaTsKKworCWF0OTFybTkyMDBfbWFwX2lvKCk7CisKKwkvKiBJbml0aWFsaXplIGNsb2NrczogMTguNDMyIE1IeiBjcnlzdGFsICovCisJYXQ5MV9jbG9ja19pbml0KDE4NDMyMDAwKTsKKworI2lmZGVmIENPTkZJR19TRVJJQUxfQVQ5MQorCWF0OTFfY29uc29sZV9wb3J0ID0gRUtfU0VSSUFMX0NPTlNPTEU7CisJbWVtY3B5KGF0OTFfc2VyaWFsX21hcCwgc2VyaWFsLCBzaXplb2Yoc2VyaWFsKSk7CisKKwkvKiBSZWdpc3RlciBVQVJUcyAqLworCWZvciAoaSA9IDA7IGkgPCBBVDkxX05SX1VBUlQ7IGkrKykgeworCQlpZiAoc2VyaWFsW2ldID49IDApCisJCQlhdDkxX3JlZ2lzdGVyX3VhcnQoaSwgc2VyaWFsW2ldKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHN0cnVjdCBhdDkxX2V0aF9kYXRhIF9faW5pdGRhdGEgZWtfZXRoX2RhdGEgPSB7CisJLnBoeV9pcnFfcGluCT0gQVQ5MV9QSU5fUEM0LAorCS5pc19ybWlpCT0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXQ5MV91c2JoX2RhdGEgX19pbml0ZGF0YSBla191c2JoX2RhdGEgPSB7CisJLnBvcnRzCQk9IDIsCit9OworCitzdGF0aWMgc3RydWN0IGF0OTFfdWRjX2RhdGEgX19pbml0ZGF0YSBla191ZGNfZGF0YSA9IHsKKwkudmJ1c19waW4JPSBBVDkxX1BJTl9QRDQsCisJLnB1bGx1cF9waW4JPSBBVDkxX1BJTl9QRDUsCit9OworCitzdGF0aWMgc3RydWN0IGF0OTFfbW1jX2RhdGEgX19pbml0ZGF0YSBla19tbWNfZGF0YSA9IHsKKwkuZGV0X3Bpbgk9IEFUOTFfUElOX1BCMjcsCisJLmlzX2IJCT0gMCwKKwkud2lyZTQJCT0gMSwKKwkud3BfcGluCQk9IEFUOTFfUElOX1BBMTcsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZWtfYm9hcmRfaW5pdCh2b2lkKQoreworCS8qIEV0aGVybmV0ICovCisJYXQ5MV9hZGRfZGV2aWNlX2V0aCgmZWtfZXRoX2RhdGEpOworCS8qIFVTQiBIb3N0ICovCisJYXQ5MV9hZGRfZGV2aWNlX3VzYmgoJmVrX3VzYmhfZGF0YSk7CisJLyogVVNCIERldmljZSAqLworCWF0OTFfYWRkX2RldmljZV91ZGMoJmVrX3VkY19kYXRhKTsKKwkvKiBNTUMgKi8KKwlhdDkxX3NldF9ncGlvX291dHB1dChBVDkxX1BJTl9QQjIyLCAxKTsJLyogdGhpcyBNTUMgY2FyZCBzbG90IGNhbiBvcHRpb25hbGx5IHVzZSBTUEkgc2lnbmFsaW5nIChDUzMpLiBkZWZhdWx0OiBNTUMgKi8KKwlhdDkxX2FkZF9kZXZpY2VfbW1jKCZla19tbWNfZGF0YSk7CisJLyogVkdBICovCisvLwlla19hZGRfZGV2aWNlX3ZpZGVvKCk7Cit9CisKK01BQ0hJTkVfU1RBUlQoQVQ5MVJNOTIwMEVLLCAiQXRtZWwgQVQ5MVJNOTIwMC1FSyIpCisJLyogTWFpbnRhaW5lcjogU0FOIFBlb3BsZS9BdG1lbCAqLworCS5waHlzX2lvCT0gQVQ5MV9CQVNFX1NZUywKKwkuaW9fcGdfb2Zmc3QJPSAoQVQ5MV9WQV9CQVNFX1NZUyA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gQVQ5MV9TRFJBTV9CQVNFICsgMHgxMDAsCisJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAorCS5tYXBfaW8JCT0gZWtfbWFwX2lvLAorCS5pbml0X2lycQk9IGVrX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBla19ib2FyZF9pbml0LAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2Nsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4MTk1YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9jbG9jay5jCkBAIC0wLDAgKzEsNjIwIEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2Nsb2NrLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgRGF2aWQgQnJvd25lbGwKKyAqIENvcHlyaWdodCAoQykgMjAwNSBJdmFuIEtva3NoYXlza3kKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisKKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4JCS8qIGZvciBtYXN0ZXIgY2xvY2sgZ2xvYmFsICovCisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKKyN1bmRlZglERUJVRworCisvKgorICogVGhlcmUncyBhIGxvdCBtb3JlIHdoaWNoIGNhbiBiZSBkb25lIHdpdGggY2xvY2tzLCBpbmNsdWRpbmcgY3B1ZnJlcQorICogaW50ZWdyYXRpb24sIHNsb3cgY2xvY2sgbW9kZSBzdXBwb3J0IChmb3Igc3lzdGVtIHN1c3BlbmQpLCBsZXR0aW5nCisgKiBQTExCIGJlIHVzZWQgYXQgb3RoZXIgcmF0ZXMgKG9uIGJvYXJkcyB0aGF0IGRvbid0IG5lZWQgVVNCKSwgZXRjLgorICovCisKK3N0cnVjdCBjbGsgeworCWNvbnN0IGNoYXIJKm5hbWU7CisJdW5zaWduZWQgbG9uZwlyYXRlX2h6OworCXN0cnVjdCBjbGsJKnBhcmVudDsKKwl1MzIJCXBtY19tYXNrOworCXZvaWQJCSgqbW9kZSkoc3RydWN0IGNsayAqLCBpbnQpOworCXVuc2lnbmVkCWlkOjI7CQkvKiBQQ0swLi4zLCBvciAzMmsvbWFpbi9hL2IgKi8KKwl1bnNpZ25lZAlwcmltYXJ5OjE7CisJdW5zaWduZWQJcGxsOjE7CisJdW5zaWduZWQJcHJvZ3JhbW1hYmxlOjE7CisJdTE2CQl1c2VyczsKK307CisKK3N0YXRpYyBzcGlubG9ja190CWNsa19sb2NrOworc3RhdGljIHUzMgkJYXQ5MV9wbGxiX3VzYl9pbml0OworCisvKgorICogRm91ciBwcmltYXJ5IGNsb2NrIHNvdXJjZXM6ICB0d28gY3J5c3RhbCBvc2NpbGxhdG9ycyAoMzJLLCBtYWluKSwgYW5kCisgKiB0d28gUExMcy4gIFBMTEEgdXN1YWxseSBydW5zIHRoZSBtYXN0ZXIgY2xvY2s7IGFuZCBQTExCIG11c3QgcnVuIGF0CisgKiA0OCBNSHogKHVubGVzcyBubyBVU0IgZnVuY3Rpb24gY2xvY2tzIGFyZSBuZWVkZWQpLiAgVGhlIG1haW4gY2xvY2sgYW5kCisgKiBib3RoIFBMTHMgYXJlIHR1cm5lZCBvZmYgdG8gcnVuIGluICJzbG93IGNsb2NrIG1vZGUiIChzeXN0ZW0gc3VzcGVuZCkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsazMyayA9IHsKKwkubmFtZQkJPSAiY2xrMzJrIiwKKwkucmF0ZV9oegk9IEFUOTFfU0xPV19DTE9DSywKKwkudXNlcnMJCT0gMSwJCS8qIGFsd2F5cyBvbiAqLworCS5pZAkJPSAwLAorCS5wcmltYXJ5CT0gMSwKK307CitzdGF0aWMgc3RydWN0IGNsayBtYWluX2NsayA9IHsKKwkubmFtZQkJPSAibWFpbiIsCisJLnBtY19tYXNrCT0gMSA8PCAwLAkvKiBpbiBQTUNfU1IgKi8KKwkudXNlcnMJCT0gMSwKKwkuaWQJCT0gMSwKKwkucHJpbWFyeQk9IDEsCit9Oworc3RhdGljIHN0cnVjdCBjbGsgcGxsYSA9IHsKKwkubmFtZQkJPSAicGxsYSIsCisJLnBhcmVudAkJPSAmbWFpbl9jbGssCisJLnBtY19tYXNrCT0gMSA8PCAxLAkvKiBpbiBQTUNfU1IgKi8KKwkuaWQJCT0gMiwKKwkucHJpbWFyeQk9IDEsCisJLnBsbAkJPSAxLAorfTsKKworc3RhdGljIHZvaWQgcGxsYl9tb2RlKHN0cnVjdCBjbGsgKmNsaywgaW50IGlzX29uKQoreworCXUzMgl2YWx1ZTsKKworCWlmIChpc19vbikgeworCQlpc19vbiA9IEFUOTFfUE1DX0xPQ0tCOworCQl2YWx1ZSA9IGF0OTFfcGxsYl91c2JfaW5pdDsKKwl9IGVsc2UKKwkJdmFsdWUgPSAwOworCisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9DS0dSX1BMTEJSLCB2YWx1ZSk7CisKKwlkbyB7CisJCWNwdV9yZWxheCgpOworCX0gd2hpbGUgKChhdDkxX3N5c19yZWFkKEFUOTFfUE1DX1NSKSAmIEFUOTFfUE1DX0xPQ0tCKSAhPSBpc19vbik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBsbGIgPSB7CisJLm5hbWUJCT0gInBsbGIiLAorCS5wYXJlbnQJCT0gJm1haW5fY2xrLAorCS5wbWNfbWFzawk9IDEgPDwgMiwJLyogaW4gUE1DX1NSICovCisJLm1vZGUJCT0gcGxsYl9tb2RlLAorCS5pZAkJPSAzLAorCS5wcmltYXJ5CT0gMSwKKwkucGxsCQk9IDEsCit9OworCitzdGF0aWMgdm9pZCBwbWNfc3lzX21vZGUoc3RydWN0IGNsayAqY2xrLCBpbnQgaXNfb24pCit7CisJaWYgKGlzX29uKQorCQlhdDkxX3N5c193cml0ZShBVDkxX1BNQ19TQ0VSLCBjbGstPnBtY19tYXNrKTsKKwllbHNlCisJCWF0OTFfc3lzX3dyaXRlKEFUOTFfUE1DX1NDRFIsIGNsay0+cG1jX21hc2spOworfQorCisvKiBVU0IgZnVuY3Rpb24gY2xvY2tzIChQTExCIG11c3QgYmUgNDggTUh6KSAqLworc3RhdGljIHN0cnVjdCBjbGsgdWRwY2sgPSB7CisJLm5hbWUJCT0gInVkcGNrIiwKKwkucGFyZW50CQk9ICZwbGxiLAorCS5wbWNfbWFzawk9IEFUOTFfUE1DX1VEUCwKKwkubW9kZQkJPSBwbWNfc3lzX21vZGUsCit9Oworc3RhdGljIHN0cnVjdCBjbGsgdWhwY2sgPSB7CisJLm5hbWUJCT0gInVocGNrIiwKKwkucGFyZW50CQk9ICZwbGxiLAorCS5wbWNfbWFzawk9IEFUOTFfUE1DX1VIUCwKKwkubW9kZQkJPSBwbWNfc3lzX21vZGUsCit9OworCisjaWZkZWYgQ09ORklHX0FUOTFfUFJPR1JBTU1BQkxFX0NMT0NLUworLyoKKyAqIFRoZSBmb3VyIHByb2dyYW1tYWJsZSBjbG9ja3MgY2FuIGJlIHBhcmVudGVkIGJ5IGFueSBwcmltYXJ5IGNsb2NrLgorICogWW91IG11c3QgY29uZmlndXJlIHBpbiBtdWx0aXBsZXhpbmcgdG8gYnJpbmcgdGhlc2Ugc2lnbmFscyBvdXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIHBjazAgPSB7CisJLm5hbWUJCT0gInBjazAiLAorCS5wbWNfbWFzawk9IEFUOTFfUE1DX1BDSzAsCisJLm1vZGUJCT0gcG1jX3N5c19tb2RlLAorCS5wcm9ncmFtbWFibGUJPSAxLAorCS5pZAkJPSAwLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBjazEgPSB7CisJLm5hbWUJCT0gInBjazEiLAorCS5wbWNfbWFzawk9IEFUOTFfUE1DX1BDSzEsCisJLm1vZGUJCT0gcG1jX3N5c19tb2RlLAorCS5wcm9ncmFtbWFibGUJPSAxLAorCS5pZAkJPSAxLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBjazIgPSB7CisJLm5hbWUJCT0gInBjazIiLAorCS5wbWNfbWFzawk9IEFUOTFfUE1DX1BDSzIsCisJLm1vZGUJCT0gcG1jX3N5c19tb2RlLAorCS5wcm9ncmFtbWFibGUJPSAxLAorCS5pZAkJPSAyLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBjazMgPSB7CisJLm5hbWUJCT0gInBjazMiLAorCS5wbWNfbWFzawk9IEFUOTFfUE1DX1BDSzMsCisJLm1vZGUJCT0gcG1jX3N5c19tb2RlLAorCS5wcm9ncmFtbWFibGUJPSAxLAorCS5pZAkJPSAzLAorfTsKKyNlbmRpZgkvKiBDT05GSUdfQVQ5MV9QUk9HUkFNTUFCTEVfQ0xPQ0tTICovCisKKworLyoKKyAqIFRoZSBtYXN0ZXIgY2xvY2sgaXMgZGl2aWRlZCBmcm9tIHRoZSBDUFUgY2xvY2sgKGJ5IDEtNCkuICBJdCdzIHVzZWQgZm9yCisgKiBtZW1vcnksIGludGVyZmFjZXMgdG8gb24tY2hpcCBwZXJpcGhlcmFscywgdGhlIEFJQywgYW5kIHNvbWV0aW1lcyBtb3JlCisgKiAoZS5nIGJhdWQgcmF0ZSBnZW5lcmF0aW9uKS4gIEl0J3Mgc291cmNlZCBmcm9tIG9uZSBvZiB0aGUgcHJpbWFyeSBjbG9ja3MuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIG1jayA9IHsKKwkubmFtZQkJPSAibWNrIiwKKwkucG1jX21hc2sJPSAxIDw8IDMsCS8qIGluIFBNQ19TUiAqLworCS51c2VycwkJPSAxLAkJLyogKG11c3QgYmUpIGFsd2F5cyBvbiAqLworfTsKKworc3RhdGljIHZvaWQgcG1jX3BlcmlwaF9tb2RlKHN0cnVjdCBjbGsgKmNsaywgaW50IGlzX29uKQoreworCWlmIChpc19vbikKKwkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QTUNfUENFUiwgY2xrLT5wbWNfbWFzayk7CisJZWxzZQorCQlhdDkxX3N5c193cml0ZShBVDkxX1BNQ19QQ0RSLCBjbGstPnBtY19tYXNrKTsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgdWRjX2NsayA9IHsKKwkubmFtZQkJPSAidWRjX2NsayIsCisJLnBhcmVudAkJPSAmbWNrLAorCS5wbWNfbWFzawk9IDEgPDwgQVQ5MV9JRF9VRFAsCisJLm1vZGUJCT0gcG1jX3BlcmlwaF9tb2RlLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIG9oY2lfY2xrID0geworCS5uYW1lCQk9ICJvaGNpX2NsayIsCisJLnBhcmVudAkJPSAmbWNrLAorCS5wbWNfbWFzawk9IDEgPDwgQVQ5MV9JRF9VSFAsCisJLm1vZGUJCT0gcG1jX3BlcmlwaF9tb2RlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgKmNvbnN0IGNsb2NrX2xpc3RbXSA9IHsKKwkvKiBmb3VyIHByaW1hcnkgY2xvY2tzIC0tIE1VU1QgQkUgRklSU1QhICovCisJJmNsazMyaywKKwkmbWFpbl9jbGssCisJJnBsbGEsCisJJnBsbGIsCisKKwkvKiBQTExCIGNoaWxkcmVuIChVU0IpICovCisJJnVkcGNrLAorCSZ1aHBjaywKKworI2lmZGVmIENPTkZJR19BVDkxX1BST0dSQU1NQUJMRV9DTE9DS1MKKwkvKiBwcm9ncmFtbWFibGUgY2xvY2tzICovCisJJnBjazAsCisJJnBjazEsCisJJnBjazIsCisJJnBjazMsCisjZW5kaWYJLyogQ09ORklHX0FUOTFfUFJPR1JBTU1BQkxFX0NMT0NLUyAqLworCisJLyogTUNLIGFuZCBwZXJpcGhlcmFscyAqLworCSZtY2ssCisJLy8gdXNhcnQwLi51c2FydDMKKwkvLyBtbWMKKwkmdWRjX2NsaywKKwkvLyBpMmMKKwkvLyBzcGkKKwkvLyBzc2MwLi5zc2MyCisJLy8gdGMwLi50YzUKKwkmb2hjaV9jbGssCisJLy8gZXRoZXIKK307CisKKworLyogY2xvY2tzIGFyZSBhbGwgc3RhdGljIGZvciBub3c7IG5vIHJlZmNvdW50aW5nIG5lY2Vzc2FyeSAqLworc3RydWN0IGNsayAqY2xrX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmlkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2xvY2tfbGlzdCk7IGkrKykgeworCQlpZiAoc3RyY21wKGlkLCBjbG9ja19saXN0W2ldLT5uYW1lKSA9PSAwKQorCQkJcmV0dXJuIGNsb2NrX2xpc3RbaV07CisJfQorCisJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7Cit9CitFWFBPUlRfU1lNQk9MKGNsa19nZXQpOworCit2b2lkIGNsa19wdXQoc3RydWN0IGNsayAqY2xrKQoreworfQorRVhQT1JUX1NZTUJPTChjbGtfcHV0KTsKKworc3RhdGljIHZvaWQgX19jbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpZiAoY2xrLT5wYXJlbnQpCisJCV9fY2xrX2VuYWJsZShjbGstPnBhcmVudCk7CisJaWYgKGNsay0+dXNlcnMrKyA9PSAwICYmIGNsay0+bW9kZSkKKwkJY2xrLT5tb2RlKGNsaywgMSk7Cit9CisKK2ludCBjbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNsa19sb2NrLCBmbGFncyk7CisJX19jbGtfZW5hYmxlKGNsayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xrX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woY2xrX2VuYWJsZSk7CisKK3N0YXRpYyB2b2lkIF9fY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQoreworCUJVR19PTihjbGstPnVzZXJzID09IDApOworCWlmICgtLWNsay0+dXNlcnMgPT0gMCAmJiBjbGstPm1vZGUpCisJCWNsay0+bW9kZShjbGssIDApOworCWlmIChjbGstPnBhcmVudCkKKwkJX19jbGtfZGlzYWJsZShjbGstPnBhcmVudCk7Cit9CisKK3ZvaWQgY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQoreworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2xrX2xvY2ssIGZsYWdzKTsKKwlfX2Nsa19kaXNhYmxlKGNsayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xrX2xvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woY2xrX2Rpc2FibGUpOworCit1bnNpZ25lZCBsb25nIGNsa19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwl1bnNpZ25lZCBsb25nCXJhdGU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2xrX2xvY2ssIGZsYWdzKTsKKwlmb3IgKDs7KSB7CisJCXJhdGUgPSBjbGstPnJhdGVfaHo7CisJCWlmIChyYXRlIHx8ICFjbGstPnBhcmVudCkKKwkJCWJyZWFrOworCQljbGsgPSBjbGstPnBhcmVudDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xrX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmF0ZTsKK30KK0VYUE9SVF9TWU1CT0woY2xrX2dldF9yYXRlKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgQ09ORklHX0FUOTFfUFJPR1JBTU1BQkxFX0NMT0NLUworCisvKgorICogRm9yIG5vdywgb25seSB0aGUgcHJvZ3JhbW1hYmxlIGNsb2NrcyBzdXBwb3J0IHJlcGFyZW50aW5nIChNQ0sgY291bGQKKyAqIGRvIHRoaXMgdG9vLCB3aXRoIGNhcmUpIG9yIHJhdGUgY2hhbmdpbmcgKHRoZSBQTExzIGNvdWxkIGRvIHRoaXMgdG9vLAorICogZGl0dG8gTUNLIGJ1dCB0aGF0J3MgbW9yZSBmb3IgY3B1ZnJlcSkuICBEcml2ZXJzIG1heSByZXBhcmVudCB0byBnZXQKKyAqIGEgYmV0dGVyIHJhdGUgbWF0Y2g7IHdlIGRvbid0LgorICovCisKK2xvbmcgY2xrX3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwl1bnNpZ25lZAlwcmVzY2FsZTsKKwl1bnNpZ25lZCBsb25nCWFjdHVhbDsKKworCWlmICghY2xrLT5wcm9ncmFtbWFibGUpCisJCXJldHVybiAtRUlOVkFMOworCXNwaW5fbG9ja19pcnFzYXZlKCZjbGtfbG9jaywgZmxhZ3MpOworCisJYWN0dWFsID0gY2xrLT5wYXJlbnQtPnJhdGVfaHo7CisJZm9yIChwcmVzY2FsZSA9IDA7IHByZXNjYWxlIDwgNzsgcHJlc2NhbGUrKykgeworCQlpZiAoYWN0dWFsICYmIGFjdHVhbCA8PSByYXRlKQorCQkJYnJlYWs7CisJCWFjdHVhbCA+Pj0gMTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbGtfbG9jaywgZmxhZ3MpOworCXJldHVybiAocHJlc2NhbGUgPCA3KSA/IGFjdHVhbCA6IC1FTk9FTlQ7Cit9CitFWFBPUlRfU1lNQk9MKGNsa19yb3VuZF9yYXRlKTsKKworaW50IGNsa19zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXVuc2lnbmVkCXByZXNjYWxlOworCXVuc2lnbmVkIGxvbmcJYWN0dWFsOworCisJaWYgKCFjbGstPnByb2dyYW1tYWJsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNsay0+dXNlcnMpCisJCXJldHVybiAtRUJVU1k7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNsa19sb2NrLCBmbGFncyk7CisKKwlhY3R1YWwgPSBjbGstPnBhcmVudC0+cmF0ZV9oejsKKwlmb3IgKHByZXNjYWxlID0gMDsgcHJlc2NhbGUgPCA3OyBwcmVzY2FsZSsrKSB7CisJCWlmIChhY3R1YWwgJiYgYWN0dWFsIDw9IHJhdGUpIHsKKwkJCXUzMglwY2tyOworCisJCQlwY2tyID0gYXQ5MV9zeXNfcmVhZChBVDkxX1BNQ19QQ0tSKGNsay0+aWQpKTsKKwkJCXBja3IgJj0gMHgwMzsKKwkJCXBja3IgfD0gcHJlc2NhbGUgPDwgMjsKKwkJCWF0OTFfc3lzX3dyaXRlKEFUOTFfUE1DX1BDS1IoY2xrLT5pZCksIHBja3IpOworCQkJY2xrLT5yYXRlX2h6ID0gYWN0dWFsOworCQkJYnJlYWs7CisJCX0KKwkJYWN0dWFsID4+PSAxOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsa19sb2NrLCBmbGFncyk7CisJcmV0dXJuIChwcmVzY2FsZSA8IDcpID8gYWN0dWFsIDogLUVOT0VOVDsKK30KK0VYUE9SVF9TWU1CT0woY2xrX3NldF9yYXRlKTsKKworc3RydWN0IGNsayAqY2xrX2dldF9wYXJlbnQoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBjbGstPnBhcmVudDsKK30KK0VYUE9SVF9TWU1CT0woY2xrX2dldF9wYXJlbnQpOworCitpbnQgY2xrX3NldF9wYXJlbnQoc3RydWN0IGNsayAqY2xrLCBzdHJ1Y3QgY2xrICpwYXJlbnQpCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWlmIChjbGstPnVzZXJzKQorCQlyZXR1cm4gLUVCVVNZOworCWlmICghcGFyZW50LT5wcmltYXJ5IHx8ICFjbGstPnByb2dyYW1tYWJsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNsa19sb2NrLCBmbGFncyk7CisKKwljbGstPnJhdGVfaHogPSBwYXJlbnQtPnJhdGVfaHo7CisJY2xrLT5wYXJlbnQgPSBwYXJlbnQ7CisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QTUNfUENLUihjbGstPmlkKSwgcGFyZW50LT5pZCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbGtfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChjbGtfc2V0X3BhcmVudCk7CisKKyNlbmRpZgkvKiBDT05GSUdfQVQ5MV9QUk9HUkFNTUFCTEVfQ0xPQ0tTICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCitzdGF0aWMgaW50IGF0OTFfY2xrX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp1bnVzZWQpCit7CisJdTMyCQlzY3NyLCBwY3NyLCBzcjsKKwl1bnNpZ25lZAlpOworCisJc2VxX3ByaW50ZihzLCAiU0NTUiA9ICU4eFxuIiwgc2NzciA9IGF0OTFfc3lzX3JlYWQoQVQ5MV9QTUNfU0NTUikpOworCXNlcV9wcmludGYocywgIlBDU1IgPSAlOHhcbiIsIHBjc3IgPSBhdDkxX3N5c19yZWFkKEFUOTFfUE1DX1BDU1IpKTsKKworCXNlcV9wcmludGYocywgIk1PUiAgPSAlOHhcbiIsIGF0OTFfc3lzX3JlYWQoQVQ5MV9DS0dSX01PUikpOworCXNlcV9wcmludGYocywgIk1DRlIgPSAlOHhcbiIsIGF0OTFfc3lzX3JlYWQoQVQ5MV9DS0dSX01DRlIpKTsKKwlzZXFfcHJpbnRmKHMsICJQTExBID0gJTh4XG4iLCBhdDkxX3N5c19yZWFkKEFUOTFfQ0tHUl9QTExBUikpOworCXNlcV9wcmludGYocywgIlBMTEIgPSAlOHhcbiIsIGF0OTFfc3lzX3JlYWQoQVQ5MV9DS0dSX1BMTEJSKSk7CisKKwlzZXFfcHJpbnRmKHMsICJNQ0tSID0gJTh4XG4iLCBhdDkxX3N5c19yZWFkKEFUOTFfUE1DX01DS1IpKTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQlzZXFfcHJpbnRmKHMsICJQQ0slZCA9ICU4eFxuIiwgaSwgYXQ5MV9zeXNfcmVhZChBVDkxX1BNQ19QQ0tSKGkpKSk7CisJc2VxX3ByaW50ZihzLCAiU1IgICA9ICU4eFxuIiwgc3IgPSBhdDkxX3N5c19yZWFkKEFUOTFfUE1DX1NSKSk7CisKKwlzZXFfcHJpbnRmKHMsICJcbiIpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2xvY2tfbGlzdCk7IGkrKykgeworCQljaGFyCQkqc3RhdGU7CisJCXN0cnVjdCBjbGsJKmNsayA9IGNsb2NrX2xpc3RbaV07CisKKwkJaWYgKGNsay0+bW9kZSA9PSBwbWNfc3lzX21vZGUpCisJCQlzdGF0ZSA9IChzY3NyICYgY2xrLT5wbWNfbWFzaykgPyAib24iIDogIm9mZiI7CisJCWVsc2UgaWYgKGNsay0+bW9kZSA9PSBwbWNfcGVyaXBoX21vZGUpCisJCQlzdGF0ZSA9IChwY3NyICYgY2xrLT5wbWNfbWFzaykgPyAib24iIDogIm9mZiI7CisJCWVsc2UgaWYgKGNsay0+cG1jX21hc2spCisJCQlzdGF0ZSA9IChzciAmIGNsay0+cG1jX21hc2spID8gIm9uIiA6ICJvZmYiOworCQllbHNlIGlmIChjbGsgPT0gJmNsazMyayB8fCBjbGsgPT0gJm1haW5fY2xrKQorCQkJc3RhdGUgPSAib24iOworCQllbHNlCisJCQlzdGF0ZSA9ICIiOworCisJCXNlcV9wcmludGYocywgIiUtMTBzIHVzZXJzPSVkICUtM3MgJTlsZCBIeiAlc1xuIiwKKwkJCWNsay0+bmFtZSwgY2xrLT51c2Vycywgc3RhdGUsIGNsa19nZXRfcmF0ZShjbGspLAorCQkJY2xrLT5wYXJlbnQgPyBjbGstPnBhcmVudC0+bmFtZSA6ICIiKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQ5MV9jbGtfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYXQ5MV9jbGtfc2hvdywgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF0OTFfY2xrX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gYXQ5MV9jbGtfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXQ5MV9jbGtfZGVidWdmc19pbml0KHZvaWQpCit7CisJLyogL3N5cy9rZXJuZWwvZGVidWcvYXQ5MV9jbGsgKi8KKwkodm9pZCkgZGVidWdmc19jcmVhdGVfZmlsZSgiYXQ5MV9jbGsiLCBTX0lGUkVHIHwgU19JUlVHTywgTlVMTCwgTlVMTCwgJmF0OTFfY2xrX29wZXJhdGlvbnMpOworCisJcmV0dXJuIDA7Cit9Citwb3N0Y29yZV9pbml0Y2FsbChhdDkxX2Nsa19kZWJ1Z2ZzX2luaXQpOworCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIF9faW5pdCBhdDkxX3BsbF9yYXRlKHN0cnVjdCBjbGsgKnBsbCwgdTMyIGZyZXEsIHUzMiByZWcpCit7CisJdW5zaWduZWQgbXVsLCBkaXY7CisKKwlkaXYgPSByZWcgJiAweGZmOworCW11bCA9IChyZWcgPj4gMTYpICYgMHg3ZmY7CisJaWYgKGRpdiAmJiBtdWwpIHsKKwkJZnJlcSAvPSBkaXY7CisJCWZyZXEgKj0gbXVsICsgMTsKKwl9IGVsc2UKKwkJZnJlcSA9IDA7CisJaWYgKHBsbCA9PSAmcGxsYiAmJiAocmVnICYgKDEgPDwgMjgpKSkKKwkJZnJlcSAvPSAyOworCXJldHVybiBmcmVxOworfQorCitzdGF0aWMgdW5zaWduZWQgX19pbml0IGF0OTFfcGxsX2NhbGModW5zaWduZWQgbWFpbl9mcmVxLCB1bnNpZ25lZCBvdXRfZnJlcSkKK3sKKwl1bnNpZ25lZCBpLCBkaXYgPSAwLCBtdWwgPSAwLCBkaWZmID0gMSA8PCAzMDsKKwl1bnNpZ25lZCByZXQgPSAob3V0X2ZyZXEgPiAxNTUwMDAwMDApID8gMHhiZTAwIDogMHgzZTAwOworCisJLyogUExMIG91dHB1dCBtYXggMjQwIE1IeiAob3IgMTgwIE1IeiBwZXIgZXJyYXRhKSAqLworCWlmIChvdXRfZnJlcSA+IDI0MDAwMDAwMCkKKwkJZ290byBmYWlsOworCisJZm9yIChpID0gMTsgaSA8IDI1NjsgaSsrKSB7CisJCWludCBkaWZmMTsKKwkJdW5zaWduZWQgaW5wdXQsIG11bDE7CisKKwkJLyoKKwkJICogUExMIGlucHV0IGJldHdlZW4gMU1IeiBhbmQgMzJNSHogcGVyIHNwZWMsIGJ1dCBsb3dlcgorCQkgKiBmcmVxdWVuY2VzIHNlZW0gbmVjZXNzYXJ5IGluIHNvbWUgY2FzZXMgc28gYWxsb3cgMTAwSy4KKwkJICovCisJCWlucHV0ID0gbWFpbl9mcmVxIC8gaTsKKwkJaWYgKGlucHV0IDwgMTAwMDAwKQorCQkJY29udGludWU7CisJCWlmIChpbnB1dCA+IDMyMDAwMDAwKQorCQkJY29udGludWU7CisKKwkJbXVsMSA9IG91dF9mcmVxIC8gaW5wdXQ7CisJCWlmIChtdWwxID4gMjA0OCkKKwkJCWNvbnRpbnVlOworCQlpZiAobXVsMSA8IDIpCisJCQlnb3RvIGZhaWw7CisKKwkJZGlmZjEgPSBvdXRfZnJlcSAtIGlucHV0ICogbXVsMTsKKwkJaWYgKGRpZmYxIDwgMCkKKwkJCWRpZmYxID0gLWRpZmYxOworCQlpZiAoZGlmZiA+IGRpZmYxKSB7CisJCQlkaWZmID0gZGlmZjE7CisJCQlkaXYgPSBpOworCQkJbXVsID0gbXVsMTsKKwkJCWlmIChkaWZmID09IDApCisJCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGkgPT0gMjU2ICYmIGRpZmYgPiAob3V0X2ZyZXEgPj4gNSkpCisJCWdvdG8gZmFpbDsKKwlyZXR1cm4gcmV0IHwgKChtdWwgLSAxKSA8PCAxNikgfCBkaXY7CitmYWlsOgorCXJldHVybiAwOworfQorCitpbnQgX19pbml0IGF0OTFfY2xvY2tfaW5pdCh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spCit7CisJdW5zaWduZWQgdG1wLCBmcmVxLCBtY2tyOworCisJc3Bpbl9sb2NrX2luaXQoJmNsa19sb2NrKTsKKworCS8qCisJICogV2hlbiB0aGUgYm9vdGxvYWRlciBpbml0aWFsaXplZCB0aGUgbWFpbiBvc2NpbGxhdG9yIGNvcnJlY3RseSwKKwkgKiB0aGVyZSdzIG5vIHByb2JsZW0gdXNpbmcgdGhlIGN5Y2xlIGNvdW50ZXIuICBCdXQgaWYgaXQgZGlkbid0LAorCSAqIG9yIHdoZW4gdXNpbmcgb3NjaWxsYXRvciBieXBhc3MgbW9kZSwgd2UgbXVzdCBiZSB0b2xkIHRoZSBzcGVlZAorCSAqIG9mIHRoZSBtYWluIGNsb2NrLgorCSAqLworCWlmICghbWFpbl9jbG9jaykgeworCQlkbyB7CisJCQl0bXAgPSBhdDkxX3N5c19yZWFkKEFUOTFfQ0tHUl9NQ0ZSKTsKKwkJfSB3aGlsZSAoISh0bXAgJiAweDEwMDAwKSk7CisJCW1haW5fY2xvY2sgPSAodG1wICYgMHhmZmZmKSAqIChBVDkxX1NMT1dfQ0xPQ0sgLyAxNik7CisJfQorCW1haW5fY2xrLnJhdGVfaHogPSBtYWluX2Nsb2NrOworCisJLyogcmVwb3J0IGlmIFBMTEEgaXMgbW9yZSB0aGFuIG1pbGRseSBvdmVyY2xvY2tlZCAqLworCXBsbGEucmF0ZV9oeiA9IGF0OTFfcGxsX3JhdGUoJnBsbGEsIG1haW5fY2xvY2ssIGF0OTFfc3lzX3JlYWQoQVQ5MV9DS0dSX1BMTEFSKSk7CisJaWYgKHBsbGEucmF0ZV9oeiA+IDIwOTAwMDAwMCkKKwkJcHJfaW5mbygiQ2xvY2tzOiBQTExBIG92ZXJjbG9ja2VkLCAlbGQgTUh6XG4iLCBwbGxhLnJhdGVfaHogLyAxMDAwMDAwKTsKKworCS8qCisJICogVVNCIGNsb2NrIGluaXQ6ICBjaG9vc2UgNDggTUh6IFBMTEIgdmFsdWUsIHR1cm4gYWxsIGNsb2NrcyBvZmYsCisJICogZGlzYWJsZSA0OE1IeiBjbG9jayBkdXJpbmcgdXNiIHBlcmlwaGVyYWwgc3VzcGVuZC4KKwkgKgorCSAqIFJFVklTSVQ6ICBhc3N1bWVzIE1DSyBkb2Vzbid0IGRlcml2ZSBmcm9tIFBMTEIhCisJICovCisJYXQ5MV9wbGxiX3VzYl9pbml0ID0gYXQ5MV9wbGxfY2FsYyhtYWluX2Nsb2NrLCA0ODAwMDAwMCAqIDIpIHwgMHgxMDAwMDAwMDsKKwlwbGxiLnJhdGVfaHogPSBhdDkxX3BsbF9yYXRlKCZwbGxiLCBtYWluX2Nsb2NrLCBhdDkxX3BsbGJfdXNiX2luaXQpOworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUE1DX1BDRFIsICgxIDw8IEFUOTFfSURfVUhQKSB8ICgxIDw8IEFUOTFfSURfVURQKSk7CisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QTUNfU0NEUiwgQVQ5MV9QTUNfVUhQIHwgQVQ5MV9QTUNfVURQKTsKKwlhdDkxX3N5c193cml0ZShBVDkxX0NLR1JfUExMQlIsIDApOworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUE1DX1NDRVIsIEFUOTFfUE1DX01DS1VEUCk7CisKKwkvKgorCSAqIE1DSyBhbmQgQ1BVIGRlcml2ZSBmcm9tIG9uZSBvZiB0aG9zZSBwcmltYXJ5IGNsb2Nrcy4KKwkgKiBGb3Igbm93LCBhc3N1bWUgdGhpcyBwYXJlbnRhZ2Ugd29uJ3QgY2hhbmdlLgorCSAqLworCW1ja3IgPSBhdDkxX3N5c19yZWFkKEFUOTFfUE1DX01DS1IpOworCW1jay5wYXJlbnQgPSBjbG9ja19saXN0W21ja3IgJiBBVDkxX1BNQ19DU1NdOworCW1jay5wYXJlbnQtPnVzZXJzKys7CisJZnJlcSA9IG1jay5wYXJlbnQtPnJhdGVfaHo7CisJZnJlcSAvPSAoMSA8PCAoKG1ja3IgPj4gMikgJiAzKSk7CQkvKiBwcmVzY2FsZSAqLworCW1jay5yYXRlX2h6ID0gZnJlcSAvICgxICsgKChtY2tyID4+IDgpICYgMykpOwkvKiBtZGl2ICovCisKKwlwcmludGsoIkNsb2NrczogQ1BVICV1IE1IeiwgbWFzdGVyICV1IE1IeiwgbWFpbiAldS4lMDN1IE1IelxuIiwKKwkJZnJlcSAvIDEwMDAwMDAsICh1bnNpZ25lZCkgbWNrLnJhdGVfaHogLyAxMDAwMDAwLAorCQkodW5zaWduZWQpIG1haW5fY2xvY2sgLyAxMDAwMDAwLAorCQkoKHVuc2lnbmVkKSBtYWluX2Nsb2NrICUgMTAwMDAwMCkgLyAxMDAwKTsKKworCS8qIEZJWE1FIGdldCByaWQgb2YgbWFzdGVyX2Nsb2NrIGdsb2JhbCAqLworCWF0OTFfbWFzdGVyX2Nsb2NrID0gbWNrLnJhdGVfaHo7CisKKyNpZmRlZiBDT05GSUdfQVQ5MV9QUk9HUkFNTUFCTEVfQ0xPQ0tTCisJLyogZXN0YWJsaXNoIFBDSzAuLlBDSzMgcGFyZW50YWdlICovCisJZm9yICh0bXAgPSAwOyB0bXAgPCBBUlJBWV9TSVpFKGNsb2NrX2xpc3QpOyB0bXArKykgeworCQlzdHJ1Y3QgY2xrCSpjbGsgPSBjbG9ja19saXN0W3RtcF0sICpwYXJlbnQ7CisJCXUzMgkJcGNrcjsKKworCQlpZiAoIWNsay0+cHJvZ3JhbW1hYmxlKQorCQkJY29udGludWU7CisKKwkJcGNrciA9IGF0OTFfc3lzX3JlYWQoQVQ5MV9QTUNfUENLUihjbGstPmlkKSk7CisJCXBhcmVudCA9IGNsb2NrX2xpc3RbcGNrciAmIDNdOworCQljbGstPnBhcmVudCA9IHBhcmVudDsKKwkJY2xrLT5yYXRlX2h6ID0gcGFyZW50LT5yYXRlX2h6IC8gKDEgPDwgKChwY2tyID4+IDIpICYgMykpOworCX0KKyNlbHNlCisJLyogZGlzYWJsZSB1bnVzZWQgY2xvY2tzICovCisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QTUNfU0NEUiwgQVQ5MV9QTUNfUENLMCB8IEFUOTFfUE1DX1BDSzEgfCBBVDkxX1BNQ19QQ0syIHwgQVQ5MV9QTUNfUENLMyk7CisjZW5kaWYJLyogQ09ORklHX0FUOTFfUFJPR1JBTU1BQkxFX0NMT0NLUyAqLworCisJLyogRklYTUUgc2V2ZXJhbCB1bnVzZWQgY2xvY2tzIG1heSBzdGlsbCBiZSBhY3RpdmUuLi4gIHByb3ZpZGUKKwkgKiBhIENPTkZJRyBvcHRpb24gdG8gdHVybiBvZmYgYWxsIHVudXNlZCBjbG9ja3MgYXQgc29tZSBwb2ludAorCSAqIGJlZm9yZSBkcml2ZXIgaW5pdCBzdGFydHMuCisJICovCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODQ4ZmQyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2NvbW1vbi5jCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2NvbW1vbi5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBTQU4gUGVvcGxlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBhdDkxcm05MjAwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCXsKKwkJLnZpcnR1YWwJPSBBVDkxX1ZBX0JBU0VfU1lTLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MV9CQVNFX1NZUyksCisJCS5sZW5ndGgJCT0gU1pfNEssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LCB7CisJCS52aXJ0dWFsCT0gQVQ5MV9WQV9CQVNFX1NQSSwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFfQkFTRV9TUEkpLAorCQkubGVuZ3RoCQk9IFNaXzE2SywKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX0sIHsKKwkJLnZpcnR1YWwJPSBBVDkxX1ZBX0JBU0VfU1NDMiwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFfQkFTRV9TU0MyKSwKKwkJLmxlbmd0aAkJPSBTWl8xNkssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LCB7CisJCS52aXJ0dWFsCT0gQVQ5MV9WQV9CQVNFX1NTQzEsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxX0JBU0VfU1NDMSksCisJCS5sZW5ndGgJCT0gU1pfMTZLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwgeworCQkudmlydHVhbAk9IEFUOTFfVkFfQkFTRV9TU0MwLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MV9CQVNFX1NTQzApLAorCQkubGVuZ3RoCQk9IFNaXzE2SywKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX0sIHsKKwkJLnZpcnR1YWwJPSBBVDkxX1ZBX0JBU0VfVVMzLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MV9CQVNFX1VTMyksCisJCS5sZW5ndGgJCT0gU1pfMTZLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwgeworCQkudmlydHVhbAk9IEFUOTFfVkFfQkFTRV9VUzIsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxX0JBU0VfVVMyKSwKKwkJLmxlbmd0aAkJPSBTWl8xNkssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LCB7CisJCS52aXJ0dWFsCT0gQVQ5MV9WQV9CQVNFX1VTMSwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFfQkFTRV9VUzEpLAorCQkubGVuZ3RoCQk9IFNaXzE2SywKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX0sIHsKKwkJLnZpcnR1YWwJPSBBVDkxX1ZBX0JBU0VfVVMwLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MV9CQVNFX1VTMCksCisJCS5sZW5ndGgJCT0gU1pfMTZLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwgeworCQkudmlydHVhbAk9IEFUOTFfVkFfQkFTRV9FTUFDLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MV9CQVNFX0VNQUMpLAorCQkubGVuZ3RoCQk9IFNaXzE2SywKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX0sIHsKKwkJLnZpcnR1YWwJPSBBVDkxX1ZBX0JBU0VfVFdJLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MV9CQVNFX1RXSSksCisJCS5sZW5ndGgJCT0gU1pfMTZLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwgeworCQkudmlydHVhbAk9IEFUOTFfVkFfQkFTRV9NQ0ksCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxX0JBU0VfTUNJKSwKKwkJLmxlbmd0aAkJPSBTWl8xNkssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LCB7CisJCS52aXJ0dWFsCT0gQVQ5MV9WQV9CQVNFX1VEUCwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFfQkFTRV9VRFApLAorCQkubGVuZ3RoCQk9IFNaXzE2SywKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX0sIHsKKwkJLnZpcnR1YWwJPSBBVDkxX1ZBX0JBU0VfVENCMSwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFfQkFTRV9UQ0IxKSwKKwkJLmxlbmd0aAkJPSBTWl8xNkssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LCB7CisJCS52aXJ0dWFsCT0gQVQ5MV9WQV9CQVNFX1RDQjAsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxX0JBU0VfVENCMCksCisJCS5sZW5ndGgJCT0gU1pfMTZLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwKK307CisKK3ZvaWQgX19pbml0IGF0OTFybTkyMDBfbWFwX2lvKHZvaWQpCit7CisJaW90YWJsZV9pbml0KGF0OTFybTkyMDBfaW9fZGVzYywgQVJSQVlfU0laRShhdDkxcm05MjAwX2lvX2Rlc2MpKTsKK30KKworCit1bnNpZ25lZCBsb25nIGF0OTFfbWFzdGVyX2Nsb2NrOworCitFWFBPUlRfU1lNQk9MKGF0OTFfbWFzdGVyX2Nsb2NrKTsKKworCitpbnQgYXQ5MV9zZXJpYWxfbWFwW0FUOTFfTlJfVUFSVF07CitpbnQgYXQ5MV9jb25zb2xlX3BvcnQ7CisKK0VYUE9SVF9TWU1CT0woYXQ5MV9zZXJpYWxfbWFwKTsKK0VYUE9SVF9TWU1CT0woYXQ5MV9jb25zb2xlX3BvcnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9kZXZpY2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRmM2U1MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9kZXZpY2VzLmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvZGV2aWNlcy5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBUaGliYXV0IFZBUkVORSA8dmFyZW5ldEBwYXJpc2MtbGludXgub3JnPgorICogIENvcHlyaWdodCAoQykgMjAwNSBEYXZpZCBCcm93bmVsbAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3Bpby5oPgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVVNCIEhvc3QKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRF9NT0RVTEUpCitzdGF0aWMgdTY0IG9oY2lfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKK3N0YXRpYyBzdHJ1Y3QgYXQ5MV91c2JoX2RhdGEgdXNiaF9kYXRhOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGF0OTFybTkyMDBfdXNiaF9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MV9VSFBfQkFTRSwKKwkJLmVuZAk9IEFUOTFfVUhQX0JBU0UgKyBTWl8xTSAtMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFUOTFfSURfVUhQLAorCQkuZW5kCT0gQVQ5MV9JRF9VSFAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxcm05MjAwX3VzYmhfZGV2aWNlID0geworCS5uYW1lCQk9ICJhdDkxcm05MjAwLW9oY2kiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJCQkuZG1hX21hc2sJCT0gJm9oY2lfZG1hbWFzaywKKwkJCQkuY29oZXJlbnRfZG1hX21hc2sJPSAweGZmZmZmZmZmLAorCQkJCS5wbGF0Zm9ybV9kYXRhCQk9ICZ1c2JoX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBhdDkxcm05MjAwX3VzYmhfcmVzb3VyY2UsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGF0OTFybTkyMDBfdXNiaF9yZXNvdXJjZSksCit9OworCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfdXNiaChzdHJ1Y3QgYXQ5MV91c2JoX2RhdGEgKmRhdGEpCit7CisJaWYgKCFkYXRhKQorCQlyZXR1cm47CisKKwl1c2JoX2RhdGEgPSAqZGF0YTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFybTkyMDBfdXNiaF9kZXZpY2UpOworfQorI2Vsc2UKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV91c2JoKHN0cnVjdCBhdDkxX3VzYmhfZGF0YSAqZGF0YSkge30KKyNlbmRpZgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVVNCIERldmljZSAoR2FkZ2V0KQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX0FUOTEKK3N0YXRpYyBzdHJ1Y3QgYXQ5MV91ZGNfZGF0YSB1ZGNfZGF0YTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdDkxX3VkY19yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAk9IEFUOTFfQkFTRV9VRFAsCisJCS5lbmQJPSBBVDkxX0JBU0VfVURQICsgU1pfMTZLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXJtOTIwMF91ZGNfZGV2aWNlID0geworCS5uYW1lCQk9ICJhdDkxX3VkYyIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkJCS5wbGF0Zm9ybV9kYXRhCQk9ICZ1ZGNfZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IGF0OTFfdWRjX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoYXQ5MV91ZGNfcmVzb3VyY2VzKSwKK307CisKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV91ZGMoc3RydWN0IGF0OTFfdWRjX2RhdGEgKmRhdGEpCit7CisJaWYgKCFkYXRhKQorCQlyZXR1cm47CisKKwlpZiAoZGF0YS0+dmJ1c19waW4pIHsKKwkJYXQ5MV9zZXRfZ3Bpb19pbnB1dChkYXRhLT52YnVzX3BpbiwgMCk7CisJCWF0OTFfc2V0X2RlZ2xpdGNoKGRhdGEtPnZidXNfcGluLCAxKTsKKwl9CisJaWYgKGRhdGEtPnB1bGx1cF9waW4pCisJCWF0OTFfc2V0X2dwaW9fb3V0cHV0KGRhdGEtPnB1bGx1cF9waW4sIDApOworCisJdWRjX2RhdGEgPSAqZGF0YTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFybTkyMDBfdWRjX2RldmljZSk7Cit9CisjZWxzZQordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3VkYyhzdHJ1Y3QgYXQ5MV91ZGNfZGF0YSAqZGF0YSkge30KKyNlbmRpZgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgRXRoZXJuZXQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUk1fQVQ5MV9FVEhFUikgfHwgZGVmaW5lZChDT05GSUdfQVJNX0FUOTFfRVRIRVJfTU9EVUxFKQorc3RhdGljIHU2NCBldGhfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKK3N0YXRpYyBzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSBldGhfZGF0YTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXJtOTIwMF9ldGhfZGV2aWNlID0geworCS5uYW1lCQk9ICJhdDkxX2V0aGVyIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCQkJLmRtYV9tYXNrCQk9ICZldGhfZG1hbWFzaywKKwkJCQkuY29oZXJlbnRfZG1hX21hc2sJPSAweGZmZmZmZmZmLAorCQkJCS5wbGF0Zm9ybV9kYXRhCQk9ICZldGhfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gMCwKK307CisKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9ldGgoc3RydWN0IGF0OTFfZXRoX2RhdGEgKmRhdGEpCit7CisJaWYgKCFkYXRhKQorCQlyZXR1cm47CisKKwlpZiAoZGF0YS0+cGh5X2lycV9waW4pIHsKKwkJYXQ5MV9zZXRfZ3Bpb19pbnB1dChkYXRhLT5waHlfaXJxX3BpbiwgMCk7CisJCWF0OTFfc2V0X2RlZ2xpdGNoKGRhdGEtPnBoeV9pcnFfcGluLCAxKTsKKwl9CisKKwkvKiBQaW5zIHVzZWQgZm9yIE1JSSBhbmQgUk1JSSAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMTYsIDApOwkvKiBFTURJTyAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMTUsIDApOwkvKiBFTURDICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEExNCwgMCk7CS8qIEVSWEVSICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEExMywgMCk7CS8qIEVSWDEgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTEyLCAwKTsJLyogRVJYMCAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMTEsIDApOwkvKiBFQ1JTX0VDUlNEViAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMTAsIDApOwkvKiBFVFgxICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEE5LCAwKTsJLyogRVRYMCAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBOCwgMCk7CS8qIEVUWEVOICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEE3LCAwKTsJLyogRVRYQ0tfRVJFRkNLICovCisKKwlpZiAoIWRhdGEtPmlzX3JtaWkpIHsKKwkJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEIxOSwgMCk7CS8qIEVSWENLICovCisJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BCMTgsIDApOwkvKiBFQ09MICovCisJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BCMTcsIDApOwkvKiBFUlhEViAqLworCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQjE2LCAwKTsJLyogRVJYMyAqLworCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQjE1LCAwKTsJLyogRVJYMiAqLworCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQjE0LCAwKTsJLyogRVRYRVIgKi8KKwkJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEIxMywgMCk7CS8qIEVUWDMgKi8KKwkJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEIxMiwgMCk7CS8qIEVUWDIgKi8KKwl9CisKKwlldGhfZGF0YSA9ICpkYXRhOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MXJtOTIwMF9ldGhfZGV2aWNlKTsKK30KKyNlbHNlCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfZXRoKHN0cnVjdCBhdDkxX2V0aF9kYXRhICpkYXRhKSB7fQorI2VuZGlmCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBDb21wYWN0IEZsYXNoIC8gUENNQ0lBCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfQVQ5MV9DRikgfHwgZGVmaW5lZChDT05GSUdfQVQ5MV9DRl9NT0RVTEUpCitzdGF0aWMgc3RydWN0IGF0OTFfY2ZfZGF0YSBjZl9kYXRhOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxcm05MjAwX2NmX2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXQ5MV9jZiIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkJCS5wbGF0Zm9ybV9kYXRhCQk9ICZjZl9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAwLAorfTsKKwordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX2NmKHN0cnVjdCBhdDkxX2NmX2RhdGEgKmRhdGEpCit7CisJaWYgKCFkYXRhKQorCQlyZXR1cm47CisKKwkvKiBpbnB1dC9pcnEgKi8KKwlpZiAoZGF0YS0+aXJxX3BpbikgeworCQlhdDkxX3NldF9ncGlvX2lucHV0KGRhdGEtPmlycV9waW4sIDEpOworCQlhdDkxX3NldF9kZWdsaXRjaChkYXRhLT5pcnFfcGluLCAxKTsKKwl9CisJYXQ5MV9zZXRfZ3Bpb19pbnB1dChkYXRhLT5kZXRfcGluLCAxKTsKKwlhdDkxX3NldF9kZWdsaXRjaChkYXRhLT5kZXRfcGluLCAxKTsKKworCS8qIG91dHB1dHMsIGluaXRpYWxseSBvZmYgKi8KKwlpZiAoZGF0YS0+dmNjX3BpbikKKwkJYXQ5MV9zZXRfZ3Bpb19vdXRwdXQoZGF0YS0+dmNjX3BpbiwgMCk7CisJYXQ5MV9zZXRfZ3Bpb19vdXRwdXQoZGF0YS0+cnN0X3BpbiwgMCk7CisKKwljZl9kYXRhID0gKmRhdGE7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxcm05MjAwX2NmX2RldmljZSk7Cit9CisjZWxzZQordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX2NmKHN0cnVjdCBhdDkxX2NmX2RhdGEgKmRhdGEpIHt9CisjZW5kaWYKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIE1NQyAvIFNECisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfTU1DX0FUOTFSTTkyMDApIHx8IGRlZmluZWQoQ09ORklHX01NQ19BVDkxUk05MjAwX01PRFVMRSkKK3N0YXRpYyB1NjQgbW1jX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7CitzdGF0aWMgc3RydWN0IGF0OTFfbW1jX2RhdGEgbW1jX2RhdGE7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXQ5MV9tbWNfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSBBVDkxX0JBU0VfTUNJLAorCQkuZW5kCT0gQVQ5MV9CQVNFX01DSSArIFNaXzE2SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFybTkyMDBfbW1jX2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXQ5MXJtOTIwMF9tY2kiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJCQkuZG1hX21hc2sJCT0gJm1tY19kbWFtYXNrLAorCQkJCS5jb2hlcmVudF9kbWFfbWFzawk9IDB4ZmZmZmZmZmYsCisJCQkJLnBsYXRmb3JtX2RhdGEJCT0gJm1tY19kYXRhLAorCX0sCisJLnJlc291cmNlCT0gYXQ5MV9tbWNfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhdDkxX21tY19yZXNvdXJjZXMpLAorfTsKKwordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX21tYyhzdHJ1Y3QgYXQ5MV9tbWNfZGF0YSAqZGF0YSkKK3sKKwlpZiAoIWRhdGEpCisJCXJldHVybjsKKworCS8qIGlucHV0L2lycSAqLworCWlmIChkYXRhLT5kZXRfcGluKSB7CisJCWF0OTFfc2V0X2dwaW9faW5wdXQoZGF0YS0+ZGV0X3BpbiwgMSk7CisJCWF0OTFfc2V0X2RlZ2xpdGNoKGRhdGEtPmRldF9waW4sIDEpOworCX0KKwlpZiAoZGF0YS0+d3BfcGluKQorCQlhdDkxX3NldF9ncGlvX2lucHV0KGRhdGEtPndwX3BpbiwgMSk7CisKKwkvKiBDTEsgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTI3LCAwKTsKKworCWlmIChkYXRhLT5pc19iKSB7CisJCS8qIENNRCAqLworCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTgsIDApOworCisJCS8qIERBVDAsIG1heWJlIERBVDEuLkRBVDMgKi8KKwkJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEE5LCAwKTsKKwkJaWYgKGRhdGEtPndpcmU0KSB7CisJCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTEwLCAwKTsKKwkJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BBMTEsIDApOworCQkJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEExMiwgMCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBDTUQgKi8KKwkJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEEyOCwgMCk7CisKKwkJLyogREFUMCwgbWF5YmUgREFUMS4uREFUMyAqLworCQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTI5LCAwKTsKKwkJaWYgKGRhdGEtPndpcmU0KSB7CisJCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQjMsIDApOworCQkJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEI0LCAwKTsKKwkJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BCNSwgMCk7CisJCX0KKwl9CisKKwltbWNfZGF0YSA9ICpkYXRhOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MXJtOTIwMF9tbWNfZGV2aWNlKTsKK30KKyNlbHNlCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfbW1jKHN0cnVjdCBhdDkxX21tY19kYXRhICpkYXRhKSB7fQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvZ2VuZXJpYy5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2dlbmVyaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmQ1NDFlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2dlbmVyaWMuaApAQCAtMCwwICsxLDE4IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2dlbmVyaWMuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKK3ZvaWQgYXQ5MV9ncGlvX2lycV9zZXR1cCh1bnNpZ25lZCBiYW5rcyk7CisKK3N0cnVjdCBzeXNfdGltZXI7CitleHRlcm4gc3RydWN0IHN5c190aW1lciBhdDkxcm05MjAwX3RpbWVyOworCitleHRlcm4gdm9pZCBfX2luaXQgYXQ5MXJtOTIwMF9tYXBfaW8odm9pZCk7CisKK2V4dGVybiBpbnQgX19pbml0IGF0OTFfY2xvY2tfaW5pdCh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2dwaW8uYyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkMmVmNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ncGlvLmMKQEAgLTAsMCArMSwzMDIgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvZ3Bpby5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEhQIExhYnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorCitzdGF0aWMgY29uc3QgdTMyIHBpb19jb250cm9sbGVyX29mZnNldFs0XSA9IHsKKwlBVDkxX1BJT0EsCisJQVQ5MV9QSU9CLAorCUFUOTFfUElPQywKKwlBVDkxX1BJT0QsCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqcGluX3RvX2NvbnRyb2xsZXIodW5zaWduZWQgcGluKQoreworCXZvaWQgX19pb21lbSAqc3lzX2Jhc2UgPSAodm9pZCBfX2lvbWVtICopIEFUOTFfVkFfQkFTRV9TWVM7CisKKwlwaW4gLT0gUElOX0JBU0U7CisJcGluIC89IDMyOworCWlmIChsaWtlbHkocGluIDwgQkdBX0dQSU9fQkFOS1MpKQorCQlyZXR1cm4gc3lzX2Jhc2UgKyBwaW9fY29udHJvbGxlcl9vZmZzZXRbcGluXTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHBpbl90b19tYXNrKHVuc2lnbmVkIHBpbikKK3sKKwlwaW4gLT0gUElOX0JBU0U7CisJcmV0dXJuIDEgPDwgKHBpbiAlIDMyKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogTm90IGFsbCBoYXJkd2FyZSBjYXBhYmlsaXRpZXMgYXJlIGV4cG9zZWQgdGhyb3VnaCB0aGVzZSBjYWxsczsgdGhleQorICogb25seSBlbmNhcHN1bGF0ZSB0aGUgbW9zdCBjb21tb24gZmVhdHVyZXMgYW5kIG1vZGVzLiAgKFNvIGlmIHlvdQorICogd2FudCB0byBjaGFuZ2Ugc2lnbmFscyBpbiBncm91cHMsIGRvIGl0IGRpcmVjdGx5LikKKyAqCisgKiBCb290bG9hZGVycyB3aWxsIHVzdWFsbHkgaGFuZGxlIHNvbWUgb2YgdGhlIHBpbiBtdWx0aXBsZXhpbmcgc2V0dXAuCisgKiBUaGUgaW50ZW50IGlzIGNlcnRhaW5seSB0aGF0IGJ5IHRoZSB0aW1lIExpbnV4IGlzIGZ1bGx5IGJvb3RlZCwgYWxsCisgKiBwaW5zIHNob3VsZCBoYXZlIGJlZW4gZnVsbHkgaW5pdGlhbGl6ZWQuICBUaGVzZSBzZXR1cCBjYWxscyBzaG91bGQKKyAqIG9ubHkgYmUgdXNlZCBieSBib2FyZCBzZXR1cCByb3V0aW5lcywgb3IgcG9zc2libHkgaW4gZHJpdmVyIHByb2JlKCkuCisgKgorICogRm9yIGJvb3Rsb2FkZXJzIGRvaW5nIGFsbCB0aGF0IHNldHVwLCB0aGVzZSBjYWxscyBjb3VsZCBiZSBpbmxpbmVkCisgKiBhcyBOT1BzIHNvIExpbnV4IHdvbid0IGR1cGxpY2F0ZSBhbnkgc2V0dXAgY29kZQorICovCisKKworLyoKKyAqIG11eCB0aGUgcGluIHRvIHRoZSAiQSIgaW50ZXJuYWwgcGVyaXBoZXJhbCByb2xlLgorICovCitpbnQgX19pbml0X29yX21vZHVsZSBhdDkxX3NldF9BX3BlcmlwaCh1bnNpZ25lZCBwaW4sIGludCB1c2VfcHVsbHVwKQoreworCXZvaWQgX19pb21lbQkqcGlvID0gcGluX3RvX2NvbnRyb2xsZXIocGluKTsKKwl1bnNpZ25lZAltYXNrID0gcGluX3RvX21hc2socGluKTsKKworCWlmICghcGlvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCV9fcmF3X3dyaXRlbChtYXNrLCBwaW8gKyBQSU9fSURSKTsKKwlfX3Jhd193cml0ZWwobWFzaywgcGlvICsgKHVzZV9wdWxsdXAgPyBQSU9fUFVFUiA6IFBJT19QVURSKSk7CisJX19yYXdfd3JpdGVsKG1hc2ssIHBpbyArIFBJT19BU1IpOworCV9fcmF3X3dyaXRlbChtYXNrLCBwaW8gKyBQSU9fUERSKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYXQ5MV9zZXRfQV9wZXJpcGgpOworCisKKy8qCisgKiBtdXggdGhlIHBpbiB0byB0aGUgIkIiIGludGVybmFsIHBlcmlwaGVyYWwgcm9sZS4KKyAqLworaW50IF9faW5pdF9vcl9tb2R1bGUgYXQ5MV9zZXRfQl9wZXJpcGgodW5zaWduZWQgcGluLCBpbnQgdXNlX3B1bGx1cCkKK3sKKwl2b2lkIF9faW9tZW0JKnBpbyA9IHBpbl90b19jb250cm9sbGVyKHBpbik7CisJdW5zaWduZWQJbWFzayA9IHBpbl90b19tYXNrKHBpbik7CisKKwlpZiAoIXBpbykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlfX3Jhd193cml0ZWwobWFzaywgcGlvICsgUElPX0lEUik7CisJX19yYXdfd3JpdGVsKG1hc2ssIHBpbyArICh1c2VfcHVsbHVwID8gUElPX1BVRVIgOiBQSU9fUFVEUikpOworCV9fcmF3X3dyaXRlbChtYXNrLCBwaW8gKyBQSU9fQlNSKTsKKwlfX3Jhd193cml0ZWwobWFzaywgcGlvICsgUElPX1BEUik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGF0OTFfc2V0X0JfcGVyaXBoKTsKKworCisvKgorICogbXV4IHRoZSBwaW4gdG8gdGhlIGdwaW8gY29udHJvbGxlciAoaW5zdGVhZCBvZiAiQSIgb3IgIkIiIHBlcmlwaGVyYWwpLCBhbmQKKyAqIGNvbmZpZ3VyZSBpdCBmb3IgYW4gaW5wdXQuCisgKi8KK2ludCBfX2luaXRfb3JfbW9kdWxlIGF0OTFfc2V0X2dwaW9faW5wdXQodW5zaWduZWQgcGluLCBpbnQgdXNlX3B1bGx1cCkKK3sKKwl2b2lkIF9faW9tZW0JKnBpbyA9IHBpbl90b19jb250cm9sbGVyKHBpbik7CisJdW5zaWduZWQJbWFzayA9IHBpbl90b19tYXNrKHBpbik7CisKKwlpZiAoIXBpbykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlfX3Jhd193cml0ZWwobWFzaywgcGlvICsgUElPX0lEUik7CisJX19yYXdfd3JpdGVsKG1hc2ssIHBpbyArICh1c2VfcHVsbHVwID8gUElPX1BVRVIgOiBQSU9fUFVEUikpOworCV9fcmF3X3dyaXRlbChtYXNrLCBwaW8gKyBQSU9fT0RSKTsKKwlfX3Jhd193cml0ZWwobWFzaywgcGlvICsgUElPX1BFUik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGF0OTFfc2V0X2dwaW9faW5wdXQpOworCisKKy8qCisgKiBtdXggdGhlIHBpbiB0byB0aGUgZ3BpbyBjb250cm9sbGVyIChpbnN0ZWFkIG9mICJBIiBvciAiQiIgcGVyaXBoZXJhbCksCisgKiBhbmQgY29uZmlndXJlIGl0IGZvciBhbiBvdXRwdXQuCisgKi8KK2ludCBfX2luaXRfb3JfbW9kdWxlIGF0OTFfc2V0X2dwaW9fb3V0cHV0KHVuc2lnbmVkIHBpbiwgaW50IHZhbHVlKQoreworCXZvaWQgX19pb21lbQkqcGlvID0gcGluX3RvX2NvbnRyb2xsZXIocGluKTsKKwl1bnNpZ25lZAltYXNrID0gcGluX3RvX21hc2socGluKTsKKworCWlmICghcGlvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCV9fcmF3X3dyaXRlbChtYXNrLCBwaW8gKyBQSU9fSURSKTsKKwlfX3Jhd193cml0ZWwobWFzaywgcGlvICsgUElPX1BVRFIpOworCV9fcmF3X3dyaXRlbChtYXNrLCBwaW8gKyAodmFsdWUgPyBQSU9fU09EUiA6IFBJT19DT0RSKSk7CisJX19yYXdfd3JpdGVsKG1hc2ssIHBpbyArIFBJT19PRVIpOworCV9fcmF3X3dyaXRlbChtYXNrLCBwaW8gKyBQSU9fUEVSKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYXQ5MV9zZXRfZ3Bpb19vdXRwdXQpOworCisKKy8qCisgKiBlbmFibGUvZGlzYWJsZSB0aGUgZ2xpdGNoIGZpbHRlcjsgbW9zdGx5IHVzZWQgd2l0aCBJUlEgaGFuZGxpbmcuCisgKi8KK2ludCBfX2luaXRfb3JfbW9kdWxlIGF0OTFfc2V0X2RlZ2xpdGNoKHVuc2lnbmVkIHBpbiwgaW50IGlzX29uKQoreworCXZvaWQgX19pb21lbQkqcGlvID0gcGluX3RvX2NvbnRyb2xsZXIocGluKTsKKwl1bnNpZ25lZAltYXNrID0gcGluX3RvX21hc2socGluKTsKKworCWlmICghcGlvKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlfX3Jhd193cml0ZWwobWFzaywgcGlvICsgKGlzX29uID8gUElPX0lGRVIgOiBQSU9fSUZEUikpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChhdDkxX3NldF9kZWdsaXRjaCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qCisgKiBhc3N1bWluZyB0aGUgcGluIGlzIG11eGVkIGFzIGEgZ3BpbyBvdXRwdXQsIHNldCBpdHMgdmFsdWUuCisgKi8KK2ludCBhdDkxX3NldF9ncGlvX3ZhbHVlKHVuc2lnbmVkIHBpbiwgaW50IHZhbHVlKQoreworCXZvaWQgX19pb21lbQkqcGlvID0gcGluX3RvX2NvbnRyb2xsZXIocGluKTsKKwl1bnNpZ25lZAltYXNrID0gcGluX3RvX21hc2socGluKTsKKworCWlmICghcGlvKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlfX3Jhd193cml0ZWwobWFzaywgcGlvICsgKHZhbHVlID8gUElPX1NPRFIgOiBQSU9fQ09EUikpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChhdDkxX3NldF9ncGlvX3ZhbHVlKTsKKworCisvKgorICogcmVhZCB0aGUgcGluJ3MgdmFsdWUgKHdvcmtzIGV2ZW4gaWYgaXQncyBub3QgbXV4ZWQgYXMgYSBncGlvKS4KKyAqLworaW50IGF0OTFfZ2V0X2dwaW9fdmFsdWUodW5zaWduZWQgcGluKQoreworCXZvaWQgX19pb21lbQkqcGlvID0gcGluX3RvX2NvbnRyb2xsZXIocGluKTsKKwl1bnNpZ25lZAltYXNrID0gcGluX3RvX21hc2socGluKTsKKwl1MzIJCXBkc3I7CisKKwlpZiAoIXBpbykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcGRzciA9IF9fcmF3X3JlYWRsKHBpbyArIFBJT19QRFNSKTsKKwlyZXR1cm4gKHBkc3IgJiBtYXNrKSAhPSAwOworfQorRVhQT1JUX1NZTUJPTChhdDkxX2dldF9ncGlvX3ZhbHVlKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyogU2V2ZXJhbCBBSUMgY29udHJvbGxlciBpcnFzIGFyZSBkaXNwYXRjaGVkIHRocm91Z2ggdGhpcyBHUElPIGhhbmRsZXIuCisgKiBUbyB1c2UgYW55IEFUOTFfUElOXyogYXMgYW4gZXh0ZXJuYWxseSB0cmlnZ2VyZWQgSVJRLCBmaXJzdCBjYWxsCisgKiBhdDkxX3NldF9ncGlvX2lucHV0KCkgdGhlbiBtYXliZSBlbmFibGUgaXRzIGdsaXRjaCBmaWx0ZXIuCisgKiBUaGVuIGp1c3QgcmVxdWVzdF9pcnEoKSB3aXRoIHRoZSBwaW4gSUQ7IGl0IHdvcmtzIGxpa2UgYW55IEFSTSBJUlEKKyAqIGhhbmRsZXIsIHRob3VnaCBpdCBhbHdheXMgdHJpZ2dlcnMgb24gcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzLgorICoKKyAqIEFsdGVybmF0aXZlbHksIGNlcnRhaW4gcGlucyBtYXkgYmUgdXNlZCBkaXJlY3RseSBhcyBJUlEwLi5JUlE2IGFmdGVyCisgKiBjb25maWd1cmluZyB0aGVtIHdpdGggYXQ5MV9zZXRfYV9wZXJpcGgoKSBvciBhdDkxX3NldF9iX3BlcmlwaCgpLgorICogSVJRMC4uSVJRNiBzaG91bGQgYmUgY29uZmlndXJhYmxlLCBlLmcuIGxldmVsIHZzIGVkZ2UgdHJpZ2dlcmluZy4KKyAqLworCitzdGF0aWMgdm9pZCBncGlvX2lycV9tYXNrKHVuc2lnbmVkIHBpbikKK3sKKwl2b2lkIF9faW9tZW0JKnBpbyA9IHBpbl90b19jb250cm9sbGVyKHBpbik7CisJdW5zaWduZWQJbWFzayA9IHBpbl90b19tYXNrKHBpbik7CisKKwlpZiAocGlvKQorCQlfX3Jhd193cml0ZWwobWFzaywgcGlvICsgUElPX0lEUik7Cit9CisKK3N0YXRpYyB2b2lkIGdwaW9faXJxX3VubWFzayh1bnNpZ25lZCBwaW4pCit7CisJdm9pZCBfX2lvbWVtCSpwaW8gPSBwaW5fdG9fY29udHJvbGxlcihwaW4pOworCXVuc2lnbmVkCW1hc2sgPSBwaW5fdG9fbWFzayhwaW4pOworCisJaWYgKHBpbykKKwkJX19yYXdfd3JpdGVsKG1hc2ssIHBpbyArIFBJT19JRVIpOworfQorCitzdGF0aWMgaW50IGdwaW9faXJxX3R5cGUodW5zaWduZWQgcGluLCB1bnNpZ25lZCB0eXBlKQoreworCXJldHVybiAodHlwZSA9PSBJUlFUX0JPVEhFREdFKSA/IDAgOiAtRUlOVkFMOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgZ3Bpb19pcnFjaGlwID0geworCS5tYXNrCQk9IGdwaW9faXJxX21hc2ssCisJLnVubWFzawkJPSBncGlvX2lycV91bm1hc2ssCisJLnNldF90eXBlCT0gZ3Bpb19pcnFfdHlwZSwKK307CisKK3N0YXRpYyB2b2lkIGdwaW9faXJxX2hhbmRsZXIodW5zaWduZWQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQJcGluOworCXN0cnVjdCBpcnFkZXNjCSpncGlvOworCXZvaWQgX19pb21lbQkqcGlvOworCXUzMgkJaXNyOworCisJcGlvID0gKHZvaWQgX19mb3JjZSBfX2lvbWVtICopIGRlc2MtPmNoaXBkYXRhOworCisJLyogdGVtcG9yYXJpbHkgbWFzayAobGV2ZWwgc2Vuc2l0aXZlKSBwYXJlbnQgSVJRICovCisJZGVzYy0+Y2hpcC0+YWNrKGlycSk7CisJZm9yICg7OykgeworCQlpc3IgPSBfX3Jhd19yZWFkbChwaW8gKyBQSU9fSVNSKSAmIF9fcmF3X3JlYWRsKHBpbyArIFBJT19JTVIpOworCQlpZiAoIWlzcikKKwkJCWJyZWFrOworCisJCXBpbiA9ICh1bnNpZ25lZCkgZGVzYy0+ZGF0YTsKKwkJZ3BpbyA9ICZpcnFfZGVzY1twaW5dOworCisJCXdoaWxlIChpc3IpIHsKKwkJCWlmIChpc3IgJiAxKQorCQkJCWdwaW8tPmhhbmRsZShwaW4sIGdwaW8sIHJlZ3MpOworCQkJcGluKys7CisJCQlncGlvKys7CisJCQlpc3IgPj49IDE7CisJCX0KKwl9CisJZGVzYy0+Y2hpcC0+dW5tYXNrKGlycSk7CisJLyogbm93IGl0IG1heSByZS10cmlnZ2VyICovCit9CisKKy8qIGNhbGwgdGhpcyBmcm9tIGJvYXJkLXNwZWNpZmljIGluaXRfaXJxICovCit2b2lkIF9faW5pdCBhdDkxX2dwaW9faXJxX3NldHVwKHVuc2lnbmVkIGJhbmtzKQoreworCXVuc2lnbmVkCXBpb2MsIHBpbiwgaWQ7CisKKwlpZiAoYmFua3MgPiA0KQorCQliYW5rcyA9IDQ7CisJZm9yIChwaW9jID0gMCwgcGluID0gUElOX0JBU0UsIGlkID0gQVQ5MV9JRF9QSU9BOworCQkJcGlvYyA8IGJhbmtzOworCQkJcGlvYysrLCBpZCsrKSB7CisJCXZvaWQgX19pb21lbQkqY29udHJvbGxlcjsKKwkJdW5zaWduZWQJaTsKKworCQljb250cm9sbGVyID0gKHZvaWQgX19pb21lbSAqKSBBVDkxX1ZBX0JBU0VfU1lTICsgcGlvX2NvbnRyb2xsZXJfb2Zmc2V0W3Bpb2NdOworCQlfX3Jhd193cml0ZWwofjAsIGNvbnRyb2xsZXIgKyBQSU9fSURSKTsKKworCQlzZXRfaXJxX2RhdGEoaWQsICh2b2lkICopIHBpbik7CisJCXNldF9pcnFfY2hpcGRhdGEoaWQsICh2b2lkIF9fZm9yY2UgKikgY29udHJvbGxlcik7CisKKwkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyssIHBpbisrKSB7CisJCQlzZXRfaXJxX2NoaXAocGluLCAmZ3Bpb19pcnFjaGlwKTsKKwkJCXNldF9pcnFfaGFuZGxlcihwaW4sIGRvX3NpbXBsZV9JUlEpOworCQkJc2V0X2lycV9mbGFncyhwaW4sIElSUUZfVkFMSUQpOworCQl9CisKKwkJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoaWQsIGdwaW9faXJxX2hhbmRsZXIpOworCisJCS8qIGVuYWJsZSB0aGUgUElPIHBlcmlwaGVyYWwgY2xvY2sgKi8KKwkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QTUNfUENFUiwgMSA8PCBpZCk7CisJfQorCXByX2luZm8oIkFUOTE6ICVkIGdwaW8gaXJxcyBpbiAlZCBiYW5rc1xuIiwgcGluIC0gUElOX0JBU0UsIGJhbmtzKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9pcnEuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjYyYmM4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2lycS5jCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2lycS5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBTQU4gUGVvcGxlCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IEFUTUVMCisgKiAgQ29weXJpZ2h0IChDKSBSaWNrIEJyb25zb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworI2luY2x1ZGUgImdlbmVyaWMuaCIKKworLyoKKyAqIFRoZSBkZWZhdWx0IGludGVycnVwdCBwcmlvcml0eSBsZXZlbHMgKDAgPSBsb3dlc3QsIDcgPSBoaWdoZXN0KS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBhdDkxcm05MjAwX2RlZmF1bHRfaXJxX3ByaW9yaXR5W05SX0FJQ19JUlFTXSBfX2luaXRkYXRhID0geworCTcsCS8qIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyICovCisJNywJLyogU3lzdGVtIFBlcmlwaGVyYWwgKi8KKwkwLAkvKiBQYXJhbGxlbCBJTyBDb250cm9sbGVyIEEgKi8KKwkwLAkvKiBQYXJhbGxlbCBJTyBDb250cm9sbGVyIEIgKi8KKwkwLAkvKiBQYXJhbGxlbCBJTyBDb250cm9sbGVyIEMgKi8KKwkwLAkvKiBQYXJhbGxlbCBJTyBDb250cm9sbGVyIEQgKi8KKwk2LAkvKiBVU0FSVCAwICovCisJNiwJLyogVVNBUlQgMSAqLworCTYsCS8qIFVTQVJUIDIgKi8KKwk2LAkvKiBVU0FSVCAzICovCisJMCwJLyogTXVsdGltZWRpYSBDYXJkIEludGVyZmFjZSAqLworCTQsCS8qIFVTQiBEZXZpY2UgUG9ydCAqLworCTAsCS8qIFR3by1XaXJlIEludGVyZmFjZSAqLworCTYsCS8qIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSAqLworCTUsCS8qIFNlcmlhbCBTeW5jaHJvbm91cyBDb250cm9sbGVyICovCisJNSwJLyogU2VyaWFsIFN5bmNocm9ub3VzIENvbnRyb2xsZXIgKi8KKwk1LAkvKiBTZXJpYWwgU3luY2hyb25vdXMgQ29udHJvbGxlciAqLworCTAsCS8qIFRpbWVyIENvdW50ZXIgMCAqLworCTAsCS8qIFRpbWVyIENvdW50ZXIgMSAqLworCTAsCS8qIFRpbWVyIENvdW50ZXIgMiAqLworCTAsCS8qIFRpbWVyIENvdW50ZXIgMyAqLworCTAsCS8qIFRpbWVyIENvdW50ZXIgNCAqLworCTAsCS8qIFRpbWVyIENvdW50ZXIgNSAqLworCTMsCS8qIFVTQiBIb3N0IHBvcnQgKi8KKwkzLAkvKiBFdGhlcm5ldCBNQUMgKi8KKwkwLAkvKiBBZHZhbmNlZCBJbnRlcnJ1cHQgQ29udHJvbGxlciAqLworCTAsCS8qIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyICovCisJMCwJLyogQWR2YW5jZWQgSW50ZXJydXB0IENvbnRyb2xsZXIgKi8KKwkwLAkvKiBBZHZhbmNlZCBJbnRlcnJ1cHQgQ29udHJvbGxlciAqLworCTAsCS8qIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyICovCisJMCwJLyogQWR2YW5jZWQgSW50ZXJydXB0IENvbnRyb2xsZXIgKi8KKwkwCS8qIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyICovCit9OworCisKK3N0YXRpYyB2b2lkIGF0OTFybTkyMDBfbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwkvKiBEaXNhYmxlIGludGVycnVwdCBvbiBBSUMgKi8KKwlhdDkxX3N5c193cml0ZShBVDkxX0FJQ19JRENSLCAxIDw8IGlycSk7Cit9CisKK3N0YXRpYyB2b2lkIGF0OTFybTkyMDBfdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCS8qIEVuYWJsZSBpbnRlcnJ1cHQgb24gQUlDICovCisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9BSUNfSUVDUiwgMSA8PCBpcnEpOworfQorCitzdGF0aWMgaW50IGF0OTFybTkyMDBfaXJxX3R5cGUodW5zaWduZWQgaXJxLCB1bnNpZ25lZCB0eXBlKQoreworCXVuc2lnbmVkIGludCBzbXIsIHNyY3R5cGU7CisKKwkvKiBjaGFuZ2UgdHJpZ2dlcmluZyBvbmx5IGZvciBGSVEgYW5kIGV4dGVybmFsIElSUTAuLklSUTYgKi8KKwlpZiAoKGlycSA8IEFUOTFfSURfSVJRMCkgJiYgKGlycSAhPSBBVDkxX0lEX0ZJUSkpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJUlFUX0hJR0g6CisJCXNyY3R5cGUgPSBBVDkxX0FJQ19TUkNUWVBFX0hJR0g7CisJCWJyZWFrOworCWNhc2UgSVJRVF9SSVNJTkc6CisJCXNyY3R5cGUgPSBBVDkxX0FJQ19TUkNUWVBFX1JJU0lORzsKKwkJYnJlYWs7CisJY2FzZSBJUlFUX0xPVzoKKwkJc3JjdHlwZSA9IEFUOTFfQUlDX1NSQ1RZUEVfTE9XOworCQlicmVhazsKKwljYXNlIElSUVRfRkFMTElORzoKKwkJc3JjdHlwZSA9IEFUOTFfQUlDX1NSQ1RZUEVfRkFMTElORzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc21yID0gYXQ5MV9zeXNfcmVhZChBVDkxX0FJQ19TTVIoaXJxKSkgJiB+QVQ5MV9BSUNfU1JDVFlQRTsKKwlhdDkxX3N5c193cml0ZShBVDkxX0FJQ19TTVIoaXJxKSwgc21yIHwgc3JjdHlwZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBhdDkxcm05MjAwX2lycV9jaGlwID0geworCS5hY2sJCT0gYXQ5MXJtOTIwMF9tYXNrX2lycSwKKwkubWFzawkJPSBhdDkxcm05MjAwX21hc2tfaXJxLAorCS51bm1hc2sJCT0gYXQ5MXJtOTIwMF91bm1hc2tfaXJxLAorCS5zZXRfdHlwZQk9IGF0OTFybTkyMDBfaXJxX3R5cGUsCit9OworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgQUlDIGludGVycnVwdCBjb250cm9sbGVyLgorICovCit2b2lkIF9faW5pdCBhdDkxcm05MjAwX2luaXRfaXJxKHVuc2lnbmVkIGludCBwcmlvcml0eVtOUl9BSUNfSVJRU10pCit7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBObyBwcmlvcml0eSBsaXN0IHNwZWNpZmllZCBmb3IgdGhpcyBib2FyZCAtPiB1c2UgZGVmYXVsdHMgKi8KKwlpZiAocHJpb3JpdHkgPT0gTlVMTCkKKwkJcHJpb3JpdHkgPSBhdDkxcm05MjAwX2RlZmF1bHRfaXJxX3ByaW9yaXR5OworCisJLyoKKwkgKiBUaGUgSVZSIGlzIHVzZWQgYnkgbWFjcm8gZ2V0X2lycW5yX2FuZF9iYXNlIHRvIHJlYWQgYW5kIHZlcmlmeS4KKwkgKiBUaGUgaXJxIG51bWJlciBpcyBOUl9BSUNfSVJRUyB3aGVuIGEgc3B1cmlvdXMgaW50ZXJydXB0IGhhcyBvY2N1cnJlZC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlJfQUlDX0lSUVM7IGkrKykgeworCQkvKiBQdXQgaXJxIG51bWJlciBpbiBTb3VyY2UgVmVjdG9yIFJlZ2lzdGVyOiAqLworCQlhdDkxX3N5c193cml0ZShBVDkxX0FJQ19TVlIoaSksIGkpOworCQkvKiBTdG9yZSB0aGUgU291cmNlIE1vZGUgUmVnaXN0ZXIgYXMgZGVmaW5lZCBpbiB0YWJsZSBhYm92ZSAqLworCQlhdDkxX3N5c193cml0ZShBVDkxX0FJQ19TTVIoaSksIEFUOTFfQUlDX1NSQ1RZUEVfTE9XIHwgcHJpb3JpdHlbaV0pOworCisJCXNldF9pcnFfY2hpcChpLCAmYXQ5MXJtOTIwMF9pcnFfY2hpcCk7CisJCXNldF9pcnFfaGFuZGxlcihpLCBkb19sZXZlbF9JUlEpOworCQlzZXRfaXJxX2ZsYWdzKGksIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKKworCQkvKiBQZXJmb3JtIDggRW5kIE9mIEludGVycnVwdCBDb21tYW5kIHRvIG1ha2Ugc3VyZSBBSUMgd2lsbCBub3QgTG9jayBvdXQgbklSUSAqLworCQlpZiAoaSA8IDgpCisJCQlhdDkxX3N5c193cml0ZShBVDkxX0FJQ19FT0lDUiwgMCk7CisJfQorCisJLyoKKwkgKiBTcHVyaW91cyBJbnRlcnJ1cHQgSUQgaW4gU3B1cmlvdXMgVmVjdG9yIFJlZ2lzdGVyIGlzIE5SX0FJQ19JUlFTCisJICogV2hlbiB0aGVyZSBpcyBubyBjdXJyZW50IGludGVycnVwdCwgdGhlIElSUSBWZWN0b3IgUmVnaXN0ZXIgcmVhZHMgdGhlIHZhbHVlIHN0b3JlZCBpbiBBSUNfU1BVCisJICovCisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9BSUNfU1BVLCBOUl9BSUNfSVJRUyk7CisKKwkvKiBObyBkZWJ1Z2dpbmcgaW4gQUlDOiBEZWJ1ZyAoUHJvdGVjdCkgQ29udHJvbCBSZWdpc3RlciAqLworCWF0OTFfc3lzX3dyaXRlKEFUOTFfQUlDX0RDUiwgMCk7CisKKwkvKiBEaXNhYmxlIGFuZCBjbGVhciBhbGwgaW50ZXJydXB0cyBpbml0aWFsbHkgKi8KKwlhdDkxX3N5c193cml0ZShBVDkxX0FJQ19JRENSLCAweEZGRkZGRkZGKTsKKwlhdDkxX3N5c193cml0ZShBVDkxX0FJQ19JQ0NSLCAweEZGRkZGRkZGKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvdGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNmRkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvdGltZS5jCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL3RpbWUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgU0FOIFBlb3BsZQorICogIENvcHlyaWdodCAoQykgMjAwMyBBVE1FTAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKworLyoKKyAqIFRoZSBTVF9DUlRSIGlzIHVwZGF0ZWQgYXN5bmNocm9ub3VzbHkgdG8gdGhlIG1hc3RlciBjbG9jay4gIEl0IGlzIHRoZXJlZm9yZQorICogIG5lY2Vzc2FyeSB0byByZWFkIGl0IHR3aWNlICh3aXRoIHRoZSBzYW1lIHZhbHVlKSB0byBlbnN1cmUgYWNjdXJhY3kuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByZWFkX0NSVFIodm9pZCkgeworCXVuc2lnbmVkIGxvbmcgeDEsIHgyOworCisJZG8geworCQl4MSA9IGF0OTFfc3lzX3JlYWQoQVQ5MV9TVF9DUlRSKTsKKwkJeDIgPSBhdDkxX3N5c19yZWFkKEFUOTFfU1RfQ1JUUik7CisJfSB3aGlsZSAoeDEgIT0geDIpOworCisJcmV0dXJuIHgxOworfQorCisvKgorICogUmV0dXJucyBudW1iZXIgb2YgbWljcm9zZWNvbmRzIHNpbmNlIGxhc3QgdGltZXIgaW50ZXJydXB0LiAgTm90ZSB0aGF0IGludGVycnVwdHMKKyAqIHdpbGwgaGF2ZSBiZWVuIGRpc2FibGVkIGJ5IGRvX2dldHRpbWVvZmRheSgpCisgKiAgJ0xBVENIJyBpcyBod2Nsb2NrIHRpY2tzIChzZWUgQ0xPQ0tfVElDS19SQVRFIGluIHRpbWV4LmgpIHBlciBqaWZmeS4KKyAqICAndGljaycgaXMgdXNlY3MgcGVyIGppZmZ5IChsaW51eC90aW1leC5oKS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgYXQ5MXJtOTIwMF9nZXR0aW1lb2Zmc2V0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBlbGFwc2VkOworCisJZWxhcHNlZCA9IChyZWFkX0NSVFIoKSAtIGF0OTFfc3lzX3JlYWQoQVQ5MV9TVF9SVEFSKSkgJiBBVDkxX1NUX0FMTVY7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpKGVsYXBzZWQgKiAodGlja19uc2VjIC8gMTAwMCkpIC8gTEFUQ0g7Cit9CisKKy8qCisgKiBJUlEgaGFuZGxlciBmb3IgdGhlIHRpbWVyLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYXQ5MXJtOTIwMF90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHJ0YXI7CisKKwlpZiAoYXQ5MV9zeXNfcmVhZChBVDkxX1NUX1NSKSAmIEFUOTFfU1RfUElUUykgewkvKiBUaGlzIGlzIGEgc2hhcmVkIGludGVycnVwdCAqLworCQl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKKworCQlkbyB7CisJCQl0aW1lcl90aWNrKHJlZ3MpOworCQkJcnRhciA9IChhdDkxX3N5c19yZWFkKEFUOTFfU1RfUlRBUikgKyBMQVRDSCkgJiBBVDkxX1NUX0FMTVY7CisJCQlhdDkxX3N5c193cml0ZShBVDkxX1NUX1JUQVIsIHJ0YXIpOworCQl9IHdoaWxlICgoKHJlYWRfQ1JUUigpIC0gYXQ5MV9zeXNfcmVhZChBVDkxX1NUX1JUQVIpKSAmIEFUOTFfU1RfQUxNVikgPj0gTEFUQ0gpOworCisJCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CisKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwllbHNlCisJCXJldHVybiBJUlFfTk9ORTsJCS8qIG5vdCBoYW5kbGVkICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGF0OTFybTkyMDBfdGltZXJfaXJxID0geworCS5uYW1lCQk9ICJhdDkxX3RpY2siLAorCS5mbGFncwkJPSBTQV9TSElSUSB8IFNBX0lOVEVSUlVQVCwKKwkuaGFuZGxlcgk9IGF0OTFybTkyMDBfdGltZXJfaW50ZXJydXB0Cit9OworCisvKgorICogU2V0IHVwIHRpbWVyIGludGVycnVwdC4KKyAqLwordm9pZCBfX2luaXQgYXQ5MXJtOTIwMF90aW1lcl9pbml0KHZvaWQpCit7CisJLyogRGlzYWJsZSBhbGwgdGltZXIgaW50ZXJydXB0cyAqLworCWF0OTFfc3lzX3dyaXRlKEFUOTFfU1RfSURSLCBBVDkxX1NUX1BJVFMgfCBBVDkxX1NUX1dET1ZGIHwgQVQ5MV9TVF9SVFRJTkMgfCBBVDkxX1NUX0FMTVMpOworCSh2b2lkKSBhdDkxX3N5c19yZWFkKEFUOTFfU1RfU1IpOwkvKiBDbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzICovCisKKwkvKgorCSAqIE1ha2UgSVJRcyBoYXBwZW4gZm9yIHRoZSBzeXN0ZW0gdGltZXIuCisJICovCisJc2V0dXBfaXJxKEFUOTFfSURfU1lTLCAmYXQ5MXJtOTIwMF90aW1lcl9pcnEpOworCisJLyogU2V0IGluaXRpYWwgYWxhcm0gdG8gMCAqLworCWF0OTFfc3lzX3dyaXRlKEFUOTFfU1RfUlRBUiwgMCk7CisKKwkvKiBSZWFsIHRpbWUgY291bnRlciBpbmNyZW1lbnRlZCBldmVyeSAzMC41MTc1OCBtaWNyb3NlY29uZHMgKi8KKwlhdDkxX3N5c193cml0ZShBVDkxX1NUX1JUTVIsIDEpOworCisJLyogU2V0IFBlcmlvZCBJbnRlcnZhbCB0aW1lciAqLworCWF0OTFfc3lzX3dyaXRlKEFUOTFfU1RfUElNUiwgTEFUQ0gpOworCisJLyogQ2hhbmdlIHRoZSBrZXJuZWwncyAndGljaycgdmFsdWUgdG8gMTAwMDkgdXNlYy4gKHRoZSBkZWZhdWx0IGlzIDEwMDAwKSAqLworCXRpY2tfdXNlYyA9IChMQVRDSCAqIDEwMDAwMDApIC8gQ0xPQ0tfVElDS19SQVRFOworCisJLyogRW5hYmxlIFBlcmlvZCBJbnRlcnZhbCBUaW1lciBpbnRlcnJ1cHQgKi8KKwlhdDkxX3N5c193cml0ZShBVDkxX1NUX0lFUiwgQVQ5MV9TVF9QSVRTKTsKK30KKworc3RydWN0IHN5c190aW1lciBhdDkxcm05MjAwX3RpbWVyID0geworCS5pbml0CQk9IGF0OTFybTkyMDBfdGltZXJfaW5pdCwKKwkub2Zmc2V0CQk9IGF0OTFybTkyMDBfZ2V0dGltZW9mZnNldCwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2F1dGNwdTEyLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2F1dGNwdTEyLmMKaW5kZXggNDNiOTQyMy4uYzEzY2E2YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9hdXRjcHUxMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvYXV0Y3B1MTIuYwpAQCAtNjQsNyArNjQsNiBAQAogCiBNQUNISU5FX1NUQVJUKEFVVENQVTEyLCAiYXV0cm9uaXggYXV0Y3B1MTIiKQogCS8qIE1haW50YWluZXI6IFRob21hcyBHbGVpeG5lciAqLwotCS5waHlzX3JhbQk9IDB4YzAwMDAwMDAsCiAJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAogCS5pb19wZ19vZmZzdAk9ICgoMHhmZjAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4YzAwMjAwMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NkYjg5NzEyLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NkYjg5NzEyLmMKaW5kZXggY2JhN2JlNS4uODMxZGYwMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jZGI4OTcxMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2RiODk3MTIuYwpAQCAtNTUsNyArNTUsNiBAQAogCiBNQUNISU5FX1NUQVJUKENEQjg5NzEyLCAiQ2lycnVzLUNEQjg5NzEyIikKIAkvKiBNYWludGFpbmVyOiBSYXkgTGVodGluaWVtaSAqLwotCS5waHlzX3JhbQk9IDB4YzAwMDAwMDAsCiAJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAogCS5pb19wZ19vZmZzdAk9ICgoMHhmZjAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NlaXZhLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NlaXZhLmMKaW5kZXggMzVkNTFhNy4uZTJiMmM1YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jZWl2YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2VpdmEuYwpAQCAtNTYsNyArNTYsNiBAQAogCiBNQUNISU5FX1NUQVJUKENFSVZBLCAiQ0VJVkEvUG9sYXJvaWQgUGhvdG8gTUFYIERpZ2l0YWwgUGljdHVyZSBGcmFtZSIpCiAJLyogTWFpbnRhaW5lcjogUm9iIFNjb3R0ICovCi0JLnBoeXNfcmFtCT0gMHhjMDAwMDAwMCwKIAkucGh5c19pbwk9IDB4ODAwMDAwMDAsCiAJLmlvX3BnX29mZnN0CT0gKCgweGZmMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2xlcDczMTIuYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2xlcDczMTIuYwppbmRleCBjODNmM2ZkLi4wOWZiNTdlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NsZXA3MzEyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jbGVwNzMxMi5jCkBAIC0zOCw3ICszOCw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoQ0xFUDcyMTIsICJDaXJydXMgTG9naWMgNzIxMi83MzEyIikKIAkvKiBNYWludGFpbmVyOiBOb2JvZHkgKi8KLQkucGh5c19yYW0JPSAweGMwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmYwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9kbWEuYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZG1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNWE0ZGUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9kbWEuYworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiAgbGludXgvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9kbWEuYwotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDAgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvZG1hLmg+Ci0KLXZvaWQgX19pbml0IGFyY2hfZG1hX2luaXQoZG1hX3QgKmRtYSkKLXsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZWRiNzIxMS1hcmNoLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2VkYjcyMTEtYXJjaC5jCmluZGV4IDI1NWM5OGIuLmRjODFjYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZWRiNzIxMS1hcmNoLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9lZGI3MjExLWFyY2guYwpAQCAtNTIsNyArNTIsNiBAQAogCiBNQUNISU5FX1NUQVJUKEVEQjcyMTEsICJDTC1FREI3MjExIChFUDcyMTEgZXZhbCBib2FyZCkiKQogCS8qIE1haW50YWluZXI6IEpvbiBNY0NsaW50b2NrICovCi0JLnBoeXNfcmFtCT0gMHhjMDAwMDAwMCwKIAkucGh5c19pbwk9IDB4ODAwMDAwMDAsCiAJLmlvX3BnX29mZnN0CT0gKCgweGZmMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHhjMDAyMDEwMCwJLyogMHhjMDAwMDAwMCAtIDB4YzAwMWZmZmYgY2FuIGJlIHZpZGVvIFJBTSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9mb3J0dW5ldC5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9mb3J0dW5ldC5jCmluZGV4IDNkODhkYTAuLmZmMjZhODUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZm9ydHVuZXQuYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2ZvcnR1bmV0LmMKQEAgLTc4LDcgKzc4LDYgQEAKIAogTUFDSElORV9TVEFSVChGT1JUVU5FVCwgIkFSTS1Gb3J0dU5ldCIpCiAJLyogTWFpbnRhaW5lcjogRm9ydHVOZXQgSW5jLiAqLwotCS5waHlzX3JhbQk9IDB4YzAwMDAwMDAsCiAJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAogCS5pb19wZ19vZmZzdAk9ICgoMHhmMDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4MDAwMDAwMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L3A3MjB0LmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L3A3MjB0LmMKaW5kZXggYTFhY2I5NC4uOWJhNDVmNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9wNzIwdC5jCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvcDcyMHQuYwpAQCAtOTAsNyArOTAsNiBAQAogCiBNQUNISU5FX1NUQVJUKFA3MjBULCAiQVJNLVByb3NwZWN0b3I3MjBUIikKIAkvKiBNYWludGFpbmVyOiBBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkICovCi0JLnBoeXNfcmFtCT0gMHhjMDAwMDAwMCwKIAkucGh5c19pbwk9IDB4ODAwMDAwMDAsCiAJLmlvX3BnX29mZnN0CT0gKCgweGZmMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9jb3JlLmMKaW5kZXggZDg2OWFmMC4uNWIxMmNhYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9jb3JlLmMKQEAgLTM4NCw3ICszODQsNiBAQAogCiBNQUNISU5FX1NUQVJUKENMUFM3NTAwLCAiQ0wtUFM3NTAwIikKIAkvKiBNYWludGFpbmVyOiBQaGlsaXAgQmx1bmRlbGwgKi8KLQkucGh5c19yYW0JPSAweDEwMDAwMDAwLAogCS5waHlzX2lvCT0gMHgwMzAwMDAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZTAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkubWFwX2lvCQk9IGNscHM3NTAwX21hcF9pbywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZWJzYTExMC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWVic2ExMTAvY29yZS5jCmluZGV4IGVkNDYxNDkuLjZkNjIwZDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZWJzYTExMC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2NvcmUuYwpAQCAtMjg0LDcgKzI4NCw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoRUJTQTExMCwgIkVCU0ExMTAiKQogCS8qIE1haW50YWluZXI6IFJ1c3NlbGwgS2luZyAqLwotCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCiAJLnBoeXNfaW8JPSAweGUwMDAwMDAwLAogCS5pb19wZ19vZmZzdAk9ICgoMHhlMDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4MDAwMDA0MDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVweGExMGRiL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWVweGExMGRiL0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZDg5NmQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotaWYgQVJDSF9DQU1FTE9UCi0KLW1lbnUgIkVweGExMGRiIgotCi1jb21tZW50ICJQTEQgaG90c3dhcCBzdXBwb3J0IgotCi1jb25maWcgUExECi0JYm9vbAotCWRlZmF1bHQgeQotCi1jb25maWcgUExEX0hPVFNXQVAKLQlib29sICJTdXBwb3J0IGZvciBQTEQgZGV2aWNlIGhvdHBsdWdnaW5nIChleHBlcmltZW50YWwpIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCi0JaGVscAotCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBkeW5hbWljIGxvYWRpbmcgYW5kIGNvbmZpZ3VyYXRpb24gb2YKLQkgIGNvbXBhdGlibGUgZHJpdmVycyB3aGVuIHRoZSBjb250ZW50cyBvZiB0aGUgUExEIGFyZSBjaGFuZ2VkLiBUaGlzCi0JICBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIHJlcXVpcmVzIGNvbmZpZ3VyYXRpb24gdG9vbHMgd2hpY2ggYXJlCi0JICBub3QgeWV0IGdlbmVyYWxseSBhdmFpbGFibGUuIFNheSBOIGhlcmUuIFlvdSBtdXN0IGVuYWJsZSB0aGUga2VybmVsCi0JICBtb2R1bGUgbG9hZGVyIGZvciB0aGlzIGZlYXR1cmUgdG8gd29yay4KLQotZW5kbWVudQotCi1lbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZmJkN2QuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCi0jCi0KLSMgT2JqZWN0IGZpbGUgbGlzdHMuCi0KLW9iai15CQkJOj0gYXJjaC5vIGlycS5vIG1tLm8gdGltZS5vIAotb2JqLW0JCQk6PQotb2JqLW4JCQk6PQotb2JqLQkJCTo9Ci0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvTWFrZWZpbGUuYm9vdCBiL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvTWFrZWZpbGUuYm9vdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiZWM3ZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWVweGExMGRiL01ha2VmaWxlLmJvb3QKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSAgIHpyZWxhZGRyLXkJOj0gMHgwMDAwODAwMAotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVweGExMGRiL2FyY2guYyBiL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvYXJjaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGM1NjU3Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvYXJjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL2FybS9tYWNoLWVweGExMGRiL2FyY2guYwotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDAgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDEgQWx0ZXJhIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KLQotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgc2VyaWFsX3BsYXRmb3JtX2RhdGFbXSA9IHsKLQl7Ci0JCS5pb2Jhc2UJCT0gMHgzZjgsCi0JCS5pcnEJCT0gSVJRX1VBUlRJTlQwLAotI2Vycm9yIEZJWE1FCi0JCS51YXJ0Y2xrCT0gMCwKLQkJLnJlZ3NoaWZ0CT0gMCwKLQkJLmlvdHlwZQkJPSBVUElPX1BPUlQsCi0JCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QsCi0JfSwKLQl7Ci0JCS5pb2Jhc2UJCT0gMHgyZjgsCi0JCS5pcnEJCT0gSVJRX1VBUlRJTlQxLAotI2Vycm9yIEZJWE1FCi0JCS51YXJ0Y2xrCT0gMCwKLQkJLnJlZ3NoaWZ0CT0gMCwKLQkJLmlvdHlwZQkJPSBVUElPX1BPUlQsCi0JCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QsCi0JfSwKLQl7IH0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZXJpYWxfZGV2aWNlID0gewotCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCi0JLmlkCQkJPSBQTEFUODI1MF9ERVZfUExBVEZPUk0sCi0JLmRldgkJCT0gewotCQkucGxhdGZvcm1fZGF0YQk9IHNlcmlhbF9wbGF0Zm9ybV9kYXRhLAotCX0sCi19OwotCi1leHRlcm4gdm9pZCBlcHhhMTBkYl9tYXBfaW8odm9pZCk7Ci1leHRlcm4gdm9pZCBlcHhhMTBkYl9pbml0X2lycSh2b2lkKTsKLWV4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIGVweGExMGRiX3RpbWVyOwotCi1NQUNISU5FX1NUQVJUKENBTUVMT1QsICJBbHRlcmEgRXB4YTEwZGIiKQotCS8qIE1haW50YWluZXI6IEFsdGVyYSBDb3Jwb3JhdGlvbiAqLwotCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCi0JLnBoeXNfaW8JPSAweDdmZmZjMDAwLAotCS5pb19wZ19vZmZzdAk9ICgoMHhmZmZmYzAwMCkgPj4gMTgpICYgMHhmZmZjLAotCS5tYXBfaW8JCT0gZXB4YTEwZGJfbWFwX2lvLAotCS5pbml0X2lycQk9IGVweGExMGRiX2luaXRfaXJxLAotCS50aW1lcgkJPSAmZXB4YTEwZGJfdGltZXIsCi1NQUNISU5FX0VORAotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVweGExMGRiL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi9kbWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE1MWU5Zi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWVweGExMGRiL2RtYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL2FybS9tYWNoLWVweGExMGRiL2RtYS5jCi0gKgotICogIENvcHlyaWdodCAoQykgMTk5OSBBUk0gTGltaXRlZAotICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9kbWEuaD4KLQotdm9pZCBfX2luaXQgYXJjaF9kbWFfaW5pdChkbWFfdCAqZG1hKQotewotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi9pcnEuYyBiL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvaXJxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZjkyN2UuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi9pcnEuYworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiAgbGludXgvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi9pcnEuYwotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDEgQWx0ZXJhIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2ludF9jdHJsMDAuaD4KLQotCi1zdGF0aWMgdm9pZCBlcHhhX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0gICAgICAgIHdyaXRlbCgxIDw8IGlycSwgSU5UX01DKElPX0FERFJFU1MoRVhDX0lOVF9DVFJMMDBfQkFTRSkpKTsKLX0KLQotc3RhdGljIHZvaWQgZXB4YV91bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0gICAgICAgIHdyaXRlbCgxIDw8IGlycSwgSU5UX01TKElPX0FERFJFU1MoRVhDX0lOVF9DVFJMMDBfQkFTRSkpKTsKLX0KLSAKLQotc3RhdGljIHN0cnVjdCBpcnFjaGlwIGVweGFfaXJxX2NoaXAgPSB7Ci0JLmFjawkJPSBlcHhhX21hc2tfaXJxLAotCS5tYXNrCQk9IGVweGFfbWFza19pcnEsCi0JLnVubWFzawkJPSBlcHhhX3VubWFza19pcnEsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGlycV9yZXNvdXJjZSA9IHsKLQkubmFtZQk9ICJpcnFfaGFuZGxlciIsCi0JLnN0YXJ0CT0gSU9fQUREUkVTUyhFWENfSU5UX0NUUkwwMF9CQVNFKSwKLQkuZW5kCT0gSU9fQUREUkVTUyhJTlRfUFJJT1JJVFlfRkMoRVhDX0lOVF9DVFJMMDBfQkFTRSkpKzQsCi19OwotCi12b2lkIF9faW5pdCBlcHhhMTBkYl9pbml0X2lycSh2b2lkKQotewotCXVuc2lnbmVkIGludCBpOwotCQotCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmaXJxX3Jlc291cmNlKTsKLQotCS8qCi0JICogVGhpcyBiaXQgc2V0cyB1cCB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgdXNpbmcgCi0JICogdGhlIDYgUExEIGludGVycnVwdHMgbW9kZSAodGhlIGRlZmF1bHQpIGVhY2ggCi0JICogaXJxcyBpcyBhc3NpZ25lZCBhIHByaW9yaXR5IHdoaWNoIGlzIHRoZSBzYW1lCi0JICogYXMgaXRzIGludGVycnVwdCBudW1iZXIuIFRoaXMgc2NoZW1lIGlzIHVzZWQgYmVjYXVzZSAKLQkgKiBpdHMgZWFzeSwgYnV0IHlvdSBtYXkgd2FudCB0byBjaGFuZ2UgaXQgZGVwZW5kaW5nCi0JICogb24gdGhlIGNvbnRlbnRzIG9mIHlvdXIgUExECi0JICovCi0KLQl3cml0ZWwoMyxJTlRfTU9ERShJT19BRERSRVNTKEVYQ19JTlRfQ1RSTDAwX0JBU0UpKSk7Ci0JZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKyl7Ci0JCXdyaXRlbChpKzEsIElOVF9QUklPUklUWV9QMChJT19BRERSRVNTKEVYQ19JTlRfQ1RSTDAwX0JBU0UpKSArICg0KmkpKTsKLQkJc2V0X2lycV9jaGlwKGksJmVweGFfaXJxX2NoaXApOwotCQlzZXRfaXJxX2hhbmRsZXIoaSxkb19sZXZlbF9JUlEpOwotCQlzZXRfaXJxX2ZsYWdzKGksIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKLQl9Ci0KLQkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCi0Jd3JpdGVsKC0xLElOVF9NQyhJT19BRERSRVNTKEVYQ19JTlRfQ1RSTDAwX0JBU0UpKSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvbW0uYyBiL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvbW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZkMGQyMS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWVweGExMGRiL21tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvbW0uYwotICoKLSAqICBNTSByb3V0aW5lcyBmb3IgQWx0ZXJhJ2EgRXB4YTEwZGIgYm9hcmQKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAxIEFsdGVyYSBDb3Jwb3JhdGlvbgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9zaXplcy5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0gCi0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0KLS8qIFBhZ2UgdGFibGUgbWFwcGluZyBmb3IgSS9PIHJlZ2lvbiAqLwotIAotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBlcHhhMTBkYl9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhFWENfUkVHSVNURVJTX0JBU0UpLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhDX1JFR0lTVEVSU19CQVNFKSwKLQkJLmxlbmd0aAkJPSBTWl8xNkssCi0JCS50eXBlCQk9IE1UX0RFVklDRQotCX0sIHsKLQkJLnZpcnR1YWwJPSBJT19BRERSRVNTKEVYQ19QTERfQkxPQ0swX0JBU0UpLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhDX1BMRF9CTE9DSzBfQkFTRSksCi0JCS5sZW5ndGgJCT0gU1pfMTZLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhFWENfUExEX0JMT0NLMV9CQVNFKSwKLQkJLnBmbgkJPV9fcGh5c190b19wZm4oRVhDX1BMRF9CTE9DSzFfQkFTRSksCi0JCS5sZW5ndGgJCT0gU1pfMTZLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhFWENfUExEX0JMT0NLMl9CQVNFKSwKLQkJLnBoeXNpY2FsCT0gX19waHlzX3RvX3BmbihFWENfUExEX0JMT0NLMl9CQVNFKSwKLQkJLmxlbmd0aAkJPSBTWl8xNkssCi0JCS50eXBlCQk9IE1UX0RFVklDRQotCX0sIHsKLQkJLnZpcnR1YWwJPSBJT19BRERSRVNTKEVYQ19QTERfQkxPQ0szX0JBU0UpLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhDX1BMRF9CTE9DSzNfQkFTRSksCi0JCS5sZW5ndGgJCT0gU1pfMTZLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gRkxBU0hfVkFERFIoRVhDX0VCSV9CTE9DSzBfQkFTRSksCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihFWENfRUJJX0JMT0NLMF9CQVNFKSwKLQkJLmxlbmd0aAkJPSBTWl8xNk0sCi0JCS50eXBlCQk9IE1UX0RFVklDRQotCX0KLX07Ci0KLXZvaWQgX19pbml0IGVweGExMGRiX21hcF9pbyh2b2lkKQotewotCWlvdGFibGVfaW5pdChlcHhhMTBkYl9pb19kZXNjLCBBUlJBWV9TSVpFKGVweGExMGRiX2lvX2Rlc2MpKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi90aW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMTA4NGQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi90aW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvdGltZS5jCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAxIEFsdGVyYSBDb3Jwb3JhdGlvbgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLQotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vbGVkcy5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgotCi0jZGVmaW5lIFRJTUVSMDBfVFlQRSAodm9sYXRpbGUgdW5zaWduZWQgaW50KikKLSNpbmNsdWRlIDxhc20vYXJjaC90aW1lcjAwLmg+Ci0KLXN0YXRpYyBpbnQgZXB4YTEwZGJfc2V0X3J0Yyh2b2lkKQotewotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGVweGExMGRiX3J0Y19pbml0KHZvaWQpCi17Ci0Jc2V0X3J0YyA9IGVweGExMGRiX3NldF9ydGM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotX19pbml0Y2FsbChlcHhhMTBkYl9ydGNfaW5pdCk7Ci0KLQotLyoKLSAqIElSUSBoYW5kbGVyIGZvciB0aGUgdGltZXIKLSAqLwotc3RhdGljIGlycXJldHVybl90Ci1lcHhhMTBkYl90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKLQotCS8vIC4uLmNsZWFyIHRoZSBpbnRlcnJ1cHQKLQkqVElNRVIwX0NSKElPX0FERFJFU1MoRVhDX1RJTUVSMDBfQkFTRSkpfD1USU1FUjBfQ1JfQ0lfTVNLOwotCi0JdGltZXJfdGljayhyZWdzKTsKLQl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBlcHhhMTBkYl90aW1lcl9pcnEgPSB7Ci0JLm5hbWUJCT0gIkV4Y2FsaWJ1ciBUaW1lciBUaWNrIiwKLQkuZmxhZ3MJCT0gU0FfSU5URVJSVVBUIHwgU0FfVElNRVIsCi0JLmhhbmRsZXIJPSBlcHhhMTBkYl90aW1lcl9pbnRlcnJ1cHQsCi19OwotCi0vKgotICogU2V0IHVwIHRpbWVyIGludGVycnVwdCwgYW5kIHJldHVybiB0aGUgY3VycmVudCB0aW1lIGluIHNlY29uZHMuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBlcHhhMTBkYl90aW1lcl9pbml0KHZvaWQpCi17Ci0JLyogU3RhcnQgdGhlIHRpbWVyICovCi0JKlRJTUVSMF9MSU1JVChJT19BRERSRVNTKEVYQ19USU1FUjAwX0JBU0UpKT0odW5zaWduZWQgaW50KShFWENfQUhCMl9DTEtfRlJFUVVFTkNZLzIwMCk7Ci0JKlRJTUVSMF9QUkVTQ0FMRShJT19BRERSRVNTKEVYQ19USU1FUjAwX0JBU0UpKT0xOwotCSpUSU1FUjBfQ1IoSU9fQUREUkVTUyhFWENfVElNRVIwMF9CQVNFKSk9VElNRVIwX0NSX0lFX01TSyB8IFRJTUVSMF9DUl9TX01TSzsKLQotCXNldHVwX2lycShJUlFfVElNRVIwLCAmZXB4YTEwZGJfdGltZXJfaXJxKTsKLX0KLQotc3RydWN0IHN5c190aW1lciBlcHhhMTBkYl90aW1lciA9IHsKLQkuaW5pdAkJPSBlcHhhMTBkYl90aW1lcl9pbml0LAotfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jYXRzLWh3LmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY2F0cy1ody5jCmluZGV4IDQ5Yjg5OGEuLjViNjRkNWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jYXRzLWh3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NhdHMtaHcuYwpAQCAtODUsNyArODUsNiBAQAogCiBNQUNISU5FX1NUQVJUKENBVFMsICJDaGFsaWNlLUNBVFMiKQogCS8qIE1haW50YWluZXI6IFBoaWxpcCBCbHVuZGVsbCAqLwotCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCiAJLnBoeXNfaW8JPSBEQzIxMjg1X0FSTUNTUl9CQVNFLAogCS5pb19wZ19vZmZzdAk9ICgoMHhmZTAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY28yODUuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jbzI4NS5jCmluZGV4IDU0OGE3OTAuLjQ1NDU1NzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jbzI4NS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jbzI4NS5jCkBAIC0yOSw3ICsyOSw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoQ08yODUsICJjby1FQlNBMjg1IikKIAkvKiBNYWludGFpbmVyOiBNYXJrIHZhbiBEb2VzYnVyZyAqLwotCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCiAJLnBoeXNfaW8JPSBEQzIxMjg1X0FSTUNTUl9CQVNFLAogCS5pb19wZ19vZmZzdAk9ICgoMHg3Y2YwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5maXh1cAkJPSBmaXh1cF9jb2Vic2EyODUsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZG1hLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZG1hLmMKaW5kZXggYTZiMTM5Ni4uN2E1NDU3OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kbWEuYwpAQCAtMTUsNiArMTUsNyBAQAogCiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2RlYzIxMjg1Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZWJzYTI4NS5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2Vic2EyODUuYwppbmRleCAxYzM3NjA1Li5iMWQzYmYyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZWJzYTI4NS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9lYnNhMjg1LmMKQEAgLTE0LDcgKzE0LDYgQEAKIAogTUFDSElORV9TVEFSVChFQlNBMjg1LCAiRUJTQTI4NSIpCiAJLyogTWFpbnRhaW5lcjogUnVzc2VsbCBLaW5nICovCi0JLnBoeXNfcmFtCT0gMHgwMDAwMDAwMCwKIAkucGh5c19pbwk9IERDMjEyODVfQVJNQ1NSX0JBU0UsCiAJLmlvX3BnX29mZnN0CT0gKCgweGZlMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9uZXR3aW5kZXItaHcuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9uZXR3aW5kZXItaHcuYwppbmRleCA3NzVmODVmLi4yMjliZjA1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvbmV0d2luZGVyLWh3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL25ldHdpbmRlci1ody5jCkBAIC02MDEsNiArNjAxLDcgQEAKIEVYUE9SVF9TWU1CT0woZ3Bpb19tb2RpZnlfb3ApOwogRVhQT1JUX1NZTUJPTChncGlvX21vZGlmeV9pbyk7CiBFWFBPUlRfU1lNQk9MKGNwbGRfbW9kaWZ5KTsKK0VYUE9SVF9TWU1CT0woZ3Bpb19yZWFkKTsKIAogLyoKICAqIEluaXRpYWxpc2UgYW55IG90aGVyIGhhcmR3YXJlIGFmdGVyIHdlJ3ZlIGdvdCB0aGUgUENJIGJ1cwpAQCAtNjQ4LDcgKzY0OSw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoTkVUV0lOREVSLCAiUmViZWwtTmV0V2luZGVyIikKIAkvKiBNYWludGFpbmVyOiBSdXNzZWxsIEtpbmcvUmViZWwuY29tICovCi0JLnBoeXNfcmFtCT0gMHgwMDAwMDAwMCwKIAkucGh5c19pbwk9IERDMjEyODVfQVJNQ1NSX0JBU0UsCiAJLmlvX3BnX29mZnN0CT0gKCgweGZlMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9wZXJzb25hbC5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3BlcnNvbmFsLmMKaW5kZXggMDE0NmI4Yi4uYzRmODQzZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3BlcnNvbmFsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3BlcnNvbmFsLmMKQEAgLTE0LDcgKzE0LDYgQEAKIAogTUFDSElORV9TVEFSVChQRVJTT05BTF9TRVJWRVIsICJDb21wYXEtUGVyc29uYWxTZXJ2ZXIiKQogCS8qIE1haW50YWluZXI6IEphbWV5IEhpY2tzIC8gR2VvcmdlIEZyYW5jZSAqLwotCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCiAJLnBoeXNfaW8JPSBEQzIxMjg1X0FSTUNTUl9CQVNFLAogCS5pb19wZ19vZmZzdAk9ICgoMHhmZTAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAxLWV2YWwuYyBiL2FyY2gvYXJtL21hY2gtaDcyMHgvaDcyMDEtZXZhbC5jCmluZGV4IGZhNTllOWUuLjE5M2Y5NjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaDcyMHgvaDcyMDEtZXZhbC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaDcyMHgvaDcyMDEtZXZhbC5jCkBAIC0zMSw3ICszMSw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoSDcyMDEsICJIeW5peCBHTVMzMEM3MjAxIikKIAkvKiBNYWludGFpbmVyOiBSb2JlcnQgU2Nod2ViZWwsIFBlbmd1dHJvbml4ICovCi0JLnBoeXNfcmFtCT0gMHg0MDAwMDAwMCwKIAkucGh5c19pbwk9IDB4ODAwMDAwMDAsCiAJLmlvX3BnX29mZnN0CT0gKCgweGYwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHhjMDAwMTAwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaDcyMHgvaDcyMDItZXZhbC5jIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMi1ldmFsLmMKaW5kZXggZDc1YzgyMi4uMzYyNjY4OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMi1ldmFsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMi1ldmFsLmMKQEAgLTcyLDcgKzcyLDYgQEAKIAogTUFDSElORV9TVEFSVChINzIwMiwgIkh5bml4IEhNUzMwQzcyMDIiKQogCS8qIE1haW50YWluZXI6IFJvYmVydCBTY2h3ZWJlbCwgUGVuZ3V0cm9uaXggKi8KLQkucGh5c19yYW0JPSAweDQwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDQwMDAwMTAwLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbXgxYWRzLmMgYi9hcmNoL2FybS9tYWNoLWlteC9teDFhZHMuYwppbmRleCA3MDhlMWIzLi5kYzMxZTNmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9teDFhZHMuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9teDFhZHMuYwpAQCAtMjksMjcgKzI5LDI3IEBACiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgPGFzbS9zZXJpYWwuaD4KIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteDFhZHNfcmVzb3VyY2VzW10gPSB7CitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNzODl4MF9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7Ci0JCS5zdGFydAk9IElNWF9DUzRfVklSVCwKLQkJLmVuZAk9IElNWF9DUzRfVklSVCArIDE2LAorCQkuc3RhcnQJPSBJTVhfQ1M0X1BIWVMgKyAweDMwMCwKKwkJLmVuZAk9IElNWF9DUzRfUEhZUyArIDB4MzAwICsgMTYsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0gewotCQkuc3RhcnQJPSAxMywKLQkJLmVuZAk9IDEzLAorCQkuc3RhcnQJPSBJUlFfR1BJT0MoMTcpLAorCQkuZW5kCT0gSVJRX0dQSU9DKDE3KSwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14MWFkc19kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gIm14MWFkcyIsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG14MWFkc19yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IG14MWFkc19yZXNvdXJjZXMsCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjczg5eDBfZGV2aWNlID0geworCS5uYW1lCQk9ICJjaXJydXMtY3M4OXgwIiwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoY3M4OXgwX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gY3M4OXgwX3Jlc291cmNlcywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmbXgxYWRzX2RldmljZSwKKwkmY3M4OXgwX2RldmljZSwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdApAQCAtNjEsNTAgKzYxLDE0IEBACiAJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgbXgxYWRzX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnZpcnR1YWwJPSBJTVhfQ1MwX1ZJUlQsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihJTVhfQ1MwX1BIWVMpLAotCQkubGVuZ3RoCQk9IElNWF9DUzBfU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFCi0JfSwgewotCQkudmlydHVhbAk9IElNWF9DUzFfVklSVCwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKElNWF9DUzFfUEhZUyksCi0JCS5sZW5ndGgJCT0gSU1YX0NTMV9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gSU1YX0NTMl9WSVJULAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oSU1YX0NTMl9QSFlTKSwKLQkJLmxlbmd0aAkJPSBJTVhfQ1MyX1NJWkUsCi0JCS50eXBlCQk9IE1UX0RFVklDRQotCX0sIHsKLQkJLnZpcnR1YWwJPSBJTVhfQ1MzX1ZJUlQsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihJTVhfQ1MzX1BIWVMpLAotCQkubGVuZ3RoCQk9IElNWF9DUzNfU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFCi0JfSwgewotCQkudmlydHVhbAk9IElNWF9DUzRfVklSVCwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKElNWF9DUzRfUEhZUyksCi0JCS5sZW5ndGgJCT0gSU1YX0NTNF9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gSU1YX0NTNV9WSVJULAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oSU1YX0NTNV9QSFlTKSwKLQkJLmxlbmd0aAkJPSBJTVhfQ1M1X1NJWkUsCi0JCS50eXBlCQk9IE1UX0RFVklDRQotCX0KLX07Ci0KIHN0YXRpYyB2b2lkIF9faW5pdAogbXgxYWRzX21hcF9pbyh2b2lkKQogewogCWlteF9tYXBfaW8oKTsKLQlpb3RhYmxlX2luaXQobXgxYWRzX2lvX2Rlc2MsIEFSUkFZX1NJWkUobXgxYWRzX2lvX2Rlc2MpKTsKIH0KIAogTUFDSElORV9TVEFSVChNWDFBRFMsICJNb3Rvcm9sYSBNWDFBRFMiKQogCS8qIE1haW50YWluZXI6IFNhc2NoYSBIYXVlciwgUGVuZ3V0cm9uaXggKi8KLQkucGh5c19yYW0JPSAweDA4MDAwMDAwLAogCS5waHlzX2lvCT0gMHgwMDIwMDAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZTAyMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDA4MDAwMTAwLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY2xvY2suYwppbmRleCA3M2MzNjA2Li45NWExZTI2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY2xvY2suYwpAQCAtMTQsMjggKzE0LDI5IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pY3N0NTI1Lmg+CiAKICNpbmNsdWRlICJjbG9jay5oIgogCiBzdGF0aWMgTElTVF9IRUFEKGNsb2Nrcyk7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWChjbG9ja3Nfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgoY2xvY2tzX211dGV4KTsKIAogc3RydWN0IGNsayAqY2xrX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmlkKQogewogCXN0cnVjdCBjbGsgKnAsICpjbGsgPSBFUlJfUFRSKC1FTk9FTlQpOwogCi0JZG93bigmY2xvY2tzX3NlbSk7CisJbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbG9ja3MsIG5vZGUpIHsKIAkJaWYgKHN0cmNtcChpZCwgcC0+bmFtZSkgPT0gMCAmJiB0cnlfbW9kdWxlX2dldChwLT5vd25lcikpIHsKIAkJCWNsayA9IHA7CiAJCQlicmVhazsKIAkJfQogCX0KLQl1cCgmY2xvY2tzX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwogCiAJcmV0dXJuIGNsazsKIH0KQEAgLTU4LDE3ICs1OSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGNsa19kaXNhYmxlKTsKIAotaW50IGNsa191c2Uoc3RydWN0IGNsayAqY2xrKQotewotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChjbGtfdXNlKTsKLQotdm9pZCBjbGtfdW51c2Uoc3RydWN0IGNsayAqY2xrKQotewotfQotRVhQT1JUX1NZTUJPTChjbGtfdW51c2UpOwotCiB1bnNpZ25lZCBsb25nIGNsa19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCiB7CiAJcmV0dXJuIGNsay0+cmF0ZTsKQEAgLTExOCwxOCArMTA4LDE4IEBACiAKIGludCBjbGtfcmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKQogewotCWRvd24oJmNsb2Nrc19zZW0pOworCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7CiAJbGlzdF9hZGQoJmNsay0+bm9kZSwgJmNsb2Nrcyk7Ci0JdXAoJmNsb2Nrc19zZW0pOworCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woY2xrX3JlZ2lzdGVyKTsKIAogdm9pZCBjbGtfdW5yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspCiB7Ci0JZG93bigmY2xvY2tzX3NlbSk7CisJbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKIAlsaXN0X2RlbCgmY2xrLT5ub2RlKTsKLQl1cCgmY2xvY2tzX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTChjbGtfdW5yZWdpc3Rlcik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY29yZS5jCmluZGV4IGRhY2JmNTAuLjIwMDcxYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NvcmUuYwpAQCAtMTUsMTEgKzE1LDExIEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hbWJhLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2FybV90aW1lci5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2NtLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2RtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWU2ZjIzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9kbWEuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiAgbGludXgvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2RtYS5jCi0gKgotICogIENvcHlyaWdodCAoQykgMTk5OSBBUk0gTGltaXRlZAotICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWFuLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoL2RtYS5oPgotCi12b2lkIF9faW5pdCBhcmNoX2RtYV9pbml0KGRtYV90ICpkbWEpCi17Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW1wZDEuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbXBkMS5jCmluZGV4IGE0YmFmZWUuLmE4NWQ0NzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbXBkMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbXBkMS5jCkBAIC0xOCwxMSArMTgsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL2NsY2QuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pY3N0NTI1Lmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2FtYmEuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYW1iYV9jbGNkLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvbG0uaD4KICNpbmNsdWRlIDxhc20vYXJjaC9pbXBkMS5oPgogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfYXAuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2FwLmMKaW5kZXggNGMwZjdjNjUuLmQ4ZDNjMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2FwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfYXAuYwpAQCAtMjUsNiArMjUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEva21pLmg+CiAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTMyLDggKzM0LDYgQEAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vcGFyYW0uaD4JCS8qIEhaICovCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYW1iYS5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hbWJhX2ttaS5oPgogCiAjaW5jbHVkZSA8YXNtL2FyY2gvbG0uaD4KIApAQCAtMzQ3LDcgKzM0Nyw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoSU5URUdSQVRPUiwgIkFSTS1JbnRlZ3JhdG9yIikKIAkvKiBNYWludGFpbmVyOiBBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkICovCi0JLnBoeXNfcmFtCT0gMHgwMDAwMDAwMCwKIAkucGh5c19pbwk9IDB4MTYwMDAwMDAsCiAJLmlvX3BnX29mZnN0CT0gKCgweGYxNjAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9jcC5jCmluZGV4IDkzZjdjY2IuLjMxODIwMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYwpAQCAtMTYsMTUgKzE2LDE1IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9rbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL2NsY2QuaD4KIAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hbWJhLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2FtYmFfa21pLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2FtYmFfY2xjZC5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pY3N0NTI1Lmg+CiAKICNpbmNsdWRlIDxhc20vYXJjaC9jbS5oPgpAQCAtNTc4LDcgKzU3OCw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoQ0lOVEVHUkFUT1IsICJBUk0tSW50ZWdyYXRvckNQIikKIAkvKiBNYWludGFpbmVyOiBBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkICovCi0JLnBoeXNfcmFtCT0gMHgwMDAwMDAwMCwKIAkucGh5c19pbwk9IDB4MTYwMDAwMDAsCiAJLmlvX3BnX29mZnN0CT0gKCgweGYxNjAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9sbS5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2xtLmMKaW5kZXggNWI0MWUzYS4uNjIyY2RjNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2xtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2xtLmMKQEAgLTIyLDIwICsyMiw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgbG1fYnVzdHlwZSA9IHsKLQkubmFtZQkJPSAibG9naWNtb2R1bGUiLAotCS5tYXRjaAkJPSBsbV9tYXRjaCwKLS8vCS5zdXNwZW5kCT0gbG1fc3VzcGVuZCwKLS8vCS5yZXN1bWUJCT0gbG1fcmVzdW1lLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbG1faW5pdCh2b2lkKQotewotCXJldHVybiBidXNfcmVnaXN0ZXIoJmxtX2J1c3R5cGUpOwotfQotCi1wb3N0Y29yZV9pbml0Y2FsbChsbV9pbml0KTsKLQogc3RhdGljIGludCBsbV9idXNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBsbV9kZXZpY2UgKmxtZGV2ID0gdG9fbG1fZGV2aWNlKGRldik7CkBAIC00OSwxNiArMzUsMzAgQEAKIAlzdHJ1Y3QgbG1fZGV2aWNlICpsbWRldiA9IHRvX2xtX2RldmljZShkZXYpOwogCXN0cnVjdCBsbV9kcml2ZXIgKmxtZHJ2ID0gdG9fbG1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAotCWxtZHJ2LT5yZW1vdmUobG1kZXYpOworCWlmIChsbWRydi0+cmVtb3ZlKQorCQlsbWRydi0+cmVtb3ZlKGxtZGV2KTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBidXNfdHlwZSBsbV9idXN0eXBlID0geworCS5uYW1lCQk9ICJsb2dpY21vZHVsZSIsCisJLm1hdGNoCQk9IGxtX21hdGNoLAorCS5wcm9iZQkJPSBsbV9idXNfcHJvYmUsCisJLnJlbW92ZQkJPSBsbV9idXNfcmVtb3ZlLAorLy8JLnN1c3BlbmQJPSBsbV9idXNfc3VzcGVuZCwKKy8vCS5yZXN1bWUJCT0gbG1fYnVzX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGxtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gYnVzX3JlZ2lzdGVyKCZsbV9idXN0eXBlKTsKK30KKworcG9zdGNvcmVfaW5pdGNhbGwobG1faW5pdCk7CisKIGludCBsbV9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGxtX2RyaXZlciAqZHJ2KQogewogCWRydi0+ZHJ2LmJ1cyA9ICZsbV9idXN0eXBlOwotCWRydi0+ZHJ2LnByb2JlID0gbG1fYnVzX3Byb2JlOwotCWRydi0+ZHJ2LnJlbW92ZSA9IGxtX2J1c19yZW1vdmU7Ci0KIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRydik7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci90aW1lLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvdGltZS5jCmluZGV4IDFhODQ0Y2EuLjNjMjJjMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL3RpbWUuYwpAQCAtMTQsOCArMTQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogCi0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2FtYmEuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtOTYsNyArOTYsOCBAQAogCS5zZXRfYWxhcm0JPSBydGNfc2V0X2FsYXJtLAogfTsKIAotc3RhdGljIGlycXJldHVybl90IHJ0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpcnFyZXR1cm5fdCBhcm1fcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl3cml0ZWwoMCwgcnRjX2Jhc2UgKyBSVENfRU9JKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC0xMjQsNyArMTI1LDcgQEAKIAogCXh0aW1lLnR2X3NlYyA9IF9fcmF3X3JlYWRsKHJ0Y19iYXNlICsgUlRDX0RSKTsKIAotCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxWzBdLCBydGNfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsCisJcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnFbMF0sIGFybV9ydGNfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsCiAJCQkgICJydGMtcGwwMzAiLCBkZXYpOwogCWlmIChyZXQpCiAJCWdvdG8gbWFwX291dDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMyMS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzIxLXNldHVwLmMKaW5kZXggODA3NzAyMy4uZTRmNGM1MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzIxLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzIxLXNldHVwLmMKQEAgLTE1MSw3ICsxNTEsNiBAQAogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfSVE4MDMyMSkKIE1BQ0hJTkVfU1RBUlQoSVE4MDMyMSwgIkludGVsIElRODAzMjEiKQogCS8qIE1haW50YWluZXI6IEludGVsIENvcnBvcmF0aW9uICovCi0JLnBoeXNfcmFtCT0gUEhZU19PRkZTRVQsCiAJLnBoeXNfaW8JPSBJUTgwMzIxX1VBUlQsCiAJLmlvX3BnX29mZnN0CT0gKChJUTgwMzIxX1VBUlQpID4+IDE4KSAmIDB4ZmZmYywKIAkubWFwX2lvCQk9IGlxODAzMjFfbWFwX2lvLApAQCAtMTYzLDcgKzE2Miw2IEBACiAjZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX0lRMzEyNDQpCiBNQUNISU5FX1NUQVJUKElRMzEyNDQsICJJbnRlbCBJUTMxMjQ0IikKIAkvKiBNYWludGFpbmVyOiBJbnRlbCBDb3JwLiAqLwotCS5waHlzX3JhbQk9IFBIWVNfT0ZGU0VULAogCS5waHlzX2lvCT0gSVEzMTI0NF9VQVJULAogCS5pb19wZ19vZmZzdAk9ICgoSVEzMTI0NF9VQVJUKSA+PiAxOCkgJiAweGZmZmMsCiAJLm1hcF9pbwkJPSBpcTMxMjQ0X21hcF9pbywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMzMS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzMxLXNldHVwLmMKaW5kZXggNTNmNjA2MS4uNjM1ODU0OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzMxLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzMxLXNldHVwLmMKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpAQCAtNTAsMzIgKzUwLDc0IEBACiAJfQogfTsKIAotc3RhdGljIHN0cnVjdCB1YXJ0X3BvcnQgaW9wMzMxX3NlcmlhbF9wb3J0c1tdID0gewotCXsKLQkJLm1lbWJhc2UJPSAoY2hhciopKElPUDMzMV9VQVJUMF9WSVJUKSwKLQkJLm1hcGJhc2UJPSAoSU9QMzMxX1VBUlQwX1BIWVMpLAotCQkuaXJxCQk9IElSUV9JT1AzMzFfVUFSVDAsCi0JCS5mbGFncwkJPSBVUEZfU0tJUF9URVNULAotCQkuaW90eXBlCQk9IFVQSU9fTUVNLAotCQkucmVnc2hpZnQJPSAyLAotCQkudWFydGNsawk9IElPUDMzMV9VQVJUX1hUQUwsCi0JCS5saW5lCQk9IDAsCi0JCS50eXBlCQk9IFBPUlRfWFNDQUxFLAotCQkuZmlmb3NpemUJPSAzMgotCX0gLCB7Ci0JCS5tZW1iYXNlCT0gKGNoYXIqKShJT1AzMzFfVUFSVDFfVklSVCksCi0JCS5tYXBiYXNlCT0gKElPUDMzMV9VQVJUMV9QSFlTKSwKLQkJLmlycQkJPSBJUlFfSU9QMzMxX1VBUlQxLAotCQkuZmxhZ3MJCT0gVVBGX1NLSVBfVEVTVCwKLQkJLmlvdHlwZQkJPSBVUElPX01FTSwKLQkJLnJlZ3NoaWZ0CT0gMiwKLQkJLnVhcnRjbGsJPSBJT1AzMzFfVUFSVF9YVEFMLAotCQkubGluZQkJPSAxLAotCQkudHlwZQkJPSBQT1JUX1hTQ0FMRSwKLQkJLmZpZm9zaXplCT0gMzIKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW9wMzN4X3VhcnQwX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gSU9QMzMxX1VBUlQwX1BIWVMsCisJCS5lbmQgPSBJT1AzMzFfVUFSVDBfUEhZUyArIDB4M2YsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBJUlFfSU9QMzMxX1VBUlQwLAorCQkuZW5kID0gSVJRX0lPUDMzMV9VQVJUMCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEKIAl9CiB9OwogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGlvcDMzeF91YXJ0MV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IElPUDMzMV9VQVJUMV9QSFlTLAorCQkuZW5kID0gSU9QMzMxX1VBUlQxX1BIWVMgKyAweDNmLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX0lPUDMzMV9VQVJUMSwKKwkJLmVuZCA9IElSUV9JT1AzMzFfVUFSVDEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBpb3AzM3hfdWFydDBfZGF0YVtdID0geworCXsKKyAgICAgICAubWVtYmFzZSAgICAgPSAoY2hhciopKElPUDMzMV9VQVJUMF9WSVJUKSwKKyAgICAgICAubWFwYmFzZSAgICAgPSAoSU9QMzMxX1VBUlQwX1BIWVMpLAorICAgICAgIC5pcnEgICAgICAgICA9IElSUV9JT1AzMzFfVUFSVDAsCisgICAgICAgLnVhcnRjbGsgICAgID0gSU9QMzMxX1VBUlRfWFRBTCwKKyAgICAgICAucmVnc2hpZnQgICAgPSAyLAorICAgICAgIC5pb3R5cGUgICAgICA9IFVQSU9fTUVNLAorICAgICAgIC5mbGFncyAgICAgICA9IFVQRl9TS0lQX1RFU1QsCisJfSwKKwl7ICB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBpb3AzM3hfdWFydDFfZGF0YVtdID0geworCXsKKyAgICAgICAubWVtYmFzZSAgICAgPSAoY2hhciopKElPUDMzMV9VQVJUMV9WSVJUKSwKKyAgICAgICAubWFwYmFzZSAgICAgPSAoSU9QMzMxX1VBUlQxX1BIWVMpLAorICAgICAgIC5pcnEgICAgICAgICA9IElSUV9JT1AzMzFfVUFSVDEsCisgICAgICAgLnVhcnRjbGsgICAgID0gSU9QMzMxX1VBUlRfWFRBTCwKKyAgICAgICAucmVnc2hpZnQgICAgPSAyLAorICAgICAgIC5pb3R5cGUgICAgICA9IFVQSU9fTUVNLAorICAgICAgIC5mbGFncyAgICAgICA9IFVQRl9TS0lQX1RFU1QsCisJfSwKKwl7ICB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW9wMzN4X3VhcnQwID0geworICAgICAgIC5uYW1lID0gInNlcmlhbDgyNTAiLAorICAgICAgIC5pZCA9IDAsCisgICAgICAgLmRldi5wbGF0Zm9ybV9kYXRhID0gaW9wMzN4X3VhcnQwX2RhdGEsCisgICAgICAgLm51bV9yZXNvdXJjZXMgPSAyLAorICAgICAgIC5yZXNvdXJjZSA9IGlvcDMzeF91YXJ0MF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpb3AzM3hfdWFydDEgPSB7CisgICAgICAgLm5hbWUgPSAic2VyaWFsODI1MCIsCisgICAgICAgLmlkID0gMSwKKyAgICAgICAuZGV2LnBsYXRmb3JtX2RhdGEgPSBpb3AzM3hfdWFydDFfZGF0YSwKKyAgICAgICAubnVtX3Jlc291cmNlcyA9IDIsCisgICAgICAgLnJlc291cmNlID0gaW9wMzN4X3VhcnQxX3Jlc291cmNlcywKK307CisKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW9wMzN4X2kyY18wX3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKIAkJLnN0YXJ0ID0gMHhmZmZmZjY4MCwKQEAgLTExNyw2ICsxNTksOCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmlvcDMzeF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmaW9wMzN4X3VhcnQwLAorCSZpb3AzM3hfdWFydDEsCiAJJmlvcDMzeF9pMmNfMF9jb250cm9sbGVyLAogCSZpb3AzM3hfaTJjXzFfY29udHJvbGxlcgogfTsKQEAgLTEzMyw4ICsxNzcsNiBAQAogdm9pZCBfX2luaXQgaW9wMzMxX21hcF9pbyh2b2lkKQogewogCWlvdGFibGVfaW5pdChpb3AzMzFfc3RkX2Rlc2MsIEFSUkFZX1NJWkUoaW9wMzMxX3N0ZF9kZXNjKSk7Ci0JZWFybHlfc2VyaWFsX3NldHVwKCZpb3AzMzFfc2VyaWFsX3BvcnRzWzBdKTsKLQllYXJseV9zZXJpYWxfc2V0dXAoJmlvcDMzMV9zZXJpYWxfcG9ydHNbMV0pOwogfQogCiAjaWZkZWYgQ09ORklHX0FSQ0hfSU9QMzMxCkBAIC0xNTMsNyArMTk1LDYgQEAKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX0lRODAzMzEpCiBNQUNISU5FX1NUQVJUKElRODAzMzEsICJJbnRlbCBJUTgwMzMxIikKIAkvKiBNYWludGFpbmVyOiBJbnRlbCBDb3JwLiAqLwotCS5waHlzX3JhbQk9IFBIWVNfT0ZGU0VULAogCS5waHlzX2lvCT0gMHhmZWZmZjAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmZmZmYwMDApID4+IDE4KSAmIDB4ZmZmYywgLy8gdmlydHVhbCwgcGh5c2ljYWwKIAkubWFwX2lvCQk9IGlxODAzMzFfbWFwX2lvLApAQCAtMTY2LDcgKzIwNyw2IEBACiAjZWxpZiBkZWZpbmVkKENPTkZJR19NQUNIX0lRODAzMzIpCiBNQUNISU5FX1NUQVJUKElRODAzMzIsICJJbnRlbCBJUTgwMzMyIikKIAkvKiBNYWludGFpbmVyOiBJbnRlbCBDb3JwLiAqLwotCS5waHlzX3JhbQk9IFBIWVNfT0ZGU0VULAogCS5waHlzX2lvCT0gMHhmZWZmZjAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmZmZmYwMDApID4+IDE4KSAmIDB4ZmZmYywgLy8gdmlydHVhbCwgcGh5c2ljYWwKIAkubWFwX2lvCQk9IGlxODAzMzJfbWFwX2lvLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9jb3JlLmMKaW5kZXggNjg1MWFiYS4uY2ZkNWJlZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvY29yZS5jCkBAIC0xMDYsNiArMTA2LDE2IEBACiAJCS5sZW5ndGgJCT0gSVhQMjAwMF9NU0ZfU0laRSwKIAkJLnR5cGUJCT0gTVRfSVhQMjAwMF9ERVZJQ0UsCiAJfSwgeworCQkudmlydHVhbAk9IElYUDIwMDBfU0NSQVRDSF9SSU5HX1ZJUlRfQkFTRSwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKElYUDIwMDBfU0NSQVRDSF9SSU5HX1BIWVNfQkFTRSksCisJCS5sZW5ndGgJCT0gSVhQMjAwMF9TQ1JBVENIX1JJTkdfU0laRSwKKwkJLnR5cGUJCT0gTVRfSVhQMjAwMF9ERVZJQ0UsCisJfSwgeworCQkudmlydHVhbAk9IElYUDIwMDBfU1JBTTBfVklSVF9CQVNFLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oSVhQMjAwMF9TUkFNMF9QSFlTX0JBU0UpLAorCQkubGVuZ3RoCQk9IElYUDIwMDBfU1JBTTBfU0laRSwKKwkJLnR5cGUJCT0gTVRfSVhQMjAwMF9ERVZJQ0UsCisJfSwgewogCQkudmlydHVhbAk9IElYUDIwMDBfUENJX0lPX1ZJUlRfQkFTRSwKIAkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKElYUDIwMDBfUENJX0lPX1BIWVNfQkFTRSksCiAJCS5sZW5ndGgJCT0gSVhQMjAwMF9QQ0lfSU9fU0laRSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9lbnAyNjExLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvZW5wMjYxMS5jCmluZGV4IDYxZjYwMDYuLjllNWExM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9lbnAyNjExLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2VucDI2MTEuYwpAQCAtMjU0LDcgKzI1NCw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoRU5QMjYxMSwgIlJhZGlzeXMgRU5QLTI2MTEgUENJIG5ldHdvcmsgcHJvY2Vzc29yIGJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4gKi8KLQkucGh5c19yYW0JPSAweDAwMDAwMDAwLAogCS5waHlzX2lvCT0gSVhQMjAwMF9VQVJUX1BIWVNfQkFTRSwKIAkuaW9fcGdfb2Zmc3QJPSAoKElYUDIwMDBfVUFSVF9WSVJUX0JBU0UpID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI0MDAuYwppbmRleCBmZDI4MGE5Li43Yzc4MjQwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI0MDAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI0MDAuYwpAQCAtMTY5LDcgKzE2OSw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoSVhEUDI0MDAsICJJbnRlbCBJWERQMjQwMCBEZXZlbG9wbWVudCBQbGF0Zm9ybSIpCiAJLyogTWFpbnRhaW5lcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAqLwotCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCiAJLnBoeXNfaW8JPSBJWFAyMDAwX1VBUlRfUEhZU19CQVNFLAogCS5pb19wZ19vZmZzdAk9ICgoSVhQMjAwMF9VQVJUX1ZJUlRfQkFTRSkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI4MDAuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jCmluZGV4IGY5MDczYWEuLjA3NmUzZjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jCkBAIC0yODUsNyArMjg1LDYgQEAKIAogTUFDSElORV9TVEFSVChJWERQMjgwMCwgIkludGVsIElYRFAyODAwIERldmVsb3BtZW50IFBsYXRmb3JtIikKIAkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICovCi0JLnBoeXNfcmFtCT0gMHgwMDAwMDAwMCwKIAkucGh5c19pbwk9IElYUDIwMDBfVUFSVF9QSFlTX0JBU0UsCiAJLmlvX3BnX29mZnN0CT0gKChJWFAyMDAwX1VBUlRfVklSVF9CQVNFKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMS5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAxLmMKaW5kZXggZTZhODgyZi4uMTBmMDY2MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAxLmMKQEAgLTM3Niw3ICszNzYsNiBAQAogI2lmZGVmIENPTkZJR19BUkNIX0lYRFAyNDAxCiBNQUNISU5FX1NUQVJUKElYRFAyNDAxLCAiSW50ZWwgSVhEUDI0MDEgRGV2ZWxvcG1lbnQgUGxhdGZvcm0iKQogCS8qIE1haW50YWluZXI6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gKi8KLQkucGh5c19yYW0JPSAweDAwMDAwMDAwLAogCS5waHlzX2lvCT0gSVhQMjAwMF9VQVJUX1BIWVNfQkFTRSwKIAkuaW9fcGdfb2Zmc3QJPSAoKElYUDIwMDBfVUFSVF9WSVJUX0JBU0UpID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLApAQCAtMzkwLDcgKzM4OSw2IEBACiAjaWZkZWYgQ09ORklHX0FSQ0hfSVhEUDI4MDEKIE1BQ0hJTkVfU1RBUlQoSVhEUDI4MDEsICJJbnRlbCBJWERQMjgwMSBEZXZlbG9wbWVudCBQbGF0Zm9ybSIpCiAJLyogTWFpbnRhaW5lcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAqLwotCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCiAJLnBoeXNfaW8JPSBJWFAyMDAwX1VBUlRfUEhZU19CQVNFLAogCS5pb19wZ19vZmZzdAk9ICgoSVhQMjAwMF9VQVJUX1ZJUlRfQkFTRSkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvS2NvbmZpZwppbmRleCAzODUyODU4Li5kYWFkYzc4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L0tjb25maWcKQEAgLTcxLDYgKzcxLDE0IEBACiAJICBQclBDTTExMDAgUHJvY2Vzc29yIE1lemFuaW5lIE1vZHVsZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24KIAkgIHRoaXMgcGxhdGZvcm0sIHNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2FybS9JWFA0eHg+LgogCitjb25maWcgTUFDSF9OQVMxMDBECisJYm9vbAorCXByb21wdCAiTkFTMTAwRCIKKwloZWxwCisJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCBJb21lZ2EncworCSAgTkFTIDEwMGQgZGV2aWNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIHBsYXRmb3JtLAorCSAgc2VlIGh0dHA6Ly93d3cubnNsdTItbGludXgub3JnL3dpa2kvTkFTMTAwZC9Ib21lUGFnZQorCiAjCiAjIEF2aWxhIGFuZCBJWERQIHNoYXJlIHRoZSBzYW1lIHNvdXJjZSBmb3Igbm93LiBXaWxsIGNoYW5nZSBpbiBmdXR1cmUKICMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvTWFrZWZpbGUKaW5kZXggN2ExNTYyOS4uMDQ3MTA0NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvTWFrZWZpbGUKQEAgLTksNCArOSw1IEBACiBvYmotJChDT05GSUdfQVJDSF9BRElfQ09ZT1RFKQkrPSBjb3lvdGUtcGNpLm8gY295b3RlLXNldHVwLm8KIG9iai0kKENPTkZJR19NQUNIX0dUV1g1NzE1KQkrPSBndHd4NTcxNS1wY2kubyBndHd4NTcxNS1zZXR1cC5vCiBvYmotJChDT05GSUdfTUFDSF9OU0xVMikJKz0gbnNsdTItcGNpLm8gbnNsdTItc2V0dXAubyBuc2x1Mi1wb3dlci5vCitvYmotJChDT05GSUdfTUFDSF9OQVMxMDBEKQkrPSBuYXMxMDBkLXBjaS5vIG5hczEwMGQtc2V0dXAubyBuYXMxMDBkLXBvd2VyLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLXBjaS5jCmluZGV4IDk3OTVkYTIuLjZlMzQ2MmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24tcGNpLmMKQEAgLTM0MSw2ICszNDEsMjkgQEAKIAlyZXR1cm4gKGRldi0+YnVzID09ICZwY2lfYnVzX3R5cGUgKSAmJiAoKGRtYV9hZGRyICsgc2l6ZSkgPj0gU1pfNjRNKTsKIH0KIAorLyoKKyAqIE9ubHkgZmlyc3QgNjRNQiBvZiBtZW1vcnkgY2FuIGJlIGFjY2Vzc2VkIHZpYSBQQ0kuCisgKiBXZSB1c2UgR0ZQX0RNQSB0byBhbGxvY2F0ZSBzYWZlIGJ1ZmZlcnMgdG8gZG8gbWFwL3VubWFwLgorICogVGhpcyBpcyByZWFsbHkgdWdseSBhbmQgd2UgbmVlZCBhIGJldHRlciB3YXkgb2Ygc3BlY2lmeWluZworICogRE1BLWNhcGFibGUgcmVnaW9ucyBvZiBtZW1vcnkuCisgKi8KK3ZvaWQgX19pbml0IGl4cDR4eF9hZGp1c3Rfem9uZXMoaW50IG5vZGUsIHVuc2lnbmVkIGxvbmcgKnpvbmVfc2l6ZSwKKwl1bnNpZ25lZCBsb25nICp6aG9sZV9zaXplKQoreworCXVuc2lnbmVkIGludCBzeiA9IFNaXzY0TSA+PiBQQUdFX1NISUZUOworCisJLyoKKwkgKiBPbmx5IGFkanVzdCBpZiA+IDY0TSBvbiBjdXJyZW50IHN5c3RlbQorCSAqLworCWlmIChub2RlIHx8ICh6b25lX3NpemVbMF0gPD0gc3opKQorCQlyZXR1cm47CisKKwl6b25lX3NpemVbMV0gPSB6b25lX3NpemVbMF0gLSBzejsKKwl6b25lX3NpemVbMF0gPSBzejsKKwl6aG9sZV9zaXplWzFdID0gemhvbGVfc2l6ZVswXTsKKwl6aG9sZV9zaXplWzBdID0gMDsKK30KKwogdm9pZCBfX2luaXQgaXhwNHh4X3BjaV9wcmVpbml0KHZvaWQpCiB7ICAKIAl1bnNpZ25lZCBsb25nIHByb2Nlc3Nvcl9pZDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMKaW5kZXggZjNjNjg3Yy4uNGJkYzlkNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMKQEAgLTE0Miw2ICsxNDIsOCBAQAogCSppbnRfcmVnICY9IH4oSVhQNFhYX0dQSU9fU1RZTEVfQ0xFQVIgPDwKIAkgICAgCQkobGluZSAqIElYUDRYWF9HUElPX1NUWUxFX1NJWkUpKTsKIAorCSpJWFA0WFhfR1BJT19HUElTUiA9ICgxIDw8IGxpbmUpOworCiAJLyogU2V0IHRoZSBuZXcgc3R5bGUgKi8KIAkqaW50X3JlZyB8PSAoaW50X3N0eWxlIDw8IChsaW5lICogSVhQNFhYX0dQSU9fU1RZTEVfU0laRSkpOwogCkBAIC0xNjksNyArMTcxLDcgQEAKIAlpbnQgbGluZSA9IChpcnEgPCAzMikgPyBpcnEyZ3Bpb1tpcnFdIDogLTE7CiAKIAlpZiAobGluZSA+PSAwKQotCQlncGlvX2xpbmVfaXNyX2NsZWFyKGxpbmUpOworCQkqSVhQNFhYX0dQSU9fR1BJU1IgPSAoMSA8PCBsaW5lKTsKIH0KIAogLyoKQEAgLTMzMCwxMSArMzMyLDI4IEBACiAJJml4cDQ2eF9pMmNfY29udHJvbGxlcgogfTsKIAordW5zaWduZWQgbG9uZyBpeHA0eHhfZXhwX2J1c19zaXplOworRVhQT1JUX1NZTUJPTChpeHA0eHhfZXhwX2J1c19zaXplKTsKKwogdm9pZCBfX2luaXQgaXhwNHh4X3N5c19pbml0KHZvaWQpCiB7CisJaXhwNHh4X2V4cF9idXNfc2l6ZSA9IFNaXzE2TTsKKwogCWlmIChjcHVfaXNfaXhwNDZ4KCkpIHsKKwkJaW50IHJlZ2lvbjsKKwogCQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhpeHA0NnhfZGV2aWNlcywKIAkJCQlBUlJBWV9TSVpFKGl4cDQ2eF9kZXZpY2VzKSk7CisKKwkJZm9yIChyZWdpb24gPSAwOyByZWdpb24gPCA3OyByZWdpb24rKykgeworCQkJaWYoKCooSVhQNFhYX0VYUF9SRUcoMHg0ICogcmVnaW9uKSkgJiAweDIwMCkpIHsKKwkJCQlpeHA0eHhfZXhwX2J1c19zaXplID0gU1pfMzJNOworCQkJCWJyZWFrOworCQkJfQorCQl9CiAJfQorCisJcHJpbnRrKCJJWFA0eHg6IFVzaW5nICVsdU1pQiBleHBhbnNpb24gYnVzIHdpbmRvdyBzaXplXG4iLAorCQkJaXhwNHh4X2V4cF9idXNfc2l6ZSA+PiAyMCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1wY2kuYwppbmRleCA2MGRlOGE5Li5lNmI3ZmNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXBjaS5jCkBAIC0zMyw5ICszMyw2IEBACiAJc2V0X2lycV90eXBlKElSUV9DT1lPVEVfUENJX1NMT1QwLCBJUlFUX0xPVyk7CiAJc2V0X2lycV90eXBlKElSUV9DT1lPVEVfUENJX1NMT1QxLCBJUlFUX0xPVyk7CiAKLQlncGlvX2xpbmVfaXNyX2NsZWFyKENPWU9URV9QQ0lfU0xPVDBfUElOKTsKLQlncGlvX2xpbmVfaXNyX2NsZWFyKENPWU9URV9QQ0lfU0xPVDFfUElOKTsKLQogCWl4cDR4eF9wY2lfcHJlaW5pdCgpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1zZXR1cC5jCmluZGV4IDA1MGM5MjcuLjEzZjhhN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1zZXR1cC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KQEAgLTMwLDggKzMxLDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY295b3RlX2ZsYXNoX3Jlc291cmNlID0gewotCS5zdGFydAkJPSBDT1lPVEVfRkxBU0hfQkFTRSwKLQkuZW5kCQk9IENPWU9URV9GTEFTSF9CQVNFICsgQ09ZT1RFX0ZMQVNIX1NJWkUgLSAxLAogCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKIH07CiAKQEAgLTgxLDYgKzgwLDExIEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBjb3lvdGVfaW5pdCh2b2lkKQogeworCWl4cDR4eF9zeXNfaW5pdCgpOworCisJY295b3RlX2ZsYXNoX3Jlc291cmNlLnN0YXJ0ID0gSVhQNFhYX0VYUF9CVVNfQkFTRSgwKTsKKwljb3lvdGVfZmxhc2hfcmVzb3VyY2UuZW5kID0gSVhQNFhYX0VYUF9CVVNfQkFTRSgwKSArIFNaXzMyTSAtIDE7CisKIAkqSVhQNFhYX0VYUF9DUzAgfD0gSVhQNFhYX0ZMQVNIX1dSSVRBQkxFOwogCSpJWFA0WFhfRVhQX0NTMSA9ICpJWFA0WFhfRVhQX0NTMDsKIApAQCAtOTEsMTUgKzk1LDEyIEBACiAJCWNveW90ZV91YXJ0X2RhdGFbMF0uaXJxID0gSVJRX0lYUDRYWF9VQVJUMTsKIAl9CiAKLQotCWl4cDR4eF9zeXNfaW5pdCgpOwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGNveW90ZV9kZXZpY2VzLCBBUlJBWV9TSVpFKGNveW90ZV9kZXZpY2VzKSk7CiB9CiAKICNpZmRlZiBDT05GSUdfQVJDSF9BRElfQ09ZT1RFCiBNQUNISU5FX1NUQVJUKEFESV9DT1lPVEUsICJBREkgRW5naW5lZXJpbmcgQ295b3RlIikKIAkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICovCi0JLnBoeXNfcmFtCT0gUEhZU19PRkZTRVQsCiAJLnBoeXNfaW8JPSBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1BIWVMsCiAJLmlvX3BnX29mZnN0CT0gKChJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKIAkubWFwX2lvCQk9IGl4cDR4eF9tYXBfaW8sCkBAIC0xMTcsNyArMTE4LDYgQEAKICNpZmRlZiBDT05GSUdfTUFDSF9JWERQRzQyNQogTUFDSElORV9TVEFSVChJWERQRzQyNSwgIkludGVsIElYRFBHNDI1IikKIAkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICovCi0JLnBoeXNfcmFtCT0gUEhZU19PRkZTRVQsCiAJLnBoeXNfaW8JPSBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1BIWVMsCiAJLmlvX3BnX29mZnN0CT0gKChJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKIAkubWFwX2lvCQk9IGl4cDR4eF9tYXBfaW8sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9ndHd4NTcxNS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ3R3eDU3MTUtc2V0dXAuYwppbmRleCAyOWE2ZDAyLi42NTRlMmVlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9ndHd4NTcxNS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXNldHVwLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgpAQCAtMTA2LDExICsxMDcsOSBAQAogCS53aWR0aAkJPSAyLAogfTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBndHd4NTcxNV9mbGFzaF9yZXNvdXJjZSA9IHsKLQkuc3RhcnQJCT0gR1RXWDU3MTVfRkxBU0hfQkFTRSwKLQkuZW5kCQk9IEdUV1g1NzE1X0ZMQVNIX0JBU0UgKyBHVFdYNTcxNV9GTEFTSF9TSVpFIC0gMSwKK3N0YXRpYyBzdHJ1Y3QgZ3R3NTcxNV9mbGFzaF9yZXNvdXJjZSA9IHsKIAkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCi19OworfQogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBndHd4NTcxNV9mbGFzaCA9IHsKIAkubmFtZQkJPSAiSVhQNFhYLUZsYXNoIiwKQEAgLTEyOSwxMyArMTI4LDIwIEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBndHd4NTcxNV9pbml0KHZvaWQpCiB7CisJaXhwNHh4X3N5c19pbml0KCk7CisKKwlpZiAoIWZsYXNoX3Jlc291cmNlKQorCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBhbGxvY2F0ZSBmbGFzaCByZXNvdXJjZVxuIik7CisKKwlndHd4NTcxNV9mbGFzaF9yZXNvdXJjZS5zdGFydCA9IElYUDRYWF9FWFBfQlVTX0JBU0UoMCk7CisJZ3R3eDU3MTVfZmxhc2hfcmVzb3VyY2UuZW5kID0gSVhQNFhYX0VYUF9CVVNfQkFTRSgwKSArIFNaXzhNIC0gMTsKKwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGd0d3g1NzE1X2RldmljZXMsIEFSUkFZX1NJWkUoZ3R3eDU3MTVfZGV2aWNlcykpOwogfQogCiAKIE1BQ0hJTkVfU1RBUlQoR1RXWDU3MTUsICJHZW10ZWsgR1RXWDU3MTUgKExpbmtzeXMgV1JWNTRHKSIpCiAJLyogTWFpbnRhaW5lcjogR2VvcmdlIEpvc2VwaCAqLwotCS5waHlzX3JhbQk9IFBIWVNfT0ZGU0VULAogCS5waHlzX2lvCT0gSVhQNFhYX1VBUlQyX0JBU0VfUEhZUywKIAkuaW9fcGdfb2Zmc3QJPSAoKElYUDRYWF9VQVJUMl9CQVNFX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKIAkubWFwX2lvCQk9IGl4cDR4eF9tYXBfaW8sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1wY2kuYwppbmRleCBmOWExZDNlLi5kYTQxNWQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtcGNpLmMKQEAgLTMyLDExICszMiw2IEBACiAJc2V0X2lycV90eXBlKElSUV9JWERQNDI1X1BDSV9JTlRDLCBJUlFUX0xPVyk7CiAJc2V0X2lycV90eXBlKElSUV9JWERQNDI1X1BDSV9JTlRELCBJUlFUX0xPVyk7CiAKLQlncGlvX2xpbmVfaXNyX2NsZWFyKElYRFA0MjVfUENJX0lOVEFfUElOKTsKLQlncGlvX2xpbmVfaXNyX2NsZWFyKElYRFA0MjVfUENJX0lOVEJfUElOKTsKLQlncGlvX2xpbmVfaXNyX2NsZWFyKElYRFA0MjVfUENJX0lOVENfUElOKTsKLQlncGlvX2xpbmVfaXNyX2NsZWFyKElYRFA0MjVfUENJX0lOVERfUElOKTsKLQogCWl4cDR4eF9wY2lfcHJlaW5pdCgpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXNldHVwLmMKaW5kZXggM2EyMmQ4NGUuLmRhNzIzODMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXNldHVwLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgpAQCAtMzAsOCArMzEsNiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpeGRwNDI1X2ZsYXNoX3Jlc291cmNlID0gewotCS5zdGFydAkJPSBJWERQNDI1X0ZMQVNIX0JBU0UsCi0JLmVuZAkJPSBJWERQNDI1X0ZMQVNIX0JBU0UgKyBJWERQNDI1X0ZMQVNIX1NJWkUgLSAxLAogCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKIH07CiAKQEAgLTEwOCwxNyArMTA3LDEzIEBACiAJJml4ZHA0MjVfdWFydAogfTsKIAotCiBzdGF0aWMgdm9pZCBfX2luaXQgaXhkcDQyNV9pbml0KHZvaWQpCiB7CiAJaXhwNHh4X3N5c19pbml0KCk7CiAKLQkvKgotCSAqIElYUDQ2NSBoYXMgMzJNQiB3aW5kb3cKLQkgKi8KLQlpZiAobWFjaGluZV9pc19peGRwNDY1KCkpIHsKLQkJaXhkcDQyNV9mbGFzaF9yZXNvdXJjZS5lbmQgKz0gSVhEUDQyNV9GTEFTSF9TSVpFOwotCX0KKwlpeGRwNDI1X2ZsYXNoX3Jlc291cmNlLnN0YXJ0ID0gSVhQNFhYX0VYUF9CVVNfQkFTRSgwKTsKKwlpeGRwNDI1X2ZsYXNoX3Jlc291cmNlLmVuZCA9CisJCUlYUDRYWF9FWFBfQlVTX0JBU0UoMCkgKyBpeHA0eHhfZXhwX2J1c19zaXplIC0gMTsKIAogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGl4ZHA0MjVfZGV2aWNlcywgQVJSQVlfU0laRShpeGRwNDI1X2RldmljZXMpKTsKIH0KQEAgLTEyNiw3ICsxMjEsNiBAQAogI2lmZGVmIENPTkZJR19BUkNIX0lYRFA0MjUKIE1BQ0hJTkVfU1RBUlQoSVhEUDQyNSwgIkludGVsIElYRFA0MjUgRGV2ZWxvcG1lbnQgUGxhdGZvcm0iKQogCS8qIE1haW50YWluZXI6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gKi8KLQkucGh5c19yYW0JPSBQSFlTX09GRlNFVCwKIAkucGh5c19pbwk9IElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfUEhZUywKIAkuaW9fcGdfb2Zmc3QJPSAoKElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfVklSVCkgPj4gMTgpICYgMHhmZmZjLAogCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKQEAgLTE0MCw3ICsxMzQsNiBAQAogI2lmZGVmIENPTkZJR19NQUNIX0lYRFA0NjUKIE1BQ0hJTkVfU1RBUlQoSVhEUDQ2NSwgIkludGVsIElYRFA0NjUgRGV2ZWxvcG1lbnQgUGxhdGZvcm0iKQogCS8qIE1haW50YWluZXI6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gKi8KLQkucGh5c19yYW0JPSBQSFlTX09GRlNFVCwKIAkucGh5c19pbwk9IElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfUEhZUywKIAkuaW9fcGdfb2Zmc3QJPSAoKElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfVklSVCkgPj4gMTgpICYgMHhmZmZjLAogCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKQEAgLTE1NCw3ICsxNDcsNiBAQAogI2lmZGVmIENPTkZJR19BUkNIX1BSUE1DMTEwMAogTUFDSElORV9TVEFSVChJWENEUDExMDAsICJJbnRlbCBJWENEUDExMDAgRGV2ZWxvcG1lbnQgUGxhdGZvcm0iKQogCS8qIE1haW50YWluZXI6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gKi8KLQkucGh5c19yYW0JPSBQSFlTX09GRlNFVCwKIAkucGh5c19pbwk9IElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfUEhZUywKIAkuaW9fcGdfb2Zmc3QJPSAoKElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfVklSVCkgPj4gMTgpICYgMHhmZmZjLAogCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKQEAgLTE3NCw3ICsxNjYsNiBAQAogI2lmZGVmIENPTkZJR19BUkNIX0FWSUxBCiBNQUNISU5FX1NUQVJUKEFWSUxBLCAiR2F0ZXdvcmtzIEF2aWxhIE5ldHdvcmsgUGxhdGZvcm0iKQogCS8qIE1haW50YWluZXI6IERlZXBhayBTYXhlbmEgPGRzYXhlbmFAcGxleGl0eS5uZXQ+ICovCi0JLnBoeXNfcmFtCT0gUEhZU19PRkZTRVQsCiAJLnBoeXNfaW8JPSBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1BIWVMsCiAJLmlvX3BnX29mZnN0CT0gKChJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKIAkubWFwX2lvCQk9IGl4cDR4eF9tYXBfaW8sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwZzQyNS1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHBnNDI1LXBjaS5jCmluZGV4IGZlNWU3NjYuLjUyNmZiNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHBnNDI1LXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHBnNDI1LXBjaS5jCkBAIC0zMiw5ICszMiw2IEBACiAJc2V0X2lycV90eXBlKElSUV9JWFA0WFhfR1BJTzYsIElSUVRfTE9XKTsKIAlzZXRfaXJxX3R5cGUoSVJRX0lYUDRYWF9HUElPNywgSVJRVF9MT1cpOwogCi0JZ3Bpb19saW5lX2lzcl9jbGVhcig2KTsKLQlncGlvX2xpbmVfaXNyX2NsZWFyKDcpOwotCiAJaXhwNHh4X3BjaV9wcmVpbml0KCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25hczEwMGQtcGNpLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXBjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YjdjMDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXBjaS5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXBjaS5jCisgKgorICogTkFTIDEwMGQgYm9hcmQtbGV2ZWwgUENJIGluaXRpYWxpemF0aW9uCisgKgorICogYmFzZWQgb24gaXhkcDQyNS1wY2kuYzoKKyAqCUNvcHlyaWdodCAoQykgMjAwMiBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCUNvcHlyaWdodCAoQykgMjAwMy0yMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBNYWludGFpbmVyOiBodHRwOi8vd3d3Lm5zbHUyLWxpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKwordm9pZCBfX2luaXQgbmFzMTAwZF9wY2lfcHJlaW5pdCh2b2lkKQoreworCXNldF9pcnFfdHlwZShJUlFfTkFTMTAwRF9QQ0lfSU5UQSwgSVJRVF9MT1cpOworCXNldF9pcnFfdHlwZShJUlFfTkFTMTAwRF9QQ0lfSU5UQiwgSVJRVF9MT1cpOworCXNldF9pcnFfdHlwZShJUlFfTkFTMTAwRF9QQ0lfSU5UQywgSVJRVF9MT1cpOworCXNldF9pcnFfdHlwZShJUlFfTkFTMTAwRF9QQ0lfSU5URCwgSVJRVF9MT1cpOworCXNldF9pcnFfdHlwZShJUlFfTkFTMTAwRF9QQ0lfSU5URSwgSVJRVF9MT1cpOworCisJaXhwNHh4X3BjaV9wcmVpbml0KCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG5hczEwMGRfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCit7CisJc3RhdGljIGludCBwY2lfaXJxX3RhYmxlW05BUzEwMERfUENJX01BWF9ERVZdW05BUzEwMERfUENJX0lSUV9MSU5FU10gPQorCXsKKwkJeyBJUlFfTkFTMTAwRF9QQ0lfSU5UQSwgLTEsIC0xIH0sCisJCXsgSVJRX05BUzEwMERfUENJX0lOVEIsIC0xLCAtMSB9LAorCQl7IElSUV9OQVMxMDBEX1BDSV9JTlRDLCBJUlFfTkFTMTAwRF9QQ0lfSU5URCwgSVJRX05BUzEwMERfUENJX0lOVEUgfSwKKwl9OworCisJaW50IGlycSA9IC0xOworCisJaWYgKHNsb3QgPj0gMSAmJiBzbG90IDw9IE5BUzEwMERfUENJX01BWF9ERVYgJiYKKwkJcGluID49IDEgJiYgcGluIDw9IE5BUzEwMERfUENJX0lSUV9MSU5FUykKKwkJaXJxID0gcGNpX2lycV90YWJsZVtzbG90LTFdW3Bpbi0xXTsKKworCXJldHVybiBpcnE7Cit9CisKK3N0cnVjdCBod19wY2kgX19pbml0ZGF0YSBuYXMxMDBkX3BjaSA9IHsKKwkubnJfY29udHJvbGxlcnMgPSAxLAorCS5wcmVpbml0CT0gbmFzMTAwZF9wY2lfcHJlaW5pdCwKKwkuc3dpenpsZQk9IHBjaV9zdGRfc3dpenpsZSwKKwkuc2V0dXAJCT0gaXhwNHh4X3NldHVwLAorCS5zY2FuCQk9IGl4cDR4eF9zY2FuX2J1cywKKwkubWFwX2lycQk9IG5hczEwMGRfbWFwX2lycSwKK307CisKK2ludCBfX2luaXQgbmFzMTAwZF9wY2lfaW5pdCh2b2lkKQoreworCWlmIChtYWNoaW5lX2lzX25hczEwMGQoKSkKKwkJcGNpX2NvbW1vbl9pbml0KCZuYXMxMDBkX3BjaSk7CisKKwlyZXR1cm4gMDsKK30KKworc3Vic3lzX2luaXRjYWxsKG5hczEwMGRfcGNpX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvbmFzMTAwZC1wb3dlci5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbmFzMTAwZC1wb3dlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZWM2OWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXBvd2VyLmMKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtaXhwNHh4L25hczEwMGQtcG93ZXIuYworICoKKyAqIE5BUyAxMDBkIFBvd2VyL1Jlc2V0IGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUb3dlciBUZWNobm9sb2dpZXMKKyAqCisgKiBiYXNlZCBvbiBuYXMxMDBkLWlvLmMKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgS2FyZW4gU3BlYXJlbAorICoKKyAqIEF1dGhvcjogQWxlc3NhbmRybyBadW1tbyA8YS56dW1tb0B0b3dlcnRlY2guaXQ+CisgKiBNYWludGFpbmVyczogaHR0cDovL3d3dy5uc2x1Mi1saW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworZXh0ZXJuIHZvaWQgY3RybF9hbHRfZGVsKHZvaWQpOworCitzdGF0aWMgaXJxcmV0dXJuX3QgbmFzMTAwZF9yZXNldF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJLyogU2lnbmFsIGluaXQgdG8gZG8gdGhlIGN0cmxhbHRkZWwgYWN0aW9uLCB0aGlzIHdpbGwgYnlwYXNzIGluaXQgaWYKKwkgKiBpdCBoYXNuJ3Qgc3RhcnRlZCBhbmQgZG8gYSBrZXJuZWxfcmVzdGFydC4KKwkgKi8KKwljdHJsX2FsdF9kZWwoKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBfX2luaXQgbmFzMTAwZF9wb3dlcl9pbml0KHZvaWQpCit7CisJaWYgKCEobWFjaGluZV9pc19uYXMxMDBkKCkpKQorCQlyZXR1cm4gMDsKKworCXNldF9pcnFfdHlwZShOQVMxMDBEX1JCX0lSUSwgSVJRVF9MT1cpOworCisJaWYgKHJlcXVlc3RfaXJxKE5BUzEwMERfUkJfSVJRLCAmbmFzMTAwZF9yZXNldF9oYW5kbGVyLAorCQlTQV9JTlRFUlJVUFQsICJOQVMxMDBEIHJlc2V0IGJ1dHRvbiIsIE5VTEwpIDwgMCkgeworCisJCXByaW50ayhLRVJOX0RFQlVHICJSZXNldCBCdXR0b24gSVJRICVkIG5vdCBhdmFpbGFibGVcbiIsCisJCQlOQVMxMDBEX1JCX0lSUSk7CisKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuYXMxMDBkX3Bvd2VyX2V4aXQodm9pZCkKK3sKKwlmcmVlX2lycShOQVMxMDBEX1JCX0lSUSwgTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KG5hczEwMGRfcG93ZXJfaW5pdCk7Cittb2R1bGVfZXhpdChuYXMxMDBkX3Bvd2VyX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJBbGVzc2FuZHJvIFp1bW1vIDxhLnp1bW1vQHRvd2VydGVjaC5pdD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTkFTMTAwRCBQb3dlci9SZXNldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25hczEwMGQtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L25hczEwMGQtc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTZkNTZmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbmFzMTAwZC1zZXR1cC5jCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1peHA0eHgvbmFzMTAwZC1zZXR1cC5jCisgKgorICogTkFTIDEwMGQgYm9hcmQtc2V0dXAKKyAqCisgKiBiYXNlZCBpeGRwNDI1LXNldHVwLmM6CisgKiAgICAgIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBBdXRob3I6IEFsZXNzYW5kcm8gWnVtbW8gPGEuenVtbW9AdG93ZXJ0ZWNoLml0PgorICogQXV0aG9yOiBSb2QgV2hpdGJ5IDxyb2RAd2hpdGJ5LmlkLmF1PgorICogTWFpbnRhaW5lcnM6IGh0dHA6Ly93d3cubnNsdTItbGludXgub3JnLworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSBuYXMxMDBkX2ZsYXNoX2RhdGEgPSB7CisJLm1hcF9uYW1lCQk9ICJjZmlfcHJvYmUiLAorCS53aWR0aAkJCT0gMiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbmFzMTAwZF9mbGFzaF9yZXNvdXJjZSA9IHsKKwkuZmxhZ3MJCQk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbmFzMTAwZF9mbGFzaCA9IHsKKwkubmFtZQkJCT0gIklYUDRYWC1GbGFzaCIsCisJLmlkCQkJPSAwLAorCS5kZXYucGxhdGZvcm1fZGF0YQk9ICZuYXMxMDBkX2ZsYXNoX2RhdGEsCisJLm51bV9yZXNvdXJjZXMJCT0gMSwKKwkucmVzb3VyY2UJCT0gJm5hczEwMGRfZmxhc2hfcmVzb3VyY2UsCit9OworCitzdGF0aWMgc3RydWN0IGl4cDR4eF9pMmNfcGlucyBuYXMxMDBkX2kyY19ncGlvX3BpbnMgPSB7CisJLnNkYV9waW4JCT0gTkFTMTAwRF9TREFfUElOLAorCS5zY2xfcGluCQk9IE5BUzEwMERfU0NMX1BJTiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG5hczEwMGRfaTJjX2NvbnRyb2xsZXIgPSB7CisJLm5hbWUJCQk9ICJJWFA0WFgtSTJDIiwKKwkuaWQJCQk9IDAsCisJLmRldi5wbGF0Zm9ybV9kYXRhCT0gJm5hczEwMGRfaTJjX2dwaW9fcGlucywKKwkubnVtX3Jlc291cmNlcwkJPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBuYXMxMDBkX3VhcnRfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJCT0gSVhQNFhYX1VBUlQxX0JBU0VfUEhZUywKKwkJLmVuZAkJPSBJWFA0WFhfVUFSVDFfQkFTRV9QSFlTICsgMHgwZmZmLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAkJPSBJWFA0WFhfVUFSVDJfQkFTRV9QSFlTLAorCQkuZW5kCQk9IElYUDRYWF9VQVJUMl9CQVNFX1BIWVMgKyAweDBmZmYsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IG5hczEwMGRfdWFydF9kYXRhW10gPSB7CisJeworCQkubWFwYmFzZQk9IElYUDRYWF9VQVJUMV9CQVNFX1BIWVMsCisJCS5tZW1iYXNlCT0gKGNoYXIgKilJWFA0WFhfVUFSVDFfQkFTRV9WSVJUICsgUkVHX09GRlNFVCwKKwkJLmlycQkJPSBJUlFfSVhQNFhYX1VBUlQxLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0sCisJCS5yZWdzaGlmdAk9IDIsCisJCS51YXJ0Y2xrCT0gSVhQNFhYX1VBUlRfWFRBTCwKKwl9LAorCXsKKwkJLm1hcGJhc2UJPSBJWFA0WFhfVUFSVDJfQkFTRV9QSFlTLAorCQkubWVtYmFzZQk9IChjaGFyICopSVhQNFhYX1VBUlQyX0JBU0VfVklSVCArIFJFR19PRkZTRVQsCisJCS5pcnEJCT0gSVJRX0lYUDRYWF9VQVJUMiwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCQkucmVnc2hpZnQJPSAyLAorCQkudWFydGNsawk9IElYUDRYWF9VQVJUX1hUQUwsCisJfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG5hczEwMGRfdWFydCA9IHsKKwkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAorCS5pZAkJCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAorCS5kZXYucGxhdGZvcm1fZGF0YQk9IG5hczEwMGRfdWFydF9kYXRhLAorCS5udW1fcmVzb3VyY2VzCQk9IDIsCisJLnJlc291cmNlCQk9IG5hczEwMGRfdWFydF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbmFzMTAwZF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmbmFzMTAwZF9pMmNfY29udHJvbGxlciwKKwkmbmFzMTAwZF9mbGFzaCwKKwkmbmFzMTAwZF91YXJ0LAorfTsKKworc3RhdGljIHZvaWQgbmFzMTAwZF9wb3dlcl9vZmYodm9pZCkKK3sKKwkvKiBUaGlzIGNhdXNlcyB0aGUgYm94IHRvIGRyb3AgdGhlIHBvd2VyIGFuZCBnbyBkZWFkLiAqLworCisJLyogZW5hYmxlIHRoZSBwd3IgY250bCBncGlvICovCisJZ3Bpb19saW5lX2NvbmZpZyhOQVMxMDBEX1BPX0dQSU8sIElYUDRYWF9HUElPX09VVCk7CisKKwkvKiBkbyB0aGUgZGVlZCAqLworCWdwaW9fbGluZV9zZXQoTkFTMTAwRF9QT19HUElPLCBJWFA0WFhfR1BJT19ISUdIKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG5hczEwMGRfaW5pdCh2b2lkKQoreworCWl4cDR4eF9zeXNfaW5pdCgpOworCisJbmFzMTAwZF9mbGFzaF9yZXNvdXJjZS5zdGFydCA9IElYUDRYWF9FWFBfQlVTX0JBU0UoMCk7CisJbmFzMTAwZF9mbGFzaF9yZXNvdXJjZS5lbmQgPQorCQlJWFA0WFhfRVhQX0JVU19CQVNFKDApICsgaXhwNHh4X2V4cF9idXNfc2l6ZSAtIDE7CisKKwlwbV9wb3dlcl9vZmYgPSBuYXMxMDBkX3Bvd2VyX29mZjsKKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKG5hczEwMGRfZGV2aWNlcywgQVJSQVlfU0laRShuYXMxMDBkX2RldmljZXMpKTsKK30KKworTUFDSElORV9TVEFSVChOQVMxMDBELCAiSW9tZWdhIE5BUyAxMDBkIikKKwkvKiBNYWludGFpbmVyOiB3d3cubnNsdTItbGludXgub3JnICovCisJLnBoeXNfaW8JPSBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1BIWVMsCisJLmlvX3BnX29mZnN0CT0gKChJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1ZJUlQpID4+IDE4KSAmIDB4RkZGQywKKwkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKKwkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCisJLnRpbWVyICAgICAgICAgID0gJml4cDR4eF90aW1lciwKKwkuaW5pdF9tYWNoaW5lCT0gbmFzMTAwZF9pbml0LAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItcGNpLmMKaW5kZXggYTU3NWYyZS4uZWNlODYwNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItcGNpLmMKQEAgLTI4LDE0ICsyOCw2IEBACiAJc2V0X2lycV90eXBlKElSUV9OU0xVMl9QQ0lfSU5UQiwgSVJRVF9MT1cpOwogCXNldF9pcnFfdHlwZShJUlFfTlNMVTJfUENJX0lOVEMsIElSUVRfTE9XKTsKIAotCWdwaW9fbGluZV9pc3JfY2xlYXIoTlNMVTJfUENJX0lOVEFfUElOKTsKLQlncGlvX2xpbmVfaXNyX2NsZWFyKE5TTFUyX1BDSV9JTlRCX1BJTik7Ci0JZ3Bpb19saW5lX2lzcl9jbGVhcihOU0xVMl9QQ0lfSU5UQ19QSU4pOwotCi0JLyogSU5URCBpcyBub3QgY29uZmlndXJlZCBhcyBHUElPIGlzIHVzZWQKLQkgKiBmb3IgdGhlIHBvd2VyIGlucHV0IGJ1dHRvbi4KLQkgKi8KLQogCWl4cDR4eF9wY2lfcHJlaW5pdCgpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1wb3dlci5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItcG93ZXIuYwppbmRleCAxOGZiYzhjLi5iMGFkOWU5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1wb3dlci5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXBvd2VyLmMKQEAgLTU0LDkgKzU0LDYgQEAKIAlzZXRfaXJxX3R5cGUoTlNMVTJfUkJfSVJRLCBJUlFUX0xPVyk7CiAJc2V0X2lycV90eXBlKE5TTFUyX1BCX0lSUSwgSVJRVF9ISUdIKTsKIAotCWdwaW9fbGluZV9pc3JfY2xlYXIoTlNMVTJfUkJfR1BJTyk7Ci0JZ3Bpb19saW5lX2lzcl9jbGVhcihOU0xVMl9QQl9HUElPKTsKLQogCWlmIChyZXF1ZXN0X2lycShOU0xVMl9SQl9JUlEsICZuc2x1Ml9yZXNldF9oYW5kbGVyLAogCQlTQV9JTlRFUlJVUFQsICJOU0xVMiByZXNldCBidXR0b24iLCBOVUxMKSA8IDApIHsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXNldHVwLmMKaW5kZXggMjg5ZTk0Yy4uZGE5MzQwYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1zZXR1cC5jCkBAIC0xMjMsNyArMTIzLDYgQEAKIAogTUFDSElORV9TVEFSVChOU0xVMiwgIkxpbmtzeXMgTlNMVTIiKQogCS8qIE1haW50YWluZXI6IHd3dy5uc2x1Mi1saW51eC5vcmcgKi8KLQkucGh5c19yYW0JPSBQSFlTX09GRlNFVCwKIAkucGh5c19pbwk9IElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfUEhZUywKIAkuaW9fcGdfb2Zmc3QJPSAoKElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfVklSVCkgPj4gMTgpICYgMHhGRkZDLAogCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWw3MjAwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtbDcyMDAvY29yZS5jCmluZGV4IDAzZWQ3NDIuLmFjNjI2NDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbDcyMDAvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbDcyMDAvY29yZS5jCkBAIC05MSw3ICs5MSw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoTDcyMDAsICJMaW5rVXAgU3lzdGVtcyBMNzIwMCIpCiAJLyogTWFpbnRhaW5lcjogU3RldmUgSGlsbCAvIFNjb3R0IE1jQ29ubmVsbCAqLwotCS5waHlzX3JhbQk9IDB4ZjAwMDAwMDAsCiAJLnBoeXNfaW8JPSAweDgwMDQwMDAwLAogCS5pb19wZ19vZmZzdAk9ICgoMHhkMDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5tYXBfaW8JCT0gbDcyMDBfbWFwX2lvLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2FyY2gta2V2N2E0MDAuYyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9hcmNoLWtldjdhNDAwLmMKaW5kZXggMTlmMmZhMi4uMmNjY2MyNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2FyY2gta2V2N2E0MDAuYworKysgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvYXJjaC1rZXY3YTQwMC5jCkBAIC0xMTIsNyArMTEyLDYgQEAKIAogTUFDSElORV9TVEFSVCAoS0VWN0E0MDAsICJTaGFycCBLRVY3YTQwMCIpCiAJLyogTWFpbnRhaW5lcjogTWFyYyBTaW5nZXIgKi8KLQkucGh5c19yYW0JPSAweGMwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoKGlvX3AydiAoMHg4MDAwMDAwMCkpPj4xOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9hcmNoLWxwZDdhNDB4LmMgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvYXJjaC1scGQ3YTQweC5jCmluZGV4IDRlYjk2MmYuLjEyZTIzMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9hcmNoLWxwZDdhNDB4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2FyY2gtbHBkN2E0MHguYwpAQCAtMzE3LDcgKzMxNyw2IEBACiAKIE1BQ0hJTkVfU1RBUlQgKExQRDdBNDAwLCAiTG9naWMgUHJvZHVjdCBEZXZlbG9wbWVudCBMUEQ3QTQwMC0xMCIpCiAJLyogTWFpbnRhaW5lcjogTWFyYyBTaW5nZXIgKi8KLQkucGh5c19yYW0JPSAweGMwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoKGlvX3AydiAoMHg4MDAwMDAwMCkpPj4xOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKQEAgLTMzMyw3ICszMzIsNiBAQAogCiBNQUNISU5FX1NUQVJUIChMUEQ3QTQwNCwgIkxvZ2ljIFByb2R1Y3QgRGV2ZWxvcG1lbnQgTFBEN0E0MDQtMTAiKQogCS8qIE1haW50YWluZXI6IE1hcmMgU2luZ2VyICovCi0JLnBoeXNfcmFtCT0gMHhjMDAwMDAwMCwKIAkucGh5c19pbwk9IDB4ODAwMDAwMDAsCiAJLmlvX3BnX29mZnN0CT0gKChpb19wMnYgKDB4ODAwMDAwMDApKT4+MTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWdlbmVyaWMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZ2VuZXJpYy5jCmluZGV4IDRiMjkyZTkuLmJkYzIwYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZ2VuZXJpYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZ2VuZXJpYy5jCkBAIC0xMDksNyArMTA5LDYgQEAKIAogTUFDSElORV9TVEFSVChPTUFQX0dFTkVSSUMsICJHZW5lcmljIE9NQVAxNTEwLzE2MTAvMTcxMCIpCiAJLyogTWFpbnRhaW5lcjogVG9ueSBMaW5kZ3JlbiA8dG9ueUBhdG9taWRlLmNvbT4gKi8KLQkucGh5c19yYW0JPSAweDEwMDAwMDAwLAogCS5waHlzX2lvCT0gMHhmZmYwMDAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmVmMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMi5jCmluZGV4IGEwN2UyYzkuLjk1MzNjMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDIuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLmMKQEAgLTE5OSw3ICsxOTksNiBAQAogCiBNQUNISU5FX1NUQVJUKE9NQVBfSDIsICJUSS1IMiIpCiAJLyogTWFpbnRhaW5lcjogSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPiAqLwotCS5waHlzX3JhbQk9IDB4MTAwMDAwMDAsCiAJLnBoeXNfaW8JPSAweGZmZjAwMDAwLAogCS5pb19wZ19vZmZzdAk9ICgoMHhmZWYwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLmMKaW5kZXggNjY4ZTI3OC4uZDY2NWVmYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYwpAQCAtMjE1LDcgKzIxNSw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoT01BUF9IMywgIlRJIE9NQVAxNzEwIEgzIGJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLiAqLwotCS5waHlzX3JhbQk9IDB4MTAwMDAwMDAsCiAJLnBoeXNfaW8JPSAweGZmZjAwMDAwLAogCS5pb19wZ19vZmZzdAk9ICgoMHhmZWYwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWlubm92YXRvci5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1pbm5vdmF0b3IuYwppbmRleCA5NWYxZmYzLi42NTJmMzdjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWlubm92YXRvci5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaW5ub3ZhdG9yLmMKQEAgLTMwMyw3ICszMDMsNiBAQAogCiBNQUNISU5FX1NUQVJUKE9NQVBfSU5OT1ZBVE9SLCAiVEktSW5ub3ZhdG9yIikKIAkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICovCi0JLnBoeXNfcmFtCT0gMHgxMDAwMDAwMCwKIAkucGh5c19pbwk9IDB4ZmZmMDAwMDAsCiAJLmlvX3BnX29mZnN0CT0gKCgweGZlZjAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtbmV0c3Rhci5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1uZXRzdGFyLmMKaW5kZXggMDQ0OGZhNy4uNThmNzgzOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1uZXRzdGFyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1uZXRzdGFyLmMKQEAgLTE0OSw3ICsxNDksNiBAQAogCiBNQUNISU5FX1NUQVJUKE5FVFNUQVIsICJOZXRTdGFyIE9NQVA1OTEwIikKIAkvKiBNYWludGFpbmVyOiBMYWRpc2xhdiBNaWNobCA8bWljaGxAMm4uY3o+ICovCi0JLnBoeXNfcmFtCT0gMHgxMDAwMDAwMCwKIAkucGh5c19pbwk9IDB4ZmZmMDAwMDAsCiAJLmlvX3BnX29mZnN0CT0gKCgweGZlZjAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtb3NrLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW9zay5jCmluZGV4IGU5OTBlMWIuLmU1ZDEyNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtb3NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1vc2suYwpAQCAtMjc0LDcgKzI3NCw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoT01BUF9PU0ssICJUSS1PU0siKQogCS8qIE1haW50YWluZXI6IERpcmsgQmVobWUgPGRpcmsuYmVobWVAZGUuYm9zY2guY29tPiAqLwotCS5waHlzX3JhbQk9IDB4MTAwMDAwMDAsCiAJLnBoeXNfaW8JPSAweGZmZjAwMDAwLAogCS5pb19wZ19vZmZzdAk9ICgoMHhmZWYwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG10ZS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtdGUuYwppbmRleCA1NDBiMjBkLi42N2ZhZGEyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG10ZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXRlLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KIAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC0zMCw3ICszMSw2IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvdXNiLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9jb21tb24uaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KIAogc3RhdGljIHZvaWQgX19pbml0IG9tYXBfZ2VuZXJpY19pbml0X2lycSh2b2lkKQogewpAQCAtNzYsNyArNzYsNiBAQAogfQogCiBNQUNISU5FX1NUQVJUKE9NQVBfUEFMTVRFLCAiT01BUDMxMCBiYXNlZCBQYWxtIFR1bmdzdGVuIEUiKQotCS5waHlzX3JhbQk9IDB4MTAwMDAwMDAsCiAJLnBoeXNfaW8JPSAweGZmZjAwMDAwLAogCS5pb19wZ19vZmZzdAk9ICgoMHhmZWYwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBlcnNldXMyLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBlcnNldXMyLmMKaW5kZXggYmQ5MDBiNy4uODg3MDhhMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wZXJzZXVzMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGVyc2V1czIuYwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJb21hcF93cml0ZWwoMHgwMDAwMDA4OCwgT01BUDczMF9GTEFTSF9BQ0ZHXzApOwogCiAJLyoKLQkgKiBFdGhlcm5ldCBzdXBwb3J0IHRyb3VnaCB0aGUgZGVidWcgYm9hcmQKKwkgKiBFdGhlcm5ldCBzdXBwb3J0IHRocm91Z2ggdGhlIGRlYnVnIGJvYXJkCiAJICogQ1MxIHRpbWluZ3Mgc2V0dXAKIAkgKi8KIAlvbWFwX3dyaXRlbCgweDAwMDBmZmYzLCBPTUFQNzMwX0ZMQVNIX0NGR18xKTsKQEAgLTE5OSw3ICsxOTksNiBAQAogCiBNQUNISU5FX1NUQVJUKE9NQVBfUEVSU0VVUzIsICJPTUFQNzMwIFBlcnNldXMyIikKIAkvKiBNYWludGFpbmVyOiBLZXZpbiBIaWxtYW4gPGtqaEBoaWxtYW4ub3JnPiAqLwotCS5waHlzX3JhbQk9IDB4MTAwMDAwMDAsCiAJLnBoeXNfaW8JPSAweGZmZjAwMDAwLAogCS5pb19wZ19vZmZzdAk9ICgoMHhmZWYwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXZvaWNlYmx1ZS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC12b2ljZWJsdWUuYwppbmRleCA2ZjlhNjIyLi45NTliNGI4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXZvaWNlYmx1ZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtdm9pY2VibHVlLmMKQEAgLTI4MSw3ICsyODEsNiBAQAogCiBNQUNISU5FX1NUQVJUKFZPSUNFQkxVRSwgIlZvaWNlQmx1ZSBPTUFQNTkxMCIpCiAJLyogTWFpbnRhaW5lcjogTGFkaXNsYXYgTWljaGwgPG1pY2hsQDJuLmN6PiAqLwotCS5waHlzX3JhbQk9IDB4MTAwMDAwMDAsCiAJLnBoeXNfaW8JPSAweGZmZjAwMDAwLAogCS5pb19wZ19vZmZzdAk9ICgoMHhmZWYwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2Nsb2NrLmMKaW5kZXggNDI3N2VlZS4uNzUxMTBiYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvY2xvY2suYwpAQCAtMTYsOSArMTYsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vYXJjaC91c2IuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9jbG9jay5oPgpAQCAtNTAsMTAgKzUwLDEwIEBACiB7CiAJaW50IHJldHZhbDsKIAotCXJldHZhbCA9IG9tYXAxX2Nsa191c2UoJmFwaV9jay5jbGspOworCXJldHZhbCA9IG9tYXAxX2Nsa19lbmFibGUoJmFwaV9jay5jbGspOwogCWlmICghcmV0dmFsKSB7Ci0JCXJldHZhbCA9IG9tYXAxX2Nsa19lbmFibGUoY2xrKTsKLQkJb21hcDFfY2xrX3VudXNlKCZhcGlfY2suY2xrKTsKKwkJcmV0dmFsID0gb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljKGNsayk7CisJCW9tYXAxX2Nsa19kaXNhYmxlKCZhcGlfY2suY2xrKTsKIAl9CiAKIAlyZXR1cm4gcmV0dmFsOwpAQCAtNjEsOSArNjEsOSBAQAogCiBzdGF0aWMgdm9pZCBvbWFwMV9jbGtfZGlzYWJsZV9kc3BfZG9tYWluKHN0cnVjdCBjbGsgKmNsaykKIHsKLQlpZiAob21hcDFfY2xrX3VzZSgmYXBpX2NrLmNsaykgPT0gMCkgewotCQlvbWFwMV9jbGtfZGlzYWJsZShjbGspOwotCQlvbWFwMV9jbGtfdW51c2UoJmFwaV9jay5jbGspOworCWlmIChvbWFwMV9jbGtfZW5hYmxlKCZhcGlfY2suY2xrKSA9PSAwKSB7CisJCW9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMoY2xrKTsKKwkJb21hcDFfY2xrX2Rpc2FibGUoJmFwaV9jay5jbGspOwogCX0KIH0KIApAQCAtNzIsNyArNzIsNyBAQAogCWludCByZXQ7CiAJc3RydWN0IHVhcnRfY2xrICp1Y2xrOwogCi0JcmV0ID0gb21hcDFfY2xrX2VuYWJsZShjbGspOworCXJldCA9IG9tYXAxX2Nsa19lbmFibGVfZ2VuZXJpYyhjbGspOwogCWlmIChyZXQgPT0gMCkgewogCQkvKiBTZXQgc21hcnQgaWRsZSBhY2tub3dsZWRnZW1lbnQgbW9kZSAqLwogCQl1Y2xrID0gKHN0cnVjdCB1YXJ0X2NsayAqKWNsazsKQEAgLTkxLDcgKzkxLDcgQEAKIAl1Y2xrID0gKHN0cnVjdCB1YXJ0X2NsayAqKWNsazsKIAlvbWFwX3dyaXRlYigob21hcF9yZWFkYih1Y2xrLT5zeXNjX2FkZHIpICYgfjB4MTgpLCB1Y2xrLT5zeXNjX2FkZHIpOwogCi0Jb21hcDFfY2xrX2Rpc2FibGUoY2xrKTsKKwlvbWFwMV9jbGtfZGlzYWJsZV9nZW5lcmljKGNsayk7CiB9CiAKIHN0YXRpYyB2b2lkIG9tYXAxX2Nsa19hbGxvd19pZGxlKHN0cnVjdCBjbGsgKmNsaykKQEAgLTIzMCw5ICsyMzAsOSBAQAogCSAqIE5vdGUgdGhhdCBEU1BfQ0tDVEwgdmlydCBhZGRyID0gcGh5cyBhZGRyLCBzbwogCSAqIHdlIG11c3QgdXNlIF9fcmF3X3JlYWR3KCkgaW5zdGVhZCBvZiBvbWFwX3JlYWR3KCkuCiAJICovCi0Jb21hcDFfY2xrX3VzZSgmYXBpX2NrLmNsayk7CisJb21hcDFfY2xrX2VuYWJsZSgmYXBpX2NrLmNsayk7CiAJZHNvciA9IDEgPDwgKDMgJiAoX19yYXdfcmVhZHcoRFNQX0NLQ1RMKSA+PiBjbGstPnJhdGVfb2Zmc2V0KSk7Ci0Jb21hcDFfY2xrX3VudXNlKCZhcGlfY2suY2xrKTsKKwlvbWFwMV9jbGtfZGlzYWJsZSgmYXBpX2NrLmNsayk7CiAKIAlpZiAodW5saWtlbHkoY2xrLT5yYXRlID09IGNsay0+cGFyZW50LT5yYXRlIC8gZHNvcikpCiAJCXJldHVybjsgLyogTm8gY2hhbmdlLCBxdWljayBleGl0ICovCkBAIC00MTIsMTIgKzQxMiwxMiBAQAogCWNsay0+IHJhdGUgPSA5NjAwMDAwMCAvIGRzb3I7CiB9CiAKLXN0YXRpYyBpbnQgb21hcDFfY2xrX3VzZShzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgaW50IG9tYXAxX2Nsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQogewogCWludCByZXQgPSAwOwogCWlmIChjbGstPnVzZWNvdW50KysgPT0gMCkgewogCQlpZiAobGlrZWx5KGNsay0+cGFyZW50KSkgewotCQkJcmV0ID0gb21hcDFfY2xrX3VzZShjbGstPnBhcmVudCk7CisJCQlyZXQgPSBvbWFwMV9jbGtfZW5hYmxlKGNsay0+cGFyZW50KTsKIAogCQkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgewogCQkJCWNsay0+dXNlY291bnQtLTsKQEAgLTQzMiw3ICs0MzIsNyBAQAogCQlyZXQgPSBjbGstPmVuYWJsZShjbGspOwogCiAJCWlmICh1bmxpa2VseShyZXQgIT0gMCkgJiYgY2xrLT5wYXJlbnQpIHsKLQkJCW9tYXAxX2Nsa191bnVzZShjbGstPnBhcmVudCk7CisJCQlvbWFwMV9jbGtfZGlzYWJsZShjbGstPnBhcmVudCk7CiAJCQljbGstPnVzZWNvdW50LS07CiAJCX0KIAl9CkBAIC00NDAsMTIgKzQ0MCwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIG9tYXAxX2Nsa191bnVzZShzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgdm9pZCBvbWFwMV9jbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCiB7CiAJaWYgKGNsay0+dXNlY291bnQgPiAwICYmICEoLS1jbGstPnVzZWNvdW50KSkgewogCQljbGstPmRpc2FibGUoY2xrKTsKIAkJaWYgKGxpa2VseShjbGstPnBhcmVudCkpIHsKLQkJCW9tYXAxX2Nsa191bnVzZShjbGstPnBhcmVudCk7CisJCQlvbWFwMV9jbGtfZGlzYWJsZShjbGstPnBhcmVudCk7CiAJCQlpZiAoY2xrLT5mbGFncyAmIENMT0NLX05PX0lETEVfUEFSRU5UKQogCQkJCWlmICghY3B1X2lzX29tYXAyNHh4KCkpCiAJCQkJCW9tYXAxX2Nsa19hbGxvd19pZGxlKGNsay0+cGFyZW50KTsKQEAgLTQ1Myw3ICs0NTMsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCBvbWFwMV9jbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyBpbnQgb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlfX3UxNiByZWd2YWwxNjsKIAlfX3UzMiByZWd2YWwzMjsKQEAgLTQ5Miw3ICs0OTIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBvbWFwMV9jbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgdm9pZCBvbWFwMV9jbGtfZGlzYWJsZV9nZW5lcmljKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlfX3UxNiByZWd2YWwxNjsKIAlfX3UzMiByZWd2YWwzMjsKQEAgLTY1NCw4ICs2NTQsOCBAQAogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX2Z1bmN0aW9ucyBvbWFwMV9jbGtfZnVuY3Rpb25zID0gewotCS5jbGtfdXNlCQk9IG9tYXAxX2Nsa191c2UsCi0JLmNsa191bnVzZQkJPSBvbWFwMV9jbGtfdW51c2UsCisJLmNsa19lbmFibGUJCT0gb21hcDFfY2xrX2VuYWJsZSwKKwkuY2xrX2Rpc2FibGUJCT0gb21hcDFfY2xrX2Rpc2FibGUsCiAJLmNsa19yb3VuZF9yYXRlCQk9IG9tYXAxX2Nsa19yb3VuZF9yYXRlLAogCS5jbGtfc2V0X3JhdGUJCT0gb21hcDFfY2xrX3NldF9yYXRlLAogfTsKQEAgLTc4MCw5ICs3ODAsOSBAQAogCSAqIE9ubHkgZW5hYmxlIHRob3NlIGNsb2NrcyB3ZSB3aWxsIG5lZWQsIGxldCB0aGUgZHJpdmVycwogCSAqIGVuYWJsZSBvdGhlciBjbG9ja3MgYXMgbmVjZXNzYXJ5CiAJICovCi0JY2xrX3VzZSgmYXJtcGVyX2NrLmNsayk7Ci0JY2xrX3VzZSgmYXJteG9yX2NrLmNsayk7Ci0JY2xrX3VzZSgmYXJtdGltX2NrLmNsayk7IC8qIFRoaXMgc2hvdWxkIGJlIGRvbmUgYnkgdGltZXIgY29kZSAqLworCWNsa19lbmFibGUoJmFybXBlcl9jay5jbGspOworCWNsa19lbmFibGUoJmFybXhvcl9jay5jbGspOworCWNsa19lbmFibGUoJmFybXRpbV9jay5jbGspOyAvKiBUaGlzIHNob3VsZCBiZSBkb25lIGJ5IHRpbWVyIGNvZGUgKi8KIAogCWlmIChjcHVfaXNfb21hcDE1MTAoKSkKIAkJY2xrX2VuYWJsZSgmYXJtX2dwaW9fY2spOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9jbG9jay5oCmluZGV4IGYzYmRmYjUuLjRmMThkMWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvY2xvY2suaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2Nsb2NrLmgKQEAgLTEzLDggKzEzLDggQEAKICNpZm5kZWYgX19BUkNIX0FSTV9NQUNIX09NQVAxX0NMT0NLX0gKICNkZWZpbmUgX19BUkNIX0FSTV9NQUNIX09NQVAxX0NMT0NLX0gKIAotc3RhdGljIGludCBvbWFwMV9jbGtfZW5hYmxlKHN0cnVjdCBjbGsgKiBjbGspOwotc3RhdGljIHZvaWQgb21hcDFfY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqIGNsayk7CitzdGF0aWMgaW50IG9tYXAxX2Nsa19lbmFibGVfZ2VuZXJpYyhzdHJ1Y3QgY2xrICogY2xrKTsKK3N0YXRpYyB2b2lkIG9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMoc3RydWN0IGNsayAqIGNsayk7CiBzdGF0aWMgdm9pZCBvbWFwMV9ja2N0bF9yZWNhbGMoc3RydWN0IGNsayAqIGNsayk7CiBzdGF0aWMgdm9pZCBvbWFwMV93YXRjaGRvZ19yZWNhbGMoc3RydWN0IGNsayAqIGNsayk7CiBzdGF0aWMgdm9pZCBvbWFwMV9ja2N0bF9yZWNhbGNfZHNwX2RvbWFpbihzdHJ1Y3QgY2xrICogY2xrKTsKQEAgLTMwLDggKzMwLDggQEAKIHN0YXRpYyB2b2lkIG9tYXAxX2luaXRfZXh0X2NsayhzdHJ1Y3QgY2xrICogY2xrKTsKIHN0YXRpYyBpbnQgb21hcDFfc2VsZWN0X3RhYmxlX3JhdGUoc3RydWN0IGNsayAqIGNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKIHN0YXRpYyBsb25nIG9tYXAxX3JvdW5kX3RvX3RhYmxlX3JhdGUoc3RydWN0IGNsayAqIGNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKLXN0YXRpYyBpbnQgb21hcDFfY2xrX3VzZShzdHJ1Y3QgY2xrICpjbGspOwotc3RhdGljIHZvaWQgb21hcDFfY2xrX3VudXNlKHN0cnVjdCBjbGsgKmNsayk7CitzdGF0aWMgaW50IG9tYXAxX2Nsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKTsKK3N0YXRpYyB2b2lkIG9tYXAxX2Nsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsayk7CiAKIHN0cnVjdCBtcHVfcmF0ZSB7CiAJdW5zaWduZWQgbG9uZwkJcmF0ZTsKQEAgLTE1Miw4ICsxNTIsOCBAQAogCS5yYXRlCQk9IDEyMDAwMDAwLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwKIAkJCSAgQUxXQVlTX0VOQUJMRUQsCi0JLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZSwKLQkuZGlzYWJsZQk9ICZvbWFwMV9jbGtfZGlzYWJsZSwKKwkuZW5hYmxlCQk9ICZvbWFwMV9jbGtfZW5hYmxlX2dlbmVyaWMsCisJLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGVfZ2VuZXJpYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGNrX2RwbGwxID0gewpAQCAtMTYxLDggKzE2MSw4IEBACiAJLnBhcmVudAkJPSAmY2tfcmVmLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwKIAkJCSAgUkFURV9QUk9QQUdBVEVTIHwgQUxXQVlTX0VOQUJMRUQsCi0JLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZSwKLQkuZGlzYWJsZQk9ICZvbWFwMV9jbGtfZGlzYWJsZSwKKwkuZW5hYmxlCQk9ICZvbWFwMV9jbGtfZW5hYmxlX2dlbmVyaWMsCisJLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGVfZ2VuZXJpYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXJtX2lkbGVjdDFfY2xrIGNrX2RwbGwxb3V0ID0gewpAQCAtMTczLDggKzE3Myw4IEBACiAJCS5lbmFibGVfcmVnCT0gKHZvaWQgX19pb21lbSAqKUFSTV9JRExFQ1QyLAogCQkuZW5hYmxlX2JpdAk9IEVOX0NLT1VUX0FSTSwKIAkJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLQkJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZSwKLQkJLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGUsCisJCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGVfZ2VuZXJpYywKKwkJLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGVfZ2VuZXJpYywKIAl9LAogCS5pZGxlY3Rfc2hpZnQJPSAxMiwKIH07CkBAIC0xODYsOCArMTg2LDggQEAKIAkJCSAgUkFURV9DS0NUTCB8IFJBVEVfUFJPUEFHQVRFUyB8IEFMV0FZU19FTkFCTEVELAogCS5yYXRlX29mZnNldAk9IENLQ1RMX0FSTURJVl9PRkZTRVQsCiAJLnJlY2FsYwkJPSAmb21hcDFfY2tjdGxfcmVjYWxjLAotCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGUsCi0JLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGUsCisJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljLAorCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFybV9pZGxlY3QxX2NsayBhcm1wZXJfY2sgPSB7CkBAIC0yMDAsOCArMjAwLDggQEAKIAkJLmVuYWJsZV9iaXQJPSBFTl9QRVJDSywKIAkJLnJhdGVfb2Zmc2V0CT0gQ0tDVExfUEVSRElWX09GRlNFVCwKIAkJLnJlY2FsYwkJPSAmb21hcDFfY2tjdGxfcmVjYWxjLAotCQkuZW5hYmxlCQk9ICZvbWFwMV9jbGtfZW5hYmxlLAotCQkuZGlzYWJsZQk9ICZvbWFwMV9jbGtfZGlzYWJsZSwKKwkJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljLAorCQkuZGlzYWJsZQk9ICZvbWFwMV9jbGtfZGlzYWJsZV9nZW5lcmljLAogCX0sCiAJLmlkbGVjdF9zaGlmdAk9IDIsCiB9OwpAQCAtMjEzLDggKzIxMyw4IEBACiAJLmVuYWJsZV9yZWcJPSAodm9pZCBfX2lvbWVtICopQVJNX0lETEVDVDIsCiAJLmVuYWJsZV9iaXQJPSBFTl9HUElPQ0ssCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLQkuZW5hYmxlCQk9ICZvbWFwMV9jbGtfZW5hYmxlLAotCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlLAorCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGVfZ2VuZXJpYywKKwkuZGlzYWJsZQk9ICZvbWFwMV9jbGtfZGlzYWJsZV9nZW5lcmljLAogfTsKIAogc3RhdGljIHN0cnVjdCBhcm1faWRsZWN0MV9jbGsgYXJteG9yX2NrID0gewpAQCAtMjI2LDggKzIyNiw4IEBACiAJCS5lbmFibGVfcmVnCT0gKHZvaWQgX19pb21lbSAqKUFSTV9JRExFQ1QyLAogCQkuZW5hYmxlX2JpdAk9IEVOX1hPUlBDSywKIAkJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLQkJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZSwKLQkJLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGUsCisJCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGVfZ2VuZXJpYywKKwkJLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGVfZ2VuZXJpYywKIAl9LAogCS5pZGxlY3Rfc2hpZnQJPSAxLAogfTsKQEAgLTI0MSw4ICsyNDEsOCBAQAogCQkuZW5hYmxlX3JlZwk9ICh2b2lkIF9faW9tZW0gKilBUk1fSURMRUNUMiwKIAkJLmVuYWJsZV9iaXQJPSBFTl9USU1DSywKIAkJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLQkJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZSwKLQkJLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGUsCisJCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGVfZ2VuZXJpYywKKwkJLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGVfZ2VuZXJpYywKIAl9LAogCS5pZGxlY3Rfc2hpZnQJPSA5LAogfTsKQEAgLTI1Niw4ICsyNTYsOCBAQAogCQkuZW5hYmxlX3JlZwk9ICh2b2lkIF9faW9tZW0gKilBUk1fSURMRUNUMiwKIAkJLmVuYWJsZV9iaXQJPSBFTl9XRFRDSywKIAkJLnJlY2FsYwkJPSAmb21hcDFfd2F0Y2hkb2dfcmVjYWxjLAotCQkuZW5hYmxlCQk9ICZvbWFwMV9jbGtfZW5hYmxlLAotCQkuZGlzYWJsZQk9ICZvbWFwMV9jbGtfZGlzYWJsZSwKKwkJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljLAorCQkuZGlzYWJsZQk9ICZvbWFwMV9jbGtfZGlzYWJsZV9nZW5lcmljLAogCX0sCiAJLmlkbGVjdF9zaGlmdAk9IDAsCiB9OwpAQCAtMjcyLDggKzI3Miw4IEBACiAJICoKIAkgKiAxNTEwIHZlcnNpb24gaXMgaW4gVEMgY2xvY2tzLgogCSAqLwotCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGUsCi0JLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGUsCisJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljLAorCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBkc3BfY2sgPSB7CkBAIC0yODUsOCArMjg1LDggQEAKIAkuZW5hYmxlX2JpdAk9IEVOX0RTUENLLAogCS5yYXRlX29mZnNldAk9IENLQ1RMX0RTUERJVl9PRkZTRVQsCiAJLnJlY2FsYwkJPSAmb21hcDFfY2tjdGxfcmVjYWxjLAotCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGUsCi0JLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGUsCisJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljLAorCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBkc3BtbXVfY2sgPSB7CkBAIC0yOTYsOCArMjk2LDggQEAKIAkJCSAgUkFURV9DS0NUTCB8IEFMV0FZU19FTkFCTEVELAogCS5yYXRlX29mZnNldAk9IENLQ1RMX0RTUE1NVURJVl9PRkZTRVQsCiAJLnJlY2FsYwkJPSAmb21hcDFfY2tjdGxfcmVjYWxjLAotCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGUsCi0JLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGUsCisJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljLAorCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBkc3BwZXJfY2sgPSB7CkBAIC0zNDksOCArMzQ5LDggQEAKIAkJCQkgIENMT0NLX0lETEVfQ09OVFJPTCwKIAkJLnJhdGVfb2Zmc2V0CT0gQ0tDVExfVENESVZfT0ZGU0VULAogCQkucmVjYWxjCQk9ICZvbWFwMV9ja2N0bF9yZWNhbGMsCi0JCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGUsCi0JCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlLAorCQkuZW5hYmxlCQk9ICZvbWFwMV9jbGtfZW5hYmxlX2dlbmVyaWMsCisJCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMsCiAJfSwKIAkuaWRsZWN0X3NoaWZ0CT0gNiwKIH07CkBAIC0zNjQsOCArMzY0LDggQEAKIAkgKgogCSAqIDE2eHggdmVyc2lvbiBpcyBpbiBNUFUgY2xvY2tzLgogCSAqLwotCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGUsCi0JLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGUsCisJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljLAorCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayB0aXBiX2NrID0gewpAQCAtMzc0LDggKzM3NCw4IEBACiAJLnBhcmVudAkJPSAmdGNfY2suY2xrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IEFMV0FZU19FTkFCTEVELAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi0JLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZSwKLQkuZGlzYWJsZQk9ICZvbWFwMV9jbGtfZGlzYWJsZSwKKwkuZW5hYmxlCQk9ICZvbWFwMV9jbGtfZW5hYmxlX2dlbmVyaWMsCisJLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGVfZ2VuZXJpYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGwzX29jcGlfY2sgPSB7CkBAIC0zODYsOCArMzg2LDggQEAKIAkuZW5hYmxlX3JlZwk9ICh2b2lkIF9faW9tZW0gKilBUk1fSURMRUNUMywKIAkuZW5hYmxlX2JpdAk9IEVOX09DUElfQ0ssCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLQkuZW5hYmxlCQk9ICZvbWFwMV9jbGtfZW5hYmxlLAotCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlLAorCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGVfZ2VuZXJpYywKKwkuZGlzYWJsZQk9ICZvbWFwMV9jbGtfZGlzYWJsZV9nZW5lcmljLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgdGMxX2NrID0gewpAQCAtMzk3LDggKzM5Nyw4IEBACiAJLmVuYWJsZV9yZWcJPSAodm9pZCBfX2lvbWVtICopQVJNX0lETEVDVDMsCiAJLmVuYWJsZV9iaXQJPSBFTl9UQzFfQ0ssCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLQkuZW5hYmxlCQk9ICZvbWFwMV9jbGtfZW5hYmxlLAotCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlLAorCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGVfZ2VuZXJpYywKKwkuZGlzYWJsZQk9ICZvbWFwMV9jbGtfZGlzYWJsZV9nZW5lcmljLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgdGMyX2NrID0gewpAQCAtNDA4LDggKzQwOCw4IEBACiAJLmVuYWJsZV9yZWcJPSAodm9pZCBfX2lvbWVtICopQVJNX0lETEVDVDMsCiAJLmVuYWJsZV9iaXQJPSBFTl9UQzJfQ0ssCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLQkuZW5hYmxlCQk9ICZvbWFwMV9jbGtfZW5hYmxlLAotCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlLAorCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGVfZ2VuZXJpYywKKwkuZGlzYWJsZQk9ICZvbWFwMV9jbGtfZGlzYWJsZV9nZW5lcmljLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgZG1hX2NrID0gewpAQCAtNDE5LDggKzQxOSw4IEBACiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAogCQkJICBBTFdBWVNfRU5BQkxFRCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGUsCi0JLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGUsCisJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljLAorCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBkbWFfbGNkZnJlZV9jayA9IHsKQEAgLTQyOCw4ICs0MjgsOCBAQAogCS5wYXJlbnQJCT0gJnRjX2NrLmNsaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFggfCBBTFdBWVNfRU5BQkxFRCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGUsCi0JLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGUsCisJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljLAorCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFybV9pZGxlY3QxX2NsayBhcGlfY2sgPSB7CkBAIC00NDEsOCArNDQxLDggQEAKIAkJLmVuYWJsZV9yZWcJPSAodm9pZCBfX2lvbWVtICopQVJNX0lETEVDVDIsCiAJCS5lbmFibGVfYml0CT0gRU5fQVBJQ0ssCiAJCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi0JCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGUsCi0JCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlLAorCQkuZW5hYmxlCQk9ICZvbWFwMV9jbGtfZW5hYmxlX2dlbmVyaWMsCisJCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMsCiAJfSwKIAkuaWRsZWN0X3NoaWZ0CT0gOCwKIH07CkBAIC00NTUsOCArNDU1LDggQEAKIAkJLmVuYWJsZV9yZWcJPSAodm9pZCBfX2lvbWVtICopQVJNX0lETEVDVDIsCiAJCS5lbmFibGVfYml0CT0gRU5fTEJDSywKIAkJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLQkJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZSwKLQkJLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGUsCisJCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGVfZ2VuZXJpYywKKwkJLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGVfZ2VuZXJpYywKIAl9LAogCS5pZGxlY3Rfc2hpZnQJPSA0LAogfTsKQEAgLTQ2Niw4ICs0NjYsOCBAQAogCS5wYXJlbnQJCT0gJnRjX2NrLmNsaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFggfCBBTFdBWVNfRU5BQkxFRCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGUsCi0JLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGUsCisJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljLAorCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayByaGVhMl9jayA9IHsKQEAgLTQ3NSw4ICs0NzUsOCBAQAogCS5wYXJlbnQJCT0gJnRjX2NrLmNsaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFggfCBBTFdBWVNfRU5BQkxFRCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGUsCi0JLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGUsCisJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljLAorCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBsY2RfY2tfMTZ4eCA9IHsKQEAgLTQ4Nyw4ICs0ODcsOCBAQAogCS5lbmFibGVfYml0CT0gRU5fTENEQ0ssCiAJLnJhdGVfb2Zmc2V0CT0gQ0tDVExfTENERElWX09GRlNFVCwKIAkucmVjYWxjCQk9ICZvbWFwMV9ja2N0bF9yZWNhbGMsCi0JLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZSwKLQkuZGlzYWJsZQk9ICZvbWFwMV9jbGtfZGlzYWJsZSwKKwkuZW5hYmxlCQk9ICZvbWFwMV9jbGtfZW5hYmxlX2dlbmVyaWMsCisJLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGVfZ2VuZXJpYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXJtX2lkbGVjdDFfY2xrIGxjZF9ja18xNTEwID0gewpAQCAtNTAxLDggKzUwMSw4IEBACiAJCS5lbmFibGVfYml0CT0gRU5fTENEQ0ssCiAJCS5yYXRlX29mZnNldAk9IENLQ1RMX0xDRERJVl9PRkZTRVQsCiAJCS5yZWNhbGMJCT0gJm9tYXAxX2NrY3RsX3JlY2FsYywKLQkJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZSwKLQkJLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGUsCisJCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGVfZ2VuZXJpYywKKwkJLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGVfZ2VuZXJpYywKIAl9LAogCS5pZGxlY3Rfc2hpZnQJPSAzLAogfTsKQEAgLTUxOCw4ICs1MTgsOCBAQAogCS5lbmFibGVfYml0CT0gMjksCS8qIENob29zZXMgYmV0d2VlbiAxMk1IeiBhbmQgNDhNSHogKi8KIAkuc2V0X3JhdGUJPSAmb21hcDFfc2V0X3VhcnRfcmF0ZSwKIAkucmVjYWxjCQk9ICZvbWFwMV91YXJ0X3JlY2FsYywKLQkuZW5hYmxlCQk9ICZvbWFwMV9jbGtfZW5hYmxlLAotCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlLAorCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGVfZ2VuZXJpYywKKwkuZGlzYWJsZQk9ICZvbWFwMV9jbGtfZGlzYWJsZV9nZW5lcmljLAogfTsKIAogc3RhdGljIHN0cnVjdCB1YXJ0X2NsayB1YXJ0MV8xNnh4ID0gewpAQCAtNTUwLDggKzU1MCw4IEBACiAJLmVuYWJsZV9iaXQJPSAzMCwJLyogQ2hvb3NlcyBiZXR3ZWVuIDEyTUh6IGFuZCA0OE1IeiAqLwogCS5zZXRfcmF0ZQk9ICZvbWFwMV9zZXRfdWFydF9yYXRlLAogCS5yZWNhbGMJCT0gJm9tYXAxX3VhcnRfcmVjYWxjLAotCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGUsCi0JLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGUsCisJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljLAorCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayB1YXJ0M18xNTEwID0gewpAQCAtNTY1LDggKzU2NSw4IEBACiAJLmVuYWJsZV9iaXQJPSAzMSwJLyogQ2hvb3NlcyBiZXR3ZWVuIDEyTUh6IGFuZCA0OE1IeiAqLwogCS5zZXRfcmF0ZQk9ICZvbWFwMV9zZXRfdWFydF9yYXRlLAogCS5yZWNhbGMJCT0gJm9tYXAxX3VhcnRfcmVjYWxjLAotCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGUsCi0JLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGUsCisJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljLAorCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMsCiB9OwogCiBzdGF0aWMgc3RydWN0IHVhcnRfY2xrIHVhcnQzXzE2eHggPSB7CkBAIC01OTMsOCArNTkzLDggQEAKIAkJCSAgUkFURV9GSVhFRCB8IEVOQUJMRV9SRUdfMzJCSVQsCiAJLmVuYWJsZV9yZWcJPSAodm9pZCBfX2lvbWVtICopVUxQRF9DTE9DS19DVFJMLAogCS5lbmFibGVfYml0CT0gVVNCX01DTEtfRU5fQklULAotCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGUsCi0JLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGUsCisJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljLAorCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayB1c2JfaGhjX2NrMTUxMCA9IHsKQEAgLTYwNSw4ICs2MDUsOCBAQAogCQkJICBSQVRFX0ZJWEVEIHwgRU5BQkxFX1JFR18zMkJJVCwKIAkuZW5hYmxlX3JlZwk9ICh2b2lkIF9faW9tZW0gKilNT0RfQ09ORl9DVFJMXzAsCiAJLmVuYWJsZV9iaXQJPSBVU0JfSE9TVF9ISENfVUhPU1RfRU4sCi0JLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZSwKLQkuZGlzYWJsZQk9ICZvbWFwMV9jbGtfZGlzYWJsZSwKKwkuZW5hYmxlCQk9ICZvbWFwMV9jbGtfZW5hYmxlX2dlbmVyaWMsCisJLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGVfZ2VuZXJpYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHVzYl9oaGNfY2sxNnh4ID0gewpAQCAtNjE4LDggKzYxOCw4IEBACiAJCQkgIFJBVEVfRklYRUQgfCBFTkFCTEVfUkVHXzMyQklULAogCS5lbmFibGVfcmVnCT0gKHZvaWQgX19pb21lbSAqKU9UR19CQVNFICsgMHgwOCAvKiBPVEdfU1lTQ09OXzIgKi8sCiAJLmVuYWJsZV9iaXQJPSA4IC8qIFVIT1NUX0VOICovLAotCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGUsCi0JLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGUsCisJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljLAorCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayB1c2JfZGNfY2sgPSB7CkBAIC02MjksOCArNjI5LDggQEAKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFggfCBSQVRFX0ZJWEVELAogCS5lbmFibGVfcmVnCT0gKHZvaWQgX19pb21lbSAqKVNPRlRfUkVRX1JFRywKIAkuZW5hYmxlX2JpdAk9IDQsCi0JLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZSwKLQkuZGlzYWJsZQk9ICZvbWFwMV9jbGtfZGlzYWJsZSwKKwkuZW5hYmxlCQk9ICZvbWFwMV9jbGtfZW5hYmxlX2dlbmVyaWMsCisJLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGVfZ2VuZXJpYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIG1jbGtfMTUxMCA9IHsKQEAgLTYzOCw4ICs2MzgsOCBAQAogCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudC4gTWF5IGJlIGVuYWJsZWQgYnkgZXh0IGhhcmR3YXJlLiAqLwogCS5yYXRlCQk9IDEyMDAwMDAwLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IFJBVEVfRklYRUQsCi0JLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZSwKLQkuZGlzYWJsZQk9ICZvbWFwMV9jbGtfZGlzYWJsZSwKKwkuZW5hYmxlCQk9ICZvbWFwMV9jbGtfZW5hYmxlX2dlbmVyaWMsCisJLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGVfZ2VuZXJpYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIG1jbGtfMTZ4eCA9IHsKQEAgLTY1MSw4ICs2NTEsOCBAQAogCS5zZXRfcmF0ZQk9ICZvbWFwMV9zZXRfZXh0X2Nsa19yYXRlLAogCS5yb3VuZF9yYXRlCT0gJm9tYXAxX3JvdW5kX2V4dF9jbGtfcmF0ZSwKIAkuaW5pdAkJPSAmb21hcDFfaW5pdF9leHRfY2xrLAotCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGUsCi0JLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGUsCisJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljLAorCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBiY2xrXzE1MTAgPSB7CkBAIC02NjAsOCArNjYwLDggQEAKIAkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyBwYXJlbnQuIE1heSBiZSBlbmFibGVkIGJ5IGV4dCBoYXJkd2FyZS4gKi8KIAkucmF0ZQkJPSAxMjAwMDAwMCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBSQVRFX0ZJWEVELAotCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGUsCi0JLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGUsCisJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljLAorCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBiY2xrXzE2eHggPSB7CkBAIC02NzMsOCArNjczLDggQEAKIAkuc2V0X3JhdGUJPSAmb21hcDFfc2V0X2V4dF9jbGtfcmF0ZSwKIAkucm91bmRfcmF0ZQk9ICZvbWFwMV9yb3VuZF9leHRfY2xrX3JhdGUsCiAJLmluaXQJCT0gJm9tYXAxX2luaXRfZXh0X2NsaywKLQkuZW5hYmxlCQk9ICZvbWFwMV9jbGtfZW5hYmxlLAotCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlLAorCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGVfZ2VuZXJpYywKKwkuZGlzYWJsZQk9ICZvbWFwMV9jbGtfZGlzYWJsZV9nZW5lcmljLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgbW1jMV9jayA9IHsKQEAgLTY4Niw4ICs2ODYsOCBAQAogCQkJICBSQVRFX0ZJWEVEIHwgRU5BQkxFX1JFR18zMkJJVCB8IENMT0NLX05PX0lETEVfUEFSRU5ULAogCS5lbmFibGVfcmVnCT0gKHZvaWQgX19pb21lbSAqKU1PRF9DT05GX0NUUkxfMCwKIAkuZW5hYmxlX2JpdAk9IDIzLAotCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGUsCi0JLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGUsCisJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljLAorCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBtbWMyX2NrID0gewpAQCAtNjk5LDggKzY5OSw4IEBACiAJCQkgIFJBVEVfRklYRUQgfCBFTkFCTEVfUkVHXzMyQklUIHwgQ0xPQ0tfTk9fSURMRV9QQVJFTlQsCiAJLmVuYWJsZV9yZWcJPSAodm9pZCBfX2lvbWVtICopTU9EX0NPTkZfQ1RSTF8wLAogCS5lbmFibGVfYml0CT0gMjAsCi0JLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZSwKLQkuZGlzYWJsZQk9ICZvbWFwMV9jbGtfZGlzYWJsZSwKKwkuZW5hYmxlCQk9ICZvbWFwMV9jbGtfZW5hYmxlX2dlbmVyaWMsCisJLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGVfZ2VuZXJpYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHZpcnR1YWxfY2tfbXB1ID0gewpAQCAtNzExLDggKzcxMSw4IEBACiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIAkuc2V0X3JhdGUJPSAmb21hcDFfc2VsZWN0X3RhYmxlX3JhdGUsCiAJLnJvdW5kX3JhdGUJPSAmb21hcDFfcm91bmRfdG9fdGFibGVfcmF0ZSwKLQkuZW5hYmxlCQk9ICZvbWFwMV9jbGtfZW5hYmxlLAotCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlLAorCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGVfZ2VuZXJpYywKKwkuZGlzYWJsZQk9ICZvbWFwMV9jbGtfZGlzYWJsZV9nZW5lcmljLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgKiBvbmNoaXBfY2xrc1tdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9zZXJpYWwuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvc2VyaWFsLmMKaW5kZXggNjgxMGNmYi4uZTkyNGUwYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9zZXJpYWwuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL3NlcmlhbC5jCkBAIC0xNywxMCArMTcsMTAgQEAKICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgpAQCAtMTQ2LDcgKzE0Niw3IEBACiAJCQlpZiAoSVNfRVJSKHVhcnQxX2NrKSkKIAkJCQlwcmludGsoIkNvdWxkIG5vdCBnZXQgdWFydDFfY2tcbiIpOwogCQkJZWxzZSB7Ci0JCQkJY2xrX3VzZSh1YXJ0MV9jayk7CisJCQkJY2xrX2VuYWJsZSh1YXJ0MV9jayk7CiAJCQkJaWYgKGNwdV9pc19vbWFwMTUxMCgpKQogCQkJCQljbGtfc2V0X3JhdGUodWFydDFfY2ssIDEyMDAwMDAwKTsKIAkJCX0KQEAgLTE2Niw3ICsxNjYsNyBAQAogCQkJaWYgKElTX0VSUih1YXJ0Ml9jaykpCiAJCQkJcHJpbnRrKCJDb3VsZCBub3QgZ2V0IHVhcnQyX2NrXG4iKTsKIAkJCWVsc2UgewotCQkJCWNsa191c2UodWFydDJfY2spOworCQkJCWNsa19lbmFibGUodWFydDJfY2spOwogCQkJCWlmIChjcHVfaXNfb21hcDE1MTAoKSkKIAkJCQkJY2xrX3NldF9yYXRlKHVhcnQyX2NrLCAxMjAwMDAwMCk7CiAJCQkJZWxzZQpAQCAtMTg4LDcgKzE4OCw3IEBACiAJCQlpZiAoSVNfRVJSKHVhcnQzX2NrKSkKIAkJCQlwcmludGsoIkNvdWxkIG5vdCBnZXQgdWFydDNfY2tcbiIpOwogCQkJZWxzZSB7Ci0JCQkJY2xrX3VzZSh1YXJ0M19jayk7CisJCQkJY2xrX2VuYWJsZSh1YXJ0M19jayk7CiAJCQkJaWYgKGNwdV9pc19vbWFwMTUxMCgpKQogCQkJCQljbGtfc2V0X3JhdGUodWFydDNfY2ssIDEyMDAwMDAwKTsKIAkJCX0KQEAgLTI1Miw5ICsyNTIsOCBAQAogCQlyZXR1cm47CiAJfQogCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKGdwaW9fbnIsIDEpOwotCXNldF9pcnFfdHlwZShPTUFQX0dQSU9fSVJRKGdwaW9fbnIpLCBJUlFUX1JJU0lORyk7CiAJcmV0ID0gcmVxdWVzdF9pcnEoT01BUF9HUElPX0lSUShncGlvX25yKSwgJm9tYXBfc2VyaWFsX3dha2VfaW50ZXJydXB0LAotCQkJICAwLCAic2VyaWFsIHdha2V1cCIsIE5VTEwpOworCQkJICBTQV9UUklHR0VSX1JJU0lORywgInNlcmlhbCB3YWtldXAiLCBOVUxMKTsKIAlpZiAocmV0KSB7CiAJCW9tYXBfZnJlZV9ncGlvKGdwaW9fbnIpOwogCQlwcmludGsoS0VSTl9FUlIgIk5vIGludGVycnVwdCBmb3IgVUFSVCB3YWtlIEdQSU86ICVpXG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1nZW5lcmljLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWdlbmVyaWMuYwppbmRleCBjNjAyZTdhLi5iOTM3MTIzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWdlbmVyaWMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWdlbmVyaWMuYwpAQCAtNjksNyArNjksNiBAQAogCiBNQUNISU5FX1NUQVJUKE9NQVBfR0VORVJJQywgIkdlbmVyaWMgT01BUDI0eHgiKQogCS8qIE1haW50YWluZXI6IFBhdWwgTXVuZHQgPHBhdWwubXVuZHRAbm9raWEuY29tPiAqLwotCS5waHlzX3JhbQk9IDB4ODAwMDAwMDAsCiAJLnBoeXNfaW8JPSAweDQ4MDAwMDAwLAogCS5pb19wZ19vZmZzdAk9ICgoMHhkODAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWg0LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWg0LmMKaW5kZXggZjI1NTQ0Ni4uYzNjMzVkNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1oNC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaDQuYwpAQCAtMTg2LDcgKzE4Niw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoT01BUF9INCwgIk9NQVAyNDIwIEg0IGJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBQYXVsIE11bmR0IDxwYXVsLm11bmR0QG5va2lhLmNvbT4gKi8KLQkucGh5c19yYW0JPSAweDgwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg0ODAwMDAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZDgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jay5jCmluZGV4IDg1ODE4ZDkuLjE4MGY2NzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrLmMKQEAgLTIyLDEwICsyMiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2NrLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvc3JhbS5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3ByY20uaD4KQEAgLTExMSw3ICsxMTEsNyBAQAogLyogRW5hYmxlcyBjbG9jayB3aXRob3V0IGNvbnNpZGVyaW5nIHBhcmVudCBkZXBlbmRlbmNpZXMgb3IgdXNlIGNvdW50CiAgKiBSRVZJU0lUOiBNYXliZSBjaGFuZ2UgdGhpcyB0byB1c2UgY2xrLT5lbmFibGUgbGlrZSBvbiBvbWFwMT8KICAqLwotc3RhdGljIGludCBvbWFwMl9jbGtfZW5hYmxlKHN0cnVjdCBjbGsgKiBjbGspCitzdGF0aWMgaW50IF9vbWFwMl9jbGtfZW5hYmxlKHN0cnVjdCBjbGsgKiBjbGspCiB7CiAJdTMyIHJlZ3ZhbDMyOwogCkBAIC0xNTAsNyArMTUwLDcgQEAKIH0KIAogLyogRGlzYWJsZXMgY2xvY2sgd2l0aG91dCBjb25zaWRlcmluZyBwYXJlbnQgZGVwZW5kZW5jaWVzIG9yIHVzZSBjb3VudCAqLwotc3RhdGljIHZvaWQgb21hcDJfY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIHZvaWQgX29tYXAyX2Nsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKIHsKIAl1MzIgcmVndmFsMzI7CiAKQEAgLTE2NywyMyArMTY3LDIzIEBACiAJX19yYXdfd3JpdGVsKHJlZ3ZhbDMyLCBjbGstPmVuYWJsZV9yZWcpOwogfQogCi1zdGF0aWMgaW50IG9tYXAyX2Nsa191c2Uoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIGludCBvbWFwMl9jbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgcmV0ID0gMDsKIAogCWlmIChjbGstPnVzZWNvdW50KysgPT0gMCkgewogCQlpZiAobGlrZWx5KCh1MzIpY2xrLT5wYXJlbnQpKQotCQkJcmV0ID0gb21hcDJfY2xrX3VzZShjbGstPnBhcmVudCk7CisJCQlyZXQgPSBvbWFwMl9jbGtfZW5hYmxlKGNsay0+cGFyZW50KTsKIAogCQlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CiAJCQljbGstPnVzZWNvdW50LS07CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAKLQkJcmV0ID0gb21hcDJfY2xrX2VuYWJsZShjbGspOworCQlyZXQgPSBfb21hcDJfY2xrX2VuYWJsZShjbGspOwogCiAJCWlmICh1bmxpa2VseShyZXQgIT0gMCkgJiYgY2xrLT5wYXJlbnQpIHsKLQkJCW9tYXAyX2Nsa191bnVzZShjbGstPnBhcmVudCk7CisJCQlvbWFwMl9jbGtfZGlzYWJsZShjbGstPnBhcmVudCk7CiAJCQljbGstPnVzZWNvdW50LS07CiAJCX0KIAl9CkBAIC0xOTEsMTIgKzE5MSwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIG9tYXAyX2Nsa191bnVzZShzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgdm9pZCBvbWFwMl9jbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCiB7CiAJaWYgKGNsay0+dXNlY291bnQgPiAwICYmICEoLS1jbGstPnVzZWNvdW50KSkgewotCQlvbWFwMl9jbGtfZGlzYWJsZShjbGspOworCQlfb21hcDJfY2xrX2Rpc2FibGUoY2xrKTsKIAkJaWYgKGxpa2VseSgodTMyKWNsay0+cGFyZW50KSkKLQkJCW9tYXAyX2Nsa191bnVzZShjbGstPnBhcmVudCk7CisJCQlvbWFwMl9jbGtfZGlzYWJsZShjbGstPnBhcmVudCk7CiAJfQogfQogCkBAIC04NzMsNyArODczLDcgQEAKIAkJcmVnID0gKHZvaWQgX19pb21lbSAqKXNyY19zZWw7CiAKIAkJaWYgKGNsay0+dXNlY291bnQgPiAwKQotCQkJb21hcDJfY2xrX2Rpc2FibGUoY2xrKTsKKwkJCV9vbWFwMl9jbGtfZGlzYWJsZShjbGspOwogCiAJCS8qIFNldCBuZXcgc291cmNlIHZhbHVlIChwcmV2aW91cyBkaXZpZGVycyBpZiBhbnkgaW4gZWZmZWN0KSAqLwogCQlyZWdfdmFsID0gX19yYXdfcmVhZGwocmVnKSAmIH4oZmllbGRfbWFzayA8PCBzcmNfb2ZmKTsKQEAgLTg4NCw3ICs4ODQsNyBAQAogCQkJX19yYXdfd3JpdGVsKDB4MSwgKHZvaWQgX19pb21lbSAqKSZQUkNNX0NMS0NGR19DVFJMKTsKIAogCQlpZiAoY2xrLT51c2Vjb3VudCA+IDApCi0JCQlvbWFwMl9jbGtfZW5hYmxlKGNsayk7CisJCQlfb21hcDJfY2xrX2VuYWJsZShjbGspOwogCiAJCWNsay0+cGFyZW50ID0gbmV3X3BhcmVudDsKIApAQCAtOTk5LDggKzk5OSw2IEBACiBzdGF0aWMgc3RydWN0IGNsa19mdW5jdGlvbnMgb21hcDJfY2xrX2Z1bmN0aW9ucyA9IHsKIAkuY2xrX2VuYWJsZQkJPSBvbWFwMl9jbGtfZW5hYmxlLAogCS5jbGtfZGlzYWJsZQkJPSBvbWFwMl9jbGtfZGlzYWJsZSwKLQkuY2xrX3VzZQkJPSBvbWFwMl9jbGtfdXNlLAotCS5jbGtfdW51c2UJCT0gb21hcDJfY2xrX3VudXNlLAogCS5jbGtfcm91bmRfcmF0ZQkJPSBvbWFwMl9jbGtfcm91bmRfcmF0ZSwKIAkuY2xrX3NldF9yYXRlCQk9IG9tYXAyX2Nsa19zZXRfcmF0ZSwKIAkuY2xrX3NldF9wYXJlbnQJCT0gb21hcDJfY2xrX3NldF9wYXJlbnQsCkBAIC0xMDQ1LDcgKzEwNDMsNyBAQAogCQkJY29udGludWU7CiAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiRGlzYWJsaW5nIHVudXNlZCBjbG9jayBcIiVzXCJcbiIsIGNrLT5uYW1lKTsKLQkJb21hcDJfY2xrX2Rpc2FibGUoY2spOworCQlfb21hcDJfY2xrX2Rpc2FibGUoY2spOwogCX0KIH0KIGxhdGVfaW5pdGNhbGwob21hcDJfZGlzYWJsZV91bnVzZWRfY2xvY2tzKTsKQEAgLTExMjAsMTAgKzExMTgsMTAgQEAKIAkgKiBPbmx5IGVuYWJsZSB0aG9zZSBjbG9ja3Mgd2Ugd2lsbCBuZWVkLCBsZXQgdGhlIGRyaXZlcnMKIAkgKiBlbmFibGUgb3RoZXIgY2xvY2tzIGFzIG5lY2Vzc2FyeQogCSAqLwotCWNsa191c2UoJnN5bmNfMzJrX2ljayk7Ci0JY2xrX3VzZSgmb21hcGN0cmxfaWNrKTsKKwljbGtfZW5hYmxlKCZzeW5jXzMya19pY2spOworCWNsa19lbmFibGUoJm9tYXBjdHJsX2ljayk7CiAJaWYgKGNwdV9pc19vbWFwMjQzMCgpKQotCQljbGtfdXNlKCZzZHJjX2ljayk7CisJCWNsa19lbmFibGUoJnNkcmNfaWNrKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jay5oCmluZGV4IDRhZWFiNTUuLjZjYWIyMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2suaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrLmgKQEAgLTI0LDcgKzI0LDcgQEAKIHN0YXRpYyB2b2lkIG9tYXAyX21wdV9yZWNhbGMoc3RydWN0IGNsayAqIGNsayk7CiBzdGF0aWMgaW50IG9tYXAyX3NlbGVjdF90YWJsZV9yYXRlKHN0cnVjdCBjbGsgKiBjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7CiBzdGF0aWMgbG9uZyBvbWFwMl9yb3VuZF90b190YWJsZV9yYXRlKHN0cnVjdCBjbGsgKiBjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7Ci1zdGF0aWMgdm9pZCBvbWFwMl9jbGtfdW51c2Uoc3RydWN0IGNsayAqY2xrKTsKK3N0YXRpYyB2b2lkIG9tYXAyX2Nsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsayk7CiBzdGF0aWMgdm9pZCBvbWFwMl9zeXNfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICogY2xrKTsKIHN0YXRpYyB1MzIgb21hcDJfY2xrc2VsX3RvX2Rpdmlzb3IodTMyIGRpdl9zZWwsIHUzMiBmaWVsZF92YWwpOwogc3RhdGljIHUzMiBvbWFwMl9jbGtzZWxfZ2V0X2Rpdmlzb3Ioc3RydWN0IGNsayAqY2xrKTsKQEAgLTg1OSw3ICs4NTksNyBAQAogCiBzdGF0aWMgc3RydWN0IGNsayB1c2JfbDRfaWNrID0gewkvKiBGUy1VU0IgaW50ZXJmYWNlIGNsb2NrICovCiAJLm5hbWUJCT0gInVzYl9sNF9pY2siLAotCS5wYXJlbnQJCT0gJmNvcmVfY2ssCisJLnBhcmVudAkJPSAmY29yZV9sM19jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCB8CiAJCQkJUkFURV9DS0NUTCB8IENNX0NPUkVfU0VMMSB8IERFTEFZRURfQVBQIHwKIAkJCQlDT05GSUdfUEFSVElDSVBBTlQsCkBAIC0xMDQ1LDcgKzEwNDUsNyBAQAogCS5uYW1lCQk9ICJncHQxX2ljayIsCiAJLnBhcmVudAkJPSAmbDRfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1gsCi0JLmVuYWJsZV9yZWcJPSAodm9pZCBfX2lvbWVtICopJkNNX0lDTEtFTl9XS1VQLAkvKiBCaXQ0ICovCisJLmVuYWJsZV9yZWcJPSAodm9pZCBfX2lvbWVtICopJkNNX0lDTEtFTl9XS1VQLAkvKiBCaXQwICovCiAJLmVuYWJsZV9iaXQJPSAwLAogCS5yZWNhbGMJCT0gJm9tYXAyX2ZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwpAQCAtMTA1NSw3ICsxMDU1LDcgQEAKIAkucGFyZW50CQk9ICZmdW5jXzMya19jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCB8CiAJCQkJQ01fV0tVUF9TRUwxLAotCS5lbmFibGVfcmVnCT0gKHZvaWQgX19pb21lbSAqKSZDTV9GQ0xLRU5fV0tVUCwKKwkuZW5hYmxlX3JlZwk9ICh2b2lkIF9faW9tZW0gKikmQ01fRkNMS0VOX1dLVVAsCS8qIEJpdDAgKi8KIAkuZW5hYmxlX2JpdAk9IDAsCiAJLnNyY19vZmZzZXQJPSAwLAogCS5yZWNhbGMJCT0gJm9tYXAyX2ZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0xMDY1LDcgKzEwNjUsNyBAQAogCS5uYW1lCQk9ICJncHQyX2ljayIsCiAJLnBhcmVudAkJPSAmbDRfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1gsCi0JLmVuYWJsZV9yZWcJPSAodm9pZCBfX2lvbWVtICopJkNNX0lDTEtFTjFfQ09SRSwJLyogYml0NCAqLworCS5lbmFibGVfcmVnCT0gKHZvaWQgX19pb21lbSAqKSZDTV9JQ0xLRU4xX0NPUkUsCS8qIEJpdDQgKi8KIAkuZW5hYmxlX2JpdAk9IDAsCiAJLnJlY2FsYwkJPSAmb21hcDJfZm9sbG93cGFyZW50X3JlY2FsYywKIH07CkBAIC0xODM5LDcgKzE4MzksNyBAQAogCiBzdGF0aWMgc3RydWN0IGNsayB1c2Joc19pY2sgPSB7CiAJLm5hbWUJCT0gInVzYmhzX2ljayIsCi0JLnBhcmVudAkJPSAmbDRfY2ssCisJLnBhcmVudAkJPSAmY29yZV9sM19jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0M1gsCiAJLmVuYWJsZV9yZWcJPSAodm9pZCBfX2lvbWVtICopJkNNX0lDTEtFTjJfQ09SRSwKIAkuZW5hYmxlX2JpdAk9IDYsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3NlcmlhbC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9zZXJpYWwuYwppbmRleCBmNGRmMDRmLi4yNGRkMzc0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3NlcmlhbC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvc2VyaWFsLmMKQEAgLTE2LDkgKzE2LDkgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KIAogI2luY2x1ZGUgPGFzbS9hcmNoL2NvbW1vbi5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CkBAIC0xMTksMTQgKzExOSwxNCBAQAogCQkJaWYgKElTX0VSUih1YXJ0MV9pY2spKQogCQkJCXByaW50aygiQ291bGQgbm90IGdldCB1YXJ0MV9pY2tcbiIpOwogCQkJZWxzZSB7Ci0JCQkJY2xrX3VzZSh1YXJ0MV9pY2spOworCQkJCWNsa19lbmFibGUodWFydDFfaWNrKTsKIAkJCX0KIAogCQkJdWFydDFfZmNrID0gY2xrX2dldChOVUxMLCAidWFydDFfZmNrIik7CiAJCQlpZiAoSVNfRVJSKHVhcnQxX2ZjaykpCiAJCQkJcHJpbnRrKCJDb3VsZCBub3QgZ2V0IHVhcnQxX2Zja1xuIik7CiAJCQllbHNlIHsKLQkJCQljbGtfdXNlKHVhcnQxX2Zjayk7CisJCQkJY2xrX2VuYWJsZSh1YXJ0MV9mY2spOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgMToKQEAgLTEzNCwxNCArMTM0LDE0IEBACiAJCQlpZiAoSVNfRVJSKHVhcnQyX2ljaykpCiAJCQkJcHJpbnRrKCJDb3VsZCBub3QgZ2V0IHVhcnQyX2lja1xuIik7CiAJCQllbHNlIHsKLQkJCQljbGtfdXNlKHVhcnQyX2ljayk7CisJCQkJY2xrX2VuYWJsZSh1YXJ0Ml9pY2spOwogCQkJfQogCiAJCQl1YXJ0Ml9mY2sgPSBjbGtfZ2V0KE5VTEwsICJ1YXJ0Ml9mY2siKTsKIAkJCWlmIChJU19FUlIodWFydDJfZmNrKSkKIAkJCQlwcmludGsoIkNvdWxkIG5vdCBnZXQgdWFydDJfZmNrXG4iKTsKIAkJCWVsc2UgewotCQkJCWNsa191c2UodWFydDJfZmNrKTsKKwkJCQljbGtfZW5hYmxlKHVhcnQyX2Zjayk7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSAyOgpAQCAtMTQ5LDE0ICsxNDksMTQgQEAKIAkJCWlmIChJU19FUlIodWFydDNfaWNrKSkKIAkJCQlwcmludGsoIkNvdWxkIG5vdCBnZXQgdWFydDNfaWNrXG4iKTsKIAkJCWVsc2UgewotCQkJCWNsa191c2UodWFydDNfaWNrKTsKKwkJCQljbGtfZW5hYmxlKHVhcnQzX2ljayk7CiAJCQl9CiAKIAkJCXVhcnQzX2ZjayA9IGNsa19nZXQoTlVMTCwgInVhcnQzX2ZjayIpOwogCQkJaWYgKElTX0VSUih1YXJ0M19mY2spKQogCQkJCXByaW50aygiQ291bGQgbm90IGdldCB1YXJ0M19mY2tcbiIpOwogCQkJZWxzZSB7Ci0JCQkJY2xrX3VzZSh1YXJ0M19mY2spOworCQkJCWNsa19lbmFibGUodWFydDNfZmNrKTsKIAkJCX0KIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3RpbWVyLWdwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3RpbWVyLWdwLmMKaW5kZXggOWVjMTE0NC4uMWQyZjVhYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi90aW1lci1ncC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdGltZXItZ3AuYwpAQCAtMjEsMTAgKzIxLDExIEBACiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorCiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgogCiAjZGVmaW5lIE9NQVAyX0dQX1RJTUVSMV9CQVNFCTB4NDgwMjgwMDAKICNkZWZpbmUgT01BUDJfR1BfVElNRVIyX0JBU0UJMHg0ODAyYTAwMApAQCAtMTAzLDcgKzEwNCw3IEBACiAJaWYgKElTX0VSUihzeXNfY2spKQogCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBnZXQgc3lzX2NrXG4iKTsKIAllbHNlIHsKLQkJY2xrX3VzZShzeXNfY2spOworCQljbGtfZW5hYmxlKHN5c19jayk7CiAJCXRpY2tfcGVyaW9kID0gY2xrX2dldF9yYXRlKHN5c19jaykgLyAxMDA7CiAJCWNsa19wdXQoc3lzX2NrKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1weGEvS2NvbmZpZwppbmRleCAyYTU4NDk5Li5jMWQ3N2Y1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL0tjb25maWcKQEAgLTExMiwxMiArMTEyLDE0IEBACiBjb25maWcgUFhBX1NIQVJQX0M3eHgKIAlib29sCiAJc2VsZWN0IFBYQV9TU1AKKwlzZWxlY3QgU0hBUlBTTF9QTQogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBhbGwgU2hhcnAgQzd4eCBtb2RlbHMKIAogY29uZmlnIFBYQV9TSEFSUF9DeHgwMAogCWJvb2wKIAlzZWxlY3QgUFhBX1NTUAorCXNlbGVjdCBTSEFSUFNMX1BNCiAJaGVscAogCSAgRW5hYmxlIGNvbW1vbiBzdXBwb3J0IGZvciBTaGFycCBDeHgwMCBtb2RlbHMKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2kuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpLmMKaW5kZXggMTAwZmIzMS4uN2ZmZDJkZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2kuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaS5jCkBAIC0yMTMsMTUgKzIxMywxNCBAQAogCiAJY29yZ2lfbWNpX3BsYXRmb3JtX2RhdGEuZGV0ZWN0X2RlbGF5ID0gbXNlY3NfdG9famlmZmllcygyNTApOwogCi0JZXJyID0gcmVxdWVzdF9pcnEoQ09SR0lfSVJRX0dQSU9fblNEX0RFVEVDVCwgY29yZ2lfZGV0ZWN0X2ludCwgU0FfSU5URVJSVVBULAotCQkJICAgICAiTU1DIGNhcmQgZGV0ZWN0IiwgZGF0YSk7CisJZXJyID0gcmVxdWVzdF9pcnEoQ09SR0lfSVJRX0dQSU9fblNEX0RFVEVDVCwgY29yZ2lfZGV0ZWN0X2ludCwKKwkJCSAgU0FfSU5URVJSVVBUIHwgU0FfVFJJR0dFUl9SSVNJTkcgfCBTQV9UUklHR0VSX0ZBTExJTkcsCisJCQkgICJNTUMgY2FyZCBkZXRlY3QiLCBkYXRhKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiY29yZ2lfbWNpX2luaXQ6IE1NQy9TRDogY2FuJ3QgcmVxdWVzdCBNTUMgY2FyZCBkZXRlY3QgSVJRXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCXNldF9pcnFfdHlwZShDT1JHSV9JUlFfR1BJT19uU0RfREVURUNULCBJUlFUX0JPVEhFREdFKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0zNDMsNyArMzQyLDYgQEAKIAogI2lmZGVmIENPTkZJR19NQUNIX0NPUkdJCiBNQUNISU5FX1NUQVJUKENPUkdJLCAiU0hBUlAgQ29yZ2kiKQotCS5waHlzX3JhbQk9IDB4YTAwMDAwMDAsCiAJLnBoeXNfaW8JPSAweDQwMDAwMDAwLAogCS5pb19wZ19vZmZzdAk9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5maXh1cAkJPSBmaXh1cF9jb3JnaSwKQEAgLTM1Niw3ICszNTQsNiBAQAogCiAjaWZkZWYgQ09ORklHX01BQ0hfU0hFUEhFUkQKIE1BQ0hJTkVfU1RBUlQoU0hFUEhFUkQsICJTSEFSUCBTaGVwaGVyZCIpCi0JLnBoeXNfcmFtCT0gMHhhMDAwMDAwMCwKIAkucGh5c19pbwk9IDB4NDAwMDAwMDAsCiAJLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmZpeHVwCQk9IGZpeHVwX2NvcmdpLApAQCAtMzY5LDcgKzM2Niw2IEBACiAKICNpZmRlZiBDT05GSUdfTUFDSF9IVVNLWQogTUFDSElORV9TVEFSVChIVVNLWSwgIlNIQVJQIEh1c2t5IikKLQkucGh5c19yYW0JPSAweGEwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoaW9fcDJ2KDB4NDAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuZml4dXAJCT0gZml4dXBfY29yZ2ksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaV9wbS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2lfcG0uYwppbmRleCA1OTliZTE0Li43YTFhYjczIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaV9wbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpX3BtLmMKQEAgLTMzLDE5ICszMyw3IEBACiAJcHhhX2dwaW9fbW9kZShDT1JHSV9HUElPX0NIUkdfT04gfCBHUElPX09VVCk7CiAJcHhhX2dwaW9fbW9kZShDT1JHSV9HUElPX0NIUkdfVUtOIHwgR1BJT19PVVQpOwogCXB4YV9ncGlvX21vZGUoQ09SR0lfR1BJT19LRVlfSU5UIHwgR1BJT19JTik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcmdpX2NoYXJnZV9sZWQoaW50IHZhbCkKLXsKLQlpZiAodmFsID09IFNIQVJQU0xfTEVEX0VSUk9SKSB7Ci0JCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJDaGFyZ2UgTEVEIEVycm9yXG4iKTsKLQl9IGVsc2UgaWYgKHZhbCA9PSBTSEFSUFNMX0xFRF9PTikgewotCQlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiQ2hhcmdlIExFRCBPblxuIik7Ci0JCUdQU1IwID0gR1BJT19iaXQoQ09SR0lfR1BJT19MRURfT1JBTkdFKTsKLQl9IGVsc2UgewotCQlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiQ2hhcmdlIExFRCBPZmZcbiIpOwotCQlHUENSMCA9IEdQSU9fYml0KENPUkdJX0dQSU9fTEVEX09SQU5HRSk7Ci0JfQorCXNoYXJwc2xfcG1fcHhhX2luaXQoKTsKIH0KIAogc3RhdGljIHZvaWQgY29yZ2lfbWVhc3VyZV90ZW1wKGludCBvbikKQEAgLTEzOCwxNSArMTI2LDE1IEBACiAJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIkdQTFIwID0gJXgsJXhcbiIsIEdQTFIwLCBQRURSKTsKIAogCWlmICgoUEVEUiAmIEdQSU9fYml0KENPUkdJX0dQSU9fQUNfSU4pKSkgewotCQlpZiAoU1RBVFVTX0FDX0lOKCkpIHsKKwkJaWYgKHNoYXJwc2xfcG0ubWFjaGluZm8tPnJlYWRfZGV2ZGF0YShTSEFSUFNMX1NUQVRVU19BQ0lOKSkgewogCQkJLyogY2hhcmdlIG9uICovCiAJCQlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiYWMgaW5zZXJ0XG4iKTsKIAkJCXNoYXJwc2xfcG0uZmxhZ3MgfD0gU0hBUlBTTF9ET19PRkZMSU5FX0NIUkc7CiAJCX0gZWxzZSB7CiAJCQkvKiBjaGFyZ2Ugb2ZmICovCiAJCQlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiYWMgcmVtb3ZlXG4iKTsKLQkJCUNIQVJHRV9MRURfT0ZGKCk7Ci0JCQlDSEFSR0VfT0ZGKCk7CisJCQlzaGFycHNsX3BtX2xlZChTSEFSUFNMX0xFRF9PRkYpOworCQkJc2hhcnBzbF9wbS5tYWNoaW5mby0+Y2hhcmdlKDApOwogCQkJc2hhcnBzbF9wbS5jaGFyZ2VfbW9kZSA9IENIUkdfT0ZGOwogCQl9CiAJfQpAQCAtMTcyLDIzICsxNjAsMzkgQEAKIAlyZXR1cm4gfkdQTFIwICYgKCBHUElPX2JpdChDT1JHSV9HUElPX0FDX0lOKSB8IEdQSU9fYml0KENPUkdJX0dQSU9fS0VZX0lOVCkgfCBHUElPX2JpdChDT1JHSV9HUElPX1dBS0VVUCkgKTsKIH0KIAotc3RhdGljIGludCBjb3JnaV9hY2luX3N0YXR1cyh2b2lkKQordW5zaWduZWQgbG9uZyBjb3JnaXBtX3JlYWRfZGV2ZGF0YShpbnQgdHlwZSkKIHsKLQlyZXR1cm4gKChHUExSKENPUkdJX0dQSU9fQUNfSU4pICYgR1BJT19iaXQoQ09SR0lfR1BJT19BQ19JTikpICE9IDApOworCXN3aXRjaCh0eXBlKSB7CisJY2FzZSBTSEFSUFNMX1NUQVRVU19BQ0lOOgorCQlyZXR1cm4gKChHUExSKENPUkdJX0dQSU9fQUNfSU4pICYgR1BJT19iaXQoQ09SR0lfR1BJT19BQ19JTikpICE9IDApOworCWNhc2UgU0hBUlBTTF9TVEFUVVNfTE9DSzoKKwkJcmV0dXJuIFJFQURfR1BJT19CSVQoc2hhcnBzbF9wbS5tYWNoaW5mby0+Z3Bpb19iYXRsb2NrKTsKKwljYXNlIFNIQVJQU0xfU1RBVFVTX0NIUkdGVUxMOgorCQlyZXR1cm4gUkVBRF9HUElPX0JJVChzaGFycHNsX3BtLm1hY2hpbmZvLT5ncGlvX2JhdGZ1bGwpOworCWNhc2UgU0hBUlBTTF9TVEFUVVNfRkFUQUw6CisJCXJldHVybiBSRUFEX0dQSU9fQklUKHNoYXJwc2xfcG0ubWFjaGluZm8tPmdwaW9fZmF0YWwpOworCWNhc2UgU0hBUlBTTF9BQ0lOX1ZPTFQ6CisJCXJldHVybiBzaGFycHNsX3BtX3B4YV9yZWFkX21heDExMTEoTUFYMTExMV9BQ0lOX1ZPTFQpOworCWNhc2UgU0hBUlBTTF9CQVRUX1RFTVA6CisJCXJldHVybiBzaGFycHNsX3BtX3B4YV9yZWFkX21heDExMTEoTUFYMTExMV9CQVRUX1RFTVApOworCWNhc2UgU0hBUlBTTF9CQVRUX1ZPTFQ6CisJZGVmYXVsdDoKKwkJcmV0dXJuIHNoYXJwc2xfcG1fcHhhX3JlYWRfbWF4MTExMShNQVgxMTExX0JBVFRfVk9MVCk7CisJfQogfQogCiBzdGF0aWMgc3RydWN0IHNoYXJwc2xfY2hhcmdlcl9tYWNoaW5mbyBjb3JnaV9wbV9tYWNoaW5mbyA9IHsKIAkuaW5pdCAgICAgICAgICAgID0gY29yZ2lfY2hhcmdlcl9pbml0LAorCS5leGl0ICAgICAgICAgICAgPSBzaGFycHNsX3BtX3B4YV9yZW1vdmUsCiAJLmdwaW9fYmF0bG9jayAgICA9IENPUkdJX0dQSU9fQkFUX0NPVkVSLAogCS5ncGlvX2FjaW4gICAgICAgPSBDT1JHSV9HUElPX0FDX0lOLAogCS5ncGlvX2JhdGZ1bGwgICAgPSBDT1JHSV9HUElPX0NIUkdfRlVMTCwKLQkuc3RhdHVzX2FjaW4gICAgID0gY29yZ2lfYWNpbl9zdGF0dXMsCiAJLmRpc2NoYXJnZSAgICAgICA9IGNvcmdpX2Rpc2NoYXJnZSwKIAkuY2hhcmdlICAgICAgICAgID0gY29yZ2lfY2hhcmdlLAotCS5jaGFyZ2VsZWQgICAgICAgPSBjb3JnaV9jaGFyZ2VfbGVkLAogCS5tZWFzdXJlX3RlbXAgICAgPSBjb3JnaV9tZWFzdXJlX3RlbXAsCiAJLnByZXN1c3BlbmQgICAgICA9IGNvcmdpX3ByZXN1c3BlbmQsCiAJLnBvc3RzdXNwZW5kICAgICA9IGNvcmdpX3Bvc3RzdXNwZW5kLAorCS5yZWFkX2RldmRhdGEgICAgPSBjb3JnaXBtX3JlYWRfZGV2ZGF0YSwKIAkuY2hhcmdlcl93YWtldXAgID0gY29yZ2lfY2hhcmdlcl93YWtldXAsCiAJLnNob3VsZF93YWtldXAgICA9IGNvcmdpX3Nob3VsZF93YWtldXAsCiAJLmJhdF9sZXZlbHMgICAgICA9IDQwLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaWRwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9pZHAuYwppbmRleCA3ZGUxNTllLi4zNDdiOWRlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pZHAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pZHAuYwpAQCAtMTgzLDcgKzE4Myw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoUFhBX0lEUCwgIlZpYnJlbiBQWEEyNTUgSURQIikKIAkvKiBNYWludGFpbmVyOiBWaWJyZW4gVGVjaG5vbG9naWVzICovCi0JLnBoeXNfcmFtCT0gMHhhMDAwMDAwMCwKIAkucGh5c19pbwk9IDB4NDAwMDAwMDAsCiAJLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLm1hcF9pbwkJPSBpZHBfbWFwX2lvLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jCmluZGV4IGI0NjRiYzguLjNlMjZkN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2x1YmJvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMKQEAgLTQzNyw3ICs0MzcsNiBAQAogCiBNQUNISU5FX1NUQVJUKExVQkJPQ0ssICJJbnRlbCBEQlBYQTI1MCBEZXZlbG9wbWVudCBQbGF0Zm9ybSAoYWthIEx1YmJvY2spIikKIAkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4gKi8KLQkucGh5c19yYW0JPSAweGEwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoaW9fcDJ2KDB4NDAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkubWFwX2lvCQk9IGx1YmJvY2tfbWFwX2lvLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbWFpbnN0b25lLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9tYWluc3RvbmUuYwppbmRleCAyNzc0OThhLi5kNWJkYTYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9tYWluc3RvbmUuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9tYWluc3RvbmUuYwpAQCAtNDI3LDYgKzQyNywxMiBAQAogCXByaW50ayhLRVJOX05PVElDRSAiTWFpbnN0b25lIGNvbmZpZ3VyZWQgdG8gYm9vdCBmcm9tICVzXG4iLAogCSAgICAgICBtc3RfZmxhc2hfZGF0YVswXS5uYW1lKTsKIAorCS8qIHN5c3RlbSBidXMgYXJiaXRlciBzZXR0aW5nCisJICogLSBDb3JlX1BhcmsKKwkgKiAtIExDRF93dDpETUFfd3Q6Q09SRV9XdCA9IDI6Mzo0CisJICovCisJQVJCX0NOVFJMID0gQVJCX0NPUkVfUEFSSyB8IDB4MjM0OworCiAJLyoKIAkgKiBPbiBNYWluc3RvbmUsIHdlIHJvdXRlIEFDOTdfU1lTQ0xLIHZpYSBHUElPNDUgdG8KIAkgKiB0aGUgYXVkaW8gZGF1Z2h0ZXIgY2FyZApAQCAtNDgzLDcgKzQ4OSw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoTUFJTlNUT05FLCAiSW50ZWwgSENEREJCVkEwIERldmVsb3BtZW50IFBsYXRmb3JtIChha2EgTWFpbnN0b25lKSIpCiAJLyogTWFpbnRhaW5lcjogTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuICovCi0JLnBoeXNfcmFtCT0gMHhhMDAwMDAwMCwKIAkucGh5c19pbwk9IDB4NDAwMDAwMDAsCiAJLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLm1hcF9pbwkJPSBtYWluc3RvbmVfbWFwX2lvLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcG9vZGxlLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wb29kbGUuYwppbmRleCBlZWYzZGUyLi45MTFlNmZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9wb29kbGUuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9wb29kbGUuYwpAQCAtMTQ2LDE1ICsxNDYsMTQgQEAKIAogCXBvb2RsZV9tY2lfcGxhdGZvcm1fZGF0YS5kZXRlY3RfZGVsYXkgPSBtc2Vjc190b19qaWZmaWVzKDI1MCk7CiAKLQllcnIgPSByZXF1ZXN0X2lycShQT09ETEVfSVJRX0dQSU9fblNEX0RFVEVDVCwgcG9vZGxlX2RldGVjdF9pbnQsIFNBX0lOVEVSUlVQVCwKLQkJCSAgICAgIk1NQyBjYXJkIGRldGVjdCIsIGRhdGEpOworCWVyciA9IHJlcXVlc3RfaXJxKFBPT0RMRV9JUlFfR1BJT19uU0RfREVURUNULCBwb29kbGVfZGV0ZWN0X2ludCwKKwkJCSAgU0FfSU5URVJSVVBUIHwgU0FfVFJJR0dFUl9SSVNJTkcgfCBTQV9UUklHR0VSX0ZBTExJTkcsCisJCQkgICJNTUMgY2FyZCBkZXRlY3QiLCBkYXRhKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAicG9vZGxlX21jaV9pbml0OiBNTUMvU0Q6IGNhbid0IHJlcXVlc3QgTU1DIGNhcmQgZGV0ZWN0IElSUVxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlzZXRfaXJxX3R5cGUoUE9PRExFX0lSUV9HUElPX25TRF9ERVRFQ1QsIElSUVRfQk9USEVER0UpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMxMiw3ICszMTEsNiBAQAogfQogCiBNQUNISU5FX1NUQVJUKFBPT0RMRSwgIlNIQVJQIFBvb2RsZSIpCi0JLnBoeXNfcmFtCT0gMHhhMDAwMDAwMCwKIAkucGh5c19pbwk9IDB4NDAwMDAwMDAsCiAJLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmZpeHVwCQk9IGZpeHVwX3Bvb2RsZSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3NoYXJwc2wuaCBiL2FyY2gvYXJtL21hY2gtcHhhL3NoYXJwc2wuaAppbmRleCBiMGM0MGExLi5kYTQ3NjljIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9zaGFycHNsLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvc2hhcnBzbC5oCkBAIC0xLDcgKzEsMTcgQEAKIC8qCi0gKiBTaGFycFNMIFNTUCBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFJpY2hhcmQgUHVyZGllCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCiAgKi8KIAorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zaGFycHNsX3BtLmg+CisKKy8qCisgKiBTaGFycFNMIFNTUCBEcml2ZXIKKyAqLwogc3RydWN0IGNvcmdpc3NwX21hY2hpbmZvIHsKIAlpbnQgcG9ydDsKIAlpbnQgY3NfbGNkY29uOwpAQCAtMTQsMTggKzI0LDE4IEBACiAKIHZvaWQgY29yZ2lfc3NwX3NldF9tYWNoaW5mbyhzdHJ1Y3QgY29yZ2lzc3BfbWFjaGluZm8gKm1hY2hpbmZvKTsKIAorCiAvKgogICogU2hhcnBTTCBCYWNrbGlnaHQKICAqLwotCiB2b2lkIGNvcmdpX2JsX3NldF9pbnRlbnNpdHkoaW50IGludGVuc2l0eSk7CiB2b2lkIHNwaXR6X2JsX3NldF9pbnRlbnNpdHkoaW50IGludGVuc2l0eSk7CiB2b2lkIGFraXRhX2JsX3NldF9pbnRlbnNpdHkoaW50IGludGVuc2l0eSk7CiAKKwogLyoKICAqIFNoYXJwU0wgVG91Y2hzY3JlZW4gRHJpdmVyCiAgKi8KLQogdW5zaWduZWQgbG9uZyBjb3JnaV9nZXRfaHN5bmNfbGVuKHZvaWQpOwogdW5zaWduZWQgbG9uZyBzcGl0el9nZXRfaHN5bmNfbGVuKHZvaWQpOwogdm9pZCBjb3JnaV9wdXRfaHN5bmModm9pZCk7CkBAIC0zMyw4OSArNDMsMjIgQEAKIHZvaWQgY29yZ2lfd2FpdF9oc3luYyh2b2lkKTsKIHZvaWQgc3BpdHpfd2FpdF9oc3luYyh2b2lkKTsKIAorCiAvKgogICogU2hhcnBTTCBCYXR0ZXJ5L1BNIERyaXZlcgogICovCiAKLXN0cnVjdCBzaGFycHNsX2NoYXJnZXJfbWFjaGluZm8gewotCXZvaWQgKCppbml0KSh2b2lkKTsKLQlpbnQgZ3Bpb19hY2luOwotCWludCBncGlvX2JhdGZ1bGw7Ci0JaW50IGdwaW9fYmF0bG9jazsKLQlpbnQgZ3Bpb19mYXRhbDsKLQlpbnQgKCpzdGF0dXNfYWNpbikodm9pZCk7Ci0Jdm9pZCAoKmRpc2NoYXJnZSkoaW50KTsKLQl2b2lkICgqZGlzY2hhcmdlMSkoaW50KTsKLQl2b2lkICgqY2hhcmdlKShpbnQpOwotCXZvaWQgKCpjaGFyZ2VsZWQpKGludCk7Ci0Jdm9pZCAoKm1lYXN1cmVfdGVtcCkoaW50KTsKLQl2b2lkICgqcHJlc3VzcGVuZCkodm9pZCk7Ci0Jdm9pZCAoKnBvc3RzdXNwZW5kKSh2b2lkKTsKLQl1bnNpZ25lZCBsb25nICgqY2hhcmdlcl93YWtldXApKHZvaWQpOwotCWludCAoKnNob3VsZF93YWtldXApKHVuc2lnbmVkIGludCByZXN1bWVfb25fYWxhcm0pOwotCWludCBiYXRfbGV2ZWxzOwotCXN0cnVjdCBiYXR0ZXJ5X3RocmVzaCAqYmF0X2xldmVsc19ub2FjOwotCXN0cnVjdCBiYXR0ZXJ5X3RocmVzaCAqYmF0X2xldmVsc19hY2luOwotCWludCBzdGF0dXNfaGlnaF9hY2luOwotCWludCBzdGF0dXNfbG93X2FjaW47Ci0JaW50IHN0YXR1c19oaWdoX25vYWM7Ci0JaW50IHN0YXR1c19sb3dfbm9hYzsKLX07Ci0KLXN0cnVjdCBiYXR0ZXJ5X3RocmVzaCB7Ci0JaW50IHZvbHRhZ2U7Ci0JaW50IHBlcmNlbnRhZ2U7Ci19OwotCi1zdHJ1Y3QgYmF0dGVyeV9zdGF0IHsKLQlpbnQgYWNfc3RhdHVzOyAgICAgICAgIC8qIEFQTSBBQyBQcmVzZW50L05vdCBQcmVzZW50ICovCi0JaW50IG1haW5iYXRfc3RhdHVzOyAgICAvKiBBUE0gTWFpbiBCYXR0ZXJ5IFN0YXR1cyAqLwotCWludCBtYWluYmF0X3BlcmNlbnQ7ICAgLyogTWFpbiBCYXR0ZXJ5IFBlcmNlbnRhZ2UgQ2hhcmdlICovCi0JaW50IG1haW5iYXRfdm9sdGFnZTsgICAvKiBNYWluIEJhdHRlcnkgVm9sdGFnZSAqLwotfTsKLQotc3RydWN0IHNoYXJwc2xfcG1fc3RhdHVzIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgYWNfdGltZXI7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgY2hyZ19mdWxsX3RpbWVyOwotCi0JaW50IGNoYXJnZV9tb2RlOwotI2RlZmluZSBDSFJHX0VSUk9SICAgICgtMSkKLSNkZWZpbmUgQ0hSR19PRkYgICAgICAoMCkKLSNkZWZpbmUgQ0hSR19PTiAgICAgICAoMSkKLSNkZWZpbmUgQ0hSR19ET05FICAgICAoMikKLQotCXVuc2lnbmVkIGludCBmbGFnczsKLSNkZWZpbmUgU0hBUlBTTF9TVVNQRU5ERUQgICAgICAgKDEgPDwgMCkgIC8qIERldmljZSBpcyBTdXNwZW5kZWQgKi8KLSNkZWZpbmUgU0hBUlBTTF9BTEFSTV9BQ1RJVkUgICAgKDEgPDwgMSkgIC8qIEFsYXJtIGlzIGZvciBjaGFyZ2luZyBldmVudCAobm90IHVzZXIpICovCi0jZGVmaW5lIFNIQVJQU0xfQkxfTElNSVQgICAgICAgICgxIDw8IDIpICAvKiBCYWNrbGlnaHQgSW50ZW5zaXR5IExpbWl0ZWQgKi8KLSNkZWZpbmUgU0hBUlBTTF9BUE1fUVVFVUVEICAgICAgKDEgPDwgMykgIC8qIEFQTSBFdmVudCBRdWV1ZWQgKi8KLSNkZWZpbmUgU0hBUlBTTF9ET19PRkZMSU5FX0NIUkcgKDEgPDwgNCkgIC8qIFRyaWdnZXIgdGhlIG9mZmxpbmUgY2hhcmdlciAqLwotCi0JaW50IGZ1bGxfY291bnQ7Ci0JdW5zaWduZWQgbG9uZyBjaGFyZ2Vfc3RhcnRfdGltZTsKLQlzdHJ1Y3Qgc2hhcnBzbF9jaGFyZ2VyX21hY2hpbmZvICptYWNoaW5mbzsKLQlzdHJ1Y3QgYmF0dGVyeV9zdGF0IGJhdHRzdGF0OwotfTsKLQotZXh0ZXJuIHN0cnVjdCBzaGFycHNsX3BtX3N0YXR1cyBzaGFycHNsX3BtOwotZXh0ZXJuIHN0cnVjdCBiYXR0ZXJ5X3RocmVzaCBzcGl0el9iYXR0ZXJ5X2xldmVsc19hY2luW107Ci1leHRlcm4gc3RydWN0IGJhdHRlcnlfdGhyZXNoIHNwaXR6X2JhdHRlcnlfbGV2ZWxzX25vYWNbXTsKLQogI2RlZmluZSBSRUFEX0dQSU9fQklUKHgpICAgIChHUExSKHgpICYgR1BJT19iaXQoeCkpCiAKLSNkZWZpbmUgU0hBUlBTTF9MRURfRVJST1IgIDIKLSNkZWZpbmUgU0hBUlBTTF9MRURfT04gICAgIDEKLSNkZWZpbmUgU0hBUlBTTF9MRURfT0ZGICAgIDAKKy8qIE1BWDExMTEgQ2hhbm5lbCBEZWZpbml0aW9ucyAqLworI2RlZmluZSBNQVgxMTExX0JBVFRfVk9MVCAgIDR1CisjZGVmaW5lIE1BWDExMTFfQkFUVF9URU1QICAgMnUKKyNkZWZpbmUgTUFYMTExMV9BQ0lOX1ZPTFQgICA2dQogCi0jZGVmaW5lIENIQVJHRV9PTigpICAgICAgICAgc2hhcnBzbF9wbS5tYWNoaW5mby0+Y2hhcmdlKDEpCi0jZGVmaW5lIENIQVJHRV9PRkYoKSAgICAgICAgc2hhcnBzbF9wbS5tYWNoaW5mby0+Y2hhcmdlKDApCi0jZGVmaW5lIENIQVJHRV9MRURfT04oKSAgICAgc2hhcnBzbF9wbS5tYWNoaW5mby0+Y2hhcmdlbGVkKFNIQVJQU0xfTEVEX09OKQotI2RlZmluZSBDSEFSR0VfTEVEX09GRigpICAgIHNoYXJwc2xfcG0ubWFjaGluZm8tPmNoYXJnZWxlZChTSEFSUFNMX0xFRF9PRkYpCi0jZGVmaW5lIENIQVJHRV9MRURfRVJSKCkgICAgc2hhcnBzbF9wbS5tYWNoaW5mby0+Y2hhcmdlbGVkKFNIQVJQU0xfTEVEX0VSUk9SKQotI2RlZmluZSBESVNDSEFSR0VfT04oKSAgICAgIHNoYXJwc2xfcG0ubWFjaGluZm8tPmRpc2NoYXJnZSgxKQotI2RlZmluZSBESVNDSEFSR0VfT0ZGKCkgICAgIHNoYXJwc2xfcG0ubWFjaGluZm8tPmRpc2NoYXJnZSgwKQotI2RlZmluZSBTVEFUVVNfQUNfSU4oKSAgICAgIHNoYXJwc2xfcG0ubWFjaGluZm8tPnN0YXR1c19hY2luKCkKLSNkZWZpbmUgU1RBVFVTX0JBVFRfTE9DS0VEKCkgIFJFQURfR1BJT19CSVQoc2hhcnBzbF9wbS5tYWNoaW5mby0+Z3Bpb19iYXRsb2NrKQotI2RlZmluZSBTVEFUVVNfQ0hSR19GVUxMKCkgIFJFQURfR1BJT19CSVQoc2hhcnBzbF9wbS5tYWNoaW5mby0+Z3Bpb19iYXRmdWxsKQotI2RlZmluZSBTVEFUVVNfRkFUQUwoKSAgICAgIFJFQURfR1BJT19CSVQoc2hhcnBzbF9wbS5tYWNoaW5mby0+Z3Bpb19mYXRhbCkKK2V4dGVybiBzdHJ1Y3QgYmF0dGVyeV90aHJlc2ggc3BpdHpfYmF0dGVyeV9sZXZlbHNfYWNpbltdOworZXh0ZXJuIHN0cnVjdCBiYXR0ZXJ5X3RocmVzaCBzcGl0el9iYXR0ZXJ5X2xldmVsc19ub2FjW107Cit2b2lkIHNoYXJwc2xfcG1fcHhhX2luaXQodm9pZCk7Cit2b2lkIHNoYXJwc2xfcG1fcHhhX3JlbW92ZSh2b2lkKTsKK2ludCBzaGFycHNsX3BtX3B4YV9yZWFkX21heDExMTEoaW50IGNoYW5uZWwpOworCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3NoYXJwc2xfcG0uYyBiL2FyY2gvYXJtL21hY2gtcHhhL3NoYXJwc2xfcG0uYwppbmRleCBjMTBiZTAwLi42ZDQwMmIyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9zaGFycHNsX3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvc2hhcnBzbF9wbS5jCkBAIC0xNSw0OCArMTUsMjAgQEAKICN1bmRlZiBERUJVRwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvYXBtX2Jpb3MuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3Njb29wLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2FwbS5oPgotCiAjaW5jbHVkZSA8YXNtL2FyY2gvcG0uaD4KICNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3NoYXJwc2wuaD4KICNpbmNsdWRlICJzaGFycHNsLmgiCiAKLS8qCi0gKiBDb25zdGFudHMKLSAqLwotI2RlZmluZSBTSEFSUFNMX0NIQVJHRV9PTl9USU1FX0lOVEVSVkFMICAgICAgICAobXNlY3NfdG9famlmZmllcygxKjYwKjEwMDApKSAgLyogMSBtaW4gKi8KLSNkZWZpbmUgU0hBUlBTTF9DSEFSR0VfRklOSVNIX1RJTUUgICAgICAgICAgICAgKG1zZWNzX3RvX2ppZmZpZXMoMTAqNjAqMTAwMCkpIC8qIDEwIG1pbiAqLwotI2RlZmluZSBTSEFSUFNMX0JBVENIS19USU1FICAgICAgICAgICAgICAgICAgICAobXNlY3NfdG9famlmZmllcygxNSoxMDAwKSkgICAgLyogMTUgc2VjICovCi0jZGVmaW5lIFNIQVJQU0xfQkFUQ0hLX1RJTUVfU1VTUEVORCAgICAgICAgICAgICg2MCoxMCkgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMCBtaW4gKi8KLSNkZWZpbmUgU0hBUlBTTF9XQUlUX0NPX1RJTUUgICAgICAgICAgICAgICAgICAgMTUgIC8qIDE1IHNlYyAqLwotI2RlZmluZSBTSEFSUFNMX1dBSVRfRElTQ0hBUkdFX09OICAgICAgICAgICAgICAxMDAgLyogMTAwIG1zZWMgKi8KLSNkZWZpbmUgU0hBUlBTTF9DSEVDS19CQVRURVJZX1dBSVRfVElNRV9URU1QICAgMTAgIC8qIDEwIG1zZWMgKi8KLSNkZWZpbmUgU0hBUlBTTF9DSEVDS19CQVRURVJZX1dBSVRfVElNRV9WT0xUICAgMTAgIC8qIDEwIG1zZWMgKi8KLSNkZWZpbmUgU0hBUlBTTF9DSEVDS19CQVRURVJZX1dBSVRfVElNRV9BQ0lOICAgMTAgIC8qIDEwIG1zZWMgKi8KLSNkZWZpbmUgU0hBUlBTTF9DSEFSR0VfV0FJVF9USU1FICAgICAgICAgICAgICAgMTUgIC8qIDE1IG1zZWMgKi8KLSNkZWZpbmUgU0hBUlBTTF9DSEFSR0VfQ09fQ0hFQ0tfVElNRSAgICAgICAgICAgNSAgIC8qIDUgbXNlYyAqLwotI2RlZmluZSBTSEFSUFNMX0NIQVJHRV9SRVRSWV9DTlQgICAgICAgICAgICAgICAxICAgLyogZXF2LiAxMCBtaW4gKi8KLQotI2RlZmluZSBTSEFSUFNMX0NIQVJHRV9PTl9WT0xUICAgICAgICAgMHg5OSAgLyogMi45ViAqLwotI2RlZmluZSBTSEFSUFNMX0NIQVJHRV9PTl9URU1QICAgICAgICAgMHhlMCAgLyogMi45ViAqLwotI2RlZmluZSBTSEFSUFNMX0NIQVJHRV9PTl9BQ0lOX0hJR0ggICAgMHg5YiAgLyogNlYgKi8KLSNkZWZpbmUgU0hBUlBTTF9DSEFSR0VfT05fQUNJTl9MT1cgICAgIDB4MzQgIC8qIDJWICovCi0jZGVmaW5lIFNIQVJQU0xfRkFUQUxfQUNJTl9WT0xUICAgICAgICAxODIgICAvKiAzLjQ1ViAqLwotI2RlZmluZSBTSEFSUFNMX0ZBVEFMX05PQUNJTl9WT0xUICAgICAgMTcwICAgLyogMy40MFYgKi8KLQogc3RydWN0IGJhdHRlcnlfdGhyZXNoIHNwaXR6X2JhdHRlcnlfbGV2ZWxzX2FjaW5bXSA9IHsKIAl7IDIxMywgMTAwfSwKIAl7IDIxMiwgIDk4fSwKQEAgLTE1MSw3NjMgKzEyMywxNyBAQAogI2RlZmluZSBNQVhDVFJMX1NFTF9TSCAgIDQKICNkZWZpbmUgTUFYQ1RSTF9TVFIgICAgICAxdSA8PCA3CiAKLS8qIE1BWDExMTEgQ2hhbm5lbCBEZWZpbml0aW9ucyAqLwotI2RlZmluZSBCQVRUX0FEICAgIDR1Ci0jZGVmaW5lIEJBVFRfVEhNICAgMnUKLSNkZWZpbmUgSktfVkFEICAgICA2dQotCi0KLS8qCi0gKiBQcm90b3R5cGVzCi0gKi8KLXN0YXRpYyBpbnQgc2hhcnBzbF9yZWFkX21haW5fYmF0dGVyeSh2b2lkKTsKLXN0YXRpYyBpbnQgc2hhcnBzbF9vZmZfY2hhcmdlX2JhdHRlcnkodm9pZCk7Ci1zdGF0aWMgaW50IHNoYXJwc2xfY2hlY2tfYmF0dGVyeV90ZW1wKHZvaWQpOwotc3RhdGljIGludCBzaGFycHNsX2NoZWNrX2JhdHRlcnlfdm9sdGFnZSh2b2lkKTsKLXN0YXRpYyBpbnQgc2hhcnBzbF9hY19jaGVjayh2b2lkKTsKLXN0YXRpYyBpbnQgc2hhcnBzbF9mYXRhbF9jaGVjayh2b2lkKTsKLXN0YXRpYyBpbnQgc2hhcnBzbF9hdmVyYWdlX3ZhbHVlKGludCBhZCk7Ci1zdGF0aWMgdm9pZCBzaGFycHNsX2F2ZXJhZ2VfY2xlYXIodm9pZCk7Ci1zdGF0aWMgdm9pZCBzaGFycHNsX2NoYXJnZV90b2dnbGUodm9pZCAqcHJpdmF0ZV8pOwotc3RhdGljIHZvaWQgc2hhcnBzbF9iYXR0ZXJ5X3RocmVhZCh2b2lkICpwcml2YXRlXyk7Ci0KLQotLyoKLSAqIFZhcmlhYmxlcwotICovCi1zdHJ1Y3Qgc2hhcnBzbF9wbV9zdGF0dXMgc2hhcnBzbF9wbTsKLURFQ0xBUkVfV09SSyh0b2dnbGVfY2hhcmdlciwgc2hhcnBzbF9jaGFyZ2VfdG9nZ2xlLCBOVUxMKTsKLURFQ0xBUkVfV09SSyhzaGFycHNsX2JhdCwgc2hhcnBzbF9iYXR0ZXJ5X3RocmVhZCwgTlVMTCk7Ci0KLQotc3RhdGljIGludCBnZXRfcGVyY2VudGFnZShpbnQgdm9sdGFnZSkKLXsKLQlpbnQgaSA9IHNoYXJwc2xfcG0ubWFjaGluZm8tPmJhdF9sZXZlbHMgLSAxOwotCXN0cnVjdCBiYXR0ZXJ5X3RocmVzaCAqdGhyZXNoOwotCi0JaWYgKHNoYXJwc2xfcG0uY2hhcmdlX21vZGUgPT0gQ0hSR19PTikKLQkJdGhyZXNoPXNoYXJwc2xfcG0ubWFjaGluZm8tPmJhdF9sZXZlbHNfYWNpbjsKLQllbHNlCi0JCXRocmVzaD1zaGFycHNsX3BtLm1hY2hpbmZvLT5iYXRfbGV2ZWxzX25vYWM7Ci0KLQl3aGlsZSAoaSA+IDAgJiYgKHZvbHRhZ2UgPiB0aHJlc2hbaV0udm9sdGFnZSkpCi0JCWktLTsKLQotCXJldHVybiB0aHJlc2hbaV0ucGVyY2VudGFnZTsKLX0KLQotc3RhdGljIGludCBnZXRfYXBtX3N0YXR1cyhpbnQgdm9sdGFnZSkKLXsKLQlpbnQgbG93X3RocmVzaCwgaGlnaF90aHJlc2g7Ci0KLQlpZiAoc2hhcnBzbF9wbS5jaGFyZ2VfbW9kZSA9PSBDSFJHX09OKSB7Ci0JCWhpZ2hfdGhyZXNoID0gc2hhcnBzbF9wbS5tYWNoaW5mby0+c3RhdHVzX2hpZ2hfYWNpbjsKLQkJbG93X3RocmVzaCA9IHNoYXJwc2xfcG0ubWFjaGluZm8tPnN0YXR1c19sb3dfYWNpbjsKLQl9IGVsc2UgewotCQloaWdoX3RocmVzaCA9IHNoYXJwc2xfcG0ubWFjaGluZm8tPnN0YXR1c19oaWdoX25vYWM7Ci0JCWxvd190aHJlc2ggPSBzaGFycHNsX3BtLm1hY2hpbmZvLT5zdGF0dXNfbG93X25vYWM7Ci0JfQotCi0JaWYgKHZvbHRhZ2UgPj0gaGlnaF90aHJlc2gpCi0JCXJldHVybiBBUE1fQkFUVEVSWV9TVEFUVVNfSElHSDsKLQlpZiAodm9sdGFnZSA+PSBsb3dfdGhyZXNoKQotCQlyZXR1cm4gQVBNX0JBVFRFUllfU1RBVFVTX0xPVzsKLQlyZXR1cm4gQVBNX0JBVFRFUllfU1RBVFVTX0NSSVRJQ0FMOwotfQotCi12b2lkIHNoYXJwc2xfYmF0dGVyeV9raWNrKHZvaWQpCi17Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZzaGFycHNsX2JhdCwgbXNlY3NfdG9famlmZmllcygxMjUpKTsKLX0KLUVYUE9SVF9TWU1CT0woc2hhcnBzbF9iYXR0ZXJ5X2tpY2spOwotCi0KLXN0YXRpYyB2b2lkIHNoYXJwc2xfYmF0dGVyeV90aHJlYWQodm9pZCAqcHJpdmF0ZV8pCi17Ci0JaW50IHZvbHRhZ2UsIHBlcmNlbnQsIGFwbV9zdGF0dXMsIGkgPSAwOwotCi0JaWYgKCFzaGFycHNsX3BtLm1hY2hpbmZvKQotCQlyZXR1cm47Ci0KLQlzaGFycHNsX3BtLmJhdHRzdGF0LmFjX3N0YXR1cyA9IChTVEFUVVNfQUNfSU4oKSA/IEFQTV9BQ19PTkxJTkUgOiBBUE1fQUNfT0ZGTElORSk7Ci0KLQkvKiBDb3JnaSBjYW5ub3QgY29uZmlybSB3aGVuIGJhdHRlcnkgZnVsbHkgY2hhcmdlZCBzbyBwZXJpb2RpY2FsbHkga2ljayEgKi8KLQlpZiAobWFjaGluZV9pc19jb3JnaSgpICYmIChzaGFycHNsX3BtLmNoYXJnZV9tb2RlID09IENIUkdfT04pCi0JCQkmJiB0aW1lX2FmdGVyKGppZmZpZXMsIHNoYXJwc2xfcG0uY2hhcmdlX3N0YXJ0X3RpbWUgKyAgU0hBUlBTTF9DSEFSR0VfT05fVElNRV9JTlRFUlZBTCkpCi0JCXNjaGVkdWxlX3dvcmsoJnRvZ2dsZV9jaGFyZ2VyKTsKLQotCXdoaWxlKDEpIHsKLQkJdm9sdGFnZSA9IHNoYXJwc2xfcmVhZF9tYWluX2JhdHRlcnkoKTsKLQkJaWYgKHZvbHRhZ2UgPiAwKSBicmVhazsKLQkJaWYgKGkrKyA+IDUpIHsKLQkJCXZvbHRhZ2UgPSBzaGFycHNsX3BtLm1hY2hpbmZvLT5iYXRfbGV2ZWxzX25vYWNbMF0udm9sdGFnZTsKLQkJCWRldl93YXJuKHNoYXJwc2xfcG0uZGV2LCAiV2FybmluZzogQ2Fubm90IHJlYWQgbWFpbiBiYXR0ZXJ5IVxuIik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXZvbHRhZ2UgPSBzaGFycHNsX2F2ZXJhZ2VfdmFsdWUodm9sdGFnZSk7Ci0JYXBtX3N0YXR1cyA9IGdldF9hcG1fc3RhdHVzKHZvbHRhZ2UpOwotCXBlcmNlbnQgPSBnZXRfcGVyY2VudGFnZSh2b2x0YWdlKTsKLQotCS8qIEF0IGxvdyBiYXR0ZXJ5IHZvbHRhZ2VzLCB0aGUgdm9sdGFnZSBoYXMgYSB0ZW5kZW5jeSB0byBzdGFydAotICAgICAgICAgICBjcmVlcGluZyBiYWNrIHVwIHNvIHdlIHRyeSB0byBhdm9pZCB0aGlzIGhlcmUgKi8KLQlpZiAoKHNoYXJwc2xfcG0uYmF0dHN0YXQuYWNfc3RhdHVzID09IEFQTV9BQ19PTkxJTkUpIHx8IChhcG1fc3RhdHVzID09IEFQTV9CQVRURVJZX1NUQVRVU19ISUdIKSB8fCAgcGVyY2VudCA8PSBzaGFycHNsX3BtLmJhdHRzdGF0Lm1haW5iYXRfcGVyY2VudCkgewotCQlzaGFycHNsX3BtLmJhdHRzdGF0Lm1haW5iYXRfdm9sdGFnZSA9IHZvbHRhZ2U7Ci0JCXNoYXJwc2xfcG0uYmF0dHN0YXQubWFpbmJhdF9zdGF0dXMgPSBhcG1fc3RhdHVzOwotCQlzaGFycHNsX3BtLmJhdHRzdGF0Lm1haW5iYXRfcGVyY2VudCA9IHBlcmNlbnQ7Ci0JfQotCi0JZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIkJhdHRlcnk6IHZvbHRhZ2U6ICVkLCBzdGF0dXM6ICVkLCBwZXJjZW50YWdlOiAlZCwgdGltZTogJWRcbiIsIHZvbHRhZ2UsCi0JCQlzaGFycHNsX3BtLmJhdHRzdGF0Lm1haW5iYXRfc3RhdHVzLCBzaGFycHNsX3BtLmJhdHRzdGF0Lm1haW5iYXRfcGVyY2VudCwgamlmZmllcyk7Ci0KLQkvKiBJZiBiYXR0ZXJ5IGlzIGxvdy4gbGltaXQgYmFja2xpZ2h0IGludGVuc2l0eSB0byBzYXZlIHBvd2VyLiAqLwotCWlmICgoc2hhcnBzbF9wbS5iYXR0c3RhdC5hY19zdGF0dXMgIT0gQVBNX0FDX09OTElORSkKLQkJCSYmICgoc2hhcnBzbF9wbS5iYXR0c3RhdC5tYWluYmF0X3N0YXR1cyA9PSBBUE1fQkFUVEVSWV9TVEFUVVNfTE9XKSB8fAotCQkJKHNoYXJwc2xfcG0uYmF0dHN0YXQubWFpbmJhdF9zdGF0dXMgPT0gQVBNX0JBVFRFUllfU1RBVFVTX0NSSVRJQ0FMKSkpIHsKLQkJaWYgKCEoc2hhcnBzbF9wbS5mbGFncyAmIFNIQVJQU0xfQkxfTElNSVQpKSB7Ci0JCQljb3JnaWJsX2xpbWl0X2ludGVuc2l0eSgxKTsKLQkJCXNoYXJwc2xfcG0uZmxhZ3MgfD0gU0hBUlBTTF9CTF9MSU1JVDsKLQkJfQotCX0gZWxzZSBpZiAoc2hhcnBzbF9wbS5mbGFncyAmIFNIQVJQU0xfQkxfTElNSVQpIHsKLQkJY29yZ2libF9saW1pdF9pbnRlbnNpdHkoMCk7Ci0JCXNoYXJwc2xfcG0uZmxhZ3MgJj0gflNIQVJQU0xfQkxfTElNSVQ7Ci0JfQotCi0JLyogU3VzcGVuZCBpZiBjcml0aWNhbCBiYXR0ZXJ5IGxldmVsICovCi0JaWYgKChzaGFycHNsX3BtLmJhdHRzdGF0LmFjX3N0YXR1cyAhPSBBUE1fQUNfT05MSU5FKQotCQkJJiYgKHNoYXJwc2xfcG0uYmF0dHN0YXQubWFpbmJhdF9zdGF0dXMgPT0gQVBNX0JBVFRFUllfU1RBVFVTX0NSSVRJQ0FMKQotCQkJJiYgIShzaGFycHNsX3BtLmZsYWdzICYgU0hBUlBTTF9BUE1fUVVFVUVEKSkgewotCQlzaGFycHNsX3BtLmZsYWdzIHw9IFNIQVJQU0xfQVBNX1FVRVVFRDsKLQkJZGV2X2VycihzaGFycHNsX3BtLmRldiwgIkZhdGFsIE9mZlxuIik7Ci0JCWFwbV9xdWV1ZV9ldmVudChBUE1fQ1JJVElDQUxfU1VTUEVORCk7Ci0JfQotCi0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZzaGFycHNsX2JhdCwgU0hBUlBTTF9CQVRDSEtfVElNRSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNoYXJwc2xfY2hhcmdlX29uKHZvaWQpCi17Ci0JZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIlR1cm5pbmcgQ2hhcmdlciBPblxuIik7Ci0KLQlzaGFycHNsX3BtLmZ1bGxfY291bnQgPSAwOwotCXNoYXJwc2xfcG0uY2hhcmdlX21vZGUgPSBDSFJHX09OOwotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdG9nZ2xlX2NoYXJnZXIsIG1zZWNzX3RvX2ppZmZpZXMoMjUwKSk7Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZzaGFycHNsX2JhdCwgbXNlY3NfdG9famlmZmllcyg1MDApKTsKLX0KLQotc3RhdGljIHZvaWQgc2hhcnBzbF9jaGFyZ2Vfb2ZmKHZvaWQpCi17Ci0JZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIlR1cm5pbmcgQ2hhcmdlciBPZmZcbiIpOwotCi0JQ0hBUkdFX09GRigpOwotCUNIQVJHRV9MRURfT0ZGKCk7Ci0Jc2hhcnBzbF9wbS5jaGFyZ2VfbW9kZSA9IENIUkdfT0ZGOwotCi0Jc2NoZWR1bGVfd29yaygmc2hhcnBzbF9iYXQpOwotfQotCi1zdGF0aWMgdm9pZCBzaGFycHNsX2NoYXJnZV9lcnJvcih2b2lkKQotewotCUNIQVJHRV9MRURfRVJSKCk7Ci0JQ0hBUkdFX09GRigpOwotCXNoYXJwc2xfcG0uY2hhcmdlX21vZGUgPSBDSFJHX0VSUk9SOwotfQotCi1zdGF0aWMgdm9pZCBzaGFycHNsX2NoYXJnZV90b2dnbGUodm9pZCAqcHJpdmF0ZV8pCi17Ci0JZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIlRvb2dsaW5nIENoYXJnZXIgYXQgdGltZTogJWx4XG4iLCBqaWZmaWVzKTsKLQotCWlmIChTVEFUVVNfQUNfSU4oKSA9PSAwKSB7Ci0JCXNoYXJwc2xfY2hhcmdlX29mZigpOwotCQlyZXR1cm47Ci0JfSBlbHNlIGlmICgoc2hhcnBzbF9jaGVja19iYXR0ZXJ5X3RlbXAoKSA8IDApIHx8IChzaGFycHNsX2FjX2NoZWNrKCkgPCAwKSkgewotCQlzaGFycHNsX2NoYXJnZV9lcnJvcigpOwotCQlyZXR1cm47Ci0JfQotCi0JQ0hBUkdFX0xFRF9PTigpOwotCUNIQVJHRV9PRkYoKTsKLQltZGVsYXkoU0hBUlBTTF9DSEFSR0VfV0FJVF9USU1FKTsKLQlDSEFSR0VfT04oKTsKLQotCXNoYXJwc2xfcG0uY2hhcmdlX3N0YXJ0X3RpbWUgPSBqaWZmaWVzOwotfQotCi1zdGF0aWMgdm9pZCBzaGFycHNsX2FjX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlpbnQgYWNpbiA9IFNUQVRVU19BQ19JTigpOwotCi0JZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIkFDIFN0YXR1czogJWRcbiIsYWNpbik7Ci0KLQlzaGFycHNsX2F2ZXJhZ2VfY2xlYXIoKTsKLQlpZiAoYWNpbiAmJiAoc2hhcnBzbF9wbS5jaGFyZ2VfbW9kZSAhPSBDSFJHX09OKSkKLQkJc2hhcnBzbF9jaGFyZ2Vfb24oKTsKLQllbHNlIGlmIChzaGFycHNsX3BtLmNoYXJnZV9tb2RlID09IENIUkdfT04pCi0JCXNoYXJwc2xfY2hhcmdlX29mZigpOwotCi0Jc2NoZWR1bGVfd29yaygmc2hhcnBzbF9iYXQpOwotfQotCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBzaGFycHNsX2FjX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKLXsKLQkvKiBEZWxheSB0aGUgZXZlbnQgc2xpZ2h0bHkgdG8gZGVib3VuY2UgKi8KLQkvKiBNdXN0IGJlIGEgc21hbGxlciBkZWxheSB0aGFuIHRoZSBjaHJnX2Z1bGxfaXNyIGJlbG93ICovCi0JbW9kX3RpbWVyKCZzaGFycHNsX3BtLmFjX3RpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyNTApKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHZvaWQgc2hhcnBzbF9jaHJnX2Z1bGxfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQotewotCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJDaGFyZ2UgRnVsbCBhdCB0aW1lOiAlbHhcbiIsIGppZmZpZXMpOwotCi0Jc2hhcnBzbF9wbS5mdWxsX2NvdW50Kys7Ci0KLQlpZiAoU1RBVFVTX0FDX0lOKCkgPT0gMCkgewotCQlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiQ2hhcmdlIEZ1bGw6IEFDIHJlbW92ZWQgLSBzdG9wIGNoYXJnaW5nIVxuIik7Ci0JCWlmIChzaGFycHNsX3BtLmNoYXJnZV9tb2RlID09IENIUkdfT04pCi0JCQlzaGFycHNsX2NoYXJnZV9vZmYoKTsKLQl9IGVsc2UgaWYgKHNoYXJwc2xfcG0uZnVsbF9jb3VudCA8IDIpIHsKLQkJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIkNoYXJnZSBGdWxsOiBDb3VudCB0b28gbG93XG4iKTsKLQkJc2NoZWR1bGVfd29yaygmdG9nZ2xlX2NoYXJnZXIpOwotCX0gZWxzZSBpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzaGFycHNsX3BtLmNoYXJnZV9zdGFydF90aW1lICsgU0hBUlBTTF9DSEFSR0VfRklOSVNIX1RJTUUpKSB7Ci0JCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJDaGFyZ2UgRnVsbDogSW50ZXJydXB0IGdlbmVyYXRlZCB0b28gc2xvd2x5IC0gcmV0cnkuXG4iKTsKLQkJc2NoZWR1bGVfd29yaygmdG9nZ2xlX2NoYXJnZXIpOwotCX0gZWxzZSB7Ci0JCXNoYXJwc2xfY2hhcmdlX29mZigpOwotCQlzaGFycHNsX3BtLmNoYXJnZV9tb2RlID0gQ0hSR19ET05FOwotCQlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiQ2hhcmdlIEZ1bGw6IENoYXJnaW5nIEZpbmlzaGVkXG4iKTsKLQl9Ci19Ci0KLS8qIENoYXJnaW5nIEZpbmlzaGVkIEludGVycnVwdCAoTm90IHByZXNlbnQgb24gQ29yZ2kpICovCi0vKiBDYW4gdHJpZ2dlciBhdCB0aGUgc2FtZSB0aW1lIGFzIGFuIEFDIHN0YXVzIGNoYW5nZSBzbwotICAgZGVsYXkgdW50aWwgYWZ0ZXIgdGhhdCBoYXMgYmVlbiBwcm9jZXNzZWQgKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBzaGFycHNsX2NocmdfZnVsbF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCi17Ci0JaWYgKHNoYXJwc2xfcG0uZmxhZ3MgJiBTSEFSUFNMX1NVU1BFTkRFRCkKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCi0JLyogZGVsYXkgdW50aWwgYWZ0ZXIgYW55IGFjIGludGVycnVwdCAqLwotCW1vZF90aW1lcigmc2hhcnBzbF9wbS5jaHJnX2Z1bGxfdGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwMCkpOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgc2hhcnBzbF9mYXRhbF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCi17Ci0JaW50IGlzX2ZhdGFsID0gMDsKLQotCWlmIChTVEFUVVNfQkFUVF9MT0NLRUQoKSA9PSAwKSB7Ci0JCWRldl9lcnIoc2hhcnBzbF9wbS5kZXYsICJCYXR0ZXJ5IG5vdyBVbmxvY2tlZCEgU3VzcGVuZGluZy5cbiIpOwotCQlpc19mYXRhbCA9IDE7Ci0JfQotCi0JaWYgKHNoYXJwc2xfcG0ubWFjaGluZm8tPmdwaW9fZmF0YWwgJiYgKFNUQVRVU19GQVRBTCgpID09IDApKSB7Ci0JCWRldl9lcnIoc2hhcnBzbF9wbS5kZXYsICJGYXRhbCBCYXR0IEVycm9yISBTdXNwZW5kaW5nLlxuIik7Ci0JCWlzX2ZhdGFsID0gMTsKLQl9Ci0KLQlpZiAoIShzaGFycHNsX3BtLmZsYWdzICYgU0hBUlBTTF9BUE1fUVVFVUVEKSAmJiBpc19mYXRhbCkgewotCQlzaGFycHNsX3BtLmZsYWdzIHw9IFNIQVJQU0xfQVBNX1FVRVVFRDsKLQkJYXBtX3F1ZXVlX2V2ZW50KEFQTV9DUklUSUNBTF9TVVNQRU5EKTsKLQl9Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qCi0gKiBNYWludGFpbiBhbiBhdmVyYWdlIG9mIHRoZSBsYXN0IDEwIHJlYWRpbmdzCi0gKi8KLSNkZWZpbmUgU0hBUlBTTF9DTlZfVkFMVUVfTlVNICAgIDEwCi1zdGF0aWMgaW50IHNoYXJwc2xfYWRfaW5kZXg7Ci0KLXN0YXRpYyB2b2lkIHNoYXJwc2xfYXZlcmFnZV9jbGVhcih2b2lkKQotewotCXNoYXJwc2xfYWRfaW5kZXggPSAwOwotfQotCi1zdGF0aWMgaW50IHNoYXJwc2xfYXZlcmFnZV92YWx1ZShpbnQgYWQpCi17Ci0JaW50IGksIGFkX3ZhbCA9IDA7Ci0Jc3RhdGljIGludCBzaGFycHNsX2FkW1NIQVJQU0xfQ05WX1ZBTFVFX05VTSsxXTsKLQotCWlmIChzaGFycHNsX3BtLmJhdHRzdGF0Lm1haW5iYXRfc3RhdHVzICE9IEFQTV9CQVRURVJZX1NUQVRVU19ISUdIKSB7Ci0JCXNoYXJwc2xfYWRfaW5kZXggPSAwOwotCQlyZXR1cm4gYWQ7Ci0JfQotCi0Jc2hhcnBzbF9hZFtzaGFycHNsX2FkX2luZGV4XSA9IGFkOwotCXNoYXJwc2xfYWRfaW5kZXgrKzsKLQlpZiAoc2hhcnBzbF9hZF9pbmRleCA+PSBTSEFSUFNMX0NOVl9WQUxVRV9OVU0pIHsKLQkJZm9yIChpPTA7IGkgPCAoU0hBUlBTTF9DTlZfVkFMVUVfTlVNLTEpOyBpKyspCi0JCQlzaGFycHNsX2FkW2ldID0gc2hhcnBzbF9hZFtpKzFdOwotCQlzaGFycHNsX2FkX2luZGV4ID0gU0hBUlBTTF9DTlZfVkFMVUVfTlVNIC0gMTsKLQl9Ci0JZm9yIChpPTA7IGkgPCBzaGFycHNsX2FkX2luZGV4OyBpKyspCi0JCWFkX3ZhbCArPSBzaGFycHNsX2FkW2ldOwotCi0JcmV0dXJuIChhZF92YWwgLyBzaGFycHNsX2FkX2luZGV4KTsKLX0KLQotCiAvKgogICogUmVhZCBNQVgxMTExIEFEQwogICovCi1zdGF0aWMgaW50IHJlYWRfbWF4MTExMShpbnQgY2hhbm5lbCkKK2ludCBzaGFycHNsX3BtX3B4YV9yZWFkX21heDExMTEoaW50IGNoYW5uZWwpCiB7CiAJcmV0dXJuIGNvcmdpX3NzcF9tYXgxMTExX2dldCgoY2hhbm5lbCA8PCBNQVhDVFJMX1NFTF9TSCkgfCBNQVhDVFJMX1BEMCB8IE1BWENUUkxfUEQxCiAJCQl8IE1BWENUUkxfU0dMIHwgTUFYQ1RSTF9VTkkgfCBNQVhDVFJMX1NUUik7CiB9CiAKLXN0YXRpYyBpbnQgc2hhcnBzbF9yZWFkX21haW5fYmF0dGVyeSh2b2lkKQordm9pZCBzaGFycHNsX3BtX3B4YV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHJlYWRfbWF4MTExMShCQVRUX0FEKTsKLX0KLQotc3RhdGljIGludCBzaGFycHNsX3JlYWRfdGVtcCh2b2lkKQotewotCWludCB0ZW1wOwotCi0Jc2hhcnBzbF9wbS5tYWNoaW5mby0+bWVhc3VyZV90ZW1wKDEpOwotCi0JbWRlbGF5KFNIQVJQU0xfQ0hFQ0tfQkFUVEVSWV9XQUlUX1RJTUVfVEVNUCk7Ci0JdGVtcCA9IHJlYWRfbWF4MTExMShCQVRUX1RITSk7Ci0KLQlzaGFycHNsX3BtLm1hY2hpbmZvLT5tZWFzdXJlX3RlbXAoMCk7Ci0KLQlyZXR1cm4gdGVtcDsKLX0KLQotc3RhdGljIGludCBzaGFycHNsX3JlYWRfYWNpbih2b2lkKQotewotCXJldHVybiByZWFkX21heDExMTEoSktfVkFEKTsKLX0KLQotLyoKLSAqIFRha2UgYW4gYXJyYXkgb2YgNSBpbnRlZ2VycywgcmVtb3ZlIHRoZSBtYXhpbXVtIGFuZCBtaW5pbXVtIHZhbHVlcwotICogYW5kIHJldHVybiB0aGUgYXZlcmFnZS4KLSAqLwotc3RhdGljIGludCBnZXRfc2VsZWN0X3ZhbChpbnQgKnZhbCkKLXsKLQlpbnQgaSwgaiwgaywgdGVtcCwgc3VtID0gMDsKLQotCS8qIEZpbmQgTUFYIHZhbCAqLwotCXRlbXAgPSB2YWxbMF07Ci0Jaj0wOwotCWZvciAoaT0xOyBpPDU7IGkrKykgewotCQlpZiAodGVtcCA8IHZhbFtpXSkgewotCQkJdGVtcCA9IHZhbFtpXTsKLQkJCWogPSBpOwotCQl9Ci0JfQotCi0JLyogRmluZCBNSU4gdmFsICovCi0JdGVtcCA9IHZhbFs0XTsKLQlrPTQ7Ci0JZm9yIChpPTM7IGk+PTA7IGktLSkgewotCQlpZiAodGVtcCA+IHZhbFtpXSkgewotCQkJdGVtcCA9IHZhbFtpXTsKLQkJCWsgPSBpOwotCQl9Ci0JfQotCi0JZm9yIChpPTA7IGk8NTsgaSsrKQotCQlpZiAoaSAhPSBqICYmIGkgIT0gayApCi0JCQlzdW0gKz0gdmFsW2ldOwotCi0JZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIkF2ZXJhZ2U6ICVkIGZyb20gdmFsdWVzOiAlZCwgJWQsICVkLCAlZCwgJWRcbiIsIHN1bS8zLCB2YWxbMF0sIHZhbFsxXSwgdmFsWzJdLCB2YWxbM10sIHZhbFs0XSk7Ci0KLQlyZXR1cm4gKHN1bS8zKTsKLX0KLQotc3RhdGljIGludCBzaGFycHNsX2NoZWNrX2JhdHRlcnlfdGVtcCh2b2lkKQotewotCWludCB2YWwsIGksIGJ1ZmZbNV07Ci0KLQkvKiBDaGVjayBiYXR0ZXJ5IHRlbXBlcmF0dXJlICovCi0JZm9yIChpPTA7IGk8NTsgaSsrKSB7Ci0JCW1kZWxheShTSEFSUFNMX0NIRUNLX0JBVFRFUllfV0FJVF9USU1FX1RFTVApOwotCQlidWZmW2ldID0gc2hhcnBzbF9yZWFkX3RlbXAoKTsKLQl9Ci0KLQl2YWwgPSBnZXRfc2VsZWN0X3ZhbChidWZmKTsKLQotCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJUZW1wZXJhdHVyZTogJWRcbiIsIHZhbCk7Ci0JaWYgKHZhbCA+IFNIQVJQU0xfQ0hBUkdFX09OX1RFTVApCi0JCXJldHVybiAtMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNoYXJwc2xfY2hlY2tfYmF0dGVyeV92b2x0YWdlKHZvaWQpCi17Ci0JaW50IHZhbCwgaSwgYnVmZls1XTsKLQotCS8qIGRpc2FibGUgY2hhcmdlLCBlbmFibGUgZGlzY2hhcmdlICovCi0JQ0hBUkdFX09GRigpOwotCURJU0NIQVJHRV9PTigpOwotCW1kZWxheShTSEFSUFNMX1dBSVRfRElTQ0hBUkdFX09OKTsKLQotCWlmIChzaGFycHNsX3BtLm1hY2hpbmZvLT5kaXNjaGFyZ2UxKQotCQlzaGFycHNsX3BtLm1hY2hpbmZvLT5kaXNjaGFyZ2UxKDEpOwotCi0JLyogQ2hlY2sgYmF0dGVyeSB2b2x0YWdlICovCi0JZm9yIChpPTA7IGk8NTsgaSsrKSB7Ci0JCWJ1ZmZbaV0gPSBzaGFycHNsX3JlYWRfbWFpbl9iYXR0ZXJ5KCk7Ci0JCW1kZWxheShTSEFSUFNMX0NIRUNLX0JBVFRFUllfV0FJVF9USU1FX1ZPTFQpOwotCX0KLQotCWlmIChzaGFycHNsX3BtLm1hY2hpbmZvLT5kaXNjaGFyZ2UxKQotCQlzaGFycHNsX3BtLm1hY2hpbmZvLT5kaXNjaGFyZ2UxKDApOwotCi0JRElTQ0hBUkdFX09GRigpOwotCi0JdmFsID0gZ2V0X3NlbGVjdF92YWwoYnVmZik7Ci0JZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIkJhdHRlcnkgVm9sdGFnZTogJWRcbiIsIHZhbCk7Ci0KLQlpZiAodmFsIDwgU0hBUlBTTF9DSEFSR0VfT05fVk9MVCkKLQkJcmV0dXJuIC0xOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2hhcnBzbF9hY19jaGVjayh2b2lkKQotewotCWludCB0ZW1wLCBpLCBidWZmWzVdOwotCi0JZm9yIChpPTA7IGk8NTsgaSsrKSB7Ci0JCWJ1ZmZbaV0gPSBzaGFycHNsX3JlYWRfYWNpbigpOwotCQltZGVsYXkoU0hBUlBTTF9DSEVDS19CQVRURVJZX1dBSVRfVElNRV9BQ0lOKTsKLQl9Ci0KLQl0ZW1wID0gZ2V0X3NlbGVjdF92YWwoYnVmZik7Ci0JZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIkFDIFZvbHRhZ2U6ICVkXG4iLHRlbXApOwotCi0JaWYgKCh0ZW1wID4gU0hBUlBTTF9DSEFSR0VfT05fQUNJTl9ISUdIKSB8fCAodGVtcCA8IFNIQVJQU0xfQ0hBUkdFX09OX0FDSU5fTE9XKSkgewotCQlkZXZfZXJyKHNoYXJwc2xfcG0uZGV2LCAiRXJyb3I6IEFDIGNoZWNrIGZhaWxlZC5cbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgc2hhcnBzbF9wbV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzaGFycHNsX3BtLmZsYWdzIHw9IFNIQVJQU0xfU1VTUEVOREVEOwotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0KLQlpZiAoc2hhcnBzbF9wbS5jaGFyZ2VfbW9kZSA9PSBDSFJHX09OKQotCQlzaGFycHNsX3BtLmZsYWdzIHw9IFNIQVJQU0xfRE9fT0ZGTElORV9DSFJHOwotCWVsc2UKLQkJc2hhcnBzbF9wbS5mbGFncyAmPSB+U0hBUlBTTF9ET19PRkZMSU5FX0NIUkc7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzaGFycHNsX3BtX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCS8qIENsZWFyIHRoZSByZXNldCBzb3VyY2UgaW5kaWNhdG9ycyBhcyB0aGV5IGJyZWFrIHRoZSBib290bG9hZGVyIHVwb24gcmVib290ICovCi0JUkNTUiA9IDB4MGY7Ci0Jc2hhcnBzbF9hdmVyYWdlX2NsZWFyKCk7Ci0Jc2hhcnBzbF9wbS5mbGFncyAmPSB+U0hBUlBTTF9BUE1fUVVFVUVEOwotCXNoYXJwc2xfcG0uZmxhZ3MgJj0gflNIQVJQU0xfU1VTUEVOREVEOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcmdpX2dvdG9fc2xlZXAodW5zaWduZWQgbG9uZyBhbGFybV90aW1lLCB1bnNpZ25lZCBpbnQgYWxhcm1fZW5hYmxlLCBzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCi17Ci0JZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIlRpbWUgaXM6ICUwOHhcbiIsUkNOUik7Ci0KLQlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiT2ZmbGluZSBDaGFyZ2UgQWN0aXZhdGUgPSAlZFxuIixzaGFycHNsX3BtLmZsYWdzICYgU0hBUlBTTF9ET19PRkZMSU5FX0NIUkcpOwotCS8qIG5vdCBjaGFyZ2luZyBhbmQgQUMtSU4hICovCi0KLQlpZiAoKHNoYXJwc2xfcG0uZmxhZ3MgJiBTSEFSUFNMX0RPX09GRkxJTkVfQ0hSRykgJiYgKFNUQVRVU19BQ19JTigpICE9IDApKSB7Ci0JCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJBY3RpdmF0aW5nIE9mZmxpbmUgQ2hhcmdlci4uLlxuIik7Ci0JCXNoYXJwc2xfcG0uY2hhcmdlX21vZGUgPSBDSFJHX09GRjsKLQkJc2hhcnBzbF9wbS5mbGFncyAmPSB+U0hBUlBTTF9ET19PRkZMSU5FX0NIUkc7Ci0JCXNoYXJwc2xfb2ZmX2NoYXJnZV9iYXR0ZXJ5KCk7Ci0JfQotCi0Jc2hhcnBzbF9wbS5tYWNoaW5mby0+cHJlc3VzcGVuZCgpOwotCi0JUEVEUiA9IDB4ZmZmZmZmZmY7IC8qIGNsZWFyIGl0ICovCi0KLQlzaGFycHNsX3BtLmZsYWdzICY9IH5TSEFSUFNMX0FMQVJNX0FDVElWRTsKLQlpZiAoKHNoYXJwc2xfcG0uY2hhcmdlX21vZGUgPT0gQ0hSR19PTikgJiYgKChhbGFybV9lbmFibGUgJiYgKChhbGFybV90aW1lIC0gUkNOUikgPiAoU0hBUlBTTF9CQVRDSEtfVElNRV9TVVNQRU5EICsgMzApKSkgfHwgIWFsYXJtX2VuYWJsZSkpIHsKLQkJUlRTUiAmPSBSVFNSX0FMRTsKLQkJUlRBUiA9IFJDTlIgKyBTSEFSUFNMX0JBVENIS19USU1FX1NVU1BFTkQ7Ci0JCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJDaGFyZ2luZyBhbGFybSBhdDogJTA4eFxuIixSVEFSKTsKLQkJc2hhcnBzbF9wbS5mbGFncyB8PSBTSEFSUFNMX0FMQVJNX0FDVElWRTsKLQl9IGVsc2UgaWYgKGFsYXJtX2VuYWJsZSkgewotCQlSVFNSICY9IFJUU1JfQUxFOwotCQlSVEFSID0gYWxhcm1fdGltZTsKLQkJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIlVzZXIgYWxhcm0gYXQ6ICUwOHhcbiIsUlRBUik7Ci0JfSBlbHNlIHsKLQkJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIk5vIGFsYXJtcyBzZXQuXG4iKTsKLQl9Ci0KLQlweGFfcG1fZW50ZXIoc3RhdGUpOwotCi0Jc2hhcnBzbF9wbS5tYWNoaW5mby0+cG9zdHN1c3BlbmQoKTsKLQotCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJDb3JnaSB3b2tlbiB1cCBmcm9tIHN1c3BlbmQ6ICUwOHhcbiIsUEVEUik7Ci19Ci0KLXN0YXRpYyBpbnQgY29yZ2lfZW50ZXJfc3VzcGVuZCh1bnNpZ25lZCBsb25nIGFsYXJtX3RpbWUsIHVuc2lnbmVkIGludCBhbGFybV9lbmFibGUsIHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKLXsKLQlpZiAoIXNoYXJwc2xfcG0ubWFjaGluZm8tPnNob3VsZF93YWtldXAoIShzaGFycHNsX3BtLmZsYWdzICYgU0hBUlBTTF9BTEFSTV9BQ1RJVkUpICYmIGFsYXJtX2VuYWJsZSkgKQotCXsKLQkJaWYgKCEoc2hhcnBzbF9wbS5mbGFncyAmIFNIQVJQU0xfQUxBUk1fQUNUSVZFKSkgewotCQkJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIk5vIHVzZXIgdHJpZ2dlcmVkIHdha2V1cCBldmVudHMgYW5kIG5vdCBjaGFyZ2luZy4gU3RyYW5nZS4gU3VzcGVuZC5cbiIpOwotCQkJY29yZ2lfZ290b19zbGVlcChhbGFybV90aW1lLCBhbGFybV9lbmFibGUsIHN0YXRlKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCWlmKHNoYXJwc2xfb2ZmX2NoYXJnZV9iYXR0ZXJ5KCkpIHsKLQkJCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJDaGFyZ2luZy4gU3VzcGVuZC4uLlxuIik7Ci0JCQljb3JnaV9nb3RvX3NsZWVwKGFsYXJtX3RpbWUsIGFsYXJtX2VuYWJsZSwgc3RhdGUpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIlVzZXIgdHJpZ2dlcmVkIHdha2V1cCBpbiBvZmZsaW5lIGNoYXJnZXIuXG4iKTsKLQl9Ci0KLQlpZiAoKFNUQVRVU19CQVRUX0xPQ0tFRCgpID09IDApIHx8IChzaGFycHNsX2ZhdGFsX2NoZWNrKCkgPCAwKSApCi0JewotCQlkZXZfZXJyKHNoYXJwc2xfcG0uZGV2LCAiRmF0YWwgY29uZGl0aW9uLiBTdXNwZW5kLlxuIik7Ci0JCWNvcmdpX2dvdG9fc2xlZXAoYWxhcm1fdGltZSwgYWxhcm1fZW5hYmxlLCBzdGF0ZSk7Ci0JCXJldHVybiAxOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNvcmdpX3B4YV9wbV9lbnRlcihzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCi17Ci0JdW5zaWduZWQgbG9uZyBhbGFybV90aW1lID0gUlRBUjsKLQl1bnNpZ25lZCBpbnQgYWxhcm1fc3RhdHVzID0gKChSVFNSICYgUlRTUl9BTEUpICE9IDApOwotCi0JZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIlNoYXJwU0wgc3VzcGVuZGluZyBmb3IgZmlyc3QgdGltZS5cbiIpOwotCi0JY29yZ2lfZ290b19zbGVlcChhbGFybV90aW1lLCBhbGFybV9zdGF0dXMsIHN0YXRlKTsKLQotCXdoaWxlIChjb3JnaV9lbnRlcl9zdXNwZW5kKGFsYXJtX3RpbWUsYWxhcm1fc3RhdHVzLHN0YXRlKSkKLQkJe30KLQotCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJTaGFycFNMIHJlc3VtaW5nLi4uXG4iKTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLQotLyoKLSAqIENoZWNrIGZvciBmYXRhbCBiYXR0ZXJ5IGVycm9ycwotICogRmF0YWwgcmV0dXJucyAtMQotICovCi1zdGF0aWMgaW50IHNoYXJwc2xfZmF0YWxfY2hlY2sodm9pZCkKLXsKLQlpbnQgYnVmZls1XSwgdGVtcCwgaSwgYWNpbjsKLQotCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJzaGFycHNsX2ZhdGFsX2NoZWNrIGVudGVyZWRcbiIpOwotCi0JLyogQ2hlY2sgQUMtQWRhcHRlciAqLwotCWFjaW4gPSBTVEFUVVNfQUNfSU4oKTsKLQotCWlmIChhY2luICYmIChzaGFycHNsX3BtLmNoYXJnZV9tb2RlID09IENIUkdfT04pKSB7Ci0JCUNIQVJHRV9PRkYoKTsKLQkJdWRlbGF5KDEwMCk7Ci0JCURJU0NIQVJHRV9PTigpOwkvKiBlbmFibGUgZGlzY2hhcmdlICovCi0JCW1kZWxheShTSEFSUFNMX1dBSVRfRElTQ0hBUkdFX09OKTsKLQl9Ci0KLQlpZiAoc2hhcnBzbF9wbS5tYWNoaW5mby0+ZGlzY2hhcmdlMSkKLQkJc2hhcnBzbF9wbS5tYWNoaW5mby0+ZGlzY2hhcmdlMSgxKTsKLQotCS8qIENoZWNrIGJhdHRlcnkgOiBjaGVjayBpbnNlcnRpbmcgYmF0dGVyeSA/ICovCi0JZm9yIChpPTA7IGk8NTsgaSsrKSB7Ci0JCWJ1ZmZbaV0gPSBzaGFycHNsX3JlYWRfbWFpbl9iYXR0ZXJ5KCk7Ci0JCW1kZWxheShTSEFSUFNMX0NIRUNLX0JBVFRFUllfV0FJVF9USU1FX1ZPTFQpOwotCX0KLQotCWlmIChzaGFycHNsX3BtLm1hY2hpbmZvLT5kaXNjaGFyZ2UxKQotCQlzaGFycHNsX3BtLm1hY2hpbmZvLT5kaXNjaGFyZ2UxKDApOwotCi0JaWYgKGFjaW4gJiYgKHNoYXJwc2xfcG0uY2hhcmdlX21vZGUgPT0gQ0hSR19PTikpIHsKLQkJdWRlbGF5KDEwMCk7Ci0JCUNIQVJHRV9PTigpOwotCQlESVNDSEFSR0VfT0ZGKCk7Ci0JfQotCi0JdGVtcCA9IGdldF9zZWxlY3RfdmFsKGJ1ZmYpOwotCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJzaGFycHNsX2ZhdGFsX2NoZWNrOiBhY2luOiAlZCwgZGlzY2hhcmdlIHZvbHRhZ2U6ICVkLCBubyBkaXNjaGFyZ2U6ICVkXG4iLCBhY2luLCB0ZW1wLCBzaGFycHNsX3JlYWRfbWFpbl9iYXR0ZXJ5KCkpOwotCi0JaWYgKChhY2luICYmICh0ZW1wIDwgU0hBUlBTTF9GQVRBTF9BQ0lOX1ZPTFQpKSB8fAotCQkJKCFhY2luICYmICh0ZW1wIDwgU0hBUlBTTF9GQVRBTF9OT0FDSU5fVk9MVCkpKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2hhcnBzbF9vZmZfY2hhcmdlX2Vycm9yKHZvaWQpCi17Ci0JZGV2X2VycihzaGFycHNsX3BtLmRldiwgIk9mZmxpbmUgQ2hhcmdlcjogRXJyb3Igb2NjdXJlZC5cbiIpOwotCUNIQVJHRV9PRkYoKTsKLQlDSEFSR0VfTEVEX0VSUigpOwotCXNoYXJwc2xfcG0uY2hhcmdlX21vZGUgPSBDSFJHX0VSUk9SOwotCXJldHVybiAxOwotfQotCi0vKgotICogQ2hhcmdpbmcgQ29udHJvbCB3aGlsZSBzdXNwZW5kZWQKLSAqIFJldHVybiAxIC0gZ28gc3RyYWlnaHQgdG8gc2xlZXAKLSAqIFJldHVybiAwIC0gc2xlZXAgb3Igd2FrZXVwIGRlcGVuZGluZyBvbiBvdGhlciBmYWN0b3JzCi0gKi8KLXN0YXRpYyBpbnQgc2hhcnBzbF9vZmZfY2hhcmdlX2JhdHRlcnkodm9pZCkKLXsKLQlpbnQgdGltZTsKLQotCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJDaGFyZ2UgTW9kZTogJWRcbiIsIHNoYXJwc2xfcG0uY2hhcmdlX21vZGUpOwotCi0JaWYgKHNoYXJwc2xfcG0uY2hhcmdlX21vZGUgPT0gQ0hSR19PRkYpIHsKLQkJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIk9mZmxpbmUgQ2hhcmdlcjogU3RlcCAxXG4iKTsKLQotCQkvKiBBQyBDaGVjayAqLwotCQlpZiAoKHNoYXJwc2xfYWNfY2hlY2soKSA8IDApIHx8IChzaGFycHNsX2NoZWNrX2JhdHRlcnlfdGVtcCgpIDwgMCkpCi0JCQlyZXR1cm4gc2hhcnBzbF9vZmZfY2hhcmdlX2Vycm9yKCk7Ci0KLQkJLyogU3RhcnQgQ2hhcmdpbmcgKi8KLQkJQ0hBUkdFX0xFRF9PTigpOwotCQlDSEFSR0VfT0ZGKCk7Ci0JCW1kZWxheShTSEFSUFNMX0NIQVJHRV9XQUlUX1RJTUUpOwotCQlDSEFSR0VfT04oKTsKLQotCQlzaGFycHNsX3BtLmNoYXJnZV9tb2RlID0gQ0hSR19PTjsKLQkJc2hhcnBzbF9wbS5mdWxsX2NvdW50ID0gMDsKLQotCQlyZXR1cm4gMTsKLQl9IGVsc2UgaWYgKHNoYXJwc2xfcG0uY2hhcmdlX21vZGUgIT0gQ0hSR19PTikgewotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpZiAoc2hhcnBzbF9wbS5mdWxsX2NvdW50ID09IDApIHsKLQkJaW50IHRpbWU7Ci0KLQkJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIk9mZmxpbmUgQ2hhcmdlcjogU3RlcCAyXG4iKTsKLQotCQlpZiAoKHNoYXJwc2xfY2hlY2tfYmF0dGVyeV90ZW1wKCkgPCAwKSB8fCAoc2hhcnBzbF9jaGVja19iYXR0ZXJ5X3ZvbHRhZ2UoKSA8IDApKQotCQkJcmV0dXJuIHNoYXJwc2xfb2ZmX2NoYXJnZV9lcnJvcigpOwotCi0JCUNIQVJHRV9PRkYoKTsKLQkJbWRlbGF5KFNIQVJQU0xfQ0hBUkdFX1dBSVRfVElNRSk7Ci0JCUNIQVJHRV9PTigpOwotCQlzaGFycHNsX3BtLmNoYXJnZV9tb2RlID0gQ0hSR19PTjsKLQotCQltZGVsYXkoU0hBUlBTTF9DSEFSR0VfQ09fQ0hFQ0tfVElNRSk7Ci0KLQkJdGltZSA9IFJDTlI7Ci0JCXdoaWxlKDEpIHsKLQkJCS8qIENoZWNrIGlmIGFueSB3YWtldXAgZXZlbnQgaGFkIG9jY3VyZWQgKi8KLQkJCWlmIChzaGFycHNsX3BtLm1hY2hpbmZvLT5jaGFyZ2VyX3dha2V1cCgpICE9IDApCi0JCQkJcmV0dXJuIDA7Ci0JCQkvKiBDaGVjayBmb3IgdGltZW91dCAqLwotCQkJaWYgKChSQ05SIC0gdGltZSkgPiBTSEFSUFNMX1dBSVRfQ09fVElNRSkKLQkJCQlyZXR1cm4gMTsKLQkJCWlmIChTVEFUVVNfQ0hSR19GVUxMKCkpIHsKLQkJCQlkZXZfZGJnKHNoYXJwc2xfcG0uZGV2LCAiT2ZmbGluZSBDaGFyZ2VyOiBDaGFyZ2UgZnVsbCBvY2N1cmVkLiBSZXRyeWluZyB0byBjaGVja1xuIik7Ci0JICAgCQkJc2hhcnBzbF9wbS5mdWxsX2NvdW50Kys7Ci0JCQkJQ0hBUkdFX09GRigpOwotCQkJCW1kZWxheShTSEFSUFNMX0NIQVJHRV9XQUlUX1RJTUUpOwotCQkJCUNIQVJHRV9PTigpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JfQotCi0JZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIk9mZmxpbmUgQ2hhcmdlcjogU3RlcCAzXG4iKTsKLQotCW1kZWxheShTSEFSUFNMX0NIQVJHRV9DT19DSEVDS19USU1FKTsKLQotCXRpbWUgPSBSQ05SOwotCXdoaWxlKDEpIHsKLQkJLyogQ2hlY2sgaWYgYW55IHdha2V1cCBldmVudCBoYWQgb2NjdXJlZCAqLwotCQlpZiAoc2hhcnBzbF9wbS5tYWNoaW5mby0+Y2hhcmdlcl93YWtldXAoKSAhPSAwKQotCQkJcmV0dXJuIDA7Ci0JCS8qIENoZWNrIGZvciB0aW1lb3V0ICovCi0JCWlmICgoUkNOUi10aW1lKSA+IFNIQVJQU0xfV0FJVF9DT19USU1FKSB7Ci0JCQlpZiAoc2hhcnBzbF9wbS5mdWxsX2NvdW50ID4gU0hBUlBTTF9DSEFSR0VfUkVUUllfQ05UKSB7Ci0JCQkJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIk9mZmxpbmUgQ2hhcmdlcjogTm90IGNoYXJnZWQgc3VmZmljaWVudGx5LiBSZXRyeWluZy5cbiIpOwotCQkJCXNoYXJwc2xfcG0uZnVsbF9jb3VudCA9IDA7Ci0JCQl9Ci0JCQlzaGFycHNsX3BtLmZ1bGxfY291bnQrKzsKLQkJCXJldHVybiAxOwotCQl9Ci0JCWlmIChTVEFUVVNfQ0hSR19GVUxMKCkpIHsKLQkJCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJPZmZsaW5lIENoYXJnZXI6IENoYXJnaW5nIGNvbXBsZXRlLlxuIik7Ci0JCQlDSEFSR0VfTEVEX09GRigpOwotCQkJQ0hBUkdFX09GRigpOwotCQkJc2hhcnBzbF9wbS5jaGFyZ2VfbW9kZSA9IENIUkdfRE9ORTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotfQotCi0KLXN0YXRpYyBzc2l6ZV90IGJhdHRlcnlfcGVyY2VudGFnZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIixzaGFycHNsX3BtLmJhdHRzdGF0Lm1haW5iYXRfcGVyY2VudCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGJhdHRlcnlfdm9sdGFnZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIixzaGFycHNsX3BtLmJhdHRzdGF0Lm1haW5iYXRfdm9sdGFnZSk7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihiYXR0ZXJ5X3BlcmNlbnRhZ2UsIDA0NDQsIGJhdHRlcnlfcGVyY2VudGFnZV9zaG93LCBOVUxMKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihiYXR0ZXJ5X3ZvbHRhZ2UsIDA0NDQsIGJhdHRlcnlfdm9sdGFnZV9zaG93LCBOVUxMKTsKLQotZXh0ZXJuIHZvaWQgKCphcG1fZ2V0X3Bvd2VyX3N0YXR1cykoc3RydWN0IGFwbV9wb3dlcl9pbmZvICopOwotCi1zdGF0aWMgdm9pZCBzaGFycHNsX2FwbV9nZXRfcG93ZXJfc3RhdHVzKHN0cnVjdCBhcG1fcG93ZXJfaW5mbyAqaW5mbykKLXsKLQlpbmZvLT5hY19saW5lX3N0YXR1cyA9IHNoYXJwc2xfcG0uYmF0dHN0YXQuYWNfc3RhdHVzOwotCi0JaWYgKHNoYXJwc2xfcG0uY2hhcmdlX21vZGUgPT0gQ0hSR19PTikKLQkJaW5mby0+YmF0dGVyeV9zdGF0dXMgPSBBUE1fQkFUVEVSWV9TVEFUVVNfQ0hBUkdJTkc7Ci0JZWxzZQotCQlpbmZvLT5iYXR0ZXJ5X3N0YXR1cyA9IHNoYXJwc2xfcG0uYmF0dHN0YXQubWFpbmJhdF9zdGF0dXM7Ci0KLQlpbmZvLT5iYXR0ZXJ5X2ZsYWcgPSAoMSA8PCBpbmZvLT5iYXR0ZXJ5X3N0YXR1cyk7Ci0JaW5mby0+YmF0dGVyeV9saWZlID0gc2hhcnBzbF9wbS5iYXR0c3RhdC5tYWluYmF0X3BlcmNlbnQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcG1fb3BzIHNoYXJwc2xfcG1fb3BzID0gewotCS5wbV9kaXNrX21vZGUJPSBQTV9ESVNLX0ZJUk1XQVJFLAotCS5wcmVwYXJlCT0gcHhhX3BtX3ByZXBhcmUsCi0JLmVudGVyCQk9IGNvcmdpX3B4YV9wbV9lbnRlciwKLQkuZmluaXNoCQk9IHB4YV9wbV9maW5pc2gsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBzaGFycHNsX3BtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaWYgKCFwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzaGFycHNsX3BtLmRldiA9ICZwZGV2LT5kZXY7Ci0Jc2hhcnBzbF9wbS5tYWNoaW5mbyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXNoYXJwc2xfcG0uY2hhcmdlX21vZGUgPSBDSFJHX09GRjsKLQlzaGFycHNsX3BtLmZsYWdzID0gMDsKLQotCXNoYXJwc2xfcG0ubWFjaGluZm8tPmluaXQoKTsKLQotCWluaXRfdGltZXIoJnNoYXJwc2xfcG0uYWNfdGltZXIpOwotCXNoYXJwc2xfcG0uYWNfdGltZXIuZnVuY3Rpb24gPSBzaGFycHNsX2FjX3RpbWVyOwotCi0JaW5pdF90aW1lcigmc2hhcnBzbF9wbS5jaHJnX2Z1bGxfdGltZXIpOwotCXNoYXJwc2xfcG0uY2hyZ19mdWxsX3RpbWVyLmZ1bmN0aW9uID0gc2hhcnBzbF9jaHJnX2Z1bGxfdGltZXI7Ci0KIAlweGFfZ3Bpb19tb2RlKHNoYXJwc2xfcG0ubWFjaGluZm8tPmdwaW9fYWNpbiB8IEdQSU9fSU4pOwogCXB4YV9ncGlvX21vZGUoc2hhcnBzbF9wbS5tYWNoaW5mby0+Z3Bpb19iYXRmdWxsIHwgR1BJT19JTik7CiAJcHhhX2dwaW9fbW9kZShzaGFycHNsX3BtLm1hY2hpbmZvLT5ncGlvX2JhdGxvY2sgfCBHUElPX0lOKTsKQEAgLTkzOCwyNiArMTY0LDEwIEBACiAJCX0KIAkJZWxzZSBzZXRfaXJxX3R5cGUoSVJRX0dQSU8oc2hhcnBzbF9wbS5tYWNoaW5mby0+Z3Bpb19iYXRmdWxsKSxJUlFUX1JJU0lORyk7CiAJfQotCi0JZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9iYXR0ZXJ5X3BlcmNlbnRhZ2UpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfYmF0dGVyeV92b2x0YWdlKTsKLQotCWFwbV9nZXRfcG93ZXJfc3RhdHVzID0gc2hhcnBzbF9hcG1fZ2V0X3Bvd2VyX3N0YXR1czsKLQotCXBtX3NldF9vcHMoJnNoYXJwc2xfcG1fb3BzKTsKLQotCW1vZF90aW1lcigmc2hhcnBzbF9wbS5hY190aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjUwKSk7Ci0KLQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzaGFycHNsX3BtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQordm9pZCBzaGFycHNsX3BtX3B4YV9yZW1vdmUodm9pZCkKIHsKLQlwbV9zZXRfb3BzKE5VTEwpOwotCi0JZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9iYXR0ZXJ5X3BlcmNlbnRhZ2UpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfYmF0dGVyeV92b2x0YWdlKTsKLQogCWZyZWVfaXJxKElSUV9HUElPKHNoYXJwc2xfcG0ubWFjaGluZm8tPmdwaW9fYWNpbiksIHNoYXJwc2xfYWNfaXNyKTsKIAlmcmVlX2lycShJUlFfR1BJTyhzaGFycHNsX3BtLm1hY2hpbmZvLT5ncGlvX2JhdGxvY2spLCBzaGFycHNsX2ZhdGFsX2lzcik7CiAKQEAgLTk2NiwzMiArMTc2LDQgQEAKIAogCWlmICghbWFjaGluZV9pc19jb3JnaSgpKQogCQlmcmVlX2lycShJUlFfR1BJTyhzaGFycHNsX3BtLm1hY2hpbmZvLT5ncGlvX2JhdGZ1bGwpLCBzaGFycHNsX2NocmdfZnVsbF9pc3IpOwotCi0JZGVsX3RpbWVyX3N5bmMoJnNoYXJwc2xfcG0uY2hyZ19mdWxsX3RpbWVyKTsKLQlkZWxfdGltZXJfc3luYygmc2hhcnBzbF9wbS5hY190aW1lcik7Ci0KLQlyZXR1cm4gMDsKIH0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2hhcnBzbF9wbV9kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IHNoYXJwc2xfcG1fcHJvYmUsCi0JLnJlbW92ZQkJPSBzaGFycHNsX3BtX3JlbW92ZSwKLQkuc3VzcGVuZAk9IHNoYXJwc2xfcG1fc3VzcGVuZCwKLQkucmVzdW1lCQk9IHNoYXJwc2xfcG1fcmVzdW1lLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQkJPSAic2hhcnBzbC1wbSIsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IHNoYXJwc2xfcG1faW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNoYXJwc2xfcG1fZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgc2hhcnBzbF9wbV9leGl0KHZvaWQpCi17Ci0gCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzaGFycHNsX3BtX2RyaXZlcik7Ci19Ci0KLWxhdGVfaW5pdGNhbGwoc2hhcnBzbF9wbV9pbml0KTsKLW1vZHVsZV9leGl0KHNoYXJwc2xfcG1fZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9zcGl0ei5jIGIvYXJjaC9hcm0vbWFjaC1weGEvc3BpdHouYwppbmRleCAyZGYxYjU2Li5jMDk0ZDk5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9zcGl0ei5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3NwaXR6LmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxhc20vYXJjaC9pcnEuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9pcmRhLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvbW1jLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb2hjaS5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3VkYy5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3B4YWZiLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvYWtpdGEuaD4KQEAgLTEyNiwxMCArMTI3LDEyIEBACiAJCSAgICAgICAgY3ByICY9IH4weDAwMDI7CiAJCWlmIChkZXZpY2UgPT0gU1BJVFpfUFdSX1NEKQogCQkgICAgICAgIGNwciAmPSB+MHgwMDA0OwotCSAgICAgICAgd3JpdGVfc2Nvb3BfcmVnKCZzcGl0enNjb29wX2RldmljZS5kZXYsIFNDT09QX0NQUiwgY3ByIHwgbmV3X2Nwcik7CiAJCWlmICghKGNwciAmIDB4MDAwMikgJiYgIShjcHIgJiAweDAwMDQpKSB7CisJCQl3cml0ZV9zY29vcF9yZWcoJnNwaXR6c2Nvb3BfZGV2aWNlLmRldiwgU0NPT1BfQ1BSLCAweDAwMDApOwogCQkgICAgICAgIG1kZWxheSgxKTsKIAkJICAgICAgICByZXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wX2RldmljZS5kZXYsIFNQSVRaX1NDUF9DRl9QT1dFUik7CisJCX0gZWxzZSB7CisJCSAgICAgICAgd3JpdGVfc2Nvb3BfcmVnKCZzcGl0enNjb29wX2RldmljZS5kZXYsIFNDT09QX0NQUiwgY3ByIHwgbmV3X2Nwcik7CiAJCX0KIAl9CiB9CkBAIC0yOTMsMTUgKzI5NiwxNCBAQAogCiAJc3BpdHpfbWNpX3BsYXRmb3JtX2RhdGEuZGV0ZWN0X2RlbGF5ID0gbXNlY3NfdG9famlmZmllcygyNTApOwogCi0JZXJyID0gcmVxdWVzdF9pcnEoU1BJVFpfSVJRX0dQSU9fblNEX0RFVEVDVCwgc3BpdHpfZGV0ZWN0X2ludCwgU0FfSU5URVJSVVBULAotCQkJICAgICAiTU1DIGNhcmQgZGV0ZWN0IiwgZGF0YSk7CisJZXJyID0gcmVxdWVzdF9pcnEoU1BJVFpfSVJRX0dQSU9fblNEX0RFVEVDVCwgc3BpdHpfZGV0ZWN0X2ludCwKKwkJCSAgU0FfSU5URVJSVVBUIHwgU0FfVFJJR0dFUl9SSVNJTkcgfCBTQV9UUklHR0VSX0ZBTExJTkcsCisJCQkgICJNTUMgY2FyZCBkZXRlY3QiLCBkYXRhKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAic3BpdHpfbWNpX2luaXQ6IE1NQy9TRDogY2FuJ3QgcmVxdWVzdCBNTUMgY2FyZCBkZXRlY3QgSVJRXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCXNldF9pcnFfdHlwZShTUElUWl9JUlFfR1BJT19uU0RfREVURUNULCBJUlFUX0JPVEhFREdFKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0zMzUsNiArMzM3LDM1IEBACiAKIAogLyoKKyAqIFVTQiBIb3N0IChPSENJKQorICovCitzdGF0aWMgaW50IHNwaXR6X29oY2lfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJLyogT25seSBQb3J0IDIgaXMgY29ubmVjdGVkICovCisJcHhhX2dwaW9fbW9kZShTUElUWl9HUElPX1VTQl9DT05ORUNUIHwgR1BJT19JTik7CisJcHhhX2dwaW9fbW9kZShTUElUWl9HUElPX1VTQl9IT1NUIHwgR1BJT19PVVQpOworCXB4YV9ncGlvX21vZGUoU1BJVFpfR1BJT19VU0JfREVWSUNFIHwgR1BJT19JTik7CisKKwkvKiBTZXR1cCBVU0IgUG9ydCAyIE91dHB1dCBDb250cm9sIFJlZ2lzdGVyICovCisJVVAyT0NSID0gVVAyT0NSX0hYUyB8IFVQMk9DUl9IWE9FIHwgVVAyT0NSX0RQUERFIHwgVVAyT0NSX0RNUERFOworCisJR1BTUihTUElUWl9HUElPX1VTQl9IT1NUKSA9IEdQSU9fYml0KFNQSVRaX0dQSU9fVVNCX0hPU1QpOworCisJVUhDSFIgPSAoVUhDSFIpICYKKwkJfihVSENIUl9TU0VQMSB8IFVIQ0hSX1NTRVAyIHwgVUhDSFJfU1NFUDMgfCBVSENIUl9TU0UpOworCisJVUhDUkhEQSB8PSBVSENSSERBX05PQ1A7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBweGFvaGNpX3BsYXRmb3JtX2RhdGEgc3BpdHpfb2hjaV9wbGF0Zm9ybV9kYXRhID0geworCS5wb3J0X21vZGUJPSBQTU1fTlBTX01PREUsCisJLmluaXQJCT0gc3BpdHpfb2hjaV9pbml0LAorfTsKKworCisvKgogICogSXJkYQogICovCiBzdGF0aWMgdm9pZCBzcGl0el9pcmRhX3RyYW5zY2VpdmVyX21vZGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbW9kZSkKQEAgLTQxMSw2ICs0NDIsNyBAQAogCiAJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7CiAJcHhhX3NldF9tY2lfaW5mbygmc3BpdHpfbWNpX3BsYXRmb3JtX2RhdGEpOworCXB4YV9zZXRfb2hjaV9pbmZvKCZzcGl0el9vaGNpX3BsYXRmb3JtX2RhdGEpOwogCXB4YV9zZXRfZmljcF9pbmZvKCZzcGl0el9maWNwX3BsYXRmb3JtX2RhdGEpOwogCXNldF9weGFfZmJfcGFyZW50KCZzcGl0enNzcF9kZXZpY2UuZGV2KTsKIAlzZXRfcHhhX2ZiX2luZm8oJnNwaXR6X3B4YWZiX2luZm8pOwpAQCAtNDY1LDcgKzQ5Nyw2IEBACiAKICNpZmRlZiBDT05GSUdfTUFDSF9TUElUWgogTUFDSElORV9TVEFSVChTUElUWiwgIlNIQVJQIFNwaXR6IikKLQkucGh5c19yYW0JPSAweGEwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoaW9fcDJ2KDB4NDAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuZml4dXAJCT0gZml4dXBfc3BpdHosCkBAIC00NzgsNyArNTA5LDYgQEAKIAogI2lmZGVmIENPTkZJR19NQUNIX0JPUlpPSQogTUFDSElORV9TVEFSVChCT1JaT0ksICJTSEFSUCBCb3J6b2kiKQotCS5waHlzX3JhbQk9IDB4YTAwMDAwMDAsCiAJLnBoeXNfaW8JPSAweDQwMDAwMDAwLAogCS5pb19wZ19vZmZzdAk9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5maXh1cAkJPSBmaXh1cF9zcGl0eiwKQEAgLTQ5MSw3ICs1MjEsNiBAQAogCiAjaWZkZWYgQ09ORklHX01BQ0hfQUtJVEEKIE1BQ0hJTkVfU1RBUlQoQUtJVEEsICJTSEFSUCBBa2l0YSIpCi0JLnBoeXNfcmFtCT0gMHhhMDAwMDAwMCwKIAkucGh5c19pbwk9IDB4NDAwMDAwMDAsCiAJLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmZpeHVwCQk9IGZpeHVwX3NwaXR6LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvc3BpdHpfcG0uYyBiL2FyY2gvYXJtL21hY2gtcHhhL3NwaXR6X3BtLmMKaW5kZXggM2NlNzQ4Ni4uNWU1YmRjOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvc3BpdHpfcG0uYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9zcGl0el9wbS5jCkBAIC0zMywxOSArMzMsNyBAQAogewogCXB4YV9ncGlvX21vZGUoU1BJVFpfR1BJT19LRVlfSU5UIHwgR1BJT19JTik7CiAJcHhhX2dwaW9fbW9kZShTUElUWl9HUElPX1NZTkMgfCBHUElPX0lOKTsKLX0KLQotc3RhdGljIHZvaWQgc3BpdHpfY2hhcmdlX2xlZChpbnQgdmFsKQotewotCWlmICh2YWwgPT0gU0hBUlBTTF9MRURfRVJST1IpIHsKLQkJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIkNoYXJnZSBMRUQgRXJyb3JcbiIpOwotCX0gZWxzZSBpZiAodmFsID09IFNIQVJQU0xfTEVEX09OKSB7Ci0JCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJDaGFyZ2UgTEVEIE9uXG4iKTsKLQkJc2V0X3Njb29wX2dwaW8oJnNwaXR6c2Nvb3BfZGV2aWNlLmRldiwgU1BJVFpfU0NQX0xFRF9PUkFOR0UpOwotCX0gZWxzZSB7Ci0JCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJDaGFyZ2UgTEVEIE9mZlxuIik7Ci0JCXJlc2V0X3Njb29wX2dwaW8oJnNwaXR6c2Nvb3BfZGV2aWNlLmRldiwgU1BJVFpfU0NQX0xFRF9PUkFOR0UpOwotCX0KKwlzaGFycHNsX3BtX3B4YV9pbml0KCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNwaXR6X21lYXN1cmVfdGVtcChpbnQgb24pCkBAIC05Miw3ICs4MCw3IEBACiAKIHN0YXRpYyB2b2lkIHNwaXR6X3ByZXN1c3BlbmQodm9pZCkKIHsKLQlzcGl0el9sYXN0X2FjX3N0YXR1cyA9IFNUQVRVU19BQ19JTigpOworCXNwaXR6X2xhc3RfYWNfc3RhdHVzID0gc2hhcnBzbF9wbS5tYWNoaW5mby0+cmVhZF9kZXZkYXRhKFNIQVJQU0xfU1RBVFVTX0FDSU4pOwogCiAJLyogR1BJTyBTbGVlcCBSZWdpc3RlciAqLwogCVBHU1IwID0gMHgwMDE0NDAxODsKQEAgLTEzOCw3ICsxMjYsNyBAQAogc3RhdGljIGludCBzcGl0el9zaG91bGRfd2FrZXVwKHVuc2lnbmVkIGludCByZXN1bWVfb25fYWxhcm0pCiB7CiAJaW50IGlzX3Jlc3VtZSA9IDA7Ci0JaW50IGFjaW4gPSBTVEFUVVNfQUNfSU4oKTsKKwlpbnQgYWNpbiA9IHNoYXJwc2xfcG0ubWFjaGluZm8tPnJlYWRfZGV2ZGF0YShTSEFSUFNMX1NUQVRVU19BQ0lOKTsKIAogCWlmIChzcGl0el9sYXN0X2FjX3N0YXR1cyAhPSBhY2luKSB7CiAJCWlmIChhY2luKSB7CkBAIC0xNDgsOCArMTM2LDggQEAKIAkJfSBlbHNlIHsKIAkJCS8qIGNoYXJnZSBvZmYgKi8KIAkJCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJBQyBSZW1vdmVkXG4iKTsKLQkJCUNIQVJHRV9MRURfT0ZGKCk7Ci0JCQlDSEFSR0VfT0ZGKCk7CisJCQlzaGFycHNsX3BtX2xlZChTSEFSUFNMX0xFRF9PRkYpOworCQkJc2hhcnBzbF9wbS5tYWNoaW5mby0+Y2hhcmdlKDApOwogCQkJc2hhcnBzbF9wbS5jaGFyZ2VfbW9kZSA9IENIUkdfT0ZGOwogCQl9CiAJCXNwaXR6X2xhc3RfYWNfc3RhdHVzID0gYWNpbjsKQEAgLTE3NSwyNSArMTYzLDQxIEBACiAJcmV0dXJuICh+R1BMUjAgJiBHUElPX2JpdChTUElUWl9HUElPX0tFWV9JTlQpKSB8IChHUExSMCAmIEdQSU9fYml0KFNQSVRaX0dQSU9fU1lOQykpOwogfQogCi1zdGF0aWMgaW50IHNwaXR6X2FjaW5fc3RhdHVzKHZvaWQpCit1bnNpZ25lZCBsb25nIHNwaXR6cG1fcmVhZF9kZXZkYXRhKGludCB0eXBlKQogewotCXJldHVybiAoKCh+R1BMUihTUElUWl9HUElPX0FDX0lOKSkgJiBHUElPX2JpdChTUElUWl9HUElPX0FDX0lOKSkgIT0gMCk7CisJc3dpdGNoKHR5cGUpIHsKKwljYXNlIFNIQVJQU0xfU1RBVFVTX0FDSU46CisJCXJldHVybiAoKCh+R1BMUihTUElUWl9HUElPX0FDX0lOKSkgJiBHUElPX2JpdChTUElUWl9HUElPX0FDX0lOKSkgIT0gMCk7CisJY2FzZSBTSEFSUFNMX1NUQVRVU19MT0NLOgorCQlyZXR1cm4gUkVBRF9HUElPX0JJVChzaGFycHNsX3BtLm1hY2hpbmZvLT5ncGlvX2JhdGxvY2spOworCWNhc2UgU0hBUlBTTF9TVEFUVVNfQ0hSR0ZVTEw6CisJCXJldHVybiBSRUFEX0dQSU9fQklUKHNoYXJwc2xfcG0ubWFjaGluZm8tPmdwaW9fYmF0ZnVsbCk7CisJY2FzZSBTSEFSUFNMX1NUQVRVU19GQVRBTDoKKwkJcmV0dXJuIFJFQURfR1BJT19CSVQoc2hhcnBzbF9wbS5tYWNoaW5mby0+Z3Bpb19mYXRhbCk7CisJY2FzZSBTSEFSUFNMX0FDSU5fVk9MVDoKKwkJcmV0dXJuIHNoYXJwc2xfcG1fcHhhX3JlYWRfbWF4MTExMShNQVgxMTExX0FDSU5fVk9MVCk7CisJY2FzZSBTSEFSUFNMX0JBVFRfVEVNUDoKKwkJcmV0dXJuIHNoYXJwc2xfcG1fcHhhX3JlYWRfbWF4MTExMShNQVgxMTExX0JBVFRfVEVNUCk7CisJY2FzZSBTSEFSUFNMX0JBVFRfVk9MVDoKKwlkZWZhdWx0OgorCQlyZXR1cm4gc2hhcnBzbF9wbV9weGFfcmVhZF9tYXgxMTExKE1BWDExMTFfQkFUVF9WT0xUKTsKKwl9CiB9CiAKIHN0cnVjdCBzaGFycHNsX2NoYXJnZXJfbWFjaGluZm8gc3BpdHpfcG1fbWFjaGluZm8gPSB7CiAJLmluaXQgICAgICAgICAgICAgPSBzcGl0el9jaGFyZ2VyX2luaXQsCisJLmV4aXQgICAgICAgICAgICAgPSBzaGFycHNsX3BtX3B4YV9yZW1vdmUsCiAJLmdwaW9fYmF0bG9jayAgICAgPSBTUElUWl9HUElPX0JBVF9DT1ZFUiwKIAkuZ3Bpb19hY2luICAgICAgICA9IFNQSVRaX0dQSU9fQUNfSU4sCiAJLmdwaW9fYmF0ZnVsbCAgICAgPSBTUElUWl9HUElPX0NIUkdfRlVMTCwKIAkuZ3Bpb19mYXRhbCAgICAgICA9IFNQSVRaX0dQSU9fRkFUQUxfQkFULAotCS5zdGF0dXNfYWNpbiAgICAgID0gc3BpdHpfYWNpbl9zdGF0dXMsCiAJLmRpc2NoYXJnZSAgICAgICAgPSBzcGl0el9kaXNjaGFyZ2UsCiAJLmRpc2NoYXJnZTEgICAgICAgPSBzcGl0el9kaXNjaGFyZ2UxLAogCS5jaGFyZ2UgICAgICAgICAgID0gc3BpdHpfY2hhcmdlLAotCS5jaGFyZ2VsZWQgICAgICAgID0gc3BpdHpfY2hhcmdlX2xlZCwKIAkubWVhc3VyZV90ZW1wICAgICA9IHNwaXR6X21lYXN1cmVfdGVtcCwKIAkucHJlc3VzcGVuZCAgICAgICA9IHNwaXR6X3ByZXN1c3BlbmQsCiAJLnBvc3RzdXNwZW5kICAgICAgPSBzcGl0el9wb3N0c3VzcGVuZCwKKwkucmVhZF9kZXZkYXRhICAgICA9IHNwaXR6cG1fcmVhZF9kZXZkYXRhLAogCS5jaGFyZ2VyX3dha2V1cCAgID0gc3BpdHpfY2hhcmdlcl93YWtldXAsCiAJLnNob3VsZF93YWtldXAgICAgPSBzcGl0el9zaG91bGRfd2FrZXVwLAogCS5iYXRfbGV2ZWxzICAgICAgID0gNDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9zc3AuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3NzcC5jCmluZGV4IGE2OGIzMGUuLjkzMDk2YmVmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9zc3AuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9zc3AuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KQEAgLTU5LDcgKzYwLDcgQEAKICNlbmRpZgogfTsKIAotc3RhdGljIERFQ0xBUkVfTVVURVgoc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgobXV0ZXgpOwogc3RhdGljIGludCB1c2VfY291bnRbUFhBX1NTUF9QT1JUU10gPSB7MCwgMCwgMH07CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzc3BfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCkBAIC0yMzksMTYgKzI0MCwxNiBAQAogCWlmIChwb3J0ID4gUFhBX1NTUF9QT1JUUyB8fCBwb3J0ID09IDApCiAJCXJldHVybiAtRU5PREVWOwogCi0JZG93bigmc2VtKTsKKwltdXRleF9sb2NrKCZtdXRleCk7CiAJaWYgKHVzZV9jb3VudFtwb3J0IC0gMV0pIHsKLQkJdXAoJnNlbSk7CisJCW11dGV4X3VubG9jaygmbXV0ZXgpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAl1c2VfY291bnRbcG9ydCAtIDFdKys7CiAKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihfX1BSRUcoU1NDUjBfUChwb3J0KSksIDB4MmMsICJTU1AiKSkgewogCQl1c2VfY291bnRbcG9ydCAtIDFdLS07Ci0JCXVwKCZzZW0pOworCQltdXRleF91bmxvY2soJm11dGV4KTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJZGV2LT5wb3J0ID0gcG9ydDsKQEAgLTI2NSwxMyArMjY2LDEzIEBACiAKIAkvKiB0dXJuIG9uIFNTUCBwb3J0IGNsb2NrICovCiAJcHhhX3NldF9ja2VuKHNzcF9pbmZvW3BvcnQtMV0uY2xvY2ssIDEpOwotCXVwKCZzZW0pOworCW11dGV4X3VubG9jaygmbXV0ZXgpOwogCXJldHVybiAwOwogCiBvdXRfcmVnaW9uOgogCXJlbGVhc2VfbWVtX3JlZ2lvbihfX1BSRUcoU1NDUjBfUChwb3J0KSksIDB4MmMpOwogCXVzZV9jb3VudFtwb3J0IC0gMV0tLTsKLQl1cCgmc2VtKTsKKwltdXRleF91bmxvY2soJm11dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yODIsNyArMjgzLDcgQEAKICAqLwogdm9pZCBzc3BfZXhpdChzdHJ1Y3Qgc3NwX2RldiAqZGV2KQogewotCWRvd24oJnNlbSk7CisJbXV0ZXhfbG9jaygmbXV0ZXgpOwogCVNTQ1IwX1AoZGV2LT5wb3J0KSAmPSB+U1NDUjBfU1NFOwogCiAgICAgCWlmIChkZXYtPnBvcnQgPiBQWEFfU1NQX1BPUlRTIHx8IGRldi0+cG9ydCA9PSAwKSB7CkBAIC0yOTUsNyArMjk2LDcgQEAKIAkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKF9fUFJFRyhTU0NSMF9QKGRldi0+cG9ydCkpLCAweDJjKTsKIAl1c2VfY291bnRbZGV2LT5wb3J0IC0gMV0tLTsKLQl1cCgmc2VtKTsKKwltdXRleF91bmxvY2soJm11dGV4KTsKIH0KIAogRVhQT1JUX1NZTUJPTChzc3Bfd3JpdGVfd29yZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS90b3NhLmMgYi9hcmNoL2FybS9tYWNoLXB4YS90b3NhLmMKaW5kZXggZTRmOTJlZi4uZDE2ODI4NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvdG9zYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3Rvc2EuYwpAQCAtMjk1LDcgKzI5NSw2IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoVE9TQSwgIlNIQVJQIFRvc2EiKQotCS5waHlzX3JhbQk9IDB4YTAwMDAwMDAsCiAJLnBoeXNfaW8JPSAweDQwMDAwMDAwLAogCS5pb19wZ19vZmZzdAk9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5maXh1cCAgICAgICAgICA9IGZpeHVwX3Rvc2EsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L0tjb25maWcKaW5kZXggMTI5OTc2OC4uMTdmNWY0NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvS2NvbmZpZwpAQCAtMyw3ICszLDYgQEAKIAogY29uZmlnIE1BQ0hfUkVBTFZJRVdfRUIKIAlib29sICJTdXBwb3J0IFJlYWxWaWV3L0VCIHBsYXRmb3JtIgotCWRlZmF1bHQgbgogCXNlbGVjdCBBUk1fR0lDCiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgQVJNKFIpIFJlYWxWaWV3IEVtdWxhdGlvbiBCYXNlYm9hcmQgcGxhdGZvcm0uCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2Nsb2NrLmMKaW5kZXggMDAyNjM1Yy4uMjEzMjVhNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY2xvY2suYwpAQCAtMTMsMjggKzEzLDI5IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvaWNzdDMwNy5oPgogCiAjaW5jbHVkZSAiY2xvY2suaCIKIAogc3RhdGljIExJU1RfSEVBRChjbG9ja3MpOwotc3RhdGljIERFQ0xBUkVfTVVURVgoY2xvY2tzX3NlbSk7CitzdGF0aWMgREVGSU5FX01VVEVYKGNsb2Nrc19tdXRleCk7CiAKIHN0cnVjdCBjbGsgKmNsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCkKIHsKIAlzdHJ1Y3QgY2xrICpwLCAqY2xrID0gRVJSX1BUUigtRU5PRU5UKTsKIAotCWRvd24oJmNsb2Nrc19zZW0pOworCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2xvY2tzLCBub2RlKSB7CiAJCWlmIChzdHJjbXAoaWQsIHAtPm5hbWUpID09IDAgJiYgdHJ5X21vZHVsZV9nZXQocC0+b3duZXIpKSB7CiAJCQljbGsgPSBwOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JdXAoJmNsb2Nrc19zZW0pOworCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKIAogCXJldHVybiBjbGs7CiB9CkBAIC01NywxNyArNTgsNiBAQAogfQogRVhQT1JUX1NZTUJPTChjbGtfZGlzYWJsZSk7CiAKLWludCBjbGtfdXNlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX3VzZSk7Ci0KLXZvaWQgY2xrX3VudXNlKHN0cnVjdCBjbGsgKmNsaykKLXsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX3VudXNlKTsKLQogdW5zaWduZWQgbG9uZyBjbGtfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQogewogCXJldHVybiBjbGstPnJhdGU7CkBAIC0xMjAsMTggKzExMCwxOCBAQAogCiBpbnQgY2xrX3JlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsaykKIHsKLQlkb3duKCZjbG9ja3Nfc2VtKTsKKwltdXRleF9sb2NrKCZjbG9ja3NfbXV0ZXgpOwogCWxpc3RfYWRkKCZjbGstPm5vZGUsICZjbG9ja3MpOwotCXVwKCZjbG9ja3Nfc2VtKTsKKwltdXRleF91bmxvY2soJmNsb2Nrc19tdXRleCk7CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGNsa19yZWdpc3Rlcik7CiAKIHZvaWQgY2xrX3VucmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKQogewotCWRvd24oJmNsb2Nrc19zZW0pOworCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7CiAJbGlzdF9kZWwoJmNsay0+bm9kZSk7Ci0JdXAoJmNsb2Nrc19zZW0pOworCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0woY2xrX3VucmVnaXN0ZXIpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5jCmluZGV4IGFmNjU4MGYuLjRhMjIyZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5jCkBAIC0yNCwxNCArMjQsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9jbGNkLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9sZWRzLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2FtYmEuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYW1iYV9jbGNkLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2FybV90aW1lci5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pY3N0MzA3Lmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5oIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jb3JlLmgKaW5kZXggYzA2ZTYwNC4uOTNlODZkOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jb3JlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jb3JlLmgKQEAgLTIyLDcgKzIyLDggQEAKICNpZm5kZWYgX19BU01fQVJDSF9SRUFMVklFV19ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfUkVBTFZJRVdfSAogCi0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2FtYmEuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgorCiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9sb2NhbHRpbWVyLmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2xvY2FsdGltZXIuYwppbmRleCBjOWQ3YzU5Li5jYWY2YjhiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2xvY2FsdGltZXIuYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2xvY2FsdGltZXIuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hcm1fdHdkLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X2ViLmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X2ViLmMKaW5kZXggN2RjMzI1MC4uZDRhNTg2ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19lYi5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfZWIuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC0zMCw3ICszMSw2IEBACiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYW1iYS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pY3N0MzA3Lmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC0xNjYsNyArMTY2LDYgQEAKIAogTUFDSElORV9TVEFSVChSRUFMVklFV19FQiwgIkFSTS1SZWFsVmlldyBFQiIpCiAJLyogTWFpbnRhaW5lcjogQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCAqLwotCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCiAJLnBoeXNfaW8JPSBSRUFMVklFV19VQVJUMF9CQVNFLAogCS5pb19wZ19vZmZzdAk9IChJT19BRERSRVNTKFJFQUxWSUVXX1VBUlQwX0JBU0UpID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1ycGMvZG1hLmMgYi9hcmNoL2FybS9tYWNoLXJwYy9kbWEuYwppbmRleCBiYzA3NDc0Li5iZDg2ZmZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJwYy9kbWEuYworKysgYi9hcmNoL2FybS9tYWNoLXJwYy9kbWEuYwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgpAQCAtMTQ4LDExICsxNDgsMTQgQEAKIAkJICogQ29wZSB3aXRoIElTQS1zdHlsZSBkcml2ZXJzIHdoaWNoIGV4cGVjdCBjYWNoZQogCQkgKiBjb2hlcmVuY2UuCiAJCSAqLwotCQlpZiAoIWRtYS0+dXNpbmdfc2cpIHsKLQkJCWRtYS0+YnVmLmRtYV9hZGRyZXNzID0gcGNpX21hcF9zaW5nbGUoTlVMTCwKLQkJCQlkbWEtPmJ1Zi5fX2FkZHJlc3MsIGRtYS0+YnVmLmxlbmd0aCwKKwkJaWYgKCFkbWEtPnNnKSB7CisJCQlkbWEtPnNnID0gJmRtYS0+YnVmOworCQkJZG1hLT5zZ2NvdW50ID0gMTsKKwkJCWRtYS0+YnVmLmxlbmd0aCA9IGRtYS0+Y291bnQ7CisJCQlkbWEtPmJ1Zi5kbWFfYWRkcmVzcyA9IGRtYV9tYXBfc2luZ2xlKE5VTEwsCisJCQkJZG1hLT5hZGRyLCBkbWEtPmNvdW50LAogCQkJCWRtYS0+ZG1hX21vZGUgPT0gRE1BX01PREVfUkVBRCA/Ci0JCQkJUENJX0RNQV9GUk9NREVWSUNFIDogUENJX0RNQV9UT0RFVklDRSk7CisJCQkJRE1BX0ZST01fREVWSUNFIDogRE1BX1RPX0RFVklDRSk7CiAJCX0KIAogCQlpb21kX3dyaXRlYihETUFfQ1JfQywgZG1hX2Jhc2UgKyBDUik7CkBAIC0yMzksNyArMjQyLDcgQEAKIAl1bnNpZ25lZCBpbnQgZmlxaGFuZGxlcl9sZW5ndGg7CiAJc3RydWN0IHB0X3JlZ3MgcmVnczsKIAotCWlmIChkbWEtPnVzaW5nX3NnKQorCWlmIChkbWEtPnNnKQogCQlCVUcoKTsKIAogCWlmIChkbWEtPmRtYV9tb2RlID09IERNQV9NT0RFX1JFQUQpIHsKQEAgLTI1Miw4ICsyNTUsOCBAQAogCQlmaXFoYW5kbGVyX2xlbmd0aCA9ICZmbG9wcHlfZmlxb3V0X2VuZCAtICZmbG9wcHlfZmlxb3V0X3N0YXJ0OwogCX0KIAotCXJlZ3MuQVJNX3I5ICA9IGRtYS0+YnVmLmxlbmd0aDsKLQlyZWdzLkFSTV9yMTAgPSAodW5zaWduZWQgbG9uZylkbWEtPmJ1Zi5fX2FkZHJlc3M7CisJcmVncy5BUk1fcjkgID0gZG1hLT5jb3VudDsKKwlyZWdzLkFSTV9yMTAgPSAodW5zaWduZWQgbG9uZylkbWEtPmFkZHI7CiAJcmVncy5BUk1fZnAgID0gKHVuc2lnbmVkIGxvbmcpRkxPUFBZRE1BX0JBU0U7CiAKIAlpZiAoY2xhaW1fZmlxKCZmaCkpIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcnBjL3Jpc2NwYy5jIGIvYXJjaC9hcm0vbWFjaC1ycGMvcmlzY3BjLmMKaW5kZXggNWM0YWMxYy4uMjA4YTJiNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1ycGMvcmlzY3BjLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1ycGMvcmlzY3BjLmMKQEAgLTE3Nyw3ICsxNzcsNiBAQAogCiBNQUNISU5FX1NUQVJUKFJJU0NQQywgIkFjb3JuLVJpc2NQQyIpCiAJLyogTWFpbnRhaW5lcjogUnVzc2VsbCBLaW5nICovCi0JLnBoeXNfcmFtCT0gMHgxMDAwMDAwMCwKIAkucGh5c19pbwk9IDB4MDMwMDAwMDAsCiAJLmlvX3BnX29mZnN0CT0gKCgweGUwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Nsb2NrLmMKaW5kZXggODJlODI1My4uYWYyZjNkNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Nsb2NrLmMKQEAgLTM0LDE2ICszNCwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgotCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KICNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWNsb2NrLmg+CiAKICNpbmNsdWRlICJjbG9jay5oIgpAQCAtNTIsNyArNTIsNyBAQAogLyogY2xvY2sgaW5mb3JtYXRpb24gKi8KIAogc3RhdGljIExJU1RfSEVBRChjbG9ja3MpOwotc3RhdGljIERFQ0xBUkVfTVVURVgoY2xvY2tzX3NlbSk7CitzdGF0aWMgREVGSU5FX01VVEVYKGNsb2Nrc19tdXRleCk7CiAKIC8qIG9sZCBmdW5jdGlvbnMgKi8KIApAQCAtMTAzLDcgKzEwMyw3IEBACiAJZWxzZQogCQlpZG5vID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldiktPmlkOwogCi0JZG93bigmY2xvY2tzX3NlbSk7CisJbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmNsb2NrcywgbGlzdCkgewogCQlpZiAocC0+aWQgPT0gaWRubyAmJgpAQCAtMTI3LDcgKzEyNyw3IEBACiAJCX0KIAl9CiAKLQl1cCgmY2xvY2tzX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwogCXJldHVybiBjbGs7CiB9CiAKQEAgLTE1MSwxOCArMTUxLDYgQEAKIH0KIAogCi1pbnQgY2xrX3VzZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JYXRvbWljX2luYygmY2xrLT51c2VkKTsKLQlyZXR1cm4gMDsKLX0KLQotCi12b2lkIGNsa191bnVzZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JYXRvbWljX2RlYygmY2xrLT51c2VkKTsKLX0KLQogdW5zaWduZWQgbG9uZyBjbGtfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQogewogCWlmIChJU19FUlIoY2xrKSkKQEAgLTE5Niw4ICsxODQsNiBAQAogRVhQT1JUX1NZTUJPTChjbGtfcHV0KTsKIEVYUE9SVF9TWU1CT0woY2xrX2VuYWJsZSk7CiBFWFBPUlRfU1lNQk9MKGNsa19kaXNhYmxlKTsKLUVYUE9SVF9TWU1CT0woY2xrX3VzZSk7Ci1FWFBPUlRfU1lNQk9MKGNsa191bnVzZSk7CiBFWFBPUlRfU1lNQk9MKGNsa19nZXRfcmF0ZSk7CiBFWFBPUlRfU1lNQk9MKGNsa19yb3VuZF9yYXRlKTsKIEVYUE9SVF9TWU1CT0woY2xrX3NldF9yYXRlKTsKQEAgLTI2OCwxMDAgKzI1NCwxMDEgQEAKIC8qIGNsb2NrIGRlZmluaXRpb25zICovCiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGluaXRfY2xvY2tzW10gPSB7Ci0JeyAubmFtZSAgICA9ICJuYW5kIiwKLQkgIC5pZAkgICA9IC0xLAotCSAgLnBhcmVudCAgPSAmY2xrX2gsCi0JICAuZW5hYmxlICA9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKLQkgIC5jdHJsYml0ID0gUzNDMjQxMF9DTEtDT05fTkFORAotCX0sCi0JeyAubmFtZSAgICA9ICJsY2QiLAotCSAgLmlkCSAgID0gLTEsCi0JICAucGFyZW50ICA9ICZjbGtfaCwKLQkgIC5lbmFibGUgID0gczNjMjR4eF9jbGtjb25fZW5hYmxlLAotCSAgLmN0cmxiaXQgPSBTM0MyNDEwX0NMS0NPTl9MQ0RDCi0JfSwKLQl7IC5uYW1lICAgID0gInVzYi1ob3N0IiwKLQkgIC5pZAkgICA9IC0xLAotCSAgLnBhcmVudCAgPSAmY2xrX2gsCi0JICAuZW5hYmxlICA9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKLQkgIC5jdHJsYml0ID0gUzNDMjQxMF9DTEtDT05fVVNCSAotCX0sCi0JeyAubmFtZSAgICA9ICJ1c2ItZGV2aWNlIiwKLQkgIC5pZAkgICA9IC0xLAotCSAgLnBhcmVudCAgPSAmY2xrX2gsCi0JICAuZW5hYmxlICA9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKLQkgIC5jdHJsYml0ID0gUzNDMjQxMF9DTEtDT05fVVNCRAotCX0sCi0JeyAubmFtZSAgICA9ICJ0aW1lcnMiLAotCSAgLmlkCSAgID0gLTEsCi0JICAucGFyZW50ICA9ICZjbGtfcCwKLQkgIC5lbmFibGUgID0gczNjMjR4eF9jbGtjb25fZW5hYmxlLAotCSAgLmN0cmxiaXQgPSBTM0MyNDEwX0NMS0NPTl9QV01UCi0JfSwKLQl7IC5uYW1lICAgID0gInNkaSIsCi0JICAuaWQJICAgPSAtMSwKLQkgIC5wYXJlbnQgID0gJmNsa19wLAotCSAgLmVuYWJsZSAgPSBzM2MyNHh4X2Nsa2Nvbl9lbmFibGUsCi0JICAuY3RybGJpdCA9IFMzQzI0MTBfQ0xLQ09OX1NESQotCX0sCi0JeyAubmFtZSAgICA9ICJ1YXJ0IiwKLQkgIC5pZAkgICA9IDAsCi0JICAucGFyZW50ICA9ICZjbGtfcCwKLQkgIC5lbmFibGUgID0gczNjMjR4eF9jbGtjb25fZW5hYmxlLAotCSAgLmN0cmxiaXQgPSBTM0MyNDEwX0NMS0NPTl9VQVJUMAotCX0sCi0JeyAubmFtZSAgICA9ICJ1YXJ0IiwKLQkgIC5pZAkgICA9IDEsCi0JICAucGFyZW50ICA9ICZjbGtfcCwKLQkgIC5lbmFibGUgID0gczNjMjR4eF9jbGtjb25fZW5hYmxlLAotCSAgLmN0cmxiaXQgPSBTM0MyNDEwX0NMS0NPTl9VQVJUMQotCX0sCi0JeyAubmFtZSAgICA9ICJ1YXJ0IiwKLQkgIC5pZAkgICA9IDIsCi0JICAucGFyZW50ICA9ICZjbGtfcCwKLQkgIC5lbmFibGUgID0gczNjMjR4eF9jbGtjb25fZW5hYmxlLAotCSAgLmN0cmxiaXQgPSBTM0MyNDEwX0NMS0NPTl9VQVJUMgotCX0sCi0JeyAubmFtZSAgICA9ICJncGlvIiwKLQkgIC5pZAkgICA9IC0xLAotCSAgLnBhcmVudCAgPSAmY2xrX3AsCi0JICAuZW5hYmxlICA9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKLQkgIC5jdHJsYml0ID0gUzNDMjQxMF9DTEtDT05fR1BJTwotCX0sCi0JeyAubmFtZSAgICA9ICJydGMiLAotCSAgLmlkCSAgID0gLTEsCi0JICAucGFyZW50ICA9ICZjbGtfcCwKLQkgIC5lbmFibGUgID0gczNjMjR4eF9jbGtjb25fZW5hYmxlLAotCSAgLmN0cmxiaXQgPSBTM0MyNDEwX0NMS0NPTl9SVEMKLQl9LAotCXsgLm5hbWUgICAgPSAiYWRjIiwKLQkgIC5pZAkgICA9IC0xLAotCSAgLnBhcmVudCAgPSAmY2xrX3AsCi0JICAuZW5hYmxlICA9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKLQkgIC5jdHJsYml0ID0gUzNDMjQxMF9DTEtDT05fQURDCi0JfSwKLQl7IC5uYW1lICAgID0gImkyYyIsCi0JICAuaWQJICAgPSAtMSwKLQkgIC5wYXJlbnQgID0gJmNsa19wLAotCSAgLmVuYWJsZSAgPSBzM2MyNHh4X2Nsa2Nvbl9lbmFibGUsCi0JICAuY3RybGJpdCA9IFMzQzI0MTBfQ0xLQ09OX0lJQwotCX0sCi0JeyAubmFtZSAgICA9ICJpaXMiLAotCSAgLmlkCSAgID0gLTEsCi0JICAucGFyZW50ICA9ICZjbGtfcCwKLQkgIC5lbmFibGUgID0gczNjMjR4eF9jbGtjb25fZW5hYmxlLAotCSAgLmN0cmxiaXQgPSBTM0MyNDEwX0NMS0NPTl9JSVMKLQl9LAotCXsgLm5hbWUgICAgPSAic3BpIiwKLQkgIC5pZAkgICA9IC0xLAotCSAgLnBhcmVudCAgPSAmY2xrX3AsCi0JICAuZW5hYmxlICA9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKLQkgIC5jdHJsYml0ID0gUzNDMjQxMF9DTEtDT05fU1BJCi0JfSwKLQl7IC5uYW1lICAgID0gIndhdGNoZG9nIiwKLQkgIC5pZAkgICA9IC0xLAotCSAgLnBhcmVudCAgPSAmY2xrX3AsCi0JICAuY3RybGJpdCA9IDAKKwl7CisJCS5uYW1lCQk9ICJuYW5kIiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfaCwKKwkJLmVuYWJsZQkJPSBzM2MyNHh4X2Nsa2Nvbl9lbmFibGUsCisJCS5jdHJsYml0CT0gUzNDMjQxMF9DTEtDT05fTkFORCwKKwl9LCB7CisJCS5uYW1lCQk9ICJsY2QiLAorCQkuaWQJCT0gLTEsCisJCS5wYXJlbnQJCT0gJmNsa19oLAorCQkuZW5hYmxlCQk9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKKwkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9MQ0RDLAorCX0sIHsKKwkJLm5hbWUJCT0gInVzYi1ob3N0IiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfaCwKKwkJLmVuYWJsZQkJPSBzM2MyNHh4X2Nsa2Nvbl9lbmFibGUsCisJCS5jdHJsYml0CT0gUzNDMjQxMF9DTEtDT05fVVNCSCwKKwl9LCB7CisJCS5uYW1lCQk9ICJ1c2ItZGV2aWNlIiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfaCwKKwkJLmVuYWJsZQkJPSBzM2MyNHh4X2Nsa2Nvbl9lbmFibGUsCisJCS5jdHJsYml0CT0gUzNDMjQxMF9DTEtDT05fVVNCRCwKKwl9LCB7CisJCS5uYW1lCQk9ICJ0aW1lcnMiLAorCQkuaWQJCT0gLTEsCisJCS5wYXJlbnQJCT0gJmNsa19wLAorCQkuZW5hYmxlCQk9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKKwkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9QV01ULAorCX0sIHsKKwkJLm5hbWUJCT0gInNkaSIsCisJCS5pZAkJPSAtMSwKKwkJLnBhcmVudAkJPSAmY2xrX3AsCisJCS5lbmFibGUJCT0gczNjMjR4eF9jbGtjb25fZW5hYmxlLAorCQkuY3RybGJpdAk9IFMzQzI0MTBfQ0xLQ09OX1NESSwKKwl9LCB7CisJCS5uYW1lCQk9ICJ1YXJ0IiwKKwkJLmlkCQk9IDAsCisJCS5wYXJlbnQJCT0gJmNsa19wLAorCQkuZW5hYmxlCQk9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKKwkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9VQVJUMCwKKwl9LCB7CisJCS5uYW1lCQk9ICJ1YXJ0IiwKKwkJLmlkCQk9IDEsCisJCS5wYXJlbnQJCT0gJmNsa19wLAorCQkuZW5hYmxlCQk9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKKwkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9VQVJUMSwKKwl9LCB7CisJCS5uYW1lCQk9ICJ1YXJ0IiwKKwkJLmlkCQk9IDIsCisJCS5wYXJlbnQJCT0gJmNsa19wLAorCQkuZW5hYmxlCQk9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKKwkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9VQVJUMiwKKwl9LCB7CisJCS5uYW1lCQk9ICJncGlvIiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfcCwKKwkJLmVuYWJsZQkJPSBzM2MyNHh4X2Nsa2Nvbl9lbmFibGUsCisJCS5jdHJsYml0CT0gUzNDMjQxMF9DTEtDT05fR1BJTywKKwl9LCB7CisJCS5uYW1lCQk9ICJydGMiLAorCQkuaWQJCT0gLTEsCisJCS5wYXJlbnQJCT0gJmNsa19wLAorCQkuZW5hYmxlCQk9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKKwkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9SVEMsCisJfSwgeworCQkubmFtZQkJPSAiYWRjIiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfcCwKKwkJLmVuYWJsZQkJPSBzM2MyNHh4X2Nsa2Nvbl9lbmFibGUsCisJCS5jdHJsYml0CT0gUzNDMjQxMF9DTEtDT05fQURDLAorCX0sIHsKKwkJLm5hbWUJCT0gImkyYyIsCisJCS5pZAkJPSAtMSwKKwkJLnBhcmVudAkJPSAmY2xrX3AsCisJCS5lbmFibGUJCT0gczNjMjR4eF9jbGtjb25fZW5hYmxlLAorCQkuY3RybGJpdAk9IFMzQzI0MTBfQ0xLQ09OX0lJQywKKwl9LCB7CisJCS5uYW1lCQk9ICJpaXMiLAorCQkuaWQJCT0gLTEsCisJCS5wYXJlbnQJCT0gJmNsa19wLAorCQkuZW5hYmxlCQk9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKKwkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9JSVMsCisJfSwgeworCQkubmFtZQkJPSAic3BpIiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfcCwKKwkJLmVuYWJsZQkJPSBzM2MyNHh4X2Nsa2Nvbl9lbmFibGUsCisJCS5jdHJsYml0CT0gUzNDMjQxMF9DTEtDT05fU1BJLAorCX0sIHsKKwkJLm5hbWUJCT0gIndhdGNoZG9nIiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfcCwKKwkJLmN0cmxiaXQJPSAwLAogCX0KIH07CiAKQEAgLTM3MCwxNiArMzU3LDE1IEBACiBpbnQgczNjMjR4eF9yZWdpc3Rlcl9jbG9jayhzdHJ1Y3QgY2xrICpjbGspCiB7CiAJY2xrLT5vd25lciA9IFRISVNfTU9EVUxFOwotCWF0b21pY19zZXQoJmNsay0+dXNlZCwgMCk7CiAKIAlpZiAoY2xrLT5lbmFibGUgPT0gTlVMTCkKIAkJY2xrLT5lbmFibGUgPSBjbGtfbnVsbF9lbmFibGU7CiAKIAkvKiBhZGQgdG8gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNsb2NrcyAqLwogCi0JZG93bigmY2xvY2tzX3NlbSk7CisJbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKIAlsaXN0X2FkZCgmY2xrLT5saXN0LCAmY2xvY2tzKTsKLQl1cCgmY2xvY2tzX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MDYsMTYgKzM5MiwxNSBAQAogCWNsa19wLnJhdGUgPSBwY2xrOwogCWNsa19mLnJhdGUgPSBmY2xrOwogCi0JLyogaXQgbG9va3MgbGlrZSBqdXN0IHNldHRpbmcgdGhlIHJlZ2lzdGVyIGhlcmUgaXMgbm90IGdvb2QKLQkgKiBlbm91Z2gsIGFuZCBjYXVzZXMgdGhlIG9kZCBoYW5nIGF0IGluaXRpYWwgYm9vdCB0aW1lLCBzbwotCSAqIGRvIGFsbCBvZiB0aGVtIGluZGl2ZHVhbGx5LgorCS8qIFdlIG11c3QgYmUgY2FyZWZ1bCBkaXNhYmxpbmcgdGhlIGNsb2NrcyB3ZSBhcmUgbm90IGludGVuZGluZyB0bworCSAqIGJlIHVzaW5nIGF0IGJvb3QgdGltZSwgYXMgc3Vic3l0ZW1zIHN1Y2ggYXMgdGhlIExDRCB3aGljaCBkbworCSAqIHRoZWlyIG93biBETUEgcmVxdWVzdHMgdG8gdGhlIGJ1cyBjYW4gY2F1c2UgdGhlIHN5c3RlbSB0byBsb2NrdXAKKwkgKiBpZiB0aGV5IHdoZXJlIGluIHRoZSBtaWRkbGUgb2YgcmVxdWVzdGluZyBidXMgYWNjZXNzLgogCSAqCi0JICogSSB0aGluayBkaXNhYmxpbmcgdGhlIExDRCBjbG9jayBpZiB0aGUgTENEIGlzIGFjdGl2ZSBpcwotCSAqIHZlcnkgZGFuZ2Vyb3VzLCBhbmQgdGhlcmVmb3JlIHRoZSBib290bG9hZGVyIHNob3VsZCBiZQotCSAqIGNhcmVmdWwgdG8gbm90IGVuYWJsZSB0aGUgTENEIGNsb2NrIGlmIGl0IGlzIG5vdCBuZWVkZWQuCi0JICoKLQkgKiBhbmQgb2YgY291cnNlLCB0aGlzIGxvb2tzIG5lYXRlcgotCSAqLworCSAqIERpc2FibGluZyB0aGUgTENEIGNsb2NrIGlmIHRoZSBMQ0QgaXMgYWN0aXZlIGlzIHZlcnkgZGFuZ2Vyb3VzLAorCSAqIGFuZCB0aGVyZWZvcmUgdGhlIGJvb3Rsb2FkZXIgc2hvdWxkIGJlICBjYXJlZnVsIHRvIG5vdCBlbmFibGUKKwkgKiB0aGUgTENEIGNsb2NrIGlmIGl0IGlzIG5vdCBuZWVkZWQuCisJKi8KIAogCXMzYzI0eHhfY2xrX2VuYWJsZShTM0MyNDEwX0NMS0NPTl9OQU5ELCAwKTsKIAlzM2MyNHh4X2Nsa19lbmFibGUoUzNDMjQxMF9DTEtDT05fVVNCSCwgMCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvY2xvY2suaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9jbG9jay5oCmluZGV4IDc5NTNiNmYuLjE3N2Q1YzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9jbG9jay5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9jbG9jay5oCkBAIC0xNiw3ICsxNiw2IEBACiAJc3RydWN0IGNsayAgICAgICAgICAgKnBhcmVudDsKIAljb25zdCBjaGFyICAgICAgICAgICAqbmFtZTsKIAlpbnQJCSAgICAgIGlkOwotCWF0b21pY190ICAgICAgICAgICAgICB1c2VkOwogCXVuc2lnbmVkIGxvbmcgICAgICAgICByYXRlOwogCXVuc2lnbmVkIGxvbmcgICAgICAgICBjdHJsYml0OwogCWludAkJICAgICgqZW5hYmxlKShzdHJ1Y3QgY2xrICosIGludCBlbmFibGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYW51YmlzLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1hbnViaXMuYwppbmRleCAwZjgxZmMwLi4zZTMyN2I4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1hbnViaXMuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1hbnViaXMuYwpAQCAtMjk0LDcgKzI5NCw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoQU5VQklTLCAiU2ltdGVjLUFudWJpcyIpCiAJLyogTWFpbnRhaW5lcjogQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiAqLwotCS5waHlzX3JhbQk9IFMzQzI0MTBfU0RSQU1fUEEsCiAJLnBoeXNfaW8JPSBTM0MyNDEwX1BBX1VBUlQsCiAJLmlvX3BnX29mZnN0CT0gKCgodTMyKVMzQzI0WFhfVkFfVUFSVCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWJhc3QuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWJhc3QuYwppbmRleCA0ZDk2MjcxLi45OTViYjhhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1iYXN0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYmFzdC5jCkBAIC01MjcsNyArNTI3LDYgQEAKIAogTUFDSElORV9TVEFSVChCQVNULCAiU2ltdGVjLUJBU1QiKQogCS8qIE1haW50YWluZXI6IEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4gKi8KLQkucGh5c19yYW0JPSBTM0MyNDEwX1NEUkFNX1BBLAogCS5waHlzX2lvCT0gUzNDMjQxMF9QQV9VQVJULAogCS5pb19wZ19vZmZzdAk9ICgoKHUzMilTM0MyNFhYX1ZBX1VBUlQpID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1oMTk0MC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtaDE5NDAuYwppbmRleCAwYWE4NzYwLi4xYzMxNmYxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1oMTk0MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWgxOTQwLmMKQEAgLTE3MSw3ICsxNzEsNiBAQAogCiBNQUNISU5FX1NUQVJUKEgxOTQwLCAiSVBBUS1IMTk0MCIpCiAJLyogTWFpbnRhaW5lcjogQmVuIERvb2tzIDxiZW5AZmx1ZmYub3JnPiAqLwotCS5waHlzX3JhbQk9IFMzQzI0MTBfU0RSQU1fUEEsCiAJLnBoeXNfaW8JPSBTM0MyNDEwX1BBX1VBUlQsCiAJLmlvX3BnX29mZnN0CT0gKCgodTMyKVMzQzI0WFhfVkFfVUFSVCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW4zMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbjMwLmMKaW5kZXggMzc4ZDY0MC4uMTE2YWMzMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbjMwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbjMwLmMKQEAgLTEyOCw3ICsxMjgsNiBAQAogCS8qIE1haW50YWluZXI6IENocmlzdGVyIFdlaW5pZ2VsIDxjaHJpc3RlckB3ZWluaWdlbC5zZT4sCiAJCQkJQmVuIERvb2tzIDxiZW4tbGludXhAZmx1ZmYub3JnPgogCSovCi0JLnBoeXNfcmFtCT0gUzNDMjQxMF9TRFJBTV9QQSwKIAkucGh5c19pbwk9IFMzQzI0MTBfUEFfVUFSVCwKIAkuaW9fcGdfb2Zmc3QJPSAoKCh1MzIpUzNDMjRYWF9WQV9VQVJUKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbmV4Y29kZXIuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW5leGNvZGVyLmMKaW5kZXggNDJiMGVlZi4uMDdkMDk1MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbmV4Y29kZXIuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1uZXhjb2Rlci5jCkBAIC0xNDgsNyArMTQ4LDYgQEAKIAogTUFDSElORV9TVEFSVChORVhDT0RFUl8yNDQwLCAiTmV4VmlzaW9uIC0gTmV4Y29kZXIgMjQ0MCIpCiAJLyogTWFpbnRhaW5lcjogR3VpbGxhdW1lIEdPVVJBVCA8Z3VpbGxhdW1lLmdvdXJhdEBuZXh2aXNpb24udHY+ICovCi0JLnBoeXNfcmFtCT0gUzNDMjQxMF9TRFJBTV9QQSwKIAkucGh5c19pbwk9IFMzQzI0MTBfUEFfVUFSVCwKIAkuaW9fcGdfb2Zmc3QJPSAoKCh1MzIpUzNDMjRYWF9WQV9VQVJUKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtb3RvbS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtb3RvbS5jCmluZGV4IGEyZWI5ZWQuLmIzOWRhZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW90b20uYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1vdG9tLmMKQEAgLTExNiw3ICsxMTYsNiBAQAogCiBNQUNISU5FX1NUQVJUKE9UT00sICJOZXggVmlzaW9uIC0gT3RvbSAxLjEiKQogCS8qIE1haW50YWluZXI6IEd1aWxsYXVtZSBHT1VSQVQgPGd1aWxsYXVtZS5nb3VyYXRAbmV4dmlzaW9uLnR2PiAqLwotCS5waHlzX3JhbQk9IFMzQzI0MTBfU0RSQU1fUEEsCiAJLnBoeXNfaW8JPSBTM0MyNDEwX1BBX1VBUlQsCiAJLmlvX3BnX29mZnN0CT0gKCgodTMyKVMzQzI0WFhfVkFfVUFSVCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXJ4MzcxNS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtcngzNzE1LmMKaW5kZXggZjhkODZkMS4uMDI2MGVkNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtcngzNzE1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtcngzNzE1LmMKQEAgLTIwNSw3ICsyMDUsNiBAQAogCiBNQUNISU5FX1NUQVJUKFJYMzcxNSwgIklQQVEtUlgzNzE1IikKIAkvKiBNYWludGFpbmVyOiBCZW4gRG9va3MgPGJlbkBmbHVmZi5vcmc+ICovCi0JLnBoeXNfcmFtCT0gUzNDMjQxMF9TRFJBTV9QQSwKIAkucGh5c19pbwk9IFMzQzI0MTBfUEFfVUFSVCwKIAkuaW9fcGdfb2Zmc3QJPSAoKCh1MzIpUzNDMjRYWF9WQV9VQVJUKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtc21kazI0MTAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDEwLmMKaW5kZXggMmM5MTk2NS4uMWU3NmUxZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtc21kazI0MTAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1zbWRrMjQxMC5jCkBAIC0xMTUsNyArMTE1LDYgQEAKIE1BQ0hJTkVfU1RBUlQoU01ESzI0MTAsICJTTURLMjQxMCIpIC8qIEBUT0RPOiByZXF1ZXN0IGEgbmV3IGlkZW50aWZpZXIgYW5kIHN3aXRjaAogCQkJCSAgICAqIHRvIFNNREsyNDEwICovCiAJLyogTWFpbnRhaW5lcjogSm9uYXMgRGlldHNjaGUgKi8KLQkucGh5c19yYW0JPSBTM0MyNDEwX1NEUkFNX1BBLAogCS5waHlzX2lvCT0gUzNDMjQxMF9QQV9VQVJULAogCS5pb19wZ19vZmZzdAk9ICgoKHUzMilTM0MyNFhYX1ZBX1VBUlQpID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1zbWRrMjQ0MC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtc21kazI0NDAuYwppbmRleCA0ZTMxMTE4Li5mNDMxNTcyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1zbWRrMjQ0MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDQwLmMKQEAgLTIxNiw3ICsyMTYsNiBAQAogCiBNQUNISU5FX1NUQVJUKFMzQzI0NDAsICJTTURLMjQ0MCIpCiAJLyogTWFpbnRhaW5lcjogQmVuIERvb2tzIDxiZW5AZmx1ZmYub3JnPiAqLwotCS5waHlzX3JhbQk9IFMzQzI0MTBfU0RSQU1fUEEsCiAJLnBoeXNfaW8JPSBTM0MyNDEwX1BBX1VBUlQsCiAJLmlvX3BnX29mZnN0CT0gKCgodTMyKVMzQzI0WFhfVkFfVUFSVCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXZyMTAwMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdnIxMDAwLmMKaW5kZXggYWU3ZTA5OS4uNzg1ZmM5YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdnIxMDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdnIxMDAwLmMKQEAgLTM5NSw3ICszOTUsNiBAQAogCiBNQUNISU5FX1NUQVJUKFZSMTAwMCwgIlRob3Jjb20tVlIxMDAwIikKIAkvKiBNYWludGFpbmVyOiBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+ICovCi0JLnBoeXNfcmFtCT0gUzNDMjQxMF9TRFJBTV9QQSwKIAkucGh5c19pbwk9IFMzQzI0MTBfUEFfVUFSVCwKIAkuaW9fcGdfb2Zmc3QJPSAoKCh1MzIpUzNDMjRYWF9WQV9VQVJUKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NDAtY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDQwLWNsb2NrLmMKaW5kZXggYzY3ZTA5Ny4uYjU1N2EyYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NDAtY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQ0MC1jbG9jay5jCkBAIC0yOSwxNiArMjksMTUgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KLQogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtY2xvY2suaD4KIAogI2luY2x1ZGUgImNsb2NrLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQ0MC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NDAuYwppbmRleCA0ZDYzZTcxLi5iN2ZlNmQ5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQ0MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDQwLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CkBAIC0zNiw3ICszNyw2IEBACiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgogCiAjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3Mtc2VyaWFsLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3RpbWUuYwppbmRleCA4YTAwZTNjLi4xMGEyOTc2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC90aW1lLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KQEAgLTM1LDcgKzM2LDYgQEAKICNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLXRpbWVyLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CiAKICNpbmNsdWRlICJjbG9jay5oIgogI2luY2x1ZGUgImNwdS5oIgpAQCAtMTkxLDcgKzE5MSw2IEBACiAJCWlmIChJU19FUlIoY2xrKSkKIAkJCXBhbmljKCJmYWlsZWQgdG8gZ2V0IGNsb2NrIGZvciBzeXN0ZW0gdGltZXIiKTsKIAotCQljbGtfdXNlKGNsayk7CiAJCWNsa19lbmFibGUoY2xrKTsKIAogCQlwY2xrID0gY2xrX2dldF9yYXRlKGNsayk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvdXNiLXNpbXRlYy5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3VzYi1zaW10ZWMuYwppbmRleCA1MDk4YjUwLi40OTVmOGM2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvdXNiLXNpbXRlYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC91c2Itc2ltdGVjLmMKQEAgLTg0LDEzICs4NCwxMyBAQAogCWludCByZXQ7CiAKIAlpZiAob24pIHsKLQkJcmV0ID0gcmVxdWVzdF9pcnEoSVJRX1VTQk9DLCB1c2Jfc2ltdGVjX29jaXJxLCBTQV9JTlRFUlJVUFQsCisJCXJldCA9IHJlcXVlc3RfaXJxKElSUV9VU0JPQywgdXNiX3NpbXRlY19vY2lycSwKKwkJCQkgIFNBX0lOVEVSUlVQVCB8IFNBX1RSSUdHRVJfUklTSU5HIHwKKwkJCQkgICBTQV9UUklHR0VSX0ZBTExJTkcsCiAJCQkJICAiVVNCIE92ZXItY3VycmVudCIsIGluZm8pOwogCQlpZiAocmV0ICE9IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIHJlcXVlc3QgdXNiIG9jIGlycVxuIik7CiAJCX0KLQotCQlzZXRfaXJxX3R5cGUoSVJRX1VTQk9DLCBJUlFUX0JPVEhFREdFKTsKIAl9IGVsc2UgewogCQlmcmVlX2lycShJUlFfVVNCT0MsIGluZm8pOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2Fzc2FiZXQuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2Fzc2FiZXQuYwppbmRleCBhNjZhYzYxLi5hNTk5YmIwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9hc3NhYmV0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvYXNzYWJldC5jCkBAIC00NDcsNyArNDQ3LDYgQEAKIAogCiBNQUNISU5FX1NUQVJUKEFTU0FCRVQsICJJbnRlbC1Bc3NhYmV0IikKLQkucGh5c19yYW0JPSAweGMwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvYmFkZ2U0LmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9iYWRnZTQuYwppbmRleCBlZGNjZDVlLi5mNjBiN2E2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9iYWRnZTQuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9iYWRnZTQuYwpAQCAtMjk3LDcgKzI5Nyw2IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoQkFER0U0LCAiSGV3bGV0dC1QYWNrYXJkIExhYm9yYXRvcmllcyBCYWRnZVBBRCA0IikKLQkucGh5c19yYW0JPSAweGMwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvY2VyZi5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvY2VyZi5jCmluZGV4IDUwODU5MzcuLjgyNjlhOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NlcmYuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jZXJmLmMKQEAgLTEzNSw3ICsxMzUsNiBAQAogCiBNQUNISU5FX1NUQVJUKENFUkYsICJJbnRyaW5zeWMgQ2VyZkJvYXJkL0NlcmZDdWJlIikKIAkvKiBNYWludGFpbmVyOiBzdXBwb3J0QGludHJpbnN5Yy5jb20gKi8KLQkucGh5c19yYW0JPSAweGMwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkubWFwX2lvCQk9IGNlcmZfbWFwX2lvLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvY29sbGllLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jb2xsaWUuYwppbmRleCA1MjJhYmMwLi42ODg4ODE2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jb2xsaWUuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jb2xsaWUuYwpAQCAtMTkxLDcgKzE5MSw2IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoQ09MTElFLCAiU2hhcnAtQ29sbGllIikKLQkucGh5c19yYW0JPSAweGMwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkubWFwX2lvCQk9IGNvbGxpZV9tYXBfaW8sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9oMzYwMC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaDM2MDAuYwppbmRleCBlODM1MmI3Li5iMDRkOTIyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9oMzYwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2gzNjAwLmMKQEAgLTM5Miw3ICszOTIsNiBAQAogfQogCiBNQUNISU5FX1NUQVJUKEgzMTAwLCAiQ29tcGFxIGlQQVEgSDMxMDAiKQotCS5waHlzX3JhbQk9IDB4YzAwMDAwMDAsCiAJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAogCS5pb19wZ19vZmZzdAk9ICgoMHhmODAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCkBAIC01MTAsNyArNTA5LDYgQEAKIH0KIAogTUFDSElORV9TVEFSVChIMzYwMCwgIkNvbXBhcSBpUEFRIEgzNjAwIikKLQkucGh5c19yYW0JPSAweGMwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLApAQCAtODk3LDcgKzg5NSw2IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoSDM4MDAsICJDb21wYXEgaVBBUSBIMzgwMCIpCi0JLnBoeXNfcmFtCT0gMHhjMDAwMDAwMCwKIAkucGh5c19pbwk9IDB4ODAwMDAwMDAsCiAJLmlvX3BnX29mZnN0CT0gKCgweGY4MDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2hhY2traXQuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2hhY2traXQuYwppbmRleCBjOTIyZTA0Li4wNDZiMjEzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9oYWNra2l0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaGFja2tpdC5jCkBAIC0xOTUsNyArMTk1LDYgQEAKICAqLwogCiBNQUNISU5FX1NUQVJUKEhBQ0tLSVQsICJIYWNrS2l0IENwdSBCb2FyZCIpCi0JLnBoeXNfcmFtCT0gMHhjMDAwMDAwMCwKIAkucGh5c19pbwk9IDB4ODAwMDAwMDAsCiAJLmlvX3BnX29mZnN0CT0gKCgweGY4MDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2pvcm5hZGE3MjAuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2pvcm5hZGE3MjAuYwppbmRleCAyZjY3MWNjLi4xN2Y1YTQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9qb3JuYWRhNzIwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvam9ybmFkYTcyMC5jCkBAIC0xNzMsNyArMTczLDYgQEAKIAogTUFDSElORV9TVEFSVChKT1JOQURBNzIwLCAiSFAgSm9ybmFkYSA3MjAiKQogCS8qIE1haW50YWluZXI6IE1pY2hhZWwgR2Vybm90aCA8bWljaGFlbEBnZXJub3RoLm5ldD4gKi8KLQkucGh5c19yYW0JPSAweGMwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvbGFydC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvbGFydC5jCmluZGV4IDhjOWUzZGQuLjA3ZDNhNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2xhcnQuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9sYXJ0LmMKQEAgLTYwLDcgKzYwLDYgQEAKIH0KIAogTUFDSElORV9TVEFSVChMQVJULCAiTEFSVCIpCi0JLnBoeXNfcmFtCT0gMHhjMDAwMDAwMCwKIAkucGh5c19pbwk9IDB4ODAwMDAwMDAsCiAJLmlvX3BnX29mZnN0CT0gKCgweGY4MDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3BsZWIuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3BsZWIuYwppbmRleCA1OGMxOGY5Li4wNzA5ZWJhYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvcGxlYi5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3BsZWIuYwpAQCAtMTQ2LDcgKzE0Niw2IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoUExFQiwgIlBMRUIiKQotCS5waHlzX3JhbQk9IDB4YzAwMDAwMDAsCiAJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAogCS5pb19wZ19vZmZzdAk9ICgoMHhmODAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5tYXBfaW8JCT0gcGxlYl9tYXBfaW8sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9wbS5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvcG0uYwppbmRleCA1OWM3OTY0Li43ODZjODUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9wbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3BtLmMKQEAgLTEzNSwyOSArMTM1LDExIEBACiB9CiAKIC8qCi0gKiBDYWxsZWQgYWZ0ZXIgcHJvY2Vzc2VzIGFyZSBmcm96ZW4sIGJ1dCBiZWZvcmUgd2Ugc2h1dCBkb3duIGRldmljZXMuCi0gKi8KLXN0YXRpYyBpbnQgc2ExMXgwX3BtX3ByZXBhcmUoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQotewotCXJldHVybiAwOwotfQotCi0vKgotICogQ2FsbGVkIGFmdGVyIGRldmljZXMgYXJlIHJlLXNldHVwLCBidXQgYmVmb3JlIHByb2Nlc3NlcyBhcmUgdGhhd2VkLgotICovCi1zdGF0aWMgaW50IHNhMTF4MF9wbV9maW5pc2goc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQotewotCXJldHVybiAwOwotfQotCi0vKgogICogU2V0IHRvIFBNX0RJU0tfRklSTVdBUkUgc28gd2UgY2FuIHF1aWNrbHkgdmV0byBzdXNwZW5kLXRvLWRpc2suCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgcG1fb3BzIHNhMTF4MF9wbV9vcHMgPSB7CiAJLnBtX2Rpc2tfbW9kZQk9IFBNX0RJU0tfRklSTVdBUkUsCi0JLnByZXBhcmUJPSBzYTExeDBfcG1fcHJlcGFyZSwKIAkuZW50ZXIJCT0gc2ExMXgwX3BtX2VudGVyLAotCS5maW5pc2gJCT0gc2ExMXgwX3BtX2ZpbmlzaCwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNhMTF4MF9wbV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaGFubm9uLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaGFubm9uLmMKaW5kZXggNzQ4MjI4OC4uNWFhZmUwYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NoYW5ub24uYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaGFubm9uLmMKQEAgLTgzLDcgKzgzLDYgQEAKIH0KIAogTUFDSElORV9TVEFSVChTSEFOTk9OLCAiU2hhbm5vbiAoQUtBOiBUdXhzY3JlZW4pIikKLQkucGh5c19yYW0JPSAweGMwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvc2ltcGFkLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaW1wYWQuYwppbmRleCA0MzlkZGM5Li5kMmMyM2IyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaW1wYWQuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaW1wYWQuYwpAQCAtMjI5LDcgKzIyOSw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoU0lNUEFELCAiU2ltcGFkIikKIAkvKiBNYWludGFpbmVyOiBIb2xnZXIgRnJleXRoZXIgKi8KLQkucGh5c19yYW0JPSAweGMwMDAwMDAwLAogCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLXNoYXJrL2NvcmUuYwppbmRleCAyZDQyOGI2Li44Nzc2MDBlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNoYXJrL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLXNoYXJrL2NvcmUuYwpAQCAtMTExLDcgKzExMSw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoU0hBUkssICJTaGFyayIpCiAJLyogTWFpbnRhaW5lcjogQWxleGFuZGVyIFNjaHVseiAqLwotCS5waHlzX3JhbQk9IDB4MDgwMDAwMDAsCiAJLnBoeXNfaW8JPSAweDQwMDAwMDAwLAogCS5pb19wZ19vZmZzdAk9ICgoMHhlMDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4MDgwMDMwMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvS2NvbmZpZwppbmRleCA4ZDc4N2Y0Li45NTA5NmFmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL0tjb25maWcKQEAgLTksNyArOSw2IEBACiAKIGNvbmZpZyBNQUNIX1ZFUlNBVElMRV9BQgogCWJvb2wgIlN1cHBvcnQgVmVyc2F0aWxlL0FCIHBsYXRmb3JtIgotCWRlZmF1bHQgbgogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIEFSTShSKSBWZXJzYXRpbGUvQVAgcGxhdGZvcm0uCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jbG9jay5jCmluZGV4IGI5NmEyZWEuLjk4NThjOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY2xvY2suYwpAQCAtMTQsMjggKzE0LDI5IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pY3N0MzA3Lmg+CiAKICNpbmNsdWRlICJjbG9jay5oIgogCiBzdGF0aWMgTElTVF9IRUFEKGNsb2Nrcyk7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWChjbG9ja3Nfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgoY2xvY2tzX211dGV4KTsKIAogc3RydWN0IGNsayAqY2xrX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmlkKQogewogCXN0cnVjdCBjbGsgKnAsICpjbGsgPSBFUlJfUFRSKC1FTk9FTlQpOwogCi0JZG93bigmY2xvY2tzX3NlbSk7CisJbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbG9ja3MsIG5vZGUpIHsKIAkJaWYgKHN0cmNtcChpZCwgcC0+bmFtZSkgPT0gMCAmJiB0cnlfbW9kdWxlX2dldChwLT5vd25lcikpIHsKIAkJCWNsayA9IHA7CiAJCQlicmVhazsKIAkJfQogCX0KLQl1cCgmY2xvY2tzX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwogCiAJcmV0dXJuIGNsazsKIH0KQEAgLTU4LDE3ICs1OSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGNsa19kaXNhYmxlKTsKIAotaW50IGNsa191c2Uoc3RydWN0IGNsayAqY2xrKQotewotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChjbGtfdXNlKTsKLQotdm9pZCBjbGtfdW51c2Uoc3RydWN0IGNsayAqY2xrKQotewotfQotRVhQT1JUX1NZTUJPTChjbGtfdW51c2UpOwotCiB1bnNpZ25lZCBsb25nIGNsa19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCiB7CiAJcmV0dXJuIGNsay0+cmF0ZTsKQEAgLTEyMSwxOCArMTExLDE4IEBACiAKIGludCBjbGtfcmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKQogewotCWRvd24oJmNsb2Nrc19zZW0pOworCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7CiAJbGlzdF9hZGQoJmNsay0+bm9kZSwgJmNsb2Nrcyk7Ci0JdXAoJmNsb2Nrc19zZW0pOworCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woY2xrX3JlZ2lzdGVyKTsKIAogdm9pZCBjbGtfdW5yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspCiB7Ci0JZG93bigmY2xvY2tzX3NlbSk7CisJbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKIAlsaXN0X2RlbCgmY2xrLT5ub2RlKTsKLQl1cCgmY2xvY2tzX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTChjbGtfdW5yZWdpc3Rlcik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYwppbmRleCBhMWNhNDY2Li45ZWJiZTgwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5jCkBAIC0yNSwxNiArMjUsMTcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvY2xjZC5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbGVkcy5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hbWJhLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2FtYmFfY2xjZC5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hcm1fdGltZXIuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvaWNzdDMwNy5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS92aWMuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgpAQCAtNTYsMjQgKzU3LDYgQEAKICNkZWZpbmUgVkFfVklDX0JBU0UJCV9faW9fYWRkcmVzcyhWRVJTQVRJTEVfVklDX0JBU0UpCiAjZGVmaW5lIFZBX1NJQ19CQVNFCQlfX2lvX2FkZHJlc3MoVkVSU0FUSUxFX1NJQ19CQVNFKQogCi1zdGF0aWMgdm9pZCB2aWNfbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlpcnEgLT0gSVJRX1ZJQ19TVEFSVDsKLQl3cml0ZWwoMSA8PCBpcnEsIFZBX1ZJQ19CQVNFICsgVklDX0lSUV9FTkFCTEVfQ0xFQVIpOwotfQotCi1zdGF0aWMgdm9pZCB2aWNfdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWlycSAtPSBJUlFfVklDX1NUQVJUOwotCXdyaXRlbCgxIDw8IGlycSwgVkFfVklDX0JBU0UgKyBWSUNfSVJRX0VOQUJMRSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCB2aWNfY2hpcCA9IHsKLQkuYWNrCT0gdmljX21hc2tfaXJxLAotCS5tYXNrCT0gdmljX21hc2tfaXJxLAotCS51bm1hc2sJPSB2aWNfdW5tYXNrX2lycSwKLX07Ci0KIHN0YXRpYyB2b2lkIHNpY19tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCWlycSAtPSBJUlFfU0lDX1NUQVJUOwpAQCAtMTI3LDQzICsxMTAsMTIgQEAKIAogdm9pZCBfX2luaXQgdmVyc2F0aWxlX2luaXRfaXJxKHZvaWQpCiB7Ci0JdW5zaWduZWQgaW50IGksIHZhbHVlOworCXVuc2lnbmVkIGludCBpOwogCi0JLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyBpbml0aWFsbHkuICovCi0KLQl3cml0ZWwoMCwgVkFfVklDX0JBU0UgKyBWSUNfSU5UX1NFTEVDVCk7Ci0Jd3JpdGVsKDAsIFZBX1ZJQ19CQVNFICsgVklDX0lSUV9FTkFCTEUpOwotCXdyaXRlbCh+MCwgVkFfVklDX0JBU0UgKyBWSUNfSVJRX0VOQUJMRV9DTEVBUik7Ci0Jd3JpdGVsKDAsIFZBX1ZJQ19CQVNFICsgVklDX0lSUV9TVEFUVVMpOwotCXdyaXRlbCgwLCBWQV9WSUNfQkFTRSArIFZJQ19JVENSKTsKLQl3cml0ZWwofjAsIFZBX1ZJQ19CQVNFICsgVklDX0lSUV9TT0ZUX0NMRUFSKTsKLQotCS8qCi0JICogTWFrZSBzdXJlIHdlIGNsZWFyIGFsbCBleGlzdGluZyBpbnRlcnJ1cHRzCi0JICovCi0Jd3JpdGVsKDAsIFZBX1ZJQ19CQVNFICsgVklDX1ZFQ1RfQUREUik7Ci0JZm9yIChpID0gMDsgaSA8IDE5OyBpKyspIHsKLQkJdmFsdWUgPSByZWFkbChWQV9WSUNfQkFTRSArIFZJQ19WRUNUX0FERFIpOwotCQl3cml0ZWwodmFsdWUsIFZBX1ZJQ19CQVNFICsgVklDX1ZFQ1RfQUREUik7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJdmFsdWUgPSByZWFkbChWQV9WSUNfQkFTRSArIFZJQ19WRUNUX0NOVEwwICsgKGkgKiA0KSk7Ci0JCXdyaXRlbCh2YWx1ZSB8IFZJQ1ZlY3RDbnRsX0VuYWJsZSB8IGksIFZBX1ZJQ19CQVNFICsgVklDX1ZFQ1RfQ05UTDAgKyAoaSAqIDQpKTsKLQl9Ci0KLQl3cml0ZWwoMzIsIFZBX1ZJQ19CQVNFICsgVklDX0RFRl9WRUNUX0FERFIpOwotCi0JZm9yIChpID0gSVJRX1ZJQ19TVEFSVDsgaSA8PSBJUlFfVklDX0VORDsgaSsrKSB7Ci0JCWlmIChpICE9IElSUV9WSUNTT1VSQ0UzMSkgewotCQkJc2V0X2lycV9jaGlwKGksICZ2aWNfY2hpcCk7Ci0JCQlzZXRfaXJxX2hhbmRsZXIoaSwgZG9fbGV2ZWxfSVJRKTsKLQkJCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOwotCQl9Ci0JfQorCXZpY19pbml0KFZBX1ZJQ19CQVNFLCB+KDEgPDwgMzEpKTsKIAogCXNldF9pcnFfaGFuZGxlcihJUlFfVklDU09VUkNFMzEsIHNpY19oYW5kbGVfaXJxKTsKLQl2aWNfdW5tYXNrX2lycShJUlFfVklDU09VUkNFMzEpOworCWVuYWJsZV9pcnEoSVJRX1ZJQ1NPVVJDRTMxKTsKIAogCS8qIERvIHNlY29uZCBpbnRlcnJ1cHQgY29udHJvbGxlciAqLwogCXdyaXRlbCh+MCwgVkFfU0lDX0JBU0UgKyBTSUNfSVJRX0VOQUJMRV9DTEVBUik7CkBAIC04NzcsNyArODI5LDcgQEAKIAl0aWNrczIgPSByZWFkbChUSU1FUjBfVkFfQkFTRSArIFRJTUVSX1ZBTFVFKSAmIDB4ZmZmZjsKIAlkbyB7CiAJCXRpY2tzMSA9IHRpY2tzMjsKLQkJc3RhdHVzID0gX19yYXdfcmVhZGwoVkFfSUNfQkFTRSArIFZJQ19JUlFfUkFXX1NUQVRVUyk7CisJCXN0YXR1cyA9IF9fcmF3X3JlYWRsKFZBX0lDX0JBU0UgKyBWSUNfUkFXX1NUQVRVUyk7CiAJCXRpY2tzMiA9IHJlYWRsKFRJTUVSMF9WQV9CQVNFICsgVElNRVJfVkFMVUUpICYgMHhmZmZmOwogCX0gd2hpbGUgKHRpY2tzMiA+IHRpY2tzMSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuaCBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuaAppbmRleCA1ODhjMjA2Li5hZmNhYTg1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5oCkBAIC0yMiw3ICsyMiw3IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfVkVSU0FUSUxFX0gKICNkZWZpbmUgX19BU01fQVJDSF9WRVJTQVRJTEVfSAogCi0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2FtYmEuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogCiBleHRlcm4gdm9pZCBfX2luaXQgdmVyc2F0aWxlX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgdmVyc2F0aWxlX2luaXRfaXJxKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX2FiLmMgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS92ZXJzYXRpbGVfYWIuYwppbmRleCA4YjBiM2JlLi4xZWI1OTY3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS92ZXJzYXRpbGVfYWIuYworKysgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS92ZXJzYXRpbGVfYWIuYwpAQCAtMjMsMTIgKzIzLDEyIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYW1iYS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogCkBAIC0zNiw3ICszNiw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoVkVSU0FUSUxFX0FCLCAiQVJNLVZlcnNhdGlsZSBBQiIpCiAJLyogTWFpbnRhaW5lcjogQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCAqLwotCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCiAJLnBoeXNfaW8JPSAweDEwMWYxMDAwLAogCS5pb19wZ19vZmZzdAk9ICgoMHhmMTFmMTAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS92ZXJzYXRpbGVfcGIuYyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9wYi5jCmluZGV4IDdjMzA3OGMuLmYxN2FiNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9wYi5jCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9wYi5jCkBAIC0yMywxMiArMjMsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KIAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hbWJhLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbW1jLmg+CkBAIC0xMDAsNyArMTAwLDYgQEAKIAogTUFDSElORV9TVEFSVChWRVJTQVRJTEVfUEIsICJBUk0tVmVyc2F0aWxlIFBCIikKIAkvKiBNYWludGFpbmVyOiBBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkICovCi0JLnBoeXNfcmFtCT0gMHgwMDAwMDAwMCwKIAkucGh5c19pbwk9IDB4MTAxZjEwMDAsCiAJLmlvX3BnX29mZnN0CT0gKCgweGYxMWYxMDAwKSA+PiAxOCkgJiAweGZmZmMsCiAJLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL0tjb25maWcgYi9hcmNoL2FybS9tbS9LY29uZmlnCmluZGV4IGU4NGZkZGUuLjNiNzlkMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbW0vS2NvbmZpZwpAQCAtNjIsOCArNjIsOCBAQAogIyBBUk05MjBUCiBjb25maWcgQ1BVX0FSTTkyMFQKIAlib29sICJTdXBwb3J0IEFSTTkyMFQgcHJvY2Vzc29yIiBpZiAhQVJDSF9TM0MyNDEwCi0JZGVwZW5kcyBvbiBBUkNIX0lOVEVHUkFUT1IgfHwgQVJDSF9TM0MyNDEwIHx8IEFSQ0hfSU1YIHx8IEFSQ0hfQUFFQzIwMDAKLQlkZWZhdWx0IHkgaWYgQVJDSF9TM0MyNDEwCisJZGVwZW5kcyBvbiBBUkNIX0lOVEVHUkFUT1IgfHwgQVJDSF9TM0MyNDEwIHx8IEFSQ0hfSU1YIHx8IEFSQ0hfQUFFQzIwMDAgfHwgQVJDSF9BVDkxUk05MjAwCisJZGVmYXVsdCB5IGlmIEFSQ0hfUzNDMjQxMCB8fCBBUkNIX0FUOTFSTTkyMDAKIAlzZWxlY3QgQ1BVXzMydjQKIAlzZWxlY3QgQ1BVX0FCUlRfRVY0VAogCXNlbGVjdCBDUFVfQ0FDSEVfVjRXVApAQCAtODMsOCArODMsOCBAQAogIyBBUk05MjJUCiBjb25maWcgQ1BVX0FSTTkyMlQKIAlib29sICJTdXBwb3J0IEFSTTkyMlQgcHJvY2Vzc29yIiBpZiBBUkNIX0lOVEVHUkFUT1IKLQlkZXBlbmRzIG9uIEFSQ0hfQ0FNRUxPVCB8fCBBUkNIX0xIN0E0MFggfHwgQVJDSF9JTlRFR1JBVE9SCi0JZGVmYXVsdCB5IGlmIEFSQ0hfQ0FNRUxPVCB8fCBBUkNIX0xIN0E0MFgKKwlkZXBlbmRzIG9uIEFSQ0hfTEg3QTQwWCB8fCBBUkNIX0lOVEVHUkFUT1IKKwlkZWZhdWx0IHkgaWYgQVJDSF9MSDdBNDBYCiAJc2VsZWN0IENQVV8zMnY0CiAJc2VsZWN0IENQVV9BQlJUX0VWNFQKIAlzZWxlY3QgQ1BVX0NBQ0hFX1Y0V1QKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NvbnNpc3RlbnQuYyBiL2FyY2gvYXJtL21tL2NvbnNpc3RlbnQuYwppbmRleCBkYmZlOWU4Li5jMmVlMThkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9jb25zaXN0ZW50LmMKKysrIGIvYXJjaC9hcm0vbW0vY29uc2lzdGVudC5jCkBAIC0xOSwxNyArMTksMjYgQEAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KIAotI2RlZmluZSBDT05TSVNURU5UX0JBU0UJKDB4ZmZjMDAwMDApCisvKiBTYW5pdHkgY2hlY2sgc2l6ZSAqLworI2lmIChDT05TSVNURU5UX0RNQV9TSVpFICUgU1pfMk0pCisjZXJyb3IgIkNPTlNJU1RFTlRfRE1BX1NJWkUgbXVzdCBiZSBtdWx0aXBsZSBvZiAyTWlCIgorI2VuZGlmCisKICNkZWZpbmUgQ09OU0lTVEVOVF9FTkQJKDB4ZmZlMDAwMDApCisjZGVmaW5lIENPTlNJU1RFTlRfQkFTRQkoQ09OU0lTVEVOVF9FTkQgLSBDT05TSVNURU5UX0RNQV9TSVpFKQorCiAjZGVmaW5lIENPTlNJU1RFTlRfT0ZGU0VUKHgpCSgoKHVuc2lnbmVkIGxvbmcpKHgpIC0gQ09OU0lTVEVOVF9CQVNFKSA+PiBQQUdFX1NISUZUKQorI2RlZmluZSBDT05TSVNURU5UX1BURV9JTkRFWCh4KSAoKCh1bnNpZ25lZCBsb25nKSh4KSAtIENPTlNJU1RFTlRfQkFTRSkgPj4gUEdESVJfU0hJRlQpCisjZGVmaW5lIE5VTV9DT05TSVNURU5UX1BURVMgKENPTlNJU1RFTlRfRE1BX1NJWkUgPj4gUEdESVJfU0hJRlQpCisKIAogLyoKLSAqIFRoaXMgaXMgdGhlIHBhZ2UgdGFibGUgKDJNQikgY292ZXJpbmcgdW5jYWNoZWQsIERNQSBjb25zaXN0ZW50IGFsbG9jYXRpb25zCisgKiBUaGVzZSBhcmUgdGhlIHBhZ2UgdGFibGVzICgyTUIgZWFjaCkgY292ZXJpbmcgdW5jYWNoZWQsIERNQSBjb25zaXN0ZW50IGFsbG9jYXRpb25zCiAgKi8KLXN0YXRpYyBwdGVfdCAqY29uc2lzdGVudF9wdGU7CitzdGF0aWMgcHRlX3QgKmNvbnNpc3RlbnRfcHRlW05VTV9DT05TSVNURU5UX1BURVNdOwogc3RhdGljIERFRklORV9TUElOTE9DSyhjb25zaXN0ZW50X2xvY2spOwogCiAvKgpAQCAtMTQzLDcgKzE1Miw3IEBACiAJdW5zaWduZWQgbG9uZyBvcmRlcjsKIAl1NjQgbWFzayA9IElTQV9ETUFfVEhSRVNIT0xELCBsaW1pdDsKIAotCWlmICghY29uc2lzdGVudF9wdGUpIHsKKwlpZiAoIWNvbnNpc3RlbnRfcHRlWzBdKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vdCBpbml0aWFsaXNlZFxuIiwgX19mdW5jX18pOwogCQlkdW1wX3N0YWNrKCk7CiAJCXJldHVybiBOVUxMOwpAQCAtMjA2LDkgKzIxNSwxMiBAQAogCWMgPSB2bV9yZWdpb25fYWxsb2MoJmNvbnNpc3RlbnRfaGVhZCwgc2l6ZSwKIAkJCSAgICBnZnAgJiB+KF9fR0ZQX0RNQSB8IF9fR0ZQX0hJR0hNRU0pKTsKIAlpZiAoYykgewotCQlwdGVfdCAqcHRlID0gY29uc2lzdGVudF9wdGUgKyBDT05TSVNURU5UX09GRlNFVChjLT52bV9zdGFydCk7CisJCXB0ZV90ICpwdGU7CiAJCXN0cnVjdCBwYWdlICplbmQgPSBwYWdlICsgKDEgPDwgb3JkZXIpOworCQlpbnQgaWR4ID0gQ09OU0lTVEVOVF9QVEVfSU5ERVgoYy0+dm1fc3RhcnQpOworCQl1MzIgb2ZmID0gQ09OU0lTVEVOVF9PRkZTRVQoYy0+dm1fc3RhcnQpICYgKFBUUlNfUEVSX1BURS0xKTsKIAorCQlwdGUgPSBjb25zaXN0ZW50X3B0ZVtpZHhdICsgb2ZmOwogCQljLT52bV9wYWdlcyA9IHBhZ2U7CiAKIAkJLyoKQEAgLTIyNyw2ICsyMzksMTEgQEAKIAkJCXNldF9wdGUocHRlLCBta19wdGUocGFnZSwgcHJvdCkpOwogCQkJcGFnZSsrOwogCQkJcHRlKys7CisJCQlvZmYrKzsKKwkJCWlmIChvZmYgPj0gUFRSU19QRVJfUFRFKSB7CisJCQkJb2ZmID0gMDsKKwkJCQlwdGUgPSBjb25zaXN0ZW50X3B0ZVsrK2lkeF07CisJCQl9CiAJCX0gd2hpbGUgKHNpemUgLT0gUEFHRV9TSVpFKTsKIAogCQkvKgpAQCAtMzI4LDYgKzM0NSw4IEBACiAJc3RydWN0IHZtX3JlZ2lvbiAqYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBhZGRyOwogCXB0ZV90ICpwdGVwOworCWludCBpZHg7CisJdTMyIG9mZjsKIAogCVdBUk5fT04oaXJxc19kaXNhYmxlZCgpKTsKIApAQCAtMzQ4LDcgKzM2Nyw5IEBACiAJCXNpemUgPSBjLT52bV9lbmQgLSBjLT52bV9zdGFydDsKIAl9CiAKLQlwdGVwID0gY29uc2lzdGVudF9wdGUgKyBDT05TSVNURU5UX09GRlNFVChjLT52bV9zdGFydCk7CisJaWR4ID0gQ09OU0lTVEVOVF9QVEVfSU5ERVgoYy0+dm1fc3RhcnQpOworCW9mZiA9IENPTlNJU1RFTlRfT0ZGU0VUKGMtPnZtX3N0YXJ0KSAmIChQVFJTX1BFUl9QVEUtMSk7CisJcHRlcCA9IGNvbnNpc3RlbnRfcHRlW2lkeF0gKyBvZmY7CiAJYWRkciA9IGMtPnZtX3N0YXJ0OwogCWRvIHsKIAkJcHRlX3QgcHRlID0gcHRlcF9nZXRfYW5kX2NsZWFyKCZpbml0X21tLCBhZGRyLCBwdGVwKTsKQEAgLTM1Niw2ICszNzcsMTEgQEAKIAogCQlwdGVwKys7CiAJCWFkZHIgKz0gUEFHRV9TSVpFOworCQlvZmYrKzsKKwkJaWYgKG9mZiA+PSBQVFJTX1BFUl9QVEUpIHsKKwkJCW9mZiA9IDA7CisJCQlwdGVwID0gY29uc2lzdGVudF9wdGVbKytpZHhdOworCQl9CiAKIAkJaWYgKCFwdGVfbm9uZShwdGUpICYmIHB0ZV9wcmVzZW50KHB0ZSkpIHsKIAkJCXBmbiA9IHB0ZV9wZm4ocHRlKTsKQEAgLTQwMiwxMSArNDI4LDEyIEBACiAJcGdkX3QgKnBnZDsKIAlwbWRfdCAqcG1kOwogCXB0ZV90ICpwdGU7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldCA9IDAsIGkgPSAwOworCXUzMiBiYXNlID0gQ09OU0lTVEVOVF9CQVNFOwogCiAJZG8gewotCQlwZ2QgPSBwZ2Rfb2Zmc2V0KCZpbml0X21tLCBDT05TSVNURU5UX0JBU0UpOwotCQlwbWQgPSBwbWRfYWxsb2MoJmluaXRfbW0sIHBnZCwgQ09OU0lTVEVOVF9CQVNFKTsKKwkJcGdkID0gcGdkX29mZnNldCgmaW5pdF9tbSwgYmFzZSk7CisJCXBtZCA9IHBtZF9hbGxvYygmaW5pdF9tbSwgcGdkLCBiYXNlKTsKIAkJaWYgKCFwbWQpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIHBtZCB0YWJsZXNcbiIsIF9fZnVuY19fKTsKIAkJCXJldCA9IC1FTk9NRU07CkBAIC00MTQsMTUgKzQ0MSwxNiBAQAogCQl9CiAJCVdBUk5fT04oIXBtZF9ub25lKCpwbWQpKTsKIAotCQlwdGUgPSBwdGVfYWxsb2Nfa2VybmVsKHBtZCwgQ09OU0lTVEVOVF9CQVNFKTsKKwkJcHRlID0gcHRlX2FsbG9jX2tlcm5lbChwbWQsIGJhc2UpOwogCQlpZiAoIXB0ZSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gcHRlIHRhYmxlc1xuIiwgX19mdW5jX18pOwogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJY29uc2lzdGVudF9wdGUgPSBwdGU7Ci0JfSB3aGlsZSAoMCk7CisJCWNvbnNpc3RlbnRfcHRlW2krK10gPSBwdGU7CisJCWJhc2UgKz0gKDEgPDwgUEdESVJfU0hJRlQpOworCX0gd2hpbGUgKGJhc2UgPCBDT05TSVNURU5UX0VORCk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZGlzY29udGlnLmMgYi9hcmNoL2FybS9tbS9kaXNjb250aWcuYwppbmRleCAwZDA5N2JiLi4xZTU2MDIxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9kaXNjb250aWcuYworKysgYi9hcmNoL2FybS9tbS9kaXNjb250aWcuYwpAQCAtOSwxMCArOSw4IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KIAogI2lmIE1BWF9OVU1OT0RFUyAhPSA0ICYmIE1BWF9OVU1OT0RFUyAhPSAxNgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vaW9yZW1hcC5jIGIvYXJjaC9hcm0vbW0vaW9yZW1hcC5jCmluZGV4IDEwOTAxMzkuLmRlM2NlMWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2lvcmVtYXAuYworKysgYi9hcmNoL2FybS9tbS9pb3JlbWFwLmMKQEAgLTg2LDExICs4NiwxMiBAQAogfQogCiBzdGF0aWMgaW50Ci1yZW1hcF9hcmVhX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLAorcmVtYXBfYXJlYV9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHBmbiwKIAkJIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSBzdGFydDsKIAl1bnNpZ25lZCBsb25nIGVuZCA9IHN0YXJ0ICsgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHBoeXNfYWRkciA9IF9fcGZuX3RvX3BoeXMocGZuKTsKIAlpbnQgZXJyID0gMDsKIAlwZ2RfdCAqIGRpcjsKIApAQCAtMTMwLDM2ICsxMzEsNDQgQEAKICAqIG1hcHBpbmcuICBTZWUgaW5jbHVkZS9hc20tYXJtL3Byb2MtYXJtdi9wZ3RhYmxlLmggZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgKi8KIHZvaWQgX19pb21lbSAqCitfX2lvcmVtYXBfcGZuKHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCisJICAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisgCXN0cnVjdCB2bV9zdHJ1Y3QgKiBhcmVhOworCisgCWFyZWEgPSBnZXRfdm1fYXJlYShzaXplLCBWTV9JT1JFTUFQKTsKKyAJaWYgKCFhcmVhKQorIAkJcmV0dXJuIE5VTEw7CisgCWFkZHIgPSAodW5zaWduZWQgbG9uZylhcmVhLT5hZGRyOworIAlpZiAocmVtYXBfYXJlYV9wYWdlcyhhZGRyLCBwZm4sIHNpemUsIGZsYWdzKSkgeworIAkJdmZyZWUoYWRkcik7CisgCQlyZXR1cm4gTlVMTDsKKyAJfQorIAlyZXR1cm4gKHZvaWQgX19pb21lbSAqKSAob2Zmc2V0ICsgKGNoYXIgKilhZGRyKTsKK30KK0VYUE9SVF9TWU1CT0woX19pb3JlbWFwX3Bmbik7CisKK3ZvaWQgX19pb21lbSAqCiBfX2lvcmVtYXAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewotCXZvaWQgKiBhZGRyOwotCXN0cnVjdCB2bV9zdHJ1Y3QgKiBhcmVhOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBsYXN0X2FkZHI7CisJdW5zaWduZWQgbG9uZyBsYXN0X2FkZHI7CisgCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcGh5c19hZGRyICYgflBBR0VfTUFTSzsKKyAJdW5zaWduZWQgbG9uZyBwZm4gPSBfX3BoeXNfdG9fcGZuKHBoeXNfYWRkcik7CiAKLQkvKiBEb24ndCBhbGxvdyB3cmFwYXJvdW5kIG9yIHplcm8gc2l6ZSAqLworIAkvKgorIAkgKiBEb24ndCBhbGxvdyB3cmFwYXJvdW5kIG9yIHplcm8gc2l6ZQorCSAqLwogCWxhc3RfYWRkciA9IHBoeXNfYWRkciArIHNpemUgLSAxOwogCWlmICghc2l6ZSB8fCBsYXN0X2FkZHIgPCBwaHlzX2FkZHIpCiAJCXJldHVybiBOVUxMOwogCiAJLyoKLQkgKiBNYXBwaW5ncyBoYXZlIHRvIGJlIHBhZ2UtYWxpZ25lZAorIAkgKiBQYWdlIGFsaWduIHRoZSBtYXBwaW5nIHNpemUKIAkgKi8KLQlvZmZzZXQgPSBwaHlzX2FkZHIgJiB+UEFHRV9NQVNLOwotCXBoeXNfYWRkciAmPSBQQUdFX01BU0s7CiAJc2l6ZSA9IFBBR0VfQUxJR04obGFzdF9hZGRyICsgMSkgLSBwaHlzX2FkZHI7CiAKLQkvKgotCSAqIE9rLCBnbyBmb3IgaXQuLgotCSAqLwotCWFyZWEgPSBnZXRfdm1fYXJlYShzaXplLCBWTV9JT1JFTUFQKTsKLQlpZiAoIWFyZWEpCi0JCXJldHVybiBOVUxMOwotCWFkZHIgPSBhcmVhLT5hZGRyOwotCWlmIChyZW1hcF9hcmVhX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSBhZGRyLCBwaHlzX2FkZHIsIHNpemUsIGZsYWdzKSkgewotCQl2ZnJlZShhZGRyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAodm9pZCBfX2lvbWVtICopIChvZmZzZXQgKyAoY2hhciAqKWFkZHIpOworIAlyZXR1cm4gX19pb3JlbWFwX3BmbihwZm4sIG9mZnNldCwgc2l6ZSwgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTChfX2lvcmVtYXApOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9tbS1hcm12LmMgYi9hcmNoL2FybS9tbS9tbS1hcm12LmMKaW5kZXggOWU1MDEyNy4uZDAyNDVhMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vbW0tYXJtdi5jCisrKyBiL2FyY2gvYXJtL21tL21tLWFybXYuYwpAQCAtMTksNyArMTksNiBAQAogCiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ud2ZwZS9mcGExMS5oIGIvYXJjaC9hcm0vbndmcGUvZnBhMTEuaAppbmRleCBkYTRjNjE2Li4yOGNkNzlhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ud2ZwZS9mcGExMS5oCisrKyBiL2FyY2gvYXJtL253ZnBlL2ZwYTExLmgKQEAgLTYyLDcgKzYyLDcgQEAKICNlbHNlCiAJdTMyIHBhZGRpbmdbM107CiAjZW5kaWYKLX0gRlBSRUc7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQsYWxpZ25lZCg0KSkpIEZQUkVHOwogCiAvKgogICogRlBBMTEgZGV2aWNlIG1vZGVsLgpAQCAtODksNyArODksNyBAQAogCQkJCSAgIHNvIHdlIGNhbiB1c2UgaXQgdG8gZGV0ZWN0IHdoZXRoZXIgdGhpcwogCQkJCSAgIGluc3RhbmNlIG9mIHRoZSBlbXVsYXRvciBuZWVkcyB0byBiZQogCQkJCSAgIGluaXRpYWxpc2VkLiAqLwotfSBGUEExMTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCxhbGlnbmVkKDQpKSkgRlBBMTE7CiAKIGV4dGVybiBpbnQ4IFNldFJvdW5kaW5nTW9kZShjb25zdCB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIGludDggU2V0Um91bmRpbmdQcmVjaXNpb24oY29uc3QgdW5zaWduZWQgaW50KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9LY29uZmlnIGIvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcKaW5kZXggOTY5M2U5Yi4uMDg4N2JiMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcKQEAgLTIyLDcgKzIyLDYgQEAKIGNvbmZpZyBPTUFQX1JFU0VUX0NMT0NLUwogCWJvb2wgIlJlc2V0IHVudXNlZCBjbG9ja3MgZHVyaW5nIGJvb3QiCiAJZGVwZW5kcyBvbiBBUkNIX09NQVAKLQlkZWZhdWx0IG4KIAloZWxwCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byByZXNldCB1bnVzZWQgY2xvY2tzIGR1cmluZyBib290LgogCSAgVGhpcyBvcHRpb24gc2F2ZXMgcG93ZXIsIGJ1dCBhc3N1bWVzIGFsbCBkcml2ZXJzIGFyZQpAQCAtNDQsNyArNDMsNiBAQAogY29uZmlnIE9NQVBfTVVYX0RFQlVHCiAJYm9vbCAiTXVsdGlwbGV4aW5nIGRlYnVnIG91dHB1dCIKICAgICAgICAgZGVwZW5kcyBvbiBPTUFQX01VWAotICAgICAgICBkZWZhdWx0IG4KICAgICAgICAgaGVscAogICAgICAgICAgIE1ha2VzIHRoZSBtdWx0aXBsZXhpbmcgZnVuY3Rpb25zIHByaW50IG91dCBhIGxvdCBvZiBkZWJ1ZyBpbmZvLgogICAgICAgICAgIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGZpbmQgb3V0IHRoZSBjb3JyZWN0IHZhbHVlcyBvZiB0aGUKQEAgLTkzLDcgKzkxLDYgQEAKIAogY29uZmlnIE9NQVBfRE1fVElNRVIKIAlib29sICJVc2UgZHVhbC1tb2RlIHRpbWVyIgotCWRlZmF1bHQgbgogCWRlcGVuZHMgb24gQVJDSF9PTUFQMTZYWAogCWhlbHAKIAkgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIHVzZSBPTUFQIER1YWwtTW9kZSB0aW1lcnMuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvY2xvY2suYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jCmluZGV4IDdjZTM5YjkuLjNjMmJmYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jCkBAIC0xOSwzNSArMTksMzYgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vYXJjaC9jbG9jay5oPgogCiBMSVNUX0hFQUQoY2xvY2tzKTsKLXN0YXRpYyBERUNMQVJFX01VVEVYKGNsb2Nrc19zZW0pOworc3RhdGljIERFRklORV9NVVRFWChjbG9ja3NfbXV0ZXgpOwogREVGSU5FX1NQSU5MT0NLKGNsb2NrZndfbG9jayk7CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX2Z1bmN0aW9ucyAqYXJjaF9jbG9jazsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBTdGFuZGFyZCBjbG9jayBmdW5jdGlvbnMgZGVmaW5lZCBpbiBhc20vaGFyZHdhcmUvY2xvY2suaAorICogU3RhbmRhcmQgY2xvY2sgZnVuY3Rpb25zIGRlZmluZWQgaW4gaW5jbHVkZS9saW51eC9jbGsuaAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RydWN0IGNsayAqIGNsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCkKIHsKIAlzdHJ1Y3QgY2xrICpwLCAqY2xrID0gRVJSX1BUUigtRU5PRU5UKTsKIAotCWRvd24oJmNsb2Nrc19zZW0pOworCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2xvY2tzLCBub2RlKSB7CiAJCWlmIChzdHJjbXAoaWQsIHAtPm5hbWUpID09IDAgJiYgdHJ5X21vZHVsZV9nZXQocC0+b3duZXIpKSB7CiAJCQljbGsgPSBwOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JdXAoJmNsb2Nrc19zZW0pOworCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKIAogCXJldHVybiBjbGs7CiB9CkBAIC01OSwxMiArNjAsOCBAQAogCWludCByZXQgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNsb2NrZndfbG9jaywgZmxhZ3MpOwotCWlmIChjbGstPmVuYWJsZSkKLQkJcmV0ID0gY2xrLT5lbmFibGUoY2xrKTsKLQllbHNlIGlmIChhcmNoX2Nsb2NrLT5jbGtfZW5hYmxlKQorCWlmIChhcmNoX2Nsb2NrLT5jbGtfZW5hYmxlKQogCQlyZXQgPSBhcmNoX2Nsb2NrLT5jbGtfZW5hYmxlKGNsayk7Ci0JZWxzZQotCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBlbmFibGUgY2xvY2sgJXNcbiIsIGNsay0+bmFtZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tmd19sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtNzYsNDEgKzczLDEyIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjbG9ja2Z3X2xvY2ssIGZsYWdzKTsKLQlpZiAoY2xrLT5kaXNhYmxlKQotCQljbGstPmRpc2FibGUoY2xrKTsKLQllbHNlIGlmIChhcmNoX2Nsb2NrLT5jbGtfZGlzYWJsZSkKKwlpZiAoYXJjaF9jbG9jay0+Y2xrX2Rpc2FibGUpCiAJCWFyY2hfY2xvY2stPmNsa19kaXNhYmxlKGNsayk7Ci0JZWxzZQotCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBkaXNhYmxlIGNsb2NrICVzXG4iLCBjbGstPm5hbWUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsb2NrZndfbG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTChjbGtfZGlzYWJsZSk7CiAKLWludCBjbGtfdXNlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNsb2NrZndfbG9jaywgZmxhZ3MpOwotCWlmIChhcmNoX2Nsb2NrLT5jbGtfdXNlKQotCQlyZXQgPSBhcmNoX2Nsb2NrLT5jbGtfdXNlKGNsayk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tmd19sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChjbGtfdXNlKTsKLQotdm9pZCBjbGtfdW51c2Uoc3RydWN0IGNsayAqY2xrKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tmd19sb2NrLCBmbGFncyk7Ci0JaWYgKGFyY2hfY2xvY2stPmNsa191bnVzZSkKLQkJYXJjaF9jbG9jay0+Y2xrX3VudXNlKGNsayk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tmd19sb2NrLCBmbGFncyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa191bnVzZSk7Ci0KIGludCBjbGtfZ2V0X3VzZWNvdW50KHN0cnVjdCBjbGsgKmNsaykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTQ1LDcgKzExMyw3IEBACiBFWFBPUlRfU1lNQk9MKGNsa19wdXQpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIE9wdGlvbmFsIGNsb2NrIGZ1bmN0aW9ucyBkZWZpbmVkIGluIGFzbS9oYXJkd2FyZS9jbG9jay5oCisgKiBPcHRpb25hbCBjbG9jayBmdW5jdGlvbnMgZGVmaW5lZCBpbiBpbmNsdWRlL2xpbnV4L2Nsay5oCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiBsb25nIGNsa19yb3VuZF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQpAQCAtMjQ5LDExICsyMTcsMTEgQEAKIAogaW50IGNsa19yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspCiB7Ci0JZG93bigmY2xvY2tzX3NlbSk7CisJbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKIAlsaXN0X2FkZCgmY2xrLT5ub2RlLCAmY2xvY2tzKTsKIAlpZiAoY2xrLT5pbml0KQogCQljbGstPmluaXQoY2xrKTsKLQl1cCgmY2xvY2tzX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNjEsOSArMjI5LDkgQEAKIAogdm9pZCBjbGtfdW5yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspCiB7Ci0JZG93bigmY2xvY2tzX3NlbSk7CisJbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKIAlsaXN0X2RlbCgmY2xrLT5ub2RlKTsKLQl1cCgmY2xvY2tzX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTChjbGtfdW5yZWdpc3Rlcik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9jb21tb24uYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jb21tb24uYwppbmRleCBjY2RiNDUyNi4uYWRmZmM1YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jb21tb24uYwpAQCAtMTgsMTIgKzE4LDEyIEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2NwdS1vbWFwLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvY3B1LW9tYXAuYwppbmRleCBmZDg5NGJiLi45OGVkYzlmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvY3B1LW9tYXAuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvY3B1LW9tYXAuYwpAQCAtMTksMTMgKzE5LDEyIEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KLQogLyogVE9ETzogQWRkIHN1cHBvcnQgZm9yIFNEUkFNIHRpbWluZyBjaGFuZ2VzICovCiAKIGludCBvbWFwX3ZlcmlmeV9zcGVlZChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9kbWEuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kbWEuYwppbmRleCBmNWNjMjFhLi5hNGU1YWM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvZG1hLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2RtYS5jCkBAIC02NCw3ICs2NCw3IEBACiBzdGF0aWMgc3BpbmxvY2tfdCBkbWFfY2hhbl9sb2NrOwogc3RhdGljIHN0cnVjdCBvbWFwX2RtYV9sY2ggZG1hX2NoYW5bT01BUF9MT0dJQ0FMX0RNQV9DSF9DT1VOVF07CiAKLWNvbnN0IHN0YXRpYyB1OCBvbWFwMV9kbWFfaXJxW09NQVBfTE9HSUNBTF9ETUFfQ0hfQ09VTlRdID0geworc3RhdGljIGNvbnN0IHU4IG9tYXAxX2RtYV9pcnFbT01BUF9MT0dJQ0FMX0RNQV9DSF9DT1VOVF0gPSB7CiAJSU5UX0RNQV9DSDBfNiwgSU5UX0RNQV9DSDFfNywgSU5UX0RNQV9DSDJfOCwgSU5UX0RNQV9DSDMsCiAJSU5UX0RNQV9DSDQsIElOVF9ETUFfQ0g1LCBJTlRfMTYxMF9ETUFfQ0g2LCBJTlRfMTYxMF9ETUFfQ0g3LAogCUlOVF8xNjEwX0RNQV9DSDgsIElOVF8xNjEwX0RNQV9DSDksIElOVF8xNjEwX0RNQV9DSDEwLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2dwaW8uYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9ncGlvLmMKaW5kZXggNzZmNzIxZC4uYjRkNWI5ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2dwaW8uYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZ3Bpby5jCkBAIC0xOSw5ICsxOSw5IEBACiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KQEAgLTg1MywxOSArODUzLDE5IEBACiAJCWlmIChJU19FUlIoZ3Bpb19pY2spKQogCQkJcHJpbnRrKCJDb3VsZCBub3QgZ2V0IGFybV9ncGlvX2NrXG4iKTsKIAkJZWxzZQotCQkJY2xrX3VzZShncGlvX2ljayk7CisJCQljbGtfZW5hYmxlKGdwaW9faWNrKTsKIAl9CiAJaWYgKGNwdV9pc19vbWFwMjR4eCgpKSB7CiAJCWdwaW9faWNrID0gY2xrX2dldChOVUxMLCAiZ3Bpb3NfaWNrIik7CiAJCWlmIChJU19FUlIoZ3Bpb19pY2spKQogCQkJcHJpbnRrKCJDb3VsZCBub3QgZ2V0IGdwaW9zX2lja1xuIik7CiAJCWVsc2UKLQkJCWNsa191c2UoZ3Bpb19pY2spOworCQkJY2xrX2VuYWJsZShncGlvX2ljayk7CiAJCWdwaW9fZmNrID0gY2xrX2dldChOVUxMLCAiZ3Bpb3NfZmNrIik7CiAJCWlmIChJU19FUlIoZ3Bpb19pY2spKQogCQkJcHJpbnRrKCJDb3VsZCBub3QgZ2V0IGdwaW9zX2Zja1xuIik7CiAJCWVsc2UKLQkJCWNsa191c2UoZ3Bpb19mY2spOworCQkJY2xrX2VuYWJsZShncGlvX2Zjayk7CiAJfQogCiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1WFgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9tY2JzcC5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL21jYnNwLmMKaW5kZXggZWE5NDc1Yy4uMWNkMmNhYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL21jYnNwLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL21jYnNwLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAKICNpbmNsdWRlIDxhc20vZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTMwLDggKzMxLDYgQEAKICNpbmNsdWRlIDxhc20vYXJjaC9kc3BfY29tbW9uLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvbWNic3AuaD4KIAotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgotCiAjaWZkZWYgQ09ORklHX01DQlNQX0RFQlVHCiAjZGVmaW5lIERCRyh4Li4uKQlwcmludGsoeCkKICNlbHNlCkBAIC0xOTEsMTEgKzE5MCwxMSBAQAogc3RhdGljIHZvaWQgb21hcF9tY2JzcF9kc3BfcmVxdWVzdCh2b2lkKQogewogCWlmIChjcHVfaXNfb21hcDE1MTAoKSB8fCBjcHVfaXNfb21hcDE2eHgoKSkgewotCQljbGtfdXNlKG1jYnNwX2RzcF9jayk7Ci0JCWNsa191c2UobWNic3BfYXBpX2NrKTsKKwkJY2xrX2VuYWJsZShtY2JzcF9kc3BfY2spOworCQljbGtfZW5hYmxlKG1jYnNwX2FwaV9jayk7CiAKIAkJLyogZW5hYmxlIDEyTUh6IGNsb2NrIHRvIG1jYnNwIDEgJiAzICovCi0JCWNsa191c2UobWNic3BfZHNweG9yX2NrKTsKKwkJY2xrX2VuYWJsZShtY2JzcF9kc3B4b3JfY2spOwogCiAJCS8qCiAJCSAqIERTUCBleHRlcm5hbCBwZXJpcGhlcmFsIHJlc2V0CkBAIC0yMDksOSArMjA4LDkgQEAKIHN0YXRpYyB2b2lkIG9tYXBfbWNic3BfZHNwX2ZyZWUodm9pZCkKIHsKIAlpZiAoY3B1X2lzX29tYXAxNTEwKCkgfHwgY3B1X2lzX29tYXAxNnh4KCkpIHsKLQkJY2xrX3VudXNlKG1jYnNwX2RzcHhvcl9jayk7Ci0JCWNsa191bnVzZShtY2JzcF9kc3BfY2spOwotCQljbGtfdW51c2UobWNic3BfYXBpX2NrKTsKKwkJY2xrX2Rpc2FibGUobWNic3BfZHNweG9yX2NrKTsKKwkJY2xrX2Rpc2FibGUobWNic3BfZHNwX2NrKTsKKwkJY2xrX2Rpc2FibGUobWNic3BfYXBpX2NrKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9vY3BpLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvb2NwaS5jCmluZGV4IGI4NjE0ODIuLjVjYzY3NzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9vY3BpLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL29jcGkuYwpAQCAtMzEsOSArMzEsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAKICNkZWZpbmUgT0NQSV9CQVNFCQkweGZmZmVjMzIwCkBAIC04OCw3ICs4OCw3IEBACiAJaWYgKElTX0VSUihvY3BpX2NrKSkKIAkJcmV0dXJuIFBUUl9FUlIob2NwaV9jayk7CiAKLQljbGtfdXNlKG9jcGlfY2spOworCWNsa19lbmFibGUob2NwaV9jayk7CiAJb2NwaV9lbmFibGUoKTsKIAlwcmludGsoIk9NQVAgT0NQSSBpbnRlcmNvbm5lY3QgZHJpdmVyIGxvYWRlZFxuIik7CiAKQEAgLTEwMiw3ICsxMDIsNyBAQAogCWlmICghY3B1X2lzX29tYXAxNnh4KCkpCiAJCXJldHVybjsKIAotCWNsa191bnVzZShvY3BpX2NrKTsKKwljbGtfZGlzYWJsZShvY3BpX2NrKTsKIAljbGtfcHV0KG9jcGlfY2spOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS90b29scy9tYWNoLXR5cGVzIGIvYXJjaC9hcm0vdG9vbHMvbWFjaC10eXBlcwppbmRleCA0NjU0ODc0Li5kMGY5YmI1IDEwMDY0NAotLS0gYS9hcmNoL2FybS90b29scy9tYWNoLXR5cGVzCisrKyBiL2FyY2gvYXJtL3Rvb2xzL21hY2gtdHlwZXMKQEAgLTEyLDcgKzEyLDcgQEAKICMKICMgICBodHRwOi8vd3d3LmFybS5saW51eC5vcmcudWsvZGV2ZWxvcGVyL21hY2hpbmVzLz9hY3Rpb249bmV3CiAjCi0jIExhc3QgdXBkYXRlOiBGcmkgTm92IDI1IDE0OjQzOjA0IDIwMDUKKyMgTGFzdCB1cGRhdGU6IE1vbiBKYW4gOSAxMjo1Njo0MiAyMDA2CiAjCiAjIG1hY2hpbmVfaXNfeHh4CUNPTkZJR194eHh4CQlNQUNIX1RZUEVfeHh4CQludW1iZXIKICMKQEAgLTkxMCwzICs5MTAsMzEgQEAKIG5hZGlhMnZiCQlNQUNIX05BRElBMlZCCQlOQURJQTJWQgkJODk3CiByMTAwMAkJCU1BQ0hfUjEwMDAJCVIxMDAwCQkJODk4CiBodzkwMjUwCQkJTUFDSF9IVzkwMjUwCQlIVzkwMjUwCQkJODk5CitvbWFwXzI0MzBzZHAJCU1BQ0hfT01BUF8yNDMwU0RQCU9NQVBfMjQzMFNEUAkJOTAwCitkYXZpbmNpX2V2bQkJTUFDSF9EQVZJTkNJX0VWTQlEQVZJTkNJX0VWTQkJOTAxCitvbWFwX3Rvcm5hZG8JCU1BQ0hfT01BUF9UT1JOQURPCU9NQVBfVE9STkFETwkJOTAyCitvbG9jcmVlawkJTUFDSF9PTE9DUkVFSwkJT0xPQ1JFRUsJCTkwMworcGFsbXo3MgkJCU1BQ0hfUEFMTVo3MgkJUEFMTVo3MgkJCTkwNAorbnhkYjUwMAkJCU1BQ0hfTlhEQjUwMAkJTlhEQjUwMAkJCTkwNQorYXBmOTMyOAkJCU1BQ0hfQVBGOTMyOAkJQVBGOTMyOAkJCTkwNgorb21hcF93aXBvcQkJTUFDSF9PTUFQX1dJUE9RCQlPTUFQX1dJUE9RCQk5MDcKK29tYXBfdHdpcAkJTUFDSF9PTUFQX1RXSVAJCU9NQVBfVFdJUAkJOTA4Cit4c2NhbGVfdHJlbzY1MAkJTUFDSF9YU0NBTEVfUEFMTVRSRU82NTAJWFNDQUxFX1BBTE1UUkVPNjUwCTkwOQorYWN1bWVuCQkJTUFDSF9BQ1VNRU4JCUFDVU1FTgkJCTkxMAoreHAxMDAJCQlNQUNIX1hQMTAwCQlYUDEwMAkJCTkxMQorZnMyNDEwCQkJTUFDSF9GUzI0MTAJCUZTMjQxMAkJCTkxMgorcHhhMjcwX2NlcmYJCU1BQ0hfUFhBMjcwX0NFUkYJUFhBMjcwX0NFUkYJCTkxMworc3EyZnRscGFsbQkJTUFDSF9TUTJGVExQQUxNCQlTUTJGVExQQUxNCQk5MTQKK2JzZW1zZXJ2ZXIJCU1BQ0hfQlNFTVNFUlZFUgkJQlNFTVNFUlZFUgkJOTE1CituZXRjbGllbnQJCU1BQ0hfTkVUQ0xJRU5UCQlORVRDTElFTlQJCTkxNgoreHNjYWxlX3BhbG10dDUJCU1BQ0hfWFNDQUxFX1BBTE1UVDUJWFNDQUxFX1BBTE1UVDUJCTkxNworeHNjYWxlX3BhbG10YwkJTUFDSF9PTUFQX1BBTE1UQwlPTUFQX1BBTE1UQwkJOTE4CitvbWFwX2Fwb2xsb24JCU1BQ0hfT01BUF9BUE9MTE9OCU9NQVBfQVBPTExPTgkJOTE5Cithcmdvbmx2ZXZiCQlNQUNIX0FSR09OTFZFVkIJCUFSR09OTFZFVkIJCTkyMAorcmVhXzJkCQkJTUFDSF9SRUFfMkQJCVJFQV8yRAkJCTkyMQorZXRpM2U1MjQJCU1BQ0hfVEkzRTUyNAkJVEkzRTUyNAkJCTkyMgorYXRlYjkyMDAJCU1BQ0hfQVRFQjkyMDAJCUFURUI5MjAwCQk5MjMKK2F1Y2tsYW5kCQlNQUNIX0FVQ0tMQU5ECQlBVUNLTEFORAkJOTI0CithazMyMjBtCQkJTUFDSF9BSzMzMjBNCQlBSzMzMjBNCQkJOTI1CitkdXJhbWF4CQkJTUFDSF9EVVJBTUFYCQlEVVJBTUFYCQkJOTI2CituMzUJCQlNQUNIX04zNQkJTjM1CQkJOTI3CmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L0tjb25maWcgYi9hcmNoL2FybTI2L0tjb25maWcKaW5kZXggMWYwMGIzZC4uMjc0ZTA3MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0yNi9LY29uZmlnCisrKyBiL2FyY2gvYXJtMjYvS2NvbmZpZwpAQCAtMzQsMTAgKzM0LDYgQEAKICAgICAgICAgaW50CiAgICAgICAgIGRlZmF1bHQgOQogCi1jb25maWcgVUlEMTYKLQlib29sCi0JZGVmYXVsdCB5Ci0KIGNvbmZpZyBSV1NFTV9HRU5FUklDX1NQSU5MT0NLCiAJYm9vbAogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0yNi9rZXJuZWwvYXJta3N5bXMuYyBiL2FyY2gvYXJtMjYva2VybmVsL2FybWtzeW1zLmMKaW5kZXggMzU1MTRiMy4uODExYTYzNzZjIDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L2tlcm5lbC9hcm1rc3ltcy5jCisrKyBiL2FyY2gvYXJtMjYva2VybmVsL2FybWtzeW1zLmMKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCi1leHRlcm4gdm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgdXNlciAqKTsKIGV4dGVybiBpbnQgZHVtcF9mcHUoc3RydWN0IHB0X3JlZ3MgKiwgc3RydWN0IHVzZXJfZnBfc3RydWN0ICopOwogZXh0ZXJuIHZvaWQgaW5zd2IodW5zaWduZWQgaW50IHBvcnQsIHZvaWQgKnRvLCBpbnQgbGVuKTsKIGV4dGVybiB2b2lkIG91dHN3Yih1bnNpZ25lZCBpbnQgcG9ydCwgY29uc3Qgdm9pZCAqdG8sIGludCBsZW4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0yNi9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvYXJtMjYva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggNGNjYWNhZS4uYWM2ODJkNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0yNi9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL2FybTI2L2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0yNSwxMyArMjUsNiBAQAogI2lmIGRlZmluZWQoX19BUENTXzMyX18pICYmIGRlZmluZWQoQ09ORklHX0NQVV8yNikKICNlcnJvciBTb3JyeSwgeW91ciBjb21waWxlciB0YXJnZXRzIEFQQ1MtMzIgYnV0IHRoaXMga2VybmVsIHJlcXVpcmVzIEFQQ1MtMjYKICNlbmRpZgotI2lmIF9fR05VQ19fIDwgMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8IDk1KQotI2Vycm9yIFNvcnJ5LCB5b3VyIGNvbXBpbGVyIGlzIGtub3duIHRvIG1pc2NvbXBpbGUga2VybmVscy4gIE9ubHkgdXNlIGdjYyAyLjk1LjMgYW5kIGxhdGVyLgotI2VuZGlmCi0jaWYgX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA9PSA5NQotLyogc2hhbWUgd2UgY2FuJ3QgZGV0ZWN0IHRoZSAuMSBvciAuMiByZWxlYXNlcyAqLwotI3dhcm5pbmcgR0NDIDIuOTUuMiBhbmQgZWFybGllciBtaXNjb21waWxlcyBrZXJuZWxzLgotI2VuZGlmCiAKIC8qIFVzZSBtYXJrZXIgaWYgeW91IG5lZWQgdG8gc2VwYXJhdGUgdGhlIHZhbHVlcyBsYXRlciAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L2tlcm5lbC9pcnEuYyBiL2FyY2gvYXJtMjYva2VybmVsL2lycS5jCmluZGV4IGYzY2MxMDMuLjA5MzRlNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYva2VybmVsL2lycS5jCisrKyBiL2FyY2gvYXJtMjYva2VybmVsL2lycS5jCkBAIC0xNDEsNyArMTQxLDcgQEAKIAlpZiAoaSA8IE5SX0lSUVMpIHsKIAkgICAgCWFjdGlvbiA9IGlycV9kZXNjW2ldLmFjdGlvbjsKIAkJaWYgKCFhY3Rpb24pCi0JCQljb250aW51ZTsKKwkJCWdvdG8gb3V0OwogCQlzZXFfcHJpbnRmKHAsICIlM2Q6ICUxMHUgIiwgaSwga3N0YXRfaXJxcyhpKSk7CiAJCXNlcV9wcmludGYocCwgIiAgJXMiLCBhY3Rpb24tPm5hbWUpOwogCQlmb3IgKGFjdGlvbiA9IGFjdGlvbi0+bmV4dDsgYWN0aW9uOyBhY3Rpb24gPSBhY3Rpb24tPm5leHQpIHsKQEAgLTE1Miw2ICsxNTIsNyBAQAogCQlzaG93X2ZpcV9saXN0KHAsIHYpOwogCQlzZXFfcHJpbnRmKHAsICJFcnI6ICUxMGx1XG4iLCBpcnFfZXJyX2NvdW50KTsKIAl9CitvdXQ6CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvYXJtMjYva2VybmVsL3Byb2Nlc3MuYwppbmRleCAxNTgzM2EwLi4zODYzMDU2IDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9hcm0yNi9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0yNzcsMTAgKzI3Nyw5IEBACiBjb3B5X3RocmVhZChpbnQgbnIsIHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgc3RhY2tfc3RhcnQsCiAJICAgIHVuc2lnbmVkIGxvbmcgdW51c2VkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkID0gcC0+dGhyZWFkX2luZm87Ci0Jc3RydWN0IHB0X3JlZ3MgKmNoaWxkcmVnczsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRocmVhZCA9IHRhc2tfdGhyZWFkX2luZm8ocCk7CisJc3RydWN0IHB0X3JlZ3MgKmNoaWxkcmVncyA9IHRhc2tfcHRfcmVncyhwKTsKIAotCWNoaWxkcmVncyA9IF9fZ2V0X3VzZXJfcmVncyh0aHJlYWQpOwogCSpjaGlsZHJlZ3MgPSAqcmVnczsKIAljaGlsZHJlZ3MtPkFSTV9yMCA9IDA7CiAJY2hpbGRyZWdzLT5BUk1fc3AgPSBzdGFja19zdGFydDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9hcm0yNi9rZXJuZWwvcHRyYWNlLmMKaW5kZXggNGU2YjczNS4uMjgyZTI0ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0yNi9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9hcm0yNi9rZXJuZWwvcHRyYWNlLmMKQEAgLTQwLDIxICs0MCw2IEBACiAjZGVmaW5lIEJSRUFLSU5TVF9BUk0JMHhlZjlmMDAwMQogCiAvKgotICogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBsaXZlIHB0X3JlZ3MgZm9yIHRoZSBzcGVjaWZpZWQgdGFzay4KLSAqIFRoZXNlIGFyZSBzYXZlZCBvbnRvIHRoZSB0b3Aga2VybmVsIHN0YWNrIHdoZW4gdGhlIHByb2Nlc3MKLSAqIGlzIG5vdCBydW5uaW5nLgotICoKLSAqIE5vdGU6IGlmIGEgdXNlciB0aHJlYWQgaXMgZXhlY3ZlJ2QgZnJvbSBrZXJuZWwgc3BhY2UsIHRoZQotICoga2VybmVsIHN0YWNrIHdpbGwgbm90IGJlIGVtcHR5IG9uIGVudHJ5IHRvIHRoZSBrZXJuZWwsIHNvCi0gKiBwdHJhY2luZyB0aGVzZSB0YXNrcyB3aWxsIGZhaWwuCi0gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHB0X3JlZ3MgKgotZ2V0X3VzZXJfcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCi17Ci0JcmV0dXJuIF9fZ2V0X3VzZXJfcmVncyh0YXNrLT50aHJlYWRfaW5mbyk7Ci19Ci0KLS8qCiAgKiB0aGlzIHJvdXRpbmUgd2lsbCBnZXQgYSB3b3JkIG9mZiBvZiB0aGUgcHJvY2Vzc2VzIHByaXZpbGVnZWQgc3RhY2suCiAgKiB0aGUgb2Zmc2V0IGlzIGhvdyBmYXIgZnJvbSB0aGUgYmFzZSBhZGRyIGFzIHN0b3JlZCBpbiB0aGUgVEhSRUFELgogICogdGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCBhbGwgdGhlIHByaXZpbGVnZWQgc3RhY2tzIGFyZSBpbiBvdXIKQEAgLTYyLDcgKzQ3LDcgQEAKICAqLwogc3RhdGljIGlubGluZSBsb25nIGdldF91c2VyX3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBvZmZzZXQpCiB7Ci0JcmV0dXJuIGdldF91c2VyX3JlZ3ModGFzayktPnVyZWdzW29mZnNldF07CisJcmV0dXJuIHRhc2tfcHRfcmVncyh0YXNrKS0+dXJlZ3Nbb2Zmc2V0XTsKIH0KIAogLyoKQEAgLTc0LDcgKzU5LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBwdXRfdXNlcl9yZWcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgb2Zmc2V0LCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgbmV3cmVncywgKnJlZ3MgPSBnZXRfdXNlcl9yZWdzKHRhc2spOworCXN0cnVjdCBwdF9yZWdzIG5ld3JlZ3MsICpyZWdzID0gdGFza19wdF9yZWdzKHRhc2spOwogCWludCByZXQgPSAtRUlOVkFMOwogCiAJbmV3cmVncyA9ICpyZWdzOwpAQCAtMzc3LDcgKzM2Miw3IEBACiAJdTMyIGluc247CiAJaW50IHJlczsKIAotCXJlZ3MgPSBnZXRfdXNlcl9yZWdzKGNoaWxkKTsKKwlyZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAlwYyA9IGluc3RydWN0aW9uX3BvaW50ZXIocmVncyk7CiAKIAlyZXMgPSByZWFkX2luc3RyKGNoaWxkLCBwYywgJmluc24pOwpAQCAtNTAwLDcgKzQ4NSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgcHRyYWNlX2dldHJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHZvaWQgKnVyZWdzKQogewotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gZ2V0X3VzZXJfcmVncyh0c2spOworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKHRzayk7CiAKIAlyZXR1cm4gY29weV90b191c2VyKHVyZWdzLCByZWdzLCBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKSA/IC1FRkFVTFQgOiAwOwogfQpAQCAtNTE1LDcgKzUwMCw3IEBACiAKIAlyZXQgPSAtRUZBVUxUOwogCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3cmVncywgdXJlZ3MsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpID09IDApIHsKLQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBnZXRfdXNlcl9yZWdzKHRzayk7CisJCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKHRzayk7CiAKIAkJcmV0ID0gLUVJTlZBTDsKIAkJaWYgKHZhbGlkX3VzZXJfcmVncygmbmV3cmVncykpIHsKQEAgLTUzMiw3ICs1MTcsNyBAQAogICovCiBzdGF0aWMgaW50IHB0cmFjZV9nZXRmcHJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHZvaWQgKnVmcCkKIHsKLQlyZXR1cm4gY29weV90b191c2VyKHVmcCwgJnRzay0+dGhyZWFkX2luZm8tPmZwc3RhdGUsCisJcmV0dXJuIGNvcHlfdG9fdXNlcih1ZnAsICZ0YXNrX3RocmVhZF9pbmZvKHRzayktPmZwc3RhdGUsCiAJCQkgICAgc2l6ZW9mKHN0cnVjdCB1c2VyX2ZwKSkgPyAtRUZBVUxUIDogMDsKIH0KIApAQCAtNTQyLDcgKzUyNyw3IEBACiBzdGF0aWMgaW50IHB0cmFjZV9zZXRmcHJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHZvaWQgKnVmcCkKIHsKIAlzZXRfc3RvcHBlZF9jaGlsZF91c2VkX21hdGgodHNrKTsKLQlyZXR1cm4gY29weV9mcm9tX3VzZXIoJnRzay0+dGhyZWFkX2luZm8tPmZwc3RhdGUsIHVmcCwKKwlyZXR1cm4gY29weV9mcm9tX3VzZXIoJnRhc2tfdGhyZWFkX2luZm8odHNrKS0+ZnBzdGF0ZSwgdWZwLAogCQkJICAgICAgc2l6ZW9mKHN0cnVjdCB1c2VyX2ZwKSkgPyAtRUZBVUxUIDogMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0yNi9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYXJtMjYva2VybmVsL3RyYXBzLmMKaW5kZXggZjY0ZjU5MC4uNTg0N2VhNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0yNi9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2FybTI2L2tlcm5lbC90cmFwcy5jCkBAIC0xMzIsNyArMTMyLDcgQEAKIAogLypzdGF0aWMqLyB2b2lkIF9fZHVtcF9zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyBzcCkKIHsKLQlkdW1wX21lbSgiU3RhY2s6ICIsIHNwLCA4MTkyKyh1bnNpZ25lZCBsb25nKXRzay0+dGhyZWFkX2luZm8pOworCWR1bXBfbWVtKCJTdGFjazogIiwgc3AsIDgxOTIrKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHRzaykpOwogfQogCiB2b2lkIGR1bXBfc3RhY2sodm9pZCkKQEAgLTE1OCw3ICsxNTgsNyBAQAogCX0gZWxzZSBpZiAodmVyaWZ5X3N0YWNrKGZwKSkgewogCQlwcmludGsoImludmFsaWQgZnJhbWUgcG9pbnRlciAweCUwOHgiLCBmcCk7CiAJCW9rID0gMDsKLQl9IGVsc2UgaWYgKGZwIDwgKHVuc2lnbmVkIGxvbmcpKHRzay0+dGhyZWFkX2luZm8gKyAxKSkKKwl9IGVsc2UgaWYgKGZwIDwgKHVuc2lnbmVkIGxvbmcpZW5kX29mX3N0YWNrKHRzaykpCiAJCXByaW50aygiZnJhbWUgcG9pbnRlciB1bmRlcmZsb3ciKTsKIAlwcmludGsoIlxuIik7CiAKQEAgLTE2OCw3ICsxNjgsNyBAQAogCiAvKiBGSVhNRSAtIHRoaXMgaXMgcHJvYmFibHkgd3JvbmcuLiAqLwogdm9pZCBzaG93X3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqc3ApIHsKLQlkdW1wX21lbSgiU3RhY2s6ICIsICh1bnNpZ25lZCBsb25nKXNwLCA4MTkyKyh1bnNpZ25lZCBsb25nKXRhc2stPnRocmVhZF9pbmZvKTsKKwlkdW1wX21lbSgiU3RhY2s6ICIsICh1bnNpZ25lZCBsb25nKXNwLCA4MTkyKyh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZSh0YXNrKSk7CiB9CiAKIERFRklORV9TUElOTE9DSyhkaWVfbG9jayk7CkBAIC0xODcsNyArMTg3LDcgQEAKIAlwcmludGsoIkNQVTogJWRcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJc2hvd19yZWdzKHJlZ3MpOwogCXByaW50aygiUHJvY2VzcyAlcyAocGlkOiAlZCwgc3RhY2sgbGltaXQgPSAweCVwKVxuIiwKLQkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCB0c2stPnRocmVhZF9pbmZvICsgMSk7CisJCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgZW5kX29mX3N0YWNrKHRzaykpOwogCiAJaWYgKCF1c2VyX21vZGUocmVncykgfHwgaW5faW50ZXJydXB0KCkpIHsKIAkJX19kdW1wX3N0YWNrKHRzaywgKHVuc2lnbmVkIGxvbmcpKHJlZ3MgKyAxKSk7CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvS2NvbmZpZyBiL2FyY2gvY3Jpcy9LY29uZmlnCmluZGV4IGU1OTc5ZDYuLmI4MzI2MTkgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9LY29uZmlnCisrKyBiL2FyY2gvY3Jpcy9LY29uZmlnCkBAIC05LDEwICs5LDYgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKLWNvbmZpZyBVSUQxNgotCWJvb2wKLQlkZWZhdWx0IHkKLQogY29uZmlnIFJXU0VNX0dFTkVSSUNfU1BJTkxPQ0sKIAlib29sCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9kczEzMDIuYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL2RzMTMwMi5jCmluZGV4IDEwNzk1ZjYuLmIxMDBmMjYgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL2RzMTMwMi5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL2RzMTMwMi5jCkBAIC0xNDgsNiArMTQ4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL3BjZjg1NjMuYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL3BjZjg1NjMuYwppbmRleCBmMmM1NTc0Li5hZjUxN2MyIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9wY2Y4NTYzLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvcGNmODU2My5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3Byb2Nlc3MuYwppbmRleCA2OWUyOGI0Li4wYTY3NWNlIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3Byb2Nlc3MuYwpAQCAtNzksNyArNzksNyBAQAogICovCiB1bnNpZ25lZCBsb25nIHRocmVhZF9zYXZlZF9wYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCiB7Ci0JcmV0dXJuICh1bnNpZ25lZCBsb25nKXVzZXJfcmVncyh0LT50aHJlYWRfaW5mbyktPmlycDsKKwlyZXR1cm4gdGFza19wdF9yZWdzKHQpLT5pcnA7CiB9CiAKIHN0YXRpYyB2b2lkIGtlcm5lbF90aHJlYWRfaGVscGVyKHZvaWQqIGR1bW15LCBpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqIGFyZykKQEAgLTEyOCw3ICsxMjgsNyBAQAogCSAqIHJlbWVtYmVyIHRoYXQgdGhlIHRhc2tfc3RydWN0IGRvdWJsZXMgYXMgdGhlIGtlcm5lbCBzdGFjayBmb3IgdGhlIHRhc2sKIAkgKi8KIAotCWNoaWxkcmVncyA9IHVzZXJfcmVncyhwLT50aHJlYWRfaW5mbyk7ICAgICAgICAKKwljaGlsZHJlZ3MgPSB0YXNrX3B0X3JlZ3MocCk7CiAgICAgICAgIAogCSpjaGlsZHJlZ3MgPSAqcmVnczsgIC8qIHN0cnVjdCBjb3B5IG9mIHB0X3JlZ3MgKi8KICAgICAgICAgCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9wdHJhY2UuYwppbmRleCA2Y2JkMzRhLi5mMjE0Zjc0IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvcHRyYWNlLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAlpZiAocmVnbm8gPT0gUFRfVVNQKQogCQlyZXR1cm4gdGFzay0+dGhyZWFkLnVzcDsKIAllbHNlIGlmIChyZWdubyA8IFBUX01BWCkKLQkJcmV0dXJuICgodW5zaWduZWQgbG9uZyAqKXVzZXJfcmVncyh0YXNrLT50aHJlYWRfaW5mbykpW3JlZ25vXTsKKwkJcmV0dXJuICgodW5zaWduZWQgbG9uZyAqKXRhc2tfcHRfcmVncyh0YXNrKSlbcmVnbm9dOwogCWVsc2UKIAkJcmV0dXJuIDA7CiB9CkBAIC01MSw3ICs1MSw3IEBACiAJaWYgKHJlZ25vID09IFBUX1VTUCkKIAkJdGFzay0+dGhyZWFkLnVzcCA9IGRhdGE7CiAJZWxzZSBpZiAocmVnbm8gPCBQVF9NQVgpCi0JCSgodW5zaWduZWQgbG9uZyAqKXVzZXJfcmVncyh0YXNrLT50aHJlYWRfaW5mbykpW3JlZ25vXSA9IGRhdGE7CisJCSgodW5zaWduZWQgbG9uZyAqKXRhc2tfcHRfcmVncyh0YXNrKSlbcmVnbm9dID0gZGF0YTsKIAllbHNlCiAJCXJldHVybiAtMTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggODgyYmU0Mi4uODQzNTEzMSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTk2LDcgKzk2LDcgQEAKICAqLwogdW5zaWduZWQgbG9uZyB0aHJlYWRfc2F2ZWRfcGMoc3RydWN0IHRhc2tfc3RydWN0ICp0KQogewotCXJldHVybiAodW5zaWduZWQgbG9uZyl1c2VyX3JlZ3ModC0+dGhyZWFkX2luZm8pLT5lcnA7CisJcmV0dXJuIHRhc2tfcHRfcmVncyh0KS0+ZXJwOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTQ4LDcgKzE0OCw3IEBACiAJICogZml4IGl0IHVwLiBOb3RlOiB0aGUgdGFza19zdHJ1Y3QgZG91YmxlcyBhcyB0aGUga2VybmVsIHN0YWNrIGZvciB0aGUKIAkgKiB0YXNrLgogCSAqLwotCWNoaWxkcmVncyA9IHVzZXJfcmVncyhwLT50aHJlYWRfaW5mbyk7CisJY2hpbGRyZWdzID0gdGFza19wdF9yZWdzKHApOwogCSpjaGlsZHJlZ3MgPSAqcmVnczsJLyogU3RydWN0IGNvcHkgb2YgcHRfcmVncy4gKi8KICAgICAgICAgcC0+c2V0X2NoaWxkX3RpZCA9IHAtPmNsZWFyX2NoaWxkX3RpZCA9IE5VTEw7CiAgICAgICAgIGNoaWxkcmVncy0+cjEwID0gMDsJLyogQ2hpbGQgcmV0dXJucyAwIGFmdGVyIGEgZm9yay9jbG9uZS4gKi8KQEAgLTE1Nyw3ICsxNTcsNyBAQAogCSAqIFRoZSBUTFMgaXMgaW4gJG1vZiBiZWFjdXNlIGl0IGlzIHRoZSA1dGggYXJndW1lbnQgdG8gc3lzX2Nsb25lLgogCSAqLwogCWlmIChwLT5tbSAmJiAoY2xvbmVfZmxhZ3MgJiBDTE9ORV9TRVRUTFMpKSB7Ci0JCXAtPnRocmVhZF9pbmZvLT50bHMgPSByZWdzLT5tb2Y7CisJCXRhc2tfdGhyZWFkX2luZm8ocCktPnRscyA9IHJlZ3MtPm1vZjsKIAl9CiAKIAkvKiBQdXQgdGhlIHN3aXRjaCBzdGFjayByaWdodCBiZWxvdyB0aGUgcHRfcmVncy4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3B0cmFjZS5jCmluZGV4IDU1MjhiODMuLjgyY2YyZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9wdHJhY2UuYwpAQCAtNDYsNyArNDYsNyBAQAogCXVuc2lnbmVkIGxvbmcgcmV0OwogCiAJaWYgKHJlZ25vIDw9IFBUX0VEQSkKLQkJcmV0ID0gKCh1bnNpZ25lZCBsb25nICopdXNlcl9yZWdzKHRhc2stPnRocmVhZF9pbmZvKSlbcmVnbm9dOworCQlyZXQgPSAoKHVuc2lnbmVkIGxvbmcgKil0YXNrX3B0X3JlZ3ModGFzaykpW3JlZ25vXTsKIAllbHNlIGlmIChyZWdubyA9PSBQVF9VU1ApCiAJCXJldCA9IHRhc2stPnRocmVhZC51c3A7CiAJZWxzZSBpZiAocmVnbm8gPT0gUFRfUFBDKQpAQCAtNjUsMTMgKzY1LDEzIEBACiBpbnQgcHV0X3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGludCByZWdubywgdW5zaWduZWQgbG9uZyBkYXRhKQogewogCWlmIChyZWdubyA8PSBQVF9FREEpCi0JCSgodW5zaWduZWQgbG9uZyAqKXVzZXJfcmVncyh0YXNrLT50aHJlYWRfaW5mbykpW3JlZ25vXSA9IGRhdGE7CisJCSgodW5zaWduZWQgbG9uZyAqKXRhc2tfcHRfcmVncyh0YXNrKSlbcmVnbm9dID0gZGF0YTsKIAllbHNlIGlmIChyZWdubyA9PSBQVF9VU1ApCiAJCXRhc2stPnRocmVhZC51c3AgPSBkYXRhOwogCWVsc2UgaWYgKHJlZ25vID09IFBUX1BQQykgewogCQkvKiBXcml0ZSBwc2V1ZG8tUEMgdG8gRVJQIG9ubHkgaWYgY2hhbmdlZC4gKi8KIAkJaWYgKGRhdGEgIT0gZ2V0X3BzZXVkb19wYyh0YXNrKSkKLQkJCSgodW5zaWduZWQgbG9uZyAqKXVzZXJfcmVncyh0YXNrLT50aHJlYWRfaW5mbykpW1BUX0VSUF0gPSBkYXRhOworCQkJdGFza19wdF9yZWdzKHRhc2spLT5lcnAgPSBkYXRhOwogCX0gZWxzZSBpZiAocmVnbm8gPD0gUFRfTUFYKQogCQlyZXR1cm4gcHV0X2RlYnVncmVnKHRhc2stPnBpZCwgcmVnbm8sIGRhdGEpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvc21wLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3NtcC5jCmluZGV4IDEzODY3ZjQuLmRhNDBkMTkgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9zbXAuYwpAQCAtMTEzLDEwICsxMTMsMTAgQEAKIAlpZiAoSVNfRVJSKGlkbGUpKQogCQlwYW5pYygiU01QOiBmb3JrIGZhaWxlZCBmb3IgQ1BVOiVkIiwgY3B1aWQpOwogCi0JaWRsZS0+dGhyZWFkX2luZm8tPmNwdSA9IGNwdWlkOworCXRhc2tfdGhyZWFkX2luZm8oaWRsZSktPmNwdSA9IGNwdWlkOwogCiAJLyogSW5mb3JtYXRpb24gdG8gdGhlIENQVSB0aGF0IGlzIGFib3V0IHRvIGJvb3QgKi8KLQlzbXBfaW5pdF9jdXJyZW50X2lkbGVfdGhyZWFkID0gaWRsZS0+dGhyZWFkX2luZm87CisJc21wX2luaXRfY3VycmVudF9pZGxlX3RocmVhZCA9IHRhc2tfdGhyZWFkX2luZm8oaWRsZSk7CiAJY3B1X25vd19ib290aW5nID0gY3B1aWQ7CiAKIAkvKiBXYWl0IGZvciBDUFUgdG8gY29tZSBvbmxpbmUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9tbS90bGIuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tbS90bGIuYwppbmRleCBiMDhhMjhiLi45ZDc1ZDc2IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvbW0vdGxiLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21tL3RsYi5jCkBAIC0xOTgsOSArMTk4LDkgQEAKIAlwZXJfY3B1KGN1cnJlbnRfcGdkLCBjcHUpID0gbmV4dC0+cGdkOwogCiAJLyogU3dpdGNoIGNvbnRleHQgaW4gdGhlIE1NVS4gKi8KLSAgICAgICAgaWYgKHRzayAmJiB0c2stPnRocmVhZF9pbmZvKQorICAgICAgICBpZiAodHNrICYmIHRhc2tfdGhyZWFkX2luZm8odHNrKSkKICAgICAgICAgewotICAgICAgICAgIFNQRUNfUkVHX1dSKFNQRUNfUkVHX1BJRCwgbmV4dC0+Y29udGV4dC5wYWdlX2lkIHwgdHNrLT50aHJlYWRfaW5mby0+dGxzKTsKKyAgICAgICAgICBTUEVDX1JFR19XUihTUEVDX1JFR19QSUQsIG5leHQtPmNvbnRleHQucGFnZV9pZCB8IHRhc2tfdGhyZWFkX2luZm8odHNrKS0+dGxzKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9rZXJuZWwvY3Jpc2tzeW1zLmMgYi9hcmNoL2NyaXMva2VybmVsL2NyaXNrc3ltcy5jCmluZGV4IDg1ODMzZDcuLmRlMzk3MjUgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9rZXJuZWwvY3Jpc2tzeW1zLmMKKysrIGIvYXJjaC9jcmlzL2tlcm5lbC9jcmlza3N5bXMuYwpAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL2Zhc3R0aW1lci5oPgogCi1leHRlcm4gdm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgdXNlciAqKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGdldF9jbW9zX3RpbWUodm9pZCk7CiBleHRlcm4gdm9pZCBfX1VkaXYodm9pZCk7CiBleHRlcm4gdm9pZCBfX1Vtb2Qodm9pZCk7CkBAIC0zMyw3ICszMiw2IEBACiBleHRlcm4gdm9pZCBpb3VubWFwKHZvbGF0aWxlIHZvaWQgKiBfX2lvbWVtKTsKIAogLyogUGxhdGZvcm0gZGVwZW5kZW50IHN1cHBvcnQgKi8KLUVYUE9SVF9TWU1CT0woZHVtcF90aHJlYWQpOwogRVhQT1JUX1NZTUJPTChrZXJuZWxfdGhyZWFkKTsKIEVYUE9SVF9TWU1CT0woZ2V0X2Ntb3NfdGltZSk7CiBFWFBPUlRfU1lNQk9MKGxvb3BzX3Blcl91c2VjKTsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9jcmlzL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggN2M4MGFmYi4uNGFiM2U4NzExIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2NyaXMva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjU3LDM0ICsyNTcsNiBAQAogewogfQogCi0vKgotICogZmlsbCBpbiB0aGUgdXNlciBzdHJ1Y3R1cmUgZm9yIGEgY29yZSBkdW1wLi4KLSAqLwotdm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIHN0cnVjdCB1c2VyICogZHVtcCkKLXsKLSNpZiAwCi0JaW50IGk7Ci0KLQkvKiBjaGFuZ2VkIHRoZSBzaXplIGNhbGN1bGF0aW9ucyAtIHNob3VsZCBob3BlZnVsbHkgd29yayBiZXR0ZXIuIGxidCAqLwotCWR1bXAtPm1hZ2ljID0gQ01BR0lDOwotCWR1bXAtPnN0YXJ0X2NvZGUgPSAwOwotCWR1bXAtPnN0YXJ0X3N0YWNrID0gcmVncy0+ZXNwICYgfihQQUdFX1NJWkUgLSAxKTsKLQlkdW1wLT51X3RzaXplID0gKCh1bnNpZ25lZCBsb25nKSBjdXJyZW50LT5tbS0+ZW5kX2NvZGUpID4+IFBBR0VfU0hJRlQ7Ci0JZHVtcC0+dV9kc2l6ZSA9ICgodW5zaWduZWQgbG9uZykgKGN1cnJlbnQtPm1tLT5icmsgKyAoUEFHRV9TSVpFLTEpKSkgPj4gUEFHRV9TSElGVDsKLQlkdW1wLT51X2RzaXplIC09IGR1bXAtPnVfdHNpemU7Ci0JZHVtcC0+dV9zc2l6ZSA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJZHVtcC0+dV9kZWJ1Z3JlZ1tpXSA9IGN1cnJlbnQtPmRlYnVncmVnW2ldOyAgCi0KLQlpZiAoZHVtcC0+c3RhcnRfc3RhY2sgPCBUQVNLX1NJWkUpCi0JCWR1bXAtPnVfc3NpemUgPSAoKHVuc2lnbmVkIGxvbmcpIChUQVNLX1NJWkUgLSBkdW1wLT5zdGFydF9zdGFjaykpID4+IFBBR0VfU0hJRlQ7Ci0KLQlkdW1wLT5yZWdzID0gKnJlZ3M7Ci0KLQlkdW1wLT51X2ZwdmFsaWQgPSBkdW1wX2ZwdSAocmVncywgJmR1bXAtPmkzODcpOwotI2VuZGlmIAotfQotCiAvKiBGaWxsIGluIHRoZSBmcHUgc3RydWN0dXJlIGZvciBhIGNvcmUgZHVtcC4gKi8KIGludCBkdW1wX2ZwdShzdHJ1Y3QgcHRfcmVncyAqcmVncywgZWxmX2ZwcmVnc2V0X3QgKmZwdSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L0tjb25maWcgYi9hcmNoL2Zydi9LY29uZmlnCmluZGV4IGVjODVjMGQuLjYwYTYxN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L0tjb25maWcKKysrIGIvYXJjaC9mcnYvS2NvbmZpZwpAQCAtNiwxMCArNiw2IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCi1jb25maWcgVUlEMTYKLQlib29sCi0JZGVmYXVsdCB5Ci0KIGNvbmZpZyBSV1NFTV9HRU5FUklDX1NQSU5MT0NLCiAJYm9vbAogCWRlZmF1bHQgeQpAQCAtMjc0LDYgKzI3MCwxMSBAQAogCiBlbmRjaG9pY2UKIAorY29uZmlnIEZSVl9PTkNQVV9TRVJJQUwKKwlib29sICJVc2Ugb24tQ1BVIHNlcmlhbCBwb3J0cyIKKwlzZWxlY3QgU0VSSUFMXzgyNTAKKwlkZWZhdWx0IHkKKwogY29uZmlnIFBDSQogCWJvb2wgIlVzZSBQQ0kiCiAJZGVwZW5kcyBvbiBNQjkzMDkwX01CMDAKQEAgLTMwNSwyMyArMzA2LDcgQEAKIAogc291cmNlICJkcml2ZXJzL3BjaS9LY29uZmlnIgogCi1jb25maWcgUENNQ0lBCi0JdHJpc3RhdGUgIlVzZSBQQ01DSUEiCi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBhdHRhY2ggUENNQ0lBLSBvciBQQy1jYXJkcyB0byB5b3VyIEZSLVYKLQkgIGJvYXJkLiAgVGhlc2UgYXJlIGNyZWRpdC1jYXJkIHNpemUgZGV2aWNlcyBzdWNoIGFzIG5ldHdvcmsgY2FyZHMsCi0JICBtb2RlbXMgb3IgaGFyZCBkcml2ZXMgb2Z0ZW4gdXNlZCB3aXRoIGxhcHRvcHMgY29tcHV0ZXJzLiAgVGhlcmUgYXJlCi0JICBhY3R1YWxseSB0d28gdmFyaWV0aWVzIG9mIHRoZXNlIGNhcmRzOiB0aGUgb2xkZXIgMTYgYml0IFBDTUNJQSBjYXJkcwotCSAgYW5kIHRoZSBuZXdlciAzMiBiaXQgQ2FyZEJ1cyBjYXJkcy4gIElmIHlvdSB3YW50IHRvIHVzZSBDYXJkQnVzCi0JICBjYXJkcywgeW91IG5lZWQgdG8gc2F5IFkgaGVyZSBhbmQgYWxzbyB0byAiQ2FyZEJ1cyBzdXBwb3J0IiBiZWxvdy4KLQotCSAgVG8gdXNlIHlvdXIgUEMtY2FyZHMsIHlvdSB3aWxsIG5lZWQgc3VwcG9ydGluZyBzb2Z0d2FyZSBmcm9tIERhdmlkCi0JICBIaW5kcyBwY21jaWEtY3MgcGFja2FnZSAoc2VlIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vQ2hhbmdlcz4KLQkgIGZvciBsb2NhdGlvbikuICBQbGVhc2UgYWxzbyByZWFkIHRoZSBQQ01DSUEtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCi0JICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIG1vZHVsZXMsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlcyB3aWxsIGJlIGNhbGxlZCBwY21jaWFfY29yZSBhbmQgZHMuCitzb3VyY2UgImRyaXZlcnMvcGNtY2lhL0tjb25maWciCiAKICNjb25maWcgTUFUSF9FTVVMQVRJT04KICMJYm9vbCAiTWF0aCBlbXVsYXRpb24gc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L0tjb25maWcuZGVidWcgYi9hcmNoL2Zydi9LY29uZmlnLmRlYnVnCmluZGV4IDAwMzRiNjUuLjIxMWYwMWIgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L0tjb25maWcuZGVidWcKKysrIGIvYXJjaC9mcnYvS2NvbmZpZy5kZWJ1ZwpAQCAtMiwzMiArMiwxMCBAQAogCiBzb3VyY2UgImxpYi9LY29uZmlnLmRlYnVnIgogCi1jb25maWcgRUFSTFlfUFJJTlRLCi0JYm9vbCAiRWFybHkgcHJpbnRrIgotCWRlcGVuZHMgb24gRU1CRURERUQgJiYgREVCVUdfS0VSTkVMCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgV3JpdGUga2VybmVsIGxvZyBvdXRwdXQgZGlyZWN0bHkgaW50byB0aGUgVkdBIGJ1ZmZlciBvciB0byBhIHNlcmlhbAotCSAgcG9ydC4KLQotCSAgVGhpcyBpcyB1c2VmdWwgZm9yIGtlcm5lbCBkZWJ1Z2dpbmcgd2hlbiB5b3VyIG1hY2hpbmUgY3Jhc2hlcyB2ZXJ5Ci0JICBlYXJseSBiZWZvcmUgdGhlIGNvbnNvbGUgY29kZSBpcyBpbml0aWFsaXplZC4gRm9yIG5vcm1hbCBvcGVyYXRpb24KLQkgIGl0IGlzIG5vdCByZWNvbW1lbmRlZCBiZWNhdXNlIGl0IGxvb2tzIHVnbHkgYW5kIGRvZXNuJ3QgY29vcGVyYXRlCi0JICB3aXRoIGtsb2dkL3N5c2xvZ2Qgb3IgdGhlIFggc2VydmVyLiBZb3Ugc2hvdWxkIG5vcm1hbGx5IE4gaGVyZSwKLQkgIHVubGVzcyB5b3Ugd2FudCB0byBkZWJ1ZyBzdWNoIGEgY3Jhc2guCi0KIGNvbmZpZyBERUJVR19TVEFDS09WRVJGTE9XCiAJYm9vbCAiQ2hlY2sgZm9yIHN0YWNrIG92ZXJmbG93cyIKIAlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAogCi1jb25maWcgREVCVUdfUEFHRUFMTE9DCi0JYm9vbCAiUGFnZSBhbGxvYyBkZWJ1Z2dpbmciCi0JZGVwZW5kcyBvbiBERUJVR19LRVJORUwKLQloZWxwCi0JICBVbm1hcCBwYWdlcyBmcm9tIHRoZSBrZXJuZWwgbGluZWFyIG1hcHBpbmcgYWZ0ZXIgZnJlZV9wYWdlcygpLgotCSAgVGhpcyByZXN1bHRzIGluIGEgbGFyZ2Ugc2xvd2Rvd24sIGJ1dCBoZWxwcyB0byBmaW5kIGNlcnRhaW4gdHlwZXMKLQkgIG9mIG1lbW9yeSBjb3JydXB0aW9ucy4KLQogY29uZmlnIEdEQlNUVUIKIAlib29sICJSZW1vdGUgR0RCIGtlcm5lbCBkZWJ1Z2dpbmciCiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L01ha2VmaWxlIGIvYXJjaC9mcnYvTWFrZWZpbGUKaW5kZXggNTQwNDZkMi4uOTBjMGZiOCAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvTWFrZWZpbGUKKysrIGIvYXJjaC9mcnYvTWFrZWZpbGUKQEAgLTEwOSwxMCArMTA5LDEwIEBACiAJJChRKSQoTUFLRUJPT1QpIGJvb3RzdHJhcAogCiBhcmNobXJwcm9wZXI6Ci0JJChRKSQoTUFLRSkgLUMgYXJjaC9mcnYvYm9vdCBtcnByb3BlcgorCSQoUSkkKE1BS0UpICQoYnVpbGQpPWFyY2gvZnJ2L2Jvb3QgbXJwcm9wZXIKIAogYXJjaGNsZWFuOgotCSQoUSkkKE1BS0UpIC1DIGFyY2gvZnJ2L2Jvb3QgY2xlYW4KKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT1hcmNoL2Zydi9ib290IGNsZWFuCiAKIGFyY2hkZXA6IHNjcmlwdHMvbWtkZXAgc3ltbGlua3MKLQkkKFEpJChNQUtFKSAtQyBhcmNoL2Zydi9ib290IGRlcAorCSQoUSkkKE1BS0UpICQoYnVpbGQpPWFyY2gvZnJ2L2Jvb3QgZGVwCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9ib290L01ha2VmaWxlIGIvYXJjaC9mcnYvYm9vdC9NYWtlZmlsZQppbmRleCBkNzVlMGQ3Li41ZGZjOTNmIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvZnJ2L2Jvb3QvTWFrZWZpbGUKQEAgLTU3LDEwICs1NywxMCBAQAogIyBpbnN0YWxsYXRpb24KICMKIGluc3RhbGw6ICQoQ09ORklHVVJFKSBJbWFnZQotCXNoIC4vaW5zdGFsbC5zaCAkKFZFUlNJT04pLiQoUEFUQ0hMRVZFTCkuJChTVUJMRVZFTCkkKEVYVFJBVkVSU0lPTikgSW1hZ2UgJChUT1BESVIpL1N5c3RlbS5tYXAgIiQoSU5TVEFMTF9QQVRIKSIKKwlzaCAuL2luc3RhbGwuc2ggJChLRVJORUxSRUxFQVNFKSBJbWFnZSAkKFRPUERJUikvU3lzdGVtLm1hcCAiJChJTlNUQUxMX1BBVEgpIgogCiB6aW5zdGFsbDogJChDT05GSUdVUkUpIHpJbWFnZQotCXNoIC4vaW5zdGFsbC5zaCAkKFZFUlNJT04pLiQoUEFUQ0hMRVZFTCkuJChTVUJMRVZFTCkkKEVYVFJBVkVSU0lPTikgekltYWdlICQoVE9QRElSKS9TeXN0ZW0ubWFwICIkKElOU1RBTExfUEFUSCkiCisJc2ggLi9pbnN0YWxsLnNoICQoS0VSTkVMUkVMRUFTRSkgekltYWdlICQoVE9QRElSKS9TeXN0ZW0ubWFwICIkKElOU1RBTExfUEFUSCkiCiAKICMKICMgbWlzY2VsbGFueQpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL01ha2VmaWxlIGIvYXJjaC9mcnYva2VybmVsL01ha2VmaWxlCmluZGV4IDQyMmYzMGUuLjVhODI3YjMgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL2Zydi9rZXJuZWwvTWFrZWZpbGUKQEAgLTIxLDMgKzIxLDQgQEAKIG9iai0kKENPTkZJR19NQjkzMDkzX1BESykJKz0gcG0tbWI5MzA5My5vCiBvYmotJChDT05GSUdfU1lTQ1RMKQkJKz0gc3lzY3RsLm8KIG9iai0kKENPTkZJR19GVVRFWCkJCSs9IGZ1dGV4Lm8KK29iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gbW9kdWxlLm8KZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9mcnZfa3N5bXMuYyBiL2FyY2gvZnJ2L2tlcm5lbC9mcnZfa3N5bXMuYwppbmRleCAxYTc2ZDUyLi4wZjFjNmNiIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvZnJ2X2tzeW1zLmMKKysrIGIvYXJjaC9mcnYva2VybmVsL2Zydl9rc3ltcy5jCkBAIC0xNiwxNyArMTYsMTYgQEAKICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmRpcnEuaD4KLSNpbmNsdWRlIDxhc20vY3VycmVudC5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKLWV4dGVybiB2b2lkIGR1bXBfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICosIHN0cnVjdCB1c2VyICopOwogZXh0ZXJuIGxvbmcgX19tZW1jcHlfdXNlcih2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGNvdW50KTsKK2V4dGVybiBsb25nIF9fbWVtc2V0X3VzZXIodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBjb3VudCk7CiAKIC8qIHBsYXRmb3JtIGRlcGVuZGVudCBzdXBwb3J0ICovCiAKIEVYUE9SVF9TWU1CT0woX19pb3JlbWFwKTsKIEVYUE9SVF9TWU1CT0woaW91bm1hcCk7CiAKLUVYUE9SVF9TWU1CT0woZHVtcF90aHJlYWQpOwogRVhQT1JUX1NZTUJPTChzdHJubGVuKTsKIEVYUE9SVF9TWU1CT0woc3RycmNocik7CiBFWFBPUlRfU1lNQk9MKHN0cnN0cik7CkBAIC01MCw3ICs0OSwxMSBAQAogRVhQT1JUX1NZTUJPTChfX3Jlc19idXNfY2xvY2tfc3BlZWRfSFopOwogRVhQT1JUX1NZTUJPTChfX3BhZ2Vfb2Zmc2V0KTsKIEVYUE9SVF9TWU1CT0woX19tZW1jcHlfdXNlcik7Ci1FWFBPUlRfU1lNQk9MKGZsdXNoX2RjYWNoZV9wYWdlKTsKK0VYUE9SVF9TWU1CT0woX19tZW1zZXRfdXNlcik7CitFWFBPUlRfU1lNQk9MKGZydl9kY2FjaGVfd3JpdGViYWNrKTsKK0VYUE9SVF9TWU1CT0woZnJ2X2NhY2hlX2ludmFsaWRhdGUpOworRVhQT1JUX1NZTUJPTChmcnZfaWNhY2hlX2ludmFsaWRhdGUpOworRVhQT1JUX1NZTUJPTChmcnZfY2FjaGVfd2JhY2tfaW52KTsKIAogI2lmbmRlZiBDT05GSUdfTU1VCiBFWFBPUlRfU1lNQk9MKG1lbW9yeV9zdGFydCk7CkBAIC03Miw2ICs3NSw5IEBACiBFWFBPUlRfU1lNQk9MKG1lbXNjYW4pOwogRVhQT1JUX1NZTUJPTChtZW1tb3ZlKTsKIAorRVhQT1JUX1NZTUJPTChfX291dHNsX25zKTsKK0VYUE9SVF9TWU1CT0woX19pbnNsX25zKTsKKwogRVhQT1JUX1NZTUJPTChnZXRfd2NoYW4pOwogCiAjaWZkZWYgQ09ORklHX0ZSVl9PVVRPRkxJTkVfQVRPTUlDX09QUwpAQCAtODAsMTQgKzg2LDEzIEBACiBFWFBPUlRfU1lNQk9MKGF0b21pY190ZXN0X2FuZF9YT1JfbWFzayk7CiBFWFBPUlRfU1lNQk9MKGF0b21pY19hZGRfcmV0dXJuKTsKIEVYUE9SVF9TWU1CT0woYXRvbWljX3N1Yl9yZXR1cm4pOwotRVhQT1JUX1NZTUJPTChfX3hjaGdfOCk7Ci1FWFBPUlRfU1lNQk9MKF9feGNoZ18xNik7CiBFWFBPUlRfU1lNQk9MKF9feGNoZ18zMik7Ci1FWFBPUlRfU1lNQk9MKF9fY21weGNoZ184KTsKLUVYUE9SVF9TWU1CT0woX19jbXB4Y2hnXzE2KTsKIEVYUE9SVF9TWU1CT0woX19jbXB4Y2hnXzMyKTsKICNlbmRpZgogCitFWFBPUlRfU1lNQk9MKF9fZGVidWdfYnVnX3ByaW50ayk7CitFWFBPUlRfU1lNQk9MKF9fZGVsYXlfbG9vcHNfTUh6KTsKKwogLyoKICAqIGxpYmdjYyBmdW5jdGlvbnMgLSBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZQogICogY29tcGlsZXIuLi4gIChwcm90b3R5cGVzIGFyZSBub3QgY29ycmVjdCB0aG91Z2gsIGJ1dCB0aGF0CkBAIC0xMDEsNiArMTA2LDggQEAKIGV4dGVybiB2b2lkIF9fbHNocmRpMyh2b2lkKTsKIGV4dGVybiB2b2lkIF9fbW9kZGkzKHZvaWQpOwogZXh0ZXJuIHZvaWQgX19tdWxkaTModm9pZCk7CitleHRlcm4gdm9pZCBfX211bGxsKHZvaWQpOworZXh0ZXJuIHZvaWQgX191bXVsbGwodm9pZCk7CiBleHRlcm4gdm9pZCBfX25lZ2RpMih2b2lkKTsKIGV4dGVybiB2b2lkIF9fdWNtcGRpMih2b2lkKTsKIGV4dGVybiB2b2lkIF9fdWRpdmRpMyh2b2lkKTsKQEAgLTExNiw4ICsxMjMsMTAgQEAKIEVYUE9SVF9TWU1CT0woX19sc2hyZGkzKTsKIC8vRVhQT1JUX1NZTUJPTChfX21vZGRpMyk7CiBFWFBPUlRfU1lNQk9MKF9fbXVsZGkzKTsKK0VYUE9SVF9TWU1CT0woX19tdWxsbCk7CitFWFBPUlRfU1lNQk9MKF9fdW11bGxsKTsKIEVYUE9SVF9TWU1CT0woX19uZWdkaTIpOwotLy9FWFBPUlRfU1lNQk9MKF9fdWNtcGRpMik7CitFWFBPUlRfU1lNQk9MKF9fdWNtcGRpMik7CiAvL0VYUE9SVF9TWU1CT0woX191ZGl2ZGkzKTsKIC8vRVhQT1JUX1NZTUJPTChfX3VkaXZtb2RkaTQpOwogLy9FWFBPUlRfU1lNQk9MKF9fdW1vZGRpMyk7CmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvaXJxLmMgYi9hcmNoL2Zydi9rZXJuZWwvaXJxLmMKaW5kZXggOGM1MjRjZC4uNTk1ODBjNSAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL2lycS5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC9pcnEuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtMTc4LDYgKzE3OSw4IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGV2ZWwtPmxvY2ssIGZsYWdzKTsKIH0KIAorRVhQT1JUX1NZTUJPTChkaXNhYmxlX2lycV9ub3N5bmMpOworCiAvKioKICAqCWRpc2FibGVfaXJxIC0gZGlzYWJsZSBhbiBpcnEgYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24KICAqCUBpcnE6IEludGVycnVwdCB0byBkaXNhYmxlCkBAIC0yMDQsNiArMjA3LDggQEAKICNlbmRpZgogfQogCitFWFBPUlRfU1lNQk9MKGRpc2FibGVfaXJxKTsKKwogLyoqCiAgKgllbmFibGVfaXJxIC0gZW5hYmxlIGhhbmRsaW5nIG9mIGFuIGlycQogICoJQGlycTogSW50ZXJydXB0IHRvIGVuYWJsZQpAQCAtMjY4LDYgKzI3Myw4IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGV2ZWwtPmxvY2ssIGZsYWdzKTsKIH0KIAorRVhQT1JUX1NZTUJPTChlbmFibGVfaXJxKTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGhhbmRsZXMgYWxsIG5vcm1hbCBkZXZpY2UgSVJRJ3MKQEAgLTQyNSw2ICs0MzIsOCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKK0VYUE9SVF9TWU1CT0wocmVxdWVzdF9pcnEpOworCiAvKioKICAqCWZyZWVfaXJxIC0gZnJlZSBhbiBpbnRlcnJ1cHQKICAqCUBpcnE6IEludGVycnVwdCBsaW5lIHRvIGZyZWUKQEAgLTQ5Niw2ICs1MDUsOCBAQAogCX0KIH0KIAorRVhQT1JUX1NZTUJPTChmcmVlX2lycSk7CisKIC8qCiAgKiBJUlEgYXV0b2RldGVjdGlvbiBjb2RlLi4KICAqCkBAIC01MTksNiArNTMwLDggQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChwcm9iZV9pcnFfb24pOworCiAvKgogICogUmV0dXJuIGEgbWFzayBvZiB0cmlnZ2VyZWQgaW50ZXJydXB0cyAodGhpcwogICogY2FuIGhhbmRsZSBvbmx5IGxlZ2FjeSBJU0EgaW50ZXJydXB0cykuCkBAIC01NDIsNiArNTU1LDggQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChwcm9iZV9pcnFfbWFzayk7CisKIC8qCiAgKiBSZXR1cm4gdGhlIG9uZSBpbnRlcnJ1cHQgdGhhdCB0cmlnZ2VyZWQgKHRoaXMgY2FuCiAgKiBoYW5kbGUgYW55IGludGVycnVwdCBzb3VyY2UpLgpAQCAtNTcxLDYgKzU4Niw4IEBACiAJcmV0dXJuIC0xOwogfQogCitFWFBPUlRfU1lNQk9MKHByb2JlX2lycV9vZmYpOworCiAvKiB0aGlzIHdhcyBzZXR1cF94ODZfaXJxIGJ1dCBpdCBzZWVtcyBwcmV0dHkgZ2VuZXJpYyAqLwogaW50IHNldHVwX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxYWN0aW9uICpuZXcpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL2Zydi9rZXJuZWwvbW9kdWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUwZDE2OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC9tb2R1bGUuYwpAQCAtMCwwICsxLDgwIEBACisvKiBtb2R1bGUuYzogRlJWIHNwZWNpZmljIG1vZHVsZSBsb2FkaW5nIGJpdHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICogLSBEZXJpdmVkIGZyb20gYXJjaC9pMzg2L2tlcm5lbC9tb2R1bGUuYywgQ29weXJpZ2h0IChDKSAyMDAxIFJ1c3R5IFJ1c3NlbGwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZWxvYWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaWYgMAorI2RlZmluZSBERUJVR1AgcHJpbnRrCisjZWxzZQorI2RlZmluZSBERUJVR1AoZm10Li4uKQorI2VuZGlmCisKK3ZvaWQgKm1vZHVsZV9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaWYgKHNpemUgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gdm1hbGxvY19leGVjKHNpemUpOworfQorCisKKy8qIEZyZWUgbWVtb3J5IHJldHVybmVkIGZyb20gbW9kdWxlX2FsbG9jICovCit2b2lkIG1vZHVsZV9mcmVlKHN0cnVjdCBtb2R1bGUgKm1vZCwgdm9pZCAqbW9kdWxlX3JlZ2lvbikKK3sKKwl2ZnJlZShtb2R1bGVfcmVnaW9uKTsKKwkvKiBGSVhNRTogSWYgbW9kdWxlX3JlZ2lvbiA9PSBtb2QtPmluaXRfcmVnaW9uLCB0cmltIGV4Y2VwdGlvbgorICAgICAgICAgICB0YWJsZSBlbnRyaWVzLiAqLworfQorCisvKiBXZSBkb24ndCBuZWVkIGFueXRoaW5nIHNwZWNpYWwuICovCitpbnQgbW9kdWxlX2Zyb2JfYXJjaF9zZWN0aW9ucyhFbGZfRWhkciAqaGRyLAorCQkJICAgICAgRWxmX1NoZHIgKnNlY2hkcnMsCisJCQkgICAgICBjaGFyICpzZWNzdHJpbmdzLAorCQkJICAgICAgc3RydWN0IG1vZHVsZSAqbW9kKQoreworCXJldHVybiAwOworfQorCitpbnQgYXBwbHlfcmVsb2NhdGUoRWxmMzJfU2hkciAqc2VjaGRycywKKwkJICAgY29uc3QgY2hhciAqc3RydGFiLAorCQkgICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCisJCSAgIHVuc2lnbmVkIGludCByZWxzZWMsCisJCSAgIHN0cnVjdCBtb2R1bGUgKm1lKQoreworCXByaW50ayhLRVJOX0VSUiAibW9kdWxlICVzOiBBREQgUkVMT0NBVElPTiB1bnN1cHBvcnRlZFxuIiwgbWUtPm5hbWUpOworCXJldHVybiAtRU5PRVhFQzsKK30KKworaW50IGFwcGx5X3JlbG9jYXRlX2FkZChFbGYzMl9TaGRyICpzZWNoZHJzLAorCQkgICAgICAgY29uc3QgY2hhciAqc3RydGFiLAorCQkgICAgICAgdW5zaWduZWQgaW50IHN5bWluZGV4LAorCQkgICAgICAgdW5zaWduZWQgaW50IHJlbHNlYywKKwkJICAgICAgIHN0cnVjdCBtb2R1bGUgKm1lKQoreworCXByaW50ayhLRVJOX0VSUiAibW9kdWxlICVzOiBBREQgUkVMT0NBVElPTiB1bnN1cHBvcnRlZFxuIiwgbWUtPm5hbWUpOworCXJldHVybiAtRU5PRVhFQzsKK30KKworaW50IG1vZHVsZV9maW5hbGl6ZShjb25zdCBFbGZfRWhkciAqaGRyLAorCQkgICAgY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMsCisJCSAgICBzdHJ1Y3QgbW9kdWxlICptZSkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtb2R1bGVfYXJjaF9jbGVhbnVwKHN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKK30KZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9wbS5jIGIvYXJjaC9mcnYva2VybmVsL3BtLmMKaW5kZXggNzEyYzNjMi4uZjBiOGZmZiAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL3BtLmMKKysrIGIvYXJjaC9mcnYva2VybmVsL3BtLmMKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX2xlZ2FjeS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CkBAIC0yNyw2ICsyOCw3IEBACiAjaW5jbHVkZSAibG9jYWwuaCIKIAogdm9pZCAoKnBtX3Bvd2VyX29mZikodm9pZCk7CitFWFBPUlRfU1lNQk9MKHBtX3Bvd2VyX29mZik7CiAKIGV4dGVybiB2b2lkIGZydl9jaGFuZ2VfY21vZGUoaW50KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvZnJ2L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNTRhNDUyMS4uMGZmZjhhNiAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2Zydi9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0yMDQsNyArMjA0LDcgQEAKIAogCXJlZ3MwID0gX19rZXJuZWxfZnJhbWUwX3B0cjsKIAljaGlsZHJlZ3MwID0gKHN0cnVjdCBwdF9yZWdzICopCi0JCSgodW5zaWduZWQgbG9uZykgcC0+dGhyZWFkX2luZm8gKyBUSFJFQURfU0laRSAtIFVTRVJfQ09OVEVYVF9TSVpFKTsKKwkJKHRhc2tfc3RhY2tfcGFnZShwKSArIFRIUkVBRF9TSVpFIC0gVVNFUl9DT05URVhUX1NJWkUpOwogCWNoaWxkcmVncyA9IGNoaWxkcmVnczA7CiAKIAkvKiBzZXQgdXAgdGhlIHVzZXJzcGFjZSBmcmFtZSAodGhlIG9ubHkgcGxhY2UgdGhhdCB0aGUgVVNQIGlzIHN0b3JlZCkgKi8KQEAgLTIyMCw3ICsyMjAsNyBAQAogCQkqY2hpbGRyZWdzID0gKnJlZ3M7CiAJCWNoaWxkcmVncy0+c3AgPSAodW5zaWduZWQgbG9uZykgY2hpbGRyZWdzMDsKIAkJY2hpbGRyZWdzLT5uZXh0X2ZyYW1lID0gY2hpbGRyZWdzMDsKLQkJY2hpbGRyZWdzLT5ncjE1ID0gKHVuc2lnbmVkIGxvbmcpIHAtPnRocmVhZF9pbmZvOworCQljaGlsZHJlZ3MtPmdyMTUgPSAodW5zaWduZWQgbG9uZykgdGFza190aHJlYWRfaW5mbyhwKTsKIAkJY2hpbGRyZWdzLT5ncjI5ID0gKHVuc2lnbmVkIGxvbmcpIHA7CiAJfQogCkBAIC0yNDQsMjggKzI0NCw2IEBACiB9IC8qIGVuZCBjb3B5X3RocmVhZCgpICovCiAKIC8qCi0gKiBmaWxsIGluIHRoZSB1c2VyIHN0cnVjdHVyZSBmb3IgYSBjb3JlIGR1bXAuLgotICovCi12b2lkIGR1bXBfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3QgdXNlciAqZHVtcCkKLXsKLSNpZiAwCi0JLyogY2hhbmdlZCB0aGUgc2l6ZSBjYWxjdWxhdGlvbnMgLSBzaG91bGQgaG9wZWZ1bGx5IHdvcmsgYmV0dGVyLiBsYnQgKi8KLQlkdW1wLT5tYWdpYyA9IENNQUdJQzsKLQlkdW1wLT5zdGFydF9jb2RlID0gMDsKLQlkdW1wLT5zdGFydF9zdGFjayA9IHVzZXJfc3RhY2socmVncykgJiB+KFBBR0VfU0laRSAtIDEpOwotCWR1bXAtPnVfdHNpemUgPSAoKHVuc2lnbmVkIGxvbmcpIGN1cnJlbnQtPm1tLT5lbmRfY29kZSkgPj4gUEFHRV9TSElGVDsKLQlkdW1wLT51X2RzaXplID0gKCh1bnNpZ25lZCBsb25nKSAoY3VycmVudC0+bW0tPmJyayArIChQQUdFX1NJWkUtMSkpKSA+PiBQQUdFX1NISUZUOwotCWR1bXAtPnVfZHNpemUgLT0gZHVtcC0+dV90c2l6ZTsKLQlkdW1wLT51X3NzaXplID0gMDsKLQotCWlmIChkdW1wLT5zdGFydF9zdGFjayA8IFRBU0tfU0laRSkKLQkJZHVtcC0+dV9zc2l6ZSA9ICgodW5zaWduZWQgbG9uZykgKFRBU0tfU0laRSAtIGR1bXAtPnN0YXJ0X3N0YWNrKSkgPj4gUEFHRV9TSElGVDsKLQotCWR1bXAtPnJlZ3MgPSAqKHN0cnVjdCB1c2VyX2NvbnRleHQgKikgcmVnczsKLSNlbmRpZgotfQotCi0vKgogICogc3lzX2V4ZWN2ZSgpIGV4ZWN1dGVzIGEgbmV3IHByb2dyYW0uCiAgKi8KIGFzbWxpbmthZ2UgaW50IHN5c19leGVjdmUoY2hhciAqbmFtZSwgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKQpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL3NldHVwLmMgYi9hcmNoL2Zydi9rZXJuZWwvc2V0dXAuYwppbmRleCA3NjdlYmI1Li41OTA4ZGVhIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2Zydi9rZXJuZWwvc2V0dXAuYwpAQCAtNzg3LDYgKzc4Nyw3IEBACiAjZW5kaWYKIAogCS8qIHJlZ2lzdGVyIHRob3NlIHNlcmlhbCBwb3J0cyB0aGF0IGFyZSBhdmFpbGFibGUgKi8KKyNpZmRlZiBDT05GSUdfRlJWX09OQ1BVX1NFUklBTAogI2lmbmRlZiBDT05GSUdfR0RCU1RVQl9VQVJUMAogCV9fcmVnKFVBUlQwX0JBU0UgKyBVQVJUX0lFUiAqIDgpID0gMDsKIAllYXJseV9zZXJpYWxfc2V0dXAoJl9fZnJ2X3VhcnQwKTsKQEAgLTc5NSw2ICs3OTYsNyBAQAogCV9fcmVnKFVBUlQxX0JBU0UgKyBVQVJUX0lFUiAqIDgpID0gMDsKIAllYXJseV9zZXJpYWxfc2V0dXAoJl9fZnJ2X3VhcnQxKTsKICNlbmRpZgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19DSFJfREVWX0ZMQVNIKSB8fCBkZWZpbmVkKENPTkZJR19CTEtfREVWX0ZMQVNIKQogCS8qIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgRmxhc2hyb20gZGV2aWNlIGhlcmUgc2luY2Ugd2UgbWlnaHQKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvZnJ2L2tlcm5lbC9zaWduYWwuYwppbmRleCA1YjcxNDZmLi42NzljMWQ1IDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9mcnYva2VybmVsL3NpZ25hbC5jCkBAIC0zNSw3NCArMzUsMjIgQEAKIAl1bnNpZ25lZCBsb25nCUdPVDsKIH07CiAKLXN0YXRpYyBpbnQgZG9fc2lnbmFsKHNpZ3NldF90ICpvbGRzZXQpOwotCiAvKgogICogQXRvbWljYWxseSBzd2FwIGluIHRoZSBuZXcgc2lnbmFsIG1hc2ssIGFuZCB3YWl0IGZvciBhIHNpZ25hbC4KICAqLwogYXNtbGlua2FnZSBpbnQgc3lzX3NpZ3N1c3BlbmQoaW50IGhpc3RvcnkwLCBpbnQgaGlzdG9yeTEsIG9sZF9zaWdzZXRfdCBtYXNrKQogewotCXNpZ3NldF90IHNhdmVzZXQ7Ci0KIAltYXNrICY9IF9CTE9DS0FCTEU7CiAJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0Jc2F2ZXNldCA9IGN1cnJlbnQtPmJsb2NrZWQ7CisJY3VycmVudC0+c2F2ZWRfc2lnbWFzayA9IGN1cnJlbnQtPmJsb2NrZWQ7CiAJc2lnaW5pdHNldCgmY3VycmVudC0+YmxvY2tlZCwgbWFzayk7CiAJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKIAlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogCi0JX19mcmFtZS0+Z3I4ID0gLUVJTlRSOwotCXdoaWxlICgxKSB7Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQlzY2hlZHVsZSgpOwotCQlpZiAoZG9fc2lnbmFsKCZzYXZlc2V0KSkKLQkJCS8qIHJldHVybiB0aGUgc2lnbmFsIG51bWJlciBhcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24KLQkJCSAqIC0gdGhpcyBpcyBhbiB1dHRlcmx5IGV2aWwgaGFjay4gc3lzY2FsbHMgc2hvdWxkIG5vdCBpbnZva2UgZG9fc2lnbmFsKCkKLQkJCSAqICAgYXMgZW50cnkuUyBzZXRzIHJlZ3MtPmdyOCB0byB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBzeXN0ZW0gY2FsbAotCQkJICogLSB3ZSBjYW4ndCBqdXN0IHVzZSBzaWdwZW5kaW5nKCkgYXMgd2UnZCBoYXZlIHRvIGRpc2NhcmQgU0lHX0lHTiBzaWduYWxzCi0JCQkgKiAgIGFuZCBjYWxsIHdhaXRwaWQoKSBpZiBTSUdDSExEIG5lZWRlZCBkaXNjYXJkaW5nCi0JCQkgKiAtIHRoaXMgb25seSB3b3JrcyBvbiB0aGUgaTM4NiBiZWNhdXNlIGl0IHBhc3NlcyBhcmd1bWVudHMgdG8gdGhlIHNpZ25hbAotCQkJICogICBoYW5kbGVyIG9uIHRoZSBzdGFjaywgYW5kIHRoZSByZXR1cm4gdmFsdWUgaW4gRUFYIGlzIGVmZmVjdGl2ZWx5Ci0JCQkgKiAgIGRpc2NhcmRlZAotCQkJICovCi0JCQlyZXR1cm4gX19mcmFtZS0+Z3I4OwotCX0KLX0KLQotYXNtbGlua2FnZSBpbnQgc3lzX3J0X3NpZ3N1c3BlbmQoc2lnc2V0X3QgX191c2VyICp1bmV3c2V0LCBzaXplX3Qgc2lnc2V0c2l6ZSkKLXsKLQlzaWdzZXRfdCBzYXZlc2V0LCBuZXdzZXQ7Ci0KLQkvKiBYWFg6IERvbid0IHByZWNsdWRlIGhhbmRsaW5nIGRpZmZlcmVudCBzaXplZCBzaWdzZXRfdCdzLiAgKi8KLQlpZiAoc2lnc2V0c2l6ZSAhPSBzaXplb2Yoc2lnc2V0X3QpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3c2V0LCB1bmV3c2V0LCBzaXplb2YobmV3c2V0KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCXNpZ2RlbHNldG1hc2soJm5ld3NldCwgfl9CTE9DS0FCTEUpOwotCi0Jc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0Jc2F2ZXNldCA9IGN1cnJlbnQtPmJsb2NrZWQ7Ci0JY3VycmVudC0+YmxvY2tlZCA9IG5ld3NldDsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0KLQlfX2ZyYW1lLT5ncjggPSAtRUlOVFI7Ci0Jd2hpbGUgKDEpIHsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlKCk7Ci0JCWlmIChkb19zaWduYWwoJnNhdmVzZXQpKQotCQkJLyogcmV0dXJuIHRoZSBzaWduYWwgbnVtYmVyIGFzIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBmdW5jdGlvbgotCQkJICogLSB0aGlzIGlzIGFuIHV0dGVybHkgZXZpbCBoYWNrLiBzeXNjYWxscyBzaG91bGQgbm90IGludm9rZSBkb19zaWduYWwoKQotCQkJICogICBhcyBlbnRyeS5TIHNldHMgcmVncy0+Z3I4IHRvIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHN5c3RlbSBjYWxsCi0JCQkgKiAtIHdlIGNhbid0IGp1c3QgdXNlIHNpZ3BlbmRpbmcoKSBhcyB3ZSdkIGhhdmUgdG8gZGlzY2FyZCBTSUdfSUdOIHNpZ25hbHMKLQkJCSAqICAgYW5kIGNhbGwgd2FpdHBpZCgpIGlmIFNJR0NITEQgbmVlZGVkIGRpc2NhcmRpbmcKLQkJCSAqIC0gdGhpcyBvbmx5IHdvcmtzIG9uIHRoZSBpMzg2IGJlY2F1c2UgaXQgcGFzc2VzIGFyZ3VtZW50cyB0byB0aGUgc2lnbmFsCi0JCQkgKiAgIGhhbmRsZXIgb24gdGhlIHN0YWNrLCBhbmQgdGhlIHJldHVybiB2YWx1ZSBpbiBFQVggaXMgZWZmZWN0aXZlbHkKLQkJCSAqICAgZGlzY2FyZGVkCi0JCQkgKi8KLQkJCXJldHVybiBfX2ZyYW1lLT5ncjg7Ci0JfQorCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCXNjaGVkdWxlKCk7CisJc2V0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOworCXJldHVybiAtRVJFU1RBUlROT0hBTkQ7CiB9CiAKIGFzbWxpbmthZ2UgaW50IHN5c19zaWdhY3Rpb24oaW50IHNpZywKQEAgLTM3MiwxMSArMzIwLDExIEBACiAJICAgICAgIGZyYW1lLT5wcmV0Y29kZSk7CiAjZW5kaWYKIAotCXJldHVybiAxOworCXJldHVybiAwOwogCiBnaXZlX3NpZ3NlZ3Y6CiAJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwotCXJldHVybiAwOworCXJldHVybiAtRUZBVUxUOwogCiB9IC8qIGVuZCBzZXR1cF9mcmFtZSgpICovCiAKQEAgLTQ3MSwxMSArNDE5LDExIEBACiAJICAgICAgIGZyYW1lLT5wcmV0Y29kZSk7CiAjZW5kaWYKIAotCXJldHVybiAxOworCXJldHVybiAwOwogCiBnaXZlX3NpZ3NlZ3Y6CiAJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwotCXJldHVybiAwOworCXJldHVybiAtRUZBVUxUOwogCiB9IC8qIGVuZCBzZXR1cF9ydF9mcmFtZSgpICovCiAKQEAgLTUxNiw3ICs0NjQsNyBAQAogCWVsc2UKIAkJcmV0ID0gc2V0dXBfZnJhbWUoc2lnLCBrYSwgb2xkc2V0KTsKIAotCWlmIChyZXQpIHsKKwlpZiAocmV0ID09IDApIHsKIAkJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJCXNpZ29yc2V0cygmY3VycmVudC0+YmxvY2tlZCwgJmN1cnJlbnQtPmJsb2NrZWQsCiAJCQkgICZrYS0+c2Euc2FfbWFzayk7CkBAIC01MzYsMTAgKzQ4NCwxMSBAQAogICogd2FudCB0byBoYW5kbGUuIFRodXMgeW91IGNhbm5vdCBraWxsIGluaXQgZXZlbiB3aXRoIGEgU0lHS0lMTCBldmVuIGJ5CiAgKiBtaXN0YWtlLgogICovCi1zdGF0aWMgaW50IGRvX3NpZ25hbChzaWdzZXRfdCAqb2xkc2V0KQorc3RhdGljIHZvaWQgZG9fc2lnbmFsKHZvaWQpCiB7CiAJc3RydWN0IGtfc2lnYWN0aW9uIGthOwogCXNpZ2luZm9fdCBpbmZvOworCXNpZ3NldF90ICpvbGRzZXQ7CiAJaW50IHNpZ25yOwogCiAJLyoKQEAgLTU0OSw0MyArNDk4LDYyIEBACiAJICogaWYgc28uCiAJICovCiAJaWYgKCF1c2VyX21vZGUoX19mcmFtZSkpCi0JCXJldHVybiAxOworCQlyZXR1cm47CiAKIAlpZiAodHJ5X3RvX2ZyZWV6ZSgpKQogCQlnb3RvIG5vX3NpZ25hbDsKIAotCWlmICghb2xkc2V0KQorCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKQorCQlvbGRzZXQgPSAmY3VycmVudC0+c2F2ZWRfc2lnbWFzazsKKwllbHNlCiAJCW9sZHNldCA9ICZjdXJyZW50LT5ibG9ja2VkOwogCiAJc2lnbnIgPSBnZXRfc2lnbmFsX3RvX2RlbGl2ZXIoJmluZm8sICZrYSwgX19mcmFtZSwgTlVMTCk7Ci0JaWYgKHNpZ25yID4gMCkKLQkJcmV0dXJuIGhhbmRsZV9zaWduYWwoc2lnbnIsICZpbmZvLCAma2EsIG9sZHNldCk7CisJaWYgKHNpZ25yID4gMCkgeworCQlpZiAoaGFuZGxlX3NpZ25hbChzaWduciwgJmluZm8sICZrYSwgb2xkc2V0KSA9PSAwKSB7CisJCQkvKiBhIHNpZ25hbCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZDsgdGhlIHNhdmVkCisJCQkgKiBzaWdtYXNrIHdpbGwgaGF2ZSBiZWVuIHN0b3JlZCBpbiB0aGUgc2lnbmFsIGZyYW1lLAorCQkJICogYW5kIHdpbGwgYmUgcmVzdG9yZWQgYnkgc2lncmV0dXJuLCBzbyB3ZSBjYW4gc2ltcGx5CisJCQkgKiBjbGVhciB0aGUgVElGX1JFU1RPUkVfU0lHTUFTSyBmbGFnICovCisJCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwkJfQorCisJCXJldHVybjsKKwl9CiAKIG5vX3NpZ25hbDoKIAkvKiBEaWQgd2UgY29tZSBmcm9tIGEgc3lzdGVtIGNhbGw/ICovCiAJaWYgKF9fZnJhbWUtPnN5c2NhbGxubyA+PSAwKSB7CiAJCS8qIFJlc3RhcnQgdGhlIHN5c3RlbSBjYWxsIC0gbm8gaGFuZGxlcnMgcHJlc2VudCAqLwotCQlpZiAoX19mcmFtZS0+Z3I4ID09IC1FUkVTVEFSVE5PSEFORCB8fAotCQkgICAgX19mcmFtZS0+Z3I4ID09IC1FUkVTVEFSVFNZUyB8fAotCQkgICAgX19mcmFtZS0+Z3I4ID09IC1FUkVTVEFSVE5PSU5UUikgeworCQlzd2l0Y2ggKF9fZnJhbWUtPmdyOCkgeworCQljYXNlIC1FUkVTVEFSVE5PSEFORDoKKwkJY2FzZSAtRVJFU1RBUlRTWVM6CisJCWNhc2UgLUVSRVNUQVJUTk9JTlRSOgogCQkJX19mcmFtZS0+Z3I4ID0gX19mcmFtZS0+b3JpZ19ncjg7CiAJCQlfX2ZyYW1lLT5wYyAtPSA0OwotCQl9CisJCQlicmVhazsKIAotCQlpZiAoX19mcmFtZS0+Z3I4ID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0speworCQljYXNlIC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0s6CiAJCQlfX2ZyYW1lLT5ncjggPSBfX05SX3Jlc3RhcnRfc3lzY2FsbDsKIAkJCV9fZnJhbWUtPnBjIC09IDQ7CisJCQlicmVhazsKIAkJfQogCX0KIAotCXJldHVybiAwOworCS8qIGlmIHRoZXJlJ3Mgbm8gc2lnbmFsIHRvIGRlbGl2ZXIsIHdlIGp1c3QgcHV0IHRoZSBzYXZlZCBzaWdtYXNrCisJICogYmFjayAqLworCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKSB7CisJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOworCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2ssIE5VTEwpOworCX0KIAogfSAvKiBlbmQgZG9fc2lnbmFsKCkgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIG5vdGlmaWNhdGlvbiBvZiB1c2Vyc3BhY2UgZXhlY3V0aW9uIHJlc3VtcHRpb24KLSAqIC0gdHJpZ2dlcmVkIGJ5IGN1cnJlbnQtPndvcmsubm90aWZ5X3Jlc3VtZQorICogLSB0cmlnZ2VyZWQgYnkgdGhlIFRJRl9XT1JLX01BU0sgZmxhZ3MKICAqLwogYXNtbGlua2FnZSB2b2lkIGRvX25vdGlmeV9yZXN1bWUoX191MzIgdGhyZWFkX2luZm9fZmxhZ3MpCiB7CkBAIC01OTQsNyArNTYyLDcgQEAKIAkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApOwogCiAJLyogZGVhbCB3aXRoIHBlbmRpbmcgc2lnbmFsIGRlbGl2ZXJ5ICovCi0JaWYgKHRocmVhZF9pbmZvX2ZsYWdzICYgX1RJRl9TSUdQRU5ESU5HKQotCQlkb19zaWduYWwoTlVMTCk7CisJaWYgKHRocmVhZF9pbmZvX2ZsYWdzICYgKF9USUZfU0lHUEVORElORyB8IF9USUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJZG9fc2lnbmFsKCk7CiAKIH0gLyogZW5kIGRvX25vdGlmeV9yZXN1bWUoKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL3RpbWUuYyBiL2FyY2gvZnJ2L2tlcm5lbC90aW1lLmMKaW5kZXggMmU5NzQxMi4uMjRjZjg1ZiAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2Zydi9rZXJuZWwvdGltZS5jCkBAIC0xODksNiArMTg5LDggQEAKIAl0di0+dHZfdXNlYyA9IHVzZWM7CiB9CiAKK0VYUE9SVF9TWU1CT0woZG9fZ2V0dGltZW9mZGF5KTsKKwogaW50IGRvX3NldHRpbWVvZmRheShzdHJ1Y3QgdGltZXNwZWMgKnR2KQogewogCXRpbWVfdCB3dG1fc2VjLCBzZWMgPSB0di0+dHZfc2VjOwpAQCAtMjE4LDYgKzIyMCw3IEBACiAJY2xvY2tfd2FzX3NldCgpOwogCXJldHVybiAwOwogfQorCiBFWFBPUlRfU1lNQk9MKGRvX3NldHRpbWVvZmRheSk7CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvZnJ2L2tlcm5lbC90cmFwcy5jCmluZGV4IDg5MDczY2EuLjllYjg0YjIgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC90cmFwcy5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9mcHUuaD4KQEAgLTI1MCw2ICsyNTEsOCBAQAogCXNob3dfc3RhY2soTlVMTCwgTlVMTCk7CiB9CiAKK0VYUE9SVF9TWU1CT0woZHVtcF9zdGFjayk7CisKIHZvaWQgc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKnNwKQogewogfQpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL3VhY2Nlc3MuYyBiL2FyY2gvZnJ2L2tlcm5lbC91YWNjZXNzLmMKaW5kZXggZjNmZDU4YS4uOWI3NTFjMCAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL3VhY2Nlc3MuYworKysgYi9hcmNoL2Zydi9rZXJuZWwvdWFjY2Vzcy5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTgsOCArNTksMTEgQEAKIAkJbWVtc2V0KHAsIDAsIGNvdW50KTsgLyogY2xlYXIgcmVtYWluZGVyIG9mIGJ1ZmZlciBbc2VjdXJpdHldICovCiAKIAlyZXR1cm4gZXJyOworCiB9IC8qIGVuZCBzdHJuY3B5X2Zyb21fdXNlcigpICovCiAKK0VYUE9SVF9TWU1CT0woc3RybmNweV9mcm9tX3VzZXIpOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogUmV0dXJuIHRoZSBzaXplIG9mIGEgc3RyaW5nIChpbmNsdWRpbmcgdGhlIGVuZGluZyAwKQpAQCAtOTIsNCArOTYsNyBAQAogCX0KIAogCXJldHVybiBwIC0gc3JjICsgMTsgLyogcmV0dXJuIGxlbmd0aCBpbmNsdWRpbmcgTlVMICovCisKIH0gLyogZW5kIHN0cm5sZW5fdXNlcigpICovCisKK0VYUE9SVF9TWU1CT0woc3Rybmxlbl91c2VyKTsKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9mcnYva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggZmNlYWZkMi4uZjQ3NDUzNCAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9mcnYva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTExMiw2ICsxMTIsNyBAQAogI2VuZGlmCiAJKQogCVNDSEVEX1RFWFQKKwlMT0NLX1RFWFQKIAkqKC5maXh1cCkKIAkqKC5nbnUud2FybmluZykKIAkqKC5leGl0Y2FsbC5leGl0KQpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvbGliL01ha2VmaWxlIGIvYXJjaC9mcnYvbGliL01ha2VmaWxlCmluZGV4IDE5YmUyNjIuLjA4YmUzMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2xpYi9NYWtlZmlsZQorKysgYi9hcmNoL2Zydi9saWIvTWFrZWZpbGUKQEAgLTMsNiArMyw2IEBACiAjCiAKIGxpYi15IDo9IFwKLQlfX2FzaGxkaTMubyBfX2xzaHJkaTMubyBfX211bGRpMy5vIF9fYXNocmRpMy5vIF9fbmVnZGkyLm8gXAorCV9fYXNobGRpMy5vIF9fbHNocmRpMy5vIF9fbXVsZGkzLm8gX19hc2hyZGkzLm8gX19uZWdkaTIubyBfX3VjbXBkaTIubyBcCiAJY2hlY2tzdW0ubyBtZW1jcHkubyBtZW1zZXQubyBhdG9taWMtb3BzLm8gXAogCW91dHNsX25zLm8gb3V0c2xfc3cubyBpbnNsX25zLm8gaW5zbF9zdy5vIGNhY2hlLm8KZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2xpYi9fX3VjbXBkaTIuUyBiL2FyY2gvZnJ2L2xpYi9fX3VjbXBkaTIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODkyZjE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9mcnYvbGliL19fdWNtcGRpMi5TCkBAIC0wLDAgKzEsNDUgQEAKKy8qIF9fdWNtcGRpMi5TOiA2NC1iaXQgdW5zaWduZWQgY29tcGFyZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisKKyAgICAgICAgLnRleHQKKyAgICAgICAgLnAyYWxpZ24JNAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGludCBfX3VjbXBkaTIodW5zaWduZWQgbG9uZyBsb25nIGEgW0dSODpHUjldLAorIwkJdW5zaWduZWQgbG9uZyBsb25nIGIgW0dSMTA6R1IxMV0pCisjCisjIC0gcmV0dXJucyAwLCAxLCBvciAyIGFzIGEgPCwgPSwgPiBiIHJlc3BlY3RpdmVseS4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgLmdsb2JsCQlfX3VjbXBkaTIKKyAgICAgICAgLnR5cGUJCV9fdWNtcGRpMixAZnVuY3Rpb24KK19fdWNtcGRpMjoKKwlvci5wCQlncjgsZ3IwLGdyNAorCXN1YmNjCQlncjgsZ3IxMCxncjAsaWNjMAorCXNldGxvcy5wCSMwLGdyOAorCWJjbHIJCWljYzAsIzIJCQk7IGEubXN3IDwgYi5tc3cKKworCXNldGxvcy5wCSMyLGdyOAorCWJoaWxyCQlpY2MwLCMwCQkJOyBhLm1zdyA+IGIubXN3CisKKwlzdWJjYy5wCQlncjksZ3IxMSxncjAsaWNjMQorCXNldGxvcwkJIzAsZ3I4CisJc2V0bG9zLnAJIzIsZ3I5CisJc2V0bG9zCQkjMSxncjcKKwlja25jCQlpY2MxLGNjNgorCWNvci5wCQlncjksZ3IwLGdyOCwJCWNjNiwjMQorCWNja2xzCQlpY2MxLGNjNCwJCWNjNiwjMQorCWFuZGNyCQljYzYsY2M0LGNjNAorCWNvcgkJZ3I3LGdyMCxncjgsCQljYzQsIzEKKwlicmFscgorCS5zaXplCQlfX3VjbXBkaTIsIC4tX191Y21wZGkyCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9saWIvYXRvbWljLW9wcy5TIGIvYXJjaC9mcnYvbGliL2F0b21pYy1vcHMuUwppbmRleCBiMDNkNTEwLi41NDVjZDMyIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9saWIvYXRvbWljLW9wcy5TCisrKyBiL2FyY2gvZnJ2L2xpYi9hdG9taWMtb3BzLlMKQEAgLTEyOSw0OCArMTI5LDYgQEAKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIwotIyB1aW50OF90IF9feGNoZ184KHVpbnQ4X3QgaSwgdWludDhfdCAqdikKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQkuZ2xvYmwJCV9feGNoZ184Ci0gICAgICAgIC50eXBlCQlfX3hjaGdfOCxAZnVuY3Rpb24KLV9feGNoZ184OgotCW9yLnAJCWdyOCxncjgsZ3IxMAotMDoKLQlvcmNjCQlncjAsZ3IwLGdyMCxpY2MzCQkvKiBzZXQgSUNDMy5aICovCi0JY2tlcQkJaWNjMyxjYzcKLQlsZHViLnAJCUAoZ3I5LGdyMCksZ3I4CQkJLyogTEQuUC9PUkNSIG11c3QgYmUgYXRvbWljICovCi0Jb3JjcgkJY2M3LGNjNyxjYzMJCQkvKiBzZXQgQ0MzIHRvIHRydWUgKi8KLQljc3RiLnAJCWdyMTAsQChncjksZ3IwKQkJLGNjMywjMQotCWNvcmNjCQlncjI5LGdyMjksZ3IwCQksY2MzLCMxCS8qIGNsZWFyIElDQzMuWiBpZiBzdG9yZSBoYXBwZW5zICovCi0JYmVxCQlpY2MzLCMwLDBiCi0JYnJhbHIKLQotCS5zaXplCQlfX3hjaGdfOCwgLi1fX3hjaGdfOAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIHVpbnQxNl90IF9feGNoZ18xNih1aW50MTZfdCBpLCB1aW50MTZfdCAqdikKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQkuZ2xvYmwJCV9feGNoZ18xNgotICAgICAgICAudHlwZQkJX194Y2hnXzE2LEBmdW5jdGlvbgotX194Y2hnXzE2OgotCW9yLnAJCWdyOCxncjgsZ3IxMAotMDoKLQlvcmNjCQlncjAsZ3IwLGdyMCxpY2MzCQkvKiBzZXQgSUNDMy5aICovCi0JY2tlcQkJaWNjMyxjYzcKLQlsZHVoLnAJCUAoZ3I5LGdyMCksZ3I4CQkJLyogTEQuUC9PUkNSIG11c3QgYmUgYXRvbWljICovCi0Jb3JjcgkJY2M3LGNjNyxjYzMJCQkvKiBzZXQgQ0MzIHRvIHRydWUgKi8KLQljc3RoLnAJCWdyMTAsQChncjksZ3IwKQkJLGNjMywjMQotCWNvcmNjCQlncjI5LGdyMjksZ3IwCQksY2MzLCMxCS8qIGNsZWFyIElDQzMuWiBpZiBzdG9yZSBoYXBwZW5zICovCi0JYmVxCQlpY2MzLCMwLDBiCi0JYnJhbHIKLQotCS5zaXplCQlfX3hjaGdfMTYsIC4tX194Y2hnXzE2Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKICMgdWludDMyX3QgX194Y2hnXzMyKHVpbnQzMl90IGksIHVpbnQzMl90ICp2KQogIwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMTkyLDU2ICsxNTAsNiBAQAogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjCi0jIHVpbnQ4X3QgX19jbXB4Y2hnXzgodWludDhfdCAqdiwgdWludDhfdCB0ZXN0LCB1aW50OF90IG5ldykKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQkuZ2xvYmwJCV9fY21weGNoZ184Ci0gICAgICAgIC50eXBlCQlfX2NtcHhjaGdfOCxAZnVuY3Rpb24KLV9fY21weGNoZ184OgotCW9yLnAJCWdyOCxncjgsZ3IxMQotMDoKLQlvcmNjCQlncjAsZ3IwLGdyMCxpY2MzCi0JY2tlcQkJaWNjMyxjYzcKLQlsZHViLnAJCUAoZ3IxMSxncjApLGdyOAotCW9yY3IJCWNjNyxjYzcsY2MzCi0Jc3ViCQlncjgsZ3I5LGdyNwotCXNsbGljYwkJZ3I3LCMyNCxncjAsaWNjMAotCWJuZQkJaWNjMCwjMCwxZgotCWNzdGIucAkJZ3IxMCxAKGdyMTEsZ3IwKQksY2MzLCMxCi0JY29yY2MJCWdyMjksZ3IyOSxncjAJCSxjYzMsIzEKLQliZXEJCWljYzMsIzAsMGIKLTE6Ci0JYnJhbHIKLQotCS5zaXplCQlfX2NtcHhjaGdfOCwgLi1fX2NtcHhjaGdfOAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIHVpbnQxNl90IF9fY21weGNoZ18xNih1aW50MTZfdCAqdiwgdWludDE2X3QgdGVzdCwgdWludDE2X3QgbmV3KQotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCS5nbG9ibAkJX19jbXB4Y2hnXzE2Ci0gICAgICAgIC50eXBlCQlfX2NtcHhjaGdfMTYsQGZ1bmN0aW9uCi1fX2NtcHhjaGdfMTY6Ci0Jb3IucAkJZ3I4LGdyOCxncjExCi0wOgotCW9yY2MJCWdyMCxncjAsZ3IwLGljYzMKLQlja2VxCQlpY2MzLGNjNwotCWxkdWgucAkJQChncjExLGdyMCksZ3I4Ci0Jb3JjcgkJY2M3LGNjNyxjYzMKLQlzdWIJCWdyOCxncjksZ3I3Ci0Jc2xsaWNjCQlncjcsIzE2LGdyMCxpY2MwCi0JYm5lCQlpY2MwLCMwLDFmCi0JY3N0aC5wCQlncjEwLEAoZ3IxMSxncjApCSxjYzMsIzEKLQljb3JjYwkJZ3IyOSxncjI5LGdyMAkJLGNjMywjMQotCWJlcQkJaWNjMywjMCwwYgotMToKLQlicmFscgotCi0JLnNpemUJCV9fY21weGNoZ18xNiwgLi1fX2NtcHhjaGdfMTYKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwogIyB1aW50MzJfdCBfX2NtcHhjaGdfMzIodWludDMyX3QgKnYsIHVpbnQzMl90IHRlc3QsIHVpbnQzMl90IG5ldykKICMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2xpYi9jaGVja3N1bS5jIGIvYXJjaC9mcnYvbGliL2NoZWNrc3VtLmMKaW5kZXggN2JmNWJkNi4uMjBlN2RmYyAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvbGliL2NoZWNrc3VtLmMKKysrIGIvYXJjaC9mcnYvbGliL2NoZWNrc3VtLmMKQEAgLTMzLDYgKzMzLDcgQEAKIAogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGZyb20zMnRvMTYodW5zaWduZWQgbG9uZyB4KQogewpAQCAtMTE1LDM0ICsxMTYsNTIgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbCk7CisKIC8qCiAgKiB0aGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgbWlzY2VsbGFuZW91cyBJUC1saWtlIGNoZWNrc3VtcywgbWFpbmx5CiAgKiBpbiBpY21wLmMKICAqLwogdW5zaWduZWQgc2hvcnQgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKQogewotCXJldHVybiB+ZG9fY3N1bShidWZmLGxlbik7CisJcmV0dXJuIH5kb19jc3VtKGJ1ZmYsIGxlbik7CiB9CiAKK0VYUE9SVF9TWU1CT0woaXBfY29tcHV0ZV9jc3VtKTsKKwogLyoKICAqIGNvcHkgZnJvbSBmcyB3aGlsZSBjaGVja3N1bW1pbmcsIG90aGVyd2lzZSBsaWtlIGNzdW1fcGFydGlhbAogICovCi0KIHVuc2lnbmVkIGludAotY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LCBpbnQgbGVuLCBpbnQgc3VtLCBpbnQgKmNzdW1fZXJyKQorY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGNoYXIgKmRzdCwKKwkJCSAgICBpbnQgbGVuLCBpbnQgc3VtLCBpbnQgKmNzdW1fZXJyKQogewotCWlmIChjc3VtX2VycikgKmNzdW1fZXJyID0gMDsKLQltZW1jcHkoZHN0LCBzcmMsIGxlbik7CisJaW50IHJlbTsKKworCWlmIChjc3VtX2VycikKKwkJKmNzdW1fZXJyID0gMDsKKworCXJlbSA9IGNvcHlfZnJvbV91c2VyKGRzdCwgc3JjLCBsZW4pOworCWlmIChyZW0gIT0gMCkgeworCQlpZiAoY3N1bV9lcnIpCisJCQkqY3N1bV9lcnIgPSAtRUZBVUxUOworCQltZW1zZXQoZHN0ICsgbGVuIC0gcmVtLCAwLCByZW0pOworCQlsZW4gPSByZW07CisJfQorCiAJcmV0dXJuIGNzdW1fcGFydGlhbChkc3QsIGxlbiwgc3VtKTsKIH0KIAorRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIpOworCiAvKgogICogY29weSBmcm9tIGRzIHdoaWxlIGNoZWNrc3VtbWluZywgb3RoZXJ3aXNlIGxpa2UgY3N1bV9wYXJ0aWFsCiAgKi8KLQogdW5zaWduZWQgaW50CiBjc3VtX3BhcnRpYWxfY29weShjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwgaW50IGxlbiwgaW50IHN1bSkKIHsKIAltZW1jcHkoZHN0LCBzcmMsIGxlbik7CiAJcmV0dXJuIGNzdW1fcGFydGlhbChkc3QsIGxlbiwgc3VtKTsKIH0KKworRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weSk7CmRpZmYgLS1naXQgYS9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvTWFrZWZpbGUgYi9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvTWFrZWZpbGUKaW5kZXggM2ZhZjBmOC4uNzY1OTVlOCAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL01ha2VmaWxlCisrKyBiL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9NYWtlZmlsZQpAQCAtMyw3ICszLDcgQEAKICMKIAogaWZlcSAiJChDT05GSUdfUENJKSIgInkiCi1vYmoteSA6PSBwY2ktZnJ2Lm8gcGNpLWlycS5vIHBjaS12ZGsubworb2JqLXkgOj0gcGNpLWZydi5vIHBjaS1pcnEubyBwY2ktdmRrLm8gcGNpLWlvbWFwLm8KIAogaWZlcSAiJChDT05GSUdfTU1VKSIgInkiCiBvYmoteSArPSBwY2ktZG1hLm8KZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktZG1hLW5vbW11LmMgYi9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWRtYS1ub21tdS5jCmluZGV4IDIwODJhOTYuLjQ5ODU0NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktZG1hLW5vbW11LmMKKysrIGIvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1kbWEtbm9tbXUuYwpAQCAtODMsNiArODMsOCBAQAogCXJldHVybiBOVUxMOwogfQogCitFWFBPUlRfU1lNQk9MKGRtYV9hbGxvY19jb2hlcmVudCk7CisKIHZvaWQgZG1hX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqaHdkZXYsIHNpemVfdCBzaXplLCB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQogewogCXN0cnVjdCBkbWFfYWxsb2NfcmVjb3JkICpyZWM7CkBAIC0xMDIsNiArMTA0LDggQEAKIAlCVUcoKTsKIH0KIAorRVhQT1JUX1NZTUJPTChkbWFfZnJlZV9jb2hlcmVudCk7CisKIC8qCiAgKiBNYXAgYSBzaW5nbGUgYnVmZmVyIG9mIHRoZSBpbmRpY2F0ZWQgc2l6ZSBmb3IgRE1BIGluIHN0cmVhbWluZyBtb2RlLgogICogVGhlIDMyLWJpdCBidXMgYWRkcmVzcyB0byB1c2UgaXMgcmV0dXJuZWQuCkBAIC0xMjAsNiArMTI0LDggQEAKIAlyZXR1cm4gdmlydF90b19idXMocHRyKTsKIH0KIAorRVhQT1JUX1NZTUJPTChkbWFfbWFwX3NpbmdsZSk7CisKIC8qCiAgKiBNYXAgYSBzZXQgb2YgYnVmZmVycyBkZXNjcmliZWQgYnkgc2NhdHRlcmxpc3QgaW4gc3RyZWFtaW5nCiAgKiBtb2RlIGZvciBETUEuICBUaGlzIGlzIHRoZSBzY2F0aGVyLWdhdGhlciB2ZXJzaW9uIG9mIHRoZQpAQCAtMTUwLDMgKzE1Niw1IEBACiAKIAlyZXR1cm4gbmVudHM7CiB9CisKK0VYUE9SVF9TWU1CT0woZG1hX21hcF9zZyk7CmRpZmYgLS1naXQgYS9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWRtYS5jIGIvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1kbWEuYwppbmRleCA4NmZiZGFkLi42NzFjZTFlIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWRtYS5jCisrKyBiL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktZG1hLmMKQEAgLTI4LDExICsyOCwxNSBAQAogCXJldHVybiByZXQ7CiB9CiAKK0VYUE9SVF9TWU1CT0woZG1hX2FsbG9jX2NvaGVyZW50KTsKKwogdm9pZCBkbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCiB7CiAJY29uc2lzdGVudF9mcmVlKHZhZGRyKTsKIH0KIAorRVhQT1JUX1NZTUJPTChkbWFfZnJlZV9jb2hlcmVudCk7CisKIC8qCiAgKiBNYXAgYSBzaW5nbGUgYnVmZmVyIG9mIHRoZSBpbmRpY2F0ZWQgc2l6ZSBmb3IgRE1BIGluIHN0cmVhbWluZyBtb2RlLgogICogVGhlIDMyLWJpdCBidXMgYWRkcmVzcyB0byB1c2UgaXMgcmV0dXJuZWQuCkBAIC01MSw2ICs1NSw4IEBACiAJcmV0dXJuIHZpcnRfdG9fYnVzKHB0cik7CiB9CiAKK0VYUE9SVF9TWU1CT0woZG1hX21hcF9zaW5nbGUpOworCiAvKgogICogTWFwIGEgc2V0IG9mIGJ1ZmZlcnMgZGVzY3JpYmVkIGJ5IHNjYXR0ZXJsaXN0IGluIHN0cmVhbWluZwogICogbW9kZSBmb3IgRE1BLiAgVGhpcyBpcyB0aGUgc2NhdGhlci1nYXRoZXIgdmVyc2lvbiBvZiB0aGUKQEAgLTk2LDYgKzEwMiw4IEBACiAJcmV0dXJuIG5lbnRzOwogfQogCitFWFBPUlRfU1lNQk9MKGRtYV9tYXBfc2cpOworCiBkbWFfYWRkcl90IGRtYV9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKIAkJCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CkBAIC0xMDMsMyArMTExLDUgQEAKIAlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKIAlyZXR1cm4gKGRtYV9hZGRyX3QpIHBhZ2VfdG9fcGh5cyhwYWdlKSArIG9mZnNldDsKIH0KKworRVhQT1JUX1NZTUJPTChkbWFfbWFwX3BhZ2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1mcnYuYyBiL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktZnJ2LmMKaW5kZXggODNlNTQ4OS4uMGEyNmJmNiAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1mcnYuYworKysgYi9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWZydi5jCkBAIC0xNDIsOSArMTQyLDcgQEAKIAl1MTYgY29tbWFuZDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnIsICpwcjsKIAotCXdoaWxlIChkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSwKLQkgICAgICAgZGV2ICE9IE5VTEwKLQkgICAgICAgKSB7CisJZm9yX2VhY2hfcGNpX2RldihkZXYpIHsKIAkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNvbW1hbmQpOwogCQlmb3IoaWR4ID0gMDsgaWR4IDwgNjsgaWR4KyspIHsKIAkJCXIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOwpAQCAtMTg4LDkgKzE4Niw3IEBACiAJaW50IGlkeDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAKLQl3aGlsZSAoZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldiksCi0JICAgICAgIGRldiAhPSBOVUxMCi0JICAgICAgICkgeworCWZvcl9lYWNoX3BjaV9kZXYoZGV2KSB7CiAJCWludCBjbGFzcyA9IGRldi0+Y2xhc3MgPj4gODsKIAogCQkvKiBEb24ndCB0b3VjaCBjbGFzc2xlc3MgZGV2aWNlcyBhbmQgaG9zdCBicmlkZ2VzICovCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWlvbWFwLmMgYi9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWlvbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4ZmEwNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktaW9tYXAuYwpAQCAtMCwwICsxLDI5IEBACisvKiBwY2ktaW9tYXAuYzogZGVzY3JpcHRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKwordm9pZCBfX2lvbWVtICpwY2lfaW9tYXAoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJhciwgdW5zaWduZWQgbG9uZyBtYXhsZW4pCit7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIGJhcik7CisJdW5zaWduZWQgbG9uZyBsZW4gPSBwY2lfcmVzb3VyY2VfbGVuKGRldiwgYmFyKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gcGNpX3Jlc291cmNlX2ZsYWdzKGRldiwgYmFyKTsKKworCWlmICghbGVuIHx8ICFzdGFydCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoKGZsYWdzICYgSU9SRVNPVVJDRV9JTykgfHwgKGZsYWdzICYgSU9SRVNPVVJDRV9NRU0pKQorCQlyZXR1cm4gKHZvaWQgX19pb21lbSAqKSBzdGFydDsKKworCXJldHVybiBOVUxMOworfQorCitFWFBPUlRfU1lNQk9MKHBjaV9pb21hcCk7CmRpZmYgLS1naXQgYS9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWlycS5jIGIvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1pcnEuYwppbmRleCAyNDYyMmQ4Li5jNGExMTQ0IDEwMDY0NAotLS0gYS9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWlycS5jCisrKyBiL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktaXJxLmMKQEAgLTQ4LDkgKzQ4LDcgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKIAl1aW50OF90IGxpbmUsIHBpbjsKIAotCXdoaWxlIChkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSwKLQkgICAgICAgZGV2ICE9IE5VTEwKLQkgICAgICAgKSB7CisJZm9yX2VhY2hfcGNpX2RldihkZXYpIHsKIAkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7CiAJCWlmIChwaW4pIHsKIAkJCWRldi0+aXJxID0gcGNpX2J1czBfaXJxX3JvdXRpbmdbUENJX1NMT1QoZGV2LT5kZXZmbildW3BpbiAtIDFdOwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvbW0vY2FjaGUtcGFnZS5jIGIvYXJjaC9mcnYvbW0vY2FjaGUtcGFnZS5jCmluZGV4IDY4M2I1ZTMuLjAyNjFjYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L21tL2NhY2hlLXBhZ2UuYworKysgYi9hcmNoL2Zydi9tbS9jYWNoZS1wYWdlLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM4LDYgKzM5LDggQEAKIAogfSAvKiBlbmQgZmx1c2hfZGNhY2hlX3BhZ2UoKSAqLwogCitFWFBPUlRfU1lNQk9MKGZsdXNoX2RjYWNoZV9wYWdlKTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIElDSSB0YWtlcyBhIHZpcnR1YWwgYWRkcmVzcyBhbmQgdGhlIHBhZ2UgbWF5IG5vdCBjdXJyZW50bHkgaGF2ZSBvbmUKQEAgLTY0LDMgKzY3LDUgQEAKIAl9CiAKIH0gLyogZW5kIGZsdXNoX2ljYWNoZV91c2VyX3JhbmdlKCkgKi8KKworRVhQT1JUX1NZTUJPTChmbHVzaF9pY2FjaGVfdXNlcl9yYW5nZSk7CmRpZmYgLS1naXQgYS9hcmNoL2Zydi9tbS9leHRhYmxlLmMgYi9hcmNoL2Zydi9tbS9leHRhYmxlLmMKaW5kZXggNDFiZTExMi4uY2FhY2YwMyAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvbW0vZXh0YWJsZS5jCisrKyBiL2FyY2gvZnJ2L21tL2V4dGFibGUuYwpAQCAtNDMsNyArNDMsNyBAQAogICovCiB1bnNpZ25lZCBsb25nIHNlYXJjaF9leGNlcHRpb25fdGFibGUodW5zaWduZWQgbG9uZyBwYykKIHsKLQl1bnNpZ25lZCBsb25nIHJldCA9IDA7CisJY29uc3Qgc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqZXh0YWI7CiAKIAkvKiBkZXRlcm1pbmUgaWYgdGhlIGZhdWx0IGxheSBkdXJpbmcgYSBtZW1jcHlfdXNlciBvciBhIG1lbXNldF91c2VyICovCiAJaWYgKF9fZnJhbWUtPmxyID09ICh1bnNpZ25lZCBsb25nKSAmX19tZW1zZXRfdXNlcl9lcnJvcl9sciAmJgpAQCAtNTUsOSArNTUsMTAgQEAKIAkJICovCiAJCXJldHVybiAodW5zaWduZWQgbG9uZykgJl9fbWVtc2V0X3VzZXJfZXJyb3JfaGFuZGxlcjsKIAl9Ci0JZWxzZSBpZiAoX19mcmFtZS0+bHIgPT0gKHVuc2lnbmVkIGxvbmcpICZfX21lbWNweV91c2VyX2Vycm9yX2xyICYmCi0JCSAodW5zaWduZWQgbG9uZykgJm1lbWNweSA8PSBwYyAmJiBwYyA8ICh1bnNpZ25lZCBsb25nKSAmX19tZW1jcHlfZW5kCi0JCSApIHsKKworCWlmIChfX2ZyYW1lLT5sciA9PSAodW5zaWduZWQgbG9uZykgJl9fbWVtY3B5X3VzZXJfZXJyb3JfbHIgJiYKKwkgICAgKHVuc2lnbmVkIGxvbmcpICZtZW1jcHkgPD0gcGMgJiYgcGMgPCAodW5zaWduZWQgbG9uZykgJl9fbWVtY3B5X2VuZAorCSAgICApIHsKIAkJLyogdGhlIGZhdWx0IG9jY3VycmVkIGluIGEgcHJvdGVjdGVkIG1lbXNldAogCQkgKiAtIHdlIHNlYXJjaCBmb3IgdGhlIHJldHVybiBhZGRyZXNzIChpbiBMUikgaW5zdGVhZCBvZiB0aGUgcHJvZ3JhbSBjb3VudGVyCiAJCSAqIC0gaXQgd2FzIHByb2JhYmx5IGR1cmluZyBhIGNvcHlfdG8vZnJvbV91c2VyKCkKQEAgLTY1LDI3ICs2NiwxMCBAQAogCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpICZfX21lbWNweV91c2VyX2Vycm9yX2hhbmRsZXI7CiAJfQogCi0jaWZuZGVmIENPTkZJR19NT0RVTEVTCi0JLyogdGhlcmUgaXMgb25seSB0aGUga2VybmVsIHRvIHNlYXJjaC4gICovCi0JcmV0ID0gc2VhcmNoX29uZV90YWJsZShfX3N0YXJ0X19fZXhfdGFibGUsIF9fc3RvcF9fX2V4X3RhYmxlIC0gMSwgcGMpOwotCXJldHVybiByZXQ7CisJZXh0YWIgPSBzZWFyY2hfZXhjZXB0aW9uX3RhYmxlcyhwYyk7CisJaWYgKGV4dGFiKQorCQlyZXR1cm4gZXh0YWItPmZpeHVwOwogCi0jZWxzZQotCS8qIHRoZSBrZXJuZWwgaXMgdGhlIGxhc3QgIm1vZHVsZSIgLS0gbm8gbmVlZCB0byB0cmVhdCBpdCBzcGVjaWFsICovCi0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgbW9kdWxlICptcDsKKwlyZXR1cm4gMDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKLQotCWZvciAobXAgPSBtb2R1bGVfbGlzdDsgbXAgIT0gTlVMTDsgbXAgPSBtcC0+bmV4dCkgewotCQlpZiAobXAtPmV4X3RhYmxlX3N0YXJ0ID09IE5VTEwgfHwgIShtcC0+ZmxhZ3MgJiAoTU9EX1JVTk5JTkcgfCBNT0RfSU5JVElBTElaSU5HKSkpCi0JCQljb250aW51ZTsKLQkJcmV0ID0gc2VhcmNoX29uZV90YWJsZShtcC0+ZXhfdGFibGVfc3RhcnQsIG1wLT5leF90YWJsZV9lbmQgLSAxLCBwYyk7Ci0JCWlmIChyZXQpCi0JCQlicmVhazsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0OwotI2VuZGlmCiB9IC8qIGVuZCBzZWFyY2hfZXhjZXB0aW9uX3RhYmxlKCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L21tL2hpZ2htZW0uYyBiL2FyY2gvZnJ2L21tL2hpZ2htZW0uYwppbmRleCA3ZGM4ZmJmLi43Zjc3ZGI3IDEwMDY0NAotLS0gYS9hcmNoL2Zydi9tbS9oaWdobWVtLmMKKysrIGIvYXJjaC9mcnYvbW0vaGlnaG1lbS5jCkBAIC05LDYgKzksNyBAQAogICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogdm9pZCAqa21hcChzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKQEAgLTE4LDYgKzE5LDggQEAKIAlyZXR1cm4ga21hcF9oaWdoKHBhZ2UpOwogfQogCitFWFBPUlRfU1lNQk9MKGttYXApOworCiB2b2lkIGt1bm1hcChzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlpZiAoaW5faW50ZXJydXB0KCkpCkBAIC0yNyw3ICszMCwxMiBAQAogCWt1bm1hcF9oaWdoKHBhZ2UpOwogfQogCitFWFBPUlRfU1lNQk9MKGt1bm1hcCk7CisKIHN0cnVjdCBwYWdlICprbWFwX2F0b21pY190b19wYWdlKHZvaWQgKnB0cikKIHsKIAlyZXR1cm4gdmlydF90b19wYWdlKHB0cik7CiB9CisKKworRVhQT1JUX1NZTUJPTChrbWFwX2F0b21pY190b19wYWdlKTsKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvS2NvbmZpZyBiL2FyY2gvaDgzMDAvS2NvbmZpZwppbmRleCAyNjY5OGE0Li44MDk0MGQ3IDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL0tjb25maWcKKysrIGIvYXJjaC9oODMwMC9LY29uZmlnCkBAIC0yMSwxMCArMjEsNiBAQAogCWJvb2wKIAlkZWZhdWx0IG4KIAotY29uZmlnIFVJRDE2Ci0JYm9vbAotCWRlZmF1bHQgeQotCiBjb25maWcgUldTRU1fR0VORVJJQ19TUElOTE9DSwogCWJvb2wKIAlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL2dwaW8uYyBiL2FyY2gvaDgzMDAva2VybmVsL2dwaW8uYwppbmRleCA3OTU2ODJiLi5kMTk1NTY4IDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL2tlcm5lbC9ncGlvLmMKKysrIGIvYXJjaC9oODMwMC9rZXJuZWwvZ3Bpby5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIHN0YXRpYyBjaGFyICpwb3J0X3N0YXR1cyhpbnQgcG9ydG5vKQogewogCXN0YXRpYyBjaGFyIHJlc3VsdFsxMF07Ci0JY29uc3Qgc3RhdGljIGNoYXIgaW9bMl09eydJJywnTyd9OworCXN0YXRpYyBjb25zdCBjaGFyIGlvWzJdPXsnSScsJ08nfTsKIAljaGFyICpycDsKIAlpbnQgYzsKIAl1bnNpZ25lZCBjaGFyIHVzZWQsZGRyOwpAQCAtMTQzLDcgKzE0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCAqdW51c2VkX2ksIHZvaWQgKnVudXNlZF92KQogewogCWludCBjLG91dGxlbjsKLQljb25zdCBzdGF0aWMgY2hhciBwb3J0X25hbWVbXT0iMTIzNDU2Nzg5QUJDREVGR0giOworCXN0YXRpYyBjb25zdCBjaGFyIHBvcnRfbmFtZVtdPSIxMjM0NTY3ODlBQkNERUZHSCI7CiAJb3V0bGVuID0gMDsKIAlmb3IgKGMgPSAwOyBjIDwgTUFYX1BPUlQ7IGMrKykgewogCQlpZiAoZGRyc1tjXSA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9rZXJuZWwvaDgzMDBfa3N5bXMuYyBiL2FyY2gvaDgzMDAva2VybmVsL2g4MzAwX2tzeW1zLmMKaW5kZXggNWE2MzAyMy4uNWNjNzZlZiAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9rZXJuZWwvaDgzMDBfa3N5bXMuYworKysgYi9hcmNoL2g4MzAwL2tlcm5lbC9oODMwMF9rc3ltcy5jCkBAIC0yMiwxMSArMjIsOCBAQAogLy9hc21saW5rYWdlIGxvbmcgbG9uZyBfX2xzaHJkaTMgKGxvbmcgbG9uZywgaW50KTsKIGV4dGVybiBjaGFyIGg4MzAwX2RlYnVnX2RldmljZVtdOwogCi1leHRlcm4gdm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgdXNlciAqKTsKLQogLyogcGxhdGZvcm0gZGVwZW5kZW50IHN1cHBvcnQgKi8KIAotRVhQT1JUX1NZTUJPTChkdW1wX3RocmVhZCk7CiBFWFBPUlRfU1lNQk9MKHN0cm5sZW4pOwogRVhQT1JUX1NZTUJPTChzdHJyY2hyKTsKIEVYUE9SVF9TWU1CT0woc3Ryc3RyKTsKQEAgLTEwMywxMCArMTAwLDYgQEAKIEVYUE9SVF9TWU1CT0woX191bW9kZGkzKTsKIEVYUE9SVF9TWU1CT0woX191bW9kc2kzKTsKIAotI2lmZGVmIE1BR0lDX1JPTV9QVFIKLUVYUE9SVF9TWU1CT0woaXNfaW5fcm9tKTsKLSNlbmRpZgotCiBFWFBPUlRfU1lNQk9MKGg4MzAwX3Jlc2VydmVkX2dwaW8pOwogRVhQT1JUX1NZTUJPTChoODMwMF9mcmVlX2dwaW8pOwogRVhQT1JUX1NZTUJPTChoODMwMF9zZXRfZ3Bpb19kaXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9oODMwMC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGZlMjFhZGYuLmVkNzlhZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2g4MzAwL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTE5NSw3ICsxOTUsNyBAQAogewogCXN0cnVjdCBwdF9yZWdzICogY2hpbGRyZWdzOwogCi0JY2hpbGRyZWdzID0gKChzdHJ1Y3QgcHRfcmVncyAqKSAoVEhSRUFEX1NJWkUgKyAodW5zaWduZWQgbG9uZykgcC0+dGhyZWFkX2luZm8pKSAtIDE7CisJY2hpbGRyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopIChUSFJFQURfU0laRSArIHRhc2tfc3RhY2tfcGFnZShwKSkgLSAxOwogCiAJKmNoaWxkcmVncyA9ICpyZWdzOwogCWNoaWxkcmVncy0+cmV0cGMgPSAodW5zaWduZWQgbG9uZykgcmV0X2Zyb21fZm9yazsKQEAgLTIwOCwzNCArMjA4LDYgQEAKIH0KIAogLyoKLSAqIGZpbGwgaW4gdGhlIHVzZXIgc3RydWN0dXJlIGZvciBhIGNvcmUgZHVtcC4uCi0gKi8KLXZvaWQgZHVtcF90aHJlYWQoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBzdHJ1Y3QgdXNlciAqIGR1bXApCi17Ci0vKiBjaGFuZ2VkIHRoZSBzaXplIGNhbGN1bGF0aW9ucyAtIHNob3VsZCBob3BlZnVsbHkgd29yayBiZXR0ZXIuIGxidCAqLwotCWR1bXAtPm1hZ2ljID0gQ01BR0lDOwotCWR1bXAtPnN0YXJ0X2NvZGUgPSAwOwotCWR1bXAtPnN0YXJ0X3N0YWNrID0gcmR1c3AoKSAmIH4oUEFHRV9TSVpFIC0gMSk7Ci0JZHVtcC0+dV90c2l6ZSA9ICgodW5zaWduZWQgbG9uZykgY3VycmVudC0+bW0tPmVuZF9jb2RlKSA+PiBQQUdFX1NISUZUOwotCWR1bXAtPnVfZHNpemUgPSAoKHVuc2lnbmVkIGxvbmcpIChjdXJyZW50LT5tbS0+YnJrICsKLQkJCQkJICAoUEFHRV9TSVpFLTEpKSkgPj4gUEFHRV9TSElGVDsKLQlkdW1wLT51X2RzaXplIC09IGR1bXAtPnVfdHNpemU7Ci0JZHVtcC0+dV9zc2l6ZSA9IDA7Ci0KLQlkdW1wLT51X2FyMCA9IChzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCAqKSgoKGludCkoJmR1bXAtPnJlZ3MpKSAtKChpbnQpKGR1bXApKSk7Ci0JZHVtcC0+cmVncy5lcjAgPSByZWdzLT5lcjA7Ci0JZHVtcC0+cmVncy5lcjEgPSByZWdzLT5lcjE7Ci0JZHVtcC0+cmVncy5lcjIgPSByZWdzLT5lcjI7Ci0JZHVtcC0+cmVncy5lcjMgPSByZWdzLT5lcjM7Ci0JZHVtcC0+cmVncy5lcjQgPSByZWdzLT5lcjQ7Ci0JZHVtcC0+cmVncy5lcjUgPSByZWdzLT5lcjU7Ci0JZHVtcC0+cmVncy5lcjYgPSByZWdzLT5lcjY7Ci0JZHVtcC0+cmVncy5vcmlnX2VyMCA9IHJlZ3MtPm9yaWdfZXIwOwotCWR1bXAtPnJlZ3MuY2NyID0gcmVncy0+Y2NyOwotCWR1bXAtPnJlZ3MucGMgID0gcmVncy0+cGM7Ci19Ci0KLS8qCiAgKiBzeXNfZXhlY3ZlKCkgZXhlY3V0ZXMgYSBuZXcgcHJvZ3JhbS4KICAqLwogYXNtbGlua2FnZSBpbnQgc3lzX2V4ZWN2ZShjaGFyICpuYW1lLCBjaGFyICoqYXJndiwgY2hhciAqKmVudnAsaW50IGR1bW15LC4uLikKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvbW0vbWVtb3J5LmMgYi9hcmNoL2g4MzAwL21tL21lbW9yeS5jCmluZGV4IGY0ZGRlY2UuLjgxZWFjZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvbW0vbWVtb3J5LmMKKysrIGIvYXJjaC9oODMwMC9tbS9tZW1vcnkuYwpAQCAtNTUsMTYgKzU1LDMgQEAKIAlyZXR1cm4gcGFkZHI7CiB9CiAKLSNpZmRlZiBNQUdJQ19ST01fUFRSCi0KLWludCBpc19pbl9yb20odW5zaWduZWQgbG9uZyBhZGRyKQotewotCS8qIEFueXRoaW5nIG5vdCBpbiBvcGVyYXRpb25hbCBSQU0gaXMgcmV0dXJuZWQgYXMgaW4gcm9tISAqLwotCWlmIChhZGRyIDwgX3JhbXN0YXJ0IHx8IGFkZHIgPj0gX3JhbWVuZCkKLSAJCXJldHVybiAxOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9wdHJhY2VfaDgzMDBoLmMgYi9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9wdHJhY2VfaDgzMDBoLmMKaW5kZXggNmFjOTNjMC4uNzQ2YjFhZSAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvcHRyYWNlX2g4MzAwaC5jCisrKyBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL3B0cmFjZV9oODMwMGguYwpAQCAtOTgsNyArOTgsNyBAQAogCQkudHlwZSAgICAgICA9IGptcCwgXAogCX0KIAotY29uc3Qgc3RhdGljIHN0cnVjdCBvcHRhYmxlIG9wdGFibGVfMFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRhYmxlIG9wdGFibGVfMFtdID0gewogCU9QVEFCTEUoMHgwMCwweGZmLCAxLG5vbmUpLCAvKiAweDAwICovCiAJT1BUQUJMRSgweDAxLDB4ZmYsLTEsbm9uZSksIC8qIDB4MDEgKi8KIAlPUFRBQkxFKDB4MDIsMHhmZSwgMSxub25lKSwgLyogMHgwMi0weDAzICovCkBAIC0xMzEsMzEgKzEzMSwzMSBAQAogCU9QVEFCTEUoMHg4MCwweDgwLCAxLG5vbmUpLCAvKiAweDgwLTB4ZmYgKi8KIH07CiAKLWNvbnN0IHN0YXRpYyBzdHJ1Y3Qgb3B0YWJsZSBvcHRhYmxlXzFbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0YWJsZSBvcHRhYmxlXzFbXSA9IHsKIAlPUFRBQkxFKDB4MDAsMHhmZiwtMyxub25lKSwgLyogMHgwMTAwICovCiAJT1BUQUJMRSgweDQwLDB4ZjAsLTMsbm9uZSksIC8qIDB4MDE0MC0weDE0ZiAqLwogCU9QVEFCTEUoMHg4MCwweGYwLCAxLG5vbmUpLCAvKiAweDAxODAtMHgwMThmICovCiAJT1BUQUJMRSgweGMwLDB4YzAsIDIsbm9uZSksIC8qIDB4MDFjMC0weDAxZmYgKi8KIH07CiAKLWNvbnN0IHN0YXRpYyBzdHJ1Y3Qgb3B0YWJsZSBvcHRhYmxlXzJbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0YWJsZSBvcHRhYmxlXzJbXSA9IHsKIAlPUFRBQkxFKDB4MDAsMHgyMCwgMixub25lKSwgLyogMHg2YTA/LzB4NmE4Py8weDZiMD8vMHg2Yjg/ICovCiAJT1BUQUJMRSgweDIwLDB4MjAsIDMsbm9uZSksIC8qIDB4NmEyPy8weDZhYT8vMHg2YjI/LzB4NmJhPyAqLwogfTsKIAotY29uc3Qgc3RhdGljIHN0cnVjdCBvcHRhYmxlIG9wdGFibGVfM1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRhYmxlIG9wdGFibGVfM1tdID0gewogCU9QVEFCTEUoMHg2OSwweGZiLCAyLG5vbmUpLCAvKiAweDAxMDA2OS8weDAxMDA2ZC8wMTQwNjkvMHgwMTQwNmQgKi8KIAlPUFRBQkxFKDB4NmIsMHhmZiwtNCxub25lKSwgLyogMHgwMTAwNmIvMHgwMTQwNmIgKi8KIAlPUFRBQkxFKDB4NmYsMHhmZiwgMyxub25lKSwgLyogMHgwMTAwNmYvMHgwMTQwNmYgKi8KIAlPUFRBQkxFKDB4NzgsMHhmZiwgNSxub25lKSwgLyogMHgwMTAwNzgvMHgwMTQwNzggKi8KIH07CiAKLWNvbnN0IHN0YXRpYyBzdHJ1Y3Qgb3B0YWJsZSBvcHRhYmxlXzRbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0YWJsZSBvcHRhYmxlXzRbXSA9IHsKIAlPUFRBQkxFKDB4MDAsMHg3OCwgMyxub25lKSwgLyogMHgwMTAwNjkwPy8weDAxMDA2ZDA/LzAxNDA2OTAvMHgwMTQwNmQwPy8weDAxMDA2OTg/LzB4MDEwMDZkOD8vMDE0MDY5OD8vMHgwMTQwNmQ4PyAqLwogCU9QVEFCTEUoMHgyMCwweDc4LCA0LG5vbmUpLCAvKiAweDAxMDA2OTI/LzB4MDEwMDZkMj8vMDE0MDY5Mi8weDAxNDA2ZDI/LzB4MDEwMDY5YT8vMHgwMTAwNmRhPy8wMTQwNjlhPy8weDAxNDA2ZGE/ICovCiB9OwogCi1jb25zdCBzdGF0aWMgc3RydWN0IG9wdGFibGVzX2xpc3Qgeworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRhYmxlc19saXN0IHsKIAljb25zdCBzdHJ1Y3Qgb3B0YWJsZSAqcHRyOwogCWludCBzaXplOwogfSBvcHRhYmxlc1tdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvaW50cy5jIGIvYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvaW50cy5jCmluZGV4IDU0NDFjZGQuLmY2ZWQ2NjMgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL2ludHMuYworKysgYi9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9pbnRzLmMKQEAgLTUyLDcgKzUyLDcgQEAKIAl1bnNpZ25lZCBjaGFyIGJpdF9ubzsKIH07CiAvKiBJU1RSID0gMCAqLwotY29uc3Qgc3RhdGljIHN0cnVjdCBpcnFfcGlucyBpcnFfYXNzaWduX3RhYmxlMFsxNl09eworc3RhdGljIGNvbnN0IHN0cnVjdCBpcnFfcGlucyBpcnFfYXNzaWduX3RhYmxlMFsxNl09ewogICAgICAgICB7SDgzMDBfR1BJT19QNSxIODMwMF9HUElPX0IwfSx7SDgzMDBfR1BJT19QNSxIODMwMF9HUElPX0IxfSwKIAl7SDgzMDBfR1BJT19QNSxIODMwMF9HUElPX0IyfSx7SDgzMDBfR1BJT19QNSxIODMwMF9HUElPX0IzfSwKIAl7SDgzMDBfR1BJT19QNSxIODMwMF9HUElPX0I0fSx7SDgzMDBfR1BJT19QNSxIODMwMF9HUElPX0I1fSwKQEAgLTYzLDcgKzYzLDcgQEAKIAl7SDgzMDBfR1BJT19QRixIODMwMF9HUElPX0IxfSx7SDgzMDBfR1BJT19QRixIODMwMF9HUElPX0IyfSwKIH07CiAvKiBJU1RSID0gMSAqLwotY29uc3Qgc3RhdGljIHN0cnVjdCBpcnFfcGlucyBpcnFfYXNzaWduX3RhYmxlMVsxNl09eworc3RhdGljIGNvbnN0IHN0cnVjdCBpcnFfcGlucyBpcnFfYXNzaWduX3RhYmxlMVsxNl09ewogCXtIODMwMF9HUElPX1A4LEg4MzAwX0dQSU9fQjB9LHtIODMwMF9HUElPX1A4LEg4MzAwX0dQSU9fQjF9LAogCXtIODMwMF9HUElPX1A4LEg4MzAwX0dQSU9fQjJ9LHtIODMwMF9HUElPX1A4LEg4MzAwX0dQSU9fQjN9LAogCXtIODMwMF9HUElPX1A4LEg4MzAwX0dQSU9fQjR9LHtIODMwMF9HUElPX1A4LEg4MzAwX0dQSU9fQjV9LApkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvaW50c19oOHMuYyBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL2ludHNfaDhzLmMKaW5kZXggZjUzZGU0OS4uODI2OGRmZCAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvaW50c19oOHMuYworKysgYi9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9pbnRzX2g4cy5jCkBAIC00Miw3ICs0Miw3IEBACiAJdW5zaWduZWQgY2hhciBiaXRfbm87CiB9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMSkscGFja2VkKSk7CiAvKiBJU1RSID0gMCAqLwotY29uc3Qgc3RhdGljIHN0cnVjdCBpcnFfcGlucyBpcnFfYXNzaWduX3RhYmxlMFsxNl09eworc3RhdGljIGNvbnN0IHN0cnVjdCBpcnFfcGlucyBpcnFfYXNzaWduX3RhYmxlMFsxNl09ewogICAgICAgICB7SDgzMDBfR1BJT19QNSxIODMwMF9HUElPX0IwfSx7SDgzMDBfR1BJT19QNSxIODMwMF9HUElPX0IxfSwKIAl7SDgzMDBfR1BJT19QNSxIODMwMF9HUElPX0IyfSx7SDgzMDBfR1BJT19QNSxIODMwMF9HUElPX0IzfSwKIAl7SDgzMDBfR1BJT19QNSxIODMwMF9HUElPX0I0fSx7SDgzMDBfR1BJT19QNSxIODMwMF9HUElPX0I1fSwKQEAgLTUzLDcgKzUzLDcgQEAKIAl7SDgzMDBfR1BJT19QRixIODMwMF9HUElPX0IxfSx7SDgzMDBfR1BJT19QRixIODMwMF9HUElPX0IyfSwKIH07IAogLyogSVNUUiA9IDEgKi8KLWNvbnN0IHN0YXRpYyBzdHJ1Y3QgaXJxX3BpbnMgaXJxX2Fzc2lnbl90YWJsZTFbMTZdPXsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXJxX3BpbnMgaXJxX2Fzc2lnbl90YWJsZTFbMTZdPXsKIAl7SDgzMDBfR1BJT19QOCxIODMwMF9HUElPX0IwfSx7SDgzMDBfR1BJT19QOCxIODMwMF9HUElPX0IxfSwKIAl7SDgzMDBfR1BJT19QOCxIODMwMF9HUElPX0IyfSx7SDgzMDBfR1BJT19QOCxIODMwMF9HUElPX0IzfSwKIAl7SDgzMDBfR1BJT19QOCxIODMwMF9HUElPX0I0fSx7SDgzMDBfR1BJT19QOCxIODMwMF9HUElPX0I1fSwKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9LY29uZmlnIGIvYXJjaC9pMzg2L0tjb25maWcKaW5kZXggOTY4ZmFiZC4uY2JkZTY3NSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L0tjb25maWcKKysrIGIvYXJjaC9pMzg2L0tjb25maWcKQEAgLTI5LDEwICsyOSw2IEBACiBjb25maWcgU0JVUwogCWJvb2wKIAotY29uZmlnIFVJRDE2Ci0JYm9vbAotCWRlZmF1bHQgeQotCiBjb25maWcgR0VORVJJQ19JU0FfRE1BCiAJYm9vbAogCWRlZmF1bHQgeQpAQCAtNDUsOCArNDEsMjEgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBETUkKKwlib29sCisJZGVmYXVsdCB5CisKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCitjb25maWcgRE9VQkxFRkFVTFQKKwlkZWZhdWx0IHkKKwlib29sICJFbmFibGUgZG91YmxlZmF1bHQgZXhjZXB0aW9uIGhhbmRsZXIiIGlmIEVNQkVEREVECisJaGVscAorICAgICAgICAgIFRoaXMgb3B0aW9uIGFsbG93cyB0cmFwcGluZyBvZiByYXJlIGRvdWJsZWZhdWx0IGV4Y2VwdGlvbnMgdGhhdAorICAgICAgICAgIHdvdWxkIG90aGVyd2lzZSBjYXVzZSBhIHN5c3RlbSB0byBzaWxlbnRseSByZWJvb3QuIERpc2FibGluZyB0aGlzCisgICAgICAgICAgb3B0aW9uIHNhdmVzIGFib3V0IDRrIGFuZCBtaWdodCBjYXVzZSB5b3UgbXVjaCBhZGRpdGlvbmFsIGdyZXkKKyAgICAgICAgICBoYWlyLgorCiBtZW51ICJQcm9jZXNzb3IgdHlwZSBhbmQgZmVhdHVyZXMiCiAKIGNob2ljZQpAQCAtNjMwLDEwICs2MzksNiBAQAogCWFuZCBwYXNzZXMgdGhlIGZpcnN0IHRocmVlIGFyZ3VtZW50cyBvZiBhIGZ1bmN0aW9uIGNhbGwgaW4gcmVnaXN0ZXJzLgogCVRoaXMgd2lsbCBwcm9iYWJseSBicmVhayBiaW5hcnkgb25seSBtb2R1bGVzLgogCi0JVGhpcyBmZWF0dXJlIGlzIG9ubHkgZW5hYmxlZCBmb3IgZ2NjLTMuMCBhbmQgbGF0ZXIgLSBlYXJsaWVyIGNvbXBpbGVycwotCWdlbmVyYXRlIGluY29ycmVjdCBvdXRwdXQgd2l0aCBjZXJ0YWluIGtlcm5lbCBjb25zdHJ1Y3RzIHdoZW4KLQktbXJlZ3Bhcm09MyBpcyB1c2VkLgotCiBjb25maWcgU0VDQ09NUAogCWJvb2wgIkVuYWJsZSBzZWNjb21wIHRvIHNhZmVseSBjb21wdXRlIHVudHJ1c3RlZCBieXRlY29kZSIKIAlkZXBlbmRzIG9uIFBST0NfRlMKQEAgLTY1MywxNyArNjU4LDYgQEAKIAogc291cmNlIGtlcm5lbC9LY29uZmlnLmh6CiAKLWNvbmZpZyBQSFlTSUNBTF9TVEFSVAotCWhleCAiUGh5c2ljYWwgYWRkcmVzcyB3aGVyZSB0aGUga2VybmVsIGlzIGxvYWRlZCIgaWYgRU1CRURERUQKLQlkZWZhdWx0ICIweDEwMDAwMCIKLQloZWxwCi0JICBUaGlzIGdpdmVzIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHdoZXJlIHRoZSBrZXJuZWwgaXMgbG9hZGVkLgotCSAgUHJpbWFyaWx5IHVzZWQgaW4gdGhlIGNhc2Ugb2Yga2V4ZWMgb24gcGFuaWMgd2hlcmUgdGhlCi0JICBmYWlsIHNhZmUga2VybmVsIG5lZWRzIHRvIHJ1biBhdCBhIGRpZmZlcmVudCBhZGRyZXNzIHRoYW4KLQkgIHRoZSBwYW5pYy1lZCBrZXJuZWwuCi0KLQkgIERvbid0IGNoYW5nZSB0aGlzIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCi0KIGNvbmZpZyBLRVhFQwogCWJvb2wgImtleGVjIHN5c3RlbSBjYWxsIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCkBAIC02ODMsMTEgKzY3Nyw0MCBAQAogCiBjb25maWcgQ1JBU0hfRFVNUAogCWJvb2wgImtlcm5lbCBjcmFzaCBkdW1wcyAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEVNQkVEREVECiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAlkZXBlbmRzIG9uIEhJR0hNRU0KIAloZWxwCiAJICBHZW5lcmF0ZSBjcmFzaCBkdW1wIGFmdGVyIGJlaW5nIHN0YXJ0ZWQgYnkga2V4ZWMuCisKK2NvbmZpZyBQSFlTSUNBTF9TVEFSVAorCWhleCAiUGh5c2ljYWwgYWRkcmVzcyB3aGVyZSB0aGUga2VybmVsIGlzIGxvYWRlZCIgaWYgKEVNQkVEREVEIHx8IENSQVNIX0RVTVApCisKKwlkZWZhdWx0ICIweDEwMDAwMDAiIGlmIENSQVNIX0RVTVAKKwlkZWZhdWx0ICIweDEwMDAwMCIKKwloZWxwCisJICBUaGlzIGdpdmVzIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHdoZXJlIHRoZSBrZXJuZWwgaXMgbG9hZGVkLiBOb3JtYWxseQorCSAgZm9yIHJlZ3VsYXIga2VybmVscyB0aGlzIHZhbHVlIGlzIDB4MTAwMDAwICgxTUIpLiBCdXQgaW4gdGhlIGNhc2UKKwkgIG9mIGtleGVjIG9uIHBhbmljIHRoZSBmYWlsIHNhZmUga2VybmVsIG5lZWRzIHRvIHJ1biBhdCBhIGRpZmZlcmVudAorCSAgYWRkcmVzcyB0aGFuIHRoZSBwYW5pYy1lZCBrZXJuZWwuIFRoaXMgb3B0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBsb2FkCisJICBhZGRyZXNzIGZvciBrZXJuZWxzIHVzZWQgdG8gY2FwdHVyZSBjcmFzaCBkdW1wIG9uIGJlaW5nIGtleGVjJ2VkCisJICBhZnRlciBwYW5pYy4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGNyYXNoIGR1bXAga2VybmVscyBpcworCSAgMHgxMDAwMDAwICgxNk1CKS4gVGhpcyBjYW4gYWxzbyBiZSBzZXQgYmFzZWQgb24gdGhlICJYIiB2YWx1ZSBhcworCSAgc3BlY2lmaWVkIGluIHRoZSAiY3Jhc2hrZXJuZWw9WU1AWE0iIGNvbW1hbmQgbGluZSBib290IHBhcmFtZXRlcgorCSAgcGFzc2VkIHRvIHRoZSBwYW5pYy1lZCBrZXJuZWwuIFR5cGljYWxseSB0aGlzIHBhcmFtZXRlciBpcyBzZXQgYXMKKwkgIGNyYXNoa2VybmVsPTY0TUAxNk0uIFBsZWFzZSB0YWtlIGEgbG9vayBhdAorCSAgRG9jdW1lbnRhdGlvbi9rZHVtcC9rZHVtcC50eHQgZm9yIG1vcmUgZGV0YWlscyBhYm91dCBjcmFzaCBkdW1wcy4KKworCSAgRG9uJ3QgY2hhbmdlIHRoaXMgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KKworY29uZmlnIEhPVFBMVUdfQ1BVCisJYm9vbCAiU3VwcG9ydCBmb3IgaG90LXBsdWdnYWJsZSBDUFVzIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gU01QICYmIEhPVFBMVUcgJiYgRVhQRVJJTUVOVEFMCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSB0byBleHBlcmltZW50IHdpdGggdHVybmluZyBDUFVzIG9mZiBhbmQgb24uICBDUFVzCisJICBjYW4gYmUgY29udHJvbGxlZCB0aHJvdWdoIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1LgorCisJICBTYXkgTi4KKwogZW5kbWVudQogCiAKQEAgLTcwMyw3ICs3MjYsNyBAQAogCiBjb25maWcgQVBNCiAJdHJpc3RhdGUgIkFQTSAoQWR2YW5jZWQgUG93ZXIgTWFuYWdlbWVudCkgQklPUyBzdXBwb3J0IgotCWRlcGVuZHMgb24gUE0gJiYgUE1fTEVHQUNZCisJZGVwZW5kcyBvbiBQTQogCS0tLWhlbHAtLS0KIAkgIEFQTSBpcyBhIEJJT1Mgc3BlY2lmaWNhdGlvbiBmb3Igc2F2aW5nIHBvd2VyIHVzaW5nIHNldmVyYWwgZGlmZmVyZW50CiAJICB0ZWNobmlxdWVzLiBUaGlzIGlzIG1vc3RseSB1c2VmdWwgZm9yIGJhdHRlcnkgcG93ZXJlZCBsYXB0b3BzIHdpdGgKQEAgLTk3NCwxNSArOTk3LDYgQEAKIAkgIFRoaXMgc3VwcG9ydCBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZS4gIElmIGNvbXBpbGVkIGFzIGEKIAkgIG1vZHVsZSwgaXQgd2lsbCBiZSBjYWxsZWQgc2N4MjAwLgogCi1jb25maWcgSE9UUExVR19DUFUKLQlib29sICJTdXBwb3J0IGZvciBob3QtcGx1Z2dhYmxlIENQVXMgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBTTVAgJiYgSE9UUExVRyAmJiBFWFBFUklNRU5UQUwKLQktLS1oZWxwLS0tCi0JICBTYXkgWSBoZXJlIHRvIGV4cGVyaW1lbnQgd2l0aCB0dXJuaW5nIENQVXMgb2ZmIGFuZCBvbi4gIENQVXMKLQkgIGNhbiBiZSBjb250cm9sbGVkIHRocm91Z2ggL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUuCi0KLQkgIFNheSBOLgotCiBzb3VyY2UgImRyaXZlcnMvcGNtY2lhL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9wY2kvaG90cGx1Zy9LY29uZmlnIgpAQCAtMTA1OSwzICsxMDczLDcgQEAKIAlib29sCiAJZGVwZW5kcyBvbiBYODZfU01QIHx8IChYODZfVk9ZQUdFUiAmJiBTTVApCiAJZGVmYXVsdCB5CisKK2NvbmZpZyBLVElNRV9TQ0FMQVIKKwlib29sCisJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvTWFrZWZpbGUgYi9hcmNoL2kzODYvTWFrZWZpbGUKaW5kZXggZDEyMWVhMS4uMzZiZWY2NSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9NYWtlZmlsZQpAQCAtMzcsMTQgKzM3LDExIEBACiAjIENQVS1zcGVjaWZpYyB0dW5pbmcuIEFueXRoaW5nIHdoaWNoIGNhbiBiZSBzaGFyZWQgd2l0aCBVTUwgc2hvdWxkIGdvIGhlcmUuCiBpbmNsdWRlICQoc3JjdHJlZSkvYXJjaC9pMzg2L01ha2VmaWxlLmNwdQogCi0jIC1tcmVncGFybT0zIHdvcmtzIG9rIG9uIGdjYy0zLjAgYW5kIGxhdGVyCi0jCi1HQ0NfVkVSU0lPTgkJCTo9ICQoY2FsbCBjYy12ZXJzaW9uKQotY2ZsYWdzLSQoQ09ORklHX1JFR1BBUk0pIAkrPSAkKHNoZWxsIGlmIFsgJChHQ0NfVkVSU0lPTikgLWdlIDAzMDAgXSA7IHRoZW4gZWNobyAiLW1yZWdwYXJtPTMiOyBmaSA7KQorY2ZsYWdzLSQoQ09ORklHX1JFR1BBUk0pICs9IC1tcmVncGFybT0zCiAKLSMgRGlzYWJsZSB1bml0LWF0LWEtdGltZSBtb2RlLCBpdCBtYWtlcyBnY2MgdXNlIGEgbG90IG1vcmUgc3RhY2sKLSMgZHVlIHRvIHRoZSBsYWNrIG9mIHNoYXJpbmcgb2Ygc3RhY2tsb3RzLgotQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLWZuby11bml0LWF0LWEtdGltZSkKKyMgRGlzYWJsZSB1bml0LWF0LWEtdGltZSBtb2RlIG9uIHByZS1nY2MtNC4wIGNvbXBpbGVycywgaXQgbWFrZXMgZ2NjIHVzZQorIyBhIGxvdCBtb3JlIHN0YWNrIGR1ZSB0byB0aGUgbGFjayBvZiBzaGFyaW5nIG9mIHN0YWNrbG90czoKK0NGTEFHUwkJCQkrPSAkKHNoZWxsIGlmIFsgJChjYWxsIGNjLXZlcnNpb24pIC1sdCAwNDAwIF0gOyB0aGVuIGVjaG8gJChjYWxsIGNjLW9wdGlvbiwtZm5vLXVuaXQtYXQtYS10aW1lKTsgZmkgOykKIAogQ0ZMQUdTICs9ICQoY2ZsYWdzLXkpCiAKQEAgLTEwMyw3ICsxMDAsNyBAQAogYm9vdCA6PSBhcmNoL2kzODYvYm9vdAogCiAuUEhPTlk6IHpJbWFnZSBiekltYWdlIGNvbXByZXNzZWQgemxpbG8gYnpsaWxvIFwKLQl6ZGlzayBiemRpc2sgZmRpbWFnZSBmZGltYWdlMTQ0IGZkaW1hZ2UyODggaW5zdGFsbCBrZXJuZWxfaW5zdGFsbAorCXpkaXNrIGJ6ZGlzayBmZGltYWdlIGZkaW1hZ2UxNDQgZmRpbWFnZTI4OCBpbnN0YWxsCiAKIGFsbDogYnpJbWFnZQogCkBAIC0xMjUsOCArMTIyLDcgQEAKIGZkaW1hZ2UgZmRpbWFnZTE0NCBmZGltYWdlMjg4OiB2bWxpbnV4CiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSBCT09USU1BR0U9JChLQlVJTERfSU1BR0UpICRACiAKLWluc3RhbGw6IHZtbGludXgKLWluc3RhbGwga2VybmVsX2luc3RhbGw6CitpbnN0YWxsOgogCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgQk9PVElNQUdFPSQoS0JVSUxEX0lNQUdFKSBpbnN0YWxsCiAKIGFyY2hjbGVhbjoKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9NYWtlZmlsZS5jcHUgYi9hcmNoL2kzODYvTWFrZWZpbGUuY3B1CmluZGV4IDhlNTE0NTYuLmRjZDkzNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9NYWtlZmlsZS5jcHUKKysrIGIvYXJjaC9pMzg2L01ha2VmaWxlLmNwdQpAQCAtMSw3ICsxLDcgQEAKICMgQ1BVIHR1bmluZyBzZWN0aW9uIC0gc2hhcmVkIHdpdGggVU1MLgogIyBNdXN0IGNoYW5nZSBvbmx5IGNmbGFncy15IChvciBbeW5dKSwgbm90IENGTEFHUyEgVGhhdCBtYWtlcyBhIGRpZmZlcmVuY2UgZm9yIFVNTC4KIAotIy1tdHVuZSBleGlzdHMgc2luY2UgZ2NjIDMuNCwgYW5kIHNvbWUgLW1jcHUgZmxhdm9ycyBkaWRuJ3QgZXhpc3QgaW4gZ2NjIDIuOTUuCisjLW10dW5lIGV4aXN0cyBzaW5jZSBnY2MgMy40CiBIQVNfTVRVTkUJOj0gJChjYWxsIGNjLW9wdGlvbi15biwgLW10dW5lPWkzODYpCiBpZmVxICgkKEhBU19NVFVORSkseSkKIHR1bmUJCT0gJChjYWxsIGNjLW9wdGlvbiwtbXR1bmU9JCgxKSwpCkBAIC0xNCw3ICsxNCw3IEBACiBjZmxhZ3MtJChDT05GSUdfTTQ4NikJCSs9IC1tYXJjaD1pNDg2CiBjZmxhZ3MtJChDT05GSUdfTTU4NikJCSs9IC1tYXJjaD1pNTg2CiBjZmxhZ3MtJChDT05GSUdfTTU4NlRTQykJKz0gLW1hcmNoPWk1ODYKLWNmbGFncy0kKENPTkZJR19NNTg2TU1YKQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD1wZW50aXVtLW1teCwtbWFyY2g9aTU4NikKK2NmbGFncy0kKENPTkZJR19NNTg2TU1YKQkrPSAtbWFyY2g9cGVudGl1bS1tbXgKIGNmbGFncy0kKENPTkZJR19NNjg2KQkJKz0gLW1hcmNoPWk2ODYKIGNmbGFncy0kKENPTkZJR19NUEVOVElVTUlJKQkrPSAtbWFyY2g9aTY4NiAkKGNhbGwgdHVuZSxwZW50aXVtMikKIGNmbGFncy0kKENPTkZJR19NUEVOVElVTUlJSSkJKz0gLW1hcmNoPWk2ODYgJChjYWxsIHR1bmUscGVudGl1bTMpCkBAIC0yMyw4ICsyMyw4IEBACiBjZmxhZ3MtJChDT05GSUdfTUs2KQkJKz0gLW1hcmNoPWs2CiAjIFBsZWFzZSBub3RlLCB0aGF0IHBhdGNoZXMgdGhhdCBhZGQgLW1hcmNoPWF0aGxvbi14cCBhbmQgZnJpZW5kcyBhcmUgcG9pbnRsZXNzLgogIyBUaGV5IG1ha2UgemVybyBkaWZmZXJlbmNlIHdoYXRzb3NldmVyIHRvIHBlcmZvcm1hbmNlIGF0IHRoaXMgdGltZS4KLWNmbGFncy0kKENPTkZJR19NSzcpCQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD1hdGhsb24sLW1hcmNoPWk2ODYgJChhbGlnbiktZnVuY3Rpb25zPTQpCi1jZmxhZ3MtJChDT05GSUdfTUs4KQkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9azgsJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9YXRobG9uLC1tYXJjaD1pNjg2ICQoYWxpZ24pLWZ1bmN0aW9ucz00KSkKK2NmbGFncy0kKENPTkZJR19NSzcpCQkrPSAtbWFyY2g9YXRobG9uCitjZmxhZ3MtJChDT05GSUdfTUs4KQkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9azgsLW1hcmNoPWF0aGxvbikKIGNmbGFncy0kKENPTkZJR19NQ1JVU09FKQkrPSAtbWFyY2g9aTY4NiAkKGFsaWduKS1mdW5jdGlvbnM9MCAkKGFsaWduKS1qdW1wcz0wICQoYWxpZ24pLWxvb3BzPTAKIGNmbGFncy0kKENPTkZJR19NRUZGSUNFT04pCSs9IC1tYXJjaD1pNjg2ICQoY2FsbCB0dW5lLHBlbnRpdW0zKSAkKGFsaWduKS1mdW5jdGlvbnM9MCAkKGFsaWduKS1qdW1wcz0wICQoYWxpZ24pLWxvb3BzPTAKIGNmbGFncy0kKENPTkZJR19NV0lOQ0hJUEM2KQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD13aW5jaGlwLWM2LC1tYXJjaD1pNTg2KQpAQCAtMzcsNSArMzcsNSBAQAogY2ZsYWdzLSQoQ09ORklHX1g4Nl9FTEFOKQkrPSAtbWFyY2g9aTQ4NgogCiAjIEdlb2RlIEdYMSBzdXBwb3J0Ci1jZmxhZ3MtJChDT05GSUdfTUdFT0RFR1gxKQkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9cGVudGl1bS1tbXgsLW1hcmNoPWk0ODYpCitjZmxhZ3MtJChDT05GSUdfTUdFT0RFR1gxKQkrPSAtbWFyY2g9cGVudGl1bS1tbXgKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvTWFrZWZpbGUgYi9hcmNoL2kzODYvYm9vdC9NYWtlZmlsZQppbmRleCAxZTcxMzgyLi5mMTM2NzUyIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL2kzODYvYm9vdC9NYWtlZmlsZQpAQCAtMTAwLDUgKzEwMCw1IEBACiAJY3AgU3lzdGVtLm1hcCAkKElOU1RBTExfUEFUSCkvCiAJaWYgWyAteCAvc2Jpbi9saWxvIF07IHRoZW4gL3NiaW4vbGlsbzsgZWxzZSAvZXRjL2xpbG8vaW5zdGFsbDsgZmkKIAotaW5zdGFsbDogJChCT09USU1BR0UpCi0Jc2ggJChzcmN0cmVlKS8kKHNyYykvaW5zdGFsbC5zaCAkKEtFUk5FTFJFTEVBU0UpICQ8IFN5c3RlbS5tYXAgIiQoSU5TVEFMTF9QQVRIKSIKK2luc3RhbGw6CisJc2ggJChzcmN0cmVlKS8kKHNyYykvaW5zdGFsbC5zaCAkKEtFUk5FTFJFTEVBU0UpICQoQk9PVElNQUdFKSBTeXN0ZW0ubWFwICIkKElOU1RBTExfUEFUSCkiCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL21pc2MuYyBiL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jCmluZGV4IDgyYTgwN2YuLmYxOWYzYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jCisrKyBiL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jCkBAIC0xMSw3ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjcmVlbl9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvaW5zdGFsbC5zaCBiL2FyY2gvaTM4Ni9ib290L2luc3RhbGwuc2gKaW5kZXggZjE3YjQwZC4uNWU0NGM3MyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2Jvb3QvaW5zdGFsbC5zaAorKysgYi9hcmNoL2kzODYvYm9vdC9pbnN0YWxsLnNoCkBAIC0xOSw2ICsxOSwyMCBAQAogIyAgICQ0IC0gZGVmYXVsdCBpbnN0YWxsIHBhdGggKGJsYW5rIGlmIHJvb3QgZGlyZWN0b3J5KQogIwogCit2ZXJpZnkgKCkgeworCWlmIFsgISAtZiAiJDEiIF07IHRoZW4KKwkJZWNobyAiIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE+JjIKKwkJZWNobyAiICoqKiBNaXNzaW5nIGZpbGU6ICQxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE+JjIKKwkJZWNobyAnICoqKiBZb3UgbmVlZCB0byBydW4gIm1ha2UiIGJlZm9yZSAibWFrZSBpbnN0YWxsIi4nIDE+JjIKKwkJZWNobyAiIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE+JjIKKwkJZXhpdCAxCisgCWZpCit9CisKKyMgTWFrZSBzdXJlIHRoZSBmaWxlcyBhY3R1YWxseSBleGlzdAordmVyaWZ5ICIkMiIKK3ZlcmlmeSAiJDMiCisKICMgVXNlciBtYXkgaGF2ZSBhIGN1c3RvbSBpbnN0YWxsIHNjcmlwdAogCiBpZiBbIC14IH4vYmluLyR7Q1JPU1NfQ09NUElMRX1pbnN0YWxsa2VybmVsIF07IHRoZW4gZXhlYyB+L2Jpbi8ke0NST1NTX0NPTVBJTEV9aW5zdGFsbGtlcm5lbCAiJEAiOyBmaQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvdmlkZW8uUyBiL2FyY2gvaTM4Ni9ib290L3ZpZGVvLlMKaW5kZXggOTJmNjY5NC4uMmFjNDBjOCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2Jvb3QvdmlkZW8uUworKysgYi9hcmNoL2kzODYvYm9vdC92aWRlby5TCkBAIC05Nyw3ICs5Nyw2IEBACiAjZGVmaW5lIFBBUkFNX1ZFU0FQTV9PRkYJMHgzMAogI2RlZmluZSBQQVJBTV9MRkJfUEFHRVMJCTB4MzIKICNkZWZpbmUgUEFSQU1fVkVTQV9BVFRSSUIJMHgzNAotI2RlZmluZSBQQVJBTV9DQVBBQklMSVRJRVMgICAgICAweDM2CiAKIC8qIERlZmluZSBET19TVE9SRSBhY2NvcmRpbmcgdG8gQ09ORklHX1ZJREVPX1JFVEFJTiAqLwogI2lmZGVmIENPTkZJR19WSURFT19SRVRBSU4KQEAgLTIzNCwxMCArMjMzLDYgQEAKIAltb3Z3CTE4KCVkaSksICVheAogCW1vdmwJJWVheCwgJWZzOihQQVJBTV9MRkJfU0laRSkKIAotIyBzdG9yZSBtb2RlIGNhcGFiaWxpdGllcwotCW1vdmwgICAgMTAoJWRpKSwgJWVheAotCW1vdmwgICAgJWVheCwgJWZzOihQQVJBTV9DQVBBQklMSVRJRVMpCi0KICMgc3dpdGNoaW5nIHRoZSBEQUMgdG8gOC1iaXQgaXMgZm9yIDw9IDggYnBwIG9ubHkKIAltb3Z3CSVmczooUEFSQU1fTEZCX0RFUFRIKSwgJWF4CiAJY21wdwkkOCwgJWF4CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvY3J5cHRvL2Flcy1pNTg2LWFzbS5TIGIvYXJjaC9pMzg2L2NyeXB0by9hZXMtaTU4Ni1hc20uUwppbmRleCA3YjczYzY3Li45MTFiMTUzIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvY3J5cHRvL2Flcy1pNTg2LWFzbS5TCisrKyBiL2FyY2gvaTM4Ni9jcnlwdG8vYWVzLWk1ODYtYXNtLlMKQEAgLTI1NSwxOCArMjU1LDE3IEBACiAJeG9yICAgICA4KCVlYnApLCVyNAogCXhvciAgICAgMTIoJWVicCksJXI1CiAKLQlzdWIgICAgICQ4LCVlc3AgICAgICAgICAgIC8vIHNwYWNlIGZvciByZWdpc3RlciBzYXZlcyBvbiBzdGFjawotCWFkZCAgICAgJDE2LCVlYnAgICAgICAgICAgLy8gaW5jcmVtZW50IHRvIG5leHQgcm91bmQga2V5Ci0Jc3ViICAgICAkMTAsJXIzICAgICAgICAgIAotCWplICAgICAgNGYgICAgICAgICAgICAgIC8vIDEwIHJvdW5kcyBmb3IgMTI4LWJpdCBrZXkKLQlhZGQgICAgICQzMiwlZWJwCi0Jc3ViICAgICAkMiwlcjMKLQlqZSAgICAgIDNmICAgICAgICAgICAgICAvLyAxMiByb3VuZHMgZm9yIDEyOC1iaXQga2V5Ci0JYWRkICAgICAkMzIsJWVicAorCXN1YiAgICAgJDgsJWVzcAkJLy8gc3BhY2UgZm9yIHJlZ2lzdGVyIHNhdmVzIG9uIHN0YWNrCisJYWRkICAgICAkMTYsJWVicAkvLyBpbmNyZW1lbnQgdG8gbmV4dCByb3VuZCBrZXkKKwljbXAgICAgICQxMiwlcjMKKwlqYiAgICAgIDRmCQkvLyAxMCByb3VuZHMgZm9yIDEyOC1iaXQga2V5CisJbGVhICAgICAzMiglZWJwKSwlZWJwCisJamUgICAgICAzZgkJLy8gMTIgcm91bmRzIGZvciAxOTItYml0IGtleQorCWxlYSAgICAgMzIoJWVicCksJWVicAogCi0yOglmd2Rfcm5kMSggLTY0KCVlYnApICxmdF90YWIpCS8vIDE0IHJvdW5kcyBmb3IgMTI4LWJpdCBrZXkKKzI6CWZ3ZF9ybmQxKCAtNjQoJWVicCkgLGZ0X3RhYikJLy8gMTQgcm91bmRzIGZvciAyNTYtYml0IGtleQogCWZ3ZF9ybmQyKCAtNDgoJWVicCkgLGZ0X3RhYikKLTM6CWZ3ZF9ybmQxKCAtMzIoJWVicCkgLGZ0X3RhYikJLy8gMTIgcm91bmRzIGZvciAxMjgtYml0IGtleQorMzoJZndkX3JuZDEoIC0zMiglZWJwKSAsZnRfdGFiKQkvLyAxMiByb3VuZHMgZm9yIDE5Mi1iaXQga2V5CiAJZndkX3JuZDIoIC0xNiglZWJwKSAsZnRfdGFiKQogNDoJZndkX3JuZDEoICAgICglZWJwKSAsZnRfdGFiKQkvLyAxMCByb3VuZHMgZm9yIDEyOC1iaXQga2V5CiAJZndkX3JuZDIoICsxNiglZWJwKSAsZnRfdGFiKQpAQCAtMzM0LDE4ICszMzMsMTcgQEAKIAl4b3IgICAgIDgoJWVicCksJXI0CiAJeG9yICAgICAxMiglZWJwKSwlcjUKIAotCXN1YiAgICAgJDgsJWVzcCAgICAgICAgIC8vIHNwYWNlIGZvciByZWdpc3RlciBzYXZlcyBvbiBzdGFjawotCXN1YiAgICAgJDE2LCVlYnAgICAgICAgIC8vIGluY3JlbWVudCB0byBuZXh0IHJvdW5kIGtleQotCXN1YiAgICAgJDEwLCVyMyAgICAgICAgICAKLQlqZSAgICAgIDRmICAgICAgICAgICAgICAvLyAxMCByb3VuZHMgZm9yIDEyOC1iaXQga2V5Ci0Jc3ViICAgICAkMzIsJWVicAotCXN1YiAgICAgJDIsJXIzCi0JamUgICAgICAzZiAgICAgICAgICAgICAgLy8gMTIgcm91bmRzIGZvciAxMjgtYml0IGtleQotCXN1YiAgICAgJDMyLCVlYnAKKwlzdWIgICAgICQ4LCVlc3AJCS8vIHNwYWNlIGZvciByZWdpc3RlciBzYXZlcyBvbiBzdGFjaworCXN1YiAgICAgJDE2LCVlYnAJLy8gaW5jcmVtZW50IHRvIG5leHQgcm91bmQga2V5CisJY21wICAgICAkMTIsJXIzCisJamIgICAgICA0ZgkJLy8gMTAgcm91bmRzIGZvciAxMjgtYml0IGtleQorCWxlYSAgICAgLTMyKCVlYnApLCVlYnAKKwlqZSAgICAgIDNmCQkvLyAxMiByb3VuZHMgZm9yIDE5Mi1iaXQga2V5CisJbGVhICAgICAtMzIoJWVicCksJWVicAogCi0yOglpbnZfcm5kMSggKzY0KCVlYnApLCBpdF90YWIpCS8vIDE0IHJvdW5kcyBmb3IgMTI4LWJpdCBrZXkKKzI6CWludl9ybmQxKCArNjQoJWVicCksIGl0X3RhYikJLy8gMTQgcm91bmRzIGZvciAyNTYtYml0IGtleQogCWludl9ybmQyKCArNDgoJWVicCksIGl0X3RhYikKLTM6CWludl9ybmQxKCArMzIoJWVicCksIGl0X3RhYikJLy8gMTIgcm91bmRzIGZvciAxMjgtYml0IGtleQorMzoJaW52X3JuZDEoICszMiglZWJwKSwgaXRfdGFiKQkvLyAxMiByb3VuZHMgZm9yIDE5Mi1iaXQga2V5CiAJaW52X3JuZDIoICsxNiglZWJwKSwgaXRfdGFiKQogNDoJaW52X3JuZDEoICAgICglZWJwKSwgaXRfdGFiKQkvLyAxMCByb3VuZHMgZm9yIDEyOC1iaXQga2V5CiAJaW52X3JuZDIoIC0xNiglZWJwKSwgaXRfdGFiKQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2NyeXB0by9hZXMuYyBiL2FyY2gvaTM4Ni9jcnlwdG8vYWVzLmMKaW5kZXggODhlZTg1Yy4uYTUwMzk3YiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2NyeXB0by9hZXMuYworKysgYi9hcmNoL2kzODYvY3J5cHRvL2Flcy5jCkBAIC0zNiw2ICszNiw4IEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgUmVkIEhhdCwgSW5jLiwgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQHJlZGhhdC5jb20+CiAgKgogICovCisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtNTksNyArNjEsNiBAQAogfTsKIAogI2RlZmluZSBXUE9MWSAweDAxMWIKLSNkZWZpbmUgdTMyX2luKHgpIGxlMzJfdG9fY3B1cCgoY29uc3QgX19sZTMyICopKHgpKQogI2RlZmluZSBieXRlczJ3b3JkKGIwLCBiMSwgYjIsIGIzKSAgXAogCSgoKHUzMikoYjMpIDw8IDI0KSB8ICgodTMyKShiMikgPDwgMTYpIHwgKCh1MzIpKGIxKSA8PCA4KSB8IChiMCkpCiAKQEAgLTkzLDcgKzk0LDYgQEAKIAogdTMyIGZ0X3RhYls0XVsyNTZdOwogdTMyIGZsX3RhYls0XVsyNTZdOwotc3RhdGljIHUzMiBsc190YWJbNF1bMjU2XTsKIHN0YXRpYyB1MzIgaW1fdGFiWzRdWzI1Nl07CiB1MzIgaWxfdGFiWzRdWzI1Nl07CiB1MzIgaXRfdGFiWzRdWzI1Nl07CkBAIC0xNDQsMTUgKzE0NCw2IEBACiAJCWZsX3RhYlsyXVtpXSA9IHVwcih3LCAyKTsKIAkJZmxfdGFiWzNdW2ldID0gdXByKHcsIDMpOwogCQkKLQkJLyoKLQkJICogdGFibGUgZm9yIGtleSBzY2hlZHVsZSBpZiBmbF90YWIgYWJvdmUgaXMKLQkJICogbm90IG9mIHRoZSByZXF1aXJlZCBmb3JtCi0JCSAqLwotCQlsc190YWJbMF1baV0gPSB3OwotCQlsc190YWJbMV1baV0gPSB1cHIodywgMSk7Ci0JCWxzX3RhYlsyXVtpXSA9IHVwcih3LCAyKTsKLQkJbHNfdGFiWzNdW2ldID0gdXByKHcsIDMpOwotCQkKIAkJYiA9IGZpKGludl9hZmZpbmUoKHU4KWkpKTsKIAkJdyA9IGJ5dGVzMndvcmQoZmUoYiksIGY5KGIpLCBmZChiKSwgZmIoYikpOwogCkBAIC0zOTMsMTMgKzM4NCwxNCBAQAogCWludCBpOwogCXUzMiBzc1s4XTsKIAlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gY3R4X2FyZzsKKwljb25zdCBfX2xlMzIgKmtleSA9IChjb25zdCBfX2xlMzIgKilpbl9rZXk7CiAKIAkvKiBlbmNyeXB0aW9uIHNjaGVkdWxlICovCiAJCi0JY3R4LT5la2V5WzBdID0gc3NbMF0gPSB1MzJfaW4oaW5fa2V5KTsKLQljdHgtPmVrZXlbMV0gPSBzc1sxXSA9IHUzMl9pbihpbl9rZXkgKyA0KTsKLQljdHgtPmVrZXlbMl0gPSBzc1syXSA9IHUzMl9pbihpbl9rZXkgKyA4KTsKLQljdHgtPmVrZXlbM10gPSBzc1szXSA9IHUzMl9pbihpbl9rZXkgKyAxMik7CisJY3R4LT5la2V5WzBdID0gc3NbMF0gPSBsZTMyX3RvX2NwdShrZXlbMF0pOworCWN0eC0+ZWtleVsxXSA9IHNzWzFdID0gbGUzMl90b19jcHUoa2V5WzFdKTsKKwljdHgtPmVrZXlbMl0gPSBzc1syXSA9IGxlMzJfdG9fY3B1KGtleVsyXSk7CisJY3R4LT5la2V5WzNdID0gc3NbM10gPSBsZTMyX3RvX2NwdShrZXlbM10pOwogCiAJc3dpdGNoKGtleV9sZW4pIHsKIAljYXNlIDE2OgpAQCAtNDEwLDggKzQwMiw4IEBACiAJCWJyZWFrOwogCQkKIAljYXNlIDI0OgotCQljdHgtPmVrZXlbNF0gPSBzc1s0XSA9IHUzMl9pbihpbl9rZXkgKyAxNik7Ci0JCWN0eC0+ZWtleVs1XSA9IHNzWzVdID0gdTMyX2luKGluX2tleSArIDIwKTsKKwkJY3R4LT5la2V5WzRdID0gc3NbNF0gPSBsZTMyX3RvX2NwdShrZXlbNF0pOworCQljdHgtPmVrZXlbNV0gPSBzc1s1XSA9IGxlMzJfdG9fY3B1KGtleVs1XSk7CiAJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCiAJCQlrZTYoY3R4LT5la2V5LCBpKTsKIAkJa2VsNihjdHgtPmVrZXksIDcpOyAKQEAgLTQxOSwxMCArNDExLDEwIEBACiAJCWJyZWFrOwogCiAJY2FzZSAzMjoKLQkJY3R4LT5la2V5WzRdID0gc3NbNF0gPSB1MzJfaW4oaW5fa2V5ICsgMTYpOwotCQljdHgtPmVrZXlbNV0gPSBzc1s1XSA9IHUzMl9pbihpbl9rZXkgKyAyMCk7Ci0JCWN0eC0+ZWtleVs2XSA9IHNzWzZdID0gdTMyX2luKGluX2tleSArIDI0KTsKLQkJY3R4LT5la2V5WzddID0gc3NbN10gPSB1MzJfaW4oaW5fa2V5ICsgMjgpOworCQljdHgtPmVrZXlbNF0gPSBzc1s0XSA9IGxlMzJfdG9fY3B1KGtleVs0XSk7CisJCWN0eC0+ZWtleVs1XSA9IHNzWzVdID0gbGUzMl90b19jcHUoa2V5WzVdKTsKKwkJY3R4LT5la2V5WzZdID0gc3NbNl0gPSBsZTMyX3RvX2NwdShrZXlbNl0pOworCQljdHgtPmVrZXlbN10gPSBzc1s3XSA9IGxlMzJfdG9fY3B1KGtleVs3XSk7CiAJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCiAJCQlrZTgoY3R4LT5la2V5LCBpKTsKIAkJa2VsOChjdHgtPmVrZXksIDYpOwpAQCAtNDM2LDEwICs0MjgsMTAgQEAKIAkKIAkvKiBkZWNyeXB0aW9uIHNjaGVkdWxlICovCiAJCi0JY3R4LT5ka2V5WzBdID0gc3NbMF0gPSB1MzJfaW4oaW5fa2V5KTsKLQljdHgtPmRrZXlbMV0gPSBzc1sxXSA9IHUzMl9pbihpbl9rZXkgKyA0KTsKLQljdHgtPmRrZXlbMl0gPSBzc1syXSA9IHUzMl9pbihpbl9rZXkgKyA4KTsKLQljdHgtPmRrZXlbM10gPSBzc1szXSA9IHUzMl9pbihpbl9rZXkgKyAxMik7CisJY3R4LT5ka2V5WzBdID0gc3NbMF0gPSBsZTMyX3RvX2NwdShrZXlbMF0pOworCWN0eC0+ZGtleVsxXSA9IHNzWzFdID0gbGUzMl90b19jcHUoa2V5WzFdKTsKKwljdHgtPmRrZXlbMl0gPSBzc1syXSA9IGxlMzJfdG9fY3B1KGtleVsyXSk7CisJY3R4LT5ka2V5WzNdID0gc3NbM10gPSBsZTMyX3RvX2NwdShrZXlbM10pOwogCiAJc3dpdGNoIChrZXlfbGVuKSB7CiAJY2FzZSAxNjoKQEAgLTQ1MCw4ICs0NDIsOCBAQAogCQlicmVhazsKIAkJCiAJY2FzZSAyNDoKLQkJY3R4LT5ka2V5WzRdID0gZmYoc3NbNF0gPSB1MzJfaW4oaW5fa2V5ICsgMTYpKTsKLQkJY3R4LT5ka2V5WzVdID0gZmYoc3NbNV0gPSB1MzJfaW4oaW5fa2V5ICsgMjApKTsKKwkJY3R4LT5ka2V5WzRdID0gZmYoc3NbNF0gPSBsZTMyX3RvX2NwdShrZXlbNF0pKTsKKwkJY3R4LT5ka2V5WzVdID0gZmYoc3NbNV0gPSBsZTMyX3RvX2NwdShrZXlbNV0pKTsKIAkJa2RmNihjdHgtPmRrZXksIDApOwogCQlmb3IgKGkgPSAxOyBpIDwgNzsgaSsrKQogCQkJa2Q2KGN0eC0+ZGtleSwgaSk7CkBAIC00NTksMTAgKzQ1MSwxMCBAQAogCQlicmVhazsKIAogCWNhc2UgMzI6Ci0JCWN0eC0+ZGtleVs0XSA9IGZmKHNzWzRdID0gdTMyX2luKGluX2tleSArIDE2KSk7Ci0JCWN0eC0+ZGtleVs1XSA9IGZmKHNzWzVdID0gdTMyX2luKGluX2tleSArIDIwKSk7Ci0JCWN0eC0+ZGtleVs2XSA9IGZmKHNzWzZdID0gdTMyX2luKGluX2tleSArIDI0KSk7Ci0JCWN0eC0+ZGtleVs3XSA9IGZmKHNzWzddID0gdTMyX2luKGluX2tleSArIDI4KSk7CisJCWN0eC0+ZGtleVs0XSA9IGZmKHNzWzRdID0gbGUzMl90b19jcHUoa2V5WzRdKSk7CisJCWN0eC0+ZGtleVs1XSA9IGZmKHNzWzVdID0gbGUzMl90b19jcHUoa2V5WzVdKSk7CisJCWN0eC0+ZGtleVs2XSA9IGZmKHNzWzZdID0gbGUzMl90b19jcHUoa2V5WzZdKSk7CisJCWN0eC0+ZGtleVs3XSA9IGZmKHNzWzddID0gbGUzMl90b19jcHUoa2V5WzddKSk7CiAJCWtkZjgoY3R4LT5ka2V5LCAwKTsKIAkJZm9yIChpID0gMTsgaSA8IDY7IGkrKykKIAkJCWtkOChjdHgtPmRrZXksIGkpOwpAQCAtNDg0LDYgKzQ3Niw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBhZXNfYWxnID0gewogCS5jcmFfbmFtZQkJPQkiYWVzIiwKKwkuY3JhX2RyaXZlcl9uYW1lCT0JImFlcy1pNTg2IiwKKwkuY3JhX3ByaW9yaXR5CQk9CTIwMCwKIAkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIsCiAJLmNyYV9ibG9ja3NpemUJCT0JQUVTX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgYWVzX2N0eCksCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvZGVmY29uZmlnIGIvYXJjaC9pMzg2L2RlZmNvbmZpZwppbmRleCA2YTQzMWI5Li4zY2JlNmU5IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvZGVmY29uZmlnCisrKyBiL2FyY2gvaTM4Ni9kZWZjb25maWcKQEAgLTY0NCw2ICs2NDQsOCBAQAogIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKICMgQ09ORklHX0RMMksgaXMgbm90IHNldAogIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDBfTkFQSSBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMF9ESVNBQkxFX1BBQ0tFVF9TUExJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAogIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2kzODYva2VybmVsL01ha2VmaWxlCmluZGV4IGYxMGRlMGYuLjYwYzNmNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9NYWtlZmlsZQpAQCAtNCwxMCArNCwxMCBAQAogCiBleHRyYS15IDo9IGhlYWQubyBpbml0X3Rhc2subyB2bWxpbnV4LmxkcwogCi1vYmoteQk6PSBwcm9jZXNzLm8gc2VtYXBob3JlLm8gc2lnbmFsLm8gZW50cnkubyB0cmFwcy5vIGlycS5vIHZtODYubyBcCitvYmoteQk6PSBwcm9jZXNzLm8gc2VtYXBob3JlLm8gc2lnbmFsLm8gZW50cnkubyB0cmFwcy5vIGlycS5vIFwKIAkJcHRyYWNlLm8gdGltZS5vIGlvcG9ydC5vIGxkdC5vIHNldHVwLm8gaTgyNTkubyBzeXNfaTM4Ni5vIFwKIAkJcGNpLWRtYS5vIGkzODZfa3N5bXMubyBpMzg3Lm8gZG1pX3NjYW4ubyBib290ZmxhZy5vIFwKLQkJZG91YmxlZmF1bHQubyBxdWlya3MubyBpODIzNy5vCisJCXF1aXJrcy5vIGk4MjM3Lm8KIAogb2JqLXkJCQkJKz0gY3B1Lwogb2JqLXkJCQkJKz0gdGltZXJzLwpAQCAtMjUsNiArMjUsNyBAQAogb2JqLSQoQ09ORklHX1g4Nl9JT19BUElDKQkrPSBpb19hcGljLm8KIG9iai0kKENPTkZJR19YODZfUkVCT09URklYVVBTKQkrPSByZWJvb3RfZml4dXBzLm8KIG9iai0kKENPTkZJR19LRVhFQykJCSs9IG1hY2hpbmVfa2V4ZWMubyByZWxvY2F0ZV9rZXJuZWwubyBjcmFzaC5vCitvYmotJChDT05GSUdfQ1JBU0hfRFVNUCkJKz0gY3Jhc2hfZHVtcC5vCiBvYmotJChDT05GSUdfWDg2X05VTUFRKQkJKz0gbnVtYXEubwogb2JqLSQoQ09ORklHX1g4Nl9TVU1NSVRfTlVNQSkJKz0gc3VtbWl0Lm8KIG9iai0kKENPTkZJR19LUFJPQkVTKQkJKz0ga3Byb2Jlcy5vCkBAIC0zMyw2ICszNCw4IEBACiBvYmotJChDT05GSUdfQUNQSV9TUkFUKSAJKz0gc3JhdC5vCiBvYmotJChDT05GSUdfSFBFVF9USU1FUikgCSs9IHRpbWVfaHBldC5vCiBvYmotJChDT05GSUdfRUZJKSAJCSs9IGVmaS5vIGVmaV9zdHViLm8KK29iai0kKENPTkZJR19ET1VCTEVGQVVMVCkgCSs9IGRvdWJsZWZhdWx0Lm8KK29iai0kKENPTkZJR19WTTg2KQkJKz0gdm04Ni5vCiBvYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKQkrPSBlYXJseV9wcmludGsubwogCiBFWFRSQV9BRkxBR1MgICA6PSAtdHJhZGl0aW9uYWwKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9NYWtlZmlsZQppbmRleCAyNjdjYTQ4Li5kNTFjNzMxIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FjcGkvTWFrZWZpbGUKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL01ha2VmaWxlCkBAIC0zLDYgKzMsNiBAQAogb2JqLSQoQ09ORklHX0FDUElfU0xFRVApCSs9IHNsZWVwLm8gd2FrZXVwLm8KIAogaWZuZXEgKCQoQ09ORklHX0FDUElfUFJPQ0VTU09SKSwpCi1vYmoteQkJCQkrPSBjc3RhdGUubworb2JqLXkJCQkJKz0gY3N0YXRlLm8gcHJvY2Vzc29yLm8KIGVuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jCmluZGV4IDQ0N2ZhOWUuLmYyMWZhMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Jvb3QuYwpAQCAtMTA4LDcgKzEwOCw3IEBACiAJaWYgKCFwaHlzX2FkZHIgfHwgIXNpemUpCiAJCXJldHVybiBOVUxMOwogCi0JaWYgKHBoeXNfYWRkciA8IChlbmRfcGZuX21hcCA8PCBQQUdFX1NISUZUKSkKKwlpZiAocGh5c19hZGRyK3NpemUgPD0gKGVuZF9wZm5fbWFwIDw8IFBBR0VfU0hJRlQpICsgUEFHRV9TSVpFKQogCQlyZXR1cm4gX192YShwaHlzX2FkZHIpOwogCiAJcmV0dXJuIE5VTEw7CkBAIC00NjQsNyArNDY0LDcgQEAKICAqIHN1Y2Nlc3M6IHJldHVybiBJUlEgbnVtYmVyICg+PTApCiAgKiBmYWlsdXJlOiByZXR1cm4gPCAwCiAgKi8KLWludCBhY3BpX3JlZ2lzdGVyX2dzaSh1MzIgZ3NpLCBpbnQgZWRnZV9sZXZlbCwgaW50IGFjdGl2ZV9oaWdoX2xvdykKK2ludCBhY3BpX3JlZ2lzdGVyX2dzaSh1MzIgZ3NpLCBpbnQgdHJpZ2dlcmluZywgaW50IHBvbGFyaXR5KQogewogCXVuc2lnbmVkIGludCBpcnE7CiAJdW5zaWduZWQgaW50IHBsYXRfZ3NpID0gZ3NpOwpAQCAtNDc2LDE0ICs0NzYsMTQgQEAKIAlpZiAoYWNwaV9pcnFfbW9kZWwgPT0gQUNQSV9JUlFfTU9ERUxfUElDKSB7CiAJCWV4dGVybiB2b2lkIGVpc2Ffc2V0X2xldmVsX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKIAotCQlpZiAoZWRnZV9sZXZlbCA9PSBBQ1BJX0xFVkVMX1NFTlNJVElWRSkKKwkJaWYgKHRyaWdnZXJpbmcgPT0gQUNQSV9MRVZFTF9TRU5TSVRJVkUpCiAJCQllaXNhX3NldF9sZXZlbF9pcnEoZ3NpKTsKIAl9CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwogCWlmIChhY3BpX2lycV9tb2RlbCA9PSBBQ1BJX0lSUV9NT0RFTF9JT0FQSUMpIHsKLQkJcGxhdF9nc2kgPSBtcF9yZWdpc3Rlcl9nc2koZ3NpLCBlZGdlX2xldmVsLCBhY3RpdmVfaGlnaF9sb3cpOworCQlwbGF0X2dzaSA9IG1wX3JlZ2lzdGVyX2dzaShnc2ksIHRyaWdnZXJpbmcsIHBvbGFyaXR5KTsKIAl9CiAjZW5kaWYKIAlhY3BpX2dzaV90b19pcnEocGxhdF9nc2ksICZpcnEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2NzdGF0ZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2NzdGF0ZS5jCmluZGV4IDRjMzAzNmIuLjI1ZGI0OWUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9jc3RhdGUuYworKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvY3N0YXRlLmMKQEAgLTE0LDY0ICsxNCw2IEBACiAjaW5jbHVkZSA8YWNwaS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vYWNwaS5oPgogCi1zdGF0aWMgdm9pZCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X2ludGVsX3BkYyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcG93ZXIKLQkJCQkJCSpwb3cpCi17Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKm9ial9saXN0OwotCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7Ci0JdTMyICpidWY7Ci0KLQkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBwZGMuIEl0IHdpbGwgYmUgdXNlZCBsYXRlci4gKi8KLQlvYmpfbGlzdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX29iamVjdF9saXN0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFvYmpfbGlzdCkgewotCQlwcmludGsoS0VSTl9FUlIgIk1lbW9yeSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCW9iaiA9IGttYWxsb2Moc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFvYmopIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNZW1vcnkgYWxsb2NhdGlvbiBlcnJvclxuIik7Ci0JCWtmcmVlKG9ial9saXN0KTsKLQkJcmV0dXJuOwotCX0KLQotCWJ1ZiA9IGttYWxsb2MoMTIsIEdGUF9LRVJORUwpOwotCWlmICghYnVmKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTWVtb3J5IGFsbG9jYXRpb24gZXJyb3JcbiIpOwotCQlrZnJlZShvYmopOwotCQlrZnJlZShvYmpfbGlzdCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlidWZbMF0gPSBBQ1BJX1BEQ19SRVZJU0lPTl9JRDsKLQlidWZbMV0gPSAxOwotCWJ1ZlsyXSA9IEFDUElfUERDX0NfQ0FQQUJJTElUWV9TTVA7Ci0KLQlvYmotPnR5cGUgPSBBQ1BJX1RZUEVfQlVGRkVSOwotCW9iai0+YnVmZmVyLmxlbmd0aCA9IDEyOwotCW9iai0+YnVmZmVyLnBvaW50ZXIgPSAodTggKikgYnVmOwotCW9ial9saXN0LT5jb3VudCA9IDE7Ci0Jb2JqX2xpc3QtPnBvaW50ZXIgPSBvYmo7Ci0JcG93LT5wZGMgPSBvYmpfbGlzdDsKLQotCXJldHVybjsKLX0KLQotLyogSW5pdGlhbGl6ZSBfUERDIGRhdGEgYmFzZWQgb24gdGhlIENQVSB2ZW5kb3IgKi8KLXZvaWQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdF9wZGMoc3RydWN0IGFjcGlfcHJvY2Vzc29yX3Bvd2VyICpwb3csCi0JCQkJICAgdW5zaWduZWQgaW50IGNwdSkKLXsKLQlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YSArIGNwdTsKLQotCXBvdy0+cGRjID0gTlVMTDsKLQlpZiAoYy0+eDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0lOVEVMKQotCQlhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X2ludGVsX3BkYyhwb3cpOwotCi0JcmV0dXJuOwotfQotCi1FWFBPUlRfU1lNQk9MKGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfcGRjKTsKLQogLyoKICAqIEluaXRpYWxpemUgYm1fZmxhZ3MgYmFzZWQgb24gdGhlIENQVSBjYWNoZSBwcm9wZXJ0aWVzCiAgKiBPbiBTTVAgaXQgZGVwZW5kcyBvbiBjYWNoZSBjb25maWd1cmF0aW9uCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvcHJvY2Vzc29yLmMgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvcHJvY2Vzc29yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY0Y2MwMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9wcm9jZXNzb3IuYwpAQCAtMCwwICsxLDc1IEBACisvKgorICogYXJjaC9pMzg2L2tlcm5lbC9hY3BpL3Byb2Nlc3Nvci5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEludGVsIENvcnBvcmF0aW9uCisgKiAJVmVua2F0ZXNoIFBhbGxpcGFkaSA8dmVua2F0ZXNoLnBhbGxpcGFkaUBpbnRlbC5jb20+CisgKiAJLSBBZGRlZCBfUERDIGZvciBwbGF0Zm9ybXMgd2l0aCBJbnRlbCBDUFVzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisKKyNpbmNsdWRlIDxhY3BpL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9hY3BpLmg+CisKK3N0YXRpYyB2b2lkIGluaXRfaW50ZWxfcGRjKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsIHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqb2JqX2xpc3Q7CisJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKKwl1MzIgKmJ1ZjsKKworCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHBkYy4gSXQgd2lsbCBiZSB1c2VkIGxhdGVyLiAqLworCW9ial9saXN0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9ial9saXN0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiTWVtb3J5IGFsbG9jYXRpb24gZXJyb3JcbiIpOworCQlyZXR1cm47CisJfQorCisJb2JqID0ga21hbGxvYyhzaXplb2YodW5pb24gYWNwaV9vYmplY3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9iaikgeworCQlwcmludGsoS0VSTl9FUlIgIk1lbW9yeSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKwkJa2ZyZWUob2JqX2xpc3QpOworCQlyZXR1cm47CisJfQorCisJYnVmID0ga21hbGxvYygxMiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNZW1vcnkgYWxsb2NhdGlvbiBlcnJvclxuIik7CisJCWtmcmVlKG9iaik7CisJCWtmcmVlKG9ial9saXN0KTsKKwkJcmV0dXJuOworCX0KKworCWJ1ZlswXSA9IEFDUElfUERDX1JFVklTSU9OX0lEOworCWJ1ZlsxXSA9IDE7CisJYnVmWzJdID0gQUNQSV9QRENfQ19DQVBBQklMSVRZX1NNUDsKKworCWlmIChjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0VTVCkpCisJCWJ1ZlsyXSB8PSBBQ1BJX1BEQ19FU1RfQ0FQQUJJTElUWV9TTVA7CisKKwlvYmotPnR5cGUgPSBBQ1BJX1RZUEVfQlVGRkVSOworCW9iai0+YnVmZmVyLmxlbmd0aCA9IDEyOworCW9iai0+YnVmZmVyLnBvaW50ZXIgPSAodTggKikgYnVmOworCW9ial9saXN0LT5jb3VudCA9IDE7CisJb2JqX2xpc3QtPnBvaW50ZXIgPSBvYmo7CisJcHItPnBkYyA9IG9ial9saXN0OworCisJcmV0dXJuOworfQorCisvKiBJbml0aWFsaXplIF9QREMgZGF0YSBiYXNlZCBvbiB0aGUgQ1BVIHZlbmRvciAqLwordm9pZCBhcmNoX2FjcGlfcHJvY2Vzc29yX2luaXRfcGRjKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCit7CisJdW5zaWduZWQgaW50IGNwdSA9IHByLT5pZDsKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YSArIGNwdTsKKworCXByLT5wZGMgPSBOVUxMOworCWlmIChjLT54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwpCisJCWluaXRfaW50ZWxfcGRjKHByLCBjKTsKKworCXJldHVybjsKK30KKworRVhQT1JUX1NZTUJPTChhcmNoX2FjcGlfcHJvY2Vzc29yX2luaXRfcGRjKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYXBpYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9hcGljLmMKaW5kZXggZDhmOTRlNy4uYWNkM2YxZSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hcGljLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hcGljLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KQEAgLTM3LDEwICszOCwxNyBAQAogI2luY2x1ZGUgPGFzbS9pODI1My5oPgogCiAjaW5jbHVkZSA8bWFjaF9hcGljLmg+CisjaW5jbHVkZSA8bWFjaF9pcGkuaD4KIAogI2luY2x1ZGUgImlvX3BvcnRzLmgiCiAKIC8qCisgKiBjcHVfbWFzayB0aGF0IGRlbm90ZXMgdGhlIENQVXMgdGhhdCBuZWVkcyB0aW1lciBpbnRlcnJ1cHQgY29taW5nIGluIGFzCisgKiBJUElzIGluIHBsYWNlIG9mIGxvY2FsIEFQSUMgdGltZXJzCisgKi8KK3N0YXRpYyBjcHVtYXNrX3QgdGltZXJfYmNhc3RfaXBpOworCisvKgogICogS25vYiB0byBjb250cm9sIG91ciB3aWxsaW5nbmVzcyB0byBlbmFibGUgdGhlIGxvY2FsIEFQSUMuCiAgKi8KIGludCBlbmFibGVfbG9jYWxfYXBpYyBfX2luaXRkYXRhID0gMDsgLyogLTE9Zm9yY2UtZGlzYWJsZSwgKzE9Zm9yY2UtZW5hYmxlICovCkBAIC05MiwxMCArMTAwLDYgQEAKIC8qIFVzaW5nIEFQSUMgdG8gZ2VuZXJhdGUgc21wX2xvY2FsX3RpbWVyX2ludGVycnVwdD8gKi8KIGludCB1c2luZ19hcGljX3RpbWVyID0gMDsKIAotc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgcHJvZl9tdWx0aXBsaWVyKSA9IDE7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBwcm9mX29sZF9tdWx0aXBsaWVyKSA9IDE7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBwcm9mX2NvdW50ZXIpID0gMTsKLQogc3RhdGljIGludCBlbmFibGVkX3ZpYV9hcGljYmFzZTsKIAogdm9pZCBlbmFibGVfTk1JX3Rocm91Z2hfTFZUMCAodm9pZCAqIGR1bW15KQpAQCAtOTM1LDExICs5MzksMTYgQEAKIHN0YXRpYyB2b2lkIF9fc2V0dXBfQVBJQ19MVlRUKHVuc2lnbmVkIGludCBjbG9ja3MpCiB7CiAJdW5zaWduZWQgaW50IGx2dHRfdmFsdWUsIHRtcF92YWx1ZSwgdmVyOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAl2ZXIgPSBHRVRfQVBJQ19WRVJTSU9OKGFwaWNfcmVhZChBUElDX0xWUikpOwogCWx2dHRfdmFsdWUgPSBBUElDX0xWVF9USU1FUl9QRVJJT0RJQyB8IExPQ0FMX1RJTUVSX1ZFQ1RPUjsKIAlpZiAoIUFQSUNfSU5URUdSQVRFRCh2ZXIpKQogCQlsdnR0X3ZhbHVlIHw9IFNFVF9BUElDX1RJTUVSX0JBU0UoQVBJQ19USU1FUl9CQVNFX0RJVik7CisKKwlpZiAoY3B1X2lzc2V0KGNwdSwgdGltZXJfYmNhc3RfaXBpKSkKKwkJbHZ0dF92YWx1ZSB8PSBBUElDX0xWVF9NQVNLRUQ7CisKIAlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVFQsIGx2dHRfdmFsdWUpOwogCiAJLyoKQEAgLTEwNzIsNyArMTA4MSw3IEBACiAJc2V0dXBfQVBJQ190aW1lcihjYWxpYnJhdGlvbl9yZXN1bHQpOwogfQogCi12b2lkIF9fZGV2aW5pdCBkaXNhYmxlX0FQSUNfdGltZXIodm9pZCkKK3ZvaWQgZGlzYWJsZV9BUElDX3RpbWVyKHZvaWQpCiB7CiAJaWYgKHVzaW5nX2FwaWNfdGltZXIpIHsKIAkJdW5zaWduZWQgbG9uZyB2OwpAQCAtMTA4NCw3ICsxMDkzLDEwIEBACiAKIHZvaWQgZW5hYmxlX0FQSUNfdGltZXIodm9pZCkKIHsKLQlpZiAodXNpbmdfYXBpY190aW1lcikgeworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlpZiAodXNpbmdfYXBpY190aW1lciAmJgorCSAgICAhY3B1X2lzc2V0KGNwdSwgdGltZXJfYmNhc3RfaXBpKSkgewogCQl1bnNpZ25lZCBsb25nIHY7CiAKIAkJdiA9IGFwaWNfcmVhZChBUElDX0xWVFQpOwpAQCAtMTA5MiwzMyArMTEwNCwzMSBAQAogCX0KIH0KIAotLyoKLSAqIHRoZSBmcmVxdWVuY3kgb2YgdGhlIHByb2ZpbGluZyB0aW1lciBjYW4gYmUgY2hhbmdlZAotICogYnkgd3JpdGluZyBhIG11bHRpcGxpZXIgdmFsdWUgaW50byAvcHJvYy9wcm9maWxlLgotICovCi1pbnQgc2V0dXBfcHJvZmlsaW5nX3RpbWVyKHVuc2lnbmVkIGludCBtdWx0aXBsaWVyKQordm9pZCBzd2l0Y2hfQVBJQ190aW1lcl90b19pcGkodm9pZCAqY3B1bWFzaykKIHsKLQlpbnQgaTsKKwljcHVtYXNrX3QgbWFzayA9ICooY3B1bWFza190ICopY3B1bWFzazsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCi0JLyoKLQkgKiBTYW5pdHkgY2hlY2suIFthdCBsZWFzdCA1MDAgQVBJQyBjeWNsZXMgc2hvdWxkIGJlCi0JICogYmV0d2VlbiBBUElDIGludGVycnVwdHMgYXMgYSBydWxlIG9mIHRodW1iLCB0byBhdm9pZAotCSAqIGlycXMgZmxvb2RpbmcgdXNdCi0JICovCi0JaWYgKCAoIW11bHRpcGxpZXIpIHx8IChjYWxpYnJhdGlvbl9yZXN1bHQvbXVsdGlwbGllciA8IDUwMCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogCi0JICogU2V0IHRoZSBuZXcgbXVsdGlwbGllciBmb3IgZWFjaCBDUFUuIENQVXMgZG9uJ3Qgc3RhcnQgdXNpbmcgdGhlCi0JICogbmV3IHZhbHVlcyB1bnRpbCB0aGUgbmV4dCB0aW1lciBpbnRlcnJ1cHQgaW4gd2hpY2ggdGhleSBkbyBwcm9jZXNzCi0JICogYWNjb3VudGluZy4gQXQgdGhhdCB0aW1lIHRoZXkgYWxzbyBhZGp1c3QgdGhlaXIgQVBJQyB0aW1lcnMKLQkgKiBhY2NvcmRpbmdseS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgKytpKQotCQlwZXJfY3B1KHByb2ZfbXVsdGlwbGllciwgaSkgPSBtdWx0aXBsaWVyOwotCi0JcmV0dXJuIDA7CisJaWYgKGNwdV9pc3NldChjcHUsIG1hc2spICYmCisJICAgICFjcHVfaXNzZXQoY3B1LCB0aW1lcl9iY2FzdF9pcGkpKSB7CisJCWRpc2FibGVfQVBJQ190aW1lcigpOworCQljcHVfc2V0KGNwdSwgdGltZXJfYmNhc3RfaXBpKTsKKwl9CiB9CitFWFBPUlRfU1lNQk9MKHN3aXRjaF9BUElDX3RpbWVyX3RvX2lwaSk7CisKK3ZvaWQgc3dpdGNoX2lwaV90b19BUElDX3RpbWVyKHZvaWQgKmNwdW1hc2spCit7CisJY3B1bWFza190IG1hc2sgPSAqKGNwdW1hc2tfdCAqKWNwdW1hc2s7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCWlmIChjcHVfaXNzZXQoY3B1LCBtYXNrKSAmJgorCSAgICBjcHVfaXNzZXQoY3B1LCB0aW1lcl9iY2FzdF9pcGkpKSB7CisJCWNwdV9jbGVhcihjcHUsIHRpbWVyX2JjYXN0X2lwaSk7CisJCWVuYWJsZV9BUElDX3RpbWVyKCk7CisJfQorfQorRVhQT1JUX1NZTUJPTChzd2l0Y2hfaXBpX3RvX0FQSUNfdGltZXIpOwogCiAjdW5kZWYgQVBJQ19ESVZJU09SCiAKQEAgLTExMzQsMzIgKzExNDQsMTAgQEAKIAogaW5saW5lIHZvaWQgc21wX2xvY2FsX3RpbWVyX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCiB7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQogCXByb2ZpbGVfdGljayhDUFVfUFJPRklMSU5HLCByZWdzKTsKLQlpZiAoLS1wZXJfY3B1KHByb2ZfY291bnRlciwgY3B1KSA8PSAwKSB7Ci0JCS8qCi0JCSAqIFRoZSBtdWx0aXBsaWVyIG1heSBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBnb3QKLQkJICogdG8gdGhpcyBwb2ludCBhcyBhIHJlc3VsdCBvZiB0aGUgdXNlciB3cml0aW5nIHRvCi0JCSAqIC9wcm9jL3Byb2ZpbGUuIEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgQVBJQwotCQkgKiB0aW1lciBhY2NvcmRpbmdseS4KLQkJICoKLQkJICogSW50ZXJydXB0cyBhcmUgYWxyZWFkeSBtYXNrZWQgb2ZmIGF0IHRoaXMgcG9pbnQuCi0JCSAqLwotCQlwZXJfY3B1KHByb2ZfY291bnRlciwgY3B1KSA9IHBlcl9jcHUocHJvZl9tdWx0aXBsaWVyLCBjcHUpOwotCQlpZiAocGVyX2NwdShwcm9mX2NvdW50ZXIsIGNwdSkgIT0KLQkJCQkJcGVyX2NwdShwcm9mX29sZF9tdWx0aXBsaWVyLCBjcHUpKSB7Ci0JCQlfX3NldHVwX0FQSUNfTFZUVCgKLQkJCQkJY2FsaWJyYXRpb25fcmVzdWx0LwotCQkJCQlwZXJfY3B1KHByb2ZfY291bnRlciwgY3B1KSk7Ci0JCQlwZXJfY3B1KHByb2Zfb2xkX211bHRpcGxpZXIsIGNwdSkgPQotCQkJCQkJcGVyX2NwdShwcm9mX2NvdW50ZXIsIGNwdSk7Ci0JCX0KLQogI2lmZGVmIENPTkZJR19TTVAKLQkJdXBkYXRlX3Byb2Nlc3NfdGltZXModXNlcl9tb2RlX3ZtKHJlZ3MpKTsKKwl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGVfdm0ocmVncykpOwogI2VuZGlmCi0JfQogCiAJLyoKIAkgKiBXZSB0YWtlIHRoZSAnbG9uZycgcmV0dXJuIHBhdGgsIGFuZCB0aGVyZSBldmVyeSBzdWJzeXN0ZW0KQEAgLTEyMDYsNiArMTE5NCw0MyBAQAogCWlycV9leGl0KCk7CiB9CiAKKyNpZm5kZWYgQ09ORklHX1NNUAorc3RhdGljIHZvaWQgdXBfYXBpY190aW1lcl9pbnRlcnJ1cHRfY2FsbChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJLyoKKwkgKiB0aGUgTk1JIGRlYWRsb2NrLWRldGVjdG9yIHVzZXMgdGhpcy4KKwkgKi8KKwlwZXJfY3B1KGlycV9zdGF0LCBjcHUpLmFwaWNfdGltZXJfaXJxcysrOworCisJc21wX2xvY2FsX3RpbWVyX2ludGVycnVwdChyZWdzKTsKK30KKyNlbmRpZgorCit2b2lkIHNtcF9zZW5kX3RpbWVyX2Jyb2FkY2FzdF9pcGkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJY3B1bWFza190IG1hc2s7CisKKwljcHVzX2FuZChtYXNrLCBjcHVfb25saW5lX21hcCwgdGltZXJfYmNhc3RfaXBpKTsKKwlpZiAoIWNwdXNfZW1wdHkobWFzaykpIHsKKyNpZmRlZiBDT05GSUdfU01QCisJCXNlbmRfSVBJX21hc2sobWFzaywgTE9DQUxfVElNRVJfVkVDVE9SKTsKKyNlbHNlCisJCS8qCisJCSAqIFdlIGNhbiBkaXJlY3RseSBjYWxsIHRoZSBhcGljIHRpbWVyIGludGVycnVwdCBoYW5kbGVyCisJCSAqIGluIFVQIGNhc2UuIE1pbnVzIGFsbCBpcnEgcmVsYXRlZCBmdW5jdGlvbnMKKwkJICovCisJCXVwX2FwaWNfdGltZXJfaW50ZXJydXB0X2NhbGwocmVncyk7CisjZW5kaWYKKwl9Cit9CisKK2ludCBzZXR1cF9wcm9maWxpbmdfdGltZXIodW5zaWduZWQgaW50IG11bHRpcGxpZXIpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKIC8qCiAgKiBUaGlzIGludGVycnVwdCBzaG91bGQgX25ldmVyXyBoYXBwZW4gd2l0aCBvdXIgQVBJQy9TTVAgYXJjaGl0ZWN0dXJlCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMgYi9hcmNoL2kzODYva2VybmVsL2FwbS5jCmluZGV4IDJkNzkzZDQuLjA1MzEyYTggMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYwpAQCAtMjE5LDYgKzIxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX2xlZ2FjeS5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KQEAgLTIyOTEsNyArMjI5Miw5IEBACiAJCWFwbV9pbmZvLmRpc2FibGVkID0gMTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQorI2lmZGVmIENPTkZJR19QTV9MRUdBQ1kKIAlwbV9hY3RpdmUgPSAxOworI2VuZGlmCiAKIAkvKgogCSAqIFNldCB1cCBhIHNlZ21lbnQgdGhhdCByZWZlcmVuY2VzIHRoZSByZWFsIG1vZGUgc2VnbWVudCAweDQwCkBAIC0yMzgyLDcgKzIzODUsOSBAQAogCWV4aXRfa2FwbWQgPSAxOwogCXdoaWxlIChrYXBtZF9ydW5uaW5nKQogCQlzY2hlZHVsZSgpOworI2lmZGVmIENPTkZJR19QTV9MRUdBQ1kKIAlwbV9hY3RpdmUgPSAwOworI2VuZGlmCiB9CiAKIG1vZHVsZV9pbml0KGFwbV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2FtZC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvYW1kLmMKaW5kZXggZTc2OTdlMC4uMzMzNTc4YSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvYW1kLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvYW1kLmMKQEAgLTIxNiw2ICsyMTYsMTIgQEAKIAkJCWMtPng4Nl9tYXhfY29yZXMgPSAxOwogCX0KIAorCWlmIChjcHVpZF9lYXgoMHg4MDAwMDAwMCkgPj0gMHg4MDAwMDAwNykgeworCQljLT54ODZfcG93ZXIgPSBjcHVpZF9lZHgoMHg4MDAwMDAwNyk7CisJCWlmIChjLT54ODZfcG93ZXIgJiAoMTw8OCkpCisJCQlzZXRfYml0KFg4Nl9GRUFUVVJFX0NPTlNUQU5UX1RTQywgYy0+eDg2X2NhcGFiaWxpdHkpOworCX0KKwogI2lmZGVmIENPTkZJR19YODZfSFQKIAkvKgogCSAqIE9uIGEgQU1EIGR1YWwgY29yZSBzZXR1cCB0aGUgbG93ZXIgYml0cyBvZiB0aGUgQVBJQyBpZApAQCAtMjMzLDYgKzIzOSw3IEBACiAJCSAgICAgICBjcHUsIGMtPng4Nl9tYXhfY29yZXMsIGNwdV9jb3JlX2lkW2NwdV0pOwogCX0KICNlbmRpZgorCiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYW1kX3NpemVfY2FjaGUoc3RydWN0IGNwdWluZm9feDg2ICogYywgdW5zaWduZWQgaW50IHNpemUpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jaGFuZ2Vsb2cgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jaGFuZ2Vsb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZjc2YjguLjAwMDAwMDAKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY2hhbmdlbG9nCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqICBFbmhhbmNlZCBDUFUgdHlwZSBkZXRlY3Rpb24gYnkgTWlrZSBKYWdkaXMsIFBhdHJpY2sgU3QuIEplYW4KLSAqICBhbmQgTWFydGluIE1hcmVzLCBOb3ZlbWJlciAxOTk3LgotICoKLSAqICBGb3JjZSBDeXJpeCA2eDg2KE1YKSBhbmQgTSBJSSBwcm9jZXNzb3JzIHRvIHJlcG9ydCBNVFJSIGNhcGFiaWxpdHkKLSAqICBhbmQgQ3lyaXggImNvbWEgYnVnIiByZWNvZ25pdGlvbiBieQotICogIFpvbHThbiBC9nN69nJt6W55aSA8emJvc3pvckBtYWlsLmV4dGVybmV0Lmh1PiBGZWJydWFyeSAxOTk5LgotICogCi0gKiAgRm9yY2UgQ2VudGF1ciBDNiBwcm9jZXNzb3JzIHRvIHJlcG9ydCBNVFJSIGNhcGFiaWxpdHkuCi0gKiAgQmFydCBIYXJ0Z2VycyA8YmFydEBldHBtb2QucGh5cy50dWUubmw+LCBNYXkgMTk5OS4KLSAqCi0gKiAgSW50ZWwgTW9iaWxlIFBlbnRpdW0gSUkgZGV0ZWN0aW9uIGZpeC4gU2VhbiBHaWxsZXksIEp1bmUgMTk5OS4KLSAqCi0gKiAgSURUIFdpbmNoaXAgdHdlYWtzLCBtaXNjIGNsZWFuIHVwcy4KLSAqICBEYXZlIEpvbmVzIDxkYXZlakBzdXNlLmRlPiwgQXVndXN0IDE5OTkKLSAqCi0gKiAgQmV0dGVyIGRldGVjdGlvbiBvZiBDZW50YXVyL0lEVCBXaW5DaGlwIG1vZGVscy4KLSAqICBCYXJ0IEhhcnRnZXJzIDxiYXJ0QGV0cG1vZC5waHlzLnR1ZS5ubD4sIEF1Z3VzdCAxOTk5LgotICoKLSAqICBDbGVhbmVkIHVwIGNhY2hlLWRldGVjdGlvbiBjb2RlCi0gKiAgRGF2ZSBKb25lcyA8ZGF2ZWpAc3VzZS5kZT4sIE9jdG9iZXIgMTk5OQotICoKLSAqICBBZGRlZCBwcm9wZXIgTDIgY2FjaGUgZGV0ZWN0aW9uIGZvciBDb3BwZXJtaW5lCi0gKiAgRHJhZ2FuIFN0YW5jZXZpYyA8dmlzaXRvckB2YWxpbnV4LmNvbT4sIE9jdG9iZXIgMTk5OQotICoKLSAqICBBZGRlZCB0aGUgb3JpZ2luYWwgYXJyYXkgZm9yIGNhcGFiaWxpdHkgZmxhZ3MgYnV0IGZvcmdvdCB0byBjcmVkaXQgCi0gKiAgbXlzZWxmIDopICh+MTk5OCkgRml4ZWQvY2xlYW5lZCB1cCBzb21lIGNwdV9tb2RlbF9pbmZvIGFuZCBvdGhlciBzdHVmZgotICogIEphdWRlciBIbyA8amF1ZGVyaG9AY2FydW1iYS5jb20+LCBKYW51YXJ5IDIwMDAKLSAqCi0gKiAgRGV0ZWN0aW9uIGZvciBDZWxlcm9uIGNvcHBlcm1pbmUsIGlkZW50aWZ5X2NwdSgpIG92ZXJoYXVsZWQsCi0gKiAgYW5kIGEgZmV3IG90aGVyIGNsZWFuIHVwcy4KLSAqICBEYXZlIEpvbmVzIDxkYXZlakBzdXNlLmRlPiwgQXByaWwgMjAwMAotICoKLSAqICBQZW50aXVtIElJSSBGWFNSLCBTU0Ugc3VwcG9ydAotICogIEdlbmVyYWwgRlBVIHN0YXRlIGhhbmRsaW5nIGNsZWFudXBzCi0gKiAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPiwgTWF5IDIwMDAKLSAqCi0gKiAgQWRkZWQgcHJvcGVyIENhc2NhZGVzIENQVSBhbmQgTDIgY2FjaGUgZGV0ZWN0aW9uIGZvciBDYXNjYWRlcwotICogIGFuZCA4LXdheSB0eXBlIGNhY2hlIGhhcHB5IGJ1bmNoIGZyb20gSW50ZWw6XikKLSAqICBEcmFnYW4gU3RhbmNldmljIDx2aXNpdG9yQHZhbGludXguY29tPiwgTWF5IDIwMDAgCi0gKgotICogIEZvcndhcmQgcG9ydCBBTUQgRHVyb24gZXJyYXRhIFQxMyBmcm9tIDIuMi4xN3ByZQotICogIERhdmUgSm9uZXMgPGRhdmVqQHN1c2UuZGU+LCBBdWd1c3QgMjAwMAotICoKLSAqICBGb3J3YXJkIHBvcnQgbG90cyBvZiBmaXhlcy9pbXByb3ZlbWVudHMgZnJvbSAyLjIuMThwcmUKLSAqICBDeXJpeCBJSUksIFBlbnRpdW0gSVYgc3VwcG9ydC4KLSAqICBEYXZlIEpvbmVzIDxkYXZlakBzdXNlLmRlPiwgT2N0b2JlciAyMDAwCi0gKgotICogIE1hc3NpdmUgY2xlYW51cCBvZiBDUFUgZGV0ZWN0aW9uIGFuZCBidWcgaGFuZGxpbmc7Ci0gKiAgVHJhbnNtZXRhIENQVSBkZXRlY3Rpb24sCi0gKiAgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+LCBOb3ZlbWJlciAyMDAwCi0gKgotICogIFZJQSBDMyBTdXBwb3J0LgotICogIERhdmUgSm9uZXMgPGRhdmVqQHN1c2UuZGU+LCBNYXJjaCAyMDAxCi0gKgotICogIEFNRCBBdGhsb24vRHVyb24vVGh1bmRlcmJpcmQgYmx1ZXNtb2tlIHN1cHBvcnQuCi0gKiAgRGF2ZSBKb25lcyA8ZGF2ZWpAc3VzZS5kZT4sIEFwcmlsIDIwMDEuCi0gKgotICogIENhY2hlU2l6ZSBidWcgd29ya2Fyb3VuZCB1cGRhdGVzIGZvciBBTUQsIEludGVsICYgVklBIEN5cml4LgotICogIERhdmUgSm9uZXMgPGRhdmVqQHN1c2UuZGU+LCBTZXB0ZW1iZXIsIE9jdG9iZXIgMjAwMS4KLSAqCi0gKi8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY29tbW9uLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYwppbmRleCBjY2E2NTU2Li4xNWFlZTI2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYwpAQCAtMjA0LDcgKzIwNCwxMCBAQAogCiAvKiBEbyBtaW5pbXVtIENQVSBkZXRlY3Rpb24gZWFybHkuCiAgICBGaWVsZHMgcmVhbGx5IG5lZWRlZDogdmVuZG9yLCBjcHVpZF9sZXZlbCwgZmFtaWx5LCBtb2RlbCwgbWFzaywgY2FjaGUgYWxpZ25tZW50LgotICAgVGhlIG90aGVycyBhcmUgbm90IHRvdWNoZWQgdG8gYXZvaWQgdW53YW50ZWQgc2lkZSBlZmZlY3RzLiAqLworICAgVGhlIG90aGVycyBhcmUgbm90IHRvdWNoZWQgdG8gYXZvaWQgdW53YW50ZWQgc2lkZSBlZmZlY3RzLgorCisgICBXQVJOSU5HOiB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIG9uIHRoZSBCUC4gIERvbid0IGFkZCBjb2RlIGhlcmUKKyAgIHRoYXQgaXMgc3VwcG9zZWQgdG8gcnVuIG9uIGFsbCBDUFVzLiAqLwogc3RhdGljIHZvaWQgX19pbml0IGVhcmx5X2NwdV9kZXRlY3Qodm9pZCkKIHsKIAlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmYm9vdF9jcHVfZGF0YTsKQEAgLTIzNiwxMiArMjM5LDYgQEAKIAkJaWYgKGNhcDAgJiAoMTw8MTkpKQogCQkJYy0+eDg2X2NhY2hlX2FsaWdubWVudCA9ICgobWlzYyA+PiA4KSAmIDB4ZmYpICogODsKIAl9Ci0KLQllYXJseV9pbnRlbF93b3JrYXJvdW5kKGMpOwotCi0jaWZkZWYgQ09ORklHX1g4Nl9IVAotCXBoeXNfcHJvY19pZFtzbXBfcHJvY2Vzc29yX2lkKCldID0gKGNwdWlkX2VieCgxKSA+PiAyNCkgJiAweGZmOwotI2VuZGlmCiB9CiAKIHZvaWQgX19kZXZpbml0IGdlbmVyaWNfaWRlbnRpZnkoc3RydWN0IGNwdWluZm9feDg2ICogYykKQEAgLTI4OSw2ICsyODYsMTIgQEAKIAkJCQlnZXRfbW9kZWxfbmFtZShjKTsgLyogRGVmYXVsdCBuYW1lICovCiAJCX0KIAl9CisKKwllYXJseV9pbnRlbF93b3JrYXJvdW5kKGMpOworCisjaWZkZWYgQ09ORklHX1g4Nl9IVAorCXBoeXNfcHJvY19pZFtzbXBfcHJvY2Vzc29yX2lkKCldID0gKGNwdWlkX2VieCgxKSA+PiAyNCkgJiAweGZmOworI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBzcXVhc2hfdGhlX3N0dXBpZF9zZXJpYWxfbnVtYmVyKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKQEAgLTYwOSw4ICs2MTIsMTAgQEAKIAlsb2FkX1RSX2Rlc2MoKTsKIAlsb2FkX0xEVCgmaW5pdF9tbS5jb250ZXh0KTsKIAorI2lmZGVmIENPTkZJR19ET1VCTEVGQVVMVAogCS8qIFNldCB1cCBkb3VibGVmYXVsdCBUU1MgcG9pbnRlciBpbiB0aGUgR0RUICovCiAJX19zZXRfdHNzX2Rlc2MoY3B1LCBHRFRfRU5UUllfRE9VQkxFRkFVTFRfVFNTLCAmZG91YmxlZmF1bHRfdHNzKTsKKyNlbmRpZgogCiAJLyogQ2xlYXIgJWZzIGFuZCAlZ3MuICovCiAJYXNtIHZvbGF0aWxlICgieG9ybCAlZWF4LCAlZWF4OyBtb3ZsICVlYXgsICVmczsgbW92bCAlZWF4LCAlZ3MiKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCmluZGV4IDg3MTM2NmIuLjM4NTJkMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYwpAQCAtNDAsOCArNDAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL3Byb2Nlc3Nvci5oPgogCi0jaW5jbHVkZSAic3BlZWRzdGVwLWVzdC1jb21tb24uaCIKLQogI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsICJhY3BpLWNwdWZyZXEiLCBtc2cpCiAKIE1PRFVMRV9BVVRIT1IoIlBhdWwgRGllZmVuYmF1Z2gsIERvbWluaWsgQnJvZG93c2tpIik7CkBAIC0yOTcsNjggKzI5NSw2IEBACiB9CiAKIAotLyogCi0gKiBhY3BpX3Byb2Nlc3Nvcl9jcHVfaW5pdF9wZGNfZXN0IC0gbGV0IEJJT1Mga25vdyBhYm91dCB0aGUgU01QIGNhcGFiaWxpdGllcwotICogb2YgdGhpcyBkcml2ZXIKLSAqIEBwZXJmOiBwcm9jZXNzb3Itc3BlY2lmaWMgYWNwaV9pb19kYXRhIHN0cnVjdAotICogQGNwdTogQ1BVIGJlaW5nIGluaXRpYWxpemVkCi0gKgotICogVG8gYXZvaWQgaXNzdWVzIHdpdGggbGVnYWN5IE9TZXMsIHNvbWUgQklPU2VzIHJlcXVpcmUgdG8gYmUgaW5mb3JtZWQgb2YKLSAqIHRoZSBTTVAgY2FwYWJpbGl0aWVzIG9mIE9TIFAtc3RhdGUgZHJpdmVyLiBIZXJlIHdlIHNldCB0aGUgYml0cyBpbiBfUERDIAotICogYWNjb3JkaW5nbHksIGZvciBFbmhhbmNlZCBTcGVlZHN0ZXAuIEFjdHVhbCBjYWxsIHRvIF9QREMgaXMgZG9uZSBpbgotICogZHJpdmVyL2FjcGkvcHJvY2Vzc29yLmMKLSAqLwotc3RhdGljIHZvaWQgCi1hY3BpX3Byb2Nlc3Nvcl9jcHVfaW5pdF9wZGNfZXN0KAotCQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UgKnBlcmYsIAotCQl1bnNpZ25lZCBpbnQgY3B1LAotCQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqb2JqX2xpc3QKLQkJKQotewotCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7Ci0JdTMyICpidWY7Ci0Jc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGEgKyBjcHU7Ci0JZHByaW50aygiYWNwaV9wcm9jZXNzb3JfY3B1X2luaXRfcGRjX2VzdFxuIik7Ci0KLQlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfRVNUKSkKLQkJcmV0dXJuOwotCi0JLyogSW5pdGlhbGl6ZSBwZGMuIEl0IHdpbGwgYmUgdXNlZCBsYXRlci4gKi8KLQlpZiAoIW9ial9saXN0KQotCQlyZXR1cm47Ci0JCQotCWlmICghKG9ial9saXN0LT5jb3VudCAmJiBvYmpfbGlzdC0+cG9pbnRlcikpCi0JCXJldHVybjsKLQotCW9iaiA9IG9ial9saXN0LT5wb2ludGVyOwotCWlmICgob2JqLT5idWZmZXIubGVuZ3RoID09IDEyKSAmJiBvYmotPmJ1ZmZlci5wb2ludGVyKSB7Ci0JCWJ1ZiA9ICh1MzIgKilvYmotPmJ1ZmZlci5wb2ludGVyOwotICAgICAgIAkJYnVmWzBdID0gQUNQSV9QRENfUkVWSVNJT05fSUQ7Ci0gICAgICAgCQlidWZbMV0gPSAxOwotICAgICAgIAkJYnVmWzJdID0gQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfU01QOwotCQlwZXJmLT5wZGMgPSBvYmpfbGlzdDsKLQl9Ci0JcmV0dXJuOwotfQotIAotCi0vKiBDUFUgc3BlY2lmaWMgUERDIGluaXRpYWxpemF0aW9uICovCi1zdGF0aWMgdm9pZCAKLWFjcGlfcHJvY2Vzc29yX2NwdV9pbml0X3BkYygKLQkJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlICpwZXJmLCAKLQkJdW5zaWduZWQgaW50IGNwdSwKLQkJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKm9ial9saXN0Ci0JCSkKLXsKLQlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YSArIGNwdTsKLQlkcHJpbnRrKCJhY3BpX3Byb2Nlc3Nvcl9jcHVfaW5pdF9wZGNcbiIpOwotCXBlcmYtPnBkYyA9IE5VTEw7Ci0JaWYgKGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfRVNUKSkKLQkJYWNwaV9wcm9jZXNzb3JfY3B1X2luaXRfcGRjX2VzdChwZXJmLCBjcHUsIG9ial9saXN0KTsKLQlyZXR1cm47Ci19Ci0KLQogc3RhdGljIGludAogYWNwaV9jcHVmcmVxX2NwdV9pbml0ICgKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgICAqcG9saWN5KQpAQCAtMzY3LDE1ICszMDMsOSBAQAogCXVuc2lnbmVkIGludAkJY3B1ID0gcG9saWN5LT5jcHU7CiAJc3RydWN0IGNwdWZyZXFfYWNwaV9pbwkqZGF0YTsKIAl1bnNpZ25lZCBpbnQJCXJlc3VsdCA9IDA7Ci0KLQl1bmlvbiBhY3BpX29iamVjdAkJYXJnMCA9IHtBQ1BJX1RZUEVfQlVGRkVSfTsKLQl1MzIJCQkJYXJnMF9idWZbM107Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgCWFyZ19saXN0ID0gezEsICZhcmcwfTsKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGFbcG9saWN5LT5jcHVdOwogCiAJZHByaW50aygiYWNwaV9jcHVmcmVxX2NwdV9pbml0XG4iKTsKLQkvKiBzZXR1cCBhcmdfbGlzdCBmb3IgX1BEQyBzZXR0aW5ncyAqLwotICAgICAgICBhcmcwLmJ1ZmZlci5sZW5ndGggPSAxMjsKLSAgICAgICAgYXJnMC5idWZmZXIucG9pbnRlciA9ICh1OCAqKSBhcmcwX2J1ZjsKIAogCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKQpAQCAtMzgzLDE0ICszMTMsMTIgQEAKIAogCWFjcGlfaW9fZGF0YVtjcHVdID0gZGF0YTsKIAotCWFjcGlfcHJvY2Vzc29yX2NwdV9pbml0X3BkYygmZGF0YS0+YWNwaV9kYXRhLCBjcHUsICZhcmdfbGlzdCk7CiAJcmVzdWx0ID0gYWNwaV9wcm9jZXNzb3JfcmVnaXN0ZXJfcGVyZm9ybWFuY2UoJmRhdGEtPmFjcGlfZGF0YSwgY3B1KTsKLQlkYXRhLT5hY3BpX2RhdGEucGRjID0gTlVMTDsKIAogCWlmIChyZXN1bHQpCiAJCWdvdG8gZXJyX2ZyZWU7CiAKLQlpZiAoaXNfY29uc3RfbG9vcHNfY3B1KGNwdSkpIHsKKwlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9DT05TVEFOVF9UU0MpKSB7CiAJCWFjcGlfY3B1ZnJlcV9kcml2ZXIuZmxhZ3MgfD0gQ1BVRlJFUV9DT05TVF9MT09QUzsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguYwppbmRleCAwZmJiZDRjLi5lMTFhMDkyIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5jCkBAIC05ODAsNyArOTgwLDcgQEAKIH0KIAogLyogcGVyIENQVSBpbml0IGVudHJ5IHBvaW50IHRvIHRoZSBkcml2ZXIgKi8KLXN0YXRpYyBpbnQgX19pbml0IHBvd2Vybm93azhfY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2wpCitzdGF0aWMgaW50IF9fY3B1aW5pdCBwb3dlcm5vd2s4X2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9sKQogewogCXN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhOwogCWNwdW1hc2tfdCBvbGRtYXNrID0gQ1BVX01BU0tfQUxMOwpAQCAtMTE0MSw3ICsxMTQxLDcgQEAKIH07CiAKIC8qIGRyaXZlciBlbnRyeSBwb2ludCBmb3IgaW5pdCAqLwotc3RhdGljIGludCBfX2luaXQgcG93ZXJub3drOF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9fY3B1aW5pdCBwb3dlcm5vd2s4X2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgaSwgc3VwcG9ydGVkX2NwdXMgPSAwOwogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYwppbmRleCBlZGI5ODczLi5jMTczYzBmIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMKQEAgLTM1LDggKzM1LDYgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KIAotI2luY2x1ZGUgInNwZWVkc3RlcC1lc3QtY29tbW9uLmgiCi0KICNkZWZpbmUgUEZYCQkic3BlZWRzdGVwLWNlbnRyaW5vOiAiCiAjZGVmaW5lIE1BSU5UQUlORVIJIkplcmVteSBGaXR6aGFyZGluZ2UgPGplcmVteUBnb29wLm9yZz4iCiAKQEAgLTM2NCwyMiArMzYyLDEwIEBACiAgKi8KIHN0YXRpYyBpbnQgY2VudHJpbm9fY3B1X2luaXRfYWNwaShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKLQl1bmlvbiBhY3BpX29iamVjdAkJYXJnMCA9IHtBQ1BJX1RZUEVfQlVGRkVSfTsKLQl1MzIJCQkJYXJnMF9idWZbM107Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QJCWFyZ19saXN0ID0gezEsICZhcmcwfTsKIAl1bnNpZ25lZCBsb25nCQkJY3VyX2ZyZXE7CiAJaW50CQkJCXJlc3VsdCA9IDAsIGk7CiAJdW5zaWduZWQgaW50CQkJY3B1ID0gcG9saWN5LT5jcHU7CiAKLQkvKiBfUERDIHNldHRpbmdzICovCi0JYXJnMC5idWZmZXIubGVuZ3RoID0gMTI7Ci0JYXJnMC5idWZmZXIucG9pbnRlciA9ICh1OCAqKSBhcmcwX2J1ZjsKLQlhcmcwX2J1ZlswXSA9IEFDUElfUERDX1JFVklTSU9OX0lEOwotCWFyZzBfYnVmWzFdID0gMTsKLQlhcmcwX2J1ZlsyXSA9IEFDUElfUERDX0VTVF9DQVBBQklMSVRZX1NNUF9NU1I7Ci0KLQlwLnBkYyA9ICZhcmdfbGlzdDsKLQogCS8qIHJlZ2lzdGVyIHdpdGggQUNQSSBjb3JlICovCiAJaWYgKGFjcGlfcHJvY2Vzc29yX3JlZ2lzdGVyX3BlcmZvcm1hbmNlKCZwLCBjcHUpKSB7CiAJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAib2J0YWluaW5nIEFDUEkgZGF0YSBmYWlsZWRcbiIpOwpAQCAtNDkzLDEyICs0NzksMTMgQEAKIAl1bnNpZ25lZCBsLCBoOwogCWludCByZXQ7CiAJaW50IGk7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gJmNwdV9kYXRhW3BvbGljeS0+Y3B1XTsKIAogCS8qIE9ubHkgSW50ZWwgbWFrZXMgRW5oYW5jZWQgU3BlZWRzdGVwLWNhcGFibGUgQ1BVcyAqLwogCWlmIChjcHUtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCB8fCAhY3B1X2hhcyhjcHUsIFg4Nl9GRUFUVVJFX0VTVCkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKGlzX2NvbnN0X2xvb3BzX2NwdShwb2xpY3ktPmNwdSkpIHsKKwlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9DT05TVEFOVF9UU0MpKSB7CiAJCWNlbnRyaW5vX2RyaXZlci5mbGFncyB8PSBDUFVGUkVRX0NPTlNUX0xPT1BTOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtZXN0LWNvbW1vbi5oIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtZXN0LWNvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2U5OTVjLi4wMDAwMDAwCi0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWVzdC1jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBSb3V0aW5lcyBjb21tb24gZm9yIGRyaXZlcnMgaGFuZGxpbmcgRW5oYW5jZWQgU3BlZWRzdGVwIFRlY2hub2xvZ3kKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDQgVmVua2F0ZXNoIFBhbGxpcGFkaSA8dmVua2F0ZXNoLnBhbGxpcGFkaUBpbnRlbC5jb20+Ci0gKgotICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMiAtLSBzZWUKLSAqICBDT1BZSU5HIGZvciBkZXRhaWxzLgotICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IGlzX2NvbnN0X2xvb3BzX2NwdSh1bnNpZ25lZCBpbnQgY3B1KQotewotCXN0cnVjdCBjcHVpbmZvX3g4NiAJKmMgPSBjcHVfZGF0YSArIGNwdTsKLQotCWlmIChjLT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfSU5URUwgfHwgIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfRVNUKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKgotCSAqIG9uIFAtNHMsIHRoZSBUU0MgcnVucyB3aXRoIGNvbnN0YW50IGZyZXF1ZW5jeSBpbmRlcGVuZGVudCBvZiBjcHUgZnJlcQotCSAqIHdoZW4gd2UgdXNlIEVTVAotCSAqLwotCWlmIChjLT54ODYgPT0gMHhmKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9pbnRlbC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvaW50ZWwuYwppbmRleCA1ZTJkYTcwLi44YzAxMjAxIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9pbnRlbC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsLmMKQEAgLTE4MywxMCArMTgzLDEzIEBACiAJfQogI2VuZGlmCiAKLQlpZiAoYy0+eDg2ID09IDE1KSAKKwlpZiAoYy0+eDg2ID09IDE1KQogCQlzZXRfYml0KFg4Nl9GRUFUVVJFX1A0LCBjLT54ODZfY2FwYWJpbGl0eSk7CiAJaWYgKGMtPng4NiA9PSA2KSAKIAkJc2V0X2JpdChYODZfRkVBVFVSRV9QMywgYy0+eDg2X2NhcGFiaWxpdHkpOworCWlmICgoYy0+eDg2ID09IDB4ZiAmJiBjLT54ODZfbW9kZWwgPj0gMHgwMykgfHwKKwkJKGMtPng4NiA9PSAweDYgJiYgYy0+eDg2X21vZGVsID49IDB4MGUpKQorCQlzZXRfYml0KFg4Nl9GRUFUVVJFX0NPTlNUQU5UX1RTQywgYy0+eDg2X2NhcGFiaWxpdHkpOwogfQogCiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvY2hhbmdlbG9nIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9jaGFuZ2Vsb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMTM2ODUuLjAwMDAwMDAKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9jaGFuZ2Vsb2cKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotICAgIENoYW5nZUxvZwotCi0gICAgUHJlaGlzdG9yeSBNYXJ0aW4gVGlzY2ho5HVzZXIgPG1hcnRpbkBpa2NiYXJrYS5memsuZGU+Ci0JICAgICAgIEluaXRpYWwgcmVnaXN0ZXItc2V0dGluZyBjb2RlIChmcm9tIHByb2Zvcm0tMS4wKS4KLSAgICAxOTk3MTIxNiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgotICAgICAgICAgICAgICAgT3JpZ2luYWwgdmVyc2lvbiBmb3IgL3Byb2MvbXRyciBpbnRlcmZhY2UsIFNNUC1zYWZlLgotICB2MS4wCi0gICAgMTk5NzEyMTcgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KLSAgICAgICAgICAgICAgIEJ1ZyBmaXggZm9yIGlvY3RscygpJ3MuCi0JICAgICAgIEFkZGVkIHNhbXBsZSBjb2RlIGluIERvY3VtZW50YXRpb24vbXRyci50eHQKLSAgdjEuMQotICAgIDE5OTcxMjE4ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+Ci0gICAgICAgICAgICAgICBEaXNhbGxvdyBvdmVybGFwcGluZyByZWdpb25zLgotICAgIDE5OTcxMjE5ICAgSmVucyBNYXVyZXIgPGptYXVyZXJAbWVudWV0dC5yaGVpbi1tYWluLmRlPgotICAgICAgICAgICAgICAgUmVnaXN0ZXItc2V0dGluZyBmaXh1cHMuCi0gIHYxLjIKLSAgICAxOTk3MTIyMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgotICAgICAgICAgICAgICAgRml4dXBzIGZvciBrZXJuZWwgMi4xLjc1LgotICB2MS4zCi0gICAgMTk5NzEyMjkgICBEYXZpZCBXcmFnZyA8ZHB3QGRvYy5pYy5hYy51az4KLSAgICAgICAgICAgICAgIFJlZ2lzdGVyLXNldHRpbmcgZml4dXBzIGFuZCBjb25mb3JtaXR5IHdpdGggSW50ZWwgY29udmVudGlvbnMuCi0gICAgMTk5NzEyMjkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KLSAgICAgICAgICAgICAgIENvc21ldGljIGNoYW5nZXMgYW5kIHdyb3RlIHRoaXMgQ2hhbmdlTG9nIDstKQotICAgIDE5OTgwMTA2ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+Ci0gICAgICAgICAgICAgICBGaXh1cHMgZm9yIGtlcm5lbCAyLjEuNzguCi0gIHYxLjQKLSAgICAxOTk4MDExOSAgIERhdmlkIFdyYWdnIDxkcHdAZG9jLmljLmFjLnVrPgotICAgICAgICAgICAgICAgSW5jbHVkZWQgcGFzc2l2ZS1yZWxlYXNlIGVuYWJsZSBjb2RlIChlbHNld2hlcmUgaW4gUENJIHNldHVwKS4KLSAgdjEuNQotICAgIDE5OTgwMTMxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+Ci0gICAgICAgICAgICAgICBSZXBsYWNlZCBnbG9iYWwga2VybmVsIGxvY2sgd2l0aCBwcml2YXRlIHNwaW5sb2NrLgotICB2MS42Ci0gICAgMTk5ODAyMDEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KLSAgICAgICAgICAgICAgIEFkZGVkIHdhaXQgZm9yIG90aGVyIENQVXMgdG8gY29tcGxldGUgY2hhbmdlcy4KLSAgdjEuNwotICAgIDE5OTgwMjAyICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+Ci0gICAgICAgICAgICAgICBCdWcgZml4IGluIGRlZmluaXRpb24gb2YgPHNldF9tdHJyPiBmb3IgVVAuCi0gIHYxLjgKLSAgICAxOTk4MDMxOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgotICAgICAgICAgICAgICAgRml4dXBzIGZvciBrZXJuZWwgMi4xLjkwLgotICAgIDE5OTgwMzIzICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+Ci0gICAgICAgICAgICAgICBNb3ZlIFNNUCBCSU9TIGZpeHVwIGJlZm9yZSBzZWNvbmRhcnkgQ1BVcyBjYWxsIDxjYWxpYnJhdGVfZGVsYXk+Ci0gIHYxLjkKLSAgICAxOTk4MDMyNSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgotICAgICAgICAgICAgICAgRml4ZWQgdGVzdCBmb3Igb3ZlcmxhcHBpbmcgcmVnaW9uczogY29uZnVzZWQgYnkgYWRqYWNlbnQgcmVnaW9ucwotICAgIDE5OTgwMzI2ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+Ci0gICAgICAgICAgICAgICBBZGRlZCB3YmludmQgaW4gPHNldF9tdHJyX3ByZXBhcmU+LgotICAgIDE5OTgwNDAxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+Ci0gICAgICAgICAgICAgICBCdWcgZml4IGZvciBub24tU01QIGNvbXBpbGF0aW9uLgotICAgIDE5OTgwNDE4ICAgRGF2aWQgV3JhZ2cgPGRwd0Bkb2MuaWMuYWMudWs+Ci0gICAgICAgICAgICAgICBGaXhlZC1NVFJSIHN5bmNocm9uaXNhdGlvbiBmb3IgU01QIGFuZCB1c2UgYXRvbWljIG9wZXJhdGlvbnMKLQkgICAgICAgaW5zdGVhZCBvZiBzcGlubG9ja3MuCi0gICAgMTk5ODA0MTggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KLQkgICAgICAgRGlmZmVyZW50aWF0ZSBkaWZmZXJlbnQgTVRSUiByZWdpc3RlciBjbGFzc2VzIGZvciBCSU9TIGZpeHVwLgotICB2MS4xMAotICAgIDE5OTgwNDE5ICAgRGF2aWQgV3JhZ2cgPGRwd0Bkb2MuaWMuYWMudWs+Ci0JICAgICAgIEJ1ZyBmaXggaW4gdmFyaWFibGUgTVRSUiBzeW5jaHJvbmlzYXRpb24uCi0gIHYxLjExCi0gICAgMTk5ODA0MTkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KLQkgICAgICAgRml4dXBzIGZvciBrZXJuZWwgMi4xLjk3LgotICB2MS4xMgotICAgIDE5OTgwNDIxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+Ci0JICAgICAgIFNhZmVyIHN5bmNocm9uaXNhdGlvbiBhY3Jvc3MgQ1BVcyB3aGVuIGNoYW5naW5nIE1UUlJzLgotICB2MS4xMwotICAgIDE5OTgwNDIzICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+Ci0JICAgICAgIEJ1Z2ZpeCBmb3IgU01QIHN5c3RlbXMgd2l0aG91dCBNVFJSIHN1cHBvcnQuCi0gIHYxLjE0Ci0gICAgMTk5ODA0MjcgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KLQkgICAgICAgVHJhcCBjYWxscyB0byA8bXRycl9hZGQ+IGFuZCA8bXRycl9kZWw+IG9uIG5vbi1NVFJSIG1hY2hpbmVzLgotICB2MS4xNQotICAgIDE5OTgwNDI3ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+Ci0JICAgICAgIFVzZSBhdG9taWMgYml0b3BzIGZvciBzZXR0aW5nIFNNUCBjaGFuZ2UgbWFzay4KLSAgdjEuMTYKLSAgICAxOTk4MDQyOCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgotCSAgICAgICBSZW1vdmVkIHNwdXJpb3VzIGRpYWdub3N0aWMgbWVzc2FnZS4KLSAgdjEuMTcKLSAgICAxOTk4MDQyOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgotCSAgICAgICBNb3ZlZCByZWdpc3Rlci1zZXR0aW5nIG1hY3JvcyBpbnRvIHRoaXMgZmlsZS4KLQkgICAgICAgTW92ZWQgc2V0dXAgY29kZSBmcm9tIGluaXQvbWFpbi5jIHRvIGkzODYtc3BlY2lmaWMgYXJlYXMuCi0gIHYxLjE4Ci0gICAgMTk5ODA1MDIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KLQkgICAgICAgTW92ZWQgTVRSUiBkZXRlY3Rpb24gb3V0c2lkZSBjb25kaXRpb25hbHMgaW4gPG10cnJfaW5pdD4uCi0gIHYxLjE5Ci0gICAgMTk5ODA1MDIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KLQkgICAgICAgRG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudDogbWVudGlvbiBQZW50aXVtIElJIGFuZCBBR1AuCi0gIHYxLjIwCi0gICAgMTk5ODA1MjEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KLQkgICAgICAgT25seSBtYW5pcHVsYXRlIGludGVycnVwdCBlbmFibGUgZmxhZyBvbiBsb2NhbCBDUFUuCi0JICAgICAgIEFsbG93IGVuY2xvc2VkIHVuY2FjaGFibGUgcmVnaW9ucy4KLSAgdjEuMjEKLSAgICAxOTk4MDYxMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgotCSAgICAgICBBbHdheXMgZGVmaW5lIDxtYWluX2xvY2s+LgotICB2MS4yMgotICAgIDE5OTgwOTAxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+Ci0JICAgICAgIFJlbW92ZWQgbW9kdWxlIHN1cHBvcnQgaW4gb3JkZXIgdG8gdGlkeSB1cCBjb2RlLgotCSAgICAgICBBZGRlZCBzYW5pdHkgY2hlY2sgZm9yIDxtdHJyX2FkZD4vPG10cnJfZGVsPiBiZWZvcmUgPG10cnJfaW5pdD4uCi0JICAgICAgIENyZWF0ZWQgYWRkaXRpb24gcXVldWUgZm9yIHByaW9yIHRvIFNNUCBjb21tZW5jZS4KLSAgdjEuMjMKLSAgICAxOTk4MDkwMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgotCSAgICAgICBQb3J0ZWQgcGF0Y2ggdG8ga2VybmVsIDIuMS4xMjAtcHJlMy4KLSAgdjEuMjQKLSAgICAxOTk4MDkxMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgotCSAgICAgICBSZW1vdmVkIHNhbml0eSBjaGVja3MgYW5kIGFkZGl0aW9uIHF1ZXVlOiBMaW51cyBwcmVmZXJzIGFuIE9PUFMuCi0gIHYxLjI1Ci0gICAgMTk5ODEwMDEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KLQkgICAgICAgRml4ZWQgaGFybWxlc3MgY29tcGlsZXIgd2FybmluZyBpbiBpbmNsdWRlL2FzbS1pMzg2L210cnIuaAotCSAgICAgICBGaXhlZCB2ZXJzaW9uIG51bWJlcmluZyBhbmQgaGlzdG9yeSBmb3IgdjEuMjMgLT4gdjEuMjQuCi0gIHYxLjI2Ci0gICAgMTk5OTAxMTggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KLQkgICAgICAgQWRkZWQgZGV2ZnMgc3VwcG9ydC4KLSAgdjEuMjcKLSAgICAxOTk5MDEyMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgotCSAgICAgICBDaGFuZ2VkIGxvY2tpbmcgdG8gc3BpbiB3aXRoIHJlc2NoZWR1bGUuCi0JICAgICAgIE1hZGUgdXNlIG9mIG5ldyA8c21wX2NhbGxfZnVuY3Rpb24+LgotICB2MS4yOAotICAgIDE5OTkwMjAxICAgWm9sdOFuIEL2c3r2cm3pbnlpIDx6Ym9zem9yQG1haWwuZXh0ZXJuZXQuaHU+Ci0JICAgICAgIEV4dGVuZGVkIHRoZSBkcml2ZXIgdG8gYmUgYWJsZSB0byB1c2UgQ3lyaXggc3R5bGUgQVJScy4KLSAgICAxOTk5MDIwNCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgotCSAgICAgICBSZXN0cnVjdHVyZWQgQ3lyaXggc3VwcG9ydC4KLSAgdjEuMjkKLSAgICAxOTk5MDIwNCAgIFpvbHThbiBC9nN69nJt6W55aSA8emJvc3pvckBtYWlsLmV4dGVybmV0Lmh1PgotCSAgICAgICBSZWZpbmVkIEFSUiBzdXBwb3J0OiBlbmFibGUgTUFQRU4gaW4gc2V0X210cnJfcHJlcGFyZSgpCi0JICAgICAgIGFuZCBkaXNhYmxlIE1BUEVOIGluIHNldF9tdHJyX2RvbmUoKS4KLSAgICAxOTk5MDIwNSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgotCSAgICAgICBNaW5vciBjbGVhbnVwcy4KLSAgdjEuMzAKLSAgICAxOTk5MDIwOCAgIFpvbHThbiBC9nN69nJt6W55aSA8emJvc3pvckBtYWlsLmV4dGVybmV0Lmh1PgotICAgICAgICAgICAgICAgUHJvdGVjdCBwbGFpbiA2eDg2cyAoYW5kIG90aGVyIHByb2Nlc3NvcnMgd2l0aG91dCB0aGUKLSAgICAgICAgICAgICAgIFBhZ2UgR2xvYmFsIEVuYWJsZSBmZWF0dXJlKSBhZ2FpbnN0IGFjY2Vzc2luZyBDUjQgaW4KLSAgICAgICAgICAgICAgIHNldF9tdHJyX3ByZXBhcmUoKSBhbmQgc2V0X210cnJfZG9uZSgpLgotICAgIDE5OTkwMjEwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+Ci0JICAgICAgIFR1cm5lZCA8c2V0X210cnJfdXA+IGFuZCA8Z2V0X210cnI+IGludG8gZnVuY3Rpb24gcG9pbnRlcnMuCi0gIHYxLjMxCi0gICAgMTk5OTAyMTIgICBab2x04W4gQvZzevZybelueWkgPHpib3N6b3JAbWFpbC5leHRlcm5ldC5odT4KLSAgICAgICAgICAgICAgIE1ham9yIHJld3JpdGUgb2YgY3lyaXhfYXJyX2luaXQoKTogZG8gbm90IHRvdWNoIEFSUnMsCi0gICAgICAgICAgICAgICBsZWF2ZSB0aGVtIGFzIHRoZSBCSU9TIGhhdmUgc2V0IHRoZW0gdXAuCi0gICAgICAgICAgICAgICBFbmFibGUgdXNhZ2Ugb2YgYWxsIDggQVJScy4KLSAgICAgICAgICAgICAgIEF2b2lkIG11bHRpcGxpY2F0aW9ucyBieSAzIGV2ZXJ5d2hlcmUgYW5kIG90aGVyCi0gICAgICAgICAgICAgICBjb2RlIGNsZWFuIHVwcy9zcGVlZCB1cHMuCi0gICAgMTk5OTAyMTMgICBab2x04W4gQvZzevZybelueWkgPHpib3N6b3JAbWFpbC5leHRlcm5ldC5odT4KLSAgICAgICAgICAgICAgIFNldCB1cCBvdGhlciBDeXJpeCBwcm9jZXNzb3JzIGlkZW50aWNhbCB0byB0aGUgYm9vdCBjcHUuCi0gICAgICAgICAgICAgICBTaW5jZSBDeXJpeCBkb24ndCBzdXBwb3J0IEludGVsIEFQSUMsIHRoaXMgaXMgbCdhcnQgcG91ciBsJ2FydC4KLSAgICAgICAgICAgICAgIFdlaWdoIEFSUnMgYnkgc2l6ZToKLSAgICAgICAgICAgICAgIElmIHNpemUgPD0gMzJNIGlzIGdpdmVuLCBzZXQgdXAgQVJSIyB3ZSB3ZXJlIGdpdmVuLgotICAgICAgICAgICAgICAgSWYgc2l6ZSA+ICAzMk0gaXMgZ2l2ZW4sIHNldCB1cCBBUlI3IG9ubHkgaWYgaXQgaXMgZnJlZSwKLSAgICAgICAgICAgICAgIGZhaWwgb3RoZXJ3aXNlLgotICAgIDE5OTkwMjE0ICAgWm9sdOFuIEL2c3r2cm3pbnlpIDx6Ym9zem9yQG1haWwuZXh0ZXJuZXQuaHU+Ci0gICAgICAgICAgICAgICBBbHNvIGNoZWNrIGZvciBzaXplID49IDI1NksgaWYgd2UgYXJlIHRvIHNldCB1cCBBUlI3LAotICAgICAgICAgICAgICAgbXRycl9hZGQoKSByZXR1cm5zIHRoZSB2YWx1ZSBpdCBnZXRzIGZyb20gc2V0X210cnIoKQotICAgIDE5OTkwMjE4ICAgWm9sdOFuIEL2c3r2cm3pbnlpIDx6Ym9zem9yQG1haWwuZXh0ZXJuZXQuaHU+Ci0gICAgICAgICAgICAgICBSZW1vdmUgQ3lyaXggImNvbWEgYnVnIiB3b3JrYXJvdW5kIGZyb20gaGVyZS4KLSAgICAgICAgICAgICAgIE1vdmVkIHRvIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYyBhbmQKLSAgICAgICAgICAgICAgIGxpbnV4L2luY2x1ZGUvYXNtLWkzODYvYnVncy5oCi0gICAgMTk5OTAyMjggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KLQkgICAgICAgQWRkZWQgTVRSUklPQ19LSUxMX0VOVFJZIGlvY3RsKDIpCi0JICAgICAgIFRyYXAgZm9yIGNvdW50ZXIgdW5kZXJmbG93IGluIDxtdHJyX2ZpbGVfZGVsPi4KLQkgICAgICAgVHJhcCBmb3IgNCBNaUIgYWxpZ25lZCByZWdpb25zIGZvciBQUHJvLCBzdGVwcGluZyA8PSA3LgotICAgIDE5OTkwMzAxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+Ci0JICAgICAgIENyZWF0ZWQgPGdldF9mcmVlX3JlZ2lvbj4gaG9vay4KLSAgICAxOTk5MDMwNSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgotCSAgICAgICBUZW1wb3JhcmlseSBkaXNhYmxlIEFNRCBzdXBwb3J0IG5vdyBNVFJSIGNhcGFiaWxpdHkgZmxhZyBpcyBzZXQuCi0gIHYxLjMyCi0gICAgMTk5OTAzMDggICBab2x04W4gQvZzevZybelueWkgPHpib3N6b3JAbWFpbC5leHRlcm5ldC5odT4KLQkgICAgICAgQWRqdXN0IG15IGNoYW5nZXMgKDE5OTkwMjEyLTE5OTkwMjE4KSB0byBSaWNoYXJkIEdvb2NoJ3MKLQkgICAgICAgbGF0ZXN0IGNoYW5nZXMuICgxOTk5MDIyOC0xOTk5MDMwNSkKLSAgdjEuMzMKLSAgICAxOTk5MDMwOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgotCSAgICAgICBGaXhlZCB0eXBvIGluIDxwcmludGs+IG1lc3NhZ2UuCi0gICAgMTk5OTAzMTAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KLQkgICAgICAgU3VwcG9ydCBLNi1JSS9JSUkgYmFzZWQgb24gQWxhbiBDb3gncyA8YWxhbkByZWRoYXQuY29tPiBwYXRjaGVzLgotICB2MS4zNAotICAgIDE5OTkwNTExICAgQmFydCBIYXJ0Z2VycyA8YmFydEBldHBtb2QucGh5cy50dWUubmw+Ci0JICAgICAgIFN1cHBvcnQgQ2VudGF1ciBDNiBNQ1Incy4KLSAgICAxOTk5MDUxMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgotCSAgICAgICBNaW5vciBjbGVhbnVwcy4KLSAgdjEuMzUKLSAgICAxOTk5MDcwNyAgIFpvbHThbiBC9nN69nJt6W55aSA8emJvc3pvckBtYWlsLmV4dGVybmV0Lmh1PgotICAgICAgICAgICAgICAgQ2hlY2sgd2hldGhlciBBUlIzIGlzIHByb3RlY3RlZCBpbiBjeXJpeF9nZXRfZnJlZV9yZWdpb24oKQotICAgICAgICAgICAgICAgYW5kIG10cnJfZGVsKCkuIFRoZSBjb2RlIHdvbid0IGF0dGVtcHQgdG8gZGVsZXRlIG9yIGNoYW5nZSBpdAotICAgICAgICAgICAgICAgZnJvbSBub3cgb24gaWYgdGhlIEJJT1MgcHJvdGVjdGVkIEFSUjMuIEl0IHNpbGVudGx5IHNraXBzIEFSUjMKLSAgICAgICAgICAgICAgIGluIGN5cml4X2dldF9mcmVlX3JlZ2lvbigpIG9yIHJldHVybnMgd2l0aCBhbiBlcnJvciBjb2RlIGZyb20KLSAgICAgICAgICAgICAgIG10cnJfZGVsKCkuCi0gICAgMTk5OTA3MTEgICBab2x04W4gQvZzevZybelueWkgPHpib3N6b3JAbWFpbC5leHRlcm5ldC5odT4KLSAgICAgICAgICAgICAgIFJlc2V0IHNvbWUgYml0cyBpbiB0aGUgQ0NScyBpbiBjeXJpeF9hcnJfaW5pdCgpIHRvIGRpc2FibGUgU01NCi0gICAgICAgICAgICAgICBpZiBBUlIzIGlzbid0IHByb3RlY3RlZC4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBpZiBTTU0gaXMgYWN0aXZlCi0gICAgICAgICAgICAgICBhbmQgQVJSMyBpc24ndCBwcm90ZWN0ZWQgdGhlbiBkZWxldGluZyBhbmQgc2V0dGluZyBBUlIzIGFnYWluCi0gICAgICAgICAgICAgICBtYXkgbG9jayB1cCB0aGUgcHJvY2Vzc29yLiBXaXRoIFNNTSBlbnRpcmVseSBkaXNhYmxlZCwgaXQgZG9lcwotICAgICAgICAgICAgICAgbm90IGhhcHBlbi4KLSAgICAxOTk5MDgxMiAgIFpvbHThbiBC9nN69nJt6W55aSA8emJvc3pvckBtYWlsLmV4dGVybmV0Lmh1PgotICAgICAgICAgICAgICAgUmVhcnJhbmdlIHN3aXRjaCgpIHN0YXRlbWVudHMgc28gdGhlIGRyaXZlciBhY2NvbW9kYXRlcyB0bwotICAgICAgICAgICAgICAgdGhlIGZhY3QgdGhhdCB0aGUgQU1EIEF0aGxvbiBoYW5kbGVzIGl0cyBNVFJScyB0aGUgc2FtZSB3YXkKLSAgICAgICAgICAgICAgIGFzIEludGVsIGRvZXMuCi0gICAgMTk5OTA4MTQgICBab2x04W4gQvZzevZybelueWkgPHpib3N6b3JAbWFpbC5leHRlcm5ldC5odT4KLQkgICAgICAgRG91YmxlIGNoZWNrIGZvciBJbnRlbCBpbiBtdHJyX2FkZCgpJ3MgYmlnIHN3aXRjaCgpIGJlY2F1c2UKLQkgICAgICAgdGhhdCByZXZpc2lvbiBjaGVjayBpcyBvbmx5IHZhbGlkIGZvciBJbnRlbCBDUFVzLgotICAgIDE5OTkwODE5ICAgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KLSAgICAgICAgICAgICAgIFRlc3RlZCBab2x0YW4ncyBjaGFuZ2VzIG9uIGEgcHJlIHByb2R1Y3Rpb24gQXRobG9uIC0gMTAwJQotICAgICAgICAgICAgICAgc3VjY2Vzcy4KLSAgICAxOTk5MTAwOCAgIE1hbmZyZWQgU3ByYXVsIDxtYW5mcmVkc0Bjb2xvcmZ1bGxpZmUuY29tPgotICAgIAkgICAgICAgcmVwbGFjZWQgc3Bpbl9sb2NrX3Jlc2NoZWR1bGUoKSB3aXRoIGEgbm9ybWFsIHNlbWFwaG9yZS4KLSAgdjEuMzYKLSAgICAyMDAwMDIyMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgotICAgICAgICAgICAgICAgQ29tcGlsZSBmaXggaWYgcHJvY2ZzIGFuZCBkZXZmcyBub3QgZW5hYmxlZC4KLQkgICAgICAgRm9ybWF0dGluZyBjaGFuZ2VzLgotICB2MS4zNwotICAgIDIwMDAxMTA5ICAgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+Ci0JICAgICAgIFVzZSB0aGUgbmV3IGNlbnRyYWxpemVkIENQVSBmZWF0dXJlIGRldGVjdHMuCi0KLSAgdjEuMzgKLSAgICAyMDAxMDMwOSAgIERhdmUgSm9uZXMgPGRhdmVqQHN1c2UuZGU+Ci0JICAgICAgIEFkZCBzdXBwb3J0IGZvciBDeXJpeCBJSUkuCi0KLSAgdjEuMzkKLSAgICAyMDAxMDMxMiAgIERhdmUgSm9uZXMgPGRhdmVqQHN1c2UuZGU+Ci0gICAgICAgICAgICAgICBVZ2gsIEkgYnJva2UgQU1EIHN1cHBvcnQuCi0JICAgICAgIFJld29ya2VkIGZpeCBieSBUcm9lbHMgV2Fsc3RlZCBIYW5zZW4gPHRyb2Vsc0B0aHVsZS5ubz4KLQotICB2MS40MAotICAgIDIwMDEwMzI3ICAgRGF2ZSBKb25lcyA8ZGF2ZWpAc3VzZS5kZT4KLQkgICAgICAgQWRhcHRlZCBDeXJpeCBJSUkgc3VwcG9ydCB0byBpbmNsdWRlIFZJQSBDMy4KLQotICB2Mi4wCi0gICAgMjAwMjAzMDYgICBQYXRyaWNrIE1vY2hlbCA8bW9jaGVsQG9zZGwub3JnPgotICAgICAgICAgICAgICAgU3BsaXQgbXRyci5jIC0+IG10cnIvKi5jCi0gICAgICAgICAgICAgICBDb252ZXJ0ZWQgdG8gTGludXggS2VybmVsIENvZGluZyBTdHlsZQotICAgICAgICAgICAgICAgRml4ZWQgc2V2ZXJhbCBtaW5vciBuaXRzIGluIGZvcm0KLSAgICAgICAgICAgICAgIE1vdmVkIHNvbWUgU01QLW9ubHkgZnVuY3Rpb25zIG91dCwgc28gdGhleSBjYW4gYmUgdXNlZAotICAgICAgICAgICAgICAgIGZvciBwb3dlciBtYW5hZ2VtZW50IGluIHRoZSBmdXR1cmUuCi0gICAgICAgICAgICAgICBUT0RPOiBGaXggdXNlciBpbnRlcmZhY2UgY3J1ZnQuCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2lmLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2lmLmMKaW5kZXggY2YzOWUyMC4uNWFjMDUxYiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9pZi5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvaWYuYwpAQCAtMSw1ICsxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9wcm9jLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9wcm9jLmMKaW5kZXggNmQ5MWIyNy4uODlhODVhZiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvcHJvYy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L3Byb2MuYwpAQCAtMjksNyArMjksNyBAQAogCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogCQlOVUxMLCBOVUxMLCBOVUxMLCAic3lzY2FsbCIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAJCU5VTEwsIE5VTEwsIE5VTEwsICJtcCIsICJueCIsIE5VTEwsICJtbXhleHQiLCBOVUxMLAotCQlOVUxMLCAiZnhzcl9vcHQiLCBOVUxMLCBOVUxMLCBOVUxMLCAibG0iLCAiM2Rub3dleHQiLCAiM2Rub3ciLAorCQlOVUxMLCAiZnhzcl9vcHQiLCAicmR0c2NwIiwgTlVMTCwgTlVMTCwgImxtIiwgIjNkbm93ZXh0IiwgIjNkbm93IiwKIAogCQkvKiBUcmFuc21ldGEtZGVmaW5lZCAqLwogCQkicmVjb3ZlcnkiLCAibG9uZ3J1biIsIE5VTEwsICJscnRpIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKQEAgLTQwLDcgKzQwLDcgQEAKIAkJLyogT3RoZXIgKExpbnV4LWRlZmluZWQpICovCiAJCSJjeG1teCIsICJrNl9tdHJyIiwgImN5cml4X2FyciIsICJjZW50YXVyX21jciIsCiAJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0JCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJjb25zdGFudF90c2MiLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogCkBAIC01NywxMSArNTcsMjEgQEAKIAkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKIAogCQkvKiBBTUQtZGVmaW5lZCAoIzIpICovCi0JCSJsYWhmX2xtIiwgImNtcF9sZWdhY3kiLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkibGFoZl9sbSIsICJjbXBfbGVnYWN5IiwgInN2bSIsIE5VTEwsICJjcjhsZWdhY3kiLCBOVUxMLCBOVUxMLCBOVUxMLAogCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogCX07CisJc3RhdGljIGNoYXIgKng4Nl9wb3dlcl9mbGFnc1tdID0geworCQkidHMiLAkvKiB0ZW1wZXJhdHVyZSBzZW5zb3IgKi8KKwkJImZpZCIsICAvKiBmcmVxdWVuY3kgaWQgY29udHJvbCAqLworCQkidmlkIiwgIC8qIHZvbHRhZ2UgaWQgY29udHJvbCAqLworCQkidHRwIiwgIC8qIHRoZXJtYWwgdHJpcCAqLworCQkidG0iLAorCQkic3RjIiwKKwkJTlVMTCwKKwkJLyogbm90aGluZyAqLwkvKiBjb25zdGFudF90c2MgLSBtb3ZlZCB0byBmbGFncyAqLworCX07CiAJc3RydWN0IGNwdWluZm9feDg2ICpjID0gdjsKIAlpbnQgaSwgbiA9IGMgLSBjcHVfZGF0YTsKIAlpbnQgZnB1X2V4Y2VwdGlvbjsKQEAgLTEzMSw2ICsxNDEsMTcgQEAKIAkJICAgICB4ODZfY2FwX2ZsYWdzW2ldICE9IE5VTEwgKQogCQkJc2VxX3ByaW50ZihtLCAiICVzIiwgeDg2X2NhcF9mbGFnc1tpXSk7CiAKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJaWYgKGMtPng4Nl9wb3dlciAmICgxIDw8IGkpKSB7CisJCQlpZiAoaSA8IEFSUkFZX1NJWkUoeDg2X3Bvd2VyX2ZsYWdzKSAmJgorCQkJICAgIHg4Nl9wb3dlcl9mbGFnc1tpXSkKKwkJCQlzZXFfcHJpbnRmKG0sICIlcyVzIiwKKwkJCQkJICAgeDg2X3Bvd2VyX2ZsYWdzW2ldWzBdPyIgIjoiIiwKKwkJCQkJICAgeDg2X3Bvd2VyX2ZsYWdzW2ldKTsKKwkJCWVsc2UKKwkJCQlzZXFfcHJpbnRmKG0sICIgWyVkXSIsIGkpOworCQl9CisKIAlzZXFfcHJpbnRmKG0sICJcbmJvZ29taXBzXHQ6ICVsdS4lMDJsdVxuXG4iLAogCQkgICAgIGMtPmxvb3BzX3Blcl9qaWZmeS8oNTAwMDAwL0haKSwKIAkJICAgICAoYy0+bG9vcHNfcGVyX2ppZmZ5Lyg1MDAwL0haKSkgJSAxMDApOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcmFzaC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcmFzaC5jCmluZGV4IDAyNDhlMDguLmQ0OWRiZTggMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3Jhc2guYworKysgYi9hcmNoL2kzODYva2VybmVsL2NyYXNoLmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxtYWNoX2lwaS5oPgogCiAKLW5vdGVfYnVmX3QgY3Jhc2hfbm90ZXNbTlJfQ1BVU107CiAvKiBUaGlzIGtlZXBzIGEgdHJhY2sgb2Ygd2hpY2ggb25lIGlzIGNyYXNoaW5nIGNwdS4gKi8KIHN0YXRpYyBpbnQgY3Jhc2hpbmdfY3B1OwogCkBAIC03Miw3ICs3MSw5IEBACiAJICogc3F1aXJyZWxsZWQgYXdheS4gIEVMRiBub3RlcyBoYXBwZW4gdG8gcHJvdmlkZQogCSAqIGFsbCBvZiB0aGF0IHRoYXQgbm8gbmVlZCB0byBpbnZlbnQgc29tZXRoaW5nIG5ldy4KIAkgKi8KLQlidWYgPSAmY3Jhc2hfbm90ZXNbY3B1XVswXTsKKwlidWYgPSAodTMyKilwZXJfY3B1X3B0cihjcmFzaF9ub3RlcywgY3B1KTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOwogCW1lbXNldCgmcHJzdGF0dXMsIDAsIHNpemVvZihwcnN0YXR1cykpOwogCXByc3RhdHVzLnByX3BpZCA9IGN1cnJlbnQtPnBpZDsKIAllbGZfY29yZV9jb3B5X3JlZ3MoJnByc3RhdHVzLnByX3JlZywgcmVncyk7CkBAIC04MSw1MSArODIsMTIgQEAKIAlmaW5hbF9ub3RlKGJ1Zik7CiB9CiAKLXN0YXRpYyB2b2lkIGNyYXNoX2dldF9jdXJyZW50X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBjcmFzaF9zYXZlX3NlbGYoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJSVlYngsJTAiIDogIj1tIihyZWdzLT5lYngpKTsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92bCAlJWVjeCwlMCIgOiAiPW0iKHJlZ3MtPmVjeCkpOwotCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUlZWR4LCUwIiA6ICI9bSIocmVncy0+ZWR4KSk7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJSVlc2ksJTAiIDogIj1tIihyZWdzLT5lc2kpKTsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92bCAlJWVkaSwlMCIgOiAiPW0iKHJlZ3MtPmVkaSkpOwotCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUlZWJwLCUwIiA6ICI9bSIocmVncy0+ZWJwKSk7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJSVlYXgsJTAiIDogIj1tIihyZWdzLT5lYXgpKTsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92bCAlJWVzcCwlMCIgOiAiPW0iKHJlZ3MtPmVzcCkpOwotCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3Z3ICUlc3MsICUlYXg7IiA6Ij1hIihyZWdzLT54c3MpKTsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92dyAlJWNzLCAlJWF4OyIgOiI9YSIocmVncy0+eGNzKSk7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdncgJSVkcywgJSVheDsiIDoiPWEiKHJlZ3MtPnhkcykpOwotCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3Z3ICUlZXMsICUlYXg7IiA6Ij1hIihyZWdzLT54ZXMpKTsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygicHVzaGZsOyBwb3BsICUwIiA6Ij1tIihyZWdzLT5lZmxhZ3MpKTsKLQotCXJlZ3MtPmVpcCA9ICh1bnNpZ25lZCBsb25nKWN1cnJlbnRfdGV4dF9hZGRyKCk7Ci19Ci0KLS8qIENQVSBkb2VzIG5vdCBzYXZlIHNzIGFuZCBlc3Agb24gc3RhY2sgaWYgZXhlY3V0aW9uIGlzIGFscmVhZHkKLSAqIHJ1bm5pbmcgaW4ga2VybmVsIG1vZGUgYXQgdGhlIHRpbWUgb2YgTk1JIG9jY3VycmVuY2UuIFRoaXMgY29kZQotICogZml4ZXMgaXQuCi0gKi8KLXN0YXRpYyB2b2lkIGNyYXNoX3NldHVwX3JlZ3Moc3RydWN0IHB0X3JlZ3MgKm5ld3JlZ3MsIHN0cnVjdCBwdF9yZWdzICpvbGRyZWdzKQotewotCW1lbWNweShuZXdyZWdzLCBvbGRyZWdzLCBzaXplb2YoKm5ld3JlZ3MpKTsKLQluZXdyZWdzLT5lc3AgPSAodW5zaWduZWQgbG9uZykmKG9sZHJlZ3MtPmVzcCk7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oInhvcmwgJWVheCwgJWVheDsiKTsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdncgJSVzcywgJSVheDsiIDoiPWEiKG5ld3JlZ3MtPnhzcykpOwotfQotCi0vKiBXZSBtYXkgaGF2ZSBzYXZlZF9yZWdzIGZyb20gd2hlcmUgdGhlIGVycm9yIGNhbWUgZnJvbQotICogb3IgaXQgaXMgTlVMTCBpZiB2aWEgYSBkaXJlY3QgcGFuaWMoKS4KLSAqLwotc3RhdGljIHZvaWQgY3Jhc2hfc2F2ZV9zZWxmKHN0cnVjdCBwdF9yZWdzICpzYXZlZF9yZWdzKQotewotCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CiAJaW50IGNwdTsKIAogCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlpZiAoc2F2ZWRfcmVncykKLQkJY3Jhc2hfc2V0dXBfcmVncygmcmVncywgc2F2ZWRfcmVncyk7Ci0JZWxzZQotCQljcmFzaF9nZXRfY3VycmVudF9yZWdzKCZyZWdzKTsKLQljcmFzaF9zYXZlX3RoaXNfY3B1KCZyZWdzLCBjcHUpOworCWNyYXNoX3NhdmVfdGhpc19jcHUocmVncywgY3B1KTsKIH0KIAogI2lmZGVmIENPTkZJR19TTVAKQEAgLTE0NCw3ICsxMDYsNyBAQAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAKIAlpZiAoIXVzZXJfbW9kZShyZWdzKSkgewotCQljcmFzaF9zZXR1cF9yZWdzKCZmaXhlZF9yZWdzLCByZWdzKTsKKwkJY3Jhc2hfZml4dXBfc3NfZXNwKCZmaXhlZF9yZWdzLCByZWdzKTsKIAkJcmVncyA9ICZmaXhlZF9yZWdzOwogCX0KIAljcmFzaF9zYXZlX3RoaXNfY3B1KHJlZ3MsIGNwdSk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NyYXNoX2R1bXAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3Jhc2hfZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNTMyZGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NyYXNoX2R1bXAuYwpAQCAtMCwwICsxLDc0IEBACisvKgorICoJa2VybmVsL2NyYXNoX2R1bXAuYyAtIE1lbW9yeSBwcmVzZXJ2aW5nIHJlYm9vdCByZWxhdGVkIGNvZGUuCisgKgorICoJQ3JlYXRlZCBieTogSGFyaXByYXNhZCBOZWxsaXRoZWVydGhhIChoYXJpQGluLmlibS5jb20pCisgKglDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNC4gQWxsIHJpZ2h0cyByZXNlcnZlZAorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jcmFzaF9kdW1wLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgdm9pZCAqa2R1bXBfYnVmX3BhZ2U7CisKKy8qKgorICogY29weV9vbGRtZW1fcGFnZSAtIGNvcHkgb25lIHBhZ2UgZnJvbSAib2xkbWVtIgorICogQHBmbjogcGFnZSBmcmFtZSBudW1iZXIgdG8gYmUgY29waWVkCisgKiBAYnVmOiB0YXJnZXQgbWVtb3J5IGFkZHJlc3MgZm9yIHRoZSBjb3B5OyB0aGlzIGNhbiBiZSBpbiBrZXJuZWwgYWRkcmVzcworICoJc3BhY2Ugb3IgdXNlciBhZGRyZXNzIHNwYWNlIChzZWUgQHVzZXJidWYpCisgKiBAY3NpemU6IG51bWJlciBvZiBieXRlcyB0byBjb3B5CisgKiBAb2Zmc2V0OiBvZmZzZXQgaW4gYnl0ZXMgaW50byB0aGUgcGFnZSAoYmFzZWQgb24gcGZuKSB0byBiZWdpbiB0aGUgY29weQorICogQHVzZXJidWY6IGlmIHNldCwgQGJ1ZiBpcyBpbiB1c2VyIGFkZHJlc3Mgc3BhY2UsIHVzZSBjb3B5X3RvX3VzZXIoKSwKKyAqCW90aGVyd2lzZSBAYnVmIGlzIGluIGtlcm5lbCBhZGRyZXNzIHNwYWNlLCB1c2UgbWVtY3B5KCkuCisgKgorICogQ29weSBhIHBhZ2UgZnJvbSAib2xkbWVtIi4gRm9yIHRoaXMgcGFnZSwgdGhlcmUgaXMgbm8gcHRlIG1hcHBlZAorICogaW4gdGhlIGN1cnJlbnQga2VybmVsLiBXZSBzdGl0Y2ggdXAgYSBwdGUsIHNpbWlsYXIgdG8ga21hcF9hdG9taWMuCisgKgorICogQ2FsbGluZyBjb3B5X3RvX3VzZXIoKSBpbiBhdG9taWMgY29udGV4dCBpcyBub3QgZGVzaXJhYmxlLiBIZW5jZSBmaXJzdAorICogY29weWluZyB0aGUgZGF0YSB0byBhIHByZS1hbGxvY2F0ZWQga2VybmVsIHBhZ2UgYW5kIHRoZW4gY29weWluZyB0byB1c2VyCisgKiBzcGFjZSBpbiBub24tYXRvbWljIGNvbnRleHQuCisgKi8KK3NzaXplX3QgY29weV9vbGRtZW1fcGFnZSh1bnNpZ25lZCBsb25nIHBmbiwgY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjc2l6ZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCB1c2VyYnVmKQoreworCXZvaWQgICp2YWRkcjsKKworCWlmICghY3NpemUpCisJCXJldHVybiAwOworCisJdmFkZHIgPSBrbWFwX2F0b21pY19wZm4ocGZuLCBLTV9QVEUwKTsKKworCWlmICghdXNlcmJ1ZikgeworCQltZW1jcHkoYnVmLCAodmFkZHIgKyBvZmZzZXQpLCBjc2l6ZSk7CisJCWt1bm1hcF9hdG9taWModmFkZHIsIEtNX1BURTApOworCX0gZWxzZSB7CisJCWlmICgha2R1bXBfYnVmX3BhZ2UpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIktkdW1wOiBLZHVtcCBidWZmZXIgcGFnZSBub3QiCisJCQkJIiBhbGxvY2F0ZWRcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJY29weV9wYWdlKGtkdW1wX2J1Zl9wYWdlLCB2YWRkcik7CisJCWt1bm1hcF9hdG9taWModmFkZHIsIEtNX1BURTApOworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgKGtkdW1wX2J1Zl9wYWdlICsgb2Zmc2V0KSwgY3NpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIGNzaXplOworfQorCitzdGF0aWMgaW50IF9faW5pdCBrZHVtcF9idWZfcGFnZV9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlrZHVtcF9idWZfcGFnZSA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtkdW1wX2J1Zl9wYWdlKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIktkdW1wOiBGYWlsZWQgdG8gYWxsb2NhdGUga2R1bXAgYnVmZmVyIgorCQkJICIgcGFnZVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJfQorCisJcmV0dXJuIHJldDsKK30KK2FyY2hfaW5pdGNhbGwoa2R1bXBfYnVmX3BhZ2VfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2RtaV9zY2FuLmMgYi9hcmNoL2kzODYva2VybmVsL2RtaV9zY2FuLmMKaW5kZXggNTg1MTZlMi4uNmE5M2Q3NSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9kbWlfc2Nhbi5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvZG1pX3NjYW4uYwpAQCAtNCw3ICs0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKIHN0YXRpYyBjaGFyICogX19pbml0IGRtaV9zdHJpbmcoc3RydWN0IGRtaV9oZWFkZXIgKmRtLCB1OCBzKQogewpAQCAtMTksNyArMTksNyBAQAogCQl9CiAKIAkJaWYgKCpicCAhPSAwKSB7Ci0JCQlzdHIgPSBhbGxvY19ib290bWVtKHN0cmxlbihicCkgKyAxKTsKKwkJCXN0ciA9IGRtaV9hbGxvYyhzdHJsZW4oYnApICsgMSk7CiAJCQlpZiAoc3RyICE9IE5VTEwpCiAJCQkJc3RyY3B5KHN0ciwgYnApOwogCQkJZWxzZQpAQCAtNDAsNyArNDAsNyBAQAogCXU4ICpidWYsICpkYXRhOwogCWludCBpID0gMDsKIAkJCi0JYnVmID0gYnRfaW9yZW1hcChiYXNlLCBsZW4pOworCWJ1ZiA9IGRtaV9pb3JlbWFwKGJhc2UsIGxlbik7CiAJaWYgKGJ1ZiA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CiAKQEAgLTY1LDcgKzY1LDcgQEAKIAkJZGF0YSArPSAyOwogCQlpKys7CiAJfQotCWJ0X2lvdW5tYXAoYnVmLCBsZW4pOworCWRtaV9pb3VubWFwKGJ1ZiwgbGVuKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTEyLDcgKzExMiw3IEBACiAJCWlmICgoKmQgJiAweDgwKSA9PSAwKQogCQkJY29udGludWU7CiAKLQkJZGV2ID0gYWxsb2NfYm9vdG1lbShzaXplb2YoKmRldikpOworCQlkZXYgPSBkbWlfYWxsb2Moc2l6ZW9mKCpkZXYpKTsKIAkJaWYgKCFkZXYpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiZG1pX3NhdmVfZGV2aWNlczogb3V0IG9mIG1lbW9yeS5cbiIpOwogCQkJYnJlYWs7CkBAIC0xMzEsNyArMTMxLDcgQEAKIAlzdHJ1Y3QgZG1pX2RldmljZSAqZGV2OwogCXZvaWQgKiBkYXRhOwogCi0JZGF0YSA9IGFsbG9jX2Jvb3RtZW0oZG0tPmxlbmd0aCk7CisJZGF0YSA9IGRtaV9hbGxvYyhkbS0+bGVuZ3RoKTsKIAlpZiAoZGF0YSA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZG1pX3NhdmVfaXBtaV9kZXZpY2U6IG91dCBvZiBtZW1vcnkuXG4iKTsKIAkJcmV0dXJuOwpAQCAtMTM5LDcgKzEzOSw3IEBACiAKIAltZW1jcHkoZGF0YSwgZG0sIGRtLT5sZW5ndGgpOwogCi0JZGV2ID0gYWxsb2NfYm9vdG1lbShzaXplb2YoKmRldikpOworCWRldiA9IGRtaV9hbGxvYyhzaXplb2YoKmRldikpOwogCWlmICghZGV2KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZG1pX3NhdmVfaXBtaV9kZXZpY2U6IG91dCBvZiBtZW1vcnkuXG4iKTsKIAkJcmV0dXJuOwpAQCAtMjIxLDcgKzIyMSw3IEBACiAJCX0KIAl9CiAKLW91dDoJcHJpbnRrKEtFUk5fSU5GTyAiRE1JIG5vdCBwcmVzZW50LlxuIik7CitvdXQ6CXByaW50ayhLRVJOX0lORk8gIkRNSSBub3QgcHJlc2VudCBvciBpbnZhbGlkLlxuIik7CiB9CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9pMzg2L2tlcm5lbC9lbnRyeS5TCmluZGV4IDYwN2MwNjAuLjRkNzA0NzIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL2kzODYva2VybmVsL2VudHJ5LlMKQEAgLTMyMyw2ICszMjMsNyBAQAogCiAJQUxJR04KIHdvcmtfbm90aWZ5c2lnX3Y4NjoKKyNpZmRlZiBDT05GSUdfVk04NgogCXB1c2hsICVlY3gJCQkjIHNhdmUgdGlfZmxhZ3MgZm9yIGRvX25vdGlmeV9yZXN1bWUKIAljYWxsIHNhdmVfdjg2X3N0YXRlCQkjICVlYXggY29udGFpbnMgcHRfcmVncyBwb2ludGVyCiAJcG9wbCAlZWN4CkBAIC0zMzAsNiArMzMxLDcgQEAKIAl4b3JsICVlZHgsICVlZHgKIAljYWxsIGRvX25vdGlmeV9yZXN1bWUKIAlqbXAgcmVzdW1lX3VzZXJzcGFjZQorI2VuZGlmCiAKIAkjIHBlcmZvcm0gc3lzY2FsbCBleGl0IHRyYWNpbmcKIAlBTElHTgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pbml0X3Rhc2suYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW5pdF90YXNrLmMKaW5kZXggOWNhYThlOC4uY2ZmOTVkMSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pbml0X3Rhc2suYworKysgYi9hcmNoL2kzODYva2VybmVsL2luaXRfdGFzay5jCkBAIC00Miw1ICs0Miw1IEBACiAgKiBwZXItQ1BVIFRTUyBzZWdtZW50cy4gVGhyZWFkcyBhcmUgY29tcGxldGVseSAnc29mdCcgb24gTGludXgsCiAgKiBubyBtb3JlIHBlci10YXNrIFRTUydzLgogICovIAotREVGSU5FX1BFUl9DUFUoc3RydWN0IHRzc19zdHJ1Y3QsIGluaXRfdHNzKSBfX19fY2FjaGVsaW5lX21heGFsaWduZWRfaW5fc21wID0gSU5JVF9UU1M7CitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdHNzX3N0cnVjdCwgaW5pdF90c3MpIF9fX19jYWNoZWxpbmVfaW50ZXJub2RlYWxpZ25lZF9pbl9zbXAgPSBJTklUX1RTUzsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMgYi9hcmNoL2kzODYva2VybmVsL2lvX2FwaWMuYwppbmRleCA3NTU0ZjhmLi5mMmRkMjE4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2lvX2FwaWMuYworKysgYi9hcmNoL2kzODYva2VybmVsL2lvX2FwaWMuYwpAQCAtMTY0OSw3ICsxNjQ5LDcgQEAKIAlmb3IoYXBpYyA9IDA7IGFwaWMgPCBucl9pb2FwaWNzOyBhcGljKyspIHsKIAkJaW50IHBpbjsKIAkJLyogU2VlIGlmIGFueSBvZiB0aGUgcGlucyBpcyBpbiBFeHRJTlQgbW9kZSAqLwotCQlmb3IocGluID0gMDsgcGluIDwgbnJfaW9hcGljX3JlZ2lzdGVyc1tpXTsgcGluKyspIHsKKwkJZm9yIChwaW4gPSAwOyBwaW4gPCBucl9pb2FwaWNfcmVnaXN0ZXJzW2FwaWNdOyBwaW4rKykgewogCQkJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKIAkJCSooKChpbnQgKikmZW50cnkpICsgMCkgPSBpb19hcGljX3JlYWQoYXBpYywgMHgxMCArIDIgKiBwaW4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pb3BvcnQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW9wb3J0LmMKaW5kZXggYjU5YTM0ZC4uNzkwMjZmMCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pb3BvcnQuYworKysgYi9hcmNoL2kzODYva2VybmVsL2lvcG9ydC5jCkBAIC03LDYgKzcsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pcnEuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaXJxLmMKaW5kZXggMWEyMDFhOTMuLmYzYTljNzggMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pcnEuYwpAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKLURFRklORV9QRVJfQ1BVKGlycV9jcHVzdGF0X3QsIGlycV9zdGF0KSBfX19fY2FjaGVsaW5lX21heGFsaWduZWRfaW5fc21wOworREVGSU5FX1BFUl9DUFUoaXJxX2NwdXN0YXRfdCwgaXJxX3N0YXQpIF9fX19jYWNoZWxpbmVfaW50ZXJub2RlYWxpZ25lZF9pbl9zbXA7CiBFWFBPUlRfUEVSX0NQVV9TWU1CT0woaXJxX3N0YXQpOwogCiAjaWZuZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL2kzODYva2VybmVsL2twcm9iZXMuYwppbmRleCAxOWVkY2Q1Li42NDgzZWViIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL2kzODYva2VybmVsL2twcm9iZXMuYwpAQCAtNTgsMTMgKzU4LDkgQEAKIAogaW50IF9fa3Byb2JlcyBhcmNoX3ByZXBhcmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgX19rcHJvYmVzIGFyY2hfY29weV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKLXsKIAltZW1jcHkocC0+YWluc24uaW5zbiwgcC0+YWRkciwgTUFYX0lOU05fU0laRSAqIHNpemVvZihrcHJvYmVfb3Bjb2RlX3QpKTsKIAlwLT5vcGNvZGUgPSAqcC0+YWRkcjsKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCBfX2twcm9iZXMgYXJjaF9hcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCkBAIC04MSwxMCArNzcsNiBAQAogCQkJICAgKHVuc2lnbmVkIGxvbmcpIHAtPmFkZHIgKyBzaXplb2Yoa3Byb2JlX29wY29kZV90KSk7CiB9CiAKLXZvaWQgX19rcHJvYmVzIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQotewotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9wcmV2aW91c19rcHJvYmUoc3RydWN0IGtwcm9iZV9jdGxibGsgKmtjYikKIHsKIAlrY2ItPnByZXZfa3Byb2JlLmtwID0ga3Byb2JlX3J1bm5pbmcoKTsKQEAgLTE5Niw2ICsxODgsMTkgQEAKIAkJCWtjYi0+a3Byb2JlX3N0YXR1cyA9IEtQUk9CRV9SRUVOVEVSOwogCQkJcmV0dXJuIDE7CiAJCX0gZWxzZSB7CisJCQlpZiAocmVncy0+ZWZsYWdzICYgVk1fTUFTSykgeworCQkJLyogV2UgYXJlIGluIHZpcnR1YWwtODA4NiBtb2RlLiBSZXR1cm4gMCAqLworCQkJCWdvdG8gbm9fa3Byb2JlOworCQkJfQorCQkJaWYgKCphZGRyICE9IEJSRUFLUE9JTlRfSU5TVFJVQ1RJT04pIHsKKwkJCS8qIFRoZSBicmVha3BvaW50IGluc3RydWN0aW9uIHdhcyByZW1vdmVkIGJ5CisJCQkgKiBhbm90aGVyIGNwdSByaWdodCBhZnRlciB3ZSBoaXQsIG5vIGZ1cnRoZXIKKwkJCSAqIGhhbmRsaW5nIG9mIHRoaXMgaW50ZXJydXB0IGlzIGFwcHJvcHJpYXRlCisJCQkgKi8KKwkJCQlyZWdzLT5laXAgLT0gc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCk7CisJCQkJcmV0ID0gMTsKKwkJCQlnb3RvIG5vX2twcm9iZTsKKwkJCX0KIAkJCXAgPSBfX2dldF9jcHVfdmFyKGN1cnJlbnRfa3Byb2JlKTsKIAkJCWlmIChwLT5icmVha19oYW5kbGVyICYmIHAtPmJyZWFrX2hhbmRsZXIocCwgcmVncykpIHsKIAkJCQlnb3RvIHNzX3Byb2JlOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9taWNyb2NvZGUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbWljcm9jb2RlLmMKaW5kZXggMTY1ZjEzMS4uZDNmZGYwMCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9taWNyb2NvZGUuYworKysgYi9hcmNoL2kzODYva2VybmVsL21pY3JvY29kZS5jCkBAIC03MCw2ICs3MCw3IEBACiAgKi8KIAogLy8jZGVmaW5lIERFQlVHIC8qIHByX2RlYnVnICovCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpAQCAtMTY1LDcgKzE2Niw3IEBACiAKIAl3cm1zcihNU1JfSUEzMl9VQ09ERV9SRVYsIDAsIDApOwogCS8qIHNlZSBub3RlcyBhYm92ZSBmb3IgcmV2aXNpb24gMS4wNy4gIEFwcGFyZW50IGNoaXAgYnVnICovCi0Jc2VyaWFsaXplX2NwdSgpOworCXN5bmNfY29yZSgpOwogCS8qIGdldCB0aGUgY3VycmVudCByZXZpc2lvbiBmcm9tIE1TUiAweDhCICovCiAJcmRtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCB2YWxbMF0sIHVjaS0+cmV2KTsKIAlwcl9kZWJ1ZygibWljcm9jb2RlOiBjb2xsZWN0X2NwdV9pbmZvIDogc2lnPTB4JXgsIHBmPTB4JXgsIHJldj0weCV4XG4iLApAQCAtMzc5LDcgKzM4MCw3IEBACiAJd3Jtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCAwLCAwKTsKIAogCS8qIHNlZSBub3RlcyBhYm92ZSBmb3IgcmV2aXNpb24gMS4wNy4gIEFwcGFyZW50IGNoaXAgYnVnICovCi0Jc2VyaWFsaXplX2NwdSgpOworCXN5bmNfY29yZSgpOwogCiAJLyogZ2V0IHRoZSBjdXJyZW50IHJldmlzaW9uIGZyb20gTVNSIDB4OEIgKi8KIAlyZG1zcihNU1JfSUEzMl9VQ09ERV9SRVYsIHZhbFswXSwgdmFsWzFdKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbXBwYXJzZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9tcHBhcnNlLmMKaW5kZXggOTFhNjQwMS4uMDEwMmYzZCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9tcHBhcnNlLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9tcHBhcnNlLmMKQEAgLTEwODAsNyArMTA4MCw3IEBACiAKICNkZWZpbmUgTUFYX0dTSV9OVU0JNDA5NgogCi1pbnQgbXBfcmVnaXN0ZXJfZ3NpICh1MzIgZ3NpLCBpbnQgZWRnZV9sZXZlbCwgaW50IGFjdGl2ZV9oaWdoX2xvdykKK2ludCBtcF9yZWdpc3Rlcl9nc2kgKHUzMiBnc2ksIGludCB0cmlnZ2VyaW5nLCBpbnQgcG9sYXJpdHkpCiB7CiAJaW50CQkJaW9hcGljID0gLTE7CiAJaW50CQkJaW9hcGljX3BpbiA9IDA7CkBAIC0xMTI5LDcgKzExMjksNyBAQAogCiAJbXBfaW9hcGljX3JvdXRpbmdbaW9hcGljXS5waW5fcHJvZ3JhbW1lZFtpZHhdIHw9ICgxPDxiaXQpOwogCi0JaWYgKGVkZ2VfbGV2ZWwpIHsKKwlpZiAodHJpZ2dlcmluZyA9PSBBQ1BJX0xFVkVMX1NFTlNJVElWRSkgewogCQkvKgogCQkgKiBGb3IgUENJIGRldmljZXMgYXNzaWduIElSUXMgaW4gb3JkZXIsIGF2b2lkaW5nIGdhcHMKIAkJICogZHVlIHRvIHVudXNlZCBJL08gQVBJQyBwaW5zLgpAQCAtMTE1MSw4ICsxMTUxLDggQEAKIAl9CiAKIAlpb19hcGljX3NldF9wY2lfcm91dGluZyhpb2FwaWMsIGlvYXBpY19waW4sIGdzaSwKLQkJICAgIGVkZ2VfbGV2ZWwgPT0gQUNQSV9FREdFX1NFTlNJVElWRSA/IDAgOiAxLAotCQkgICAgYWN0aXZlX2hpZ2hfbG93ID09IEFDUElfQUNUSVZFX0hJR0ggPyAwIDogMSk7CisJCSAgICB0cmlnZ2VyaW5nID09IEFDUElfRURHRV9TRU5TSVRJVkUgPyAwIDogMSwKKwkJICAgIHBvbGFyaXR5ID09IEFDUElfQUNUSVZFX0hJR0ggPyAwIDogMSk7CiAJcmV0dXJuIGdzaTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYwppbmRleCA0NWU3ZjBhLi4yMTg1Mzc3IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYwpAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vaTM4Ny5oPgogI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSA8YXNtL3ZtODYuaD4KICNpZmRlZiBDT05GSUdfTUFUSF9FTVVMQVRJT04KICNpbmNsdWRlIDxhc20vbWF0aF9lbXUuaD4KICNlbmRpZgpAQCAtNDIzLDE4ICs0MjQsNyBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCWludCBlcnI7CiAKLQljaGlsZHJlZ3MgPSAoKHN0cnVjdCBwdF9yZWdzICopIChUSFJFQURfU0laRSArICh1bnNpZ25lZCBsb25nKSBwLT50aHJlYWRfaW5mbykpIC0gMTsKLQkvKgotCSAqIFRoZSBiZWxvdyAtOCBpcyB0byByZXNlcnZlIDggYnl0ZXMgb24gdG9wIG9mIHRoZSByaW5nMCBzdGFjay4KLQkgKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBndWFyYW50ZWUgdGhhdCB0aGUgZW50aXJlICJzdHJ1Y3QgcHRfcmVncyIKLQkgKiBpcyBhY2Nlc3NhYmxlIGV2ZW4gaWYgdGhlIENQVSBoYXZlbid0IHN0b3JlZCB0aGUgU1MvRVNQIHJlZ2lzdGVycwotCSAqIG9uIHRoZSBzdGFjayAoaW50ZXJydXB0IGdhdGUgZG9lcyBub3Qgc2F2ZSB0aGVzZSByZWdpc3RlcnMKLQkgKiB3aGVuIHN3aXRjaGluZyB0byB0aGUgc2FtZSBwcml2IHJpbmcpLgotCSAqIFRoZXJlZm9yZSBiZXdhcmU6IGFjY2Vzc2luZyB0aGUgeHNzL2VzcCBmaWVsZHMgb2YgdGhlCi0JICogInN0cnVjdCBwdF9yZWdzIiBpcyBwb3NzaWJsZSwgYnV0IHRoZXkgbWF5IGNvbnRhaW4gdGhlCi0JICogY29tcGxldGVseSB3cm9uZyB2YWx1ZXMuCi0JICovCi0JY2hpbGRyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopICgodW5zaWduZWQgbG9uZykgY2hpbGRyZWdzIC0gOCk7CisJY2hpbGRyZWdzID0gdGFza19wdF9yZWdzKHApOwogCSpjaGlsZHJlZ3MgPSAqcmVnczsKIAljaGlsZHJlZ3MtPmVheCA9IDA7CiAJY2hpbGRyZWdzLT5lc3AgPSBlc3A7CkBAIC01MzksMTIgKzUyOSw3IEBACiAgKi8KIGludCBkdW1wX3Rhc2tfcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgZWxmX2dyZWdzZXRfdCAqcmVncykKIHsKLQlzdHJ1Y3QgcHRfcmVncyBwdHJlZ3M7Ci0JCi0JcHRyZWdzID0gKihzdHJ1Y3QgcHRfcmVncyAqKQotCQkoKHVuc2lnbmVkIGxvbmcpdHNrLT50aHJlYWRfaW5mbyArCi0JCS8qIHNlZSBjb21tZW50cyBpbiBjb3B5X3RocmVhZCgpIGFib3V0IC04ICovCi0JCVRIUkVBRF9TSVpFIC0gc2l6ZW9mKHB0cmVncykgLSA4KTsKKwlzdHJ1Y3QgcHRfcmVncyBwdHJlZ3MgPSAqdGFza19wdF9yZWdzKHRzayk7CiAJcHRyZWdzLnhjcyAmPSAweGZmZmY7CiAJcHRyZWdzLnhkcyAmPSAweGZmZmY7CiAJcHRyZWdzLnhlcyAmPSAweGZmZmY7CkBAIC02MDAsOCArNTg1LDggQEAKIAkgKiBnY2Mgc2hvdWxkIGVsaW1pbmF0ZSB0aGUgLT50aHJlYWRfaW5mbyBkZXJlZmVyZW5jZSBpZgogCSAqIGhhc19zZWN1cmVfY29tcHV0aW5nIHJldHVybnMgMCBhdCBjb21waWxlIHRpbWUgKFNFQ0NPTVA9bikuCiAJICovCi0JcHJldiA9IHByZXZfcC0+dGhyZWFkX2luZm87Ci0JbmV4dCA9IG5leHRfcC0+dGhyZWFkX2luZm87CisJcHJldiA9IHRhc2tfdGhyZWFkX2luZm8ocHJldl9wKTsKKwluZXh0ID0gdGFza190aHJlYWRfaW5mbyhuZXh0X3ApOwogCiAJaWYgKGhhc19zZWN1cmVfY29tcHV0aW5nKHByZXYpIHx8IGhhc19zZWN1cmVfY29tcHV0aW5nKG5leHQpKSB7CiAJCS8qIHNsb3cgcGF0aCBoZXJlICovCkBAIC03ODYsNyArNzcxLDcgQEAKIAlpbnQgY291bnQgPSAwOwogCWlmICghcCB8fCBwID09IGN1cnJlbnQgfHwgcC0+c3RhdGUgPT0gVEFTS19SVU5OSU5HKQogCQlyZXR1cm4gMDsKLQlzdGFja19wYWdlID0gKHVuc2lnbmVkIGxvbmcpcC0+dGhyZWFkX2luZm87CisJc3RhY2tfcGFnZSA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShwKTsKIAllc3AgPSBwLT50aHJlYWQuZXNwOwogCWlmICghc3RhY2tfcGFnZSB8fCBlc3AgPCBzdGFja19wYWdlIHx8IGVzcCA+IHRvcF9lc3Arc3RhY2tfcGFnZSkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3F1aXJrcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9xdWlya3MuYwppbmRleCBhYWY4OWNiLi44N2NjZGFjIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3F1aXJrcy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvcXVpcmtzLmMKQEAgLTI1LDggKzI1LDcgQEAKIAogCS8qIGVuYWJsZSBhY2Nlc3MgdG8gY29uZmlnIHNwYWNlKi8KIAlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4ZjQsICZjb25maWcpOwotCWNvbmZpZyB8PSAweDI7Ci0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHhmNCwgY29uZmlnKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweGY0LCBjb25maWd8MHgyKTsKIAogCS8qIHJlYWQgeFRQUiByZWdpc3RlciAqLwogCXJhd19wY2lfb3BzLT5yZWFkKDAsIDAsIDB4NDAsIDB4NGMsIDIsICZ3b3JkKTsKQEAgLTQyLDkgKzQxLDkgQEAKICNlbmRpZgogCX0KIAotCWNvbmZpZyAmPSB+MHgyOwotCS8qIGRpc2FibGUgYWNjZXNzIHRvIGNvbmZpZyBzcGFjZSovCi0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHhmNCwgY29uZmlnKTsKKwkvKiBwdXQgYmFjayB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIGNvbmZpZyBzcGFjZSovCisJaWYgKCEoY29uZmlnICYgMHgyKSkKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHhmNCwgY29uZmlnKTsKIH0KIERFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfRTczMjBfTUNILAlxdWlya19pbnRlbF9pcnFiYWxhbmNlKTsKIERFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfRTc1MjVfTUNILAlxdWlya19pbnRlbF9pcnFiYWxhbmNlKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvcmVib290LmMgYi9hcmNoL2kzODYva2VybmVsL3JlYm9vdC5jCmluZGV4IDJmYTU4MDMuLmQyMDcyNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvcmVib290LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9yZWJvb3QuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CiAjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KQEAgLTM1NSwxMCArMzU2LDEwIEBACiAKIHZvaWQgbWFjaGluZV9wb3dlcl9vZmYodm9pZCkKIHsKLQltYWNoaW5lX3NodXRkb3duKCk7Ci0KLQlpZiAocG1fcG93ZXJfb2ZmKQorCWlmIChwbV9wb3dlcl9vZmYpIHsKKwkJbWFjaGluZV9zaHV0ZG93bigpOwogCQlwbV9wb3dlcl9vZmYoKTsKKwl9CiB9CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zY3gyMDAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2N4MjAwLmMKaW5kZXggOWM5NjhhZS4uMzIxZjVmZCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zY3gyMDAuYworKysgYi9hcmNoL2kzODYva2VybmVsL3NjeDIwMC5jCkBAIC0xNDMsNyArMTQzLDcgQEAKIHsKIAlwcmludGsoS0VSTl9JTkZPIE5BTUUgIjogTmF0U2VtaSBTQ3gyMDAgRHJpdmVyXG4iKTsKIAotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnNjeDIwMF9wY2lfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmc2N4MjAwX3BjaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc2N4MjAwX2NsZWFudXAodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYwppbmRleCAyN2M5NTZkLi41MWU1MTNiIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zZXR1cC5jCkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KICNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYXNoX2R1bXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KIAogI2luY2x1ZGUgPHZpZGVvL2VkaWQuaD4KIApAQCAtMTQ2LDcgKzE0Nyw2IEBACiBzdHJ1Y3QgZTgyMG1hcCBlODIwOwogCiBleHRlcm4gdm9pZCBlYXJseV9jcHVfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIGRtaV9zY2FuX21hY2hpbmUodm9pZCk7CiBleHRlcm4gdm9pZCBnZW5lcmljX2FwaWNfcHJvYmUoY2hhciAqKTsKIGV4dGVybiBpbnQgcm9vdF9tb3VudGZsYWdzOwogCkBAIC04OTgsNyArODk4LDcgQEAKIAkJCX0KIAkJfQogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKKyNpZmRlZiBDT05GSUdfUFJPQ19WTUNPUkUKIAkJLyogZWxmY29yZWhkcj0gc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiBlbGYgY29yZSBoZWFkZXIKIAkJICogc3RvcmVkIGJ5IHRoZSBjcmFzaGVkIGtlcm5lbC4KIAkJICovCkBAIC0xNTg0LDcgKzE1ODQsNyBAQAogCQlpZiAocykgewogCQkJZXh0ZXJuIHZvaWQgc2V0dXBfZWFybHlfcHJpbnRrKGNoYXIgKik7CiAKLQkJCXNldHVwX2Vhcmx5X3ByaW50ayhzKTsKKwkJCXNldHVwX2Vhcmx5X3ByaW50ayhzdHJjaHIocywgJz0nKSArIDEpOwogCQkJcHJpbnRrKCJlYXJseSBjb25zb2xlIGVuYWJsZWRcbiIpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2lnbmFsLmMKaW5kZXggYWRjZDA2OS4uOTYzNjE2ZCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL2kzODYva2VybmVsL3NpZ25hbC5jCkBAIC0zNyw1MSArMzcsMTcgQEAKIGFzbWxpbmthZ2UgaW50CiBzeXNfc2lnc3VzcGVuZChpbnQgaGlzdG9yeTAsIGludCBoaXN0b3J5MSwgb2xkX3NpZ3NldF90IG1hc2spCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgKiByZWdzID0gKHN0cnVjdCBwdF9yZWdzICopICZoaXN0b3J5MDsKLQlzaWdzZXRfdCBzYXZlc2V0OwotCiAJbWFzayAmPSBfQkxPQ0tBQkxFOwogCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCXNhdmVzZXQgPSBjdXJyZW50LT5ibG9ja2VkOworCWN1cnJlbnQtPnNhdmVkX3NpZ21hc2sgPSBjdXJyZW50LT5ibG9ja2VkOwogCXNpZ2luaXRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsIG1hc2spOwogCXJlY2FsY19zaWdwZW5kaW5nKCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAotCXJlZ3MtPmVheCA9IC1FSU5UUjsKLQl3aGlsZSAoMSkgewotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJc2NoZWR1bGUoKTsKLQkJaWYgKGRvX3NpZ25hbChyZWdzLCAmc2F2ZXNldCkpCi0JCQlyZXR1cm4gLUVJTlRSOwotCX0KLX0KLQotYXNtbGlua2FnZSBpbnQKLXN5c19ydF9zaWdzdXNwZW5kKHN0cnVjdCBwdF9yZWdzIHJlZ3MpCi17Ci0Jc2lnc2V0X3Qgc2F2ZXNldCwgbmV3c2V0OwotCi0JLyogWFhYOiBEb24ndCBwcmVjbHVkZSBoYW5kbGluZyBkaWZmZXJlbnQgc2l6ZWQgc2lnc2V0X3Qncy4gICovCi0JaWYgKHJlZ3MuZWN4ICE9IHNpemVvZihzaWdzZXRfdCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdzZXQsIChzaWdzZXRfdCBfX3VzZXIgKilyZWdzLmVieCwgc2l6ZW9mKG5ld3NldCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlzaWdkZWxzZXRtYXNrKCZuZXdzZXQsIH5fQkxPQ0tBQkxFKTsKLQotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCXNhdmVzZXQgPSBjdXJyZW50LT5ibG9ja2VkOwotCWN1cnJlbnQtPmJsb2NrZWQgPSBuZXdzZXQ7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCi0JcmVncy5lYXggPSAtRUlOVFI7Ci0Jd2hpbGUgKDEpIHsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlKCk7Ci0JCWlmIChkb19zaWduYWwoJnJlZ3MsICZzYXZlc2V0KSkKLQkJCXJldHVybiAtRUlOVFI7Ci0JfQorCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCXNjaGVkdWxlKCk7CisJc2V0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOworCXJldHVybiAtRVJFU1RBUlROT0hBTkQ7CiB9CiAKIGFzbWxpbmthZ2UgaW50IApAQCAtNDMzLDExICszOTksMTEgQEAKIAkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBmcmFtZSwgcmVncy0+ZWlwLCBmcmFtZS0+cHJldGNvZGUpOwogI2VuZGlmCiAKLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIAogZ2l2ZV9zaWdzZWd2OgogCWZvcmNlX3NpZ3NlZ3Yoc2lnLCBjdXJyZW50KTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVGQVVMVDsKIH0KIAogc3RhdGljIGludCBzZXR1cF9ydF9mcmFtZShpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCkBAIC01MjcsMTEgKzQ5MywxMSBAQAogCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIGZyYW1lLCByZWdzLT5laXAsIGZyYW1lLT5wcmV0Y29kZSk7CiAjZW5kaWYKIAotCXJldHVybiAxOworCXJldHVybiAwOwogCiBnaXZlX3NpZ3NlZ3Y6CiAJZm9yY2Vfc2lnc2VndihzaWcsIGN1cnJlbnQpOwotCXJldHVybiAwOworCXJldHVybiAtRUZBVUxUOwogfQogCiAvKgpAQCAtNTgxLDcgKzU0Nyw3IEBACiAJZWxzZQogCQlyZXQgPSBzZXR1cF9mcmFtZShzaWcsIGthLCBvbGRzZXQsIHJlZ3MpOwogCi0JaWYgKHJldCkgeworCWlmIChyZXQgPT0gMCkgewogCQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAkJc2lnb3JzZXRzKCZjdXJyZW50LT5ibG9ja2VkLCZjdXJyZW50LT5ibG9ja2VkLCZrYS0+c2Euc2FfbWFzayk7CiAJCWlmICghKGthLT5zYS5zYV9mbGFncyAmIFNBX05PREVGRVIpKQpAQCAtNTk4LDExICs1NjQsMTIgQEAKICAqIHdhbnQgdG8gaGFuZGxlLiBUaHVzIHlvdSBjYW5ub3Qga2lsbCBpbml0IGV2ZW4gd2l0aCBhIFNJR0tJTEwgZXZlbiBieQogICogbWlzdGFrZS4KICAqLwotaW50IGZhc3RjYWxsIGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc2lnc2V0X3QgKm9sZHNldCkKK3N0YXRpYyB2b2lkIGZhc3RjYWxsIGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzaWdpbmZvX3QgaW5mbzsKIAlpbnQgc2lnbnI7CiAJc3RydWN0IGtfc2lnYWN0aW9uIGthOworCXNpZ3NldF90ICpvbGRzZXQ7CiAKIAkvKgogCSAqIFdlIHdhbnQgdGhlIGNvbW1vbiBjYXNlIHRvIGdvIGZhc3QsIHdoaWNoCkBAIC02MTMsMTIgKzU4MCwxNCBAQAogIAkgKiBDUyBzdWZmaWNlcy4KIAkgKi8KIAlpZiAoIXVzZXJfbW9kZShyZWdzKSkKLQkJcmV0dXJuIDE7CisJCXJldHVybjsKIAogCWlmICh0cnlfdG9fZnJlZXplKCkpCiAJCWdvdG8gbm9fc2lnbmFsOwogCi0JaWYgKCFvbGRzZXQpCisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCisJCW9sZHNldCA9ICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrOworCWVsc2UKIAkJb2xkc2V0ID0gJmN1cnJlbnQtPmJsb2NrZWQ7CiAKIAlzaWduciA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJmthLCByZWdzLCBOVUxMKTsKQEAgLTYyOCwzOCArNTk3LDU1IEBACiAJCSAqIGhhdmUgYmVlbiBjbGVhcmVkIGlmIHRoZSB3YXRjaHBvaW50IHRyaWdnZXJlZAogCQkgKiBpbnNpZGUgdGhlIGtlcm5lbC4KIAkJICovCi0JCWlmICh1bmxpa2VseShjdXJyZW50LT50aHJlYWQuZGVidWdyZWdbN10pKSB7CisJCWlmICh1bmxpa2VseShjdXJyZW50LT50aHJlYWQuZGVidWdyZWdbN10pKQogCQkJc2V0X2RlYnVncmVnKGN1cnJlbnQtPnRocmVhZC5kZWJ1Z3JlZ1s3XSwgNyk7Ci0JCX0KIAogCQkvKiBXaGVlISAgQWN0dWFsbHkgZGVsaXZlciB0aGUgc2lnbmFsLiAgKi8KLQkJcmV0dXJuIGhhbmRsZV9zaWduYWwoc2lnbnIsICZpbmZvLCAma2EsIG9sZHNldCwgcmVncyk7CisJCWlmIChoYW5kbGVfc2lnbmFsKHNpZ25yLCAmaW5mbywgJmthLCBvbGRzZXQsIHJlZ3MpID09IDApIHsKKwkJCS8qIGEgc2lnbmFsIHdhcyBzdWNjZXNzZnVsbHkgZGVsaXZlcmVkOyB0aGUgc2F2ZWQKKwkJCSAqIHNpZ21hc2sgd2lsbCBoYXZlIGJlZW4gc3RvcmVkIGluIHRoZSBzaWduYWwgZnJhbWUsCisJCQkgKiBhbmQgd2lsbCBiZSByZXN0b3JlZCBieSBzaWdyZXR1cm4sIHNvIHdlIGNhbiBzaW1wbHkKKwkJCSAqIGNsZWFyIHRoZSBUSUZfUkVTVE9SRV9TSUdNQVNLIGZsYWcgKi8KKwkJCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKQorCQkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOworCQl9CisKKwkJcmV0dXJuOwogCX0KIAotIG5vX3NpZ25hbDoKK25vX3NpZ25hbDoKIAkvKiBEaWQgd2UgY29tZSBmcm9tIGEgc3lzdGVtIGNhbGw/ICovCiAJaWYgKHJlZ3MtPm9yaWdfZWF4ID49IDApIHsKIAkJLyogUmVzdGFydCB0aGUgc3lzdGVtIGNhbGwgLSBubyBoYW5kbGVycyBwcmVzZW50ICovCi0JCWlmIChyZWdzLT5lYXggPT0gLUVSRVNUQVJUTk9IQU5EIHx8Ci0JCSAgICByZWdzLT5lYXggPT0gLUVSRVNUQVJUU1lTIHx8Ci0JCSAgICByZWdzLT5lYXggPT0gLUVSRVNUQVJUTk9JTlRSKSB7CisJCXN3aXRjaCAocmVncy0+ZWF4KSB7CisJCWNhc2UgLUVSRVNUQVJUTk9IQU5EOgorCQljYXNlIC1FUkVTVEFSVFNZUzoKKwkJY2FzZSAtRVJFU1RBUlROT0lOVFI6CiAJCQlyZWdzLT5lYXggPSByZWdzLT5vcmlnX2VheDsKIAkJCXJlZ3MtPmVpcCAtPSAyOwotCQl9Ci0JCWlmIChyZWdzLT5lYXggPT0gLUVSRVNUQVJUX1JFU1RBUlRCTE9DSyl7CisJCQlicmVhazsKKworCQljYXNlIC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0s6CiAJCQlyZWdzLT5lYXggPSBfX05SX3Jlc3RhcnRfc3lzY2FsbDsKIAkJCXJlZ3MtPmVpcCAtPSAyOworCQkJYnJlYWs7CiAJCX0KIAl9Ci0JcmV0dXJuIDA7CisKKwkvKiBpZiB0aGVyZSdzIG5vIHNpZ25hbCB0byBkZWxpdmVyLCB3ZSBqdXN0IHB1dCB0aGUgc2F2ZWQgc2lnbWFzaworCSAqIGJhY2sgKi8KKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkgeworCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrLCBOVUxMKTsKKwl9CiB9CiAKIC8qCiAgKiBub3RpZmljYXRpb24gb2YgdXNlcnNwYWNlIGV4ZWN1dGlvbiByZXN1bXB0aW9uCi0gKiAtIHRyaWdnZXJlZCBieSBjdXJyZW50LT53b3JrLm5vdGlmeV9yZXN1bWUKKyAqIC0gdHJpZ2dlcmVkIGJ5IHRoZSBUSUZfV09SS19NQVNLIGZsYWdzCiAgKi8KIF9fYXR0cmlidXRlX18oKHJlZ3Bhcm0oMykpKQotdm9pZCBkb19ub3RpZnlfcmVzdW1lKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzaWdzZXRfdCAqb2xkc2V0LAordm9pZCBkb19ub3RpZnlfcmVzdW1lKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB2b2lkICpfdW51c2VkLAogCQkgICAgICBfX3UzMiB0aHJlYWRfaW5mb19mbGFncykKIHsKIAkvKiBQZW5kaW5nIHNpbmdsZS1zdGVwPyAqLwpAQCAtNjY3LDkgKzY1MywxMCBAQAogCQlyZWdzLT5lZmxhZ3MgfD0gVEZfTUFTSzsKIAkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApOwogCX0KKwogCS8qIGRlYWwgd2l0aCBwZW5kaW5nIHNpZ25hbCBkZWxpdmVyeSAqLwotCWlmICh0aHJlYWRfaW5mb19mbGFncyAmIF9USUZfU0lHUEVORElORykKLQkJZG9fc2lnbmFsKHJlZ3Msb2xkc2V0KTsKKwlpZiAodGhyZWFkX2luZm9fZmxhZ3MgJiAoX1RJRl9TSUdQRU5ESU5HIHwgX1RJRl9SRVNUT1JFX1NJR01BU0spKQorCQlkb19zaWduYWwocmVncyk7CiAJCiAJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX0lSRVQpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL2kzODYva2VybmVsL3NtcGJvb3QuYwppbmRleCBiM2MyZTJjLi4yNTVhZGI0IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3NtcGJvb3QuYworKysgYi9hcmNoL2kzODYva2VybmVsL3NtcGJvb3QuYwpAQCAtODc1LDggKzg3NSw3IEBACiAJCS8qIGluaXRpYWxpemUgdGhyZWFkX3N0cnVjdC4gIHdlIHJlYWxseSB3YW50IHRvIGF2b2lkIGRlc3Ryb3kKIAkJICogaWRsZSB0cmVhZAogCQkgKi8KLQkJaWRsZS0+dGhyZWFkLmVzcCA9ICh1bnNpZ25lZCBsb25nKSgoKHN0cnVjdCBwdF9yZWdzICopCi0JCQkoVEhSRUFEX1NJWkUgKyAodW5zaWduZWQgbG9uZykgaWRsZS0+dGhyZWFkX2luZm8pKSAtIDEpOworCQlpZGxlLT50aHJlYWQuZXNwID0gKHVuc2lnbmVkIGxvbmcpdGFza19wdF9yZWdzKGlkbGUpOwogCQlpbml0X2lkbGUoaWRsZSwgY3B1KTsKIAkJcmV0dXJuIGlkbGU7CiAJfQpAQCAtMTA5Niw2ICsxMDk1LDcgQEAKIAkJCWNhY2hlc2l6ZSA9IDE2OyAvKiBQZW50aXVtcywgMng4a0IgY2FjaGUgKi8KIAkJCWJhbmR3aWR0aCA9IDEwMDsKIAkJfQorCQltYXhfY2FjaGVfc2l6ZSA9IGNhY2hlc2l6ZSAqIDEwMjQ7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3N5c2NhbGxfdGFibGUuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCmluZGV4IGY3YmE0YWMuLjFiNjY1OTIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCkBAIC0yOTMsMyArMjkzLDE5IEBACiAJLmxvbmcgc3lzX2lub3RpZnlfaW5pdAogCS5sb25nIHN5c19pbm90aWZ5X2FkZF93YXRjaAogCS5sb25nIHN5c19pbm90aWZ5X3JtX3dhdGNoCisJLmxvbmcgc3lzX21pZ3JhdGVfcGFnZXMKKwkubG9uZyBzeXNfb3BlbmF0CQkvKiAyOTUgKi8KKwkubG9uZyBzeXNfbWtkaXJhdAorCS5sb25nIHN5c19ta25vZGF0CisJLmxvbmcgc3lzX2ZjaG93bmF0CisJLmxvbmcgc3lzX2Z1dGltZXNhdAorCS5sb25nIHN5c19uZXdmc3RhdGF0CQkvKiAzMDAgKi8KKwkubG9uZyBzeXNfdW5saW5rYXQKKwkubG9uZyBzeXNfcmVuYW1lYXQKKwkubG9uZyBzeXNfbGlua2F0CisJLmxvbmcgc3lzX3N5bWxpbmthdAorCS5sb25nIHN5c19yZWFkbGlua2F0CQkvKiAzMDUgKi8KKwkubG9uZyBzeXNfZmNobW9kYXQKKwkubG9uZyBzeXNfZmFjY2Vzc2F0CisJLmxvbmcgc3lzX3BzZWxlY3Q2CisJLmxvbmcgc3lzX3Bwb2xsCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCmluZGV4IDQxYzViMmQuLmExNGQ1OTQgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCkBAIC0zMDIsNiArMzAyLDEyIEBACiAJZG9fdGltZXJfaW50ZXJydXB0KGlycSwgcmVncyk7CiAKIAl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOworCisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisJaWYgKHVzaW5nX2FwaWNfdGltZXIpCisJCXNtcF9zZW5kX3RpbWVyX2Jyb2FkY2FzdF9pcGkocmVncyk7CisjZW5kaWYKKwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lX2hwZXQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZV9ocGV0LmMKaW5kZXggOWNhZWFhMy4uYTUyOWYwYyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lX2hwZXQuYworKysgYi9hcmNoL2kzODYva2VybmVsL3RpbWVfaHBldC5jCkBAIC0yNTksOCArMjU5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogCi1leHRlcm4gaXJxcmV0dXJuX3QgcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLQogI2RlZmluZSBERUZBVUxUX1JUQ19JTlRfRlJFUSAJNjQKICNkZWZpbmUgUlRDX05VTV9JTlRTIAkJMQogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMgYi9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMKaW5kZXggNTNhZDk1NGUuLjBhYWViZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMKQEAgLTExMiwzMyArMTEyLDM4IEBACiAJCXAgPCAodm9pZCAqKXRpbmZvICsgVEhSRUFEX1NJWkUgLSAzOwogfQogCitzdGF0aWMgdm9pZCBwcmludF9hZGRyX2FuZF9zeW1ib2wodW5zaWduZWQgbG9uZyBhZGRyLCBjaGFyICpsb2dfbHZsKQoreworCXByaW50ayhsb2dfbHZsKTsKKwlwcmludGsoIiBbPCUwOGx4Pl0gIiwgYWRkcik7CisJcHJpbnRfc3ltYm9sKCIlcyIsIGFkZHIpOworCXByaW50aygiXG4iKTsKK30KKwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHByaW50X2NvbnRleHRfc3RhY2soc3RydWN0IHRocmVhZF9pbmZvICp0aW5mbywKLQkJCQl1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBlYnApCisJCQkJdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgZWJwLAorCQkJCWNoYXIgKmxvZ19sdmwpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCiAjaWZkZWYJQ09ORklHX0ZSQU1FX1BPSU5URVIKIAl3aGlsZSAodmFsaWRfc3RhY2tfcHRyKHRpbmZvLCAodm9pZCAqKWVicCkpIHsKIAkJYWRkciA9ICoodW5zaWduZWQgbG9uZyAqKShlYnAgKyA0KTsKLQkJcHJpbnRrKCIgWzwlMDhseD5dICIsIGFkZHIpOwotCQlwcmludF9zeW1ib2woIiVzIiwgYWRkcik7Ci0JCXByaW50aygiXG4iKTsKKwkJcHJpbnRfYWRkcl9hbmRfc3ltYm9sKGFkZHIsIGxvZ19sdmwpOwogCQllYnAgPSAqKHVuc2lnbmVkIGxvbmcgKillYnA7CiAJfQogI2Vsc2UKIAl3aGlsZSAodmFsaWRfc3RhY2tfcHRyKHRpbmZvLCBzdGFjaykpIHsKIAkJYWRkciA9ICpzdGFjaysrOwotCQlpZiAoX19rZXJuZWxfdGV4dF9hZGRyZXNzKGFkZHIpKSB7Ci0JCQlwcmludGsoIiBbPCUwOGx4Pl0iLCBhZGRyKTsKLQkJCXByaW50X3N5bWJvbCgiICVzIiwgYWRkcik7Ci0JCQlwcmludGsoIlxuIik7Ci0JCX0KKwkJaWYgKF9fa2VybmVsX3RleHRfYWRkcmVzcyhhZGRyKSkKKwkJCXByaW50X2FkZHJfYW5kX3N5bWJvbChhZGRyLCBsb2dfbHZsKTsKIAl9CiAjZW5kaWYKIAlyZXR1cm4gZWJwOwogfQogCi12b2lkIHNob3dfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICogc3RhY2spCitzdGF0aWMgdm9pZCBzaG93X3RyYWNlX2xvZ19sdmwoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnN0YWNrLCBjaGFyICpsb2dfbHZsKQogewogCXVuc2lnbmVkIGxvbmcgZWJwOwogCkBAIC0xNTcsMTUgKzE2MiwyMSBAQAogCQlzdHJ1Y3QgdGhyZWFkX2luZm8gKmNvbnRleHQ7CiAJCWNvbnRleHQgPSAoc3RydWN0IHRocmVhZF9pbmZvICopCiAJCQkoKHVuc2lnbmVkIGxvbmcpc3RhY2sgJiAofihUSFJFQURfU0laRSAtIDEpKSk7Ci0JCWVicCA9IHByaW50X2NvbnRleHRfc3RhY2soY29udGV4dCwgc3RhY2ssIGVicCk7CisJCWVicCA9IHByaW50X2NvbnRleHRfc3RhY2soY29udGV4dCwgc3RhY2ssIGVicCwgbG9nX2x2bCk7CiAJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcqKWNvbnRleHQtPnByZXZpb3VzX2VzcDsKIAkJaWYgKCFzdGFjaykKIAkJCWJyZWFrOwotCQlwcmludGsoIiA9PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJCXByaW50ayhLRVJOX0VNRVJHICIgPT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwogCX0KIH0KIAotdm9pZCBzaG93X3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqZXNwKQordm9pZCBzaG93X3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqIHN0YWNrKQoreworCXNob3dfdHJhY2VfbG9nX2x2bCh0YXNrLCBzdGFjaywgIiIpOworfQorCitzdGF0aWMgdm9pZCBzaG93X3N0YWNrX2xvZ19sdmwoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICplc3AsCisJCQkgICAgICAgY2hhciAqbG9nX2x2bCkKIHsKIAl1bnNpZ25lZCBsb25nICpzdGFjazsKIAlpbnQgaTsKQEAgLTE3OCwxNSArMTg5LDI2IEBACiAJfQogCiAJc3RhY2sgPSBlc3A7CisJcHJpbnRrKGxvZ19sdmwpOwogCWZvcihpID0gMDsgaSA8IGtzdGFja19kZXB0aF90b19wcmludDsgaSsrKSB7CiAJCWlmIChrc3RhY2tfZW5kKHN0YWNrKSkKIAkJCWJyZWFrOwotCQlpZiAoaSAmJiAoKGkgJSA4KSA9PSAwKSkKLQkJCXByaW50aygiXG4gICAgICAgIik7CisJCWlmIChpICYmICgoaSAlIDgpID09IDApKSB7CisJCQlwcmludGsoIlxuIik7CisJCQlwcmludGsobG9nX2x2bCk7CisJCQlwcmludGsoIiAgICAgICAiKTsKKwkJfQogCQlwcmludGsoIiUwOGx4ICIsICpzdGFjaysrKTsKIAl9Ci0JcHJpbnRrKCJcbkNhbGwgVHJhY2U6XG4iKTsKLQlzaG93X3RyYWNlKHRhc2ssIGVzcCk7CisJcHJpbnRrKCJcbiIpOworCXByaW50ayhsb2dfbHZsKTsKKwlwcmludGsoIkNhbGwgVHJhY2U6XG4iKTsKKwlzaG93X3RyYWNlX2xvZ19sdmwodGFzaywgZXNwLCBsb2dfbHZsKTsKK30KKwordm9pZCBzaG93X3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqZXNwKQoreworCXNob3dfc3RhY2tfbG9nX2x2bCh0YXNrLCBlc3AsICIiKTsKIH0KIAogLyoKQEAgLTIxNiwxOCArMjM4LDE4IEBACiAJCXNzID0gcmVncy0+eHNzICYgMHhmZmZmOwogCX0KIAlwcmludF9tb2R1bGVzKCk7Ci0JcHJpbnRrKCJDUFU6ICAgICVkXG5FSVA6ICAgICUwNHg6WzwlMDhseD5dICAgICVzIFZMSVxuRUZMQUdTOiAlMDhseCIKLQkJCSIgICAoJXMpIFxuIiwKKwlwcmludGsoS0VSTl9FTUVSRyAiQ1BVOiAgICAlZFxuRUlQOiAgICAlMDR4Ols8JTA4bHg+XSAgICAlcyBWTElcbiIKKwkJCSJFRkxBR1M6ICUwOGx4ICAgKCVzKSBcbiIsCiAJCXNtcF9wcm9jZXNzb3JfaWQoKSwgMHhmZmZmICYgcmVncy0+eGNzLCByZWdzLT5laXAsCiAJCXByaW50X3RhaW50ZWQoKSwgcmVncy0+ZWZsYWdzLCBzeXN0ZW1fdXRzbmFtZS5yZWxlYXNlKTsKLQlwcmludF9zeW1ib2woIkVJUCBpcyBhdCAlc1xuIiwgcmVncy0+ZWlwKTsKLQlwcmludGsoImVheDogJTA4bHggICBlYng6ICUwOGx4ICAgZWN4OiAlMDhseCAgIGVkeDogJTA4bHhcbiIsCisJcHJpbnRfc3ltYm9sKEtFUk5fRU1FUkcgIkVJUCBpcyBhdCAlc1xuIiwgcmVncy0+ZWlwKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiZWF4OiAlMDhseCAgIGVieDogJTA4bHggICBlY3g6ICUwOGx4ICAgZWR4OiAlMDhseFxuIiwKIAkJcmVncy0+ZWF4LCByZWdzLT5lYngsIHJlZ3MtPmVjeCwgcmVncy0+ZWR4KTsKLQlwcmludGsoImVzaTogJTA4bHggICBlZGk6ICUwOGx4ICAgZWJwOiAlMDhseCAgIGVzcDogJTA4bHhcbiIsCisJcHJpbnRrKEtFUk5fRU1FUkcgImVzaTogJTA4bHggICBlZGk6ICUwOGx4ICAgZWJwOiAlMDhseCAgIGVzcDogJTA4bHhcbiIsCiAJCXJlZ3MtPmVzaSwgcmVncy0+ZWRpLCByZWdzLT5lYnAsIGVzcCk7Ci0JcHJpbnRrKCJkczogJTA0eCAgIGVzOiAlMDR4ICAgc3M6ICUwNHhcbiIsCisJcHJpbnRrKEtFUk5fRU1FUkcgImRzOiAlMDR4ICAgZXM6ICUwNHggICBzczogJTA0eFxuIiwKIAkJcmVncy0+eGRzICYgMHhmZmZmLCByZWdzLT54ZXMgJiAweGZmZmYsIHNzKTsKLQlwcmludGsoIlByb2Nlc3MgJXMgKHBpZDogJWQsIHRocmVhZGluZm89JXAgdGFzaz0lcCkiLAorCXByaW50ayhLRVJOX0VNRVJHICJQcm9jZXNzICVzIChwaWQ6ICVkLCB0aHJlYWRpbmZvPSVwIHRhc2s9JXApIiwKIAkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBjdXJyZW50X3RocmVhZF9pbmZvKCksIGN1cnJlbnQpOwogCS8qCiAJICogV2hlbiBpbi1rZXJuZWwsIHdlIGFsc28gcHJpbnQgb3V0IHRoZSBzdGFjayBhbmQgY29kZSBhdCB0aGUKQEAgLTIzNiwxMCArMjU4LDEwIEBACiAJaWYgKGluX2tlcm5lbCkgewogCQl1OCBfX3VzZXIgKmVpcDsKIAotCQlwcmludGsoIlxuU3RhY2s6ICIpOwotCQlzaG93X3N0YWNrKE5VTEwsICh1bnNpZ25lZCBsb25nKillc3ApOworCQlwcmludGsoIlxuIiBLRVJOX0VNRVJHICJTdGFjazogIik7CisJCXNob3dfc3RhY2tfbG9nX2x2bChOVUxMLCAodW5zaWduZWQgbG9uZyAqKWVzcCwgS0VSTl9FTUVSRyk7CiAKLQkJcHJpbnRrKCJDb2RlOiAiKTsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIkNvZGU6ICIpOwogCiAJCWVpcCA9ICh1OCBfX3VzZXIgKilyZWdzLT5laXAgLSA0MzsKIAkJZm9yIChpID0gMDsgaSA8IDY0OyBpKyssIGVpcCsrKSB7CkBAIC0yODAsMTUgKzMwMiwxNSBAQAogCQkodW5zaWduZWQgbG9uZylmaWxlIDwgUEFHRV9PRkZTRVQgfHwgX19nZXRfdXNlcihjLCBmaWxlKSkKIAkJZmlsZSA9ICI8YmFkIGZpbGVuYW1lPiI7CiAKLQlwcmludGsoIi0tLS0tLS0tLS0tLVsgY3V0IGhlcmUgXS0tLS0tLS0tLS0tLVxuIik7Ci0JcHJpbnRrKEtFUk5fQUxFUlQgImtlcm5lbCBCVUcgYXQgJXM6JWQhXG4iLCBmaWxlLCBsaW5lKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiLS0tLS0tLS0tLS0tWyBjdXQgaGVyZSBdLS0tLS0tLS0tLS0tXG4iKTsKKwlwcmludGsoS0VSTl9FTUVSRyAia2VybmVsIEJVRyBhdCAlczolZCFcbiIsIGZpbGUsIGxpbmUpOwogCiBub19idWc6CiAJcmV0dXJuOwogCiAJLyogSGVyZSB3ZSBrbm93IGl0IHdhcyBhIEJVRyBidXQgZmlsZS1uLWxpbmUgaXMgdW5hdmFpbGFibGUgKi8KIGJ1ZzoKLQlwcmludGsoIktlcm5lbCBCVUdcbiIpOworCXByaW50ayhLRVJOX0VNRVJHICJLZXJuZWwgQlVHXG4iKTsKIH0KIAogLyogVGhpcyBpcyBnb25lIHRocm91Z2ggd2hlbiBzb21ldGhpbmcgaW4gdGhlIGtlcm5lbApAQCAtMzIxLDE2ICszNDMsMjAgQEAKIAlpZiAoKytkaWUubG9ja19vd25lcl9kZXB0aCA8IDMpIHsKIAkJaW50IG5sID0gMDsKIAkJaGFuZGxlX0JVRyhyZWdzKTsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiAlMDRseCBbIyVkXVxuIiwgc3RyLCBlcnIgJiAweGZmZmYsICsrZGllX2NvdW50ZXIpOworCQlwcmludGsoS0VSTl9FTUVSRyAiJXM6ICUwNGx4IFsjJWRdXG4iLCBzdHIsIGVyciAmIDB4ZmZmZiwgKytkaWVfY291bnRlcik7CiAjaWZkZWYgQ09ORklHX1BSRUVNUFQKLQkJcHJpbnRrKCJQUkVFTVBUICIpOworCQlwcmludGsoS0VSTl9FTUVSRyAiUFJFRU1QVCAiKTsKIAkJbmwgPSAxOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NNUAorCQlpZiAoIW5sKQorCQkJcHJpbnRrKEtFUk5fRU1FUkcpOwogCQlwcmludGsoIlNNUCAiKTsKIAkJbmwgPSAxOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0RFQlVHX1BBR0VBTExPQworCQlpZiAoIW5sKQorCQkJcHJpbnRrKEtFUk5fRU1FUkcpOwogCQlwcmludGsoIkRFQlVHX1BBR0VBTExPQyIpOwogCQlubCA9IDE7CiAjZW5kaWYKQEAgLTMzOSw3ICszNjUsNyBAQAogCW5vdGlmeV9kaWUoRElFX09PUFMsIChjaGFyICopc3RyLCByZWdzLCBlcnIsIDI1NSwgU0lHU0VHVik7CiAJCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOwogICAJfSBlbHNlCi0JCXByaW50ayhLRVJOX0VSUiAiUmVjdXJzaXZlIGRpZSgpIGZhaWx1cmUsIG91dHB1dCBzdXBwcmVzc2VkXG4iKTsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIlJlY3Vyc2l2ZSBkaWUoKSBmYWlsdXJlLCBvdXRwdXQgc3VwcHJlc3NlZFxuIik7CiAKIAlidXN0X3NwaW5sb2NrcygwKTsKIAlkaWUubG9ja19vd25lciA9IC0xOwpAQCAtNTI3LDggKzU1MywxMCBAQAogCiBzdGF0aWMgdm9pZCBtZW1fcGFyaXR5X2Vycm9yKHVuc2lnbmVkIGNoYXIgcmVhc29uLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCiB7Ci0JcHJpbnRrKCJVaGh1aC4gTk1JIHJlY2VpdmVkLiBEYXplZCBhbmQgY29uZnVzZWQsIGJ1dCB0cnlpbmcgdG8gY29udGludWVcbiIpOwotCXByaW50aygiWW91IHByb2JhYmx5IGhhdmUgYSBoYXJkd2FyZSBwcm9ibGVtIHdpdGggeW91ciBSQU0gY2hpcHNcbiIpOworCXByaW50ayhLRVJOX0VNRVJHICJVaGh1aC4gTk1JIHJlY2VpdmVkLiBEYXplZCBhbmQgY29uZnVzZWQsIGJ1dCB0cnlpbmcgIgorCQkJInRvIGNvbnRpbnVlXG4iKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiWW91IHByb2JhYmx5IGhhdmUgYSBoYXJkd2FyZSBwcm9ibGVtIHdpdGggeW91ciBSQU0gIgorCQkJImNoaXBzXG4iKTsKIAogCS8qIENsZWFyIGFuZCBkaXNhYmxlIHRoZSBtZW1vcnkgcGFyaXR5IGVycm9yIGxpbmUuICovCiAJY2xlYXJfbWVtX2Vycm9yKHJlYXNvbik7CkBAIC01MzgsNyArNTY2LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGk7CiAKLQlwcmludGsoIk5NSTogSU9DSyBlcnJvciAoZGVidWcgaW50ZXJydXB0PylcbiIpOworCXByaW50ayhLRVJOX0VNRVJHICJOTUk6IElPQ0sgZXJyb3IgKGRlYnVnIGludGVycnVwdD8pXG4iKTsKIAlzaG93X3JlZ2lzdGVycyhyZWdzKTsKIAogCS8qIFJlLWVuYWJsZSB0aGUgSU9DSyBsaW5lLCB3YWl0IGZvciBhIGZldyBzZWNvbmRzICovCkBAIC01ODAsMTEgKzYwOCwxMSBAQAogCSogdG8gZ2V0IGEgbWVzc2FnZSBvdXQuCiAJKi8KIAlidXN0X3NwaW5sb2NrcygxKTsKLQlwcmludGsobXNnKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiJXMiLCBtc2cpOwogCXByaW50aygiIG9uIENQVSVkLCBlaXAgJTA4bHgsIHJlZ2lzdGVyczpcbiIsCiAJCXNtcF9wcm9jZXNzb3JfaWQoKSwgcmVncy0+ZWlwKTsKIAlzaG93X3JlZ2lzdGVycyhyZWdzKTsKLQlwcmludGsoImNvbnNvbGUgc2h1dHMgdXAgLi4uXG4iKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiY29uc29sZSBzaHV0cyB1cCAuLi5cbiIpOwogCWNvbnNvbGVfc2lsZW50KCk7CiAJc3Bpbl91bmxvY2soJm5taV9wcmludF9sb2NrKTsKIAlidXN0X3NwaW5sb2NrcygwKTsKQEAgLTk5MCw4ICsxMDE4LDggQEAKIAogYXNtbGlua2FnZSB2b2lkIG1hdGhfZW11bGF0ZShsb25nIGFyZykKIHsKLQlwcmludGsoIm1hdGgtZW11bGF0aW9uIG5vdCBlbmFibGVkIGFuZCBubyBjb3Byb2Nlc3NvciBmb3VuZC5cbiIpOwotCXByaW50aygia2lsbGluZyAlcy5cbiIsY3VycmVudC0+Y29tbSk7CisJcHJpbnRrKEtFUk5fRU1FUkcgIm1hdGgtZW11bGF0aW9uIG5vdCBlbmFibGVkIGFuZCBubyBjb3Byb2Nlc3NvciBmb3VuZC5cbiIpOworCXByaW50ayhLRVJOX0VNRVJHICJraWxsaW5nICVzLlxuIixjdXJyZW50LT5jb21tKTsKIAlmb3JjZV9zaWcoU0lHRlBFLGN1cnJlbnQpOwogCXNjaGVkdWxlKCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3ZtODYuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdm04Ni5jCmluZGV4IGZjMTk5MzUuLmY1MWM4OTQgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdm04Ni5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdm04Ni5jCkBAIC00LDcgKzQsNyBAQAogICogIENvcHlyaWdodCAoQykgMTk5NCAgTGludXMgVG9ydmFsZHMKICAqCiAgKiAgMjkgZGVjIDIwMDEgLSBGaXhlZCBvb3BzZXMgY2F1c2VkIGJ5IHVuY2hlY2tlZCBhY2Nlc3MgdG8gdGhlIHZtODYKLSAqICAgICAgICAgICAgICAgIHN0YWNrIC0gTWFuZnJlZCBTcHJhdWwgPG1hbmZyZWRzQGNvbG9yZnVsbGlmZS5jb20+CisgKiAgICAgICAgICAgICAgICBzdGFjayAtIE1hbmZyZWQgU3ByYXVsIDxtYW5mcmVkQGNvbG9yZnVsbGlmZS5jb20+CiAgKgogICogIDIyIG1hciAyMDAyIC0gTWFuZnJlZCBkZXRlY3RlZCB0aGUgc3RhY2tmYXVsdHMsIGJ1dCBkaWRuJ3QgaGFuZGxlCiAgKiAgICAgICAgICAgICAgICB0aGVtIGNvcnJlY3RseS4gTm93IHRoZSBlbXVsYXRpb24gd2lsbCBiZSBpbiBhCkBAIC0zMCw2ICszMCw3IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTMxMCw3ICszMTEsNyBAQAogCQkibW92bCAlMSwlJWVicFxuXHQiCiAJCSJqbXAgcmVzdW1lX3VzZXJzcGFjZSIKIAkJOiAvKiBubyBvdXRwdXRzICovCi0JCToiciIgKCZpbmZvLT5yZWdzKSwgInIiICh0c2stPnRocmVhZF9pbmZvKSA6ICJheCIpOworCQk6InIiICgmaW5mby0+cmVncyksICJyIiAodGFza190aHJlYWRfaW5mbyh0c2spKSA6ICJheCIpOwogCS8qIHdlIG5ldmVyIHJldHVybiBoZXJlICovCiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9pbml0LmMgYi9hcmNoL2kzODYvbW0vaW5pdC5jCmluZGV4IDdkZjQ5NGIuLjI3MDBmMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tbS9pbml0LmMKKysrIGIvYXJjaC9pMzg2L21tL2luaXQuYwpAQCAtMjY4LDcgKzI2OCw3IEBACiAJcGttYXBfcGFnZV90YWJsZSA9IHB0ZTsJCiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBmcmVlX25ld19oaWdocGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyB2b2lkIF9fbWVtaW5pdCBmcmVlX25ld19oaWdocGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlzZXRfcGFnZV9jb3VudChwYWdlLCAxKTsKIAlfX2ZyZWVfcGFnZShwYWdlKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9wYWdlYXR0ci5jIGIvYXJjaC9pMzg2L21tL3BhZ2VhdHRyLmMKaW5kZXggYzMwYTE2ZC4uZDBjYWRiMyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21tL3BhZ2VhdHRyLmMKKysrIGIvYXJjaC9pMzg2L21tL3BhZ2VhdHRyLmMKQEAgLTIyMiw2ICsyMjIsMTAgQEAKIHsKIAlpZiAoUGFnZUhpZ2hNZW0ocGFnZSkpCiAJCXJldHVybjsKKwlpZiAoIWVuYWJsZSkKKwkJbXV0ZXhfZGVidWdfY2hlY2tfbm9fbG9ja3NfZnJlZWQocGFnZV9hZGRyZXNzKHBhZ2UpLAorCQkJCQkJIG51bXBhZ2VzICogUEFHRV9TSVpFKTsKKwogCS8qIHRoZSByZXR1cm4gdmFsdWUgaXMgaWdub3JlZCAtIHRoZSBjYWxscyBjYW5ub3QgZmFpbCwKIAkgKiBsYXJnZSBwYWdlcyBhcmUgZGlzYWJsZWQgYXQgYm9vdCB0aW1lLgogCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9hY3BpLmMgYi9hcmNoL2kzODYvcGNpL2FjcGkuYwppbmRleCA0YzQ1MjJiLi5iMzNhZWE4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcGNpL2FjcGkuYworKysgYi9hcmNoL2kzODYvcGNpL2FjcGkuYwpAQCAtNTMsNyArNTMsNyBAQAogCQkgKiBkb24ndCB1c2UgcGNpX2VuYWJsZV9kZXZpY2UoKS4KIAkJICovCiAJCXByaW50ayhLRVJOX0lORk8gIlBDSTogUm91dGluZyBQQ0kgaW50ZXJydXB0cyBmb3IgYWxsIGRldmljZXMgYmVjYXVzZSBcInBjaT1yb3V0ZWlycVwiIHNwZWNpZmllZFxuIik7Ci0JCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSkgIT0gTlVMTCkKKwkJZm9yX2VhY2hfcGNpX2RldihkZXYpCiAJCQlhY3BpX3BjaV9pcnFfZW5hYmxlKGRldik7CiAJfSBlbHNlCiAJCXByaW50ayhLRVJOX0lORk8gIlBDSTogSWYgYSBkZXZpY2UgZG9lc24ndCB3b3JrLCB0cnkgXCJwY2k9cm91dGVpcnFcIi4gIElmIGl0IGhlbHBzLCBwb3N0IGEgcmVwb3J0XG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvZml4dXAuYyBiL2FyY2gvaTM4Ni9wY2kvZml4dXAuYwppbmRleCBlZWIxYjFmMmQuLjgzYzM2NDUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvZml4dXAuYworKysgYi9hcmNoL2kzODYvcGNpL2ZpeHVwLmMKQEAgLTQxMyw2ICs0MTMsMTMgQEAKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9WRVJTSU9OLCAiUFNNNCIpLAogCQl9LAogCX0sCisJeworCQkuaWRlbnQgPSAiVG9zaGliYSBBNDAgYmFzZWQgbGFwdG9wIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJUT1NISUJBIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfVkVSU0lPTiwgIlBTQTQwVSIpLAorCQl9LAorCX0sCiAJeyB9CiB9OwogCkBAIC00NDIsMyArNDQ5LDE5IEBACiB9CiBERUNMQVJFX1BDSV9GSVhVUF9FTkFCTEUoUENJX1ZFTkRPUl9JRF9USSwgMHg4MDMyLAogCQkJIHBjaV9wb3N0X2ZpeHVwX3Rvc2hpYmFfb2hjaTEzOTQpOworCisKKy8qCisgKiBQcmV2ZW50IHRoZSBCSU9TIHRyYXBwaW5nIGFjY2Vzc2VzIHRvIHRoZSBDeXJpeCBDUzU1MzBBIHZpZGVvIGRldmljZQorICogY29uZmlndXJhdGlvbiBzcGFjZS4KKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHBjaV9lYXJseV9maXh1cF9jeXJpeF81NTMwKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTggcjsKKwkvKiBjbGVhciAnRjQgVmlkZW8gQ29uZmlndXJhdGlvbiBUcmFwJyBiaXQgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDIsICZyKTsKKwlyICY9IDB4ZmQ7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0Miwgcik7Cit9CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0NZUklYLCBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MzBfTEVHQUNZLAorCQkJcGNpX2Vhcmx5X2ZpeHVwX2N5cml4XzU1MzApOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9pcnEuYyBiL2FyY2gvaTM4Ni9wY2kvaXJxLmMKaW5kZXggZWU4ZTAxNi4uZTcxNWFhOSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3BjaS9pcnEuYworKysgYi9hcmNoL2kzODYvcGNpL2lycS5jCkBAIC03OCw3ICs3OCw3IEBACiAJZm9yIChpPTA7IGkgPCBydC0+c2l6ZTsgaSsrKQogCQlzdW0gKz0gYWRkcltpXTsKIAlpZiAoIXN1bSkgewotCQlEQkcoIlBDSTogSW50ZXJydXB0IFJvdXRpbmcgVGFibGUgZm91bmQgYXQgMHglcFxuIiwgcnQpOworCQlEQkcoS0VSTl9ERUJVRyAiUENJOiBJbnRlcnJ1cHQgUm91dGluZyBUYWJsZSBmb3VuZCBhdCAweCVwXG4iLCBydCk7CiAJCXJldHVybiBydDsKIAl9CiAJcmV0dXJuIE5VTEw7CkBAIC0xMjgsNyArMTI4LDcgQEAKICNpZmRlZiBERUJVRwogCQl7CiAJCQlpbnQgajsKLQkJCURCRygiJTAyeDolMDJ4IHNsb3Q9JTAyeCIsIGUtPmJ1cywgZS0+ZGV2Zm4vOCwgZS0+c2xvdCk7CisJCQlEQkcoS0VSTl9ERUJVRyAiJTAyeDolMDJ4IHNsb3Q9JTAyeCIsIGUtPmJ1cywgZS0+ZGV2Zm4vOCwgZS0+c2xvdCk7CiAJCQlmb3Ioaj0wOyBqPDQ7IGorKykKIAkJCQlEQkcoIiAlZDolMDJ4LyUwNHgiLCBqLCBlLT5pcnFbal0ubGluaywgZS0+aXJxW2pdLmJpdG1hcCk7CiAJCQlEQkcoIlxuIik7CkBAIC0xNjAsMTAgKzE2MCwxMCBAQAogCQlyZXR1cm47CiAKIAllaXNhX2lycV9tYXNrIHw9ICgxIDw8IGlycSk7Ci0JcHJpbnRrKCJQQ0k6IHNldHRpbmcgSVJRICV1IGFzIGxldmVsLXRyaWdnZXJlZFxuIiwgaXJxKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiUENJOiBzZXR0aW5nIElSUSAldSBhcyBsZXZlbC10cmlnZ2VyZWRcbiIsIGlycSk7CiAJdmFsID0gaW5iKHBvcnQpOwogCWlmICghKHZhbCAmIG1hc2spKSB7Ci0JCURCRygiIC0+IGVkZ2UiKTsKKwkJREJHKEtFUk5fREVCVUcgIiAtPiBlZGdlIik7CiAJCW91dGIodmFsIHwgbWFzaywgcG9ydCk7CiAJfQogfQpAQCAtNjc3LDExICs2NzcsMTEgQEAKIAl7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0FMX00xNTMzOgogCWNhc2UgUENJX0RFVklDRV9JRF9BTF9NMTU2MzoKLQkJcHJpbnRrKCJQQ0k6IFVzaW5nIEFMSSBJUlEgUm91dGVyXG4iKTsKLQkJCXItPm5hbWUgPSAiQUxJIjsKLQkJCXItPmdldCA9IHBpcnFfYWxpX2dldDsKLQkJCXItPnNldCA9IHBpcnFfYWxpX3NldDsKLQkJCXJldHVybiAxOworCQlwcmludGsoS0VSTl9ERUJVRyAiUENJOiBVc2luZyBBTEkgSVJRIFJvdXRlclxuIik7CisJCXItPm5hbWUgPSAiQUxJIjsKKwkJci0+Z2V0ID0gcGlycV9hbGlfZ2V0OworCQlyLT5zZXQgPSBwaXJxX2FsaV9zZXQ7CisJCXJldHVybiAxOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTc0OSwxMiArNzQ5LDEzIEBACiAJci0+Z2V0ID0gTlVMTDsKIAlyLT5zZXQgPSBOVUxMOwogCQotCURCRygiUENJOiBBdHRlbXB0aW5nIHRvIGZpbmQgSVJRIHJvdXRlciBmb3IgJTA0eDolMDR4XG4iLAorCURCRyhLRVJOX0RFQlVHICJQQ0k6IEF0dGVtcHRpbmcgdG8gZmluZCBJUlEgcm91dGVyIGZvciAlMDR4OiUwNHhcbiIsCiAJICAgIHJ0LT5ydHJfdmVuZG9yLCBydC0+cnRyX2RldmljZSk7CiAKIAlwaXJxX3JvdXRlcl9kZXYgPSBwY2lfZmluZF9zbG90KHJ0LT5ydHJfYnVzLCBydC0+cnRyX2RldmZuKTsKIAlpZiAoIXBpcnFfcm91dGVyX2RldikgewotCQlEQkcoIlBDSTogSW50ZXJydXB0IHJvdXRlciBub3QgZm91bmQgYXQgJTAyeDolMDJ4XG4iLCBydC0+cnRyX2J1cywgcnQtPnJ0cl9kZXZmbik7CisJCURCRyhLRVJOX0RFQlVHICJQQ0k6IEludGVycnVwdCByb3V0ZXIgbm90IGZvdW5kIGF0ICIKKwkJCSIlMDJ4OiUwMnhcbiIsIHJ0LT5ydHJfYnVzLCBydC0+cnRyX2RldmZuKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNzk5LDcgKzgwMCw3IEBACiAJLyogRmluZCBJUlEgcGluICovCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7CiAJaWYgKCFwaW4pIHsKLQkJREJHKCIgLT4gbm8gaW50ZXJydXB0IHBpblxuIik7CisJCURCRyhLRVJOX0RFQlVHICIgLT4gbm8gaW50ZXJydXB0IHBpblxuIik7CiAJCXJldHVybiAwOwogCX0KIAlwaW4gPSBwaW4gLSAxOwpAQCAtODA5LDE2ICs4MTAsMTYgQEAKIAlpZiAoIXBpcnFfdGFibGUpCiAJCXJldHVybiAwOwogCQotCURCRygiSVJRIGZvciAlc1slY10iLCBwY2lfbmFtZShkZXYpLCAnQScgKyBwaW4pOworCURCRyhLRVJOX0RFQlVHICJJUlEgZm9yICVzWyVjXSIsIHBjaV9uYW1lKGRldiksICdBJyArIHBpbik7CiAJaW5mbyA9IHBpcnFfZ2V0X2luZm8oZGV2KTsKIAlpZiAoIWluZm8pIHsKLQkJREJHKCIgLT4gbm90IGZvdW5kIGluIHJvdXRpbmcgdGFibGVcbiIpOworCQlEQkcoIiAtPiBub3QgZm91bmQgaW4gcm91dGluZyB0YWJsZVxuIiBLRVJOX0RFQlVHKTsKIAkJcmV0dXJuIDA7CiAJfQogCXBpcnEgPSBpbmZvLT5pcnFbcGluXS5saW5rOwogCW1hc2sgPSBpbmZvLT5pcnFbcGluXS5iaXRtYXA7CiAJaWYgKCFwaXJxKSB7Ci0JCURCRygiIC0+IG5vdCByb3V0ZWRcbiIpOworCQlEQkcoIiAtPiBub3Qgcm91dGVkXG4iIEtFUk5fREVCVUcpOwogCQlyZXR1cm4gMDsKIAl9CiAJREJHKCIgLT4gUElSUSAlMDJ4LCBtYXNrICUwNHgsIGV4Y2wgJTA0eCIsIHBpcnEsIG1hc2ssIHBpcnFfdGFibGUtPmV4Y2x1c2l2ZV9pcnFzKTsKQEAgLTg0OCw3ICs4NDksMTAgQEAKIAluZXdpcnEgPSBkZXYtPmlycTsKIAlpZiAobmV3aXJxICYmICEoKDEgPDwgbmV3aXJxKSAmIG1hc2spKSB7CiAJCWlmICggcGNpX3Byb2JlICYgUENJX1VTRV9QSVJRX01BU0spIG5ld2lycSA9IDA7Ci0JCWVsc2UgcHJpbnRrKEtFUk5fV0FSTklORyAiUENJOiBJUlEgJWkgZm9yIGRldmljZSAlcyBkb2Vzbid0IG1hdGNoIFBJUlEgbWFzayAtIHRyeSBwY2k9dXNlcGlycW1hc2tcbiIsIG5ld2lycSwgcGNpX25hbWUoZGV2KSk7CisJCWVsc2UgcHJpbnRrKCJcbiIgS0VSTl9XQVJOSU5HCisJCQkiUENJOiBJUlEgJWkgZm9yIGRldmljZSAlcyBkb2Vzbid0IG1hdGNoIFBJUlEgbWFzayAiCisJCQkiLSB0cnkgcGNpPXVzZXBpcnFtYXNrXG4iIEtFUk5fREVCVUcsIG5ld2lycSwKKwkJCXBjaV9uYW1lKGRldikpOwogCX0KIAlpZiAoIW5ld2lycSAmJiBhc3NpZ24pIHsKIAkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKQEAgLTkyMywxNCArOTI3LDE0IEBACiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CiAJdTggcGluOwogCi0JREJHKCJQQ0k6IElSUSBmaXh1cFxuIik7CisJREJHKEtFUk5fREVCVUcgIlBDSTogSVJRIGZpeHVwXG4iKTsKIAl3aGlsZSAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldikpICE9IE5VTEwpIHsKIAkJLyoKIAkJICogSWYgdGhlIEJJT1MgaGFzIHNldCBhbiBvdXQgb2YgcmFuZ2UgSVJRIG51bWJlciwganVzdCBpZ25vcmUgaXQuCiAJCSAqIEFsc28ga2VlcCB0cmFjayBvZiB3aGljaCBJUlEncyBhcmUgYWxyZWFkeSBpbiB1c2UuCiAJCSAqLwogCQlpZiAoZGV2LT5pcnEgPj0gMTYpIHsKLQkJCURCRygiJXM6IGlnbm9yaW5nIGJvZ3VzIElSUSAlZFxuIiwgcGNpX25hbWUoZGV2KSwgZGV2LT5pcnEpOworCQkJREJHKEtFUk5fREVCVUcgIiVzOiBpZ25vcmluZyBib2d1cyBJUlEgJWRcbiIsIHBjaV9uYW1lKGRldiksIGRldi0+aXJxKTsKIAkJCWRldi0+aXJxID0gMDsKIAkJfQogCQkvKiBJZiB0aGUgSVJRIGlzIGFscmVhZHkgYXNzaWduZWQgdG8gYSBQQ0kgZGV2aWNlLCBpZ25vcmUgaXRzIElTQSB1c2UgcGVuYWx0eSAqLwpAQCAtMTAzOSw3ICsxMDQzLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgcGNpYmlvc19pcnFfaW5pdCh2b2lkKQogewotCURCRygiUENJOiBJUlEgaW5pdFxuIik7CisJREJHKEtFUk5fREVCVUcgIlBDSTogSVJRIGluaXRcbiIpOwogCiAJaWYgKHBjaWJpb3NfZW5hYmxlX2lycSB8fCByYXdfcGNpX29wcyA9PSBOVUxMKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9NYWtlZmlsZSBiL2FyY2gvaWE2NC9NYWtlZmlsZQppbmRleCA2NzkzMmFkLi5mNzIyZTFhIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvTWFrZWZpbGUKKysrIGIvYXJjaC9pYTY0L01ha2VmaWxlCkBAIC0yNSw3ICsyNSw2IEBACiAJCSAgIC1mYWxpZ24tZnVuY3Rpb25zPTMyIC1mcmVuYW1lLXJlZ2lzdGVycyAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMKIENGTEFHU19LRVJORUwJOj0gLW1jb25zdGFudC1ncAogCi1HQ0NfVkVSU0lPTiAgICAgOj0gJChjYWxsIGNjLXZlcnNpb24pCiBHQVNfU1RBVFVTCT0gJChzaGVsbCAkKHNyY3RyZWUpL2FyY2gvaWE2NC9zY3JpcHRzL2NoZWNrLWdhcyAiJChDQykiICIkKE9CSkRVTVApIikKIENQUEZMQUdTICs9ICQoc2hlbGwgJChzcmN0cmVlKS9hcmNoL2lhNjQvc2NyaXB0cy90b29sY2hhaW4tZmxhZ3MgIiQoQ0MpIiAiJChPQkpEVU1QKSIgIiQoUkVBREVMRikiKQogCkBAIC0zNywxMSArMzYsNyBAQAogCQlmdHA6Ly9mdHAuaHBsLmhwLmNvbS9wdWIvbGludXgtaWE2NC9nYXMtMDMwMTI0LnRhci5neikKIGVuZGlmCiAKLWlmbmVxICgkKHNoZWxsIGlmIFsgJChHQ0NfVkVSU0lPTikgLWx0IDAzMDAgXSA7IHRoZW4gZWNobyAiYmFkIjsgZmkgOyksKQotJChlcnJvciBTb3JyeSwgeW91ciBjb21waWxlciBpcyB0b28gb2xkLiAgR0NDIHYyLjk2IGlzIGtub3duIHRvIGdlbmVyYXRlIGJhZCBjb2RlLikKLWVuZGlmCi0KLWlmZXEgKCQoR0NDX1ZFUlNJT04pLDAzMDQpCitpZmVxICgkKGNhbGwgY2MtdmVyc2lvbiksMDMwNCkKIAljZmxhZ3MtJChDT05GSUdfSVRBTklVTSkJKz0gLW10dW5lPW1lcmNlZAogCWNmbGFncy0kKENPTkZJR19NQ0tJTkxFWSkJKz0gLW10dW5lPW1ja2lubGV5CiBlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2NvbmZpZ3MvZ2Vuc3BhcnNlX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL2dlbnNwYXJzZV9kZWZjb25maWcKaW5kZXggODBmODY2My4uOTkxYzA3YiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2NvbmZpZ3MvZ2Vuc3BhcnNlX2RlZmNvbmZpZworKysgYi9hcmNoL2lhNjQvY29uZmlncy9nZW5zcGFyc2VfZGVmY29uZmlnCkBAIC01NTcsNiArNTU3LDcgQEAKICMgQ09ORklHX0RMMksgaXMgbm90IHNldAogQ09ORklHX0UxMDAwPXkKICMgQ09ORklHX0UxMDAwX05BUEkgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDBfRElTQUJMRV9QQUNLRVRfU1BMSVQgaXMgbm90IHNldAogIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKICMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CkBAIC03MDEsNiArNzAyLDcgQEAKIENPTkZJR19TRVJJQUxfU0dJX0wxX0NPTlNPTEU9eQogIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CiBDT05GSUdfU0VSSUFMX1NHSV9JT0M0PXkKK0NPTkZJR19TRVJJQUxfU0dJX0lPQzM9eQogQ09ORklHX1VOSVg5OF9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKQEAgLTEwNDYsNiArMTA0OCw3IEBACiAjIFNOIERldmljZXMKICMKIENPTkZJR19TR0lfSU9DND15CitDT05GSUdfU0dJX0lPQzM9eQogCiAjCiAjIEZpbGUgc3lzdGVtcwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2NvbmZpZ3Mvc24yX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL3NuMl9kZWZjb25maWcKaW5kZXggZmY4YmIzNy4uM2NiNTAzYiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2NvbmZpZ3Mvc24yX2RlZmNvbmZpZworKysgYi9hcmNoL2lhNjQvY29uZmlncy9zbjJfZGVmY29uZmlnCkBAIC02NTksNiArNjU5LDcgQEAKIENPTkZJR19TRVJJQUxfU0dJX0wxX0NPTlNPTEU9eQogIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CiBDT05GSUdfU0VSSUFMX1NHSV9JT0M0PXkKK0NPTkZJR19TRVJJQUxfU0dJX0lPQzM9eQogQ09ORklHX1VOSVg5OF9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKQEAgLTg5OSw2ICs5MDAsNyBAQAogIyBTTiBEZXZpY2VzCiAjCiBDT05GSUdfU0dJX0lPQzQ9eQorQ09ORklHX1NHSV9JT0MzPXkKIAogIwogIyBGaWxlIHN5c3RlbXMKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9jb25maWdzL3RpZ2VyX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL3RpZ2VyX2RlZmNvbmZpZwppbmRleCBiMWU4ZjA5Li42ODU5MTE5IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvY29uZmlncy90aWdlcl9kZWZjb25maWcKKysrIGIvYXJjaC9pYTY0L2NvbmZpZ3MvdGlnZXJfZGVmY29uZmlnCkBAIC01NjUsNiArNTY1LDcgQEAKICMgQ09ORklHX0RMMksgaXMgbm90IHNldAogQ09ORklHX0UxMDAwPXkKICMgQ09ORklHX0UxMDAwX05BUEkgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDBfRElTQUJMRV9QQUNLRVRfU1BMSVQgaXMgbm90IHNldAogIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKICMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvY29uZmlncy96eDFfZGVmY29uZmlnIGIvYXJjaC9pYTY0L2NvbmZpZ3MvengxX2RlZmNvbmZpZwppbmRleCAwODU2Y2E2Li41Mzg5OWRjIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvY29uZmlncy96eDFfZGVmY29uZmlnCisrKyBiL2FyY2gvaWE2NC9jb25maWdzL3p4MV9kZWZjb25maWcKQEAgLTU0OCw2ICs1NDgsNyBAQAogIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CiBDT05GSUdfRTEwMDA9eQogIyBDT05GSUdfRTEwMDBfTkFQSSBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMF9ESVNBQkxFX1BBQ0tFVF9TUExJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAogIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9kZWZjb25maWcgYi9hcmNoL2lhNjQvZGVmY29uZmlnCmluZGV4IDI3NWEyNmMuLmRjYmM3OGEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9kZWZjb25maWcKKysrIGIvYXJjaC9pYTY0L2RlZmNvbmZpZwpAQCAtNTY1LDYgKzU2NSw3IEBACiAjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKIENPTkZJR19FMTAwMD15CiAjIENPTkZJR19FMTAwMF9OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwX0RJU0FCTEVfUEFDS0VUX1NQTElUIGlzIG5vdCBzZXQKICMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2hwL3NpbS9zaW1zZXJpYWwuYyBiL2FyY2gvaWE2NC9ocC9zaW0vc2ltc2VyaWFsLmMKaW5kZXggMTllZTYzNS4uNjI2Y2RjOCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2hwL3NpbS9zaW1zZXJpYWwuYworKysgYi9hcmNoL2lhNjQvaHAvc2ltL3NpbXNlcmlhbC5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgpAQCAtMTA3LDcgKzEwOCw2IEBACiBzdGF0aWMgc3RydWN0IGNvbnNvbGUgKmNvbnNvbGU7CiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyICp0bXBfYnVmOwotc3RhdGljIERFQ0xBUkVfTVVURVgodG1wX2J1Zl9zZW0pOwogCiBleHRlcm4gc3RydWN0IGNvbnNvbGUgKmNvbnNvbGVfZHJpdmVyczsgLyogZnJvbSBrZXJuZWwvcHJpbnRrLmMgKi8KIApAQCAtMTY2LDE1ICsxNjYsOSBAQAogCQkJfQogCQl9CiAJCXNlZW5fZXNjID0gMDsKLQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSBicmVhazsKIAotCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciA9IGNoOwotCi0JCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gMDsKLQotCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyKys7Ci0JCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKzsKLQkJdHR5LT5mbGlwLmNvdW50Kys7CisJCWlmICh0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBUVFlfTk9STUFMKSA9PSAwKQorCQkJYnJlYWs7CiAJfQogCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaWEzMi9NYWtlZmlsZSBiL2FyY2gvaWE2NC9pYTMyL01ha2VmaWxlCmluZGV4IDJlZDkwZGEuLjYxY2I2MGEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pYTMyL01ha2VmaWxlCisrKyBiL2FyY2gvaWE2NC9pYTMyL01ha2VmaWxlCkBAIC0yLDExICsyLDkgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBpYTMyIGtlcm5lbCBlbXVsYXRpb24gc3Vic3lzdGVtLgogIwogCi1vYmoteSA6PSBpYTMyX2VudHJ5Lm8gc3lzX2lhMzIubyBpYTMyX2lvY3RsLm8gaWEzMl9zaWduYWwubyBcCitvYmoteSA6PSBpYTMyX2VudHJ5Lm8gc3lzX2lhMzIubyBpYTMyX3NpZ25hbC5vIFwKIAkgaWEzMl9zdXBwb3J0Lm8gaWEzMl90cmFwcy5vIGJpbmZtdF9lbGYzMi5vIGlhMzJfbGR0Lm8KIAotQ0ZMQUdTX2lhMzJfaW9jdGwubyArPSAtSWZzLwotCiAjIERvbid0IGxldCBHQ0MgdXNlcyBmMTYtZjMxIHNvIHRoYXQgc2F2ZV9pYTMyX2Zwc3RhdGVfbGl2ZSgpIGFuZAogIyByZXN0b3JlX2lhMzJfZnBzdGF0ZV9saXZlKCkgY2FuIGJlIHN1cmUgdGhlIGxpdmUgcmVnaXN0ZXIgY29udGFpbiB1c2VyLWxldmVsIHN0YXRlLgogQ0ZMQUdTX2lhMzJfc2lnbmFsLm8gKz0gLW1maXhlZC1yYW5nZT1mMTYtZjMxCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaWEzMi9lbGZjb3JlMzIuaCBiL2FyY2gvaWE2NC9pYTMyL2VsZmNvcmUzMi5oCmluZGV4IGI3M2I4YjYuLmE0N2Y2M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pYTMyL2VsZmNvcmUzMi5oCisrKyBiL2FyY2gvaWE2NC9pYTMyL2VsZmNvcmUzMi5oCkBAIC05NSw4ICs5NSw3IEBACiBzdGF0aWMgaW5saW5lIGludCBlbGZfY29yZV9jb3B5X3Rhc2tfcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsCiAJCQkJCSAgZWxmX2dyZWdzZXRfdCogZWxmcmVncykKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcHAgPSBpYTY0X3Rhc2tfcmVncyh0KTsKLQlFTEZfQ09SRV9DT1BZX1JFR1MoKCplbGZyZWdzKSwgcHApOworCUVMRl9DT1JFX0NPUFlfUkVHUygoKmVsZnJlZ3MpLCB0YXNrX3B0X3JlZ3ModCkpOwogCXJldHVybiAxOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaWEzMi9pYTMyX2VudHJ5LlMgYi9hcmNoL2lhNjQvaWEzMi9pYTMyX2VudHJ5LlMKaW5kZXggNDk0ZmFkNi4uOTVmZTA0NCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2lhMzIvaWEzMl9lbnRyeS5TCisrKyBiL2FyY2gvaWE2NC9pYTMyL2lhMzJfZW50cnkuUwpAQCAtNDY5LDcgKzQ2OSw3IEBACiAJZGF0YTggc3lzMzJfZXBvbGxfd2FpdAogCWRhdGE4IHN5c19yZW1hcF9maWxlX3BhZ2VzCiAJZGF0YTggc3lzX3NldF90aWRfYWRkcmVzcwotIAlkYXRhOCBzeXMzMl90aW1lcl9jcmVhdGUKKyAJZGF0YTggY29tcGF0X3N5c190aW1lcl9jcmVhdGUKICAJZGF0YTggY29tcGF0X3N5c190aW1lcl9zZXR0aW1lCS8qIDI2MCAqLwogIAlkYXRhOCBjb21wYXRfc3lzX3RpbWVyX2dldHRpbWUKICAJZGF0YTggc3lzX3RpbWVyX2dldG92ZXJydW4KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pYTMyL2lhMzJfaW9jdGwuYyBiL2FyY2gvaWE2NC9pYTMyL2lhMzJfaW9jdGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3MzkzOS4uMDAwMDAwMAotLS0gYS9hcmNoL2lhNjQvaWEzMi9pYTMyX2lvY3RsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogSUEzMiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgaW9jdGwgc2hpbSBjb2RlCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIFZBIExpbnV4IENvCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgRG9uIER1Z2dlciA8bjBhbm9AdmFsaW51eC5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBIZXdsZXR0LVBhY2thcmQgQ28KLSAqCURhdmlkIE1vc2Jlcmdlci1UYW5nIDxkYXZpZG1AaHBsLmhwLmNvbT4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CS8qIGFyZ2gsIG1zZG9zX2ZzLmggaXNuJ3Qgc2VsZi1jb250YWluZWQuLi4gKi8KLSNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgotI2luY2x1ZGUgImlhMzJwcml2LmgiCi0gIAotI2RlZmluZQlJTkNMVURFUwotI2luY2x1ZGUgImNvbXBhdF9pb2N0bC5jIgotCi0jZGVmaW5lIElPQ1RMX05SKGEpCSgoYSkgJiB+KF9JT0NfU0laRU1BU0sgPDwgX0lPQ19TSVpFU0hJRlQpKQotCi0jZGVmaW5lIERPX0lPQ1RMKGZkLCBjbWQsIGFyZykgKHsJCQlcCi0JaW50IF9yZXQ7CQkJCQlcCi0JbW1fc2VnbWVudF90IF9vbGRfZnMgPSBnZXRfZnMoKTsJCVwKLQkJCQkJCQlcCi0Jc2V0X2ZzKEtFUk5FTF9EUyk7CQkJCVwKLQlfcmV0ID0gc3lzX2lvY3RsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKWFyZyk7CVwKLQlzZXRfZnMoX29sZF9mcyk7CQkJCVwKLQlfcmV0OwkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgQ09ERQotI2luY2x1ZGUgImNvbXBhdF9pb2N0bC5jIgotCi0jZGVmaW5lIENPTVBBVElCTEVfSU9DVEwoY21kKQkJSEFORExFX0lPQ1RMKChjbWQpLHN5c19pb2N0bCkKLSNkZWZpbmUgSEFORExFX0lPQ1RMKGNtZCxoYW5kbGVyKQl7IChjbWQpLCAoaW9jdGxfdHJhbnNfaGFuZGxlcl90KShoYW5kbGVyKSwgTlVMTCB9LAotI2RlZmluZSBJT0NUTF9UQUJMRV9TVEFSVCBcCi0Jc3RydWN0IGlvY3RsX3RyYW5zIGlvY3RsX3N0YXJ0W10gPSB7Ci0jZGVmaW5lIElPQ1RMX1RBQkxFX0VORCBcCi0JfTsKLQotSU9DVExfVEFCTEVfU1RBUlQKLSNkZWZpbmUgREVDTEFSRVMKLSNpbmNsdWRlICJjb21wYXRfaW9jdGwuYyIKLSNpbmNsdWRlIDxsaW51eC9jb21wYXRfaW9jdGwuaD4KLUlPQ1RMX1RBQkxFX0VORAotCi1pbnQgaW9jdGxfdGFibGVfc2l6ZSA9IEFSUkFZX1NJWkUoaW9jdGxfc3RhcnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2lhMzIvaWEzMl9zaWduYWwuYyBiL2FyY2gvaWE2NC9pYTMyL2lhMzJfc2lnbmFsLmMKaW5kZXggYWE4OTFjOS4uNTg1NjUxMCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2lhMzIvaWEzMl9zaWduYWwuYworKysgYi9hcmNoL2lhNjQvaWEzMi9pYTMyX3NpZ25hbC5jCkBAIC0yNTUsNyArMjU1LDcgQEAKIAkgKi8KIAlmcF90b3MgPSAoZnNyPj4xMSkmMHg3OwogCWZyOF9zdF9tYXAgPSAoOC1mcF90b3MpJjB4NzsKLQlwdHAgPSBpYTY0X3Rhc2tfcmVncyh0c2spOworCXB0cCA9IHRhc2tfcHRfcmVncyh0c2spOwogCWZwcmVncCA9IChzdHJ1Y3QgX2ZwcmVnX2lhMzIgKikoKCh1bnNpZ25lZCBsb25nKWJ1ZiArIDE1KSAmIH4xNSk7CiAJaWE2NGYyaWEzMmYoZnByZWdwLCAmcHRwLT5mOCk7CiAJY29weV90b191c2VyKCZzYXZlLT5fc3RbKDArZnI4X3N0X21hcCkmMHg3XSwgZnByZWdwLCBzaXplb2Yoc3RydWN0IF9mcHJlZ19pYTMyKSk7CkBAIC0zODksNyArMzg5LDcgQEAKIAlmcjhfc3RfbWFwID0gKDgtZnBfdG9zKSYweDc7CiAJZnByZWdwID0gKHN0cnVjdCBfZnByZWdfaWEzMiAqKSgoKHVuc2lnbmVkIGxvbmcpYnVmICsgMTUpICYgfjE1KTsKIAotCXB0cCA9IGlhNjRfdGFza19yZWdzKHRzayk7CisJcHRwID0gdGFza19wdF9yZWdzKHRzayk7CiAJY29weV9mcm9tX3VzZXIoZnByZWdwLCAmc2F2ZS0+X3N0WygwK2ZyOF9zdF9tYXApJjB4N10sIHNpemVvZihzdHJ1Y3QgX2ZwcmVnX2lhMzIpKTsKIAlpYTMyZjJpYTY0ZigmcHRwLT5mOCwgZnByZWdwKTsKIAljb3B5X2Zyb21fdXNlcihmcHJlZ3AsICZzYXZlLT5fc3RbKDErZnI4X3N0X21hcCkmMHg3XSwgc2l6ZW9mKHN0cnVjdCBfZnByZWdfaWEzMikpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2lhMzIvaWEzMl9zdXBwb3J0LmMgYi9hcmNoL2lhNjQvaWEzMi9pYTMyX3N1cHBvcnQuYwppbmRleCA0ZjYzMDA0Li5jMTg3NzQzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaWEzMi9pYTMyX3N1cHBvcnQuYworKysgYi9hcmNoL2lhNjQvaWEzMi9pYTMyX3N1cHBvcnQuYwpAQCAtNTgsNyArNTgsNyBAQAogdm9pZAogaWEzMl9sb2FkX3NlZ21lbnRfZGVzY3JpcHRvcnMgKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGlhNjRfdGFza19yZWdzKHRhc2spOworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKHRhc2spOwogCiAJLyogU2V0dXAgdGhlIHNlZ21lbnQgZGVzY3JpcHRvcnMgKi8KIAlyZWdzLT5yMjQgPSBsb2FkX2Rlc2MocmVncy0+cjE2ID4+IDE2KTsJCS8qIEVTRCAqLwpAQCAtMTEzLDcgKzExMyw3IEBACiBpYTMyX2xvYWRfc3RhdGUgKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKIHsKIAl1bnNpZ25lZCBsb25nIGVmbGFnLCBmc3IsIGZjciwgZmlyLCBmZHIsIHRzc2Q7Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBpYTY0X3Rhc2tfcmVncyh0KTsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyh0KTsKIAogCWVmbGFnID0gdC0+dGhyZWFkLmVmbGFnOwogCWZzciA9IHQtPnRocmVhZC5mc3I7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaWEzMi9zeXNfaWEzMi5jIGIvYXJjaC9pYTY0L2lhMzIvc3lzX2lhMzIuYwppbmRleCBkYzI4MjcxLi43MGRiYTFmIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaWEzMi9zeXNfaWEzMi5jCisrKyBiL2FyY2gvaWE2NC9pYTMyL3N5c19pYTMyLmMKQEAgLTQ4LDEyICs0OCwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcGMuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxhc20vaW50cmluc2ljcy5oPgotI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KQEAgLTg1LDcgKzg2LDcgQEAKICAqIHdoaWxlIGRvaW5nIHNvLgogICovCiAvKiBYWFggbWFrZSBwZXItbW06ICovCi1zdGF0aWMgREVDTEFSRV9NVVRFWChpYTMyX21tYXBfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgoaWEzMl9tbWFwX211dGV4KTsKIAogYXNtbGlua2FnZSBsb25nCiBzeXMzMl9leGVjdmUgKGNoYXIgX191c2VyICpuYW1lLCBjb21wYXRfdXB0cl90IF9fdXNlciAqYXJndiwgY29tcGF0X3VwdHJfdCBfX3VzZXIgKmVudnAsCkBAIC04OTQsMTEgKzg5NSwxMSBAQAogCXByb3QgPSBnZXRfcHJvdDMyKHByb3QpOwogCiAjaWYgUEFHRV9TSElGVCA+IElBMzJfUEFHRV9TSElGVAotCWRvd24oJmlhMzJfbW1hcF9zZW0pOworCW11dGV4X2xvY2soJmlhMzJfbW1hcF9tdXRleCk7CiAJewogCQlhZGRyID0gZW11bGF0ZV9tbWFwKGZpbGUsIGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIG9mZnNldCk7CiAJfQotCXVwKCZpYTMyX21tYXBfc2VtKTsKKwltdXRleF91bmxvY2soJmlhMzJfbW1hcF9tdXRleCk7CiAjZWxzZQogCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJewpAQCAtOTk5LDExICsxMDAwLDkgQEAKIAlpZiAoc3RhcnQgPj0gZW5kKQogCQlyZXR1cm4gMDsKIAotCWRvd24oJmlhMzJfbW1hcF9zZW0pOwotCXsKLQkJcmV0ID0gc3lzX211bm1hcChzdGFydCwgZW5kIC0gc3RhcnQpOwotCX0KLQl1cCgmaWEzMl9tbWFwX3NlbSk7CisJbXV0ZXhfbG9jaygmaWEzMl9tbWFwX211dGV4KTsKKwlyZXQgPSBzeXNfbXVubWFwKHN0YXJ0LCBlbmQgLSBzdGFydCk7CisJbXV0ZXhfdW5sb2NrKCZpYTMyX21tYXBfbXV0ZXgpOwogI2VuZGlmCiAJcmV0dXJuIHJldDsKIH0KQEAgLTEwNTUsNyArMTA1NCw3IEBACiAJaWYgKHJldHZhbCA8IDApCiAJCXJldHVybiByZXR2YWw7CiAKLQlkb3duKCZpYTMyX21tYXBfc2VtKTsKKwltdXRleF9sb2NrKCZpYTMyX21tYXBfbXV0ZXgpOwogCXsKIAkJaWYgKG9mZnNldF9pbl9wYWdlKHN0YXJ0KSkgewogCQkJLyogc3RhcnQgYWRkcmVzcyBpcyA0S0IgYWxpZ25lZCBidXQgbm90IHBhZ2UgYWxpZ25lZC4gKi8KQEAgLTEwNzksNyArMTA3OCw3IEBACiAJCXJldHZhbCA9IHN5c19tcHJvdGVjdChzdGFydCwgZW5kIC0gc3RhcnQsIHByb3QpOwogCX0KICAgb3V0OgotCXVwKCZpYTMyX21tYXBfc2VtKTsKKwltdXRleF91bmxvY2soJmlhMzJfbW1hcF9tdXRleCk7CiAJcmV0dXJuIHJldHZhbDsKICNlbmRpZgogfQpAQCAtMTEyMywxMSArMTEyMiw5IEBACiAJb2xkX2xlbiA9IFBBR0VfQUxJR04ob2xkX2VuZCkgLSBhZGRyOwogCW5ld19sZW4gPSBQQUdFX0FMSUdOKG5ld19lbmQpIC0gYWRkcjsKIAotCWRvd24oJmlhMzJfbW1hcF9zZW0pOwotCXsKLQkJcmV0ID0gc3lzX21yZW1hcChhZGRyLCBvbGRfbGVuLCBuZXdfbGVuLCBmbGFncywgbmV3X2FkZHIpOwotCX0KLQl1cCgmaWEzMl9tbWFwX3NlbSk7CisJbXV0ZXhfbG9jaygmaWEzMl9tbWFwX211dGV4KTsKKwlyZXQgPSBzeXNfbXJlbWFwKGFkZHIsIG9sZF9sZW4sIG5ld19sZW4sIGZsYWdzLCBuZXdfYWRkcik7CisJbXV0ZXhfdW5sb2NrKCZpYTMyX21tYXBfbXV0ZXgpOwogCiAJaWYgKChyZXQgPj0gMCkgJiYgKG9sZF9sZW4gPCBuZXdfbGVuKSkgewogCQkvKiBtcmVtYXAgZXhwYW5kZWQgc3VjY2Vzc2Z1bGx5ICovCkBAIC0xNDgxLDcgKzE0NzgsNyBAQAogewogCXN0cnVjdCBwdF9yZWdzICpjaGlsZF9yZWdzOwogCi0JY2hpbGRfcmVncyA9IGlhNjRfdGFza19yZWdzKGNoaWxkKTsKKwljaGlsZF9yZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAlzd2l0Y2ggKHJlZ25vIC8gc2l6ZW9mKGludCkpIHsKIAkgICAgICBjYXNlIFBUX0VCWDogcmV0dXJuIGNoaWxkX3JlZ3MtPnIxMTsKIAkgICAgICBjYXNlIFBUX0VDWDogcmV0dXJuIGNoaWxkX3JlZ3MtPnI5OwpAQCAtMTUwOSw3ICsxNTA2LDcgQEAKIHsKIAlzdHJ1Y3QgcHRfcmVncyAqY2hpbGRfcmVnczsKIAotCWNoaWxkX3JlZ3MgPSBpYTY0X3Rhc2tfcmVncyhjaGlsZCk7CisJY2hpbGRfcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CiAJc3dpdGNoIChyZWdubyAvIHNpemVvZihpbnQpKSB7CiAJICAgICAgY2FzZSBQVF9FQlg6IGNoaWxkX3JlZ3MtPnIxMSA9IHZhbHVlOyBicmVhazsKIAkgICAgICBjYXNlIFBUX0VDWDogY2hpbGRfcmVncy0+cjkgPSB2YWx1ZTsgYnJlYWs7CkBAIC0xNjI1LDcgKzE2MjIsNyBAQAogCSAqICBTdGFjayBmcmFtZXMgc3RhcnQgd2l0aCAxNi1ieXRlcyBvZiB0ZW1wIHNwYWNlCiAJICovCiAJc3dwID0gKHN0cnVjdCBzd2l0Y2hfc3RhY2sgKikodHNrLT50aHJlYWQua3NwICsgMTYpOwotCXB0cCA9IGlhNjRfdGFza19yZWdzKHRzayk7CisJcHRwID0gdGFza19wdF9yZWdzKHRzayk7CiAJdG9zID0gKHRzay0+dGhyZWFkLmZzciA+PiAxMSkgJiA3OwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCiAJCXB1dF9mcHJlZyhpLCAmc2F2ZS0+c3Rfc3BhY2VbaV0sIHB0cCwgc3dwLCB0b3MpOwpAQCAtMTY1OCw3ICsxNjU1LDcgQEAKIAkgKiAgU3RhY2sgZnJhbWVzIHN0YXJ0IHdpdGggMTYtYnl0ZXMgb2YgdGVtcCBzcGFjZQogCSAqLwogCXN3cCA9IChzdHJ1Y3Qgc3dpdGNoX3N0YWNrICopKHRzay0+dGhyZWFkLmtzcCArIDE2KTsKLQlwdHAgPSBpYTY0X3Rhc2tfcmVncyh0c2spOworCXB0cCA9IHRhc2tfcHRfcmVncyh0c2spOwogCXRvcyA9ICh0c2stPnRocmVhZC5mc3IgPj4gMTEpICYgNzsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQogCQlnZXRfZnByZWcoaSwgJnNhdmUtPnN0X3NwYWNlW2ldLCBwdHAsIHN3cCwgdG9zKTsKQEAgLTE2ODksNyArMTY4Niw3IEBACiAgICAgICAgICAqICBTdGFjayBmcmFtZXMgc3RhcnQgd2l0aCAxNi1ieXRlcyBvZiB0ZW1wIHNwYWNlCiAgICAgICAgICAqLwogICAgICAgICBzd3AgPSAoc3RydWN0IHN3aXRjaF9zdGFjayAqKSh0c2stPnRocmVhZC5rc3AgKyAxNik7Ci0gICAgICAgIHB0cCA9IGlhNjRfdGFza19yZWdzKHRzayk7CisgICAgICAgIHB0cCA9IHRhc2tfcHRfcmVncyh0c2spOwogCXRvcyA9ICh0c2stPnRocmVhZC5mc3IgPj4gMTEpICYgNzsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKIAkJcHV0X2ZwcmVnKGksIChzdHJ1Y3QgX2ZwcmVnX2lhMzIgX191c2VyICopJnNhdmUtPnN0X3NwYWNlWzQqaV0sIHB0cCwgc3dwLCB0b3MpOwpAQCAtMTczMyw3ICsxNzMwLDcgQEAKIAkgKiAgU3RhY2sgZnJhbWVzIHN0YXJ0IHdpdGggMTYtYnl0ZXMgb2YgdGVtcCBzcGFjZQogCSAqLwogCXN3cCA9IChzdHJ1Y3Qgc3dpdGNoX3N0YWNrICopKHRzay0+dGhyZWFkLmtzcCArIDE2KTsKLQlwdHAgPSBpYTY0X3Rhc2tfcmVncyh0c2spOworCXB0cCA9IHRhc2tfcHRfcmVncyh0c2spOwogCXRvcyA9ICh0c2stPnRocmVhZC5mc3IgPj4gMTEpICYgNzsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQogCWdldF9mcHJlZyhpLCAoc3RydWN0IF9mcHJlZ19pYTMyIF9fdXNlciAqKSZzYXZlLT5zdF9zcGFjZVs0KmldLCBwdHAsIHN3cCwgdG9zKTsKQEAgLTE3NjEsMjEgKzE3NTgsMTUgQEAKIAogCWxvY2tfa2VybmVsKCk7CiAJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1RSQUNFTUUpIHsKLQkJcmV0ID0gc3lzX3B0cmFjZShyZXF1ZXN0LCBwaWQsIGFkZHIsIGRhdGEpOworCQlyZXQgPSBwdHJhY2VfdHJhY2VtZSgpOwogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSAtRVNSQ0g7Ci0JcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQljaGlsZCA9IGZpbmRfdGFza19ieV9waWQocGlkKTsKLQlpZiAoY2hpbGQpCi0JCWdldF90YXNrX3N0cnVjdChjaGlsZCk7Ci0JcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotCWlmICghY2hpbGQpCisJY2hpbGQgPSBwdHJhY2VfZ2V0X3Rhc2tfc3RydWN0KHBpZCk7CisJaWYgKElTX0VSUihjaGlsZCkpIHsKKwkJcmV0ID0gUFRSX0VSUihjaGlsZCk7CiAJCWdvdG8gb3V0OwotCXJldCA9IC1FUEVSTTsKLQlpZiAocGlkID09IDEpCQkvKiBubyBtZXNzaW5nIGFyb3VuZCB3aXRoIGluaXQhICovCi0JCWdvdG8gb3V0X3RzazsKKwl9CiAKIAlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfQVRUQUNIKSB7CiAJCXJldCA9IHN5c19wdHJhY2UocmVxdWVzdCwgcGlkLCBhZGRyLCBkYXRhKTsKQEAgLTI1NTksMzQgKzI1NTAsNiBAQAogCXJldHVybiAwOwogfQogCi1hc21saW5rYWdlIGxvbmcKLXN5czMyX3RpbWVyX2NyZWF0ZSh1MzIgY2xvY2ssIHN0cnVjdCBjb21wYXRfc2lnZXZlbnQgX191c2VyICpzZTMyLCB0aW1lcl90IF9fdXNlciAqdGltZXJfaWQpCi17Ci0Jc3RydWN0IHNpZ2V2ZW50IHNlOwotCW1tX3NlZ21lbnRfdCBvbGRmczsKLQl0aW1lcl90IHQ7Ci0JbG9uZyBlcnI7Ci0KLQlpZiAoc2UzMiA9PSBOVUxMKQotCQlyZXR1cm4gc3lzX3RpbWVyX2NyZWF0ZShjbG9jaywgTlVMTCwgdGltZXJfaWQpOwotCi0JaWYgKGdldF9jb21wYXRfc2lnZXZlbnQoJnNlLCBzZTMyKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsdGltZXJfaWQsc2l6ZW9mKHRpbWVyX3QpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlvbGRmcyA9IGdldF9mcygpOwotCXNldF9mcyhLRVJORUxfRFMpOwotCWVyciA9IHN5c190aW1lcl9jcmVhdGUoY2xvY2ssIChzdHJ1Y3Qgc2lnZXZlbnQgX191c2VyICopICZzZSwgKHRpbWVyX3QgX191c2VyICopICZ0KTsKLQlzZXRfZnMob2xkZnMpOwotCi0JaWYgKCFlcnIpCi0JCWVyciA9IF9fcHV0X3VzZXIgKHQsIHRpbWVyX2lkKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KIGxvbmcgc3lzMzJfZmFkdmlzZTY0XzY0KGludCBmZCwgX191MzIgb2Zmc2V0X2xvdywgX191MzIgb2Zmc2V0X2hpZ2gsIAogCQkJX191MzIgbGVuX2xvdywgX191MzIgbGVuX2hpZ2gsIGludCBhZHZpY2UpCiB7IApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvaWE2NC9rZXJuZWwvTWFrZWZpbGUKaW5kZXggMzA3NTE0Zi4uMDlhMGRiYyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL2lhNjQva2VybmVsL01ha2VmaWxlCkBAIC0xMyw2ICsxMywxMSBAQAogb2JqLSQoQ09ORklHX0lBNjRfR0VORVJJQykJKz0gYWNwaS1leHQubwogb2JqLSQoQ09ORklHX0lBNjRfSFBfWlgxKQkrPSBhY3BpLWV4dC5vCiBvYmotJChDT05GSUdfSUE2NF9IUF9aWDFfU1dJT1RMQikgKz0gYWNwaS1leHQubworCitpZm5lcSAoJChDT05GSUdfQUNQSV9QUk9DRVNTT1IpLCkKK29iai15CQkJCSs9IGFjcGktcHJvY2Vzc29yLm8KK2VuZGlmCisKIG9iai0kKENPTkZJR19JQTY0X1BBTElORk8pCSs9IHBhbGluZm8ubwogb2JqLSQoQ09ORklHX0lPU0FQSUMpCQkrPSBpb3NhcGljLm8KIG9iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gbW9kdWxlLm8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS1leHQuYyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS1leHQuYwppbmRleCAxM2E1YjNiLi40YTU1NzRmIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2FjcGktZXh0LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLWV4dC5jCkBAIC0zMywzMyArMzMsMzMgQEAKIAlzdHJ1Y3QgYWNwaV92ZW5kb3JfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYWNwaV92ZW5kb3JfaW5mbyAqKWNvbnRleHQ7CiAJc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yICp2ZW5kb3I7CiAJc3RydWN0IGFjcGlfdmVuZG9yX2Rlc2NyaXB0b3IgKmRlc2NyaXB0b3I7Ci0JdTMyIGxlbmd0aDsKKwl1MzIgYnl0ZV9sZW5ndGg7CiAKLQlpZiAocmVzb3VyY2UtPmlkICE9IEFDUElfUlNUWVBFX1ZFTkRPUikKKwlpZiAocmVzb3VyY2UtPnR5cGUgIT0gQUNQSV9SRVNPVVJDRV9UWVBFX1ZFTkRPUikKIAkJcmV0dXJuIEFFX09LOwogCiAJdmVuZG9yID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvciAqKSZyZXNvdXJjZS0+ZGF0YTsKLQlkZXNjcmlwdG9yID0gKHN0cnVjdCBhY3BpX3ZlbmRvcl9kZXNjcmlwdG9yICopdmVuZG9yLT5yZXNlcnZlZDsKLQlpZiAodmVuZG9yLT5sZW5ndGggPD0gc2l6ZW9mKCppbmZvLT5kZXNjcmlwdG9yKSB8fAorCWRlc2NyaXB0b3IgPSAoc3RydWN0IGFjcGlfdmVuZG9yX2Rlc2NyaXB0b3IgKil2ZW5kb3ItPmJ5dGVfZGF0YTsKKwlpZiAodmVuZG9yLT5ieXRlX2xlbmd0aCA8PSBzaXplb2YoKmluZm8tPmRlc2NyaXB0b3IpIHx8CiAJICAgIGRlc2NyaXB0b3ItPmd1aWRfaWQgIT0gaW5mby0+ZGVzY3JpcHRvci0+Z3VpZF9pZCB8fAogCSAgICBlZmlfZ3VpZGNtcChkZXNjcmlwdG9yLT5ndWlkLCBpbmZvLT5kZXNjcmlwdG9yLT5ndWlkKSkKIAkJcmV0dXJuIEFFX09LOwogCi0JbGVuZ3RoID0gdmVuZG9yLT5sZW5ndGggLSBzaXplb2Yoc3RydWN0IGFjcGlfdmVuZG9yX2Rlc2NyaXB0b3IpOwotCWluZm8tPmRhdGEgPSBhY3BpX29zX2FsbG9jYXRlKGxlbmd0aCk7CisJYnl0ZV9sZW5ndGggPSB2ZW5kb3ItPmJ5dGVfbGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBhY3BpX3ZlbmRvcl9kZXNjcmlwdG9yKTsKKwlpbmZvLT5kYXRhID0gYWNwaV9vc19hbGxvY2F0ZShieXRlX2xlbmd0aCk7CiAJaWYgKCFpbmZvLT5kYXRhKQogCQlyZXR1cm4gQUVfTk9fTUVNT1JZOwogCiAJbWVtY3B5KGluZm8tPmRhdGEsCi0JICAgICAgIHZlbmRvci0+cmVzZXJ2ZWQgKyBzaXplb2Yoc3RydWN0IGFjcGlfdmVuZG9yX2Rlc2NyaXB0b3IpLAotCSAgICAgICBsZW5ndGgpOwotCWluZm8tPmxlbmd0aCA9IGxlbmd0aDsKKwkgICAgICAgdmVuZG9yLT5ieXRlX2RhdGEgKyBzaXplb2Yoc3RydWN0IGFjcGlfdmVuZG9yX2Rlc2NyaXB0b3IpLAorCSAgICAgICBieXRlX2xlbmd0aCk7CisJaW5mby0+bGVuZ3RoID0gYnl0ZV9sZW5ndGg7CiAJcmV0dXJuIEFFX0NUUkxfVEVSTUlOQVRFOwogfQogCiBhY3BpX3N0YXR1cwogYWNwaV9maW5kX3ZlbmRvcl9yZXNvdXJjZShhY3BpX2hhbmRsZSBvYmosIHN0cnVjdCBhY3BpX3ZlbmRvcl9kZXNjcmlwdG9yICogaWQsCi0JCQkgIHU4ICoqIGRhdGEsIHUzMiAqIGxlbmd0aCkKKwkJCSAgdTggKiogZGF0YSwgdTMyICogYnl0ZV9sZW5ndGgpCiB7CiAJc3RydWN0IGFjcGlfdmVuZG9yX2luZm8gaW5mbzsKIApAQCAtNzIsNyArNzIsNyBAQAogCQlyZXR1cm4gQUVfTk9UX0ZPVU5EOwogCiAJKmRhdGEgPSBpbmZvLmRhdGE7Ci0JKmxlbmd0aCA9IGluZm8ubGVuZ3RoOworCSpieXRlX2xlbmd0aCA9IGluZm8ubGVuZ3RoOwogCXJldHVybiBBRV9PSzsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLXByb2Nlc3Nvci5jIGIvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLXByb2Nlc3Nvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ODM2MzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2lhNjQva2VybmVsL2FjcGktcHJvY2Vzc29yLmMKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIGFyY2gvaWE2NC9rZXJuZWwvY3B1ZnJlcS9wcm9jZXNzb3IuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbgorICogCVZlbmthdGVzaCBQYWxsaXBhZGkgPHZlbmthdGVzaC5wYWxsaXBhZGlAaW50ZWwuY29tPgorICogCS0gQWRkZWQgX1BEQyBmb3IgcGxhdGZvcm1zIHdpdGggSW50ZWwgQ1BVcworICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorCisjaW5jbHVkZSA8YWNwaS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vYWNwaS5oPgorCitzdGF0aWMgdm9pZCBpbml0X2ludGVsX3BkYyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQoreworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpvYmpfbGlzdDsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCXUzMiAqYnVmOworCisJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcGRjLiBJdCB3aWxsIGJlIHVzZWQgbGF0ZXIuICovCisJb2JqX2xpc3QgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCksIEdGUF9LRVJORUwpOworCWlmICghb2JqX2xpc3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNZW1vcnkgYWxsb2NhdGlvbiBlcnJvclxuIik7CisJCXJldHVybjsKKwl9CisKKwlvYmogPSBrbWFsbG9jKHNpemVvZih1bmlvbiBhY3BpX29iamVjdCksIEdGUF9LRVJORUwpOworCWlmICghb2JqKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTWVtb3J5IGFsbG9jYXRpb24gZXJyb3JcbiIpOworCQlrZnJlZShvYmpfbGlzdCk7CisJCXJldHVybjsKKwl9CisKKwlidWYgPSBrbWFsbG9jKDEyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlwcmludGsoS0VSTl9FUlIgIk1lbW9yeSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKwkJa2ZyZWUob2JqKTsKKwkJa2ZyZWUob2JqX2xpc3QpOworCQlyZXR1cm47CisJfQorCisJYnVmWzBdID0gQUNQSV9QRENfUkVWSVNJT05fSUQ7CisJYnVmWzFdID0gMTsKKwlidWZbMl0gfD0gQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfU01QOworCisJb2JqLT50eXBlID0gQUNQSV9UWVBFX0JVRkZFUjsKKwlvYmotPmJ1ZmZlci5sZW5ndGggPSAxMjsKKwlvYmotPmJ1ZmZlci5wb2ludGVyID0gKHU4ICopIGJ1ZjsKKwlvYmpfbGlzdC0+Y291bnQgPSAxOworCW9ial9saXN0LT5wb2ludGVyID0gb2JqOworCXByLT5wZGMgPSBvYmpfbGlzdDsKKworCXJldHVybjsKK30KKworLyogSW5pdGlhbGl6ZSBfUERDIGRhdGEgYmFzZWQgb24gdGhlIENQVSB2ZW5kb3IgKi8KK3ZvaWQgYXJjaF9hY3BpX3Byb2Nlc3Nvcl9pbml0X3BkYyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQoreworCXByLT5wZGMgPSBOVUxMOworCWluaXRfaW50ZWxfcGRjKHByKTsKKwlyZXR1cm47Cit9CisKK0VYUE9SVF9TWU1CT0woYXJjaF9hY3BpX3Byb2Nlc3Nvcl9pbml0X3BkYyk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2FjcGkuYyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCmluZGV4IDlhZDk0ZGQuLmQyNzAyYzQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCkBAIC01NjcsMTYgKzU2NywxNiBAQAogICogc3VjY2VzczogcmV0dXJuIElSUSBudW1iZXIgKD49MCkKICAqIGZhaWx1cmU6IHJldHVybiA8IDAKICAqLwotaW50IGFjcGlfcmVnaXN0ZXJfZ3NpKHUzMiBnc2ksIGludCBlZGdlX2xldmVsLCBpbnQgYWN0aXZlX2hpZ2hfbG93KQoraW50IGFjcGlfcmVnaXN0ZXJfZ3NpKHUzMiBnc2ksIGludCB0cmlnZ2VyaW5nLCBpbnQgcG9sYXJpdHkpCiB7CiAJaWYgKGhhc184MjU5ICYmIGdzaSA8IDE2KQogCQlyZXR1cm4gaXNhX2lycV90b192ZWN0b3IoZ3NpKTsKIAogCXJldHVybiBpb3NhcGljX3JlZ2lzdGVyX2ludHIoZ3NpLAotCQkJCSAgICAgKGFjdGl2ZV9oaWdoX2xvdyA9PQorCQkJCSAgICAgKHBvbGFyaXR5ID09CiAJCQkJICAgICAgQUNQSV9BQ1RJVkVfSElHSCkgPyBJT1NBUElDX1BPTF9ISUdIIDoKIAkJCQkgICAgIElPU0FQSUNfUE9MX0xPVywKLQkJCQkgICAgIChlZGdlX2xldmVsID09CisJCQkJICAgICAodHJpZ2dlcmluZyA9PQogCQkJCSAgICAgIEFDUElfRURHRV9TRU5TSVRJVkUpID8gSU9TQVBJQ19FREdFIDoKIAkJCQkgICAgIElPU0FQSUNfTEVWRUwpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9jcHVmcmVxL01ha2VmaWxlIGIvYXJjaC9pYTY0L2tlcm5lbC9jcHVmcmVxL01ha2VmaWxlCmluZGV4IGY3NDhkMzQuLjQ4MzhmMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvY3B1ZnJlcS9NYWtlZmlsZQorKysgYi9hcmNoL2lhNjQva2VybmVsL2NwdWZyZXEvTWFrZWZpbGUKQEAgLTEgKzEsMiBAQAogb2JqLSQoQ09ORklHX0lBNjRfQUNQSV9DUFVGUkVRKQkJKz0gYWNwaS1jcHVmcmVxLm8KKwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCmluZGV4IGRhNGQ1Y2YuLjVhMWJmODEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKQEAgLTI2OSw0OCArMjY5LDYgQEAKIH0KIAogCi0vKgotICogcHJvY2Vzc29yX2luaXRfcGRjIC0gbGV0IEJJT1Mga25vdyBhYm91dCB0aGUgU01QIGNhcGFiaWxpdGllcwotICogb2YgdGhpcyBkcml2ZXIKLSAqIEBwZXJmOiBwcm9jZXNzb3Itc3BlY2lmaWMgYWNwaV9pb19kYXRhIHN0cnVjdAotICogQGNwdTogQ1BVIGJlaW5nIGluaXRpYWxpemVkCi0gKgotICogVG8gYXZvaWQgaXNzdWVzIHdpdGggbGVnYWN5IE9TZXMsIHNvbWUgQklPU2VzIHJlcXVpcmUgdG8gYmUgaW5mb3JtZWQgb2YKLSAqIHRoZSBTTVAgY2FwYWJpbGl0aWVzIG9mIE9TIFAtc3RhdGUgZHJpdmVyLiBIZXJlIHdlIHNldCB0aGUgYml0cyBpbiBfUERDCi0gKiBhY2NvcmRpbmdseS4gQWN0dWFsIGNhbGwgdG8gX1BEQyBpcyBkb25lIGluIGRyaXZlci9hY3BpL3Byb2Nlc3Nvci5jCi0gKi8KLXN0YXRpYyB2b2lkCi1wcm9jZXNzb3JfaW5pdF9wZGMgKAotCQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UgKnBlcmYsCi0JCXVuc2lnbmVkIGludCBjcHUsCi0JCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpvYmpfbGlzdAotCQkpCi17Ci0JdW5pb24gYWNwaV9vYmplY3QgKm9iajsKLQl1MzIgKmJ1ZjsKLQotCWRwcmludGsoInByb2Nlc3Nvcl9pbml0X3BkY1xuIik7Ci0KLQlwZXJmLT5wZGMgPSBOVUxMOwotCS8qIEluaXRpYWxpemUgcGRjLiBJdCB3aWxsIGJlIHVzZWQgbGF0ZXIuICovCi0JaWYgKCFvYmpfbGlzdCkKLQkJcmV0dXJuOwotCi0JaWYgKCEob2JqX2xpc3QtPmNvdW50ICYmIG9ial9saXN0LT5wb2ludGVyKSkKLQkJcmV0dXJuOwotCi0Jb2JqID0gb2JqX2xpc3QtPnBvaW50ZXI7Ci0JaWYgKChvYmotPmJ1ZmZlci5sZW5ndGggPT0gMTIpICYmIG9iai0+YnVmZmVyLnBvaW50ZXIpIHsKLQkJYnVmID0gKHUzMiAqKW9iai0+YnVmZmVyLnBvaW50ZXI7Ci0gICAgICAgCQlidWZbMF0gPSBBQ1BJX1BEQ19SRVZJU0lPTl9JRDsKLSAgICAgICAJCWJ1ZlsxXSA9IDE7Ci0gICAgICAgCQlidWZbMl0gPSBBQ1BJX1BEQ19FU1RfQ0FQQUJJTElUWV9TTVA7Ci0JCXBlcmYtPnBkYyA9IG9ial9saXN0OwotCX0KLQlyZXR1cm47Ci19Ci0KLQogc3RhdGljIGludAogYWNwaV9jcHVmcmVxX2NwdV9pbml0ICgKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgICAqcG9saWN5KQpAQCAtMzIwLDE0ICsyNzgsNyBAQAogCXN0cnVjdCBjcHVmcmVxX2FjcGlfaW8JKmRhdGE7CiAJdW5zaWduZWQgaW50CQlyZXN1bHQgPSAwOwogCi0JdW5pb24gYWNwaV9vYmplY3QJCWFyZzAgPSB7QUNQSV9UWVBFX0JVRkZFUn07Ci0JdTMyCQkJCWFyZzBfYnVmWzNdOwotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IAlhcmdfbGlzdCA9IHsxLCAmYXJnMH07Ci0KIAlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfY3B1X2luaXRcbiIpOwotCS8qIHNldHVwIGFyZ19saXN0IGZvciBfUERDIHNldHRpbmdzICovCi0gICAgICAgIGFyZzAuYnVmZmVyLmxlbmd0aCA9IDEyOwotICAgICAgICBhcmcwLmJ1ZmZlci5wb2ludGVyID0gKHU4ICopIGFyZzBfYnVmOwogCiAJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2FjcGlfaW8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpCkBAIC0zMzcsOSArMjg4LDcgQEAKIAogCWFjcGlfaW9fZGF0YVtjcHVdID0gZGF0YTsKIAotCXByb2Nlc3Nvcl9pbml0X3BkYygmZGF0YS0+YWNwaV9kYXRhLCBjcHUsICZhcmdfbGlzdCk7CiAJcmVzdWx0ID0gYWNwaV9wcm9jZXNzb3JfcmVnaXN0ZXJfcGVyZm9ybWFuY2UoJmRhdGEtPmFjcGlfZGF0YSwgY3B1KTsKLQlkYXRhLT5hY3BpX2RhdGEucGRjID0gTlVMTDsKIAogCWlmIChyZXN1bHQpCiAJCWdvdG8gZXJyX2ZyZWU7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2VmaS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9lZmkuYwppbmRleCBhM2FhNDVjLi5jNDg1YTNiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2VmaS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvZWZpLmMKQEAgLTI0Nyw2ICsyNDcsMzIgQEAKIAogc3RhdGljIGtlcm5fbWVtZGVzY190ICprZXJuX21lbW1hcDsKIAorI2RlZmluZSBlZmlfbWRfc2l6ZShtZCkJKG1kLT5udW1fcGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQpCisKK3N0YXRpYyBpbmxpbmUgdTY0CitrbWRfZW5kKGtlcm5fbWVtZGVzY190ICprbWQpCit7CisJcmV0dXJuIChrbWQtPnN0YXJ0ICsgKGttZC0+bnVtX3BhZ2VzIDw8IEVGSV9QQUdFX1NISUZUKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0CitlZmlfbWRfZW5kKGVmaV9tZW1vcnlfZGVzY190ICptZCkKK3sKKwlyZXR1cm4gKG1kLT5waHlzX2FkZHIgKyBlZmlfbWRfc2l6ZShtZCkpOworfQorCitzdGF0aWMgaW5saW5lIGludAorZWZpX3diKGVmaV9tZW1vcnlfZGVzY190ICptZCkKK3sKKwlyZXR1cm4gKG1kLT5hdHRyaWJ1dGUgJiBFRklfTUVNT1JZX1dCKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2VmaV91YyhlZmlfbWVtb3J5X2Rlc2NfdCAqbWQpCit7CisJcmV0dXJuIChtZC0+YXR0cmlidXRlICYgRUZJX01FTU9SWV9VQyk7Cit9CisKIHN0YXRpYyB2b2lkCiB3YWxrIChlZmlfZnJlZW1lbV9jYWxsYmFja190IGNhbGxiYWNrLCB2b2lkICphcmcsIHU2NCBhdHRyKQogewpAQCAtNTk1LDggKzYyMSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXUzMgotZWZpX21lbV90eXBlICh1bnNpZ25lZCBsb25nIHBoeXNfYWRkcikKK3N0YXRpYyBlZmlfbWVtb3J5X2Rlc2NfdCAqCitlZmlfbWVtb3J5X2Rlc2NyaXB0b3IgKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyKQogewogCXZvaWQgKmVmaV9tYXBfc3RhcnQsICplZmlfbWFwX2VuZCwgKnA7CiAJZWZpX21lbW9yeV9kZXNjX3QgKm1kOwpAQCAtNjEwLDU1ICs2MzYsMTE3IEBACiAJCW1kID0gcDsKIAogCQlpZiAocGh5c19hZGRyIC0gbWQtPnBoeXNfYWRkciA8IChtZC0+bnVtX3BhZ2VzIDw8IEVGSV9QQUdFX1NISUZUKSkKLQkJCSByZXR1cm4gbWQtPnR5cGU7CisJCQkgcmV0dXJuIG1kOwogCX0KIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludAorZWZpX21lbW1hcF9oYXNfbW1pbyAodm9pZCkKK3sKKwl2b2lkICplZmlfbWFwX3N0YXJ0LCAqZWZpX21hcF9lbmQsICpwOworCWVmaV9tZW1vcnlfZGVzY190ICptZDsKKwl1NjQgZWZpX2Rlc2Nfc2l6ZTsKKworCWVmaV9tYXBfc3RhcnQgPSBfX3ZhKGlhNjRfYm9vdF9wYXJhbS0+ZWZpX21lbW1hcCk7CisJZWZpX21hcF9lbmQgICA9IGVmaV9tYXBfc3RhcnQgKyBpYTY0X2Jvb3RfcGFyYW0tPmVmaV9tZW1tYXBfc2l6ZTsKKwllZmlfZGVzY19zaXplID0gaWE2NF9ib290X3BhcmFtLT5lZmlfbWVtZGVzY19zaXplOworCisJZm9yIChwID0gZWZpX21hcF9zdGFydDsgcCA8IGVmaV9tYXBfZW5kOyBwICs9IGVmaV9kZXNjX3NpemUpIHsKKwkJbWQgPSBwOworCisJCWlmIChtZC0+dHlwZSA9PSBFRklfTUVNT1JZX01BUFBFRF9JTykKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKwordTMyCitlZmlfbWVtX3R5cGUgKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyKQoreworCWVmaV9tZW1vcnlfZGVzY190ICptZCA9IGVmaV9tZW1vcnlfZGVzY3JpcHRvcihwaHlzX2FkZHIpOworCisJaWYgKG1kKQorCQlyZXR1cm4gbWQtPnR5cGU7CisJcmV0dXJuIDA7Cit9CisKIHU2NAogZWZpX21lbV9hdHRyaWJ1dGVzICh1bnNpZ25lZCBsb25nIHBoeXNfYWRkcikKIHsKLQl2b2lkICplZmlfbWFwX3N0YXJ0LCAqZWZpX21hcF9lbmQsICpwOwotCWVmaV9tZW1vcnlfZGVzY190ICptZDsKLQl1NjQgZWZpX2Rlc2Nfc2l6ZTsKKwllZmlfbWVtb3J5X2Rlc2NfdCAqbWQgPSBlZmlfbWVtb3J5X2Rlc2NyaXB0b3IocGh5c19hZGRyKTsKIAotCWVmaV9tYXBfc3RhcnQgPSBfX3ZhKGlhNjRfYm9vdF9wYXJhbS0+ZWZpX21lbW1hcCk7Ci0JZWZpX21hcF9lbmQgICA9IGVmaV9tYXBfc3RhcnQgKyBpYTY0X2Jvb3RfcGFyYW0tPmVmaV9tZW1tYXBfc2l6ZTsKLQllZmlfZGVzY19zaXplID0gaWE2NF9ib290X3BhcmFtLT5lZmlfbWVtZGVzY19zaXplOwotCi0JZm9yIChwID0gZWZpX21hcF9zdGFydDsgcCA8IGVmaV9tYXBfZW5kOyBwICs9IGVmaV9kZXNjX3NpemUpIHsKLQkJbWQgPSBwOwotCi0JCWlmIChwaHlzX2FkZHIgLSBtZC0+cGh5c19hZGRyIDwgKG1kLT5udW1fcGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQpKQotCQkJcmV0dXJuIG1kLT5hdHRyaWJ1dGU7Ci0JfQorCWlmIChtZCkKKwkJcmV0dXJuIG1kLT5hdHRyaWJ1dGU7CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGVmaV9tZW1fYXR0cmlidXRlcyk7CiAKKy8qCisgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG1lbW9yeSBhdCBwaHlzX2FkZHIgc3VwcG9ydHMgdGhlIGRlc2lyZWQKKyAqIGF0dHJpYnV0ZSAoV0IsIFVDLCBldGMpLiAgSWYgdGhpcyByZXR1cm5zIDEsIHRoZSBjYWxsZXIgY2FuIHNhZmVseQorICogYWNjZXNzICpzaXplIGJ5dGVzIGF0IHBoeXNfYWRkciB3aXRoIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlLgorICovCitzdGF0aWMgaW50CitlZmlfbWVtX2F0dHJpYnV0ZV9yYW5nZSAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgKnNpemUsIHU2NCBhdHRyKQoreworCWVmaV9tZW1vcnlfZGVzY190ICptZCA9IGVmaV9tZW1vcnlfZGVzY3JpcHRvcihwaHlzX2FkZHIpOworCXVuc2lnbmVkIGxvbmcgbWRfZW5kOworCisJaWYgKCFtZCB8fCAobWQtPmF0dHJpYnV0ZSAmIGF0dHIpICE9IGF0dHIpCisJCXJldHVybiAwOworCisJZG8geworCQltZF9lbmQgPSBlZmlfbWRfZW5kKG1kKTsKKwkJaWYgKHBoeXNfYWRkciArICpzaXplIDw9IG1kX2VuZCkKKwkJCXJldHVybiAxOworCisJCW1kID0gZWZpX21lbW9yeV9kZXNjcmlwdG9yKG1kX2VuZCk7CisJCWlmICghbWQgfHwgKG1kLT5hdHRyaWJ1dGUgJiBhdHRyKSAhPSBhdHRyKSB7CisJCQkqc2l6ZSA9IG1kX2VuZCAtIHBoeXNfYWRkcjsKKwkJCXJldHVybiAxOworCQl9CisJfSB3aGlsZSAobWQpOworCXJldHVybiAwOworfQorCisvKgorICogRm9yIC9kZXYvbWVtLCB3ZSBvbmx5IGFsbG93IHJlYWQgJiB3cml0ZSBzeXN0ZW0gY2FsbHMgdG8gYWNjZXNzCisgKiB3cml0ZS1iYWNrIG1lbW9yeSwgYmVjYXVzZSByZWFkICYgd3JpdGUgZG9uJ3QgYWxsb3cgdGhlIHVzZXIgdG8KKyAqIGNvbnRyb2wgYWNjZXNzIHNpemUuCisgKi8KIGludAogdmFsaWRfcGh5c19hZGRyX3JhbmdlICh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKIHsKLQl2b2lkICplZmlfbWFwX3N0YXJ0LCAqZWZpX21hcF9lbmQsICpwOwotCWVmaV9tZW1vcnlfZGVzY190ICptZDsKLQl1NjQgZWZpX2Rlc2Nfc2l6ZTsKKwlyZXR1cm4gZWZpX21lbV9hdHRyaWJ1dGVfcmFuZ2UocGh5c19hZGRyLCBzaXplLCBFRklfTUVNT1JZX1dCKTsKK30KIAotCWVmaV9tYXBfc3RhcnQgPSBfX3ZhKGlhNjRfYm9vdF9wYXJhbS0+ZWZpX21lbW1hcCk7Ci0JZWZpX21hcF9lbmQgICA9IGVmaV9tYXBfc3RhcnQgKyBpYTY0X2Jvb3RfcGFyYW0tPmVmaV9tZW1tYXBfc2l6ZTsKLQllZmlfZGVzY19zaXplID0gaWE2NF9ib290X3BhcmFtLT5lZmlfbWVtZGVzY19zaXplOworLyoKKyAqIFdlIGFsbG93IG1tYXAgb2YgYW55dGhpbmcgaW4gdGhlIEVGSSBtZW1vcnkgbWFwIHRoYXQgc3VwcG9ydHMKKyAqIGVpdGhlciB3cml0ZS1iYWNrIG9yIHVuY2FjaGVhYmxlIGFjY2Vzcy4gIEZvciB1bmNhY2hlYWJsZSByZWdpb25zLAorICogdGhlIHN1cHBvcnRlZCBhY2Nlc3Mgc2l6ZXMgYXJlIHN5c3RlbS1kZXBlbmRlbnQsIGFuZCB0aGUgdXNlciBpcworICogcmVzcG9uc2libGUgZm9yIHVzaW5nIHRoZSBjb3JyZWN0IHNpemUuCisgKgorICogTm90ZSB0aGF0IHRoaXMgZG9lc24ndCBjdXJyZW50bHkgYWxsb3cgYWNjZXNzIHRvIGhvdC1hZGRlZCBtZW1vcnksCisgKiBiZWNhdXNlIHRoYXQgZG9lc24ndCBhcHBlYXIgaW4gdGhlIGJvb3QtdGltZSBFRkkgbWVtb3J5IG1hcC4KKyAqLworaW50Cit2YWxpZF9tbWFwX3BoeXNfYWRkcl9yYW5nZSAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgKnNpemUpCit7CisJaWYgKGVmaV9tZW1fYXR0cmlidXRlX3JhbmdlKHBoeXNfYWRkciwgc2l6ZSwgRUZJX01FTU9SWV9XQikpCisJCXJldHVybiAxOwogCi0JZm9yIChwID0gZWZpX21hcF9zdGFydDsgcCA8IGVmaV9tYXBfZW5kOyBwICs9IGVmaV9kZXNjX3NpemUpIHsKLQkJbWQgPSBwOworCWlmIChlZmlfbWVtX2F0dHJpYnV0ZV9yYW5nZShwaHlzX2FkZHIsIHNpemUsIEVGSV9NRU1PUllfVUMpKQorCQlyZXR1cm4gMTsKIAotCQlpZiAocGh5c19hZGRyIC0gbWQtPnBoeXNfYWRkciA8IChtZC0+bnVtX3BhZ2VzIDw8IEVGSV9QQUdFX1NISUZUKSkgewotCQkJaWYgKCEobWQtPmF0dHJpYnV0ZSAmIEVGSV9NRU1PUllfV0IpKQotCQkJCXJldHVybiAwOworCS8qCisJICogU29tZSBmaXJtd2FyZSBkb2Vzbid0IHJlcG9ydCBNTUlPIHJlZ2lvbnMgaW4gdGhlIEVGSSBtZW1vcnkgbWFwLgorCSAqIFRoZSBJbnRlbCBCaWdTdXIgKGEuay5hLiBIUCBpMjAwMCkgaGFzIHRoaXMgcHJvYmxlbS4gIEluIHRoaXMKKwkgKiBjYXNlLCB3ZSBjYW4ndCB1c2UgdGhlIEVGSSBtZW1vcnkgbWFwIHRvIHZhbGlkYXRlIG1tYXAgcmVxdWVzdHMuCisJICovCisJaWYgKCFlZmlfbWVtbWFwX2hhc19tbWlvKCkpCisJCXJldHVybiAxOwogCi0JCQlpZiAoKnNpemUgPiBtZC0+cGh5c19hZGRyICsgKG1kLT5udW1fcGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQpIC0gcGh5c19hZGRyKQotCQkJCSpzaXplID0gbWQtPnBoeXNfYWRkciArIChtZC0+bnVtX3BhZ2VzIDw8IEVGSV9QQUdFX1NISUZUKSAtIHBoeXNfYWRkcjsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQogCXJldHVybiAwOwogfQogCkBAIC03MDcsMzIgKzc5NSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNkZWZpbmUgZWZpX21kX3NpemUobWQpCShtZC0+bnVtX3BhZ2VzIDw8IEVGSV9QQUdFX1NISUZUKQotCi1zdGF0aWMgaW5saW5lIHU2NAota21kX2VuZChrZXJuX21lbWRlc2NfdCAqa21kKQotewotCXJldHVybiAoa21kLT5zdGFydCArIChrbWQtPm51bV9wYWdlcyA8PCBFRklfUEFHRV9TSElGVCkpOwotfQotCi1zdGF0aWMgaW5saW5lIHU2NAotZWZpX21kX2VuZChlZmlfbWVtb3J5X2Rlc2NfdCAqbWQpCi17Ci0JcmV0dXJuIChtZC0+cGh5c19hZGRyICsgZWZpX21kX3NpemUobWQpKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWVmaV93YihlZmlfbWVtb3J5X2Rlc2NfdCAqbWQpCi17Ci0JcmV0dXJuIChtZC0+YXR0cmlidXRlICYgRUZJX01FTU9SWV9XQik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1lZmlfdWMoZWZpX21lbW9yeV9kZXNjX3QgKm1kKQotewotCXJldHVybiAobWQtPmF0dHJpYnV0ZSAmIEVGSV9NRU1PUllfVUMpOwotfQotCiAvKgogICogTG9vayBmb3IgdGhlIGZpcnN0IGdyYW51bGUgYWxpZ25lZCBtZW1vcnkgZGVzY3JpcHRvciBtZW1vcnkKICAqIHRoYXQgaXMgYmlnIGVub3VnaCB0byBob2xkIEVGSSBtZW1vcnkgbWFwLiBNYWtlIHN1cmUgdGhpcwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9pYTY0L2tlcm5lbC9lbnRyeS5TCmluZGV4IDA3NDFiMDY2Li43YTZmZmQ2IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9lbnRyeS5TCkBAIC0xNjAwLDUgKzE2MDAsNiBAQAogCWRhdGE4IHN5c19pbm90aWZ5X2luaXQKIAlkYXRhOCBzeXNfaW5vdGlmeV9hZGRfd2F0Y2gKIAlkYXRhOCBzeXNfaW5vdGlmeV9ybV93YXRjaAorCWRhdGE4IHN5c19taWdyYXRlX3BhZ2VzCQkJLy8gMTI4MAogCiAJLm9yZyBzeXNfY2FsbF90YWJsZSArIDgqTlJfc3lzY2FsbHMJLy8gZ3VhcmQgYWdhaW5zdCBmYWlsdXJlcyB0byBpbmNyZWFzZSBOUl9zeXNjYWxscwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9mc3lzLlMgYi9hcmNoL2lhNjQva2VybmVsL2ZzeXMuUwppbmRleCAyZGRiYWM2Li5jZTQyMzkxIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2ZzeXMuUworKysgYi9hcmNoL2lhNjQva2VybmVsL2ZzeXMuUwpAQCAtOTAzLDUgKzkwMyw2IEBACiAJZGF0YTggMAogCWRhdGE4IDAKIAlkYXRhOCAwCisJZGF0YTggMAkJCQkJCQkvLyAxMjgwCiAKIAkub3JnIGZzeXNjYWxsX3RhYmxlICsgOCpOUl9zeXNjYWxscwkvLyBndWFyZCBhZ2FpbnN0IGZhaWx1cmVzIHRvIGluY3JlYXNlIE5SX3N5c2NhbGxzCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2hlYWQuUyBiL2FyY2gvaWE2NC9rZXJuZWwvaGVhZC5TCmluZGV4IGJmZTY1YjIuLmZiYzdlYTMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvaGVhZC5TCkBAIC0xMDYwLDcgKzEwNjAsNyBAQAogCSAqIHRoZSBjbG9iYmVyIGxpc3RzIGZvciBzcGluX2xvY2soKSBpbiBpbmNsdWRlL2FzbS1pYTY0L3NwaW5sb2NrLmguCiAJICovCiAKLSNpZiBfX0dOVUNfXyA8IDMgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPCAzKQorI2lmIChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fIDwgMykKIAogR0xPQkFMX0VOVFJZKGlhNjRfc3BpbmxvY2tfY29udGVudGlvbl9wcmUzXzQpCiAJLnByb2xvZ3VlCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2lhNjRfa3N5bXMuYyBiL2FyY2gvaWE2NC9rZXJuZWwvaWE2NF9rc3ltcy5jCmluZGV4IDVkYjlkM2IuLmU3MmRlNTggMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvaWE2NF9rc3ltcy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvaWE2NF9rc3ltcy5jCkBAIC0xMDMsNyArMTAzLDcgQEAKIAogI2lmZGVmIEFTTV9TVVBQT1JURUQKICMgaWZkZWYgQ09ORklHX1NNUAotIyAgaWYgX19HTlVDX18gPCAzIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fIDwgMykKKyMgIGlmIChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fIDwgMykKIC8qCiAgKiBUaGlzIGlzIG5vdCBhIG5vcm1hbCByb3V0aW5lIGFuZCB3ZSBkb24ndCB3YW50IGEgZnVuY3Rpb24gZGVzY3JpcHRvciBmb3IgaXQsIHNvIHdlIHVzZQogICogYSBmYWtlIGRlY2xhcmF0aW9uIGhlcmUuCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2pwcm9iZXMuUyBiL2FyY2gvaWE2NC9rZXJuZWwvanByb2Jlcy5TCmluZGV4IDIzMjMzNzcuLjVjZDYyMjZmIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2pwcm9iZXMuUworKysgYi9hcmNoL2lhNjQva2VybmVsL2pwcm9iZXMuUwpAQCAtNjAsMyArNjAsMzAgQEAKIEdMT0JBTF9FTlRSWShqcHJvYmVfaW5zdF9yZXR1cm4pCiAJYnIuY2FsbC5zcHRrLm1hbnkgYjA9anByb2JlX2JyZWFrCiBFTkQoanByb2JlX2luc3RfcmV0dXJuKQorCitHTE9CQUxfRU5UUlkoaW52YWxpZGF0ZV9zdGFja2VkX3JlZ3MpCisJbW92bCByMTY9aW52YWxpZGF0ZV9yZXN0b3JlX2NmbQorCTs7CisJbW92IGI2PXIxNgorCTs7CisJYnIucmV0LnNwdGsubWFueSBiNgorCTs7CitpbnZhbGlkYXRlX3Jlc3RvcmVfY2ZtOgorCW1vdiByMTY9YXIucnNjCisJOzsKKwltb3YgYXIucnNjPXIwCisJOzsKKwlsb2FkcnMKKwk7OworCW1vdiBhci5yc2M9cjE2CisJOzsKKwlici5jb25kLnNwdGsubWFueSBycAorRU5EKGludmFsaWRhdGVfc3RhY2tlZF9yZWdzKQorCitHTE9CQUxfRU5UUlkoZmx1c2hfcmVnaXN0ZXJfc3RhY2spCisJLy8gZmx1c2ggZGlydHkgcmVncyB0byBiYWNraW5nIHN0b3JlIChtdXN0IGJlIGZpcnN0IGluIGluc24gZ3JvdXApCisJZmx1c2hycworCTs7CisJYnIucmV0LnNwdGsubWFueSBycAorRU5EKGZsdXNoX3JlZ2lzdGVyX3N0YWNrKQorCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvaWE2NC9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IDg5YTcwNDAuLjUwYWU4YzcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwva3Byb2Jlcy5jCkBAIC00NjcsMTAgKzQ2Nyw2IEBACiAJZmx1c2hfaWNhY2hlX3JhbmdlKGFybV9hZGRyLCBhcm1fYWRkciArIHNpemVvZihidW5kbGVfdCkpOwogfQogCi12b2lkIF9fa3Byb2JlcyBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKLXsKLX0KLQogLyoKICAqIFdlIGFyZSByZXN1bWluZyBleGVjdXRpb24gYWZ0ZXIgYSBzaW5nbGUgc3RlcCBmYXVsdCwgc28gdGhlIHB0X3JlZ3MKICAqIHN0cnVjdHVyZSByZWZsZWN0cyB0aGUgcmVnaXN0ZXIgc3RhdGUgYWZ0ZXIgd2UgZXhlY3V0ZWQgdGhlIGluc3RydWN0aW9uCkBAIC02NDIsNiArNjM4LDEzIEBACiAJCQlpZiAocC0+YnJlYWtfaGFuZGxlciAmJiBwLT5icmVha19oYW5kbGVyKHAsIHJlZ3MpKSB7CiAJCQkJZ290byBzc19wcm9iZTsKIAkJCX0KKwkJfSBlbHNlIGlmICghaXNfaWE2NF9icmVha19pbnN0KHJlZ3MpKSB7CisJCQkvKiBUaGUgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiB3YXMgcmVtb3ZlZCBieQorCQkJICogYW5vdGhlciBjcHUgcmlnaHQgYWZ0ZXIgd2UgaGl0LCBubyBmdXJ0aGVyCisJCQkgKiBoYW5kbGluZyBvZiB0aGlzIGludGVycnVwdCBpcyBhcHByb3ByaWF0ZQorCQkJICovCisJCQlyZXQgPSAxOworCQkJZ290byBub19rcHJvYmU7CiAJCX0gZWxzZSB7CiAJCQkvKiBOb3Qgb3VyIGJyZWFrICovCiAJCQlnb3RvIG5vX2twcm9iZTsKQEAgLTc2MywxMSArNzY2LDU2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RydWN0IHBhcmFtX2JzcF9jZm0geworCXVuc2lnbmVkIGxvbmcgaXA7CisJdW5zaWduZWQgbG9uZyAqYnNwOworCXVuc2lnbmVkIGxvbmcgY2ZtOworfTsKKworc3RhdGljIHZvaWQgaWE2NF9nZXRfYnNwX2NmbShzdHJ1Y3QgdW53X2ZyYW1lX2luZm8gKmluZm8sIHZvaWQgKmFyZykKK3sKKwl1bnNpZ25lZCBsb25nIGlwOworCXN0cnVjdCBwYXJhbV9ic3BfY2ZtICpscCA9IGFyZzsKKworCWRvIHsKKwkJdW53X2dldF9pcChpbmZvLCAmaXApOworCQlpZiAoaXAgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoaXAgPT0gbHAtPmlwKSB7CisJCQl1bndfZ2V0X2JzcChpbmZvLCAodW5zaWduZWQgbG9uZyopJmxwLT5ic3ApOworCQkJdW53X2dldF9jZm0oaW5mbywgKHVuc2lnbmVkIGxvbmcqKSZscC0+Y2ZtKTsKKwkJCXJldHVybjsKKwkJfQorCX0gd2hpbGUgKHVud191bndpbmQoaW5mbykgPj0gMCk7CisJbHAtPmJzcCA9IDA7CisJbHAtPmNmbSA9IDA7CisJcmV0dXJuOworfQorCiBpbnQgX19rcHJvYmVzIHNldGptcF9wcmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QganByb2JlICpqcCA9IGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QganByb2JlLCBrcCk7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gKChzdHJ1Y3QgZm5wdHIgKikoanAtPmVudHJ5KSktPmlwOwogCXN0cnVjdCBrcHJvYmVfY3RsYmxrICprY2IgPSBnZXRfa3Byb2JlX2N0bGJsaygpOworCXN0cnVjdCBwYXJhbV9ic3BfY2ZtIHBhOworCWludCBieXRlczsKKworCS8qCisJICogQ2FsbGVlIG93bnMgdGhlIGFyZ3VtZW50IHNwYWNlIGFuZCBjb3VsZCBvdmVyd3JpdGUgaXQsIGVnCisJICogdGFpbCBjYWxsIG9wdGltaXphdGlvbi4gU28gdG8gYmUgYWJzb2x1dGVseSBzYWZlCisJICogd2Ugc2F2ZSB0aGUgYXJndW1lbnQgc3BhY2UgYmVmb3JlIHRyYW5zZmVyaW5nIHRoZSBjb250cm9sCisJICogdG8gaW5zdHJ1bWVudGVkIGpwcm9iZSBmdW5jdGlvbiB3aGljaCBydW5zIGluCisJICogdGhlIHByb2Nlc3MgY29udGV4dAorCSAqLworCXBhLmlwID0gcmVncy0+Y3JfaWlwOworCXVud19pbml0X3J1bm5pbmcoaWE2NF9nZXRfYnNwX2NmbSwgJnBhKTsKKwlieXRlcyA9IChjaGFyICopaWE2NF9yc2Vfc2tpcF9yZWdzKHBhLmJzcCwgcGEuY2ZtICYgMHgzZikKKwkJCQktIChjaGFyICopcGEuYnNwOworCW1lbWNweSgga2NiLT5qcHJvYmVzX3NhdmVkX3N0YWNrZWRfcmVncywKKwkJcGEuYnNwLAorCQlieXRlcyApOworCWtjYi0+YnNwID0gcGEuYnNwOworCWtjYi0+Y2ZtID0gcGEuY2ZtOwogCiAJLyogc2F2ZSBhcmNoaXRlY3R1cmFsIHN0YXRlICovCiAJa2NiLT5qcHJvYmVfc2F2ZWRfcmVncyA9ICpyZWdzOwpAQCAtNzg5LDggKzgzNywyMCBAQAogaW50IF9fa3Byb2JlcyBsb25nam1wX2JyZWFrX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGtwcm9iZV9jdGxibGsgKmtjYiA9IGdldF9rcHJvYmVfY3RsYmxrKCk7CisJaW50IGJ5dGVzOwogCisJLyogcmVzdG9yaW5nIGFyY2hpdGVjdHVyYWwgc3RhdGUgKi8KIAkqcmVncyA9IGtjYi0+anByb2JlX3NhdmVkX3JlZ3M7CisKKwkvKiByZXN0b3JpbmcgdGhlIG9yaWdpbmFsIGFyZ3VtZW50IHNwYWNlICovCisJZmx1c2hfcmVnaXN0ZXJfc3RhY2soKTsKKwlieXRlcyA9IChjaGFyICopaWE2NF9yc2Vfc2tpcF9yZWdzKGtjYi0+YnNwLCBrY2ItPmNmbSAmIDB4M2YpCisJCQkJLSAoY2hhciAqKWtjYi0+YnNwOworCW1lbWNweSgga2NiLT5ic3AsCisJCWtjYi0+anByb2Jlc19zYXZlZF9zdGFja2VkX3JlZ3MsCisJCWJ5dGVzICk7CisJaW52YWxpZGF0ZV9zdGFja2VkX3JlZ3MoKTsKKwogCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKIAlyZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMgYi9hcmNoL2lhNjQva2VybmVsL21jYS5jCmluZGV4IDM1NWFmMTUuLmVlN2VlYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYwpAQCAtNzY2LDcgKzc2Niw3IEBACiAJCQlsID0gc3RybGVuKHByZXZpb3VzX2N1cnJlbnQtPmNvbW0pOwogCQlzbnByaW50Zihjb21tLCBzaXplb2YoY29tbSksICIlcyAlKnMgJWQiLAogCQkJY3VycmVudC0+Y29tbSwgbCwgcHJldmlvdXNfY3VycmVudC0+Y29tbSwKLQkJCXByZXZpb3VzX2N1cnJlbnQtPnRocmVhZF9pbmZvLT5jcHUpOworCQkJdGFza190aHJlYWRfaW5mbyhwcmV2aW91c19jdXJyZW50KS0+Y3B1KTsKIAl9CiAJbWVtY3B5KGN1cnJlbnQtPmNvbW0sIGNvbW0sIHNpemVvZihjdXJyZW50LT5jb21tKSk7CiAKQEAgLTE0MjMsNyArMTQyMyw3IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICpwID0gKHN0cnVjdCB0YXNrX3N0cnVjdCAqKSgoY2hhciAqKW1jYV9kYXRhICsgb2Zmc2V0KTsKIAlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpOwogCW1lbXNldChwLCAwLCBLRVJORUxfU1RBQ0tfU0laRSk7Ci0JdGkgPSAoc3RydWN0IHRocmVhZF9pbmZvICopKChjaGFyICopcCArIElBNjRfVEFTS19TSVpFKTsKKwl0aSA9IHRhc2tfdGhyZWFkX2luZm8ocCk7CiAJdGktPmZsYWdzID0gX1RJRl9NQ0FfSU5JVDsKIAl0aS0+cHJlZW1wdF9jb3VudCA9IDE7CiAJdGktPnRhc2sgPSBwOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9tY2FfYXNtLlMgYi9hcmNoL2lhNjQva2VybmVsL21jYV9hc20uUwppbmRleCBkYjMyZmMxLi40MDNhODBhIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL21jYV9hc20uUworKysgYi9hcmNoL2lhNjQva2VybmVsL21jYV9hc20uUwpAQCAtODQ3LDcgKzg0Nyw3IEBACiAJOzsKIAltb3YgY3IuaWltPXRlbXAzCiAJbW92IGNyLmloYT10ZW1wNAotCWRlcCByMjI9MCxyMjIsNjIsMgkvLyBwYWxfbWluX3N0YXRlLCBwaHlzaWNhbCwgdW5jYWNoZWQKKwlkZXAgcjIyPTAscjIyLDYyLDEJLy8gcGFsX21pbl9zdGF0ZSwgcGh5c2ljYWwsIHVuY2FjaGVkCiAJbW92IElBNjRfS1IoQ1VSUkVOVCk9cjIxCiAJbGQ4IHI4PVt0ZW1wMV0JCS8vIG9zX3N0YXR1cwogCWxkOCByMTA9W3RlbXAyXQkJLy8gY29udGV4dApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMgYi9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYwppbmRleCA0MTBkNDgwLi45YzUxOTRiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYworKysgYi9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYwpAQCAtMzgsNyArMzgsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KIAogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9pbnRyaW5zaWNzLmg+CkBAIC0yODUsNyArMjg3LDcgQEAKIAogCXVuc2lnbmVkIGxvbmcJCWN0eF9vdmZsX3JlZ3NbNF07CS8qIHdoaWNoIHJlZ2lzdGVycyBvdmVyZmxvd2VkIChub3RpZmljYXRpb24pICovCiAKLQlzdHJ1Y3Qgc2VtYXBob3JlCWN0eF9yZXN0YXJ0X3NlbTsgICAJLyogdXNlIGZvciBibG9ja2luZyBub3RpZmljYXRpb24gbW9kZSAqLworCXN0cnVjdCBjb21wbGV0aW9uCWN0eF9yZXN0YXJ0X2RvbmU7ICAJLyogdXNlIGZvciBibG9ja2luZyBub3RpZmljYXRpb24gbW9kZSAqLwogCiAJdW5zaWduZWQgbG9uZwkJY3R4X3VzZWRfcG1kc1s0XTsJLyogYml0bWFzayBvZiBQTUQgdXNlZCAgICAgICAgICAgICovCiAJdW5zaWduZWQgbG9uZwkJY3R4X2FsbF9wbWRzWzRdOwkvKiBiaXRtYXNrIG9mIGFsbCBhY2Nlc3NpYmxlIFBNRHMgKi8KQEAgLTYyNyw5ICs2MjksMTEgQEAKIAogI2luY2x1ZGUgInBlcmZtb25faXRhbml1bS5oIgogI2luY2x1ZGUgInBlcmZtb25fbWNraW5sZXkuaCIKKyNpbmNsdWRlICJwZXJmbW9uX21vbnRlY2l0by5oIgogI2luY2x1ZGUgInBlcmZtb25fZ2VuZXJpYy5oIgogCiBzdGF0aWMgcG11X2NvbmZpZ190ICpwbXVfY29uZnNbXT17CisJJnBtdV9jb25mX21vbnQsCiAJJnBtdV9jb25mX21jaywKIAkmcG11X2NvbmZfaXRhLAogCSZwbXVfY29uZl9nZW4sIC8qIG11c3QgYmUgbGFzdCAqLwpAQCAtMTcwOSw3ICsxNzEzLDcgQEAKIHBmbV9zeXN3aWRlX2ZvcmNlX3N0b3Aodm9pZCAqaW5mbykKIHsKIAlwZm1fY29udGV4dF90ICAgKmN0eCA9IChwZm1fY29udGV4dF90ICopaW5mbzsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGlhNjRfdGFza19yZWdzKGN1cnJlbnQpOworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqb3duZXI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwpAQCAtMTgxNCw3ICsxODE4LDcgQEAKIAlpc19zeXN0ZW0gPSBjdHgtPmN0eF9mbF9zeXN0ZW07CiAKIAl0YXNrID0gUEZNX0NUWF9UQVNLKGN0eCk7Ci0JcmVncyA9IGlhNjRfdGFza19yZWdzKHRhc2spOworCXJlZ3MgPSB0YXNrX3B0X3JlZ3ModGFzayk7CiAKIAlEUFJJTlQoKCJjdHhfc3RhdGU9JWQgaXNfY3VycmVudD0lZFxuIiwKIAkJc3RhdGUsCkBAIC0xOTQ0LDcgKzE5NDgsNyBAQAogCWlzX3N5c3RlbSA9IGN0eC0+Y3R4X2ZsX3N5c3RlbTsKIAogCXRhc2sgPSBQRk1fQ1RYX1RBU0soY3R4KTsKLQlyZWdzID0gaWE2NF90YXNrX3JlZ3ModGFzayk7CisJcmVncyA9IHRhc2tfcHRfcmVncyh0YXNrKTsKIAogCURQUklOVCgoImN0eF9zdGF0ZT0lZCBpc19jdXJyZW50PSVkXG4iLCAKIAkJc3RhdGUsCkBAIC0xOTg4LDcgKzE5OTIsNyBAQAogCQkvKgogCQkgKiBmb3JjZSB0YXNrIHRvIHdha2UgdXAgZnJvbSBNQVNLRUQgc3RhdGUKIAkJICovCi0JCXVwKCZjdHgtPmN0eF9yZXN0YXJ0X3NlbSk7CisJCWNvbXBsZXRlKCZjdHgtPmN0eF9yZXN0YXJ0X2RvbmUpOwogCiAJCURQUklOVCgoIndha2luZyB1cCBjdHhfc3RhdGU9JWRcbiIsIHN0YXRlKSk7CiAKQEAgLTI3MDMsNyArMjcwNyw3IEBACiAJLyoKIAkgKiBpbml0IHJlc3RhcnQgc2VtYXBob3JlIHRvIGxvY2tlZAogCSAqLwotCXNlbWFfaW5pdCgmY3R4LT5jdHhfcmVzdGFydF9zZW0sIDApOworCWluaXRfY29tcGxldGlvbigmY3R4LT5jdHhfcmVzdGFydF9kb25lKTsKIAogCS8qCiAJICogYWN0aXZhdGlvbiBpcyB1c2VkIGluIFNNUCBvbmx5CkBAIC0zNjg0LDcgKzM2ODgsNyBAQAogCSAqLwogCWlmIChDVFhfT1ZGTF9OT0JMT0NLKGN0eCkgPT0gMCAmJiBzdGF0ZSA9PSBQRk1fQ1RYX01BU0tFRCkgewogCQlEUFJJTlQoKCJ1bmJsb2NraW5nIFslZF0gXG4iLCB0YXNrLT5waWQpKTsKLQkJdXAoJmN0eC0+Y3R4X3Jlc3RhcnRfc2VtKTsKKwkJY29tcGxldGUoJmN0eC0+Y3R4X3Jlc3RhcnRfZG9uZSk7CiAJfSBlbHNlIHsKIAkJRFBSSU5UKCgiWyVkXSBhcm1lZCBleGl0IHRyYXBcbiIsIHRhc2stPnBpZCkpOwogCkBAIC00MDUxLDcgKzQwNTUsNyBAQAogCSAJICovCiAJCWlhNjRfcHNyKHJlZ3MpLT51cCA9IDA7CiAJfSBlbHNlIHsKLQkJdHJlZ3MgPSBpYTY0X3Rhc2tfcmVncyh0YXNrKTsKKwkJdHJlZ3MgPSB0YXNrX3B0X3JlZ3ModGFzayk7CiAKIAkJLyoKIAkgCSAqIHN0b3AgbW9uaXRvcmluZyBhdCB0aGUgdXNlciBsZXZlbApAQCAtNDEzMyw3ICs0MTM3LDcgQEAKIAkJaWE2NF9wc3IocmVncyktPnVwID0gMTsKIAogCX0gZWxzZSB7Ci0JCXRyZWdzID0gaWE2NF90YXNrX3JlZ3MoY3R4LT5jdHhfdGFzayk7CisJCXRyZWdzID0gdGFza19wdF9yZWdzKGN0eC0+Y3R4X3Rhc2spOwogCiAJCS8qCiAJCSAqIHN0YXJ0IG1vbml0b3JpbmcgYXQgdGhlIGtlcm5lbCBsZXZlbCB0aGUgbmV4dApAQCAtNDQwMyw3ICs0NDA3LDcgQEAKIAkJLyoKIAkJICogd2hlbiBub3QgY3VycmVudCwgdGFzayBNVVNUIGJlIHN0b3BwZWQsIHNvIHRoaXMgaXMgc2FmZQogCQkgKi8KLQkJcmVncyA9IGlhNjRfdGFza19yZWdzKHRhc2spOworCQlyZWdzID0gdGFza19wdF9yZWdzKHRhc2spOwogCiAJCS8qIGZvcmNlIGEgZnVsbCByZWxvYWQgKi8KIAkJY3R4LT5jdHhfbGFzdF9hY3RpdmF0aW9uID0gUEZNX0lOVkFMSURfQUNUSVZBVElPTjsKQEAgLTQ1MjksNyArNDUzMyw3IEBACiAJLyoKIAkgKiBwZXItdGFzayBtb2RlCiAJICovCi0JdHJlZ3MgPSB0YXNrID09IGN1cnJlbnQgPyByZWdzIDogaWE2NF90YXNrX3JlZ3ModGFzayk7CisJdHJlZ3MgPSB0YXNrID09IGN1cnJlbnQgPyByZWdzIDogdGFza19wdF9yZWdzKHRhc2spOwogCiAJaWYgKHRhc2sgPT0gY3VycmVudCkgewogCQkvKgpAQCAtNDU5Miw3ICs0NTk2LDcgQEAKIHsKIAlwZm1fY29udGV4dF90ICpjdHg7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGlhNjRfdGFza19yZWdzKHRhc2spOworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKHRhc2spOwogCWludCByZXQsIHN0YXRlOwogCWludCBmcmVlX29rID0gMDsKIApAQCAtNDkyNSw3ICs0OTI5LDcgQEAKIAlpZiAodW5saWtlbHkocmV0KSkgZ290byBhYm9ydF9sb2NrZWQ7CiAKIHNraXBfZmQ6Ci0JcmV0ID0gKCpmdW5jKShjdHgsIGFyZ3NfaywgY291bnQsIGlhNjRfdGFza19yZWdzKGN1cnJlbnQpKTsKKwlyZXQgPSAoKmZ1bmMpKGN0eCwgYXJnc19rLCBjb3VudCwgdGFza19wdF9yZWdzKGN1cnJlbnQpKTsKIAogCWNhbGxfbWFkZSA9IDE7CiAKQEAgLTUwNDksNyArNTA1Myw3IEBACiAKIAlwZm1fY2xlYXJfdGFza19ub3RpZnkoKTsKIAotCXJlZ3MgPSBpYTY0X3Rhc2tfcmVncyhjdXJyZW50KTsKKwlyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOwogCiAJLyoKIAkgKiBleHRyYWN0IHJlYXNvbiBmb3IgYmVpbmcgaGVyZSBhbmQgY2xlYXIKQEAgLTUwODYsNyArNTA5MCw3IEBACiAJICogbWF5IGdvIHRocm91Z2ggd2l0aG91dCBibG9ja2luZyBvbiBTTVAgc3lzdGVtcwogCSAqIGlmIHJlc3RhcnQgaGFzIGJlZW4gcmVjZWl2ZWQgYWxyZWFkeSBieSB0aGUgdGltZSB3ZSBjYWxsIGRvd24oKQogCSAqLwotCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmY3R4LT5jdHhfcmVzdGFydF9zZW0pOworCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmY3R4LT5jdHhfcmVzdGFydF9kb25lKTsKIAogCURQUklOVCgoImFmdGVyIGJsb2NrIHNsZWVwaW5nIHJldD0lZFxuIiwgcmV0KSk7CiAKQEAgLTU3OTMsNyArNTc5Nyw3IEBACiAJICogb24gZXZlcnkgQ1BVLCBzbyB3ZSBjYW4gcmVseSBvbiB0aGUgcGlkIHRvIGlkZW50aWZ5IHRoZSBpZGxlIHRhc2suCiAJICovCiAJaWYgKChpbmZvICYgUEZNX0NQVUlORk9fRVhDTF9JRExFKSA9PSAwIHx8IHRhc2stPnBpZCkgewotCQlyZWdzID0gaWE2NF90YXNrX3JlZ3ModGFzayk7CisJCXJlZ3MgPSB0YXNrX3B0X3JlZ3ModGFzayk7CiAJCWlhNjRfcHNyKHJlZ3MpLT5wcCA9IGlzX2N0eHN3aW4gPyBkY3JfcHAgOiAwOwogCQlyZXR1cm47CiAJfQpAQCAtNTg3Niw3ICs1ODgwLDcgQEAKIAlmbGFncyA9IHBmbV9wcm90ZWN0X2N0eF9jdHhzdyhjdHgpOwogCiAJaWYgKGN0eC0+Y3R4X3N0YXRlID09IFBGTV9DVFhfWk9NQklFKSB7Ci0JCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gaWE2NF90YXNrX3JlZ3ModGFzayk7CisJCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKHRhc2spOwogCiAJCXBmbV9jbGVhcl9wc3JfdXAoKTsKIApAQCAtNjA3Niw3ICs2MDgwLDcgQEAKIAlCVUdfT04ocHNyICYgSUE2NF9QU1JfSSk7CiAKIAlpZiAodW5saWtlbHkoY3R4LT5jdHhfc3RhdGUgPT0gUEZNX0NUWF9aT01CSUUpKSB7Ci0JCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gaWE2NF90YXNrX3JlZ3ModGFzayk7CisJCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKHRhc2spOwogCiAJCUJVR19PTihjdHgtPmN0eF9zbXBsX2hkcik7CiAKQEAgLTY0NDUsNyArNjQ0OSw3IEBACiB7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CiAKLQlyZWdzID0gaWE2NF90YXNrX3JlZ3MoY3VycmVudCk7CisJcmVncyA9IHRhc2tfcHRfcmVncyhjdXJyZW50KTsKIAogCURQUklOVCgoImNhbGxlZFxuIikpOwogCkBAIC02NDcxLDcgKzY0NzUsNyBAQAogewogCXN0cnVjdCBwdF9yZWdzICpyZWdzOwogCi0JcmVncyA9IGlhNjRfdGFza19yZWdzKGN1cnJlbnQpOworCXJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CiAKIAlEUFJJTlQoKCJjYWxsZWRcbiIpKTsKIApAQCAtNjc1Myw3ICs2NzU3LDcgQEAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKIAl0aGlzX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlyZWdzICAgICA9IGlhNjRfdGFza19yZWdzKGN1cnJlbnQpOworCXJlZ3MgICAgID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOwogCWluZm8gICAgID0gUEZNX0NQVUlORk9fR0VUKCk7CiAJZGNyICAgICAgPSBpYTY0X2dldHJlZyhfSUE2NF9SRUdfQ1JfRENSKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uX21vbnRlY2l0by5oIGIvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uX21vbnRlY2l0by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMDZhYzYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2lhNjQva2VybmVsL3BlcmZtb25fbW9udGVjaXRvLmgKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIE1vbnRlY2l0byBQTVUgcmVnaXN0ZXIgZGVzY3JpcHRpb24gdGFibGVzCisgKiBhbmQgcG1jIGNoZWNrZXIgdXNlZCBieSBwZXJmbW9uLmMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4KKyAqICAgICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgU3RlcGhhbmUgRXJhbmlhbiA8ZXJhbmlhbkBocGwuaHAuY29tPgorICovCitzdGF0aWMgaW50IHBmbV9tb250X3BtY19jaGVjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHBmbV9jb250ZXh0X3QgKmN0eCwgdW5zaWduZWQgaW50IGNudW0sIHVuc2lnbmVkIGxvbmcgKnZhbCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisjZGVmaW5lIFJERVBfTU9OVF9FVEIJKFJERVAoMzgpfFJERVAoMzkpfFJERVAoNDgpfFJERVAoNDkpfFJERVAoNTApfFJERVAoNTEpfFJERVAoNTIpfFJERVAoNTMpfFJERVAoNTQpfFwKKwkJCSBSREVQKDU1KXxSREVQKDU2KXxSREVQKDU3KXxSREVQKDU4KXxSREVQKDU5KXxSREVQKDYwKXxSREVQKDYxKXxSREVQKDYyKXxSREVQKDYzKSkKKyNkZWZpbmUgUkRFUF9NT05UX0RFQVIgIChSREVQKDMyKXxSREVQKDMzKXxSREVQKDM2KSkKKyNkZWZpbmUgUkRFUF9NT05UX0lFQVIgIChSREVQKDM0KXxSREVQKDM1KSkKKworc3RhdGljIHBmbV9yZWdfZGVzY190IHBmbV9tb250X3BtY19kZXNjW1BNVV9NQVhfUE1DU109eworLyogcG1jMCAgKi8geyBQRk1fUkVHX0NPTlRST0wgLCAwLCAweDAsIC0xLCBOVUxMLCBOVUxMLCB7MCwwLCAwLCAwfSwgezAsMCwgMCwgMH19LAorLyogcG1jMSAgKi8geyBQRk1fUkVHX0NPTlRST0wgLCAwLCAweDAsIC0xLCBOVUxMLCBOVUxMLCB7MCwwLCAwLCAwfSwgezAsMCwgMCwgMH19LAorLyogcG1jMiAgKi8geyBQRk1fUkVHX0NPTlRST0wgLCAwLCAweDAsIC0xLCBOVUxMLCBOVUxMLCB7MCwwLCAwLCAwfSwgezAsMCwgMCwgMH19LAorLyogcG1jMyAgKi8geyBQRk1fUkVHX0NPTlRST0wgLCAwLCAweDAsIC0xLCBOVUxMLCBOVUxMLCB7MCwwLCAwLCAwfSwgezAsMCwgMCwgMH19LAorLyogcG1jNCAgKi8geyBQRk1fUkVHX0NPVU5USU5HLCA2LCAweDIwMDAwMDAsIDB4N2M3ZmZmN2YsIE5VTEwsIHBmbV9tb250X3BtY19jaGVjaywge1JERVAoNCksMCwgMCwgMH0sIHswLDAsIDAsIDB9fSwKKy8qIHBtYzUgICovIHsgUEZNX1JFR19DT1VOVElORywgNiwgMHgyMDAwMDAwLCAweDdjN2ZmZjdmLCBOVUxMLCBwZm1fbW9udF9wbWNfY2hlY2ssIHtSREVQKDUpLDAsIDAsIDB9LCB7MCwwLCAwLCAwfX0sCisvKiBwbWM2ICAqLyB7IFBGTV9SRUdfQ09VTlRJTkcsIDYsIDB4MjAwMDAwMCwgMHg3YzdmZmY3ZiwgTlVMTCwgcGZtX21vbnRfcG1jX2NoZWNrLCB7UkRFUCg2KSwwLCAwLCAwfSwgezAsMCwgMCwgMH19LAorLyogcG1jNyAgKi8geyBQRk1fUkVHX0NPVU5USU5HLCA2LCAweDIwMDAwMDAsIDB4N2M3ZmZmN2YsIE5VTEwsIHBmbV9tb250X3BtY19jaGVjaywge1JERVAoNyksMCwgMCwgMH0sIHswLDAsIDAsIDB9fSwKKy8qIHBtYzggICovIHsgUEZNX1JFR19DT1VOVElORywgNiwgMHgyMDAwMDAwLCAweDdjN2ZmZjdmLCBOVUxMLCBwZm1fbW9udF9wbWNfY2hlY2ssIHtSREVQKDgpLDAsIDAsIDB9LCB7MCwwLCAwLCAwfX0sCisvKiBwbWM5ICAqLyB7IFBGTV9SRUdfQ09VTlRJTkcsIDYsIDB4MjAwMDAwMCwgMHg3YzdmZmY3ZiwgTlVMTCwgcGZtX21vbnRfcG1jX2NoZWNrLCB7UkRFUCg5KSwwLCAwLCAwfSwgezAsMCwgMCwgMH19LAorLyogcG1jMTAgKi8geyBQRk1fUkVHX0NPVU5USU5HLCA2LCAweDIwMDAwMDAsIDB4N2M3ZmZmN2YsIE5VTEwsIHBmbV9tb250X3BtY19jaGVjaywge1JERVAoMTApLDAsIDAsIDB9LCB7MCwwLCAwLCAwfX0sCisvKiBwbWMxMSAqLyB7IFBGTV9SRUdfQ09VTlRJTkcsIDYsIDB4MjAwMDAwMCwgMHg3YzdmZmY3ZiwgTlVMTCwgcGZtX21vbnRfcG1jX2NoZWNrLCB7UkRFUCgxMSksMCwgMCwgMH0sIHswLDAsIDAsIDB9fSwKKy8qIHBtYzEyICovIHsgUEZNX1JFR19DT1VOVElORywgNiwgMHgyMDAwMDAwLCAweDdjN2ZmZjdmLCBOVUxMLCBwZm1fbW9udF9wbWNfY2hlY2ssIHtSREVQKDEyKSwwLCAwLCAwfSwgezAsMCwgMCwgMH19LAorLyogcG1jMTMgKi8geyBQRk1fUkVHX0NPVU5USU5HLCA2LCAweDIwMDAwMDAsIDB4N2M3ZmZmN2YsIE5VTEwsIHBmbV9tb250X3BtY19jaGVjaywge1JERVAoMTMpLDAsIDAsIDB9LCB7MCwwLCAwLCAwfX0sCisvKiBwbWMxNCAqLyB7IFBGTV9SRUdfQ09VTlRJTkcsIDYsIDB4MjAwMDAwMCwgMHg3YzdmZmY3ZiwgTlVMTCwgcGZtX21vbnRfcG1jX2NoZWNrLCB7UkRFUCgxNCksMCwgMCwgMH0sIHswLDAsIDAsIDB9fSwKKy8qIHBtYzE1ICovIHsgUEZNX1JFR19DT1VOVElORywgNiwgMHgyMDAwMDAwLCAweDdjN2ZmZjdmLCBOVUxMLCBwZm1fbW9udF9wbWNfY2hlY2ssIHtSREVQKDE1KSwwLCAwLCAwfSwgezAsMCwgMCwgMH19LAorLyogcG1jMTYgKi8geyBQRk1fUkVHX05PVElNUEwsIH0sCisvKiBwbWMxNyAqLyB7IFBGTV9SRUdfTk9USU1QTCwgfSwKKy8qIHBtYzE4ICovIHsgUEZNX1JFR19OT1RJTVBMLCB9LAorLyogcG1jMTkgKi8geyBQRk1fUkVHX05PVElNUEwsIH0sCisvKiBwbWMyMCAqLyB7IFBGTV9SRUdfTk9USU1QTCwgfSwKKy8qIHBtYzIxICovIHsgUEZNX1JFR19OT1RJTVBMLCB9LAorLyogcG1jMjIgKi8geyBQRk1fUkVHX05PVElNUEwsIH0sCisvKiBwbWMyMyAqLyB7IFBGTV9SRUdfTk9USU1QTCwgfSwKKy8qIHBtYzI0ICovIHsgUEZNX1JFR19OT1RJTVBMLCB9LAorLyogcG1jMjUgKi8geyBQRk1fUkVHX05PVElNUEwsIH0sCisvKiBwbWMyNiAqLyB7IFBGTV9SRUdfTk9USU1QTCwgfSwKKy8qIHBtYzI3ICovIHsgUEZNX1JFR19OT1RJTVBMLCB9LAorLyogcG1jMjggKi8geyBQRk1fUkVHX05PVElNUEwsIH0sCisvKiBwbWMyOSAqLyB7IFBGTV9SRUdfTk9USU1QTCwgfSwKKy8qIHBtYzMwICovIHsgUEZNX1JFR19OT1RJTVBMLCB9LAorLyogcG1jMzEgKi8geyBQRk1fUkVHX05PVElNUEwsIH0sCisvKiBwbWMzMiAqLyB7IFBGTV9SRUdfQ09ORklHLCAgMCwgMHgzMGYwMWZmZmZmZmZmZmYsIDB4MzBmMDFmZmZmZmZmZmZmLCBOVUxMLCBwZm1fbW9udF9wbWNfY2hlY2ssIHswLDAsIDAsIDB9LCB7MCwwLCAwLCAwfX0sCisvKiBwbWMzMyAqLyB7IFBGTV9SRUdfQ09ORklHLCAgMCwgMHgwLCAgMHgxZmZmZmZmZmZmZiwgTlVMTCwgcGZtX21vbnRfcG1jX2NoZWNrLCB7MCwwLCAwLCAwfSwgezAsMCwgMCwgMH19LAorLyogcG1jMzQgKi8geyBQRk1fUkVHX0NPTkZJRywgIDAsIDB4ZjAxZmZmZmZmZmZmZiwgMHhmMDFmZmZmZmZmZmZmLCBOVUxMLCBwZm1fbW9udF9wbWNfY2hlY2ssIHswLDAsIDAsIDB9LCB7MCwwLCAwLCAwfX0sCisvKiBwbWMzNSAqLyB7IFBGTV9SRUdfQ09ORklHLCAgMCwgMHgwLCAgMHgxZmZmZmZmZmZmZiwgTlVMTCwgcGZtX21vbnRfcG1jX2NoZWNrLCB7MCwwLCAwLCAwfSwgezAsMCwgMCwgMH19LAorLyogcG1jMzYgKi8geyBQRk1fUkVHX0NPTkZJRywgIDAsIDB4ZmZmZmZmZjAsIDB4ZiwgTlVMTCwgcGZtX21vbnRfcG1jX2NoZWNrLCB7MCwwLCAwLCAwfSwgezAsMCwgMCwgMH19LAorLyogcG1jMzcgKi8geyBQRk1fUkVHX01PTklUT1IsIDQsIDB4MCwgMHgzZmZmLCBOVUxMLCBwZm1fbW9udF9wbWNfY2hlY2ssIHtSREVQX01PTlRfSUVBUiwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfX0sCisvKiBwbWMzOCAqLyB7IFBGTV9SRUdfQ09ORklHLCAgMCwgMHhkYjYsIDB4MjQ5MiwgTlVMTCwgcGZtX21vbnRfcG1jX2NoZWNrLCB7MCwwLCAwLCAwfSwgezAsMCwgMCwgMH19LAorLyogcG1jMzkgKi8geyBQRk1fUkVHX01PTklUT1IsIDYsIDB4MCwgMHhmZmNmLCBOVUxMLCBwZm1fbW9udF9wbWNfY2hlY2ssIHtSREVQX01PTlRfRVRCLDAsIDAsIDB9LCB7MCwwLCAwLCAwfX0sCisvKiBwbWM0MCAqLyB7IFBGTV9SRUdfTU9OSVRPUiwgNiwgMHgyMDAwMDAwLCAweGYwMWNmLCBOVUxMLCBwZm1fbW9udF9wbWNfY2hlY2ssIHtSREVQX01PTlRfREVBUiwwLCAwLCAwfSwgezAsMCwgMCwgMH19LAorLyogcG1jNDEgKi8geyBQRk1fUkVHX0NPTkZJRywgIDAsIDB4MDAwMDIwNzhmZWZlZmVmZSwgMHgxZTAwMDE4MTgxODE4LCBOVUxMLCBwZm1fbW9udF9wbWNfY2hlY2ssIHswLDAsIDAsIDB9LCB7MCwwLCAwLCAwfX0sCisvKiBwbWM0MiAqLyB7IFBGTV9SRUdfTU9OSVRPUiwgNiwgMHgwLCAweDdmZjRmLCBOVUxMLCBwZm1fbW9udF9wbWNfY2hlY2ssIHtSREVQX01PTlRfRVRCLDAsIDAsIDB9LCB7MCwwLCAwLCAwfX0sCisJICAgIHsgUEZNX1JFR19FTkQgICAgLCAwLCAweDAsIC0xLCBOVUxMLCBOVUxMLCB7MCx9LCB7MCx9fSwgLyogZW5kIG1hcmtlciAqLworfTsKKworc3RhdGljIHBmbV9yZWdfZGVzY190IHBmbV9tb250X3BtZF9kZXNjW1BNVV9NQVhfUE1EU109eworLyogcG1kMCAgKi8geyBQRk1fUkVHX05PVElNUEwsIH0sIAorLyogcG1kMSAgKi8geyBQRk1fUkVHX05PVElNUEwsIH0sCisvKiBwbWQyICAqLyB7IFBGTV9SRUdfTk9USU1QTCwgfSwKKy8qIHBtZDMgICovIHsgUEZNX1JFR19OT1RJTVBMLCB9LAorLyogcG1kNCAgKi8geyBQRk1fUkVHX0NPVU5USU5HLCAwLCAweDAsIC0xLCBOVUxMLCBOVUxMLCB7MCwwLCAwLCAwfSwge1JERVAoNCksMCwgMCwgMH19LAorLyogcG1kNSAgKi8geyBQRk1fUkVHX0NPVU5USU5HLCAwLCAweDAsIC0xLCBOVUxMLCBOVUxMLCB7MCwwLCAwLCAwfSwge1JERVAoNSksMCwgMCwgMH19LAorLyogcG1kNiAgKi8geyBQRk1fUkVHX0NPVU5USU5HLCAwLCAweDAsIC0xLCBOVUxMLCBOVUxMLCB7MCwwLCAwLCAwfSwge1JERVAoNiksMCwgMCwgMH19LAorLyogcG1kNyAgKi8geyBQRk1fUkVHX0NPVU5USU5HLCAwLCAweDAsIC0xLCBOVUxMLCBOVUxMLCB7MCwwLCAwLCAwfSwge1JERVAoNyksMCwgMCwgMH19LAorLyogcG1kOCAgKi8geyBQRk1fUkVHX0NPVU5USU5HLCAwLCAweDAsIC0xLCBOVUxMLCBOVUxMLCB7MCwwLCAwLCAwfSwge1JERVAoOCksMCwgMCwgMH19LCAKKy8qIHBtZDkgICovIHsgUEZNX1JFR19DT1VOVElORywgMCwgMHgwLCAtMSwgTlVMTCwgTlVMTCwgezAsMCwgMCwgMH0sIHtSREVQKDkpLDAsIDAsIDB9fSwKKy8qIHBtZDEwICovIHsgUEZNX1JFR19DT1VOVElORywgMCwgMHgwLCAtMSwgTlVMTCwgTlVMTCwgezAsMCwgMCwgMH0sIHtSREVQKDEwKSwwLCAwLCAwfX0sCisvKiBwbWQxMSAqLyB7IFBGTV9SRUdfQ09VTlRJTkcsIDAsIDB4MCwgLTEsIE5VTEwsIE5VTEwsIHswLDAsIDAsIDB9LCB7UkRFUCgxMSksMCwgMCwgMH19LAorLyogcG1kMTIgKi8geyBQRk1fUkVHX0NPVU5USU5HLCAwLCAweDAsIC0xLCBOVUxMLCBOVUxMLCB7MCwwLCAwLCAwfSwge1JERVAoMTIpLDAsIDAsIDB9fSwKKy8qIHBtZDEzICovIHsgUEZNX1JFR19DT1VOVElORywgMCwgMHgwLCAtMSwgTlVMTCwgTlVMTCwgezAsMCwgMCwgMH0sIHtSREVQKDEzKSwwLCAwLCAwfX0sCisvKiBwbWQxNCAqLyB7IFBGTV9SRUdfQ09VTlRJTkcsIDAsIDB4MCwgLTEsIE5VTEwsIE5VTEwsIHswLDAsIDAsIDB9LCB7UkRFUCgxNCksMCwgMCwgMH19LAorLyogcG1kMTUgKi8geyBQRk1fUkVHX0NPVU5USU5HLCAwLCAweDAsIC0xLCBOVUxMLCBOVUxMLCB7MCwwLCAwLCAwfSwge1JERVAoMTUpLDAsIDAsIDB9fSwKKy8qIHBtZDE2ICovIHsgUEZNX1JFR19OT1RJTVBMLCB9LAorLyogcG1kMTcgKi8geyBQRk1fUkVHX05PVElNUEwsIH0sCisvKiBwbWQxOCAqLyB7IFBGTV9SRUdfTk9USU1QTCwgfSwKKy8qIHBtZDE5ICovIHsgUEZNX1JFR19OT1RJTVBMLCB9LAorLyogcG1kMjAgKi8geyBQRk1fUkVHX05PVElNUEwsIH0sCisvKiBwbWQyMSAqLyB7IFBGTV9SRUdfTk9USU1QTCwgfSwKKy8qIHBtZDIyICovIHsgUEZNX1JFR19OT1RJTVBMLCB9LAorLyogcG1kMjMgKi8geyBQRk1fUkVHX05PVElNUEwsIH0sCisvKiBwbWQyNCAqLyB7IFBGTV9SRUdfTk9USU1QTCwgfSwKKy8qIHBtZDI1ICovIHsgUEZNX1JFR19OT1RJTVBMLCB9LAorLyogcG1kMjYgKi8geyBQRk1fUkVHX05PVElNUEwsIH0sCisvKiBwbWQyNyAqLyB7IFBGTV9SRUdfTk9USU1QTCwgfSwKKy8qIHBtZDI4ICovIHsgUEZNX1JFR19OT1RJTVBMLCB9LAorLyogcG1kMjkgKi8geyBQRk1fUkVHX05PVElNUEwsIH0sCisvKiBwbWQzMCAqLyB7IFBGTV9SRUdfTk9USU1QTCwgfSwKKy8qIHBtZDMxICovIHsgUEZNX1JFR19OT1RJTVBMLCB9LAorLyogcG1kMzIgKi8geyBQRk1fUkVHX0JVRkZFUiwgMCwgMHgwLCAtMSwgTlVMTCwgTlVMTCwge1JERVAoMzMpfFJERVAoMzYpLDAsIDAsIDB9LCB7UkRFUCg0MCksMCwgMCwgMH19LAorLyogcG1kMzMgKi8geyBQRk1fUkVHX0JVRkZFUiwgMCwgMHgwLCAtMSwgTlVMTCwgTlVMTCwge1JERVAoMzIpfFJERVAoMzYpLDAsIDAsIDB9LCB7UkRFUCg0MCksMCwgMCwgMH19LAorLyogcG1kMzQgKi8geyBQRk1fUkVHX0JVRkZFUiwgMCwgMHgwLCAtMSwgTlVMTCwgTlVMTCwge1JERVAoMzUpLDAsIDAsIDB9LCB7UkRFUCgzNyksMCwgMCwgMH19LAorLyogcG1kMzUgKi8geyBQRk1fUkVHX0JVRkZFUiwgMCwgMHgwLCAtMSwgTlVMTCwgTlVMTCwge1JERVAoMzQpLDAsIDAsIDB9LCB7UkRFUCgzNyksMCwgMCwgMH19LAorLyogcG1kMzYgKi8geyBQRk1fUkVHX0JVRkZFUiwgMCwgMHgwLCAtMSwgTlVMTCwgTlVMTCwge1JERVAoMzIpfFJERVAoMzMpLDAsIDAsIDB9LCB7UkRFUCg0MCksMCwgMCwgMH19LAorLyogcG1kMzcgKi8geyBQRk1fUkVHX05PVElNUEwsIH0sCisvKiBwbWQzOCAqLyB7IFBGTV9SRUdfQlVGRkVSLCAwLCAweDAsIC0xLCBOVUxMLCBOVUxMLCB7UkRFUF9NT05UX0VUQiwwLCAwLCAwfSwge1JERVAoMzkpLDAsIDAsIDB9fSwKKy8qIHBtZDM5ICovIHsgUEZNX1JFR19CVUZGRVIsIDAsIDB4MCwgLTEsIE5VTEwsIE5VTEwsIHtSREVQX01PTlRfRVRCLDAsIDAsIDB9LCB7UkRFUCgzOSksMCwgMCwgMH19LAorLyogcG1kNDAgKi8geyBQRk1fUkVHX05PVElNUEwsIH0sCisvKiBwbWQ0MSAqLyB7IFBGTV9SRUdfTk9USU1QTCwgfSwKKy8qIHBtZDQyICovIHsgUEZNX1JFR19OT1RJTVBMLCB9LAorLyogcG1kNDMgKi8geyBQRk1fUkVHX05PVElNUEwsIH0sCisvKiBwbWQ0NCAqLyB7IFBGTV9SRUdfTk9USU1QTCwgfSwKKy8qIHBtZDQ1ICovIHsgUEZNX1JFR19OT1RJTVBMLCB9LAorLyogcG1kNDYgKi8geyBQRk1fUkVHX05PVElNUEwsIH0sCisvKiBwbWQ0NyAqLyB7IFBGTV9SRUdfTk9USU1QTCwgfSwKKy8qIHBtZDQ4ICovIHsgUEZNX1JFR19CVUZGRVIsIDAsIDB4MCwgLTEsIE5VTEwsIE5VTEwsIHtSREVQX01PTlRfRVRCLDAsIDAsIDB9LCB7UkRFUCgzOSksMCwgMCwgMH19LAorLyogcG1kNDkgKi8geyBQRk1fUkVHX0JVRkZFUiwgMCwgMHgwLCAtMSwgTlVMTCwgTlVMTCwge1JERVBfTU9OVF9FVEIsMCwgMCwgMH0sIHtSREVQKDM5KSwwLCAwLCAwfX0sCisvKiBwbWQ1MCAqLyB7IFBGTV9SRUdfQlVGRkVSLCAwLCAweDAsIC0xLCBOVUxMLCBOVUxMLCB7UkRFUF9NT05UX0VUQiwwLCAwLCAwfSwge1JERVAoMzkpLDAsIDAsIDB9fSwKKy8qIHBtZDUxICovIHsgUEZNX1JFR19CVUZGRVIsIDAsIDB4MCwgLTEsIE5VTEwsIE5VTEwsIHtSREVQX01PTlRfRVRCLDAsIDAsIDB9LCB7UkRFUCgzOSksMCwgMCwgMH19LAorLyogcG1kNTIgKi8geyBQRk1fUkVHX0JVRkZFUiwgMCwgMHgwLCAtMSwgTlVMTCwgTlVMTCwge1JERVBfTU9OVF9FVEIsMCwgMCwgMH0sIHtSREVQKDM5KSwwLCAwLCAwfX0sCisvKiBwbWQ1MyAqLyB7IFBGTV9SRUdfQlVGRkVSLCAwLCAweDAsIC0xLCBOVUxMLCBOVUxMLCB7UkRFUF9NT05UX0VUQiwwLCAwLCAwfSwge1JERVAoMzkpLDAsIDAsIDB9fSwKKy8qIHBtZDU0ICovIHsgUEZNX1JFR19CVUZGRVIsIDAsIDB4MCwgLTEsIE5VTEwsIE5VTEwsIHtSREVQX01PTlRfRVRCLDAsIDAsIDB9LCB7UkRFUCgzOSksMCwgMCwgMH19LAorLyogcG1kNTUgKi8geyBQRk1fUkVHX0JVRkZFUiwgMCwgMHgwLCAtMSwgTlVMTCwgTlVMTCwge1JERVBfTU9OVF9FVEIsMCwgMCwgMH0sIHtSREVQKDM5KSwwLCAwLCAwfX0sCisvKiBwbWQ1NiAqLyB7IFBGTV9SRUdfQlVGRkVSLCAwLCAweDAsIC0xLCBOVUxMLCBOVUxMLCB7UkRFUF9NT05UX0VUQiwwLCAwLCAwfSwge1JERVAoMzkpLDAsIDAsIDB9fSwKKy8qIHBtZDU3ICovIHsgUEZNX1JFR19CVUZGRVIsIDAsIDB4MCwgLTEsIE5VTEwsIE5VTEwsIHtSREVQX01PTlRfRVRCLDAsIDAsIDB9LCB7UkRFUCgzOSksMCwgMCwgMH19LAorLyogcG1kNTggKi8geyBQRk1fUkVHX0JVRkZFUiwgMCwgMHgwLCAtMSwgTlVMTCwgTlVMTCwge1JERVBfTU9OVF9FVEIsMCwgMCwgMH0sIHtSREVQKDM5KSwwLCAwLCAwfX0sCisvKiBwbWQ1OSAqLyB7IFBGTV9SRUdfQlVGRkVSLCAwLCAweDAsIC0xLCBOVUxMLCBOVUxMLCB7UkRFUF9NT05UX0VUQiwwLCAwLCAwfSwge1JERVAoMzkpLDAsIDAsIDB9fSwKKy8qIHBtZDYwICovIHsgUEZNX1JFR19CVUZGRVIsIDAsIDB4MCwgLTEsIE5VTEwsIE5VTEwsIHtSREVQX01PTlRfRVRCLDAsIDAsIDB9LCB7UkRFUCgzOSksMCwgMCwgMH19LAorLyogcG1kNjEgKi8geyBQRk1fUkVHX0JVRkZFUiwgMCwgMHgwLCAtMSwgTlVMTCwgTlVMTCwge1JERVBfTU9OVF9FVEIsMCwgMCwgMH0sIHtSREVQKDM5KSwwLCAwLCAwfX0sCisvKiBwbWQ2MiAqLyB7IFBGTV9SRUdfQlVGRkVSLCAwLCAweDAsIC0xLCBOVUxMLCBOVUxMLCB7UkRFUF9NT05UX0VUQiwwLCAwLCAwfSwge1JERVAoMzkpLDAsIDAsIDB9fSwKKy8qIHBtZDYzICovIHsgUEZNX1JFR19CVUZGRVIsIDAsIDB4MCwgLTEsIE5VTEwsIE5VTEwsIHtSREVQX01PTlRfRVRCLDAsIDAsIDB9LCB7UkRFUCgzOSksMCwgMCwgMH19LAorCSAgICB7IFBGTV9SRUdfRU5EICAgLCAwLCAweDAsIC0xLCBOVUxMLCBOVUxMLCB7MCx9LCB7MCx9fSwgLyogZW5kIG1hcmtlciAqLworfTsKKworLyoKKyAqIFBNQyByZXNlcnZlZCBmaWVsZHMgbXVzdCBoYXZlIHRoZWlyIHBvd2VyLXVwIHZhbHVlcyBwcmVzZXJ2ZWQKKyAqLworc3RhdGljIGludAorcGZtX21vbnRfcmVzZXJ2ZWQodW5zaWduZWQgaW50IGNudW0sIHVuc2lnbmVkIGxvbmcgKnZhbCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyB0bXAxLCB0bXAyLCBpdmFsID0gKnZhbDsKKworCS8qIHJlbW92ZSByZXNlcnZlZCBhcmVhcyBmcm9tIHVzZXIgdmFsdWUgKi8KKwl0bXAxID0gaXZhbCAmIFBNQ19SU1ZEX01BU0soY251bSk7CisKKwkvKiBnZXQgcmVzZXJ2ZWQgZmllbGRzIHZhbHVlcyAqLworCXRtcDIgPSBQTUNfREZMX1ZBTChjbnVtKSAmIH5QTUNfUlNWRF9NQVNLKGNudW0pOworCisJKnZhbCA9IHRtcDEgfCB0bXAyOworCisJRFBSSU5UKCgicG1jWyVkXT0weCVseCwgbWFzaz0weCVseCwgcmVzZXQ9MHglbHgsIHZhbD0weCVseFxuIiwKKwkJICBjbnVtLCBpdmFsLCBQTUNfUlNWRF9NQVNLKGNudW0pLCBQTUNfREZMX1ZBTChjbnVtKSwgKnZhbCkpOworCXJldHVybiAwOworfQorCisvKgorICogdGFzayBjYW4gYmUgTlVMTCBpZiB0aGUgY29udGV4dCBpcyB1bmxvYWRlZAorICovCitzdGF0aWMgaW50CitwZm1fbW9udF9wbWNfY2hlY2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBwZm1fY29udGV4dF90ICpjdHgsIHVuc2lnbmVkIGludCBjbnVtLCB1bnNpZ25lZCBsb25nICp2YWwsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgdmFsMzIgPSAwLCB2YWwzOCA9IDAsIHZhbDQxID0gMDsKKwl1bnNpZ25lZCBsb25nIHRtcHZhbDsKKwlpbnQgY2hlY2tfY2FzZTEgPSAwOworCWludCBpc19sb2FkZWQ7CisKKwkvKiBmaXJzdCBwcmVzZXJ2ZSB0aGUgcmVzZXJ2ZWQgZmllbGRzICovCisJcGZtX21vbnRfcmVzZXJ2ZWQoY251bSwgdmFsLCByZWdzKTsKKworCXRtcHZhbCA9ICp2YWw7CisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlpZiAoY3R4ID09IE5VTEwpIHJldHVybiAtRUlOVkFMOworCisJaXNfbG9hZGVkID0gY3R4LT5jdHhfc3RhdGUgPT0gUEZNX0NUWF9MT0FERUQgfHwgY3R4LT5jdHhfc3RhdGUgPT0gUEZNX0NUWF9NQVNLRUQ7CisKKwkvKgorCSAqIHdlIG11c3QgY2xlYXIgdGhlIGRlYnVnIHJlZ2lzdGVycyBpZiBwbWM0MSBoYXMgYSB2YWx1ZSB3aGljaCBlbmFibGUKKwkgKiBtZW1vcnkgcGlwZWxpbmUgZXZlbnQgY29uc3RyYWludHMuIEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIGNsZWFyIHRoZQorCSAqIHRoZSBkZWJ1ZyByZWdpc3RlcnMgaWYgdGhleSBoYXZlIG5vdCB5ZXQgYmVlbiBhY2Nlc3NlZC4gVGhpcyBpcyByZXF1aXJlZAorCSAqIHRvIGF2b2lkIHBpY2tpbmcgc3RhbGUgc3RhdGUuCisJICogUE1DNDEgaXMgImFjdGl2ZSIgaWY6CisJICogCW9uZSBvZiB0aGUgcG1jNDEuY2ZnX2R0YWdYWCBmaWVsZCBpcyBkaWZmZXJlbnQgZnJvbSAweDMKKwkgKiBBTkQKKwkgKiAJYXQgdGhlIGNvcnJlc3BvbmRpbmcgcG1jNDEuZW5fZGJycFhYIGlzIHNldC4KKwkgKiBBTkQKKwkgKgljdHhfZmxfdXNpbmdfZGJyZWcgPT0gMCAgKGkuZS4sIGRiciBub3QgeWV0IHVzZWQpCisJICovCisJRFBSSU5UKCgiY251bT0ldSB2YWw9MHglbHgsIHVzaW5nX2RicmVnPSVkIGxvYWRlZD0lZFxuIiwgY251bSwgdG1wdmFsLCBjdHgtPmN0eF9mbF91c2luZ19kYnJlZywgaXNfbG9hZGVkKSk7CisKKwlpZiAoY251bSA9PSA0MSAmJiBpc19sb2FkZWQgCisJICAgICYmICh0bXB2YWwgJiAweDFlMDAwMDAwMDAwMDApICYmICh0bXB2YWwgJiAweDE4MTgxODE4VUwpICE9IDB4MTgxODE4MThVTCAmJiBjdHgtPmN0eF9mbF91c2luZ19kYnJlZyA9PSAwKSB7CisKKwkJRFBSSU5UKCgicG1jWyVkXT0weCVseCBoYXMgYWN0aXZlIHBtYzQxIHNldHRpbmdzLCBjbGVhcmluZyBkYnJcbiIsIGNudW0sIHRtcHZhbCkpOworCisJCS8qIGRvbid0IG1peCBkZWJ1ZyB3aXRoIHBlcmZtb24gKi8KKwkJaWYgKHRhc2sgJiYgKHRhc2stPnRocmVhZC5mbGFncyAmIElBNjRfVEhSRUFEX0RCR19WQUxJRCkgIT0gMCkgcmV0dXJuIC1FSU5WQUw7CisKKwkJLyoKKwkJICogYSBjb3VudCBvZiAwIHdpbGwgbWFyayB0aGUgZGVidWcgcmVnaXN0ZXJzIGlmOgorCQkgKiBBTkQKKwkJICovCisJCXJldCA9IHBmbV93cml0ZV9pYnJfZGJyKFBGTV9EQVRBX1JSLCBjdHgsIE5VTEwsIDAsIHJlZ3MpOworCQlpZiAocmV0KSByZXR1cm4gcmV0OworCX0KKwkvKgorCSAqIHdlIG11c3QgY2xlYXIgdGhlIChpbnN0cnVjdGlvbikgZGVidWcgcmVnaXN0ZXJzIGlmOgorCSAqIAlwbWMzOC5pZ19pYnJwWCBpcyAwIChlbmFibGVkKQorCSAqIEFORAorCSAqCWN0eF9mbF91c2luZ19kYnJlZyA9PSAwICAoaS5lLiwgZGJyIG5vdCB5ZXQgdXNlZCkKKwkgKi8KKwlpZiAoY251bSA9PSAzOCAmJiBpc19sb2FkZWQgJiYgKCh0bXB2YWwgJiAweDQ5MlVMKSAhPSAweDQ5MlVMKSAmJiBjdHgtPmN0eF9mbF91c2luZ19kYnJlZyA9PSAwKSB7CisKKwkJRFBSSU5UKCgicG1jMzg9MHglbHggaGFzIGFjdGl2ZSBwbWMzOCBzZXR0aW5ncywgY2xlYXJpbmcgaWJyXG4iLCB0bXB2YWwpKTsKKworCQkvKiBkb24ndCBtaXggZGVidWcgd2l0aCBwZXJmbW9uICovCisJCWlmICh0YXNrICYmICh0YXNrLT50aHJlYWQuZmxhZ3MgJiBJQTY0X1RIUkVBRF9EQkdfVkFMSUQpICE9IDApIHJldHVybiAtRUlOVkFMOworCisJCS8qCisJCSAqIGEgY291bnQgb2YgMCB3aWxsIG1hcmsgdGhlIGRlYnVnIHJlZ2lzdGVycyBhcyBpbiB1c2UgYW5kIGFsc28KKwkJICogZW5zdXJlIHRoYXQgdGhleSBhcmUgcHJvcGVybHkgY2xlYXJlZC4KKwkJICovCisJCXJldCA9IHBmbV93cml0ZV9pYnJfZGJyKFBGTV9DT0RFX1JSLCBjdHgsIE5VTEwsIDAsIHJlZ3MpOworCQlpZiAocmV0KSByZXR1cm4gcmV0OworCisJfQorCXN3aXRjaChjbnVtKSB7CisJCWNhc2UgIDMyOiB2YWwzMiA9ICp2YWw7CisJCQkgIHZhbDM4ID0gY3R4LT5jdHhfcG1jc1szOF07CisJCQkgIHZhbDQxID0gY3R4LT5jdHhfcG1jc1s0MV07CisJCQkgIGNoZWNrX2Nhc2UxID0gMTsKKwkJCSAgYnJlYWs7CisJCWNhc2UgIDM4OiB2YWwzOCA9ICp2YWw7CisJCQkgIHZhbDMyID0gY3R4LT5jdHhfcG1jc1szMl07CisJCQkgIHZhbDQxID0gY3R4LT5jdHhfcG1jc1s0MV07CisJCQkgIGNoZWNrX2Nhc2UxID0gMTsKKwkJCSAgYnJlYWs7CisJCWNhc2UgIDQxOiB2YWw0MSA9ICp2YWw7CisJCQkgIHZhbDMyID0gY3R4LT5jdHhfcG1jc1szMl07CisJCQkgIHZhbDM4ID0gY3R4LT5jdHhfcG1jc1szOF07CisJCQkgIGNoZWNrX2Nhc2UxID0gMTsKKwkJCSAgYnJlYWs7CisJfQorCS8qIGNoZWNrIGlsbGVnYWwgY29uZmlndXJhdGlvbiB3aGljaCBjYW4gcHJvZHVjZSBpbmNvbnNpc3RlbmNpZXMgaW4gdGFnZ2luZworCSAqIGktc2lkZSBldmVudHMgaW4gTDFEIGFuZCBMMiBjYWNoZXMKKwkgKi8KKwlpZiAoY2hlY2tfY2FzZTEpIHsKKwkJcmV0ID0gICAoKCh2YWw0MSA+PiA0NSkgJiAweGYpID09IDAgJiYgKCh2YWwzMj4+NTcpICYgMHgxKSA9PSAwKQorCQkgICAgICYmICgoKCh2YWwzOD4+MSkgJiAweDMpID09IDB4MiB8fCAoKHZhbDM4Pj4xKSAmIDB4MykgPT0gMCkKKwkJICAgICB8fCAgKCgodmFsMzg+PjQpICYgMHgzKSA9PSAweDIgfHwgKCh2YWwzOD4+NCkgJiAweDMpID09IDApKTsKKwkJaWYgKHJldCkgeworCQkJRFBSSU5UKCgiaW52YWxpZCBjb25maWcgcG1jMzg9MHglbHggcG1jNDE9MHglbHggcG1jMzI9MHglbHhcbiIsIHZhbDM4LCB2YWw0MSwgdmFsMzIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCSp2YWwgPSB0bXB2YWw7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpbXBsX3BtY3MsIGltcGxfcG1kcyBhcmUgY29tcHV0ZWQgYXQgcnVudGltZSB0byBtaW5pbWl6ZSBlcnJvcnMhCisgKi8KK3N0YXRpYyBwbXVfY29uZmlnX3QgcG11X2NvbmZfbW9udD17CisJLnBtdV9uYW1lICAgICAgICA9ICJNb250ZWNpdG8iLAorCS5wbXVfZmFtaWx5ICAgICAgPSAweDIwLAorCS5mbGFncyAgICAgICAgICAgPSBQRk1fUE1VX0lSUV9SRVNFTkQsCisJLm92ZmxfdmFsICAgICAgICA9ICgxVUwgPDwgNDcpIC0gMSwKKwkucG1kX2Rlc2MgICAgICAgID0gcGZtX21vbnRfcG1kX2Rlc2MsCisJLnBtY19kZXNjICAgICAgICA9IHBmbV9tb250X3BtY19kZXNjLAorCS5udW1faWJycyAgICAgICAgPSA4LAorCS5udW1fZGJycyAgICAgICAgPSA4LAorCS51c2VfcnJfZGJyZWdzICAgPSAxIC8qIGRlYnVnIHJlZ2lzdGVyIGFyZSB1c2UgZm9yIHJhbmdlIHJldHJpY3Rpb25zICovCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2lhNjQva2VybmVsL3Byb2Nlc3MuYwppbmRleCBlOTkwNGM3Li4zMDlkNTk2IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3Byb2Nlc3MuYwpAQCAtMzI4LDcgKzMyOCw3IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19JQTMyX1NVUFBPUlQKLQlpZiAoSVNfSUEzMl9QUk9DRVNTKGlhNjRfdGFza19yZWdzKHRhc2spKSkKKwlpZiAoSVNfSUEzMl9QUk9DRVNTKHRhc2tfcHRfcmVncyh0YXNrKSkpCiAJCWlhMzJfc2F2ZV9zdGF0ZSh0YXNrKTsKICNlbmRpZgogfQpAQCAtMzUzLDcgKzM1Myw3IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19JQTMyX1NVUFBPUlQKLQlpZiAoSVNfSUEzMl9QUk9DRVNTKGlhNjRfdGFza19yZWdzKHRhc2spKSkKKwlpZiAoSVNfSUEzMl9QUk9DRVNTKHRhc2tfcHRfcmVncyh0YXNrKSkpCiAJCWlhMzJfbG9hZF9zdGF0ZSh0YXNrKTsKICNlbmRpZgogfQpAQCAtNDg4LDcgKzQ4OCw3IEBACiAJICogSWYgd2UncmUgY2xvbmluZyBhbiBJQTMyIHRhc2sgdGhlbiBzYXZlIHRoZSBJQTMyIGV4dHJhCiAJICogc3RhdGUgZnJvbSB0aGUgY3VycmVudCB0YXNrIHRvIHRoZSBuZXcgdGFzawogCSAqLwotCWlmIChJU19JQTMyX1BST0NFU1MoaWE2NF90YXNrX3JlZ3MoY3VycmVudCkpKSB7CisJaWYgKElTX0lBMzJfUFJPQ0VTUyh0YXNrX3B0X3JlZ3MoY3VycmVudCkpKSB7CiAJCWlhMzJfc2F2ZV9zdGF0ZShwKTsKIAkJaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfU0VUVExTKQogCQkJcmV0dmFsID0gaWEzMl9jbG9uZV90bHMocCwgY2hpbGRfcHRyZWdzKTsKQEAgLTcwMSw3ICs3MDEsNyBAQAoga2VybmVsX3RocmVhZF9oZWxwZXIgKGludCAoKmZuKSh2b2lkICopLCB2b2lkICphcmcpCiB7CiAjaWZkZWYgQ09ORklHX0lBMzJfU1VQUE9SVAotCWlmIChJU19JQTMyX1BST0NFU1MoaWE2NF90YXNrX3JlZ3MoY3VycmVudCkpKSB7CisJaWYgKElTX0lBMzJfUFJPQ0VTUyh0YXNrX3B0X3JlZ3MoY3VycmVudCkpKSB7CiAJCS8qIEEga2VybmVsIHRocmVhZCBpcyBhbHdheXMgYSA2NC1iaXQgcHJvY2Vzcy4gKi8KIAkJY3VycmVudC0+dGhyZWFkLm1hcF9iYXNlICA9IERFRkFVTFRfTUFQX0JBU0U7CiAJCWN1cnJlbnQtPnRocmVhZC50YXNrX3NpemUgPSBERUZBVUxUX1RBU0tfU0laRTsKQEAgLTcyMiw3ICs3MjIsNyBAQAogCWN1cnJlbnQtPnRocmVhZC5mbGFncyAmPSB+KElBNjRfVEhSRUFEX0ZQSF9WQUxJRCB8IElBNjRfVEhSRUFEX0RCR19WQUxJRCk7CiAJaWE2NF9kcm9wX2ZwdShjdXJyZW50KTsKICNpZmRlZiBDT05GSUdfSUEzMl9TVVBQT1JUCi0JaWYgKElTX0lBMzJfUFJPQ0VTUyhpYTY0X3Rhc2tfcmVncyhjdXJyZW50KSkpIHsKKwlpZiAoSVNfSUEzMl9QUk9DRVNTKHRhc2tfcHRfcmVncyhjdXJyZW50KSkpIHsKIAkJaWEzMl9kcm9wX3BhcnRpYWxfcGFnZV9saXN0KGN1cnJlbnQpOwogCQljdXJyZW50LT50aHJlYWQudGFza19zaXplID0gSUEzMl9QQUdFX09GRlNFVDsKIAkJc2V0X2ZzKFVTRVJfRFMpOwpAQCAtNzU1LDcgKzc1NSw3IEBACiAJaWYgKGN1cnJlbnQtPnRocmVhZC5mbGFncyAmIElBNjRfVEhSRUFEX0RCR19WQUxJRCkKIAkJcGZtX3JlbGVhc2VfZGVidWdfcmVnaXN0ZXJzKGN1cnJlbnQpOwogI2VuZGlmCi0JaWYgKElTX0lBMzJfUFJPQ0VTUyhpYTY0X3Rhc2tfcmVncyhjdXJyZW50KSkpCisJaWYgKElTX0lBMzJfUFJPQ0VTUyh0YXNrX3B0X3JlZ3MoY3VycmVudCkpKQogCQlpYTMyX2Ryb3BfcGFydGlhbF9wYWdlX2xpc3QoY3VycmVudCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2lhNjQva2VybmVsL3B0cmFjZS5jCmluZGV4IDRiMTlkMDQuLmVhZWQxNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9wdHJhY2UuYwpAQCAtMjU0LDcgKzI1NCw3IEBACiAJbG9uZyBudW1fcmVncywgbmJpdHM7CiAJc3RydWN0IHB0X3JlZ3MgKnB0OwogCi0JcHQgPSBpYTY0X3Rhc2tfcmVncyh0YXNrKTsKKwlwdCA9IHRhc2tfcHRfcmVncyh0YXNrKTsKIAlrYnNwID0gKHVuc2lnbmVkIGxvbmcgKikgc3ctPmFyX2JzcHN0b3JlOwogCXVic3BzdG9yZSA9ICh1bnNpZ25lZCBsb25nICopIHB0LT5hcl9ic3BzdG9yZTsKIApAQCAtMzE0LDcgKzMxNCw3IEBACiAJc3RydWN0IHB0X3JlZ3MgKnB0OwogCXVuc2lnbmVkIGxvbmcgY2ZtLCAqdXJic19rYXJnczsKIAotCXB0ID0gaWE2NF90YXNrX3JlZ3ModGFzayk7CisJcHQgPSB0YXNrX3B0X3JlZ3ModGFzayk7CiAJa2JzcCA9ICh1bnNpZ25lZCBsb25nICopIHN3LT5hcl9ic3BzdG9yZTsKIAl1YnNwc3RvcmUgPSAodW5zaWduZWQgbG9uZyAqKSBwdC0+YXJfYnNwc3RvcmU7CiAKQEAgLTQwNyw3ICs0MDcsNyBAQAogCiAJdXJic19lbmQgPSAobG9uZyAqKSB1c2VyX3Jic19lbmQ7CiAJbGFkZHIgPSAodW5zaWduZWQgbG9uZyAqKSBhZGRyOwotCWNoaWxkX3JlZ3MgPSBpYTY0X3Rhc2tfcmVncyhjaGlsZCk7CisJY2hpbGRfcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CiAJYnNwc3RvcmUgPSAodW5zaWduZWQgbG9uZyAqKSBjaGlsZF9yZWdzLT5hcl9ic3BzdG9yZTsKIAlrcmJzID0gKHVuc2lnbmVkIGxvbmcgKikgY2hpbGQgKyBJQTY0X1JCU19PRkZTRVQvODsKIAlpZiAob25fa2VybmVsX3JicyhhZGRyLCAodW5zaWduZWQgbG9uZykgYnNwc3RvcmUsCkBAIC00NjcsNyArNDY3LDcgQEAKIAlzdHJ1Y3QgcHRfcmVncyAqY2hpbGRfcmVnczsKIAogCWxhZGRyID0gKHVuc2lnbmVkIGxvbmcgKikgYWRkcjsKLQljaGlsZF9yZWdzID0gaWE2NF90YXNrX3JlZ3MoY2hpbGQpOworCWNoaWxkX3JlZ3MgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwogCWJzcHN0b3JlID0gKHVuc2lnbmVkIGxvbmcgKikgY2hpbGRfcmVncy0+YXJfYnNwc3RvcmU7CiAJa3JicyA9ICh1bnNpZ25lZCBsb25nICopIGNoaWxkICsgSUE2NF9SQlNfT0ZGU0VULzg7CiAJaWYgKG9uX2tlcm5lbF9yYnMoYWRkciwgKHVuc2lnbmVkIGxvbmcpIGJzcHN0b3JlLApAQCAtNTY3LDcgKzU2Nyw3IEBACiAJCSAqLwogCQlyZXR1cm4gMDsKIAotCXRocmVhZF9yZWdzID0gaWE2NF90YXNrX3JlZ3ModGhyZWFkKTsKKwl0aHJlYWRfcmVncyA9IHRhc2tfcHRfcmVncyh0aHJlYWQpOwogCXRocmVhZF9yYnNfZW5kID0gaWE2NF9nZXRfdXNlcl9yYnNfZW5kKHRocmVhZCwgdGhyZWFkX3JlZ3MsIE5VTEwpOwogCWlmICghb25fa2VybmVsX3JicyhhZGRyLCB0aHJlYWRfcmVncy0+YXJfYnNwc3RvcmUsIHRocmVhZF9yYnNfZW5kKSkKIAkJcmV0dXJuIDA7CkBAIC02MjcsNyArNjI3LDcgQEAKIGlubGluZSB2b2lkCiBpYTY0X2ZsdXNoX2ZwaCAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCXN0cnVjdCBpYTY0X3BzciAqcHNyID0gaWE2NF9wc3IoaWE2NF90YXNrX3JlZ3ModGFzaykpOworCXN0cnVjdCBpYTY0X3BzciAqcHNyID0gaWE2NF9wc3IodGFza19wdF9yZWdzKHRhc2spKTsKIAogCS8qCiAJICogUHJldmVudCBtaWdyYXRpbmcgdGhpcyB0YXNrIHdoaWxlCkBAIC02NTMsNyArNjUzLDcgQEAKIHZvaWQKIGlhNjRfc3luY19mcGggKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQlzdHJ1Y3QgaWE2NF9wc3IgKnBzciA9IGlhNjRfcHNyKGlhNjRfdGFza19yZWdzKHRhc2spKTsKKwlzdHJ1Y3QgaWE2NF9wc3IgKnBzciA9IGlhNjRfcHNyKHRhc2tfcHRfcmVncyh0YXNrKSk7CiAKIAlpYTY0X2ZsdXNoX2ZwaCh0YXNrKTsKIAlpZiAoISh0YXNrLT50aHJlYWQuZmxhZ3MgJiBJQTY0X1RIUkVBRF9GUEhfVkFMSUQpKSB7CkBAIC03OTQsNyArNzk0LDcgQEAKIAkJCQkJICArIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWcpKSkKIAogCi0JcHQgPSBpYTY0X3Rhc2tfcmVncyhjaGlsZCk7CisJcHQgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwogCXN3ID0gKHN0cnVjdCBzd2l0Y2hfc3RhY2sgKikgKGNoaWxkLT50aHJlYWQua3NwICsgMTYpOwogCiAJaWYgKChhZGRyICYgMHg3KSAhPSAwKSB7CkBAIC0xMTIwLDcgKzExMjAsNyBAQAogCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcHByLCBzaXplb2Yoc3RydWN0IHB0X2FsbF91c2VyX3JlZ3MpKSkKIAkJcmV0dXJuIC1FSU87CiAKLQlwdCA9IGlhNjRfdGFza19yZWdzKGNoaWxkKTsKKwlwdCA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CiAJc3cgPSAoc3RydWN0IHN3aXRjaF9zdGFjayAqKSAoY2hpbGQtPnRocmVhZC5rc3AgKyAxNik7CiAJdW53X2luaXRfZnJvbV9ibG9ja2VkX3Rhc2soJmluZm8sIGNoaWxkKTsKIAlpZiAodW53X3Vud2luZF90b191c2VyKCZpbmZvKSA8IDApIHsKQEAgLTEyNjUsNyArMTI2NSw3IEBACiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHBwciwgc2l6ZW9mKHN0cnVjdCBwdF9hbGxfdXNlcl9yZWdzKSkpCiAJCXJldHVybiAtRUlPOwogCi0JcHQgPSBpYTY0X3Rhc2tfcmVncyhjaGlsZCk7CisJcHQgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwogCXN3ID0gKHN0cnVjdCBzd2l0Y2hfc3RhY2sgKikgKGNoaWxkLT50aHJlYWQua3NwICsgMTYpOwogCXVud19pbml0X2Zyb21fYmxvY2tlZF90YXNrKCZpbmZvLCBjaGlsZCk7CiAJaWYgKHVud191bndpbmRfdG9fdXNlcigmaW5mbykgPCAwKSB7CkBAIC0xNDAzLDcgKzE0MDMsNyBAQAogdm9pZAogcHRyYWNlX2Rpc2FibGUgKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCiB7Ci0Jc3RydWN0IGlhNjRfcHNyICpjaGlsZF9wc3IgPSBpYTY0X3BzcihpYTY0X3Rhc2tfcmVncyhjaGlsZCkpOworCXN0cnVjdCBpYTY0X3BzciAqY2hpbGRfcHNyID0gaWE2NF9wc3IodGFza19wdF9yZWdzKGNoaWxkKSk7CiAKIAkvKiBtYWtlIHN1cmUgdGhlIHNpbmdsZSBzdGVwL3Rha2VuLWJyYW5jaCB0cmFwIGJpdHMgYXJlIG5vdCBzZXQ6ICovCiAJY2hpbGRfcHNyLT5zcyA9IDA7CkBAIC0xNDIyLDE0ICsxNDIyLDcgQEAKIAlsb2NrX2tlcm5lbCgpOwogCXJldCA9IC1FUEVSTTsKIAlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfVFJBQ0VNRSkgewotCQkvKiBhcmUgd2UgYWxyZWFkeSBiZWluZyB0cmFjZWQ/ICovCi0JCWlmIChjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKQotCQkJZ290byBvdXQ7Ci0JCXJldCA9IHNlY3VyaXR5X3B0cmFjZShjdXJyZW50LT5wYXJlbnQsIGN1cnJlbnQpOwotCQlpZiAocmV0KQotCQkJZ290byBvdXQ7Ci0JCWN1cnJlbnQtPnB0cmFjZSB8PSBQVF9QVFJBQ0VEOwotCQlyZXQgPSAwOworCQlyZXQgPSBwdHJhY2VfdHJhY2VtZSgpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTE0NjMsNyArMTQ1Niw3IEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X3RzazsKIAotCXB0ID0gaWE2NF90YXNrX3JlZ3MoY2hpbGQpOworCXB0ID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAlzdyA9IChzdHJ1Y3Qgc3dpdGNoX3N0YWNrICopIChjaGlsZC0+dGhyZWFkLmtzcCArIDE2KTsKIAogCXN3aXRjaCAocmVxdWVzdCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zYWxpbmZvLmMgYi9hcmNoL2lhNjQva2VybmVsL3NhbGluZm8uYwppbmRleCAxNDYxZGM2Li45ZDVhODIzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3NhbGluZm8uYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NhbGluZm8uYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBDcmVhdGVzIGVudHJpZXMgaW4gL3Byb2Mvc2FsIGZvciB2YXJpb3VzIHN5c3RlbSBmZWF0dXJlcy4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChjKSAyMDAzIEhld2xldHQtUGFja2FyZCBDbwogICoJQmpvcm4gSGVsZ2FhcyA8Ympvcm4uaGVsZ2Fhc0BocC5jb20+CiAgKgpAQCAtMjcsOCArMjcsMTcgQEAKICAqICAgbWNhLmMgbWF5IG5vdCBwYXNzIGEgYnVmZmVyLCBhIE5VTEwgYnVmZmVyIGp1c3QgaW5kaWNhdGVzIHRoYXQgYSBuZXcKICAqICAgcmVjb3JkIGlzIGF2YWlsYWJsZSBpbiBTQUwuCiAgKiAgIFJlcGxhY2Ugc29tZSBOUl9DUFVTIGJ5IGNwdXNfb25saW5lLCBmb3IgaG90cGx1ZyBjcHUuCisgKgorICogSmFuICA1IDIwMDYgICAgICAgIGthb3NAc2dpLmNvbQorICogICBIYW5kbGUgaG90cGx1ZyBjcHVzIGNvbWluZyBvbmxpbmUuCisgKiAgIEhhbmRsZSBob3RwbHVnIGNwdXMgZ29pbmcgb2ZmbGluZSB3aGlsZSB0aGV5IHN0aWxsIGhhdmUgb3V0c3RhbmRpbmcgcmVjb3Jkcy4KKyAqICAgVXNlIHRoZSBjcHVfKiBtYWNyb3MgY29uc2lzdGVudGx5LgorICogICBSZXBsYWNlIHRoZSBjb3VudGluZyBzZW1hcGhvcmUgd2l0aCBhIG11dGV4IGFuZCBhIHRlc3QgaWYgdGhlIGNwdW1hc2sgaXMgbm9uLWVtcHR5LgorICogICBNb2RpZnkgdGhlIGxvY2tpbmcgdG8gbWFrZSB0aGUgdGVzdCBmb3IgIndvcmsgdG8gZG8iIGFuIGF0b21pYyBvcGVyYXRpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTEzMSw4ICsxNDAsOCBAQAogfTsKIAogc3RydWN0IHNhbGluZm9fZGF0YSB7Ci0Jdm9sYXRpbGUgY3B1bWFza190CWNwdV9ldmVudDsJLyogd2hpY2ggY3B1cyBoYXZlIG91dHN0YW5kaW5nIGV2ZW50cyAqLwotCXN0cnVjdCBzZW1hcGhvcmUJc2VtOwkJLyogY291bnQgb2YgY3B1cyB3aXRoIG91dHN0YW5kaW5nIGV2ZW50cyAoYml0cyBzZXQgaW4gY3B1X2V2ZW50KSAqLworCWNwdW1hc2tfdAkJY3B1X2V2ZW50OwkvKiB3aGljaCBjcHVzIGhhdmUgb3V0c3RhbmRpbmcgZXZlbnRzICovCisJc3RydWN0IHNlbWFwaG9yZQltdXRleDsKIAl1OAkJCSpsb2dfYnVmZmVyOwogCXU2NAkJCWxvZ19zaXplOwogCXU4CQkJKm9lbWRhdGE7CS8qIGRlY29kZWQgb2VtIGRhdGEgKi8KQEAgLTE3Myw2ICsxODIsMjEgQEAKIAlpbnQgcmV0OwogfTsKIAorLyogS2ljayB0aGUgbXV0ZXggdGhhdCB0ZWxscyB1c2VyIHNwYWNlIHRoYXQgdGhlcmUgaXMgd29yayB0byBkby4gIEluc3RlYWQgb2YKKyAqIHRyeWluZyB0byB0cmFjayB0aGUgc3RhdGUgb2YgdGhlIG11dGV4IGFjcm9zcyBtdWx0aXBsZSBjcHVzLCBpbiB1c2VyCisgKiBjb250ZXh0LCBpbnRlcnJ1cHQgY29udGV4dCwgbm9uLW1hc2thYmxlIGludGVycnVwdCBjb250ZXh0IGFuZCBob3RwbHVnIGNwdSwKKyAqIGl0IGlzIGZhciBlYXNpZXIganVzdCB0byBncmFiIHRoZSBtdXRleCBpZiBpdCBpcyBmcmVlIHRoZW4gcmVsZWFzZSBpdC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgd2l0aCBkYXRhX3NhdmVkX2xvY2sgaGVsZCwgdG8gbWFrZSB0aGUgZG93bi91cAorICogb3BlcmF0aW9uIGF0b21pYy4KKyAqLworc3RhdGljIHZvaWQKK3NhbGluZm9fd29ya190b19kbyhzdHJ1Y3Qgc2FsaW5mb19kYXRhICpkYXRhKQoreworCWRvd25fdHJ5bG9jaygmZGF0YS0+bXV0ZXgpOworCXVwKCZkYXRhLT5tdXRleCk7Cit9CisKIHN0YXRpYyB2b2lkCiBzYWxpbmZvX3BsYXRmb3JtX29lbWRhdGFfY3B1KHZvaWQgKmNvbnRleHQpCiB7CkBAIC0yMTEsOSArMjM1LDkgQEAKIAogCUJVR19PTih0eXBlID49IEFSUkFZX1NJWkUoc2FsaW5mb19sb2dfbmFtZSkpOwogCisJaWYgKGlycXNhZmUpCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkYXRhX3NhdmVkX2xvY2ssIGZsYWdzKTsKIAlpZiAoYnVmZmVyKSB7Ci0JCWlmIChpcnFzYWZlKQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGFfc2F2ZWRfbG9jaywgZmxhZ3MpOwogCQlmb3IgKGkgPSAwLCBkYXRhX3NhdmVkID0gZGF0YS0+ZGF0YV9zYXZlZDsgaSA8IHNhdmVkX3NpemU7ICsraSwgKytkYXRhX3NhdmVkKSB7CiAJCQlpZiAoIWRhdGFfc2F2ZWQtPmJ1ZmZlcikKIAkJCQlicmVhazsKQEAgLTIzMSwxMyArMjU1LDExIEBACiAJCQlkYXRhX3NhdmVkLT5zaXplID0gc2l6ZTsKIAkJCWRhdGFfc2F2ZWQtPmJ1ZmZlciA9IGJ1ZmZlcjsKIAkJfQotCQlpZiAoaXJxc2FmZSkKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhdGFfc2F2ZWRfbG9jaywgZmxhZ3MpOwogCX0KLQotCWlmICghdGVzdF9hbmRfc2V0X2JpdChzbXBfcHJvY2Vzc29yX2lkKCksICZkYXRhLT5jcHVfZXZlbnQpKSB7Ci0JCWlmIChpcnFzYWZlKQotCQkJdXAoJmRhdGEtPnNlbSk7CisJY3B1X3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGRhdGEtPmNwdV9ldmVudCk7CisJaWYgKGlycXNhZmUpIHsKKwkJc2FsaW5mb193b3JrX3RvX2RvKGRhdGEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhX3NhdmVkX2xvY2ssIGZsYWdzKTsKIAl9CiB9CiAKQEAgLTI0OCwyMCArMjcwLDE3IEBACiBzdGF0aWMgdm9pZAogc2FsaW5mb190aW1lb3V0X2NoZWNrKHN0cnVjdCBzYWxpbmZvX2RhdGEgKmRhdGEpCiB7Ci0JaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpZiAoIWRhdGEtPm9wZW4pCiAJCXJldHVybjsKLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKLQkJaWYgKHRlc3RfYml0KGksICZkYXRhLT5jcHVfZXZlbnQpKSB7Ci0JCQkvKiBkb3VibGUgdXAoKSBpcyBub3QgYSBwcm9ibGVtLCB1c2VyIHNwYWNlIHdpbGwgc2VlIG5vCi0JCQkgKiByZWNvcmRzIGZvciB0aGUgYWRkaXRpb25hbCAiZXZlbnRzIi4KLQkJCSAqLwotCQkJdXAoJmRhdGEtPnNlbSk7Ci0JCX0KKwlpZiAoIWNwdXNfZW1wdHkoZGF0YS0+Y3B1X2V2ZW50KSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YV9zYXZlZF9sb2NrLCBmbGFncyk7CisJCXNhbGluZm9fd29ya190b19kbyhkYXRhKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YV9zYXZlZF9sb2NrLCBmbGFncyk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCAKK3N0YXRpYyB2b2lkCiBzYWxpbmZvX3RpbWVvdXQgKHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXNhbGluZm9fdGltZW91dF9jaGVjayhzYWxpbmZvX2RhdGEgKyBTQUxfSU5GT19UWVBFX01DQSk7CkBAIC0yODksMTYgKzMwOCwyMCBAQAogCWludCBpLCBuLCBjcHUgPSAtMTsKIAogcmV0cnk6Ci0JaWYgKGRvd25fdHJ5bG9jaygmZGF0YS0+c2VtKSkgeworCWlmIChjcHVzX2VtcHR5KGRhdGEtPmNwdV9ldmVudCkgJiYgZG93bl90cnlsb2NrKCZkYXRhLT5tdXRleCkpIHsKIAkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQogCQkJcmV0dXJuIC1FQUdBSU47Ci0JCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRhdGEtPnNlbSkpCisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRhdGEtPm11dGV4KSkKIAkJCXJldHVybiAtRUlOVFI7CiAJfQogCiAJbiA9IGRhdGEtPmNwdV9jaGVjazsKIAlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7Ci0JCWlmICh0ZXN0X2JpdChuLCAmZGF0YS0+Y3B1X2V2ZW50KSAmJiBjcHVfb25saW5lKG4pKSB7CisJCWlmIChjcHVfaXNzZXQobiwgZGF0YS0+Y3B1X2V2ZW50KSkgeworCQkJaWYgKCFjcHVfb25saW5lKG4pKSB7CisJCQkJY3B1X2NsZWFyKG4sIGRhdGEtPmNwdV9ldmVudCk7CisJCQkJY29udGludWU7CisJCQl9CiAJCQljcHUgPSBuOwogCQkJYnJlYWs7CiAJCX0KQEAgLTMwOSw5ICszMzIsNiBAQAogCWlmIChjcHUgPT0gLTEpCiAJCWdvdG8gcmV0cnk7CiAKLQkvKiBldmVudHMgYXJlIHN0aWNreSB1bnRpbCB0aGUgdXNlciBzYXlzICJjbGVhciIgKi8KLQl1cCgmZGF0YS0+c2VtKTsKLQogCS8qIGZvciBuZXh0IHJlYWQsIHN0YXJ0IGNoZWNraW5nIGF0IG5leHQgQ1BVICovCiAJZGF0YS0+Y3B1X2NoZWNrID0gY3B1OwogCWlmICgrK2RhdGEtPmNwdV9jaGVjayA9PSBOUl9DUFVTKQpAQCAtMzgwLDEwICs0MDAsOCBAQAogc3RhdGljIHZvaWQKIGNhbGxfb25fY3B1KGludCBjcHUsIHZvaWQgKCpmbikodm9pZCAqKSwgdm9pZCAqYXJnKQogewotCWNwdW1hc2tfdCBzYXZlX2NwdXNfYWxsb3dlZCwgbmV3X2NwdXNfYWxsb3dlZDsKLQltZW1jcHkoJnNhdmVfY3B1c19hbGxvd2VkLCAmY3VycmVudC0+Y3B1c19hbGxvd2VkLCBzaXplb2Yoc2F2ZV9jcHVzX2FsbG93ZWQpKTsKLQltZW1zZXQoJm5ld19jcHVzX2FsbG93ZWQsIDAsIHNpemVvZihuZXdfY3B1c19hbGxvd2VkKSk7Ci0Jc2V0X2JpdChjcHUsICZuZXdfY3B1c19hbGxvd2VkKTsKKwljcHVtYXNrX3Qgc2F2ZV9jcHVzX2FsbG93ZWQgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJY3B1bWFza190IG5ld19jcHVzX2FsbG93ZWQgPSBjcHVtYXNrX29mX2NwdShjcHUpOwogCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgbmV3X2NwdXNfYWxsb3dlZCk7CiAJKCpmbikoYXJnKTsKIAlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIHNhdmVfY3B1c19hbGxvd2VkKTsKQEAgLTQzMiwxMCArNDUwLDEwIEBACiAJaWYgKCFkYXRhLT5zYXZlZF9udW0pCiAJCWNhbGxfb25fY3B1KGNwdSwgc2FsaW5mb19sb2dfcmVhZF9jcHUsIGRhdGEpOwogCWlmICghZGF0YS0+bG9nX3NpemUpIHsKLQkgICAgICAgIGRhdGEtPnN0YXRlID0gU1RBVEVfTk9fREFUQTsKLQkgICAgICAgIGNsZWFyX2JpdChjcHUsICZkYXRhLT5jcHVfZXZlbnQpOworCQlkYXRhLT5zdGF0ZSA9IFNUQVRFX05PX0RBVEE7CisJCWNwdV9jbGVhcihjcHUsIGRhdGEtPmNwdV9ldmVudCk7CiAJfSBlbHNlIHsKLQkgICAgICAgIGRhdGEtPnN0YXRlID0gU1RBVEVfTE9HX1JFQ09SRDsKKwkJZGF0YS0+c3RhdGUgPSBTVEFURV9MT0dfUkVDT1JEOwogCX0KIH0KIApAQCAtNDcyLDI3ICs0OTAsMzEgQEAKIHNhbGluZm9fbG9nX2NsZWFyKHN0cnVjdCBzYWxpbmZvX2RhdGEgKmRhdGEsIGludCBjcHUpCiB7CiAJc2FsX2xvZ19yZWNvcmRfaGVhZGVyX3QgKnJoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGFfc2F2ZWRfbG9jaywgZmxhZ3MpOwogCWRhdGEtPnN0YXRlID0gU1RBVEVfTk9fREFUQTsKLQlpZiAoIXRlc3RfYml0KGNwdSwgJmRhdGEtPmNwdV9ldmVudCkpCi0JCXJldHVybiAwOwotCWRvd24oJmRhdGEtPnNlbSk7Ci0JY2xlYXJfYml0KGNwdSwgJmRhdGEtPmNwdV9ldmVudCk7Ci0JaWYgKGRhdGEtPnNhdmVkX251bSkgewotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YV9zYXZlZF9sb2NrLCBmbGFncyk7Ci0JCXNoaWZ0MV9kYXRhX3NhdmVkKGRhdGEsIGRhdGEtPnNhdmVkX251bSAtIDEgKTsKLQkJZGF0YS0+c2F2ZWRfbnVtID0gMDsKKwlpZiAoIWNwdV9pc3NldChjcHUsIGRhdGEtPmNwdV9ldmVudCkpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YV9zYXZlZF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOwogCX0KKwljcHVfY2xlYXIoY3B1LCBkYXRhLT5jcHVfZXZlbnQpOworCWlmIChkYXRhLT5zYXZlZF9udW0pIHsKKwkJc2hpZnQxX2RhdGFfc2F2ZWQoZGF0YSwgZGF0YS0+c2F2ZWRfbnVtIC0gMSk7CisJCWRhdGEtPnNhdmVkX251bSA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhdGFfc2F2ZWRfbG9jaywgZmxhZ3MpOwogCXJoID0gKHNhbF9sb2dfcmVjb3JkX2hlYWRlcl90ICopKGRhdGEtPmxvZ19idWZmZXIpOwogCS8qIENvcnJlY3RlZCBlcnJvcnMgaGF2ZSBhbHJlYWR5IGJlZW4gY2xlYXJlZCBmcm9tIFNBTCAqLwogCWlmIChyaC0+c2V2ZXJpdHkgIT0gc2FsX2xvZ19zZXZlcml0eV9jb3JyZWN0ZWQpCiAJCWNhbGxfb25fY3B1KGNwdSwgc2FsaW5mb19sb2dfY2xlYXJfY3B1LCBkYXRhKTsKIAkvKiBjbGVhcmluZyBhIHJlY29yZCBtYXkgbWFrZSBhIG5ldyByZWNvcmQgdmlzaWJsZSAqLwogCXNhbGluZm9fbG9nX25ld19yZWFkKGNwdSwgZGF0YSk7Ci0JaWYgKGRhdGEtPnN0YXRlID09IFNUQVRFX0xPR19SRUNPUkQgJiYKLQkgICAgIXRlc3RfYW5kX3NldF9iaXQoY3B1LCAgJmRhdGEtPmNwdV9ldmVudCkpCi0JCXVwKCZkYXRhLT5zZW0pOworCWlmIChkYXRhLT5zdGF0ZSA9PSBTVEFURV9MT0dfUkVDT1JEKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkYXRhX3NhdmVkX2xvY2ssIGZsYWdzKTsKKwkJY3B1X3NldChjcHUsIGRhdGEtPmNwdV9ldmVudCk7CisJCXNhbGluZm9fd29ya190b19kbyhkYXRhKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YV9zYXZlZF9sb2NrLCBmbGFncyk7CisJfQogCXJldHVybiAwOwogfQogCkBAIC01NDksNiArNTcxLDUzIEBACiAJLndyaXRlICAgPSBzYWxpbmZvX2xvZ193cml0ZSwKIH07CiAKKyNpZmRlZglDT05GSUdfSE9UUExVR19DUFUKK3N0YXRpYyBpbnQgX19kZXZpbml0CitzYWxpbmZvX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgY3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzYWxpbmZvX2RhdGEgKmRhdGE7CisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIENQVV9PTkxJTkU6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkYXRhX3NhdmVkX2xvY2ssIGZsYWdzKTsKKwkJZm9yIChpID0gMCwgZGF0YSA9IHNhbGluZm9fZGF0YTsKKwkJICAgICBpIDwgQVJSQVlfU0laRShzYWxpbmZvX2RhdGEpOworCQkgICAgICsraSwgKytkYXRhKSB7CisJCQljcHVfc2V0KGNwdSwgZGF0YS0+Y3B1X2V2ZW50KTsKKwkJCXNhbGluZm9fd29ya190b19kbyhkYXRhKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhX3NhdmVkX2xvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfREVBRDoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGFfc2F2ZWRfbG9jaywgZmxhZ3MpOworCQlmb3IgKGkgPSAwLCBkYXRhID0gc2FsaW5mb19kYXRhOworCQkgICAgIGkgPCBBUlJBWV9TSVpFKHNhbGluZm9fZGF0YSk7CisJCSAgICAgKytpLCArK2RhdGEpIHsKKwkJCXN0cnVjdCBzYWxpbmZvX2RhdGFfc2F2ZWQgKmRhdGFfc2F2ZWQ7CisJCQlpbnQgajsKKwkJCWZvciAoaiA9IEFSUkFZX1NJWkUoZGF0YS0+ZGF0YV9zYXZlZCkgLSAxLCBkYXRhX3NhdmVkID0gZGF0YS0+ZGF0YV9zYXZlZCArIGo7CisJCQkgICAgIGogPj0gMDsKKwkJCSAgICAgLS1qLCAtLWRhdGFfc2F2ZWQpIHsKKwkJCQlpZiAoZGF0YV9zYXZlZC0+YnVmZmVyICYmIGRhdGFfc2F2ZWQtPmNwdSA9PSBjcHUpIHsKKwkJCQkJc2hpZnQxX2RhdGFfc2F2ZWQoZGF0YSwgaik7CisJCQkJfQorCQkJfQorCQkJY3B1X2NsZWFyKGNwdSwgZGF0YS0+Y3B1X2V2ZW50KTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhX3NhdmVkX2xvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgc2FsaW5mb19jcHVfbm90aWZpZXIgPQoreworCS5ub3RpZmllcl9jYWxsID0gc2FsaW5mb19jcHVfY2FsbGJhY2ssCisJLnByaW9yaXR5ID0gMCwKK307CisjZW5kaWYJLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCisKIHN0YXRpYyBpbnQgX19pbml0CiBzYWxpbmZvX2luaXQodm9pZCkKIHsKQEAgLTU1Niw3ICs2MjUsNyBAQAogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKnNkaXIgPSBzYWxpbmZvX3Byb2NfZW50cmllczsgLyoga2VlcHMgdHJhY2sgb2YgZXZlcnkgZW50cnkgKi8KIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpciwgKmVudHJ5OwogCXN0cnVjdCBzYWxpbmZvX2RhdGEgKmRhdGE7Ci0JaW50IGksIGosIG9ubGluZTsKKwlpbnQgaSwgajsKIAogCXNhbGluZm9fZGlyID0gcHJvY19ta2Rpcigic2FsIiwgTlVMTCk7CiAJaWYgKCFzYWxpbmZvX2RpcikKQEAgLTU3MSw3ICs2NDAsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNhbGluZm9fbG9nX25hbWUpOyBpKyspIHsKIAkJZGF0YSA9IHNhbGluZm9fZGF0YSArIGk7CiAJCWRhdGEtPnR5cGUgPSBpOwotCQlzZW1hX2luaXQoJmRhdGEtPnNlbSwgMCk7CisJCWluaXRfTVVURVgoJmRhdGEtPm11dGV4KTsKIAkJZGlyID0gcHJvY19ta2RpcihzYWxpbmZvX2xvZ19uYW1lW2ldLCBzYWxpbmZvX2Rpcik7CiAJCWlmICghZGlyKQogCQkJY29udGludWU7CkBAIC01OTEsMTIgKzY2MCw4IEBACiAJCSpzZGlyKysgPSBlbnRyeTsKIAogCQkvKiB3ZSBtaXNzZWQgYW55IGV2ZW50cyBiZWZvcmUgbm93ICovCi0JCW9ubGluZSA9IDA7Ci0JCWZvcl9lYWNoX29ubGluZV9jcHUoaikgewotCQkJc2V0X2JpdChqLCAmZGF0YS0+Y3B1X2V2ZW50KTsKLQkJCSsrb25saW5lOwotCQl9Ci0JCXNlbWFfaW5pdCgmZGF0YS0+c2VtLCBvbmxpbmUpOworCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGopCisJCQljcHVfc2V0KGosIGRhdGEtPmNwdV9ldmVudCk7CiAKIAkJKnNkaXIrKyA9IGRpcjsKIAl9CkBAIC02MDgsNiArNjczLDEwIEBACiAJc2FsaW5mb190aW1lci5mdW5jdGlvbiA9ICZzYWxpbmZvX3RpbWVvdXQ7CiAJYWRkX3RpbWVyKCZzYWxpbmZvX3RpbWVyKTsKIAorI2lmZGVmCUNPTkZJR19IT1RQTFVHX0NQVQorCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmc2FsaW5mb19jcHVfbm90aWZpZXIpOworI2VuZGlmCisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IGMzMzMwNWQuLmMwNzY2NTcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMKQEAgLTYwLDYgKzYwLDcgQEAKICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKICNpZiBkZWZpbmVkKENPTkZJR19TTVApICYmIChJQTY0X0NQVV9TSVpFID4gUEFHRV9TSVpFKQogIyBlcnJvciAic3RydWN0IGNwdWluZm9faWE2NCB0b28gYmlnISIKQEAgLTY5NSw2ICs2OTYsNyBAQAogZ2V0X21heF9jYWNoZWxpbmVfc2l6ZSAodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGxpbmVfc2l6ZSwgbWF4ID0gMTsKKwl1bnNpZ25lZCBpbnQgY2FjaGVfc2l6ZSA9IDA7CiAJdTY0IGwsIGxldmVscywgdW5pcXVlX2NhY2hlczsKICAgICAgICAgcGFsX2NhY2hlX2NvbmZpZ19pbmZvX3QgY2NpOwogICAgICAgICBzNjQgc3RhdHVzOwpAQCAtNzI0LDYgKzcyNiw4IEBACiAJCWxpbmVfc2l6ZSA9IDEgPDwgY2NpLnBjY2lfbGluZV9zaXplOwogCQlpZiAobGluZV9zaXplID4gbWF4KQogCQkJbWF4ID0gbGluZV9zaXplOworCQlpZiAoY2FjaGVfc2l6ZSA8IGNjaS5wY2NpX2NhY2hlX3NpemUpCisJCQljYWNoZV9zaXplID0gY2NpLnBjY2lfY2FjaGVfc2l6ZTsKIAkJaWYgKCFjY2kucGNjaV91bmlmaWVkKSB7CiAJCQlzdGF0dXMgPSBpYTY0X3BhbF9jYWNoZV9jb25maWdfaW5mbyhsLAogCQkJCQkJICAgIC8qIGNhY2hlX3R5cGUgKGluc3RydWN0aW9uKT0gKi8gMSwKQEAgLTc0MCw2ICs3NDQsOSBAQAogCQkJaWE2NF9pX2NhY2hlX3N0cmlkZV9zaGlmdCA9IGNjaS5wY2NpX3N0cmlkZTsKIAl9CiAgIG91dDoKKyNpZmRlZiBDT05GSUdfU01QCisJbWF4X2NhY2hlX3NpemUgPSBtYXgobWF4X2NhY2hlX3NpemUsIGNhY2hlX3NpemUpOworI2VuZGlmCiAJaWYgKG1heCA+IGlhNjRfbWF4X2NhY2hlbGluZV9zaXplKQogCQlpYTY0X21heF9jYWNoZWxpbmVfc2l6ZSA9IG1heDsKIH0KQEAgLTc5NCw3ICs4MDEsNyBAQAogI2VuZGlmCiAKIAkvKiBDbGVhciB0aGUgc3RhY2sgbWVtb3J5IHJlc2VydmVkIGZvciBwdF9yZWdzOiAqLwotCW1lbXNldChpYTY0X3Rhc2tfcmVncyhjdXJyZW50KSwgMCwgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CisJbWVtc2V0KHRhc2tfcHRfcmVncyhjdXJyZW50KSwgMCwgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CiAKIAlpYTY0X3NldF9rcihJQTY0X0tSX0ZQVV9PV05FUiwgMCk7CiAKQEAgLTg3MCw2ICs4NzcsMTUgQEAKIAlwbV9pZGxlID0gZGVmYXVsdF9pZGxlOwogfQogCisvKgorICogT24gU01QIHN5c3RlbXMsIHdoZW4gdGhlIHNjaGVkdWxlciBkb2VzIG1pZ3JhdGlvbi1jb3N0IGF1dG9kZXRlY3Rpb24sCisgKiBpdCBuZWVkcyBhIHdheSB0byBmbHVzaCBhcyBtdWNoIG9mIHRoZSBDUFUncyBjYWNoZXMgYXMgcG9zc2libGUuCisgKi8KK3ZvaWQgc2NoZWRfY2FjaGVmbHVzaCh2b2lkKQoreworCWlhNjRfc2FsX2NhY2hlX2ZsdXNoKDMpOworfQorCiB2b2lkCiBjaGVja19idWdzICh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvaWE2NC9rZXJuZWwvc2lnbmFsLmMKaW5kZXggNThjZTA3ZS4uNDYzZjZiYiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NpZ25hbC5jCkBAIC02NTUsMTEgKzY1NSwxMSBAQAogCiAJCWlmICghdCkKIAkJCXJldHVybjsKLQkJdC0+dGhyZWFkX2luZm8tPnNpZ2RlbGF5ZWQuc2lnbm8gPSBzaWdubzsKLQkJdC0+dGhyZWFkX2luZm8tPnNpZ2RlbGF5ZWQuY29kZSA9IGNvZGU7Ci0JCXQtPnRocmVhZF9pbmZvLT5zaWdkZWxheWVkLmFkZHIgPSBhZGRyOwotCQl0LT50aHJlYWRfaW5mby0+c2lnZGVsYXllZC5zdGFydF90aW1lID0gc3RhcnRfdGltZTsKLQkJdC0+dGhyZWFkX2luZm8tPnNpZ2RlbGF5ZWQucGlkID0gcGlkOworCQl0YXNrX3RocmVhZF9pbmZvKHQpLT5zaWdkZWxheWVkLnNpZ25vID0gc2lnbm87CisJCXRhc2tfdGhyZWFkX2luZm8odCktPnNpZ2RlbGF5ZWQuY29kZSA9IGNvZGU7CisJCXRhc2tfdGhyZWFkX2luZm8odCktPnNpZ2RlbGF5ZWQuYWRkciA9IGFkZHI7CisJCXRhc2tfdGhyZWFkX2luZm8odCktPnNpZ2RlbGF5ZWQuc3RhcnRfdGltZSA9IHN0YXJ0X3RpbWU7CisJCXRhc2tfdGhyZWFkX2luZm8odCktPnNpZ2RlbGF5ZWQucGlkID0gcGlkOwogCQl3bWIoKTsKIAkJc2V0X3Rza190aHJlYWRfZmxhZyh0LCBUSUZfU0lHREVMQVlFRCk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zeXNfaWE2NC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9zeXNfaWE2NC5jCmluZGV4IGYyZGJjZDEuLmM3Yjk0M2YgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvc3lzX2lhNjQuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3N5c19pYTY0LmMKQEAgLTE1MSw3ICsxNTEsNyBAQAogYXNtbGlua2FnZSBsb25nCiBzeXNfcGlwZSAodm9pZCkKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGlhNjRfdGFza19yZWdzKGN1cnJlbnQpOworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOwogCWludCBmZFsyXTsKIAlpbnQgcmV0dmFsOwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3RyYXBzLmMgYi9hcmNoL2lhNjQva2VybmVsL3RyYXBzLmMKaW5kZXggZDNlMGVjYi4uNTUzOTE5MCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdHJhcHMuYwpAQCAtNTMwLDEyICs1MzAsMTUgQEAKIAkJaWYgKGZzeXNfbW9kZShjdXJyZW50LCAmcmVncykpIHsKIAkJCWV4dGVybiBjaGFyIF9fa2VybmVsX3N5c2NhbGxfdmlhX2JyZWFrW107CiAJCQkvKgotCQkJICogR290IGEgdHJhcCBpbiBmc3lzLW1vZGU6IFRha2VuIEJyYW5jaCBUcmFwIGFuZCBTaW5nbGUgU3RlcCB0cmFwCi0JCQkgKiBuZWVkIHNwZWNpYWwgaGFuZGxpbmc7IERlYnVnIHRyYXAgaXMgbm90IHN1cHBvc2VkIHRvIGhhcHBlbi4KKwkJCSAqIEdvdCBhIHRyYXAgaW4gZnN5cy1tb2RlOiBUYWtlbiBCcmFuY2ggVHJhcAorCQkJICogYW5kIFNpbmdsZSBTdGVwIHRyYXAgbmVlZCBzcGVjaWFsIGhhbmRsaW5nOworCQkJICogRGVidWcgdHJhcCBpcyBpZ25vcmVkICh3ZSBkaXNhYmxlIGl0IGhlcmUKKwkJCSAqIGFuZCByZS1lbmFibGUgaXQgaW4gdGhlIGxvd2VyLXByaXZpbGVnZSB0cmFwKS4KIAkJCSAqLwogCQkJaWYgKHVubGlrZWx5KHZlY3RvciA9PSAyOSkpIHsKLQkJCQlkaWUoIkdvdCBkZWJ1ZyB0cmFwIGluIGZzeXMtbW9kZS0tLW5vdCBzdXBwb3NlZCB0byBoYXBwZW4hIiwKLQkJCQkgICAgJnJlZ3MsIDApOworCQkJCXNldF90aHJlYWRfZmxhZyhUSUZfREJfRElTQUJMRUQpOworCQkJCWlhNjRfcHNyKCZyZWdzKS0+ZGIgPSAwOworCQkJCWlhNjRfcHNyKCZyZWdzKS0+bHAgPSAxOwogCQkJCXJldHVybjsKIAkJCX0KIAkJCS8qIHJlLWRvIHRoZSBzeXN0ZW0gY2FsbCB2aWEgYnJlYWsgMHgxMDAwMDA6ICovCkBAIC01ODksMTAgKzU5MiwxOSBAQAogCSAgICAgIGNhc2UgMzQ6CiAJCWlmIChpc3IgJiAweDIpIHsKIAkJCS8qIExvd2VyLVByaXZpbGVnZSBUcmFuc2ZlciBUcmFwICovCisKKwkJCS8qIElmIHdlIGRpc2FibGVkIGRlYnVnIHRyYXBzIGR1cmluZyBhbiBmc3lzY2FsbCwKKwkJCSAqIHJlLWVuYWJsZSB0aGVtIGhlcmUuCisJCQkgKi8KKwkJCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9EQl9ESVNBQkxFRCkpIHsKKwkJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfREJfRElTQUJMRUQpOworCQkJCWlhNjRfcHNyKCZyZWdzKS0+ZGIgPSAxOworCQkJfQorCiAJCQkvKgotCQkJICogSnVzdCBjbGVhciBQU1IubHAgYW5kIHRoZW4gcmV0dXJuIGltbWVkaWF0ZWx5OiBhbGwgdGhlCi0JCQkgKiBpbnRlcmVzdGluZyB3b3JrIChlLmcuLCBzaWduYWwgZGVsaXZlcnkgaXMgZG9uZSBpbiB0aGUga2VybmVsCi0JCQkgKiBleGl0IHBhdGgpLgorCQkJICogSnVzdCBjbGVhciBQU1IubHAgYW5kIHRoZW4gcmV0dXJuIGltbWVkaWF0ZWx5OgorCQkJICogYWxsIHRoZSBpbnRlcmVzdGluZyB3b3JrIChlLmcuLCBzaWduYWwgZGVsaXZlcnkpCisJCQkgKiBpcyBkb25lIGluIHRoZSBrZXJuZWwgZXhpdCBwYXRoLgogCQkJICovCiAJCQlpYTY0X3BzcigmcmVncyktPmxwID0gMDsKIAkJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvdW5jYWNoZWQuYyBiL2FyY2gvaWE2NC9rZXJuZWwvdW5jYWNoZWQuYwppbmRleCBiNjMxY2Y4Li5mY2QyYmFkIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3VuY2FjaGVkLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC91bmNhY2hlZC5jCkBAIC0yMTAsNiArMjEwLDcgQEAKIAogCWRwcmludGsoS0VSTl9FUlIgInVuY2FjaGVkX2J1aWxkX21lbW1hcCglbHggJWx4KVxuIiwgc3RhcnQsIGVuZCk7CiAKKwl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7CiAJbWVtc2V0KChjaGFyICopc3RhcnQsIDAsIGxlbmd0aCk7CiAKIAlub2RlID0gcGFkZHJfdG9fbmlkKHN0YXJ0IC0gX19JQTY0X1VOQ0FDSEVEX09GRlNFVCk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbW0vaW5pdC5jIGIvYXJjaC9pYTY0L21tL2luaXQuYwppbmRleCBlMzIxNWJhLi5iMzhiNmQyIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbW0vaW5pdC5jCisrKyBiL2FyY2gvaWE2NC9tbS9pbml0LmMKQEAgLTYzNSwzICs2MzUsMzkgQEAKIAlpYTMyX21lbV9pbml0KCk7CiAjZW5kaWYKIH0KKworI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVRwordm9pZCBvbmxpbmVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKwlzZXRfcGFnZV9jb3VudChwYWdlLCAxKTsKKwlfX2ZyZWVfcGFnZShwYWdlKTsKKwl0b3RhbHJhbV9wYWdlcysrOworCW51bV9waHlzcGFnZXMrKzsKK30KKworaW50IGFkZF9tZW1vcnkodTY0IHN0YXJ0LCB1NjQgc2l6ZSkKK3sKKwlwZ19kYXRhX3QgKnBnZGF0OworCXN0cnVjdCB6b25lICp6b25lOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuID0gc3RhcnQgPj4gUEFHRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gc2l6ZSA+PiBQQUdFX1NISUZUOworCWludCByZXQ7CisKKwlwZ2RhdCA9IE5PREVfREFUQSgwKTsKKworCXpvbmUgPSBwZ2RhdC0+bm9kZV96b25lcyArIFpPTkVfTk9STUFMOworCXJldCA9IF9fYWRkX3BhZ2VzKHpvbmUsIHN0YXJ0X3BmbiwgbnJfcGFnZXMpOworCisJaWYgKHJldCkKKwkJcHJpbnRrKCIlczogUHJvYmxlbSBlbmNvdW50ZXJlZCBpbiBfX2FkZF9wYWdlcygpIGFzIHJldD0lZFxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgcmVtb3ZlX21lbW9yeSh1NjQgc3RhcnQsIHU2NCBzaXplKQoreworCXJldHVybiAtRUlOVkFMOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbW0vdGxiLmMgYi9hcmNoL2lhNjQvbW0vdGxiLmMKaW5kZXggNDExMDVkNC4uNmE0ZWVjOSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL3RsYi5jCisrKyBiL2FyY2gvaWE2NC9tbS90bGIuYwpAQCAtOTAsNyArOTAsNyBAQAogewogCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0socHRjZ19sb2NrKTsKIAotCWlmIChtbSAhPSBjdXJyZW50LT5hY3RpdmVfbW0pIHsKKwlpZiAobW0gIT0gY3VycmVudC0+YWN0aXZlX21tIHx8ICFjdXJyZW50LT5tbSkgewogCQlmbHVzaF90bGJfYWxsKCk7CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvb3Byb2ZpbGUvYmFja3RyYWNlLmMgYi9hcmNoL2lhNjQvb3Byb2ZpbGUvYmFja3RyYWNlLmMKaW5kZXggYjdkYWJiZi4uYWRiMDE1NiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L29wcm9maWxlL2JhY2t0cmFjZS5jCisrKyBiL2FyY2gvaWE2NC9vcHJvZmlsZS9iYWNrdHJhY2UuYwpAQCAtMzIsNyArMzIsNyBAQAogCXU2NCAqcHJldl9wZnNfbG9jOwkvKiBzdGF0ZSBmb3IgV0FSIGZvciBvbGQgc3BpbmxvY2sgb29sIGNvZGUgKi8KIH0gaWE2NF9iYWNrdHJhY2VfdDsKIAotI2lmIF9fR05VQ19fIDwgMyB8fCAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA8IDMpCisjaWYgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPCAzKQogLyoKICAqIFJldHVybnMgbm9uLXplcm8gaWYgdGhlIFBDIGlzIGluIHRoZSBzcGlubG9jayBjb250ZW50aW9uIG91dC1vZi1saW5lIGNvZGUKICAqIHdpdGggbm9uLXN0YW5kYXJkIGNhbGxpbmcgc2VxdWVuY2UgKG9uIG9sZGVyIGNvbXBpbGVycykuCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvcGNpL3BjaS5jIGIvYXJjaC9pYTY0L3BjaS9wY2kuYwppbmRleCAzMGRiYzk4Li4wYjMwY2EwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvcGNpL3BjaS5jCisrKyBiL2FyY2gvaWE2NC9wY2kvcGNpLmMKQEAgLTE5MywxMiArMTkzLDEyIEBACiAJCWdvdG8gZnJlZV9yZXNvdXJjZTsKIAl9CiAKLQltaW4gPSBhZGRyLT5taW5fYWRkcmVzc19yYW5nZTsKKwltaW4gPSBhZGRyLT5taW5pbXVtOwogCW1heCA9IG1pbiArIGFkZHItPmFkZHJlc3NfbGVuZ3RoIC0gMTsKLQlpZiAoYWRkci0+YXR0cmlidXRlLmlvLnRyYW5zbGF0aW9uX2F0dHJpYnV0ZSA9PSBBQ1BJX1NQQVJTRV9UUkFOU0xBVElPTikKKwlpZiAoYWRkci0+aW5mby5pby50cmFuc2xhdGlvbl90eXBlID09IEFDUElfU1BBUlNFX1RSQU5TTEFUSU9OKQogCQlzcGFyc2UgPSAxOwogCi0Jc3BhY2VfbnIgPSBuZXdfc3BhY2UoYWRkci0+YWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQsIHNwYXJzZSk7CisJc3BhY2VfbnIgPSBuZXdfc3BhY2UoYWRkci0+dHJhbnNsYXRpb25fb2Zmc2V0LCBzcGFyc2UpOwogCWlmIChzcGFjZV9uciA9PSB+MCkKIAkJZ290byBmcmVlX25hbWU7CiAKQEAgLTI4NSw3ICsyODUsNyBAQAogCWlmIChhZGRyLnJlc291cmNlX3R5cGUgPT0gQUNQSV9NRU1PUllfUkFOR0UpIHsKIAkJZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKIAkJcm9vdCA9ICZpb21lbV9yZXNvdXJjZTsKLQkJb2Zmc2V0ID0gYWRkci5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldDsKKwkJb2Zmc2V0ID0gYWRkci50cmFuc2xhdGlvbl9vZmZzZXQ7CiAJfSBlbHNlIGlmIChhZGRyLnJlc291cmNlX3R5cGUgPT0gQUNQSV9JT19SQU5HRSkgewogCQlmbGFncyA9IElPUkVTT1VSQ0VfSU87CiAJCXJvb3QgPSAmaW9wb3J0X3Jlc291cmNlOwpAQCAtMjk4LDcgKzI5OCw3IEBACiAJd2luZG93ID0gJmluZm8tPmNvbnRyb2xsZXItPndpbmRvd1tpbmZvLT5jb250cm9sbGVyLT53aW5kb3dzKytdOwogCXdpbmRvdy0+cmVzb3VyY2UubmFtZSA9IGluZm8tPm5hbWU7CiAJd2luZG93LT5yZXNvdXJjZS5mbGFncyA9IGZsYWdzOwotCXdpbmRvdy0+cmVzb3VyY2Uuc3RhcnQgPSBhZGRyLm1pbl9hZGRyZXNzX3JhbmdlICsgb2Zmc2V0OworCXdpbmRvdy0+cmVzb3VyY2Uuc3RhcnQgPSBhZGRyLm1pbmltdW0gKyBvZmZzZXQ7CiAJd2luZG93LT5yZXNvdXJjZS5lbmQgPSB3aW5kb3ctPnJlc291cmNlLnN0YXJ0ICsgYWRkci5hZGRyZXNzX2xlbmd0aCAtIDE7CiAJd2luZG93LT5yZXNvdXJjZS5jaGlsZCA9IE5VTEw7CiAJd2luZG93LT5vZmZzZXQgPSBvZmZzZXQ7CkBAIC00NTQsMTQgKzQ1NCwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpYmlvc19maXh1cF9kZXZpY2VfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgdm9pZCBfX2RldmluaXQKK3BjaWJpb3NfZml4dXBfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBzdGFydCwgaW50IGxpbWl0KQogewogCXN0cnVjdCBwY2lfYnVzX3JlZ2lvbiByZWdpb247CiAJaW50IGk7Ci0JaW50IGxpbWl0ID0gKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX05PUk1BTCkgPyBcCi0JCVBDSV9CUklER0VfUkVTT1VSQ0VTIDogUENJX05VTV9SRVNPVVJDRVM7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbGltaXQ7IGkrKykgeworCWZvciAoaSA9IHN0YXJ0OyBpIDwgbGltaXQ7IGkrKykgewogCQlpZiAoIWRldi0+cmVzb3VyY2VbaV0uZmxhZ3MpCiAJCQljb250aW51ZTsKIAkJcmVnaW9uLnN0YXJ0ID0gZGV2LT5yZXNvdXJjZVtpXS5zdGFydDsKQEAgLTQ3Miw2ICs0NzEsMTYgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2liaW9zX2ZpeHVwX2RldmljZV9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlwY2liaW9zX2ZpeHVwX3Jlc291cmNlcyhkZXYsIDAsIFBDSV9CUklER0VfUkVTT1VSQ0VTKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHBjaWJpb3NfZml4dXBfYnJpZGdlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXBjaWJpb3NfZml4dXBfcmVzb3VyY2VzKGRldiwgUENJX0JSSURHRV9SRVNPVVJDRVMsIFBDSV9OVU1fUkVTT1VSQ0VTKTsKK30KKwogLyoKICAqICBDYWxsZWQgYWZ0ZXIgZWFjaCBidXMgaXMgcHJvYmVkLCBidXQgYmVmb3JlIGl0cyBjaGlsZHJlbiBhcmUgZXhhbWluZWQuCiAgKi8KQEAgLTQ4Miw3ICs0OTEsNyBAQAogCiAJaWYgKGItPnNlbGYpIHsKIAkJcGNpX3JlYWRfYnJpZGdlX2Jhc2VzKGIpOwotCQlwY2liaW9zX2ZpeHVwX2RldmljZV9yZXNvdXJjZXMoYi0+c2VsZik7CisJCXBjaWJpb3NfZml4dXBfYnJpZGdlX3Jlc291cmNlcyhiLT5zZWxmKTsKIAl9CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZiLT5kZXZpY2VzLCBidXNfbGlzdCkKIAkJcGNpYmlvc19maXh1cF9kZXZpY2VfcmVzb3VyY2VzKGRldik7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vaW5jbHVkZS94dGFsay9odWJkZXYuaCBiL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3h0YWxrL2h1YmRldi5oCmluZGV4IDcxYzJiMjcuLjgxODI1ODMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3h0YWxrL2h1YmRldi5oCisrKyBiL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3h0YWxrL2h1YmRldi5oCkBAIC0yNiwyOSArMjYsNDYgQEAKICNkZWZpbmUgSUlPX05VTV9JVFRFUyAgIDcKICNkZWZpbmUgSFVCX05VTV9CSUdfV0lORE9XICAgICAgKElJT19OVU1fSVRURVMgLSAxKQogCi1zdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2xpc3QgeworLyogVGhpcyBzdHJ1Y3QgaXMgc2hhcmVkIGJldHdlZW4gdGhlIFBST00gYW5kIHRoZSBrZXJuZWwuCisgKiBDaGFuZ2VzIHRvIHRoaXMgc3RydWN0IHdpbGwgcmVxdWlyZSBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdG8gdGhlIGtlcm5lbC4KKyAqLworc3RydWN0IHNuX2ZsdXNoX2RldmljZV9jb21tb24gewogCWludCBzZmRsX2J1czsKIAlpbnQgc2ZkbF9zbG90OwogCWludCBzZmRsX3BpbjsKLQlzdHJ1Y3QgYmFyX2xpc3QgeworCXN0cnVjdCBjb21tb25fYmFyX2xpc3QgewogCQl1bnNpZ25lZCBsb25nIHN0YXJ0OwogCQl1bnNpZ25lZCBsb25nIGVuZDsKIAl9IHNmZGxfYmFyX2xpc3RbNl07CiAJdW5zaWduZWQgbG9uZyBzZmRsX2ZvcmNlX2ludF9hZGRyOwogCXVuc2lnbmVkIGxvbmcgc2ZkbF9mbHVzaF92YWx1ZTsKIAl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpzZmRsX2ZsdXNoX2FkZHI7Ci0JdWludDMyX3Qgc2ZkbF9wZXJzaXN0ZW50X2J1c251bTsKLQl1aW50MzJfdCBzZmRsX3BlcnNpc3RlbnRfc2VnbWVudDsKKwl1MzIgc2ZkbF9wZXJzaXN0ZW50X2J1c251bTsKKwl1MzIgc2ZkbF9wZXJzaXN0ZW50X3NlZ21lbnQ7CiAJc3RydWN0IHBjaWJ1c19pbmZvICpzZmRsX3BjaWJ1c19pbmZvOworfTsKKworLyogVGhpcyBzdHJ1Y3QgaXMga2VybmVsIG9ubHkgYW5kIGlzIG5vdCB1c2VkIGJ5IHRoZSBQUk9NICovCitzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2tlcm5lbCB7CiAJc3BpbmxvY2tfdCBzZmRsX2ZsdXNoX2xvY2s7CisJc3RydWN0IHNuX2ZsdXNoX2RldmljZV9jb21tb24gKmNvbW1vbjsKK307CisKKy8qIDAxLzE2LzA2IFRoaXMgc3RydWN0IGlzIHRoZSBvbGQgUFJPTS9rZXJuZWwgc3RydWN0IGFuZCBuZWVkcyB0byBiZSBpbmNsdWRlZAorICogZm9yIG9sZGVyIG9mZmljaWFsIFBST01zIHRvIGZ1bmN0aW9uIG9uIHRoZSBuZXcga2VybmVsIGJhc2UuICBUaGlzIHN0cnVjdAorICogd2lsbCBiZSByZW1vdmVkIHdoZW4gdGhlIG5leHQgb2ZmaWNpYWwgUFJPTSByZWxlYXNlIG9jY3Vycy4gKi8KKworc3RydWN0IHNuX2ZsdXNoX2RldmljZV93YXIgeworCXN0cnVjdCBzbl9mbHVzaF9kZXZpY2VfY29tbW9uIGNvbW1vbjsKKwl1MzIgZmlsbGVyOyAvKiBvbGRlciBQUk9NcyBleHBlY3QgdGhlIGRlZmF1bHQgc2l6ZSBvZiBhIHNwaW5sb2NrX3QgKi8KIH07CiAKIC8qCi0gKiAqKndpZGdldF9wIC0gVXNlZCBhcyBhbiBhcnJheVt3aWRfbnVtXVtkZXZpY2VdIG9mIHNuX2ZsdXNoX2RldmljZV9saXN0LgorICogKip3aWRnZXRfcCAtIFVzZWQgYXMgYW4gYXJyYXlbd2lkX251bV1bZGV2aWNlXSBvZiBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsLgogICovCiBzdHJ1Y3Qgc25fZmx1c2hfbmFzaWRfZW50cnkgIHsKLQlzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2xpc3QgKip3aWRnZXRfcDsgLyogVXNlZCBhcyBhIGFycmF5IG9mIHdpZF9udW0gKi8KLQl1aW50NjRfdCBpaW9faXR0ZVs4XTsKKwlzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2tlcm5lbCAqKndpZGdldF9wOyAvLyBVc2VkIGFzIGFuIGFycmF5IG9mIHdpZF9udW0KKwl1NjQgaWlvX2l0dGVbOF07CiB9OwogCiBzdHJ1Y3QgaHViZGV2X2luZm8gewpAQCAtNjIsOCArNzksOCBAQAogCiAJdm9pZAkJCQkqaGRpX25vZGVwZGE7CiAJdm9pZAkJCQkqaGRpX25vZGVfdmVydGV4OwotCXVpbnQzMl90CQkJbWF4X3NlZ21lbnRfbnVtYmVyOwotCXVpbnQzMl90CQkJbWF4X3BjaWJ1c19udW1iZXI7CisJdTMyCQkJCW1heF9zZWdtZW50X251bWJlcjsKKwl1MzIJCQkJbWF4X3BjaWJ1c19udW1iZXI7CiB9OwogCiBleHRlcm4gdm9pZCBodWJkZXZfaW5pdF9ub2RlKG5vZGVwZGFfdCAqLCBjbm9kZWlkX3QpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2luY2x1ZGUveHRhbGsveGJvdy5oIGIvYXJjaC9pYTY0L3NuL2luY2x1ZGUveHRhbGsveGJvdy5oCmluZGV4IGVjNTZiMzQuLjkwZjM3YTQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3h0YWxrL3hib3cuaAorKysgYi9hcmNoL2lhNjQvc24vaW5jbHVkZS94dGFsay94Ym93LmgKQEAgLTMsNyArMyw4IEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTk3LDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5NywyMDAwLTIwMDYgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzCisgKiBSZXNlcnZlZC4KICAqLwogI2lmbmRlZiBfQVNNX0lBNjRfU05fWFRBTEtfWEJPV19ICiAjZGVmaW5lIF9BU01fSUE2NF9TTl9YVEFMS19YQk9XX0gKQEAgLTIxLDk0ICsyMiw5NCBAQAogCiAvKiBSZWdpc3RlciBzZXQgZm9yIGVhY2ggeGJvdyBsaW5rICovCiB0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCB4Yl9saW5rcmVnc19zIHsKLS8qIAorLyoKICAqIHdlIGFjY2VzcyB0aGVzZSB0aHJvdWdoIHN5bmVyZ3kgdW5zd2l6emxlZCBzcGFjZSwgc28gdGhlIGFkZHJlc3MKICAqIGdldHMgdHdpZGRsZWQgKGkuZS4gcmVmZXJlbmNlcyB0byAweDQgYWN0dWFsbHkgZ28gdG8gMHgwIGFuZCB2di4pCiAgKiBUaGF0J3Mgd2h5IHdlIHB1dCB0aGUgcmVnaXN0ZXIgZmlyc3QgYW5kIGZpbGxlciBzZWNvbmQuCiAgKi8KLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgIGxpbmtfaWJmOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgZmlsbGVyMDsJLyogZmlsbGVyIGZvciBwcm9wZXIgYWxpZ25tZW50ICovCi0gICAgdWludDMyX3QgICAgICAgICAgICAgICBsaW5rX2NvbnRyb2w7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICBmaWxsZXIxOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgbGlua19zdGF0dXM7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICBmaWxsZXIyOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgbGlua19hcmJfdXBwZXI7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICBmaWxsZXIzOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgbGlua19hcmJfbG93ZXI7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICBmaWxsZXI0OwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgbGlua19zdGF0dXNfY2xyOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgZmlsbGVyNTsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgIGxpbmtfcmVzZXQ7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICBmaWxsZXI2OwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgbGlua19hdXhfc3RhdHVzOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgZmlsbGVyNzsKKwl1MzIgbGlua19pYmY7CisJdTMyIGZpbGxlcjA7CS8qIGZpbGxlciBmb3IgcHJvcGVyIGFsaWdubWVudCAqLworCXUzMiBsaW5rX2NvbnRyb2w7CisJdTMyIGZpbGxlcjE7CisJdTMyIGxpbmtfc3RhdHVzOworCXUzMiBmaWxsZXIyOworCXUzMiBsaW5rX2FyYl91cHBlcjsKKwl1MzIgZmlsbGVyMzsKKwl1MzIgbGlua19hcmJfbG93ZXI7CisJdTMyIGZpbGxlcjQ7CisJdTMyIGxpbmtfc3RhdHVzX2NscjsKKwl1MzIgZmlsbGVyNTsKKwl1MzIgbGlua19yZXNldDsKKwl1MzIgZmlsbGVyNjsKKwl1MzIgbGlua19hdXhfc3RhdHVzOworCXUzMiBmaWxsZXI3OwogfSB4Yl9saW5rcmVnc190OwogCiB0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCB4Ym93X3MgewotICAgIC8qIHN0YW5kYXJkIHdpZGdldCBjb25maWd1cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMC0weDAwMDA1NyAqLwotICAgIHN0cnVjdCB3aWRnZXRfY2ZnICAgICAgICAgICAgeGJfd2lkZ2V0OyAgLyogMHgwMDAwMDAgKi8KKwkvKiBzdGFuZGFyZCB3aWRnZXQgY29uZmlndXJhdGlvbiAweDAwMDAwMC0weDAwMDA1NyAqLworCXN0cnVjdCB3aWRnZXRfY2ZnIHhiX3dpZGdldDsgIC8qIDB4MDAwMDAwICovCiAKLSAgICAvKiBoZWxwZXIgZmllbGRuYW1lcyBmb3IgYWNjZXNzaW5nIGJyaWRnZSB3aWRnZXQgKi8KKwkvKiBoZWxwZXIgZmllbGRuYW1lcyBmb3IgYWNjZXNzaW5nIGJyaWRnZSB3aWRnZXQgKi8KIAotI2RlZmluZSB4Yl93aWRfaWQgICAgICAgICAgICAgICAgICAgICAgIHhiX3dpZGdldC53X2lkCi0jZGVmaW5lIHhiX3dpZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgeGJfd2lkZ2V0Lndfc3RhdHVzCi0jZGVmaW5lIHhiX3dpZF9lcnJfdXBwZXIgICAgICAgICAgICAgICAgeGJfd2lkZ2V0LndfZXJyX3VwcGVyX2FkZHIKLSNkZWZpbmUgeGJfd2lkX2Vycl9sb3dlciAgICAgICAgICAgICAgICB4Yl93aWRnZXQud19lcnJfbG93ZXJfYWRkcgotI2RlZmluZSB4Yl93aWRfY29udHJvbCAgICAgICAgICAgICAgICAgIHhiX3dpZGdldC53X2NvbnRyb2wKLSNkZWZpbmUgeGJfd2lkX3JlcV90aW1lb3V0ICAgICAgICAgICAgICB4Yl93aWRnZXQud19yZXFfdGltZW91dAotI2RlZmluZSB4Yl93aWRfaW50X3VwcGVyICAgICAgICAgICAgICAgIHhiX3dpZGdldC53X2ludGRlc3RfdXBwZXJfYWRkcgotI2RlZmluZSB4Yl93aWRfaW50X2xvd2VyICAgICAgICAgICAgICAgIHhiX3dpZGdldC53X2ludGRlc3RfbG93ZXJfYWRkcgotI2RlZmluZSB4Yl93aWRfZXJyX2NtZHdvcmQgICAgICAgICAgICAgIHhiX3dpZGdldC53X2Vycl9jbWRfd29yZAotI2RlZmluZSB4Yl93aWRfbGxwICAgICAgICAgICAgICAgICAgICAgIHhiX3dpZGdldC53X2xscF9jZmcKLSNkZWZpbmUgeGJfd2lkX3N0YXRfY2xyICAgICAgICAgICAgICAgICB4Yl93aWRnZXQud190Zmx1c2gKKyNkZWZpbmUgeGJfd2lkX2lkIAkJeGJfd2lkZ2V0LndfaWQKKyNkZWZpbmUgeGJfd2lkX3N0YXQgCQl4Yl93aWRnZXQud19zdGF0dXMKKyNkZWZpbmUgeGJfd2lkX2Vycl91cHBlciAJeGJfd2lkZ2V0LndfZXJyX3VwcGVyX2FkZHIKKyNkZWZpbmUgeGJfd2lkX2Vycl9sb3dlciAJeGJfd2lkZ2V0LndfZXJyX2xvd2VyX2FkZHIKKyNkZWZpbmUgeGJfd2lkX2NvbnRyb2wJCXhiX3dpZGdldC53X2NvbnRyb2wKKyNkZWZpbmUgeGJfd2lkX3JlcV90aW1lb3V0IAl4Yl93aWRnZXQud19yZXFfdGltZW91dAorI2RlZmluZSB4Yl93aWRfaW50X3VwcGVyIAl4Yl93aWRnZXQud19pbnRkZXN0X3VwcGVyX2FkZHIKKyNkZWZpbmUgeGJfd2lkX2ludF9sb3dlciAJeGJfd2lkZ2V0LndfaW50ZGVzdF9sb3dlcl9hZGRyCisjZGVmaW5lIHhiX3dpZF9lcnJfY21kd29yZCAJeGJfd2lkZ2V0LndfZXJyX2NtZF93b3JkCisjZGVmaW5lIHhiX3dpZF9sbHAgCQl4Yl93aWRnZXQud19sbHBfY2ZnCisjZGVmaW5lIHhiX3dpZF9zdGF0X2NsciAJeGJfd2lkZ2V0LndfdGZsdXNoCiAKLS8qIAorLyoKICAqIHdlIGFjY2VzcyB0aGVzZSB0aHJvdWdoIHN5bmVyZ3kgdW5zd2l6emxlZCBzcGFjZSwgc28gdGhlIGFkZHJlc3MKICAqIGdldHMgdHdpZGRsZWQgKGkuZS4gcmVmZXJlbmNlcyB0byAweDQgYWN0dWFsbHkgZ28gdG8gMHgwIGFuZCB2di4pCiAgKiBUaGF0J3Mgd2h5IHdlIHB1dCB0aGUgcmVnaXN0ZXIgZmlyc3QgYW5kIGZpbGxlciBzZWNvbmQuCiAgKi8KLSAgICAvKiB4Ym93LXNwZWNpZmljIHdpZGdldCBjb25maWd1cmF0aW9uICAgICAgICAgICAgICAgICAgMHgwMDAwNTgtMHgwMDAwRkYgKi8KLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgIHhiX3dpZF9hcmJfcmVsb2FkOyAgLyogMHgwMDAwNUMgKi8KLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgIF9wYWRfMDAwMDU4OwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgeGJfcGVyZl9jdHJfYTsgICAgICAvKiAweDAwMDA2NCAqLwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgX3BhZF8wMDAwNjA7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICB4Yl9wZXJmX2N0cl9iOyAgICAgIC8qIDB4MDAwMDZjICovCi0gICAgdWludDMyX3QgICAgICAgICAgICAgICBfcGFkXzAwMDA2ODsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgIHhiX25pYzsgICAgIC8qIDB4MDAwMDc0ICovCi0gICAgdWludDMyX3QgICAgICAgICAgICAgICBfcGFkXzAwMDA3MDsKKwkvKiB4Ym93LXNwZWNpZmljIHdpZGdldCBjb25maWd1cmF0aW9uICAgIDB4MDAwMDU4LTB4MDAwMEZGICovCisJdTMyIHhiX3dpZF9hcmJfcmVsb2FkOyAvKiAweDAwMDA1QyAqLworCXUzMiBfcGFkXzAwMDA1ODsKKwl1MzIgeGJfcGVyZl9jdHJfYTsJLyogMHgwMDAwNjQgKi8KKwl1MzIgX3BhZF8wMDAwNjA7CisJdTMyIHhiX3BlcmZfY3RyX2I7CS8qIDB4MDAwMDZjICovCisJdTMyIF9wYWRfMDAwMDY4OworCXUzMiB4Yl9uaWM7CQkvKiAweDAwMDA3NCAqLworCXUzMiBfcGFkXzAwMDA3MDsKIAotICAgIC8qIFhicmlkZ2Ugb25seSAqLwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgeGJfdzBfcnN0X2ZuYzsgICAgICAvKiAweDAwMDA3QyAqLwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgX3BhZF8wMDAwNzg7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICB4Yl9sOF9yc3RfZm5jOyAgICAgIC8qIDB4MDAwMDg0ICovCi0gICAgdWludDMyX3QgICAgICAgICAgICAgICBfcGFkXzAwMDA4MDsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgIHhiX2w5X3JzdF9mbmM7ICAgICAgLyogMHgwMDAwOGMgKi8KLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgIF9wYWRfMDAwMDg4OwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgeGJfbGFfcnN0X2ZuYzsgICAgICAvKiAweDAwMDA5NCAqLwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgX3BhZF8wMDAwOTA7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICB4Yl9sYl9yc3RfZm5jOyAgICAgIC8qIDB4MDAwMDljICovCi0gICAgdWludDMyX3QgICAgICAgICAgICAgICBfcGFkXzAwMDA5ODsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgIHhiX2xjX3JzdF9mbmM7ICAgICAgLyogMHgwMDAwYTQgKi8KLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgIF9wYWRfMDAwMGEwOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgeGJfbGRfcnN0X2ZuYzsgICAgICAvKiAweDAwMDBhYyAqLwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgX3BhZF8wMDAwYTg7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICB4Yl9sZV9yc3RfZm5jOyAgICAgIC8qIDB4MDAwMGI0ICovCi0gICAgdWludDMyX3QgICAgICAgICAgICAgICBfcGFkXzAwMDBiMDsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgIHhiX2xmX3JzdF9mbmM7ICAgICAgLyogMHgwMDAwYmMgKi8KLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgIF9wYWRfMDAwMGI4OwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgeGJfbG9jazsgICAgICAgICAgICAvKiAweDAwMDBjNCAqLwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgX3BhZF8wMDAwYzA7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICB4Yl9sb2NrX2NscjsgICAgICAgIC8qIDB4MDAwMGNjICovCi0gICAgdWludDMyX3QgICAgICAgICAgICAgICBfcGFkXzAwMDBjODsKLSAgICAvKiBlbmQgb2YgWGJyaWRnZSBvbmx5ICovCi0gICAgdWludDMyX3QgICAgICAgICAgICAgICBfcGFkXzAwMDBkMFsxMl07CisJLyogWGJyaWRnZSBvbmx5ICovCisJdTMyIHhiX3cwX3JzdF9mbmM7CS8qIDB4MDAwMDdDICovCisJdTMyIF9wYWRfMDAwMDc4OworCXUzMiB4Yl9sOF9yc3RfZm5jOwkvKiAweDAwMDA4NCAqLworCXUzMiBfcGFkXzAwMDA4MDsKKwl1MzIgeGJfbDlfcnN0X2ZuYzsJLyogMHgwMDAwOGMgKi8KKwl1MzIgX3BhZF8wMDAwODg7CisJdTMyIHhiX2xhX3JzdF9mbmM7CS8qIDB4MDAwMDk0ICovCisJdTMyIF9wYWRfMDAwMDkwOworCXUzMiB4Yl9sYl9yc3RfZm5jOwkvKiAweDAwMDA5YyAqLworCXUzMiBfcGFkXzAwMDA5ODsKKwl1MzIgeGJfbGNfcnN0X2ZuYzsJLyogMHgwMDAwYTQgKi8KKwl1MzIgX3BhZF8wMDAwYTA7CisJdTMyIHhiX2xkX3JzdF9mbmM7CS8qIDB4MDAwMGFjICovCisJdTMyIF9wYWRfMDAwMGE4OworCXUzMiB4Yl9sZV9yc3RfZm5jOwkvKiAweDAwMDBiNCAqLworCXUzMiBfcGFkXzAwMDBiMDsKKwl1MzIgeGJfbGZfcnN0X2ZuYzsJLyogMHgwMDAwYmMgKi8KKwl1MzIgX3BhZF8wMDAwYjg7CisJdTMyIHhiX2xvY2s7CQkvKiAweDAwMDBjNCAqLworCXUzMiBfcGFkXzAwMDBjMDsKKwl1MzIgeGJfbG9ja19jbHI7CS8qIDB4MDAwMGNjICovCisJdTMyIF9wYWRfMDAwMGM4OworCS8qIGVuZCBvZiBYYnJpZGdlIG9ubHkgKi8KKwl1MzIgX3BhZF8wMDAwZDBbMTJdOwogCi0gICAgLyogTGluayBTcGVjaWZpYyBSZWdpc3RlcnMsIHBvcnQgOC4uMTUgICAgICAgICAgICAgICAgIDB4MDAwMTAwLTB4MDAwMzAwICovCi0gICAgeGJfbGlua3JlZ3NfdCAgICAgICAgICAgeGJfbGlua19yYXdbTUFYX1hCT1dfUE9SVFNdOwotI2RlZmluZSB4Yl9saW5rKHApICAgICAgeGJfbGlua19yYXdbKHApICYgKE1BWF9YQk9XX1BPUlRTIC0gMSldCi0KKwkvKiBMaW5rIFNwZWNpZmljIFJlZ2lzdGVycywgcG9ydCA4Li4xNSAgIDB4MDAwMTAwLTB4MDAwMzAwICovCisJeGJfbGlua3JlZ3NfdCB4Yl9saW5rX3Jhd1tNQVhfWEJPV19QT1JUU107CiB9IHhib3dfdDsKIAorI2RlZmluZSB4Yl9saW5rKHApIHhiX2xpbmtfcmF3WyhwKSAmIChNQVhfWEJPV19QT1JUUyAtIDEpXQorCiAjZGVmaW5lIFhCX0ZMQUdTX0VYSVNUUwkJMHgxCS8qIGRldmljZSBleGlzdHMgKi8KICNkZWZpbmUgWEJfRkxBR1NfTUFTVEVSCQkweDIKICNkZWZpbmUgWEJfRkxBR1NfU0xBVkUJCTB4MApAQCAtMTYwLDcgKzE2MSw3IEBACiAvKiBFbmQgb2YgWGJyaWRnZSBvbmx5ICovCiAKIC8qIHVzZWQgb25seSBpbiBpZGUsIGJ1dCBkZWZpbmVkIGhlcmUgd2l0aGluIHRoZSByZXNlcnZlZCBwb3J0aW9uICovCi0vKiAgICAgICAgICAgICAgb2YgdGhlIHdpZGdldDAgYWRkcmVzcyBzcGFjZSAoYmVmb3JlIDB4ZjQpICovCisvKiBvZiB0aGUgd2lkZ2V0MCBhZGRyZXNzIHNwYWNlIChiZWZvcmUgMHhmNCkgKi8KICNkZWZpbmUJWEJPV19XSURfVU5ERUYJCTB4ZTQKIAogLyogeGJvdyBsaW5rIHJlZ2lzdGVyIHNldCBiYXNlLCBsZWdhbCB2YWx1ZSBmb3IgeCBpcyAweDguLjB4ZiAqLwpAQCAtMTc5LDI5ICsxODAsMzcgQEAKIAogLyogbGlua19jb250cm9sKHgpICovCiAjZGVmaW5lCVhCX0NUUkxfTElOS0FMSVZFX0lFCQkweDgwMDAwMDAwCS8qIGxpbmsgY29tZXMgYWxpdmUgKi8KLSAgICAgLyogcmVzZXJ2ZWQ6CQkJMHg0MDAwMDAwMCAqLworLyogcmVzZXJ2ZWQ6CQkJMHg0MDAwMDAwMCAqLwogI2RlZmluZQlYQl9DVFJMX1BFUkZfQ1RSX01PREVfTVNLCTB4MzAwMDAwMDAJLyogcGVyZiBjb3VudGVyIG1vZGUgKi8KLSNkZWZpbmUJWEJfQ1RSTF9JQlVGX0xFVkVMX01TSwkJMHgwZTAwMDAwMAkvKiBpbnB1dCBwYWNrZXQgYnVmZmVyIGxldmVsICovCi0jZGVmaW5lCVhCX0NUUkxfOEJJVF9NT0RFCQkweDAxMDAwMDAwCS8qIGZvcmNlIGxpbmsgaW50byA4IGJpdCBtb2RlICovCi0jZGVmaW5lIFhCX0NUUkxfQkFEX0xMUF9QS1QJCTB4MDA4MDAwMDAJLyogZm9yY2UgYmFkIExMUCBwYWNrZXQgKi8KLSNkZWZpbmUgWEJfQ1RSTF9XSURHRVRfQ1JfTVNLCQkweDAwN2MwMDAwCS8qIExMUCB3aWRnZXQgY3JlZGl0IG1hc2sgKi8KLSNkZWZpbmUgWEJfQ1RSTF9XSURHRVRfQ1JfU0hGVAkxOAkJCS8qIExMUCB3aWRnZXQgY3JlZGl0IHNoaWZ0ICovCi0jZGVmaW5lIFhCX0NUUkxfSUxMRUdBTF9EU1RfSUUJCTB4MDAwMjAwMDAJLyogaWxsZWdhbCBkZXN0aW5hdGlvbiAqLwotI2RlZmluZSBYQl9DVFJMX09BTExPQ19JQlVGX0lFCQkweDAwMDEwMDAwCS8qIG92ZXJhbGxvY2F0ZWQgaW5wdXQgYnVmZmVyICovCi0gICAgIC8qIHJlc2VydmVkOgkJCTB4MDAwMGZlMDAgKi8KKyNkZWZpbmUJWEJfQ1RSTF9JQlVGX0xFVkVMX01TSwkJMHgwZTAwMDAwMAkvKiBpbnB1dCBwYWNrZXQgYnVmZmVyCisJCQkJCQkJICAgbGV2ZWwgKi8KKyNkZWZpbmUJWEJfQ1RSTF84QklUX01PREUJCTB4MDEwMDAwMDAJLyogZm9yY2UgbGluayBpbnRvIDgKKwkJCQkJCQkgICBiaXQgbW9kZSAqLworI2RlZmluZSBYQl9DVFJMX0JBRF9MTFBfUEtUCQkweDAwODAwMDAwCS8qIGZvcmNlIGJhZCBMTFAKKwkJCQkJCQkgICBwYWNrZXQgKi8KKyNkZWZpbmUgWEJfQ1RSTF9XSURHRVRfQ1JfTVNLCQkweDAwN2MwMDAwCS8qIExMUCB3aWRnZXQgY3JlZGl0CisJCQkJCQkJICAgbWFzayAqLworI2RlZmluZSBYQl9DVFJMX1dJREdFVF9DUl9TSEZUCTE4CQkJLyogTExQIHdpZGdldCBjcmVkaXQKKwkJCQkJCQkgICBzaGlmdCAqLworI2RlZmluZSBYQl9DVFJMX0lMTEVHQUxfRFNUX0lFCQkweDAwMDIwMDAwCS8qIGlsbGVnYWwgZGVzdGluYXRpb24KKwkJCQkJCQkgKi8KKyNkZWZpbmUgWEJfQ1RSTF9PQUxMT0NfSUJVRl9JRQkJMHgwMDAxMDAwMAkvKiBvdmVyYWxsb2NhdGVkIGlucHV0CisJCQkJCQkJICAgYnVmZmVyICovCisvKiByZXNlcnZlZDoJCQkweDAwMDBmZTAwICovCiAjZGVmaW5lIFhCX0NUUkxfQk5EV0RUSF9BTExPQ19JRQkweDAwMDAwMTAwCS8qIGJhbmR3aWR0aCBhbGxvYyAqLwogI2RlZmluZSBYQl9DVFJMX1JDVl9DTlRfT0ZMT1dfSUUJMHgwMDAwMDA4MAkvKiByY3YgcmV0cnkgb3ZlcmZsb3cgKi8KICNkZWZpbmUgWEJfQ1RSTF9YTVRfQ05UX09GTE9XX0lFCTB4MDAwMDAwNDAJLyogeG10IHJldHJ5IG92ZXJmbG93ICovCiAjZGVmaW5lIFhCX0NUUkxfWE1UX01BWF9SVFJZX0lFCQkweDAwMDAwMDIwCS8qIG1heCB0cmFuc21pdCByZXRyeSAqLwogI2RlZmluZSBYQl9DVFJMX1JDVl9JRQkJCTB4MDAwMDAwMTAJLyogcmVjZWl2ZSAqLwogI2RlZmluZSBYQl9DVFJMX1hNVF9SVFJZX0lFCQkweDAwMDAwMDA4CS8qIHRyYW5zbWl0IHJldHJ5ICovCi0gICAgIC8qIHJlc2VydmVkOgkJCTB4MDAwMDAwMDQgKi8KLSNkZWZpbmUJWEJfQ1RSTF9NQVhSRVFfVE9VVF9JRQkJMHgwMDAwMDAwMgkvKiBtYXhpbXVtIHJlcXVlc3QgdGltZW91dCAqLworLyogcmVzZXJ2ZWQ6CQkJMHgwMDAwMDAwNCAqLworI2RlZmluZQlYQl9DVFJMX01BWFJFUV9UT1VUX0lFCQkweDAwMDAwMDAyCS8qIG1heGltdW0gcmVxdWVzdAorCQkJCQkJCSAgIHRpbWVvdXQgKi8KICNkZWZpbmUJWEJfQ1RSTF9TUkNfVE9VVF9JRQkJMHgwMDAwMDAwMQkvKiBzb3VyY2UgdGltZW91dCAqLwogCiAvKiBsaW5rX3N0YXR1cyh4KSAqLwogI2RlZmluZQlYQl9TVEFUX0xJTktBTElWRQkJWEJfQ1RSTF9MSU5LQUxJVkVfSUUKLSAgICAgLyogcmVzZXJ2ZWQ6CQkJMHg3ZmY4MDAwMCAqLworLyogcmVzZXJ2ZWQ6CQkJMHg3ZmY4MDAwMCAqLwogI2RlZmluZQlYQl9TVEFUX01VTFRJX0VSUgkJMHgwMDA0MDAwMAkvKiBtdWx0aSBlcnJvciAqLwogI2RlZmluZQlYQl9TVEFUX0lMTEVHQUxfRFNUX0VSUgkJWEJfQ1RSTF9JTExFR0FMX0RTVF9JRQogI2RlZmluZQlYQl9TVEFUX09BTExPQ19JQlVGX0VSUgkJWEJfQ1RSTF9PQUxMT0NfSUJVRl9JRQpAQCAtMjExLDcgKzIyMCw3IEBACiAjZGVmaW5lCVhCX1NUQVRfWE1UX01BWF9SVFJZX0VSUglYQl9DVFJMX1hNVF9NQVhfUlRSWV9JRQogI2RlZmluZQlYQl9TVEFUX1JDVl9FUlIJCQlYQl9DVFJMX1JDVl9JRQogI2RlZmluZQlYQl9TVEFUX1hNVF9SVFJZX0VSUgkJWEJfQ1RSTF9YTVRfUlRSWV9JRQotICAgICAvKiByZXNlcnZlZDoJCQkweDAwMDAwMDA0ICovCisvKiByZXNlcnZlZDoJCQkweDAwMDAwMDA0ICovCiAjZGVmaW5lCVhCX1NUQVRfTUFYUkVRX1RPVVRfRVJSCQlYQl9DVFJMX01BWFJFUV9UT1VUX0lFCiAjZGVmaW5lCVhCX1NUQVRfU1JDX1RPVVRfRVJSCQlYQl9DVFJMX1NSQ19UT1VUX0lFCiAKQEAgLTIyMiw3ICsyMzEsNyBAQAogI2RlZmluZQlYQl9BVVhfTElOS0ZBSUxfUlNUX0JBRAkweDAwMDAwMDQwCiAjZGVmaW5lCVhCX0FVWF9TVEFUX1BSRVNFTlQJMHgwMDAwMDAyMAogI2RlZmluZQlYQl9BVVhfU1RBVF9QT1JUX1dJRFRICTB4MDAwMDAwMTAKLSAgICAgLyoJcmVzZXJ2ZWQ6CQkweDAwMDAwMDBmICovCisvKglyZXNlcnZlZDoJCTB4MDAwMDAwMGYgKi8KIAogLyoKICAqIGxpbmtfYXJiX3VwcGVyL2xpbmtfYXJiX2xvd2VyKHgpLCAocmVnKSBzaG91bGQgYmUgdGhlIGxpbmtfYXJiX3VwcGVyCkBAIC0yMzgsNyArMjQ3LDggQEAKIC8qIFhCT1dfV0lEX1NUQVQgKi8KICNkZWZpbmUJWEJfV0lEX1NUQVRfTElOS19JTlRSX1NIRlQJKDI0KQogI2RlZmluZQlYQl9XSURfU1RBVF9MSU5LX0lOVFJfTUFTSwkoMHhGRiA8PCBYQl9XSURfU1RBVF9MSU5LX0lOVFJfU0hGVCkKLSNkZWZpbmUJWEJfV0lEX1NUQVRfTElOS19JTlRSKHgpCSgweDEgPDwgKCgoeCkmNykgKyBYQl9XSURfU1RBVF9MSU5LX0lOVFJfU0hGVCkpCisjZGVmaW5lCVhCX1dJRF9TVEFUX0xJTktfSU5UUih4KSBcCisJKDB4MSA8PCAoKCh4KSY3KSArIFhCX1dJRF9TVEFUX0xJTktfSU5UUl9TSEZUKSkKICNkZWZpbmUJWEJfV0lEX1NUQVRfV0lER0VUMF9JTlRSCTB4MDA4MDAwMDAKICNkZWZpbmUgWEJfV0lEX1NUQVRfU1JDSURfTUFTSwkJMHgwMDAwMDNjMAkvKiBYYnJpZGdlIG9ubHkgKi8KICNkZWZpbmUJWEJfV0lEX1NUQVRfUkVHX0FDQ19FUlIJCTB4MDAwMDAwMjAKQEAgLTI2NCw3ICsyNzQsNyBAQAogI2RlZmluZSBYWEJPV19XSURHRVRfUEFSVF9OVU0JMHhkMDAwCQkvKiBYYnJpZGdlICovCiAjZGVmaW5lCVhCT1dfV0lER0VUX01GR1JfTlVNCTB4MAogI2RlZmluZQlYWEJPV19XSURHRVRfTUZHUl9OVU0JMHgwCi0jZGVmaW5lIFBYQk9XX1dJREdFVF9QQVJUX05VTSAgIDB4ZDEwMCAgICAgICAgICAvKiBQSUMgKi8KKyNkZWZpbmUgUFhCT1dfV0lER0VUX1BBUlRfTlVNICAgMHhkMTAwCQkvKiBQSUMgKi8KIAogI2RlZmluZQlYQk9XX1JFVl8xXzAJCTB4MQkvKiB4Ym93IHJldiAxLjAgaXMgIjEiICovCiAjZGVmaW5lCVhCT1dfUkVWXzFfMQkJMHgyCS8qIHhib3cgcmV2IDEuMSBpcyAiMiIgKi8KQEAgLTI3OSwxMyArMjg5LDEzIEBACiAjZGVmaW5lCVhCT1dfV0lEX0FSQl9SRUxPQURfSU5UCTB4M2YJLyogR0JSIHJlbG9hZCBpbnRlcnZhbCAqLwogCiAjZGVmaW5lIElTX1hCUklER0VfWEJPVyh3aWQpIFwKLSAgICAgICAgKFhXSURHRVRfUEFSVF9OVU0od2lkKSA9PSBYWEJPV19XSURHRVRfUEFSVF9OVU0gJiYgXAotICAgICAgICAgICAgICAgICAgICAgICAgWFdJREdFVF9NRkdfTlVNKHdpZCkgPT0gWFhCT1dfV0lER0VUX01GR1JfTlVNKQorCShYV0lER0VUX1BBUlRfTlVNKHdpZCkgPT0gWFhCT1dfV0lER0VUX1BBUlRfTlVNICYmIFwKKwlYV0lER0VUX01GR19OVU0od2lkKSA9PSBYWEJPV19XSURHRVRfTUZHUl9OVU0pCiAKICNkZWZpbmUgSVNfUElDX1hCT1cod2lkKSBcCi0gICAgICAgIChYV0lER0VUX1BBUlRfTlVNKHdpZCkgPT0gUFhCT1dfV0lER0VUX1BBUlRfTlVNICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIFhXSURHRVRfTUZHX05VTSh3aWQpID09IFhYQk9XX1dJREdFVF9NRkdSX05VTSkKKwkoWFdJREdFVF9QQVJUX05VTSh3aWQpID09IFBYQk9XX1dJREdFVF9QQVJUX05VTSAmJiBcCisJWFdJREdFVF9NRkdfTlVNKHdpZCkgPT0gWFhCT1dfV0lER0VUX01GR1JfTlVNKQogCiAjZGVmaW5lIFhCT1dfV0FSX0VOQUJMRUQocHYsIHdpZGlkKSAoKDEgPDwgWFdJREdFVF9SRVZfTlVNKHdpZGlkKSkgJiBwdikKIAotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBfQVNNX0lBNjRfU05fWFRBTEtfWEJPV19IICovCisjZW5kaWYgLyogX0FTTV9JQTY0X1NOX1hUQUxLX1hCT1dfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2luY2x1ZGUveHRhbGsveHdpZGdldGRldi5oIGIvYXJjaC9pYTY0L3NuL2luY2x1ZGUveHRhbGsveHdpZGdldGRldi5oCmluZGV4IGM1ZjRiYzUuLjI4MDBlZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3h0YWxrL3h3aWRnZXRkZXYuaAorKysgYi9hcmNoL2lhNjQvc24vaW5jbHVkZS94dGFsay94d2lkZ2V0ZGV2LmgKQEAgLTI1LDI4ICsyNSwyOCBAQAogCiAvKiB3aWRnZXQgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KIHN0cnVjdCB3aWRnZXRfY2ZnewotCXVpbnQzMl90CXdfaWQ7CS8qIDB4MDQgKi8KLQl1aW50MzJfdAl3X3BhZF8wOwkvKiAweDAwICovCi0JdWludDMyX3QJd19zdGF0dXM7CS8qIDB4MGMgKi8KLQl1aW50MzJfdAl3X3BhZF8xOwkvKiAweDA4ICovCi0JdWludDMyX3QJd19lcnJfdXBwZXJfYWRkcjsJLyogMHgxNCAqLwotCXVpbnQzMl90CXdfcGFkXzI7CS8qIDB4MTAgKi8KLQl1aW50MzJfdAl3X2Vycl9sb3dlcl9hZGRyOwkvKiAweDFjICovCi0JdWludDMyX3QJd19wYWRfMzsJLyogMHgxOCAqLwotCXVpbnQzMl90CXdfY29udHJvbDsJLyogMHgyNCAqLwotCXVpbnQzMl90CXdfcGFkXzQ7CS8qIDB4MjAgKi8KLQl1aW50MzJfdAl3X3JlcV90aW1lb3V0OwkvKiAweDJjICovCi0JdWludDMyX3QJd19wYWRfNTsJLyogMHgyOCAqLwotCXVpbnQzMl90CXdfaW50ZGVzdF91cHBlcl9hZGRyOwkvKiAweDM0ICovCi0JdWludDMyX3QJd19wYWRfNjsJLyogMHgzMCAqLwotCXVpbnQzMl90CXdfaW50ZGVzdF9sb3dlcl9hZGRyOwkvKiAweDNjICovCi0JdWludDMyX3QJd19wYWRfNzsJLyogMHgzOCAqLwotCXVpbnQzMl90CXdfZXJyX2NtZF93b3JkOwkvKiAweDQ0ICovCi0JdWludDMyX3QJd19wYWRfODsJLyogMHg0MCAqLwotCXVpbnQzMl90CXdfbGxwX2NmZzsJLyogMHg0YyAqLwotCXVpbnQzMl90CXdfcGFkXzk7CS8qIDB4NDggKi8KLQl1aW50MzJfdAl3X3RmbHVzaDsJLyogMHg1NCAqLwotCXVpbnQzMl90CXdfcGFkXzEwOwkvKiAweDUwICovCisJdTMyCXdfaWQ7CS8qIDB4MDQgKi8KKwl1MzIJd19wYWRfMDsJLyogMHgwMCAqLworCXUzMgl3X3N0YXR1czsJLyogMHgwYyAqLworCXUzMgl3X3BhZF8xOwkvKiAweDA4ICovCisJdTMyCXdfZXJyX3VwcGVyX2FkZHI7CS8qIDB4MTQgKi8KKwl1MzIJd19wYWRfMjsJLyogMHgxMCAqLworCXUzMgl3X2Vycl9sb3dlcl9hZGRyOwkvKiAweDFjICovCisJdTMyCXdfcGFkXzM7CS8qIDB4MTggKi8KKwl1MzIJd19jb250cm9sOwkvKiAweDI0ICovCisJdTMyCXdfcGFkXzQ7CS8qIDB4MjAgKi8KKwl1MzIJd19yZXFfdGltZW91dDsJLyogMHgyYyAqLworCXUzMgl3X3BhZF81OwkvKiAweDI4ICovCisJdTMyCXdfaW50ZGVzdF91cHBlcl9hZGRyOwkvKiAweDM0ICovCisJdTMyCXdfcGFkXzY7CS8qIDB4MzAgKi8KKwl1MzIJd19pbnRkZXN0X2xvd2VyX2FkZHI7CS8qIDB4M2MgKi8KKwl1MzIJd19wYWRfNzsJLyogMHgzOCAqLworCXUzMgl3X2Vycl9jbWRfd29yZDsJLyogMHg0NCAqLworCXUzMgl3X3BhZF84OwkvKiAweDQwICovCisJdTMyCXdfbGxwX2NmZzsJLyogMHg0YyAqLworCXUzMgl3X3BhZF85OwkvKiAweDQ4ICovCisJdTMyCXdfdGZsdXNoOwkvKiAweDU0ICovCisJdTMyCXdfcGFkXzEwOwkvKiAweDUwICovCiB9OwogCiAvKgpAQCAtNjMsNyArNjMsNyBAQAogCXN0cnVjdCB4d2lkZ2V0X2h3aWQJeHdpX2h3aWQ7CS8qIFdpZGdldCBJZGVudGlmaWNhdGlvbiAqLwogCWNoYXIJCQl4d2lfbWFzdGVyeGlkOwkvKiBIdWIncyBXaWRnZXQgUG9ydCBOdW1iZXIgKi8KIAl2b2lkCQkJKnh3aV9odWJpbmZvOyAgICAgLyogSHViJ3MgcHJvdmlkZXIgcHJpdmF0ZSBpbmZvICovCi0JdWludDY0X3QJCSp4d2lfaHViX3Byb3ZpZGVyOyAvKiBwcm9tIHByb3ZpZGVyIGZ1bmN0aW9ucyAqLworCXU2NAkJCSp4d2lfaHViX3Byb3ZpZGVyOyAvKiBwcm9tIHByb3ZpZGVyIGZ1bmN0aW9ucyAqLwogCXZvaWQJCQkqeHdpX3ZlcnRleDsKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvYnRlX2Vycm9yLmMgYi9hcmNoL2lhNjQvc24va2VybmVsL2J0ZV9lcnJvci5jCmluZGV4IGZjYmM3NDguLmYxZWMxMzcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvYnRlX2Vycm9yLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9idGVfZXJyb3IuYwpAQCAtMzMsNyArMzMsNyBAQAogICogV2FpdCB1bnRpbCBhbGwgQlRFIHJlbGF0ZWQgQ1JCcyBhcmUgY29tcGxldGVkCiAgKiBhbmQgdGhlbiByZXNldCB0aGUgaW50ZXJmYWNlcy4KICAqLwotdm9pZCBzaHViMV9idGVfZXJyb3JfaGFuZGxlcih1bnNpZ25lZCBsb25nIF9ub2RlcGRhKQoraW50IHNodWIxX2J0ZV9lcnJvcl9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgX25vZGVwZGEpCiB7CiAJc3RydWN0IG5vZGVwZGFfcyAqZXJyX25vZGVwZGEgPSAoc3RydWN0IG5vZGVwZGFfcyAqKV9ub2RlcGRhOwogCXN0cnVjdCB0aW1lcl9saXN0ICpyZWNvdmVyeV90aW1lciA9ICZlcnJfbm9kZXBkYS0+YnRlX3JlY292ZXJ5X3RpbWVyOwpAQCAtNTMsNyArNTMsNyBAQAogCSAgICAoZXJyX25vZGVwZGEtPmJ0ZV9pZlsxXS5iaF9lcnJvciA9PSBCVEVfU1VDQ0VTUykpIHsKIAkJQlRFX1BSSU5USygoImVoOiVwOiVkIE5vdGhpbmcgdG8gZG8uXG4iLCBlcnJfbm9kZXBkYSwKIAkJCSAgICBzbXBfcHJvY2Vzc29yX2lkKCkpKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gMTsKIAl9CiAKIAkvKiBEZXRlcm1pbmUgaW5mb3JtYXRpb24gYWJvdXQgb3VyIGh1YiAqLwpAQCAtODEsNyArODEsNyBAQAogCQltb2RfdGltZXIocmVjb3ZlcnlfdGltZXIsIEhaICogNSk7CiAJCUJURV9QUklOVEsoKCJlaDolcDolZCBNYXJrZWQgR2l2aW5nIHVwXG4iLCBlcnJfbm9kZXBkYSwKIAkJCSAgICBzbXBfcHJvY2Vzc29yX2lkKCkpKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gMTsKIAl9CiAJaWYgKGljbXIuaWlfaWNtcl9mbGRfcy5pX2NyYl92bGQgIT0gMCkgewogCkBAIC05OSw3ICs5OSw3IEBACiAJCQkJQlRFX1BSSU5USygoImVoOiVwOiVkIFZhbGlkICVkLCBHaXZpbmcgdXBcbiIsCiAJCQkJCSAgICBlcnJfbm9kZXBkYSwgc21wX3Byb2Nlc3Nvcl9pZCgpLAogCQkJCQkgICAgaSkpOwotCQkJCXJldHVybjsKKwkJCQlyZXR1cm4gMTsKIAkJCX0KIAkJfQogCX0KQEAgLTEyNCw2ICsxMjQsNDIgQEAKIAlSRU1PVEVfSFVCX1MobmFzaWQsIElJT19JQkNSLCBpYmNyLmlpX2liY3JfcmVndmFsKTsKIAogCWRlbF90aW1lcihyZWNvdmVyeV90aW1lcik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXYWl0IHVudGlsIGFsbCBCVEUgcmVsYXRlZCBDUkJzIGFyZSBjb21wbGV0ZWQKKyAqIGFuZCB0aGVuIHJlc2V0IHRoZSBpbnRlcmZhY2VzLgorICovCitpbnQgc2h1YjJfYnRlX2Vycm9yX2hhbmRsZXIodW5zaWduZWQgbG9uZyBfbm9kZXBkYSkKK3sKKwlzdHJ1Y3Qgbm9kZXBkYV9zICplcnJfbm9kZXBkYSA9IChzdHJ1Y3Qgbm9kZXBkYV9zICopX25vZGVwZGE7CisJc3RydWN0IHRpbWVyX2xpc3QgKnJlY292ZXJ5X3RpbWVyID0gJmVycl9ub2RlcGRhLT5idGVfcmVjb3ZlcnlfdGltZXI7CisJc3RydWN0IGJ0ZWluZm9fcyAqYnRlOworCW5hc2lkX3QgbmFzaWQ7CisJdTY0IHN0YXR1czsKKwlpbnQgaTsKKworCW5hc2lkID0gY25vZGVpZF90b19uYXNpZChlcnJfbm9kZXBkYS0+YnRlX2lmWzBdLmJ0ZV9jbm9kZSk7CisKKwkvKgorCSAqIFZlcmlmeSB0aGF0IGFsbCB0aGUgQlRFcyBhcmUgY29tcGxldGUKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQlRFU19QRVJfTk9ERTsgaSsrKSB7CisJCWJ0ZSA9ICZlcnJfbm9kZXBkYS0+YnRlX2lmW2ldOworCQlzdGF0dXMgPSBCVEVfTE5TVEFUX0xPQUQoYnRlKTsKKwkJaWYgKChzdGF0dXMgJiBJQkxTX0VSUk9SKSB8fCAhKHN0YXR1cyAmIElCTFNfQlVTWSkpCisJCQljb250aW51ZTsKKwkJbW9kX3RpbWVyKHJlY292ZXJ5X3RpbWVyLCBIWiAqIDUpOworCQlCVEVfUFJJTlRLKCgiZWg6JXA6JWQgTWFya2VkIEdpdmluZyB1cFxuIiwgZXJyX25vZGVwZGEsCisJCQkgICAgc21wX3Byb2Nlc3Nvcl9pZCgpKSk7CisJCXJldHVybiAxOworCX0KKwlpZiAoaWE2NF9zbl9idGVfcmVjb3ZlcnkobmFzaWQpKQorCQlwYW5pYygiYnRlX2Vycm9yX2hhbmRsZXIoKTogRmF0YWwgQlRFIEVycm9yIik7CisKKwlkZWxfdGltZXIocmVjb3ZlcnlfdGltZXIpOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTM1LDcgKzE3MSw2IEBACiAJc3RydWN0IG5vZGVwZGFfcyAqZXJyX25vZGVwZGEgPSAoc3RydWN0IG5vZGVwZGFfcyAqKV9ub2RlcGRhOwogCXNwaW5sb2NrX3QgKnJlY292ZXJ5X2xvY2sgPSAmZXJyX25vZGVwZGEtPmJ0ZV9yZWNvdmVyeV9sb2NrOwogCWludCBpOwotCW5hc2lkX3QgbmFzaWQ7CiAJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CiAJdm9sYXRpbGUgdTY0ICpub3RpZnk7CiAJYnRlX3Jlc3VsdF90IGJoX2Vycm9yOwpAQCAtMTYwLDEyICsxOTUsMTUgQEAKIAl9CiAKIAlpZiAoaXNfc2h1YjEoKSkgewotCQlzaHViMV9idGVfZXJyb3JfaGFuZGxlcihfbm9kZXBkYSk7CisJCWlmIChzaHViMV9idGVfZXJyb3JfaGFuZGxlcihfbm9kZXBkYSkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocmVjb3ZlcnlfbG9jaywgaXJxX2ZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQogCX0gZWxzZSB7Ci0JCW5hc2lkID0gY25vZGVpZF90b19uYXNpZChlcnJfbm9kZXBkYS0+YnRlX2lmWzBdLmJ0ZV9jbm9kZSk7Ci0KLQkJaWYgKGlhNjRfc25fYnRlX3JlY292ZXJ5KG5hc2lkKSkKLQkJCXBhbmljKCJidGVfZXJyb3JfaGFuZGxlcigpOiBGYXRhbCBCVEUgRXJyb3IiKTsKKwkJaWYgKHNodWIyX2J0ZV9lcnJvcl9oYW5kbGVyKF9ub2RlcGRhKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShyZWNvdmVyeV9sb2NrLCBpcnFfZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IEJURVNfUEVSX05PREU7IGkrKykgewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9odWJlcnJvci5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9odWJlcnJvci5jCmluZGV4IDVjNWViMDEuLjU2YWI2YmEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaHViZXJyb3IuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL2h1YmVycm9yLmMKQEAgLTMyLDEzICszMiwxNCBAQAogCXJldF9zdHVmZi52MCA9IDA7CiAJaHViZGV2X2luZm8gPSAoc3RydWN0IGh1YmRldl9pbmZvICopYXJnOwogCW5hc2lkID0gaHViZGV2X2luZm8tPmhkaV9uYXNpZDsKLQlTQUxfQ0FMTF9OT0xPQ0socmV0X3N0dWZmLCBTTl9TQUxfSFVCX0VSUk9SX0lOVEVSUlVQVCwKLQkJCSh1NjQpIG5hc2lkLCAwLCAwLCAwLCAwLCAwLCAwKTsKLQotCWlmICgoaW50KXJldF9zdHVmZi52MCkKLQkJcGFuaWMoImh1YmlpX2VpbnRfaGFuZGxlcigpOiBGYXRhbCBUSU8gRXJyb3IiKTsKIAogCWlmIChpc19zaHViMSgpKSB7CisJCVNBTF9DQUxMX05PTE9DSyhyZXRfc3R1ZmYsIFNOX1NBTF9IVUJfRVJST1JfSU5URVJSVVBULAorCQkJKHU2NCkgbmFzaWQsIDAsIDAsIDAsIDAsIDAsIDApOworCisJCWlmICgoaW50KXJldF9zdHVmZi52MCkKKwkJCXBhbmljKCJodWJpaV9laW50X2hhbmRsZXIoKTogRmF0YWwgVElPIEVycm9yIik7CisKIAkJaWYgKCEobmFzaWQgJiAxKSkgLyogTm90IGEgVElPLCBoYW5kbGUgQ1JCIGVycm9ycyAqLwogCQkJKHZvaWQpaHViaWlvX2NyYl9lcnJvcl9oYW5kbGVyKGh1YmRldl9pbmZvKTsKIAl9IGVsc2UgCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL2lvX2luaXQuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9faW5pdC5jCmluZGV4IDMxODA4N2UuLjAwNzAwZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9faW5pdC5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9faW5pdC5jCkBAIC03NiwxMSArNzYsMTIgQEAKIH07CiAKIC8qCi0gKiBSZXRyaWV2ZSB0aGUgRE1BIEZsdXNoIExpc3QgZ2l2ZW4gbmFzaWQuICBUaGlzIGxpc3QgaXMgbmVlZGVkIAotICogdG8gaW1wbGVtZW50IHRoZSBXQVIgLSBGbHVzaCBETUEgZGF0YSBvbiBQSU8gUmVhZHMuCisgKiBSZXRyaWV2ZSB0aGUgRE1BIEZsdXNoIExpc3QgZ2l2ZW4gbmFzaWQsIHdpZGdldCwgYW5kIGRldmljZS4KKyAqIFRoaXMgbGlzdCBpcyBuZWVkZWQgdG8gaW1wbGVtZW50IHRoZSBXQVIgLSBGbHVzaCBETUEgZGF0YSBvbiBQSU8gUmVhZHMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdWludDY0X3QKLXNhbF9nZXRfd2lkZ2V0X2RtYWZsdXNoX2xpc3QodTY0IG5hc2lkLCB1NjQgd2lkZ2V0X251bSwgdTY0IGFkZHJlc3MpCitzdGF0aWMgaW5saW5lIHU2NAorc2FsX2dldF9kZXZpY2VfZG1hZmx1c2hfbGlzdCh1NjQgbmFzaWQsIHU2NCB3aWRnZXRfbnVtLCB1NjQgZGV2aWNlX251bSwKKwkJCSAgICAgdTY0IGFkZHJlc3MpCiB7CiAKIAlzdHJ1Y3QgaWE2NF9zYWxfcmV0dmFsIHJldF9zdHVmZjsKQEAgLTg4LDE3ICs4OSwxNyBAQAogCXJldF9zdHVmZi52MCA9IDA7CiAKIAlTQUxfQ0FMTF9OT0xPQ0socmV0X3N0dWZmLAotCQkJKHU2NCkgU05fU0FMX0lPSUZfR0VUX1dJREdFVF9ETUFGTFVTSF9MSVNULAotCQkJKHU2NCkgbmFzaWQsICh1NjQpIHdpZGdldF9udW0sICh1NjQpIGFkZHJlc3MsIDAsIDAsIDAsCi0JCQkwKTsKLQlyZXR1cm4gcmV0X3N0dWZmLnYwOworCQkJKHU2NCkgU05fU0FMX0lPSUZfR0VUX0RFVklDRV9ETUFGTFVTSF9MSVNULAorCQkJKHU2NCkgbmFzaWQsICh1NjQpIHdpZGdldF9udW0sCisJCQkodTY0KSBkZXZpY2VfbnVtLCAodTY0KSBhZGRyZXNzLCAwLCAwLCAwKTsKKwlyZXR1cm4gcmV0X3N0dWZmLnN0YXR1czsKIAogfQogCiAvKgogICogUmV0cmlldmUgdGhlIGh1YiBkZXZpY2UgaW5mbyBzdHJ1Y3R1cmUgZm9yIHRoZSBnaXZlbiBuYXNpZC4KICAqLwotc3RhdGljIGlubGluZSB1aW50NjRfdCBzYWxfZ2V0X2h1YmRldl9pbmZvKHU2NCBoYW5kbGUsIHU2NCBhZGRyZXNzKQorc3RhdGljIGlubGluZSB1NjQgc2FsX2dldF9odWJkZXZfaW5mbyh1NjQgaGFuZGxlLCB1NjQgYWRkcmVzcykKIHsKIAogCXN0cnVjdCBpYTY0X3NhbF9yZXR2YWwgcmV0X3N0dWZmOwpAQCAtMTE0LDcgKzExNSw3IEBACiAvKgogICogUmV0cmlldmUgdGhlIHBjaSBidXMgaW5mb3JtYXRpb24gZ2l2ZW4gdGhlIGJ1cyBudW1iZXIuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdWludDY0X3Qgc2FsX2dldF9wY2lidXNfaW5mbyh1NjQgc2VnbWVudCwgdTY0IGJ1c251bSwgdTY0IGFkZHJlc3MpCitzdGF0aWMgaW5saW5lIHU2NCBzYWxfZ2V0X3BjaWJ1c19pbmZvKHU2NCBzZWdtZW50LCB1NjQgYnVzbnVtLCB1NjQgYWRkcmVzcykKIHsKIAogCXN0cnVjdCBpYTY0X3NhbF9yZXR2YWwgcmV0X3N0dWZmOwpAQCAtMTMwLDkgKzEzMSw5IEBACiAvKgogICogUmV0cmlldmUgdGhlIHBjaSBkZXZpY2UgaW5mb3JtYXRpb24gZ2l2ZW4gdGhlIGJ1cyBhbmQgZGV2aWNlfGZ1bmN0aW9uIG51bWJlci4KICAqLwotc3RhdGljIGlubGluZSB1aW50NjRfdAotc2FsX2dldF9wY2lkZXZfaW5mbyh1NjQgc2VnbWVudCwgdTY0IGJ1c19udW1iZXIsIHU2NCBkZXZmbiwgdTY0IHBjaV9kZXYsIAotCQkJdTY0IHNuX2lycV9pbmZvKQorc3RhdGljIGlubGluZSB1NjQKK3NhbF9nZXRfcGNpZGV2X2luZm8odTY0IHNlZ21lbnQsIHU2NCBidXNfbnVtYmVyLCB1NjQgZGV2Zm4sIHU2NCBwY2lfZGV2LAorCQkgICAgdTY0IHNuX2lycV9pbmZvKQogewogCXN0cnVjdCBpYTY0X3NhbF9yZXR2YWwgcmV0X3N0dWZmOwogCXJldF9zdHVmZi5zdGF0dXMgPSAwOwpAQCAtMTQwLDcgKzE0MSw3IEBACiAKIAlTQUxfQ0FMTF9OT0xPQ0socmV0X3N0dWZmLAogCQkJKHU2NCkgU05fU0FMX0lPSUZfR0VUX1BDSURFVl9JTkZPLAotCQkJKHU2NCkgc2VnbWVudCwgKHU2NCkgYnVzX251bWJlciwgKHU2NCkgZGV2Zm4sIAorCQkJKHU2NCkgc2VnbWVudCwgKHU2NCkgYnVzX251bWJlciwgKHU2NCkgZGV2Zm4sCiAJCQkodTY0KSBwY2lfZGV2LAogCQkJc25faXJxX2luZm8sIDAsIDApOwogCXJldHVybiByZXRfc3R1ZmYudjA7CkBAIC0xNjQsMTggKzE2NSw1NSBAQAogCXJldHVybiBOVUxMOwogfQogCisvKiBPbGRlciBQUk9NIGZsdXNoIFdBUgorICoKKyAqIDAxLzE2LzA2IC0tIFRoaXMgd2FyIHdpbGwgYmUgaW4gcGxhY2UgdW50aWwgYSBuZXcgb2ZmaWNpYWwgUFJPTSBpcyByZWxlYXNlZC4KKyAqIEFkZGl0aW9uYWxseSBub3RlIHRoYXQgdGhlIHN0cnVjdCBzbl9mbHVzaF9kZXZpY2Vfd2FyIGFsc28gaGFzIHRvIGJlCisgKiByZW1vdmVkIGZyb20gYXJjaC9pYTY0L3NuL2luY2x1ZGUveHRhbGsvaHViZGV2LmgKKyAqLworc3RhdGljIHU4IHdhcl9pbXBsZW1lbnRlZCA9IDA7CisKK3N0YXRpYyB2b2lkIHNuX2RldmljZV9maXh1cF93YXIodTY0IG5hc2lkLCB1NjQgd2lkZ2V0LCBpbnQgZGV2aWNlLAorCQkJCXN0cnVjdCBzbl9mbHVzaF9kZXZpY2VfY29tbW9uICpjb21tb24pCit7CisJc3RydWN0IHNuX2ZsdXNoX2RldmljZV93YXIgKndhcl9saXN0OworCXN0cnVjdCBzbl9mbHVzaF9kZXZpY2Vfd2FyICpkZXZfZW50cnk7CisJc3RydWN0IGlhNjRfc2FsX3JldHZhbCBpc3J2ID0gezAsMCwwLDB9OworCisJaWYgKCF3YXJfaW1wbGVtZW50ZWQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUFJPTSB2ZXJzaW9uIDwgNC41MCAtLSBpbXBsZW1lbnRpbmcgb2xkICIKKwkJICAgICAgICJQUk9NIGZsdXNoIFdBUlxuIik7CisJCXdhcl9pbXBsZW1lbnRlZCA9IDE7CisJfQorCisJd2FyX2xpc3QgPSBremFsbG9jKERFVl9QRVJfV0lER0VUICogc2l6ZW9mKCp3YXJfbGlzdCksIEdGUF9LRVJORUwpOworCWlmICghd2FyX2xpc3QpCisJCUJVRygpOworCisJU0FMX0NBTExfTk9MT0NLKGlzcnYsIFNOX1NBTF9JT0lGX0dFVF9XSURHRVRfRE1BRkxVU0hfTElTVCwKKwkJCW5hc2lkLCB3aWRnZXQsIF9fcGEod2FyX2xpc3QpLCAwLCAwLCAwICwwKTsKKwlpZiAoaXNydi5zdGF0dXMpCisJCXBhbmljKCJzbl9kZXZpY2VfZml4dXBfd2FyIGZhaWxlZDogJXNcbiIsCisJCSAgICAgIGlhNjRfc2FsX3N0cmVycm9yKGlzcnYuc3RhdHVzKSk7CisKKwlkZXZfZW50cnkgPSB3YXJfbGlzdCArIGRldmljZTsKKwltZW1jcHkoY29tbW9uLGRldl9lbnRyeSwgc2l6ZW9mKCpjb21tb24pKTsKKworCWtmcmVlKHdhcl9saXN0KTsKK30KKwogLyoKLSAqIHNuX2ZpeHVwX2lvbm9kZXMoKSAtIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyB0aGUgSFVCIGRhdGEgc3RyY3V0dXJlIGZvciAKKyAqIHNuX2ZpeHVwX2lvbm9kZXMoKSAtIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyB0aGUgSFVCIGRhdGEgc3RyY3V0dXJlIGZvcgogICoJZWFjaCBub2RlIGluIHRoZSBzeXN0ZW0uCiAgKi8KIHN0YXRpYyB2b2lkIHNuX2ZpeHVwX2lvbm9kZXModm9pZCkKIHsKLQotCXN0cnVjdCBzbl9mbHVzaF9kZXZpY2VfbGlzdCAqc25fZmx1c2hfZGV2aWNlX2xpc3Q7CisJc3RydWN0IHNuX2ZsdXNoX2RldmljZV9rZXJuZWwgKnNuX2ZsdXNoX2RldmljZV9rZXJuZWw7CisJc3RydWN0IHNuX2ZsdXNoX2RldmljZV9rZXJuZWwgKmRldl9lbnRyeTsKIAlzdHJ1Y3QgaHViZGV2X2luZm8gKmh1YmRldjsKLQl1aW50NjRfdCBzdGF0dXM7Ci0JdWludDY0X3QgbmFzaWQ7Ci0JaW50IGksIHdpZGdldDsKKwl1NjQgc3RhdHVzOworCXU2NCBuYXNpZDsKKwlpbnQgaSwgd2lkZ2V0LCBkZXZpY2U7CiAKIAkvKgogCSAqIEdldCBTR0kgU3BlY2lmaWMgSFVCIGNoaXBzZXQgaW5mb3JtYXRpb24uCkBAIC0xODYsNyArMjI0LDcgQEAKIAkJbmFzaWQgPSBjbm9kZWlkX3RvX25hc2lkKGkpOwogCQlodWJkZXYtPm1heF9zZWdtZW50X251bWJlciA9IDB4ZmZmZmZmZmY7CiAJCWh1YmRldi0+bWF4X3BjaWJ1c19udW1iZXIgPSAweGZmOwotCQlzdGF0dXMgPSBzYWxfZ2V0X2h1YmRldl9pbmZvKG5hc2lkLCAodWludDY0X3QpIF9fcGEoaHViZGV2KSk7CisJCXN0YXR1cyA9IHNhbF9nZXRfaHViZGV2X2luZm8obmFzaWQsICh1NjQpIF9fcGEoaHViZGV2KSk7CiAJCWlmIChzdGF0dXMpCiAJCQljb250aW51ZTsKIApAQCAtMjEzLDM4ICsyNTEsNjAgQEAKIAogCQlodWJkZXYtPmhkaV9mbHVzaF9uYXNpZF9saXN0LndpZGdldF9wID0KIAkJICAgIGttYWxsb2MoKEhVQl9XSURHRVRfSURfTUFYICsgMSkgKgotCQkJICAgIHNpemVvZihzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2xpc3QgKiksIEdGUF9LRVJORUwpOwotCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsICopLAorCQkJICAgIEdGUF9LRVJORUwpOwogCQltZW1zZXQoaHViZGV2LT5oZGlfZmx1c2hfbmFzaWRfbGlzdC53aWRnZXRfcCwgMHgwLAogCQkgICAgICAgKEhVQl9XSURHRVRfSURfTUFYICsgMSkgKgotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzbl9mbHVzaF9kZXZpY2VfbGlzdCAqKSk7CisJCSAgICAgICBzaXplb2Yoc3RydWN0IHNuX2ZsdXNoX2RldmljZV9rZXJuZWwgKikpOwogCiAJCWZvciAod2lkZ2V0ID0gMDsgd2lkZ2V0IDw9IEhVQl9XSURHRVRfSURfTUFYOyB3aWRnZXQrKykgewotCQkJc25fZmx1c2hfZGV2aWNlX2xpc3QgPSBrbWFsbG9jKERFVl9QRVJfV0lER0VUICoKLQkJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0Ci0JCQkJCQkJICAgICAgc25fZmx1c2hfZGV2aWNlX2xpc3QpLAotCQkJCQkJICAgICAgIEdGUF9LRVJORUwpOwotCQkJbWVtc2V0KHNuX2ZsdXNoX2RldmljZV9saXN0LCAweDAsCisJCQlzbl9mbHVzaF9kZXZpY2Vfa2VybmVsID0ga21hbGxvYyhERVZfUEVSX1dJREdFVCAqCisJCQkJCQkgICAgICAgICBzaXplb2Yoc3RydWN0CisJCQkJCQkgICAgICAgIHNuX2ZsdXNoX2RldmljZV9rZXJuZWwpLAorCQkJCQkJICAgICAgICBHRlBfS0VSTkVMKTsKKwkJCWlmICghc25fZmx1c2hfZGV2aWNlX2tlcm5lbCkKKwkJCQlCVUcoKTsKKwkJCW1lbXNldChzbl9mbHVzaF9kZXZpY2Vfa2VybmVsLCAweDAsCiAJCQkgICAgICAgREVWX1BFUl9XSURHRVQgKgotCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2xpc3QpKTsKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHNuX2ZsdXNoX2RldmljZV9rZXJuZWwpKTsKIAotCQkJc3RhdHVzID0KLQkJCSAgICBzYWxfZ2V0X3dpZGdldF9kbWFmbHVzaF9saXN0KG5hc2lkLCB3aWRnZXQsCi0JCQkJCQkJICh1aW50NjRfdCkKLQkJCQkJCQkgX19wYQotCQkJCQkJCSAoc25fZmx1c2hfZGV2aWNlX2xpc3QpKTsKLQkJCWlmIChzdGF0dXMpIHsKLQkJCQlrZnJlZShzbl9mbHVzaF9kZXZpY2VfbGlzdCk7Ci0JCQkJY29udGludWU7CisJCQlkZXZfZW50cnkgPSBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsOworCQkJZm9yIChkZXZpY2UgPSAwOyBkZXZpY2UgPCBERVZfUEVSX1dJREdFVDsKKwkJCSAgICAgZGV2aWNlKyssZGV2X2VudHJ5KyspIHsKKwkJCQlkZXZfZW50cnktPmNvbW1vbiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdAorCQkJCQkgICAgICAJICAgICAgICBzbl9mbHVzaF9kZXZpY2VfY29tbW9uKSwKKwkJCQkJICAgICAgICAgICAgICAgICAgICBHRlBfS0VSTkVMKTsKKwkJCQlpZiAoIWRldl9lbnRyeS0+Y29tbW9uKQorCQkJCQlCVUcoKTsKKwkJCQltZW1zZXQoZGV2X2VudHJ5LT5jb21tb24sIDB4MCwgc2l6ZW9mKHN0cnVjdAorCQkJCQkgICAgIAkgICAgICAgc25fZmx1c2hfZGV2aWNlX2NvbW1vbikpOworCisJCQkJc3RhdHVzID0gc2FsX2dldF9kZXZpY2VfZG1hZmx1c2hfbGlzdChuYXNpZCwKKwkJCQkJCQkJCXdpZGdldCwKKwkJCQkJCQkJICAgICAgIAlkZXZpY2UsCisJCQkJCQkgICAgICAodTY0KShkZXZfZW50cnktPmNvbW1vbikpOworCQkJCWlmIChzdGF0dXMpIHsKKwkJCQkJaWYgKHNuX3NhbF9yZXYoKSA8IDB4MDQ1MCkgeworCQkJCQkJLyogc2hvcnRsaXZlZCBXQVIgZm9yIG9sZGVyCisJCQkJCQkgKiBQUk9NIGltYWdlcworCQkJCQkJICovCisJCQkJCQlzbl9kZXZpY2VfZml4dXBfd2FyKG5hc2lkLAorCQkJCQkJCQkgICAgd2lkZ2V0LAorCQkJCQkJCQkgICAgZGV2aWNlLAorCQkJCQkJCSAgICAgZGV2X2VudHJ5LT5jb21tb24pOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCUJVRygpOworCQkJCX0KKworCQkJCXNwaW5fbG9ja19pbml0KCZkZXZfZW50cnktPnNmZGxfZmx1c2hfbG9jayk7CiAJCQl9CiAKLQkJCXNwaW5fbG9ja19pbml0KCZzbl9mbHVzaF9kZXZpY2VfbGlzdC0+c2ZkbF9mbHVzaF9sb2NrKTsKLQkJCWh1YmRldi0+aGRpX2ZsdXNoX25hc2lkX2xpc3Qud2lkZ2V0X3Bbd2lkZ2V0XSA9Ci0JCQkgICAgc25fZmx1c2hfZGV2aWNlX2xpc3Q7Ci0JCX0KLQorCQkJaWYgKHNuX2ZsdXNoX2RldmljZV9rZXJuZWwpCisJCQkJaHViZGV2LT5oZGlfZmx1c2hfbmFzaWRfbGlzdC53aWRnZXRfcFt3aWRnZXRdID0KKwkJCQkJCSAgICAgICBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsOworCSAgICAgICAgfQogCX0KLQogfQogCiAvKgpAQCAtMjU2LDcgKzMxNiw3IEBACiAgKi8KIHN0YXRpYyB2b2lkCiBzbl9wY2lfd2luZG93X2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHVuc2lnbmVkIGludCBjb3VudCwKLQkJICAgIGludDY0X3QgKiBwY2lfYWRkcnMpCisJCSAgICBzNjQgKiBwY2lfYWRkcnMpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpjb250cm9sbGVyID0gUENJX0NPTlRST0xMRVIoZGV2LT5idXMpOwogCXVuc2lnbmVkIGludCBpOwpAQCAtMzE2LDcgKzM3Niw3IEBACiAgCXN0cnVjdCBwY2lfYnVzICpob3N0X3BjaV9idXM7CiAgCXN0cnVjdCBwY2lfZGV2ICpob3N0X3BjaV9kZXY7CiAJc3RydWN0IHBjaWRldl9pbmZvICpwY2lkZXZfaW5mbzsKLQlpbnQ2NF90IHBjaV9hZGRyc1tQQ0lfUk9NX1JFU09VUkNFICsgMV07CisJczY0IHBjaV9hZGRyc1tQQ0lfUk9NX1JFU09VUkNFICsgMV07CiAgCXN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm87CiAgCXVuc2lnbmVkIGxvbmcgc2l6ZTsKICAJdW5zaWduZWQgaW50IGJ1c19ubywgZGV2Zm47CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL2lycS5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYwppbmRleCAwMWQxOGI3Li5lYzM3MDg0IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL2lycS5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaXJxLmMKQEAgLTI4LDcgKzI4LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICoqc25faXJxX2xoOwogc3RhdGljIHNwaW5sb2NrX3Qgc25faXJxX2luZm9fbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsgLyogbm9uLUlSUSBsb2NrICovCiAKLXN0YXRpYyBpbmxpbmUgdWludDY0X3Qgc25faW50cl9hbGxvYyhuYXNpZF90IGxvY2FsX25hc2lkLCBpbnQgbG9jYWxfd2lkZ2V0LAorc3RhdGljIGlubGluZSB1NjQgc25faW50cl9hbGxvYyhuYXNpZF90IGxvY2FsX25hc2lkLCBpbnQgbG9jYWxfd2lkZ2V0LAogCQkJCSAgICAgdTY0IHNuX2lycV9pbmZvLAogCQkJCSAgICAgaW50IHJlcV9pcnEsIG5hc2lkX3QgcmVxX25hc2lkLAogCQkJCSAgICAgaW50IHJlcV9zbGljZSkKQEAgLTEyMyw3ICsxMjMsNyBAQAogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNuX2lycV9pbmZvLCBzbl9pcnFfaW5mb19zYWZlLAogCQkJCSBzbl9pcnFfbGhbaXJxXSwgbGlzdCkgewotCQl1aW50NjRfdCBicmlkZ2U7CisJCXU2NCBicmlkZ2U7CiAJCWludCBsb2NhbF93aWRnZXQsIHN0YXR1czsKIAkJbmFzaWRfdCBsb2NhbF9uYXNpZDsKIAkJc3RydWN0IHNuX2lycV9pbmZvICpuZXdfaXJxX2luZm87CkBAIC0xMzQsNyArMTM0LDcgQEAKIAkJCWJyZWFrOwogCQltZW1jcHkobmV3X2lycV9pbmZvLCBzbl9pcnFfaW5mbywgc2l6ZW9mKHN0cnVjdCBzbl9pcnFfaW5mbykpOwogCi0JCWJyaWRnZSA9ICh1aW50NjRfdCkgbmV3X2lycV9pbmZvLT5pcnFfYnJpZGdlOworCQlicmlkZ2UgPSAodTY0KSBuZXdfaXJxX2luZm8tPmlycV9icmlkZ2U7CiAJCWlmICghYnJpZGdlKSB7CiAJCQlrZnJlZShuZXdfaXJxX2luZm8pOwogCQkJYnJlYWs7IC8qIGlycSBpcyBub3QgYSBkZXZpY2UgaW50ZXJydXB0ICovCkBAIC0zNDksMTAgKzM0OSwxMCBAQAogICovCiBzdGF0aWMgdm9pZCBzbl9jaGVja19pbnRyKGludCBpcnEsIHN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm8pCiB7Ci0JdWludDY0X3QgcmVndmFsOworCXU2NCByZWd2YWw7CiAJaW50IGlycl9yZWdfbnVtOwogCWludCBpcnJfYml0OwotCXVpbnQ2NF90IGlycl9yZWc7CisJdTY0IGlycl9yZWc7CiAJc3RydWN0IHBjaWRldl9pbmZvICpwY2lkZXZfaW5mbzsKIAlzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvOwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL21jYS5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9tY2EuYwppbmRleCA2NTQ2ZGI2Li45YWI2ODRkIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL21jYS5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvbWNhLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGFzbS9tY2EuaD4KICNpbmNsdWRlIDxhc20vc2FsLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgpAQCAtMjcsNyArMjgsNyBAQAogLyogUHJpbnRpbmcgb2VtZGF0YSBmcm9tIG1jYSB1c2VzIGRhdGEgdGhhdCBpcyBub3QgcGFzc2VkIHRocm91Z2ggU0FMLCBpdCBpcwogICogZ2xvYmFsLiAgT25seSBvbmUgdXNlciBhdCBhIHRpbWUuCiAgKi8KLXN0YXRpYyBERUNMQVJFX01VVEVYKHNuX29lbWRhdGFfbXV0ZXgpOworc3RhdGljIERFRklORV9NVVRFWChzbl9vZW1kYXRhX211dGV4KTsKIHN0YXRpYyB1OCAqKnNuX29lbWRhdGE7CiBzdGF0aWMgdTY0ICpzbl9vZW1kYXRhX3NpemUsIHNuX29lbWRhdGFfYnVmc2l6ZTsKIApAQCAtODksNyArOTAsNyBAQAogc25fcGxhdGZvcm1fcGxhdF9zcGVjaWZpY19lcnJfcHJpbnQoY29uc3QgdTggKiBzZWN0X2hlYWRlciwgdTggKiogb2VtZGF0YSwKIAkJCQkgICAgdTY0ICogb2VtZGF0YV9zaXplKQogewotCWRvd24oJnNuX29lbWRhdGFfbXV0ZXgpOworCW11dGV4X2xvY2soJnNuX29lbWRhdGFfbXV0ZXgpOwogCXNuX29lbWRhdGEgPSBvZW1kYXRhOwogCXNuX29lbWRhdGFfc2l6ZSA9IG9lbWRhdGFfc2l6ZTsKIAlzbl9vZW1kYXRhX2J1ZnNpemUgPSAwOwpAQCAtMTA3LDcgKzEwOCw3IEBACiAJCSpzbl9vZW1kYXRhX3NpemUgPSAwOwogCQlpYTY0X3NuX3BsYXRfc3BlY2lmaWNfZXJyX3ByaW50KHByaW50X2hvb2ssIChjaGFyICopc2VjdF9oZWFkZXIpOwogCX0KLQl1cCgmc25fb2VtZGF0YV9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZzbl9vZW1kYXRhX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC90aW9jeC5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC90aW9jeC5jCmluZGV4IDc2OGMyMWQuLmQyNjNkM2UgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvdGlvY3guYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL3Rpb2N4LmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtNzYsMTIgKzc3LDYgQEAKIAlrZnJlZSh0b19jeF9kZXYoZGV2KSk7CiB9CiAKLXN0cnVjdCBidXNfdHlwZSB0aW9jeF9idXNfdHlwZSA9IHsKLQkubmFtZSA9ICJ0aW9jeCIsCi0JLm1hdGNoID0gdGlvY3hfbWF0Y2gsCi0JLnVldmVudCA9IHRpb2N4X3VldmVudCwKLX07Ci0KIC8qKgogICogY3hfZGV2aWNlX21hdGNoIC0gRmluZCBjeF9kZXZpY2UgaW4gdGhlIGlkIHRhYmxlLgogICogQGlkczogaWQgdGFibGUgZnJvbSBkcml2ZXIKQEAgLTE0OCw2ICsxNDMsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RydWN0IGJ1c190eXBlIHRpb2N4X2J1c190eXBlID0geworCS5uYW1lID0gInRpb2N4IiwKKwkubWF0Y2ggPSB0aW9jeF9tYXRjaCwKKwkudWV2ZW50ID0gdGlvY3hfdWV2ZW50LAorCS5wcm9iZSA9IGN4X2RldmljZV9wcm9iZSwKKwkucmVtb3ZlID0gY3hfZHJpdmVyX3JlbW92ZSwKK307CisKIC8qKgogICogY3hfZHJpdmVyX3JlZ2lzdGVyIC0gUmVnaXN0ZXIgdGhlIGRyaXZlci4KICAqIEBjeF9kcml2ZXI6IGRyaXZlciB0YWJsZSAoY3hfZHJ2IHN0cnVjdCkgZnJvbSBkcml2ZXIKQEAgLTE2MSw4ICsxNjQsNiBAQAogewogCWN4X2RyaXZlci0+ZHJpdmVyLm5hbWUgPSBjeF9kcml2ZXItPm5hbWU7CiAJY3hfZHJpdmVyLT5kcml2ZXIuYnVzID0gJnRpb2N4X2J1c190eXBlOwotCWN4X2RyaXZlci0+ZHJpdmVyLnByb2JlID0gY3hfZGV2aWNlX3Byb2JlOwotCWN4X2RyaXZlci0+ZHJpdmVyLnJlbW92ZSA9IGN4X2RyaXZlcl9yZW1vdmU7CiAKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZjeF9kcml2ZXItPmRyaXZlcik7CiB9CkBAIC0yNDQsNyArMjQ1LDcgQEAKIAkJCQkgIGN4X2Rldi0+YnQpOwogfQogCi1zdGF0aWMgaW5saW5lIHVpbnQ2NF90IHRpb2N4X2ludHJfYWxsb2MobmFzaWRfdCBuYXNpZCwgaW50IHdpZGdldCwKK3N0YXRpYyBpbmxpbmUgdTY0IHRpb2N4X2ludHJfYWxsb2MobmFzaWRfdCBuYXNpZCwgaW50IHdpZGdldCwKIAkJCQkJdTY0IHNuX2lycV9pbmZvLAogCQkJCQlpbnQgcmVxX2lycSwgbmFzaWRfdCByZXFfbmFzaWQsCiAJCQkJCWludCByZXFfc2xpY2UpCkBAIC0zMDEsNyArMzAyLDcgQEAKIAogdm9pZCB0aW9jeF9pcnFfZnJlZShzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX2lycV9pbmZvKQogewotCXVpbnQ2NF90IGJyaWRnZSA9ICh1aW50NjRfdCkgc25faXJxX2luZm8tPmlycV9icmlkZ2U7CisJdTY0IGJyaWRnZSA9ICh1NjQpIHNuX2lycV9pbmZvLT5pcnFfYnJpZGdlOwogCW5hc2lkX3QgbmFzaWQgPSBOQVNJRF9HRVQoYnJpZGdlKTsKIAlpbnQgd2lkZ2V0OwogCkBAIC0zMTIsMTIgKzMxMywxMiBAQAogCX0KIH0KIAotdWludDY0X3QgdGlvY3hfZG1hX2FkZHIodWludDY0X3QgYWRkcikKK3U2NCB0aW9jeF9kbWFfYWRkcih1NjQgYWRkcikKIHsKIAlyZXR1cm4gUEhZU19UT19USU9ETUEoYWRkcik7CiB9CiAKLXVpbnQ2NF90IHRpb2N4X3N3aW5fYmFzZShpbnQgbmFzaWQpCit1NjQgdGlvY3hfc3dpbl9iYXNlKGludCBuYXNpZCkKIHsKIAlyZXR1cm4gVElPX1NXSU5fQkFTRShuYXNpZCwgVElPQ1hfQ09SRUxFVCk7CiB9CkBAIC0zMzQsOCArMzM1LDggQEAKIAogc3RhdGljIHZvaWQgdGlvX2NvbnZleW9yX3NldChuYXNpZF90IG5hc2lkLCBpbnQgZW5hYmxlX2ZsYWcpCiB7Ci0JdWludDY0X3QgaWNlX2ZyejsKLQl1aW50NjRfdCBkaXNhYmxlX2NiID0gKDF1bGwgPDwgNjEpOworCXU2NCBpY2VfZnJ6OworCXU2NCBkaXNhYmxlX2NiID0gKDF1bGwgPDwgNjEpOwogCiAJaWYgKCEobmFzaWQgJiAxKSkKIAkJcmV0dXJuOwpAQCAtMzg3LDcgKzM4OCw3IEBACiAKIHN0YXRpYyBpbnQgYml0c3RyZWFtX2xvYWRlZChuYXNpZF90IG5hc2lkKQogewotCXVpbnQ2NF90IGN4X2NyZWRpdHM7CisJdTY0IGN4X2NyZWRpdHM7CiAKIAljeF9jcmVkaXRzID0gUkVNT1RFX0hVQl9MKG5hc2lkLCBUSU9fSUNFX1BNSV9UWF9EWU5fQ1JFRElUX1NUQVRfQ0IzKTsKIAljeF9jcmVkaXRzICY9IFRJT19JQ0VfUE1JX1RYX0RZTl9DUkVESVRfU1RBVF9DQjNfQ1JFRElUX0NOVF9NQVNLOwpAQCAtNDAzLDE0ICs0MDQsMTQgQEAKIAluYXNpZF90IG5hc2lkID0gY3hfZGV2LT5jeF9pZC5uYXNpZDsKIAogCWlmIChiaXRzdHJlYW1fbG9hZGVkKG5hc2lkKSkgewotCQl1aW50NjRfdCBjeF9pZDsKKwkJdTY0IGN4X2lkOwogCQlpbnQgcnY7CiAKIAkJcnYgPSBpYTY0X3NuX3N5c2N0bF90aW9fY2xvY2tfcmVzZXQobmFzaWQpOwogCQlpZiAocnYpIHsKIAkJCXByaW50ayhLRVJOX0FMRVJUICJDWCBwb3J0IEpUQUcgcmVzZXQgZmFpbGVkLlxuIik7CiAJCX0gZWxzZSB7Ci0JCQljeF9pZCA9ICoodm9sYXRpbGUgdWludDY0X3QgKikKKwkJCWN4X2lkID0gKih2b2xhdGlsZSB1NjQgKikKIAkJCQkoVElPX1NXSU5fQkFTRShuYXNpZCwgVElPQ1hfQ09SRUxFVCkgKwogCQkJCQkgIFdJREdFVF9JRCk7CiAJCQlwYXJ0X251bSA9IFhXSURHRVRfUEFSVF9OVU0oY3hfaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC94cF9tYWluLmMgYi9hcmNoL2lhNjQvc24va2VybmVsL3hwX21haW4uYwppbmRleCAzYmU1MmEzLi5iN2VhNDY2IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3hwX21haW4uYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL3hwX21haW4uYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8YXNtL3NuL2ludHIuaD4KICNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3hwLmg+CkBAIC0xMzYsMTMgKzEzNywxMyBAQAogCiAJcmVnaXN0cmF0aW9uID0gJnhwY19yZWdpc3RyYXRpb25zW2NoX251bWJlcl07CiAKLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZyZWdpc3RyYXRpb24tPnNlbWEpICE9IDApIHsKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZyZWdpc3RyYXRpb24tPm11dGV4KSAhPSAwKSB7CiAJCXJldHVybiB4cGNJbnRlcnJ1cHRlZDsKIAl9CiAKIAkvKiBpZiBYUENfQ0hBTk5FTF9SRUdJU1RFUkVEKGNoX251bWJlcikgKi8KIAlpZiAocmVnaXN0cmF0aW9uLT5mdW5jICE9IE5VTEwpIHsKLQkJdXAoJnJlZ2lzdHJhdGlvbi0+c2VtYSk7CisJCW11dGV4X3VubG9jaygmcmVnaXN0cmF0aW9uLT5tdXRleCk7CiAJCXJldHVybiB4cGNBbHJlYWR5UmVnaXN0ZXJlZDsKIAl9CiAKQEAgLTE1NCw3ICsxNTUsNyBAQAogCXJlZ2lzdHJhdGlvbi0+a2V5ID0ga2V5OwogCXJlZ2lzdHJhdGlvbi0+ZnVuYyA9IGZ1bmM7CiAKLQl1cCgmcmVnaXN0cmF0aW9uLT5zZW1hKTsKKwltdXRleF91bmxvY2soJnJlZ2lzdHJhdGlvbi0+bXV0ZXgpOwogCiAJeHBjX2ludGVyZmFjZS5jb25uZWN0KGNoX251bWJlcik7CiAKQEAgLTE5MCwxMSArMTkxLDExIEBACiAJICogZmlndXJlZCBYUEMncyB1c2VycyB3aWxsIGp1c3QgdHVybiBhcm91bmQgYW5kIGNhbGwgeHBjX2Rpc2Nvbm5lY3QoKQogCSAqIGFnYWluIGFueXdheXMsIHNvIHdlIG1pZ2h0IGFzIHdlbGwgd2FpdCwgaWYgbmVlZCBiZS4KIAkgKi8KLQlkb3duKCZyZWdpc3RyYXRpb24tPnNlbWEpOworCW11dGV4X2xvY2soJnJlZ2lzdHJhdGlvbi0+bXV0ZXgpOwogCiAJLyogaWYgIVhQQ19DSEFOTkVMX1JFR0lTVEVSRUQoY2hfbnVtYmVyKSAqLwogCWlmIChyZWdpc3RyYXRpb24tPmZ1bmMgPT0gTlVMTCkgewotCQl1cCgmcmVnaXN0cmF0aW9uLT5zZW1hKTsKKwkJbXV0ZXhfdW5sb2NrKCZyZWdpc3RyYXRpb24tPm11dGV4KTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjA4LDcgKzIwOSw3IEBACiAKIAl4cGNfaW50ZXJmYWNlLmRpc2Nvbm5lY3QoY2hfbnVtYmVyKTsKIAotCXVwKCZyZWdpc3RyYXRpb24tPnNlbWEpOworCW11dGV4X3VubG9jaygmcmVnaXN0cmF0aW9uLT5tdXRleCk7CiAKIAlyZXR1cm47CiB9CkBAIC0yNTAsOSArMjUxLDkgQEAKIAkJeHBfbm9mYXVsdF9QSU9SX3RhcmdldCA9IFNIMV9JUElfQUNDRVNTOwogCX0KIAotCS8qIGluaXRpYWxpemUgdGhlIGNvbm5lY3Rpb24gcmVnaXN0cmF0aW9uIHNlbWFwaG9yZXMgKi8KKwkvKiBpbml0aWFsaXplIHRoZSBjb25uZWN0aW9uIHJlZ2lzdHJhdGlvbiBtdXRleCAqLwogCWZvciAoY2hfbnVtYmVyID0gMDsgY2hfbnVtYmVyIDwgWFBDX05DSEFOTkVMUzsgY2hfbnVtYmVyKyspIHsKLQkJc2VtYV9pbml0KCZ4cGNfcmVnaXN0cmF0aW9uc1tjaF9udW1iZXJdLnNlbWEsIDEpOyAgLyogbXV0ZXggKi8KKwkJbXV0ZXhfaW5pdCgmeHBjX3JlZ2lzdHJhdGlvbnNbY2hfbnVtYmVyXS5tdXRleCk7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3hwYy5oIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ4M2E5Zi4uMDAwMDAwMAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3hwYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3MyArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqLwotCi0KLS8qCi0gKiBDcm9zcyBQYXJ0aXRpb24gQ29tbXVuaWNhdGlvbiAoWFBDKSBzdHJ1Y3R1cmVzIGFuZCBtYWNyb3MuCi0gKi8KLQotI2lmbmRlZiBfSUE2NF9TTl9LRVJORUxfWFBDX0gKLSNkZWZpbmUgX0lBNjRfU05fS0VSTkVMX1hQQ19ICi0KLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9zbi9idGUuaD4KLSNpbmNsdWRlIDxhc20vc24vY2xrc3VwcG9ydC5oPgotI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgotI2luY2x1ZGUgPGFzbS9zbi9tc3BlYy5oPgotI2luY2x1ZGUgPGFzbS9zbi9zaHViX21tci5oPgotI2luY2x1ZGUgPGFzbS9zbi94cC5oPgotCi0KLS8qCi0gKiBYUEMgVmVyc2lvbiBudW1iZXJzIGNvbnNpc3Qgb2YgYSBtYWpvciBhbmQgbWlub3IgbnVtYmVyLiBYUEMgY2FuIGFsd2F5cwotICogdGFsayB0byB2ZXJzaW9ucyB3aXRoIHNhbWUgbWFqb3IgIywgYW5kIG5ldmVyIHRhbGsgdG8gdmVyc2lvbnMgd2l0aCBhCi0gKiBkaWZmZXJlbnQgbWFqb3IgIy4KLSAqLwotI2RlZmluZSBfWFBDX1ZFUlNJT04oX21haiwgX21pbikJKCgoX21haikgPDwgNCkgfCAoKF9taW4pICYgMHhmKSkKLSNkZWZpbmUgWFBDX1ZFUlNJT05fTUFKT1IoX3YpCQkoKF92KSA+PiA0KQotI2RlZmluZSBYUENfVkVSU0lPTl9NSU5PUihfdikJCSgoX3YpICYgMHhmKQotCi0KLS8qCi0gKiBUaGUgbmV4dCBtYWNyb3MgZGVmaW5lIHdvcmQgb3IgYml0IHJlcHJlc2VudGF0aW9ucyBmb3IgZ2l2ZW4KLSAqIEMtYnJpY2sgbmFzaWQgaW4gZWl0aGVyIHRoZSBTQUwgcHJvdmlkZWQgYml0IGFycmF5IHJlcHJlc2VudGluZwotICogbmFzaWRzIGluIHRoZSBwYXJ0aXRpb24vbWFjaGluZSBvciB0aGUgQU1PX3QgYXJyYXkgdXNlZCBmb3IKLSAqIGludGVyLXBhcnRpdGlvbiBpbml0aWF0aW9uIGNvbW11bmljYXRpb25zLgotICoKLSAqIEZvciBTTjIgbWFjaGluZXMsIEMtQnJpY2tzIGFyZSBhbHdheSBldmVuIG51bWJlcmVkIE5BU0lEcy4gIEFzCi0gKiBzdWNoLCBzb21lIHNwYWNlIHdpbGwgYmUgc2F2ZWQgYnkgaW5zaXN0aW5nIHRoYXQgbmFzaWQgaW5mb3JtYXRpb24KLSAqIHBhc3NlZCBmcm9tIFNBTCBhbHdheXMgYmUgcGFja2VkIGZvciBDLUJyaWNrcyBhbmQgdGhlCi0gKiBjcm9zcy1wYXJ0aXRpb24gaW50ZXJydXB0cyB1c2UgdGhlIHNhbWUgcGFja2luZyBzY2hlbWUuCi0gKi8KLSNkZWZpbmUgWFBDX05BU0lEX1dfSU5ERVgoX24pCSgoKF9uKSAvIDY0KSAvIDIpCi0jZGVmaW5lIFhQQ19OQVNJRF9CX0lOREVYKF9uKQkoKChfbikgLyAyKSAmICg2NCAtIDEpKQotI2RlZmluZSBYUENfTkFTSURfSU5fQVJSQVkoX24sIF9wKSAoKF9wKVtYUENfTkFTSURfV19JTkRFWChfbildICYgXAotCQkJCSAgICAoMVVMIDw8IFhQQ19OQVNJRF9CX0lOREVYKF9uKSkpCi0jZGVmaW5lIFhQQ19OQVNJRF9GUk9NX1dfQihfdywgX2IpICgoKF93KSAqIDY0ICsgKF9iKSkgKiAyKQotCi0jZGVmaW5lIFhQQ19IQl9ERUZBVUxUX0lOVEVSVkFMCQk1CS8qIGluY3IgSEIgZXZlcnkgeCBzZWNzICovCi0jZGVmaW5lIFhQQ19IQl9DSEVDS19ERUZBVUxUX0lOVEVSVkFMCTIwCS8qIGNoZWNrIEhCIGV2ZXJ5IHggc2VjcyAqLwotCi0vKiBkZWZpbmUgdGhlIHByb2Nlc3MgbmFtZSBvZiBIQiBjaGVja2VyIGFuZCB0aGUgQ1BVIGl0IGlzIHBpbm5lZCB0byAqLwotI2RlZmluZSBYUENfSEJfQ0hFQ0tfVEhSRUFEX05BTUUJInhwY19oYiIKLSNkZWZpbmUgWFBDX0hCX0NIRUNLX0NQVQkJMAotCi0vKiBkZWZpbmUgdGhlIHByb2Nlc3MgbmFtZSBvZiB0aGUgZGlzY292ZXJ5IHRocmVhZCAqLwotI2RlZmluZSBYUENfRElTQ09WRVJZX1RIUkVBRF9OQU1FCSJ4cGNfZGlzY292ZXJ5IgotCi0KLS8qCi0gKiB0aGUgcmVzZXJ2ZWQgcGFnZQotICoKLSAqICAgU0FMIHJlc2VydmVzIG9uZSBwYWdlIG9mIG1lbW9yeSBwZXIgcGFydGl0aW9uIGZvciBYUEMuIFRob3VnaCBhIGZ1bGwgcGFnZQotICogICBpbiBsZW5ndGggKDE2Mzg0IGJ5dGVzKSwgaXRzIHN0YXJ0aW5nIGFkZHJlc3MgaXMgbm90IHBhZ2UgYWxpZ25lZCwgYnV0IGl0Ci0gKiAgIGlzIGNhY2hlbGluZSBhbGlnbmVkLiBUaGUgcmVzZXJ2ZWQgcGFnZSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nOgotICoKLSAqICAgcmVzZXJ2ZWQgcGFnZSBoZWFkZXIKLSAqCi0gKiAgICAgVGhlIGZpcnN0IGNhY2hlbGluZSBvZiB0aGUgcmVzZXJ2ZWQgcGFnZSBjb250YWlucyB0aGUgaGVhZGVyCi0gKiAgICAgKHN0cnVjdCB4cGNfcnN2ZF9wYWdlKS4gQmVmb3JlIFNBTCBpbml0aWFsaXphdGlvbiBoYXMgY29tcGxldGVkLAotICogICAgIFNBTCBoYXMgc2V0IHVwIHRoZSBmb2xsb3dpbmcgZmllbGRzIG9mIHRoZSByZXNlcnZlZCBwYWdlIGhlYWRlcjoKLSAqICAgICBTQUxfc2lnbmF0dXJlLCBTQUxfdmVyc2lvbiwgcGFydGlkLCBhbmQgbmFzaWRzX3NpemUuIFRoZSBvdGhlcgotICogICAgIGZpZWxkcyBhcmUgc2V0IHVwIGJ5IFhQQy4gKHhwY19yc3ZkX3BhZ2UgcG9pbnRzIHRvIHRoZSBsb2NhbAotICogICAgIHBhcnRpdGlvbidzIHJlc2VydmVkIHBhZ2UuKQotICoKLSAqICAgcGFydF9uYXNpZHMgbWFzawotICogICBtYWNoX25hc2lkcyBtYXNrCi0gKgotICogICAgIFNBTCBhbHNvIHNldHMgdXAgdHdvIGJpdG1hcHMgKG9yIG1hc2tzKSwgb25lIHRoYXQgcmVmbGVjdHMgdGhlIGFjdHVhbAotICogICAgIG5hc2lkcyBpbiB0aGlzIHBhcnRpdGlvbiAocGFydF9uYXNpZHMpLCBhbmQgdGhlIG90aGVyIHRoYXQgcmVmbGVjdHMKLSAqICAgICB0aGUgYWN0dWFsIG5hc2lkcyBpbiB0aGUgZW50aXJlIG1hY2hpbmUgKG1hY2hfbmFzaWRzKS4gV2UncmUgb25seQotICogICAgIGludGVyZXN0ZWQgaW4gdGhlIGV2ZW4gbnVtYmVyZWQgbmFzaWRzICh3aGljaCBjb250YWluIHRoZSBwcm9jZXNzb3JzCi0gKiAgICAgYW5kL29yIG1lbW9yeSksIHNvIHdlIG9ubHkgbmVlZCBoYWxmIGFzIG1hbnkgYml0cyB0byByZXByZXNlbnQgdGhlCi0gKiAgICAgbmFzaWRzLiBUaGUgcGFydF9uYXNpZHMgbWFzayBpcyBsb2NhdGVkIHN0YXJ0aW5nIGF0IHRoZSBmaXJzdCBjYWNoZWxpbmUKLSAqICAgICBmb2xsb3dpbmcgdGhlIHJlc2VydmVkIHBhZ2UgaGVhZGVyLiBUaGUgbWFjaF9uYXNpZHMgbWFzayBmb2xsb3dzIHJpZ2h0Ci0gKiAgICAgYWZ0ZXIgdGhlIHBhcnRfbmFzaWRzIG1hc2suIFRoZSBzaXplIGluIGJ5dGVzIG9mIGVhY2ggbWFzayBpcyByZWZsZWN0ZWQKLSAqICAgICBieSB0aGUgcmVzZXJ2ZWQgcGFnZSBoZWFkZXIgZmllbGQgJ25hc2lkc19zaXplJy4gKExvY2FsIHBhcnRpdGlvbidzCi0gKiAgICAgbWFzayBwb2ludGVycyBhcmUgeHBjX3BhcnRfbmFzaWRzIGFuZCB4cGNfbWFjaF9uYXNpZHMuKQotICoKLSAqICAgdmFycwotICogICB2YXJzIHBhcnQKLSAqCi0gKiAgICAgSW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBtYWNoX25hc2lkcyBtYXNrIGFyZSB0aGUgWFBDIHZhcmlhYmxlcwotICogICAgIHJlcXVpcmVkIGJ5IG90aGVyIHBhcnRpdGlvbnMuIEZpcnN0IGFyZSB0aG9zZSB0aGF0IGFyZSBnZW5lcmljIHRvIGFsbAotICogICAgIHBhcnRpdGlvbnMgKHZhcnMpLCBmb2xsb3dlZCBvbiB0aGUgbmV4dCBhdmFpbGFibGUgY2FjaGVsaW5lIGJ5IHRob3NlCi0gKiAgICAgd2hpY2ggYXJlIHBhcnRpdGlvbiBzcGVjaWZpYyAodmFycyBwYXJ0KS4gVGhlc2UgYXJlIHNldHVwIGJ5IFhQQy4KLSAqICAgICAoTG9jYWwgcGFydGl0aW9uJ3MgdmFycyBwb2ludGVycyBhcmUgeHBjX3ZhcnMgYW5kIHhwY192YXJzX3BhcnQuKQotICoKLSAqIE5vdGU6IFVudGlsIHZhcnNfcGEgaXMgc2V0LCB0aGUgcGFydGl0aW9uIFhQQyBjb2RlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4KLSAqLwotc3RydWN0IHhwY19yc3ZkX3BhZ2UgewotCXU2NCBTQUxfc2lnbmF0dXJlOwkvKiBTQUw6IHVuaXF1ZSBzaWduYXR1cmUgKi8KLQl1NjQgU0FMX3ZlcnNpb247CS8qIFNBTDogdmVyc2lvbiAqLwotCXU4IHBhcnRpZDsJCS8qIFNBTDogcGFydGl0aW9uIElEICovCi0JdTggdmVyc2lvbjsKLQl1OCBwYWQxWzZdOwkJLyogYWxpZ24gdG8gbmV4dCB1NjQgaW4gY2FjaGVsaW5lICovCi0Jdm9sYXRpbGUgdTY0IHZhcnNfcGE7Ci0Jc3RydWN0IHRpbWVzcGVjIHN0YW1wOwkvKiB0aW1lIHdoZW4gcmVzZXJ2ZWQgcGFnZSB3YXMgc2V0dXAgYnkgWFBDICovCi0JdTY0IHBhZDJbOV07CQkvKiBhbGlnbiB0byBsYXN0IHU2NCBpbiBjYWNoZWxpbmUgKi8KLQl1NjQgbmFzaWRzX3NpemU7CS8qIFNBTDogc2l6ZSBvZiBlYWNoIG5hc2lkIG1hc2sgaW4gYnl0ZXMgKi8KLX07Ci0KLSNkZWZpbmUgWFBDX1JQX1ZFUlNJT04gX1hQQ19WRVJTSU9OKDEsMSkgLyogdmVyc2lvbiAxLjEgb2YgdGhlIHJlc2VydmVkIHBhZ2UgKi8KLQotI2RlZmluZSBYUENfU1VQUE9SVFNfUlBfU1RBTVAoX3ZlcnNpb24pIFwKLQkJCShfdmVyc2lvbiA+PSBfWFBDX1ZFUlNJT04oMSwxKSkKLQotLyoKLSAqIGNvbXBhcmUgc3RhbXBzIC0gdGhlIHJldHVybiB2YWx1ZSBpczoKLSAqCi0gKgk8IDAsCWlmIHN0YW1wMSA8IHN0YW1wMgotICoJPSAwLAlpZiBzdGFtcDEgPT0gc3RhbXAyCi0gKgk+IDAsCWlmIHN0YW1wMSA+IHN0YW1wMgotICovCi1zdGF0aWMgaW5saW5lIGludAoteHBjX2NvbXBhcmVfc3RhbXBzKHN0cnVjdCB0aW1lc3BlYyAqc3RhbXAxLCBzdHJ1Y3QgdGltZXNwZWMgKnN0YW1wMikKLXsKLQlpbnQgcmV0OwotCi0KLQlpZiAoKHJldCA9IHN0YW1wMS0+dHZfc2VjIC0gc3RhbXAyLT50dl9zZWMpID09IDApIHsKLQkJcmV0ID0gc3RhbXAxLT50dl9uc2VjIC0gc3RhbXAyLT50dl9uc2VjOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0KLS8qCi0gKiBEZWZpbmUgdGhlIHN0cnVjdHVyZXMgYnkgd2hpY2ggWFBDIHZhcmlhYmxlcyBjYW4gYmUgZXhwb3J0ZWQgdG8gb3RoZXIKLSAqIHBhcnRpdGlvbnMuIChUaGVyZSBhcmUgdHdvOiBzdHJ1Y3QgeHBjX3ZhcnMgYW5kIHN0cnVjdCB4cGNfdmFyc19wYXJ0KQotICovCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIHBhcnRpdGlvbiBnZW5lcmljIHZhcmlhYmxlcwotICogbmVlZGVkIGJ5IG90aGVyIHBhcnRpdGlvbnMgaW4gb3JkZXIgdG8gcHJvcGVybHkgaW5pdGlhbGl6ZS4KLSAqCi0gKiBzdHJ1Y3QgeHBjX3ZhcnMgdmVyc2lvbiBudW1iZXIgYWxzbyBhcHBsaWVzIHRvIHN0cnVjdCB4cGNfdmFyc19wYXJ0LgotICogQ2hhbmdlcyB0byBlaXRoZXIgc3RydWN0dXJlIGFuZC9vciByZWxhdGVkIGZ1bmN0aW9uYWxpdHkgc2hvdWxkIGJlCi0gKiByZWZsZWN0ZWQgYnkgaW5jcmVtZW50aW5nIGVpdGhlciB0aGUgbWFqb3Igb3IgbWlub3IgdmVyc2lvbiBudW1iZXJzCi0gKiBvZiBzdHJ1Y3QgeHBjX3ZhcnMuCi0gKi8KLXN0cnVjdCB4cGNfdmFycyB7Ci0JdTggdmVyc2lvbjsKLQl1NjQgaGVhcnRiZWF0OwotCXU2NCBoZWFydGJlYXRpbmdfdG9fbWFzazsKLQl1NjQgaGVhcnRiZWF0X29mZmxpbmU7CS8qIGlmIDAsIGhlYXJ0YmVhdCBzaG91bGQgYmUgY2hhbmdpbmcgKi8KLQlpbnQgYWN0X25hc2lkOwotCWludCBhY3RfcGh5c19jcHVpZDsKLQl1NjQgdmFyc19wYXJ0X3BhOwotCXU2NCBhbW9zX3BhZ2VfcGE7CS8qIHBhZGRyIG9mIHBhZ2Ugb2YgQU1PcyBmcm9tIE1TUEVDIGRyaXZlciAqLwotCUFNT190ICphbW9zX3BhZ2U7CS8qIHZhZGRyIG9mIHBhZ2Ugb2YgQU1PcyBmcm9tIE1TUEVDIGRyaXZlciAqLwotfTsKLQotI2RlZmluZSBYUENfVl9WRVJTSU9OIF9YUENfVkVSU0lPTigzLDEpIC8qIHZlcnNpb24gMy4xIG9mIHRoZSBjcm9zcyB2YXJzICovCi0KLSNkZWZpbmUgWFBDX1NVUFBPUlRTX0RJU0VOR0FHRV9SRVFVRVNUKF92ZXJzaW9uKSBcCi0JCQkoX3ZlcnNpb24gPj0gX1hQQ19WRVJTSU9OKDMsMSkpCi0KLQotc3RhdGljIGlubGluZSBpbnQKLXhwY19oYl9hbGxvd2VkKHBhcnRpZF90IHBhcnRpZCwgc3RydWN0IHhwY192YXJzICp2YXJzKQotewotCXJldHVybiAoKHZhcnMtPmhlYXJ0YmVhdGluZ190b19tYXNrICYgKDFVTCA8PCBwYXJ0aWQpKSAhPSAwKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi14cGNfYWxsb3dfaGIocGFydGlkX3QgcGFydGlkLCBzdHJ1Y3QgeHBjX3ZhcnMgKnZhcnMpCi17Ci0JdTY0IG9sZF9tYXNrLCBuZXdfbWFzazsKLQotCWRvIHsKLQkJb2xkX21hc2sgPSB2YXJzLT5oZWFydGJlYXRpbmdfdG9fbWFzazsKLQkJbmV3X21hc2sgPSAob2xkX21hc2sgfCAoMVVMIDw8IHBhcnRpZCkpOwotCX0gd2hpbGUgKGNtcHhjaGcoJnZhcnMtPmhlYXJ0YmVhdGluZ190b19tYXNrLCBvbGRfbWFzaywgbmV3X21hc2spICE9Ci0JCQkJCQkJb2xkX21hc2spOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXhwY19kaXNhbGxvd19oYihwYXJ0aWRfdCBwYXJ0aWQsIHN0cnVjdCB4cGNfdmFycyAqdmFycykKLXsKLQl1NjQgb2xkX21hc2ssIG5ld19tYXNrOwotCi0JZG8gewotCQlvbGRfbWFzayA9IHZhcnMtPmhlYXJ0YmVhdGluZ190b19tYXNrOwotCQluZXdfbWFzayA9IChvbGRfbWFzayAmIH4oMVVMIDw8IHBhcnRpZCkpOwotCX0gd2hpbGUgKGNtcHhjaGcoJnZhcnMtPmhlYXJ0YmVhdGluZ190b19tYXNrLCBvbGRfbWFzaywgbmV3X21hc2spICE9Ci0JCQkJCQkJb2xkX21hc2spOwotfQotCi0KLS8qCi0gKiBUaGUgQU1PcyBwYWdlIGNvbnNpc3RzIG9mIGEgbnVtYmVyIG9mIEFNTyB2YXJpYWJsZXMgd2hpY2ggYXJlIGRpdmlkZWQgaW50bwotICogZm91ciBncm91cHMsIFRoZSBmaXJzdCB0d28gZ3JvdXBzIGFyZSB1c2VkIHRvIGlkZW50aWZ5IGFuIElSUSdzIHNlbmRlci4KLSAqIFRoZXNlIHR3byBncm91cHMgY29uc2lzdCBvZiA2NCBhbmQgMTI4IEFNTyB2YXJpYWJsZXMgcmVzcGVjdGl2ZWx5LiBUaGUgbGFzdAotICogdHdvIGdyb3VwcywgY29uc2lzdGluZyBvZiBqdXN0IG9uZSBBTU8gdmFyaWFibGUgZWFjaCwgYXJlIHVzZWQgdG8gaWRlbnRpZnkKLSAqIHRoZSByZW1vdGUgcGFydGl0aW9ucyB0aGF0IGFyZSBjdXJyZW50bHkgZW5nYWdlZCAoZnJvbSB0aGUgdmlld3BvaW50IG9mCi0gKiB0aGUgWFBDIHJ1bm5pbmcgb24gdGhlIHJlbW90ZSBwYXJ0aXRpb24pLgotICovCi0jZGVmaW5lIFhQQ19OT1RJRllfSVJRX0FNT1MJICAgMAotI2RlZmluZSBYUENfQUNUSVZBVEVfSVJRX0FNT1MJICAgKFhQQ19OT1RJRllfSVJRX0FNT1MgKyBYUF9NQVhfUEFSVElUSU9OUykKLSNkZWZpbmUgWFBDX0VOR0FHRURfUEFSVElUSU9OU19BTU8gKFhQQ19BQ1RJVkFURV9JUlFfQU1PUyArIFhQX05BU0lEX01BU0tfV09SRFMpCi0jZGVmaW5lIFhQQ19ESVNFTkdBR0VfUkVRVUVTVF9BTU8gIChYUENfRU5HQUdFRF9QQVJUSVRJT05TX0FNTyArIDEpCi0KLQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgcGVyIHBhcnRpdGlvbiBzcGVjaWZpYyB2YXJpYWJsZXMuCi0gKgotICogQW4gYXJyYXkgb2YgdGhlc2Ugc3RydWN0dXJlcywgb25lIHBlciBwYXJ0aXRpb24sIHdpbGwgYmUgZGVmaW5lZC4gQXMgYQotICogcGFydGl0aW9uIGJlY29tZXMgYWN0aXZlIFhQQyB3aWxsIGNvcHkgdGhlIGFycmF5IGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8KLSAqIGl0c2VsZiBmcm9tIHRoYXQgcGFydGl0aW9uLiBJdCBpcyBkZXNpcmFibGUgdGhhdCB0aGUgc2l6ZSBvZiB0aGlzCi0gKiBzdHJ1Y3R1cmUgZXZlbmx5IGRpdmlkZSBpbnRvIGEgY2FjaGVsaW5lLCBzdWNoIHRoYXQgbm9uZSBvZiB0aGUgZW50cmllcwotICogaW4gdGhpcyBhcnJheSBjcm9zc2VzIGEgY2FjaGVsaW5lIGJvdW5kYXJ5LiBBcyBpdCBpcyBub3csIGVhY2ggZW50cnkKLSAqIG9jY3VwaWVzIGhhbGYgYSBjYWNoZWxpbmUuCi0gKi8KLXN0cnVjdCB4cGNfdmFyc19wYXJ0IHsKLQl2b2xhdGlsZSB1NjQgbWFnaWM7Ci0KLQl1NjQgb3BlbmNsb3NlX2FyZ3NfcGE7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2Ygb3BlbiBhbmQgY2xvc2UgYXJncyAqLwotCXU2NCBHUHNfcGE7CQkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIEdldC9QdXQgdmFsdWVzICovCi0KLQl1NjQgSVBJX2Ftb19wYTsJCS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgSVBJIEFNT190IHN0cnVjdHVyZSAqLwotCWludCBJUElfbmFzaWQ7CQkvKiBuYXNpZCBvZiB3aGVyZSB0byBzZW5kIElQSXMgKi8KLQlpbnQgSVBJX3BoeXNfY3B1aWQ7CS8qIHBoeXNpY2FsIENQVSBJRCBvZiB3aGVyZSB0byBzZW5kIElQSXMgKi8KLQotCXU4IG5jaGFubmVsczsJCS8qICNvZiBkZWZpbmVkIGNoYW5uZWxzIHN1cHBvcnRlZCAqLwotCi0JdTggcmVzZXJ2ZWRbMjNdOwkvKiBwYWQgdG8gYSBmdWxsIDY0IGJ5dGVzICovCi19OwotCi0vKgotICogVGhlIHZhcnNfcGFydCBNQUdJQyBudW1iZXJzIHBsYXkgYSBwYXJ0IGluIHRoZSBmaXJzdCBjb250YWN0IHByb3RvY29sLgotICoKLSAqIE1BR0lDMSBpbmRpY2F0ZXMgdGhhdCB0aGUgcGVyIHBhcnRpdGlvbiBzcGVjaWZpYyB2YXJpYWJsZXMgZm9yIGEgcmVtb3RlCi0gKiBwYXJ0aXRpb24gaGF2ZSBiZWVuIGluaXRpYWxpemVkIGJ5IHRoaXMgcGFydGl0aW9uLgotICoKLSAqIE1BR0lDMiBpbmRpY2F0ZXMgdGhhdCB0aGlzIHBhcnRpdGlvbiBoYXMgcHVsbGVkIHRoZSByZW1vdGUgcGFydGl0aXRpb25zCi0gKiBwZXIgcGFydGl0aW9uIHZhcmlhYmxlcyB0aGF0IHBlcnRhaW4gdG8gdGhpcyBwYXJ0aXRpb24uCi0gKi8KLSNkZWZpbmUgWFBDX1ZQX01BR0lDMQkweDAwNTM1MjQxNTY0MzUwNThMICAvKiAnWFBDVkFSU1wwJ0wgKGxpdHRsZSBlbmRpYW4pICovCi0jZGVmaW5lIFhQQ19WUF9NQUdJQzIJMHgwMDczNzI2MTc2NDM1MDU4TCAgLyogJ1hQQ3ZhcnNcMCdMIChsaXR0bGUgZW5kaWFuKSAqLwotCi0KLS8qIHRoZSByZXNlcnZlZCBwYWdlIHNpemVzIGFuZCBvZmZzZXRzICovCi0KLSNkZWZpbmUgWFBDX1JQX0hFQURFUl9TSVpFCUwxX0NBQ0hFX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHBjX3JzdmRfcGFnZSkpCi0jZGVmaW5lIFhQQ19SUF9WQVJTX1NJWkUgCUwxX0NBQ0hFX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHBjX3ZhcnMpKQotCi0jZGVmaW5lIFhQQ19SUF9QQVJUX05BU0lEUyhfcnApICh1NjQgKikgKCh1OCAqKSBfcnAgKyBYUENfUlBfSEVBREVSX1NJWkUpCi0jZGVmaW5lIFhQQ19SUF9NQUNIX05BU0lEUyhfcnApIChYUENfUlBfUEFSVF9OQVNJRFMoX3JwKSArIHhwX25hc2lkX21hc2tfd29yZHMpCi0jZGVmaW5lIFhQQ19SUF9WQVJTKF9ycCkJKChzdHJ1Y3QgeHBjX3ZhcnMgKikgWFBDX1JQX01BQ0hfTkFTSURTKF9ycCkgKyB4cF9uYXNpZF9tYXNrX3dvcmRzKQotI2RlZmluZSBYUENfUlBfVkFSU19QQVJUKF9ycCkJKHN0cnVjdCB4cGNfdmFyc19wYXJ0ICopICgodTggKikgWFBDX1JQX1ZBUlMocnApICsgWFBDX1JQX1ZBUlNfU0laRSkKLQotCi0vKgotICogRnVuY3Rpb25zIHJlZ2lzdGVyZWQgYnkgYWRkX3RpbWVyKCkgb3IgY2FsbGVkIGJ5IGtlcm5lbF90aHJlYWQoKSBvbmx5Ci0gKiBhbGxvdyBmb3IgYSBzaW5nbGUgNjQtYml0IGFyZ3VtZW50LiBUaGUgZm9sbG93aW5nIG1hY3JvcyBjYW4gYmUgdXNlZCB0bwotICogcGFjayBhbmQgdW5wYWNrIHR3byAoMzItYml0LCAxNi1iaXQgb3IgOC1iaXQpIGFyZ3VtZW50cyBpbnRvIG9yIG91dCBmcm9tCi0gKiB0aGUgcGFzc2VkIGFyZ3VtZW50LgotICovCi0jZGVmaW5lIFhQQ19QQUNLX0FSR1MoX2FyZzEsIF9hcmcyKSBcCi0JCQkoKCgodTY0KSBfYXJnMSkgJiAweGZmZmZmZmZmKSB8IFwKLQkJCSgoKCh1NjQpIF9hcmcyKSAmIDB4ZmZmZmZmZmYpIDw8IDMyKSkKLQotI2RlZmluZSBYUENfVU5QQUNLX0FSRzEoX2FyZ3MpCSgoKHU2NCkgX2FyZ3MpICYgMHhmZmZmZmZmZikKLSNkZWZpbmUgWFBDX1VOUEFDS19BUkcyKF9hcmdzKQkoKCgodTY0KSBfYXJncykgPj4gMzIpICYgMHhmZmZmZmZmZikKLQotCi0KLS8qCi0gKiBEZWZpbmUgYSBHZXQvUHV0IHZhbHVlIHBhaXIgKHBvaW50ZXJzKSB1c2VkIHdpdGggYSBtZXNzYWdlIHF1ZXVlLgotICovCi1zdHJ1Y3QgeHBjX2dwIHsKLQl2b2xhdGlsZSBzNjQgZ2V0OwkvKiBHZXQgdmFsdWUgKi8KLQl2b2xhdGlsZSBzNjQgcHV0OwkvKiBQdXQgdmFsdWUgKi8KLX07Ci0KLSNkZWZpbmUgWFBDX0dQX1NJWkUgXAotCQlMMV9DQUNIRV9BTElHTihzaXplb2Yoc3RydWN0IHhwY19ncCkgKiBYUENfTkNIQU5ORUxTKQotCi0KLQotLyoKLSAqIERlZmluZSBhIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIGFyZ3VtZW50cyBhc3NvY2lhdGVkIHdpdGggb3BlbmluZyBhbmQKLSAqIGNsb3NpbmcgYSBjaGFubmVsLgotICovCi1zdHJ1Y3QgeHBjX29wZW5jbG9zZV9hcmdzIHsKLQl1MTYgcmVhc29uOwkJLyogcmVhc29uIHdoeSBjaGFubmVsIGlzIGNsb3NpbmcgKi8KLQl1MTYgbXNnX3NpemU7CQkvKiBzaXplb2YgZWFjaCBtZXNzYWdlIGVudHJ5ICovCi0JdTE2IHJlbW90ZV9uZW50cmllczsJLyogI29mIG1lc3NhZ2UgZW50cmllcyBpbiByZW1vdGUgbXNnIHF1ZXVlICovCi0JdTE2IGxvY2FsX25lbnRyaWVzOwkvKiAjb2YgbWVzc2FnZSBlbnRyaWVzIGluIGxvY2FsIG1zZyBxdWV1ZSAqLwotCXU2NCBsb2NhbF9tc2dxdWV1ZV9wYTsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBsb2NhbCBtZXNzYWdlIHF1ZXVlICovCi19OwotCi0jZGVmaW5lIFhQQ19PUEVOQ0xPU0VfQVJHU19TSVpFIFwKLQkgICAgICBMMV9DQUNIRV9BTElHTihzaXplb2Yoc3RydWN0IHhwY19vcGVuY2xvc2VfYXJncykgKiBYUENfTkNIQU5ORUxTKQotCi0KLQotLyogc3RydWN0IHhwY19tc2cgZmxhZ3MgKi8KLQotI2RlZmluZQlYUENfTV9ET05FCQkweDAxCS8qIG1zZyBoYXMgYmVlbiByZWNlaXZlZC9jb25zdW1lZCAqLwotI2RlZmluZQlYUENfTV9SRUFEWQkJMHgwMgkvKiBtc2cgaXMgcmVhZHkgdG8gYmUgc2VudCAqLwotI2RlZmluZQlYUENfTV9JTlRFUlJVUFQJCTB4MDQJLyogc2VuZCBpbnRlcnJ1cHQgd2hlbiBtc2cgY29uc3VtZWQgKi8KLQotCi0jZGVmaW5lIFhQQ19NU0dfQUREUkVTUyhfcGF5bG9hZCkgXAotCQkoKHN0cnVjdCB4cGNfbXNnICopKCh1OCAqKShfcGF5bG9hZCkgLSBYUENfTVNHX1BBWUxPQURfT0ZGU0VUKSkKLQotCi0KLS8qCi0gKiBEZWZpbmVzIG5vdGlmeSBlbnRyeS4KLSAqCi0gKiBUaGlzIGlzIHVzZWQgdG8gbm90aWZ5IGEgbWVzc2FnZSdzIHNlbmRlciB0aGF0IHRoZWlyIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkCi0gKiBhbmQgY29uc3VtZWQgYnkgdGhlIGludGVuZGVkIHJlY2lwaWVudC4KLSAqLwotc3RydWN0IHhwY19ub3RpZnkgewotCXN0cnVjdCBzZW1hcGhvcmUgc2VtYTsJCS8qIG5vdGlmeSBzZW1hcGhvcmUgKi8KLQl2b2xhdGlsZSB1OCB0eXBlOwkJCS8qIHR5cGUgb2Ygbm90aWZpY2F0aW9uICovCi0KLQkvKiB0aGUgZm9sbG93aW5nIHR3byBmaWVsZHMgYXJlIG9ubHkgdXNlZCBpZiB0eXBlID09IFhQQ19OX0NBTEwgKi8KLQl4cGNfbm90aWZ5X2Z1bmMgZnVuYzsJCS8qIHVzZXIncyBub3RpZnkgZnVuY3Rpb24gKi8KLQl2b2lkICprZXk7CQkJLyogcG9pbnRlciB0byB1c2VyJ3Mga2V5ICovCi19OwotCi0vKiBzdHJ1Y3QgeHBjX25vdGlmeSB0eXBlIG9mIG5vdGlmaWNhdGlvbiAqLwotCi0jZGVmaW5lCVhQQ19OX0NBTEwJCTB4MDEJLyogbm90aWZ5IGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLQotCi0KLS8qCi0gKiBEZWZpbmUgdGhlIHN0cnVjdHVyZSB0aGF0IG1hbmFnZXMgYWxsIHRoZSBzdHVmZiByZXF1aXJlZCBieSBhIGNoYW5uZWwuIEluCi0gKiBwYXJ0aWN1bGFyLCB0aGV5IGFyZSB1c2VkIHRvIG1hbmFnZSB0aGUgbWVzc2FnZXMgc2VudCBhY3Jvc3MgdGhlIGNoYW5uZWwuCi0gKgotICogVGhpcyBzdHJ1Y3R1cmUgaXMgcHJpdmF0ZSB0byBhIHBhcnRpdGlvbiwgYW5kIGlzIE5PVCBzaGFyZWQgYWNyb3NzIHRoZQotICogcGFydGl0aW9uIGJvdW5kYXJ5LgotICoKLSAqIFRoZXJlIGlzIGFuIGFycmF5IG9mIHRoZXNlIHN0cnVjdHVyZXMgZm9yIGVhY2ggcmVtb3RlIHBhcnRpdGlvbi4gSXQgaXMKLSAqIGFsbG9jYXRlZCBhdCB0aGUgdGltZSBhIHBhcnRpdGlvbiBiZWNvbWVzIGFjdGl2ZS4gVGhlIGFycmF5IGNvbnRhaW5zIG9uZQotICogb2YgdGhlc2Ugc3RydWN0dXJlcyBmb3IgZWFjaCBwb3RlbnRpYWwgY2hhbm5lbCBjb25uZWN0aW9uIHRvIHRoYXQgcGFydGl0aW9uLgotICoKLSAqIEVhY2ggb2YgdGhlc2Ugc3RydWN0dXJlcyBtYW5hZ2VzIHR3byBtZXNzYWdlIHF1ZXVlcyAoY2lyY3VsYXIgYnVmZmVycykuCi0gKiBUaGV5IGFyZSBhbGxvY2F0ZWQgYXQgdGhlIHRpbWUgYSBjaGFubmVsIGNvbm5lY3Rpb24gaXMgbWFkZS4gT25lIG9mCi0gKiB0aGVzZSBtZXNzYWdlIHF1ZXVlcyAobG9jYWxfbXNncXVldWUpIGhvbGRzIHRoZSBsb2NhbGx5IGNyZWF0ZWQgbWVzc2FnZXMKLSAqIHRoYXQgYXJlIGRlc3RpbmVkIGZvciB0aGUgcmVtb3RlIHBhcnRpdGlvbi4gVGhlIG90aGVyIG9mIHRoZXNlIG1lc3NhZ2UKLSAqIHF1ZXVlcyAocmVtb3RlX21zZ3F1ZXVlKSBpcyBhIGxvY2FsbHkgY2FjaGVkIGNvcHkgb2YgdGhlIHJlbW90ZSBwYXJ0aXRpb24ncwotICogb3duIGxvY2FsX21zZ3F1ZXVlLgotICoKLSAqIFRoZSBmb2xsb3dpbmcgaXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgR2V0L1B1dCBwb2ludGVycyB1c2VkIHRvIG1hbmFnZSB0aGVzZQotICogdHdvIG1lc3NhZ2UgcXVldWVzLiBDb25zaWRlciB0aGUgbG9jYWxfbXNncXVldWUgdG8gYmUgb24gb25lIHBhcnRpdGlvbgotICogYW5kIHRoZSByZW1vdGVfbXNncXVldWUgdG8gYmUgaXRzIGNhY2hlZCBjb3B5IG9uIGFub3RoZXIgcGFydGl0aW9uLiBBCi0gKiBkZXNjcmlwdGlvbiBvZiB3aGF0IGVhY2ggb2YgdGhlIGxldHRlcmVkIGFyZWFzIGNvbnRhaW5zIGlzIGluY2x1ZGVkLgotICoKLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgIGxvY2FsX21zZ3F1ZXVlICAgICAgcmVtb3RlX21zZ3F1ZXVlCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgICB8Ly8vLy8vLy8vfCAgICAgIHwvLy8vLy8vLy98Ci0gKiAgICB3X3JlbW90ZV9HUC5nZXQgLS0+ICstLS0tLS0tLS0rICAgICAgfC8vLy8vLy8vL3wKLSAqICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBGICAgIHwgICAgICB8Ly8vLy8vLy8vfAotICogICAgIHJlbW90ZV9HUC5nZXQgIC0tPiArLS0tLS0tLS0tKyAgICAgICstLS0tLS0tLS0rIDwtLSBsb2NhbF9HUC0+Z2V0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgfCAgICAgICAgIHwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwgICAgICB8ICAgIEUgICAgfAotICogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgIHwgICAgICAgICB8Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgKy0tLS0tLS0tLSsgPC0tIHdfbG9jYWxfR1AuZ2V0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgQiAgICB8ICAgICAgfC8vLy8vLy8vL3wKLSAqICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwgICAgICB8Ly8vL0QvLy8vfAotICogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgIHwvLy8vLy8vLy98Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgKy0tLS0tLS0tLSsgPC0tIHdfcmVtb3RlX0dQLnB1dAotICogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgIHwvLy8vQy8vLy98Ci0gKiAgICAgIGxvY2FsX0dQLT5wdXQgLS0+ICstLS0tLS0tLS0rICAgICAgKy0tLS0tLS0tLSsgPC0tIHJlbW90ZV9HUC5wdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwgICAgICB8Ly8vLy8vLy8vfAotICogICAgICAgICAgICAgICAgICAgICAgICB8ICAgIEEgICAgfCAgICAgIHwvLy8vLy8vLy98Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgfC8vLy8vLy8vL3wKLSAqICAgICB3X2xvY2FsX0dQLnB1dCAtLT4gKy0tLS0tLS0tLSsgICAgICB8Ly8vLy8vLy8vfAotICogICAgICAgICAgICAgICAgICAgICAgICB8Ly8vLy8vLy8vfCAgICAgIHwvLy8vLy8vLy98Ci0gKgotICoKLSAqCSAgICAoIHJlbW90ZV9HUC5bZ2V0fHB1dF0gYXJlIGNhY2hlZCBjb3BpZXMgb2YgdGhlIHJlbW90ZQotICoJICAgICAgcGFydGl0aW9uJ3MgbG9jYWxfR1AtPltnZXR8cHV0XSwgYW5kIHRodXMgdGhlaXIgdmFsdWVzIGNhbgotICoJICAgICAgbGFnIGJlaGluZCB0aGVpciBjb3VudGVycGFydHMgb24gdGhlIHJlbW90ZSBwYXJ0aXRpb24uICkKLSAqCi0gKgotICogIEEgLSBNZXNzYWdlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQsIGJ1dCBoYXZlIG5vdCB5ZXQgYmVlbiBzZW50IHRvIHRoZQotICoJcmVtb3RlIHBhcnRpdGlvbi4KLSAqCi0gKiAgQiAtIE1lc3NhZ2VzIHRoYXQgaGF2ZSBiZWVuIHNlbnQsIGJ1dCBoYXZlIG5vdCB5ZXQgYmVlbiBhY2tub3dsZWRnZWQgYnkgdGhlCi0gKiAgICAgIHJlbW90ZSBwYXJ0aXRpb24gYXMgaGF2aW5nIGJlZW4gcmVjZWl2ZWQuCi0gKgotICogIEMgLSBBcmVhIHRoYXQgbmVlZHMgdG8gYmUgcHJlcGFyZWQgZm9yIHRoZSBjb3B5aW5nIG9mIHNlbnQgbWVzc2FnZXMsIGJ5Ci0gKgl0aGUgY2xlYXJpbmcgb2YgdGhlIG1lc3NhZ2UgZmxhZ3Mgb2YgYW55IHByZXZpb3VzbHkgcmVjZWl2ZWQgbWVzc2FnZXMuCi0gKgotICogIEQgLSBBcmVhIGludG8gd2hpY2ggc2VudCBtZXNzYWdlcyBhcmUgdG8gYmUgY29waWVkIGZyb20gdGhlIHJlbW90ZQotICoJcGFydGl0aW9uJ3MgbG9jYWxfbXNncXVldWUgYW5kIHRoZW4gZGVsaXZlcmVkIHRvIHRoZWlyIGludGVuZGVkCi0gKglyZWNpcGllbnRzLiBbIFRvIGFsbG93IGZvciBhIG11bHRpLW1lc3NhZ2UgY29weSwgYW5vdGhlciBwb2ludGVyCi0gKgkobmV4dF9tc2dfdG9fcHVsbCkgaGFzIGJlZW4gYWRkZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbmV4dCBtZXNzYWdlCi0gKgludW1iZXIgbmVlZGluZyB0byBiZSBjb3BpZWQgKHB1bGxlZCkuIEl0IGNoYXNlcyBhZnRlciB3X3JlbW90ZV9HUC5wdXQuCi0gKglBbnkgbWVzc2FnZXMgbHlpbmcgYmV0d2VlbiB3X2xvY2FsX0dQLmdldCBhbmQgbmV4dF9tc2dfdG9fcHVsbCBoYXZlCi0gKgliZWVuIGNvcGllZCBhbmQgYXJlIHJlYWR5IHRvIGJlIGRlbGl2ZXJlZC4gXQotICoKLSAqICBFIC0gTWVzc2FnZXMgdGhhdCBoYXZlIGJlZW4gY29waWVkIGFuZCBkZWxpdmVyZWQsIGJ1dCBoYXZlIG5vdCB5ZXQgYmVlbgotICoJYWNrbm93bGVkZ2VkIGJ5IHRoZSByZWNpcGllbnQgYXMgaGF2aW5nIGJlZW4gcmVjZWl2ZWQuCi0gKgotICogIEYgLSBNZXNzYWdlcyB0aGF0IGhhdmUgYmVlbiBhY2tub3dsZWRnZWQsIGJ1dCBYUEMgaGFzIG5vdCB5ZXQgbm90aWZpZWQgdGhlCi0gKglzZW5kZXIgdGhhdCB0aGUgbWVzc2FnZSB3YXMgcmVjZWl2ZWQgYnkgaXRzIGludGVuZGVkIHJlY2lwaWVudC4KLSAqCVRoaXMgaXMgYWxzbyBhbiBhcmVhIHRoYXQgbmVlZHMgdG8gYmUgcHJlcGFyZWQgZm9yIHRoZSBhbGxvY2F0aW5nIG9mCi0gKgluZXcgbWVzc2FnZXMsIGJ5IHRoZSBjbGVhcmluZyBvZiB0aGUgbWVzc2FnZSBmbGFncyBvZiB0aGUgYWNrbm93bGVkZ2VkCi0gKgltZXNzYWdlcy4KLSAqLwotc3RydWN0IHhwY19jaGFubmVsIHsKLQlwYXJ0aWRfdCBwYXJ0aWQ7CQkvKiBJRCBvZiByZW1vdGUgcGFydGl0aW9uIGNvbm5lY3RlZCAqLwotCXNwaW5sb2NrX3QgbG9jazsJCS8qIGxvY2sgZm9yIHVwZGF0aW5nIHRoaXMgc3RydWN0dXJlICovCi0JdTMyIGZsYWdzOwkJCS8qIGdlbmVyYWwgZmxhZ3MgKi8KLQotCWVudW0geHBjX3JldHZhbCByZWFzb247CQkvKiByZWFzb24gd2h5IGNoYW5uZWwgaXMgZGlzY29ubmVjdCdnICovCi0JaW50IHJlYXNvbl9saW5lOwkJLyogbGluZSMgZGlzY29ubmVjdCBpbml0aWF0ZWQgZnJvbSAqLwotCi0JdTE2IG51bWJlcjsJCQkvKiBjaGFubmVsICMgKi8KLQotCXUxNiBtc2dfc2l6ZTsJCQkvKiBzaXplb2YgZWFjaCBtc2cgZW50cnkgKi8KLQl1MTYgbG9jYWxfbmVudHJpZXM7CQkvKiAjb2YgbXNnIGVudHJpZXMgaW4gbG9jYWwgbXNnIHF1ZXVlICovCi0JdTE2IHJlbW90ZV9uZW50cmllczsJCS8qICNvZiBtc2cgZW50cmllcyBpbiByZW1vdGUgbXNnIHF1ZXVlKi8KLQotCXZvaWQgKmxvY2FsX21zZ3F1ZXVlX2Jhc2U7CS8qIGJhc2UgYWRkcmVzcyBvZiBrbWFsbG9jJ2Qgc3BhY2UgKi8KLQlzdHJ1Y3QgeHBjX21zZyAqbG9jYWxfbXNncXVldWU7CS8qIGxvY2FsIG1lc3NhZ2UgcXVldWUgKi8KLQl2b2lkICpyZW1vdGVfbXNncXVldWVfYmFzZTsJLyogYmFzZSBhZGRyZXNzIG9mIGttYWxsb2MnZCBzcGFjZSAqLwotCXN0cnVjdCB4cGNfbXNnICpyZW1vdGVfbXNncXVldWU7LyogY2FjaGVkIGNvcHkgb2YgcmVtb3RlIHBhcnRpdGlvbidzICovCi0JCQkJCS8qIGxvY2FsIG1lc3NhZ2UgcXVldWUgKi8KLQl1NjQgcmVtb3RlX21zZ3F1ZXVlX3BhOwkJLyogcGh5cyBhZGRyIG9mIHJlbW90ZSBwYXJ0aXRpb24ncyAqLwotCQkJCQkvKiBsb2NhbCBtZXNzYWdlIHF1ZXVlICovCi0KLQlhdG9taWNfdCByZWZlcmVuY2VzOwkJLyogI29mIGV4dGVybmFsIHJlZmVyZW5jZXMgdG8gcXVldWVzICovCi0KLQlhdG9taWNfdCBuX29uX21zZ19hbGxvY2F0ZV93cTsgICAvKiAjb24gbXNnIGFsbG9jYXRpb24gd2FpdCBxdWV1ZSAqLwotCXdhaXRfcXVldWVfaGVhZF90IG1zZ19hbGxvY2F0ZV93cTsgLyogbXNnIGFsbG9jYXRpb24gd2FpdCBxdWV1ZSAqLwotCi0JdTggZGVsYXllZF9JUElfZmxhZ3M7CQkvKiBJUEkgZmxhZ3MgcmVjZWl2ZWQsIGJ1dCBkZWxheWVkICovCi0JCQkJCS8qIGFjdGlvbiB1bnRpbCBjaGFubmVsIGRpc2Nvbm5lY3RlZCAqLwotCi0JLyogcXVldWUgb2YgbXNnIHNlbmRlcnMgd2hvIHdhbnQgdG8gYmUgbm90aWZpZWQgd2hlbiBtc2cgcmVjZWl2ZWQgKi8KLQotCWF0b21pY190IG5fdG9fbm90aWZ5OwkJLyogI29mIG1zZyBzZW5kZXJzIHRvIG5vdGlmeSAqLwotCXN0cnVjdCB4cGNfbm90aWZ5ICpub3RpZnlfcXVldWU7Lyogbm90aWZ5IHF1ZXVlIGZvciBtZXNzYWdlcyBzZW50ICovCi0KLQl4cGNfY2hhbm5lbF9mdW5jIGZ1bmM7CQkvKiB1c2VyJ3MgY2hhbm5lbCBmdW5jdGlvbiAqLwotCXZvaWQgKmtleTsJCQkvKiBwb2ludGVyIHRvIHVzZXIncyBrZXkgKi8KLQotCXN0cnVjdCBzZW1hcGhvcmUgbXNnX3RvX3B1bGxfc2VtYTsgLyogbmV4dCBtc2cgdG8gcHVsbCBzZXJpYWxpemF0aW9uICovCi0Jc3RydWN0IHNlbWFwaG9yZSB3ZGlzY29ubmVjdF9zZW1hOyAvKiB3YWl0IGZvciBjaGFubmVsIGRpc2Nvbm5lY3QgKi8KLQotCXN0cnVjdCB4cGNfb3BlbmNsb3NlX2FyZ3MgKmxvY2FsX29wZW5jbG9zZV9hcmdzOyAvKiBhcmdzIHBhc3NlZCBvbiAqLwotCQkJCQkvKiBvcGVuaW5nIG9yIGNsb3Npbmcgb2YgY2hhbm5lbCAqLwotCi0JLyogdmFyaW91cyBmbGF2b3JzIG9mIGxvY2FsIGFuZCByZW1vdGUgR2V0L1B1dCB2YWx1ZXMgKi8KLQotCXN0cnVjdCB4cGNfZ3AgKmxvY2FsX0dQOwkvKiBsb2NhbCBHZXQvUHV0IHZhbHVlcyAqLwotCXN0cnVjdCB4cGNfZ3AgcmVtb3RlX0dQOwkvKiByZW1vdGUgR2V0L1B1dCB2YWx1ZXMgKi8KLQlzdHJ1Y3QgeHBjX2dwIHdfbG9jYWxfR1A7CS8qIHdvcmtpbmcgbG9jYWwgR2V0L1B1dCB2YWx1ZXMgKi8KLQlzdHJ1Y3QgeHBjX2dwIHdfcmVtb3RlX0dQOwkvKiB3b3JraW5nIHJlbW90ZSBHZXQvUHV0IHZhbHVlcyAqLwotCXM2NCBuZXh0X21zZ190b19wdWxsOwkJLyogUHV0IHZhbHVlIG9mIG5leHQgbXNnIHRvIHB1bGwgKi8KLQotCS8qIGt0aHJlYWQgbWFuYWdlbWVudCByZWxhdGVkIGZpZWxkcyAqLwotCi0vLyA+Pj4gcmV0aGluayBoYXZpbmcga3RocmVhZHNfYXNzaWduZWRfbGltaXQgYW5kIGt0aHJlYWRzX2lkbGVfbGltaXQ7IHBlcmhhcHMKLS8vID4+PiBhbGxvdyB0aGUgYXNzaWduZWQgbGltaXQgYmUgdW5ib3VuZGVkIGFuZCBsZXQgdGhlIGlkbGUgbGltaXQgYmUgZHluYW1pYwotLy8gPj4+IGRlcGVuZGVudCBvbiBhY3Rpdml0eSBvdmVyIHRoZSBsYXN0IGludGVydmFsIG9mIHRpbWUKLQlhdG9taWNfdCBrdGhyZWFkc19hc3NpZ25lZDsJLyogI29mIGt0aHJlYWRzIGFzc2lnbmVkIHRvIGNoYW5uZWwgKi8KLQl1MzIga3RocmVhZHNfYXNzaWduZWRfbGltaXQ7IAkvKiBsaW1pdCBvbiAjb2Yga3RocmVhZHMgYXNzaWduZWQgKi8KLQlhdG9taWNfdCBrdGhyZWFkc19pZGxlOwkJLyogI29mIGt0aHJlYWRzIGlkbGUgd2FpdGluZyBmb3Igd29yayAqLwotCXUzMiBrdGhyZWFkc19pZGxlX2xpbWl0OwkvKiBsaW1pdCBvbiAjb2Yga3RocmVhZHMgaWRsZSAqLwotCWF0b21pY190IGt0aHJlYWRzX2FjdGl2ZTsJLyogI29mIGt0aHJlYWRzIGFjdGl2ZWx5IHdvcmtpbmcgKi8KLQkvLyA+Pj4gZm9sbG93aW5nIGZpZWxkIGlzIHRlbXBvcmFyeQotCXUzMiBrdGhyZWFkc19jcmVhdGVkOwkJLyogdG90YWwgI29mIGt0aHJlYWRzIGNyZWF0ZWQgKi8KLQotCXdhaXRfcXVldWVfaGVhZF90IGlkbGVfd3E7CS8qIGlkbGUga3RocmVhZCB3YWl0IHF1ZXVlICovCi0KLX0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwotCi0KLS8qIHN0cnVjdCB4cGNfY2hhbm5lbCBmbGFncyAqLwotCi0jZGVmaW5lCVhQQ19DX1dBU0NPTk5FQ1RFRAkweDAwMDAwMDAxIC8qIGNoYW5uZWwgd2FzIGNvbm5lY3RlZCAqLwotCi0jZGVmaW5lCVhQQ19DX1JPUEVOUkVQTFkJMHgwMDAwMDAwMiAvKiByZW1vdGUgb3BlbiBjaGFubmVsIHJlcGx5ICovCi0jZGVmaW5lCVhQQ19DX09QRU5SRVBMWQkJMHgwMDAwMDAwNCAvKiBsb2NhbCBvcGVuIGNoYW5uZWwgcmVwbHkgKi8KLSNkZWZpbmUJWFBDX0NfUk9QRU5SRVFVRVNUCTB4MDAwMDAwMDggLyogcmVtb3RlIG9wZW4gY2hhbm5lbCByZXF1ZXN0ICovCi0jZGVmaW5lCVhQQ19DX09QRU5SRVFVRVNUCTB4MDAwMDAwMTAgLyogbG9jYWwgb3BlbiBjaGFubmVsIHJlcXVlc3QgKi8KLQotI2RlZmluZQlYUENfQ19TRVRVUAkJMHgwMDAwMDAyMCAvKiBjaGFubmVsJ3MgbXNncXVldWVzIGFyZSBhbGxvYydkICovCi0jZGVmaW5lCVhQQ19DX0NPTk5FQ1RDQUxMT1VUCTB4MDAwMDAwNDAgLyogY2hhbm5lbCBjb25uZWN0ZWQgY2FsbG91dCBtYWRlICovCi0jZGVmaW5lCVhQQ19DX0NPTk5FQ1RFRAkJMHgwMDAwMDA4MCAvKiBsb2NhbCBjaGFubmVsIGlzIGNvbm5lY3RlZCAqLwotI2RlZmluZQlYUENfQ19DT05ORUNUSU5HCTB4MDAwMDAxMDAgLyogY2hhbm5lbCBpcyBiZWluZyBjb25uZWN0ZWQgKi8KLQotI2RlZmluZQlYUENfQ19SQ0xPU0VSRVBMWQkweDAwMDAwMjAwIC8qIHJlbW90ZSBjbG9zZSBjaGFubmVsIHJlcGx5ICovCi0jZGVmaW5lCVhQQ19DX0NMT1NFUkVQTFkJMHgwMDAwMDQwMCAvKiBsb2NhbCBjbG9zZSBjaGFubmVsIHJlcGx5ICovCi0jZGVmaW5lCVhQQ19DX1JDTE9TRVJFUVVFU1QJMHgwMDAwMDgwMCAvKiByZW1vdGUgY2xvc2UgY2hhbm5lbCByZXF1ZXN0ICovCi0jZGVmaW5lCVhQQ19DX0NMT1NFUkVRVUVTVAkweDAwMDAxMDAwIC8qIGxvY2FsIGNsb3NlIGNoYW5uZWwgcmVxdWVzdCAqLwotCi0jZGVmaW5lCVhQQ19DX0RJU0NPTk5FQ1RFRAkweDAwMDAyMDAwIC8qIGNoYW5uZWwgaXMgZGlzY29ubmVjdGVkICovCi0jZGVmaW5lCVhQQ19DX0RJU0NPTk5FQ1RJTkcJMHgwMDAwNDAwMCAvKiBjaGFubmVsIGlzIGJlaW5nIGRpc2Nvbm5lY3RlZCAqLwotI2RlZmluZQlYUENfQ19ESVNDT05ORUNUQ0FMTE9VVAkweDAwMDA4MDAwIC8qIGNoYW4gZGlzY29ubmVjdGVkIGNhbGxvdXQgbWFkZSAqLwotI2RlZmluZQlYUENfQ19XRElTQ09OTkVDVAkweDAwMDEwMDAwIC8qIHdhaXRpbmcgZm9yIGNoYW5uZWwgZGlzY29ubmVjdCAqLwotCi0KLQotLyoKLSAqIE1hbmFnZXMgY2hhbm5lbHMgb24gYSBwYXJ0aXRpb24gYmFzaXMuIFRoZXJlIGlzIG9uZSBvZiB0aGVzZSBzdHJ1Y3R1cmVzCi0gKiBmb3IgZWFjaCBwYXJ0aXRpb24gKGEgcGFydGl0aW9uIHdpbGwgbmV2ZXIgdXRpbGl6ZSB0aGUgc3RydWN0dXJlIHRoYXQKLSAqIHJlcHJlc2VudHMgaXRzZWxmKS4KLSAqLwotc3RydWN0IHhwY19wYXJ0aXRpb24gewotCi0JLyogWFBDIEhCIGluZnJhc3RydWN0dXJlICovCi0KLQl1OCByZW1vdGVfcnBfdmVyc2lvbjsJCS8qIHZlcnNpb24jIG9mIHBhcnRpdGlvbidzIHJzdmQgcGcgKi8KLQlzdHJ1Y3QgdGltZXNwZWMgcmVtb3RlX3JwX3N0YW1wOy8qIHRpbWUgd2hlbiByc3ZkIHBnIHdhcyBpbml0aWFsaXplZCAqLwotCXU2NCByZW1vdGVfcnBfcGE7CQkvKiBwaHlzIGFkZHIgb2YgcGFydGl0aW9uJ3MgcnN2ZCBwZyAqLwotCXU2NCByZW1vdGVfdmFyc19wYTsJCS8qIHBoeXMgYWRkciBvZiBwYXJ0aXRpb24ncyB2YXJzICovCi0JdTY0IHJlbW90ZV92YXJzX3BhcnRfcGE7CS8qIHBoeXMgYWRkciBvZiBwYXJ0aXRpb24ncyB2YXJzIHBhcnQgKi8KLQl1NjQgbGFzdF9oZWFydGJlYXQ7CQkvKiBIQiBhdCBsYXN0IHJlYWQgKi8KLQl1NjQgcmVtb3RlX2Ftb3NfcGFnZV9wYTsJLyogcGh5cyBhZGRyIG9mIHBhcnRpdGlvbidzIGFtb3MgcGFnZSAqLwotCWludCByZW1vdGVfYWN0X25hc2lkOwkJLyogYWN0aXZlIHBhcnQncyBhY3QvZGVhY3QgbmFzaWQgKi8KLQlpbnQgcmVtb3RlX2FjdF9waHlzX2NwdWlkOwkvKiBhY3RpdmUgcGFydCdzIGFjdC9kZWFjdCBwaHlzIGNwdWlkICovCi0JdTMyIGFjdF9JUlFfcmN2ZDsJCS8qIElSUXMgc2luY2UgYWN0aXZhdGlvbiAqLwotCXNwaW5sb2NrX3QgYWN0X2xvY2s7CQkvKiBwcm90ZWN0IHVwZGF0aW5nIG9mIGFjdF9zdGF0ZSAqLwotCXU4IGFjdF9zdGF0ZTsJCQkvKiBmcm9tIFhQQyBIQiB2aWV3cG9pbnQgKi8KLQl1OCByZW1vdGVfdmFyc192ZXJzaW9uOwkJLyogdmVyc2lvbiMgb2YgcGFydGl0aW9uJ3MgdmFycyAqLwotCWVudW0geHBjX3JldHZhbCByZWFzb247CQkvKiByZWFzb24gcGFydGl0aW9uIGlzIGRlYWN0aXZhdGluZyAqLwotCWludCByZWFzb25fbGluZTsJCS8qIGxpbmUjIGRlYWN0aXZhdGlvbiBpbml0aWF0ZWQgZnJvbSAqLwotCWludCByZWFjdGl2YXRlX25hc2lkOwkJLyogbmFzaWQgaW4gcGFydGl0aW9uIHRvIHJlYWN0aXZhdGUgKi8KLQotCXVuc2lnbmVkIGxvbmcgZGlzZW5nYWdlX3JlcXVlc3RfdGltZW91dDsgLyogdGltZW91dCBpbiBqaWZmaWVzICovCi0Jc3RydWN0IHRpbWVyX2xpc3QgZGlzZW5nYWdlX3JlcXVlc3RfdGltZXI7Ci0KLQotCS8qIFhQQyBpbmZyYXN0cnVjdHVyZSByZWZlcmVuY2luZyBhbmQgdGVhcmRvd24gY29udHJvbCAqLwotCi0Jdm9sYXRpbGUgdTggc2V0dXBfc3RhdGU7CS8qIGluZnJhc3RydWN0dXJlIHNldHVwIHN0YXRlICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QgdGVhcmRvd25fd3E7CS8qIGt0aHJlYWQgd2FpdGluZyB0byB0ZWFyZG93biBpbmZyYSAqLwotCWF0b21pY190IHJlZmVyZW5jZXM7CQkvKiAjb2YgcmVmZXJlbmNlcyB0byBpbmZyYXN0cnVjdHVyZSAqLwotCi0KLQkvKgotCSAqIE5PTkUgT0YgVEhFIFBSRUNFRElORyBGSUVMRFMgT0YgVEhJUyBTVFJVQ1RVUkUgV0lMTCBCRSBDTEVBUkVEIFdIRU4KLQkgKiBYUEMgU0VUUyBVUCBUSEUgTkVDRVNTQVJZIElORlJBU1RSVUNUVVJFIFRPIFNVUFBPUlQgQ1JPU1MgUEFSVElUSU9OCi0JICogQ09NTVVOSUNBVElPTi4gQUxMIE9GIFRIRSBGT0xMT1dJTkcgRklFTERTIFdJTEwgQkUgQ0xFQVJFRC4gKFRIRQotCSAqICduY2hhbm5lbHMnIEZJRUxEIE1VU1QgQkUgVEhFIEZJUlNUIE9GIFRIRSBGSUVMRFMgVE8gQkUgQ0xFQVJFRC4pCi0JICovCi0KLQotCXU4IG5jaGFubmVsczsJCSAgIC8qICNvZiBkZWZpbmVkIGNoYW5uZWxzIHN1cHBvcnRlZCAqLwotCWF0b21pY190IG5jaGFubmVsc19hY3RpdmU7IC8qICNvZiBjaGFubmVscyB0aGF0IGFyZSBub3QgRElTQ09OTkVDVEVEICovCi0JYXRvbWljX3QgbmNoYW5uZWxzX2VuZ2FnZWQ7LyogI29mIGNoYW5uZWxzIGVuZ2FnZWQgd2l0aCByZW1vdGUgcGFydCAqLwotCXN0cnVjdCB4cGNfY2hhbm5lbCAqY2hhbm5lbHM7LyogYXJyYXkgb2YgY2hhbm5lbCBzdHJ1Y3R1cmVzICovCi0KLQl2b2lkICpsb2NhbF9HUHNfYmFzZTsJICAvKiBiYXNlIGFkZHJlc3Mgb2Yga21hbGxvYydkIHNwYWNlICovCi0Jc3RydWN0IHhwY19ncCAqbG9jYWxfR1BzOyAvKiBsb2NhbCBHZXQvUHV0IHZhbHVlcyAqLwotCXZvaWQgKnJlbW90ZV9HUHNfYmFzZTsgICAgLyogYmFzZSBhZGRyZXNzIG9mIGttYWxsb2MnZCBzcGFjZSAqLwotCXN0cnVjdCB4cGNfZ3AgKnJlbW90ZV9HUHM7LyogY29weSBvZiByZW1vdGUgcGFydGl0aW9uJ3MgbG9jYWwgR2V0L1B1dCAqLwotCQkJCSAgLyogdmFsdWVzICovCi0JdTY0IHJlbW90ZV9HUHNfcGE7CSAgLyogcGh5cyBhZGRyZXNzIG9mIHJlbW90ZSBwYXJ0aXRpb24ncyBsb2NhbCAqLwotCQkJCSAgLyogR2V0L1B1dCB2YWx1ZXMgKi8KLQotCi0JLyogZmllbGRzIHVzZWQgdG8gcGFzcyBhcmdzIHdoZW4gb3BlbmluZyBvciBjbG9zaW5nIGEgY2hhbm5lbCAqLwotCi0Jdm9pZCAqbG9jYWxfb3BlbmNsb3NlX2FyZ3NfYmFzZTsgIC8qIGJhc2UgYWRkcmVzcyBvZiBrbWFsbG9jJ2Qgc3BhY2UgKi8KLQlzdHJ1Y3QgeHBjX29wZW5jbG9zZV9hcmdzICpsb2NhbF9vcGVuY2xvc2VfYXJnczsgIC8qIGxvY2FsJ3MgYXJncyAqLwotCXZvaWQgKnJlbW90ZV9vcGVuY2xvc2VfYXJnc19iYXNlOyAvKiBiYXNlIGFkZHJlc3Mgb2Yga21hbGxvYydkIHNwYWNlICovCi0Jc3RydWN0IHhwY19vcGVuY2xvc2VfYXJncyAqcmVtb3RlX29wZW5jbG9zZV9hcmdzOyAvKiBjb3B5IG9mIHJlbW90ZSdzICovCi0JCQkJCSAgLyogYXJncyAqLwotCXU2NCByZW1vdGVfb3BlbmNsb3NlX2FyZ3NfcGE7CSAgLyogcGh5cyBhZGRyIG9mIHJlbW90ZSdzIGFyZ3MgKi8KLQotCi0JLyogSVBJIHNlbmRpbmcsIHJlY2VpdmluZyBhbmQgaGFuZGxpbmcgcmVsYXRlZCBmaWVsZHMgKi8KLQotCWludCByZW1vdGVfSVBJX25hc2lkOwkgICAgLyogbmFzaWQgb2Ygd2hlcmUgdG8gc2VuZCBJUElzICovCi0JaW50IHJlbW90ZV9JUElfcGh5c19jcHVpZDsgIC8qIHBoeXMgQ1BVIElEIG9mIHdoZXJlIHRvIHNlbmQgSVBJcyAqLwotCUFNT190ICpyZW1vdGVfSVBJX2Ftb192YTsgICAvKiBhZGRyZXNzIG9mIHJlbW90ZSBJUEkgQU1PX3Qgc3RydWN0dXJlICovCi0KLQlBTU9fdCAqbG9jYWxfSVBJX2Ftb192YTsgICAgLyogYWRkcmVzcyBvZiBJUEkgQU1PX3Qgc3RydWN0dXJlICovCi0JdTY0IGxvY2FsX0lQSV9hbW87CSAgICAvKiBJUEkgYW1vIGZsYWdzIHlldCB0byBiZSBoYW5kbGVkICovCi0JY2hhciBJUElfb3duZXJbOF07CSAgICAvKiBJUEkgb3duZXIncyBuYW1lICovCi0Jc3RydWN0IHRpbWVyX2xpc3QgZHJvcHBlZF9JUElfdGltZXI7IC8qIGRyb3BwZWQgSVBJIHRpbWVyICovCi0KLQlzcGlubG9ja190IElQSV9sb2NrOwkgICAgLyogSVBJIGhhbmRsZXIgbG9jayAqLwotCi0KLQkvKiBjaGFubmVsIG1hbmFnZXIgcmVsYXRlZCBmaWVsZHMgKi8KLQotCWF0b21pY190IGNoYW5uZWxfbWdyX3JlcXVlc3RzOwkvKiAjb2YgcmVxdWVzdHMgdG8gYWN0aXZhdGUgY2hhbiBtZ3IgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCBjaGFubmVsX21ncl93cTsgLyogY2hhbm5lbCBtZ3IncyB3YWl0IHF1ZXVlICovCi0KLX0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwotCi0KLS8qIHN0cnVjdCB4cGNfcGFydGl0aW9uIGFjdF9zdGF0ZSB2YWx1ZXMgKGZvciBYUEMgSEIpICovCi0KLSNkZWZpbmUJWFBDX1BfSU5BQ1RJVkUJCTB4MDAJLyogcGFydGl0aW9uIGlzIG5vdCBhY3RpdmUgKi8KLSNkZWZpbmUgWFBDX1BfQUNUSVZBVElPTl9SRVEJMHgwMQkvKiBjcmVhdGVkIHRocmVhZCB0byBhY3RpdmF0ZSAqLwotI2RlZmluZSBYUENfUF9BQ1RJVkFUSU5HCTB4MDIJLyogYWN0aXZhdGlvbiB0aHJlYWQgc3RhcnRlZCAqLwotI2RlZmluZSBYUENfUF9BQ1RJVkUJCTB4MDMJLyogeHBjX3BhcnRpdGlvbl91cCgpIHdhcyBjYWxsZWQgKi8KLSNkZWZpbmUgWFBDX1BfREVBQ1RJVkFUSU5HCTB4MDQJLyogcGFydGl0aW9uIGRlYWN0aXZhdGlvbiBpbml0aWF0ZWQgKi8KLQotCi0jZGVmaW5lIFhQQ19ERUFDVElWQVRFX1BBUlRJVElPTihfcCwgX3JlYXNvbikgXAotCQkJeHBjX2RlYWN0aXZhdGVfcGFydGl0aW9uKF9fTElORV9fLCAoX3ApLCAoX3JlYXNvbikpCi0KLQotLyogc3RydWN0IHhwY19wYXJ0aXRpb24gc2V0dXBfc3RhdGUgdmFsdWVzICovCi0KLSNkZWZpbmUgWFBDX1BfVU5TRVQJCTB4MDAJLyogaW5mcmFzdHJ1Y3R1cmUgd2FzIG5ldmVyIHNldHVwICovCi0jZGVmaW5lIFhQQ19QX1NFVFVQCQkweDAxCS8qIGluZnJhc3RydWN0dXJlIGlzIHNldHVwICovCi0jZGVmaW5lIFhQQ19QX1dURUFSRE9XTgkJMHgwMgkvKiB3YWl0aW5nIHRvIHRlYXJkb3duIGluZnJhc3RydWN0dXJlICovCi0jZGVmaW5lIFhQQ19QX1RPUk5ET1dOCQkweDAzCS8qIGluZnJhc3RydWN0dXJlIGlzIHRvcm5kb3duICovCi0KLQotCi0vKgotICogc3RydWN0IHhwY19wYXJ0aXRpb24gSVBJX3RpbWVyICNvZiBzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGNoZWNraW5nIGZvcgotICogZHJvcHBlZCBJUElzLiBUaGVzZSBvY2N1ciB3aGVuZXZlciBhbiBJUEkgYW1vIHdyaXRlIGRvZXNuJ3QgY29tcGxldGUgdW50aWwKLSAqIGFmdGVyIHRoZSBJUEkgd2FzIHJlY2VpdmVkLgotICovCi0jZGVmaW5lIFhQQ19QX0RST1BQRURfSVBJX1dBSVQJKDAuMjUgKiBIWikKLQotCi0vKiBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGZvciBvdGhlciBwYXJ0aXRpb25zIHRvIGRpc2VuZ2FnZSAqLwotI2RlZmluZSBYUENfRElTRU5HQUdFX1JFUVVFU1RfREVGQVVMVF9USU1FTElNSVQJOTAKLQotLyogaW50ZXJ2YWwgaW4gc2Vjb25kcyB0byBwcmludCAnd2FpdGluZyBkaXNlbmdhZ2VtZW50JyBtZXNzYWdlcyAqLwotI2RlZmluZSBYUENfRElTRU5HQUdFX1BSSU5UTVNHX0lOVEVSVkFMCQkxMAotCi0KLSNkZWZpbmUgWFBDX1BBUlRJRChfcCkJKChwYXJ0aWRfdCkgKChfcCkgLSAmeHBjX3BhcnRpdGlvbnNbMF0pKQotCi0KLQotLyogZm91bmQgaW4geHBfbWFpbi5jICovCi1leHRlcm4gc3RydWN0IHhwY19yZWdpc3RyYXRpb24geHBjX3JlZ2lzdHJhdGlvbnNbXTsKLQotCi0vKiBmb3VuZCBpbiB4cGNfbWFpbi5jICovCi1leHRlcm4gc3RydWN0IGRldmljZSAqeHBjX3BhcnQ7Ci1leHRlcm4gc3RydWN0IGRldmljZSAqeHBjX2NoYW47Ci1leHRlcm4gaW50IHhwY19kaXNlbmdhZ2VfcmVxdWVzdF90aW1lbGltaXQ7Ci1leHRlcm4gaXJxcmV0dXJuX3QgeHBjX25vdGlmeV9JUlFfaGFuZGxlcihpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci1leHRlcm4gdm9pZCB4cGNfZHJvcHBlZF9JUElfY2hlY2soc3RydWN0IHhwY19wYXJ0aXRpb24gKik7Ci1leHRlcm4gdm9pZCB4cGNfYWN0aXZhdGVfcGFydGl0aW9uKHN0cnVjdCB4cGNfcGFydGl0aW9uICopOwotZXh0ZXJuIHZvaWQgeHBjX2FjdGl2YXRlX2t0aHJlYWRzKHN0cnVjdCB4cGNfY2hhbm5lbCAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgeHBjX2NyZWF0ZV9rdGhyZWFkcyhzdHJ1Y3QgeHBjX2NoYW5uZWwgKiwgaW50KTsKLWV4dGVybiB2b2lkIHhwY19kaXNjb25uZWN0X3dhaXQoaW50KTsKLQotCi0vKiBmb3VuZCBpbiB4cGNfcGFydGl0aW9uLmMgKi8KLWV4dGVybiBpbnQgeHBjX2V4aXRpbmc7Ci1leHRlcm4gc3RydWN0IHhwY192YXJzICp4cGNfdmFyczsKLWV4dGVybiBzdHJ1Y3QgeHBjX3JzdmRfcGFnZSAqeHBjX3JzdmRfcGFnZTsKLWV4dGVybiBzdHJ1Y3QgeHBjX3ZhcnNfcGFydCAqeHBjX3ZhcnNfcGFydDsKLWV4dGVybiBzdHJ1Y3QgeHBjX3BhcnRpdGlvbiB4cGNfcGFydGl0aW9uc1tYUF9NQVhfUEFSVElUSU9OUyArIDFdOwotZXh0ZXJuIGNoYXIgeHBjX3JlbW90ZV9jb3B5X2J1ZmZlcltdOwotZXh0ZXJuIHN0cnVjdCB4cGNfcnN2ZF9wYWdlICp4cGNfcnN2ZF9wYWdlX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCB4cGNfYWxsb3dfSVBJX29wcyh2b2lkKTsKLWV4dGVybiB2b2lkIHhwY19yZXN0cmljdF9JUElfb3BzKHZvaWQpOwotZXh0ZXJuIGludCB4cGNfaWRlbnRpZnlfYWN0X0lSUV9zZW5kZXIodm9pZCk7Ci1leHRlcm4gaW50IHhwY19wYXJ0aXRpb25fZGlzZW5nYWdlZChzdHJ1Y3QgeHBjX3BhcnRpdGlvbiAqKTsKLWV4dGVybiBlbnVtIHhwY19yZXR2YWwgeHBjX21hcmtfcGFydGl0aW9uX2FjdGl2ZShzdHJ1Y3QgeHBjX3BhcnRpdGlvbiAqKTsKLWV4dGVybiB2b2lkIHhwY19tYXJrX3BhcnRpdGlvbl9pbmFjdGl2ZShzdHJ1Y3QgeHBjX3BhcnRpdGlvbiAqKTsKLWV4dGVybiB2b2lkIHhwY19kaXNjb3Zlcnkodm9pZCk7Ci1leHRlcm4gdm9pZCB4cGNfY2hlY2tfcmVtb3RlX2hiKHZvaWQpOwotZXh0ZXJuIHZvaWQgeHBjX2RlYWN0aXZhdGVfcGFydGl0aW9uKGNvbnN0IGludCwgc3RydWN0IHhwY19wYXJ0aXRpb24gKiwKLQkJCQkJCWVudW0geHBjX3JldHZhbCk7Ci1leHRlcm4gZW51bSB4cGNfcmV0dmFsIHhwY19pbml0aWF0ZV9wYXJ0aWRfdG9fbmFzaWRzKHBhcnRpZF90LCB2b2lkICopOwotCi0KLS8qIGZvdW5kIGluIHhwY19jaGFubmVsLmMgKi8KLWV4dGVybiB2b2lkIHhwY19pbml0aWF0ZV9jb25uZWN0KGludCk7Ci1leHRlcm4gdm9pZCB4cGNfaW5pdGlhdGVfZGlzY29ubmVjdChpbnQpOwotZXh0ZXJuIGVudW0geHBjX3JldHZhbCB4cGNfaW5pdGlhdGVfYWxsb2NhdGUocGFydGlkX3QsIGludCwgdTMyLCB2b2lkICoqKTsKLWV4dGVybiBlbnVtIHhwY19yZXR2YWwgeHBjX2luaXRpYXRlX3NlbmQocGFydGlkX3QsIGludCwgdm9pZCAqKTsKLWV4dGVybiBlbnVtIHhwY19yZXR2YWwgeHBjX2luaXRpYXRlX3NlbmRfbm90aWZ5KHBhcnRpZF90LCBpbnQsIHZvaWQgKiwKLQkJCQkJCXhwY19ub3RpZnlfZnVuYywgdm9pZCAqKTsKLWV4dGVybiB2b2lkIHhwY19pbml0aWF0ZV9yZWNlaXZlZChwYXJ0aWRfdCwgaW50LCB2b2lkICopOwotZXh0ZXJuIGVudW0geHBjX3JldHZhbCB4cGNfc2V0dXBfaW5mcmFzdHJ1Y3R1cmUoc3RydWN0IHhwY19wYXJ0aXRpb24gKik7Ci1leHRlcm4gZW51bSB4cGNfcmV0dmFsIHhwY19wdWxsX3JlbW90ZV92YXJzX3BhcnQoc3RydWN0IHhwY19wYXJ0aXRpb24gKik7Ci1leHRlcm4gdm9pZCB4cGNfcHJvY2Vzc19jaGFubmVsX2FjdGl2aXR5KHN0cnVjdCB4cGNfcGFydGl0aW9uICopOwotZXh0ZXJuIHZvaWQgeHBjX2Nvbm5lY3RlZF9jYWxsb3V0KHN0cnVjdCB4cGNfY2hhbm5lbCAqKTsKLWV4dGVybiB2b2lkIHhwY19kZWxpdmVyX21zZyhzdHJ1Y3QgeHBjX2NoYW5uZWwgKik7Ci1leHRlcm4gdm9pZCB4cGNfZGlzY29ubmVjdF9jaGFubmVsKGNvbnN0IGludCwgc3RydWN0IHhwY19jaGFubmVsICosCi0JCQkJCWVudW0geHBjX3JldHZhbCwgdW5zaWduZWQgbG9uZyAqKTsKLWV4dGVybiB2b2lkIHhwY19kaXNjb25uZWN0aW5nX2NhbGxvdXQoc3RydWN0IHhwY19jaGFubmVsICopOwotZXh0ZXJuIHZvaWQgeHBjX3BhcnRpdGlvbl9nb2luZ19kb3duKHN0cnVjdCB4cGNfcGFydGl0aW9uICosIGVudW0geHBjX3JldHZhbCk7Ci1leHRlcm4gdm9pZCB4cGNfdGVhcmRvd25faW5mcmFzdHJ1Y3R1cmUoc3RydWN0IHhwY19wYXJ0aXRpb24gKik7Ci0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXhwY193YWtldXBfY2hhbm5lbF9tZ3Ioc3RydWN0IHhwY19wYXJ0aXRpb24gKnBhcnQpCi17Ci0JaWYgKGF0b21pY19pbmNfcmV0dXJuKCZwYXJ0LT5jaGFubmVsX21ncl9yZXF1ZXN0cykgPT0gMSkgewotCQl3YWtlX3VwKCZwYXJ0LT5jaGFubmVsX21ncl93cSk7Ci0JfQotfQotCi0KLQotLyoKLSAqIFRoZXNlIG5leHQgdHdvIGlubGluZXMgYXJlIHVzZWQgdG8ga2VlcCB1cyBmcm9tIHRlYXJpbmcgZG93biBhIGNoYW5uZWwncwotICogbXNnIHF1ZXVlcyB3aGlsZSBhIHRocmVhZCBtYXkgYmUgcmVmZXJlbmNpbmcgdGhlbS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkCi14cGNfbXNncXVldWVfcmVmKHN0cnVjdCB4cGNfY2hhbm5lbCAqY2gpCi17Ci0JYXRvbWljX2luYygmY2gtPnJlZmVyZW5jZXMpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXhwY19tc2dxdWV1ZV9kZXJlZihzdHJ1Y3QgeHBjX2NoYW5uZWwgKmNoKQotewotCXMzMiByZWZzID0gYXRvbWljX2RlY19yZXR1cm4oJmNoLT5yZWZlcmVuY2VzKTsKLQotCURCVUdfT04ocmVmcyA8IDApOwotCWlmIChyZWZzID09IDApIHsKLQkJeHBjX3dha2V1cF9jaGFubmVsX21ncigmeHBjX3BhcnRpdGlvbnNbY2gtPnBhcnRpZF0pOwotCX0KLX0KLQotCi0KLSNkZWZpbmUgWFBDX0RJU0NPTk5FQ1RfQ0hBTk5FTChfY2gsIF9yZWFzb24sIF9pcnFmbGdzKSBcCi0JCXhwY19kaXNjb25uZWN0X2NoYW5uZWwoX19MSU5FX18sIF9jaCwgX3JlYXNvbiwgX2lycWZsZ3MpCi0KLQotLyoKLSAqIFRoZXNlIHR3byBpbmxpbmVzIGFyZSB1c2VkIHRvIGtlZXAgdXMgZnJvbSB0ZWFyaW5nIGRvd24gYSBwYXJ0aXRpb24ncwotICogc2V0dXAgaW5mcmFzdHJ1Y3R1cmUgd2hpbGUgYSB0aHJlYWQgbWF5IGJlIHJlZmVyZW5jaW5nIGl0LgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLXhwY19wYXJ0X2RlcmVmKHN0cnVjdCB4cGNfcGFydGl0aW9uICpwYXJ0KQotewotCXMzMiByZWZzID0gYXRvbWljX2RlY19yZXR1cm4oJnBhcnQtPnJlZmVyZW5jZXMpOwotCi0KLQlEQlVHX09OKHJlZnMgPCAwKTsKLQlpZiAocmVmcyA9PSAwICYmIHBhcnQtPnNldHVwX3N0YXRlID09IFhQQ19QX1dURUFSRE9XTikgewotCQl3YWtlX3VwKCZwYXJ0LT50ZWFyZG93bl93cSk7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIGludAoteHBjX3BhcnRfcmVmKHN0cnVjdCB4cGNfcGFydGl0aW9uICpwYXJ0KQotewotCWludCBzZXR1cDsKLQotCi0JYXRvbWljX2luYygmcGFydC0+cmVmZXJlbmNlcyk7Ci0Jc2V0dXAgPSAocGFydC0+c2V0dXBfc3RhdGUgPT0gWFBDX1BfU0VUVVApOwotCWlmICghc2V0dXApIHsKLQkJeHBjX3BhcnRfZGVyZWYocGFydCk7Ci0JfQotCXJldHVybiBzZXR1cDsKLX0KLQotCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIG1hY3JvIGlzIHRvIGJlIHVzZWQgZm9yIHRoZSBzZXR0aW5nIG9mIHRoZSByZWFzb24gYW5kCi0gKiByZWFzb25fbGluZSBmaWVsZHMgaW4gYm90aCB0aGUgc3RydWN0IHhwY19jaGFubmVsIGFuZCBzdHJ1Y3QgeHBjX3BhcnRpdGlvbgotICogc3RydWN0dXJlcy4KLSAqLwotI2RlZmluZSBYUENfU0VUX1JFQVNPTihfcCwgX3JlYXNvbiwgX2xpbmUpIFwKLQl7IFwKLQkJKF9wKS0+cmVhc29uID0gX3JlYXNvbjsgXAotCQkoX3ApLT5yZWFzb25fbGluZSA9IF9saW5lOyBcCi0JfQotCi0KLQotLyoKLSAqIFRoaXMgbmV4dCBzZXQgb2YgaW5saW5lcyBhcmUgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoZW4gYSBwYXJ0aXRpb24gaXMKLSAqIHBvdGVudGlhbGx5IGVuZ2FnZWQgaW4gYWNjZXNzaW5nIG1lbW9yeSBiZWxvbmdpbmcgdG8gYW5vdGhlciBwYXJ0aXRpb24uCi0gKi8KLQotc3RhdGljIGlubGluZSB2b2lkCi14cGNfbWFya19wYXJ0aXRpb25fZW5nYWdlZChzdHJ1Y3QgeHBjX3BhcnRpdGlvbiAqcGFydCkKLXsKLQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKLQlBTU9fdCAqYW1vID0gKEFNT190ICopIF9fdmEocGFydC0+cmVtb3RlX2Ftb3NfcGFnZV9wYSArCi0JCQkJKFhQQ19FTkdBR0VEX1BBUlRJVElPTlNfQU1PICogc2l6ZW9mKEFNT190KSkpOwotCi0KLQlsb2NhbF9pcnFfc2F2ZShpcnFfZmxhZ3MpOwotCi0JLyogc2V0IGJpdCBjb3JyZXNwb25kaW5nIHRvIG91ciBwYXJ0aWQgaW4gcmVtb3RlIHBhcnRpdGlvbidzIEFNTyAqLwotCUZFVENIT1BfU1RPUkVfT1AoVE9fQU1PKCh1NjQpICZhbW8tPnZhcmlhYmxlKSwgRkVUQ0hPUF9PUiwKLQkJCQkJCSgxVUwgPDwgc25fcGFydGl0aW9uX2lkKSk7Ci0JLyoKLQkgKiBXZSBtdXN0IGFsd2F5cyB1c2UgdGhlIG5vZmF1bHQgZnVuY3Rpb24gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlCi0JICogYXJlIG9uIGEgU2h1YiAxLjEgc3lzdGVtIG9yIGEgU2h1YiAxLjIgc2xpY2UgMHhjIHByb2Nlc3Nvci4gSWYgd2UKLQkgKiBkaWRuJ3QsIHdlJ2QgbmV2ZXIga25vdyB0aGF0IHRoZSBvdGhlciBwYXJ0aXRpb24gaXMgZG93biBhbmQgd291bGQKLQkgKiBrZWVwIHNlbmRpbmcgSVBJcyBhbmQgQU1PcyB0byBpdCB1bnRpbCB0aGUgaGVhcnRiZWF0IHRpbWVzIG91dC4KLQkgKi8KLQkodm9pZCkgeHBfbm9mYXVsdF9QSU9SKCh1NjQgKikgR0xPQkFMX01NUl9BRERSKE5BU0lEX0dFVCgmYW1vLT4KLQkJCQl2YXJpYWJsZSksIHhwX25vZmF1bHRfUElPUl90YXJnZXQpKTsKLQotCWxvY2FsX2lycV9yZXN0b3JlKGlycV9mbGFncyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAoteHBjX21hcmtfcGFydGl0aW9uX2Rpc2VuZ2FnZWQoc3RydWN0IHhwY19wYXJ0aXRpb24gKnBhcnQpCi17Ci0JdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7Ci0JQU1PX3QgKmFtbyA9IChBTU9fdCAqKSBfX3ZhKHBhcnQtPnJlbW90ZV9hbW9zX3BhZ2VfcGEgKwotCQkJCShYUENfRU5HQUdFRF9QQVJUSVRJT05TX0FNTyAqIHNpemVvZihBTU9fdCkpKTsKLQotCi0JbG9jYWxfaXJxX3NhdmUoaXJxX2ZsYWdzKTsKLQotCS8qIGNsZWFyIGJpdCBjb3JyZXNwb25kaW5nIHRvIG91ciBwYXJ0aWQgaW4gcmVtb3RlIHBhcnRpdGlvbidzIEFNTyAqLwotCUZFVENIT1BfU1RPUkVfT1AoVE9fQU1PKCh1NjQpICZhbW8tPnZhcmlhYmxlKSwgRkVUQ0hPUF9BTkQsCi0JCQkJCQl+KDFVTCA8PCBzbl9wYXJ0aXRpb25faWQpKTsKLQkvKgotCSAqIFdlIG11c3QgYWx3YXlzIHVzZSB0aGUgbm9mYXVsdCBmdW5jdGlvbiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2UKLQkgKiBhcmUgb24gYSBTaHViIDEuMSBzeXN0ZW0gb3IgYSBTaHViIDEuMiBzbGljZSAweGMgcHJvY2Vzc29yLiBJZiB3ZQotCSAqIGRpZG4ndCwgd2UnZCBuZXZlciBrbm93IHRoYXQgdGhlIG90aGVyIHBhcnRpdGlvbiBpcyBkb3duIGFuZCB3b3VsZAotCSAqIGtlZXAgc2VuZGluZyBJUElzIGFuZCBBTU9zIHRvIGl0IHVudGlsIHRoZSBoZWFydGJlYXQgdGltZXMgb3V0LgotCSAqLwotCSh2b2lkKSB4cF9ub2ZhdWx0X1BJT1IoKHU2NCAqKSBHTE9CQUxfTU1SX0FERFIoTkFTSURfR0VUKCZhbW8tPgotCQkJCXZhcmlhYmxlKSwgeHBfbm9mYXVsdF9QSU9SX3RhcmdldCkpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoaXJxX2ZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi14cGNfcmVxdWVzdF9wYXJ0aXRpb25fZGlzZW5nYWdlKHN0cnVjdCB4cGNfcGFydGl0aW9uICpwYXJ0KQotewotCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwotCUFNT190ICphbW8gPSAoQU1PX3QgKikgX192YShwYXJ0LT5yZW1vdGVfYW1vc19wYWdlX3BhICsKLQkJCQkoWFBDX0RJU0VOR0FHRV9SRVFVRVNUX0FNTyAqIHNpemVvZihBTU9fdCkpKTsKLQotCi0JbG9jYWxfaXJxX3NhdmUoaXJxX2ZsYWdzKTsKLQotCS8qIHNldCBiaXQgY29ycmVzcG9uZGluZyB0byBvdXIgcGFydGlkIGluIHJlbW90ZSBwYXJ0aXRpb24ncyBBTU8gKi8KLQlGRVRDSE9QX1NUT1JFX09QKFRPX0FNTygodTY0KSAmYW1vLT52YXJpYWJsZSksIEZFVENIT1BfT1IsCi0JCQkJCQkoMVVMIDw8IHNuX3BhcnRpdGlvbl9pZCkpOwotCS8qCi0JICogV2UgbXVzdCBhbHdheXMgdXNlIHRoZSBub2ZhdWx0IGZ1bmN0aW9uIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZQotCSAqIGFyZSBvbiBhIFNodWIgMS4xIHN5c3RlbSBvciBhIFNodWIgMS4yIHNsaWNlIDB4YyBwcm9jZXNzb3IuIElmIHdlCi0JICogZGlkbid0LCB3ZSdkIG5ldmVyIGtub3cgdGhhdCB0aGUgb3RoZXIgcGFydGl0aW9uIGlzIGRvd24gYW5kIHdvdWxkCi0JICoga2VlcCBzZW5kaW5nIElQSXMgYW5kIEFNT3MgdG8gaXQgdW50aWwgdGhlIGhlYXJ0YmVhdCB0aW1lcyBvdXQuCi0JICovCi0JKHZvaWQpIHhwX25vZmF1bHRfUElPUigodTY0ICopIEdMT0JBTF9NTVJfQUREUihOQVNJRF9HRVQoJmFtby0+Ci0JCQkJdmFyaWFibGUpLCB4cF9ub2ZhdWx0X1BJT1JfdGFyZ2V0KSk7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShpcnFfZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXhwY19jYW5jZWxfcGFydGl0aW9uX2Rpc2VuZ2FnZV9yZXF1ZXN0KHN0cnVjdCB4cGNfcGFydGl0aW9uICpwYXJ0KQotewotCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwotCUFNT190ICphbW8gPSAoQU1PX3QgKikgX192YShwYXJ0LT5yZW1vdGVfYW1vc19wYWdlX3BhICsKLQkJCQkoWFBDX0RJU0VOR0FHRV9SRVFVRVNUX0FNTyAqIHNpemVvZihBTU9fdCkpKTsKLQotCi0JbG9jYWxfaXJxX3NhdmUoaXJxX2ZsYWdzKTsKLQotCS8qIGNsZWFyIGJpdCBjb3JyZXNwb25kaW5nIHRvIG91ciBwYXJ0aWQgaW4gcmVtb3RlIHBhcnRpdGlvbidzIEFNTyAqLwotCUZFVENIT1BfU1RPUkVfT1AoVE9fQU1PKCh1NjQpICZhbW8tPnZhcmlhYmxlKSwgRkVUQ0hPUF9BTkQsCi0JCQkJCQl+KDFVTCA8PCBzbl9wYXJ0aXRpb25faWQpKTsKLQkvKgotCSAqIFdlIG11c3QgYWx3YXlzIHVzZSB0aGUgbm9mYXVsdCBmdW5jdGlvbiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2UKLQkgKiBhcmUgb24gYSBTaHViIDEuMSBzeXN0ZW0gb3IgYSBTaHViIDEuMiBzbGljZSAweGMgcHJvY2Vzc29yLiBJZiB3ZQotCSAqIGRpZG4ndCwgd2UnZCBuZXZlciBrbm93IHRoYXQgdGhlIG90aGVyIHBhcnRpdGlvbiBpcyBkb3duIGFuZCB3b3VsZAotCSAqIGtlZXAgc2VuZGluZyBJUElzIGFuZCBBTU9zIHRvIGl0IHVudGlsIHRoZSBoZWFydGJlYXQgdGltZXMgb3V0LgotCSAqLwotCSh2b2lkKSB4cF9ub2ZhdWx0X1BJT1IoKHU2NCAqKSBHTE9CQUxfTU1SX0FERFIoTkFTSURfR0VUKCZhbW8tPgotCQkJCXZhcmlhYmxlKSwgeHBfbm9mYXVsdF9QSU9SX3RhcmdldCkpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoaXJxX2ZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSB1NjQKLXhwY19wYXJ0aXRpb25fZW5nYWdlZCh1NjQgcGFydGlkX21hc2spCi17Ci0JQU1PX3QgKmFtbyA9IHhwY192YXJzLT5hbW9zX3BhZ2UgKyBYUENfRU5HQUdFRF9QQVJUSVRJT05TX0FNTzsKLQotCi0JLyogcmV0dXJuIG91ciBwYXJ0aXRpb24ncyBBTU8gdmFyaWFibGUgQU5EZWQgd2l0aCBwYXJ0aWRfbWFzayAqLwotCXJldHVybiAoRkVUQ0hPUF9MT0FEX09QKFRPX0FNTygodTY0KSAmYW1vLT52YXJpYWJsZSksIEZFVENIT1BfTE9BRCkgJgotCQkJCQkJCQlwYXJ0aWRfbWFzayk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTY0Ci14cGNfcGFydGl0aW9uX2Rpc2VuZ2FnZV9yZXF1ZXN0ZWQodTY0IHBhcnRpZF9tYXNrKQotewotCUFNT190ICphbW8gPSB4cGNfdmFycy0+YW1vc19wYWdlICsgWFBDX0RJU0VOR0FHRV9SRVFVRVNUX0FNTzsKLQotCi0JLyogcmV0dXJuIG91ciBwYXJ0aXRpb24ncyBBTU8gdmFyaWFibGUgQU5EZWQgd2l0aCBwYXJ0aWRfbWFzayAqLwotCXJldHVybiAoRkVUQ0hPUF9MT0FEX09QKFRPX0FNTygodTY0KSAmYW1vLT52YXJpYWJsZSksIEZFVENIT1BfTE9BRCkgJgotCQkJCQkJCQlwYXJ0aWRfbWFzayk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAoteHBjX2NsZWFyX3BhcnRpdGlvbl9lbmdhZ2VkKHU2NCBwYXJ0aWRfbWFzaykKLXsKLQlBTU9fdCAqYW1vID0geHBjX3ZhcnMtPmFtb3NfcGFnZSArIFhQQ19FTkdBR0VEX1BBUlRJVElPTlNfQU1POwotCi0KLQkvKiBjbGVhciBiaXQocykgYmFzZWQgb24gcGFydGlkX21hc2sgaW4gb3VyIHBhcnRpdGlvbidzIEFNTyAqLwotCUZFVENIT1BfU1RPUkVfT1AoVE9fQU1PKCh1NjQpICZhbW8tPnZhcmlhYmxlKSwgRkVUQ0hPUF9BTkQsCi0JCQkJCQkJCX5wYXJ0aWRfbWFzayk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAoteHBjX2NsZWFyX3BhcnRpdGlvbl9kaXNlbmdhZ2VfcmVxdWVzdCh1NjQgcGFydGlkX21hc2spCi17Ci0JQU1PX3QgKmFtbyA9IHhwY192YXJzLT5hbW9zX3BhZ2UgKyBYUENfRElTRU5HQUdFX1JFUVVFU1RfQU1POwotCi0KLQkvKiBjbGVhciBiaXQocykgYmFzZWQgb24gcGFydGlkX21hc2sgaW4gb3VyIHBhcnRpdGlvbidzIEFNTyAqLwotCUZFVENIT1BfU1RPUkVfT1AoVE9fQU1PKCh1NjQpICZhbW8tPnZhcmlhYmxlKSwgRkVUQ0hPUF9BTkQsCi0JCQkJCQkJCX5wYXJ0aWRfbWFzayk7Ci19Ci0KLQotCi0vKgotICogVGhlIGZvbGxvd2luZyBzZXQgb2YgbWFjcm9zIGFuZCBpbmxpbmVzIGFyZSB1c2VkIGZvciB0aGUgc2VuZGluZyBhbmQKLSAqIHJlY2VpdmluZyBvZiBJUElzIChhbHNvIGtub3duIGFzIElSUXMpLiBUaGVyZSBhcmUgdHdvIGZsYXZvcnMgb2YgSVBJcywKLSAqIG9uZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBwYXJ0aXRpb24gYWN0aXZpdHkgKFNHSV9YUENfQUNUSVZBVEUpIGFuZAotICogdGhlIG90aGVyIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGNoYW5uZWwgYWN0aXZpdHkgKFNHSV9YUENfTk9USUZZKS4KLSAqLwotCi1zdGF0aWMgaW5saW5lIHU2NAoteHBjX0lQSV9yZWNlaXZlKEFNT190ICphbW8pCi17Ci0JcmV0dXJuIEZFVENIT1BfTE9BRF9PUChUT19BTU8oKHU2NCkgJmFtby0+dmFyaWFibGUpLCBGRVRDSE9QX0NMRUFSKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIGVudW0geHBjX3JldHZhbAoteHBjX0lQSV9zZW5kKEFNT190ICphbW8sIHU2NCBmbGFnLCBpbnQgbmFzaWQsIGludCBwaHlzX2NwdWlkLCBpbnQgdmVjdG9yKQotewotCWludCByZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwotCi0KLQlsb2NhbF9pcnFfc2F2ZShpcnFfZmxhZ3MpOwotCi0JRkVUQ0hPUF9TVE9SRV9PUChUT19BTU8oKHU2NCkgJmFtby0+dmFyaWFibGUpLCBGRVRDSE9QX09SLCBmbGFnKTsKLQlzbl9zZW5kX0lQSV9waHlzKG5hc2lkLCBwaHlzX2NwdWlkLCB2ZWN0b3IsIDApOwotCi0JLyoKLQkgKiBXZSBtdXN0IGFsd2F5cyB1c2UgdGhlIG5vZmF1bHQgZnVuY3Rpb24gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlCi0JICogYXJlIG9uIGEgU2h1YiAxLjEgc3lzdGVtIG9yIGEgU2h1YiAxLjIgc2xpY2UgMHhjIHByb2Nlc3Nvci4gSWYgd2UKLQkgKiBkaWRuJ3QsIHdlJ2QgbmV2ZXIga25vdyB0aGF0IHRoZSBvdGhlciBwYXJ0aXRpb24gaXMgZG93biBhbmQgd291bGQKLQkgKiBrZWVwIHNlbmRpbmcgSVBJcyBhbmQgQU1PcyB0byBpdCB1bnRpbCB0aGUgaGVhcnRiZWF0IHRpbWVzIG91dC4KLQkgKi8KLQlyZXQgPSB4cF9ub2ZhdWx0X1BJT1IoKHU2NCAqKSBHTE9CQUxfTU1SX0FERFIoTkFTSURfR0VUKCZhbW8tPnZhcmlhYmxlKSwKLQkJCQl4cF9ub2ZhdWx0X1BJT1JfdGFyZ2V0KSk7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShpcnFfZmxhZ3MpOwotCi0JcmV0dXJuICgocmV0ID09IDApID8geHBjU3VjY2VzcyA6IHhwY1Bpb1JlYWRFcnJvcik7Ci19Ci0KLQotLyoKLSAqIElQSXMgYXNzb2NpYXRlZCB3aXRoIFNHSV9YUENfQUNUSVZBVEUgSVJRLgotICovCi0KLS8qCi0gKiBGbGFnIHRoZSBhcHByb3ByaWF0ZSBBTU8gdmFyaWFibGUgYW5kIHNlbmQgYW4gSVBJIHRvIHRoZSBzcGVjaWZpZWQgbm9kZS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkCi14cGNfYWN0aXZhdGVfSVJRX3NlbmQodTY0IGFtb3NfcGFnZV9wYSwgaW50IGZyb21fbmFzaWQsIGludCB0b19uYXNpZCwKLQkJCWludCB0b19waHlzX2NwdWlkKQotewotCWludCB3X2luZGV4ID0gWFBDX05BU0lEX1dfSU5ERVgoZnJvbV9uYXNpZCk7Ci0JaW50IGJfaW5kZXggPSBYUENfTkFTSURfQl9JTkRFWChmcm9tX25hc2lkKTsKLQlBTU9fdCAqYW1vcyA9IChBTU9fdCAqKSBfX3ZhKGFtb3NfcGFnZV9wYSArCi0JCQkJKFhQQ19BQ1RJVkFURV9JUlFfQU1PUyAqIHNpemVvZihBTU9fdCkpKTsKLQotCi0JKHZvaWQpIHhwY19JUElfc2VuZCgmYW1vc1t3X2luZGV4XSwgKDFVTCA8PCBiX2luZGV4KSwgdG9fbmFzaWQsCi0JCQkJdG9fcGh5c19jcHVpZCwgU0dJX1hQQ19BQ1RJVkFURSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAoteHBjX0lQSV9zZW5kX2FjdGl2YXRlKHN0cnVjdCB4cGNfdmFycyAqdmFycykKLXsKLQl4cGNfYWN0aXZhdGVfSVJRX3NlbmQodmFycy0+YW1vc19wYWdlX3BhLCBjbm9kZWlkX3RvX25hc2lkKDApLAotCQkJCXZhcnMtPmFjdF9uYXNpZCwgdmFycy0+YWN0X3BoeXNfY3B1aWQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXhwY19JUElfc2VuZF9hY3RpdmF0ZWQoc3RydWN0IHhwY19wYXJ0aXRpb24gKnBhcnQpCi17Ci0JeHBjX2FjdGl2YXRlX0lSUV9zZW5kKHBhcnQtPnJlbW90ZV9hbW9zX3BhZ2VfcGEsIGNub2RlaWRfdG9fbmFzaWQoMCksCi0JCQlwYXJ0LT5yZW1vdGVfYWN0X25hc2lkLCBwYXJ0LT5yZW1vdGVfYWN0X3BoeXNfY3B1aWQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXhwY19JUElfc2VuZF9yZWFjdGl2YXRlKHN0cnVjdCB4cGNfcGFydGl0aW9uICpwYXJ0KQotewotCXhwY19hY3RpdmF0ZV9JUlFfc2VuZCh4cGNfdmFycy0+YW1vc19wYWdlX3BhLCBwYXJ0LT5yZWFjdGl2YXRlX25hc2lkLAotCQkJCXhwY192YXJzLT5hY3RfbmFzaWQsIHhwY192YXJzLT5hY3RfcGh5c19jcHVpZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAoteHBjX0lQSV9zZW5kX2Rpc2VuZ2FnZShzdHJ1Y3QgeHBjX3BhcnRpdGlvbiAqcGFydCkKLXsKLQl4cGNfYWN0aXZhdGVfSVJRX3NlbmQocGFydC0+cmVtb3RlX2Ftb3NfcGFnZV9wYSwgY25vZGVpZF90b19uYXNpZCgwKSwKLQkJCXBhcnQtPnJlbW90ZV9hY3RfbmFzaWQsIHBhcnQtPnJlbW90ZV9hY3RfcGh5c19jcHVpZCk7Ci19Ci0KLQotLyoKLSAqIElQSXMgYXNzb2NpYXRlZCB3aXRoIFNHSV9YUENfTk9USUZZIElSUS4KLSAqLwotCi0vKgotICogU2VuZCBhbiBJUEkgdG8gdGhlIHJlbW90ZSBwYXJ0aXRpb24gdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlCi0gKiBzcGVjaWZpZWQgY2hhbm5lbC4KLSAqLwotI2RlZmluZSBYUENfTk9USUZZX0lSUV9TRU5EKF9jaCwgX2lwaV9mLCBfaXJxX2YpIFwKLQkJeHBjX25vdGlmeV9JUlFfc2VuZChfY2gsIF9pcGlfZiwgI19pcGlfZiwgX2lycV9mKQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXhwY19ub3RpZnlfSVJRX3NlbmQoc3RydWN0IHhwY19jaGFubmVsICpjaCwgdTggaXBpX2ZsYWcsIGNoYXIgKmlwaV9mbGFnX3N0cmluZywKLQkJCXVuc2lnbmVkIGxvbmcgKmlycV9mbGFncykKLXsKLQlzdHJ1Y3QgeHBjX3BhcnRpdGlvbiAqcGFydCA9ICZ4cGNfcGFydGl0aW9uc1tjaC0+cGFydGlkXTsKLQllbnVtIHhwY19yZXR2YWwgcmV0OwotCi0KLQlpZiAobGlrZWx5KHBhcnQtPmFjdF9zdGF0ZSAhPSBYUENfUF9ERUFDVElWQVRJTkcpKSB7Ci0JCXJldCA9IHhwY19JUElfc2VuZChwYXJ0LT5yZW1vdGVfSVBJX2Ftb192YSwKLQkJCQkJKHU2NCkgaXBpX2ZsYWcgPDwgKGNoLT5udW1iZXIgKiA4KSwKLQkJCQkJcGFydC0+cmVtb3RlX0lQSV9uYXNpZCwKLQkJCQkJcGFydC0+cmVtb3RlX0lQSV9waHlzX2NwdWlkLAotCQkJCQlTR0lfWFBDX05PVElGWSk7Ci0JCWRldl9kYmcoeHBjX2NoYW4sICIlcyBzZW50IHRvIHBhcnRpZD0lZCwgY2hhbm5lbD0lZCwgcmV0PSVkXG4iLAotCQkJaXBpX2ZsYWdfc3RyaW5nLCBjaC0+cGFydGlkLCBjaC0+bnVtYmVyLCByZXQpOwotCQlpZiAodW5saWtlbHkocmV0ICE9IHhwY1N1Y2Nlc3MpKSB7Ci0JCQlpZiAoaXJxX2ZsYWdzICE9IE5VTEwpIHsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+bG9jaywgKmlycV9mbGFncyk7Ci0JCQl9Ci0JCQlYUENfREVBQ1RJVkFURV9QQVJUSVRJT04ocGFydCwgcmV0KTsKLQkJCWlmIChpcnFfZmxhZ3MgIT0gTlVMTCkgewotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+bG9jaywgKmlycV9mbGFncyk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLQotLyoKLSAqIE1ha2UgaXQgbG9vayBsaWtlIHRoZSByZW1vdGUgcGFydGl0aW9uLCB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlCi0gKiBzcGVjaWZpZWQgY2hhbm5lbCwgc2VudCB1cyBhbiBJUEkuIFRoaXMgZmFrZWQgSVBJIHdpbGwgYmUgaGFuZGxlZAotICogYnkgeHBjX2Ryb3BwZWRfSVBJX2NoZWNrKCkuCi0gKi8KLSNkZWZpbmUgWFBDX05PVElGWV9JUlFfU0VORF9MT0NBTChfY2gsIF9pcGlfZikgXAotCQl4cGNfbm90aWZ5X0lSUV9zZW5kX2xvY2FsKF9jaCwgX2lwaV9mLCAjX2lwaV9mKQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXhwY19ub3RpZnlfSVJRX3NlbmRfbG9jYWwoc3RydWN0IHhwY19jaGFubmVsICpjaCwgdTggaXBpX2ZsYWcsCi0JCQkJY2hhciAqaXBpX2ZsYWdfc3RyaW5nKQotewotCXN0cnVjdCB4cGNfcGFydGl0aW9uICpwYXJ0ID0gJnhwY19wYXJ0aXRpb25zW2NoLT5wYXJ0aWRdOwotCi0KLQlGRVRDSE9QX1NUT1JFX09QKFRPX0FNTygodTY0KSAmcGFydC0+bG9jYWxfSVBJX2Ftb192YS0+dmFyaWFibGUpLAotCQkJRkVUQ0hPUF9PUiwgKCh1NjQpIGlwaV9mbGFnIDw8IChjaC0+bnVtYmVyICogOCkpKTsKLQlkZXZfZGJnKHhwY19jaGFuLCAiJXMgc2VudCBsb2NhbCBmcm9tIHBhcnRpZD0lZCwgY2hhbm5lbD0lZFxuIiwKLQkJaXBpX2ZsYWdfc3RyaW5nLCBjaC0+cGFydGlkLCBjaC0+bnVtYmVyKTsKLX0KLQotCi0vKgotICogVGhlIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBvZiBJUElzIGluY2x1ZGVzIHRoZSBzZXR0aW5nIG9mIGFuIEFNTyB2YXJpYWJsZQotICogdG8gaW5kaWNhdGUgdGhlIHJlYXNvbiB0aGUgSVBJIHdhcyBzZW50LiBUaGUgNjQtYml0IHZhcmlhYmxlIGlzIGRpdmlkZWQKLSAqIHVwIGludG8gZWlnaHQgYnl0ZXMsIG9yZGVyZWQgZnJvbSByaWdodCB0byBsZWZ0LiBCeXRlIHplcm8gcGVydGFpbnMgdG8KLSAqIGNoYW5uZWwgMCwgYnl0ZSBvbmUgdG8gY2hhbm5lbCAxLCBhbmQgc28gb24uIEVhY2ggYnl0ZSBpcyBkZXNjcmliZWQgYnkKLSAqIHRoZSBmb2xsb3dpbmcgSVBJIGZsYWdzLgotICovCi0KLSNkZWZpbmUJWFBDX0lQSV9DTE9TRVJFUVVFU1QJMHgwMQotI2RlZmluZQlYUENfSVBJX0NMT1NFUkVQTFkJMHgwMgotI2RlZmluZQlYUENfSVBJX09QRU5SRVFVRVNUCTB4MDQKLSNkZWZpbmUJWFBDX0lQSV9PUEVOUkVQTFkJMHgwOAotI2RlZmluZQlYUENfSVBJX01TR1JFUVVFU1QJMHgxMAotCi0KLS8qIGdpdmVuIGFuIEFNTyB2YXJpYWJsZSBhbmQgYSBjaGFubmVsIywgZ2V0IGl0cyBhc3NvY2lhdGVkIElQSSBmbGFncyAqLwotI2RlZmluZSBYUENfR0VUX0lQSV9GTEFHUyhfYW1vLCBfYykJKCh1OCkgKCgoX2FtbykgPj4gKChfYykgKiA4KSkgJiAweGZmKSkKLSNkZWZpbmUgWFBDX1NFVF9JUElfRkxBR1MoX2FtbywgX2MsIF9mKQkoX2FtbykgfD0gKCh1NjQpIChfZikgPDwgKChfYykgKiA4KSkKLQotI2RlZmluZQlYUENfQU5ZX09QRU5DTE9TRV9JUElfRkxBR1NfU0VUKF9hbW8pICgoX2FtbykgJiAweDBmMGYwZjBmMGYwZjBmMGYpCi0jZGVmaW5lIFhQQ19BTllfTVNHX0lQSV9GTEFHU19TRVQoX2FtbykgICAgICAgKChfYW1vKSAmIDB4MTAxMDEwMTAxMDEwMTAxMCkKLQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXhwY19JUElfc2VuZF9jbG9zZXJlcXVlc3Qoc3RydWN0IHhwY19jaGFubmVsICpjaCwgdW5zaWduZWQgbG9uZyAqaXJxX2ZsYWdzKQotewotCXN0cnVjdCB4cGNfb3BlbmNsb3NlX2FyZ3MgKmFyZ3MgPSBjaC0+bG9jYWxfb3BlbmNsb3NlX2FyZ3M7Ci0KLQotCWFyZ3MtPnJlYXNvbiA9IGNoLT5yZWFzb247Ci0KLQlYUENfTk9USUZZX0lSUV9TRU5EKGNoLCBYUENfSVBJX0NMT1NFUkVRVUVTVCwgaXJxX2ZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi14cGNfSVBJX3NlbmRfY2xvc2VyZXBseShzdHJ1Y3QgeHBjX2NoYW5uZWwgKmNoLCB1bnNpZ25lZCBsb25nICppcnFfZmxhZ3MpCi17Ci0JWFBDX05PVElGWV9JUlFfU0VORChjaCwgWFBDX0lQSV9DTE9TRVJFUExZLCBpcnFfZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXhwY19JUElfc2VuZF9vcGVucmVxdWVzdChzdHJ1Y3QgeHBjX2NoYW5uZWwgKmNoLCB1bnNpZ25lZCBsb25nICppcnFfZmxhZ3MpCi17Ci0Jc3RydWN0IHhwY19vcGVuY2xvc2VfYXJncyAqYXJncyA9IGNoLT5sb2NhbF9vcGVuY2xvc2VfYXJnczsKLQotCi0JYXJncy0+bXNnX3NpemUgPSBjaC0+bXNnX3NpemU7Ci0JYXJncy0+bG9jYWxfbmVudHJpZXMgPSBjaC0+bG9jYWxfbmVudHJpZXM7Ci0KLQlYUENfTk9USUZZX0lSUV9TRU5EKGNoLCBYUENfSVBJX09QRU5SRVFVRVNULCBpcnFfZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXhwY19JUElfc2VuZF9vcGVucmVwbHkoc3RydWN0IHhwY19jaGFubmVsICpjaCwgdW5zaWduZWQgbG9uZyAqaXJxX2ZsYWdzKQotewotCXN0cnVjdCB4cGNfb3BlbmNsb3NlX2FyZ3MgKmFyZ3MgPSBjaC0+bG9jYWxfb3BlbmNsb3NlX2FyZ3M7Ci0KLQotCWFyZ3MtPnJlbW90ZV9uZW50cmllcyA9IGNoLT5yZW1vdGVfbmVudHJpZXM7Ci0JYXJncy0+bG9jYWxfbmVudHJpZXMgPSBjaC0+bG9jYWxfbmVudHJpZXM7Ci0JYXJncy0+bG9jYWxfbXNncXVldWVfcGEgPSBfX3BhKGNoLT5sb2NhbF9tc2dxdWV1ZSk7Ci0KLQlYUENfTk9USUZZX0lSUV9TRU5EKGNoLCBYUENfSVBJX09QRU5SRVBMWSwgaXJxX2ZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi14cGNfSVBJX3NlbmRfbXNncmVxdWVzdChzdHJ1Y3QgeHBjX2NoYW5uZWwgKmNoKQotewotCVhQQ19OT1RJRllfSVJRX1NFTkQoY2gsIFhQQ19JUElfTVNHUkVRVUVTVCwgTlVMTCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAoteHBjX0lQSV9zZW5kX2xvY2FsX21zZ3JlcXVlc3Qoc3RydWN0IHhwY19jaGFubmVsICpjaCkKLXsKLQlYUENfTk9USUZZX0lSUV9TRU5EX0xPQ0FMKGNoLCBYUENfSVBJX01TR1JFUVVFU1QpOwotfQotCi0KLS8qCi0gKiBNZW1vcnkgZm9yIFhQQydzIEFNTyB2YXJpYWJsZXMgaXMgYWxsb2NhdGVkIGJ5IHRoZSBNU1BFQyBkcml2ZXIuIFRoZXNlCi0gKiBwYWdlcyBhcmUgbG9jYXRlZCBpbiB0aGUgbG93ZXN0IGdyYW51bGUuIFRoZSBsb3dlc3QgZ3JhbnVsZSB1c2VzIDRrIHBhZ2VzCi0gKiBmb3IgY2FjaGVkIHJlZmVyZW5jZXMgYW5kIGFuIGFsdGVybmF0ZSBUTEIgaGFuZGxlciB0byBuZXZlciBwcm92aWRlIGEKLSAqIGNhY2hlYWJsZSBtYXBwaW5nIGZvciB0aGUgZW50aXJlIHJlZ2lvbi4gVGhpcyB3aWxsIHByZXZlbnQgc3BlY3VsYXRpdmUKLSAqIHJlYWRpbmcgb2YgY2FjaGVkIGNvcGllcyBvZiBvdXIgbGluZXMgZnJvbSBiZWluZyBpc3N1ZWQgd2hpY2ggd2lsbCBjYXVzZQotICogYSBQSSBGU0IgUHJvdG9jb2wgZXJyb3IgdG8gYmUgZ2VuZXJhdGVkIGJ5IHRoZSBTSFVCLiBGb3IgWFBDLCB3ZSBuZWVkIDY0Ci0gKiBBTU8gdmFyaWFibGVzIChiYXNlZCBvbiBYUF9NQVhfUEFSVElUSU9OUykgZm9yIG1lc3NhZ2Ugbm90aWZpY2F0aW9uIGFuZCBhbgotICogYWRkaXRpb25hbCAxMjggQU1PIHZhcmlhYmxlcyAoYmFzZWQgb24gWFBfTkFTSURfTUFTS19XT1JEUykgZm9yIHBhcnRpdGlvbgotICogYWN0aXZhdGlvbiBhbmQgMiBBTU8gdmFyaWFibGVzIGZvciBwYXJ0aXRpb24gZGVhY3RpdmF0aW9uLgotICovCi1zdGF0aWMgaW5saW5lIEFNT190ICoKLXhwY19JUElfaW5pdChpbnQgaW5kZXgpCi17Ci0JQU1PX3QgKmFtbyA9IHhwY192YXJzLT5hbW9zX3BhZ2UgKyBpbmRleDsKLQotCi0JKHZvaWQpIHhwY19JUElfcmVjZWl2ZShhbW8pOwkvKiBjbGVhciBBTU8gdmFyaWFibGUgKi8KLQlyZXR1cm4gYW1vOwotfQotCi0KLQotc3RhdGljIGlubGluZSBlbnVtIHhwY19yZXR2YWwKLXhwY19tYXBfYnRlX2Vycm9ycyhidGVfcmVzdWx0X3QgZXJyb3IpCi17Ci0Jc3dpdGNoIChlcnJvcikgewotCWNhc2UgQlRFX1NVQ0NFU1M6CXJldHVybiB4cGNTdWNjZXNzOwotCWNhc2UgQlRFRkFJTF9ESVI6CXJldHVybiB4cGNCdGVEaXJlY3RvcnlFcnJvcjsKLQljYXNlIEJURUZBSUxfUE9JU09OOglyZXR1cm4geHBjQnRlUG9pc29uRXJyb3I7Ci0JY2FzZSBCVEVGQUlMX1dFUlI6CXJldHVybiB4cGNCdGVXcml0ZUVycm9yOwotCWNhc2UgQlRFRkFJTF9BQ0NFU1M6CXJldHVybiB4cGNCdGVBY2Nlc3NFcnJvcjsKLQljYXNlIEJURUZBSUxfUFdFUlI6CXJldHVybiB4cGNCdGVQV3JpdGVFcnJvcjsKLQljYXNlIEJURUZBSUxfUFJFUlI6CXJldHVybiB4cGNCdGVQUmVhZEVycm9yOwotCWNhc2UgQlRFRkFJTF9UT1VUOglyZXR1cm4geHBjQnRlVGltZU91dEVycm9yOwotCWNhc2UgQlRFRkFJTF9YVEVSUjoJcmV0dXJuIHhwY0J0ZVh0YWxrRXJyb3I7Ci0JY2FzZSBCVEVGQUlMX05PVEFWQUlMOglyZXR1cm4geHBjQnRlTm90QXZhaWxhYmxlOwotCWRlZmF1bHQ6CQlyZXR1cm4geHBjQnRlVW5tYXBwZWRFcnJvcjsKLQl9Ci19Ci0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgKgoteHBjX2ttYWxsb2NfY2FjaGVsaW5lX2FsaWduZWQoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCB2b2lkICoqYmFzZSkKLXsKLQkvKiBzZWUgaWYga21hbGxvYyB3aWxsIGdpdmUgdXMgY2FjaGxpbmUgYWxpZ25lZCBtZW1vcnkgYnkgZGVmYXVsdCAqLwotCSpiYXNlID0ga21hbGxvYyhzaXplLCBmbGFncyk7Ci0JaWYgKCpiYXNlID09IE5VTEwpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICgodTY0KSAqYmFzZSA9PSBMMV9DQUNIRV9BTElHTigodTY0KSAqYmFzZSkpIHsKLQkJcmV0dXJuICpiYXNlOwotCX0KLQlrZnJlZSgqYmFzZSk7Ci0KLQkvKiBub3BlLCB3ZSdsbCBoYXZlIHRvIGRvIGl0IG91cnNlbHZlcyAqLwotCSpiYXNlID0ga21hbGxvYyhzaXplICsgTDFfQ0FDSEVfQllURVMsIGZsYWdzKTsKLQlpZiAoKmJhc2UgPT0gTlVMTCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuICh2b2lkICopIEwxX0NBQ0hFX0FMSUdOKCh1NjQpICpiYXNlKTsKLX0KLQotCi0vKgotICogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGFueSBjaGFubmVsIGFjdGl2aXR5IHRvL2Zyb20gdGhlIHNwZWNpZmllZAotICogcGFydGl0aW9uLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLXhwY19jaGVja19mb3JfY2hhbm5lbF9hY3Rpdml0eShzdHJ1Y3QgeHBjX3BhcnRpdGlvbiAqcGFydCkKLXsKLQl1NjQgSVBJX2FtbzsKLQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKLQotCi0JSVBJX2FtbyA9IHhwY19JUElfcmVjZWl2ZShwYXJ0LT5sb2NhbF9JUElfYW1vX3ZhKTsKLQlpZiAoSVBJX2FtbyA9PSAwKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGFydC0+SVBJX2xvY2ssIGlycV9mbGFncyk7Ci0JcGFydC0+bG9jYWxfSVBJX2FtbyB8PSBJUElfYW1vOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhcnQtPklQSV9sb2NrLCBpcnFfZmxhZ3MpOwotCi0JZGV2X2RiZyh4cGNfY2hhbiwgInJlY2VpdmVkIElQSSBmcm9tIHBhcnRpZD0lZCwgSVBJX2Ftbz0weCVseFxuIiwKLQkJWFBDX1BBUlRJRChwYXJ0KSwgSVBJX2Ftbyk7Ci0KLQl4cGNfd2FrZXVwX2NoYW5uZWxfbWdyKHBhcnQpOwotfQotCi0KLSNlbmRpZiAvKiBfSUE2NF9TTl9LRVJORUxfWFBDX0ggKi8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfY2hhbm5lbC5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfY2hhbm5lbC5jCmluZGV4IGFiZjRmYzIuLjhkOTUwYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX2NoYW5uZWwuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL3hwY19jaGFubmVsLmMKQEAgLTMsNyArMyw3IEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICovCiAKIApAQCAtMjIsOSArMjIsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxhc20vc24vYnRlLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgotI2luY2x1ZGUgInhwYy5oIgorI2luY2x1ZGUgPGFzbS9zbi94cGMuaD4KIAogCiAvKgpAQCAtNTYsOCArNTgsOCBAQAogCQlhdG9taWNfc2V0KCZjaC0+bl90b19ub3RpZnksIDApOwogCiAJCXNwaW5fbG9ja19pbml0KCZjaC0+bG9jayk7Ci0JCXNlbWFfaW5pdCgmY2gtPm1zZ190b19wdWxsX3NlbWEsIDEpOwkvKiBtdXRleCAqLwotCQlzZW1hX2luaXQoJmNoLT53ZGlzY29ubmVjdF9zZW1hLCAwKTsJLyogZXZlbnQgd2FpdCAqLworCQltdXRleF9pbml0KCZjaC0+bXNnX3RvX3B1bGxfbXV0ZXgpOworCQlpbml0X2NvbXBsZXRpb24oJmNoLT53ZGlzY29ubmVjdF93YWl0KTsKIAogCQlhdG9taWNfc2V0KCZjaC0+bl9vbl9tc2dfYWxsb2NhdGVfd3EsIDApOwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaC0+bXNnX2FsbG9jYXRlX3dxKTsKQEAgLTUzNCw3ICs1MzYsNiBAQAogeHBjX2FsbG9jYXRlX21zZ3F1ZXVlcyhzdHJ1Y3QgeHBjX2NoYW5uZWwgKmNoKQogewogCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwotCWludCBpOwogCWVudW0geHBjX3JldHZhbCByZXQ7CiAKIApAQCAtNTUyLDExICs1NTMsNiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBjaC0+bG9jYWxfbmVudHJpZXM7IGkrKykgewotCQkvKiB1c2UgYSBzZW1hcGhvcmUgYXMgYW4gZXZlbnQgd2FpdCBxdWV1ZSAqLwotCQlzZW1hX2luaXQoJmNoLT5ub3RpZnlfcXVldWVbaV0uc2VtYSwgMCk7Ci0JfQotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5sb2NrLCBpcnFfZmxhZ3MpOwogCWNoLT5mbGFncyB8PSBYUENfQ19TRVRVUDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+bG9jaywgaXJxX2ZsYWdzKTsKQEAgLTc3OSw2ICs3NzUsMTIgQEAKIAogCS8qIGJvdGggc2lkZXMgYXJlIGRpc2Nvbm5lY3RlZCBub3cgKi8KIAorCWlmIChjaC0+ZmxhZ3MgJiBYUENfQ19DT05ORUNUQ0FMTE9VVCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+bG9jaywgKmlycV9mbGFncyk7CisJCXhwY19kaXNjb25uZWN0X2NhbGxvdXQoY2gsIHhwY0Rpc2Nvbm5lY3RlZCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+bG9jaywgKmlycV9mbGFncyk7CisJfQorCiAJLyogaXQncyBub3cgc2FmZSB0byBmcmVlIHRoZSBjaGFubmVsJ3MgbWVzc2FnZSBxdWV1ZXMgKi8KIAl4cGNfZnJlZV9tc2dxdWV1ZXMoY2gpOwogCkBAIC03OTMsMTAgKzc5NSw4IEBACiAJfQogCiAJaWYgKGNoLT5mbGFncyAmIFhQQ19DX1dESVNDT05ORUNUKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5sb2NrLCAqaXJxX2ZsYWdzKTsKLQkJdXAoJmNoLT53ZGlzY29ubmVjdF9zZW1hKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5sb2NrLCAqaXJxX2ZsYWdzKTsKLQorCQkvKiB3ZSB3b24ndCBsb3NlIHRoZSBDUFUgc2luY2Ugd2UncmUgaG9sZGluZyBjaC0+bG9jayAqLworCQljb21wbGV0ZSgmY2gtPndkaXNjb25uZWN0X3dhaXQpOwogCX0gZWxzZSBpZiAoY2gtPmRlbGF5ZWRfSVBJX2ZsYWdzKSB7CiAJCWlmIChwYXJ0LT5hY3Rfc3RhdGUgIT0gWFBDX1BfREVBQ1RJVkFUSU5HKSB7CiAJCQkvKiB0aW1lIHRvIHRha2UgYWN0aW9uIG9uIGFueSBkZWxheWVkIElQSSBmbGFncyAqLwpAQCAtMTA4NiwxMiArMTA4NiwxMiBAQAogCXN0cnVjdCB4cGNfcmVnaXN0cmF0aW9uICpyZWdpc3RyYXRpb24gPSAmeHBjX3JlZ2lzdHJhdGlvbnNbY2gtPm51bWJlcl07CiAKIAotCWlmIChkb3duX3RyeWxvY2soJnJlZ2lzdHJhdGlvbi0+c2VtYSkgIT0gMCkgeworCWlmIChtdXRleF90cnlsb2NrKCZyZWdpc3RyYXRpb24tPm11dGV4KSA9PSAwKSB7CiAJCXJldHVybiB4cGNSZXRyeTsKIAl9CiAKIAlpZiAoIVhQQ19DSEFOTkVMX1JFR0lTVEVSRUQoY2gtPm51bWJlcikpIHsKLQkJdXAoJnJlZ2lzdHJhdGlvbi0+c2VtYSk7CisJCW11dGV4X3VubG9jaygmcmVnaXN0cmF0aW9uLT5tdXRleCk7CiAJCXJldHVybiB4cGNVbnJlZ2lzdGVyZWQ7CiAJfQogCkBAIC0xMTAyLDcgKzExMDIsNyBAQAogCiAJaWYgKGNoLT5mbGFncyAmIFhQQ19DX0RJU0NPTk5FQ1RJTkcpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmxvY2ssIGlycV9mbGFncyk7Ci0JCXVwKCZyZWdpc3RyYXRpb24tPnNlbWEpOworCQltdXRleF91bmxvY2soJnJlZ2lzdHJhdGlvbi0+bXV0ZXgpOwogCQlyZXR1cm4gY2gtPnJlYXNvbjsKIAl9CiAKQEAgLTExMzQsNyArMTEzNCw3IEBACiAJCQkgKiBjaGFubmVsIGxvY2sgYmUgbG9ja2VkIGFuZCB3aWxsIHVubG9jayBhbmQgcmVsb2NrCiAJCQkgKiB0aGUgY2hhbm5lbCBsb2NrIGFzIG5lZWRlZC4KIAkJCSAqLwotCQkJdXAoJnJlZ2lzdHJhdGlvbi0+c2VtYSk7CisJCQltdXRleF91bmxvY2soJnJlZ2lzdHJhdGlvbi0+bXV0ZXgpOwogCQkJWFBDX0RJU0NPTk5FQ1RfQ0hBTk5FTChjaCwgeHBjVW5lcXVhbE1zZ1NpemVzLAogCQkJCQkJCQkmaXJxX2ZsYWdzKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5sb2NrLCBpcnFfZmxhZ3MpOwpAQCAtMTE0OSw3ICsxMTQ5LDcgQEAKIAkJYXRvbWljX2luYygmeHBjX3BhcnRpdGlvbnNbY2gtPnBhcnRpZF0ubmNoYW5uZWxzX2FjdGl2ZSk7CiAJfQogCi0JdXAoJnJlZ2lzdHJhdGlvbi0+c2VtYSk7CisJbXV0ZXhfdW5sb2NrKCZyZWdpc3RyYXRpb24tPm11dGV4KTsKIAogCiAJLyogaW5pdGlhdGUgdGhlIGNvbm5lY3Rpb24gKi8KQEAgLTE2NDUsNyArMTY0NSw3IEBACiAKIAogdm9pZAoteHBjX2Rpc2Nvbm5lY3RpbmdfY2FsbG91dChzdHJ1Y3QgeHBjX2NoYW5uZWwgKmNoKQoreHBjX2Rpc2Nvbm5lY3RfY2FsbG91dChzdHJ1Y3QgeHBjX2NoYW5uZWwgKmNoLCBlbnVtIHhwY19yZXR2YWwgcmVhc29uKQogewogCS8qCiAJICogTGV0IHRoZSBjaGFubmVsJ3MgcmVnaXN0ZXJlciBrbm93IHRoYXQgdGhlIGNoYW5uZWwgaXMgYmVpbmcKQEAgLTE2NTQsMTUgKzE2NTQsMTMgQEAKIAkgKi8KIAogCWlmIChjaC0+ZnVuYyAhPSBOVUxMKSB7Ci0JCWRldl9kYmcoeHBjX2NoYW4sICJjaC0+ZnVuYygpIGNhbGxlZCwgcmVhc29uPXhwY0Rpc2Nvbm5lY3RpbmcsIgotCQkJIiBwYXJ0aWQ9JWQsIGNoYW5uZWw9JWRcbiIsIGNoLT5wYXJ0aWQsIGNoLT5udW1iZXIpOworCQlkZXZfZGJnKHhwY19jaGFuLCAiY2gtPmZ1bmMoKSBjYWxsZWQsIHJlYXNvbj0lZCwgcGFydGlkPSVkLCAiCisJCQkiY2hhbm5lbD0lZFxuIiwgcmVhc29uLCBjaC0+cGFydGlkLCBjaC0+bnVtYmVyKTsKIAotCQljaC0+ZnVuYyh4cGNEaXNjb25uZWN0aW5nLCBjaC0+cGFydGlkLCBjaC0+bnVtYmVyLCBOVUxMLAotCQkJCQkJCQljaC0+a2V5KTsKKwkJY2gtPmZ1bmMocmVhc29uLCBjaC0+cGFydGlkLCBjaC0+bnVtYmVyLCBOVUxMLCBjaC0+a2V5KTsKIAotCQlkZXZfZGJnKHhwY19jaGFuLCAiY2gtPmZ1bmMoKSByZXR1cm5lZCwgcmVhc29uPSIKLQkJCSJ4cGNEaXNjb25uZWN0aW5nLCBwYXJ0aWQ9JWQsIGNoYW5uZWw9JWRcbiIsCi0JCQljaC0+cGFydGlkLCBjaC0+bnVtYmVyKTsKKwkJZGV2X2RiZyh4cGNfY2hhbiwgImNoLT5mdW5jKCkgcmV0dXJuZWQsIHJlYXNvbj0lZCwgcGFydGlkPSVkLCAiCisJCQkiY2hhbm5lbD0lZFxuIiwgcmVhc29uLCBjaC0+cGFydGlkLCBjaC0+bnVtYmVyKTsKIAl9CiB9CiAKQEAgLTIwODUsNyArMjA4Myw3IEBACiAJZW51bSB4cGNfcmV0dmFsIHJldDsKIAogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmY2gtPm1zZ190b19wdWxsX3NlbWEpICE9IDApIHsKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjaC0+bXNnX3RvX3B1bGxfbXV0ZXgpICE9IDApIHsKIAkJLyogd2Ugd2VyZSBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbCAqLwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0yMTIxLDcgKzIxMTksNyBAQAogCiAJCQlYUENfREVBQ1RJVkFURV9QQVJUSVRJT04ocGFydCwgcmV0KTsKIAotCQkJdXAoJmNoLT5tc2dfdG9fcHVsbF9zZW1hKTsKKwkJCW11dGV4X3VubG9jaygmY2gtPm1zZ190b19wdWxsX211dGV4KTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAKQEAgLTIxMzAsNyArMjEyOCw3IEBACiAJCWNoLT5uZXh0X21zZ190b19wdWxsICs9IG5tc2dzOwogCX0KIAotCXVwKCZjaC0+bXNnX3RvX3B1bGxfc2VtYSk7CisJbXV0ZXhfdW5sb2NrKCZjaC0+bXNnX3RvX3B1bGxfbXV0ZXgpOwogCiAJLyogcmV0dXJuIHRoZSBtZXNzYWdlIHdlIHdlcmUgbG9va2luZyBmb3IgKi8KIAltc2dfb2Zmc2V0ID0gKGdldCAlIGNoLT5yZW1vdGVfbmVudHJpZXMpICogY2gtPm1zZ19zaXplOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfbWFpbi5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfbWFpbi5jCmluZGV4IGI2MTcyMzYuLmM3NWY4YWUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX21haW4uYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL3hwY19tYWluLmMKQEAgLTMsNyArMyw3IEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICovCiAKIApAQCAtNTUsMTEgKzU1LDEyIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGFzbS9zbi9pbnRyLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgogI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgInhwYy5oIgorI2luY2x1ZGUgPGFzbS9zbi94cGMuaD4KIAogCiAvKiBkZWZpbmUgdHdvIFhQQyBkZWJ1ZyBkZXZpY2Ugc3RydWN0dXJlcyB0byBiZSB1c2VkIHdpdGggZGV2X2RiZygpIGV0IGFsICovCkBAIC04Miw2ICs4Myw5IEBACiBzdHJ1Y3QgZGV2aWNlICp4cGNfY2hhbiA9ICZ4cGNfY2hhbl9kYmdfc3VibmFtZTsKIAogCitzdGF0aWMgaW50IHhwY19rZGVidWdfaWdub3JlOworCisKIC8qIHN5c3R1bmUgcmVsYXRlZCB2YXJpYWJsZXMgZm9yIC9wcm9jL3N5cyBkaXJlY3RvcmllcyAqLwogCiBzdGF0aWMgaW50IHhwY19oYl9pbnRlcnZhbCA9IFhQQ19IQl9ERUZBVUxUX0lOVEVSVkFMOwpAQCAtMTYyLDYgKzE2Niw4IEBACiB9Owogc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICp4cGNfc3lzY3RsOwogCisvKiBub24temVybyBpZiBhbnkgcmVtb3RlIHBhcnRpdGlvbiBkaXNlbmdhZ2UgcmVxdWVzdCB3YXMgdGltZWQgb3V0ICovCitpbnQgeHBjX2Rpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVkb3V0OwogCiAvKiAjb2YgSVJRcyByZWNlaXZlZCAqLwogc3RhdGljIGF0b21pY190IHhwY19hY3RfSVJRX3JjdmQ7CkBAIC0xNzIsMTAgKzE3OCwxMCBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgeHBjX2hiX2NoZWNrX3RpbWVvdXQ7CiAKIC8qIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSB4cGNfaGJfY2hlY2tlciB0aHJlYWQgaGFzIGV4aXRlZCAqLwotc3RhdGljIERFQ0xBUkVfTVVURVhfTE9DS0VEKHhwY19oYl9jaGVja2VyX2V4aXRlZCk7CitzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKHhwY19oYl9jaGVja2VyX2V4aXRlZCk7CiAKIC8qIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSB4cGNfZGlzY292ZXJ5IHRocmVhZCBoYXMgZXhpdGVkICovCi1zdGF0aWMgREVDTEFSRV9NVVRFWF9MT0NLRUQoeHBjX2Rpc2NvdmVyeV9leGl0ZWQpOworc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTih4cGNfZGlzY292ZXJ5X2V4aXRlZCk7CiAKIAogc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHhwY19oYl90aW1lcjsKQEAgLTMxNiw3ICszMjIsNyBAQAogCiAKIAkvKiBtYXJrIHRoaXMgdGhyZWFkIGFzIGhhdmluZyBleGl0ZWQgKi8KLQl1cCgmeHBjX2hiX2NoZWNrZXJfZXhpdGVkKTsKKwljb21wbGV0ZSgmeHBjX2hiX2NoZWNrZXJfZXhpdGVkKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzM2LDcgKzM0Miw3IEBACiAJZGV2X2RiZyh4cGNfcGFydCwgImRpc2NvdmVyeSB0aHJlYWQgaXMgZXhpdGluZ1xuIik7CiAKIAkvKiBtYXJrIHRoaXMgdGhyZWFkIGFzIGhhdmluZyBleGl0ZWQgKi8KLQl1cCgmeHBjX2Rpc2NvdmVyeV9leGl0ZWQpOworCWNvbXBsZXRlKCZ4cGNfZGlzY292ZXJ5X2V4aXRlZCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc3Myw3ICs3NzksNyBAQAogCQkJY2gtPmZsYWdzIHw9IFhQQ19DX0RJU0NPTk5FQ1RDQUxMT1VUOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmxvY2ssIGlycV9mbGFncyk7CiAKLQkJCXhwY19kaXNjb25uZWN0aW5nX2NhbGxvdXQoY2gpOworCQkJeHBjX2Rpc2Nvbm5lY3RfY2FsbG91dChjaCwgeHBjRGlzY29ubmVjdGluZyk7CiAJCX0gZWxzZSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+bG9jaywgaXJxX2ZsYWdzKTsKIAkJfQpAQCAtODg4LDcgKzg5NCw3IEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCSh2b2lkKSBkb3duKCZjaC0+d2Rpc2Nvbm5lY3Rfc2VtYSk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNoLT53ZGlzY29ubmVjdF93YWl0KTsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmxvY2ssIGlycV9mbGFncyk7CiAJCURCVUdfT04oIShjaC0+ZmxhZ3MgJiBYUENfQ19ESVNDT05ORUNURUQpKTsKQEAgLTkyMSw5ICs5MjcsOSBAQAogeHBjX2RvX2V4aXQoZW51bSB4cGNfcmV0dmFsIHJlYXNvbikKIHsKIAlwYXJ0aWRfdCBwYXJ0aWQ7Ci0JaW50IGFjdGl2ZV9wYXJ0X2NvdW50OworCWludCBhY3RpdmVfcGFydF9jb3VudCwgcHJpbnRlZF93YWl0aW5nX21zZyA9IDA7CiAJc3RydWN0IHhwY19wYXJ0aXRpb24gKnBhcnQ7Ci0JdW5zaWduZWQgbG9uZyBwcmludG1zZ190aW1lOworCXVuc2lnbmVkIGxvbmcgcHJpbnRtc2dfdGltZSwgZGlzZW5nYWdlX3JlcXVlc3RfdGltZW91dCA9IDA7CiAKIAogCS8qIGEgJ3JtbW9kIFhQQycgYW5kIGEgJ3JlYm9vdCcgY2Fubm90IGJvdGggZW5kIHVwIGhlcmUgdG9nZXRoZXIgKi8KQEAgLTk0MSwxMCArOTQ3LDEwIEBACiAJZnJlZV9pcnEoU0dJX1hQQ19BQ1RJVkFURSwgTlVMTCk7CiAKIAkvKiB3YWl0IGZvciB0aGUgZGlzY292ZXJ5IHRocmVhZCB0byBleGl0ICovCi0JZG93bigmeHBjX2Rpc2NvdmVyeV9leGl0ZWQpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnhwY19kaXNjb3ZlcnlfZXhpdGVkKTsKIAogCS8qIHdhaXQgZm9yIHRoZSBoZWFydGJlYXQgY2hlY2tlciB0aHJlYWQgdG8gZXhpdCAqLwotCWRvd24oJnhwY19oYl9jaGVja2VyX2V4aXRlZCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmeHBjX2hiX2NoZWNrZXJfZXhpdGVkKTsKIAogCiAJLyogc2xlZXAgZm9yIGEgMS8zIG9mIGEgc2Vjb25kIG9yIHNvICovCkBAIC05NTMsNyArOTU5LDggQEAKIAogCS8qIHdhaXQgZm9yIGFsbCBwYXJ0aXRpb25zIHRvIGJlY29tZSBpbmFjdGl2ZSAqLwogCi0JcHJpbnRtc2dfdGltZSA9IGppZmZpZXM7CisJcHJpbnRtc2dfdGltZSA9IGppZmZpZXMgKyAoWFBDX0RJU0VOR0FHRV9QUklOVE1TR19JTlRFUlZBTCAqIEhaKTsKKwl4cGNfZGlzZW5nYWdlX3JlcXVlc3RfdGltZWRvdXQgPSAwOwogCiAJZG8gewogCQlhY3RpdmVfcGFydF9jb3VudCA9IDA7CkBAIC05NjksMjAgKzk3NiwzOSBAQAogCQkJYWN0aXZlX3BhcnRfY291bnQrKzsKIAogCQkJWFBDX0RFQUNUSVZBVEVfUEFSVElUSU9OKHBhcnQsIHJlYXNvbik7CisKKwkJCWlmIChwYXJ0LT5kaXNlbmdhZ2VfcmVxdWVzdF90aW1lb3V0ID4KKwkJCQkJCWRpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVvdXQpIHsKKwkJCQlkaXNlbmdhZ2VfcmVxdWVzdF90aW1lb3V0ID0KKwkJCQkJCXBhcnQtPmRpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVvdXQ7CisJCQl9CiAJCX0KIAotCQlpZiAoYWN0aXZlX3BhcnRfY291bnQgPT0gMCkgewotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoamlmZmllcyA+PSBwcmludG1zZ190aW1lKSB7Ci0JCQlkZXZfaW5mbyh4cGNfcGFydCwgIndhaXRpbmcgZm9yIHBhcnRpdGlvbnMgdG8gIgotCQkJCSJkZWFjdGl2YXRlL2Rpc2VuZ2FnZSwgYWN0aXZlIGNvdW50PSVkLCByZW1vdGUgIgotCQkJCSJlbmdhZ2VkPTB4JWx4XG4iLCBhY3RpdmVfcGFydF9jb3VudCwKLQkJCQl4cGNfcGFydGl0aW9uX2VuZ2FnZWQoMVVMIDw8IHBhcnRpZCkpOwotCi0JCQlwcmludG1zZ190aW1lID0gamlmZmllcyArCisJCWlmICh4cGNfcGFydGl0aW9uX2VuZ2FnZWQoLTFVTCkpIHsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHByaW50bXNnX3RpbWUpKSB7CisJCQkJZGV2X2luZm8oeHBjX3BhcnQsICJ3YWl0aW5nIGZvciByZW1vdGUgIgorCQkJCQkicGFydGl0aW9ucyB0byBkaXNlbmdhZ2UsIHRpbWVvdXQgaW4gIgorCQkJCQkiJWxkIHNlY29uZHNcbiIsCisJCQkJCShkaXNlbmdhZ2VfcmVxdWVzdF90aW1lb3V0IC0gamlmZmllcykKKwkJCQkJCQkJCS8gSFopOworCQkJCXByaW50bXNnX3RpbWUgPSBqaWZmaWVzICsKIAkJCQkJKFhQQ19ESVNFTkdBR0VfUFJJTlRNU0dfSU5URVJWQUwgKiBIWik7CisJCQkJcHJpbnRlZF93YWl0aW5nX21zZyA9IDE7CisJCQl9CisKKwkJfSBlbHNlIGlmIChhY3RpdmVfcGFydF9jb3VudCA+IDApIHsKKwkJCWlmIChwcmludGVkX3dhaXRpbmdfbXNnKSB7CisJCQkJZGV2X2luZm8oeHBjX3BhcnQsICJ3YWl0aW5nIGZvciBsb2NhbCBwYXJ0aXRpb24iCisJCQkJCSIgdG8gZGlzZW5nYWdlXG4iKTsKKwkJCQlwcmludGVkX3dhaXRpbmdfbXNnID0gMDsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJaWYgKCF4cGNfZGlzZW5nYWdlX3JlcXVlc3RfdGltZWRvdXQpIHsKKwkJCQlkZXZfaW5mbyh4cGNfcGFydCwgImFsbCBwYXJ0aXRpb25zIGhhdmUgIgorCQkJCQkiZGlzZW5nYWdlZFxuIik7CisJCQl9CisJCQlicmVhazsKIAkJfQogCiAJCS8qIHNsZWVwIGZvciBhIDEvMyBvZiBhIHNlY29uZCBvciBzbyAqLwpAQCAtMTAwMCwxMSArMTAyNiwxMyBAQAogCWRlbF90aW1lcl9zeW5jKCZ4cGNfaGJfdGltZXIpOwogCURCVUdfT04oeHBjX3ZhcnMtPmhlYXJ0YmVhdGluZ190b19tYXNrICE9IDApOwogCi0JLyogdGFrZSBvdXJzZWx2ZXMgb2ZmIG9mIHRoZSByZWJvb3Rfbm90aWZpZXJfbGlzdCAqLwotCSh2b2lkKSB1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmeHBjX3JlYm9vdF9ub3RpZmllcik7CisJaWYgKHJlYXNvbiA9PSB4cGNVbmxvYWRpbmcpIHsKKwkJLyogdGFrZSBvdXJzZWx2ZXMgb2ZmIG9mIHRoZSByZWJvb3Rfbm90aWZpZXJfbGlzdCAqLworCQkodm9pZCkgdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnhwY19yZWJvb3Rfbm90aWZpZXIpOwogCi0JLyogdGFrZSBvdXJzZWx2ZXMgb2ZmIG9mIHRoZSBkaWVfbm90aWZpZXIgbGlzdCAqLwotCSh2b2lkKSB1bnJlZ2lzdGVyX2RpZV9ub3RpZmllcigmeHBjX2RpZV9ub3RpZmllcik7CisJCS8qIHRha2Ugb3Vyc2VsdmVzIG9mZiBvZiB0aGUgZGllX25vdGlmaWVyIGxpc3QgKi8KKwkJKHZvaWQpIHVucmVnaXN0ZXJfZGllX25vdGlmaWVyKCZ4cGNfZGllX25vdGlmaWVyKTsKKwl9CiAKIAkvKiBjbG9zZSBkb3duIHByb3RlY3Rpb25zIGZvciBJUEkgb3BlcmF0aW9ucyAqLwogCXhwY19yZXN0cmljdF9JUElfb3BzKCk7CkBAIC0xMDIwLDYzICsxMDQ4LDYgQEAKIAogCiAvKgotICogQ2FsbGVkIHdoZW4gdGhlIHN5c3RlbSBpcyBhYm91dCB0byBiZSBlaXRoZXIgcmVzdGFydGVkIG9yIGhhbHRlZC4KLSAqLwotc3RhdGljIHZvaWQKLXhwY19kaWVfZGlzZW5nYWdlKHZvaWQpCi17Ci0Jc3RydWN0IHhwY19wYXJ0aXRpb24gKnBhcnQ7Ci0JcGFydGlkX3QgcGFydGlkOwotCXVuc2lnbmVkIGxvbmcgZW5nYWdlZDsKLQlsb25nIHRpbWUsIHByaW50X3RpbWUsIGRpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVvdXQ7Ci0KLQotCS8qIGtlZXAgeHBjX2hiX2NoZWNrZXIgdGhyZWFkIGZyb20gZG9pbmcgYW55dGhpbmcgKGp1c3QgaW4gY2FzZSkgKi8KLQl4cGNfZXhpdGluZyA9IDE7Ci0KLQl4cGNfdmFycy0+aGVhcnRiZWF0aW5nX3RvX21hc2sgPSAwOyAgLyogaW5kaWNhdGUgd2UncmUgZGVhY3RpdmF0ZWQgKi8KLQotCWZvciAocGFydGlkID0gMTsgcGFydGlkIDwgWFBfTUFYX1BBUlRJVElPTlM7IHBhcnRpZCsrKSB7Ci0JCXBhcnQgPSAmeHBjX3BhcnRpdGlvbnNbcGFydGlkXTsKLQotCQlpZiAoIVhQQ19TVVBQT1JUU19ESVNFTkdBR0VfUkVRVUVTVChwYXJ0LT4KLQkJCQkJCQlyZW1vdGVfdmFyc192ZXJzaW9uKSkgewotCi0JCQkvKiBqdXN0IGluIGNhc2UgaXQgd2FzIGxlZnQgc2V0IGJ5IGFuIGVhcmxpZXIgWFBDICovCi0JCQl4cGNfY2xlYXJfcGFydGl0aW9uX2VuZ2FnZWQoMVVMIDw8IHBhcnRpZCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmICh4cGNfcGFydGl0aW9uX2VuZ2FnZWQoMVVMIDw8IHBhcnRpZCkgfHwKLQkJCQkJcGFydC0+YWN0X3N0YXRlICE9IFhQQ19QX0lOQUNUSVZFKSB7Ci0JCQl4cGNfcmVxdWVzdF9wYXJ0aXRpb25fZGlzZW5nYWdlKHBhcnQpOwotCQkJeHBjX21hcmtfcGFydGl0aW9uX2Rpc2VuZ2FnZWQocGFydCk7Ci0JCQl4cGNfSVBJX3NlbmRfZGlzZW5nYWdlKHBhcnQpOwotCQl9Ci0JfQotCi0JcHJpbnRfdGltZSA9IHJ0Y190aW1lKCk7Ci0JZGlzZW5nYWdlX3JlcXVlc3RfdGltZW91dCA9IHByaW50X3RpbWUgKwotCQkoeHBjX2Rpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVsaW1pdCAqIHNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZCk7Ci0KLQkvKiB3YWl0IGZvciBhbGwgb3RoZXIgcGFydGl0aW9ucyB0byBkaXNlbmdhZ2UgZnJvbSB1cyAqLwotCi0Jd2hpbGUgKChlbmdhZ2VkID0geHBjX3BhcnRpdGlvbl9lbmdhZ2VkKC0xVUwpKSAmJgotCQkJKHRpbWUgPSBydGNfdGltZSgpKSA8IGRpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVvdXQpIHsKLQotCQlpZiAodGltZSA+PSBwcmludF90aW1lKSB7Ci0JCQlkZXZfaW5mbyh4cGNfcGFydCwgIndhaXRpbmcgZm9yIHJlbW90ZSBwYXJ0aXRpb25zIHRvICIKLQkJCQkiZGlzZW5nYWdlLCBlbmdhZ2VkPTB4JWx4XG4iLCBlbmdhZ2VkKTsKLQkJCXByaW50X3RpbWUgPSB0aW1lICsgKFhQQ19ESVNFTkdBR0VfUFJJTlRNU0dfSU5URVJWQUwgKgotCQkJCQkJc25fcnRjX2N5Y2xlc19wZXJfc2Vjb25kKTsKLQkJfQotCX0KLQlkZXZfaW5mbyh4cGNfcGFydCwgImZpbmlzaGVkIHdhaXRpbmcgZm9yIHJlbW90ZSBwYXJ0aXRpb25zIHRvICIKLQkJCQkiZGlzZW5nYWdlLCBlbmdhZ2VkPTB4JWx4XG4iLCBlbmdhZ2VkKTsKLX0KLQotCi0vKgogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgc3lzdGVtIGlzIGJlaW5nIHJlYm9vdGVkLgogICovCiBzdGF0aWMgaW50CkBAIC0xMTA1LDcgKzEwNzYsODggQEAKIAogCiAvKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgc3lzdGVtIGlzIGJlaW5nIHJlYm9vdGVkLgorICogTm90aWZ5IG90aGVyIHBhcnRpdGlvbnMgdG8gZGlzZW5nYWdlIGZyb20gYWxsIHJlZmVyZW5jZXMgdG8gb3VyIG1lbW9yeS4KKyAqLworc3RhdGljIHZvaWQKK3hwY19kaWVfZGlzZW5nYWdlKHZvaWQpCit7CisJc3RydWN0IHhwY19wYXJ0aXRpb24gKnBhcnQ7CisJcGFydGlkX3QgcGFydGlkOworCXVuc2lnbmVkIGxvbmcgZW5nYWdlZDsKKwlsb25nIHRpbWUsIHByaW50bXNnX3RpbWUsIGRpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVvdXQ7CisKKworCS8qIGtlZXAgeHBjX2hiX2NoZWNrZXIgdGhyZWFkIGZyb20gZG9pbmcgYW55dGhpbmcgKGp1c3QgaW4gY2FzZSkgKi8KKwl4cGNfZXhpdGluZyA9IDE7CisKKwl4cGNfdmFycy0+aGVhcnRiZWF0aW5nX3RvX21hc2sgPSAwOyAgLyogaW5kaWNhdGUgd2UncmUgZGVhY3RpdmF0ZWQgKi8KKworCWZvciAocGFydGlkID0gMTsgcGFydGlkIDwgWFBfTUFYX1BBUlRJVElPTlM7IHBhcnRpZCsrKSB7CisJCXBhcnQgPSAmeHBjX3BhcnRpdGlvbnNbcGFydGlkXTsKKworCQlpZiAoIVhQQ19TVVBQT1JUU19ESVNFTkdBR0VfUkVRVUVTVChwYXJ0LT4KKwkJCQkJCQlyZW1vdGVfdmFyc192ZXJzaW9uKSkgeworCisJCQkvKiBqdXN0IGluIGNhc2UgaXQgd2FzIGxlZnQgc2V0IGJ5IGFuIGVhcmxpZXIgWFBDICovCisJCQl4cGNfY2xlYXJfcGFydGl0aW9uX2VuZ2FnZWQoMVVMIDw8IHBhcnRpZCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICh4cGNfcGFydGl0aW9uX2VuZ2FnZWQoMVVMIDw8IHBhcnRpZCkgfHwKKwkJCQkJcGFydC0+YWN0X3N0YXRlICE9IFhQQ19QX0lOQUNUSVZFKSB7CisJCQl4cGNfcmVxdWVzdF9wYXJ0aXRpb25fZGlzZW5nYWdlKHBhcnQpOworCQkJeHBjX21hcmtfcGFydGl0aW9uX2Rpc2VuZ2FnZWQocGFydCk7CisJCQl4cGNfSVBJX3NlbmRfZGlzZW5nYWdlKHBhcnQpOworCQl9CisJfQorCisJdGltZSA9IHJ0Y190aW1lKCk7CisJcHJpbnRtc2dfdGltZSA9IHRpbWUgKworCQkoWFBDX0RJU0VOR0FHRV9QUklOVE1TR19JTlRFUlZBTCAqIHNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZCk7CisJZGlzZW5nYWdlX3JlcXVlc3RfdGltZW91dCA9IHRpbWUgKworCQkoeHBjX2Rpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVsaW1pdCAqIHNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZCk7CisKKwkvKiB3YWl0IGZvciBhbGwgb3RoZXIgcGFydGl0aW9ucyB0byBkaXNlbmdhZ2UgZnJvbSB1cyAqLworCisJd2hpbGUgKDEpIHsKKwkJZW5nYWdlZCA9IHhwY19wYXJ0aXRpb25fZW5nYWdlZCgtMVVMKTsKKwkJaWYgKCFlbmdhZ2VkKSB7CisJCQlkZXZfaW5mbyh4cGNfcGFydCwgImFsbCBwYXJ0aXRpb25zIGhhdmUgZGlzZW5nYWdlZFxuIik7CisJCQlicmVhazsKKwkJfQorCisJCXRpbWUgPSBydGNfdGltZSgpOworCQlpZiAodGltZSA+PSBkaXNlbmdhZ2VfcmVxdWVzdF90aW1lb3V0KSB7CisJCQlmb3IgKHBhcnRpZCA9IDE7IHBhcnRpZCA8IFhQX01BWF9QQVJUSVRJT05TOyBwYXJ0aWQrKykgeworCQkJCWlmIChlbmdhZ2VkICYgKDFVTCA8PCBwYXJ0aWQpKSB7CisJCQkJCWRldl9pbmZvKHhwY19wYXJ0LCAiZGlzZW5nYWdlIGZyb20gIgorCQkJCQkJInJlbW90ZSBwYXJ0aXRpb24gJWQgdGltZWQgIgorCQkJCQkJIm91dFxuIiwgcGFydGlkKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWlmICh0aW1lID49IHByaW50bXNnX3RpbWUpIHsKKwkJCWRldl9pbmZvKHhwY19wYXJ0LCAid2FpdGluZyBmb3IgcmVtb3RlIHBhcnRpdGlvbnMgdG8gIgorCQkJCSJkaXNlbmdhZ2UsIHRpbWVvdXQgaW4gJWxkIHNlY29uZHNcbiIsCisJCQkJKGRpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVvdXQgLSB0aW1lKSAvCisJCQkJCQlzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQpOworCQkJcHJpbnRtc2dfdGltZSA9IHRpbWUgKworCQkJCQkoWFBDX0RJU0VOR0FHRV9QUklOVE1TR19JTlRFUlZBTCAqCisJCQkJCQlzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQpOworCQl9CisJfQorfQorCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBzeXN0ZW0gaXMgYmVpbmcgcmVzdGFydGVkIG9yIGhhbHRlZCBkdWUKKyAqIHRvIHNvbWUgc29ydCBvZiBzeXN0ZW0gZmFpbHVyZS4gSWYgdGhpcyBpcyB0aGUgY2FzZSB3ZSBuZWVkIHRvIG5vdGlmeSB0aGUKKyAqIG90aGVyIHBhcnRpdGlvbnMgdG8gZGlzZW5nYWdlIGZyb20gYWxsIHJlZmVyZW5jZXMgdG8gb3VyIG1lbW9yeS4KKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGFsc28gYmUgY2FsbGVkIHdoZW4gb3VyIGhlYXJ0YmVhdGVyIGNvdWxkIGJlIG9mZmxpbmVkCisgKiBmb3IgYSB0aW1lLiBJbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBub3RpZnkgb3RoZXIgcGFydGl0aW9ucyB0byBub3Qgd29ycnkKKyAqIGFib3V0IHRoZSBsYWNrIG9mIGEgaGVhcnRiZWF0LgogICovCiBzdGF0aWMgaW50CiB4cGNfc3lzdGVtX2RpZShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICp1bnVzZWQpCkBAIC0xMTE1LDExICsxMTY3LDI1IEBACiAJY2FzZSBESUVfTUFDSElORV9IQUxUOgogCQl4cGNfZGllX2Rpc2VuZ2FnZSgpOwogCQlicmVhazsKKworCWNhc2UgRElFX0tERUJVR19FTlRFUjoKKwkJLyogU2hvdWxkIGxhY2sgb2YgaGVhcnRiZWF0IGJlIGlnbm9yZWQgYnkgb3RoZXIgcGFydGl0aW9ucz8gKi8KKwkJaWYgKCF4cGNfa2RlYnVnX2lnbm9yZSkgeworCQkJYnJlYWs7CisJCX0KKwkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBESUVfTUNBX01PTkFSQ0hfRU5URVI6CiAJY2FzZSBESUVfSU5JVF9NT05BUkNIX0VOVEVSOgogCQl4cGNfdmFycy0+aGVhcnRiZWF0Kys7CiAJCXhwY192YXJzLT5oZWFydGJlYXRfb2ZmbGluZSA9IDE7CiAJCWJyZWFrOworCisJY2FzZSBESUVfS0RFQlVHX0xFQVZFOgorCQkvKiBJcyBsYWNrIG9mIGhlYXJ0YmVhdCBiZWluZyBpZ25vcmVkIGJ5IG90aGVyIHBhcnRpdGlvbnM/ICovCisJCWlmICgheHBjX2tkZWJ1Z19pZ25vcmUpIHsKKwkJCWJyZWFrOworCQl9CisJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgRElFX01DQV9NT05BUkNIX0xFQVZFOgogCWNhc2UgRElFX0lOSVRfTU9OQVJDSF9MRUFWRToKIAkJeHBjX3ZhcnMtPmhlYXJ0YmVhdCsrOwpAQCAtMTMwMiw3ICsxMzY4LDcgQEAKIAkJZGV2X2Vycih4cGNfcGFydCwgImZhaWxlZCB3aGlsZSBmb3JraW5nIGRpc2NvdmVyeSB0aHJlYWRcbiIpOwogCiAJCS8qIG1hcmsgdGhpcyBuZXcgdGhyZWFkIGFzIGEgbm9uLXN0YXJ0ZXIgKi8KLQkJdXAoJnhwY19kaXNjb3ZlcnlfZXhpdGVkKTsKKwkJY29tcGxldGUoJnhwY19kaXNjb3ZlcnlfZXhpdGVkKTsKIAogCQl4cGNfZG9fZXhpdCh4cGNVbmxvYWRpbmcpOwogCQlyZXR1cm4gLUVCVVNZOwpAQCAtMTM0NCwzICsxNDEwLDcgQEAKIE1PRFVMRV9QQVJNX0RFU0MoeHBjX2Rpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVsaW1pdCwgIk51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgIgogCQkiZm9yIGRpc2VuZ2FnZSByZXF1ZXN0IHRvIGNvbXBsZXRlLiIpOwogCittb2R1bGVfcGFyYW0oeHBjX2tkZWJ1Z19pZ25vcmUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHhwY19rZGVidWdfaWdub3JlLCAiU2hvdWxkIGxhY2sgb2YgaGVhcnRiZWF0IGJlIGlnbm9yZWQgYnkgIgorCQkib3RoZXIgcGFydGl0aW9ucyB3aGVuIGRyb3BwaW5nIGludG8ga2RlYnVnLiIpOworCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3hwY19wYXJ0aXRpb24uYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX3BhcnRpdGlvbi5jCmluZGV4IGNkZDY0MzEuLjg4YTczMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX3BhcnRpdGlvbi5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX3BhcnRpdGlvbi5jCkBAIC0zLDcgKzMsNyBAQAogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqLwogCiAKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CiAjaW5jbHVkZSA8YXNtL3NuL25vZGVwZGEuaD4KICNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KLSNpbmNsdWRlICJ4cGMuaCIKKyNpbmNsdWRlIDxhc20vc24veHBjLmg+CiAKIAogLyogWFBDIGlzIGV4aXRpbmcgZmxhZyAqLwpAQCAtNzcxLDcgKzc3MSw4IEBACiAJCX0KIAl9CiAKLQlpZiAoIXhwY19wYXJ0aXRpb25fZGlzZW5nYWdlZChwYXJ0KSkgeworCWlmIChwYXJ0LT5kaXNlbmdhZ2VfcmVxdWVzdF90aW1lb3V0ID4gMCAmJgorCQkJCQkheHBjX3BhcnRpdGlvbl9kaXNlbmdhZ2VkKHBhcnQpKSB7CiAJCS8qIHN0aWxsIHdhaXRpbmcgb24gb3RoZXIgc2lkZSB0byBkaXNlbmdhZ2UgZnJvbSB1cyAqLwogCQlyZXR1cm47CiAJfQpAQCAtODczLDYgKzg3NCw5IEBACiAJCQkgKiByZXF1ZXN0IGluIGEgdGltZWx5IGZhc2hpb24sIHNvIGFzc3VtZSBpdCdzIGRlYWQuCiAJCQkgKi8KIAorCQkJZGV2X2luZm8oeHBjX3BhcnQsICJkaXNlbmdhZ2UgZnJvbSByZW1vdGUgcGFydGl0aW9uICVkICIKKwkJCQkidGltZWQgb3V0XG4iLCBwYXJ0aWQpOworCQkJeHBjX2Rpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVkb3V0ID0gMTsKIAkJCXhwY19jbGVhcl9wYXJ0aXRpb25fZW5nYWdlZCgxVUwgPDwgcGFydGlkKTsKIAkJCWRpc2VuZ2FnZWQgPSAxOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX2F0ZS5jIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9hdGUuYwppbmRleCBkMTY0N2I4Li5hYTNmYTUxIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX2F0ZS5jCisrKyBiL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfYXRlLmMKQEAgLTE4LDEwICsxOCwxMCBAQAogICogbWFya19hdGU6IE1hcmsgdGhlIGF0ZSBhcyBlaXRoZXIgZnJlZSBvciBpbnVzZS4KICAqLwogc3RhdGljIHZvaWQgbWFya19hdGUoc3RydWN0IGF0ZV9yZXNvdXJjZSAqYXRlX3Jlc291cmNlLCBpbnQgc3RhcnQsIGludCBudW1iZXIsCi0JCSAgICAgdWludDY0X3QgdmFsdWUpCisJCSAgICAgdTY0IHZhbHVlKQogewogCi0JdWludDY0X3QgKmF0ZSA9IGF0ZV9yZXNvdXJjZS0+YXRlOworCXU2NCAqYXRlID0gYXRlX3Jlc291cmNlLT5hdGU7CiAJaW50IGluZGV4OwogCWludCBsZW5ndGggPSAwOwogCkBAIC0zOCw3ICszOCw3IEBACiAJCQkgaW50IGNvdW50KQogewogCi0JdWludDY0X3QgKmF0ZSA9IGF0ZV9yZXNvdXJjZS0+YXRlOworCXU2NCAqYXRlID0gYXRlX3Jlc291cmNlLT5hdGU7CiAJaW50IGluZGV4OwogCWludCBzdGFydF9mcmVlOwogCkBAIC0xMTksNyArMTE5LDcgQEAKIGludCBwY2licl9hdGVfYWxsb2Moc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbywgaW50IGNvdW50KQogewogCWludCBzdGF0dXMgPSAwOwotCXVpbnQ2NF90IGZsYWc7CisJdTY0IGZsYWc7CiAKIAlmbGFnID0gcGNpYnJfbG9jayhwY2lidXNfaW5mbyk7CiAJc3RhdHVzID0gYWxsb2NfYXRlX3Jlc291cmNlKCZwY2lidXNfaW5mby0+cGJpX2ludF9hdGVfcmVzb3VyY2UsIGNvdW50KTsKQEAgLTEzOSw3ICsxMzksNyBAQAogICogU2V0dXAgYW4gQWRkcmVzcyBUcmFuc2xhdGlvbiBFbnRyeSBhcyBzcGVjaWZpZWQuICBVc2UgZWl0aGVyIHRoZSBCcmlkZ2UKICAqIGludGVybmFsIG1hcHMgb3IgdGhlIGV4dGVybmFsIG1hcCBSQU0sIGFzIGFwcHJvcHJpYXRlLgogICovCi1zdGF0aWMgaW5saW5lIHVpbnQ2NF90ICpwY2licl9hdGVfYWRkcihzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvLAorc3RhdGljIGlubGluZSB1NjQgKnBjaWJyX2F0ZV9hZGRyKHN0cnVjdCBwY2lidXNfaW5mbyAqcGNpYnVzX2luZm8sCiAJCQkJICAgICAgIGludCBhdGVfaW5kZXgpCiB7CiAJaWYgKGF0ZV9pbmRleCA8IHBjaWJ1c19pbmZvLT5wYmlfaW50X2F0ZV9zaXplKSB7CkBAIC0xNTMsNyArMTUzLDcgQEAKICAqLwogdm9pZCBpbmxpbmUKIGF0ZV93cml0ZShzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvLCBpbnQgYXRlX2luZGV4LCBpbnQgY291bnQsCi0JICB2b2xhdGlsZSB1aW50NjRfdCBhdGUpCisJICB2b2xhdGlsZSB1NjQgYXRlKQogewogCXdoaWxlIChjb3VudC0tID4gMCkgewogCQlpZiAoYXRlX2luZGV4IDwgcGNpYnVzX2luZm8tPnBiaV9pbnRfYXRlX3NpemUpIHsKQEAgLTE3MSw5ICsxNzEsOSBAQAogdm9pZCBwY2licl9hdGVfZnJlZShzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvLCBpbnQgaW5kZXgpCiB7CiAKLQl2b2xhdGlsZSB1aW50NjRfdCBhdGU7CisJdm9sYXRpbGUgdTY0IGF0ZTsKIAlpbnQgY291bnQ7Ci0JdWludDY0X3QgZmxhZ3M7CisJdTY0IGZsYWdzOwogCiAJaWYgKHBjaWJyX2ludmFsaWRhdGVfYXRlKSB7CiAJCS8qIEZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIGNsZWFyIHRoZSB2YWxpZCBiaXQgaW4gdGhlIEFURSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9kbWEuYyBiL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfZG1hLmMKaW5kZXggMzQwOTM0Ny4uNTRjZTViNyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9kbWEuYworKysgYi9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX2RtYS5jCkBAIC00MSwyMSArNDEsMjEgQEAKIAogc3RhdGljIGRtYV9hZGRyX3QKIHBjaWJyX2RtYW1hcF9hdGUzMihzdHJ1Y3QgcGNpZGV2X2luZm8gKmluZm8sCi0JCSAgIHVpbnQ2NF90IHBhZGRyLCBzaXplX3QgcmVxX3NpemUsIHVpbnQ2NF90IGZsYWdzKQorCQkgICB1NjQgcGFkZHIsIHNpemVfdCByZXFfc2l6ZSwgdTY0IGZsYWdzKQogewogCiAJc3RydWN0IHBjaWRldl9pbmZvICpwY2lkZXZfaW5mbyA9IGluZm8tPnBkaV9ob3N0X3BjaWRldl9pbmZvOwogCXN0cnVjdCBwY2lidXNfaW5mbyAqcGNpYnVzX2luZm8gPSAoc3RydWN0IHBjaWJ1c19pbmZvICopcGNpZGV2X2luZm8tPgogCSAgICBwZGlfcGNpYnVzX2luZm87Ci0JdWludDhfdCBpbnRlcm5hbF9kZXZpY2UgPSAoUENJX1NMT1QocGNpZGV2X2luZm8tPnBkaV9ob3N0X3BjaWRldl9pbmZvLT4KKwl1OCBpbnRlcm5hbF9kZXZpY2UgPSAoUENJX1NMT1QocGNpZGV2X2luZm8tPnBkaV9ob3N0X3BjaWRldl9pbmZvLT4KIAkJCQkJICAgIHBkaV9saW51eF9wY2lkZXYtPmRldmZuKSkgLSAxOwogCWludCBhdGVfY291bnQ7CiAJaW50IGF0ZV9pbmRleDsKLQl1aW50NjRfdCBhdGVfZmxhZ3MgPSBmbGFncyB8IFBDSTMyX0FURV9WOwotCXVpbnQ2NF90IGF0ZTsKLQl1aW50NjRfdCBwY2lfYWRkcjsKLQl1aW50NjRfdCB4aW9fYWRkcjsKLQl1aW50NjRfdCBvZmZzZXQ7CisJdTY0IGF0ZV9mbGFncyA9IGZsYWdzIHwgUENJMzJfQVRFX1Y7CisJdTY0IGF0ZTsKKwl1NjQgcGNpX2FkZHI7CisJdTY0IHhpb19hZGRyOworCXU2NCBvZmZzZXQ7CiAKIAkvKiBQSUMgaW4gUENJLVggbW9kZSBkb2VzIG5vdCBzdXBwb3J0cyAzMmJpdCBQYWdlTWFwIG1vZGUgKi8KIAlpZiAoSVNfUElDX1NPRlQocGNpYnVzX2luZm8pICYmIElTX1BDSVgocGNpYnVzX2luZm8pKSB7CkBAIC0xMDksMTIgKzEwOSwxMiBAQAogfQogCiBzdGF0aWMgZG1hX2FkZHJfdAotcGNpYnJfZG1hdHJhbnNfZGlyZWN0NjQoc3RydWN0IHBjaWRldl9pbmZvICogaW5mbywgdWludDY0X3QgcGFkZHIsCi0JCQl1aW50NjRfdCBkbWFfYXR0cmlidXRlcykKK3BjaWJyX2RtYXRyYW5zX2RpcmVjdDY0KHN0cnVjdCBwY2lkZXZfaW5mbyAqIGluZm8sIHU2NCBwYWRkciwKKwkJCXU2NCBkbWFfYXR0cmlidXRlcykKIHsKIAlzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvID0gKHN0cnVjdCBwY2lidXNfaW5mbyAqKQogCSAgICAoKGluZm8tPnBkaV9ob3N0X3BjaWRldl9pbmZvKS0+cGRpX3BjaWJ1c19pbmZvKTsKLQl1aW50NjRfdCBwY2lfYWRkcjsKKwl1NjQgcGNpX2FkZHI7CiAKIAkvKiBUcmFuc2xhdGUgdG8gQ3Jvc3N0YWxrIFZpZXcgb2YgUGh5c2ljYWwgQWRkcmVzcyAqLwogCXBjaV9hZGRyID0gKElTX1BJQ19TT0ZUKHBjaWJ1c19pbmZvKSA/IFBIWVNfVE9fRE1BKHBhZGRyKSA6CkBAIC0xMjcsNyArMTI3LDcgQEAKIAkvKiBIYW5kbGUgQnJpZGdlIENoaXBzZXQgZGlmZmVyZW5jZXMgKi8KIAlpZiAoSVNfUElDX1NPRlQocGNpYnVzX2luZm8pKSB7CiAJCXBjaV9hZGRyIHw9Ci0JCSAgICAoKHVpbnQ2NF90KSBwY2lidXNfaW5mby0+CisJCSAgICAoKHU2NCkgcGNpYnVzX2luZm8tPgogCQkgICAgIHBiaV9odWJfeGlkIDw8IFBJQ19QQ0k2NF9BVFRSX1RBUkdfU0hGVCk7CiAJfSBlbHNlCiAJCXBjaV9hZGRyIHw9IFRJT0NQX1BDSTY0X0NNRFRZUEVfTUVNOwpAQCAtMTQyLDE3ICsxNDIsMTcgQEAKIAogc3RhdGljIGRtYV9hZGRyX3QKIHBjaWJyX2RtYXRyYW5zX2RpcmVjdDMyKHN0cnVjdCBwY2lkZXZfaW5mbyAqIGluZm8sCi0JCQl1aW50NjRfdCBwYWRkciwgc2l6ZV90IHJlcV9zaXplLCB1aW50NjRfdCBmbGFncykKKwkJCXU2NCBwYWRkciwgc2l6ZV90IHJlcV9zaXplLCB1NjQgZmxhZ3MpCiB7CiAKIAlzdHJ1Y3QgcGNpZGV2X2luZm8gKnBjaWRldl9pbmZvID0gaW5mby0+cGRpX2hvc3RfcGNpZGV2X2luZm87CiAJc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbyA9IChzdHJ1Y3QgcGNpYnVzX2luZm8gKilwY2lkZXZfaW5mby0+CiAJICAgIHBkaV9wY2lidXNfaW5mbzsKLQl1aW50NjRfdCB4aW9fYWRkcjsKKwl1NjQgeGlvX2FkZHI7CiAKLQl1aW50NjRfdCB4aW9fYmFzZTsKLQl1aW50NjRfdCBvZmZzZXQ7Ci0JdWludDY0X3QgZW5kb2ZmOworCXU2NCB4aW9fYmFzZTsKKwl1NjQgb2Zmc2V0OworCXU2NCBlbmRvZmY7CiAKIAlpZiAoSVNfUENJWChwY2lidXNfaW5mbykpIHsKIAkJcmV0dXJuIDA7CkBAIC0yMDksMTYgKzIwOSwxOCBAQAogICogdW5saWtlIHRoZSBQSUMgRGV2aWNlKHgpIFdyaXRlIFJlcXVlc3QgQnVmZmVyIEZsdXNoIHJlZ2lzdGVyLgogICovCiAKLXZvaWQgc25fZG1hX2ZsdXNoKHVpbnQ2NF90IGFkZHIpCit2b2lkIHNuX2RtYV9mbHVzaCh1NjQgYWRkcikKIHsKIAluYXNpZF90IG5hc2lkOwogCWludCBpc190aW87CiAJaW50IHdpZF9udW07CiAJaW50IGksIGo7Ci0JdWludDY0X3QgZmxhZ3M7Ci0JdWludDY0X3QgaXR0ZTsKKwl1NjQgZmxhZ3M7CisJdTY0IGl0dGU7CiAJc3RydWN0IGh1YmRldl9pbmZvICpodWJpbmZvOwotCXZvbGF0aWxlIHN0cnVjdCBzbl9mbHVzaF9kZXZpY2VfbGlzdCAqcDsKKwl2b2xhdGlsZSBzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2tlcm5lbCAqcDsKKwl2b2xhdGlsZSBzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2NvbW1vbiAqY29tbW9uOworCiAJc3RydWN0IHNuX2ZsdXNoX25hc2lkX2VudHJ5ICpmbHVzaF9uYXNpZF9saXN0OwogCiAJaWYgKCFzbl9pb2lmX2luaXRlZCkKQEAgLTI2OCwxNyArMjcwLDE3IEBACiAJcCA9ICZmbHVzaF9uYXNpZF9saXN0LT53aWRnZXRfcFt3aWRfbnVtXVswXTsKIAogCS8qIGZpbmQgYSBtYXRjaGluZyBCQVIgKi8KLQlmb3IgKGkgPSAwOyBpIDwgREVWX1BFUl9XSURHRVQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBERVZfUEVSX1dJREdFVDsgaSsrLHArKykgeworCQljb21tb24gPSBwLT5jb21tb247CiAJCWZvciAoaiA9IDA7IGogPCBQQ0lfUk9NX1JFU09VUkNFOyBqKyspIHsKLQkJCWlmIChwLT5zZmRsX2Jhcl9saXN0W2pdLnN0YXJ0ID09IDApCisJCQlpZiAoY29tbW9uLT5zZmRsX2Jhcl9saXN0W2pdLnN0YXJ0ID09IDApCiAJCQkJYnJlYWs7Ci0JCQlpZiAoYWRkciA+PSBwLT5zZmRsX2Jhcl9saXN0W2pdLnN0YXJ0Ci0JCQkgICAgJiYgYWRkciA8PSBwLT5zZmRsX2Jhcl9saXN0W2pdLmVuZCkKKwkJCWlmIChhZGRyID49IGNvbW1vbi0+c2ZkbF9iYXJfbGlzdFtqXS5zdGFydAorCQkJICAgICYmIGFkZHIgPD0gY29tbW9uLT5zZmRsX2Jhcl9saXN0W2pdLmVuZCkKIAkJCQlicmVhazsKIAkJfQotCQlpZiAoaiA8IFBDSV9ST01fUkVTT1VSQ0UgJiYgcC0+c2ZkbF9iYXJfbGlzdFtqXS5zdGFydCAhPSAwKQorCQlpZiAoaiA8IFBDSV9ST01fUkVTT1VSQ0UgJiYgY29tbW9uLT5zZmRsX2Jhcl9saXN0W2pdLnN0YXJ0ICE9IDApCiAJCQlicmVhazsKLQkJcCsrOwogCX0KIAogCS8qIGlmIG5vIG1hdGNoaW5nIEJBUiwgcmV0dXJuIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuICovCkBAIC0yOTcsMzEgKzI5OSwzMSBAQAogCQkgKiBJZiBDRSBldmVyIG5lZWRzIHRoZSBzbl9kbWFfZmx1c2ggbWVjaGFuaXNtLCB3ZSB3aWxsIGhhdmUKIAkJICogdG8gYWNjb3VudCBmb3IgdGhhdCBoZXJlIGFuZCBpbiB0aW9jZV9idXNfZml4dXAoKS4KIAkgCSAqLwotCQl1aW50MzJfdCB0aW9faWQgPSBIVUJfTChUSU9fSU9TUEFDRV9BRERSKG5hc2lkLCBUSU9fTk9ERV9JRCkpOwotCQl1aW50MzJfdCByZXZudW0gPSBYV0lER0VUX1BBUlRfUkVWX05VTSh0aW9faWQpOworCQl1MzIgdGlvX2lkID0gSFVCX0woVElPX0lPU1BBQ0VfQUREUihuYXNpZCwgVElPX05PREVfSUQpKTsKKwkJdTMyIHJldm51bSA9IFhXSURHRVRfUEFSVF9SRVZfTlVNKHRpb19pZCk7CiAKIAkJLyogVElPQ1AgQlJJTkdVUCBXQVIgKFBWOTA3NTE2KTogRG9uJ3Qgd3JpdGUgYnVmZmVyIGZsdXNoIHJlZyAqLwogCQlpZiAoKDEgPDwgWFdJREdFVF9QQVJUX1JFVl9OVU1fUkVWKHJldm51bSkpICYgUFY5MDc1MTYpIHsKIAkJCXJldHVybjsKIAkJfSBlbHNlIHsKLQkJCXBjaXJlZ193cmJfZmx1c2hfZ2V0KHAtPnNmZGxfcGNpYnVzX2luZm8sCi0JCQkJCSAgICAgKHAtPnNmZGxfc2xvdCAtIDEpKTsKKwkJCXBjaXJlZ193cmJfZmx1c2hfZ2V0KGNvbW1vbi0+c2ZkbF9wY2lidXNfaW5mbywKKwkJCQkJICAgICAoY29tbW9uLT5zZmRsX3Nsb3QgLSAxKSk7CiAJCX0KIAl9IGVsc2UgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmKChzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2xpc3QgKilwKS0+Ci0JCQkJICBzZmRsX2ZsdXNoX2xvY2ssIGZsYWdzKTsKLQotCQkqcC0+c2ZkbF9mbHVzaF9hZGRyID0gMDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoKHNwaW5sb2NrX3QgKikmcC0+c2ZkbF9mbHVzaF9sb2NrLAorCQkJCSAgZmxhZ3MpOworCQkqY29tbW9uLT5zZmRsX2ZsdXNoX2FkZHIgPSAwOwogCiAJCS8qIGZvcmNlIGFuIGludGVycnVwdC4gKi8KLQkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShwLT5zZmRsX2ZvcmNlX2ludF9hZGRyKSA9IDE7CisJCSoodm9sYXRpbGUgdTMyICopKGNvbW1vbi0+c2ZkbF9mb3JjZV9pbnRfYWRkcikgPSAxOwogCiAJCS8qIHdhaXQgZm9yIHRoZSBpbnRlcnJ1cHQgdG8gY29tZSBiYWNrLiAqLwotCQl3aGlsZSAoKihwLT5zZmRsX2ZsdXNoX2FkZHIpICE9IDB4MTBmKQorCQl3aGlsZSAoKihjb21tb24tPnNmZGxfZmx1c2hfYWRkcikgIT0gMHgxMGYpCiAJCQljcHVfcmVsYXgoKTsKIAogCQkvKiBva2F5LCBldmVyeXRoaW5nIGlzIHN5bmNoZWQgdXAuICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKHNwaW5sb2NrX3QgKikmcC0+c2ZkbF9mbHVzaF9sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKHNwaW5sb2NrX3QgKikmcC0+c2ZkbF9mbHVzaF9sb2NrLAorCQkJCSAgICAgICBmbGFncyk7CiAJfQogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfcHJvdmlkZXIuYyBiL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfcHJvdmlkZXIuYwppbmRleCAxZjUwMGM4Li4yZmFjMjcwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX3Byb3ZpZGVyLmMKKysrIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9wcm92aWRlci5jCkBAIC0yMywxNCArMjMsMTYgQEAKIHNhbF9wY2licl9zbG90X2VuYWJsZShzdHJ1Y3QgcGNpYnVzX2luZm8gKnNvZnQsIGludCBkZXZpY2UsIHZvaWQgKnJlc3ApCiB7CiAJc3RydWN0IGlhNjRfc2FsX3JldHZhbCByZXRfc3R1ZmY7Ci0JdWludDY0X3QgYnVzbnVtOworCXU2NCBidXNudW07CisJdTY0IHNlZ21lbnQ7CiAKIAlyZXRfc3R1ZmYuc3RhdHVzID0gMDsKIAlyZXRfc3R1ZmYudjAgPSAwOwogCisJc2VnbWVudCA9IHNvZnQtPnBiaV9idXNjb21tb24uYnNfcGVyc2lzdF9zZWdtZW50OwogCWJ1c251bSA9IHNvZnQtPnBiaV9idXNjb21tb24uYnNfcGVyc2lzdF9idXNudW07Ci0JU0FMX0NBTExfTk9MT0NLKHJldF9zdHVmZiwgKHU2NCkgU05fU0FMX0lPSUZfU0xPVF9FTkFCTEUsICh1NjQpIGJ1c251bSwKLQkJCSh1NjQpIGRldmljZSwgKHU2NCkgcmVzcCwgMCwgMCwgMCwgMCk7CisJU0FMX0NBTExfTk9MT0NLKHJldF9zdHVmZiwgKHU2NCkgU05fU0FMX0lPSUZfU0xPVF9FTkFCTEUsIHNlZ21lbnQsCisJCQlidXNudW0sICh1NjQpIGRldmljZSwgKHU2NCkgcmVzcCwgMCwgMCwgMCk7CiAKIAlyZXR1cm4gKGludClyZXRfc3R1ZmYudjA7CiB9CkBAIC00MCwxNSArNDIsMTcgQEAKIAkJICAgICAgIHZvaWQgKnJlc3ApCiB7CiAJc3RydWN0IGlhNjRfc2FsX3JldHZhbCByZXRfc3R1ZmY7Ci0JdWludDY0X3QgYnVzbnVtOworCXU2NCBidXNudW07CisJdTY0IHNlZ21lbnQ7CiAKIAlyZXRfc3R1ZmYuc3RhdHVzID0gMDsKIAlyZXRfc3R1ZmYudjAgPSAwOwogCisJc2VnbWVudCA9IHNvZnQtPnBiaV9idXNjb21tb24uYnNfcGVyc2lzdF9zZWdtZW50OwogCWJ1c251bSA9IHNvZnQtPnBiaV9idXNjb21tb24uYnNfcGVyc2lzdF9idXNudW07CiAJU0FMX0NBTExfTk9MT0NLKHJldF9zdHVmZiwgKHU2NCkgU05fU0FMX0lPSUZfU0xPVF9ESVNBQkxFLAotCQkJKHU2NCkgYnVzbnVtLCAodTY0KSBkZXZpY2UsICh1NjQpIGFjdGlvbiwKLQkJCSh1NjQpIHJlc3AsIDAsIDAsIDApOworCQkJc2VnbWVudCwgYnVzbnVtLCAodTY0KSBkZXZpY2UsICh1NjQpIGFjdGlvbiwKKwkJCSh1NjQpIHJlc3AsIDAsIDApOwogCiAJcmV0dXJuIChpbnQpcmV0X3N0dWZmLnYwOwogfQpAQCAtNTYsNyArNjAsNyBAQAogc3RhdGljIGludCBzYWxfcGNpYnJfZXJyb3JfaW50ZXJydXB0KHN0cnVjdCBwY2lidXNfaW5mbyAqc29mdCkKIHsKIAlzdHJ1Y3QgaWE2NF9zYWxfcmV0dmFsIHJldF9zdHVmZjsKLQl1aW50NjRfdCBidXNudW07CisJdTY0IGJ1c251bTsKIAlpbnQgc2VnbWVudDsKIAlyZXRfc3R1ZmYuc3RhdHVzID0gMDsKIAlyZXRfc3R1ZmYudjAgPSAwOwpAQCAtOTIsNyArOTYsOCBAQAogCWNub2RlaWRfdCBuZWFyX2Nub2RlOwogCXN0cnVjdCBodWJkZXZfaW5mbyAqaHViZGV2X2luZm87CiAJc3RydWN0IHBjaWJ1c19pbmZvICpzb2Z0OwotCXN0cnVjdCBzbl9mbHVzaF9kZXZpY2VfbGlzdCAqc25fZmx1c2hfZGV2aWNlX2xpc3Q7CisJc3RydWN0IHNuX2ZsdXNoX2RldmljZV9rZXJuZWwgKnNuX2ZsdXNoX2RldmljZV9rZXJuZWw7CisJc3RydWN0IHNuX2ZsdXNoX2RldmljZV9jb21tb24gKmNvbW1vbjsKIAogCWlmICghIElTX1BDSV9CUklER0VfQVNJQyhwcm9tX2J1c3NvZnQtPmJzX2FzaWNfdHlwZSkpIHsKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMzcsMjAgKzE0MiwxOSBAQAogCWh1YmRldl9pbmZvID0gKHN0cnVjdCBodWJkZXZfaW5mbyAqKShOT0RFUERBKGNub2RlKS0+cGRpbmZvKTsKIAogCWlmIChodWJkZXZfaW5mby0+aGRpX2ZsdXNoX25hc2lkX2xpc3Qud2lkZ2V0X3ApIHsKLQkJc25fZmx1c2hfZGV2aWNlX2xpc3QgPSBodWJkZXZfaW5mby0+aGRpX2ZsdXNoX25hc2lkX2xpc3QuCisJCXNuX2ZsdXNoX2RldmljZV9rZXJuZWwgPSBodWJkZXZfaW5mby0+aGRpX2ZsdXNoX25hc2lkX2xpc3QuCiAJCSAgICB3aWRnZXRfcFsoaW50KXNvZnQtPnBiaV9idXNjb21tb24uYnNfeGlkXTsKLQkJaWYgKHNuX2ZsdXNoX2RldmljZV9saXN0KSB7CisJCWlmIChzbl9mbHVzaF9kZXZpY2Vfa2VybmVsKSB7CiAJCQlmb3IgKGogPSAwOyBqIDwgREVWX1BFUl9XSURHRVQ7Ci0JCQkgICAgIGorKywgc25fZmx1c2hfZGV2aWNlX2xpc3QrKykgewotCQkJCWlmIChzbl9mbHVzaF9kZXZpY2VfbGlzdC0+c2ZkbF9zbG90ID09IC0xKQorCQkJICAgICBqKyssIHNuX2ZsdXNoX2RldmljZV9rZXJuZWwrKykgeworCQkJCWNvbW1vbiA9IHNuX2ZsdXNoX2RldmljZV9rZXJuZWwtPmNvbW1vbjsKKwkJCQlpZiAoY29tbW9uLT5zZmRsX3Nsb3QgPT0gLTEpCiAJCQkJCWNvbnRpbnVlOwotCQkJCWlmICgoc25fZmx1c2hfZGV2aWNlX2xpc3QtPgotCQkJCSAgICAgc2ZkbF9wZXJzaXN0ZW50X3NlZ21lbnQgPT0KKwkJCQlpZiAoKGNvbW1vbi0+c2ZkbF9wZXJzaXN0ZW50X3NlZ21lbnQgPT0KIAkJCQkgICAgIHNvZnQtPnBiaV9idXNjb21tb24uYnNfcGVyc2lzdF9zZWdtZW50KSAmJgotCQkJCSAgICAgKHNuX2ZsdXNoX2RldmljZV9saXN0LT4KLQkJCQkgICAgIHNmZGxfcGVyc2lzdGVudF9idXNudW0gPT0KKwkJCQkgICAgIChjb21tb24tPnNmZGxfcGVyc2lzdGVudF9idXNudW0gPT0KIAkJCQkgICAgIHNvZnQtPnBiaV9idXNjb21tb24uYnNfcGVyc2lzdF9idXNudW0pKQotCQkJCQlzbl9mbHVzaF9kZXZpY2VfbGlzdC0+c2ZkbF9wY2lidXNfaW5mbyA9CisJCQkJCWNvbW1vbi0+c2ZkbF9wY2lidXNfaW5mbyA9CiAJCQkJCSAgICBzb2Z0OwogCQkJfQogCQl9CkBAIC0xNTksOSArMTYzLDkgQEAKIAkvKiBTZXR1cCB0aGUgUE1VIEFURSBtYXAgKi8KIAlzb2Z0LT5wYmlfaW50X2F0ZV9yZXNvdXJjZS5sb3dlc3RfZnJlZV9pbmRleCA9IDA7CiAJc29mdC0+cGJpX2ludF9hdGVfcmVzb3VyY2UuYXRlID0KLQkgICAga21hbGxvYyhzb2Z0LT5wYmlfaW50X2F0ZV9zaXplICogc2l6ZW9mKHVpbnQ2NF90KSwgR0ZQX0tFUk5FTCk7CisJICAgIGttYWxsb2Moc29mdC0+cGJpX2ludF9hdGVfc2l6ZSAqIHNpemVvZih1NjQpLCBHRlBfS0VSTkVMKTsKIAltZW1zZXQoc29mdC0+cGJpX2ludF9hdGVfcmVzb3VyY2UuYXRlLCAwLAotIAkgICAgICAgKHNvZnQtPnBiaV9pbnRfYXRlX3NpemUgKiBzaXplb2YodWludDY0X3QpKSk7CisgCSAgICAgICAoc29mdC0+cGJpX2ludF9hdGVfc2l6ZSAqIHNpemVvZih1NjQpKSk7CiAKIAlpZiAocHJvbV9idXNzb2Z0LT5ic19hc2ljX3R5cGUgPT0gUENJSU9fQVNJQ19UWVBFX1RJT0NQKSB7CiAJCS8qIFRJTyBQQ0kgQnJpZGdlOiBmaW5kIG5lYXJlc3Qgbm9kZSB3aXRoIENQVXMgKi8KQEAgLTIwMyw3ICsyMDcsNyBAQAogCXN0cnVjdCBwY2lkZXZfaW5mbyAqcGNpZGV2X2luZm87CiAJc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbzsKIAlpbnQgYml0ID0gc25faXJxX2luZm8tPmlycV9pbnRfYml0OwotCXVpbnQ2NF90IHh0YWxrX2FkZHIgPSBzbl9pcnFfaW5mby0+aXJxX3h0YWxrYWRkcjsKKwl1NjQgeHRhbGtfYWRkciA9IHNuX2lycV9pbmZvLT5pcnFfeHRhbGthZGRyOwogCiAJcGNpZGV2X2luZm8gPSAoc3RydWN0IHBjaWRldl9pbmZvICopc25faXJxX2luZm8tPmlycV9wY2lpb2luZm87CiAJaWYgKHBjaWRldl9pbmZvKSB7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX3JlZy5jIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9yZWcuYwppbmRleCA3OWZkYjkxLi44YjhiYmQ1IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX3JlZy5jCisrKyBiL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfcmVnLmMKQEAgLTIzLDcgKzIzLDcgQEAKIC8qCiAgKiBDb250cm9sIFJlZ2lzdGVyIEFjY2VzcyAtLSBSZWFkL1dyaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAwMDBfMDAyMAogICovCi12b2lkIHBjaXJlZ19jb250cm9sX2JpdF9jbHIoc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbywgdWludDY0X3QgYml0cykKK3ZvaWQgcGNpcmVnX2NvbnRyb2xfYml0X2NscihzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvLCB1NjQgYml0cykKIHsKIAl1bmlvbiBicl9wdHIgX19pb21lbSAqcHRyID0gKHVuaW9uIGJyX3B0ciBfX2lvbWVtICopcGNpYnVzX2luZm8tPnBiaV9idXNjb21tb24uYnNfYmFzZTsKIApAQCAtNDMsNyArNDMsNyBAQAogCX0KIH0KIAotdm9pZCBwY2lyZWdfY29udHJvbF9iaXRfc2V0KHN0cnVjdCBwY2lidXNfaW5mbyAqcGNpYnVzX2luZm8sIHVpbnQ2NF90IGJpdHMpCit2b2lkIHBjaXJlZ19jb250cm9sX2JpdF9zZXQoc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbywgdTY0IGJpdHMpCiB7CiAJdW5pb24gYnJfcHRyIF9faW9tZW0gKnB0ciA9ICh1bmlvbiBicl9wdHIgX19pb21lbSAqKXBjaWJ1c19pbmZvLT5wYmlfYnVzY29tbW9uLmJzX2Jhc2U7CiAKQEAgLTY2LDEwICs2NiwxMCBAQAogLyoKICAqIFBDSS9QQ0lYIFRhcmdldCBGbHVzaCBSZWdpc3RlciBBY2Nlc3MgLS0gUmVhZCBPbmx5CQkgICAgMDAwMF8wMDUwCiAgKi8KLXVpbnQ2NF90IHBjaXJlZ190Zmx1c2hfZ2V0KHN0cnVjdCBwY2lidXNfaW5mbyAqcGNpYnVzX2luZm8pCit1NjQgcGNpcmVnX3RmbHVzaF9nZXQoc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbykKIHsKIAl1bmlvbiBicl9wdHIgX19pb21lbSAqcHRyID0gKHVuaW9uIGJyX3B0ciBfX2lvbWVtICopcGNpYnVzX2luZm8tPnBiaV9idXNjb21tb24uYnNfYmFzZTsKLQl1aW50NjRfdCByZXQgPSAwOworCXU2NCByZXQgPSAwOwogCiAJaWYgKHBjaWJ1c19pbmZvKSB7CiAJCXN3aXRjaCAocGNpYnVzX2luZm8tPnBiaV9icmlkZ2VfdHlwZSkgewpAQCAtOTYsMTAgKzk2LDEwIEBACiAvKgogICogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciBBY2Nlc3MgLS0gUmVhZCBPbmx5CQkgICAgMDAwMF8wMTAwCiAgKi8KLXVpbnQ2NF90IHBjaXJlZ19pbnRyX3N0YXR1c19nZXQoc3RydWN0IHBjaWJ1c19pbmZvICogcGNpYnVzX2luZm8pCit1NjQgcGNpcmVnX2ludHJfc3RhdHVzX2dldChzdHJ1Y3QgcGNpYnVzX2luZm8gKiBwY2lidXNfaW5mbykKIHsKIAl1bmlvbiBicl9wdHIgX19pb21lbSAqcHRyID0gKHVuaW9uIGJyX3B0ciBfX2lvbWVtICopcGNpYnVzX2luZm8tPnBiaV9idXNjb21tb24uYnNfYmFzZTsKLQl1aW50NjRfdCByZXQgPSAwOworCXU2NCByZXQgPSAwOwogCiAJaWYgKHBjaWJ1c19pbmZvKSB7CiAJCXN3aXRjaCAocGNpYnVzX2luZm8tPnBiaV9icmlkZ2VfdHlwZSkgewpAQCAtMTIxLDcgKzEyMSw3IEBACiAvKgogICogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciBBY2Nlc3MgLS0gUmVhZC9Xcml0ZSAgICAgICAgICAgICAgICAgICAwMDAwXzAxMDgKICAqLwotdm9pZCBwY2lyZWdfaW50cl9lbmFibGVfYml0X2NscihzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvLCB1aW50NjRfdCBiaXRzKQordm9pZCBwY2lyZWdfaW50cl9lbmFibGVfYml0X2NscihzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvLCB1NjQgYml0cykKIHsKIAl1bmlvbiBicl9wdHIgX19pb21lbSAqcHRyID0gKHVuaW9uIGJyX3B0ciBfX2lvbWVtICopcGNpYnVzX2luZm8tPnBiaV9idXNjb21tb24uYnNfYmFzZTsKIApAQCAtMTQxLDcgKzE0MSw3IEBACiAJfQogfQogCi12b2lkIHBjaXJlZ19pbnRyX2VuYWJsZV9iaXRfc2V0KHN0cnVjdCBwY2lidXNfaW5mbyAqcGNpYnVzX2luZm8sIHVpbnQ2NF90IGJpdHMpCit2b2lkIHBjaXJlZ19pbnRyX2VuYWJsZV9iaXRfc2V0KHN0cnVjdCBwY2lidXNfaW5mbyAqcGNpYnVzX2luZm8sIHU2NCBiaXRzKQogewogCXVuaW9uIGJyX3B0ciBfX2lvbWVtICpwdHIgPSAodW5pb24gYnJfcHRyIF9faW9tZW0gKilwY2lidXNfaW5mby0+cGJpX2J1c2NvbW1vbi5ic19iYXNlOwogCkBAIC0xNjUsNyArMTY1LDcgQEAKICAqIEludHIgSG9zdCBBZGRyZXNzIFJlZ2lzdGVyIChpbnRfYWRkcikgLS0gUmVhZC9Xcml0ZSAgMDAwMF8wMTMwIC0gMDAwMF8wMTY4CiAgKi8KIHZvaWQgcGNpcmVnX2ludHJfYWRkcl9hZGRyX3NldChzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvLCBpbnQgaW50X24sCi0JCQkgICAgICAgdWludDY0X3QgYWRkcikKKwkJCSAgICAgICB1NjQgYWRkcikKIHsKIAl1bmlvbiBicl9wdHIgX19pb21lbSAqcHRyID0gKHVuaW9uIGJyX3B0ciBfX2lvbWVtICopcGNpYnVzX2luZm8tPnBiaV9idXNjb21tb24uYnNfYmFzZTsKIApAQCAtMjE3LDEwICsyMTcsMTAgQEAKIC8qCiAgKiBEZXZpY2UoeCkgV3JpdGUgQnVmZmVyIEZsdXNoIFJlZyBBY2Nlc3MgLS0gUmVhZCBPbmx5IDAwMDBfMDI0MCAtIDAwMDBfMDI1OAogICovCi11aW50NjRfdCBwY2lyZWdfd3JiX2ZsdXNoX2dldChzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvLCBpbnQgZGV2aWNlKQordTY0IHBjaXJlZ193cmJfZmx1c2hfZ2V0KHN0cnVjdCBwY2lidXNfaW5mbyAqcGNpYnVzX2luZm8sIGludCBkZXZpY2UpCiB7CiAJdW5pb24gYnJfcHRyIF9faW9tZW0gKnB0ciA9ICh1bmlvbiBicl9wdHIgX19pb21lbSAqKXBjaWJ1c19pbmZvLT5wYmlfYnVzY29tbW9uLmJzX2Jhc2U7Ci0JdWludDY0X3QgcmV0ID0gMDsKKwl1NjQgcmV0ID0gMDsKIAogCWlmIChwY2lidXNfaW5mbykgewogCQlzd2l0Y2ggKHBjaWJ1c19pbmZvLT5wYmlfYnJpZGdlX3R5cGUpIHsKQEAgLTI0Miw3ICsyNDIsNyBAQAogfQogCiB2b2lkIHBjaXJlZ19pbnRfYXRlX3NldChzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvLCBpbnQgYXRlX2luZGV4LAotCQkJdWludDY0X3QgdmFsKQorCQkJdTY0IHZhbCkKIHsKIAl1bmlvbiBicl9wdHIgX19pb21lbSAqcHRyID0gKHVuaW9uIGJyX3B0ciBfX2lvbWVtICopcGNpYnVzX2luZm8tPnBiaV9idXNjb21tb24uYnNfYmFzZTsKIApAQCAtMjYyLDEwICsyNjIsMTAgQEAKIAl9CiB9CiAKLXVpbnQ2NF90IF9faW9tZW0gKnBjaXJlZ19pbnRfYXRlX2FkZHIoc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbywgaW50IGF0ZV9pbmRleCkKK3U2NCBfX2lvbWVtICpwY2lyZWdfaW50X2F0ZV9hZGRyKHN0cnVjdCBwY2lidXNfaW5mbyAqcGNpYnVzX2luZm8sIGludCBhdGVfaW5kZXgpCiB7CiAJdW5pb24gYnJfcHRyIF9faW9tZW0gKnB0ciA9ICh1bmlvbiBicl9wdHIgX19pb21lbSAqKXBjaWJ1c19pbmZvLT5wYmlfYnVzY29tbW9uLmJzX2Jhc2U7Ci0JdWludDY0X3QgX19pb21lbSAqcmV0ID0gTlVMTDsKKwl1NjQgX19pb21lbSAqcmV0ID0gTlVMTDsKIAogCWlmIChwY2lidXNfaW5mbykgewogCQlzd2l0Y2ggKHBjaWJ1c19pbmZvLT5wYmlfYnJpZGdlX3R5cGUpIHsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9wY2kvdGlvY2FfcHJvdmlkZXIuYyBiL2FyY2gvaWE2NC9zbi9wY2kvdGlvY2FfcHJvdmlkZXIuYwppbmRleCAyN2FhMTg0Li43NTcxYTQwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vcGNpL3Rpb2NhX3Byb3ZpZGVyLmMKKysrIGIvYXJjaC9pYTY0L3NuL3BjaS90aW9jYV9wcm92aWRlci5jCkBAIC0xNiw3ICsxNiw3IEBACiAjaW5jbHVkZSA8YXNtL3NuL3BjaWJ1c19wcm92aWRlcl9kZWZzLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3Rpb2NhX3Byb3ZpZGVyLmg+CiAKLXVpbnQzMl90IHRpb2NhX2dhcnRfZm91bmQ7Cit1MzIgdGlvY2FfZ2FydF9mb3VuZDsKIEVYUE9SVF9TWU1CT0wodGlvY2FfZ2FydF9mb3VuZCk7CS8qIHVzZWQgYnkgYWdwLXNnaSAqLwogCiBMSVNUX0hFQUQodGlvY2FfbGlzdCk7CkBAIC0zNCw4ICszNCw4IEBACiBzdGF0aWMgaW50CiB0aW9jYV9nYXJ0X2luaXQoc3RydWN0IHRpb2NhX2tlcm5lbCAqdGlvY2Ffa2VybikKIHsKLQl1aW50NjRfdCBhcF9yZWc7Ci0JdWludDY0X3Qgb2Zmc2V0OworCXU2NCBhcF9yZWc7CisJdTY0IG9mZnNldDsKIAlzdHJ1Y3QgcGFnZSAqdG1wOwogCXN0cnVjdCB0aW9jYV9jb21tb24gKnRpb2NhX2NvbW1vbjsKIAlzdHJ1Y3QgdGlvY2EgX19pb21lbSAqY2FfYmFzZTsKQEAgLTIxNCw3ICsyMTQsNyBAQAogdGlvY2FfZmFzdHdyaXRlX2VuYWJsZShzdHJ1Y3QgdGlvY2Ffa2VybmVsICp0aW9jYV9rZXJuKQogewogCWludCBjYXBfcHRyOwotCXVpbnQzMl90IHJlZzsKKwl1MzIgcmVnOwogCXN0cnVjdCB0aW9jYSBfX2lvbWVtICp0aW9jYV9iYXNlOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCXN0cnVjdCB0aW9jYV9jb21tb24gKmNvbW1vbjsKQEAgLTI3Niw3ICsyNzYsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZSB3aWxsIGFsd2F5cyB1c2UgMHgxCiAgKiA1NTo1NSAtIFN3YXAgYnl0ZXMJCSAgIEN1cnJlbnRseSB1bnVzZWQKICAqLwotc3RhdGljIHVpbnQ2NF90CitzdGF0aWMgdTY0CiB0aW9jYV9kbWFfZDY0KHVuc2lnbmVkIGxvbmcgcGFkZHIpCiB7CiAJZG1hX2FkZHJfdCBidXNfYWRkcjsKQEAgLTMxOCwxNSArMzE4LDE1IEBACiAgKiBhbmQgc28gYSBnaXZlbiBDQSBjYW4gb25seSBkaXJlY3RseSB0YXJnZXQgbm9kZXMgaW4gdGhlIHJhbmdlCiAgKiB4eHggLSB4eHgrMjU1LgogICovCi1zdGF0aWMgdWludDY0X3QKLXRpb2NhX2RtYV9kNDgoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVpbnQ2NF90IHBhZGRyKQorc3RhdGljIHU2NAordGlvY2FfZG1hX2Q0OChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTY0IHBhZGRyKQogewogCXN0cnVjdCB0aW9jYV9jb21tb24gKnRpb2NhX2NvbW1vbjsKIAlzdHJ1Y3QgdGlvY2EgX19pb21lbSAqY2FfYmFzZTsKLQl1aW50NjRfdCBjdF9hZGRyOworCXU2NCBjdF9hZGRyOwogCWRtYV9hZGRyX3QgYnVzX2FkZHI7Ci0JdWludDMyX3Qgbm9kZV91cHBlcjsKLQl1aW50NjRfdCBhZ3BfZG1hX2V4dG47CisJdTMyIG5vZGVfdXBwZXI7CisJdTY0IGFncF9kbWFfZXh0bjsKIAlzdHJ1Y3QgcGNpZGV2X2luZm8gKnBjaWRldl9pbmZvID0gU05fUENJREVWX0lORk8ocGRldik7CiAKIAl0aW9jYV9jb21tb24gPSAoc3RydWN0IHRpb2NhX2NvbW1vbiAqKXBjaWRldl9pbmZvLT5wZGlfcGNpYnVzX2luZm87CkBAIC0zNjcsMTAgKzM2NywxMCBAQAogICogZG1hX2FkZHJfdCBpcyBndWFyZW50ZWVkIHRvIGJlIGNvbnRpZ3VvdXMgaW4gQ0EgYnVzIHNwYWNlLgogICovCiBzdGF0aWMgZG1hX2FkZHJfdAotdGlvY2FfZG1hX21hcHBlZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdWludDY0X3QgcGFkZHIsIHNpemVfdCByZXFfc2l6ZSkKK3Rpb2NhX2RtYV9tYXBwZWQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU2NCBwYWRkciwgc2l6ZV90IHJlcV9zaXplKQogewogCWludCBpLCBwcywgcHNfc2hpZnQsIGVudHJ5LCBlbnRyaWVzLCBtYXBzaXplLCBsYXN0X2VudHJ5OwotCXVpbnQ2NF90IHhpb19hZGRyLCBlbmRfeGlvX2FkZHI7CisJdTY0IHhpb19hZGRyLCBlbmRfeGlvX2FkZHI7CiAJc3RydWN0IHRpb2NhX2NvbW1vbiAqdGlvY2FfY29tbW9uOwogCXN0cnVjdCB0aW9jYV9rZXJuZWwgKnRpb2NhX2tlcm47CiAJZG1hX2FkZHJfdCBidXNfYWRkciA9IDA7CkBAIC01MTQsMTAgKzUxNCwxMCBAQAogICogVGhlIG1hcHBpbmcgbW9kZSB1c2VkIGlzIGJhc2VkIG9uIHRoZSBkZXZpY2VzIGRtYV9tYXNrLiAgQXMgYSBsYXN0IHJlc29ydAogICogdXNlIHRoZSBHQVJUIG1hcHBlZCBtb2RlLgogICovCi1zdGF0aWMgdWludDY0X3QKLXRpb2NhX2RtYV9tYXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVpbnQ2NF90IHBhZGRyLCBzaXplX3QgYnl0ZV9jb3VudCkKK3N0YXRpYyB1NjQKK3Rpb2NhX2RtYV9tYXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU2NCBwYWRkciwgc2l6ZV90IGJ5dGVfY291bnQpCiB7Ci0JdWludDY0X3QgbWFwYWRkcjsKKwl1NjQgbWFwYWRkcjsKIAogCS8qCiAJICogSWYgY2FyZCBpcyA2NCBvciA0OCBiaXQgYWRkcmVzYWJsZSwgdXNlIGEgZGlyZWN0IG1hcHBpbmcuICAzMgpAQCAtNTU0LDggKzU1NCw4IEBACiB7CiAJc3RydWN0IHRpb2NhX2NvbW1vbiAqc29mdCA9IGFyZzsKIAlzdHJ1Y3QgaWE2NF9zYWxfcmV0dmFsIHJldF9zdHVmZjsKLQl1aW50NjRfdCBzZWdtZW50OwotCXVpbnQ2NF90IGJ1c251bTsKKwl1NjQgc2VnbWVudDsKKwl1NjQgYnVzbnVtOwogCXJldF9zdHVmZi5zdGF0dXMgPSAwOwogCXJldF9zdHVmZi52MCA9IDA7CiAKQEAgLTYyMCw3ICs2MjAsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZ0aW9jYV9rZXJuLT5jYV9kbWFtYXBzKTsKIAl0aW9jYV9rZXJuLT5jYV9jbG9zZXN0X25vZGUgPQogCSAgICBuYXNpZF90b19jbm9kZWlkKHRpb2NhX2NvbW1vbi0+Y2FfY2xvc2VzdF9uYXNpZCk7Ci0JdGlvY2FfY29tbW9uLT5jYV9rZXJuZWxfcHJpdmF0ZSA9ICh1aW50NjRfdCkgdGlvY2Ffa2VybjsKKwl0aW9jYV9jb21tb24tPmNhX2tlcm5lbF9wcml2YXRlID0gKHU2NCkgdGlvY2Ffa2VybjsKIAogCWJ1cyA9IHBjaV9maW5kX2J1cyh0aW9jYV9jb21tb24tPmNhX2NvbW1vbi5ic19wZXJzaXN0X3NlZ21lbnQsCiAJCXRpb2NhX2NvbW1vbi0+Y2FfY29tbW9uLmJzX3BlcnNpc3RfYnVzbnVtKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9wY2kvdGlvY2VfcHJvdmlkZXIuYyBiL2FyY2gvaWE2NC9zbi9wY2kvdGlvY2VfcHJvdmlkZXIuYwppbmRleCBkZGExOTZjLi5lNTI4MzFlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vcGNpL3Rpb2NlX3Byb3ZpZGVyLmMKKysrIGIvYXJjaC9pYTY0L3NuL3BjaS90aW9jZV9wcm92aWRlci5jCkBAIC04MSwxMCArODEsMTAgQEAKICAqIDYxICAgIC0gMCBzaW5jZSB0aGlzIGlzIG5vdCBhbiBNU0kgdHJhbnNhY3Rpb24KICAqIDYwOjU0IC0gcmVzZXJ2ZWQsIE1CWgogICovCi1zdGF0aWMgdWludDY0X3QKK3N0YXRpYyB1NjQKIHRpb2NlX2RtYV9kNjQodW5zaWduZWQgbG9uZyBjdF9hZGRyKQogewotCXVpbnQ2NF90IGJ1c19hZGRyOworCXU2NCBidXNfYWRkcjsKIAogCWJ1c19hZGRyID0gY3RfYWRkciB8ICgxVUwgPDwgNjMpOwogCkBAIC0xNDEsOSArMTQxLDkgQEAKICAqIGxlbmd0aCwgYW5kIGlmIGVub3VnaCByZXNvdXJjZXMgZXhpc3QsIGZpbGwgaW4gdGhlIEFURSdzIGFuZCBjb25zdHJ1Y3QgYQogICogdGlvY2VfZG1hbWFwIHN0cnVjdCB0byB0cmFjayB0aGUgbWFwcGluZy4KICAqLwotc3RhdGljIHVpbnQ2NF90CitzdGF0aWMgdTY0CiB0aW9jZV9hbGxvY19tYXAoc3RydWN0IHRpb2NlX2tlcm5lbCAqY2Vfa2VybiwgaW50IHR5cGUsIGludCBwb3J0LAotCQl1aW50NjRfdCBjdF9hZGRyLCBpbnQgbGVuKQorCQl1NjQgY3RfYWRkciwgaW50IGxlbikKIHsKIAlpbnQgaTsKIAlpbnQgajsKQEAgLTE1MiwxMSArMTUyLDExIEBACiAJaW50IGVudHJpZXM7CiAJaW50IG5hdGVzOwogCWludCBwYWdlc2l6ZTsKLQl1aW50NjRfdCAqYXRlX3NoYWRvdzsKLQl1aW50NjRfdCAqYXRlX3JlZzsKLQl1aW50NjRfdCBhZGRyOworCXU2NCAqYXRlX3NoYWRvdzsKKwl1NjQgKmF0ZV9yZWc7CisJdTY0IGFkZHI7CiAJc3RydWN0IHRpb2NlICpjZV9tbXI7Ci0JdWludDY0X3QgYnVzX2Jhc2U7CisJdTY0IGJ1c19iYXNlOwogCXN0cnVjdCB0aW9jZV9kbWFtYXAgKm1hcDsKIAogCWNlX21tciA9IChzdHJ1Y3QgdGlvY2UgKiljZV9rZXJuLT5jZV9jb21tb24tPmNlX3BjaWJ1cy5ic19iYXNlOwpAQCAtMjI0LDcgKzIyNCw3IEBACiAKIAlhZGRyID0gY3RfYWRkcjsKIAlmb3IgKGogPSAwOyBqIDwgbmF0ZXM7IGorKykgewotCQl1aW50NjRfdCBhdGU7CisJCXU2NCBhdGU7CiAKIAkJYXRlID0gQVRFX01BS0UoYWRkciwgcGFnZXNpemUpOwogCQlhdGVfc2hhZG93W2kgKyBqXSA9IGF0ZTsKQEAgLTI1MiwxNSArMjUyLDE1IEBACiAgKgogICogTWFwIEBwYWRkciBpbnRvIDMyLWJpdCBidXMgc3BhY2Ugb2YgdGhlIENFIGFzc29jaWF0ZWQgd2l0aCBAcGNpZGV2X2luZm8uCiAgKi8KLXN0YXRpYyB1aW50NjRfdAotdGlvY2VfZG1hX2QzMihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdWludDY0X3QgY3RfYWRkcikKK3N0YXRpYyB1NjQKK3Rpb2NlX2RtYV9kMzIoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU2NCBjdF9hZGRyKQogewogCWludCBkbWFfb2s7CiAJaW50IHBvcnQ7CiAJc3RydWN0IHRpb2NlICpjZV9tbXI7CiAJc3RydWN0IHRpb2NlX2tlcm5lbCAqY2Vfa2VybjsKLQl1aW50NjRfdCBjdF91cHBlcjsKLQl1aW50NjRfdCBjdF9sb3dlcjsKKwl1NjQgY3RfdXBwZXI7CisJdTY0IGN0X2xvd2VyOwogCWRtYV9hZGRyX3QgYnVzX2FkZHI7CiAKIAljdF91cHBlciA9IGN0X2FkZHIgJiB+MHgzZmZmZmZmZlVMOwpAQCAtMjY5LDcgKzI2OSw3IEBACiAJcGNpZGV2X3RvX3Rpb2NlKHBkZXYsICZjZV9tbXIsICZjZV9rZXJuLCAmcG9ydCk7CiAKIAlpZiAoY2Vfa2Vybi0+Y2VfcG9ydFtwb3J0XS5kaXJtYXBfcmVmY250ID09IDApIHsKLQkJdWludDY0X3QgdG1wOworCQl1NjQgdG1wOwogCiAJCWNlX2tlcm4tPmNlX3BvcnRbcG9ydF0uZGlybWFwX3NoYWRvdyA9IGN0X3VwcGVyOwogCQl3cml0ZXEoY3RfdXBwZXIsICZjZV9tbXItPmNlX3VyZV9kaXJfbWFwW3BvcnRdKTsKQEAgLTI5NSwxMCArMjk1LDEwIEBACiAgKiBHaXZlbiBhIFRJT0NFIGJ1cyBhZGRyZXNzLCBzZXQgdGhlIGFwcHJvcHJpYXRlIGJpdCB0byBpbmRpY2F0ZSBiYXJyaWVyCiAgKiBhdHRyaWJ1dGVzLgogICovCi1zdGF0aWMgdWludDY0X3QKLXRpb2NlX2RtYV9iYXJyaWVyKHVpbnQ2NF90IGJ1c19hZGRyLCBpbnQgb24pCitzdGF0aWMgdTY0Cit0aW9jZV9kbWFfYmFycmllcih1NjQgYnVzX2FkZHIsIGludCBvbikKIHsKLQl1aW50NjRfdCBiYXJyaWVyX2JpdDsKKwl1NjQgYmFycmllcl9iaXQ7CiAKIAkvKiBiYXJyaWVyIG5vdCBzdXBwb3J0ZWQgaW4gTTQwL000MFMgbW9kZSAqLwogCWlmIChUSU9DRV9NNDBfQUREUihidXNfYWRkcikgfHwgVElPQ0VfTTQwU19BRERSKGJ1c19hZGRyKSkKQEAgLTM1MSw3ICszNTEsNyBAQAogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkobWFwLCAmY2Vfa2Vybi0+Y2VfZG1hbWFwX2xpc3QsCiAJCQkJICAgIGNlX2RtYW1hcF9saXN0KSB7Ci0JCQl1aW50NjRfdCBsYXN0OworCQkJdTY0IGxhc3Q7CiAKIAkJCWxhc3QgPSBtYXAtPnBjaV9zdGFydCArIG1hcC0+bmJ5dGVzIC0gMTsKIAkJCWlmIChidXNfYWRkciA+PSBtYXAtPnBjaV9zdGFydCAmJiBidXNfYWRkciA8PSBsYXN0KQpAQCAtMzg1LDE3ICszODUsMTcgQEAKICAqIFRoaXMgaXMgdGhlIG1haW4gd3JhcHBlciBmb3IgbWFwcGluZyBob3N0IHBoeXNpY2FsIHBhZ2VzIHRvIENFIFBDSSBzcGFjZS4KICAqIFRoZSBtYXBwaW5nIG1vZGUgdXNlZCBpcyBiYXNlZCBvbiB0aGUgZGV2aWNlJ3MgZG1hX21hc2suCiAgKi8KLXN0YXRpYyB1aW50NjRfdAotdGlvY2VfZG9fZG1hX21hcChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdWludDY0X3QgcGFkZHIsIHNpemVfdCBieXRlX2NvdW50LAorc3RhdGljIHU2NAordGlvY2VfZG9fZG1hX21hcChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTY0IHBhZGRyLCBzaXplX3QgYnl0ZV9jb3VudCwKIAkJIGludCBiYXJyaWVyKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdWludDY0X3QgY3RfYWRkcjsKLQl1aW50NjRfdCBtYXBhZGRyID0gMDsKKwl1NjQgY3RfYWRkcjsKKwl1NjQgbWFwYWRkciA9IDA7CiAJc3RydWN0IHRpb2NlX2tlcm5lbCAqY2Vfa2VybjsKIAlzdHJ1Y3QgdGlvY2VfZG1hbWFwICptYXA7CiAJaW50IHBvcnQ7Ci0JdWludDY0X3QgZG1hX21hc2s7CisJdTY0IGRtYV9tYXNrOwogCiAJZG1hX21hc2sgPSAoYmFycmllcikgPyBwZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2sgOiBwZGV2LT5kbWFfbWFzazsKIApAQCAtNDI1LDcgKzQyNSw3IEBACiAJICogYWRkcmVzcyBiaXRzIHRoYW4gdGhpcyBkZXZpY2UgY2FuIHN1cHBvcnQuCiAJICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShtYXAsICZjZV9rZXJuLT5jZV9kbWFtYXBfbGlzdCwgY2VfZG1hbWFwX2xpc3QpIHsKLQkJdWludDY0X3QgbGFzdDsKKwkJdTY0IGxhc3Q7CiAKIAkJbGFzdCA9IG1hcC0+Y3Rfc3RhcnQgKyBtYXAtPm5ieXRlcyAtIDE7CiAJCWlmIChjdF9hZGRyID49IG1hcC0+Y3Rfc3RhcnQgJiYKQEAgLTUwMSw4ICs1MDEsOCBAQAogICogU2ltcGx5IGNhbGwgdGlvY2VfZG9fZG1hX21hcCgpIHRvIGNyZWF0ZSBhIG1hcCB3aXRoIHRoZSBiYXJyaWVyIGJpdCBjbGVhcgogICogaW4gdGhlIGFkZHJlc3MuCiAgKi8KLXN0YXRpYyB1aW50NjRfdAotdGlvY2VfZG1hKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1aW50NjRfdCBwYWRkciwgc2l6ZV90IGJ5dGVfY291bnQpCitzdGF0aWMgdTY0Cit0aW9jZV9kbWEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU2NCBwYWRkciwgc2l6ZV90IGJ5dGVfY291bnQpCiB7CiAJcmV0dXJuIHRpb2NlX2RvX2RtYV9tYXAocGRldiwgcGFkZHIsIGJ5dGVfY291bnQsIDApOwogfQpAQCAtNTE1LDggKzUxNSw4IEBACiAgKgogICogU2ltcGx5IGNhbGwgdGlvY2VfZG9fZG1hX21hcCgpIHRvIGNyZWF0ZSBhIG1hcCB3aXRoIHRoZSBiYXJyaWVyIGJpdCBzZXQKICAqIGluIHRoZSBhZGRyZXNzLgotICovIHN0YXRpYyB1aW50NjRfdAotdGlvY2VfZG1hX2NvbnNpc3RlbnQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVpbnQ2NF90IHBhZGRyLCBzaXplX3QgYnl0ZV9jb3VudCkKKyAqLyBzdGF0aWMgdTY0Cit0aW9jZV9kbWFfY29uc2lzdGVudChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTY0IHBhZGRyLCBzaXplX3QgYnl0ZV9jb3VudCkKIHsKIAlyZXR1cm4gdGlvY2VfZG9fZG1hX21hcChwZGV2LCBwYWRkciwgYnl0ZV9jb3VudCwgMSk7CiB9CkBAIC01NTEsNyArNTUxLDcgQEAKIHRpb2NlX2tlcm5faW5pdChzdHJ1Y3QgdGlvY2VfY29tbW9uICp0aW9jZV9jb21tb24pCiB7CiAJaW50IGk7Ci0JdWludDMyX3QgdG1wOworCXUzMiB0bXA7CiAJc3RydWN0IHRpb2NlICp0aW9jZV9tbXI7CiAJc3RydWN0IHRpb2NlX2tlcm5lbCAqdGlvY2Vfa2VybjsKIApAQCAtNTYzLDcgKzU2Myw3IEBACiAJdGlvY2Vfa2Vybi0+Y2VfY29tbW9uID0gdGlvY2VfY29tbW9uOwogCXNwaW5fbG9ja19pbml0KCZ0aW9jZV9rZXJuLT5jZV9sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmdGlvY2Vfa2Vybi0+Y2VfZG1hbWFwX2xpc3QpOwotCXRpb2NlX2NvbW1vbi0+Y2Vfa2VybmVsX3ByaXZhdGUgPSAodWludDY0X3QpIHRpb2NlX2tlcm47CisJdGlvY2VfY29tbW9uLT5jZV9rZXJuZWxfcHJpdmF0ZSA9ICh1NjQpIHRpb2NlX2tlcm47CiAKIAkvKgogCSAqIERldGVybWluZSB0aGUgc2Vjb25kYXJ5IGJ1cyBudW1iZXIgb2YgdGhlIHBvcnQyIGxvZ2ljYWwgUFBCLgpAQCAtNTc1LDcgKzU3NSw3IEBACiAJcmF3X3BjaV9vcHMtPnJlYWQodGlvY2VfY29tbW9uLT5jZV9wY2lidXMuYnNfcGVyc2lzdF9zZWdtZW50LAogCQkJICB0aW9jZV9jb21tb24tPmNlX3BjaWJ1cy5ic19wZXJzaXN0X2J1c251bSwKIAkJCSAgUENJX0RFVkZOKDIsIDApLCBQQ0lfU0VDT05EQVJZX0JVUywgMSwgJnRtcCk7Ci0JdGlvY2Vfa2Vybi0+Y2VfcG9ydDFfc2Vjb25kYXJ5ID0gKHVpbnQ4X3QpIHRtcDsKKwl0aW9jZV9rZXJuLT5jZV9wb3J0MV9zZWNvbmRhcnkgPSAodTgpIHRtcDsKIAogCS8qCiAJICogU2V0IFBNVSBwYWdlc2l6ZSB0byB0aGUgbGFyZ2VzdCBzaXplIGF2YWlsYWJsZSwgYW5kIHplcm8gb3V0CkBAIC02MTUsNyArNjE1LDcgQEAKIAlzdHJ1Y3QgcGNpZGV2X2luZm8gKnBjaWRldl9pbmZvOwogCXN0cnVjdCB0aW9jZV9jb21tb24gKmNlX2NvbW1vbjsKIAlzdHJ1Y3QgdGlvY2UgKmNlX21tcjsKLQl1aW50NjRfdCBmb3JjZV9pbnRfdmFsOworCXU2NCBmb3JjZV9pbnRfdmFsOwogCiAJaWYgKCFzbl9pcnFfaW5mby0+aXJxX2JyaWRnZSkKIAkJcmV0dXJuOwpAQCAtNjg3LDcgKzY4Nyw3IEBACiAJc3RydWN0IHRpb2NlX2NvbW1vbiAqY2VfY29tbW9uOwogCXN0cnVjdCB0aW9jZSAqY2VfbW1yOwogCWludCBiaXQ7Ci0JdWludDY0X3QgdmVjdG9yOworCXU2NCB2ZWN0b3I7CiAKIAlwY2lkZXZfaW5mbyA9IChzdHJ1Y3QgcGNpZGV2X2luZm8gKilzbl9pcnFfaW5mby0+aXJxX3BjaWlvaW5mbzsKIAlpZiAoIXBjaWRldl9pbmZvKQpAQCAtNjk5LDcgKzY5OSw3IEBACiAJYml0ID0gc25faXJxX2luZm8tPmlycV9pbnRfYml0OwogCiAJX19zbl9zZXRxX3JlbGF4ZWQoJmNlX21tci0+Y2VfYWRtX2ludF9tYXNrLCAoMVVMIDw8IGJpdCkpOwotCXZlY3RvciA9ICh1aW50NjRfdClzbl9pcnFfaW5mby0+aXJxX2lycSA8PCBJTlRSX1ZFQ1RPUl9TSEZUOworCXZlY3RvciA9ICh1NjQpc25faXJxX2luZm8tPmlycV9pcnEgPDwgSU5UUl9WRUNUT1JfU0hGVDsKIAl2ZWN0b3IgfD0gc25faXJxX2luZm8tPmlycV94dGFsa2FkZHI7CiAJd3JpdGVxKHZlY3RvciwgJmNlX21tci0+Y2VfYWRtX2ludF9kZXN0W2JpdF0pOwogCV9fc25fY2xycV9yZWxheGVkKCZjZV9tbXItPmNlX2FkbV9pbnRfbWFzaywgKDFVTCA8PCBiaXQpKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9LY29uZmlnIGIvYXJjaC9tMzJyL0tjb25maWcKaW5kZXggZmFlNjdiYi4uYTNkY2MzZiAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL0tjb25maWcKKysrIGIvYXJjaC9tMzJyL0tjb25maWcKQEAgLTEyLDEwICsxMiw2IEBACiBjb25maWcgU0JVUwogCWJvb2wKIAotY29uZmlnIFVJRDE2Ci0JYm9vbAotCWRlZmF1bHQgbgotCiBjb25maWcgR0VORVJJQ19JU0FfRE1BCiAJYm9vbAogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9tMzJyX2tzeW1zLmMgYi9hcmNoL20zMnIva2VybmVsL20zMnJfa3N5bXMuYwppbmRleCBlNWVjMTM0Li5kYmM4YTM5IDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL20zMnJfa3N5bXMuYworKysgYi9hcmNoL20zMnIva2VybmVsL20zMnJfa3N5bXMuYwpAQCAtMTgsOCArMTgsNiBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KIAotZXh0ZXJuIHZvaWQgZHVtcF90aHJlYWQoc3RydWN0IHB0X3JlZ3MgKiwgc3RydWN0IHVzZXIgKik7Ci0KICNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX0lERSkgfHwgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9IRCkgfHwgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9JREVfTU9EVUxFKSB8fCBkZWZpbmVkKENPTkZJR19CTEtfREVWX0hEX01PRFVMRSkKIGV4dGVybiBzdHJ1Y3QgZHJpdmVfaW5mb19zdHJ1Y3QgZHJpdmVfaW5mbzsKIEVYUE9SVF9TWU1CT0woZHJpdmVfaW5mbyk7CkBAIC0yNyw3ICsyNSw2IEBACiAKIC8qIHBsYXRmb3JtIGRlcGVuZGVudCBzdXBwb3J0ICovCiBFWFBPUlRfU1lNQk9MKGJvb3RfY3B1X2RhdGEpOwotRVhQT1JUX1NZTUJPTChkdW1wX3RocmVhZCk7CiBFWFBPUlRfU1lNQk9MKGR1bXBfZnB1KTsKIEVYUE9SVF9TWU1CT0woX19pb3JlbWFwKTsKIEVYUE9SVF9TWU1CT0woaW91bm1hcCk7CmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvbTMyci9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGNjNGI1NzEuLjVkZmM3ZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvcHJvY2Vzcy5jCkBAIC01MCw2ICs1MCwxMCBAQAogICogUG93ZXJtYW5hZ2VtZW50IGlkbGUgZnVuY3Rpb24sIGlmIGFueS4uCiAgKi8KIHZvaWQgKCpwbV9pZGxlKSh2b2lkKSA9IE5VTEw7CitFWFBPUlRfU1lNQk9MKHBtX2lkbGUpOworCit2b2lkICgqcG1fcG93ZXJfb2ZmKSh2b2lkKSA9IE5VTEw7CitFWFBPUlRfU1lNQk9MKHBtX3Bvd2VyX29mZik7CiAKIHZvaWQgZGlzYWJsZV9obHQodm9pZCkKIHsKQEAgLTIzOCwxMyArMjQyLDEwIEBACiBpbnQgY29weV90aHJlYWQoaW50IG5yLCB1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLCB1bnNpZ25lZCBsb25nIHNwdSwKIAl1bnNpZ25lZCBsb25nIHVudXNlZCwgc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCBwdF9yZWdzICpjaGlsZHJlZ3M7Ci0JdW5zaWduZWQgbG9uZyBzcCA9ICh1bnNpZ25lZCBsb25nKXRzay0+dGhyZWFkX2luZm8gKyBUSFJFQURfU0laRTsKKwlzdHJ1Y3QgcHRfcmVncyAqY2hpbGRyZWdzID0gdGFza19wdF9yZWdzKHRzayk7CiAJZXh0ZXJuIHZvaWQgcmV0X2Zyb21fZm9yayh2b2lkKTsKIAogCS8qIENvcHkgcmVnaXN0ZXJzICovCi0Jc3AgLT0gc2l6ZW9mIChzdHJ1Y3QgcHRfcmVncyk7Ci0JY2hpbGRyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopc3A7CiAJKmNoaWxkcmVncyA9ICpyZWdzOwogCiAJY2hpbGRyZWdzLT5zcHUgPSBzcHU7CkBAIC0yNTcsMTQgKzI1OCw2IEBACiB9CiAKIC8qCi0gKiBmaWxsIGluIHRoZSB1c2VyIHN0cnVjdHVyZSBmb3IgYSBjb3JlIGR1bXAuLgotICovCi12b2lkIGR1bXBfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICogcmVncywgc3RydWN0IHVzZXIgKiBkdW1wKQotewotCS8qIE0zMlJfRklYTUUgKi8KLX0KLQotLyoKICAqIENhcHR1cmUgdGhlIHVzZXIgc3BhY2UgcmVnaXN0ZXJzIGlmIHRoZSB0YXNrIGlzIG5vdCBydW5uaW5nIChpbiB1c2VyIHNwYWNlKQogICovCiBpbnQgZHVtcF90YXNrX3JlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGVsZl9ncmVnc2V0X3QgKnJlZ3MpCmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9tMzJyL2tlcm5lbC9wdHJhY2UuYwppbmRleCAwNzhkMmEwLi4zNDBhM2JmIDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvcHRyYWNlLmMKQEAgLTM1LDIzICszNSw2IEBACiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAKIC8qCi0gKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGxpdmUgcHRfcmVncyBmb3IgdGhlIHNwZWNpZmllZCB0YXNrLgotICogVGhlc2UgYXJlIHNhdmVkIG9udG8gdGhlIHRvcCBrZXJuZWwgc3RhY2sgd2hlbiB0aGUgcHJvY2VzcwotICogaXMgbm90IHJ1bm5pbmcuCi0gKgotICogTm90ZTogaWYgYSB1c2VyIHRocmVhZCBpcyBleGVjdmUnZCBmcm9tIGtlcm5lbCBzcGFjZSwgdGhlCi0gKiBrZXJuZWwgc3RhY2sgd2lsbCBub3QgYmUgZW1wdHkgb24gZW50cnkgdG8gdGhlIGtlcm5lbCwgc28KLSAqIHB0cmFjaW5nIHRoZXNlIHRhc2tzIHdpbGwgZmFpbC4KLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgcHRfcmVncyAqCi1nZXRfdXNlcl9yZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKLXsKLSAgICAgICAgcmV0dXJuIChzdHJ1Y3QgcHRfcmVncyAqKQotICAgICAgICAgICAgICAgICgodW5zaWduZWQgbG9uZyl0YXNrLT50aHJlYWRfaW5mbyArIFRIUkVBRF9TSVpFCi0gICAgICAgICAgICAgICAgIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7Ci19Ci0KLS8qCiAgKiBUaGlzIHJvdXRpbmUgd2lsbCBnZXQgYSB3b3JkIG9mZiBvZiB0aGUgcHJvY2VzcyBrZXJuZWwgc3RhY2suCiAgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBpbnQKQEAgLTU5LDcgKzQyLDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nICpzdGFjazsKIAotCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKilnZXRfdXNlcl9yZWdzKHRhc2spOworCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKil0YXNrX3B0X3JlZ3ModGFzayk7CiAKIAlyZXR1cm4gc3RhY2tbb2Zmc2V0XTsKIH0KQEAgLTcyLDcgKzU1LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nICpzdGFjazsKIAotCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKilnZXRfdXNlcl9yZWdzKHRhc2spOworCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKil0YXNrX3B0X3JlZ3ModGFzayk7CiAJc3RhY2tbb2Zmc2V0XSA9IGRhdGE7CiAKIAlyZXR1cm4gMDsKQEAgLTIwOCw3ICsxOTEsNyBAQAogICovCiBzdGF0aWMgaW50IHB0cmFjZV9nZXRyZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB2b2lkIF9fdXNlciAqdXJlZ3MpCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBnZXRfdXNlcl9yZWdzKHRzayk7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3ModHNrKTsKIAogCXJldHVybiBjb3B5X3RvX3VzZXIodXJlZ3MsIHJlZ3MsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpID8gLUVGQVVMVCA6IDA7CiB9CkBAIC0yMjMsNyArMjA2LDcgQEAKIAogCXJldCA9IC1FRkFVTFQ7CiAJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdyZWdzLCB1cmVncywgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSkgPT0gMCkgewotCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF91c2VyX3JlZ3ModHNrKTsKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3ModHNrKTsKIAkJKnJlZ3MgPSBuZXdyZWdzOwogCQlyZXQgPSAwOwogCX0KQEAgLTc2MiwyOCArNzQ1LDE2IEBACiAJaW50IHJldDsKIAogCWxvY2tfa2VybmVsKCk7Ci0JcmV0ID0gLUVQRVJNOwogCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9UUkFDRU1FKSB7Ci0JCS8qIGFyZSB3ZSBhbHJlYWR5IGJlaW5nIHRyYWNlZD8gKi8KLQkJaWYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpCi0JCQlnb3RvIG91dDsKLQkJLyogc2V0IHRoZSBwdHJhY2UgYml0IGluIHRoZSBwcm9jZXNzIGZsYWdzLiAqLwotCQljdXJyZW50LT5wdHJhY2UgfD0gUFRfUFRSQUNFRDsKLQkJcmV0ID0gMDsKKwkJcmV0ID0gcHRyYWNlX3RyYWNlbWUoKTsKIAkJZ290byBvdXQ7CiAJfQotCXJldCA9IC1FU1JDSDsKLQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwotCWNoaWxkID0gZmluZF90YXNrX2J5X3BpZChwaWQpOwotCWlmIChjaGlsZCkKLQkJZ2V0X3Rhc2tfc3RydWN0KGNoaWxkKTsKLQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7Ci0JaWYgKCFjaGlsZCkKLQkJZ290byBvdXQ7CiAKLQlyZXQgPSAtRVBFUk07Ci0JaWYgKHBpZCA9PSAxKQkJLyogeW91IG1heSBub3QgbWVzcyB3aXRoIGluaXQgKi8KKwljaGlsZCA9IHB0cmFjZV9nZXRfdGFza19zdHJ1Y3QocGlkKTsKKwlpZiAoSVNfRVJSKGNoaWxkKSkgeworCQlyZXQgPSBQVFJfRVJSKGNoaWxkKTsKIAkJZ290byBvdXQ7CisJfQogCiAJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX0FUVEFDSCkgewogCQlyZXQgPSBwdHJhY2VfYXR0YWNoKGNoaWxkKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC9tMzJyL2tlcm5lbC9zbXBib290LmMKaW5kZXggYjkwYzU0MS4uZDdlYzE2ZSAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zbXBib290LmMKQEAgLTI4Niw3ICsyODYsNyBAQAogCS8qIFNvIHdlIHNlZSB3aGF0J3MgdXAgICAqLwogCXByaW50aygiQm9vdGluZyBwcm9jZXNzb3IgJWQvJWRcbiIsIHBoeXNfaWQsIGNwdV9pZCk7CiAJc3RhY2tfc3RhcnQuc3BpID0gKHZvaWQgKilpZGxlLT50aHJlYWQuc3A7Ci0JaWRsZS0+dGhyZWFkX2luZm8tPmNwdSA9IGNwdV9pZDsKKwl0YXNrX3RocmVhZF9pbmZvKGlkbGUpLT5jcHUgPSBjcHVfaWQ7CiAKIAkvKgogCSAqIFNlbmQgU3RhcnR1cCBJUEkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9LY29uZmlnIGIvYXJjaC9tNjhrL0tjb25maWcKaW5kZXggMWRkNWQxOC4uOTZiOTE5OCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL0tjb25maWcKKysrIGIvYXJjaC9tNjhrL0tjb25maWcKQEAgLTEwLDEwICsxMCw2IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCi1jb25maWcgVUlEMTYKLQlib29sCi0JZGVmYXVsdCB5Ci0KIGNvbmZpZyBSV1NFTV9HRU5FUklDX1NQSU5MT0NLCiAJYm9vbAogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2FtaWdhL2FtaWludHMuYyBiL2FyY2gvbTY4ay9hbWlnYS9hbWlpbnRzLmMKaW5kZXggZDllZGYyZC4uYjBhYTYxYiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2FtaWdhL2FtaWludHMuYworKysgYi9hcmNoL202OGsvYW1pZ2EvYW1paW50cy5jCkBAIC0xMjYsOSArMTI2LDkgQEAKIAkJZ2F5bGUuaW50ZW4gPSBHQVlMRV9JUlFfSURFOwogCiAJLyogdHVybiBvZmYgYWxsIGludGVycnVwdHMgYW5kIGVuYWJsZSB0aGUgbWFzdGVyIGludGVycnVwdCBiaXQgKi8KLQljdXN0b20uaW50ZW5hID0gMHg3ZmZmOwotCWN1c3RvbS5pbnRyZXEgPSAweDdmZmY7Ci0JY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IElGX0lOVEVOOworCWFtaWdhX2N1c3RvbS5pbnRlbmEgPSAweDdmZmY7CisJYW1pZ2FfY3VzdG9tLmludHJlcSA9IDB4N2ZmZjsKKwlhbWlnYV9jdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgSUZfSU5URU47CiAKIAljaWFfaW5pdF9JUlEoJmNpYWFfYmFzZSk7CiAJY2lhX2luaXRfSVJRKCZjaWFiX2Jhc2UpOwpAQCAtMjQ1LDcgKzI0NSw3IEBACiAKIAkvKiBlbmFibGUgdGhlIGludGVycnVwdCAqLwogCWlmIChpcnEgPCBJUlFfQU1JR0FfUE9SVFMgJiYgIWFtaV9hYmxlY291bnRbaXJxXSkKLQkJY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IGFtaWdhX2ludGVuYV92YWxzW2lycV07CisJCWFtaWdhX2N1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBhbWlnYV9pbnRlbmFfdmFsc1tpcnFdOwogCiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMjc0LDcgKzI3NCw3IEBACiAJCWFtaWdhX2RlbGV0ZV9pcnEoJmFtaV9pcnFfbGlzdFtpcnFdLCBkZXZfaWQpOwogCQkvKiBpZiBzZXJ2ZXIgbGlzdCBlbXB0eSwgZGlzYWJsZSB0aGUgaW50ZXJydXB0ICovCiAJCWlmICghYW1pX2lycV9saXN0W2lycV0gJiYgaXJxIDwgSVJRX0FNSUdBX1BPUlRTKQotCQkJY3VzdG9tLmludGVuYSA9IGFtaWdhX2ludGVuYV92YWxzW2lycV07CisJCQlhbWlnYV9jdXN0b20uaW50ZW5hID0gYW1pZ2FfaW50ZW5hX3ZhbHNbaXJxXTsKIAl9IGVsc2UgewogCQlpZiAoYW1pX2lycV9saXN0W2lycV0tPmRldl9pZCAhPSBkZXZfaWQpCiAJCQlwcmludGsoIiVzOiByZW1vdmluZyBwcm9iYWJseSB3cm9uZyBJUlEgJWQgZnJvbSAlc1xuIiwKQEAgLTI4Myw3ICsyODMsNyBAQAogCQlhbWlfaXJxX2xpc3RbaXJxXS0+ZmxhZ3MgICA9IDA7CiAJCWFtaV9pcnFfbGlzdFtpcnFdLT5kZXZfaWQgID0gTlVMTDsKIAkJYW1pX2lycV9saXN0W2lycV0tPmRldm5hbWUgPSBOVUxMOwotCQljdXN0b20uaW50ZW5hID0gYW1pZ2FfaW50ZW5hX3ZhbHNbaXJxXTsKKwkJYW1pZ2FfY3VzdG9tLmludGVuYSA9IGFtaWdhX2ludGVuYV92YWxzW2lycV07CiAJfQogfQogCkBAIC0zMjcsNyArMzI3LDcgQEAKIAl9CiAKIAkvKiBlbmFibGUgdGhlIGludGVycnVwdCAqLwotCWN1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBhbWlnYV9pbnRlbmFfdmFsc1tpcnFdOworCWFtaWdhX2N1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBhbWlnYV9pbnRlbmFfdmFsc1tpcnFdOwogfQogCiB2b2lkIGFtaWdhX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCkBAIC0zNTgsNyArMzU4LDcgQEAKIAl9CiAKIAkvKiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgKi8KLQljdXN0b20uaW50ZW5hID0gYW1pZ2FfaW50ZW5hX3ZhbHNbaXJxXTsKKwlhbWlnYV9jdXN0b20uaW50ZW5hID0gYW1pZ2FfaW50ZW5hX3ZhbHNbaXJxXTsKIH0KIAogaW5saW5lIHZvaWQgYW1pZ2FfZG9faXJxKGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpmcCkKQEAgLTM3Myw3ICszNzMsNyBAQAogCiAJa3N0YXRfY3B1KDApLmlycXNbU1lTX0lSUVMgKyBpcnFdKys7CiAKLQljdXN0b20uaW50cmVxID0gYW1pZ2FfaW50ZW5hX3ZhbHNbaXJxXTsKKwlhbWlnYV9jdXN0b20uaW50cmVxID0gYW1pZ2FfaW50ZW5hX3ZhbHNbaXJxXTsKIAogCWZvciAobm9kZSA9IGFtaV9pcnFfbGlzdFtpcnFdOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkKIAkJbm9kZS0+aGFuZGxlcihpcnEsIG5vZGUtPmRldl9pZCwgZnApOwpAQCAtMzg1LDIzICszODUsMjMgQEAKIAogc3RhdGljIGlycXJldHVybl90IGFtaV9pbnQxKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQogewotCXVuc2lnbmVkIHNob3J0IGludHMgPSBjdXN0b20uaW50cmVxciAmIGN1c3RvbS5pbnRlbmFyOworCXVuc2lnbmVkIHNob3J0IGludHMgPSBhbWlnYV9jdXN0b20uaW50cmVxciAmIGFtaWdhX2N1c3RvbS5pbnRlbmFyOwogCiAJLyogaWYgc2VyaWFsIHRyYW5zbWl0IGJ1ZmZlciBlbXB0eSwgaW50ZXJydXB0ICovCiAJaWYgKGludHMgJiBJRl9UQkUpIHsKLQkJY3VzdG9tLmludHJlcSA9IElGX1RCRTsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX1RCRTsKIAkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9UQkUsIGZwKTsKIAl9CiAKIAkvKiBpZiBmbG9wcHkgZGlzayB0cmFuc2ZlciBjb21wbGV0ZSwgaW50ZXJydXB0ICovCiAJaWYgKGludHMgJiBJRl9EU0tCTEspIHsKLQkJY3VzdG9tLmludHJlcSA9IElGX0RTS0JMSzsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0RTS0JMSzsKIAkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9EU0tCTEssIGZwKTsKIAl9CiAKIAkvKiBpZiBzb2Z0d2FyZSBpbnRlcnJ1cHQgc2V0LCBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX1NPRlQpIHsKLQkJY3VzdG9tLmludHJlcSA9IElGX1NPRlQ7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9TT0ZUOwogCQlhbWlnYV9kb19pcnEoSVJRX0FNSUdBX1NPRlQsIGZwKTsKIAl9CiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtNDA5LDE3ICs0MDksMTcgQEAKIAogc3RhdGljIGlycXJldHVybl90IGFtaV9pbnQzKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQogewotCXVuc2lnbmVkIHNob3J0IGludHMgPSBjdXN0b20uaW50cmVxciAmIGN1c3RvbS5pbnRlbmFyOworCXVuc2lnbmVkIHNob3J0IGludHMgPSBhbWlnYV9jdXN0b20uaW50cmVxciAmIGFtaWdhX2N1c3RvbS5pbnRlbmFyOwogCiAJLyogaWYgYSBibGl0dGVyIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfQkxJVCkgewotCQljdXN0b20uaW50cmVxID0gSUZfQkxJVDsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0JMSVQ7CiAJCWFtaWdhX2RvX2lycShJUlFfQU1JR0FfQkxJVCwgZnApOwogCX0KIAogCS8qIGlmIGEgY29wcGVyIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfQ09QRVIpIHsKLQkJY3VzdG9tLmludHJlcSA9IElGX0NPUEVSOworCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQ09QRVI7CiAJCWFtaWdhX2RvX2lycShJUlFfQU1JR0FfQ09QUEVSLCBmcCk7CiAJfQogCkBAIC00MzEsMjkgKzQzMSwyOSBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3QgYW1pX2ludDQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCiB7Ci0JdW5zaWduZWQgc2hvcnQgaW50cyA9IGN1c3RvbS5pbnRyZXFyICYgY3VzdG9tLmludGVuYXI7CisJdW5zaWduZWQgc2hvcnQgaW50cyA9IGFtaWdhX2N1c3RvbS5pbnRyZXFyICYgYW1pZ2FfY3VzdG9tLmludGVuYXI7CiAKIAkvKiBpZiBhdWRpbyAwIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfQVVEMCkgewotCQljdXN0b20uaW50cmVxID0gSUZfQVVEMDsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0FVRDA7CiAJCWFtaWdhX2RvX2lycShJUlFfQU1JR0FfQVVEMCwgZnApOwogCX0KIAogCS8qIGlmIGF1ZGlvIDEgaW50ZXJydXB0ICovCiAJaWYgKGludHMgJiBJRl9BVUQxKSB7Ci0JCWN1c3RvbS5pbnRyZXEgPSBJRl9BVUQxOworCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQVVEMTsKIAkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9BVUQxLCBmcCk7CiAJfQogCiAJLyogaWYgYXVkaW8gMiBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX0FVRDIpIHsKLQkJY3VzdG9tLmludHJlcSA9IElGX0FVRDI7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9BVUQyOwogCQlhbWlnYV9kb19pcnEoSVJRX0FNSUdBX0FVRDIsIGZwKTsKIAl9CiAKIAkvKiBpZiBhdWRpbyAzIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfQVVEMykgewotCQljdXN0b20uaW50cmVxID0gSUZfQVVEMzsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0FVRDM7CiAJCWFtaWdhX2RvX2lycShJUlFfQU1JR0FfQVVEMywgZnApOwogCX0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC00NjEsNyArNDYxLDcgQEAKIAogc3RhdGljIGlycXJldHVybl90IGFtaV9pbnQ1KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQogewotCXVuc2lnbmVkIHNob3J0IGludHMgPSBjdXN0b20uaW50cmVxciAmIGN1c3RvbS5pbnRlbmFyOworCXVuc2lnbmVkIHNob3J0IGludHMgPSBhbWlnYV9jdXN0b20uaW50cmVxciAmIGFtaWdhX2N1c3RvbS5pbnRlbmFyOwogCiAJLyogaWYgc2VyaWFsIHJlY2VpdmUgYnVmZmVyIGZ1bGwgaW50ZXJydXB0ICovCiAJaWYgKGludHMgJiBJRl9SQkYpIHsKQEAgLTQ3MSw3ICs0NzEsNyBAQAogCiAJLyogaWYgYSBkaXNrIHN5bmMgaW50ZXJydXB0ICovCiAJaWYgKGludHMgJiBJRl9EU0tTWU4pIHsKLQkJY3VzdG9tLmludHJlcSA9IElGX0RTS1NZTjsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0RTS1NZTjsKIAkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9EU0tTWU4sIGZwKTsKIAl9CiAJcmV0dXJuIElSUV9IQU5ETEVEOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2FtaWdhL2FtaXNvdW5kLmMgYi9hcmNoL202OGsvYW1pZ2EvYW1pc291bmQuYwppbmRleCBiZDVkMTM0ZS4uYWU5NGRiNSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2FtaWdhL2FtaXNvdW5kLmMKKysrIGIvYXJjaC9tNjhrL2FtaWdhL2FtaXNvdW5kLmMKQEAgLTI0LDYgKzI0LDggQEAKIH07CiAjZGVmaW5lIERBVEFfU0laRQkoc2l6ZW9mKHNpbmVfZGF0YSkvc2l6ZW9mKHNpbmVfZGF0YVswXSkpCiAKKyNkZWZpbmUgY3VzdG9tIGFtaWdhX2N1c3RvbQorCiAgICAgLyoKICAgICAgKiBUaGUgbWluaW11bSBwZXJpb2QgZm9yIGF1ZGlvIG1heSBiZSBtb2RpZmllZCBieSB0aGUgZnJhbWUgYnVmZmVyCiAgICAgICogZGV2aWNlIHNpbmNlIGl0IGRlcGVuZHMgb24gaHRvdGFsIChmb3IgT0NTL0VDUy9BR0EpCmRpZmYgLS1naXQgYS9hcmNoL202OGsvYW1pZ2EvY2lhLmMgYi9hcmNoL202OGsvYW1pZ2EvY2lhLmMKaW5kZXggN2Q1NTY4Mi4uOTQ3NmViOSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2FtaWdhL2NpYS5jCisrKyBiL2FyY2gvbTY4ay9hbWlnYS9jaWEuYwpAQCAtNjAsNyArNjAsNyBAQAogCWVsc2UKIAkJYmFzZS0+aWNyX2RhdGEgJj0gfm1hc2s7CiAJaWYgKGJhc2UtPmljcl9kYXRhICYgYmFzZS0+aWNyX21hc2spCi0JCWN1c3RvbS5pbnRyZXEgPSBJRl9TRVRDTFIgfCBiYXNlLT5pbnRfbWFzazsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX1NFVENMUiB8IGJhc2UtPmludF9tYXNrOwogCXJldHVybiBvbGQgJiBiYXNlLT5pY3JfbWFzazsKIH0KIApAQCAtODksNyArODksNyBAQAogCQl9CiAJfQogCWlmIChiYXNlLT5pY3JfZGF0YSAmIGJhc2UtPmljcl9tYXNrKQotCQljdXN0b20uaW50cmVxID0gSUZfU0VUQ0xSIHwgYmFzZS0+aW50X21hc2s7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9TRVRDTFIgfCBiYXNlLT5pbnRfbWFzazsKIAlyZXR1cm4gb2xkOwogfQogCkBAIC0xMzMsNyArMTMzLDcgQEAKIAltYWNoX2lycSA9IGJhc2UtPmNpYV9pcnE7CiAJaXJxID0gU1lTX0lSUVMgKyBtYWNoX2lycTsKIAlpbnRzID0gY2lhX3NldF9pcnEoYmFzZSwgQ0lBX0lDUl9BTEwpOwotCWN1c3RvbS5pbnRyZXEgPSBiYXNlLT5pbnRfbWFzazsKKwlhbWlnYV9jdXN0b20uaW50cmVxID0gYmFzZS0+aW50X21hc2s7CiAJZm9yIChpID0gMDsgaSA8IENJQV9JUlFTOyBpKyssIGlycSsrLCBtYWNoX2lycSsrKSB7CiAJCWlmIChpbnRzICYgMSkgewogCQkJa3N0YXRfY3B1KDApLmlycXNbaXJxXSsrOwpAQCAtMTYyLDcgKzE2Miw3IEBACiAJLyogaW5zdGFsbCBDSUEgaGFuZGxlciAqLwogCXJlcXVlc3RfaXJxKGJhc2UtPmhhbmRsZXJfaXJxLCBjaWFfaGFuZGxlciwgMCwgYmFzZS0+bmFtZSwgYmFzZSk7CiAKLQljdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgYmFzZS0+aW50X21hc2s7CisJYW1pZ2FfY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IGJhc2UtPmludF9tYXNrOwogfQogCiBpbnQgY2lhX2dldF9pcnFfbGlzdChzdHJ1Y3QgY2lhYmFzZSAqYmFzZSwgc3RydWN0IHNlcV9maWxlICpwKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2FtaWdhL2NvbmZpZy5jIGIvYXJjaC9tNjhrL2FtaWdhL2NvbmZpZy5jCmluZGV4IDQ3NzVlMTguLjEyZTM3MDYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hbWlnYS9jb25maWcuYworKysgYi9hcmNoL202OGsvYW1pZ2EvY29uZmlnLmMKQEAgLTEwNSw5ICsxMDUsNiBAQAogc3RhdGljIGludCBhbWlnYV9zZXRfY2xvY2tfbW1zcyAodW5zaWduZWQgbG9uZyk7CiBzdGF0aWMgdW5zaWduZWQgaW50IGFtaWdhX2dldF9zcyAodm9pZCk7CiBleHRlcm4gdm9pZCBhbWlnYV9ta3NvdW5kKCB1bnNpZ25lZCBpbnQgY291bnQsIHVuc2lnbmVkIGludCB0aWNrcyApOwotI2lmZGVmIENPTkZJR19BTUlHQV9GTE9QUFkKLWV4dGVybiB2b2lkIGFtaWdhX2Zsb3BweV9zZXR1cChjaGFyICosIGludCAqKTsKLSNlbmRpZgogc3RhdGljIHZvaWQgYW1pZ2FfcmVzZXQgKHZvaWQpOwogZXh0ZXJuIHZvaWQgYW1pZ2FfaW5pdF9zb3VuZCh2b2lkKTsKIHN0YXRpYyB2b2lkIGFtaWdhX3NhdmVrbXNnX2luaXQodm9pZCk7CkBAIC0yOTAsNyArMjg3LDcgQEAKICAgICBjYXNlIENTX09DUzoKICAgICBjYXNlIENTX0VDUzoKICAgICBjYXNlIENTX0FHQToKLSAgICAgIHN3aXRjaCAoY3VzdG9tLmRlbmlzZWlkICYgMHhmKSB7CisgICAgICBzd2l0Y2ggKGFtaWdhX2N1c3RvbS5kZW5pc2VpZCAmIDB4ZikgewogICAgICAgY2FzZSAweDBjOgogCUFNSUdBSFdfU0VUKERFTklTRV9IUik7CiAJYnJlYWs7CkBAIC0zMDMsNyArMzAwLDcgQEAKICAgICAgIEFNSUdBSFdfU0VUKERFTklTRSk7CiAgICAgICBicmVhazsKICAgICB9Ci0gICAgc3dpdGNoICgoY3VzdG9tLnZwb3NyPj44KSAmIDB4N2YpIHsKKyAgICBzd2l0Y2ggKChhbWlnYV9jdXN0b20udnBvc3I+PjgpICYgMHg3ZikgewogICAgIGNhc2UgMHgwMDoKICAgICAgIEFNSUdBSFdfU0VUKEFHTlVTX1BBTCk7CiAgICAgICBicmVhazsKQEAgLTQyNywxMyArNDI0LDcgQEAKIAogICBtYWNoX3NldF9jbG9ja19tbXNzICA9IGFtaWdhX3NldF9jbG9ja19tbXNzOwogICBtYWNoX2dldF9zcyAgICAgICAgICA9IGFtaWdhX2dldF9zczsKLSNpZmRlZiBDT05GSUdfQU1JR0FfRkxPUFBZCi0gIG1hY2hfZmxvcHB5X3NldHVwICAgID0gYW1pZ2FfZmxvcHB5X3NldHVwOwotI2VuZGlmCiAgIG1hY2hfcmVzZXQgICAgICAgICAgID0gYW1pZ2FfcmVzZXQ7Ci0jaWZkZWYgQ09ORklHX0RVTU1ZX0NPTlNPTEUKLSAgY29uc3dpdGNocCAgICAgICAgICAgPSAmZHVtbXlfY29uOwotI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfSU5QVVRfTTY4S19CRUVQKSB8fCBkZWZpbmVkKENPTkZJR19JTlBVVF9NNjhLX0JFRVBfTU9EVUxFKQogICBtYWNoX2JlZXAgICAgICAgICAgICA9IGFtaWdhX21rc291bmQ7CiAjZW5kaWYKQEAgLTQ0Nyw5ICs0MzgsOSBAQAogICBhbWlnYV9jb2xvcmNsb2NrID0gNSphbWlnYV9lY2xvY2s7CS8qIDMuNSBNSHogKi8KIAogICAvKiBjbGVhciBhbGwgRE1BIGJpdHMgKi8KLSAgY3VzdG9tLmRtYWNvbiA9IERNQUZfQUxMOworICBhbWlnYV9jdXN0b20uZG1hY29uID0gRE1BRl9BTEw7CiAgIC8qIGVuc3VyZSB0aGF0IHRoZSBETUEgbWFzdGVyIGJpdCBpcyBzZXQgKi8KLSAgY3VzdG9tLmRtYWNvbiA9IERNQUZfU0VUQ0xSIHwgRE1BRl9NQVNURVI7CisgIGFtaWdhX2N1c3RvbS5kbWFjb24gPSBETUFGX1NFVENMUiB8IERNQUZfTUFTVEVSOwogCiAgIC8qIGRvbid0IHVzZSBaMiBSQU0gYXMgc3lzdGVtIG1lbW9yeSBvbiBaMyBjYXBhYmxlIG1hY2hpbmVzICovCiAgIGlmIChBTUlHQUhXX1BSRVNFTlQoWk9SUk8zKSkgewpAQCAtODMwLDggKzgyMSw4IEBACiAKIHN0YXRpYyB2b2lkIGFtaWdhX3NlcmlhbF9wdXRjKGNoYXIgYykKIHsKLSAgICBjdXN0b20uc2VyZGF0ID0gKHVuc2lnbmVkIGNoYXIpYyB8IDB4MTAwOwotICAgIHdoaWxlICghKGN1c3RvbS5zZXJkYXRyICYgMHgyMDAwKSkKKyAgICBhbWlnYV9jdXN0b20uc2VyZGF0ID0gKHVuc2lnbmVkIGNoYXIpYyB8IDB4MTAwOworICAgIHdoaWxlICghKGFtaWdhX2N1c3RvbS5zZXJkYXRyICYgMHgyMDAwKSkKIAk7CiB9CiAKQEAgLTg1NSwxMSArODQ2LDExIEBACiB7CiAgICAgaW50IGNoOwogCi0gICAgd2hpbGUgKCEoY3VzdG9tLmludHJlcXIgJiBJRl9SQkYpKQorICAgIHdoaWxlICghKGFtaWdhX2N1c3RvbS5pbnRyZXFyICYgSUZfUkJGKSkKIAliYXJyaWVyKCk7Ci0gICAgY2ggPSBjdXN0b20uc2VyZGF0ciAmIDB4ZmY7CisgICAgY2ggPSBhbWlnYV9jdXN0b20uc2VyZGF0ciAmIDB4ZmY7CiAgICAgLyogY2xlYXIgdGhlIGludGVycnVwdCwgc28gdGhhdCBhbm90aGVyIGNoYXJhY3RlciBjYW4gYmUgcmVhZCAqLwotICAgIGN1c3RvbS5pbnRyZXEgPSBJRl9SQkY7CisgICAgYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX1JCRjsKICAgICByZXR1cm4gY2g7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hcG9sbG8vY29uZmlnLmMgYi9hcmNoL202OGsvYXBvbGxvL2NvbmZpZy5jCmluZGV4IDI2NDkyOTQuLmQ0MDE5NjIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hcG9sbG8vY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL2Fwb2xsby9jb25maWcuYwpAQCAtMTc2LDkgKzE3Niw2IEBACiAJbWFjaF9zZXRfY2xvY2tfbW1zcyAgPSBkbl9kdW1teV9zZXRfY2xvY2tfbW1zczsgLyogKi8KIAltYWNoX3Byb2Nlc3NfaW50ICAgICA9IGRuX3Byb2Nlc3NfaW50OwogCW1hY2hfcmVzZXQJICAgICA9IGRuX2R1bW15X3Jlc2V0OyAgLyogKi8KLSNpZmRlZiBDT05GSUdfRFVNTVlfQ09OU09MRQotICAgICAgICBjb25zd2l0Y2hwICAgICAgICAgICA9ICZkdW1teV9jb247Ci0jZW5kaWYKICNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCiAJbWFjaF9oZWFydGJlYXQgPSBkbl9oZWFydGJlYXQ7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hdGFyaS9jb25maWcuYyBiL2FyY2gvbTY4ay9hdGFyaS9jb25maWcuYwppbmRleCA5MjYxZDJkLi4xMDEyYjA4ZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hdGFyaS9jb25maWcuYworKysgYi9hcmNoL202OGsvYXRhcmkvY29uZmlnLmMKQEAgLTUyLDkgKzUyLDYgQEAKIAogLyogbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwogc3RhdGljIHZvaWQgYXRhcmlfcmVzZXQoIHZvaWQgKTsKLSNpZmRlZiBDT05GSUdfQVRBUklfRkxPUFBZCi1leHRlcm4gdm9pZCBhdGFyaV9mbG9wcHlfc2V0dXAoY2hhciAqLCBpbnQgKik7Ci0jZW5kaWYKIHN0YXRpYyB2b2lkIGF0YXJpX2dldF9tb2RlbChjaGFyICptb2RlbCk7CiBzdGF0aWMgaW50IGF0YXJpX2dldF9oYXJkd2FyZV9saXN0KGNoYXIgKmJ1ZmZlcik7CiAKQEAgLTI0NCwxMiArMjQxLDYgQEAKICAgICBtYWNoX2dldF9pcnFfbGlzdAkgPSBzaG93X2F0YXJpX2ludGVycnVwdHM7CiAgICAgbWFjaF9nZXR0aW1lb2Zmc2V0ICAgPSBhdGFyaV9nZXR0aW1lb2Zmc2V0OwogICAgIG1hY2hfcmVzZXQgICAgICAgICAgID0gYXRhcmlfcmVzZXQ7Ci0jaWZkZWYgQ09ORklHX0FUQVJJX0ZMT1BQWQotICAgIG1hY2hfZmxvcHB5X3NldHVwCSA9IGF0YXJpX2Zsb3BweV9zZXR1cDsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19EVU1NWV9DT05TT0xFCi0gICAgY29uc3dpdGNocAkgICAgICAgICA9ICZkdW1teV9jb247Ci0jZW5kaWYKICAgICBtYWNoX21heF9kbWFfYWRkcmVzcyA9IDB4ZmZmZmZmOwogI2lmIGRlZmluZWQoQ09ORklHX0lOUFVUX002OEtfQkVFUCkgfHwgZGVmaW5lZChDT05GSUdfSU5QVVRfTTY4S19CRUVQX01PRFVMRSkKICAgICBtYWNoX2JlZXAgICAgICAgICAgPSBhdGFyaV9ta3NvdW5kOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2J2bWU2MDAwL3J0Yy5jIGIvYXJjaC9tNjhrL2J2bWU2MDAwL3J0Yy5jCmluZGV4IGViNjNjYTYuLjcwM2NiYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9idm1lNjAwMC9ydGMuYworKysgYi9hcmNoL202OGsvYnZtZTYwMDAvcnRjLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CkBAIC00Niw2ICs0Nyw3IEBACiAJdW5zaWduZWQgY2hhciBtc3I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgcnRjX3RpbWUgd3RpbWU7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgUlRDX1JEX1RJTUU6CS8qIFJlYWQgdGhlIHRpbWUvZGF0ZSBmcm9tIFJUQwkqLwpAQCAtNjgsNyArNzAsNyBAQAogCQl9IHdoaWxlICh3dGltZS50bV9zZWMgIT0gQkNEMkJJTihydGMtPmJjZF9zZWMpKTsKIAkJcnRjLT5tc3IgPSBtc3I7CiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJnd0aW1lLCBzaXplb2Ygd3RpbWUpID8KKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmd3RpbWUsIHNpemVvZiB3dGltZSkgPwogCQkJCQkJCQktRUZBVUxUIDogMDsKIAl9CiAJY2FzZSBSVENfU0VUX1RJTUU6CS8qIFNldCB0aGUgUlRDICovCkBAIC04MCw4ICs4Miw3IEBACiAJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJCXJldHVybiAtRUFDQ0VTOwogCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmcnRjX3RtLCAoc3RydWN0IHJ0Y190aW1lKilhcmcsCi0JCQkJICAgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpKQorCQlpZiAoY29weV9mcm9tX3VzZXIoJnJ0Y190bSwgYXJncCwgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJeXJzID0gcnRjX3RtLnRtX3llYXI7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvaHAzMDAvY29uZmlnLmMgYi9hcmNoL202OGsvaHAzMDAvY29uZmlnLmMKaW5kZXggYTBiODU0Zi4uNmQxMjllZSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2hwMzAwL2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4ay9ocDMwMC9jb25maWcuYwpAQCAtMjYxLDkgKzI2MSw2IEBACiAjaWZkZWYgQ09ORklHX0hFQVJUQkVBVAogCW1hY2hfaGVhcnRiZWF0ICAgICAgID0gaHAzMDBfcHVsc2U7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfRFVNTVlfQ09OU09MRQotCWNvbnN3aXRjaHAJICAgICA9ICZkdW1teV9jb247Ci0jZW5kaWYKIAltYWNoX21heF9kbWFfYWRkcmVzcyA9IDB4ZmZmZmZmZmY7CiAKIAlpZiAoaHAzMDBfbW9kZWwgPj0gSFBfMzMwICYmIGhwMzAwX21vZGVsIDw9IEhQXzQzM1MgJiYgaHAzMDBfbW9kZWwgIT0gSFBfMzUwKSB7CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL202OGsva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggYzc4N2M1Yi4uMjQ2YTg4MiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtOTIsNyArOTIsNyBAQAogCURFRklORShUUkFQX1RSQUNFLCBUUkFQX1RSQUNFKTsKIAogCS8qIG9mZnNldHMgaW50byB0aGUgY3VzdG9tIHN0cnVjdCAqLwotCURFRklORShDVVNUT01CQVNFLCAmY3VzdG9tKTsKKwlERUZJTkUoQ1VTVE9NQkFTRSwgJmFtaWdhX2N1c3RvbSk7CiAJREVGSU5FKENfSU5URU5BUiwgb2Zmc2V0b2Yoc3RydWN0IENVU1RPTSwgaW50ZW5hcikpOwogCURFRklORShDX0lOVFJFUVIsIG9mZnNldG9mKHN0cnVjdCBDVVNUT00sIGludHJlcXIpKTsKIAlERUZJTkUoQ19JTlRFTkEsIG9mZnNldG9mKHN0cnVjdCBDVVNUT00sIGludGVuYSkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9oZWFkLlMgYi9hcmNoL202OGsva2VybmVsL2hlYWQuUwppbmRleCBkNDMzNmQ4Li43MDAwMmMxIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL2hlYWQuUworKysgYi9hcmNoL202OGsva2VybmVsL2hlYWQuUwpAQCAtMjczLDggKzI3MywxMCBAQAogICogTWFjaW50b3NoIGNvbnNvbGUgc3VwcG9ydAogICovCiAKKyNpZmRlZiBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRQogI2RlZmluZSBDT05TT0xFCiAjZGVmaW5lIENPTlNPTEVfUEVOR1VJTgorI2VuZGlmCiAKIC8qCiAgKiBNYWNpbnRvc2ggc2VyaWFsIGRlYnVnIHN1cHBvcnQ7IG91dHB1dHMgYm9vdCBpbmZvIHRvIHRoZSBwcmludGVyCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL202OGtfa3N5bXMuYyBiL2FyY2gvbTY4ay9rZXJuZWwvbTY4a19rc3ltcy5jCmluZGV4IDczZTJmNWUuLjNkN2YyMDAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvbTY4a19rc3ltcy5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvbTY4a19rc3ltcy5jCkBAIC0yMyw4ICsyMyw2IEBACiBhc21saW5rYWdlIGxvbmcgbG9uZyBfX211bGRpMyAobG9uZyBsb25nLCBsb25nIGxvbmcpOwogZXh0ZXJuIGNoYXIgbTY4a19kZWJ1Z19kZXZpY2VbXTsKIAotZXh0ZXJuIHZvaWQgZHVtcF90aHJlYWQoc3RydWN0IHB0X3JlZ3MgKiwgc3RydWN0IHVzZXIgKik7Ci0KIC8qIHBsYXRmb3JtIGRlcGVuZGVudCBzdXBwb3J0ICovCiAKIEVYUE9SVF9TWU1CT0wobTY4a19tYWNodHlwZSk7CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvbTY4ay9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDEzZDEwOTMyLi4zZjljYjU1IDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL202OGsva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjM4LDEwICsyMzgsOSBAQAogewogCXN0cnVjdCBwdF9yZWdzICogY2hpbGRyZWdzOwogCXN0cnVjdCBzd2l0Y2hfc3RhY2sgKiBjaGlsZHN0YWNrLCAqc3RhY2s7Ci0JdW5zaWduZWQgbG9uZyBzdGFja19vZmZzZXQsICpyZXRwOworCXVuc2lnbmVkIGxvbmcgKnJldHA7CiAKLQlzdGFja19vZmZzZXQgPSBUSFJFQURfU0laRSAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncyk7Ci0JY2hpbGRyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopICgodW5zaWduZWQgbG9uZykgKHAtPnRocmVhZF9pbmZvKSArIHN0YWNrX29mZnNldCk7CisJY2hpbGRyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopICh0YXNrX3N0YWNrX3BhZ2UocCkgKyBUSFJFQURfU0laRSkgLSAxOwogCiAJKmNoaWxkcmVncyA9ICpyZWdzOwogCWNoaWxkcmVncy0+ZDAgPSAwOwpAQCAtMzg2LDcgKzM4NSw3IEBACiAJaWYgKCFwIHx8IHAgPT0gY3VycmVudCB8fCBwLT5zdGF0ZSA9PSBUQVNLX1JVTk5JTkcpCiAJCXJldHVybiAwOwogCi0Jc3RhY2tfcGFnZSA9ICh1bnNpZ25lZCBsb25nKShwLT50aHJlYWRfaW5mbyk7CisJc3RhY2tfcGFnZSA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShwKTsKIAlmcCA9ICgoc3RydWN0IHN3aXRjaF9zdGFjayAqKXAtPnRocmVhZC5rc3ApLT5hNjsKIAlkbyB7CiAJCWlmIChmcCA8IHN0YWNrX3BhZ2Urc2l6ZW9mKHN0cnVjdCB0aHJlYWRfaW5mbykgfHwKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXAuYwppbmRleCBkNmNhOTkyLi43NTBkNWIzIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cC5jCkBAIC04NCw5ICs4NCw2IEBACiB2b2lkICgqbWFjaF9oYWx0KSggdm9pZCApOwogdm9pZCAoKm1hY2hfcG93ZXJfb2ZmKSggdm9pZCApOwogbG9uZyBtYWNoX21heF9kbWFfYWRkcmVzcyA9IDB4MDBmZmZmZmY7IC8qIGRlZmF1bHQgc2V0IHRvIHRoZSBsb3dlciAxNk1CICovCi0jaWYgZGVmaW5lZChDT05GSUdfQU1JR0FfRkxPUFBZKSB8fCBkZWZpbmVkKENPTkZJR19BVEFSSV9GTE9QUFkpCi12b2lkICgqbWFjaF9mbG9wcHlfc2V0dXApIChjaGFyICosIGludCAqKSBfX2luaXRkYXRhID0gTlVMTDsKLSNlbmRpZgogI2lmZGVmIENPTkZJR19IRUFSVEJFQVQKIHZvaWQgKCptYWNoX2hlYXJ0YmVhdCkgKGludCk7CiBFWFBPUlRfU1lNQk9MKG1hY2hfaGVhcnRiZWF0KTsKQEAgLTEwMCw2ICs5Nyw4IEBACiAjaWYgZGVmaW5lZChDT05GSUdfSVNBKSAmJiBkZWZpbmVkKE1VTFRJX0lTQSkKIGludCBpc2FfdHlwZTsKIGludCBpc2Ffc2V4OworRVhQT1JUX1NZTUJPTChpc2FfdHlwZSk7CitFWFBPUlRfU1lNQk9MKGlzYV9zZXgpOwogI2VuZGlmCiAKIGV4dGVybiBpbnQgYW1pZ2FfcGFyc2VfYm9vdGluZm8oY29uc3Qgc3RydWN0IGJpX3JlY29yZCAqKTsKQEAgLTI4MCw2ICsyNzksMTAgQEAKIAkgICAgfQogCX0KIAorI2lmZGVmIENPTkZJR19EVU1NWV9DT05TT0xFCisJY29uc3dpdGNocCA9ICZkdW1teV9jb247CisjZW5kaWYKKwogCXN3aXRjaCAobTY4a19tYWNodHlwZSkgewogI2lmZGVmIENPTkZJR19BTUlHQQogCSAgICBjYXNlIE1BQ0hfQU1JR0E6CkBAIC01MjEsMTYgKzUyNCw2IEBACiAgICAgcmV0dXJuKGxlbik7CiB9CiAKLQotI2lmIGRlZmluZWQoQ09ORklHX0FNSUdBX0ZMT1BQWSkgfHwgZGVmaW5lZChDT05GSUdfQVRBUklfRkxPUFBZKQotdm9pZCBfX2luaXQgZmxvcHB5X3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKQotewotCWlmIChtYWNoX2Zsb3BweV9zZXR1cCkKLQkJbWFjaF9mbG9wcHlfc2V0dXAgKHN0ciwgaW50cyk7Ci19Ci0KLSNlbmRpZgotCiB2b2lkIGNoZWNrX2J1Z3Modm9pZCkKIHsKICNpZm5kZWYgQ09ORklHX002OEtGUFVfRU1VCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9tNjhrL2tlcm5lbC9zaWduYWwuYwppbmRleCA5YzYzNmE0Li44NjY5MTdiIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvc2lnbmFsLmMKQEAgLTk2LDcgKzk2LDcgQEAKIGFzbWxpbmthZ2UgaW50CiBkb19ydF9zaWdzdXNwZW5kKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXNpZ3NldF90ICp1bmV3c2V0ID0gKHNpZ3NldF90ICopcmVncy0+ZDE7CisJc2lnc2V0X3QgX191c2VyICp1bmV3c2V0ID0gKHNpZ3NldF90IF9fdXNlciAqKXJlZ3MtPmQxOwogCXNpemVfdCBzaWdzZXRzaXplID0gKHNpemVfdClyZWdzLT5kMjsKIAlzaWdzZXRfdCBzYXZlc2V0LCBuZXdzZXQ7CiAKQEAgLTEyMiw4ICsxMjIsOCBAQAogfQogCiBhc21saW5rYWdlIGludAotc3lzX3NpZ2FjdGlvbihpbnQgc2lnLCBjb25zdCBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiAqYWN0LAotCSAgICAgIHN0cnVjdCBvbGRfc2lnYWN0aW9uICpvYWN0KQorc3lzX3NpZ2FjdGlvbihpbnQgc2lnLCBjb25zdCBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiBfX3VzZXIgKmFjdCwKKwkgICAgICBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiBfX3VzZXIgKm9hY3QpCiB7CiAJc3RydWN0IGtfc2lnYWN0aW9uIG5ld19rYSwgb2xkX2thOwogCWludCByZXQ7CkBAIC0xNTQsNyArMTU0LDcgQEAKIH0KIAogYXNtbGlua2FnZSBpbnQKLXN5c19zaWdhbHRzdGFjayhjb25zdCBzdGFja190ICp1c3MsIHN0YWNrX3QgKnVvc3MpCitzeXNfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCBfX3VzZXIgKnVzcywgc3RhY2tfdCBfX3VzZXIgKnVvc3MpCiB7CiAJcmV0dXJuIGRvX3NpZ2FsdHN0YWNrKHVzcywgdW9zcywgcmR1c3AoKSk7CiB9CkBAIC0xNjksMTAgKzE2OSwxMCBAQAogCiBzdHJ1Y3Qgc2lnZnJhbWUKIHsKLQljaGFyICpwcmV0Y29kZTsKKwljaGFyIF9fdXNlciAqcHJldGNvZGU7CiAJaW50IHNpZzsKIAlpbnQgY29kZTsKLQlzdHJ1Y3Qgc2lnY29udGV4dCAqcHNjOworCXN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqcHNjOwogCWNoYXIgcmV0Y29kZVs4XTsKIAl1bnNpZ25lZCBsb25nIGV4dHJhbWFza1tfTlNJR19XT1JEUy0xXTsKIAlzdHJ1Y3Qgc2lnY29udGV4dCBzYzsKQEAgLTE4MCwxMCArMTgwLDEwIEBACiAKIHN0cnVjdCBydF9zaWdmcmFtZQogewotCWNoYXIgKnByZXRjb2RlOworCWNoYXIgX191c2VyICpwcmV0Y29kZTsKIAlpbnQgc2lnOwotCXN0cnVjdCBzaWdpbmZvICpwaW5mbzsKLQl2b2lkICpwdWM7CisJc3RydWN0IHNpZ2luZm8gX191c2VyICpwaW5mbzsKKwl2b2lkIF9fdXNlciAqcHVjOwogCWNoYXIgcmV0Y29kZVs4XTsKIAlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOwogCXN0cnVjdCB1Y29udGV4dCB1YzsKQEAgLTI0OCw3ICsyNDgsNyBAQAogI2RlZmluZSB1Y19mb3JtYXR2ZWMJdWNfZmlsbGVyW0ZQQ09OVEVYVF9TSVpFLzRdCiAjZGVmaW5lIHVjX2V4dHJhCXVjX2ZpbGxlcltGUENPTlRFWFRfU0laRS80KzFdCiAKLXN0YXRpYyBpbmxpbmUgaW50IHJ0X3Jlc3RvcmVfZnB1X3N0YXRlKHN0cnVjdCB1Y29udGV4dCAqdWMpCitzdGF0aWMgaW5saW5lIGludCBydF9yZXN0b3JlX2ZwdV9zdGF0ZShzdHJ1Y3QgdWNvbnRleHQgX191c2VyICp1YykKIHsKIAl1bnNpZ25lZCBjaGFyIGZwc3RhdGVbRlBDT05URVhUX1NJWkVdOwogCWludCBjb250ZXh0X3NpemUgPSBDUFVfSVNfMDYwID8gOCA6IDA7CkBAIC0yNjcsNyArMjY3LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKF9fZ2V0X3VzZXIoKihsb25nICopZnBzdGF0ZSwgKGxvbmcgKikmdWMtPnVjX2Zwc3RhdGUpKQorCWlmIChfX2dldF91c2VyKCoobG9uZyAqKWZwc3RhdGUsIChsb25nIF9fdXNlciAqKSZ1Yy0+dWNfZnBzdGF0ZSkpCiAJCWdvdG8gb3V0OwogCWlmIChDUFVfSVNfMDYwID8gZnBzdGF0ZVsyXSA6IGZwc3RhdGVbMF0pIHsKIAkJaWYgKCFDUFVfSVNfMDYwKQpAQCAtMzA2LDcgKzMwNiw3IEBACiAJCQkJICAgICJtIiAoKmZwcmVncy5mX2ZwY250bCkpOwogCX0KIAlpZiAoY29udGV4dF9zaXplICYmCi0JICAgIF9fY29weV9mcm9tX3VzZXIoZnBzdGF0ZSArIDQsIChsb25nICopJnVjLT51Y19mcHN0YXRlICsgMSwKKwkgICAgX19jb3B5X2Zyb21fdXNlcihmcHN0YXRlICsgNCwgKGxvbmcgX191c2VyICopJnVjLT51Y19mcHN0YXRlICsgMSwKIAkJCSAgICAgY29udGV4dF9zaXplKSkKIAkJZ290byBvdXQ7CiAJX19hc21fXyB2b2xhdGlsZSAoIi5jaGlwIDY4ay82ODg4MVxuXHQiCkBAIC0zMTksNyArMzE5LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLXJlc3RvcmVfc2lnY29udGV4dChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHNpZ2NvbnRleHQgKnVzYywgdm9pZCAqZnAsCityZXN0b3JlX3NpZ2NvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqdXNjLCB2b2lkIF9fdXNlciAqZnAsCiAJCSAgIGludCAqcGQwKQogewogCWludCBmc2l6ZSwgZm9ybWF0dmVjOwpAQCAtNDA0LDEwICs0MDQsMTAgQEAKIAogc3RhdGljIGlubGluZSBpbnQKIHJ0X3Jlc3RvcmVfdWNvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzd2l0Y2hfc3RhY2sgKnN3LAotCQkgICAgc3RydWN0IHVjb250ZXh0ICp1YywgaW50ICpwZDApCisJCSAgICBzdHJ1Y3QgdWNvbnRleHQgX191c2VyICp1YywgaW50ICpwZDApCiB7CiAJaW50IGZzaXplLCB0ZW1wOwotCWdyZWdfdCAqZ3JlZ3MgPSB1Yy0+dWNfbWNvbnRleHQuZ3JlZ3M7CisJZ3JlZ190IF9fdXNlciAqZ3JlZ3MgPSB1Yy0+dWNfbWNvbnRleHQuZ3JlZ3M7CiAJdW5zaWduZWQgbG9uZyB1c3A7CiAJaW50IGVycjsKIApAQCAtNTA2LDcgKzUwNiw3IEBACiAJc3RydWN0IHN3aXRjaF9zdGFjayAqc3cgPSAoc3RydWN0IHN3aXRjaF9zdGFjayAqKSAmX191bnVzZWQ7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgKHN3ICsgMSk7CiAJdW5zaWduZWQgbG9uZyB1c3AgPSByZHVzcCgpOwotCXN0cnVjdCBzaWdmcmFtZSAqZnJhbWUgPSAoc3RydWN0IHNpZ2ZyYW1lICopKHVzcCAtIDQpOworCXN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKmZyYW1lID0gKHN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKikodXNwIC0gNCk7CiAJc2lnc2V0X3Qgc2V0OwogCWludCBkMDsKIApAQCAtNTM2LDcgKzUzNiw3IEBACiAJc3RydWN0IHN3aXRjaF9zdGFjayAqc3cgPSAoc3RydWN0IHN3aXRjaF9zdGFjayAqKSAmX191bnVzZWQ7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgKHN3ICsgMSk7CiAJdW5zaWduZWQgbG9uZyB1c3AgPSByZHVzcCgpOwotCXN0cnVjdCBydF9zaWdmcmFtZSAqZnJhbWUgPSAoc3RydWN0IHJ0X3NpZ2ZyYW1lICopKHVzcCAtIDQpOworCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lID0gKHN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKikodXNwIC0gNCk7CiAJc2lnc2V0X3Qgc2V0OwogCWludCBkMDsKIApAQCAtNTk2LDcgKzU5Niw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIGludCBydF9zYXZlX2ZwdV9zdGF0ZShzdHJ1Y3QgdWNvbnRleHQgKnVjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpbmxpbmUgaW50IHJ0X3NhdmVfZnB1X3N0YXRlKHN0cnVjdCB1Y29udGV4dCBfX3VzZXIgKnVjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBjaGFyIGZwc3RhdGVbRlBDT05URVhUX1NJWkVdOwogCWludCBjb250ZXh0X3NpemUgPSBDUFVfSVNfMDYwID8gOCA6IDA7CkBAIC02MTcsNyArNjE3LDcgQEAKIAkJCSAgIi5jaGlwIDY4ayIKIAkJCSAgOiA6ICJtIiAoKmZwc3RhdGUpIDogIm1lbW9yeSIpOwogCi0JZXJyIHw9IF9fcHV0X3VzZXIoKihsb25nICopZnBzdGF0ZSwgKGxvbmcgKikmdWMtPnVjX2Zwc3RhdGUpOworCWVyciB8PSBfX3B1dF91c2VyKCoobG9uZyAqKWZwc3RhdGUsIChsb25nIF9fdXNlciAqKSZ1Yy0+dWNfZnBzdGF0ZSk7CiAJaWYgKENQVV9JU18wNjAgPyBmcHN0YXRlWzJdIDogZnBzdGF0ZVswXSkgewogCQlmcHJlZ3NldF90IGZwcmVnczsKIAkJaWYgKCFDUFVfSVNfMDYwKQpAQCAtNjQyLDcgKzY0Miw3IEBACiAJCQkJICAgIHNpemVvZihmcHJlZ3MpKTsKIAl9CiAJaWYgKGNvbnRleHRfc2l6ZSkKLQkJZXJyIHw9IGNvcHlfdG9fdXNlcigobG9uZyAqKSZ1Yy0+dWNfZnBzdGF0ZSArIDEsIGZwc3RhdGUgKyA0LAorCQllcnIgfD0gY29weV90b191c2VyKChsb25nIF9fdXNlciAqKSZ1Yy0+dWNfZnBzdGF0ZSArIDEsIGZwc3RhdGUgKyA0LAogCQkJCSAgICBjb250ZXh0X3NpemUpOwogCXJldHVybiBlcnI7CiB9CkBAIC02NjIsMTAgKzY2MiwxMCBAQAogCXNhdmVfZnB1X3N0YXRlKHNjLCByZWdzKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcnRfc2V0dXBfdWNvbnRleHQoc3RydWN0IHVjb250ZXh0ICp1Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW5saW5lIGludCBydF9zZXR1cF91Y29udGV4dChzdHJ1Y3QgdWNvbnRleHQgX191c2VyICp1Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IHN3aXRjaF9zdGFjayAqc3cgPSAoc3RydWN0IHN3aXRjaF9zdGFjayAqKXJlZ3MgLSAxOwotCWdyZWdfdCAqZ3JlZ3MgPSB1Yy0+dWNfbWNvbnRleHQuZ3JlZ3M7CisJZ3JlZ190IF9fdXNlciAqZ3JlZ3MgPSB1Yy0+dWNfbWNvbnRleHQuZ3JlZ3M7CiAJaW50IGVyciA9IDA7CiAKIAllcnIgfD0gX19wdXRfdXNlcihNQ09OVEVYVF9WRVJTSU9OLCAmdWMtPnVjX21jb250ZXh0LnZlcnNpb24pOwpAQCAtNzUzLDcgKzc1Myw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgKgorc3RhdGljIGlubGluZSB2b2lkIF9fdXNlciAqCiBnZXRfc2lnZnJhbWUoc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHNpemVfdCBmcmFtZV9zaXplKQogewogCXVuc2lnbmVkIGxvbmcgdXNwOwpAQCAtNzY2LDEzICs3NjYsMTMgQEAKIAkJaWYgKCFvbl9zaWdfc3RhY2sodXNwKSkKIAkJCXVzcCA9IGN1cnJlbnQtPnNhc19zc19zcCArIGN1cnJlbnQtPnNhc19zc19zaXplOwogCX0KLQlyZXR1cm4gKHZvaWQgKikoKHVzcCAtIGZyYW1lX3NpemUpICYgLThVTCk7CisJcmV0dXJuICh2b2lkIF9fdXNlciAqKSgodXNwIC0gZnJhbWVfc2l6ZSkgJiAtOFVMKTsKIH0KIAogc3RhdGljIHZvaWQgc2V0dXBfZnJhbWUgKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCiAJCQkgc2lnc2V0X3QgKnNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IHNpZ2ZyYW1lICpmcmFtZTsKKwlzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICpmcmFtZTsKIAlpbnQgZnNpemUgPSBmcmFtZV9leHRyYV9zaXplc1tyZWdzLT5mb3JtYXRdOwogCXN0cnVjdCBzaWdjb250ZXh0IGNvbnRleHQ7CiAJaW50IGVyciA9IDA7CkBAIC04MTMsNyArODEzLDcgQEAKIAllcnIgfD0gX19wdXRfdXNlcihmcmFtZS0+cmV0Y29kZSwgJmZyYW1lLT5wcmV0Y29kZSk7CiAJLyogbW92ZXEgIyxkMDsgdHJhcCAjMCAqLwogCWVyciB8PSBfX3B1dF91c2VyKDB4NzAwMDRlNDAgKyAoX19OUl9zaWdyZXR1cm4gPDwgMTYpLAotCQkJICAobG9uZyAqKShmcmFtZS0+cmV0Y29kZSkpOworCQkJICAobG9uZyBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUpKTsKIAogCWlmIChlcnIpCiAJCWdvdG8gZ2l2ZV9zaWdzZWd2OwpAQCAtODQ5LDcgKzg0OSw3IEBACiBzdGF0aWMgdm9pZCBzZXR1cF9ydF9mcmFtZSAoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnaW5mb190ICppbmZvLAogCQkJICAgIHNpZ3NldF90ICpzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCBydF9zaWdmcmFtZSAqZnJhbWU7CisJc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7CiAJaW50IGZzaXplID0gZnJhbWVfZXh0cmFfc2l6ZXNbcmVncy0+Zm9ybWF0XTsKIAlpbnQgZXJyID0gMDsKIApAQCAtODgwLDggKzg4MCw4IEBACiAKIAkvKiBDcmVhdGUgdGhlIHVjb250ZXh0LiAgKi8KIAllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2ZsYWdzKTsKLQllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2xpbmspOwotCWVyciB8PSBfX3B1dF91c2VyKCh2b2lkICopY3VycmVudC0+c2FzX3NzX3NwLAorCWVyciB8PSBfX3B1dF91c2VyKE5VTEwsICZmcmFtZS0+dWMudWNfbGluayk7CisJZXJyIHw9IF9fcHV0X3VzZXIoKHZvaWQgX191c2VyICopY3VycmVudC0+c2FzX3NzX3NwLAogCQkJICAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX3NwKTsKIAllcnIgfD0gX19wdXRfdXNlcihzYXNfc3NfZmxhZ3MocmR1c3AoKSksCiAJCQkgICZmcmFtZS0+dWMudWNfc3RhY2suc3NfZmxhZ3MpOwpAQCAtODkzLDggKzg5Myw4IEBACiAJZXJyIHw9IF9fcHV0X3VzZXIoZnJhbWUtPnJldGNvZGUsICZmcmFtZS0+cHJldGNvZGUpOwogCS8qIG1vdmVxICMsZDA7IG5vdGIgZDA7IHRyYXAgIzAgKi8KIAllcnIgfD0gX19wdXRfdXNlcigweDcwMDA0NjAwICsgKChfX05SX3J0X3NpZ3JldHVybiBeIDB4ZmYpIDw8IDE2KSwKLQkJCSAgKGxvbmcgKikoZnJhbWUtPnJldGNvZGUgKyAwKSk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoMHg0ZTQwLCAoc2hvcnQgKikoZnJhbWUtPnJldGNvZGUgKyA0KSk7CisJCQkgIChsb25nIF9fdXNlciAqKShmcmFtZS0+cmV0Y29kZSArIDApKTsKKwllcnIgfD0gX19wdXRfdXNlcigweDRlNDAsIChzaG9ydCBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUgKyA0KSk7CiAKIAlpZiAoZXJyKQogCQlnb3RvIGdpdmVfc2lnc2VndjsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvc3lzX202OGsuYyBiL2FyY2gvbTY4ay9rZXJuZWwvc3lzX202OGsuYwppbmRleCAyZWQ3Yjc4Li4xNDNjNTUyIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3N5c19tNjhrLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9zeXNfbTY4ay5jCkBAIC02LDYgKzYsNyBAQAogICogcGxhdGZvcm0uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KQEAgLTMxLDcgKzMyLDcgQEAKICAqIHN5c19waXBlKCkgaXMgdGhlIG5vcm1hbCBDIGNhbGxpbmcgc3RhbmRhcmQgZm9yIGNyZWF0aW5nCiAgKiBhIHBpcGUuIEl0J3Mgbm90IHRoZSB3YXkgdW5peCB0cmFkaXRpb25hbGx5IGRvZXMgdGhpcywgdGhvdWdoLgogICovCi1hc21saW5rYWdlIGludCBzeXNfcGlwZSh1bnNpZ25lZCBsb25nICogZmlsZGVzKQorYXNtbGlua2FnZSBpbnQgc3lzX3BpcGUodW5zaWduZWQgbG9uZyBfX3VzZXIgKiBmaWxkZXMpCiB7CiAJaW50IGZkWzJdOwogCWludCBlcnJvcjsKQEAgLTkzLDcgKzk0LDcgQEAKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKIH07CiAKLWFzbWxpbmthZ2UgaW50IG9sZF9tbWFwKHN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3QgKmFyZykKK2FzbWxpbmthZ2UgaW50IG9sZF9tbWFwKHN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3QgX191c2VyICphcmcpCiB7CiAJc3RydWN0IG1tYXBfYXJnX3N0cnVjdCBhOwogCWludCBlcnJvciA9IC1FRkFVTFQ7CkBAIC0xNTksMTEgKzE2MCwxMSBAQAogCiBzdHJ1Y3Qgc2VsX2FyZ19zdHJ1Y3QgewogCXVuc2lnbmVkIGxvbmcgbjsKLQlmZF9zZXQgKmlucCwgKm91dHAsICpleHA7Ci0Jc3RydWN0IHRpbWV2YWwgKnR2cDsKKwlmZF9zZXQgX191c2VyICppbnAsICpvdXRwLCAqZXhwOworCXN0cnVjdCB0aW1ldmFsIF9fdXNlciAqdHZwOwogfTsKIAotYXNtbGlua2FnZSBpbnQgb2xkX3NlbGVjdChzdHJ1Y3Qgc2VsX2FyZ19zdHJ1Y3QgKmFyZykKK2FzbWxpbmthZ2UgaW50IG9sZF9zZWxlY3Qoc3RydWN0IHNlbF9hcmdfc3RydWN0IF9fdXNlciAqYXJnKQogewogCXN0cnVjdCBzZWxfYXJnX3N0cnVjdCBhOwogCkBAIC0xNzksNyArMTgwLDcgQEAKICAqIFRoaXMgaXMgcmVhbGx5IGhvcnJpYmx5IHVnbHkuCiAgKi8KIGFzbWxpbmthZ2UgaW50IHN5c19pcGMgKHVpbnQgY2FsbCwgaW50IGZpcnN0LCBpbnQgc2Vjb25kLAotCQkJaW50IHRoaXJkLCB2b2lkICpwdHIsIGxvbmcgZmlmdGgpCisJCQlpbnQgdGhpcmQsIHZvaWQgX191c2VyICpwdHIsIGxvbmcgZmlmdGgpCiB7CiAJaW50IHZlcnNpb24sIHJldDsKIApAQCAtMTg5LDE0ICsxOTAsMTQgQEAKIAlpZiAoY2FsbCA8PSBTRU1DVEwpCiAJCXN3aXRjaCAoY2FsbCkgewogCQljYXNlIFNFTU9QOgotCQkJcmV0dXJuIHN5c19zZW1vcCAoZmlyc3QsIChzdHJ1Y3Qgc2VtYnVmICopcHRyLCBzZWNvbmQpOworCQkJcmV0dXJuIHN5c19zZW1vcCAoZmlyc3QsIHB0ciwgc2Vjb25kKTsKIAkJY2FzZSBTRU1HRVQ6CiAJCQlyZXR1cm4gc3lzX3NlbWdldCAoZmlyc3QsIHNlY29uZCwgdGhpcmQpOwogCQljYXNlIFNFTUNUTDogewogCQkJdW5pb24gc2VtdW4gZm91cnRoOwogCQkJaWYgKCFwdHIpCiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpZiAoZ2V0X3VzZXIoZm91cnRoLl9fcGFkLCAodm9pZCAqKikgcHRyKSkKKwkJCWlmIChnZXRfdXNlcihmb3VydGguX19wYWQsICh2b2lkIF9fdXNlciAqX191c2VyICopIHB0cikpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQlyZXR1cm4gc3lzX3NlbWN0bCAoZmlyc3QsIHNlY29uZCwgdGhpcmQsIGZvdXJ0aCk7CiAJCQl9CkBAIC0yMDYsMzEgKzIwNywyNiBAQAogCWlmIChjYWxsIDw9IE1TR0NUTCkKIAkJc3dpdGNoIChjYWxsKSB7CiAJCWNhc2UgTVNHU05EOgotCQkJcmV0dXJuIHN5c19tc2dzbmQgKGZpcnN0LCAoc3RydWN0IG1zZ2J1ZiAqKSBwdHIsCi0JCQkJCSAgc2Vjb25kLCB0aGlyZCk7CisJCQlyZXR1cm4gc3lzX21zZ3NuZCAoZmlyc3QsIHB0ciwgc2Vjb25kLCB0aGlyZCk7CiAJCWNhc2UgTVNHUkNWOgogCQkJc3dpdGNoICh2ZXJzaW9uKSB7CiAJCQljYXNlIDA6IHsKIAkJCQlzdHJ1Y3QgaXBjX2tsdWRnZSB0bXA7CiAJCQkJaWYgKCFwdHIpCiAJCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCWlmIChjb3B5X2Zyb21fdXNlciAoJnRtcCwKLQkJCQkJCSAgICAoc3RydWN0IGlwY19rbHVkZ2UgKilwdHIsCi0JCQkJCQkgICAgc2l6ZW9mICh0bXApKSkKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIgKCZ0bXAsIHB0ciwgc2l6ZW9mICh0bXApKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQkJcmV0dXJuIHN5c19tc2dyY3YgKGZpcnN0LCB0bXAubXNncCwgc2Vjb25kLAogCQkJCQkJICAgdG1wLm1zZ3R5cCwgdGhpcmQpOwogCQkJCX0KIAkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIHN5c19tc2dyY3YgKGZpcnN0LAotCQkJCQkJICAgKHN0cnVjdCBtc2didWYgKikgcHRyLAorCQkJCXJldHVybiBzeXNfbXNncmN2IChmaXJzdCwgcHRyLAogCQkJCQkJICAgc2Vjb25kLCBmaWZ0aCwgdGhpcmQpOwogCQkJfQogCQljYXNlIE1TR0dFVDoKIAkJCXJldHVybiBzeXNfbXNnZ2V0ICgoa2V5X3QpIGZpcnN0LCBzZWNvbmQpOwogCQljYXNlIE1TR0NUTDoKLQkJCXJldHVybiBzeXNfbXNnY3RsIChmaXJzdCwgc2Vjb25kLAotCQkJCQkgICAoc3RydWN0IG1zcWlkX2RzICopIHB0cik7CisJCQlyZXR1cm4gc3lzX21zZ2N0bCAoZmlyc3QsIHNlY29uZCwgcHRyKTsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRU5PU1lTOwogCQl9CkBAIC0yNDAsMjAgKzIzNiwxOCBAQAogCQkJc3dpdGNoICh2ZXJzaW9uKSB7CiAJCQlkZWZhdWx0OiB7CiAJCQkJdWxvbmcgcmFkZHI7Ci0JCQkJcmV0ID0gZG9fc2htYXQgKGZpcnN0LCAoY2hhciAqKSBwdHIsCi0JCQkJCQkgc2Vjb25kLCAmcmFkZHIpOworCQkJCXJldCA9IGRvX3NobWF0IChmaXJzdCwgcHRyLCBzZWNvbmQsICZyYWRkcik7CiAJCQkJaWYgKHJldCkKIAkJCQkJcmV0dXJuIHJldDsKLQkJCQlyZXR1cm4gcHV0X3VzZXIgKHJhZGRyLCAodWxvbmcgKikgdGhpcmQpOworCQkJCXJldHVybiBwdXRfdXNlciAocmFkZHIsICh1bG9uZyBfX3VzZXIgKikgdGhpcmQpOwogCQkJfQogCQkJfQogCQljYXNlIFNITURUOgotCQkJcmV0dXJuIHN5c19zaG1kdCAoKGNoYXIgKilwdHIpOworCQkJcmV0dXJuIHN5c19zaG1kdCAocHRyKTsKIAkJY2FzZSBTSE1HRVQ6CiAJCQlyZXR1cm4gc3lzX3NobWdldCAoZmlyc3QsIHNlY29uZCwgdGhpcmQpOwogCQljYXNlIFNITUNUTDoKLQkJCXJldHVybiBzeXNfc2htY3RsIChmaXJzdCwgc2Vjb25kLAotCQkJCQkgICAoc3RydWN0IHNobWlkX2RzICopIHB0cik7CisJCQlyZXR1cm4gc3lzX3NobWN0bCAoZmlyc3QsIHNlY29uZCwgcHRyKTsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRU5PU1lTOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3RyYXBzLmMgYi9hcmNoL202OGsva2VybmVsL3RyYXBzLmMKaW5kZXggZGViMzZlOC4uY2RmNThmYiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYwpAQCAtMTY5LDI1ICsxNjksMjUgQEAKIAogCWlmIChDUFVfSVNfMDYwICYmICFGUFVfSVNfRU1VKSB7CiAJCS8qIHNldCB1cCBJRlBTUCBlbnRyeSBwb2ludHMgKi8KLQkJYXNtbGlua2FnZSB2b2lkIHNuYW5fdmVjKHZvaWQpIGFzbSAoIl8wNjBfZnBzcF9zbmFuIik7Ci0JCWFzbWxpbmthZ2Ugdm9pZCBvcGVycl92ZWModm9pZCkgYXNtICgiXzA2MF9mcHNwX29wZXJyIik7Ci0JCWFzbWxpbmthZ2Ugdm9pZCBvdmZsX3ZlYyh2b2lkKSBhc20gKCJfMDYwX2Zwc3Bfb3ZmbCIpOwotCQlhc21saW5rYWdlIHZvaWQgdW5mbF92ZWModm9pZCkgYXNtICgiXzA2MF9mcHNwX3VuZmwiKTsKLQkJYXNtbGlua2FnZSB2b2lkIGR6X3ZlYyh2b2lkKSBhc20gKCJfMDYwX2Zwc3BfZHoiKTsKLQkJYXNtbGlua2FnZSB2b2lkIGluZXhfdmVjKHZvaWQpIGFzbSAoIl8wNjBfZnBzcF9pbmV4Iik7Ci0JCWFzbWxpbmthZ2Ugdm9pZCBmbGluZV92ZWModm9pZCkgYXNtICgiXzA2MF9mcHNwX2ZsaW5lIik7Ci0JCWFzbWxpbmthZ2Ugdm9pZCB1bnN1cHBfdmVjKHZvaWQpIGFzbSAoIl8wNjBfZnBzcF91bnN1cHAiKTsKLQkJYXNtbGlua2FnZSB2b2lkIGVmZmFkZF92ZWModm9pZCkgYXNtICgiXzA2MF9mcHNwX2VmZmFkZCIpOworCQlhc21saW5rYWdlIHZvaWQgc25hbl92ZWM2KHZvaWQpIGFzbSAoIl8wNjBfZnBzcF9zbmFuIik7CisJCWFzbWxpbmthZ2Ugdm9pZCBvcGVycl92ZWM2KHZvaWQpIGFzbSAoIl8wNjBfZnBzcF9vcGVyciIpOworCQlhc21saW5rYWdlIHZvaWQgb3ZmbF92ZWM2KHZvaWQpIGFzbSAoIl8wNjBfZnBzcF9vdmZsIik7CisJCWFzbWxpbmthZ2Ugdm9pZCB1bmZsX3ZlYzYodm9pZCkgYXNtICgiXzA2MF9mcHNwX3VuZmwiKTsKKwkJYXNtbGlua2FnZSB2b2lkIGR6X3ZlYzYodm9pZCkgYXNtICgiXzA2MF9mcHNwX2R6Iik7CisJCWFzbWxpbmthZ2Ugdm9pZCBpbmV4X3ZlYzYodm9pZCkgYXNtICgiXzA2MF9mcHNwX2luZXgiKTsKKwkJYXNtbGlua2FnZSB2b2lkIGZsaW5lX3ZlYzYodm9pZCkgYXNtICgiXzA2MF9mcHNwX2ZsaW5lIik7CisJCWFzbWxpbmthZ2Ugdm9pZCB1bnN1cHBfdmVjNih2b2lkKSBhc20gKCJfMDYwX2Zwc3BfdW5zdXBwIik7CisJCWFzbWxpbmthZ2Ugdm9pZCBlZmZhZGRfdmVjNih2b2lkKSBhc20gKCJfMDYwX2Zwc3BfZWZmYWRkIik7CiAKLQkJdmVjdG9yc1tWRUNfRlBOQU5dID0gc25hbl92ZWM7Ci0JCXZlY3RvcnNbVkVDX0ZQT0VdID0gb3BlcnJfdmVjOwotCQl2ZWN0b3JzW1ZFQ19GUE9WRVJdID0gb3ZmbF92ZWM7Ci0JCXZlY3RvcnNbVkVDX0ZQVU5ERVJdID0gdW5mbF92ZWM7Ci0JCXZlY3RvcnNbVkVDX0ZQRElWWl0gPSBkel92ZWM7Ci0JCXZlY3RvcnNbVkVDX0ZQSVJdID0gaW5leF92ZWM7Ci0JCXZlY3RvcnNbVkVDX0xJTkUxMV0gPSBmbGluZV92ZWM7Ci0JCXZlY3RvcnNbVkVDX0ZQVU5TVVBdID0gdW5zdXBwX3ZlYzsKLQkJdmVjdG9yc1tWRUNfVU5JTVBFQV0gPSBlZmZhZGRfdmVjOworCQl2ZWN0b3JzW1ZFQ19GUE5BTl0gPSBzbmFuX3ZlYzY7CisJCXZlY3RvcnNbVkVDX0ZQT0VdID0gb3BlcnJfdmVjNjsKKwkJdmVjdG9yc1tWRUNfRlBPVkVSXSA9IG92ZmxfdmVjNjsKKwkJdmVjdG9yc1tWRUNfRlBVTkRFUl0gPSB1bmZsX3ZlYzY7CisJCXZlY3RvcnNbVkVDX0ZQRElWWl0gPSBkel92ZWM2OworCQl2ZWN0b3JzW1ZFQ19GUElSXSA9IGluZXhfdmVjNjsKKwkJdmVjdG9yc1tWRUNfTElORTExXSA9IGZsaW5lX3ZlYzY7CisJCXZlY3RvcnNbVkVDX0ZQVU5TVVBdID0gdW5zdXBwX3ZlYzY7CisJCXZlY3RvcnNbVkVDX1VOSU1QRUFdID0gZWZmYWRkX3ZlYzY7CiAJfQogCiAgICAgICAgIC8qIGlmIHJ1bm5pbmcgb24gYW4gYW1pZ2EsIG1ha2UgdGhlIE5NSSBpbnRlcnJ1cHQgZG8gbm90aGluZyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN0ZC5sZHMgYi9hcmNoL202OGsva2VybmVsL3ZtbGludXgtc3RkLmxkcwppbmRleCBlNTg2NTRmLi42OWQxZDNkIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3ZtbGludXgtc3RkLmxkcworKysgYi9hcmNoL202OGsva2VybmVsL3ZtbGludXgtc3RkLmxkcwpAQCAtMTMsNiArMTMsNyBAQAogICAudGV4dCA6IHsKIAkqKC50ZXh0KQogCVNDSEVEX1RFWFQKKwlMT0NLX1RFWFQKIAkqKC5maXh1cCkKIAkqKC5nbnUud2FybmluZykKIAl9IDp0ZXh0ID0gMHg0ZTc1CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3ZtbGludXgtc3VuMy5sZHMgYi9hcmNoL202OGsva2VybmVsL3ZtbGludXgtc3VuMy5sZHMKaW5kZXggY2MzN2U4ZC4uNjVjYzM5YyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN1bjMubGRzCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvdm1saW51eC1zdW4zLmxkcwpAQCAtMTQsNiArMTQsNyBAQAogCSooLmhlYWQpCiAJKigudGV4dCkKIAlTQ0hFRF9URVhUCisJTE9DS19URVhUCiAJKiguZml4dXApCiAJKiguZ251Lndhcm5pbmcpCiAJfSA6dGV4dCA9IDB4NGU3NQpAQCAtNjYsNyArNjcsNyBAQAogCV9faW5pdHJhbWZzX2VuZCA9IC47CiAJLiA9IEFMSUdOKDgxOTIpOwogCV9faW5pdF9lbmQgPSAuOwotCS5pbml0LnRhc2sgOiB7ICooaW5pdF90YXNrKSB9CisJLmRhdGEuaW5pdC50YXNrIDogeyAqKC5kYXRhLmluaXRfdGFzaykgfQogCiAKICAgLmJzcyA6IHsgKiguYnNzKSB9CQkvKiBCU1MgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9saWIvY2hlY2tzdW0uYyBiL2FyY2gvbTY4ay9saWIvY2hlY2tzdW0uYwppbmRleCA0YTVjNTQ0Li5jYjEzYzZlIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbGliL2NoZWNrc3VtLmMKKysrIGIvYXJjaC9tNjhrL2xpYi9jaGVja3N1bS5jCkBAIC0xMzQsNyArMTM0LDcgQEAKICAqLwogCiB1bnNpZ25lZCBpbnQKLWNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwKK2NzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsCiAJCQkgICAgaW50IGxlbiwgaW50IHN1bSwgaW50ICpjc3VtX2VycikKIHsKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hYy9jb25maWcuYyBiL2FyY2gvbTY4ay9tYWMvY29uZmlnLmMKaW5kZXggY2QxOWNiYi4uMTRmOGQzZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tYWMvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL21hYy9jb25maWcuYwpAQCAtMjEyLDkgKzIxMiw2IEBACiAJbWFjaF9yZXNldCAgICAgICAgICAgPSBtYWNfcmVzZXQ7CiAJbWFjaF9oYWx0ICAgICAgICAgICAgPSBtYWNfcG93ZXJvZmY7CiAJbWFjaF9wb3dlcl9vZmYgICAgICAgPSBtYWNfcG93ZXJvZmY7Ci0jaWZkZWYgQ09ORklHX0RVTU1ZX0NPTlNPTEUKLQljb25zd2l0Y2hwCSAgICAgICAgID0gJmR1bW15X2NvbjsKLSNlbmRpZgogCW1hY2hfbWF4X2RtYV9hZGRyZXNzID0gMHhmZmZmZmZmZjsKICNpZiAwCiAJbWFjaF9kZWJ1Z19pbml0CSA9IG1hY19kZWJ1Z19pbml0OwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hYy9pb3AuYyBiL2FyY2gvbTY4ay9tYWMvaW9wLmMKaW5kZXggZDg4OWJhOC4uOTE3OWEzNyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21hYy9pb3AuYworKysgYi9hcmNoL202OGsvbWFjL2lvcC5jCkBAIC0yOTMsOCArMjkzLDggQEAKIAl9CiAKIAlmb3IgKGkgPSAwIDsgaSA8IE5VTV9JT1BfQ0hBTiA7IGkrKykgewotCQlpb3Bfc2VuZF9xdWV1ZVtJT1BfTlVNX1NDQ11baV0gPSAwOwotCQlpb3Bfc2VuZF9xdWV1ZVtJT1BfTlVNX0lTTV1baV0gPSAwOworCQlpb3Bfc2VuZF9xdWV1ZVtJT1BfTlVNX1NDQ11baV0gPSBOVUxMOworCQlpb3Bfc2VuZF9xdWV1ZVtJT1BfTlVNX0lTTV1baV0gPSBOVUxMOwogCQlpb3BfbGlzdGVuZXJzW0lPUF9OVU1fU0NDXVtpXS5kZXZuYW1lID0gTlVMTDsKIAkJaW9wX2xpc3RlbmVyc1tJT1BfTlVNX1NDQ11baV0uaGFuZGxlciA9IE5VTEw7CiAJCWlvcF9saXN0ZW5lcnNbSU9QX05VTV9JU01dW2ldLmRldm5hbWUgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hYy9taXNjLmMgYi9hcmNoL202OGsvbWFjL21pc2MuYwppbmRleCA1YjgwZDdjLi5iYmIwYzNiIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbWFjL21pc2MuYworKysgYi9hcmNoL202OGsvbWFjL21pc2MuYwpAQCAtMzksNzIgKzM5LDE2MyBAQAogZXh0ZXJuIHN0cnVjdCBtYWNfYm9vdGVyX2RhdGEgbWFjX2JpX2RhdGE7CiBzdGF0aWMgdm9pZCAoKnJvbV9yZXNldCkodm9pZCk7CiAKLSNpZmRlZiBDT05GSUdfQURCCi0vKgotICogUmV0dXJuIHRoZSBjdXJyZW50IHRpbWUgYXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTkwNC4KLSAqLwotCi1zdGF0aWMgbG9uZyBhZGJfcmVhZF90aW1lKHZvaWQpCisjaWZkZWYgQ09ORklHX0FEQl9DVURBCitzdGF0aWMgbG9uZyBjdWRhX3JlYWRfdGltZSh2b2lkKQogewotCXZvbGF0aWxlIHN0cnVjdCBhZGJfcmVxdWVzdCByZXE7CisJc3RydWN0IGFkYl9yZXF1ZXN0IHJlcTsKIAlsb25nIHRpbWU7CiAKLQlhZGJfcmVxdWVzdCgoc3RydWN0IGFkYl9yZXF1ZXN0ICopICZyZXEsIE5VTEwsCi0JCQlBREJSRVFfUkFXfEFEQlJFUV9TWU5DLAotCQkJMiwgQ1VEQV9QQUNLRVQsIENVREFfR0VUX1RJTUUpOworCWlmIChjdWRhX3JlcXVlc3QoJnJlcSwgTlVMTCwgMiwgQ1VEQV9QQUNLRVQsIENVREFfR0VUX1RJTUUpIDwgMCkKKwkJcmV0dXJuIDA7CisJd2hpbGUgKCFyZXEuY29tcGxldGUpCisJCWN1ZGFfcG9sbCgpOwogCiAJdGltZSA9IChyZXEucmVwbHlbM10gPDwgMjQpIHwgKHJlcS5yZXBseVs0XSA8PCAxNikKIAkJfCAocmVxLnJlcGx5WzVdIDw8IDgpIHwgcmVxLnJlcGx5WzZdOwogCXJldHVybiB0aW1lIC0gUlRDX09GRlNFVDsKIH0KIAotLyoKLSAqIFNldCB0aGUgY3VycmVudCBzeXN0ZW0gdGltZQotICovCi0KLXN0YXRpYyB2b2lkIGFkYl93cml0ZV90aW1lKGxvbmcgZGF0YSkKK3N0YXRpYyB2b2lkIGN1ZGFfd3JpdGVfdGltZShsb25nIGRhdGEpCiB7Ci0Jdm9sYXRpbGUgc3RydWN0IGFkYl9yZXF1ZXN0IHJlcTsKLQorCXN0cnVjdCBhZGJfcmVxdWVzdCByZXE7CiAJZGF0YSArPSBSVENfT0ZGU0VUOworCWlmIChjdWRhX3JlcXVlc3QoJnJlcSwgTlVMTCwgNiwgQ1VEQV9QQUNLRVQsIENVREFfU0VUX1RJTUUsCisJCQkoZGF0YSA+PiAyNCkgJiAweEZGLCAoZGF0YSA+PiAxNikgJiAweEZGLAorCQkJKGRhdGEgPj4gOCkgJiAweEZGLCBkYXRhICYgMHhGRikgPCAwKQorCQlyZXR1cm47CisJd2hpbGUgKCFyZXEuY29tcGxldGUpCisJCWN1ZGFfcG9sbCgpOworfQogCi0JYWRiX3JlcXVlc3QoKHN0cnVjdCBhZGJfcmVxdWVzdCAqKSAmcmVxLCBOVUxMLAotCQkJQURCUkVRX1JBV3xBREJSRVFfU1lOQywKLQkJCTYsIENVREFfUEFDS0VULCBDVURBX1NFVF9USU1FLAorc3RhdGljIF9fdTggY3VkYV9yZWFkX3ByYW0oaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgYWRiX3JlcXVlc3QgcmVxOworCWlmIChjdWRhX3JlcXVlc3QoJnJlcSwgTlVMTCwgNCwgQ1VEQV9QQUNLRVQsIENVREFfR0VUX1BSQU0sCisJCQkob2Zmc2V0ID4+IDgpICYgMHhGRiwgb2Zmc2V0ICYgMHhGRikgPCAwKQorCQlyZXR1cm4gMDsKKwl3aGlsZSAoIXJlcS5jb21wbGV0ZSkKKwkJY3VkYV9wb2xsKCk7CisJcmV0dXJuIHJlcS5yZXBseVszXTsKK30KKworc3RhdGljIHZvaWQgY3VkYV93cml0ZV9wcmFtKGludCBvZmZzZXQsIF9fdTggZGF0YSkKK3sKKwlzdHJ1Y3QgYWRiX3JlcXVlc3QgcmVxOworCWlmIChjdWRhX3JlcXVlc3QoJnJlcSwgTlVMTCwgNSwgQ1VEQV9QQUNLRVQsIENVREFfU0VUX1BSQU0sCisJCQkob2Zmc2V0ID4+IDgpICYgMHhGRiwgb2Zmc2V0ICYgMHhGRiwgZGF0YSkgPCAwKQorCQlyZXR1cm47CisJd2hpbGUgKCFyZXEuY29tcGxldGUpCisJCWN1ZGFfcG9sbCgpOworfQorI2Vsc2UKKyNkZWZpbmUgY3VkYV9yZWFkX3RpbWUoKSAwCisjZGVmaW5lIGN1ZGFfd3JpdGVfdGltZShuKQorI2RlZmluZSBjdWRhX3JlYWRfcHJhbSBOVUxMCisjZGVmaW5lIGN1ZGFfd3JpdGVfcHJhbSBOVUxMCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BREJfUE1VNjhLCitzdGF0aWMgbG9uZyBwbXVfcmVhZF90aW1lKHZvaWQpCit7CisJc3RydWN0IGFkYl9yZXF1ZXN0IHJlcTsKKwlsb25nIHRpbWU7CisKKwlpZiAocG11X3JlcXVlc3QoJnJlcSwgTlVMTCwgMSwgUE1VX1JFQURfUlRDKSA8IDApCisJCXJldHVybiAwOworCXdoaWxlICghcmVxLmNvbXBsZXRlKQorCQlwbXVfcG9sbCgpOworCisJdGltZSA9IChyZXEucmVwbHlbMF0gPDwgMjQpIHwgKHJlcS5yZXBseVsxXSA8PCAxNikKKwkJfCAocmVxLnJlcGx5WzJdIDw8IDgpIHwgcmVxLnJlcGx5WzNdOworCXJldHVybiB0aW1lIC0gUlRDX09GRlNFVDsKK30KKworc3RhdGljIHZvaWQgcG11X3dyaXRlX3RpbWUobG9uZyBkYXRhKQoreworCXN0cnVjdCBhZGJfcmVxdWVzdCByZXE7CisJZGF0YSArPSBSVENfT0ZGU0VUOworCWlmIChwbXVfcmVxdWVzdCgmcmVxLCBOVUxMLCA1LCBQTVVfU0VUX1JUQywKKwkJCShkYXRhID4+IDI0KSAmIDB4RkYsIChkYXRhID4+IDE2KSAmIDB4RkYsCisJCQkoZGF0YSA+PiA4KSAmIDB4RkYsIGRhdGEgJiAweEZGKSA8IDApCisJCXJldHVybjsKKwl3aGlsZSAoIXJlcS5jb21wbGV0ZSkKKwkJcG11X3BvbGwoKTsKK30KKworc3RhdGljIF9fdTggcG11X3JlYWRfcHJhbShpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBhZGJfcmVxdWVzdCByZXE7CisJaWYgKHBtdV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDMsIFBNVV9SRUFEX05WUkFNLAorCQkJKG9mZnNldCA+PiA4KSAmIDB4RkYsIG9mZnNldCAmIDB4RkYpIDwgMCkKKwkJcmV0dXJuIDA7CisJd2hpbGUgKCFyZXEuY29tcGxldGUpCisJCXBtdV9wb2xsKCk7CisJcmV0dXJuIHJlcS5yZXBseVszXTsKK30KKworc3RhdGljIHZvaWQgcG11X3dyaXRlX3ByYW0oaW50IG9mZnNldCwgX191OCBkYXRhKQoreworCXN0cnVjdCBhZGJfcmVxdWVzdCByZXE7CisJaWYgKHBtdV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDQsIFBNVV9XUklURV9OVlJBTSwKKwkJCShvZmZzZXQgPj4gOCkgJiAweEZGLCBvZmZzZXQgJiAweEZGLCBkYXRhKSA8IDApCisJCXJldHVybjsKKwl3aGlsZSAoIXJlcS5jb21wbGV0ZSkKKwkJcG11X3BvbGwoKTsKK30KKyNlbHNlCisjZGVmaW5lIHBtdV9yZWFkX3RpbWUoKSAwCisjZGVmaW5lIHBtdV93cml0ZV90aW1lKG4pCisjZGVmaW5lIHBtdV9yZWFkX3ByYW0gTlVMTAorI2RlZmluZSBwbXVfd3JpdGVfcHJhbSBOVUxMCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BREJfTUFDSUlTSQorZXh0ZXJuIGludCBtYWNpaXNpX3JlcXVlc3Qoc3RydWN0IGFkYl9yZXF1ZXN0ICpyZXEsCisJCQl2b2lkICgqZG9uZSkoc3RydWN0IGFkYl9yZXF1ZXN0ICopLCBpbnQgbmJ5dGVzLCAuLi4pOworCitzdGF0aWMgbG9uZyBtYWNpaXNpX3JlYWRfdGltZSh2b2lkKQoreworCXN0cnVjdCBhZGJfcmVxdWVzdCByZXE7CisJbG9uZyB0aW1lOworCisJaWYgKG1hY2lpc2lfcmVxdWVzdCgmcmVxLCBOVUxMLCAyLCBDVURBX1BBQ0tFVCwgQ1VEQV9HRVRfVElNRSkpCisJCXJldHVybiAwOworCisJdGltZSA9IChyZXEucmVwbHlbM10gPDwgMjQpIHwgKHJlcS5yZXBseVs0XSA8PCAxNikKKwkJfCAocmVxLnJlcGx5WzVdIDw8IDgpIHwgcmVxLnJlcGx5WzZdOworCXJldHVybiB0aW1lIC0gUlRDX09GRlNFVDsKK30KKworc3RhdGljIHZvaWQgbWFjaWlzaV93cml0ZV90aW1lKGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgYWRiX3JlcXVlc3QgcmVxOworCWRhdGEgKz0gUlRDX09GRlNFVDsKKwltYWNpaXNpX3JlcXVlc3QoJnJlcSwgTlVMTCwgNiwgQ1VEQV9QQUNLRVQsIENVREFfU0VUX1RJTUUsCiAJCQkoZGF0YSA+PiAyNCkgJiAweEZGLCAoZGF0YSA+PiAxNikgJiAweEZGLAogCQkJKGRhdGEgPj4gOCkgJiAweEZGLCBkYXRhICYgMHhGRik7CiB9CiAKLS8qCi0gKiBHZXQgYSBieXRlIGZyb20gdGhlIE5WUkFNCi0gKi8KLQotc3RhdGljIF9fdTggYWRiX3JlYWRfcHJhbShpbnQgb2Zmc2V0KQorc3RhdGljIF9fdTggbWFjaWlzaV9yZWFkX3ByYW0oaW50IG9mZnNldCkKIHsKLQl2b2xhdGlsZSBzdHJ1Y3QgYWRiX3JlcXVlc3QgcmVxOwotCi0JYWRiX3JlcXVlc3QoKHN0cnVjdCBhZGJfcmVxdWVzdCAqKSAmcmVxLCBOVUxMLAotCQkJQURCUkVRX1JBV3xBREJSRVFfU1lOQywKLQkJCTQsIENVREFfUEFDS0VULCBDVURBX0dFVF9QUkFNLAotCQkJKG9mZnNldCA+PiA4KSAmIDB4RkYsIG9mZnNldCAmIDB4RkYpOworCXN0cnVjdCBhZGJfcmVxdWVzdCByZXE7CisJaWYgKG1hY2lpc2lfcmVxdWVzdCgmcmVxLCBOVUxMLCA0LCBDVURBX1BBQ0tFVCwgQ1VEQV9HRVRfUFJBTSwKKwkJCShvZmZzZXQgPj4gOCkgJiAweEZGLCBvZmZzZXQgJiAweEZGKSkKKwkJcmV0dXJuIDA7CiAJcmV0dXJuIHJlcS5yZXBseVszXTsKIH0KIAotLyoKLSAqIFdyaXRlIGEgYnl0ZSB0byB0aGUgTlZSQU0KLSAqLwotCi1zdGF0aWMgdm9pZCBhZGJfd3JpdGVfcHJhbShpbnQgb2Zmc2V0LCBfX3U4IGRhdGEpCitzdGF0aWMgdm9pZCBtYWNpaXNpX3dyaXRlX3ByYW0oaW50IG9mZnNldCwgX191OCBkYXRhKQogewotCXZvbGF0aWxlIHN0cnVjdCBhZGJfcmVxdWVzdCByZXE7Ci0KLQlhZGJfcmVxdWVzdCgoc3RydWN0IGFkYl9yZXF1ZXN0ICopICZyZXEsIE5VTEwsCi0JCQlBREJSRVFfUkFXfEFEQlJFUV9TWU5DLAotCQkJNSwgQ1VEQV9QQUNLRVQsIENVREFfU0VUX1BSQU0sCi0JCQkob2Zmc2V0ID4+IDgpICYgMHhGRiwgb2Zmc2V0ICYgMHhGRiwKLQkJCWRhdGEpOworCXN0cnVjdCBhZGJfcmVxdWVzdCByZXE7CisJbWFjaWlzaV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDUsIENVREFfUEFDS0VULCBDVURBX1NFVF9QUkFNLAorCQkJKG9mZnNldCA+PiA4KSAmIDB4RkYsIG9mZnNldCAmIDB4RkYsIGRhdGEpOwogfQotI2VuZGlmIC8qIENPTkZJR19BREIgKi8KKyNlbHNlCisjZGVmaW5lIG1hY2lpc2lfcmVhZF90aW1lKCkgMAorI2RlZmluZSBtYWNpaXNpX3dyaXRlX3RpbWUobikKKyNkZWZpbmUgbWFjaWlzaV9yZWFkX3ByYW0gTlVMTAorI2RlZmluZSBtYWNpaXNpX3dyaXRlX3ByYW0gTlVMTAorI2VuZGlmCiAKIC8qCiAgKiBWSUEgUFJBTS9SVEMgYWNjZXNzIHJvdXRpbmVzCkBAIC0zMDUsNDIgKzM5Niw1NSBAQAogCiBzdGF0aWMgdm9pZCBjdWRhX3Jlc3RhcnQodm9pZCkKIHsKLQlhZGJfcmVxdWVzdChOVUxMLCBOVUxMLCBBREJSRVFfUkFXfEFEQlJFUV9TWU5DLAotCQkJMiwgQ1VEQV9QQUNLRVQsIENVREFfUkVTRVRfU1lTVEVNKTsKKwlzdHJ1Y3QgYWRiX3JlcXVlc3QgcmVxOworCWlmIChjdWRhX3JlcXVlc3QoJnJlcSwgTlVMTCwgMiwgQ1VEQV9QQUNLRVQsIENVREFfUkVTRVRfU1lTVEVNKSA8IDApCisJCXJldHVybjsKKwl3aGlsZSAoIXJlcS5jb21wbGV0ZSkKKwkJY3VkYV9wb2xsKCk7CiB9CiAKIHN0YXRpYyB2b2lkIGN1ZGFfc2h1dGRvd24odm9pZCkKIHsKLQlhZGJfcmVxdWVzdChOVUxMLCBOVUxMLCBBREJSRVFfUkFXfEFEQlJFUV9TWU5DLAotCQkJMiwgQ1VEQV9QQUNLRVQsIENVREFfUE9XRVJET1dOKTsKKwlzdHJ1Y3QgYWRiX3JlcXVlc3QgcmVxOworCWlmIChjdWRhX3JlcXVlc3QoJnJlcSwgTlVMTCwgMiwgQ1VEQV9QQUNLRVQsIENVREFfUE9XRVJET1dOKSA8IDApCisJCXJldHVybjsKKwl3aGlsZSAoIXJlcS5jb21wbGV0ZSkKKwkJY3VkYV9wb2xsKCk7CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfQURCX0NVREEgKi8KIAotI2lmZGVmIENPTkZJR19BREJfUE1VCisjaWZkZWYgQ09ORklHX0FEQl9QTVU2OEsKIAogdm9pZCBwbXVfcmVzdGFydCh2b2lkKQogewotCWFkYl9yZXF1ZXN0KE5VTEwsIE5VTEwsIEFEQlJFUV9SQVd8QURCUkVRX1NZTkMsCi0JCQkzLCBQTVVfUEFDS0VULCBQTVVfU0VUX0lOVFJfTUFTSywKLQkJCVBNVV9JTlRfQURCfFBNVV9JTlRfVElDSyk7Ci0KLQlhZGJfcmVxdWVzdChOVUxMLCBOVUxMLCBBREJSRVFfUkFXfEFEQlJFUV9TWU5DLAotCQkJMiwgUE1VX1BBQ0tFVCwgUE1VX1JFU0VUKTsKKwlzdHJ1Y3QgYWRiX3JlcXVlc3QgcmVxOworCWlmIChwbXVfcmVxdWVzdCgmcmVxLCBOVUxMLAorCQkJMiwgUE1VX1NFVF9JTlRSX01BU0ssIFBNVV9JTlRfQURCfFBNVV9JTlRfVElDSykgPCAwKQorCQlyZXR1cm47CisJd2hpbGUgKCFyZXEuY29tcGxldGUpCisJCXBtdV9wb2xsKCk7CisJaWYgKHBtdV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDEsIFBNVV9SRVNFVCkgPCAwKQorCQlyZXR1cm47CisJd2hpbGUgKCFyZXEuY29tcGxldGUpCisJCXBtdV9wb2xsKCk7CiB9CiAKIHZvaWQgcG11X3NodXRkb3duKHZvaWQpCiB7Ci0JYWRiX3JlcXVlc3QoTlVMTCwgTlVMTCwgQURCUkVRX1JBV3xBREJSRVFfU1lOQywKLQkJCTMsIFBNVV9QQUNLRVQsIFBNVV9TRVRfSU5UUl9NQVNLLAotCQkJUE1VX0lOVF9BREJ8UE1VX0lOVF9USUNLKTsKLQotCWFkYl9yZXF1ZXN0KE5VTEwsIE5VTEwsIEFEQlJFUV9SQVd8QURCUkVRX1NZTkMsCi0JCQk2LCBQTVVfUEFDS0VULCBQTVVfU0hVVERPV04sCi0JCQknTScsICdBJywgJ1QnLCAnVCcpOworCXN0cnVjdCBhZGJfcmVxdWVzdCByZXE7CisJaWYgKHBtdV9yZXF1ZXN0KCZyZXEsIE5VTEwsCisJCQkyLCBQTVVfU0VUX0lOVFJfTUFTSywgUE1VX0lOVF9BREJ8UE1VX0lOVF9USUNLKSA8IDApCisJCXJldHVybjsKKwl3aGlsZSAoIXJlcS5jb21wbGV0ZSkKKwkJcG11X3BvbGwoKTsKKwlpZiAocG11X3JlcXVlc3QoJnJlcSwgTlVMTCwgNSwgUE1VX1NIVVRET1dOLCAnTScsICdBJywgJ1QnLCAnVCcpIDwgMCkKKwkJcmV0dXJuOworCXdoaWxlICghcmVxLmNvbXBsZXRlKQorCQlwbXVfcG9sbCgpOwogfQogCi0jZW5kaWYgLyogQ09ORklHX0FEQl9QTVUgKi8KKyNlbmRpZgogCiAvKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zNTEsMjEgKzQ1NSwyMiBAQAogCiB2b2lkIG1hY19wcmFtX3JlYWQoaW50IG9mZnNldCwgX191OCAqYnVmZmVyLCBpbnQgbGVuKQogewotCV9fdTggKCpmdW5jKShpbnQpID0gTlVMTDsKKwlfX3U4ICgqZnVuYykoaW50KTsKIAlpbnQgaTsKIAotCWlmIChtYWNpbnRvc2hfY29uZmlnLT5hZGJfdHlwZSA9PSBNQUNfQURCX0lJU0kgfHwKLQkgICAgbWFjaW50b3NoX2NvbmZpZy0+YWRiX3R5cGUgPT0gTUFDX0FEQl9QQjEgfHwKLQkgICAgbWFjaW50b3NoX2NvbmZpZy0+YWRiX3R5cGUgPT0gTUFDX0FEQl9QQjIgfHwKLQkgICAgbWFjaW50b3NoX2NvbmZpZy0+YWRiX3R5cGUgPT0gTUFDX0FEQl9DVURBKSB7Ci0jaWZkZWYgQ09ORklHX0FEQgotCQlmdW5jID0gYWRiX3JlYWRfcHJhbTsKLSNlbHNlCi0JCXJldHVybjsKLSNlbmRpZgotCX0gZWxzZSB7CisJc3dpdGNoKG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlKSB7CisJY2FzZSBNQUNfQURCX0lJU0k6CisJCWZ1bmMgPSBtYWNpaXNpX3JlYWRfcHJhbTsgYnJlYWs7CisJY2FzZSBNQUNfQURCX1BCMToKKwljYXNlIE1BQ19BREJfUEIyOgorCQlmdW5jID0gcG11X3JlYWRfcHJhbTsgYnJlYWs7CisJY2FzZSBNQUNfQURCX0NVREE6CisJCWZ1bmMgPSBjdWRhX3JlYWRfcHJhbTsgYnJlYWs7CisJZGVmYXVsdDoKIAkJZnVuYyA9IHZpYV9yZWFkX3ByYW07CiAJfQorCWlmICghZnVuYykKKwkJcmV0dXJuOwogCWZvciAoaSA9IDAgOyBpIDwgbGVuIDsgaSsrKSB7CiAJCWJ1ZmZlcltpXSA9ICgqZnVuYykob2Zmc2V0KyspOwogCX0KQEAgLTM3MywyMSArNDc4LDIyIEBACiAKIHZvaWQgbWFjX3ByYW1fd3JpdGUoaW50IG9mZnNldCwgX191OCAqYnVmZmVyLCBpbnQgbGVuKQogewotCXZvaWQgKCpmdW5jKShpbnQsIF9fdTgpID0gTlVMTDsKKwl2b2lkICgqZnVuYykoaW50LCBfX3U4KTsKIAlpbnQgaTsKIAotCWlmIChtYWNpbnRvc2hfY29uZmlnLT5hZGJfdHlwZSA9PSBNQUNfQURCX0lJU0kgfHwKLQkgICAgbWFjaW50b3NoX2NvbmZpZy0+YWRiX3R5cGUgPT0gTUFDX0FEQl9QQjEgfHwKLQkgICAgbWFjaW50b3NoX2NvbmZpZy0+YWRiX3R5cGUgPT0gTUFDX0FEQl9QQjIgfHwKLQkgICAgbWFjaW50b3NoX2NvbmZpZy0+YWRiX3R5cGUgPT0gTUFDX0FEQl9DVURBKSB7Ci0jaWZkZWYgQ09ORklHX0FEQgotCQlmdW5jID0gYWRiX3dyaXRlX3ByYW07Ci0jZWxzZQotCQlyZXR1cm47Ci0jZW5kaWYKLQl9IGVsc2UgeworCXN3aXRjaChtYWNpbnRvc2hfY29uZmlnLT5hZGJfdHlwZSkgeworCWNhc2UgTUFDX0FEQl9JSVNJOgorCQlmdW5jID0gbWFjaWlzaV93cml0ZV9wcmFtOyBicmVhazsKKwljYXNlIE1BQ19BREJfUEIxOgorCWNhc2UgTUFDX0FEQl9QQjI6CisJCWZ1bmMgPSBwbXVfd3JpdGVfcHJhbTsgYnJlYWs7CisJY2FzZSBNQUNfQURCX0NVREE6CisJCWZ1bmMgPSBjdWRhX3dyaXRlX3ByYW07IGJyZWFrOworCWRlZmF1bHQ6CiAJCWZ1bmMgPSB2aWFfd3JpdGVfcHJhbTsKIAl9CisJaWYgKCFmdW5jKQorCQlyZXR1cm47CiAJZm9yIChpID0gMCA7IGkgPCBsZW4gOyBpKyspIHsKIAkJKCpmdW5jKShvZmZzZXQrKywgYnVmZmVyW2ldKTsKIAl9CkBAIC00MDgsNyArNTE0LDcgQEAKIAl9IGVsc2UgaWYgKG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlID09IE1BQ19BREJfQ1VEQSkgewogCQljdWRhX3NodXRkb3duKCk7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfQURCX1BNVQorI2lmZGVmIENPTkZJR19BREJfUE1VNjhLCiAJfSBlbHNlIGlmIChtYWNpbnRvc2hfY29uZmlnLT5hZGJfdHlwZSA9PSBNQUNfQURCX1BCMQogCQl8fCBtYWNpbnRvc2hfY29uZmlnLT5hZGJfdHlwZSA9PSBNQUNfQURCX1BCMikgewogCQlwbXVfc2h1dGRvd24oKTsKQEAgLTQ0OCw3ICs1NTQsNyBAQAogCX0gZWxzZSBpZiAobWFjaW50b3NoX2NvbmZpZy0+YWRiX3R5cGUgPT0gTUFDX0FEQl9DVURBKSB7CiAJCWN1ZGFfcmVzdGFydCgpOwogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FEQl9QTVUKKyNpZmRlZiBDT05GSUdfQURCX1BNVTY4SwogCX0gZWxzZSBpZiAobWFjaW50b3NoX2NvbmZpZy0+YWRiX3R5cGUgPT0gTUFDX0FEQl9QQjEKIAkJfHwgbWFjaW50b3NoX2NvbmZpZy0+YWRiX3R5cGUgPT0gTUFDX0FEQl9QQjIpIHsKIAkJcG11X3Jlc3RhcnQoKTsKQEAgLTQ2NiwxMiArNTcyLDEzIEBACiAJCS8qIG1ha2UgYSAxLXRvLTEgbWFwcGluZywgdXNpbmcgdGhlIHRyYW5zcGFyZW50IHRyYW4uIHJlZy4gKi8KIAkJdW5zaWduZWQgbG9uZyB2aXJ0ID0gKHVuc2lnbmVkIGxvbmcpIG1hY19yZXNldDsKIAkJdW5zaWduZWQgbG9uZyBwaHlzID0gdmlydF90b19waHlzKG1hY19yZXNldCk7CisJCXVuc2lnbmVkIGxvbmcgYWRkciA9IChwaHlzJjB4RkYwMDAwMDApfDB4ODc3NzsKIAkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBwaHlzLXZpcnQ7CiAJCWxvY2FsX2lycV9kaXNhYmxlKCk7IC8qIGxldHMgbm90IHNjcmV3IHRoaXMgdXAsIG9rPyAqLwogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiLmNoaXAgNjgwMzBcblx0IgogCQkJCSAgICAgInBtb3ZlICUwLCUvdHQwXG5cdCIKIAkJCQkgICAgICIuY2hpcCA2OGsiCi0JCQkJICAgICA6IDogIm0iICgocGh5cyYweEZGMDAwMDAwKXwweDg3NzcpKTsKKwkJCQkgICAgIDogOiAibSIgKGFkZHIpKTsKIAkJLyogTm93IGp1bXAgdG8gcGh5c2ljYWwgYWRkcmVzcyBzbyB3ZSBjYW4gZGlzYWJsZSBNTVUgKi8KIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAgICAgICAgICAgICAgICAgICAgICIuY2hpcCA2ODAzMFxuXHQiCkBAIC01ODgsMjAgKzY5NSwyMiBAQAogCXVuc2lnbmVkIGxvbmcgbm93OwogCiAJaWYgKCFvcCkgeyAvKiByZWFkICovCi0JCWlmIChtYWNpbnRvc2hfY29uZmlnLT5hZGJfdHlwZSA9PSBNQUNfQURCX0lJKSB7CisJCXN3aXRjaCAobWFjaW50b3NoX2NvbmZpZy0+YWRiX3R5cGUpIHsKKwkJY2FzZSBNQUNfQURCX0lJOgorCQljYXNlIE1BQ19BREJfSU9QOgogCQkJbm93ID0gdmlhX3JlYWRfdGltZSgpOwotCQl9IGVsc2UKLSNpZmRlZiBDT05GSUdfQURCCi0JCWlmICgobWFjaW50b3NoX2NvbmZpZy0+YWRiX3R5cGUgPT0gTUFDX0FEQl9JSVNJKSB8fAotCQkJICAgKG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlID09IE1BQ19BREJfUEIxKSB8fAotCQkJICAgKG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlID09IE1BQ19BREJfUEIyKSB8fAotCQkJICAgKG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlID09IE1BQ19BREJfQ1VEQSkpIHsKLQkJCW5vdyA9IGFkYl9yZWFkX3RpbWUoKTsKLQkJfSBlbHNlCi0jZW5kaWYKLQkJaWYgKG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlID09IE1BQ19BREJfSU9QKSB7Ci0JCQlub3cgPSB2aWFfcmVhZF90aW1lKCk7Ci0JCX0gZWxzZSB7CisJCQlicmVhazsKKwkJY2FzZSBNQUNfQURCX0lJU0k6CisJCQlub3cgPSBtYWNpaXNpX3JlYWRfdGltZSgpOworCQkJYnJlYWs7CisJCWNhc2UgTUFDX0FEQl9QQjE6CisJCWNhc2UgTUFDX0FEQl9QQjI6CisJCQlub3cgPSBwbXVfcmVhZF90aW1lKCk7CisJCQlicmVhazsKKwkJY2FzZSBNQUNfQURCX0NVREE6CisJCQlub3cgPSBjdWRhX3JlYWRfdGltZSgpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CiAJCQlub3cgPSAwOwogCQl9CiAKQEAgLTYxOSwxNSArNzI4LDIwIEBACiAJCW5vdyA9IG1rdGltZSh0LT50bV95ZWFyICsgMTkwMCwgdC0+dG1fbW9uICsgMSwgdC0+dG1fbWRheSwKIAkJCSAgICAgdC0+dG1faG91ciwgdC0+dG1fbWluLCB0LT50bV9zZWMpOwogCi0JCWlmIChtYWNpbnRvc2hfY29uZmlnLT5hZGJfdHlwZSA9PSBNQUNfQURCX0lJKSB7CisJCXN3aXRjaCAobWFjaW50b3NoX2NvbmZpZy0+YWRiX3R5cGUpIHsKKwkJY2FzZSBNQUNfQURCX0lJOgorCQljYXNlIE1BQ19BREJfSU9QOgogCQkJdmlhX3dyaXRlX3RpbWUobm93KTsKLQkJfSBlbHNlIGlmICgobWFjaW50b3NoX2NvbmZpZy0+YWRiX3R5cGUgPT0gTUFDX0FEQl9JSVNJKSB8fAotCQkJICAgKG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlID09IE1BQ19BREJfUEIxKSB8fAotCQkJICAgKG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlID09IE1BQ19BREJfUEIyKSB8fAotCQkJICAgKG1hY2ludG9zaF9jb25maWctPmFkYl90eXBlID09IE1BQ19BREJfQ1VEQSkpIHsKLQkJCWFkYl93cml0ZV90aW1lKG5vdyk7Ci0JCX0gZWxzZSBpZiAobWFjaW50b3NoX2NvbmZpZy0+YWRiX3R5cGUgPT0gTUFDX0FEQl9JT1ApIHsKLQkJCXZpYV93cml0ZV90aW1lKG5vdyk7CisJCQlicmVhazsKKwkJY2FzZSBNQUNfQURCX0NVREE6CisJCQljdWRhX3dyaXRlX3RpbWUobm93KTsKKwkJCWJyZWFrOworCQljYXNlIE1BQ19BREJfUEIxOgorCQljYXNlIE1BQ19BREJfUEIyOgorCQkJcG11X3dyaXRlX3RpbWUobm93KTsKKwkJCWJyZWFrOworCQljYXNlIE1BQ19BREJfSUlTSToKKwkJCW1hY2lpc2lfd3JpdGVfdGltZShub3cpOwogCQl9CiAjZW5kaWYKIAl9CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbWF0aC1lbXUvbXVsdGlfYXJpdGguaCBiL2FyY2gvbTY4ay9tYXRoLWVtdS9tdWx0aV9hcml0aC5oCmluZGV4IDAyMjUxZTUuLjRhZDBjYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tYXRoLWVtdS9tdWx0aV9hcml0aC5oCisrKyBiL2FyY2gvbTY4ay9tYXRoLWVtdS9tdWx0aV9hcml0aC5oCkBAIC0zNjYsNyArMzY2LDcgQEAKIAogI2RlZmluZSBmcF9tdWw2NChkZXN0aCwgZGVzdGwsIHNyYzEsIHNyYzIpICh7CQkJCVwKIAlhc20gKCJtdWx1LmwgJTIsJTE6JTAiIDogIj1kIiAoZGVzdGwpLCAiPWQiIChkZXN0aCkJCVwKLQkJOiAiZyIgKHNyYzEpLCAiMCIgKHNyYzIpKTsJCQkJXAorCQk6ICJkbSIgKHNyYzEpLCAiMCIgKHNyYzIpKTsJCQkJXAogfSkKICNkZWZpbmUgZnBfZGl2NjQocXVvdCwgcmVtLCBzcmNoLCBzcmNsLCBkaXYpCQkJCVwKIAlhc20gKCJkaXZ1LmwgJTIsJTE6JTAiIDogIj1kIiAocXVvdCksICI9ZCIgKHJlbSkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tbS9rbWFwLmMgYi9hcmNoL202OGsvbW0va21hcC5jCmluZGV4IGZlMjM4M2UuLjg1YWQxOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tbS9rbWFwLmMKKysrIGIvYXJjaC9tNjhrL21tL2ttYXAuYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAgKi8KIC8qIFJld3JpdHRlbiBieSBBbmRyZWFzIFNjaHdhYiB0byByZW1vdmUgYWxsIHJhY2VzLiAqLwogCi12b2lkICpfX2lvcmVtYXAodW5zaWduZWQgbG9uZyBwaHlzYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgY2FjaGVmbGFnKQordm9pZCBfX2lvbWVtICpfX2lvcmVtYXAodW5zaWduZWQgbG9uZyBwaHlzYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgY2FjaGVmbGFnKQogewogCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7CiAJdW5zaWduZWQgbG9uZyB2aXJ0YWRkciwgcmV0YWRkcjsKQEAgLTEyMSw3ICsxMjEsNyBAQAogCWlmIChNQUNIX0lTX0FNSUdBKSB7CiAJCWlmICgocGh5c2FkZHIgPj0gMHg0MDAwMDAwMCkgJiYgKHBoeXNhZGRyICsgc2l6ZSA8IDB4NjAwMDAwMDApCiAJCSAgICAmJiAoY2FjaGVmbGFnID09IElPTUFQX05PQ0FDSEVfU0VSKSkKLQkJCXJldHVybiAodm9pZCAqKXBoeXNhZGRyOworCQkJcmV0dXJuICh2b2lkIF9faW9tZW0gKilwaHlzYWRkcjsKIAl9CiAjZW5kaWYKIApAQCAtMjE4LDIxICsyMTgsMjEgQEAKICNlbmRpZgogCWZsdXNoX3RsYl9hbGwoKTsKIAotCXJldHVybiAodm9pZCAqKXJldGFkZHI7CisJcmV0dXJuICh2b2lkIF9faW9tZW0gKilyZXRhZGRyOwogfQogCiAvKgogICogVW5tYXAgYSBpb3JlbWFwKCllZCByZWdpb24gYWdhaW4KICAqLwotdm9pZCBpb3VubWFwKHZvaWQgKmFkZHIpCit2b2lkIGlvdW5tYXAodm9pZCBfX2lvbWVtICphZGRyKQogewogI2lmZGVmIENPTkZJR19BTUlHQQogCWlmICgoIU1BQ0hfSVNfQU1JR0EpIHx8CiAJICAgICgoKHVuc2lnbmVkIGxvbmcpYWRkciA8IDB4NDAwMDAwMDApIHx8CiAJICAgICAoKHVuc2lnbmVkIGxvbmcpYWRkciA+IDB4NjAwMDAwMDApKSkKLQkJCWZyZWVfaW9fYXJlYShhZGRyKTsKKwkJCWZyZWVfaW9fYXJlYSgoX19mb3JjZSB2b2lkICopYWRkcik7CiAjZWxzZQotCWZyZWVfaW9fYXJlYShhZGRyKTsKKwlmcmVlX2lvX2FyZWEoKF9fZm9yY2Ugdm9pZCAqKWFkZHIpOwogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tdm1lMTZ4L3J0Yy5jIGIvYXJjaC9tNjhrL212bWUxNngvcnRjLmMKaW5kZXggNzk3N2VhZS4uYTY5ZmUzMCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL212bWUxNngvcnRjLmMKKysrIGIvYXJjaC9tNjhrL212bWUxNngvcnRjLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CkBAIC00NCw2ICs0NSw3IEBACiAJdm9sYXRpbGUgTUs0OFQwOHB0cl90IHJ0YyA9IChNSzQ4VDA4cHRyX3QpTVZNRV9SVENfQkFTRTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBydGNfdGltZSB3dGltZTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBSVENfUkRfVElNRToJLyogUmVhZCB0aGUgdGltZS9kYXRlIGZyb20gUlRDCSovCkBAIC02Myw3ICs2NSw3IEBACiAJCXd0aW1lLnRtX3dkYXkgPSBCQ0QyQklOKHJ0Yy0+YmNkX2RvdyktMTsKIAkJcnRjLT5jdHJsID0gMDsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICopYXJnLCAmd3RpbWUsIHNpemVvZiB3dGltZSkgPworCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZ3dGltZSwgc2l6ZW9mIHd0aW1lKSA/CiAJCQkJCQkJCS1FRkFVTFQgOiAwOwogCX0KIAljYXNlIFJUQ19TRVRfVElNRToJLyogU2V0IHRoZSBSVEMgKi8KQEAgLTc1LDggKzc3LDcgQEAKIAkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQkJcmV0dXJuIC1FQUNDRVM7CiAKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZydGNfdG0sIChzdHJ1Y3QgcnRjX3RpbWUqKWFyZywKLQkJCQkgICBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSkpCisJCWlmIChjb3B5X2Zyb21fdXNlcigmcnRjX3RtLCBhcmdwLCBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQl5cnMgPSBydGNfdG0udG1feWVhcjsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9xNDAvY29uZmlnLmMgYi9hcmNoL202OGsvcTQwL2NvbmZpZy5jCmluZGV4IDAyYjYyNmJhZS4uNWUwZjliMCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL3E0MC9jb25maWcuYworKysgYi9hcmNoL202OGsvcTQwL2NvbmZpZy5jCkBAIC0zNiw4ICszNiw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20vcTQwX21hc3Rlci5oPgogCi1leHRlcm4gdm9pZCBmbG9wcHlfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpOwotCiBleHRlcm4gaXJxcmV0dXJuX3QgcTQwX3Byb2Nlc3NfaW50IChpbnQgbGV2ZWwsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGV4dGVybiBpcnFyZXR1cm5fdCAoKnE0MF9kZWZhdWx0X2hhbmRsZXJbXSkgKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsgIC8qIGFkZGVkIGp1c3QgZm9yIGRlYnVnZ2luZyAqLwogZXh0ZXJuIHZvaWQgcTQwX2luaXRfSVJRICh2b2lkKTsKQEAgLTE5NCw5ICsxOTIsNiBAQAogICAgIG1hY2hfaGVhcnRiZWF0ID0gcTQwX2hlYXJ0YmVhdDsKICNlbmRpZgogICAgIG1hY2hfaGFsdCA9IHE0MF9oYWx0OwotI2lmZGVmIENPTkZJR19EVU1NWV9DT05TT0xFCi0gICAgY29uc3dpdGNocCA9ICZkdW1teV9jb247Ci0jZW5kaWYKIAogICAgIC8qIGRpc2FibGUgYSBmZXcgdGhpbmdzIHRoYXQgU01TUSBtaWdodCBoYXZlIGxlZnQgZW5hYmxlZCAqLwogICAgIHE0MF9kaXNhYmxlX2lycXMoKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9zdW4zL2NvbmZpZy5jIGIvYXJjaC9tNjhrL3N1bjMvY29uZmlnLmMKaW5kZXggNzdkMDViYy4uZjFjYTBkZiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL3N1bjMvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL3N1bjMvY29uZmlnLmMKQEAgLTE2MCw5ICsxNjAsNiBAQAogCW1hY2hfaHdjbGsgICAgICAgICAgID0gIHN1bjNfaHdjbGs7CiAJbWFjaF9oYWx0CSAgICAgPSAgc3VuM19oYWx0OwogCW1hY2hfZ2V0X2hhcmR3YXJlX2xpc3QgPSBzdW4zX2dldF9oYXJkd2FyZV9saXN0OwotI2lmIGRlZmluZWQoQ09ORklHX0RVTU1ZX0NPTlNPTEUpCi0JY29uc3dpdGNocAkgICAgID0gJmR1bW15X2NvbjsKLSNlbmRpZgogCiAJbWVtb3J5X3N0YXJ0ID0gKCgoKGludCkmX2VuZCkgKyAweDIwMDApICYgfjB4MWZmZik7CiAvLyBQUk9NIHNlZW1zIHRvIHdhbnQgdGhlIGxhc3QgY291cGxlIG9mIHBoeXNpY2FsIHBhZ2VzLiAtLW0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9zdW4zeC9jb25maWcuYyBiL2FyY2gvbTY4ay9zdW4zeC9jb25maWcuYwppbmRleCAwZWY1NDdmLi4wOTIwZjVkIDEwMDY0NAotLS0gYS9hcmNoL202OGsvc3VuM3gvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL3N1bjN4L2NvbmZpZy5jCkBAIC03MSwxMCArNzEsNiBAQAogCW1hY2hfZ2V0X21vZGVsICAgICAgID0gc3VuM19nZXRfbW9kZWw7CiAJbWFjaF9nZXRfaGFyZHdhcmVfbGlzdCA9IHN1bjN4X2dldF9oYXJkd2FyZV9saXN0OwogCi0jaWZkZWYgQ09ORklHX0RVTU1ZX0NPTlNPTEUKLQljb25zd2l0Y2hwCSAgICAgPSAmZHVtbXlfY29uOwotI2VuZGlmCi0KIAlzdW4zX2ludHJlZyA9ICh1bnNpZ25lZCBjaGFyICopU1VOM1hfSU5UUkVHOwogCiAJLyogb25seSB0aGUgc2VyaWFsIGNvbnNvbGUgaXMga25vd24gdG8gd29yayBhbnl3YXkuLi4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L0tjb25maWcgYi9hcmNoL202OGtub21tdS9LY29uZmlnCmluZGV4IGI5NjQ5ODEuLmUyYTZlODYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L0tjb25maWcKKysrIGIvYXJjaC9tNjhrbm9tbXUvS2NvbmZpZwpAQCAtMTcsMTAgKzE3LDYgQEAKIAlib29sCiAJZGVmYXVsdCBuCiAKLWNvbmZpZyBVSUQxNgotCWJvb2wKLQlkZWZhdWx0IHkKLQogY29uZmlnIFJXU0VNX0dFTkVSSUNfU1BJTkxPQ0sKIAlib29sCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9NYWtlZmlsZSBiL2FyY2gvbTY4a25vbW11L01ha2VmaWxlCmluZGV4IGI2YjVjMTQuLjZmODgwY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L01ha2VmaWxlCisrKyBiL2FyY2gvbTY4a25vbW11L01ha2VmaWxlCkBAIC05OSw3ICs5OSw2IEBACiBBRkxBR1MgKz0gJChjZmxhZ3MteSkKIAogQ0ZMQUdTICs9ICQoY2ZsYWdzLXkpCi1DRkxBR1MgKz0gLU8xIC1nCiBDRkxBR1MgKz0gLURfX2xpbnV4X18KIENGTEFHUyArPSAtRFVUU19TWVNOQU1FPVwidUNsaW51eFwiCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9tNjhrX2tzeW1zLmMgYi9hcmNoL202OGtub21tdS9rZXJuZWwvbTY4a19rc3ltcy5jCmluZGV4IGIyYzYyZWUuLmVkZGI4ZDNlIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9rZXJuZWwvbTY4a19rc3ltcy5jCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9tNjhrX2tzeW1zLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgogCi1leHRlcm4gdm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgdXNlciAqKTsKIGV4dGVybiBpbnQgZHVtcF9mcHUoc3RydWN0IHB0X3JlZ3MgKiwgZWxmX2ZwcmVnc2V0X3QgKik7CiAKIC8qIHBsYXRmb3JtIGRlcGVuZGVudCBzdXBwb3J0ICovCkBAIC0yNiw3ICsyNSw2IEBACiBFWFBPUlRfU1lNQk9MKF9faW9yZW1hcCk7CiBFWFBPUlRfU1lNQk9MKGlvdW5tYXApOwogRVhQT1JUX1NZTUJPTChkdW1wX2ZwdSk7Ci1FWFBPUlRfU1lNQk9MKGR1bXBfdGhyZWFkKTsKIEVYUE9SVF9TWU1CT0woc3Rybmxlbik7CiBFWFBPUlRfU1lNQk9MKHN0cnJjaHIpOwogRVhQT1JUX1NZTUJPTChzdHJzdHIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggODJlN2VjOC4uOTliZjQzOCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL202OGtub21tdS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xOTgsMTAgKzE5OCw5IEBACiB7CiAJc3RydWN0IHB0X3JlZ3MgKiBjaGlsZHJlZ3M7CiAJc3RydWN0IHN3aXRjaF9zdGFjayAqIGNoaWxkc3RhY2ssICpzdGFjazsKLQl1bnNpZ25lZCBsb25nIHN0YWNrX29mZnNldCwgKnJldHA7CisJdW5zaWduZWQgbG9uZyAqcmV0cDsKIAotCXN0YWNrX29mZnNldCA9IFRIUkVBRF9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKTsKLQljaGlsZHJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgKCh1bnNpZ25lZCBsb25nKSBwLT50aHJlYWRfaW5mbyArIHN0YWNrX29mZnNldCk7CisJY2hpbGRyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopICh0YXNrX3N0YWNrX3BhZ2UocCkgKyBUSFJFQURfU0laRSkgLSAxOwogCiAJKmNoaWxkcmVncyA9ICpyZWdzOwogCWNoaWxkcmVncy0+ZDAgPSAwOwpAQCAtMjc2LDUyICsyNzUsNiBAQAogfQogCiAvKgotICogZmlsbCBpbiB0aGUgdXNlciBzdHJ1Y3R1cmUgZm9yIGEgY29yZSBkdW1wLi4KLSAqLwotdm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIHN0cnVjdCB1c2VyICogZHVtcCkKLXsKLQlzdHJ1Y3Qgc3dpdGNoX3N0YWNrICpzdzsKLQotCS8qIGNoYW5nZWQgdGhlIHNpemUgY2FsY3VsYXRpb25zIC0gc2hvdWxkIGhvcGVmdWxseSB3b3JrIGJldHRlci4gbGJ0ICovCi0JZHVtcC0+bWFnaWMgPSBDTUFHSUM7Ci0JZHVtcC0+c3RhcnRfY29kZSA9IDA7Ci0JZHVtcC0+c3RhcnRfc3RhY2sgPSByZHVzcCgpICYgfihQQUdFX1NJWkUgLSAxKTsKLQlkdW1wLT51X3RzaXplID0gKCh1bnNpZ25lZCBsb25nKSBjdXJyZW50LT5tbS0+ZW5kX2NvZGUpID4+IFBBR0VfU0hJRlQ7Ci0JZHVtcC0+dV9kc2l6ZSA9ICgodW5zaWduZWQgbG9uZykgKGN1cnJlbnQtPm1tLT5icmsgKwotCQkJCQkgIChQQUdFX1NJWkUtMSkpKSA+PiBQQUdFX1NISUZUOwotCWR1bXAtPnVfZHNpemUgLT0gZHVtcC0+dV90c2l6ZTsKLQlkdW1wLT51X3NzaXplID0gMDsKLQotCWlmIChkdW1wLT5zdGFydF9zdGFjayA8IFRBU0tfU0laRSkKLQkJZHVtcC0+dV9zc2l6ZSA9ICgodW5zaWduZWQgbG9uZykgKFRBU0tfU0laRSAtIGR1bXAtPnN0YXJ0X3N0YWNrKSkgPj4gUEFHRV9TSElGVDsKLQotCWR1bXAtPnVfYXIwID0gKHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0ICopKChpbnQpJmR1bXAtPnJlZ3MgLSAoaW50KWR1bXApOwotCXN3ID0gKChzdHJ1Y3Qgc3dpdGNoX3N0YWNrICopcmVncykgLSAxOwotCWR1bXAtPnJlZ3MuZDEgPSByZWdzLT5kMTsKLQlkdW1wLT5yZWdzLmQyID0gcmVncy0+ZDI7Ci0JZHVtcC0+cmVncy5kMyA9IHJlZ3MtPmQzOwotCWR1bXAtPnJlZ3MuZDQgPSByZWdzLT5kNDsKLQlkdW1wLT5yZWdzLmQ1ID0gcmVncy0+ZDU7Ci0JZHVtcC0+cmVncy5kNiA9IHN3LT5kNjsKLQlkdW1wLT5yZWdzLmQ3ID0gc3ctPmQ3OwotCWR1bXAtPnJlZ3MuYTAgPSByZWdzLT5hMDsKLQlkdW1wLT5yZWdzLmExID0gcmVncy0+YTE7Ci0JZHVtcC0+cmVncy5hMiA9IHJlZ3MtPmEyOwotCWR1bXAtPnJlZ3MuYTMgPSBzdy0+YTM7Ci0JZHVtcC0+cmVncy5hNCA9IHN3LT5hNDsKLQlkdW1wLT5yZWdzLmE1ID0gc3ctPmE1OwotCWR1bXAtPnJlZ3MuYTYgPSBzdy0+YTY7Ci0JZHVtcC0+cmVncy5kMCA9IHJlZ3MtPmQwOwotCWR1bXAtPnJlZ3Mub3JpZ19kMCA9IHJlZ3MtPm9yaWdfZDA7Ci0JZHVtcC0+cmVncy5zdGthZGogPSByZWdzLT5zdGthZGo7Ci0JZHVtcC0+cmVncy5zciA9IHJlZ3MtPnNyOwotCWR1bXAtPnJlZ3MucGMgPSByZWdzLT5wYzsKLQlkdW1wLT5yZWdzLmZtdHZlYyA9IChyZWdzLT5mb3JtYXQgPDwgMTIpIHwgcmVncy0+dmVjdG9yOwotCS8qIGR1bXAgZmxvYXRpbmcgcG9pbnQgc3R1ZmYgKi8KLQlkdW1wLT51X2ZwdmFsaWQgPSBkdW1wX2ZwdSAocmVncywgJmR1bXAtPm02OGtmcCk7Ci19Ci0KLS8qCiAgKglHZW5lcmljIGR1bXBpbmcgY29kZS4gVXNlZCBmb3IgcGFuaWMgYW5kIGRlYnVnLgogICovCiB2b2lkIGR1bXAoc3RydWN0IHB0X3JlZ3MgKmZwKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3B0cmFjZS5jCmluZGV4IDI2MmFiOGMuLjM4MmNhNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL202OGtub21tdS9rZXJuZWwvcHRyYWNlLmMKQEAgLTEwMSw3ICsxMDEsNyBAQAogCXB1dF9yZWcoY2hpbGQsIFBUX1NSLCB0bXApOwogfQogCi1sb25nIGFyY2hfcHRyYWNlKHRydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyByZXF1ZXN0LCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKK2xvbmcgYXJjaF9wdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyByZXF1ZXN0LCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKIHsKIAlpbnQgcmV0OwogCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL202OGtub21tdS9rZXJuZWwvc2lnbmFsLmMKaW5kZXggNDNhMjcyNi4uZTFiM2FhMyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zaWduYWwuYwpAQCAtMjg1LDYgKzI4NSw3IEBACiAJcmVncy0+ZDEgPSBjb250ZXh0LnNjX2QxOwogCXJlZ3MtPmEwID0gY29udGV4dC5zY19hMDsKIAlyZWdzLT5hMSA9IGNvbnRleHQuc2NfYTE7CisJKChzdHJ1Y3Qgc3dpdGNoX3N0YWNrICopcmVncyAtIDEpLT5hNSA9IGNvbnRleHQuc2NfYTU7CiAJcmVncy0+c3IgPSAocmVncy0+c3IgJiAweGZmMDApIHwgKGNvbnRleHQuc2Nfc3IgJiAweGZmKTsKIAlyZWdzLT5wYyA9IGNvbnRleHQuc2NfcGM7CiAJcmVncy0+b3JpZ19kMCA9IC0xOwkJLyogZGlzYWJsZSBzeXNjYWxsIGNoZWNrcyAqLwpAQCAtNDk4LDYgKzQ5OSw3IEBACiAJc2MtPnNjX2QxID0gcmVncy0+ZDE7CiAJc2MtPnNjX2EwID0gcmVncy0+YTA7CiAJc2MtPnNjX2ExID0gcmVncy0+YTE7CisJc2MtPnNjX2E1ID0gKChzdHJ1Y3Qgc3dpdGNoX3N0YWNrICopcmVncyAtIDEpLT5hNTsKIAlzYy0+c2Nfc3IgPSByZWdzLT5zcjsKIAlzYy0+c2NfcGMgPSByZWdzLT5wYzsKIAlzYy0+c2NfZm9ybWF0dmVjID0gcmVncy0+Zm9ybWF0IDw8IDEyIHwgcmVncy0+dmVjdG9yOwpAQCAtNTk3LDYgKzU5OSw5IEBACiAJLyogU2V0IHVwIHJlZ2lzdGVycyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KIAl3cnVzcCAoKHVuc2lnbmVkIGxvbmcpIGZyYW1lKTsKIAlyZWdzLT5wYyA9ICh1bnNpZ25lZCBsb25nKSBrYS0+c2Euc2FfaGFuZGxlcjsKKwkoKHN0cnVjdCBzd2l0Y2hfc3RhY2sgKilyZWdzIC0gMSktPmE1ID0gY3VycmVudC0+bW0tPnN0YXJ0X2RhdGE7CisJcmVncy0+Zm9ybWF0ID0gMHg0OyAvKnNldCBmb3JtYXQgYnl0ZSB0byBtYWtlIHN0YWNrIGFwcGVhciBtb2R1bG8gNCAKKwkJCQkJCXdoaWNoIGl0IHdpbGwgYmUgd2hlbiBkb2luZyB0aGUgcnRlICovCiAKIGFkanVzdF9zdGFjazoKIAkvKiBQcmVwYXJlIHRvIHNraXAgb3ZlciB0aGUgZXh0cmEgc3R1ZmYgaW4gdGhlIGV4Y2VwdGlvbiBmcmFtZS4gICovCkBAIC02NjQsNiArNjY5LDkgQEAKIAkvKiBTZXQgdXAgcmVnaXN0ZXJzIGZvciBzaWduYWwgaGFuZGxlciAqLwogCXdydXNwICgodW5zaWduZWQgbG9uZykgZnJhbWUpOwogCXJlZ3MtPnBjID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9oYW5kbGVyOworCSgoc3RydWN0IHN3aXRjaF9zdGFjayAqKXJlZ3MgLSAxKS0+YTUgPSBjdXJyZW50LT5tbS0+c3RhcnRfZGF0YTsKKwlyZWdzLT5mb3JtYXQgPSAweDQ7IC8qc2V0IGZvcm1hdCBieXRlIHRvIG1ha2Ugc3RhY2sgYXBwZWFyIG1vZHVsbyA0IAorCQkJCQkJd2hpY2ggaXQgd2lsbCBiZSB3aGVuIGRvaW5nIHRoZSBydGUgKi8KIAogYWRqdXN0X3N0YWNrOgogCS8qIFByZXBhcmUgdG8gc2tpcCBvdmVyIHRoZSBleHRyYSBzdHVmZiBpbiB0aGUgZXhjZXB0aW9uIGZyYW1lLiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggMGVhYjkyYy4uYWM5ZGUyNiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTEyOSw3ICsxMjksNyBAQAogICovCiAjaWYgZGVmaW5lZChDT05GSUdfTTUyMDhFVkIpCiAjZGVmaW5lCVJBTV9TVEFSVAkweDQwMDIwMDAwCi0jZGVmaW5lCVJBTV9MRU5HVEgJMHgwMWUwMDAwMAorI2RlZmluZQlSQU1fTEVOR1RICTB4MDFmZTAwMDAKICNlbmRpZgogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL0tjb25maWcgYi9hcmNoL21pcHMvS2NvbmZpZwppbmRleCBiNTBiZTQ0Li5jM2U4NTJlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvS2NvbmZpZworKysgYi9hcmNoL21pcHMvS2NvbmZpZwpAQCAtMTQ3MSw3ICsxNDcxLDcgQEAKIAogY29uZmlnIDY0QklUX1BIWVNfQUREUgogCWJvb2wgIlN1cHBvcnQgZm9yIDY0LWJpdCBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlIgotCWRlcGVuZHMgb24gKENQVV9SNFgwMCB8fCBDUFVfUjUwMDAgfHwgQ1BVX1JNNzAwMCB8fCBDUFVfUk05MDAwIHx8IENQVV9SMTAwMDAgfHwgQ1BVX1NCMSB8fCBDUFVfTUlQUzMyX1IxIHx8IENQVV9NSVBTNjRfUjEpICYmIDMyQklUCisJZGVwZW5kcyBvbiAoQ1BVX1I0WDAwIHx8IENQVV9SNTAwMCB8fCBDUFVfUk03MDAwIHx8IENQVV9STTkwMDAgfHwgQ1BVX1IxMDAwMCB8fCBDUFVfU0IxIHx8IENQVV9NSVBTMzIgfHwgQ1BVX01JUFM2NCkgJiYgMzJCSVQKIAogY29uZmlnIENQVV9BRFZBTkNFRAogCWJvb2wgIk92ZXJyaWRlIENQVSBPcHRpb25zIgpAQCAtMTQ5MiwxNCArMTQ5Miw2IEBACiAJICBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLCBOIGlmIHlvdSBkb24ndCBrbm93LiAgWW91IG11c3Qgc2F5IFkgaGVyZQogCSAgZm9yIG11bHRpcHJvY2Vzc29yIG1hY2hpbmVzLgogCi1jb25maWcgQ1BVX0hBU19MTERTQ0QKLQlib29sICJsbGQvc2NkIEluc3RydWN0aW9ucyBhdmFpbGFibGUiIGlmIENQVV9BRFZBTkNFRAotCWRlZmF1bHQgeSBpZiAhQ1BVX0FEVkFOQ0VEICYmICFDUFVfUjMwMDAgJiYgIUNQVV9WUjQxWFggJiYgIUNQVV9UWDM5WFggJiYgIUNQVV9NSVBTMzJfUjEKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdXIgQ1BVIGhhcyB0aGUgbGxkIGFuZCBzY2QgaW5zdHJ1Y3Rpb25zLCB0aGUgNjQtYml0Ci0JICBlcXVpdmFsZW50cyBvZiBsbCBhbmQgc2MuICBTYXkgWSBoZXJlIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UsIE4gaWYKLQkgIHlvdSBkb24ndCBrbm93LiAgWW91IG11c3Qgc2F5IFkgaGVyZSBmb3IgbXVsdGlwcm9jZXNzb3IgbWFjaGluZXMuCi0KIGNvbmZpZyBDUFVfSEFTX1dCCiAJYm9vbCAiV3JpdGViYWNrIEJ1ZmZlciBhdmFpbGFibGUiIGlmIENQVV9BRFZBTkNFRAogCWRlZmF1bHQgeSBpZiAhQ1BVX0FEVkFOQ0VEICYmIENQVV9SMzAwMCAmJiBNQUNIX0RFQ1NUQVRJT04KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9NYWtlZmlsZSBiL2FyY2gvbWlwcy9NYWtlZmlsZQppbmRleCBlMTRiYTVlLi4yYTlmMmVmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL01ha2VmaWxlCkBAIC05Myw3ICs5Myw2IEBACiAjCiBjZmxhZ3MteQkJCSs9IC1JICQoVE9QRElSKS9pbmNsdWRlL2FzbS9nY2MKIGNmbGFncy15CQkJKz0gLUcgMCAtbW5vLWFiaWNhbGxzIC1mbm8tcGljIC1waXBlCi1jZmxhZ3MteQkJCSs9ICQoY2FsbCBjYy1vcHRpb24sIC1maW5saW5lLWxpbWl0PTEwMDAwMCkKIExERkxBR1Nfdm1saW51eAkJCSs9IC1HIDAgLXN0YXRpYyAtbiAtbm9zdGRsaWIKIE1PREZMQUdTCQkJKz0gLW1sb25nLWNhbGxzCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2JpZ3N1cl9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9iaWdzdXJfZGVmY29uZmlnCmluZGV4IDA2OWY5ZDEuLjZmZDM1MzcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2JpZ3N1cl9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvYmlnc3VyX2RlZmNvbmZpZwpAQCAtMTMwLDcgKzEzMCw2IEBACiAjIENPTkZJR19TSUJZVEVfRE1BX1BBR0VPUFMgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19NVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX0hBU19MTFNDPXkKLUNPTkZJR19DUFVfSEFTX0xMRFNDRD15CiBDT05GSUdfQ1BVX0hBU19TWU5DPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9jb2JhbHRfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvY29iYWx0X2RlZmNvbmZpZwppbmRleCAyMTZmNDAyLi4xZDNlZTE4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9jb2JhbHRfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2NvYmFsdF9kZWZjb25maWcKQEAgLTExNSw3ICsxMTUsNiBAQAogIyBDT05GSUdfTUlQU19NVCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfQURWQU5DRUQgaXMgbm90IHNldAogQ09ORklHX0NQVV9IQVNfTExTQz15Ci1DT05GSUdfQ1BVX0hBU19MTERTQ0Q9eQogQ09ORklHX0NQVV9IQVNfU1lOQz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvZGRiNTQ3Nl9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9kZGI1NDc2X2RlZmNvbmZpZwppbmRleCBiZWEwMGE5Li5hODFlMmRlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9kZGI1NDc2X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9kZGI1NDc2X2RlZmNvbmZpZwpAQCAtMTE2LDcgKzExNiw2IEBACiAjIENPTkZJR19NSVBTX01UIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9BRFZBTkNFRCBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX0hBU19MTFNDPXkKLUNPTkZJR19DUFVfSEFTX0xMRFNDRD15CiBDT05GSUdfQ1BVX0hBU19TWU5DPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9kZGI1NDc3X2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2RkYjU0NzdfZGVmY29uZmlnCmluZGV4IDYxZjcxNzEuLmYxYzI3YzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2RkYjU0NzdfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2RkYjU0NzdfZGVmY29uZmlnCkBAIC0xMTYsNyArMTE2LDYgQEAKICMgQ09ORklHX01JUFNfTVQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfSEFTX0xMU0M9eQotQ09ORklHX0NQVV9IQVNfTExEU0NEPXkKIENPTkZJR19DUFVfSEFTX1NZTkM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2V2NjQxMjBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvZXY2NDEyMF9kZWZjb25maWcKaW5kZXggMTRlMzgxNS4uYWEyNGQ4NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZXY2NDEyMF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvZXY2NDEyMF9kZWZjb25maWcKQEAgLTExOCw3ICsxMTgsNiBAQAogIyBDT05GSUdfNjRCSVRfUEhZU19BRERSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9BRFZBTkNFRCBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX0hBU19MTFNDPXkKLUNPTkZJR19DUFVfSEFTX0xMRFNDRD15CiBDT05GSUdfQ1BVX0hBU19TWU5DPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9ldjk2MTAwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2V2OTYxMDBfZGVmY29uZmlnCmluZGV4IDUxMDgxOTUuLmVlZWQwZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2V2OTYxMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2V2OTYxMDBfZGVmY29uZmlnCkBAIC0xMjEsNyArMTIxLDYgQEAKICMgQ09ORklHXzY0QklUX1BIWVNfQUREUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfQURWQU5DRUQgaXMgbm90IHNldAogQ09ORklHX0NQVV9IQVNfTExTQz15Ci1DT05GSUdfQ1BVX0hBU19MTERTQ0Q9eQogQ09ORklHX0NQVV9IQVNfU1lOQz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvaXAyMl9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9pcDIyX2RlZmNvbmZpZwppbmRleCA2Nzk3OWUzLi5lNTYzNTFhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9pcDIyX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9pcDIyX2RlZmNvbmZpZwpAQCAtMTIzLDcgKzEyMyw2IEBACiAjIENPTkZJR182NEJJVF9QSFlTX0FERFIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfSEFTX0xMU0M9eQotQ09ORklHX0NQVV9IQVNfTExEU0NEPXkKIENPTkZJR19DUFVfSEFTX1NZTkM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2lwMjdfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvaXAyN19kZWZjb25maWcKaW5kZXggMDNhZjQ0ZC4uZTE3ZDNhZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvaXAyN19kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvaXAyN19kZWZjb25maWcKQEAgLTExOSw3ICsxMTksNiBAQAogQ09ORklHX0NQVV9IQVNfUFJFRkVUQ0g9eQogIyBDT05GSUdfTUlQU19NVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX0hBU19MTFNDPXkKLUNPTkZJR19DUFVfSEFTX0xMRFNDRD15CiBDT05GSUdfQ1BVX0hBU19TWU5DPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9pcDMyX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2lwMzJfZGVmY29uZmlnCmluZGV4IGNiYTJhNDkuLjk2N2U3YWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2lwMzJfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2lwMzJfZGVmY29uZmlnCkBAIC0xMjEsNyArMTIxLDYgQEAKIENPTkZJR19STTcwMDBfQ1BVX1NDQUNIRT15CiAjIENPTkZJR19NSVBTX01UIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfSEFTX0xMU0M9eQotQ09ORklHX0NQVV9IQVNfTExEU0NEPXkKIENPTkZJR19DUFVfSEFTX1NZTkM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2l0ODE3Ml9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9pdDgxNzJfZGVmY29uZmlnCmluZGV4IGU3ZWUxNjcuLmI1ZmE5NjMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2l0ODE3Ml9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvaXQ4MTcyX2RlZmNvbmZpZwpAQCAtMTE3LDcgKzExNyw2IEBACiAjIENPTkZJR19NSVBTX01UIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9BRFZBTkNFRCBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX0hBU19MTFNDPXkKLUNPTkZJR19DUFVfSEFTX0xMRFNDRD15CiBDT05GSUdfQ1BVX0hBU19TWU5DPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9pdnJfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvaXZyX2RlZmNvbmZpZwppbmRleCAxMzhjOGE2Li43MTM4NjkzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9pdnJfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2l2cl9kZWZjb25maWcKQEAgLTExNCw3ICsxMTQsNiBAQAogIyBDT05GSUdfTUlQU19NVCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfQURWQU5DRUQgaXMgbm90IHNldAogQ09ORklHX0NQVV9IQVNfTExTQz15Ci1DT05GSUdfQ1BVX0hBU19MTERTQ0Q9eQogQ09ORklHX0NQVV9IQVNfU1lOQz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvamFndWFyLWF0eF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9qYWd1YXItYXR4X2RlZmNvbmZpZwppbmRleCA2MjM4ZTBkLi4xNGZiNDY4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9qYWd1YXItYXR4X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9qYWd1YXItYXR4X2RlZmNvbmZpZwpAQCAtMTI0LDcgKzEyNCw2IEBACiAjIENPTkZJR182NEJJVF9QSFlTX0FERFIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfSEFTX0xMU0M9eQotQ09ORklHX0NQVV9IQVNfTExEU0NEPXkKIENPTkZJR19DUFVfSEFTX1NZTkM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2xhc2F0MjAwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2xhc2F0MjAwX2RlZmNvbmZpZwppbmRleCBhN2FkOTliLi42YzVkZjc2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9sYXNhdDIwMF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvbGFzYXQyMDBfZGVmY29uZmlnCkBAIC0xMjEsNyArMTIxLDYgQEAKICMgQ09ORklHXzY0QklUX1BIWVNfQUREUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfQURWQU5DRUQgaXMgbm90IHNldAogQ09ORklHX0NQVV9IQVNfTExTQz15Ci1DT05GSUdfQ1BVX0hBU19MTERTQ0Q9eQogQ09ORklHX0NQVV9IQVNfU1lOQz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFfZGVmY29uZmlnCmluZGV4IGQxYzQ0MjEuLmRhMDY3N2EgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL21hbHRhX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9tYWx0YV9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTUtcmMyCi0jIFRodSBOb3YgMjQgMDE6MDY6MzUgMjAwNQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE1LXJjNQorIyBGcmkgRGVjIDIzIDAyOjIxOjAzIDIwMDUKICMKIENPTkZJR19NSVBTPXkKIApAQCAtODcsOCArODcsOCBAQAogIwogIyBDUFUgc2VsZWN0aW9uCiAjCi1DT05GSUdfQ1BVX01JUFMzMl9SMT15Ci0jIENPTkZJR19DUFVfTUlQUzMyX1IyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9NSVBTMzJfUjEgaXMgbm90IHNldAorQ09ORklHX0NQVV9NSVBTMzJfUjI9eQogIyBDT05GSUdfQ1BVX01JUFM2NF9SMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfTUlQUzY0X1IyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9SMzAwMCBpcyBub3Qgc2V0CkBAIC0xMTIsNyArMTEyLDcgQEAKIENPTkZJR19TWVNfSEFTX0NQVV9ORVZBREE9eQogQ09ORklHX1NZU19IQVNfQ1BVX1JNNzAwMD15CiBDT05GSUdfQ1BVX01JUFMzMj15Ci1DT05GSUdfQ1BVX01JUFNSMT15CitDT05GSUdfQ1BVX01JUFNSMj15CiBDT05GSUdfU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTD15CiBDT05GSUdfU1lTX1NVUFBPUlRTXzY0QklUX0tFUk5FTD15CiBDT05GSUdfQ1BVX1NVUFBPUlRTXzMyQklUX0tFUk5FTD15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfM19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfM19kZWZjb25maWcKaW5kZXggOTA4MWVhNS4uN2FkODcxOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90XzNfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL29jZWxvdF8zX2RlZmNvbmZpZwpAQCAtMTIyLDcgKzEyMiw2IEBACiAjIENPTkZJR182NEJJVF9QSFlTX0FERFIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfSEFTX0xMU0M9eQotQ09ORklHX0NQVV9IQVNfTExEU0NEPXkKIENPTkZJR19DUFVfSEFTX1NZTkM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL29jZWxvdF9jX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL29jZWxvdF9jX2RlZmNvbmZpZwppbmRleCA1NzBmYzRkLi5lOGQ2YmIzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfY19kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90X2NfZGVmY29uZmlnCkBAIC0xMTgsNyArMTE4LDYgQEAKIENPTkZJR19DUFVfSEFTX1BSRUZFVENIPXkKICMgQ09ORklHX01JUFNfTVQgaXMgbm90IHNldAogQ09ORklHX0NQVV9IQVNfTExTQz15Ci1DT05GSUdfQ1BVX0hBU19MTERTQ0Q9eQogQ09ORklHX0NQVV9IQVNfU1lOQz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90X2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL29jZWxvdF9kZWZjb25maWcKaW5kZXggNjYzNGFiMi4uZjM3ODdiNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfZGVmY29uZmlnCkBAIC0xMjMsNyArMTIzLDYgQEAKICMgQ09ORklHXzY0QklUX1BIWVNfQUREUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfQURWQU5DRUQgaXMgbm90IHNldAogQ09ORklHX0NQVV9IQVNfTExTQz15Ci1DT05GSUdfQ1BVX0hBU19MTERTQ0Q9eQogQ09ORklHX0NQVV9IQVNfU1lOQz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90X2dfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90X2dfZGVmY29uZmlnCmluZGV4IDRjMzk2ZTEuLmI2MTI2YWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL29jZWxvdF9nX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfZ19kZWZjb25maWcKQEAgLTEyMSw3ICsxMjEsNiBAQAogQ09ORklHX0NQVV9IQVNfUFJFRkVUQ0g9eQogIyBDT05GSUdfTUlQU19NVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX0hBU19MTFNDPXkKLUNPTkZJR19DUFVfSEFTX0xMRFNDRD15CiBDT05GSUdfQ1BVX0hBU19TWU5DPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9wbng4NTUwLXYycGNpX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3BueDg1NTAtdjJwY2lfZGVmY29uZmlnCmluZGV4IGQ5YTBkMmYuLjRjNjUwZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3BueDg1NTAtdjJwY2lfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL3BueDg1NTAtdjJwY2lfZGVmY29uZmlnCkBAIC0xMTYsNyArMTE2LDYgQEAKICMgQ09ORklHXzY0QklUX1BIWVNfQUREUiBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX0FEVkFOQ0VEPXkKIENPTkZJR19DUFVfSEFTX0xMU0M9eQotIyBDT05GSUdfQ1BVX0hBU19MTERTQ0QgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX0hBU19XQiBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX0hBU19TWU5DPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL3JiaG1hNDUwMF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9yYmhtYTQ1MDBfZGVmY29uZmlnCmluZGV4IDFjYzE0NTAuLjlhYWE0MzAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3JiaG1hNDUwMF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvcmJobWE0NTAwX2RlZmNvbmZpZwpAQCAtMTI0LDcgKzEyNCw2IEBACiAjIENPTkZJR19NSVBTX01UIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfQURWQU5DRUQ9eQogQ09ORklHX0NQVV9IQVNfTExTQz15Ci1DT05GSUdfQ1BVX0hBU19MTERTQ0Q9eQogQ09ORklHX0NQVV9IQVNfV0I9eQogQ09ORklHX0NQVV9IQVNfU1lOQz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9ybTIwMF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9ybTIwMF9kZWZjb25maWcKaW5kZXggMzA5NzViMy4uYWJmNjEwOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3Mvcm0yMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL3JtMjAwX2RlZmNvbmZpZwpAQCAtMTI0LDcgKzEyNCw2IEBACiAjIENPTkZJR182NEJJVF9QSFlTX0FERFIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfSEFTX0xMU0M9eQotQ09ORklHX0NQVV9IQVNfTExEU0NEPXkKIENPTkZJR19DUFVfSEFTX1NZTkM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL3NiMTI1MC1zd2FybV9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9zYjEyNTAtc3dhcm1fZGVmY29uZmlnCmluZGV4IDYzZjFiZTEuLjUyMDQ4YzkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3NiMTI1MC1zd2FybV9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3Mvc2IxMjUwLXN3YXJtX2RlZmNvbmZpZwpAQCAtMTMzLDcgKzEzMyw2IEBACiAjIENPTkZJR19NSVBTX01UIGlzIG5vdCBzZXQKIENPTkZJR19TQjFfUEFTU18xX1dPUktBUk9VTkRTPXkKIENPTkZJR19DUFVfSEFTX0xMU0M9eQotQ09ORklHX0NQVV9IQVNfTExEU0NEPXkKIENPTkZJR19DUFVfSEFTX1NZTkM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL3lvc2VtaXRlX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3lvc2VtaXRlX2RlZmNvbmZpZwppbmRleCBkNTFkNWQxLi40NjhjMmU0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy95b3NlbWl0ZV9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MveW9zZW1pdGVfZGVmY29uZmlnCkBAIC0xMTgsNyArMTE4LDYgQEAKICMgQ09ORklHXzY0QklUX1BIWVNfQUREUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfQURWQU5DRUQgaXMgbm90IHNldAogQ09ORklHX0NQVV9IQVNfTExTQz15Ci1DT05GSUdfQ1BVX0hBU19MTERTQ0Q9eQogQ09ORklHX0NQVV9IQVNfU1lOQz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9kZWZjb25maWcKaW5kZXggMmExYjg0NC4uNGYxMjVlOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvZGVmY29uZmlnCkBAIC0xMjMsNyArMTIzLDYgQEAKICMgQ09ORklHXzY0QklUX1BIWVNfQUREUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfQURWQU5DRUQgaXMgbm90IHNldAogQ09ORklHX0NQVV9IQVNfTExTQz15Ci1DT05GSUdfQ1BVX0hBU19MTERTQ0Q9eQogQ09ORklHX0NQVV9IQVNfU1lOQz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvbWlwcy9rZXJuZWwvTWFrZWZpbGUKaW5kZXggNzJmMjEyNi4uZjM2YzRmMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMva2VybmVsL01ha2VmaWxlCkBAIC01MCw3ICs1MCw3IEBACiBvYmotJChDT05GSUdfMzJCSVQpCQkrPSBzY2FsbDMyLW8zMi5vCiBvYmotJChDT05GSUdfNjRCSVQpCQkrPSBzY2FsbDY0LTY0Lm8KIG9iai0kKENPTkZJR19CSU5GTVRfSVJJWCkJKz0gYmluZm10X2lyaXgubwotb2JqLSQoQ09ORklHX01JUFMzMl9DT01QQVQpCSs9IGlvY3RsMzIubyBsaW51eDMyLm8gc2lnbmFsMzIubworb2JqLSQoQ09ORklHX01JUFMzMl9DT01QQVQpCSs9IGxpbnV4MzIubyBzaWduYWwzMi5vCiBvYmotJChDT05GSUdfTUlQUzMyX04zMikJKz0gYmluZm10X2VsZm4zMi5vIHNjYWxsNjQtbjMyLm8gc2lnbmFsX24zMi5vCiBvYmotJChDT05GSUdfTUlQUzMyX08zMikJKz0gYmluZm10X2VsZm8zMi5vIHNjYWxsNjQtbzMyLm8gcHRyYWNlMzIubwogCkBAIC02MCw2ICs2MCw1IEBACiBvYmotJChDT05GSUdfNjRCSVQpCQkrPSBjcHUtYnVnczY0Lm8KIAogQ0ZMQUdTX2NwdS1idWdzNjQubwk9ICQoc2hlbGwgaWYgJChDQykgJChDRkxBR1MpIC1XYSwtbWRhZGRpIC1jIC1vIC9kZXYvbnVsbCAteGMgL2Rldi9udWxsID4vZGV2L251bGwgMj4mMTsgdGhlbiBlY2hvICItREhBVkVfQVNfU0VUX0RBRERJIjsgZmkpCi1DRkxBR1NfaW9jdGwzMi5vCSs9IC1JZnMvCiAKIEVYVFJBX0FGTEFHUyA6PSAkKENGTEFHUykKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMgYi9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jCmluZGV4IDVlMWIwOGIuLmZhYzQ4YWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYwpAQCAtNDM1LDYgKzQzNSw5IEBACiAJfQogfQogCitzdGF0aWMgY2hhciB1bmtub3duX2lzYVtdIF9faW5pdGRhdGEgPSBLRVJOX0VSUiBcCisJIlVuc3VwcG9ydGVkIElTQSB0eXBlLCBjMC5jb25maWcwOiAlZC4iOworCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBkZWNvZGVfY29uZmlnMChzdHJ1Y3QgY3B1aW5mb19taXBzICpjKQogewogCXVuc2lnbmVkIGludCBjb25maWcwOwpAQCAtNDQ3LDE2ICs0NTAsMzcgQEAKIAlpc2EgPSAoY29uZmlnMCAmIE1JUFNfQ09ORl9BVCkgPj4gMTM7CiAJc3dpdGNoIChpc2EpIHsKIAljYXNlIDA6Ci0JCWMtPmlzYV9sZXZlbCA9IE1JUFNfQ1BVX0lTQV9NMzI7CisJCXN3aXRjaCAoKGNvbmZpZzAgPj4gMTApICYgNykgeworCQljYXNlIDA6CisJCQljLT5pc2FfbGV2ZWwgPSBNSVBTX0NQVV9JU0FfTTMyUjE7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJYy0+aXNhX2xldmVsID0gTUlQU19DUFVfSVNBX00zMlIyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIHVua25vd247CisJCX0KIAkJYnJlYWs7CiAJY2FzZSAyOgotCQljLT5pc2FfbGV2ZWwgPSBNSVBTX0NQVV9JU0FfTTY0OworCQlzd2l0Y2ggKChjb25maWcwID4+IDEwKSAmIDcpIHsKKwkJY2FzZSAwOgorCQkJYy0+aXNhX2xldmVsID0gTUlQU19DUFVfSVNBX002NFIxOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWMtPmlzYV9sZXZlbCA9IE1JUFNfQ1BVX0lTQV9NNjRSMjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byB1bmtub3duOworCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXBhbmljKCJVbnN1cHBvcnRlZCBJU0EgdHlwZSwgY3AwLmNvbmZpZzAuYXQ6ICVkLiIsIGlzYSk7CisJCWdvdG8gdW5rbm93bjsKIAl9CiAKIAlyZXR1cm4gY29uZmlnMCAmIE1JUFNfQ09ORl9NOworCit1bmtub3duOgorCXBhbmljKHVua25vd25faXNhLCBjb25maWcwKTsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZGVjb2RlX2NvbmZpZzEoc3RydWN0IGNwdWluZm9fbWlwcyAqYykKQEAgLTU2OCw3ICs1OTIsNiBAQAogCQlicmVhazsKIAljYXNlIFBSSURfSU1QXzM0SzoKIAkJYy0+Y3B1dHlwZSA9IENQVV8zNEs7Ci0JCWMtPmlzYV9sZXZlbCA9IE1JUFNfQ1BVX0lTQV9NMzI7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTY0Nyw3ICs2NzAsNyBAQAogCXN3aXRjaCAoYy0+cHJvY2Vzc29yX2lkICYgMHhmZjAwKSB7CiAJY2FzZSBQUklEX0lNUF9QUjQ0NTA6CiAJCWMtPmNwdXR5cGUgPSBDUFVfUFI0NDUwOwotCQljLT5pc2FfbGV2ZWwgPSBNSVBTX0NQVV9JU0FfTTMyOworCQljLT5pc2FfbGV2ZWwgPSBNSVBTX0NQVV9JU0FfTTMyUjE7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXBhbmljKCJVbmtub3duIFBoaWxpcHMgQ29yZSEiKTsgLyogUkVWSVNJVDogZGllPyAqLwpAQCAtNjkwLDggKzcxMywxMCBAQAogCWlmIChjLT5vcHRpb25zICYgTUlQU19DUFVfRlBVKSB7CiAJCWMtPmZwdV9pZCA9IGNwdV9nZXRfZnB1X2lkKCk7CiAKLQkJaWYgKGMtPmlzYV9sZXZlbCA9PSBNSVBTX0NQVV9JU0FfTTMyIHx8Ci0JCSAgICBjLT5pc2FfbGV2ZWwgPT0gTUlQU19DUFVfSVNBX002NCkgeworCQlpZiAoYy0+aXNhX2xldmVsID09IE1JUFNfQ1BVX0lTQV9NMzJSMSB8fAorCQkgICAgYy0+aXNhX2xldmVsID09IE1JUFNfQ1BVX0lTQV9NMzJSMiB8fAorCQkgICAgYy0+aXNhX2xldmVsID09IE1JUFNfQ1BVX0lTQV9NNjRSMSB8fAorCQkgICAgYy0+aXNhX2xldmVsID09IE1JUFNfQ1BVX0lTQV9NNjRSMikgewogCQkJaWYgKGMtPmZwdV9pZCAmIE1JUFNfRlBJUl8zRCkKIAkJCQljLT5hc2VzIHw9IE1JUFNfQVNFX01JUFMzRDsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9pb2N0bDMyLmMgYi9hcmNoL21pcHMva2VybmVsL2lvY3RsMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVhMWZjNy4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMva2VybmVsL2lvY3RsMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBpb2N0bDMyLmM6IENvbnZlcnNpb24gYmV0d2VlbiAzMmJpdCBhbmQgNjRiaXQgbmF0aXZlIGlvY3Rscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgotICogV3JpdHRlbiBieSBVbGYgQ2FybHNzb24gKHVsZmNAZW5nci5zZ2kuY29tKQotICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDA0IFJhbGYgQmFlY2hsZQotICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBNYWNpZWogVy4gUm96eWNraQotICovCi0jZGVmaW5lIElOQ0xVREVTCi0jaW5jbHVkZSAiY29tcGF0X2lvY3RsLmMiCi0KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvY3RsMzIuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgotCi0jaWZkZWYgQ09ORklHX1NJQllURV9UQlBST0YKLSNpbmNsdWRlIDxhc20vc2lieXRlL3RyYWNlX3Byb2YuaD4KLSNlbmRpZgotCi0jZGVmaW5lIEEoX194KSAoKHVuc2lnbmVkIGxvbmcpKF9feCkpCi0KLWxvbmcgc3lzX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotCi0jZGVmaW5lIENPREUKLSNpbmNsdWRlICJjb21wYXRfaW9jdGwuYyIKLQotI2RlZmluZSBDT01QQVRJQkxFX0lPQ1RMKGNtZCkJCUhBTkRMRV9JT0NUTCgoY21kKSxzeXNfaW9jdGwpCi0jZGVmaW5lIEhBTkRMRV9JT0NUTChjbWQsaGFuZGxlcikJeyAoY21kKSwgKGlvY3RsX3RyYW5zX2hhbmRsZXJfdCkoaGFuZGxlciksIE5VTEwgfSwKLSNkZWZpbmUgSU9DVExfVEFCTEVfU1RBUlQgXAotCXN0cnVjdCBpb2N0bF90cmFucyBpb2N0bF9zdGFydFtdID0gewotI2RlZmluZSBJT0NUTF9UQUJMRV9FTkQgXAotCX07Ci0KLUlPQ1RMX1RBQkxFX1NUQVJUCi0KLSNpbmNsdWRlIDxsaW51eC9jb21wYXRfaW9jdGwuaD4KLSNkZWZpbmUgREVDTEFSRVMKLSNpbmNsdWRlICJjb21wYXRfaW9jdGwuYyIKLQotLypIQU5ETEVfSU9DVEwoUlRDX0lSUVBfUkVBRCwgd19sb25nKQotQ09NUEFUSUJMRV9JT0NUTChSVENfSVJRUF9TRVQpCi1IQU5ETEVfSU9DVEwoUlRDX0VQT0NIX1JFQUQsIHdfbG9uZykKLUNPTVBBVElCTEVfSU9DVEwoUlRDX0VQT0NIX1NFVCkKLSovCi0KLUlPQ1RMX1RBQkxFX0VORAotCi1pbnQgaW9jdGxfdGFibGVfc2l6ZSA9IEFSUkFZX1NJWkUoaW9jdGxfc3RhcnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYwppbmRleCBkZDcyNTc3Li5mYTk4ZjEwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYwpAQCAtMTQwLDEyICsxNDAsMTIgQEAKIGludCBjb3B5X3RocmVhZChpbnQgbnIsIHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgdXNwLAogCXVuc2lnbmVkIGxvbmcgdW51c2VkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSBwLT50aHJlYWRfaW5mbzsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gdGFza190aHJlYWRfaW5mbyhwKTsKIAlzdHJ1Y3QgcHRfcmVncyAqY2hpbGRyZWdzOwogCWxvbmcgY2hpbGRrc3A7CiAJcC0+c2V0X2NoaWxkX3RpZCA9IHAtPmNsZWFyX2NoaWxkX3RpZCA9IE5VTEw7CiAKLQljaGlsZGtzcCA9ICh1bnNpZ25lZCBsb25nKXRpICsgVEhSRUFEX1NJWkUgLSAzMjsKKwljaGlsZGtzcCA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShwKSArIFRIUkVBRF9TSVpFIC0gMzI7CiAKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIApAQCAtMjA1LDcgKzIwNSw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXZvaWQgZHVtcF9yZWdzKGVsZl9ncmVnX3QgKmdwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3ZvaWQgZWxmX2R1bXBfcmVncyhlbGZfZ3JlZ190ICpncCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaW50IGk7CiAKQEAgLTIyOSw5ICsyMjksNyBAQAogCiBpbnQgZHVtcF90YXNrX3JlZ3MgKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBlbGZfZ3JlZ3NldF90ICpyZWdzKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSB0c2stPnRocmVhZF9pbmZvOwotCWxvbmcga3NwID0gKHVuc2lnbmVkIGxvbmcpdGkgKyBUSFJFQURfU0laRSAtIDMyOwotCWR1bXBfcmVncygmKCpyZWdzKVswXSwgKHN0cnVjdCBwdF9yZWdzICopIGtzcCAtIDEpOworCWVsZl9kdW1wX3JlZ3MoKnJlZ3MsIHRhc2tfcHRfcmVncyh0c2spKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtNDA5LDcgKzQwNyw3IEBACiAJaWYgKCFwIHx8IHAgPT0gY3VycmVudCB8fCBwLT5zdGF0ZSA9PSBUQVNLX1JVTk5JTkcpCiAJCXJldHVybiAwOwogCi0Jc3RhY2tfcGFnZSA9ICh1bnNpZ25lZCBsb25nKXAtPnRocmVhZF9pbmZvOworCXN0YWNrX3BhZ2UgPSAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UocCk7CiAJaWYgKCFzdGFja19wYWdlIHx8ICFtaXBzX2ZyYW1lX2luZm9faW5pdGlhbGl6ZWQpCiAJCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYwppbmRleCA1MTBkYTVmLi5mODM4YjM2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlLmMKQEAgLTY0LDggKzY0LDcgQEAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRhdGEsIDM4ICogOCkpCiAJCXJldHVybiAtRUlPOwogCi0JcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSAoKHVuc2lnbmVkIGxvbmcpIGNoaWxkLT50aHJlYWRfaW5mbyArCi0JICAgICAgIFRIUkVBRF9TSVpFIC0gMzIgLSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsKKwlyZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAogCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQogCQlfX3B1dF91c2VyIChyZWdzLT5yZWdzW2ldLCBkYXRhICsgaSk7CkBAIC05Miw4ICs5MSw3IEBACiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGRhdGEsIDM4ICogOCkpCiAJCXJldHVybiAtRUlPOwogCi0JcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSAoKHVuc2lnbmVkIGxvbmcpIGNoaWxkLT50aHJlYWRfaW5mbyArCi0JICAgICAgIFRIUkVBRF9TSVpFIC0gMzIgLSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsKKwlyZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAogCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQogCQlfX2dldF91c2VyIChyZWdzLT5yZWdzW2ldLCBkYXRhICsgaSk7CkBAIC0xOTgsOCArMTk2LDcgQEAKIAkJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CiAJCXVuc2lnbmVkIGxvbmcgdG1wID0gMDsKIAotCQlyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopICgodW5zaWduZWQgbG9uZykgY2hpbGQtPnRocmVhZF9pbmZvICsKLQkJICAgICAgIFRIUkVBRF9TSVpFIC0gMzIgLSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsKKwkJcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CiAJCXJldCA9IDA7ICAvKiBEZWZhdWx0IHJldHVybiB2YWx1ZS4gKi8KIAogCQlzd2l0Y2ggKGFkZHIpIHsKQEAgLTI4MCwxMiArMjc3LDggQEAKIAkJCQlyZXQgPSAtRUlPOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQkJaWYgKGNoaWxkLT50aHJlYWQuZHNwLnVzZWRfZHNwKSB7Ci0JCQkJZHJlZ3MgPSBfX2dldF9kc3BfcmVncyhjaGlsZCk7Ci0JCQkJdG1wID0gKHVuc2lnbmVkIGxvbmcpIChkcmVnc1thZGRyIC0gRFNQX0JBU0VdKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdG1wID0gLTE7CS8qIERTUCByZWdpc3RlcnMgeWV0IHVzZWQgICovCi0JCQl9CisJCQlkcmVncyA9IF9fZ2V0X2RzcF9yZWdzKGNoaWxkKTsKKwkJCXRtcCA9ICh1bnNpZ25lZCBsb25nKSAoZHJlZ3NbYWRkciAtIERTUF9CQVNFXSk7CiAJCQlicmVhazsKIAkJfQogCQljYXNlIERTUF9DT05UUk9MOgpAQCAtMzE4LDggKzMxMSw3IEBACiAJY2FzZSBQVFJBQ0VfUE9LRVVTUjogewogCQlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKIAkJcmV0ID0gMDsKLQkJcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSAoKHVuc2lnbmVkIGxvbmcpIGNoaWxkLT50aHJlYWRfaW5mbyArCi0JCSAgICAgICBUSFJFQURfU0laRSAtIDMyIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CisJCXJlZ3MgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwogCiAJCXN3aXRjaCAoYWRkcikgewogCQljYXNlIDAgLi4uIDMxOgpAQCAtNDQ2LDcgKzQzOCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBQVFJBQ0VfR0VUX1RIUkVBRF9BUkVBOgotCQlyZXQgPSBwdXRfdXNlcihjaGlsZC0+dGhyZWFkX2luZm8tPnRwX3ZhbHVlLAorCQlyZXQgPSBwdXRfdXNlcih0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+dHBfdmFsdWUsCiAJCQkJKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGRhdGEpOwogCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UzMi5jIGIvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UzMi5jCmluZGV4IDlhOWIwNDkuLjBjODJiMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlMzIuYworKysgYi9hcmNoL21pcHMva2VybmVsL3B0cmFjZTMyLmMKQEAgLTU3LDMwICs1NywxNiBAQAogCSAgICAgICAodW5zaWduZWQgbG9uZykgZGF0YSk7CiAjZW5kaWYKIAlsb2NrX2tlcm5lbCgpOwotCXJldCA9IC1FUEVSTTsKIAlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfVFJBQ0VNRSkgewotCQkvKiBhcmUgd2UgYWxyZWFkeSBiZWluZyB0cmFjZWQ/ICovCi0JCWlmIChjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKQotCQkJZ290byBvdXQ7Ci0JCWlmICgocmV0ID0gc2VjdXJpdHlfcHRyYWNlKGN1cnJlbnQtPnBhcmVudCwgY3VycmVudCkpKQotCQkJZ290byBvdXQ7Ci0JCS8qIHNldCB0aGUgcHRyYWNlIGJpdCBpbiB0aGUgcHJvY2VzcyBmbGFncy4gKi8KLQkJY3VycmVudC0+cHRyYWNlIHw9IFBUX1BUUkFDRUQ7Ci0JCXJldCA9IDA7CisJCXJldCA9IHB0cmFjZV90cmFjZW1lKCk7CiAJCWdvdG8gb3V0OwogCX0KLQlyZXQgPSAtRVNSQ0g7Ci0JcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQljaGlsZCA9IGZpbmRfdGFza19ieV9waWQocGlkKTsKLQlpZiAoY2hpbGQpCi0JCWdldF90YXNrX3N0cnVjdChjaGlsZCk7Ci0JcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotCWlmICghY2hpbGQpCi0JCWdvdG8gb3V0OwogCi0JcmV0ID0gLUVQRVJNOwotCWlmIChwaWQgPT0gMSkJCS8qIHlvdSBtYXkgbm90IG1lc3Mgd2l0aCBpbml0ICovCi0JCWdvdG8gb3V0X3RzazsKKwljaGlsZCA9IHB0cmFjZV9nZXRfdGFza19zdHJ1Y3QocGlkKTsKKwlpZiAoSVNfRVJSKGNoaWxkKSkgeworCQlyZXQgPSBQVFJfRVJSKGNoaWxkKTsKKwkJZ290byBvdXQ7CisJfQogCiAJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX0FUVEFDSCkgewogCQlyZXQgPSBwdHJhY2VfYXR0YWNoKGNoaWxkKTsKQEAgLTE0MCw4ICsxMjYsNyBAQAogCQlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKIAkJdW5zaWduZWQgaW50IHRtcDsKIAotCQlyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopICgodW5zaWduZWQgbG9uZykgY2hpbGQtPnRocmVhZF9pbmZvICsKLQkJICAgICAgIFRIUkVBRF9TSVpFIC0gMzIgLSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsKKwkJcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CiAJCXJldCA9IDA7ICAvKiBEZWZhdWx0IHJldHVybiB2YWx1ZS4gKi8KIAogCQlzd2l0Y2ggKGFkZHIpIHsKQEAgLTIxNSwxMiArMjAwLDggQEAKIAkJCQlyZXQgPSAtRUlPOwogCQkJCWdvdG8gb3V0X3RzazsKIAkJCX0KLQkJCWlmIChjaGlsZC0+dGhyZWFkLmRzcC51c2VkX2RzcCkgewotCQkJCWRzcHJlZ190ICpkcmVncyA9IF9fZ2V0X2RzcF9yZWdzKGNoaWxkKTsKLQkJCQl0bXAgPSAodW5zaWduZWQgbG9uZykgKGRyZWdzW2FkZHIgLSBEU1BfQkFTRV0pOwotCQkJfSBlbHNlIHsKLQkJCQl0bXAgPSAtMTsJLyogRFNQIHJlZ2lzdGVycyB5ZXQgdXNlZCAgKi8KLQkJCX0KKwkJCWRzcHJlZ190ICpkcmVncyA9IF9fZ2V0X2RzcF9yZWdzKGNoaWxkKTsKKwkJCXRtcCA9ICh1bnNpZ25lZCBsb25nKSAoZHJlZ3NbYWRkciAtIERTUF9CQVNFXSk7CiAJCQlicmVhazsKIAkJY2FzZSBEU1BfQ09OVFJPTDoKIAkJCWlmICghY3B1X2hhc19kc3ApIHsKQEAgLTI3Nyw4ICsyNTgsNyBAQAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6IHsKIAkJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CiAJCXJldCA9IDA7Ci0JCXJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgKCh1bnNpZ25lZCBsb25nKSBjaGlsZC0+dGhyZWFkX2luZm8gKwotCQkgICAgICAgVEhSRUFEX1NJWkUgLSAzMiAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOworCQlyZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAogCQlzd2l0Y2ggKGFkZHIpIHsKIAkJY2FzZSAwIC4uLiAzMToKQEAgLTM5NSw3ICszNzUsNyBAQAogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX0dFVF9USFJFQURfQVJFQToKLQkJcmV0ID0gcHV0X3VzZXIoY2hpbGQtPnRocmVhZF9pbmZvLT50cF92YWx1ZSwKKwkJcmV0ID0gcHV0X3VzZXIodGFza190aHJlYWRfaW5mbyhjaGlsZCktPnRwX3ZhbHVlLAogCQkJCSh1bnNpZ25lZCBpbnQgX191c2VyICopICh1bnNpZ25lZCBsb25nKSBkYXRhKTsKIAkJYnJlYWs7CiAKQEAgLTQwOSw3ICszODksNyBAQAogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX0dFVF9USFJFQURfQVJFQV8zMjY0OgotCQlyZXQgPSBwdXRfdXNlcihjaGlsZC0+dGhyZWFkX2luZm8tPnRwX3ZhbHVlLAorCQlyZXQgPSBwdXRfdXNlcih0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+dHBfdmFsdWUsCiAJCQkJKHVuc2lnbmVkIGxvbmcgX191c2VyICopICh1bnNpZ25lZCBsb25nKSBkYXRhKTsKIAkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcmVzZXQuYyBiL2FyY2gvbWlwcy9rZXJuZWwvcmVzZXQuYwppbmRleCBhZTJiYTY3Li41ZTM3ZGYzMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9yZXNldC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcmVzZXQuYwpAQCAtMTIsNiArMTIsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KIAordm9pZCAoKnBtX3Bvd2VyX29mZikodm9pZCk7CitFWFBPUlRfU1lNQk9MKHBtX3Bvd2VyX29mZik7CisKIC8qCiAgKiBVcmdzIC4uLiAgVG9vIG1hbnkgTUlQUyBtYWNoaW5lcyB0byBoYW5kbGUgdGhpcyBpbiBhIGdlbmVyaWMgd2F5LgogICogU28gaGFuZGxlIGFsbCB1c2luZyBmdW5jdGlvbiBwb2ludGVycyB0byBtYWNoaW5lIHNwZWNpZmljCkBAIC0zMyw2ICszNiw5IEBACiAKIHZvaWQgbWFjaGluZV9wb3dlcl9vZmYodm9pZCkKIHsKKwlpZiAocG1fcG93ZXJfb2ZmKQorCQlwbV9wb3dlcl9vZmYoKTsKKwogCV9tYWNoaW5lX3Bvd2VyX29mZigpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NpZ25hbDMyLmMgYi9hcmNoL21pcHMva2VybmVsL3NpZ25hbDMyLmMKaW5kZXggYzg1NmRiYy4uOThiMTg1YiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zaWduYWwzMi5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2lnbmFsMzIuYwpAQCAtNTg4LDcgKzU4OCw3IEBACiAJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+aGksICZzYy0+c2NfbWRoaSk7CiAJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+bG8sICZzYy0+c2NfbWRsbyk7CiAJaWYgKGNwdV9oYXNfZHNwKSB7Ci0JCWVyciB8PSBfX3B1dF91c2VyKHJkZHNwKERTUF9NQVNLKSwgJnNjLT5zY19oaTEpOworCQllcnIgfD0gX19wdXRfdXNlcihyZGRzcChEU1BfTUFTSyksICZzYy0+c2NfZHNwKTsKIAkJZXJyIHw9IF9fcHV0X3VzZXIobWZoaTEoKSwgJnNjLT5zY19oaTEpOwogCQllcnIgfD0gX19wdXRfdXNlcihtZmxvMSgpLCAmc2MtPnNjX2xvMSk7CiAJCWVyciB8PSBfX3B1dF91c2VyKG1maGkyKCksICZzYy0+c2NfaGkyKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc21wX210LmMgYi9hcmNoL21pcHMva2VybmVsL3NtcF9tdC5jCmluZGV4IGQ0Mjk1NDQuLjc5NGExYzMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc21wX210LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zbXBfbXQuYwpAQCAtMjg3LDYgKzI4Nyw3IEBACiAgKi8KIHZvaWQgcHJvbV9ib290X3NlY29uZGFyeShpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpCiB7CisJc3RydWN0IHRocmVhZF9pbmZvICpncCA9IHRhc2tfdGhyZWFkX2luZm8oaWRsZSk7CiAJZHZwZSgpOwogCXNldF9jMF9tdnBjb250cm9sKE1WUENPTlRST0xfVlBDKTsKIApAQCAtMzA3LDExICszMDgsOSBAQAogCXdyaXRlX3RjX2dwcl9zcCggX19LU1RLX1RPUyhpZGxlKSk7CiAKIAkvKiBnbG9iYWwgcG9pbnRlciAqLwotCXdyaXRlX3RjX2dwcl9ncCgodW5zaWduZWQgbG9uZylpZGxlLT50aHJlYWRfaW5mbyk7CisJd3JpdGVfdGNfZ3ByX2dwKCh1bnNpZ25lZCBsb25nKWdwKTsKIAotCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylpZGxlLT50aHJlYWRfaW5mbywKLQkJCQkJICAgKHVuc2lnbmVkIGxvbmcpaWRsZS0+dGhyZWFkX2luZm8gKwotCQkJCQkgICBzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSk7CisJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWdwLCAodW5zaWduZWQgbG9uZykoZ3AgKyAxKSk7CiAKIAkvKiBmaW5hbGx5IG91dCBvZiBjb25maWd1cmF0aW9uIGFuZCBpbnRvIGNoYW9zICovCiAJY2xlYXJfYzBfbXZwY29udHJvbChNVlBDT05UUk9MX1ZQQyk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc3lzY2FsbC5jCmluZGV4IGVlOThlZWIuLjMzMjM1ODQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc3lzY2FsbC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc3lzY2FsbC5jCkBAIC05LDYgKzksNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvYS5vdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KQEAgLTI2Miw3ICsyNjMsNyBAQAogCiB2b2lkIHN5c19zZXRfdGhyZWFkX2FyZWEodW5zaWduZWQgbG9uZyBhZGRyKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSBjdXJyZW50LT50aHJlYWRfaW5mbzsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gdGFza190aHJlYWRfaW5mbyhjdXJyZW50KTsKIAogCXRpLT50cF92YWx1ZSA9IGFkZHI7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc3lzaXJpeC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zeXNpcml4LmMKaW5kZXggNTI5MjRmOC4uMGZjMzczMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zeXNpcml4LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zeXNpcml4LmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdGltZS5jIGIvYXJjaC9taXBzL2tlcm5lbC90aW1lLmMKaW5kZXggNzg3ZWQ1NC4uNzA1MGI0ZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC90aW1lLmMKQEAgLTUwNywxNCArNTA3LDM4IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitpbnQgbnVsbF9wZXJmX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZXR1cm4gMDsKK30KKworaW50ICgqcGVyZl9pcnEpKHN0cnVjdCBwdF9yZWdzICpyZWdzKSA9IG51bGxfcGVyZl9pcnE7CisKK0VYUE9SVF9TWU1CT0wobnVsbF9wZXJmX2lycSk7CitFWFBPUlRfU1lNQk9MKHBlcmZfaXJxKTsKKwogYXNtbGlua2FnZSB2b2lkIGxsX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKKwlpbnQgcjIgPSBjcHVfaGFzX21pcHNfcjI7CisKIAlpcnFfZW50ZXIoKTsKIAlrc3RhdF90aGlzX2NwdS5pcnFzW2lycV0rKzsKIAotCS8qIHdlIGtlZXAgaW50ZXJydXB0IGRpc2FibGVkIGFsbCB0aGUgdGltZSAqLwotCXRpbWVyX2ludGVycnVwdChpcnEsIE5VTEwsIHJlZ3MpOworCS8qCisJICogU3Vja2FnZSBhbGVydDoKKwkgKiBCZWZvcmUgUjIgb2YgdGhlIGFyY2hpdGVjdHVyZSB0aGVyZSB3YXMgbm8gd2F5IHRvIHNlZSBpZiBhCisJICogcGVyZm9ybWFuY2UgY291bnRlciBpbnRlcnJ1cHQgd2FzIHBlbmRpbmcsIHNvIHdlIGhhdmUgdG8gcnVuIHRoZQorCSAqIHBlcmZvcm1hbmNlIGNvdW50ZXIgaW50ZXJydXB0IGhhbmRsZXIgYW55d2F5LgorCSAqLworCWlmICghcjIgfHwgKHJlYWRfYzBfY2F1c2UoKSAmICgxIDw8IDI2KSkpCisJCWlmIChwZXJmX2lycShyZWdzKSkKKwkJCWdvdG8gb3V0OwogCisJLyogd2Uga2VlcCBpbnRlcnJ1cHQgZGlzYWJsZWQgYWxsIHRoZSB0aW1lICovCisJaWYgKCFyMiB8fCAocmVhZF9jMF9jYXVzZSgpICYgKDEgPDwgMzApKSkKKwkJdGltZXJfaW50ZXJydXB0KGlycSwgTlVMTCwgcmVncyk7CisKK291dDoKIAlpcnFfZXhpdCgpOwogfQogCkBAIC02MjgsOSArNjUyLDkgQEAKIAkJCW1pcHNfaHB0X2luaXQgPSBjMF9ocHRfaW5pdDsKIAkJfQogCi0JCWlmICgoY3VycmVudF9jcHVfZGF0YS5pc2FfbGV2ZWwgPT0gTUlQU19DUFVfSVNBX00zMikgfHwKLQkJCSAoY3VycmVudF9jcHVfZGF0YS5pc2FfbGV2ZWwgPT0gTUlQU19DUFVfSVNBX0kpIHx8Ci0JCQkgKGN1cnJlbnRfY3B1X2RhdGEuaXNhX2xldmVsID09IE1JUFNfQ1BVX0lTQV9JSSkpCisJCWlmIChjcHVfaGFzX21pcHMzMnIxIHx8IGNwdV9oYXNfbWlwczMycjIgfHwKKwkJICAgIChjdXJyZW50X2NwdV9kYXRhLmlzYV9sZXZlbCA9PSBNSVBTX0NQVV9JU0FfSSkgfHwKKwkJICAgIChjdXJyZW50X2NwdV9kYXRhLmlzYV9sZXZlbCA9PSBNSVBTX0NQVV9JU0FfSUkpKQogCQkJLyoKIAkJCSAqIFdlIG5lZWQgdG8gY2FsaWJyYXRlIHRoZSBjb3VudGVyIGJ1dCB3ZSBkb24ndCBoYXZlCiAJCQkgKiA2NC1iaXQgZGl2aXNpb24uCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMgYi9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKaW5kZXggNzA1ODg5My4uNTlhMTg3OSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYwpAQCAtNTE5LDcgKzUxOSw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHNpbXVsYXRlX3JkaHdyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSBjdXJyZW50LT50aHJlYWRfaW5mbzsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gdGFza190aHJlYWRfaW5mbyhjdXJyZW50KTsKIAl1bnNpZ25lZCBpbnQgb3Bjb2RlOwogCiAJaWYgKHVubGlrZWx5KGdldF9pbnNuX29wY29kZShyZWdzLCAmb3Bjb2RlKSkpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3ZwZS5jIGIvYXJjaC9taXBzL2tlcm5lbC92cGUuYwppbmRleCAwNmJlNDA1Li5hZTgzYjc1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3ZwZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvdnBlLmMKQEAgLTk5LDkgKzk5LDkgQEAKIAogCS8qIGVsZmxvYWRlciBzdHVmZiAqLwogCXZvaWQgKmxvYWRfYWRkcjsKLQl1MzIgbGVuOworCXVuc2lnbmVkIGxvbmcgbGVuOwogCWNoYXIgKnBidWZmZXI7Ci0JdTMyIHBsZW47CisJdW5zaWduZWQgbG9uZyBwbGVuOwogCiAJdW5zaWduZWQgbG9uZyBfX3N0YXJ0OwogCkBAIC0yNTMsMTEgKzI1MywxMSBAQAogfQogCiAvKiBGaW5kIHNvbWUgVlBFIHByb2dyYW0gc3BhY2UgICovCi1zdGF0aWMgdm9pZCAqYWxsb2NfcHJvZ21lbSh1MzIgbGVuKQorc3RhdGljIHZvaWQgKmFsbG9jX3Byb2dtZW0odW5zaWduZWQgbG9uZyBsZW4pCiB7CiAjaWZkZWYgQ09ORklHX01JUFNfVlBFX0xPQURFUl9UT00KIAkvKiB0aGlzIG1lYW5zIHlvdSBtdXN0IHRlbGwgbGludXggdG8gdXNlIGxlc3MgbWVtb3J5IHRoYW4geW91IHBoeXNpY2FsbHkgaGF2ZSAqLwotCXJldHVybiAodm9pZCAqKSgobWF4X3BmbiAqIFBBR0VfU0laRSkgKyBLU0VHMCk7CisJcmV0dXJuIHBmbl90b19rYWRkcihtYXhfcGZuKTsKICNlbHNlCiAJLy8gc2ltcGxlIGdyYWIgc29tZSBtZW0gZm9yIG5vdwogCXJldHVybiBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CkBAIC0xMTcxLDcgKzExNzEsOCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAoKG1ham9yID0gcmVnaXN0ZXJfY2hyZGV2KDAsIG1vZHVsZV9uYW1lLCAmdnBlX2ZvcHMpIDwgMCkpIHsKKwltYWpvciA9IHJlZ2lzdGVyX2NocmRldigwLCBtb2R1bGVfbmFtZSwgJnZwZV9mb3BzKTsKKwlpZiAobWFqb3IgPCAwKSB7CiAJCXByaW50aygiVlBFIGxvYWRlcjogdW5hYmxlIHRvIHJlZ2lzdGVyIGNoYXJhY3RlciBkZXZpY2VcbiIpOwogCQlyZXR1cm4gbWFqb3I7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xpYi9pb21hcC5jIGIvYXJjaC9taXBzL2xpYi9pb21hcC5jCmluZGV4IGI1ZDVmYTguLjdlMmNlZDcxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliL2lvbWFwLmMKKysrIGIvYXJjaC9taXBzL2xpYi9pb21hcC5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqICBUaGlzIGNvZGUgaXMgYmFzZWQgb24gbGliL2lvbWFwLmMsIGJ5IExpbnVzIFRvcnZhbGRzLgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSAgWW9pY2hpIFl1YXNhIDx5b2ljaGlfeXVhc2FAdHJpcGVha3MuY28uanA+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tYXRoLWVtdS9kcF9maW50LmMgYi9hcmNoL21pcHMvbWF0aC1lbXUvZHBfZmludC5jCmluZGV4IDAwNjVkZWEuLmExOTYyZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tYXRoLWVtdS9kcF9maW50LmMKKysrIGIvYXJjaC9taXBzL21hdGgtZW11L2RwX2ZpbnQuYwpAQCAtMzMsOCArMzMsNiBAQAogCiAJQ0xFQVJDWDsKIAotCXhjID0gKCAwID8geGMgOiB4YyApOwotCiAJaWYgKHggPT0gMCkKIAkJcmV0dXJuIGllZWU3NTRkcF96ZXJvKDApOwogCWlmICh4ID09IDEgfHwgeCA9PSAtMSkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tYXRoLWVtdS9kcF9mbG9uZy5jIGIvYXJjaC9taXBzL21hdGgtZW11L2RwX2Zsb25nLmMKaW5kZXggY2IxMDViMS4uZWFlOTBhOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21hdGgtZW11L2RwX2Zsb25nLmMKKysrIGIvYXJjaC9taXBzL21hdGgtZW11L2RwX2Zsb25nLmMKQEAgLTMzLDggKzMzLDYgQEAKIAogCUNMRUFSQ1g7CiAKLQl4YyA9ICggMCA/IHhjIDogeGMgKTsKLQogCWlmICh4ID09IDApCiAJCXJldHVybiBpZWVlNzU0ZHBfemVybygwKTsKIAlpZiAoeCA9PSAxIHx8IHggPT0gLTEpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbWF0aC1lbXUvc3BfZmludC5jIGIvYXJjaC9taXBzL21hdGgtZW11L3NwX2ZpbnQuYwppbmRleCA0MmQ5ZWQ0Li43YWFjMTNhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWF0aC1lbXUvc3BfZmludC5jCisrKyBiL2FyY2gvbWlwcy9tYXRoLWVtdS9zcF9maW50LmMKQEAgLTMzLDggKzMzLDYgQEAKIAogCUNMRUFSQ1g7CiAKLQl4YyA9ICggMCA/IHhjIDogeGMgKTsKLQogCWlmICh4ID09IDApCiAJCXJldHVybiBpZWVlNzU0c3BfemVybygwKTsKIAlpZiAoeCA9PSAxIHx8IHggPT0gLTEpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbWF0aC1lbXUvc3BfZmxvbmcuYyBiL2FyY2gvbWlwcy9tYXRoLWVtdS9zcF9mbG9uZy5jCmluZGV4IDFlMjY3OTUuLjNkNmMxZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tYXRoLWVtdS9zcF9mbG9uZy5jCisrKyBiL2FyY2gvbWlwcy9tYXRoLWVtdS9zcF9mbG9uZy5jCkBAIC0zMyw4ICszMyw2IEBACiAKIAlDTEVBUkNYOwogCi0JeGMgPSAoIDAgPyB4YyA6IHhjICk7Ci0KIAlpZiAoeCA9PSAwKQogCQlyZXR1cm4gaWVlZTc1NHNwX3plcm8oMCk7CiAJaWYgKHggPT0gMSB8fCB4ID09IC0xKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvdGltZS5jIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvdGltZS5jCmluZGV4IDcyYTEyZDkuLjkzZjNiZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL3RpbWUuYworKysgYi9hcmNoL21pcHMvbWlwcy1ib2FyZHMvZ2VuZXJpYy90aW1lLmMKQEAgLTc1LDIwICs3NSwzMSBAQAogCWRvX0lSUSAobWlwc19jcHVfdGltZXJfaXJxLCByZWdzKTsKIH0KIAorZXh0ZXJuIGludCBudWxsX3BlcmZfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworZXh0ZXJuIGludCAoKnBlcmZfaXJxKShzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKIGlycXJldHVybl90IG1pcHNfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWZkZWYgQ09ORklHX1NNUAorCWludCByMiA9IGNwdV9oYXNfbWlwc19yMjsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCiAJaWYgKGNwdSA9PSAwKSB7CiAJCS8qCi0JCSAqIENQVSAwIGhhbmRsZXMgdGhlIGdsb2JhbCB0aW1lciBpbnRlcnJ1cHQgam9iIGFuZCBwcm9jZXNzIGFjY291bnRpbmcKLQkJICogcmVzZXRzIGNvdW50L2NvbXBhcmUgcmVnaXN0ZXJzIHRvIHRyaWdnZXIgbmV4dCB0aW1lciBpbnQuCisJCSAqIENQVSAwIGhhbmRsZXMgdGhlIGdsb2JhbCB0aW1lciBpbnRlcnJ1cHQgam9iIGFuZCBwcm9jZXNzCisJCSAqIGFjY291bnRpbmcgcmVzZXRzIGNvdW50L2NvbXBhcmUgcmVnaXN0ZXJzIHRvIHRyaWdnZXIgbmV4dAorCQkgKiB0aW1lciBpbnQuCiAJCSAqLwotCQkodm9pZCkgdGltZXJfaW50ZXJydXB0KGlycSwgZGV2X2lkLCByZWdzKTsKKwkJaWYgKCFyMiB8fCAocmVhZF9jMF9jYXVzZSgpICYgKDEgPDwgMjYpKSkKKwkJCWlmIChwZXJmX2lycShyZWdzKSkKKwkJCQlnb3RvIG91dDsKKworCQkvKiB3ZSBrZWVwIGludGVycnVwdCBkaXNhYmxlZCBhbGwgdGhlIHRpbWUgKi8KKwkJaWYgKCFyMiB8fCAocmVhZF9jMF9jYXVzZSgpICYgKDEgPDwgMzApKSkKKwkJCXRpbWVyX2ludGVycnVwdChpcnEsIE5VTEwsIHJlZ3MpOworCiAJCXNjcm9sbF9kaXNwbGF5X21lc3NhZ2UoKTsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyogRXZlcnlvbmUgZWxzZSBuZWVkcyB0byByZXNldCB0aGUgdGltZXIgaW50IGhlcmUgYXMKIAkJICAgbGxfbG9jYWxfdGltZXJfaW50ZXJydXB0IGRvZXNuJ3QgKi8KIAkJLyoKQEAgLTEwMywxNiArMTE0LDggQEAKIAkJbG9jYWxfdGltZXJfaW50ZXJydXB0IChpcnEsIGRldl9pZCwgcmVncyk7CiAJfQogCitvdXQ6CiAJcmV0dXJuIElSUV9IQU5ETEVEOwotI2Vsc2UKLQlpcnFyZXR1cm5fdCByOwotCi0JciA9IHRpbWVyX2ludGVycnVwdChpcnEsIGRldl9pZCwgcmVncyk7Ci0KLQlzY3JvbGxfZGlzcGxheV9tZXNzYWdlKCk7Ci0KLQlyZXR1cm4gcjsKLSNlbmRpZgogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2MtcjRrLmMgYi9hcmNoL21pcHMvbW0vYy1yNGsuYwppbmRleCAzODIyM2I0Li40MjJiNTVmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vYy1yNGsuYworKysgYi9hcmNoL21pcHMvbW0vYy1yNGsuYwpAQCAtMTE4Myw4ICsxMTgzLDggQEAKIAlpZiAoIXNjX3ByZXNlbnQpCiAJCXJldHVybjsKIAotCWlmICgoYy0+aXNhX2xldmVsID09IE1JUFNfQ1BVX0lTQV9NMzIgfHwKLQkgICAgIGMtPmlzYV9sZXZlbCA9PSBNSVBTX0NQVV9JU0FfTTY0KSAmJgorCWlmICgoYy0+aXNhX2xldmVsID09IE1JUFNfQ1BVX0lTQV9NMzJSMSB8fAorCSAgICAgYy0+aXNhX2xldmVsID09IE1JUFNfQ1BVX0lTQV9NNjRSMSkgJiYKIAkgICAgIShjLT5zY2FjaGUuZmxhZ3MgJiBNSVBTX0NBQ0hFX05PVF9QUkVTRU5UKSkKIAkJcGFuaWMoIkR1bm5vIGhvdyB0byBoYW5kbGUgTUlQUzMyIC8gTUlQUzY0IHNlY29uZCBsZXZlbCBjYWNoZSIpOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvb3Byb2ZpbGUvY29tbW9uLmMgYi9hcmNoL21pcHMvb3Byb2ZpbGUvY29tbW9uLmMKaW5kZXggZGQyY2M0Mi4uNTNmOTg4OSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL29wcm9maWxlL2NvbW1vbi5jCisrKyBiL2FyY2gvbWlwcy9vcHJvZmlsZS9jb21tb24uYwpAQCAtNzUsNyArNzUsMTAgQEAKIAlpbnQgcmVzOwogCiAJc3dpdGNoIChjdXJyZW50X2NwdV9kYXRhLmNwdXR5cGUpIHsKKwljYXNlIENQVV81S0M6CisJY2FzZSBDUFVfMjBLQzoKIAljYXNlIENQVV8yNEs6CisJY2FzZSBDUFVfMjVLRjoKIAkJbG1vZGVsID0gJm9wX21vZGVsX21pcHN4eDsKIAkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9pbXBsLmggYi9hcmNoL21pcHMvb3Byb2ZpbGUvb3BfaW1wbC5oCmluZGV4IGYwMTIxNTUuLjVjZmNlN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9pbXBsLmgKKysrIGIvYXJjaC9taXBzL29wcm9maWxlL29wX2ltcGwuaApAQCAtMTIsOCArMTIsOCBAQAogCiBzdHJ1Y3QgcHRfcmVnczsKIAotZXh0ZXJuIHZvaWQgbnVsbF9wZXJmX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci1leHRlcm4gdm9pZCAoKnBlcmZfaXJxKShzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitleHRlcm4gaW50IG51bGxfcGVyZl9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworZXh0ZXJuIGludCAoKnBlcmZfaXJxKShzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKIC8qIFBlci1jb3VudGVyIGNvbmZpZ3VyYXRpb24gYXMgc2V0IHZpYSBvcHJvZmlsZWZzLiAgKi8KIHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvb3Byb2ZpbGUvb3BfbW9kZWxfbWlwc3h4LmMgYi9hcmNoL21pcHMvb3Byb2ZpbGUvb3BfbW9kZWxfbWlwc3h4LmMKaW5kZXggZDM2YjY0ZC4uMWQxZWVlNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL29wcm9maWxlL29wX21vZGVsX21pcHN4eC5jCisrKyBiL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9tb2RlbF9taXBzeHguYwpAQCAtMTE0LDExICsxMTQsMTIgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIG1pcHN4eF9wZXJmY291bnRfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpbnQgbWlwc3h4X3BlcmZjb3VudF9oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXVuc2lnbmVkIGludCBjb3VudGVycyA9IG9wX21vZGVsX21pcHN4eC5udW1fY291bnRlcnM7CiAJdW5zaWduZWQgaW50IGNvbnRyb2w7CiAJdW5zaWduZWQgaW50IGNvdW50ZXI7CisJaW50IGhhbmRsZWQgPSAwOwogCiAJc3dpdGNoIChjb3VudGVycykgewogI2RlZmluZSBIQU5ETEVfQ09VTlRFUihuKQkJCQkJCVwKQEAgLTEyOSwxMiArMTMwLDE1IEBACiAJCSAgICAoY291bnRlciAmIE1fQ09VTlRFUl9PVkVSRkxPVykpIHsJCQlcCiAJCQlvcHJvZmlsZV9hZGRfc2FtcGxlKHJlZ3MsIG4pOwkJCVwKIAkJCXdyaXRlX2MwX3BlcmZjbnRyICMjIG4ocmVnLmNvdW50ZXJbbl0pOwkJXAorCQkJaGFuZGxlZCA9IDE7CQkJCQlcCiAJCX0KIAlIQU5ETEVfQ09VTlRFUigzKQogCUhBTkRMRV9DT1VOVEVSKDIpCiAJSEFORExFX0NPVU5URVIoMSkKIAlIQU5ETEVfQ09VTlRFUigwKQogCX0KKworCXJldHVybiBoYW5kbGVkOwogfQogCiAjZGVmaW5lIE1fQ09ORklHMV9QQwkoMSA8PCA0KQpAQCAtMTc2LDE3ICsxODAsMzEgQEAKIAlpbnQgY291bnRlcnM7CiAKIAljb3VudGVycyA9IG5fY291bnRlcnMoKTsKLQlpZiAoY291bnRlcnMgPT0gMCkKKwlpZiAoY291bnRlcnMgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIk9wcm9maWxlOiBDUFUgaGFzIG5vIHBlcmZvcm1hbmNlIGNvdW50ZXJzXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CisJfQogCiAJcmVzZXRfY291bnRlcnMoY291bnRlcnMpOwogCiAJb3BfbW9kZWxfbWlwc3h4Lm51bV9jb3VudGVycyA9IGNvdW50ZXJzOwogCXN3aXRjaCAoY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlKSB7CisJY2FzZSBDUFVfMjBLQzoKKwkJb3BfbW9kZWxfbWlwc3h4LmNwdV90eXBlID0gIm1pcHMvMjBLIjsKKwkJYnJlYWs7CisKIAljYXNlIENQVV8yNEs6CiAJCW9wX21vZGVsX21pcHN4eC5jcHVfdHlwZSA9ICJtaXBzLzI0SyI7CiAJCWJyZWFrOwogCisJY2FzZSBDUFVfMjVLRjoKKwkJb3BfbW9kZWxfbWlwc3h4LmNwdV90eXBlID0gIm1pcHMvMjVLIjsKKwkJYnJlYWs7CisKKwljYXNlIENQVV81S0M6CisJCW9wX21vZGVsX21pcHN4eC5jcHVfdHlwZSA9ICJtaXBzLzVLIjsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9FUlIgIlByb2ZpbGluZyB1bnN1cHBvcnRlZCBmb3IgdGhpcyBDUFVcbiIpOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL2ZpeHVwLWNhcGNlbGxhLmMgYi9hcmNoL21pcHMvcGNpL2ZpeHVwLWNhcGNlbGxhLmMKaW5kZXggZjJmYzgyYy4uMWU1MzA3NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9maXh1cC1jYXBjZWxsYS5jCisrKyBiL2FyY2gvbWlwcy9wY2kvZml4dXAtY2FwY2VsbGEuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgZml4dXAtY2FwcGNlbGEuYywgVGhlIFpBTyBOZXR3b3JrcyBDYXBjZWxsYSBzcGVjaWZpYyBQQ0kgZml4dXBzLgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwNCAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwNCAgWW9pY2hpIFl1YXNhIDx5b2ljaGlfeXVhc2FAdHJpcGVha3MuY28uanA+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvZml4dXAtbXBjMzB4LmMgYi9hcmNoL21pcHMvcGNpL2ZpeHVwLW1wYzMweC5jCmluZGV4IDQ5NzU4NDYuLmI2N2RkYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvZml4dXAtbXBjMzB4LmMKKysrIGIvYXJjaC9taXBzL3BjaS9maXh1cC1tcGMzMHguYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgZml4dXAtbXBjMzB4LmMsIFRoZSBWaWN0b3IgTVAtQzMwMy8zMDQgc3BlY2lmaWMgUENJIGZpeHVwcy4KICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAyLDIwMDQgIFlvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAyLDIwMDQgIFlvaWNoaSBZdWFzYSA8eW9pY2hpX3l1YXNhQHRyaXBlYWtzLmNvLmpwPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL2ZpeHVwLXRiMDIxOS5jIGIvYXJjaC9taXBzL3BjaS9maXh1cC10YjAyMTkuYwppbmRleCBiYzU1YjA2Li43MzRmMmI3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL2ZpeHVwLXRiMDIxOS5jCisrKyBiL2FyY2gvbWlwcy9wY2kvZml4dXAtdGIwMjE5LmMKQEAgLTIsNyArMiw3IEBACiAgKiAgZml4dXAtdGIwMjE5LmMsIFRoZSBUQU5CQUMgVEIwMjE5IHNwZWNpZmljIFBDSSBmaXh1cHMuCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwMyAgTWVnYXNvbHV0aW9uIEluYy4gPG1hdHN1QG1lZ2Fzb2x1dGlvbi5qcD4KLSAqICBDb3B5cmlnaHQgKEMpIDIwMDQgIFlvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA0ICBZb2ljaGkgWXVhc2EgPHlvaWNoaV95dWFzYUB0cmlwZWFrcy5jby5qcD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9maXh1cC10YjAyMjYuYyBiL2FyY2gvbWlwcy9wY2kvZml4dXAtdGIwMjI2LmMKaW5kZXggYjVkNDJiMS4uYzllN2NiNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9maXh1cC10YjAyMjYuYworKysgYi9hcmNoL21pcHMvcGNpL2ZpeHVwLXRiMDIyNi5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqICBmaXh1cC10YjAyMjYuYywgVGhlIFRBTkJBQyBUQjAyMjYgc3BlY2lmaWMgUENJIGZpeHVwcy4KICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgIFlvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgIFlvaWNoaSBZdWFzYSA8eW9pY2hpX3l1YXNhQHRyaXBlYWtzLmNvLmpwPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL2ZpeHVwLXRiMDI4Ny5jIGIvYXJjaC9taXBzL3BjaS9maXh1cC10YjAyODcuYwppbmRleCA4NDM2ZDdmLi5mYmU2YmNiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL2ZpeHVwLXRiMDI4Ny5jCisrKyBiL2FyY2gvbWlwcy9wY2kvZml4dXAtdGIwMjg3LmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogIGZpeHVwLXRiMDI4Ny5jLCBUaGUgVEFOQkFDIFRCMDI4NyBzcGVjaWZpYyBQQ0kgZml4dXBzLgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDUgIFlvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA1ICBZb2ljaGkgWXVhc2EgPHlvaWNoaV95dWFzYUB0cmlwZWFrcy5jby5qcD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9vcHMtdnI0MXh4LmMgYi9hcmNoL21pcHMvcGNpL29wcy12cjQxeHguYwppbmRleCA0MzA0MjliLi45MDBjNmIzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL29wcy12cjQxeHguYworKysgYi9hcmNoL21pcHMvcGNpL29wcy12cjQxeHguYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCiAgKiAgICBBdXRob3I6IFlvaWNoaSBZdWFzYSA8eXl1YXNhQG12aXN0YS5jb20gb3Igc291cmNlQG12aXN0YS5jb20+Ci0gKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgIFlvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgIFlvaWNoaSBZdWFzYSA8eW9pY2hpX3l1YXNhQHRyaXBlYWtzLmNvLmpwPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL3BjaS12cjQxeHguYyBiL2FyY2gvbWlwcy9wY2kvcGNpLXZyNDF4eC5jCmluZGV4IDkxZGY0ZGEuLjk4ODVmYTQwMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9wY2ktdnI0MXh4LmMKKysrIGIvYXJjaC9taXBzL3BjaS9wY2ktdnI0MXh4LmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgogICogICAgQXV0aG9yOiBZb2ljaGkgWXVhc2EgPHl5dWFzYUBtdmlzdGEuY29tIG9yIHNvdXJjZUBtdmlzdGEuY29tPgotICogIENvcHlyaWdodCAoQykgMjAwNC0yMDA1ICBZb2ljaGkgWXVhc2EgPHl1YXNhQGhoLmlpajR1Lm9yLmpwPgorICogIENvcHlyaWdodCAoQykgMjAwNC0yMDA1ICBZb2ljaGkgWXVhc2EgPHlvaWNoaV95dWFzYUB0cmlwZWFrcy5jby5qcD4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgUmFsZiBCYWVjaGxlIChyYWxmQGxpbnV4LW1pcHMub3JnKQogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9wY2ktdnI0MXh4LmggYi9hcmNoL21pcHMvcGNpL3BjaS12cjQxeHguaAppbmRleCBlMDg3ZWM1Li44YTM1ZTMyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL3BjaS12cjQxeHguaAorKysgYi9hcmNoL21pcHMvcGNpL3BjaS12cjQxeHguaApAQCAtMyw3ICszLDcgQEAKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAyICBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KICAqICAgIEF1dGhvcjogWW9pY2hpIFl1YXNhIDx5eXVhc2FAbXZpc3RhLmNvbSBvciBzb3VyY2VAbXZpc3RhLmNvbT4KLSAqICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSAgWW9pY2hpIFl1YXNhIDx5b2ljaGlfeXVhc2FAdHJpcGVha3MuY28uanA+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL3NtcC5jIGIvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvc21wLmMKaW5kZXggMDUyNzE3MC4uZjE3ZjU3NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvc21wLmMKKysrIGIvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvc21wLmMKQEAgLTkzLDggKzkzLDggQEAKICAqLwogdm9pZCBwcm9tX2Jvb3Rfc2Vjb25kYXJ5KGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSkKIHsKLQl1bnNpZ25lZCBsb25nIGdwID0gKHVuc2lnbmVkIGxvbmcpIGlkbGUtPnRocmVhZF9pbmZvOwotCXVuc2lnbmVkIGxvbmcgc3AgPSBncCArIFRIUkVBRF9TSVpFIC0gMzI7CisJdW5zaWduZWQgbG9uZyBncCA9ICh1bnNpZ25lZCBsb25nKSB0YXNrX3RocmVhZF9pbmZvKGlkbGUpOworCXVuc2lnbmVkIGxvbmcgc3AgPSBfX0tTVEtfVE9QKGlkbGUpOwogCiAJc2Vjb25kYXJ5X3NwID0gc3A7CiAJc2Vjb25kYXJ5X2dwID0gZ3A7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1iZXJyLmMgYi9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1iZXJyLmMKaW5kZXggMDc2MzFhOS4uY2U5MDdlZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctYmVyci5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LWJlcnIuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgkvKiBmb3IgU0lHQlVTICovCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JLyogc2Nob3dfcmVncygpLCBmb3JjZV9zaWcoKSAqLwogCiAjaW5jbHVkZSA8YXNtL21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctc21wLmMgYi9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1zbXAuYwppbmRleCAzYTgyOTFiLi5kYmVmM2Y2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1zbXAuYworKysgYi9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1zbXAuYwpAQCAtMTY4LDggKzE2OCw4IEBACiAgKi8KIHZvaWQgX19pbml0IHByb21fYm9vdF9zZWNvbmRhcnkoaW50IGNwdSwgc3RydWN0IHRhc2tfc3RydWN0ICppZGxlKQogewotCXVuc2lnbmVkIGxvbmcgZ3AgPSAodW5zaWduZWQgbG9uZykgaWRsZS0+dGhyZWFkX2luZm87Ci0JdW5zaWduZWQgbG9uZyBzcCA9IGdwICsgVEhSRUFEX1NJWkUgLSAzMjsKKwl1bnNpZ25lZCBsb25nIGdwID0gKHVuc2lnbmVkIGxvbmcpdGFza190aHJlYWRfaW5mbyhpZGxlKTsKKwl1bnNpZ25lZCBsb25nIHNwID0gX19LU1RLX1RPUyhpZGxlKTsKIAogCUxBVU5DSF9TTEFWRShjcHV0b25hc2lkKGNwdSksY3B1dG9zbGljZShjcHUpLAogCQkobGF1bmNoX3Byb2NfdClNQVBQRURfS0VSTl9SV19UT19LMChzbXBfYm9vdHN0cmFwKSwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvY2ZlL3NtcC5jIGIvYXJjaC9taXBzL3NpYnl0ZS9jZmUvc21wLmMKaW5kZXggZTg0ODUxMi4uNDQ3N2FmMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9jZmUvc21wLmMKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9jZmUvc21wLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAogCXJldHZhbCA9IGNmZV9jcHVfc3RhcnQoY3B1X2xvZ2ljYWxfbWFwKGNwdSksICZzbXBfYm9vdHN0cmFwLAogCQkJICAgICAgIF9fS1NUS19UT1MoaWRsZSksCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpaWRsZS0+dGhyZWFkX2luZm8sIDApOworCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXRhc2tfdGhyZWFkX2luZm8oaWRsZSksIDApOwogCWlmIChyZXR2YWwgIT0gMCkKIAkJcHJpbnRrKCJjZmVfc3RhcnRfY3B1KCVpKSByZXR1cm5lZCAlaVxuIiAsIGNwdSwgcmV0dmFsKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy92cjQxeHgvY2FzaW8tZTU1L3NldHVwLmMgYi9hcmNoL21pcHMvdnI0MXh4L2Nhc2lvLWU1NS9zZXR1cC5jCmluZGV4IGQyOTIwMWEuLjgxNDkwMDkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy92cjQxeHgvY2FzaW8tZTU1L3NldHVwLmMKKysrIGIvYXJjaC9taXBzL3ZyNDF4eC9jYXNpby1lNTUvc2V0dXAuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgc2V0dXAuYywgU2V0dXAgZm9yIHRoZSBDQVNJTyBDQVNTSU9QRUlBIEUtMTEvMTUvNTUvNjUuCiAgKgotICogIENvcHlyaWdodCAoQykgMjAwMi0yMDA1ICBZb2ljaGkgWXVhc2EgPHl1YXNhQGhoLmlpajR1Lm9yLmpwPgorICogIENvcHlyaWdodCAoQykgMjAwMi0yMDA1ICBZb2ljaGkgWXVhc2EgPHlvaWNoaV95dWFzYUB0cmlwZWFrcy5jby5qcD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vYmN1LmMgYi9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9iY3UuYwppbmRleCBjZGZhNDI3Li5kZTBjMWIzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9iY3UuYworKysgYi9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9iY3UuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAyICBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KICAqICAgIEF1dGhvcjogWW9pY2hpIFl1YXNhIDx5eXVhc2FAbXZpc3RhLmNvbSwgb3Igc291cmNlQG12aXN0YS5jb20+Ci0gKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgIFlvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgIFlvaWNoaSBZdWFzYSA8eW9pY2hpX3l1YXNhQHRyaXBlYWtzLmNvLmpwPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0yNSw3ICsyNSw3IEBACiAgKiAgLSBOZXcgY3JlYXRpb24sIE5FQyBWUjQxMjIgYW5kIFZSNDEzMSBhcmUgc3VwcG9ydGVkLgogICogIC0gQWRkZWQgc3VwcG9ydCBmb3IgTkVDIFZSNDExMSBhbmQgVlI0MTIxLgogICoKLSAqICBZb2ljaGkgWXVhc2EgPHl1YXNhQGhoLmlpajR1Lm9yLmpwPgorICogIFlvaWNoaSBZdWFzYSA8eW9pY2hpX3l1YXNhQHRyaXBlYWtzLmNvLmpwPgogICogIC0gQWRkZWQgc3VwcG9ydCBmb3IgTkVDIFZSNDEzMy4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vY211LmMgYi9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9jbXUuYwppbmRleCBkNzU4ZTQzLi42NTdjNTEzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9jbXUuYworKysgYi9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9jbXUuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgogICogICAgQXV0aG9yOiBZb2ljaGkgWXVhc2EgPHl5dWFzYUBtdmlzdGEuY29tIG9yIHNvdXJjZUBtdmlzdGEuY29tPgotICogIENvcHVyaWdodCAoQykgMjAwMy0yMDA1ICBZb2ljaGkgWXVhc2EgPHl1YXNhQGhoLmlpajR1Lm9yLmpwPgorICogIENvcHVyaWdodCAoQykgMjAwMy0yMDA1ICBZb2ljaGkgWXVhc2EgPHlvaWNoaV95dWFzYUB0cmlwZWFrcy5jby5qcD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjUsNyArMjUsNyBAQAogICogIC0gTmV3IGNyZWF0aW9uLCBORUMgVlI0MTIyIGFuZCBWUjQxMzEgYXJlIHN1cHBvcnRlZC4KICAqICAtIEFkZGVkIHN1cHBvcnQgZm9yIE5FQyBWUjQxMTEgYW5kIFZSNDEyMS4KICAqCi0gKiAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KKyAqICBZb2ljaGkgWXVhc2EgPHlvaWNoaV95dWFzYUB0cmlwZWFrcy5jby5qcD4KICAqICAtIEFkZGVkIHN1cHBvcnQgZm9yIE5FQyBWUjQxMzMuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9pY3UuYyBiL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2ljdS5jCmluZGV4IDBiNzNjNWEuLjA3YWUxOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2ljdS5jCisrKyBiL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2ljdS5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiAgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCiAgKiAgICBBdXRob3I6IFlvaWNoaSBZdWFzYSA8eXl1YXNhQG12aXN0YS5jb20gb3Igc291cmNlQG12aXN0YS5jb20+Ci0gKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgIFlvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgIFlvaWNoaSBZdWFzYSA8eW9pY2hpX3l1YXNhQHRyaXBlYWtzLmNvLmpwPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0yNSw3ICsyNSw3IEBACiAgKiAgLSBOZXcgY3JlYXRpb24sIE5FQyBWUjQxMjIgYW5kIFZSNDEzMSBhcmUgc3VwcG9ydGVkLgogICogIC0gQWRkZWQgc3VwcG9ydCBmb3IgTkVDIFZSNDExMSBhbmQgVlI0MTIxLgogICoKLSAqICBZb2ljaGkgWXVhc2EgPHl1YXNhQGhoLmlpajR1Lm9yLmpwPgorICogIFlvaWNoaSBZdWFzYSA8eW9pY2hpX3l1YXNhQHRyaXBlYWtzLmNvLmpwPgogICogIC0gQ29wZWQgd2l0aCBJTlRBU1NJR04gb2YgTkVDIFZSNDEzMy4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9pbml0LmMgYi9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9pbml0LmMKaW5kZXggNTc4ZjY0OS4uNzA3YmQwOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vaW5pdC5jCisrKyBiL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2luaXQuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgaW5pdC5jLCBDb21tb24gaW5pdGlhbGl6YXRpb24gcm91dGluZXMgZm9yIE5FQyBWUjQxMDAgc2VyaWVzLgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSAgWW9pY2hpIFl1YXNhIDx5b2ljaGlfeXVhc2FAdHJpcGVha3MuY28uanA+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2ludC1oYW5kbGVyLlMgYi9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9pbnQtaGFuZGxlci5TCmluZGV4IDI3MmMxM2EuLjJiNjA0M2YgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2ludC1oYW5kbGVyLlMKKysrIGIvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vaW50LWhhbmRsZXIuUwpAQCAtMzUsNyArMzUsNyBAQAogICogIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLiA8eXl1YXNhQG12aXN0YS5jb20+IG9yIDxzb3VyY2VAbXZpc3RhLmNvbT4KICAqICAtIE5ldyBjcmVhdGlvbiwgTkVDIFZSNDEwMCBzZXJpZXMgYXJlIHN1cHBvcnRlZC4KICAqCi0gKiAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KKyAqICBZb2ljaGkgWXVhc2EgPHlvaWNoaV95dWFzYUB0cmlwZWFrcy5jby5qcD4KICAqICAtIENvcGVkIHdpdGggSU5UQVNTSUdOIG9mIE5FQyBWUjQxMzMuCiAgKi8KICNpbmNsdWRlIDxhc20vYXNtLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9pcnEuYyBiL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2lycS5jCmluZGV4IDQzYjIxNGQuLjYxYWEyNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2lycS5jCisrKyBiL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2lycS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqICBJbnRlcnJ1cHQgaGFuZGluZyByb3V0aW5lcyBmb3IgTkVDIFZSNDEwMCBzZXJpZXMuCiAgKgotICogIENvcHlyaWdodCAoQykgMjAwNSAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgIFlvaWNoaSBZdWFzYSA8eW9pY2hpX3l1YXNhQHRyaXBlYWtzLmNvLmpwPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9wbXUuYyBiL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL3BtdS5jCmluZGV4IDUzMTY2ZjMuLjAyYmY0ZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL3BtdS5jCisrKyBiL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL3BtdS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqICBwbXUuYywgUG93ZXIgTWFuYWdlbWVudCBVbml0IHJvdXRpbmVzIGZvciBORUMgVlI0MTAwIHNlcmllcy4KICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgIFlvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgIFlvaWNoaSBZdWFzYSA8eW9pY2hpX3l1YXNhQHRyaXBlYWtzLmNvLmpwPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi90eXBlLmMgYi9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi90eXBlLmMKaW5kZXggYmNiNWY3MS4uZTBjMWFjNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vdHlwZS5jCisrKyBiL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL3R5cGUuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgdHlwZS5jLCBTeXN0ZW0gdHlwZSBmb3IgTkVDIFZSNDEwMCBzZXJpZXMuCiAgKgotICogIENvcHlyaWdodCAoQykgMjAwNSAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgIFlvaWNoaSBZdWFzYSA8eW9pY2hpX3l1YXNhQHRyaXBlYWtzLmNvLmpwPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi92cmM0MTczLmMgYi9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi92cmM0MTczLmMKaW5kZXggNDYyYTlhZi4uM2UzMWY4MSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vdnJjNDE3My5jCisrKyBiL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL3ZyYzQxNzMuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgogICogICAgQXV0aG9yOiBZb2ljaGkgWXVhc2EgPHl5dWFzYUBtdmlzdGEuY29tLCBvciBzb3VyY2VAbXZpc3RhLmNvbT4KLSAqICBDb3B5cmlnaHQgKEMpIDIwMDQgIFlvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA0ICBZb2ljaGkgWXVhc2EgPHlvaWNoaV95dWFzYUB0cmlwZWFrcy5jby5qcD4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDUgUmFsZiBCYWVjaGxlIChyYWxmQGxpbnV4LW1pcHMub3JnKQogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtNTYxLDcgKzU2MSw3IEBACiB7CiAJaW50IGVycjsKIAotCWVyciA9IHBjaV9tb2R1bGVfaW5pdCgmdnJjNDE3M19kcml2ZXIpOworCWVyciA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnZyYzQxNzNfZHJpdmVyKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3ZyNDF4eC9pYm0td29ya3BhZC9zZXR1cC5jIGIvYXJjaC9taXBzL3ZyNDF4eC9pYm0td29ya3BhZC9zZXR1cC5jCmluZGV4IGU0YjM0YWQuLjUwZmU4YWYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy92cjQxeHgvaWJtLXdvcmtwYWQvc2V0dXAuYworKysgYi9hcmNoL21pcHMvdnI0MXh4L2libS13b3JrcGFkL3NldHVwLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogIHNldHVwLmMsIFNldHVwIGZvciB0aGUgSUJNIFdvcmtQYWQgejUwLgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSAgWW9pY2hpIFl1YXNhIDx5b2ljaGlfeXVhc2FAdHJpcGVha3MuY28uanA+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL0tjb25maWcgYi9hcmNoL3BhcmlzYy9LY29uZmlnCmluZGV4IDg3NGEyODMuLmU3N2EwNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL0tjb25maWcKKysrIGIvYXJjaC9wYXJpc2MvS2NvbmZpZwpAQCAtMTksOSArMTksNiBAQAogY29uZmlnIFNUQUNLX0dST1dTVVAKIAlkZWZfYm9vbCB5CiAKLWNvbmZpZyBVSUQxNgotCWJvb2wKLQogY29uZmlnIFJXU0VNX0dFTkVSSUNfU1BJTkxPQ0sKIAlkZWZfYm9vbCB5CiAKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2NvbmZpZ3MvYTUwMF9kZWZjb25maWcgYi9hcmNoL3BhcmlzYy9jb25maWdzL2E1MDBfZGVmY29uZmlnCmluZGV4IDk1NWVmNTAuLjk1OWFkM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2NvbmZpZ3MvYTUwMF9kZWZjb25maWcKKysrIGIvYXJjaC9wYXJpc2MvY29uZmlncy9hNTAwX2RlZmNvbmZpZwpAQCAtNjAyLDYgKzYwMiw3IEBACiAjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKIENPTkZJR19FMTAwMD1tCiBDT05GSUdfRTEwMDBfTkFQST15CisjIENPTkZJR19FMTAwMF9ESVNBQkxFX1BBQ0tFVF9TUExJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAogIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2NvbmZpZ3MvYzMwMDBfZGVmY29uZmlnIGIvYXJjaC9wYXJpc2MvY29uZmlncy9jMzAwMF9kZWZjb25maWcKaW5kZXggOWQ4NmI2Yi4uMGIxYzhjMSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvY29uZmlncy9jMzAwMF9kZWZjb25maWcKKysrIGIvYXJjaC9wYXJpc2MvY29uZmlncy9jMzAwMF9kZWZjb25maWcKQEAgLTYyNiw2ICs2MjYsNyBAQAogIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CiBDT05GSUdfRTEwMDA9bQogIyBDT05GSUdfRTEwMDBfTkFQSSBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMF9ESVNBQkxFX1BBQ0tFVF9TUExJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAogIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2hwdXgvc3lzX2hwdXguYyBiL2FyY2gvcGFyaXNjL2hwdXgvc3lzX2hwdXguYwppbmRleCBhNjRmZDQ4Li4yOWI0ZDYxIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9ocHV4L3N5c19ocHV4LmMKKysrIGIvYXJjaC9wYXJpc2MvaHB1eC9zeXNfaHB1eC5jCkBAIC0yMiw2ICsyMiw3IEBACiAgKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL01ha2VmaWxlIGIvYXJjaC9wYXJpc2Mva2VybmVsL01ha2VmaWxlCmluZGV4IDE3MWY5YzIuLjI3ODI3YmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvTWFrZWZpbGUKQEAgLTYsNyArNiw2IEBACiAKIEFGTEFHU19lbnRyeS5vCTo9IC10cmFkaXRpb25hbAogQUZMQUdTX3BhY2FjaGUubyA6PSAtdHJhZGl0aW9uYWwKLUNGTEFHU19pb2N0bDMyLm8gOj0gLUlmcy8KIAogb2JqLXkJICAgICAJOj0gY2FjaGUubyBwYWNhY2hlLm8gc2V0dXAubyB0cmFwcy5vIHRpbWUubyBpcnEubyBcCiAJCSAgIHBhNzMwMGxjLm8gc3lzY2FsbC5vIGVudHJ5Lm8gc3lzX3BhcmlzYy5vIGZpcm13YXJlLm8gXApAQCAtMTksNiArMTgsNiBAQAogb2JqLSQoQ09ORklHX1BBMTEpCSs9IHBjaS1kbWEubwogb2JqLSQoQ09ORklHX1BDSSkJKz0gcGNpLm8KIG9iai0kKENPTkZJR19NT0RVTEVTKQkrPSBtb2R1bGUubwotb2JqLSQoQ09ORklHXzY0QklUKQkrPSBiaW5mbXRfZWxmMzIubyBzeXNfcGFyaXNjMzIubyBpb2N0bDMyLm8gc2lnbmFsMzIubworb2JqLSQoQ09ORklHXzY0QklUKQkrPSBiaW5mbXRfZWxmMzIubyBzeXNfcGFyaXNjMzIubyBzaWduYWwzMi5vCiAjIG9ubHkgc3VwcG9ydGVkIGZvciBQQ1gtVy9VIGluIDY0LWJpdCBtb2RlIGF0IHRoZSBtb21lbnQKIG9iai0kKENPTkZJR182NEJJVCkJKz0gcGVyZi5vIHBlcmZfYXNtLm8KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9jYWNoZS5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL2NhY2hlLmMKaW5kZXggYTA2NTM0OS4uZDhhNGNhMCAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL2NhY2hlLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL2NhY2hlLmMKQEAgLTI5LDkgKzI5LDkgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAKLWludCBzcGxpdF90bGI7Ci1pbnQgZGNhY2hlX3N0cmlkZTsKLWludCBpY2FjaGVfc3RyaWRlOworaW50IHNwbGl0X3RsYiBfX3JlYWRfbW9zdGx5OworaW50IGRjYWNoZV9zdHJpZGUgX19yZWFkX21vc3RseTsKK2ludCBpY2FjaGVfc3RyaWRlIF9fcmVhZF9tb3N0bHk7CiBFWFBPUlRfU1lNQk9MKGRjYWNoZV9zdHJpZGUpOwogCiAKQEAgLTQ1LDI5ICs0NSwyOSBAQAogRVhQT1JUX1NZTUJPTChwYV90bGJfbG9jayk7CiAjZW5kaWYKIAotc3RydWN0IHBkY19jYWNoZV9pbmZvIGNhY2hlX2luZm87CitzdHJ1Y3QgcGRjX2NhY2hlX2luZm8gY2FjaGVfaW5mbyBfX3JlYWRfbW9zdGx5OwogI2lmbmRlZiBDT05GSUdfUEEyMAotc3RhdGljIHN0cnVjdCBwZGNfYnRsYl9pbmZvIGJ0bGJfaW5mbzsKK3N0YXRpYyBzdHJ1Y3QgcGRjX2J0bGJfaW5mbyBidGxiX2luZm8gX19yZWFkX21vc3RseTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NNUAogdm9pZAogZmx1c2hfZGF0YV9jYWNoZSh2b2lkKQogewotCW9uX2VhY2hfY3B1KCh2b2lkICgqKSh2b2lkICopKWZsdXNoX2RhdGFfY2FjaGVfbG9jYWwsIE5VTEwsIDEsIDEpOworCW9uX2VhY2hfY3B1KGZsdXNoX2RhdGFfY2FjaGVfbG9jYWwsIE5VTEwsIDEsIDEpOwogfQogdm9pZCAKIGZsdXNoX2luc3RydWN0aW9uX2NhY2hlKHZvaWQpCiB7Ci0Jb25fZWFjaF9jcHUoKHZvaWQgKCopKHZvaWQgKikpZmx1c2hfaW5zdHJ1Y3Rpb25fY2FjaGVfbG9jYWwsIE5VTEwsIDEsIDEpOworCW9uX2VhY2hfY3B1KGZsdXNoX2luc3RydWN0aW9uX2NhY2hlX2xvY2FsLCBOVUxMLCAxLCAxKTsKIH0KICNlbmRpZgogCiB2b2lkCiBmbHVzaF9jYWNoZV9hbGxfbG9jYWwodm9pZCkKIHsKLQlmbHVzaF9pbnN0cnVjdGlvbl9jYWNoZV9sb2NhbCgpOwotCWZsdXNoX2RhdGFfY2FjaGVfbG9jYWwoKTsKKwlmbHVzaF9pbnN0cnVjdGlvbl9jYWNoZV9sb2NhbChOVUxMKTsKKwlmbHVzaF9kYXRhX2NhY2hlX2xvY2FsKE5VTEwpOwogfQogRVhQT1JUX1NZTUJPTChmbHVzaF9jYWNoZV9hbGxfbG9jYWwpOwogCkBAIC0zMzIsNyArMzMyLDcgQEAKIH0KIAogI2RlZmluZSBGTFVTSF9USFJFU0hPTEQgMHg4MDAwMCAvKiAwLjVNQiAqLwotaW50IHBhcmlzY19jYWNoZV9mbHVzaF90aHJlc2hvbGQgPSBGTFVTSF9USFJFU0hPTEQ7CitpbnQgcGFyaXNjX2NhY2hlX2ZsdXNoX3RocmVzaG9sZCBfX3JlYWRfbW9zdGx5ID0gRkxVU0hfVEhSRVNIT0xEOwogCiB2b2lkIHBhcmlzY19zZXR1cF9jYWNoZV90aW1pbmcodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9kcml2ZXJzLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvZHJpdmVycy5jCmluZGV4IGQwMTZkNjcuLjJkODA0ZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9kcml2ZXJzLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL2RyaXZlcnMuYwpAQCAtMzksNyArMzksNyBAQAogI2luY2x1ZGUgPGFzbS9wYXJpc2MtZGV2aWNlLmg+CiAKIC8qIFNlZSBjb21tZW50cyBpbiBpbmNsdWRlL2FzbS1wYXJpc2MvcGNpLmggKi8KLXN0cnVjdCBocHBhX2RtYV9vcHMgKmhwcGFfZG1hX29wczsKK3N0cnVjdCBocHBhX2RtYV9vcHMgKmhwcGFfZG1hX29wcyBfX3JlYWRfbW9zdGx5OwogRVhQT1JUX1NZTUJPTChocHBhX2RtYV9vcHMpOwogCiBzdGF0aWMgc3RydWN0IGRldmljZSByb290ID0gewpAQCAtMTczLDggKzE3Myw2IEBACiAJV0FSTl9PTihkcml2ZXItPmRydi5wcm9iZSAhPSBOVUxMKTsKIAlXQVJOX09OKGRyaXZlci0+ZHJ2LnJlbW92ZSAhPSBOVUxMKTsKIAotCWRyaXZlci0+ZHJ2LnByb2JlID0gcGFyaXNjX2RyaXZlcl9wcm9iZTsKLQlkcml2ZXItPmRydi5yZW1vdmUgPSBwYXJpc2NfZHJpdmVyX3JlbW92ZTsKIAlkcml2ZXItPmRydi5uYW1lID0gZHJpdmVyLT5uYW1lOwogCiAJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZHJpdmVyLT5kcnYpOwpAQCAtNTE1LDggKzUxMywxMyBAQAogCQkJKGlvZGNfZGF0YVs1XSA8PCA4KSB8IGlvZGNfZGF0YVs2XTsKIAlkZXYtPmhwYS5uYW1lID0gcGFyaXNjX3BhdGhuYW1lKGRldik7CiAJZGV2LT5ocGEuc3RhcnQgPSBocGE7Ci0JaWYgKGhwYSA9PSAweGY0MDAwMDAwIHx8IGhwYSA9PSAweGY2MDAwMDAwIHx8Ci0JICAgIGhwYSA9PSAweGY4MDAwMDAwIHx8IGhwYSA9PSAweGZhMDAwMDAwKSB7CisJLyogVGhpcyBpcyBhd2t3YXJkLiAgVGhlIFNUSSBzcGVjIHNheXMgdGhhdCBnZnggZGV2aWNlcyBtYXkgb2NjdXB5CisJICogMzJNQiBvciA2NE1CLiAgVW5mb3J0dW5hdGVseSwgd2UgZG9uJ3Qga25vdyBob3cgdG8gdGVsbCB3aGV0aGVyCisJICogaXQncyB0aGUgZm9ybWVyIG9yIHRoZSBsYXR0ZXIuICBBc3N1bXB0aW9ucyBlaXRoZXIgd2F5IGNhbiBodXJ0IHVzLgorCSAqLworCWlmIChocGEgPT0gMHhmNDAwMDAwMCB8fCBocGEgPT0gMHhmODAwMDAwMCkgeworCQlkZXYtPmhwYS5lbmQgPSBocGEgKyAweDAzZmZmZmZmOworCX0gZWxzZSBpZiAoaHBhID09IDB4ZjYwMDAwMDAgfHwgaHBhID09IDB4ZmEwMDAwMDApIHsKIAkJZGV2LT5ocGEuZW5kID0gaHBhICsgMHgwMWZmZmZmZjsKIAl9IGVsc2UgewogCQlkZXYtPmhwYS5lbmQgPSBocGEgKyAweGZmZjsKQEAgLTU3MCw2ICs1NzMsOCBAQAogCS5uYW1lID0gInBhcmlzYyIsCiAJLm1hdGNoID0gcGFyaXNjX2dlbmVyaWNfbWF0Y2gsCiAJLmRldl9hdHRycyA9IHBhcmlzY19kZXZpY2VfYXR0cnMsCisJLnByb2JlID0gcGFyaXNjX2RyaXZlcl9wcm9iZSwKKwkucmVtb3ZlID0gcGFyaXNjX2RyaXZlcl9yZW1vdmUsCiB9OwogCiAvKioKQEAgLTgzNCw3ICs4MzksNyBAQAogCiAJaWYgKGRldi0+bnVtX2FkZHJzKSB7CiAJCWludCBrOwotCQlwcmludGsoIiwgIGFkZGl0aW9uYWwgYWRkcmVzc2VzOiAiKTsKKwkJcHJpbnRrKCIsIGFkZGl0aW9uYWwgYWRkcmVzc2VzOiAiKTsKIAkJZm9yIChrID0gMDsgayA8IGRldi0+bnVtX2FkZHJzOyBrKyspCiAJCQlwcmludGsoIjB4JWx4ICIsIGRldi0+YWRkcltrXSk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL2Zpcm13YXJlLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvZmlybXdhcmUuYwppbmRleCA1NTNmOGZlLi4yZGMwNmI4IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvZmlybXdhcmUuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvZmlybXdhcmUuYwpAQCAtODAsNyArODAsNyBAQAogCiAvKiBGaXJtd2FyZSBuZWVkcyB0byBiZSBpbml0aWFsbHkgc2V0IHRvIG5hcnJvdyB0byBkZXRlcm1pbmUgdGhlIAogICogYWN0dWFsIGZpcm13YXJlIHdpZHRoLiAqLwotaW50IHBhcmlzY19uYXJyb3dfZmlybXdhcmUgPSAxOworaW50IHBhcmlzY19uYXJyb3dfZmlybXdhcmUgX19yZWFkX21vc3RseSA9IDE7CiAjZW5kaWYKIAogLyogT24gbW9zdCBjdXJyZW50bHktc3VwcG9ydGVkIHBsYXRmb3JtcywgSU9EQyBJL08gY2FsbHMgYXJlIDMyLWJpdCBjYWxscwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL2hhcmR3YXJlLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvaGFyZHdhcmUuYwppbmRleCAyMDcxYjViLi4zMDU4YmZmIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvaGFyZHdhcmUuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvaGFyZHdhcmUuYwpAQCAtNTUxLDYgKzU1MSw3IEBACiAJe0hQSFdfQkNQT1JULCAweDgwNCwgMHgwMDAwQywgMHgxMCwgIlJFTyBJL08gQkMgTWVyY2VkIFBvcnQifSwgCiAJe0hQSFdfQkNQT1JULCAweDc4MiwgMHgwMDAwQywgMHgwMCwgIlJFTyBJL08gQkMgUm9wZXMgUG9ydCJ9LCAKIAl7SFBIV19CQ1BPUlQsIDB4Nzg0LCAweDAwMDBDLCAweDAwLCAiUGx1dG8gSS9PIEJDIFJvcGVzIFBvcnQifSwgCisJe0hQSFdfQlJJREdFLCAweDA1RCwgMHgwMDAwQSwgMHgwMCwgIlN1bW1pdEhhd2sgRGlubyBQQ0kgQnJpZGdlIn0sIAogCXtIUEhXX0JSSURHRSwgMHg2ODAsIDB4MDAwMEEsIDB4MDAsICJEaW5vIFBDSSBCcmlkZ2UifSwgCiAJe0hQSFdfQlJJREdFLCAweDY4MiwgMHgwMDAwQSwgMHgwMCwgIkN1am8gUENJIEJyaWRnZSJ9LCAKIAl7SFBIV19CUklER0UsIDB4NzgyLCAweDAwMDBBLCAweDAwLCAiRWxyb3kgUENJIEJyaWRnZSJ9LCAKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9pbnZlbnRvcnkuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9pbnZlbnRvcnkuYwppbmRleCA4ZjU2Mzg3Li40ZTg0N2JhIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvaW52ZW50b3J5LmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL2ludmVudG9yeS5jCkBAIC0zOCw3ICszOCw3IEBACiAqLwogI3VuZGVmIERFQlVHX1BBVAogCi1pbnQgcGRjX3R5cGUgPSBQRENfVFlQRV9JTExFR0FMOworaW50IHBkY190eXBlIF9fcmVhZF9tb3N0bHkgPSBQRENfVFlQRV9JTExFR0FMOwogCiB2b2lkIF9faW5pdCBzZXR1cF9wZGModm9pZCkKIHsKQEAgLTEyMCw4ICsxMjAsOCBAQAogCSAqIHBkYyBpbmZvIGlzIGJhZCBpbiB0aGlzIGNhc2UpLgogCSAqLwogCi0JaWYgKCAgICgoc3RhcnQgJiAoUEFHRV9TSVpFIC0gMSkpICE9IDApCi0JICAgIHx8ICgocGFnZXM0ayAmICgoMVVMIDw8IFBEQ19QQUdFX0FESl9TSElGVCkgLSAxKSkgIT0gMCkgKSB7CisJaWYgKHVubGlrZWx5KCAoKHN0YXJ0ICYgKFBBR0VfU0laRSAtIDEpKSAhPSAwKQorCSAgICB8fCAoKHBhZ2VzNGsgJiAoKDFVTCA8PCBQRENfUEFHRV9BREpfU0hJRlQpIC0gMSkpICE9IDApICkpIHsKIAogCQlwYW5pYygiTWVtb3J5IHJhbmdlIGRvZXNuJ3QgYWxpZ24gd2l0aCBwYWdlIHNpemUhXG4iKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvaW9jdGwzMi5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL2lvY3RsMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhZGExYi4uMDAwMDAwMAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvaW9jdGwzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogJElkOiBpb2N0bDMyLmMsdiAxLjUgMjAwMi8xMC8xOCAwMDoyMTo0MyB2YXJlbmV0IEV4cCAkCi0gKiBpb2N0bDMyLmM6IENvbnZlcnNpb24gYmV0d2VlbiAzMmJpdCBhbmQgNjRiaXQgbmF0aXZlIGlvY3Rscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMCAgSmFrdWIgSmVsaW5layAgKGpha3ViQHJlZGhhdC5jb20pCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggIEVkZGllIEMuIERvc3QgIChlY2RAc2t5bmV0LmJlKQotICoKLSAqIFRoZXNlIHJvdXRpbmVzIG1haW50YWluIGFyZ3VtZW50IHNpemUgY29udmVyc2lvbiBiZXR3ZWVuIDMyYml0IGFuZCA2NGJpdAotICogaW9jdGxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgotCi0jZGVmaW5lIElOQ0xVREVTCi0jaW5jbHVkZSAiY29tcGF0X2lvY3RsLmMiCi0KLSNpbmNsdWRlIDxhc20vcGVyZi5oPgotI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KLQotI2RlZmluZSBDT0RFCi0jaW5jbHVkZSAiY29tcGF0X2lvY3RsLmMiCi0KLSNkZWZpbmUgSEFORExFX0lPQ1RMKGNtZCwgaGFuZGxlcikgeyBjbWQsIChpb2N0bF90cmFuc19oYW5kbGVyX3QpaGFuZGxlciwgTlVMTCB9LAotI2RlZmluZSBDT01QQVRJQkxFX0lPQ1RMKGNtZCkgSEFORExFX0lPQ1RMKGNtZCwgc3lzX2lvY3RsKSAKLQotI2RlZmluZSBJT0NUTF9UQUJMRV9TVEFSVCAgc3RydWN0IGlvY3RsX3RyYW5zIGlvY3RsX3N0YXJ0W10gPSB7Ci0jZGVmaW5lIElPQ1RMX1RBQkxFX0VORCAgICB9OwotCi1JT0NUTF9UQUJMRV9TVEFSVAotI2luY2x1ZGUgPGxpbnV4L2NvbXBhdF9pb2N0bC5oPgotCi0jZGVmaW5lIERFQ0xBUkVTCi0jaW5jbHVkZSAiY29tcGF0X2lvY3RsLmMiCi0KLS8qIEFuZCB0aGVzZSBpb2N0bHMgbmVlZCB0cmFuc2xhdGlvbiAqLwotSEFORExFX0lPQ1RMKFNJT0NHUFBQU1RBVFMsIGRldl9pZnNpb2MpCi1IQU5ETEVfSU9DVEwoU0lPQ0dQUFBDU1RBVFMsIGRldl9pZnNpb2MpCi1IQU5ETEVfSU9DVEwoU0lPQ0dQUFBWRVIsIGRldl9pZnNpb2MpCi0KLSNpZiBkZWZpbmVkKENPTkZJR19HRU5fUlRDKQotQ09NUEFUSUJMRV9JT0NUTChSVENfQUlFX09OKQotQ09NUEFUSUJMRV9JT0NUTChSVENfQUlFX09GRikKLUNPTVBBVElCTEVfSU9DVEwoUlRDX1VJRV9PTikKLUNPTVBBVElCTEVfSU9DVEwoUlRDX1VJRV9PRkYpCi1DT01QQVRJQkxFX0lPQ1RMKFJUQ19QSUVfT04pCi1DT01QQVRJQkxFX0lPQ1RMKFJUQ19QSUVfT0ZGKQotQ09NUEFUSUJMRV9JT0NUTChSVENfV0lFX09OKQotQ09NUEFUSUJMRV9JT0NUTChSVENfV0lFX09GRikKLUNPTVBBVElCTEVfSU9DVEwoUlRDX0FMTV9TRVQpICAgLyogc3RydWN0IHJ0Y190aW1lIG9ubHkgaGFzIGludHMgKi8KLUNPTVBBVElCTEVfSU9DVEwoUlRDX0FMTV9SRUFEKSAgLyogc3RydWN0IHJ0Y190aW1lIG9ubHkgaGFzIGludHMgKi8KLUNPTVBBVElCTEVfSU9DVEwoUlRDX1JEX1RJTUUpICAgLyogc3RydWN0IHJ0Y190aW1lIG9ubHkgaGFzIGludHMgKi8KLUNPTVBBVElCTEVfSU9DVEwoUlRDX1NFVF9USU1FKSAgLyogc3RydWN0IHJ0Y190aW1lIG9ubHkgaGFzIGludHMgKi8KLUhBTkRMRV9JT0NUTChSVENfSVJRUF9SRUFELCB3X2xvbmcpCi1DT01QQVRJQkxFX0lPQ1RMKFJUQ19JUlFQX1NFVCkKLUhBTkRMRV9JT0NUTChSVENfRVBPQ0hfUkVBRCwgd19sb25nKQotQ09NUEFUSUJMRV9JT0NUTChSVENfRVBPQ0hfU0VUKQotI2VuZGlmCi0KLUlPQ1RMX1RBQkxFX0VORAotCi1pbnQgaW9jdGxfdGFibGVfc2l6ZSA9IEFSUkFZX1NJWkUoaW9jdGxfc3RhcnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3BjaS1kbWEuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9wY2ktZG1hLmMKaW5kZXggZjk0YTAyZS4uYTZjYWYxMCAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3BjaS1kbWEuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvcGNpLWRtYS5jCkBAIC0zMywxMCArMzMsMTAgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgkvKiBmb3IgcHVyZ2VfdGxiXyooKSBtYWNyb3MgKi8KIAotc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqIHByb2NfZ3NjX3Jvb3QgPSBOVUxMOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqIHByb2NfZ3NjX3Jvb3QgX19yZWFkX21vc3RseSA9IE5VTEw7CiBzdGF0aWMgaW50IHBjeGxfcHJvY19pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcGN4bF91c2VkX2J5dGVzID0gMDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBjeGxfdXNlZF9wYWdlcyA9IDA7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwY3hsX3VzZWRfYnl0ZXMgX19yZWFkX21vc3RseSA9IDA7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwY3hsX3VzZWRfcGFnZXMgX19yZWFkX21vc3RseSA9IDA7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHBjeGxfZG1hX3N0YXJ0OyAvKiBTdGFydCBvZiBwY3hsIGRtYSBtYXBwaW5nIGFyZWEgKi8KIHN0YXRpYyBzcGlubG9ja190ICAgcGN4bF9yZXNfbG9jazsKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9wZGNfY2hhc3Npcy5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3BkY19jaGFzc2lzLmMKaW5kZXggNTIwMDRhZS4uMmEwMWZlMSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3BkY19jaGFzc2lzLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3BkY19jaGFzc2lzLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAKICNpbmNsdWRlIDxhc20vcGRjX2NoYXNzaXMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CkBAIC0zOCw4ICszOSw4IEBACiAKIAogI2lmZGVmIENPTkZJR19QRENfQ0hBU1NJUwotc3RhdGljIGludCBwZGNfY2hhc3Npc19vbGQgPSAwOwkKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGRjX2NoYXNzaXNfZW5hYmxlZCA9IDE7CitzdGF0aWMgaW50IHBkY19jaGFzc2lzX29sZCBfX3JlYWRfbW9zdGx5ID0gMDsJCitzdGF0aWMgdW5zaWduZWQgaW50IHBkY19jaGFzc2lzX2VuYWJsZWQgX19yZWFkX21vc3RseSA9IDE7CiAKIAogLyoqCkBAIC0xMzIsNyArMTMzLDcgQEAKIHsKICNpZmRlZiBDT05GSUdfUERDX0NIQVNTSVMKIAlpbnQgaGFuZGxlID0gMDsKLQlpZiAocGRjX2NoYXNzaXNfZW5hYmxlZCkgeworCWlmIChsaWtlbHkocGRjX2NoYXNzaXNfZW5hYmxlZCkpIHsKIAkJRFBSSU5USyhLRVJOX0RFQlVHICIlczogcGFyaXNjX3BkY19jaGFzc2lzX2luaXQoKVxuIiwgX19GSUxFX18pOwogCiAJCS8qIExldCBzZWUgaWYgd2UgaGF2ZSBzb21ldGhpbmcgdG8gaGFuZGxlLi4uICovCkBAIC0xNDIsNyArMTQzLDcgQEAKIAkJCXByaW50ayhLRVJOX0lORk8gIkVuYWJsaW5nIFBEQ19QQVQgY2hhc3NpcyBjb2RlcyBzdXBwb3J0LlxuIik7CiAJCQloYW5kbGUgPSAxOwogCQl9Ci0JCWVsc2UgaWYgKHBkY19jaGFzc2lzX29sZCkgeworCQllbHNlIGlmICh1bmxpa2VseShwZGNfY2hhc3Npc19vbGQpKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPICJFbmFibGluZyBvbGQgc3R5bGUgY2hhc3NpcyBMRUQgcGFuZWwgc3VwcG9ydC5cbiIpOwogCQkJaGFuZGxlID0gMTsKIAkJfQpAQCAtMTc4LDcgKzE3OSw3IEBACiAJLyogTWF5YmUgd2Ugc2hvdWxkIGRvIHRoYXQgaW4gYW4gb3RoZXIgd2F5ID8gKi8KIAlpbnQgcmV0dmFsID0gMDsKICNpZmRlZiBDT05GSUdfUERDX0NIQVNTSVMKLQlpZiAocGRjX2NoYXNzaXNfZW5hYmxlZCkgeworCWlmIChsaWtlbHkocGRjX2NoYXNzaXNfZW5hYmxlZCkpIHsKIAogCQlEUFJJTlRLKEtFUk5fREVCVUcgIiVzOiBwZGNfY2hhc3Npc19zZW5kX3N0YXR1cyglZClcbiIsIF9fRklMRV9fLCBtZXNzYWdlKTsKIApAQCAtMjE0LDcgKzIxNSw3IEBACiAJCQl9CiAJCX0gZWxzZSByZXR2YWwgPSAtMTsKICNlbHNlCi0JCWlmIChwZGNfY2hhc3Npc19vbGQpIHsKKwkJaWYgKHVubGlrZWx5KHBkY19jaGFzc2lzX29sZCkpIHsKIAkJCXN3aXRjaCAobWVzc2FnZSkgewogCQkJCWNhc2UgUERDX0NIQVNTSVNfRElSRUNUX0JTVEFSVDoKIAkJCQljYXNlIFBEQ19DSEFTU0lTX0RJUkVDVF9CQ09NUExFVEU6CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvcGVyZi5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3BlcmYuYwppbmRleCBmNmZlYzYyLi4xMWQ0MDZjIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvcGVyZi5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9wZXJmLmMKQEAgLTQyLDYgKzQyLDcgQEAKICAqICBvbiBldmVyeSBib3guIAogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CkBAIC02NiwxMCArNjcsMTAgQEAKIAl1aW50OF90CQl3cml0ZV9jb250cm9sOwogfTsKIAotc3RhdGljIGludCBwZXJmX3Byb2Nlc3Nvcl9pbnRlcmZhY2UgPSBVTktOT1dOX0lOVEY7Ci1zdGF0aWMgaW50IHBlcmZfZW5hYmxlZCA9IDA7CitzdGF0aWMgaW50IHBlcmZfcHJvY2Vzc29yX2ludGVyZmFjZSBfX3JlYWRfbW9zdGx5ID0gVU5LTk9XTl9JTlRGOworc3RhdGljIGludCBwZXJmX2VuYWJsZWQgX19yZWFkX21vc3RseSA9IDA7CiBzdGF0aWMgc3BpbmxvY2tfdCBwZXJmX2xvY2s7Ci1zdHJ1Y3QgcGFyaXNjX2RldmljZSAqY3B1X2RldmljZSA9IE5VTEw7CitzdHJ1Y3QgcGFyaXNjX2RldmljZSAqY3B1X2RldmljZSBfX3JlYWRfbW9zdGx5ID0gTlVMTDsKIAogLyogUkRScyB0byB3cml0ZSBmb3IgUENYLVcgKi8KIHN0YXRpYyBpbnQgcGVyZl9yZHJzX1dbXSA9IApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggZmVlNGYxZi4uNWRhNDE2NyAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvcHJvY2Vzcy5jCkBAIC01NCw3ICs1NCw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vdW53aW5kLmg+CiAKLXN0YXRpYyBpbnQgaGx0X2NvdW50ZXI7CitzdGF0aWMgaW50IGhsdF9jb3VudGVyIF9fcmVhZF9tb3N0bHk7CiAKIC8qCiAgKiBQb3dlciBvZmYgZnVuY3Rpb24sIGlmIGFueQpAQCAtMjk1LDcgKzI5NSw3IEBACiAJICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqIHAsIHN0cnVjdCBwdF9yZWdzICogcHJlZ3MpCiB7CiAJc3RydWN0IHB0X3JlZ3MgKiBjcmVncyA9ICYocC0+dGhyZWFkLnJlZ3MpOwotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSBwLT50aHJlYWRfaW5mbzsKKwl2b2lkICpzdGFjayA9IHRhc2tfc3RhY2tfcGFnZShwKTsKIAkKIAkvKiBXZSBoYXZlIHRvIHVzZSB2b2lkICogaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIHBvaW50ZXIsIGJlY2F1c2UKIAkgKiBmdW5jdGlvbiBwb2ludGVycyBhcmVuJ3QgYSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiBvbiA2NC1iaXQuCkBAIC0zMjIsNyArMzIyLDcgQEAKIAkgKi8KIAlpZiAodXNwID09IDEpIHsKIAkJLyoga2VybmVsIHRocmVhZCAqLwotCQljcmVncy0+a3NwID0gKCgodW5zaWduZWQgbG9uZykodGkpKSArIFRIUkVBRF9TWl9BTEdOKTsKKwkJY3JlZ3MtPmtzcCA9ICh1bnNpZ25lZCBsb25nKXN0YWNrICsgVEhSRUFEX1NaX0FMR047CiAJCS8qIE11c3QgZXhpdCB2aWEgcmV0X2Zyb21fa2VybmVsX3RocmVhZCBpbiBvcmRlcgogCQkgKiB0byBjYWxsIHNjaGVkdWxlX3RhaWwoKQogCQkgKi8KQEAgLTM0NCw3ICszNDQsNyBAQAogCQkgKi8KIAogCQkvKiBVc2Ugc2FtZSBzdGFjayBkZXB0aCBhcyBwYXJlbnQgKi8KLQkJY3JlZ3MtPmtzcCA9ICgodW5zaWduZWQgbG9uZykodGkpKQorCQljcmVncy0+a3NwID0gKHVuc2lnbmVkIGxvbmcpc3RhY2sKIAkJCSsgKHByZWdzLT5nclsyMV0gJiAoVEhSRUFEX1NJWkUgLSAxKSk7CiAJCWNyZWdzLT5nclszMF0gPSB1c3A7CiAJCWlmIChwLT5wZXJzb25hbGl0eSA9PSBQRVJfSFBVWCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3Byb2Nlc3Nvci5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3Byb2Nlc3Nvci5jCmluZGV4IDRmNWJiY2YuLjZkZjlmNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9wcm9jZXNzb3IuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvcHJvY2Vzc29yLmMKQEAgLTQ0LDEwICs0NCwxMCBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4JCS8qIGZvciBzdHJ1Y3QgaXJxX3JlZ2lvbiAqLwogI2luY2x1ZGUgPGFzbS9wYXJpc2MtZGV2aWNlLmg+CiAKLXN0cnVjdCBzeXN0ZW1fY3B1aW5mb19wYXJpc2MgYm9vdF9jcHVfZGF0YTsKK3N0cnVjdCBzeXN0ZW1fY3B1aW5mb19wYXJpc2MgYm9vdF9jcHVfZGF0YSBfX3JlYWRfbW9zdGx5OwogRVhQT1JUX1NZTUJPTChib290X2NwdV9kYXRhKTsKIAotc3RydWN0IGNwdWluZm9fcGFyaXNjIGNwdV9kYXRhW05SX0NQVVNdOworc3RydWN0IGNwdWluZm9fcGFyaXNjIGNwdV9kYXRhW05SX0NQVVNdIF9fcmVhZF9tb3N0bHk7CiAKIC8qCiAqKiAgCVBBUklTQyBDUFUgZHJpdmVyIC0gY2xhaW0gImRldmljZSIgYW5kIGluaXRpYWxpemUgQ1BVIGRhdGEgc3RydWN0dXJlcy4KQEAgLTM3OCwxMiArMzc4LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGFyaXNjX2RldmljZV9pZCBwcm9jZXNzb3JfdGJsW10gPSB7CitzdGF0aWMgc3RydWN0IHBhcmlzY19kZXZpY2VfaWQgcHJvY2Vzc29yX3RibFtdIF9fcmVhZF9tb3N0bHkgPSB7CiAJeyBIUEhXX05QUk9DLCBIVkVSU0lPTl9SRVZfQU5ZX0lELCBIVkVSU0lPTl9BTllfSUQsIFNWRVJTSU9OX0FOWV9JRCB9LAogCXsgMCwgfQogfTsKIAotc3RhdGljIHN0cnVjdCBwYXJpc2NfZHJpdmVyIGNwdV9kcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBhcmlzY19kcml2ZXIgY3B1X2RyaXZlciBfX3JlYWRfbW9zdGx5ID0gewogCS5uYW1lCQk9ICJDUFUiLAogCS5pZF90YWJsZQk9IHByb2Nlc3Nvcl90YmwsCiAJLnByb2JlCQk9IHByb2Nlc3Nvcl9wcm9iZQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3NldHVwLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc2V0dXAuYwppbmRleCA3M2U5YzM0Li40YTM2ZWMzIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc2V0dXAuYwpAQCAtNDYsMTUgKzQ2LDE1IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKLWNoYXIJY29tbWFuZF9saW5lW0NPTU1BTkRfTElORV9TSVpFXTsKK2NoYXIJY29tbWFuZF9saW5lW0NPTU1BTkRfTElORV9TSVpFXSBfX3JlYWRfbW9zdGx5OwogCiAvKiBJbnRlbmRlZCBmb3IgY2Npby9zYmEvY3B1IHN0YXRpc3RpY3MgdW5kZXIgL3Byb2MvYnVzL3tydW53YXl8Z3NjfSAqLwotc3RydWN0IHByb2NfZGlyX2VudHJ5ICogcHJvY19ydW53YXlfcm9vdCA9IE5VTEw7Ci1zdHJ1Y3QgcHJvY19kaXJfZW50cnkgKiBwcm9jX2dzY19yb290ID0gTlVMTDsKLXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqIHByb2NfbWNraW5sZXlfcm9vdCA9IE5VTEw7CitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKiBwcm9jX3J1bndheV9yb290IF9fcmVhZF9tb3N0bHkgPSBOVUxMOworc3RydWN0IHByb2NfZGlyX2VudHJ5ICogcHJvY19nc2Nfcm9vdCBfX3JlYWRfbW9zdGx5ID0gTlVMTDsKK3N0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqIHByb2NfbWNraW5sZXlfcm9vdCBfX3JlYWRfbW9zdGx5ID0gTlVMTDsKIAogI2lmICFkZWZpbmVkKENPTkZJR19QQTIwKSAmJiAoZGVmaW5lZChDT05GSUdfSU9NTVVfQ0NJTykgfHwgZGVmaW5lZChDT05GSUdfSU9NTVVfU0JBKSkKLWludCBwYXJpc2NfYnVzX2lzX3BoeXMgPSAxOwkvKiBBc3N1bWUgbm8gSU9NTVUgaXMgcHJlc2VudCAqLworaW50IHBhcmlzY19idXNfaXNfcGh5cyBfX3JlYWRfbW9zdGx5ID0gMTsJLyogQXNzdW1lIG5vIElPTU1VIGlzIHByZXNlbnQgKi8KIEVYUE9SVF9TWU1CT0wocGFyaXNjX2J1c19pc19waHlzKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvc21wLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc21wLmMKaW5kZXggY2U4OWRhMC4uMjU1NjRiNyAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zbXAuYwpAQCAtMzksNyArMzksNyBAQAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgotI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CS8qIGZvciBmbHVzaF90bGJfYWxsKCkgcHJvdG8vbWFjcm8gKi8KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4JCS8qIGZvciBDUFVfSVJRX1JFR0lPTiBhbmQgZnJpZW5kcyAqLwpAQCAtNTgsOSArNTgsOSBAQAogCiB2b2xhdGlsZSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNtcF9pbml0X2N1cnJlbnRfaWRsZV90YXNrOwogCi1zdGF0aWMgdm9sYXRpbGUgaW50IGNwdV9ub3dfYm9vdGluZyA9IDA7CS8qIHRyYWNrIHdoaWNoIENQVSBpcyBib290aW5nICovCitzdGF0aWMgdm9sYXRpbGUgaW50IGNwdV9ub3dfYm9vdGluZyBfX3JlYWRfbW9zdGx5ID0gMDsJLyogdHJhY2sgd2hpY2ggQ1BVIGlzIGJvb3RpbmcgKi8KIAotc3RhdGljIGludCBwYXJpc2NfbWF4X2NwdXMgPSAxOworc3RhdGljIGludCBwYXJpc2NfbWF4X2NwdXMgX19yZWFkX21vc3RseSA9IDE7CiAKIC8qIG9ubGluZSBjcHVzIGFyZSBvbmVzIHRoYXQgd2UndmUgbWFuYWdlZCB0byBicmluZyB1cCBjb21wbGV0ZWx5CiAgKiBwb3NzaWJsZSBjcHVzIGFyZSBhbGwgdmFsaWQgY3B1IApAQCAtNzEsOCArNzEsOCBAQAogICogZW1wdHkgaW4gdGhlIGJlZ2lubmluZy4KICAqLwogCi1jcHVtYXNrX3QgY3B1X29ubGluZV9tYXAgPSBDUFVfTUFTS19OT05FOwkvKiBCaXRtYXAgb2Ygb25saW5lIENQVXMgKi8KLWNwdW1hc2tfdCBjcHVfcG9zc2libGVfbWFwID0gQ1BVX01BU0tfQUxMOwkvKiBCaXRtYXAgb2YgUHJlc2VudCBDUFVzICovCitjcHVtYXNrX3QgY3B1X29ubGluZV9tYXAgICBfX3JlYWRfbW9zdGx5ID0gQ1BVX01BU0tfTk9ORTsJLyogQml0bWFwIG9mIG9ubGluZSBDUFVzICovCitjcHVtYXNrX3QgY3B1X3Bvc3NpYmxlX21hcCBfX3JlYWRfbW9zdGx5ID0gQ1BVX01BU0tfQUxMOwkvKiBCaXRtYXAgb2YgUHJlc2VudCBDUFVzICovCiAKIEVYUE9SVF9TWU1CT0woY3B1X29ubGluZV9tYXApOwogRVhQT1JUX1NZTUJPTChjcHVfcG9zc2libGVfbWFwKTsKQEAgLTQwNiwxMiArNDA2LDEwIEBACiAgKiBhcyB3ZSB3YW50IHRvIGVuc3VyZSBhbGwgVExCJ3MgZmx1c2hlZCBiZWZvcmUgcHJvY2VlZGluZy4KICAqLwogCi1leHRlcm4gdm9pZCBmbHVzaF90bGJfYWxsX2xvY2FsKHZvaWQpOwotCiB2b2lkCiBzbXBfZmx1c2hfdGxiX2FsbCh2b2lkKQogewotCW9uX2VhY2hfY3B1KCh2b2lkICgqKSh2b2lkICopKWZsdXNoX3RsYl9hbGxfbG9jYWwsIE5VTEwsIDEsIDEpOworCW9uX2VhY2hfY3B1KGZsdXNoX3RsYl9hbGxfbG9jYWwsIE5VTEwsIDEsIDEpOwogfQogCiAKQEAgLTQ4Nyw3ICs0ODUsNyBAQAogI2VuZGlmCiAKIAlmbHVzaF9jYWNoZV9hbGxfbG9jYWwoKTsgLyogc3RhcnQgd2l0aCBrbm93biBzdGF0ZSAqLwotCWZsdXNoX3RsYl9hbGxfbG9jYWwoKTsKKwlmbHVzaF90bGJfYWxsX2xvY2FsKE5VTEwpOwogCiAJbG9jYWxfaXJxX2VuYWJsZSgpOyAgLyogSW50ZXJydXB0cyBoYXZlIGJlZW4gb2ZmIHVudGlsIG5vdyAqLwogCkBAIC01MTksNyArNTE3LDcgQEAKIAlpZiAoSVNfRVJSKGlkbGUpKQogCQlwYW5pYygiU01QOiBmb3JrIGZhaWxlZCBmb3IgQ1BVOiVkIiwgY3B1aWQpOwogCi0JaWRsZS0+dGhyZWFkX2luZm8tPmNwdSA9IGNwdWlkOworCXRhc2tfdGhyZWFkX2luZm8oaWRsZSktPmNwdSA9IGNwdWlkOwogCiAJLyogTGV0IF9zdGFydCBrbm93IHdoYXQgbG9naWNhbCBDUFUgd2UncmUgYm9vdGluZwogCSoqIChvZmZzZXQgaW50byBpbml0X3Rhc2tzW10sY3B1X2RhdGFbXSkKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC90aW1lLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvdGltZS5jCmluZGV4IGNkZWQyNTYuLjU5NDkzMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3RpbWUuYwpAQCAtMzYsOCArMzYsOCBAQAogLyogeHRpbWUgYW5kIHdhbGxfamlmZmllcyBrZWVwIHdhbGwtY2xvY2sgdGltZSAqLwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgd2FsbF9qaWZmaWVzOwogCi1zdGF0aWMgbG9uZyBjbG9ja3RpY2s7CS8qIHRpbWVyIGN5Y2xlcyBwZXIgdGljayAqLwotc3RhdGljIGxvbmcgaGFsZnRpY2s7CitzdGF0aWMgbG9uZyBjbG9ja3RpY2sgX19yZWFkX21vc3RseTsJLyogdGltZXIgY3ljbGVzIHBlciB0aWNrICovCitzdGF0aWMgbG9uZyBoYWxmdGljayBfX3JlYWRfbW9zdGx5OwogCiAjaWZkZWYgQ09ORklHX1NNUAogZXh0ZXJuIHZvaWQgc21wX2RvX3RpbWVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC90b3BvbG9neS5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3RvcG9sb2d5LmMKaW5kZXggYWMyYTQwNi4uM2JhMDQwMCAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3RvcG9sb2d5LmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3RvcG9sb2d5LmMKQEAgLTIwLDggKzIwLDkgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KIAotc3RhdGljIHN0cnVjdCBjcHUgY3B1X2RldmljZXNbTlJfQ1BVU107CitzdGF0aWMgc3RydWN0IGNwdSBjcHVfZGV2aWNlc1tOUl9DUFVTXSBfX3JlYWRfbW9zdGx5OwogCiBzdGF0aWMgaW50IF9faW5pdCB0b3BvbG9neV9pbml0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvdW5hbGlnbmVkLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvdW5hbGlnbmVkLmMKaW5kZXggZWFhZThhMC4uZGUwYTFiMiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3VuYWxpZ25lZC5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC91bmFsaWduZWQuYwpAQCAtMTIyLDcgKzEyMiw3IEBACiAjZGVmaW5lIEVSUl9OT1RIQU5ETEVECS0xCiAjZGVmaW5lIEVSUl9QQUdFRkFVTFQJLTIKIAotaW50IHVuYWxpZ25lZF9lbmFibGVkID0gMTsKK2ludCB1bmFsaWduZWRfZW5hYmxlZCBfX3JlYWRfbW9zdGx5ID0gMTsKIAogdm9pZCBkaWVfaWZfa2VybmVsIChjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC91bndpbmQuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC91bndpbmQuYwppbmRleCBkYjE0MTEwLi5jYzFjMWFmIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvdW53aW5kLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3Vud2luZC5jCkBAIC0zNSw3ICszNSw3IEBACiAgKiB3ZSBjYW4gY2FsbCB1bndpbmRfaW5pdCBhcyBlYXJseSBpbiB0aGUgYm9vdHVwIHByb2Nlc3MgYXMgCiAgKiBwb3NzaWJsZSAoYmVmb3JlIHRoZSBzbGFiIGFsbG9jYXRvciBpcyBpbml0aWFsaXplZCkKICAqLwotc3RhdGljIHN0cnVjdCB1bndpbmRfdGFibGUga2VybmVsX3Vud2luZF90YWJsZTsKK3N0YXRpYyBzdHJ1Y3QgdW53aW5kX3RhYmxlIGtlcm5lbF91bndpbmRfdGFibGUgX19yZWFkX21vc3RseTsKIHN0YXRpYyBMSVNUX0hFQUQodW53aW5kX3RhYmxlcyk7CiAKIHN0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IHVud2luZF90YWJsZV9lbnRyeSAqCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvcGFyaXNjL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IGU1ZmFjM2UuLjZkNjQzNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC02OCw3ICs2OCw3IEBACiAgIFJPREFUQQogCiAgIC8qIHdyaXRlYWJsZSAqLwotICAuID0gQUxJR04oNDA5Nik7CQkvKiBNYWtlIHN1cmUgdGhpcyBpcyBwYWdlZCBhbGlnbmVkIHNvCisgIC4gPSBBTElHTig0MDk2KTsJCS8qIE1ha2Ugc3VyZSB0aGlzIGlzIHBhZ2UgYWxpZ25lZCBzbwogICAJCQkJICAgdGhhdCB3ZSBjYW4gcHJvcGVybHkgbGVhdmUgdGhlc2UKIAkJCQkgICBhcyB3cml0YWJsZSAqLwogICBkYXRhX3N0YXJ0ID0gLjsKQEAgLTEwNSw2ICsxMDUsMTAgQEAKICAgLiA9IEFMSUdOKDE2KTsKICAgLmRhdGEubG9ja19hbGlnbmVkIDogeyAqKC5kYXRhLmxvY2tfYWxpZ25lZCkgfQogCisgIC8qIHJhcmVseSBjaGFuZ2VkIGRhdGEgbGlrZSBjcHUgbWFwcyAqLworICAuID0gQUxJR04oMTYpOworICAuZGF0YS5yZWFkX21vc3RseSA6IHsgKiguZGF0YS5yZWFkX21vc3RseSkgfQorCiAgIF9lZGF0YSA9IC47CQkJLyogRW5kIG9mIGRhdGEgc2VjdGlvbiAqLwogCiAgIC4gPSBBTElHTigxNjM4NCk7IAkJLyogaW5pdF90YXNrICovCkBAIC0xOTQsMTQgKzE5OCw3IEBACiAjZW5kaWYKIAl9CiAKLSAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9Ci0gIC5zdGFiLmV4Y2wgMCA6IHsgKiguc3RhYi5leGNsKSB9Ci0gIC5zdGFiLmV4Y2xzdHIgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9Ci0gIC5zdGFiLmluZGV4IDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KLSAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQotICAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9CisgIFNUQUJTX0RFQlVHCiAgIC5ub3RlIDAgOiB7ICooLm5vdGUpIH0JCiAKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL21tL2luaXQuYyBiL2FyY2gvcGFyaXNjL21tL2luaXQuYwppbmRleCAyOWI5OThlLi43MjAyODdkIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9tbS9pbml0LmMKKysrIGIvYXJjaC9wYXJpc2MvbW0vaW5pdC5jCkBAIC0zNiw5ICszNiw5IEBACiBleHRlcm4gY2hhciBfX2luaXRfYmVnaW4sIF9faW5pdF9lbmQ7CiAKICNpZmRlZiBDT05GSUdfRElTQ09OVElHTUVNCi1zdHJ1Y3Qgbm9kZV9tYXBfZGF0YSBub2RlX2RhdGFbTUFYX05VTU5PREVTXTsKLWJvb3RtZW1fZGF0YV90IGJtZW1fZGF0YVtNQVhfTlVNTk9ERVNdOwotdW5zaWduZWQgY2hhciBwZm5uaWRfbWFwW1BGTk5JRF9NQVBfTUFYXTsKK3N0cnVjdCBub2RlX21hcF9kYXRhIG5vZGVfZGF0YVtNQVhfTlVNTk9ERVNdIF9fcmVhZF9tb3N0bHk7Citib290bWVtX2RhdGFfdCBibWVtX2RhdGFbTUFYX05VTU5PREVTXSBfX3JlYWRfbW9zdGx5OwordW5zaWduZWQgY2hhciBwZm5uaWRfbWFwW1BGTk5JRF9NQVBfTUFYXSBfX3JlYWRfbW9zdGx5OwogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZGF0YV9yZXNvdXJjZSA9IHsKQEAgLTU4LDE0ICs1OCwxNCBAQAogCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfTUVNLAogfTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzeXNyYW1fcmVzb3VyY2VzW01BWF9QSFlTTUVNX1JBTkdFU107CitzdGF0aWMgc3RydWN0IHJlc291cmNlIHN5c3JhbV9yZXNvdXJjZXNbTUFYX1BIWVNNRU1fUkFOR0VTXSBfX3JlYWRfbW9zdGx5OwogCiAvKiBUaGUgZm9sbG93aW5nIGFycmF5IGlzIGluaXRpYWxpemVkIGZyb20gdGhlIGZpcm13YXJlIHNwZWNpZmljCiAgKiBpbmZvcm1hdGlvbiByZXRyaWV2ZWQgaW4ga2VybmVsL2ludmVudG9yeS5jLgogICovCiAKLXBoeXNtZW1fcmFuZ2VfdCBwbWVtX3Jhbmdlc1tNQVhfUEhZU01FTV9SQU5HRVNdOwotaW50IG5wbWVtX3JhbmdlczsKK3BoeXNtZW1fcmFuZ2VfdCBwbWVtX3Jhbmdlc1tNQVhfUEhZU01FTV9SQU5HRVNdIF9fcmVhZF9tb3N0bHk7CitpbnQgbnBtZW1fcmFuZ2VzIF9fcmVhZF9tb3N0bHk7CiAKICNpZmRlZiBfX0xQNjRfXwogI2RlZmluZSBNQVhfTUVNICAgICAgICAgKH4wVUwpCkBAIC03Myw3ICs3Myw3IEBACiAjZGVmaW5lIE1BWF9NRU0gICAgICAgICAoMzU4NFUqMTAyNFUqMTAyNFUpCiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1lbV9saW1pdCA9IE1BWF9NRU07CitzdGF0aWMgdW5zaWduZWQgbG9uZyBtZW1fbGltaXQgX19yZWFkX21vc3RseSA9IE1BWF9NRU07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBtZW1fbGltaXRfZnVuYyh2b2lkKQogewpAQCAtMzAwLDYgKzMwMCwxMyBAQAogCQkJbWF4X3BmbiA9IHN0YXJ0X3BmbiArIG5wYWdlczsKIAl9CiAKKwkvKiBJT01NVSBpcyBhbHdheXMgdXNlZCB0byBhY2Nlc3MgImhpZ2ggbWVtIiBvbiB0aG9zZSBib3hlcworCSAqIHRoYXQgY2FuIHN1cHBvcnQgZW5vdWdoIG1lbSB0aGF0IGEgUENJIGRldmljZSBjb3VsZG4ndAorCSAqIGRpcmVjdGx5IERNQSB0byBhbnkgcGh5c2ljYWwgYWRkcmVzc2VzLgorCSAqIElTQSBETUEgc3VwcG9ydCB3aWxsIG5lZWQgdG8gcmV2aXNpdCB0aGlzLgorCSAqLworCW1heF9sb3dfcGZuID0gbWF4X3BmbjsKKwogCWlmICgoYm9vdG1hcF9wZm4gLSBib290bWFwX3N0YXJ0X3BmbikgIT0gYm9vdG1hcF9wYWdlcykgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJXQVJOSU5HISBib290bWFwIHNpemluZyBpcyBtZXNzZWQgdXAhXG4iKTsKIAkJQlVHKCk7CkBAIC00MzEsMTEgKzQzOCwxMSBAQAogI2RlZmluZSBTRVRfTUFQX09GRlNFVCh4KSAoKHZvaWQgKikoKCh1bnNpZ25lZCBsb25nKSh4KSArIFZNX01BUF9PRkZTRVQpIFwKIAkJCQkgICAgICYgfihWTV9NQVBfT0ZGU0VULTEpKSkKIAotdm9pZCAqdm1hbGxvY19zdGFydDsKK3ZvaWQgKnZtYWxsb2Nfc3RhcnQgX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0wodm1hbGxvY19zdGFydCk7CiAKICNpZmRlZiBDT05GSUdfUEExMQotdW5zaWduZWQgbG9uZyBwY3hsX2RtYV9zdGFydDsKK3Vuc2lnbmVkIGxvbmcgcGN4bF9kbWFfc3RhcnQgX19yZWFkX21vc3RseTsKICNlbmRpZgogCiB2b2lkIF9faW5pdCBtZW1faW5pdCh2b2lkKQpAQCAtNDc1LDcgKzQ4Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXVuc2lnbmVkIGxvbmcgKmVtcHR5X3plcm9fcGFnZTsKK3Vuc2lnbmVkIGxvbmcgKmVtcHR5X3plcm9fcGFnZSBfX3JlYWRfbW9zdGx5OwogCiB2b2lkIHNob3dfbWVtKHZvaWQpCiB7CkBAIC05OTgsNyArMTAwNSw3IEBACiB2b2lkIGZsdXNoX3RsYl9hbGwodm9pZCkKIHsKIAlzcGluX2xvY2soJnNpZF9sb2NrKTsKLQlmbHVzaF90bGJfYWxsX2xvY2FsKCk7CisJZmx1c2hfdGxiX2FsbF9sb2NhbChOVUxMKTsKIAlyZWN5Y2xlX3NpZHMoKTsKIAlzcGluX3VubG9jaygmc2lkX2xvY2spOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvbW0vaW9yZW1hcC5jIGIvYXJjaC9wYXJpc2MvbW0vaW9yZW1hcC5jCmluZGV4IDVjN2ExYjMuLmVkZDlhOTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL21tL2lvcmVtYXAuYworKysgYi9hcmNoL3BhcmlzYy9tbS9pb3JlbWFwLmMKQEAgLTEsMTIgKzEsOSBAQAogLyoKICAqIGFyY2gvcGFyaXNjL21tL2lvcmVtYXAuYwogICoKLSAqIFJlLW1hcCBJTyBtZW1vcnkgdG8ga2VybmVsIGFkZHJlc3Mgc3BhY2Ugc28gdGhhdCB3ZSBjYW4gYWNjZXNzIGl0LgotICogVGhpcyBpcyBuZWVkZWQgZm9yIGhpZ2ggUENJIGFkZHJlc3NlcyB0aGF0IGFyZW4ndCBtYXBwZWQgaW4gdGhlCi0gKiA2NDBrLTFNQiBJTyBtZW1vcnkgYXJlYSBvbiBQQydzCi0gKgogICogKEMpIENvcHlyaWdodCAxOTk1IDE5OTYgTGludXMgVG9ydmFsZHMKICAqIChDKSBDb3B5cmlnaHQgMjAwMSBIZWxnZSBEZWxsZXIgPGRlbGxlckBnbXguZGU+CisgKiAoQykgQ29weXJpZ2h0IDIwMDUgS3lsZSBNY01hcnRpbiA8a3lsZUBwYXJpc2MtbGludXgub3JnPgogICovCiAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CkBAIC0xNCw4MSArMTEsMTA3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVtYXBfYXJlYV9wdGUocHRlX3QgKiBwdGUsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBzaXplLAotCXVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIGlubGluZSB2b2lkIAorcmVtYXBfYXJlYV9wdGUocHRlX3QgKnB0ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHNpemUsCisJICAgICAgIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewotCXVuc2lnbmVkIGxvbmcgZW5kOworCXVuc2lnbmVkIGxvbmcgZW5kLCBwZm47CisJcGdwcm90X3QgcGdwcm90ID0gX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1JXIHwgX1BBR0VfRElSVFkgfAorCQkJCSAgIF9QQUdFX0FDQ0VTU0VEIHwgZmxhZ3MpOwogCiAJYWRkcmVzcyAmPSB+UE1EX01BU0s7CisKIAllbmQgPSBhZGRyZXNzICsgc2l6ZTsKIAlpZiAoZW5kID4gUE1EX1NJWkUpCiAJCWVuZCA9IFBNRF9TSVpFOwotCWlmIChhZGRyZXNzID49IGVuZCkKLQkJQlVHKCk7CisKKwlCVUdfT04oYWRkcmVzcyA+PSBlbmQpOworCisJcGZuID0gcGh5c19hZGRyID4+IFBBR0VfU0hJRlQ7CiAJZG8gewotCQlpZiAoIXB0ZV9ub25lKCpwdGUpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgInJlbWFwX2FyZWFfcHRlOiBwYWdlIGFscmVhZHkgZXhpc3RzXG4iKTsKLQkJCUJVRygpOwotCQl9Ci0JCXNldF9wdGUocHRlLCBta19wdGVfcGh5cyhwaHlzX2FkZHIsIF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9SVyB8IAotCQkJCQlfUEFHRV9ESVJUWSB8IF9QQUdFX0FDQ0VTU0VEIHwgZmxhZ3MpKSk7CisJCUJVR19PTighcHRlX25vbmUoKnB0ZSkpOworCisJCXNldF9wdGUocHRlLCBwZm5fcHRlKHBmbiwgcGdwcm90KSk7CisKIAkJYWRkcmVzcyArPSBQQUdFX1NJWkU7Ci0JCXBoeXNfYWRkciArPSBQQUdFX1NJWkU7CisJCXBmbisrOwogCQlwdGUrKzsKIAl9IHdoaWxlIChhZGRyZXNzICYmIChhZGRyZXNzIDwgZW5kKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJlbWFwX2FyZWFfcG1kKHBtZF90ICogcG1kLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQl1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyBpbmxpbmUgaW50IAorcmVtYXBfYXJlYV9wbWQocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHNpemUsCisJICAgICAgIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXVuc2lnbmVkIGxvbmcgZW5kOwogCiAJYWRkcmVzcyAmPSB+UEdESVJfTUFTSzsKKwogCWVuZCA9IGFkZHJlc3MgKyBzaXplOwogCWlmIChlbmQgPiBQR0RJUl9TSVpFKQogCQllbmQgPSBQR0RJUl9TSVpFOworCisJQlVHX09OKGFkZHJlc3MgPj0gZW5kKTsKKwogCXBoeXNfYWRkciAtPSBhZGRyZXNzOwotCWlmIChhZGRyZXNzID49IGVuZCkKLQkJQlVHKCk7CiAJZG8gewotCQlwdGVfdCAqIHB0ZSA9IHB0ZV9hbGxvY19rZXJuZWwocG1kLCBhZGRyZXNzKTsKKwkJcHRlX3QgKnB0ZSA9IHB0ZV9hbGxvY19rZXJuZWwocG1kLCBhZGRyZXNzKTsKIAkJaWYgKCFwdGUpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJcmVtYXBfYXJlYV9wdGUocHRlLCBhZGRyZXNzLCBlbmQgLSBhZGRyZXNzLCBhZGRyZXNzICsgcGh5c19hZGRyLCBmbGFncyk7CisKKwkJcmVtYXBfYXJlYV9wdGUocHRlLCBhZGRyZXNzLCBlbmQgLSBhZGRyZXNzLCAKKwkJCSAgICAgICBhZGRyZXNzICsgcGh5c19hZGRyLCBmbGFncyk7CisKIAkJYWRkcmVzcyA9IChhZGRyZXNzICsgUE1EX1NJWkUpICYgUE1EX01BU0s7CiAJCXBtZCsrOwogCX0gd2hpbGUgKGFkZHJlc3MgJiYgKGFkZHJlc3MgPCBlbmQpKTsKKwogCXJldHVybiAwOwogfQogCi0jaWYgKFVTRV9IUFBBX0lPUkVNQVApCi1zdGF0aWMgaW50IHJlbWFwX2FyZWFfcGFnZXModW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwKLQkJCQkgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorI2lmIFVTRV9IUFBBX0lPUkVNQVAKK3N0YXRpYyBpbnQgCityZW1hcF9hcmVhX3BhZ2VzKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsCisJCSB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7Ci0JaW50IGVycm9yOwotCXBnZF90ICogZGlyOworCXBnZF90ICpkaXI7CisJaW50IGVycm9yID0gMDsKIAl1bnNpZ25lZCBsb25nIGVuZCA9IGFkZHJlc3MgKyBzaXplOwogCisJQlVHX09OKGFkZHJlc3MgPj0gZW5kKTsKKwogCXBoeXNfYWRkciAtPSBhZGRyZXNzOwotCWRpciA9IHBnZF9vZmZzZXQoJmluaXRfbW0sIGFkZHJlc3MpOworCWRpciA9IHBnZF9vZmZzZXRfayhhZGRyZXNzKTsKKwogCWZsdXNoX2NhY2hlX2FsbCgpOwotCWlmIChhZGRyZXNzID49IGVuZCkKLQkJQlVHKCk7CisKIAlkbyB7CisJCXB1ZF90ICpwdWQ7CiAJCXBtZF90ICpwbWQ7Ci0JCXBtZCA9IHBtZF9hbGxvYygmaW5pdF9tbSwgZGlyLCBhZGRyZXNzKTsKKwogCQllcnJvciA9IC1FTk9NRU07CisJCXB1ZCA9IHB1ZF9hbGxvYygmaW5pdF9tbSwgZGlyLCBhZGRyZXNzKTsKKwkJaWYgKCFwdWQpCisJCQlicmVhazsKKworCQlwbWQgPSBwbWRfYWxsb2MoJmluaXRfbW0sIHB1ZCwgYWRkcmVzcyk7CiAJCWlmICghcG1kKQogCQkJYnJlYWs7CisKIAkJaWYgKHJlbWFwX2FyZWFfcG1kKHBtZCwgYWRkcmVzcywgZW5kIC0gYWRkcmVzcywKLQkJCQkJIHBoeXNfYWRkciArIGFkZHJlc3MsIGZsYWdzKSkKKwkJCQkgICBwaHlzX2FkZHIgKyBhZGRyZXNzLCBmbGFncykpCiAJCQlicmVhazsKKwogCQllcnJvciA9IDA7CiAJCWFkZHJlc3MgPSAoYWRkcmVzcyArIFBHRElSX1NJWkUpICYgUEdESVJfTUFTSzsKIAkJZGlyKys7CiAJfSB3aGlsZSAoYWRkcmVzcyAmJiAoYWRkcmVzcyA8IGVuZCkpOworCiAJZmx1c2hfdGxiX2FsbCgpOworCiAJcmV0dXJuIGVycm9yOwogfQogI2VuZGlmIC8qIFVTRV9IUFBBX0lPUkVNQVAgKi8KQEAgLTEyMyw4ICsxNDYsNyBAQAogCiAvKgogICogUmVtYXAgYW4gYXJiaXRyYXJ5IHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UgaW50byB0aGUga2VybmVsIHZpcnR1YWwKLSAqIGFkZHJlc3Mgc3BhY2UuIE5lZWRlZCB3aGVuIHRoZSBrZXJuZWwgd2FudHMgdG8gYWNjZXNzIGhpZ2ggYWRkcmVzc2VzCi0gKiBkaXJlY3RseS4KKyAqIGFkZHJlc3Mgc3BhY2UuCiAgKgogICogTk9URSEgV2UgbmVlZCB0byBhbGxvdyBub24tcGFnZS1hbGlnbmVkIG1hcHBpbmdzIHRvbzogd2Ugd2lsbCBvYnZpb3VzbHkKICAqIGhhdmUgdG8gY29udmVydCB0aGVtIGludG8gYW4gb2Zmc2V0IGluIGEgcGFnZS1hbGlnbmVkIG1hcHBpbmcsIGJ1dCB0aGUKQEAgLTE0OCw4ICsxNzAsOCBAQAogI2VuZGlmCiAKICNlbHNlCi0Jdm9pZCAqIGFkZHI7Ci0Jc3RydWN0IHZtX3N0cnVjdCAqIGFyZWE7CisJdm9pZCAqYWRkcjsKKwlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBsYXN0X2FkZHI7CiAKIAkvKiBEb24ndCBhbGxvdyB3cmFwYXJvdW5kIG9yIHplcm8gc2l6ZSAqLwpAQCAtMTY3LDkgKzE4OSwxMSBAQAogCQl0X2FkZHIgPSBfX3ZhKHBoeXNfYWRkcik7CiAJCXRfZW5kID0gdF9hZGRyICsgKHNpemUgLSAxKTsKIAkgICAKLQkJZm9yKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UodF9hZGRyKTsgcGFnZSA8PSB2aXJ0X3RvX3BhZ2UodF9lbmQpOyBwYWdlKyspCisJCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZSh0X2FkZHIpOyAKKwkJICAgICBwYWdlIDw9IHZpcnRfdG9fcGFnZSh0X2VuZCk7IHBhZ2UrKykgewogCQkJaWYoIVBhZ2VSZXNlcnZlZChwYWdlKSkKIAkJCQlyZXR1cm4gTlVMTDsKKwkJfQogCX0KIAogCS8qCkBAIC0xODUsMTEgKzIwOSwxMyBAQAogCWFyZWEgPSBnZXRfdm1fYXJlYShzaXplLCBWTV9JT1JFTUFQKTsKIAlpZiAoIWFyZWEpCiAJCXJldHVybiBOVUxMOworCiAJYWRkciA9IGFyZWEtPmFkZHI7CiAJaWYgKHJlbWFwX2FyZWFfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGFkZHIsIHBoeXNfYWRkciwgc2l6ZSwgZmxhZ3MpKSB7CiAJCXZmcmVlKGFkZHIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CisKIAlyZXR1cm4gKHZvaWQgX19pb21lbSAqKSAob2Zmc2V0ICsgKGNoYXIgKilhZGRyKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwppbmRleCBkYjkzZGJjLi5kZjMzOGM1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwpAQCAtMjYsOSArMjYsNiBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAotY29uZmlnIFVJRDE2Ci0JYm9vbAotCiBjb25maWcgR0VORVJJQ19IQVJESVJRUwogCWJvb2wKIAlkZWZhdWx0IHkKQEAgLTUwLDcgKzQ3LDcgQEAKIAogY29uZmlnIEVBUkxZX1BSSU5USwogCWJvb2wKLQlkZWZhdWx0IHkgaWYgUFBDNjQKKwlkZWZhdWx0IHkKIAogY29uZmlnIENPTVBBVAogCWJvb2wKQEAgLTc0LDE1ICs3MSwyOCBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIFBQQ19PRgorCWRlZl9ib29sIHkKKworY29uZmlnIFBQQ19VREJHXzE2NTUwCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgR0VORVJJQ19UQlNZTkMKKwlib29sCisJZGVmYXVsdCB5IGlmIFBQQzMyICYmIFNNUAorCWRlZmF1bHQgbgorCiBtZW51ICJQcm9jZXNzb3Igc3VwcG9ydCIKIGNob2ljZQogCXByb21wdCAiUHJvY2Vzc29yIFR5cGUiCiAJZGVwZW5kcyBvbiBQUEMzMgogCWRlZmF1bHQgNnh4CiAKLWNvbmZpZyA2eHgKK2NvbmZpZyBDTEFTU0lDMzIKIAlib29sICI2eHgvN3h4Lzc0eHgiCiAJc2VsZWN0IFBQQ19GUFUKKwlzZWxlY3QgNnh4CiAJaGVscAogCSAgVGhlcmUgYXJlIGZvdXIgZmFtaWxpZXMgb2YgUG93ZXJQQyBjaGlwcyBzdXBwb3J0ZWQuICBUaGUgbW9yZSBjb21tb24KIAkgIHR5cGVzICg2MDEsIDYwMywgNjA0LCA3NDAsIDc1MCwgNzQwMCksIHRoZSBNb3Rvcm9sYSBlbWJlZGRlZApAQCAtOTYsMTIgKzEwNiwyMCBAQAogCiBjb25maWcgUFBDXzUyeHgKIAlib29sICJGcmVlc2NhbGUgNTJ4eCIKKwlzZWxlY3QgNnh4CisJc2VsZWN0IFBQQ19GUFUKIAkKIGNvbmZpZyBQUENfODJ4eAogCWJvb2wgIkZyZWVzY2FsZSA4Mnh4IgorCXNlbGVjdCA2eHgKKwlzZWxlY3QgUFBDX0ZQVQogCiBjb25maWcgUFBDXzgzeHgKIAlib29sICJGcmVlc2NhbGUgODN4eCIKKwlzZWxlY3QgNnh4CisJc2VsZWN0IEZTTF9TT0MKKwlzZWxlY3QgODN4eAorCXNlbGVjdCBQUENfRlBVCiAKIGNvbmZpZyA0MHgKIAlib29sICJBTUNDIDQweCIKQEAgLTEzNyw2ICsxNTUsMTMgQEAKIAlkZXBlbmRzIG9uIFBQQzY0CiAJZGVmX2Jvb2wgeQogCitjb25maWcgNnh4CisJYm9vbAorCisjIHRoaXMgaXMgdGVtcCB0byBoYW5kbGUgY29tcGF0IHdpdGggYXJjaD1wcGMKK2NvbmZpZyA4M3h4CisJYm9vbAorCiBjb25maWcgUFBDX0ZQVQogCWJvb2wKIAlkZWZhdWx0IHkgaWYgUFBDNjQKQEAgLTE2OSw3ICsxOTQsNyBAQAogCiBjb25maWcgQUxUSVZFQwogCWJvb2wgIkFsdGlWZWMgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIDZ4eCB8fCBQT1dFUjQKKwlkZXBlbmRzIG9uIENMQVNTSUMzMiB8fCBQT1dFUjQKIAktLS1oZWxwLS0tCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIGtlcm5lbCBzdXBwb3J0IGZvciB0aGUgQWx0aXZlYyBleHRlbnNpb25zIHRvIHRoZQogCSAgUG93ZXJQQyBwcm9jZXNzb3IuIFRoZSBrZXJuZWwgY3VycmVudGx5IHN1cHBvcnRzIHNhdmluZyBhbmQgcmVzdG9yaW5nCkBAIC0yNDIsNyArMjY3LDcgQEAKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCiBtZW51ICJQbGF0Zm9ybSBzdXBwb3J0IgotCWRlcGVuZHMgb24gUFBDNjQgfHwgNnh4CisJZGVwZW5kcyBvbiBQUEM2NCB8fCBDTEFTU0lDMzIKIAogY2hvaWNlCiAJcHJvbXB0ICJNYWNoaW5lIHR5cGUiCkBAIC0yNzgsNiArMzAzLDcgQEAKIAlzZWxlY3QgUFBDX0k4MjU5CiAJc2VsZWN0IFBQQ19SVEFTCiAJc2VsZWN0IFJUQVNfRVJST1JfTE9HR0lORworCXNlbGVjdCBQUENfVURCR18xNjU1MAogCWRlZmF1bHQgeQogCiBjb25maWcgUFBDX0NIUlAKQEAgLTI4Nyw2ICszMTMsNyBAQAogCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCiAJc2VsZWN0IFBQQ19SVEFTCiAJc2VsZWN0IFBQQ19NUEMxMDYKKwlzZWxlY3QgUFBDX1VEQkdfMTY1NTAKIAlkZWZhdWx0IHkKIAogY29uZmlnIFBQQ19QTUFDCkBAIC0zMDAsNiArMzI3LDcgQEAKIAlib29sCiAJZGVwZW5kcyBvbiBQUENfUE1BQyAmJiBQT1dFUjQKIAlzZWxlY3QgVTNfREFSVAorCXNlbGVjdCBNUElDX0JST0tFTl9VMwogCXNlbGVjdCBHRU5FUklDX1RCU1lOQwogCWRlZmF1bHQgeQogCkBAIC0zMDgsNiArMzM2LDcgQEAKIAlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNICYmIFBQQzMyICYmIEJST0tFTgogCXNlbGVjdCBQUENfSTgyNTkKIAlzZWxlY3QgUFBDX0lORElSRUNUX1BDSQorCXNlbGVjdCBQUENfVURCR18xNjU1MAogCWRlZmF1bHQgeQogCiBjb25maWcgUFBDX01BUExFCkBAIC0zMTYsNiArMzQ1LDcgQEAKIAlzZWxlY3QgVTNfREFSVAogCXNlbGVjdCBNUElDX0JST0tFTl9VMwogCXNlbGVjdCBHRU5FUklDX1RCU1lOQworCXNlbGVjdCBQUENfVURCR18xNjU1MAogCWRlZmF1bHQgbgogCWhlbHAKICAgICAgICAgICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNYXBsZSA5NzBGWCBFdmFsdWF0aW9uIEJvYXJkLgpAQCAtMzI2LDExICszNTYsNyBAQAogCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0gJiYgUFBDNjQKIAlzZWxlY3QgUFBDX1JUQVMKIAlzZWxlY3QgTU1JT19OVlJBTQotCi1jb25maWcgUFBDX09GCi0JYm9vbAotCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0JIyBmb3Igbm93Ci0JZGVmYXVsdCB5CisJc2VsZWN0IFBQQ19VREJHXzE2NTUwCiAKIGNvbmZpZyBYSUNTCiAJZGVwZW5kcyBvbiBQUENfUFNFUklFUwpAQCAtMzg0LDE1ICs0MTAsMTYgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBJQk1FQlVTCisJZGVwZW5kcyBvbiBQUENfUFNFUklFUworCWJvb2wgIlN1cHBvcnQgZm9yIEdYIGJ1cyBiYXNlZCBhZGFwdGVycyIKKwloZWxwCisJICBCdXMgZGV2aWNlIGRyaXZlciBmb3IgR1ggYnVzIGJhc2VkIGFkYXB0ZXJzLgorCiBjb25maWcgUFBDX01QQzEwNgogCWJvb2wKIAlkZWZhdWx0IG4KIAotY29uZmlnIEdFTkVSSUNfVEJTWU5DCi0JYm9vbAotCWRlZmF1bHQgeSBpZiBDT05GSUdfUFBDMzIgJiYgQ09ORklHX1NNUAotCWRlZmF1bHQgbgotCiBzb3VyY2UgImRyaXZlcnMvY3B1ZnJlcS9LY29uZmlnIgogCiBjb25maWcgQ1BVX0ZSRVFfUE1BQwpAQCAtNDczLDggKzUwMCwxMCBAQAogCiBzb3VyY2UgYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9LY29uZmlnCiBzb3VyY2UgYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80eHgvS2NvbmZpZworc291cmNlIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9LY29uZmlnCiBzb3VyY2UgYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L0tjb25maWcKIHNvdXJjZSBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9LY29uZmlnCitzb3VyY2UgYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL0tjb25maWcKIAogbWVudSAiS2VybmVsIG9wdGlvbnMiCiAKQEAgLTU0NCw2ICs1NzMsMTYgQEAKIAkgIHN1cHBvcnQuICBBcyBvZiB0aGlzIHdyaXRpbmcgdGhlIGV4YWN0IGhhcmR3YXJlIGludGVyZmFjZSBpcwogCSAgc3Ryb25nbHkgaW4gZmx1eCwgc28gbm8gZ29vZCByZWNvbW1lbmRhdGlvbiBjYW4gYmUgbWFkZS4KIAorY29uZmlnIENSQVNIX0RVTVAKKwlib29sICJrZXJuZWwgY3Jhc2ggZHVtcHMgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBQUENfTVVMVElQTEFURk9STSAmJiBQUEM2NCAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBCdWlsZCBhIGtlcm5lbCBzdWl0YWJsZSBmb3IgdXNlIGFzIGEga2R1bXAgY2FwdHVyZSBrZXJuZWwuCisJICBUaGUga2VybmVsIHdpbGwgYmUgbGlua2VkIGF0IGEgZGlmZmVyZW50IGFkZHJlc3MgdGhhbiBub3JtYWwsIGFuZAorCSAgc28gY2FuIG9ubHkgYmUgdXNlZCBmb3IgS2R1bXAuCisKKwkgIERvbid0IGNoYW5nZSB0aGlzIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCisKIGNvbmZpZyBFTUJFRERFREJPT1QKIAlib29sCiAJZGVwZW5kcyBvbiA4eHggfHwgODI2MApAQCAtNTc4LDExICs2MTcsMTIgQEAKIAlkZXBlbmRzIG9uIFBQQzY0CiAKIGNvbmZpZyBBUkNIX0ZMQVRNRU1fRU5BQkxFCi0gICAgICAgZGVmX2Jvb2wgeQotICAgICAgIGRlcGVuZHMgb24gUFBDNjQgJiYgIU5VTUEKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiAoUFBDNjQgJiYgIU5VTUEpIHx8IFBQQzMyCiAKIGNvbmZpZyBBUkNIX1NQQVJTRU1FTV9FTkFCTEUKIAlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBQUEM2NAogCiBjb25maWcgQVJDSF9TUEFSU0VNRU1fREVGQVVMVAogCWRlZl9ib29sIHkKQEAgLTY5NCw3ICs3MzQsNyBAQAogY29uZmlnIFBQQ19JTkRJUkVDVF9QQ0kKIAlib29sCiAJZGVwZW5kcyBvbiBQQ0kKLQlkZWZhdWx0IHkgaWYgNDB4IHx8IDQ0eCB8fCA4NXh4IHx8IDgzeHgKKwlkZWZhdWx0IHkgaWYgNDB4IHx8IDQ0eCB8fCA4NXh4CiAJZGVmYXVsdCBuCiAKIGNvbmZpZyBFSVNBCkBAIC03MDMsMTMgKzc0MywxNiBAQAogY29uZmlnIFNCVVMKIAlib29sCiAKK2NvbmZpZyBGU0xfU09DCisJYm9vbAorCiAjIFllcyBNQ0EgUlMvNjAwMHMgZXhpc3QgYnV0IExpbnV4LVBQQyBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCBhbnkKIGNvbmZpZyBNQ0EKIAlib29sCiAKIGNvbmZpZyBQQ0kKLQlib29sICJQQ0kgc3VwcG9ydCIgaWYgNDB4IHx8IENQTTIgfHwgODN4eCB8fCA4NXh4IHx8IFBQQ19NUEM1Mnh4IHx8IChFTUJFRERFRCAmJiBQUENfSVNFUklFUykKLQlkZWZhdWx0IHkgaWYgITQweCAmJiAhQ1BNMiAmJiAhOHh4ICYmICFBUFVTICYmICE4M3h4ICYmICE4NXh4CisJYm9vbCAiUENJIHN1cHBvcnQiIGlmIDQweCB8fCBDUE0yIHx8IFBQQ184M3h4IHx8IDg1eHggfHwgUFBDX01QQzUyeHggfHwgKEVNQkVEREVEICYmIFBQQ19JU0VSSUVTKQorCWRlZmF1bHQgeSBpZiAhNDB4ICYmICFDUE0yICYmICE4eHggJiYgIUFQVVMgJiYgIVBQQ184M3h4ICYmICE4NXh4CiAJZGVmYXVsdCBQQ0lfUEVSTUVESUEgaWYgITR4eCAmJiAhQ1BNMiAmJiAhOHh4ICYmIEFQVVMKIAlkZWZhdWx0IFBDSV9RU1BBTiBpZiAhNHh4ICYmICFDUE0yICYmIDh4eAogCWhlbHAKQEAgLTcyMiwxMSArNzY1LDYgQEAKIAlib29sCiAJZGVmYXVsdCBQQ0kKIAotY29uZmlnIE1QQzgzeHhfUENJMgotCWJvb2wgIiAgU3VwcHJ0IGZvciAybmQgUENJIGhvc3QgY29udHJvbGxlciIKLQlkZXBlbmRzIG9uIFBDSSAmJiBNUEM4MzR4Ci0JZGVmYXVsdCB5IGlmIE1QQzgzNHhfU1lTCi0KIGNvbmZpZyBQQ0lfUVNQQU4KIAlib29sICJRU3BhbiBQQ0kiCiAJZGVwZW5kcyBvbiAhNHh4ICYmICFDUE0yICYmIDh4eApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL0tjb25maWcuZGVidWcgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZy5kZWJ1ZwppbmRleCAzMGEzMGJmLi45MjU0ODA2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZy5kZWJ1ZwpAQCAtMTE1LDQgKzExNSw0NiBAQAogCWRlcGVuZHMgb24gSUJNX09DUCB8fCBYSUxJTlhfT0NQCiAJZGVmYXVsdCB5CiAKK2Nob2ljZQorCXByb21wdCAiRWFybHkgZGVidWdnaW5nIChkYW5nZXJvdXMpIgorCWJvb2wKKwlvcHRpb25hbAorCWhlbHAKKwkgIEVuYWJsZSBlYXJseSBkZWJ1Z2dpbmcuIENhcmVmdWwsIGlmIHlvdSBlbmFibGUgZGVidWdnaW5nIGZvciB0aGUKKwkgIHdyb25nIHR5cGUgb2YgbWFjaGluZSB5b3VyIGtlcm5lbCBfd2lsbCBub3QgYm9vdF8uCisKK2NvbmZpZyBQUENfRUFSTFlfREVCVUdfTFBBUgorCWJvb2wgIkxQQVIgSFYgQ29uc29sZSIKKwlkZXBlbmRzIG9uIFBQQ19QU0VSSUVTCisJaGVscAorCSAgU2VsZWN0IHRoaXMgdG8gZW5hYmxlIGVhcmx5IGRlYnVnZ2luZyBmb3IgYSBtYWNoaW5lIHdpdGggYSBIVkMKKwkgIGNvbnNvbGUgb24gdnRlcm0gMC4KKworY29uZmlnIFBQQ19FQVJMWV9ERUJVR19HNQorCWJvb2wgIkFwcGxlIEc1IgorCWRlcGVuZHMgb24gUFBDX1BNQUM2NAorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIHRvIGVuYWJsZSBlYXJseSBkZWJ1Z2dpbmcgZm9yIEFwcGxlIEc1IG1hY2hpbmVzLgorCitjb25maWcgUFBDX0VBUkxZX0RFQlVHX1JUQVMKKwlib29sICJSVEFTIFBhbmVsIgorCWRlcGVuZHMgb24gUFBDX1JUQVMKKwloZWxwCisJICBTZWxlY3QgdGhpcyB0byBlbmFibGUgZWFybHkgZGVidWdnaW5nIHZpYSB0aGUgUlRBUyBwYW5lbC4KKworY29uZmlnIFBQQ19FQVJMWV9ERUJVR19NQVBMRQorCWJvb2wgIk1hcGxlIHJlYWwgbW9kZSIKKwlkZXBlbmRzIG9uIFBQQ19NQVBMRQorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIHRvIGVuYWJsZSBlYXJseSBkZWJ1Z2dpbmcgZm9yIE1hcGxlLgorCitjb25maWcgUFBDX0VBUkxZX0RFQlVHX0lTRVJJRVMKKwlib29sICJpU2VyaWVzIEhWIENvbnNvbGUiCisJZGVwZW5kcyBvbiBQUENfSVNFUklFUworCWhlbHAKKwkgIFNlbGVjdCB0aGlzIHRvIGVuYWJsZSBlYXJseSBkZWJ1Z2dpbmcgZm9yIGxlZ2FjeSBpU2VyaWVzLiBZb3UgbmVlZAorCSAgdG8gaGl0ICJDdHJsLXggQ3RybC14IiB0byBzZWUgdGhlIG1lc3NhZ2VzIG9uIHRoZSBjb25zb2xlLgorCitlbmRjaG9pY2UKKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL01ha2VmaWxlCmluZGV4IGExM2ViNTcuLjQ0ZGQ4MmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKQEAgLTc2LDggKzc2LDcgQEAKIENIRUNLRkxBR1MJKz0gLW0kKFNaKSAtRF9fcG93ZXJwY19fIC1EX19wb3dlcnBjJChTWilfXwogCiBpZmVxICgkKENPTkZJR19QUEM2NCkseSkKLUdDQ19WRVJTSU9OICAgICA6PSAkKGNhbGwgY2MtdmVyc2lvbikKLUdDQ19CUk9LRU5fVkVDCTo9ICQoc2hlbGwgaWYgWyAkKEdDQ19WRVJTSU9OKSAtbHQgMDQwMCBdIDsgdGhlbiBlY2hvICJ5IjsgZmkpCitHQ0NfQlJPS0VOX1ZFQwk6PSAkKHNoZWxsIGlmIFsgJChjYWxsIGNjLXZlcnNpb24pIC1sdCAwNDAwIF0gOyB0aGVuIGVjaG8gInkiOyBmaSkKIAogaWZlcSAoJChDT05GSUdfUE9XRVI0X09OTFkpLHkpCiBpZmVxICgkKENPTkZJR19BTFRJVkVDKSx5KQpAQCAtMTQwLDE4ICsxMzksMTUgQEAKIAogZHJpdmVycy0kKENPTkZJR19PUFJPRklMRSkJKz0gYXJjaC9wb3dlcnBjL29wcm9maWxlLwogCi1kZWZhdWx0aW1hZ2UtJChDT05GSUdfUFBDMzIpCTo9IHpJbWFnZQorIyBEZWZhdWx0IHRvIHpJbWFnZSwgb3ZlcnJpZGUgd2hlbiBuZWVkZWQKK2RlZmF1bHRpbWFnZS15CQkJOj0gekltYWdlCiBkZWZhdWx0aW1hZ2UtJChDT05GSUdfUFBDX0lTRVJJRVMpIDo9IHZtbGludXgKLWRlZmF1bHRpbWFnZS0kKENPTkZJR19QUENfUFNFUklFUykgOj0gekltYWdlCiBLQlVJTERfSU1BR0UgOj0gJChkZWZhdWx0aW1hZ2UteSkKIGFsbDogJChLQlVJTERfSU1BR0UpCiAKIENQUEZMQUdTX3ZtbGludXgubGRzCTo9IC1VcG93ZXJwYwogCi0jIEFsbCB0aGUgaW5zdHJ1Y3Rpb25zIHRhbGsgYWJvdXQgIm1ha2UgYnpJbWFnZSIuCi1iekltYWdlOiB6SW1hZ2UKLQotQk9PVF9UQVJHRVRTID0gekltYWdlIHpJbWFnZS5pbml0cmQgem5ldGJvb3Qgem5ldGJvb3QuaW5pdHJkIHZtbGludXguc20KK0JPT1RfVEFSR0VUUyA9IHpJbWFnZSB6SW1hZ2UuaW5pdHJkIHpuZXRib290IHpuZXRib290LmluaXRyZCB2bWxpbnV4LnNtIHVJbWFnZQogCiAuUEhPTlk6ICQoQk9PVF9UQVJHRVRTKQogCkBAIC0xODksMTAgKzE4NSw5IEBACiAjIEVuc3VyZSB0aGlzIGlzIGJpbnV0aWxzIDIuMTIuMSAob3IgMi4xMi45MC4wLjcpIG9yIGxhdGVyIGZvciBhbHRpdmVjCiAjIGluc3RydWN0aW9ucy4KICMgZ2NjLTMuNCBhbmQgYmludXRpbHMtMi4xNCBhcmUgYSBmYXRhbCBjb21iaW5hdGlvbi4KLUdDQ19WRVJTSU9OCTo9ICQoY2FsbCBjYy12ZXJzaW9uKQogCiBjaGVja2JpbjoKLQlAaWYgdGVzdCAiJChHQ0NfVkVSU0lPTikiID0gIjAzMDQiIDsgdGhlbiBcCisJQGlmIHRlc3QgIiQoY2FsbCBjYy12ZXJzaW9uKSIgPSAiMDMwNCIgOyB0aGVuIFwKIAkJaWYgISAvYmluL2VjaG8gbWZ0YiA1IHwgJChBUykgLXYgLW1wcGMgLW1hbnkgLW8gJChUT1VUKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuIFwKIAkJCWVjaG8gLW4gJyoqKiAke1ZFUlNJT059LiR7UEFUQ0hMRVZFTH0ga2VybmVscyBubyBsb25nZXIgYnVpbGQgJzsgXAogCQkJZWNobyAnY29ycmVjdGx5IHdpdGggZ2NjLTMuNCBhbmQgeW91ciB2ZXJzaW9uIG9mIGJpbnV0aWxzLic7IFwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290Ly5naXRpZ25vcmUgYi9hcmNoL3Bvd2VycGMvYm9vdC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YzlhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMjAgQEAKK2FkZG5vdGUKK2luZmJsb2NrLmMKK2luZmJsb2NrLmgKK2luZmNvZGVzLmMKK2luZmNvZGVzLmgKK2luZmZhc3QuYworaW5mZmFzdC5oCitpbmZsYXRlLmMKK2luZnRyZWVzLmMKK2luZnRyZWVzLmgKK2luZnV0aWwuYworaW5mdXRpbC5oCitrZXJuZWwtdm1saW51eC5zdHJpcC5jCitrZXJuZWwtdm1saW51eC5zdHJpcC5negordUltYWdlCit6SW1hZ2UKK3pJbWFnZS52bW9kZQoremNvbmYuaAoremxpYi5oCit6dXRpbC5oCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCmluZGV4IDk3NzBmNTguLjg0MGFlNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCkBAIC0yNSw4ICsyNSw5IEBACiBCT09UQ0ZMQUdTCTo9ICQoSE9TVENGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyAtaXN5c3RlbSBcCiAJCSAgICQoc2hlbGwgJChDUk9TUzMyQ0MpIC1wcmludC1maWxlLW5hbWU9aW5jbHVkZSkgLWZQSUMKIEJPT1RBRkxBR1MJOj0gLURfX0FTU0VNQkxZX18gJChCT09UQ0ZMQUdTKSAtdHJhZGl0aW9uYWwgLW5vc3RkaW5jCi1CT09UTEZMQUdTCTo9IC1UICQoc3JjdHJlZSkvJChzcmMpL3pJbWFnZS5sZHMKIE9CSkNPUFlGTEFHUyAgICA6PSBjb250ZW50cyxhbGxvYyxsb2FkLHJlYWRvbmx5LGRhdGEKK09CSkNPUFlfQ09GRl9BUkdTIDo9IC1PIGFpeGNvZmYtcnM2MDAwIC0tc2V0LXN0YXJ0IDB4NTAwMDAwCitPQkpDT1BZX01JQl9BUkdTICA6PSAtTyBhaXhjb2ZmLXJzNjAwMCAtUiAuc3RhYiAtUiAuc3RhYnN0ciAtUiAuY29tbWVudAogCiB6bGliICAgICAgIDo9IGluZmJsb2NrLmMgaW5mY29kZXMuYyBpbmZmYXN0LmMgaW5mbGF0ZS5jIGluZnRyZWVzLmMgaW5mdXRpbC5jCiB6bGliaGVhZGVyIDo9IGluZmJsb2NrLmggaW5mY29kZXMuaCBpbmZmYXN0LmggaW5mdHJlZXMuaCBpbmZ1dGlsLmgKQEAgLTM1LDcgKzM2LDcgQEAKICQoYWRkcHJlZml4ICQob2JqKS8sJCh6bGliKSBtYWluLm8pOiAkKGFkZHByZWZpeCAkKG9iaikvLCQoemxpYmxpbnV4aGVhZGVyKSkgJChhZGRwcmVmaXggJChvYmopLywkKHpsaWJoZWFkZXIpKQogIyQoYWRkcHJlZml4ICQob2JqKS8sbWFpbi5vKTogJChhZGRwcmVmaXggJChvYmopLyx6bGliLmgpCiAKLXNyYy1ib290IDo9IHN0cmluZy5TIHByb20uYyBtYWluLmMgZGl2NjQuUyBjcnQwLlMKK3NyYy1ib290IDo9IGNydDAuUyBzdHJpbmcuUyBwcm9tLmMgc3RkaW8uYyBtYWluLmMgZGl2NjQuUwogc3JjLWJvb3QgKz0gJCh6bGliKQogc3JjLWJvb3QgOj0gJChhZGRwcmVmaXggJChvYmopLywgJChzcmMtYm9vdCkpCiBvYmotYm9vdCA6PSAkKGFkZHN1ZmZpeCAubywgJChiYXNlbmFtZSAkKHNyYy1ib290KSkpCkBAIC03MCw3ICs3MSw3IEBACiAgICAgICBjbWRfYm9vdGFzID0gJChDUk9TUzMyQ0MpIC1XcCwtTUQsJChkZXBmaWxlKSAkKEJPT1RBRkxBR1MpIC1jIC1vICRAICQ8CiAKIHF1aWV0X2NtZF9ib290bGQgPSBCT09UTEQgICRACi0gICAgICBjbWRfYm9vdGxkID0gJChDUk9TUzMyTEQpICQoQk9PVExGTEFHUykgLW8gJEAgJCgyKQorICAgICAgY21kX2Jvb3RsZCA9ICQoQ1JPU1MzMkxEKSAtVCAkKHNyY3RyZWUpLyQoc3JjKS8kKDMpIC1vICRAICQoMikKIAogJChwYXRzdWJzdCAlLmMsJS5vLCAkKGZpbHRlciAlLmMsICQoc3JjLWJvb3QpKSk6ICUubzogJS5jCiAJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGJvb3RjYykKQEAgLTg3LDEyICs4OCwxNCBAQAogc3JjLXNlYyA9ICQoZm9yZWFjaCBzZWN0aW9uLCAkKDEpLCAkKHBhdHN1YnN0ICUsJChvYmopL2tlcm5lbC0lLmMsICQoc2VjdGlvbikpKQogZ3otc2VjICA9ICQoZm9yZWFjaCBzZWN0aW9uLCAkKDEpLCAkKHBhdHN1YnN0ICUsJChvYmopL2tlcm5lbC0lLmd6LCAkKHNlY3Rpb24pKSkKIAotaG9zdHByb2dzLXkJCTo9IGFkZG5vdGUgYWRkUmFtRGlzawotdGFyZ2V0cyAJCSs9IHpJbWFnZS52bW9kZSB6SW1hZ2UuaW5pdHJkLnZtb2RlIHpJbWFnZSB6SW1hZ2UuaW5pdHJkIFwKLQkJCSAgICQocGF0c3Vic3QgJChvYmopLyUsJSwgJChjYWxsIG9iai1zZWMsICQocmVxdWlyZWQpICQoaW5pdHJkKSkpIFwKLQkJCSAgICQocGF0c3Vic3QgJChvYmopLyUsJSwgJChjYWxsIHNyYy1zZWMsICQocmVxdWlyZWQpICQoaW5pdHJkKSkpIFwKLQkJCSAgICQocGF0c3Vic3QgJChvYmopLyUsJSwgJChjYWxsIGd6LXNlYywgJChyZXF1aXJlZCkgJChpbml0cmQpKSkgXAotCQkJICAgdm1saW51eC5pbml0cmQKK2hvc3Rwcm9ncy15CQk6PSBhZGRub3RlIGFkZFJhbURpc2sgaGFjay1jb2ZmCisKK3RhcmdldHMgKz0gekltYWdlLnZtb2RlIHpJbWFnZS5pbml0cmQudm1vZGUgekltYWdlIHpJbWFnZS5pbml0cmQgXAorCSAgIHpJbWFnZS5jb2ZmIHpJbWFnZS5pbml0cmQuY29mZiBtaWJvb3QuaW1hZ2UgbWlib290LmluaXRyZC5pbWFnZSBcCisJICAgJChwYXRzdWJzdCAkKG9iaikvJSwlLCAkKGNhbGwgb2JqLXNlYywgJChyZXF1aXJlZCkgJChpbml0cmQpKSkgXAorCSAgICQocGF0c3Vic3QgJChvYmopLyUsJSwgJChjYWxsIHNyYy1zZWMsICQocmVxdWlyZWQpICQoaW5pdHJkKSkpIFwKKwkgICAkKHBhdHN1YnN0ICQob2JqKS8lLCUsICQoY2FsbCBnei1zZWMsICQocmVxdWlyZWQpICQoaW5pdHJkKSkpIFwKKwkgICB2bWxpbnV4LmluaXRyZCBkdW1teS5vCiBleHRyYS15CQkJOj0gaW5pdHJkLm8KIAogcXVpZXRfY21kX3JhbWRpc2sgPSBSQU1ESVNLICRACkBAIC0xMTQsNiArMTE3LDE0IEBACiBxdWlldF9jbWRfYWRkbm90ZSA9IEFERE5PVEUgJEAKICAgICAgIGNtZF9hZGRub3RlID0gJChvYmopL2FkZG5vdGUgJEAKIAorcXVpZXRfY21kX2dlbi1taWJvb3QgPSBHRU4gICAgICRACisgICAgICBjbWRfZ2VuLW1pYm9vdCA9ICQoT0JKQ09QWSkgJChPQkpDT1BZX01JQl9BUkdTKSBcCisJCSAgICAgICAtLWFkZC1zZWN0aW9uPSQxPSQod29yZCAyLCAkXikgJDwgJEAKKworcXVpZXRfY21kX2dlbmNvZmYgPSBDT0ZGICAgICRACisgICAgICBjbWRfZ2VuY29mZiA9ICQoT0JKQ09QWSkgJChPQkpDT1BZX0NPRkZfQVJHUykgJEAgJiYgXAorCQkgICAgJChvYmopL2hhY2stY29mZiAkQAorCiAkKGNhbGwgZ3otc2VjLCAkKHJlcXVpcmVkKSk6ICQob2JqKS9rZXJuZWwtJS5nejogJQogCSQoY2FsbCBpZl9jaGFuZ2VkLGd6aXApCiAKQEAgLTEyNywyMyArMTM4LDc4IEBACiAJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGJvb3RjYykKIAkkKGNhbGwgY21kLGFkZHNlY3Rpb24pCiAKLSQob2JqKS96SW1hZ2Uudm1vZGU6IG9iai1ib290ICs9ICQoY2FsbCBvYmotc2VjLCAkKHJlcXVpcmVkKSkKKyQob2JqKS96SW1hZ2Uudm1vZGUgJChvYmopL3pJbWFnZS5jb2ZmOiBvYmotYm9vdCArPSAkKGNhbGwgb2JqLXNlYywgJChyZXF1aXJlZCkpCiAkKG9iaikvekltYWdlLnZtb2RlOiAkKGNhbGwgb2JqLXNlYywgJChyZXF1aXJlZCkpICQob2JqLWJvb3QpICQoc3JjdHJlZSkvJChzcmMpL3pJbWFnZS5sZHMKLQkkKGNhbGwgY21kLGJvb3RsZCwkKG9iai1ib290KSkKKwkkKGNhbGwgY21kLGJvb3RsZCwkKG9iai1ib290KSx6SW1hZ2UubGRzKQogCi0kKG9iaikvekltYWdlLmluaXRyZC52bW9kZTogb2JqLWJvb3QgKz0gJChjYWxsIG9iai1zZWMsICQocmVxdWlyZWQpICQoaW5pdHJkKSkKKyQob2JqKS96SW1hZ2UuaW5pdHJkLnZtb2RlICQob2JqKS96SW1hZ2UuaW5pdHJkLmNvZmY6IG9iai1ib290ICs9ICQoY2FsbCBvYmotc2VjLCAkKHJlcXVpcmVkKSAkKGluaXRyZCkpCiAkKG9iaikvekltYWdlLmluaXRyZC52bW9kZTogJChjYWxsIG9iai1zZWMsICQocmVxdWlyZWQpICQoaW5pdHJkKSkgJChvYmotYm9vdCkgJChzcmN0cmVlKS8kKHNyYykvekltYWdlLmxkcwotCSQoY2FsbCBjbWQsYm9vdGxkLCQob2JqLWJvb3QpKQorCSQoY2FsbCBjbWQsYm9vdGxkLCQob2JqLWJvb3QpLHpJbWFnZS5sZHMpCiAKLSQob2JqKS96SW1hZ2U6ICQob2JqKS96SW1hZ2Uudm1vZGUgJChvYmopL2FkZG5vdGUKKyMgRm9yIDMyLWJpdCBwb3dlcm1hY3MsIGJ1aWxkIHRoZSBDT0ZGIGFuZCBtaWJvb3QgaW1hZ2VzCisjIGFzIHdlbGwgYXMgdGhlIEVMRiBpbWFnZXMuCitjb2ZmaW1hZ2UtJChDT05GSUdfUFBDX1BNQUMpLSQoQ09ORklHX1BQQzMyKSA6PSAkKG9iaikvekltYWdlLmNvZmYKK2NvZmZyZGltZy0kKENPTkZJR19QUENfUE1BQyktJChDT05GSUdfUFBDMzIpIDo9ICQob2JqKS96SW1hZ2UuaW5pdHJkLmNvZmYKK21pYm9vdGltZy0kKENPTkZJR19QUENfUE1BQyktJChDT05GSUdfUFBDMzIpIDo9ICQob2JqKS9taWJvb3QuaW1hZ2UKK21pYnJkaW1nLSQoQ09ORklHX1BQQ19QTUFDKS0kKENPTkZJR19QUEMzMikgIDo9ICQob2JqKS9taWJvb3QuaW5pdHJkLmltYWdlCisKKyQob2JqKS96SW1hZ2U6ICQob2JqKS96SW1hZ2Uudm1vZGUgJChvYmopL2FkZG5vdGUgJChjb2ZmaW1hZ2UteS15KSBcCisJCQkkKG1pYm9vdGltZy15LXkpCiAJQGNwIC1mICQ8ICRACiAJJChjYWxsIGlmX2NoYW5nZWQsYWRkbm90ZSkKIAotJChvYmopL3pJbWFnZS5pbml0cmQ6ICQob2JqKS96SW1hZ2UuaW5pdHJkLnZtb2RlICQob2JqKS9hZGRub3RlCiskKG9iaikvekltYWdlLmluaXRyZDogJChvYmopL3pJbWFnZS5pbml0cmQudm1vZGUgJChvYmopL2FkZG5vdGUgXAorCQkJJChjb2ZmcmRpbWcteS15KSAkKG1pYnJkaW1nLXkteSkKIAlAY3AgLWYgJDwgJEAKIAkkKGNhbGwgaWZfY2hhbmdlZCxhZGRub3RlKQogCiskKG9iaikvekltYWdlLmNvZmY6ICQoY2FsbCBvYmotc2VjLCAkKHJlcXVpcmVkKSkgJChvYmotYm9vdCkgXAorCQkJJChzcmN0cmVlKS8kKHNyYykvekltYWdlLmNvZmYubGRzICQob2JqKS9oYWNrLWNvZmYKKwkkKGNhbGwgY21kLGJvb3RsZCwkKG9iai1ib290KSx6SW1hZ2UuY29mZi5sZHMpCisJJChjYWxsIGNtZCxnZW5jb2ZmKQorCiskKG9iaikvekltYWdlLmluaXRyZC5jb2ZmOiAkKGNhbGwgb2JqLXNlYywgJChyZXF1aXJlZCkgJChpbml0cmQpKSAkKG9iai1ib290KSBcCisJCQkgICAkKHNyY3RyZWUpLyQoc3JjKS96SW1hZ2UuY29mZi5sZHMgJChvYmopL2hhY2stY29mZgorCSQoY2FsbCBjbWQsYm9vdGxkLCQob2JqLWJvb3QpLHpJbWFnZS5jb2ZmLmxkcykKKwkkKGNhbGwgY21kLGdlbmNvZmYpCisKKyQob2JqKS9taWJvb3QuaW1hZ2U6ICQob2JqKS9kdW1teS5vICQob2JqKS92bWxpbnV4Lmd6CisJJChjYWxsIGNtZCxnZW4tbWlib290LGltYWdlKQorCiskKG9iaikvbWlib290LmluaXRyZC5pbWFnZTogJChvYmopL21pYm9vdC5pbWFnZSAkKGltYWdlcykvcmFtZGlzay5pbWFnZS5negorCSQoY2FsbCBjbWQsZ2VuLW1pYm9vdCxpbml0cmQpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBidWlsZCB1LWJvb3QgaW1hZ2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3F1aWV0X2NtZF9teWd6aXAgPSBHWklQICRACitjbWRfbXlnemlwID0gZ3ppcCAtZiAtOSA8ICQ8ID4gJEAuJCQkJCAmJiBtdiAkQC4kJCQkICRACisKK3F1aWV0X2NtZF9vYmpiaW4gPSBPQkpDT1BZICRACisgICAgICBjbWRfb2JqYmluID0gJChPQkpDT1BZKSAtTyBiaW5hcnkgJDwgJEAKKworcXVpZXRfY21kX3VpbWFnZSA9IFVJTUFHRSAkQAorICAgICAgY21kX3VpbWFnZSA9ICQoQ09ORklHX1NIRUxMKSAkKE1LSU1BR0UpIC1BIHBwYyAtTyBsaW51eCAtVCBrZXJuZWwgXAorICAgICAgICAgICAgICAgLUMgZ3ppcCAtYSAwMDAwMDAwMCAtZSAwMDAwMDAwMCAtbiAnTGludXgtJChLRVJORUxSRUxFQVNFKScgXAorICAgICAgICAgICAgICAgLWQgJDwgJEAKKworTUtJTUFHRQkJOj0gJChzcmN0cmVlKS9zY3JpcHRzL21rdWJvb3Quc2gKK3RhcmdldHMJCSs9IHVJbWFnZQorZXh0cmEteQkJKz0gdm1saW51eC5iaW4gdm1saW51eC5negorCiskKG9iaikvdm1saW51eC5iaW46IHZtbGludXggRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxvYmpiaW4pCisKKyQob2JqKS92bWxpbnV4Lmd6OiAkKG9iaikvdm1saW51eC5iaW4gRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxteWd6aXApCisKKyQob2JqKS91SW1hZ2U6ICQob2JqKS92bWxpbnV4Lmd6CisJJChRKXJtIC1mICRACisJJChjYWxsIGNtZCx1aW1hZ2UpCisJQGVjaG8gLW4gJyAgSW1hZ2U6ICRAICcKKwlAaWYgWyAtZiAkQCBdOyB0aGVuIGVjaG8gJ2lzIHJlYWR5JyA7IGVsc2UgZWNobyAnbm90IG1hZGUnOyBmaQorCiBpbnN0YWxsOiAkKENPTkZJR1VSRSkgJChCT09USU1BR0UpCiAJc2ggLXggJChzcmN0cmVlKS8kKHNyYykvaW5zdGFsbC5zaCAiJChLRVJORUxSRUxFQVNFKSIgdm1saW51eCBTeXN0ZW0ubWFwICIkKElOU1RBTExfUEFUSCkiICIkKEJPT1RJTUFHRSkiCiAKLWNsZWFuLWZpbGVzIDo9ICQoYWRkcHJlZml4ICQob2JqdHJlZSkvLCAkKG9iai1ib290KSB2bWxpbnV4LnN0cmlwKQorY2xlYW4tZmlsZXMgKz0gJChhZGRwcmVmaXggJChvYmp0cmVlKS8sICQob2JqLWJvb3QpIHZtbGludXguc3RyaXApCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9jcnQwLlMgYi9hcmNoL3Bvd2VycGMvYm9vdC9jcnQwLlMKaW5kZXggZDJmMmFjZS4uZTAxOTJjMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3J0MC5TCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2NydDAuUwpAQCAtMTIsMTcgKzEyLDIzIEBACiAjaW5jbHVkZSAicHBjX2FzbS5oIgogCiAJLnRleHQKKwkvKiBhIHByb2NlZHVyZSBkZXNjcmlwdG9yIHVzZWQgd2hlbiBib290aW5nIHRoaXMgYXMgYSBDT0ZGIGZpbGUgKi8KK196aW1hZ2Vfc3RhcnRfb3BkOgorCS5sb25nCV96aW1hZ2Vfc3RhcnQsIDAsIDAsIDAKKwogCS5nbG9ibAlfemltYWdlX3N0YXJ0CiBfemltYWdlX3N0YXJ0OgorCS8qIFdvcmsgb3V0IHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgYWRkcmVzcyB3ZSB3ZXJlIGxpbmtlZCBhdAorCSAgIGFuZCB0aGUgYWRkcmVzcyB3aGVyZSB3ZSdyZSBydW5uaW5nLiAqLwogCWJsCTFmCi0KLTE6Ci0JbWZscglyMAorMToJbWZscglyMAogCWxpcwlyOSwxYkBoYQogCWFkZGkJcjkscjksMWJAbAogCXN1YmYuCXIwLHI5LHIwCi0JYmVxCTNmCisJYmVxCTNmCQkvKiBpZiBydW5uaW5nIGF0IHNhbWUgYWRkcmVzcyBhcyBsaW5rZWQgKi8KIAorCS8qIFRoZSAuZ290MiBzZWN0aW9uIGNvbnRhaW5zIGEgbGlzdCBvZiBhZGRyZXNzZXMsIHNvIGFkZAorCSAgIHRoZSBhZGRyZXNzIG9mZnNldCBvbnRvIGVhY2ggZW50cnkuICovCiAJbGlzCXI5LF9fZ290Ml9zdGFydEBoYQogCWFkZGkJcjkscjksX19nb3QyX3N0YXJ0QGwKIAlsaXMJcjgsX19nb3QyX2VuZEBoYQpAQCAtMzIsMTUgKzM4LDE0IEBACiAJc3J3aS4JcjgscjgsMgogCW10Y3RyCXI4CiAJYWRkCXI5LHIwLHI5Ci0yOgotCWx3eglyOCwwKHI5KQorMjoJbHd6CXI4LDAocjkpCiAJYWRkCXI4LHI4LHIwCiAJc3R3CXI4LDAocjkpCiAJYWRkaQlyOSxyOSw0CiAJYmRuegkyYgogCi0zOgotCWxpcwlyOSxfc3RhcnRAaAorCS8qIERvIGEgY2FjaGUgZmx1c2ggZm9yIG91ciB0ZXh0LCBpbiBjYXNlIE9GIGRpZG4ndCAqLworMzoJbGlzCXI5LF9zdGFydEBoCiAJYWRkCXI5LHIwLHI5CiAJbGlzCXI4LF9ldGV4dEBoYQogCWFkZGkJcjgscjgsX2V0ZXh0QGwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R1bW15LmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdW1teS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZGJmNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdW1teS5jCkBAIC0wLDAgKzEsNCBAQAoraW50IG1haW4odm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2hhY2stY29mZi5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvaGFjay1jb2ZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU1YTY1NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2hhY2stY29mZi5jCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBoYWNrLWNvZmYuYyAtIGhhY2sgdGhlIGhlYWRlciBvZiBhbiB4Y29mZiBmaWxlIHRvIGZpbGwgaW4KKyAqIGEgZmV3IGZpZWxkcyBuZWVkZWQgYnkgdGhlIE9wZW4gRmlybXdhcmUgeGNvZmYgbG9hZGVyIG9uCisgKiBQb3dlciBNYWNzIGJ1dCBub3QgaW5pdGlhbGl6ZWQgYnkgb2JqY29weS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIFBhdWwgTWFja2VycmFzIDE5OTcuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJyczYwMDAuaCIKKworI2RlZmluZSBBT1VUX01BR0lDCTB4MDEwYgorCisjZGVmaW5lIGdldF8xNmJlKHgpCSgoKCh1bnNpZ25lZCBjaGFyICopKHgpKVswXSA8PCA4KSBcCisJCQkgKyAoKHVuc2lnbmVkIGNoYXIgKikoeCkpWzFdKQorI2RlZmluZSBwdXRfMTZiZSh4LCB2KQkoKCh1bnNpZ25lZCBjaGFyICopKHgpKVswXSA9ICh2KSA+PiA4LCBcCisJCQkgKCh1bnNpZ25lZCBjaGFyICopKHgpKVsxXSA9ICh2KSAmIDB4ZmYpCisjZGVmaW5lIGdldF8zMmJlKHgpCSgoKCh1bnNpZ25lZCBjaGFyICopKHgpKVswXSA8PCAyNCkgXAorCQkJICsgKCgodW5zaWduZWQgY2hhciAqKSh4KSlbMV0gPDwgMTYpIFwKKwkJCSArICgoKHVuc2lnbmVkIGNoYXIgKikoeCkpWzJdIDw8IDgpIFwKKwkJCSArICgodW5zaWduZWQgY2hhciAqKSh4KSlbM10pCisKK2ludAorbWFpbihpbnQgYWMsIGNoYXIgKiphdikKK3sKKyAgICBpbnQgZmQ7CisgICAgaW50IGksIG5zZWN0OworICAgIGludCBhb3V0c3o7CisgICAgc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgZmhkcjsKKyAgICBBT1VUSERSIGFvdXQ7CisgICAgc3RydWN0IGV4dGVybmFsX3NjbmhkciBzaGRyOworCisgICAgaWYgKGFjICE9IDIpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBoYWNrLWNvZmYgY29mZi1maWxlXG4iKTsKKwlleGl0KDEpOworICAgIH0KKyAgICBpZiAoKGZkID0gb3BlbihhdlsxXSwgMikpID09IC0xKSB7CisJcGVycm9yKGF2WzJdKTsKKwlleGl0KDEpOworICAgIH0KKyAgICBpZiAocmVhZChmZCwgJmZoZHIsIHNpemVvZihmaGRyKSkgIT0gc2l6ZW9mKGZoZHIpKQorCWdvdG8gcmVhZGVycjsKKyAgICBpID0gZ2V0XzE2YmUoZmhkci5mX21hZ2ljKTsKKyAgICBpZiAoaSAhPSBVODAyVE9DTUFHSUMgJiYgaSAhPSBVODAyV1JNQUdJQyAmJiBpICE9IFU4MDJST01BR0lDKSB7CisJZnByaW50ZihzdGRlcnIsICIlczogbm90IGFuIHhjb2ZmIGZpbGVcbiIsIGF2WzFdKTsKKwlleGl0KDEpOworICAgIH0KKyAgICBhb3V0c3ogPSBnZXRfMTZiZShmaGRyLmZfb3B0aGRyKTsKKyAgICBpZiAocmVhZChmZCwgJmFvdXQsIGFvdXRzeikgIT0gYW91dHN6KQorCWdvdG8gcmVhZGVycjsKKyAgICBuc2VjdCA9IGdldF8xNmJlKGZoZHIuZl9uc2Nucyk7CisgICAgZm9yIChpID0gMDsgaSA8IG5zZWN0OyArK2kpIHsKKwlpZiAocmVhZChmZCwgJnNoZHIsIHNpemVvZihzaGRyKSkgIT0gc2l6ZW9mKHNoZHIpKQorCSAgICBnb3RvIHJlYWRlcnI7CisJaWYgKHN0cmNtcChzaGRyLnNfbmFtZSwgIi50ZXh0IikgPT0gMCkgeworCSAgICBwdXRfMTZiZShhb3V0Lm9fc25lbnRyeSwgaSsxKTsKKwkgICAgcHV0XzE2YmUoYW91dC5vX3NudGV4dCwgaSsxKTsKKwl9IGVsc2UgaWYgKHN0cmNtcChzaGRyLnNfbmFtZSwgIi5kYXRhIikgPT0gMCkgeworCSAgICBwdXRfMTZiZShhb3V0Lm9fc25kYXRhLCBpKzEpOworCX0gZWxzZSBpZiAoc3RyY21wKHNoZHIuc19uYW1lLCAiLmJzcyIpID09IDApIHsKKwkgICAgcHV0XzE2YmUoYW91dC5vX3NuYnNzLCBpKzEpOworCX0KKyAgICB9CisgICAgcHV0XzE2YmUoYW91dC5tYWdpYywgQU9VVF9NQUdJQyk7CisgICAgaWYgKGxzZWVrKGZkLCAobG9uZykgc2l6ZW9mKHN0cnVjdCBleHRlcm5hbF9maWxlaGRyKSwgMCkgPT0gLTEKKwl8fCB3cml0ZShmZCwgJmFvdXQsIGFvdXRzeikgIT0gYW91dHN6KSB7CisJZnByaW50ZihzdGRlcnIsICIlczogd3JpdGUgZXJyb3JcbiIsIGF2WzFdKTsKKwlleGl0KDEpOworICAgIH0KKyAgICBjbG9zZShmZCk7CisgICAgZXhpdCgwKTsKKworcmVhZGVycjoKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiByZWFkIGVycm9yIG9yIGZpbGUgdG9vIHNob3J0XG4iLCBhdlsxXSk7CisgICAgZXhpdCgxKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L21haW4uYyBiL2FyY2gvcG93ZXJwYy9ib290L21haW4uYwppbmRleCA2NGVjOTMxLi41NWVjNTk4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9tYWluLmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvbWFpbi5jCkBAIC0yMSw4ICsyMSw4IEBACiAKIAogLyogVmFsdWUgcGlja2VkIHRvIG1hdGNoIHRoYXQgdXNlZCBieSB5YWJvb3QgKi8KLSNkZWZpbmUgUFJPR19TVEFSVAkweDAxNDAwMDAwCi0jZGVmaW5lIFJBTV9FTkQJCSg1MTI8PDIwKSAvLyBGaXhtZTogdXNlIE9GICovCisjZGVmaW5lIFBST0dfU1RBUlQJMHgwMTQwMDAwMAkvKiBvbmx5IHVzZWQgb24gNjQtYml0IHN5c3RlbXMgKi8KKyNkZWZpbmUgUkFNX0VORAkJKDUxMjw8MjApCS8qIEZpeG1lOiB1c2UgT0YgKi8KICNkZWZpbmUJT05FX01CCQkweDEwMDAwMAogCiBleHRlcm4gY2hhciBfc3RhcnRbXTsKQEAgLTE2MCw2ICsxNjAsMTcgQEAKIAllbGZvZmZzZXQgPSAodW5zaWduZWQgbG9uZyllbGY2NHBoLT5wX29mZnNldDsKIAl2bWxpbnV4LnNpemUgPSAodW5zaWduZWQgbG9uZyllbGY2NHBoLT5wX2ZpbGVzeiArIGVsZm9mZnNldDsKIAl2bWxpbnV4Lm1lbXNpemUgPSAodW5zaWduZWQgbG9uZyllbGY2NHBoLT5wX21lbXN6ICsgZWxmb2Zmc2V0OworCisjaWYgZGVmaW5lZChQUk9HX1NUQVJUKQorCS8qCisJICogTWFpbnRhaW4gYSAibWFnaWMiIG1pbmltdW0gYWRkcmVzcy4gVGhpcyBrZWVwcyBzb21lIG9sZGVyCisJICogZmlybXdhcmUgcGxhdGZvcm1zIHJ1bm5pbmcuCisJICovCisKKwlpZiAoY2xhaW1fYmFzZSA8IFBST0dfU1RBUlQpCisJCWNsYWltX2Jhc2UgPSBQUk9HX1NUQVJUOworI2VuZGlmCisKIAlyZXR1cm4gMTsKIH0KIApAQCAtMjA2LDEyICsyMTcsMTggQEAKIAkJZXhpdCgpOwogCWlmIChnZXRwcm9wKGNob3Nlbl9oYW5kbGUsICJzdGRvdXQiLCAmc3Rkb3V0LCBzaXplb2Yoc3Rkb3V0KSkgIT0gNCkKIAkJZXhpdCgpOwotCXN0ZGVyciA9IHN0ZG91dDsKLQlpZiAoZ2V0cHJvcChjaG9zZW5faGFuZGxlLCAic3RkaW4iLCAmc3RkaW4sIHNpemVvZihzdGRpbikpICE9IDQpCi0JCWV4aXQoKTsKIAogCXByaW50ZigiXG5ccnpJbWFnZSBzdGFydGluZzogbG9hZGVkIGF0IDB4JXAgKHNwOiAweCVwKVxuXHIiLCBfc3RhcnQsIHNwKTsKIAorCS8qCisJICogVGhlIGZpcnN0IGF2YWlsYWJsZSBjbGFpbV9iYXNlIG11c3QgYmUgYWJvdmUgdGhlIGVuZCBvZiB0aGUKKwkgKiB0aGUgbG9hZGVkIGtlcm5lbCB3cmFwcGVyIGZpbGUgKF9zdGFydCB0byBfZW5kIGluY2x1ZGVzIHRoZQorCSAqIGluaXRyZCBpbWFnZSBpZiBpdCBpcyBwcmVzZW50KSBhbmQgcm91bmRlZCB1cCB0byBhIG5pY2UKKwkgKiAxIE1CIGJvdW5kYXJ5IGZvciBnb29kIG1lYXN1cmUuCisJICovCisKKwljbGFpbV9iYXNlID0gX0FMSUdOX1VQKCh1bnNpZ25lZCBsb25nKV9lbmQsIE9ORV9NQik7CisKIAl2bWxpbnV6LmFkZHIgPSAodW5zaWduZWQgbG9uZylfdm1saW51eF9zdGFydDsKIAl2bWxpbnV6LnNpemUgPSAodW5zaWduZWQgbG9uZykoX3ZtbGludXhfZW5kIC0gX3ZtbGludXhfc3RhcnQpOwogCkBAIC0yMjgsMjUgKzI0NSw2IEBACiAJCWV4aXQoKTsKIAl9CiAKLQkvKgotCSAqIFRoZSBmaXJzdCBhdmFpbGFibGUgY2xhaW1fYmFzZSBtdXN0IGJlIGFib3ZlIHRoZSBlbmQgb2YgdGhlCi0JICogdGhlIGxvYWRlZCBrZXJuZWwgd3JhcHBlciBmaWxlIChfc3RhcnQgdG8gX2VuZCBpbmNsdWRlcyB0aGUKLQkgKiBpbml0cmQgaW1hZ2UgaWYgaXQgaXMgcHJlc2VudCkgYW5kIHJvdW5kZWQgdXAgdG8gYSBuaWNlCi0JICogMSBNQiBib3VuZGFyeSBmb3IgZ29vZCBtZWFzdXJlLgotCSAqLwotCi0JY2xhaW1fYmFzZSA9IF9BTElHTl9VUCgodW5zaWduZWQgbG9uZylfZW5kLCBPTkVfTUIpOwotCi0jaWYgZGVmaW5lZChQUk9HX1NUQVJUKQotCS8qCi0JICogTWFpbnRhaW4gYSAibWFnaWMiIG1pbmltdW0gYWRkcmVzcy4gVGhpcyBrZWVwcyBzb21lIG9sZGVyCi0JICogZmlybXdhcmUgcGxhdGZvcm1zIHJ1bm5pbmcuCi0JICovCi0KLQlpZiAoY2xhaW1fYmFzZSA8IFBST0dfU1RBUlQpCi0JCWNsYWltX2Jhc2UgPSBQUk9HX1NUQVJUOwotI2VuZGlmCi0KIAkvKiBXZSBuZWVkIHRvIGNsYWltIHRoZSBtZW1zaXplIHBsdXMgdGhlIGZpbGUgb2Zmc2V0IHNpbmNlIGd6aXAKIAkgKiB3aWxsIGV4cGFuZCB0aGUgaGVhZGVyIChmaWxlIG9mZnNldCksIHRoZW4gdGhlIGtlcm5lbCwgdGhlbgogCSAqIHBvc3NpYmxlIHJ1YmJpc2ggd2UgZG9uJ3QgY2FyZSBhYm91dC4gQnV0IHRoZSBrZXJuZWwgYnNzIG11c3QKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L3Byb20uYyBiL2FyY2gvcG93ZXJwYy9ib290L3Byb20uYwppbmRleCA0YmVhMmY0Li5mYTAwNTc3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9wcm9tLmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvcHJvbS5jCkBAIC0xMyw0ODcgKzEzLDE1MyBAQAogI2luY2x1ZGUgInByb20uaCIKIAogaW50ICgqcHJvbSkodm9pZCAqKTsKK3BoYW5kbGUgY2hvc2VuX2hhbmRsZTsKK2loYW5kbGUgc3Rkb3V0OwogCi12b2lkICpjaG9zZW5faGFuZGxlOwotCi12b2lkICpzdGRpbjsKLXZvaWQgKnN0ZG91dDsKLXZvaWQgKnN0ZGVycjsKLQotCi1pbnQKLXdyaXRlKHZvaWQgKmhhbmRsZSwgdm9pZCAqcHRyLCBpbnQgbmIpCitpbnQgY2FsbF9wcm9tKGNvbnN0IGNoYXIgKnNlcnZpY2UsIGludCBuYXJncywgaW50IG5yZXQsIC4uLikKIHsKKwlpbnQgaTsKIAlzdHJ1Y3QgcHJvbV9hcmdzIHsKLQkJY2hhciAqc2VydmljZTsKKwkJY29uc3QgY2hhciAqc2VydmljZTsKIAkJaW50IG5hcmdzOwogCQlpbnQgbnJldDsKLQkJdm9pZCAqaWhhbmRsZTsKLQkJdm9pZCAqYWRkcjsKLQkJaW50IGxlbjsKLQkJaW50IGFjdHVhbDsKKwkJdW5zaWduZWQgaW50IGFyZ3NbMTJdOwogCX0gYXJnczsKKwl2YV9saXN0IGxpc3Q7CiAKLQlhcmdzLnNlcnZpY2UgPSAid3JpdGUiOwotCWFyZ3MubmFyZ3MgPSAzOwotCWFyZ3MubnJldCA9IDE7Ci0JYXJncy5paGFuZGxlID0gaGFuZGxlOwotCWFyZ3MuYWRkciA9IHB0cjsKLQlhcmdzLmxlbiA9IG5iOwotCWFyZ3MuYWN0dWFsID0gLTE7Ci0JKCpwcm9tKSgmYXJncyk7Ci0JcmV0dXJuIGFyZ3MuYWN0dWFsOworCWFyZ3Muc2VydmljZSA9IHNlcnZpY2U7CisJYXJncy5uYXJncyA9IG5hcmdzOworCWFyZ3MubnJldCA9IG5yZXQ7CisKKwl2YV9zdGFydChsaXN0LCBucmV0KTsKKwlmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKKwkJYXJncy5hcmdzW2ldID0gdmFfYXJnKGxpc3QsIHVuc2lnbmVkIGludCk7CisJdmFfZW5kKGxpc3QpOworCisJZm9yIChpID0gMDsgaSA8IG5yZXQ7IGkrKykKKwkJYXJncy5hcmdzW25hcmdzK2ldID0gMDsKKworCWlmIChwcm9tKCZhcmdzKSA8IDApCisJCXJldHVybiAtMTsKKworCXJldHVybiAobnJldCA+IDApPyBhcmdzLmFyZ3NbbmFyZ3NdOiAwOwogfQogCi1pbnQKLXJlYWQodm9pZCAqaGFuZGxlLCB2b2lkICpwdHIsIGludCBuYikKK2ludCBjYWxsX3Byb21fcmV0KGNvbnN0IGNoYXIgKnNlcnZpY2UsIGludCBuYXJncywgaW50IG5yZXQsCisJCSAgdW5zaWduZWQgaW50ICpyZXRzLCAuLi4pCiB7CisJaW50IGk7CiAJc3RydWN0IHByb21fYXJncyB7Ci0JCWNoYXIgKnNlcnZpY2U7CisJCWNvbnN0IGNoYXIgKnNlcnZpY2U7CiAJCWludCBuYXJnczsKIAkJaW50IG5yZXQ7Ci0JCXZvaWQgKmloYW5kbGU7Ci0JCXZvaWQgKmFkZHI7Ci0JCWludCBsZW47Ci0JCWludCBhY3R1YWw7CisJCXVuc2lnbmVkIGludCBhcmdzWzEyXTsKIAl9IGFyZ3M7CisJdmFfbGlzdCBsaXN0OwogCi0JYXJncy5zZXJ2aWNlID0gInJlYWQiOwotCWFyZ3MubmFyZ3MgPSAzOwotCWFyZ3MubnJldCA9IDE7Ci0JYXJncy5paGFuZGxlID0gaGFuZGxlOwotCWFyZ3MuYWRkciA9IHB0cjsKLQlhcmdzLmxlbiA9IG5iOwotCWFyZ3MuYWN0dWFsID0gLTE7Ci0JKCpwcm9tKSgmYXJncyk7Ci0JcmV0dXJuIGFyZ3MuYWN0dWFsOworCWFyZ3Muc2VydmljZSA9IHNlcnZpY2U7CisJYXJncy5uYXJncyA9IG5hcmdzOworCWFyZ3MubnJldCA9IG5yZXQ7CisKKwl2YV9zdGFydChsaXN0LCByZXRzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKKwkJYXJncy5hcmdzW2ldID0gdmFfYXJnKGxpc3QsIHVuc2lnbmVkIGludCk7CisJdmFfZW5kKGxpc3QpOworCisJZm9yIChpID0gMDsgaSA8IG5yZXQ7IGkrKykKKwkJYXJncy5hcmdzW25hcmdzK2ldID0gMDsKKworCWlmIChwcm9tKCZhcmdzKSA8IDApCisJCXJldHVybiAtMTsKKworCWlmIChyZXRzICE9ICh2b2lkICopIDApCisJCWZvciAoaSA9IDE7IGkgPCBucmV0OyArK2kpCisJCQlyZXRzW2ktMV0gPSBhcmdzLmFyZ3NbbmFyZ3MraV07CisKKwlyZXR1cm4gKG5yZXQgPiAwKT8gYXJncy5hcmdzW25hcmdzXTogMDsKIH0KIAotdm9pZAotZXhpdCgpCitpbnQgd3JpdGUodm9pZCAqaGFuZGxlLCB2b2lkICpwdHIsIGludCBuYikKIHsKLQlzdHJ1Y3QgcHJvbV9hcmdzIHsKLQkJY2hhciAqc2VydmljZTsKLQl9IGFyZ3M7Ci0KLQlmb3IgKDs7KSB7Ci0JCWFyZ3Muc2VydmljZSA9ICJleGl0IjsKLQkJKCpwcm9tKSgmYXJncyk7Ci0JfQorCXJldHVybiBjYWxsX3Byb20oIndyaXRlIiwgMywgMSwgaGFuZGxlLCBwdHIsIG5iKTsKIH0KIAotdm9pZAotcGF1c2Uodm9pZCkKLXsKLQlzdHJ1Y3QgcHJvbV9hcmdzIHsKLQkJY2hhciAqc2VydmljZTsKLQl9IGFyZ3M7Ci0KLQlhcmdzLnNlcnZpY2UgPSAiZW50ZXIiOwotCSgqcHJvbSkoJmFyZ3MpOwotfQotCi12b2lkICoKLWZpbmRkZXZpY2UoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgcHJvbV9hcmdzIHsKLQkJY2hhciAqc2VydmljZTsKLQkJaW50IG5hcmdzOwotCQlpbnQgbnJldDsKLQkJY29uc3QgY2hhciAqZGV2c3BlYzsKLQkJdm9pZCAqcGhhbmRsZTsKLQl9IGFyZ3M7Ci0KLQlhcmdzLnNlcnZpY2UgPSAiZmluZGRldmljZSI7Ci0JYXJncy5uYXJncyA9IDE7Ci0JYXJncy5ucmV0ID0gMTsKLQlhcmdzLmRldnNwZWMgPSBuYW1lOwotCWFyZ3MucGhhbmRsZSA9ICh2b2lkICopIC0xOwotCSgqcHJvbSkoJmFyZ3MpOwotCXJldHVybiBhcmdzLnBoYW5kbGU7Ci19Ci0KLXZvaWQgKgotY2xhaW0odW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxpZ24pCi17Ci0Jc3RydWN0IHByb21fYXJncyB7Ci0JCWNoYXIgKnNlcnZpY2U7Ci0JCWludCBuYXJnczsKLQkJaW50IG5yZXQ7Ci0JCXVuc2lnbmVkIGludCB2aXJ0OwotCQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQkJdW5zaWduZWQgaW50IGFsaWduOwotCQl2b2lkICpyZXQ7Ci0JfSBhcmdzOwotCi0JYXJncy5zZXJ2aWNlID0gImNsYWltIjsKLQlhcmdzLm5hcmdzID0gMzsKLQlhcmdzLm5yZXQgPSAxOwotCWFyZ3MudmlydCA9IHZpcnQ7Ci0JYXJncy5zaXplID0gc2l6ZTsKLQlhcmdzLmFsaWduID0gYWxpZ247Ci0JKCpwcm9tKSgmYXJncyk7Ci0JcmV0dXJuIGFyZ3MucmV0OwotfQotCi1pbnQKLWdldHByb3Aodm9pZCAqcGhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmLCBpbnQgYnVmbGVuKQotewotCXN0cnVjdCBwcm9tX2FyZ3MgewotCQljaGFyICpzZXJ2aWNlOwotCQlpbnQgbmFyZ3M7Ci0JCWludCBucmV0OwotCQl2b2lkICpwaGFuZGxlOwotCQljb25zdCBjaGFyICpuYW1lOwotCQl2b2lkICpidWY7Ci0JCWludCBidWZsZW47Ci0JCWludCBzaXplOwotCX0gYXJnczsKLQotCWFyZ3Muc2VydmljZSA9ICJnZXRwcm9wIjsKLQlhcmdzLm5hcmdzID0gNDsKLQlhcmdzLm5yZXQgPSAxOwotCWFyZ3MucGhhbmRsZSA9IHBoYW5kbGU7Ci0JYXJncy5uYW1lID0gbmFtZTsKLQlhcmdzLmJ1ZiA9IGJ1ZjsKLQlhcmdzLmJ1ZmxlbiA9IGJ1ZmxlbjsKLQlhcmdzLnNpemUgPSAtMTsKLQkoKnByb20pKCZhcmdzKTsKLQlyZXR1cm4gYXJncy5zaXplOwotfQotCi1pbnQKLXB1dGMoaW50IGMsIHZvaWQgKmYpCi17Ci0JY2hhciBjaCA9IGM7Ci0KLQlpZiAoYyA9PSAnXG4nKQotCQlwdXRjKCdccicsIGYpOwotCXJldHVybiB3cml0ZShmLCAmY2gsIDEpID09IDE/IGM6IC0xOwotfQotCi1pbnQKLXB1dGNoYXIoaW50IGMpCi17Ci0JcmV0dXJuIHB1dGMoYywgc3Rkb3V0KTsKLX0KLQotaW50Ci1mcHV0cyhjaGFyICpzdHIsIHZvaWQgKmYpCi17Ci0JaW50IG4gPSBzdHJsZW4oc3RyKTsKLQotCXJldHVybiB3cml0ZShmLCBzdHIsIG4pID09IG4/IDA6IC0xOwotfQotCi1zaXplX3Qgc3Rybmxlbihjb25zdCBjaGFyICogcywgc2l6ZV90IGNvdW50KQotewotCWNvbnN0IGNoYXIgKnNjOwotCi0JZm9yIChzYyA9IHM7IGNvdW50LS0gJiYgKnNjICE9ICdcMCc7ICsrc2MpCi0JCS8qIG5vdGhpbmcgKi87Ci0JcmV0dXJuIHNjIC0gczsKLX0KLQotZXh0ZXJuIHVuc2lnbmVkIGludCBfX2RpdjY0XzMyKHVuc2lnbmVkIGxvbmcgbG9uZyAqZGl2aWRlbmQsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGRpdmlzb3IpOwotCi0vKiBUaGUgdW5uZWNlc3NhcnkgcG9pbnRlciBjb21wYXJlIGlzIHRoZXJlCi0gKiB0byBjaGVjayBmb3IgdHlwZSBzYWZldHkgKG4gbXVzdCBiZSA2NGJpdCkKKy8qCisgKiBPbGRlciBPRidzIHJlcXVpcmUgdGhhdCB3aGVuIGNsYWltaW5nIGEgc3BlY2lmaWMgcmFuZ2Ugb2YgYWRkcmVzc2VzLAorICogd2UgY2xhaW0gdGhlIHBoeXNpY2FsIHNwYWNlIGluIHRoZSAvbWVtb3J5IG5vZGUgYW5kIHRoZSB2aXJ0dWFsCisgKiBzcGFjZSBpbiB0aGUgY2hvc2VuIG1tdSBub2RlLCBhbmQgdGhlbiBkbyBhIG1hcCBvcGVyYXRpb24gdG8KKyAqIG1hcCB2aXJ0dWFsIHRvIHBoeXNpY2FsLgogICovCi0jIGRlZmluZSBkb19kaXYobixiYXNlKSAoewkJCQkJCVwKLQl1bnNpZ25lZCBpbnQgX19iYXNlID0gKGJhc2UpOwkJCQkJXAotCXVuc2lnbmVkIGludCBfX3JlbTsJCQkJCQlcCi0JKHZvaWQpKCgodHlwZW9mKChuKSkgKikwKSA9PSAoKHVuc2lnbmVkIGxvbmcgbG9uZyAqKTApKTsJXAotCWlmICgoKG4pID4+IDMyKSA9PSAwKSB7CQkJCQkJXAotCQlfX3JlbSA9ICh1bnNpZ25lZCBpbnQpKG4pICUgX19iYXNlOwkJCVwKLQkJKG4pID0gKHVuc2lnbmVkIGludCkobikgLyBfX2Jhc2U7CQkJXAotCX0gZWxzZQkJCQkJCQkJXAotCQlfX3JlbSA9IF9fZGl2NjRfMzIoJihuKSwgX19iYXNlKTsJCQlcCi0JX19yZW07CQkJCQkJCQlcCi0gfSkKK3N0YXRpYyBpbnQgbmVlZF9tYXAgPSAtMTsKK3N0YXRpYyBpaGFuZGxlIGNob3Nlbl9tbXU7CitzdGF0aWMgcGhhbmRsZSBtZW1vcnk7CiAKLXN0YXRpYyBpbnQgc2tpcF9hdG9pKGNvbnN0IGNoYXIgKipzKQorLyogcmV0dXJucyB0cnVlIGlmIHMyIGlzIGEgcHJlZml4IG9mIHMxICovCitzdGF0aWMgaW50IHN0cmluZ19tYXRjaChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCiB7Ci0JaW50IGksIGM7Ci0KLQlmb3IgKGkgPSAwOyAnMCcgPD0gKGMgPSAqKnMpICYmIGMgPD0gJzknOyArKypzKQotCQlpID0gaSoxMCArIGMgLSAnMCc7Ci0JcmV0dXJuIGk7CisJZm9yICg7ICpzMjsgKytzMikKKwkJaWYgKCpzMSsrICE9ICpzMikKKwkJCXJldHVybiAwOworCXJldHVybiAxOwogfQogCi0jZGVmaW5lIFpFUk9QQUQJMQkJLyogcGFkIHdpdGggemVybyAqLwotI2RlZmluZSBTSUdOCTIJCS8qIHVuc2lnbmVkL3NpZ25lZCBsb25nICovCi0jZGVmaW5lIFBMVVMJNAkJLyogc2hvdyBwbHVzICovCi0jZGVmaW5lIFNQQUNFCTgJCS8qIHNwYWNlIGlmIHBsdXMgKi8KLSNkZWZpbmUgTEVGVAkxNgkJLyogbGVmdCBqdXN0aWZpZWQgKi8KLSNkZWZpbmUgU1BFQ0lBTAkzMgkJLyogMHggKi8KLSNkZWZpbmUgTEFSR0UJNjQJCS8qIHVzZSAnQUJDREVGJyBpbnN0ZWFkIG9mICdhYmNkZWYnICovCi0KLXN0YXRpYyBjaGFyICogbnVtYmVyKGNoYXIgKiBzdHIsIHVuc2lnbmVkIGxvbmcgbG9uZyBudW0sIGludCBiYXNlLCBpbnQgc2l6ZSwgaW50IHByZWNpc2lvbiwgaW50IHR5cGUpCitzdGF0aWMgaW50IGNoZWNrX29mX3ZlcnNpb24odm9pZCkKIHsKLQljaGFyIGMsc2lnbix0bXBbNjZdOwotCWNvbnN0IGNoYXIgKmRpZ2l0cz0iMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKLQlpbnQgaTsKKwlwaGFuZGxlIG9wcm9tLCBjaG9zZW47CisJY2hhciB2ZXJzaW9uWzY0XTsKIAotCWlmICh0eXBlICYgTEFSR0UpCi0JCWRpZ2l0cyA9ICIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiOwotCWlmICh0eXBlICYgTEVGVCkKLQkJdHlwZSAmPSB+WkVST1BBRDsKLQlpZiAoYmFzZSA8IDIgfHwgYmFzZSA+IDM2KQorCW9wcm9tID0gZmluZGRldmljZSgiL29wZW5wcm9tIik7CisJaWYgKG9wcm9tID09IChwaGFuZGxlKSAtMSkKIAkJcmV0dXJuIDA7Ci0JYyA9ICh0eXBlICYgWkVST1BBRCkgPyAnMCcgOiAnICc7Ci0Jc2lnbiA9IDA7Ci0JaWYgKHR5cGUgJiBTSUdOKSB7Ci0JCWlmICgoc2lnbmVkIGxvbmcgbG9uZyludW0gPCAwKSB7Ci0JCQlzaWduID0gJy0nOwotCQkJbnVtID0gLSAoc2lnbmVkIGxvbmcgbG9uZyludW07Ci0JCQlzaXplLS07Ci0JCX0gZWxzZSBpZiAodHlwZSAmIFBMVVMpIHsKLQkJCXNpZ24gPSAnKyc7Ci0JCQlzaXplLS07Ci0JCX0gZWxzZSBpZiAodHlwZSAmIFNQQUNFKSB7Ci0JCQlzaWduID0gJyAnOwotCQkJc2l6ZS0tOworCWlmIChnZXRwcm9wKG9wcm9tLCAibW9kZWwiLCB2ZXJzaW9uLCBzaXplb2YodmVyc2lvbikpIDw9IDApCisJCXJldHVybiAwOworCXZlcnNpb25bc2l6ZW9mKHZlcnNpb24pLTFdID0gMDsKKwlwcmludGYoIk9GIHZlcnNpb24gPSAnJXMnXHJcbiIsIHZlcnNpb24pOworCWlmICghc3RyaW5nX21hdGNoKHZlcnNpb24sICJPcGVuIEZpcm13YXJlLCAxLiIpCisJICAgICYmICFzdHJpbmdfbWF0Y2godmVyc2lvbiwgIkZpcm1Xb3JrcywzLiIpKQorCQlyZXR1cm4gMDsKKwljaG9zZW4gPSBmaW5kZGV2aWNlKCIvY2hvc2VuIik7CisJaWYgKGNob3NlbiA9PSAocGhhbmRsZSkgLTEpIHsKKwkJY2hvc2VuID0gZmluZGRldmljZSgiL2Nob3NlbkAwIik7CisJCWlmIChjaG9zZW4gPT0gKHBoYW5kbGUpIC0xKSB7CisJCQlwcmludGYoIm5vIGNob3NlblxuIik7CisJCQlyZXR1cm4gMDsKIAkJfQogCX0KLQlpZiAodHlwZSAmIFNQRUNJQUwpIHsKLQkJaWYgKGJhc2UgPT0gMTYpCi0JCQlzaXplIC09IDI7Ci0JCWVsc2UgaWYgKGJhc2UgPT0gOCkKLQkJCXNpemUtLTsKKwlpZiAoZ2V0cHJvcChjaG9zZW4sICJtbXUiLCAmY2hvc2VuX21tdSwgc2l6ZW9mKGNob3Nlbl9tbXUpKSA8PSAwKSB7CisJCXByaW50Zigibm8gbW11XG4iKTsKKwkJcmV0dXJuIDA7CiAJfQotCWkgPSAwOwotCWlmIChudW0gPT0gMCkKLQkJdG1wW2krK109JzAnOwotCWVsc2Ugd2hpbGUgKG51bSAhPSAwKSB7Ci0JCXRtcFtpKytdID0gZGlnaXRzW2RvX2RpdihudW0sIGJhc2UpXTsKLQl9Ci0JaWYgKGkgPiBwcmVjaXNpb24pCi0JCXByZWNpc2lvbiA9IGk7Ci0Jc2l6ZSAtPSBwcmVjaXNpb247Ci0JaWYgKCEodHlwZSYoWkVST1BBRCtMRUZUKSkpCi0JCXdoaWxlKHNpemUtLT4wKQotCQkJKnN0cisrID0gJyAnOwotCWlmIChzaWduKQotCQkqc3RyKysgPSBzaWduOwotCWlmICh0eXBlICYgU1BFQ0lBTCkgewotCQlpZiAoYmFzZT09OCkKLQkJCSpzdHIrKyA9ICcwJzsKLQkJZWxzZSBpZiAoYmFzZT09MTYpIHsKLQkJCSpzdHIrKyA9ICcwJzsKLQkJCSpzdHIrKyA9IGRpZ2l0c1szM107CisJbWVtb3J5ID0gKGloYW5kbGUpIGNhbGxfcHJvbSgib3BlbiIsIDEsIDEsICIvbWVtb3J5Iik7CisJaWYgKG1lbW9yeSA9PSAoaWhhbmRsZSkgLTEpIHsKKwkJbWVtb3J5ID0gKGloYW5kbGUpIGNhbGxfcHJvbSgib3BlbiIsIDEsIDEsICIvbWVtb3J5QDAiKTsKKwkJaWYgKG1lbW9yeSA9PSAoaWhhbmRsZSkgLTEpIHsKKwkJCXByaW50Zigibm8gbWVtb3J5IG5vZGVcbiIpOworCQkJcmV0dXJuIDA7CiAJCX0KIAl9Ci0JaWYgKCEodHlwZSAmIExFRlQpKQotCQl3aGlsZSAoc2l6ZS0tID4gMCkKLQkJCSpzdHIrKyA9IGM7Ci0Jd2hpbGUgKGkgPCBwcmVjaXNpb24tLSkKLQkJKnN0cisrID0gJzAnOwotCXdoaWxlIChpLS0gPiAwKQotCQkqc3RyKysgPSB0bXBbaV07Ci0Jd2hpbGUgKHNpemUtLSA+IDApCi0JCSpzdHIrKyA9ICcgJzsKLQlyZXR1cm4gc3RyOworCXByaW50Zigib2xkIE9GIGRldGVjdGVkXHJcbiIpOworCXJldHVybiAxOwogfQogCi1pbnQgdnNwcmludGYoY2hhciAqYnVmLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKK3ZvaWQgKmNsYWltKHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsaWduKQogewotCWludCBsZW47Ci0JdW5zaWduZWQgbG9uZyBsb25nIG51bTsKLQlpbnQgaSwgYmFzZTsKLQljaGFyICogc3RyOwotCWNvbnN0IGNoYXIgKnM7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0OwogCi0JaW50IGZsYWdzOwkJLyogZmxhZ3MgdG8gbnVtYmVyKCkgKi8KLQotCWludCBmaWVsZF93aWR0aDsJLyogd2lkdGggb2Ygb3V0cHV0IGZpZWxkICovCi0JaW50IHByZWNpc2lvbjsJCS8qIG1pbi4gIyBvZiBkaWdpdHMgZm9yIGludGVnZXJzOyBtYXgKLQkJCQkgICBudW1iZXIgb2YgY2hhcnMgZm9yIGZyb20gc3RyaW5nICovCi0JaW50IHF1YWxpZmllcjsJCS8qICdoJywgJ2wnLCBvciAnTCcgZm9yIGludGVnZXIgZmllbGRzICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgLyogJ3onIHN1cHBvcnQgYWRkZWQgMjMvNy8xOTk5IFMuSC4gICAgKi8KLQkJCQkvKiAneicgY2hhbmdlZCB0byAnWicgLS1kYXZpZG0gMS8yNS85OSAqLwotCisJaWYgKG5lZWRfbWFwIDwgMCkKKwkJbmVlZF9tYXAgPSBjaGVja19vZl92ZXJzaW9uKCk7CisJaWYgKGFsaWduIHx8ICFuZWVkX21hcCkKKwkJcmV0dXJuICh2b2lkICopIGNhbGxfcHJvbSgiY2xhaW0iLCAzLCAxLCB2aXJ0LCBzaXplLCBhbGlnbik7CiAJCi0JZm9yIChzdHI9YnVmIDsgKmZtdCA7ICsrZm10KSB7Ci0JCWlmICgqZm10ICE9ICclJykgewotCQkJKnN0cisrID0gKmZtdDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCQkKLQkJLyogcHJvY2VzcyBmbGFncyAqLwotCQlmbGFncyA9IDA7Ci0JCXJlcGVhdDoKLQkJCSsrZm10OwkJLyogdGhpcyBhbHNvIHNraXBzIGZpcnN0ICclJyAqLwotCQkJc3dpdGNoICgqZm10KSB7Ci0JCQkJY2FzZSAnLSc6IGZsYWdzIHw9IExFRlQ7IGdvdG8gcmVwZWF0OwotCQkJCWNhc2UgJysnOiBmbGFncyB8PSBQTFVTOyBnb3RvIHJlcGVhdDsKLQkJCQljYXNlICcgJzogZmxhZ3MgfD0gU1BBQ0U7IGdvdG8gcmVwZWF0OwotCQkJCWNhc2UgJyMnOiBmbGFncyB8PSBTUEVDSUFMOyBnb3RvIHJlcGVhdDsKLQkJCQljYXNlICcwJzogZmxhZ3MgfD0gWkVST1BBRDsgZ290byByZXBlYXQ7Ci0JCQkJfQotCQkKLQkJLyogZ2V0IGZpZWxkIHdpZHRoICovCi0JCWZpZWxkX3dpZHRoID0gLTE7Ci0JCWlmICgnMCcgPD0gKmZtdCAmJiAqZm10IDw9ICc5JykKLQkJCWZpZWxkX3dpZHRoID0gc2tpcF9hdG9pKCZmbXQpOwotCQllbHNlIGlmICgqZm10ID09ICcqJykgewotCQkJKytmbXQ7Ci0JCQkvKiBpdCdzIHRoZSBuZXh0IGFyZ3VtZW50ICovCi0JCQlmaWVsZF93aWR0aCA9IHZhX2FyZyhhcmdzLCBpbnQpOwotCQkJaWYgKGZpZWxkX3dpZHRoIDwgMCkgewotCQkJCWZpZWxkX3dpZHRoID0gLWZpZWxkX3dpZHRoOwotCQkJCWZsYWdzIHw9IExFRlQ7Ci0JCQl9Ci0JCX0KLQotCQkvKiBnZXQgdGhlIHByZWNpc2lvbiAqLwotCQlwcmVjaXNpb24gPSAtMTsKLQkJaWYgKCpmbXQgPT0gJy4nKSB7Ci0JCQkrK2ZtdDsJCi0JCQlpZiAoJzAnIDw9ICpmbXQgJiYgKmZtdCA8PSAnOScpCi0JCQkJcHJlY2lzaW9uID0gc2tpcF9hdG9pKCZmbXQpOwotCQkJZWxzZSBpZiAoKmZtdCA9PSAnKicpIHsKLQkJCQkrK2ZtdDsKLQkJCQkvKiBpdCdzIHRoZSBuZXh0IGFyZ3VtZW50ICovCi0JCQkJcHJlY2lzaW9uID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0JCQl9Ci0JCQlpZiAocHJlY2lzaW9uIDwgMCkKLQkJCQlwcmVjaXNpb24gPSAwOwotCQl9Ci0KLQkJLyogZ2V0IHRoZSBjb252ZXJzaW9uIHF1YWxpZmllciAqLwotCQlxdWFsaWZpZXIgPSAtMTsKLQkJaWYgKCpmbXQgPT0gJ2gnIHx8ICpmbXQgPT0gJ2wnIHx8ICpmbXQgPT0gJ0wnIHx8ICpmbXQgPT0nWicpIHsKLQkJCXF1YWxpZmllciA9ICpmbXQ7Ci0JCQkrK2ZtdDsKLQkJfQotCi0JCS8qIGRlZmF1bHQgYmFzZSAqLwotCQliYXNlID0gMTA7Ci0KLQkJc3dpdGNoICgqZm10KSB7Ci0JCWNhc2UgJ2MnOgotCQkJaWYgKCEoZmxhZ3MgJiBMRUZUKSkKLQkJCQl3aGlsZSAoLS1maWVsZF93aWR0aCA+IDApCi0JCQkJCSpzdHIrKyA9ICcgJzsKLQkJCSpzdHIrKyA9ICh1bnNpZ25lZCBjaGFyKSB2YV9hcmcoYXJncywgaW50KTsKLQkJCXdoaWxlICgtLWZpZWxkX3dpZHRoID4gMCkKLQkJCQkqc3RyKysgPSAnICc7Ci0JCQljb250aW51ZTsKLQotCQljYXNlICdzJzoKLQkJCXMgPSB2YV9hcmcoYXJncywgY2hhciAqKTsKLQkJCWlmICghcykKLQkJCQlzID0gIjxOVUxMPiI7Ci0KLQkJCWxlbiA9IHN0cm5sZW4ocywgcHJlY2lzaW9uKTsKLQotCQkJaWYgKCEoZmxhZ3MgJiBMRUZUKSkKLQkJCQl3aGlsZSAobGVuIDwgZmllbGRfd2lkdGgtLSkKLQkJCQkJKnN0cisrID0gJyAnOwotCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQotCQkJCSpzdHIrKyA9ICpzKys7Ci0JCQl3aGlsZSAobGVuIDwgZmllbGRfd2lkdGgtLSkKLQkJCQkqc3RyKysgPSAnICc7Ci0JCQljb250aW51ZTsKLQotCQljYXNlICdwJzoKLQkJCWlmIChmaWVsZF93aWR0aCA9PSAtMSkgewotCQkJCWZpZWxkX3dpZHRoID0gMipzaXplb2Yodm9pZCAqKTsKLQkJCQlmbGFncyB8PSBaRVJPUEFEOwotCQkJfQotCQkJc3RyID0gbnVtYmVyKHN0ciwKLQkJCQkodW5zaWduZWQgbG9uZykgdmFfYXJnKGFyZ3MsIHZvaWQgKiksIDE2LAotCQkJCWZpZWxkX3dpZHRoLCBwcmVjaXNpb24sIGZsYWdzKTsKLQkJCWNvbnRpbnVlOwotCi0KLQkJY2FzZSAnbic6Ci0JCQlpZiAocXVhbGlmaWVyID09ICdsJykgewotCQkJCWxvbmcgKiBpcCA9IHZhX2FyZyhhcmdzLCBsb25nICopOwotCQkJCSppcCA9IChzdHIgLSBidWYpOwotCQkJfSBlbHNlIGlmIChxdWFsaWZpZXIgPT0gJ1onKSB7Ci0JCQkJc2l6ZV90ICogaXAgPSB2YV9hcmcoYXJncywgc2l6ZV90ICopOwotCQkJCSppcCA9IChzdHIgLSBidWYpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnQgKiBpcCA9IHZhX2FyZyhhcmdzLCBpbnQgKik7Ci0JCQkJKmlwID0gKHN0ciAtIGJ1Zik7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQotCQljYXNlICclJzoKLQkJCSpzdHIrKyA9ICclJzsKLQkJCWNvbnRpbnVlOwotCi0JCS8qIGludGVnZXIgbnVtYmVyIGZvcm1hdHMgLSBzZXQgdXAgdGhlIGZsYWdzIGFuZCAiYnJlYWsiICovCi0JCWNhc2UgJ28nOgotCQkJYmFzZSA9IDg7Ci0JCQlicmVhazsKLQotCQljYXNlICdYJzoKLQkJCWZsYWdzIHw9IExBUkdFOwotCQljYXNlICd4JzoKLQkJCWJhc2UgPSAxNjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ2QnOgotCQljYXNlICdpJzoKLQkJCWZsYWdzIHw9IFNJR047Ci0JCWNhc2UgJ3UnOgotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCSpzdHIrKyA9ICclJzsKLQkJCWlmICgqZm10KQotCQkJCSpzdHIrKyA9ICpmbXQ7Ci0JCQllbHNlCi0JCQkJLS1mbXQ7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAocXVhbGlmaWVyID09ICdsJykgewotCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGxvbmcpOwotCQkJaWYgKGZsYWdzICYgU0lHTikKLQkJCQludW0gPSAoc2lnbmVkIGxvbmcpIG51bTsKLQkJfSBlbHNlIGlmIChxdWFsaWZpZXIgPT0gJ1onKSB7Ci0JCQludW0gPSB2YV9hcmcoYXJncywgc2l6ZV90KTsKLQkJfSBlbHNlIGlmIChxdWFsaWZpZXIgPT0gJ2gnKSB7Ci0JCQludW0gPSAodW5zaWduZWQgc2hvcnQpIHZhX2FyZyhhcmdzLCBpbnQpOwotCQkJaWYgKGZsYWdzICYgU0lHTikKLQkJCQludW0gPSAoc2lnbmVkIHNob3J0KSBudW07Ci0JCX0gZWxzZSB7Ci0JCQludW0gPSB2YV9hcmcoYXJncywgdW5zaWduZWQgaW50KTsKLQkJCWlmIChmbGFncyAmIFNJR04pCi0JCQkJbnVtID0gKHNpZ25lZCBpbnQpIG51bTsKLQkJfQotCQlzdHIgPSBudW1iZXIoc3RyLCBudW0sIGJhc2UsIGZpZWxkX3dpZHRoLCBwcmVjaXNpb24sIGZsYWdzKTsKLQl9Ci0JKnN0ciA9ICdcMCc7Ci0JcmV0dXJuIHN0ci1idWY7Ci19Ci0KLWludCBzcHJpbnRmKGNoYXIgKiBidWYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QgYXJnczsKLQlpbnQgaTsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JaT12c3ByaW50ZihidWYsZm10LGFyZ3MpOwotCXZhX2VuZChhcmdzKTsKLQlyZXR1cm4gaTsKLX0KLQotc3RhdGljIGNoYXIgc3ByaW50X2J1ZlsxMDI0XTsKLQotaW50Ci1wcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCBhcmdzOwotCWludCBuOwotCi0JdmFfc3RhcnQoYXJncywgZm10KTsKLQluID0gdnNwcmludGYoc3ByaW50X2J1ZiwgZm10LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci0Jd3JpdGUoc3Rkb3V0LCBzcHJpbnRfYnVmLCBuKTsKLQlyZXR1cm4gbjsKKwlyZXQgPSBjYWxsX3Byb21fcmV0KCJjYWxsLW1ldGhvZCIsIDUsIDIsICZyZXN1bHQsICJjbGFpbSIsIG1lbW9yeSwKKwkJCSAgICBhbGlnbiwgc2l6ZSwgdmlydCk7CisJaWYgKHJldCAhPSAwIHx8IHJlc3VsdCA9PSAtMSkKKwkJcmV0dXJuICh2b2lkICopIC0xOworCXJldCA9IGNhbGxfcHJvbV9yZXQoImNhbGwtbWV0aG9kIiwgNSwgMiwgJnJlc3VsdCwgImNsYWltIiwgY2hvc2VuX21tdSwKKwkJCSAgICBhbGlnbiwgc2l6ZSwgdmlydCk7CisJLyogMHgxMiA9PSBjb2hlcmVudCArIHJlYWQvd3JpdGUgKi8KKwlyZXQgPSBjYWxsX3Byb20oImNhbGwtbWV0aG9kIiwgNiwgMSwgIm1hcCIsIGNob3Nlbl9tbXUsCisJCQkweDEyLCBzaXplLCB2aXJ0LCB2aXJ0KTsKKwlyZXR1cm4gKHZvaWQgKikgdmlydDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L3Byb20uaCBiL2FyY2gvcG93ZXJwYy9ib290L3Byb20uaAppbmRleCA5NmFiNWFlLi4zZTJkZGQ0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9wcm9tLmgKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvcHJvbS5oCkBAIC0xLDE4ICsxLDM0IEBACiAjaWZuZGVmIF9QUENfQk9PVF9QUk9NX0hfCiAjZGVmaW5lIF9QUENfQk9PVF9QUk9NX0hfCiAKLWV4dGVybiBpbnQgKCpwcm9tKSAodm9pZCAqKTsKLWV4dGVybiB2b2lkICpjaG9zZW5faGFuZGxlOwordHlwZWRlZiB2b2lkICpwaGFuZGxlOwordHlwZWRlZiB2b2lkICppaGFuZGxlOwogCi1leHRlcm4gdm9pZCAqc3RkaW47Ci1leHRlcm4gdm9pZCAqc3Rkb3V0OwotZXh0ZXJuIHZvaWQgKnN0ZGVycjsKK2V4dGVybiBpbnQgKCpwcm9tKSAodm9pZCAqKTsKK2V4dGVybiBwaGFuZGxlIGNob3Nlbl9oYW5kbGU7CitleHRlcm4gaWhhbmRsZSBzdGRvdXQ7CisKK2ludAljYWxsX3Byb20oY29uc3QgY2hhciAqc2VydmljZSwgaW50IG5hcmdzLCBpbnQgbnJldCwgLi4uKTsKK2ludAljYWxsX3Byb21fcmV0KGNvbnN0IGNoYXIgKnNlcnZpY2UsIGludCBuYXJncywgaW50IG5yZXQsCisJCSAgICAgIHVuc2lnbmVkIGludCAqcmV0cywgLi4uKTsKIAogZXh0ZXJuIGludCB3cml0ZSh2b2lkICpoYW5kbGUsIHZvaWQgKnB0ciwgaW50IG5iKTsKLWV4dGVybiBpbnQgcmVhZCh2b2lkICpoYW5kbGUsIHZvaWQgKnB0ciwgaW50IG5iKTsKLWV4dGVybiB2b2lkIGV4aXQodm9pZCk7Ci1leHRlcm4gdm9pZCBwYXVzZSh2b2lkKTsKLWV4dGVybiB2b2lkICpmaW5kZGV2aWNlKGNvbnN0IGNoYXIgKik7Ci1leHRlcm4gdm9pZCAqY2xhaW0odW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxpZ24pOwotZXh0ZXJuIGludCBnZXRwcm9wKHZvaWQgKnBoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZiwgaW50IGJ1Zmxlbik7CitleHRlcm4gdm9pZCAqY2xhaW0odW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxuKTsKKworc3RhdGljIGlubGluZSB2b2lkIGV4aXQodm9pZCkKK3sKKwljYWxsX3Byb20oImV4aXQiLCAwLCAwKTsKK30KKworc3RhdGljIGlubGluZSBwaGFuZGxlIGZpbmRkZXZpY2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gKHBoYW5kbGUpIGNhbGxfcHJvbSgiZmluZGRldmljZSIsIDEsIDEsIG5hbWUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRwcm9wKHZvaWQgKnBoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgIHZvaWQgKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwlyZXR1cm4gY2FsbF9wcm9tKCJnZXRwcm9wIiwgNCwgMSwgcGhhbmRsZSwgbmFtZSwgYnVmLCBidWZsZW4pOworfQorCiAjZW5kaWYJCQkJLyogX1BQQ19CT09UX1BST01fSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L3JzNjAwMC5oIGIvYXJjaC9wb3dlcnBjL2Jvb3QvcnM2MDAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMzZjQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3JzNjAwMC5oCkBAIC0wLDAgKzEsMjQzIEBACisvKiBJQk0gUlMvNjAwMCAiWENPRkYiIGZpbGUgZGVmaW5pdGlvbnMgZm9yIEJGRC4KKyAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIEZJWE1FOiBDYW4gc29tZW9uZSBwcm92aWRlIGEgdHJhbnNsaXRlcmF0aW9uIG9mIHRoaXMgbmFtZSBpbnRvIEFTQ0lJPworICAgVXNpbmcgdGhlIGZvbGxvd2luZyBjaGFycyBjYXVzZWQgYSBjb21waWxlciB3YXJuaW5nIG9uIEhJVVggKHNvIEkgcmVwbGFjZWQKKyAgIHRoZW0gd2l0aCBvY3RhbCBlc2NhcGVzKSwgYW5kIGlzbid0IHVzZWZ1bCB3aXRob3V0IGFuIHVuZGVyc3RhbmRpbmcgb2Ygd2hhdAorICAgY2hhcmFjdGVyIHNldCBpdCBpcy4KKyAgIFdyaXR0ZW4gYnkgTWltaSBQaFwzNzNcMzY0bmctVGhcMzQ1byBWXDM2NSBvZiBJQk0KKyAgIGFuZCBKb2huIEdpbG1vcmUgb2YgQ3lnbnVzIFN1cHBvcnQuICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7CisJY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLworCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLworCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLworCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KKwljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLworCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLworCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLworfTsKKworICAgICAgICAvKiBJQk0gUlMvNjAwMCAqLworI2RlZmluZSBVODAyV1JNQUdJQyAgICAgMDczMCAgICAvKiB3cml0ZWFibGUgdGV4dCBzZWdtZW50cyAqKmNoaCoqICAgICAgKi8KKyNkZWZpbmUgVTgwMlJPTUFHSUMgICAgIDA3MzUgICAgLyogcmVhZG9ubHkgc2hhcmFibGUgdGV4dCBzZWdtZW50cyAgICAgICovCisjZGVmaW5lIFU4MDJUT0NNQUdJQyAgICAwNzM3ICAgIC8qIHJlYWRvbmx5IHRleHQgc2VnbWVudHMgYW5kIFRPQyAgICAgICAqLworCisjZGVmaW5lIEJBRE1BRyh4KQlcCisJKCh4KS5mX21hZ2ljICE9IFU4MDJST01BR0lDICYmICh4KS5mX21hZ2ljICE9IFU4MDJXUk1BR0lDICYmIFwKKwkgKHgpLmZfbWFnaWMgIT0gVTgwMlRPQ01BR0lDKQorCisjZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgorI2RlZmluZQlGSUxIU1oJMjAKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhcgltYWdpY1syXTsJLyogdHlwZSBvZiBmaWxlCQkJKi8KKyAgdW5zaWduZWQgY2hhcgl2c3RhbXBbMl07CS8qIHZlcnNpb24gc3RhbXAJCSovCisgIHVuc2lnbmVkIGNoYXIJdHNpemVbNF07CS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkgKi8KKyAgdW5zaWduZWQgY2hhcglkc2l6ZVs0XTsJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCSovCisgIHVuc2lnbmVkIGNoYXIJYnNpemVbNF07CS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkqLworICB1bnNpZ25lZCBjaGFyCWVudHJ5WzRdOwkvKiBlbnRyeSBwdC4JCQkqLworICB1bnNpZ25lZCBjaGFyCXRleHRfc3RhcnRbNF07CS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KKyAgdW5zaWduZWQgY2hhcglkYXRhX3N0YXJ0WzRdOwkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCisgIHVuc2lnbmVkIGNoYXIJb190b2NbNF07CS8qIGFkZHJlc3Mgb2YgVE9DICovCisgIHVuc2lnbmVkIGNoYXIJb19zbmVudHJ5WzJdOwkvKiBzZWN0aW9uIG51bWJlciBvZiBlbnRyeSBwb2ludCAqLworICB1bnNpZ25lZCBjaGFyCW9fc250ZXh0WzJdOwkvKiBzZWN0aW9uIG51bWJlciBvZiAudGV4dCBzZWN0aW9uICovCisgIHVuc2lnbmVkIGNoYXIJb19zbmRhdGFbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIC5kYXRhIHNlY3Rpb24gKi8KKyAgdW5zaWduZWQgY2hhcglvX3NudG9jWzJdOwkvKiBzZWN0aW9uIG51bWJlciBvZiBUT0MgKi8KKyAgdW5zaWduZWQgY2hhcglvX3NubG9hZGVyWzJdOwkvKiBzZWN0aW9uIG51bWJlciBvZiAubG9hZGVyIHNlY3Rpb24gKi8KKyAgdW5zaWduZWQgY2hhcglvX3NuYnNzWzJdOwkvKiBzZWN0aW9uIG51bWJlciBvZiAuYnNzIHNlY3Rpb24gKi8KKyAgdW5zaWduZWQgY2hhcglvX2FsZ250ZXh0WzJdOwkvKiAudGV4dCBhbGlnbm1lbnQgKi8KKyAgdW5zaWduZWQgY2hhcglvX2FsZ25kYXRhWzJdOwkvKiAuZGF0YSBhbGlnbm1lbnQgKi8KKyAgdW5zaWduZWQgY2hhcglvX21vZHR5cGVbMl07CS8qIG1vZHVsZSB0eXBlICg/PykgKi8KKyAgdW5zaWduZWQgY2hhciBvX2NwdXR5cGVbMl07CS8qIGNwdSB0eXBlICovCisgIHVuc2lnbmVkIGNoYXIJb19tYXhzdGFja1s0XTsJLyogbWF4IHN0YWNrIHNpemUgKD8/KSAqLworICB1bnNpZ25lZCBjaGFyIG9fbWF4ZGF0YVs0XTsJLyogbWF4IGRhdGEgc2l6ZSAoPz8pICovCisgIHVuc2lnbmVkIGNoYXIJb19yZXN2MlsxMl07CS8qIHJlc2VydmVkICovCit9CitBT1VUSERSOworCisjZGVmaW5lIEFPVVRTWiA3MgorI2RlZmluZSBTTUFMTF9BT1VUU1ogKDI4KQorI2RlZmluZSBBT1VUSERSU1ogNzIKKworI2RlZmluZQlSUzZLX0FPVVRIRFJfT01BR0lDCTB4MDEwNwkvKiBvbGQ6IHRleHQgJiBkYXRhIHdyaXRlYWJsZSAqLworI2RlZmluZQlSUzZLX0FPVVRIRFJfTk1BR0lDCTB4MDEwOAkvKiBuZXc6IHRleHQgci9vLCBkYXRhIHIvdyAqLworI2RlZmluZQlSUzZLX0FPVVRIRFJfWk1BR0lDCTB4MDEwQgkvKiBwYWdlZDogdGV4dCByL28sIGJvdGggcGFnZS1hbGlnbmVkICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKKwljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCisJY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KKwljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCisJY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLworCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLworCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCisJY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KKwljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLworCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KKwljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCit9OworCisvKgorICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCisgKi8KKyNkZWZpbmUgX1RFWFQJIi50ZXh0IgorI2RlZmluZSBfREFUQQkiLmRhdGEiCisjZGVmaW5lIF9CU1MJIi5ic3MiCisjZGVmaW5lIF9QQUQJIi5wYWQiCisjZGVmaW5lIF9MT0FERVIJIi5sb2FkZXIiCisKKyNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKKyNkZWZpbmUJU0NOSFNaCTQwCisKKy8qIFhDT0ZGIHVzZXMgYSBzcGVjaWFsIC5sb2FkZXIgc2VjdGlvbiB3aXRoIHR5cGUgU1RZUF9MT0FERVIuICAqLworI2RlZmluZSBTVFlQX0xPQURFUiAweDEwMDAKKworLyogWENPRkYgdXNlcyBhIHNwZWNpYWwgLmRlYnVnIHNlY3Rpb24gd2l0aCB0eXBlIFNUWVBfREVCVUcuICAqLworI2RlZmluZSBTVFlQX0RFQlVHIDB4MjAwMAorCisvKiBYQ09GRiBoYW5kbGVzIGxpbmUgbnVtYmVyIG9yIHJlbG9jYXRpb24gb3ZlcmZsb3cgYnkgY3JlYXRpbmcKKyAgIGFub3RoZXIgc2VjdGlvbiBoZWFkZXIgd2l0aCBTVFlQX09WUkZMTyBzZXQuICAqLworI2RlZmluZSBTVFlQX09WUkZMTyAweDgwMDAKKworLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgorICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCisgKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQorICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgorICovCitzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKKwl1bmlvbiB7CisJCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLworCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLworCX0gbF9hZGRyOworCWNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KK307CisKKworI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubworI2RlZmluZQlMSU5FU1oJNgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KKyNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCisjZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLworCitzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Cit7CisgIHVuaW9uIHsKKyAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKKyAgICBzdHJ1Y3QgeworICAgICAgY2hhciBlX3plcm9lc1s0XTsKKyAgICAgIGNoYXIgZV9vZmZzZXRbNF07CisgICAgfSBlOworICB9IGU7CisgIGNoYXIgZV92YWx1ZVs0XTsKKyAgY2hhciBlX3NjbnVtWzJdOworICBjaGFyIGVfdHlwZVsyXTsKKyAgY2hhciBlX3NjbGFzc1sxXTsKKyAgY2hhciBlX251bWF1eFsxXTsKK307CisKKworCisjZGVmaW5lIE5fQlRNQVNLCSgwMTcpCisjZGVmaW5lIE5fVE1BU0sJCSgwNjApCisjZGVmaW5lIE5fQlRTSEZUCSg0KQorI2RlZmluZSBOX1RTSElGVAkoMikKKworCit1bmlvbiBleHRlcm5hbF9hdXhlbnQgeworCXN0cnVjdCB7CisJCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KKwkJdW5pb24geworCQkJc3RydWN0IHsKKwkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCisJCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLworCQkJfSB4X2xuc3o7CisJCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KKwkJfSB4X21pc2M7CisJCXVuaW9uIHsKKwkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KKwkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KKwkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KKwkJCX0geF9mY247CisJCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCisJCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKKwkJCX0geF9hcnk7CisJCX0geF9mY25hcnk7CisJCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCisJfSB4X3N5bTsKKworCXVuaW9uIHsKKwkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOworCQlzdHJ1Y3QgeworCQkJY2hhciB4X3plcm9lc1s0XTsKKwkJCWNoYXIgeF9vZmZzZXRbNF07CisJCX0geF9uOworCX0geF9maWxlOworCisJc3RydWN0IHsKKwkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLworCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLworCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLworCX0geF9zY247CisKKyAgICAgICAgc3RydWN0IHsKKwkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLworCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KKwkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLworCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KKworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgeF9zY25sZW5bNF07CisJCXVuc2lnbmVkIGNoYXIgeF9wYXJtaGFzaFs0XTsKKwkJdW5zaWduZWQgY2hhciB4X3NuaGFzaFsyXTsKKwkJdW5zaWduZWQgY2hhciB4X3NtdHlwWzFdOworCQl1bnNpZ25lZCBjaGFyIHhfc21jbGFzWzFdOworCQl1bnNpZ25lZCBjaGFyIHhfc3RhYls0XTsKKwkJdW5zaWduZWQgY2hhciB4X3Nuc3RhYlsyXTsKKwl9IHhfY3NlY3Q7CisKK307CisKKyNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKKyNkZWZpbmUJU1lNRVNaCTE4CisjZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKKyNkZWZpbmUJQVVYRVNaCTE4CisjZGVmaW5lIERCWE1BU0sgMHg4MAkJLyogZm9yIGRieCBzdG9yYWdlIG1hc2sgKi8KKyNkZWZpbmUgU1lNTkFNRV9JTl9ERUJVRyhzeW1wdHIpICgoc3ltcHRyKS0+bl9zY2xhc3MgJiBEQlhNQVNLKQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKKyAgY2hhciByX3ZhZGRyWzRdOworICBjaGFyIHJfc3ltbmR4WzRdOworICBjaGFyIHJfc2l6ZVsxXTsKKyAgY2hhciByX3R5cGVbMV07Cit9OworCisKKyNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCisjZGVmaW5lIFJFTFNaIDEwCisKKyNkZWZpbmUgREVGQVVMVF9EQVRBX1NFQ1RJT05fQUxJR05NRU5UIDQKKyNkZWZpbmUgREVGQVVMVF9CU1NfU0VDVElPTl9BTElHTk1FTlQgNAorI2RlZmluZSBERUZBVUxUX1RFWFRfU0VDVElPTl9BTElHTk1FTlQgNAorLyogRm9yIG5ldyBzZWN0aW9ucyB3ZSBoYXZuJ3QgaGVhcmQgb2YgYmVmb3JlICovCisjZGVmaW5lIERFRkFVTFRfU0VDVElPTl9BTElHTk1FTlQgNApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvc3RkaW8uYyBiL2FyY2gvcG93ZXJwYy9ib290L3N0ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhYTUyMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3N0ZGlvLmMKQEAgLTAsMCArMSwzMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFBhdWwgTWFja2VycmFzIDE5OTcuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgInN0cmluZy5oIgorI2luY2x1ZGUgInN0ZGlvLmgiCisjaW5jbHVkZSAicHJvbS5oIgorCitzaXplX3Qgc3Rybmxlbihjb25zdCBjaGFyICogcywgc2l6ZV90IGNvdW50KQoreworCWNvbnN0IGNoYXIgKnNjOworCisJZm9yIChzYyA9IHM7IGNvdW50LS0gJiYgKnNjICE9ICdcMCc7ICsrc2MpCisJCS8qIG5vdGhpbmcgKi87CisJcmV0dXJuIHNjIC0gczsKK30KKworZXh0ZXJuIHVuc2lnbmVkIGludCBfX2RpdjY0XzMyKHVuc2lnbmVkIGxvbmcgbG9uZyAqZGl2aWRlbmQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGRpdmlzb3IpOworCisvKiBUaGUgdW5uZWNlc3NhcnkgcG9pbnRlciBjb21wYXJlIGlzIHRoZXJlCisgKiB0byBjaGVjayBmb3IgdHlwZSBzYWZldHkgKG4gbXVzdCBiZSA2NGJpdCkKKyAqLworIyBkZWZpbmUgZG9fZGl2KG4sYmFzZSkgKHsJCQkJCQlcCisJdW5zaWduZWQgaW50IF9fYmFzZSA9IChiYXNlKTsJCQkJCVwKKwl1bnNpZ25lZCBpbnQgX19yZW07CQkJCQkJXAorCSh2b2lkKSgoKHR5cGVvZigobikpICopMCkgPT0gKCh1bnNpZ25lZCBsb25nIGxvbmcgKikwKSk7CVwKKwlpZiAoKChuKSA+PiAzMikgPT0gMCkgewkJCQkJCVwKKwkJX19yZW0gPSAodW5zaWduZWQgaW50KShuKSAlIF9fYmFzZTsJCQlcCisJCShuKSA9ICh1bnNpZ25lZCBpbnQpKG4pIC8gX19iYXNlOwkJCVwKKwl9IGVsc2UJCQkJCQkJCVwKKwkJX19yZW0gPSBfX2RpdjY0XzMyKCYobiksIF9fYmFzZSk7CQkJXAorCV9fcmVtOwkJCQkJCQkJXAorIH0pCisKK3N0YXRpYyBpbnQgc2tpcF9hdG9pKGNvbnN0IGNoYXIgKipzKQoreworCWludCBpLCBjOworCisJZm9yIChpID0gMDsgJzAnIDw9IChjID0gKipzKSAmJiBjIDw9ICc5JzsgKysqcykKKwkJaSA9IGkqMTAgKyBjIC0gJzAnOworCXJldHVybiBpOworfQorCisjZGVmaW5lIFpFUk9QQUQJMQkJLyogcGFkIHdpdGggemVybyAqLworI2RlZmluZSBTSUdOCTIJCS8qIHVuc2lnbmVkL3NpZ25lZCBsb25nICovCisjZGVmaW5lIFBMVVMJNAkJLyogc2hvdyBwbHVzICovCisjZGVmaW5lIFNQQUNFCTgJCS8qIHNwYWNlIGlmIHBsdXMgKi8KKyNkZWZpbmUgTEVGVAkxNgkJLyogbGVmdCBqdXN0aWZpZWQgKi8KKyNkZWZpbmUgU1BFQ0lBTAkzMgkJLyogMHggKi8KKyNkZWZpbmUgTEFSR0UJNjQJCS8qIHVzZSAnQUJDREVGJyBpbnN0ZWFkIG9mICdhYmNkZWYnICovCisKK3N0YXRpYyBjaGFyICogbnVtYmVyKGNoYXIgKiBzdHIsIHVuc2lnbmVkIGxvbmcgbG9uZyBudW0sIGludCBiYXNlLCBpbnQgc2l6ZSwgaW50IHByZWNpc2lvbiwgaW50IHR5cGUpCit7CisJY2hhciBjLHNpZ24sdG1wWzY2XTsKKwljb25zdCBjaGFyICpkaWdpdHM9IjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisJaW50IGk7CisKKwlpZiAodHlwZSAmIExBUkdFKQorCQlkaWdpdHMgPSAiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjsKKwlpZiAodHlwZSAmIExFRlQpCisJCXR5cGUgJj0gflpFUk9QQUQ7CisJaWYgKGJhc2UgPCAyIHx8IGJhc2UgPiAzNikKKwkJcmV0dXJuIDA7CisJYyA9ICh0eXBlICYgWkVST1BBRCkgPyAnMCcgOiAnICc7CisJc2lnbiA9IDA7CisJaWYgKHR5cGUgJiBTSUdOKSB7CisJCWlmICgoc2lnbmVkIGxvbmcgbG9uZyludW0gPCAwKSB7CisJCQlzaWduID0gJy0nOworCQkJbnVtID0gLSAoc2lnbmVkIGxvbmcgbG9uZyludW07CisJCQlzaXplLS07CisJCX0gZWxzZSBpZiAodHlwZSAmIFBMVVMpIHsKKwkJCXNpZ24gPSAnKyc7CisJCQlzaXplLS07CisJCX0gZWxzZSBpZiAodHlwZSAmIFNQQUNFKSB7CisJCQlzaWduID0gJyAnOworCQkJc2l6ZS0tOworCQl9CisJfQorCWlmICh0eXBlICYgU1BFQ0lBTCkgeworCQlpZiAoYmFzZSA9PSAxNikKKwkJCXNpemUgLT0gMjsKKwkJZWxzZSBpZiAoYmFzZSA9PSA4KQorCQkJc2l6ZS0tOworCX0KKwlpID0gMDsKKwlpZiAobnVtID09IDApCisJCXRtcFtpKytdPScwJzsKKwllbHNlIHdoaWxlIChudW0gIT0gMCkgeworCQl0bXBbaSsrXSA9IGRpZ2l0c1tkb19kaXYobnVtLCBiYXNlKV07CisJfQorCWlmIChpID4gcHJlY2lzaW9uKQorCQlwcmVjaXNpb24gPSBpOworCXNpemUgLT0gcHJlY2lzaW9uOworCWlmICghKHR5cGUmKFpFUk9QQUQrTEVGVCkpKQorCQl3aGlsZShzaXplLS0+MCkKKwkJCSpzdHIrKyA9ICcgJzsKKwlpZiAoc2lnbikKKwkJKnN0cisrID0gc2lnbjsKKwlpZiAodHlwZSAmIFNQRUNJQUwpIHsKKwkJaWYgKGJhc2U9PTgpCisJCQkqc3RyKysgPSAnMCc7CisJCWVsc2UgaWYgKGJhc2U9PTE2KSB7CisJCQkqc3RyKysgPSAnMCc7CisJCQkqc3RyKysgPSBkaWdpdHNbMzNdOworCQl9CisJfQorCWlmICghKHR5cGUgJiBMRUZUKSkKKwkJd2hpbGUgKHNpemUtLSA+IDApCisJCQkqc3RyKysgPSBjOworCXdoaWxlIChpIDwgcHJlY2lzaW9uLS0pCisJCSpzdHIrKyA9ICcwJzsKKwl3aGlsZSAoaS0tID4gMCkKKwkJKnN0cisrID0gdG1wW2ldOworCXdoaWxlIChzaXplLS0gPiAwKQorCQkqc3RyKysgPSAnICc7CisJcmV0dXJuIHN0cjsKK30KKworaW50IHZzcHJpbnRmKGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCit7CisJaW50IGxlbjsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbnVtOworCWludCBpLCBiYXNlOworCWNoYXIgKiBzdHI7CisJY29uc3QgY2hhciAqczsKKworCWludCBmbGFnczsJCS8qIGZsYWdzIHRvIG51bWJlcigpICovCisKKwlpbnQgZmllbGRfd2lkdGg7CS8qIHdpZHRoIG9mIG91dHB1dCBmaWVsZCAqLworCWludCBwcmVjaXNpb247CQkvKiBtaW4uICMgb2YgZGlnaXRzIGZvciBpbnRlZ2VyczsgbWF4CisJCQkJICAgbnVtYmVyIG9mIGNoYXJzIGZvciBmcm9tIHN0cmluZyAqLworCWludCBxdWFsaWZpZXI7CQkvKiAnaCcsICdsJywgb3IgJ0wnIGZvciBpbnRlZ2VyIGZpZWxkcyAqLworCSAgICAgICAgICAgICAgICAgICAgICAgIC8qICd6JyBzdXBwb3J0IGFkZGVkIDIzLzcvMTk5OSBTLkguICAgICovCisJCQkJLyogJ3onIGNoYW5nZWQgdG8gJ1onIC0tZGF2aWRtIDEvMjUvOTkgKi8KKworCQorCWZvciAoc3RyPWJ1ZiA7ICpmbXQgOyArK2ZtdCkgeworCQlpZiAoKmZtdCAhPSAnJScpIHsKKwkJCSpzdHIrKyA9ICpmbXQ7CisJCQljb250aW51ZTsKKwkJfQorCQkJCisJCS8qIHByb2Nlc3MgZmxhZ3MgKi8KKwkJZmxhZ3MgPSAwOworCQlyZXBlYXQ6CisJCQkrK2ZtdDsJCS8qIHRoaXMgYWxzbyBza2lwcyBmaXJzdCAnJScgKi8KKwkJCXN3aXRjaCAoKmZtdCkgeworCQkJCWNhc2UgJy0nOiBmbGFncyB8PSBMRUZUOyBnb3RvIHJlcGVhdDsKKwkJCQljYXNlICcrJzogZmxhZ3MgfD0gUExVUzsgZ290byByZXBlYXQ7CisJCQkJY2FzZSAnICc6IGZsYWdzIHw9IFNQQUNFOyBnb3RvIHJlcGVhdDsKKwkJCQljYXNlICcjJzogZmxhZ3MgfD0gU1BFQ0lBTDsgZ290byByZXBlYXQ7CisJCQkJY2FzZSAnMCc6IGZsYWdzIHw9IFpFUk9QQUQ7IGdvdG8gcmVwZWF0OworCQkJCX0KKwkJCisJCS8qIGdldCBmaWVsZCB3aWR0aCAqLworCQlmaWVsZF93aWR0aCA9IC0xOworCQlpZiAoJzAnIDw9ICpmbXQgJiYgKmZtdCA8PSAnOScpCisJCQlmaWVsZF93aWR0aCA9IHNraXBfYXRvaSgmZm10KTsKKwkJZWxzZSBpZiAoKmZtdCA9PSAnKicpIHsKKwkJCSsrZm10OworCQkJLyogaXQncyB0aGUgbmV4dCBhcmd1bWVudCAqLworCQkJZmllbGRfd2lkdGggPSB2YV9hcmcoYXJncywgaW50KTsKKwkJCWlmIChmaWVsZF93aWR0aCA8IDApIHsKKwkJCQlmaWVsZF93aWR0aCA9IC1maWVsZF93aWR0aDsKKwkJCQlmbGFncyB8PSBMRUZUOworCQkJfQorCQl9CisKKwkJLyogZ2V0IHRoZSBwcmVjaXNpb24gKi8KKwkJcHJlY2lzaW9uID0gLTE7CisJCWlmICgqZm10ID09ICcuJykgeworCQkJKytmbXQ7CQorCQkJaWYgKCcwJyA8PSAqZm10ICYmICpmbXQgPD0gJzknKQorCQkJCXByZWNpc2lvbiA9IHNraXBfYXRvaSgmZm10KTsKKwkJCWVsc2UgaWYgKCpmbXQgPT0gJyonKSB7CisJCQkJKytmbXQ7CisJCQkJLyogaXQncyB0aGUgbmV4dCBhcmd1bWVudCAqLworCQkJCXByZWNpc2lvbiA9IHZhX2FyZyhhcmdzLCBpbnQpOworCQkJfQorCQkJaWYgKHByZWNpc2lvbiA8IDApCisJCQkJcHJlY2lzaW9uID0gMDsKKwkJfQorCisJCS8qIGdldCB0aGUgY29udmVyc2lvbiBxdWFsaWZpZXIgKi8KKwkJcXVhbGlmaWVyID0gLTE7CisJCWlmICgqZm10ID09ICdoJyB8fCAqZm10ID09ICdsJyB8fCAqZm10ID09ICdMJyB8fCAqZm10ID09J1onKSB7CisJCQlxdWFsaWZpZXIgPSAqZm10OworCQkJKytmbXQ7CisJCX0KKworCQkvKiBkZWZhdWx0IGJhc2UgKi8KKwkJYmFzZSA9IDEwOworCisJCXN3aXRjaCAoKmZtdCkgeworCQljYXNlICdjJzoKKwkJCWlmICghKGZsYWdzICYgTEVGVCkpCisJCQkJd2hpbGUgKC0tZmllbGRfd2lkdGggPiAwKQorCQkJCQkqc3RyKysgPSAnICc7CisJCQkqc3RyKysgPSAodW5zaWduZWQgY2hhcikgdmFfYXJnKGFyZ3MsIGludCk7CisJCQl3aGlsZSAoLS1maWVsZF93aWR0aCA+IDApCisJCQkJKnN0cisrID0gJyAnOworCQkJY29udGludWU7CisKKwkJY2FzZSAncyc6CisJCQlzID0gdmFfYXJnKGFyZ3MsIGNoYXIgKik7CisJCQlpZiAoIXMpCisJCQkJcyA9ICI8TlVMTD4iOworCisJCQlsZW4gPSBzdHJubGVuKHMsIHByZWNpc2lvbik7CisKKwkJCWlmICghKGZsYWdzICYgTEVGVCkpCisJCQkJd2hpbGUgKGxlbiA8IGZpZWxkX3dpZHRoLS0pCisJCQkJCSpzdHIrKyA9ICcgJzsKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKwkJCQkqc3RyKysgPSAqcysrOworCQkJd2hpbGUgKGxlbiA8IGZpZWxkX3dpZHRoLS0pCisJCQkJKnN0cisrID0gJyAnOworCQkJY29udGludWU7CisKKwkJY2FzZSAncCc6CisJCQlpZiAoZmllbGRfd2lkdGggPT0gLTEpIHsKKwkJCQlmaWVsZF93aWR0aCA9IDIqc2l6ZW9mKHZvaWQgKik7CisJCQkJZmxhZ3MgfD0gWkVST1BBRDsKKwkJCX0KKwkJCXN0ciA9IG51bWJlcihzdHIsCisJCQkJKHVuc2lnbmVkIGxvbmcpIHZhX2FyZyhhcmdzLCB2b2lkICopLCAxNiwKKwkJCQlmaWVsZF93aWR0aCwgcHJlY2lzaW9uLCBmbGFncyk7CisJCQljb250aW51ZTsKKworCisJCWNhc2UgJ24nOgorCQkJaWYgKHF1YWxpZmllciA9PSAnbCcpIHsKKwkJCQlsb25nICogaXAgPSB2YV9hcmcoYXJncywgbG9uZyAqKTsKKwkJCQkqaXAgPSAoc3RyIC0gYnVmKTsKKwkJCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdaJykgeworCQkJCXNpemVfdCAqIGlwID0gdmFfYXJnKGFyZ3MsIHNpemVfdCAqKTsKKwkJCQkqaXAgPSAoc3RyIC0gYnVmKTsKKwkJCX0gZWxzZSB7CisJCQkJaW50ICogaXAgPSB2YV9hcmcoYXJncywgaW50ICopOworCQkJCSppcCA9IChzdHIgLSBidWYpOworCQkJfQorCQkJY29udGludWU7CisKKwkJY2FzZSAnJSc6CisJCQkqc3RyKysgPSAnJSc7CisJCQljb250aW51ZTsKKworCQkvKiBpbnRlZ2VyIG51bWJlciBmb3JtYXRzIC0gc2V0IHVwIHRoZSBmbGFncyBhbmQgImJyZWFrIiAqLworCQljYXNlICdvJzoKKwkJCWJhc2UgPSA4OworCQkJYnJlYWs7CisKKwkJY2FzZSAnWCc6CisJCQlmbGFncyB8PSBMQVJHRTsKKwkJY2FzZSAneCc6CisJCQliYXNlID0gMTY7CisJCQlicmVhazsKKworCQljYXNlICdkJzoKKwkJY2FzZSAnaSc6CisJCQlmbGFncyB8PSBTSUdOOworCQljYXNlICd1JzoKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkqc3RyKysgPSAnJSc7CisJCQlpZiAoKmZtdCkKKwkJCQkqc3RyKysgPSAqZm10OworCQkJZWxzZQorCQkJCS0tZm10OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHF1YWxpZmllciA9PSAnbCcpIHsKKwkJCW51bSA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBsb25nKTsKKwkJCWlmIChmbGFncyAmIFNJR04pCisJCQkJbnVtID0gKHNpZ25lZCBsb25nKSBudW07CisJCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdaJykgeworCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHNpemVfdCk7CisJCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdoJykgeworCQkJbnVtID0gKHVuc2lnbmVkIHNob3J0KSB2YV9hcmcoYXJncywgaW50KTsKKwkJCWlmIChmbGFncyAmIFNJR04pCisJCQkJbnVtID0gKHNpZ25lZCBzaG9ydCkgbnVtOworCQl9IGVsc2UgeworCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGludCk7CisJCQlpZiAoZmxhZ3MgJiBTSUdOKQorCQkJCW51bSA9IChzaWduZWQgaW50KSBudW07CisJCX0KKwkJc3RyID0gbnVtYmVyKHN0ciwgbnVtLCBiYXNlLCBmaWVsZF93aWR0aCwgcHJlY2lzaW9uLCBmbGFncyk7CisJfQorCSpzdHIgPSAnXDAnOworCXJldHVybiBzdHItYnVmOworfQorCitpbnQgc3ByaW50ZihjaGFyICogYnVmLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJaW50IGk7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWk9dnNwcmludGYoYnVmLGZtdCxhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBjaGFyIHNwcmludF9idWZbMTAyNF07CisKK2ludAorcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlpbnQgbjsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJbiA9IHZzcHJpbnRmKHNwcmludF9idWYsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXdyaXRlKHN0ZG91dCwgc3ByaW50X2J1Ziwgbik7CisJcmV0dXJuIG47Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9zdGRpby5oIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvc3RkaW8uaAppbmRleCAyNGJkM2E4Li5lYjllMTZjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9zdGRpby5oCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3N0ZGlvLmgKQEAgLTcsMTAgKzcsNCBAQAogCiBleHRlcm4gaW50IHZzcHJpbnRmKGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpOwogCi1leHRlcm4gaW50IHB1dGMoaW50IGMsIHZvaWQgKmYpOwotZXh0ZXJuIGludCBwdXRjaGFyKGludCBjKTsKLWV4dGVybiBpbnQgZ2V0Y2hhcih2b2lkKTsKLQotZXh0ZXJuIGludCBmcHV0cyhjaGFyICpzdHIsIHZvaWQgKmYpOwotCiAjZW5kaWYJCQkJLyogX1BQQ19CT09UX1NURElPX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9zdHJpbmcuUyBiL2FyY2gvcG93ZXJwYy9ib290L3N0cmluZy5TCmluZGV4IGIxZWVhZWQuLmFjM2Q0M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L3N0cmluZy5TCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3N0cmluZy5TCkBAIC0xMDcsMTAgKzEwNywxMiBAQAogCXJsd2lubS4JcjcscjUsMzItMywzLDMxCQkvKiByNyA9IHI1ID4+IDMgKi8KIAlhZGRpCXI2LHIzLC00CiAJYWRkaQlyNCxyNCwtNAotCWJlcQkyZgkJCS8qIGlmIGxlc3MgdGhhbiA4IGJ5dGVzIHRvIGRvICovCisJYmVxCTNmCQkJLyogaWYgbGVzcyB0aGFuIDggYnl0ZXMgdG8gZG8gKi8KIAlhbmRpLglyMCxyNiwzCQkJLyogZ2V0IGRlc3Qgd29yZCBhbGlnbmVkICovCiAJbXRjdHIJcjcKIAlibmUJNWYKKwlhbmRpLglyMCxyNCwzCQkJLyogY2hlY2sgc3JjIHdvcmQgYWxpZ25lZCB0b28gKi8KKwlibmUJM2YKIDE6CWx3eglyNyw0KHI0KQogCWx3enUJcjgsOChyNCkKIAlzdHcJcjcsNChyNikKQEAgLTEzMiw2ICsxMzQsMTEgQEAKIAliZG56CTRiCiAJYmxyCiA1OglzdWJmaWMJcjAscjAsNAorCWNtcHcJY3IxLHIwLHI1CisJYWRkCXI3LHIwLHI0CisJYW5kaS4JcjcscjcsMwkJCS8qIHdpbGwgc291cmNlIGJlIHdvcmQtYWxpZ25lZCB0b28/ICovCisJYmxlCWNyMSwzYgorCWJuZQkzYgkJCS8qIGRvIGJ5dGUtYnktYnl0ZSBpZiBub3QgKi8KIAltdGN0cglyMAogNjoJbGJ6CXI3LDQocjQpCiAJYWRkaQlyNCxyNCwxCkBAIC0xNDksMTAgKzE1NiwxMiBAQAogCXJsd2lubS4JcjcscjUsMzItMywzLDMxCQkvKiByNyA9IHI1ID4+IDMgKi8KIAlhZGQJcjYscjMscjUKIAlhZGQJcjQscjQscjUKLQliZXEJMmYKKwliZXEJM2YKIAlhbmRpLglyMCxyNiwzCiAJbXRjdHIJcjcKIAlibmUJNWYKKwlhbmRpLglyMCxyNCwzCisJYm5lCTNmCiAxOglsd3oJcjcsLTQocjQpCiAJbHd6dQlyOCwtOChyNCkKIAlzdHcJcjcsLTQocjYpCkBAIC0xNzEsNyArMTgwLDEyIEBACiAJc3RidQlyMCwtMShyNikKIAliZG56CTRiCiAJYmxyCi01OgltdGN0cglyMAorNToJY21wdwljcjEscjAscjUKKwlzdWJmCXI3LHIwLHI0CisJYW5kaS4JcjcscjcsMworCWJsZQljcjEsM2IKKwlibmUJM2IKKwltdGN0cglyMAogNjoJbGJ6dQlyNywtMShyNCkKIAlzdGJ1CXI3LC0xKHI2KQogCWJkbnoJNmIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L3pJbWFnZS5jb2ZmLmxkcyBiL2FyY2gvcG93ZXJwYy9ib290L3pJbWFnZS5jb2ZmLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDE2MjUxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvekltYWdlLmNvZmYubGRzCkBAIC0wLDAgKzEsNDYgQEAKK09VVFBVVF9BUkNIKHBvd2VycGM6Y29tbW9uKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLiA9ICg1KjEwMjQqMTAyNCk7CisgIF9zdGFydCA9IC47CisgIC50ZXh0ICAgICAgOgorICB7CisgICAgKigudGV4dCkKKyAgICAqKC5maXh1cCkKKyAgfQorICBfZXRleHQgPSAuOworICAuID0gQUxJR04oNDA5Nik7CisgIC5kYXRhICAgIDoKKyAgeworICAgICooLnJvZGF0YSopCisgICAgKiguZGF0YSopCisgICAgKiguc2RhdGEqKQorICAgIF9fZ290Ml9zdGFydCA9IC47CisgICAgKiguZ290MikKKyAgICBfX2dvdDJfZW5kID0gLjsKKworICAgIF92bWxpbnV4X3N0YXJ0ID0gIC47CisgICAgKigua2VybmVsOnZtbGludXguc3RyaXApCisgICAgX3ZtbGludXhfZW5kID0gIC47CisKKyAgICBfaW5pdHJkX3N0YXJ0ID0gIC47CisgICAgKigua2VybmVsOmluaXRyZCkKKyAgICBfaW5pdHJkX2VuZCA9ICAuOworICB9CisKKyAgLiA9IEFMSUdOKDQwOTYpOworICBfZWRhdGEgID0gIC47CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICA6CisgIHsKKyAgICooLnNic3MpCisgICAqKC5ic3MpCisgIH0KKyAgX2VuZCA9IC4gOworCisgIC9ESVNDQVJELyA6CisgIHsKKyAgICAqKC5jb21tZW50KQorICB9Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9jZWxsX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL2NlbGxfZGVmY29uZmlnCmluZGV4IGI2NTdmN2UuLjA2M2I4NGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2NlbGxfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL2NlbGxfZGVmY29uZmlnCkBAIC01MzMsNiArNTMzLDcgQEAKICMgQ09ORklHX0RMMksgaXMgbm90IHNldAogQ09ORklHX0UxMDAwPW0KICMgQ09ORklHX0UxMDAwX05BUEkgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDBfRElTQUJMRV9QQUNLRVRfU1BMSVQgaXMgbm90IHNldAogIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKICMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9nNV9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9nNV9kZWZjb25maWcKaW5kZXggM2MyMmNjYi4uZDZmZWQzZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvZzVfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL2c1X2RlZmNvbmZpZwpAQCAtNjc1LDYgKzY3NSw3IEBACiAjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKIENPTkZJR19FMTAwMD15CiAjIENPTkZJR19FMTAwMF9OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwX0RJU0FCTEVfUEFDS0VUX1NQTElUIGlzIG5vdCBzZXQKICMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvaXNlcmllc19kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9pc2VyaWVzX2RlZmNvbmZpZwppbmRleCA3NTFhNjIyLi5jNzc1MDI3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9pc2VyaWVzX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9pc2VyaWVzX2RlZmNvbmZpZwpAQCAtNTY3LDYgKzU2Nyw3IEBACiAjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKIENPTkZJR19FMTAwMD1tCiAjIENPTkZJR19FMTAwMF9OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwX0RJU0FCTEVfUEFDS0VUX1NQTElUIGlzIG5vdCBzZXQKICMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbWFwbGVfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbWFwbGVfZGVmY29uZmlnCmluZGV4IDA3YjZkM2QuLjY4MTk0YzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21hcGxlX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9tYXBsZV9kZWZjb25maWcKQEAgLTQ1NCw2ICs0NTQsNyBAQAogIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CiBDT05GSUdfRTEwMDA9eQogIyBDT05GSUdfRTEwMDBfTkFQSSBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMF9ESVNBQkxFX1BBQ0tFVF9TUExJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAogIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzgzNHhfc3lzX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzgzNHhfc3lzX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmZmNzYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODM0eF9zeXNfZGVmY29uZmlnCkBAIC0wLDAgKzEsOTExIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTUtZzQ2MWQ0ZWRmLWRpcnR5CisjIEZyaSBKYW4gMTMgMTE6MDE6NDcgMjAwNgorIworIyBDT05GSUdfUFBDNjQgaXMgbm90IHNldAorQ09ORklHX1BQQzMyPXkKK0NPTkZJR19QUENfTUVSR0U9eQorQ09ORklHX01NVT15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19QUEM9eQorQ09ORklHX0VBUkxZX1BSSU5USz15CitDT05GSUdfR0VORVJJQ19OVlJBTT15CitDT05GSUdfU0NIRURfTk9fTk9fT01JVF9GUkFNRV9QT0lOVEVSPXkKK0NPTkZJR19BUkNIX01BWV9IQVZFX1BDX0ZEQz15CitDT05GSUdfUFBDX09GPXkKK0NPTkZJR19QUENfVURCR18xNjU1MD15CisjIENPTkZJR19HRU5FUklDX1RCU1lOQyBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9VSU1BR0U9eQorCisjCisjIFByb2Nlc3NvciBzdXBwb3J0CisjCisjIENPTkZJR19DTEFTU0lDMzIgaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzUyeHggaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzgyeHggaXMgbm90IHNldAorQ09ORklHX1BQQ184M3h4PXkKKyMgQ09ORklHXzQweCBpcyBub3Qgc2V0CisjIENPTkZJR180NHggaXMgbm90IHNldAorIyBDT05GSUdfOHh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0UyMDAgaXMgbm90IHNldAorIyBDT05GSUdfRTUwMCBpcyBub3Qgc2V0CitDT05GSUdfNnh4PXkKK0NPTkZJR184M3h4PXkKK0NPTkZJR19QUENfRlBVPXkKK0NPTkZJR19QUENfU1REX01NVT15CitDT05GSUdfUFBDX1NURF9NTVVfMzI9eQorIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfRU1CRURERUQ9eQorIyBDT05GSUdfS0FMTFNZTVMgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CisjIENPTkZJR19FUE9MTCBpcyBub3Qgc2V0CitDT05GSUdfU0hNRU09eQorQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCitDT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKK0NPTkZJR19DQ19BTElHTl9MT09QUz0wCitDT05GSUdfQ0NfQUxJR05fSlVNUFM9MAorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS01PRCBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbGF5ZXIKKyMKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorQ09ORklHX0RFRkFVTFRfQVM9eQorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorQ09ORklHX1BQQ19HRU41NTA9eQorIyBDT05GSUdfV0FOVF9FQVJMWV9TRVJJQUwgaXMgbm90IHNldAorCisjCisjIFBsYXRmb3JtIHN1cHBvcnQKKyMKK0NPTkZJR19NUEM4MzR4X1NZUz15CitDT05GSUdfTVBDODM0eD15CisKKyMKKyMgS2VybmVsIG9wdGlvbnMKKyMKKyMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldAorIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MjUwCitDT05GSUdfUFJFRU1QVF9OT05FPXkKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorQ09ORklHX1BST0NfREVWSUNFVFJFRT15CisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorIyBDT05GSUdfUE0gaXMgbm90IHNldAorIyBDT05GSUdfU09GVFdBUkVfU1VTUEVORCBpcyBub3Qgc2V0CitDT05GSUdfU0VDQ09NUD15CitDT05GSUdfSVNBX0RNQV9BUEk9eQorCisjCisjIEJ1cyBvcHRpb25zCisjCitDT05GSUdfR0VORVJJQ19JU0FfRE1BPXkKKyMgQ09ORklHX1BQQ19JODI1OSBpcyBub3Qgc2V0CitDT05GSUdfUFBDX0lORElSRUNUX1BDST15CitDT05GSUdfRlNMX1NPQz15CitDT05GSUdfUENJPXkKK0NPTkZJR19QQ0lfRE9NQUlOUz15CisjIENPTkZJR19QQ0lfTEVHQUNZX1BST0MgaXMgbm90IHNldAorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgUENJIEhvdHBsdWcgU3VwcG9ydAorIworIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAorCisjCisjIEFkdmFuY2VkIHNldHVwCisjCisjIENPTkZJR19BRFZBTkNFRF9PUFRJT05TIGlzIG5vdCBzZXQKKworIworIyBEZWZhdWx0IHNldHRpbmdzIGZvciBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHVzZWQKKyMKK0NPTkZJR19ISUdITUVNX1NUQVJUPTB4ZmUwMDAwMDAKK0NPTkZJR19MT1dNRU1fU0laRT0weDMwMDAwMDAwCitDT05GSUdfS0VSTkVMX1NUQVJUPTB4YzAwMDAwMDAKK0NPTkZJR19UQVNLX1NJWkU9MHg4MDAwMDAwMAorQ09ORklHX0JPT1RfTE9BRD0weDAwODAwMDAwCisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKK0NPTkZJR19TWU5fQ09PS0lFUz15CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0JJQz15CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisKKyMKKyMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgorIworIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCisjIENPTkZJR19NVEQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTMyNzY4CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKKworIworIyBNYWNpbnRvc2ggZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX1dJTkRGQVJNIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEFSQ25ldCBkZXZpY2VzCisjCisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorCisjCisjIFBIWSBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX1BIWUxJQj15CisKKyMKKyMgTUlJIFBIWSBkZXZpY2UgZHJpdmVycworIworQ09ORklHX01BUlZFTExfUEhZPXkKKyMgQ09ORklHX0RBVklDT01fUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FTRU1JX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19MWFRfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJQ0FEQV9QSFkgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKKyMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAorIyBDT05GSUdfQ0FTU0lOSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorCisjCisjIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorQ09ORklHX05FVF9QQ0k9eQorIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAorIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CitDT05GSUdfRTEwMD15CisjIENPTkZJR19GRUFMTlggaXMgbm90IHNldAorIyBDT05GSUdfTkFUU0VNSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORTJLX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5Q1AgaXMgbm90IHNldAorIyBDT05GSUdfODEzOVRPTyBpcyBub3Qgc2V0CisjIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAorIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAorIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAorIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLR0UgaXMgbm90IHNldAorIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CitDT05GSUdfR0lBTkZBUj15CisjIENPTkZJR19HRkFSX05BUEkgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworIyBDT05GSUdfQ0hFTFNJT19UMSBpcyBub3Qgc2V0CisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgVGVsZXBob255IFN1cHBvcnQKKyMKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00CitDT05GSUdfU0VSSUFMXzgyNTBfUlVOVElNRV9VQVJUUz00CisjIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworQ09ORklHX1dBVENIRE9HPXkKKyMgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfODN4eF9XRFQ9eQorCisjCisjIFBDSS1iYXNlZCBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfUENJUENXQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19XRFRQQ0kgaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorQ09ORklHX0dFTl9SVEM9eQorIyBDT05GSUdfR0VOX1JUQ19YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfQUdQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisjIENPTkZJR19URUxDTE9DSyBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19DSEFSREVWPXkKKworIworIyBJMkMgQWxnb3JpdGhtcworIworIyBDT05GSUdfSTJDX0FMR09CSVQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDX0FMSTE1MzUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1NjMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1WDMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDc1NiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSTgwMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSTgxMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAorQ09ORklHX0kyQ19NUEM9eQorIyBDT05GSUdfSTJDX05GT1JDRTIgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BST1NBVkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0FWQUdFNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ3gyMDBfQUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM1NTk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM2MzAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzk2WCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUFQUk8gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BDQV9JU0EgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAorIworIyBDT05GSUdfU0VOU09SU19EUzEzMzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19EUzEzNzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTTQxVDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfWDEyMDVfSTJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIERhbGxhcydzIDEtd2lyZSBidXMKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMKK0NPTkZJR19IV01PTj15CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU0lTNTU5NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WVDgyMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkyRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgQ2FwYWJpbGl0aWVzIFBvcnQgZHJpdmVycworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEluZmluaUJhbmQgc3VwcG9ydAorIworIyBDT05GSUdfSU5GSU5JQkFORCBpcyBub3Qgc2V0CisKKyMKKyMgU04gRGV2aWNlcworIworCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRVhUM19GU19YQVRUUj15CisjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKyMgQ09ORklHX1JFTEFZRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfTkZTX1Y0PXkKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorQ09ORklHX1NVTlJQQ19HU1M9eQorQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR185UF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKKyMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NU0RPU19QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CisKKyMKKyMgSW5zdHJ1bWVudGF0aW9uIFN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfQk9PVFhfVEVYVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfVEVYVF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUdfTFBBUiBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUdfRzUgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX1JUQVMgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX01BUExFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19JU0VSSUVTIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKK0NPTkZJR19DUllQVE89eQorIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX01ENT15CisjIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19ERVM9eQorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBTRUMyLnggT3B0aW9ucworIworQ09ORklHX01QQzgzNDlFX1NFQzJ4PXkKKworIworIyBTRUMyLnggVGVzdCBPcHRpb25zCisjCitDT05GSUdfTVBDODM0OUVfU0VDMnhURVNUPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BtYWMzMl9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wbWFjMzJfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhY2U1N2QKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wbWFjMzJfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTc0NCBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE1CisjIFNhdCBKYW4gMTQgMTY6MjY6MDggMjAwNgorIworIyBDT05GSUdfUFBDNjQgaXMgbm90IHNldAorQ09ORklHX1BQQzMyPXkKK0NPTkZJR19QUENfTUVSR0U9eQorQ09ORklHX01NVT15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19QUEM9eQorQ09ORklHX0VBUkxZX1BSSU5USz15CitDT05GSUdfR0VORVJJQ19OVlJBTT15CitDT05GSUdfU0NIRURfTk9fTk9fT01JVF9GUkFNRV9QT0lOVEVSPXkKK0NPTkZJR19BUkNIX01BWV9IQVZFX1BDX0ZEQz15CitDT05GSUdfUFBDX09GPXkKKyMgQ09ORklHX1BQQ19VREJHXzE2NTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAorIyBDT05GSUdfR0VORVJJQ19UQlNZTkMgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBzdXBwb3J0CisjCitDT05GSUdfQ0xBU1NJQzMyPXkKKyMgQ09ORklHX1BQQ181Mnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ184Mnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ184M3h4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQweCBpcyBub3Qgc2V0CisjIENPTkZJR180NHggaXMgbm90IHNldAorIyBDT05GSUdfOHh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0UyMDAgaXMgbm90IHNldAorIyBDT05GSUdfRTUwMCBpcyBub3Qgc2V0CitDT05GSUdfNnh4PXkKK0NPTkZJR19QUENfRlBVPXkKK0NPTkZJR19BTFRJVkVDPXkKK0NPTkZJR19QUENfU1REX01NVT15CitDT05GSUdfUFBDX1NURF9NTVVfMzI9eQorIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKKyMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCitDT05GSUdfU0xBQj15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorCisjCisjIEJsb2NrIGxheWVyCisjCitDT05GSUdfTEJEPXkKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CitDT05GSUdfREVGQVVMVF9BUz15CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCisKKyMKKyMgUGxhdGZvcm0gc3VwcG9ydAorIworQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNPXkKKyMgQ09ORklHX1BQQ19JU0VSSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VNQkVEREVENnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQVVMgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0NIUlAgaXMgbm90IHNldAorQ09ORklHX1BQQ19QTUFDPXkKK0NPTkZJR19NUElDPXkKKyMgQ09ORklHX1BQQ19SVEFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NSU9fTlZSQU0gaXMgbm90IHNldAorQ09ORklHX1BQQ19NUEMxMDY9eQorQ09ORklHX0NQVV9GUkVRPXkKK0NPTkZJR19DUFVfRlJFUV9UQUJMRT15CisjIENPTkZJR19DUFVfRlJFUV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfU1RBVD15CisjIENPTkZJR19DUFVfRlJFUV9TVEFUX0RFVEFJTFMgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1BFUkZPUk1BTkNFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1VTRVJTUEFDRSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfR09WX1BFUkZPUk1BTkNFPXkKK0NPTkZJR19DUFVfRlJFUV9HT1ZfUE9XRVJTQVZFPXkKK0NPTkZJR19DUFVfRlJFUV9HT1ZfVVNFUlNQQUNFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0dPVl9PTkRFTUFORCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUV9HT1ZfQ09OU0VSVkFUSVZFIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9QTUFDPXkKK0NPTkZJR19QUEM2MDFfU1lOQ19GSVg9eQorIyBDT05GSUdfVEFVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTlRfRUFSTFlfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgb3B0aW9ucworIworIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0yNTAKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfQklORk1UX0VMRj15CitDT05GSUdfQklORk1UX01JU0M9bQorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorQ09ORklHX1BST0NfREVWSUNFVFJFRT15CisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorQ09ORklHX1BNPXkKKyMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0CitDT05GSUdfUE1fREVCVUc9eQorQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQ9eQorQ09ORklHX1BNX1NURF9QQVJUSVRJT049IiIKK0NPTkZJR19TRUNDT01QPXkKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKK0NPTkZJR19HRU5FUklDX0lTQV9ETUE9eQorIyBDT05GSUdfUFBDX0k4MjU5IGlzIG5vdCBzZXQKK0NPTkZJR19QUENfSU5ESVJFQ1RfUENJPXkKK0NPTkZJR19QQ0k9eQorQ09ORklHX1BDSV9ET01BSU5TPXkKK0NPTkZJR19QQ0lfTEVHQUNZX1BST0M9eQorIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCitDT05GSUdfUENDQVJEPW0KKyMgQ09ORklHX1BDTUNJQV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfUENNQ0lBPW0KK0NPTkZJR19QQ01DSUFfTE9BRF9DSVM9eQorQ09ORklHX1BDTUNJQV9JT0NUTD15CitDT05GSUdfQ0FSREJVUz15CisKKyMKKyMgUEMtY2FyZCBicmlkZ2VzCisjCitDT05GSUdfWUVOVEE9bQorQ09ORklHX1lFTlRBX08yPXkKK0NPTkZJR19ZRU5UQV9SSUNPSD15CitDT05GSUdfWUVOVEFfVEk9eQorQ09ORklHX1lFTlRBX0VORV9UVU5FPXkKK0NPTkZJR19ZRU5UQV9UT1NISUJBPXkKKyMgQ09ORklHX1BENjcyOSBpcyBub3Qgc2V0CisjIENPTkZJR19JODIwOTIgaXMgbm90IHNldAorQ09ORklHX1BDQ0FSRF9OT05TVEFUSUM9bQorCisjCisjIFBDSSBIb3RwbHVnIFN1cHBvcnQKKyMKKyMgQ09ORklHX0hPVFBMVUdfUENJIGlzIG5vdCBzZXQKKworIworIyBBZHZhbmNlZCBzZXR1cAorIworIyBDT05GSUdfQURWQU5DRURfT1BUSU9OUyBpcyBub3Qgc2V0CisKKyMKKyMgRGVmYXVsdCBzZXR0aW5ncyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSB1c2VkCisjCitDT05GSUdfSElHSE1FTV9TVEFSVD0weGZlMDAwMDAwCitDT05GSUdfTE9XTUVNX1NJWkU9MHgzMDAwMDAwMAorQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwCitDT05GSUdfVEFTS19TSVpFPTB4ODAwMDAwMDAKK0NPTkZJR19CT09UX0xPQUQ9MHgwMDgwMDAwMAorCisjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CisjIENPTkZJR19JUF9QTlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKK0NPTkZJR19TWU5fQ09PS0lFUz15CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0JJQz15CisKKyMKKyMgSVA6IFZpcnR1YWwgU2VydmVyIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0lQX1ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUj15CisjIENPTkZJR19ORVRGSUxURVJfREVCVUcgaXMgbm90IHNldAorCisjCisjIENvcmUgTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LIGlzIG5vdCBzZXQKKworIworIyBJUDogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19JUF9ORl9DT05OVFJBQ0s9bQorIyBDT05GSUdfSVBfTkZfQ1RfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfRVZFTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX0NUX1BST1RPX1NDVFAgaXMgbm90IHNldAorQ09ORklHX0lQX05GX0ZUUD1tCitDT05GSUdfSVBfTkZfSVJDPW0KK0NPTkZJR19JUF9ORl9ORVRCSU9TX05TPW0KK0NPTkZJR19JUF9ORl9URlRQPW0KK0NPTkZJR19JUF9ORl9BTUFOREE9bQorQ09ORklHX0lQX05GX1BQVFA9bQorIyBDT05GSUdfSVBfTkZfUVVFVUUgaXMgbm90IHNldAorQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9MSU1JVD1tCitDT05GSUdfSVBfTkZfTUFUQ0hfSVBSQU5HRT1tCitDT05GSUdfSVBfTkZfTUFUQ0hfTUFDPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9QS1RUWVBFPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9NQVJLPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9NVUxUSVBPUlQ9bQorQ09ORklHX0lQX05GX01BVENIX1RPUz1tCitDT05GSUdfSVBfTkZfTUFUQ0hfUkVDRU5UPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9FQ049bQorQ09ORklHX0lQX05GX01BVENIX0RTQ1A9bQorQ09ORklHX0lQX05GX01BVENIX0FIX0VTUD1tCitDT05GSUdfSVBfTkZfTUFUQ0hfTEVOR1RIPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9UVEw9bQorQ09ORklHX0lQX05GX01BVENIX1RDUE1TUz1tCitDT05GSUdfSVBfTkZfTUFUQ0hfSEVMUEVSPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9TVEFURT1tCitDT05GSUdfSVBfTkZfTUFUQ0hfQ09OTlRSQUNLPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9PV05FUj1tCisjIENPTkZJR19JUF9ORl9NQVRDSF9BRERSVFlQRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9NQVRDSF9SRUFMTSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9NQVRDSF9TQ1RQIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9NQVRDSF9EQ0NQPW0KKyMgQ09ORklHX0lQX05GX01BVENIX0NPTU1FTlQgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTUFUQ0hfSEFTSExJTUlUIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9NQVRDSF9TVFJJTkc9bQorQ09ORklHX0lQX05GX0ZJTFRFUj1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD1tCisjIENPTkZJR19JUF9ORl9UQVJHRVRfTE9HIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9UQVJHRVRfVUxPRz1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1RDUE1TUz1tCisjIENPTkZJR19JUF9ORl9UQVJHRVRfTkZRVUVVRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfTkZfTkFUPW0KK0NPTkZJR19JUF9ORl9OQVRfTkVFREVEPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERT1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1JFRElSRUNUPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfTkVUTUFQPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfU0FNRT1tCitDT05GSUdfSVBfTkZfTkFUX1NOTVBfQkFTSUM9bQorQ09ORklHX0lQX05GX05BVF9JUkM9bQorQ09ORklHX0lQX05GX05BVF9GVFA9bQorQ09ORklHX0lQX05GX05BVF9URlRQPW0KK0NPTkZJR19JUF9ORl9OQVRfQU1BTkRBPW0KK0NPTkZJR19JUF9ORl9OQVRfUFBUUD1tCisjIENPTkZJR19JUF9ORl9NQU5HTEUgaXMgbm90IHNldAorQ09ORklHX0lQX05GX1JBVz1tCitDT05GSUdfSVBfTkZfVEFSR0VUX05PVFJBQ0s9bQorQ09ORklHX0lQX05GX0FSUFRBQkxFUz1tCitDT05GSUdfSVBfTkZfQVJQRklMVEVSPW0KK0NPTkZJR19JUF9ORl9BUlBfTUFOR0xFPW0KKworIworIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKK0NPTkZJR19JUF9EQ0NQPW0KK0NPTkZJR19JTkVUX0RDQ1BfRElBRz1tCisKKyMKKyMgRENDUCBDQ0lEcyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCitDT05GSUdfSVBfRENDUF9DQ0lEMz1tCitDT05GSUdfSVBfRENDUF9URlJDX0xJQj1tCisKKyMKKyMgRENDUCBLZXJuZWwgSGFja2luZworIworIyBDT05GSUdfSVBfRENDUF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9EQ0NQX1VOTE9BRF9IQUNLIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKK0NPTkZJR19JUkRBPW0KKworIworIyBJckRBIHByb3RvY29scworIworQ09ORklHX0lSTEFOPW0KK0NPTkZJR19JUk5FVD1tCitDT05GSUdfSVJDT01NPW0KKyMgQ09ORklHX0lSREFfVUxUUkEgaXMgbm90IHNldAorCisjCisjIElyREEgb3B0aW9ucworIworQ09ORklHX0lSREFfQ0FDSEVfTEFTVF9MU0FQPXkKK0NPTkZJR19JUkRBX0ZBU1RfUlI9eQorIyBDT05GSUdfSVJEQV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5mcmFyZWQtcG9ydCBkZXZpY2UgZHJpdmVycworIworCisjCisjIFNJUiBkZXZpY2UgZHJpdmVycworIworQ09ORklHX0lSVFRZX1NJUj1tCisKKyMKKyMgRG9uZ2xlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RPTkdMRSBpcyBub3Qgc2V0CisKKyMKKyMgT2xkIFNJUiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfSVJQT1JUX1NJUiBpcyBub3Qgc2V0CisKKyMKKyMgT2xkIFNlcmlhbCBkb25nbGUgc3VwcG9ydAorIworCisjCisjIEZJUiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfVVNCX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfU0lHTUFURUxfRklSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TQ19GSVIgaXMgbm90IHNldAorIyBDT05GSUdfV0lOQk9ORF9GSVIgaXMgbm90IHNldAorIyBDT05GSUdfVE9TSElCQV9GSVIgaXMgbm90IHNldAorIyBDT05GSUdfU01DX0lSQ0NfRklSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FMSV9GSVIgaXMgbm90IHNldAorIyBDT05GSUdfVkxTSV9GSVIgaXMgbm90IHNldAorIyBDT05GSUdfVklBX0ZJUiBpcyBub3Qgc2V0CitDT05GSUdfQlQ9bQorQ09ORklHX0JUX0wyQ0FQPW0KK0NPTkZJR19CVF9TQ089bQorQ09ORklHX0JUX1JGQ09NTT1tCitDT05GSUdfQlRfUkZDT01NX1RUWT15CitDT05GSUdfQlRfQk5FUD1tCitDT05GSUdfQlRfQk5FUF9NQ19GSUxURVI9eQorQ09ORklHX0JUX0JORVBfUFJPVE9fRklMVEVSPXkKK0NPTkZJR19CVF9ISURQPW0KKworIworIyBCbHVldG9vdGggZGV2aWNlIGRyaXZlcnMKKyMKK0NPTkZJR19CVF9IQ0lVU0I9bQorIyBDT05GSUdfQlRfSENJVVNCX1NDTyBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9IQ0lVQVJUIGlzIG5vdCBzZXQKK0NPTkZJR19CVF9IQ0lCQ00yMDNYPW0KKyMgQ09ORklHX0JUX0hDSUJQQTEwWCBpcyBub3Qgc2V0CitDT05GSUdfQlRfSENJQkZVU0I9bQorIyBDT05GSUdfQlRfSENJRFRMMSBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9IQ0lCVDNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUX0hDSUJMVUVDQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUX0hDSUJUVUFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9IQ0lWSENJIGlzIG5vdCBzZXQKK0NPTkZJR19JRUVFODAyMTE9bQorIyBDT05GSUdfSUVFRTgwMjExX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19JRUVFODAyMTFfQ1JZUFRfV0VQPW0KK0NPTkZJR19JRUVFODAyMTFfQ1JZUFRfQ0NNUD1tCitDT05GSUdfSUVFRTgwMjExX0NSWVBUX1RLSVA9bQorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworIyBDT05GSUdfU1RBTkRBTE9ORSBpcyBub3Qgc2V0CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CitDT05GSUdfRldfTE9BREVSPXkKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgorIworQ09ORklHX0NPTk5FQ1RPUj15CitDT05GSUdfUFJPQ19FVkVOVFM9eQorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKK0NPTkZJR19NQUNfRkxPUFBZPW0KKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfVUI9bQorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCitDT05GSUdfSURFPXkKK0NPTkZJR19CTEtfREVWX0lERT15CisKKyMKKyMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCisjCisjIENPTkZJR19CTEtfREVWX0lERV9TQVRBIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURJU0s9eQorIyBDT05GSUdfSURFRElTS19NVUxUSV9NT0RFIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERUNTPW0KK0NPTkZJR19CTEtfREVWX0lERUNEPXkKKyMgQ09ORklHX0JMS19ERVZfSURFVEFQRSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVGTE9QUFk9eQorQ09ORklHX0JMS19ERVZfSURFU0NTST15CisjIENPTkZJR19JREVfVEFTS19JT0NUTCBpcyBub3Qgc2V0CisKKyMKKyMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcworIworIyBDT05GSUdfSURFX0dFTkVSSUMgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFUENJPXkKK0NPTkZJR19JREVQQ0lfU0hBUkVfSVJRPXkKKyMgQ09ORklHX0JMS19ERVZfT0ZGQk9BUkQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfR0VORVJJQz15CisjIENPTkZJR19CTEtfREVWX09QVEk2MjEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfU0w4MkMxMDU9eQorQ09ORklHX0JMS19ERVZfSURFRE1BX1BDST15CisjIENPTkZJR19CTEtfREVWX0lERURNQV9GT1JDRUQgaXMgbm90IHNldAorQ09ORklHX0lERURNQV9QQ0lfQVVUTz15CisjIENPTkZJR19JREVETUFfT05MWURJU0sgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BRUM2MlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQUxJMTVYMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FNRDc0WFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DTUQ2NFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9UUklGTEVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1k4MkM2OTMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DUzU1MjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DUzU1MzAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IUFQzNFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IUFQzNjYgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TQzEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTlM4NzQxNSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9QREMyMDJYWF9ORVc9eQorIyBDT05GSUdfUERDMjAyWFhfRk9SQ0UgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TVldLUyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NJSU1BR0UgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TTEM5MEU2NiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1RSTTI5MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1ZJQTgyQ1hYWCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVfUE1BQz15CitDT05GSUdfQkxLX0RFVl9JREVfUE1BQ19BVEExMDBGSVJTVD15CitDT05GSUdfQkxLX0RFVl9JREVETUFfUE1BQz15CitDT05GSUdfQkxLX0RFVl9JREVfUE1BQ19CTElOSz15CisjIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURNQT15CisjIENPTkZJR19JREVETUFfSVZCIGlzIG5vdCBzZXQKK0NPTkZJR19JREVETUFfQVVUTz15CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJPXkKK0NPTkZJR19TQ1NJX1BST0NfRlM9eQorCisjCisjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCisjCitDT05GSUdfQkxLX0RFVl9TRD15CitDT05GSUdfQ0hSX0RFVl9TVD15CisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfU1I9eQorQ09ORklHX0JMS19ERVZfU1JfVkVORE9SPXkKK0NPTkZJR19DSFJfREVWX1NHPXkKKyMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKKyMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0NPTlNUQU5UUz15CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorCisjCisjIFNDU0kgVHJhbnNwb3J0IEF0dHJpYnV0ZXMKKyMKK0NPTkZJR19TQ1NJX1NQSV9BVFRSUz15CitDT05GSUdfU0NTSV9GQ19BVFRSUz15CisjIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0FUVFJTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCisjCisjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0FJQzdYWFg9bQorQ09ORklHX0FJQzdYWFhfQ01EU19QRVJfREVWSUNFPTI1MworQ09ORklHX0FJQzdYWFhfUkVTRVRfREVMQVlfTVM9MTUwMDAKK0NPTkZJR19BSUM3WFhYX0RFQlVHX0VOQUJMRT15CitDT05GSUdfQUlDN1hYWF9ERUJVR19NQVNLPTAKK0NPTkZJR19BSUM3WFhYX1JFR19QUkVUVFlfUFJJTlQ9eQorQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQ9bQorIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRFBUX0kyTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX1NBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBVEEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9CVVNMT0dJQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRUFUQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9HRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9TWU01M0M4WFhfMj15CitDT05GSUdfU0NTSV9TWU01M0M4WFhfRE1BX0FERFJFU1NJTkdfTU9ERT0wCitDT05GSUdfU0NTSV9TWU01M0M4WFhfREVGQVVMVF9UQUdTPTE2CitDT05GSUdfU0NTSV9TWU01M0M4WFhfTUFYX1RBR1M9NjQKKyMgQ09ORklHX1NDU0lfU1lNNTNDOFhYX0lPTUFQUEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUUxBMlhYWD15CisjIENPTkZJR19TQ1NJX1FMQTJYWFhfRU1CRURERURfRklSTVdBUkUgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9NRVNIPXkKK0NPTkZJR19TQ1NJX01FU0hfU1lOQ19SQVRFPTUKK0NPTkZJR19TQ1NJX01FU0hfUkVTRVRfREVMQVlfTVM9NDAwMAorQ09ORklHX1NDU0lfTUFDNTNDOTQ9eQorCisjCisjIFBDTUNJQSBTQ1NJIGFkYXB0ZXIgc3VwcG9ydAorIworIyBDT05GSUdfUENNQ0lBX0FIQTE1MlggaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX0ZET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX05JTkpBX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX1FMT0dJQyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfU1lNNTNDNTAwIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworQ09ORklHX01EPXkKK0NPTkZJR19CTEtfREVWX01EPW0KK0NPTkZJR19NRF9MSU5FQVI9bQorQ09ORklHX01EX1JBSUQwPW0KK0NPTkZJR19NRF9SQUlEMT1tCisjIENPTkZJR19NRF9SQUlEMTAgaXMgbm90IHNldAorQ09ORklHX01EX1JBSUQ1PW0KK0NPTkZJR19NRF9SQUlENj1tCitDT05GSUdfTURfTVVMVElQQVRIPW0KK0NPTkZJR19NRF9GQVVMVFk9bQorQ09ORklHX0JMS19ERVZfRE09bQorQ09ORklHX0RNX0NSWVBUPW0KKyMgQ09ORklHX0RNX1NOQVBTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNX01JUlJPUiBpcyBub3Qgc2V0CisjIENPTkZJR19ETV9aRVJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNX01VTFRJUEFUSCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TQVMgaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKK0NPTkZJR19JRUVFMTM5ND1tCisKKyMKKyMgU3Vic3lzdGVtIE9wdGlvbnMKKyMKKyMgQ09ORklHX0lFRUUxMzk0X1ZFUkJPU0VERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFMTM5NF9PVUlfREIgaXMgbm90IHNldAorQ09ORklHX0lFRUUxMzk0X0VYVFJBX0NPTkZJR19ST01TPXkKK0NPTkZJR19JRUVFMTM5NF9DT05GSUdfUk9NX0lQMTM5ND15CisjIENPTkZJR19JRUVFMTM5NF9FWFBPUlRfRlVMTF9BUEkgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JRUVFMTM5NF9QQ0lMWU5YIGlzIG5vdCBzZXQKK0NPTkZJR19JRUVFMTM5NF9PSENJMTM5ND1tCisKKyMKKyMgUHJvdG9jb2wgRHJpdmVycworIworQ09ORklHX0lFRUUxMzk0X1ZJREVPMTM5ND1tCitDT05GSUdfSUVFRTEzOTRfU0JQMj1tCisjIENPTkZJR19JRUVFMTM5NF9TQlAyX1BIWVNfRE1BIGlzIG5vdCBzZXQKK0NPTkZJR19JRUVFMTM5NF9FVEgxMzk0PW0KK0NPTkZJR19JRUVFMTM5NF9EVjEzOTQ9bQorQ09ORklHX0lFRUUxMzk0X1JBV0lPPW0KKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisKKyMKKyMgTWFjaW50b3NoIGRldmljZSBkcml2ZXJzCisjCitDT05GSUdfQURCPXkKK0NPTkZJR19BREJfQ1VEQT15CitDT05GSUdfQURCX1BNVT15CitDT05GSUdfUE1BQ19BUE1fRU1VPW0KK0NPTkZJR19QTUFDX01FRElBQkFZPXkKK0NPTkZJR19QTUFDX0JBQ0tMSUdIVD15CitDT05GSUdfSU5QVVRfQURCSElEPXkKK0NPTkZJR19NQUNfRU1VTU9VU0VCVE49eQorQ09ORklHX1RIRVJNX1dJTkRUVU5ORUw9bQorQ09ORklHX1RIRVJNX0FEVDc0Nlg9bQorIyBDT05GSUdfV0lOREZBUk0gaXMgbm90IHNldAorIyBDT05GSUdfQU5TTENEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEFSQ25ldCBkZXZpY2VzCisjCisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorCisjCisjIFBIWSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CitDT05GSUdfTUFDRT15CisjIENPTkZJR19NQUNFX0FBVUlfUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfQk1BQz15CisjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAorQ09ORklHX1NVTkdFTT15CisjIENPTkZJR19DQVNTSU5JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisKKyMKKyMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1BDST15CitDT05GSUdfUENORVQzMj15CisjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAorIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0CisjIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FMktfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlDUCBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5VE9PIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FUElDMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CisjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CisjIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01WNjQzWFhfRVRIIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAorIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CisjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKK0NPTkZJR19ORVRfUkFESU89eQorCisjCisjIE9ic29sZXRlIFdpcmVsZXNzIGNhcmRzIHN1cHBvcnQgKHByZS04MDIuMTEpCisjCisjIENPTkZJR19TVFJJUCBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfV0FWRUxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfTkVUV0FWRSBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgODAyLjExIEZyZXF1ZW5jeSBIb3BwaW5nIGNhcmRzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDTUNJQV9SQVlDUyBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgODAyLjExYiBJU0EvUENJIGNhcmRzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lQVzIxMDAgaXMgbm90IHNldAorIyBDT05GSUdfSVBXMjIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BSVJPIGlzIG5vdCBzZXQKK0NPTkZJR19IRVJNRVM9bQorQ09ORklHX0FQUExFX0FJUlBPUlQ9bQorIyBDT05GSUdfUExYX0hFUk1FUyBpcyBub3Qgc2V0CisjIENPTkZJR19UTURfSEVSTUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PUlRFTF9IRVJNRVMgaXMgbm90IHNldAorIyBDT05GSUdfUENJX0hFUk1FUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1FTCBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgODAyLjExYiBQY21jaWEvQ2FyZGJ1cyBjYXJkcyBzdXBwb3J0CisjCisjIENPTkZJR19QQ01DSUFfSEVSTUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9TUEVDVFJVTSBpcyBub3Qgc2V0CisjIENPTkZJR19BSVJPX0NTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9XTDM1MDEgaXMgbm90IHNldAorCisjCisjIFByaXNtIEdUL0R1ZXR0ZSA4MDIuMTEoYS9iL2cpIFBDSS9DYXJkYnVzIHN1cHBvcnQKKyMKK0NPTkZJR19QUklTTTU0PW0KKyMgQ09ORklHX0hPU1RBUCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1dJUkVMRVNTPXkKKworIworIyBQQ01DSUEgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUX1BDTUNJQSBpcyBub3Qgc2V0CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKK0NPTkZJR19QUFA9eQorQ09ORklHX1BQUF9NVUxUSUxJTks9eQorIyBDT05GSUdfUFBQX0ZJTFRFUiBpcyBub3Qgc2V0CitDT05GSUdfUFBQX0FTWU5DPXkKK0NPTkZJR19QUFBfU1lOQ19UVFk9bQorQ09ORklHX1BQUF9ERUZMQVRFPXkKK0NPTkZJR19QUFBfQlNEQ09NUD1tCisjIENPTkZJR19QUFBfTVBQRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBPRSBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBUZWxlcGhvbnkgU3VwcG9ydAorIworIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRVZERVY9eQorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCitDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfQVRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0U9eQorIyBDT05GSUdfTU9VU0VfUFMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKKyMgQ09ORklHX1NFUklPX0k4MDQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCitDT05GSUdfU0VSSUFMXzgyNTA9bQorIyBDT05GSUdfU0VSSUFMXzgyNTBfQ1MgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKK0NPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTQKKyMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9bQorQ09ORklHX1NFUklBTF9QTUFDWklMT0c9bQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfTlZSQU09eQorQ09ORklHX0dFTl9SVEM9eQorIyBDT05GSUdfR0VOX1JUQ19YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworQ09ORklHX0FHUD1tCitDT05GSUdfQUdQX1VOSU5PUlRIPW0KK0NPTkZJR19EUk09bQorIyBDT05GSUdfRFJNX1RERlggaXMgbm90IHNldAorQ09ORklHX0RSTV9SMTI4PW0KK0NPTkZJR19EUk1fUkFERU9OPW0KKyMgQ09ORklHX0RSTV9NR0EgaXMgbm90IHNldAorIyBDT05GSUdfRFJNX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19EUk1fVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RSTV9TQVZBR0UgaXMgbm90IHNldAorCisjCisjIFBDTUNJQSBjaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfU1lOQ0xJTktfQ1MgaXMgbm90IHNldAorIyBDT05GSUdfQ0FSRE1BTl80MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBUkRNQU5fNDA0MCBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisjIENPTkZJR19URUxDTE9DSyBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19DSEFSREVWPW0KKworIworIyBJMkMgQWxnb3JpdGhtcworIworQ09ORklHX0kyQ19BTEdPQklUPXkKKyMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQ19BTEkxNTM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ3NTYgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDgxMTEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfUE9XRVJNQUM9eQorIyBDT05GSUdfSTJDX01QQyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUFJPU0FWQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TQVZBR0U0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDeDIwMF9BQ0IgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTOTZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NNDFUMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19YMTIwNV9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAorIworIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIENhcGFiaWxpdGllcyBQb3J0IGRyaXZlcnMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCitDT05GSUdfRkI9eQorQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CitDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKK0NPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKK0NPTkZJR19GQl9NQUNNT0RFUz15CitDT05GSUdfRkJfTU9ERV9IRUxQRVJTPXkKK0NPTkZJR19GQl9USUxFQkxJVFRJTkc9eQorIyBDT05GSUdfRkJfQ0lSUlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1BNMiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9DWUJFUjIwMDAgaXMgbm90IHNldAorQ09ORklHX0ZCX09GPXkKK0NPTkZJR19GQl9DT05UUk9MPXkKK0NPTkZJR19GQl9QTEFUSU5VTT15CitDT05GSUdfRkJfVkFMS1lSSUU9eQorQ09ORklHX0ZCX0NUNjU1NTA9eQorIyBDT05GSUdfRkJfQVNJTElBTlQgaXMgbm90IHNldAorQ09ORklHX0ZCX0lNU1RUPXkKKyMgQ09ORklHX0ZCX1ZHQTE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1MxRDEzWFhYIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9OVklESUE9eQorQ09ORklHX0ZCX05WSURJQV9JMkM9eQorIyBDT05GSUdfRkJfUklWQSBpcyBub3Qgc2V0CitDT05GSUdfRkJfTUFUUk9YPXkKK0NPTkZJR19GQl9NQVRST1hfTUlMTEVOSVVNPXkKK0NPTkZJR19GQl9NQVRST1hfTVlTVElRVUU9eQorIyBDT05GSUdfRkJfTUFUUk9YX0cgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUFUUk9YX0kyQyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NQVRST1hfTVVMVElIRUFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1JBREVPTl9PTEQgaXMgbm90IHNldAorQ09ORklHX0ZCX1JBREVPTj15CitDT05GSUdfRkJfUkFERU9OX0kyQz15CisjIENPTkZJR19GQl9SQURFT05fREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZCX0FUWTEyOD15CitDT05GSUdfRkJfQVRZPXkKK0NPTkZJR19GQl9BVFlfQ1Q9eQorIyBDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9BVFlfR1g9eQorIyBDT05GSUdfRkJfU0FWQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9ORU9NQUdJQyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9LWVJPIGlzIG5vdCBzZXQKK0NPTkZJR19GQl8zREZYPXkKKyMgQ09ORklHX0ZCXzNERlhfQUNDRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVk9PRE9PMSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9UUklERU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQorIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ST1RBVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UUyBpcyBub3Qgc2V0CitDT05GSUdfRk9OVF84eDg9eQorQ09ORklHX0ZPTlRfOHgxNj15CisKKyMKKyMgTG9nbyBjb25maWd1cmF0aW9uCisjCitDT05GSUdfTE9HTz15CitDT05GSUdfTE9HT19MSU5VWF9NT05PPXkKK0NPTkZJR19MT0dPX0xJTlVYX1ZHQTE2PXkKK0NPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQ9eQorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworQ09ORklHX1NPVU5EPW0KK0NPTkZJR19ETUFTT1VORF9QTUFDPW0KK0NPTkZJR19ETUFTT1VORD1tCisKKyMKKyMgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlCisjCitDT05GSUdfU05EPW0KK0NPTkZJR19TTkRfVElNRVI9bQorQ09ORklHX1NORF9QQ009bQorQ09ORklHX1NORF9IV0RFUD1tCitDT05GSUdfU05EX1JBV01JREk9bQorQ09ORklHX1NORF9TRVFVRU5DRVI9bQorQ09ORklHX1NORF9TRVFfRFVNTVk9bQorQ09ORklHX1NORF9PU1NFTVVMPXkKK0NPTkZJR19TTkRfTUlYRVJfT1NTPW0KK0NPTkZJR19TTkRfUENNX09TUz1tCitDT05GSUdfU05EX1NFUVVFTkNFUl9PU1M9eQorIyBDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfU1VQUE9SVF9PTERfQVBJPXkKKyMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAorCisjCisjIEdlbmVyaWMgZGV2aWNlcworIworQ09ORklHX1NORF9EVU1NWT1tCisjIENPTkZJR19TTkRfVklSTUlESSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTVRQQVYgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NFUklBTF9VMTY1NTAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01QVTQwMSBpcyBub3Qgc2V0CisKKyMKKyMgUENJIGRldmljZXMKKyMKKyMgQ09ORklHX1NORF9BRDE4ODkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FMUzQwMDAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FMSTU0NTEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FUSUlYUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVRJSVhQX01PREVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BVTg4MTAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FVODgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVU4ODMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BWlQzMzI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9CVDg3WCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ0EwMTA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DTUlQQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NTNDI4MSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ1M0NlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FTVUxMEsxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FTVUxMEsxWCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRU5TMTM3MCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRU5TMTM3MSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRVMxOTM4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FUzE5NjggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0ZNODAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9IREFfSU5URUwgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0hEU1AgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0hEU1BNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JQ0UxNzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JQ0UxNzI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JTlRFTDhYMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5URUw4WDBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9LT1JHMTIxMiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTUFFU1RSTzMgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01JWEFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTk0yNTYgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1BDWEhSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9STUUzMiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUk1FOTYgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1JNRTk2NTIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NPTklDVklCRVMgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1RSSURFTlQgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1ZJQTgyWFggaXMgbm90IHNldAorIyBDT05GSUdfU05EX1ZJQTgyWFhfTU9ERU0gaXMgbm90IHNldAorIyBDT05GSUdfU05EX1ZYMjIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9ZTUZQQ0kgaXMgbm90IHNldAorCisjCisjIEFMU0EgUG93ZXJNYWMgZGV2aWNlcworIworQ09ORklHX1NORF9QT1dFUk1BQz1tCitDT05GSUdfU05EX1BPV0VSTUFDX0FVVE9fRFJDPXkKKworIworIyBVU0IgZGV2aWNlcworIworQ09ORklHX1NORF9VU0JfQVVESU89bQorIyBDT05GSUdfU05EX1VTQl9VU1gyWSBpcyBub3Qgc2V0CisKKyMKKyMgUENNQ0lBIGRldmljZXMKKyMKKworIworIyBPcGVuIFNvdW5kIFN5c3RlbQorIworIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorQ09ORklHX1VTQj15CisjIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKK0NPTkZJR19VU0JfREVWSUNFRlM9eQorIyBDT05GSUdfVVNCX0JBTkRXSURUSCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTPXkKKyMgQ09ORklHX1VTQl9TVVNQRU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAorCisjCisjIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworIyBDT05GSUdfVVNCX0VIQ0lfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfVVNCX1VIQ0lfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworIyBDT05GSUdfT0JTT0xFVEVfT1NTX1VTQl9EUklWRVIgaXMgbm90IHNldAorQ09ORklHX1VTQl9BQ009bQorQ09ORklHX1VTQl9QUklOVEVSPW0KKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisKKyMKKyMgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgorIworIyBDT05GSUdfVVNCX1NUT1JBR0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW5wdXQgRGV2aWNlcworIworQ09ORklHX1VTQl9ISUQ9eQorQ09ORklHX1VTQl9ISURJTlBVVD15CisjIENPTkZJR19ISURfRkYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0hJRERFViBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQUlQVEVLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XQUNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQUNFQ0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQlRBQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUE9XRVJNQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lUTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FR0FMQVggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1lFQUxJTksgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1hQQUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0FQUExFVE9VQ0g9eQorCisjCisjIFVTQiBJbWFnaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKKworIworIyBVU0IgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19VU0JfREFCVVNCIGlzIG5vdCBzZXQKKworIworIyBWaWRlbzRMaW51eCBzdXBwb3J0IGlzIG5lZWRlZCBmb3IgVVNCIE11bHRpbWVkaWEgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBVU0IgTmV0d29yayBBZGFwdGVycworIworIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1VTQk5FVD1tCitDT05GSUdfVVNCX05FVF9BWDg4MTdYPW0KK0NPTkZJR19VU0JfTkVUX0NEQ0VUSEVSPW0KKyMgQ09ORklHX1VTQl9ORVRfR0w2MjBBIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTkVUX05FVDEwODA9bQorIyBDT05GSUdfVVNCX05FVF9QTFVTQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTkVUX1JORElTX0hPU1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX05FVF9DRENfU1VCU0VUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTkVUX1pBVVJVUz1tCisjIENPTkZJR19VU0JfWkQxMjAxIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTU9OPXkKKworIworIyBVU0IgcG9ydCBkcml2ZXJzCisjCisKKyMKKyMgVVNCIFNlcmlhbCBDb252ZXJ0ZXIgc3VwcG9ydAorIworQ09ORklHX1VTQl9TRVJJQUw9bQorIyBDT05GSUdfVVNCX1NFUklBTF9HRU5FUklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQUlSUFJJTUUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9BTllEQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQkVMS0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfV0hJVEVIRUFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRElHSV9BQ0NFTEVQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQ1AyMTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQ1lQUkVTU19NOCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0VNUEVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRlRESV9TSU8gaXMgbm90IHNldAorQ09ORklHX1VTQl9TRVJJQUxfVklTT1I9bQorQ09ORklHX1VTQl9TRVJJQUxfSVBBUT1tCisjIENPTkZJR19VU0JfU0VSSUFMX0lSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRURHRVBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9FREdFUE9SVF9USSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0dBUk1JTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0lQVyBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1BEQT1tCitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOPW0KK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fTVBSPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMjg9eQorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0EyOFg9eQorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0EyOFhBPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMjhYQj15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTE5PXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMThYPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMTlXPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMTlRVz15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTE5UUk9eQorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0E0OVc9eQorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0E0OVdMQz15CisjIENPTkZJR19VU0JfU0VSSUFMX0tMU0kgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9LT0JJTF9TQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9NQ1RfVTIzMiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1BMMjMwMyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0hQNFggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9TQUZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfVEkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9DWUJFUkpBQ0sgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9YSVJDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9PUFRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9PTU5JTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfRVpVU0I9eQorCisjCisjIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUS0lUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUU0VSVk8gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKKworIworIyBVU0IgRFNMIG1vZGVtIHN1cHBvcnQKKyMKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKworIworIyBTTiBEZXZpY2VzCisjCisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorQ09ORklHX0ZVU0VfRlM9bQorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19JU085NjYwX0ZTPXkKK0NPTkZJR19KT0xJRVQ9eQorQ09ORklHX1pJU09GUz15CitDT05GSUdfWklTT0ZTX0ZTPXkKK0NPTkZJR19VREZfRlM9bQorQ09ORklHX1VERl9OTFM9eQorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19GQVRfRlM9bQorQ09ORklHX01TRE9TX0ZTPW0KK0NPTkZJR19WRkFUX0ZTPW0KK0NPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKK0NPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKK0NPTkZJR19SRUxBWUZTX0ZTPW0KKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0hGU19GUz1tCitDT05GSUdfSEZTUExVU19GUz1tCisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKKyMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNEPXkKKyMgQ09ORklHX05GU0RfVjMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTRF9UQ1AgaXMgbm90IHNldAorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19FWFBPUlRGUz15CitDT05GSUdfTkZTX0NPTU1PTj15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKK0NPTkZJR19TTUJfRlM9bQorIyBDT05GSUdfU01CX05MU19ERUZBVUxUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTUFDX1BBUlRJVElPTj15CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKyMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PW0KKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorQ09ORklHX05MU19JU084ODU5XzE9bQorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorQ09ORklHX05MU19VVEY4PW0KKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQ1JDX0NDSVRUPXkKK0NPTkZJR19DUkMxNj15CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CitDT05GSUdfVEVYVFNFQVJDSD15CitDT05GSUdfVEVYVFNFQVJDSF9LTVA9bQorQ09ORklHX1RFWFRTRUFSQ0hfQk09bQorQ09ORklHX1RFWFRTRUFSQ0hfRlNNPW0KKworIworIyBJbnN0cnVtZW50YXRpb24gU3VwcG9ydAorIworQ09ORklHX1BST0ZJTElORz15CitDT05GSUdfT1BST0ZJTEU9eQorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHR0VSPXkKK0NPTkZJR19YTU9OPXkKK0NPTkZJR19YTU9OX0RFRkFVTFQ9eQorIyBDT05GSUdfQkRJX1NXSVRDSCBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFhfVEVYVD15CisjIENPTkZJR19QUENfRUFSTFlfREVCVUdfTFBBUiBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUdfRzUgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX1JUQVMgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX01BUExFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19JU0VSSUVTIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKK0NPTkZJR19DUllQVE89eQorIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0FFUz1tCisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19BUkM0PW0KKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDPW0KKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2NF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2NF9kZWZjb25maWcKaW5kZXggNTA5Mzk5ZS4uNmY2YzZiZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNjRfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzY0X2RlZmNvbmZpZwpAQCAtNzI0LDYgKzcyNCw3IEBACiAjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKIENPTkZJR19FMTAwMD15CiAjIENPTkZJR19FMTAwMF9OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwX0RJU0FCTEVfUEFDS0VUX1NQTElUIGlzIG5vdCBzZXQKICMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldApAQCAtODYxLDcgKzg2Miw3IEBACiBDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CiAjIENPTkZJR19TRVJJQUxfUE1BQ1pJTE9HIGlzIG5vdCBzZXQKIENPTkZJR19TRVJJQUxfSUNPTT1tCi1DT05GSUdfU0VSSUFMX0pTTT1tCisjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKIENPTkZJR19VTklYOThfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CkBAIC04NzgsNyArODc5LDcgQEAKICMKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5fUlRDPXkKICMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHNlcmllc19kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2RlZmNvbmZpZwppbmRleCBhNTBjZTBmLi5hYTk4OTNhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2RlZmNvbmZpZwpAQCAtNjcxLDYgKzY3MSw3IEBACiAjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKIENPTkZJR19FMTAwMD15CiAjIENPTkZJR19FMTAwMF9OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwX0RJU0FCTEVfUEFDS0VUX1NQTElUIGlzIG5vdCBzZXQKICMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKaW5kZXggOWVkNTUxYi4uYzI4Nzk4MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCkBAIC00LDcgKzQsNiBAQAogCiBpZmVxICgkKENPTkZJR19QUEM2NCkseSkKIEVYVFJBX0NGTEFHUwkrPSAtbW5vLW1pbmltYWwtdG9jCi1DRkxBR1NfaW9jdGwzMi5vICs9IC1JZnMvCiBlbmRpZgogaWZlcSAoJChDT05GSUdfUFBDMzIpLHkpCiBDRkxBR1NfcHJvbV9pbml0Lm8gICAgICArPSAtZlBJQwpAQCAtMTIsMTYgKzExLDE3IEBACiBlbmRpZgogCiBvYmoteQkJCQk6PSBzZW1hcGhvcmUubyBjcHV0YWJsZS5vIHB0cmFjZS5vIHN5c2NhbGxzLm8gXAotCQkJCSAgIGlycS5vIGFsaWduLm8gc2lnbmFsXzMyLm8gcG1jLm8gdmRzby5vCisJCQkJICAgaXJxLm8gYWxpZ24ubyBzaWduYWxfMzIubyBwbWMubyB2ZHNvLm8gXAorCQkJCSAgIGluaXRfdGFzay5vIHByb2Nlc3Mubwogb2JqLXkJCQkJKz0gdmRzbzMyLwogb2JqLSQoQ09ORklHX1BQQzY0KQkJKz0gc2V0dXBfNjQubyBiaW5mbXRfZWxmMzIubyBzeXNfcHBjMzIubyBcCiAJCQkJICAgc2lnbmFsXzY0Lm8gcHRyYWNlMzIubyBzeXN0YmwubyBcCi0JCQkJICAgcGFjYS5vIGlvY3RsMzIubyBjcHVfc2V0dXBfcG93ZXI0Lm8gXAotCQkJCSAgIGZpcm13YXJlLm8gc3lzZnMubyB1ZGJnLm8gaWRsZV82NC5vCisJCQkJICAgcGFjYS5vIGNwdV9zZXR1cF9wb3dlcjQubyBcCisJCQkJICAgZmlybXdhcmUubyBzeXNmcy5vIGlkbGVfNjQubwogb2JqLSQoQ09ORklHX1BQQzY0KQkJKz0gdmRzbzY0Lwogb2JqLSQoQ09ORklHX0FMVElWRUMpCQkrPSB2ZWNlbXUubyB2ZWN0b3Iubwogb2JqLSQoQ09ORklHX1BPV0VSNCkJCSs9IGlkbGVfcG93ZXI0Lm8KLW9iai0kKENPTkZJR19QUENfT0YpCQkrPSBvZl9kZXZpY2Uubworb2JqLSQoQ09ORklHX1BQQ19PRikJCSs9IG9mX2RldmljZS5vIHByb21fcGFyc2UubwogcHJvY2ZzLSQoQ09ORklHX1BQQzY0KQkJOj0gcHJvY19wcGM2NC5vCiBvYmotJChDT05GSUdfUFJPQ19GUykJCSs9ICQocHJvY2ZzLXkpCiBydGFzcGNpLSQoQ09ORklHX1BQQzY0KQkJOj0gcnRhc19wY2kubwpAQCAtMzAsMTIgKzMwLDEwIEBACiBvYmotJChDT05GSUdfUlRBU19QUk9DKQkJKz0gcnRhcy1wcm9jLm8KIG9iai0kKENPTkZJR19MUEFSQ0ZHKQkJKz0gbHBhcmNmZy5vCiBvYmotJChDT05GSUdfSUJNVklPKQkJKz0gdmlvLm8KK29iai0kKENPTkZJR19JQk1FQlVTKSAgICAgICAgICAgKz0gaWJtZWJ1cy5vCiBvYmotJChDT05GSUdfR0VORVJJQ19UQlNZTkMpCSs9IHNtcC10YnN5bmMubwotb2JqLSQoQ09ORklHX1BQQ19QU0VSSUVTKQkrPSB1ZGJnXzE2NTUwLm8KLW9iai0kKENPTkZJR19QUENfTUFQTEUpCQkrPSB1ZGJnXzE2NTUwLm8KLXVkYmdzY2MtJChDT05GSUdfUFBDNjQpCQk6PSB1ZGJnX3NjYy5vCi1vYmotJChDT05GSUdfUFBDX1BNQUMpCQkrPSAkKHVkYmdzY2MteSkKIG9iajY0LSQoQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNKSArPSBudnJhbV82NC5vCitvYmotJChDT05GSUdfQ1JBU0hfRFVNUCkJKz0gY3Jhc2hfZHVtcC5vCiAKIGlmZXEgKCQoQ09ORklHX1BQQ19NRVJHRSkseSkKIApAQCAtNDcsMjYgKzQ1LDI2IEBACiBleHRyYS0kKENPTkZJR184eHgpCQk6PSBoZWFkXzh4eC5vCiBleHRyYS15CQkJCSs9IHZtbGludXgubGRzCiAKLW9iai15CQkJCSs9IHByb2Nlc3MubyBpbml0X3Rhc2subyB0aW1lLm8gXAotCQkJCSAgIHByb20ubyB0cmFwcy5vIHNldHVwLWNvbW1vbi5vCitvYmoteQkJCQkrPSB0aW1lLm8gcHJvbS5vIHRyYXBzLm8gc2V0dXAtY29tbW9uLm8gdWRiZy5vCiBvYmotJChDT05GSUdfUFBDMzIpCQkrPSBlbnRyeV8zMi5vIHNldHVwXzMyLm8gbWlzY18zMi5vIHN5c3RibC5vCiBvYmotJChDT05GSUdfUFBDNjQpCQkrPSBtaXNjXzY0Lm8gZG1hXzY0Lm8gaW9tbXUubwotb2JqLSQoQ09ORklHX1BQQ19PRikJCSs9IHByb21faW5pdC5vCitvYmotJChDT05GSUdfUFBDX01VTFRJUExBVEZPUk0pCSs9IHByb21faW5pdC5vCiBvYmotJChDT05GSUdfTU9EVUxFUykJCSs9IHBwY19rc3ltcy5vCiBvYmotJChDT05GSUdfQk9PVFhfVEVYVCkJKz0gYnRleHQubwogb2JqLSQoQ09ORklHXzZ4eCkJCSs9IGlkbGVfNnh4Lm8KIG9iai0kKENPTkZJR19TTVApCQkrPSBzbXAubwogb2JqLSQoQ09ORklHX0tQUk9CRVMpCQkrPSBrcHJvYmVzLm8KLQorb2JqLSQoQ09ORklHX1BQQ19VREJHXzE2NTUwKQkrPSBsZWdhY3lfc2VyaWFsLm8gdWRiZ18xNjU1MC5vCiBtb2R1bGUtJChDT05GSUdfUFBDNjQpCQkrPSBtb2R1bGVfNjQubwogb2JqLSQoQ09ORklHX01PRFVMRVMpCQkrPSAkKG1vZHVsZS15KQogCiBwY2k2NC0kKENPTkZJR19QUEM2NCkJCSs9IHBjaV82NC5vIHBjaV9kbi5vIHBjaV9pb21tdS5vIFwKIAkJCQkgICBwY2lfZGlyZWN0X2lvbW11Lm8gaW9tYXAubwotb2JqLSQoQ09ORklHX1BDSSkJCSs9ICQocGNpNjQteSkKLQota2V4ZWM2NC0kKENPTkZJR19QUEM2NCkJCSs9IG1hY2hpbmVfa2V4ZWNfNjQubwotb2JqLSQoQ09ORklHX0tFWEVDKQkJKz0gJChrZXhlYzY0LXkpCitwY2kzMi0kKENPTkZJR19QUEMzMikJCTo9IHBjaV8zMi5vCitvYmotJChDT05GSUdfUENJKQkJKz0gJChwY2k2NC15KSAkKHBjaTMyLXkpCitrZXhlYy0kKENPTkZJR19QUEM2NCkJCTo9IG1hY2hpbmVfa2V4ZWNfNjQubyBjcmFzaC5vCitrZXhlYy0kKENPTkZJR19QUEMzMikJCTo9IG1hY2hpbmVfa2V4ZWNfMzIubworb2JqLSQoQ09ORklHX0tFWEVDKQkJKz0gbWFjaGluZV9rZXhlYy5vICQoa2V4ZWMteSkKIAogaWZlcSAoJChDT05GSUdfUFBDX0lTRVJJRVMpLHkpCiAkKG9iaikvaGVhZF82NC5vOiAkKG9iaikvbHBhcm1hcC5zCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggOTE1MzhkMi4uODQwYWFkNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtOTIsOSArOTIsOSBAQAogCiAJREVGSU5FKFRJX0ZMQUdTLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIGZsYWdzKSk7CiAJREVGSU5FKFRJX1BSRUVNUFQsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgcHJlZW1wdF9jb3VudCkpOwotCURFRklORShUSV9TQ19OT0VSUiwgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBzeXNjYWxsX25vZXJyb3IpKTsKLSNpZmRlZiBDT05GSUdfUFBDMzIKKwlERUZJTkUoVElfU0lHRlJBTUUsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgbnZncHJzX2ZyYW1lKSk7CiAJREVGSU5FKFRJX1RBU0ssIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgdGFzaykpOworI2lmZGVmIENPTkZJR19QUEMzMgogCURFRklORShUSV9FWEVDRE9NQUlOLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIGV4ZWNfZG9tYWluKSk7CiAJREVGSU5FKFRJX0NQVSwgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBjcHUpKTsKICNlbmRpZiAvKiBDT05GSUdfUFBDMzIgKi8KQEAgLTEzMSwxMyArMTMxLDExIEBACiAJREVGSU5FKFBBQ0FMT1dIVExCQVJFQVMsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgY29udGV4dC5sb3dfaHRsYl9hcmVhcykpOwogCURFRklORShQQUNBSElHSEhUTEJBUkVBUywgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBjb250ZXh0LmhpZ2hfaHRsYl9hcmVhcykpOwogI2VuZGlmIC8qIENPTkZJR19IVUdFVExCX1BBR0UgKi8KLQlERUZJTkUoUEFDQURFRkFVTFRERUNSLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGRlZmF1bHRfZGVjcikpOwogCURFRklORShQQUNBX0VYR0VOLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGV4Z2VuKSk7CiAJREVGSU5FKFBBQ0FfRVhNQywgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBleG1jKSk7CiAJREVGSU5FKFBBQ0FfRVhTTEIsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgZXhzbGIpKTsKLQlERUZJTkUoUEFDQV9FWERTSSwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBleGRzaSkpOwogCURFRklORShQQUNBRU1FUkdTUCwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBlbWVyZ2VuY3lfc3ApKTsKLQlERUZJTkUoUEFDQUxQUEFDQSwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBscHBhY2EpKTsKKwlERUZJTkUoUEFDQUxQUEFDQVBUUiwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBscHBhY2FfcHRyKSk7CiAJREVGSU5FKFBBQ0FIV0NQVUlELCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGh3X2NwdV9pZCkpOwogCiAJREVGSU5FKExQUEFDQVNSUjAsIG9mZnNldG9mKHN0cnVjdCBscHBhY2EsIHNhdmVkX3NycjApKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYnRleHQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYnRleHQuYwppbmRleCBiZGZiYTkyLi42MjIzZDM5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2J0ZXh0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9idGV4dC5jCkBAIC0zMSwxNSArMzEsMTggQEAKIHN0YXRpYyB2b2lkIGRyYXdfYnl0ZV8xNih1bnNpZ25lZCBjaGFyICpiaXRzLCB1bnNpZ25lZCBpbnQgKmJhc2UsIGludCByYik7CiBzdGF0aWMgdm9pZCBkcmF3X2J5dGVfOCh1bnNpZ25lZCBjaGFyICpiaXRzLCB1bnNpZ25lZCBpbnQgKmJhc2UsIGludCByYik7CiAKLXN0YXRpYyBpbnQgZ19sb2NfWDsKLXN0YXRpYyBpbnQgZ19sb2NfWTsKLXN0YXRpYyBpbnQgZ19tYXhfbG9jX1g7Ci1zdGF0aWMgaW50IGdfbWF4X2xvY19ZOworI2RlZmluZSBfX2ZvcmNlX2RhdGEgX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhIikpKQogCi1zdGF0aWMgaW50IGRpc3BEZXZpY2VSb3dCeXRlczsKLXN0YXRpYyBpbnQgZGlzcERldmljZURlcHRoOwotc3RhdGljIGludCBkaXNwRGV2aWNlUmVjdFs0XTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICpkaXNwRGV2aWNlQmFzZSwgKmxvZ2ljYWxEaXNwbGF5QmFzZTsKK3N0YXRpYyBpbnQgZ19sb2NfWCBfX2ZvcmNlX2RhdGE7CitzdGF0aWMgaW50IGdfbG9jX1kgX19mb3JjZV9kYXRhOworc3RhdGljIGludCBnX21heF9sb2NfWCBfX2ZvcmNlX2RhdGE7CitzdGF0aWMgaW50IGdfbWF4X2xvY19ZIF9fZm9yY2VfZGF0YTsKKworc3RhdGljIGludCBkaXNwRGV2aWNlUm93Qnl0ZXMgX19mb3JjZV9kYXRhOworc3RhdGljIGludCBkaXNwRGV2aWNlRGVwdGggIF9fZm9yY2VfZGF0YTsKK3N0YXRpYyBpbnQgZGlzcERldmljZVJlY3RbNF0gX19mb3JjZV9kYXRhOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmRpc3BEZXZpY2VCYXNlIF9fZm9yY2VfZGF0YTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpsb2dpY2FsRGlzcGxheUJhc2UgX19mb3JjZV9kYXRhOwogCiB1bnNpZ25lZCBsb25nIGRpc3BfQkFUWzJdIF9faW5pdGRhdGEgPSB7MCwgMH07CiAKQEAgLTQ3LDcgKzUwLDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgdmdhX2ZvbnRbY21hcHN6XTsKIAotaW50IGJvb3RfdGV4dF9tYXBwZWQ7CitpbnQgYm9vdF90ZXh0X21hcHBlZCBfX2ZvcmNlX2RhdGEgPSAwOwogaW50IGZvcmNlX3ByaW50a190b19idGV4dCA9IDA7CiAKICNpZmRlZiBDT05GSUdfUFBDMzIKQEAgLTU3LDcgKzYwLDcgQEAKICAqCiAgKiBUaGUgZGlzcGxheSBpcyBtYXBwZWQgdG8gdmlydHVhbCBhZGRyZXNzIDB4RDAwMDAwMDAsIHJhdGhlcgogICogdGhhbiAxOjEsIGJlY2F1c2Ugc29tZSBzb21lIENIUlAgbWFjaGluZXMgcHV0IHRoZSBmcmFtZSBidWZmZXIKLSAqIGluIHRoZSByZWdpb24gc3RhcnRpbmcgYXQgMHhDMDAwMDAwMCAoS0VSTkVMQkFTRSkuCisgKiBpbiB0aGUgcmVnaW9uIHN0YXJ0aW5nIGF0IDB4QzAwMDAwMDAgKFBBR0VfT0ZGU0VUKS4KICAqIFRoaXMgbWFwcGluZyBpcyB0ZW1wb3JhcnkgYW5kIHdpbGwgZGlzYXBwZWFyIGFzIHNvb24gYXMgdGhlCiAgKiBzZXR1cCBkb25lIGJ5IE1NVV9Jbml0KCkgaXMgYXBwbGllZC4KICAqCkBAIC02NiwxMCArNjksOSBAQAogICogaXMgcmVhbGx5IGJhZGx5IGFsaWduZWQsIGJ1dCBJIGRpZG4ndCBlbmNvdW50ZXIgdGhpcyBjYXNlCiAgKiB5ZXQuCiAgKi8KLXZvaWQgX19pbml0Ci1idGV4dF9wcmVwYXJlX0JBVCh2b2lkKQordm9pZCBfX2luaXQgYnRleHRfcHJlcGFyZV9CQVQodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHZhZGRyID0gS0VSTkVMQkFTRSArIDB4MTAwMDAwMDA7CisJdW5zaWduZWQgbG9uZyB2YWRkciA9IFBBR0VfT0ZGU0VUICsgMHgxMDAwMDAwMDsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAJdW5zaWduZWQgbG9uZyBsb3diaXRzOwogCkBAIC05NSwxMiArOTcsMTMgQEAKIH0KICNlbmRpZgogCi0vKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZW5hYmxlIHRoZSBlYXJseSBib290IHRleHQgd2hlbiBkb2luZyBPRiBib290aW5nLiBUaGlzCi0gKiB3YXksIHhtb24gb3V0cHV0IHNob3VsZCB3b3JrIHRvbworCisvKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSB0aGUgZWFybHkgYm9vdCB0ZXh0IHdoZW4gZG9pbmcKKyAqIE9GIGJvb3Rpbmcgb3Igd2l0aGluIGJvb3R4IGluaXQuIEl0IG11c3QgYmUgZm9sbG93ZWQgYnkgYSBidGV4dF91bm1hcCgpCisgKiBjYWxsIGJlZm9yZSB0aGUgbG9naWNhbCBhZGRyZXNzIGJlY29tZXMgdW51c2VhYmxlCiAgKi8KLXZvaWQgX19pbml0Ci1idGV4dF9zZXR1cF9kaXNwbGF5KGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBpbnQgcGl0Y2gsCi0JCSAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit2b2lkIF9faW5pdCBidGV4dF9zZXR1cF9kaXNwbGF5KGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBpbnQgcGl0Y2gsCisJCQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogCWdfbG9jX1ggPSAwOwogCWdfbG9jX1kgPSAwOwpAQCAtMTE2LDYgKzExOSwxMSBAQAogCWJvb3RfdGV4dF9tYXBwZWQgPSAxOwogfQogCit2b2lkIF9faW5pdCBidGV4dF91bm1hcCh2b2lkKQoreworCWJvb3RfdGV4dF9tYXBwZWQgPSAwOworfQorCiAvKiBIZXJlJ3MgYSBzbWFsbCB0ZXh0IGVuZ2luZSB0byB1c2UgZHVyaW5nIGVhcmx5IGJvb3QKICAqIG9yIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKICAqCkBAIC0xMjcsNyArMTM1LDcgQEAKICAqICAgIGNoYW5nZXMuCiAgKi8KIAotdm9pZCBtYXBfYm9vdF90ZXh0KHZvaWQpCitzdGF0aWMgdm9pZCBtYXBfYm9vdF90ZXh0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBiYXNlLCBvZmZzZXQsIHNpemU7CiAJdW5zaWduZWQgY2hhciAqdmJhc2U7CkBAIC0xNzUsOCArMTgzLDkgQEAKIAlpZiAocHJvcCkKIAkJYWRkcmVzcyA9ICpwcm9wOwogCi0JLyogRklYTUU6IEFkZCBzdXBwb3J0IGZvciBQQ0kgcmVnIHByb3BlcnRpZXMgKi8KLQorCS8qIEZJWE1FOiBBZGQgc3VwcG9ydCBmb3IgUENJIHJlZyBwcm9wZXJ0aWVzLiBSaWdodCBub3csIG9ubHkKKwkgKiByZWxpYWJsZSBvbiBtYWNzCisJICovCiAJaWYgKGFkZHJlc3MgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTE4NCw3ICsxOTMsNiBAQAogCWdfbG9jX1kgPSAwOwogCWdfbWF4X2xvY19YID0gd2lkdGggLyA4OwogCWdfbWF4X2xvY19ZID0gaGVpZ2h0IC8gMTY7Ci0JbG9naWNhbERpc3BsYXlCYXNlID0gKHVuc2lnbmVkIGNoYXIgKilhZGRyZXNzOwogCWRpc3BEZXZpY2VCYXNlID0gKHVuc2lnbmVkIGNoYXIgKilhZGRyZXNzOwogCWRpc3BEZXZpY2VSb3dCeXRlcyA9IHBpdGNoOwogCWRpc3BEZXZpY2VEZXB0aCA9IGRlcHRoOwpAQCAtMTk3LDE0ICsyMDUsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBfX2luaXQgaW5pdF9ib290X2Rpc3BsYXkodm9pZCkKK2ludCBfX2luaXQgYnRleHRfZmluZF9kaXNwbGF5KGludCBhbGxvd19ub25zdGRvdXQpCiB7CiAJY2hhciAqbmFtZTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gTlVMTDsgCiAJaW50IHJjID0gLUVOT0RFVjsKIAotCXByaW50aygidHJ5aW5nIHRvIGluaXRpYWxpemUgYnRleHQgLi4uXG4iKTsKLQogCW5hbWUgPSAoY2hhciAqKWdldF9wcm9wZXJ0eShvZl9jaG9zZW4sICJsaW51eCxzdGRvdXQtcGF0aCIsIE5VTEwpOwogCWlmIChuYW1lICE9IE5VTEwpIHsKIAkJbnAgPSBvZl9maW5kX25vZGVfYnlfcGF0aChuYW1lKTsKQEAgLTIxOCw4ICsyMjQsOCBAQAogCX0KIAlpZiAobnApCiAJCXJjID0gYnRleHRfaW5pdGlhbGl6ZShucCk7Ci0JaWYgKHJjID09IDApCi0JCXJldHVybjsKKwlpZiAocmMgPT0gMCB8fCAhYWxsb3dfbm9uc3Rkb3V0KQorCQlyZXR1cm4gcmM7CiAKIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJkaXNwbGF5IikpOykgewogCQlpZiAoZ2V0X3Byb3BlcnR5KG5wLCAibGludXgsb3BlbmVkIiwgTlVMTCkpIHsKQEAgLTIyOCw4ICsyMzQsOSBAQAogCQkJcHJpbnRrKCJyZXN1bHQ6ICVkXG4iLCByYyk7CiAJCX0KIAkJaWYgKHJjID09IDApCi0JCQlyZXR1cm47CisJCQlicmVhazsKIAl9CisJcmV0dXJuIHJjOwogfQogCiAvKiBDYWxjIHRoZSBiYXNlIGFkZHJlc3Mgb2YgYSBnaXZlbiBwb2ludCAoeCx5KSAqLwpAQCAtMjc3LDQ0ICsyODQsODMgQEAKIAogdm9pZCBidGV4dF9jbGVhcnNjcmVlbih2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgKmJhc2UJPSAodW5zaWduZWQgbG9uZyAqKWNhbGNfYmFzZSgwLCAwKTsKKwl1bnNpZ25lZCBpbnQgKmJhc2UJPSAodW5zaWduZWQgaW50ICopY2FsY19iYXNlKDAsIDApOwogCXVuc2lnbmVkIGxvbmcgd2lkdGggCT0gKChkaXNwRGV2aWNlUmVjdFsyXSAtIGRpc3BEZXZpY2VSZWN0WzBdKSAqCi0JCQkJCShkaXNwRGV2aWNlRGVwdGggPj4gMykpID4+IDM7CisJCQkJCShkaXNwRGV2aWNlRGVwdGggPj4gMykpID4+IDI7CiAJaW50IGksajsKIAogCWZvciAoaT0wOyBpPChkaXNwRGV2aWNlUmVjdFszXSAtIGRpc3BEZXZpY2VSZWN0WzFdKTsgaSsrKQogCXsKLQkJdW5zaWduZWQgbG9uZyAqcHRyID0gYmFzZTsKKwkJdW5zaWduZWQgaW50ICpwdHIgPSBiYXNlOwogCQlmb3Ioaj13aWR0aDsgajsgLS1qKQogCQkJKihwdHIrKykgPSAwOwotCQliYXNlICs9IChkaXNwRGV2aWNlUm93Qnl0ZXMgPj4gMyk7CisJCWJhc2UgKz0gKGRpc3BEZXZpY2VSb3dCeXRlcyA+PiAyKTsKIAl9CiB9CiAKK3ZvaWQgYnRleHRfZmx1c2hzY3JlZW4odm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgKmJhc2UJPSAodW5zaWduZWQgaW50ICopY2FsY19iYXNlKDAsIDApOworCXVuc2lnbmVkIGxvbmcgd2lkdGggCT0gKChkaXNwRGV2aWNlUmVjdFsyXSAtIGRpc3BEZXZpY2VSZWN0WzBdKSAqCisJCQkJCShkaXNwRGV2aWNlRGVwdGggPj4gMykpID4+IDI7CisJaW50IGksajsKKworCWZvciAoaT0wOyBpIDwgKGRpc3BEZXZpY2VSZWN0WzNdIC0gZGlzcERldmljZVJlY3RbMV0pOyBpKyspCisJeworCQl1bnNpZ25lZCBpbnQgKnB0ciA9IGJhc2U7CisJCWZvcihqID0gd2lkdGg7IGogPiAwOyBqIC09IDgpIHsKKwkJCV9fYXNtX18gX192b2xhdGlsZV9fICgiZGNic3QgMCwlMCIgOjogInIiIChwdHIpKTsKKwkJCXB0ciArPSA4OworCQl9CisJCWJhc2UgKz0gKGRpc3BEZXZpY2VSb3dCeXRlcyA+PiAyKTsKKwl9CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIiA6OjogIm1lbW9yeSIpOworfQorCit2b2lkIGJ0ZXh0X2ZsdXNobGluZSh2b2lkKQoreworCXVuc2lnbmVkIGludCAqYmFzZQk9ICh1bnNpZ25lZCBpbnQgKiljYWxjX2Jhc2UoMCwgZ19sb2NfWSA8PCA0KTsKKwl1bnNpZ25lZCBsb25nIHdpZHRoIAk9ICgoZGlzcERldmljZVJlY3RbMl0gLSBkaXNwRGV2aWNlUmVjdFswXSkgKgorCQkJCQkoZGlzcERldmljZURlcHRoID4+IDMpKSA+PiAyOworCWludCBpLGo7CisKKwlmb3IgKGk9MDsgaSA8IDE2OyBpKyspCisJeworCQl1bnNpZ25lZCBpbnQgKnB0ciA9IGJhc2U7CisJCWZvcihqID0gd2lkdGg7IGogPiAwOyBqIC09IDgpIHsKKwkJCV9fYXNtX18gX192b2xhdGlsZV9fICgiZGNic3QgMCwlMCIgOjogInIiIChwdHIpKTsKKwkJCXB0ciArPSA4OworCQl9CisJCWJhc2UgKz0gKGRpc3BEZXZpY2VSb3dCeXRlcyA+PiAyKTsKKwl9CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIiA6OjogIm1lbW9yeSIpOworfQorCisKICNpZm5kZWYgTk9fU0NST0xMCiBzdGF0aWMgdm9pZCBzY3JvbGxzY3JlZW4odm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nICpzcmMgICAgIAk9ICh1bnNpZ25lZCBsb25nICopY2FsY19iYXNlKDAsMTYpOwotCXVuc2lnbmVkIGxvbmcgKmRzdCAgICAgCT0gKHVuc2lnbmVkIGxvbmcgKiljYWxjX2Jhc2UoMCwwKTsKKwl1bnNpZ25lZCBpbnQgKnNyYyAgICAgCT0gKHVuc2lnbmVkIGludCAqKWNhbGNfYmFzZSgwLDE2KTsKKwl1bnNpZ25lZCBpbnQgKmRzdCAgICAgCT0gKHVuc2lnbmVkIGludCAqKWNhbGNfYmFzZSgwLDApOwogCXVuc2lnbmVkIGxvbmcgd2lkdGggICAgCT0gKChkaXNwRGV2aWNlUmVjdFsyXSAtIGRpc3BEZXZpY2VSZWN0WzBdKSAqCi0JCQkJICAgKGRpc3BEZXZpY2VEZXB0aCA+PiAzKSkgPj4gMzsKKwkJCQkgICAoZGlzcERldmljZURlcHRoID4+IDMpKSA+PiAyOwogCWludCBpLGo7CiAKIAlmb3IgKGk9MDsgaTwoZGlzcERldmljZVJlY3RbM10gLSBkaXNwRGV2aWNlUmVjdFsxXSAtIDE2KTsgaSsrKQogCXsKLQkJdW5zaWduZWQgbG9uZyAqc3JjX3B0ciA9IHNyYzsKLQkJdW5zaWduZWQgbG9uZyAqZHN0X3B0ciA9IGRzdDsKKwkJdW5zaWduZWQgaW50ICpzcmNfcHRyID0gc3JjOworCQl1bnNpZ25lZCBpbnQgKmRzdF9wdHIgPSBkc3Q7CiAJCWZvcihqPXdpZHRoOyBqOyAtLWopCiAJCQkqKGRzdF9wdHIrKykgPSAqKHNyY19wdHIrKyk7Ci0JCXNyYyArPSAoZGlzcERldmljZVJvd0J5dGVzID4+IDMpOwotCQlkc3QgKz0gKGRpc3BEZXZpY2VSb3dCeXRlcyA+PiAzKTsKKwkJc3JjICs9IChkaXNwRGV2aWNlUm93Qnl0ZXMgPj4gMik7CisJCWRzdCArPSAoZGlzcERldmljZVJvd0J5dGVzID4+IDIpOwogCX0KIAlmb3IgKGk9MDsgaTwxNjsgaSsrKQogCXsKLQkJdW5zaWduZWQgbG9uZyAqZHN0X3B0ciA9IGRzdDsKKwkJdW5zaWduZWQgaW50ICpkc3RfcHRyID0gZHN0OwogCQlmb3Ioaj13aWR0aDsgajsgLS1qKQogCQkJKihkc3RfcHRyKyspID0gMDsKLQkJZHN0ICs9IChkaXNwRGV2aWNlUm93Qnl0ZXMgPj4gMyk7CisJCWRzdCArPSAoZGlzcERldmljZVJvd0J5dGVzID4+IDIpOwogCX0KIH0KICNlbmRpZiAvKiBuZGVmIE5PX1NDUk9MTCAqLwpAQCAtMzc3LDYgKzQyMywxNCBAQAogCQlidGV4dF9kcmF3Y2hhcigqYysrKTsKIH0KIAordm9pZCBidGV4dF9kcmF3dGV4dChjb25zdCBjaGFyICpjLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWlmICghYm9vdF90ZXh0X21hcHBlZCkKKwkJcmV0dXJuOworCXdoaWxlIChsZW4tLSkKKwkJYnRleHRfZHJhd2NoYXIoKmMrKyk7Cit9CisKIHZvaWQgYnRleHRfZHJhd2hleCh1bnNpZ25lZCBsb25nIHYpCiB7CiAJY2hhciAqaGV4X3RhYmxlID0gIjAxMjM0NTY3ODlhYmNkZWYiOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHVfc2V0dXBfcG93ZXI0LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wb3dlcjQuUwppbmRleCBjY2E5NDJmLi5iNjFkODZlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wb3dlcjQuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wb3dlcjQuUwpAQCAtMTMwLDcgKzEzMCw3IEBACiAJbWZjcglyNwogCiAJLyogR2V0IHN0b3JhZ2UgcHRyICovCi0JTE9BREFERFIocjUsY3B1X3N0YXRlX3N0b3JhZ2UpCisJTE9BRF9SRUdfSU1NRURJQVRFKHI1LGNwdV9zdGF0ZV9zdG9yYWdlKQogCiAJLyogV2Ugb25seSBkZWFsIHdpdGggOTcwIGZvciBub3cgKi8KIAltZnNwcglyMCxTUFJOX1BWUgpAQCAtMTY0LDcgKzE2NCw3IEBACiAJLyogR2V0IHN0b3JhZ2UgcHRyIChGSVhNRSB3aGVuIHVzaW5nIGFudG9uIHJlbG9jIGFzIHdlCiAJICogYXJlIHJ1bm5pbmcgd2l0aCB0cmFuc2xhdGlvbiBkaXNhYmxlZCBoZXJlCiAJICovCi0JTE9BREFERFIocjUsY3B1X3N0YXRlX3N0b3JhZ2UpCisJTE9BRF9SRUdfSU1NRURJQVRFKHI1LGNwdV9zdGF0ZV9zdG9yYWdlKQogCiAJLyogV2Ugb25seSBkZWFsIHdpdGggOTcwIGZvciBub3cgKi8KIAltZnNwcglyMCxTUFJOX1BWUgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCmluZGV4IDFkODVjZWQuLjEwNjk2NDUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKQEAgLTU1LDcgKzU1LDggQEAKICNkZWZpbmUgQ09NTU9OX1VTRVJfUE9XRVI0CShDT01NT05fVVNFUl9QUEM2NCB8IFBQQ19GRUFUVVJFX1BPV0VSNCkKICNkZWZpbmUgQ09NTU9OX1VTRVJfUE9XRVI1CShDT01NT05fVVNFUl9QUEM2NCB8IFBQQ19GRUFUVVJFX1BPV0VSNSkKICNkZWZpbmUgQ09NTU9OX1VTRVJfUE9XRVI1X1BMVVMJKENPTU1PTl9VU0VSX1BQQzY0IHwgUFBDX0ZFQVRVUkVfUE9XRVI1X1BMVVMpCi0KKyNkZWZpbmUgQ09NTU9OX1VTRVJfQk9PS0UJKFBQQ19GRUFUVVJFXzMyIHwgUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFwKKwkJCQkgUFBDX0ZFQVRVUkVfQk9PS0UpCiAKIC8qIFdlIG9ubHkgc2V0IHRoZSBzcGUgZmVhdHVyZXMgaWYgdGhlIGtlcm5lbCB3YXMgY29tcGlsZWQgd2l0aAogICogc3BlIHN1cHBvcnQKQEAgLTc4LDEwICs3OSw5IEBACiAJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAogCQkubnVtX3BtY3MJCT0gOCwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjMsCi0jaWZkZWYgQ09ORklHX09QUk9GSUxFCiAJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9wb3dlcjMiLAotCQkub3Byb2ZpbGVfbW9kZWwJCT0gJm9wX21vZGVsX3JzNjQsCi0jZW5kaWYKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1JTNjQsCisJCS5wbGF0Zm9ybQkJPSAicG93ZXIzIiwKIAl9LAogCXsJLyogUG93ZXIzKyAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTkzLDEwICs5Myw5IEBACiAJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAogCQkubnVtX3BtY3MJCT0gOCwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjMsCi0jaWZkZWYgQ09ORklHX09QUk9GSUxFCiAJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9wb3dlcjMiLAotCQkub3Byb2ZpbGVfbW9kZWwJCT0gJm9wX21vZGVsX3JzNjQsCi0jZW5kaWYKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1JTNjQsCisJCS5wbGF0Zm9ybQkJPSAicG93ZXIzIiwKIAl9LAogCXsJLyogTm9ydGhzdGFyICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMTA4LDEwICsxMDcsOSBAQAogCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLm51bV9wbWNzCQk9IDgsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXIzLAotI2lmZGVmIENPTkZJR19PUFJPRklMRQogCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvcnM2NCIsCi0JCS5vcHJvZmlsZV9tb2RlbAkJPSAmb3BfbW9kZWxfcnM2NCwKLSNlbmRpZgorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUlM2NCwKKwkJLnBsYXRmb3JtCQk9ICJyczY0IiwKIAl9LAogCXsJLyogUHVsc2FyICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMTIzLDEwICsxMjEsOSBAQAogCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLm51bV9wbWNzCQk9IDgsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXIzLAotI2lmZGVmIENPTkZJR19PUFJPRklMRQogCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvcnM2NCIsCi0JCS5vcHJvZmlsZV9tb2RlbAkJPSAmb3BfbW9kZWxfcnM2NCwKLSNlbmRpZgorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUlM2NCwKKwkJLnBsYXRmb3JtCQk9ICJyczY0IiwKIAl9LAogCXsJLyogSS1zdGFyICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMTM4LDEwICsxMzUsOSBAQAogCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLm51bV9wbWNzCQk9IDgsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXIzLAotI2lmZGVmIENPTkZJR19PUFJPRklMRQogCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvcnM2NCIsCi0JCS5vcHJvZmlsZV9tb2RlbAkJPSAmb3BfbW9kZWxfcnM2NCwKLSNlbmRpZgorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUlM2NCwKKwkJLnBsYXRmb3JtCQk9ICJyczY0IiwKIAl9LAogCXsJLyogUy1zdGFyICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMTUzLDEwICsxNDksOSBAQAogCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLm51bV9wbWNzCQk9IDgsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXIzLAotI2lmZGVmIENPTkZJR19PUFJPRklMRQogCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvcnM2NCIsCi0JCS5vcHJvZmlsZV9tb2RlbAkJPSAmb3BfbW9kZWxfcnM2NCwKLSNlbmRpZgorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUlM2NCwKKwkJLnBsYXRmb3JtCQk9ICJyczY0IiwKIAl9LAogCXsJLyogUG93ZXI0ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMTY4LDEwICsxNjMsOSBAQAogCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLm51bV9wbWNzCQk9IDgsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXI0LAotI2lmZGVmIENPTkZJR19PUFJPRklMRQogCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvcG93ZXI0IiwKLQkJLm9wcm9maWxlX21vZGVsCQk9ICZvcF9tb2RlbF9yczY0LAotI2VuZGlmCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCisJCS5wbGF0Zm9ybQkJPSAicG93ZXI0IiwKIAl9LAogCXsJLyogUG93ZXI0KyAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTE4MywxMCArMTc3LDkgQEAKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5udW1fcG1jcwkJPSA4LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyNCwKLSNpZmRlZiBDT05GSUdfT1BST0ZJTEUKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3Bvd2VyNCIsCi0JCS5vcHJvZmlsZV9tb2RlbAkJPSAmb3BfbW9kZWxfcG93ZXI0LAotI2VuZGlmCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCisJCS5wbGF0Zm9ybQkJPSAicG93ZXI0IiwKIAl9LAogCXsJLyogUFBDOTcwICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMTk5LDEwICsxOTIsOSBAQAogCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLm51bV9wbWNzCQk9IDgsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcHBjOTcwLAotI2lmZGVmIENPTkZJR19PUFJPRklMRQogCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvOTcwIiwKLQkJLm9wcm9maWxlX21vZGVsCQk9ICZvcF9tb2RlbF9wb3dlcjQsCi0jZW5kaWYKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1BPV0VSNCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM5NzAiLAogCX0sCiAjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAjaWYgZGVmaW5lZChDT05GSUdfUFBDNjQpIHx8IGRlZmluZWQoQ09ORklHX1BPV0VSNCkKQEAgLTIyMSwxMCArMjEzLDkgQEAKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5udW1fcG1jcwkJPSA4LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3BwYzk3MCwKLSNpZmRlZiBDT05GSUdfT1BST0ZJTEUKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0Lzk3MCIsCi0JCS5vcHJvZmlsZV9tb2RlbAkJPSAmb3BfbW9kZWxfcG93ZXI0LAotI2VuZGlmCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCisJCS5wbGF0Zm9ybQkJPSAicHBjOTcwIiwKIAl9LAogI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1BQQzY0KSB8fCBkZWZpbmVkKENPTkZJR19QT1dFUjQpICovCiAjaWZkZWYgQ09ORklHX1BQQzY0CkBAIC0yMzgsMTAgKzIyOSw5IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAogCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wcGM5NzAsCi0jaWZkZWYgQ09ORklHX09QUk9GSUxFCiAJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC85NzAiLAotCQkub3Byb2ZpbGVfbW9kZWwJCT0gJm9wX21vZGVsX3Bvd2VyNCwKLSNlbmRpZgorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUE9XRVI0LAorCQkucGxhdGZvcm0JCT0gInBwYzk3MCIsCiAJfSwKIAl7CS8qIFBvd2VyNSBHUiAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTI1MywyNyArMjQzLDI1IEBACiAJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAogCQkubnVtX3BtY3MJCT0gNiwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjQsCi0jaWZkZWYgQ09ORklHX09QUk9GSUxFCiAJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9wb3dlcjUiLAotCQkub3Byb2ZpbGVfbW9kZWwJCT0gJm9wX21vZGVsX3Bvd2VyNCwKLSNlbmRpZgorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUE9XRVI0LAorCQkucGxhdGZvcm0JCT0gInBvd2VyNSIsCiAJfSwKIAl7CS8qIFBvd2VyNSBHUyAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKIAkJLnB2cl92YWx1ZQkJPSAweDAwM2IwMDAwLAotCQkuY3B1X25hbWUJCT0gIlBPV0VSNSAoZ3MpIiwKKwkJLmNwdV9uYW1lCQk9ICJQT1dFUjUrIChncykiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTX1BPV0VSNSwKIAkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUE9XRVI1X1BMVVMsCiAJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAogCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLm51bV9wbWNzCQk9IDYsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXI0LAotI2lmZGVmIENPTkZJR19PUFJPRklMRQotCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvcG93ZXI1IiwKLQkJLm9wcm9maWxlX21vZGVsCQk9ICZvcF9tb2RlbF9wb3dlcjQsCi0jZW5kaWYKKwkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3Bvd2VyNSsiLAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUE9XRVI0LAorCQkucGxhdGZvcm0JCT0gInBvd2VyNSsiLAogCX0sCi0JewkvKiBCRSBERDEueCAqLworCXsJLyogQ2VsbCBCcm9hZGJhbmQgRW5naW5lICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAogCQkucHZyX3ZhbHVlCQk9IDB4MDA3MDAwMDAsCiAJCS5jcHVfbmFtZQkJPSAiQ2VsbCBCcm9hZGJhbmQgRW5naW5lIiwKQEAgLTI4Myw2ICsyNzEsNyBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfYmUsCisJCS5wbGF0Zm9ybQkJPSAicHBjLWNlbGwtYmUiLAogCX0sCiAJewkvKiBkZWZhdWx0IG1hdGNoICovCiAJCS5wdnJfbWFzawkJPSAweDAwMDAwMDAwLApAQCAtMjk0LDYgKzI4Myw3IEBACiAJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAogCQkubnVtX3BtY3MJCT0gNiwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjQsCisJCS5wbGF0Zm9ybQkJPSAicG93ZXI0IiwKIAl9CiAjZW5kaWYJLyogQ09ORklHX1BQQzY0ICovCiAjaWZkZWYgQ09ORklHX1BQQzMyCkBAIC0zMDcsNiArMjk3LDcgQEAKIAkJCVBQQ19GRUFUVVJFX1VOSUZJRURfQ0FDSEUgfCBQUENfRkVBVFVSRV9OT19UQiwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM2MDEiLAogCX0sCiAJewkvKiA2MDMgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC0zMTYsNyArMzA3LDggQEAKIAkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjAzCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjAzLAorCQkucGxhdGZvcm0JCT0gInBwYzYwMyIsCiAJfSwKIAl7CS8qIDYwM2UgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC0zMjYsNyArMzE4LDggQEAKIAkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjAzCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjAzLAorCQkucGxhdGZvcm0JCT0gInBwYzYwMyIsCiAJfSwKIAl7CS8qIDYwM2V2ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMzM2LDcgKzMyOSw4IEBACiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwMworCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwMywKKwkJLnBsYXRmb3JtCQk9ICJwcGM2MDMiLAogCX0sCiAJewkvKiA2MDQgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC0zNDcsNyArMzQxLDggQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDIsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjA0CisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjA0LAorCQkucGxhdGZvcm0JCT0gInBwYzYwNCIsCiAJfSwKIAl7CS8qIDYwNGUgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZmYwMDAsCkBAIC0zNTgsNyArMzUzLDggQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjA0CisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjA0LAorCQkucGxhdGZvcm0JCT0gInBwYzYwNCIsCiAJfSwKIAl7CS8qIDYwNHIgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC0zNjksNyArMzY1LDggQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjA0CisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjA0LAorCQkucGxhdGZvcm0JCT0gInBwYzYwNCIsCiAJfSwKIAl7CS8qIDYwNGV2ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtMzgwLDcgKzM3Nyw4IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwNAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwNCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM2MDQiLAogCX0sCiAJewkvKiA3NDAvNzUwICgweDQyMDIsIGRvbid0IHN1cHBvcnQgVEFVID8pICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmZmZmZmLApAQCAtMzkxLDcgKzM4OSw4IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NTAiLAogCX0sCiAJewkvKiA3NTBDWCAoODAxMDAgYW5kIDgwMTB4PykgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZmZmZjAsCkBAIC00MDIsNyArNDAxLDggQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwY3gKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTBjeCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NTAiLAogCX0sCiAJewkvKiA3NTBDWCAoODIyMDEgYW5kIDgyMjAyKSAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZmZmMCwKQEAgLTQxMyw3ICs0MTMsOCBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTBjeAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MGN4LAorCQkucGxhdGZvcm0JCT0gInBwYzc1MCIsCiAJfSwKIAl7CS8qIDc1MENYZSAoODIyMTQpICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmZmZmYwLApAQCAtNDI0LDcgKzQyNSw4IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MGN4CisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwY3gsCisJCS5wbGF0Zm9ybQkJPSAicHBjNzUwIiwKIAl9LAogCXsJLyogNzUwQ1hlICJHZWtrbyIgKDgzMjE0KSAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZmZmZiwKQEAgLTQzNSw3ICs0MzcsOCBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTBjeAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MGN4LAorCQkucGxhdGZvcm0JCT0gInBwYzc1MCIsCiAJfSwKIAl7CS8qIDc0NS83NTUgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZmYwMDAsCkBAIC00NDYsNyArNDQ5LDggQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwLAorCQkucGxhdGZvcm0JCT0gInBwYzc1MCIsCiAJfSwKIAl7CS8qIDc1MEZYIHJldiAxLnggKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZmZmMDAsCkBAIC00NTcsNyArNDYxLDggQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwLAorCQkucGxhdGZvcm0JCT0gInBwYzc1MCIsCiAJfSwKIAl7CS8qIDc1MEZYIHJldiAyLjAgbXVzdCBkaXNhYmxlIEhJRDBbRFBNXSAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZmZmZiwKQEAgLTQ2OCw3ICs0NzMsOCBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTAKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTAsCisJCS5wbGF0Zm9ybQkJPSAicHBjNzUwIiwKIAl9LAogCXsJLyogNzUwRlggKEFsbCByZXZzIGV4Y2VwdCAyLjApICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtNDc5LDcgKzQ4NSw4IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MGZ4CisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwZngsCisJCS5wbGF0Zm9ybQkJPSAicHBjNzUwIiwKIAl9LAogCXsJLyogNzUwR1ggKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC00OTAsNyArNDk3LDggQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwZngKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTBmeCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NTAiLAogCX0sCiAJewkvKiA3NDAvNzUwIChMMkNSIGJpdCBuZWVkIGZpeHVwIGZvciA3NDApICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtNTAxLDcgKzUwOSw4IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NTAiLAogCX0sCiAJewkvKiA3NDAwIHJldiAxLjEgPyAobm8gVEFVKSAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZmZmZiwKQEAgLTUxMiw3ICs1MjEsOCBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDAwCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQwMCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NDAwIiwKIAl9LAogCXsJLyogNzQwMCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTUyMyw3ICs1MzMsOCBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDAwCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQwMCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NDAwIiwKIAl9LAogCXsJLyogNzQxMCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTUzNCw3ICs1NDUsOCBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDEwCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQxMCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NDAwIiwKIAl9LAogCXsJLyogNzQ1MCAyLjAgLSBubyBkb3plL25hcCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZmZmZiwKQEAgLTU0NSw3ICs1NTcsMTAgQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDYsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQ1eAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgsCisJCS5vcHJvZmlsZV9jcHVfdHlwZSAgICAgID0gInBwYy83NDUwIiwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0c0LAorCQkucGxhdGZvcm0JCT0gInBwYzc0NTAiLAogCX0sCiAJewkvKiA3NDUwIDIuMSAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZmZmZiwKQEAgLTU1Niw3ICs1NzEsMTAgQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDYsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQ1eAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgsCisJCS5vcHJvZmlsZV9jcHVfdHlwZSAgICAgID0gInBwYy83NDUwIiwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0c0LAorCQkucGxhdGZvcm0JCT0gInBwYzc0NTAiLAogCX0sCiAJewkvKiA3NDUwIDIuMyBhbmQgbmV3ZXIgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC01NjcsNyArNTg1LDEwIEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA2LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDV4LAorCQkub3Byb2ZpbGVfY3B1X3R5cGUgICAgICA9ICJwcGMvNzQ1MCIsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9HNCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NDUwIiwKIAl9LAogCXsJLyogNzQ1NSByZXYgMS54ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmZmZjAwLApAQCAtNTc4LDcgKzU5OSwxMCBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNiwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDV4CisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQ1eCwKKwkJLm9wcm9maWxlX2NwdV90eXBlICAgICAgPSAicHBjLzc0NTAiLAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfRzQsCisJCS5wbGF0Zm9ybQkJPSAicHBjNzQ1MCIsCiAJfSwKIAl7CS8qIDc0NTUgcmV2IDIuMCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZmZmZiwKQEAgLTU4OSw3ICs2MTMsMTAgQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDYsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQ1eAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgsCisJCS5vcHJvZmlsZV9jcHVfdHlwZSAgICAgID0gInBwYy83NDUwIiwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0c0LAorCQkucGxhdGZvcm0JCT0gInBwYzc0NTAiLAogCX0sCiAJewkvKiA3NDU1IG90aGVycyAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTYwMCw3ICs2MjcsMTAgQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDYsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQ1eAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgsCisJCS5vcHJvZmlsZV9jcHVfdHlwZSAgICAgID0gInBwYy83NDUwIiwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0c0LAorCQkucGxhdGZvcm0JCT0gInBwYzc0NTAiLAogCX0sCiAJewkvKiA3NDQ3Lzc0NTcgUmV2IDEuMCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZmZmZiwKQEAgLTYxMSw3ICs2NDEsMTAgQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDYsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQ1eAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgsCisJCS5vcHJvZmlsZV9jcHVfdHlwZSAgICAgID0gInBwYy83NDUwIiwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0c0LAorCQkucGxhdGZvcm0JCT0gInBwYzc0NTAiLAogCX0sCiAJewkvKiA3NDQ3Lzc0NTcgUmV2IDEuMSAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZmZmZiwKQEAgLTYyMiw3ICs2NTUsMTAgQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDYsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQ1eAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgsCisJCS5vcHJvZmlsZV9jcHVfdHlwZSAgICAgID0gInBwYy83NDUwIiwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0c0LAorCQkucGxhdGZvcm0JCT0gInBwYzc0NTAiLAogCX0sCiAJewkvKiA3NDQ3Lzc0NTcgUmV2IDEuMiBhbmQgbGF0ZXIgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC02MzMsNyArNjY5LDEwIEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA2LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDV4LAorCQkub3Byb2ZpbGVfY3B1X3R5cGUgICAgICA9ICJwcGMvNzQ1MCIsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9HNCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NDUwIiwKIAl9LAogCXsJLyogNzQ0N0EgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC02NDQsNyArNjgzLDEwIEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA2LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDV4LAorCQkub3Byb2ZpbGVfY3B1X3R5cGUgICAgICA9ICJwcGMvNzQ1MCIsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9HNCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NDUwIiwKIAl9LAogCXsJLyogNzQ0OCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTY1NSw3ICs2OTcsMTAgQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDYsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQ1eAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgsCisJCS5vcHJvZmlsZV9jcHVfdHlwZSAgICAgID0gInBwYy83NDUwIiwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0c0LAorCQkucGxhdGZvcm0JCT0gInBwYzc0NTAiLAogCX0sCiAJewkvKiA4Mnh4ICg4MjQwLCA4MjQ1LCA4MjYwIGFyZSBhbGwgNjAzZSBjb3JlcykgKi8KIAkJLnB2cl9tYXNrCQk9IDB4N2ZmZjAwMDAsCkBAIC02NjUsNyArNzEwLDggQEAKIAkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjAzCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjAzLAorCQkucGxhdGZvcm0JCT0gInBwYzYwMyIsCiAJfSwKIAl7CS8qIEFsbCBHMl9MRSAoNjAzZSBjb3JlLCBwbHVzIHNvbWUpIGhhdmUgdGhlIHNhbWUgcHZyICovCiAJCS5wdnJfbWFzawkJPSAweDdmZmYwMDAwLApAQCAtNjc1LDcgKzcyMSw4IEBACiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwMworCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwMywKKwkJLnBsYXRmb3JtCQk9ICJwcGM2MDMiLAogCX0sCiAJewkvKiBlMzAwIChhIDYwM2UgY29yZSwgcGx1cyBzb21lKSBvbiA4M3h4ICovCiAJCS5wdnJfbWFzawkJPSAweDdmZmYwMDAwLApAQCAtNjg1LDcgKzczMiw4IEBACiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwMworCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwMywKKwkJLnBsYXRmb3JtCQk9ICJwcGM2MDMiLAogCX0sCiAJewkvKiBkZWZhdWx0IG1hdGNoLCB3ZSBhc3N1bWUgc3BsaXQgSS9EIGNhY2hlICYgVEIgKG5vbi02MDEpLi4uICovCiAJCS5wdnJfbWFzawkJPSAweDAwMDAwMDAwLApAQCAtNjk1LDYgKzc0Myw3IEBACiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkucGxhdGZvcm0JCT0gInBwYzYwMyIsCiAJfSwKICNlbmRpZiAvKiBDTEFTU0lDX1BQQyAqLwogI2lmZGVmIENPTkZJR184eHgKQEAgLTcwOCw2ICs3NTcsNyBAQAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBQUENfRkVBVFVSRV8zMiB8IFBQQ19GRUFUVVJFX0hBU19NTVUsCiAJCS5pY2FjaGVfYnNpemUJCT0gMTYsCiAJCS5kY2FjaGVfYnNpemUJCT0gMTYsCisJCS5wbGF0Zm9ybQkJPSAicHBjODIzIiwKIAl9LAogI2VuZGlmIC8qIENPTkZJR184eHggKi8KICNpZmRlZiBDT05GSUdfNDB4CkBAIC03MTksNiArNzY5LDcgQEAKIAkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfCBQUENfRkVBVFVSRV9IQVNfTU1VLAogCQkuaWNhY2hlX2JzaXplCQk9IDE2LAogCQkuZGNhY2hlX2JzaXplCQk9IDE2LAorCQkucGxhdGZvcm0JCT0gInBwYzQwMyIsCiAJfSwKIAl7CS8qIDQwM0dDWCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZmYwMCwKQEAgLTcyOSw2ICs3ODAsNyBAQAogCQkgCVBQQ19GRUFUVVJFX0hBU19NTVUgfCBQUENfRkVBVFVSRV9OT19UQiwKIAkJLmljYWNoZV9ic2l6ZQkJPSAxNiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxNiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0MDMiLAogCX0sCiAJewkvKiA0MDNHID8/ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtNzM4LDYgKzc5MCw3IEBACiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IFBQQ19GRUFUVVJFXzMyIHwgUFBDX0ZFQVRVUkVfSEFTX01NVSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAxNiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxNiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0MDMiLAogCX0sCiAJewkvKiA0MDVHUCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTc0OCw2ICs4MDEsNyBAQAogCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX0hBU180eHhNQUMsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDA1IiwKIAl9LAogCXsJLyogU1RCIDAzeHh4ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtNzU4LDYgKzgxMiw3IEBACiAJCQlQUENfRkVBVFVSRV9IQVNfTU1VIHwgUFBDX0ZFQVRVUkVfSEFTXzR4eE1BQywKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0MDUiLAogCX0sCiAJewkvKiBTVEIgMDR4eHggKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC03NjgsNiArODIzLDcgQEAKIAkJCVBQQ19GRUFUVVJFX0hBU19NTVUgfCBQUENfRkVBVFVSRV9IQVNfNHh4TUFDLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkucGxhdGZvcm0JCT0gInBwYzQwNSIsCiAJfSwKIAl7CS8qIE5QNDA1TCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTc3OCw2ICs4MzQsNyBAQAogCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX0hBU180eHhNQUMsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDA1IiwKIAl9LAogCXsJLyogTlA0R1MzICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtNzg4LDYgKzg0NSw3IEBACiAJCQlQUENfRkVBVFVSRV9IQVNfTU1VIHwgUFBDX0ZFQVRVUkVfSEFTXzR4eE1BQywKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0MDUiLAogCX0sCiAJeyAgIC8qIE5QNDA1SCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTc5OCw2ICs4NTYsNyBAQAogCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX0hBU180eHhNQUMsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDA1IiwKIAl9LAogCXsJLyogNDA1R1ByICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtODA4LDYgKzg2Nyw3IEBACiAJCQlQUENfRkVBVFVSRV9IQVNfTU1VIHwgUFBDX0ZFQVRVUkVfSEFTXzR4eE1BQywKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0MDUiLAogCX0sCiAJeyAgIC8qIFNUQngyNXh4ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtODE4LDYgKzg3OCw3IEBACiAJCQlQUENfRkVBVFVSRV9IQVNfTU1VIHwgUFBDX0ZFQVRVUkVfSEFTXzR4eE1BQywKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0MDUiLAogCX0sCiAJewkvKiA0MDVMUCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTgyNyw2ICs4ODgsNyBAQAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBQUENfRkVBVFVSRV8zMiB8IFBQQ19GRUFUVVJFX0hBU19NTVUsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDA1IiwKIAl9LAogCXsJLyogWGlsaW54IFZpcnRleC1JSSBQcm8gICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtODM3LDYgKzg5OSw3IEBACiAJCQlQUENfRkVBVFVSRV9IQVNfTU1VIHwgUFBDX0ZFQVRVUkVfSEFTXzR4eE1BQywKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0MDUiLAogCX0sCiAJewkvKiA0MDVFUCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTg0Nyw2ICs5MTAsNyBAQAogCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX0hBU180eHhNQUMsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDA1IiwKIAl9LAogCiAjZW5kaWYgLyogQ09ORklHXzQweCAqLwpAQCAtODU2LDgxICs5MjAsOTAgQEAKIAkJLnB2cl92YWx1ZQkJPSAweDQwMDAwODUwLAogCQkuY3B1X25hbWUJCT0gIjQ0MEVQIFJldi4gQSIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNDRYLAotCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiwgLyogNDQwRVAgaGFzIGFuIEZQVSAqLworCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSB8IFBQQ19GRUFUVVJFX0hBU19GUFUsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDQwIiwKIAl9LAogCXsKIAkJLnB2cl9tYXNrCQk9IDB4ZjAwMDBmZmYsCiAJCS5wdnJfdmFsdWUJCT0gMHg0MDAwMDhkMywKIAkJLmNwdV9uYW1lCQk9ICI0NDBFUCBSZXYuIEIiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzQ0WCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIsIC8qIDQ0MEVQIGhhcyBhbiBGUFUgKi8KKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfQk9PS0UgfCBQUENfRkVBVFVSRV9IQVNfRlBVLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkucGxhdGZvcm0JCT0gInBwYzQ0MCIsCiAJfSwKIAl7CS8qIDQ0MEdQIFJldi4gQiAqLwogCQkucHZyX21hc2sJCT0gMHhmMDAwMGZmZiwKIAkJLnB2cl92YWx1ZQkJPSAweDQwMDAwNDQwLAogCQkuY3B1X25hbWUJCT0gIjQ0MEdQIFJldi4gQiIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNDRYLAotCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBQUENfRkVBVFVSRV8zMiB8IFBQQ19GRUFUVVJFX0hBU19NTVUsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX0JPT0tFLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkucGxhdGZvcm0JCT0gInBwYzQ0MGdwIiwKIAl9LAogCXsJLyogNDQwR1AgUmV2LiBDICovCiAJCS5wdnJfbWFzawkJPSAweGYwMDAwZmZmLAogCQkucHZyX3ZhbHVlCQk9IDB4NDAwMDA0ODEsCiAJCS5jcHVfbmFtZQkJPSAiNDQwR1AgUmV2LiBDIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU180NFgsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IFBQQ19GRUFUVVJFXzMyIHwgUFBDX0ZFQVRVUkVfSEFTX01NVSwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfQk9PS0UsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicHBjNDQwZ3AiLAogCX0sCiAJeyAvKiA0NDBHWCBSZXYuIEEgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZjAwMDBmZmYsCiAJCS5wdnJfdmFsdWUJCT0gMHg1MDAwMDg1MCwKIAkJLmNwdV9uYW1lCQk9ICI0NDBHWCBSZXYuIEEiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzQ0WCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfCBQUENfRkVBVFVSRV9IQVNfTU1VLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0NDAiLAogCX0sCiAJeyAvKiA0NDBHWCBSZXYuIEIgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZjAwMDBmZmYsCiAJCS5wdnJfdmFsdWUJCT0gMHg1MDAwMDg1MSwKIAkJLmNwdV9uYW1lCQk9ICI0NDBHWCBSZXYuIEIiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzQ0WCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfCBQUENfRkVBVFVSRV9IQVNfTU1VLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0NDAiLAogCX0sCiAJeyAvKiA0NDBHWCBSZXYuIEMgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZjAwMDBmZmYsCiAJCS5wdnJfdmFsdWUJCT0gMHg1MDAwMDg5MiwKIAkJLmNwdV9uYW1lCQk9ICI0NDBHWCBSZXYuIEMiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzQ0WCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfCBQUENfRkVBVFVSRV9IQVNfTU1VLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0NDAiLAogCX0sCiAJeyAvKiA0NDBHWCBSZXYuIEYgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZjAwMDBmZmYsCiAJCS5wdnJfdmFsdWUJCT0gMHg1MDAwMDg5NCwKIAkJLmNwdV9uYW1lCQk9ICI0NDBHWCBSZXYuIEYiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzQ0WCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfCBQUENfRkVBVFVSRV9IQVNfTU1VLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0NDAiLAogCX0sCiAJeyAvKiA0NDBTUCBSZXYuIEEgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmYwMDBmZmYsCiAJCS5wdnJfdmFsdWUJCT0gMHg1MzAwMDg5MSwKIAkJLmNwdV9uYW1lCQk9ICI0NDBTUCBSZXYuIEEiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzQ0WCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfCBQUENfRkVBVFVSRV9IQVNfTU1VLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0NDAiLAogCX0sCiAJeyAvKiA0NDBTUGUgUmV2LiBBICovCiAJCS5wdnJfbWFzawkJPSAweGZmMDAwZmZmLApAQCAtOTM4LDkgKzEwMTEsMTAgQEAKIAkJLmNwdV9uYW1lCQk9ICI0NDBTUGUgUmV2LiBBIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwKIAkJCUNQVV9GVFJfVVNFX1RCLAotCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBQUENfRkVBVFVSRV8zMiB8IFBQQ19GRUFUVVJFX0hBU19NTVUsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX0JPT0tFLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkucGxhdGZvcm0JCT0gInBwYzQ0MCIsCiAJfSwKICNlbmRpZiAvKiBDT05GSUdfNDR4ICovCiAjaWZkZWYgQ09ORklHX0ZTTF9CT09LRQpAQCAtOTUwLDEwICsxMDI0LDExIEBACiAJCS5jcHVfbmFtZQkJPSAiZTIwMHo1IiwKIAkJLyogeHh4IC0gZ2FsYWs6IGFkZCBDUFVfRlRSX01BWUJFX0NBTl9ET1pFICovCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfRTIwMCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfAotCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX0hBU19FRlBfU0lOR0xFIHwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfQk9PS0UgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX0VGUF9TSU5HTEUgfAogCQkJUFBDX0ZFQVRVUkVfVU5JRklFRF9DQUNIRSwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM1NTU0IiwKIAl9LAogCXsJLyogZTIwMHo2ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZjAwMDAwLApAQCAtOTYxLDExICsxMDM2LDEyIEBACiAJCS5jcHVfbmFtZQkJPSAiZTIwMHo2IiwKIAkJLyogeHh4IC0gZ2FsYWs6IGFkZCBDUFVfRlRSX01BWUJFX0NBTl9ET1pFICovCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfRTIwMCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfAotCQkJUFBDX0ZFQVRVUkVfSEFTX01NVSB8IFBQQ19GRUFUVVJFX1NQRV9DT01QIHwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfQk9PS0UgfAorCQkJUFBDX0ZFQVRVUkVfU1BFX0NPTVAgfAogCQkJUFBDX0ZFQVRVUkVfSEFTX0VGUF9TSU5HTEUgfAogCQkJUFBDX0ZFQVRVUkVfVU5JRklFRF9DQUNIRSwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKKwkJLnBsYXRmb3JtCQk9ICJwcGM1NTU0IiwKIAl9LAogCXsJLyogZTUwMCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKQEAgLTk3MywxMiArMTA0OSwxNSBAQAogCQkuY3B1X25hbWUJCT0gImU1MDAiLAogCQkvKiB4eHggLSBnYWxhazogYWRkIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgKi8KIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU19FNTAwLAotCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBQUENfRkVBVFVSRV8zMiB8Ci0JCQlQUENfRkVBVFVSRV9IQVNfTU1VIHwgUFBDX0ZFQVRVUkVfU1BFX0NPTVAgfAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSB8CisJCQlQUENfRkVBVFVSRV9TUEVfQ09NUCB8CiAJCQlQUENfRkVBVFVSRV9IQVNfRUZQX1NJTkdMRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCisJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGMvZTUwMCIsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9CT09LRSwKKwkJLnBsYXRmb3JtCQk9ICJwcGM4NTQwIiwKIAl9LAogCXsJLyogZTUwMHYyICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLApAQCAtOTg2LDEyICsxMDY1LDE2IEBACiAJCS5jcHVfbmFtZQkJPSAiZTUwMHYyIiwKIAkJLyogeHh4IC0gZ2FsYWs6IGFkZCBDUFVfRlRSX01BWUJFX0NBTl9ET1pFICovCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfRTUwMF8yLAotCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBQUENfRkVBVFVSRV8zMiB8Ci0JCQlQUENfRkVBVFVSRV9IQVNfTU1VIHwgUFBDX0ZFQVRVUkVfU1BFX0NPTVAgfAotCQkJUFBDX0ZFQVRVUkVfSEFTX0VGUF9TSU5HTEUgfCBQUENfRkVBVFVSRV9IQVNfRUZQX0RPVUJMRSwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfQk9PS0UgfAorCQkJUFBDX0ZFQVRVUkVfU1BFX0NPTVAgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX0VGUF9TSU5HTEUgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX0VGUF9ET1VCTEUsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAorCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjL2U1MDAiLAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfQk9PS0UsCisJCS5wbGF0Zm9ybQkJPSAicHBjODU0OCIsCiAJfSwKICNlbmRpZgogI2lmICFDTEFTU0lDX1BQQwpAQCAtMTAwMyw2ICsxMDg2LDcgQEAKIAkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5wbGF0Zm9ybQkJPSAicG93ZXJwYyIsCiAJfQogI2VuZGlmIC8qICFDTEFTU0lDX1BQQyAqLwogI2VuZGlmIC8qIENPTkZJR19QUEMzMiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjFkMzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgKFBQQzY0KSBmdW5jdGlvbnMgZm9yIGtleGVjIGJhc2VkIGNyYXNoIGR1bXBzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSwgSUJNIENvcnAuCisgKgorICogQ3JlYXRlZCBieTogSGFyZW4gTXluZW5pCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiBWZXJzaW9uIDIuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYXNoX2R1bXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZmNvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9rZHVtcC5oPgorI2luY2x1ZGUgPGFzbS9sbWIuaD4KKyNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisKKyNpZmRlZiBERUJVRworI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjZGVmaW5lIERCRyhmbXQuLi4pIHVkYmdfcHJpbnRmKGZtdCkKKyNlbHNlCisjZGVmaW5lIERCRyhmbXQuLi4pCisjZW5kaWYKKworLyogVGhpcyBrZWVwcyBhIHRyYWNrIG9mIHdoaWNoIG9uZSBpcyBjcmFzaGluZyBjcHUuICovCitpbnQgY3Jhc2hpbmdfY3B1ID0gLTE7CisKK3N0YXRpYyB1MzIgKmFwcGVuZF9lbGZfbm90ZSh1MzIgKmJ1ZiwgY2hhciAqbmFtZSwgdW5zaWduZWQgdHlwZSwgdm9pZCAqZGF0YSwKKwkJCQkJCQkgICAgICAgc2l6ZV90IGRhdGFfbGVuKQoreworCXN0cnVjdCBlbGZfbm90ZSBub3RlOworCisJbm90ZS5uX25hbWVzeiA9IHN0cmxlbihuYW1lKSArIDE7CisJbm90ZS5uX2Rlc2NzeiA9IGRhdGFfbGVuOworCW5vdGUubl90eXBlICAgPSB0eXBlOworCW1lbWNweShidWYsICZub3RlLCBzaXplb2Yobm90ZSkpOworCWJ1ZiArPSAoc2l6ZW9mKG5vdGUpICszKS80OworCW1lbWNweShidWYsIG5hbWUsIG5vdGUubl9uYW1lc3opOworCWJ1ZiArPSAobm90ZS5uX25hbWVzeiArIDMpLzQ7CisJbWVtY3B5KGJ1ZiwgZGF0YSwgbm90ZS5uX2Rlc2Nzeik7CisJYnVmICs9IChub3RlLm5fZGVzY3N6ICsgMykvNDsKKworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmFsX25vdGUodTMyICpidWYpCit7CisJc3RydWN0IGVsZl9ub3RlIG5vdGU7CisKKwlub3RlLm5fbmFtZXN6ID0gMDsKKwlub3RlLm5fZGVzY3N6ID0gMDsKKwlub3RlLm5fdHlwZSAgID0gMDsKKwltZW1jcHkoYnVmLCAmbm90ZSwgc2l6ZW9mKG5vdGUpKTsKK30KKworc3RhdGljIHZvaWQgY3Jhc2hfc2F2ZV90aGlzX2NwdShzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgZWxmX3Byc3RhdHVzIHByc3RhdHVzOworCXUzMiAqYnVmOworCisJaWYgKChjcHUgPCAwKSB8fCAoY3B1ID49IE5SX0NQVVMpKQorCQlyZXR1cm47CisKKwkvKiBVc2luZyBFTEYgbm90ZXMgaGVyZSBpcyBvcHBvcnR1bmlzdGljLgorCSAqIEkgbmVlZCBhIHdlbGwgZGVmaW5lZCBzdHJ1Y3R1cmUgZm9ybWF0CisJICogZm9yIHRoZSBkYXRhIEkgcGFzcywgYW5kIEkgbmVlZCB0YWdzCisJICogb24gdGhlIGRhdGEgdG8gaW5kaWNhdGUgd2hhdCBpbmZvcm1hdGlvbiBJIGhhdmUKKwkgKiBzcXVpcnJlbGxlZCBhd2F5LiAgRUxGIG5vdGVzIGhhcHBlbiB0byBwcm92aWRlCisJICogYWxsIG9mIHRoYXQgdGhhdCBubyBuZWVkIHRvIGludmVudCBzb21ldGhpbmcgbmV3LgorCSAqLworCWJ1ZiA9ICh1MzIqKXBlcl9jcHVfcHRyKGNyYXNoX25vdGVzLCBjcHUpOworCWlmICghYnVmKSAKKwkJcmV0dXJuOworCisJbWVtc2V0KCZwcnN0YXR1cywgMCwgc2l6ZW9mKHByc3RhdHVzKSk7CisJcHJzdGF0dXMucHJfcGlkID0gY3VycmVudC0+cGlkOworCWVsZl9jb3JlX2NvcHlfcmVncygmcHJzdGF0dXMucHJfcmVnLCByZWdzKTsKKwlidWYgPSBhcHBlbmRfZWxmX25vdGUoYnVmLCAiQ09SRSIsIE5UX1BSU1RBVFVTLCAmcHJzdGF0dXMsCisJCQlzaXplb2YocHJzdGF0dXMpKTsKKwlmaW5hbF9ub3RlKGJ1Zik7Cit9CisKKyNpZmRlZiBDT05GSUdfU01QCitzdGF0aWMgYXRvbWljX3Qgd2FpdGluZ19mb3JfY3Jhc2hfaXBpOworCit2b2lkIGNyYXNoX2lwaV9jYWxsYmFjayhzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJaWYgKGNwdSA9PSBjcmFzaGluZ19jcHUpCisJCXJldHVybjsKKworCWlmICghY3B1X29ubGluZShjcHUpKQorCQlyZXR1cm47CisKKwlpZiAocHBjX21kLmtleGVjX2NwdV9kb3duKQorCQlwcGNfbWQua2V4ZWNfY3B1X2Rvd24oMSwgMSk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJY3Jhc2hfc2F2ZV90aGlzX2NwdShyZWdzLCBjcHUpOworCWF0b21pY19kZWMoJndhaXRpbmdfZm9yX2NyYXNoX2lwaSk7CisJa2V4ZWNfc21wX3dhaXQoKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKK3N0YXRpYyB2b2lkIGNyYXNoX2tleGVjX3ByZXBhcmVfY3B1cyh2b2lkKQoreworCXVuc2lnbmVkIGludCBtc2VjczsKKworCWF0b21pY19zZXQoJndhaXRpbmdfZm9yX2NyYXNoX2lwaSwgbnVtX29ubGluZV9jcHVzKCkgLSAxKTsKKworCWNyYXNoX3NlbmRfaXBpKGNyYXNoX2lwaV9jYWxsYmFjayk7CisJc21wX3dtYigpOworCisJLyoKKwkgKiBGSVhNRTogVW50aWwgd2Ugd2lsbCBoYXZlIHRoZSB3YXkgdG8gc3RvcCBvdGhlciBDUFVTcyByZWxpYWJhbGx5LAorCSAqIHRoZSBjcmFzaCBDUFUgd2lsbCBzZW5kIGFuIElQSSBhbmQgd2FpdCBmb3Igb3RoZXIgQ1BVcyB0bworCSAqIHJlc3BvbmQuIElmIG5vdCwgcHJvY2VlZCB0aGUga2V4ZWMgYm9vdCBldmVuIHRob3VnaCB3ZSBmYWlsZWQgdG8KKwkgKiBjYXB0dXJlIG90aGVyIENQVSBzdGF0ZXMuCisJICovCisJbXNlY3MgPSAxMDAwMDAwOworCXdoaWxlICgoYXRvbWljX3JlYWQoJndhaXRpbmdfZm9yX2NyYXNoX2lwaSkgPiAwKSAmJiAoLS1tc2VjcyA+IDApKSB7CisJCWJhcnJpZXIoKTsKKwkJbWRlbGF5KDEpOworCX0KKworCS8qIFdvdWxkIGl0IGJlIGJldHRlciB0byByZXBsYWNlIHRoZSB0cmFwIHZlY3RvciBoZXJlPyAqLworCisJLyoKKwkgKiBGSVhNRTogSW4gY2FzZSBpZiB3ZSBkbyBub3QgZ2V0IGFsbCBDUFVzLCBvbmUgcG9zc2liaWxpdHk6IGFzayB0aGUKKwkgKiB1c2VyIHRvIGRvIHNvZnQgcmVzZXQgc3VjaCB0aGF0IHdlIGdldCBhbGwuCisJICogSVBJIGhhbmRsZXIgaXMgYWxyZWFkeSBzZXQgYnkgdGhlIHBhbmljIGNwdSBpbml0aWFsbHkuIFRoZXJlZm9yZSwKKwkgKiBhbGwgY3B1cyBjb3VsZCBpbnZva2UgdGhpcyBoYW5kbGVyIGZyb20gZGllKCkgYW5kIHRoZSBwYW5pYyBDUFUKKwkgKiB3aWxsIGNhbGwgbWFjaGluZV9rZXhlYygpIGRpcmVjdGx5IGZyb20gdGhpcyBoYW5kbGVyIHRvIGRvCisJICoga2V4ZWMgYm9vdC4KKwkgKi8KKwlpZiAoYXRvbWljX3JlYWQoJndhaXRpbmdfZm9yX2NyYXNoX2lwaSkpCisJCXByaW50ayhLRVJOX0FMRVJUICJkb25lIHdhaXRpbmc6ICVkIGNwdXMgbm90IHJlc3BvbmRpbmdcbiIsCisJCQlhdG9taWNfcmVhZCgmd2FpdGluZ19mb3JfY3Jhc2hfaXBpKSk7CisJLyogTGVhdmUgdGhlIElQSSBjYWxsYmFjayBzZXQgKi8KK30KKyNlbHNlCitzdGF0aWMgdm9pZCBjcmFzaF9rZXhlY19wcmVwYXJlX2NwdXModm9pZCkKK3sKKwkvKgorCSAqIG1vdmUgdGhlIHNlY29uZGFyeXMgdG8gdXMgc28gdGhhdCB3ZSBjYW4gY29weQorCSAqIHRoZSBuZXcga2VybmVsIDAtMHgxMDAgc2FmZWx5CisJICoKKwkgKiBkbyB0aGlzIGlmIGtleGVjIGluIHNldHVwLmMgPworCSAqLworCXNtcF9yZWxlYXNlX2NwdXMoKTsKK30KKworI2VuZGlmCisKK3ZvaWQgZGVmYXVsdF9tYWNoaW5lX2NyYXNoX3NodXRkb3duKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qCisJICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBhZnRlciB0aGUgc3lzdGVtCisJICogaGFzIHBhbmljZWQgb3IgaXMgb3RoZXJ3aXNlIGluIGEgY3JpdGljYWwgc3RhdGUuCisJICogVGhlIG1pbmltdW0gYW1vdW50IG9mIGNvZGUgdG8gYWxsb3cgYSBrZXhlYydkIGtlcm5lbAorCSAqIHRvIHJ1biBzdWNjZXNzZnVsbHkgbmVlZHMgdG8gaGFwcGVuIGhlcmUuCisJICoKKwkgKiBJbiBwcmFjdGljZSB0aGlzIG1lYW5zIHN0b3BwaW5nIG90aGVyIGNwdXMgaW4KKwkgKiBhbiBTTVAgc3lzdGVtLgorCSAqIFRoZSBrZXJuZWwgaXMgYnJva2VuIHNvIGRpc2FibGUgaW50ZXJydXB0cy4KKwkgKi8KKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJaWYgKHBwY19tZC5rZXhlY19jcHVfZG93bikKKwkJcHBjX21kLmtleGVjX2NwdV9kb3duKDEsIDApOworCisJLyoKKwkgKiBNYWtlIGEgbm90ZSBvZiBjcmFzaGluZyBjcHUuIFdpbGwgYmUgdXNlZCBpbiBtYWNoaW5lX2tleGVjCisJICogc3VjaCB0aGF0IGFub3RoZXIgSVBJIHdpbGwgbm90IGJlIHNlbnQuCisJICovCisJY3Jhc2hpbmdfY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCWNyYXNoX2tleGVjX3ByZXBhcmVfY3B1cygpOworCWNyYXNoX3NhdmVfdGhpc19jcHUocmVncywgY3Jhc2hpbmdfY3B1KTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2hfZHVtcC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaF9kdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjExZDcyNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2hfZHVtcC5jCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogUm91dGluZXMgZm9yIGRvaW5nIGtleGVjLWJhc2VkIGtkdW1wLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSwgSUJNIENvcnAuCisgKgorICogQ3JlYXRlZCBieTogTWljaGFlbCBFbGxlcm1hbgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogVmVyc2lvbiAyLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L2NyYXNoX2R1bXAuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8YXNtL2tkdW1wLmg+CisjaW5jbHVkZSA8YXNtL2xtYi5oPgorI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpZmRlZiBERUJVRworI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjZGVmaW5lIERCRyhmbXQuLi4pIHVkYmdfcHJpbnRmKGZtdCkKKyNlbHNlCisjZGVmaW5lIERCRyhmbXQuLi4pCisjZW5kaWYKKworc3RhdGljIHZvaWQgX19pbml0IGNyZWF0ZV90cmFtcG9saW5lKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwkvKiBUaGUgbWF4aW11bSByYW5nZSBvZiBhIHNpbmdsZSBpbnN0cnVjdGlvbiBicmFuY2gsIGlzIHRoZSBjdXJyZW50CisJICogaW5zdHJ1Y3Rpb24ncyBhZGRyZXNzICsgKDMyIE1CIC0gNCkgYnl0ZXMuIEZvciB0aGUgdHJhbXBvbGluZSB3ZQorCSAqIG5lZWQgdG8gYnJhbmNoIHRvIGN1cnJlbnQgYWRkcmVzcyArIDMyIE1CLiBTbyB3ZSBpbnNlcnQgYSBub3AgYXQKKwkgKiB0aGUgdHJhbXBvbGluZSBhZGRyZXNzLCB0aGVuIHRoZSBuZXh0IGluc3RydWN0aW9uICgrIDQgYnl0ZXMpCisJICogZG9lcyBhIGJyYW5jaCB0byAoMzIgTUIgLSA0KS4gVGhlIG5ldCBlZmZlY3QgaXMgdGhhdCB3aGVuIHdlCisJICogYnJhbmNoIHRvICJhZGRyIiB3ZSBqdW1wIHRvICgiYWRkciIgKyAzMiBNQikuIEFsdGhvdWdoIGl0IHJlcXVpcmVzCisJICogdHdvIGluc3RydWN0aW9ucyBpdCBkb2Vzbid0IHJlcXVpcmUgYW55IHJlZ2lzdGVycy4KKwkgKi8KKwljcmVhdGVfaW5zdHJ1Y3Rpb24oYWRkciwgMHg2MDAwMDAwMCk7IC8qIG5vcCAqLworCWNyZWF0ZV9icmFuY2goYWRkciArIDQsIGFkZHIgKyBQSFlTSUNBTF9TVEFSVCwgMCk7Cit9CisKK3ZvaWQgX19pbml0IGtkdW1wX3NldHVwKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBpOworCisJREJHKCIgLT4ga2R1bXBfc2V0dXAoKVxuIik7CisKKwlmb3IgKGkgPSBLRFVNUF9UUkFNUE9MSU5FX1NUQVJUOyBpIDwgS0RVTVBfVFJBTVBPTElORV9FTkQ7IGkgKz0gOCkgeworCQljcmVhdGVfdHJhbXBvbGluZShpKTsKKwl9CisKKwljcmVhdGVfdHJhbXBvbGluZShfX3BhKHN5c3RlbV9yZXNldF9md25taSkgLSBQSFlTSUNBTF9TVEFSVCk7CisJY3JlYXRlX3RyYW1wb2xpbmUoX19wYShtYWNoaW5lX2NoZWNrX2Z3bm1pKSAtIFBIWVNJQ0FMX1NUQVJUKTsKKworCURCRygiIDwtIGtkdW1wX3NldHVwKClcbiIpOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfVk1DT1JFCitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV9lbGZjb3JlaGRyKGNoYXIgKnApCit7CisJaWYgKHApCisJCWVsZmNvcmVoZHJfYWRkciA9IG1lbXBhcnNlKHAsICZwKTsKKworCXJldHVybiAwOworfQorX19zZXR1cCgiZWxmY29yZWhkcj0iLCBwYXJzZV9lbGZjb3JlaGRyKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV9zYXZlbWF4bWVtKGNoYXIgKnApCit7CisJaWYgKHApCisJCXNhdmVkX21heF9wZm4gPSAobWVtcGFyc2UocCwgJnApID4+IFBBR0VfU0hJRlQpIC0gMTsKKworCXJldHVybiAwOworfQorX19zZXR1cCgic2F2ZW1heG1lbT0iLCBwYXJzZV9zYXZlbWF4bWVtKTsKKworLyoKKyAqIGNvcHlfb2xkbWVtX3BhZ2UgLSBjb3B5IG9uZSBwYWdlIGZyb20gIm9sZG1lbSIKKyAqIEBwZm46IHBhZ2UgZnJhbWUgbnVtYmVyIHRvIGJlIGNvcGllZAorICogQGJ1ZjogdGFyZ2V0IG1lbW9yeSBhZGRyZXNzIGZvciB0aGUgY29weTsgdGhpcyBjYW4gYmUgaW4ga2VybmVsIGFkZHJlc3MKKyAqICAgICAgc3BhY2Ugb3IgdXNlciBhZGRyZXNzIHNwYWNlIChzZWUgQHVzZXJidWYpCisgKiBAY3NpemU6IG51bWJlciBvZiBieXRlcyB0byBjb3B5CisgKiBAb2Zmc2V0OiBvZmZzZXQgaW4gYnl0ZXMgaW50byB0aGUgcGFnZSAoYmFzZWQgb24gcGZuKSB0byBiZWdpbiB0aGUgY29weQorICogQHVzZXJidWY6IGlmIHNldCwgQGJ1ZiBpcyBpbiB1c2VyIGFkZHJlc3Mgc3BhY2UsIHVzZSBjb3B5X3RvX3VzZXIoKSwKKyAqICAgICAgb3RoZXJ3aXNlIEBidWYgaXMgaW4ga2VybmVsIGFkZHJlc3Mgc3BhY2UsIHVzZSBtZW1jcHkoKS4KKyAqCisgKiBDb3B5IGEgcGFnZSBmcm9tICJvbGRtZW0iLiBGb3IgdGhpcyBwYWdlLCB0aGVyZSBpcyBubyBwdGUgbWFwcGVkCisgKiBpbiB0aGUgY3VycmVudCBrZXJuZWwuIFdlIHN0aXRjaCB1cCBhIHB0ZSwgc2ltaWxhciB0byBrbWFwX2F0b21pYy4KKyAqLworc3NpemVfdCBjb3B5X29sZG1lbV9wYWdlKHVuc2lnbmVkIGxvbmcgcGZuLCBjaGFyICpidWYsCisJCQlzaXplX3QgY3NpemUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgdXNlcmJ1ZikKK3sKKwl2b2lkICAqdmFkZHI7CisKKwlpZiAoIWNzaXplKQorCQlyZXR1cm4gMDsKKworCXZhZGRyID0gX19pb3JlbWFwKHBmbiA8PCBQQUdFX1NISUZULCBQQUdFX1NJWkUsIDApOworCisJaWYgKHVzZXJidWYpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcigoY2hhciBfX3VzZXIgKilidWYsICh2YWRkciArIG9mZnNldCksIGNzaXplKSkgeworCQkJaW91bm1hcCh2YWRkcik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0gZWxzZQorCQltZW1jcHkoYnVmLCAodmFkZHIgKyBvZmZzZXQpLCBjc2l6ZSk7CisKKwlpb3VubWFwKHZhZGRyKTsKKwlyZXR1cm4gY3NpemU7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2RtYV82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWFfNjQuYwppbmRleCA3YzM0MTk2Li4zNmFhYTc2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2RtYV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hXzY0LmMKQEAgLTEwLDYgKzEwLDcgQEAKIC8qIEluY2x1ZGUgdGhlIGJ1c3NlcyB3ZSBzdXBwb3J0ICovCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL3Zpby5oPgorI2luY2x1ZGUgPGFzbS9pYm1lYnVzLmg+CiAjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8YXNtL2J1Zy5oPgogCkBAIC0yMyw2ICsyNCwxMCBAQAogCWlmIChkZXYtPmJ1cyA9PSAmdmlvX2J1c190eXBlKQogCQlyZXR1cm4gJnZpb19kbWFfb3BzOwogI2VuZGlmCisjaWZkZWYgQ09ORklHX0lCTUVCVVMKKwlpZiAoZGV2LT5idXMgPT0gJmlibWVidXNfYnVzX3R5cGUpCisJCXJldHVybiAmaWJtZWJ1c19kbWFfb3BzOworI2VuZGlmCiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTQ3LDYgKzUyLDEwIEBACiAJaWYgKGRldi0+YnVzID09ICZ2aW9fYnVzX3R5cGUpCiAJCXJldHVybiAtRUlPOwogI2VuZGlmIC8qIENPTkZJR19JQk1WSU8gKi8KKyNpZmRlZiBDT05GSUdfSUJNRUJVUworCWlmIChkZXYtPmJ1cyA9PSAmaWJtZWJ1c19idXNfdHlwZSkKKwkJcmV0dXJuIC1FSU87CisjZW5kaWYKIAlCVUcoKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfMzIuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfMzIuUwppbmRleCAyZTk5YWU0Li5mMjBhNjcyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzMyLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV8zMi5TCkBAIC0yMDAsOCArMjAwLDYgQEAKIAlibAlkb19zaG93X3N5c2NhbGwKICNlbmRpZiAvKiBTSE9XX1NZU0NBTExTICovCiAJcmx3aW5tCXIxMCxyMSwwLDAsKDMxLVRIUkVBRF9TSElGVCkJLyogY3VycmVudF90aHJlYWRfaW5mbygpICovCi0JbGkJcjExLDAKLQlzdGIJcjExLFRJX1NDX05PRVJSKHIxMCkKIAlsd3oJcjExLFRJX0ZMQUdTKHIxMCkKIAlhbmRpLglyMTEscjExLF9USUZfU1lTQ0FMTF9UX09SX0EKIAlibmUtCXN5c2NhbGxfZG90cmFjZQpAQCAtMjIyLDI1ICsyMjAsMjEgQEAKIAlibAlkb19zaG93X3N5c2NhbGxfZXhpdAogI2VuZGlmCiAJbXIJcjYscjMKLQlsaQlyMTEsLV9MQVNUX0VSUk5PCi0JY21wbHcJMCxyMyxyMTEKIAlybHdpbm0JcjEyLHIxLDAsMCwoMzEtVEhSRUFEX1NISUZUKQkvKiBjdXJyZW50X3RocmVhZF9pbmZvKCkgKi8KLQlibHQrCTMwZgotCWxieglyMTEsVElfU0NfTk9FUlIocjEyKQotCWNtcHdpCXIxMSwwCi0JYm5lCTMwZgotCW5lZwlyMyxyMwotCWx3eglyMTAsX0NDUihyMSkJLyogU2V0IFNPIGJpdCBpbiBDUiAqLwotCW9yaXMJcjEwLHIxMCwweDEwMDAKLQlzdHcJcjEwLF9DQ1IocjEpCi0KIAkvKiBkaXNhYmxlIGludGVycnVwdHMgc28gY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncyBjYW4ndCBjaGFuZ2UgKi8KLTMwOglMT0FEX01TUl9LRVJORUwocjEwLE1TUl9LRVJORUwpCS8qIGRvZXNuJ3QgaW5jbHVkZSBNU1JfRUUgKi8KKwlMT0FEX01TUl9LRVJORUwocjEwLE1TUl9LRVJORUwpCS8qIGRvZXNuJ3QgaW5jbHVkZSBNU1JfRUUgKi8KIAlTWU5DCiAJTVRNU1JEKHIxMCkKIAlsd3oJcjksVElfRkxBR1MocjEyKQotCWFuZGkuCXIwLHI5LChfVElGX1NZU0NBTExfVF9PUl9BfF9USUZfU0lHUEVORElOR3xfVElGX05FRURfUkVTQ0hFRCkKKwlsaQlyOCwtX0xBU1RfRVJSTk8KKwlhbmRpLglyMCxyOSwoX1RJRl9TWVNDQUxMX1RfT1JfQXxfVElGX1NJR1BFTkRJTkd8X1RJRl9ORUVEX1JFU0NIRUR8X1RJRl9SRVNUT1JFQUxMfF9USUZfUkVTVE9SRV9TSUdNQVNLKQogCWJuZS0Jc3lzY2FsbF9leGl0X3dvcmsKKwljbXBsdwkwLHIzLHI4CisJYmx0KwlzeXNjYWxsX2V4aXRfY29udAorCWx3eglyMTEsX0NDUihyMSkJCQkvKiBMb2FkIENSICovCisJbmVnCXIzLHIzCisJb3JpcwlyMTEscjExLDB4MTAwMAkvKiBTZXQgU08gYml0IGluIENSICovCisJc3R3CXIxMSxfQ0NSKHIxKQogc3lzY2FsbF9leGl0X2NvbnQ6CiAjaWYgZGVmaW5lZChDT05GSUdfNHh4KSB8fCBkZWZpbmVkKENPTkZJR19CT09LRSkKIAkvKiBJZiB0aGUgcHJvY2VzcyBoYXMgaXRzIG93biBEQkNSMCB2YWx1ZSwgbG9hZCBpdCB1cC4gIFRoZSBzaW5nbGUKQEAgLTI5Miw0NiArMjg2LDExMyBAQAogCWIJc3lzY2FsbF9kb3RyYWNlX2NvbnQKIAogc3lzY2FsbF9leGl0X3dvcms6Ci0Jc3R3CXI2LFJFU1VMVChyMSkJLyogU2F2ZSByZXN1bHQgKi8KKwlhbmRpLglyMCxyOSxfVElGX1JFU1RPUkVBTEwKKwlibmUtCTJmCisJY21wbHcJMCxyMyxyOAorCWJsdCsJMWYKKwlhbmRpLglyMCxyOSxfVElGX05PRVJST1IKKwlibmUtCTFmCisJbHd6CXIxMSxfQ0NSKHIxKQkJCS8qIExvYWQgQ1IgKi8KKwluZWcJcjMscjMKKwlvcmlzCXIxMSxyMTEsMHgxMDAwCS8qIFNldCBTTyBiaXQgaW4gQ1IgKi8KKwlzdHcJcjExLF9DQ1IocjEpCisKKzE6CXN0dwlyNixSRVNVTFQocjEpCS8qIFNhdmUgcmVzdWx0ICovCiAJc3R3CXIzLEdQUjMocjEpCS8qIFVwZGF0ZSByZXR1cm4gdmFsdWUgKi8KLQlhbmRpLglyMCxyOSxfVElGX1NZU0NBTExfVF9PUl9BCi0JYmVxCTVmCi0Jb3JpCXIxMCxyMTAsTVNSX0VFCi0JU1lOQwotCU1UTVNSRChyMTApCQkvKiByZS1lbmFibGUgaW50ZXJydXB0cyAqLworMjoJYW5kaS4JcjAscjksKF9USUZfUEVSU1lTQ0FMTF9NQVNLKQorCWJlcQk0ZgorCisJLyogQ2xlYXIgcGVyLXN5c2NhbGwgVElGIGZsYWdzIGlmIGFueSBhcmUgc2V0LCBidXQgX2xlYXZlXworCV9USUZfU0FWRV9OVkdQUlMgc2V0IGluIHI5IHNpbmNlIHdlIGhhdmVuJ3QgZGVhbHQgd2l0aCB0aGF0CisJeWV0LiAgKi8KKworCWxpCXIxMSxfVElGX1BFUlNZU0NBTExfTUFTSworCWFkZGkJcjEyLHIxMixUSV9GTEFHUworMzoJbHdhcngJcjgsMCxyMTIKKwlhbmRjCXI4LHI4LHIxMQorI2lmZGVmIENPTkZJR19JQk00MDVfRVJSNzcKKwlkY2J0CTAscjEyCisjZW5kaWYKKwlzdHdjeC4JcjgsMCxyMTIKKwlibmUtCTNiCisJc3ViaQlyMTIscjEyLFRJX0ZMQUdTCisJCis0OgkvKiBBbnl0aGluZyB3aGljaCByZXF1aXJlcyBlbmFibGluZyBpbnRlcnJ1cHRzPyAqLworCWFuZGkuCXIwLHI5LChfVElGX1NZU0NBTExfVF9PUl9BfF9USUZfU0lOR0xFU1RFUHxfVElGX1NBVkVfTlZHUFJTKQorCWJlcQk3ZgorCisJLyogU2F2ZSBOVkdQUlMgaWYgdGhleSdyZSBub3Qgc2F2ZWQgYWxyZWFkeSAqLwogCWx3eglyNCxfVFJBUChyMSkKIAlhbmRpLglyNCxyNCwxCi0JYmVxCTRmCisJYmVxCTVmCiAJU0FWRV9OVkdQUlMocjEpCiAJbGkJcjQsMHhjMDAKIAlzdHcJcjQsX1RSQVAocjEpCi00OgorCisJLyogUmUtZW5hYmxlIGludGVycnVwdHMgKi8KKzU6CW9yaQlyMTAscjEwLE1TUl9FRQorCVNZTkMKKwlNVE1TUkQocjEwKQorCisJYW5kaS4JcjAscjksX1RJRl9TQVZFX05WR1BSUworCWJuZQlzYXZlX3VzZXJfbnZncHJzCisKK3NhdmVfdXNlcl9udmdwcnNfY29udDoKKwlhbmRpLglyMCxyOSwoX1RJRl9TWVNDQUxMX1RfT1JfQXxfVElGX1NJTkdMRVNURVApCisJYmVxCTdmCisKIAlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECiAJYmwJZG9fc3lzY2FsbF90cmFjZV9sZWF2ZQogCVJFU1RfTlZHUFJTKHIxKQotMjoKLQlsd3oJcjMsR1BSMyhyMSkKKworNjoJbHd6CXIzLEdQUjMocjEpCiAJTE9BRF9NU1JfS0VSTkVMKHIxMCxNU1JfS0VSTkVMKQkvKiBkb2Vzbid0IGluY2x1ZGUgTVNSX0VFICovCiAJU1lOQwogCU1UTVNSRChyMTApCQkvKiBkaXNhYmxlIGludGVycnVwdHMgYWdhaW4gKi8KIAlybHdpbm0JcjEyLHIxLDAsMCwoMzEtVEhSRUFEX1NISUZUKQkvKiBjdXJyZW50X3RocmVhZF9pbmZvKCkgKi8KIAlsd3oJcjksVElfRkxBR1MocjEyKQotNToKKzc6CiAJYW5kaS4JcjAscjksX1RJRl9ORUVEX1JFU0NIRUQKLQlibmUJMWYKKwlibmUJOGYKIAlsd3oJcjUsX01TUihyMSkKIAlhbmRpLglyNSxyNSxNU1JfUFIKLQliZXEJc3lzY2FsbF9leGl0X2NvbnQKLQlhbmRpLglyMCxyOSxfVElGX1NJR1BFTkRJTkcKLQliZXEJc3lzY2FsbF9leGl0X2NvbnQKKwliZXEJcmV0X2Zyb21fZXhjZXB0CisJYW5kaS4JcjAscjksX1RJRl9TSUdQRU5ESU5HfF9USUZfUkVTVE9SRV9TSUdNQVNLCisJYmVxCXJldF9mcm9tX2V4Y2VwdAogCWIJZG9fdXNlcl9zaWduYWwKLTE6Cis4OgogCW9yaQlyMTAscjEwLE1TUl9FRQogCVNZTkMKIAlNVE1TUkQocjEwKQkJLyogcmUtZW5hYmxlIGludGVycnVwdHMgKi8KIAlibAlzY2hlZHVsZQotCWIJMmIKKwliCTZiCiAKK3NhdmVfdXNlcl9udmdwcnM6CisJbHd6CXI4LFRJX1NJR0ZSQU1FKHIxMikKKworLm1hY3JvIHNhdmV3b3JkcyBzdGFydCwgZW5kCisgIDE6CXN0dyBcc3RhcnQsNCooXHN0YXJ0KShyOCkKKwkuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgorCS5hbGlnbgkyCisJLmxvbmcJMWIsc2F2ZV91c2VyX252Z3Byc19mYXVsdAorCS5wcmV2aW91cworCS5pZiBcZW5kIC0gXHN0YXJ0CisJc2F2ZXdvcmRzICIoXHN0YXJ0KzEpIixcZW5kCisJLmVuZGlmCisuZW5kbQkKKwlzYXZld29yZHMgMTQsMzEKKwliCXNhdmVfdXNlcl9udmdwcnNfY29udAorCisJCitzYXZlX3VzZXJfbnZncHJzX2ZhdWx0OgorCWxpCXIzLDExCQkvKiBTSUdTRUdWICovCisJbHd6CXI0LFRJX1RBU0socjEyKQorCWJsCWZvcmNlX3NpZ3NlZ3YKKworCXJsd2lubQlyMTIscjEsMCwwLCgzMS1USFJFQURfU0hJRlQpCS8qIGN1cnJlbnRfdGhyZWFkX2luZm8oKSAqLworCWx3eglyOSxUSV9GTEFHUyhyMTIpCisJYglzYXZlX3VzZXJfbnZncHJzX2NvbnQKKwkKICNpZmRlZiBTSE9XX1NZU0NBTExTCiBkb19zaG93X3N5c2NhbGw6CiAjaWZkZWYgU0hPV19TWVNDQUxMU19UQVNLCkBAIC00MDEsMjggKzQ2MiwxMCBAQAogI2VuZGlmIC8qIFNIT1dfU1lTQ0FMTFMgKi8KIAogLyoKLSAqIFRoZSBzaWdzdXNwZW5kIGFuZCBydF9zaWdzdXNwZW5kIHN5c3RlbSBjYWxscyBjYW4gY2FsbCBkb19zaWduYWwKLSAqIGFuZCB0aHVzIHB1dCB0aGUgcHJvY2VzcyBpbnRvIHRoZSBzdG9wcGVkIHN0YXRlIHdoZXJlIHdlIG1pZ2h0Ci0gKiB3YW50IHRvIGV4YW1pbmUgaXRzIHVzZXIgc3RhdGUgd2l0aCBwdHJhY2UuICBUaGVyZWZvcmUgd2UgbmVlZAotICogdG8gc2F2ZSBhbGwgdGhlIG5vbnZvbGF0aWxlIHJlZ2lzdGVycyAocjEzIC0gcjMxKSBiZWZvcmUgY2FsbGluZwotICogdGhlIEMgY29kZS4KKyAqIFRoZSBmb3JrL2Nsb25lIGZ1bmN0aW9ucyBuZWVkIHRvIGNvcHkgdGhlIGZ1bGwgcmVnaXN0ZXIgc2V0IGludG8KKyAqIHRoZSBjaGlsZCBwcm9jZXNzLiBUaGVyZWZvcmUgd2UgbmVlZCB0byBzYXZlIGFsbCB0aGUgbm9udm9sYXRpbGUKKyAqIHJlZ2lzdGVycyAocjEzIC0gcjMxKSBiZWZvcmUgY2FsbGluZyB0aGUgQyBjb2RlLgogICovCi0JLmdsb2JsCXBwY19zaWdzdXNwZW5kCi1wcGNfc2lnc3VzcGVuZDoKLQlTQVZFX05WR1BSUyhyMSkKLQlsd3oJcjAsX1RSQVAocjEpCi0Jcmx3aW5tCXIwLHIwLDAsMCwzMAkJLyogY2xlYXIgTFNCIHRvIGluZGljYXRlIGZ1bGwgKi8KLQlzdHcJcjAsX1RSQVAocjEpCQkvKiByZWdpc3RlciBzZXQgc2F2ZWQgKi8KLQliCXN5c19zaWdzdXNwZW5kCi0KLQkuZ2xvYmwJcHBjX3J0X3NpZ3N1c3BlbmQKLXBwY19ydF9zaWdzdXNwZW5kOgotCVNBVkVfTlZHUFJTKHIxKQotCWx3eglyMCxfVFJBUChyMSkKLQlybHdpbm0JcjAscjAsMCwwLDMwCi0Jc3R3CXIwLF9UUkFQKHIxKQotCWIJc3lzX3J0X3NpZ3N1c3BlbmQKLQogCS5nbG9ibAlwcGNfZm9yawogcHBjX2Zvcms6CiAJU0FWRV9OVkdQUlMocjEpCkBAIC00NDcsMTQgKzQ5MCw2IEBACiAJc3R3CXIwLF9UUkFQKHIxKQkJLyogcmVnaXN0ZXIgc2V0IHNhdmVkICovCiAJYglzeXNfY2xvbmUKIAotCS5nbG9ibAlwcGNfc3dhcGNvbnRleHQKLXBwY19zd2FwY29udGV4dDoKLQlTQVZFX05WR1BSUyhyMSkKLQlsd3oJcjAsX1RSQVAocjEpCi0Jcmx3aW5tCXIwLHIwLDAsMCwzMAkJLyogY2xlYXIgTFNCIHRvIGluZGljYXRlIGZ1bGwgKi8KLQlzdHcJcjAsX1RSQVAocjEpCQkvKiByZWdpc3RlciBzZXQgc2F2ZWQgKi8KLQliCXN5c19zd2FwY29udGV4dAotCiAvKgogICogVG9wLWxldmVsIHBhZ2UgZmF1bHQgaGFuZGxpbmcuCiAgKiBUaGlzIGlzIGluIGFzc2VtYmxlciBiZWNhdXNlIGlmIGRvX3BhZ2VfZmF1bHQgdGVsbHMgdXMgdGhhdApAQCAtNjI2LDE2ICs2NjEsNiBAQAogCS5sb25nCXJldF9mcm9tX2V4Y2VwdAogI2VuZGlmCiAKLQkuZ2xvYmwJc2lncmV0dXJuX2V4aXQKLXNpZ3JldHVybl9leGl0OgotCXN1YmkJcjEscjMsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKLQlybHdpbm0JcjEyLHIxLDAsMCwoMzEtVEhSRUFEX1NISUZUKQkvKiBjdXJyZW50X3RocmVhZF9pbmZvKCkgKi8KLQlsd3oJcjksVElfRkxBR1MocjEyKQotCWFuZGkuCXIwLHI5LF9USUZfU1lTQ0FMTF9UX09SX0EKLQliZXErCXJldF9mcm9tX2V4Y2VwdF9mdWxsCi0JYmwJZG9fc3lzY2FsbF90cmFjZV9sZWF2ZQotCS8qIGZhbGwgdGhyb3VnaCAqLwotCiAJLmdsb2JsCXJldF9mcm9tX2V4Y2VwdF9mdWxsCiByZXRfZnJvbV9leGNlcHRfZnVsbDoKIAlSRVNUX05WR1BSUyhyMSkKQEAgLTY1OCw3ICs2ODMsNyBAQAogCS8qIENoZWNrIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MgKi8KIAlybHdpbm0JcjkscjEsMCwwLCgzMS1USFJFQURfU0hJRlQpCiAJbHd6CXI5LFRJX0ZMQUdTKHI5KQotCWFuZGkuCXIwLHI5LChfVElGX1NJR1BFTkRJTkd8X1RJRl9ORUVEX1JFU0NIRUQpCisJYW5kaS4JcjAscjksKF9USUZfU0lHUEVORElOR3xfVElGX05FRURfUkVTQ0hFRHxfVElGX1JFU1RPUkVBTEx8X1RJRl9SRVNUT1JFX1NJR01BU0spCiAJYm5lCWRvX3dvcmsKIAogcmVzdG9yZV91c2VyOgpAQCAtODkyLDcgKzkxNyw3IEBACiAJbHd6CXI5LFRJX0ZMQUdTKHI5KQogCWFuZGkuCXIwLHI5LF9USUZfTkVFRF9SRVNDSEVECiAJYm5lLQlkb19yZXNjaGVkCi0JYW5kaS4JcjAscjksX1RJRl9TSUdQRU5ESU5HCisJYW5kaS4JcjAscjksX1RJRl9TSUdQRU5ESU5HfF9USUZfUkVTVE9SRV9TSUdNQVNLCiAJYmVxCXJlc3RvcmVfdXNlcgogZG9fdXNlcl9zaWduYWw6CQkJLyogcjEwIGNvbnRhaW5zIE1TUl9LRVJORUwgaGVyZSAqLwogCW9yaQlyMTAscjEwLE1TUl9FRQpAQCAtOTYzLDcgKzk4OCw3IEBACiAJc3R3dQlyMSwtSU5UX0ZSQU1FX1NJWkUocjEpCiAJbWZscglyMAogCXN0dwlyMCxJTlRfRlJBTUVfU0laRSs0KHIxKQotCUxPQURBRERSKHI0LCBydGFzKQorCUxPQURfUkVHX0FERFIocjQsIHJ0YXMpCiAJbGlzCXI2LDFmQGhhCS8qIHBoeXNpY2FsIHJldHVybiBhZGRyZXNzIGZvciBydGFzICovCiAJYWRkaQlyNixyNiwxZkBsCiAJdG9waHlzKHI2LHI2KQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV82NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV82NC5TCmluZGV4IGJjZTMzYTMuLjM4OGY4NjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfNjQuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzY0LlMKQEAgLTExMyw5ICsxMTMsNyBAQAogCWFkZGkJcjkscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKICNlbmRpZgogCWNscnJkaQlyMTEscjEsVEhSRUFEX1NISUZUCi0JbGkJcjEyLDAKIAlsZAlyMTAsVElfRkxBR1MocjExKQotCXN0YglyMTIsVElfU0NfTk9FUlIocjExKQogCWFuZGkuCXIxMSxyMTAsX1RJRl9TWVNDQUxMX1RfT1JfQQogCWJuZS0Jc3lzY2FsbF9kb3RyYWNlCiBzeXNjYWxsX2RvdHJhY2VfY29udDoKQEAgLTE0NCwyNCArMTQyLDEyIEBACiAJYmN0cmwJCQkvKiBDYWxsIGhhbmRsZXIgKi8KIAogc3lzY2FsbF9leGl0OgotI2lmZGVmIFNIT1dfU1lTQ0FMTFMKLQlzdGQJcjMsR1BSMyhyMSkKLQlibAkuZG9fc2hvd19zeXNjYWxsX2V4aXQKLQlsZAlyMyxHUFIzKHIxKQotI2VuZGlmCiAJc3RkCXIzLFJFU1VMVChyMSkKLQlsZAlyNSxfQ0NSKHIxKQotCWxpCXIxMCwtX0xBU1RfRVJSTk8KLQljbXBsZAlyMyxyMTAKKyNpZmRlZiBTSE9XX1NZU0NBTExTCisJYmwJLmRvX3Nob3dfc3lzY2FsbF9leGl0CisJbGQJcjMsUkVTVUxUKHIxKQorI2VuZGlmCiAJY2xycmRpCXIxMixyMSxUSFJFQURfU0hJRlQKLQliZ2UtCXN5c2NhbGxfZXJyb3IKLXN5c2NhbGxfZXJyb3JfY29udDoKLQotCS8qIGNoZWNrIGZvciBzeXNjYWxsIHRyYWNpbmcgb3IgYXVkaXQgKi8KLQlsZAlyOSxUSV9GTEFHUyhyMTIpCi0JYW5kaS4JcjAscjksKF9USUZfU1lTQ0FMTF9UX09SX0F8X1RJRl9TSU5HTEVTVEVQKQotCWJuZS0Jc3lzY2FsbF9leGl0X3RyYWNlCi1zeXNjYWxsX2V4aXRfdHJhY2VfY29udDoKIAogCS8qIGRpc2FibGUgaW50ZXJydXB0cyBzbyBjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzIGNhbid0IGNoYW5nZSwKIAkgICBhbmQgc28gdGhhdCB3ZSBkb24ndCBnZXQgaW50ZXJydXB0ZWQgYWZ0ZXIgbG9hZGluZyBTUlIwLzEuICovCkBAIC0xNzMsOCArMTU5LDEzIEBACiAJcm90bGRpCXIxMCxyMTAsMTYKIAltdG1zcmQJcjEwLDEKIAlsZAlyOSxUSV9GTEFHUyhyMTIpCi0JYW5kaS4JcjAscjksKF9USUZfU1lTQ0FMTF9UX09SX0F8X1RJRl9TSUdQRU5ESU5HfF9USUZfTkVFRF9SRVNDSEVEKQorCWxpCXIxMSwtX0xBU1RfRVJSTk8KKwlhbmRpLglyMCxyOSwoX1RJRl9TWVNDQUxMX1RfT1JfQXxfVElGX1NJTkdMRVNURVB8X1RJRl9TSUdQRU5ESU5HfF9USUZfTkVFRF9SRVNDSEVEfF9USUZfUkVTVE9SRUFMTHxfVElGX1NBVkVfTlZHUFJTfF9USUZfTk9FUlJPUnxfVElGX1JFU1RPUkVfU0lHTUFTSykKIAlibmUtCXN5c2NhbGxfZXhpdF93b3JrCisJY21wbGQJcjMscjExCisJbGQJcjUsX0NDUihyMSkKKwliZ2UtCXN5c2NhbGxfZXJyb3IKK3N5c2NhbGxfZXJyb3JfY29udDoKIAlsZAlyNyxfTklQKHIxKQogCXN0ZGN4LglyMCwwLHIxCQkJLyogdG8gY2xlYXIgdGhlIHJlc2VydmF0aW9uICovCiAJYW5kaS4JcjYscjgsTVNSX1BSCkBAIC0xOTMsMjEgKzE4NCwxMiBAQAogCXJmaWQKIAliCS4JLyogcHJldmVudCBzcGVjdWxhdGl2ZSBleGVjdXRpb24gKi8KIAotc3lzY2FsbF9lbm9zeXM6Ci0JbGkJcjMsLUVOT1NZUwotCXN0ZAlyMyxSRVNVTFQocjEpCi0JY2xycmRpCXIxMixyMSxUSFJFQURfU0hJRlQKLQlsZAlyNSxfQ0NSKHIxKQotCi1zeXNjYWxsX2Vycm9yOgotCWxieglyMTEsVElfU0NfTk9FUlIocjEyKQotCWNtcHdpCTAscjExLDAKLQlibmUtCXN5c2NhbGxfZXJyb3JfY29udAotCW5lZwlyMyxyMworc3lzY2FsbF9lcnJvcjoJCiAJb3JpcwlyNSxyNSwweDEwMDAJLyogU2V0IFNPIGJpdCBpbiBDUiAqLworCW5lZwlyMyxyMwogCXN0ZAlyNSxfQ0NSKHIxKQogCWIJc3lzY2FsbF9lcnJvcl9jb250Ci0gICAgICAgIAorCQogLyogVHJhY2VkIHN5c3RlbSBjYWxsIHN1cHBvcnQgKi8KIHN5c2NhbGxfZG90cmFjZToKIAlibAkuc2F2ZV9udmdwcnMKQEAgLTIyNSwyMSArMjA3LDY5IEBACiAJbGQJcjEwLFRJX0ZMQUdTKHIxMCkKIAliCXN5c2NhbGxfZG90cmFjZV9jb250CiAKLXN5c2NhbGxfZXhpdF90cmFjZToKLQlzdGQJcjMsR1BSMyhyMSkKLQlibAkuc2F2ZV9udmdwcnMKK3N5c2NhbGxfZW5vc3lzOgorCWxpCXIzLC1FTk9TWVMKKwliCXN5c2NhbGxfZXhpdAorCQorc3lzY2FsbF9leGl0X3dvcms6CisJLyogSWYgVElGX1JFU1RPUkVBTEwgaXMgc2V0LCBkb24ndCBzY3JpYmJsZSBvbiBlaXRoZXIgcjMgb3IgY2NyLgorCSBJZiBUSUZfTk9FUlJPUiBpcyBzZXQsIGp1c3Qgc2F2ZSByMyBhcyBpdCBpcy4gKi8KKworCWFuZGkuCXIwLHI5LF9USUZfUkVTVE9SRUFMTAorCWJuZS0JMmYKKwljbXBsZAlyMyxyMTEJCS8qIHIxMCBpcyAtTEFTVF9FUlJOTyAqLworCWJsdCsJMWYKKwlhbmRpLglyMCxyOSxfVElGX05PRVJST1IKKwlibmUtCTFmCisJbGQJcjUsX0NDUihyMSkKKwluZWcJcjMscjMKKwlvcmlzCXI1LHI1LDB4MTAwMAkvKiBTZXQgU08gYml0IGluIENSICovCisJc3RkCXI1LF9DQ1IocjEpCisxOglzdGQJcjMsR1BSMyhyMSkKKzI6CWFuZGkuCXIwLHI5LChfVElGX1BFUlNZU0NBTExfTUFTSykKKwliZXEJNGYKKworCS8qIENsZWFyIHBlci1zeXNjYWxsIFRJRiBmbGFncyBpZiBhbnkgYXJlIHNldCwgYnV0IF9sZWF2ZV8KKwlfVElGX1NBVkVfTlZHUFJTIHNldCBpbiByOSBzaW5jZSB3ZSBoYXZlbid0IGRlYWx0IHdpdGggdGhhdAorCXlldC4gICovCisKKwlsaQlyMTEsX1RJRl9QRVJTWVNDQUxMX01BU0sKKwlhZGRpCXIxMixyMTIsVElfRkxBR1MKKzM6CWxkYXJ4CXIxMCwwLHIxMgorCWFuZGMJcjEwLHIxMCxyMTEKKwlzdGRjeC4JcjEwLDAscjEyCisJYm5lLQkzYgorCXN1YmkJcjEyLHIxMixUSV9GTEFHUworCQorNDoJYmwJLnNhdmVfbnZncHJzCisJLyogQW55dGhpbmcgZWxzZSBsZWZ0IHRvIGRvPyAqLworCWFuZGkuCXIwLHI5LChfVElGX1NZU0NBTExfVF9PUl9BfF9USUZfU0lOR0xFU1RFUHxfVElGX1NBVkVfTlZHUFJTKQorCWJlcQkucmV0X2Zyb21fZXhjZXB0X2xpdGUKKworCS8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzICovCisJbWZtc3IJcjEwCisJb3JpCXIxMCxyMTAsTVNSX0VFCisJbXRtc3JkCXIxMCwxCisKKwlhbmRpLglyMCxyOSxfVElGX1NBVkVfTlZHUFJTCisJYm5lCXNhdmVfdXNlcl9udmdwcnMKKworCS8qIElmIHRyYWNpbmcsIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIGFuZCBkbyBpdCAqLworc2F2ZV91c2VyX252Z3Byc19jb250OgkKKwlhbmRpLglyMCxyOSwoX1RJRl9TWVNDQUxMX1RfT1JfQXxfVElGX1NJTkdMRVNURVApCisJYmVxCTVmCisJCiAJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAogCWJsCS5kb19zeXNjYWxsX3RyYWNlX2xlYXZlCiAJUkVTVF9OVkdQUlMocjEpCi0JbGQJcjMsR1BSMyhyMSkKLQlsZAlyNSxfQ0NSKHIxKQogCWNscnJkaQlyMTIscjEsVEhSRUFEX1NISUZUCi0JYglzeXNjYWxsX2V4aXRfdHJhY2VfY29udAogCi0vKiBTdHVmZiB0byBkbyBvbiBleGl0IGZyb20gYSBzeXN0ZW0gY2FsbC4gKi8KLXN5c2NhbGxfZXhpdF93b3JrOgotCXN0ZAlyMyxHUFIzKHIxKQotCXN0ZAlyNSxfQ0NSKHIxKQorCS8qIERpc2FibGUgaW50ZXJydXB0cyBhZ2FpbiBhbmQgaGFuZGxlIG90aGVyIHdvcmsgaWYgYW55ICovCis1OgltZm1zcglyMTAKKwlybGRpY2wJcjEwLHIxMCw0OCwxCisJcm90bGRpCXIxMCxyMTAsMTYKKwltdG1zcmQJcjEwLDEKKwogCWIJLnJldF9mcm9tX2V4Y2VwdF9saXRlCiAKIC8qIFNhdmUgbm9uLXZvbGF0aWxlIEdQUnMsIGlmIG5vdCBhbHJlYWR5IHNhdmVkLiAqLwpAQCAtMjUyLDYgKzI4Miw1MiBAQAogCXN0ZAlyMCxfVFJBUChyMSkKIAlibHIKIAorCitzYXZlX3VzZXJfbnZncHJzOgorCWxkCXIxMCxUSV9TSUdGUkFNRShyMTIpCisJYW5kaS4JcjAscjksX1RJRl8zMkJJVAorCWJlcS0Jc2F2ZV91c2VyX252Z3Byc182NAorCisJLyogMzItYml0IHNhdmUgdG8gdXNlcnNwYWNlICovCisKKy5tYWNybyBzYXZld29yZHMgc3RhcnQsIGVuZAorICAxOglzdHcgXHN0YXJ0LDQqKFxzdGFydCkocjEwKQorCS5zZWN0aW9uIF9fZXhfdGFibGUsImEiCisJLmFsaWduCTMKKwkubGxvbmcJMWIsc2F2ZV91c2VyX252Z3Byc19mYXVsdAorCS5wcmV2aW91cworCS5pZiBcZW5kIC0gXHN0YXJ0CisJc2F2ZXdvcmRzICIoXHN0YXJ0KzEpIixcZW5kCisJLmVuZGlmCisuZW5kbQkKKwlzYXZld29yZHMgMTQsMzEKKwliCXNhdmVfdXNlcl9udmdwcnNfY29udAorCitzYXZlX3VzZXJfbnZncHJzXzY0OgorCS8qIDY0LWJpdCBzYXZlIHRvIHVzZXJzcGFjZSAqLworCisubWFjcm8gc2F2ZWxvbmdzIHN0YXJ0LCBlbmQKKyAgMToJc3RkIFxzdGFydCw4Kihcc3RhcnQpKHIxMCkKKwkuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgorCS5hbGlnbgkzCisJLmxsb25nCTFiLHNhdmVfdXNlcl9udmdwcnNfZmF1bHQKKwkucHJldmlvdXMKKwkuaWYgXGVuZCAtIFxzdGFydAorCXNhdmVsb25ncyAiKFxzdGFydCsxKSIsXGVuZAorCS5lbmRpZgorLmVuZG0JCisJc2F2ZWxvbmdzIDE0LDMxCisJYglzYXZlX3VzZXJfbnZncHJzX2NvbnQKKworc2F2ZV91c2VyX252Z3Byc19mYXVsdDoKKwlsaQlyMywxMQkJLyogU0lHU0VHViAqLworCWxkCXI0LFRJX1RBU0socjEyKQorCWJsCS5mb3JjZV9zaWdzZWd2CisKKwljbHJyZGkJcjEyLHIxLFRIUkVBRF9TSElGVAorCWxkCXI5LFRJX0ZMQUdTKHIxMikKKwliCXNhdmVfdXNlcl9udmdwcnNfY29udAorCQogLyoKICAqIFRoZSBzaWdzdXNwZW5kIGFuZCBydF9zaWdzdXNwZW5kIHN5c3RlbSBjYWxscyBjYW4gY2FsbCBkb19zaWduYWwKICAqIGFuZCB0aHVzIHB1dCB0aGUgcHJvY2VzcyBpbnRvIHRoZSBzdG9wcGVkIHN0YXRlIHdoZXJlIHdlIG1pZ2h0CkBAIC0yNjAsMzUgKzMzNiw2IEBACiAgKiB0aGUgQyBjb2RlLiAgU2ltaWxhcmx5LCBmb3JrLCB2Zm9yayBhbmQgY2xvbmUgbmVlZCB0aGUgZnVsbAogICogcmVnaXN0ZXIgc3RhdGUgb24gdGhlIHN0YWNrIHNvIHRoYXQgaXQgY2FuIGJlIGNvcGllZCB0byB0aGUgY2hpbGQuCiAgKi8KLV9HTE9CQUwocHBjMzJfc2lnc3VzcGVuZCkKLQlibAkuc2F2ZV9udmdwcnMKLQlibAkuY29tcGF0X3N5c19zaWdzdXNwZW5kCi0JYgk3MGYKLQotX0dMT0JBTChwcGM2NF9ydF9zaWdzdXNwZW5kKQotCWJsCS5zYXZlX252Z3BycwotCWJsCS5zeXNfcnRfc2lnc3VzcGVuZAotCWIJNzBmCi0KLV9HTE9CQUwocHBjMzJfcnRfc2lnc3VzcGVuZCkKLQlibAkuc2F2ZV9udmdwcnMKLQlibAkuY29tcGF0X3N5c19ydF9zaWdzdXNwZW5kCi03MDoJY21wZGkJMCxyMywwCi0JLyogSWYgaXQgcmV0dXJuZWQgYW4gZXJyb3IsIHdlIG5lZWQgdG8gcmV0dXJuIHZpYSBzeXNjYWxsX2V4aXQgdG8gc2V0Ci0JICAgdGhlIFNPIGJpdCBpbiBjcjAgYW5kIHBvdGVudGlhbGx5IHN0b3AgZm9yIHB0cmFjZS4gKi8KLQlibmUJc3lzY2FsbF9leGl0Ci0JLyogSWYgc2lnc3VzcGVuZCgpIHJldHVybnMgemVybywgd2UgYXJlIGdvaW5nIGludG8gYSBzaWduYWwgaGFuZGxlci4gV2UKLQkgICBtYXkgbmVlZCB0byBjYWxsIGF1ZGl0X3N5c2NhbGxfZXhpdCgpIHRvIG1hcmsgdGhlIGV4aXQgZnJvbSBzaWdzdXNwZW5kKCkgKi8KLSNpZmRlZiBDT05GSUdfQVVESVRTWVNDQUxMCi0JbGQJcjMsUEFDQUNVUlJFTlQocjEzKQotCWxkCXI0LEFVRElUQ09OVEVYVChyMykKLQljbXBkaQkwLHI0LDAKLQliZXEJLnJldF9mcm9tX2V4Y2VwdAkvKiBObyBhdWRpdF9jb250ZXh0OiBMZWF2ZSBpbW1lZGlhdGVseS4gKi8KLQlsaQlyNCwgMgkJCS8qIEFVRElUU0NfRkFJTFVSRSAqLwotCWxpCXI1LC00CQkJLyogSXQncyBhbHdheXMgLUVJTlRSICovCi0JYmwJLmF1ZGl0X3N5c2NhbGxfZXhpdAotI2VuZGlmCi0JYgkucmV0X2Zyb21fZXhjZXB0CiAKIF9HTE9CQUwocHBjX2ZvcmspCiAJYmwJLnNhdmVfbnZncHJzCkBAIC0zMDUsMzcgKzM1Miw2IEBACiAJYmwJLnN5c19jbG9uZQogCWIJc3lzY2FsbF9leGl0CiAKLV9HTE9CQUwocHBjMzJfc3dhcGNvbnRleHQpCi0JYmwJLnNhdmVfbnZncHJzCi0JYmwJLmNvbXBhdF9zeXNfc3dhcGNvbnRleHQKLQliCTgwZgotCQotX0dMT0JBTChwcGM2NF9zd2FwY29udGV4dCkKLQlibAkuc2F2ZV9udmdwcnMKLQlibAkuc3lzX3N3YXBjb250ZXh0Ci0JYgk4MGYKLQotX0dMT0JBTChwcGMzMl9zaWdyZXR1cm4pCi0JYmwJLmNvbXBhdF9zeXNfc2lncmV0dXJuCi0JYgk4MGYKLQotX0dMT0JBTChwcGMzMl9ydF9zaWdyZXR1cm4pCi0JYmwJLmNvbXBhdF9zeXNfcnRfc2lncmV0dXJuCi0JYgk4MGYKLQotX0dMT0JBTChwcGM2NF9ydF9zaWdyZXR1cm4pCi0JYmwJLnN5c19ydF9zaWdyZXR1cm4KLQotODA6CWNtcGRpCTAscjMsMAotCWJsdAlzeXNjYWxsX2V4aXQKLQljbHJyZGkJcjQscjEsVEhSRUFEX1NISUZUCi0JbGQJcjQsVElfRkxBR1MocjQpCi0JYW5kaS4JcjQscjQsKF9USUZfU1lTQ0FMTF9UX09SX0F8X1RJRl9TSU5HTEVTVEVQKQotCWJlcSsJODFmCi0JYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAotCWJsCS5kb19zeXNjYWxsX3RyYWNlX2xlYXZlCi04MToJYgkucmV0X2Zyb21fZXhjZXB0Ci0KIF9HTE9CQUwocmV0X2Zyb21fZm9yaykKIAlibAkuc2NoZWR1bGVfdGFpbAogCVJFU1RfTlZHUFJTKHIxKQpAQCAtNDk1LDcgKzUxMSw4IEBACiAJY21wZGkJMCxyNSwwCiAJYmVxCTRmCiAJLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cyAoaVNlcmllcykgKi8KLQlsZAlyMyxQQUNBTFBQQUNBK0xQUEFDQUFOWUlOVChyMTMpCisJbGQJcjMsUEFDQUxQUEFDQVBUUihyMTMpCisJbGQJcjMsTFBQQUNBQU5ZSU5UKHIzKQogCWNtcGRpCXIzLDAKIAliZXErCTRmCQkJLyogc2tpcCBkb19JUlEgaWYgbm8gaW50ZXJydXB0cyAqLwogCkBAIC02NzMsOSArNjkwLDggQEAKICAgICAgICAgc3RkCXI2LFBBQ0FTQVZFRE1TUihyMTMpCiAKIAkvKiBTZXR1cCBvdXIgcmVhbCByZXR1cm4gYWRkciAqLwkKLQlTRVRfUkVHX1RPX0xBQkVMKHI0LC5ydGFzX3JldHVybl9sb2MpCi0JU0VUX1JFR19UT19DT05TVChyOSxLRVJORUxCQVNFKQotCXN1YglyNCxyNCxyOQorCUxPQURfUkVHX0FERFIocjQsLnJ0YXNfcmV0dXJuX2xvYykKKwljbHJsZGkJcjQscjQsMgkJCS8qIGNvbnZlcnQgdG8gcmVhbG1vZGUgYWRkcmVzcyAqLwogICAgICAgIAltdGxyCXI0CiAKIAlsaQlyMCwwCkBAIC02OTAsNyArNzA2LDcgQEAKIAlzeW5jCQkJCS8qIGRpc2FibGUgaW50ZXJydXB0cyBzbyBTUlIwLzEgKi8KIAltdG1zcmQJcjAJCQkvKiBkb24ndCBnZXQgdHJhc2hlZCAqLwogCi0JU0VUX1JFR19UT19MQUJFTChyNCxydGFzKQorCUxPQURfUkVHX0FERFIocjQsIHJ0YXMpCiAJbGQJcjUsUlRBU0VOVFJZKHI0KQkvKiBnZXQgdGhlIHJ0YXMtPmVudHJ5IHZhbHVlICovCiAJbGQJcjQsUlRBU0JBU0UocjQpCQkvKiBnZXQgdGhlIHJ0YXMtPmJhc2UgdmFsdWUgKi8KIAkKQEAgLTcwMiw4ICs3MTgsNyBAQAogX1NUQVRJQyhydGFzX3JldHVybl9sb2MpCiAJLyogcmVsb2NhdGlvbiBpcyBvZmYgYXQgdGhpcyBwb2ludCAqLwogCW1mc3ByCXI0LFNQUk5fU1BSRzMJICAgICAgICAvKiBHZXQgUEFDQSAqLwotCVNFVF9SRUdfVE9fQ09OU1QocjUsIEtFUk5FTEJBU0UpCi0gICAgICAgIHN1YiAgICAgcjQscjQscjUgICAgICAgICAgICAgICAgLyogUkVMT0MgdGhlIFBBQ0EgYmFzZSBwb2ludGVyICovCisJY2xybGRpCXI0LHI0LDIJCQkvKiBjb252ZXJ0IHRvIHJlYWxtb2RlIGFkZHJlc3MgKi8KIAogCW1mbXNyICAgcjYKIAlsaQlyMCxNU1JfUkkKQEAgLTcxMiw3ICs3MjcsNyBAQAogCW10bXNyZCAgcjYKICAgICAgICAgCiAgICAgICAgIGxkCXIxLFBBQ0FSMShyNCkgICAgICAgICAgIC8qIFJlc3RvcmUgb3VyIFNQICovCi0JTE9BREFERFIocjMsLnJ0YXNfcmVzdG9yZV9yZWdzKQorCUxPQURfUkVHX0lNTUVESUFURShyMywucnRhc19yZXN0b3JlX3JlZ3MpCiAgICAgICAgIGxkCXI0LFBBQ0FTQVZFRE1TUihyNCkgICAgIC8qIFJlc3RvcmUgb3VyIE1TUiAqLwogCiAJbXRzcHIJU1BSTl9TUlIwLHIzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2ZwdS5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9mcHUuUwppbmRleCBiNzgwYjQyLi5lNDM2MmRmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2ZwdS5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZnB1LlMKQEAgLTM5LDkgKzM5LDkgQEAKICAqIHRvIGFub3RoZXIuICBJbnN0ZWFkIHdlIGNhbGwgZ2l2ZXVwX2ZwdSBpbiBzd2l0Y2hfdG8uCiAgKi8KICNpZm5kZWYgQ09ORklHX1NNUAotCUxPQURCQVNFKHIzLCBsYXN0X3Rhc2tfdXNlZF9tYXRoKQorCUxPQURfUkVHX0FERFJCQVNFKHIzLCBsYXN0X3Rhc2tfdXNlZF9tYXRoKQogCXRvcmVhbChyMykKLQlQUENfTEwJcjQsT0ZGKGxhc3RfdGFza191c2VkX21hdGgpKHIzKQorCVBQQ19MTAlyNCxBRERST0ZGKGxhc3RfdGFza191c2VkX21hdGgpKHIzKQogCVBQQ19MQ01QSQkwLHI0LDAKIAliZXEJMWYKIAl0b3JlYWwocjQpCkBAIC03Nyw3ICs3Nyw3IEBACiAjaWZuZGVmIENPTkZJR19TTVAKIAlzdWJpCXI0LHI1LFRIUkVBRAogCWZyb21yZWFsKHI0KQotCVBQQ19TVEwJcjQsT0ZGKGxhc3RfdGFza191c2VkX21hdGgpKHIzKQorCVBQQ19TVEwJcjQsQUREUk9GRihsYXN0X3Rhc2tfdXNlZF9tYXRoKShyMykKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAJLyogcmVzdG9yZSByZWdpc3RlcnMgYW5kIHJldHVybiAqLwogCS8qIHdlIGhhdmVuJ3QgdXNlZCBjdHIgb3IgeGVyIG9yIGxyICovCkBAIC0xMTMsOCArMTEzLDggQEAKIDE6CiAjaWZuZGVmIENPTkZJR19TTVAKIAlsaQlyNSwwCi0JTE9BREJBU0UocjQsbGFzdF90YXNrX3VzZWRfbWF0aCkKLQlQUENfU1RMCXI1LE9GRihsYXN0X3Rhc2tfdXNlZF9tYXRoKShyNCkKKwlMT0FEX1JFR19BRERSQkFTRShyNCxsYXN0X3Rhc2tfdXNlZF9tYXRoKQorCVBQQ19TVEwJcjUsQUREUk9GRihsYXN0X3Rhc2tfdXNlZF9tYXRoKShyNCkKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAJYmxyCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF8zMi5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMKaW5kZXggY2NkZjk0Ny4uMDNiMjVmOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMKQEAgLTEyMCwxMCArMTIwLDI1IEBACiAgKiBiZWNhdXNlIE9GIG1heSBoYXZlIEkvTyBkZXZpY2VzIG1hcHBlZCBpbnRvIHRoYXQgYXJlYQogICogKHBhcnRpY3VsYXJseSBvbiBDSFJQKS4KICAqLworI2lmZGVmIENPTkZJR19QUENfTVVMVElQTEFURk9STQogCWNtcHdpCTAscjUsMAogCWJlcQkxZgogCWJsCXByb21faW5pdAogCXRyYXAKKyNlbmRpZgorCisvKgorICogQ2hlY2sgZm9yIEJvb3RYIHNpZ25hdHVyZSB3aGVuIHN1cHBvcnRpbmcgUG93ZXJNYWMgYW5kIGJyYW5jaCB0bworICogYXBwcm9wcmlhdGUgdHJhbXBvbGluZSBpZiBpdCdzIHByZXNlbnQKKyAqLworI2lmZGVmIENPTkZJR19QUENfUE1BQworMToJbGlzCXIzMSwweDQyNmYKKwlvcmkJcjMxLHIzMSwweDZmNTgKKwljbXB3CTAscjMscjMxCisJYm5lCTFmCisJYmwJYm9vdHhfaW5pdAorCXRyYXAKKyNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KIAogMToJbXIJcjMxLHIzCQkJLyogc2F2ZSBwYXJhbWV0ZXJzICovCiAJbXIJcjMwLHI0CkBAIC0xNTMsNiArMTY4LDkgQEAKIAlibAlmbHVzaF90bGJzCiAKIAlibAlpbml0aWFsX2JhdHMKKyNpZiAhZGVmaW5lZChDT05GSUdfQVBVUykgJiYgZGVmaW5lZChDT05GSUdfQk9PVFhfVEVYVCkKKwlibAlzZXR1cF9kaXNwX2JhdAorI2VuZGlmCiAKIC8qCiAgKiBDYWxsIHNldHVwX2NwdSBmb3IgQ1BVIDAgYW5kIGluaXRpYWxpemUgNnh4IElkbGUKQEAgLTQ1MCwxNiArNDY4LDExIEBACiAgKiBieSBleGVjdXRpbmcgYW4gYWx0aXZlYyBpbnN0cnVjdGlvbi4KICAqLwogCS4gPSAweGYwMAotCWIJVHJhcF8wZgorCWIJUGVyZm9ybWFuY2VNb25pdG9yCiAKIAkuID0gMHhmMjAKIAliCUFsdGlWZWNVbmF2YWlsYWJsZQogCi1UcmFwXzBmOgotCUVYQ0VQVElPTl9QUk9MT0cKLQlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECi0JRVhDX1hGRVJfRUUoMHhmMDAsIHVua25vd25fZXhjZXB0aW9uKQotCiAvKgogICogSGFuZGxlIFRMQiBtaXNzIGZvciBpbnN0cnVjdGlvbiBvbiA2MDMvNjAzZS4KICAqIE5vdGU6IHdlIGdldCBhbiBhbHRlcm5hdGUgc2V0IG9mIHIwIC0gcjMgdG8gdXNlIGF1dG9tYXRpY2FsbHkuCkBAIC03MDMsNiArNzE2LDExIEBACiAjZW5kaWYgLyogQ09ORklHX0FMVElWRUMgKi8KIAlFWENfWEZFUl9FRV9MSVRFKDB4ZjIwLCBhbHRpdmVjX3VuYXZhaWxhYmxlX2V4Y2VwdGlvbikKIAorUGVyZm9ybWFuY2VNb25pdG9yOgorCUVYQ0VQVElPTl9QUk9MT0cKKwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECisJRVhDX1hGRVJfU1REKDB4ZjAwLCBwZXJmb3JtYW5jZV9tb25pdG9yX2V4Y2VwdGlvbikKKwogI2lmZGVmIENPTkZJR19BTFRJVkVDCiAvKiBOb3RlIHRoYXQgdGhlIEFsdGlWZWMgc3VwcG9ydCBpcyBjbG9zZWx5IG1vZGVsZWQgYWZ0ZXIgdGhlIEZQCiAgKiBzdXBwb3J0LiAgQ2hhbmdlcyB0byBvbmUgYXJlIGxpa2VseSB0byBiZSBhcHBsaWNhYmxlIHRvIHRoZQpAQCAtMTMwNiw2ICsxMzI0LDMyIEBACiAJYmxyCiAKIAorI2lmICFkZWZpbmVkKENPTkZJR19BUFVTKSAmJiBkZWZpbmVkKENPTkZJR19CT09UWF9URVhUKQorc2V0dXBfZGlzcF9iYXQ6CisJLyoKKwkgKiBzZXR1cCB0aGUgZGlzcGxheSBiYXQgcHJlcGFyZWQgZm9yIHVzIGluIHByb20uYworCSAqLworCW1mbHIJcjgKKwlibAlyZWxvY19vZmZzZXQKKwltdGxyCXI4CisJYWRkaXMJcjgscjMsZGlzcF9CQVRAaGEKKwlhZGRpCXI4LHI4LGRpc3BfQkFUQGwKKwljbXB3aQljcjAscjgsMAorCWJlcWxyCisJbHd6CXIxMSwwKHI4KQorCWx3eglyOCw0KHI4KQorCW1mc3ByCXI5LFNQUk5fUFZSCisJcmx3aW5tCXI5LHI5LDE2LDE2LDMxCQkvKiByOSA9IDEgZm9yIDYwMSwgNCBmb3IgNjA0ICovCisJY21wd2kJMCxyOSwxCisJYmVxCTFmCisJbXRzcHIJU1BSTl9EQkFUM0wscjgKKwltdHNwcglTUFJOX0RCQVQzVSxyMTEKKwlibHIKKzE6CW10c3ByCVNQUk5fSUJBVDNMLHI4CisJbXRzcHIJU1BSTl9JQkFUM1UscjExCisJYmxyCisjZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX0FQVVMpICYmIGRlZmluZWQoQ09ORklHX0JPT1RYX1RFWFQpICovCisKICNpZmRlZiBDT05GSUdfODI2MAogLyogSnVtcCBpbnRvIHRoZSBzeXN0ZW0gcmVzZXQgZm9yIHRoZSByb20uCiAgKiBXZSBmaXJzdCBkaXNhYmxlIHRoZSBNTVUsIGFuZCB0aGVuIGp1bXAgdG8gdGhlIFJPTSByZXNldCBhZGRyZXNzLgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUwppbmRleCA4YThiZjc5Li4zMDgyNjg0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUwpAQCAtMTU0LDExICsxNTQsMTUgQEAKIAlibmUJMTAwYgogCiAjaWZkZWYgQ09ORklHX0hNVAotCWIJLmhtdF9pbml0CisJU0VUX1JFR19JTU1FRElBVEUocjQsIC5obXRfaW5pdCkKKwltdGN0cglyNAorCWJjdHIKICNlbHNlCiAjaWZkZWYgQ09ORklHX1NNUAorCUxPQURfUkVHX0lNTUVESUFURShyNCwgLnBTZXJpZXNfc2Vjb25kYXJ5X3NtcF9pbml0KQorCW10Y3RyCXI0CiAJbXIJcjMscjI0Ci0JYgkucFNlcmllc19zZWNvbmRhcnlfc21wX2luaXQKKwliY3RyCiAjZWxzZQogCUJVR19PUENPREUKICNlbmRpZgpAQCAtMjAwLDYgKzIwNCwyMSBAQAogI2RlZmluZSBFWF9SMwkJNjQKICNkZWZpbmUgRVhfTFIJCTcyCiAKKy8qCisgKiBXZSdyZSBzaG9ydCBvbiBzcGFjZSBhbmQgdGltZSBpbiB0aGUgZXhjZXB0aW9uIHByb2xvZywgc28gd2UgY2FuJ3QKKyAqIHVzZSB0aGUgbm9ybWFsIFNFVF9SRUdfSU1NRURJQVRFIG1hY3JvLiBOb3JtYWxseSB3ZSBqdXN0IG5lZWQgdGhlCisgKiBsb3cgaGFsZndvcmQgb2YgdGhlIGFkZHJlc3MsIGJ1dCBmb3IgS2R1bXAgd2UgbmVlZCB0aGUgd2hvbGUgbG93CisgKiB3b3JkLgorICovCisjaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKKyNkZWZpbmUgTE9BRF9IQU5ETEVSKHJlZywgbGFiZWwpCQkJCQlcCisJb3JpcwlyZWcscmVnLChsYWJlbClAaDsJLyogdmlydCBhZGRyIG9mIGhhbmRsZXIgLi4uICovCVwKKwlvcmkJcmVnLHJlZywobGFiZWwpQGw7CS8qIC4uIGFuZCB0aGUgcmVzdCAqLworI2Vsc2UKKyNkZWZpbmUgTE9BRF9IQU5ETEVSKHJlZywgbGFiZWwpCQkJCQlcCisJb3JpCXJlZyxyZWcsKGxhYmVsKUBsOwkvKiB2aXJ0IGFkZHIgb2YgaGFuZGxlciAuLi4gKi8KKyNlbmRpZgorCiAjZGVmaW5lIEVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhhcmVhLCBsYWJlbCkJCQkJXAogCW1mc3ByCXIxMyxTUFJOX1NQUkczOwkJLyogZ2V0IHBhY2EgYWRkcmVzcyBpbnRvIHIxMyAqLwlcCiAJc3RkCXI5LGFyZWErRVhfUjkocjEzKTsJLyogc2F2ZSByOSAtIHIxMiAqLwkJXApAQCAtMjEyLDcgKzIzMSw3IEBACiAJY2xycmRpCXIxMixyMTMsMzI7CQkvKiBnZXQgaGlnaCBwYXJ0IG9mICZsYWJlbCAqLwlcCiAJbWZtc3IJcjEwOwkJCQkJCQlcCiAJbWZzcHIJcjExLFNQUk5fU1JSMDsJCS8qIHNhdmUgU1JSMCAqLwkJCVwKLQlvcmkJcjEyLHIxMiwobGFiZWwpQGw7CS8qIHZpcnQgYWRkciBvZiBoYW5kbGVyICovCVwKKwlMT0FEX0hBTkRMRVIocjEyLGxhYmVsKQkJCQkJCVwKIAlvcmkJcjEwLHIxMCxNU1JfSVJ8TVNSX0RSfE1TUl9SSTsJCQkJXAogCW10c3ByCVNQUk5fU1JSMCxyMTI7CQkJCQkJXAogCW1mc3ByCXIxMixTUFJOX1NSUjE7CQkvKiBhbmQgU1JSMSAqLwkJCVwKQEAgLTIzNiw4ICsyNTUsOSBAQAogCiAjZGVmaW5lIEVYQ0VQVElPTl9QUk9MT0dfSVNFUklFU18yCQkJCQlcCiAJbWZtc3IJcjEwOwkJCQkJCQlcCi0JbGQJcjExLFBBQ0FMUFBBQ0ErTFBQQUNBU1JSMChyMTMpOwkJCQlcCi0JbGQJcjEyLFBBQ0FMUFBBQ0ErTFBQQUNBU1JSMShyMTMpOwkJCQlcCisJbGQJcjEyLFBBQ0FMUFBBQ0FQVFIocjEzKTsJCQkJCVwKKwlsZAlyMTEsTFBQQUNBU1JSMChyMTIpOwkJCQkJXAorCWxkCXIxMixMUFBBQ0FTUlIxKHIxMik7CQkJCQlcCiAJb3JpCXIxMCxyMTAsTVNSX1JJOwkJCQkJCVwKIAltdG1zcmQJcjEwLDEKIApAQCAtNTUzLDYgKzU3Myw3IEBACiAgKiBWZWN0b3JzIGZvciB0aGUgRldOTUkgb3B0aW9uLiAgU2hhcmUgY29tbW9uIGNvZGUuCiAgKi8KIAkuZ2xvYmwgc3lzdGVtX3Jlc2V0X2Z3bm1pCisgICAgICAuYWxpZ24gNwogc3lzdGVtX3Jlc2V0X2Z3bm1pOgogCUhNVF9NRURJVU0KIAltdHNwcglTUFJOX1NQUkcxLHIxMwkJLyogc2F2ZSByMTMgKi8KQEAgLTU2MCw2ICs1ODEsNyBAQAogCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhQQUNBX0VYR0VOLCBzeXN0ZW1fcmVzZXRfY29tbW9uKQogCiAJLmdsb2JsIG1hY2hpbmVfY2hlY2tfZndubWkKKyAgICAgIC5hbGlnbiA3CiBtYWNoaW5lX2NoZWNrX2Z3bm1pOgogCUhNVF9NRURJVU0KIAltdHNwcglTUFJOX1NQUkcxLHIxMwkJLyogc2F2ZSByMTMgKi8KQEAgLTYxNCw3ICs2MzYsOCBAQAogCXN0ZAlyMTIsUEFDQV9FWFNMQitFWF9SMTIocjEzKQogCW1mc3ByCXIxMCxTUFJOX1NQUkcxCiAJc3RkCXIxMCxQQUNBX0VYU0xCK0VYX1IxMyhyMTMpCi0JbGQJcjEyLFBBQ0FMUFBBQ0ErTFBQQUNBU1JSMShyMTMpOworCWxkCXIxMixQQUNBTFBQQUNBUFRSKHIxMykKKwlsZAlyMTIsTFBQQUNBU1JSMShyMTIpCiAJYgkuc2xiX21pc3NfcmVhbG1vZGUKIAogCVNURF9FWENFUFRJT05fSVNFUklFUygweDQwMCwgaW5zdHJ1Y3Rpb25fYWNjZXNzLCBQQUNBX0VYR0VOKQpAQCAtNjI0LDcgKzY0Nyw4IEBACiAJbXRzcHIJU1BSTl9TUFJHMSxyMTMJCS8qIHNhdmUgcjEzICovCiAJbWZzcHIJcjEzLFNQUk5fU1BSRzMJCS8qIGdldCBwYWNhIGFkZHJlc3MgaW50byByMTMgKi8KIAlzdGQJcjMsUEFDQV9FWFNMQitFWF9SMyhyMTMpCi0JbGQJcjMsUEFDQUxQUEFDQStMUFBBQ0FTUlIwKHIxMykJLyogZ2V0IFNSUjAgdmFsdWUgKi8KKwlsZAlyMyxQQUNBTFBQQUNBUFRSKHIxMykKKwlsZAlyMyxMUFBBQ0FTUlIwKHIzKQkvKiBnZXQgU1JSMCB2YWx1ZSAqLwogCXN0ZAlyOSxQQUNBX0VYU0xCK0VYX1I5KHIxMykKIAltZmNyCXI5CiAjaWZkZWYgX19ESVNBQkxFRF9fCkBAIC02MzYsNyArNjYwLDggQEAKIAlzdGQJcjEyLFBBQ0FfRVhTTEIrRVhfUjEyKHIxMykKIAltZnNwcglyMTAsU1BSTl9TUFJHMQogCXN0ZAlyMTAsUEFDQV9FWFNMQitFWF9SMTMocjEzKQotCWxkCXIxMixQQUNBTFBQQUNBK0xQUEFDQVNSUjEocjEzKTsKKwlsZAlyMTIsUEFDQUxQUEFDQVBUUihyMTMpCisJbGQJcjEyLExQUEFDQVNSUjEocjEyKQogCWIJLnNsYl9taXNzX3JlYWxtb2RlCiAKICNpZmRlZiBfX0RJU0FCTEVEX18KQEAgLTY5Myw3ICs3MTgsNyBAQAogCWxieglyMjMsUEFDQVBST0NTVEFSVChyMTMpCS8qIFRlc3QgaWYgdGhpcyBwcm9jZXNzb3IKIAkJCQkJICogc2hvdWxkIHN0YXJ0ICovCiAJc3luYwotCUxPQURBRERSKHIzLGN1cnJlbnRfc2V0KQorCUxPQURfUkVHX0lNTUVESUFURShyMyxjdXJyZW50X3NldCkKIAlzbGRpCXIyOCxyMjQsMwkJLyogZ2V0IGN1cnJlbnRfc2V0W2NwdSNdICovCiAJbGR4CXIzLHIzLHIyOAogCWFkZGkJcjEscjMsVEhSRUFEX1NJWkUKQEAgLTcyNSwxNiArNzUwLDE5IEBACiAJLmdsb2JsIGRlY3JlbWVudGVyX2lTZXJpZXNfbWFza2VkCiBkZWNyZW1lbnRlcl9pU2VyaWVzX21hc2tlZDoKIAlsaQlyMTEsMQotCXN0YglyMTEsUEFDQUxQUEFDQStMUFBBQ0FERUNSSU5UKHIxMykKLQlsd3oJcjEyLFBBQ0FERUZBVUxUREVDUihyMTMpCisJbGQJcjEyLFBBQ0FMUFBBQ0FQVFIocjEzKQorCXN0YglyMTEsTFBQQUNBREVDUklOVChyMTIpCisJTE9BRF9SRUdfQUREUkJBU0UocjEyLHRiX3RpY2tzX3Blcl9qaWZmeSkKKwlsd3oJcjEyLEFERFJPRkYodGJfdGlja3NfcGVyX2ppZmZ5KShyMTIpCiAJbXRzcHIJU1BSTl9ERUMscjEyCiAJLyogZmFsbCB0aHJvdWdoICovCiAKIAkuZ2xvYmwgaGFyZHdhcmVfaW50ZXJydXB0X2lTZXJpZXNfbWFza2VkCiBoYXJkd2FyZV9pbnRlcnJ1cHRfaVNlcmllc19tYXNrZWQ6CiAJbXRjcmYJMHg4MCxyOQkJLyogUmVzdG9yZSByZWdzICovCi0JbGQJcjExLFBBQ0FMUFBBQ0ErTFBQQUNBU1JSMChyMTMpCi0JbGQJcjEyLFBBQ0FMUFBBQ0ErTFBQQUNBU1JSMShyMTMpCisJbGQJcjEyLFBBQ0FMUFBBQ0FQVFIocjEzKQorCWxkCXIxMSxMUFBBQ0FTUlIwKHIxMikKKwlsZAlyMTIsTFBQQUNBU1JSMShyMTIpCiAJbXRzcHIJU1BSTl9TUlIwLHIxMQogCW10c3ByCVNQUk5fU1JSMSxyMTIKIAlsZAlyOSxQQUNBX0VYR0VOK0VYX1I5KHIxMykKQEAgLTk3Myw3ICsxMDAxLDggQEAKIAlsZAlyMyxQQUNBX0VYU0xCK0VYX1IzKHIxMykKIAlsd3oJcjksUEFDQV9FWFNMQitFWF9DQ1IocjEzKQkvKiBnZXQgc2F2ZWQgQ1IgKi8KICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLQlsZAlyMTEsUEFDQUxQUEFDQStMUFBBQ0FTUlIwKHIxMykJLyogZ2V0IFNSUjAgdmFsdWUgKi8KKwlsZAlyMTEsUEFDQUxQUEFDQVBUUihyMTMpCisJbGQJcjExLExQUEFDQVNSUjAocjExKQkJLyogZ2V0IFNSUjAgdmFsdWUgKi8KICNlbmRpZiAvKiBDT05GSUdfUFBDX0lTRVJJRVMgKi8KIAogCW10bHIJcjEwCkBAIC0xMzQ1LDcgKzEzNzQsNyBAQAogICogZml4ZWQgYWRkcmVzcyAodGhlIGxpbmtlciBjYW4ndCBjb21wdXRlICh1NjQpJmluaXRpYWxfc3RhYiA+PgogICogUEFHRV9TSElGVCkuCiAgKi8KLQkuID0gU1RBQjBfUEhZU19BRERSCS8qIDB4NjAwMCAqLworCS4gPSBTVEFCMF9PRkZTRVQJLyogMHg2MDAwICovCiAJLmdsb2JsIGluaXRpYWxfc3RhYgogaW5pdGlhbF9zdGFiOgogCS5zcGFjZQk0MDk2CkBAIC0xMzkxLDcgKzE0MjAsNyBAQAogCSAqIHBoeXNpY2FsIGNwdSBpZCBpbiByMjQsIHdlIG5lZWQgdG8gc2VhcmNoIHRoZSBwYWNhcyB0byBmaW5kCiAJICogd2hpY2ggbG9naWNhbCBpZCBtYXBzIHRvIG91ciBwaHlzaWNhbCBvbmUuCiAJICovCi0JTE9BREFERFIocjEzLCBwYWNhKSAJCS8qIEdldCBiYXNlIHZhZGRyIG9mIHBhY2EgYXJyYXkJICovCisJTE9BRF9SRUdfSU1NRURJQVRFKHIxMywgcGFjYSkJLyogR2V0IGJhc2UgdmFkZHIgb2YgcGFjYSBhcnJheQkgKi8KIAlsaQlyNSwwCQkJLyogbG9naWNhbCBjcHUgaWQgICAgICAgICAgICAgICAgKi8KIDE6CWxoeglyNixQQUNBSFdDUFVJRChyMTMpCS8qIExvYWQgSFcgcHJvY2lkIGZyb20gcGFjYSAgICAgICovCiAJY21wdwlyNixyMjQJCQkvKiBDb21wYXJlIHRvIG91ciBpZCAgICAgICAgICAgICAqLwpAQCAtMTQyNSw4ICsxNDU0LDggQEAKICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKIF9TVEFUSUMoX19zdGFydF9pbml0aWFsaXphdGlvbl9pU2VyaWVzKQogCS8qIENsZWFyIG91dCB0aGUgQlNTICovCi0JTE9BREFERFIocjExLF9fYnNzX3N0b3ApCi0JTE9BREFERFIocjgsX19ic3Nfc3RhcnQpCisJTE9BRF9SRUdfSU1NRURJQVRFKHIxMSxfX2Jzc19zdG9wKQorCUxPQURfUkVHX0lNTUVESUFURShyOCxfX2Jzc19zdGFydCkKIAlzdWIJcjExLHIxMSxyOAkJLyogYnNzIHNpemUJCQkqLwogCWFkZGkJcjExLHIxMSw3CQkvKiByb3VuZCB1cCB0byBhbiBldmVuIGRvdWJsZSB3b3JkICovCiAJcmxkaWNsLiByMTEscjExLDYxLDMJCS8qIHNoaWZ0IHJpZ2h0IGJ5IDMJCSovCkBAIC0xNDM3LDE3ICsxNDY2LDE3IEBACiAzOglzdGR1CXIwLDgocjgpCiAJYmRuegkzYgogNDoKLQlMT0FEQUREUihyMSxpbml0X3RocmVhZF91bmlvbikKKwlMT0FEX1JFR19JTU1FRElBVEUocjEsaW5pdF90aHJlYWRfdW5pb24pCiAJYWRkaQlyMSxyMSxUSFJFQURfU0laRQogCWxpCXIwLDAKIAlzdGR1CXIwLC1TVEFDS19GUkFNRV9PVkVSSEVBRChyMSkKIAotCUxPQURBRERSKHIzLGNwdV9zcGVjcykKLQlMT0FEQUREUihyNCxjdXJfY3B1X3NwZWMpCisJTE9BRF9SRUdfSU1NRURJQVRFKHIzLGNwdV9zcGVjcykKKwlMT0FEX1JFR19JTU1FRElBVEUocjQsY3VyX2NwdV9zcGVjKQogCWxpCXI1LDAKIAlibAkuaWRlbnRpZnlfY3B1CiAKLQlMT0FEQUREUihyMixfX3RvY19zdGFydCkKKwlMT0FEX1JFR19JTU1FRElBVEUocjIsX190b2Nfc3RhcnQpCiAJYWRkaQlyMixyMiwweDQwMDAKIAlhZGRpCXIyLHIyLDB4NDAwMAogCkBAIC0xNDg1LDExICsxNTE0LDEzIEBACiAgKgogICovCiBfR0xPQkFMKF9fc3RhcnRfaW5pdGlhbGl6YXRpb25fbXVsdGlwbGF0Zm9ybSkKKyNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KIAkvKgogCSAqIEFyZSB3ZSBib290ZWQgZnJvbSBhIFBST00gT2YtdHlwZSBjbGllbnQtaW50ZXJmYWNlID8KIAkgKi8KIAljbXBsZGkJY3IwLHI1LDAKIAlibmUJLl9fYm9vdF9mcm9tX3Byb20JCS8qIHllcyAtPiBwcm9tICovCisjZW5kaWYKIAogCS8qIFNhdmUgcGFyYW1ldGVycyAqLwogCW1yCXIzMSxyMwpAQCAtMTUwNSwxMSArMTUzNiwxMiBAQAogCWxpCXIyNCwwCiAKIAkvKiBTd2l0Y2ggb2ZmIE1NVSBpZiBub3QgYWxyZWFkeSAqLwotCUxPQURBRERSKHI0LCAuX19hZnRlcl9wcm9tX3N0YXJ0IC0gS0VSTkVMQkFTRSkKKwlMT0FEX1JFR19JTU1FRElBVEUocjQsIC5fX2FmdGVyX3Byb21fc3RhcnQgLSBLRVJORUxCQVNFKQogCWFkZAlyNCxyNCxyMzAKIAlibAkuX19tbXVfb2ZmCiAJYgkuX19hZnRlcl9wcm9tX3N0YXJ0CiAKKyNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KIF9TVEFUSUMoX19ib290X2Zyb21fcHJvbSkKIAkvKiBTYXZlIHBhcmFtZXRlcnMgKi8KIAltcglyMzEscjMKQEAgLTE1MjQsNyArMTU1Niw3IEBACiAJLyogcHV0IGEgcmVsb2NhdGlvbiBvZmZzZXQgaW50byByMyAqLwogCWJsCS5yZWxvY19vZmZzZXQKIAotCUxPQURBRERSKHIyLF9fdG9jX3N0YXJ0KQorCUxPQURfUkVHX0lNTUVESUFURShyMixfX3RvY19zdGFydCkKIAlhZGRpCXIyLHIyLDB4NDAwMAogCWFkZGkJcjIscjIsMHg0MDAwCiAKQEAgLTE1NDIsNiArMTU3NCw3IEBACiAJYmwJLnByb21faW5pdAogCS8qIFdlIG5ldmVyIHJldHVybiAqLwogCXRyYXAKKyNlbmRpZgogCiAvKgogICogQXQgdGhpcyBwb2ludCwgcjMgY29udGFpbnMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgd2UgYXJlIHJ1bm5pbmcgYXQsCkBAIC0xNTUwLDcgKzE1ODMsNyBAQAogX1NUQVRJQyhfX2FmdGVyX3Byb21fc3RhcnQpCiAKIC8qCi0gKiBXZSBuZWVkIHRvIHJ1biB3aXRoIF9fc3RhcnQgYXQgcGh5c2ljYWwgYWRkcmVzcyAwLgorICogV2UgbmVlZCB0byBydW4gd2l0aCBfX3N0YXJ0IGF0IHBoeXNpY2FsIGFkZHJlc3MgUEhZU0lDQUxfU1RBUlQuCiAgKiBUaGlzIHdpbGwgbGVhdmUgc29tZSBjb2RlIGluIHRoZSBmaXJzdCAyNTZCIG9mCiAgKiByZWFsIG1lbW9yeSwgd2hpY2ggYXJlIHJlc2VydmVkIGZvciBzb2Z0d2FyZSB1c2UuCiAgKiBUaGUgcmVtYWluZGVyIG9mIHRoZSBmaXJzdCBwYWdlIGlzIGxvYWRlZCB3aXRoIHRoZSBmaXhlZApAQCAtMTU2Myw5ICsxNTk2LDkgQEAKICAqLwogCWJsCS5yZWxvY19vZmZzZXQKIAltcglyMjYscjMKLQlTRVRfUkVHX1RPX0NPTlNUKHIyNyxLRVJORUxCQVNFKQorCUxPQURfUkVHX0lNTUVESUFURShyMjcsIEtFUk5FTEJBU0UpCiAKLQlsaQlyMywwCQkJLyogdGFyZ2V0IGFkZHIgKi8KKwlMT0FEX1JFR19JTU1FRElBVEUocjMsIFBIWVNJQ0FMX1NUQVJUKQkvKiB0YXJnZXQgYWRkciAqLwogCiAJLy8gWFhYIEZJWE1FOiBVc2UgcGh5cyByZXR1cm5lZCBieSBPRiAocjMwKQogCWFkZAlyNCxyMjcscjI2IAkJLyogc291cmNlIGFkZHIJCQkgKi8KQEAgLTE1NzMsNyArMTYwNiw3IEBACiAJCQkJCS8qICAgaS5lLiB3aGVyZSB3ZSBhcmUgcnVubmluZwkgKi8KIAkJCQkJLyoJdGhlIHNvdXJjZSBhZGRyCQkgKi8KIAotCUxPQURBRERSKHI1LGNvcHlfdG9faGVyZSkJLyogIyBieXRlcyBvZiBtZW1vcnkgdG8gY29weQkgKi8KKwlMT0FEX1JFR19JTU1FRElBVEUocjUsY29weV90b19oZXJlKSAvKiAjIGJ5dGVzIG9mIG1lbW9yeSB0byBjb3B5ICovCiAJc3ViCXI1LHI1LHIyNwogCiAJbGkJcjYsMHgxMDAJCS8qIFN0YXJ0IG9mZnNldCwgdGhlIGZpcnN0IDB4MTAwICovCkBAIC0xNTgzLDExICsxNjE2LDExIEBACiAJCQkJCS8qIHRoaXMgaW5jbHVkZXMgdGhlIGNvZGUgYmVpbmcJICovCiAJCQkJCS8qIGV4ZWN1dGVkIGhlcmUuCQkgKi8KIAotCUxPQURBRERSKHIwLCA0ZikJCS8qIEp1bXAgdG8gdGhlIGNvcHkgb2YgdGhpcyBjb2RlICovCisJTE9BRF9SRUdfSU1NRURJQVRFKHIwLCA0ZikJLyogSnVtcCB0byB0aGUgY29weSBvZiB0aGlzIGNvZGUgKi8KIAltdGN0cglyMAkJCS8qIHRoYXQgd2UganVzdCBtYWRlL3JlbG9jYXRlZAkgKi8KIAliY3RyCiAKLTQ6CUxPQURBRERSKHI1LGtsaW1pdCkKKzQ6CUxPQURfUkVHX0lNTUVESUFURShyNSxrbGltaXQpCiAJYWRkCXI1LHI1LHIyNgogCWxkCXI1LDAocjUpCQkvKiBnZXQgdGhlIHZhbHVlIG9mIGtsaW1pdCAqLwogCXN1YglyNSxyNSxyMjcKQEAgLTE2NjksNyArMTcwMiw3IEBACiAJbXRtc3JkCXIzCQkJLyogUkkgb24gKi8KIAogCS8qIFNldCB1cCBhIHBhY2EgdmFsdWUgZm9yIHRoaXMgcHJvY2Vzc29yLiAqLwotCUxPQURBRERSKHI0LCBwYWNhKSAJCSAvKiBHZXQgYmFzZSB2YWRkciBvZiBwYWNhIGFycmF5CSovCisJTE9BRF9SRUdfSU1NRURJQVRFKHI0LCBwYWNhKQkvKiBHZXQgYmFzZSB2YWRkciBvZiBwYWNhIGFycmF5CSovCiAJbXVsbGkJcjEzLHIyNCxQQUNBX1NJWkUJIC8qIENhbGN1bGF0ZSB2YWRkciBvZiByaWdodCBwYWNhICovCiAJYWRkCXIxMyxyMTMscjQJCS8qIGZvciB0aGlzIHByb2Nlc3Nvci4JCSovCiAJbXRzcHIJU1BSTl9TUFJHMyxyMTMJCSAvKiBTYXZlIHZhZGRyIG9mIHBhY2EgaW4gU1BSRzMJKi8KQEAgLTE3MDYsNyArMTczOSw3IEBACiAJYmwJLmVhcmx5X3NldHVwX3NlY29uZGFyeQogCiAJLyogSW5pdGlhbGl6ZSB0aGUga2VybmVsIHN0YWNrLiAgSnVzdCBhIHJlcGVhdCBmb3IgaVNlcmllcy4JICovCi0JTE9BREFERFIocjMsY3VycmVudF9zZXQpCisJTE9BRF9SRUdfQUREUihyMywgY3VycmVudF9zZXQpCiAJc2xkaQlyMjgscjI0LDMJCS8qIGdldCBjdXJyZW50X3NldFtjcHUjXQkgKi8KIAlsZHgJcjEscjMscjI4CiAJYWRkaQlyMSxyMSxUSFJFQURfU0laRS1TVEFDS19GUkFNRV9PVkVSSEVBRApAQCAtMTcxNyw4ICsxNzUwLDggQEAKIAltdGxyCXI3CiAKIAkvKiBlbmFibGUgTU1VIGFuZCBqdW1wIHRvIHN0YXJ0X3NlY29uZGFyeSAqLwotCUxPQURBRERSKHIzLC5zdGFydF9zZWNvbmRhcnlfcHJvbG9nKQotCVNFVF9SRUdfVE9fQ09OU1QocjQsIE1TUl9LRVJORUwpCisJTE9BRF9SRUdfQUREUihyMywgLnN0YXJ0X3NlY29uZGFyeV9wcm9sb2cpCisJTE9BRF9SRUdfSU1NRURJQVRFKHI0LCBNU1JfS0VSTkVMKQogI2lmZGVmIERPX1NPRlRfRElTQUJMRQogCW9yaQlyNCxyNCxNU1JfRUUKICNlbmRpZgpAQCAtMTc2Nyw4ICsxODAwLDggQEAKIAkgKiBiZSBkZXRhY2hlZCBmcm9tIHRoZSBrZXJuZWwgY29tcGxldGVseS4gQmVzaWRlcywgd2UgbmVlZAogCSAqIHRvIGNsZWFyIGl0IG5vdyBmb3Iga2V4ZWMtc3R5bGUgZW50cnkuCiAJICovCi0JTE9BREFERFIocjExLF9fYnNzX3N0b3ApCi0JTE9BREFERFIocjgsX19ic3Nfc3RhcnQpCisJTE9BRF9SRUdfSU1NRURJQVRFKHIxMSxfX2Jzc19zdG9wKQorCUxPQURfUkVHX0lNTUVESUFURShyOCxfX2Jzc19zdGFydCkKIAlzdWIJcjExLHIxMSxyOAkJLyogYnNzIHNpemUJCQkqLwogCWFkZGkJcjExLHIxMSw3CQkvKiByb3VuZCB1cCB0byBhbiBldmVuIGRvdWJsZSB3b3JkICovCiAJcmxkaWNsLiByMTEscjExLDYxLDMJCS8qIHNoaWZ0IHJpZ2h0IGJ5IDMJCSovCkBAIC0xODA2LDcgKzE4MzksNyBAQAogCS8qIHVwIHRoZSBodGFiLiAgVGhpcyBpcyBkb25lIGJlY2F1c2Ugd2UgaGF2ZSByZWxvY2F0ZWQgdGhlICAqLwogCS8qIGtlcm5lbCBidXQgYXJlIHN0aWxsIHJ1bm5pbmcgaW4gcmVhbCBtb2RlLiAqLwogCi0JTE9BREFERFIocjMsaW5pdF90aHJlYWRfdW5pb24pCisJTE9BRF9SRUdfSU1NRURJQVRFKHIzLGluaXRfdGhyZWFkX3VuaW9uKQogCWFkZAlyMyxyMyxyMjYKIAogCS8qIHNldCB1cCBhIHN0YWNrIHBvaW50ZXIgKHBoeXNpY2FsIGFkZHJlc3MpICovCkBAIC0xODE1LDE0ICsxODQ4LDE0IEBACiAJc3RkdQlyMCwtU1RBQ0tfRlJBTUVfT1ZFUkhFQUQocjEpCiAKIAkvKiBzZXQgdXAgdGhlIFRPQyAocGh5c2ljYWwgYWRkcmVzcykgKi8KLQlMT0FEQUREUihyMixfX3RvY19zdGFydCkKKwlMT0FEX1JFR19JTU1FRElBVEUocjIsX190b2Nfc3RhcnQpCiAJYWRkaQlyMixyMiwweDQwMDAKIAlhZGRpCXIyLHIyLDB4NDAwMAogCWFkZAlyMixyMixyMjYKIAotCUxPQURBRERSKHIzLGNwdV9zcGVjcykKKwlMT0FEX1JFR19JTU1FRElBVEUocjMsIGNwdV9zcGVjcykKIAlhZGQJcjMscjMscjI2Ci0JTE9BREFERFIocjQsY3VyX2NwdV9zcGVjKQorCUxPQURfUkVHX0lNTUVESUFURShyNCxjdXJfY3B1X3NwZWMpCiAJYWRkCXI0LHI0LHIyNgogCW1yCXI1LHIyNgogCWJsCS5pZGVudGlmeV9jcHUKQEAgLTE4MzgsMTUgKzE4NzEsMTUgQEAKIAkgKiBub3doZXJlIGl0IGNhbiBiZSBpbml0aWFsaXplZCBkaWZmZXJlbnRseSBiZWZvcmUgd2UgcmVhY2ggdGhpcwogCSAqIGNvZGUKIAkgKi8KLQlMT0FEQUREUihyMjcsIGJvb3RfY3B1aWQpCisJTE9BRF9SRUdfSU1NRURJQVRFKHIyNywgYm9vdF9jcHVpZCkKIAlhZGQJcjI3LHIyNyxyMjYKIAlsd3oJcjI3LDAocjI3KQogCi0JTE9BREFERFIocjI0LCBwYWNhKSAJCS8qIEdldCBiYXNlIHZhZGRyIG9mIHBhY2EgYXJyYXkJICovCisJTE9BRF9SRUdfSU1NRURJQVRFKHIyNCwgcGFjYSkgCS8qIEdldCBiYXNlIHZhZGRyIG9mIHBhY2EgYXJyYXkJICovCiAJbXVsbGkJcjEzLHIyNyxQQUNBX1NJWkUJLyogQ2FsY3VsYXRlIHZhZGRyIG9mIHJpZ2h0IHBhY2EgKi8KIAlhZGQJcjEzLHIxMyxyMjQJCS8qIGZvciB0aGlzIHByb2Nlc3Nvci4JCSAqLwogCWFkZAlyMTMscjEzLHIyNgkJLyogY29udmVydCB0byBwaHlzaWNhbCBhZGRyCSAqLwotCW10c3ByCVNQUk5fU1BSRzMscjEzCQkvKiBQUFBCQkI6IFRlbXAuLi4gLVBldGVyICovCisJbXRzcHIJU1BSTl9TUFJHMyxyMTMKIAkKIAkvKiBEbyB2ZXJ5IGVhcmx5IGtlcm5lbCBpbml0aWFsaXphdGlvbnMsIGluY2x1ZGluZyBpbml0aWFsIGhhc2ggdGFibGUsCiAJICogc3RhYiBhbmQgc2xiIHNldHVwIGJlZm9yZSB3ZSB0dXJuIG9uIHJlbG9jYXRpb24uCSovCkBAIC0xODU1LDggKzE4ODgsOCBAQAogCW1yCXIzLHIzMQogIAlibAkuZWFybHlfc2V0dXAKIAotCUxPQURBRERSKHIzLC5zdGFydF9oZXJlX2NvbW1vbikKLQlTRVRfUkVHX1RPX0NPTlNUKHI0LCBNU1JfS0VSTkVMKQorCUxPQURfUkVHX0lNTUVESUFURShyMywgLnN0YXJ0X2hlcmVfY29tbW9uKQorCUxPQURfUkVHX0lNTUVESUFURShyNCwgTVNSX0tFUk5FTCkKIAltdHNwcglTUFJOX1NSUjAscjMKIAltdHNwcglTUFJOX1NSUjEscjQKIAlyZmlkCkBAIC0xODcwLDcgKzE5MDMsNyBAQAogCS8qIFRoZSBmb2xsb3dpbmcgY29kZSBzZXRzIHVwIHRoZSBTUCBhbmQgVE9DIG5vdyB0aGF0IHdlIGFyZSAqLwogCS8qIHJ1bm5pbmcgd2l0aCB0cmFuc2xhdGlvbiBlbmFibGVkLiAqLwogCi0JTE9BREFERFIocjMsaW5pdF90aHJlYWRfdW5pb24pCisJTE9BRF9SRUdfSU1NRURJQVRFKHIzLGluaXRfdGhyZWFkX3VuaW9uKQogCiAJLyogc2V0IHVwIHRoZSBzdGFjayAqLwogCWFkZGkJcjEscjMsVEhSRUFEX1NJWkUKQEAgLTE4ODMsMTYgKzE5MTYsMTYgQEAKIAlsaQlyMywwCiAJYmwJLmRvX2NwdV9mdHJfZml4dXBzCiAKLQlMT0FEQUREUihyMjYsIGJvb3RfY3B1aWQpCisJTE9BRF9SRUdfSU1NRURJQVRFKHIyNiwgYm9vdF9jcHVpZCkKIAlsd3oJcjI2LDAocjI2KQogCi0JTE9BREFERFIocjI0LCBwYWNhKSAJCS8qIEdldCBiYXNlIHZhZGRyIG9mIHBhY2EgYXJyYXkgICovCisJTE9BRF9SRUdfSU1NRURJQVRFKHIyNCwgcGFjYSkJLyogR2V0IGJhc2UgdmFkZHIgb2YgcGFjYSBhcnJheSAgKi8KIAltdWxsaQlyMTMscjI2LFBBQ0FfU0laRQkvKiBDYWxjdWxhdGUgdmFkZHIgb2YgcmlnaHQgcGFjYSAqLwogCWFkZAlyMTMscjEzLHIyNAkJLyogZm9yIHRoaXMgcHJvY2Vzc29yLgkJICovCiAJbXRzcHIJU1BSTl9TUFJHMyxyMTMKIAogCS8qIHB0ciB0byBjdXJyZW50ICovCi0JTE9BREFERFIocjQsaW5pdF90YXNrKQorCUxPQURfUkVHX0lNTUVESUFURShyNCwgaW5pdF90YXNrKQogCXN0ZAlyNCxQQUNBQ1VSUkVOVChyMTMpCiAKIAkvKiBMb2FkIHRoZSBUT0MgKi8KQEAgLTE5MTUsNyArMTk0OCw3IEBACiAKIF9HTE9CQUwoaG10X2luaXQpCiAjaWZkZWYgQ09ORklHX0hNVAotCUxPQURBRERSKHI1LCBobXRfdGhyZWFkX2RhdGEpCisJTE9BRF9SRUdfSU1NRURJQVRFKHI1LCBobXRfdGhyZWFkX2RhdGEpCiAJbWZzcHIJcjcsU1BSTl9QVlIKIAlzcndpCXI3LHI3LDE2CiAJY21wd2kJcjcsMHgzNAkJCS8qIFB1bHNhciAgKi8KQEAgLTE5MzYsNyArMTk2OSw3IEBACiAJYgkxMDFmCiAKIF9faG10X3NlY29uZGFyeV9ob2xkOgotCUxPQURBRERSKHI1LCBobXRfdGhyZWFkX2RhdGEpCisJTE9BRF9SRUdfSU1NRURJQVRFKHI1LCBobXRfdGhyZWFkX2RhdGEpCiAJY2xybGRpCXI1LHI1LDQKIAlsaQlyNywwCiAJbWZzcHIJcjYsU1BSTl9QSVIKQEAgLTE5NjQsNyArMTk5Nyw3IEBACiAKICNpZmRlZiBDT05GSUdfSE1UCiBfR0xPQkFMKGhtdF9zdGFydF9zZWNvbmRhcnkpCi0JTE9BREFERFIocjQsX19obXRfc2Vjb25kYXJ5X2hvbGQpCisJTE9BRF9SRUdfSU1NRURJQVRFKHI0LF9faG10X3NlY29uZGFyeV9ob2xkKQogCWNscmxkaQlyNCxyNCw0CiAJbXRzcHIJU1BSTl9OSUFET1JNLCByNAogCW1mc3ByCXI0LCBTUFJOX01TUkRPUk0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWJtZWJ1cy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pYm1lYnVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ3ZDQwYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWJtZWJ1cy5jCkBAIC0wLDAgKzEsMzk2IEBACisvKgorICogSUJNIFBvd2VyUEMgSUJNIGVCdXMgSW5mcmFzdHJ1Y3R1cmUgU3VwcG9ydC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uCisgKiAgSGVpa28gSiBTY2hpY2sgPHNjaGlja2hqQGRlLmlibS5jb20+CisgKiAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBkaXN0cmlidXRlZCB1bmRlciBhIGR1YWwgbGljZW5zZSBvZiBHUEwgdjIuMCBhbmQgT3BlbklCIAorICogQlNELiAKKyAqCisgKiBPcGVuSUIgQlNEIExpY2Vuc2UKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDogCisgKgorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorICogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisgKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIAorICogYW5kL29yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2libWVidXMuaD4KKyNpbmNsdWRlIDxhc20vYWJzX2FkZHIuaD4KKworc3RhdGljIHN0cnVjdCBpYm1lYnVzX2RldiBpYm1lYnVzX2J1c19kZXZpY2UgPSB7IC8qIGZha2UgInBhcmVudCIgZGV2aWNlICovCisJLm5hbWUgPSBpYm1lYnVzX2J1c19kZXZpY2Uub2ZkZXYuZGV2LmJ1c19pZCwKKwkub2ZkZXYuZGV2LmJ1c19pZCA9ICJpYm1lYnVzIiwKKwkub2ZkZXYuZGV2LmJ1cyAgICA9ICZpYm1lYnVzX2J1c190eXBlLAorfTsKKworc3RhdGljIHZvaWQgKmlibWVidXNfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwKKwkJCQkgICAgZ2ZwX3QgZmxhZykKK3sKKwl2b2lkICptZW07CisJCisJbWVtID0ga21hbGxvYyhzaXplLCBmbGFnKTsKKwkqZG1hX2hhbmRsZSA9IChkbWFfYWRkcl90KW1lbTsKKworCXJldHVybiBtZW07Cit9CisKK3N0YXRpYyB2b2lkIGlibWVidXNfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBzaXplX3Qgc2l6ZSwgdm9pZCAqdmFkZHIsIAorCQkJCSAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQoreworCWtmcmVlKHZhZGRyKTsKK30KKworc3RhdGljIGRtYV9hZGRyX3QgaWJtZWJ1c19tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHZvaWQgKnB0ciwKKwkJCQkgICAgIHNpemVfdCBzaXplLAorCQkJCSAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCXJldHVybiAoZG1hX2FkZHJfdCkocHRyKTsKK30KKworc3RhdGljIHZvaWQgaWJtZWJ1c191bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBkbWFfYWRkcl90IGRtYV9hZGRyLAorCQkJCSBzaXplX3Qgc2l6ZSwgCisJCQkJIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgaWJtZWJ1c19tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJICBpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlpbnQgaTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgbmVudHM7IGkrKykgeworCQlzZ1tpXS5kbWFfYWRkcmVzcyA9IChkbWFfYWRkcl90KXBhZ2VfYWRkcmVzcyhzZ1tpXS5wYWdlKSAKKwkJCSsgc2dbaV0ub2Zmc2V0OworCQlzZ1tpXS5kbWFfbGVuZ3RoID0gc2dbaV0ubGVuZ3RoOworCX0KKwkKKwlyZXR1cm4gbmVudHM7Cit9CisKK3N0YXRpYyB2b2lkIGlibWVidXNfdW5tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJICAgICBpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgaWJtZWJ1c19kbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCit7CisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBkbWFfbWFwcGluZ19vcHMgaWJtZWJ1c19kbWFfb3BzID0geworCS5hbGxvY19jb2hlcmVudCA9IGlibWVidXNfYWxsb2NfY29oZXJlbnQsCisJLmZyZWVfY29oZXJlbnQgID0gaWJtZWJ1c19mcmVlX2NvaGVyZW50LAorCS5tYXBfc2luZ2xlICAgICA9IGlibWVidXNfbWFwX3NpbmdsZSwKKwkudW5tYXBfc2luZ2xlICAgPSBpYm1lYnVzX3VubWFwX3NpbmdsZSwKKwkubWFwX3NnICAgICAgICAgPSBpYm1lYnVzX21hcF9zZywKKwkudW5tYXBfc2cgICAgICAgPSBpYm1lYnVzX3VubWFwX3NnLAorCS5kbWFfc3VwcG9ydGVkICA9IGlibWVidXNfZG1hX3N1cHBvcnRlZCwKK307CisKK3N0YXRpYyBpbnQgaWJtZWJ1c19idXNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpYm1lYnVzX2RldiAqaWJtZWJ1c2RldiAgICA9IHRvX2libWVidXNfZGV2KGRldik7CisJc3RydWN0IGlibWVidXNfZHJpdmVyICppYm1lYnVzZHJ2ID0gdG9faWJtZWJ1c19kcml2ZXIoZGV2LT5kcml2ZXIpOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKmlkOworCWludCBlcnJvciA9IC1FTk9ERVY7CisJCisJaWYgKCFpYm1lYnVzZHJ2LT5wcm9iZSkKKwkJcmV0dXJuIGVycm9yOworCQorCWlkID0gb2ZfbWF0Y2hfZGV2aWNlKGlibWVidXNkcnYtPmlkX3RhYmxlLCAmaWJtZWJ1c2Rldi0+b2ZkZXYpOworCWlmIChpZCkgeworCQllcnJvciA9IGlibWVidXNkcnYtPnByb2JlKGlibWVidXNkZXYsIGlkKTsKKwl9CisJCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IGlibWVidXNfYnVzX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlibWVidXNfZGV2ICppYm1lYnVzZGV2ICAgID0gdG9faWJtZWJ1c19kZXYoZGV2KTsKKwlzdHJ1Y3QgaWJtZWJ1c19kcml2ZXIgKmlibWVidXNkcnYgPSB0b19pYm1lYnVzX2RyaXZlcihkZXYtPmRyaXZlcik7CisJCisJaWYgKGlibWVidXNkcnYtPnJlbW92ZSkgeworCQlyZXR1cm4gaWJtZWJ1c2Rydi0+cmVtb3ZlKGlibWVidXNkZXYpOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGlibWVidXNfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCW9mX25vZGVfcHV0KHRvX2libWVidXNfZGV2KGRldiktPm9mZGV2Lm5vZGUpOworCWtmcmVlKHRvX2libWVidXNfZGV2KGRldikpOworfQorCitzdGF0aWMgc3NpemVfdCBpYm1lYnVzZGV2X3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCB0b19pYm1lYnVzX2RldihkZXYpLT5uYW1lKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgsIGlibWVidXNkZXZfc2hvd19uYW1lLCAKKwkJICAgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgaWJtZWJ1c19kZXYqIF9fZGV2aW5pdCBpYm1lYnVzX3JlZ2lzdGVyX2RldmljZV9jb21tb24oCisJc3RydWN0IGlibWVidXNfZGV2ICpkZXYsIGNoYXIgKm5hbWUpCit7CisJaW50IGVyciA9IDA7CisKKwlkZXYtPm5hbWUgPSBuYW1lOworCWRldi0+b2ZkZXYuZGV2LnBhcmVudCAgPSAmaWJtZWJ1c19idXNfZGV2aWNlLm9mZGV2LmRldjsKKwlkZXYtPm9mZGV2LmRldi5idXMgICAgID0gJmlibWVidXNfYnVzX3R5cGU7CisJZGV2LT5vZmRldi5kZXYucmVsZWFzZSA9IGlibWVidXNfZGV2X3JlbGVhc2U7CisKKwkvKiBBbiBpYm1lYnVzZGV2IGlzIGJhc2VkIG9uIGEgb2ZfZGV2aWNlLiBXZSBoYXZlIHRvIGNoYW5nZSB0aGUKKwkgKiBidXMgdHlwZSB0byB1c2Ugb3VyIG93biBETUEgbWFwcGluZyBvcGVyYXRpb25zLiAKKwkgKi8gICAgICAgCisJaWYgKChlcnIgPSBvZl9kZXZpY2VfcmVnaXN0ZXIoJmRldi0+b2ZkZXYpKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZWdpc3RlciBkZXZpY2UgKCVkKS5cbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIGVycik7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+b2ZkZXYuZGV2LCAmZGV2X2F0dHJfbmFtZSk7CisJCisJcmV0dXJuIGRldjsKK30KKworc3RhdGljIHN0cnVjdCBpYm1lYnVzX2RldiogX19kZXZpbml0IGlibWVidXNfcmVnaXN0ZXJfZGV2aWNlX25vZGUoCisJc3RydWN0IGRldmljZV9ub2RlICpkbikKK3sKKwlzdHJ1Y3QgaWJtZWJ1c19kZXYgKmRldjsKKwljaGFyICpsb2NfY29kZTsKKwlpbnQgbGVuZ3RoOworCisJbG9jX2NvZGUgPSAoY2hhciAqKWdldF9wcm9wZXJ0eShkbiwgImlibSxsb2MtY29kZSIsIE5VTEwpOworCWlmICghbG9jX2NvZGUpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogbm9kZSAlcyBtaXNzaW5nICdpYm0sbG9jLWNvZGUnXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBkbi0+bmFtZSA/IGRuLT5uYW1lIDogIjx1bmtub3duPiIpOworCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCQorCWlmIChzdHJsZW4obG9jX2NvZGUpID09IDApIHsKKwkgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAnaWJtLGxvYy1jb2RlJyBpcyBpbnZhbGlkXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlibWVidXNfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChkZXYsIDAsIHNpemVvZihzdHJ1Y3QgaWJtZWJ1c19kZXYpKTsKKworCWRldi0+b2ZkZXYubm9kZSA9IG9mX25vZGVfZ2V0KGRuKTsKKyAgICAgICAKKwlsZW5ndGggPSBzdHJsZW4obG9jX2NvZGUpOworCW1lbWNweShkZXYtPm9mZGV2LmRldi5idXNfaWQsIGxvY19jb2RlIAorCQkrIChsZW5ndGggLSBtaW4obGVuZ3RoLCBCVVNfSURfU0laRSAtIDEpKSwgCisJCW1pbihsZW5ndGgsIEJVU19JRF9TSVpFIC0gMSkpOworCisJLyogUmVnaXN0ZXIgd2l0aCBnZW5lcmljIGRldmljZSBmcmFtZXdvcmsuICovCisJaWYgKGlibWVidXNfcmVnaXN0ZXJfZGV2aWNlX2NvbW1vbihkZXYsIGRuLT5uYW1lKSA9PSBOVUxMKSB7CisJCWtmcmVlKGRldik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBkZXY7Cit9CisKK3N0YXRpYyB2b2lkIGlibWVidXNfcHJvYmVfb2Zfbm9kZXMoY2hhciogbmFtZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gTlVMTDsKKwkKKwl3aGlsZSAoKGRuID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoZG4sIG5hbWUpKSkgeworCQlpZiAoaWJtZWJ1c19yZWdpc3Rlcl9kZXZpY2Vfbm9kZShkbikgPT0gTlVMTCkgeworCQkJb2Zfbm9kZV9wdXQoZG4pOworCQkJCisJCQlyZXR1cm47CisJCX0KKwl9CisJCisJb2Zfbm9kZV9wdXQoZG4pOworCQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgaWJtZWJ1c19hZGRfZGV2aWNlc19ieV9pZChzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZHQpCit7CisJd2hpbGUgKHN0cmxlbihpZHQtPm5hbWUpID4gMCkgeworCQlpYm1lYnVzX3Byb2JlX29mX25vZGVzKGlkdC0+bmFtZSk7CisJCWlkdCsrOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIGludCBpYm1lYnVzX21hdGNoX2hlbHBlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJaWYgKHN0cmNtcCgoY2hhciopZGF0YSwgdG9faWJtZWJ1c19kZXYoZGV2KS0+bmFtZSkgPT0gMCkKKwkJcmV0dXJuIDE7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWJtZWJ1c191bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX25hbWUpOworCW9mX2RldmljZV91bnJlZ2lzdGVyKHRvX29mX2RldmljZShkZXYpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpYm1lYnVzX3JlbW92ZV9kZXZpY2VzX2J5X2lkKHN0cnVjdCBvZl9kZXZpY2VfaWQgKmlkdCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJCisJd2hpbGUgKHN0cmxlbihpZHQtPm5hbWUpID4gMCkgeworCQl3aGlsZSAoKGRldiA9IGJ1c19maW5kX2RldmljZSgmaWJtZWJ1c19idXNfdHlwZSwgTlVMTCwgCisJCQkJCSAgICAgICh2b2lkKilpZHQtPm5hbWUsCisJCQkJCSAgICAgIGlibWVidXNfbWF0Y2hfaGVscGVyKSkpIHsKKwkJCWlibWVidXNfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2KTsKKwkJfQorCQlpZHQrKzsKKwkJCisJfQorCQorCXJldHVybjsKK30KKworaW50IGlibWVidXNfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBpYm1lYnVzX2RyaXZlciAqZHJ2KQoreworCWludCBlcnIgPSAwOworCisJZHJ2LT5kcml2ZXIubmFtZSAgID0gZHJ2LT5uYW1lOworCWRydi0+ZHJpdmVyLmJ1cyAgICA9ICZpYm1lYnVzX2J1c190eXBlOworCWRydi0+ZHJpdmVyLnByb2JlICA9IGlibWVidXNfYnVzX3Byb2JlOworCWRydi0+ZHJpdmVyLnJlbW92ZSA9IGlibWVidXNfYnVzX3JlbW92ZTsKKworCWlmICgoZXJyID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcikgIT0gMCkpCisJCXJldHVybiBlcnI7CisKKwlpYm1lYnVzX2FkZF9kZXZpY2VzX2J5X2lkKGRydi0+aWRfdGFibGUpOworCQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpYm1lYnVzX3JlZ2lzdGVyX2RyaXZlcik7CisKK3ZvaWQgaWJtZWJ1c191bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgaWJtZWJ1c19kcml2ZXIgKmRydikKK3sJCisJZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKKwlpYm1lYnVzX3JlbW92ZV9kZXZpY2VzX2J5X2lkKGRydi0+aWRfdGFibGUpOworfQorRVhQT1JUX1NZTUJPTChpYm1lYnVzX3VucmVnaXN0ZXJfZHJpdmVyKTsKKworaW50IGlibWVidXNfcmVxdWVzdF9pcnEoc3RydWN0IGlibWVidXNfZGV2ICpkZXYsCisJCQl1MzIgaXN0LCAKKwkJCWlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkKiwgc3RydWN0IHB0X3JlZ3MgKiksCisJCQl1bnNpZ25lZCBsb25nIGlycV9mbGFncywgY29uc3QgY2hhciAqIGRldm5hbWUsCisJCQl2b2lkICpkZXZfaWQpCit7CisJdW5zaWduZWQgaW50IGlycSA9IHZpcnRfaXJxX2NyZWF0ZV9tYXBwaW5nKGlzdCk7CisJCisJaWYgKGlycSA9PSBOT19JUlEpCisJCXJldHVybiAtRUlOVkFMOworCQorCWlycSA9IGlycV9vZmZzZXRfdXAoaXJxKTsKKwkKKwlyZXR1cm4gcmVxdWVzdF9pcnEoaXJxLCBoYW5kbGVyLAorCQkJICAgaXJxX2ZsYWdzLCBkZXZuYW1lLCBkZXZfaWQpOworfQorRVhQT1JUX1NZTUJPTChpYm1lYnVzX3JlcXVlc3RfaXJxKTsKKwordm9pZCBpYm1lYnVzX2ZyZWVfaXJxKHN0cnVjdCBpYm1lYnVzX2RldiAqZGV2LCB1MzIgaXN0LCB2b2lkICpkZXZfaWQpCit7CisJdW5zaWduZWQgaW50IGlycSA9IHZpcnRfaXJxX2NyZWF0ZV9tYXBwaW5nKGlzdCk7CisJCisJaXJxID0gaXJxX29mZnNldF91cChpcnEpOworCWZyZWVfaXJxKGlycSwgZGV2X2lkKTsKKwkKKwlyZXR1cm47Cit9CitFWFBPUlRfU1lNQk9MKGlibWVidXNfZnJlZV9pcnEpOworCitzdGF0aWMgaW50IGlibWVidXNfYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sJCisJY29uc3Qgc3RydWN0IGlibWVidXNfZGV2ICplYnVzX2RldiA9IHRvX2libWVidXNfZGV2KGRldik7CisJc3RydWN0IGlibWVidXNfZHJpdmVyICplYnVzX2RydiAgICA9IHRvX2libWVidXNfZHJpdmVyKGRydik7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqaWRzICAgICA9IGVidXNfZHJ2LT5pZF90YWJsZTsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpmb3VuZF9pZDsKKwkKKwlpZiAoIWlkcykKKwkJcmV0dXJuIDA7CisJCisJZm91bmRfaWQgPSBvZl9tYXRjaF9kZXZpY2UoaWRzLCAmZWJ1c19kZXYtPm9mZGV2KTsKKwlpZiAoZm91bmRfaWQpCisJCXJldHVybiAxOworCQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgYnVzX3R5cGUgaWJtZWJ1c19idXNfdHlwZSA9IHsKKwkubmFtZSA9ICJpYm1lYnVzIiwKKwkubWF0Y2ggPSBpYm1lYnVzX2J1c19tYXRjaCwKK307CitFWFBPUlRfU1lNQk9MKGlibWVidXNfYnVzX3R5cGUpOworCitzdGF0aWMgaW50IF9faW5pdCBpYm1lYnVzX2J1c19pbml0KHZvaWQpCit7CisJaW50IGVycjsKKwkKKwlwcmludGsoS0VSTl9JTkZPICJJQk0gZUJ1cyBEZXZpY2UgRHJpdmVyXG4iKTsKKwkKKwllcnIgPSBidXNfcmVnaXN0ZXIoJmlibWVidXNfYnVzX3R5cGUpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICI6JXM6IGZhaWxlZCB0byByZWdpc3RlciBJQk0gZUJ1cy5cbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gZXJyOworCX0KKwkKKwllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJmlibWVidXNfYnVzX2RldmljZS5vZmRldi5kZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRldmljZV9yZWdpc3RlciByZXR1cm5lZCAlaVxuIiwgCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIGVycik7CisJCWJ1c191bnJlZ2lzdGVyKCZpYm1lYnVzX2J1c190eXBlKTsKKworCQlyZXR1cm4gZXJyOworCX0KKwkKKwlyZXR1cm4gMDsKK30KK19faW5pdGNhbGwoaWJtZWJ1c19idXNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfcG93ZXI0LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfcG93ZXI0LlMKaW5kZXggMTQ5NGUyZi4uYzE2YjRhZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlX3Bvd2VyNC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZV9wb3dlcjQuUwpAQCAtMzgsMTQgKzM4LDE0IEBACiAJLyogV2UgbXVzdCBkeW5hbWljYWxseSBjaGVjayBmb3IgdGhlIE5BUCBmZWF0dXJlIGFzIGl0CiAJICogY2FuIGJlIGNsZWFyZWQgYnkgQ1BVIGluaXQgYWZ0ZXIgdGhlIGZpeHVwcyBhcmUgZG9uZQogCSAqLwotCUxPQURCQVNFKHIzLGN1cl9jcHVfc3BlYykKLQlsZAlyNCxPRkYoY3VyX2NwdV9zcGVjKShyMykKKwlMT0FEX1JFR19BRERSQkFTRShyMyxjdXJfY3B1X3NwZWMpCisJbGQJcjQsQUREUk9GRihjdXJfY3B1X3NwZWMpKHIzKQogCWxkCXI0LENQVV9TUEVDX0ZFQVRVUkVTKHI0KQogCWFuZGkuCXIwLHI0LENQVV9GVFJfQ0FOX05BUAogCWJlcWxyCiAJLyogTm93IGNoZWNrIGlmIHVzZXIgb3IgYXJjaCBlbmFibGVkIE5BUCBtb2RlICovCi0JTE9BREJBU0UocjMscG93ZXJzYXZlX25hcCkKLQlsd3oJcjQsT0ZGKHBvd2Vyc2F2ZV9uYXApKHIzKQorCUxPQURfUkVHX0FERFJCQVNFKHIzLHBvd2Vyc2F2ZV9uYXApCisJbHd6CXI0LEFERFJPRkYocG93ZXJzYXZlX25hcCkocjMpCiAJY21wd2kJMCxyNCwwCiAJYmVxbHIKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb2N0bDMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lvY3RsMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZhM2QyNy4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lvY3RsMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBpb2N0bDMyLmM6IENvbnZlcnNpb24gYmV0d2VlbiAzMmJpdCBhbmQgNjRiaXQgbmF0aXZlIGlvY3Rscy4KLSAqCi0gKiBCYXNlZCBvbiBzcGFyYzY0IGlvY3RsMzIuYyBieToKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMCAgSmFrdWIgSmVsaW5layAgKGpha3ViQHJlZGhhdC5jb20pCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggIEVkZGllIEMuIERvc3QgIChlY2RAc2t5bmV0LmJlKQotICoKLSAqIHBwYzY0IGNoYW5nZXM6Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwICBLZW4gQWFrZXIgKGtkYWFrZXJAcmNobGFuZC52bmV0LmlibS5jb20pCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgIEFudG9uIEJsYW5jaGFyZCAoYW50b25iQGF1LmlibS5jb20pCi0gKgotICogVGhlc2Ugcm91dGluZXMgbWFpbnRhaW4gYXJndW1lbnQgc2l6ZSBjb252ZXJzaW9uIGJldHdlZW4gMzJiaXQgYW5kIDY0Yml0Ci0gKiBpb2N0bHMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jZGVmaW5lIElOQ0xVREVTCi0jaW5jbHVkZSAiY29tcGF0X2lvY3RsLmMiCi0jaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KLQotI2RlZmluZSBDT0RFCi0jaW5jbHVkZSAiY29tcGF0X2lvY3RsLmMiCi0KLSNkZWZpbmUgSEFORExFX0lPQ1RMKGNtZCxoYW5kbGVyKSB7IGNtZCwgKGlvY3RsX3RyYW5zX2hhbmRsZXJfdCloYW5kbGVyLCBOVUxMIH0sCi0jZGVmaW5lIENPTVBBVElCTEVfSU9DVEwoY21kKSBIQU5ETEVfSU9DVEwoY21kLHN5c19pb2N0bCkKLQotI2RlZmluZSBJT0NUTF9UQUJMRV9TVEFSVCBcCi0Jc3RydWN0IGlvY3RsX3RyYW5zIGlvY3RsX3N0YXJ0W10gPSB7Ci0jZGVmaW5lIElPQ1RMX1RBQkxFX0VORCBcCi0JfTsKLQotSU9DVExfVEFCTEVfU1RBUlQKLSNpbmNsdWRlIDxsaW51eC9jb21wYXRfaW9jdGwuaD4KLSNkZWZpbmUgREVDTEFSRVMKLSNpbmNsdWRlICJjb21wYXRfaW9jdGwuYyIKLQotSU9DVExfVEFCTEVfRU5ECi0KLWludCBpb2N0bF90YWJsZV9zaXplID0gQVJSQVlfU0laRShpb2N0bF9zdGFydCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYwppbmRleCA1YTcxZWQ5Li5kMWZmZmNlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKQEAgLTMxLDcgKzMxLDYgQEAKICAqIHRvIHJlZHVjZSBjb2RlIHNwYWNlIGFuZCB1bmRlZmluZWQgZnVuY3Rpb24gcmVmZXJlbmNlcy4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KQEAgLTQ0LDE4ICs0MywxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2lmZGVmIENPTkZJR19QUEM2NAotI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+Ci0jZW5kaWYKIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtNjYsOCArNTksNyBAQAogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaWZkZWYgQ09ORklHX1BQQzY0Ci0jaW5jbHVkZSA8YXNtL2lzZXJpZXMvaXRfbHBfcXVldWUuaD4KKyNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKICNpbmNsdWRlIDxhc20vcGFjYS5oPgogI2VuZGlmCiAKQEAgLTc4LDEwICs3MCw2IEBACiAKIHN0YXRpYyBpbnQgcHBjX3NwdXJpb3VzX2ludGVycnVwdHM7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19QUENfSVNFUklFUykgJiYgZGVmaW5lZChDT05GSUdfU01QKQotZXh0ZXJuIHZvaWQgaVNlcmllc19zbXBfbWVzc2FnZV9yZWN2KHN0cnVjdCBwdF9yZWdzICopOwotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfUFBDMzIKICNkZWZpbmUgTlJfTUFTS19XT1JEUwkoKE5SX0lSUVMgKyAzMSkgLyAzMikKIApAQCAtMTk1LDQ5ICsxODMsNiBAQAogfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLXZvaWQgZG9fSVJRKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXN0cnVjdCBwYWNhX3N0cnVjdCAqbHBhY2E7Ci0KLQlpcnFfZW50ZXIoKTsKLQotI2lmZGVmIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XCi0JLyogRGVidWdnaW5nIGNoZWNrIGZvciBzdGFjayBvdmVyZmxvdzogaXMgdGhlcmUgbGVzcyB0aGFuIDJLQiBmcmVlPyAqLwotCXsKLQkJbG9uZyBzcDsKLQotCQlzcCA9IF9fZ2V0X1NQKCkgJiAoVEhSRUFEX1NJWkUtMSk7Ci0KLQkJaWYgKHVubGlrZWx5KHNwIDwgKHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pICsgMjA0OCkpKSB7Ci0JCQlwcmludGsoImRvX0lSUTogc3RhY2sgb3ZlcmZsb3c6ICVsZFxuIiwKLQkJCQlzcCAtIHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pKTsKLQkJCWR1bXBfc3RhY2soKTsKLQkJfQotCX0KLSNlbmRpZgotCi0JbHBhY2EgPSBnZXRfcGFjYSgpOwotI2lmZGVmIENPTkZJR19TTVAKLQlpZiAobHBhY2EtPmxwcGFjYS5pbnRfZHdvcmQuZmllbGRzLmlwaV9jbnQpIHsKLQkJbHBhY2EtPmxwcGFjYS5pbnRfZHdvcmQuZmllbGRzLmlwaV9jbnQgPSAwOwotCQlpU2VyaWVzX3NtcF9tZXNzYWdlX3JlY3YocmVncyk7Ci0JfQotI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KLQlpZiAoaHZscGV2ZW50X2lzX3BlbmRpbmcoKSkKLQkJcHJvY2Vzc19odmxwZXZlbnRzKHJlZ3MpOwotCi0JaXJxX2V4aXQoKTsKLQotCWlmIChscGFjYS0+bHBwYWNhLmludF9kd29yZC5maWVsZHMuZGVjcl9pbnQpIHsKLQkJbHBhY2EtPmxwcGFjYS5pbnRfZHdvcmQuZmllbGRzLmRlY3JfaW50ID0gMDsKLQkJLyogU2lnbmFsIGEgZmFrZSBkZWNyZW1lbnRlciBpbnRlcnJ1cHQgKi8KLQkJdGltZXJfaW50ZXJydXB0KHJlZ3MpOwotCX0KLX0KLQotI2Vsc2UJLyogQ09ORklHX1BQQ19JU0VSSUVTICovCi0KIHZvaWQgZG9fSVJRKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWludCBpcnE7CkBAIC0yODYsMTYgKzIzMSwyMCBAQAogCQl9IGVsc2UKICNlbmRpZgogCQkJX19kb19JUlEoaXJxLCByZWdzKTsKLQl9IGVsc2UKLSNpZmRlZiBDT05GSUdfUFBDMzIKLQkJaWYgKGlycSAhPSAtMikKLSNlbmRpZgotCQkJLyogVGhhdCdzIG5vdCBTTVAgc2FmZSAuLi4gYnV0IHdobyBjYXJlcyA/ICovCi0JCQlwcGNfc3B1cmlvdXNfaW50ZXJydXB0cysrOwotICAgICAgICBpcnFfZXhpdCgpOwotfQorCX0gZWxzZSBpZiAoaXJxICE9IC0yKQorCQkvKiBUaGF0J3Mgbm90IFNNUCBzYWZlIC4uLiBidXQgd2hvIGNhcmVzID8gKi8KKwkJcHBjX3NwdXJpb3VzX2ludGVycnVwdHMrKzsKIAotI2VuZGlmCS8qIENPTkZJR19QUENfSVNFUklFUyAqLworICAgICAgICBpcnFfZXhpdCgpOworCisjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCisJaWYgKGdldF9scHBhY2EoKS0+aW50X2R3b3JkLmZpZWxkcy5kZWNyX2ludCkgeworCQlnZXRfbHBwYWNhKCktPmludF9kd29yZC5maWVsZHMuZGVjcl9pbnQgPSAwOworCQkvKiBTaWduYWwgYSBmYWtlIGRlY3JlbWVudGVyIGludGVycnVwdCAqLworCQl0aW1lcl9pbnRlcnJ1cHQocmVncyk7CisJfQorI2VuZGlmCit9CiAKIHZvaWQgX19pbml0IGluaXRfSVJRKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IDUzNjhmOWMuLmNmYWI0ODUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwva3Byb2Jlcy5jCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGFzbS9zc3RlcC5oPgogCi1zdGF0aWMgREVDTEFSRV9NVVRFWChrcHJvYmVfbXV0ZXgpOwogREVGSU5FX1BFUl9DUFUoc3RydWN0IGtwcm9iZSAqLCBjdXJyZW50X2twcm9iZSkgPSBOVUxMOwogREVGSU5FX1BFUl9DUFUoc3RydWN0IGtwcm9iZV9jdGxibGssIGtwcm9iZV9jdGxibGspOwogCkBAIC01NCwxOSArNTMsMTcgQEAKIAogCS8qIGluc24gbXVzdCBiZSBvbiBhIHNwZWNpYWwgZXhlY3V0YWJsZSBwYWdlIG9uIHBwYzY0ICovCiAJaWYgKCFyZXQpIHsKLQkJZG93bigma3Byb2JlX211dGV4KTsKIAkJcC0+YWluc24uaW5zbiA9IGdldF9pbnNuX3Nsb3QoKTsKLQkJdXAoJmtwcm9iZV9tdXRleCk7CiAJCWlmICghcC0+YWluc24uaW5zbikKIAkJCXJldCA9IC1FTk9NRU07CiAJfQotCXJldHVybiByZXQ7Ci19CiAKLXZvaWQgX19rcHJvYmVzIGFyY2hfY29weV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKLXsKLQltZW1jcHkocC0+YWluc24uaW5zbiwgcC0+YWRkciwgTUFYX0lOU05fU0laRSAqIHNpemVvZihrcHJvYmVfb3Bjb2RlX3QpKTsKLQlwLT5vcGNvZGUgPSAqcC0+YWRkcjsKKwlpZiAoIXJldCkgeworCQltZW1jcHkocC0+YWluc24uaW5zbiwgcC0+YWRkciwgTUFYX0lOU05fU0laRSAqIHNpemVvZihrcHJvYmVfb3Bjb2RlX3QpKTsKKwkJcC0+b3Bjb2RlID0gKnAtPmFkZHI7CisJfQorCisJcmV0dXJuIHJldDsKIH0KIAogdm9pZCBfX2twcm9iZXMgYXJjaF9hcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCkBAIC0xODIsNiArMTc5LDE4IEBACiAJCQlrY2ItPmtwcm9iZV9zdGF0dXMgPSBLUFJPQkVfUkVFTlRFUjsKIAkJCXJldHVybiAxOwogCQl9IGVsc2UgeworCQkJaWYgKCphZGRyICE9IEJSRUFLUE9JTlRfSU5TVFJVQ1RJT04pIHsKKwkJCQkvKiBJZiB0cmFwIHZhcmlhbnQsIHRoZW4gaXQgYmVsb25ncyBub3QgdG8gdXMgKi8KKwkJCQlrcHJvYmVfb3Bjb2RlX3QgY3VyX2luc24gPSAqYWRkcjsKKwkJCQlpZiAoaXNfdHJhcChjdXJfaW5zbikpCisJCSAgICAgICAJCQlnb3RvIG5vX2twcm9iZTsKKwkJCQkvKiBUaGUgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiB3YXMgcmVtb3ZlZCBieQorCQkJCSAqIGFub3RoZXIgY3B1IHJpZ2h0IGFmdGVyIHdlIGhpdCwgbm8gZnVydGhlcgorCQkJCSAqIGhhbmRsaW5nIG9mIHRoaXMgaW50ZXJydXB0IGlzIGFwcHJvcHJpYXRlCisJCQkJICovCisJCQkJcmV0ID0gMTsKKwkJCQlnb3RvIG5vX2twcm9iZTsKKwkJCX0KIAkJCXAgPSBfX2dldF9jcHVfdmFyKGN1cnJlbnRfa3Byb2JlKTsKIAkJCWlmIChwLT5icmVha19oYW5kbGVyICYmIHAtPmJyZWFrX2hhbmRsZXIocCwgcmVncykpIHsKIAkJCQlnb3RvIHNzX3Byb2JlOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9sZWdhY3lfc2VyaWFsLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2xlZ2FjeV9zZXJpYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTcwYWNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9sZWdhY3lfc2VyaWFsLmMKQEAgLTAsMCArMSw1NTcgQEAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tbXUuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vdWRiZy5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KKworI3VuZGVmIERFQlVHCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEQkcoZm10Li4uKSBkbyB7IHByaW50ayhmbXQpOyB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBEQkcoZm10Li4uKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9MRUdBQ1lfU0VSSUFMX1BPUlRTCTgKKworc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydAorbGVnYWN5X3NlcmlhbF9wb3J0c1tNQVhfTEVHQUNZX1NFUklBTF9QT1JUUysxXTsKK3N0YXRpYyBzdHJ1Y3QgbGVnYWN5X3NlcmlhbF9pbmZvIHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUJCSpucDsKKwl1bnNpZ25lZCBpbnQJCQlzcGVlZDsKKwl1bnNpZ25lZCBpbnQJCQljbG9jazsKKwlwaHlzX2FkZHJfdAkJCXRhZGRyOworfSBsZWdhY3lfc2VyaWFsX2luZm9zW01BWF9MRUdBQ1lfU0VSSUFMX1BPUlRTXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGVnYWN5X3NlcmlhbF9jb3VudDsKK3N0YXRpYyBpbnQgbGVnYWN5X3NlcmlhbF9jb25zb2xlID0gLTE7CisKK3N0YXRpYyBpbnQgX19pbml0IGFkZF9sZWdhY3lfcG9ydChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBpbnQgd2FudF9pbmRleCwKKwkJCQkgIGludCBpb3R5cGUsIHBoeXNfYWRkcl90IGJhc2UsCisJCQkJICBwaHlzX2FkZHJfdCB0YWRkciwgdW5zaWduZWQgbG9uZyBpcnEsCisJCQkJICB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJdTMyICpjbGssICpzcGQsIGNsb2NrID0gQkFTRV9CQVVEICogMTY7CisJaW50IGluZGV4OworCisJLyogZ2V0IGNsb2NrIGZyZXEuIGlmIHByZXNlbnQgKi8KKwljbGsgPSAodTMyICopZ2V0X3Byb3BlcnR5KG5wLCAiY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7CisJaWYgKGNsayAmJiAqY2xrKQorCQljbG9jayA9ICpjbGs7CisKKwkvKiBnZXQgZGVmYXVsdCBzcGVlZCBpZiBwcmVzZW50ICovCisJc3BkID0gKHUzMiAqKWdldF9wcm9wZXJ0eShucCwgImN1cnJlbnQtc3BlZWQiLCBOVUxMKTsKKworCS8qIElmIHdlIGhhdmUgYSBsb2NhdGlvbiBpbmRleCwgdGhlbiB0cnkgdG8gdXNlIGl0ICovCisJaWYgKHdhbnRfaW5kZXggPj0gMCAmJiB3YW50X2luZGV4IDwgTUFYX0xFR0FDWV9TRVJJQUxfUE9SVFMpCisJCWluZGV4ID0gd2FudF9pbmRleDsKKwllbHNlCisJCWluZGV4ID0gbGVnYWN5X3NlcmlhbF9jb3VudDsKKworCS8qIGlmIG91ciBpbmRleCBpcyBzdGlsbCBvdXQgb2YgcmFuZ2UsIHRoYXQgbWVhbiB0aGF0CisJICogYXJyYXkgaXMgZnVsbCwgd2UgY291bGQgc2NhbiBmb3IgYSBmcmVlIHNsb3QgYnV0IHRoYXQKKwkgKiBtYWtlIGxpdHRsZSBzZW5zZSB0byBib3RoZXIsIGp1c3Qgc2tpcCB0aGUgcG9ydAorCSAqLworCWlmIChpbmRleCA+PSBNQVhfTEVHQUNZX1NFUklBTF9QT1JUUykKKwkJcmV0dXJuIC0xOworCWlmIChpbmRleCA+PSBsZWdhY3lfc2VyaWFsX2NvdW50KQorCQlsZWdhY3lfc2VyaWFsX2NvdW50ID0gaW5kZXggKyAxOworCisJLyogQ2hlY2sgaWYgdGhlcmUgaXMgYSBwb3J0IHdobyBhbHJlYWR5IGNsYWltZWQgb3VyIHNsb3QgKi8KKwlpZiAobGVnYWN5X3NlcmlhbF9pbmZvc1tpbmRleF0ubnAgIT0gMCkgeworCQkvKiBpZiB3ZSBzdGlsbCBoYXZlIHNvbWUgcm9vbSwgbW92ZSBpdCwgZWxzZSBvdmVycmlkZSAqLworCQlpZiAobGVnYWN5X3NlcmlhbF9jb3VudCA8IE1BWF9MRUdBQ1lfU0VSSUFMX1BPUlRTKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJNb3ZlZCBsZWdhY3kgcG9ydCAlZCAtPiAlZFxuIiwKKwkJCSAgICAgICBpbmRleCwgbGVnYWN5X3NlcmlhbF9jb3VudCk7CisJCQlsZWdhY3lfc2VyaWFsX3BvcnRzW2xlZ2FjeV9zZXJpYWxfY291bnRdID0KKwkJCQlsZWdhY3lfc2VyaWFsX3BvcnRzW2luZGV4XTsKKwkJCWxlZ2FjeV9zZXJpYWxfaW5mb3NbbGVnYWN5X3NlcmlhbF9jb3VudF0gPQorCQkJCWxlZ2FjeV9zZXJpYWxfaW5mb3NbaW5kZXhdOworCQkJbGVnYWN5X3NlcmlhbF9jb3VudCsrOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiUmVwbGFjaW5nIGxlZ2FjeSBwb3J0ICVkXG4iLCBpbmRleCk7CisJCX0KKwl9CisKKwkvKiBOb3cgZmlsbCB0aGUgZW50cnkgKi8KKwltZW1zZXQoJmxlZ2FjeV9zZXJpYWxfcG9ydHNbaW5kZXhdLCAwLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0KSk7CisJaWYgKGlvdHlwZSA9PSBVUElPX1BPUlQpCisJCWxlZ2FjeV9zZXJpYWxfcG9ydHNbaW5kZXhdLmlvYmFzZSA9IGJhc2U7CisJZWxzZQorCQlsZWdhY3lfc2VyaWFsX3BvcnRzW2luZGV4XS5tYXBiYXNlID0gYmFzZTsKKwlsZWdhY3lfc2VyaWFsX3BvcnRzW2luZGV4XS5pb3R5cGUgPSBpb3R5cGU7CisJbGVnYWN5X3NlcmlhbF9wb3J0c1tpbmRleF0udWFydGNsayA9IGNsb2NrOworCWxlZ2FjeV9zZXJpYWxfcG9ydHNbaW5kZXhdLmlycSA9IGlycTsKKwlsZWdhY3lfc2VyaWFsX3BvcnRzW2luZGV4XS5mbGFncyA9IGZsYWdzOworCWxlZ2FjeV9zZXJpYWxfaW5mb3NbaW5kZXhdLnRhZGRyID0gdGFkZHI7CisJbGVnYWN5X3NlcmlhbF9pbmZvc1tpbmRleF0ubnAgPSBvZl9ub2RlX2dldChucCk7CisJbGVnYWN5X3NlcmlhbF9pbmZvc1tpbmRleF0uY2xvY2sgPSBjbG9jazsKKwlsZWdhY3lfc2VyaWFsX2luZm9zW2luZGV4XS5zcGVlZCA9IHNwZCA/ICpzcGQgOiAwOworCisJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgbGVnYWN5IHNlcmlhbCBwb3J0ICVkIGZvciAlc1xuIiwKKwkgICAgICAgaW5kZXgsIG5wLT5mdWxsX25hbWUpOworCXByaW50ayhLRVJOX0lORk8gIiAgJXM9JWxseCwgdGFkZHI9JWxseCwgaXJxPSVseCwgY2xrPSVkLCBzcGVlZD0lZFxuIiwKKwkgICAgICAgKGlvdHlwZSA9PSBVUElPX1BPUlQpID8gInBvcnQiIDogIm1lbSIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmFzZSwgKHVuc2lnbmVkIGxvbmcgbG9uZyl0YWRkciwgaXJxLAorCSAgICAgICBsZWdhY3lfc2VyaWFsX3BvcnRzW2luZGV4XS51YXJ0Y2xrLAorCSAgICAgICBsZWdhY3lfc2VyaWFsX2luZm9zW2luZGV4XS5zcGVlZCk7CisKKwlyZXR1cm4gaW5kZXg7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFkZF9sZWdhY3lfc29jX3BvcnQoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKnNvY19kZXYpCit7CisJcGh5c19hZGRyX3QgYWRkcjsKKwl1MzIgKmFkZHJwOworCXVuc2lnbmVkIGludCBmbGFncyA9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCB8IFVQRl9TSEFSRV9JUlE7CisKKwkvKiBXZSBvbmx5IHN1cHBvcnQgcG9ydHMgdGhhdCBoYXZlIGEgY2xvY2sgZnJlcXVlbmN5IHByb3Blcmx5CisJICogZW5jb2RlZCBpbiB0aGUgZGV2aWNlLXRyZWUuCisJICovCisJaWYgKGdldF9wcm9wZXJ0eShucCwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCS8qIEdldCB0aGUgYWRkcmVzcyAqLworCWFkZHJwID0gb2ZfZ2V0X2FkZHJlc3Moc29jX2RldiwgMCwgTlVMTCwgTlVMTCk7CisJaWYgKGFkZHJwID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWFkZHIgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhzb2NfZGV2LCBhZGRycCk7CisKKwkvKiBBZGQgcG9ydCwgaXJxIHdpbGwgYmUgZGVhbHQgd2l0aCBsYXRlci4gV2UgcGFzc2VkIGEgdHJhbnNsYXRlZAorCSAqIElPIHBvcnQgdmFsdWUuIEl0IHdpbGwgYmUgZml4ZWQgdXAgbGF0ZXIgYWxvbmcgd2l0aCB0aGUgaXJxCisJICovCisJcmV0dXJuIGFkZF9sZWdhY3lfcG9ydChucCwgLTEsIFVQSU9fTUVNLCBhZGRyLCBhZGRyLCBOT19JUlEsIGZsYWdzKTsKK30KKworI2lmZGVmIENPTkZJR19JU0EKK3N0YXRpYyBpbnQgX19pbml0IGFkZF9sZWdhY3lfaXNhX3BvcnQoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmlzYV9icmcpCit7CisJdTMyICpyZWc7CisJY2hhciAqdHlwZXA7CisJaW50IGluZGV4ID0gLTE7CisJcGh5c19hZGRyX3QgdGFkZHI7CisKKwkvKiBHZXQgdGhlIElTQSBwb3J0IG51bWJlciAqLworCXJlZyA9ICh1MzIgKilnZXRfcHJvcGVydHkobnAsICJyZWciLCBOVUxMKTsKKwlpZiAocmVnID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCS8qIFZlcmlmeSBpdCdzIGFuIElPIHBvcnQsIHdlIGRvbid0IHN1cHBvcnQgYW55dGhpbmcgZWxzZSAqLworCWlmICghKHJlZ1swXSAmIDB4MDAwMDAwMDEpKQorCQlyZXR1cm4gLTE7CisKKwkvKiBOb3cgbG9vayBmb3IgYW4gImlibSxhaXgtbG9jIiBwcm9wZXJ0eSB0aGF0IGdpdmVzIHVzIG9yZGVyaW5nCisJICogaWYgYW55Li4uCisJICovCisJdHlwZXAgPSAoY2hhciAqKWdldF9wcm9wZXJ0eShucCwgImlibSxhaXgtbG9jIiwgTlVMTCk7CisKKwkvKiBJZiB3ZSBoYXZlIGEgbG9jYXRpb24gaW5kZXgsIHRoZW4gdXNlIGl0ICovCisJaWYgKHR5cGVwICYmICp0eXBlcCA9PSAnUycpCisJCWluZGV4ID0gc2ltcGxlX3N0cnRvbCh0eXBlcCsxLCBOVUxMLCAwKSAtIDE7CisKKwkvKiBUcmFuc2xhdGUgSVNBIGFkZHJlc3MgKi8KKwl0YWRkciA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKG5wLCByZWcpOworCisJLyogQWRkIHBvcnQsIGlycSB3aWxsIGJlIGRlYWx0IHdpdGggbGF0ZXIgKi8KKwlyZXR1cm4gYWRkX2xlZ2FjeV9wb3J0KG5wLCBpbmRleCwgVVBJT19QT1JULCByZWdbMV0sIHRhZGRyLCBOT19JUlEsIFVQRl9CT09UX0FVVE9DT05GKTsKKworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW50IF9faW5pdCBhZGRfbGVnYWN5X3BjaV9wb3J0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9ub2RlICpwY2lfZGV2KQoreworCXBoeXNfYWRkcl90IGFkZHIsIGJhc2U7CisJdTMyICphZGRycDsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJaW50IGlvdHlwZSwgaW5kZXggPSAtMSwgbGluZGV4ID0gMDsKKworCS8qIFdlIG9ubHkgc3VwcG9ydCBwb3J0cyB0aGF0IGhhdmUgYSBjbG9jayBmcmVxdWVuY3kgcHJvcGVybHkKKwkgKiBlbmNvZGVkIGluIHRoZSBkZXZpY2UtdHJlZSAodGhhdCBpcyBoYXZlIGFuIGZjb2RlKS4gQW55dGhpbmcKKwkgKiBlbHNlIGNhbid0IGJlIHVzZWQgdGhhdCBlYXJseSBhbmQgd2lsbCBiZSBub3JtYWxseSBwcm9iZWQgYnkKKwkgKiB0aGUgZ2VuZXJpYyA4MjUwX3BjaSBkcml2ZXIgbGF0ZXIgb24uIFRoZSByZWFzb24gaXMgdGhhdCA4MjUwCisJICogY29tcGF0aWJsZSBVQVJUcyBvbiBQQ0kgbmVlZCBhbGwgc29ydCBvZiBxdWlya3MgKHBvcnQgb2Zmc2V0cworCSAqIGV0Yy4uLikgdGhhdCB0aGlzIGNvZGUgZG9lc24ndCBrbm93IGFib3V0CisJICovCisJaWYgKGdldF9wcm9wZXJ0eShucCwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCS8qIEdldCB0aGUgUENJIGFkZHJlc3MuIEFzc3VtZSBCQVIgMCAqLworCWFkZHJwID0gb2ZfZ2V0X3BjaV9hZGRyZXNzKHBjaV9kZXYsIDAsIE5VTEwsICZmbGFncyk7CisJaWYgKGFkZHJwID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCS8qIFdlIG9ubHkgc3VwcG9ydCBCQVIgMCBmb3Igbm93ICovCisJaW90eXBlID0gKGZsYWdzICYgSU9SRVNPVVJDRV9NRU0pID8gVVBJT19NRU0gOiBVUElPX1BPUlQ7CisJYWRkciA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKHBjaV9kZXYsIGFkZHJwKTsKKworCS8qIFNldCB0aGUgSU8gYmFzZSB0byB0aGUgc2FtZSBhcyB0aGUgdHJhbnNsYXRlZCBhZGRyZXNzIGZvciBNTUlPLAorCSAqIG9yIHRvIHRoZSBkb21haW4gbG9jYWwgSU8gYmFzZSBmb3IgUElPIChpdCB3aWxsIGJlIGZpeGVkIHVwIGxhdGVyKQorCSAqLworCWlmIChpb3R5cGUgPT0gVVBJT19NRU0pCisJCWJhc2UgPSBhZGRyOworCWVsc2UKKwkJYmFzZSA9IGFkZHJwWzJdOworCisJLyogVHJ5IHRvIGd1ZXNzIGFuIGluZGV4Li4uIElmIHdlIGhhdmUgc3ViZGV2aWNlcyBvZiB0aGUgcGNpIGRldiwKKwkgKiB3ZSBnZXQgdG8gdGhlaXIgInJlZyIgcHJvcGVydHkKKwkgKi8KKwlpZiAobnAgIT0gcGNpX2RldikgeworCQl1MzIgKnJlZyA9ICh1MzIgKilnZXRfcHJvcGVydHkobnAsICJyZWciLCBOVUxMKTsKKwkJaWYgKHJlZyAmJiAoKnJlZyA8IDQpKQorCQkJaW5kZXggPSBsaW5kZXggPSAqcmVnOworCX0KKworCS8qIExvY2FsIGluZGV4IG1lYW5zIGl0J3MgdGhlIE50aCBwb3J0IGluIHRoZSBQQ0kgY2hpcC4gVW5mb3J0dW5hdGVseQorCSAqIHRoZSBvZmZzZXQgdG8gYWRkIGhlcmUgaXMgZGV2aWNlIHNwZWNpZmljLiBXZSBrbm93IGFib3V0IHRob3NlCisJICogRVhBUiBwb3J0cyBhbmQgd2UgZGVmYXVsdCB0byB0aGUgbW9zdCBjb21tb24gY2FzZS4gSWYgeW91ciBVQVJUCisJICogZG9lc24ndCB3b3JrIGZvciB0aGVzZSBzZXR0aW5ncywgeW91J2xsIGhhdmUgdG8gYWRkIHlvdXIgb3duIHNwZWNpYWwKKwkgKiBjYXNlcyBoZXJlCisJICovCisJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKHBjaV9kZXYsICJwY2kxM2E4LDE1MiIpIHx8CisJICAgIGRldmljZV9pc19jb21wYXRpYmxlKHBjaV9kZXYsICJwY2kxM2E4LDE1NCIpIHx8CisJICAgIGRldmljZV9pc19jb21wYXRpYmxlKHBjaV9kZXYsICJwY2kxM2E4LDE1OCIpKSB7CisJCWFkZHIgKz0gMHgyMDAgKiBsaW5kZXg7CisJCWJhc2UgKz0gMHgyMDAgKiBsaW5kZXg7CisJfSBlbHNlIHsKKwkJYWRkciArPSA4ICogbGluZGV4OworCQliYXNlICs9IDggKiBsaW5kZXg7CisJfQorCisJLyogQWRkIHBvcnQsIGlycSB3aWxsIGJlIGRlYWx0IHdpdGggbGF0ZXIuIFdlIHBhc3NlZCBhIHRyYW5zbGF0ZWQKKwkgKiBJTyBwb3J0IHZhbHVlLiBJdCB3aWxsIGJlIGZpeGVkIHVwIGxhdGVyIGFsb25nIHdpdGggdGhlIGlycQorCSAqLworCXJldHVybiBhZGRfbGVnYWN5X3BvcnQobnAsIGluZGV4LCBpb3R5cGUsIGJhc2UsIGFkZHIsIE5PX0lSUSwgVVBGX0JPT1RfQVVUT0NPTkYpOworfQorI2VuZGlmCisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB2ZXJ5IGVhcmx5LCBhcyBwYXJ0IG9mIHNldHVwX3N5c3RlbSgpIG9yIGV2ZW50dWFsbHkKKyAqIHNldHVwX2FyY2goKSwgYmFzaWNhbGx5IGJlZm9yZSBhbnl0aGluZyBlbHNlIGluIHRoaXMgZmlsZS4gVGhpcyBmdW5jdGlvbgorICogd2lsbCB0cnkgdG8gYnVpbGQgYSBsaXN0IG9mIGFsbCB0aGUgYXZhaWxhYmxlIDgyNTAtY29tcGF0aWJsZSBzZXJpYWwgcG9ydHMKKyAqIGluIHRoZSBtYWNoaW5lIHVzaW5nIHRoZSBPcGVuIEZpcm13YXJlIGRldmljZS10cmVlLiBJdCBjdXJyZW50bHkgb25seSBkZWFscworICogd2l0aCBJU0EgYW5kIFBDSSBidXNzZXMgYnV0IGNvdWxkIGJlIGV4dGVuZGVkLiBJdCBhbGxvd3MgYSB2ZXJ5IGVhcmx5IGJvb3QKKyAqIGNvbnNvbGUgdG8gYmUgaW5pdGlhbGl6ZWQsIHRoYXQgbGlzdCBpcyBhbHNvIHVzZWQgbGF0ZXIgdG8gcHJvdmlkZSA4MjUwIHdpdGgKKyAqIHRoZSBtYWNoaW5lIG5vbi1QQ0kgcG9ydHMgYW5kIHRvIHByb3Blcmx5IHBpY2sgdGhlIGRlZmF1bHQgY29uc29sZSBwb3J0CisgKi8KK3ZvaWQgX19pbml0IGZpbmRfbGVnYWN5X3NlcmlhbF9wb3J0cyh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsICpzdGRvdXQgPSBOVUxMOworCWNoYXIgKnBhdGg7CisJaW50IGluZGV4OworCisJREJHKCIgLT4gZmluZF9sZWdhY3lfc2VyaWFsX3BvcnQoKVxuIik7CisKKwkvKiBOb3cgZmluZCBvdXQgaWYgb25lIG9mIHRoZXNlIGlzIG91dCBmaXJtd2FyZSBjb25zb2xlICovCisJcGF0aCA9IChjaGFyICopZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LHN0ZG91dC1wYXRoIiwgTlVMTCk7CisJaWYgKHBhdGggIT0gTlVMTCkgeworCQlzdGRvdXQgPSBvZl9maW5kX25vZGVfYnlfcGF0aChwYXRoKTsKKwkJaWYgKHN0ZG91dCkKKwkJCURCRygic3Rkb3V0IGlzICVzXG4iLCBzdGRvdXQtPmZ1bGxfbmFtZSk7CisJfSBlbHNlIHsKKwkJREJHKCIgbm8gbGludXgsc3Rkb3V0LXBhdGggIVxuIik7CisJfQorCisJLyogRmlyc3QgZmlsbCBvdXIgYXJyYXkgd2l0aCBTT0MgcG9ydHMgKi8KKwlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUobnAsICJzZXJpYWwiLCAibnMxNjU1MCIpKSAhPSBOVUxMOykgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnNvYyA9IG9mX2dldF9wYXJlbnQobnApOworCQlpZiAoc29jICYmICFzdHJjbXAoc29jLT50eXBlLCAic29jIikpIHsKKwkJCWluZGV4ID0gYWRkX2xlZ2FjeV9zb2NfcG9ydChucCwgbnApOworCQkJaWYgKGluZGV4ID49IDAgJiYgbnAgPT0gc3Rkb3V0KQorCQkJCWxlZ2FjeV9zZXJpYWxfY29uc29sZSA9IGluZGV4OworCQl9CisJCW9mX25vZGVfcHV0KHNvYyk7CisJfQorCisjaWZkZWYgQ09ORklHX0lTQQorCS8qIEZpcnN0IGZpbGwgb3VyIGFycmF5IHdpdGggSVNBIHBvcnRzICovCisJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAic2VyaWFsIikpOykgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmlzYSA9IG9mX2dldF9wYXJlbnQobnApOworCQlpZiAoaXNhICYmICFzdHJjbXAoaXNhLT5uYW1lLCAiaXNhIikpIHsKKwkJCWluZGV4ID0gYWRkX2xlZ2FjeV9pc2FfcG9ydChucCwgaXNhKTsKKwkJCWlmIChpbmRleCA+PSAwICYmIG5wID09IHN0ZG91dCkKKwkJCQlsZWdhY3lfc2VyaWFsX2NvbnNvbGUgPSBpbmRleDsKKwkJfQorCQlvZl9ub2RlX3B1dChpc2EpOworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BDSQorCS8qIE5leHQsIHRyeSB0byBsb2NhdGUgUENJIHBvcnRzICovCisJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfYWxsX25vZGVzKG5wKSk7KSB7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGNpLCAqcGFyZW50ID0gb2ZfZ2V0X3BhcmVudChucCk7CisJCWlmIChwYXJlbnQgJiYgIXN0cmNtcChwYXJlbnQtPm5hbWUsICJpc2EiKSkgeworCQkJb2Zfbm9kZV9wdXQocGFyZW50KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdHJjbXAobnAtPm5hbWUsICJzZXJpYWwiKSAmJiBzdHJjbXAobnAtPnR5cGUsICJzZXJpYWwiKSkgeworCQkJb2Zfbm9kZV9wdXQocGFyZW50KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIENoZWNrIGZvciBrbm93biBwY2ljbGFzcywgYW5kIGFsc28gY2hlY2sgd2V0aGVyIHdlIGhhdmUKKwkJICogYSBkZXZpY2Ugd2l0aCBjaGlsZCBub2RlcyBmb3IgcG9ydHMgb3Igbm90CisJCSAqLworCQlpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJwY2ljbGFzcywwNzAwIikgfHwKKwkJICAgIGRldmljZV9pc19jb21wYXRpYmxlKG5wLCAicGNpY2xhc3MsMDcwMDAyIikpCisJCQlwY2kgPSBucDsKKwkJZWxzZSBpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUocGFyZW50LCAicGNpY2xhc3MsMDcwMCIpIHx8CisJCQkgZGV2aWNlX2lzX2NvbXBhdGlibGUocGFyZW50LCAicGNpY2xhc3MsMDcwMDAyIikpCisJCQlwY2kgPSBwYXJlbnQ7CisJCWVsc2UgeworCQkJb2Zfbm9kZV9wdXQocGFyZW50KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWluZGV4ID0gYWRkX2xlZ2FjeV9wY2lfcG9ydChucCwgcGNpKTsKKwkJaWYgKGluZGV4ID49IDAgJiYgbnAgPT0gc3Rkb3V0KQorCQkJbGVnYWN5X3NlcmlhbF9jb25zb2xlID0gaW5kZXg7CisJCW9mX25vZGVfcHV0KHBhcmVudCk7CisJfQorI2VuZGlmCisKKwlEQkcoImxlZ2FjeV9zZXJpYWxfY29uc29sZSA9ICVkXG4iLCBsZWdhY3lfc2VyaWFsX2NvbnNvbGUpOworCisJLyogdWRiZyBpcyA2NCBiaXRzIG9ubHkgZm9yIG5vdywgdGhhdCB3aWxsIGNoYW5nZSBzb29uIHRob3VnaCAuLi4gKi8KKwl3aGlsZSAobGVnYWN5X3NlcmlhbF9jb25zb2xlID49IDApIHsKKwkJc3RydWN0IGxlZ2FjeV9zZXJpYWxfaW5mbyAqaW5mbyA9CisJCQkmbGVnYWN5X3NlcmlhbF9pbmZvc1tsZWdhY3lfc2VyaWFsX2NvbnNvbGVdOworCQl2b2lkIF9faW9tZW0gKmFkZHI7CisKKwkJaWYgKGluZm8tPnRhZGRyID09IDApCisJCQlicmVhazsKKwkJYWRkciA9IGlvcmVtYXAoaW5mby0+dGFkZHIsIDB4MTAwMCk7CisJCWlmIChhZGRyID09IE5VTEwpCisJCQlicmVhazsKKwkJaWYgKGluZm8tPnNwZWVkID09IDApCisJCQlpbmZvLT5zcGVlZCA9IHVkYmdfcHJvYmVfdWFydF9zcGVlZChhZGRyLCBpbmZvLT5jbG9jayk7CisJCURCRygiZGVmYXVsdCBjb25zb2xlIHNwZWVkID0gJWRcbiIsIGluZm8tPnNwZWVkKTsKKwkJdWRiZ19pbml0X3VhcnQoYWRkciwgaW5mby0+c3BlZWQsIGluZm8tPmNsb2NrKTsKKwkJYnJlYWs7CisJfQorCisJREJHKCIgPC0gZmluZF9sZWdhY3lfc2VyaWFsX3BvcnQoKVxuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNlcmlhbF9kZXZpY2UgPSB7CisJLm5hbWUJPSAic2VyaWFsODI1MCIsCisJLmlkCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gbGVnYWN5X3NlcmlhbF9wb3J0cywKKwl9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGZpeHVwX3BvcnRfaXJxKGludCBpbmRleCwKKwkJCQkgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJICBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgKnBvcnQpCit7CisJREJHKCJmaXh1cF9wb3J0X2lycSglZClcbiIsIGluZGV4KTsKKworCS8qIENoZWNrIGZvciBpbnRlcnJ1cHRzIGluIHRoYXQgbm9kZSAqLworCWlmIChucC0+bl9pbnRycyA+IDApIHsKKwkJcG9ydC0+aXJxID0gbnAtPmludHJzWzBdLmxpbmU7CisJCURCRygiIHBvcnQgJWQgKCVzKSwgaXJxPSVkXG4iLAorCQkgICAgaW5kZXgsIG5wLT5mdWxsX25hbWUsIHBvcnQtPmlycSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBDaGVjayBmb3IgaW50ZXJydXB0cyBpbiB0aGUgcGFyZW50ICovCisJbnAgPSBvZl9nZXRfcGFyZW50KG5wKTsKKwlpZiAobnAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKG5wLT5uX2ludHJzID4gMCkgeworCQlwb3J0LT5pcnEgPSBucC0+aW50cnNbMF0ubGluZTsKKwkJREJHKCIgcG9ydCAlZCAoJXMpLCBpcnE9JWRcbiIsCisJCSAgICBpbmRleCwgbnAtPmZ1bGxfbmFtZSwgcG9ydC0+aXJxKTsKKwl9CisJb2Zfbm9kZV9wdXQobnApOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZml4dXBfcG9ydF9waW8oaW50IGluZGV4LAorCQkJCSAgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkgIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCAqcG9ydCkKK3sKKyNpZmRlZiBDT05GSUdfUENJCisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOworCisJREJHKCJmaXh1cF9wb3J0X3BpbyglZClcbiIsIGluZGV4KTsKKworCWhvc2UgPSBwY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2UobnApOworCWlmIChob3NlKSB7CisJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0KKyNpZmRlZiBDT05GSUdfUFBDNjQKKwkJCXBjaV9pb19iYXNlOworI2Vsc2UKKwkJCWlzYV9pb19iYXNlOworI2VuZGlmCisJCURCRygicG9ydCAlZCwgSU8gJWx4IC0+ICVseFxuIiwKKwkJICAgIGluZGV4LCBwb3J0LT5pb2Jhc2UsIHBvcnQtPmlvYmFzZSArIG9mZnNldCk7CisJCXBvcnQtPmlvYmFzZSArPSBvZmZzZXQ7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBmaXh1cF9wb3J0X21taW8oaW50IGluZGV4LAorCQkJCSAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJICAgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0ICpwb3J0KQoreworCURCRygiZml4dXBfcG9ydF9tbWlvKCVkKVxuIiwgaW5kZXgpOworCisJcG9ydC0+bWVtYmFzZSA9IGlvcmVtYXAocG9ydC0+bWFwYmFzZSwgMHgxMDApOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgYXMgYW4gYXJjaCBpbml0Y2FsbCwgaG9wZWZ1bGx5IGJlZm9yZSB0aGUgUENJIGJ1cyBpcworICogcHJvYmVkIGFuZC9vciB0aGUgODI1MCBkcml2ZXIgbG9hZGVkIHNpbmNlIHdlIG5lZWQgdG8gcmVnaXN0ZXIgb3VyCisgKiBwbGF0Zm9ybSBkZXZpY2VzIGJlZm9yZSA4MjUwIFBDSSBvbmVzIGFyZSBkZXRlY3RlZCBhcyBzb21lIG9mIHRoZW0KKyAqIG11c3QgcHJvcGVybHkgIm92ZXJyaWRlIiB0aGUgcGxhdGZvcm0gb25lcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZpeGVzIHVwIHRoZSBpbnRlcnJ1cHQgdmFsdWUgZm9yIHBsYXRmb3JtIHBvcnRzIGFzIGl0CisgKiBjb3VsZG4ndCBiZSBkb25lIGVhcmxpZXIgYmVmb3JlIGludGVycnVwdCBtYXBzIGhhdmUgYmVlbiBwYXJzZWQuIEl0CisgKiBhbHNvICJjb3JyZWN0cyIgdGhlIElPIGFkZHJlc3MgZm9yIFBJTyBwb3J0cyBmb3IgdGhlIHNhbWUgcmVhc29uLAorICogc2luY2UgZWFybGllciwgdGhlIFBIQnMgdmlydHVhbCBJTyBzcGFjZSB3YXNuJ3QgYXNzaWduZWQgeWV0LiBJdCB0aGVuCisgKiByZWdpc3RlcnMgYWxsIHRob3NlIHBsYXRmb3JtIHBvcnRzIGZvciB1c2UgYnkgdGhlIDgyNTAgZHJpdmVyIHdoZW4gaXQKKyAqIGZpbmFsbHkgbG9hZHMuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNlcmlhbF9kZXZfaW5pdCh2b2lkKQoreworCWludCBpOworCisJaWYgKGxlZ2FjeV9zZXJpYWxfY291bnQgPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCSAqIEJlZm9yZSB3ZSByZWdpc3RlciB0aGUgcGxhdGZyb20gc2VyaWFsIGRldmljZXMsIHdlIG5lZWQKKwkgKiB0byBmaXh1cCB0aGVpciBpbnRlcnJ1dHBzIGFuZCB0aGVpciBJTyBwb3J0cy4KKwkgKi8KKwlEQkcoIkZpeGluZyBzZXJpYWwgcG9ydHMgaW50ZXJydXB0cyBhbmQgSU8gcG9ydHMgLi4uXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZWdhY3lfc2VyaWFsX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0ICpwb3J0ID0gJmxlZ2FjeV9zZXJpYWxfcG9ydHNbaV07CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBsZWdhY3lfc2VyaWFsX2luZm9zW2ldLm5wOworCisJCWlmIChwb3J0LT5pcnEgPT0gTk9fSVJRKQorCQkJZml4dXBfcG9ydF9pcnEoaSwgbnAsIHBvcnQpOworCQlpZiAocG9ydC0+aW90eXBlID09IFVQSU9fUE9SVCkKKwkJCWZpeHVwX3BvcnRfcGlvKGksIG5wLCBwb3J0KTsKKwkJaWYgKHBvcnQtPmlvdHlwZSA9PSBVUElPX01FTSkKKwkJCWZpeHVwX3BvcnRfbW1pbyhpLCBucCwgcG9ydCk7CisJfQorCisJREJHKCJSZWdpc3RlcmluZyBwbGF0Zm9ybSBzZXJpYWwgcG9ydHNcbiIpOworCisJcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmc2VyaWFsX2RldmljZSk7Cit9CithcmNoX2luaXRjYWxsKHNlcmlhbF9kZXZfaW5pdCk7CisKKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHZlcnkgZWFybHksIGFzIHBhcnQgb2YgY29uc29sZV9pbml0KCkgKHR5cGljYWxseSBqdXN0IGFmdGVyCisgKiB0aW1lX2luaXQoKSkuIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uZGlibGUgZm9yIHRyeWluZyB0byBmaW5kIGEgZ29vZAorICogZGVmYXVsdCBjb25zb2xlIG9uIHNlcmlhbCBwb3J0cy4gSXQgdHJpZXMgdG8gbWF0Y2ggdGhlIG9wZW4gZmlybXdhcmUKKyAqIGRlZmF1bHQgb3V0cHV0IHdpdGggb25lIG9mIHRoZSBhdmFpbGFibGUgc2VyaWFsIGNvbnNvbGUgZHJpdmVycywgZWl0aGVyCisgKiBvbmUgb2YgdGhlIHBsYXRmb3JtIHNlcmlhbCBwb3J0cyB0aGF0IGhhdmUgYmVlbiBwcm9iZWQgZWFybGllciBieQorICogZmluZF9sZWdhY3lfc2VyaWFsX3BvcnRzKCkgb3Igc29tZSBtb3JlIHBsYXRmb3JtIHNwZWNpZmljIG9uZXMuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGNoZWNrX2xlZ2FjeV9zZXJpYWxfY29uc29sZSh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcHJvbV9zdGRvdXQgPSBOVUxMOworCWludCBzcGVlZCA9IDAsIG9mZnNldCA9IDA7CisJY2hhciAqbmFtZTsKKwl1MzIgKnNwZDsKKworCURCRygiIC0+IGNoZWNrX2xlZ2FjeV9zZXJpYWxfY29uc29sZSgpXG4iKTsKKworCS8qIFRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgYSBjb25zb2xlIHNvIHRoaXMgaXMgYWxyZWFkeSBzZXQgdXAuICovCisJaWYgKHN0cnN0cihzYXZlZF9jb21tYW5kX2xpbmUsICJjb25zb2xlPSIpKSB7CisJCURCRygiIGNvbnNvbGUgd2FzIHNwZWNpZmllZCAhXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoIW9mX2Nob3NlbikgeworCQlEQkcoIiBvZl9jaG9zZW4gaXMgTlVMTCAhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGxlZ2FjeV9zZXJpYWxfY29uc29sZSA8IDApIHsKKwkJREJHKCIgbGVnYWN5X3NlcmlhbF9jb25zb2xlIG5vdCBmb3VuZCAhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qIFdlIGFyZSBnZXR0aW5nIGEgd2VpcmQgcGhhbmRsZSBmcm9tIE9GIC4uLiAqLworCS8qIC4uLiBTbyB1c2UgdGhlIGZ1bGwgcGF0aCBpbnN0ZWFkICovCisJbmFtZSA9IChjaGFyICopZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LHN0ZG91dC1wYXRoIiwgTlVMTCk7CisJaWYgKG5hbWUgPT0gTlVMTCkgeworCQlEQkcoIiBubyBsaW51eCxzdGRvdXQtcGF0aCAhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXByb21fc3Rkb3V0ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgobmFtZSk7CisJaWYgKCFwcm9tX3N0ZG91dCkgeworCQlEQkcoIiBjYW4ndCBmaW5kIHN0ZG91dCBwYWNrYWdlICVzICFcbiIsIG5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJREJHKCJzdGRvdXQgaXMgJXNcbiIsIHByb21fc3Rkb3V0LT5mdWxsX25hbWUpOworCisJbmFtZSA9IChjaGFyICopZ2V0X3Byb3BlcnR5KHByb21fc3Rkb3V0LCAibmFtZSIsIE5VTEwpOworCWlmICghbmFtZSkgeworCQlEQkcoIiBzdGRvdXQgcGFja2FnZSBoYXMgbm8gbmFtZSAhXG4iKTsKKwkJZ290byBub3RfZm91bmQ7CisJfQorCXNwZCA9ICh1MzIgKilnZXRfcHJvcGVydHkocHJvbV9zdGRvdXQsICJjdXJyZW50LXNwZWVkIiwgTlVMTCk7CisJaWYgKHNwZCkKKwkJc3BlZWQgPSAqc3BkOworCisJaWYgKDApCisJCTsKKyNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRQorCWVsc2UgaWYgKHN0cmNtcChuYW1lLCAic2VyaWFsIikgPT0gMCkgeworCQlpbnQgaTsKKwkJLyogTG9vayBmb3IgaXQgaW4gcHJvYmVkIGFycmF5ICovCisJCWZvciAoaSA9IDA7IGkgPCBsZWdhY3lfc2VyaWFsX2NvdW50OyBpKyspIHsKKwkJCWlmIChwcm9tX3N0ZG91dCAhPSBsZWdhY3lfc2VyaWFsX2luZm9zW2ldLm5wKQorCQkJCWNvbnRpbnVlOworCQkJb2Zmc2V0ID0gaTsKKwkJCXNwZWVkID0gbGVnYWN5X3NlcmlhbF9pbmZvc1tpXS5zcGVlZDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChpID49IGxlZ2FjeV9zZXJpYWxfY291bnQpCisJCQlnb3RvIG5vdF9mb3VuZDsKKwl9CisjZW5kaWYgLyogQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEUgKi8KKyNpZmRlZiBDT05GSUdfU0VSSUFMX1BNQUNaSUxPR19DT05TT0xFCisJZWxzZSBpZiAoc3RyY21wKG5hbWUsICJjaC1hIikgPT0gMCkKKwkJb2Zmc2V0ID0gMDsKKwllbHNlIGlmIChzdHJjbXAobmFtZSwgImNoLWIiKSA9PSAwKQorCQlvZmZzZXQgPSAxOworI2VuZGlmIC8qIENPTkZJR19TRVJJQUxfUE1BQ1pJTE9HX0NPTlNPTEUgKi8KKwllbHNlCisJCWdvdG8gbm90X2ZvdW5kOworCW9mX25vZGVfcHV0KHByb21fc3Rkb3V0KTsKKworCURCRygiRm91bmQgc2VyaWFsIGNvbnNvbGUgYXQgdHR5UyVkXG4iLCBvZmZzZXQpOworCisJaWYgKHNwZWVkKSB7CisJCXN0YXRpYyBjaGFyIF9faW5pdGRhdGEgb3B0WzE2XTsKKwkJc3ByaW50ZihvcHQsICIlZCIsIHNwZWVkKTsKKwkJcmV0dXJuIGFkZF9wcmVmZXJyZWRfY29uc29sZSgidHR5UyIsIG9mZnNldCwgb3B0KTsKKwl9IGVsc2UKKwkJcmV0dXJuIGFkZF9wcmVmZXJyZWRfY29uc29sZSgidHR5UyIsIG9mZnNldCwgTlVMTCk7CisKKyBub3RfZm91bmQ6CisJREJHKCJObyBwcmVmZXJyZWQgY29uc29sZSBmb3VuZCAhXG4iKTsKKwlvZl9ub2RlX3B1dChwcm9tX3N0ZG91dCk7CisJcmV0dXJuIC1FTk9ERVY7Cit9Citjb25zb2xlX2luaXRjYWxsKGNoZWNrX2xlZ2FjeV9zZXJpYWxfY29uc29sZSk7CisKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbHBhcmNmZy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9scGFyY2ZnLmMKaW5kZXggOWRkYTE2Yy4uMWFlOTZhOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9scGFyY2ZnLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9scGFyY2ZnLmMKQEAgLTU1LDE1ICs1NSwxMyBAQAogewogCXVuc2lnbmVkIGxvbmcgc3VtX3B1cnIgPSAwOwogCWludCBjcHU7Ci0Jc3RydWN0IHBhY2Ffc3RydWN0ICpscGFjYTsKIAogCWZvcl9lYWNoX2NwdShjcHUpIHsKLQkJbHBhY2EgPSBwYWNhICsgY3B1OwotCQlzdW1fcHVyciArPSBscGFjYS0+bHBwYWNhLmVtdWxhdGVkX3RpbWVfYmFzZTsKKwkJc3VtX3B1cnIgKz0gbHBwYWNhW2NwdV0uZW11bGF0ZWRfdGltZV9iYXNlOwogCiAjaWZkZWYgUFVSUl9ERUJVRwogCQlwcmludGsoS0VSTl9JTkZPICJnZXRfcHVyciBmb3IgY3B1ICglZCkgaGFzIHZhbHVlICglbGQpIFxuIiwKLQkJCWNwdSwgbHBhY2EtPmxwcGFjYS5lbXVsYXRlZF90aW1lX2Jhc2UpOworCQkJY3B1LCBscHBhY2FbY3B1XS5lbXVsYXRlZF90aW1lX2Jhc2UpOwogI2VuZGlmCiAJfQogCXJldHVybiBzdW1fcHVycjsKQEAgLTc5LDEyICs3NywxMSBAQAogCXVuc2lnbmVkIGxvbmcgcG9vbF9pZCwgbHBfaW5kZXg7CiAJaW50IHNoYXJlZCwgZW50aXRsZWRfY2FwYWNpdHksIG1heF9lbnRpdGxlZF9jYXBhY2l0eTsKIAlpbnQgcHJvY2Vzc29ycywgbWF4X3Byb2Nlc3NvcnM7Ci0Jc3RydWN0IHBhY2Ffc3RydWN0ICpscGFjYSA9IGdldF9wYWNhKCk7CiAJdW5zaWduZWQgbG9uZyBwdXJyID0gZ2V0X3B1cnIoKTsKIAogCXNlcV9wcmludGYobSwgIiVzICVzIFxuIiwgTU9EVUxFX05BTUUsIE1PRFVMRV9WRVJTKTsKIAotCXNoYXJlZCA9IChpbnQpKGxwYWNhLT5scHBhY2FfcHRyLT5zaGFyZWRfcHJvYyk7CisJc2hhcmVkID0gKGludCkoZ2V0X2xwcGFjYSgpLT5zaGFyZWRfcHJvYyk7CiAJc2VxX3ByaW50ZihtLCAic2VyaWFsX251bWJlcj0lYyVjJWMlYyVjJWMlY1xuIiwKIAkJICAgZTJhKHhJdEV4dFZwZFBhbmVsLm1mZ0lEWzJdKSwKIAkJICAgZTJhKHhJdEV4dFZwZFBhbmVsLm1mZ0lEWzNdKSwKQEAgLTQwMiw3ICszOTksNyBAQAogCQkJICAgKGhfcmVzb3VyY2UgPj4gMCAqIDgpICYgMHhmZmZmKTsKIAogCQkvKiBwb29sIHJlbGF0ZWQgZW50cmllcyBhcmUgYXByb3ByaWF0ZSBmb3Igc2hhcmVkIGNvbmZpZ3MgKi8KLQkJaWYgKHBhY2FbMF0ubHBwYWNhLnNoYXJlZF9wcm9jKSB7CisJCWlmIChscHBhY2FbMF0uc2hhcmVkX3Byb2MpIHsKIAogCQkJaF9waWMoJnBvb2xfaWRsZV90aW1lLCAmcG9vbF9wcm9jcyk7CiAKQEAgLTQ1MSw3ICs0NDgsNyBAQAogCXNlcV9wcmludGYobSwgInBhcnRpdGlvbl9wb3RlbnRpYWxfcHJvY2Vzc29ycz0lZFxuIiwKIAkJICAgcGFydGl0aW9uX3BvdGVudGlhbF9wcm9jZXNzb3JzKTsKIAotCXNlcV9wcmludGYobSwgInNoYXJlZF9wcm9jZXNzb3JfbW9kZT0lZFxuIiwgcGFjYVswXS5scHBhY2Euc2hhcmVkX3Byb2MpOworCXNlcV9wcmludGYobSwgInNoYXJlZF9wcm9jZXNzb3JfbW9kZT0lZFxuIiwgbHBwYWNhWzBdLnNoYXJlZF9wcm9jKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9scGFybWFwLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2xwYXJtYXAuYwppbmRleCA1YTA1YTc5Li41ODRkMWUzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2xwYXJtYXAuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2xwYXJtYXAuYwpAQCAtNyw3ICs3LDcgQEAKICAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KICNpbmNsdWRlIDxhc20vbW11Lmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9pc2VyaWVzL2xwYXJfbWFwLmg+CiAKIGNvbnN0IHN0cnVjdCBMcGFyTWFwIF9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIudGV4dCIpKSkgeExwYXJNYXAgPSB7CkBAIC0xNiwxNiArMTYsMTYgQEAKIAkueFNlZ21lbnRUYWJsZU9mZnMgPSBTVEFCMF9QQUdFLAogCiAJLnhFc2lkcyA9IHsKLQkJeyAueEtlcm5lbEVzaWQgPSBHRVRfRVNJRChLRVJORUxCQVNFKSwKLQkJICAueEtlcm5lbFZzaWQgPSBLRVJORUxfVlNJRChLRVJORUxCQVNFKSwgfSwKLQkJeyAueEtlcm5lbEVzaWQgPSBHRVRfRVNJRChWTUFMTE9DQkFTRSksCi0JCSAgLnhLZXJuZWxWc2lkID0gS0VSTkVMX1ZTSUQoVk1BTExPQ0JBU0UpLCB9LAorCQl7IC54S2VybmVsRXNpZCA9IEdFVF9FU0lEKFBBR0VfT0ZGU0VUKSwKKwkJICAueEtlcm5lbFZzaWQgPSBLRVJORUxfVlNJRChQQUdFX09GRlNFVCksIH0sCisJCXsgLnhLZXJuZWxFc2lkID0gR0VUX0VTSUQoVk1BTExPQ19TVEFSVCksCisJCSAgLnhLZXJuZWxWc2lkID0gS0VSTkVMX1ZTSUQoVk1BTExPQ19TVEFSVCksIH0sCiAJfSwKIAogCS54UmFuZ2VzID0gewogCQl7IC54UGFnZXMgPSBIdlBhZ2VzVG9NYXAsCiAJCSAgLnhPZmZzZXQgPSAwLAotCQkgIC54VlBOID0gS0VSTkVMX1ZTSUQoS0VSTkVMQkFTRSkgPDwgKFNJRF9TSElGVCAtIEhXX1BBR0VfU0hJRlQpLAorCQkgIC54VlBOID0gS0VSTkVMX1ZTSUQoUEFHRV9PRkZTRVQpIDw8IChTSURfU0hJRlQgLSBIV19QQUdFX1NISUZUKSwKIAkJfSwKIAl9LAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWFjaGluZV9rZXhlYy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxY2ExYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb2RlIHRvIGhhbmRsZSB0cmFuc2l0aW9uIG9mIExpbnV4IGJvb3RpbmcgYW5vdGhlciBrZXJuZWwuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRXJpYyBCaWVkZXJtYW4gIDxlYmllZGVybUB4bWlzc2lvbi5jb20+CisgKiBHYW1lQ3ViZS9wcGMzMiBwb3J0IENvcHlyaWdodCAoQykgMjAwNCBBbGJlcnQgSGVycmFuegorICogQ29weXJpZ2h0IChDKSAyMDA1IElCTSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIFZlcnNpb24gMi4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisKK3ZvaWQgbWFjaGluZV9jcmFzaF9zaHV0ZG93bihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAocHBjX21kLm1hY2hpbmVfY3Jhc2hfc2h1dGRvd24pCisJCXBwY19tZC5tYWNoaW5lX2NyYXNoX3NodXRkb3duKHJlZ3MpOworfQorCisvKgorICogRG8gd2hhdCBldmVyeSBzZXR1cCBpcyBuZWVkZWQgb24gaW1hZ2UgYW5kIHRoZQorICogcmVib290IGNvZGUgYnVmZmVyIHRvIGFsbG93IHVzIHRvIGF2b2lkIGFsbG9jYXRpb25zCisgKiBsYXRlci4KKyAqLworaW50IG1hY2hpbmVfa2V4ZWNfcHJlcGFyZShzdHJ1Y3Qga2ltYWdlICppbWFnZSkKK3sKKwlpZiAocHBjX21kLm1hY2hpbmVfa2V4ZWNfcHJlcGFyZSkKKwkJcmV0dXJuIHBwY19tZC5tYWNoaW5lX2tleGVjX3ByZXBhcmUoaW1hZ2UpOworCS8qCisJICogRmFpbCBpZiBwbGF0Zm9ybSBkb2Vzbid0IHByb3ZpZGUgaXRzIG93biBtYWNoaW5lX2tleGVjX3ByZXBhcmUKKwkgKiBpbXBsZW1lbnRhdGlvbi4KKwkgKi8KKwlyZXR1cm4gLUVOT1NZUzsKK30KKwordm9pZCBtYWNoaW5lX2tleGVjX2NsZWFudXAoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCit7CisJaWYgKHBwY19tZC5tYWNoaW5lX2tleGVjX2NsZWFudXApCisJCXBwY19tZC5tYWNoaW5lX2tleGVjX2NsZWFudXAoaW1hZ2UpOworfQorCisvKgorICogRG8gbm90IGFsbG9jYXRlIG1lbW9yeSAob3IgZmFpbCBpbiBhbnkgd2F5KSBpbiBtYWNoaW5lX2tleGVjKCkuCisgKiBXZSBhcmUgcGFzdCB0aGUgcG9pbnQgb2Ygbm8gcmV0dXJuLCBjb21taXR0ZWQgdG8gcmVib290aW5nIG5vdy4KKyAqLworTk9SRVRfVFlQRSB2b2lkIG1hY2hpbmVfa2V4ZWMoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCit7CisJaWYgKHBwY19tZC5tYWNoaW5lX2tleGVjKQorCQlwcGNfbWQubWFjaGluZV9rZXhlYyhpbWFnZSk7CisJZWxzZSB7CisJCS8qCisJCSAqIEZhbGwgYmFjayB0byBub3JtYWwgcmVzdGFydCBpZiBwbGF0Zm9ybSBkb2Vzbid0IHByb3ZpZGUKKwkJICogaXRzIG93biBrZXhlYyBmdW5jdGlvbiwgYW5kIHVzZXIgaW5zaXN0IHRvIGtleGVjLi4uCisJCSAqLworCQltYWNoaW5lX3Jlc3RhcnQoTlVMTCk7CisJfQorCWZvcig7Oyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL21hY2hpbmVfa2V4ZWNfMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWFjaGluZV9rZXhlY18zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MzYwNjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21hY2hpbmVfa2V4ZWNfMzIuYwpAQCAtMCwwICsxLDY1IEBACisvKgorICogUFBDMzIgY29kZSB0byBoYW5kbGUgTGludXggYm9vdGluZyBhbm90aGVyIGtlcm5lbC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBFcmljIEJpZWRlcm1hbiAgPGViaWVkZXJtQHhtaXNzaW9uLmNvbT4KKyAqIEdhbWVDdWJlL3BwYzMyIHBvcnQgQ29weXJpZ2h0IChDKSAyMDA0IEFsYmVydCBIZXJyYW56CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSUJNIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogVmVyc2lvbiAyLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCit0eXBlZGVmIE5PUkVUX1RZUEUgdm9pZCAoKnJlbG9jYXRlX25ld19rZXJuZWxfdCkoCisJCQkJdW5zaWduZWQgbG9uZyBpbmRpcmVjdGlvbl9wYWdlLAorCQkJCXVuc2lnbmVkIGxvbmcgcmVib290X2NvZGVfYnVmZmVyLAorCQkJCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcmVzcykgQVRUUklCX05PUkVUOworCisvKgorICogVGhpcyBpcyBhIGdlbmVyaWMgbWFjaGluZV9rZXhlYyBmdW5jdGlvbiBzdWl0YWJsZSBhdCBsZWFzdCBmb3IKKyAqIG5vbi1PcGVuRmlybXdhcmUgZW1iZWRkZWQgcGxhdGZvcm1zLgorICogSXQgbWVyZWx5IGNvcGllcyB0aGUgaW1hZ2UgcmVsb2NhdGlvbiBjb2RlIHRvIHRoZSBjb250cm9sIHBhZ2UgYW5kCisgKiBqdW1wcyB0byBpdC4KKyAqIEEgcGxhdGZvcm0gc3BlY2lmaWMgZnVuY3Rpb24gbWF5IGp1c3QgY2FsbCB0aGlzIG9uZS4KKyAqLwordm9pZCBkZWZhdWx0X21hY2hpbmVfa2V4ZWMoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCit7CisJY29uc3QgZXh0ZXJuIHVuc2lnbmVkIGNoYXIgcmVsb2NhdGVfbmV3X2tlcm5lbFtdOworCWNvbnN0IGV4dGVybiB1bnNpZ25lZCBpbnQgcmVsb2NhdGVfbmV3X2tlcm5lbF9zaXplOworCXVuc2lnbmVkIGxvbmcgcGFnZV9saXN0OworCXVuc2lnbmVkIGxvbmcgcmVib290X2NvZGVfYnVmZmVyLCByZWJvb3RfY29kZV9idWZmZXJfcGh5czsKKwlyZWxvY2F0ZV9uZXdfa2VybmVsX3Qgcm5rOworCisJLyogSW50ZXJydXB0cyBhcmVuJ3QgYWNjZXB0YWJsZSB3aGlsZSB3ZSByZWJvb3QgKi8KKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJcGFnZV9saXN0ID0gaW1hZ2UtPmhlYWQ7CisKKwkvKiB3ZSBuZWVkIGJvdGggZWZmZWN0aXZlIGFuZCByZWFsIGFkZHJlc3MgaGVyZSAqLworCXJlYm9vdF9jb2RlX2J1ZmZlciA9CisJCQkodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MoaW1hZ2UtPmNvbnRyb2xfY29kZV9wYWdlKTsKKwlyZWJvb3RfY29kZV9idWZmZXJfcGh5cyA9IHZpcnRfdG9fcGh5cygodm9pZCAqKXJlYm9vdF9jb2RlX2J1ZmZlcik7CisKKwkvKiBjb3B5IG91ciBrZXJuZWwgcmVsb2NhdGlvbiBjb2RlIHRvIHRoZSBjb250cm9sIGNvZGUgcGFnZSAqLworCW1lbWNweSgodm9pZCAqKXJlYm9vdF9jb2RlX2J1ZmZlciwgcmVsb2NhdGVfbmV3X2tlcm5lbCwKKwkJCQkJCXJlbG9jYXRlX25ld19rZXJuZWxfc2l6ZSk7CisKKwlmbHVzaF9pY2FjaGVfcmFuZ2UocmVib290X2NvZGVfYnVmZmVyLAorCQkJCXJlYm9vdF9jb2RlX2J1ZmZlciArIEtFWEVDX0NPTlRST0xfQ09ERV9TSVpFKTsKKwlwcmludGsoS0VSTl9JTkZPICJCeWUhXG4iKTsKKworCS8qIG5vdyBjYWxsIGl0ICovCisJcm5rID0gKHJlbG9jYXRlX25ld19rZXJuZWxfdCkgcmVib290X2NvZGVfYnVmZmVyOworCSgqcm5rKShwYWdlX2xpc3QsIHJlYm9vdF9jb2RlX2J1ZmZlcl9waHlzLCBpbWFnZS0+c3RhcnQpOworfQorCitpbnQgZGVmYXVsdF9tYWNoaW5lX2tleGVjX3ByZXBhcmUoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCit7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL21hY2hpbmVfa2V4ZWNfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWFjaGluZV9rZXhlY182NC5jCmluZGV4IDk3YzUxZTQuLmQ2NDMxNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWFjaGluZV9rZXhlY182NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWFjaGluZV9rZXhlY182NC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIG1hY2hpbmVfa2V4ZWMuYyAtIGhhbmRsZSB0cmFuc2l0aW9uIG9mIExpbnV4IGJvb3RpbmcgYW5vdGhlciBrZXJuZWwKKyAqIFBQQzY0IGNvZGUgdG8gaGFuZGxlIExpbnV4IGJvb3RpbmcgYW5vdGhlciBrZXJuZWwuCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUsIElCTSBDb3JwLgogICoKQEAgLTI4LDIxICsyOCw3IEBACiAKICNkZWZpbmUgSEFTSF9HUk9VUF9TSVpFIDB4ODAJLyogc2l6ZSBvZiBlYWNoIGhhc2ggZ3JvdXAsIGFzbS9tbXUuaCAqLwogCi0vKiBIYXZlIHRoaXMgYXJvdW5kIHRpbGwgd2UgbW92ZSBpdCBpbnRvIGNyYXNoIHNwZWNpZmljIGZpbGUgKi8KLW5vdGVfYnVmX3QgY3Jhc2hfbm90ZXNbTlJfQ1BVU107Ci0KLS8qIER1bW15IGZvciBub3cuIE5vdCBzdXJlIGlmIHdlIG5lZWQgdG8gaGF2ZSBhIGNyYXNoIHNodXRkb3duIGluIGhlcmUKLSAqIGFuZCBpZiB3aGF0IGl0IHdpbGwgYWNoaWV2ZS4gTGV0dGluZyBpdCBiZSBub3cgdG8gY29tcGlsZSB0aGUgY29kZQotICogaW4gZ2VuZXJpYyBrZXhlYyBlbnZpcm9ubWVudAotICovCi12b2lkIG1hY2hpbmVfY3Jhc2hfc2h1dGRvd24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JLyogZG8gbm90aGluZyByaWdodCBub3cgKi8KLQkvKiBzbXBfcmVsYXNlX2NwdXMoKSBpZiB3ZSB3YW50IHNtcCBvbiBwYW5pYyBrZXJuZWwgKi8KLQkvKiBjcHVfaXJxX2Rvd24gdG8gaXNvbGF0ZSB1cyB1bnRpbCB3ZSBhcmUgcmVhZHkgKi8KLX0KLQotaW50IG1hY2hpbmVfa2V4ZWNfcHJlcGFyZShzdHJ1Y3Qga2ltYWdlICppbWFnZSkKK2ludCBkZWZhdWx0X21hY2hpbmVfa2V4ZWNfcHJlcGFyZShzdHJ1Y3Qga2ltYWdlICppbWFnZSkKIHsKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGJlZ2luLCBlbmQ7CS8qIGxpbWl0cyBvZiBzZWdtZW50ICovCkBAIC0xMTEsMTEgKzk3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBtYWNoaW5lX2tleGVjX2NsZWFudXAoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCi17Ci0JLyogd2UgZG8gbm90aGluZyBpbiBwcmVwYXJlIHRoYXQgbmVlZHMgdG8gYmUgdW5kb25lICovCi19Ci0KICNkZWZpbmUgSU5EX0ZMQUdTIChJTkRfREVTVElOQVRJT04gfCBJTkRfSU5ESVJFQ1RJT04gfCBJTkRfRE9ORSB8IElORF9TT1VSQ0UpCiAKIHN0YXRpYyB2b2lkIGNvcHlfc2VnbWVudHModW5zaWduZWQgbG9uZyBpbmQpCkBAIC0xNzIsOSArMTUzLDggQEAKIAkgKiBpbmNsdWRpbmcgb25lcyB0aGF0IHdlcmUgaW4gcGxhY2Ugb24gdGhlIG9yaWdpbmFsIGNvcHkKIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbnJfc2VnbWVudHM7IGkrKykKLQkJZmx1c2hfaWNhY2hlX3JhbmdlKHJhbmdlc1tpXS5tZW0gKyBLRVJORUxCQVNFLAotCQkJCXJhbmdlc1tpXS5tZW0gKyBLRVJORUxCQVNFICsKLQkJCQlyYW5nZXNbaV0ubWVtc3opOworCQlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpX192YShyYW5nZXNbaV0ubWVtKSwKKwkJCSh1bnNpZ25lZCBsb25nKV9fdmEocmFuZ2VzW2ldLm1lbSArIHJhbmdlc1tpXS5tZW1zeikpOwogfQogCiAjaWZkZWYgQ09ORklHX1NNUApAQCAtMjgzLDEzICsyNjMsMjAgQEAKIAkJCQkJdm9pZCAoKmNsZWFyX2FsbCkodm9pZCkpIEFUVFJJQl9OT1JFVDsKIAogLyogdG9vIGxhdGUgdG8gZmFpbCBoZXJlICovCi12b2lkIG1hY2hpbmVfa2V4ZWMoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCit2b2lkIGRlZmF1bHRfbWFjaGluZV9rZXhlYyhzdHJ1Y3Qga2ltYWdlICppbWFnZSkKIHsKLQogCS8qIHByZXBhcmUgY29udHJvbCBjb2RlIGlmIGFueSAqLwogCi0JLyogc2h1dGRvd24gb3RoZXIgY3B1cyBpbnRvIG91ciB3YWl0IGxvb3AgYW5kIHF1aWVzY2UgaW50ZXJydXB0cyAqLwotCWtleGVjX3ByZXBhcmVfY3B1cygpOworCS8qCisgICAgICAgICogSWYgdGhlIGtleGVjIGJvb3QgaXMgdGhlIG5vcm1hbCBvbmUsIG5lZWQgdG8gc2h1dGRvd24gb3RoZXIgY3B1cworICAgICAgICAqIGludG8gb3VyIHdhaXQgbG9vcCBhbmQgcXVpZXNjZSBpbnRlcnJ1cHRzLgorICAgICAgICAqIE90aGVyd2lzZSwgaW4gdGhlIGNhc2Ugb2YgY3Jhc2hlZCBtb2RlIChjcmFzaGluZ19jcHUgPj0gMCksCisgICAgICAgICogc3RvcHBpbmcgb3RoZXIgQ1BVcyBhbmQgY29sbGVjdGluZyB0aGVpciBwdF9yZWdzIGlzIGRvbmUgYmVmb3JlCisgICAgICAgICogdXNpbmcgZGVidWdnZXIgSVBJLgorICAgICAgICAqLworCisgICAgICAgaWYgKGNyYXNoaW5nX2NwdSA9PSAtMSkKKyAgICAgICAgICAgICAgIGtleGVjX3ByZXBhcmVfY3B1cygpOwogCiAJLyogc3dpdGNoIHRvIGEgc3RhdGljbHkgYWxsb2NhdGVkIHN0YWNrLiAgQmFzZWQgb24gaXJxIHN0YWNrIGNvZGUuCiAJICogWFhYOiB0aGUgdGFzayBzdHJ1Y3Qgd2lsbCBsaWtlbHkgYmUgaW52YWxpZCBvbmNlIHdlIGRvIHRoZSBjb3B5IQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUwppbmRleCA2MjRhOTgzLi5iZTk4MjAyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUwpAQCAtNSw2ICs1LDEwIEBACiAgKiBMYXJnZWx5IHJld3JpdHRlbiBieSBDb3J0IERvdWdhbiAoY29ydEBjcy5ubXQuZWR1KQogICogYW5kIFBhdWwgTWFja2VycmFzLgogICoKKyAqIGtleGVjIGJpdHM6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBFcmljIEJpZWRlcm1hbiAgPGViaWVkZXJtQHhtaXNzaW9uLmNvbT4KKyAqIEdhbWVDdWJlL3BwYzMyIHBvcnQgQ29weXJpZ2h0IChDKSAyMDA0IEFsYmVydCBIZXJyYW56CisgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgpAQCAtMjQsNiArMjgsOCBAQAogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9rZXhlYy5oPgogCiAJLnRleHQKIApAQCAtNjIsNyArNjgsNyBAQAogCW1mbHIJcjAKIAlibAkxZgogMToJbWZscglyMwotCUxPQURBRERSKHI0LDFiKQorCUxPQURfUkVHX0lNTUVESUFURShyNCwxYikKIAlzdWJmCXIzLHI0LHIzCiAJbXRscglyMAogCWJscgpAQCAtNzQsNyArODAsNyBAQAogCW1mbHIJcjAKIAlibAkxZgogMToJbWZscglyNQotCUxPQURBRERSKHI0LDFiKQorCUxPQURfUkVHX0lNTUVESUFURShyNCwxYikKIAlzdWJmCXI1LHI0LHI1CiAJYWRkCXIzLHIzLHI1CiAJbXRscglyMApAQCAtMTAwNiwzICsxMDEyLDExMCBAQAogICovCiBfR0xPQkFMKF9fbWFpbikKIAlibHIKKworI2lmZGVmIENPTkZJR19LRVhFQworCS8qCisJICogTXVzdCBiZSByZWxvY2F0YWJsZSBQSUMgY29kZSBjYWxsYWJsZSBhcyBhIEMgZnVuY3Rpb24uCisJICovCisJLmdsb2JsIHJlbG9jYXRlX25ld19rZXJuZWwKK3JlbG9jYXRlX25ld19rZXJuZWw6CisJLyogcjMgPSBwYWdlX2xpc3QgICAqLworCS8qIHI0ID0gcmVib290X2NvZGVfYnVmZmVyICovCisJLyogcjUgPSBzdGFydF9hZGRyZXNzICAgICAgKi8KKworCWxpCXIwLCAwCisKKwkvKgorCSAqIFNldCBNYWNoaW5lIFN0YXR1cyBSZWdpc3RlciB0byBhIGtub3duIHN0YXR1cywKKwkgKiBzd2l0Y2ggdGhlIE1NVSBvZmYgYW5kIGp1bXAgdG8gMTogaW4gYSBzaW5nbGUgc3RlcC4KKwkgKi8KKworCW1yCXI4LCByMAorCW9yaSAgICAgcjgsIHI4LCBNU1JfUkl8TVNSX01FCisJbXRzcHIJU1BSTl9TUlIxLCByOAorCWFkZGkJcjgsIHI0LCAxZiAtIHJlbG9jYXRlX25ld19rZXJuZWwKKwltdHNwcglTUFJOX1NSUjAsIHI4CisJc3luYworCXJmaQorCisxOgorCS8qIGZyb20gdGhpcyBwb2ludCBhZGRyZXNzIHRyYW5zbGF0aW9uIGlzIHR1cm5lZCBvZmYgKi8KKwkvKiBhbmQgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgKi8KKworCS8qIHNldCBhIG5ldyBzdGFjayBhdCB0aGUgYm90dG9tIG9mIG91ciBwYWdlLi4uICovCisJLyogKG5vdCByZWFsbHkgbmVlZGVkIG5vdykgKi8KKwlhZGRpCXIxLCByNCwgS0VYRUNfQ09OVFJPTF9DT0RFX1NJWkUgLSA4IC8qIGZvciBMUiBTYXZlK0JhY2sgQ2hhaW4gKi8KKwlzdHcJcjAsIDAocjEpCisKKwkvKiBEbyB0aGUgY29waWVzICovCisJbGkJcjYsIDAgLyogY2hlY2tzdW0gKi8KKwltcglyMCwgcjMKKwliCTFmCisKKzA6CS8qIHRvcCwgcmVhZCBhbm90aGVyIHdvcmQgZm9yIHRoZSBpbmRpcmVjdGlvbiBwYWdlICovCisJbHd6dQlyMCwgNChyMykKKworMToKKwkvKiBpcyBpdCBhIGRlc3RpbmF0aW9uIHBhZ2U/IChyOCkgKi8KKwlybHdpbm0uCXI3LCByMCwgMCwgMzEsIDMxIC8qIElORF9ERVNUSU5BVElPTiAoMTw8MCkgKi8KKwliZXEJMmYKKworCXJsd2lubQlyOCwgcjAsIDAsIDAsIDE5IC8qIGNsZWFyIGtleGVjIGZsYWdzLCBwYWdlIGFsaWduICovCisJYgkwYgorCisyOgkvKiBpcyBpdCBhbiBpbmRpcmVjdGlvbiBwYWdlPyAocjMpICovCisJcmx3aW5tLglyNywgcjAsIDAsIDMwLCAzMCAvKiBJTkRfSU5ESVJFQ1RJT04gKDE8PDEpICovCisJYmVxCTJmCisKKwlybHdpbm0JcjMsIHIwLCAwLCAwLCAxOSAvKiBjbGVhciBrZXhlYyBmbGFncywgcGFnZSBhbGlnbiAqLworCXN1YmkJcjMsIHIzLCA0CisJYgkwYgorCisyOgkvKiBhcmUgd2UgZG9uZT8gKi8KKwlybHdpbm0uCXI3LCByMCwgMCwgMjksIDI5IC8qIElORF9ET05FICgxPDwyKSAqLworCWJlcQkyZgorCWIJM2YKKworMjoJLyogaXMgaXQgYSBzb3VyY2UgcGFnZT8gKHI5KSAqLworCXJsd2lubS4JcjcsIHIwLCAwLCAyOCwgMjggLyogSU5EX1NPVVJDRSAoMTw8MykgKi8KKwliZXEJMGIKKworCXJsd2lubQlyOSwgcjAsIDAsIDAsIDE5IC8qIGNsZWFyIGtleGVjIGZsYWdzLCBwYWdlIGFsaWduICovCisKKwlsaQlyNywgUEFHRV9TSVpFIC8gNAorCW10Y3RyICAgcjcKKwlzdWJpICAgIHI5LCByOSwgNAorCXN1YmkgICAgcjgsIHI4LCA0Cis5OgorCWx3enUgICAgcjAsIDQocjkpICAvKiBkbyB0aGUgY29weSAqLworCXhvcglyNiwgcjYsIHIwCisJc3R3dSAgICByMCwgNChyOCkKKwlkY2JzdAkwLCByOAorCXN5bmMKKwlpY2JpCTAsIHI4CisJYmRueiAgICA5YgorCisJYWRkaSAgICByOSwgcjksIDQKKwlhZGRpICAgIHI4LCByOCwgNAorCWIJMGIKKworMzoKKworCS8qIFRvIGJlIGNlcnRhaW4gb2YgYXZvaWRpbmcgcHJvYmxlbXMgd2l0aCBzZWxmLW1vZGlmeWluZyBjb2RlCisJICogZXhlY3V0ZSBhIHNlcmlhbGl6aW5nIGluc3RydWN0aW9uIGhlcmUuCisJICovCisJaXN5bmMKKwlzeW5jCisKKwkvKiBqdW1wIHRvIHRoZSBlbnRyeSBwb2ludCwgdXN1YWxseSB0aGUgc2V0dXAgcm91dGluZSAqLworCW10bHIJcjUKKwlibHJsCisKKzE6CWIJMWIKKworcmVsb2NhdGVfbmV3X2tlcm5lbF9lbmQ6CisKKwkuZ2xvYmwgcmVsb2NhdGVfbmV3X2tlcm5lbF9zaXplCityZWxvY2F0ZV9uZXdfa2VybmVsX3NpemU6CisJLmxvbmcgcmVsb2NhdGVfbmV3X2tlcm5lbF9lbmQgLSByZWxvY2F0ZV9uZXdfa2VybmVsCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY182NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKaW5kZXggYWU0OGEwMC4uMjc3OGNjZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKQEAgLTM5LDcgKzM5LDcgQEAKIAltZmxyCXIwCiAJYmwJMWYKIDE6CW1mbHIJcjMKLQlMT0FEQUREUihyNCwxYikKKwlMT0FEX1JFR19JTU1FRElBVEUocjQsMWIpCiAJc3ViZglyMyxyNCxyMwogCW10bHIJcjAKIAlibHIKQEAgLTUxLDcgKzUxLDcgQEAKIAltZmxyCXIwCiAJYmwJMWYKIDE6CW1mbHIJcjUKLQlMT0FEQUREUihyNCwxYikKKwlMT0FEX1JFR19JTU1FRElBVEUocjQsMWIpCiAJc3ViZglyNSxyNCxyNQogCWFkZAlyMyxyMyxyNQogCW10bHIJcjAKQEAgLTQ5OCwxNSArNDk4LDE1IEBACiAgKi8KIF9HTE9CQUwoZG9fY3B1X2Z0cl9maXh1cHMpCiAJLyogR2V0IENQVSAwIGZlYXR1cmVzICovCi0JTE9BREFERFIocjYsY3VyX2NwdV9zcGVjKQorCUxPQURfUkVHX0lNTUVESUFURShyNixjdXJfY3B1X3NwZWMpCiAJc3ViCXI2LHI2LHIzCiAJbGQJcjQsMChyNikKIAlzdWIJcjQscjQscjMKIAlsZAlyNCxDUFVfU1BFQ19GRUFUVVJFUyhyNCkKIAkvKiBHZXQgdGhlIGZpeHVwIHRhYmxlICovCi0JTE9BREFERFIocjYsX19zdGFydF9fX2Z0cl9maXh1cCkKKwlMT0FEX1JFR19JTU1FRElBVEUocjYsX19zdGFydF9fX2Z0cl9maXh1cCkKIAlzdWIJcjYscjYscjMKLQlMT0FEQUREUihyNyxfX3N0b3BfX19mdHJfZml4dXApCisJTE9BRF9SRUdfSU1NRURJQVRFKHI3LF9fc3RvcF9fX2Z0cl9maXh1cCkKIAlzdWIJcjcscjcscjMKIAkvKiBEbyB0aGUgZml4dXAgKi8KIDE6CWNtcGxkCXI2LHI3CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL252cmFtXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL252cmFtXzY0LmMKaW5kZXggYzBmY2QyOS4uZmQ3ZGI4ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9udnJhbV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbnZyYW1fNjQuYwpAQCAtODAsODAgKzgwLDc0IEBACiBzdGF0aWMgc3NpemVfdCBkZXZfbnZyYW1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3NpemVfdCBsZW47Ci0JY2hhciAqdG1wX2J1ZmZlcjsKLQlpbnQgc2l6ZTsKKwlzc2l6ZV90IHJldDsKKwljaGFyICp0bXAgPSBOVUxMOworCXNzaXplX3Qgc2l6ZTsKIAotCWlmIChwcGNfbWQubnZyYW1fc2l6ZSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXQgPSAtRU5PREVWOworCWlmICghcHBjX21kLm52cmFtX3NpemUpCisJCWdvdG8gb3V0OworCisJcmV0ID0gMDsKIAlzaXplID0gcHBjX21kLm52cmFtX3NpemUoKTsKKwlpZiAoKnBwb3MgPj0gc2l6ZSB8fCBzaXplIDwgMCkKKwkJZ290byBvdXQ7CiAKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAoKnBwb3MgPj0gc2l6ZSkKLQkJcmV0dXJuIDA7Ci0JaWYgKGNvdW50ID4gc2l6ZSkgCi0JCWNvdW50ID0gc2l6ZTsKKwljb3VudCA9IG1pbl90KHNpemVfdCwgY291bnQsIHNpemUgLSAqcHBvcyk7CisJY291bnQgPSBtaW4oY291bnQsIFBBR0VfU0laRSk7CiAKLQl0bXBfYnVmZmVyID0gKGNoYXIgKikga21hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0bXBfYnVmZmVyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZGV2X3JlYWRfbnZyYW06IGttYWxsb2MgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCXJldCA9IC1FTk9NRU07CisJdG1wID0ga21hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0bXApCisJCWdvdG8gb3V0OwogCi0JbGVuID0gcHBjX21kLm52cmFtX3JlYWQodG1wX2J1ZmZlciwgY291bnQsIHBwb3MpOwotCWlmICgobG9uZylsZW4gPD0gMCkgewotCQlrZnJlZSh0bXBfYnVmZmVyKTsKLQkJcmV0dXJuIGxlbjsKLQl9CisJcmV0ID0gcHBjX21kLm52cmFtX3JlYWQodG1wLCBjb3VudCwgcHBvcyk7CisJaWYgKHJldCA8PSAwKQorCQlnb3RvIG91dDsKIAotCWlmIChjb3B5X3RvX3VzZXIoYnVmLCB0bXBfYnVmZmVyLCBsZW4pKSB7Ci0JCWtmcmVlKHRtcF9idWZmZXIpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9CisJaWYgKGNvcHlfdG9fdXNlcihidWYsIHRtcCwgcmV0KSkKKwkJcmV0ID0gLUVGQVVMVDsKIAotCWtmcmVlKHRtcF9idWZmZXIpOwotCXJldHVybiBsZW47CitvdXQ6CisJa2ZyZWUodG1wKTsKKwlyZXR1cm4gcmV0OwogCiB9CiAKIHN0YXRpYyBzc2l6ZV90IGRldl9udnJhbV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzc2l6ZV90IGxlbjsKLQljaGFyICogdG1wX2J1ZmZlcjsKLQlpbnQgc2l6ZTsKKwlzc2l6ZV90IHJldDsKKwljaGFyICp0bXAgPSBOVUxMOworCXNzaXplX3Qgc2l6ZTsKIAotCWlmIChwcGNfbWQubnZyYW1fc2l6ZSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXQgPSAtRU5PREVWOworCWlmICghcHBjX21kLm52cmFtX3NpemUpCisJCWdvdG8gb3V0OworCisJcmV0ID0gMDsKIAlzaXplID0gcHBjX21kLm52cmFtX3NpemUoKTsKKwlpZiAoKnBwb3MgPj0gc2l6ZSB8fCBzaXplIDwgMCkKKwkJZ290byBvdXQ7CiAKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmICgqcHBvcyA+PSBzaXplKQotCQlyZXR1cm4gMDsKLQlpZiAoY291bnQgPiBzaXplKQotCQljb3VudCA9IHNpemU7CisJY291bnQgPSBtaW5fdChzaXplX3QsIGNvdW50LCBzaXplIC0gKnBwb3MpOworCWNvdW50ID0gbWluKGNvdW50LCBQQUdFX1NJWkUpOwogCi0JdG1wX2J1ZmZlciA9IChjaGFyICopIGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOwotCWlmICghdG1wX2J1ZmZlcikgewotCQlwcmludGsoS0VSTl9FUlIgImRldl9udnJhbV93cml0ZToga21hbGxvYyBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JCi0JaWYgKGNvcHlfZnJvbV91c2VyKHRtcF9idWZmZXIsIGJ1ZiwgY291bnQpKSB7Ci0JCWtmcmVlKHRtcF9idWZmZXIpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9CisJcmV0ID0gLUVOT01FTTsKKwl0bXAgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRtcCkKKwkJZ290byBvdXQ7CiAKLQlsZW4gPSBwcGNfbWQubnZyYW1fd3JpdGUodG1wX2J1ZmZlciwgY291bnQsIHBwb3MpOwotCWlmICgobG9uZylsZW4gPD0gMCkgewotCQlrZnJlZSh0bXBfYnVmZmVyKTsKLQkJcmV0dXJuIGxlbjsKLQl9CisJcmV0ID0gLUVGQVVMVDsKKwlpZiAoY29weV9mcm9tX3VzZXIodG1wLCBidWYsIGNvdW50KSkKKwkJZ290byBvdXQ7CiAKLQlrZnJlZSh0bXBfYnVmZmVyKTsKLQlyZXR1cm4gbGVuOworCXJldCA9IHBwY19tZC5udnJhbV93cml0ZSh0bXAsIGNvdW50LCBwcG9zKTsKKworb3V0OgorCWtmcmVlKHRtcCk7CisJcmV0dXJuIHJldDsKKwogfQogCiBzdGF0aWMgaW50IGRldl9udnJhbV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfZGV2aWNlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL29mX2RldmljZS5jCmluZGV4IDcwNjVlNDAuLjIyZDgzZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfZGV2aWNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9kZXZpY2UuYwpAQCAtMTMyLDYgKzEzMiw4IEBACiBzdHJ1Y3QgYnVzX3R5cGUgb2ZfcGxhdGZvcm1fYnVzX3R5cGUgPSB7CiAgICAgICAgLm5hbWUJPSAib2ZfcGxhdGZvcm0iLAogICAgICAgIC5tYXRjaAk9IG9mX3BsYXRmb3JtX2J1c19tYXRjaCwKKyAgICAgICAucHJvYmUJPSBvZl9kZXZpY2VfcHJvYmUsCisgICAgICAgLnJlbW92ZQk9IG9mX2RldmljZV9yZW1vdmUsCiAgICAgICAgLnN1c3BlbmQJPSBvZl9kZXZpY2Vfc3VzcGVuZCwKICAgICAgICAucmVzdW1lCT0gb2ZfZGV2aWNlX3Jlc3VtZSwKIH07CkBAIC0xNTAsOCArMTUyLDYgQEAKIAkvKiBpbml0aWFsaXplIGNvbW1vbiBkcml2ZXIgZmllbGRzICovCiAJZHJ2LT5kcml2ZXIubmFtZSA9IGRydi0+bmFtZTsKIAlkcnYtPmRyaXZlci5idXMgPSAmb2ZfcGxhdGZvcm1fYnVzX3R5cGU7Ci0JZHJ2LT5kcml2ZXIucHJvYmUgPSBvZl9kZXZpY2VfcHJvYmU7Ci0JZHJ2LT5kcml2ZXIucmVtb3ZlID0gb2ZfZGV2aWNlX3JlbW92ZTsKIAogCS8qIHJlZ2lzdGVyIHdpdGggY29yZSAqLwogCWNvdW50ID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BhY2EuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGFjYS5jCmluZGV4IGE3YjY4ZjkuLjVkMWI3MDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGFjYS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGFjYS5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vbHBwYWNhLmg+CiAjaW5jbHVkZSA8YXNtL2lzZXJpZXMvaXRfbHBfcXVldWUuaD4KKyNpbmNsdWRlIDxhc20vaXNlcmllcy9pdF9scF9yZWdfc2F2ZS5oPgogI2luY2x1ZGUgPGFzbS9wYWNhLmg+CiAKIApAQCAtMjQsMTAgKzI1LDMxIEBACiAgKiBmaWVsZCBjb3JyZWN0bHkgKi8KIGV4dGVybiB1bnNpZ25lZCBsb25nIF9fdG9jX3N0YXJ0OwogCisvKgorICogaVNlcmllcyBzdHJ1Y3R1cmUgd2hpY2ggdGhlIGh5cGVydmlzb3Iga25vd3MgYWJvdXQgLSB0aGlzIHN0cnVjdHVyZQorICogc2hvdWxkIG5vdCBjcm9zcyBhIHBhZ2UgYm91bmRhcnkuICBUaGUgdnBhX2luaXQvcmVnaXN0ZXJfdnBhIGNhbGwKKyAqIGlzIG5vdyBrbm93biB0byBmYWlsIGlmIHRoZSBscHBhY2Egc3RydWN0dXJlIGNyb3NzZXMgYSBwYWdlCisgKiBib3VuZGFyeS4gIFRoZSBscHBhY2EgaXMgYWxzbyB1c2VkIG9uIFBPV0VSNSBwU2VyaWVzIGJveGVzLiAgVGhlCisgKiBscHBhY2EgaXMgNjQwIGJ5dGVzIGxvbmcsIGFuZCBjYW5ub3QgcmVhZGlseSBjaGFuZ2Ugc2luY2UgdGhlCisgKiBoeXBlcnZpc29yIGtub3dzIGl0cyBsYXlvdXQsIHNvIGEgMWtCIGFsaWdubWVudCB3aWxsIHN1ZmZpY2UgdG8KKyAqIGVuc3VyZSB0aGF0IGl0IGRvZXNuJ3QgY3Jvc3MgYSBwYWdlIGJvdW5kYXJ5LgorICovCitzdHJ1Y3QgbHBwYWNhIGxwcGFjYVtdID0geworCVswIC4uLiAoTlJfQ1BVUy0xKV0gPSB7CisJCS5kZXNjID0gMHhkMzk3ZDc4MSwJLyogIkxwUGEiICovCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBscHBhY2EpLAorCQkuZHluX3Byb2Nfc3RhdHVzID0gMiwKKwkJLmRlY3JfdmFsID0gMHgwMGZmMDAwMCwKKwkJLmZwcmVnc19pbl91c2UgPSAxLAorCQkuZW5kX29mX3F1YW50dW0gPSAweGZmZmZmZmZmZmZmZmZmZmZ1bCwKKwkJLnNsYl9jb3VudCA9IDY0LAorCQkudm14cmVnc19pbl91c2UgPSAwLAorCX0sCit9OworCiAvKiBUaGUgUGFjYSBpcyBhbiBhcnJheSB3aXRoIG9uZSBlbnRyeSBwZXIgcHJvY2Vzc29yLiAgRWFjaCBjb250YWlucyBhbgogICogbHBwYWNhLCB3aGljaCBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gc2hhcmVkIGJldHdlZW4gdGhlCi0gKiBoeXBlcnZpc29yIGFuZCBMaW51eC4gIEVhY2ggYWxzbyBjb250YWlucyBhbiBJdExwUmVnU2F2ZSBhcmVhIHdoaWNoCi0gKiBpcyB1c2VkIGJ5IHRoZSBoeXBlcnZpc29yIHRvIHNhdmUgcmVnaXN0ZXJzLgorICogaHlwZXJ2aXNvciBhbmQgTGludXguCiAgKiBPbiBzeXN0ZW1zIHdpdGggaGFyZHdhcmUgbXVsdGktdGhyZWFkaW5nLCB0aGVyZSBhcmUgdHdvIHRocmVhZHMKICAqIHBlciBwcm9jZXNzb3IuICBUaGUgUGFjYSBhcnJheSBtdXN0IGNvbnRhaW4gYW4gZW50cnkgZm9yIGVhY2ggdGhyZWFkLgogICogVGhlIFZQRCBBcmVhcyB3aWxsIGdpdmUgYSBtYXggbG9naWNhbCBwcm9jZXNzb3JzID0gMiAqIG1heCBwaHlzaWNhbApAQCAtMzUsMzMgKzU3LDE4IEBACiAgKiBwcm9jZXNzb3IgKG5vdCB0aHJlYWQpLgogICovCiAjZGVmaW5lIFBBQ0FfSU5JVF9DT01NT04obnVtYmVyLCBzdGFydCwgYXNyciwgYXNydikJCQkgICAgXAorCS5scHBhY2FfcHRyID0gJmxwcGFjYVtudW1iZXJdLAkJCQkJICAgIFwKIAkubG9ja190b2tlbiA9IDB4ODAwMCwJCQkJCQkgICAgXAogCS5wYWNhX2luZGV4ID0gKG51bWJlciksCQkvKiBQYWNhIEluZGV4ICovCQkgICAgXAotCS5kZWZhdWx0X2RlY3IgPSAweDAwZmYwMDAwLAkvKiBJbml0aWFsIERlY3IgKi8JCSAgICBcCiAJLmtlcm5lbF90b2MgPSAodW5zaWduZWQgbG9uZykoJl9fdG9jX3N0YXJ0KSArIDB4ODAwMFVMLAkJICAgIFwKIAkuc3RhYl9yZWFsID0gKGFzcnIpLCAJCS8qIFJlYWwgcG9pbnRlciB0byBzZWdtZW50IHRhYmxlICovIFwKIAkuc3RhYl9hZGRyID0gKGFzcnYpLAkJLyogVmlydCBwb2ludGVyIHRvIHNlZ21lbnQgdGFibGUgKi8gXAogCS5jcHVfc3RhcnQgPSAoc3RhcnQpLAkJLyogUHJvY2Vzc29yIHN0YXJ0ICovCQkgICAgXAotCS5od19jcHVfaWQgPSAweGZmZmYsCQkJCQkJICAgIFwKLQkubHBwYWNhID0gewkJCQkJCQkgICAgXAotCQkuZGVzYyA9IDB4ZDM5N2Q3ODEsCS8qICJMcFBhIiAqLwkJCSAgICBcCi0JCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBscHBhY2EpLAkJCQkgICAgXAotCQkuZHluX3Byb2Nfc3RhdHVzID0gMiwJCQkJCSAgICBcCi0JCS5kZWNyX3ZhbCA9IDB4MDBmZjAwMDAsCQkJCQkgICAgXAotCQkuZnByZWdzX2luX3VzZSA9IDEsCQkJCQkgICAgXAotCQkuZW5kX29mX3F1YW50dW0gPSAweGZmZmZmZmZmZmZmZmZmZmZ1bCwJCQkgICAgXAotCQkuc2xiX2NvdW50ID0gNjQsCQkJCQkgICAgXAotCQkudm14cmVnc19pbl91c2UgPSAwLAkJCQkJICAgIFwKLQl9LAkJCQkJCQkJICAgIFwKKwkuaHdfY3B1X2lkID0gMHhmZmZmLAogCiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCiAjZGVmaW5lIFBBQ0FfSU5JVF9JU0VSSUVTKG51bWJlcikJCQkJCSAgICBcCi0JLmxwcGFjYV9wdHIgPSAmcGFjYVtudW1iZXJdLmxwcGFjYSwJCQkJICAgIFwKLQkucmVnX3NhdmVfcHRyID0gJnBhY2FbbnVtYmVyXS5yZWdfc2F2ZSwJCQkJICAgIFwKLQkucmVnX3NhdmUgPSB7CQkJCQkJCSAgICBcCi0JCS54RGVzYyA9IDB4ZDM5N2Q5ZTIsCS8qICJMcFJTIiAqLwkJCSAgICBcCi0JCS54U2l6ZSA9IHNpemVvZihzdHJ1Y3QgSXRMcFJlZ1NhdmUpCQkJICAgIFwKLQl9CisJLnJlZ19zYXZlX3B0ciA9ICZpc2VyaWVzX3JlZ19zYXZlW251bWJlcl0sCiAKICNkZWZpbmUgUEFDQV9JTklUKG51bWJlcikJCQkJCQkgICAgXAogewkJCQkJCQkJCSAgICBcCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV8zMi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDRjODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYwpAQCAtMCwwICsxLDE4OTcgQEAKKy8qCisgKiBDb21tb24gcG1hYy9wcmVwL2NocnAgcGNpIHJvdXRpbmVzLiAtLSBDb3J0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKworI3VuZGVmIERFQlVHCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEQkcoeC4uLikgcHJpbnRrKHgpCisjZWxzZQorI2RlZmluZSBEQkcoeC4uLikKKyNlbmRpZgorCit1bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlICAgICA9IDA7Cit1bnNpZ25lZCBsb25nIGlzYV9tZW1fYmFzZSAgICA9IDA7Cit1bnNpZ25lZCBsb25nIHBjaV9kcmFtX29mZnNldCA9IDA7CitpbnQgcGNpYmlvc19hc3NpZ25fYnVzX29mZnNldCA9IDE7CisKK3ZvaWQgcGNpYmlvc19tYWtlX09GX2J1c19tYXAodm9pZCk7CisKK3N0YXRpYyBpbnQgcGNpX3JlbG9jYXRlX2JyaWRnZV9yZXNvdXJjZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBpbnQgaSk7CitzdGF0aWMgaW50IHByb2JlX3Jlc291cmNlKHN0cnVjdCBwY2lfYnVzICpwYXJlbnQsIHN0cnVjdCByZXNvdXJjZSAqcHIsCisJCQkgIHN0cnVjdCByZXNvdXJjZSAqcmVzLCBzdHJ1Y3QgcmVzb3VyY2UgKipjb25mbGljdCk7CitzdGF0aWMgdm9pZCB1cGRhdGVfYnJpZGdlX2Jhc2Uoc3RydWN0IHBjaV9idXMgKmJ1cywgaW50IGkpOworc3RhdGljIHZvaWQgcGNpYmlvc19maXh1cF9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYqIGRldik7CitzdGF0aWMgdm9pZCBmaXh1cF9icm9rZW5fcGNuZXQzMihzdHJ1Y3QgcGNpX2RldiogZGV2KTsKK3N0YXRpYyBpbnQgcmVwYXJlbnRfcmVzb3VyY2VzKHN0cnVjdCByZXNvdXJjZSAqcGFyZW50LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcyk7CitzdGF0aWMgdm9pZCBmaXh1cF9jcGM3MTBfcGNpNjQoc3RydWN0IHBjaV9kZXYqIGRldik7CisjaWZkZWYgQ09ORklHX1BQQ19PRgorc3RhdGljIHU4KiBwY2lfdG9fT0ZfYnVzX21hcDsKKyNlbmRpZgorCisvKiBCeSBkZWZhdWx0LCB3ZSBkb24ndCByZS1hc3NpZ24gYnVzIG51bWJlcnMuIFdlIGRvIHRoaXMgb25seSBvbgorICogc29tZSBwbWFjcworICovCitpbnQgcGNpX2Fzc2lnbl9hbGxfYnVzZXM7CisKK3N0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZV9oZWFkOworc3RydWN0IHBjaV9jb250cm9sbGVyKiogaG9zZV90YWlsID0gJmhvc2VfaGVhZDsKKworc3RhdGljIGludCBwY2lfYnVzX2NvdW50OworCitzdGF0aWMgdm9pZAorZml4dXBfYnJva2VuX3BjbmV0MzIoc3RydWN0IHBjaV9kZXYqIGRldikKK3sKKwlpZiAoKGRldi0+Y2xhc3M+PjggPT0gUENJX0NMQVNTX05FVFdPUktfRVRIRVJORVQpKSB7CisJCWRldi0+dmVuZG9yID0gUENJX1ZFTkRPUl9JRF9BTUQ7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9WRU5ET1JfSUQsIFBDSV9WRU5ET1JfSURfQU1EKTsKKwl9Cit9CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9UUklERU5ULAlQQ0lfQU5ZX0lELAkJCWZpeHVwX2Jyb2tlbl9wY25ldDMyKTsKKworc3RhdGljIHZvaWQKK2ZpeHVwX2NwYzcxMF9wY2k2NChzdHJ1Y3QgcGNpX2RldiogZGV2KQoreworCS8qIEhpZGUgdGhlIFBDSTY0IEJBUnMgZnJvbSB0aGUga2VybmVsIGFzIHRoZWlyIGNvbnRlbnQgZG9lc24ndAorCSAqIGZpdCB3ZWxsIGluIHRoZSByZXNvdXJjZSBtYW5hZ2VtZW50CisJICovCisJZGV2LT5yZXNvdXJjZVswXS5zdGFydCA9IGRldi0+cmVzb3VyY2VbMF0uZW5kID0gMDsKKwlkZXYtPnJlc291cmNlWzBdLmZsYWdzID0gMDsKKwlkZXYtPnJlc291cmNlWzFdLnN0YXJ0ID0gZGV2LT5yZXNvdXJjZVsxXS5lbmQgPSAwOworCWRldi0+cmVzb3VyY2VbMV0uZmxhZ3MgPSAwOworfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSUJNLAlQQ0lfREVWSUNFX0lEX0lCTV9DUEM3MTBfUENJNjQsCWZpeHVwX2NwYzcxMF9wY2k2NCk7CisKK3N0YXRpYyB2b2lkCitwY2liaW9zX2ZpeHVwX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSA9IChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKilkZXYtPnN5c2RhdGE7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKwlpZiAoIWhvc2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJObyBob3NlIGZvciBQQ0kgZGV2ICVzIVxuIiwgcGNpX25hbWUoZGV2KSk7CisJCXJldHVybjsKKwl9CisJZm9yIChpID0gMDsgaSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gZGV2LT5yZXNvdXJjZSArIGk7CisJCWlmICghcmVzLT5mbGFncykKKwkJCWNvbnRpbnVlOworCQlpZiAocmVzLT5lbmQgPT0gMHhmZmZmZmZmZikgeworCQkJREJHKCJQQ0k6JXMgUmVzb3VyY2UgJWQgWyUwOGx4LSUwOGx4XSBpcyB1bmFzc2lnbmVkXG4iLAorCQkJICAgIHBjaV9uYW1lKGRldiksIGksIHJlcy0+c3RhcnQsIHJlcy0+ZW5kKTsKKwkJCXJlcy0+ZW5kIC09IHJlcy0+c3RhcnQ7CisJCQlyZXMtPnN0YXJ0ID0gMDsKKwkJCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9VTlNFVDsKKwkJCWNvbnRpbnVlOworCQl9CisJCW9mZnNldCA9IDA7CisJCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pIHsKKwkJCW9mZnNldCA9IGhvc2UtPnBjaV9tZW1fb2Zmc2V0OworCQl9IGVsc2UgaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CisJCQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZykgaG9zZS0+aW9fYmFzZV92aXJ0CisJCQkJLSBpc2FfaW9fYmFzZTsKKwkJfQorCQlpZiAob2Zmc2V0ICE9IDApIHsKKwkJCXJlcy0+c3RhcnQgKz0gb2Zmc2V0OworCQkJcmVzLT5lbmQgKz0gb2Zmc2V0OworI2lmZGVmIERFQlVHCisJCQlwcmludGsoIkZpeHVwIHJlcyAlZCAoJWx4KSBvZiBkZXYgJXM6ICVseCAtPiAlbHhcbiIsCisJCQkgICAgICAgaSwgcmVzLT5mbGFncywgcGNpX25hbWUoZGV2KSwKKwkJCSAgICAgICByZXMtPnN0YXJ0IC0gb2Zmc2V0LCByZXMtPnN0YXJ0KTsKKyNlbmRpZgorCQl9CisJfQorCisJLyogQ2FsbCBtYWNoaW5lIHNwZWNpZmljIHJlc291cmNlIGZpeHVwICovCisJaWYgKHBwY19tZC5wY2liaW9zX2ZpeHVwX3Jlc291cmNlcykKKwkJcHBjX21kLnBjaWJpb3NfZml4dXBfcmVzb3VyY2VzKGRldik7Cit9CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX0FOWV9JRCwJCVBDSV9BTllfSUQsCQkJcGNpYmlvc19maXh1cF9yZXNvdXJjZXMpOworCit2b2lkIHBjaWJpb3NfcmVzb3VyY2VfdG9fYnVzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBwY2lfYnVzX3JlZ2lvbiAqcmVnaW9uLAorCQkJc3RydWN0IHJlc291cmNlICpyZXMpCit7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGRldi0+c3lzZGF0YTsKKworCWlmIChob3NlICYmIHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQorCQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBpc2FfaW9fYmFzZTsKKwllbHNlIGlmIChob3NlICYmIHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJb2Zmc2V0ID0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7CisJcmVnaW9uLT5zdGFydCA9IHJlcy0+c3RhcnQgLSBvZmZzZXQ7CisJcmVnaW9uLT5lbmQgPSByZXMtPmVuZCAtIG9mZnNldDsKK30KK0VYUE9SVF9TWU1CT0wocGNpYmlvc19yZXNvdXJjZV90b19idXMpOworCit2b2lkIHBjaWJpb3NfYnVzX3RvX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAorCQkJICAgICBzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbikKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gZGV2LT5zeXNkYXRhOworCisJaWYgKGhvc2UgJiYgcmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIGlzYV9pb19iYXNlOworCWVsc2UgaWYgKGhvc2UgJiYgcmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQlvZmZzZXQgPSBob3NlLT5wY2lfbWVtX29mZnNldDsKKwlyZXMtPnN0YXJ0ID0gcmVnaW9uLT5zdGFydCArIG9mZnNldDsKKwlyZXMtPmVuZCA9IHJlZ2lvbi0+ZW5kICsgb2Zmc2V0OworfQorRVhQT1JUX1NZTUJPTChwY2liaW9zX2J1c190b19yZXNvdXJjZSk7CisKKy8qCisgKiBXZSBuZWVkIHRvIGF2b2lkIGNvbGxpc2lvbnMgd2l0aCBgbWlycm9yZWQnIFZHQSBwb3J0cworICogYW5kIG90aGVyIHN0cmFuZ2UgSVNBIGhhcmR3YXJlLCBzbyB3ZSBhbHdheXMgd2FudCB0aGUKKyAqIGFkZHJlc3NlcyB0byBiZSBhbGxvY2F0ZWQgaW4gdGhlIDB4MDAwLTB4MGZmIHJlZ2lvbgorICogbW9kdWxvIDB4NDAwLgorICoKKyAqIFdoeT8gQmVjYXVzZSBzb21lIHNpbGx5IGV4dGVybmFsIElPIGNhcmRzIG9ubHkgZGVjb2RlCisgKiB0aGUgbG93IDEwIGJpdHMgb2YgdGhlIElPIGFkZHJlc3MuIFRoZSAweDAwLTB4ZmYgcmVnaW9uCisgKiBpcyByZXNlcnZlZCBmb3IgbW90aGVyYm9hcmQgZGV2aWNlcyB0aGF0IGRlY29kZSBhbGwgMTYKKyAqIGJpdHMsIHNvIGl0J3Mgb2sgdG8gYWxsb2NhdGUgYXQsIHNheSwgMHgyODAwLTB4MjhmZiwKKyAqIGJ1dCB3ZSB3YW50IHRvIHRyeSB0byBhdm9pZCBhbGxvY2F0aW5nIGF0IDB4MjkwMC0weDJiZmYKKyAqIHdoaWNoIG1pZ2h0IGhhdmUgYmUgbWlycm9yZWQgYXQgMHgwMTAwLTB4MDNmZi4uCisgKi8KK3ZvaWQgcGNpYmlvc19hbGlnbl9yZXNvdXJjZSh2b2lkICpkYXRhLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdW5zaWduZWQgbG9uZyBzaXplLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBhbGlnbikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gZGF0YTsKKworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykgeworCQl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gcmVzLT5zdGFydDsKKworCQlpZiAoc2l6ZSA+IDB4MTAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlBDSTogSS9PIFJlZ2lvbiAlcy8lZCB0b28gbGFyZ2UiCisJCQkgICAgICAgIiAoJWxkIGJ5dGVzKVxuIiwgcGNpX25hbWUoZGV2KSwKKwkJCSAgICAgICBkZXYtPnJlc291cmNlIC0gcmVzLCBzaXplKTsKKwkJfQorCisJCWlmIChzdGFydCAmIDB4MzAwKSB7CisJCQlzdGFydCA9IChzdGFydCArIDB4M2ZmKSAmIH4weDNmZjsKKwkJCXJlcy0+c3RhcnQgPSBzdGFydDsKKwkJfQorCX0KK30KK0VYUE9SVF9TWU1CT0wocGNpYmlvc19hbGlnbl9yZXNvdXJjZSk7CisKKy8qCisgKiAgSGFuZGxlIHJlc291cmNlcyBvZiBQQ0kgZGV2aWNlcy4gIElmIHRoZSB3b3JsZCB3ZXJlIHBlcmZlY3QsIHdlIGNvdWxkCisgKiAganVzdCBhbGxvY2F0ZSBhbGwgdGhlIHJlc291cmNlIHJlZ2lvbnMgYW5kIGRvIG5vdGhpbmcgbW9yZS4gIEl0IGlzbid0LgorICogIE9uIHRoZSBvdGhlciBoYW5kLCB3ZSBjYW5ub3QganVzdCByZS1hbGxvY2F0ZSBhbGwgZGV2aWNlcywgYXMgaXQgd291bGQKKyAqICByZXF1aXJlIHVzIHRvIGtub3cgbG90cyBvZiBob3N0IGJyaWRnZSBpbnRlcm5hbHMuICBTbyB3ZSBhdHRlbXB0IHRvCisgKiAga2VlcCBhcyBtdWNoIG9mIHRoZSBvcmlnaW5hbCBjb25maWd1cmF0aW9uIGFzIHBvc3NpYmxlLCBidXQgdHdlYWsgaXQKKyAqICB3aGVuIGl0J3MgZm91bmQgdG8gYmUgd3JvbmcuCisgKgorICogIEtub3duIEJJT1MgcHJvYmxlbXMgd2UgaGF2ZSB0byB3b3JrIGFyb3VuZDoKKyAqCS0gSS9PIG9yIG1lbW9yeSByZWdpb25zIG5vdCBjb25maWd1cmVkCisgKgktIHJlZ2lvbnMgY29uZmlndXJlZCwgYnV0IG5vdCBlbmFibGVkIGluIHRoZSBjb21tYW5kIHJlZ2lzdGVyCisgKgktIGJvZ3VzIEkvTyBhZGRyZXNzZXMgYWJvdmUgNjRLIHVzZWQKKyAqCS0gZXhwYW5zaW9uIFJPTXMgbGVmdCBlbmFibGVkICh0aGlzIG1heSBzb3VuZCBoYXJtbGVzcywgYnV0IGdpdmVuCisgKgkgIHRoZSBmYWN0IHRoZSBQQ0kgc3BlY3MgZXhwbGljaXRseSBhbGxvdyBhZGRyZXNzIGRlY29kZXJzIHRvIGJlCisgKgkgIHNoYXJlZCBiZXR3ZWVuIGV4cGFuc2lvbiBST01zIGFuZCBvdGhlciByZXNvdXJjZSByZWdpb25zLCBpdCdzCisgKgkgIGF0IGxlYXN0IGRhbmdlcm91cykKKyAqCisgKiAgT3VyIHNvbHV0aW9uOgorICoJKDEpIEFsbG9jYXRlIHJlc291cmNlcyBmb3IgYWxsIGJ1c2VzIGJlaGluZCBQQ0ktdG8tUENJIGJyaWRnZXMuCisgKgkgICAgVGhpcyBnaXZlcyB1cyBmaXhlZCBiYXJyaWVycyBvbiB3aGVyZSB3ZSBjYW4gYWxsb2NhdGUuCisgKgkoMikgQWxsb2NhdGUgcmVzb3VyY2VzIGZvciBhbGwgZW5hYmxlZCBkZXZpY2VzLiAgSWYgdGhlcmUgaXMKKyAqCSAgICBhIGNvbGxpc2lvbiwganVzdCBtYXJrIHRoZSByZXNvdXJjZSBhcyB1bmFsbG9jYXRlZC4gQWxzbworICoJICAgIGRpc2FibGUgZXhwYW5zaW9uIFJPTXMgZHVyaW5nIHRoaXMgc3RlcC4KKyAqCSgzKSBUcnkgdG8gYWxsb2NhdGUgcmVzb3VyY2VzIGZvciBkaXNhYmxlZCBkZXZpY2VzLiAgSWYgdGhlCisgKgkgICAgcmVzb3VyY2VzIHdlcmUgYXNzaWduZWQgY29ycmVjdGx5LCBldmVyeXRoaW5nIGdvZXMgd2VsbCwKKyAqCSAgICBpZiB0aGV5IHdlcmVuJ3QsIHRoZXkgd29uJ3QgZGlzdHVyYiBhbGxvY2F0aW9uIG9mIG90aGVyCisgKgkgICAgcmVzb3VyY2VzLgorICoJKDQpIEFzc2lnbiBuZXcgYWRkcmVzc2VzIHRvIHJlc291cmNlcyB3aGljaCB3ZXJlIGVpdGhlcgorICoJICAgIG5vdCBjb25maWd1cmVkIGF0IGFsbCBvciBtaXNjb25maWd1cmVkLiAgSWYgZXhwbGljaXRseQorICoJICAgIHJlcXVlc3RlZCBieSB0aGUgdXNlciwgY29uZmlndXJlIGV4cGFuc2lvbiBST00gYWRkcmVzcworICoJICAgIGFzIHdlbGwuCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0CitwY2liaW9zX2FsbG9jYXRlX2J1c19yZXNvdXJjZXMoc3RydWN0IGxpc3RfaGVhZCAqYnVzX2xpc3QpCit7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKKwlpbnQgaTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgKnByOworCisJLyogRGVwdGgtRmlyc3QgU2VhcmNoIG9uIGJ1cyB0cmVlICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShidXMsIGJ1c19saXN0LCBub2RlKSB7CisJCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKwkJCWlmICgocmVzID0gYnVzLT5yZXNvdXJjZVtpXSkgPT0gTlVMTCB8fCAhcmVzLT5mbGFncworCQkJICAgIHx8IHJlcy0+c3RhcnQgPiByZXMtPmVuZCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChidXMtPnBhcmVudCA9PSBOVUxMKQorCQkJCXByID0gKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKT8KKwkJCQkJJmlvcG9ydF9yZXNvdXJjZTogJmlvbWVtX3Jlc291cmNlOworCQkJZWxzZSB7CisJCQkJcHIgPSBwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UoYnVzLT5zZWxmLCByZXMpOworCQkJCWlmIChwciA9PSByZXMpIHsKKwkJCQkJLyogdGhpcyBoYXBwZW5zIHdoZW4gdGhlIGdlbmVyaWMgUENJCisJCQkJCSAqIGNvZGUgKHdyb25nbHkpIGRlY2lkZXMgdGhhdCB0aGlzCisJCQkJCSAqIGJyaWRnZSBpcyB0cmFuc3BhcmVudCAgLS0gcGF1bHVzCisJCQkJCSAqLworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisKKwkJCURCRygiUENJOiBicmlkZ2UgcnNyYyAlbHguLiVseCAoJWx4KSwgcGFyZW50ICVwXG4iLAorCQkJICAgIHJlcy0+c3RhcnQsIHJlcy0+ZW5kLCByZXMtPmZsYWdzLCBwcik7CisJCQlpZiAocHIpIHsKKwkJCQlpZiAocmVxdWVzdF9yZXNvdXJjZShwciwgcmVzKSA9PSAwKQorCQkJCQljb250aW51ZTsKKwkJCQkvKgorCQkJCSAqIE11c3QgYmUgYSBjb25mbGljdCB3aXRoIGFuIGV4aXN0aW5nIGVudHJ5LgorCQkJCSAqIE1vdmUgdGhhdCBlbnRyeSAob3IgZW50cmllcykgdW5kZXIgdGhlCisJCQkJICogYnJpZGdlIHJlc291cmNlIGFuZCB0cnkgYWdhaW4uCisJCQkJICovCisJCQkJaWYgKHJlcGFyZW50X3Jlc291cmNlcyhwciwgcmVzKSA9PSAwKQorCQkJCQljb250aW51ZTsKKwkJCX0KKwkJCXByaW50ayhLRVJOX0VSUiAiUENJOiBDYW5ub3QgYWxsb2NhdGUgcmVzb3VyY2UgcmVnaW9uICIKKwkJCSAgICAgICAiJWQgb2YgUENJIGJyaWRnZSAlZFxuIiwgaSwgYnVzLT5udW1iZXIpOworCQkJaWYgKHBjaV9yZWxvY2F0ZV9icmlkZ2VfcmVzb3VyY2UoYnVzLCBpKSkKKwkJCQlidXMtPnJlc291cmNlW2ldID0gTlVMTDsKKwkJfQorCQlwY2liaW9zX2FsbG9jYXRlX2J1c19yZXNvdXJjZXMoJmJ1cy0+Y2hpbGRyZW4pOworCX0KK30KKworLyoKKyAqIFJlcGFyZW50IHJlc291cmNlIGNoaWxkcmVuIG9mIHByIHRoYXQgY29uZmxpY3Qgd2l0aCByZXMKKyAqIHVuZGVyIHJlcywgYW5kIG1ha2UgcmVzIHJlcGxhY2UgdGhvc2UgY2hpbGRyZW4uCisgKi8KK3N0YXRpYyBpbnQgX19pbml0CityZXBhcmVudF9yZXNvdXJjZXMoc3RydWN0IHJlc291cmNlICpwYXJlbnQsIHN0cnVjdCByZXNvdXJjZSAqcmVzKQoreworCXN0cnVjdCByZXNvdXJjZSAqcCwgKipwcDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKipmaXJzdHBwID0gTlVMTDsKKworCWZvciAocHAgPSAmcGFyZW50LT5jaGlsZDsgKHAgPSAqcHApICE9IE5VTEw7IHBwID0gJnAtPnNpYmxpbmcpIHsKKwkJaWYgKHAtPmVuZCA8IHJlcy0+c3RhcnQpCisJCQljb250aW51ZTsKKwkJaWYgKHJlcy0+ZW5kIDwgcC0+c3RhcnQpCisJCQlicmVhazsKKwkJaWYgKHAtPnN0YXJ0IDwgcmVzLT5zdGFydCB8fCBwLT5lbmQgPiByZXMtPmVuZCkKKwkJCXJldHVybiAtMTsJLyogbm90IGNvbXBsZXRlbHkgY29udGFpbmVkICovCisJCWlmIChmaXJzdHBwID09IE5VTEwpCisJCQlmaXJzdHBwID0gcHA7CisJfQorCWlmIChmaXJzdHBwID09IE5VTEwpCisJCXJldHVybiAtMTsJLyogZGlkbid0IGZpbmQgYW55IGNvbmZsaWN0aW5nIGVudHJpZXM/ICovCisJcmVzLT5wYXJlbnQgPSBwYXJlbnQ7CisJcmVzLT5jaGlsZCA9ICpmaXJzdHBwOworCXJlcy0+c2libGluZyA9ICpwcDsKKwkqZmlyc3RwcCA9IHJlczsKKwkqcHAgPSBOVUxMOworCWZvciAocCA9IHJlcy0+Y2hpbGQ7IHAgIT0gTlVMTDsgcCA9IHAtPnNpYmxpbmcpIHsKKwkJcC0+cGFyZW50ID0gcmVzOworCQlEQkcoS0VSTl9JTkZPICJQQ0k6IHJlcGFyZW50ZWQgJXMgWyVseC4uJWx4XSB1bmRlciAlc1xuIiwKKwkJICAgIHAtPm5hbWUsIHAtPnN0YXJ0LCBwLT5lbmQsIHJlcy0+bmFtZSk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogQSBicmlkZ2UgaGFzIGJlZW4gYWxsb2NhdGVkIGEgcmFuZ2Ugd2hpY2ggaXMgb3V0c2lkZSB0aGUgcmFuZ2UKKyAqIG9mIGl0cyBwYXJlbnQgYnJpZGdlLCBzbyBpdCBuZWVkcyB0byBiZSBtb3ZlZC4KKyAqLworc3RhdGljIGludCBfX2luaXQKK3BjaV9yZWxvY2F0ZV9icmlkZ2VfcmVzb3VyY2Uoc3RydWN0IHBjaV9idXMgKmJ1cywgaW50IGkpCit7CisJc3RydWN0IHJlc291cmNlICpyZXMsICpwciwgKmNvbmZsaWN0OworCXVuc2lnbmVkIGxvbmcgdHJ5LCBzaXplOworCWludCBqOworCXN0cnVjdCBwY2lfYnVzICpwYXJlbnQgPSBidXMtPnBhcmVudDsKKworCWlmIChwYXJlbnQgPT0gTlVMTCkgeworCQkvKiBzaG91bGRuJ3QgZXZlciBoYXBwZW4gKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IGNhbid0IG1vdmUgaG9zdCBicmlkZ2UgcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJlcyA9IGJ1cy0+cmVzb3VyY2VbaV07CisJaWYgKHJlcyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJcHIgPSBOVUxMOworCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKwkJc3RydWN0IHJlc291cmNlICpyID0gcGFyZW50LT5yZXNvdXJjZVtqXTsKKwkJaWYgKCFyKQorCQkJY29udGludWU7CisJCWlmICgocmVzLT5mbGFncyBeIHItPmZsYWdzKSAmIChJT1JFU09VUkNFX0lPIHwgSU9SRVNPVVJDRV9NRU0pKQorCQkJY29udGludWU7CisJCWlmICghKChyZXMtPmZsYWdzIF4gci0+ZmxhZ3MpICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkpIHsKKwkJCXByID0gcjsKKwkJCWJyZWFrOworCQl9CisJCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkKKwkJCXByID0gcjsKKwl9CisJaWYgKHByID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlzaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0OworCWlmIChwci0+c3RhcnQgPiBwci0+ZW5kIHx8IHNpemUgPiBwci0+ZW5kIC0gcHItPnN0YXJ0KQorCQlyZXR1cm4gLTE7CisJdHJ5ID0gcHItPmVuZDsKKwlmb3IgKDs7KSB7CisJCXJlcy0+c3RhcnQgPSB0cnkgLSBzaXplOworCQlyZXMtPmVuZCA9IHRyeTsKKwkJaWYgKHByb2JlX3Jlc291cmNlKGJ1cy0+cGFyZW50LCBwciwgcmVzLCAmY29uZmxpY3QpID09IDApCisJCQlicmVhazsKKwkJaWYgKGNvbmZsaWN0LT5zdGFydCA8PSBwci0+c3RhcnQgKyBzaXplKQorCQkJcmV0dXJuIC0xOworCQl0cnkgPSBjb25mbGljdC0+c3RhcnQgLSAxOworCX0KKwlpZiAocmVxdWVzdF9yZXNvdXJjZShwciwgcmVzKSkgeworCQlEQkcoS0VSTl9FUlIgIlBDSTogaHVoPyBjb3VsZG4ndCBtb3ZlIHRvICVseC4uJWx4XG4iLAorCQkgICAgcmVzLT5zdGFydCwgcmVzLT5lbmQpOworCQlyZXR1cm4gLTE7CQkvKiAiY2FuJ3QgaGFwcGVuIiAqLworCX0KKwl1cGRhdGVfYnJpZGdlX2Jhc2UoYnVzLCBpKTsKKwlwcmludGsoS0VSTl9JTkZPICJQQ0k6IGJyaWRnZSAlZCByZXNvdXJjZSAlZCBtb3ZlZCB0byAlbHguLiVseFxuIiwKKwkgICAgICAgYnVzLT5udW1iZXIsIGksIHJlcy0+c3RhcnQsIHJlcy0+ZW5kKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQKK3Byb2JlX3Jlc291cmNlKHN0cnVjdCBwY2lfYnVzICpwYXJlbnQsIHN0cnVjdCByZXNvdXJjZSAqcHIsCisJICAgICAgIHN0cnVjdCByZXNvdXJjZSAqcmVzLCBzdHJ1Y3QgcmVzb3VyY2UgKipjb25mbGljdCkKK3sKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJc3RydWN0IHJlc291cmNlICpyOworCWludCBpOworCisJZm9yIChyID0gcHItPmNoaWxkOyByICE9IE5VTEw7IHIgPSByLT5zaWJsaW5nKSB7CisJCWlmIChyLT5lbmQgPj0gcmVzLT5zdGFydCAmJiByZXMtPmVuZCA+PSByLT5zdGFydCkgeworCQkJKmNvbmZsaWN0ID0gcjsKKwkJCXJldHVybiAxOworCQl9CisJfQorCWxpc3RfZm9yX2VhY2hfZW50cnkoYnVzLCAmcGFyZW50LT5jaGlsZHJlbiwgbm9kZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisJCQlpZiAoKHIgPSBidXMtPnJlc291cmNlW2ldKSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFyLT5mbGFncyB8fCByLT5zdGFydCA+IHItPmVuZCB8fCByID09IHJlcykKKwkJCQljb250aW51ZTsKKwkJCWlmIChwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UoYnVzLT5zZWxmLCByKSAhPSBwcikKKwkJCQljb250aW51ZTsKKwkJCWlmIChyLT5lbmQgPj0gcmVzLT5zdGFydCAmJiByZXMtPmVuZCA+PSByLT5zdGFydCkgeworCQkJCSpjb25mbGljdCA9IHI7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZwYXJlbnQtPmRldmljZXMsIGJ1c19saXN0KSB7CisJCWZvciAoaSA9IDA7IGkgPCA2OyArK2kpIHsKKwkJCXIgPSAmZGV2LT5yZXNvdXJjZVtpXTsKKwkJCWlmICghci0+ZmxhZ3MgfHwgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9VTlNFVCkpCisJCQkJY29udGludWU7CisJCQlpZiAocGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGRldiwgcikgIT0gcHIpCisJCQkJY29udGludWU7CisJCQlpZiAoci0+ZW5kID49IHJlcy0+c3RhcnQgJiYgcmVzLT5lbmQgPj0gci0+c3RhcnQpIHsKKwkJCQkqY29uZmxpY3QgPSByOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQKK3VwZGF0ZV9icmlkZ2VfYmFzZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBpbnQgaSkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IGJ1cy0+cmVzb3VyY2VbaV07CisJdTggaW9fYmFzZV9sbywgaW9fbGltaXRfbG87CisJdTE2IG1lbV9iYXNlLCBtZW1fbGltaXQ7CisJdTE2IGNtZDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQsIG9mZjsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gYnVzLT5zZWxmOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGRldi0+c3lzZGF0YTsKKworCWlmICghaG9zZSkgeworCQlwcmludGsoInVwZGF0ZV9icmlkZ2VfYmFzZTogbm8gaG9zZT9cbiIpOworCQlyZXR1cm47CisJfQorCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELAorCQkJICAgICAgY21kICYgfihQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01FTU9SWSkpOworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykgeworCQlvZmYgPSAodW5zaWduZWQgbG9uZykgaG9zZS0+aW9fYmFzZV92aXJ0IC0gaXNhX2lvX2Jhc2U7CisJCXN0YXJ0ID0gcmVzLT5zdGFydCAtIG9mZjsKKwkJZW5kID0gcmVzLT5lbmQgLSBvZmY7CisJCWlvX2Jhc2VfbG8gPSAoc3RhcnQgPj4gOCkgJiBQQ0lfSU9fUkFOR0VfTUFTSzsKKwkJaW9fbGltaXRfbG8gPSAoZW5kID4+IDgpICYgUENJX0lPX1JBTkdFX01BU0s7CisJCWlmIChlbmQgPiAweGZmZmYpIHsKKwkJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9JT19CQVNFX1VQUEVSMTYsCisJCQkJCSAgICAgIHN0YXJ0ID4+IDE2KTsKKwkJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9JT19MSU1JVF9VUFBFUjE2LAorCQkJCQkgICAgICBlbmQgPj4gMTYpOworCQkJaW9fYmFzZV9sbyB8PSBQQ0lfSU9fUkFOR0VfVFlQRV8zMjsKKwkJfSBlbHNlCisJCQlpb19iYXNlX2xvIHw9IFBDSV9JT19SQU5HRV9UWVBFXzE2OworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU9fQkFTRSwgaW9fYmFzZV9sbyk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JT19MSU1JVCwgaW9fbGltaXRfbG8pOworCisJfSBlbHNlIGlmICgocmVzLT5mbGFncyAmIChJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfUFJFRkVUQ0gpKQorCQkgICA9PSBJT1JFU09VUkNFX01FTSkgeworCQlvZmYgPSBob3NlLT5wY2lfbWVtX29mZnNldDsKKwkJbWVtX2Jhc2UgPSAoKHJlcy0+c3RhcnQgLSBvZmYpID4+IDE2KSAmIFBDSV9NRU1PUllfUkFOR0VfTUFTSzsKKwkJbWVtX2xpbWl0ID0gKChyZXMtPmVuZCAtIG9mZikgPj4gMTYpICYgUENJX01FTU9SWV9SQU5HRV9NQVNLOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfTUVNT1JZX0JBU0UsIG1lbV9iYXNlKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX01FTU9SWV9MSU1JVCwgbWVtX2xpbWl0KTsKKworCX0gZWxzZSBpZiAoKHJlcy0+ZmxhZ3MgJiAoSU9SRVNPVVJDRV9NRU0gfCBJT1JFU09VUkNFX1BSRUZFVENIKSkKKwkJICAgPT0gKElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9QUkVGRVRDSCkpIHsKKwkJb2ZmID0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7CisJCW1lbV9iYXNlID0gKChyZXMtPnN0YXJ0IC0gb2ZmKSA+PiAxNikgJiBQQ0lfUFJFRl9SQU5HRV9NQVNLOworCQltZW1fbGltaXQgPSAoKHJlcy0+ZW5kIC0gb2ZmKSA+PiAxNikgJiBQQ0lfUFJFRl9SQU5HRV9NQVNLOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfUFJFRl9NRU1PUllfQkFTRSwgbWVtX2Jhc2UpOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfUFJFRl9NRU1PUllfTElNSVQsIG1lbV9saW1pdCk7CisKKwl9IGVsc2UgeworCQlEQkcoS0VSTl9FUlIgIlBDSTogdWdoLCBicmlkZ2UgJXMgcmVzICVkIGhhcyBmbGFncz0lbHhcbiIsCisJCSAgICBwY2lfbmFtZShkZXYpLCBpLCByZXMtPmZsYWdzKTsKKwl9CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsIGNtZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhbGxvY19yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgaWR4KQoreworCXN0cnVjdCByZXNvdXJjZSAqcHIsICpyID0gJmRldi0+cmVzb3VyY2VbaWR4XTsKKworCURCRygiUENJOiVzOiBSZXNvdXJjZSAlZDogJTA4bHgtJTA4bHggKGY9JWx4KVxuIiwKKwkgICAgcGNpX25hbWUoZGV2KSwgaWR4LCByLT5zdGFydCwgci0+ZW5kLCByLT5mbGFncyk7CisJcHIgPSBwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UoZGV2LCByKTsKKwlpZiAoIXByIHx8IHJlcXVlc3RfcmVzb3VyY2UocHIsIHIpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlBDSTogQ2Fubm90IGFsbG9jYXRlIHJlc291cmNlIHJlZ2lvbiAlZCIKKwkJICAgICAgICIgb2YgZGV2aWNlICVzXG4iLCBpZHgsIHBjaV9uYW1lKGRldikpOworCQlpZiAocHIpCisJCQlEQkcoIlBDSTogIHBhcmVudCBpcyAlcDogJTA4bHgtJTA4bHggKGY9JWx4KVxuIiwKKwkJCSAgICBwciwgcHItPnN0YXJ0LCBwci0+ZW5kLCBwci0+ZmxhZ3MpOworCQkvKiBXZSdsbCBhc3NpZ24gYSBuZXcgYWRkcmVzcyBsYXRlciAqLworCQlyLT5mbGFncyB8PSBJT1JFU09VUkNFX1VOU0VUOworCQlyLT5lbmQgLT0gci0+c3RhcnQ7CisJCXItPnN0YXJ0ID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdAorcGNpYmlvc19hbGxvY2F0ZV9yZXNvdXJjZXMoaW50IHBhc3MpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CisJaW50IGlkeCwgZGlzYWJsZWQ7CisJdTE2IGNvbW1hbmQ7CisJc3RydWN0IHJlc291cmNlICpyOworCisJZm9yX2VhY2hfcGNpX2RldihkZXYpIHsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNvbW1hbmQpOworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IDY7IGlkeCsrKSB7CisJCQlyID0gJmRldi0+cmVzb3VyY2VbaWR4XTsKKwkJCWlmIChyLT5wYXJlbnQpCQkvKiBBbHJlYWR5IGFsbG9jYXRlZCAqLworCQkJCWNvbnRpbnVlOworCQkJaWYgKCFyLT5mbGFncyB8fCAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1VOU0VUKSkKKwkJCQljb250aW51ZTsJLyogTm90IGFzc2lnbmVkIGF0IGFsbCAqLworCQkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJCQlkaXNhYmxlZCA9ICEoY29tbWFuZCAmIFBDSV9DT01NQU5EX0lPKTsKKwkJCWVsc2UKKwkJCQlkaXNhYmxlZCA9ICEoY29tbWFuZCAmIFBDSV9DT01NQU5EX01FTU9SWSk7CisJCQlpZiAocGFzcyA9PSBkaXNhYmxlZCkKKwkJCQlhbGxvY19yZXNvdXJjZShkZXYsIGlkeCk7CisJCX0KKwkJaWYgKHBhc3MpCisJCQljb250aW51ZTsKKwkJciA9ICZkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdOworCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1JPTV9FTkFCTEUpIHsKKwkJCS8qIFR1cm4gdGhlIFJPTSBvZmYsIGxlYXZlIHRoZSByZXNvdXJjZSByZWdpb24sIGJ1dCBrZWVwIGl0IHVucmVnaXN0ZXJlZC4gKi8KKwkJCXUzMiByZWc7CisJCQlEQkcoIlBDSTogU3dpdGNoaW5nIG9mZiBST00gb2YgJXNcbiIsIHBjaV9uYW1lKGRldikpOworCQkJci0+ZmxhZ3MgJj0gfklPUkVTT1VSQ0VfUk9NX0VOQUJMRTsKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGRldi0+cm9tX2Jhc2VfcmVnLCAmcmVnKTsKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBkZXYtPnJvbV9iYXNlX3JlZywKKwkJCQkJICAgICAgIHJlZyAmIH5QQ0lfUk9NX0FERFJFU1NfRU5BQkxFKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0CitwY2liaW9zX2Fzc2lnbl9yZXNvdXJjZXModm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKwlpbnQgaWR4OworCXN0cnVjdCByZXNvdXJjZSAqcjsKKworCWZvcl9lYWNoX3BjaV9kZXYoZGV2KSB7CisJCWludCBjbGFzcyA9IGRldi0+Y2xhc3MgPj4gODsKKworCQkvKiBEb24ndCB0b3VjaCBjbGFzc2xlc3MgZGV2aWNlcyBhbmQgaG9zdCBicmlkZ2VzICovCisJCWlmICghY2xhc3MgfHwgY2xhc3MgPT0gUENJX0NMQVNTX0JSSURHRV9IT1NUKQorCQkJY29udGludWU7CisKKwkJZm9yIChpZHggPSAwOyBpZHggPCA2OyBpZHgrKykgeworCQkJciA9ICZkZXYtPnJlc291cmNlW2lkeF07CisKKwkJCS8qCisJCQkgKiBXZSBzaGFsbCBhc3NpZ24gYSBuZXcgYWRkcmVzcyB0byB0aGlzIHJlc291cmNlLAorCQkJICogZWl0aGVyIGJlY2F1c2UgdGhlIEJJT1MgKHNpYykgZm9yZ290IHRvIGRvIHNvCisJCQkgKiBvciBiZWNhdXNlIHdlIGhhdmUgZGVjaWRlZCB0aGUgb2xkIGFkZHJlc3Mgd2FzCisJCQkgKiB1bnVzYWJsZSBmb3Igc29tZSByZWFzb24uCisJCQkgKi8KKwkJCWlmICgoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1VOU0VUKSAmJiByLT5lbmQgJiYKKwkJCSAgICAoIXBwY19tZC5wY2liaW9zX2VuYWJsZV9kZXZpY2VfaG9vayB8fAorCQkJICAgICAhcHBjX21kLnBjaWJpb3NfZW5hYmxlX2RldmljZV9ob29rKGRldiwgMSkpKSB7CisJCQkJci0+ZmxhZ3MgJj0gfklPUkVTT1VSQ0VfVU5TRVQ7CisJCQkJcGNpX2Fzc2lnbl9yZXNvdXJjZShkZXYsIGlkeCk7CisJCQl9CisJCX0KKworI2lmIDAgLyogZG9uJ3QgYXNzaWduIFJPTXMgKi8KKwkJciA9ICZkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdOworCQlyLT5lbmQgLT0gci0+c3RhcnQ7CisJCXItPnN0YXJ0ID0gMDsKKwkJaWYgKHItPmVuZCkKKwkJCXBjaV9hc3NpZ25fcmVzb3VyY2UoZGV2LCBQQ0lfUk9NX1JFU09VUkNFKTsKKyNlbmRpZgorCX0KK30KKworCitpbnQKK3BjaWJpb3NfZW5hYmxlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKK3sKKwl1MTYgY21kLCBvbGRfY21kOworCWludCBpZHg7CisJc3RydWN0IHJlc291cmNlICpyOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CisJb2xkX2NtZCA9IGNtZDsKKwlmb3IgKGlkeD0wOyBpZHg8NjsgaWR4KyspIHsKKwkJLyogT25seSBzZXQgdXAgdGhlIHJlcXVlc3RlZCBzdHVmZiAqLworCQlpZiAoIShtYXNrICYgKDE8PGlkeCkpKQorCQkJY29udGludWU7CisJCisJCXIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOworCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1VOU0VUKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlBDSTogRGV2aWNlICVzIG5vdCBhdmFpbGFibGUgYmVjYXVzZSBvZiByZXNvdXJjZSBjb2xsaXNpb25zXG4iLCBwY2lfbmFtZShkZXYpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCQljbWQgfD0gUENJX0NPTU1BTkRfSU87CisJCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQkJY21kIHw9IFBDSV9DT01NQU5EX01FTU9SWTsKKwl9CisJaWYgKGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uc3RhcnQpCisJCWNtZCB8PSBQQ0lfQ09NTUFORF9NRU1PUlk7CisJaWYgKGNtZCAhPSBvbGRfY21kKSB7CisJCXByaW50aygiUENJOiBFbmFibGluZyBkZXZpY2UgJXMgKCUwNHggLT4gJTA0eClcbiIsIHBjaV9uYW1lKGRldiksIG9sZF9jbWQsIGNtZCk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBjbWQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXh0X2NvbnRyb2xsZXJfaW5kZXg7CisKK3N0cnVjdCBwY2lfY29udHJvbGxlciAqIF9faW5pdAorcGNpYmlvc19hbGxvY19jb250cm9sbGVyKHZvaWQpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOworCisJaG9zZSA9IChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKilhbGxvY19ib290bWVtKHNpemVvZigqaG9zZSkpOworCW1lbXNldChob3NlLCAwLCBzaXplb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyKSk7CisKKwkqaG9zZV90YWlsID0gaG9zZTsKKwlob3NlX3RhaWwgPSAmaG9zZS0+bmV4dDsKKworCWhvc2UtPmluZGV4ID0gbmV4dF9jb250cm9sbGVyX2luZGV4Kys7CisKKwlyZXR1cm4gaG9zZTsKK30KKworI2lmZGVmIENPTkZJR19QUENfT0YKKy8qCisgKiBGdW5jdGlvbnMgYmVsb3cgYXJlIHVzZWQgb24gT3BlbkZpcm13YXJlIG1hY2hpbmVzLgorICovCitzdGF0aWMgdm9pZAorbWFrZV9vbmVfbm9kZV9tYXAoc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCB1OCBwY2lfYnVzKQoreworCWludCAqYnVzX3JhbmdlOworCWludCBsZW47CisKKwlpZiAocGNpX2J1cyA+PSBwY2lfYnVzX2NvdW50KQorCQlyZXR1cm47CisJYnVzX3JhbmdlID0gKGludCAqKSBnZXRfcHJvcGVydHkobm9kZSwgImJ1cy1yYW5nZSIsICZsZW4pOworCWlmIChidXNfcmFuZ2UgPT0gTlVMTCB8fCBsZW4gPCAyICogc2l6ZW9mKGludCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgZ2V0IGJ1cy1yYW5nZSBmb3IgJXMsICIKKwkJICAgICAgICJhc3N1bWluZyBpdCBzdGFydHMgYXQgMFxuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJcGNpX3RvX09GX2J1c19tYXBbcGNpX2J1c10gPSAwOworCX0gZWxzZQorCQlwY2lfdG9fT0ZfYnVzX21hcFtwY2lfYnVzXSA9IGJ1c19yYW5nZVswXTsKKworCWZvciAobm9kZT1ub2RlLT5jaGlsZDsgbm9kZSAhPSAwO25vZGUgPSBub2RlLT5zaWJsaW5nKSB7CisJCXN0cnVjdCBwY2lfZGV2KiBkZXY7CisJCXVuc2lnbmVkIGludCAqY2xhc3NfY29kZSwgKnJlZzsKKwkKKwkJY2xhc3NfY29kZSA9ICh1bnNpZ25lZCBpbnQgKikgZ2V0X3Byb3BlcnR5KG5vZGUsICJjbGFzcy1jb2RlIiwgTlVMTCk7CisJCWlmICghY2xhc3NfY29kZSB8fCAoKCpjbGFzc19jb2RlID4+IDgpICE9IFBDSV9DTEFTU19CUklER0VfUENJICYmCisJCQkoKmNsYXNzX2NvZGUgPj4gOCkgIT0gUENJX0NMQVNTX0JSSURHRV9DQVJEQlVTKSkKKwkJCWNvbnRpbnVlOworCQlyZWcgPSAodW5zaWduZWQgaW50ICopZ2V0X3Byb3BlcnR5KG5vZGUsICJyZWciLCBOVUxMKTsKKwkJaWYgKCFyZWcpCisJCQljb250aW51ZTsKKwkJZGV2ID0gcGNpX2ZpbmRfc2xvdChwY2lfYnVzLCAoKHJlZ1swXSA+PiA4KSAmIDB4ZmYpKTsKKwkJaWYgKCFkZXYgfHwgIWRldi0+c3Vib3JkaW5hdGUpCisJCQljb250aW51ZTsKKwkJbWFrZV9vbmVfbm9kZV9tYXAobm9kZSwgZGV2LT5zdWJvcmRpbmF0ZS0+bnVtYmVyKTsKKwl9Cit9CisJCit2b2lkCitwY2liaW9zX21ha2VfT0ZfYnVzX21hcCh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZTsKKwl1OCogb2ZfcHJvcF9tYXA7CisKKwlwY2lfdG9fT0ZfYnVzX21hcCA9ICh1OCopa21hbGxvYyhwY2lfYnVzX2NvdW50LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBjaV90b19PRl9idXNfbWFwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgYWxsb2NhdGUgT0YgYnVzIG1hcCAhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFdlIGZpbGwgdGhlIGJ1cyBtYXAgd2l0aCBpbnZhbGlkIHZhbHVlcywgdGhhdCBoZWxwcworCSAqIGRlYnVnZ2luZy4KKwkgKi8KKwlmb3IgKGk9MDsgaTxwY2lfYnVzX2NvdW50OyBpKyspCisJCXBjaV90b19PRl9idXNfbWFwW2ldID0gMHhmZjsKKworCS8qIEZvciBlYWNoIGhvc2UsIHdlIGJlZ2luIHNlYXJjaGluZyBicmlkZ2VzICovCisJZm9yKGhvc2U9aG9zZV9oZWFkOyBob3NlOyBob3NlPWhvc2UtPm5leHQpIHsKKwkJc3RydWN0IGRldmljZV9ub2RlKiBub2RlOwkKKwkJbm9kZSA9IChzdHJ1Y3QgZGV2aWNlX25vZGUgKilob3NlLT5hcmNoX2RhdGE7CisJCWlmICghbm9kZSkKKwkJCWNvbnRpbnVlOworCQltYWtlX29uZV9ub2RlX21hcChub2RlLCBob3NlLT5maXJzdF9idXNubyk7CisJfQorCW9mX3Byb3BfbWFwID0gZ2V0X3Byb3BlcnR5KGZpbmRfcGF0aF9kZXZpY2UoIi8iKSwgInBjaS1PRi1idXMtbWFwIiwgTlVMTCk7CisJaWYgKG9mX3Byb3BfbWFwKQorCQltZW1jcHkob2ZfcHJvcF9tYXAsIHBjaV90b19PRl9idXNfbWFwLCBwY2lfYnVzX2NvdW50KTsKKyNpZmRlZiBERUJVRworCXByaW50aygiUENJLT5PRiBidXMgbWFwOlxuIik7CisJZm9yIChpPTA7IGk8cGNpX2J1c19jb3VudDsgaSsrKSB7CisJCWlmIChwY2lfdG9fT0ZfYnVzX21hcFtpXSA9PSAweGZmKQorCQkJY29udGludWU7CisJCXByaW50aygiJWQgLT4gJWRcbiIsIGksIHBjaV90b19PRl9idXNfbWFwW2ldKTsKKwl9CisjZW5kaWYKK30KKwordHlwZWRlZiBpbnQgKCpwY2lfT0Zfc2Nhbl9pdGVyYXRvcikoc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCB2b2lkKiBkYXRhKTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSoKK3NjYW5fT0ZfcGNpX2NoaWxkcyhzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUsIHBjaV9PRl9zY2FuX2l0ZXJhdG9yIGZpbHRlciwgdm9pZCogZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUqIHN1Yl9ub2RlOworCisJZm9yICg7IG5vZGUgIT0gMDtub2RlID0gbm9kZS0+c2libGluZykgeworCQl1bnNpZ25lZCBpbnQgKmNsYXNzX2NvZGU7CisJCisJCWlmIChmaWx0ZXIobm9kZSwgZGF0YSkpCisJCQlyZXR1cm4gbm9kZTsKKworCQkvKiBGb3IgUENJPC0+UENJIGJyaWRnZXMgb3IgQ2FyZEJ1cyBicmlkZ2VzLCB3ZSBnbyBkb3duCisJCSAqIE5vdGU6IHNvbWUgT0ZzIGNyZWF0ZSBhIHBhcmVudCBub2RlICJtdWx0aWZ1bmMtZGV2aWNlIiBhcworCQkgKiBhIGZha2Ugcm9vdCBmb3IgYWxsIGZ1bmN0aW9ucyBvZiBhIG11bHRpLWZ1bmN0aW9uIGRldmljZSwKKwkJICogd2UgZ28gZG93biB0aGVtIGFzIHdlbGwuCisJCSAqLworCQljbGFzc19jb2RlID0gKHVuc2lnbmVkIGludCAqKSBnZXRfcHJvcGVydHkobm9kZSwgImNsYXNzLWNvZGUiLCBOVUxMKTsKKwkJaWYgKCghY2xhc3NfY29kZSB8fCAoKCpjbGFzc19jb2RlID4+IDgpICE9IFBDSV9DTEFTU19CUklER0VfUENJICYmCisJCQkoKmNsYXNzX2NvZGUgPj4gOCkgIT0gUENJX0NMQVNTX0JSSURHRV9DQVJEQlVTKSkgJiYKKwkJCXN0cmNtcChub2RlLT5uYW1lLCAibXVsdGlmdW5jLWRldmljZSIpKQorCQkJY29udGludWU7CisJCXN1Yl9ub2RlID0gc2Nhbl9PRl9wY2lfY2hpbGRzKG5vZGUtPmNoaWxkLCBmaWx0ZXIsIGRhdGEpOworCQlpZiAoc3ViX25vZGUpCisJCQlyZXR1cm4gc3ViX25vZGU7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50CitzY2FuX09GX3BjaV9jaGlsZHNfaXRlcmF0b3Ioc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCB2b2lkKiBkYXRhKQoreworCXVuc2lnbmVkIGludCAqcmVnOworCXU4KiBmZGF0YSA9ICh1OCopZGF0YTsKKwkKKwlyZWcgPSAodW5zaWduZWQgaW50ICopIGdldF9wcm9wZXJ0eShub2RlLCAicmVnIiwgTlVMTCk7CisJaWYgKHJlZyAmJiAoKHJlZ1swXSA+PiA4KSAmIDB4ZmYpID09IGZkYXRhWzFdCisJCSYmICgocmVnWzBdID4+IDE2KSAmIDB4ZmYpID09IGZkYXRhWzBdKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSoKK3NjYW5fT0ZfY2hpbGRzX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCB1OCBidXMsIHU4IGRldl9mbikKK3sKKwl1OCBmaWx0ZXJfZGF0YVsyXSA9IHtidXMsIGRldl9mbn07CisKKwlyZXR1cm4gc2Nhbl9PRl9wY2lfY2hpbGRzKG5vZGUsIHNjYW5fT0ZfcGNpX2NoaWxkc19pdGVyYXRvciwgZmlsdGVyX2RhdGEpOworfQorCisvKgorICogU2NhbnMgdGhlIE9GIHRyZWUgZm9yIGEgZGV2aWNlIG5vZGUgbWF0Y2hpbmcgYSBQQ0kgZGV2aWNlCisgKi8KK3N0cnVjdCBkZXZpY2Vfbm9kZSAqCitwY2lfYnVzZGV2X3RvX09GX25vZGUoc3RydWN0IHBjaV9idXMgKmJ1cywgaW50IGRldmZuKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJaW50IGJ1c25yOworCisJaWYgKCFoYXZlX29mKQorCQlyZXR1cm4gTlVMTDsKKwkKKwkvKiBMb29rdXAgdGhlIGhvc2UgKi8KKwlidXNuciA9IGJ1cy0+bnVtYmVyOworCWhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoYnVzbnIpOworCWlmICghaG9zZSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBDaGVjayBpdCBoYXMgYW4gT0Ygbm9kZSBhc3NvY2lhdGVkICovCisJbm9kZSA9IChzdHJ1Y3QgZGV2aWNlX25vZGUgKikgaG9zZS0+YXJjaF9kYXRhOworCWlmICghbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBGaXh1cCBidXMgbnVtYmVyIGFjY29yZGluZyB0byB3aGF0IE9GIHRoaW5rIGl0IGlzLiAqLworI2lmZGVmIENPTkZJR19QUENfUE1BQworCS8qIFRoZSBHNSBuZWVkIGEgc3BlY2lhbCBjYXNlIGhlcmUuIEJhc2ljYWxseSwgd2UgZG9uJ3QgcmVtYXAgYWxsCisJICogYnVzc2VzIG9uIGl0IHNvIHdlIGRvbid0IGNyZWF0ZSB0aGUgcGNpLU9GLW1hcC4gSG93ZXZlciwgd2UgZG8KKwkgKiByZW1hcCB0aGUgQUdQIGJ1cyBhbmQgc28gaGF2ZSB0byBkZWFsIHdpdGggaXQuIEEgZnV0dXJlIGJldHRlcgorCSAqIGZpeCBoYXMgdG8gYmUgZG9uZSBieSBtYWtpbmcgdGhlIHJlbWFwcGluZyBwZXItaG9zdCBhbmQgYWx3YXlzCisJICogZmlsbGluZyB0aGUgcGNpX3RvX09GIG1hcC4gLS1CZW5ICisJICovCisJaWYgKF9tYWNoaW5lID09IF9NQUNIX1BtYWMgJiYgYnVzbnIgPj0gMHhmMCkKKwkJYnVzbnIgLT0gMHhmMDsKKwllbHNlCisjZW5kaWYKKwlpZiAocGNpX3RvX09GX2J1c19tYXApCisJCWJ1c25yID0gcGNpX3RvX09GX2J1c19tYXBbYnVzbnJdOworCWlmIChidXNuciA9PSAweGZmKQorCQlyZXR1cm4gTlVMTDsKKwkKKwkvKiBOb3csIGxvb2t1cCBjaGlsZHMgb2YgdGhlIGhvc2UgKi8KKwlyZXR1cm4gc2Nhbl9PRl9jaGlsZHNfZm9yX2RldmljZShub2RlLT5jaGlsZCwgYnVzbnIsIGRldmZuKTsKK30KK0VYUE9SVF9TWU1CT0wocGNpX2J1c2Rldl90b19PRl9ub2RlKTsKKworc3RydWN0IGRldmljZV9ub2RlKgorcGNpX2RldmljZV90b19PRl9ub2RlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJcmV0dXJuIHBjaV9idXNkZXZfdG9fT0Zfbm9kZShkZXYtPmJ1cywgZGV2LT5kZXZmbik7Cit9CitFWFBPUlRfU1lNQk9MKHBjaV9kZXZpY2VfdG9fT0Zfbm9kZSk7CisKKy8qIFRoaXMgcm91dGluZSBpcyBtZWFudCB0byBiZSB1c2VkIGVhcmx5IGR1cmluZyBib290LCB3aGVuIHRoZQorICogUENJIGJ1cyBudW1iZXJzIGhhdmUgbm90IHlldCBiZWVuIGFzc2lnbmVkLCBhbmQgeW91IG5lZWQgdG8KKyAqIGlzc3VlIFBDSSBjb25maWcgY3ljbGVzIHRvIGFuIE9GIGRldmljZS4KKyAqIEl0IGNvdWxkIGFsc28gYmUgdXNlZCB0byAiZml4IiBSVEFTIGNvbmZpZyBjeWNsZXMgaWYgeW91IHdhbnQKKyAqIHRvIHNldCBwY2lfYXNzaWduX2FsbF9idXNlcyB0byAxIGFuZCBzdGlsbCB1c2UgUlRBUyBmb3IgUENJCisgKiBjb25maWcgY3ljbGVzLgorICovCitzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIHBjaV9maW5kX2hvc2VfZm9yX09GX2RldmljZShzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUpCit7CisJaWYgKCFoYXZlX29mKQorCQlyZXR1cm4gTlVMTDsKKwl3aGlsZShub2RlKSB7CisJCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZTsKKwkJZm9yIChob3NlPWhvc2VfaGVhZDtob3NlO2hvc2U9aG9zZS0+bmV4dCkKKwkJCWlmIChob3NlLT5hcmNoX2RhdGEgPT0gbm9kZSkKKwkJCQlyZXR1cm4gaG9zZTsKKwkJbm9kZT1ub2RlLT5wYXJlbnQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50CitmaW5kX09GX3BjaV9kZXZpY2VfZmlsdGVyKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgdm9pZCogZGF0YSkKK3sKKwlyZXR1cm4gKCh2b2lkICopbm9kZSA9PSBkYXRhKTsKK30KKworLyoKKyAqIFJldHVybnMgdGhlIFBDSSBkZXZpY2UgbWF0Y2hpbmcgYSBnaXZlbiBPRiBub2RlCisgKi8KK2ludAorcGNpX2RldmljZV9mcm9tX09GX25vZGUoc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCB1OCogYnVzLCB1OCogZGV2Zm4pCit7CisJdW5zaWduZWQgaW50ICpyZWc7CisJc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlOworCXN0cnVjdCBwY2lfZGV2KiBkZXYgPSBOVUxMOworCQorCWlmICghaGF2ZV9vZikKKwkJcmV0dXJuIC1FTk9ERVY7CisJLyogTWFrZSBzdXJlIGl0J3MgcmVhbGx5IGEgUENJIGRldmljZSAqLworCWhvc2UgPSBwY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2Uobm9kZSk7CisJaWYgKCFob3NlIHx8ICFob3NlLT5hcmNoX2RhdGEpCisJCXJldHVybiAtRU5PREVWOworCWlmICghc2Nhbl9PRl9wY2lfY2hpbGRzKCgoc3RydWN0IGRldmljZV9ub2RlKilob3NlLT5hcmNoX2RhdGEpLT5jaGlsZCwKKwkJCWZpbmRfT0ZfcGNpX2RldmljZV9maWx0ZXIsICh2b2lkICopbm9kZSkpCisJCXJldHVybiAtRU5PREVWOworCXJlZyA9ICh1bnNpZ25lZCBpbnQgKikgZ2V0X3Byb3BlcnR5KG5vZGUsICJyZWciLCBOVUxMKTsKKwlpZiAoIXJlZykKKwkJcmV0dXJuIC1FTk9ERVY7CisJKmJ1cyA9IChyZWdbMF0gPj4gMTYpICYgMHhmZjsKKwkqZGV2Zm4gPSAoKHJlZ1swXSA+PiA4KSAmIDB4ZmYpOworCisJLyogT2ssIGhlcmUgd2UgbmVlZCBzb21lIHR3ZWFrLiBJZiB3ZSBoYXZlIGFscmVhZHkgcmVudW1iZXJlZAorCSAqIGFsbCBidXNzZXMsIHdlIGNhbid0IHJlbHkgb24gdGhlIE9GIGJ1cyBudW1iZXIgYW55IG1vcmUuCisJICogdGhlIHBjaV90b19PRl9idXNfbWFwIGlzIG5vdCBlbm91Z2ggYXMgc2V2ZXJhbCBQQ0kgYnVzc2VzCisJICogbWF5IG1hdGNoIHRoZSBzYW1lIE9GIGJ1cyBudW1iZXIuCisJICovCisJaWYgKCFwY2lfdG9fT0ZfYnVzX21hcCkKKwkJcmV0dXJuIDA7CisKKwlmb3JfZWFjaF9wY2lfZGV2KGRldikKKwkJaWYgKHBjaV90b19PRl9idXNfbWFwW2Rldi0+YnVzLT5udW1iZXJdID09ICpidXMgJiYKKwkJCQlkZXYtPmRldmZuID09ICpkZXZmbikgeworCQkJKmJ1cyA9IGRldi0+YnVzLT5udW1iZXI7CisJCQlwY2lfZGV2X3B1dChkZXYpOworCQkJcmV0dXJuIDA7CisJCX0KKworCXJldHVybiAtRU5PREVWOworfQorRVhQT1JUX1NZTUJPTChwY2lfZGV2aWNlX2Zyb21fT0Zfbm9kZSk7CisKK3ZvaWQgX19pbml0CitwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCSAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgcHJpbWFyeSkKK3sKKwlzdGF0aWMgdW5zaWduZWQgaW50IHN0YXRpY19sY19yYW5nZXNbMjU2XSBfX2luaXRkYXRhOworCXVuc2lnbmVkIGludCAqZHRfcmFuZ2VzLCAqbGNfcmFuZ2VzLCAqcmFuZ2VzLCAqcHJldjsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwlpbnQgcmxlbiA9IDAsIG9yaWdfcmxlbjsKKwlpbnQgbWVtbm8gPSAwOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBucCwgbmEgPSBwcm9tX25fYWRkcl9jZWxscyhkZXYpOworCW5wID0gbmEgKyA1OworCisJLyogRmlyc3Qgd2UgdHJ5IHRvIG1lcmdlIHJhbmdlcyB0byBmaXggYSBwcm9ibGVtIHdpdGggc29tZSBwbWFjcworCSAqIHRoYXQgY2FuIGhhdmUgbW9yZSB0aGFuIDMgcmFuZ2VzLCBmb3J0dW5hdGVseSB1c2luZyBjb250aWd1b3VzCisJICogYWRkcmVzc2VzIC0tIEJlbkgKKwkgKi8KKwlkdF9yYW5nZXMgPSAodW5zaWduZWQgaW50ICopIGdldF9wcm9wZXJ0eShkZXYsICJyYW5nZXMiLCAmcmxlbik7CisJaWYgKCFkdF9yYW5nZXMpCisJCXJldHVybjsKKwkvKiBTYW5pdHkgY2hlY2ssIHRob3VnaCBob3BlZnVsbHkgdGhhdCBuZXZlciBoYXBwZW5zICovCisJaWYgKHJsZW4gPiBzaXplb2Yoc3RhdGljX2xjX3JhbmdlcykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiT0YgcmFuZ2VzIHByb3BlcnR5IHRvbyBsYXJnZSAhXG4iKTsKKwkJcmxlbiA9IHNpemVvZihzdGF0aWNfbGNfcmFuZ2VzKTsKKwl9CisJbGNfcmFuZ2VzID0gc3RhdGljX2xjX3JhbmdlczsKKwltZW1jcHkobGNfcmFuZ2VzLCBkdF9yYW5nZXMsIHJsZW4pOworCW9yaWdfcmxlbiA9IHJsZW47CisKKwkvKiBMZXQncyB3b3JrIG9uIGEgY29weSBvZiB0aGUgInJhbmdlcyIgcHJvcGVydHkgaW5zdGVhZCBvZiBkYW1hZ2luZworCSAqIHRoZSBkZXZpY2UtdHJlZSBpbWFnZSBpbiBtZW1vcnkKKwkgKi8KKwlyYW5nZXMgPSBsY19yYW5nZXM7CisJcHJldiA9IE5VTEw7CisJd2hpbGUgKChybGVuIC09IG5wICogc2l6ZW9mKHVuc2lnbmVkIGludCkpID49IDApIHsKKwkJaWYgKHByZXYpIHsKKwkJCWlmIChwcmV2WzBdID09IHJhbmdlc1swXSAmJiBwcmV2WzFdID09IHJhbmdlc1sxXSAmJgorCQkJCShwcmV2WzJdICsgcHJldltuYSs0XSkgPT0gcmFuZ2VzWzJdICYmCisJCQkJKHByZXZbbmErMl0gKyBwcmV2W25hKzRdKSA9PSByYW5nZXNbbmErMl0pIHsKKwkJCQlwcmV2W25hKzRdICs9IHJhbmdlc1tuYSs0XTsKKwkJCQlyYW5nZXNbMF0gPSAwOworCQkJCXJhbmdlcyArPSBucDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlwcmV2ID0gcmFuZ2VzOworCQlyYW5nZXMgKz0gbnA7CisJfQorCisJLyoKKwkgKiBUaGUgcmFuZ2VzIHByb3BlcnR5IGlzIGxhaWQgb3V0IGFzIGFuIGFycmF5IG9mIGVsZW1lbnRzLAorCSAqIGVhY2ggb2Ygd2hpY2ggY29tcHJpc2VzOgorCSAqICAgY2VsbHMgMCAtIDI6CWEgUENJIGFkZHJlc3MKKwkgKiAgIGNlbGxzIDMgb3IgMys0OglhIENQVSBwaHlzaWNhbCBhZGRyZXNzCisJICoJCQkoc2l6ZSBkZXBlbmRpbmcgb24gZGV2LT5uX2FkZHJfY2VsbHMpCisJICogICBjZWxscyA0KzUgb3IgNSs2Ogl0aGUgc2l6ZSBvZiB0aGUgcmFuZ2UKKwkgKi8KKwlyYW5nZXMgPSBsY19yYW5nZXM7CisJcmxlbiA9IG9yaWdfcmxlbjsKKwl3aGlsZSAocmFuZ2VzICYmIChybGVuIC09IG5wICogc2l6ZW9mKHVuc2lnbmVkIGludCkpID49IDApIHsKKwkJcmVzID0gTlVMTDsKKwkJc2l6ZSA9IHJhbmdlc1tuYSs0XTsKKwkJc3dpdGNoICgocmFuZ2VzWzBdID4+IDI0KSAmIDB4MykgeworCQljYXNlIDE6CQkvKiBJL08gc3BhY2UgKi8KKwkJCWlmIChyYW5nZXNbMl0gIT0gMCkKKwkJCQlicmVhazsKKwkJCWhvc2UtPmlvX2Jhc2VfcGh5cyA9IHJhbmdlc1tuYSsyXTsKKwkJCS8qIGxpbWl0IEkvTyBzcGFjZSB0byAxNk1CICovCisJCQlpZiAoc2l6ZSA+IDB4MDEwMDAwMDApCisJCQkJc2l6ZSA9IDB4MDEwMDAwMDA7CisJCQlob3NlLT5pb19iYXNlX3ZpcnQgPSBpb3JlbWFwKHJhbmdlc1tuYSsyXSwgc2l6ZSk7CisJCQlpZiAocHJpbWFyeSkKKwkJCQlpc2FfaW9fYmFzZSA9ICh1bnNpZ25lZCBsb25nKSBob3NlLT5pb19iYXNlX3ZpcnQ7CisJCQlyZXMgPSAmaG9zZS0+aW9fcmVzb3VyY2U7CisJCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKKwkJCXJlcy0+c3RhcnQgPSByYW5nZXNbMl07CisJCQlEQkcoIlBDSTogSU8gMHglbHggLT4gMHglbHhcbiIsCisJCQkJICAgIHJlcy0+c3RhcnQsIHJlcy0+c3RhcnQgKyBzaXplIC0gMSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgkJLyogbWVtb3J5IHNwYWNlICovCisJCQltZW1ubyA9IDA7CisJCQlpZiAocmFuZ2VzWzFdID09IDAgJiYgcmFuZ2VzWzJdID09IDAKKwkJCSAgICAmJiByYW5nZXNbbmErNF0gPD0gKDE2IDw8IDIwKSkgeworCQkJCS8qIDFzdCAxNk1CLCBpLmUuIElTQSBtZW1vcnkgYXJlYSAqLworCQkJCWlmIChwcmltYXJ5KQorCQkJCQlpc2FfbWVtX2Jhc2UgPSByYW5nZXNbbmErMl07CisJCQkJbWVtbm8gPSAxOworCQkJfQorCQkJd2hpbGUgKG1lbW5vIDwgMyAmJiBob3NlLT5tZW1fcmVzb3VyY2VzW21lbW5vXS5mbGFncykKKwkJCQkrK21lbW5vOworCQkJaWYgKG1lbW5vID09IDApCisJCQkJaG9zZS0+cGNpX21lbV9vZmZzZXQgPSByYW5nZXNbbmErMl0gLSByYW5nZXNbMl07CisJCQlpZiAobWVtbm8gPCAzKSB7CisJCQkJcmVzID0gJmhvc2UtPm1lbV9yZXNvdXJjZXNbbWVtbm9dOworCQkJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKKwkJCQlpZihyYW5nZXNbMF0gJiAweDQwMDAwMDAwKQorCQkJCQlyZXMtPmZsYWdzIHw9IElPUkVTT1VSQ0VfUFJFRkVUQ0g7CisJCQkJcmVzLT5zdGFydCA9IHJhbmdlc1tuYSsyXTsKKwkJCQlEQkcoIlBDSTogTUVNWyVkXSAweCVseCAtPiAweCVseFxuIiwgbWVtbm8sCisJCQkJCSAgICByZXMtPnN0YXJ0LCByZXMtPnN0YXJ0ICsgc2l6ZSAtIDEpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJlcyAhPSBOVUxMKSB7CisJCQlyZXMtPm5hbWUgPSBkZXYtPmZ1bGxfbmFtZTsKKwkJCXJlcy0+ZW5kID0gcmVzLT5zdGFydCArIHNpemUgLSAxOworCQkJcmVzLT5wYXJlbnQgPSBOVUxMOworCQkJcmVzLT5zaWJsaW5nID0gTlVMTDsKKwkJCXJlcy0+Y2hpbGQgPSBOVUxMOworCQl9CisJCXJhbmdlcyArPSBucDsKKwl9Cit9CisKKy8qIFdlIGNyZWF0ZSB0aGUgInBjaS1PRi1idXMtbWFwIiBwcm9wZXJ0eSBub3cgc28gaXQgYXBwZWFycyBpbiB0aGUKKyAqIC9wcm9jIGRldmljZSB0cmVlCisgKi8KK3ZvaWQgX19pbml0CitwY2lfY3JlYXRlX09GX2J1c19tYXAodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkqIG9mX3Byb3A7CisJCisJb2ZfcHJvcCA9IChzdHJ1Y3QgcHJvcGVydHkqKSBhbGxvY19ib290bWVtKHNpemVvZihzdHJ1Y3QgcHJvcGVydHkpICsgMjU2KTsKKwlpZiAob2ZfcHJvcCAmJiBmaW5kX3BhdGhfZGV2aWNlKCIvIikpIHsKKwkJbWVtc2V0KG9mX3Byb3AsIC0xLCBzaXplb2Yoc3RydWN0IHByb3BlcnR5KSArIDI1Nik7CisJCW9mX3Byb3AtPm5hbWUgPSAicGNpLU9GLWJ1cy1tYXAiOworCQlvZl9wcm9wLT5sZW5ndGggPSAyNTY7CisJCW9mX3Byb3AtPnZhbHVlID0gKHVuc2lnbmVkIGNoYXIgKikmb2ZfcHJvcFsxXTsKKwkJcHJvbV9hZGRfcHJvcGVydHkoZmluZF9wYXRoX2RldmljZSgiLyIpLCBvZl9wcm9wKTsKKwl9Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBjaV9zaG93X2RldnNwZWMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlwZGV2ID0gdG9fcGNpX2RldiAoZGV2KTsKKwlucCA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwZGV2KTsKKwlpZiAobnAgPT0gTlVMTCB8fCBucC0+ZnVsbF9uYW1lID09IE5VTEwpCisJCXJldHVybiAwOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzIiwgbnAtPmZ1bGxfbmFtZSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoZGV2c3BlYywgU19JUlVHTywgcGNpX3Nob3dfZGV2c3BlYywgTlVMTCk7CisKKyNlbHNlIC8qIENPTkZJR19QUENfT0YgKi8KK3ZvaWQgcGNpYmlvc19tYWtlX09GX2J1c19tYXAodm9pZCkKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfUFBDX09GICovCisKKy8qIEFkZCBzeXNmcyBwcm9wZXJ0aWVzICovCit2b2lkIHBjaWJpb3NfYWRkX3BsYXRmb3JtX2VudHJpZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisjaWZkZWYgQ09ORklHX1BQQ19PRgorCWRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZGV2c3BlYyk7CisjZW5kaWYgLyogQ09ORklHX1BQQ19PRiAqLworfQorCisKKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKKy8qCisgKiBUaGlzIHNldCBvZiByb3V0aW5lcyBjaGVja3MgZm9yIFBDSTwtPlBDSSBicmlkZ2VzIHRoYXQgaGF2ZSBjbG9zZWQKKyAqIElPIHJlc291cmNlcyBhbmQgaGF2ZSBjaGlsZCBkZXZpY2VzLiBJdCB0cmllcyB0byByZS1vcGVuIGFuIElPCisgKiB3aW5kb3cgb24gdGhlbS4KKyAqCisgKiBUaGlzIGlzIGEgX3RlbXBvcmFyeV8gZml4IHRvIHdvcmthcm91bmQgYSBwcm9ibGVtIHdpdGggQXBwbGUncyBPRgorICogY2xvc2luZyBJTyB3aW5kb3dzIG9uIFAyUCBicmlkZ2VzIHdoZW4gdGhlIE9GIGRyaXZlcnMgb2YgY2FyZHMKKyAqIGJlbG93IHRoaXMgYnJpZGdlIGRvbid0IGNsYWltIGFueSBJTyByYW5nZSAodHlwaWNhbGx5IEFUSSBvcgorICogQWRhcHRlYykuCisgKgorICogQSBtb3JlIGNvbXBsZXRlIGZpeCB3b3VsZCBiZSB0byB1c2UgZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMsIHdoaWNoCisgKiBpbnZvbHZlcyBhIHdvcmtpbmcgcGNpYmlvc19maXh1cF9wYnVzX3JhbmdlcygpLCBzb21lIG1vcmUgY2FyZSBhYm91dAorICogb3JkZXJpbmcgd2hlbiBjcmVhdGluZyB0aGUgaG9zdCBidXMgcmVzb3VyY2VzLCBhbmQgbWF5YmUgYSBmZXcgbW9yZQorICogbWlub3IgdHdlYWtzCisgKi8KKworLyogSW5pdGlhbGl6ZSBicmlkZ2VzIHdpdGggYmFzZS9saW1pdCB2YWx1ZXMgd2UgaGF2ZSBjb2xsZWN0ZWQgKi8KK3N0YXRpYyB2b2lkIF9faW5pdAorZG9fdXBkYXRlX3AycF9pb19yZXNvdXJjZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBpbnQgZW5hYmxlX3ZnYSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlID0gYnVzLT5zZWxmOworCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSA9IChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKilicmlkZ2UtPnN5c2RhdGE7CisJdTMyIGw7CisJdTE2IHc7CisJc3RydWN0IHJlc291cmNlIHJlczsKKworCWlmIChidXMtPnJlc291cmNlWzBdID09IE5VTEwpCisJCXJldHVybjsKKyAJcmVzID0gKihidXMtPnJlc291cmNlWzBdKTsKKworCURCRygiUmVtYXBwaW5nIEJ1cyAlZCwgYnJpZGdlOiAlc1xuIiwgYnVzLT5udW1iZXIsIHBjaV9uYW1lKGJyaWRnZSkpOworCXJlcy5zdGFydCAtPSAoKHVuc2lnbmVkIGxvbmcpIGhvc2UtPmlvX2Jhc2VfdmlydCAtIGlzYV9pb19iYXNlKTsKKwlyZXMuZW5kIC09ICgodW5zaWduZWQgbG9uZykgaG9zZS0+aW9fYmFzZV92aXJ0IC0gaXNhX2lvX2Jhc2UpOworCURCRygiICBJTyB3aW5kb3c6ICUwOGx4LSUwOGx4XG4iLCByZXMuc3RhcnQsIHJlcy5lbmQpOworCisJLyogU2V0IHVwIHRoZSB0b3AgYW5kIGJvdHRvbSBvZiB0aGUgUENJIEkvTyBzZWdtZW50IGZvciB0aGlzIGJ1cy4gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfSU9fQkFTRSwgJmwpOworCWwgJj0gMHhmZmZmMDAwZjsKKwlsIHw9IChyZXMuc3RhcnQgPj4gOCkgJiAweDAwZjA7CisJbCB8PSByZXMuZW5kICYgMHhmMDAwOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfSU9fQkFTRSwgbCk7CisKKwlpZiAoKGwgJiBQQ0lfSU9fUkFOR0VfVFlQRV9NQVNLKSA9PSBQQ0lfSU9fUkFOR0VfVFlQRV8zMikgeworCQlsID0gKHJlcy5zdGFydCA+PiAxNikgfCAocmVzLmVuZCAmIDB4ZmZmZjAwMDApOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyaWRnZSwgUENJX0lPX0JBU0VfVVBQRVIxNiwgbCk7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYnJpZGdlLCBQQ0lfQ09NTUFORCwgJncpOworCXcgfD0gUENJX0NPTU1BTkRfSU87CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGJyaWRnZSwgUENJX0NPTU1BTkQsIHcpOworCisjaWYgMCAvKiBFbmFibGluZyB0aGlzIGNhdXNlcyBYRnJlZSA0LjIuMCB0byBoYW5nIGR1cmluZyBQQ0kgcHJvYmUgKi8KKwlpZiAoZW5hYmxlX3ZnYSkgeworCQlwY2lfcmVhZF9jb25maWdfd29yZChicmlkZ2UsIFBDSV9CUklER0VfQ09OVFJPTCwgJncpOworCQl3IHw9IFBDSV9CUklER0VfQ1RMX1ZHQTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGJyaWRnZSwgUENJX0JSSURHRV9DT05UUk9MLCB3KTsKKwl9CisjZW5kaWYKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBwcmV0dHkgYmFzaWMgYW5kIGFjdHVhbGx5IHF1aXRlIGJyb2tlbiBmb3IgdGhlCisgKiBnZW5lcmFsIGNhc2UsIGl0J3MgZW5vdWdoIGZvciB1cyByaWdodCBub3cgdGhvdWdoLiBJdCdzIHN1cHBvc2VkCisgKiB0byB0ZWxsIHVzIGlmIHdlIG5lZWQgdG8gb3BlbiBhbiBJTyByYW5nZSBhdCBhbGwgb3Igbm90IGFuZCB3aGF0CisgKiBzaXplLgorICovCitzdGF0aWMgaW50IF9faW5pdAorY2hlY2tfZm9yX2lvX2NoaWxkcyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBzdHJ1Y3QgcmVzb3VyY2UqIHJlcywgaW50ICpmb3VuZF92Z2EpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlpbnQJaTsKKwlpbnQJcmMgPSAwOworCisjZGVmaW5lIHB1c2hfZW5kKHJlcywgc2l6ZSkgZG8geyB1bnNpZ25lZCBsb25nIF9fc3ogPSAoc2l6ZSkgOyBcCisJcmVzLT5lbmQgPSAoKHJlcy0+ZW5kICsgX19zeikgLyAoX19zeiArIDEpKSAqIChfX3N6ICsgMSkgKyBfX3N6OyBcCisgICAgfSB3aGlsZSAoMCkKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgeworCQl1MTYgY2xhc3MgPSBkZXYtPmNsYXNzID4+IDg7CisKKwkJaWYgKGNsYXNzID09IFBDSV9DTEFTU19ESVNQTEFZX1ZHQSB8fAorCQkgICAgY2xhc3MgPT0gUENJX0NMQVNTX05PVF9ERUZJTkVEX1ZHQSkKKwkJCSpmb3VuZF92Z2EgPSAxOworCQlpZiAoY2xhc3MgPj4gOCA9PSBQQ0lfQkFTRV9DTEFTU19CUklER0UgJiYgZGV2LT5zdWJvcmRpbmF0ZSkKKwkJCXJjIHw9IGNoZWNrX2Zvcl9pb19jaGlsZHMoZGV2LT5zdWJvcmRpbmF0ZSwgcmVzLCBmb3VuZF92Z2EpOworCQlpZiAoY2xhc3MgPT0gUENJX0NMQVNTX0JSSURHRV9DQVJEQlVTKQorCQkJcHVzaF9lbmQocmVzLCAweGZmZik7CisKKwkJZm9yIChpPTA7IGk8UENJX05VTV9SRVNPVVJDRVM7IGkrKykgeworCQkJc3RydWN0IHJlc291cmNlICpyOworCQkJdW5zaWduZWQgbG9uZyByX3NpemU7CisKKwkJCWlmIChkZXYtPmNsYXNzID4+IDggPT0gUENJX0NMQVNTX0JSSURHRV9QQ0kKKwkJCSAgICAmJiBpID49IFBDSV9CUklER0VfUkVTT1VSQ0VTKQorCQkJCWNvbnRpbnVlOworCQkJciA9ICZkZXYtPnJlc291cmNlW2ldOworCQkJcl9zaXplID0gci0+ZW5kIC0gci0+c3RhcnQ7CisJCQlpZiAocl9zaXplIDwgMHhmZmYpCisJCQkJcl9zaXplID0gMHhmZmY7CisJCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPICYmIChyX3NpemUpICE9IDApIHsKKwkJCQlyYyA9IDE7CisJCQkJcHVzaF9lbmQocmVzLCByX3NpemUpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBIZXJlIHdlIHNjYW4gYWxsIFAyUCBicmlkZ2VzIG9mIGEgZ2l2ZW4gbGV2ZWwgdGhhdCBoYXZlIGEgY2xvc2VkCisgKiBJTyB3aW5kb3cuIE5vdGUgdGhhdCB0aGUgdGVzdCBmb3IgdGhlIHByZXNlbmNlIG9mIGEgVkdBIGNhcmQgc2hvdWxkCisgKiBiZSBpbXByb3ZlZCB0byB0YWtlIGludG8gYWNjb3VudCBhbHJlYWR5IGNvbmZpZ3VyZWQgUDJQIGJyaWRnZXMsCisgKiBjdXJyZW50bHksIHdlIGRvbid0IHNlZSB0aGVtIGFuZCBtaWdodCBlbmQgdXAgY29uZmlndXJpbmcgMiBicmlkZ2VzCisgKiB3aXRoIFZHQSBwYXNzIHRocm91Z2ggZW5hYmxlZAorICovCitzdGF0aWMgdm9pZCBfX2luaXQKK2RvX2ZpeHVwX3AycF9sZXZlbChzdHJ1Y3QgcGNpX2J1cyAqYnVzKQoreworCXN0cnVjdCBwY2lfYnVzICpiOworCWludCBpLCBwYXJlbnRfaW87CisJaW50IGhhc192Z2EgPSAwOworCisJZm9yIChwYXJlbnRfaW89MDsgcGFyZW50X2lvPDQ7IHBhcmVudF9pbysrKQorCQlpZiAoYnVzLT5yZXNvdXJjZVtwYXJlbnRfaW9dCisJCSAgICAmJiBidXMtPnJlc291cmNlW3BhcmVudF9pb10tPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJCWJyZWFrOworCWlmIChwYXJlbnRfaW8gPj0gNCkKKwkJcmV0dXJuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShiLCAmYnVzLT5jaGlsZHJlbiwgbm9kZSkgeworCQlzdHJ1Y3QgcGNpX2RldiAqZCA9IGItPnNlbGY7CisJCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSA9IChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKilkLT5zeXNkYXRhOworCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IGItPnJlc291cmNlWzBdOworCQlzdHJ1Y3QgcmVzb3VyY2UgdG1wX3JlczsKKwkJdW5zaWduZWQgbG9uZyBtYXg7CisJCWludCBmb3VuZF92Z2EgPSAwOworCisJCW1lbXNldCgmdG1wX3JlcywgMCwgc2l6ZW9mKHRtcF9yZXMpKTsKKwkJdG1wX3Jlcy5zdGFydCA9IGJ1cy0+cmVzb3VyY2VbcGFyZW50X2lvXS0+c3RhcnQ7CisKKwkJLyogV2UgZG9uJ3QgbGV0IGxvdyBhZGRyZXNzZXMgZ28gdGhyb3VnaCB0aGF0IGNsb3NlZCBQMlAgYnJpZGdlLCB3ZWxsLAorCQkgKiB0aGF0IG1heSBub3QgYmUgbmVjZXNzYXJ5IGJ1dCBJIGZlZWwgc2FmZXIgdGhhdCB3YXkKKwkJICovCisJCWlmICh0bXBfcmVzLnN0YXJ0ID09IDApCisJCQl0bXBfcmVzLnN0YXJ0ID0gMHgxMDAwOworCQorCQlpZiAoIWxpc3RfZW1wdHkoJmItPmRldmljZXMpICYmIHJlcyAmJiByZXMtPmZsYWdzID09IDAgJiYKKwkJICAgIHJlcyAhPSBidXMtPnJlc291cmNlW3BhcmVudF9pb10gJiYKKwkJICAgIChkLT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfQlJJREdFX1BDSSAmJgorCQkgICAgY2hlY2tfZm9yX2lvX2NoaWxkcyhiLCAmdG1wX3JlcywgJmZvdW5kX3ZnYSkpIHsKKwkJCXU4IGlvX2Jhc2VfbG87CisKKwkJCXByaW50ayhLRVJOX0lORk8gIkZpeGluZyB1cCBJTyBidXMgJXNcbiIsIGItPm5hbWUpOworCisJCQlpZiAoZm91bmRfdmdhKSB7CisJCQkJaWYgKGhhc192Z2EpIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU2tpcHBpbmcgVkdBLCBhbHJlYWR5IGFjdGl2ZSIKKwkJCQkJICAgICIgb24gYnVzIHNlZ21lbnRcbiIpOworCQkJCQlmb3VuZF92Z2EgPSAwOworCQkJCX0gZWxzZQorCQkJCQloYXNfdmdhID0gMTsKKwkJCX0KKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGQsIFBDSV9JT19CQVNFLCAmaW9fYmFzZV9sbyk7CisKKwkJCWlmICgoaW9fYmFzZV9sbyAmIFBDSV9JT19SQU5HRV9UWVBFX01BU0spID09IFBDSV9JT19SQU5HRV9UWVBFXzMyKQorCQkJCW1heCA9ICgodW5zaWduZWQgbG9uZykgaG9zZS0+aW9fYmFzZV92aXJ0CisJCQkJCS0gaXNhX2lvX2Jhc2UpICsgMHhmZmZmZmZmZjsKKwkJCWVsc2UKKwkJCQltYXggPSAoKHVuc2lnbmVkIGxvbmcpIGhvc2UtPmlvX2Jhc2VfdmlydAorCQkJCQktIGlzYV9pb19iYXNlKSArIDB4ZmZmZjsKKworCQkJKnJlcyA9IHRtcF9yZXM7CisJCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKKwkJCXJlcy0+bmFtZSA9IGItPm5hbWU7CisJCQorCQkJLyogRmluZCBhIHJlc291cmNlIGluIHRoZSBwYXJlbnQgd2hlcmUgd2UgY2FuIGFsbG9jYXRlICovCisJCQlmb3IgKGkgPSAwIDsgaSA8IDQ7IGkrKykgeworCQkJCXN0cnVjdCByZXNvdXJjZSAqciA9IGJ1cy0+cmVzb3VyY2VbaV07CisJCQkJaWYgKCFyKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoKHItPmZsYWdzICYgSU9SRVNPVVJDRV9JTykgPT0gMCkKKwkJCQkJY29udGludWU7CisJCQkJREJHKCJUcnlpbmcgdG8gYWxsb2NhdGUgZnJvbSAlMDhseCwgc2l6ZSAlMDhseCBmcm9tIHBhcmVudCIKKwkJCQkgICAgIiByZXMgJWQ6ICUwOGx4IC0+ICUwOGx4XG4iLAorCQkJCQlyZXMtPnN0YXJ0LCByZXMtPmVuZCwgaSwgci0+c3RhcnQsIHItPmVuZCk7CisJCQkKKwkJCQlpZiAoYWxsb2NhdGVfcmVzb3VyY2UociwgcmVzLCByZXMtPmVuZCArIDEsIHJlcy0+c3RhcnQsIG1heCwKKwkJCQkgICAgcmVzLT5lbmQgKyAxLCBOVUxMLCBOVUxMKSA8IDApIHsKKwkJCQkJREJHKCJGYWlsZWQgIVxuIik7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlkb191cGRhdGVfcDJwX2lvX3Jlc291cmNlKGIsIGZvdW5kX3ZnYSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZG9fZml4dXBfcDJwX2xldmVsKGIpOworCX0KK30KKworc3RhdGljIHZvaWQKK3BjaWJpb3NfZml4dXBfcDJwX2JyaWRnZXModm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2J1cyAqYjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYiwgJnBjaV9yb290X2J1c2VzLCBub2RlKQorCQlkb19maXh1cF9wMnBfbGV2ZWwoYik7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KKworc3RhdGljIGludCBfX2luaXQKK3BjaWJpb3NfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOworCWludCBuZXh0X2J1c25vOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBQcm9iaW5nIFBDSSBoYXJkd2FyZVxuIik7CisKKwkvKiBTY2FuIGFsbCBvZiB0aGUgcmVjb3JkZWQgUENJIGNvbnRyb2xsZXJzLiAgKi8KKwlmb3IgKG5leHRfYnVzbm8gPSAwLCBob3NlID0gaG9zZV9oZWFkOyBob3NlOyBob3NlID0gaG9zZS0+bmV4dCkgeworCQlpZiAocGNpX2Fzc2lnbl9hbGxfYnVzZXMpCisJCQlob3NlLT5maXJzdF9idXNubyA9IG5leHRfYnVzbm87CisJCWhvc2UtPmxhc3RfYnVzbm8gPSAweGZmOworCQlidXMgPSBwY2lfc2Nhbl9idXMoaG9zZS0+Zmlyc3RfYnVzbm8sIGhvc2UtPm9wcywgaG9zZSk7CisJCWhvc2UtPmxhc3RfYnVzbm8gPSBidXMtPnN1Ym9yZGluYXRlOworCQlpZiAocGNpX2Fzc2lnbl9hbGxfYnVzZXMgfHwgbmV4dF9idXNubyA8PSBob3NlLT5sYXN0X2J1c25vKQorCQkJbmV4dF9idXNubyA9IGhvc2UtPmxhc3RfYnVzbm8gKyBwY2liaW9zX2Fzc2lnbl9idXNfb2Zmc2V0OworCX0KKwlwY2lfYnVzX2NvdW50ID0gbmV4dF9idXNubzsKKworCS8qIE9wZW5GaXJtd2FyZSBiYXNlZCBtYWNoaW5lcyBuZWVkIGEgbWFwIG9mIE9GIGJ1cworCSAqIG51bWJlcnMgdnMuIGtlcm5lbCBidXMgbnVtYmVycyBzaW5jZSB3ZSBtYXkgaGF2ZSB0bworCSAqIHJlbWFwIHRoZW0uCisJICovCisJaWYgKHBjaV9hc3NpZ25fYWxsX2J1c2VzICYmIGhhdmVfb2YpCisJCXBjaWJpb3NfbWFrZV9PRl9idXNfbWFwKCk7CisKKwkvKiBEbyBtYWNoaW5lIGRlcGVuZGVudCBQQ0kgaW50ZXJydXB0IHJvdXRpbmcgKi8KKwlpZiAocHBjX21kLnBjaV9zd2l6emxlICYmIHBwY19tZC5wY2lfbWFwX2lycSkKKwkJcGNpX2ZpeHVwX2lycXMocHBjX21kLnBjaV9zd2l6emxlLCBwcGNfbWQucGNpX21hcF9pcnEpOworCisJLyogQ2FsbCBtYWNoaW5lIGRlcGVuZGVudCBmaXh1cCAqLworCWlmIChwcGNfbWQucGNpYmlvc19maXh1cCkKKwkJcHBjX21kLnBjaWJpb3NfZml4dXAoKTsKKworCS8qIEFsbG9jYXRlIGFuZCBhc3NpZ24gcmVzb3VyY2VzICovCisJcGNpYmlvc19hbGxvY2F0ZV9idXNfcmVzb3VyY2VzKCZwY2lfcm9vdF9idXNlcyk7CisJcGNpYmlvc19hbGxvY2F0ZV9yZXNvdXJjZXMoMCk7CisJcGNpYmlvc19hbGxvY2F0ZV9yZXNvdXJjZXMoMSk7CisjaWZkZWYgQ09ORklHX1BQQ19QTUFDCisJcGNpYmlvc19maXh1cF9wMnBfYnJpZGdlcygpOworI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLworCXBjaWJpb3NfYXNzaWduX3Jlc291cmNlcygpOworCisJLyogQ2FsbCBtYWNoaW5lIGRlcGVuZGVudCBwb3N0LWluaXQgY29kZSAqLworCWlmIChwcGNfbWQucGNpYmlvc19hZnRlcl9pbml0KQorCQlwcGNfbWQucGNpYmlvc19hZnRlcl9pbml0KCk7CisKKwlyZXR1cm4gMDsKK30KKworc3Vic3lzX2luaXRjYWxsKHBjaWJpb3NfaW5pdCk7CisKK3Vuc2lnbmVkIGNoYXIgX19pbml0Citjb21tb25fc3dpenpsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1bnNpZ25lZCBjaGFyICpwaW5wKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGRldi0+c3lzZGF0YTsKKworCWlmIChkZXYtPmJ1cy0+bnVtYmVyICE9IGhvc2UtPmZpcnN0X2J1c25vKSB7CisJCXU4IHBpbiA9ICpwaW5wOworCQlkbyB7CisJCQlwaW4gPSBicmlkZ2Vfc3dpenpsZShwaW4sIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKTsKKwkJCS8qIE1vdmUgdXAgdGhlIGNoYWluIG9mIGJyaWRnZXMuICovCisJCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKKwkJfSB3aGlsZSAoZGV2LT5idXMtPnNlbGYpOworCQkqcGlucCA9IHBpbjsKKworCQkvKiBUaGUgc2xvdCBpcyB0aGUgaWRzZWwgb2YgdGhlIGxhc3QgYnJpZGdlLiAqLworCX0KKwlyZXR1cm4gUENJX1NMT1QoZGV2LT5kZXZmbik7Cit9CisKK3Vuc2lnbmVkIGxvbmcgcmVzb3VyY2VfZml4dXAoc3RydWN0IHBjaV9kZXYgKiBkZXYsIHN0cnVjdCByZXNvdXJjZSAqIHJlcywKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXJldHVybiBzdGFydDsKK30KKwordm9pZCBfX2luaXQgcGNpYmlvc19maXh1cF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSAoc3RydWN0IHBjaV9jb250cm9sbGVyICopIGJ1cy0+c3lzZGF0YTsKKwl1bnNpZ25lZCBsb25nIGlvX29mZnNldDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaTsKKworCWlvX29mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIGlzYV9pb19iYXNlOworCWlmIChidXMtPnBhcmVudCA9PSBOVUxMKSB7CisJCS8qIFRoaXMgaXMgYSBob3N0IGJyaWRnZSAtIGZpbGwgaW4gaXRzIHJlc291cmNlcyAqLworCQlob3NlLT5idXMgPSBidXM7CisKKwkJYnVzLT5yZXNvdXJjZVswXSA9IHJlcyA9ICZob3NlLT5pb19yZXNvdXJjZTsKKwkJaWYgKCFyZXMtPmZsYWdzKSB7CisJCQlpZiAoaW9fb2Zmc2V0KQorCQkJCXByaW50ayhLRVJOX0VSUiAiSS9PIHJlc291cmNlIG5vdCBzZXQgZm9yIGhvc3QiCisJCQkJICAgICAgICIgYnJpZGdlICVkXG4iLCBob3NlLT5pbmRleCk7CisJCQlyZXMtPnN0YXJ0ID0gMDsKKwkJCXJlcy0+ZW5kID0gSU9fU1BBQ0VfTElNSVQ7CisJCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKKwkJfQorCQlyZXMtPnN0YXJ0ICs9IGlvX29mZnNldDsKKwkJcmVzLT5lbmQgKz0gaW9fb2Zmc2V0OworCisJCWZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKKwkJCXJlcyA9ICZob3NlLT5tZW1fcmVzb3VyY2VzW2ldOworCQkJaWYgKCFyZXMtPmZsYWdzKSB7CisJCQkJaWYgKGkgPiAwKQorCQkJCQljb250aW51ZTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIk1lbW9yeSByZXNvdXJjZSBub3Qgc2V0IGZvciAiCisJCQkJICAgICAgICJob3N0IGJyaWRnZSAlZFxuIiwgaG9zZS0+aW5kZXgpOworCQkJCXJlcy0+c3RhcnQgPSBob3NlLT5wY2lfbWVtX29mZnNldDsKKwkJCQlyZXMtPmVuZCA9IH4wVTsKKwkJCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisJCQl9CisJCQlidXMtPnJlc291cmNlW2krMV0gPSByZXM7CisJCX0KKwl9IGVsc2UgeworCQkvKiBUaGlzIGlzIGEgc3Vib3JkaW5hdGUgYnJpZGdlICovCisJCXBjaV9yZWFkX2JyaWRnZV9iYXNlcyhidXMpOworCisJCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKwkJCWlmICgocmVzID0gYnVzLT5yZXNvdXJjZVtpXSkgPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCWlmICghcmVzLT5mbGFncykKKwkJCQljb250aW51ZTsKKwkJCWlmIChpb19vZmZzZXQgJiYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSkgeworCQkJCXJlcy0+c3RhcnQgKz0gaW9fb2Zmc2V0OworCQkJCXJlcy0+ZW5kICs9IGlvX29mZnNldDsKKwkJCX0gZWxzZSBpZiAoaG9zZS0+cGNpX21lbV9vZmZzZXQKKwkJCQkgICAmJiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSkgeworCQkJCXJlcy0+c3RhcnQgKz0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7CisJCQkJcmVzLT5lbmQgKz0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7CisJCQl9CisJCX0KKwl9CisKKwlpZiAocHBjX21kLnBjaWJpb3NfZml4dXBfYnVzKQorCQlwcGNfbWQucGNpYmlvc19maXh1cF9idXMoYnVzKTsKK30KKworY2hhciBfX2luaXQgKnBjaWJpb3Nfc2V0dXAoY2hhciAqc3RyKQoreworCXJldHVybiBzdHI7Cit9CisKKy8qIHRoZSBuZXh0IG9uZSBpcyBzdG9sZW4gZnJvbSB0aGUgYWxwaGEgcG9ydC4uLiAqLwordm9pZCBfX2luaXQKK3BjaWJpb3NfdXBkYXRlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgaXJxKQoreworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgaXJxKTsKKwkvKiBYWFggRklYTUUgLSB1cGRhdGUgT0YgZGV2aWNlIHRyZWUgbm9kZSBpbnRlcnJ1cHQgcHJvcGVydHkgKi8KK30KKworaW50IHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKK3sKKwl1MTYgY21kLCBvbGRfY21kOworCWludCBpZHg7CisJc3RydWN0IHJlc291cmNlICpyOworCisJaWYgKHBwY19tZC5wY2liaW9zX2VuYWJsZV9kZXZpY2VfaG9vaykKKwkJaWYgKHBwY19tZC5wY2liaW9zX2VuYWJsZV9kZXZpY2VfaG9vayhkZXYsIDApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCQorCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOworCW9sZF9jbWQgPSBjbWQ7CisJZm9yIChpZHg9MDsgaWR4PDY7IGlkeCsrKSB7CisJCXIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOworCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1VOU0VUKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlBDSTogRGV2aWNlICVzIG5vdCBhdmFpbGFibGUgYmVjYXVzZSBvZiByZXNvdXJjZSBjb2xsaXNpb25zXG4iLCBwY2lfbmFtZShkZXYpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCQljbWQgfD0gUENJX0NPTU1BTkRfSU87CisJCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQkJY21kIHw9IFBDSV9DT01NQU5EX01FTU9SWTsKKwl9CisJaWYgKGNtZCAhPSBvbGRfY21kKSB7CisJCXByaW50aygiUENJOiBFbmFibGluZyBkZXZpY2UgJXMgKCUwNHggLT4gJTA0eClcbiIsCisJCSAgICAgICBwY2lfbmFtZShkZXYpLCBvbGRfY21kLCBjbWQpOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwY2lfY29udHJvbGxlcioKK3BjaV9idXNfdG9faG9zZShpbnQgYnVzKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSA9IGhvc2VfaGVhZDsKKworCWZvciAoOyBob3NlOyBob3NlID0gaG9zZS0+bmV4dCkKKwkJaWYgKGJ1cyA+PSBob3NlLT5maXJzdF9idXNubyAmJiBidXMgPD0gaG9zZS0+bGFzdF9idXNubykKKwkJCXJldHVybiBob3NlOworCXJldHVybiBOVUxMOworfQorCit2b2lkIF9faW9tZW0gKgorcGNpX2J1c19pb19iYXNlKHVuc2lnbmVkIGludCBidXMpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOworCisJaG9zZSA9IHBjaV9idXNfdG9faG9zZShidXMpOworCWlmICghaG9zZSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGhvc2UtPmlvX2Jhc2VfdmlydDsKK30KKwordW5zaWduZWQgbG9uZworcGNpX2J1c19pb19iYXNlX3BoeXModW5zaWduZWQgaW50IGJ1cykKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CisKKwlob3NlID0gcGNpX2J1c190b19ob3NlKGJ1cyk7CisJaWYgKCFob3NlKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaG9zZS0+aW9fYmFzZV9waHlzOworfQorCit1bnNpZ25lZCBsb25nCitwY2lfYnVzX21lbV9iYXNlX3BoeXModW5zaWduZWQgaW50IGJ1cykKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CisKKwlob3NlID0gcGNpX2J1c190b19ob3NlKGJ1cyk7CisJaWYgKCFob3NlKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaG9zZS0+cGNpX21lbV9vZmZzZXQ7Cit9CisKK3Vuc2lnbmVkIGxvbmcKK3BjaV9yZXNvdXJjZV90b19idXMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzKQoreworCS8qIEhhY2sgYWxlcnQgYWdhaW4gISBTZWUgY29tbWVudHMgaW4gY2hycF9wY2kuYworCSAqLworCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSA9CisJCShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKilwZGV2LT5zeXNkYXRhOworCWlmIChob3NlICYmIHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJcmV0dXJuIHJlcy0+c3RhcnQgLSBob3NlLT5wY2lfbWVtX29mZnNldDsKKwkvKiBXZSBtYXkgd2FudCB0byBkbyBzb21ldGhpbmcgd2l0aCBJT3MgaGVyZS4uLiAqLworCXJldHVybiByZXMtPnN0YXJ0OworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKl9fcGNpX21tYXBfbWFrZV9vZmZzZXQoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm9mZnNldCwKKwkJCQkJICAgICAgIGVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoZGV2LT5idXMtPm51bWJlcik7CisJdW5zaWduZWQgbG9uZyBpb19vZmZzZXQgPSAwOworCWludCBpLCByZXNfYml0OworCisJaWYgKGhvc2UgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisKKwkvKiBJZiBtZW1vcnksIGFkZCBvbiB0aGUgUENJIGJyaWRnZSBhZGRyZXNzIG9mZnNldCAqLworCWlmIChtbWFwX3N0YXRlID09IHBjaV9tbWFwX21lbSkgeworCQkqb2Zmc2V0ICs9IGhvc2UtPnBjaV9tZW1fb2Zmc2V0OworCQlyZXNfYml0ID0gSU9SRVNPVVJDRV9NRU07CisJfSBlbHNlIHsKKwkJaW9fb2Zmc2V0ID0gaG9zZS0+aW9fYmFzZV92aXJ0IC0gX19fSU9fQkFTRTsKKwkJKm9mZnNldCArPSBpb19vZmZzZXQ7CisJCXJlc19iaXQgPSBJT1JFU09VUkNFX0lPOworCX0KKworCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgb2Zmc2V0IHJlcXVlc3RlZCBjb3JyZXNwb25kcyB0byBvbmUgb2YgdGhlCisJICogcmVzb3VyY2VzIG9mIHRoZSBkZXZpY2UuCisJICovCisJZm9yIChpID0gMDsgaSA8PSBQQ0lfUk9NX1JFU09VUkNFOyBpKyspIHsKKwkJc3RydWN0IHJlc291cmNlICpycCA9ICZkZXYtPnJlc291cmNlW2ldOworCQlpbnQgZmxhZ3MgPSBycC0+ZmxhZ3M7CisKKwkJLyogdHJlYXQgUk9NIGFzIG1lbW9yeSAoc2hvdWxkIGJlIGFscmVhZHkpICovCisJCWlmIChpID09IFBDSV9ST01fUkVTT1VSQ0UpCisJCQlmbGFncyB8PSBJT1JFU09VUkNFX01FTTsKKworCQkvKiBBY3RpdmUgYW5kIHNhbWUgdHlwZT8gKi8KKwkJaWYgKChmbGFncyAmIHJlc19iaXQpID09IDApCisJCQljb250aW51ZTsKKworCQkvKiBJbiB0aGUgcmFuZ2Ugb2YgdGhpcyByZXNvdXJjZT8gKi8KKwkJaWYgKCpvZmZzZXQgPCAocnAtPnN0YXJ0ICYgUEFHRV9NQVNLKSB8fCAqb2Zmc2V0ID4gcnAtPmVuZCkKKwkJCWNvbnRpbnVlOworCisJCS8qIGZvdW5kIGl0ISBjb25zdHJ1Y3QgdGhlIGZpbmFsIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwkJaWYgKG1tYXBfc3RhdGUgPT0gcGNpX21tYXBfaW8pCisJCQkqb2Zmc2V0ICs9IGhvc2UtPmlvX2Jhc2VfcGh5cyAtIGlvX29mZnNldDsKKwkJcmV0dXJuIHJwOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKgorICogU2V0IHZtX3BhZ2VfcHJvdCBvZiBWTUEsIGFzIGFwcHJvcHJpYXRlIGZvciB0aGlzIGFyY2hpdGVjdHVyZSwgZm9yIGEgcGNpCisgKiBkZXZpY2UgbWFwcGluZy4KKyAqLworc3RhdGljIHBncHJvdF90IF9fcGNpX21tYXBfc2V0X3BncHJvdChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJwLAorCQkJCSAgICAgIHBncHJvdF90IHByb3RlY3Rpb24sCisJCQkJICAgICAgZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlLAorCQkJCSAgICAgIGludCB3cml0ZV9jb21iaW5lKQoreworCXVuc2lnbmVkIGxvbmcgcHJvdCA9IHBncHJvdF92YWwocHJvdGVjdGlvbik7CisKKwkvKiBXcml0ZSBjb21iaW5lIGlzIGFsd2F5cyAwIG9uIG5vbi1tZW1vcnkgc3BhY2UgbWFwcGluZ3MuIE9uCisJICogbWVtb3J5IHNwYWNlLCBpZiB0aGUgdXNlciBkaWRuJ3QgcGFzcyAxLCB3ZSBjaGVjayBmb3IgYQorCSAqICJwcmVmZXRjaGFibGUiIHJlc291cmNlLiBUaGlzIGlzIGEgYml0IGhhY2tpc2gsIGJ1dCB3ZSB1c2UKKwkgKiB0aGlzIHRvIHdvcmthcm91bmQgdGhlIGluYWJpbGl0eSBvZiAvc3lzZnMgdG8gcHJvdmlkZSBhIHdyaXRlCisJICogY29tYmluZSBiaXQKKwkgKi8KKwlpZiAobW1hcF9zdGF0ZSAhPSBwY2lfbW1hcF9tZW0pCisJCXdyaXRlX2NvbWJpbmUgPSAwOworCWVsc2UgaWYgKHdyaXRlX2NvbWJpbmUgPT0gMCkgeworCQlpZiAocnAtPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkKKwkJCXdyaXRlX2NvbWJpbmUgPSAxOworCX0KKworCS8qIFhYWCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgYSB3YXkgdG8gYXNrIGZvciB3cml0ZS10aHJvdWdoICovCisJcHJvdCB8PSBfUEFHRV9OT19DQUNIRTsKKwlpZiAod3JpdGVfY29tYmluZSkKKwkJcHJvdCAmPSB+X1BBR0VfR1VBUkRFRDsKKwllbHNlCisJCXByb3QgfD0gX1BBR0VfR1VBUkRFRDsKKworCXByaW50aygiUENJIG1hcCBmb3IgJXM6JWx4LCBwcm90OiAlbHhcbiIsIHBjaV9uYW1lKGRldiksIHJwLT5zdGFydCwKKwkgICAgICAgcHJvdCk7CisKKwlyZXR1cm4gX19wZ3Byb3QocHJvdCk7Cit9CisKKy8qCisgKiBUaGlzIG9uZSBpcyB1c2VkIGJ5IC9kZXYvbWVtIGFuZCBmYmRldiB3aG8gaGF2ZSBubyBjbHVlIGFib3V0IHRoZQorICogUENJIGRldmljZSwgaXQgdHJpZXMgdG8gZmluZCB0aGUgUENJIGRldmljZSBmaXJzdCBhbmQgY2FsbHMgdGhlCisgKiBhYm92ZSByb3V0aW5lCisgKi8KK3BncHJvdF90IHBjaV9waHlzX21lbV9hY2Nlc3NfcHJvdChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgcGZuLAorCQkJCSAgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCSAgcGdwcm90X3QgcHJvdGVjdGlvbikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJc3RydWN0IHJlc291cmNlICpmb3VuZCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBwcm90ID0gcGdwcm90X3ZhbChwcm90ZWN0aW9uKTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHBmbiA8PCBQQUdFX1NISUZUOworCWludCBpOworCisJaWYgKHBhZ2VfaXNfcmFtKHBmbikpCisJCXJldHVybiBwcm90OworCisJcHJvdCB8PSBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQ7CisKKwlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKKwkJZm9yIChpID0gMDsgaSA8PSBQQ0lfUk9NX1JFU09VUkNFOyBpKyspIHsKKwkJCXN0cnVjdCByZXNvdXJjZSAqcnAgPSAmcGRldi0+cmVzb3VyY2VbaV07CisJCQlpbnQgZmxhZ3MgPSBycC0+ZmxhZ3M7CisKKwkJCS8qIEFjdGl2ZSBhbmQgc2FtZSB0eXBlPyAqLworCQkJaWYgKChmbGFncyAmIElPUkVTT1VSQ0VfTUVNKSA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJLyogSW4gdGhlIHJhbmdlIG9mIHRoaXMgcmVzb3VyY2U/ICovCisJCQlpZiAob2Zmc2V0IDwgKHJwLT5zdGFydCAmIFBBR0VfTUFTSykgfHwKKwkJCSAgICBvZmZzZXQgPiBycC0+ZW5kKQorCQkJCWNvbnRpbnVlOworCQkJZm91bmQgPSBycDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChmb3VuZCkKKwkJCWJyZWFrOworCX0KKwlpZiAoZm91bmQpIHsKKwkJaWYgKGZvdW5kLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpCisJCQlwcm90ICY9IH5fUEFHRV9HVUFSREVEOworCQlwY2lfZGV2X3B1dChwZGV2KTsKKwl9CisKKwlEQkcoIm5vbi1QQ0kgbWFwIGZvciAlbHgsIHByb3Q6ICVseFxuIiwgb2Zmc2V0LCBwcm90KTsKKworCXJldHVybiBfX3BncHJvdChwcm90KTsKK30KKworCisvKgorICogUGVyZm9ybSB0aGUgYWN0dWFsIHJlbWFwIG9mIHRoZSBwYWdlcyBmb3IgYSBQQ0kgZGV2aWNlIG1hcHBpbmcsIGFzCisgKiBhcHByb3ByaWF0ZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICBUaGUgcmVnaW9uIGluIHRoZSBwcm9jZXNzIHRvIG1hcAorICogaXMgZGVzY3JpYmVkIGJ5IHZtX3N0YXJ0IGFuZCB2bV9lbmQgbWVtYmVycyBvZiBWTUEsIHRoZSBiYXNlIHBoeXNpY2FsCisgKiBhZGRyZXNzIGlzIGZvdW5kIGluIHZtX3Bnb2ZmLgorICogVGhlIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGlzIHByb3ZpZGVkIHNvIHRoYXQgYXJjaGl0ZWN0dXJlcyBtYXkgbWFrZSBtYXBwaW5nCisgKiBkZWNpc2lvbnMgb24gYSBwZXItZGV2aWNlIG9yIHBlci1idXMgYmFzaXMuCisgKgorICogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZSwgemVybyBvbiBzdWNjZXNzLgorICovCitpbnQgcGNpX21tYXBfcGFnZV9yYW5nZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCWVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwKKwkJCWludCB3cml0ZV9jb21iaW5lKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCXN0cnVjdCByZXNvdXJjZSAqcnA7CisJaW50IHJldDsKKworCXJwID0gX19wY2lfbW1hcF9tYWtlX29mZnNldChkZXYsICZvZmZzZXQsIG1tYXBfc3RhdGUpOworCWlmIChycCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZtYS0+dm1fcGdvZmYgPSBvZmZzZXQgPj4gUEFHRV9TSElGVDsKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX1NITSB8IFZNX0xPQ0tFRCB8IFZNX0lPOworCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wY2lfbW1hcF9zZXRfcGdwcm90KGRldiwgcnAsCisJCQkJCQkgIHZtYS0+dm1fcGFnZV9wcm90LAorCQkJCQkJICBtbWFwX3N0YXRlLCB3cml0ZV9jb21iaW5lKTsKKworCXJldCA9IHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGdvZmYsCisJCQkgICAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBPYnNvbGV0ZSBmdW5jdGlvbnMuIFNob3VsZCBiZSByZW1vdmVkIG9uY2UgdGhlIHN5bWJpb3MgZHJpdmVyCisgKiBpcyBmaXhlZAorICovCit1bnNpZ25lZCBsb25nCitwaHlzX3RvX2J1cyh1bnNpZ25lZCBsb25nIHBhKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKKwlpbnQgaTsKKworCWZvciAoaG9zZSA9IGhvc2VfaGVhZDsgaG9zZTsgaG9zZSA9IGhvc2UtPm5leHQpIHsKKwkJZm9yIChpID0gMDsgaSA8IDM7ICsraSkgeworCQkJaWYgKHBhID49IGhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uc3RhcnQKKwkJCSAgICAmJiBwYSA8PSBob3NlLT5tZW1fcmVzb3VyY2VzW2ldLmVuZCkgeworCQkJCS8qCisJCQkJICogWFhYIHRoZSBob3NlLT5wY2lfbWVtX29mZnNldCByZWFsbHkKKwkJCQkgKiBvbmx5IGFwcGxpZXMgdG8gbWVtX3Jlc291cmNlc1swXS4KKwkJCQkgKiBXZSBuZWVkIGEgd2F5IHRvIHN0b3JlIGFuIG9mZnNldCBmb3IKKwkJCQkgKiB0aGUgb3RoZXJzLiAgLS0gcGF1bHVzCisJCQkJICovCisJCQkJaWYgKGkgPT0gMCkKKwkJCQkJcGEgLT0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7CisJCQkJcmV0dXJuIHBhOworCQkJfQorCQl9CisJfQorCS8qIGhtbW0sIGRpZG4ndCBmaW5kIGl0ICovCisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcKK3BjaV9waHlzX3RvX2J1cyh1bnNpZ25lZCBsb25nIHBhLCBpbnQgYnVzbnIpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlID0gcGNpX2J1c190b19ob3NlKGJ1c25yKTsKKwlpZiAoIWhvc2UpCisJCXJldHVybiBwYTsKKwlyZXR1cm4gcGEgLSBob3NlLT5wY2lfbWVtX29mZnNldDsKK30KKwordW5zaWduZWQgbG9uZworcGNpX2J1c190b19waHlzKHVuc2lnbmVkIGludCBiYSwgaW50IGJ1c25yKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSA9IHBjaV9idXNfdG9faG9zZShidXNucik7CisJaWYgKCFob3NlKQorCQlyZXR1cm4gYmE7CisJcmV0dXJuIGJhICsgaG9zZS0+cGNpX21lbV9vZmZzZXQ7Cit9CisKKy8qIFByb3ZpZGUgaW5mb3JtYXRpb24gb24gbG9jYXRpb25zIG9mIHZhcmlvdXMgSS9PIHJlZ2lvbnMgaW4gcGh5c2ljYWwKKyAqIG1lbW9yeS4gIERvIHRoaXMgb24gYSBwZXItY2FyZCBiYXNpcyBzbyB0aGF0IHdlIGNob29zZSB0aGUgcmlnaHQKKyAqIHJvb3QgYnJpZGdlLgorICogTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBJTyBvciBtZW1vcnkgYmFzZSBpcyBhIHBoeXNpY2FsIGFkZHJlc3MKKyAqLworCitsb25nIHN5c19wY2ljb25maWdfaW9iYXNlKGxvbmcgd2hpY2gsIHVuc2lnbmVkIGxvbmcgYnVzLCB1bnNpZ25lZCBsb25nIGRldmZuKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZTsKKwlsb25nIHJlc3VsdCA9IC1FT1BOT1RTVVBQOworCisJLyogQXJnaCAhIFBsZWFzZSBmb3JnaXZlIG1lIGZvciB0aGF0IGhhY2ssIGJ1dCB0aGF0J3MgdGhlCisJICogc2ltcGxlc3Qgd2F5IHRvIGdldCBleGlzdGluZyBYRnJlZSB0byBub3QgbG9ja3VwIG9uIHNvbWUKKwkgKiBHNSBtYWNoaW5lcy4uLiBTbyB3aGVuIHNvbWV0aGluZyBhc2tzIGZvciBidXMgMCBpbyBiYXNlCisJICogKGJ1cyAwIGlzIEhUIHJvb3QpLCB3ZSByZXR1cm4gdGhlIEFHUCBvbmUgaW5zdGVhZC4KKwkgKi8KKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKKwlpZiAoX21hY2hpbmUgPT0gX01BQ0hfUG1hYyAmJiBtYWNoaW5lX2lzX2NvbXBhdGlibGUoIk1hY1JJU0M0IikpCisJCWlmIChidXMgPT0gMCkKKwkJCWJ1cyA9IDB4ZjA7CisjZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCisKKwlob3NlID0gcGNpX2J1c190b19ob3NlKGJ1cyk7CisJaWYgKCFob3NlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN3aXRjaCAod2hpY2gpIHsKKwljYXNlIElPQkFTRV9CUklER0VfTlVNQkVSOgorCQlyZXR1cm4gKGxvbmcpaG9zZS0+Zmlyc3RfYnVzbm87CisJY2FzZSBJT0JBU0VfTUVNT1JZOgorCQlyZXR1cm4gKGxvbmcpaG9zZS0+cGNpX21lbV9vZmZzZXQ7CisJY2FzZSBJT0JBU0VfSU86CisJCXJldHVybiAobG9uZylob3NlLT5pb19iYXNlX3BoeXM7CisJY2FzZSBJT0JBU0VfSVNBX0lPOgorCQlyZXR1cm4gKGxvbmcpaXNhX2lvX2Jhc2U7CisJY2FzZSBJT0JBU0VfSVNBX01FTToKKwkJcmV0dXJuIChsb25nKWlzYV9tZW1fYmFzZTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCit2b2lkIHBjaV9yZXNvdXJjZV90b191c2VyKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBiYXIsCisJCQkgIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcnNyYywKKwkJCSAgdTY0ICpzdGFydCwgdTY0ICplbmQpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3NlKGRldi0+YnVzLT5udW1iZXIpOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKKworCWlmIChob3NlID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChyc3JjLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCW9mZnNldCA9IF9fX0lPX0JBU0UgLSBob3NlLT5pb19iYXNlX3ZpcnQgKyBob3NlLT5pb19iYXNlX3BoeXM7CisKKwkqc3RhcnQgPSByc3JjLT5zdGFydCArIG9mZnNldDsKKwkqZW5kID0gcnNyYy0+ZW5kICsgb2Zmc2V0OworfQorCit2b2lkIF9faW5pdAorcGNpX2luaXRfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLAorCQkgIGludCBmbGFncywgY2hhciAqbmFtZSkKK3sKKwlyZXMtPnN0YXJ0ID0gc3RhcnQ7CisJcmVzLT5lbmQgPSBlbmQ7CisJcmVzLT5mbGFncyA9IGZsYWdzOworCXJlcy0+bmFtZSA9IG5hbWU7CisJcmVzLT5wYXJlbnQgPSBOVUxMOworCXJlcy0+c2libGluZyA9IE5VTEw7CisJcmVzLT5jaGlsZCA9IE5VTEw7Cit9CisKK3ZvaWQgX19pb21lbSAqcGNpX2lvbWFwKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBiYXIsIHVuc2lnbmVkIGxvbmcgbWF4KQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCBiYXIpOworCXVuc2lnbmVkIGxvbmcgbGVuID0gcGNpX3Jlc291cmNlX2xlbihkZXYsIGJhcik7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFncyhkZXYsIGJhcik7CisKKwlpZiAoIWxlbikKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG1heCAmJiBsZW4gPiBtYXgpCisJCWxlbiA9IG1heDsKKwlpZiAoZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQorCQlyZXR1cm4gaW9wb3J0X21hcChzdGFydCwgbGVuKTsKKwlpZiAoZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJLyogTm90IGNoZWNraW5nIElPUkVTT1VSQ0VfQ0FDSEVBQkxFIGJlY2F1c2UgUFBDIGRvZXMKKwkJICogbm90IGN1cnJlbnRseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIGlvcmVtYXAgYW5kCisJCSAqIGlvcmVtYXBfbm9jYWNoZS4KKwkJICovCisJCXJldHVybiBpb3JlbWFwKHN0YXJ0LCBsZW4pOworCS8qIFdoYXQ/ICovCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgcGNpX2lvdW5tYXAoc3RydWN0IHBjaV9kZXYgKmRldiwgdm9pZCBfX2lvbWVtICphZGRyKQoreworCS8qIE5vdGhpbmcgdG8gZG8gKi8KK30KK0VYUE9SVF9TWU1CT0wocGNpX2lvbWFwKTsKK0VYUE9SVF9TWU1CT0wocGNpX2lvdW5tYXApOworCit1bnNpZ25lZCBsb25nIHBjaV9hZGRyZXNzX3RvX3BpbyhwaHlzX2FkZHJfdCBhZGRyZXNzKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSA9IGhvc2VfaGVhZDsKKworCWZvciAoOyBob3NlOyBob3NlID0gaG9zZS0+bmV4dCkgeworCQl1bnNpZ25lZCBpbnQgc2l6ZSA9IGhvc2UtPmlvX3Jlc291cmNlLmVuZCAtCisJCQlob3NlLT5pb19yZXNvdXJjZS5zdGFydCArIDE7CisJCWlmIChhZGRyZXNzID49IGhvc2UtPmlvX2Jhc2VfcGh5cyAmJgorCQkgICAgYWRkcmVzcyA8IChob3NlLT5pb19iYXNlX3BoeXMgKyBzaXplKSkgeworCQkJdW5zaWduZWQgbG9uZyBiYXNlID0KKwkJCQkodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBfSU9fQkFTRTsKKwkJCXJldHVybiBiYXNlICsgKGFkZHJlc3MgLSBob3NlLT5pb19iYXNlX3BoeXMpOworCQl9CisJfQorCXJldHVybiAodW5zaWduZWQgaW50KS0xOworfQorRVhQT1JUX1NZTUJPTChwY2lfYWRkcmVzc190b19waW8pOworCisvKgorICogTnVsbCBQQ0kgY29uZmlnIGFjY2VzcyBmdW5jdGlvbnMsIGZvciB0aGUgY2FzZSB3aGVuIHdlIGNhbid0CisgKiBmaW5kIGEgaG9zZS4KKyAqLworI2RlZmluZSBOVUxMX1BDSV9PUChydywgc2l6ZSwgdHlwZSkJCQkJCVwKK3N0YXRpYyBpbnQJCQkJCQkJCVwKK251bGxfIyNydyMjX2NvbmZpZ18jI3NpemUoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG9mZnNldCwgdHlwZSB2YWwpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsgICAgCQkJCVwKK30KKworc3RhdGljIGludAorbnVsbF9yZWFkX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCBvZmZzZXQsCisJCSBpbnQgbGVuLCB1MzIgKnZhbCkKK3sKKwlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworfQorCitzdGF0aWMgaW50CitudWxsX3dyaXRlX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCBvZmZzZXQsCisJCSAgaW50IGxlbiwgdTMyIHZhbCkKK3sKKwlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9vcHMgbnVsbF9wY2lfb3BzID0KK3sKKwludWxsX3JlYWRfY29uZmlnLAorCW51bGxfd3JpdGVfY29uZmlnCit9OworCisvKgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGVhcmx5IG9uIGJlZm9yZSBQQ0kgc2Nhbm5pbmcgaXMgZG9uZQorICogYW5kIGFsbCBvZiB0aGUgcGNpX2RldiBhbmQgcGNpX2J1cyBzdHJ1Y3R1cmVzIGhhdmUgYmVlbiBjcmVhdGVkLgorICovCitzdGF0aWMgc3RydWN0IHBjaV9idXMgKgorZmFrZV9wY2lfYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IGJ1c25yKQoreworCXN0YXRpYyBzdHJ1Y3QgcGNpX2J1cyBidXM7CisKKwlpZiAoaG9zZSA9PSAwKSB7CisJCWhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoYnVzbnIpOworCQlpZiAoaG9zZSA9PSAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBmaW5kIGhvc2UgZm9yIFBDSSBidXMgJWQhXG4iLCBidXNucik7CisJfQorCWJ1cy5udW1iZXIgPSBidXNucjsKKwlidXMuc3lzZGF0YSA9IGhvc2U7CisJYnVzLm9wcyA9IGhvc2U/IGhvc2UtPm9wczogJm51bGxfcGNpX29wczsKKwlyZXR1cm4gJmJ1czsKK30KKworI2RlZmluZSBFQVJMWV9QQ0lfT1AocncsIHNpemUsIHR5cGUpCQkJCQlcCitpbnQgZWFybHlfIyNydyMjX2NvbmZpZ18jI3NpemUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBpbnQgYnVzLAlcCisJCQkgICAgICAgaW50IGRldmZuLCBpbnQgb2Zmc2V0LCB0eXBlIHZhbHVlKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBwY2lfYnVzXyMjcncjI19jb25maWdfIyNzaXplKGZha2VfcGNpX2J1cyhob3NlLCBidXMpLAlcCisJCQkJCSAgICBkZXZmbiwgb2Zmc2V0LCB2YWx1ZSk7CVwKK30KKworRUFSTFlfUENJX09QKHJlYWQsIGJ5dGUsIHU4ICopCitFQVJMWV9QQ0lfT1AocmVhZCwgd29yZCwgdTE2ICopCitFQVJMWV9QQ0lfT1AocmVhZCwgZHdvcmQsIHUzMiAqKQorRUFSTFlfUENJX09QKHdyaXRlLCBieXRlLCB1OCkKK0VBUkxZX1BDSV9PUCh3cml0ZSwgd29yZCwgdTE2KQorRUFSTFlfUENJX09QKHdyaXRlLCBkd29yZCwgdTMyKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKaW5kZXggOGI2MDA4YS4uYzM2NzUyMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCkBAIC0zNCw3ICszNCw3IEBACiAKICNpZmRlZiBERUJVRwogI2luY2x1ZGUgPGFzbS91ZGJnLmg+Ci0jZGVmaW5lIERCRyhmbXQuLi4pIHVkYmdfcHJpbnRmKGZtdCkKKyNkZWZpbmUgREJHKGZtdC4uLikgcHJpbnRrKGZtdCkKICNlbHNlCiAjZGVmaW5lIERCRyhmbXQuLi4pCiAjZW5kaWYKQEAgLTUzLDYgKzUzLDcgQEAKICNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KIHN0YXRpYyB2b2lkIGZpeHVwX3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcmVzLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIHN0YXRpYyB2b2lkIGRvX2J1c19zZXR1cChzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKK3N0YXRpYyB2b2lkIHBoYnNfcmVtYXBfaW8odm9pZCk7CiAjZW5kaWYKIAogLyogcGNpX2lvX2Jhc2UgLS0gdGhlIGJhc2UgYWRkcmVzcyBmcm9tIHdoaWNoIGlvIGJhcnMgYXJlIG9mZnNldHMuCkBAIC0yNTEsNyArMjUyLDggQEAKIAkJa2ZyZWUocGhiKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHBjaWJpb3NfY2xhaW1fb25lX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYikKKyNpZm5kZWYgQ09ORklHX1BQQ19JU0VSSUVTCit2b2lkIF9fZGV2aW5pdCBwY2liaW9zX2NsYWltX29uZV9idXMoc3RydWN0IHBjaV9idXMgKmIpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldjsKIAlzdHJ1Y3QgcGNpX2J1cyAqY2hpbGRfYnVzOwpAQCAtMjcxLDggKzI3MywxMCBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGRfYnVzLCAmYi0+Y2hpbGRyZW4sIG5vZGUpCiAJCXBjaWJpb3NfY2xhaW1fb25lX2J1cyhjaGlsZF9idXMpOwogfQorI2lmZGVmIENPTkZJR19IT1RQTFVHCitFWFBPUlRfU1lNQk9MX0dQTChwY2liaW9zX2NsYWltX29uZV9idXMpOworI2VuZGlmCiAKLSNpZm5kZWYgQ09ORklHX1BQQ19JU0VSSUVTCiBzdGF0aWMgdm9pZCBfX2luaXQgcGNpYmlvc19jbGFpbV9vZl9zZXR1cCh2b2lkKQogewogCXN0cnVjdCBwY2lfYnVzICpiOwpAQCAtMzIzLDYgKzMyNyw3IEBACiAJYWRkcnMgPSAodTMyICopIGdldF9wcm9wZXJ0eShub2RlLCAiYXNzaWduZWQtYWRkcmVzc2VzIiwgJnByb3BsZW4pOwogCWlmICghYWRkcnMpCiAJCXJldHVybjsKKwlEQkcoIiAgICBwYXJzZSBhZGRyZXNzZXMgKCVkIGJ5dGVzKSBAICVwXG4iLCBwcm9wbGVuLCBhZGRycyk7CiAJZm9yICg7IHByb3BsZW4gPj0gMjA7IHByb3BsZW4gLT0gMjAsIGFkZHJzICs9IDUpIHsKIAkJZmxhZ3MgPSBwY2lfcGFyc2Vfb2ZfZmxhZ3MoYWRkcnNbMF0pOwogCQlpZiAoIWZsYWdzKQpAQCAtMzMyLDYgKzMzNyw5IEBACiAJCWlmICghc2l6ZSkKIAkJCWNvbnRpbnVlOwogCQlpID0gYWRkcnNbMF0gJiAweGZmOworCQlEQkcoIiAgYmFzZTogJWxseCwgc2l6ZTogJWxseCwgaTogJXhcbiIsCisJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWJhc2UsICh1bnNpZ25lZCBsb25nIGxvbmcpc2l6ZSwgaSk7CisKIAkJaWYgKFBDSV9CQVNFX0FERFJFU1NfMCA8PSBpICYmIGkgPD0gUENJX0JBU0VfQUREUkVTU181KSB7CiAJCQlyZXMgPSAmZGV2LT5yZXNvdXJjZVsoaSAtIFBDSV9CQVNFX0FERFJFU1NfMCkgPj4gMl07CiAJCX0gZWxzZSBpZiAoaSA9PSBkZXYtPnJvbV9iYXNlX3JlZykgewpAQCAtMzYyLDYgKzM3MCw4IEBACiAJaWYgKHR5cGUgPT0gTlVMTCkKIAkJdHlwZSA9ICIiOwogCisJREJHKCIgICAgY3JlYXRlIGRldmljZSwgZGV2Zm46ICV4LCB0eXBlOiAlc1xuIiwgZGV2Zm4sIHR5cGUpOworCiAJbWVtc2V0KGRldiwgMCwgc2l6ZW9mKHN0cnVjdCBwY2lfZGV2KSk7CiAJZGV2LT5idXMgPSBidXM7CiAJZGV2LT5zeXNkYXRhID0gbm9kZTsKQEAgLTM3NSwxMiArMzg1LDE0IEBACiAJZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID0gZ2V0X2ludF9wcm9wKG5vZGUsICJzdWJzeXN0ZW0tdmVuZG9yLWlkIiwgMCk7CiAJZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID0gZ2V0X2ludF9wcm9wKG5vZGUsICJzdWJzeXN0ZW0taWQiLCAwKTsKIAotCWRldi0+Y2ZnX3NpemUgPSAyNTY7IC8qcGNpX2NmZ19zcGFjZV9zaXplKGRldik7Ki8KKwlkZXYtPmNmZ19zaXplID0gcGNpX2NmZ19zcGFjZV9zaXplKGRldik7CiAKIAlzcHJpbnRmKHBjaV9uYW1lKGRldiksICIlMDR4OiUwMng6JTAyeC4lZCIsIHBjaV9kb21haW5fbnIoYnVzKSwKIAkJZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QoZGV2Zm4pLCBQQ0lfRlVOQyhkZXZmbikpOwogCWRldi0+Y2xhc3MgPSBnZXRfaW50X3Byb3Aobm9kZSwgImNsYXNzLWNvZGUiLCAwKTsKIAorCURCRygiICAgIGNsYXNzOiAweCV4XG4iLCBkZXYtPmNsYXNzKTsKKwogCWRldi0+Y3VycmVudF9zdGF0ZSA9IDQ7CQkvKiB1bmtub3duIHBvd2VyIHN0YXRlICovCiAKIAlpZiAoIXN0cmNtcCh0eXBlLCAicGNpIikpIHsKQEAgLTQwMiw2ICs0MTQsOCBAQAogCiAJcGNpX3BhcnNlX29mX2FkZHJzKG5vZGUsIGRldik7CiAKKwlEQkcoIiAgICBhZGRpbmcgdG8gc3lzdGVtIC4uLlxuIik7CisKIAlwY2lfZGV2aWNlX2FkZChkZXYsIGJ1cyk7CiAKIAkvKiBYWFggcGNpX3NjYW5fbXNpX2RldmljZShkZXYpOyAqLwpAQCAtNDE4LDE1ICs0MzIsMjEgQEAKIAlpbnQgcmVnbGVuLCBkZXZmbjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwogCisJREJHKCJvZl9zY2FuX2J1cyglcykgYnVzIG5vICVkLi4uIFxuIiwgbm9kZS0+ZnVsbF9uYW1lLCBidXMtPm51bWJlcik7CisKIAl3aGlsZSAoKGNoaWxkID0gb2ZfZ2V0X25leHRfY2hpbGQobm9kZSwgY2hpbGQpKSAhPSBOVUxMKSB7CisJCURCRygiICAqICVzXG4iLCBjaGlsZC0+ZnVsbF9uYW1lKTsKIAkJcmVnID0gKHUzMiAqKSBnZXRfcHJvcGVydHkoY2hpbGQsICJyZWciLCAmcmVnbGVuKTsKIAkJaWYgKHJlZyA9PSBOVUxMIHx8IHJlZ2xlbiA8IDIwKQogCQkJY29udGludWU7CiAJCWRldmZuID0gKHJlZ1swXSA+PiA4KSAmIDB4ZmY7CisKIAkJLyogY3JlYXRlIGEgbmV3IHBjaV9kZXYgZm9yIHRoaXMgZGV2aWNlICovCiAJCWRldiA9IG9mX2NyZWF0ZV9wY2lfZGV2KGNoaWxkLCBidXMsIGRldmZuKTsKIAkJaWYgKCFkZXYpCiAJCQljb250aW51ZTsKKwkJREJHKCJkZXYgaGVhZGVyIHR5cGU6ICV4XG4iLCBkZXYtPmhkcl90eXBlKTsKKwogCQlpZiAoZGV2LT5oZHJfdHlwZSA9PSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFIHx8CiAJCSAgICBkZXYtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9DQVJEQlVTKQogCQkJb2Zfc2Nhbl9wY2lfYnJpZGdlKGNoaWxkLCBkZXYpOwpAQCAtNDQ2LDE2ICs0NjYsMTggQEAKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAJdTY0IHNpemU7CiAKKwlEQkcoIm9mX3NjYW5fcGNpX2JyaWRnZSglcylcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisKIAkvKiBwYXJzZSBidXMtcmFuZ2UgcHJvcGVydHkgKi8KIAlidXNyYW5nZSA9ICh1MzIgKikgZ2V0X3Byb3BlcnR5KG5vZGUsICJidXMtcmFuZ2UiLCAmbGVuKTsKIAlpZiAoYnVzcmFuZ2UgPT0gTlVMTCB8fCBsZW4gIT0gOCkgewotCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IGdldCBidXMtcmFuZ2UgZm9yIFBDSS1QQ0kgYnJpZGdlICVzXG4iLAorCQlwcmludGsoS0VSTl9ERUJVRyAiQ2FuJ3QgZ2V0IGJ1cy1yYW5nZSBmb3IgUENJLVBDSSBicmlkZ2UgJXNcbiIsCiAJCSAgICAgICBub2RlLT5mdWxsX25hbWUpOwogCQlyZXR1cm47CiAJfQogCXJhbmdlcyA9ICh1MzIgKikgZ2V0X3Byb3BlcnR5KG5vZGUsICJyYW5nZXMiLCAmbGVuKTsKIAlpZiAocmFuZ2VzID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBnZXQgcmFuZ2VzIGZvciBQQ0ktUENJIGJyaWRnZSAlc1xuIiwKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNhbid0IGdldCByYW5nZXMgZm9yIFBDSS1QQ0kgYnJpZGdlICVzXG4iLAogCQkgICAgICAgbm9kZS0+ZnVsbF9uYW1lKTsKIAkJcmV0dXJuOwogCX0KQEAgLTUwOSwxMCArNTMxLDEzIEBACiAJfQogCXNwcmludGYoYnVzLT5uYW1lLCAiUENJIEJ1cyAlMDR4OiUwMngiLCBwY2lfZG9tYWluX25yKGJ1cyksCiAJCWJ1cy0+bnVtYmVyKTsKKwlEQkcoIiAgICBidXMgbmFtZTogJXNcbiIsIGJ1cy0+bmFtZSk7CiAKIAltb2RlID0gUENJX1BST0JFX05PUk1BTDsKIAlpZiAocHBjX21kLnBjaV9wcm9iZV9tb2RlKQogCQltb2RlID0gcHBjX21kLnBjaV9wcm9iZV9tb2RlKGJ1cyk7CisJREJHKCIgICAgcHJvYmUgbW9kZTogJWRcbiIsIG1vZGUpOworCiAJaWYgKG1vZGUgPT0gUENJX1BST0JFX0RFVlRSRUUpCiAJCW9mX3NjYW5fYnVzKG5vZGUsIGJ1cyk7CiAJZWxzZSBpZiAobW9kZSA9PSBQQ0lfUFJPQkVfTk9STUFMKQpAQCAtNTI4LDYgKzU1Myw4IEBACiAJaW50IGksIG1vZGU7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAKKwlEQkcoIlNjYW5uaW5nIFBIQiAlc1xuIiwgbm9kZSA/IG5vZGUtPmZ1bGxfbmFtZSA6ICI8Tk8gTkFNRT4iKTsKKwogCWJ1cyA9IHBjaV9jcmVhdGVfYnVzKE5VTEwsIGhvc2UtPmZpcnN0X2J1c25vLCBob3NlLT5vcHMsIG5vZGUpOwogCWlmIChidXMgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBjcmVhdGUgYnVzIGZvciBQQ0kgZG9tYWluICUwNHhcbiIsCkBAIC01NTIsOCArNTc5LDkgQEAKIAogCW1vZGUgPSBQQ0lfUFJPQkVfTk9STUFMOwogI2lmZGVmIENPTkZJR19QUENfTVVMVElQTEFURk9STQotCWlmIChwcGNfbWQucGNpX3Byb2JlX21vZGUpCisJaWYgKG5vZGUgJiYgcHBjX21kLnBjaV9wcm9iZV9tb2RlKQogCQltb2RlID0gcHBjX21kLnBjaV9wcm9iZV9tb2RlKGJ1cyk7CisJREJHKCIgICAgcHJvYmUgbW9kZTogJWRcbiIsIG1vZGUpOwogCWlmIChtb2RlID09IFBDSV9QUk9CRV9ERVZUUkVFKSB7CiAJCWJ1cy0+c3Vib3JkaW5hdGUgPSBob3NlLT5sYXN0X2J1c25vOwogCQlvZl9zY2FuX2J1cyhub2RlLCBidXMpOwpAQCAtODQyLDggKzg3MCw3IEBACiAgKiBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLCB6ZXJvIG9uIHN1Y2Nlc3MuCiAgKi8KIGludCBwY2lfbW1hcF9wYWdlX3JhbmdlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlLAotCQkJaW50IHdyaXRlX2NvbWJpbmUpCisJCQllbnVtIHBjaV9tbWFwX3N0YXRlIG1tYXBfc3RhdGUsIGludCB3cml0ZV9jb21iaW5lKQogewogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOwogCXN0cnVjdCByZXNvdXJjZSAqcnA7CkBAIC04OTYsNiArOTIzLDI1IEBACiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBwaGJfaW9fYmFzZV9waHlzLAogCQkJCSAgICAgIHZvaWQgX19pb21lbSAqIHBoYl9pb19iYXNlX3ZpcnQpCiB7CisJLyogUmVtb3ZlIHRoZXNlIGFzYXAgKi8KKworCXN0cnVjdCBwY2lfYWRkcmVzcyB7CisJCXUzMiBhX2hpOworCQl1MzIgYV9taWQ7CisJCXUzMiBhX2xvOworCX07CisKKwlzdHJ1Y3QgaXNhX2FkZHJlc3MgeworCQl1MzIgYV9oaTsKKwkJdTMyIGFfbG87CisJfTsKKworCXN0cnVjdCBpc2FfcmFuZ2UgeworCQlzdHJ1Y3QgaXNhX2FkZHJlc3MgaXNhX2FkZHI7CisJCXN0cnVjdCBwY2lfYWRkcmVzcyBwY2lfYWRkcjsKKwkJdW5zaWduZWQgaW50IHNpemU7CisJfTsKKwogCXN0cnVjdCBpc2FfcmFuZ2UgKnJhbmdlOwogCXVuc2lnbmVkIGxvbmcgcGNpX2FkZHI7CiAJdW5zaWduZWQgaW50IGlzYV9hZGRyOwpAQCAtMTE3Myw3ICsxMjE5LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0wocmVtYXBfYnVzX3JhbmdlKTsKIAotdm9pZCBwaGJzX3JlbWFwX2lvKHZvaWQpCitzdGF0aWMgdm9pZCBwaGJzX3JlbWFwX2lvKHZvaWQpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOwogCkBAIC0xMjIzLDYgKzEyNjksNyBAQAogfQogRVhQT1JUX1NZTUJPTChwY2liaW9zX2ZpeHVwX2RldmljZV9yZXNvdXJjZXMpOwogCisKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBkb19idXNfc2V0dXAoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwpAQCAtMTMwNiw4ICsxMzUzLDM4IEBACiAJKmVuZCA9IHJzcmMtPmVuZCArIG9mZnNldDsKIH0KIAorc3RydWN0IHBjaV9jb250cm9sbGVyKiBwY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2Uoc3RydWN0IGRldmljZV9ub2RlKiBub2RlKQoreworCWlmICghaGF2ZV9vZikKKwkJcmV0dXJuIE5VTEw7CisJd2hpbGUobm9kZSkgeworCQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3NlLCB0bXAsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkKKwkJCWlmIChob3NlLT5hcmNoX2RhdGEgPT0gbm9kZSkKKwkJCQlyZXR1cm4gaG9zZTsKKwkJbm9kZSA9IG5vZGUtPnBhcmVudDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0gKi8KIAordW5zaWduZWQgbG9uZyBwY2lfYWRkcmVzc190b19waW8ocGh5c19hZGRyX3QgYWRkcmVzcykKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaG9zZSwgdG1wLCAmaG9zZV9saXN0LCBsaXN0X25vZGUpIHsKKwkJaWYgKGFkZHJlc3MgPj0gaG9zZS0+aW9fYmFzZV9waHlzICYmCisJCSAgICBhZGRyZXNzIDwgKGhvc2UtPmlvX2Jhc2VfcGh5cyArIGhvc2UtPnBjaV9pb19zaXplKSkgeworCQkJdW5zaWduZWQgbG9uZyBiYXNlID0KKwkJCQkodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBwY2lfaW9fYmFzZTsKKwkJCXJldHVybiBiYXNlICsgKGFkZHJlc3MgLSBob3NlLT5pb19iYXNlX3BoeXMpOworCQl9CisJfQorCXJldHVybiAodW5zaWduZWQgaW50KS0xOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX2FkZHJlc3NfdG9fcGlvKTsKKwogCiAjZGVmaW5lIElPQkFTRV9CUklER0VfTlVNQkVSCTAKICNkZWZpbmUgSU9CQVNFX01FTU9SWQkJMQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wbWMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG1jLmMKaW5kZXggMmQzMzNjYy4uZTZmYjE5NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wbWMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BtYy5jCkBAIC00Myw4ICs0MywxMyBAQAogCW10c3ByKFNQUk5fTU1DUjAsIG1tY3IwKTsKIH0KICNlbHNlCisvKiBFbnN1cmUgZXhjZXB0aW9ucyBhcmUgZGlzYWJsZWQgKi8KIHN0YXRpYyB2b2lkIGR1bW15X3BlcmYoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CisJdW5zaWduZWQgaW50IG1tY3IwID0gbWZzcHIoU1BSTl9NTUNSMCk7CisKKwltbWNyMCAmPSB+KE1NQ1IwX1BNWEUpOworCW10c3ByKFNQUk5fTU1DUjAsIG1tY3IwKTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYwppbmRleCA5NGRiMjU3Li5kOWE0NTljIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMKQEAgLTc2LDExICs3Niw2IEBACiBFWFBPUlRfU1lNQk9MKHN5c19zaWdyZXR1cm4pOwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19QUENfUFJFUCkKLUVYUE9SVF9TWU1CT0woX3ByZXBfdHlwZSk7Ci1FWFBPUlRfU1lNQk9MKHVjU3lzdGVtVHlwZSk7Ci0jZW5kaWYKLQogRVhQT1JUX1NZTUJPTChzdHJjcHkpOwogRVhQT1JUX1NZTUJPTChzdHJuY3B5KTsKIEVYUE9SVF9TWU1CT0woc3RyY2F0KTsKQEAgLTIzNSw4ICsyMzAsNyBAQAogRVhQT1JUX1NZTUJPTChjcG1faW5zdGFsbF9oYW5kbGVyKTsKIEVYUE9SVF9TWU1CT0woY3BtX2ZyZWVfaGFuZGxlcik7CiAjZW5kaWYgLyogQ09ORklHXzh4eCAqLwotI2lmIGRlZmluZWQoQ09ORklHXzh4eCkgfHwgZGVmaW5lZChDT05GSUdfNDB4KSB8fCBkZWZpbmVkKENPTkZJR184NXh4KSB8fFwKLQlkZWZpbmVkKENPTkZJR184M3h4KQorI2lmIGRlZmluZWQoQ09ORklHXzh4eCkgfHwgZGVmaW5lZChDT05GSUdfNDB4KQogRVhQT1JUX1NZTUJPTChfX3Jlcyk7CiAjZW5kaWYKIApAQCAtMjQ5LDcgKzI0Myw2IEBACiBleHRlcm4gbG9uZyBtb2xfdHJhbXBvbGluZTsKIEVYUE9SVF9TWU1CT0wobW9sX3RyYW1wb2xpbmUpOyAvKiBGb3IgTU9MICovCiBFWFBPUlRfU1lNQk9MKGZsdXNoX2hhc2hfcGFnZXMpOyAvKiBGb3IgTU9MICovCi1FWFBPUlRfU1lNQk9MX0dQTChfX2hhbmRsZV9tbV9mYXVsdCk7IC8qIEZvciBNT0wgKi8KICNpZmRlZiBDT05GSUdfU01QCiBleHRlcm4gaW50IG1tdV9oYXNoX2xvY2s7CiBFWFBPUlRfU1lNQk9MKG1tdV9oYXNoX2xvY2spOyAvKiBGb3IgTU9MICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDEwNWQ1NjAuLjU3NzAzOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0yMDEsMTMgKzIwMSwxMyBAQAogfQogI2VuZGlmIC8qIENPTkZJR19TUEUgKi8KIAorI2lmbmRlZiBDT05GSUdfU01QCiAvKgogICogSWYgd2UgYXJlIGRvaW5nIGxhenkgc3dpdGNoaW5nIG9mIENQVSBzdGF0ZSAoRlAsIGFsdGl2ZWMgb3IgU1BFKSwKICAqIGFuZCB0aGUgY3VycmVudCB0YXNrIGhhcyBzb21lIHN0YXRlLCBkaXNjYXJkIGl0LgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZGlzY2FyZF9sYXp5X2NwdV9zdGF0ZSh2b2lkKQordm9pZCBkaXNjYXJkX2xhenlfY3B1X3N0YXRlKHZvaWQpCiB7Ci0jaWZuZGVmIENPTkZJR19TTVAKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAlpZiAobGFzdF90YXNrX3VzZWRfbWF0aCA9PSBjdXJyZW50KQogCQlsYXN0X3Rhc2tfdXNlZF9tYXRoID0gTlVMTDsKQEAgLTIyMCw5ICsyMjAsMTAgQEAKIAkJbGFzdF90YXNrX3VzZWRfc3BlID0gTlVMTDsKICNlbmRpZgogCXByZWVtcHRfZW5hYmxlKCk7Ci0jZW5kaWYgLyogQ09ORklHX1NNUCAqLwogfQorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAorI2lmZGVmIENPTkZJR19QUENfTUVSR0UJCS8qIFhYWCBmb3Igbm93ICovCiBpbnQgc2V0X2RhYnIodW5zaWduZWQgbG9uZyBkYWJyKQogewogCWlmIChwcGNfbWQuc2V0X2RhYnIpCkBAIC0yMzEsNiArMjMyLDcgQEAKIAltdHNwcihTUFJOX0RBQlIsIGRhYnIpOwogCXJldHVybiAwOwogfQorI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUFBDNjQKIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVfdXNhZ2UsIGNwdV91c2FnZV9hcnJheSk7CkBAIC00MjQsNyArNDI2LDcgQEAKIAlpZiAodHJhcCA9PSAweDMwMCB8fCB0cmFwID09IDB4NjAwKQogCQlwcmludGsoIkRBUjogIlJFRyIsIERTSVNSOiAiUkVHIlxuIiwgcmVncy0+ZGFyLCByZWdzLT5kc2lzcik7CiAJcHJpbnRrKCJUQVNLID0gJXBbJWRdICclcycgVEhSRUFEOiAlcCIsCi0JICAgICAgIGN1cnJlbnQsIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+Y29tbSwgY3VycmVudC0+dGhyZWFkX2luZm8pOworCSAgICAgICBjdXJyZW50LCBjdXJyZW50LT5waWQsIGN1cnJlbnQtPmNvbW0sIHRhc2tfdGhyZWFkX2luZm8oY3VycmVudCkpOwogCiAjaWZkZWYgQ09ORklHX1NNUAogCXByaW50aygiIENQVTogJWQiLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwpAQCAtNTAzLDcgKzUwNSw3IEBACiB7CiAJc3RydWN0IHB0X3JlZ3MgKmNoaWxkcmVncywgKmtyZWdzOwogCWV4dGVybiB2b2lkIHJldF9mcm9tX2Zvcmsodm9pZCk7Ci0JdW5zaWduZWQgbG9uZyBzcCA9ICh1bnNpZ25lZCBsb25nKXAtPnRocmVhZF9pbmZvICsgVEhSRUFEX1NJWkU7CisJdW5zaWduZWQgbG9uZyBzcCA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShwKSArIFRIUkVBRF9TSVpFOwogCiAJQ0hFQ0tfRlVMTF9SRUdTKHJlZ3MpOwogCS8qIENvcHkgcmVnaXN0ZXJzICovCkBAIC01MTYsNyArNTE4LDcgQEAKICNpZmRlZiBDT05GSUdfUFBDMzIKIAkJY2hpbGRyZWdzLT5ncHJbMl0gPSAodW5zaWduZWQgbG9uZykgcDsKICNlbHNlCi0JCWNsZWFyX3RpX3RocmVhZF9mbGFnKHAtPnRocmVhZF9pbmZvLCBUSUZfMzJCSVQpOworCQljbGVhcl90c2tfdGhyZWFkX2ZsYWcocCwgVElGXzMyQklUKTsKICNlbmRpZgogCQlwLT50aHJlYWQucmVncyA9IE5VTEw7CS8qIG5vIHVzZXIgcmVnaXN0ZXIgc3RhdGUgKi8KIAl9IGVsc2UgewpAQCAtNTg4LDEwICs1OTAsOCBAQAogCSAqIHNldC4gIERvIGl0IG5vdy4KIAkgKi8KIAlpZiAoIWN1cnJlbnQtPnRocmVhZC5yZWdzKSB7Ci0JCXVuc2lnbmVkIGxvbmcgY2hpbGRyZWdzID0gKHVuc2lnbmVkIGxvbmcpY3VycmVudC0+dGhyZWFkX2luZm8gKwotCQkJCQkJVEhSRUFEX1NJWkU7Ci0JCWNoaWxkcmVncyAtPSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpOwotCQljdXJyZW50LT50aHJlYWQucmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKWNoaWxkcmVnczsKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3N0YWNrX3BhZ2UoY3VycmVudCkgKyBUSFJFQURfU0laRTsKKwkJY3VycmVudC0+dGhyZWFkLnJlZ3MgPSByZWdzIC0gMTsKIAl9CiAKIAltZW1zZXQocmVncy0+Z3ByLCAwLCBzaXplb2YocmVncy0+Z3ByKSk7CkBAIC03NjcsNyArNzY3LDcgQEAKIHN0YXRpYyBpbnQgdmFsaWRhdGVfc3AodW5zaWduZWQgbG9uZyBzcCwgc3RydWN0IHRhc2tfc3RydWN0ICpwLAogCQkgICAgICAgdW5zaWduZWQgbG9uZyBuYnl0ZXMpCiB7Ci0JdW5zaWduZWQgbG9uZyBzdGFja19wYWdlID0gKHVuc2lnbmVkIGxvbmcpcC0+dGhyZWFkX2luZm87CisJdW5zaWduZWQgbG9uZyBzdGFja19wYWdlID0gKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHApOwogCiAJaWYgKHNwID49IHN0YWNrX3BhZ2UgKyBzaXplb2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QpCiAJICAgICYmIHNwIDw9IHN0YWNrX3BhZ2UgKyBUSFJFQURfU0laRSAtIG5ieXRlcykKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMKaW5kZXggM2JmOTY4ZS4uZDUwYzhkZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vcnRhcy5oPgpAQCAtMzcsNiArMzgsNyBAQAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2tkdW1wLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vbW11Lmg+CkBAIC01NSwyMSArNTcsNiBAQAogI2RlZmluZSBEQkcoZm10Li4uKQogI2VuZGlmCiAKLXN0cnVjdCBwY2lfcmVnX3Byb3BlcnR5IHsKLQlzdHJ1Y3QgcGNpX2FkZHJlc3MgYWRkcjsKLQl1MzIgc2l6ZV9oaTsKLQl1MzIgc2l6ZV9sbzsKLX07Ci0KLXN0cnVjdCBpc2FfcmVnX3Byb3BlcnR5IHsKLQl1MzIgc3BhY2U7Ci0JdTMyIGFkZHJlc3M7Ci0JdTMyIHNpemU7Ci19OwotCi0KLXR5cGVkZWYgaW50IGludGVycHJldF9mdW5jKHN0cnVjdCBkZXZpY2Vfbm9kZSAqLCB1bnNpZ25lZCBsb25nICosCi0JCQkgICBpbnQsIGludCwgaW50KTsKIAogc3RhdGljIGludCBfX2luaXRkYXRhIGR0X3Jvb3RfYWRkcl9jZWxsczsKIHN0YXRpYyBpbnQgX19pbml0ZGF0YSBkdF9yb290X3NpemVfY2VsbHM7CkBAIC0zMTEsNiArMjk4LDE2IEBACiAJaW50IGksIGosIG4sIHNlbnNlOwogCXVuc2lnbmVkIGludCAqaXJxLCB2aXJxOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaWM7CisJaW50IHRyYWNlID0gMDsKKworCS8vI2RlZmluZSBUUkFDRShmbXQuLi4pIGRvIHsgaWYgKHRyYWNlKSB7IHByaW50ayhmbXQpOyBtZGVsYXkoMTAwMCk7IH0gfSB3aGlsZSgwKQorI2RlZmluZSBUUkFDRShmbXQuLi4pCisKKwlpZiAoIXN0cmNtcChucC0+bmFtZSwgInNtdS1kb29yYmVsbCIpKQorCQl0cmFjZSA9IDE7CisKKwlUUkFDRSgiRmluaXNoaW5nIFNNVSBkb29yYmVsbCAhIG51bV9pbnRlcnJ1cHRfY29udHJvbGxlcnMgPSAlZFxuIiwKKwkgICAgICBudW1faW50ZXJydXB0X2NvbnRyb2xsZXJzKTsKIAogCWlmIChudW1faW50ZXJydXB0X2NvbnRyb2xsZXJzID09IDApIHsKIAkJLyoKQEAgLTM0NSwxMSArMzQyLDEyIEBACiAJfQogCiAJaW50cyA9ICh1bnNpZ25lZCBpbnQgKikgZ2V0X3Byb3BlcnR5KG5wLCAiaW50ZXJydXB0cyIsICZpbnRsZW4pOworCVRSQUNFKCJpbnRzPSVwLCBpbnRsZW49JWRcbiIsIGludHMsIGludGxlbik7CiAJaWYgKGludHMgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAJaW50cmNlbGxzID0gcHJvbV9uX2ludHJfY2VsbHMobnApOwogCWludGxlbiAvPSBpbnRyY2VsbHMgKiBzaXplb2YodW5zaWduZWQgaW50KTsKLQorCVRSQUNFKCJpbnRyY2VsbHM9JWQsIG5ldyBpbnRsZW49JWRcbiIsIGludHJjZWxscywgaW50bGVuKTsKIAlucC0+aW50cnMgPSBwcm9tX2FsbG9jKGludGxlbiAqIHNpemVvZigqKG5wLT5pbnRycykpLCBtZW1fc3RhcnQpOwogCWlmICghbnAtPmludHJzKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTM2MCw2ICszNTgsNyBAQAogCWludHJjb3VudCA9IDA7CiAJZm9yIChpID0gMDsgaSA8IGludGxlbjsgKytpLCBpbnRzICs9IGludHJjZWxscykgewogCQluID0gbWFwX2ludGVycnVwdCgmaXJxLCAmaWMsIG5wLCBpbnRzLCBpbnRyY2VsbHMpOworCQlUUkFDRSgibWFwLCBpcnE9JWQsIGljPSVwLCBuPSVkXG4iLCBpcnEsIGljLCBuKTsKIAkJaWYgKG4gPD0gMCkKIAkJCWNvbnRpbnVlOwogCkBAIC0zNzAsNiArMzY5LDcgQEAKIAkJCW5wLT5pbnRyc1tpbnRyY291bnRdLnNlbnNlID0gbWFwX2lzYV9zZW5zZXNbc2Vuc2VdOwogCQl9IGVsc2UgewogCQkJdmlycSA9IHZpcnRfaXJxX2NyZWF0ZV9tYXBwaW5nKGlycVswXSk7CisJCQlUUkFDRSgidmlycT0lZFxuIiwgdmlycSk7CiAjaWZkZWYgQ09ORklHX1BQQzY0CiAJCQlpZiAodmlycSA9PSBOT19JUlEpIHsKIAkJCQlwcmludGsoS0VSTl9DUklUICJDb3VsZCBub3QgYWxsb2NhdGUgaW50ZXJydXB0IgpAQCAtMzc5LDYgKzM3OSwxMiBAQAogI2VuZGlmCiAJCQlucC0+aW50cnNbaW50cmNvdW50XS5saW5lID0gaXJxX29mZnNldF91cCh2aXJxKTsKIAkJCXNlbnNlID0gKG4gPiAxKT8gKGlycVsxXSAmIDMpOiAxOworCisJCQkvKiBBcHBsZSB1c2VzIGJpdHMgaW4gdGhlcmUgaW4gYSBkaWZmZXJlbnQgd2F5LCBsZXQncworCQkJICogb25seSBrZWVwIHRoZSByZWFsIHNlbnNlIGJpdCBvbiBtYWNzCisJCQkgKi8KKwkJCWlmIChfbWFjaGluZSA9PSBQTEFURk9STV9QT1dFUk1BQykKKwkJCQlzZW5zZSAmPSAweDE7CiAJCQlucC0+aW50cnNbaW50cmNvdW50XS5zZW5zZSA9IG1hcF9tcGljX3NlbnNlc1tzZW5zZV07CiAJCX0KIApAQCAtMzg4LDEyICszOTQsMTMgQEAKIAkJCWNoYXIgKm5hbWUgPSBnZXRfcHJvcGVydHkoaWMtPnBhcmVudCwgIm5hbWUiLCBOVUxMKTsKIAkJCWlmIChuYW1lICYmICFzdHJjbXAobmFtZSwgInUzIikpCiAJCQkJbnAtPmludHJzW2ludHJjb3VudF0ubGluZSArPSAxMjg7Ci0JCQllbHNlIGlmICghKG5hbWUgJiYgIXN0cmNtcChuYW1lLCAibWFjLWlvIikpKQorCQkJZWxzZSBpZiAoIShuYW1lICYmICghc3RyY21wKG5hbWUsICJtYWMtaW8iKSB8fAorCQkJCQkgICAgIXN0cmNtcChuYW1lLCAidTQiKSkpKQogCQkJCS8qIGlnbm9yZSBvdGhlciBjYXNjYWRlZCBjb250cm9sbGVycywgc3VjaCBhcwogCQkJCSAgIHRoZSBrMi1zYXRhLXJvb3QgKi8KIAkJCQlicmVhazsKIAkJfQotI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAJCWlmIChuID4gMikgewogCQkJcHJpbnRrKCJobW1tLCBnb3QgJWQgaW50ciBjZWxscyBmb3IgJXM6IiwgbiwKIAkJCSAgICAgICBucC0+ZnVsbF9uYW1lKTsKQEAgLTQwOCwyMzQgKzQxNSwxOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBpbnRlcnByZXRfcGNpX3Byb3BzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkJCSB1bnNpZ25lZCBsb25nICptZW1fc3RhcnQsCi0JCQkJCSBpbnQgbmFkZHJjLCBpbnQgbnNpemVjLAotCQkJCQkgaW50IG1lYXN1cmVfb25seSkKLXsKLQlzdHJ1Y3QgYWRkcmVzc19yYW5nZSAqYWRyOwotCXN0cnVjdCBwY2lfcmVnX3Byb3BlcnR5ICpwY2lfYWRkcnM7Ci0JaW50IGksIGwsIG5fYWRkcnM7Ci0KLQlwY2lfYWRkcnMgPSAoc3RydWN0IHBjaV9yZWdfcHJvcGVydHkgKikKLQkJZ2V0X3Byb3BlcnR5KG5wLCAiYXNzaWduZWQtYWRkcmVzc2VzIiwgJmwpOwotCWlmICghcGNpX2FkZHJzKQotCQlyZXR1cm4gMDsKLQotCW5fYWRkcnMgPSBsIC8gc2l6ZW9mKCpwY2lfYWRkcnMpOwotCi0JYWRyID0gcHJvbV9hbGxvYyhuX2FkZHJzICogc2l6ZW9mKCphZHIpLCBtZW1fc3RhcnQpOwotCWlmICghYWRyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotIAlpZiAobWVhc3VyZV9vbmx5KQotIAkJcmV0dXJuIDA7Ci0KLSAJbnAtPmFkZHJzID0gYWRyOwotIAlucC0+bl9hZGRycyA9IG5fYWRkcnM7Ci0KLSAJZm9yIChpID0gMDsgaSA8IG5fYWRkcnM7IGkrKykgewotIAkJYWRyW2ldLnNwYWNlID0gcGNpX2FkZHJzW2ldLmFkZHIuYV9oaTsKLSAJCWFkcltpXS5hZGRyZXNzID0gcGNpX2FkZHJzW2ldLmFkZHIuYV9sbyB8Ci0JCQkoKHU2NClwY2lfYWRkcnNbaV0uYWRkci5hX21pZCA8PCAzMik7Ci0gCQlhZHJbaV0uc2l6ZSA9IHBjaV9hZGRyc1tpXS5zaXplX2xvOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBpbnRlcnByZXRfZGJkbWFfcHJvcHMoc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkJdW5zaWduZWQgbG9uZyAqbWVtX3N0YXJ0LAotCQkJCQlpbnQgbmFkZHJjLCBpbnQgbnNpemVjLAotCQkJCQlpbnQgbWVhc3VyZV9vbmx5KQotewotCXN0cnVjdCByZWdfcHJvcGVydHkzMiAqcnA7Ci0Jc3RydWN0IGFkZHJlc3NfcmFuZ2UgKmFkcjsKLQl1bnNpZ25lZCBsb25nIGJhc2VfYWRkcmVzczsKLQlpbnQgaSwgbDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRiOwotCi0JYmFzZV9hZGRyZXNzID0gMDsKLQlpZiAoIW1lYXN1cmVfb25seSkgewotCQlmb3IgKGRiID0gbnAtPnBhcmVudDsgZGIgIT0gTlVMTDsgZGIgPSBkYi0+cGFyZW50KSB7Ci0JCQlpZiAoIXN0cmNtcChkYi0+dHlwZSwgImRiZG1hIikgJiYgZGItPm5fYWRkcnMgIT0gMCkgewotCQkJCWJhc2VfYWRkcmVzcyA9IGRiLT5hZGRyc1swXS5hZGRyZXNzOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcnAgPSAoc3RydWN0IHJlZ19wcm9wZXJ0eTMyICopIGdldF9wcm9wZXJ0eShucCwgInJlZyIsICZsKTsKLQlpZiAocnAgIT0gMCAmJiBsID49IHNpemVvZihzdHJ1Y3QgcmVnX3Byb3BlcnR5MzIpKSB7Ci0JCWkgPSAwOwotCQlhZHIgPSAoc3RydWN0IGFkZHJlc3NfcmFuZ2UgKikgKCptZW1fc3RhcnQpOwotCQl3aGlsZSAoKGwgLT0gc2l6ZW9mKHN0cnVjdCByZWdfcHJvcGVydHkzMikpID49IDApIHsKLQkJCWlmICghbWVhc3VyZV9vbmx5KSB7Ci0JCQkJYWRyW2ldLnNwYWNlID0gMjsKLQkJCQlhZHJbaV0uYWRkcmVzcyA9IHJwW2ldLmFkZHJlc3MgKyBiYXNlX2FkZHJlc3M7Ci0JCQkJYWRyW2ldLnNpemUgPSBycFtpXS5zaXplOwotCQkJfQotCQkJKytpOwotCQl9Ci0JCW5wLT5hZGRycyA9IGFkcjsKLQkJbnAtPm5fYWRkcnMgPSBpOwotCQkoKm1lbV9zdGFydCkgKz0gaSAqIHNpemVvZihzdHJ1Y3QgYWRkcmVzc19yYW5nZSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGludGVycHJldF9tYWNpb19wcm9wcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCQl1bnNpZ25lZCBsb25nICptZW1fc3RhcnQsCi0JCQkJCWludCBuYWRkcmMsIGludCBuc2l6ZWMsCi0JCQkJCWludCBtZWFzdXJlX29ubHkpCi17Ci0Jc3RydWN0IHJlZ19wcm9wZXJ0eTMyICpycDsKLQlzdHJ1Y3QgYWRkcmVzc19yYW5nZSAqYWRyOwotCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyZXNzOwotCWludCBpLCBsOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZGI7Ci0KLQliYXNlX2FkZHJlc3MgPSAwOwotCWlmICghbWVhc3VyZV9vbmx5KSB7Ci0JCWZvciAoZGIgPSBucC0+cGFyZW50OyBkYiAhPSBOVUxMOyBkYiA9IGRiLT5wYXJlbnQpIHsKLQkJCWlmICghc3RyY21wKGRiLT50eXBlLCAibWFjLWlvIikgJiYgZGItPm5fYWRkcnMgIT0gMCkgewotCQkJCWJhc2VfYWRkcmVzcyA9IGRiLT5hZGRyc1swXS5hZGRyZXNzOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcnAgPSAoc3RydWN0IHJlZ19wcm9wZXJ0eTMyICopIGdldF9wcm9wZXJ0eShucCwgInJlZyIsICZsKTsKLQlpZiAocnAgIT0gMCAmJiBsID49IHNpemVvZihzdHJ1Y3QgcmVnX3Byb3BlcnR5MzIpKSB7Ci0JCWkgPSAwOwotCQlhZHIgPSAoc3RydWN0IGFkZHJlc3NfcmFuZ2UgKikgKCptZW1fc3RhcnQpOwotCQl3aGlsZSAoKGwgLT0gc2l6ZW9mKHN0cnVjdCByZWdfcHJvcGVydHkzMikpID49IDApIHsKLQkJCWlmICghbWVhc3VyZV9vbmx5KSB7Ci0JCQkJYWRyW2ldLnNwYWNlID0gMjsKLQkJCQlhZHJbaV0uYWRkcmVzcyA9IHJwW2ldLmFkZHJlc3MgKyBiYXNlX2FkZHJlc3M7Ci0JCQkJYWRyW2ldLnNpemUgPSBycFtpXS5zaXplOwotCQkJfQotCQkJKytpOwotCQl9Ci0JCW5wLT5hZGRycyA9IGFkcjsKLQkJbnAtPm5fYWRkcnMgPSBpOwotCQkoKm1lbV9zdGFydCkgKz0gaSAqIHNpemVvZihzdHJ1Y3QgYWRkcmVzc19yYW5nZSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGludGVycHJldF9pc2FfcHJvcHMoc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nICptZW1fc3RhcnQsCi0JCQkJICAgICAgaW50IG5hZGRyYywgaW50IG5zaXplYywKLQkJCQkgICAgICBpbnQgbWVhc3VyZV9vbmx5KQotewotCXN0cnVjdCBpc2FfcmVnX3Byb3BlcnR5ICpycDsKLQlzdHJ1Y3QgYWRkcmVzc19yYW5nZSAqYWRyOwotCWludCBpLCBsOwotCi0JcnAgPSAoc3RydWN0IGlzYV9yZWdfcHJvcGVydHkgKikgZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgJmwpOwotCWlmIChycCAhPSAwICYmIGwgPj0gc2l6ZW9mKHN0cnVjdCBpc2FfcmVnX3Byb3BlcnR5KSkgewotCQlpID0gMDsKLQkJYWRyID0gKHN0cnVjdCBhZGRyZXNzX3JhbmdlICopICgqbWVtX3N0YXJ0KTsKLQkJd2hpbGUgKChsIC09IHNpemVvZihzdHJ1Y3QgaXNhX3JlZ19wcm9wZXJ0eSkpID49IDApIHsKLQkJCWlmICghbWVhc3VyZV9vbmx5KSB7Ci0JCQkJYWRyW2ldLnNwYWNlID0gcnBbaV0uc3BhY2U7Ci0JCQkJYWRyW2ldLmFkZHJlc3MgPSBycFtpXS5hZGRyZXNzOwotCQkJCWFkcltpXS5zaXplID0gcnBbaV0uc2l6ZTsKLQkJCX0KLQkJCSsraTsKLQkJfQotCQlucC0+YWRkcnMgPSBhZHI7Ci0JCW5wLT5uX2FkZHJzID0gaTsKLQkJKCptZW1fc3RhcnQpICs9IGkgKiBzaXplb2Yoc3RydWN0IGFkZHJlc3NfcmFuZ2UpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBpbnRlcnByZXRfcm9vdF9wcm9wcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCSAgICAgICB1bnNpZ25lZCBsb25nICptZW1fc3RhcnQsCi0JCQkJICAgICAgIGludCBuYWRkcmMsIGludCBuc2l6ZWMsCi0JCQkJICAgICAgIGludCBtZWFzdXJlX29ubHkpCi17Ci0Jc3RydWN0IGFkZHJlc3NfcmFuZ2UgKmFkcjsKLQlpbnQgaSwgbDsKLQl1bnNpZ25lZCBpbnQgKnJwOwotCWludCBycHNpemUgPSAobmFkZHJjICsgbnNpemVjKSAqIHNpemVvZih1bnNpZ25lZCBpbnQpOwotCi0JcnAgPSAodW5zaWduZWQgaW50ICopIGdldF9wcm9wZXJ0eShucCwgInJlZyIsICZsKTsKLQlpZiAocnAgIT0gMCAmJiBsID49IHJwc2l6ZSkgewotCQlpID0gMDsKLQkJYWRyID0gKHN0cnVjdCBhZGRyZXNzX3JhbmdlICopICgqbWVtX3N0YXJ0KTsKLQkJd2hpbGUgKChsIC09IHJwc2l6ZSkgPj0gMCkgewotCQkJaWYgKCFtZWFzdXJlX29ubHkpIHsKLQkJCQlhZHJbaV0uc3BhY2UgPSAwOwotCQkJCWFkcltpXS5hZGRyZXNzID0gcnBbbmFkZHJjIC0gMV07Ci0JCQkJYWRyW2ldLnNpemUgPSBycFtuYWRkcmMgKyBuc2l6ZWMgLSAxXTsKLQkJCX0KLQkJCSsraTsKLQkJCXJwICs9IG5hZGRyYyArIG5zaXplYzsKLQkJfQotCQlucC0+YWRkcnMgPSBhZHI7Ci0JCW5wLT5uX2FkZHJzID0gaTsKLQkJKCptZW1fc3RhcnQpICs9IGkgKiBzaXplb2Yoc3RydWN0IGFkZHJlc3NfcmFuZ2UpOwotCX0KLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBmaW5pc2hfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJCSB1bnNpZ25lZCBsb25nICptZW1fc3RhcnQsCi0JCQkJIGludGVycHJldF9mdW5jICppZnVuYywKLQkJCQkgaW50IG5hZGRyYywgaW50IG5zaXplYywKIAkJCQkgaW50IG1lYXN1cmVfb25seSkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkOwotCWludCAqaXAsIHJjID0gMDsKLQotCS8qIGdldCB0aGUgZGV2aWNlIGFkZHJlc3NlcyBhbmQgaW50ZXJydXB0cyAqLwotCWlmIChpZnVuYyAhPSBOVUxMKQotCQlyYyA9IGlmdW5jKG5wLCBtZW1fc3RhcnQsIG5hZGRyYywgbnNpemVjLCBtZWFzdXJlX29ubHkpOwotCWlmIChyYykKLQkJZ290byBvdXQ7CisJaW50IHJjID0gMDsKIAogCXJjID0gZmluaXNoX25vZGVfaW50ZXJydXB0cyhucCwgbWVtX3N0YXJ0LCBtZWFzdXJlX29ubHkpOwogCWlmIChyYykKIAkJZ290byBvdXQ7CiAKLQkvKiBMb29rIGZvciAjYWRkcmVzcy1jZWxscyBhbmQgI3NpemUtY2VsbHMgcHJvcGVydGllcy4gKi8KLQlpcCA9IChpbnQgKikgZ2V0X3Byb3BlcnR5KG5wLCAiI2FkZHJlc3MtY2VsbHMiLCBOVUxMKTsKLQlpZiAoaXAgIT0gTlVMTCkKLQkJbmFkZHJjID0gKmlwOwotCWlwID0gKGludCAqKSBnZXRfcHJvcGVydHkobnAsICIjc2l6ZS1jZWxscyIsIE5VTEwpOwotCWlmIChpcCAhPSBOVUxMKQotCQluc2l6ZWMgPSAqaXA7Ci0KLQlpZiAoIXN0cmNtcChucC0+bmFtZSwgImRldmljZS10cmVlIikgfHwgbnAtPnBhcmVudCA9PSBOVUxMKQotCQlpZnVuYyA9IGludGVycHJldF9yb290X3Byb3BzOwotCWVsc2UgaWYgKG5wLT50eXBlID09IDApCi0JCWlmdW5jID0gTlVMTDsKLQllbHNlIGlmICghc3RyY21wKG5wLT50eXBlLCAicGNpIikgfHwgIXN0cmNtcChucC0+dHlwZSwgInZjaSIpKQotCQlpZnVuYyA9IGludGVycHJldF9wY2lfcHJvcHM7Ci0JZWxzZSBpZiAoIXN0cmNtcChucC0+dHlwZSwgImRiZG1hIikpCi0JCWlmdW5jID0gaW50ZXJwcmV0X2RiZG1hX3Byb3BzOwotCWVsc2UgaWYgKCFzdHJjbXAobnAtPnR5cGUsICJtYWMtaW8iKSB8fCBpZnVuYyA9PSBpbnRlcnByZXRfbWFjaW9fcHJvcHMpCi0JCWlmdW5jID0gaW50ZXJwcmV0X21hY2lvX3Byb3BzOwotCWVsc2UgaWYgKCFzdHJjbXAobnAtPnR5cGUsICJpc2EiKSkKLQkJaWZ1bmMgPSBpbnRlcnByZXRfaXNhX3Byb3BzOwotCWVsc2UgaWYgKCFzdHJjbXAobnAtPm5hbWUsICJ1bmktbiIpIHx8ICFzdHJjbXAobnAtPm5hbWUsICJ1MyIpKQotCQlpZnVuYyA9IGludGVycHJldF9yb290X3Byb3BzOwotCWVsc2UgaWYgKCEoKGlmdW5jID09IGludGVycHJldF9kYmRtYV9wcm9wcwotCQkgICAgfHwgaWZ1bmMgPT0gaW50ZXJwcmV0X21hY2lvX3Byb3BzKQotCQkgICAmJiAoIXN0cmNtcChucC0+dHlwZSwgImVzY2MiKQotCQkgICAgICAgfHwgIXN0cmNtcChucC0+dHlwZSwgIm1lZGlhLWJheSIpKSkpCi0JCWlmdW5jID0gTlVMTDsKLQogCWZvciAoY2hpbGQgPSBucC0+Y2hpbGQ7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPnNpYmxpbmcpIHsKLQkJcmMgPSBmaW5pc2hfbm9kZShjaGlsZCwgbWVtX3N0YXJ0LCBpZnVuYywKLQkJCQkgbmFkZHJjLCBuc2l6ZWMsIG1lYXN1cmVfb25seSk7CisJCXJjID0gZmluaXNoX25vZGUoY2hpbGQsIG1lbV9zdGFydCwgbWVhc3VyZV9vbmx5KTsKIAkJaWYgKHJjKQogCQkJZ290byBvdXQ7CiAJfQpAQCAtNjk3LDEwICs0ODksMTAgQEAKIAkgKiByZWFzb24gYW5kIHRoZW4gcmVtb3ZlIHRob3NlIGFkZGl0aW9uYWwgMTYgYnl0ZXMKIAkgKi8KIAlzaXplID0gMTY7Ci0JZmluaXNoX25vZGUoYWxsbm9kZXMsICZzaXplLCBOVUxMLCAwLCAwLCAxKTsKKwlmaW5pc2hfbm9kZShhbGxub2RlcywgJnNpemUsIDEpOwogCXNpemUgLT0gMTY7CiAJZW5kID0gc3RhcnQgPSAodW5zaWduZWQgbG9uZykgX192YShsbWJfYWxsb2Moc2l6ZSwgMTI4KSk7Ci0JZmluaXNoX25vZGUoYWxsbm9kZXMsICZlbmQsIE5VTEwsIDAsIDAsIDApOworCWZpbmlzaF9ub2RlKGFsbG5vZGVzLCAmZW5kLCAwKTsKIAlCVUdfT04oZW5kICE9IHN0YXJ0ICsgc2l6ZSk7CiAKIAlEQkcoIiA8LSBmaW5pc2hfZGV2aWNlX3RyZWVcbiIpOwpAQCAtMTE4MCw3ICs5NzIsNyBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUFBDX1JUQVMKLQkvKiBUbyBoZWxwIGVhcmx5IGRlYnVnZ2luZyB2aWEgdGhlIGZyb250IHBhbmVsLCB3ZSByZXRyZWl2ZSBhIG1pbmltYWwKKwkvKiBUbyBoZWxwIGVhcmx5IGRlYnVnZ2luZyB2aWEgdGhlIGZyb250IHBhbmVsLCB3ZSByZXRyaWV2ZSBhIG1pbmltYWwKIAkgKiBzZXQgb2YgUlRBUyBpbmZvcyBub3cgaWYgYXZhaWxhYmxlCiAJICovCiAJewpAQCAtMTE5Nyw2ICs5ODksMTYgQEAKIAl9CiAjZW5kaWYgLyogQ09ORklHX1BQQ19SVEFTICovCiAKKyNpZmRlZiBDT05GSUdfS0VYRUMKKyAgICAgICBscHJvcCA9ICh1NjQqKW9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgImxpbnV4LGNyYXNoa2VybmVsLWJhc2UiLCBOVUxMKTsKKyAgICAgICBpZiAobHByb3ApCisgICAgICAgICAgICAgICBjcmFzaGtfcmVzLnN0YXJ0ID0gKmxwcm9wOworCisgICAgICAgbHByb3AgPSAodTY0KilvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJsaW51eCxjcmFzaGtlcm5lbC1zaXplIiwgTlVMTCk7CisgICAgICAgaWYgKGxwcm9wKQorICAgICAgICAgICAgICAgY3Jhc2hrX3Jlcy5lbmQgPSBjcmFzaGtfcmVzLnN0YXJ0ICsgKmxwcm9wIC0gMTsKKyNlbmRpZgorCiAJLyogYnJlYWsgbm93ICovCiAJcmV0dXJuIDE7CiB9CkBAIC0xMjYzLDcgKzEwNjUsOSBAQAogCX0gZWxzZSBpZiAoc3RyY21wKHR5cGUsICJtZW1vcnkiKSAhPSAwKQogCQlyZXR1cm4gMDsKIAotCXJlZyA9IChjZWxsX3QgKilvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJyZWciLCAmbCk7CisJcmVnID0gKGNlbGxfdCAqKW9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgImxpbnV4LHVzYWJsZS1tZW1vcnkiLCAmbCk7CisJaWYgKHJlZyA9PSBOVUxMKQorCQlyZWcgPSAoY2VsbF90ICopb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAicmVnIiwgJmwpOwogCWlmIChyZWcgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKQEAgLTEyOTYsMTcgKzExMDAsMzcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGVhcmx5X3Jlc2VydmVfbWVtKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBiYXNlLCBzaXplOwotCXVuc2lnbmVkIGxvbmcgKnJlc2VydmVfbWFwOworCXU2NCBiYXNlLCBzaXplOworCXU2NCAqcmVzZXJ2ZV9tYXA7CiAKLQlyZXNlcnZlX21hcCA9ICh1bnNpZ25lZCBsb25nICopKCgodW5zaWduZWQgbG9uZylpbml0aWFsX2Jvb3RfcGFyYW1zKSArCisJcmVzZXJ2ZV9tYXAgPSAodTY0ICopKCgodW5zaWduZWQgbG9uZylpbml0aWFsX2Jvb3RfcGFyYW1zKSArCiAJCQkJCWluaXRpYWxfYm9vdF9wYXJhbXMtPm9mZl9tZW1fcnN2bWFwKTsKKyNpZmRlZiBDT05GSUdfUFBDMzIKKwkvKiAKKwkgKiBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2UgbWlnaHQgYmUgYm9vdGluZyBmcm9tIGFuIG9sZCBrZXhlYworCSAqIGltYWdlIHRoYXQgc2V0dXAgdGhlIG1lbV9yc3ZtYXAgYXMgcGFpcnMgb2YgMzItYml0IHZhbHVlcworCSAqLworCWlmICgqcmVzZXJ2ZV9tYXAgPiAweGZmZmZmZmZmdWxsKSB7CisJCXUzMiBiYXNlXzMyLCBzaXplXzMyOworCQl1MzIgKnJlc2VydmVfbWFwXzMyID0gKHUzMiAqKXJlc2VydmVfbWFwOworCisJCXdoaWxlICgxKSB7CisJCQliYXNlXzMyID0gKihyZXNlcnZlX21hcF8zMisrKTsKKwkJCXNpemVfMzIgPSAqKHJlc2VydmVfbWFwXzMyKyspOworCQkJaWYgKHNpemVfMzIgPT0gMCkKKwkJCQlicmVhazsKKwkJCURCRygicmVzZXJ2aW5nOiAlbHggLT4gJWx4XG4iLCBiYXNlXzMyLCBzaXplXzMyKTsKKwkJCWxtYl9yZXNlcnZlKGJhc2VfMzIsIHNpemVfMzIpOworCQl9CisJCXJldHVybjsKKwl9CisjZW5kaWYKIAl3aGlsZSAoMSkgewogCQliYXNlID0gKihyZXNlcnZlX21hcCsrKTsKIAkJc2l6ZSA9ICoocmVzZXJ2ZV9tYXArKyk7CiAJCWlmIChzaXplID09IDApCiAJCQlicmVhazsKLQkJREJHKCJyZXNlcnZpbmc6ICVseCAtPiAlbHhcbiIsIGJhc2UsIHNpemUpOworCQlEQkcoInJlc2VydmluZzogJWxseCAtPiAlbGx4XG4iLCBiYXNlLCBzaXplKTsKIAkJbG1iX3Jlc2VydmUoYmFzZSwgc2l6ZSk7CiAJfQogCkBAIC0xMzM1LDExICsxMTU5LDE0IEBACiAJb2Zfc2Nhbl9mbGF0X2R0KGVhcmx5X2luaXRfZHRfc2Nhbl9tZW1vcnksIE5VTEwpOwogCWxtYl9lbmZvcmNlX21lbW9yeV9saW1pdChtZW1vcnlfbGltaXQpOwogCWxtYl9hbmFseXplKCk7Ci0JbG1iX3Jlc2VydmUoMCwgX19wYShrbGltaXQpKTsKIAogCURCRygiUGh5cy4gbWVtOiAlbHhcbiIsIGxtYl9waHlzX21lbV9zaXplKCkpOwogCiAJLyogUmVzZXJ2ZSBMTUIgcmVnaW9ucyB1c2VkIGJ5IGtlcm5lbCwgaW5pdHJkLCBkdCwgZXRjLi4uICovCisJbG1iX3Jlc2VydmUoUEhZU0lDQUxfU1RBUlQsIF9fcGEoa2xpbWl0KSAtIFBIWVNJQ0FMX1NUQVJUKTsKKyNpZmRlZiBDT05GSUdfQ1JBU0hfRFVNUAorCWxtYl9yZXNlcnZlKDAsIEtEVU1QX1JFU0VSVkVfTElNSVQpOworI2VuZGlmCiAJZWFybHlfcmVzZXJ2ZV9tZW0oKTsKIAogCURCRygiU2Nhbm5pbmcgQ1BVcyAuLi5cbiIpOwpAQCAtMTgwMCw5ICsxNjI3LDEzIEBACiAJCWtmcmVlKHByb3AtPnZhbHVlKTsKIAkJa2ZyZWUocHJvcCk7CiAJCXByb3AgPSBuZXh0OworCisJCWlmICghcHJvcCkgeworCQkJcHJvcCA9IG5vZGUtPmRlYWRwcm9wczsKKwkJCW5vZGUtPmRlYWRwcm9wcyA9IE5VTEw7CisJCX0KIAl9CiAJa2ZyZWUobm9kZS0+aW50cnMpOwotCWtmcmVlKG5vZGUtPmFkZHJzKTsKIAlrZnJlZShub2RlLT5mdWxsX25hbWUpOwogCWtmcmVlKG5vZGUtPmRhdGEpOwogCWtmcmVlKG5vZGUpOwpAQCAtMTg4NCw5ICsxNzE1LDcgQEAKICAqIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIHNwbGl0IHVwIGludG8gc21hbGxlciBjaHVua3MuCiAgKi8KIAotc3RhdGljIGludCBvZl9maW5pc2hfZHluYW1pY19ub2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgKnVudXNlZDEsIGludCB1bnVzZWQyLAotCQkJCSAgaW50IHVudXNlZDMsIGludCB1bnVzZWQ0KQorc3RhdGljIGludCBvZl9maW5pc2hfZHluYW1pY19ub2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCA9IG9mX2dldF9wYXJlbnQobm9kZSk7CiAJaW50IGVyciA9IDA7CkBAIC0xOTA3LDcgKzE3MzYsOCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIGZpeCB1cCBuZXcgbm9kZSdzIGxpbnV4X3BoYW5kbGUgZmllbGQgKi8KLQlpZiAoKGlibV9waGFuZGxlID0gKHVuc2lnbmVkIGludCAqKWdldF9wcm9wZXJ0eShub2RlLCAiaWJtLHBoYW5kbGUiLCBOVUxMKSkpCisJaWYgKChpYm1fcGhhbmRsZSA9ICh1bnNpZ25lZCBpbnQgKilnZXRfcHJvcGVydHkobm9kZSwKKwkJCQkJCQkiaWJtLHBoYW5kbGUiLCBOVUxMKSkpCiAJCW5vZGUtPmxpbnV4X3BoYW5kbGUgPSAqaWJtX3BoYW5kbGU7CiAKIG91dDoKQEAgLTE5MjIsNyArMTc1Miw5IEBACiAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgUFNFUklFU19SRUNPTkZJR19BREQ6Ci0JCWVyciA9IGZpbmlzaF9ub2RlKG5vZGUsIE5VTEwsIG9mX2ZpbmlzaF9keW5hbWljX25vZGUsIDAsIDAsIDApOworCQllcnIgPSBvZl9maW5pc2hfZHluYW1pY19ub2RlKG5vZGUpOworCQlpZiAoIWVycikKKwkJCWZpbmlzaF9ub2RlKG5vZGUsIE5VTEwsIDApOwogCQlpZiAoZXJyIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJmaW5pc2hfbm9kZSByZXR1cm5lZCAlZFxuIiwgZXJyKTsKIAkJCWVyciA9IE5PVElGWV9CQUQ7CkBAIC0xOTQ3LDYgKzE3NzksMjMgQEAKIF9faW5pdGNhbGwocHJvbV9yZWNvbmZpZ19zZXR1cCk7CiAjZW5kaWYKIAorc3RydWN0IHByb3BlcnR5ICpvZl9maW5kX3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICBpbnQgKmxlbnApCit7CisJc3RydWN0IHByb3BlcnR5ICpwcDsKKworCXJlYWRfbG9jaygmZGV2dHJlZV9sb2NrKTsKKwlmb3IgKHBwID0gbnAtPnByb3BlcnRpZXM7IHBwICE9IDA7IHBwID0gcHAtPm5leHQpCisJCWlmIChzdHJjbXAocHAtPm5hbWUsIG5hbWUpID09IDApIHsKKwkJCWlmIChsZW5wICE9IDApCisJCQkJKmxlbnAgPSBwcC0+bGVuZ3RoOworCQkJYnJlYWs7CisJCX0KKwlyZWFkX3VubG9jaygmZGV2dHJlZV9sb2NrKTsKKworCXJldHVybiBwcDsKK30KKwogLyoKICAqIEZpbmQgYSBwcm9wZXJ0eSB3aXRoIGEgZ2l2ZW4gbmFtZSBmb3IgYSBnaXZlbiBub2RlCiAgKiBhbmQgcmV0dXJuIHRoZSB2YWx1ZS4KQEAgLTE5NTQsMTUgKzE4MDMsOCBAQAogdW5zaWduZWQgY2hhciAqZ2V0X3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICAgaW50ICpsZW5wKQogewotCXN0cnVjdCBwcm9wZXJ0eSAqcHA7Ci0KLQlmb3IgKHBwID0gbnAtPnByb3BlcnRpZXM7IHBwICE9IDA7IHBwID0gcHAtPm5leHQpCi0JCWlmIChzdHJjbXAocHAtPm5hbWUsIG5hbWUpID09IDApIHsKLQkJCWlmIChsZW5wICE9IDApCi0JCQkJKmxlbnAgPSBwcC0+bGVuZ3RoOwotCQkJcmV0dXJuIHBwLT52YWx1ZTsKLQkJfQotCXJldHVybiBOVUxMOworCXN0cnVjdCBwcm9wZXJ0eSAqcHAgPSBvZl9maW5kX3Byb3BlcnR5KG5wLG5hbWUsbGVucCk7CisJcmV0dXJuIHBwID8gcHAtPnZhbHVlIDogTlVMTDsKIH0KIEVYUE9SVF9TWU1CT0woZ2V0X3Byb3BlcnR5KTsKIApAQCAtMTk5NiwxNzUgKzE4MzgsODIgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogSSBxdWlja2x5IGhhY2tlZCB0aGF0IG9uZSwgY2hlY2sgYWdhaW5zdCBzcGVjICEgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotYnVzX3NwYWNlX3RvX3Jlc291cmNlX2ZsYWdzKHVuc2lnbmVkIGludCBidXNfc3BhY2UpCi17Ci0JdTggc3BhY2UgPSAoYnVzX3NwYWNlID4+IDI0KSAmIDB4ZjsKLQlpZiAoc3BhY2UgPT0gMCkKLQkJc3BhY2UgPSAweDAyOwotCWlmIChzcGFjZSA9PSAweDAyKQotCQlyZXR1cm4gSU9SRVNPVVJDRV9NRU07Ci0JZWxzZSBpZiAoc3BhY2UgPT0gMHgwMSkKLQkJcmV0dXJuIElPUkVTT1VSQ0VfSU87Ci0JZWxzZSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInByb20uYzogYnVzX3NwYWNlX3RvX3Jlc291cmNlX2ZsYWdzKCksIHNwYWNlOiAleFxuIiwKLQkJICAgIAlidXNfc3BhY2UpOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLSNpZmRlZiBDT05GSUdfUENJCi1zdGF0aWMgc3RydWN0IHJlc291cmNlICpmaW5kX3BhcmVudF9wY2lfcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYqIHBkZXYsCi0JCQkJCQkgc3RydWN0IGFkZHJlc3NfcmFuZ2UgKnJhbmdlKQotewotCXVuc2lnbmVkIGxvbmcgbWFzazsKLQlpbnQgaTsKLQotCS8qIENoZWNrIHRoaXMgb25lICovCi0JbWFzayA9IGJ1c19zcGFjZV90b19yZXNvdXJjZV9mbGFncyhyYW5nZS0+c3BhY2UpOwotCWZvciAoaT0wOyBpPERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7Ci0JCWlmICgocGRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgJiBtYXNrKSA9PSBtYXNrICYmCi0JCQlwZGV2LT5yZXNvdXJjZVtpXS5zdGFydCA8PSByYW5nZS0+YWRkcmVzcyAmJgotCQkJcGRldi0+cmVzb3VyY2VbaV0uZW5kID4gcmFuZ2UtPmFkZHJlc3MpIHsKLQkJCQlpZiAoKHJhbmdlLT5hZGRyZXNzICsgcmFuZ2UtPnNpemUgLSAxKSA+IHBkZXYtPnJlc291cmNlW2ldLmVuZCkgewotCQkJCQkvKiBBZGQgYmV0dGVyIG1lc3NhZ2UgKi8KLQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJL09GIHJlc291cmNlIG92ZXJsYXAgIVxuIik7Ci0JCQkJCXJldHVybiBOVUxMOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQl9Ci0JaWYgKGkgPT0gREVWSUNFX0NPVU5UX1JFU09VUkNFKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gJnBkZXYtPnJlc291cmNlW2ldOwotfQotCiAvKgotICogUmVxdWVzdCBhbiBPRiBkZXZpY2UgcmVzb3VyY2UuIEN1cnJlbnRseSBoYW5kbGVzIGNoaWxkIG9mIFBDSSBkZXZpY2VzLAotICogb3Igb3RoZXIgbm9kZXMgYXR0YWNoZWQgdG8gdGhlIHJvb3Qgbm9kZS4gVWx0aW1hdGVseSwgcHV0IHNvbWUKLSAqIGxpbmsgdG8gcmVzb3VyY2VzIGluIHRoZSBPRiBub2RlLgorICogUmVtb3ZlIGEgcHJvcGVydHkgZnJvbSBhIG5vZGUuICBOb3RlIHRoYXQgd2UgZG9uJ3QgYWN0dWFsbHkKKyAqIHJlbW92ZSBpdCwgc2luY2Ugd2UgaGF2ZSBnaXZlbiBvdXQgd2hvLWtub3dzLWhvdy1tYW55IHBvaW50ZXJzCisgKiB0byB0aGUgZGF0YSB1c2luZyBnZXQtcHJvcGVydHkuICBJbnN0ZWFkIHdlIGp1c3QgbW92ZSB0aGUgcHJvcGVydHkKKyAqIHRvIHRoZSAiZGVhZCBwcm9wZXJ0aWVzIiBsaXN0LCBzbyBpdCB3b24ndCBiZSBmb3VuZCBhbnkgbW9yZS4KICAqLwotc3RydWN0IHJlc291cmNlICpyZXF1ZXN0X09GX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgaW50IGluZGV4LAotCQkJCSAgICAgY29uc3QgY2hhciogbmFtZV9wb3N0Zml4KQoraW50IHByb21fcmVtb3ZlX3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiogcGNpZGV2OwotCXU4IHBjaV9idXMsIHBjaV9kZXZmbjsKLQl1bnNpZ25lZCBsb25nIGlvbWFzazsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUqIG5kOwotCXN0cnVjdCByZXNvdXJjZSogcGFyZW50OwotCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gTlVMTDsKLQlpbnQgbmxlbiwgcGxlbjsKKwlzdHJ1Y3QgcHJvcGVydHkgKipuZXh0OworCWludCBmb3VuZCA9IDA7CiAKLQlpZiAoaW5kZXggPj0gbm9kZS0+bl9hZGRycykKLQkJZ290byBmYWlsOwotCi0JLyogU2FuaXR5IGNoZWNrIG9uIGJ1cyBzcGFjZSAqLwotCWlvbWFzayA9IGJ1c19zcGFjZV90b19yZXNvdXJjZV9mbGFncyhub2RlLT5hZGRyc1tpbmRleF0uc3BhY2UpOwotCWlmIChpb21hc2sgJiBJT1JFU09VUkNFX01FTSkKLQkJcGFyZW50ID0gJmlvbWVtX3Jlc291cmNlOwotCWVsc2UgaWYgKGlvbWFzayAmIElPUkVTT1VSQ0VfSU8pCi0JCXBhcmVudCA9ICZpb3BvcnRfcmVzb3VyY2U7Ci0JZWxzZQotCQlnb3RvIGZhaWw7Ci0KLQkvKiBGaW5kIGEgUENJIHBhcmVudCBpZiBhbnkgKi8KLQluZCA9IG5vZGU7Ci0JcGNpZGV2ID0gTlVMTDsKLQl3aGlsZSAobmQpIHsKLQkJaWYgKCFwY2lfZGV2aWNlX2Zyb21fT0Zfbm9kZShuZCwgJnBjaV9idXMsICZwY2lfZGV2Zm4pKQotCQkJcGNpZGV2ID0gcGNpX2ZpbmRfc2xvdChwY2lfYnVzLCBwY2lfZGV2Zm4pOwotCQlpZiAocGNpZGV2KSBicmVhazsKLQkJbmQgPSBuZC0+cGFyZW50OworCXdyaXRlX2xvY2soJmRldnRyZWVfbG9jayk7CisJbmV4dCA9ICZucC0+cHJvcGVydGllczsKKwl3aGlsZSAoKm5leHQpIHsKKwkJaWYgKCpuZXh0ID09IHByb3ApIHsKKwkJCS8qIGZvdW5kIHRoZSBub2RlICovCisJCQkqbmV4dCA9IHByb3AtPm5leHQ7CisJCQlwcm9wLT5uZXh0ID0gbnAtPmRlYWRwcm9wczsKKwkJCW5wLT5kZWFkcHJvcHMgPSBwcm9wOworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJbmV4dCA9ICYoKm5leHQpLT5uZXh0OwogCX0KLQlpZiAocGNpZGV2KQotCQlwYXJlbnQgPSBmaW5kX3BhcmVudF9wY2lfcmVzb3VyY2UocGNpZGV2LCAmbm9kZS0+YWRkcnNbaW5kZXhdKTsKLQlpZiAoIXBhcmVudCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJyZXF1ZXN0X09GX3Jlc291cmNlKCVzKSwgcGFyZW50IG5vdCBmb3VuZFxuIiwKLQkJCW5vZGUtPm5hbWUpOwotCQlnb3RvIGZhaWw7Ci0JfQorCXdyaXRlX3VubG9jaygmZGV2dHJlZV9sb2NrKTsKIAotCXJlcyA9IF9fcmVxdWVzdF9yZWdpb24ocGFyZW50LCBub2RlLT5hZGRyc1tpbmRleF0uYWRkcmVzcywKLQkJCSAgICAgICBub2RlLT5hZGRyc1tpbmRleF0uc2l6ZSwgTlVMTCk7Ci0JaWYgKCFyZXMpCi0JCWdvdG8gZmFpbDsKLQlubGVuID0gc3RybGVuKG5vZGUtPm5hbWUpOwotCXBsZW4gPSBuYW1lX3Bvc3RmaXggPyBzdHJsZW4obmFtZV9wb3N0Zml4KSA6IDA7Ci0JcmVzLT5uYW1lID0gKGNvbnN0IGNoYXIgKilrbWFsbG9jKG5sZW4rcGxlbisxLCBHRlBfS0VSTkVMKTsKLQlpZiAocmVzLT5uYW1lKSB7Ci0JCXN0cmNweSgoY2hhciAqKXJlcy0+bmFtZSwgbm9kZS0+bmFtZSk7Ci0JCWlmIChwbGVuKQotCQkJc3RyY3B5KChjaGFyICopcmVzLT5uYW1lK25sZW4sIG5hbWVfcG9zdGZpeCk7Ci0JfQotCXJldHVybiByZXM7Ci1mYWlsOgotCXJldHVybiBOVUxMOwotfQotRVhQT1JUX1NZTUJPTChyZXF1ZXN0X09GX3Jlc291cmNlKTsKLQotaW50IHJlbGVhc2VfT0ZfcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCBpbnQgaW5kZXgpCi17Ci0Jc3RydWN0IHBjaV9kZXYqIHBjaWRldjsKLQl1OCBwY2lfYnVzLCBwY2lfZGV2Zm47Ci0JdW5zaWduZWQgbG9uZyBpb21hc2ssIHN0YXJ0LCBlbmQ7Ci0Jc3RydWN0IGRldmljZV9ub2RlKiBuZDsKLQlzdHJ1Y3QgcmVzb3VyY2UqIHBhcmVudDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IE5VTEw7Ci0KLQlpZiAoaW5kZXggPj0gbm9kZS0+bl9hZGRycykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBTYW5pdHkgY2hlY2sgb24gYnVzIHNwYWNlICovCi0JaW9tYXNrID0gYnVzX3NwYWNlX3RvX3Jlc291cmNlX2ZsYWdzKG5vZGUtPmFkZHJzW2luZGV4XS5zcGFjZSk7Ci0JaWYgKGlvbWFzayAmIElPUkVTT1VSQ0VfTUVNKQotCQlwYXJlbnQgPSAmaW9tZW1fcmVzb3VyY2U7Ci0JZWxzZSBpZiAoaW9tYXNrICYgSU9SRVNPVVJDRV9JTykKLQkJcGFyZW50ID0gJmlvcG9ydF9yZXNvdXJjZTsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogRmluZCBhIFBDSSBwYXJlbnQgaWYgYW55ICovCi0JbmQgPSBub2RlOwotCXBjaWRldiA9IE5VTEw7Ci0Jd2hpbGUobmQpIHsKLQkJaWYgKCFwY2lfZGV2aWNlX2Zyb21fT0Zfbm9kZShuZCwgJnBjaV9idXMsICZwY2lfZGV2Zm4pKQotCQkJcGNpZGV2ID0gcGNpX2ZpbmRfc2xvdChwY2lfYnVzLCBwY2lfZGV2Zm4pOwotCQlpZiAocGNpZGV2KSBicmVhazsKLQkJbmQgPSBuZC0+cGFyZW50OwotCX0KLQlpZiAocGNpZGV2KQotCQlwYXJlbnQgPSBmaW5kX3BhcmVudF9wY2lfcmVzb3VyY2UocGNpZGV2LCAmbm9kZS0+YWRkcnNbaW5kZXhdKTsKLQlpZiAoIXBhcmVudCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJyZWxlYXNlX09GX3Jlc291cmNlKCVzKSwgcGFyZW50IG5vdCBmb3VuZFxuIiwKLQkJCW5vZGUtPm5hbWUpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKiBGaW5kIHVzIGluIHRoZSBwYXJlbnQgYW5kIGl0cyBjaGlsZHMgKi8KLQlyZXMgPSBwYXJlbnQtPmNoaWxkOwotCXN0YXJ0ID0gbm9kZS0+YWRkcnNbaW5kZXhdLmFkZHJlc3M7Ci0JZW5kID0gc3RhcnQgKyBub2RlLT5hZGRyc1tpbmRleF0uc2l6ZSAtIDE7Ci0Jd2hpbGUgKHJlcykgewotCQlpZiAocmVzLT5zdGFydCA9PSBzdGFydCAmJiByZXMtPmVuZCA9PSBlbmQgJiYKLQkJICAgIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9CVVNZKSkKLQkJICAgIAlicmVhazsKLQkJaWYgKHJlcy0+c3RhcnQgPD0gc3RhcnQgJiYgcmVzLT5lbmQgPj0gZW5kKQotCQkJcmVzID0gcmVzLT5jaGlsZDsKLQkJZWxzZQotCQkJcmVzID0gcmVzLT5zaWJsaW5nOwotCX0KLQlpZiAoIXJlcykKKwlpZiAoIWZvdW5kKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChyZXMtPm5hbWUpIHsKLQkJa2ZyZWUocmVzLT5uYW1lKTsKLQkJcmVzLT5uYW1lID0gTlVMTDsKLQl9Ci0JcmVsZWFzZV9yZXNvdXJjZShyZXMpOwotCWtmcmVlKHJlcyk7CisjaWZkZWYgQ09ORklHX1BST0NfREVWSUNFVFJFRQorCS8qIHRyeSB0byByZW1vdmUgdGhlIHByb2Mgbm9kZSBhcyB3ZWxsICovCisJaWYgKG5wLT5wZGUpCisJCXByb2NfZGV2aWNlX3RyZWVfcmVtb3ZlX3Byb3AobnAtPnBkZSwgcHJvcCk7CisjZW5kaWYgLyogQ09ORklHX1BST0NfREVWSUNFVFJFRSAqLwogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHJlbGVhc2VfT0ZfcmVzb3VyY2UpOwotI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKworLyoKKyAqIFVwZGF0ZSBhIHByb3BlcnR5IGluIGEgbm9kZS4gIE5vdGUgdGhhdCB3ZSBkb24ndCBhY3R1YWxseQorICogcmVtb3ZlIGl0LCBzaW5jZSB3ZSBoYXZlIGdpdmVuIG91dCB3aG8ta25vd3MtaG93LW1hbnkgcG9pbnRlcnMKKyAqIHRvIHRoZSBkYXRhIHVzaW5nIGdldC1wcm9wZXJ0eS4gIEluc3RlYWQgd2UganVzdCBtb3ZlIHRoZSBwcm9wZXJ0eQorICogdG8gdGhlICJkZWFkIHByb3BlcnRpZXMiIGxpc3QsIGFuZCBhZGQgdGhlIG5ldyBwcm9wZXJ0eSB0byB0aGUKKyAqIHByb3BlcnR5IGxpc3QKKyAqLworaW50IHByb21fdXBkYXRlX3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkgc3RydWN0IHByb3BlcnR5ICpuZXdwcm9wLAorCQkJIHN0cnVjdCBwcm9wZXJ0eSAqb2xkcHJvcCkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKipuZXh0OworCWludCBmb3VuZCA9IDA7CisKKwl3cml0ZV9sb2NrKCZkZXZ0cmVlX2xvY2spOworCW5leHQgPSAmbnAtPnByb3BlcnRpZXM7CisJd2hpbGUgKCpuZXh0KSB7CisJCWlmICgqbmV4dCA9PSBvbGRwcm9wKSB7CisJCQkvKiBmb3VuZCB0aGUgbm9kZSAqLworCQkJbmV3cHJvcC0+bmV4dCA9IG9sZHByb3AtPm5leHQ7CisJCQkqbmV4dCA9IG5ld3Byb3A7CisJCQlvbGRwcm9wLT5uZXh0ID0gbnAtPmRlYWRwcm9wczsKKwkJCW5wLT5kZWFkcHJvcHMgPSBvbGRwcm9wOworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJbmV4dCA9ICYoKm5leHQpLT5uZXh0OworCX0KKwl3cml0ZV91bmxvY2soJmRldnRyZWVfbG9jayk7CisKKwlpZiAoIWZvdW5kKQorCQlyZXR1cm4gLUVOT0RFVjsKKworI2lmZGVmIENPTkZJR19QUk9DX0RFVklDRVRSRUUKKwkvKiB0cnkgdG8gYWRkIHRvIHByb2MgYXMgd2VsbCBpZiBpdCB3YXMgaW5pdGlhbGl6ZWQgKi8KKwlpZiAobnAtPnBkZSkKKwkJcHJvY19kZXZpY2VfdHJlZV91cGRhdGVfcHJvcChucC0+cGRlLCBuZXdwcm9wLCBvbGRwcm9wKTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19ERVZJQ0VUUkVFICovCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCmluZGV4IGJjZGMyMDkuLjc4ODFlYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYwpAQCAtMTM3LDggKzEzNyw4IEBACiB9OwogCiBzdHJ1Y3QgbWVtX21hcF9lbnRyeSB7Ci0JdW5zaWduZWQgbG9uZwliYXNlOwotCXVuc2lnbmVkIGxvbmcJc2l6ZTsKKwl1NjQJYmFzZTsKKwl1NjQJc2l6ZTsKIH07CiAKIHR5cGVkZWYgdTMyIGNlbGxfdDsKQEAgLTE5Miw2ICsxOTIsMTEgQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgcm1vX3RvcDsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgcmFtX3RvcDsKIAorI2lmZGVmIENPTkZJR19LRVhFQworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBwcm9tX2NyYXNoa19iYXNlOworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBwcm9tX2NyYXNoa19zaXplOworI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgbWVtX21hcF9lbnRyeSBfX2luaXRkYXRhIG1lbV9yZXNlcnZlX21hcFtNRU1fUkVTRVJWRV9NQVBfU0laRV07CiBzdGF0aWMgaW50IF9faW5pdGRhdGEgbWVtX3Jlc2VydmVfY250OwogCkBAIC01NTMsNyArNTU4LDggQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBlYXJseV9jbWRsaW5lX3BhcnNlKHZvaWQpCiB7CiAJc3RydWN0IHByb21fdCAqX3Byb20gPSAmUkVMT0MocHJvbSk7Ci0JY2hhciAqb3B0LCAqcDsKKwljb25zdCBjaGFyICpvcHQ7CisJY2hhciAqcDsKIAlpbnQgbCA9IDA7CiAKIAlSRUxPQyhwcm9tX2NtZF9saW5lWzBdKSA9IDA7CkBAIC01OTAsNiArNTk2LDM1IEBACiAJCVJFTE9DKHByb21fbWVtb3J5X2xpbWl0KSA9IEFMSUdOKFJFTE9DKHByb21fbWVtb3J5X2xpbWl0KSwgMHgxMDAwMDAwKTsKICNlbmRpZgogCX0KKworI2lmZGVmIENPTkZJR19LRVhFQworCS8qCisJICogY3Jhc2hrZXJuZWw9c2l6ZUBhZGRyIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gdG8gcmVzZXJ2ZSBmb3IKKwkgKiBjcmFzaCBrZXJuZWwuCisJICovCisJb3B0ID0gc3Ryc3RyKFJFTE9DKHByb21fY21kX2xpbmUpLCBSRUxPQygiY3Jhc2hrZXJuZWw9IikpOworCWlmIChvcHQpIHsKKwkJb3B0ICs9IDEyOworCQlSRUxPQyhwcm9tX2NyYXNoa19zaXplKSA9IAorCQkJcHJvbV9tZW1wYXJzZShvcHQsIChjb25zdCBjaGFyICoqKSZvcHQpOworCisJCWlmIChBTElHTihSRUxPQyhwcm9tX2NyYXNoa19zaXplKSwgMHgxMDAwMDAwKSAhPQorCQkJUkVMT0MocHJvbV9jcmFzaGtfc2l6ZSkpIHsKKwkJCXByb21fcHJpbnRmKCJXYXJuaW5nOiBjcmFzaGtlcm5lbCBzaXplIGlzIG5vdCAiCisJCQkJCSJhbGlnbmVkIHRvIDE2TUJcbiIpOworCQl9CisKKwkJLyoKKwkJICogQXQgcHJlc2VudCwgdGhlIGNyYXNoIGtlcm5lbCBhbHdheXMgcnVuIGF0IDMyTUIuCisJCSAqIEp1c3QgaWdub3JlIHdoYXRldmVyIHVzZXIgcGFzc2VkLgorCQkgKi8KKwkJUkVMT0MocHJvbV9jcmFzaGtfYmFzZSkgPSAweDIwMDAwMDA7CisJCWlmICgqb3B0ID09ICdAJykgeworCQkJcHJvbV9wcmludGYoIldhcm5pbmc6IFBQQzY0IGtkdW1wIGtlcm5lbCBhbHdheXMgcnVucyAiCisJCQkJCSJhdCAzMiBNQlxuIik7CisJCX0KKwl9CisjZW5kaWYKIH0KIAogI2lmZGVmIENPTkZJR19QUENfUFNFUklFUwpAQCAtODYzLDkgKzg5OCw5IEBACiAgKiBJZiBwcm9ibGVtcyBzZWVtIHRvIHNob3cgdXAsIGl0IHdvdWxkIGJlIGEgZ29vZCBzdGFydCB0byB0cmFjawogICogdGhlbSBkb3duLgogICovCi1zdGF0aWMgdm9pZCByZXNlcnZlX21lbSh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3N0YXRpYyB2b2lkIHJlc2VydmVfbWVtKHU2NCBiYXNlLCB1NjQgc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIHRvcCA9IGJhc2UgKyBzaXplOworCXU2NCB0b3AgPSBiYXNlICsgc2l6ZTsKIAl1bnNpZ25lZCBsb25nIGNudCA9IFJFTE9DKG1lbV9yZXNlcnZlX2NudCk7CiAKIAlpZiAoc2l6ZSA9PSAwKQpAQCAtMTAxMSw2ICsxMDQ2LDEyIEBACiAJcHJvbV9wcmludGYoIiAgYWxsb2NfdG9wX2hpIDogJXhcbiIsIFJFTE9DKGFsbG9jX3RvcF9oaWdoKSk7CiAJcHJvbV9wcmludGYoIiAgcm1vX3RvcCAgICAgIDogJXhcbiIsIFJFTE9DKHJtb190b3ApKTsKIAlwcm9tX3ByaW50ZigiICByYW1fdG9wICAgICAgOiAleFxuIiwgUkVMT0MocmFtX3RvcCkpOworI2lmZGVmIENPTkZJR19LRVhFQworCWlmIChSRUxPQyhwcm9tX2NyYXNoa19iYXNlKSkgeworCQlwcm9tX3ByaW50ZigiICBjcmFzaGtfYmFzZSAgOiAleFxuIiwgIFJFTE9DKHByb21fY3Jhc2hrX2Jhc2UpKTsKKwkJcHJvbV9wcmludGYoIiAgY3Jhc2hrX3NpemUgIDogJXhcbiIsIFJFTE9DKHByb21fY3Jhc2hrX3NpemUpKTsKKwl9CisjZW5kaWYKIH0KIAogCkBAIC0xNTAwLDYgKzE1NDEsOCBAQAogI2lmZGVmIENPTkZJR19QUEM2NAogCQkJaWYgKHN0cnN0cihwLCBSRUxPQygiTW9tZW50dW0sTWFwbGUiKSkpCiAJCQkJcmV0dXJuIFBMQVRGT1JNX01BUExFOworCQkJaWYgKHN0cnN0cihwLCBSRUxPQygiSUJNLENQQiIpKSkKKwkJCQlyZXR1cm4gUExBVEZPUk1fQ0VMTDsKICNlbmRpZgogCQkJaSArPSBzbCArIDE7CiAJCX0KQEAgLTE5OTQsNyArMjAzNyw3IEBACiAJaWYgKHIzICYmIHI0ICYmIHI0ICE9IDB4ZGVhZGJlZWYpIHsKIAkJdW5zaWduZWQgbG9uZyB2YWw7CiAKLQkJUkVMT0MocHJvbV9pbml0cmRfc3RhcnQpID0gKHIzID49IEtFUk5FTEJBU0UpID8gX19wYShyMykgOiByMzsKKwkJUkVMT0MocHJvbV9pbml0cmRfc3RhcnQpID0gaXNfa2VybmVsX2FkZHIocjMpID8gX19wYShyMykgOiByMzsKIAkJUkVMT0MocHJvbV9pbml0cmRfZW5kKSA9IFJFTE9DKHByb21faW5pdHJkX3N0YXJ0KSArIHI0OwogCiAJCXZhbCA9IFJFTE9DKHByb21faW5pdHJkX3N0YXJ0KTsKQEAgLTIwOTQsNiArMjEzNywxMCBAQAogCSAqLwogCXByb21faW5pdF9tZW0oKTsKIAorI2lmZGVmIENPTkZJR19LRVhFQworCWlmIChSRUxPQyhwcm9tX2NyYXNoa19iYXNlKSkKKwkJcmVzZXJ2ZV9tZW0oUkVMT0MocHJvbV9jcmFzaGtfYmFzZSksIFJFTE9DKHByb21fY3Jhc2hrX3NpemUpKTsKKyNlbmRpZgogCS8qCiAJICogRGV0ZXJtaW5lIHdoaWNoIGNwdSBpcyBhY3R1YWxseSBydW5uaW5nIHJpZ2h0IF9ub3dfCiAJICovCkBAIC0yMTUwLDYgKzIxOTcsMTYgQEAKIAl9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19LRVhFQworCWlmIChSRUxPQyhwcm9tX2NyYXNoa19iYXNlKSkgeworCQlwcm9tX3NldHByb3AoX3Byb20tPmNob3NlbiwgIi9jaG9zZW4iLCAibGludXgsY3Jhc2hrZXJuZWwtYmFzZSIsCisJCQlQVFJSRUxPQygmcHJvbV9jcmFzaGtfYmFzZSksCisJCQlzaXplb2YoUkVMT0MocHJvbV9jcmFzaGtfYmFzZSkpKTsKKwkJcHJvbV9zZXRwcm9wKF9wcm9tLT5jaG9zZW4sICIvY2hvc2VuIiwgImxpbnV4LGNyYXNoa2VybmVsLXNpemUiLAorCQkJUFRSUkVMT0MoJnByb21fY3Jhc2hrX3NpemUpLAorCQkJc2l6ZW9mKFJFTE9DKHByb21fY3Jhc2hrX3NpemUpKSk7CisJfQorI2VuZGlmCiAJLyoKIAkgKiBGaXh1cCBhbnkga25vd24gYnVncyBpbiB0aGUgZGV2aWNlLXRyZWUKIAkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX3BhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwOTljOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jCkBAIC0wLDAgKzEsNTQ4IEBACisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9yZWdzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREJHKGZtdC4uLikgZG8geyBwcmludGsoZm10KTsgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgREJHKGZtdC4uLikgZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QUEM2NAorI2RlZmluZSBQUnU2NAkiJWx4IgorI2Vsc2UKKyNkZWZpbmUgUFJ1NjQJIiVsbHgiCisjZW5kaWYKKworLyogTWF4IGFkZHJlc3Mgc2l6ZSB3ZSBkZWFsIHdpdGggKi8KKyNkZWZpbmUgT0ZfTUFYX0FERFJfQ0VMTFMJNAorI2RlZmluZSBPRl9DSEVDS19DT1VOVFMobmEsIG5zKQkoKG5hKSA+IDAgJiYgKG5hKSA8PSBPRl9NQVhfQUREUl9DRUxMUyAmJiBcCisJCQkobnMpID4gMCkKKworLyogRGVidWcgdXRpbGl0eSAqLworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCBvZl9kdW1wX2FkZHIoY29uc3QgY2hhciAqcywgdTMyICphZGRyLCBpbnQgbmEpCit7CisJcHJpbnRrKCIlcyIsIHMpOworCXdoaWxlKG5hLS0pCisJCXByaW50aygiICUwOHgiLCAqKGFkZHIrKykpOworCXByaW50aygiXG4iKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBvZl9kdW1wX2FkZHIoY29uc3QgY2hhciAqcywgdTMyICphZGRyLCBpbnQgbmEpIHsgfQorI2VuZGlmCisKKy8qIFJlYWQgYSBiaWcgYWRkcmVzcyAqLworc3RhdGljIGlubGluZSB1NjQgb2ZfcmVhZF9hZGRyKHUzMiAqY2VsbCwgaW50IHNpemUpCit7CisJdTY0IHIgPSAwOworCXdoaWxlIChzaXplLS0pCisJCXIgPSAociA8PCAzMikgfCAqKGNlbGwrKyk7CisJcmV0dXJuIHI7Cit9CisKKy8qIENhbGxiYWNrcyBmb3IgYnVzIHNwZWNpZmljIHRyYW5zbGF0b3JzICovCitzdHJ1Y3Qgb2ZfYnVzIHsKKwljb25zdCBjaGFyCSpuYW1lOworCWNvbnN0IGNoYXIJKmFkZHJlc3NlczsKKwlpbnQJCSgqbWF0Y2gpKHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50KTsKKwl2b2lkCQkoKmNvdW50X2NlbGxzKShzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkLAorCQkJCSAgICAgICBpbnQgKmFkZHJjLCBpbnQgKnNpemVjKTsKKwl1NjQJCSgqbWFwKSh1MzIgKmFkZHIsIHUzMiAqcmFuZ2UsIGludCBuYSwgaW50IG5zLCBpbnQgcG5hKTsKKwlpbnQJCSgqdHJhbnNsYXRlKSh1MzIgKmFkZHIsIHU2NCBvZmZzZXQsIGludCBuYSk7CisJdW5zaWduZWQgaW50CSgqZ2V0X2ZsYWdzKSh1MzIgKmFkZHIpOworfTsKKworCisvKgorICogRGVmYXVsdCB0cmFuc2xhdG9yIChnZW5lcmljIGJ1cykKKyAqLworCitzdGF0aWMgdm9pZCBvZl9idXNfZGVmYXVsdF9jb3VudF9jZWxscyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwKKwkJCQkgICAgICAgaW50ICphZGRyYywgaW50ICpzaXplYykKK3sKKwlpZiAoYWRkcmMpCisJCSphZGRyYyA9IHByb21fbl9hZGRyX2NlbGxzKGRldik7CisJaWYgKHNpemVjKQorCQkqc2l6ZWMgPSBwcm9tX25fc2l6ZV9jZWxscyhkZXYpOworfQorCitzdGF0aWMgdTY0IG9mX2J1c19kZWZhdWx0X21hcCh1MzIgKmFkZHIsIHUzMiAqcmFuZ2UsIGludCBuYSwgaW50IG5zLCBpbnQgcG5hKQoreworCXU2NCBjcCwgcywgZGE7CisKKwljcCA9IG9mX3JlYWRfYWRkcihyYW5nZSwgbmEpOworCXMgID0gb2ZfcmVhZF9hZGRyKHJhbmdlICsgbmEgKyBwbmEsIG5zKTsKKwlkYSA9IG9mX3JlYWRfYWRkcihhZGRyLCBuYSk7CisKKwlEQkcoIk9GOiBkZWZhdWx0IG1hcCwgY3A9IlBSdTY0Iiwgcz0iUFJ1NjQiLCBkYT0iUFJ1NjQiXG4iLAorCSAgICBjcCwgcywgZGEpOworCisJaWYgKGRhIDwgY3AgfHwgZGEgPj0gKGNwICsgcykpCisJCXJldHVybiBPRl9CQURfQUREUjsKKwlyZXR1cm4gZGEgLSBjcDsKK30KKworc3RhdGljIGludCBvZl9idXNfZGVmYXVsdF90cmFuc2xhdGUodTMyICphZGRyLCB1NjQgb2Zmc2V0LCBpbnQgbmEpCit7CisJdTY0IGEgPSBvZl9yZWFkX2FkZHIoYWRkciwgbmEpOworCW1lbXNldChhZGRyLCAwLCBuYSAqIDQpOworCWEgKz0gb2Zmc2V0OworCWlmIChuYSA+IDEpCisJCWFkZHJbbmEgLSAyXSA9IGEgPj4gMzI7CisJYWRkcltuYSAtIDFdID0gYSAmIDB4ZmZmZmZmZmZ1OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgb2ZfYnVzX2RlZmF1bHRfZ2V0X2ZsYWdzKHUzMiAqYWRkcikKK3sKKwlyZXR1cm4gSU9SRVNPVVJDRV9NRU07Cit9CisKKworLyoKKyAqIFBDSSBidXMgc3BlY2lmaWMgdHJhbnNsYXRvcgorICovCisKK3N0YXRpYyBpbnQgb2ZfYnVzX3BjaV9tYXRjaChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCS8qICJ2Y2kiIGlzIGZvciB0aGUgL2NoYW9zIGJyaWRnZSBvbiAxc3QtZ2VuIFBDSSBwb3dlcm1hY3MgKi8KKwlyZXR1cm4gIXN0cmNtcChucC0+dHlwZSwgInBjaSIpIHx8ICFzdHJjbXAobnAtPnR5cGUsICJ2Y2kiKTsKK30KKworc3RhdGljIHZvaWQgb2ZfYnVzX3BjaV9jb3VudF9jZWxscyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSAgIGludCAqYWRkcmMsIGludCAqc2l6ZWMpCit7CisJaWYgKGFkZHJjKQorCQkqYWRkcmMgPSAzOworCWlmIChzaXplYykKKwkJKnNpemVjID0gMjsKK30KKworc3RhdGljIHU2NCBvZl9idXNfcGNpX21hcCh1MzIgKmFkZHIsIHUzMiAqcmFuZ2UsIGludCBuYSwgaW50IG5zLCBpbnQgcG5hKQoreworCXU2NCBjcCwgcywgZGE7CisKKwkvKiBDaGVjayBhZGRyZXNzIHR5cGUgbWF0Y2ggKi8KKwlpZiAoKGFkZHJbMF0gXiByYW5nZVswXSkgJiAweDAzMDAwMDAwKQorCQlyZXR1cm4gT0ZfQkFEX0FERFI7CisKKwkvKiBSZWFkIGFkZHJlc3MgdmFsdWVzLCBza2lwcGluZyBoaWdoIGNlbGwgKi8KKwljcCA9IG9mX3JlYWRfYWRkcihyYW5nZSArIDEsIG5hIC0gMSk7CisJcyAgPSBvZl9yZWFkX2FkZHIocmFuZ2UgKyBuYSArIHBuYSwgbnMpOworCWRhID0gb2ZfcmVhZF9hZGRyKGFkZHIgKyAxLCBuYSAtIDEpOworCisJREJHKCJPRjogUENJIG1hcCwgY3A9IlBSdTY0Iiwgcz0iUFJ1NjQiLCBkYT0iUFJ1NjQiXG4iLCBjcCwgcywgZGEpOworCisJaWYgKGRhIDwgY3AgfHwgZGEgPj0gKGNwICsgcykpCisJCXJldHVybiBPRl9CQURfQUREUjsKKwlyZXR1cm4gZGEgLSBjcDsKK30KKworc3RhdGljIGludCBvZl9idXNfcGNpX3RyYW5zbGF0ZSh1MzIgKmFkZHIsIHU2NCBvZmZzZXQsIGludCBuYSkKK3sKKwlyZXR1cm4gb2ZfYnVzX2RlZmF1bHRfdHJhbnNsYXRlKGFkZHIgKyAxLCBvZmZzZXQsIG5hIC0gMSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgb2ZfYnVzX3BjaV9nZXRfZmxhZ3ModTMyICphZGRyKQoreworCXVuc2lnbmVkIGludCBmbGFncyA9IDA7CisJdTMyIHcgPSBhZGRyWzBdOworCisJc3dpdGNoKCh3ID4+IDI0KSAmIDB4MDMpIHsKKwljYXNlIDB4MDE6CisJCWZsYWdzIHw9IElPUkVTT1VSQ0VfSU87CisJY2FzZSAweDAyOiAvKiAzMiBiaXRzICovCisJY2FzZSAweDAzOiAvKiA2NCBiaXRzICovCisJCWZsYWdzIHw9IElPUkVTT1VSQ0VfTUVNOworCX0KKwlpZiAodyAmIDB4NDAwMDAwMDApCisJCWZsYWdzIHw9IElPUkVTT1VSQ0VfUFJFRkVUQ0g7CisJcmV0dXJuIGZsYWdzOworfQorCisvKgorICogSVNBIGJ1cyBzcGVjaWZpYyB0cmFuc2xhdG9yCisgKi8KKworc3RhdGljIGludCBvZl9idXNfaXNhX21hdGNoKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJcmV0dXJuICFzdHJjbXAobnAtPm5hbWUsICJpc2EiKTsKK30KKworc3RhdGljIHZvaWQgb2ZfYnVzX2lzYV9jb3VudF9jZWxscyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkLAorCQkJCSAgIGludCAqYWRkcmMsIGludCAqc2l6ZWMpCit7CisJaWYgKGFkZHJjKQorCQkqYWRkcmMgPSAyOworCWlmIChzaXplYykKKwkJKnNpemVjID0gMTsKK30KKworc3RhdGljIHU2NCBvZl9idXNfaXNhX21hcCh1MzIgKmFkZHIsIHUzMiAqcmFuZ2UsIGludCBuYSwgaW50IG5zLCBpbnQgcG5hKQoreworCXU2NCBjcCwgcywgZGE7CisKKwkvKiBDaGVjayBhZGRyZXNzIHR5cGUgbWF0Y2ggKi8KKwlpZiAoKGFkZHJbMF0gXiByYW5nZVswXSkgJiAweDAwMDAwMDAxKQorCQlyZXR1cm4gT0ZfQkFEX0FERFI7CisKKwkvKiBSZWFkIGFkZHJlc3MgdmFsdWVzLCBza2lwcGluZyBoaWdoIGNlbGwgKi8KKwljcCA9IG9mX3JlYWRfYWRkcihyYW5nZSArIDEsIG5hIC0gMSk7CisJcyAgPSBvZl9yZWFkX2FkZHIocmFuZ2UgKyBuYSArIHBuYSwgbnMpOworCWRhID0gb2ZfcmVhZF9hZGRyKGFkZHIgKyAxLCBuYSAtIDEpOworCisJREJHKCJPRjogSVNBIG1hcCwgY3A9IlBSdTY0Iiwgcz0iUFJ1NjQiLCBkYT0iUFJ1NjQiXG4iLCBjcCwgcywgZGEpOworCisJaWYgKGRhIDwgY3AgfHwgZGEgPj0gKGNwICsgcykpCisJCXJldHVybiBPRl9CQURfQUREUjsKKwlyZXR1cm4gZGEgLSBjcDsKK30KKworc3RhdGljIGludCBvZl9idXNfaXNhX3RyYW5zbGF0ZSh1MzIgKmFkZHIsIHU2NCBvZmZzZXQsIGludCBuYSkKK3sKKwlyZXR1cm4gb2ZfYnVzX2RlZmF1bHRfdHJhbnNsYXRlKGFkZHIgKyAxLCBvZmZzZXQsIG5hIC0gMSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgb2ZfYnVzX2lzYV9nZXRfZmxhZ3ModTMyICphZGRyKQoreworCXVuc2lnbmVkIGludCBmbGFncyA9IDA7CisJdTMyIHcgPSBhZGRyWzBdOworCisJaWYgKHcgJiAxKQorCQlmbGFncyB8PSBJT1JFU09VUkNFX0lPOworCWVsc2UKKwkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9NRU07CisJcmV0dXJuIGZsYWdzOworfQorCisKKy8qCisgKiBBcnJheSBvZiBidXMgc3BlY2lmaWMgdHJhbnNsYXRvcnMKKyAqLworCitzdGF0aWMgc3RydWN0IG9mX2J1cyBvZl9idXNzZXNbXSA9IHsKKwkvKiBQQ0kgKi8KKwl7CisJCS5uYW1lID0gInBjaSIsCisJCS5hZGRyZXNzZXMgPSAiYXNzaWduZWQtYWRkcmVzc2VzIiwKKwkJLm1hdGNoID0gb2ZfYnVzX3BjaV9tYXRjaCwKKwkJLmNvdW50X2NlbGxzID0gb2ZfYnVzX3BjaV9jb3VudF9jZWxscywKKwkJLm1hcCA9IG9mX2J1c19wY2lfbWFwLAorCQkudHJhbnNsYXRlID0gb2ZfYnVzX3BjaV90cmFuc2xhdGUsCisJCS5nZXRfZmxhZ3MgPSBvZl9idXNfcGNpX2dldF9mbGFncywKKwl9LAorCS8qIElTQSAqLworCXsKKwkJLm5hbWUgPSAiaXNhIiwKKwkJLmFkZHJlc3NlcyA9ICJyZWciLAorCQkubWF0Y2ggPSBvZl9idXNfaXNhX21hdGNoLAorCQkuY291bnRfY2VsbHMgPSBvZl9idXNfaXNhX2NvdW50X2NlbGxzLAorCQkubWFwID0gb2ZfYnVzX2lzYV9tYXAsCisJCS50cmFuc2xhdGUgPSBvZl9idXNfaXNhX3RyYW5zbGF0ZSwKKwkJLmdldF9mbGFncyA9IG9mX2J1c19pc2FfZ2V0X2ZsYWdzLAorCX0sCisJLyogRGVmYXVsdCAqLworCXsKKwkJLm5hbWUgPSAiZGVmYXVsdCIsCisJCS5hZGRyZXNzZXMgPSAicmVnIiwKKwkJLm1hdGNoID0gTlVMTCwKKwkJLmNvdW50X2NlbGxzID0gb2ZfYnVzX2RlZmF1bHRfY291bnRfY2VsbHMsCisJCS5tYXAgPSBvZl9idXNfZGVmYXVsdF9tYXAsCisJCS50cmFuc2xhdGUgPSBvZl9idXNfZGVmYXVsdF90cmFuc2xhdGUsCisJCS5nZXRfZmxhZ3MgPSBvZl9idXNfZGVmYXVsdF9nZXRfZmxhZ3MsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfYnVzICpvZl9tYXRjaF9idXMoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9mX2J1c3Nlcyk7IGkgKyspCisJCWlmICghb2ZfYnVzc2VzW2ldLm1hdGNoIHx8IG9mX2J1c3Nlc1tpXS5tYXRjaChucCkpCisJCQlyZXR1cm4gJm9mX2J1c3Nlc1tpXTsKKwlCVUcoKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBvZl90cmFuc2xhdGVfb25lKHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50LCBzdHJ1Y3Qgb2ZfYnVzICpidXMsCisJCQkgICAgc3RydWN0IG9mX2J1cyAqcGJ1cywgdTMyICphZGRyLAorCQkJICAgIGludCBuYSwgaW50IG5zLCBpbnQgcG5hKQoreworCXUzMiAqcmFuZ2VzOworCXVuc2lnbmVkIGludCBybGVuOworCWludCByb25lOworCXU2NCBvZmZzZXQgPSBPRl9CQURfQUREUjsKKworCS8qIE5vcm1hbGx5LCBhbiBhYnNlbmNlIG9mIGEgInJhbmdlcyIgcHJvcGVydHkgbWVhbnMgd2UgYXJlCisJICogY3Jvc3NpbmcgYSBub24tdHJhbnNsYXRhYmxlIGJvdW5kYXJ5LCBhbmQgdGh1cyB0aGUgYWRkcmVzc2VzCisJICogYmVsb3cgdGhlIGN1cnJlbnQgbm90IGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gQ1BVIHBoeXNpY2FsIG9uZXMuCisJICogVW5mb3J0dW5hdGVseSwgd2hpbGUgdGhpcyBpcyB2ZXJ5IGNsZWFyIGluIHRoZSBzcGVjLCBpdCdzIG5vdAorCSAqIHdoYXQgQXBwbGUgdW5kZXJzdG9vZCwgYW5kIHRoZXkgZG8gaGF2ZSB0aGluZ3MgbGlrZSAvdW5pLW4gb3IKKwkgKiAvaHQgbm9kZXMgd2l0aCBubyAicmFuZ2VzIiBwcm9wZXJ0eSBhbmQgYSBsb3Qgb2YgcGVyZmVjdGx5CisJICogdXNlYWJsZSBtYXBwZWQgZGV2aWNlcyBiZWxvdyB0aGVtLiBUaHVzIHdlIHRyZWF0IHRoZSBhYnNlbmNlIG9mCisJICogInJhbmdlcyIgYXMgZXF1aXZhbGVudCB0byBhbiBlbXB0eSAicmFuZ2VzIiBwcm9wZXJ0eSB3aGljaCBtZWFucworCSAqIGEgMToxIHRyYW5zbGF0aW9uIGF0IHRoYXQgbGV2ZWwuIEl0J3MgdXAgdG8gdGhlIGNhbGxlciBub3QgdG8gdHJ5CisJICogdG8gdHJhbnNsYXRlIGFkZHJlc3NlcyB0aGF0IGFyZW4ndCBzdXBwb3NlZCB0byBiZSB0cmFuc2xhdGVkIGluCisJICogdGhlIGZpcnN0IHBsYWNlLiAtLUJlbkguCisJICovCisJcmFuZ2VzID0gKHUzMiAqKWdldF9wcm9wZXJ0eShwYXJlbnQsICJyYW5nZXMiLCAmcmxlbik7CisJaWYgKHJhbmdlcyA9PSBOVUxMIHx8IHJsZW4gPT0gMCkgeworCQlvZmZzZXQgPSBvZl9yZWFkX2FkZHIoYWRkciwgbmEpOworCQltZW1zZXQoYWRkciwgMCwgcG5hICogNCk7CisJCURCRygiT0Y6IG5vIHJhbmdlcywgMToxIHRyYW5zbGF0aW9uXG4iKTsKKwkJZ290byBmaW5pc2g7CisJfQorCisJREJHKCJPRjogd2Fsa2luZyByYW5nZXMuLi5cbiIpOworCisJLyogTm93IHdhbGsgdGhyb3VnaCB0aGUgcmFuZ2VzICovCisJcmxlbiAvPSA0OworCXJvbmUgPSBuYSArIHBuYSArIG5zOworCWZvciAoOyBybGVuID49IHJvbmU7IHJsZW4gLT0gcm9uZSwgcmFuZ2VzICs9IHJvbmUpIHsKKwkJb2Zmc2V0ID0gYnVzLT5tYXAoYWRkciwgcmFuZ2VzLCBuYSwgbnMsIHBuYSk7CisJCWlmIChvZmZzZXQgIT0gT0ZfQkFEX0FERFIpCisJCQlicmVhazsKKwl9CisJaWYgKG9mZnNldCA9PSBPRl9CQURfQUREUikgeworCQlEQkcoIk9GOiBub3QgZm91bmQgIVxuIik7CisJCXJldHVybiAxOworCX0KKwltZW1jcHkoYWRkciwgcmFuZ2VzICsgbmEsIDQgKiBwbmEpOworCisgZmluaXNoOgorCW9mX2R1bXBfYWRkcigiT0Y6IHBhcmVudCB0cmFuc2xhdGlvbiBmb3I6IiwgYWRkciwgcG5hKTsKKwlEQkcoIk9GOiB3aXRoIG9mZnNldDogIlBSdTY0IlxuIiwgb2Zmc2V0KTsKKworCS8qIFRyYW5zbGF0ZSBpdCBpbnRvIHBhcmVudCBidXMgc3BhY2UgKi8KKwlyZXR1cm4gcGJ1cy0+dHJhbnNsYXRlKGFkZHIsIG9mZnNldCwgcG5hKTsKK30KKworCisvKgorICogVHJhbnNsYXRlIGFuIGFkZHJlc3MgZnJvbSB0aGUgZGV2aWNlLXRyZWUgaW50byBhIENQVSBwaHlzaWNhbCBhZGRyZXNzLAorICogdGhpcyB3YWxrcyB1cCB0aGUgdHJlZSBhbmQgYXBwbGllcyB0aGUgdmFyaW91cyBidXMgbWFwcGluZ3Mgb24gdGhlCisgKiB3YXkuCisgKgorICogTm90ZTogV2UgY29uc2lkZXIgdGhhdCBjcm9zc2luZyBhbnkgbGV2ZWwgd2l0aCAjc2l6ZS1jZWxscyA9PSAwIHRvIG1lYW4KKyAqIHRoYXQgdHJhbnNsYXRpb24gaXMgaW1wb3NzaWJsZSAodGhhdCBpcyB3ZSBhcmUgbm90IGRlYWxpbmcgd2l0aCBhIHZhbHVlCisgKiB0aGF0IGNhbiBiZSBtYXBwZWQgdG8gYSBjcHUgcGh5c2ljYWwgYWRkcmVzcykuIFRoaXMgaXMgbm90IHJlYWxseSBzcGVjaWZpZWQKKyAqIHRoYXQgd2F5LCBidXQgdGhpcyBpcyB0cmFkaXRpb25hbGx5IHRoZSB3YXkgSUJNIGF0IGxlYXN0IGRvIHRoaW5ncworICovCit1NjQgb2ZfdHJhbnNsYXRlX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsIHUzMiAqaW5fYWRkcikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IG9mX2J1cyAqYnVzLCAqcGJ1czsKKwl1MzIgYWRkcltPRl9NQVhfQUREUl9DRUxMU107CisJaW50IG5hLCBucywgcG5hLCBwbnM7CisJdTY0IHJlc3VsdCA9IE9GX0JBRF9BRERSOworCisJREJHKCJPRjogKiogdHJhbnNsYXRpb24gZm9yIGRldmljZSAlcyAqKlxuIiwgZGV2LT5mdWxsX25hbWUpOworCisJLyogSW5jcmVhc2UgcmVmY291bnQgYXQgY3VycmVudCBsZXZlbCAqLworCW9mX25vZGVfZ2V0KGRldik7CisKKwkvKiBHZXQgcGFyZW50ICYgbWF0Y2ggYnVzIHR5cGUgKi8KKwlwYXJlbnQgPSBvZl9nZXRfcGFyZW50KGRldik7CisJaWYgKHBhcmVudCA9PSBOVUxMKQorCQlnb3RvIGJhaWw7CisJYnVzID0gb2ZfbWF0Y2hfYnVzKHBhcmVudCk7CisKKwkvKiBDb3VuZCBhZGRyZXNzIGNlbGxzICYgY29weSBhZGRyZXNzIGxvY2FsbHkgKi8KKwlidXMtPmNvdW50X2NlbGxzKGRldiwgJm5hLCAmbnMpOworCWlmICghT0ZfQ0hFQ0tfQ09VTlRTKG5hLCBucykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwcm9tX3BhcnNlOiBCYWQgY2VsbCBjb3VudCBmb3IgJXNcbiIsCisJCSAgICAgICBkZXYtPmZ1bGxfbmFtZSk7CisJCWdvdG8gYmFpbDsKKwl9CisJbWVtY3B5KGFkZHIsIGluX2FkZHIsIG5hICogNCk7CisKKwlEQkcoIk9GOiBidXMgaXMgJXMgKG5hPSVkLCBucz0lZCkgb24gJXNcbiIsCisJICAgIGJ1cy0+bmFtZSwgbmEsIG5zLCBwYXJlbnQtPmZ1bGxfbmFtZSk7CisJb2ZfZHVtcF9hZGRyKCJPRjogdHJhbnNsYXRpbmcgYWRkcmVzczoiLCBhZGRyLCBuYSk7CisKKwkvKiBUcmFuc2xhdGUgKi8KKwlmb3IgKDs7KSB7CisJCS8qIFN3aXRjaCB0byBwYXJlbnQgYnVzICovCisJCW9mX25vZGVfcHV0KGRldik7CisJCWRldiA9IHBhcmVudDsKKwkJcGFyZW50ID0gb2ZfZ2V0X3BhcmVudChkZXYpOworCisJCS8qIElmIHJvb3QsIHdlIGhhdmUgZmluaXNoZWQgKi8KKwkJaWYgKHBhcmVudCA9PSBOVUxMKSB7CisJCQlEQkcoIk9GOiByZWFjaGVkIHJvb3Qgbm9kZVxuIik7CisJCQlyZXN1bHQgPSBvZl9yZWFkX2FkZHIoYWRkciwgbmEpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBHZXQgbmV3IHBhcmVudCBidXMgYW5kIGNvdW50cyAqLworCQlwYnVzID0gb2ZfbWF0Y2hfYnVzKHBhcmVudCk7CisJCXBidXMtPmNvdW50X2NlbGxzKGRldiwgJnBuYSwgJnBucyk7CisJCWlmICghT0ZfQ0hFQ0tfQ09VTlRTKHBuYSwgcG5zKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJwcm9tX3BhcnNlOiBCYWQgY2VsbCBjb3VudCBmb3IgJXNcbiIsCisJCQkgICAgICAgZGV2LT5mdWxsX25hbWUpOworCQkJYnJlYWs7CisJCX0KKworCQlEQkcoIk9GOiBwYXJlbnQgYnVzIGlzICVzIChuYT0lZCwgbnM9JWQpIG9uICVzXG4iLAorCQkgICAgcGJ1cy0+bmFtZSwgcG5hLCBwbnMsIHBhcmVudC0+ZnVsbF9uYW1lKTsKKworCQkvKiBBcHBseSBidXMgdHJhbnNsYXRpb24gKi8KKwkJaWYgKG9mX3RyYW5zbGF0ZV9vbmUoZGV2LCBidXMsIHBidXMsIGFkZHIsIG5hLCBucywgcG5hKSkKKwkJCWJyZWFrOworCisJCS8qIENvbXBsZXRlIHRoZSBtb3ZlIHVwIG9uZSBsZXZlbCAqLworCQluYSA9IHBuYTsKKwkJbnMgPSBwbnM7CisJCWJ1cyA9IHBidXM7CisKKwkJb2ZfZHVtcF9hZGRyKCJPRjogb25lIGxldmVsIHRyYW5zbGF0aW9uOiIsIGFkZHIsIG5hKTsKKwl9CisgYmFpbDoKKwlvZl9ub2RlX3B1dChwYXJlbnQpOworCW9mX25vZGVfcHV0KGRldik7CisKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTChvZl90cmFuc2xhdGVfYWRkcmVzcyk7CisKK3UzMiAqb2ZfZ2V0X2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBpbmRleCwgdTY0ICpzaXplLAorCQkgICAgdW5zaWduZWQgaW50ICpmbGFncykKK3sKKwl1MzIgKnByb3A7CisJdW5zaWduZWQgaW50IHBzaXplOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50OworCXN0cnVjdCBvZl9idXMgKmJ1czsKKwlpbnQgb25lc2l6ZSwgaSwgbmEsIG5zOworCisJLyogR2V0IHBhcmVudCAmIG1hdGNoIGJ1cyB0eXBlICovCisJcGFyZW50ID0gb2ZfZ2V0X3BhcmVudChkZXYpOworCWlmIChwYXJlbnQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJYnVzID0gb2ZfbWF0Y2hfYnVzKHBhcmVudCk7CisJYnVzLT5jb3VudF9jZWxscyhkZXYsICZuYSwgJm5zKTsKKwlvZl9ub2RlX3B1dChwYXJlbnQpOworCWlmICghT0ZfQ0hFQ0tfQ09VTlRTKG5hLCBucykpCisJCXJldHVybiBOVUxMOworCisJLyogR2V0ICJyZWciIG9yICJhc3NpZ25lZC1hZGRyZXNzZXMiIHByb3BlcnR5ICovCisJcHJvcCA9ICh1MzIgKilnZXRfcHJvcGVydHkoZGV2LCBidXMtPmFkZHJlc3NlcywgJnBzaXplKTsKKwlpZiAocHJvcCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlwc2l6ZSAvPSA0OworCisJb25lc2l6ZSA9IG5hICsgbnM7CisJZm9yIChpID0gMDsgcHNpemUgPj0gb25lc2l6ZTsgcHNpemUgLT0gb25lc2l6ZSwgcHJvcCArPSBvbmVzaXplLCBpKyspCisJCWlmIChpID09IGluZGV4KSB7CisJCQlpZiAoc2l6ZSkKKwkJCQkqc2l6ZSA9IG9mX3JlYWRfYWRkcihwcm9wICsgbmEsIG5zKTsKKwkJCWlmIChmbGFncykKKwkJCQkqZmxhZ3MgPSBidXMtPmdldF9mbGFncyhwcm9wKTsKKwkJCXJldHVybiBwcm9wOworCQl9CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2dldF9hZGRyZXNzKTsKKwordTMyICpvZl9nZXRfcGNpX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBiYXJfbm8sIHU2NCAqc2l6ZSwKKwkJCXVuc2lnbmVkIGludCAqZmxhZ3MpCit7CisJdTMyICpwcm9wOworCXVuc2lnbmVkIGludCBwc2l6ZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudDsKKwlzdHJ1Y3Qgb2ZfYnVzICpidXM7CisJaW50IG9uZXNpemUsIGksIG5hLCBuczsKKworCS8qIEdldCBwYXJlbnQgJiBtYXRjaCBidXMgdHlwZSAqLworCXBhcmVudCA9IG9mX2dldF9wYXJlbnQoZGV2KTsKKwlpZiAocGFyZW50ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWJ1cyA9IG9mX21hdGNoX2J1cyhwYXJlbnQpOworCWlmIChzdHJjbXAoYnVzLT5uYW1lLCAicGNpIikpCisJCXJldHVybiBOVUxMOworCWJ1cy0+Y291bnRfY2VsbHMoZGV2LCAmbmEsICZucyk7CisJb2Zfbm9kZV9wdXQocGFyZW50KTsKKwlpZiAoIU9GX0NIRUNLX0NPVU5UUyhuYSwgbnMpKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIEdldCAicmVnIiBvciAiYXNzaWduZWQtYWRkcmVzc2VzIiBwcm9wZXJ0eSAqLworCXByb3AgPSAodTMyICopZ2V0X3Byb3BlcnR5KGRldiwgYnVzLT5hZGRyZXNzZXMsICZwc2l6ZSk7CisJaWYgKHByb3AgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcHNpemUgLz0gNDsKKworCW9uZXNpemUgPSBuYSArIG5zOworCWZvciAoaSA9IDA7IHBzaXplID49IG9uZXNpemU7IHBzaXplIC09IG9uZXNpemUsIHByb3AgKz0gb25lc2l6ZSwgaSsrKQorCQlpZiAoKHByb3BbMF0gJiAweGZmKSA9PSAoKGJhcl9ubyAqIDQpICsgUENJX0JBU0VfQUREUkVTU18wKSkgeworCQkJaWYgKHNpemUpCisJCQkJKnNpemUgPSBvZl9yZWFkX2FkZHIocHJvcCArIG5hLCBucyk7CisJCQlpZiAoZmxhZ3MpCisJCQkJKmZsYWdzID0gYnVzLT5nZXRfZmxhZ3MocHJvcCk7CisJCQlyZXR1cm4gcHJvcDsKKwkJfQorCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChvZl9nZXRfcGNpX2FkZHJlc3MpOworCitzdGF0aWMgaW50IF9fb2ZfYWRkcmVzc190b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgdTMyICphZGRycCwKKwkJCQkgICAgdTY0IHNpemUsIHVuc2lnbmVkIGludCBmbGFncywKKwkJCQkgICAgc3RydWN0IHJlc291cmNlICpyKQoreworCXU2NCB0YWRkcjsKKworCWlmICgoZmxhZ3MgJiAoSU9SRVNPVVJDRV9JTyB8IElPUkVTT1VSQ0VfTUVNKSkgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdGFkZHIgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhkZXYsIGFkZHJwKTsKKwlpZiAodGFkZHIgPT0gT0ZfQkFEX0FERFIpCisJCXJldHVybiAtRUlOVkFMOworCW1lbXNldChyLCAwLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CisJaWYgKGZsYWdzICYgSU9SRVNPVVJDRV9JTykgeworCQl1bnNpZ25lZCBsb25nIHBvcnQ7CisJCXBvcnQgPSBwY2lfYWRkcmVzc190b19waW8odGFkZHIpOworCQlpZiAocG9ydCA9PSAodW5zaWduZWQgbG9uZyktMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyLT5zdGFydCA9IHBvcnQ7CisJCXItPmVuZCA9IHBvcnQgKyBzaXplIC0gMTsKKwl9IGVsc2UgeworCQlyLT5zdGFydCA9IHRhZGRyOworCQlyLT5lbmQgPSB0YWRkciArIHNpemUgLSAxOworCX0KKwlyLT5mbGFncyA9IGZsYWdzOworCXItPm5hbWUgPSBkZXYtPm5hbWU7CisJcmV0dXJuIDA7Cit9CisKK2ludCBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgaW5kZXgsCisJCQkgICBzdHJ1Y3QgcmVzb3VyY2UgKnIpCit7CisJdTMyCQkqYWRkcnA7CisJdTY0CQlzaXplOworCXVuc2lnbmVkIGludAlmbGFnczsKKworCWFkZHJwID0gb2ZfZ2V0X2FkZHJlc3MoZGV2LCBpbmRleCwgJnNpemUsICZmbGFncyk7CisJaWYgKGFkZHJwID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBfX29mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZGV2LCBhZGRycCwgc2l6ZSwgZmxhZ3MsIHIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfYWRkcmVzc190b19yZXNvdXJjZSk7CisKK2ludCBvZl9wY2lfYWRkcmVzc190b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGJhciwKKwkJCSAgICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnIpCit7CisJdTMyCQkqYWRkcnA7CisJdTY0CQlzaXplOworCXVuc2lnbmVkIGludAlmbGFnczsKKworCWFkZHJwID0gb2ZfZ2V0X3BjaV9hZGRyZXNzKGRldiwgYmFyLCAmc2l6ZSwgJmZsYWdzKTsKKwlpZiAoYWRkcnAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIF9fb2ZfYWRkcmVzc190b19yZXNvdXJjZShkZXYsIGFkZHJwLCBzaXplLCBmbGFncywgcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvZl9wY2lfYWRkcmVzc190b19yZXNvdXJjZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS1jb21tb24uaCBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLWNvbW1vbi5oCmluZGV4IGIxYmFiYjcuLjVjY2JkYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLWNvbW1vbi5oCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLWNvbW1vbi5oCkBAIC02Miw3ICs2Miw3IEBACiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrLT50aHJlYWQucmVnczsKIAlpZiAocmVncyAhPSBOVUxMKQogCQlyZWdzLT5tc3IgfD0gTVNSX1NFOwotCXNldF90aV90aHJlYWRfZmxhZyh0YXNrLT50aHJlYWRfaW5mbywgVElGX1NJTkdMRVNURVApOworCXNldF90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX1NJTkdMRVNURVApOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfc2luZ2xlX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQpAQCAtNzAsNyArNzAsNyBAQAogCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFzay0+dGhyZWFkLnJlZ3M7CiAJaWYgKHJlZ3MgIT0gTlVMTCkKIAkJcmVncy0+bXNyICY9IH5NU1JfU0U7Ci0JY2xlYXJfdGlfdGhyZWFkX2ZsYWcodGFzay0+dGhyZWFkX2luZm8sIFRJRl9TSU5HTEVTVEVQKTsKKwljbGVhcl90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX1NJTkdMRVNURVApOwogfQogCiAjaWZkZWYgQ09ORklHX0FMVElWRUMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlMzIuYwppbmRleCA2MTc2MjY0Li44MjZlZTNkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZTMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UzMi5jCkBAIC00NSwzMyArNDUsMTkgQEAKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkOwotCWludCByZXQgPSAtRVBFUk07CisJaW50IHJldDsKIAogCWxvY2tfa2VybmVsKCk7CiAJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1RSQUNFTUUpIHsKLQkJLyogYXJlIHdlIGFscmVhZHkgYmVpbmcgdHJhY2VkPyAqLwotCQlpZiAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkKLQkJCWdvdG8gb3V0OwotCQlyZXQgPSBzZWN1cml0eV9wdHJhY2UoY3VycmVudC0+cGFyZW50LCBjdXJyZW50KTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OwotCQkvKiBzZXQgdGhlIHB0cmFjZSBiaXQgaW4gdGhlIHByb2Nlc3MgZmxhZ3MuICovCi0JCWN1cnJlbnQtPnB0cmFjZSB8PSBQVF9QVFJBQ0VEOwotCQlyZXQgPSAwOworCQlyZXQgPSBwdHJhY2VfdHJhY2VtZSgpOwogCQlnb3RvIG91dDsKIAl9Ci0JcmV0ID0gLUVTUkNIOwotCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7Ci0JY2hpbGQgPSBmaW5kX3Rhc2tfYnlfcGlkKHBpZCk7Ci0JaWYgKGNoaWxkKQotCQlnZXRfdGFza19zdHJ1Y3QoY2hpbGQpOwotCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQlpZiAoIWNoaWxkKQotCQlnb3RvIG91dDsKIAotCXJldCA9IC1FUEVSTTsKLQlpZiAocGlkID09IDEpCQkvKiB5b3UgbWF5IG5vdCBtZXNzIHdpdGggaW5pdCAqLwotCQlnb3RvIG91dF90c2s7CisJY2hpbGQgPSBwdHJhY2VfZ2V0X3Rhc2tfc3RydWN0KHBpZCk7CisJaWYgKElTX0VSUihjaGlsZCkpIHsKKwkJcmV0ID0gUFRSX0VSUihjaGlsZCk7CisJCWdvdG8gb3V0OworCX0KIAogCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9BVFRBQ0gpIHsKIAkJcmV0ID0gcHRyYWNlX2F0dGFjaChjaGlsZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy5jCmluZGV4IDQyODNmYTMuLjdmZTRhNWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKICNpbmNsdWRlIDxhc20vcHJvbS5oPgpAQCAtMjksMTEgKzMwLDE3IEBACiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vbG1iLmg+CisjaW5jbHVkZSA8YXNtL3VkYmcuaD4KIAogc3RydWN0IHJ0YXNfdCBydGFzID0gewogCS5sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VECiB9OwogCitzdHJ1Y3QgcnRhc19zdXNwZW5kX21lX2RhdGEgeworCWxvbmcgd2FpdGluZzsKKwlzdHJ1Y3QgcnRhc19hcmdzICphcmdzOworfTsKKwogRVhQT1JUX1NZTUJPTChydGFzKTsKIAogREVGSU5FX1NQSU5MT0NLKHJ0YXNfZGF0YV9idWZfbG9jayk7CkBAIC01Miw3ICs1OSw3IEBACiAgKiBhcmUgZGVzaWduZWQgb25seSBmb3IgdmVyeSBlYXJseSBsb3ctbGV2ZWwgZGVidWdnaW5nLCB3aGljaAogICogaXMgd2h5IHRoZSB0b2tlbiBpcyBoYXJkLWNvZGVkIHRvIDEwLgogICovCi12b2lkIGNhbGxfcnRhc19kaXNwbGF5X3N0YXR1cyh1bnNpZ25lZCBjaGFyIGMpCitzdGF0aWMgdm9pZCBjYWxsX3J0YXNfZGlzcGxheV9zdGF0dXMoY2hhciBjKQogewogCXN0cnVjdCBydGFzX2FyZ3MgKmFyZ3MgPSAmcnRhcy5hcmdzOwogCXVuc2lnbmVkIGxvbmcgczsKQEAgLTY1LDE0ICs3MiwxNCBAQAogCWFyZ3MtPm5hcmdzID0gMTsKIAlhcmdzLT5ucmV0ICA9IDE7CiAJYXJncy0+cmV0cyAgPSAocnRhc19hcmdfdCAqKSYoYXJncy0+YXJnc1sxXSk7Ci0JYXJncy0+YXJnc1swXSA9IChpbnQpYzsKKwlhcmdzLT5hcmdzWzBdID0gKHVuc2lnbmVkIGNoYXIpYzsKIAogCWVudGVyX3J0YXMoX19wYShhcmdzKSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGFzLmxvY2ssIHMpOwogfQogCi12b2lkIGNhbGxfcnRhc19kaXNwbGF5X3N0YXR1c19kZWxheSh1bnNpZ25lZCBjaGFyIGMpCitzdGF0aWMgdm9pZCBjYWxsX3J0YXNfZGlzcGxheV9zdGF0dXNfZGVsYXkoY2hhciBjKQogewogCXN0YXRpYyBpbnQgcGVuZGluZ19uZXdsaW5lID0gMDsgIC8qIGRpZCBsYXN0IHdyaXRlIGVuZCB3aXRoIHVucHJpbnRlZCBuZXdsaW5lPyAqLwogCXN0YXRpYyBpbnQgd2lkdGggPSAxNjsKQEAgLTk2LDYgKzEwMywxMSBAQAogCX0KIH0KIAordm9pZCBfX2luaXQgdWRiZ19pbml0X3J0YXModm9pZCkKK3sKKwl1ZGJnX3B1dGMgPSBjYWxsX3J0YXNfZGlzcGxheV9zdGF0dXNfZGVsYXk7Cit9CisKIHZvaWQgcnRhc19wcm9ncmVzcyhjaGFyICpzLCB1bnNpZ25lZCBzaG9ydCBoZXgpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpyb290OwpAQCAtNTQ5LDYgKzU2MSw4MCBAQAogCX0gd2hpbGUgKHN0YXR1cyA9PSBSVEFTX0JVU1kpOwogfQogCitzdGF0aWMgaW50IGlibV9zdXNwZW5kX21lX3Rva2VuID0gUlRBU19VTktOT1dOX1NFUlZJQ0U7CisjaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCitzdGF0aWMgdm9pZCBydGFzX3BlcmNwdV9zdXNwZW5kX21lKHZvaWQgKmluZm8pCit7CisJbG9uZyByYzsKKwlsb25nIGZsYWdzOworCXN0cnVjdCBydGFzX3N1c3BlbmRfbWVfZGF0YSAqZGF0YSA9CisJCShzdHJ1Y3QgcnRhc19zdXNwZW5kX21lX2RhdGEgKilpbmZvOworCisJLyoKKwkgKiBXZSB1c2UgIndhaXRpbmciIHRvIGluZGljYXRlIG91ciBzdGF0ZS4gIEFzIGxvbmcKKwkgKiBhcyBpdCBpcyA+MCwgd2UgYXJlIHN0aWxsIHRyeWluZyB0byBhbGwgam9pbiB1cC4KKwkgKiBJZiBpdCBnb2VzIHRvIDAsIHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IGpvaW5lZCB1cCBhbmQKKwkgKiBvbmUgdGhyZWFkIGdvdCBIX0NvbnRpbnVlLiAgSWYgYW55IGVycm9yIGhhcHBlbnMsCisJICogd2Ugc2V0IGl0IHRvIDwwLgorCSAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlkbyB7CisJCXJjID0gcGxwYXJfaGNhbGxfbm9yZXRzKEhfSk9JTik7CisJCXNtcF9ybWIoKTsKKwl9IHdoaWxlIChyYyA9PSBIX1N1Y2Nlc3MgJiYgZGF0YS0+d2FpdGluZyA+IDApOworCWlmIChyYyA9PSBIX1N1Y2Nlc3MpCisJCWdvdG8gb3V0OworCisJaWYgKHJjID09IEhfQ29udGludWUpIHsKKwkJZGF0YS0+d2FpdGluZyA9IDA7CisJCXJ0YXNfY2FsbChpYm1fc3VzcGVuZF9tZV90b2tlbiwgMCwgMSwKKwkJCSAgZGF0YS0+YXJncy0+YXJncyk7CisJfSBlbHNlIHsKKwkJZGF0YS0+d2FpdGluZyA9IC1FQlVTWTsKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBvbiBIX0pvaW4gaHlwZXJ2aXNvciBjYWxsXG4iKTsKKwl9CisKK291dDoKKwkvKiBiZWZvcmUgd2UgcmVzdG9yZSBpbnRlcnJ1cHRzLCBtYWtlIHN1cmUgd2UgZG9uJ3QKKwkgKiBnZW5lcmF0ZSBhIHNwdXJpb3VzIHNvZnQgbG9ja3VwIGVycm9ycworCSAqLworCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHJ0YXNfaWJtX3N1c3BlbmRfbWUoc3RydWN0IHJ0YXNfYXJncyAqYXJncykKK3sKKwlpbnQgaTsKKworCXN0cnVjdCBydGFzX3N1c3BlbmRfbWVfZGF0YSBkYXRhOworCisJZGF0YS53YWl0aW5nID0gMTsKKwlkYXRhLmFyZ3MgPSBhcmdzOworCisJLyogQ2FsbCBmdW5jdGlvbiBvbiBhbGwgQ1BVcy4gIE9uZSBvZiB1cyB3aWxsIG1ha2UgdGhlCisJICogcnRhcyBjYWxsCisJICovCisJaWYgKG9uX2VhY2hfY3B1KHJ0YXNfcGVyY3B1X3N1c3BlbmRfbWUsICZkYXRhLCAxLCAwKSkKKwkJZGF0YS53YWl0aW5nID0gLUVJTlZBTDsKKworCWlmIChkYXRhLndhaXRpbmcgIT0gMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBkb2luZyBnbG9iYWwgam9pblxuIik7CisKKwkvKiBQcm9kIGVhY2ggQ1BVLiAgVGhpcyB3b24ndCBodXJ0LCBhbmQgd2lsbCB3YWtlCisJICogYW55b25lIHdlIHN1Y2Nlc3NmdWxseSBwdXQgdG8gc2xlZXAgd2l0aCBIX0pvaW4KKwkgKi8KKwlmb3JfZWFjaF9jcHUoaSkKKwkJcGxwYXJfaGNhbGxfbm9yZXRzKEhfUFJPRCwgaSk7CisKKwlyZXR1cm4gZGF0YS53YWl0aW5nOworfQorI2Vsc2UgLyogQ09ORklHX1BQQ19QU0VSSUVTICovCitzdGF0aWMgaW50IHJ0YXNfaWJtX3N1c3BlbmRfbWUoc3RydWN0IHJ0YXNfYXJncyAqYXJncykKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKyNlbmRpZgogCiBhc21saW5rYWdlIGludCBwcGNfcnRhcyhzdHJ1Y3QgcnRhc19hcmdzIF9fdXNlciAqdWFyZ3MpCiB7CkBAIC01NTYsNiArNjQyLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWNoYXIgKmJ1ZmZfY29weSwgKmVycmJ1ZiA9IE5VTEw7CiAJaW50IG5hcmdzOworCWludCByYzsKIAogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKQEAgLTU3NCw2ICs2NjEsMTcgQEAKIAkJCSAgIG5hcmdzICogc2l6ZW9mKHJ0YXNfYXJnX3QpKSAhPSAwKQogCQlyZXR1cm4gLUVGQVVMVDsKIAorCWlmIChhcmdzLnRva2VuID09IFJUQVNfVU5LTk9XTl9TRVJWSUNFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE5lZWQgdG8gaGFuZGxlIGlibSxzdXNwZW5kX21lIGNhbGwgc3BlY2lhbGx5ICovCisJaWYgKGFyZ3MudG9rZW4gPT0gaWJtX3N1c3BlbmRfbWVfdG9rZW4pIHsKKwkJcmMgPSBydGFzX2libV9zdXNwZW5kX21lKCZhcmdzKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCQlnb3RvIGNvcHlfcmV0dXJuOworCX0KKwogCWJ1ZmZfY29weSA9IGdldF9lcnJvcmxvZ19idWZmZXIoKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZydGFzLmxvY2ssIGZsYWdzKTsKQEAgLTU5Nyw2ICs2OTUsNyBAQAogCQlrZnJlZShidWZmX2NvcHkpOwogCX0KIAorIGNvcHlfcmV0dXJuOgogCS8qIENvcHkgb3V0IGFyZ3MuICovCiAJaWYgKGNvcHlfdG9fdXNlcih1YXJncy0+YXJncyArIG5hcmdzLAogCQkJIGFyZ3MuYXJncyArIG5hcmdzLApAQCAtNjMyLDcgKzczMSw3IEBACiB9CiAKIC8qCi0gKiBDYWxsIGVhcmx5IGR1cmluZyBib290LCBiZWZvcmUgbWVtIGluaXQgb3IgYm9vdG1lbSwgdG8gcmV0cmVpdmUgdGhlIFJUQVMKKyAqIENhbGwgZWFybHkgZHVyaW5nIGJvb3QsIGJlZm9yZSBtZW0gaW5pdCBvciBib290bWVtLCB0byByZXRyaWV2ZSB0aGUgUlRBUwogICogaW5mb3JtYXRpb25zIGZyb20gdGhlIGRldmljZS10cmVlIGFuZCBhbGxvY2F0ZSB0aGUgUk1PIGJ1ZmZlciBmb3IgdXNlcmxhbmQKICAqIGFjY2Vzc2VzLgogICovCkBAIC02NjgsOCArNzY3LDEwIEBACiAJICogdGhlIHN0b3Atc2VsZiB0b2tlbiBpZiBhbnkKIAkgKi8KICNpZmRlZiBDT05GSUdfUFBDNjQKLQlpZiAoX21hY2hpbmUgPT0gUExBVEZPUk1fUFNFUklFU19MUEFSKQorCWlmIChfbWFjaGluZSA9PSBQTEFURk9STV9QU0VSSUVTX0xQQVIpIHsKIAkJcnRhc19yZWdpb24gPSBtaW4obG1iLnJtb19zaXplLCBSVEFTX0lOU1RBTlRJQVRFX01BWCk7CisJCWlibV9zdXNwZW5kX21lX3Rva2VuID0gcnRhc190b2tlbigiaWJtLHN1c3BlbmQtbWUiKTsKKwl9CiAjZW5kaWYKIAlydGFzX3Jtb19idWYgPSBsbWJfYWxsb2NfYmFzZShSVEFTX1JNT0JVRl9NQVgsIFBBR0VfU0laRSwgcnRhc19yZWdpb24pOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXNfcGNpLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXNfcGNpLmMKaW5kZXggNjBkZWMyNC4uNTU3OWY2NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc19wY2kuYwpAQCAtNzIsNyArNzIsNyBAQAogICAgICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBydGFzX3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfZG4gKnBkbiwgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyICp2YWwpCitpbnQgcnRhc19yZWFkX2NvbmZpZyhzdHJ1Y3QgcGNpX2RuICpwZG4sIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiAqdmFsKQogewogCWludCByZXR1cm52YWwgPSAtMTsKIAl1bnNpZ25lZCBsb25nIGJ1aWQsIGFkZHI7CkBAIC0xODgsMzkgKzE4OCwxOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdldF9waGJfcmVnX3Byb3Aoc3RydWN0IGRldmljZV9ub2RlICpkZXYsCi0JCQkgICAgdW5zaWduZWQgaW50IGFkZHJfc2l6ZV93b3JkcywKLQkJCSAgICBzdHJ1Y3QgcmVnX3Byb3BlcnR5NjQgKnJlZykKK3N0YXRpYyB2b2lkIHB5dGhvbl9jb3VudGVybWVhc3VyZXMoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCiB7Ci0JdW5zaWduZWQgaW50ICp1aV9wdHIgPSBOVUxMLCBsZW47Ci0KLQkvKiBGb3VuZCBhIFBIQiwgbm93IGZpZ3VyZSBvdXQgd2hlcmUgaGlzIHJlZ2lzdGVycyBhcmUgbWFwcGVkLiAqLwotCXVpX3B0ciA9ICh1bnNpZ25lZCBpbnQgKilnZXRfcHJvcGVydHkoZGV2LCAicmVnIiwgJmxlbik7Ci0JaWYgKHVpX3B0ciA9PSBOVUxMKQotCQlyZXR1cm4gMTsKLQotCWlmIChhZGRyX3NpemVfd29yZHMgPT0gMSkgewotCQlyZWctPmFkZHJlc3MgPSAoKHN0cnVjdCByZWdfcHJvcGVydHkzMiAqKXVpX3B0ciktPmFkZHJlc3M7Ci0JCXJlZy0+c2l6ZSAgICA9ICgoc3RydWN0IHJlZ19wcm9wZXJ0eTMyICopdWlfcHRyKS0+c2l6ZTsKLQl9IGVsc2UgewotCQkqcmVnID0gKigoc3RydWN0IHJlZ19wcm9wZXJ0eTY0ICopdWlfcHRyKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcHl0aG9uX2NvdW50ZXJtZWFzdXJlcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwKLQkJCQkgICB1bnNpZ25lZCBpbnQgYWRkcl9zaXplX3dvcmRzKQotewotCXN0cnVjdCByZWdfcHJvcGVydHk2NCByZWdfc3RydWN0OworCXN0cnVjdCByZXNvdXJjZSByZWdpc3RlcnM7CiAJdm9pZCBfX2lvbWVtICpjaGlwX3JlZ3M7CiAJdm9sYXRpbGUgdTMyIHZhbDsKIAotCWlmIChnZXRfcGhiX3JlZ19wcm9wKGRldiwgYWRkcl9zaXplX3dvcmRzLCAmcmVnX3N0cnVjdCkpCisJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZGV2LCAwLCAmcmVnaXN0ZXJzKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IGdldCBhZGRyZXNzIGZvciBQeXRob24gd29ya2Fyb3VuZHMgIVxuIik7CiAJCXJldHVybjsKKwl9CiAKIAkvKiBQeXRob24ncyByZWdpc3RlciBmaWxlIGlzIDEgTUIgaW4gc2l6ZS4gKi8KLQljaGlwX3JlZ3MgPSBpb3JlbWFwKHJlZ19zdHJ1Y3QuYWRkcmVzcyAmIH4oMHhmZmZmZlVMKSwgMHgxMDAwMDApOworCWNoaXBfcmVncyA9IGlvcmVtYXAocmVnaXN0ZXJzLnN0YXJ0ICYgfigweGZmZmZmVUwpLCAweDEwMDAwMCk7CiAKIAkvKgogCSAqIEZpcm13YXJlIGRvZXNuJ3QgYWx3YXlzIGNsZWFyIHRoaXMgYml0IHdoaWNoIGlzIGNyaXRpY2FsCkBAIC0zMDEsMTEgKzI4MSwxMCBAQAogfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzZXR1cF9waGIoc3RydWN0IGRldmljZV9ub2RlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGFkZHJfc2l6ZV93b3JkcykKKwkJCSAgICAgICBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYikKIHsKIAlpZiAoaXNfcHl0aG9uKGRldikpCi0JCXB5dGhvbl9jb3VudGVybWVhc3VyZXMoZGV2LCBhZGRyX3NpemVfd29yZHMpOworCQlweXRob25fY291bnRlcm1lYXN1cmVzKGRldik7CiAKIAlpZiAocGhiX3NldF9idXNfcmFuZ2VzKGRldiwgcGhiKSkKIAkJcmV0dXJuIDE7CkBAIC0zMjAsOCArMjk5LDggQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGI7Ci0JdW5zaWduZWQgaW50IHJvb3Rfc2l6ZV9jZWxscyA9IDA7CiAJdW5zaWduZWQgaW50IGluZGV4OworCXVuc2lnbmVkIGludCByb290X3NpemVfY2VsbHMgPSAwOwogCXVuc2lnbmVkIGludCAqb3Bwcm9wID0gTlVMTDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOwogCkBAIC0zNDMsMTAgKzMyMiwxMSBAQAogCQlwaGIgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIobm9kZSk7CiAJCWlmICghcGhiKQogCQkJY29udGludWU7Ci0JCXNldHVwX3BoYihub2RlLCBwaGIsIHJvb3Rfc2l6ZV9jZWxscyk7CisJCXNldHVwX3BoYihub2RlLCBwaGIpOwogCQlwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKHBoYiwgbm9kZSwgMCk7CiAJCXBjaV9zZXR1cF9waGJfaW8ocGhiLCBpbmRleCA9PSAwKTsKICNpZmRlZiBDT05GSUdfUFBDX1BTRVJJRVMKKwkJLyogWFhYIFRoaXMgY29kZSBuZWVkIHNlcmlvdXMgZml4aW5nIC4uLiAtLUJlbkggKi8KIAkJaWYgKHBwYzY0X2ludGVycnVwdF9jb250cm9sbGVyID09IElDX09QRU5fUElDICYmIHBTZXJpZXNfbXBpYykgewogCQkJaW50IGFkZHIgPSByb290X3NpemVfY2VsbHMgKiAoaW5kZXggKyAyKSAtIDE7CiAJCQltcGljX2Fzc2lnbl9pc3UocFNlcmllc19tcGljLCBpbmRleCwgb3Bwcm9wW2FkZHJdKTsKQEAgLTM4MSwyMiArMzYxLDE3IEBACiAKIHN0cnVjdCBwY2lfY29udHJvbGxlciAqIF9fZGV2aW5pdCBpbml0X3BoYl9keW5hbWljKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKLQl1bnNpZ25lZCBpbnQgcm9vdF9zaXplX2NlbGxzID0gMDsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYjsKIAlpbnQgcHJpbWFyeTsKIAotCXJvb3Rfc2l6ZV9jZWxscyA9IHByb21fbl9zaXplX2NlbGxzKHJvb3QpOwotCiAJcHJpbWFyeSA9IGxpc3RfZW1wdHkoJmhvc2VfbGlzdCk7CiAJcGhiID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKGRuKTsKIAlpZiAoIXBoYikKIAkJcmV0dXJuIE5VTEw7Ci0Jc2V0dXBfcGhiKGRuLCBwaGIsIHJvb3Rfc2l6ZV9jZWxscyk7CisJc2V0dXBfcGhiKGRuLCBwaGIpOwogCXBjaV9wcm9jZXNzX2JyaWRnZV9PRl9yYW5nZXMocGhiLCBkbiwgcHJpbWFyeSk7CiAKIAlwY2lfc2V0dXBfcGhiX2lvX2R5bmFtaWMocGhiLCBwcmltYXJ5KTsKLQlvZl9ub2RlX3B1dChyb290KTsKIAogCXBjaV9kZXZzX3BoYl9pbml0X2R5bmFtaWMocGhiKTsKIAlzY2FuX3BoYihwaGIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMKaW5kZXggYmQzZWI0Mi4uYmUxMjA0MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jCkBAIC05MywxNCArOTMsMTUgQEAKIC8qIGFsc28gdXNlZCBieSBrZXhlYyAqLwogdm9pZCBtYWNoaW5lX3NodXRkb3duKHZvaWQpCiB7Ci0JaWYgKHBwY19tZC5udnJhbV9zeW5jKQotCQlwcGNfbWQubnZyYW1fc3luYygpOworCWlmIChwcGNfbWQubWFjaGluZV9zaHV0ZG93bikKKwkJcHBjX21kLm1hY2hpbmVfc2h1dGRvd24oKTsKIH0KIAogdm9pZCBtYWNoaW5lX3Jlc3RhcnQoY2hhciAqY21kKQogewogCW1hY2hpbmVfc2h1dGRvd24oKTsKLQlwcGNfbWQucmVzdGFydChjbWQpOworCWlmIChwcGNfbWQucmVzdGFydCkKKwkJcHBjX21kLnJlc3RhcnQoY21kKTsKICNpZmRlZiBDT05GSUdfU01QCiAJc21wX3NlbmRfc3RvcCgpOwogI2VuZGlmCkBAIC0xMTIsNyArMTEzLDggQEAKIHZvaWQgbWFjaGluZV9wb3dlcl9vZmYodm9pZCkKIHsKIAltYWNoaW5lX3NodXRkb3duKCk7Ci0JcHBjX21kLnBvd2VyX29mZigpOworCWlmIChwcGNfbWQucG93ZXJfb2ZmKQorCQlwcGNfbWQucG93ZXJfb2ZmKCk7CiAjaWZkZWYgQ09ORklHX1NNUAogCXNtcF9zZW5kX3N0b3AoKTsKICNlbmRpZgpAQCAtMTI5LDcgKzEzMSw4IEBACiB2b2lkIG1hY2hpbmVfaGFsdCh2b2lkKQogewogCW1hY2hpbmVfc2h1dGRvd24oKTsKLQlwcGNfbWQuaGFsdCgpOworCWlmIChwcGNfbWQuaGFsdCkKKwkJcHBjX21kLmhhbHQoKTsKICNpZmRlZiBDT05GSUdfU01QCiAJc21wX3NlbmRfc3RvcCgpOwogI2VuZGlmCkBAIC0yOTQsMTI5ICsyOTcsNiBAQAogCS5zaG93ID0Jc2hvd19jcHVpbmZvLAogfTsKIAotI2lmZGVmIENPTkZJR19QUENfTVVMVElQTEFURk9STQotc3RhdGljIGludCBfX2luaXQgc2V0X3ByZWZlcnJlZF9jb25zb2xlKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpwcm9tX3N0ZG91dCA9IE5VTEw7Ci0JY2hhciAqbmFtZTsKLQl1MzIgKnNwZDsKLQlpbnQgb2Zmc2V0ID0gMDsKLQotCURCRygiIC0+IHNldF9wcmVmZXJyZWRfY29uc29sZSgpXG4iKTsKLQotCS8qIFRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgYSBjb25zb2xlIHNvIHRoaXMgaXMgYWxyZWFkeSBzZXQgdXAuICovCi0JaWYgKHN0cnN0cihzYXZlZF9jb21tYW5kX2xpbmUsICJjb25zb2xlPSIpKSB7Ci0JCURCRygiIGNvbnNvbGUgd2FzIHNwZWNpZmllZCAhXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlpZiAoIW9mX2Nob3NlbikgewotCQlEQkcoIiBvZl9jaG9zZW4gaXMgTlVMTCAhXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCS8qIFdlIGFyZSBnZXR0aW5nIGEgd2VpcmQgcGhhbmRsZSBmcm9tIE9GIC4uLiAqLwotCS8qIC4uLiBTbyB1c2UgdGhlIGZ1bGwgcGF0aCBpbnN0ZWFkICovCi0JbmFtZSA9IChjaGFyICopZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LHN0ZG91dC1wYXRoIiwgTlVMTCk7Ci0JaWYgKG5hbWUgPT0gTlVMTCkgewotCQlEQkcoIiBubyBsaW51eCxzdGRvdXQtcGF0aCAhXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXByb21fc3Rkb3V0ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgobmFtZSk7Ci0JaWYgKCFwcm9tX3N0ZG91dCkgewotCQlEQkcoIiBjYW4ndCBmaW5kIHN0ZG91dCBwYWNrYWdlICVzICFcbiIsIG5hbWUpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CQotCURCRygic3Rkb3V0IGlzICVzXG4iLCBwcm9tX3N0ZG91dC0+ZnVsbF9uYW1lKTsKLQotCW5hbWUgPSAoY2hhciAqKWdldF9wcm9wZXJ0eShwcm9tX3N0ZG91dCwgIm5hbWUiLCBOVUxMKTsKLQlpZiAoIW5hbWUpIHsKLQkJREJHKCIgc3Rkb3V0IHBhY2thZ2UgaGFzIG5vIG5hbWUgIVxuIik7Ci0JCWdvdG8gbm90X2ZvdW5kOwotCX0KLQlzcGQgPSAodTMyICopZ2V0X3Byb3BlcnR5KHByb21fc3Rkb3V0LCAiY3VycmVudC1zcGVlZCIsIE5VTEwpOwotCi0JaWYgKDApCi0JCTsKLSNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRQotCWVsc2UgaWYgKHN0cmNtcChuYW1lLCAic2VyaWFsIikgPT0gMCkgewotCQlpbnQgaTsKLQkJdTMyICpyZWcgPSAodTMyICopZ2V0X3Byb3BlcnR5KHByb21fc3Rkb3V0LCAicmVnIiwgJmkpOwotCQlpZiAoaSA+IDgpIHsKLQkJCXN3aXRjaCAocmVnWzFdKSB7Ci0JCQkJY2FzZSAweDNmODoKLQkJCQkJb2Zmc2V0ID0gMDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAweDJmODoKLQkJCQkJb2Zmc2V0ID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAweDg5ODoKLQkJCQkJb2Zmc2V0ID0gMjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAweDg5MDoKLQkJCQkJb2Zmc2V0ID0gMzsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJLyogV2UgZG9udCByZWNvZ25pc2UgdGhlIHNlcmlhbCBwb3J0ICovCi0JCQkJCWdvdG8gbm90X2ZvdW5kOwotCQkJfQotCQl9Ci0JfQotI2VuZGlmIC8qIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFICovCi0jaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCi0JZWxzZSBpZiAoc3RyY21wKG5hbWUsICJ2dHkiKSA9PSAwKSB7Ci0gCQl1MzIgKnJlZyA9ICh1MzIgKilnZXRfcHJvcGVydHkocHJvbV9zdGRvdXQsICJyZWciLCBOVUxMKTsKLSAJCWNoYXIgKmNvbXBhdCA9IChjaGFyICopZ2V0X3Byb3BlcnR5KHByb21fc3Rkb3V0LCAiY29tcGF0aWJsZSIsIE5VTEwpOwotCi0gCQlpZiAocmVnICYmIGNvbXBhdCAmJiAoc3RyY21wKGNvbXBhdCwgImh2dGVybS1wcm90b2NvbCIpID09IDApKSB7Ci0gCQkJLyogSG9zdCBWaXJ0dWFsIFNlcmlhbCBJbnRlcmZhY2UgKi8KLSAJCQlzd2l0Y2ggKHJlZ1swXSkgewotIAkJCQljYXNlIDB4MzAwMDAwMDA6Ci0gCQkJCQlvZmZzZXQgPSAwOwotIAkJCQkJYnJlYWs7Ci0gCQkJCWNhc2UgMHgzMDAwMDAwMToKLSAJCQkJCW9mZnNldCA9IDE7Ci0gCQkJCQlicmVhazsKLSAJCQkJZGVmYXVsdDoKLQkJCQkJZ290byBub3RfZm91bmQ7Ci0gCQkJfQotCQkJb2Zfbm9kZV9wdXQocHJvbV9zdGRvdXQpOwotCQkJREJHKCJGb3VuZCBodnNpIGNvbnNvbGUgYXQgb2Zmc2V0ICVkXG4iLCBvZmZzZXQpOwotIAkJCXJldHVybiBhZGRfcHJlZmVycmVkX2NvbnNvbGUoImh2c2kiLCBvZmZzZXQsIE5VTEwpOwotIAkJfSBlbHNlIHsKLSAJCQkvKiBwU2VyaWVzIExQQVIgdmlydHVhbCBjb25zb2xlICovCi0JCQlvZl9ub2RlX3B1dChwcm9tX3N0ZG91dCk7Ci0JCQlEQkcoIkZvdW5kIGh2YyBjb25zb2xlXG4iKTsKLSAJCQlyZXR1cm4gYWRkX3ByZWZlcnJlZF9jb25zb2xlKCJodmMiLCAwLCBOVUxMKTsKLSAJCX0KLQl9Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19QU0VSSUVTICovCi0jaWZkZWYgQ09ORklHX1NFUklBTF9QTUFDWklMT0dfQ09OU09MRQotCWVsc2UgaWYgKHN0cmNtcChuYW1lLCAiY2gtYSIpID09IDApCi0JCW9mZnNldCA9IDA7Ci0JZWxzZSBpZiAoc3RyY21wKG5hbWUsICJjaC1iIikgPT0gMCkKLQkJb2Zmc2V0ID0gMTsKLSNlbmRpZiAvKiBDT05GSUdfU0VSSUFMX1BNQUNaSUxPR19DT05TT0xFICovCi0JZWxzZQotCQlnb3RvIG5vdF9mb3VuZDsKLQlvZl9ub2RlX3B1dChwcm9tX3N0ZG91dCk7Ci0KLQlEQkcoIkZvdW5kIHNlcmlhbCBjb25zb2xlIGF0IHR0eVMlZFxuIiwgb2Zmc2V0KTsKLQotCWlmIChzcGQpIHsKLQkJc3RhdGljIGNoYXIgX19pbml0ZGF0YSBvcHRbMTZdOwotCQlzcHJpbnRmKG9wdCwgIiVkIiwgKnNwZCk7Ci0JCXJldHVybiBhZGRfcHJlZmVycmVkX2NvbnNvbGUoInR0eVMiLCBvZmZzZXQsIG9wdCk7Ci0JfSBlbHNlCi0JCXJldHVybiBhZGRfcHJlZmVycmVkX2NvbnNvbGUoInR0eVMiLCBvZmZzZXQsIE5VTEwpOwotCi0gbm90X2ZvdW5kOgotCURCRygiTm8gcHJlZmVycmVkIGNvbnNvbGUgZm91bmQgIVxuIik7Ci0Jb2Zfbm9kZV9wdXQocHJvbV9zdGRvdXQpOwotCXJldHVybiAtRU5PREVWOwotfQotY29uc29sZV9pbml0Y2FsbChzZXRfcHJlZmVycmVkX2NvbnNvbGUpOwotI2VuZGlmIC8qIENPTkZJR19QUENfTVVMVElQTEFURk9STSAqLwotCiB2b2lkIF9faW5pdCBjaGVja19mb3JfaW5pdHJkKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECkBAIC00NDIsNyArMzIyLDcgQEAKIAkvKiBJZiB3ZSB3ZXJlIHBhc3NlZCBhbiBpbml0cmQsIHNldCB0aGUgUk9PVF9ERVYgcHJvcGVybHkgaWYgdGhlIHZhbHVlcwogCSAqIGxvb2sgc2Vuc2libGUuIElmIG5vdCwgY2xlYXIgaW5pdHJkIHJlZmVyZW5jZS4KIAkgKi8KLQlpZiAoaW5pdHJkX3N0YXJ0ID49IEtFUk5FTEJBU0UgJiYgaW5pdHJkX2VuZCA+PSBLRVJORUxCQVNFICYmCisJaWYgKGlzX2tlcm5lbF9hZGRyKGluaXRyZF9zdGFydCkgJiYgaXNfa2VybmVsX2FkZHIoaW5pdHJkX2VuZCkgJiYKIAkgICAgaW5pdHJkX2VuZCA+IGluaXRyZF9zdGFydCkKIAkJUk9PVF9ERVYgPSBSb290X1JBTTA7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF8zMi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF8zMi5jCmluZGV4IGU1Njk0MzMuLmRiNzJhOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzMyLmMKQEAgLTM5LDYgKzM5LDggQEAKICNpbmNsdWRlIDxhc20vbnZyYW0uaD4KICNpbmNsdWRlIDxhc20veG1vbi5oPgogI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL3NlcmlhbC5oPgorI2luY2x1ZGUgPGFzbS91ZGJnLmg+CiAKICNpbmNsdWRlICJzZXR1cC5oIgogCkBAIC0xNzIsMTIgKzE3NCwyMyBAQAogICovCiB2b2lkIF9faW5pdCBtYWNoaW5lX2luaXQodW5zaWduZWQgbG9uZyBkdF9wdHIsIHVuc2lnbmVkIGxvbmcgcGh5cykKIHsKKwkvKiBJZiBidGV4dCBpcyBlbmFibGVkLCB3ZSBtaWdodCBoYXZlIGEgQkFUIHNldHVwIGZvciBlYXJseSBkaXNwbGF5LAorCSAqIHRodXMgd2UgZG8gZW5hYmxlIHNvbWUgdmVyeSBiYXNpYyB1ZGJnIG91dHB1dAorCSAqLworI2lmZGVmIENPTkZJR19CT09UWF9URVhUCisJdWRiZ19wdXRjID0gYnRleHRfZHJhd2NoYXI7CisjZW5kaWYKKworCS8qIERvIHNvbWUgZWFybHkgaW5pdGlhbGl6YXRpb24gYmFzZWQgb24gdGhlIGZsYXQgZGV2aWNlIHRyZWUgKi8KIAllYXJseV9pbml0X2RldnRyZWUoX192YShkdF9wdHIpKTsKIAorCS8qIENoZWNrIGRlZmF1bHQgY29tbWFuZCBsaW5lICovCiAjaWZkZWYgQ09ORklHX0NNRExJTkUKLQlzdHJsY3B5KGNtZF9saW5lLCBDT05GSUdfQ01ETElORSwgc2l6ZW9mKGNtZF9saW5lKSk7CisJaWYgKGNtZF9saW5lWzBdID09IDApCisJCXN0cmxjcHkoY21kX2xpbmUsIENPTkZJR19DTURMSU5FLCBzaXplb2YoY21kX2xpbmUpKTsKICNlbmRpZiAvKiBDT05GSUdfQ01ETElORSAqLwogCisJLyogQmFzZSBpbml0IGJhc2VkIG9uIG1hY2hpbmUgdHlwZSAqLwogCXBsYXRmb3JtX2luaXQoKTsKIAogI2lmZGVmIENPTkZJR182eHgKQEAgLTI4MiwyNSArMjk1LDIwIEBACiAKIAl1bmZsYXR0ZW5fZGV2aWNlX3RyZWUoKTsKIAljaGVja19mb3JfaW5pdHJkKCk7CisKKwlpZiAocHBjX21kLmluaXRfZWFybHkpCisJCXBwY19tZC5pbml0X2Vhcmx5KCk7CisKKwlmaW5kX2xlZ2FjeV9zZXJpYWxfcG9ydHMoKTsKIAlmaW5pc2hfZGV2aWNlX3RyZWUoKTsKIAogCXNtcF9zZXR1cF9jcHVfbWFwcygpOwogCi0jaWZkZWYgQ09ORklHX0JPT1RYX1RFWFQKLQlpbml0X2Jvb3RfZGlzcGxheSgpOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfUFBDX1BNQUMKLQkvKiBUaGlzIGNvdWxkIGJlIGNhbGxlZCAiZWFybHkgc2V0dXAgYXJjaCIsIGl0IG11c3QgYmUgZG9uZQotCSAqIG5vdyBiZWNhdXNlIHhtb24gbmVlZCBpdAotCSAqLwotCWlmIChfbWFjaGluZSA9PSBfTUFDSF9QbWFjKQotCQlwbWFjX2ZlYXR1cmVfaW5pdCgpOwkvKiBOZXcgY29vbCB3YXkgKi8KLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX1hNT05fREVGQVVMVAogCXhtb25faW5pdCgxKTsKICNlbmRpZgorCS8qIFJlZ2lzdGVyIGVhcmx5IGNvbnNvbGUgKi8KKwlyZWdpc3Rlcl9lYXJseV91ZGJnX2NvbnNvbGUoKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0tHREIpCiAJaWYgKHBwY19tZC5rZ2RiX21hcF9zY2MpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKaW5kZXggZTNmYjc4My4uZTI5YjI3NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYwpAQCAtMzMsNyArMzMsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9rZHVtcC5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC02OSwzMyArNzEsNiBAQAogI2RlZmluZSBEQkcoZm10Li4uKQogI2VuZGlmCiAKLS8qCi0gKiBIZXJlIGFyZSBzb21lIGVhcmx5IGRlYnVnZ2luZyBmYWNpbGl0aWVzLiBZb3UgY2FuIGVuYWJsZSBvbmUKLSAqIGJ1dCB5b3VyIGtlcm5lbCB3aWxsIG5vdCBib290IG9uIGFueXRoaW5nIGVsc2UgaWYgeW91IGRvIHNvCi0gKi8KLQotLyogVGhpcyBvbmUgaXMgZm9yIHVzZSBvbiBMUEFSIG1hY2hpbmVzIHRoYXQgc3VwcG9ydCBhbiBIVkMgY29uc29sZQotICogb24gdnRlcm0gMAotICovCi1leHRlcm4gdm9pZCB1ZGJnX2luaXRfZGVidWdfbHBhcih2b2lkKTsKLS8qIFRoaXMgb25lIGlzIGZvciB1c2Ugb24gQXBwbGUgRzUgbWFjaGluZXMKLSAqLwotZXh0ZXJuIHZvaWQgdWRiZ19pbml0X3BtYWNfcmVhbG1vZGUodm9pZCk7Ci0vKiBUaGF0J3MgUlRBUyBwYW5lbCBkZWJ1ZyAqLwotZXh0ZXJuIHZvaWQgY2FsbF9ydGFzX2Rpc3BsYXlfc3RhdHVzX2RlbGF5KHVuc2lnbmVkIGNoYXIgYyk7Ci0vKiBIZXJlJ3MgbWFwbGUgcmVhbCBtb2RlIGRlYnVnICovCi1leHRlcm4gdm9pZCB1ZGJnX2luaXRfbWFwbGVfcmVhbG1vZGUodm9pZCk7Ci0KLSNkZWZpbmUgRUFSTFlfREVCVUdfSU5JVCgpIGRvIHt9IHdoaWxlKDApCi0KLSNpZiAwCi0jZGVmaW5lIEVBUkxZX0RFQlVHX0lOSVQoKSB1ZGJnX2luaXRfZGVidWdfbHBhcigpCi0jZGVmaW5lIEVBUkxZX0RFQlVHX0lOSVQoKSB1ZGJnX2luaXRfbWFwbGVfcmVhbG1vZGUoKQotI2RlZmluZSBFQVJMWV9ERUJVR19JTklUKCkgdWRiZ19pbml0X3BtYWNfcmVhbG1vZGUoKQotI2RlZmluZSBFQVJMWV9ERUJVR19JTklUKCkJCQkJCQlcCi0JZG8geyB1ZGJnX3B1dGMgPSBjYWxsX3J0YXNfZGlzcGxheV9zdGF0dXNfZGVsYXk7IH0gd2hpbGUoMCkKLSNlbmRpZgotCiBpbnQgaGF2ZV9vZiA9IDE7CiBpbnQgYm9vdF9jcHVpZCA9IDA7CiBpbnQgYm9vdF9jcHVpZF9waHlzID0gMDsKQEAgLTIzNiwxMSArMjExLDggQEAKIAlzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKmxwYWNhID0gZ2V0X3BhY2EoKTsKIAlzdGF0aWMgc3RydWN0IG1hY2hkZXBfY2FsbHMgKiptYWNoOwogCi0JLyoKLQkgKiBFbmFibGUgZWFybHkgZGVidWdnaW5nIGlmIGFueSBzcGVjaWZpZWQgKHNlZSB0b3Agb2YKLQkgKiB0aGlzIGZpbGUpCi0JICovCi0JRUFSTFlfREVCVUdfSU5JVCgpOworCS8qIEVuYWJsZSBlYXJseSBkZWJ1Z2dpbmcgaWYgYW55IHNwZWNpZmllZCAoc2VlIHVkYmcuaCkgKi8KKwl1ZGJnX2Vhcmx5X2luaXQoKTsKIAogCURCRygiIC0+IGVhcmx5X3NldHVwKClcbiIpOwogCkBAIC0yNjgsNiArMjQwLDEwIEBACiAJfQogCXBwY19tZCA9ICoqbWFjaDsKIAorI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCisJa2R1bXBfc2V0dXAoKTsKKyNlbmRpZgorCiAJREJHKCJGb3VuZCwgSW5pdGlhbGl6aW5nIG1lbW9yeSBtYW5hZ2VtZW50Li4uXG4iKTsKIAogCS8qCkBAIC0zMTcsNiArMjkzLDcgQEAKIHZvaWQgc21wX3JlbGVhc2VfY3B1cyh2b2lkKQogewogCWV4dGVybiB1bnNpZ25lZCBsb25nIF9fc2Vjb25kYXJ5X2hvbGRfc3Bpbmxvb3A7CisJdW5zaWduZWQgbG9uZyAqcHRyOwogCiAJREJHKCIgLT4gc21wX3JlbGVhc2VfY3B1cygpXG4iKTsKIApAQCAtMzI3LDcgKzMwNCw5IEBACiAJICogVGhpcyBpcyB1c2VsZXNzIGJ1dCBoYXJtbGVzcyBvbiBpU2VyaWVzLCBzZWNvbmRhcmllcyBhcmUgYWxyZWFkeQogCSAqIHdhaXRpbmcgb24gdGhlaXIgcGFjYSBzcGlubG9vcHMuICovCiAKLQlfX3NlY29uZGFyeV9ob2xkX3NwaW5sb29wID0gMTsKKwlwdHIgID0gKHVuc2lnbmVkIGxvbmcgKikoKHVuc2lnbmVkIGxvbmcpJl9fc2Vjb25kYXJ5X2hvbGRfc3Bpbmxvb3AKKwkJCS0gUEhZU0lDQUxfU1RBUlQpOworCSpwdHIgPSAxOwogCW1iKCk7CiAKIAlEQkcoIiA8LSBzbXBfcmVsZWFzZV9jcHVzKClcbiIpOwpAQCAtNDMwLDcgKzQwOSw3IEBACiAKIAkvKgogCSAqIEZpbGwgdGhlIHBwYzY0X2NhY2hlcyAmIHN5c3RlbWNmZyBzdHJ1Y3R1cmVzIHdpdGggaW5mb3JtYXRpb25zCi0JICogcmV0cmVpdmVkIGZyb20gdGhlIGRldmljZS10cmVlLiBOZWVkIHRvIGJlIGNhbGxlZCBiZWZvcmUKKwkgKiByZXRyaWV2ZWQgZnJvbSB0aGUgZGV2aWNlLXRyZWUuIE5lZWQgdG8gYmUgY2FsbGVkIGJlZm9yZQogCSAqIGZpbmlzaF9kZXZpY2VfdHJlZSgpIHNpbmNlIHRoZSBsYXRlciByZXF1aXJlcyBzb21lIG9mIHRoZQogCSAqIGluZm9ybWF0aW9ucyBmaWxsZWQgdXAgaGVyZSB0byBwcm9wZXJseSBwYXJzZSB0aGUgaW50ZXJydXB0CiAJICogdHJlZS4KQEAgLTQ1OSwxNiArNDM4LDE5IEBACiAJICovCiAJcHBjX21kLmluaXRfZWFybHkoKTsKIAorIAkvKgorCSAqIFdlIGNhbiBkaXNjb3ZlciBzZXJpYWwgcG9ydHMgbm93IHNpbmNlIHRoZSBhYm92ZSBkaWQgc2V0dXAgdGhlCisJICogaGFzaCB0YWJsZSBtYW5hZ2VtZW50IGZvciB1cywgdGh1cyBpb3JlbWFwIHdvcmtzLiBXZSBkbyB0aGF0IGVhcmx5CisJICogc28gdGhhdCBmdXJ0aGVyIGNvZGUgY2FuIGJlIGRlYnVnZ2VkCisJICovCisJZmluZF9sZWdhY3lfc2VyaWFsX3BvcnRzKCk7CisKIAkvKgogCSAqICJGaW5pc2giIHRoZSBkZXZpY2UtdHJlZSwgdGhhdCBpcyBkbyB0aGUgYWN0dWFsIHBhcnNpbmcgb2YKIAkgKiBzb21lIG9mIHRoZSBwcm9wZXJ0aWVzIGxpa2UgdGhlIGludGVycnVwdCBtYXAKIAkgKi8KIAlmaW5pc2hfZGV2aWNlX3RyZWUoKTsKIAotI2lmZGVmIENPTkZJR19CT09UWF9URVhUCi0JaW5pdF9ib290X2Rpc3BsYXkoKTsKLSNlbmRpZgotCiAJLyoKIAkgKiBJbml0aWFsaXplIHhtb24KIAkgKi8KQEAgLTUwNyw2ICs0ODksOSBAQAogCSAgICAgICBwcGM2NF9jYWNoZXMuaWxpbmVfc2l6ZSk7CiAJcHJpbnRrKCJodGFiX2FkZHJlc3MgICAgICAgICAgICAgICAgICA9IDB4JXBcbiIsIGh0YWJfYWRkcmVzcyk7CiAJcHJpbnRrKCJodGFiX2hhc2hfbWFzayAgICAgICAgICAgICAgICA9IDB4JWx4XG4iLCBodGFiX2hhc2hfbWFzayk7CisjaWYgUEhZU0lDQUxfU1RBUlQgPiAwCisJcHJpbnRrKCJwaHlzaWNhbF9zdGFydCAgICAgICAgICAgICAgICA9IDB4JXhcbiIsIFBIWVNJQ0FMX1NUQVJUKTsKKyNlbmRpZgogCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCiAJbW1faW5pdF9wcGM2NCgpOwpAQCAtNjU3LDE4NyArNjQyLDYgQEAKIAlwcmludGsoIlt0ZXJtaW5hdGVdJTA0eCAlc1xuIiwgc3JjLCBtc2cpOwogfQogCi0jaWZuZGVmIENPTkZJR19QUENfSVNFUklFUwotLyoKLSAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYnkgcGxhdGZvcm1zIHRvICJmaW5kIiBsZWdhY3kgc2VyaWFsIHBvcnRzLgotICogSXQgd29ya3MgZm9yICJzZXJpYWwiIG5vZGVzIHVuZGVyIGFuICJpc2EiIG5vZGUsIGFuZCB3aWxsIHRyeSB0bwotICogcmVzcGVjdCB0aGUgImlibSxhaXgtbG9jIiBwcm9wZXJ0eSBpZiBhbnkuIEl0IHdvcmtzIHdpdGggdXAgdG8gOAotICogcG9ydHMuCi0gKi8KLQotI2RlZmluZSBNQVhfTEVHQUNZX1NFUklBTF9QT1JUUwk4Ci1zdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IHNlcmlhbF9wb3J0c1tNQVhfTEVHQUNZX1NFUklBTF9QT1JUUysxXTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgb2xkX3NlcmlhbF9jb3VudDsKLQotdm9pZCBfX2luaXQgZ2VuZXJpY19maW5kX2xlZ2FjeV9zZXJpYWxfcG9ydHModTY0ICpwaHlzcG9ydCwKLQkJdW5zaWduZWQgaW50ICpkZWZhdWx0X3NwZWVkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0JdTMyICpzaXplcHJvcDsKLQotCXN0cnVjdCBpc2FfcmVnX3Byb3BlcnR5IHsKLQkJdTMyIHNwYWNlOwotCQl1MzIgYWRkcmVzczsKLQkJdTMyIHNpemU7Ci0JfTsKLQlzdHJ1Y3QgcGNpX3JlZ19wcm9wZXJ0eSB7Ci0JCXN0cnVjdCBwY2lfYWRkcmVzcyBhZGRyOwotCQl1MzIgc2l6ZV9oaTsKLQkJdTMyIHNpemVfbG87Ci0JfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCURCRygiIC0+IGdlbmVyaWNfZmluZF9sZWdhY3lfc2VyaWFsX3BvcnQoKVxuIik7Ci0KLQkqcGh5c3BvcnQgPSAwOwotCWlmIChkZWZhdWx0X3NwZWVkKQotCQkqZGVmYXVsdF9zcGVlZCA9IDA7Ci0KLQlucCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7Ci0JaWYgKCFucCkKLQkJcmV0dXJuOwotCi0JLyogRmlyc3QgZmlsbCBvdXIgYXJyYXkgKi8KLQlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJzZXJpYWwiKSk7KSB7Ci0JCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaXNhLCAqcGNpOwotCQlzdHJ1Y3QgaXNhX3JlZ19wcm9wZXJ0eSAqcmVnOwotCQl1bnNpZ25lZCBsb25nIHBoeXNfc2l6ZSwgYWRkcl9zaXplLCBpb19iYXNlOwotCQl1MzIgKnJhbmdlc3A7Ci0JCXUzMiAqaW50ZXJydXB0cywgKmNsaywgKnNwZDsKLQkJY2hhciAqdHlwZXA7Ci0JCWludCBpbmRleCwgcmxlbiwgcmVudHNpemU7Ci0KLQkJLyogT2ssIGZpcnN0IGNoZWNrIGlmIGl0J3MgdW5kZXIgYW4gImlzYSIgcGFyZW50ICovCi0JCWlzYSA9IG9mX2dldF9wYXJlbnQobnApOwotCQlpZiAoIWlzYSB8fCBzdHJjbXAoaXNhLT5uYW1lLCAiaXNhIikpIHsKLQkJCURCRygiJXM6IG5vIGlzYSBwYXJlbnQgZm91bmRcbiIsIG5wLT5mdWxsX25hbWUpOwotCQkJY29udGludWU7Ci0JCX0KLQkJCi0JCS8qIE5vdyBsb29rIGZvciBhbiAiaWJtLGFpeC1sb2MiIHByb3BlcnR5IHRoYXQgZ2l2ZXMgdXMgb3JkZXJpbmcKLQkJICogaWYgYW55Li4uCi0JCSAqLwotCSAJdHlwZXAgPSAoY2hhciAqKWdldF9wcm9wZXJ0eShucCwgImlibSxhaXgtbG9jIiwgTlVMTCk7Ci0KLQkJLyogR2V0IHRoZSBJU0EgcG9ydCBudW1iZXIgKi8KLQkJcmVnID0gKHN0cnVjdCBpc2FfcmVnX3Byb3BlcnR5ICopZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgTlVMTCk7CQotCQlpZiAocmVnID09IE5VTEwpCi0JCQlnb3RvIG5leHRfcG9ydDsKLQkJLyogV2UgYXNzdW1lIHRoZSBpbnRlcnJ1cHQgbnVtYmVyIGlzbid0IHRyYW5zbGF0ZWQgLi4uICovCi0JCWludGVycnVwdHMgPSAodTMyICopZ2V0X3Byb3BlcnR5KG5wLCAiaW50ZXJydXB0cyIsIE5VTEwpOwotCQkvKiBnZXQgY2xvY2sgZnJlcS4gaWYgcHJlc2VudCAqLwotCQljbGsgPSAodTMyICopZ2V0X3Byb3BlcnR5KG5wLCAiY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7Ci0JCS8qIGdldCBkZWZhdWx0IHNwZWVkIGlmIHByZXNlbnQgKi8KLQkJc3BkID0gKHUzMiAqKWdldF9wcm9wZXJ0eShucCwgImN1cnJlbnQtc3BlZWQiLCBOVUxMKTsKLQkJLyogRGVmYXVsdCB0byBsb2NhdGUgYXQgZW5kIG9mIGFycmF5ICovCi0JCWluZGV4ID0gb2xkX3NlcmlhbF9jb3VudDsgLyogZW5kIG9mIHRoZSBhcnJheSBieSBkZWZhdWx0ICovCi0KLQkJLyogSWYgd2UgaGF2ZSBhIGxvY2F0aW9uIGluZGV4LCB0aGVuIHVzZSBpdCAqLwotCQlpZiAodHlwZXAgJiYgKnR5cGVwID09ICdTJykgewotCQkJaW5kZXggPSBzaW1wbGVfc3RydG9sKHR5cGVwKzEsIE5VTEwsIDApIC0gMTsKLQkJCS8qIGlmIGluZGV4IGlzIG91dCBvZiByYW5nZSwgdXNlIGVuZCBvZiBhcnJheSBpbnN0ZWFkICovCi0JCQlpZiAoaW5kZXggPj0gTUFYX0xFR0FDWV9TRVJJQUxfUE9SVFMpCi0JCQkJaW5kZXggPSBvbGRfc2VyaWFsX2NvdW50OwotCQkJLyogaWYgb3VyIGluZGV4IGlzIHN0aWxsIG91dCBvZiByYW5nZSwgdGhhdCBtZWFuIHRoYXQKLQkJCSAqIGFycmF5IGlzIGZ1bGwsIHdlIGNvdWxkIHNjYW4gZm9yIGEgZnJlZSBzbG90IGJ1dCB0aGF0Ci0JCQkgKiBtYWtlIGxpdHRsZSBzZW5zZSB0byBib3RoZXIsIGp1c3Qgc2tpcCB0aGUgcG9ydAotCQkJICovCi0JCQlpZiAoaW5kZXggPj0gTUFYX0xFR0FDWV9TRVJJQUxfUE9SVFMpCi0JCQkJZ290byBuZXh0X3BvcnQ7Ci0JCQlpZiAoaW5kZXggPj0gb2xkX3NlcmlhbF9jb3VudCkKLQkJCQlvbGRfc2VyaWFsX2NvdW50ID0gaW5kZXggKyAxOwotCQkJLyogQ2hlY2sgaWYgdGhlcmUgaXMgYSBwb3J0IHdobyBhbHJlYWR5IGNsYWltZWQgb3VyIHNsb3QgKi8KLQkJCWlmIChzZXJpYWxfcG9ydHNbaW5kZXhdLmlvYmFzZSAhPSAwKSB7Ci0JCQkJLyogaWYgd2Ugc3RpbGwgaGF2ZSBzb21lIHJvb20sIG1vdmUgaXQsIGVsc2Ugb3ZlcnJpZGUgKi8KLQkJCQlpZiAob2xkX3NlcmlhbF9jb3VudCA8IE1BWF9MRUdBQ1lfU0VSSUFMX1BPUlRTKSB7Ci0JCQkJCURCRygiTW92ZWQgbGVnYWN5IHBvcnQgJWQgLT4gJWRcbiIsIGluZGV4LAotCQkJCQkgICAgb2xkX3NlcmlhbF9jb3VudCk7Ci0JCQkJCXNlcmlhbF9wb3J0c1tvbGRfc2VyaWFsX2NvdW50KytdID0KLQkJCQkJCXNlcmlhbF9wb3J0c1tpbmRleF07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJREJHKCJSZXBsYWNpbmcgbGVnYWN5IHBvcnQgJWRcbiIsIGluZGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGluZGV4ID49IE1BWF9MRUdBQ1lfU0VSSUFMX1BPUlRTKQotCQkJZ290byBuZXh0X3BvcnQ7Ci0JCWlmIChpbmRleCA+PSBvbGRfc2VyaWFsX2NvdW50KQotCQkJb2xkX3NlcmlhbF9jb3VudCA9IGluZGV4ICsgMTsKLQotCQkvKiBOb3cgZmlsbCB0aGUgZW50cnkgKi8KLQkJbWVtc2V0KCZzZXJpYWxfcG9ydHNbaW5kZXhdLCAwLCBzaXplb2Yoc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0KSk7Ci0JCXNlcmlhbF9wb3J0c1tpbmRleF0udWFydGNsayA9IGNsayA/ICpjbGsgOiBCQVNFX0JBVUQgKiAxNjsKLQkJc2VyaWFsX3BvcnRzW2luZGV4XS5pb2Jhc2UgPSByZWctPmFkZHJlc3M7Ci0JCXNlcmlhbF9wb3J0c1tpbmRleF0uaXJxID0gaW50ZXJydXB0cyA/IGludGVycnVwdHNbMF0gOiAwOwotCQlzZXJpYWxfcG9ydHNbaW5kZXhdLmZsYWdzID0gQVNZTkNfQk9PVF9BVVRPQ09ORjsKLQotCQlEQkcoIkFkZGVkIGxlZ2FjeSBwb3J0LCBpbmRleDogJWQsIHBvcnQ6ICV4LCBpcnE6ICVkLCBjbGs6ICVkXG4iLAotCQkgICAgaW5kZXgsCi0JCSAgICBzZXJpYWxfcG9ydHNbaW5kZXhdLmlvYmFzZSwKLQkJICAgIHNlcmlhbF9wb3J0c1tpbmRleF0uaXJxLAotCQkgICAgc2VyaWFsX3BvcnRzW2luZGV4XS51YXJ0Y2xrKTsKLQotCQkvKiBHZXQgcGh5cyBhZGRyZXNzIG9mIElPIHJlZyBmb3IgcG9ydCAxICovCi0JCWlmIChpbmRleCAhPSAwKQotCQkJZ290byBuZXh0X3BvcnQ7Ci0KLQkJcGNpID0gb2ZfZ2V0X3BhcmVudChpc2EpOwotCQlpZiAoIXBjaSkgewotCQkJREJHKCIlczogbm8gcGNpIHBhcmVudCBmb3VuZFxuIiwgbnAtPmZ1bGxfbmFtZSk7Ci0JCQlnb3RvIG5leHRfcG9ydDsKLQkJfQotCi0JCXJhbmdlc3AgPSAodTMyICopZ2V0X3Byb3BlcnR5KHBjaSwgInJhbmdlcyIsICZybGVuKTsKLQkJaWYgKHJhbmdlc3AgPT0gTlVMTCkgewotCQkJb2Zfbm9kZV9wdXQocGNpKTsKLQkJCWdvdG8gbmV4dF9wb3J0OwotCQl9Ci0JCXJsZW4gLz0gNDsKLQotCQkvKiB3ZSBuZWVkIHRoZSAjc2l6ZS1jZWxscyBvZiB0aGUgUENJIGJyaWRnZSBub2RlIGl0c2VsZiAqLwotCQlwaHlzX3NpemUgPSAxOwotCQlzaXplcHJvcCA9ICh1MzIgKilnZXRfcHJvcGVydHkocGNpLCAiI3NpemUtY2VsbHMiLCBOVUxMKTsKLQkJaWYgKHNpemVwcm9wICE9IE5VTEwpCi0JCQlwaHlzX3NpemUgPSAqc2l6ZXByb3A7Ci0JCS8qIHdlIG5lZWQgdGhlIHBhcmVudCAjYWRkci1jZWxscyAqLwotCQlhZGRyX3NpemUgPSBwcm9tX25fYWRkcl9jZWxscyhwY2kpOwotCQlyZW50c2l6ZSA9IDMgKyBhZGRyX3NpemUgKyBwaHlzX3NpemU7Ci0JCWlvX2Jhc2UgPSAwOwotCQlmb3IgKDtybGVuID49IHJlbnRzaXplOyBybGVuIC09IHJlbnRzaXplLHJhbmdlc3AgKz0gcmVudHNpemUpIHsKLQkJCWlmICgoKHJhbmdlc3BbMF0gPj4gMjQpICYgMHgzKSAhPSAxKQotCQkJCWNvbnRpbnVlOyAvKiBub3QgSU8gc3BhY2UgKi8KLQkJCWlvX2Jhc2UgPSByYW5nZXNwWzNdOwotCQkJaWYgKGFkZHJfc2l6ZSA9PSAyKQotCQkJCWlvX2Jhc2UgPSAoaW9fYmFzZSA8PCAzMikgfCByYW5nZXNwWzRdOwotCQl9Ci0JCWlmIChpb19iYXNlICE9IDApIHsKLQkJCSpwaHlzcG9ydCA9IGlvX2Jhc2UgKyByZWctPmFkZHJlc3M7Ci0JCQlpZiAoZGVmYXVsdF9zcGVlZCAmJiBzcGQpCi0JCQkJKmRlZmF1bHRfc3BlZWQgPSAqc3BkOwotCQl9Ci0JCW9mX25vZGVfcHV0KHBjaSk7Ci0JbmV4dF9wb3J0OgotCQlvZl9ub2RlX3B1dChpc2EpOwotCX0KLQotCURCRygiIDwtIGdlbmVyaWNfZmluZF9sZWdhY3lfc2VyaWFsX3BvcnQoKVxuIik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNlcmlhbF9kZXZpY2UgPSB7Ci0JLm5hbWUJPSAic2VyaWFsODI1MCIsCi0JLmlkCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAotCS5kZXYJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhID0gc2VyaWFsX3BvcnRzLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBzZXJpYWxfZGV2X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzZXJpYWxfZGV2aWNlKTsKLX0KLWFyY2hfaW5pdGNhbGwoc2VyaWFsX2Rldl9pbml0KTsKLQotI2VuZGlmIC8qIENPTkZJR19QUENfSVNFUklFUyAqLwotCiBpbnQgY2hlY2tfbGVnYWN5X2lvcG9ydCh1bnNpZ25lZCBsb25nIGJhc2VfcG9ydCkKIHsKIAlpZiAocHBjX21kLmNoZWNrX2xlZ2FjeV9pb3BvcnQgPT0gTlVMTCkKQEAgLTg1MSwzICs2NTUsMjggQEAKIAlpZiAocHBjX21kLmNwdV9kaWUpCiAJCXBwY19tZC5jcHVfZGllKCk7CiB9CisKKyNpZmRlZiBDT05GSUdfU01QCit2b2lkIF9faW5pdCBzZXR1cF9wZXJfY3B1X2FyZWFzKHZvaWQpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWNoYXIgKnB0cjsKKworCS8qIENvcHkgc2VjdGlvbiBmb3IgZWFjaCBDUFUgKHdlIGRpc2NhcmQgdGhlIG9yaWdpbmFsKSAqLworCXNpemUgPSBBTElHTihfX3Blcl9jcHVfZW5kIC0gX19wZXJfY3B1X3N0YXJ0LCBTTVBfQ0FDSEVfQllURVMpOworI2lmZGVmIENPTkZJR19NT0RVTEVTCisJaWYgKHNpemUgPCBQRVJDUFVfRU5PVUdIX1JPT00pCisJCXNpemUgPSBQRVJDUFVfRU5PVUdIX1JPT007CisjZW5kaWYKKworCWZvcl9lYWNoX2NwdShpKSB7CisJCXB0ciA9IGFsbG9jX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoY3B1X3RvX25vZGUoaSkpLCBzaXplKTsKKwkJaWYgKCFwdHIpCisJCQlwYW5pYygiQ2Fubm90IGFsbG9jYXRlIGNwdSBkYXRhIGZvciBDUFUgJWRcbiIsIGkpOworCisJCXBhY2FbaV0uZGF0YV9vZmZzZXQgPSBwdHIgLSBfX3Blcl9jcHVfc3RhcnQ7CisJCW1lbWNweShwdHIsIF9fcGVyX2NwdV9zdGFydCwgX19wZXJfY3B1X2VuZCAtIF9fcGVyX2NwdV9zdGFydCk7CisJfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF8zMi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfMzIuYwppbmRleCA1YTJlYmE2Li4zNzQ3YWIwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzMyLmMKQEAgLTc2LDcgKzc2LDYgQEAKICAqIHJlZ2lzdGVycyBmcm9tICpyZWdzLiAgVGhpcyBpcyB3aGF0IHdlIG5lZWQKICAqIHRvIGRvIHdoZW4gYSBzaWduYWwgaGFzIGJlZW4gZGVsaXZlcmVkLgogICovCi0jZGVmaW5lIHNpZ3JldHVybl9leGl0KHJlZ3MpCXJldHVybiAwCiAKICNkZWZpbmUgR1BfUkVHU19TSVpFCW1pbihzaXplb2YoZWxmX2dyZWdzZXRfdDMyKSwgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzMzIpKQogI3VuZGVmIF9fU0lHTkFMX0ZSQU1FU0laRQpAQCAtMTU2LDkgKzE1NSwxNyBAQAogCWVsZl9ncmVnX3Q2NCAqZ3JlZ3MgPSAoZWxmX2dyZWdfdDY0ICopcmVnczsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPD0gUFRfUkVTVUxUOyBpICsrKQorCWlmICghRlVMTF9SRUdTKHJlZ3MpKSB7CisJCXNldF90aHJlYWRfZmxhZyhUSUZfU0FWRV9OVkdQUlMpOworCQljdXJyZW50X3RocmVhZF9pbmZvKCktPm52Z3Byc19mcmFtZSA9IGZyYW1lLT5tY19ncmVnczsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDw9IFBUX1JFU1VMVDsgaSArKykgeworCQlpZiAoaSA9PSAxNCAmJiAhRlVMTF9SRUdTKHJlZ3MpKQorCQkJaSA9IDMyOwogCQlpZiAoX19wdXRfdXNlcigodW5zaWduZWQgaW50KWdyZWdzW2ldLCAmZnJhbWUtPm1jX2dyZWdzW2ldKSkKIAkJCXJldHVybiAtRUZBVUxUOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc5LDggKzE4Niw2IEBACiAKICNlbHNlIC8qIENPTkZJR19QUEM2NCAqLwogCi1leHRlcm4gdm9pZCBzaWdyZXR1cm5fZXhpdChzdHJ1Y3QgcHRfcmVncyAqKTsKLQogI2RlZmluZSBHUF9SRUdTX1NJWkUJbWluKHNpemVvZihlbGZfZ3JlZ3NldF90KSwgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSkKIAogc3RhdGljIGlubGluZSBpbnQgcHV0X3NpZ3NldF90KHNpZ3NldF90IF9fdXNlciAqdXNldCwgc2lnc2V0X3QgKnNldCkKQEAgLTIxNCw2ICsyMTksMTUgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHNhdmVfZ2VuZXJhbF9yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzLAogCQlzdHJ1Y3QgbWNvbnRleHQgX191c2VyICpmcmFtZSkKIHsKKwlpZiAoIUZVTExfUkVHUyhyZWdzKSkgeworCQkvKiBaZXJvIG91dCB0aGUgdW5zYXZlZCBHUFJzIHRvIGF2b2lkIGluZm9ybWF0aW9uCisJCSAgIGxlYWssIGFuZCBzZXQgVElGX1NBVkVfTlZHUFJTIHRvIGVuc3VyZSB0aGF0IHRoZQorCQkgICByZWdpc3RlcnMgZG8gYWN0dWFsbHkgZ2V0IHNhdmVkIGxhdGVyLiAqLworCQltZW1zZXQoJnJlZ3MtPmdwclsxNF0sIDAsIDE4ICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwkJY3VycmVudF90aHJlYWRfaW5mbygpLT5udmdwcnNfZnJhbWUgPSAmZnJhbWUtPm1jX2dyZWdzOworCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1NBVkVfTlZHUFJTKTsKKwl9CisKIAlyZXR1cm4gX19jb3B5X3RvX3VzZXIoJmZyYW1lLT5tY19ncmVncywgcmVncywgR1BfUkVHU19TSVpFKTsKIH0KIApAQCAtMjM4LDggKzI1Miw3IEBACiAvKgogICogQXRvbWljYWxseSBzd2FwIGluIHRoZSBuZXcgc2lnbmFsIG1hc2ssIGFuZCB3YWl0IGZvciBhIHNpZ25hbC4KICAqLwotbG9uZyBzeXNfc2lnc3VzcGVuZChvbGRfc2lnc2V0X3QgbWFzaywgaW50IHAyLCBpbnQgcDMsIGludCBwNCwgaW50IHA2LCBpbnQgcDcsCi0JICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorbG9uZyBzeXNfc2lnc3VzcGVuZChvbGRfc2lnc2V0X3QgbWFzaykKIHsKIAlzaWdzZXRfdCBzYXZlc2V0OwogCkBAIC0yNTAsNTEgKzI2MywxMCBAQAogCXJlY2FsY19zaWdwZW5kaW5nKCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAotCXJlZ3MtPnJlc3VsdCA9IC1FSU5UUjsKLQlyZWdzLT5ncHJbM10gPSBFSU5UUjsKLQlyZWdzLT5jY3IgfD0gMHgxMDAwMDAwMDsKLQl3aGlsZSAoMSkgewotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJc2NoZWR1bGUoKTsKLQkJaWYgKGRvX3NpZ25hbCgmc2F2ZXNldCwgcmVncykpCi0JCQlzaWdyZXR1cm5fZXhpdChyZWdzKTsKLQl9Ci19Ci0KLWxvbmcgc3lzX3J0X3NpZ3N1c3BlbmQoCi0jaWZkZWYgQ09ORklHX1BQQzY0Ci0JCWNvbXBhdF9zaWdzZXRfdCBfX3VzZXIgKnVuZXdzZXQsCi0jZWxzZQotCQlzaWdzZXRfdCBfX3VzZXIgKnVuZXdzZXQsCi0jZW5kaWYKLQkJc2l6ZV90IHNpZ3NldHNpemUsIGludCBwMywgaW50IHA0LAotCQlpbnQgcDYsIGludCBwNywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc2lnc2V0X3Qgc2F2ZXNldCwgbmV3c2V0OwotCi0JLyogWFhYOiBEb24ndCBwcmVjbHVkZSBoYW5kbGluZyBkaWZmZXJlbnQgc2l6ZWQgc2lnc2V0X3Qncy4gICovCi0JaWYgKHNpZ3NldHNpemUgIT0gc2l6ZW9mKHNpZ3NldF90KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoZ2V0X3NpZ3NldF90KCZuZXdzZXQsIHVuZXdzZXQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlzaWdkZWxzZXRtYXNrKCZuZXdzZXQsIH5fQkxPQ0tBQkxFKTsKLQotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCXNhdmVzZXQgPSBjdXJyZW50LT5ibG9ja2VkOwotCWN1cnJlbnQtPmJsb2NrZWQgPSBuZXdzZXQ7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCi0JcmVncy0+cmVzdWx0ID0gLUVJTlRSOwotCXJlZ3MtPmdwclszXSA9IEVJTlRSOwotCXJlZ3MtPmNjciB8PSAweDEwMDAwMDAwOwotCXdoaWxlICgxKSB7Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQlzY2hlZHVsZSgpOwotCQlpZiAoZG9fc2lnbmFsKCZzYXZlc2V0LCByZWdzKSkKLQkJCXNpZ3JldHVybl9leGl0KHJlZ3MpOwotCX0KKyAJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisgCXNjaGVkdWxlKCk7CisgCXNldF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKyAJcmV0dXJuIC1FUkVTVEFSVE5PSEFORDsKIH0KIAogI2lmZGVmIENPTkZJR19QUEMzMgpAQCAtMzkxLDkgKzM2Myw2IEBACiBzdGF0aWMgaW50IHNhdmVfdXNlcl9yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3QgbWNvbnRleHQgX191c2VyICpmcmFtZSwKIAkJaW50IHNpZ3JldCkKIHsKLSNpZmRlZiBDT05GSUdfUFBDMzIKLQlDSEVDS19GVUxMX1JFR1MocmVncyk7Ci0jZW5kaWYKIAkvKiBNYWtlIHN1cmUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGFyZSBzdG9yZWQgaW4gcmVncyAqLwogCWZsdXNoX2ZwX3RvX3RocmVhZChjdXJyZW50KTsKIApAQCAtNDgyLDYgKzQ1MSwxNSBAQAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCisJLyoKKwkgKiBEbyB0aGlzIGJlZm9yZSB1cGRhdGluZyB0aGUgdGhyZWFkIHN0YXRlIGluCisJICogY3VycmVudC0+dGhyZWFkLmZwci92ci9ldnIuICBUaGF0IHdheSwgaWYgd2UgZ2V0IHByZWVtcHRlZAorCSAqIGFuZCBhbm90aGVyIHRhc2sgZ3JhYnMgdGhlIEZQVS9BbHRpdmVjL1NQRSwgaXQgd29uJ3QgYmUKKwkgKiB0ZW1wdGVkIHRvIHNhdmUgdGhlIGN1cnJlbnQgQ1BVIHN0YXRlIGludG8gdGhlIHRocmVhZF9zdHJ1Y3QKKwkgKiBhbmQgY29ycnVwdCB3aGF0IHdlIGFyZSB3cml0aW5nIHRoZXJlLgorCSAqLworCWRpc2NhcmRfbGF6eV9jcHVfc3RhdGUoKTsKKwogCS8qIGZvcmNlIHRoZSBwcm9jZXNzIHRvIHJlbG9hZCB0aGUgRlAgcmVnaXN0ZXJzIGZyb20KIAkgICBjdXJyZW50LT50aHJlYWQgd2hlbiBpdCBuZXh0IGRvZXMgRlAgaW5zdHJ1Y3Rpb25zICovCiAJcmVncy0+bXNyICY9IH4oTVNSX0ZQIHwgTVNSX0ZFMCB8IE1TUl9GRTEpOwpAQCAtNTIzLDE4ICs1MDEsNiBAQAogCQlyZXR1cm4gMTsKICNlbmRpZiAvKiBDT05GSUdfU1BFICovCiAKLSNpZm5kZWYgQ09ORklHX1NNUAotCXByZWVtcHRfZGlzYWJsZSgpOwotCWlmIChsYXN0X3Rhc2tfdXNlZF9tYXRoID09IGN1cnJlbnQpCi0JCWxhc3RfdGFza191c2VkX21hdGggPSBOVUxMOwotCWlmIChsYXN0X3Rhc2tfdXNlZF9hbHRpdmVjID09IGN1cnJlbnQpCi0JCWxhc3RfdGFza191c2VkX2FsdGl2ZWMgPSBOVUxMOwotI2lmZGVmIENPTkZJR19TUEUKLQlpZiAobGFzdF90YXNrX3VzZWRfc3BlID09IGN1cnJlbnQpCi0JCWxhc3RfdGFza191c2VkX3NwZSA9IE5VTEw7Ci0jZW5kaWYKLQlwcmVlbXB0X2VuYWJsZSgpOwotI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgyOCwxMiArNzk0LDYgQEAKIAlyZWdzLT5ncHJbNl0gPSAodW5zaWduZWQgbG9uZykgcnRfc2Y7CiAJcmVncy0+bmlwID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9oYW5kbGVyOwogCXJlZ3MtPnRyYXAgPSAwOwotI2lmZGVmIENPTkZJR19QUEM2NAotCXJlZ3MtPnJlc3VsdCA9IDA7Ci0KLQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfU0lOR0xFU1RFUCkpCi0JCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCk7Ci0jZW5kaWYKIAlyZXR1cm4gMTsKIAogYmFkZnJhbWU6CkBAIC05MTEsOCArODcxLDggQEAKIAkgKi8KIAlpZiAoZG9fc2V0Y29udGV4dChuZXdfY3R4LCByZWdzLCAwKSkKIAkJZG9fZXhpdChTSUdTRUdWKTsKLQlzaWdyZXR1cm5fZXhpdChyZWdzKTsKLQkvKiBkb2Vzbid0IGFjdHVhbGx5IHJldHVybiBiYWNrIHRvIGhlcmUgKi8KKworCXNldF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRUFMTCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk0NSwxMiArOTA1LDExIEBACiAJICogbm9ib2R5IGRvZXMgYW55Li4uCiAJICovCiAJY29tcGF0X3N5c19zaWdhbHRzdGFjaygodTMyKSh1NjQpJnJ0X3NmLT51Yy51Y19zdGFjaywgMCwgMCwgMCwgMCwgMCwgcmVncyk7Ci0JcmV0dXJuIChpbnQpcmVncy0+cmVzdWx0OwogI2Vsc2UKIAlkb19zaWdhbHRzdGFjaygmcnRfc2YtPnVjLnVjX3N0YWNrLCBOVUxMLCByZWdzLT5ncHJbMV0pOwotCXNpZ3JldHVybl9leGl0KHJlZ3MpOwkJLyogZG9lc24ndCByZXR1cm4gaGVyZSAqLwotCXJldHVybiAwOwogI2VuZGlmCisJc2V0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFQUxMKTsKKwlyZXR1cm4gMDsKIAogIGJhZDoKIAlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CkBAIC0xMDQxLDkgKzEwMDAsNyBAQAogCSAqLwogCWRvX3NpZ2FsdHN0YWNrKCZjdHgtPnVjX3N0YWNrLCBOVUxMLCByZWdzLT5ncHJbMV0pOwogCi0Jc2lncmV0dXJuX2V4aXQocmVncyk7Ci0JLyogZG9lc24ndCBhY3R1YWxseSByZXR1cm4gYmFjayB0byBoZXJlICovCi0KKwlzZXRfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVBTEwpOwogIG91dDoKIAlyZXR1cm4gMDsKIH0KQEAgLTExMDcsMTIgKzEwNjQsNiBAQAogCXJlZ3MtPmdwcls0XSA9ICh1bnNpZ25lZCBsb25nKSBzYzsKIAlyZWdzLT5uaXAgPSAodW5zaWduZWQgbG9uZykga2EtPnNhLnNhX2hhbmRsZXI7CiAJcmVncy0+dHJhcCA9IDA7Ci0jaWZkZWYgQ09ORklHX1BQQzY0Ci0JcmVncy0+cmVzdWx0ID0gMDsKLQotCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSkKLQkJcHRyYWNlX25vdGlmeShTSUdUUkFQKTsKLSNlbmRpZgogCiAJcmV0dXJuIDE7CiAKQEAgLTExNjAsMTIgKzExMTEsOCBAQAogCSAgICB8fCByZXN0b3JlX3VzZXJfcmVncyhyZWdzLCBzciwgMSkpCiAJCWdvdG8gYmFkZnJhbWU7CiAKLSNpZmRlZiBDT05GSUdfUFBDNjQKLQlyZXR1cm4gKGludClyZWdzLT5yZXN1bHQ7Ci0jZWxzZQotCXNpZ3JldHVybl9leGl0KHJlZ3MpOwkJLyogZG9lc24ndCByZXR1cm4gKi8KKwlzZXRfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVBTEwpOwogCXJldHVybiAwOwotI2VuZGlmCiAKIGJhZGZyYW1lOgogCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKQEAgLTExODEsNyArMTEyOCw3IEBACiB7CiAJc2lnaW5mb190IGluZm87CiAJc3RydWN0IGtfc2lnYWN0aW9uIGthOwotCXVuc2lnbmVkIGludCBmcmFtZSwgbmV3c3A7CisJdW5zaWduZWQgaW50IG5ld3NwOwogCWludCBzaWduciwgcmV0OwogCiAjaWZkZWYgQ09ORklHX1BQQzMyCkBAIC0xMTkyLDExICsxMTM5LDExIEBACiAJfQogI2VuZGlmCiAKLQlpZiAoIW9sZHNldCkKKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJb2xkc2V0ID0gJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2s7CisJZWxzZSBpZiAoIW9sZHNldCkKIAkJb2xkc2V0ID0gJmN1cnJlbnQtPmJsb2NrZWQ7CiAKLQluZXdzcCA9IGZyYW1lID0gMDsKLQogCXNpZ25yID0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKCZpbmZvLCAma2EsIHJlZ3MsIE5VTEwpOwogI2lmZGVmIENPTkZJR19QUEMzMgogbm9fc2lnbmFsOgpAQCAtMTIyNiw4ICsxMTczLDE0IEBACiAJCX0KIAl9CiAKLQlpZiAoc2lnbnIgPT0gMCkKKwlpZiAoc2lnbnIgPT0gMCkgeworCQkvKiBObyBzaWduYWwgdG8gZGVsaXZlciAtLSBwdXQgdGhlIHNhdmVkIHNpZ21hc2sgYmFjayAqLworCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkgeworCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CisJCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2ssIE5VTEwpOworCQl9CiAJCXJldHVybiAwOwkJLyogbm8gc2lnbmFscyBkZWxpdmVyZWQgKi8KKwl9CiAKIAlpZiAoKGthLnNhLnNhX2ZsYWdzICYgU0FfT05TVEFDSykgJiYgY3VycmVudC0+c2FzX3NzX3NpemUKIAkgICAgJiYgIW9uX3NpZ19zdGFjayhyZWdzLT5ncHJbMV0pKQpAQCAtMTI2MCw2ICsxMjEzLDEwIEBACiAJCQlzaWdhZGRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsIHNpZ25yKTsKIAkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKIAkJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkJLyogQSBzaWduYWwgd2FzIHN1Y2Nlc3NmdWxseSBkZWxpdmVyZWQ7IHRoZSBzYXZlZCBzaWdtYXNrIGlzIGluCisJCSAgIGl0cyBmcmFtZSwgYW5kIHdlIGNhbiBjbGVhciB0aGUgVElGX1JFU1RPUkVfU0lHTUFTSyBmbGFnICovCisJCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKQorCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CiAJfQogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF82NC5jCmluZGV4IDFkZWNmMjcuLmIzMTkzMTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfNjQuYwpAQCAtNjcsNDAgKzY3LDYgQEAKIAljaGFyIGFiaWdhcFsyODhdOwogfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMTYpKSk7CiAKLQotLyoKLSAqIEF0b21pY2FsbHkgc3dhcCBpbiB0aGUgbmV3IHNpZ25hbCBtYXNrLCBhbmQgd2FpdCBmb3IgYSBzaWduYWwuCi0gKi8KLWxvbmcgc3lzX3J0X3NpZ3N1c3BlbmQoc2lnc2V0X3QgX191c2VyICp1bmV3c2V0LCBzaXplX3Qgc2lnc2V0c2l6ZSwgaW50IHAzLCBpbnQgcDQsCi0JCSAgICAgICBpbnQgcDYsIGludCBwNywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc2lnc2V0X3Qgc2F2ZXNldCwgbmV3c2V0OwotCi0JLyogWFhYOiBEb24ndCBwcmVjbHVkZSBoYW5kbGluZyBkaWZmZXJlbnQgc2l6ZWQgc2lnc2V0X3Qncy4gICovCi0JaWYgKHNpZ3NldHNpemUgIT0gc2l6ZW9mKHNpZ3NldF90KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJm5ld3NldCwgdW5ld3NldCwgc2l6ZW9mKG5ld3NldCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlzaWdkZWxzZXRtYXNrKCZuZXdzZXQsIH5fQkxPQ0tBQkxFKTsKLQotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCXNhdmVzZXQgPSBjdXJyZW50LT5ibG9ja2VkOwotCWN1cnJlbnQtPmJsb2NrZWQgPSBuZXdzZXQ7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCi0JcmVncy0+cmVzdWx0ID0gLUVJTlRSOwotCXJlZ3MtPmdwclszXSA9IEVJTlRSOwotCXJlZ3MtPmNjciB8PSAweDEwMDAwMDAwOwotCXdoaWxlICgxKSB7Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQlzY2hlZHVsZSgpOwotCQlpZiAoZG9fc2lnbmFsKCZzYXZlc2V0LCByZWdzKSkKLQkJCXJldHVybiAwOwotCX0KLX0KLQogbG9uZyBzeXNfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCBfX3VzZXIgKnVzcywgc3RhY2tfdCBfX3VzZXIgKnVvc3MsIHVuc2lnbmVkIGxvbmcgcjUsCiAJCSAgICAgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywgdW5zaWduZWQgbG9uZyByOCwKIAkJICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKQEAgLTE1Miw2ICsxMTgsMTQgQEAKIAllcnIgfD0gX19wdXRfdXNlcigwLCAmc2MtPnZfcmVncyk7CiAjZW5kaWYgLyogQ09ORklHX0FMVElWRUMgKi8KIAllcnIgfD0gX19wdXRfdXNlcigmc2MtPmdwX3JlZ3MsICZzYy0+cmVncyk7CisJaWYgKCFGVUxMX1JFR1MocmVncykpIHsKKwkJLyogWmVybyBvdXQgdGhlIHVuc2F2ZWQgR1BScyB0byBhdm9pZCBpbmZvcm1hdGlvbgorCQkgICBsZWFrLCBhbmQgc2V0IFRJRl9TQVZFX05WR1BSUyB0byBlbnN1cmUgdGhhdCB0aGUKKwkJICAgcmVnaXN0ZXJzIGRvIGFjdHVhbGx5IGdldCBzYXZlZCBsYXRlci4gKi8KKwkJbWVtc2V0KCZyZWdzLT5ncHJbMTRdLCAwLCAxOCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJCXNldF90aHJlYWRfZmxhZyhUSUZfU0FWRV9OVkdQUlMpOworCQljdXJyZW50X3RocmVhZF9pbmZvKCktPm52Z3Byc19mcmFtZSA9ICZzYy0+Z3BfcmVnczsKKwl9CiAJZXJyIHw9IF9fY29weV90b191c2VyKCZzYy0+Z3BfcmVncywgcmVncywgR1BfUkVHU19TSVpFKTsKIAllcnIgfD0gX19jb3B5X3RvX3VzZXIoJnNjLT5mcF9yZWdzLCAmY3VycmVudC0+dGhyZWFkLmZwciwgRlBfUkVHU19TSVpFKTsKIAllcnIgfD0gX19wdXRfdXNlcihzaWduciwgJnNjLT5zaWduYWwpOwpAQCAtMTk3LDEwICsxNzEsMjAgQEAKIAogCWlmICghc2lnKQogCQlyZWdzLT5ncHJbMTNdID0gc2F2ZV9yMTM7Ci0JZXJyIHw9IF9fY29weV9mcm9tX3VzZXIoJmN1cnJlbnQtPnRocmVhZC5mcHIsICZzYy0+ZnBfcmVncywgRlBfUkVHU19TSVpFKTsKIAlpZiAoc2V0ICE9IE5VTEwpCiAJCWVyciB8PSAgX19nZXRfdXNlcihzZXQtPnNpZ1swXSwgJnNjLT5vbGRtYXNrKTsKIAorCS8qCisJICogRG8gdGhpcyBiZWZvcmUgdXBkYXRpbmcgdGhlIHRocmVhZCBzdGF0ZSBpbgorCSAqIGN1cnJlbnQtPnRocmVhZC5mcHIvdnIuICBUaGF0IHdheSwgaWYgd2UgZ2V0IHByZWVtcHRlZAorCSAqIGFuZCBhbm90aGVyIHRhc2sgZ3JhYnMgdGhlIEZQVS9BbHRpdmVjLCBpdCB3b24ndCBiZQorCSAqIHRlbXB0ZWQgdG8gc2F2ZSB0aGUgY3VycmVudCBDUFUgc3RhdGUgaW50byB0aGUgdGhyZWFkX3N0cnVjdAorCSAqIGFuZCBjb3JydXB0IHdoYXQgd2UgYXJlIHdyaXRpbmcgdGhlcmUuCisJICovCisJZGlzY2FyZF9sYXp5X2NwdV9zdGF0ZSgpOworCisJZXJyIHw9IF9fY29weV9mcm9tX3VzZXIoJmN1cnJlbnQtPnRocmVhZC5mcHIsICZzYy0+ZnBfcmVncywgRlBfUkVHU19TSVpFKTsKKwogI2lmZGVmIENPTkZJR19BTFRJVkVDCiAJZXJyIHw9IF9fZ2V0X3VzZXIodl9yZWdzLCAmc2MtPnZfcmVncyk7CiAJZXJyIHw9IF9fZ2V0X3VzZXIobXNyLCAmc2MtPmdwX3JlZ3NbUFRfTVNSXSk7CkBAIC0yMTksMTQgKzIwMyw2IEBACiAJCWN1cnJlbnQtPnRocmVhZC52cnNhdmUgPSAwOwogI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCiAKLSNpZm5kZWYgQ09ORklHX1NNUAotCXByZWVtcHRfZGlzYWJsZSgpOwotCWlmIChsYXN0X3Rhc2tfdXNlZF9tYXRoID09IGN1cnJlbnQpCi0JCWxhc3RfdGFza191c2VkX21hdGggPSBOVUxMOwotCWlmIChsYXN0X3Rhc2tfdXNlZF9hbHRpdmVjID09IGN1cnJlbnQpCi0JCWxhc3RfdGFza191c2VkX2FsdGl2ZWMgPSBOVUxMOwotCXByZWVtcHRfZW5hYmxlKCk7Ci0jZW5kaWYKIAkvKiBGb3JjZSByZWxvYWQgb2YgRlAvVkVDICovCiAJcmVncy0+bXNyICY9IH4oTVNSX0ZQIHwgTVNSX0ZFMCB8IE1TUl9GRTEgfCBNU1JfVkVDKTsKIApAQCAtMzQwLDYgKzMxNiw3IEBACiAJCWRvX2V4aXQoU0lHU0VHVik7CiAKIAkvKiBUaGlzIHJldHVybnMgbGlrZSBydF9zaWdyZXR1cm4gKi8KKwlzZXRfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVBTEwpOwogCXJldHVybiAwOwogfQogCkBAIC0zNzIsNyArMzQ5LDggQEAKIAkgKi8KIAlkb19zaWdhbHRzdGFjaygmdWMtPnVjX3N0YWNrLCBOVUxMLCByZWdzLT5ncHJbMV0pOwogCi0JcmV0dXJuIHJlZ3MtPnJlc3VsdDsKKwlzZXRfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVBTEwpOworCXJldHVybiAwOwogCiBiYWRmcmFtZToKICNpZiBERUJVR19TSUcKQEAgLTQ1NCw5ICs0MzIsNiBAQAogCWlmIChlcnIpCiAJCWdvdG8gYmFkZnJhbWU7CiAKLQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfU0lOR0xFU1RFUCkpCi0JCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCk7Ci0KIAlyZXR1cm4gMTsKIAogYmFkZnJhbWU6CkBAIC01MDIsNiArNDc3LDggQEAKIAkJICogd2Ugb25seSBnZXQgaGVyZSBpZiB0aGVyZSBpcyBhIGhhbmRsZXIsIHdlIGRvbnQgcmVzdGFydC4KIAkJICovCiAJCXJlZ3MtPnJlc3VsdCA9IC1FSU5UUjsKKwkJcmVncy0+Z3ByWzNdID0gRUlOVFI7CisJCXJlZ3MtPmNjciB8PSAweDEwMDAwMDAwOwogCQlicmVhazsKIAljYXNlIC1FUkVTVEFSVFNZUzoKIAkJLyogRVJFU1RBUlRTWVMgbWVhbnMgdG8gcmVzdGFydCB0aGUgc3lzY2FsbCBpZiB0aGVyZSBpcyBubwpAQCAtNTA5LDYgKzQ4Niw4IEBACiAJCSAqLwogCQlpZiAoIShrYS0+c2Euc2FfZmxhZ3MgJiBTQV9SRVNUQVJUKSkgewogCQkJcmVncy0+cmVzdWx0ID0gLUVJTlRSOworCQkJcmVncy0+Z3ByWzNdID0gRUlOVFI7CisJCQlyZWdzLT5jY3IgfD0gMHgxMDAwMDAwMDsKIAkJCWJyZWFrOwogCQl9CiAJCS8qIGZhbGx0aHJvdWdoICovCkBAIC01NDEsMTEgKzUyMCwxNSBAQAogCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCkpCiAJCXJldHVybiBkb19zaWduYWwzMihvbGRzZXQsIHJlZ3MpOwogCi0JaWYgKCFvbGRzZXQpCisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCisJCW9sZHNldCA9ICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrOworCWVsc2UgaWYgKCFvbGRzZXQpCiAJCW9sZHNldCA9ICZjdXJyZW50LT5ibG9ja2VkOwogCiAJc2lnbnIgPSBnZXRfc2lnbmFsX3RvX2RlbGl2ZXIoJmluZm8sICZrYSwgcmVncywgTlVMTCk7CiAJaWYgKHNpZ25yID4gMCkgeworCQlpbnQgcmV0OworCiAJCS8qIFdoZWUhICBBY3R1YWxseSBkZWxpdmVyIHRoZSBzaWduYWwuICAqLwogCQlpZiAoVFJBUChyZWdzKSA9PSAweDBDMDApCiAJCQlzeXNjYWxsX3Jlc3RhcnQocmVncywgJmthKTsKQEAgLTU1OCw3ICs1NDEsMTQgQEAKIAkJaWYgKGN1cnJlbnQtPnRocmVhZC5kYWJyKQogCQkJc2V0X2RhYnIoY3VycmVudC0+dGhyZWFkLmRhYnIpOwogCi0JCXJldHVybiBoYW5kbGVfc2lnbmFsKHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsIHJlZ3MpOworCQlyZXQgPSBoYW5kbGVfc2lnbmFsKHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsIHJlZ3MpOworCisJCS8qIElmIGEgc2lnbmFsIHdhcyBzdWNjZXNzZnVsbHkgZGVsaXZlcmVkLCB0aGUgc2F2ZWQgc2lnbWFzayBpcyBpbgorCQkgICBpdHMgZnJhbWUsIGFuZCB3ZSBjYW4gY2xlYXIgdGhlIFRJRl9SRVNUT1JFX1NJR01BU0sgZmxhZyAqLworCQlpZiAocmV0ICYmIHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCisJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKworCQlyZXR1cm4gcmV0OwogCX0KIAogCWlmIChUUkFQKHJlZ3MpID09IDB4MEMwMCkgewkvKiBTeXN0ZW0gQ2FsbCEgKi8KQEAgLTU3NCw2ICs1NjQsMTEgQEAKIAkJCXJlZ3MtPnJlc3VsdCA9IDA7CiAJCX0KIAl9CisJLyogTm8gc2lnbmFsIHRvIGRlbGl2ZXIgLS0gcHV0IHRoZSBzYXZlZCBzaWdtYXNrIGJhY2sgKi8KKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkgeworCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrLCBOVUxMKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCmluZGV4IDMwMzc0ZDIuLmM4NDU4YzUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KIAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CkBAIC03NSw2ICs3Niw4IEBACiAKIGludCBzbXRfZW5hYmxlZF9hdF9ib290ID0gMTsKIAorc3RhdGljIHZvaWQgKCpjcmFzaF9pcGlfZnVuY3Rpb25fcHRyKShzdHJ1Y3QgcHRfcmVncyAqKSA9IE5VTEw7CisKICNpZmRlZiBDT05GSUdfTVBJQwogaW50IF9faW5pdCBzbXBfbXBpY19wcm9iZSh2b2lkKQogewpAQCAtMTIzLDExICsxMjYsMTYgQEAKIAkJLyogWFhYIERvIHdlIGhhdmUgdG8gZG8gdGhpcz8gKi8KIAkJc2V0X25lZWRfcmVzY2hlZCgpOwogCQlicmVhazsKLSNpZmRlZiBDT05GSUdfREVCVUdHRVIKIAljYXNlIFBQQ19NU0dfREVCVUdHRVJfQlJFQUs6CisJCWlmIChjcmFzaF9pcGlfZnVuY3Rpb25fcHRyKSB7CisJCQljcmFzaF9pcGlfZnVuY3Rpb25fcHRyKHJlZ3MpOworCQkJYnJlYWs7CisJCX0KKyNpZmRlZiBDT05GSUdfREVCVUdHRVIKIAkJZGVidWdnZXJfaXBpKHJlZ3MpOwogCQlicmVhazsKLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19ERUJVR0dFUiAqLworCQkvKiBGQUxMVEhST1VHSCAqLwogCWRlZmF1bHQ6CiAJCXByaW50aygiU01QICVkOiBzbXBfbWVzc2FnZV9yZWN2KCk6IHVua25vd24gbXNnICVkXG4iLAogCQkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpLCBtc2cpOwpAQCAtMTQ3LDYgKzE1NSwxNyBAQAogfQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfS0VYRUMKK3ZvaWQgY3Jhc2hfc2VuZF9pcGkodm9pZCAoKmNyYXNoX2lwaV9jYWxsYmFjaykoc3RydWN0IHB0X3JlZ3MgKikpCit7CisJY3Jhc2hfaXBpX2Z1bmN0aW9uX3B0ciA9IGNyYXNoX2lwaV9jYWxsYmFjazsKKwlpZiAoY3Jhc2hfaXBpX2NhbGxiYWNrKSB7CisJCW1iKCk7CisJCXNtcF9vcHMtPm1lc3NhZ2VfcGFzcyhNU0dfQUxMX0JVVF9TRUxGLCBQUENfTVNHX0RFQlVHR0VSX0JSRUFLKTsKKwl9Cit9CisjZW5kaWYKKwogc3RhdGljIHZvaWQgc3RvcF90aGlzX2NwdSh2b2lkICpkdW1teSkKIHsKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwpAQCAtMzE5LDggKzMzOCw4IEBACiAjaWZkZWYgQ09ORklHX1BQQzY0CiAJcGFjYVtjcHVdLl9fY3VycmVudCA9IHA7CiAjZW5kaWYKLQljdXJyZW50X3NldFtjcHVdID0gcC0+dGhyZWFkX2luZm87Ci0JcC0+dGhyZWFkX2luZm8tPmNwdSA9IGNwdTsKKwljdXJyZW50X3NldFtjcHVdID0gdGFza190aHJlYWRfaW5mbyhwKTsKKwl0YXNrX3RocmVhZF9pbmZvKHApLT5jcHUgPSBjcHU7CiB9CiAKIHZvaWQgX19pbml0IHNtcF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQpAQCAtMzU2LDcgKzM3NSw3IEBACiAjaWZkZWYgQ09ORklHX1BQQzY0CiAJcGFjYVtib290X2NwdWlkXS5fX2N1cnJlbnQgPSBjdXJyZW50OwogI2VuZGlmCi0JY3VycmVudF9zZXRbYm9vdF9jcHVpZF0gPSBjdXJyZW50LT50aHJlYWRfaW5mbzsKKwljdXJyZW50X3NldFtib290X2NwdWlkXSA9IHRhc2tfdGhyZWFkX2luZm8oY3VycmVudCk7CiB9CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKQEAgLTQ1MiwxMCArNDcxLDYgQEAKIAlpZiAoc21wX29wcy0+Y3B1X2Jvb3RhYmxlICYmICFzbXBfb3BzLT5jcHVfYm9vdGFibGUoY3B1KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLSNpZmRlZiBDT05GSUdfUFBDNjQKLQlwYWNhW2NwdV0uZGVmYXVsdF9kZWNyID0gdGJfdGlja3NfcGVyX2ppZmZ5OwotI2VuZGlmCi0KIAkvKiBNYWtlIHN1cmUgY2FsbGluLW1hcCBlbnRyeSBpcyAwIChjYW4gYmUgbGVmdG92ZXIgYSBDUFUKIAkgKiBob3RwbHVnCiAJICovCkBAIC01NTQsNiArNTY5LDggQEAKIAlzbXBfb3BzLT5zZXR1cF9jcHUoYm9vdF9jcHVpZCk7CiAKIAlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIG9sZF9tYXNrKTsKKworCWR1bXBfbnVtYV9jcHVfdG9wb2xvZ3koKTsKIH0KIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNfcHBjMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzX3BwYzMyLmMKaW5kZXggOWM5MjFkMS4uNDc1MjQ5ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNfcHBjMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c19wcGMzMi5jCkBAIC01NTIsMzAgKzU1Miw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBpbnQgY29tcGF0X3N5c19wY2ljb25maWdfcmVhZCh1MzIgYnVzLCB1MzIgZGZuLCB1MzIgb2ZmLCB1MzIgbGVuLCB1MzIgdWJ1ZikKLXsKLQlyZXR1cm4gc3lzX3BjaWNvbmZpZ19yZWFkKCh1bnNpZ25lZCBsb25nKSBidXMsCi0JCQkJICAodW5zaWduZWQgbG9uZykgZGZuLAotCQkJCSAgKHVuc2lnbmVkIGxvbmcpIG9mZiwKLQkJCQkgICh1bnNpZ25lZCBsb25nKSBsZW4sCi0JCQkJICBjb21wYXRfcHRyKHVidWYpKTsKLX0KLQotYXNtbGlua2FnZSBpbnQgY29tcGF0X3N5c19wY2ljb25maWdfd3JpdGUodTMyIGJ1cywgdTMyIGRmbiwgdTMyIG9mZiwgdTMyIGxlbiwgdTMyIHVidWYpCi17Ci0JcmV0dXJuIHN5c19wY2ljb25maWdfd3JpdGUoKHVuc2lnbmVkIGxvbmcpIGJ1cywKLQkJCQkgICAodW5zaWduZWQgbG9uZykgZGZuLAotCQkJCSAgICh1bnNpZ25lZCBsb25nKSBvZmYsCi0JCQkJICAgKHVuc2lnbmVkIGxvbmcpIGxlbiwKLQkJCQkgICBjb21wYXRfcHRyKHVidWYpKTsKLX0KLQotYXNtbGlua2FnZSBpbnQgY29tcGF0X3N5c19wY2ljb25maWdfaW9iYXNlKHUzMiB3aGljaCwgdTMyIGluX2J1cywgdTMyIGluX2RldmZuKQotewotCXJldHVybiBzeXNfcGNpY29uZmlnX2lvYmFzZSh3aGljaCwgaW5fYnVzLCBpbl9kZXZmbik7Ci19Ci0KLQogLyogTm90ZTogaXQgaXMgbmVjZXNzYXJ5IHRvIHRyZWF0IG1vZGUgYXMgYW4gdW5zaWduZWQgaW50LAogICogd2l0aCB0aGUgY29ycmVzcG9uZGluZyBjYXN0IHRvIGEgc2lnbmVkIGludCB0byBpbnN1cmUgdGhhdCB0aGUgCiAgKiBwcm9wZXIgY29udmVyc2lvbiAoc2lnbiBleHRlbnNpb24pIGJldHdlZW4gdGhlIHJlZ2lzdGVyIHJlcHJlc2VudGF0aW9uIG9mIGEgc2lnbmVkIGludCAobXNyIGluIDMyLWJpdCBtb2RlKQpAQCAtOTU2LDM4ICs5MzIsNiBAQAogCQkJICAgICBhZHZpY2UpOwogfQogCi1sb25nIHBwYzMyX3RpbWVyX2NyZWF0ZShjbG9ja2lkX3QgY2xvY2ssCi0JCQlzdHJ1Y3QgY29tcGF0X3NpZ2V2ZW50IF9fdXNlciAqZXYzMiwKLQkJCXRpbWVyX3QgX191c2VyICp0aW1lcl9pZCkKLXsKLQlzaWdldmVudF90IGV2ZW50OwotCXRpbWVyX3QgdDsKLQlsb25nIGVycjsKLQltbV9zZWdtZW50X3Qgc2F2ZWZzOwotCi0JaWYgKGV2MzIgPT0gTlVMTCkKLQkJcmV0dXJuIHN5c190aW1lcl9jcmVhdGUoY2xvY2ssIE5VTEwsIHRpbWVyX2lkKTsKLQotCWlmIChnZXRfY29tcGF0X3NpZ2V2ZW50KCZldmVudCwgZXYzMikpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0aW1lcl9pZCwgc2l6ZW9mKHRpbWVyX3QpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlzYXZlZnMgPSBnZXRfZnMoKTsKLQlzZXRfZnMoS0VSTkVMX0RTKTsKLQkvKiBUaGUgX191c2VyIHBvaW50ZXIgY2FzdHMgYXJlIHZhbGlkIGR1ZSB0byB0aGUgc2V0X2ZzKCkgKi8KLQllcnIgPSBzeXNfdGltZXJfY3JlYXRlKGNsb2NrLAotCQkoc2lnZXZlbnRfdCBfX3VzZXIgKikgJmV2ZW50LAotCQkodGltZXJfdCBfX3VzZXIgKikgJnQpOwotCXNldF9mcyhzYXZlZnMpOwotCi0JaWYgKGVyciA9PSAwKQotCQllcnIgPSBfX3B1dF91c2VyKHQsIHRpbWVyX2lkKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2FkZF9rZXkoY29uc3QgY2hhciBfX3VzZXIgKl90eXBlLAogCQkJICAgICAgY29uc3QgY2hhciBfX3VzZXIgKl9kZXNjcmlwdGlvbiwKIAkJCSAgICAgIGNvbnN0IHZvaWQgX191c2VyICpfcGF5bG9hZCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzY2FsbHMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzY2FsbHMuYwppbmRleCA5MWI5M2Q5Li5hZDg5NWM5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2NhbGxzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNjYWxscy5jCkBAIC00Myw5ICs0Myw2IEBACiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIHdhbGxfamlmZmllczsKLQotCiAvKgogICogc3lzX2lwYygpIGlzIHRoZSBkZS1tdWx0aXBsZXhlciBmb3IgdGhlIFN5c1YgSVBDIGNhbGxzLi4KICAqCkBAIC0zMTEsMzEgKzMwOCw2IEBACiAJcmV0dXJuIGVycm9yPyAtRUZBVUxUOiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BQQzY0Ci10aW1lX3Qgc3lzNjRfdGltZSh0aW1lX3QgX191c2VyICogdGxvYykKLXsKLQl0aW1lX3Qgc2VjczsKLQl0aW1lX3QgdXNlY3M7Ci0KLQlsb25nIHRiX2RlbHRhID0gdGJfdGlja3Nfc2luY2UodGJfbGFzdF9zdGFtcCk7Ci0JdGJfZGVsdGEgKz0gKGppZmZpZXMgLSB3YWxsX2ppZmZpZXMpICogdGJfdGlja3NfcGVyX2ppZmZ5OwotCi0Jc2VjcyAgPSB4dGltZS50dl9zZWM7ICAKLQl1c2VjcyA9ICh4dGltZS50dl9uc2VjLzEwMDApICsgdGJfZGVsdGEgLyB0Yl90aWNrc19wZXJfdXNlYzsKLQl3aGlsZSAodXNlY3MgPj0gVVNFQ19QRVJfU0VDKSB7Ci0JCSsrc2VjczsKLQkJdXNlY3MgLT0gVVNFQ19QRVJfU0VDOwotCX0KLQotCWlmICh0bG9jKSB7Ci0JCWlmIChwdXRfdXNlcihzZWNzLHRsb2MpKQotCQkJc2VjcyA9IC1FRkFVTFQ7Ci0JfQotCi0JcmV0dXJuIHNlY3M7Ci19Ci0jZW5kaWYKLQogbG9uZyBwcGNfZmFkdmlzZTY0XzY0KGludCBmZCwgaW50IGFkdmljZSwgdTMyIG9mZnNldF9oaWdoLCB1MzIgb2Zmc2V0X2xvdywKIAkJICAgICAgdTMyIGxlbl9oaWdoLCB1MzIgbGVuX2xvdykKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzdGJsLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c3RibC5TCmluZGV4IDY1ZWFlYTkuLjAwN2IxNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzdGJsLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXN0YmwuUwpAQCAtNTQsNyArNTQsNyBAQAogU1lTQ0FMTCh1bmxpbmspCiBDT01QQVRfU1lTKGV4ZWN2ZSkKIFNZU0NBTEwoY2hkaXIpCi1TWVNYKHN5czY0X3RpbWUsY29tcGF0X3N5c190aW1lLHN5c190aW1lKQorQ09NUEFUX1NZUyh0aW1lKQogU1lTQ0FMTChta25vZCkKIFNZU0NBTEwoY2htb2QpCiBTWVNDQUxMKGxjaG93bikKQEAgLTExMyw3ICsxMTMsNyBAQAogQ09NUEFUX1NZUyhzc2V0bWFzaykKIFNZU0NBTEwoc2V0cmV1aWQpCiBTWVNDQUxMKHNldHJlZ2lkKQotU1lTWChzeXNfbmlfc3lzY2FsbCxwcGMzMl9zaWdzdXNwZW5kLHBwY19zaWdzdXNwZW5kKQorU1lTMzJPTkxZKHNpZ3N1c3BlbmQpCiBDT01QQVRfU1lTKHNpZ3BlbmRpbmcpCiBDT01QQVRfU1lTKHNldGhvc3RuYW1lKQogQ09NUEFUX1NZUyhzZXRybGltaXQpCkBAIC0xNjAsNyArMTYwLDcgQEAKIENPTVBBVF9TWVMoc3lzaW5mbykKIENPTVBBVF9TWVMoaXBjKQogU1lTQ0FMTChmc3luYykKLVNZU1goc3lzX25pX3N5c2NhbGwscHBjMzJfc2lncmV0dXJuLHN5c19zaWdyZXR1cm4pCitTWVMzMk9OTFkoc2lncmV0dXJuKQogUFBDX1NZUyhjbG9uZSkKIENPTVBBVF9TWVMoc2V0ZG9tYWlubmFtZSkKIFBQQ19TWVMobmV3dW5hbWUpCkBAIC0yMTMsMTMgKzIxMywxMyBAQAogU1lTQ0FMTChzZXRyZXNnaWQpCiBTWVNDQUxMKGdldHJlc2dpZCkKIENPTVBBVF9TWVMocHJjdGwpCi1TWVNYKHBwYzY0X3J0X3NpZ3JldHVybixwcGMzMl9ydF9zaWdyZXR1cm4sc3lzX3J0X3NpZ3JldHVybikKK0NPTVBBVF9TWVMocnRfc2lncmV0dXJuKQogQ09NUEFUX1NZUyhydF9zaWdhY3Rpb24pCiBDT01QQVRfU1lTKHJ0X3NpZ3Byb2NtYXNrKQogQ09NUEFUX1NZUyhydF9zaWdwZW5kaW5nKQogQ09NUEFUX1NZUyhydF9zaWd0aW1lZHdhaXQpCiBDT01QQVRfU1lTKHJ0X3NpZ3F1ZXVlaW5mbykKLVNZU1gocHBjNjRfcnRfc2lnc3VzcGVuZCxwcGMzMl9ydF9zaWdzdXNwZW5kLHBwY19ydF9zaWdzdXNwZW5kKQorQ09NUEFUX1NZUyhydF9zaWdzdXNwZW5kKQogQ09NUEFUX1NZUyhwcmVhZDY0KQogQ09NUEFUX1NZUyhwd3JpdGU2NCkKIFNZU0NBTEwoY2hvd24pCkBAIC0yMzksOSArMjM5LDkgQEAKIFNZU1goc3lzX25pX3N5c2NhbGwsc3lzX3N0YXQ2NCxzeXNfc3RhdDY0KQogU1lTWChzeXNfbmlfc3lzY2FsbCxzeXNfbHN0YXQ2NCxzeXNfbHN0YXQ2NCkKIFNZU1goc3lzX25pX3N5c2NhbGwsc3lzX2ZzdGF0NjQsc3lzX2ZzdGF0NjQpCi1DT01QQVRfU1lTKHBjaWNvbmZpZ19yZWFkKQotQ09NUEFUX1NZUyhwY2ljb25maWdfd3JpdGUpCi1DT01QQVRfU1lTKHBjaWNvbmZpZ19pb2Jhc2UpCitTWVNDQUxMKHBjaWNvbmZpZ19yZWFkKQorU1lTQ0FMTChwY2ljb25maWdfd3JpdGUpCitTWVNDQUxMKHBjaWNvbmZpZ19pb2Jhc2UpCiBTWVNDQUxMKG5pX3N5c2NhbGwpCiBTWVNDQUxMKGdldGRlbnRzNjQpCiBTWVNDQUxMKHBpdm90X3Jvb3QpCkBAIC0yODEsNyArMjgxLDcgQEAKIFNZU0NBTEwoZXBvbGxfY3RsKQogU1lTQ0FMTChlcG9sbF93YWl0KQogU1lTQ0FMTChyZW1hcF9maWxlX3BhZ2VzKQotU1lTWChzeXNfdGltZXJfY3JlYXRlLHBwYzMyX3RpbWVyX2NyZWF0ZSxzeXNfdGltZXJfY3JlYXRlKQorU1lTWChzeXNfdGltZXJfY3JlYXRlLGNvbXBhdF9zeXNfdGltZXJfY3JlYXRlLHN5c190aW1lcl9jcmVhdGUpCiBDT01QQVRfU1lTKHRpbWVyX3NldHRpbWUpCiBDT01QQVRfU1lTKHRpbWVyX2dldHRpbWUpCiBTWVNDQUxMKHRpbWVyX2dldG92ZXJydW4pCkBAIC0yOTAsNyArMjkwLDcgQEAKIENPTVBBVF9TWVMoY2xvY2tfZ2V0dGltZSkKIENPTVBBVF9TWVMoY2xvY2tfZ2V0cmVzKQogQ09NUEFUX1NZUyhjbG9ja19uYW5vc2xlZXApCi1TWVNYKHBwYzY0X3N3YXBjb250ZXh0LHBwYzMyX3N3YXBjb250ZXh0LHBwY19zd2FwY29udGV4dCkKK0NPTVBBVF9TWVMoc3dhcGNvbnRleHQpCiBDT01QQVRfU1lTKHRna2lsbCkKIENPTVBBVF9TWVModXRpbWVzKQogQ09NUEFUX1NZUyhzdGF0ZnM2NCkKQEAgLTMxOSwzICszMTksNyBAQAogU1lTQ0FMTChpbm90aWZ5X2luaXQpCiBTWVNDQUxMKGlub3RpZnlfYWRkX3dhdGNoKQogU1lTQ0FMTChpbm90aWZ5X3JtX3dhdGNoKQorU1lTQ0FMTChzcHVfcnVuKQorU1lTQ0FMTChzcHVfY3JlYXRlKQorQ09NUEFUX1NZUyhwc2VsZWN0NikKK0NPTVBBVF9TWVMocHBvbGwpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCmluZGV4IGRlODQ3OTcuLmM0YTI5NGQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCkBAIC00MzEsNyArNDMxLDcgQEAKIAlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORywgcmVncyk7CiAKICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLQlnZXRfcGFjYSgpLT5scHBhY2EuaW50X2R3b3JkLmZpZWxkcy5kZWNyX2ludCA9IDA7CisJZ2V0X2xwcGFjYSgpLT5pbnRfZHdvcmQuZmllbGRzLmRlY3JfaW50ID0gMDsKICNlbmRpZgogCiAJd2hpbGUgKCh0aWNrcyA9IHRiX3RpY2tzX3NpbmNlKHBlcl9jcHUobGFzdF9qaWZmeSwgY3B1KSkpCkBAIC02OTksMTAgKzY5OSw2IEBACiAJZGl2MTI4X2J5XzMyKDEwMjQqMTAyNCwgMCwgdGJfdGlja3NfcGVyX3NlYywgJnJlcyk7CiAJdGJfdG9feHMgPSByZXMucmVzdWx0X2xvdzsKIAotI2lmZGVmIENPTkZJR19QUEM2NAotCWdldF9wYWNhKCktPmRlZmF1bHRfZGVjciA9IHRiX3RpY2tzX3Blcl9qaWZmeTsKLSNlbmRpZgotCiAJLyoKIAkgKiBDb21wdXRlIHNjYWxlIGZhY3RvciBmb3Igc2NoZWRfY2xvY2suCiAJICogVGhlIGNhbGlicmF0ZV9kZWNyKCkgZnVuY3Rpb24gaGFzIHNldCB0Yl90aWNrc19wZXJfc2VjLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCmluZGV4IDE1MTE0NTQuLjc1MDlhYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcmN0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CiAKICNpbmNsdWRlIDxhc20va2RlYnVnLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTk1LDcgKzk2LDcgQEAKIAogaW50IGRpZShjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycikKIHsKLQlzdGF0aWMgaW50IGRpZV9jb3VudGVyOworCXN0YXRpYyBpbnQgZGllX2NvdW50ZXIsIGNyYXNoX2R1bXBfc3RhcnQgPSAwOwogCWludCBubCA9IDA7CiAKIAlpZiAoZGVidWdnZXIocmVncykpCkBAIC0xNTYsNyArMTU3LDIxIEBACiAJcHJpbnRfbW9kdWxlcygpOwogCXNob3dfcmVncyhyZWdzKTsKIAlidXN0X3NwaW5sb2NrcygwKTsKKworCWlmICghY3Jhc2hfZHVtcF9zdGFydCAmJiBrZXhlY19zaG91bGRfY3Jhc2goY3VycmVudCkpIHsKKwkJY3Jhc2hfZHVtcF9zdGFydCA9IDE7CisJCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOworCQljcmFzaF9rZXhlYyhyZWdzKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KIAlzcGluX3VubG9ja19pcnEoJmRpZV9sb2NrKTsKKwlpZiAoY3Jhc2hfZHVtcF9zdGFydCkKKwkJLyoKKwkJICogT25seSBmb3Igc29mdC1yZXNldDogT3RoZXIgQ1BVcyB3aWxsIGJlIHJlc3BvbmRlZCB0byBhbiBJUEkKKwkJICogc2VudCBieSBmaXJzdCBrZXhlYyBDUFUuCisJCSAqLworCQlmb3IoOzspCisJCQk7CiAKIAlpZiAoaW5faW50ZXJydXB0KCkpCiAJCXBhbmljKCJGYXRhbCBleGNlcHRpb24gaW4gaW50ZXJydXB0Iik7CkBAIC0yMTUsOCArMjMwLDEwIEBACiB2b2lkIHN5c3RlbV9yZXNldF9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJLyogU2VlIGlmIGFueSBtYWNoaW5lIGRlcGVuZGVudCBjYWxscyAqLwotCWlmIChwcGNfbWQuc3lzdGVtX3Jlc2V0X2V4Y2VwdGlvbikKLQkJcHBjX21kLnN5c3RlbV9yZXNldF9leGNlcHRpb24ocmVncyk7CisJaWYgKHBwY19tZC5zeXN0ZW1fcmVzZXRfZXhjZXB0aW9uKSB7CisJCWlmIChwcGNfbWQuc3lzdGVtX3Jlc2V0X2V4Y2VwdGlvbihyZWdzKSkKKwkJCXJldHVybjsKKwl9CiAKIAlkaWUoIlN5c3RlbSBSZXNldCIsIHJlZ3MsIFNJR0FCUlQpOwogCkBAIC04ODYsMTIgKzkwMywxMCBAQAogCWRpZSgiVW5yZWNvdmVyYWJsZSBWTVgvQWx0aXZlYyBVbmF2YWlsYWJsZSBFeGNlcHRpb24iLCByZWdzLCBTSUdBQlJUKTsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX1BQQzY0KSB8fCBkZWZpbmVkKENPTkZJR19FNTAwKQogdm9pZCBwZXJmb3JtYW5jZV9tb25pdG9yX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlwZXJmX2lycShyZWdzKTsKIH0KLSNlbmRpZgogCiAjaWZkZWYgQ09ORklHXzh4eAogdm9pZCBTb2Z0d2FyZUVtdWxhdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdWRiZy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC91ZGJnLmMKaW5kZXggMGQ4NzhlNy4uMzc3NGU4MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC91ZGJnLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC91ZGJnLmMKQEAgLTE1LDExICsxNSwzNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vdWRiZy5oPgogCi12b2lkICgqdWRiZ19wdXRjKSh1bnNpZ25lZCBjaGFyIGMpOwotdW5zaWduZWQgY2hhciAoKnVkYmdfZ2V0Yykodm9pZCk7Cit2b2lkICgqdWRiZ19wdXRjKShjaGFyIGMpOworaW50ICgqdWRiZ19nZXRjKSh2b2lkKTsKIGludCAoKnVkYmdfZ2V0Y19wb2xsKSh2b2lkKTsKIAorLyoKKyAqIEVhcmx5IGRlYnVnZ2luZyBmYWNpbGl0aWVzLiBZb3UgY2FuIGVuYWJsZSBfb25lXyBvZiB0aGVzZSB2aWEgLmNvbmZpZywKKyAqIGlmIHlvdSBkbyBzbyB5b3VyIGtlcm5lbCBfd2lsbCBub3QgYm9vdF8gb24gYW55dGhpbmcgZWxzZS4gQmUgY2FyZWZ1bC4KKyAqLwordm9pZCBfX2luaXQgdWRiZ19lYXJseV9pbml0KHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfUFBDX0VBUkxZX0RFQlVHX0xQQVIpCisJLyogRm9yIExQQVIgbWFjaGluZXMgdGhhdCBoYXZlIGFuIEhWQyBjb25zb2xlIG9uIHZ0ZXJtIDAgKi8KKwl1ZGJnX2luaXRfZGVidWdfbHBhcigpOworI2VsaWYgZGVmaW5lZChDT05GSUdfUFBDX0VBUkxZX0RFQlVHX0c1KQorCS8qIEZvciB1c2Ugb24gQXBwbGUgRzUgbWFjaGluZXMgKi8KKwl1ZGJnX2luaXRfcG1hY19yZWFsbW9kZSgpOworI2VsaWYgZGVmaW5lZChDT05GSUdfUFBDX0VBUkxZX0RFQlVHX1JUQVMpCisJLyogUlRBUyBwYW5lbCBkZWJ1ZyAqLworCXVkYmdfaW5pdF9ydGFzKCk7CisjZWxpZiBkZWZpbmVkKENPTkZJR19QUENfRUFSTFlfREVCVUdfTUFQTEUpCisJLyogTWFwbGUgcmVhbCBtb2RlIGRlYnVnICovCisJdWRiZ19pbml0X21hcGxlX3JlYWxtb2RlKCk7CisjZWxpZiBkZWZpbmVkKENPTkZJR19QUENfRUFSTFlfREVCVUdfSVNFUklFUykKKwkvKiBGb3IgaVNlcmllcyAtIGhpdCBDdHJsLXggQ3RybC14IHRvIHNlZSB0aGUgb3V0cHV0ICovCisJdWRiZ19pbml0X2lzZXJpZXMoKTsKKyNlbmRpZgorfQorCiAvKiB1ZGJnIGxpYnJhcnksIHVzZWQgYnkgeG1vbiBldCBhbCAqLwogdm9pZCB1ZGJnX3B1dHMoY29uc3QgY2hhciAqcykKIHsKQEAgLTU3LDggKzgyLDggQEAKIAogaW50IHVkYmdfcmVhZChjaGFyICpidWYsIGludCBidWZsZW4pCiB7Ci0JY2hhciBjLCAqcCA9IGJ1ZjsKLQlpbnQgaTsKKwljaGFyICpwID0gYnVmOworCWludCBpLCBjOwogCiAJaWYgKCF1ZGJnX2dldGMpCiAJCXJldHVybiAwOwpAQCAtNjYsOCArOTEsMTEgQEAKIAlmb3IgKGkgPSAwOyBpIDwgYnVmbGVuOyArK2kpIHsKIAkJZG8gewogCQkJYyA9IHVkYmdfZ2V0YygpOworCQkJaWYgKGMgPT0gLTEgJiYgaSA9PSAwKQorCQkJCXJldHVybiAtMTsKKwogCQl9IHdoaWxlIChjID09IDB4MTEgfHwgYyA9PSAweDEzKTsKLQkJaWYgKGMgPT0gMCkKKwkJaWYgKGMgPT0gMCB8fCBjID09IC0xKQogCQkJYnJlYWs7CiAJCSpwKysgPSBjOwogCX0KQEAgLTc4LDcgKzEwNiw3IEBACiAjZGVmaW5lIFVEQkdfQlVGU0laRSAyNTYKIHZvaWQgdWRiZ19wcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pCiB7Ci0JdW5zaWduZWQgY2hhciBidWZbVURCR19CVUZTSVpFXTsKKwljaGFyIGJ1ZltVREJHX0JVRlNJWkVdOwogCXZhX2xpc3QgYXJnczsKIAogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CkBAIC04Nyw2ICsxMTUsMTIgQEAKIAl2YV9lbmQoYXJncyk7CiB9CiAKK3ZvaWQgX19pbml0IHVkYmdfcHJvZ3Jlc3MoY2hhciAqcywgdW5zaWduZWQgc2hvcnQgaGV4KQoreworCXVkYmdfcHV0cyhzKTsKKwl1ZGJnX3B1dHMoIlxuIik7Cit9CisKIC8qCiAgKiBFYXJseSBib290IGNvbnNvbGUgYmFzZWQgb24gdWRiZwogICovCkBAIC05OSw3ICsxMzMsNyBAQAogc3RhdGljIHN0cnVjdCBjb25zb2xlIHVkYmdfY29uc29sZSA9IHsKIAkubmFtZQk9ICJ1ZGJnIiwKIAkud3JpdGUJPSB1ZGJnX2NvbnNvbGVfd3JpdGUsCi0JLmZsYWdzCT0gQ09OX1BSSU5UQlVGRkVSLAorCS5mbGFncwk9IENPTl9QUklOVEJVRkZFUiB8IENPTl9FTkFCTEVELAogCS5pbmRleAk9IC0xLAogfTsKIApAQCAtMTA3LDE1ICsxNDEsMTkgQEAKIAogdm9pZCBfX2luaXQgZGlzYWJsZV9lYXJseV9wcmludGsodm9pZCkKIHsKKyNpZiAxCiAJaWYgKCFlYXJseV9jb25zb2xlX2luaXRpYWxpemVkKQogCQlyZXR1cm47CiAJdW5yZWdpc3Rlcl9jb25zb2xlKCZ1ZGJnX2NvbnNvbGUpOwogCWVhcmx5X2NvbnNvbGVfaW5pdGlhbGl6ZWQgPSAwOworI2VuZGlmCiB9CiAKIC8qIGNhbGxlZCBieSBzZXR1cF9zeXN0ZW0gKi8KIHZvaWQgcmVnaXN0ZXJfZWFybHlfdWRiZ19jb25zb2xlKHZvaWQpCiB7CisJaWYgKGVhcmx5X2NvbnNvbGVfaW5pdGlhbGl6ZWQpCisJCXJldHVybjsKIAllYXJseV9jb25zb2xlX2luaXRpYWxpemVkID0gMTsKIAlyZWdpc3Rlcl9jb25zb2xlKCZ1ZGJnX2NvbnNvbGUpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC91ZGJnXzE2NTUwLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3VkYmdfMTY1NTAuYwppbmRleCA5MzEzNTc0Li4yZGE2NWE5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3VkYmdfMTY1NTAuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3VkYmdfMTY1NTAuYwpAQCAtNDMsOSArNDMsMTEgQEAKICNkZWZpbmUgTFNSX1RFTVQgMHg0MCAgLyogWG1pdHRlciBlbXB0eSAqLwogI2RlZmluZSBMU1JfRVJSICAweDgwICAvKiBFcnJvciAqLwogCisjZGVmaW5lIExDUl9ETEFCIDB4ODAKKwogc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBOUzE2NTUwIF9faW9tZW0gKnVkYmdfY29tcG9ydDsKIAotc3RhdGljIHZvaWQgdWRiZ181NTBfcHV0Yyh1bnNpZ25lZCBjaGFyIGMpCitzdGF0aWMgdm9pZCB1ZGJnXzU1MF9wdXRjKGNoYXIgYykKIHsKIAlpZiAodWRiZ19jb21wb3J0KSB7CiAJCXdoaWxlICgoaW5fOCgmdWRiZ19jb21wb3J0LT5sc3IpICYgTFNSX1RIUkUpID09IDApCkBAIC02NywzOSArNjksODAgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHVkYmdfNTUwX2dldGModm9pZCkKK3N0YXRpYyBpbnQgdWRiZ181NTBfZ2V0Yyh2b2lkKQogewogCWlmICh1ZGJnX2NvbXBvcnQpIHsKIAkJd2hpbGUgKChpbl84KCZ1ZGJnX2NvbXBvcnQtPmxzcikgJiBMU1JfRFIpID09IDApCiAJCQkvKiB3YWl0IGZvciBjaGFyICovOwogCQlyZXR1cm4gaW5fOCgmdWRiZ19jb21wb3J0LT5yYnIpOwogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gLTE7CiB9CiAKLXZvaWQgdWRiZ19pbml0X3VhcnQodm9pZCBfX2lvbWVtICpjb21wb3J0LCB1bnNpZ25lZCBpbnQgc3BlZWQpCit2b2lkIHVkYmdfaW5pdF91YXJ0KHZvaWQgX19pb21lbSAqY29tcG9ydCwgdW5zaWduZWQgaW50IHNwZWVkLAorCQkgICAgdW5zaWduZWQgaW50IGNsb2NrKQogewotCXUxNiBkbGwgPSBzcGVlZCA/ICgxMTUyMDAgLyBzcGVlZCkgOiAxMjsKKwl1bnNpZ25lZCBpbnQgZGxsLCBiYXNlX2JhdWRzID0gY2xvY2sgLyAxNjsKKworCWlmIChzcGVlZCA9PSAwKQorCQlzcGVlZCA9IDk2MDA7CisJZGxsID0gYmFzZV9iYXVkcyAvIHNwZWVkOwogCiAJaWYgKGNvbXBvcnQpIHsKIAkJdWRiZ19jb21wb3J0ID0gKHN0cnVjdCBOUzE2NTUwIF9faW9tZW0gKiljb21wb3J0OwogCQlvdXRfOCgmdWRiZ19jb21wb3J0LT5sY3IsIDB4MDApOwogCQlvdXRfOCgmdWRiZ19jb21wb3J0LT5pZXIsIDB4ZmYpOwogCQlvdXRfOCgmdWRiZ19jb21wb3J0LT5pZXIsIDB4MDApOwotCQlvdXRfOCgmdWRiZ19jb21wb3J0LT5sY3IsIDB4ODApOwkvKiBBY2Nlc3MgYmF1ZCByYXRlICovCi0JCW91dF84KCZ1ZGJnX2NvbXBvcnQtPmRsbCwgZGxsICYgMHhmZik7CS8qIDEgPSAxMTUyMDAsICAyID0gNTc2MDAsCi0JCQkJCQkJICAgMyA9IDM4NDAwLCAxMiA9IDk2MDAgYmF1ZCAqLwotCQlvdXRfOCgmdWRiZ19jb21wb3J0LT5kbG0sIGRsbCA+PiA4KTsJLyogZGxsID4+IDggd2hpY2ggc2hvdWxkIGJlIHplcm8KLQkJCQkJCQkgICBmb3IgZmFzdCByYXRlczsgKi8KLQkJb3V0XzgoJnVkYmdfY29tcG9ydC0+bGNyLCAweDAzKTsJLyogOCBkYXRhLCAxIHN0b3AsIG5vIHBhcml0eSAqLwotCQlvdXRfOCgmdWRiZ19jb21wb3J0LT5tY3IsIDB4MDMpOwkvKiBSVFMvRFRSICovCi0JCW91dF84KCZ1ZGJnX2NvbXBvcnQtPmZjciAsMHgwNyk7CS8qIENsZWFyICYgZW5hYmxlIEZJRk9zICovCisJCW91dF84KCZ1ZGJnX2NvbXBvcnQtPmxjciwgTENSX0RMQUIpOworCQlvdXRfOCgmdWRiZ19jb21wb3J0LT5kbGwsIGRsbCAmIDB4ZmYpOworCQlvdXRfOCgmdWRiZ19jb21wb3J0LT5kbG0sIGRsbCA+PiA4KTsKKwkJLyogOCBkYXRhLCAxIHN0b3AsIG5vIHBhcml0eSAqLworCQlvdXRfOCgmdWRiZ19jb21wb3J0LT5sY3IsIDB4MDMpOworCQkvKiBSVFMvRFRSICovCisJCW91dF84KCZ1ZGJnX2NvbXBvcnQtPm1jciwgMHgwMyk7CisJCS8qIENsZWFyICYgZW5hYmxlIEZJRk9zICovCisJCW91dF84KCZ1ZGJnX2NvbXBvcnQtPmZjciAsMHgwNyk7CiAJCXVkYmdfcHV0YyA9IHVkYmdfNTUwX3B1dGM7CiAJCXVkYmdfZ2V0YyA9IHVkYmdfNTUwX2dldGM7CiAJCXVkYmdfZ2V0Y19wb2xsID0gdWRiZ181NTBfZ2V0Y19wb2xsOwogCX0KIH0KIAordW5zaWduZWQgaW50IHVkYmdfcHJvYmVfdWFydF9zcGVlZCh2b2lkIF9faW9tZW0gKmNvbXBvcnQsIHVuc2lnbmVkIGludCBjbG9jaykKK3sKKwl1bnNpZ25lZCBpbnQgZGxsLCBkbG0sIGRpdmlzb3IsIHByZXNjYWxlciwgc3BlZWQ7CisJdTggb2xkX2xjcjsKKwl2b2xhdGlsZSBzdHJ1Y3QgTlMxNjU1MCBfX2lvbWVtICpwb3J0ID0gY29tcG9ydDsKKworCW9sZF9sY3IgPSBpbl84KCZwb3J0LT5sY3IpOworCisJLyogc2VsZWN0IGRpdmlzb3IgbGF0Y2ggcmVnaXN0ZXJzLiAgKi8KKwlvdXRfOCgmcG9ydC0+bGNyLCBMQ1JfRExBQik7CisKKwkvKiBub3csIHJlYWQgdGhlIGRpdmlzb3IgKi8KKwlkbGwgPSBpbl84KCZwb3J0LT5kbGwpOworCWRsbSA9IGluXzgoJnBvcnQtPmRsbSk7CisJZGl2aXNvciA9IGRsbSA8PCA4IHwgZGxsOworCisJLyogY2hlY2sgcHJlc2NhbGluZyAqLworCWlmIChpbl84KCZwb3J0LT5tY3IpICYgMHg4MCkKKwkJcHJlc2NhbGVyID0gNDsKKwllbHNlCisJCXByZXNjYWxlciA9IDE7CisKKwkvKiByZXN0b3JlIHRoZSBMQ1IgKi8KKwlvdXRfOCgmcG9ydC0+bGNyLCBvbGRfbGNyKTsKKworCS8qIGNhbGN1bGF0ZSBzcGVlZCAqLworCXNwZWVkID0gKGNsb2NrIC8gcHJlc2NhbGVyKSAvIChkaXZpc29yICogMTYpOworCisJLyogc2FuaXR5IGNoZWNrICovCisJaWYgKHNwZWVkIDwgMCB8fCBzcGVlZCA+IChjbG9jayAvIDE2KSkKKwkJc3BlZWQgPSA5NjAwOworCisJcmV0dXJuIHNwZWVkOworfQorCiAjaWZkZWYgQ09ORklHX1BQQ19NQVBMRQogdm9pZCB1ZGJnX21hcGxlX3JlYWxfcHV0Yyh1bnNpZ25lZCBjaGFyIGMpCiB7CkBAIC0xMTIsNyArMTU1LDcgQEAKIAl9CiB9CiAKLXZvaWQgdWRiZ19pbml0X21hcGxlX3JlYWxtb2RlKHZvaWQpCit2b2lkIF9faW5pdCB1ZGJnX2luaXRfbWFwbGVfcmVhbG1vZGUodm9pZCkKIHsKIAl1ZGJnX2NvbXBvcnQgPSAodm9sYXRpbGUgc3RydWN0IE5TMTY1NTAgX19pb21lbSAqKTB4ZjQwMDAzZjg7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdWRiZ19zY2MuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdWRiZ19zY2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIwYzUzNS4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3VkYmdfc2NjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIHVkYmcgZm9yIGZvciB6aWxvZyBzY2MgcG9ydHMgYXMgZm91bmQgb24gQXBwbGUgUG93ZXJNYWNzCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgUFBDIDY0IFRlYW0sIElCTSBDb3JwCi0gKgotICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vdWRiZy5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9wbWFjX2ZlYXR1cmUuaD4KLQotZXh0ZXJuIHU4IHJlYWxfcmVhZGIodm9sYXRpbGUgdTggX19pb21lbSAgKmFkZHIpOwotZXh0ZXJuIHZvaWQgcmVhbF93cml0ZWIodTggZGF0YSwgdm9sYXRpbGUgdTggX19pb21lbSAqYWRkcik7Ci0KLSNkZWZpbmUJU0NDX1RYUkRZCTQKLSNkZWZpbmUgU0NDX1JYUkRZCTEKLQotc3RhdGljIHZvbGF0aWxlIHU4IF9faW9tZW0gKnNjY2M7Ci1zdGF0aWMgdm9sYXRpbGUgdTggX19pb21lbSAqc2NjZDsKLQotc3RhdGljIHZvaWQgdWRiZ19zY2NfcHV0Yyh1bnNpZ25lZCBjaGFyIGMpCi17Ci0JaWYgKHNjY2MpIHsKLQkJd2hpbGUgKChpbl84KHNjY2MpICYgU0NDX1RYUkRZKSA9PSAwKQotCQkJOwotCQlvdXRfOChzY2NkLCAgYyk7Ci0JCWlmIChjID09ICdcbicpCi0JCQl1ZGJnX3NjY19wdXRjKCdccicpOwotCX0KLX0KLQotc3RhdGljIGludCB1ZGJnX3NjY19nZXRjX3BvbGwodm9pZCkKLXsKLQlpZiAoc2NjYykgewotCQlpZiAoKGluXzgoc2NjYykgJiBTQ0NfUlhSRFkpICE9IDApCi0JCQlyZXR1cm4gaW5fOChzY2NkKTsKLQkJZWxzZQotCQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHVkYmdfc2NjX2dldGModm9pZCkKLXsKLQlpZiAoc2NjYykgewotCQl3aGlsZSAoKGluXzgoc2NjYykgJiBTQ0NfUlhSRFkpID09IDApCi0JCQk7Ci0JCXJldHVybiBpbl84KHNjY2QpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgc2NjX2luaXR0YWJbXSA9IHsKLSAgICAxMywgMCwJCS8qIHNldCBiYXVkIHJhdGUgZGl2aXNvciAqLwotICAgIDEyLCAwLAotICAgIDE0LCAxLAkJLyogYmF1ZCByYXRlIGdlbiBlbmFibGUsIHNyYz1ydHhjICovCi0gICAgMTEsIDB4NTAsCQkvKiBjbG9ja3MgPSBiciBnZW4gKi8KLSAgICA1LCAgMHhlYSwJCS8qIHR4IDggYml0cywgYXNzZXJ0IERUUiAmIFJUUyAqLwotICAgIDQsICAweDQ2LAkJLyogeDE2IGNsb2NrLCAxIHN0b3AgKi8KLSAgICAzLCAgMHhjMSwJCS8qIHJ4IGVuYWJsZSwgOCBiaXRzICovCi19OwotCi12b2lkIHVkYmdfaW5pdF9zY2Moc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQl1MzIgKnJlZzsKLQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0JaW50IGksIHg7Ci0KLQlpZiAobnAgPT0gTlVMTCkKLQkJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiZXNjYyIpOwotCWlmIChucCA9PSBOVUxMIHx8IG5wLT5wYXJlbnQgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JdWRiZ19wcmludGYoImZvdW5kIFNDQy4uLlxuIik7Ci0JLyogR2V0IGFkZHJlc3Mgd2l0aGluIG1hYy1pbyBBU0lDICovCi0JcmVnID0gKHUzMiAqKWdldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOwotCWlmIChyZWcgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWFkZHIgPSByZWdbMF07Ci0JdWRiZ19wcmludGYoImxvY2FsIGFkZHI6ICVseFxuIiwgYWRkcik7Ci0JLyogR2V0IGFkZHJlc3Mgb2YgbWFjLWlvIFBDSSBpdHNlbGYgKi8KLQlyZWcgPSAodTMyICopZ2V0X3Byb3BlcnR5KG5wLT5wYXJlbnQsICJhc3NpZ25lZC1hZGRyZXNzZXMiLCBOVUxMKTsKLQlpZiAocmVnID09IE5VTEwpCi0JCXJldHVybjsKLQlhZGRyICs9IHJlZ1syXTsKLQl1ZGJnX3ByaW50ZigiZmluYWwgYWRkcjogJWx4XG4iLCBhZGRyKTsKLQotCS8qIFNldHVwIGZvciA1NzYwMCA4TjEgKi8KLQlhZGRyICs9IDB4MjA7Ci0Jc2NjYyA9ICh2b2xhdGlsZSB1OCAqIF9faW9tZW0pIGlvcmVtYXAoYWRkciAmIFBBR0VfTUFTSywgUEFHRV9TSVpFKSA7Ci0Jc2NjYyArPSBhZGRyICYgflBBR0VfTUFTSzsKLQlzY2NkID0gc2NjYyArIDB4MTA7Ci0KLQl1ZGJnX3ByaW50ZigiaW9yZW1hcCByZXN1bHQgc2NjYzogJXBcbiIsIHNjY2MpOwotCW1iKCk7Ci0KLQlmb3IgKGkgPSAyMDAwMDsgaSAhPSAwOyAtLWkpCi0JCXggPSBpbl84KHNjY2MpOwotCW91dF84KHNjY2MsIDB4MDkpOwkJLyogcmVzZXQgQSBvciBCIHNpZGUgKi8KLQlvdXRfOChzY2NjLCAweGMwKTsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNjY19pbml0dGFiKTsgKytpKQotCQlvdXRfOChzY2NjLCBzY2NfaW5pdHRhYltpXSk7Ci0KLQl1ZGJnX3B1dGMgPSB1ZGJnX3NjY19wdXRjOwotCXVkYmdfZ2V0YyA9IHVkYmdfc2NjX2dldGM7Ci0JdWRiZ19nZXRjX3BvbGwgPSB1ZGJnX3NjY19nZXRjX3BvbGw7Ci0KLQl1ZGJnX3B1dHMoIkhlbGxvIFdvcmxkICFcbiIpOwotfQotCi1zdGF0aWMgdm9pZCB1ZGJnX3JlYWxfc2NjX3B1dGModW5zaWduZWQgY2hhciBjKQotewotCXdoaWxlICgocmVhbF9yZWFkYihzY2NjKSAmIFNDQ19UWFJEWSkgPT0gMCkKLQkJOwotCXJlYWxfd3JpdGViKGMsIHNjY2QpOwotCWlmIChjID09ICdcbicpCi0JCXVkYmdfcmVhbF9zY2NfcHV0YygnXHInKTsKLX0KLQotdm9pZCB1ZGJnX2luaXRfcG1hY19yZWFsbW9kZSh2b2lkKQotewotCXNjY2MgPSAodm9sYXRpbGUgdTggX19pb21lbSAqKTB4ODAwMTMwMjB1bDsKLQlzY2NkID0gKHZvbGF0aWxlIHU4IF9faW9tZW0gKikweDgwMDEzMDMwdWw7Ci0KLQl1ZGJnX3B1dGMgPSB1ZGJnX3JlYWxfc2NjX3B1dGM7Ci0JdWRiZ19nZXRjID0gTlVMTDsKLQl1ZGJnX2dldGNfcG9sbCA9IE5VTEw7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28zMi8uZ2l0aWdub3JlIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvMzIvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDVmYmE5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvMzIvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACit2ZHNvMzIubGRzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc282NC8uZ2l0aWdub3JlIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvNjQvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmQxOGNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvNjQvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACit2ZHNvNjQubGRzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zpby5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYwppbmRleCAxM2M0MTQ5Li4xM2M2NTViIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zpby5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMKQEAgLTc2LDcgKzc2LDcgQEAKIAlzdHJ1Y3QgdmlvX2RldiAqdmlvZGV2ID0gdG9fdmlvX2RldihkZXYpOwogCXN0cnVjdCB2aW9fZHJpdmVyICp2aW9kcnYgPSB0b192aW9fZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAotCWlmICh2aW9kcnYtPnNodXRkb3duKQorCWlmIChkZXYtPmRyaXZlciAmJiB2aW9kcnYtPnNodXRkb3duKQogCQl2aW9kcnYtPnNodXRkb3duKHZpb2Rldik7CiB9CiAKQEAgLTkxLDkgKzkxLDYgQEAKIAogCS8qIGZpbGwgaW4gJ3N0cnVjdCBkcml2ZXInIGZpZWxkcyAqLwogCXZpb2Rydi0+ZHJpdmVyLmJ1cyA9ICZ2aW9fYnVzX3R5cGU7Ci0JdmlvZHJ2LT5kcml2ZXIucHJvYmUgPSB2aW9fYnVzX3Byb2JlOwotCXZpb2Rydi0+ZHJpdmVyLnJlbW92ZSA9IHZpb19idXNfcmVtb3ZlOwotCXZpb2Rydi0+ZHJpdmVyLnNodXRkb3duID0gdmlvX2J1c19zaHV0ZG93bjsKIAogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJnZpb2Rydi0+ZHJpdmVyKTsKIH0KQEAgLTI5NSw0ICsyOTIsNyBAQAogCS5uYW1lID0gInZpbyIsCiAJLnVldmVudCA9IHZpb19ob3RwbHVnLAogCS5tYXRjaCA9IHZpb19idXNfbWF0Y2gsCisJLnByb2JlID0gdmlvX2J1c19wcm9iZSwKKwkucmVtb3ZlID0gdmlvX2J1c19yZW1vdmUsCisJLnNodXRkb3duID0gdmlvX2J1c19zaHV0ZG93biwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbGliL2xvY2tzLmMgYi9hcmNoL3Bvd2VycGMvbGliL2xvY2tzLmMKaW5kZXggMzViZDAzYy4uODM2MmZhMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2xpYi9sb2Nrcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9saWIvbG9ja3MuYwpAQCAtMjgsMTUgKzI4LDEzIEBACiB2b2lkIF9fc3Bpbl95aWVsZChyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKIAl1bnNpZ25lZCBpbnQgbG9ja192YWx1ZSwgaG9sZGVyX2NwdSwgeWllbGRfY291bnQ7Ci0Jc3RydWN0IHBhY2Ffc3RydWN0ICpob2xkZXJfcGFjYTsKIAogCWxvY2tfdmFsdWUgPSBsb2NrLT5zbG9jazsKIAlpZiAobG9ja192YWx1ZSA9PSAwKQogCQlyZXR1cm47CiAJaG9sZGVyX2NwdSA9IGxvY2tfdmFsdWUgJiAweGZmZmY7CiAJQlVHX09OKGhvbGRlcl9jcHUgPj0gTlJfQ1BVUyk7Ci0JaG9sZGVyX3BhY2EgPSAmcGFjYVtob2xkZXJfY3B1XTsKLQl5aWVsZF9jb3VudCA9IGhvbGRlcl9wYWNhLT5scHBhY2EueWllbGRfY291bnQ7CisJeWllbGRfY291bnQgPSBscHBhY2FbaG9sZGVyX2NwdV0ueWllbGRfY291bnQ7CiAJaWYgKCh5aWVsZF9jb3VudCAmIDEpID09IDApCiAJCXJldHVybjsJCS8qIHZpcnR1YWwgY3B1IGlzIGN1cnJlbnRseSBydW5uaW5nICovCiAJcm1iKCk7CkBAIC02MCwxNSArNTgsMTMgQEAKIHsKIAlpbnQgbG9ja192YWx1ZTsKIAl1bnNpZ25lZCBpbnQgaG9sZGVyX2NwdSwgeWllbGRfY291bnQ7Ci0Jc3RydWN0IHBhY2Ffc3RydWN0ICpob2xkZXJfcGFjYTsKIAogCWxvY2tfdmFsdWUgPSBydy0+bG9jazsKIAlpZiAobG9ja192YWx1ZSA+PSAwKQogCQlyZXR1cm47CQkvKiBubyB3cml0ZSBsb2NrIGF0IHByZXNlbnQgKi8KIAlob2xkZXJfY3B1ID0gbG9ja192YWx1ZSAmIDB4ZmZmZjsKIAlCVUdfT04oaG9sZGVyX2NwdSA+PSBOUl9DUFVTKTsKLQlob2xkZXJfcGFjYSA9ICZwYWNhW2hvbGRlcl9jcHVdOwotCXlpZWxkX2NvdW50ID0gaG9sZGVyX3BhY2EtPmxwcGFjYS55aWVsZF9jb3VudDsKKwl5aWVsZF9jb3VudCA9IGxwcGFjYVtob2xkZXJfY3B1XS55aWVsZF9jb3VudDsKIAlpZiAoKHlpZWxkX2NvdW50ICYgMSkgPT0gMCkKIAkJcmV0dXJuOwkJLyogdmlydHVhbCBjcHUgaXMgY3VycmVudGx5IHJ1bm5pbmcgKi8KIAlybWIoKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jIGIvYXJjaC9wb3dlcnBjL21tL2ZhdWx0LmMKaW5kZXggOTNkNGZiZi4uYTQ4MTVkMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2ZhdWx0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2ZhdWx0LmMKQEAgLTgxLDcgKzgxLDggQEAKIH0KIAogI2lmICEoZGVmaW5lZChDT05GSUdfNHh4KSB8fCBkZWZpbmVkKENPTkZJR19CT09LRSkpCi1zdGF0aWMgdm9pZCBkb19kYWJyKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGUpCitzdGF0aWMgdm9pZCBkb19kYWJyKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisJCSAgICB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGUpCiB7CiAJc2lnaW5mb190IGluZm87CiAKQEAgLTk5LDcgKzEwMCw3IEBACiAJaW5mby5zaV9zaWdubyA9IFNJR1RSQVA7CiAJaW5mby5zaV9lcnJubyA9IDA7CiAJaW5mby5zaV9jb2RlID0gVFJBUF9IV0JLUFQ7Ci0JaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopcmVncy0+bmlwOworCWluZm8uc2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKWFkZHJlc3M7CiAJZm9yY2Vfc2lnX2luZm8oU0lHVFJBUCwgJmluZm8sIGN1cnJlbnQpOwogfQogI2VuZGlmIC8qICEoQ09ORklHXzR4eCB8fCBDT05GSUdfQk9PS0UpKi8KQEAgLTE1OSw3ICsxNjAsNyBAQAogI2lmICEoZGVmaW5lZChDT05GSUdfNHh4KSB8fCBkZWZpbmVkKENPTkZJR19CT09LRSkpCiAgIAlpZiAoZXJyb3JfY29kZSAmIERTSVNSX0RBQlJNQVRDSCkgewogCQkvKiBEQUJSIG1hdGNoICovCi0JCWRvX2RhYnIocmVncywgZXJyb3JfY29kZSk7CisJCWRvX2RhYnIocmVncywgYWRkcmVzcywgZXJyb3JfY29kZSk7CiAJCXJldHVybiAwOwogCX0KICNlbmRpZiAvKiAhKENPTkZJR180eHggfHwgQ09ORklHX0JPT0tFKSovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYwppbmRleCBhNjA2NTA0Li4xNDkzNTFhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX3V0aWxzXzY0LmMKQEAgLTM2OCw3ICszNjgsNyBAQAogCXVuc2lnbmVkIGxvbmcgbWVtX3NpemUsIHJuZF9tZW1fc2l6ZSwgcHRlZ19jb3VudDsKIAogCS8qIElmIGhhc2ggc2l6ZSBpc24ndCBhbHJlYWR5IHByb3ZpZGVkIGJ5IHRoZSBwbGF0Zm9ybSwgd2UgdHJ5IHRvCi0JICogcmV0cmVpdmUgaXQgZnJvbSB0aGUgZGV2aWNlLXRyZWUuIElmIGl0J3Mgbm90IHRoZXJlIG5laXRoZXIsIHdlCisJICogcmV0cmlldmUgaXQgZnJvbSB0aGUgZGV2aWNlLXRyZWUuIElmIGl0J3Mgbm90IHRoZXJlIG5laXRoZXIsIHdlCiAJICogY2FsY3VsYXRlIGl0IG5vdyBiYXNlZCBvbiB0aGUgdG90YWwgUkFNIHNpemUKIAkgKi8KIAlpZiAocHBjNjRfcGZ0X3NpemUgPT0gMCkKQEAgLTQ1Niw3ICs0NTYsNyBAQAogCiAJLyogY3JlYXRlIGJvbHRlZCB0aGUgbGluZWFyIG1hcHBpbmcgaW4gdGhlIGhhc2ggdGFibGUgKi8KIAlmb3IgKGk9MDsgaSA8IGxtYi5tZW1vcnkuY250OyBpKyspIHsKLQkJYmFzZSA9IGxtYi5tZW1vcnkucmVnaW9uW2ldLmJhc2UgKyBLRVJORUxCQVNFOworCQliYXNlID0gKHVuc2lnbmVkIGxvbmcpX192YShsbWIubWVtb3J5LnJlZ2lvbltpXS5iYXNlKTsKIAkJc2l6ZSA9IGxtYi5tZW1vcnkucmVnaW9uW2ldLnNpemU7CiAKIAkJREJHKCJjcmVhdGluZyBtYXBwaW5nIGZvciByZWdpb246ICVseCA6ICVseFxuIiwgYmFzZSwgc2l6ZSk7CkBAIC00OTgsOCArNDk4LDggQEAKIAkgKiBmb3IgZWl0aGVyIDRLIG9yIDE2TUIgcGFnZXMuCiAJICovCiAJaWYgKHRjZV9hbGxvY19zdGFydCkgewotCQl0Y2VfYWxsb2Nfc3RhcnQgKz0gS0VSTkVMQkFTRTsKLQkJdGNlX2FsbG9jX2VuZCArPSBLRVJORUxCQVNFOworCQl0Y2VfYWxsb2Nfc3RhcnQgPSAodW5zaWduZWQgbG9uZylfX3ZhKHRjZV9hbGxvY19zdGFydCk7CisJCXRjZV9hbGxvY19lbmQgPSAodW5zaWduZWQgbG9uZylfX3ZhKHRjZV9hbGxvY19lbmQpOwogCiAJCWlmIChiYXNlICsgc2l6ZSA+PSB0Y2VfYWxsb2Nfc3RhcnQpCiAJCQl0Y2VfYWxsb2Nfc3RhcnQgPSBiYXNlICsgc2l6ZSArIDE7CkBAIC02NDQsNiArNjQ0LDcgQEAKIAlEQkdfTE9XKCIgLT4gcmM9JWRcbiIsIHJjKTsKIAlyZXR1cm4gcmM7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChoYXNoX3BhZ2UpOwogCiB2b2lkIGhhc2hfcHJlbG9hZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBlYSwKIAkJICB1bnNpZ25lZCBsb25nIGFjY2VzcywgdW5zaWduZWQgbG9uZyB0cmFwKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2h1Z2V0bGJwYWdlLmMgYi9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYwppbmRleCA1NDEzMWI4Li5iNTFiYjI4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYwpAQCAtNTQ5LDYgKzU0OSwxNyBAQAogCXJldHVybiBhZGRyOwogfQogCitzdGF0aWMgaW50IGh0bGJfY2hlY2tfaGludGVkX2FyZWEodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKworCXZtYSA9IGZpbmRfdm1hKGN1cnJlbnQtPm1tLCBhZGRyKTsKKwlpZiAoIXZtYSB8fCAoKGFkZHIgKyBsZW4pIDw9IHZtYS0+dm1fc3RhcnQpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAtRU5PTUVNOworfQorCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBodGxiX2dldF9sb3dfYXJlYSh1bnNpZ25lZCBsb25nIGxlbiwgdTE2IHNlZ21hc2spCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gMDsKQEAgLTYxOCwxNSArNjI5LDI4IEBACiAJaWYgKCFjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl8xNk1fUEFHRSkpCiAJCXJldHVybiAtRUlOVkFMOwogCisJLyogUGFyYW5vaWEsIGNhbGxlciBzaG91bGQgaGF2ZSBkZWFsdCB3aXRoIHRoaXMgKi8KKwlCVUdfT04oKGFkZHIgKyBsZW4pICA8IGFkZHIpOworCiAJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKSkgeworCQkvKiBQYXJhbm9pYSwgY2FsbGVyIHNob3VsZCBoYXZlIGRlYWx0IHdpdGggdGhpcyAqLworCQlCVUdfT04oKGFkZHIgKyBsZW4pID4gMHgxMDAwMDAwMDBVTCk7CisKIAkJY3VyYXJlYXMgPSBjdXJyZW50LT5tbS0+Y29udGV4dC5sb3dfaHRsYl9hcmVhczsKIAotCQkvKiBGaXJzdCBzZWUgaWYgd2UgY2FuIGRvIHRoZSBtYXBwaW5nIGluIHRoZSBleGlzdGluZwotCQkgKiBsb3cgYXJlYXMgKi8KKwkJLyogRmlyc3Qgc2VlIGlmIHdlIGNhbiB1c2UgdGhlIGhpbnQgYWRkcmVzcyAqLworCQlpZiAoYWRkciAmJiAoaHRsYl9jaGVja19oaW50ZWRfYXJlYShhZGRyLCBsZW4pID09IDApKSB7CisJCQlhcmVhbWFzayA9IExPV19FU0lEX01BU0soYWRkciwgbGVuKTsKKwkJCWlmIChvcGVuX2xvd19ocGFnZV9hcmVhcyhjdXJyZW50LT5tbSwgYXJlYW1hc2spID09IDApCisJCQkJcmV0dXJuIGFkZHI7CisJCX0KKworCQkvKiBOZXh0IHNlZSBpZiB3ZSBjYW4gbWFwIGluIHRoZSBleGlzdGluZyBsb3cgYXJlYXMgKi8KIAkJYWRkciA9IGh0bGJfZ2V0X2xvd19hcmVhKGxlbiwgY3VyYXJlYXMpOwogCQlpZiAoYWRkciAhPSAtRU5PTUVNKQogCQkJcmV0dXJuIGFkZHI7CiAKKwkJLyogRmluYWxseSBnbyBsb29raW5nIGZvciBhcmVhcyB0byBvcGVuICovCiAJCWxhc3RzaGlmdCA9IDA7CiAJCWZvciAoYXJlYW1hc2sgPSBMT1dfRVNJRF9NQVNLKDB4MTAwMDAwMDAwVUwtbGVuLCBsZW4pOwogCQkgICAgICEgbGFzdHNoaWZ0OyBhcmVhbWFzayA+Pj0xKSB7CkBAIC02NDEsMTIgKzY2NSwyMiBAQAogCX0gZWxzZSB7CiAJCWN1cmFyZWFzID0gY3VycmVudC0+bW0tPmNvbnRleHQuaGlnaF9odGxiX2FyZWFzOwogCi0JCS8qIEZpcnN0IHNlZSBpZiB3ZSBjYW4gZG8gdGhlIG1hcHBpbmcgaW4gdGhlIGV4aXN0aW5nCi0JCSAqIGhpZ2ggYXJlYXMgKi8KKwkJLyogRmlyc3Qgc2VlIGlmIHdlIGNhbiB1c2UgdGhlIGhpbnQgYWRkcmVzcyAqLworCQkvKiBXZSBkaXNjb3VyYWdlIDY0LWJpdCBwcm9jZXNzZXMgZnJvbSBkb2luZyBodWdlcGFnZQorCQkgKiBtYXBwaW5ncyBiZWxvdyA0R0IgKG11c3QgdXNlIE1BUF9GSVhFRCkgKi8KKwkJaWYgKChhZGRyID49IDB4MTAwMDAwMDAwVUwpCisJCSAgICAmJiAoaHRsYl9jaGVja19oaW50ZWRfYXJlYShhZGRyLCBsZW4pID09IDApKSB7CisJCQlhcmVhbWFzayA9IEhUTEJfQVJFQV9NQVNLKGFkZHIsIGxlbik7CisJCQlpZiAob3Blbl9oaWdoX2hwYWdlX2FyZWFzKGN1cnJlbnQtPm1tLCBhcmVhbWFzaykgPT0gMCkKKwkJCQlyZXR1cm4gYWRkcjsKKwkJfQorCisJCS8qIE5leHQgc2VlIGlmIHdlIGNhbiBtYXAgaW4gdGhlIGV4aXN0aW5nIGhpZ2ggYXJlYXMgKi8KIAkJYWRkciA9IGh0bGJfZ2V0X2hpZ2hfYXJlYShsZW4sIGN1cmFyZWFzKTsKIAkJaWYgKGFkZHIgIT0gLUVOT01FTSkKIAkJCXJldHVybiBhZGRyOwogCisJCS8qIEZpbmFsbHkgZ28gbG9va2luZyBmb3IgYXJlYXMgdG8gb3BlbiAqLwogCQlsYXN0c2hpZnQgPSAwOwogCQlmb3IgKGFyZWFtYXNrID0gSFRMQl9BUkVBX01BU0soVEFTS19TSVpFX1VTRVI2NC1sZW4sIGxlbik7CiAJCSAgICAgISBsYXN0c2hpZnQ7IGFyZWFtYXNrID4+PTEpIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9pbWFsbG9jLmMgYi9hcmNoL3Bvd2VycGMvbW0vaW1hbGxvYy5jCmluZGV4IGY5NTg3YmMuLjhiMGMxMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9pbWFsbG9jLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2ltYWxsb2MuYwpAQCAtMTA3LDYgKzEwNyw3IEBACiAJCWlmICh2X2FkZHIgPCAodW5zaWduZWQgbG9uZykgdG1wLT5hZGRyICsgdG1wLT5zaXplKQogCQkJYnJlYWs7CiAKKwkqdm0gPSBOVUxMOwogCWlmICh0bXApIHsKIAkJaWYgKGltX3JlZ2lvbl9vdmVybGFwcyh2X2FkZHIsIHNpemUsIHRtcCkpCiAJCQlyZXR1cm4gSU1fUkVHSU9OX09WRVJMQVA7CkBAIC0xMjcsNyArMTI4LDYgQEAKIAkJfQogCX0KIAotCSp2bSA9IE5VTEw7CiAJcmV0dXJuIElNX1JFR0lPTl9VTlVTRUQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9pbml0XzMyLmMgYi9hcmNoL3Bvd2VycGMvbW0vaW5pdF8zMi5jCmluZGV4IDdkNGI4YjUuLjdkMGQ3NWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9pbml0XzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2luaXRfMzIuYwpAQCAtMTg4LDYgKzE4OCwxMSBAQAogCiAJaWYgKHBwY19tZC5wcm9ncmVzcykKIAkJcHBjX21kLnByb2dyZXNzKCJNTVU6ZXhpdCIsIDB4MjExKTsKKworCS8qIEZyb20gbm93IG9uLCBidGV4dCBpcyBubyBsb25nZXIgQkFUIG1hcHBlZCBpZiBpdCB3YXMgYXQgYWxsICovCisjaWZkZWYgQ09ORklHX0JPT1RYX1RFWFQKKwlidGV4dF91bm1hcCgpOworI2VuZGlmCiB9CiAKIC8qIFRoaXMgaXMgb25seSBjYWxsZWQgdW50aWwgbWVtX2luaXQgaXMgZG9uZS4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9tZW0uYyBiL2FyY2gvcG93ZXJwYy9tbS9tZW0uYwppbmRleCBlZDZlZDJlLi4xNWFhYzBkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL21lbS5jCkBAIC0xMTQsMTkgKzExNCwxOCBAQAogCW51bV9waHlzcGFnZXMrKzsKIH0KIAotLyoKLSAqIFRoaXMgd29ya3Mgb25seSBmb3IgdGhlIG5vbi1OVU1BIGNhc2UuICBMYXRlciwgd2UnbGwgbmVlZCBhIGxvb2t1cAotICogdG8gY29udmVydCBmcm9tIHJlYWwgcGh5c2ljYWwgYWRkcmVzc2VzIHRvIG5pZCwgdGhhdCBkb2Vzbid0IHVzZQotICogcGZuX3RvX25pZCgpLgotICovCiBpbnQgX19kZXZpbml0IGFkZF9tZW1vcnkodTY0IHN0YXJ0LCB1NjQgc2l6ZSkKIHsKLQlzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0YSA9IE5PREVfREFUQSgwKTsKKwlzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0YTsKIAlzdHJ1Y3Qgem9uZSAqem9uZTsKKwlpbnQgbmlkOwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuID0gc3RhcnQgPj4gUEFHRV9TSElGVDsKIAl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gc2l6ZSA+PiBQQUdFX1NISUZUOwogCi0Jc3RhcnQgKz0gS0VSTkVMQkFTRTsKKwluaWQgPSBob3RfYWRkX3Njbl90b19uaWQoc3RhcnQpOworCXBnZGF0YSA9IE5PREVfREFUQShuaWQpOworCisJc3RhcnQgPSBfX3ZhKHN0YXJ0KTsKIAljcmVhdGVfc2VjdGlvbl9tYXBwaW5nKHN0YXJ0LCBzdGFydCArIHNpemUpOwogCiAJLyogdGhpcyBzaG91bGQgd29yayBmb3IgbW9zdCBub24taGlnaG1lbSBwbGF0Zm9ybXMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMgYi9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jCmluZGV4IGJhN2EzMDUuLjI4NjNhOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL251bWEuYwpAQCAtMzcsNiArMzcsNyBAQAogCiBzdGF0aWMgYm9vdG1lbV9kYXRhX3QgX19pbml0ZGF0YSBwbGF0X25vZGVfYmRhdGFbTUFYX05VTU5PREVTXTsKIHN0YXRpYyBpbnQgbWluX2NvbW1vbl9kZXB0aDsKK3N0YXRpYyBpbnQgbl9tZW1fYWRkcl9jZWxscywgbl9tZW1fc2l6ZV9jZWxsczsKIAogLyoKICAqIFdlIG5lZWQgc29tZXdoZXJlIHRvIHN0b3JlIHN0YXJ0L2VuZC9ub2RlIGZvciBlYWNoIHJlZ2lvbiB1bnRpbCB3ZSBoYXZlCkBAIC0yNTQsMzIgKzI1NSwyMCBAQAogCXJldHVybiBkZXB0aDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgZ2V0X21lbV9hZGRyX2NlbGxzKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgZ2V0X25fbWVtX2NlbGxzKGludCAqbl9hZGRyX2NlbGxzLCBpbnQgKm5fc2l6ZV9jZWxscykKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm1lbW9yeSA9IE5VTEw7Ci0JaW50IHJjOwogCiAJbWVtb3J5ID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobWVtb3J5LCAibWVtb3J5Iik7CiAJaWYgKCFtZW1vcnkpCi0JCXJldHVybiAwOyAvKiBpdCB3b24ndCBtYXR0ZXIgKi8KKwkJcGFuaWMoIm51bWEuYzogTm8gbWVtb3J5IG5vZGVzIGZvdW5kISIpOwogCi0JcmMgPSBwcm9tX25fYWRkcl9jZWxscyhtZW1vcnkpOwotCXJldHVybiByYzsKKwkqbl9hZGRyX2NlbGxzID0gcHJvbV9uX2FkZHJfY2VsbHMobWVtb3J5KTsKKwkqbl9zaXplX2NlbGxzID0gcHJvbV9uX3NpemVfY2VsbHMobWVtb3J5KTsKKwlvZl9ub2RlX3B1dChtZW1vcnkpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBnZXRfbWVtX3NpemVfY2VsbHModm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm1lbW9yeSA9IE5VTEw7Ci0JaW50IHJjOwotCi0JbWVtb3J5ID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobWVtb3J5LCAibWVtb3J5Iik7Ci0JaWYgKCFtZW1vcnkpCi0JCXJldHVybiAwOyAvKiBpdCB3b24ndCBtYXR0ZXIgKi8KLQlyYyA9IHByb21fbl9zaXplX2NlbGxzKG1lbW9yeSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgcmVhZF9uX2NlbGxzKGludCBuLCB1bnNpZ25lZCBpbnQgKipidWYpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2RldmluaXQgcmVhZF9uX2NlbGxzKGludCBuLCB1bnNpZ25lZCBpbnQgKipidWYpCiB7CiAJdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOwogCkBAIC0zODYsNyArMzc1LDYgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdSA9IE5VTEw7CiAJc3RydWN0IGRldmljZV9ub2RlICptZW1vcnkgPSBOVUxMOwotCWludCBhZGRyX2NlbGxzLCBzaXplX2NlbGxzOwogCWludCBtYXhfZG9tYWluOwogCXVuc2lnbmVkIGxvbmcgaTsKIApAQCAtNDI1LDggKzQxMyw3IEBACiAJCX0KIAl9CiAKLQlhZGRyX2NlbGxzID0gZ2V0X21lbV9hZGRyX2NlbGxzKCk7Ci0Jc2l6ZV9jZWxscyA9IGdldF9tZW1fc2l6ZV9jZWxscygpOworCWdldF9uX21lbV9jZWxscygmbl9tZW1fYWRkcl9jZWxscywgJm5fbWVtX3NpemVfY2VsbHMpOwogCW1lbW9yeSA9IE5VTEw7CiAJd2hpbGUgKChtZW1vcnkgPSBvZl9maW5kX25vZGVfYnlfdHlwZShtZW1vcnksICJtZW1vcnkiKSkgIT0gTlVMTCkgewogCQl1bnNpZ25lZCBsb25nIHN0YXJ0OwpAQCAtNDM2LDE1ICs0MjMsMjEgQEAKIAkJdW5zaWduZWQgaW50ICptZW1jZWxsX2J1ZjsKIAkJdW5zaWduZWQgaW50IGxlbjsKIAotCQltZW1jZWxsX2J1ZiA9ICh1bnNpZ25lZCBpbnQgKilnZXRfcHJvcGVydHkobWVtb3J5LCAicmVnIiwgJmxlbik7CisJCW1lbWNlbGxfYnVmID0gKHVuc2lnbmVkIGludCAqKWdldF9wcm9wZXJ0eShtZW1vcnksCisJCQkibGludXgsdXNhYmxlLW1lbW9yeSIsICZsZW4pOworCQlpZiAoIW1lbWNlbGxfYnVmIHx8IGxlbiA8PSAwKQorCQkJbWVtY2VsbF9idWYgPQorCQkJCSh1bnNpZ25lZCBpbnQgKilnZXRfcHJvcGVydHkobWVtb3J5LCAicmVnIiwKKwkJCQkJJmxlbik7CiAJCWlmICghbWVtY2VsbF9idWYgfHwgbGVuIDw9IDApCiAJCQljb250aW51ZTsKIAotCQlyYW5nZXMgPSBtZW1vcnktPm5fYWRkcnM7CisJCS8qIHJhbmdlcyBpbiBjZWxsICovCisJCXJhbmdlcyA9IChsZW4gPj4gMikgLyAobl9tZW1fYWRkcl9jZWxscyArIG5fbWVtX3NpemVfY2VsbHMpOwogbmV3X3JhbmdlOgogCQkvKiB0aGVzZSBhcmUgb3JkZXItc2Vuc2l0aXZlLCBhbmQgbW9kaWZ5IHRoZSBidWZmZXIgcG9pbnRlciAqLwotCQlzdGFydCA9IHJlYWRfbl9jZWxscyhhZGRyX2NlbGxzLCAmbWVtY2VsbF9idWYpOwotCQlzaXplID0gcmVhZF9uX2NlbGxzKHNpemVfY2VsbHMsICZtZW1jZWxsX2J1Zik7CisJCXN0YXJ0ID0gcmVhZF9uX2NlbGxzKG5fbWVtX2FkZHJfY2VsbHMsICZtZW1jZWxsX2J1Zik7CisJCXNpemUgPSByZWFkX25fY2VsbHMobl9tZW1fc2l6ZV9jZWxscywgJm1lbWNlbGxfYnVmKTsKIAogCQludW1hX2RvbWFpbiA9IG9mX25vZGVfbnVtYV9kb21haW4obWVtb3J5KTsKIApAQCAtNDk3LDcgKzQ5MCw0MSBAQAogCW5vZGVfc2V0X29ubGluZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGR1bXBfbnVtYV90b3BvbG9neSh2b2lkKQordm9pZCBfX2luaXQgZHVtcF9udW1hX2NwdV90b3BvbG9neSh2b2lkKQoreworCXVuc2lnbmVkIGludCBub2RlOworCXVuc2lnbmVkIGludCBjcHUsIGNvdW50OworCisJaWYgKG1pbl9jb21tb25fZGVwdGggPT0gLTEgfHwgIW51bWFfZW5hYmxlZCkKKwkJcmV0dXJuOworCisJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkgeworCQlwcmludGsoS0VSTl9JTkZPICJOb2RlICVkIENQVXM6Iiwgbm9kZSk7CisKKwkJY291bnQgPSAwOworCQkvKgorCQkgKiBJZiB3ZSB1c2VkIGEgQ1BVIGl0ZXJhdG9yIGhlcmUgd2Ugd291bGQgbWlzcyBwcmludGluZworCQkgKiB0aGUgaG9sZXMgaW4gdGhlIGNwdW1hcC4KKwkJICovCisJCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgY3B1KyspIHsKKwkJCWlmIChjcHVfaXNzZXQoY3B1LCBudW1hX2NwdW1hc2tfbG9va3VwX3RhYmxlW25vZGVdKSkgeworCQkJCWlmIChjb3VudCA9PSAwKQorCQkJCQlwcmludGsoIiAldSIsIGNwdSk7CisJCQkJKytjb3VudDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGNvdW50ID4gMSkKKwkJCQkJcHJpbnRrKCItJXUiLCBjcHUgLSAxKTsKKwkJCQljb3VudCA9IDA7CisJCQl9CisJCX0KKworCQlpZiAoY291bnQgPiAxKQorCQkJcHJpbnRrKCItJXUiLCBOUl9DUFVTIC0gMSk7CisJCXByaW50aygiXG4iKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBkdW1wX251bWFfbWVtb3J5X3RvcG9sb2d5KHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IG5vZGU7CiAJdW5zaWduZWQgaW50IGNvdW50OwpAQCAtNTI5LDcgKzU1Niw2IEBACiAJCQlwcmludGsoIi0weCVseCIsIGkpOwogCQlwcmludGsoIlxuIik7CiAJfQotCXJldHVybjsKIH0KIAogLyoKQEAgLTU5MSw3ICs2MTcsNyBAQAogCWlmIChwYXJzZV9udW1hX3Byb3BlcnRpZXMoKSkKIAkJc2V0dXBfbm9ubnVtYSgpOwogCWVsc2UKLQkJZHVtcF9udW1hX3RvcG9sb2d5KCk7CisJCWR1bXBfbnVtYV9tZW1vcnlfdG9wb2xvZ3koKTsKIAogCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmcHBjNjRfbnVtYV9uYik7CiAKQEAgLTczMCwzICs3NTYsNjAgQEAKIAlyZXR1cm4gMDsKIH0KIGVhcmx5X3BhcmFtKCJudW1hIiwgZWFybHlfbnVtYSk7CisKKyNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUcKKy8qCisgKiBGaW5kIHRoZSBub2RlIGFzc29jaWF0ZWQgd2l0aCBhIGhvdCBhZGRlZCBtZW1vcnkgc2VjdGlvbi4gIFNlY3Rpb24KKyAqIGNvcnJlc3BvbmRzIHRvIGEgU1BBUlNFTUVNIHNlY3Rpb24sIG5vdCBhbiBMTUIuICBJdCBpcyBhc3N1bWVkIHRoYXQKKyAqIHNlY3Rpb25zIGFyZSBmdWxseSBjb250YWluZWQgd2l0aGluIGEgc2luZ2xlIExNQi4KKyAqLworaW50IGhvdF9hZGRfc2NuX3RvX25pZCh1bnNpZ25lZCBsb25nIHNjbl9hZGRyKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbWVtb3J5ID0gTlVMTDsKKwlub2RlbWFza190IG5vZGVzOworCWludCBudW1hX2RvbWFpbiA9IDA7CisKKwlpZiAoIW51bWFfZW5hYmxlZCB8fCAobWluX2NvbW1vbl9kZXB0aCA8IDApKQorCQlyZXR1cm4gbnVtYV9kb21haW47CisKKwl3aGlsZSAoKG1lbW9yeSA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG1lbW9yeSwgIm1lbW9yeSIpKSAhPSBOVUxMKSB7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnQsIHNpemU7CisJCWludCByYW5nZXM7CisJCXVuc2lnbmVkIGludCAqbWVtY2VsbF9idWY7CisJCXVuc2lnbmVkIGludCBsZW47CisKKwkJbWVtY2VsbF9idWYgPSAodW5zaWduZWQgaW50ICopZ2V0X3Byb3BlcnR5KG1lbW9yeSwgInJlZyIsICZsZW4pOworCQlpZiAoIW1lbWNlbGxfYnVmIHx8IGxlbiA8PSAwKQorCQkJY29udGludWU7CisKKwkJLyogcmFuZ2VzIGluIGNlbGwgKi8KKwkJcmFuZ2VzID0gKGxlbiA+PiAyKSAvIChuX21lbV9hZGRyX2NlbGxzICsgbl9tZW1fc2l6ZV9jZWxscyk7CitoYV9uZXdfcmFuZ2U6CisJCXN0YXJ0ID0gcmVhZF9uX2NlbGxzKG5fbWVtX2FkZHJfY2VsbHMsICZtZW1jZWxsX2J1Zik7CisJCXNpemUgPSByZWFkX25fY2VsbHMobl9tZW1fc2l6ZV9jZWxscywgJm1lbWNlbGxfYnVmKTsKKwkJbnVtYV9kb21haW4gPSBvZl9ub2RlX251bWFfZG9tYWluKG1lbW9yeSk7CisKKwkJLyogRG9tYWlucyBub3QgcHJlc2VudCBhdCBib290IGRlZmF1bHQgdG8gMCAqLworCQlpZiAoIW5vZGVfb25saW5lKG51bWFfZG9tYWluKSkKKwkJCW51bWFfZG9tYWluID0gYW55X29ubGluZV9ub2RlKE5PREVfTUFTS19BTEwpOworCisJCWlmICgoc2NuX2FkZHIgPj0gc3RhcnQpICYmIChzY25fYWRkciA8IChzdGFydCArIHNpemUpKSkgeworCQkJb2Zfbm9kZV9wdXQobWVtb3J5KTsKKwkJCWdvdG8gZ290X251bWFfZG9tYWluOworCQl9CisKKwkJaWYgKC0tcmFuZ2VzKQkJLyogcHJvY2VzcyBhbGwgcmFuZ2VzIGluIGNlbGwgKi8KKwkJCWdvdG8gaGFfbmV3X3JhbmdlOworCX0KKwlCVUcoKTsJLyogc2VjdGlvbiBhZGRyZXNzIHNob3VsZCBiZSBmb3VuZCBhYm92ZSAqLworCisJLyogVGVtcG9yYXJ5IGNvZGUgdG8gZW5zdXJlIHRoYXQgcmV0dXJuZWQgbm9kZSBpcyBub3QgZW1wdHkgKi8KK2dvdF9udW1hX2RvbWFpbjoKKwlub2Rlc19zZXRhbGwobm9kZXMpOworCXdoaWxlIChOT0RFX0RBVEEobnVtYV9kb21haW4pLT5ub2RlX3NwYW5uZWRfcGFnZXMgPT0gMCkgeworCQlub2RlX2NsZWFyKG51bWFfZG9tYWluLCBub2Rlcyk7CisJCW51bWFfZG9tYWluID0gYW55X29ubGluZV9ub2RlKG5vZGVzKTsKKwl9CisJcmV0dXJuIG51bWFfZG9tYWluOworfQorI2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUExVRyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzY0LmMKaW5kZXggMmZmY2E2My4uN2IyNzhkODMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfNjQuYwpAQCAtMTc0LDcgKzE3NCw3IEBACiAJcGEgPSBhZGRyICYgUEFHRV9NQVNLOwogCXNpemUgPSBQQUdFX0FMSUdOKGFkZHIgKyBzaXplKSAtIHBhOwogCi0JaWYgKHNpemUgPT0gMCkKKwlpZiAoKHNpemUgPT0gMCkgfHwgKHBhID09IDApKQogCQlyZXR1cm4gTlVMTDsKIAogCWlmIChtZW1faW5pdF9kb25lKSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vc2xiLmMgYi9hcmNoL3Bvd2VycGMvbW0vc2xiLmMKaW5kZXggNjBlODUyZi4uZmZjOGVkNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3NsYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9zbGIuYwpAQCAtNzUsNyArNzUsNyBAQAogCXZmbGFncyA9IFNMQl9WU0lEX0tFUk5FTCB8IHZpcnR1YWxfbGxwOwogCiAJa3NwX2VzaWRfZGF0YSA9IG1rX2VzaWRfZGF0YShnZXRfcGFjYSgpLT5rc3RhY2ssIDIpOwotCWlmICgoa3NwX2VzaWRfZGF0YSAmIEVTSURfTUFTSykgPT0gS0VSTkVMQkFTRSkKKwlpZiAoKGtzcF9lc2lkX2RhdGEgJiBFU0lEX01BU0spID09IFBBR0VfT0ZGU0VUKQogCQlrc3BfZXNpZF9kYXRhICY9IH5TTEJfRVNJRF9WOwogCiAJLyogV2UgbmVlZCB0byBkbyB0aGlzIGFsbCBpbiBhc20sIHNvIHdlJ3JlIHN1cmUgd2UgZG9uJ3QgdG91Y2gKQEAgLTg3LDggKzg3LDggQEAKIAkJICAgICAvKiBTbG90IDIgLSBrZXJuZWwgc3RhY2sgKi8KIAkJICAgICAic2xibXRlCSUyLCUzXG4iCiAJCSAgICAgImlzeW5jIgotCQkgICAgIDo6ICJyIihta192c2lkX2RhdGEoVk1BTExPQ0JBU0UsIHZmbGFncykpLAotCQkgICAgICAgICJyIihta19lc2lkX2RhdGEoVk1BTExPQ0JBU0UsIDEpKSwKKwkJICAgICA6OiAiciIobWtfdnNpZF9kYXRhKFZNQUxMT0NfU1RBUlQsIHZmbGFncykpLAorCQkgICAgICAgICJyIihta19lc2lkX2RhdGEoVk1BTExPQ19TVEFSVCwgMSkpLAogCQkgICAgICAgICJyIihta192c2lkX2RhdGEoa3NwX2VzaWRfZGF0YSwgbGZsYWdzKSksCiAJCSAgICAgICAgInIiKGtzcF9lc2lkX2RhdGEpCiAJCSAgICAgOiAibWVtb3J5Iik7CkBAIC0xMzQsMTQgKzEzNCwxNCBAQAogCWVsc2UKIAkJdW5tYXBwZWRfYmFzZSA9IFRBU0tfVU5NQVBQRURfQkFTRV9VU0VSNjQ7CiAKLQlpZiAocGMgPj0gS0VSTkVMQkFTRSkKKwlpZiAoaXNfa2VybmVsX2FkZHIocGMpKQogCQlyZXR1cm47CiAJc2xiX2FsbG9jYXRlKHBjKTsKIAogCWlmIChHRVRfRVNJRChwYykgPT0gR0VUX0VTSUQoc3RhY2spKQogCQlyZXR1cm47CiAKLQlpZiAoc3RhY2sgPj0gS0VSTkVMQkFTRSkKKwlpZiAoaXNfa2VybmVsX2FkZHIoc3RhY2spKQogCQlyZXR1cm47CiAJc2xiX2FsbG9jYXRlKHN0YWNrKTsKIApAQCAtMTQ5LDcgKzE0OSw3IEBACiAJICAgIHx8IChHRVRfRVNJRChzdGFjaykgPT0gR0VUX0VTSUQodW5tYXBwZWRfYmFzZSkpKQogCQlyZXR1cm47CiAKLQlpZiAodW5tYXBwZWRfYmFzZSA+PSBLRVJORUxCQVNFKQorCWlmIChpc19rZXJuZWxfYWRkcih1bm1hcHBlZF9iYXNlKSkKIAkJcmV0dXJuOwogCXNsYl9hbGxvY2F0ZSh1bm1hcHBlZF9iYXNlKTsKIH0KQEAgLTIxMywxMCArMjEzLDEwIEBACiAJYXNtIHZvbGF0aWxlKCJpc3luYyI6OjoibWVtb3J5Iik7CiAJYXNtIHZvbGF0aWxlKCJzbGJtdGUgICUwLCUwIjo6InIiICgwKSA6ICJtZW1vcnkiKTsKIAlhc20gdm9sYXRpbGUoImlzeW5jOyBzbGJpYTsgaXN5bmMiOjo6Im1lbW9yeSIpOwotCWNyZWF0ZV9zbGJlKEtFUk5FTEJBU0UsIGxmbGFncywgMCk7CisJY3JlYXRlX3NsYmUoUEFHRV9PRkZTRVQsIGxmbGFncywgMCk7CiAKIAkvKiBWTUFMTE9DIHNwYWNlIGhhcyA0SyBwYWdlcyBhbHdheXMgZm9yIG5vdyAqLwotCWNyZWF0ZV9zbGJlKFZNQUxMT0NCQVNFLCB2ZmxhZ3MsIDEpOworCWNyZWF0ZV9zbGJlKFZNQUxMT0NfU1RBUlQsIHZmbGFncywgMSk7CiAKIAkvKiBXZSBkb24ndCBib2x0IHRoZSBzdGFjayBmb3IgdGhlIHRpbWUgYmVpbmcgLSB3ZSdyZSBpbiBib290LAogCSAqIHNvIHRoZSBzdGFjayBpcyBpbiB0aGUgYm9sdGVkIHNlZ21lbnQuICBCeSB0aGUgdGltZSBpdCBnb2VzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vc2xiX2xvdy5TIGIvYXJjaC9wb3dlcnBjL21tL3NsYl9sb3cuUwppbmRleCA5NTBmZmM1Li5kMWFjZWUzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vc2xiX2xvdy5TCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9zbGJfbG93LlMKQEAgLTM3LDkgKzM3LDkgQEAKIAogCXNyZGkJcjkscjMsNjAJCS8qIGdldCByZWdpb24gKi8KIAlzcmRpCXIxMCxyMywyOAkJLyogZ2V0IGVzaWQgKi8KLQljbXBsZGkJY3I3LHI5LDB4YwkJLyogY21wIEtFUk5FTEJBU0UgZm9yIGxhdGVyIHVzZSAqLworCWNtcGxkaQljcjcscjksMHhjCQkvKiBjbXAgUEFHRV9PRkZTRVQgZm9yIGxhdGVyIHVzZSAqLwogCi0JLyogcjMgPSBhZGRyZXNzLCByMTAgPSBlc2lkLCBjcjcgPSA8PktFUk5FTEJBU0UgKi8KKwkvKiByMyA9IGFkZHJlc3MsIHIxMCA9IGVzaWQsIGNyNyA9IDw+IFBBR0VfT0ZGU0VUICovCiAJYmx0CWNyNywwZgkJCS8qIHVzZXIgb3Iga2VybmVsPyAqLwogCiAJLyoga2VybmVsIGFkZHJlc3M6IHByb3RvLVZTSUQgPSBFU0lEICovCkBAIC0xNjYsNyArMTY2LDcgQEAKIC8qCiAgKiBGaW5pc2ggbG9hZGluZyBvZiBhbiBTTEIgZW50cnkgYW5kIHJldHVybgogICoKLSAqIHIzID0gRUEsIHIxMCA9IHByb3RvLVZTSUQsIHIxMSA9IGZsYWdzLCBjbG9iYmVycyByOSwgY3I3ID0gPD5LRVJORUxCQVNFCisgKiByMyA9IEVBLCByMTAgPSBwcm90by1WU0lELCByMTEgPSBmbGFncywgY2xvYmJlcnMgcjksIGNyNyA9IDw+IFBBR0VfT0ZGU0VUCiAgKi8KIHNsYl9maW5pc2hfbG9hZDoKIAlBU01fVlNJRF9TQ1JBTUJMRShyMTAscjkpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vc3RhYi5jIGIvYXJjaC9wb3dlcnBjL21tL3N0YWIuYwppbmRleCA1MWU3OTUxLi44MmU0OTUxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vc3RhYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9zdGFiLmMKQEAgLTQwLDcgKzQwLDcgQEAKIAl1bnNpZ25lZCBsb25nIGVudHJ5LCBncm91cCwgb2xkX2VzaWQsIGNhc3RvdXRfZW50cnksIGk7CiAJdW5zaWduZWQgaW50IGdsb2JhbF9lbnRyeTsKIAlzdHJ1Y3Qgc3RhYl9lbnRyeSAqc3RlLCAqY2FzdG91dF9zdGU7Ci0JdW5zaWduZWQgbG9uZyBrZXJuZWxfc2VnbWVudCA9IChlc2lkIDw8IFNJRF9TSElGVCkgPj0gS0VSTkVMQkFTRTsKKwl1bnNpZ25lZCBsb25nIGtlcm5lbF9zZWdtZW50ID0gKGVzaWQgPDwgU0lEX1NISUZUKSA+PSBQQUdFX09GRlNFVDsKIAogCXZzaWRfZGF0YSA9IHZzaWQgPDwgU1RFX1ZTSURfU0hJRlQ7CiAJZXNpZF9kYXRhID0gZXNpZCA8PCBTSURfU0hJRlQgfCBTVEVfRVNJRF9LUCB8IFNURV9FU0lEX1Y7CkBAIC04Myw3ICs4Myw3IEBACiAJCX0KIAogCQkvKiBEb250IGNhc3Qgb3V0IHRoZSBmaXJzdCBrZXJuZWwgc2VnbWVudCAqLwotCQlpZiAoKGNhc3RvdXRfc3RlLT5lc2lkX2RhdGEgJiBFU0lEX01BU0spICE9IEtFUk5FTEJBU0UpCisJCWlmICgoY2FzdG91dF9zdGUtPmVzaWRfZGF0YSAmIEVTSURfTUFTSykgIT0gUEFHRV9PRkZTRVQpCiAJCQlicmVhazsKIAogCQljYXN0b3V0X2VudHJ5ID0gKGNhc3RvdXRfZW50cnkgKyAxKSAmIDB4ZjsKQEAgLTEyMiw3ICsxMjIsNyBAQAogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCiAJLyogS2VybmVsIG9yIHVzZXIgYWRkcmVzcz8gKi8KLQlpZiAoZWEgPj0gS0VSTkVMQkFTRSkgeworCWlmIChpc19rZXJuZWxfYWRkcihlYSkpIHsKIAkJdnNpZCA9IGdldF9rZXJuZWxfdnNpZChlYSk7CiAJfSBlbHNlIHsKIAkJaWYgKChlYSA+PSBUQVNLX1NJWkVfVVNFUjY0KSB8fCAoISBtbSkpCkBAIC0xMzMsNyArMTMzLDcgQEAKIAogCXN0YWJfZW50cnkgPSBtYWtlX3N0ZShnZXRfcGFjYSgpLT5zdGFiX2FkZHIsIEdFVF9FU0lEKGVhKSwgdnNpZCk7CiAKLQlpZiAoZWEgPCBLRVJORUxCQVNFKSB7CisJaWYgKCFpc19rZXJuZWxfYWRkcihlYSkpIHsKIAkJb2Zmc2V0ID0gX19nZXRfY3B1X3ZhcihzdGFiX2NhY2hlX3B0cik7CiAJCWlmIChvZmZzZXQgPCBOUl9TVEFCX0NBQ0hFX0VOVFJJRVMpCiAJCQlfX2dldF9jcHVfdmFyKHN0YWJfY2FjaGVbb2Zmc2V0KytdKSA9IHN0YWJfZW50cnk7CkBAIC0xOTAsNyArMTkwLDcgQEAKIAkJICAgICBlbnRyeSsrLCBzdGUrKykgewogCQkJdW5zaWduZWQgbG9uZyBlYTsKIAkJCWVhID0gc3RlLT5lc2lkX2RhdGEgJiBFU0lEX01BU0s7Ci0JCQlpZiAoZWEgPCBLRVJORUxCQVNFKSB7CisJCQlpZiAoIWlzX2tlcm5lbF9hZGRyKGVhKSkgewogCQkJCXN0ZS0+ZXNpZF9kYXRhID0gMDsKIAkJCX0KIAkJfQpAQCAtMjUxLDcgKzI1MSw3IEBACiAJCQlwYW5pYygiVW5hYmxlIHRvIGFsbG9jYXRlIHNlZ21lbnQgdGFibGUgZm9yIENQVSAlZC5cbiIsCiAJCQkgICAgICBjcHUpOwogCi0JCW5ld3N0YWIgKz0gS0VSTkVMQkFTRTsKKwkJbmV3c3RhYiA9ICh1bnNpZ25lZCBsb25nKV9fdmEobmV3c3RhYik7CiAKIAkJbWVtc2V0KCh2b2lkICopbmV3c3RhYiwgMCwgSFdfUEFHRV9TSVpFKTsKIApAQCAtMjcwLDExICsyNzAsMTEgQEAKICAqLwogdm9pZCBzdGFiX2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBzdGFiKQogewotCXVuc2lnbmVkIGxvbmcgdnNpZCA9IGdldF9rZXJuZWxfdnNpZChLRVJORUxCQVNFKTsKKwl1bnNpZ25lZCBsb25nIHZzaWQgPSBnZXRfa2VybmVsX3ZzaWQoUEFHRV9PRkZTRVQpOwogCXVuc2lnbmVkIGxvbmcgc3RhYnJlYWw7CiAKIAlhc20gdm9sYXRpbGUoImlzeW5jOyBzbGJpYTsgaXN5bmMiOjo6Im1lbW9yeSIpOwotCW1ha2Vfc3RlKHN0YWIsIEdFVF9FU0lEKEtFUk5FTEJBU0UpLCB2c2lkKTsKKwltYWtlX3N0ZShzdGFiLCBHRVRfRVNJRChQQUdFX09GRlNFVCksIHZzaWQpOwogCiAJLyogT3JkZXIgdXBkYXRlICovCiAJYXNtIHZvbGF0aWxlKCJzeW5jIjo6OiJtZW1vcnkiKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS90bGJfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfNjQuYwppbmRleCA4NTlkMjlhLi5iYjNhZmI2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vdGxiXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3RsYl82NC5jCkBAIC0xNjgsNyArMTY4LDcgQEAKIAkJYmF0Y2gtPm1tID0gbW07CiAJCWJhdGNoLT5wc2l6ZSA9IHBzaXplOwogCX0KLQlpZiAoYWRkciA8IEtFUk5FTEJBU0UpIHsKKwlpZiAoIWlzX2tlcm5lbF9hZGRyKGFkZHIpKSB7CiAJCXZzaWQgPSBnZXRfdnNpZChtbS0+Y29udGV4dC5pZCwgYWRkcik7CiAJCVdBUk5fT04odnNpZCA9PSAwKTsKIAl9IGVsc2UKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9NYWtlZmlsZQppbmRleCAwNzgyZDBjLi41NTRjZDdjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL01ha2VmaWxlCkBAIC05LDMgKzksNCBAQAogb3Byb2ZpbGUteSA6PSAkKERSSVZFUl9PQkpTKSBjb21tb24ubwogb3Byb2ZpbGUtJChDT05GSUdfUFBDNjQpICs9IG9wX21vZGVsX3JzNjQubyBvcF9tb2RlbF9wb3dlcjQubwogb3Byb2ZpbGUtJChDT05GSUdfRlNMX0JPT0tFKSArPSBvcF9tb2RlbF9mc2xfYm9va2Uubworb3Byb2ZpbGUtJChDT05GSUdfUFBDMzIpICs9IG9wX21vZGVsXzc0NTAubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NvbW1vbi5jCmluZGV4IGFmMmMwNWQuLmNjMjUzNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jb21tb24uYworKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY29tbW9uLmMKQEAgLTE0LDkgKzE0LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KLSNpZm5kZWYgX19wb3dlcnBjNjRfXwotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNlbmRpZiAvKiAhIF9fcG93ZXJwYzY0X18gKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KQEAgLTMxLDEwICsyOCw2IEBACiBzdGF0aWMgc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnIGN0cltPUF9NQVhfQ09VTlRFUl07CiBzdGF0aWMgc3RydWN0IG9wX3N5c3RlbV9jb25maWcgc3lzOwogCi0jaWZuZGVmIF9fcG93ZXJwYzY0X18KLXN0YXRpYyBjaGFyICpjcHVfdHlwZTsKLSNlbmRpZiAvKiAhIF9fcG93ZXJwYzY0X18gKi8KLQogc3RhdGljIHZvaWQgb3BfaGFuZGxlX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAltb2RlbC0+aGFuZGxlX2ludGVycnVwdChyZWdzLCBjdHIpOwpAQCAtNTMsMTQgKzQ2LDcgQEAKIAltb2RlbC0+cmVnX3NldHVwKGN0ciwgJnN5cywgbW9kZWwtPm51bV9jb3VudGVycyk7CiAKIAkvKiBDb25maWd1cmUgdGhlIHJlZ2lzdGVycyBvbiBhbGwgY3B1cy4gICovCi0jaWZkZWYgX19wb3dlcnBjNjRfXwogCW9uX2VhY2hfY3B1KG1vZGVsLT5jcHVfc2V0dXAsIE5VTEwsIDAsIDEpOwotI2Vsc2UgLyogX19wb3dlcnBjNjRfXyAqLwotI2lmIDAKLQkvKiBGSVhNRTogTWFrZSBtdWx0aS1jcHUgd29yayAqLwotCW9uX2VhY2hfY3B1KG1vZGVsLT5yZWdfc2V0dXAsIE5VTEwsIDAsIDEpOwotI2VuZGlmCi0jZW5kaWYgLyogX19wb3dlcnBjNjRfXyAqLwogCiAJcmV0dXJuIDA7CiB9CkBAIC05NSw3ICs4MSw3IEBACiB7CiAJaW50IGk7CiAKLSNpZmRlZiBfX3Bvd2VycGM2NF9fCisjaWZkZWYgQ09ORklHX1BQQzY0CiAJLyoKIAkgKiBUaGVyZSBpcyBvbmUgbW1jcjAsIG1tY3IxIGFuZCBtbWNyYSBmb3Igc2V0dGluZyB0aGUgZXZlbnRzIGZvcgogCSAqIGFsbCBvZiB0aGUgY291bnRlcnMuCkBAIC0xMDMsNyArODksNyBAQAogCW9wcm9maWxlZnNfY3JlYXRlX3Vsb25nKHNiLCByb290LCAibW1jcjAiLCAmc3lzLm1tY3IwKTsKIAlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgcm9vdCwgIm1tY3IxIiwgJnN5cy5tbWNyMSk7CiAJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIHJvb3QsICJtbWNyYSIsICZzeXMubW1jcmEpOwotI2VuZGlmIC8qIF9fcG93ZXJwYzY0X18gKi8KKyNlbmRpZgogCiAJZm9yIChpID0gMDsgaSA8IG1vZGVsLT5udW1fY291bnRlcnM7ICsraSkgewogCQlzdHJ1Y3QgZGVudHJ5ICpkaXI7CkBAIC0xMTUsNjUgKzEwMSw2OCBAQAogCQlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgZGlyLCAiZW5hYmxlZCIsICZjdHJbaV0uZW5hYmxlZCk7CiAJCW9wcm9maWxlZnNfY3JlYXRlX3Vsb25nKHNiLCBkaXIsICJldmVudCIsICZjdHJbaV0uZXZlbnQpOwogCQlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgZGlyLCAiY291bnQiLCAmY3RyW2ldLmNvdW50KTsKLSNpZmRlZiBfX3Bvd2VycGM2NF9fCisKIAkJLyoKLQkJICogV2UgZG9udCBzdXBwb3J0IHBlciBjb3VudGVyIHVzZXIva2VybmVsIHNlbGVjdGlvbiwgYnV0Ci0JCSAqIHdlIGxlYXZlIHRoZSBlbnRyaWVzIGJlY2F1c2UgdXNlcnNwYWNlIGV4cGVjdHMgdGhlbQorCQkgKiBDbGFzc2ljIFBvd2VyUEMgZG9lc24ndCBzdXBwb3J0IHBlci1jb3VudGVyCisJCSAqIGNvbnRyb2wgbGlrZSB0aGlzLCBidXQgdGhlIG9wdGlvbnMgYXJlCisJCSAqIGV4cGVjdGVkLCBzbyB0aGV5IHJlbWFpbi4gIEZvciBGcmVlc2NhbGUKKwkJICogQm9vay1FIHN0eWxlIHBlcmZvcm1hbmNlIG1vbml0b3JzLCB3ZSBkbworCQkgKiBzdXBwb3J0IHRoZW0uCiAJCSAqLwotI2VuZGlmIC8qIF9fcG93ZXJwYzY0X18gKi8KIAkJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGRpciwgImtlcm5lbCIsICZjdHJbaV0ua2VybmVsKTsKIAkJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGRpciwgInVzZXIiLCAmY3RyW2ldLnVzZXIpOwogCi0jaWZuZGVmIF9fcG93ZXJwYzY0X18KLQkJLyogRklYTUU6IE5vdCBzdXJlIGlmIHRoaXMgaXMgdXNlZCAqLwotI2VuZGlmIC8qICEgX19wb3dlcnBjNjRfXyAqLwogCQlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgZGlyLCAidW5pdF9tYXNrIiwgJmN0cltpXS51bml0X21hc2spOwogCX0KIAogCW9wcm9maWxlZnNfY3JlYXRlX3Vsb25nKHNiLCByb290LCAiZW5hYmxlX2tlcm5lbCIsICZzeXMuZW5hYmxlX2tlcm5lbCk7CiAJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIHJvb3QsICJlbmFibGVfdXNlciIsICZzeXMuZW5hYmxlX3VzZXIpOwotI2lmZGVmIF9fcG93ZXJwYzY0X18KKyNpZmRlZiBDT05GSUdfUFBDNjQKIAlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgcm9vdCwgImJhY2t0cmFjZV9zcGlubG9ja3MiLAogCQkJCSZzeXMuYmFja3RyYWNlX3NwaW5sb2Nrcyk7Ci0jZW5kaWYgLyogX19wb3dlcnBjNjRfXyAqLworI2VuZGlmCiAKIAkvKiBEZWZhdWx0IHRvIHRyYWNpbmcgYm90aCBrZXJuZWwgYW5kIHVzZXIgKi8KIAlzeXMuZW5hYmxlX2tlcm5lbCA9IDE7CiAJc3lzLmVuYWJsZV91c2VyID0gMTsKLSNpZmRlZiBfX3Bvd2VycGM2NF9fCisjaWZkZWYgQ09ORklHX1BQQzY0CiAJLyogVHVybiBvbiBiYWNrdHJhY2luZyB0aHJvdWdoIHNwaW5sb2NrcyBieSBkZWZhdWx0ICovCiAJc3lzLmJhY2t0cmFjZV9zcGlubG9ja3MgPSAxOwotI2VuZGlmIC8qIF9fcG93ZXJwYzY0X18gKi8KKyNlbmRpZgogCiAJcmV0dXJuIDA7CiB9CiAKIGludCBfX2luaXQgb3Byb2ZpbGVfYXJjaF9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICpvcHMpCiB7Ci0jaWZuZGVmIF9fcG93ZXJwYzY0X18KLSNpZmRlZiBDT05GSUdfRlNMX0JPT0tFCi0JbW9kZWwgPSAmb3BfbW9kZWxfZnNsX2Jvb2tlOwotI2Vsc2UKLQlyZXR1cm4gLUVOT0RFVjsKLSNlbmRpZgotCi0JY3B1X3R5cGUgPSBrbWFsbG9jKDMyLCBHRlBfS0VSTkVMKTsKLQlpZiAoTlVMTCA9PSBjcHVfdHlwZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzcHJpbnRmKGNwdV90eXBlLCAicHBjLyVzIiwgY3VyX2NwdV9zcGVjLT5jcHVfbmFtZSk7Ci0KLQltb2RlbC0+bnVtX2NvdW50ZXJzID0gY3VyX2NwdV9zcGVjLT5udW1fcG1jczsKLQotCW9wcy0+Y3B1X3R5cGUgPSBjcHVfdHlwZTsKLSNlbHNlIC8qIF9fcG93ZXJwYzY0X18gKi8KLQlpZiAoIWN1cl9jcHVfc3BlYy0+b3Byb2ZpbGVfbW9kZWwgfHwgIWN1cl9jcHVfc3BlYy0+b3Byb2ZpbGVfY3B1X3R5cGUpCisJaWYgKCFjdXJfY3B1X3NwZWMtPm9wcm9maWxlX2NwdV90eXBlKQogCQlyZXR1cm4gLUVOT0RFVjsKLQltb2RlbCA9IGN1cl9jcHVfc3BlYy0+b3Byb2ZpbGVfbW9kZWw7CisKKwlzd2l0Y2ggKGN1cl9jcHVfc3BlYy0+b3Byb2ZpbGVfdHlwZSkgeworI2lmZGVmIENPTkZJR19QUEM2NAorCQljYXNlIFBQQ19PUFJPRklMRV9SUzY0OgorCQkJbW9kZWwgPSAmb3BfbW9kZWxfcnM2NDsKKwkJCWJyZWFrOworCQljYXNlIFBQQ19PUFJPRklMRV9QT1dFUjQ6CisJCQltb2RlbCA9ICZvcF9tb2RlbF9wb3dlcjQ7CisJCQlicmVhazsKKyNlbHNlCisJCWNhc2UgUFBDX09QUk9GSUxFX0c0OgorCQkJbW9kZWwgPSAmb3BfbW9kZWxfNzQ1MDsKKwkJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZTTF9CT09LRQorCQljYXNlIFBQQ19PUFJPRklMRV9CT09LRToKKwkJCW1vZGVsID0gJm9wX21vZGVsX2ZzbF9ib29rZTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKIAltb2RlbC0+bnVtX2NvdW50ZXJzID0gY3VyX2NwdV9zcGVjLT5udW1fcG1jczsKIAogCW9wcy0+Y3B1X3R5cGUgPSBjdXJfY3B1X3NwZWMtPm9wcm9maWxlX2NwdV90eXBlOwotI2VuZGlmIC8qIF9fcG93ZXJwYzY0X18gKi8KIAlvcHMtPmNyZWF0ZV9maWxlcyA9IG9wX3Bvd2VycGNfY3JlYXRlX2ZpbGVzOwogCW9wcy0+c2V0dXAgPSBvcF9wb3dlcnBjX3NldHVwOwogCW9wcy0+c2h1dGRvd24gPSBvcF9wb3dlcnBjX3NodXRkb3duOwpAQCAtMTg4LDggKzE3Nyw0IEBACiAKIHZvaWQgb3Byb2ZpbGVfYXJjaF9leGl0KHZvaWQpCiB7Ci0jaWZuZGVmIF9fcG93ZXJwYzY0X18KLQlrZnJlZShjcHVfdHlwZSk7Ci0JY3B1X3R5cGUgPSBOVUxMOwotI2VuZGlmIC8qICEgX19wb3dlcnBjNjRfXyAqLwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsXzc0NTAuYyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF83NDUwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJhYmZkYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF83NDUwLmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBvcHJvZmlsZS9vcF9tb2RlbF83NDUwLmMKKyAqCisgKiBGcmVlc2NhbGUgNzQ1eC83NDR4IG9wcm9maWxlIHN1cHBvcnQsIGJhc2VkIG9uIGZzbF9ib29rZSBzdXBwb3J0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgQW50b24gQmxhbmNoYXJkIDxhbnRvbkBhdS5pYm0uY29tPiwgSUJNCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMKKyAqCisgKiBBdXRob3I6IEFuZHkgRmxlbWluZworICogTWFpbnRhaW5lcjogS3VtYXIgR2FsYSA8Z2FsYWtAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wbWMuaD4KKyNpbmNsdWRlIDxhc20vb3Byb2ZpbGVfaW1wbC5oPgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyByZXNldF92YWx1ZVtPUF9NQVhfQ09VTlRFUl07CisKK3N0YXRpYyBpbnQgb3Byb2ZpbGVfcnVubmluZzsKK3N0YXRpYyB1MzIgbW1jcjBfdmFsLCBtbWNyMV92YWwsIG1tY3IyX3ZhbDsKKworI2RlZmluZSBNTUNSMF9QTUMxX1NISUZUCTYKKyNkZWZpbmUgTU1DUjBfUE1DMl9TSElGVAkwCisjZGVmaW5lIE1NQ1IxX1BNQzNfU0hJRlQJMjcKKyNkZWZpbmUgTU1DUjFfUE1DNF9TSElGVAkyMgorI2RlZmluZSBNTUNSMV9QTUM1X1NISUZUCTE3CisjZGVmaW5lIE1NQ1IxX1BNQzZfU0hJRlQJMTEKKworI2RlZmluZSBtbWNyMF9ldmVudDEoZXZlbnQpIFwKKwkoKGV2ZW50IDw8IE1NQ1IwX1BNQzFfU0hJRlQpICYgTU1DUjBfUE1DMVNFTCkKKyNkZWZpbmUgbW1jcjBfZXZlbnQyKGV2ZW50KSBcCisJKChldmVudCA8PCBNTUNSMF9QTUMyX1NISUZUKSAmIE1NQ1IwX1BNQzJTRUwpCisKKyNkZWZpbmUgbW1jcjFfZXZlbnQzKGV2ZW50KSBcCisJKChldmVudCA8PCBNTUNSMV9QTUMzX1NISUZUKSAmIE1NQ1IxX1BNQzNTRUwpCisjZGVmaW5lIG1tY3IxX2V2ZW50NChldmVudCkgXAorCSgoZXZlbnQgPDwgTU1DUjFfUE1DNF9TSElGVCkgJiBNTUNSMV9QTUM0U0VMKQorI2RlZmluZSBtbWNyMV9ldmVudDUoZXZlbnQpIFwKKwkoKGV2ZW50IDw8IE1NQ1IxX1BNQzVfU0hJRlQpICYgTU1DUjFfUE1DNVNFTCkKKyNkZWZpbmUgbW1jcjFfZXZlbnQ2KGV2ZW50KSBcCisJKChldmVudCA8PCBNTUNSMV9QTUM2X1NISUZUKSAmIE1NQ1IxX1BNQzZTRUwpCisKKyNkZWZpbmUgTU1DUjBfSU5JVCAoTU1DUjBfRkMgfCBNTUNSMF9GQ1MgfCBNTUNSMF9GQ1AgfCBNTUNSMF9GQ00xIHwgTU1DUjBfRkNNMCkKKworLyogVW5mcmVlemVzIHRoZSBjb3VudGVycyBvbiB0aGlzIENQVSwgZW5hYmxlcyB0aGUgaW50ZXJydXB0LAorICogZW5hYmxlcyB0aGUgY291bnRlcnMgdG8gdHJpZ2dlciB0aGUgaW50ZXJydXB0LCBhbmQgc2V0cyB0aGUKKyAqIGNvdW50ZXJzIHRvIG9ubHkgY291bnQgd2hlbiB0aGUgbWFyayBiaXQgaXMgbm90IHNldC4KKyAqLworc3RhdGljIHZvaWQgcG1jX3N0YXJ0X2N0cnModm9pZCkKK3sKKwl1MzIgbW1jcjAgPSBtZnNwcihTUFJOX01NQ1IwKTsKKworCW1tY3IwICY9IH4oTU1DUjBfRkMgfCBNTUNSMF9GQ00wKTsKKwltbWNyMCB8PSAoTU1DUjBfRkNFQ0UgfCBNTUNSMF9QTUMxQ0UgfCBNTUNSMF9QTUNuQ0UgfCBNTUNSMF9QTVhFKTsKKworCW10c3ByKFNQUk5fTU1DUjAsIG1tY3IwKTsKK30KKworLyogRGlzYWJsZXMgdGhlIGNvdW50ZXJzIG9uIHRoaXMgQ1BVLCBhbmQgZnJlZXplcyB0aGVtICovCitzdGF0aWMgdm9pZCBwbWNfc3RvcF9jdHJzKHZvaWQpCit7CisJdTMyIG1tY3IwID0gbWZzcHIoU1BSTl9NTUNSMCk7CisKKwltbWNyMCB8PSBNTUNSMF9GQzsKKwltbWNyMCAmPSB+KE1NQ1IwX0ZDRUNFIHwgTU1DUjBfUE1DMUNFIHwgTU1DUjBfUE1DbkNFIHwgTU1DUjBfUE1YRSk7CisKKwltdHNwcihTUFJOX01NQ1IwLCBtbWNyMCk7Cit9CisKKy8qIENvbmZpZ3VyZXMgdGhlIGNvdW50ZXJzIG9uIHRoaXMgQ1BVIGJhc2VkIG9uIHRoZSBnbG9iYWwKKyAqIHNldHRpbmdzICovCitzdGF0aWMgdm9pZCBmc2w3NDUwX2NwdV9zZXR1cCh2b2lkICp1bnVzZWQpCit7CisJLyogZnJlZXplIGFsbCBjb3VudGVycyAqLworCXBtY19zdG9wX2N0cnMoKTsKKworCW10c3ByKFNQUk5fTU1DUjAsIG1tY3IwX3ZhbCk7CisJbXRzcHIoU1BSTl9NTUNSMSwgbW1jcjFfdmFsKTsKKwltdHNwcihTUFJOX01NQ1IyLCBtbWNyMl92YWwpOworfQorCisjZGVmaW5lIE5VTV9DVFJTIDYKKworLyogQ29uZmlndXJlcyB0aGUgZ2xvYmFsIHNldHRpbmdzIGZvciB0aGUgY291bnRlcyBvbiBhbGwgQ1BVcy4gKi8KK3N0YXRpYyB2b2lkIGZzbDc0NTBfcmVnX3NldHVwKHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY3RyLAorCQkJICAgICBzdHJ1Y3Qgb3Bfc3lzdGVtX2NvbmZpZyAqc3lzLAorCQkJICAgICBpbnQgbnVtX2N0cnMpCit7CisJaW50IGk7CisKKwkvKiBPdXIgY291bnRlcnMgY291bnQgdXAsIGFuZCAiY291bnQiIHJlZmVycyB0bworCSAqIGhvdyBtdWNoIGJlZm9yZSB0aGUgbmV4dCBpbnRlcnJ1cHQsIGFuZCB3ZSBpbnRlcnJ1cHQKKwkgKiBvbiBvdmVyZmxvdy4gIFNvIHdlIGNhbGN1bGF0ZSB0aGUgc3RhcnRpbmcgdmFsdWUKKwkgKiB3aGljaCB3aWxsIGdpdmUgdXMgImNvdW50IiB1bnRpbCBvdmVyZmxvdy4KKwkgKiBUaGVuIHdlIHNldCB0aGUgZXZlbnRzIG9uIHRoZSBlbmFibGVkIGNvdW50ZXJzICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9DVFJTOyArK2kpCisJCXJlc2V0X3ZhbHVlW2ldID0gMHg4MDAwMDAwMFVMIC0gY3RyW2ldLmNvdW50OworCisJLyogU2V0IGV2ZW50cyBmb3IgQ291bnRlcnMgMSAmIDIgKi8KKwltbWNyMF92YWwgPSBNTUNSMF9JTklUIHwgbW1jcjBfZXZlbnQxKGN0clswXS5ldmVudCkKKwkJfCBtbWNyMF9ldmVudDIoY3RyWzFdLmV2ZW50KTsKKworCS8qIFNldHVwIHVzZXIva2VybmVsIGJpdHMgKi8KKwlpZiAoc3lzLT5lbmFibGVfa2VybmVsKQorCQltbWNyMF92YWwgJj0gfihNTUNSMF9GQ1MpOworCisJaWYgKHN5cy0+ZW5hYmxlX3VzZXIpCisJCW1tY3IwX3ZhbCAmPSB+KE1NQ1IwX0ZDUCk7CisKKwkvKiBTZXQgZXZlbnRzIGZvciBDb3VudGVycyAzLTYgKi8KKwltbWNyMV92YWwgPSBtbWNyMV9ldmVudDMoY3RyWzJdLmV2ZW50KQorCQl8IG1tY3IxX2V2ZW50NChjdHJbM10uZXZlbnQpCisJCXwgbW1jcjFfZXZlbnQ1KGN0cls0XS5ldmVudCkKKwkJfCBtbWNyMV9ldmVudDYoY3RyWzVdLmV2ZW50KTsKKworCW1tY3IyX3ZhbCA9IDA7Cit9CisKKy8qIFNldHMgdGhlIGNvdW50ZXJzIG9uIHRoaXMgQ1BVIHRvIHRoZSBjaG9zZW4gdmFsdWVzLCBhbmQgc3RhcnRzIHRoZW0gKi8KK3N0YXRpYyB2b2lkIGZzbDc0NTBfc3RhcnQoc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICpjdHIpCit7CisJaW50IGk7CisKKwltdG1zcihtZm1zcigpIHwgTVNSX1BNTSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NUUlM7ICsraSkgeworCQlpZiAoY3RyW2ldLmVuYWJsZWQpCisJCQljdHJfd3JpdGUoaSwgcmVzZXRfdmFsdWVbaV0pOworCQllbHNlCisJCQljdHJfd3JpdGUoaSwgMCk7CisJfQorCisJLyogQ2xlYXIgdGhlIGZyZWV6ZSBiaXQsIGFuZCBlbmFibGUgdGhlIGludGVycnVwdC4KKwkgKiBUaGUgY291bnRlcnMgd29uJ3QgYWN0dWFsbHkgc3RhcnQgdW50aWwgdGhlIHJmaSBjbGVhcnMKKwkgKiB0aGUgUE1NIGJpdCAqLworCXBtY19zdGFydF9jdHJzKCk7CisKKwlvcHJvZmlsZV9ydW5uaW5nID0gMTsKK30KKworLyogU3RvcCB0aGUgY291bnRlcnMgb24gdGhpcyBDUFUgKi8KK3N0YXRpYyB2b2lkIGZzbDc0NTBfc3RvcCh2b2lkKQoreworCS8qIGZyZWV6ZSBjb3VudGVycyAqLworCXBtY19zdG9wX2N0cnMoKTsKKworCW9wcm9maWxlX3J1bm5pbmcgPSAwOworCisJbWIoKTsKK30KKworCisvKiBIYW5kbGUgdGhlIGludGVycnVwdCBvbiB0aGlzIENQVSwgYW5kIGxvZyBhIHNhbXBsZSBmb3IgZWFjaAorICogZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIGludGVycnVwdCAqLworc3RhdGljIHZvaWQgZnNsNzQ1MF9oYW5kbGVfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCSAgICBzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKmN0cikKK3sKKwl1bnNpZ25lZCBsb25nIHBjOworCWludCBpc19rZXJuZWw7CisJaW50IHZhbDsKKwlpbnQgaTsKKworCS8qIHNldCB0aGUgUE1NIGJpdCAoc2VlIGNvbW1lbnQgYmVsb3cpICovCisJbXRtc3IobWZtc3IoKSB8IE1TUl9QTU0pOworCisJcGMgPSBtZnNwcihTUFJOX1NJQVIpOworCWlzX2tlcm5lbCA9IChwYyA+PSBLRVJORUxCQVNFKTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ1RSUzsgKytpKSB7CisJCXZhbCA9IGN0cl9yZWFkKGkpOworCQlpZiAodmFsIDwgMCkgeworCQkJaWYgKG9wcm9maWxlX3J1bm5pbmcgJiYgY3RyW2ldLmVuYWJsZWQpIHsKKwkJCQlvcHJvZmlsZV9hZGRfcGMocGMsIGlzX2tlcm5lbCwgaSk7CisJCQkJY3RyX3dyaXRlKGksIHJlc2V0X3ZhbHVlW2ldKTsKKwkJCX0gZWxzZSB7CisJCQkJY3RyX3dyaXRlKGksIDApOworCQkJfQorCQl9CisJfQorCisJLyogVGhlIGZyZWV6ZSBiaXQgd2FzIHNldCBieSB0aGUgaW50ZXJydXB0LiAqLworCS8qIENsZWFyIHRoZSBmcmVlemUgYml0LCBhbmQgcmVlbmFibGUgdGhlIGludGVycnVwdC4KKwkgKiBUaGUgY291bnRlcnMgd29uJ3QgYWN0dWFsbHkgc3RhcnQgdW50aWwgdGhlIHJmaSBjbGVhcnMKKwkgKiB0aGUgUE1NIGJpdCAqLworCXBtY19zdGFydF9jdHJzKCk7Cit9CisKK3N0cnVjdCBvcF9wb3dlcnBjX21vZGVsIG9wX21vZGVsXzc0NTA9IHsKKwkucmVnX3NldHVwCQk9IGZzbDc0NTBfcmVnX3NldHVwLAorCS5jcHVfc2V0dXAJCT0gZnNsNzQ1MF9jcHVfc2V0dXAsCisJLnN0YXJ0CQkJPSBmc2w3NDUwX3N0YXJ0LAorCS5zdG9wCQkJPSBmc2w3NDUwX3N0b3AsCisJLmhhbmRsZV9pbnRlcnJ1cHQJPSBmc2w3NDUwX2hhbmRsZV9pbnRlcnJ1cHQsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3Bvd2VyNC5jIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3Bvd2VyNC5jCmluZGV4IGEzNDAxYjQuLjY1OWEwMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9wb3dlcjQuYworKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfcG93ZXI0LmMKQEAgLTI1Miw3ICsyNTIsNyBAQAogCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpX192YShwYyk7CiAKIAkvKiBOb3Qgc3VyZSB3aGVyZSB3ZSB3ZXJlICovCi0JaWYgKHBjIDwgS0VSTkVMQkFTRSkKKwlpZiAoIWlzX2tlcm5lbF9hZGRyKHBjKSkKIAkJLyogZnVuY3Rpb24gZGVzY3JpcHRvciBtYWRuZXNzICovCiAJCXJldHVybiAqKCh1bnNpZ25lZCBsb25nICopa2VybmVsX3Vua25vd25fYnVja2V0KTsKIApAQCAtMjY0LDcgKzI2NCw3IEBACiAJaW50IGlzX2tlcm5lbDsKIAogCWlmICghbW1jcmFfaGFzX3NpaHYpIHsKLQkJaXNfa2VybmVsID0gKHBjID49IEtFUk5FTEJBU0UpOworCQlpc19rZXJuZWwgPSBpc19rZXJuZWxfYWRkcihwYyk7CiAJfSBlbHNlIHsKIAkJdW5zaWduZWQgbG9uZyBtbWNyYSA9IG1mc3ByKFNQUk5fTU1DUkEpOwogCQlpc19rZXJuZWwgPSAoKG1tY3JhICYgTU1DUkFfU0lQUikgPT0gMCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfcnM2NC5jIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3JzNjQuYwppbmRleCBlMDEwYjg1Li41YzkwOWVlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfcnM2NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9yczY0LmMKQEAgLTE3OCw3ICsxNzgsNiBAQAogCWludCB2YWw7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBwYyA9IG1mc3ByKFNQUk5fU0lBUik7Ci0JaW50IGlzX2tlcm5lbCA9IChwYyA+PSBLRVJORUxCQVNFKTsKIAogCS8qIHNldCB0aGUgUE1NIGJpdCAoc2VlIGNvbW1lbnQgYmVsb3cpICovCiAJbXRtc3JkKG1mbXNyKCkgfCBNU1JfUE1NKTsKQEAgLTE4Nyw3ICsxODYsNyBAQAogCQl2YWwgPSBjdHJfcmVhZChpKTsKIAkJaWYgKHZhbCA8IDApIHsKIAkJCWlmIChjdHJbaV0uZW5hYmxlZCkgewotCQkJCW9wcm9maWxlX2FkZF9wYyhwYywgaXNfa2VybmVsLCBpKTsKKwkJCQlvcHJvZmlsZV9hZGRfcGMocGMsIGlzX2tlcm5lbF9hZGRyKHBjKSwgaSk7CiAJCQkJY3RyX3dyaXRlKGksIHJlc2V0X3ZhbHVlW2ldKTsKIAkJCX0gZWxzZSB7CiAJCQkJY3RyX3dyaXRlKGksIDApOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njc1ZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcKQEAgLTAsMCArMSwyNyBAQAorbWVudSAiUGxhdGZvcm0gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBQQ184M3h4CisKK2Nob2ljZQorCXByb21wdCAiTWFjaGluZSBUeXBlIgorCWRlZmF1bHQgTVBDODM0eF9TWVMKKworY29uZmlnIE1QQzgzNHhfU1lTCisJYm9vbCAiRnJlZXNjYWxlIE1QQzgzNHggU1lTIgorCXNlbGVjdCBERUZBVUxUX1VJTUFHRQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIE1QQyA4MzR4IFNZUyBldmFsdWF0aW9uIGJvYXJkLgorCisJICBCZSBhd2FyZSB0aGF0IFBDSSBidXNlcyBjYW4gb25seSBmdW5jdGlvbiB3aGVuIFNZUyBib2FyZCBpcyBwbHVnZ2VkCisJICBpbnRvIHRoZSBQSUIgKFBsYXRmb3JtIElPIEJvYXJkKSBib2FyZCBmcm9tIEZyZWVzY2FsZSB3aGljaCBwcm92aWRlCisJICAzIFBDSSBzbG90cy4gIFRoZSBQSUJzIFBDSSBpbml0aWFsaXphdGlvbiBpcyB0aGUgYm9vdGxvYWRlcidzCisJICByZXNwb25zaWJsaWx0eS4KKworZW5kY2hvaWNlCisKK2NvbmZpZyBNUEM4MzR4CisJYm9vbAorCXNlbGVjdCBQUENfVURCR18xNjU1MAorCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCisJZGVmYXVsdCB5IGlmIE1QQzgzNHhfU1lTCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDhiMjhlZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9NYWtlZmlsZQpAQCAtMCwwICsxLDQgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBQb3dlclBDIDgzeHggbGludXgga2VybmVsLgorIworb2JqLSQoQ09ORklHX01QQzgzNHhfU1lTKQkrPSBtcGM4MzR4X3N5cy5vIHBjaS5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOThkZDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuYwpAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5jCisgKgorICogTVBDODM0eCBTWVMgYm9hcmQgc3BlY2lmaWMgcm91dGluZXMKKyAqCisgKiBNYWludGFpbmVyOiBLdW1hciBHYWxhIDxnYWxha0BrZXJuZWwuY3Jhc2hpbmcub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL2lwaWMuaD4KKyNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9tcGM4M3h4Lmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPG1tL21tdV9kZWNsLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vdWRiZy5oPgorI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisKKyNpbmNsdWRlICJtcGM4M3h4LmgiCisKKyNpZm5kZWYgQ09ORklHX1BDSQordW5zaWduZWQgbG9uZyBpc2FfaW9fYmFzZSA9IDA7Cit1bnNpZ25lZCBsb25nIGlzYV9tZW1fYmFzZSA9IDA7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ0kKK2V4dGVybiBpbnQgbXBjODN4eF9wY2kyX2J1c25vOworCitzdGF0aWMgaW50CittcGM4M3h4X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdW5zaWduZWQgY2hhciBpZHNlbCwgdW5zaWduZWQgY2hhciBwaW4pCit7CisJc3RhdGljIGNoYXIgcGNpX2lycV90YWJsZVtdWzRdID0KKwkgICAgLyoKKwkgICAgICogICAgICBQQ0kgSURTRUwvSU5UUElOLT5JTlRMSU5FCisJICAgICAqICAgICAgIEEgICAgICBCICAgICAgQyAgICAgIEQKKwkgICAgICovCisJeworCQl7UElSUUEsIFBJUlFCLCBQSVJRQywgUElSUUR9LAkvKiBpZHNlbCAweDExICovCisJCXtQSVJRQywgUElSUUQsIFBJUlFBLCBQSVJRQn0sCS8qIGlkc2VsIDB4MTIgKi8KKwkJe1BJUlFELCBQSVJRQSwgUElSUUIsIFBJUlFDfSwJLyogaWRzZWwgMHgxMyAqLworCQl7MCwgMCwgMCwgMH0sCisJCXtQSVJRQSwgUElSUUIsIFBJUlFDLCBQSVJRRH0sCS8qIGlkc2VsIDB4MTUgKi8KKwkJe1BJUlFELCBQSVJRQSwgUElSUUIsIFBJUlFDfSwJLyogaWRzZWwgMHgxNiAqLworCQl7UElSUUMsIFBJUlFELCBQSVJRQSwgUElSUUJ9LAkvKiBpZHNlbCAweDE3ICovCisJCXtQSVJRQiwgUElSUUMsIFBJUlFELCBQSVJRQX0sCS8qIGlkc2VsIDB4MTggKi8KKwkJezAsIDAsIDAsIDB9LAkJCS8qIGlkc2VsIDB4MTkgKi8KKwkJezAsIDAsIDAsIDB9LAkJCS8qIGlkc2VsIDB4MjAgKi8KKwl9OworCisJY29uc3QgbG9uZyBtaW5faWRzZWwgPSAweDExLCBtYXhfaWRzZWwgPSAweDIwLCBpcnFzX3Blcl9zbG90ID0gNDsKKwlyZXR1cm4gUENJX0lSUV9UQUJMRV9MT09LVVA7Cit9CisKK3N0YXRpYyBpbnQKK21wYzgzeHhfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQoreworCWlmIChidXMgPT0gMCAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKKwkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKKwlpZiAobXBjODN4eF9wY2kyX2J1c25vKQorCQlpZiAoYnVzID09IChtcGM4M3h4X3BjaTJfYnVzbm8pICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQorCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2V0dXAgdGhlIGFyY2hpdGVjdHVyZQorICoKKyAqLworc3RhdGljIHZvaWQgX19pbml0CittcGM4MzR4X3N5c19zZXR1cF9hcmNoKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCWlmIChwcGNfbWQucHJvZ3Jlc3MpCisJCXBwY19tZC5wcm9ncmVzcygibXBjODM0eF9zeXNfc2V0dXBfYXJjaCgpIiwgMCk7CisKKwlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJjcHUiKTsKKwlpZiAobnAgIT0gMCkgeworCQl1bnNpZ25lZCBpbnQgKmZwID0gKGludCAqKSBnZXRfcHJvcGVydHkobnAsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKKwkJaWYgKGZwICE9IDApCisJCQlsb29wc19wZXJfamlmZnkgPSAqZnAgLyBIWjsKKwkJZWxzZQorCQkJbG9vcHNfcGVyX2ppZmZ5ID0gNTAwMDAwMDAgLyBIWjsKKwkJb2Zfbm9kZV9wdXQobnApOworCX0KKworI2lmZGVmIENPTkZJR19QQ0kKKwlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspCisJCWFkZF9icmlkZ2UobnApOworCisJcHBjX21kLnBjaV9zd2l6emxlID0gY29tbW9uX3N3aXp6bGU7CisJcHBjX21kLnBjaV9tYXBfaXJxID0gbXBjODN4eF9tYXBfaXJxOworCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtcGM4M3h4X2V4Y2x1ZGVfZGV2aWNlOworI2VuZGlmCisKKyNpZmRlZiAgQ09ORklHX1JPT1RfTkZTCisJCVJPT1RfREVWID0gUm9vdF9ORlM7CisjZWxzZQorCQlST09UX0RFViA9IFJvb3RfSERBMTsKKyNlbmRpZgorfQorCit2b2lkIF9faW5pdAorbXBjODM0eF9zeXNfaW5pdF9JUlEodm9pZCkKK3sKKwl1OCBzZW5zZXNbOF0gPSB7CisJCTAsCQkJLyogRVhUIDAgKi8KKwkJSVJRX1NFTlNFX0xFVkVMLAkvKiBFWFQgMSAqLworCQlJUlFfU0VOU0VfTEVWRUwsCS8qIEVYVCAyICovCisJCTAsCQkJLyogRVhUIDMgKi8KKyNpZmRlZiBDT05GSUdfUENJCisJCUlSUV9TRU5TRV9MRVZFTCwJLyogRVhUIDQgKi8KKwkJSVJRX1NFTlNFX0xFVkVMLAkvKiBFWFQgNSAqLworCQlJUlFfU0VOU0VfTEVWRUwsCS8qIEVYVCA2ICovCisJCUlSUV9TRU5TRV9MRVZFTCwJLyogRVhUIDcgKi8KKyNlbHNlCisJCTAsCQkJLyogRVhUIDQgKi8KKwkJMCwJCQkvKiBFWFQgNSAqLworCQkwLAkJCS8qIEVYVCA2ICovCisJCTAsCQkJLyogRVhUIDcgKi8KKyNlbmRpZgorCX07CisKKwlpcGljX2luaXQoZ2V0X2ltbXJiYXNlKCkgKyAweDAwNzAwLCAwLCAwLCBzZW5zZXMsIDgpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBpbnRlcnJ1cHQgbWFwcGluZyBwcmlvcml0aWVzLAorCSAqIGluIGNhc2UgdGhlIGJvb3Qgcm9tIGNoYW5nZWQgc29tZXRoaW5nIG9uIHVzLgorCSAqLworCWlwaWNfc2V0X2RlZmF1bHRfcHJpb3JpdHkoKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX0kyQ19NUEMpICYmIGRlZmluZWQoQ09ORklHX1NFTlNPUlNfRFMxMzc0KQorZXh0ZXJuIHVsb25nCWRzMTM3NF9nZXRfcnRjX3RpbWUodm9pZCk7CitleHRlcm4gaW50CWRzMTM3NF9zZXRfcnRjX3RpbWUodWxvbmcpOworCitzdGF0aWMgaW50IF9faW5pdAorbXBjODM0eF9ydGNfaG9va3VwKHZvaWQpCit7CisJc3RydWN0IHRpbWVzcGVjCXR2OworCisJcHBjX21kLmdldF9ydGNfdGltZSA9IGRzMTM3NF9nZXRfcnRjX3RpbWU7CisJcHBjX21kLnNldF9ydGNfdGltZSA9IGRzMTM3NF9zZXRfcnRjX3RpbWU7CisKKwl0di50dl9uc2VjID0gMDsKKwl0di50dl9zZWMgPSAocHBjX21kLmdldF9ydGNfdGltZSkoKTsKKwlkb19zZXR0aW1lb2ZkYXkoJnR2KTsKKworCXJldHVybiAwOworfQorbGF0ZV9pbml0Y2FsbChtcGM4MzR4X3J0Y19ob29rdXApOworI2VuZGlmCisKK3N0YXRpYyB2b2lkCittcGM4M3h4X3Jlc3RhcnQoY2hhciAqY21kKQoreworI2RlZmluZSBSU1RfT0ZGU0VUCTB4MDAwMDA5MDAKKyNkZWZpbmUgUlNUX1BST1RfUkVHCTB4MDAwMDAwMTgKKyNkZWZpbmUgUlNUX0NUUkxfUkVHCTB4MDAwMDAwMWMKKwlfX2JlMzIgX19pb21lbSAqcmVnOworCisJLy8gbWFwIHJlc2V0IHJlZ2lzdGVyIHNwYWNlCisJcmVnID0gaW9yZW1hcChnZXRfaW1tcmJhc2UoKSArIDB4OTAwLCAweGZmKTsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwkvKiBlbmFibGUgc29mdHdhcmUgcmVzZXQgIlJTVEUiICovCisJb3V0X2JlMzIocmVnICsgKFJTVF9QUk9UX1JFRyA+PiAyKSwgMHg1MjUzNTQ0NSk7CisKKwkvKiBzZXQgc29mdHdhcmUgaGFyZCByZXNldCAqLworCW91dF9iZTMyKHJlZyArIChSU1RfQ1RSTF9SRUcgPj4gMiksIDB4NTI1MzU0NDUpOworCWZvcig7Oyk7Cit9CisKK3N0YXRpYyBsb25nIF9faW5pdAorbXBjODN4eF90aW1lX2luaXQodm9pZCkKK3sKKyNkZWZpbmUgU1BDUl9PRkZTRVQJMHgwMDAwMDExMAorI2RlZmluZSBTUENSX1RCRU4JMHgwMDQwMDAwMAorCV9fYmUzMiBfX2lvbWVtICpzcGNyID0gaW9yZW1hcChnZXRfaW1tcmJhc2UoKSArIFNQQ1JfT0ZGU0VULCA0KTsKKwlfX2JlMzIgdG1wOworCisJdG1wID0gaW5fYmUzMihzcGNyKTsKKwlvdXRfYmUzMihzcGNyLCB0bXB8U1BDUl9UQkVOKTsKKworCWlvdW5tYXAoc3Bjcik7CisKKwlyZXR1cm4gMDsKK30KK3ZvaWQgX19pbml0CitwbGF0Zm9ybV9pbml0KHZvaWQpCit7CisJLyogc2V0dXAgdGhlIFBvd2VyUEMgbW9kdWxlIHN0cnVjdCAqLworCXBwY19tZC5zZXR1cF9hcmNoID0gbXBjODM0eF9zeXNfc2V0dXBfYXJjaDsKKworCXBwY19tZC5pbml0X0lSUSA9IG1wYzgzNHhfc3lzX2luaXRfSVJROworCXBwY19tZC5nZXRfaXJxID0gaXBpY19nZXRfaXJxOworCisJcHBjX21kLnJlc3RhcnQgPSBtcGM4M3h4X3Jlc3RhcnQ7CisKKwlwcGNfbWQudGltZV9pbml0ID0gbXBjODN4eF90aW1lX2luaXQ7CisJcHBjX21kLnNldF9ydGNfdGltZSA9IE5VTEw7CisJcHBjX21kLmdldF9ydGNfdGltZSA9IE5VTEw7CisJcHBjX21kLmNhbGlicmF0ZV9kZWNyID0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjcjsKKworCXBwY19tZC5wcm9ncmVzcyA9IHVkYmdfcHJvZ3Jlc3M7CisKKwlpZiAocHBjX21kLnByb2dyZXNzKQorCQlwcGNfbWQucHJvZ3Jlc3MoIm1wYzgzNHhfc3lzX2luaXQoKTogZXhpdCIsIDApOworCisJcmV0dXJuOworfQorCisKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfc3lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRjYTM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBhcmNoL3Bvd2VycHBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfc3lzLmgKKyAqCisgKiBNUEM4MzRYIFNZUyBjb21tb24gYm9hcmQgZGVmaW5pdGlvbnMKKyAqCisgKiBNYWludGFpbmVyOiBLdW1hciBHYWxhIDxnYWxha0BrZXJuZWwuY3Jhc2hpbmcub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX19NQUNIX01QQzgzWFhfU1lTX0hfXworI2RlZmluZSBfX01BQ0hfTVBDODNYWF9TWVNfSF9fCisKKyNkZWZpbmUgUElSUUEJTVBDODN4eF9JUlFfRVhUNAorI2RlZmluZSBQSVJRQglNUEM4M3h4X0lSUV9FWFQ1CisjZGVmaW5lIFBJUlFDCU1QQzgzeHhfSVJRX0VYVDYKKyNkZWZpbmUgUElSUUQJTVBDODN4eF9JUlFfRVhUNworCisjZW5kaWYgICAgICAgICAgICAgICAgLyogX19NQUNIX01QQzgzWFhfU1lTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzeHguaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4M3h4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U5ZTY2YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4M3h4LmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfX01QQzgzWFhfSF9fCisjZGVmaW5lIF9fTVBDODNYWF9IX18KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworLyoKKyAqIERlY2xhcmF0aW9uIGZvciB0aGUgdmFyaW91cyBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgdGhlCisgKiBtcGM4M3h4XyogZmlsZXMuIE1vc3RseSBmb3IgdXNlIGJ5IG1wYzgzeHhfc2V0dXAKKyAqLworCitleHRlcm4gaW50IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOworCisjZW5kaWYgLyogX19NUEM4M1hYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OWNkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvcGNpLmMKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIEZTTCBTb0Mgc2V0dXAgY29kZQorICoKKyAqIE1haW50YWluZWQgYnkgS3VtYXIgR2FsYSAoc2VlIE1BSU5UQUlORVJTIGZvciBjb250YWN0IGluZm9ybWF0aW9uKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgorCisjdW5kZWYgREVCVUcKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERCRyh4Li4uKSBwcmludGsoeCkKKyNlbHNlCisjZGVmaW5lIERCRyh4Li4uKQorI2VuZGlmCisKK2ludCBtcGM4M3h4X3BjaTJfYnVzbm87CisKKyNpZmRlZiBDT05GSUdfUENJCitpbnQgX19pbml0IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCit7CisJaW50IGxlbjsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CisJc3RydWN0IHJlc291cmNlIHJzcmM7CisJaW50ICpidXNfcmFuZ2U7CisJaW50IHByaW1hcnkgPSAxLCBoYXNfYWRkcmVzcyA9IDA7CisJcGh5c19hZGRyX3QgaW1tciA9IGdldF9pbW1yYmFzZSgpOworCisJREJHKCJBZGRpbmcgUENJIGhvc3QgYnJpZGdlICVzXG4iLCBkZXYtPmZ1bGxfbmFtZSk7CisKKwkvKiBGZXRjaCBob3N0IGJyaWRnZSByZWdpc3RlcnMgYWRkcmVzcyAqLworCWhhc19hZGRyZXNzID0gKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZGV2LCAwLCAmcnNyYykgPT0gMCk7CisKKwkvKiBHZXQgYnVzIHJhbmdlIGlmIGFueSAqLworCWJ1c19yYW5nZSA9IChpbnQgKikgZ2V0X3Byb3BlcnR5KGRldiwgImJ1cy1yYW5nZSIsICZsZW4pOworCWlmIChidXNfcmFuZ2UgPT0gTlVMTCB8fCBsZW4gPCAyICogc2l6ZW9mKGludCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgZ2V0IGJ1cy1yYW5nZSBmb3IgJXMsIGFzc3VtZSIKKwkJICAgICAgICIgYnVzIDBcbiIsIGRldi0+ZnVsbF9uYW1lKTsKKwl9CisKKwlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7CisJaWYgKCFob3NlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlob3NlLT5hcmNoX2RhdGEgPSBkZXY7CisJaG9zZS0+c2V0X2NmZ190eXBlID0gMTsKKworCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzBdIDogMDsKKwlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZjsKKworCS8qIE1QQzgzeHggc3VwcG9ydHMgdXAgdG8gdHdvIGhvc3QgY29udHJvbGxlcnMgb25lIGF0IDB4ODUwMCBmcm9tIGltbXJiYXIKKwkgKiB0aGUgb3RoZXIgYXQgMHg4NjAwLCB3ZSBjb25zaWRlciB0aGUgMHg4NTAwIHRoZSBwcmltYXJ5IGNvbnRyb2xsZXIKKwkgKi8KKwkvKiBQQ0kgMSAqLworCWlmICgocnNyYy5zdGFydCAmIDB4ZmZmZmYpID09IDB4ODUwMCkgeworCQlzZXR1cF9pbmRpcmVjdF9wY2koaG9zZSwgaW1tciArIDB4ODMwMCwgaW1tciArIDB4ODMwNCk7CisJfQorCS8qIFBDSSAyKi8KKwlpZiAoKHJzcmMuc3RhcnQgJiAweGZmZmZmKSA9PSAweDg2MDApIHsKKwkJc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsIGltbXIgKyAweDgzODAsIGltbXIgKyAweDgzODQpOworCQlwcmltYXJ5ID0gMDsKKwkJaG9zZS0+YnVzX29mZnNldCA9IGhvc2UtPmZpcnN0X2J1c25vOworCQltcGM4M3h4X3BjaTJfYnVzbm8gPSBob3NlLT5maXJzdF9idXNubzsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBNUEM4M3h4IFBDSSBob3N0IGJyaWRnZSBhdCAweCUwOGx4LiAiCisJICAgICAgICJGaXJtd2FyZSBidXMgbnVtYmVyOiAlZC0+JWRcbiIsCisJCXJzcmMuc3RhcnQsIGhvc2UtPmZpcnN0X2J1c25vLCBob3NlLT5sYXN0X2J1c25vKTsKKworCURCRygiIC0+SG9zZSBhdCAweCVwLCBjZmdfYWRkcj0weCVwLGNmZ19kYXRhPTB4JXBcbiIsCisJCWhvc2UsIGhvc2UtPmNmZ19hZGRyLCBob3NlLT5jZmdfZGF0YSk7CisKKwkvKiBJbnRlcnByZXQgdGhlICJyYW5nZXMiIHByb3BlcnR5ICovCisJLyogVGhpcyBhbHNvIG1hcHMgdGhlIEkvTyByZWdpb24gYW5kIHNldHMgaXNhX2lvL21lbV9iYXNlICovCisJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3Jhbmdlcyhob3NlLCBkZXYsIHByaW1hcnkpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvTWFrZWZpbGUKaW5kZXggODgzNmIzYS4uMDQwNzNmZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL01ha2VmaWxlCkBAIC03LDYgKzcsNyBAQAogZW5kaWYKIG9iai0kKENPTkZJR19QUENfQ0hSUCkJCSs9IGNocnAvCiBvYmotJChDT05GSUdfNHh4KQkJKz0gNHh4Lworb2JqLSQoQ09ORklHX1BQQ184M3h4KQkJKz0gODN4eC8KIG9iai0kKENPTkZJR184NXh4KQkJKz0gODV4eC8KIG9iai0kKENPTkZJR19QUENfUFNFUklFUykJKz0gcHNlcmllcy8KIG9iai0kKENPTkZJR19QUENfSVNFUklFUykJKz0gaXNlcmllcy8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1NzA3MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9LY29uZmlnCkBAIC0wLDAgKzEsMTMgQEAKK21lbnUgIkNlbGwgQnJvYWRiYW5kIEVuZ2luZSBvcHRpb25zIgorCWRlcGVuZHMgb24gUFBDX0NFTEwKKworY29uZmlnIFNQVV9GUworCXRyaXN0YXRlICJTUFUgZmlsZSBzeXN0ZW0iCisJZGVmYXVsdCBtCisJZGVwZW5kcyBvbiBQUENfQ0VMTAorCWhlbHAKKwkgIFRoZSBTUFUgZmlsZSBzeXN0ZW0gaXMgdXNlZCB0byBhY2Nlc3MgU3luZXJnaXN0aWMgUHJvY2Vzc2luZworCSAgVW5pdHMgb24gbWFjaGluZXMgaW1wbGVtZW50aW5nIHRoZSBCcm9hZGJhbmQgUHJvY2Vzc29yCisJICBBcmNoaXRlY3R1cmUuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9NYWtlZmlsZQppbmRleCA1NWUwOTRiLi4xNjAzMWI1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL01ha2VmaWxlCkBAIC0xLDIgKzEsMTAgQEAKIG9iai15CQkJKz0gaW50ZXJydXB0Lm8gaW9tbXUubyBzZXR1cC5vIHNwaWRlci1waWMubworb2JqLXkJCQkrPSBwZXJ2YXNpdmUubworCiBvYmotJChDT05GSUdfU01QKQkrPSBzbXAubworb2JqLSQoQ09ORklHX1NQVV9GUykJKz0gc3B1ZnMvIHNwdS1iYXNlLm8KKworc3B1LWJhc2UteQkJKz0gc3B1X2Jhc2UubyBzcHVfcHJpdjEubworCitidWlsdGluLXNwdWZzLSQoQ09ORklHX1NQVV9GUykJKz0gc3B1X3N5c2NhbGxzLm8KK29iai15CQkJKz0gJChidWlsdGluLXNwdWZzLW0pCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmMKaW5kZXggN2ZiZTc4YS4uNjNhYTUyYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKQEAgLTU1LDYgKzU2LDcgQEAKIAogc3RydWN0IGlpYyB7CiAJc3RydWN0IGlpY19yZWdzIF9faW9tZW0gKnJlZ3M7CisJdTggdGFyZ2V0X2lkOwogfTsKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBpaWMsIGlpYyk7CkBAIC0xNzIsMTIgKzE3NCwxMSBAQAogCXJldHVybiBpcnE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaWljX3JlZ3MgX19pb21lbSAqZmluZF9paWMoaW50IGNwdSkKK3N0YXRpYyBpbnQgc2V0dXBfaWljKGludCBjcHUsIHN0cnVjdCBpaWMgKmlpYykKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCWludCBub2RlaWQgPSBjcHUgLyAyOwogCXVuc2lnbmVkIGxvbmcgcmVnczsKLQlzdHJ1Y3QgaWljX3JlZ3MgX19pb21lbSAqaWljX3JlZ3M7CiAKIAlmb3IgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgImNwdSIpOwogCSAgICAgbnA7CkBAIC0xODgsMjAgKzE4OSwyMyBAQAogCiAJaWYgKCFucCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJJSUM6IENQVSAlZCBub3QgZm91bmRcbiIsIGNwdSk7Ci0JCWlpY19yZWdzID0gTlVMTDsKLQl9IGVsc2UgewotCQlyZWdzID0gKihsb25nICopZ2V0X3Byb3BlcnR5KG5wLCAiaWljIiwgTlVMTCk7Ci0KLQkJLyogaGFjayB1bnRpbCB3ZSBoYXZlIGRlY2lkZWQgb24gdGhlIGRldnRyZWUgaW5mbyAqLwotCQlyZWdzICs9IDB4NDAwOwotCQlpZiAoY3B1ICYgMSkKLQkJCXJlZ3MgKz0gMHgyMDsKLQotCQlwcmludGsoS0VSTl9ERUJVRyAiSUlDIGZvciBDUFUgJWQgYXQgJWx4XG4iLCBjcHUsIHJlZ3MpOwotCQlpaWNfcmVncyA9IF9faW9yZW1hcChyZWdzLCBzaXplb2Yoc3RydWN0IGlpY19yZWdzKSwKLQkJCQkJCSBfUEFHRV9OT19DQUNIRSk7CisJCWlpYy0+cmVncyA9IE5VTEw7CisJCWlpYy0+dGFyZ2V0X2lkID0gMHhmZjsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCXJldHVybiBpaWNfcmVnczsKKworCXJlZ3MgPSAqKGxvbmcgKilnZXRfcHJvcGVydHkobnAsICJpaWMiLCBOVUxMKTsKKworCS8qIGhhY2sgdW50aWwgd2UgaGF2ZSBkZWNpZGVkIG9uIHRoZSBkZXZ0cmVlIGluZm8gKi8KKwlyZWdzICs9IDB4NDAwOworCWlmIChjcHUgJiAxKQorCQlyZWdzICs9IDB4MjA7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiSUlDIGZvciBDUFUgJWQgYXQgJWx4XG4iLCBjcHUsIHJlZ3MpOworCWlpYy0+cmVncyA9IF9faW9yZW1hcChyZWdzLCBzaXplb2Yoc3RydWN0IGlpY19yZWdzKSwKKwkJCQkJIF9QQUdFX05PX0NBQ0hFKTsKKwlpaWMtPnRhcmdldF9pZCA9IChub2RlaWQgPDwgNCkgKyAoKGNwdSAmIDEpID8gMHhmIDogMHhlKTsKKwlyZXR1cm4gMDsKIH0KIAogI2lmZGVmIENPTkZJR19TTVAKQEAgLTIyNyw2ICsyMzEsMTIgQEAKIAlvdXRfYmU2NCgmcGVyX2NwdShpaWMsIGNwdSkucmVncy0+Z2VuZXJhdGUsIChJSUNfTlVNX0lQSVMgLSAxIC0gbWVzZykgPDwgNCk7CiB9CiAKK3U4IGlpY19nZXRfdGFyZ2V0X2lkKGludCBjcHUpCit7CisJcmV0dXJuIHBlcl9jcHUoaWljLCBjcHUpLnRhcmdldF9pZDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlpY19nZXRfdGFyZ2V0X2lkKTsKKwogc3RhdGljIGlycXJldHVybl90IGlpY19pcGlfYWN0aW9uKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc21wX21lc3NhZ2VfcmVjdihpaWNfaXJxX3RvX2lwaShpcnEpLCByZWdzKTsKQEAgLTI3Niw3ICsyODYsNyBAQAogCWlycV9vZmZzZXQgPSAwOwogCWZvcl9lYWNoX2NwdShjcHUpIHsKIAkJaWljID0gJnBlcl9jcHUoaWljLCBjcHUpOwotCQlpaWMtPnJlZ3MgPSBmaW5kX2lpYyhjcHUpOworCQlzZXR1cF9paWMoY3B1LCBpaWMpOwogCQlpZiAoaWljLT5yZWdzKQogCQkJb3V0X2JlNjQoJmlpYy0+cmVncy0+cHJpbywgMHhmZik7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5oCmluZGV4IDM3ZDU4ZTYuLmExNGJkMzggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmgKQEAgLTU0LDYgKzU0LDcgQEAKIGV4dGVybiB2b2lkIGlpY19sb2NhbF9lbmFibGUodm9pZCk7CiBleHRlcm4gdm9pZCBpaWNfbG9jYWxfZGlzYWJsZSh2b2lkKTsKIAorZXh0ZXJuIHU4IGlpY19nZXRfdGFyZ2V0X2lkKGludCBjcHUpOwogCiBleHRlcm4gdm9pZCBzcGlkZXJfaW5pdF9JUlEodm9pZCk7CiBleHRlcm4gaW50IHNwaWRlcl9nZXRfaXJxKHVuc2lnbmVkIGxvbmcgaW50X3BlbmRpbmcpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYwppbmRleCA3NGY5OTliLi40NmU3Y2I5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYwpAQCAtMjksNiArMjksOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KIAogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9pb21tdS5oPgpAQCAtNDAsNiArNDIsNyBAQAogI2luY2x1ZGUgPGFzbS9hYnNfYWRkci5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgorI2luY2x1ZGUgPGFzbS91ZGJnLmg+CiAKICNpbmNsdWRlICJpb21tdS5oIgogCkBAIC0yMjAsOCArMjIzLDYgQEAKIHsKIAl1bnNpZ25lZCBsb25nIF9faW9tZW0gKnRhZ3MgPSBiYXNlICsgSU9DX1BUX0NBQ0hFX0RJUjsKIAl1bnNpZ25lZCBsb25nIF9faW9tZW0gKnAgPSBiYXNlICsgSU9DX1BUX0NBQ0hFX1JFRzsKLQlwcl9kZWJ1ZygiaW9wdCAlMDJseCB3YXMgdiUwMTZseC90JTAxNmx4LCBzdG9yZSB2JTAxNmx4L3QlMDE2bHhcbiIsCi0JCWluZGV4LCBnZXRfaW9wdF9jYWNoZShiYXNlLCBpbmRleCwgJm9sZHRhZyksIG9sZHRhZywgdmFsLCB0YWcpOwogCiAJb3V0X2JlNjQocCwgdmFsKTsKIAlvdXRfYmU2NCgmdGFnc1tpbmRleF0sIHRhZyk7CkBAIC0yNDgsNjYgKzI0OSwxNzUgQEAKIAlvdXRfYmU2NChwLCBjb25mIHwgSU9DTURfQ09ORl9URSk7CiB9CiAKLS8qIEZJWE1FOiBnZXQgdGhlc2UgZnJvbSB0aGUgZGV2aWNlIHRyZWUgKi8KLSNkZWZpbmUgaW9jX2Jhc2UJMHgyMDAwMDUxMTAwMHVsbAotI2RlZmluZSBpb2NfbW1pb19iYXNlCTB4MjAwMDA1MTAwMDB1bGwKLSNkZWZpbmUgaW9pZAkJMHg0OGEKLSNkZWZpbmUgaW9wdF9waHlzX29mZnNldCAoLSAweDIwMDAwMDAwKSAvKiBXZSBoYXZlIGEgNTEyTUIgb2Zmc2V0IGZyb20gdGhlIFNCICovCi0jZGVmaW5lIGlvX3BhZ2Vfc2l6ZQkweDEwMDAwMDAKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFwX2lvcHRfZW50cnkodW5zaWduZWQgbG9uZyBhZGRyZXNzKQorc3RhdGljIHZvaWQgZW5hYmxlX21hcHBpbmcodm9pZCBfX2lvbWVtICpiYXNlLCB2b2lkIF9faW9tZW0gKm1taW9fYmFzZSkKIHsKLQlzd2l0Y2ggKGFkZHJlc3MgPj4gMjApIHsKLQljYXNlIDB4NjAwOgotCQlhZGRyZXNzID0gMHgyNDAyMDAwMDAwMHVsbDsgLyogc3BpZGVyIGkvbyAqLwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlhZGRyZXNzICs9IGlvcHRfcGh5c19vZmZzZXQ7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBnZXRfaW9wdF9lbnRyeShhZGRyZXNzLCBpb2lkLCBJT1BUX1BST1RfUlcpOworCXNldF9pb2NtZF9jb25maWcoYmFzZSk7CisJc2V0X2lvc3Rfb3JpZ2luKG1taW9fYmFzZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGlvbW11X2J1c19zZXR1cF9udWxsKHN0cnVjdCBwY2lfYnVzICpiKSB7IH0KIHN0YXRpYyB2b2lkIGlvbW11X2Rldl9zZXR1cF9udWxsKHN0cnVjdCBwY2lfZGV2ICpkKSB7IH0KK3N0YXRpYyB2b2lkIGlvbW11X2J1c19zZXR1cF9udWxsKHN0cnVjdCBwY2lfYnVzICpiKSB7IH0KKworc3RydWN0IGNlbGxfaW9tbXUgeworCXVuc2lnbmVkIGxvbmcgYmFzZTsKKwl1bnNpZ25lZCBsb25nIG1taW9fYmFzZTsKKwl2b2lkIF9faW9tZW0gKm1hcHBlZF9iYXNlOworCXZvaWQgX19pb21lbSAqbWFwcGVkX21taW9fYmFzZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2VsbF9pb21tdSBjZWxsX2lvbW11c1tOUl9DUFVTXTsKIAogLyogaW5pdGlhbGl6ZSB0aGUgaW9tbXUgdG8gc3VwcG9ydCBhIHNpbXBsZSBsaW5lYXIgbWFwcGluZwogICogZm9yIGVhY2ggRE1BIHdpbmRvdyB1c2VkIGJ5IGFueSBkZXZpY2UuIEZvciBub3csIHdlCiAgKiBoYXBwZW4gdG8ga25vdyB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIERNQSB3aW5kb3cgaW4gdXNlLAogICogc3RhcnRpbmcgYXQgaW9wdF9waHlzX29mZnNldC4gKi8KLXN0YXRpYyB2b2lkIGNlbGxfbWFwX2lvbW11KHZvaWQpCitzdGF0aWMgdm9pZCBjZWxsX2RvX21hcF9pb21tdShzdHJ1Y3QgY2VsbF9pb21tdSAqaW9tbXUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgaW9pZCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbWFwX3N0YXJ0LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBtYXBfc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0Jdm9pZCBfX2lvbWVtICpiYXNlOworCXVuc2lnbmVkIGxvbmcgaW9fYWRkcmVzcywgcmVhbF9hZGRyZXNzOworCXZvaWQgX19pb21lbSAqaW9jX2Jhc2UsICppb2NfbW1pb19iYXNlOwogCWlvc3RlIGlvc3RlOwogCXVuc2lnbmVkIGxvbmcgaW5kZXg7CiAKLQliYXNlID0gX19pb3JlbWFwKGlvY19iYXNlLCAweDEwMDAsIF9QQUdFX05PX0NBQ0hFKTsKLQlwcl9kZWJ1ZygiJWx4IG1hcHBlZCB0byAlcFxuIiwgaW9jX2Jhc2UsIGJhc2UpOwotCXNldF9pb2NtZF9jb25maWcoYmFzZSk7Ci0JaW91bm1hcChiYXNlKTsKKwkvKiB3ZSBwcmV0ZW5kIHRoZSBpbyBwYWdlIHRhYmxlIHdhcyBhdCBhIHZlcnkgaGlnaCBhZGRyZXNzICovCisJY29uc3QgdW5zaWduZWQgbG9uZyBmYWtlX2lvcHQgPSAweDEwMDAwMDAwMDAwdWw7CisJY29uc3QgdW5zaWduZWQgbG9uZyBpb19wYWdlX3NpemUgPSAweDEwMDAwMDA7IC8qIHVzZSAxNk0gcGFnZXMgKi8KKwljb25zdCB1bnNpZ25lZCBsb25nIGlvX3NlZ21lbnRfc2l6ZSA9IDB4MTAwMDAwMDA7IC8qIDI1Nk0gKi8KIAotCWJhc2UgPSBfX2lvcmVtYXAoaW9jX21taW9fYmFzZSwgMHgxMDAwLCBfUEFHRV9OT19DQUNIRSk7Ci0JcHJfZGVidWcoIiVseCBtYXBwZWQgdG8gJXBcbiIsIGlvY19tbWlvX2Jhc2UsIGJhc2UpOworCWlvY19iYXNlID0gaW9tbXUtPm1hcHBlZF9iYXNlOworCWlvY19tbWlvX2Jhc2UgPSBpb21tdS0+bWFwcGVkX21taW9fYmFzZTsKIAotCXNldF9pb3N0X29yaWdpbihiYXNlKTsKLQotCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPCAweDEwMDAwMDAwMHVsOyBhZGRyZXNzICs9IGlvX3BhZ2Vfc2l6ZSkgewotCQlpb3N0ZSA9IGdldF9pb3N0X2VudHJ5KDB4MTAwMDAwMDAwMDB1bCwgYWRkcmVzcywgaW9fcGFnZV9zaXplKTsKLQkJaWYgKChhZGRyZXNzICYgMHhmZmZmZmZmKSA9PSAwKSAvKiBzZWdtZW50IHN0YXJ0ICovCi0JCQlzZXRfaW9zdF9jYWNoZShiYXNlLCBhZGRyZXNzID4+IDI4LCBpb3N0ZSk7Ci0JCWluZGV4ID0gZ2V0X2lvY19oYXNoXzF3YXkoaW9zdGUsIGFkZHJlc3MpOworCWZvciAocmVhbF9hZGRyZXNzID0gMCwgaW9fYWRkcmVzcyA9IDA7CisJICAgICBpb19hZGRyZXNzIDw9IG1hcF9zdGFydCArIG1hcF9zaXplOworCSAgICAgcmVhbF9hZGRyZXNzICs9IGlvX3BhZ2Vfc2l6ZSwgaW9fYWRkcmVzcyArPSBpb19wYWdlX3NpemUpIHsKKwkJaW9zdGUgPSBnZXRfaW9zdF9lbnRyeShmYWtlX2lvcHQsIGlvX2FkZHJlc3MsIGlvX3BhZ2Vfc2l6ZSk7CisJCWlmICgocmVhbF9hZGRyZXNzICUgaW9fc2VnbWVudF9zaXplKSA9PSAwKSAvKiBzZWdtZW50IHN0YXJ0ICovCisJCQlzZXRfaW9zdF9jYWNoZShpb2NfbW1pb19iYXNlLAorCQkJCSAgICAgICBpb19hZGRyZXNzID4+IDI4LCBpb3N0ZSk7CisJCWluZGV4ID0gZ2V0X2lvY19oYXNoXzF3YXkoaW9zdGUsIGlvX2FkZHJlc3MpOwogCQlwcl9kZWJ1ZygiYWRkciAlMDhseCwgaW5kZXggJTAybHgsIGlvc3RlICUwMTZseFxuIiwKLQkJCQkJIGFkZHJlc3MsIGluZGV4LCBpb3N0ZS52YWwpOwotCQlzZXRfaW9wdF9jYWNoZShiYXNlLAotCQkJZ2V0X2lvY19oYXNoXzF3YXkoaW9zdGUsIGFkZHJlc3MpLAotCQkJZ2V0X2lvY190YWcoaW9zdGUsIGFkZHJlc3MpLAotCQkJbWFwX2lvcHRfZW50cnkoYWRkcmVzcykpOworCQkJCQkgaW9fYWRkcmVzcywgaW5kZXgsIGlvc3RlLnZhbCk7CisJCXNldF9pb3B0X2NhY2hlKGlvY19tbWlvX2Jhc2UsCisJCQlnZXRfaW9jX2hhc2hfMXdheShpb3N0ZSwgaW9fYWRkcmVzcyksCisJCQlnZXRfaW9jX3RhZyhpb3N0ZSwgaW9fYWRkcmVzcyksCisJCQlnZXRfaW9wdF9lbnRyeShyZWFsX2FkZHJlc3MtbWFwX3N0YXJ0LCBpb2lkLCBJT1BUX1BST1RfUlcpKTsKIAl9Ci0JaW91bm1hcChiYXNlKTsKIH0KIAorc3RhdGljIHZvaWQgaW9tbXVfZGV2bm9kZV9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKmQpCit7CisJdW5zaWduZWQgaW50ICppb2lkOworCXVuc2lnbmVkIGxvbmcgKmRtYV93aW5kb3csIG1hcF9zdGFydCwgbWFwX3NpemUsIHRva2VuOworCXN0cnVjdCBjZWxsX2lvbW11ICppb21tdTsKKworCWlvaWQgPSAodW5zaWduZWQgaW50ICopZ2V0X3Byb3BlcnR5KGQsICJpb2lkIiwgTlVMTCk7CisJaWYgKCFpb2lkKQorCQlwcl9kZWJ1ZygiTm8gaW9pZCBlbnRyeSBmb3VuZCAhXG4iKTsKKworCWRtYV93aW5kb3cgPSAodW5zaWduZWQgbG9uZyAqKWdldF9wcm9wZXJ0eShkLCAiaWJtLGRtYS13aW5kb3ciLCBOVUxMKTsKKwlpZiAoIWRtYV93aW5kb3cpCisJCXByX2RlYnVnKCJObyBpYm0sZG1hLXdpbmRvdyBlbnRyeSBmb3VuZCAhXG4iKTsKKworCW1hcF9zdGFydCA9IGRtYV93aW5kb3dbMV07CisJbWFwX3NpemUgPSBkbWFfd2luZG93WzJdOworCXRva2VuID0gZG1hX3dpbmRvd1swXSA+PiAzMjsKKworCWlvbW11ID0gJmNlbGxfaW9tbXVzW3Rva2VuXTsKKworCWNlbGxfZG9fbWFwX2lvbW11KGlvbW11LCAqaW9pZCwgbWFwX3N0YXJ0LCBtYXBfc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGlvbW11X2J1c19zZXR1cChzdHJ1Y3QgcGNpX2J1cyAqYikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmQgPSAoc3RydWN0IGRldmljZV9ub2RlICopYi0+c3lzZGF0YTsKKwlpb21tdV9kZXZub2RlX3NldHVwKGQpOworfQorCisKK3N0YXRpYyBpbnQgY2VsbF9tYXBfaW9tbXVfaGFyZGNvZGVkKGludCBudW1fbm9kZXMpCit7CisJc3RydWN0IGNlbGxfaW9tbXUgKmlvbW11ID0gTlVMTDsKKworCXByX2RlYnVnKCIlcyglZCk6IFVzaW5nIGhhcmRjb2RlZCBkZWZhdWx0c1xuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisKKwkvKiBub2RlIDAgKi8KKwlpb21tdSA9ICZjZWxsX2lvbW11c1swXTsKKwlpb21tdS0+bWFwcGVkX2Jhc2UgPSBfX2lvcmVtYXAoMHgyMDAwMDUxMTAwMCwgMHgxMDAwLCBfUEFHRV9OT19DQUNIRSk7CisJaW9tbXUtPm1hcHBlZF9tbWlvX2Jhc2UgPSBfX2lvcmVtYXAoMHgyMDAwMDUxMDAwMCwgMHgxMDAwLCBfUEFHRV9OT19DQUNIRSk7CisKKwllbmFibGVfbWFwcGluZyhpb21tdS0+bWFwcGVkX2Jhc2UsIGlvbW11LT5tYXBwZWRfbW1pb19iYXNlKTsKKworCWNlbGxfZG9fbWFwX2lvbW11KGlvbW11LCAweDA0OGEsCisJCQkgIDB4MjAwMDAwMDB1bCwweDIwMDAwMDAwdWwpOworCisJaWYgKG51bV9ub2RlcyA8IDIpCisJCXJldHVybiAwOworCisJLyogbm9kZSAxICovCisJaW9tbXUgPSAmY2VsbF9pb21tdXNbMV07CisJaW9tbXUtPm1hcHBlZF9iYXNlID0gX19pb3JlbWFwKDB4MzAwMDA1MTEwMDAsIDB4MTAwMCwgX1BBR0VfTk9fQ0FDSEUpOworCWlvbW11LT5tYXBwZWRfbW1pb19iYXNlID0gX19pb3JlbWFwKDB4MzAwMDA1MTAwMDAsIDB4MTAwMCwgX1BBR0VfTk9fQ0FDSEUpOworCisJZW5hYmxlX21hcHBpbmcoaW9tbXUtPm1hcHBlZF9iYXNlLCBpb21tdS0+bWFwcGVkX21taW9fYmFzZSk7CisKKwljZWxsX2RvX21hcF9pb21tdShpb21tdSwgMHgwNDhhLAorCQkJICAweDIwMDAwMDAwLDB4MjAwMDAwMDB1bCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGNlbGxfbWFwX2lvbW11KHZvaWQpCit7CisJdW5zaWduZWQgaW50IG51bV9ub2RlcyA9IDAsICpub2RlX2lkOworCXVuc2lnbmVkIGxvbmcgKmJhc2UsICptbWlvX2Jhc2U7CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKKwlzdHJ1Y3QgY2VsbF9pb21tdSAqaW9tbXUgPSBOVUxMOworCisJLyogZGV0ZXJtaW5lIG51bWJlciBvZiBub2RlcyAoPWlvbW11cykgKi8KKwlwcl9kZWJ1ZygiJXMoJWQpOiBkZXRlcm1pbmluZyBudW1iZXIgb2Ygbm9kZXMuLi4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKwlmb3IoZG4gPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiY3B1Iik7CisJICAgIGRuOworCSAgICBkbiA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKGRuLCAiY3B1IikpIHsKKwkJbm9kZV9pZCA9ICh1bnNpZ25lZCBpbnQgKilnZXRfcHJvcGVydHkoZG4sICJub2RlLWlkIiwgTlVMTCk7CisKKwkJaWYgKG51bV9ub2RlcyA8ICpub2RlX2lkKQorCQkJbnVtX25vZGVzID0gKm5vZGVfaWQ7CisJCX0KKworCW51bV9ub2RlcysrOworCXByX2RlYnVnKCIlaSBmb3VuZC5cbiIsIG51bV9ub2Rlcyk7CisKKwkvKiBtYXAgdGhlIGlvbW11IHJlZ2lzdGVycyBmb3IgZWFjaCBub2RlICovCisJcHJfZGVidWcoIiVzKCVkKTogTG9vcGluZyB0aHJvdWdoIG5vZGVzXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKwlmb3IoZG4gPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiY3B1Iik7CisJICAgIGRuOworCSAgICBkbiA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKGRuLCAiY3B1IikpIHsKKworCQlub2RlX2lkID0gKHVuc2lnbmVkIGludCAqKWdldF9wcm9wZXJ0eShkbiwgIm5vZGUtaWQiLCBOVUxMKTsKKwkJYmFzZSA9ICh1bnNpZ25lZCBsb25nICopZ2V0X3Byb3BlcnR5KGRuLCAiaW9jLWNhY2hlIiwgTlVMTCk7CisJCW1taW9fYmFzZSA9ICh1bnNpZ25lZCBsb25nICopZ2V0X3Byb3BlcnR5KGRuLCAiaW9jLXRyYW5zbGF0aW9uIiwgTlVMTCk7CisKKwkJaWYgKCFiYXNlIHx8ICFtbWlvX2Jhc2UgfHwgIW5vZGVfaWQpCisJCQlyZXR1cm4gY2VsbF9tYXBfaW9tbXVfaGFyZGNvZGVkKG51bV9ub2Rlcyk7CisKKwkJaW9tbXUgPSAmY2VsbF9pb21tdXNbKm5vZGVfaWRdOworCQlpb21tdS0+YmFzZSA9ICpiYXNlOworCQlpb21tdS0+bW1pb19iYXNlID0gKm1taW9fYmFzZTsKKworCQlpb21tdS0+bWFwcGVkX2Jhc2UgPSBfX2lvcmVtYXAoKmJhc2UsIDB4MTAwMCwgX1BBR0VfTk9fQ0FDSEUpOworCQlpb21tdS0+bWFwcGVkX21taW9fYmFzZSA9IF9faW9yZW1hcCgqbW1pb19iYXNlLCAweDEwMDAsIF9QQUdFX05PX0NBQ0hFKTsKKworCQllbmFibGVfbWFwcGluZyhpb21tdS0+bWFwcGVkX2Jhc2UsCisJCQkgICAgICAgaW9tbXUtPm1hcHBlZF9tbWlvX2Jhc2UpOworCisJCS8qIGV2ZXJ5dGhpbmcgZWxzZSB3aWxsIGJlIGRvbmUgaW4gaW9tbXVfYnVzX3NldHVwICovCisJfQorCisJcmV0dXJuIDE7Cit9CiAKIHN0YXRpYyB2b2lkICpjZWxsX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzaXplX3Qgc2l6ZSwKIAkJCSAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWcpCkBAIC0zNjUsMTEgKzQ3NSwyOCBAQAogCiB2b2lkIGNlbGxfaW5pdF9pb21tdSh2b2lkKQogewotCWNlbGxfbWFwX2lvbW11KCk7CisJaW50IHNldHVwX2J1cyA9IDA7CiAKLQkvKiBEaXJlY3QgSS9PLCBJT01NVSBvZmYgKi8KLQlwcGNfbWQuaW9tbXVfZGV2X3NldHVwID0gaW9tbXVfZGV2X3NldHVwX251bGw7Ci0JcHBjX21kLmlvbW11X2J1c19zZXR1cCA9IGlvbW11X2J1c19zZXR1cF9udWxsOworCWlmIChvZl9maW5kX25vZGVfYnlfcGF0aCgiL21hbWJvIikpIHsKKwkJcHJfaW5mbygiTm90IHVzaW5nIGlvbW11IG9uIHN5c3RlbXNpbVxuIik7CisJfSBlbHNlIHsKKworCQlpZiAoIShvZl9jaG9zZW4gJiYKKwkJICAgICAgZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LGlvbW11LW9mZiIsIE5VTEwpKSkKKwkJCXNldHVwX2J1cyA9IGNlbGxfbWFwX2lvbW11KCk7CisKKwkJaWYgKHNldHVwX2J1cykgeworCQkJcHJfZGVidWcoIiVzOiBJT01NVSBtYXBwaW5nIGFjdGl2YXRlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXBwY19tZC5pb21tdV9kZXZfc2V0dXAgPSBpb21tdV9kZXZfc2V0dXBfbnVsbDsKKwkJCXBwY19tZC5pb21tdV9idXNfc2V0dXAgPSBpb21tdV9idXNfc2V0dXA7CisJCX0gZWxzZSB7CisJCQlwcl9kZWJ1ZygiJXM6IElPTU1VIG1hcHBpbmcgYWN0aXZhdGVkLCAiCisJCQkJICJubyBkZXZpY2UgYWN0aW9uIG5lY2Vzc2FyeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCS8qIERpcmVjdCBJL08sIElPTU1VIG9mZiAqLworCQkJcHBjX21kLmlvbW11X2Rldl9zZXR1cCA9IGlvbW11X2Rldl9zZXR1cF9udWxsOworCQkJcHBjX21kLmlvbW11X2J1c19zZXR1cCA9IGlvbW11X2J1c19zZXR1cF9udWxsOworCQl9CisJfQogCiAJcGNpX2RtYV9vcHMuYWxsb2NfY29oZXJlbnQgPSBjZWxsX2FsbG9jX2NvaGVyZW50OwogCXBjaV9kbWFfb3BzLmZyZWVfY29oZXJlbnQgPSBjZWxsX2ZyZWVfY29oZXJlbnQ7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcGVydmFzaXZlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcGVydmFzaXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBlMDUxYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9wZXJ2YXNpdmUuYwpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIENCRSBQZXJ2YXNpdmUgTW9uaXRvciBhbmQgRGVidWcKKyAqCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDA1CisgKgorICogQXV0aG9yczogTWF4aW1pbm8gQWd1aWxhciAobWFndWlsYXJAdXMuaWJtLmNvbSkKKyAqICAgICAgICAgIE1pY2hhZWwgTi4gRGF5IChtbmRheUB1cy5pYm0uY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3JlZy5oPgorCisjaW5jbHVkZSAicGVydmFzaXZlLmgiCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2JlX3BlcnZhc2l2ZV9sb2NrKTsKK3N0cnVjdCBjYmVfcGVydmFzaXZlIHsKKwlzdHJ1Y3QgcG1kX3JlZ3MgX19pb21lbSAqcmVnczsKKwl1bnNpZ25lZCBpbnQgdGhyZWFkOworfTsKKworLyogY2FuJ3QgdXNlIHBlcl9jcHUgZnJvbSBzZXR1cF9hcmNoICovCitzdGF0aWMgc3RydWN0IGNiZV9wZXJ2YXNpdmUgY2JlX3BlcnZhc2l2ZVtOUl9DUFVTXTsKKworc3RhdGljIHZvaWQgX19pbml0IGNiZV9lbmFibGVfcGF1c2VfemVybyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdGhyZWFkX3N3aXRjaF9jb250cm9sOworCXVuc2lnbmVkIGxvbmcgdGVtcF9yZWdpc3RlcjsKKwlzdHJ1Y3QgY2JlX3BlcnZhc2l2ZSAqcDsKKwlpbnQgdGhyZWFkOworCisJc3Bpbl9sb2NrX2lycSgmY2JlX3BlcnZhc2l2ZV9sb2NrKTsKKwlwID0gJmNiZV9wZXJ2YXNpdmVbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKworCWlmICghY2JlX3BlcnZhc2l2ZS0+cmVncykKKwkJZ290byBvdXQ7CisKKwlwcl9kZWJ1ZygiUG93ZXIgTWFuYWdlbWVudDogQ1BVICVkXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCisJIC8qIEVuYWJsZSBQYXVzZSgwKSBjb250cm9sIGJpdCAqLworCXRlbXBfcmVnaXN0ZXIgPSBpbl9iZTY0KCZwLT5yZWdzLT5wbV9jb250cm9sKTsKKworCW91dF9iZTY0KCZwLT5yZWdzLT5wbV9jb250cm9sLAorCQkgdGVtcF9yZWdpc3RlcnxQTURfUEFVU0VfWkVST19DT05UUk9MKTsKKworCS8qIEVuYWJsZSBERUMgYW5kIEVFIGludGVycnVwdCByZXF1ZXN0ICovCisJdGhyZWFkX3N3aXRjaF9jb250cm9sICA9IG1mc3ByKFNQUk5fVFNDX0NFTEwpOworCXRocmVhZF9zd2l0Y2hfY29udHJvbCB8PSBUU0NfQ0VMTF9FRV9FTkFCTEUgfCBUU0NfQ0VMTF9FRV9CT09TVDsKKworCXN3aXRjaCAoKG1mc3ByKFNQUk5fQ1RSTEYpICYgQ1RSTF9DVCkpIHsKKwljYXNlIENUUkxfQ1QwOgorCQl0aHJlYWRfc3dpdGNoX2NvbnRyb2wgfD0gVFNDX0NFTExfREVDX0VOQUJMRV8wOworCQl0aHJlYWQgPSAwOworCQlicmVhazsKKwljYXNlIENUUkxfQ1QxOgorCQl0aHJlYWRfc3dpdGNoX2NvbnRyb2wgfD0gVFNDX0NFTExfREVDX0VOQUJMRV8xOworCQl0aHJlYWQgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5rbm93biBjb25maWd1cmF0aW9uXG4iLAorCQkJX19GVU5DVElPTl9fKTsKKwkJdGhyZWFkID0gLTE7CisJCWJyZWFrOworCX0KKworCWlmIChwLT50aHJlYWQgIT0gdGhyZWFkKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZGV2aWNlIHRyZWUgaW5jb25zaXN0YW50LCAiCisJCQkJICAgICAiY3B1ICVpOiAlZC8lZFxuIiwgX19GVU5DVElPTl9fLAorCQkJCSAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpLAorCQkJCSAgICAgcC0+dGhyZWFkLCB0aHJlYWQpOworCisJbXRzcHIoU1BSTl9UU0NfQ0VMTCwgdGhyZWFkX3N3aXRjaF9jb250cm9sKTsKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycSgmY2JlX3BlcnZhc2l2ZV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgY2JlX2lkbGUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGN0cmw7CisKKwljYmVfZW5hYmxlX3BhdXNlX3plcm8oKTsKKworCXdoaWxlICgxKSB7CisJCWlmICghbmVlZF9yZXNjaGVkKCkpIHsKKwkJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKSB7CisJCQkJLyogZ28gaW50byBsb3cgdGhyZWFkIHByaW9yaXR5ICovCisJCQkJSE1UX2xvdygpOworCisJCQkJLyoKKwkJCQkgKiBhdG9taWNhbGx5IGRpc2FibGUgdGhyZWFkIGV4ZWN1dGlvbgorCQkJCSAqIGFuZCBydW5sYXRjaC4KKwkJCQkgKiBFeHRlcm5hbCBhbmQgRGVjcmVtZW50ZXIgZXhjZXB0aW9ucworCQkJCSAqIGFyZSBzdGlsbCBoYW5kbGVkIHdoZW4gdGhlIHRocmVhZAorCQkJCSAqIGlzIGRpc2FibGVkIGJ1dCBub3cgZW50ZXIgaW4KKwkJCQkgKiBjYmVfc3lzdGVtX3Jlc2V0X2V4Y2VwdGlvbigpCisJCQkJICovCisJCQkJY3RybCA9IG1mc3ByKFNQUk5fQ1RSTEYpOworCQkJCWN0cmwgJj0gfihDVFJMX1JVTkxBVENIIHwgQ1RSTF9URSk7CisJCQkJbXRzcHIoU1BSTl9DVFJMVCwgY3RybCk7CisJCQl9CisJCQkvKiByZXN0b3JlIHRocmVhZCBwcmlvICovCisJCQlITVRfbWVkaXVtKCk7CisJCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCX0KKworCQkvKgorCQkgKiB0dXJuIHJ1bmxhdGNoIG9uIGFnYWluIGJlZm9yZSBzY2hlZHVsaW5nIHRoZQorCQkgKiBwcm9jZXNzIHdlIGp1c3Qgd29rZSB1cAorCQkgKi8KKwkJcHBjNjRfcnVubGF0Y2hfb24oKTsKKworCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CisJCXNjaGVkdWxlKCk7CisJCXByZWVtcHRfZGlzYWJsZSgpOworCX0KK30KKworc3RhdGljIGludCBjYmVfc3lzdGVtX3Jlc2V0X2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzd2l0Y2ggKHJlZ3MtPm1zciAmIFNSUjFfV0FLRU1BU0spIHsKKwljYXNlIFNSUjFfV0FLRUVFOgorCQlkb19JUlEocmVncyk7CisJCWJyZWFrOworCWNhc2UgU1JSMV9XQUtFREVDOgorCQl0aW1lcl9pbnRlcnJ1cHQocmVncyk7CisJCWJyZWFrOworCWNhc2UgU1JSMV9XQUtFTVQ6CisJCS8qIG5vIGFjdGlvbiByZXF1aXJlZCAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBkbyBzeXN0ZW0gcmVzZXQgKi8KKwkJcmV0dXJuIDA7CisJfQorCS8qIGV2ZXJ5dGhpbmcgaGFuZGxlZCAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjYmVfZmluZF9wbWRfbW1pbyhpbnQgY3B1LCBzdHJ1Y3QgY2JlX3BlcnZhc2l2ZSAqcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJdW5zaWduZWQgaW50ICppbnRfc2VydmVyczsKKwljaGFyICphZGRyOworCXVuc2lnbmVkIGxvbmcgcmVhbF9hZGRyZXNzOworCXVuc2lnbmVkIGludCBzaXplOworCisJc3RydWN0IHBtZF9yZWdzIF9faW9tZW0gKnBtZF9tbWlvX2FyZWE7CisJaW50IGhhcmRpZCwgdGhyZWFkOworCWludCBwcm9wbGVuOworCisJcG1kX21taW9fYXJlYSA9IE5VTEw7CisJaGFyZGlkID0gZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUpOworCWZvciAobm9kZSA9IE5VTEw7IChub2RlID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobm9kZSwgImNwdSIpKTspIHsKKwkJaW50X3NlcnZlcnMgPSAodm9pZCAqKSBnZXRfcHJvcGVydHkobm9kZSwKKwkJCQkiaWJtLHBwYy1pbnRlcnJ1cHQtc2VydmVyI3MiLCAmcHJvcGxlbik7CisJCWlmICghaW50X3NlcnZlcnMpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIG1pc3NlcyAiCisJCQkJImlibSxwcGMtaW50ZXJydXB0LXNlcnZlciNzIHByb3BlcnR5IiwKKwkJCQlub2RlLT5mdWxsX25hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJZm9yICh0aHJlYWQgPSAwOyB0aHJlYWQgPCBwcm9wbGVuIC8gc2l6ZW9mIChpbnQpOyB0aHJlYWQrKykgeworCQkJaWYgKGhhcmRpZCA9PSBpbnRfc2VydmVyc1t0aHJlYWRdKSB7CisJCQkJYWRkciA9IGdldF9wcm9wZXJ0eShub2RlLCAicGVydmFzaXZlIiwgTlVMTCk7CisJCQkJZ290byBmb3VuZDsKKwkJCX0KKwkJfQorCX0KKworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDUFUgJWQgbm90IGZvdW5kXG4iLCBfX0ZVTkNUSU9OX18sIGNwdSk7CisJcmV0dXJuIC1FSU5WQUw7CisKK2ZvdW5kOgorCXJlYWxfYWRkcmVzcyA9ICoodW5zaWduZWQgbG9uZyopIGFkZHI7CisJYWRkciArPSBzaXplb2YgKHVuc2lnbmVkIGxvbmcpOworCXNpemUgPSAqKHVuc2lnbmVkIGludCopIGFkZHI7CisKKwlwcl9kZWJ1ZygicGVydmFzaXZlIGFyZWEgZm9yIENQVSAlZCBhdCAlbHgsIHNpemUgJXhcbiIsCisJCQljcHUsIHJlYWxfYWRkcmVzcywgc2l6ZSk7CisJcC0+cmVncyA9IF9faW9yZW1hcChyZWFsX2FkZHJlc3MsIHNpemUsIF9QQUdFX05PX0NBQ0hFKTsKKwlwLT50aHJlYWQgPSB0aHJlYWQ7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19pbml0IGNlbGxfcGVydmFzaXZlX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY2JlX3BlcnZhc2l2ZSAqcDsKKwlpbnQgY3B1OworCWludCByZXQ7CisKKwlpZiAoIWNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1BBVVNFX1pFUk8pKQorCQlyZXR1cm47CisKKwlmb3JfZWFjaF9jcHUoY3B1KSB7CisJCXAgPSAmY2JlX3BlcnZhc2l2ZVtjcHVdOworCQlyZXQgPSBjYmVfZmluZF9wbWRfbW1pbyhjcHUsIHApOworCQlpZiAocmV0KQorCQkJcmV0dXJuOworCX0KKworCXBwY19tZC5pZGxlX2xvb3AgPSBjYmVfaWRsZTsKKwlwcGNfbWQuc3lzdGVtX3Jlc2V0X2V4Y2VwdGlvbiA9IGNiZV9zeXN0ZW1fcmVzZXRfZXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3BlcnZhc2l2ZS5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3BlcnZhc2l2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMWZiODUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcGVydmFzaXZlLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENlbGwgUGVydmFzaXZlIE1vbml0b3IgYW5kIERlYnVnIGludGVyZmFjZSBhbmQgSFcgc3RydWN0dXJlcworICoKKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDUKKyAqCisgKiBBdXRob3JzOiBNYXhpbWlubyBBZ3VpbGFyIChtYWd1aWxhckB1cy5pYm0uY29tKQorICogICAgICAgICAgRGF2aWQgSi4gRXJiIChkamVyYkB1cy5pYm0uY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworCisjaWZuZGVmIFBFUlZBU0lWRV9ICisjZGVmaW5lIFBFUlZBU0lWRV9ICisKK3N0cnVjdCBwbWRfcmVncyB7CisJdTggcGFkXzB4MDAwMF8weDA4MDBbMHgwODAwIC0gMHgwMDAwXTsJCQkvKiAweDAwMDAgKi8KKworCS8qIFRoZXJtYWwgU2Vuc29yIFJlZ2lzdGVycyAqLworCXU2NCAgdHNfY3RzcjE7CQkJCQkJLyogMHgwODAwICovCisJdTY0ICB0c19jdHNyMjsJCQkJCQkvKiAweDA4MDggKi8KKwl1NjQgIHRzX210c3IxOwkJCQkJCS8qIDB4MDgxMCAqLworCXU2NCAgdHNfbXRzcjI7CQkJCQkJLyogMHgwODE4ICovCisJdTY0ICB0c19pdHIxOwkJCQkJCS8qIDB4MDgyMCAqLworCXU2NCAgdHNfaXRyMjsJCQkJCQkvKiAweDA4MjggKi8KKwl1NjQgIHRzX2dpdHI7CQkJCQkJLyogMHgwODMwICovCisJdTY0ICB0c19pc3I7CQkJCQkJLyogMHgwODM4ICovCisJdTY0ICB0c19pbXI7CQkJCQkJLyogMHgwODQwICovCisJdTY0ICB0bV9jcjE7CQkJCQkJLyogMHgwODQ4ICovCisJdTY0ICB0bV9jcjI7CQkJCQkJLyogMHgwODUwICovCisJdTY0ICB0bV9zaW1yOwkJCQkJCS8qIDB4MDg1OCAqLworCXU2NCAgdG1fdHByOwkJCQkJCS8qIDB4MDg2MCAqLworCXU2NCAgdG1fc3RyMTsJCQkJCQkvKiAweDA4NjggKi8KKwl1NjQgIHRtX3N0cjI7CQkJCQkJLyogMHgwODcwICovCisJdTY0ICB0bV90c3I7CQkJCQkJLyogMHgwODc4ICovCisKKwkvKiBQb3dlciBNYW5hZ2VtZW50ICovCisJdTY0ICBwbV9jb250cm9sOwkJCQkJLyogMHgwODgwICovCisjZGVmaW5lIFBNRF9QQVVTRV9aRVJPX0NPTlRST0wJCTB4MTAwMDAKKwl1NjQgIHBtX3N0YXR1czsJCQkJCQkvKiAweDA4ODggKi8KKworCS8qIFRpbWUgQmFzZSBSZWdpc3RlciAqLworCXU2NCAgdGJyOwkJCQkJCS8qIDB4MDg5MCAqLworCisJdTggICBwYWRfMHgwODk4XzB4MTAwMCBbMHgxMDAwIC0gMHgwODk4XTsJCS8qIDB4MDg5OCAqLworfTsKKwordm9pZCBfX2luaXQgY2VsbF9wZXJ2YXNpdmVfaW5pdCh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zZXR1cC5jCmluZGV4IDlhNDk1NjMuLmIzM2E0NDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zZXR1cC5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8YXNtL21tdS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20va2V4ZWMuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL3J0YXMuaD4KQEAgLTQ4LDYgKzQ5LDcgQEAKIAogI2luY2x1ZGUgImludGVycnVwdC5oIgogI2luY2x1ZGUgImlvbW11LmgiCisjaW5jbHVkZSAicGVydmFzaXZlLmgiCiAKICNpZmRlZiBERUJVRwogI2RlZmluZSBEQkcoZm10Li4uKSB1ZGJnX3ByaW50ZihmbXQpCkBAIC01NSw3ICs1Nyw3IEBACiAjZGVmaW5lIERCRyhmbXQuLi4pCiAjZW5kaWYKIAotdm9pZCBjZWxsX3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCitzdGF0aWMgdm9pZCBjZWxsX3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpyb290OwogCWNvbnN0IGNoYXIgKm1vZGVsID0gIiI7CkBAIC02Nyw2ICs2OSw3NyBAQAogCW9mX25vZGVfcHV0KHJvb3QpOwogfQogCisjaWZkZWYgQ09ORklHX1NQQVJTRU1FTQorc3RhdGljIGludCBfX2luaXQgZmluZF9zcHVfbm9kZV9pZChzdHJ1Y3QgZGV2aWNlX25vZGUgKnNwZSkKK3sKKwl1bnNpZ25lZCBpbnQgKmlkOworI2lmZGVmIENPTkZJR19OVU1BCisJc3RydWN0IGRldmljZV9ub2RlICpjcHU7CisJY3B1ID0gc3BlLT5wYXJlbnQtPnBhcmVudDsKKwlpZCA9ICh1bnNpZ25lZCBpbnQgKilnZXRfcHJvcGVydHkoY3B1LCAibm9kZS1pZCIsIE5VTEwpOworI2Vsc2UKKwlpZCA9IE5VTEw7CisjZW5kaWYKKwlyZXR1cm4gaWQgPyAqaWQgOiAwOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgY2VsbF9zcHVwcm9wX3ByZXNlbnQoc3RydWN0IGRldmljZV9ub2RlICpzcGUsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKnByb3AsIGludCBlYXJseSkKK3sKKwlzdHJ1Y3QgYWRkcmVzc19wcm9wIHsKKwkJdW5zaWduZWQgbG9uZyBhZGRyZXNzOworCQl1bnNpZ25lZCBpbnQgbGVuOworCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgKnA7CisJaW50IHByb3BsZW47CisKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZW5kX3BmbiwgcGZuOworCWludCBub2RlX2lkOworCisJcCA9ICh2b2lkKilnZXRfcHJvcGVydHkoc3BlLCBwcm9wLCAmcHJvcGxlbik7CisJV0FSTl9PTihwcm9wbGVuICE9IHNpemVvZiAoKnApKTsKKworCW5vZGVfaWQgPSBmaW5kX3NwdV9ub2RlX2lkKHNwZSk7CisKKwlzdGFydF9wZm4gPSBwLT5hZGRyZXNzID4+IFBBR0VfU0hJRlQ7CisJZW5kX3BmbiA9IChwLT5hZGRyZXNzICsgcC0+bGVuICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKworCS8qIFdlIG5lZWQgdG8gY2FsbCBtZW1vcnlfcHJlc2VudCAqYmVmb3JlKiB0aGUgY2FsbCB0byBzcGFyc2VfaW5pdCwKKwkgICBidXQgd2UgY2FuIGluaXRpYWxpemUgdGhlIHBhZ2Ugc3RydWN0cyBvbmx5ICphZnRlciogdGhhdCBjYWxsLgorCSAgIFRodXMsIHdlJ3JlIGJlaW5nIGNhbGxlZCB0d2ljZS4gKi8KKwlpZiAoZWFybHkpCisJCW1lbW9yeV9wcmVzZW50KG5vZGVfaWQsIHN0YXJ0X3BmbiwgZW5kX3Bmbik7CisJZWxzZSB7CisJCS8qIEFzIHRoZSBwYWdlcyBiYWNraW5nIFNQVSBMUyBhbmQgSS9PIGFyZSBvdXRzaWRlIHRoZSByYW5nZQorCQkgICBvZiByZWd1bGFyIG1lbW9yeSwgdGhlaXIgcGFnZSBzdHJ1Y3RzIHdlcmUgbm90IGluaXRpYWxpemVkCisJCSAgIGJ5IGZyZWVfYXJlYV9pbml0LiBEbyBpdCBoZXJlIGluc3RlYWQuICovCisJCWZvciAocGZuID0gc3RhcnRfcGZuOyBwZm4gPCBlbmRfcGZuOyBwZm4rKykgeworCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOworCQkJc2V0X3BhZ2VfbGlua3MocGFnZSwgWk9ORV9ETUEsIG5vZGVfaWQsIHBmbik7CisJCQlzZXRfcGFnZV9jb3VudChwYWdlLCAxKTsKKwkJCXJlc2V0X3BhZ2VfbWFwY291bnQocGFnZSk7CisJCQlTZXRQYWdlUmVzZXJ2ZWQocGFnZSk7CisJCQlJTklUX0xJU1RfSEVBRCgmcGFnZS0+bHJ1KTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IGNlbGxfc3B1bWVtX2luaXQoaW50IGVhcmx5KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKwlmb3IgKG5vZGUgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAic3BlIik7CisJCQlub2RlOyBub2RlID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobm9kZSwgInNwZSIpKSB7CisJCWNlbGxfc3B1cHJvcF9wcmVzZW50KG5vZGUsICJsb2NhbC1zdG9yZSIsIGVhcmx5KTsKKwkJY2VsbF9zcHVwcm9wX3ByZXNlbnQobm9kZSwgInByb2JsZW0iLCBlYXJseSk7CisJCWNlbGxfc3B1cHJvcF9wcmVzZW50KG5vZGUsICJwcml2MSIsIGVhcmx5KTsKKwkJY2VsbF9zcHVwcm9wX3ByZXNlbnQobm9kZSwgInByaXYyIiwgZWFybHkpOworCX0KK30KKyNlbHNlCitzdGF0aWMgdm9pZCBfX2luaXQgY2VsbF9zcHVtZW1faW5pdChpbnQgZWFybHkpCit7Cit9CisjZW5kaWYKKwogc3RhdGljIHZvaWQgY2VsbF9wcm9ncmVzcyhjaGFyICpzLCB1bnNpZ25lZCBzaG9ydCBoZXgpCiB7CiAJcHJpbnRrKCIqKiogJTA0eCA6ICVzXG4iLCBoZXgsIHMgPyBzIDogIiIpOwpAQCAtOTMsMTEgKzE2NiwxNCBAQAogCWluaXRfcGNpX2NvbmZpZ190b2tlbnMoKTsKIAlmaW5kX2FuZF9pbml0X3BoYnMoKTsKIAlzcGlkZXJfaW5pdF9JUlEoKTsKKwljZWxsX3BlcnZhc2l2ZV9pbml0KCk7CiAjaWZkZWYgQ09ORklHX0RVTU1ZX0NPTlNPTEUKIAljb25zd2l0Y2hwID0gJmR1bW15X2NvbjsKICNlbmRpZgogCiAJbW1pb19udnJhbV9pbml0KCk7CisKKwljZWxsX3NwdW1lbV9pbml0KDApOwogfQogCiAvKgpAQCAtMTEzLDYgKzE4OSw4IEBACiAKIAlwcGM2NF9pbnRlcnJ1cHRfY29udHJvbGxlciA9IElDX0NFTExfUElDOwogCisJY2VsbF9zcHVtZW1faW5pdCgxKTsKKwogCURCRygiIDwtIGNlbGxfaW5pdF9lYXJseSgpXG4iKTsKIH0KIApAQCAtMTI1LDYgKzIwMywxNSBAQAogCXJldHVybiAxOwogfQogCisvKgorICogQ2VsbCBoYXMgbm8gbGVnYWN5IElPOyBhbnl0aGluZyBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaGFzIHRvCisgKiBmYWlsIG9yIGJhZCB0aGluZ3Mgd2lsbCBoYXBwZW4KKyAqLworc3RhdGljIGludCBjZWxsX2NoZWNrX2xlZ2FjeV9pb3BvcnQodW5zaWduZWQgaW50IGJhc2Vwb3J0KQoreworCXJldHVybiAtRU5PREVWOworfQorCiBzdHJ1Y3QgbWFjaGRlcF9jYWxscyBfX2luaXRkYXRhIGNlbGxfbWQgPSB7CiAJLnByb2JlCQkJPSBjZWxsX3Byb2JlLAogCS5zZXR1cF9hcmNoCQk9IGNlbGxfc2V0dXBfYXJjaCwKQEAgLTEzNyw1ICsyMjQsMTEgQEAKIAkuZ2V0X3J0Y190aW1lCQk9IHJ0YXNfZ2V0X3J0Y190aW1lLAogCS5zZXRfcnRjX3RpbWUJCT0gcnRhc19zZXRfcnRjX3RpbWUsCiAJLmNhbGlicmF0ZV9kZWNyCQk9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCisJLmNoZWNrX2xlZ2FjeV9pb3BvcnQJPSBjZWxsX2NoZWNrX2xlZ2FjeV9pb3BvcnQsCiAJLnByb2dyZXNzCQk9IGNlbGxfcHJvZ3Jlc3MsCisjaWZkZWYgQ09ORklHX0tFWEVDCisJLm1hY2hpbmVfa2V4ZWMJCT0gZGVmYXVsdF9tYWNoaW5lX2tleGVjLAorCS5tYWNoaW5lX2tleGVjX3ByZXBhcmUJPSBkZWZhdWx0X21hY2hpbmVfa2V4ZWNfcHJlcGFyZSwKKwkubWFjaGluZV9jcmFzaF9zaHV0ZG93bgk9IGRlZmF1bHRfbWFjaGluZV9jcmFzaF9zaHV0ZG93biwKKyNlbmRpZgogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zbXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zbXAuYwppbmRleCBkZTk2ZWFkLi5iZGY2YzVmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NtcC5jCkBAIC04Niw3ICs4Niw3IEBACiAJcGNwdSA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQobGNwdSk7CiAKIAkvKiBGaXh1cCBhdG9taWMgY291bnQ6IGl0IGV4aXRlZCBpbnNpZGUgSVJRIGhhbmRsZXIuICovCi0JcGFjYVtsY3B1XS5fX2N1cnJlbnQtPnRocmVhZF9pbmZvLT5wcmVlbXB0X2NvdW50CT0gMDsKKwl0YXNrX3RocmVhZF9pbmZvKHBhY2FbbGNwdV0uX19jdXJyZW50KS0+cHJlZW1wdF9jb3VudAk9IDA7CiAKIAkvKgogCSAqIElmIHRoZSBSVEFTIHN0YXJ0LWNwdSB0b2tlbiBkb2VzIG5vdCBleGlzdCB0aGVuIHByZXN1bWUgdGhlCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfYmFzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NWFlMDMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYwpAQCAtMCwwICsxLDcxMSBAQAorLyoKKyAqIExvdy1sZXZlbCBTUFUgaGFuZGxpbmcKKyAqCisgKiAoQykgQ29weXJpZ2h0IElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJIIDIwMDUKKyAqCisgKiBBdXRob3I6IEFybmQgQmVyZ21hbm4gPGFybmRiQGRlLmlibS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI3VuZGVmIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vc3B1Lmg+CisjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CisKKyNpbmNsdWRlICJpbnRlcnJ1cHQuaCIKKworc3RhdGljIGludCBfX3NwdV90cmFwX2ludmFsaWRfZG1hKHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJZm9yY2Vfc2lnKFNJR0JVUywgLyogaW5mbywgKi8gY3VycmVudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19zcHVfdHJhcF9kbWFfYWxpZ24oc3RydWN0IHNwdSAqc3B1KQoreworCXByX2RlYnVnKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlmb3JjZV9zaWcoU0lHQlVTLCAvKiBpbmZvLCAqLyBjdXJyZW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX3NwdV90cmFwX2Vycm9yKHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJZm9yY2Vfc2lnKFNJR0lMTCwgLyogaW5mbywgKi8gY3VycmVudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNwdV9yZXN0YXJ0X2RtYShzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcml2MiBfX2lvbWVtICpwcml2MiA9IHNwdS0+cHJpdjI7CisKKwlpZiAoIXRlc3RfYml0KFNQVV9DT05URVhUX1NXSVRDSF9QRU5ESU5HLCAmc3B1LT5mbGFncykpCisJCW91dF9iZTY0KCZwcml2Mi0+bWZjX2NvbnRyb2xfUlcsIE1GQ19DTlRMX1JFU1RBUlRfRE1BX0NPTU1BTkQpOworfQorCitzdGF0aWMgaW50IF9fc3B1X3RyYXBfZGF0YV9zZWcoc3RydWN0IHNwdSAqc3B1LCB1bnNpZ25lZCBsb25nIGVhKQoreworCXN0cnVjdCBzcHVfcHJpdjIgX19pb21lbSAqcHJpdjIgPSBzcHUtPnByaXYyOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gc3B1LT5tbTsKKwl1NjQgZXNpZCwgdnNpZDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCWlmICh0ZXN0X2JpdChTUFVfQ09OVEVYVF9TV0lUQ0hfQUNUSVZFLCAmc3B1LT5mbGFncykpIHsKKwkJLyogU0xCcyBhcmUgcHJlLWxvYWRlZCBmb3IgY29udGV4dCBzd2l0Y2gsIHNvCisJCSAqIHdlIHNob3VsZCBuZXZlciBnZXQgaGVyZSEKKwkJICovCisJCXByaW50aygiJXM6IGludmFsaWQgYWNjZXNzIGR1cmluZyBzd2l0Y2ghXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAxOworCX0KKwlpZiAoIW1tIHx8IChSRUdJT05fSUQoZWEpICE9IFVTRVJfUkVHSU9OX0lEKSkgeworCQkvKiBGdXR1cmU6IHN1cHBvcnQga2VybmVsIHNlZ21lbnRzIHNvIHRoYXQgZHJpdmVycworCQkgKiBjYW4gdXNlIFNQVXMuCisJCSAqLworCQlwcl9kZWJ1ZygiaW52YWxpZCByZWdpb24gYWNjZXNzIGF0ICUwMTZseFxuIiwgZWEpOworCQlyZXR1cm4gMTsKKwl9CisKKwllc2lkID0gKGVhICYgRVNJRF9NQVNLKSB8IFNMQl9FU0lEX1Y7CisJdnNpZCA9IChnZXRfdnNpZChtbS0+Y29udGV4dC5pZCwgZWEpIDw8IFNMQl9WU0lEX1NISUZUKSB8IFNMQl9WU0lEX1VTRVI7CisJaWYgKGluX2h1Z2VwYWdlX2FyZWEobW0tPmNvbnRleHQsIGVhKSkKKwkJdnNpZCB8PSBTTEJfVlNJRF9MOworCisJb3V0X2JlNjQoJnByaXYyLT5zbGJfaW5kZXhfVywgc3B1LT5zbGJfcmVwbGFjZSk7CisJb3V0X2JlNjQoJnByaXYyLT5zbGJfdnNpZF9SVywgdnNpZCk7CisJb3V0X2JlNjQoJnByaXYyLT5zbGJfZXNpZF9SVywgZXNpZCk7CisKKwlzcHUtPnNsYl9yZXBsYWNlKys7CisJaWYgKHNwdS0+c2xiX3JlcGxhY2UgPj0gOCkKKwkJc3B1LT5zbGJfcmVwbGFjZSA9IDA7CisKKwlzcHVfcmVzdGFydF9kbWEoc3B1KTsKKworCXJldHVybiAwOworfQorCitleHRlcm4gaW50IGhhc2hfcGFnZSh1bnNpZ25lZCBsb25nIGVhLCB1bnNpZ25lZCBsb25nIGFjY2VzcywgdW5zaWduZWQgbG9uZyB0cmFwKTsgLy9YWFgKK3N0YXRpYyBpbnQgX19zcHVfdHJhcF9kYXRhX21hcChzdHJ1Y3Qgc3B1ICpzcHUsIHVuc2lnbmVkIGxvbmcgZWEsIHU2NCBkc2lzcikKK3sKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBIYW5kbGUga2VybmVsIHNwYWNlIGhhc2ggZmF1bHRzIGltbWVkaWF0ZWx5LgorCSAgIFVzZXIgaGFzaCBmYXVsdHMgbmVlZCB0byBiZSBkZWZlcnJlZCB0byBwcm9jZXNzIGNvbnRleHQuICovCisJaWYgKChkc2lzciAmIE1GQ19EU0lTUl9QVEVfTk9UX0ZPVU5EKQorCSAgICAmJiBSRUdJT05fSUQoZWEpICE9IFVTRVJfUkVHSU9OX0lECisJICAgICYmIGhhc2hfcGFnZShlYSwgX1BBR0VfUFJFU0VOVCwgMHgzMDApID09IDApIHsKKwkJc3B1X3Jlc3RhcnRfZG1hKHNwdSk7CisJCXJldHVybiAwOworCX0KKworCWlmICh0ZXN0X2JpdChTUFVfQ09OVEVYVF9TV0lUQ0hfQUNUSVZFLCAmc3B1LT5mbGFncykpIHsKKwkJcHJpbnRrKCIlczogaW52YWxpZCBhY2Nlc3MgZHVyaW5nIHN3aXRjaCFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDE7CisJfQorCisJc3B1LT5kYXIgPSBlYTsKKwlzcHUtPmRzaXNyID0gZHNpc3I7CisJbWIoKTsKKwlpZiAoc3B1LT5zdG9wX2NhbGxiYWNrKQorCQlzcHUtPnN0b3BfY2FsbGJhY2soc3B1KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX3NwdV90cmFwX21haWxib3goc3RydWN0IHNwdSAqc3B1KQoreworCWlmIChzcHUtPmlib3hfY2FsbGJhY2spCisJCXNwdS0+aWJveF9jYWxsYmFjayhzcHUpOworCisJLyogYXRvbWljYWxseSBkaXNhYmxlIFNQVSBtYWlsYm94IGludGVycnVwdHMgKi8KKwlzcGluX2xvY2soJnNwdS0+cmVnaXN0ZXJfbG9jayk7CisJc3B1X2ludF9tYXNrX2FuZChzcHUsIDIsIH4weDEpOworCXNwaW5fdW5sb2NrKCZzcHUtPnJlZ2lzdGVyX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fc3B1X3RyYXBfc3RvcChzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJcHJfZGVidWcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCXNwdS0+c3RvcF9jb2RlID0gaW5fYmUzMigmc3B1LT5wcm9ibGVtLT5zcHVfc3RhdHVzX1IpOworCWlmIChzcHUtPnN0b3BfY2FsbGJhY2spCisJCXNwdS0+c3RvcF9jYWxsYmFjayhzcHUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fc3B1X3RyYXBfaGFsdChzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJcHJfZGVidWcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCXNwdS0+c3RvcF9jb2RlID0gaW5fYmUzMigmc3B1LT5wcm9ibGVtLT5zcHVfc3RhdHVzX1IpOworCWlmIChzcHUtPnN0b3BfY2FsbGJhY2spCisJCXNwdS0+c3RvcF9jYWxsYmFjayhzcHUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fc3B1X3RyYXBfdGFnX2dyb3VwKHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJLyogd2FrZV91cCgmc3B1LT5kbWFfd3EpOyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fc3B1X3RyYXBfc3B1Ym94KHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlpZiAoc3B1LT53Ym94X2NhbGxiYWNrKQorCQlzcHUtPndib3hfY2FsbGJhY2soc3B1KTsKKworCS8qIGF0b21pY2FsbHkgZGlzYWJsZSBTUFUgbWFpbGJveCBpbnRlcnJ1cHRzICovCisJc3Bpbl9sb2NrKCZzcHUtPnJlZ2lzdGVyX2xvY2spOworCXNwdV9pbnRfbWFza19hbmQoc3B1LCAyLCB+MHgxMCk7CisJc3Bpbl91bmxvY2soJnNwdS0+cmVnaXN0ZXJfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorc3B1X2lycV9jbGFzc18wKGludCBpcnEsIHZvaWQgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBzcHUgKnNwdTsKKworCXNwdSA9IGRhdGE7CisJc3B1LT5jbGFzc18wX3BlbmRpbmcgPSAxOworCWlmIChzcHUtPnN0b3BfY2FsbGJhY2spCisJCXNwdS0+c3RvcF9jYWxsYmFjayhzcHUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpbnQKK3NwdV9pcnFfY2xhc3NfMF9ib3R0b20oc3RydWN0IHNwdSAqc3B1KQoreworCXVuc2lnbmVkIGxvbmcgc3RhdCwgbWFzazsKKworCXNwdS0+Y2xhc3NfMF9wZW5kaW5nID0gMDsKKworCW1hc2sgPSBzcHVfaW50X21hc2tfZ2V0KHNwdSwgMCk7CisJc3RhdCA9IHNwdV9pbnRfc3RhdF9nZXQoc3B1LCAwKTsKKworCXN0YXQgJj0gbWFzazsKKworCWlmIChzdGF0ICYgMSkgLyogaW52YWxpZCBNRkMgRE1BICovCisJCV9fc3B1X3RyYXBfaW52YWxpZF9kbWEoc3B1KTsKKworCWlmIChzdGF0ICYgMikgLyogaW52YWxpZCBETUEgYWxpZ25tZW50ICovCisJCV9fc3B1X3RyYXBfZG1hX2FsaWduKHNwdSk7CisKKwlpZiAoc3RhdCAmIDQpIC8qIGVycm9yIG9uIFNQVSAqLworCQlfX3NwdV90cmFwX2Vycm9yKHNwdSk7CisKKwlzcHVfaW50X3N0YXRfY2xlYXIoc3B1LCAwLCBzdGF0KTsKKworCXJldHVybiAoc3RhdCAmIDB4NykgPyAtRUlPIDogMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwdV9pcnFfY2xhc3NfMF9ib3R0b20pOworCitzdGF0aWMgaXJxcmV0dXJuX3QKK3NwdV9pcnFfY2xhc3NfMShpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHU7CisJdW5zaWduZWQgbG9uZyBzdGF0LCBtYXNrLCBkYXIsIGRzaXNyOworCisJc3B1ID0gZGF0YTsKKworCS8qIGF0b21pY2FsbHkgcmVhZCAmIGNsZWFyIGNsYXNzMSBzdGF0dXMuICovCisJc3Bpbl9sb2NrKCZzcHUtPnJlZ2lzdGVyX2xvY2spOworCW1hc2sgID0gc3B1X2ludF9tYXNrX2dldChzcHUsIDEpOworCXN0YXQgID0gc3B1X2ludF9zdGF0X2dldChzcHUsIDEpICYgbWFzazsKKwlkYXIgICA9IHNwdV9tZmNfZGFyX2dldChzcHUpOworCWRzaXNyID0gc3B1X21mY19kc2lzcl9nZXQoc3B1KTsKKwlpZiAoc3RhdCAmIDIpIC8qIG1hcHBpbmcgZmF1bHQgKi8KKwkJc3B1X21mY19kc2lzcl9zZXQoc3B1LCAwdWwpOworCXNwdV9pbnRfc3RhdF9jbGVhcihzcHUsIDEsIHN0YXQpOworCXNwaW5fdW5sb2NrKCZzcHUtPnJlZ2lzdGVyX2xvY2spOworCisJaWYgKHN0YXQgJiAxKSAvKiBzZWdtZW50IGZhdWx0ICovCisJCV9fc3B1X3RyYXBfZGF0YV9zZWcoc3B1LCBkYXIpOworCisJaWYgKHN0YXQgJiAyKSB7IC8qIG1hcHBpbmcgZmF1bHQgKi8KKwkJX19zcHVfdHJhcF9kYXRhX21hcChzcHUsIGRhciwgZHNpc3IpOworCX0KKworCWlmIChzdGF0ICYgNCkgLyogbHMgY29tcGFyZSAmIHN1c3BlbmQgb24gZ2V0ICovCisJCTsKKworCWlmIChzdGF0ICYgOCkgLyogbHMgY29tcGFyZSAmIHN1c3BlbmQgb24gcHV0ICovCisJCTsKKworCXJldHVybiBzdGF0ID8gSVJRX0hBTkRMRUQgOiBJUlFfTk9ORTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwdV9pcnFfY2xhc3NfMV9ib3R0b20pOworCitzdGF0aWMgaXJxcmV0dXJuX3QKK3NwdV9pcnFfY2xhc3NfMihpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHU7CisJdW5zaWduZWQgbG9uZyBzdGF0OworCXVuc2lnbmVkIGxvbmcgbWFzazsKKworCXNwdSA9IGRhdGE7CisJc3RhdCA9IHNwdV9pbnRfc3RhdF9nZXQoc3B1LCAyKTsKKwltYXNrID0gc3B1X2ludF9tYXNrX2dldChzcHUsIDIpOworCisJcHJfZGVidWcoImNsYXNzIDIgaW50ZXJydXB0ICVkLCAlbHgsICVseFxuIiwgaXJxLCBzdGF0LCBtYXNrKTsKKworCXN0YXQgJj0gbWFzazsKKworCWlmIChzdGF0ICYgMSkgIC8qIFBQQyBjb3JlIG1haWxib3ggKi8KKwkJX19zcHVfdHJhcF9tYWlsYm94KHNwdSk7CisKKwlpZiAoc3RhdCAmIDIpIC8qIFNQVSBzdG9wLWFuZC1zaWduYWwgKi8KKwkJX19zcHVfdHJhcF9zdG9wKHNwdSk7CisKKwlpZiAoc3RhdCAmIDQpIC8qIFNQVSBoYWx0ZWQgKi8KKwkJX19zcHVfdHJhcF9oYWx0KHNwdSk7CisKKwlpZiAoc3RhdCAmIDgpIC8qIERNQSB0YWcgZ3JvdXAgY29tcGxldGUgKi8KKwkJX19zcHVfdHJhcF90YWdfZ3JvdXAoc3B1KTsKKworCWlmIChzdGF0ICYgMHgxMCkgLyogU1BVIG1haWxib3ggdGhyZXNob2xkICovCisJCV9fc3B1X3RyYXBfc3B1Ym94KHNwdSk7CisKKwlzcHVfaW50X3N0YXRfY2xlYXIoc3B1LCAyLCBzdGF0KTsKKwlyZXR1cm4gc3RhdCA/IElSUV9IQU5ETEVEIDogSVJRX05PTkU7Cit9CisKK3N0YXRpYyBpbnQKK3NwdV9yZXF1ZXN0X2lycXMoc3RydWN0IHNwdSAqc3B1KQoreworCWludCByZXQ7CisJaW50IGlycV9iYXNlOworCisJaXJxX2Jhc2UgPSBJSUNfTk9ERV9TVFJJREUgKiBzcHUtPm5vZGUgKyBJSUNfU1BFX09GRlNFVDsKKworCXNucHJpbnRmKHNwdS0+aXJxX2MwLCBzaXplb2YgKHNwdS0+aXJxX2MwKSwgInNwZSUwMmQuMCIsIHNwdS0+bnVtYmVyKTsKKwlyZXQgPSByZXF1ZXN0X2lycShpcnFfYmFzZSArIHNwdS0+aXNyYywKKwkJIHNwdV9pcnFfY2xhc3NfMCwgMCwgc3B1LT5pcnFfYzAsIHNwdSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlzbnByaW50ZihzcHUtPmlycV9jMSwgc2l6ZW9mIChzcHUtPmlycV9jMSksICJzcGUlMDJkLjEiLCBzcHUtPm51bWJlcik7CisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxX2Jhc2UgKyBJSUNfQ0xBU1NfU1RSSURFICsgc3B1LT5pc3JjLAorCQkgc3B1X2lycV9jbGFzc18xLCAwLCBzcHUtPmlycV9jMSwgc3B1KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDE7CisKKwlzbnByaW50ZihzcHUtPmlycV9jMiwgc2l6ZW9mIChzcHUtPmlycV9jMiksICJzcGUlMDJkLjIiLCBzcHUtPm51bWJlcik7CisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxX2Jhc2UgKyAyKklJQ19DTEFTU19TVFJJREUgKyBzcHUtPmlzcmMsCisJCSBzcHVfaXJxX2NsYXNzXzIsIDAsIHNwdS0+aXJxX2MyLCBzcHUpOworCWlmIChyZXQpCisJCWdvdG8gb3V0MjsKKwlnb3RvIG91dDsKKworb3V0MjoKKwlmcmVlX2lycShpcnFfYmFzZSArIElJQ19DTEFTU19TVFJJREUgKyBzcHUtPmlzcmMsIHNwdSk7CitvdXQxOgorCWZyZWVfaXJxKGlycV9iYXNlICsgc3B1LT5pc3JjLCBzcHUpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitzcHVfZnJlZV9pcnFzKHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlpbnQgaXJxX2Jhc2U7CisKKwlpcnFfYmFzZSA9IElJQ19OT0RFX1NUUklERSAqIHNwdS0+bm9kZSArIElJQ19TUEVfT0ZGU0VUOworCisJZnJlZV9pcnEoaXJxX2Jhc2UgKyBzcHUtPmlzcmMsIHNwdSk7CisJZnJlZV9pcnEoaXJxX2Jhc2UgKyBJSUNfQ0xBU1NfU1RSSURFICsgc3B1LT5pc3JjLCBzcHUpOworCWZyZWVfaXJxKGlycV9iYXNlICsgMipJSUNfQ0xBU1NfU1RSSURFICsgc3B1LT5pc3JjLCBzcHUpOworfQorCitzdGF0aWMgTElTVF9IRUFEKHNwdV9saXN0KTsKK3N0YXRpYyBERUNMQVJFX01VVEVYKHNwdV9tdXRleCk7CisKK3N0YXRpYyB2b2lkIHNwdV9pbml0X2NoYW5uZWxzKHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJIHVuc2lnbmVkIGNoYW5uZWw7CisJCSB1bnNpZ25lZCBjb3VudDsKKwl9IHplcm9fbGlzdFtdID0geworCQl7IDB4MDAsIDEsIH0sIHsgMHgwMSwgMSwgfSwgeyAweDAzLCAxLCB9LCB7IDB4MDQsIDEsIH0sCisJCXsgMHgxOCwgMSwgfSwgeyAweDE5LCAxLCB9LCB7IDB4MWIsIDEsIH0sIHsgMHgxZCwgMSwgfSwKKwl9LCBjb3VudF9saXN0W10gPSB7CisJCXsgMHgwMCwgMCwgfSwgeyAweDAzLCAwLCB9LCB7IDB4MDQsIDAsIH0sIHsgMHgxNSwgMTYsIH0sCisJCXsgMHgxNywgMSwgfSwgeyAweDE4LCAwLCB9LCB7IDB4MTksIDAsIH0sIHsgMHgxYiwgMCwgfSwKKwkJeyAweDFjLCAxLCB9LCB7IDB4MWQsIDAsIH0sIHsgMHgxZSwgMSwgfSwKKwl9OworCXN0cnVjdCBzcHVfcHJpdjIgX19pb21lbSAqcHJpdjI7CisJaW50IGk7CisKKwlwcml2MiA9IHNwdS0+cHJpdjI7CisKKwkvKiBpbml0aWFsaXplIGFsbCBjaGFubmVsIGRhdGEgdG8gemVybyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHplcm9fbGlzdCk7IGkrKykgeworCQlpbnQgY291bnQ7CisKKwkJb3V0X2JlNjQoJnByaXYyLT5zcHVfY2hubGNudHB0cl9SVywgemVyb19saXN0W2ldLmNoYW5uZWwpOworCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCB6ZXJvX2xpc3RbaV0uY291bnQ7IGNvdW50KyspCisJCQlvdXRfYmU2NCgmcHJpdjItPnNwdV9jaG5sZGF0YV9SVywgMCk7CisJfQorCisJLyogaW5pdGlhbGl6ZSBjaGFubmVsIGNvdW50cyB0byBtZWFuaW5nZnVsIHZhbHVlcyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvdW50X2xpc3QpOyBpKyspIHsKKwkJb3V0X2JlNjQoJnByaXYyLT5zcHVfY2hubGNudHB0cl9SVywgY291bnRfbGlzdFtpXS5jaGFubmVsKTsKKwkJb3V0X2JlNjQoJnByaXYyLT5zcHVfY2hubGNudF9SVywgY291bnRfbGlzdFtpXS5jb3VudCk7CisJfQorfQorCitzdHJ1Y3Qgc3B1ICpzcHVfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHU7CisKKwlkb3duKCZzcHVfbXV0ZXgpOworCWlmICghbGlzdF9lbXB0eSgmc3B1X2xpc3QpKSB7CisJCXNwdSA9IGxpc3RfZW50cnkoc3B1X2xpc3QubmV4dCwgc3RydWN0IHNwdSwgbGlzdCk7CisJCWxpc3RfZGVsX2luaXQoJnNwdS0+bGlzdCk7CisJCXByX2RlYnVnKCJHb3QgU1BVICV4ICVkXG4iLCBzcHUtPmlzcmMsIHNwdS0+bnVtYmVyKTsKKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiTm8gU1BVIGxlZnRcbiIpOworCQlzcHUgPSBOVUxMOworCX0KKwl1cCgmc3B1X211dGV4KTsKKworCWlmIChzcHUpCisJCXNwdV9pbml0X2NoYW5uZWxzKHNwdSk7CisKKwlyZXR1cm4gc3B1OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3B1X2FsbG9jKTsKKwordm9pZCBzcHVfZnJlZShzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJZG93bigmc3B1X211dGV4KTsKKwlsaXN0X2FkZF90YWlsKCZzcHUtPmxpc3QsICZzcHVfbGlzdCk7CisJdXAoJnNwdV9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcHVfZnJlZSk7CisKK3N0YXRpYyBpbnQgc3B1X2hhbmRsZV9tbV9mYXVsdChzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBzcHUtPm1tOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXU2NCBlYSwgZHNpc3IsIGlzX3dyaXRlOworCWludCByZXQ7CisKKwllYSA9IHNwdS0+ZGFyOworCWRzaXNyID0gc3B1LT5kc2lzcjsKKyNpZiAwCisJaWYgKCFJU19WQUxJRF9FQShlYSkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorI2VuZGlmIC8qIFhYWCAqLworCWlmIChtbSA9PSBOVUxMKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlpZiAobW0tPnBnZCA9PSBOVUxMKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwl2bWEgPSBmaW5kX3ZtYShtbSwgZWEpOworCWlmICghdm1hKQorCQlnb3RvIGJhZF9hcmVhOworCWlmICh2bWEtPnZtX3N0YXJ0IDw9IGVhKQorCQlnb3RvIGdvb2RfYXJlYTsKKwlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fR1JPV1NET1dOKSkKKwkJZ290byBiYWRfYXJlYTsKKyNpZiAwCisJaWYgKGV4cGFuZF9zdGFjayh2bWEsIGVhKSkKKwkJZ290byBiYWRfYXJlYTsKKyNlbmRpZiAvKiBYWFggKi8KK2dvb2RfYXJlYToKKwlpc193cml0ZSA9IGRzaXNyICYgTUZDX0RTSVNSX0FDQ0VTU19QVVQ7CisJaWYgKGlzX3dyaXRlKSB7CisJCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpCisJCQlnb3RvIGJhZF9hcmVhOworCX0gZWxzZSB7CisJCWlmIChkc2lzciAmIE1GQ19EU0lTUl9BQ0NFU1NfREVOSUVEKQorCQkJZ290byBiYWRfYXJlYTsKKwkJaWYgKCEodm1hLT52bV9mbGFncyAmIChWTV9SRUFEIHwgVk1fRVhFQykpKQorCQkJZ290byBiYWRfYXJlYTsKKwl9CisJcmV0ID0gMDsKKwlzd2l0Y2ggKGhhbmRsZV9tbV9mYXVsdChtbSwgdm1hLCBlYSwgaXNfd3JpdGUpKSB7CisJY2FzZSBWTV9GQVVMVF9NSU5PUjoKKwkJY3VycmVudC0+bWluX2ZsdCsrOworCQlicmVhazsKKwljYXNlIFZNX0ZBVUxUX01BSk9SOgorCQljdXJyZW50LT5tYWpfZmx0Kys7CisJCWJyZWFrOworCWNhc2UgVk1fRkFVTFRfU0lHQlVTOgorCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGJhZF9hcmVhOworCWNhc2UgVk1fRkFVTFRfT09NOgorCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGJhZF9hcmVhOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCXJldHVybiByZXQ7CisKK2JhZF9hcmVhOgorCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKK2ludCBzcHVfaXJxX2NsYXNzXzFfYm90dG9tKHN0cnVjdCBzcHUgKnNwdSkKK3sKKwl1NjQgZWEsIGRzaXNyLCBhY2Nlc3MsIGVycm9yID0gMFVMOworCWludCByZXQgPSAwOworCisJZWEgPSBzcHUtPmRhcjsKKwlkc2lzciA9IHNwdS0+ZHNpc3I7CisJaWYgKGRzaXNyICYgTUZDX0RTSVNSX1BURV9OT1RfRk9VTkQpIHsKKwkJYWNjZXNzID0gKF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9VU0VSKTsKKwkJYWNjZXNzIHw9IChkc2lzciAmIE1GQ19EU0lTUl9BQ0NFU1NfUFVUKSA/IF9QQUdFX1JXIDogMFVMOworCQlpZiAoaGFzaF9wYWdlKGVhLCBhY2Nlc3MsIDB4MzAwKSAhPSAwKQorCQkJZXJyb3IgfD0gQ0xBU1MxX0VOQUJMRV9TVE9SQUdFX0ZBVUxUX0lOVFI7CisJfQorCWlmICgoZXJyb3IgJiBDTEFTUzFfRU5BQkxFX1NUT1JBR0VfRkFVTFRfSU5UUikgfHwKKwkgICAgKGRzaXNyICYgTUZDX0RTSVNSX0FDQ0VTU19ERU5JRUQpKSB7CisJCWlmICgocmV0ID0gc3B1X2hhbmRsZV9tbV9mYXVsdChzcHUpKSAhPSAwKQorCQkJZXJyb3IgfD0gQ0xBU1MxX0VOQUJMRV9TVE9SQUdFX0ZBVUxUX0lOVFI7CisJCWVsc2UKKwkJCWVycm9yICY9IH5DTEFTUzFfRU5BQkxFX1NUT1JBR0VfRkFVTFRfSU5UUjsKKwl9CisJc3B1LT5kYXIgPSAwVUw7CisJc3B1LT5kc2lzciA9IDBVTDsKKwlpZiAoIWVycm9yKSB7CisJCXNwdV9yZXN0YXJ0X2RtYShzcHUpOworCX0gZWxzZSB7CisJCV9fc3B1X3RyYXBfaW52YWxpZF9kbWEoc3B1KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBzcHVfaXJxX3NldGFmZmluaXR5KHN0cnVjdCBzcHUgKnNwdSwgaW50IGNwdSkKK3sKKwl1NjQgdGFyZ2V0ID0gaWljX2dldF90YXJnZXRfaWQoY3B1KTsKKwl1NjQgcm91dGUgPSB0YXJnZXQgPDwgNDggfCB0YXJnZXQgPDwgMzIgfCB0YXJnZXQgPDwgMTY7CisJc3B1X2ludF9yb3V0ZV9zZXQoc3B1LCByb3V0ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcHVfaXJxX3NldGFmZmluaXR5KTsKKworc3RhdGljIHZvaWQgX19pb21lbSAqIF9faW5pdCBtYXBfc3BlX3Byb3Aoc3RydWN0IGRldmljZV9ub2RlICpuLAorCQkJCQkJIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGFkZHJlc3NfcHJvcCB7CisJCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwkJdW5zaWduZWQgaW50IGxlbjsKKwl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpICpwcm9wOworCisJdm9pZCAqcDsKKwlpbnQgcHJvcGxlbjsKKworCXAgPSBnZXRfcHJvcGVydHkobiwgbmFtZSwgJnByb3BsZW4pOworCWlmIChwcm9wbGVuICE9IHNpemVvZiAoc3RydWN0IGFkZHJlc3NfcHJvcCkpCisJCXJldHVybiBOVUxMOworCisJcHJvcCA9IHA7CisKKwlyZXR1cm4gaW9yZW1hcChwcm9wLT5hZGRyZXNzLCBwcm9wLT5sZW4pOworfQorCitzdGF0aWMgdm9pZCBzcHVfdW5tYXAoc3RydWN0IHNwdSAqc3B1KQoreworCWlvdW5tYXAoc3B1LT5wcml2Mik7CisJaW91bm1hcChzcHUtPnByaXYxKTsKKwlpb3VubWFwKHNwdS0+cHJvYmxlbSk7CisJaW91bm1hcCgodTggX19pb21lbSAqKXNwdS0+bG9jYWxfc3RvcmUpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzcHVfbWFwX2RldmljZShzdHJ1Y3Qgc3B1ICpzcHUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqc3BlKQoreworCWNoYXIgKnByb3A7CisJaW50IHJldDsKKworCXJldCA9IC1FTk9ERVY7CisJcHJvcCA9IGdldF9wcm9wZXJ0eShzcGUsICJpc3JjIiwgTlVMTCk7CisJaWYgKCFwcm9wKQorCQlnb3RvIG91dDsKKwlzcHUtPmlzcmMgPSAqKHVuc2lnbmVkIGludCAqKXByb3A7CisKKwlzcHUtPm5hbWUgPSBnZXRfcHJvcGVydHkoc3BlLCAibmFtZSIsIE5VTEwpOworCWlmICghc3B1LT5uYW1lKQorCQlnb3RvIG91dDsKKworCXByb3AgPSBnZXRfcHJvcGVydHkoc3BlLCAibG9jYWwtc3RvcmUiLCBOVUxMKTsKKwlpZiAoIXByb3ApCisJCWdvdG8gb3V0OworCXNwdS0+bG9jYWxfc3RvcmVfcGh5cyA9ICoodW5zaWduZWQgbG9uZyAqKXByb3A7CisKKwkvKiB3ZSB1c2UgbG9jYWwgc3RvcmUgYXMgcmFtLCBub3QgaW8gbWVtb3J5ICovCisJc3B1LT5sb2NhbF9zdG9yZSA9ICh2b2lkIF9fZm9yY2UgKiltYXBfc3BlX3Byb3Aoc3BlLCAibG9jYWwtc3RvcmUiKTsKKwlpZiAoIXNwdS0+bG9jYWxfc3RvcmUpCisJCWdvdG8gb3V0OworCisJc3B1LT5wcm9ibGVtPSBtYXBfc3BlX3Byb3Aoc3BlLCAicHJvYmxlbSIpOworCWlmICghc3B1LT5wcm9ibGVtKQorCQlnb3RvIG91dF91bm1hcDsKKworCXNwdS0+cHJpdjE9IG1hcF9zcGVfcHJvcChzcGUsICJwcml2MSIpOworCS8qIHByaXYxIGlzIG5vdCBhdmFpbGFibGUgb24gYSBoeXBlcnZpc29yICovCisKKwlzcHUtPnByaXYyPSBtYXBfc3BlX3Byb3Aoc3BlLCAicHJpdjIiKTsKKwlpZiAoIXNwdS0+cHJpdjIpCisJCWdvdG8gb3V0X3VubWFwOworCXJldCA9IDA7CisJZ290byBvdXQ7CisKK291dF91bm1hcDoKKwlzcHVfdW5tYXAoc3B1KTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBmaW5kX3NwdV9ub2RlX2lkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqc3BlKQoreworCXVuc2lnbmVkIGludCAqaWQ7CisJc3RydWN0IGRldmljZV9ub2RlICpjcHU7CisKKwljcHUgPSBzcGUtPnBhcmVudC0+cGFyZW50OworCWlkID0gKHVuc2lnbmVkIGludCAqKWdldF9wcm9wZXJ0eShjcHUsICJub2RlLWlkIiwgTlVMTCk7CisKKwlyZXR1cm4gaWQgPyAqaWQgOiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjcmVhdGVfc3B1KHN0cnVjdCBkZXZpY2Vfbm9kZSAqc3BlKQoreworCXN0cnVjdCBzcHUgKnNwdTsKKwlpbnQgcmV0OworCXN0YXRpYyBpbnQgbnVtYmVyOworCisJcmV0ID0gLUVOT01FTTsKKwlzcHUgPSBrbWFsbG9jKHNpemVvZiAoKnNwdSksIEdGUF9LRVJORUwpOworCWlmICghc3B1KQorCQlnb3RvIG91dDsKKworCXJldCA9IHNwdV9tYXBfZGV2aWNlKHNwdSwgc3BlKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9mcmVlOworCisJc3B1LT5ub2RlID0gZmluZF9zcHVfbm9kZV9pZChzcGUpOworCXNwdS0+c3RvcF9jb2RlID0gMDsKKwlzcHUtPnNsYl9yZXBsYWNlID0gMDsKKwlzcHUtPm1tID0gTlVMTDsKKwlzcHUtPmN0eCA9IE5VTEw7CisJc3B1LT5ycSA9IE5VTEw7CisJc3B1LT5waWQgPSAwOworCXNwdS0+Y2xhc3NfMF9wZW5kaW5nID0gMDsKKwlzcHUtPmZsYWdzID0gMFVMOworCXNwdS0+ZGFyID0gMFVMOworCXNwdS0+ZHNpc3IgPSAwVUw7CisJc3Bpbl9sb2NrX2luaXQoJnNwdS0+cmVnaXN0ZXJfbG9jayk7CisKKwlzcHVfbWZjX3Nkcl9zZXQoc3B1LCBtZnNwcihTUFJOX1NEUjEpKTsKKwlzcHVfbWZjX3NyMV9zZXQoc3B1LCAweDMzKTsKKworCXNwdS0+aWJveF9jYWxsYmFjayA9IE5VTEw7CisJc3B1LT53Ym94X2NhbGxiYWNrID0gTlVMTDsKKwlzcHUtPnN0b3BfY2FsbGJhY2sgPSBOVUxMOworCisJZG93bigmc3B1X211dGV4KTsKKwlzcHUtPm51bWJlciA9IG51bWJlcisrOworCXJldCA9IHNwdV9yZXF1ZXN0X2lycXMoc3B1KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF91bm1hcDsKKworCWxpc3RfYWRkKCZzcHUtPmxpc3QsICZzcHVfbGlzdCk7CisJdXAoJnNwdV9tdXRleCk7CisKKwlwcl9kZWJ1ZyhLRVJOX0RFQlVHICJVc2luZyBTUEUgJXMgJTAyeCAlcCAlcCAlcCAlcCAlZFxuIiwKKwkJc3B1LT5uYW1lLCBzcHUtPmlzcmMsIHNwdS0+bG9jYWxfc3RvcmUsCisJCXNwdS0+cHJvYmxlbSwgc3B1LT5wcml2MSwgc3B1LT5wcml2Miwgc3B1LT5udW1iZXIpOworCWdvdG8gb3V0OworCitvdXRfdW5tYXA6CisJdXAoJnNwdV9tdXRleCk7CisJc3B1X3VubWFwKHNwdSk7CitvdXRfZnJlZToKKwlrZnJlZShzcHUpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfc3B1KHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlsaXN0X2RlbF9pbml0KCZzcHUtPmxpc3QpOworCisJc3B1X2ZyZWVfaXJxcyhzcHUpOworCXNwdV91bm1hcChzcHUpOworCWtmcmVlKHNwdSk7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfc3B1X2Jhc2Uodm9pZCkKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHUsICp0bXA7CisJZG93bigmc3B1X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc3B1LCB0bXAsICZzcHVfbGlzdCwgbGlzdCkKKwkJZGVzdHJveV9zcHUoc3B1KTsKKwl1cCgmc3B1X211dGV4KTsKK30KK21vZHVsZV9leGl0KGNsZWFudXBfc3B1X2Jhc2UpOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3NwdV9iYXNlKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlOworCWludCByZXQ7CisKKwlyZXQgPSAtRU5PREVWOworCWZvciAobm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJzcGUiKTsKKwkJCW5vZGU7IG5vZGUgPSBvZl9maW5kX25vZGVfYnlfdHlwZShub2RlLCAic3BlIikpIHsKKwkJcmV0ID0gY3JlYXRlX3NwdShub2RlKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEVycm9yIGluaXRpYWxpemluZyAlc1xuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIG5vZGUtPm5hbWUpOworCQkJY2xlYW51cF9zcHVfYmFzZSgpOworCQkJYnJlYWs7CisJCX0KKwl9CisJLyogaW4gc29tZSBvbGQgZmlybXdhcmUgdmVyc2lvbnMsIHRoZSBzcGUgaXMgY2FsbGVkICdzcGMnLCBzbyB3ZQorCSAgIGxvb2sgZm9yIHRoYXQgYXMgd2VsbCAqLworCWZvciAobm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJzcGMiKTsKKwkJCW5vZGU7IG5vZGUgPSBvZl9maW5kX25vZGVfYnlfdHlwZShub2RlLCAic3BjIikpIHsKKwkJcmV0ID0gY3JlYXRlX3NwdShub2RlKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEVycm9yIGluaXRpYWxpemluZyAlc1xuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIG5vZGUtPm5hbWUpOworCQkJY2xlYW51cF9zcHVfYmFzZSgpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KK21vZHVsZV9pbml0KGluaXRfc3B1X2Jhc2UpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJBcm5kIEJlcmdtYW5uIDxhcm5kYkBkZS5pYm0uY29tPiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9wcml2MS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9wcml2MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNjU2NDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X3ByaXYxLmMKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBhY2Nlc3MgdG8gU1BVIHByaXZpbGVnZWQgcmVnaXN0ZXJzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zcHUuaD4KKwordm9pZCBzcHVfaW50X21hc2tfYW5kKHN0cnVjdCBzcHUgKnNwdSwgaW50IGNsYXNzLCB1NjQgbWFzaykKK3sKKwl1NjQgb2xkX21hc2s7CisKKwlvbGRfbWFzayA9IGluX2JlNjQoJnNwdS0+cHJpdjEtPmludF9tYXNrX1JXW2NsYXNzXSk7CisJb3V0X2JlNjQoJnNwdS0+cHJpdjEtPmludF9tYXNrX1JXW2NsYXNzXSwgb2xkX21hc2sgJiBtYXNrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwdV9pbnRfbWFza19hbmQpOworCit2b2lkIHNwdV9pbnRfbWFza19vcihzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjbGFzcywgdTY0IG1hc2spCit7CisJdTY0IG9sZF9tYXNrOworCisJb2xkX21hc2sgPSBpbl9iZTY0KCZzcHUtPnByaXYxLT5pbnRfbWFza19SV1tjbGFzc10pOworCW91dF9iZTY0KCZzcHUtPnByaXYxLT5pbnRfbWFza19SV1tjbGFzc10sIG9sZF9tYXNrIHwgbWFzayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcHVfaW50X21hc2tfb3IpOworCit2b2lkIHNwdV9pbnRfbWFza19zZXQoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MsIHU2NCBtYXNrKQoreworCW91dF9iZTY0KCZzcHUtPnByaXYxLT5pbnRfbWFza19SV1tjbGFzc10sIG1hc2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3B1X2ludF9tYXNrX3NldCk7CisKK3U2NCBzcHVfaW50X21hc2tfZ2V0KHN0cnVjdCBzcHUgKnNwdSwgaW50IGNsYXNzKQoreworCXJldHVybiBpbl9iZTY0KCZzcHUtPnByaXYxLT5pbnRfbWFza19SV1tjbGFzc10pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3B1X2ludF9tYXNrX2dldCk7CisKK3ZvaWQgc3B1X2ludF9zdGF0X2NsZWFyKHN0cnVjdCBzcHUgKnNwdSwgaW50IGNsYXNzLCB1NjQgc3RhdCkKK3sKKwlvdXRfYmU2NCgmc3B1LT5wcml2MS0+aW50X3N0YXRfUldbY2xhc3NdLCBzdGF0KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwdV9pbnRfc3RhdF9jbGVhcik7CisKK3U2NCBzcHVfaW50X3N0YXRfZ2V0KHN0cnVjdCBzcHUgKnNwdSwgaW50IGNsYXNzKQoreworCXJldHVybiBpbl9iZTY0KCZzcHUtPnByaXYxLT5pbnRfc3RhdF9SV1tjbGFzc10pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3B1X2ludF9zdGF0X2dldCk7CisKK3ZvaWQgc3B1X2ludF9yb3V0ZV9zZXQoc3RydWN0IHNwdSAqc3B1LCB1NjQgcm91dGUpCit7CisJb3V0X2JlNjQoJnNwdS0+cHJpdjEtPmludF9yb3V0ZV9SVywgcm91dGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3B1X2ludF9yb3V0ZV9zZXQpOworCit1NjQgc3B1X21mY19kYXJfZ2V0KHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlyZXR1cm4gaW5fYmU2NCgmc3B1LT5wcml2MS0+bWZjX2Rhcl9SVyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcHVfbWZjX2Rhcl9nZXQpOworCit1NjQgc3B1X21mY19kc2lzcl9nZXQoc3RydWN0IHNwdSAqc3B1KQoreworCXJldHVybiBpbl9iZTY0KCZzcHUtPnByaXYxLT5tZmNfZHNpc3JfUlcpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3B1X21mY19kc2lzcl9nZXQpOworCit2b2lkIHNwdV9tZmNfZHNpc3Jfc2V0KHN0cnVjdCBzcHUgKnNwdSwgdTY0IGRzaXNyKQoreworCW91dF9iZTY0KCZzcHUtPnByaXYxLT5tZmNfZHNpc3JfUlcsIGRzaXNyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwdV9tZmNfZHNpc3Jfc2V0KTsKKwordm9pZCBzcHVfbWZjX3Nkcl9zZXQoc3RydWN0IHNwdSAqc3B1LCB1NjQgc2RyKQoreworCW91dF9iZTY0KCZzcHUtPnByaXYxLT5tZmNfc2RyX1JXLCBzZHIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3B1X21mY19zZHJfc2V0KTsKKwordm9pZCBzcHVfbWZjX3NyMV9zZXQoc3RydWN0IHNwdSAqc3B1LCB1NjQgc3IxKQoreworCW91dF9iZTY0KCZzcHUtPnByaXYxLT5tZmNfc3IxX1JXLCBzcjEpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3B1X21mY19zcjFfc2V0KTsKKwordTY0IHNwdV9tZmNfc3IxX2dldChzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJcmV0dXJuIGluX2JlNjQoJnNwdS0+cHJpdjEtPm1mY19zcjFfUlcpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3B1X21mY19zcjFfZ2V0KTsKKwordm9pZCBzcHVfbWZjX3RjbGFzc19pZF9zZXQoc3RydWN0IHNwdSAqc3B1LCB1NjQgdGNsYXNzX2lkKQoreworCW91dF9iZTY0KCZzcHUtPnByaXYxLT5tZmNfdGNsYXNzX2lkX1JXLCB0Y2xhc3NfaWQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3B1X21mY190Y2xhc3NfaWRfc2V0KTsKKwordTY0IHNwdV9tZmNfdGNsYXNzX2lkX2dldChzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJcmV0dXJuIGluX2JlNjQoJnNwdS0+cHJpdjEtPm1mY190Y2xhc3NfaWRfUlcpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3B1X21mY190Y2xhc3NfaWRfZ2V0KTsKKwordm9pZCBzcHVfdGxiX2ludmFsaWRhdGUoc3RydWN0IHNwdSAqc3B1KQoreworCW91dF9iZTY0KCZzcHUtPnByaXYxLT50bGJfaW52YWxpZGF0ZV9lbnRyeV9XLCAwdWwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3B1X3RsYl9pbnZhbGlkYXRlKTsKKwordm9pZCBzcHVfcmVzb3VyY2VfYWxsb2NhdGlvbl9ncm91cElEX3NldChzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCBpZCkKK3sKKwlvdXRfYmU2NCgmc3B1LT5wcml2MS0+cmVzb3VyY2VfYWxsb2NhdGlvbl9ncm91cElEX1JXLCBpZCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcHVfcmVzb3VyY2VfYWxsb2NhdGlvbl9ncm91cElEX3NldCk7CisKK3U2NCBzcHVfcmVzb3VyY2VfYWxsb2NhdGlvbl9ncm91cElEX2dldChzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJcmV0dXJuIGluX2JlNjQoJnNwdS0+cHJpdjEtPnJlc291cmNlX2FsbG9jYXRpb25fZ3JvdXBJRF9SVyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcHVfcmVzb3VyY2VfYWxsb2NhdGlvbl9ncm91cElEX2dldCk7CisKK3ZvaWQgc3B1X3Jlc291cmNlX2FsbG9jYXRpb25fZW5hYmxlX3NldChzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCBlbmFibGUpCit7CisJb3V0X2JlNjQoJnNwdS0+cHJpdjEtPnJlc291cmNlX2FsbG9jYXRpb25fZW5hYmxlX1JXLCBlbmFibGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3B1X3Jlc291cmNlX2FsbG9jYXRpb25fZW5hYmxlX3NldCk7CisKK3U2NCBzcHVfcmVzb3VyY2VfYWxsb2NhdGlvbl9lbmFibGVfZ2V0KHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlyZXR1cm4gaW5fYmU2NCgmc3B1LT5wcml2MS0+cmVzb3VyY2VfYWxsb2NhdGlvbl9lbmFibGVfUlcpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3B1X3Jlc291cmNlX2FsbG9jYXRpb25fZW5hYmxlX2dldCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X3N5c2NhbGxzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X3N5c2NhbGxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYxYjUwNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfc3lzY2FsbHMuYwpAQCAtMCwwICsxLDg4IEBACisvKgorICogU1BVIGZpbGUgc3lzdGVtIC0tIHN5c3RlbSBjYWxsIHN0dWJzCisgKgorICogKEMpIENvcHlyaWdodCBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCAyMDA1CisgKgorICogQXV0aG9yOiBBcm5kIEJlcmdtYW5uIDxhcm5kYkBkZS5pYm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisKKyNpbmNsdWRlIDxhc20vc3B1Lmg+CisKK3N0cnVjdCBzcHVmc19jYWxscyBzcHVmc19jYWxscyA9IHsKKwkub3duZXIgPSBOVUxMLAorfTsKKworLyogVGhlc2Ugc3R1YiBzeXNjYWxscyBhcmUgbmVlZGVkIHRvIGhhdmUgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbgorICogd2l0aGluIGEgbG9hZGFibGUgbW9kdWxlLiBXaGVuIHNwdWZzIGlzIGJ1aWx0IGludG8gdGhlIGtlcm5lbCwKKyAqIHRoaXMgZmlsZSBpcyBub3QgdXNlZCBhbmQgdGhlIHN5c2NhbGxzIGRpcmVjdGx5IGVudGVyIHRoZSBmcyBjb2RlICovCisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfc3B1X2NyZWF0ZShjb25zdCBjaGFyIF9fdXNlciAqbmFtZSwKKwkJdW5zaWduZWQgaW50IGZsYWdzLCBtb2RlX3QgbW9kZSkKK3sKKwlsb25nIHJldDsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lciA9IHNwdWZzX2NhbGxzLm93bmVyOworCisJcmV0ID0gLUVOT1NZUzsKKwlpZiAob3duZXIgJiYgdHJ5X21vZHVsZV9nZXQob3duZXIpKSB7CisJCXJldCA9IHNwdWZzX2NhbGxzLmNyZWF0ZV90aHJlYWQobmFtZSwgZmxhZ3MsIG1vZGUpOworCQltb2R1bGVfcHV0KG93bmVyKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19zcHVfcnVuKGludCBmZCwgX191MzIgX191c2VyICp1bnBjLCBfX3UzMiBfX3VzZXIgKnVzdGF0dXMpCit7CisJbG9uZyByZXQ7CisJc3RydWN0IGZpbGUgKmZpbHA7CisJaW50IGZwdXRfbmVlZGVkOworCXN0cnVjdCBtb2R1bGUgKm93bmVyID0gc3B1ZnNfY2FsbHMub3duZXI7CisKKwlyZXQgPSAtRU5PU1lTOworCWlmIChvd25lciAmJiB0cnlfbW9kdWxlX2dldChvd25lcikpIHsKKwkJcmV0ID0gLUVCQURGOworCQlmaWxwID0gZmdldF9saWdodChmZCwgJmZwdXRfbmVlZGVkKTsKKwkJaWYgKGZpbHApIHsKKwkJCXJldCA9IHNwdWZzX2NhbGxzLnNwdV9ydW4oZmlscCwgdW5wYywgdXN0YXR1cyk7CisJCQlmcHV0X2xpZ2h0KGZpbHAsIGZwdXRfbmVlZGVkKTsKKwkJfQorCQltb2R1bGVfcHV0KG93bmVyKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IHJlZ2lzdGVyX3NwdV9zeXNjYWxscyhzdHJ1Y3Qgc3B1ZnNfY2FsbHMgKmNhbGxzKQoreworCWlmIChzcHVmc19jYWxscy5vd25lcikKKwkJcmV0dXJuIC1FQlVTWTsKKworCXNwdWZzX2NhbGxzLmNyZWF0ZV90aHJlYWQgPSBjYWxscy0+Y3JlYXRlX3RocmVhZDsKKwlzcHVmc19jYWxscy5zcHVfcnVuID0gY2FsbHMtPnNwdV9ydW47CisJc21wX21iKCk7CisJc3B1ZnNfY2FsbHMub3duZXIgPSBjYWxscy0+b3duZXI7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyZWdpc3Rlcl9zcHVfc3lzY2FsbHMpOworCit2b2lkIHVucmVnaXN0ZXJfc3B1X3N5c2NhbGxzKHN0cnVjdCBzcHVmc19jYWxscyAqY2FsbHMpCit7CisJQlVHX09OKHNwdWZzX2NhbGxzLm93bmVyICE9IGNhbGxzLT5vd25lcik7CisJc3B1ZnNfY2FsbHMub3duZXIgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwodW5yZWdpc3Rlcl9zcHVfc3lzY2FsbHMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Y2RkZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvTWFrZWZpbGUKQEAgLTAsMCArMSw1NCBAQAorb2JqLSQoQ09ORklHX1NQVV9GUykgKz0gc3B1ZnMubworc3B1ZnMteSArPSBpbm9kZS5vIGZpbGUubyBjb250ZXh0Lm8gc3dpdGNoLm8gc3lzY2FsbHMubworc3B1ZnMteSArPSBzY2hlZC5vIGJhY2tpbmdfb3BzLm8gaHdfb3BzLm8gcnVuLm8KKworIyBSdWxlcyB0byBidWlsZCBzd2l0Y2gubyB3aXRoIHRoZSBoZWxwIG9mIFNQVSB0b29sIGNoYWluCitTUFVfQ1JPU1MJOj0gc3B1LQorU1BVX0NDCQk6PSAkKFNQVV9DUk9TUylnY2MKK1NQVV9BUwkJOj0gJChTUFVfQ1JPU1MpZ2NjCitTUFVfTEQJCTo9ICQoU1BVX0NST1NTKWxkCitTUFVfT0JKQ09QWQk6PSAkKFNQVV9DUk9TUylvYmpjb3B5CitTUFVfQ0ZMQUdTCTo9IC1PMiAtV2FsbCAtSSQoc3JjdHJlZSkvaW5jbHVkZSAtSSQob2JqdHJlZSkvaW5jbHVkZTIKK1NQVV9BRkxBR1MJOj0gLWMgLURfX0FTU0VNQkxZX18gLUkkKHNyY3RyZWUpL2luY2x1ZGUgLUkkKG9ianRyZWUpL2luY2x1ZGUyCitTUFVfTERGTEFHUwk6PSAtTiAtVHRleHQ9MHgwCisKKyQob2JqKS9zd2l0Y2gubzogJChvYmopL3NwdV9zYXZlX2R1bXAuaCAkKG9iaikvc3B1X3Jlc3RvcmVfZHVtcC5oCisKKyMgQ29tcGlsZSBTUFUgZmlsZXMKKyAgICAgIGNtZF9zcHVfY2MgPSAkKFNQVV9DQykgJChTUFVfQ0ZMQUdTKSAtYyAtbyAkQCAkPAorcXVpZXRfY21kX3NwdV9jYyA9IFNQVV9DQyAgJEAKKyQob2JqKS9zcHVfJS5vOiAkKHNyYykvc3B1XyUuYworCSQoY2FsbCBpZl9jaGFuZ2VkLHNwdV9jYykKKworIyBBc3NlbWJsZSBTUFUgZmlsZXMKKyAgICAgIGNtZF9zcHVfYXMgPSAkKFNQVV9BUykgJChTUFVfQUZMQUdTKSAtbyAkQCAkPAorcXVpZXRfY21kX3NwdV9hcyA9IFNQVV9BUyAgJEAKKyQob2JqKS9zcHVfJS5vOiAkKHNyYykvc3B1XyUuUworCSQoY2FsbCBpZl9jaGFuZ2VkLHNwdV9hcykKKworIyBMaW5rIFNQVSBFeGVjdXRhYmxlcworICAgICAgY21kX3NwdV9sZCA9ICQoU1BVX0xEKSAkKFNQVV9MREZMQUdTKSAtbyAkQCAkXgorcXVpZXRfY21kX3NwdV9sZCA9IFNQVV9MRCAgJEAKKyQob2JqKS9zcHVfJTogJChvYmopL3NwdV8lX2NydDAubyAkKG9iaikvc3B1XyUubworCSQoY2FsbCBpZl9jaGFuZ2VkLHNwdV9sZCkKKworIyBDb3B5IGludG8gYmluYXJ5IGZvcm1hdAorICAgICAgY21kX3NwdV9vYmpjb3B5ID0gJChTUFVfT0JKQ09QWSkgLU8gYmluYXJ5ICQ8ICRACitxdWlldF9jbWRfc3B1X29iamNvcHkgPSBPQkpDT1BZICRACiskKG9iaikvc3B1XyUuYmluOiAkKHNyYykvc3B1XyUKKwkkKGNhbGwgaWZfY2hhbmdlZCxzcHVfb2JqY29weSkKKworIyBjcmVhdGUgQyBjb2RlIGZyb20gRUxGIGV4ZWN1dGFibGUKK2NtZF9oZXhkdW1wICAgPSAoIFwKKwkJZWNobyAiLyoiIDsgXAorCQllY2hvICIgKiAkKl9kdW1wLmg6IENvcHlyaWdodCAoQykgMjAwNSBJQk0uIiA7IFwKKwkJZWNobyAiICogSGV4LWR1bXAgYXV0byBnZW5lcmF0ZWQgZnJvbSAkKi5jLiIgOyBcCisJCWVjaG8gIiAqIERvIG5vdCBlZGl0ISIgOyBcCisJCWVjaG8gIiAqLyIgOyBcCisJCWVjaG8gInN0YXRpYyB1bnNpZ25lZCBpbnQgJCpfY29kZVtdIF9fcGFnZV9hbGlnbmVkID0geyIgOyBcCisJCWhleGR1bXAgLXYgLWUgJyIweCIgNC8xICIlMDJ4IiAiLCIgIlxuIicgJDwgOyBcCisJCWVjaG8gIn07IiA7IFwKKwkJKSA+ICRACitxdWlldF9jbWRfaGV4ZHVtcCA9IEhFWERVTVAgJEAKKyQob2JqKS8lX2R1bXAuaDogJChvYmopLyUuYmluCisJJChjYWxsIGlmX2NoYW5nZWQsaGV4ZHVtcCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9iYWNraW5nX29wcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2JhY2tpbmdfb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVjNDg5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvYmFja2luZ19vcHMuYwpAQCAtMCwwICsxLDMwOCBAQAorLyogYmFja2luZ19vcHMuYyAtIHF1ZXJ5L3NldCBvcGVyYXRpb25zIG9uIHNhdmVkIFNQVSBjb250ZXh0LgorICoKKyAqIENvcHlyaWdodCAoQykgSUJNIDIwMDUKKyAqIEF1dGhvcjogTWFyayBOdXR0ZXIgPG1udXR0ZXJAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGVzZSByZWdpc3RlciBvcGVyYXRpb25zIGFsbG93IFNQVUZTIHRvIG9wZXJhdGUgb24gc2F2ZWQKKyAqIFNQVSBjb250ZXh0cyByYXRoZXIgdGhhbiBoYXJkd2FyZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3B1Lmg+CisjaW5jbHVkZSA8YXNtL3NwdV9jc2EuaD4KKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlICJzcHVmcy5oIgorCisvKgorICogUmVhZHMvd3JpdGVzIHRvIHZhcmlvdXMgcHJvYmxlbSBhbmQgcHJpdjIgcmVnaXN0ZXJzIHJlcXVpcmUKKyAqIHN0YXRlIGNoYW5nZXMsIGkuZS4gIGdlbmVyYXRlIFNQVSBldmVudHMsIG1vZGlmeSBjaGFubmVsCisgKiBjb3VudHMsIGV0Yy4KKyAqLworCitzdGF0aWMgdm9pZCBnZW5fc3B1X2V2ZW50KHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1MzIgZXZlbnQpCit7CisJdTY0IGNoMF9jbnQ7CisJdTY0IGNoMF9kYXRhOworCXU2NCBjaDFfZGF0YTsKKworCWNoMF9jbnQgPSBjdHgtPmNzYS5zcHVfY2hubGNudF9SV1swXTsKKwljaDBfZGF0YSA9IGN0eC0+Y3NhLnNwdV9jaG5sZGF0YV9SV1swXTsKKwljaDFfZGF0YSA9IGN0eC0+Y3NhLnNwdV9jaG5sZGF0YV9SV1sxXTsKKwljdHgtPmNzYS5zcHVfY2hubGRhdGFfUldbMF0gfD0gZXZlbnQ7CisJaWYgKChjaDBfY250ID09IDApICYmICEoY2gwX2RhdGEgJiBldmVudCkgJiYgKGNoMV9kYXRhICYgZXZlbnQpKSB7CisJCWN0eC0+Y3NhLnNwdV9jaG5sY250X1JXWzBdID0gMTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc3B1X2JhY2tpbmdfbWJveF9yZWFkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1MzIgKiBkYXRhKQoreworCXUzMiBtYm94X3N0YXQ7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2soJmN0eC0+Y3NhLnJlZ2lzdGVyX2xvY2spOworCW1ib3hfc3RhdCA9IGN0eC0+Y3NhLnByb2IubWJfc3RhdF9SOworCWlmIChtYm94X3N0YXQgJiAweDAwMDBmZikgeworCQkvKiBSZWFkIHRoZSBmaXJzdCBhdmFpbGFibGUgd29yZC4KKwkJICogSW1wbGVtZW50YXRpb24gbm90ZTogdGhlIGRlcHRoCisJCSAqIG9mIHB1X21iX1IgaXMgY3VycmVudGx5IDEuCisJCSAqLworCQkqZGF0YSA9IGN0eC0+Y3NhLnByb2IucHVfbWJfUjsKKwkJY3R4LT5jc2EucHJvYi5tYl9zdGF0X1IgJj0gfigweDAwMDBmZik7CisJCWN0eC0+Y3NhLnNwdV9jaG5sY250X1JXWzI4XSA9IDE7CisJCWdlbl9zcHVfZXZlbnQoY3R4LCBNRkNfUFVfTUFJTEJPWF9BVkFJTEFCTEVfRVZFTlQpOworCQlyZXQgPSA0OworCX0KKwlzcGluX3VubG9jaygmY3R4LT5jc2EucmVnaXN0ZXJfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUzMiBzcHVfYmFja2luZ19tYm94X3N0YXRfcmVhZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKK3sKKwlyZXR1cm4gY3R4LT5jc2EucHJvYi5tYl9zdGF0X1I7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3B1X2JhY2tpbmdfbWJveF9zdGF0X3BvbGwoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsCisJCQkJCSAgdW5zaWduZWQgaW50IGV2ZW50cykKK3sKKwlpbnQgcmV0OworCXUzMiBzdGF0OworCisJcmV0ID0gMDsKKwlzcGluX2xvY2tfaXJxKCZjdHgtPmNzYS5yZWdpc3Rlcl9sb2NrKTsKKwlzdGF0ID0gY3R4LT5jc2EucHJvYi5tYl9zdGF0X1I7CisKKwkvKiBpZiB0aGUgcmVxdWVzdGVkIGV2ZW50IGlzIHRoZXJlLCByZXR1cm4gdGhlIHBvbGwKKwkgICBtYXNrLCBvdGhlcndpc2UgZW5hYmxlIHRoZSBpbnRlcnJ1cHQgdG8gZ2V0IG5vdGlmaWVkLAorCSAgIGJ1dCBmaXJzdCBtYXJrIGFueSBwZW5kaW5nIGludGVycnVwdHMgYXMgZG9uZSBzbworCSAgIHdlIGRvbid0IGdldCB3b2tlbiB1cCB1bm5lY2Vzc2FyaWx5ICovCisKKwlpZiAoZXZlbnRzICYgKFBPTExJTiB8IFBPTExSRE5PUk0pKSB7CisJCWlmIChzdGF0ICYgMHhmZjAwMDApCisJCQlyZXQgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwkJZWxzZSB7CisJCQljdHgtPmNzYS5wcml2MS5pbnRfc3RhdF9jbGFzczBfUlcgJj0gfjB4MTsKKwkJCWN0eC0+Y3NhLnByaXYxLmludF9tYXNrX2NsYXNzMl9SVyB8PSAweDE7CisJCX0KKwl9CisJaWYgKGV2ZW50cyAmIChQT0xMT1VUIHwgUE9MTFdSTk9STSkpIHsKKwkJaWYgKHN0YXQgJiAweDAwZmYwMCkKKwkJCXJldCA9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQllbHNlIHsKKwkJCWN0eC0+Y3NhLnByaXYxLmludF9zdGF0X2NsYXNzMF9SVyAmPSB+MHgxMDsKKwkJCWN0eC0+Y3NhLnByaXYxLmludF9tYXNrX2NsYXNzMl9SVyB8PSAweDEwOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycSgmY3R4LT5jc2EucmVnaXN0ZXJfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzcHVfYmFja2luZ19pYm94X3JlYWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIHUzMiAqIGRhdGEpCit7CisJaW50IHJldDsKKworCXNwaW5fbG9jaygmY3R4LT5jc2EucmVnaXN0ZXJfbG9jayk7CisJaWYgKGN0eC0+Y3NhLnByb2IubWJfc3RhdF9SICYgMHhmZjAwMDApIHsKKwkJLyogUmVhZCB0aGUgZmlyc3QgYXZhaWxhYmxlIHdvcmQuCisJCSAqIEltcGxlbWVudGF0aW9uIG5vdGU6IHRoZSBkZXB0aAorCQkgKiBvZiBwdWludF9tYl9SIGlzIGN1cnJlbnRseSAxLgorCQkgKi8KKwkJKmRhdGEgPSBjdHgtPmNzYS5wcml2Mi5wdWludF9tYl9SOworCQljdHgtPmNzYS5wcm9iLm1iX3N0YXRfUiAmPSB+KDB4ZmYwMDAwKTsKKwkJY3R4LT5jc2Euc3B1X2NobmxjbnRfUldbMzBdID0gMTsKKwkJZ2VuX3NwdV9ldmVudChjdHgsIE1GQ19QVV9JTlRfTUFJTEJPWF9BVkFJTEFCTEVfRVZFTlQpOworCQlyZXQgPSA0OworCX0gZWxzZSB7CisJCS8qIG1ha2Ugc3VyZSB3ZSBnZXQgd29rZW4gdXAgYnkgdGhlIGludGVycnVwdCAqLworCQljdHgtPmNzYS5wcml2MS5pbnRfbWFza19jbGFzczJfUlcgfD0gMHgxVUw7CisJCXJldCA9IDA7CisJfQorCXNwaW5fdW5sb2NrKCZjdHgtPmNzYS5yZWdpc3Rlcl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNwdV9iYWNraW5nX3dib3hfd3JpdGUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIHUzMiBkYXRhKQoreworCWludCByZXQ7CisKKwlzcGluX2xvY2soJmN0eC0+Y3NhLnJlZ2lzdGVyX2xvY2spOworCWlmICgoY3R4LT5jc2EucHJvYi5tYl9zdGF0X1IpICYgMHgwMGZmMDApIHsKKwkJaW50IHNsb3QgPSBjdHgtPmNzYS5zcHVfY2hubGNudF9SV1syOV07CisJCWludCBhdmFpbCA9IChjdHgtPmNzYS5wcm9iLm1iX3N0YXRfUiAmIDB4MDBmZjAwKSA+PiA4OworCisJCS8qIFdlIGhhdmUgc3BhY2UgdG8gd3JpdGUgd2JveF9kYXRhLgorCQkgKiBJbXBsZW1lbnRhdGlvbiBub3RlOiB0aGUgZGVwdGgKKwkJICogb2Ygc3B1X21iX1cgaXMgY3VycmVudGx5IDQuCisJCSAqLworCQlCVUdfT04oYXZhaWwgIT0gKDQgLSBzbG90KSk7CisJCWN0eC0+Y3NhLnNwdV9tYWlsYm94X2RhdGFbc2xvdF0gPSBkYXRhOworCQljdHgtPmNzYS5zcHVfY2hubGNudF9SV1syOV0gPSArK3Nsb3Q7CisJCWN0eC0+Y3NhLnByb2IubWJfc3RhdF9SID0gKCgoNCAtIHNsb3QpICYgMHhmZikgPDwgOCk7CisJCWdlbl9zcHVfZXZlbnQoY3R4LCBNRkNfU1BVX01BSUxCT1hfV1JJVFRFTl9FVkVOVCk7CisJCXJldCA9IDQ7CisJfSBlbHNlIHsKKwkJLyogbWFrZSBzdXJlIHdlIGdldCB3b2tlbiB1cCBieSB0aGUgaW50ZXJydXB0IHdoZW4gc3BhY2UKKwkJICAgYmVjb21lcyBhdmFpbGFibGUgKi8KKwkJY3R4LT5jc2EucHJpdjEuaW50X21hc2tfY2xhc3MyX1JXIHw9IDB4MTA7CisJCXJldCA9IDA7CisJfQorCXNwaW5fdW5sb2NrKCZjdHgtPmNzYS5yZWdpc3Rlcl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTMyIHNwdV9iYWNraW5nX3NpZ25hbDFfcmVhZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKK3sKKwlyZXR1cm4gY3R4LT5jc2Euc3B1X2NobmxkYXRhX1JXWzNdOworfQorCitzdGF0aWMgdm9pZCBzcHVfYmFja2luZ19zaWduYWwxX3dyaXRlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1MzIgZGF0YSkKK3sKKwlzcGluX2xvY2soJmN0eC0+Y3NhLnJlZ2lzdGVyX2xvY2spOworCWlmIChjdHgtPmNzYS5wcml2Mi5zcHVfY2ZnX1JXICYgMHgxKQorCQljdHgtPmNzYS5zcHVfY2hubGRhdGFfUldbM10gfD0gZGF0YTsKKwllbHNlCisJCWN0eC0+Y3NhLnNwdV9jaG5sZGF0YV9SV1szXSA9IGRhdGE7CisJY3R4LT5jc2Euc3B1X2NobmxjbnRfUldbM10gPSAxOworCWdlbl9zcHVfZXZlbnQoY3R4LCBNRkNfU0lHTkFMXzFfRVZFTlQpOworCXNwaW5fdW5sb2NrKCZjdHgtPmNzYS5yZWdpc3Rlcl9sb2NrKTsKK30KKworc3RhdGljIHUzMiBzcHVfYmFja2luZ19zaWduYWwyX3JlYWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCit7CisJcmV0dXJuIGN0eC0+Y3NhLnNwdV9jaG5sZGF0YV9SV1s0XTsKK30KKworc3RhdGljIHZvaWQgc3B1X2JhY2tpbmdfc2lnbmFsMl93cml0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgdTMyIGRhdGEpCit7CisJc3Bpbl9sb2NrKCZjdHgtPmNzYS5yZWdpc3Rlcl9sb2NrKTsKKwlpZiAoY3R4LT5jc2EucHJpdjIuc3B1X2NmZ19SVyAmIDB4MikKKwkJY3R4LT5jc2Euc3B1X2NobmxkYXRhX1JXWzRdIHw9IGRhdGE7CisJZWxzZQorCQljdHgtPmNzYS5zcHVfY2hubGRhdGFfUldbNF0gPSBkYXRhOworCWN0eC0+Y3NhLnNwdV9jaG5sY250X1JXWzRdID0gMTsKKwlnZW5fc3B1X2V2ZW50KGN0eCwgTUZDX1NJR05BTF8yX0VWRU5UKTsKKwlzcGluX3VubG9jaygmY3R4LT5jc2EucmVnaXN0ZXJfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHNwdV9iYWNraW5nX3NpZ25hbDFfdHlwZV9zZXQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIHU2NCB2YWwpCit7CisJdTY0IHRtcDsKKworCXNwaW5fbG9jaygmY3R4LT5jc2EucmVnaXN0ZXJfbG9jayk7CisJdG1wID0gY3R4LT5jc2EucHJpdjIuc3B1X2NmZ19SVzsKKwlpZiAodmFsKQorCQl0bXAgfD0gMTsKKwllbHNlCisJCXRtcCAmPSB+MTsKKwljdHgtPmNzYS5wcml2Mi5zcHVfY2ZnX1JXID0gdG1wOworCXNwaW5fdW5sb2NrKCZjdHgtPmNzYS5yZWdpc3Rlcl9sb2NrKTsKK30KKworc3RhdGljIHU2NCBzcHVfYmFja2luZ19zaWduYWwxX3R5cGVfZ2V0KHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCXJldHVybiAoKGN0eC0+Y3NhLnByaXYyLnNwdV9jZmdfUlcgJiAxKSAhPSAwKTsKK30KKworc3RhdGljIHZvaWQgc3B1X2JhY2tpbmdfc2lnbmFsMl90eXBlX3NldChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgdTY0IHZhbCkKK3sKKwl1NjQgdG1wOworCisJc3Bpbl9sb2NrKCZjdHgtPmNzYS5yZWdpc3Rlcl9sb2NrKTsKKwl0bXAgPSBjdHgtPmNzYS5wcml2Mi5zcHVfY2ZnX1JXOworCWlmICh2YWwpCisJCXRtcCB8PSAyOworCWVsc2UKKwkJdG1wICY9IH4yOworCWN0eC0+Y3NhLnByaXYyLnNwdV9jZmdfUlcgPSB0bXA7CisJc3Bpbl91bmxvY2soJmN0eC0+Y3NhLnJlZ2lzdGVyX2xvY2spOworfQorCitzdGF0aWMgdTY0IHNwdV9iYWNraW5nX3NpZ25hbDJfdHlwZV9nZXQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCit7CisJcmV0dXJuICgoY3R4LT5jc2EucHJpdjIuc3B1X2NmZ19SVyAmIDIpICE9IDApOworfQorCitzdGF0aWMgdTMyIHNwdV9iYWNraW5nX25wY19yZWFkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCXJldHVybiBjdHgtPmNzYS5wcm9iLnNwdV9ucGNfUlc7Cit9CisKK3N0YXRpYyB2b2lkIHNwdV9iYWNraW5nX25wY193cml0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgdTMyIHZhbCkKK3sKKwljdHgtPmNzYS5wcm9iLnNwdV9ucGNfUlcgPSB2YWw7Cit9CisKK3N0YXRpYyB1MzIgc3B1X2JhY2tpbmdfc3RhdHVzX3JlYWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCit7CisJcmV0dXJuIGN0eC0+Y3NhLnByb2Iuc3B1X3N0YXR1c19SOworfQorCitzdGF0aWMgY2hhciAqc3B1X2JhY2tpbmdfZ2V0X2xzKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCXJldHVybiBjdHgtPmNzYS5sc2NzYS0+bHM7Cit9CisKK3N0YXRpYyB2b2lkIHNwdV9iYWNraW5nX3J1bmNudGxfd3JpdGUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIHUzMiB2YWwpCit7CisJc3Bpbl9sb2NrKCZjdHgtPmNzYS5yZWdpc3Rlcl9sb2NrKTsKKwljdHgtPmNzYS5wcm9iLnNwdV9ydW5jbnRsX1JXID0gdmFsOworCWlmICh2YWwgJiBTUFVfUlVOQ05UTF9SVU5OQUJMRSkgeworCQljdHgtPmNzYS5wcm9iLnNwdV9zdGF0dXNfUiB8PSBTUFVfU1RBVFVTX1JVTk5JTkc7CisJfSBlbHNlIHsKKwkJY3R4LT5jc2EucHJvYi5zcHVfc3RhdHVzX1IgJj0gflNQVV9TVEFUVVNfUlVOTklORzsKKwl9CisJc3Bpbl91bmxvY2soJmN0eC0+Y3NhLnJlZ2lzdGVyX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBzcHVfYmFja2luZ19ydW5jbnRsX3N0b3Aoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCit7CisJc3B1X2JhY2tpbmdfcnVuY250bF93cml0ZShjdHgsIFNQVV9SVU5DTlRMX1NUT1ApOworfQorCitzdHJ1Y3Qgc3B1X2NvbnRleHRfb3BzIHNwdV9iYWNraW5nX29wcyA9IHsKKwkubWJveF9yZWFkID0gc3B1X2JhY2tpbmdfbWJveF9yZWFkLAorCS5tYm94X3N0YXRfcmVhZCA9IHNwdV9iYWNraW5nX21ib3hfc3RhdF9yZWFkLAorCS5tYm94X3N0YXRfcG9sbCA9IHNwdV9iYWNraW5nX21ib3hfc3RhdF9wb2xsLAorCS5pYm94X3JlYWQgPSBzcHVfYmFja2luZ19pYm94X3JlYWQsCisJLndib3hfd3JpdGUgPSBzcHVfYmFja2luZ193Ym94X3dyaXRlLAorCS5zaWduYWwxX3JlYWQgPSBzcHVfYmFja2luZ19zaWduYWwxX3JlYWQsCisJLnNpZ25hbDFfd3JpdGUgPSBzcHVfYmFja2luZ19zaWduYWwxX3dyaXRlLAorCS5zaWduYWwyX3JlYWQgPSBzcHVfYmFja2luZ19zaWduYWwyX3JlYWQsCisJLnNpZ25hbDJfd3JpdGUgPSBzcHVfYmFja2luZ19zaWduYWwyX3dyaXRlLAorCS5zaWduYWwxX3R5cGVfc2V0ID0gc3B1X2JhY2tpbmdfc2lnbmFsMV90eXBlX3NldCwKKwkuc2lnbmFsMV90eXBlX2dldCA9IHNwdV9iYWNraW5nX3NpZ25hbDFfdHlwZV9nZXQsCisJLnNpZ25hbDJfdHlwZV9zZXQgPSBzcHVfYmFja2luZ19zaWduYWwyX3R5cGVfc2V0LAorCS5zaWduYWwyX3R5cGVfZ2V0ID0gc3B1X2JhY2tpbmdfc2lnbmFsMl90eXBlX2dldCwKKwkubnBjX3JlYWQgPSBzcHVfYmFja2luZ19ucGNfcmVhZCwKKwkubnBjX3dyaXRlID0gc3B1X2JhY2tpbmdfbnBjX3dyaXRlLAorCS5zdGF0dXNfcmVhZCA9IHNwdV9iYWNraW5nX3N0YXR1c19yZWFkLAorCS5nZXRfbHMgPSBzcHVfYmFja2luZ19nZXRfbHMsCisJLnJ1bmNudGxfd3JpdGUgPSBzcHVfYmFja2luZ19ydW5jbnRsX3dyaXRlLAorCS5ydW5jbnRsX3N0b3AgPSBzcHVfYmFja2luZ19ydW5jbnRsX3N0b3AsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvbnRleHQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb250ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM2ZjIzOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb250ZXh0LmMKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBTUFUgZmlsZSBzeXN0ZW0gLS0gU1BVIGNvbnRleHQgbWFuYWdlbWVudAorICoKKyAqIChDKSBDb3B5cmlnaHQgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkggMjAwNQorICoKKyAqIEF1dGhvcjogQXJuZCBCZXJnbWFubiA8YXJuZGJAZGUuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vc3B1Lmg+CisjaW5jbHVkZSA8YXNtL3NwdV9jc2EuaD4KKyNpbmNsdWRlICJzcHVmcy5oIgorCitzdHJ1Y3Qgc3B1X2NvbnRleHQgKmFsbG9jX3NwdV9jb250ZXh0KHN0cnVjdCBhZGRyZXNzX3NwYWNlICpsb2NhbF9zdG9yZSkKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eDsKKwljdHggPSBrbWFsbG9jKHNpemVvZiAqY3R4LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWN0eCkKKwkJZ290byBvdXQ7CisJLyogQmluZGluZyB0byBwaHlzaWNhbCBwcm9jZXNzb3IgZGVmZXJyZWQKKwkgKiB1bnRpbCBzcHVfYWN0aXZhdGUoKS4KKwkgKi8KKwlzcHVfaW5pdF9jc2EoJmN0eC0+Y3NhKTsKKwlpZiAoIWN0eC0+Y3NhLmxzY3NhKSB7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCXNwaW5fbG9ja19pbml0KCZjdHgtPm1taW9fbG9jayk7CisJa3JlZl9pbml0KCZjdHgtPmtyZWYpOworCWluaXRfcndzZW0oJmN0eC0+c3RhdGVfc2VtYSk7CisJaW5pdF9NVVRFWCgmY3R4LT5ydW5fc2VtYSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY3R4LT5pYm94X3dxKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjdHgtPndib3hfd3EpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN0eC0+c3RvcF93cSk7CisJY3R4LT5pYm94X2Zhc3luYyA9IE5VTEw7CisJY3R4LT53Ym94X2Zhc3luYyA9IE5VTEw7CisJY3R4LT5zdGF0ZSA9IFNQVV9TVEFURV9TQVZFRDsKKwljdHgtPmxvY2FsX3N0b3JlID0gbG9jYWxfc3RvcmU7CisJY3R4LT5zcHUgPSBOVUxMOworCWN0eC0+b3BzID0gJnNwdV9iYWNraW5nX29wczsKKwljdHgtPm93bmVyID0gZ2V0X3Rhc2tfbW0oY3VycmVudCk7CisJZ290byBvdXQ7CitvdXRfZnJlZToKKwlrZnJlZShjdHgpOworCWN0eCA9IE5VTEw7CitvdXQ6CisJcmV0dXJuIGN0eDsKK30KKwordm9pZCBkZXN0cm95X3NwdV9jb250ZXh0KHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4OworCWN0eCA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3Qgc3B1X2NvbnRleHQsIGtyZWYpOworCWRvd25fd3JpdGUoJmN0eC0+c3RhdGVfc2VtYSk7CisJc3B1X2RlYWN0aXZhdGUoY3R4KTsKKwljdHgtPmlib3hfZmFzeW5jID0gTlVMTDsKKwljdHgtPndib3hfZmFzeW5jID0gTlVMTDsKKwl1cF93cml0ZSgmY3R4LT5zdGF0ZV9zZW1hKTsKKwlzcHVfZmluaV9jc2EoJmN0eC0+Y3NhKTsKKwlrZnJlZShjdHgpOworfQorCitzdHJ1Y3Qgc3B1X2NvbnRleHQgKiBnZXRfc3B1X2NvbnRleHQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCit7CisJa3JlZl9nZXQoJmN0eC0+a3JlZik7CisJcmV0dXJuIGN0eDsKK30KKworaW50IHB1dF9zcHVfY29udGV4dChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKK3sKKwlyZXR1cm4ga3JlZl9wdXQoJmN0eC0+a3JlZiwgJmRlc3Ryb3lfc3B1X2NvbnRleHQpOworfQorCisvKiBnaXZlIHVwIHRoZSBtbSByZWZlcmVuY2Ugd2hlbiB0aGUgY29udGV4dCBpcyBhYm91dCB0byBiZSBkZXN0cm95ZWQgKi8KK3ZvaWQgc3B1X2ZvcmdldChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOworCW1tID0gY3R4LT5vd25lcjsKKwljdHgtPm93bmVyID0gTlVMTDsKKwltbXB1dChtbSk7CisJc3B1X3JlbGVhc2UoY3R4KTsKK30KKwordm9pZCBzcHVfYWNxdWlyZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKK3sKKwlkb3duX3JlYWQoJmN0eC0+c3RhdGVfc2VtYSk7Cit9CisKK3ZvaWQgc3B1X3JlbGVhc2Uoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCit7CisJdXBfcmVhZCgmY3R4LT5zdGF0ZV9zZW1hKTsKK30KKwordm9pZCBzcHVfdW5tYXBfbWFwcGluZ3Moc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCit7CisJdW5tYXBfbWFwcGluZ19yYW5nZShjdHgtPmxvY2FsX3N0b3JlLCAwLCBMU19TSVpFLCAxKTsKK30KKworaW50IHNwdV9hY3F1aXJlX3J1bm5hYmxlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCWludCByZXQgPSAwOworCisJZG93bl9yZWFkKCZjdHgtPnN0YXRlX3NlbWEpOworCWlmIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9SVU5OQUJMRSkgeworCQljdHgtPnNwdS0+cHJpbyA9IGN1cnJlbnQtPnByaW87CisJCXJldHVybiAwOworCX0KKwl1cF9yZWFkKCZjdHgtPnN0YXRlX3NlbWEpOworCisJZG93bl93cml0ZSgmY3R4LT5zdGF0ZV9zZW1hKTsKKwkvKiBjdHggaXMgYWJvdXQgdG8gYmUgZnJlZWQsIGNhbid0IGFjcXVpcmUgYW55IG1vcmUgKi8KKwlpZiAoIWN0eC0+b3duZXIpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGN0eC0+c3RhdGUgPT0gU1BVX1NUQVRFX1NBVkVEKSB7CisJCXJldCA9IHNwdV9hY3RpdmF0ZShjdHgsIDApOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJCWN0eC0+c3RhdGUgPSBTUFVfU1RBVEVfUlVOTkFCTEU7CisJfQorCisJZG93bmdyYWRlX3dyaXRlKCZjdHgtPnN0YXRlX3NlbWEpOworCS8qIE9uIHN1Y2Nlc3MsIHdlIHJldHVybiBob2xkaW5nIHRoZSBsb2NrICovCisKKwlyZXR1cm4gcmV0Oworb3V0OgorCS8qIFJlbGVhc2UgaGVyZSwgdG8gc2ltcGxpZnkgY2FsbGluZyBjb2RlLiAqLworCXVwX3dyaXRlKCZjdHgtPnN0YXRlX3NlbWEpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBzcHVfYWNxdWlyZV9zYXZlZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKK3sKKwlkb3duX3JlYWQoJmN0eC0+c3RhdGVfc2VtYSk7CisKKwlpZiAoY3R4LT5zdGF0ZSA9PSBTUFVfU1RBVEVfU0FWRUQpCisJCXJldHVybjsKKworCXVwX3JlYWQoJmN0eC0+c3RhdGVfc2VtYSk7CisJZG93bl93cml0ZSgmY3R4LT5zdGF0ZV9zZW1hKTsKKworCWlmIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9SVU5OQUJMRSkgeworCQlzcHVfZGVhY3RpdmF0ZShjdHgpOworCQljdHgtPnN0YXRlID0gU1BVX1NUQVRFX1NBVkVEOworCX0KKworCWRvd25ncmFkZV93cml0ZSgmY3R4LT5zdGF0ZV9zZW1hKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYTY0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jCkBAIC0wLDAgKzEsNzk0IEBACisvKgorICogU1BVIGZpbGUgc3lzdGVtIC0tIGZpbGUgY29udGVudHMKKyAqCisgKiAoQykgQ29weXJpZ2h0IElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJIIDIwMDUKKyAqCisgKiBBdXRob3I6IEFybmQgQmVyZ21hbm4gPGFybmRiQGRlLmlibS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9zcHUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAic3B1ZnMuaCIKKworCitzdGF0aWMgaW50CitzcHVmc19tZW1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc3B1ZnNfaW5vZGVfaW5mbyAqaSA9IFNQVUZTX0koaW5vZGUpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGktPmlfY3R4OworCWZpbGUtPmZfbWFwcGluZyA9IGktPmlfY3R4LT5sb2NhbF9zdG9yZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QKK3NwdWZzX21lbV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCXNpemVfdCBzaXplLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyICpsb2NhbF9zdG9yZTsKKwlpbnQgcmV0OworCisJc3B1X2FjcXVpcmUoY3R4KTsKKworCWxvY2FsX3N0b3JlID0gY3R4LT5vcHMtPmdldF9scyhjdHgpOworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZmZlciwgc2l6ZSwgcG9zLCBsb2NhbF9zdG9yZSwgTFNfU0laRSk7CisKKwlzcHVfcmVsZWFzZShjdHgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzcHVmc19tZW1fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJCXNpemVfdCBzaXplLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyICpsb2NhbF9zdG9yZTsKKwlpbnQgcmV0OworCisJc2l6ZSA9IG1pbl90KHNzaXplX3QsIExTX1NJWkUgLSAqcG9zLCBzaXplKTsKKwlpZiAoc2l6ZSA8PSAwKQorCQlyZXR1cm4gLUVGQklHOworCSpwb3MgKz0gc2l6ZTsKKworCXNwdV9hY3F1aXJlKGN0eCk7CisKKwlsb2NhbF9zdG9yZSA9IGN0eC0+b3BzLT5nZXRfbHMoY3R4KTsKKwlyZXQgPSBjb3B5X2Zyb21fdXNlcihsb2NhbF9zdG9yZSArICpwb3MgLSBzaXplLAorCQkJICAgICBidWZmZXIsIHNpemUpID8gLUVGQVVMVCA6IHNpemU7CisKKwlzcHVfcmVsZWFzZShjdHgpOworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfU1BBUlNFTUVNCitzdGF0aWMgc3RydWN0IHBhZ2UgKgorc3B1ZnNfbWVtX21tYXBfbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCAqdHlwZSkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5PUEFHRV9TSUdCVVM7CisKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gYWRkcmVzcyAtIHZtYS0+dm1fc3RhcnQ7CisJb2Zmc2V0ICs9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKKworCXNwdV9hY3F1aXJlKGN0eCk7CisKKwlpZiAoY3R4LT5zdGF0ZSA9PSBTUFVfU1RBVEVfU0FWRUQpCisJCXBhZ2UgPSB2bWFsbG9jX3RvX3BhZ2UoY3R4LT5jc2EubHNjc2EtPmxzICsgb2Zmc2V0KTsKKwllbHNlCisJCXBhZ2UgPSBwZm5fdG9fcGFnZSgoY3R4LT5zcHUtPmxvY2FsX3N0b3JlX3BoeXMgKyBvZmZzZXQpCisJCQkJICAgPj4gUEFHRV9TSElGVCk7CisKKwlzcHVfcmVsZWFzZShjdHgpOworCisJaWYgKHR5cGUpCisJCSp0eXBlID0gVk1fRkFVTFRfTUlOT1I7CisKKwlwYWdlX2NhY2hlX2dldChwYWdlKTsKKwlyZXR1cm4gcGFnZTsKK30KKworc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBzcHVmc19tZW1fbW1hcF92bW9wcyA9IHsKKwkubm9wYWdlID0gc3B1ZnNfbWVtX21tYXBfbm9wYWdlLAorfTsKKworc3RhdGljIGludAorc3B1ZnNfbWVtX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9TSEFSRUQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEZJWE1FOiAqLworCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wZ3Byb3QocGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkKKwkJCQkgICAgIHwgX1BBR0VfTk9fQ0FDSEUpOworCisJdm1hLT52bV9vcHMgPSAmc3B1ZnNfbWVtX21tYXBfdm1vcHM7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1ZnNfbWVtX2ZvcHMgPSB7CisJLm9wZW4JID0gc3B1ZnNfbWVtX29wZW4sCisJLnJlYWQgICAgPSBzcHVmc19tZW1fcmVhZCwKKwkud3JpdGUgICA9IHNwdWZzX21lbV93cml0ZSwKKwkubGxzZWVrICA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisjaWZkZWYgQ09ORklHX1NQQVJTRU1FTQorCS5tbWFwICAgID0gc3B1ZnNfbWVtX21tYXAsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQKK3NwdWZzX3JlZ3Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc3B1ZnNfaW5vZGVfaW5mbyAqaSA9IFNQVUZTX0koaW5vZGUpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGktPmlfY3R4OworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAorc3B1ZnNfcmVnc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQlzaXplX3Qgc2l6ZSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNwdV9sc2NzYSAqbHNjc2EgPSBjdHgtPmNzYS5sc2NzYTsKKwlpbnQgcmV0OworCisJc3B1X2FjcXVpcmVfc2F2ZWQoY3R4KTsKKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZmZlciwgc2l6ZSwgcG9zLAorCQkJCSAgICAgIGxzY3NhLT5ncHJzLCBzaXplb2YgbHNjc2EtPmdwcnMpOworCisJc3B1X3JlbGVhc2UoY3R4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdAorc3B1ZnNfcmVnc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJIHNpemVfdCBzaXplLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc3B1X2xzY3NhICpsc2NzYSA9IGN0eC0+Y3NhLmxzY3NhOworCWludCByZXQ7CisKKwlzaXplID0gbWluX3Qoc3NpemVfdCwgc2l6ZW9mIGxzY3NhLT5ncHJzIC0gKnBvcywgc2l6ZSk7CisJaWYgKHNpemUgPD0gMCkKKwkJcmV0dXJuIC1FRkJJRzsKKwkqcG9zICs9IHNpemU7CisKKwlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOworCisJcmV0ID0gY29weV9mcm9tX3VzZXIobHNjc2EtPmdwcnMgKyAqcG9zIC0gc2l6ZSwKKwkJCSAgICAgYnVmZmVyLCBzaXplKSA/IC1FRkFVTFQgOiBzaXplOworCisJc3B1X3JlbGVhc2UoY3R4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcHVmc19yZWdzX2ZvcHMgPSB7CisJLm9wZW4JID0gc3B1ZnNfcmVnc19vcGVuLAorCS5yZWFkICAgID0gc3B1ZnNfcmVnc19yZWFkLAorCS53cml0ZSAgID0gc3B1ZnNfcmVnc193cml0ZSwKKwkubGxzZWVrICA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCit9OworCitzdGF0aWMgc3NpemVfdAorc3B1ZnNfZnBjcl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJc2l6ZV90IHNpemUsIGxvZmZfdCAqIHBvcykKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc3B1X2xzY3NhICpsc2NzYSA9IGN0eC0+Y3NhLmxzY3NhOworCWludCByZXQ7CisKKwlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOworCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmZmVyLCBzaXplLCBwb3MsCisJCQkJICAgICAgJmxzY3NhLT5mcGNyLCBzaXplb2YobHNjc2EtPmZwY3IpKTsKKworCXNwdV9yZWxlYXNlKGN0eCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK3NwdWZzX2ZwY3Jfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQkgc2l6ZV90IHNpemUsIGxvZmZfdCAqIHBvcykKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc3B1X2xzY3NhICpsc2NzYSA9IGN0eC0+Y3NhLmxzY3NhOworCWludCByZXQ7CisKKwlzaXplID0gbWluX3Qoc3NpemVfdCwgc2l6ZW9mKGxzY3NhLT5mcGNyKSAtICpwb3MsIHNpemUpOworCWlmIChzaXplIDw9IDApCisJCXJldHVybiAtRUZCSUc7CisJKnBvcyArPSBzaXplOworCisJc3B1X2FjcXVpcmVfc2F2ZWQoY3R4KTsKKworCXJldCA9IGNvcHlfZnJvbV91c2VyKChjaGFyICopJmxzY3NhLT5mcGNyICsgKnBvcyAtIHNpemUsCisJCQkgICAgIGJ1ZmZlciwgc2l6ZSkgPyAtRUZBVUxUIDogc2l6ZTsKKworCXNwdV9yZWxlYXNlKGN0eCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1ZnNfZnBjcl9mb3BzID0geworCS5vcGVuID0gc3B1ZnNfcmVnc19vcGVuLAorCS5yZWFkID0gc3B1ZnNfZnBjcl9yZWFkLAorCS53cml0ZSA9IHNwdWZzX2ZwY3Jfd3JpdGUsCisJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCit9OworCisvKiBnZW5lcmljIG9wZW4gZnVuY3Rpb24gZm9yIGFsbCBwaXBlLWxpa2UgZmlsZXMgKi8KK3N0YXRpYyBpbnQgc3B1ZnNfcGlwZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzcHVmc19pbm9kZV9pbmZvICppID0gU1BVRlNfSShpbm9kZSk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaS0+aV9jdHg7CisKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNwdWZzX21ib3hfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXUzMiBtYm94X2RhdGE7CisJaW50IHJldDsKKworCWlmIChsZW4gPCA0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwdV9hY3F1aXJlKGN0eCk7CisJcmV0ID0gY3R4LT5vcHMtPm1ib3hfcmVhZChjdHgsICZtYm94X2RhdGEpOworCXNwdV9yZWxlYXNlKGN0eCk7CisKKwlpZiAoIXJldCkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgJm1ib3hfZGF0YSwgc2l6ZW9mIG1ib3hfZGF0YSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdWZzX21ib3hfZm9wcyA9IHsKKwkub3Blbgk9IHNwdWZzX3BpcGVfb3BlbiwKKwkucmVhZAk9IHNwdWZzX21ib3hfcmVhZCwKK307CisKK3N0YXRpYyBzc2l6ZV90IHNwdWZzX21ib3hfc3RhdF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdTMyIG1ib3hfc3RhdDsKKworCWlmIChsZW4gPCA0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwdV9hY3F1aXJlKGN0eCk7CisKKwltYm94X3N0YXQgPSBjdHgtPm9wcy0+bWJveF9zdGF0X3JlYWQoY3R4KSAmIDB4ZmY7CisKKwlzcHVfcmVsZWFzZShjdHgpOworCisJaWYgKGNvcHlfdG9fdXNlcihidWYsICZtYm94X3N0YXQsIHNpemVvZiBtYm94X3N0YXQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiA0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcHVmc19tYm94X3N0YXRfZm9wcyA9IHsKKwkub3Blbgk9IHNwdWZzX3BpcGVfb3BlbiwKKwkucmVhZAk9IHNwdWZzX21ib3hfc3RhdF9yZWFkLAorfTsKKworLyogbG93LWxldmVsIGlib3ggYWNjZXNzIGZ1bmN0aW9uICovCitzaXplX3Qgc3B1X2lib3hfcmVhZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgdTMyICpkYXRhKQoreworCXJldHVybiBjdHgtPm9wcy0+aWJveF9yZWFkKGN0eCwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgc3B1ZnNfaWJveF9mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG9uKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIGZhc3luY19oZWxwZXIoZmQsIGZpbGUsIG9uLCAmY3R4LT5pYm94X2Zhc3luYyk7Cit9CisKKy8qIGludGVycnVwdC1sZXZlbCBpYm94IGNhbGxiYWNrIGZ1bmN0aW9uLiAqLwordm9pZCBzcHVmc19pYm94X2NhbGxiYWNrKHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IHNwdS0+Y3R4OworCisJd2FrZV91cF9hbGwoJmN0eC0+aWJveF93cSk7CisJa2lsbF9mYXN5bmMoJmN0eC0+aWJveF9mYXN5bmMsIFNJR0lPLCBQT0xMSU4pOworfQorCitzdGF0aWMgc3NpemVfdCBzcHVmc19pYm94X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQlzaXplX3QgbGVuLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1MzIgaWJveF9kYXRhOworCXNzaXplX3QgcmV0OworCisJaWYgKGxlbiA8IDQpCisJCXJldHVybiAtRUlOVkFMOworCisJc3B1X2FjcXVpcmUoY3R4KTsKKworCXJldCA9IDA7CisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCWlmICghc3B1X2lib3hfcmVhZChjdHgsICZpYm94X2RhdGEpKQorCQkJcmV0ID0gLUVBR0FJTjsKKwl9IGVsc2UgeworCQlyZXQgPSBzcHVmc193YWl0KGN0eC0+aWJveF93cSwgc3B1X2lib3hfcmVhZChjdHgsICZpYm94X2RhdGEpKTsKKwl9CisKKwlzcHVfcmVsZWFzZShjdHgpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IDQ7CisJaWYgKGNvcHlfdG9fdXNlcihidWYsICZpYm94X2RhdGEsIHNpemVvZiBpYm94X2RhdGEpKQorCQlyZXQgPSAtRUZBVUxUOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzcHVmc19pYm94X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IG1hc2s7CisKKwlwb2xsX3dhaXQoZmlsZSwgJmN0eC0+aWJveF93cSwgd2FpdCk7CisKKwlzcHVfYWNxdWlyZShjdHgpOworCW1hc2sgPSBjdHgtPm9wcy0+bWJveF9zdGF0X3BvbGwoY3R4LCBQT0xMSU4gfCBQT0xMUkROT1JNKTsKKwlzcHVfcmVsZWFzZShjdHgpOworCisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdWZzX2lib3hfZm9wcyA9IHsKKwkub3Blbgk9IHNwdWZzX3BpcGVfb3BlbiwKKwkucmVhZAk9IHNwdWZzX2lib3hfcmVhZCwKKwkucG9sbAk9IHNwdWZzX2lib3hfcG9sbCwKKwkuZmFzeW5jCT0gc3B1ZnNfaWJveF9mYXN5bmMsCit9OworCitzdGF0aWMgc3NpemVfdCBzcHVmc19pYm94X3N0YXRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXUzMiBpYm94X3N0YXQ7CisKKwlpZiAobGVuIDwgNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcHVfYWNxdWlyZShjdHgpOworCWlib3hfc3RhdCA9IChjdHgtPm9wcy0+bWJveF9zdGF0X3JlYWQoY3R4KSA+PiAxNikgJiAweGZmOworCXNwdV9yZWxlYXNlKGN0eCk7CisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgJmlib3hfc3RhdCwgc2l6ZW9mIGlib3hfc3RhdCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdWZzX2lib3hfc3RhdF9mb3BzID0geworCS5vcGVuCT0gc3B1ZnNfcGlwZV9vcGVuLAorCS5yZWFkCT0gc3B1ZnNfaWJveF9zdGF0X3JlYWQsCit9OworCisvKiBsb3ctbGV2ZWwgbWFpbGJveCB3cml0ZSAqLworc2l6ZV90IHNwdV93Ym94X3dyaXRlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1MzIgZGF0YSkKK3sKKwlyZXR1cm4gY3R4LT5vcHMtPndib3hfd3JpdGUoY3R4LCBkYXRhKTsKK30KKworc3RhdGljIGludCBzcHVmc193Ym94X2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgb24pCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKworCXJldCA9IGZhc3luY19oZWxwZXIoZmQsIGZpbGUsIG9uLCAmY3R4LT53Ym94X2Zhc3luYyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBpbnRlcnJ1cHQtbGV2ZWwgd2JveCBjYWxsYmFjayBmdW5jdGlvbi4gKi8KK3ZvaWQgc3B1ZnNfd2JveF9jYWxsYmFjayhzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBzcHUtPmN0eDsKKworCXdha2VfdXBfYWxsKCZjdHgtPndib3hfd3EpOworCWtpbGxfZmFzeW5jKCZjdHgtPndib3hfZmFzeW5jLCBTSUdJTywgUE9MTE9VVCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNwdWZzX3dib3hfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQlzaXplX3QgbGVuLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1MzIgd2JveF9kYXRhOworCWludCByZXQ7CisKKwlpZiAobGVuIDwgNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJndib3hfZGF0YSwgYnVmLCBzaXplb2Ygd2JveF9kYXRhKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzcHVfYWNxdWlyZShjdHgpOworCisJcmV0ID0gMDsKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJaWYgKCFzcHVfd2JveF93cml0ZShjdHgsIHdib3hfZGF0YSkpCisJCQlyZXQgPSAtRUFHQUlOOworCX0gZWxzZSB7CisJCXJldCA9IHNwdWZzX3dhaXQoY3R4LT53Ym94X3dxLCBzcHVfd2JveF93cml0ZShjdHgsIHdib3hfZGF0YSkpOworCX0KKworCXNwdV9yZWxlYXNlKGN0eCk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogc2l6ZW9mIHdib3hfZGF0YTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzcHVmc193Ym94X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IG1hc2s7CisKKwlwb2xsX3dhaXQoZmlsZSwgJmN0eC0+d2JveF93cSwgd2FpdCk7CisKKwlzcHVfYWNxdWlyZShjdHgpOworCW1hc2sgPSBjdHgtPm9wcy0+bWJveF9zdGF0X3BvbGwoY3R4LCBQT0xMT1VUIHwgUE9MTFdSTk9STSk7CisJc3B1X3JlbGVhc2UoY3R4KTsKKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcHVmc193Ym94X2ZvcHMgPSB7CisJLm9wZW4JPSBzcHVmc19waXBlX29wZW4sCisJLndyaXRlCT0gc3B1ZnNfd2JveF93cml0ZSwKKwkucG9sbAk9IHNwdWZzX3dib3hfcG9sbCwKKwkuZmFzeW5jCT0gc3B1ZnNfd2JveF9mYXN5bmMsCit9OworCitzdGF0aWMgc3NpemVfdCBzcHVmc193Ym94X3N0YXRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXUzMiB3Ym94X3N0YXQ7CisKKwlpZiAobGVuIDwgNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcHVfYWNxdWlyZShjdHgpOworCXdib3hfc3RhdCA9IChjdHgtPm9wcy0+bWJveF9zdGF0X3JlYWQoY3R4KSA+PiA4KSAmIDB4ZmY7CisJc3B1X3JlbGVhc2UoY3R4KTsKKworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmd2JveF9zdGF0LCBzaXplb2Ygd2JveF9zdGF0KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gNDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1ZnNfd2JveF9zdGF0X2ZvcHMgPSB7CisJLm9wZW4JPSBzcHVmc19waXBlX29wZW4sCisJLnJlYWQJPSBzcHVmc193Ym94X3N0YXRfcmVhZCwKK307CisKK3N0YXRpYyBzc2l6ZV90IHNwdWZzX3NpZ25hbDFfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXUzMiBkYXRhOworCisJaWYgKGxlbiA8IDQpCisJCXJldHVybiAtRUlOVkFMOworCisJc3B1X2FjcXVpcmUoY3R4KTsKKwlkYXRhID0gY3R4LT5vcHMtPnNpZ25hbDFfcmVhZChjdHgpOworCXNwdV9yZWxlYXNlKGN0eCk7CisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgJmRhdGEsIDQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiA0OworfQorCitzdGF0aWMgc3NpemVfdCBzcHVmc19zaWduYWwxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHg7CisJdTMyIGRhdGE7CisKKwljdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAobGVuIDwgNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmRhdGEsIGJ1ZiwgNCkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3B1X2FjcXVpcmUoY3R4KTsKKwljdHgtPm9wcy0+c2lnbmFsMV93cml0ZShjdHgsIGRhdGEpOworCXNwdV9yZWxlYXNlKGN0eCk7CisKKwlyZXR1cm4gNDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1ZnNfc2lnbmFsMV9mb3BzID0geworCS5vcGVuID0gc3B1ZnNfcGlwZV9vcGVuLAorCS5yZWFkID0gc3B1ZnNfc2lnbmFsMV9yZWFkLAorCS53cml0ZSA9IHNwdWZzX3NpZ25hbDFfd3JpdGUsCit9OworCitzdGF0aWMgc3NpemVfdCBzcHVmc19zaWduYWwyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQlzaXplX3QgbGVuLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eDsKKwl1MzIgZGF0YTsKKworCWN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmIChsZW4gPCA0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwdV9hY3F1aXJlKGN0eCk7CisJZGF0YSA9IGN0eC0+b3BzLT5zaWduYWwyX3JlYWQoY3R4KTsKKwlzcHVfcmVsZWFzZShjdHgpOworCisJaWYgKGNvcHlfdG9fdXNlcihidWYsICZkYXRhLCA0KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gNDsKK30KKworc3RhdGljIHNzaXplX3Qgc3B1ZnNfc2lnbmFsMl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4OworCXUzMiBkYXRhOworCisJY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGxlbiA8IDQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhLCBidWYsIDQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNwdV9hY3F1aXJlKGN0eCk7CisJY3R4LT5vcHMtPnNpZ25hbDJfd3JpdGUoY3R4LCBkYXRhKTsKKwlzcHVfcmVsZWFzZShjdHgpOworCisJcmV0dXJuIDQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdWZzX3NpZ25hbDJfZm9wcyA9IHsKKwkub3BlbiA9IHNwdWZzX3BpcGVfb3BlbiwKKwkucmVhZCA9IHNwdWZzX3NpZ25hbDJfcmVhZCwKKwkud3JpdGUgPSBzcHVmc19zaWduYWwyX3dyaXRlLAorfTsKKworc3RhdGljIHZvaWQgc3B1ZnNfc2lnbmFsMV90eXBlX3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZGF0YTsKKworCXNwdV9hY3F1aXJlKGN0eCk7CisJY3R4LT5vcHMtPnNpZ25hbDFfdHlwZV9zZXQoY3R4LCB2YWwpOworCXNwdV9yZWxlYXNlKGN0eCk7Cit9CisKK3N0YXRpYyB1NjQgc3B1ZnNfc2lnbmFsMV90eXBlX2dldCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZGF0YTsKKwl1NjQgcmV0OworCisJc3B1X2FjcXVpcmUoY3R4KTsKKwlyZXQgPSBjdHgtPm9wcy0+c2lnbmFsMV90eXBlX2dldChjdHgpOworCXNwdV9yZWxlYXNlKGN0eCk7CisKKwlyZXR1cm4gcmV0OworfQorREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoc3B1ZnNfc2lnbmFsMV90eXBlLCBzcHVmc19zaWduYWwxX3R5cGVfZ2V0LAorCQkJCQlzcHVmc19zaWduYWwxX3R5cGVfc2V0LCAiJWxsdSIpOworCitzdGF0aWMgdm9pZCBzcHVmc19zaWduYWwyX3R5cGVfc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBkYXRhOworCisJc3B1X2FjcXVpcmUoY3R4KTsKKwljdHgtPm9wcy0+c2lnbmFsMl90eXBlX3NldChjdHgsIHZhbCk7CisJc3B1X3JlbGVhc2UoY3R4KTsKK30KKworc3RhdGljIHU2NCBzcHVmc19zaWduYWwyX3R5cGVfZ2V0KHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBkYXRhOworCXU2NCByZXQ7CisKKwlzcHVfYWNxdWlyZShjdHgpOworCXJldCA9IGN0eC0+b3BzLT5zaWduYWwyX3R5cGVfZ2V0KGN0eCk7CisJc3B1X3JlbGVhc2UoY3R4KTsKKworCXJldHVybiByZXQ7Cit9CitERUZJTkVfU0lNUExFX0FUVFJJQlVURShzcHVmc19zaWduYWwyX3R5cGUsIHNwdWZzX3NpZ25hbDJfdHlwZV9nZXQsCisJCQkJCXNwdWZzX3NpZ25hbDJfdHlwZV9zZXQsICIlbGx1Iik7CisKK3N0YXRpYyB2b2lkIHNwdWZzX25wY19zZXQodm9pZCAqZGF0YSwgdTY0IHZhbCkKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGRhdGE7CisJc3B1X2FjcXVpcmUoY3R4KTsKKwljdHgtPm9wcy0+bnBjX3dyaXRlKGN0eCwgdmFsKTsKKwlzcHVfcmVsZWFzZShjdHgpOworfQorCitzdGF0aWMgdTY0IHNwdWZzX25wY19nZXQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGRhdGE7CisJdTY0IHJldDsKKwlzcHVfYWNxdWlyZShjdHgpOworCXJldCA9IGN0eC0+b3BzLT5ucGNfcmVhZChjdHgpOworCXNwdV9yZWxlYXNlKGN0eCk7CisJcmV0dXJuIHJldDsKK30KK0RFRklORV9TSU1QTEVfQVRUUklCVVRFKHNwdWZzX25wY19vcHMsIHNwdWZzX25wY19nZXQsIHNwdWZzX25wY19zZXQsICIlbGx4XG4iKQorCitzdGF0aWMgdm9pZCBzcHVmc19kZWNyX3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZGF0YTsKKwlzdHJ1Y3Qgc3B1X2xzY3NhICpsc2NzYSA9IGN0eC0+Y3NhLmxzY3NhOworCXNwdV9hY3F1aXJlX3NhdmVkKGN0eCk7CisJbHNjc2EtPmRlY3Iuc2xvdFswXSA9ICh1MzIpIHZhbDsKKwlzcHVfcmVsZWFzZShjdHgpOworfQorCitzdGF0aWMgdTY0IHNwdWZzX2RlY3JfZ2V0KHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBkYXRhOworCXN0cnVjdCBzcHVfbHNjc2EgKmxzY3NhID0gY3R4LT5jc2EubHNjc2E7CisJdTY0IHJldDsKKwlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOworCXJldCA9IGxzY3NhLT5kZWNyLnNsb3RbMF07CisJc3B1X3JlbGVhc2UoY3R4KTsKKwlyZXR1cm4gcmV0OworfQorREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoc3B1ZnNfZGVjcl9vcHMsIHNwdWZzX2RlY3JfZ2V0LCBzcHVmc19kZWNyX3NldCwKKwkJCSIlbGx4XG4iKQorCitzdGF0aWMgdm9pZCBzcHVmc19kZWNyX3N0YXR1c19zZXQodm9pZCAqZGF0YSwgdTY0IHZhbCkKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGRhdGE7CisJc3RydWN0IHNwdV9sc2NzYSAqbHNjc2EgPSBjdHgtPmNzYS5sc2NzYTsKKwlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOworCWxzY3NhLT5kZWNyX3N0YXR1cy5zbG90WzBdID0gKHUzMikgdmFsOworCXNwdV9yZWxlYXNlKGN0eCk7Cit9CisKK3N0YXRpYyB1NjQgc3B1ZnNfZGVjcl9zdGF0dXNfZ2V0KHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBkYXRhOworCXN0cnVjdCBzcHVfbHNjc2EgKmxzY3NhID0gY3R4LT5jc2EubHNjc2E7CisJdTY0IHJldDsKKwlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOworCXJldCA9IGxzY3NhLT5kZWNyX3N0YXR1cy5zbG90WzBdOworCXNwdV9yZWxlYXNlKGN0eCk7CisJcmV0dXJuIHJldDsKK30KK0RFRklORV9TSU1QTEVfQVRUUklCVVRFKHNwdWZzX2RlY3Jfc3RhdHVzX29wcywgc3B1ZnNfZGVjcl9zdGF0dXNfZ2V0LAorCQkJc3B1ZnNfZGVjcl9zdGF0dXNfc2V0LCAiJWxseFxuIikKKworc3RhdGljIHZvaWQgc3B1ZnNfc3B1X3RhZ19tYXNrX3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZGF0YTsKKwlzdHJ1Y3Qgc3B1X2xzY3NhICpsc2NzYSA9IGN0eC0+Y3NhLmxzY3NhOworCXNwdV9hY3F1aXJlX3NhdmVkKGN0eCk7CisJbHNjc2EtPnRhZ19tYXNrLnNsb3RbMF0gPSAodTMyKSB2YWw7CisJc3B1X3JlbGVhc2UoY3R4KTsKK30KKworc3RhdGljIHU2NCBzcHVmc19zcHVfdGFnX21hc2tfZ2V0KHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBkYXRhOworCXN0cnVjdCBzcHVfbHNjc2EgKmxzY3NhID0gY3R4LT5jc2EubHNjc2E7CisJdTY0IHJldDsKKwlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOworCXJldCA9IGxzY3NhLT50YWdfbWFzay5zbG90WzBdOworCXNwdV9yZWxlYXNlKGN0eCk7CisJcmV0dXJuIHJldDsKK30KK0RFRklORV9TSU1QTEVfQVRUUklCVVRFKHNwdWZzX3NwdV90YWdfbWFza19vcHMsIHNwdWZzX3NwdV90YWdfbWFza19nZXQsCisJCQlzcHVmc19zcHVfdGFnX21hc2tfc2V0LCAiJWxseFxuIikKKworc3RhdGljIHZvaWQgc3B1ZnNfZXZlbnRfbWFza19zZXQodm9pZCAqZGF0YSwgdTY0IHZhbCkKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGRhdGE7CisJc3RydWN0IHNwdV9sc2NzYSAqbHNjc2EgPSBjdHgtPmNzYS5sc2NzYTsKKwlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOworCWxzY3NhLT5ldmVudF9tYXNrLnNsb3RbMF0gPSAodTMyKSB2YWw7CisJc3B1X3JlbGVhc2UoY3R4KTsKK30KKworc3RhdGljIHU2NCBzcHVmc19ldmVudF9tYXNrX2dldCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZGF0YTsKKwlzdHJ1Y3Qgc3B1X2xzY3NhICpsc2NzYSA9IGN0eC0+Y3NhLmxzY3NhOworCXU2NCByZXQ7CisJc3B1X2FjcXVpcmVfc2F2ZWQoY3R4KTsKKwlyZXQgPSBsc2NzYS0+ZXZlbnRfbWFzay5zbG90WzBdOworCXNwdV9yZWxlYXNlKGN0eCk7CisJcmV0dXJuIHJldDsKK30KK0RFRklORV9TSU1QTEVfQVRUUklCVVRFKHNwdWZzX2V2ZW50X21hc2tfb3BzLCBzcHVmc19ldmVudF9tYXNrX2dldCwKKwkJCXNwdWZzX2V2ZW50X21hc2tfc2V0LCAiJWxseFxuIikKKworc3RhdGljIHZvaWQgc3B1ZnNfc3JyMF9zZXQodm9pZCAqZGF0YSwgdTY0IHZhbCkKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGRhdGE7CisJc3RydWN0IHNwdV9sc2NzYSAqbHNjc2EgPSBjdHgtPmNzYS5sc2NzYTsKKwlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOworCWxzY3NhLT5zcnIwLnNsb3RbMF0gPSAodTMyKSB2YWw7CisJc3B1X3JlbGVhc2UoY3R4KTsKK30KKworc3RhdGljIHU2NCBzcHVmc19zcnIwX2dldCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZGF0YTsKKwlzdHJ1Y3Qgc3B1X2xzY3NhICpsc2NzYSA9IGN0eC0+Y3NhLmxzY3NhOworCXU2NCByZXQ7CisJc3B1X2FjcXVpcmVfc2F2ZWQoY3R4KTsKKwlyZXQgPSBsc2NzYS0+c3JyMC5zbG90WzBdOworCXNwdV9yZWxlYXNlKGN0eCk7CisJcmV0dXJuIHJldDsKK30KK0RFRklORV9TSU1QTEVfQVRUUklCVVRFKHNwdWZzX3NycjBfb3BzLCBzcHVmc19zcnIwX2dldCwgc3B1ZnNfc3JyMF9zZXQsCisJCQkiJWxseFxuIikKKworc3RydWN0IHRyZWVfZGVzY3Igc3B1ZnNfZGlyX2NvbnRlbnRzW10gPSB7CisJeyAibWVtIiwgICZzcHVmc19tZW1fZm9wcywgIDA2NjYsIH0sCisJeyAicmVncyIsICZzcHVmc19yZWdzX2ZvcHMsICAwNjY2LCB9LAorCXsgIm1ib3giLCAmc3B1ZnNfbWJveF9mb3BzLCAwNDQ0LCB9LAorCXsgImlib3giLCAmc3B1ZnNfaWJveF9mb3BzLCAwNDQ0LCB9LAorCXsgIndib3giLCAmc3B1ZnNfd2JveF9mb3BzLCAwMjIyLCB9LAorCXsgIm1ib3hfc3RhdCIsICZzcHVmc19tYm94X3N0YXRfZm9wcywgMDQ0NCwgfSwKKwl7ICJpYm94X3N0YXQiLCAmc3B1ZnNfaWJveF9zdGF0X2ZvcHMsIDA0NDQsIH0sCisJeyAid2JveF9zdGF0IiwgJnNwdWZzX3dib3hfc3RhdF9mb3BzLCAwNDQ0LCB9LAorCXsgInNpZ25hbDEiLCAmc3B1ZnNfc2lnbmFsMV9mb3BzLCAwNjY2LCB9LAorCXsgInNpZ25hbDIiLCAmc3B1ZnNfc2lnbmFsMl9mb3BzLCAwNjY2LCB9LAorCXsgInNpZ25hbDFfdHlwZSIsICZzcHVmc19zaWduYWwxX3R5cGUsIDA2NjYsIH0sCisJeyAic2lnbmFsMl90eXBlIiwgJnNwdWZzX3NpZ25hbDJfdHlwZSwgMDY2NiwgfSwKKwl7ICJucGMiLCAmc3B1ZnNfbnBjX29wcywgMDY2NiwgfSwKKwl7ICJmcGNyIiwgJnNwdWZzX2ZwY3JfZm9wcywgMDY2NiwgfSwKKwl7ICJkZWNyIiwgJnNwdWZzX2RlY3Jfb3BzLCAwNjY2LCB9LAorCXsgImRlY3Jfc3RhdHVzIiwgJnNwdWZzX2RlY3Jfc3RhdHVzX29wcywgMDY2NiwgfSwKKwl7ICJzcHVfdGFnX21hc2siLCAmc3B1ZnNfc3B1X3RhZ19tYXNrX29wcywgMDY2NiwgfSwKKwl7ICJldmVudF9tYXNrIiwgJnNwdWZzX2V2ZW50X21hc2tfb3BzLCAwNjY2LCB9LAorCXsgInNycjAiLCAmc3B1ZnNfc3JyMF9vcHMsIDA2NjYsIH0sCisJe30sCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2h3X29wcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2h3X29wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NDU3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaHdfb3BzLmMKQEAgLTAsMCArMSwyNTUgQEAKKy8qIGh3X29wcy5jIC0gcXVlcnkvc2V0IG9wZXJhdGlvbnMgb24gYWN0aXZlIFNQVSBjb250ZXh0LgorICoKKyAqIENvcHlyaWdodCAoQykgSUJNIDIwMDUKKyAqIEF1dGhvcjogTWFyayBOdXR0ZXIgPG1udXR0ZXJAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zcHUuaD4KKyNpbmNsdWRlIDxhc20vc3B1X2NzYS5oPgorI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgorI2luY2x1ZGUgInNwdWZzLmgiCisKK3N0YXRpYyBpbnQgc3B1X2h3X21ib3hfcmVhZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgdTMyICogZGF0YSkKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHUgPSBjdHgtPnNwdTsKKwlzdHJ1Y3Qgc3B1X3Byb2JsZW0gX19pb21lbSAqcHJvYiA9IHNwdS0+cHJvYmxlbTsKKwl1MzIgbWJveF9zdGF0OworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycSgmc3B1LT5yZWdpc3Rlcl9sb2NrKTsKKwltYm94X3N0YXQgPSBpbl9iZTMyKCZwcm9iLT5tYl9zdGF0X1IpOworCWlmIChtYm94X3N0YXQgJiAweDAwMDBmZikgeworCQkqZGF0YSA9IGluX2JlMzIoJnByb2ItPnB1X21iX1IpOworCQlyZXQgPSA0OworCX0KKwlzcGluX3VubG9ja19pcnEoJnNwdS0+cmVnaXN0ZXJfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUzMiBzcHVfaHdfbWJveF9zdGF0X3JlYWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCit7CisJcmV0dXJuIGluX2JlMzIoJmN0eC0+c3B1LT5wcm9ibGVtLT5tYl9zdGF0X1IpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNwdV9od19tYm94X3N0YXRfcG9sbChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwKKwkJCQkJICB1bnNpZ25lZCBpbnQgZXZlbnRzKQoreworCXN0cnVjdCBzcHUgKnNwdSA9IGN0eC0+c3B1OworCWludCByZXQgPSAwOworCXUzMiBzdGF0OworCisJc3Bpbl9sb2NrX2lycSgmc3B1LT5yZWdpc3Rlcl9sb2NrKTsKKwlzdGF0ID0gaW5fYmUzMigmc3B1LT5wcm9ibGVtLT5tYl9zdGF0X1IpOworCisJLyogaWYgdGhlIHJlcXVlc3RlZCBldmVudCBpcyB0aGVyZSwgcmV0dXJuIHRoZSBwb2xsCisJICAgbWFzaywgb3RoZXJ3aXNlIGVuYWJsZSB0aGUgaW50ZXJydXB0IHRvIGdldCBub3RpZmllZCwKKwkgICBidXQgZmlyc3QgbWFyayBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzIGFzIGRvbmUgc28KKwkgICB3ZSBkb24ndCBnZXQgd29rZW4gdXAgdW5uZWNlc3NhcmlseSAqLworCisJaWYgKGV2ZW50cyAmIChQT0xMSU4gfCBQT0xMUkROT1JNKSkgeworCQlpZiAoc3RhdCAmIDB4ZmYwMDAwKQorCQkJcmV0IHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJCWVsc2UgeworCQkJc3B1X2ludF9zdGF0X2NsZWFyKHNwdSwgMiwgMHgxKTsKKwkJCXNwdV9pbnRfbWFza19vcihzcHUsIDIsIDB4MSk7CisJCX0KKwl9CisJaWYgKGV2ZW50cyAmIChQT0xMT1VUIHwgUE9MTFdSTk9STSkpIHsKKwkJaWYgKHN0YXQgJiAweDAwZmYwMCkKKwkJCXJldCA9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQllbHNlIHsKKwkJCXNwdV9pbnRfc3RhdF9jbGVhcihzcHUsIDIsIDB4MTApOworCQkJc3B1X2ludF9tYXNrX29yKHNwdSwgMiwgMHgxMCk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZzcHUtPnJlZ2lzdGVyX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3B1X2h3X2lib3hfcmVhZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgdTMyICogZGF0YSkKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHUgPSBjdHgtPnNwdTsKKwlzdHJ1Y3Qgc3B1X3Byb2JsZW0gX19pb21lbSAqcHJvYiA9IHNwdS0+cHJvYmxlbTsKKwlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyID0gc3B1LT5wcml2MjsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2lycSgmc3B1LT5yZWdpc3Rlcl9sb2NrKTsKKwlpZiAoaW5fYmUzMigmcHJvYi0+bWJfc3RhdF9SKSAmIDB4ZmYwMDAwKSB7CisJCS8qIHJlYWQgdGhlIGZpcnN0IGF2YWlsYWJsZSB3b3JkICovCisJCSpkYXRhID0gaW5fYmU2NCgmcHJpdjItPnB1aW50X21iX1IpOworCQlyZXQgPSA0OworCX0gZWxzZSB7CisJCS8qIG1ha2Ugc3VyZSB3ZSBnZXQgd29rZW4gdXAgYnkgdGhlIGludGVycnVwdCAqLworCQlzcHVfaW50X21hc2tfb3Ioc3B1LCAyLCAweDEpOworCQlyZXQgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnEoJnNwdS0+cmVnaXN0ZXJfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzcHVfaHdfd2JveF93cml0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgdTMyIGRhdGEpCit7CisJc3RydWN0IHNwdSAqc3B1ID0gY3R4LT5zcHU7CisJc3RydWN0IHNwdV9wcm9ibGVtIF9faW9tZW0gKnByb2IgPSBzcHUtPnByb2JsZW07CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pcnEoJnNwdS0+cmVnaXN0ZXJfbG9jayk7CisJaWYgKGluX2JlMzIoJnByb2ItPm1iX3N0YXRfUikgJiAweDAwZmYwMCkgeworCQkvKiB3ZSBoYXZlIHNwYWNlIHRvIHdyaXRlIHdib3hfZGF0YSB0byAqLworCQlvdXRfYmUzMigmcHJvYi0+c3B1X21iX1csIGRhdGEpOworCQlyZXQgPSA0OworCX0gZWxzZSB7CisJCS8qIG1ha2Ugc3VyZSB3ZSBnZXQgd29rZW4gdXAgYnkgdGhlIGludGVycnVwdCB3aGVuIHNwYWNlCisJCSAgIGJlY29tZXMgYXZhaWxhYmxlICovCisJCXNwdV9pbnRfbWFza19vcihzcHUsIDIsIDB4MTApOworCQlyZXQgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnEoJnNwdS0+cmVnaXN0ZXJfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUzMiBzcHVfaHdfc2lnbmFsMV9yZWFkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCXJldHVybiBpbl9iZTMyKCZjdHgtPnNwdS0+cHJvYmxlbS0+c2lnbmFsX25vdGlmeTEpOworfQorCitzdGF0aWMgdm9pZCBzcHVfaHdfc2lnbmFsMV93cml0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgdTMyIGRhdGEpCit7CisJb3V0X2JlMzIoJmN0eC0+c3B1LT5wcm9ibGVtLT5zaWduYWxfbm90aWZ5MSwgZGF0YSk7Cit9CisKK3N0YXRpYyB1MzIgc3B1X2h3X3NpZ25hbDJfcmVhZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKK3sKKwlyZXR1cm4gaW5fYmUzMigmY3R4LT5zcHUtPnByb2JsZW0tPnNpZ25hbF9ub3RpZnkxKTsKK30KKworc3RhdGljIHZvaWQgc3B1X2h3X3NpZ25hbDJfd3JpdGUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIHUzMiBkYXRhKQoreworCW91dF9iZTMyKCZjdHgtPnNwdS0+cHJvYmxlbS0+c2lnbmFsX25vdGlmeTIsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBzcHVfaHdfc2lnbmFsMV90eXBlX3NldChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgdTY0IHZhbCkKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHUgPSBjdHgtPnNwdTsKKwlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyID0gc3B1LT5wcml2MjsKKwl1NjQgdG1wOworCisJc3Bpbl9sb2NrX2lycSgmc3B1LT5yZWdpc3Rlcl9sb2NrKTsKKwl0bXAgPSBpbl9iZTY0KCZwcml2Mi0+c3B1X2NmZ19SVyk7CisJaWYgKHZhbCkKKwkJdG1wIHw9IDE7CisJZWxzZQorCQl0bXAgJj0gfjE7CisJb3V0X2JlNjQoJnByaXYyLT5zcHVfY2ZnX1JXLCB0bXApOworCXNwaW5fdW5sb2NrX2lycSgmc3B1LT5yZWdpc3Rlcl9sb2NrKTsKK30KKworc3RhdGljIHU2NCBzcHVfaHdfc2lnbmFsMV90eXBlX2dldChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKK3sKKwlyZXR1cm4gKChpbl9iZTY0KCZjdHgtPnNwdS0+cHJpdjItPnNwdV9jZmdfUlcpICYgMSkgIT0gMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNwdV9od19zaWduYWwyX3R5cGVfc2V0KHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1NjQgdmFsKQoreworCXN0cnVjdCBzcHUgKnNwdSA9IGN0eC0+c3B1OworCXN0cnVjdCBzcHVfcHJpdjIgX19pb21lbSAqcHJpdjIgPSBzcHUtPnByaXYyOworCXU2NCB0bXA7CisKKwlzcGluX2xvY2tfaXJxKCZzcHUtPnJlZ2lzdGVyX2xvY2spOworCXRtcCA9IGluX2JlNjQoJnByaXYyLT5zcHVfY2ZnX1JXKTsKKwlpZiAodmFsKQorCQl0bXAgfD0gMjsKKwllbHNlCisJCXRtcCAmPSB+MjsKKwlvdXRfYmU2NCgmcHJpdjItPnNwdV9jZmdfUlcsIHRtcCk7CisJc3Bpbl91bmxvY2tfaXJxKCZzcHUtPnJlZ2lzdGVyX2xvY2spOworfQorCitzdGF0aWMgdTY0IHNwdV9od19zaWduYWwyX3R5cGVfZ2V0KHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCXJldHVybiAoKGluX2JlNjQoJmN0eC0+c3B1LT5wcml2Mi0+c3B1X2NmZ19SVykgJiAyKSAhPSAwKTsKK30KKworc3RhdGljIHUzMiBzcHVfaHdfbnBjX3JlYWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCit7CisJcmV0dXJuIGluX2JlMzIoJmN0eC0+c3B1LT5wcm9ibGVtLT5zcHVfbnBjX1JXKTsKK30KKworc3RhdGljIHZvaWQgc3B1X2h3X25wY193cml0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgdTMyIHZhbCkKK3sKKwlvdXRfYmUzMigmY3R4LT5zcHUtPnByb2JsZW0tPnNwdV9ucGNfUlcsIHZhbCk7Cit9CisKK3N0YXRpYyB1MzIgc3B1X2h3X3N0YXR1c19yZWFkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCXJldHVybiBpbl9iZTMyKCZjdHgtPnNwdS0+cHJvYmxlbS0+c3B1X3N0YXR1c19SKTsKK30KKworc3RhdGljIGNoYXIgKnNwdV9od19nZXRfbHMoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCit7CisJcmV0dXJuIGN0eC0+c3B1LT5sb2NhbF9zdG9yZTsKK30KKworc3RhdGljIHZvaWQgc3B1X2h3X3J1bmNudGxfd3JpdGUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIHUzMiB2YWwpCit7CisJZWllaW8oKTsKKwlvdXRfYmUzMigmY3R4LT5zcHUtPnByb2JsZW0tPnNwdV9ydW5jbnRsX1JXLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBzcHVfaHdfcnVuY250bF9zdG9wKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCXNwaW5fbG9ja19pcnEoJmN0eC0+c3B1LT5yZWdpc3Rlcl9sb2NrKTsKKwlvdXRfYmUzMigmY3R4LT5zcHUtPnByb2JsZW0tPnNwdV9ydW5jbnRsX1JXLCBTUFVfUlVOQ05UTF9TVE9QKTsKKwl3aGlsZSAoaW5fYmUzMigmY3R4LT5zcHUtPnByb2JsZW0tPnNwdV9zdGF0dXNfUikgJiBTUFVfU1RBVFVTX1JVTk5JTkcpCisJCWNwdV9yZWxheCgpOworCXNwaW5fdW5sb2NrX2lycSgmY3R4LT5zcHUtPnJlZ2lzdGVyX2xvY2spOworfQorCitzdHJ1Y3Qgc3B1X2NvbnRleHRfb3BzIHNwdV9od19vcHMgPSB7CisJLm1ib3hfcmVhZCA9IHNwdV9od19tYm94X3JlYWQsCisJLm1ib3hfc3RhdF9yZWFkID0gc3B1X2h3X21ib3hfc3RhdF9yZWFkLAorCS5tYm94X3N0YXRfcG9sbCA9IHNwdV9od19tYm94X3N0YXRfcG9sbCwKKwkuaWJveF9yZWFkID0gc3B1X2h3X2lib3hfcmVhZCwKKwkud2JveF93cml0ZSA9IHNwdV9od193Ym94X3dyaXRlLAorCS5zaWduYWwxX3JlYWQgPSBzcHVfaHdfc2lnbmFsMV9yZWFkLAorCS5zaWduYWwxX3dyaXRlID0gc3B1X2h3X3NpZ25hbDFfd3JpdGUsCisJLnNpZ25hbDJfcmVhZCA9IHNwdV9od19zaWduYWwyX3JlYWQsCisJLnNpZ25hbDJfd3JpdGUgPSBzcHVfaHdfc2lnbmFsMl93cml0ZSwKKwkuc2lnbmFsMV90eXBlX3NldCA9IHNwdV9od19zaWduYWwxX3R5cGVfc2V0LAorCS5zaWduYWwxX3R5cGVfZ2V0ID0gc3B1X2h3X3NpZ25hbDFfdHlwZV9nZXQsCisJLnNpZ25hbDJfdHlwZV9zZXQgPSBzcHVfaHdfc2lnbmFsMl90eXBlX3NldCwKKwkuc2lnbmFsMl90eXBlX2dldCA9IHNwdV9od19zaWduYWwyX3R5cGVfZ2V0LAorCS5ucGNfcmVhZCA9IHNwdV9od19ucGNfcmVhZCwKKwkubnBjX3dyaXRlID0gc3B1X2h3X25wY193cml0ZSwKKwkuc3RhdHVzX3JlYWQgPSBzcHVfaHdfc3RhdHVzX3JlYWQsCisJLmdldF9scyA9IHNwdV9od19nZXRfbHMsCisJLnJ1bmNudGxfd3JpdGUgPSBzcHVfaHdfcnVuY250bF93cml0ZSwKKwkucnVuY250bF9zdG9wID0gc3B1X2h3X3J1bmNudGxfc3RvcCwKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaW5vZGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOTYyYzNhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMKQEAgLTAsMCArMSw0ODYgQEAKKy8qCisgKiBTUFUgZmlsZSBzeXN0ZW0KKyAqCisgKiAoQykgQ29weXJpZ2h0IElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJIIDIwMDUKKyAqCisgKiBBdXRob3I6IEFybmQgQmVyZ21hbm4gPGFybmRiQGRlLmlibS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9zcHUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAic3B1ZnMuaCIKKworc3RhdGljIGttZW1fY2FjaGVfdCAqc3B1ZnNfaW5vZGVfY2FjaGU7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKgorc3B1ZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3Qgc3B1ZnNfaW5vZGVfaW5mbyAqZWk7CisKKwllaSA9IGttZW1fY2FjaGVfYWxsb2Moc3B1ZnNfaW5vZGVfY2FjaGUsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIWVpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gJmVpLT52ZnNfaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkCitzcHVmc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJa21lbV9jYWNoZV9mcmVlKHNwdWZzX2lub2RlX2NhY2hlLCBTUFVGU19JKGlub2RlKSk7Cit9CisKK3N0YXRpYyB2b2lkCitzcHVmc19pbml0X29uY2Uodm9pZCAqcCwga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBzcHVmc19pbm9kZV9pbmZvICplaSA9IHA7CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKSB7CisJCWlub2RlX2luaXRfb25jZSgmZWktPnZmc19pbm9kZSk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGlub2RlICoKK3NwdWZzX25ld19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCWlmICghaW5vZGUpCisJCWdvdG8gb3V0OworCisJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJaW5vZGUtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwlpbm9kZS0+aV9ibG9ja3MgPSAwOworCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKK291dDoKKwlyZXR1cm4gaW5vZGU7Cit9CisKK3N0YXRpYyBpbnQKK3NwdWZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCWlmICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpICYmCisJICAgIChhdHRyLT5pYV9zaXplICE9IGlub2RlLT5pX3NpemUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gaW5vZGVfc2V0YXR0cihpbm9kZSwgYXR0cik7Cit9CisKKworc3RhdGljIGludAorc3B1ZnNfbmV3X2ZpbGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzLCBpbnQgbW9kZSwKKwkJc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCit7CisJc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNwdWZzX2ZpbGVfaW9wcyA9IHsKKwkJLnNldGF0dHIgPSBzcHVmc19zZXRhdHRyLAorCX07CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgcmV0OworCisJcmV0ID0gLUVOT1NQQzsKKwlpbm9kZSA9IHNwdWZzX25ld19pbm9kZShzYiwgU19JRlJFRyB8IG1vZGUpOworCWlmICghaW5vZGUpCisJCWdvdG8gb3V0OworCisJcmV0ID0gMDsKKwlpbm9kZS0+aV9vcCA9ICZzcHVmc19maWxlX2lvcHM7CisJaW5vZGUtPmlfZm9wID0gZm9wczsKKwlpbm9kZS0+dS5nZW5lcmljX2lwID0gU1BVRlNfSShpbm9kZSktPmlfY3R4ID0gZ2V0X3NwdV9jb250ZXh0KGN0eCk7CisJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK3NwdWZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmIChTUFVGU19JKGlub2RlKS0+aV9jdHgpCisJCXB1dF9zcHVfY29udGV4dChTUFVGU19JKGlub2RlKS0+aV9jdHgpOworCWNsZWFyX2lub2RlKGlub2RlKTsKK30KKworc3RhdGljIHZvaWQgc3B1ZnNfcHJ1bmVfZGlyKHN0cnVjdCBkZW50cnkgKmRpcikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksICp0bXA7CisJbXV0ZXhfbG9jaygmZGlyLT5kX2lub2RlLT5pX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVudHJ5LCB0bXAsICZkaXItPmRfc3ViZGlycywgZF91LmRfY2hpbGQpIHsKKwkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCQlpZiAoIShkX3VuaGFzaGVkKGRlbnRyeSkpICYmIGRlbnRyeS0+ZF9pbm9kZSkgeworCQkJZGdldF9sb2NrZWQoZGVudHJ5KTsKKwkJCV9fZF9kcm9wKGRlbnRyeSk7CisJCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCQkJc2ltcGxlX3VubGluayhkaXItPmRfaW5vZGUsIGRlbnRyeSk7CisJCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCQkJZHB1dChkZW50cnkpOworCQl9IGVsc2UgeworCQkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCX0KKwl9CisJc2hyaW5rX2RjYWNoZV9wYXJlbnQoZGlyKTsKKwltdXRleF91bmxvY2soJmRpci0+ZF9pbm9kZS0+aV9tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgc3B1ZnNfcm1kaXIoc3RydWN0IGlub2RlICpyb290LCBzdHJ1Y3QgZGVudHJ5ICpkaXJfZGVudHJ5KQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4OworCisJLyogcmVtb3ZlIGFsbCBlbnRyaWVzICovCisJbXV0ZXhfbG9jaygmcm9vdC0+aV9tdXRleCk7CisJc3B1ZnNfcHJ1bmVfZGlyKGRpcl9kZW50cnkpOworCW11dGV4X3VubG9jaygmcm9vdC0+aV9tdXRleCk7CisKKwkvKiBXZSBoYXZlIHRvIGdpdmUgdXAgdGhlIG1tX3N0cnVjdCAqLworCWN0eCA9IFNQVUZTX0koZGlyX2RlbnRyeS0+ZF9pbm9kZSktPmlfY3R4OworCXNwdV9mb3JnZXQoY3R4KTsKKworCS8qIFhYWCBEbyB3ZSBuZWVkIHRvIGhvbGQgaV9tdXRleCBoZXJlID8gKi8KKwlyZXR1cm4gc2ltcGxlX3JtZGlyKHJvb3QsIGRpcl9kZW50cnkpOworfQorCitzdGF0aWMgaW50IHNwdWZzX2ZpbGxfZGlyKHN0cnVjdCBkZW50cnkgKmRpciwgc3RydWN0IHRyZWVfZGVzY3IgKmZpbGVzLAorCQkJICBpbnQgbW9kZSwgc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCWludCByZXQ7CisKKwl3aGlsZSAoZmlsZXMtPm5hbWUgJiYgZmlsZXMtPm5hbWVbMF0pIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZGVudHJ5ID0gZF9hbGxvY19uYW1lKGRpciwgZmlsZXMtPm5hbWUpOworCQlpZiAoIWRlbnRyeSkKKwkJCWdvdG8gb3V0OworCQlyZXQgPSBzcHVmc19uZXdfZmlsZShkaXItPmRfc2IsIGRlbnRyeSwgZmlsZXMtPm9wcywKKwkJCQkJZmlsZXMtPm1vZGUgJiBtb2RlLCBjdHgpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJCWZpbGVzKys7CisJfQorCXJldHVybiAwOworb3V0OgorCXNwdWZzX3BydW5lX2RpcihkaXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3B1ZnNfZGlyX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBpbm9kZSAqZGlyOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlpbnQgcmV0OworCisJZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJZGlyID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKKworCXJldCA9IHNwdWZzX3JtZGlyKGRpciwgZGVudHJ5KTsKKwlXQVJOX09OKHJldCk7CisKKwlyZXR1cm4gZGNhY2hlX2Rpcl9jbG9zZShpbm9kZSwgZmlsZSk7Cit9CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNwdWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0geworCS5sb29rdXAgPSBzaW1wbGVfbG9va3VwLAorfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcHVmc19jb250ZXh0X2ZvcHMgPSB7CisJLm9wZW4JCT0gZGNhY2hlX2Rpcl9vcGVuLAorCS5yZWxlYXNlCT0gc3B1ZnNfZGlyX2Nsb3NlLAorCS5sbHNlZWsJCT0gZGNhY2hlX2Rpcl9sc2VlaywKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gZGNhY2hlX3JlYWRkaXIsCisJLmZzeW5jCQk9IHNpbXBsZV9zeW5jX2ZpbGUsCit9OworCitzdGF0aWMgaW50CitzcHVmc19ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHg7CisKKwlyZXQgPSAtRU5PU1BDOworCWlub2RlID0gc3B1ZnNfbmV3X2lub2RlKGRpci0+aV9zYiwgbW9kZSB8IFNfSUZESVIpOworCWlmICghaW5vZGUpCisJCWdvdG8gb3V0OworCisJaWYgKGRpci0+aV9tb2RlICYgU19JU0dJRCkgeworCQlpbm9kZS0+aV9naWQgPSBkaXItPmlfZ2lkOworCQlpbm9kZS0+aV9tb2RlICY9IFNfSVNHSUQ7CisJfQorCWN0eCA9IGFsbG9jX3NwdV9jb250ZXh0KGlub2RlLT5pX21hcHBpbmcpOworCVNQVUZTX0koaW5vZGUpLT5pX2N0eCA9IGN0eDsKKwlpZiAoIWN0eCkKKwkJZ290byBvdXRfaXB1dDsKKworCWlub2RlLT5pX29wID0gJnNwdWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCWlub2RlLT5pX2ZvcCA9ICZzaW1wbGVfZGlyX29wZXJhdGlvbnM7CisJcmV0ID0gc3B1ZnNfZmlsbF9kaXIoZGVudHJ5LCBzcHVmc19kaXJfY29udGVudHMsIG1vZGUsIGN0eCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZnJlZV9jdHg7CisKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCWRnZXQoZGVudHJ5KTsKKwlkaXItPmlfbmxpbmsrKzsKKwlkZW50cnktPmRfaW5vZGUtPmlfbmxpbmsrKzsKKwlnb3RvIG91dDsKKworb3V0X2ZyZWVfY3R4OgorCXB1dF9zcHVfY29udGV4dChjdHgpOworb3V0X2lwdXQ6CisJaXB1dChpbm9kZSk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzcHVmc19jb250ZXh0X29wZW4oc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBmaWxlICpmaWxwOworCisJcmV0ID0gZ2V0X3VudXNlZF9mZCgpOworCWlmIChyZXQgPCAwKSB7CisJCWRwdXQoZGVudHJ5KTsKKwkJbW50cHV0KG1udCk7CisJCWdvdG8gb3V0OworCX0KKworCWZpbHAgPSBkZW50cnlfb3BlbihkZW50cnksIG1udCwgT19SRE9OTFkpOworCWlmIChJU19FUlIoZmlscCkpIHsKKwkJcHV0X3VudXNlZF9mZChyZXQpOworCQlyZXQgPSBQVFJfRVJSKGZpbHApOworCQlnb3RvIG91dDsKKwl9CisKKwlmaWxwLT5mX29wID0gJnNwdWZzX2NvbnRleHRfZm9wczsKKwlmZF9pbnN0YWxsKHJldCwgZmlscCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHNwdWZzX3R5cGU7CisKK2xvbmcgc3B1ZnNfY3JlYXRlX3RocmVhZChzdHJ1Y3QgbmFtZWlkYXRhICpuZCwKKwkJCSB1bnNpZ25lZCBpbnQgZmxhZ3MsIG1vZGVfdCBtb2RlKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlpbnQgcmV0OworCisJLyogbmVlZCB0byBiZSBhdCB0aGUgcm9vdCBvZiBzcHVmcyAqLworCXJldCA9IC1FSU5WQUw7CisJaWYgKG5kLT5kZW50cnktPmRfc2ItPnNfdHlwZSAhPSAmc3B1ZnNfdHlwZSB8fAorCSAgICBuZC0+ZGVudHJ5ICE9IG5kLT5kZW50cnktPmRfc2ItPnNfcm9vdCkKKwkJZ290byBvdXQ7CisKKwlkZW50cnkgPSBsb29rdXBfY3JlYXRlKG5kLCAxKTsKKwlyZXQgPSBQVFJfRVJSKGRlbnRyeSk7CisJaWYgKElTX0VSUihkZW50cnkpKQorCQlnb3RvIG91dF9kaXI7CisKKwlyZXQgPSAtRUVYSVNUOworCWlmIChkZW50cnktPmRfaW5vZGUpCisJCWdvdG8gb3V0X2RwdXQ7CisKKwltb2RlICY9IH5jdXJyZW50LT5mcy0+dW1hc2s7CisJcmV0ID0gc3B1ZnNfbWtkaXIobmQtPmRlbnRyeS0+ZF9pbm9kZSwgZGVudHJ5LCBtb2RlICYgU19JUldYVUdPKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9kcHV0OworCisJLyoKKwkgKiBnZXQgcmVmZXJlbmNlcyBmb3IgZGdldCBhbmQgbW50Z2V0LCB3aWxsIGJlIHJlbGVhc2VkCisJICogaW4gZXJyb3IgcGF0aCBvZiAqX29wZW4oKS4KKwkgKi8KKwlyZXQgPSBzcHVmc19jb250ZXh0X29wZW4oZGdldChkZW50cnkpLCBtbnRnZXQobmQtPm1udCkpOworCWlmIChyZXQgPCAwKQorCQlzcHVmc19ybWRpcihuZC0+ZGVudHJ5LT5kX2lub2RlLCBkZW50cnkpOworCitvdXRfZHB1dDoKKwlkcHV0KGRlbnRyeSk7CitvdXRfZGlyOgorCW11dGV4X3VubG9jaygmbmQtPmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogRmlsZSBzeXN0ZW0gaW5pdGlhbGl6YXRpb24gKi8KK2VudW0geworCU9wdF91aWQsIE9wdF9naWQsIE9wdF9lcnIsCit9OworCitzdGF0aWMgbWF0Y2hfdGFibGVfdCBzcHVmc190b2tlbnMgPSB7CisJeyBPcHRfdWlkLCAidWlkPSVkIiB9LAorCXsgT3B0X2dpZCwgImdpZD0lZCIgfSwKKwl7IE9wdF9lcnIsIE5VTEwgIH0sCit9OworCitzdGF0aWMgaW50CitzcHVmc19wYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIHN0cnVjdCBpbm9kZSAqcm9vdCkKK3sKKwljaGFyICpwOworCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdTXTsKKworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQlpbnQgdG9rZW4sIG9wdGlvbjsKKworCQlpZiAoISpwKQorCQkJY29udGludWU7CisKKwkJdG9rZW4gPSBtYXRjaF90b2tlbihwLCBzcHVmc190b2tlbnMsIGFyZ3MpOworCQlzd2l0Y2ggKHRva2VuKSB7CisJCWNhc2UgT3B0X3VpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJcm9vdC0+aV91aWQgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZ2lkOgorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCisJCQkJcmV0dXJuIDA7CisJCQlyb290LT5pX2dpZCA9IG9wdGlvbjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK3NwdWZzX2NyZWF0ZV9yb290KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgcmV0OworCisJcmV0ID0gLUVOT01FTTsKKwlpbm9kZSA9IHNwdWZzX25ld19pbm9kZShzYiwgU19JRkRJUiB8IDA3NzUpOworCWlmICghaW5vZGUpCisJCWdvdG8gb3V0OworCisJaW5vZGUtPmlfb3AgPSAmc3B1ZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKKwlTUFVGU19JKGlub2RlKS0+aV9jdHggPSBOVUxMOworCisJcmV0ID0gLUVJTlZBTDsKKwlpZiAoIXNwdWZzX3BhcnNlX29wdGlvbnMoZGF0YSwgaW5vZGUpKQorCQlnb3RvIG91dF9pcHV0OworCisJcmV0ID0gLUVOT01FTTsKKwlzYi0+c19yb290ID0gZF9hbGxvY19yb290KGlub2RlKTsKKwlpZiAoIXNiLT5zX3Jvb3QpCisJCWdvdG8gb3V0X2lwdXQ7CisKKwlyZXR1cm4gMDsKK291dF9pcHV0OgorCWlwdXQoaW5vZGUpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3NwdWZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc19vcHMgPSB7CisJCS5hbGxvY19pbm9kZSA9IHNwdWZzX2FsbG9jX2lub2RlLAorCQkuZGVzdHJveV9pbm9kZSA9IHNwdWZzX2Rlc3Ryb3lfaW5vZGUsCisJCS5zdGF0ZnMgPSBzaW1wbGVfc3RhdGZzLAorCQkuZGVsZXRlX2lub2RlID0gc3B1ZnNfZGVsZXRlX2lub2RlLAorCQkuZHJvcF9pbm9kZSA9IGdlbmVyaWNfZGVsZXRlX2lub2RlLAorCX07CisKKwlzYi0+c19tYXhieXRlcyA9IE1BWF9MRlNfRklMRVNJWkU7CisJc2ItPnNfYmxvY2tzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gUEFHRV9DQUNIRV9TSElGVDsKKwlzYi0+c19tYWdpYyA9IFNQVUZTX01BR0lDOworCXNiLT5zX29wID0gJnNfb3BzOworCisJcmV0dXJuIHNwdWZzX2NyZWF0ZV9yb290KHNiLCBkYXRhKTsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqCitzcHVmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzdHlwZSwgaW50IGZsYWdzLAorCQljb25zdCBjaGFyICpuYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2Jfc2luZ2xlKGZzdHlwZSwgZmxhZ3MsIGRhdGEsIHNwdWZzX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgc3B1ZnNfdHlwZSA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9ICJzcHVmcyIsCisJLmdldF9zYiA9IHNwdWZzX2dldF9zYiwKKwkua2lsbF9zYiA9IGtpbGxfbGl0dGVyX3N1cGVyLAorfTsKKworc3RhdGljIGludCBzcHVmc19pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlyZXQgPSAtRU5PTUVNOworCXNwdWZzX2lub2RlX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInNwdWZzX2lub2RlX2NhY2hlIiwKKwkJCXNpemVvZihzdHJ1Y3Qgc3B1ZnNfaW5vZGVfaW5mbyksIDAsCisJCQlTTEFCX0hXQ0FDSEVfQUxJR04sIHNwdWZzX2luaXRfb25jZSwgTlVMTCk7CisKKwlpZiAoIXNwdWZzX2lub2RlX2NhY2hlKQorCQlnb3RvIG91dDsKKwlpZiAoc3B1X3NjaGVkX2luaXQoKSAhPSAwKSB7CisJCWttZW1fY2FjaGVfZGVzdHJveShzcHVmc19pbm9kZV9jYWNoZSk7CisJCWdvdG8gb3V0OworCX0KKwlyZXQgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZzcHVmc190eXBlKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9jYWNoZTsKKwlyZXQgPSByZWdpc3Rlcl9zcHVfc3lzY2FsbHMoJnNwdWZzX2NhbGxzKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9mczsKKwlyZXR1cm4gMDsKK291dF9mczoKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnNwdWZzX3R5cGUpOworb3V0X2NhY2hlOgorCWttZW1fY2FjaGVfZGVzdHJveShzcHVmc19pbm9kZV9jYWNoZSk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KK21vZHVsZV9pbml0KHNwdWZzX2luaXQpOworCitzdGF0aWMgdm9pZCBzcHVmc19leGl0KHZvaWQpCit7CisJc3B1X3NjaGVkX2V4aXQoKTsKKwl1bnJlZ2lzdGVyX3NwdV9zeXNjYWxscygmc3B1ZnNfY2FsbHMpOworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmc3B1ZnNfdHlwZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KHNwdWZzX2lub2RlX2NhY2hlKTsKK30KK21vZHVsZV9leGl0KHNwdWZzX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJBcm5kIEJlcmdtYW5uIDxhcm5kYkBkZS5pYm0uY29tPiIpOworCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvcnVuLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvcnVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlYTg4NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9ydW4uYwpAQCAtMCwwICsxLDEzMSBAQAorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKworI2luY2x1ZGUgPGFzbS9zcHUuaD4KKworI2luY2x1ZGUgInNwdWZzLmgiCisKKy8qIGludGVycnVwdC1sZXZlbCBzdG9wIGNhbGxiYWNrIGZ1bmN0aW9uLiAqLwordm9pZCBzcHVmc19zdG9wX2NhbGxiYWNrKHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IHNwdS0+Y3R4OworCisJd2FrZV91cF9hbGwoJmN0eC0+c3RvcF93cSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNwdV9zdG9wcGVkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1MzIgKiBzdGF0KQoreworCXN0cnVjdCBzcHUgKnNwdTsKKwl1NjQgcHRlX2ZhdWx0OworCisJKnN0YXQgPSBjdHgtPm9wcy0+c3RhdHVzX3JlYWQoY3R4KTsKKwlpZiAoY3R4LT5zdGF0ZSAhPSBTUFVfU1RBVEVfUlVOTkFCTEUpCisJCXJldHVybiAxOworCXNwdSA9IGN0eC0+c3B1OworCXB0ZV9mYXVsdCA9IHNwdS0+ZHNpc3IgJgorCSAgICAoTUZDX0RTSVNSX1BURV9OT1RfRk9VTkQgfCBNRkNfRFNJU1JfQUNDRVNTX0RFTklFRCk7CisJcmV0dXJuICghKCpzdGF0ICYgMHgxKSB8fCBwdGVfZmF1bHQgfHwgc3B1LT5jbGFzc18wX3BlbmRpbmcpID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNwdV9ydW5faW5pdChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgdTMyICogbnBjLAorCQkJICAgICAgIHUzMiAqIHN0YXR1cykKK3sKKwlpbnQgcmV0OworCisJaWYgKChyZXQgPSBzcHVfYWNxdWlyZV9ydW5uYWJsZShjdHgpKSAhPSAwKQorCQlyZXR1cm4gcmV0OworCWN0eC0+b3BzLT5ucGNfd3JpdGUoY3R4LCAqbnBjKTsKKwljdHgtPm9wcy0+cnVuY250bF93cml0ZShjdHgsIFNQVV9SVU5DTlRMX1JVTk5BQkxFKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3B1X3J1bl9maW5pKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1MzIgKiBucGMsCisJCQkgICAgICAgdTMyICogc3RhdHVzKQoreworCWludCByZXQgPSAwOworCisJKnN0YXR1cyA9IGN0eC0+b3BzLT5zdGF0dXNfcmVhZChjdHgpOworCSpucGMgPSBjdHgtPm9wcy0+bnBjX3JlYWQoY3R4KTsKKwlzcHVfcmVsZWFzZShjdHgpOworCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJaWYgKHVubGlrZWx5KGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpKSB7CisJCWlmICgoKnN0YXR1cyAmIFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9TVE9QKQorCQkgICAgJiYgKCpzdGF0dXMgPj4gU1BVX1NUT1BfU1RBVFVTX1NISUZUKSA9PSAweDNmZmYpIHsKKwkJCWZvcmNlX3NpZyhTSUdUUkFQLCBjdXJyZW50KTsKKwkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludCBzcHVfcmVhY3F1aXJlX3J1bm5hYmxlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1MzIgKm5wYywKKwkJCQkgICAgICAgICB1MzIgKnN0YXR1cykKK3sKKwlpbnQgcmV0OworCisJaWYgKChyZXQgPSBzcHVfcnVuX2ZpbmkoY3R4LCBucGMsIHN0YXR1cykpICE9IDApCisJCXJldHVybiByZXQ7CisJaWYgKCpzdGF0dXMgJiAoU1BVX1NUQVRVU19TVE9QUEVEX0JZX1NUT1AgfAorCQkgICAgICAgU1BVX1NUQVRVU19TVE9QUEVEX0JZX0hBTFQpKSB7CisJCXJldHVybiAqc3RhdHVzOworCX0KKwlpZiAoKHJldCA9IHNwdV9ydW5faW5pdChjdHgsIG5wYywgc3RhdHVzKSkgIT0gMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3B1X3Byb2Nlc3NfZXZlbnRzKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCXN0cnVjdCBzcHUgKnNwdSA9IGN0eC0+c3B1OworCXU2NCBwdGVfZmF1bHQgPSBNRkNfRFNJU1JfUFRFX05PVF9GT1VORCB8IE1GQ19EU0lTUl9BQ0NFU1NfREVOSUVEOworCWludCByZXQgPSAwOworCisJaWYgKHNwdS0+ZHNpc3IgJiBwdGVfZmF1bHQpCisJCXJldCA9IHNwdV9pcnFfY2xhc3NfMV9ib3R0b20oc3B1KTsKKwlpZiAoc3B1LT5jbGFzc18wX3BlbmRpbmcpCisJCXJldCA9IHNwdV9pcnFfY2xhc3NfMF9ib3R0b20oc3B1KTsKKwlpZiAoIXJldCAmJiBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmV0ID0gLUVSRVNUQVJUU1lTOworCXJldHVybiByZXQ7Cit9CisKK2xvbmcgc3B1ZnNfcnVuX3NwdShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsCisJCSAgIHUzMiAqIG5wYywgdTMyICogc3RhdHVzKQoreworCWludCByZXQ7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZjdHgtPnJ1bl9zZW1hKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCXJldCA9IHNwdV9ydW5faW5pdChjdHgsIG5wYywgc3RhdHVzKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWRvIHsKKwkJcmV0ID0gc3B1ZnNfd2FpdChjdHgtPnN0b3Bfd3EsIHNwdV9zdG9wcGVkKGN0eCwgc3RhdHVzKSk7CisJCWlmICh1bmxpa2VseShyZXQpKQorCQkJYnJlYWs7CisJCWlmICh1bmxpa2VseShjdHgtPnN0YXRlICE9IFNQVV9TVEFURV9SVU5OQUJMRSkpIHsKKwkJCXJldCA9IHNwdV9yZWFjcXVpcmVfcnVubmFibGUoY3R4LCBucGMsIHN0YXR1cyk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gb3V0OworCQkJY29udGludWU7CisJCX0KKwkJcmV0ID0gc3B1X3Byb2Nlc3NfZXZlbnRzKGN0eCk7CisKKwl9IHdoaWxlICghcmV0ICYmICEoKnN0YXR1cyAmIChTUFVfU1RBVFVTX1NUT1BQRURfQllfU1RPUCB8CisJCQkJICAgICAgU1BVX1NUQVRVU19TVE9QUEVEX0JZX0hBTFQpKSk7CisKKwljdHgtPm9wcy0+cnVuY250bF9zdG9wKGN0eCk7CisJcmV0ID0gc3B1X3J1bl9maW5pKGN0eCwgbnBjLCBzdGF0dXMpOworCWlmICghcmV0KQorCQlyZXQgPSAqc3RhdHVzOworCXNwdV95aWVsZChjdHgpOworCitvdXQ6CisJdXAoJmN0eC0+cnVuX3NlbWEpOworCXJldHVybiByZXQ7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zY2hlZC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NjaGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYzMTgyZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zY2hlZC5jCkBAIC0wLDAgKzEsNDYxIEBACisvKiBzY2hlZC5jIC0gU1BVIHNjaGVkdWxlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIElCTSAyMDA1CisgKiBBdXRob3I6IE1hcmsgTnV0dGVyIDxtbnV0dGVyQHVzLmlibS5jb20+CisgKgorICogU1BVIHNjaGVkdWxlciwgYmFzZWQgb24gTGludXggdGhyZWFkIHByaW9yaXR5LiAgRm9yIG5vdyB1c2UKKyAqIGEgc2ltcGxlICJjb29wZXJhdGl2ZSIgeWllbGQgbW9kZWwgd2l0aCBubyBwcmVlbXB0aW9uLiAgU1BVCisgKiBzY2hlZHVsaW5nIHdpbGwgZXZlbnR1YWxseSBiZSBwcmVlbXB0aXZlOiBXaGVuIGEgdGhyZWFkIHdpdGgKKyAqIGEgaGlnaGVyIHN0YXRpYyBwcmlvcml0eSBnZXRzIHJlYWR5IHRvIHJ1biwgdGhlbiBhbiBhY3RpdmUgU1BVCisgKiBjb250ZXh0IHdpbGwgYmUgcHJlZW1wdGVkIGFuZCByZXR1cm5lZCB0byB0aGUgd2FpdHEuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS9zcHUuaD4KKyNpbmNsdWRlIDxhc20vc3B1X2NzYS5oPgorI2luY2x1ZGUgInNwdWZzLmgiCisKKyNkZWZpbmUgU1BVX01JTl9USU1FU0xJQ0UgCSgxMDAgKiBIWiAvIDEwMDApCisKKyNkZWZpbmUgU1BVX0JJVE1BUF9TSVpFICgoKE1BWF9QUklPK0JJVFNfUEVSX0xPTkcpL0JJVFNfUEVSX0xPTkcpKzEpCitzdHJ1Y3Qgc3B1X3ByaW9fYXJyYXkgeworCWF0b21pY190IG5yX2Jsb2NrZWQ7CisJdW5zaWduZWQgbG9uZyBiaXRtYXBbU1BVX0JJVE1BUF9TSVpFXTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0cVtNQVhfUFJJT107Cit9OworCisvKiBzcHVfcnVucXVldWUgLSBUaGlzIGlzIHRoZSBtYWluIHJ1bnF1ZXVlIGRhdGEgc3RydWN0dXJlIGZvciBTUFVzLiAqLworc3RydWN0IHNwdV9ydW5xdWV1ZSB7CisJc3RydWN0IHNlbWFwaG9yZSBzZW07CisJdW5zaWduZWQgbG9uZyBucl9hY3RpdmU7CisJdW5zaWduZWQgbG9uZyBucl9pZGxlOworCXVuc2lnbmVkIGxvbmcgbnJfc3dpdGNoZXM7CisJc3RydWN0IGxpc3RfaGVhZCBhY3RpdmVfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGlkbGVfbGlzdDsKKwlzdHJ1Y3Qgc3B1X3ByaW9fYXJyYXkgcHJpbzsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3B1X3J1bnF1ZXVlICpzcHVfcnVucXVldWVzID0gTlVMTDsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3B1X3J1bnF1ZXVlICpzcHVfcnEodm9pZCkKK3sKKwkvKiBGdXR1cmU6IG1ha2UgdGhpcyBhIHBlci1OT0RFIGFycmF5LAorCSAqIGFuZCB1c2UgY3B1X3RvX25vZGUoc21wX3Byb2Nlc3Nvcl9pZCgpKQorCSAqLworCXJldHVybiBzcHVfcnVucXVldWVzOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzcHUgKmRlbF9pZGxlKHN0cnVjdCBzcHVfcnVucXVldWUgKnJxKQoreworCXN0cnVjdCBzcHUgKnNwdTsKKworCUJVR19PTihycS0+bnJfaWRsZSA8PSAwKTsKKwlCVUdfT04obGlzdF9lbXB0eSgmcnEtPmlkbGVfbGlzdCkpOworCS8qIEZ1dHVyZTogTW92ZSBTUFUgb3V0IG9mIGxvdy1wb3dlciBTUkkgc3RhdGUuICovCisJc3B1ID0gbGlzdF9lbnRyeShycS0+aWRsZV9saXN0Lm5leHQsIHN0cnVjdCBzcHUsIHNjaGVkX2xpc3QpOworCWxpc3RfZGVsX2luaXQoJnNwdS0+c2NoZWRfbGlzdCk7CisJcnEtPm5yX2lkbGUtLTsKKwlyZXR1cm4gc3B1OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsX2FjdGl2ZShzdHJ1Y3Qgc3B1X3J1bnF1ZXVlICpycSwgc3RydWN0IHNwdSAqc3B1KQoreworCUJVR19PTihycS0+bnJfYWN0aXZlIDw9IDApOworCUJVR19PTihsaXN0X2VtcHR5KCZycS0+YWN0aXZlX2xpc3QpKTsKKwlsaXN0X2RlbF9pbml0KCZzcHUtPnNjaGVkX2xpc3QpOworCXJxLT5ucl9hY3RpdmUtLTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkZF9pZGxlKHN0cnVjdCBzcHVfcnVucXVldWUgKnJxLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJLyogRnV0dXJlOiBQdXQgU1BVIGludG8gbG93LXBvd2VyIFNSSSBzdGF0ZS4gKi8KKwlsaXN0X2FkZF90YWlsKCZzcHUtPnNjaGVkX2xpc3QsICZycS0+aWRsZV9saXN0KTsKKwlycS0+bnJfaWRsZSsrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWRkX2FjdGl2ZShzdHJ1Y3Qgc3B1X3J1bnF1ZXVlICpycSwgc3RydWN0IHNwdSAqc3B1KQoreworCXJxLT5ucl9hY3RpdmUrKzsKKwlycS0+bnJfc3dpdGNoZXMrKzsKKwlsaXN0X2FkZF90YWlsKCZzcHUtPnNjaGVkX2xpc3QsICZycS0+YWN0aXZlX2xpc3QpOworfQorCitzdGF0aWMgdm9pZCBwcmlvX3dha2V1cChzdHJ1Y3Qgc3B1X3J1bnF1ZXVlICpycSkKK3sKKwlpZiAoYXRvbWljX3JlYWQoJnJxLT5wcmlvLm5yX2Jsb2NrZWQpICYmIHJxLT5ucl9pZGxlKSB7CisJCWludCBiZXN0ID0gc2NoZWRfZmluZF9maXJzdF9iaXQocnEtPnByaW8uYml0bWFwKTsKKwkJaWYgKGJlc3QgPCBNQVhfUFJJTykgeworCQkJd2FpdF9xdWV1ZV9oZWFkX3QgKndxID0gJnJxLT5wcmlvLndhaXRxW2Jlc3RdOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX25yKHdxLCAxKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcHJpb193YWl0KHN0cnVjdCBzcHVfcnVucXVldWUgKnJxLCBzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwKKwkJICAgICAgdTY0IGZsYWdzKQoreworCWludCBwcmlvID0gY3VycmVudC0+cHJpbzsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAqd3EgPSAmcnEtPnByaW8ud2FpdHFbcHJpb107CisJREVGSU5FX1dBSVQod2FpdCk7CisKKwlfX3NldF9iaXQocHJpbywgcnEtPnByaW8uYml0bWFwKTsKKwlhdG9taWNfaW5jKCZycS0+cHJpby5ucl9ibG9ja2VkKTsKKwlwcmVwYXJlX3RvX3dhaXRfZXhjbHVzaXZlKHdxLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCXVwKCZycS0+c2VtKTsKKwkJdXBfd3JpdGUoJmN0eC0+c3RhdGVfc2VtYSk7CisJCXByX2RlYnVnKCIlczogcGlkPSVkIHByaW89JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSBjdXJyZW50LT5waWQsIGN1cnJlbnQtPnByaW8pOworCQlzY2hlZHVsZSgpOworCQlkb3duX3dyaXRlKCZjdHgtPnN0YXRlX3NlbWEpOworCQlkb3duKCZycS0+c2VtKTsKKwl9CisJZmluaXNoX3dhaXQod3EsICZ3YWl0KTsKKwlhdG9taWNfZGVjKCZycS0+cHJpby5ucl9ibG9ja2VkKTsKKwlpZiAoIXdhaXRxdWV1ZV9hY3RpdmUod3EpKQorCQlfX2NsZWFyX2JpdChwcmlvLCBycS0+cHJpby5iaXRtYXApOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19iZXN0X3ByaW8oc3RydWN0IHNwdV9ydW5xdWV1ZSAqcnEpCit7CisJaW50IGJlc3RfcHJpbzsKKworCWJlc3RfcHJpbyA9IHNjaGVkX2ZpbmRfZmlyc3RfYml0KHJxLT5wcmlvLmJpdG1hcCk7CisJcmV0dXJuIChjdXJyZW50LT5wcmlvIDwgYmVzdF9wcmlvKSA/IDEgOiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbW1fbmVlZHNfZ2xvYmFsX3RsYmllKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCS8qIEdsb2JhbCBUTEJJRSBicm9hZGNhc3QgcmVxdWlyZWQgd2l0aCBTUEVzLiAqLworI2lmIChOUl9DUFVTID4gMSkKKwlfX2NwdXNfc2V0YWxsKCZtbS0+Y3B1X3ZtX21hc2ssIE5SX0NQVVMpOworI2Vsc2UKKwlfX2NwdXNfc2V0YWxsKCZtbS0+Y3B1X3ZtX21hc2ssIE5SX0NQVVMrMSk7IC8qIGlzIHRoaXMgb2s/ICovCisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJpbmRfY29udGV4dChzdHJ1Y3Qgc3B1ICpzcHUsIHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCXByX2RlYnVnKCIlczogcGlkPSVkIFNQVT0lZFxuIiwgX19GVU5DVElPTl9fLCBjdXJyZW50LT5waWQsCisJCSBzcHUtPm51bWJlcik7CisJc3B1LT5jdHggPSBjdHg7CisJc3B1LT5mbGFncyA9IDA7CisJY3R4LT5mbGFncyA9IDA7CisJY3R4LT5zcHUgPSBzcHU7CisJY3R4LT5vcHMgPSAmc3B1X2h3X29wczsKKwlzcHUtPnBpZCA9IGN1cnJlbnQtPnBpZDsKKwlzcHUtPnByaW8gPSBjdXJyZW50LT5wcmlvOworCXNwdS0+bW0gPSBjdHgtPm93bmVyOworCW1tX25lZWRzX2dsb2JhbF90bGJpZShzcHUtPm1tKTsKKwlzcHUtPmlib3hfY2FsbGJhY2sgPSBzcHVmc19pYm94X2NhbGxiYWNrOworCXNwdS0+d2JveF9jYWxsYmFjayA9IHNwdWZzX3dib3hfY2FsbGJhY2s7CisJc3B1LT5zdG9wX2NhbGxiYWNrID0gc3B1ZnNfc3RvcF9jYWxsYmFjazsKKwltYigpOworCXNwdV91bm1hcF9tYXBwaW5ncyhjdHgpOworCXNwdV9yZXN0b3JlKCZjdHgtPmNzYSwgc3B1KTsKKwlzcHUtPnRpbWVzdGFtcCA9IGppZmZpZXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1bmJpbmRfY29udGV4dChzdHJ1Y3Qgc3B1ICpzcHUsIHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCXByX2RlYnVnKCIlczogdW5iaW5kIHBpZD0lZCBTUFU9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJIHNwdS0+cGlkLCBzcHUtPm51bWJlcik7CisJc3B1X3VubWFwX21hcHBpbmdzKGN0eCk7CisJc3B1X3NhdmUoJmN0eC0+Y3NhLCBzcHUpOworCXNwdS0+dGltZXN0YW1wID0gamlmZmllczsKKwljdHgtPnN0YXRlID0gU1BVX1NUQVRFX1NBVkVEOworCXNwdS0+aWJveF9jYWxsYmFjayA9IE5VTEw7CisJc3B1LT53Ym94X2NhbGxiYWNrID0gTlVMTDsKKwlzcHUtPnN0b3BfY2FsbGJhY2sgPSBOVUxMOworCXNwdS0+bW0gPSBOVUxMOworCXNwdS0+cGlkID0gMDsKKwlzcHUtPnByaW8gPSBNQVhfUFJJTzsKKwljdHgtPm9wcyA9ICZzcHVfYmFja2luZ19vcHM7CisJY3R4LT5zcHUgPSBOVUxMOworCWN0eC0+ZmxhZ3MgPSAwOworCXNwdS0+ZmxhZ3MgPSAwOworCXNwdS0+Y3R4ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc3B1X3JlYXBlcih2b2lkICpkYXRhKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZGF0YTsKKwlzdHJ1Y3Qgc3B1ICpzcHU7CisKKwlkb3duX3dyaXRlKCZjdHgtPnN0YXRlX3NlbWEpOworCXNwdSA9IGN0eC0+c3B1OworCWlmIChzcHUgJiYgdGVzdF9iaXQoU1BVX0NPTlRFWFRfUFJFRU1QVCwgJmN0eC0+ZmxhZ3MpKSB7CisJCWlmIChhdG9taWNfcmVhZCgmc3B1LT5ycS0+cHJpby5ucl9ibG9ja2VkKSkgeworCQkJcHJfZGVidWcoIiVzOiBzcHU9JWRcbiIsIF9fZnVuY19fLCBzcHUtPm51bWJlcik7CisJCQljdHgtPm9wcy0+cnVuY250bF9zdG9wKGN0eCk7CisJCQlzcHVfZGVhY3RpdmF0ZShjdHgpOworCQkJd2FrZV91cF9hbGwoJmN0eC0+c3RvcF93cSk7CisJCX0gZWxzZSB7CisJCQljbGVhcl9iaXQoU1BVX0NPTlRFWFRfUFJFRU1QVCwgJmN0eC0+ZmxhZ3MpOworCQl9CisJfQorCXVwX3dyaXRlKCZjdHgtPnN0YXRlX3NlbWEpOworCXB1dF9zcHVfY29udGV4dChjdHgpOworfQorCitzdGF0aWMgdm9pZCBzY2hlZHVsZV9zcHVfcmVhcGVyKHN0cnVjdCBzcHVfcnVucXVldWUgKnJxLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBnZXRfc3B1X2NvbnRleHQoc3B1LT5jdHgpOworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwl1bnNpZ25lZCBsb25nIGV4cGlyZSA9IHNwdS0+dGltZXN0YW1wICsgU1BVX01JTl9USU1FU0xJQ0U7CisKKwlzZXRfYml0KFNQVV9DT05URVhUX1BSRUVNUFQsICZjdHgtPmZsYWdzKTsKKwlJTklUX1dPUksoJmN0eC0+cmVhcF93b3JrLCBzcHVfcmVhcGVyLCBjdHgpOworCWlmICh0aW1lX2FmdGVyKG5vdywgZXhwaXJlKSkKKwkJc2NoZWR1bGVfd29yaygmY3R4LT5yZWFwX3dvcmspOworCWVsc2UKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjdHgtPnJlYXBfd29yaywgZXhwaXJlIC0gbm93KTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfcHJlZW1wdF9hY3RpdmUoc3RydWN0IHNwdV9ydW5xdWV1ZSAqcnEpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3Qgc3B1ICp3b3JzdCA9IE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZycS0+YWN0aXZlX2xpc3QpIHsKKwkJc3RydWN0IHNwdSAqc3B1ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc3B1LCBzY2hlZF9saXN0KTsKKwkJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBzcHUtPmN0eDsKKwkJaWYgKCF0ZXN0X2JpdChTUFVfQ09OVEVYVF9QUkVFTVBULCAmY3R4LT5mbGFncykpIHsKKwkJCWlmICghd29yc3QgfHwgKHNwdS0+cHJpbyA+IHdvcnN0LT5wcmlvKSkgeworCQkJCXdvcnN0ID0gc3B1OworCQkJfQorCQl9CisJfQorCWlmICh3b3JzdCAmJiAoY3VycmVudC0+cHJpbyA8IHdvcnN0LT5wcmlvKSkKKwkJc2NoZWR1bGVfc3B1X3JlYXBlcihycSwgd29yc3QpOworfQorCitzdGF0aWMgc3RydWN0IHNwdSAqZ2V0X2lkbGVfc3B1KHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1NjQgZmxhZ3MpCit7CisJc3RydWN0IHNwdV9ydW5xdWV1ZSAqcnE7CisJc3RydWN0IHNwdSAqc3B1ID0gTlVMTDsKKworCXJxID0gc3B1X3JxKCk7CisJZG93bigmcnEtPnNlbSk7CisJZm9yICg7OykgeworCQlpZiAocnEtPm5yX2lkbGUgPiAwKSB7CisJCQlpZiAoaXNfYmVzdF9wcmlvKHJxKSkgeworCQkJCS8qIEZhbGwgdGhyb3VnaC4gKi8KKwkJCQlzcHUgPSBkZWxfaWRsZShycSk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXByaW9fd2FrZXVwKHJxKTsKKwkJCQl1cCgmcnEtPnNlbSk7CisJCQkJeWllbGQoKTsKKwkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQorCQkJCXJxID0gc3B1X3JxKCk7CisJCQkJZG93bigmcnEtPnNlbSk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0gZWxzZSB7CisJCQljaGVja19wcmVlbXB0X2FjdGl2ZShycSk7CisJCQlwcmlvX3dhaXQocnEsIGN0eCwgZmxhZ3MpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcHJpb193YWtldXAocnEpOworCQkJCXNwdSA9IE5VTEw7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCX0KKwl1cCgmcnEtPnNlbSk7CisJcmV0dXJuIHNwdTsKK30KKworc3RhdGljIHZvaWQgcHV0X2lkbGVfc3B1KHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3J1bnF1ZXVlICpycSA9IHNwdS0+cnE7CisKKwlkb3duKCZycS0+c2VtKTsKKwlhZGRfaWRsZShycSwgc3B1KTsKKwlwcmlvX3dha2V1cChycSk7CisJdXAoJnJxLT5zZW0pOworfQorCitzdGF0aWMgaW50IGdldF9hY3RpdmVfc3B1KHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3J1bnF1ZXVlICpycSA9IHNwdS0+cnE7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3Qgc3B1ICp0bXA7CisJaW50IHJjID0gMDsKKworCWRvd24oJnJxLT5zZW0pOworCWxpc3RfZm9yX2VhY2gocCwgJnJxLT5hY3RpdmVfbGlzdCkgeworCQl0bXAgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzcHUsIHNjaGVkX2xpc3QpOworCQlpZiAodG1wID09IHNwdSkgeworCQkJZGVsX2FjdGl2ZShycSwgc3B1KTsKKwkJCXJjID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXVwKCZycS0+c2VtKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9hY3RpdmVfc3B1KHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3J1bnF1ZXVlICpycSA9IHNwdS0+cnE7CisKKwlkb3duKCZycS0+c2VtKTsKKwlhZGRfYWN0aXZlKHJxLCBzcHUpOworCXVwKCZycS0+c2VtKTsKK30KKworLyogTG9jayBvcmRlcjoKKyAqCXNwdV9hY3RpdmF0ZSgpICYgc3B1X2RlYWN0aXZhdGUoKSByZXF1aXJlIHRoZQorICoJY2FsbGVyIHRvIGhhdmUgZG93bl93cml0ZSgmY3R4LT5zdGF0ZV9zZW1hKS4KKyAqCisgKglUaGUgcnEtPnNlbSBpcyBicmVpZmx5IGhlbGQgKGluc2lkZSBvciBvdXRzaWRlIGEKKyAqCWdpdmVuIGN0eCBsb2NrKSBmb3IgbGlzdCBtYW5hZ2VtZW50LCBidXQgaXMgbmV2ZXIKKyAqCWhlbGQgZHVyaW5nIHNhdmUvcmVzdG9yZS4KKyAqLworCitpbnQgc3B1X2FjdGl2YXRlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1NjQgZmxhZ3MpCit7CisJc3RydWN0IHNwdSAqc3B1OworCisJaWYgKGN0eC0+c3B1KQorCQlyZXR1cm4gMDsKKwlzcHUgPSBnZXRfaWRsZV9zcHUoY3R4LCBmbGFncyk7CisJaWYgKCFzcHUpCisJCXJldHVybiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpID8gLUVSRVNUQVJUU1lTIDogLUVBR0FJTjsKKwliaW5kX2NvbnRleHQoc3B1LCBjdHgpOworCS8qCisJICogV2UncmUgbGlrZWx5IHRvIHdhaXQgZm9yIGludGVycnVwdHMgb24gdGhlIHNhbWUKKwkgKiBDUFUgdGhhdCB3ZSBhcmUgbm93IG9uLCBzbyBzZW5kIHRoZW0gaGVyZS4KKwkgKi8KKwlzcHVfaXJxX3NldGFmZmluaXR5KHNwdSwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CisJcHV0X2FjdGl2ZV9zcHUoc3B1KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzcHVfZGVhY3RpdmF0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHU7CisJaW50IG5lZWRzX2lkbGU7CisKKwlzcHUgPSBjdHgtPnNwdTsKKwlpZiAoIXNwdSkKKwkJcmV0dXJuOworCW5lZWRzX2lkbGUgPSBnZXRfYWN0aXZlX3NwdShzcHUpOworCXVuYmluZF9jb250ZXh0KHNwdSwgY3R4KTsKKwlpZiAobmVlZHNfaWRsZSkKKwkJcHV0X2lkbGVfc3B1KHNwdSk7Cit9CisKK3ZvaWQgc3B1X3lpZWxkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCXN0cnVjdCBzcHUgKnNwdTsKKwlpbnQgbmVlZF95aWVsZCA9IDA7CisKKwlkb3duX3dyaXRlKCZjdHgtPnN0YXRlX3NlbWEpOworCXNwdSA9IGN0eC0+c3B1OworCWlmIChzcHUgJiYgKHNjaGVkX2ZpbmRfZmlyc3RfYml0KHNwdS0+cnEtPnByaW8uYml0bWFwKSA8IE1BWF9QUklPKSkgeworCQlwcl9kZWJ1ZygiJXM6IHlpZWxkaW5nIFNQVSAlZFxuIiwgX19GVU5DVElPTl9fLCBzcHUtPm51bWJlcik7CisJCXNwdV9kZWFjdGl2YXRlKGN0eCk7CisJCWN0eC0+c3RhdGUgPSBTUFVfU1RBVEVfU0FWRUQ7CisJCW5lZWRfeWllbGQgPSAxOworCX0gZWxzZSBpZiAoc3B1KSB7CisJCXNwdS0+cHJpbyA9IE1BWF9QUklPOworCX0KKwl1cF93cml0ZSgmY3R4LT5zdGF0ZV9zZW1hKTsKKwlpZiAodW5saWtlbHkobmVlZF95aWVsZCkpCisJCXlpZWxkKCk7Cit9CisKK2ludCBfX2luaXQgc3B1X3NjaGVkX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc3B1X3J1bnF1ZXVlICpycTsKKwlzdHJ1Y3Qgc3B1ICpzcHU7CisJaW50IGk7CisKKwlycSA9IHNwdV9ydW5xdWV1ZXMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3B1X3J1bnF1ZXVlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFycSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5hYmxlIHRvIGFsbG9jYXRlIHJ1bnF1ZXVlcy5cbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gMTsKKwl9CisJbWVtc2V0KHJxLCAwLCBzaXplb2Yoc3RydWN0IHNwdV9ydW5xdWV1ZSkpOworCWluaXRfTVVURVgoJnJxLT5zZW0pOworCUlOSVRfTElTVF9IRUFEKCZycS0+YWN0aXZlX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZycS0+aWRsZV9saXN0KTsKKwlycS0+bnJfYWN0aXZlID0gMDsKKwlycS0+bnJfaWRsZSA9IDA7CisJcnEtPm5yX3N3aXRjaGVzID0gMDsKKwlhdG9taWNfc2V0KCZycS0+cHJpby5ucl9ibG9ja2VkLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1BSSU87IGkrKykgeworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZycS0+cHJpby53YWl0cVtpXSk7CisJCV9fY2xlYXJfYml0KGksIHJxLT5wcmlvLmJpdG1hcCk7CisJfQorCV9fc2V0X2JpdChNQVhfUFJJTywgcnEtPnByaW8uYml0bWFwKTsKKwlmb3IgKDs7KSB7CisJCXNwdSA9IHNwdV9hbGxvYygpOworCQlpZiAoIXNwdSkKKwkJCWJyZWFrOworCQlwcl9kZWJ1ZygiJXM6IGFkZGluZyBTUFVbJWRdXG4iLCBfX0ZVTkNUSU9OX18sIHNwdS0+bnVtYmVyKTsKKwkJYWRkX2lkbGUocnEsIHNwdSk7CisJCXNwdS0+cnEgPSBycTsKKwkJc3B1LT50aW1lc3RhbXAgPSBqaWZmaWVzOworCX0KKwlpZiAoIXJxLT5ucl9pZGxlKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBObyBhdmFpbGFibGUgU1BVcy5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWtmcmVlKHJxKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIF9fZXhpdCBzcHVfc2NoZWRfZXhpdCh2b2lkKQoreworCXN0cnVjdCBzcHVfcnVucXVldWUgKnJxID0gc3B1X3JxKCk7CisJc3RydWN0IHNwdSAqc3B1OworCisJaWYgKCFycSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbm8gcnVucXVldWVzIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKwl3aGlsZSAocnEtPm5yX2lkbGUgPiAwKSB7CisJCXNwdSA9IGRlbF9pZGxlKHJxKTsKKwkJaWYgKCFzcHUpCisJCQlicmVhazsKKwkJc3B1X2ZyZWUoc3B1KTsKKwl9CisJa2ZyZWUocnEpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9yZXN0b3JlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1X3Jlc3RvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmY3MjNkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9yZXN0b3JlLmMKQEAgLTAsMCArMSwzMzYgQEAKKy8qCisgKiBzcHVfcmVzdG9yZS5jCisgKgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNQorICoKKyAqIFNQVS1zaWRlIGNvbnRleHQgcmVzdG9yZSBzZXF1ZW5jZSBvdXRsaW5lZCBpbgorICogU3luZXJnaXN0aWMgUHJvY2Vzc29yIEVsZW1lbnQgQm9vayBJVgorICoKKyAqIEF1dGhvcjogTWFyayBOdXR0ZXIgPG1udXR0ZXJAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisKKyNpZm5kZWYgTFNfU0laRQorI2RlZmluZSBMU19TSVpFICAgICAgICAgICAgICAgICAweDQwMDAwCS8qIDI1NksgKGluIGJ5dGVzKSAqLworI2VuZGlmCisKK3R5cGVkZWYgdW5zaWduZWQgaW50IHUzMjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHU2NDsKKworI2luY2x1ZGUgPHNwdV9pbnRyaW5zaWNzLmg+CisjaW5jbHVkZSA8YXNtL3NwdV9jc2EuaD4KKyNpbmNsdWRlICJzcHVfdXRpbHMuaCIKKworI2RlZmluZSBCUl9JTlNUUgkJMHgzMjdmZmY4MAkvKiBiciAtNCAgICAgICAgICovCisjZGVmaW5lIE5PUF9JTlNUUgkJMHg0MDIwMDAwMAkvKiBub3AgICAgICAgICAgICovCisjZGVmaW5lIEhFUV9JTlNUUgkJMHg3YjAwMDAwMAkvKiBoZXEgJDAsICQwICAgICovCisjZGVmaW5lIFNUT1BfSU5TVFIJCTB4MDAwMDAwMDAJLyogc3RvcCAweDAgICAgICAqLworI2RlZmluZSBJTExFR0FMX0lOU1RSCQkweDAwODAwMDAwCS8qIGlsbGVnYWwgaW5zdHIgKi8KKyNkZWZpbmUgUkVTVE9SRV9DT01QTEVURQkweDAwMDAzZmZjCS8qIHN0b3AgMHgzZmZjICAgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGZldGNoX3JlZ3NfZnJvbV9tZW0oYWRkcjY0IGxzY3NhX2VhKQoreworCXVuc2lnbmVkIGludCBscyA9ICh1bnNpZ25lZCBpbnQpJnJlZ3Nfc3BpbGxbMF07CisJdW5zaWduZWQgaW50IHNpemUgPSBzaXplb2YocmVnc19zcGlsbCk7CisJdW5zaWduZWQgaW50IHRhZ19pZCA9IDA7CisJdW5zaWduZWQgaW50IGNtZCA9IDB4NDA7CS8qIEdFVCAqLworCisJc3B1X3dyaXRlY2goTUZDX0xTQSwgbHMpOworCXNwdV93cml0ZWNoKE1GQ19FQUgsIGxzY3NhX2VhLnVpWzBdKTsKKwlzcHVfd3JpdGVjaChNRkNfRUFMLCBsc2NzYV9lYS51aVsxXSk7CisJc3B1X3dyaXRlY2goTUZDX1NpemUsIHNpemUpOworCXNwdV93cml0ZWNoKE1GQ19UYWdJRCwgdGFnX2lkKTsKKwlzcHVfd3JpdGVjaChNRkNfQ21kLCBjbWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzdG9yZV91cHBlcl8yNDBrYihhZGRyNjQgbHNjc2FfZWEpCit7CisJdW5zaWduZWQgaW50IGxzID0gMTYzODQ7CisJdW5zaWduZWQgaW50IGxpc3QgPSAodW5zaWduZWQgaW50KSZkbWFfbGlzdFswXTsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IHNpemVvZihkbWFfbGlzdCk7CisJdW5zaWduZWQgaW50IHRhZ19pZCA9IDA7CisJdW5zaWduZWQgaW50IGNtZCA9IDB4NDQ7CS8qIEdFVEwgKi8KKworCS8qIFJlc3RvcmUsIFN0ZXAgNDoKKwkgKiAgICBFbnF1ZXVlIHRoZSBHRVRMIGNvbW1hbmQgKHRhZyAwKSB0byB0aGUgTUZDIFNQVSBjb21tYW5kCisJICogICAgcXVldWUgdG8gdHJhbnNmZXIgdGhlIHVwcGVyIDI0MCBrYiBvZiBMUyBmcm9tIENTQS4KKwkgKi8KKwlzcHVfd3JpdGVjaChNRkNfTFNBLCBscyk7CisJc3B1X3dyaXRlY2goTUZDX0VBSCwgbHNjc2FfZWEudWlbMF0pOworCXNwdV93cml0ZWNoKE1GQ19FQUwsIGxpc3QpOworCXNwdV93cml0ZWNoKE1GQ19TaXplLCBzaXplKTsKKwlzcHVfd3JpdGVjaChNRkNfVGFnSUQsIHRhZ19pZCk7CisJc3B1X3dyaXRlY2goTUZDX0NtZCwgY21kKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc3RvcmVfZGVjcih2b2lkKQoreworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdW5zaWduZWQgaW50IGRlY3JfcnVubmluZzsKKwl1bnNpZ25lZCBpbnQgZGVjcjsKKworCS8qIFJlc3RvcmUsIFN0ZXAgNjoKKwkgKiAgICBJZiB0aGUgTFNDU0EgImRlY3JlbWVudGVyIHJ1bm5pbmciIGZsYWcgaXMgc2V0CisJICogICAgdGhlbiB3cml0ZSB0aGUgU1BVX1dyRGVjIGNoYW5uZWwgd2l0aCB0aGUKKwkgKiAgICBkZWNyZW1lbnRlciB2YWx1ZSBmcm9tIExTQ1NBLgorCSAqLworCW9mZnNldCA9IExTQ1NBX1FXX09GRlNFVChkZWNyX3N0YXR1cyk7CisJZGVjcl9ydW5uaW5nID0gcmVnc19zcGlsbFtvZmZzZXRdLnNsb3RbMF07CisJaWYgKGRlY3JfcnVubmluZykgeworCQlvZmZzZXQgPSBMU0NTQV9RV19PRkZTRVQoZGVjcik7CisJCWRlY3IgPSByZWdzX3NwaWxsW29mZnNldF0uc2xvdFswXTsKKwkJc3B1X3dyaXRlY2goU1BVX1dyRGVjLCBkZWNyKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9wcHVfbWIodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGludCBkYXRhOworCisJLyogUmVzdG9yZSwgU3RlcCAxMToKKwkgKiAgICBXcml0ZSB0aGUgTUZDX1dyT3V0X01CIGNoYW5uZWwgd2l0aCB0aGUgUFBVX01CCisJICogICAgZGF0YSBmcm9tIExTQ1NBLgorCSAqLworCW9mZnNldCA9IExTQ1NBX1FXX09GRlNFVChwcHVfbWIpOworCWRhdGEgPSByZWdzX3NwaWxsW29mZnNldF0uc2xvdFswXTsKKwlzcHVfd3JpdGVjaChTUFVfV3JPdXRNYm94LCBkYXRhKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3BwdWludF9tYih2b2lkKQoreworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdW5zaWduZWQgaW50IGRhdGE7CisKKwkvKiBSZXN0b3JlLCBTdGVwIDEyOgorCSAqICAgIFdyaXRlIHRoZSBNRkNfV3JJbnRfTUIgY2hhbm5lbCB3aXRoIHRoZSBQUFVJTlRfTUIKKwkgKiAgICBkYXRhIGZyb20gTFNDU0EuCisJICovCisJb2Zmc2V0ID0gTFNDU0FfUVdfT0ZGU0VUKHBwdWludF9tYik7CisJZGF0YSA9IHJlZ3Nfc3BpbGxbb2Zmc2V0XS5zbG90WzBdOworCXNwdV93cml0ZWNoKFNQVV9Xck91dEludHJNYm94LCBkYXRhKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc3RvcmVfZnBjcih2b2lkKQoreworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdmVjdG9yIHVuc2lnbmVkIGludCBmcGNyOworCisJLyogUmVzdG9yZSwgU3RlcCAxMzoKKwkgKiAgICBSZXN0b3JlIHRoZSBmbG9hdGluZy1wb2ludCBzdGF0dXMgYW5kIGNvbnRyb2wKKwkgKiAgICByZWdpc3RlciBmcm9tIHRoZSBMU0NTQS4KKwkgKi8KKwlvZmZzZXQgPSBMU0NTQV9RV19PRkZTRVQoZnBjcik7CisJZnBjciA9IHJlZ3Nfc3BpbGxbb2Zmc2V0XS52OworCXNwdV9tdGZwc2NyKGZwY3IpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzdG9yZV9zcnIwKHZvaWQpCit7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgc3JyMDsKKworCS8qIFJlc3RvcmUsIFN0ZXAgMTQ6CisJICogICAgUmVzdG9yZSB0aGUgU1BVIFNSUjAgZGF0YSBmcm9tIHRoZSBMU0NTQS4KKwkgKi8KKwlvZmZzZXQgPSBMU0NTQV9RV19PRkZTRVQoc3JyMCk7CisJc3JyMCA9IHJlZ3Nfc3BpbGxbb2Zmc2V0XS5zbG90WzBdOworCXNwdV93cml0ZWNoKFNQVV9XclNSUjAsIHNycjApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzdG9yZV9ldmVudF9tYXNrKHZvaWQpCit7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgZXZlbnRfbWFzazsKKworCS8qIFJlc3RvcmUsIFN0ZXAgMTU6CisJICogICAgUmVzdG9yZSB0aGUgU1BVX1JkRXZlbnRNc2sgZGF0YSBmcm9tIHRoZSBMU0NTQS4KKwkgKi8KKwlvZmZzZXQgPSBMU0NTQV9RV19PRkZTRVQoZXZlbnRfbWFzayk7CisJZXZlbnRfbWFzayA9IHJlZ3Nfc3BpbGxbb2Zmc2V0XS5zbG90WzBdOworCXNwdV93cml0ZWNoKFNQVV9XckV2ZW50TWFzaywgZXZlbnRfbWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX3RhZ19tYXNrKHZvaWQpCit7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgdGFnX21hc2s7CisKKwkvKiBSZXN0b3JlLCBTdGVwIDE2OgorCSAqICAgIFJlc3RvcmUgdGhlIFNQVV9SZFRhZ01zayBkYXRhIGZyb20gdGhlIExTQ1NBLgorCSAqLworCW9mZnNldCA9IExTQ1NBX1FXX09GRlNFVCh0YWdfbWFzayk7CisJdGFnX21hc2sgPSByZWdzX3NwaWxsW29mZnNldF0uc2xvdFswXTsKKwlzcHVfd3JpdGVjaChNRkNfV3JUYWdNYXNrLCB0YWdfbWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX2NvbXBsZXRlKHZvaWQpCit7CisJZXh0ZXJuIHZvaWQgZXhpdF9maW5pKHZvaWQpOworCXVuc2lnbmVkIGludCAqZXhpdF9pbnN0cnMgPSAodW5zaWduZWQgaW50ICopZXhpdF9maW5pOworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdW5zaWduZWQgaW50IHN0b3BwZWRfc3RhdHVzOworCXVuc2lnbmVkIGludCBzdG9wcGVkX2NvZGU7CisKKwkvKiBSZXN0b3JlLCBTdGVwIDE4OgorCSAqICAgIElzc3VlIGEgc3RvcC1hbmQtc2lnbmFsIGluc3RydWN0aW9uIHdpdGgKKwkgKiAgICAiZ29vZCBjb250ZXh0IHJlc3RvcmUiIHNpZ25hbCB2YWx1ZS4KKwkgKgorCSAqIFJlc3RvcmUsIFN0ZXAgMTk6CisJICogICAgVGhlcmUgbWF5IGJlIGFkZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zIHBsYWNlZAorCSAqICAgIGhlcmUgYnkgdGhlIFBQRSBTZXF1ZW5jZSBmb3IgU1BVIENvbnRleHQKKwkgKiAgICBSZXN0b3JlIGluIG9yZGVyIHRvIHJlc3RvcmUgdGhlIGNvcnJlY3QKKwkgKiAgICAic3RvcHBlZCBzdGF0ZSIuCisJICoKKwkgKiAgICBUaGlzIHN0ZXAgaXMgaGFuZGxlZCBoZXJlIGJ5IGFuYWx5emluZyB0aGUKKwkgKiAgICBMU0NTQS5zdG9wcGVkX3N0YXR1cyBhbmQgdGhlbiBtb2RpZnlpbmcgdGhlCisJICogICAgZXhpdCgpIGZ1bmN0aW9uIHRvIGJlaGF2ZSBhcHByb3ByaWF0ZWx5LgorCSAqLworCisJb2Zmc2V0ID0gTFNDU0FfUVdfT0ZGU0VUKHN0b3BwZWRfc3RhdHVzKTsKKwlzdG9wcGVkX3N0YXR1cyA9IHJlZ3Nfc3BpbGxbb2Zmc2V0XS5zbG90WzBdOworCXN0b3BwZWRfY29kZSA9IHJlZ3Nfc3BpbGxbb2Zmc2V0XS5zbG90WzFdOworCisJc3dpdGNoIChzdG9wcGVkX3N0YXR1cykgeworCWNhc2UgU1BVX1NUT1BQRURfU1RBVFVTX1BfSToKKwkJLyogU1BVX1N0YXR1c1tQLEldPTEuICBBZGQgaWxsZWdhbCBpbnN0cnVjdGlvbgorCQkgKiBmb2xsb3dlZCBieSBzdG9wLWFuZC1zaWduYWwgaW5zdHJ1Y3Rpb24gYWZ0ZXIKKwkJICogZW5kIG9mIHJlc3RvcmUgY29kZS4KKwkJICovCisJCWV4aXRfaW5zdHJzWzBdID0gUkVTVE9SRV9DT01QTEVURTsKKwkJZXhpdF9pbnN0cnNbMV0gPSBJTExFR0FMX0lOU1RSOworCQlleGl0X2luc3Ryc1syXSA9IFNUT1BfSU5TVFIgfCBzdG9wcGVkX2NvZGU7CisJCWJyZWFrOworCWNhc2UgU1BVX1NUT1BQRURfU1RBVFVTX1BfSDoKKwkJLyogU1BVX1N0YXR1c1tQLEhdPTEuICBBZGQgJ2hlcSAkMCwgJDAnIGZvbGxvd2VkCisJCSAqIGJ5IHN0b3AtYW5kLXNpZ25hbCBpbnN0cnVjdGlvbiBhZnRlciBlbmQgb2YKKwkJICogcmVzdG9yZSBjb2RlLgorCQkgKi8KKwkJZXhpdF9pbnN0cnNbMF0gPSBSRVNUT1JFX0NPTVBMRVRFOworCQlleGl0X2luc3Ryc1sxXSA9IEhFUV9JTlNUUjsKKwkJZXhpdF9pbnN0cnNbMl0gPSBTVE9QX0lOU1RSIHwgc3RvcHBlZF9jb2RlOworCQlicmVhazsKKwljYXNlIFNQVV9TVE9QUEVEX1NUQVRVU19TX1A6CisJCS8qIFNQVV9TdGF0dXNbUyxQXT0xLiAgQWRkIG5vcCBpbnN0cnVjdGlvbgorCQkgKiBmb2xsb3dlZCBieSAnYnIgLTQnIGFmdGVyIGVuZCBvZiByZXN0b3JlCisJCSAqIGNvZGUuCisJCSAqLworCQlleGl0X2luc3Ryc1swXSA9IFJFU1RPUkVfQ09NUExFVEU7CisJCWV4aXRfaW5zdHJzWzFdID0gU1RPUF9JTlNUUiB8IHN0b3BwZWRfY29kZTsKKwkJZXhpdF9pbnN0cnNbMl0gPSBOT1BfSU5TVFI7CisJCWV4aXRfaW5zdHJzWzNdID0gQlJfSU5TVFI7CisJCWJyZWFrOworCWNhc2UgU1BVX1NUT1BQRURfU1RBVFVTX1NfSToKKwkJLyogU1BVX1N0YXR1c1tTLEldPTEuICBBZGQgIGlsbGVnYWwgaW5zdHJ1Y3Rpb24KKwkJICogZm9sbG93ZWQgYnkgJ2JyIC00JyBhZnRlciBlbmQgb2YgcmVzdG9yZSBjb2RlLgorCQkgKi8KKwkJZXhpdF9pbnN0cnNbMF0gPSBSRVNUT1JFX0NPTVBMRVRFOworCQlleGl0X2luc3Ryc1sxXSA9IElMTEVHQUxfSU5TVFI7CisJCWV4aXRfaW5zdHJzWzJdID0gTk9QX0lOU1RSOworCQlleGl0X2luc3Ryc1szXSA9IEJSX0lOU1RSOworCQlicmVhazsKKwljYXNlIFNQVV9TVE9QUEVEX1NUQVRVU19JOgorCQkvKiBTUFVfU3RhdHVzW0ldPTEuIEFkZCBpbGxlZ2FsIGluc3RydWN0aW9uIGZvbGxvd2VkCisJCSAqIGJ5IGluZmluaXRlIGxvb3AgYWZ0ZXIgZW5kIG9mIHJlc3RvcmUgc2VxdWVuY2UuCisJCSAqLworCQlleGl0X2luc3Ryc1swXSA9IFJFU1RPUkVfQ09NUExFVEU7CisJCWV4aXRfaW5zdHJzWzFdID0gSUxMRUdBTF9JTlNUUjsKKwkJZXhpdF9pbnN0cnNbMl0gPSBOT1BfSU5TVFI7CisJCWV4aXRfaW5zdHJzWzNdID0gQlJfSU5TVFI7CisJCWJyZWFrOworCWNhc2UgU1BVX1NUT1BQRURfU1RBVFVTX1M6CisJCS8qIFNQVV9TdGF0dXNbU109MS4gQWRkIHR3byAnbm9wJyBpbnN0cnVjdGlvbnMuICovCisJCWV4aXRfaW5zdHJzWzBdID0gUkVTVE9SRV9DT01QTEVURTsKKwkJZXhpdF9pbnN0cnNbMV0gPSBOT1BfSU5TVFI7CisJCWV4aXRfaW5zdHJzWzJdID0gTk9QX0lOU1RSOworCQlleGl0X2luc3Ryc1szXSA9IEJSX0lOU1RSOworCQlicmVhazsKKwljYXNlIFNQVV9TVE9QUEVEX1NUQVRVU19IOgorCQkvKiBTUFVfU3RhdHVzW0hdPTEuIEFkZCAnaGVxICQwLCAkMCcgaW5zdHJ1Y3Rpb24KKwkJICogYWZ0ZXIgZW5kIG9mIHJlc3RvcmUgY29kZS4KKwkJICovCisJCWV4aXRfaW5zdHJzWzBdID0gUkVTVE9SRV9DT01QTEVURTsKKwkJZXhpdF9pbnN0cnNbMV0gPSBIRVFfSU5TVFI7CisJCWV4aXRfaW5zdHJzWzJdID0gTk9QX0lOU1RSOworCQlleGl0X2luc3Ryc1szXSA9IEJSX0lOU1RSOworCQlicmVhazsKKwljYXNlIFNQVV9TVE9QUEVEX1NUQVRVU19QOgorCQkvKiBTUFVfU3RhdHVzW1BdPTEuIEFkZCBzdG9wLWFuZC1zaWduYWwgaW5zdHJ1Y3Rpb24KKwkJICogYWZ0ZXIgZW5kIG9mIHJlc3RvcmUgY29kZS4KKwkJICovCisJCWV4aXRfaW5zdHJzWzBdID0gUkVTVE9SRV9DT01QTEVURTsKKwkJZXhpdF9pbnN0cnNbMV0gPSBTVE9QX0lOU1RSIHwgc3RvcHBlZF9jb2RlOworCQlicmVhazsKKwljYXNlIFNQVV9TVE9QUEVEX1NUQVRVU19SOgorCQkvKiBTUFVfU3RhdHVzW0ksUyxILFAsUl09MC4gQWRkIGluZmluaXRlIGxvb3AuICovCisJCWV4aXRfaW5zdHJzWzBdID0gUkVTVE9SRV9DT01QTEVURTsKKwkJZXhpdF9pbnN0cnNbMV0gPSBOT1BfSU5TVFI7CisJCWV4aXRfaW5zdHJzWzJdID0gTk9QX0lOU1RSOworCQlleGl0X2luc3Ryc1szXSA9IEJSX0lOU1RSOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBTUFVfU3RhdHVzW1JdPTEuIE5vIGFkZGl0b25hbCBpbnN0cnVjdGlvbnMuICovCisJCWJyZWFrOworCX0KKwlzcHVfc3luYygpOworfQorCisvKioKKyAqIG1haW4gLSBlbnRyeSBwb2ludCBmb3IgU1BVLXNpZGUgY29udGV4dCByZXN0b3JlLgorICoKKyAqIFRoaXMgY29kZSBkZXZpYXRlcyBmcm9tIHRoZSBkb2N1bWVudGVkIHNlcXVlbmNlIGluIHRoZQorICogZm9sbG93aW5nIGFzcGVjdHM6CisgKgorICogCTEuIFRoZSBFQSBmb3IgTFNDU0EgaXMgcGFzc2VkIGZyb20gUFBFIGluIHRoZQorICoJICAgc2lnbmFsIG5vdGlmaWNhdGlvbiBjaGFubmVscy4KKyAqCTIuIFRoZSByZWdpc3RlciBzcGlsbCBhcmVhIGlzIHB1bGxlZCBieSBTUFUKKyAqCSAgIGludG8gTFMsIHJhdGhlciB0aGFuIHB1c2hlZCBieSBQUEUuCisgKgkzLiBBbGwgMTI4IHJlZ2lzdGVycyBhcmUgcmVzdG9yZWQgYnkgZXhpdCgpLgorICoJNC4gVGhlIGV4aXQoKSBmdW5jdGlvbiBpcyBtb2RpZmllZCBhdCBydW4KKyAqCSAgIHRpbWUgaW4gb3JkZXIgdG8gcHJvcGVybHkgcmVzdG9yZSB0aGUKKyAqCSAgIFNQVV9TdGF0dXMgcmVnaXN0ZXIuCisgKi8KK2ludCBtYWluKCkKK3sKKwlhZGRyNjQgbHNjc2FfZWE7CisKKwlsc2NzYV9lYS51aVswXSA9IHNwdV9yZWFkY2goU1BVX1JkU2lnTm90aWZ5MSk7CisJbHNjc2FfZWEudWlbMV0gPSBzcHVfcmVhZGNoKFNQVV9SZFNpZ05vdGlmeTIpOworCWZldGNoX3JlZ3NfZnJvbV9tZW0obHNjc2FfZWEpOworCisJc2V0X2V2ZW50X21hc2soKTsJCS8qIFN0ZXAgMS4gICovCisJc2V0X3RhZ19tYXNrKCk7CQkJLyogU3RlcCAyLiAgKi8KKwlidWlsZF9kbWFfbGlzdChsc2NzYV9lYSk7CS8qIFN0ZXAgMy4gICovCisJcmVzdG9yZV91cHBlcl8yNDBrYihsc2NzYV9lYSk7CS8qIFN0ZXAgNC4gICovCisJCQkJCS8qIFN0ZXAgNTogZG9uZSBieSAnZXhpdCcuICovCisJcmVzdG9yZV9kZWNyKCk7CQkJLyogU3RlcCA2LiAqLworCWVucXVldWVfcHV0bGxjKGxzY3NhX2VhKTsJLyogU3RlcCA3LiAqLworCXNldF90YWdfdXBkYXRlKCk7CQkvKiBTdGVwIDguICovCisJcmVhZF90YWdfc3RhdHVzKCk7CQkvKiBTdGVwIDkuICovCisJcmVhZF9sbGFyX3N0YXR1cygpOwkJLyogU3RlcCAxMC4gKi8KKwl3cml0ZV9wcHVfbWIoKTsJCQkvKiBTdGVwIDExLiAqLworCXdyaXRlX3BwdWludF9tYigpOwkJLyogU3RlcCAxMi4gKi8KKwlyZXN0b3JlX2ZwY3IoKTsJCQkvKiBTdGVwIDEzLiAqLworCXJlc3RvcmVfc3JyMCgpOwkJCS8qIFN0ZXAgMTQuICovCisJcmVzdG9yZV9ldmVudF9tYXNrKCk7CQkvKiBTdGVwIDE1LiAqLworCXJlc3RvcmVfdGFnX21hc2soKTsJCS8qIFN0ZXAgMTYuICovCisJCQkJCS8qIFN0ZXAgMTcuIGRvbmUgYnkgJ2V4aXQnLiAqLworCXJlc3RvcmVfY29tcGxldGUoKTsJCS8qIFN0ZXAgMTguICovCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVfcmVzdG9yZV9jcnQwLlMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1X3Jlc3RvcmVfY3J0MC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MDU5NDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1X3Jlc3RvcmVfY3J0MC5TCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogY3J0MF9yLlM6IEVudHJ5IGZ1bmN0aW9uIGZvciBTUFUtc2lkZSBjb250ZXh0IHJlc3RvcmUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IElCTQorICoKKyAqIEVudHJ5IGFuZCBleGl0IGZ1bmN0aW9uIGZvciBTUFUtc2lkZSBvZiB0aGUgY29udGV4dCByZXN0b3JlCisgKiBzZXF1ZW5jZS4gIFNldHMgdXAgYW4gaW5pdGlhbCBzdGFjayBmcmFtZSwgdGhlbiBicmFuY2hlcyB0bworICogJ21haW4nLiAgT24gcmV0dXJuLCByZXN0b3JlcyBhbGwgMTI4IHJlZ2lzdGVycyBmcm9tIHRoZSBMU0NTQQorICogYW5kIGV4aXRzLgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxhc20vc3B1X2NzYS5oPgorCisuZGF0YQorLmFsaWduIDcKKy5nbG9ibCByZWdzX3NwaWxsCityZWdzX3NwaWxsOgorLnNwYWNlIFNJWkVPRl9TUFVfU1BJTExfUkVHUywgMHgwCisKKy50ZXh0CisuZ2xvYmFsIF9zdGFydAorX3N0YXJ0OgorCS8qIEluaXRpYWxpemUgdGhlIHN0YWNrIHBvaW50ZXIgdG8gcG9pbnQgdG8gMTYzNjgKKwkgKiAoMTZrYi0xNikuIFRoZSBiYWNrIGNoYWluIHBvaW50ZXIgaXMgaW5pdGlhbGl6ZWQKKwkgKiB0byBOVUxMLgorCSAqLworCWlsICAgICAgJDAsIDAKKwlpbCAgICAgICRTUCwgMTYzNjgKKwlzdHFkICAgICQwLCAwKCRTUCkKKworCS8qIEFsbG9jYXRlIGEgbWluaW11bSBzdGFjayBmcmFtZSBmb3IgdGhlIGNhbGxlZCBtYWluLgorCSAqIFRoaXMgaXMgbmVlZGVkIHNvIHRoYXQgbWFpbiBoYXMgYSBwbGFjZSB0byBzYXZlIHRoZQorCSAqIGxpbmsgcmVnaXN0ZXIgd2hlbiBpdCBjYWxscyBhbm90aGVyIGZ1bmN0aW9uLgorCSAqLworCXN0cWQgICAgJFNQLCAtMTYwKCRTUCkKKwlhaSAgICAgICRTUCwgJFNQLCAtMTYwCisKKwkvKiBDYWxsIHRoZSBwcm9ncmFtJ3MgbWFpbiBmdW5jdGlvbi4gKi8KKwlicnNsICAgICQwLCBtYWluCisKKy5nbG9iYWwgZXhpdAorLmdsb2JhbAlfZXhpdAorZXhpdDoKK19leGl0OgorCS8qIFNQVSBDb250ZXh0IFJlc3RvcmUsIFN0ZXAgNTogUmVzdG9yZSB0aGUgcmVtYWluaW5nIDExMiBHUFJzLiAqLworCWlsYSAgICAgJDMsIHJlZ3Nfc3BpbGwgKyAyNTYKK3Jlc3RvcmVfcmVnczoKKwlscXIgICAgICQ0LCByZXN0b3JlX3JlZ19pbnN0cworcmVzdG9yZV9yZWdfbG9vcDoKKwlhaSAgICAgICQ0LCAkNCwgNAorCS5iYWxpZ25sIDE2LCAweDQwMjAwMDAwCityZXN0b3JlX3JlZ19pbnN0czogICAgICAgLyogbXVzdCBiZSBxdWFkLXdvcmQgYWxpZ25lZC4gKi8KKwlscWQgICAgICQxNiwgMCgkMykKKwlscWQgICAgICQxNywgMTYoJDMpCisJbHFkICAgICAkMTgsIDMyKCQzKQorCWxxZCAgICAgJDE5LCA0OCgkMykKKwlhbmRpICAgICQ1LCAkNCwgMHg3RgorCXN0cXIgICAgJDQsIHJlc3RvcmVfcmVnX2luc3RzCisJYWkgICAgICAkMywgJDMsIDY0CisJYnJueiAgICAkNSwgcmVzdG9yZV9yZWdfbG9vcAorCisJLyogU1BVIENvbnRleHQgUmVzdG9yZSBTdGVwIDE3OiBSZXN0b3JlIHRoZSBmaXJzdCAxNiBHUFJzLiAqLworCWxxYSAkMCwgcmVnc19zcGlsbCArIDAKKwlscWEgJDEsIHJlZ3Nfc3BpbGwgKyAxNgorCWxxYSAkMiwgcmVnc19zcGlsbCArIDMyCisJbHFhICQzLCByZWdzX3NwaWxsICsgNDgKKwlscWEgJDQsIHJlZ3Nfc3BpbGwgKyA2NAorCWxxYSAkNSwgcmVnc19zcGlsbCArIDgwCisJbHFhICQ2LCByZWdzX3NwaWxsICsgOTYKKwlscWEgJDcsIHJlZ3Nfc3BpbGwgKyAxMTIKKwlscWEgJDgsIHJlZ3Nfc3BpbGwgKyAxMjgKKwlscWEgJDksIHJlZ3Nfc3BpbGwgKyAxNDQKKwlscWEgJDEwLCByZWdzX3NwaWxsICsgMTYwCisJbHFhICQxMSwgcmVnc19zcGlsbCArIDE3NgorCWxxYSAkMTIsIHJlZ3Nfc3BpbGwgKyAxOTIKKwlscWEgJDEzLCByZWdzX3NwaWxsICsgMjA4CisJbHFhICQxNCwgcmVnc19zcGlsbCArIDIyNAorCWxxYSAkMTUsIHJlZ3Nfc3BpbGwgKyAyNDAKKworCS8qIFVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLCB0aGUgJ2V4aXQnIGZ1bmN0aW9uCisJICogdGVybWluYXRlcyB3aXRoICdzdG9wIFNQVV9SRVNUT1JFX0NPTVBMRVRFJywKKwkgKiBpbmRpY2F0aW5nIHRoYXQgdGhlIFNQVS1zaWRlIHJlc3RvcmUgY29kZSBoYXMKKwkgKiBjb21wbGV0ZWQuCisJICoKKwkgKiBIb3dldmVyIGl0IGlzIHBvc3NpYmxlIHRoYXQgaW5zdHJ1Y3Rpb25zIGltbWVkaWF0ZWx5CisJICogZm9sbG93aW5nIHRoZSAnc3RvcCAweDNmZmMnIGhhdmUgYmVlbiBtb2RpZmllZCBhdCBydW4KKwkgKiB0aW1lIHNvIGFzIHRvIHJlY3JlYXRlIHRoZSBleGFjdCBTUFVfU3RhdHVzIHNldHRpbmdzCisJICogZnJvbSB0aGUgYXBwbGljYXRpb24sIGUuZy4gaWxsZWdhbCBpbnN0cnVjaXRvbiwgaGFsdCwKKwkgKiBldGMuCisJICovCisuZ2xvYmFsIGV4aXRfZmluaQorLmdsb2JhbAlfZXhpdF9maW5pCitleGl0X2Zpbmk6CitfZXhpdF9maW5pOgorCXN0b3AJU1BVX1JFU1RPUkVfQ09NUExFVEUKKwlzdG9wCTAKKwlzdG9wCTAKKwlzdG9wCTAKKworCS8qIFBhZCB0aGUgc2l6ZSBvZiB0aGlzIGNydDAubyB0byBiZSBtdWx0aXBsZSBvZiAxNiBieXRlcy4gKi8KKy5iYWxpZ25sIDE2LCAweDAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVfcmVzdG9yZV9kdW1wLmhfc2hpcHBlZCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVfcmVzdG9yZV9kdW1wLmhfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjIzNTVmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9yZXN0b3JlX2R1bXAuaF9zaGlwcGVkCkBAIC0wLDAgKzEsMjMxIEBACisvKgorICogc3B1X3Jlc3RvcmVfZHVtcC5oOiBDb3B5cmlnaHQgKEMpIDIwMDUgSUJNLgorICogSGV4LWR1bXAgYXV0byBnZW5lcmF0ZWQgZnJvbSBzcHVfcmVzdG9yZS5jLgorICogRG8gbm90IGVkaXQhCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3B1X3Jlc3RvcmVfY29kZVtdIF9fcGFnZV9hbGlnbmVkID0geworMHg0MDgwMDAwMCwgMHg0MDlmZjgwMSwgMHgyNDAwMDA4MCwgMHgyNGZkODA4MSwKKzB4MWNkODAwODEsIDB4MzMwMDExODAsIDB4NDIwMzAwMDMsIDB4MzM4MDAyODQsCisweDFjMDEwMjA0LCAweDQwMjAwMDAwLCAweDQwMjAwMDAwLCAweDQwMjAwMDAwLAorMHgzNDAwMDE5MCwgMHgzNDAwNDE5MSwgMHgzNDAwODE5MiwgMHgzNDAwYzE5MywKKzB4MTQxZmMyMDUsIDB4MjNmZmZkODQsIDB4MWMxMDAxODMsIDB4MjE3ZmZhODUsCisweDMwODBhMDAwLCAweDMwODBhMjAxLCAweDMwODBhNDAyLCAweDMwODBhNjAzLAorMHgzMDgwYTgwNCwgMHgzMDgwYWEwNSwgMHgzMDgwYWMwNiwgMHgzMDgwYWUwNywKKzB4MzA4MGIwMDgsIDB4MzA4MGIyMDksIDB4MzA4MGI0MGEsIDB4MzA4MGI2MGIsCisweDMwODBiODBjLCAweDMwODBiYTBkLCAweDMwODBiYzBlLCAweDMwODBiZTBmLAorMHgwMDAwM2ZmYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDFhMDAxODIsIDB4M2VjMDAwODMsIDB4YjBhMTQxMDMsIDB4MDFhMDAyMDQsCisweDNlYzEwMDgyLCAweDQyMDI4MDBlLCAweDA0MDAwNzAzLCAweGIwYTE0MjAyLAorMHgyMWEwMDgwMywgMHgzZmJmMDI4ZCwgMHgzZjIwMDY4ZCwgMHgzZmJlMDY4MiwKKzB4M2ZlMzAxMDIsIDB4MjFhMDA4ODIsIDB4M2Y4MjAyOGYsIDB4M2ZlMzA3OGYsCisweDNmYmYwNzg0LCAweDNmMjAwMjA0LCAweDNmYmUwMjA0LCAweDNmZTMwMjA0LAorMHgwNDAwMDIwMywgMHgyMWEwMDkwMywgMHg0MDg0ODAwMiwgMHgyMWEwMDk4MiwKKzB4NDA4MDAwMDMsIDB4MjFhMDBhMDMsIDB4NDA4MDIwMDIsIDB4MjFhMDBhODIsCisweDIxYTAwMDgzLCAweDQwODAwMDgyLCAweDIxYTAwYjAyLCAweDEwMDAyODE4LAorMHg0MGE4MDAwMiwgMHgzMjgwMDAwNywgMHg0MjA3MDAwYywgMHgxODAwODIwOCwKKzB4NDBhMDAwMGIsIDB4NDA4MDAyMGEsIDB4NDA4MDA3MDksIDB4MDAyMDAwMDAsCisweDQyMDcwMDAyLCAweDNhYzMwMzg0LCAweDFjZmZjNDg5LCAweDAwMjAwMDAwLAorMHgxODAwODM4MywgMHgzODgzMDM4MiwgMHg0Y2ZmYzQ4NiwgMHgzYWMyODE4NSwKKzB4YjA0MDg1ODQsIDB4Mjg4MzAzODIsIDB4MWMwMjAzODcsIDB4Mzg4MjgxODIsCisweGIwNDA4NDA1LCAweDE4MDJjNDA4LCAweDI4ODI4MTgyLCAweDIxN2ZmODg2LAorMHgwNDAwMDU4MywgMHgyMWEwMDgwMywgMHgzZmJlMDY4MiwgMHgzZmUzMDEwMiwKKzB4MDQwMDAxMDYsIDB4MjFhMDA4ODYsIDB4MDQwMDA2MDMsIDB4MjFhMDA5MDMsCisweDQwODAzYzAyLCAweDIxYTAwOTgyLCAweDQwODAwMDAzLCAweDA0MDAwMTg0LAorMHgyMWEwMGEwNCwgMHg0MDgwMjIwMiwgMHgyMWEwMGE4MiwgMHg0MjAyODAwNSwKKzB4MzQyMDg3MDIsIDB4MjEwMDIyODIsIDB4MjFhMDA4MDQsIDB4MjFhMDA4ODYsCisweDNmYmYwNzgyLCAweDNmMjAwMTAyLCAweDNmYmUwMTAyLCAweDNmZTMwMTAyLAorMHgyMWEwMDkwMiwgMHg0MDgwNDAwMywgMHgyMWEwMDk4MywgMHgyMWEwMGEwNCwKKzB4NDA4MDVhMDIsIDB4MjFhMDBhODIsIDB4NDA4MDAwODMsIDB4MjFhMDBiODMsCisweDAxYTAwYzAyLCAweDAxYTAwZDgzLCAweDM0MjBjMjgyLCAweDIxYTAwZTAyLAorMHgzNDIxMDI4MywgMHgyMWEwMGYwMywgMHgzNDIwMDI4NCwgMHg3NzQwMDIwMCwKKzB4MzQyMWMyODIsIDB4MjFhMDA3MDIsIDB4MzQyMTgyODMsIDB4MjFhMDAwODMsCisweDM0MjE0MjgyLCAweDIxYTAwYjAyLCAweDQyMDA0ODBjLCAweDAwMjAwMDAwLAorMHgxYzAxMDI4NiwgMHgzNDIyMDI4NCwgMHgzNDIyMDMwMiwgMHgwZjYwODIwMywKKzB4NWMwMjQyMDQsIDB4M2I4MTgxMGIsIDB4NDIwMTNjMDIsIDB4MDAyMDAwMDAsCisweDE4MDA4MTg1LCAweDM4ODA4MTgzLCAweDNiODE0MTgyLCAweDIxMDA0ZTg0LAorMHg0MDIwMDA3ZiwgMHgzNTAwMDEwMCwgMHgwMDAwMDRlMCwgMHgwMDAwMDJhMCwKKzB4MDAwMDAyZTgsIDB4MDAwMDA0MjgsIDB4MDAwMDAzNjAsIDB4MDAwMDAyZTgsCisweDAwMDAwNGEwLCAweDAwMDAwNDY4LCAweDAwMDAwM2M4LCAweDAwMDAwMzYwLAorMHg0MDlmZmUwMiwgMHgzMDgwMTIwMywgMHg0MDgwMDIwNCwgMHgzZWM0MDA4NSwKKzB4MTAwMDljMDksIDB4M2FjMTA2MDYsIDB4YjA2MGMxMDUsIDB4NDAyMDAwN2YsCisweDQwMjAwMDdmLCAweDIwODAxMjAzLCAweDM4ODEwNjAyLCAweGIwNDA4NTg2LAorMHgyODgxMDYwMiwgMHgzMjAwNDE4MCwgMHgzNDIwNDcwMiwgMHgyMWEwMDM4MiwKKzB4NDAyMDAwN2YsIDB4MzI3ZmRjODAsIDB4NDA5ZmZlMDIsIDB4MzA4MDEyMDMsCisweDQwODAwMjA0LCAweDNlYzQwMDg3LCAweDQwODAwNDA1LCAweDAwMjAwMDAwLAorMHg0MDgwMDYwNiwgMHgzYWMxMDYwOCwgMHgzYWMxNDYwOSwgMHgzYWMxODYwYSwKKzB4YjA2MGMxMDcsIDB4MjA4MDEyMDMsIDB4NDEwMDQwMDMsIDB4Mzg4MTA2MDIsCisweDQwMjAwMDdmLCAweGIwNDA4MTg4LCAweDQwMjAwMDdmLCAweDI4ODEwNjAyLAorMHg0MTIwMTAwMiwgMHgzODgxNDYwMywgMHgxMDAwOWMwOSwgMHhiMDYwYzEwOSwKKzB4NDAyMDAwN2YsIDB4Mjg4MTQ2MDMsIDB4NDExOTNmODMsIDB4Mzg4MTg2MDIsCisweDYwZmZjMDAzLCAweGIwNDA4MThhLCAweDI4ODE4NjAyLCAweDMyMDAzMDgwLAorMHg0MDlmZmUwMiwgMHgzMDgwMTIwMywgMHg0MDgwMDIwNCwgMHgzZWM0MDA4NywKKzB4NDEyMDEwMDgsIDB4MTAwMDljMTQsIDB4NDA4MDA0MDUsIDB4M2FjMTA2MDksCisweDQwODAwNjA2LCAweDNhYzE0NjBhLCAweGIwNjBjMTA3LCAweDNhYzE4NjBiLAorMHgyMDgwMTIwMywgMHgzODgxMDYwMiwgMHhiMDQwODQwOSwgMHgyODgxMDYwMiwKKzB4Mzg4MTQ2MDMsIDB4YjA2MGM0MGEsIDB4NDAyMDAwN2YsIDB4Mjg4MTQ2MDMsCisweDQxMTkzZjgzLCAweDM4ODE4NjAyLCAweDYwZmZjMDAzLCAweGIwNDA4MThiLAorMHgyODgxODYwMiwgMHgzMjAwMjM4MCwgMHg0MDlmZmUwMiwgMHgzMDgwMTIwNCwKKzB4NDA4MDAyMDUsIDB4M2VjNDAwODMsIDB4NDA4MDA0MDYsIDB4M2FjMTQ2MDcsCisweDNhYzE4NjA4LCAweGIwODEwMTAzLCAweDQxMDA0MDAyLCAweDIwODAxMjA0LAorMHg0MDIwMDA3ZiwgMHgzODgxNDYwMywgMHgxMDAwOWMwYiwgMHhiMDYwYzEwNywKKzB4NDAyMDAwN2YsIDB4NDAyMDAwN2YsIDB4Mjg4MTQ2MDMsIDB4Mzg4MTg2MDIsCisweDQwMjAwMDdmLCAweDQwMjAwMDdmLCAweGIwNDA4NTg4LCAweDI4ODE4NjAyLAorMHg0MDIwMDA3ZiwgMHgzMjAwMTc4MCwgMHg0MDlmZmUwMiwgMHgxMDAwNjQwZSwKKzB4NDA4MDAyMDQsIDB4MzA4MDEyMDMsIDB4NDA4MDA0MDUsIDB4M2VjNDAwODcsCisweDQwODAwNjA2LCAweDNhYzEwNjA4LCAweDNhYzE0NjA5LCAweDNhYzE4NjBhLAorMHhiMDYwYzEwNywgMHgyMDgwMTIwMywgMHg0MTNkODAwMywgMHgzODgxMDYwMiwKKzB4NDAyMDAwN2YsIDB4MzI3ZmQ3ODAsIDB4NDA5ZmZlMDIsIDB4MTAwMDdmMGMsCisweDQwODAwMjA1LCAweDMwODAxMjA0LCAweDQwODAwNDA2LCAweDNlYzQwMDgzLAorMHgzYWMxNDYwNywgMHgzYWMxODYwOCwgMHhiMDgxMDEwMywgMHg0MTNkODAwMiwKKzB4MjA4MDEyMDQsIDB4Mzg4MTQ2MDMsIDB4NDAyMDAwN2YsIDB4MzI3ZmViODAsCisweDQwOWZmZTAyLCAweDMwODAxMjAzLCAweDQwODAwMjA0LCAweDNlYzQwMDg3LAorMHg0MDgwMDQwNSwgMHgxMDAwNjUwYSwgMHg0MDgwMDYwNiwgMHgzYWMxMDYwOCwKKzB4M2FjMTQ2MDksIDB4M2FjMTg2MGEsIDB4YjA2MGMxMDcsIDB4MjA4MDEyMDMsCisweDM4ODEwNjAyLCAweGIwNDA4NTg4LCAweDQwMjAwMDdmLCAweDMyN2ZjOTgwLAorMHgwMDQwMDAwMCwgMHg0MDgwMDAwMywgMHg0MDIwMDA3ZiwgMHgzNTAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9zYXZlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1X3NhdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTYwMzNiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9zYXZlLmMKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBzcHVfc2F2ZS5jCisgKgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNQorICoKKyAqIFNQVS1zaWRlIGNvbnRleHQgc2F2ZSBzZXF1ZW5jZSBvdXRsaW5lZCBpbgorICogU3luZXJnaXN0aWMgUHJvY2Vzc29yIEVsZW1lbnQgQm9vayBJVgorICoKKyAqIEF1dGhvcjogTWFyayBOdXR0ZXIgPG1udXR0ZXJAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisKKyNpZm5kZWYgTFNfU0laRQorI2RlZmluZSBMU19TSVpFICAgICAgICAgICAgICAgICAweDQwMDAwCS8qIDI1NksgKGluIGJ5dGVzKSAqLworI2VuZGlmCisKK3R5cGVkZWYgdW5zaWduZWQgaW50IHUzMjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHU2NDsKKworI2luY2x1ZGUgPHNwdV9pbnRyaW5zaWNzLmg+CisjaW5jbHVkZSA8YXNtL3NwdV9jc2EuaD4KKyNpbmNsdWRlICJzcHVfdXRpbHMuaCIKKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfZXZlbnRfbWFzayh2b2lkKQoreworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisKKwkvKiBTYXZlLCBTdGVwIDI6CisJICogICAgUmVhZCB0aGUgU1BVX1JkRXZlbnRNc2sgY2hhbm5lbCBhbmQgc2F2ZSB0byB0aGUgTFNDU0EuCisJICovCisJb2Zmc2V0ID0gTFNDU0FfUVdfT0ZGU0VUKGV2ZW50X21hc2spOworCXJlZ3Nfc3BpbGxbb2Zmc2V0XS5zbG90WzBdID0gc3B1X3JlYWRjaChTUFVfUmRFdmVudFN0YXRNYXNrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfdGFnX21hc2sodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCisJLyogU2F2ZSwgU3RlcCAzOgorCSAqICAgIFJlYWQgdGhlIFNQVV9SZFRhZ01zayBjaGFubmVsIGFuZCBzYXZlIHRvIHRoZSBMU0NTQS4KKwkgKi8KKwlvZmZzZXQgPSBMU0NTQV9RV19PRkZTRVQodGFnX21hc2spOworCXJlZ3Nfc3BpbGxbb2Zmc2V0XS5zbG90WzBdID0gc3B1X3JlYWRjaChNRkNfUmRUYWdNYXNrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfdXBwZXJfMjQwa2IoYWRkcjY0IGxzY3NhX2VhKQoreworCXVuc2lnbmVkIGludCBscyA9IDE2Mzg0OworCXVuc2lnbmVkIGludCBsaXN0ID0gKHVuc2lnbmVkIGludCkmZG1hX2xpc3RbMF07CisJdW5zaWduZWQgaW50IHNpemUgPSBzaXplb2YoZG1hX2xpc3QpOworCXVuc2lnbmVkIGludCB0YWdfaWQgPSAwOworCXVuc2lnbmVkIGludCBjbWQgPSAweDI0OwkvKiBQVVRMICovCisKKwkvKiBTYXZlLCBTdGVwIDc6CisJICogICAgRW5xdWV1ZSB0aGUgUFVUTCBjb21tYW5kICh0YWcgMCkgdG8gdGhlIE1GQyBTUFUgY29tbWFuZAorCSAqICAgIHF1ZXVlIHRvIHRyYW5zZmVyIHRoZSByZW1haW5pbmcgMjQwIGtiIG9mIExTIHRvIENTQS4KKwkgKi8KKwlzcHVfd3JpdGVjaChNRkNfTFNBLCBscyk7CisJc3B1X3dyaXRlY2goTUZDX0VBSCwgbHNjc2FfZWEudWlbMF0pOworCXNwdV93cml0ZWNoKE1GQ19FQUwsIGxpc3QpOworCXNwdV93cml0ZWNoKE1GQ19TaXplLCBzaXplKTsKKwlzcHVfd3JpdGVjaChNRkNfVGFnSUQsIHRhZ19pZCk7CisJc3B1X3dyaXRlY2goTUZDX0NtZCwgY21kKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfZnBjcih2b2lkKQoreworCS8vIHZlY3RvciB1bnNpZ25lZCBpbnQgZnBjcjsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCisJLyogU2F2ZSwgU3RlcCA5OgorCSAqICAgIElzc3VlIHRoZSBmbG9hdGluZy1wb2ludCBzdGF0dXMgYW5kIGNvbnRyb2wgcmVnaXN0ZXIKKwkgKiAgICByZWFkIGluc3RydWN0aW9uLCBhbmQgc2F2ZSB0byB0aGUgTFNDU0EuCisJICovCisJb2Zmc2V0ID0gTFNDU0FfUVdfT0ZGU0VUKGZwY3IpOworCXJlZ3Nfc3BpbGxbb2Zmc2V0XS52ID0gc3B1X21mZnBzY3IoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfZGVjcih2b2lkKQoreworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisKKwkvKiBTYXZlLCBTdGVwIDEwOgorCSAqICAgIFJlYWQgYW5kIHNhdmUgdGhlIFNQVV9SZERlYyBjaGFubmVsIGRhdGEgdG8KKwkgKiAgICB0aGUgTFNDU0EuCisJICovCisJb2Zmc2V0ID0gTFNDU0FfUVdfT0ZGU0VUKGRlY3IpOworCXJlZ3Nfc3BpbGxbb2Zmc2V0XS5zbG90WzBdID0gc3B1X3JlYWRjaChTUFVfUmREZWMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9zcnIwKHZvaWQpCit7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKworCS8qIFNhdmUsIFN0ZXAgMTE6CisJICogICAgUmVhZCBhbmQgc2F2ZSB0aGUgU1BVX1dTUlIwIGNoYW5uZWwgZGF0YSB0bworCSAqICAgIHRoZSBMU0NTQS4KKwkgKi8KKwlvZmZzZXQgPSBMU0NTQV9RV19PRkZTRVQoc3JyMCk7CisJcmVnc19zcGlsbFtvZmZzZXRdLnNsb3RbMF0gPSBzcHVfcmVhZGNoKFNQVV9SZFNSUjApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3BpbGxfcmVnc190b19tZW0oYWRkcjY0IGxzY3NhX2VhKQoreworCXVuc2lnbmVkIGludCBscyA9ICh1bnNpZ25lZCBpbnQpJnJlZ3Nfc3BpbGxbMF07CisJdW5zaWduZWQgaW50IHNpemUgPSBzaXplb2YocmVnc19zcGlsbCk7CisJdW5zaWduZWQgaW50IHRhZ19pZCA9IDA7CisJdW5zaWduZWQgaW50IGNtZCA9IDB4MjA7CS8qIFBVVCAqLworCisJLyogU2F2ZSwgU3RlcCAxMzoKKwkgKiAgICBFbnF1ZXVlIGEgUFVUIGNvbW1hbmQgKHRhZyAwKSB0byBzZW5kIHRoZSBMU0NTQQorCSAqICAgIHRvIHRoZSBDU0EuCisJICovCisJc3B1X3dyaXRlY2goTUZDX0xTQSwgbHMpOworCXNwdV93cml0ZWNoKE1GQ19FQUgsIGxzY3NhX2VhLnVpWzBdKTsKKwlzcHVfd3JpdGVjaChNRkNfRUFMLCBsc2NzYV9lYS51aVsxXSk7CisJc3B1X3dyaXRlY2goTUZDX1NpemUsIHNpemUpOworCXNwdV93cml0ZWNoKE1GQ19UYWdJRCwgdGFnX2lkKTsKKwlzcHVfd3JpdGVjaChNRkNfQ21kLCBjbWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5xdWV1ZV9zeW5jKGFkZHI2NCBsc2NzYV9lYSkKK3sKKwl1bnNpZ25lZCBpbnQgdGFnX2lkID0gMDsKKwl1bnNpZ25lZCBpbnQgY21kID0gMHhDQzsKKworCS8qIFNhdmUsIFN0ZXAgMTQ6CisJICogICAgRW5xdWV1ZSBhbiBNRkNfU1lOQyBjb21tYW5kICh0YWcgMCkuCisJICovCisJc3B1X3dyaXRlY2goTUZDX1RhZ0lELCB0YWdfaWQpOworCXNwdV93cml0ZWNoKE1GQ19DbWQsIGNtZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYXZlX2NvbXBsZXRlKHZvaWQpCit7CisJLyogU2F2ZSwgU3RlcCAxODoKKwkgKiAgICBJc3N1ZSBhIHN0b3AtYW5kLXNpZ25hbCBpbnN0cnVjdGlvbiBpbmRpY2F0aW5nCisJICogICAgInNhdmUgY29tcGxldGUiLiAgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIG5vdAorCSAqICAgIHJldHVybiEhCisJICovCisJc3B1X3N0b3AoU1BVX1NBVkVfQ09NUExFVEUpOworfQorCisvKioKKyAqIG1haW4gLSBlbnRyeSBwb2ludCBmb3IgU1BVLXNpZGUgY29udGV4dCBzYXZlLgorICoKKyAqIFRoaXMgY29kZSBkZXZpYXRlcyBmcm9tIHRoZSBkb2N1bWVudGVkIHNlcXVlbmNlIGFzIGZvbGxvd3M6CisgKgorICogICAgICAxLiBUaGUgRUEgZm9yIExTQ1NBIGlzIHBhc3NlZCBmcm9tIFBQRSBpbiB0aGUKKyAqICAgICAgICAgc2lnbmFsIG5vdGlmaWNhdGlvbiBjaGFubmVscy4KKyAqICAgICAgMi4gQWxsIDEyOCByZWdpc3RlcnMgYXJlIHNhdmVkIGJ5IGNydDAuby4KKyAqLworaW50IG1haW4oKQoreworCWFkZHI2NCBsc2NzYV9lYTsKKworCWxzY3NhX2VhLnVpWzBdID0gc3B1X3JlYWRjaChTUFVfUmRTaWdOb3RpZnkxKTsKKwlsc2NzYV9lYS51aVsxXSA9IHNwdV9yZWFkY2goU1BVX1JkU2lnTm90aWZ5Mik7CisKKwkvKiBTdGVwIDE6IGRvbmUgYnkgZXhpdCgpLiAqLworCXNhdmVfZXZlbnRfbWFzaygpOwkvKiBTdGVwIDIuICAqLworCXNhdmVfdGFnX21hc2soKTsJLyogU3RlcCAzLiAgKi8KKwlzZXRfZXZlbnRfbWFzaygpOwkvKiBTdGVwIDQuICAqLworCXNldF90YWdfbWFzaygpOwkJLyogU3RlcCA1LiAgKi8KKwlidWlsZF9kbWFfbGlzdChsc2NzYV9lYSk7CS8qIFN0ZXAgNi4gICovCisJc2F2ZV91cHBlcl8yNDBrYihsc2NzYV9lYSk7CS8qIFN0ZXAgNy4gICovCisJLyogU3RlcCA4OiBkb25lIGJ5IGV4aXQoKS4gKi8KKwlzYXZlX2ZwY3IoKTsJCS8qIFN0ZXAgOS4gICovCisJc2F2ZV9kZWNyKCk7CQkvKiBTdGVwIDEwLiAqLworCXNhdmVfc3JyMCgpOwkJLyogU3RlcCAxMS4gKi8KKwllbnF1ZXVlX3B1dGxsYyhsc2NzYV9lYSk7CS8qIFN0ZXAgMTIuICovCisJc3BpbGxfcmVnc190b19tZW0obHNjc2FfZWEpOwkvKiBTdGVwIDEzLiAqLworCWVucXVldWVfc3luYyhsc2NzYV9lYSk7CS8qIFN0ZXAgMTQuICovCisJc2V0X3RhZ191cGRhdGUoKTsJLyogU3RlcCAxNS4gKi8KKwlyZWFkX3RhZ19zdGF0dXMoKTsJLyogU3RlcCAxNi4gKi8KKwlyZWFkX2xsYXJfc3RhdHVzKCk7CS8qIFN0ZXAgMTcuICovCisJc2F2ZV9jb21wbGV0ZSgpOwkvKiBTdGVwIDE4LiAqLworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1X3NhdmVfY3J0MC5TIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9zYXZlX2NydDAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjU5ZDZhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9zYXZlX2NydDAuUwpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIGNydDBfcy5TOiBFbnRyeSBmdW5jdGlvbiBmb3IgU1BVLXNpZGUgY29udGV4dCBzYXZlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBJQk0KKyAqCisgKiBFbnRyeSBmdW5jdGlvbiBmb3IgU1BVLXNpZGUgb2YgdGhlIGNvbnRleHQgc2F2ZSBzZXF1ZW5jZS4KKyAqIFNhdmVzIGFsbCAxMjggR1BScywgc2V0cyB1cCBhbiBpbml0aWFsIHN0YWNrIGZyYW1lLCB0aGVuCisgKiBicmFuY2hlcyB0byAnbWFpbicuCisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGFzbS9zcHVfY3NhLmg+CisKKy5kYXRhCisuYWxpZ24gNworLmdsb2JsIHJlZ3Nfc3BpbGwKK3JlZ3Nfc3BpbGw6Cisuc3BhY2UgU0laRU9GX1NQVV9TUElMTF9SRUdTLCAweDAKKworLnRleHQKKy5nbG9iYWwgX3N0YXJ0Citfc3RhcnQ6CisJLyogU1BVIENvbnRleHQgU2F2ZSBTdGVwIDE6IFNhdmUgdGhlIGZpcnN0IDE2IEdQUnMuICovCisJc3RxYSAkMCwgcmVnc19zcGlsbCArIDAKKwlzdHFhICQxLCByZWdzX3NwaWxsICsgMTYKKwlzdHFhICQyLCByZWdzX3NwaWxsICsgMzIKKwlzdHFhICQzLCByZWdzX3NwaWxsICsgNDgKKwlzdHFhICQ0LCByZWdzX3NwaWxsICsgNjQKKwlzdHFhICQ1LCByZWdzX3NwaWxsICsgODAKKwlzdHFhICQ2LCByZWdzX3NwaWxsICsgOTYKKwlzdHFhICQ3LCByZWdzX3NwaWxsICsgMTEyCisJc3RxYSAkOCwgcmVnc19zcGlsbCArIDEyOAorCXN0cWEgJDksIHJlZ3Nfc3BpbGwgKyAxNDQKKwlzdHFhICQxMCwgcmVnc19zcGlsbCArIDE2MAorCXN0cWEgJDExLCByZWdzX3NwaWxsICsgMTc2CisJc3RxYSAkMTIsIHJlZ3Nfc3BpbGwgKyAxOTIKKwlzdHFhICQxMywgcmVnc19zcGlsbCArIDIwOAorCXN0cWEgJDE0LCByZWdzX3NwaWxsICsgMjI0CisJc3RxYSAkMTUsIHJlZ3Nfc3BpbGwgKyAyNDAKKworCS8qIFNQVSBDb250ZXh0IFNhdmUsIFN0ZXAgODogU2F2ZSB0aGUgcmVtYWluaW5nIDExMiBHUFJzLiAqLworCWlsYSAgICAgJDMsIHJlZ3Nfc3BpbGwgKyAyNTYKK3NhdmVfcmVnczoKKwlscXIgICAgICQ0LCBzYXZlX3JlZ19pbnN0cworc2F2ZV9yZWdfbG9vcDoKKwlhaSAgICAgICQ0LCAkNCwgNAorCS5iYWxpZ25sIDE2LCAweDQwMjAwMDAwCitzYXZlX3JlZ19pbnN0czogICAgICAgLyogbXVzdCBiZSBxdWFkLXdvcmQgYWxpZ25lZC4gKi8KKwlzdHFkICAgICQxNiwgMCgkMykKKwlzdHFkICAgICQxNywgMTYoJDMpCisJc3RxZCAgICAkMTgsIDMyKCQzKQorCXN0cWQgICAgJDE5LCA0OCgkMykKKwlhbmRpICAgICQ1LCAkNCwgMHg3RgorCXN0cXIgICAgJDQsIHNhdmVfcmVnX2luc3RzCisJYWkgICAgICAkMywgJDMsIDY0CisJYnJueiAgICAkNSwgc2F2ZV9yZWdfbG9vcAorCisJLyogSW5pdGlhbGl6ZSB0aGUgc3RhY2sgcG9pbnRlciB0byBwb2ludCB0byAxNjM2OAorCSAqICgxNmtiLTE2KS4gVGhlIGJhY2sgY2hhaW4gcG9pbnRlciBpcyBpbml0aWFsaXplZAorCSAqIHRvIE5VTEwuCisJICovCisJaWwJJDAsIDAKKwlpbAkkU1AsIDE2MzY4CisJc3RxZAkkMCwgMCgkU1ApCisKKwkvKiBBbGxvY2F0ZSBhIG1pbmltdW0gc3RhY2sgZnJhbWUgZm9yIHRoZSBjYWxsZWQgbWFpbi4KKwkgKiBUaGlzIGlzIG5lZWRlZCBzbyB0aGF0IG1haW4gaGFzIGEgcGxhY2UgdG8gc2F2ZSB0aGUKKwkgKiBsaW5rIHJlZ2lzdGVyIHdoZW4gaXQgY2FsbHMgYW5vdGhlciBmdW5jdGlvbi4KKwkgKi8KKwlzdHFkCSRTUCwgLTE2MCgkU1ApCisJYWkJJFNQLCAkU1AsIC0xNjAKKworCS8qIENhbGwgdGhlIHByb2dyYW0ncyBtYWluIGZ1bmN0aW9uLiAqLworCWJyc2wJJDAsIG1haW4KKworCS8qIEluIHRoaXMgY2FzZSBtYWluIHNob3VsZCBub3QgcmV0dXJuOyBpZiBpdCBkb2VzCisJICogdGhlcmUgaGFzIGJlZW4gYW4gZXJyb3IgaW4gdGhlIHNlcXVlbmNlLiAgRXhlY3V0ZQorCSAqIHN0b3AtYW5kLXNpZ25hbCB3aXRoIGNvZGU9MC4KKwkgKi8KKy5nbG9iYWwgZXhpdAorLmdsb2JhbAlfZXhpdAorZXhpdDoKK19leGl0OgorCXN0b3AJMHgwCisKKwkvKiBQYWQgdGhlIHNpemUgb2YgdGhpcyBjcnQwLm8gdG8gYmUgbXVsdGlwbGUgb2YgMTYgYnl0ZXMuICovCisuYmFsaWdubCAxNiwgMHgwCisKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVfc2F2ZV9kdW1wLmhfc2hpcHBlZCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVfc2F2ZV9kdW1wLmhfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWU1NDAwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9zYXZlX2R1bXAuaF9zaGlwcGVkCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogc3B1X3NhdmVfZHVtcC5oOiBDb3B5cmlnaHQgKEMpIDIwMDUgSUJNLgorICogSGV4LWR1bXAgYXV0byBnZW5lcmF0ZWQgZnJvbSBzcHVfc2F2ZS5jLgorICogRG8gbm90IGVkaXQhCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3B1X3NhdmVfY29kZVtdIF9fcGFnZV9hbGlnbmVkID0geworMHgyMDgwNTAwMCwgMHgyMDgwNTIwMSwgMHgyMDgwNTQwMiwgMHgyMDgwNTYwMywKKzB4MjA4MDU4MDQsIDB4MjA4MDVhMDUsIDB4MjA4MDVjMDYsIDB4MjA4MDVlMDcsCisweDIwODA2MDA4LCAweDIwODA2MjA5LCAweDIwODA2NDBhLCAweDIwODA2NjBiLAorMHgyMDgwNjgwYywgMHgyMDgwNmEwZCwgMHgyMDgwNmMwZSwgMHgyMDgwNmUwZiwKKzB4NDIwMWMwMDMsIDB4MzM4MDAxODQsIDB4MWMwMTAyMDQsIDB4NDAyMDAwMDAsCisweDI0MDAwMTkwLCAweDI0MDA0MTkxLCAweDI0MDA4MTkyLCAweDI0MDBjMTkzLAorMHgxNDFmYzIwNSwgMHgyM2ZmZmQ4NCwgMHgxYzEwMDE4MywgMHgyMTdmZmI4NSwKKzB4NDA4MDAwMDAsIDB4NDA5ZmY4MDEsIDB4MjQwMDAwODAsIDB4MjRmZDgwODEsCisweDFjZDgwMDgxLCAweDMzMDAwMTgwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMWEwMDE4MiwgMHgzZWMwMDA4MywgMHhiMWMzODEwMywgMHgwMWEwMDIwNCwKKzB4M2VjMTAwODIsIDB4NDIwMTQwMGQsIDB4YjFjMzgyMDIsIDB4MDFhMDA1ODMsCisweDM0MjE4NjgyLCAweDNlZDgwNjg0LCAweGIwNDA4MTg0LCAweDI0MjE4NjgyLAorMHgwMWEwMDYwMywgMHgwMDIwMDAwMCwgMHgzNDIxNDY4MiwgMHgzZWQ0MDY4NCwKKzB4YjA0MDgxODQsIDB4NDA4MDAwMDMsIDB4MjQyMTQ2ODIsIDB4MjFhMDAwODMsCisweDQwODAwMDgyLCAweDIxYTAwYjAyLCAweDQwMjAwMDdmLCAweDEwMDAyNTFlLAorMHg0MGE4MDAwMiwgMHgzMjgwMDAwOCwgMHg0MjA1YzAwYywgMHgwMDIwMDAwMCwKKzB4NDBhMDAwMGIsIDB4M2Y4MjA3MGYsIDB4NDA4MDAyMGEsIDB4NDA4MDA3MDksCisweDNmZTMwNzhmLCAweDNmYmYwNzgzLCAweDNmMjAwMTgzLCAweDNmYmUwMTgzLAorMHgzZmUzMDE4NywgMHgxODAwODM4NywgMHg0MjA1YzAwMiwgMHgzYWMzMDQwNCwKKzB4MWNmZmM0ODksIDB4MDAyMDAwMDAsIDB4MTgwMDg0MDMsIDB4Mzg4MzA0MDIsCisweDRjZmZjNDg2LCAweDNhYzI4MTg1LCAweGIwNDA4NTg0LCAweDI4ODMwNDAyLAorMHgxYzAyMDQwOCwgMHgzODgyODE4MiwgMHhiMDQwODM4NSwgMHgxODAyYzM4NywKKzB4Mjg4MjgxODIsIDB4MjE3ZmY4ODYsIDB4MDQwMDA1ODIsIDB4MzI4MDAwMDcsCisweDIxYTAwODAyLCAweDNmYmYwNzA1LCAweDNmMjAwMjg1LCAweDNmYmUwMjg1LAorMHgzZmUzMDI4NSwgMHgyMWEwMDg4NSwgMHgwNDAwMDYwMywgMHgyMWEwMDkwMywKKzB4NDA4MDNjMDIsIDB4MjFhMDA5ODIsIDB4MDQwMDAzODYsIDB4MjFhMDBhMDYsCisweDQwODAxMjAyLCAweDIxYTAwYTgyLCAweDczMDAwMDAzLCAweDI0MjAwNjgzLAorMHgwMWEwMDQwNCwgMHgwMDIwMDAwMCwgMHgzNDIwNDY4MiwgMHgzZWM0MDY4MywKKzB4YjA0MDgyMDMsIDB4MjQyMDQ2ODIsIDB4MDFhMDA3ODMsIDB4MDAyMDAwMDAsCisweDM0MjFjNjgyLCAweDNlZGMwNjg0LCAweGIwNDA4MTg0LCAweDI0MjFjNjgyLAorMHgyMWEwMDgwNiwgMHgyMWEwMDg4NSwgMHgzZmJmMDc4NCwgMHgzZjIwMDIwNCwKKzB4M2ZiZTAyMDQsIDB4M2ZlMzAyMDQsIDB4MjFhMDA5MDQsIDB4NDA4MDQwMDIsCisweDIxYTAwOTgyLCAweDIxYTAwYTA2LCAweDQwODA1YTAyLCAweDIxYTAwYTgyLAorMHgwNDAwMDY4MywgMHgyMWEwMDgwMywgMHgyMWEwMDg4NSwgMHgyMWEwMDkwNCwKKzB4NDA4NDgwMDIsIDB4MjFhMDA5ODIsIDB4MjFhMDBhMDYsIDB4NDA4MDEwMDIsCisweDIxYTAwYTgyLCAweDIxYTAwYTA2LCAweDQwODA2NjAyLCAweDAwMjAwMDAwLAorMHgzNTgwMDAwOSwgMHgyMWEwMGE4MiwgMHg0MDgwMDA4MywgMHgyMWEwMGI4MywKKzB4MDFhMDBjMDIsIDB4MDFhMDBkODMsIDB4MDAwMDNmZmIsIDB4NDA4MDAwMDMsCisweDQwMjAwMDdmLCAweDM1MDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1X3V0aWxzLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1X3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgzNTlmZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVfdXRpbHMuaApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIHV0aWxzLmg6IFV0aWxpdGllcyBmb3IgU1BVLXNpZGUgb2YgdGhlIGNvbnRleHQgc3dpdGNoIG9wZXJhdGlvbi4KKyAqCisgKiAoQykgQ29weXJpZ2h0IElCTSAyMDA1CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9TUFVfQ09OVEVYVF9VVElMU19IXworI2RlZmluZSBfU1BVX0NPTlRFWFRfVVRJTFNfSF8KKworLyoKKyAqIDY0LWJpdCBzYWZlIEVBLgorICovCit0eXBlZGVmIHVuaW9uIHsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdWxsOworCXVuc2lnbmVkIGludCB1aVsyXTsKK30gYWRkcjY0OworCisvKgorICogMTI4LWJpdCByZWdpc3RlciB0ZW1wbGF0ZS4KKyAqLwordHlwZWRlZiB1bmlvbiB7CisJdW5zaWduZWQgaW50IHNsb3RbNF07CisJdmVjdG9yIHVuc2lnbmVkIGludCB2OworfSBzcHVfcmVnMTI4djsKKworLyoKKyAqIERNQSBsaXN0IHN0cnVjdHVyZS4KKyAqLworc3RydWN0IGRtYV9saXN0X2VsZW0geworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGludCBlYV9sb3c7Cit9OworCisvKgorICogRGVjbGFyZSBzdG9yYWdlIGZvciA4LWJ5dGUgYWxpZ25lZCBETUEgbGlzdC4KKyAqLworc3RydWN0IGRtYV9saXN0X2VsZW0gZG1hX2xpc3RbMTVdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSk7CisKKy8qCisgKiBFeHRlcm5hbCBkZWZpbml0aW9uIGZvciBzdG9yYWdlCisgKiBkZWNsYXJlZCBpbiBjcnQwLgorICovCitleHRlcm4gc3B1X3JlZzEyOHYgcmVnc19zcGlsbFtOUl9TUFVfU1BJTExfUkVHU107CisKKy8qCisgKiBDb21wdXRlIExTQ1NBIGJ5dGUgb2Zmc2V0IGZvciBhIGdpdmVuIGZpZWxkLgorICovCitzdGF0aWMgc3RydWN0IHNwdV9sc2NzYSAqZHVtbXkgPSAoc3RydWN0IHNwdV9sc2NzYSAqKTA7CisjZGVmaW5lIExTQ1NBX0JZVEVfT0ZGU0VUKF9maWVsZCkgIFwKKwkoKGNoYXIgKikoJihkdW1teS0+X2ZpZWxkKSkgLSAoY2hhciAqKSgmKGR1bW15LT5ncHJzWzBdLnNsb3RbMF0pKSkKKyNkZWZpbmUgTFNDU0FfUVdfT0ZGU0VUKF9maWVsZCkgIChMU0NTQV9CWVRFX09GRlNFVChfZmllbGQpID4+IDQpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZXZlbnRfbWFzayh2b2lkKQoreworCXVuc2lnbmVkIGludCBldmVudF9tYXNrID0gMDsKKworCS8qIFNhdmUsIFN0ZXAgNDoKKwkgKiBSZXN0b3JlLCBTdGVwIDE6CisJICogICAgU2V0IHRoZSBTUFVfUmRFdmVudE1zayBjaGFubmVsIHRvIHplcm8gdG8gbWFzaworCSAqICAgIGFsbCBldmVudHMuCisJICovCisJc3B1X3dyaXRlY2goU1BVX1dyRXZlbnRNYXNrLCBldmVudF9tYXNrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF90YWdfbWFzayh2b2lkKQoreworCXVuc2lnbmVkIGludCB0YWdfbWFzayA9IDE7CisKKwkvKiBTYXZlLCBTdGVwIDU6CisJICogUmVzdG9yZSwgU3RlcCAyOgorCSAqICAgIFNldCB0aGUgU1BVX1dyVGFnTXNrIGNoYW5uZWwgdG8gJzAxJyB0byB1bm1hc2sKKwkgKiAgICBvbmx5IHRhZyBncm91cCAwLgorCSAqLworCXNwdV93cml0ZWNoKE1GQ19XclRhZ01hc2ssIHRhZ19tYXNrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJ1aWxkX2RtYV9saXN0KGFkZHI2NCBsc2NzYV9lYSkKK3sKKwl1bnNpZ25lZCBpbnQgZWFfbG93OworCWludCBpOworCisJLyogU2F2ZSwgU3RlcCA2OgorCSAqIFJlc3RvcmUsIFN0ZXAgMzoKKwkgKiAgICBVcGRhdGUgdGhlIGVmZmVjdGl2ZSBhZGRyZXNzIGZvciB0aGUgQ1NBIGluIHRoZQorCSAqICAgIHByZS1jYW5uZWQgRE1BLWxpc3QgaW4gbG9jYWwgc3RvcmFnZS4KKwkgKi8KKwllYV9sb3cgPSBsc2NzYV9lYS51aVsxXTsKKwllYV9sb3cgKz0gTFNDU0FfQllURV9PRkZTRVQobHNbMTYzODRdKTsKKworCWZvciAoaSA9IDA7IGkgPCAxNTsgaSsrLCBlYV9sb3cgKz0gMTYzODQpIHsKKwkJZG1hX2xpc3RbaV0uc2l6ZSA9IDE2Mzg0OworCQlkbWFfbGlzdFtpXS5lYV9sb3cgPSBlYV9sb3c7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5xdWV1ZV9wdXRsbGMoYWRkcjY0IGxzY3NhX2VhKQoreworCXVuc2lnbmVkIGludCBscyA9IDA7CisJdW5zaWduZWQgaW50IHNpemUgPSAxMjg7CisJdW5zaWduZWQgaW50IHRhZ19pZCA9IDA7CisJdW5zaWduZWQgaW50IGNtZCA9IDB4QjQ7CS8qIFBVVExMQyAqLworCisJLyogU2F2ZSwgU3RlcCAxMjoKKwkgKiBSZXN0b3JlLCBTdGVwIDc6CisJICogICAgU2VuZCBhIFBVVExMQyAodGFnIDApIGNvbW1hbmQgdG8gdGhlIE1GQyB1c2luZworCSAqICAgIGFuIGVmZmVjdGl2ZSBhZGRyZXNzIGluIHRoZSBDU0EgaW4gb3JkZXIgdG8KKwkgKiAgICByZW1vdmUgYW55IHBvc3NpYmxlIGxvY2stbGluZSByZXNlcnZhdGlvbi4KKwkgKi8KKwlzcHVfd3JpdGVjaChNRkNfTFNBLCBscyk7CisJc3B1X3dyaXRlY2goTUZDX0VBSCwgbHNjc2FfZWEudWlbMF0pOworCXNwdV93cml0ZWNoKE1GQ19FQUwsIGxzY3NhX2VhLnVpWzFdKTsKKwlzcHVfd3JpdGVjaChNRkNfU2l6ZSwgc2l6ZSk7CisJc3B1X3dyaXRlY2goTUZDX1RhZ0lELCB0YWdfaWQpOworCXNwdV93cml0ZWNoKE1GQ19DbWQsIGNtZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfdGFnX3VwZGF0ZSh2b2lkKQoreworCXVuc2lnbmVkIGludCB1cGRhdGVfYW55ID0gMTsKKworCS8qIFNhdmUsIFN0ZXAgMTU6CisJICogUmVzdG9yZSwgU3RlcCA4OgorCSAqICAgIFdyaXRlIHRoZSBNRkNfVGFnVXBkYXRlIGNoYW5uZWwgd2l0aCAnMDEnLgorCSAqLworCXNwdV93cml0ZWNoKE1GQ19XclRhZ1VwZGF0ZSwgdXBkYXRlX2FueSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWFkX3RhZ19zdGF0dXModm9pZCkKK3sKKwkvKiBTYXZlLCBTdGVwIDE2OgorCSAqIFJlc3RvcmUsIFN0ZXAgOToKKwkgKiAgICBSZWFkIHRoZSBNRkNfVGFnU3RhdCBjaGFubmVsIGRhdGEuCisJICovCisJc3B1X3JlYWRjaChNRkNfUmRUYWdTdGF0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlYWRfbGxhcl9zdGF0dXModm9pZCkKK3sKKwkvKiBTYXZlLCBTdGVwIDE3OgorCSAqIFJlc3RvcmUsIFN0ZXAgMTA6CisJICogICAgUmVhZCB0aGUgTUZDX0F0b21pY1N0YXQgY2hhbm5lbCBkYXRhLgorCSAqLworCXNwdV9yZWFkY2goTUZDX1JkQXRvbWljU3RhdCk7Cit9CisKKyNlbmRpZgkJCQkvKiBfU1BVX0NPTlRFWFRfVVRJTFNfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyNjAxZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogU1BVIGZpbGUgc3lzdGVtCisgKgorICogKEMpIENvcHlyaWdodCBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCAyMDA1CisgKgorICogQXV0aG9yOiBBcm5kIEJlcmdtYW5uIDxhcm5kYkBkZS5pYm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaWZuZGVmIFNQVUZTX0gKKyNkZWZpbmUgU1BVRlNfSAorCisjaW5jbHVkZSA8bGludXgva3JlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisjaW5jbHVkZSA8YXNtL3NwdS5oPgorI2luY2x1ZGUgPGFzbS9zcHVfY3NhLmg+CisKKy8qIFRoZSBtYWdpYyBudW1iZXIgZm9yIG91ciBmaWxlIHN5c3RlbSAqLworZW51bSB7CisJU1BVRlNfTUFHSUMgPSAweDIzYzliNjRlLAorfTsKKworc3RydWN0IHNwdV9jb250ZXh0X29wczsKKworI2RlZmluZSBTUFVfQ09OVEVYVF9QUkVFTVBUICAgICAgICAgIDBVTAorCitzdHJ1Y3Qgc3B1X2NvbnRleHQgeworCXN0cnVjdCBzcHUgKnNwdTsJCSAgLyogcG9pbnRlciB0byBhIHBoeXNpY2FsIFNQVSAqLworCXN0cnVjdCBzcHVfc3RhdGUgY3NhOwkJICAvKiBTUFUgY29udGV4dCBzYXZlIGFyZWEuICovCisJc3BpbmxvY2tfdCBtbWlvX2xvY2s7CQkgIC8qIHByb3RlY3RzIG1taW8gYWNjZXNzICovCisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKmxvY2FsX3N0b3JlOy8qIGxvY2FsIHN0b3JlIGJhY2tpbmcgc3RvcmUgKi8KKworCWVudW0geyBTUFVfU1RBVEVfUlVOTkFCTEUsIFNQVV9TVEFURV9TQVZFRCB9IHN0YXRlOworCXN0cnVjdCByd19zZW1hcGhvcmUgc3RhdGVfc2VtYTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHJ1bl9zZW1hOworCisJc3RydWN0IG1tX3N0cnVjdCAqb3duZXI7CisKKwlzdHJ1Y3Qga3JlZiBrcmVmOworCXdhaXRfcXVldWVfaGVhZF90IGlib3hfd3E7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2JveF93cTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBzdG9wX3dxOworCXN0cnVjdCBmYXN5bmNfc3RydWN0ICppYm94X2Zhc3luYzsKKwlzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqd2JveF9mYXN5bmM7CisJc3RydWN0IHNwdV9jb250ZXh0X29wcyAqb3BzOworCXN0cnVjdCB3b3JrX3N0cnVjdCByZWFwX3dvcms7CisJdTY0IGZsYWdzOworfTsKKworLyogU1BVIGNvbnRleHQgcXVlcnkvc2V0IG9wZXJhdGlvbnMuICovCitzdHJ1Y3Qgc3B1X2NvbnRleHRfb3BzIHsKKwlpbnQgKCptYm94X3JlYWQpIChzdHJ1Y3Qgc3B1X2NvbnRleHQgKiBjdHgsIHUzMiAqIGRhdGEpOworCSB1MzIoKm1ib3hfc3RhdF9yZWFkKSAoc3RydWN0IHNwdV9jb250ZXh0ICogY3R4KTsKKwl1bnNpZ25lZCBpbnQgKCptYm94X3N0YXRfcG9sbCkoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsCisJCQkJCXVuc2lnbmVkIGludCBldmVudHMpOworCWludCAoKmlib3hfcmVhZCkgKHN0cnVjdCBzcHVfY29udGV4dCAqIGN0eCwgdTMyICogZGF0YSk7CisJaW50ICgqd2JveF93cml0ZSkgKHN0cnVjdCBzcHVfY29udGV4dCAqIGN0eCwgdTMyIGRhdGEpOworCSB1MzIoKnNpZ25hbDFfcmVhZCkgKHN0cnVjdCBzcHVfY29udGV4dCAqIGN0eCk7CisJdm9pZCAoKnNpZ25hbDFfd3JpdGUpIChzdHJ1Y3Qgc3B1X2NvbnRleHQgKiBjdHgsIHUzMiBkYXRhKTsKKwkgdTMyKCpzaWduYWwyX3JlYWQpIChzdHJ1Y3Qgc3B1X2NvbnRleHQgKiBjdHgpOworCXZvaWQgKCpzaWduYWwyX3dyaXRlKSAoc3RydWN0IHNwdV9jb250ZXh0ICogY3R4LCB1MzIgZGF0YSk7CisJdm9pZCAoKnNpZ25hbDFfdHlwZV9zZXQpIChzdHJ1Y3Qgc3B1X2NvbnRleHQgKiBjdHgsIHU2NCB2YWwpOworCSB1NjQoKnNpZ25hbDFfdHlwZV9nZXQpIChzdHJ1Y3Qgc3B1X2NvbnRleHQgKiBjdHgpOworCXZvaWQgKCpzaWduYWwyX3R5cGVfc2V0KSAoc3RydWN0IHNwdV9jb250ZXh0ICogY3R4LCB1NjQgdmFsKTsKKwkgdTY0KCpzaWduYWwyX3R5cGVfZ2V0KSAoc3RydWN0IHNwdV9jb250ZXh0ICogY3R4KTsKKwkgdTMyKCpucGNfcmVhZCkgKHN0cnVjdCBzcHVfY29udGV4dCAqIGN0eCk7CisJdm9pZCAoKm5wY193cml0ZSkgKHN0cnVjdCBzcHVfY29udGV4dCAqIGN0eCwgdTMyIGRhdGEpOworCSB1MzIoKnN0YXR1c19yZWFkKSAoc3RydWN0IHNwdV9jb250ZXh0ICogY3R4KTsKKwljaGFyKigqZ2V0X2xzKSAoc3RydWN0IHNwdV9jb250ZXh0ICogY3R4KTsKKwl2b2lkICgqcnVuY250bF93cml0ZSkgKHN0cnVjdCBzcHVfY29udGV4dCAqIGN0eCwgdTMyIGRhdGEpOworCXZvaWQgKCpydW5jbnRsX3N0b3ApIChzdHJ1Y3Qgc3B1X2NvbnRleHQgKiBjdHgpOworfTsKKworZXh0ZXJuIHN0cnVjdCBzcHVfY29udGV4dF9vcHMgc3B1X2h3X29wczsKK2V4dGVybiBzdHJ1Y3Qgc3B1X2NvbnRleHRfb3BzIHNwdV9iYWNraW5nX29wczsKKworc3RydWN0IHNwdWZzX2lub2RlX2luZm8geworCXN0cnVjdCBzcHVfY29udGV4dCAqaV9jdHg7CisJc3RydWN0IGlub2RlIHZmc19pbm9kZTsKK307CisjZGVmaW5lIFNQVUZTX0koaW5vZGUpIFwKKwljb250YWluZXJfb2YoaW5vZGUsIHN0cnVjdCBzcHVmc19pbm9kZV9pbmZvLCB2ZnNfaW5vZGUpCisKK2V4dGVybiBzdHJ1Y3QgdHJlZV9kZXNjciBzcHVmc19kaXJfY29udGVudHNbXTsKKworLyogc3lzdGVtIGNhbGwgaW1wbGVtZW50YXRpb24gKi8KK2xvbmcgc3B1ZnNfcnVuX3NwdShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIHUzMiAqbnBjLCB1MzIgKnN0YXR1cyk7Citsb25nIHNwdWZzX2NyZWF0ZV90aHJlYWQoc3RydWN0IG5hbWVpZGF0YSAqbmQsCisJCQkgdW5zaWduZWQgaW50IGZsYWdzLCBtb2RlX3QgbW9kZSk7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcHVmc19jb250ZXh0X2ZvcHM7CisKKy8qIGNvbnRleHQgbWFuYWdlbWVudCAqLworc3RydWN0IHNwdV9jb250ZXh0ICogYWxsb2Nfc3B1X2NvbnRleHQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKmxvY2FsX3N0b3JlKTsKK3ZvaWQgZGVzdHJveV9zcHVfY29udGV4dChzdHJ1Y3Qga3JlZiAqa3JlZik7CitzdHJ1Y3Qgc3B1X2NvbnRleHQgKiBnZXRfc3B1X2NvbnRleHQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOworaW50IHB1dF9zcHVfY29udGV4dChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7Cit2b2lkIHNwdV91bm1hcF9tYXBwaW5ncyhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7CisKK3ZvaWQgc3B1X2ZvcmdldChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7Cit2b2lkIHNwdV9hY3F1aXJlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKK3ZvaWQgc3B1X3JlbGVhc2Uoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOworaW50IHNwdV9hY3F1aXJlX3J1bm5hYmxlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKK3ZvaWQgc3B1X2FjcXVpcmVfc2F2ZWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOworCitpbnQgc3B1X2FjdGl2YXRlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1NjQgZmxhZ3MpOwordm9pZCBzcHVfZGVhY3RpdmF0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7Cit2b2lkIHNwdV95aWVsZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7CitpbnQgX19pbml0IHNwdV9zY2hlZF9pbml0KHZvaWQpOwordm9pZCBfX2V4aXQgc3B1X3NjaGVkX2V4aXQodm9pZCk7CisKKy8qCisgKiBzcHVmc193YWl0CisgKiAJU2FtZSBhcyB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKSwgZXhjZXB0IHRoYXQgaGVyZQorICoJd2UgbmVlZCB0byBjYWxsIHNwdV9yZWxlYXNlKGN0eCkgYmVmb3JlIHNsZWVwaW5nLCBhbmQKKyAqCXRoZW4gc3B1X2FjcXVpcmUoY3R4KSB3aGVuIGF3b2tlbi4KKyAqLworCisjZGVmaW5lIHNwdWZzX3dhaXQod3EsIGNvbmRpdGlvbikJCQkJCVwKKyh7CQkJCQkJCQkJXAorCWludCBfX3JldCA9IDA7CQkJCQkJCVwKKwlERUZJTkVfV0FJVChfX3dhaXQpOwkJCQkJCVwKKwlmb3IgKDs7KSB7CQkJCQkJCVwKKwkJcHJlcGFyZV90b193YWl0KCYod3EpLCAmX193YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwlcCisJCWlmIChjb25kaXRpb24pCQkJCQkJXAorCQkJYnJlYWs7CQkJCQkJXAorCQlpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CQkJCVwKKwkJCXNwdV9yZWxlYXNlKGN0eCk7CQkJCVwKKwkJCXNjaGVkdWxlKCk7CQkJCQlcCisJCQlzcHVfYWNxdWlyZShjdHgpOwkJCQlcCisJCQljb250aW51ZTsJCQkJCVwKKwkJfQkJCQkJCQlcCisJCV9fcmV0ID0gLUVSRVNUQVJUU1lTOwkJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCX0JCQkJCQkJCVwKKwlmaW5pc2hfd2FpdCgmKHdxKSwgJl9fd2FpdCk7CQkJCQlcCisJX19yZXQ7CQkJCQkJCQlcCit9KQorCitzaXplX3Qgc3B1X3dib3hfd3JpdGUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIHUzMiBkYXRhKTsKK3NpemVfdCBzcHVfaWJveF9yZWFkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1MzIgKmRhdGEpOworCisvKiBpcnEgY2FsbGJhY2sgZnVuY3MuICovCit2b2lkIHNwdWZzX2lib3hfY2FsbGJhY2soc3RydWN0IHNwdSAqc3B1KTsKK3ZvaWQgc3B1ZnNfd2JveF9jYWxsYmFjayhzdHJ1Y3Qgc3B1ICpzcHUpOwordm9pZCBzcHVmc19zdG9wX2NhbGxiYWNrKHN0cnVjdCBzcHUgKnNwdSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N3aXRjaC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N3aXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMmRiMjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3dpdGNoLmMKQEAgLTAsMCArMSwyMjA0IEBACisvKgorICogc3B1X3N3aXRjaC5jCisgKgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNQorICoKKyAqIEF1dGhvcjogTWFyayBOdXR0ZXIgPG1udXR0ZXJAdXMuaWJtLmNvbT4KKyAqCisgKiBIb3N0LXNpZGUgcGFydCBvZiBTUFUgY29udGV4dCBzd2l0Y2ggc2VxdWVuY2Ugb3V0bGluZWQgaW4KKyAqIFN5bmVyZ2lzdGljIFByb2Nlc3NvciBFbGVtZW50LCBCb29rIElWLgorICoKKyAqIEEgZnVsbHkgcHJlbXB0aXZlIHN3aXRjaCBvZiBhbiBTUEUgaXMgdmVyeSBleHBlbnNpdmUgaW4gdGVybXMKKyAqIG9mIHRpbWUgYW5kIHN5c3RlbSByZXNvdXJjZXMuICBTUEUgQm9vayBJViBpbmRpY2F0ZXMgdGhhdCBTUEUKKyAqIGFsbG9jYXRpb24gc2hvdWxkIGZvbGxvdyBhICJzZXJpYWxseSByZXVzYWJsZSBkZXZpY2UiIG1vZGVsLAorICogaW4gd2hpY2ggdGhlIFNQRSBpcyBhc3NpZ25lZCBhIHRhc2sgdW50aWwgaXQgY29tcGxldGVzLiAgV2hlbgorICogdGhpcyBpcyBub3QgcG9zc2libGUsIHRoaXMgc2VxdWVuY2UgbWF5IGJlIHVzZWQgdG8gcHJlbXB0aXZlbHkKKyAqIHNhdmUsIGFuZCB0aGVuIGxhdGVyIChvcHRpb25hbGx5KSByZXN0b3JlIHRoZSBjb250ZXh0IG9mIGEKKyAqIHByb2dyYW0gZXhlY3V0aW5nIG9uIGFuIFNQRS4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3B1Lmg+CisjaW5jbHVkZSA8YXNtL3NwdV9jc2EuaD4KKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKworI2luY2x1ZGUgInNwdV9zYXZlX2R1bXAuaCIKKyNpbmNsdWRlICJzcHVfcmVzdG9yZV9kdW1wLmgiCisKKyNpZiAwCisjZGVmaW5lIFBPTExfV0hJTEVfVFJVRShfYykgewkJCQlcCisgICAgZG8gewkJCQkJCVwKKyAgICB9IHdoaWxlIChfYyk7CQkJCQlcCisgIH0KKyNlbHNlCisjZGVmaW5lIFJFTEFYX1NQSU5fQ09VTlQJCQkJMTAwMAorI2RlZmluZSBQT0xMX1dISUxFX1RSVUUoX2MpIHsJCQkJXAorICAgIGRvIHsJCQkJCQlcCisJaW50IF9pOwkJCQkJCVwKKwlmb3IgKF9pPTA7IF9pPFJFTEFYX1NQSU5fQ09VTlQgJiYgKF9jKTsgX2krKykgeyBcCisJICAgIGNwdV9yZWxheCgpOwkJCQlcCisJfQkJCQkJCVwKKwlpZiAodW5saWtlbHkoX2MpKSB5aWVsZCgpOwkJCVwKKwllbHNlIGJyZWFrOwkJCQkJXAorICAgIH0gd2hpbGUgKF9jKTsJCQkJCVwKKyAgfQorI2VuZGlmCQkJCS8qIGRlYnVnICovCisKKyNkZWZpbmUgUE9MTF9XSElMRV9GQUxTRShfYykgCVBPTExfV0hJTEVfVFJVRSghKF9jKSkKKworc3RhdGljIGlubGluZSB2b2lkIGFjcXVpcmVfc3B1X2xvY2soc3RydWN0IHNwdSAqc3B1KQoreworCS8qIFNhdmUsIFN0ZXAgMToKKwkgKiBSZXN0b3JlLCBTdGVwIDE6CisJICogICAgQWNxdWlyZSBTUFUtc3BlY2lmaWMgbXV0dWFsIGV4Y2x1c2lvbiBsb2NrLgorCSAqICAgIFRCRC4KKwkgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlbGVhc2Vfc3B1X2xvY2soc3RydWN0IHNwdSAqc3B1KQoreworCS8qIFJlc3RvcmUsIFN0ZXAgNzY6CisJICogICAgUmVsZWFzZSBTUFUtc3BlY2lmaWMgbXV0dWFsIGV4Y2x1c2lvbiBsb2NrLgorCSAqICAgIFRCRC4KKwkgKi8KK30KKworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfc3B1X2lzb2xhdGUoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcm9ibGVtIF9faW9tZW0gKnByb2IgPSBzcHUtPnByb2JsZW07CisJdTMyIGlzb2xhdGVfc3RhdGU7CisKKwkvKiBTYXZlLCBTdGVwIDI6CisJICogU2F2ZSwgU3RlcCA2OgorCSAqICAgICBJZiBTUFVfU3RhdHVzW0UsTCxJU10gYW55IGZpZWxkIGlzICcxJywgdGhpcworCSAqICAgICBTUFUgaXMgaW4gaXNvbGF0ZSBzdGF0ZSBhbmQgY2Fubm90IGJlIGNvbnRleHQKKwkgKiAgICAgc2F2ZWQgYXQgdGhpcyB0aW1lLgorCSAqLworCWlzb2xhdGVfc3RhdGUgPSBTUFVfU1RBVFVTX0lTT0xBVEVEX1NUQVRFIHwKKwkgICAgU1BVX1NUQVRVU19JU09MQVRFRF9MT0FEX1NUQVVUVVMgfCBTUFVfU1RBVFVTX0lTT0xBVEVEX0VYSVRfU1RBVVRVUzsKKwlyZXR1cm4gKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgJiBpc29sYXRlX3N0YXRlKSA/IDEgOiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCS8qIFNhdmUsIFN0ZXAgMzoKKwkgKiBSZXN0b3JlLCBTdGVwIDI6CisJICogICAgIFNhdmUgSU5UX01hc2tfY2xhc3MwIGluIENTQS4KKwkgKiAgICAgV3JpdGUgSU5UX01BU0tfY2xhc3MwIHdpdGggdmFsdWUgb2YgMC4KKwkgKiAgICAgU2F2ZSBJTlRfTWFza19jbGFzczEgaW4gQ1NBLgorCSAqICAgICBXcml0ZSBJTlRfTUFTS19jbGFzczEgd2l0aCB2YWx1ZSBvZiAwLgorCSAqICAgICBTYXZlIElOVF9NYXNrX2NsYXNzMiBpbiBDU0EuCisJICogICAgIFdyaXRlIElOVF9NQVNLX2NsYXNzMiB3aXRoIHZhbHVlIG9mIDAuCisJICovCisJc3Bpbl9sb2NrX2lycSgmc3B1LT5yZWdpc3Rlcl9sb2NrKTsKKwlpZiAoY3NhKSB7CisJCWNzYS0+cHJpdjEuaW50X21hc2tfY2xhc3MwX1JXID0gc3B1X2ludF9tYXNrX2dldChzcHUsIDApOworCQljc2EtPnByaXYxLmludF9tYXNrX2NsYXNzMV9SVyA9IHNwdV9pbnRfbWFza19nZXQoc3B1LCAxKTsKKwkJY3NhLT5wcml2MS5pbnRfbWFza19jbGFzczJfUlcgPSBzcHVfaW50X21hc2tfZ2V0KHNwdSwgMik7CisJfQorCXNwdV9pbnRfbWFza19zZXQoc3B1LCAwLCAwdWwpOworCXNwdV9pbnRfbWFza19zZXQoc3B1LCAxLCAwdWwpOworCXNwdV9pbnRfbWFza19zZXQoc3B1LCAyLCAwdWwpOworCWVpZWlvKCk7CisJc3Bpbl91bmxvY2tfaXJxKCZzcHUtPnJlZ2lzdGVyX2xvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3dhdGNoZG9nX3RpbWVyKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCS8qIFNhdmUsIFN0ZXAgNDoKKwkgKiBSZXN0b3JlLCBTdGVwIDI1LgorCSAqICAgIFNldCBhIHNvZnR3YXJlIHdhdGNoZG9nIHRpbWVyLCB3aGljaCBzcGVjaWZpZXMgdGhlCisJICogICAgbWF4aW11bSBhbGxvd2FibGUgdGltZSBmb3IgYSBjb250ZXh0IHNhdmUgc2VxdWVuY2UuCisJICoKKwkgKiAgICBGb3IgcHJlc2VudCwgdGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIG5vdCBzZXQgYSBnbG9iYWwKKwkgKiAgICB3YXRjaGRvZyB0aW1lciwgYXMgdmlydHVhbGl6YXRpb24gJiB2YXJpYWJsZSBzeXN0ZW0gbG9hZAorCSAqICAgIG1heSBjYXVzZSB1bnByZWRpY3RhYmxlIGV4ZWN1dGlvbiB0aW1lcy4KKwkgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIGluaGliaXRfdXNlcl9hY2Nlc3Moc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJLyogU2F2ZSwgU3RlcCA1OgorCSAqIFJlc3RvcmUsIFN0ZXAgMzoKKwkgKiAgICAgSW5oaWJpdCB1c2VyLXNwYWNlIGFjY2VzcyAoaWYgcHJvdmlkZWQpIHRvIHRoaXMKKwkgKiAgICAgU1BVIGJ5IHVubWFwcGluZyB0aGUgdmlydHVhbCBwYWdlcyBhc3NpZ25lZCB0bworCSAqICAgICB0aGUgU1BVIG1lbW9yeS1tYXBwZWQgSS9PIChNTUlPKSBmb3IgcHJvYmxlbQorCSAqICAgICBzdGF0ZS4gVEJELgorCSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3N3aXRjaF9wZW5kaW5nKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCS8qIFNhdmUsIFN0ZXAgNzoKKwkgKiBSZXN0b3JlLCBTdGVwIDU6CisJICogICAgIFNldCBhIHNvZnR3YXJlIGNvbnRleHQgc3dpdGNoIHBlbmRpbmcgZmxhZy4KKwkgKi8KKwlzZXRfYml0KFNQVV9DT05URVhUX1NXSVRDSF9QRU5ESU5HLCAmc3B1LT5mbGFncyk7CisJbWIoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfbWZjX2NudGwoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcml2MiBfX2lvbWVtICpwcml2MiA9IHNwdS0+cHJpdjI7CisKKwkvKiBTYXZlLCBTdGVwIDg6CisJICogICAgIFN1c3BlbmQgRE1BIGFuZCBzYXZlIE1GQ19DTlRMLgorCSAqLworCXN3aXRjaCAoaW5fYmU2NCgmcHJpdjItPm1mY19jb250cm9sX1JXKSAmCisJICAgICAgIE1GQ19DTlRMX1NVU1BFTkRfRE1BX1NUQVRVU19NQVNLKSB7CisJY2FzZSBNRkNfQ05UTF9TVVNQRU5EX0lOX1BST0dSRVNTOgorCQlQT0xMX1dISUxFX0ZBTFNFKChpbl9iZTY0KCZwcml2Mi0+bWZjX2NvbnRyb2xfUlcpICYKKwkJCQkgIE1GQ19DTlRMX1NVU1BFTkRfRE1BX1NUQVRVU19NQVNLKSA9PQorCQkJCSBNRkNfQ05UTF9TVVNQRU5EX0NPTVBMRVRFKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBNRkNfQ05UTF9TVVNQRU5EX0NPTVBMRVRFOgorCQlpZiAoY3NhKSB7CisJCQljc2EtPnByaXYyLm1mY19jb250cm9sX1JXID0KKwkJCQlpbl9iZTY0KCZwcml2Mi0+bWZjX2NvbnRyb2xfUlcpIHwKKwkJCQlNRkNfQ05UTF9TVVNQRU5EX0RNQV9RVUVVRTsKKwkJfQorCQlicmVhazsKKwljYXNlIE1GQ19DTlRMX05PUk1BTF9ETUFfUVVFVUVfT1BFUkFUSU9OOgorCQlvdXRfYmU2NCgmcHJpdjItPm1mY19jb250cm9sX1JXLCBNRkNfQ05UTF9TVVNQRU5EX0RNQV9RVUVVRSk7CisJCVBPTExfV0hJTEVfRkFMU0UoKGluX2JlNjQoJnByaXYyLT5tZmNfY29udHJvbF9SVykgJgorCQkJCSAgTUZDX0NOVExfU1VTUEVORF9ETUFfU1RBVFVTX01BU0spID09CisJCQkJIE1GQ19DTlRMX1NVU1BFTkRfQ09NUExFVEUpOworCQlpZiAoY3NhKSB7CisJCQljc2EtPnByaXYyLm1mY19jb250cm9sX1JXID0KKwkJCQlpbl9iZTY0KCZwcml2Mi0+bWZjX2NvbnRyb2xfUlcpICYKKwkJCQl+TUZDX0NOVExfU1VTUEVORF9ETUFfUVVFVUU7CisJCX0KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9zcHVfcnVuY250bChzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3Byb2JsZW0gX19pb21lbSAqcHJvYiA9IHNwdS0+cHJvYmxlbTsKKworCS8qIFNhdmUsIFN0ZXAgOToKKwkgKiAgICAgU2F2ZSBTUFVfUnVuY250bCBpbiB0aGUgQ1NBLiAgVGhpcyB2YWx1ZSBjb250YWlucworCSAqICAgICB0aGUgIkFwcGxpY2F0aW9uIERlc2lyZWQgU3RhdGUiLgorCSAqLworCWNzYS0+cHJvYi5zcHVfcnVuY250bF9SVyA9IGluX2JlMzIoJnByb2ItPnNwdV9ydW5jbnRsX1JXKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfbWZjX3NyMShzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwkvKiBTYXZlLCBTdGVwIDEwOgorCSAqICAgICBTYXZlIE1GQ19TUjEgaW4gdGhlIENTQS4KKwkgKi8KKwljc2EtPnByaXYxLm1mY19zcjFfUlcgPSBzcHVfbWZjX3NyMV9nZXQoc3B1KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfc3B1X3N0YXR1cyhzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3Byb2JsZW0gX19pb21lbSAqcHJvYiA9IHNwdS0+cHJvYmxlbTsKKworCS8qIFNhdmUsIFN0ZXAgMTE6CisJICogICAgIFJlYWQgU1BVX1N0YXR1c1tSXSwgYW5kIHNhdmUgdG8gQ1NBLgorCSAqLworCWlmICgoaW5fYmUzMigmcHJvYi0+c3B1X3N0YXR1c19SKSAmIFNQVV9TVEFUVVNfUlVOTklORykgPT0gMCkgeworCQljc2EtPnByb2Iuc3B1X3N0YXR1c19SID0gaW5fYmUzMigmcHJvYi0+c3B1X3N0YXR1c19SKTsKKwl9IGVsc2UgeworCQl1MzIgc3RvcHBlZDsKKworCQlvdXRfYmUzMigmcHJvYi0+c3B1X3J1bmNudGxfUlcsIFNQVV9SVU5DTlRMX1NUT1ApOworCQllaWVpbygpOworCQlQT0xMX1dISUxFX1RSVUUoaW5fYmUzMigmcHJvYi0+c3B1X3N0YXR1c19SKSAmCisJCQkJU1BVX1NUQVRVU19SVU5OSU5HKTsKKwkJc3RvcHBlZCA9CisJCSAgICBTUFVfU1RBVFVTX0lOVkFMSURfSU5TVFIgfCBTUFVfU1RBVFVTX1NJTkdMRV9TVEVQIHwKKwkJICAgIFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9IQUxUIHwgU1BVX1NUQVRVU19TVE9QUEVEX0JZX1NUT1A7CisJCWlmICgoaW5fYmUzMigmcHJvYi0+c3B1X3N0YXR1c19SKSAmIHN0b3BwZWQpID09IDApCisJCQljc2EtPnByb2Iuc3B1X3N0YXR1c19SID0gU1BVX1NUQVRVU19SVU5OSU5HOworCQllbHNlCisJCQljc2EtPnByb2Iuc3B1X3N0YXR1c19SID0gaW5fYmUzMigmcHJvYi0+c3B1X3N0YXR1c19SKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYXZlX21mY19kZWNyKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCXN0cnVjdCBzcHVfcHJpdjIgX19pb21lbSAqcHJpdjIgPSBzcHUtPnByaXYyOworCisJLyogU2F2ZSwgU3RlcCAxMjoKKwkgKiAgICAgUmVhZCBNRkNfQ05UTFtEc10uICBVcGRhdGUgc2F2ZWQgY29weSBvZgorCSAqICAgICBDU0EuTUZDX0NOVExbRHNdLgorCSAqLworCWlmIChpbl9iZTY0KCZwcml2Mi0+bWZjX2NvbnRyb2xfUlcpICYgTUZDX0NOVExfREVDUkVNRU5URVJfUlVOTklORykgeworCQljc2EtPnByaXYyLm1mY19jb250cm9sX1JXIHw9IE1GQ19DTlRMX0RFQ1JFTUVOVEVSX1JVTk5JTkc7CisJCWNzYS0+c3VzcGVuZF90aW1lID0gZ2V0X2N5Y2xlcygpOworCQlvdXRfYmU2NCgmcHJpdjItPnNwdV9jaG5sY250cHRyX1JXLCA3VUxMKTsKKwkJZWllaW8oKTsKKwkJY3NhLT5zcHVfY2hubGRhdGFfUldbN10gPSBpbl9iZTY0KCZwcml2Mi0+c3B1X2NobmxkYXRhX1JXKTsKKwkJZWllaW8oKTsKKwl9IGVsc2UgeworCQljc2EtPnByaXYyLm1mY19jb250cm9sX1JXICY9IH5NRkNfQ05UTF9ERUNSRU1FTlRFUl9SVU5OSU5HOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGhhbHRfbWZjX2RlY3Ioc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcml2MiBfX2lvbWVtICpwcml2MiA9IHNwdS0+cHJpdjI7CisKKwkvKiBTYXZlLCBTdGVwIDEzOgorCSAqICAgICBXcml0ZSBNRkNfQ05UTFtEaF0gc2V0IHRvIGEgJzEnIHRvIGhhbHQKKwkgKiAgICAgdGhlIGRlY3JlbWVudGVyLgorCSAqLworCW91dF9iZTY0KCZwcml2Mi0+bWZjX2NvbnRyb2xfUlcsIE1GQ19DTlRMX0RFQ1JFTUVOVEVSX0hBTFRFRCk7CisJZWllaW8oKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfdGltZWJhc2Uoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJLyogU2F2ZSwgU3RlcCAxNDoKKwkgKiAgICBSZWFkIFBQRSBUaW1lYmFzZSBIaWdoIGFuZCBUaW1lYmFzZSBsb3cgcmVnaXN0ZXJzCisJICogICAgYW5kIHNhdmUgaW4gQ1NBLiAgVEJELgorCSAqLworCWNzYS0+c3VzcGVuZF90aW1lID0gZ2V0X2N5Y2xlcygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVtb3ZlX290aGVyX3NwdV9hY2Nlc3Moc3RydWN0IHNwdV9zdGF0ZSAqY3NhLAorCQkJCQkgICBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJLyogU2F2ZSwgU3RlcCAxNToKKwkgKiAgICAgUmVtb3ZlIG90aGVyIFNQVSBhY2Nlc3MgdG8gdGhpcyBTUFUgYnkgdW5tYXBwaW5nCisJICogICAgIHRoaXMgU1BVJ3MgcGFnZXMgZnJvbSB0aGVpciBhZGRyZXNzIHNwYWNlLiAgVEJELgorCSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG9fbWZjX21zc3luYyhzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3Byb2JsZW0gX19pb21lbSAqcHJvYiA9IHNwdS0+cHJvYmxlbTsKKworCS8qIFNhdmUsIFN0ZXAgMTY6CisJICogUmVzdG9yZSwgU3RlcCAxMS4KKwkgKiAgICAgV3JpdGUgU1BVX01TU3luYyByZWdpc3Rlci4gUG9sbCBTUFVfTVNTeW5jW1BdCisJICogICAgIGZvciBhIHZhbHVlIG9mIDAuCisJICovCisJb3V0X2JlNjQoJnByb2ItPnNwY19tc3N5bmNfUlcsIDFVTCk7CisJUE9MTF9XSElMRV9UUlVFKGluX2JlNjQoJnByb2ItPnNwY19tc3N5bmNfUlcpICYgTVNfU1lOQ19QRU5ESU5HKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlzc3VlX21mY190bGJpZShzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwkvKiBTYXZlLCBTdGVwIDE3OgorCSAqIFJlc3RvcmUsIFN0ZXAgMTIuCisJICogUmVzdG9yZSwgU3RlcCA0OC4KKwkgKiAgICAgV3JpdGUgVExCX0ludmFsaWRhdGVfRW50cnlbSVMsVlBOLEwsTHBdPTAgcmVnaXN0ZXIuCisJICogICAgIFRoZW4gaXNzdWUgYSBQUEUgc3luYyBpbnN0cnVjdGlvbi4KKwkgKi8KKwlzcHVfdGxiX2ludmFsaWRhdGUoc3B1KTsKKwltYigpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGFuZGxlX3BlbmRpbmdfaW50ZXJydXB0cyhzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsCisJCQkJCSAgICAgc3RydWN0IHNwdSAqc3B1KQoreworCS8qIFNhdmUsIFN0ZXAgMTg6CisJICogICAgIEhhbmRsZSBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzIGZyb20gdGhpcyBTUFUKKwkgKiAgICAgaGVyZS4gIFRoaXMgaXMgT1Mgb3IgaHlwZXJ2aXNvciBzcGVjaWZpYy4gIE9uZQorCSAqICAgICBvcHRpb24gaXMgdG8gcmUtZW5hYmxlIGludGVycnVwdHMgdG8gaGFuZGxlIGFueQorCSAqICAgICBwZW5kaW5nIGludGVycnVwdHMsIHdpdGggdGhlIGludGVycnVwdCBoYW5kbGVycworCSAqICAgICByZWNvZ25pemluZyB0aGUgc29mdHdhcmUgQ29udGV4dCBTd2l0Y2ggUGVuZGluZworCSAqICAgICBmbGFnLCB0byBlbnN1cmUgdGhlIFNQVSBleGVjdXRpb24gb3IgTUZDIGNvbW1hbmQKKwkgKiAgICAgcXVldWUgaXMgbm90IHJlc3RhcnRlZC4gIFRCRC4KKwkgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfbWZjX3F1ZXVlcyhzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyID0gc3B1LT5wcml2MjsKKwlpbnQgaTsKKworCS8qIFNhdmUsIFN0ZXAgMTk6CisJICogICAgIElmIE1GQ19DbnRsW1NlXT0wIHRoZW4gc2F2ZQorCSAqICAgICBNRkMgY29tbWFuZCBxdWV1ZXMuCisJICovCisJaWYgKChpbl9iZTY0KCZwcml2Mi0+bWZjX2NvbnRyb2xfUlcpICYgTUZDX0NOVExfRE1BX1FVRVVFU19FTVBUWSkgPT0gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQljc2EtPnByaXYyLnB1cVtpXS5tZmNfY3FfZGF0YTBfUlcgPQorCQkJICAgIGluX2JlNjQoJnByaXYyLT5wdXFbaV0ubWZjX2NxX2RhdGEwX1JXKTsKKwkJCWNzYS0+cHJpdjIucHVxW2ldLm1mY19jcV9kYXRhMV9SVyA9CisJCQkgICAgaW5fYmU2NCgmcHJpdjItPnB1cVtpXS5tZmNfY3FfZGF0YTFfUlcpOworCQkJY3NhLT5wcml2Mi5wdXFbaV0ubWZjX2NxX2RhdGEyX1JXID0KKwkJCSAgICBpbl9iZTY0KCZwcml2Mi0+cHVxW2ldLm1mY19jcV9kYXRhMl9SVyk7CisJCQljc2EtPnByaXYyLnB1cVtpXS5tZmNfY3FfZGF0YTNfUlcgPQorCQkJICAgIGluX2JlNjQoJnByaXYyLT5wdXFbaV0ubWZjX2NxX2RhdGEzX1JXKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJY3NhLT5wcml2Mi5zcHVxW2ldLm1mY19jcV9kYXRhMF9SVyA9CisJCQkgICAgaW5fYmU2NCgmcHJpdjItPnNwdXFbaV0ubWZjX2NxX2RhdGEwX1JXKTsKKwkJCWNzYS0+cHJpdjIuc3B1cVtpXS5tZmNfY3FfZGF0YTFfUlcgPQorCQkJICAgIGluX2JlNjQoJnByaXYyLT5zcHVxW2ldLm1mY19jcV9kYXRhMV9SVyk7CisJCQljc2EtPnByaXYyLnNwdXFbaV0ubWZjX2NxX2RhdGEyX1JXID0KKwkJCSAgICBpbl9iZTY0KCZwcml2Mi0+c3B1cVtpXS5tZmNfY3FfZGF0YTJfUlcpOworCQkJY3NhLT5wcml2Mi5zcHVxW2ldLm1mY19jcV9kYXRhM19SVyA9CisJCQkgICAgaW5fYmU2NCgmcHJpdjItPnNwdXFbaV0ubWZjX2NxX2RhdGEzX1JXKTsKKwkJfQorCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfcHB1X3F1ZXJ5bWFzayhzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3Byb2JsZW0gX19pb21lbSAqcHJvYiA9IHNwdS0+cHJvYmxlbTsKKworCS8qIFNhdmUsIFN0ZXAgMjA6CisJICogICAgIFNhdmUgdGhlIFBQVV9RdWVyeU1hc2sgcmVnaXN0ZXIKKwkgKiAgICAgaW4gdGhlIENTQS4KKwkgKi8KKwljc2EtPnByb2IuZG1hX3F1ZXJ5bWFza19SVyA9IGluX2JlMzIoJnByb2ItPmRtYV9xdWVyeW1hc2tfUlcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9wcHVfcXVlcnl0eXBlKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCXN0cnVjdCBzcHVfcHJvYmxlbSBfX2lvbWVtICpwcm9iID0gc3B1LT5wcm9ibGVtOworCisJLyogU2F2ZSwgU3RlcCAyMToKKwkgKiAgICAgU2F2ZSB0aGUgUFBVX1F1ZXJ5VHlwZSByZWdpc3RlcgorCSAqICAgICBpbiB0aGUgQ1NBLgorCSAqLworCWNzYS0+cHJvYi5kbWFfcXVlcnl0eXBlX1JXID0gaW5fYmUzMigmcHJvYi0+ZG1hX3F1ZXJ5dHlwZV9SVyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYXZlX21mY19jc3JfdHNxKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCXN0cnVjdCBzcHVfcHJpdjIgX19pb21lbSAqcHJpdjIgPSBzcHUtPnByaXYyOworCisJLyogU2F2ZSwgU3RlcCAyMjoKKwkgKiAgICAgU2F2ZSB0aGUgTUZDX0NTUl9UU1EgcmVnaXN0ZXIKKwkgKiAgICAgaW4gdGhlIExTQ1NBLgorCSAqLworCWNzYS0+cHJpdjIuc3B1X3RhZ19zdGF0dXNfcXVlcnlfUlcgPQorCSAgICBpbl9iZTY0KCZwcml2Mi0+c3B1X3RhZ19zdGF0dXNfcXVlcnlfUlcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9tZmNfY3NyX2NtZChzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyID0gc3B1LT5wcml2MjsKKworCS8qIFNhdmUsIFN0ZXAgMjM6CisJICogICAgIFNhdmUgdGhlIE1GQ19DU1JfQ01EMSBhbmQgTUZDX0NTUl9DTUQyCisJICogICAgIHJlZ2lzdGVycyBpbiB0aGUgQ1NBLgorCSAqLworCWNzYS0+cHJpdjIuc3B1X2NtZF9idWYxX1JXID0gaW5fYmU2NCgmcHJpdjItPnNwdV9jbWRfYnVmMV9SVyk7CisJY3NhLT5wcml2Mi5zcHVfY21kX2J1ZjJfUlcgPSBpbl9iZTY0KCZwcml2Mi0+c3B1X2NtZF9idWYyX1JXKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfbWZjX2Nzcl9hdG8oc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcml2MiBfX2lvbWVtICpwcml2MiA9IHNwdS0+cHJpdjI7CisKKwkvKiBTYXZlLCBTdGVwIDI0OgorCSAqICAgICBTYXZlIHRoZSBNRkNfQ1NSX0FUTyByZWdpc3RlciBpbgorCSAqICAgICB0aGUgQ1NBLgorCSAqLworCWNzYS0+cHJpdjIuc3B1X2F0b21pY19zdGF0dXNfUlcgPSBpbl9iZTY0KCZwcml2Mi0+c3B1X2F0b21pY19zdGF0dXNfUlcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9tZmNfdGNsYXNzX2lkKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCS8qIFNhdmUsIFN0ZXAgMjU6CisJICogICAgIFNhdmUgdGhlIE1GQ19UQ0xBU1NfSUQgcmVnaXN0ZXIgaW4KKwkgKiAgICAgdGhlIENTQS4KKwkgKi8KKwljc2EtPnByaXYxLm1mY190Y2xhc3NfaWRfUlcgPSBzcHVfbWZjX3RjbGFzc19pZF9nZXQoc3B1KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9tZmNfdGNsYXNzX2lkKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCS8qIFNhdmUsIFN0ZXAgMjY6CisJICogUmVzdG9yZSwgU3RlcCAyMy4KKwkgKiAgICAgV3JpdGUgdGhlIE1GQ19UQ0xBU1NfSUQgcmVnaXN0ZXIgd2l0aAorCSAqICAgICB0aGUgdmFsdWUgMHgxMDAwMDAwMC4KKwkgKi8KKwlzcHVfbWZjX3RjbGFzc19pZF9zZXQoc3B1LCAweDEwMDAwMDAwKTsKKwllaWVpbygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHVyZ2VfbWZjX3F1ZXVlKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCXN0cnVjdCBzcHVfcHJpdjIgX19pb21lbSAqcHJpdjIgPSBzcHUtPnByaXYyOworCisJLyogU2F2ZSwgU3RlcCAyNzoKKwkgKiBSZXN0b3JlLCBTdGVwIDE0LgorCSAqICAgICBXcml0ZSBNRkNfQ05UTFtQY109MSAocHVyZ2UgcXVldWUpLgorCSAqLworCW91dF9iZTY0KCZwcml2Mi0+bWZjX2NvbnRyb2xfUlcsIE1GQ19DTlRMX1BVUkdFX0RNQV9SRVFVRVNUKTsKKwllaWVpbygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2FpdF9wdXJnZV9jb21wbGV0ZShzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyID0gc3B1LT5wcml2MjsKKworCS8qIFNhdmUsIFN0ZXAgMjg6CisJICogICAgIFBvbGwgTUZDX0NOVExbUHNdIHVudGlsIHZhbHVlICcxMScgaXMgcmVhZAorCSAqICAgICAocHVyZ2UgY29tcGxldGUpLgorCSAqLworCVBPTExfV0hJTEVfRkFMU0UoaW5fYmU2NCgmcHJpdjItPm1mY19jb250cm9sX1JXKSAmCisJCQkgTUZDX0NOVExfUFVSR0VfRE1BX0NPTVBMRVRFKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfbWZjX3NsYnMoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcml2MiBfX2lvbWVtICpwcml2MiA9IHNwdS0+cHJpdjI7CisJaW50IGk7CisKKwkvKiBTYXZlLCBTdGVwIDI5OgorCSAqICAgICBJZiBNRkNfU1IxW1JdPScxJywgc2F2ZSBTTEJzIGluIENTQS4KKwkgKi8KKwlpZiAoc3B1X21mY19zcjFfZ2V0KHNwdSkgJiBNRkNfU1RBVEUxX1JFTE9DQVRFX01BU0spIHsKKwkJY3NhLT5wcml2Mi5zbGJfaW5kZXhfVyA9IGluX2JlNjQoJnByaXYyLT5zbGJfaW5kZXhfVyk7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCW91dF9iZTY0KCZwcml2Mi0+c2xiX2luZGV4X1csIGkpOworCQkJZWllaW8oKTsKKwkJCWNzYS0+c2xiX2VzaWRfUldbaV0gPSBpbl9iZTY0KCZwcml2Mi0+c2xiX2VzaWRfUlcpOworCQkJY3NhLT5zbGJfdnNpZF9SV1tpXSA9IGluX2JlNjQoJnByaXYyLT5zbGJfdnNpZF9SVyk7CisJCQllaWVpbygpOworCQl9CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfbWZjX3NyMShzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwkvKiBTYXZlLCBTdGVwIDMwOgorCSAqIFJlc3RvcmUsIFN0ZXAgMTg6CisJICogICAgIFdyaXRlIE1GQ19TUjEgd2l0aCBNRkNfU1IxW0Q9MCxTPTFdIGFuZAorCSAqICAgICBNRkNfU1IxW1RMLFIsUHIsVF0gc2V0IGNvcnJlY3RseSBmb3IgdGhlCisJICogICAgIE9TIHNwZWNpZmljIGVudmlyb25tZW50LgorCSAqCisJICogICAgIEltcGxlbWVudGF0aW9uIG5vdGU6IFRoZSBTUFUtc2lkZSBjb2RlCisJICogICAgIGZvciBzYXZlL3Jlc3RvcmUgaXMgcHJpdmlsZWdlZCwgc28gdGhlCisJICogICAgIE1GQ19TUjFbUHJdIGJpdCBpcyBub3Qgc2V0LgorCSAqCisJICovCisJc3B1X21mY19zcjFfc2V0KHNwdSwgKE1GQ19TVEFURTFfTUFTVEVSX1JVTl9DT05UUk9MX01BU0sgfAorCQkJICAgICAgTUZDX1NUQVRFMV9SRUxPQ0FURV9NQVNLIHwKKwkJCSAgICAgIE1GQ19TVEFURTFfQlVTX1RMQklFX01BU0spKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfc3B1X25wYyhzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3Byb2JsZW0gX19pb21lbSAqcHJvYiA9IHNwdS0+cHJvYmxlbTsKKworCS8qIFNhdmUsIFN0ZXAgMzE6CisJICogICAgIFNhdmUgU1BVX05QQyBpbiB0aGUgQ1NBLgorCSAqLworCWNzYS0+cHJvYi5zcHVfbnBjX1JXID0gaW5fYmUzMigmcHJvYi0+c3B1X25wY19SVyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYXZlX3NwdV9wcml2Y250bChzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyID0gc3B1LT5wcml2MjsKKworCS8qIFNhdmUsIFN0ZXAgMzI6CisJICogICAgIFNhdmUgU1BVX1ByaXZDbnRsIGluIHRoZSBDU0EuCisJICovCisJY3NhLT5wcml2Mi5zcHVfcHJpdmNudGxfUlcgPSBpbl9iZTY0KCZwcml2Mi0+c3B1X3ByaXZjbnRsX1JXKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc2V0X3NwdV9wcml2Y250bChzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyID0gc3B1LT5wcml2MjsKKworCS8qIFNhdmUsIFN0ZXAgMzM6CisJICogUmVzdG9yZSwgU3RlcCAxNjoKKwkgKiAgICAgV3JpdGUgU1BVX1ByaXZDbnRsW1MsTGUsQV0gZmllbGRzIHJlc2V0IHRvIDAuCisJICovCisJb3V0X2JlNjQoJnByaXYyLT5zcHVfcHJpdmNudGxfUlcsIDBVTCk7CisJZWllaW8oKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfc3B1X2xzbHIoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcml2MiBfX2lvbWVtICpwcml2MiA9IHNwdS0+cHJpdjI7CisKKwkvKiBTYXZlLCBTdGVwIDM0OgorCSAqICAgICBTYXZlIFNQVV9MU0xSIGluIHRoZSBDU0EuCisJICovCisJY3NhLT5wcml2Mi5zcHVfbHNscl9SVyA9IGluX2JlNjQoJnByaXYyLT5zcHVfbHNscl9SVyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXNldF9zcHVfbHNscihzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyID0gc3B1LT5wcml2MjsKKworCS8qIFNhdmUsIFN0ZXAgMzU6CisJICogUmVzdG9yZSwgU3RlcCAxNy4KKwkgKiAgICAgUmVzZXQgU1BVX0xTTFIuCisJICovCisJb3V0X2JlNjQoJnByaXYyLT5zcHVfbHNscl9SVywgTFNfQUREUl9NQVNLKTsKKwllaWVpbygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9zcHVfY2ZnKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCXN0cnVjdCBzcHVfcHJpdjIgX19pb21lbSAqcHJpdjIgPSBzcHUtPnByaXYyOworCisJLyogU2F2ZSwgU3RlcCAzNjoKKwkgKiAgICAgU2F2ZSBTUFVfQ2ZnIGluIHRoZSBDU0EuCisJICovCisJY3NhLT5wcml2Mi5zcHVfY2ZnX1JXID0gaW5fYmU2NCgmcHJpdjItPnNwdV9jZmdfUlcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9wbV90cmFjZShzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwkvKiBTYXZlLCBTdGVwIDM3OgorCSAqICAgICBTYXZlIFBNX1RyYWNlX1RhZ19XYWl0X01hc2sgaW4gdGhlIENTQS4KKwkgKiAgICAgTm90IHBlcmZvcm1lZCBieSB0aGlzIGltcGxlbWVudGF0aW9uLgorCSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9tZmNfcmFnKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCS8qIFNhdmUsIFN0ZXAgMzg6CisJICogICAgIFNhdmUgUkFfR1JPVVBfSUQgcmVnaXN0ZXIgYW5kIHRoZQorCSAqICAgICBSQV9FTkFCTEUgcmVpZ3N0ZXIgaW4gdGhlIENTQS4KKwkgKi8KKwljc2EtPnByaXYxLnJlc291cmNlX2FsbG9jYXRpb25fZ3JvdXBJRF9SVyA9CisJCXNwdV9yZXNvdXJjZV9hbGxvY2F0aW9uX2dyb3VwSURfZ2V0KHNwdSk7CisJY3NhLT5wcml2MS5yZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9SVyA9CisJCXNwdV9yZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9nZXQoc3B1KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfcHB1X21iX3N0YXQoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcm9ibGVtIF9faW9tZW0gKnByb2IgPSBzcHUtPnByb2JsZW07CisKKwkvKiBTYXZlLCBTdGVwIDM5OgorCSAqICAgICBTYXZlIE1CX1N0YXQgcmVnaXN0ZXIgaW4gdGhlIENTQS4KKwkgKi8KKwljc2EtPnByb2IubWJfc3RhdF9SID0gaW5fYmUzMigmcHJvYi0+bWJfc3RhdF9SKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfcHB1X21iKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCXN0cnVjdCBzcHVfcHJvYmxlbSBfX2lvbWVtICpwcm9iID0gc3B1LT5wcm9ibGVtOworCisJLyogU2F2ZSwgU3RlcCA0MDoKKwkgKiAgICAgU2F2ZSB0aGUgUFBVX01CIHJlZ2lzdGVyIGluIHRoZSBDU0EuCisJICovCisJY3NhLT5wcm9iLnB1X21iX1IgPSBpbl9iZTMyKCZwcm9iLT5wdV9tYl9SKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfcHB1aW50X21iKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCXN0cnVjdCBzcHVfcHJpdjIgX19pb21lbSAqcHJpdjIgPSBzcHUtPnByaXYyOworCisJLyogU2F2ZSwgU3RlcCA0MToKKwkgKiAgICAgU2F2ZSB0aGUgUFBVSU5UX01CIHJlZ2lzdGVyIGluIHRoZSBDU0EuCisJICovCisJY3NhLT5wcml2Mi5wdWludF9tYl9SID0gaW5fYmU2NCgmcHJpdjItPnB1aW50X21iX1IpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9jaF9wYXJ0MShzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyID0gc3B1LT5wcml2MjsKKwl1NjQgaWR4LCBjaF9pbmRpY2VzWzddID0geyAwVUwsIDFVTCwgM1VMLCA0VUwsIDI0VUwsIDI1VUwsIDI3VUwgfTsKKwlpbnQgaTsKKworCS8qIFNhdmUsIFN0ZXAgNDI6CisJICogICAgIFNhdmUgdGhlIGZvbGxvd2luZyBDSDogWzAsMSwzLDQsMjQsMjUsMjddCisJICovCisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQlpZHggPSBjaF9pbmRpY2VzW2ldOworCQlvdXRfYmU2NCgmcHJpdjItPnNwdV9jaG5sY250cHRyX1JXLCBpZHgpOworCQllaWVpbygpOworCQljc2EtPnNwdV9jaG5sZGF0YV9SV1tpZHhdID0gaW5fYmU2NCgmcHJpdjItPnNwdV9jaG5sZGF0YV9SVyk7CisJCWNzYS0+c3B1X2NobmxjbnRfUldbaWR4XSA9IGluX2JlNjQoJnByaXYyLT5zcHVfY2hubGNudF9SVyk7CisJCW91dF9iZTY0KCZwcml2Mi0+c3B1X2NobmxkYXRhX1JXLCAwVUwpOworCQlvdXRfYmU2NCgmcHJpdjItPnNwdV9jaG5sY250X1JXLCAwVUwpOworCQllaWVpbygpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfc3B1X21iKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCXN0cnVjdCBzcHVfcHJpdjIgX19pb21lbSAqcHJpdjIgPSBzcHUtPnByaXYyOworCWludCBpOworCisJLyogU2F2ZSwgU3RlcCA0MzoKKwkgKiAgICAgU2F2ZSBTUFUgUmVhZCBNYWlsYm94IENoYW5uZWwuCisJICovCisJb3V0X2JlNjQoJnByaXYyLT5zcHVfY2hubGNudHB0cl9SVywgMjlVTCk7CisJZWllaW8oKTsKKwljc2EtPnNwdV9jaG5sY250X1JXWzI5XSA9IGluX2JlNjQoJnByaXYyLT5zcHVfY2hubGNudF9SVyk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQljc2EtPnNwdV9tYWlsYm94X2RhdGFbaV0gPSBpbl9iZTY0KCZwcml2Mi0+c3B1X2NobmxkYXRhX1JXKTsKKwl9CisJb3V0X2JlNjQoJnByaXYyLT5zcHVfY2hubGNudF9SVywgMFVMKTsKKwllaWVpbygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9tZmNfY21kKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCXN0cnVjdCBzcHVfcHJpdjIgX19pb21lbSAqcHJpdjIgPSBzcHUtPnByaXYyOworCisJLyogU2F2ZSwgU3RlcCA0NDoKKwkgKiAgICAgU2F2ZSBNRkNfQ01EIENoYW5uZWwuCisJICovCisJb3V0X2JlNjQoJnByaXYyLT5zcHVfY2hubGNudHB0cl9SVywgMjFVTCk7CisJZWllaW8oKTsKKwljc2EtPnNwdV9jaG5sY250X1JXWzIxXSA9IGluX2JlNjQoJnByaXYyLT5zcHVfY2hubGNudF9SVyk7CisJZWllaW8oKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc2V0X2NoKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCXN0cnVjdCBzcHVfcHJpdjIgX19pb21lbSAqcHJpdjIgPSBzcHUtPnByaXYyOworCXU2NCBjaF9pbmRpY2VzWzRdID0geyAyMVVMLCAyM1VMLCAyOFVMLCAzMFVMIH07CisJdTY0IGNoX2NvdW50c1s0XSA9IHsgMTZVTCwgMVVMLCAxVUwsIDFVTCB9OworCXU2NCBpZHg7CisJaW50IGk7CisKKwkvKiBTYXZlLCBTdGVwIDQ1OgorCSAqICAgICBSZXNldCB0aGUgZm9sbG93aW5nIENIOiBbMjEsIDIzLCAyOCwgMzBdCisJICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZHggPSBjaF9pbmRpY2VzW2ldOworCQlvdXRfYmU2NCgmcHJpdjItPnNwdV9jaG5sY250cHRyX1JXLCBpZHgpOworCQllaWVpbygpOworCQlvdXRfYmU2NCgmcHJpdjItPnNwdV9jaG5sY250X1JXLCBjaF9jb3VudHNbaV0pOworCQllaWVpbygpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc3VtZV9tZmNfcXVldWUoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcml2MiBfX2lvbWVtICpwcml2MiA9IHNwdS0+cHJpdjI7CisKKwkvKiBTYXZlLCBTdGVwIDQ2OgorCSAqIFJlc3RvcmUsIFN0ZXAgMjUuCisJICogICAgIFdyaXRlIE1GQ19DTlRMW1NjXT0wIChyZXN1bWUgcXVldWUgcHJvY2Vzc2luZykuCisJICovCisJb3V0X2JlNjQoJnByaXYyLT5tZmNfY29udHJvbF9SVywgTUZDX0NOVExfUkVTVU1FX0RNQV9RVUVVRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnZhbGlkYXRlX3NsYnMoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcml2MiBfX2lvbWVtICpwcml2MiA9IHNwdS0+cHJpdjI7CisKKwkvKiBTYXZlLCBTdGVwIDQ1OgorCSAqIFJlc3RvcmUsIFN0ZXAgMTk6CisJICogICAgIElmIE1GQ19TUjFbUl09MSwgd3JpdGUgMCB0byBTTEJfSW52YWxpZGF0ZV9BbGwuCisJICovCisJaWYgKHNwdV9tZmNfc3IxX2dldChzcHUpICYgTUZDX1NUQVRFMV9SRUxPQ0FURV9NQVNLKSB7CisJCW91dF9iZTY0KCZwcml2Mi0+c2xiX2ludmFsaWRhdGVfYWxsX1csIDBVTCk7CisJCWVpZWlvKCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2tlcm5lbF9zbGIodTY0IGVhLCB1NjQgc2xiWzJdKQoreworCXNsYlswXSA9IChnZXRfa2VybmVsX3ZzaWQoZWEpIDw8IFNMQl9WU0lEX1NISUZUKSB8IFNMQl9WU0lEX0tFUk5FTDsKKwlzbGJbMV0gPSAoZWEgJiBFU0lEX01BU0spIHwgU0xCX0VTSURfVjsKKworCS8qIExhcmdlIHBhZ2VzIGFyZSB1c2VkIGZvciBrZXJuZWwgdGV4dC9kYXRhLCBidXQgbm90IHZtYWxsb2MuICAqLworCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl8xNk1fUEFHRSkKKwkgICAgJiYgUkVHSU9OX0lEKGVhKSA9PSBLRVJORUxfUkVHSU9OX0lEKQorCQlzbGJbMF0gfD0gU0xCX1ZTSURfTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxvYWRfbWZjX3NsYihzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCBzbGJbMl0sIGludCBzbGJlKQoreworCXN0cnVjdCBzcHVfcHJpdjIgX19pb21lbSAqcHJpdjIgPSBzcHUtPnByaXYyOworCisJb3V0X2JlNjQoJnByaXYyLT5zbGJfaW5kZXhfVywgc2xiZSk7CisJZWllaW8oKTsKKwlvdXRfYmU2NCgmcHJpdjItPnNsYl92c2lkX1JXLCBzbGJbMF0pOworCW91dF9iZTY0KCZwcml2Mi0+c2xiX2VzaWRfUlcsIHNsYlsxXSk7CisJZWllaW8oKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldHVwX21mY19zbGJzKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCXU2NCBjb2RlX3NsYlsyXTsKKwl1NjQgbHNjc2Ffc2xiWzJdOworCisJLyogU2F2ZSwgU3RlcCA0NzoKKwkgKiBSZXN0b3JlLCBTdGVwIDMwLgorCSAqICAgICBJZiBNRkNfU1IxW1JdPTEsIHdyaXRlIDAgdG8gU0xCX0ludmFsaWRhdGVfQWxsCisJICogICAgIHJlZ2lzdGVyLCB0aGVuIGluaXRpYWxpemUgU0xCX1ZTSUQgYW5kIFNMQl9FU0lECisJICogICAgIHRvIHByb3ZpZGUgYWNjZXNzIHRvIFNQVSBjb250ZXh0IHNhdmUgY29kZSBhbmQKKwkgKiAgICAgTFNDU0EuCisJICoKKwkgKiAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBwbGFjZXMgYm90aCB0aGUgY29udGV4dAorCSAqICAgICBzd2l0Y2ggY29kZSBhbmQgTFNDU0EgaW4ga2VybmVsIGFkZHJlc3Mgc3BhY2UuCisJICoKKwkgKiAgICAgRnVydGhlciB0aGlzIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhhdCB0aGUKKwkgKiAgICAgTUZDX1NSMVtSXT0xIChpbiBvdGhlciB3b3JkcywgYXNzdW1lIHRoYXQKKwkgKiAgICAgdHJhbnNsYXRpb24gaXMgZGVzaXJlZCBieSBPUyBlbnZpcm9ubWVudCkuCisJICovCisJaW52YWxpZGF0ZV9zbGJzKGNzYSwgc3B1KTsKKwlnZXRfa2VybmVsX3NsYigodW5zaWduZWQgbG9uZykmc3B1X3NhdmVfY29kZVswXSwgY29kZV9zbGIpOworCWdldF9rZXJuZWxfc2xiKCh1bnNpZ25lZCBsb25nKWNzYS0+bHNjc2EsIGxzY3NhX3NsYik7CisJbG9hZF9tZmNfc2xiKHNwdSwgY29kZV9zbGIsIDApOworCWlmICgobHNjc2Ffc2xiWzBdICE9IGNvZGVfc2xiWzBdKSB8fCAobHNjc2Ffc2xiWzFdICE9IGNvZGVfc2xiWzFdKSkKKwkJbG9hZF9tZmNfc2xiKHNwdSwgbHNjc2Ffc2xiLCAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9zd2l0Y2hfYWN0aXZlKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCS8qIFNhdmUsIFN0ZXAgNDg6CisJICogUmVzdG9yZSwgU3RlcCAyMy4KKwkgKiAgICAgQ2hhbmdlIHRoZSBzb2Z0d2FyZSBjb250ZXh0IHN3aXRjaCBwZW5kaW5nIGZsYWcKKwkgKiAgICAgdG8gY29udGV4dCBzd2l0Y2ggYWN0aXZlLgorCSAqLworCXNldF9iaXQoU1BVX0NPTlRFWFRfU1dJVENIX0FDVElWRSwgJnNwdS0+ZmxhZ3MpOworCWNsZWFyX2JpdChTUFVfQ09OVEVYVF9TV0lUQ0hfUEVORElORywgJnNwdS0+ZmxhZ3MpOworCW1iKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfaW50ZXJydXB0cyhzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGNsYXNzMV9tYXNrID0gQ0xBU1MxX0VOQUJMRV9TRUdNRU5UX0ZBVUxUX0lOVFIgfAorCSAgICBDTEFTUzFfRU5BQkxFX1NUT1JBR0VfRkFVTFRfSU5UUjsKKworCS8qIFNhdmUsIFN0ZXAgNDk6CisJICogUmVzdG9yZSwgU3RlcCAyMjoKKwkgKiAgICAgUmVzZXQgYW5kIHRoZW4gZW5hYmxlIGludGVycnVwdHMsIGFzCisJICogICAgIG5lZWRlZCBieSBPUy4KKwkgKgorCSAqICAgICBUaGlzIGltcGxlbWVudGF0aW9uIGVuYWJsZXMgb25seSBjbGFzczEKKwkgKiAgICAgKHRyYW5zbGF0aW9uKSBpbnRlcnJ1cHRzLgorCSAqLworCXNwaW5fbG9ja19pcnEoJnNwdS0+cmVnaXN0ZXJfbG9jayk7CisJc3B1X2ludF9zdGF0X2NsZWFyKHNwdSwgMCwgfjB1bCk7CisJc3B1X2ludF9zdGF0X2NsZWFyKHNwdSwgMSwgfjB1bCk7CisJc3B1X2ludF9zdGF0X2NsZWFyKHNwdSwgMiwgfjB1bCk7CisJc3B1X2ludF9tYXNrX3NldChzcHUsIDAsIDB1bCk7CisJc3B1X2ludF9tYXNrX3NldChzcHUsIDEsIGNsYXNzMV9tYXNrKTsKKwlzcHVfaW50X21hc2tfc2V0KHNwdSwgMiwgMHVsKTsKKwlzcGluX3VubG9ja19pcnEoJnNwdS0+cmVnaXN0ZXJfbG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNlbmRfbWZjX2RtYShzdHJ1Y3Qgc3B1ICpzcHUsIHVuc2lnbmVkIGxvbmcgZWEsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGxzX29mZnNldCwgdW5zaWduZWQgaW50IHNpemUsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHRhZywgdW5zaWduZWQgaW50IHJjbGFzcywKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kKQoreworCXN0cnVjdCBzcHVfcHJvYmxlbSBfX2lvbWVtICpwcm9iID0gc3B1LT5wcm9ibGVtOworCXVuaW9uIG1mY190YWdfc2l6ZV9jbGFzc19jbWQgY29tbWFuZDsKKwl1bnNpZ25lZCBpbnQgdHJhbnNmZXJfc2l6ZTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc3RhdHVzID0gMHgwOworCisJd2hpbGUgKHNpemUgPiAwKSB7CisJCXRyYW5zZmVyX3NpemUgPQorCQkgICAgKHNpemUgPiBNRkNfTUFYX0RNQV9TSVpFKSA/IE1GQ19NQVhfRE1BX1NJWkUgOiBzaXplOworCQljb21tYW5kLnUubWZjX3NpemUgPSB0cmFuc2Zlcl9zaXplOworCQljb21tYW5kLnUubWZjX3RhZyA9IHRhZzsKKwkJY29tbWFuZC51Lm1mY19yY2xhc3NpZCA9IHJjbGFzczsKKwkJY29tbWFuZC51Lm1mY19jbWQgPSBjbWQ7CisJCWRvIHsKKwkJCW91dF9iZTMyKCZwcm9iLT5tZmNfbHNhX1csIGxzX29mZnNldCk7CisJCQlvdXRfYmU2NCgmcHJvYi0+bWZjX2VhX1csIGVhKTsKKwkJCW91dF9iZTY0KCZwcm9iLT5tZmNfdW5pb25fVy5hbGw2NCwgY29tbWFuZC5hbGw2NCk7CisJCQlzdGF0dXMgPQorCQkJICAgIGluX2JlMzIoJnByb2ItPm1mY191bmlvbl9XLmJ5MzIubWZjX2NsYXNzX2NtZDMyKTsKKwkJCWlmICh1bmxpa2VseShzdGF0dXMgJiAweDIpKSB7CisJCQkJY3B1X3JlbGF4KCk7CisJCQl9CisJCX0gd2hpbGUgKHN0YXR1cyAmIDB4Myk7CisJCXNpemUgLT0gdHJhbnNmZXJfc2l6ZTsKKwkJZWEgKz0gdHJhbnNmZXJfc2l6ZTsKKwkJbHNfb2Zmc2V0ICs9IHRyYW5zZmVyX3NpemU7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9sc18xNmtiKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKSZjc2EtPmxzY3NhLT5sc1swXTsKKwl1bnNpZ25lZCBpbnQgbHNfb2Zmc2V0ID0gMHgwOworCXVuc2lnbmVkIGludCBzaXplID0gMTYzODQ7CisJdW5zaWduZWQgaW50IHRhZyA9IDA7CisJdW5zaWduZWQgaW50IHJjbGFzcyA9IDA7CisJdW5zaWduZWQgaW50IGNtZCA9IE1GQ19QVVRfQ01EOworCisJLyogU2F2ZSwgU3RlcCA1MDoKKwkgKiAgICAgSXNzdWUgYSBETUEgY29tbWFuZCB0byBjb3B5IHRoZSBmaXJzdCAxNksgYnl0ZXMKKwkgKiAgICAgb2YgbG9jYWwgc3RvcmFnZSB0byB0aGUgQ1NBLgorCSAqLworCXNlbmRfbWZjX2RtYShzcHUsIGFkZHIsIGxzX29mZnNldCwgc2l6ZSwgdGFnLCByY2xhc3MsIGNtZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc3B1X25wYyhzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3Byb2JsZW0gX19pb21lbSAqcHJvYiA9IHNwdS0+cHJvYmxlbTsKKworCS8qIFNhdmUsIFN0ZXAgNTE6CisJICogUmVzdG9yZSwgU3RlcCAzMS4KKwkgKiAgICAgV3JpdGUgU1BVX05QQ1tJRV09MCBhbmQgU1BVX05QQ1tMU0FdIHRvIGVudHJ5CisJICogICAgIHBvaW50IGFkZHJlc3Mgb2YgY29udGV4dCBzYXZlIGNvZGUgaW4gbG9jYWwKKwkgKiAgICAgc3RvcmFnZS4KKwkgKgorCSAqICAgICBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgU1BVLXNpZGUgc2F2ZS9yZXN0b3JlCisJICogICAgIHByb2dyYW1zIHdpdGggZW50cnkgcG9pbnRzIGF0IExTQSBvZiAwLgorCSAqLworCW91dF9iZTMyKCZwcm9iLT5zcHVfbnBjX1JXLCAwKTsKKwllaWVpbygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3NpZ25vdDEoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcm9ibGVtIF9faW9tZW0gKnByb2IgPSBzcHUtPnByb2JsZW07CisJdW5pb24geworCQl1NjQgdWxsOworCQl1MzIgdWlbMl07CisJfSBhZGRyNjQ7CisKKwkvKiBTYXZlLCBTdGVwIDUyOgorCSAqIFJlc3RvcmUsIFN0ZXAgMzI6CisJICogICAgV3JpdGUgU1BVX1NpZ19Ob3RpZnlfMSByZWdpc3RlciB3aXRoIHVwcGVyIDMyLWJpdHMKKwkgKiAgICBvZiB0aGUgQ1NBLkxTQ1NBIGVmZmVjdGl2ZSBhZGRyZXNzLgorCSAqLworCWFkZHI2NC51bGwgPSAodTY0KSBjc2EtPmxzY3NhOworCW91dF9iZTMyKCZwcm9iLT5zaWduYWxfbm90aWZ5MSwgYWRkcjY0LnVpWzBdKTsKKwllaWVpbygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3NpZ25vdDIoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcm9ibGVtIF9faW9tZW0gKnByb2IgPSBzcHUtPnByb2JsZW07CisJdW5pb24geworCQl1NjQgdWxsOworCQl1MzIgdWlbMl07CisJfSBhZGRyNjQ7CisKKwkvKiBTYXZlLCBTdGVwIDUzOgorCSAqIFJlc3RvcmUsIFN0ZXAgMzM6CisJICogICAgV3JpdGUgU1BVX1NpZ19Ob3RpZnlfMiByZWdpc3RlciB3aXRoIGxvd2VyIDMyLWJpdHMKKwkgKiAgICBvZiB0aGUgQ1NBLkxTQ1NBIGVmZmVjdGl2ZSBhZGRyZXNzLgorCSAqLworCWFkZHI2NC51bGwgPSAodTY0KSBjc2EtPmxzY3NhOworCW91dF9iZTMyKCZwcm9iLT5zaWduYWxfbm90aWZ5MiwgYWRkcjY0LnVpWzFdKTsKKwllaWVpbygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2VuZF9zYXZlX2NvZGUoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpJnNwdV9zYXZlX2NvZGVbMF07CisJdW5zaWduZWQgaW50IGxzX29mZnNldCA9IDB4MDsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IHNpemVvZihzcHVfc2F2ZV9jb2RlKTsKKwl1bnNpZ25lZCBpbnQgdGFnID0gMDsKKwl1bnNpZ25lZCBpbnQgcmNsYXNzID0gMDsKKwl1bnNpZ25lZCBpbnQgY21kID0gTUZDX0dFVEZTX0NNRDsKKworCS8qIFNhdmUsIFN0ZXAgNTQ6CisJICogICAgIElzc3VlIGEgRE1BIGNvbW1hbmQgdG8gY29weSBjb250ZXh0IHNhdmUgY29kZQorCSAqICAgICB0byBsb2NhbCBzdG9yYWdlIGFuZCBzdGFydCBTUFUuCisJICovCisJc2VuZF9tZmNfZG1hKHNwdSwgYWRkciwgbHNfb2Zmc2V0LCBzaXplLCB0YWcsIHJjbGFzcywgY21kKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9wcHVfcXVlcnltYXNrKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCXN0cnVjdCBzcHVfcHJvYmxlbSBfX2lvbWVtICpwcm9iID0gc3B1LT5wcm9ibGVtOworCisJLyogU2F2ZSwgU3RlcCA1NToKKwkgKiBSZXN0b3JlLCBTdGVwIDM4LgorCSAqICAgICBXcml0ZSBQUFVfUXVlcnlNYXNrPTEgKGVuYWJsZSBUYWcgR3JvdXAgMCkKKwkgKiAgICAgYW5kIGlzc3VlIGVpZWlvIGluc3RydWN0aW9uLgorCSAqLworCW91dF9iZTMyKCZwcm9iLT5kbWFfcXVlcnltYXNrX1JXLCBNRkNfVEFHSURfVE9fVEFHTUFTSygwKSk7CisJZWllaW8oKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdhaXRfdGFnX2NvbXBsZXRlKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCXN0cnVjdCBzcHVfcHJvYmxlbSBfX2lvbWVtICpwcm9iID0gc3B1LT5wcm9ibGVtOworCXUzMiBtYXNrID0gTUZDX1RBR0lEX1RPX1RBR01BU0soMCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFNhdmUsIFN0ZXAgNTY6CisJICogUmVzdG9yZSwgU3RlcCAzOS4KKwkgKiBSZXN0b3JlLCBTdGVwIDM5LgorCSAqIFJlc3RvcmUsIFN0ZXAgNDYuCisJICogICAgIFBvbGwgUFBVX1RhZ1N0YXR1c1tnbl0gdW50aWwgMDEgKFRhZyBncm91cCAwIGNvbXBsZXRlKQorCSAqICAgICBvciB3cml0ZSBQUFVfUXVlcnlUeXBlW1RTXT0wMSBhbmQgd2FpdCBmb3IgVGFnIEdyb3VwCisJICogICAgIENvbXBsZXRlIEludGVycnVwdC4gIFdyaXRlIElOVF9TdGF0X0NsYXNzMCBvcgorCSAqICAgICBJTlRfU3RhdF9DbGFzczIgd2l0aCB2YWx1ZSBvZiAnaGFuZGxlZCcuCisJICovCisJUE9MTF9XSElMRV9GQUxTRShpbl9iZTMyKCZwcm9iLT5kbWFfdGFnc3RhdHVzX1IpICYgbWFzayk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJc3B1X2ludF9zdGF0X2NsZWFyKHNwdSwgMCwgfigwdWwpKTsKKwlzcHVfaW50X3N0YXRfY2xlYXIoc3B1LCAyLCB+KDB1bCkpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdhaXRfc3B1X3N0b3BwZWQoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcm9ibGVtIF9faW9tZW0gKnByb2IgPSBzcHUtPnByb2JsZW07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFNhdmUsIFN0ZXAgNTc6CisJICogUmVzdG9yZSwgU3RlcCA0MC4KKwkgKiAgICAgUG9sbCB1bnRpbCBTUFVfU3RhdHVzW1JdPTAgb3Igd2FpdCBmb3IgU1BVIENsYXNzIDAKKwkgKiAgICAgb3IgU1BVIENsYXNzIDIgaW50ZXJydXB0LiAgV3JpdGUgSU5UX1N0YXRfY2xhc3MwCisJICogICAgIG9yIElOVF9TdGF0X2NsYXNzMiB3aXRoIHZhbHVlIG9mIGhhbmRsZWQuCisJICovCisJUE9MTF9XSElMRV9UUlVFKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgJiBTUFVfU1RBVFVTX1JVTk5JTkcpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXNwdV9pbnRfc3RhdF9jbGVhcihzcHUsIDAsIH4oMHVsKSk7CisJc3B1X2ludF9zdGF0X2NsZWFyKHNwdSwgMiwgfigwdWwpKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3NhdmVfc3RhdHVzKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCXN0cnVjdCBzcHVfcHJvYmxlbSBfX2lvbWVtICpwcm9iID0gc3B1LT5wcm9ibGVtOworCXUzMiBjb21wbGV0ZTsKKworCS8qIFNhdmUsIFN0ZXAgNTQ6CisJICogICAgIElmIFNQVV9TdGF0dXNbUF09MSBhbmQgU1BVX1N0YXR1c1tTQ10gPSAic3VjY2VzcyIsCisJICogICAgIGNvbnRleHQgc2F2ZSBzdWNjZWVkZWQsIG90aGVyd2lzZSBjb250ZXh0IHNhdmUKKwkgKiAgICAgZmFpbGVkLgorCSAqLworCWNvbXBsZXRlID0gKChTUFVfU0FWRV9DT01QTEVURSA8PCBTUFVfU1RPUF9TVEFUVVNfU0hJRlQpIHwKKwkJICAgIFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9TVE9QKTsKKwlyZXR1cm4gKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgIT0gY29tcGxldGUpID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0ZXJtaW5hdGVfc3B1X2FwcChzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwkvKiBSZXN0b3JlLCBTdGVwIDQ6CisJICogICAgSWYgcmVxdWlyZWQsIG5vdGlmeSB0aGUgInVzaW5nIGFwcGxpY2F0aW9uIiB0aGF0CisJICogICAgdGhlIFNQVSB0YXNrIGhhcyBiZWVuIHRlcm1pbmF0ZWQuICBUQkQuCisJICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdXNwZW5kX21mYyhzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyID0gc3B1LT5wcml2MjsKKworCS8qIFJlc3RvcmUsIFN0ZXAgNzoKKwkgKiBSZXN0b3JlLCBTdGVwIDQ3LgorCSAqICAgICBXcml0ZSBNRkNfQ250bFtEaCxTY109JzEnLCcxJyB0byBzdXNwZW5kCisJICogICAgIHRoZSBxdWV1ZSBhbmQgaGFsdCB0aGUgZGVjcmVtZW50ZXIuCisJICovCisJb3V0X2JlNjQoJnByaXYyLT5tZmNfY29udHJvbF9SVywgTUZDX0NOVExfU1VTUEVORF9ETUFfUVVFVUUgfAorCQkgTUZDX0NOVExfREVDUkVNRU5URVJfSEFMVEVEKTsKKwllaWVpbygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2FpdF9zdXNwZW5kX21mY19jb21wbGV0ZShzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsCisJCQkJCSAgICAgc3RydWN0IHNwdSAqc3B1KQoreworCXN0cnVjdCBzcHVfcHJpdjIgX19pb21lbSAqcHJpdjIgPSBzcHUtPnByaXYyOworCisJLyogUmVzdG9yZSwgU3RlcCA4OgorCSAqIFJlc3RvcmUsIFN0ZXAgNDcuCisJICogICAgIFBvbGwgTUZDX0NOVExbU3NdIHVudGlsIDExIGlzIHJldHVybmVkLgorCSAqLworCVBPTExfV0hJTEVfRkFMU0UoaW5fYmU2NCgmcHJpdjItPm1mY19jb250cm9sX1JXKSAmCisJCQkgTUZDX0NOVExfU1VTUEVORF9DT01QTEVURSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHN1c3BlbmRfc3BlKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCXN0cnVjdCBzcHVfcHJvYmxlbSBfX2lvbWVtICpwcm9iID0gc3B1LT5wcm9ibGVtOworCisJLyogUmVzdG9yZSwgU3RlcCA5OgorCSAqICAgIElmIFNQVV9TdGF0dXNbUl09MSwgc3RvcCBTUFUgZXhlY3V0aW9uCisJICogICAgYW5kIHdhaXQgZm9yIHN0b3AgdG8gY29tcGxldGUuCisJICoKKwkgKiAgICBSZXR1cm5zICAgICAgIDEgaWYgU1BVX1N0YXR1c1tSXT0xIG9uIGVudHJ5LgorCSAqICAgICAgICAgICAgICAgICAgMCBvdGhlcndpc2UKKwkgKi8KKwlpZiAoaW5fYmUzMigmcHJvYi0+c3B1X3N0YXR1c19SKSAmIFNQVV9TVEFUVVNfUlVOTklORykgeworCQlpZiAoaW5fYmUzMigmcHJvYi0+c3B1X3N0YXR1c19SKSAmCisJCSAgICBTUFVfU1RBVFVTX0lTT0xBVEVEX0VYSVRfU1RBVVRVUykgeworCQkJUE9MTF9XSElMRV9UUlVFKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgJgorCQkJCQlTUFVfU1RBVFVTX1JVTk5JTkcpOworCQl9CisJCWlmICgoaW5fYmUzMigmcHJvYi0+c3B1X3N0YXR1c19SKSAmCisJCSAgICAgU1BVX1NUQVRVU19JU09MQVRFRF9MT0FEX1NUQVVUVVMpCisJCSAgICB8fCAoaW5fYmUzMigmcHJvYi0+c3B1X3N0YXR1c19SKSAmCisJCQlTUFVfU1RBVFVTX0lTT0xBVEVEX1NUQVRFKSkgeworCQkJb3V0X2JlMzIoJnByb2ItPnNwdV9ydW5jbnRsX1JXLCBTUFVfUlVOQ05UTF9TVE9QKTsKKwkJCWVpZWlvKCk7CisJCQlQT0xMX1dISUxFX1RSVUUoaW5fYmUzMigmcHJvYi0+c3B1X3N0YXR1c19SKSAmCisJCQkJCVNQVV9TVEFUVVNfUlVOTklORyk7CisJCQlvdXRfYmUzMigmcHJvYi0+c3B1X3J1bmNudGxfUlcsIDB4Mik7CisJCQllaWVpbygpOworCQkJUE9MTF9XSElMRV9UUlVFKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgJgorCQkJCQlTUFVfU1RBVFVTX1JVTk5JTkcpOworCQl9CisJCWlmIChpbl9iZTMyKCZwcm9iLT5zcHVfc3RhdHVzX1IpICYKKwkJICAgIFNQVV9TVEFUVVNfV0FJVElOR19GT1JfQ0hBTk5FTCkgeworCQkJb3V0X2JlMzIoJnByb2ItPnNwdV9ydW5jbnRsX1JXLCBTUFVfUlVOQ05UTF9TVE9QKTsKKwkJCWVpZWlvKCk7CisJCQlQT0xMX1dISUxFX1RSVUUoaW5fYmUzMigmcHJvYi0+c3B1X3N0YXR1c19SKSAmCisJCQkJCVNQVV9TVEFUVVNfUlVOTklORyk7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfc3B1X3N0YXR1cyhzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3Byb2JsZW0gX19pb21lbSAqcHJvYiA9IHNwdS0+cHJvYmxlbTsKKworCS8qIFJlc3RvcmUsIFN0ZXAgMTA6CisJICogICAgSWYgU1BVX1N0YXR1c1tSXT0wIGFuZCBTUFVfU3RhdHVzW0UsTCxJU109MSwKKwkgKiAgICByZWxlYXNlIFNQVSBmcm9tIGlzb2xhdGUgc3RhdGUuCisJICovCisJaWYgKCEoaW5fYmUzMigmcHJvYi0+c3B1X3N0YXR1c19SKSAmIFNQVV9TVEFUVVNfUlVOTklORykpIHsKKwkJaWYgKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgJgorCQkgICAgU1BVX1NUQVRVU19JU09MQVRFRF9FWElUX1NUQVVUVVMpIHsKKwkJCXNwdV9tZmNfc3IxX3NldChzcHUsCisJCQkJCU1GQ19TVEFURTFfTUFTVEVSX1JVTl9DT05UUk9MX01BU0spOworCQkJZWllaW8oKTsKKwkJCW91dF9iZTMyKCZwcm9iLT5zcHVfcnVuY250bF9SVywgU1BVX1JVTkNOVExfUlVOTkFCTEUpOworCQkJZWllaW8oKTsKKwkJCVBPTExfV0hJTEVfVFJVRShpbl9iZTMyKCZwcm9iLT5zcHVfc3RhdHVzX1IpICYKKwkJCQkJU1BVX1NUQVRVU19SVU5OSU5HKTsKKwkJfQorCQlpZiAoKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgJgorCQkgICAgIFNQVV9TVEFUVVNfSVNPTEFURURfTE9BRF9TVEFVVFVTKQorCQkgICAgfHwgKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgJgorCQkJU1BVX1NUQVRVU19JU09MQVRFRF9TVEFURSkpIHsKKwkJCXNwdV9tZmNfc3IxX3NldChzcHUsCisJCQkJCU1GQ19TVEFURTFfTUFTVEVSX1JVTl9DT05UUk9MX01BU0spOworCQkJZWllaW8oKTsKKwkJCW91dF9iZTMyKCZwcm9iLT5zcHVfcnVuY250bF9SVywgMHgyKTsKKwkJCWVpZWlvKCk7CisJCQlQT0xMX1dISUxFX1RSVUUoaW5fYmUzMigmcHJvYi0+c3B1X3N0YXR1c19SKSAmCisJCQkJCVNQVV9TVEFUVVNfUlVOTklORyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXNldF9jaF9wYXJ0MShzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyID0gc3B1LT5wcml2MjsKKwl1NjQgY2hfaW5kaWNlc1s3XSA9IHsgMFVMLCAxVUwsIDNVTCwgNFVMLCAyNFVMLCAyNVVMLCAyN1VMIH07CisJdTY0IGlkeDsKKwlpbnQgaTsKKworCS8qIFJlc3RvcmUsIFN0ZXAgMjA6CisJICogICAgIFJlc2V0IHRoZSBmb2xsb3dpbmcgQ0g6IFswLDEsMyw0LDI0LDI1LDI3XQorCSAqLworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJaWR4ID0gY2hfaW5kaWNlc1tpXTsKKwkJb3V0X2JlNjQoJnByaXYyLT5zcHVfY2hubGNudHB0cl9SVywgaWR4KTsKKwkJZWllaW8oKTsKKwkJb3V0X2JlNjQoJnByaXYyLT5zcHVfY2hubGRhdGFfUlcsIDBVTCk7CisJCW91dF9iZTY0KCZwcml2Mi0+c3B1X2NobmxjbnRfUlcsIDBVTCk7CisJCWVpZWlvKCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzZXRfY2hfcGFydDIoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcml2MiBfX2lvbWVtICpwcml2MiA9IHNwdS0+cHJpdjI7CisJdTY0IGNoX2luZGljZXNbNV0gPSB7IDIxVUwsIDIzVUwsIDI4VUwsIDI5VUwsIDMwVUwgfTsKKwl1NjQgY2hfY291bnRzWzVdID0geyAxNlVMLCAxVUwsIDFVTCwgMFVMLCAxVUwgfTsKKwl1NjQgaWR4OworCWludCBpOworCisJLyogUmVzdG9yZSwgU3RlcCAyMToKKwkgKiAgICAgUmVzZXQgdGhlIGZvbGxvd2luZyBDSDogWzIxLCAyMywgMjgsIDI5LCAzMF0KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCWlkeCA9IGNoX2luZGljZXNbaV07CisJCW91dF9iZTY0KCZwcml2Mi0+c3B1X2NobmxjbnRwdHJfUlcsIGlkeCk7CisJCWVpZWlvKCk7CisJCW91dF9iZTY0KCZwcml2Mi0+c3B1X2NobmxjbnRfUlcsIGNoX2NvdW50c1tpXSk7CisJCWVpZWlvKCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfc3B1X3N0YXR1c19wYXJ0MShzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsCisJCQkJCSAgc3RydWN0IHNwdSAqc3B1KQoreworCXUzMiBzdGF0dXNfUCA9IFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9TVE9QOworCXUzMiBzdGF0dXNfSSA9IFNQVV9TVEFUVVNfSU5WQUxJRF9JTlNUUjsKKwl1MzIgc3RhdHVzX0ggPSBTUFVfU1RBVFVTX1NUT1BQRURfQllfSEFMVDsKKwl1MzIgc3RhdHVzX1MgPSBTUFVfU1RBVFVTX1NJTkdMRV9TVEVQOworCXUzMiBzdGF0dXNfU19JID0gU1BVX1NUQVRVU19TSU5HTEVfU1RFUCB8IFNQVV9TVEFUVVNfSU5WQUxJRF9JTlNUUjsKKwl1MzIgc3RhdHVzX1NfUCA9IFNQVV9TVEFUVVNfU0lOR0xFX1NURVAgfCBTUFVfU1RBVFVTX1NUT1BQRURfQllfU1RPUDsKKwl1MzIgc3RhdHVzX1BfSCA9IFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9IQUxUIHxTUFVfU1RBVFVTX1NUT1BQRURfQllfU1RPUDsKKwl1MzIgc3RhdHVzX1BfSSA9IFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9TVE9QIHxTUFVfU1RBVFVTX0lOVkFMSURfSU5TVFI7CisJdTMyIHN0YXR1c19jb2RlOworCisJLyogUmVzdG9yZSwgU3RlcCAyNzoKKwkgKiAgICAgSWYgdGhlIENTQS5TUFVfU3RhdHVzW0ksUyxILFBdPTEgdGhlbiBhZGQgdGhlIGNvcnJlY3QKKwkgKiAgICAgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgdG8gdGhlIGVuZCBvZiB0aGUgU1BVIGJhc2VkIHJlc3RvcmUKKwkgKiAgICAgY29kZSAoYWZ0ZXIgdGhlICJjb250ZXh0IHJlc3RvcmVkIiBzdG9wIGFuZCBzaWduYWwpIHRvCisJICogICAgIHJlc3RvcmUgdGhlIGNvcnJlY3QgU1BVIHN0YXR1cy4KKwkgKgorCSAqICAgICBOT1RFOiBSYXRoZXIgdGhhbiBtb2RpZnlpbmcgdGhlIFNQVSBleGVjdXRhYmxlLCB3ZQorCSAqICAgICBpbnN0ZWFkIGFkZCBhIG5ldyAnc3RvcHBlZF9zdGF0dXMnIGZpZWxkIHRvIHRoZQorCSAqICAgICBMU0NTQS4gIFRoZSBTUFUtc2lkZSByZXN0b3JlIHJlYWRzIHRoaXMgZmllbGQgYW5kCisJICogICAgIHRha2VzIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiBleGl0aW5nLgorCSAqLworCisJc3RhdHVzX2NvZGUgPQorCSAgICAoY3NhLT5wcm9iLnNwdV9zdGF0dXNfUiA+PiBTUFVfU1RPUF9TVEFUVVNfU0hJRlQpICYgMHhGRkZGOworCWlmICgoY3NhLT5wcm9iLnNwdV9zdGF0dXNfUiAmIHN0YXR1c19QX0kpID09IHN0YXR1c19QX0kpIHsKKworCQkvKiBTUFVfU3RhdHVzW1AsSV09MSAtIElsbGVnYWwgSW5zdHJ1Y3Rpb24gZm9sbG93ZWQKKwkJICogYnkgU3RvcCBhbmQgU2lnbmFsIGluc3RydWN0aW9uLCBmb2xsb3dlZCBieSAnYnIgLTQnLgorCQkgKgorCQkgKi8KKwkJY3NhLT5sc2NzYS0+c3RvcHBlZF9zdGF0dXMuc2xvdFswXSA9IFNQVV9TVE9QUEVEX1NUQVRVU19QX0k7CisJCWNzYS0+bHNjc2EtPnN0b3BwZWRfc3RhdHVzLnNsb3RbMV0gPSBzdGF0dXNfY29kZTsKKworCX0gZWxzZSBpZiAoKGNzYS0+cHJvYi5zcHVfc3RhdHVzX1IgJiBzdGF0dXNfUF9IKSA9PSBzdGF0dXNfUF9IKSB7CisKKwkJLyogU1BVX1N0YXR1c1tQLEhdPTEgLSBIYWx0IENvbmRpdGlvbmFsLCBmb2xsb3dlZAorCQkgKiBieSBTdG9wIGFuZCBTaWduYWwgaW5zdHJ1Y3Rpb24sIGZvbGxvd2VkIGJ5CisJCSAqICdiciAtNCcuCisJCSAqLworCQljc2EtPmxzY3NhLT5zdG9wcGVkX3N0YXR1cy5zbG90WzBdID0gU1BVX1NUT1BQRURfU1RBVFVTX1BfSDsKKwkJY3NhLT5sc2NzYS0+c3RvcHBlZF9zdGF0dXMuc2xvdFsxXSA9IHN0YXR1c19jb2RlOworCisJfSBlbHNlIGlmICgoY3NhLT5wcm9iLnNwdV9zdGF0dXNfUiAmIHN0YXR1c19TX1ApID09IHN0YXR1c19TX1ApIHsKKworCQkvKiBTUFVfU3RhdHVzW1MsUF09MSAtIFN0b3AgYW5kIFNpZ25hbCBpbnN0cnVjdGlvbgorCQkgKiBmb2xsb3dlZCBieSAnYnIgLTQnLgorCQkgKi8KKwkJY3NhLT5sc2NzYS0+c3RvcHBlZF9zdGF0dXMuc2xvdFswXSA9IFNQVV9TVE9QUEVEX1NUQVRVU19TX1A7CisJCWNzYS0+bHNjc2EtPnN0b3BwZWRfc3RhdHVzLnNsb3RbMV0gPSBzdGF0dXNfY29kZTsKKworCX0gZWxzZSBpZiAoKGNzYS0+cHJvYi5zcHVfc3RhdHVzX1IgJiBzdGF0dXNfU19JKSA9PSBzdGF0dXNfU19JKSB7CisKKwkJLyogU1BVX1N0YXR1c1tTLEldPTEgLSBJbGxlZ2FsIGluc3RydWN0aW9uIGZvbGxvd2VkCisJCSAqIGJ5ICdiciAtNCcuCisJCSAqLworCQljc2EtPmxzY3NhLT5zdG9wcGVkX3N0YXR1cy5zbG90WzBdID0gU1BVX1NUT1BQRURfU1RBVFVTX1NfSTsKKwkJY3NhLT5sc2NzYS0+c3RvcHBlZF9zdGF0dXMuc2xvdFsxXSA9IHN0YXR1c19jb2RlOworCisJfSBlbHNlIGlmICgoY3NhLT5wcm9iLnNwdV9zdGF0dXNfUiAmIHN0YXR1c19QKSA9PSBzdGF0dXNfUCkgeworCisJCS8qIFNQVV9TdGF0dXNbUF09MSAtIFN0b3AgYW5kIFNpZ25hbCBpbnN0cnVjdGlvbgorCQkgKiBmb2xsb3dlZCBieSAnYnIgLTQnLgorCQkgKi8KKwkJY3NhLT5sc2NzYS0+c3RvcHBlZF9zdGF0dXMuc2xvdFswXSA9IFNQVV9TVE9QUEVEX1NUQVRVU19QOworCQljc2EtPmxzY3NhLT5zdG9wcGVkX3N0YXR1cy5zbG90WzFdID0gc3RhdHVzX2NvZGU7CisKKwl9IGVsc2UgaWYgKChjc2EtPnByb2Iuc3B1X3N0YXR1c19SICYgc3RhdHVzX0gpID09IHN0YXR1c19IKSB7CisKKwkJLyogU1BVX1N0YXR1c1tIXT0xIC0gSGFsdCBDb25kaXRpb25hbCwgZm9sbG93ZWQKKwkJICogYnkgJ2JyIC00Jy4KKwkJICovCisJCWNzYS0+bHNjc2EtPnN0b3BwZWRfc3RhdHVzLnNsb3RbMF0gPSBTUFVfU1RPUFBFRF9TVEFUVVNfSDsKKworCX0gZWxzZSBpZiAoKGNzYS0+cHJvYi5zcHVfc3RhdHVzX1IgJiBzdGF0dXNfUykgPT0gc3RhdHVzX1MpIHsKKworCQkvKiBTUFVfU3RhdHVzW1NdPTEgLSBUd28gbm9wIGluc3RydWN0aW9ucy4KKwkJICovCisJCWNzYS0+bHNjc2EtPnN0b3BwZWRfc3RhdHVzLnNsb3RbMF0gPSBTUFVfU1RPUFBFRF9TVEFUVVNfUzsKKworCX0gZWxzZSBpZiAoKGNzYS0+cHJvYi5zcHVfc3RhdHVzX1IgJiBzdGF0dXNfSSkgPT0gc3RhdHVzX0kpIHsKKworCQkvKiBTUFVfU3RhdHVzW0ldPTEgLSBJbGxlZ2FsIGluc3RydWN0aW9uIGZvbGxvd2VkCisJCSAqIGJ5ICdiciAtNCcuCisJCSAqLworCQljc2EtPmxzY3NhLT5zdG9wcGVkX3N0YXR1cy5zbG90WzBdID0gU1BVX1NUT1BQRURfU1RBVFVTX0k7CisKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF9zcHVfc3RhdHVzX3BhcnQyKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwKKwkJCQkJICBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJdTMyIG1hc2s7CisKKwkvKiBSZXN0b3JlLCBTdGVwIDI4OgorCSAqICAgICBJZiB0aGUgQ1NBLlNQVV9TdGF0dXNbSSxTLEgsUCxSXT0wIHRoZW4KKwkgKiAgICAgYWRkIGEgJ2JyIConIGluc3RydWN0aW9uIHRvIHRoZSBlbmQgb2YKKwkgKiAgICAgdGhlIFNQVSBiYXNlZCByZXN0b3JlIGNvZGUuCisJICoKKwkgKiAgICAgTk9URTogUmF0aGVyIHRoYW4gbW9kaWZ5aW5nIHRoZSBTUFUgZXhlY3V0YWJsZSwgd2UKKwkgKiAgICAgaW5zdGVhZCBhZGQgYSBuZXcgJ3N0b3BwZWRfc3RhdHVzJyBmaWVsZCB0byB0aGUKKwkgKiAgICAgTFNDU0EuICBUaGUgU1BVLXNpZGUgcmVzdG9yZSByZWFkcyB0aGlzIGZpZWxkIGFuZAorCSAqICAgICB0YWtlcyB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gZXhpdGluZy4KKwkgKi8KKwltYXNrID0gU1BVX1NUQVRVU19JTlZBTElEX0lOU1RSIHwKKwkgICAgU1BVX1NUQVRVU19TSU5HTEVfU1RFUCB8CisJICAgIFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9IQUxUIHwKKwkgICAgU1BVX1NUQVRVU19TVE9QUEVEX0JZX1NUT1AgfCBTUFVfU1RBVFVTX1JVTk5JTkc7CisJaWYgKCEoY3NhLT5wcm9iLnNwdV9zdGF0dXNfUiAmIG1hc2spKSB7CisJCWNzYS0+bHNjc2EtPnN0b3BwZWRfc3RhdHVzLnNsb3RbMF0gPSBTUFVfU1RPUFBFRF9TVEFUVVNfUjsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX21mY19yYWcoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJLyogUmVzdG9yZSwgU3RlcCAyOToKKwkgKiAgICAgUmVzdG9yZSBSQV9HUk9VUF9JRCByZWdpc3RlciBhbmQgdGhlCisJICogICAgIFJBX0VOQUJMRSByZWlnc3RlciBmcm9tIHRoZSBDU0EuCisJICovCisJc3B1X3Jlc291cmNlX2FsbG9jYXRpb25fZ3JvdXBJRF9zZXQoc3B1LAorCQkJY3NhLT5wcml2MS5yZXNvdXJjZV9hbGxvY2F0aW9uX2dyb3VwSURfUlcpOworCXNwdV9yZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9zZXQoc3B1LAorCQkJY3NhLT5wcml2MS5yZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9SVyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZW5kX3Jlc3RvcmVfY29kZShzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZykmc3B1X3Jlc3RvcmVfY29kZVswXTsKKwl1bnNpZ25lZCBpbnQgbHNfb2Zmc2V0ID0gMHgwOworCXVuc2lnbmVkIGludCBzaXplID0gc2l6ZW9mKHNwdV9yZXN0b3JlX2NvZGUpOworCXVuc2lnbmVkIGludCB0YWcgPSAwOworCXVuc2lnbmVkIGludCByY2xhc3MgPSAwOworCXVuc2lnbmVkIGludCBjbWQgPSBNRkNfR0VURlNfQ01EOworCisJLyogUmVzdG9yZSwgU3RlcCAzNzoKKwkgKiAgICAgSXNzdWUgTUZDIERNQSBjb21tYW5kIHRvIGNvcHkgY29udGV4dAorCSAqICAgICByZXN0b3JlIGNvZGUgdG8gbG9jYWwgc3RvcmFnZS4KKwkgKi8KKwlzZW5kX21mY19kbWEoc3B1LCBhZGRyLCBsc19vZmZzZXQsIHNpemUsIHRhZywgcmNsYXNzLCBjbWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfZGVjcihzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwkvKiBSZXN0b3JlLCBTdGVwIDM0OgorCSAqICAgICBJZiBDU0EuTUZDX0NOVExbRHNdPTEgKGRlY3JlbWVudGVyIHdhcworCSAqICAgICBydW5uaW5nKSB0aGVuIGFkanVzdCBkZWNyZW1lbnRlciwgc2V0CisJICogICAgIGRlY3JlbWVudGVyIHJ1bm5pbmcgc3RhdHVzIGluIExTQ1NBLAorCSAqICAgICBhbmQgc2V0IGRlY3JlbWVudGVyICJ3cmFwcGVkIiBzdGF0dXMKKwkgKiAgICAgaW4gTFNDU0EuCisJICovCisJaWYgKGNzYS0+cHJpdjIubWZjX2NvbnRyb2xfUlcgJiBNRkNfQ05UTF9ERUNSRU1FTlRFUl9SVU5OSU5HKSB7CisJCWN5Y2xlc190IHJlc3VtZV90aW1lID0gZ2V0X2N5Y2xlcygpOworCQljeWNsZXNfdCBkZWx0YV90aW1lID0gcmVzdW1lX3RpbWUgLSBjc2EtPnN1c3BlbmRfdGltZTsKKworCQljc2EtPmxzY3NhLT5kZWNyLnNsb3RbMF0gPSBkZWx0YV90aW1lOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldHVwX3BwdV9tYihzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwkvKiBSZXN0b3JlLCBTdGVwIDM1OgorCSAqICAgICBDb3B5IHRoZSBDU0EuUFVfTUIgZGF0YSBpbnRvIHRoZSBMU0NTQS4KKwkgKi8KKwljc2EtPmxzY3NhLT5wcHVfbWIuc2xvdFswXSA9IGNzYS0+cHJvYi5wdV9tYl9SOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfcHB1aW50X21iKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCS8qIFJlc3RvcmUsIFN0ZXAgMzY6CisJICogICAgIENvcHkgdGhlIENTQS5QVUlOVF9NQiBkYXRhIGludG8gdGhlIExTQ1NBLgorCSAqLworCWNzYS0+bHNjc2EtPnBwdWludF9tYi5zbG90WzBdID0gY3NhLT5wcml2Mi5wdWludF9tYl9SOworfQorCitzdGF0aWMgaW5saW5lIGludCBjaGVja19yZXN0b3JlX3N0YXR1cyhzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3Byb2JsZW0gX19pb21lbSAqcHJvYiA9IHNwdS0+cHJvYmxlbTsKKwl1MzIgY29tcGxldGU7CisKKwkvKiBSZXN0b3JlLCBTdGVwIDQwOgorCSAqICAgICBJZiBTUFVfU3RhdHVzW1BdPTEgYW5kIFNQVV9TdGF0dXNbU0NdID0gInN1Y2Nlc3MiLAorCSAqICAgICBjb250ZXh0IHJlc3RvcmUgc3VjY2VlZGVkLCBvdGhlcndpc2UgY29udGV4dCByZXN0b3JlCisJICogICAgIGZhaWxlZC4KKwkgKi8KKwljb21wbGV0ZSA9ICgoU1BVX1JFU1RPUkVfQ09NUExFVEUgPDwgU1BVX1NUT1BfU1RBVFVTX1NISUZUKSB8CisJCSAgICBTUFVfU1RBVFVTX1NUT1BQRURfQllfU1RPUCk7CisJcmV0dXJuIChpbl9iZTMyKCZwcm9iLT5zcHVfc3RhdHVzX1IpICE9IGNvbXBsZXRlKSA/IDEgOiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzdG9yZV9zcHVfcHJpdmNudGwoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcml2MiBfX2lvbWVtICpwcml2MiA9IHNwdS0+cHJpdjI7CisKKwkvKiBSZXN0b3JlLCBTdGVwIDQxOgorCSAqICAgICBSZXN0b3JlIFNQVV9Qcml2Q250bCBmcm9tIHRoZSBDU0EuCisJICovCisJb3V0X2JlNjQoJnByaXYyLT5zcHVfcHJpdmNudGxfUlcsIGNzYS0+cHJpdjIuc3B1X3ByaXZjbnRsX1JXKTsKKwllaWVpbygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzdG9yZV9zdGF0dXNfcGFydDEoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcm9ibGVtIF9faW9tZW0gKnByb2IgPSBzcHUtPnByb2JsZW07CisJdTMyIG1hc2s7CisKKwkvKiBSZXN0b3JlLCBTdGVwIDQyOgorCSAqICAgICBJZiBhbnkgQ1NBLlNQVV9TdGF0dXNbSSxTLEgsUF09MSwgdGhlbgorCSAqICAgICByZXN0b3JlIHRoZSBlcnJvciBvciBzaW5nbGUgc3RlcCBzdGF0ZS4KKwkgKi8KKwltYXNrID0gU1BVX1NUQVRVU19JTlZBTElEX0lOU1RSIHwKKwkgICAgU1BVX1NUQVRVU19TSU5HTEVfU1RFUCB8CisJICAgIFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9IQUxUIHwgU1BVX1NUQVRVU19TVE9QUEVEX0JZX1NUT1A7CisJaWYgKGNzYS0+cHJvYi5zcHVfc3RhdHVzX1IgJiBtYXNrKSB7CisJCW91dF9iZTMyKCZwcm9iLT5zcHVfcnVuY250bF9SVywgU1BVX1JVTkNOVExfUlVOTkFCTEUpOworCQllaWVpbygpOworCQlQT0xMX1dISUxFX1RSVUUoaW5fYmUzMigmcHJvYi0+c3B1X3N0YXR1c19SKSAmCisJCQkJU1BVX1NUQVRVU19SVU5OSU5HKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX3N0YXR1c19wYXJ0MihzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3Byb2JsZW0gX19pb21lbSAqcHJvYiA9IHNwdS0+cHJvYmxlbTsKKwl1MzIgbWFzazsKKworCS8qIFJlc3RvcmUsIFN0ZXAgNDM6CisJICogICAgIElmIGFsbCBDU0EuU1BVX1N0YXR1c1tJLFMsSCxQLFJdPTAgdGhlbiB3cml0ZQorCSAqICAgICBTUFVfUnVuQ250bFtSMFIxXT0nMDEnLCB3YWl0IGZvciBTUFVfU3RhdHVzW1JdPTEsCisJICogICAgIHRoZW4gd3JpdGUgJzAwJyB0byBTUFVfUnVuQ250bFtSMFIxXSBhbmQgd2FpdAorCSAqICAgICBmb3IgU1BVX1N0YXR1c1tSXT0wLgorCSAqLworCW1hc2sgPSBTUFVfU1RBVFVTX0lOVkFMSURfSU5TVFIgfAorCSAgICBTUFVfU1RBVFVTX1NJTkdMRV9TVEVQIHwKKwkgICAgU1BVX1NUQVRVU19TVE9QUEVEX0JZX0hBTFQgfAorCSAgICBTUFVfU1RBVFVTX1NUT1BQRURfQllfU1RPUCB8IFNQVV9TVEFUVVNfUlVOTklORzsKKwlpZiAoIShjc2EtPnByb2Iuc3B1X3N0YXR1c19SICYgbWFzaykpIHsKKwkJb3V0X2JlMzIoJnByb2ItPnNwdV9ydW5jbnRsX1JXLCBTUFVfUlVOQ05UTF9SVU5OQUJMRSk7CisJCWVpZWlvKCk7CisJCVBPTExfV0hJTEVfRkFMU0UoaW5fYmUzMigmcHJvYi0+c3B1X3N0YXR1c19SKSAmCisJCQkJIFNQVV9TVEFUVVNfUlVOTklORyk7CisJCW91dF9iZTMyKCZwcm9iLT5zcHVfcnVuY250bF9SVywgU1BVX1JVTkNOVExfU1RPUCk7CisJCWVpZWlvKCk7CisJCVBPTExfV0hJTEVfVFJVRShpbl9iZTMyKCZwcm9iLT5zcHVfc3RhdHVzX1IpICYKKwkJCQlTUFVfU1RBVFVTX1JVTk5JTkcpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc3RvcmVfbHNfMTZrYihzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZykmY3NhLT5sc2NzYS0+bHNbMF07CisJdW5zaWduZWQgaW50IGxzX29mZnNldCA9IDB4MDsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IDE2Mzg0OworCXVuc2lnbmVkIGludCB0YWcgPSAwOworCXVuc2lnbmVkIGludCByY2xhc3MgPSAwOworCXVuc2lnbmVkIGludCBjbWQgPSBNRkNfR0VUX0NNRDsKKworCS8qIFJlc3RvcmUsIFN0ZXAgNDQ6CisJICogICAgIElzc3VlIGEgRE1BIGNvbW1hbmQgdG8gcmVzdG9yZSB0aGUgZmlyc3QKKwkgKiAgICAgMTZrYiBvZiBsb2NhbCBzdG9yYWdlIGZyb20gQ1NBLgorCSAqLworCXNlbmRfbWZjX2RtYShzcHUsIGFkZHIsIGxzX29mZnNldCwgc2l6ZSwgdGFnLCByY2xhc3MsIGNtZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9pbnRlcnJ1cHRzKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCS8qIFJlc3RvcmUsIFN0ZXAgNDk6CisJICogICAgIFdyaXRlIElOVF9NQVNLX2NsYXNzMCB3aXRoIHZhbHVlIG9mIDAuCisJICogICAgIFdyaXRlIElOVF9NQVNLX2NsYXNzMSB3aXRoIHZhbHVlIG9mIDAuCisJICogICAgIFdyaXRlIElOVF9NQVNLX2NsYXNzMiB3aXRoIHZhbHVlIG9mIDAuCisJICogICAgIFdyaXRlIElOVF9TVEFUX2NsYXNzMCB3aXRoIHZhbHVlIG9mIC0xLgorCSAqICAgICBXcml0ZSBJTlRfU1RBVF9jbGFzczEgd2l0aCB2YWx1ZSBvZiAtMS4KKwkgKiAgICAgV3JpdGUgSU5UX1NUQVRfY2xhc3MyIHdpdGggdmFsdWUgb2YgLTEuCisJICovCisJc3Bpbl9sb2NrX2lycSgmc3B1LT5yZWdpc3Rlcl9sb2NrKTsKKwlzcHVfaW50X21hc2tfc2V0KHNwdSwgMCwgMHVsKTsKKwlzcHVfaW50X21hc2tfc2V0KHNwdSwgMSwgMHVsKTsKKwlzcHVfaW50X21hc2tfc2V0KHNwdSwgMiwgMHVsKTsKKwlzcHVfaW50X3N0YXRfY2xlYXIoc3B1LCAwLCB+MHVsKTsKKwlzcHVfaW50X3N0YXRfY2xlYXIoc3B1LCAxLCB+MHVsKTsKKwlzcHVfaW50X3N0YXRfY2xlYXIoc3B1LCAyLCB+MHVsKTsKKwlzcGluX3VubG9ja19pcnEoJnNwdS0+cmVnaXN0ZXJfbG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX21mY19xdWV1ZXMoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcml2MiBfX2lvbWVtICpwcml2MiA9IHNwdS0+cHJpdjI7CisJaW50IGk7CisKKwkvKiBSZXN0b3JlLCBTdGVwIDUwOgorCSAqICAgICBJZiBNRkNfQ250bFtTZV0hPTAgdGhlbiByZXN0b3JlCisJICogICAgIE1GQyBjb21tYW5kIHF1ZXVlcy4KKwkgKi8KKwlpZiAoKGNzYS0+cHJpdjIubWZjX2NvbnRyb2xfUlcgJiBNRkNfQ05UTF9ETUFfUVVFVUVTX0VNUFRZX01BU0spID09IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJb3V0X2JlNjQoJnByaXYyLT5wdXFbaV0ubWZjX2NxX2RhdGEwX1JXLAorCQkJCSBjc2EtPnByaXYyLnB1cVtpXS5tZmNfY3FfZGF0YTBfUlcpOworCQkJb3V0X2JlNjQoJnByaXYyLT5wdXFbaV0ubWZjX2NxX2RhdGExX1JXLAorCQkJCSBjc2EtPnByaXYyLnB1cVtpXS5tZmNfY3FfZGF0YTFfUlcpOworCQkJb3V0X2JlNjQoJnByaXYyLT5wdXFbaV0ubWZjX2NxX2RhdGEyX1JXLAorCQkJCSBjc2EtPnByaXYyLnB1cVtpXS5tZmNfY3FfZGF0YTJfUlcpOworCQkJb3V0X2JlNjQoJnByaXYyLT5wdXFbaV0ubWZjX2NxX2RhdGEzX1JXLAorCQkJCSBjc2EtPnByaXYyLnB1cVtpXS5tZmNfY3FfZGF0YTNfUlcpOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCQlvdXRfYmU2NCgmcHJpdjItPnNwdXFbaV0ubWZjX2NxX2RhdGEwX1JXLAorCQkJCSBjc2EtPnByaXYyLnNwdXFbaV0ubWZjX2NxX2RhdGEwX1JXKTsKKwkJCW91dF9iZTY0KCZwcml2Mi0+c3B1cVtpXS5tZmNfY3FfZGF0YTFfUlcsCisJCQkJIGNzYS0+cHJpdjIuc3B1cVtpXS5tZmNfY3FfZGF0YTFfUlcpOworCQkJb3V0X2JlNjQoJnByaXYyLT5zcHVxW2ldLm1mY19jcV9kYXRhMl9SVywKKwkJCQkgY3NhLT5wcml2Mi5zcHVxW2ldLm1mY19jcV9kYXRhMl9SVyk7CisJCQlvdXRfYmU2NCgmcHJpdjItPnNwdXFbaV0ubWZjX2NxX2RhdGEzX1JXLAorCQkJCSBjc2EtPnByaXYyLnNwdXFbaV0ubWZjX2NxX2RhdGEzX1JXKTsKKwkJfQorCX0KKwllaWVpbygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzdG9yZV9wcHVfcXVlcnltYXNrKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCXN0cnVjdCBzcHVfcHJvYmxlbSBfX2lvbWVtICpwcm9iID0gc3B1LT5wcm9ibGVtOworCisJLyogUmVzdG9yZSwgU3RlcCA1MToKKwkgKiAgICAgUmVzdG9yZSB0aGUgUFBVX1F1ZXJ5TWFzayByZWdpc3RlciBmcm9tIENTQS4KKwkgKi8KKwlvdXRfYmUzMigmcHJvYi0+ZG1hX3F1ZXJ5bWFza19SVywgY3NhLT5wcm9iLmRtYV9xdWVyeW1hc2tfUlcpOworCWVpZWlvKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX3BwdV9xdWVyeXR5cGUoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcm9ibGVtIF9faW9tZW0gKnByb2IgPSBzcHUtPnByb2JsZW07CisKKwkvKiBSZXN0b3JlLCBTdGVwIDUyOgorCSAqICAgICBSZXN0b3JlIHRoZSBQUFVfUXVlcnlUeXBlIHJlZ2lzdGVyIGZyb20gQ1NBLgorCSAqLworCW91dF9iZTMyKCZwcm9iLT5kbWFfcXVlcnl0eXBlX1JXLCBjc2EtPnByb2IuZG1hX3F1ZXJ5dHlwZV9SVyk7CisJZWllaW8oKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc3RvcmVfbWZjX2Nzcl90c3Eoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcml2MiBfX2lvbWVtICpwcml2MiA9IHNwdS0+cHJpdjI7CisKKwkvKiBSZXN0b3JlLCBTdGVwIDUzOgorCSAqICAgICBSZXN0b3JlIHRoZSBNRkNfQ1NSX1RTUSByZWdpc3RlciBmcm9tIENTQS4KKwkgKi8KKwlvdXRfYmU2NCgmcHJpdjItPnNwdV90YWdfc3RhdHVzX3F1ZXJ5X1JXLAorCQkgY3NhLT5wcml2Mi5zcHVfdGFnX3N0YXR1c19xdWVyeV9SVyk7CisJZWllaW8oKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc3RvcmVfbWZjX2Nzcl9jbWQoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcml2MiBfX2lvbWVtICpwcml2MiA9IHNwdS0+cHJpdjI7CisKKwkvKiBSZXN0b3JlLCBTdGVwIDU0OgorCSAqICAgICBSZXN0b3JlIHRoZSBNRkNfQ1NSX0NNRDEgYW5kIE1GQ19DU1JfQ01EMgorCSAqICAgICByZWdpc3RlcnMgZnJvbSBDU0EuCisJICovCisJb3V0X2JlNjQoJnByaXYyLT5zcHVfY21kX2J1ZjFfUlcsIGNzYS0+cHJpdjIuc3B1X2NtZF9idWYxX1JXKTsKKwlvdXRfYmU2NCgmcHJpdjItPnNwdV9jbWRfYnVmMl9SVywgY3NhLT5wcml2Mi5zcHVfY21kX2J1ZjJfUlcpOworCWVpZWlvKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX21mY19jc3JfYXRvKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCXN0cnVjdCBzcHVfcHJpdjIgX19pb21lbSAqcHJpdjIgPSBzcHUtPnByaXYyOworCisJLyogUmVzdG9yZSwgU3RlcCA1NToKKwkgKiAgICAgUmVzdG9yZSB0aGUgTUZDX0NTUl9BVE8gcmVnaXN0ZXIgZnJvbSBDU0EuCisJICovCisJb3V0X2JlNjQoJnByaXYyLT5zcHVfYXRvbWljX3N0YXR1c19SVywgY3NhLT5wcml2Mi5zcHVfYXRvbWljX3N0YXR1c19SVyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX21mY190Y2xhc3NfaWQoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJLyogUmVzdG9yZSwgU3RlcCA1NjoKKwkgKiAgICAgUmVzdG9yZSB0aGUgTUZDX1RDTEFTU19JRCByZWdpc3RlciBmcm9tIENTQS4KKwkgKi8KKwlzcHVfbWZjX3RjbGFzc19pZF9zZXQoc3B1LCBjc2EtPnByaXYxLm1mY190Y2xhc3NfaWRfUlcpOworCWVpZWlvKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbGxyX2V2ZW50KHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCXU2NCBjaDBfY250LCBjaDBfZGF0YTsKKwl1NjQgY2gxX2RhdGE7CisKKwkvKiBSZXN0b3JlLCBTdGVwIDU3OgorCSAqICAgIFNldCB0aGUgTG9jayBMaW5lIFJlc2VydmF0aW9uIExvc3QgRXZlbnQgYnk6CisJICogICAgICAxLiBPUiBDU0EuU1BVX0V2ZW50X1N0YXR1cyB3aXRoIGJpdCAyMSAoTHIpIHNldCB0byAxLgorCSAqICAgICAgMi4gSWYgQ1NBLlNQVV9DaGFubmVsXzBfQ291bnQ9MCBhbmQKKwkgKiAgICAgICAgIENTQS5TUFVfV3JfRXZlbnRfTWFza1tMcl09MSBhbmQKKwkgKiAgICAgICAgIENTQS5TUFVfRXZlbnRfU3RhdHVzW0xyXT0wIHRoZW4gc2V0CisJICogICAgICAgICBDU0EuU1BVX0V2ZW50X1N0YXR1c19Db3VudD0xLgorCSAqLworCWNoMF9jbnQgPSBjc2EtPnNwdV9jaG5sY250X1JXWzBdOworCWNoMF9kYXRhID0gY3NhLT5zcHVfY2hubGRhdGFfUldbMF07CisJY2gxX2RhdGEgPSBjc2EtPnNwdV9jaG5sZGF0YV9SV1sxXTsKKwljc2EtPnNwdV9jaG5sZGF0YV9SV1swXSB8PSBNRkNfTExSX0xPU1RfRVZFTlQ7CisJaWYgKChjaDBfY250ID09IDApICYmICEoY2gwX2RhdGEgJiBNRkNfTExSX0xPU1RfRVZFTlQpICYmCisJICAgIChjaDFfZGF0YSAmIE1GQ19MTFJfTE9TVF9FVkVOVCkpIHsKKwkJY3NhLT5zcHVfY2hubGNudF9SV1swXSA9IDE7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzdG9yZV9kZWNyX3dyYXBwZWQoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJLyogUmVzdG9yZSwgU3RlcCA1ODoKKwkgKiAgICAgSWYgdGhlIHN0YXR1cyBvZiB0aGUgQ1NBIHNvZnR3YXJlIGRlY3JlbWVudGVyCisJICogICAgICJ3cmFwcGVkIiBmbGFnIGlzIHNldCwgT1IgaW4gYSAnMScgdG8KKwkgKiAgICAgQ1NBLlNQVV9FdmVudF9TdGF0dXNbVG1dLgorCSAqLworCWlmIChjc2EtPmxzY3NhLT5kZWNyX3N0YXR1cy5zbG90WzBdID09IDEpIHsKKwkJY3NhLT5zcHVfY2hubGRhdGFfUldbMF0gfD0gMHgyMDsKKwl9CisJaWYgKChjc2EtPmxzY3NhLT5kZWNyX3N0YXR1cy5zbG90WzBdID09IDEpICYmCisJICAgIChjc2EtPnNwdV9jaG5sY250X1JXWzBdID09IDAgJiYKKwkgICAgICgoY3NhLT5zcHVfY2hubGRhdGFfUldbMl0gJiAweDIwKSA9PSAweDApICYmCisJICAgICAoKGNzYS0+c3B1X2NobmxkYXRhX1JXWzBdICYgMHgyMCkgIT0gMHgxKSkpIHsKKwkJY3NhLT5zcHVfY2hubGNudF9SV1swXSA9IDE7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzdG9yZV9jaF9wYXJ0MShzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyID0gc3B1LT5wcml2MjsKKwl1NjQgaWR4LCBjaF9pbmRpY2VzWzddID0geyAwVUwsIDFVTCwgM1VMLCA0VUwsIDI0VUwsIDI1VUwsIDI3VUwgfTsKKwlpbnQgaTsKKworCS8qIFJlc3RvcmUsIFN0ZXAgNTk6CisJICogICAgIFJlc3RvcmUgdGhlIGZvbGxvd2luZyBDSDogWzAsMSwzLDQsMjQsMjUsMjddCisJICovCisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQlpZHggPSBjaF9pbmRpY2VzW2ldOworCQlvdXRfYmU2NCgmcHJpdjItPnNwdV9jaG5sY250cHRyX1JXLCBpZHgpOworCQllaWVpbygpOworCQlvdXRfYmU2NCgmcHJpdjItPnNwdV9jaG5sZGF0YV9SVywgY3NhLT5zcHVfY2hubGRhdGFfUldbaWR4XSk7CisJCW91dF9iZTY0KCZwcml2Mi0+c3B1X2NobmxjbnRfUlcsIGNzYS0+c3B1X2NobmxjbnRfUldbaWR4XSk7CisJCWVpZWlvKCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzdG9yZV9jaF9wYXJ0MihzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyID0gc3B1LT5wcml2MjsKKwl1NjQgY2hfaW5kaWNlc1szXSA9IHsgOVVMLCAyMVVMLCAyM1VMIH07CisJdTY0IGNoX2NvdW50c1szXSA9IHsgMVVMLCAxNlVMLCAxVUwgfTsKKwl1NjQgaWR4OworCWludCBpOworCisJLyogUmVzdG9yZSwgU3RlcCA2MDoKKwkgKiAgICAgUmVzdG9yZSB0aGUgZm9sbG93aW5nIENIOiBbOSwyMSwyM10uCisJICovCisJY2hfY291bnRzWzBdID0gMVVMOworCWNoX2NvdW50c1sxXSA9IGNzYS0+c3B1X2NobmxjbnRfUldbMjFdOworCWNoX2NvdW50c1syXSA9IDFVTDsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWlkeCA9IGNoX2luZGljZXNbaV07CisJCW91dF9iZTY0KCZwcml2Mi0+c3B1X2NobmxjbnRwdHJfUlcsIGlkeCk7CisJCWVpZWlvKCk7CisJCW91dF9iZTY0KCZwcml2Mi0+c3B1X2NobmxjbnRfUlcsIGNoX2NvdW50c1tpXSk7CisJCWVpZWlvKCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzdG9yZV9zcHVfbHNscihzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyID0gc3B1LT5wcml2MjsKKworCS8qIFJlc3RvcmUsIFN0ZXAgNjE6CisJICogICAgIFJlc3RvcmUgdGhlIFNQVV9MU0xSIHJlZ2lzdGVyIGZyb20gQ1NBLgorCSAqLworCW91dF9iZTY0KCZwcml2Mi0+c3B1X2xzbHJfUlcsIGNzYS0+cHJpdjIuc3B1X2xzbHJfUlcpOworCWVpZWlvKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX3NwdV9jZmcoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcml2MiBfX2lvbWVtICpwcml2MiA9IHNwdS0+cHJpdjI7CisKKwkvKiBSZXN0b3JlLCBTdGVwIDYyOgorCSAqICAgICBSZXN0b3JlIHRoZSBTUFVfQ2ZnIHJlZ2lzdGVyIGZyb20gQ1NBLgorCSAqLworCW91dF9iZTY0KCZwcml2Mi0+c3B1X2NmZ19SVywgY3NhLT5wcml2Mi5zcHVfY2ZnX1JXKTsKKwllaWVpbygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzdG9yZV9wbV90cmFjZShzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwkvKiBSZXN0b3JlLCBTdGVwIDYzOgorCSAqICAgICBSZXN0b3JlIFBNX1RyYWNlX1RhZ19XYWl0X01hc2sgZnJvbSBDU0EuCisJICogICAgIE5vdCBwZXJmb3JtZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKwkgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc3RvcmVfc3B1X25wYyhzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3Byb2JsZW0gX19pb21lbSAqcHJvYiA9IHNwdS0+cHJvYmxlbTsKKworCS8qIFJlc3RvcmUsIFN0ZXAgNjQ6CisJICogICAgIFJlc3RvcmUgU1BVX05QQyBmcm9tIENTQS4KKwkgKi8KKwlvdXRfYmUzMigmcHJvYi0+c3B1X25wY19SVywgY3NhLT5wcm9iLnNwdV9ucGNfUlcpOworCWVpZWlvKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX3NwdV9tYihzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyID0gc3B1LT5wcml2MjsKKwlpbnQgaTsKKworCS8qIFJlc3RvcmUsIFN0ZXAgNjU6CisJICogICAgIFJlc3RvcmUgTUZDX1JkU1BVX01CIGZyb20gQ1NBLgorCSAqLworCW91dF9iZTY0KCZwcml2Mi0+c3B1X2NobmxjbnRwdHJfUlcsIDI5VUwpOworCWVpZWlvKCk7CisJb3V0X2JlNjQoJnByaXYyLT5zcHVfY2hubGNudF9SVywgY3NhLT5zcHVfY2hubGNudF9SV1syOV0pOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJb3V0X2JlNjQoJnByaXYyLT5zcHVfY2hubGRhdGFfUlcsIGNzYS0+c3B1X21haWxib3hfZGF0YVtpXSk7CisJfQorCWVpZWlvKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19wcHVfbWJfc3RhdChzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3Byb2JsZW0gX19pb21lbSAqcHJvYiA9IHNwdS0+cHJvYmxlbTsKKwl1MzIgZHVtbXkgPSAwOworCisJLyogUmVzdG9yZSwgU3RlcCA2NjoKKwkgKiAgICAgSWYgQ1NBLk1CX1N0YXRbUF09MCAobWFpbGJveCBlbXB0eSkgdGhlbgorCSAqICAgICByZWFkIGZyb20gdGhlIFBQVV9NQiByZWdpc3Rlci4KKwkgKi8KKwlpZiAoKGNzYS0+cHJvYi5tYl9zdGF0X1IgJiAweEZGKSA9PSAwKSB7CisJCWR1bW15ID0gaW5fYmUzMigmcHJvYi0+cHVfbWJfUik7CisJCWVpZWlvKCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfcHB1aW50X21iX3N0YXQoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcml2MiBfX2lvbWVtICpwcml2MiA9IHNwdS0+cHJpdjI7CisJdTY0IGR1bW15ID0gMFVMOworCisJLyogUmVzdG9yZSwgU3RlcCA2NjoKKwkgKiAgICAgSWYgQ1NBLk1CX1N0YXRbSV09MCAobWFpbGJveCBlbXB0eSkgdGhlbgorCSAqICAgICByZWFkIGZyb20gdGhlIFBQVUlOVF9NQiByZWdpc3Rlci4KKwkgKi8KKwlpZiAoKGNzYS0+cHJvYi5tYl9zdGF0X1IgJiAweEZGMDAwMCkgPT0gMCkgeworCQlkdW1teSA9IGluX2JlNjQoJnByaXYyLT5wdWludF9tYl9SKTsKKwkJZWllaW8oKTsKKwkJc3B1X2ludF9zdGF0X2NsZWFyKHNwdSwgMiwgQ0xBU1MyX0VOQUJMRV9NQUlMQk9YX0lOVFIpOworCQllaWVpbygpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc3RvcmVfbWZjX3NsYnMoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcml2MiBfX2lvbWVtICpwcml2MiA9IHNwdS0+cHJpdjI7CisJaW50IGk7CisKKwkvKiBSZXN0b3JlLCBTdGVwIDY4OgorCSAqICAgICBJZiBNRkNfU1IxW1JdPScxJywgcmVzdG9yZSBTTEJzIGZyb20gQ1NBLgorCSAqLworCWlmIChjc2EtPnByaXYxLm1mY19zcjFfUlcgJiBNRkNfU1RBVEUxX1JFTE9DQVRFX01BU0spIHsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJb3V0X2JlNjQoJnByaXYyLT5zbGJfaW5kZXhfVywgaSk7CisJCQllaWVpbygpOworCQkJb3V0X2JlNjQoJnByaXYyLT5zbGJfZXNpZF9SVywgY3NhLT5zbGJfZXNpZF9SV1tpXSk7CisJCQlvdXRfYmU2NCgmcHJpdjItPnNsYl92c2lkX1JXLCBjc2EtPnNsYl92c2lkX1JXW2ldKTsKKwkJCWVpZWlvKCk7CisJCX0KKwkJb3V0X2JlNjQoJnByaXYyLT5zbGJfaW5kZXhfVywgY3NhLT5wcml2Mi5zbGJfaW5kZXhfVyk7CisJCWVpZWlvKCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzdG9yZV9tZmNfc3IxKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCS8qIFJlc3RvcmUsIFN0ZXAgNjk6CisJICogICAgIFJlc3RvcmUgdGhlIE1GQ19TUjEgcmVnaXN0ZXIgZnJvbSBDU0EuCisJICovCisJc3B1X21mY19zcjFfc2V0KHNwdSwgY3NhLT5wcml2MS5tZmNfc3IxX1JXKTsKKwllaWVpbygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzdG9yZV9vdGhlcl9zcHVfYWNjZXNzKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwKKwkJCQkJICAgIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwkvKiBSZXN0b3JlLCBTdGVwIDcwOgorCSAqICAgICBSZXN0b3JlIG90aGVyIFNQVSBtYXBwaW5ncyB0byB0aGlzIFNQVS4gVEJELgorCSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzdG9yZV9zcHVfcnVuY250bChzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3Byb2JsZW0gX19pb21lbSAqcHJvYiA9IHNwdS0+cHJvYmxlbTsKKworCS8qIFJlc3RvcmUsIFN0ZXAgNzE6CisJICogICAgIElmIENTQS5TUFVfU3RhdHVzW1JdPTEgdGhlbiB3cml0ZQorCSAqICAgICBTUFVfUnVuQ250bFtSMFIxXT0nMDEnLgorCSAqLworCWlmIChjc2EtPnByb2Iuc3B1X3N0YXR1c19SICYgU1BVX1NUQVRVU19SVU5OSU5HKSB7CisJCW91dF9iZTMyKCZwcm9iLT5zcHVfcnVuY250bF9SVywgU1BVX1JVTkNOVExfUlVOTkFCTEUpOworCQllaWVpbygpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc3RvcmVfbWZjX2NudGwoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcml2MiBfX2lvbWVtICpwcml2MiA9IHNwdS0+cHJpdjI7CisKKwkvKiBSZXN0b3JlLCBTdGVwIDcyOgorCSAqICAgIFJlc3RvcmUgdGhlIE1GQ19DTlRMIHJlZ2lzdGVyIGZvciB0aGUgQ1NBLgorCSAqLworCW91dF9iZTY0KCZwcml2Mi0+bWZjX2NvbnRyb2xfUlcsIGNzYS0+cHJpdjIubWZjX2NvbnRyb2xfUlcpOworCWVpZWlvKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfdXNlcl9hY2Nlc3Moc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJLyogUmVzdG9yZSwgU3RlcCA3MzoKKwkgKiAgICAgRW5hYmxlIHVzZXItc3BhY2UgYWNjZXNzIChpZiBwcm92aWRlZCkgdG8gdGhpcworCSAqICAgICBTUFUgYnkgbWFwcGluZyB0aGUgdmlydHVhbCBwYWdlcyBhc3NpZ25lZCB0bworCSAqICAgICB0aGUgU1BVIG1lbW9yeS1tYXBwZWQgSS9PIChNTUlPKSBmb3IgcHJvYmxlbQorCSAqICAgICBzdGF0ZS4gVEJELgorCSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzZXRfc3dpdGNoX2FjdGl2ZShzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwkvKiBSZXN0b3JlLCBTdGVwIDc0OgorCSAqICAgICBSZXNldCB0aGUgImNvbnRleHQgc3dpdGNoIGFjdGl2ZSIgZmxhZy4KKwkgKi8KKwljbGVhcl9iaXQoU1BVX0NPTlRFWFRfU1dJVENIX0FDVElWRSwgJnNwdS0+ZmxhZ3MpOworCW1iKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWVuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQoreworCS8qIFJlc3RvcmUsIFN0ZXAgNzU6CisJICogICAgIFJlLWVuYWJsZSBTUFUgaW50ZXJydXB0cy4KKwkgKi8KKwlzcGluX2xvY2tfaXJxKCZzcHUtPnJlZ2lzdGVyX2xvY2spOworCXNwdV9pbnRfbWFza19zZXQoc3B1LCAwLCBjc2EtPnByaXYxLmludF9tYXNrX2NsYXNzMF9SVyk7CisJc3B1X2ludF9tYXNrX3NldChzcHUsIDEsIGNzYS0+cHJpdjEuaW50X21hc2tfY2xhc3MxX1JXKTsKKwlzcHVfaW50X21hc2tfc2V0KHNwdSwgMiwgY3NhLT5wcml2MS5pbnRfbWFza19jbGFzczJfUlcpOworCXNwaW5fdW5sb2NrX2lycSgmc3B1LT5yZWdpc3Rlcl9sb2NrKTsKK30KKworc3RhdGljIGludCBxdWllY2Vfc3B1KHN0cnVjdCBzcHVfc3RhdGUgKnByZXYsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwkvKgorCSAqIENvbWJpbmVkIHN0ZXBzIDItMTggb2YgU1BVIGNvbnRleHQgc2F2ZSBzZXF1ZW5jZSwgd2hpY2gKKwkgKiBxdWllc2NlIHRoZSBTUFUgc3RhdGUgKGRpc2FibGUgU1BVIGV4ZWN1dGlvbiwgTUZDIGNvbW1hbmQKKwkgKiBxdWV1ZXMsIGRlY3JlbWVudGVyLCBTUFUgaW50ZXJydXB0cywgZXRjLikuCisJICoKKwkgKiBSZXR1cm5zICAgICAgMCBvbiBzdWNjZXNzLgorCSAqICAgICAgICAgICAgICAyIGlmIGZhaWxlZCBzdGVwIDIuCisJICogICAgICAgICAgICAgIDYgaWYgZmFpbGVkIHN0ZXAgNi4KKwkgKi8KKworCWlmIChjaGVja19zcHVfaXNvbGF0ZShwcmV2LCBzcHUpKSB7CS8qIFN0ZXAgMi4gKi8KKwkJcmV0dXJuIDI7CisJfQorCWRpc2FibGVfaW50ZXJydXB0cyhwcmV2LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgMy4gKi8KKwlzZXRfd2F0Y2hkb2dfdGltZXIocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDQuICovCisJaW5oaWJpdF91c2VyX2FjY2VzcyhwcmV2LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgNS4gKi8KKwlpZiAoY2hlY2tfc3B1X2lzb2xhdGUocHJldiwgc3B1KSkgewkvKiBTdGVwIDYuICovCisJCXJldHVybiA2OworCX0KKwlzZXRfc3dpdGNoX3BlbmRpbmcocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDcuICovCisJc2F2ZV9tZmNfY250bChwcmV2LCBzcHUpOwkJLyogU3RlcCA4LiAqLworCXNhdmVfc3B1X3J1bmNudGwocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDkuICovCisJc2F2ZV9tZmNfc3IxKHByZXYsIHNwdSk7CSAgICAgICAgLyogU3RlcCAxMC4gKi8KKwlzYXZlX3NwdV9zdGF0dXMocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDExLiAqLworCXNhdmVfbWZjX2RlY3IocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDEyLiAqLworCWhhbHRfbWZjX2RlY3IocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDEzLiAqLworCXNhdmVfdGltZWJhc2UocHJldiwgc3B1KTsJCS8qIFN0ZXAgMTQuICovCisJcmVtb3ZlX290aGVyX3NwdV9hY2Nlc3MocHJldiwgc3B1KTsJLyogU3RlcCAxNS4gKi8KKwlkb19tZmNfbXNzeW5jKHByZXYsIHNwdSk7CSAgICAgICAgLyogU3RlcCAxNi4gKi8KKwlpc3N1ZV9tZmNfdGxiaWUocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDE3LiAqLworCWhhbmRsZV9wZW5kaW5nX2ludGVycnVwdHMocHJldiwgc3B1KTsJLyogU3RlcCAxOC4gKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzYXZlX2NzYShzdHJ1Y3Qgc3B1X3N0YXRlICpwcmV2LCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJLyoKKwkgKiBDb21iaW5lIHN0ZXBzIDE5LTQ0IG9mIFNQVSBjb250ZXh0IHNhdmUgc2VxdWVuY2UsIHdoaWNoCisJICogc2F2ZSByZWdpb25zIG9mIHRoZSBwcml2aWxlZ2VkICYgcHJvYmxlbSBzdGF0ZSBhcmVhcy4KKwkgKi8KKworCXNhdmVfbWZjX3F1ZXVlcyhwcmV2LCBzcHUpOwkvKiBTdGVwIDE5LiAqLworCXNhdmVfcHB1X3F1ZXJ5bWFzayhwcmV2LCBzcHUpOwkvKiBTdGVwIDIwLiAqLworCXNhdmVfcHB1X3F1ZXJ5dHlwZShwcmV2LCBzcHUpOwkvKiBTdGVwIDIxLiAqLworCXNhdmVfbWZjX2Nzcl90c3EocHJldiwgc3B1KTsJLyogU3RlcCAyMi4gKi8KKwlzYXZlX21mY19jc3JfY21kKHByZXYsIHNwdSk7CS8qIFN0ZXAgMjMuICovCisJc2F2ZV9tZmNfY3NyX2F0byhwcmV2LCBzcHUpOwkvKiBTdGVwIDI0LiAqLworCXNhdmVfbWZjX3RjbGFzc19pZChwcmV2LCBzcHUpOwkvKiBTdGVwIDI1LiAqLworCXNldF9tZmNfdGNsYXNzX2lkKHByZXYsIHNwdSk7CS8qIFN0ZXAgMjYuICovCisJcHVyZ2VfbWZjX3F1ZXVlKHByZXYsIHNwdSk7CS8qIFN0ZXAgMjcuICovCisJd2FpdF9wdXJnZV9jb21wbGV0ZShwcmV2LCBzcHUpOwkvKiBTdGVwIDI4LiAqLworCXNhdmVfbWZjX3NsYnMocHJldiwgc3B1KTsJLyogU3RlcCAyOS4gKi8KKwlzZXR1cF9tZmNfc3IxKHByZXYsIHNwdSk7CS8qIFN0ZXAgMzAuICovCisJc2F2ZV9zcHVfbnBjKHByZXYsIHNwdSk7CS8qIFN0ZXAgMzEuICovCisJc2F2ZV9zcHVfcHJpdmNudGwocHJldiwgc3B1KTsJLyogU3RlcCAzMi4gKi8KKwlyZXNldF9zcHVfcHJpdmNudGwocHJldiwgc3B1KTsJLyogU3RlcCAzMy4gKi8KKwlzYXZlX3NwdV9sc2xyKHByZXYsIHNwdSk7CS8qIFN0ZXAgMzQuICovCisJcmVzZXRfc3B1X2xzbHIocHJldiwgc3B1KTsJLyogU3RlcCAzNS4gKi8KKwlzYXZlX3NwdV9jZmcocHJldiwgc3B1KTsJLyogU3RlcCAzNi4gKi8KKwlzYXZlX3BtX3RyYWNlKHByZXYsIHNwdSk7CS8qIFN0ZXAgMzcuICovCisJc2F2ZV9tZmNfcmFnKHByZXYsIHNwdSk7CS8qIFN0ZXAgMzguICovCisJc2F2ZV9wcHVfbWJfc3RhdChwcmV2LCBzcHUpOwkvKiBTdGVwIDM5LiAqLworCXNhdmVfcHB1X21iKHByZXYsIHNwdSk7CSAgICAgICAgLyogU3RlcCA0MC4gKi8KKwlzYXZlX3BwdWludF9tYihwcmV2LCBzcHUpOwkvKiBTdGVwIDQxLiAqLworCXNhdmVfY2hfcGFydDEocHJldiwgc3B1KTsJLyogU3RlcCA0Mi4gKi8KKwlzYXZlX3NwdV9tYihwcmV2LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgNDMuICovCisJc2F2ZV9tZmNfY21kKHByZXYsIHNwdSk7CS8qIFN0ZXAgNDQuICovCisJcmVzZXRfY2gocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDQ1LiAqLworfQorCitzdGF0aWMgdm9pZCBzYXZlX2xzY3NhKHN0cnVjdCBzcHVfc3RhdGUgKnByZXYsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwkvKgorCSAqIFBlcmZvcm0gc3RlcHMgNDYtNTcgb2YgU1BVIGNvbnRleHQgc2F2ZSBzZXF1ZW5jZSwKKwkgKiB3aGljaCBzYXZlIHJlZ2lvbnMgb2YgdGhlIGxvY2FsIHN0b3JlIGFuZCByZWdpc3RlcgorCSAqIGZpbGUuCisJICovCisKKwlyZXN1bWVfbWZjX3F1ZXVlKHByZXYsIHNwdSk7CS8qIFN0ZXAgNDYuICovCisJc2V0dXBfbWZjX3NsYnMocHJldiwgc3B1KTsJLyogU3RlcCA0Ny4gKi8KKwlzZXRfc3dpdGNoX2FjdGl2ZShwcmV2LCBzcHUpOwkvKiBTdGVwIDQ4LiAqLworCWVuYWJsZV9pbnRlcnJ1cHRzKHByZXYsIHNwdSk7CS8qIFN0ZXAgNDkuICovCisJc2F2ZV9sc18xNmtiKHByZXYsIHNwdSk7CS8qIFN0ZXAgNTAuICovCisJc2V0X3NwdV9ucGMocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDUxLiAqLworCXNldF9zaWdub3QxKHByZXYsIHNwdSk7CQkvKiBTdGVwIDUyLiAqLworCXNldF9zaWdub3QyKHByZXYsIHNwdSk7CQkvKiBTdGVwIDUzLiAqLworCXNlbmRfc2F2ZV9jb2RlKHByZXYsIHNwdSk7CS8qIFN0ZXAgNTQuICovCisJc2V0X3BwdV9xdWVyeW1hc2socHJldiwgc3B1KTsJLyogU3RlcCA1NS4gKi8KKwl3YWl0X3RhZ19jb21wbGV0ZShwcmV2LCBzcHUpOwkvKiBTdGVwIDU2LiAqLworCXdhaXRfc3B1X3N0b3BwZWQocHJldiwgc3B1KTsJLyogU3RlcCA1Ny4gKi8KK30KKworc3RhdGljIHZvaWQgaGFydmVzdChzdHJ1Y3Qgc3B1X3N0YXRlICpwcmV2LCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJLyoKKwkgKiBQZXJmb3JtIHN0ZXBzIDItMjUgb2YgU1BVIGNvbnRleHQgcmVzdG9yZSBzZXF1ZW5jZSwKKwkgKiB3aGljaCByZXNldHMgYW4gU1BVIGVpdGhlciBhZnRlciBhIGZhaWxlZCBzYXZlLCBvcgorCSAqIHdoZW4gdXNpbmcgU1BVIGZvciBmaXJzdCB0aW1lLgorCSAqLworCisJZGlzYWJsZV9pbnRlcnJ1cHRzKHByZXYsIHNwdSk7CSAgICAgICAgLyogU3RlcCAyLiAgKi8KKwlpbmhpYml0X3VzZXJfYWNjZXNzKHByZXYsIHNwdSk7CSAgICAgICAgLyogU3RlcCAzLiAgKi8KKwl0ZXJtaW5hdGVfc3B1X2FwcChwcmV2LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgNC4gICovCisJc2V0X3N3aXRjaF9wZW5kaW5nKHByZXYsIHNwdSk7CSAgICAgICAgLyogU3RlcCA1LiAgKi8KKwlyZW1vdmVfb3RoZXJfc3B1X2FjY2VzcyhwcmV2LCBzcHUpOwkvKiBTdGVwIDYuICAqLworCXN1c3BlbmRfbWZjKHByZXYsIHNwdSk7CSAgICAgICAgICAgICAgICAvKiBTdGVwIDcuICAqLworCXdhaXRfc3VzcGVuZF9tZmNfY29tcGxldGUocHJldiwgc3B1KTsJLyogU3RlcCA4LiAgKi8KKwlpZiAoIXN1c3BlbmRfc3BlKHByZXYsIHNwdSkpCSAgICAgICAgLyogU3RlcCA5LiAgKi8KKwkJY2xlYXJfc3B1X3N0YXR1cyhwcmV2LCBzcHUpOwkvKiBTdGVwIDEwLiAqLworCWRvX21mY19tc3N5bmMocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDExLiAqLworCWlzc3VlX21mY190bGJpZShwcmV2LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgMTIuICovCisJaGFuZGxlX3BlbmRpbmdfaW50ZXJydXB0cyhwcmV2LCBzcHUpOwkvKiBTdGVwIDEzLiAqLworCXB1cmdlX21mY19xdWV1ZShwcmV2LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgMTQuICovCisJd2FpdF9wdXJnZV9jb21wbGV0ZShwcmV2LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgMTUuICovCisJcmVzZXRfc3B1X3ByaXZjbnRsKHByZXYsIHNwdSk7CSAgICAgICAgLyogU3RlcCAxNi4gKi8KKwlyZXNldF9zcHVfbHNscihwcmV2LCBzcHUpOyAgICAgICAgICAgICAgLyogU3RlcCAxNy4gKi8KKwlzZXR1cF9tZmNfc3IxKHByZXYsIHNwdSk7CSAgICAgICAgLyogU3RlcCAxOC4gKi8KKwlpbnZhbGlkYXRlX3NsYnMocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDE5LiAqLworCXJlc2V0X2NoX3BhcnQxKHByZXYsIHNwdSk7CSAgICAgICAgLyogU3RlcCAyMC4gKi8KKwlyZXNldF9jaF9wYXJ0MihwcmV2LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgMjEuICovCisJZW5hYmxlX2ludGVycnVwdHMocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDIyLiAqLworCXNldF9zd2l0Y2hfYWN0aXZlKHByZXYsIHNwdSk7CSAgICAgICAgLyogU3RlcCAyMy4gKi8KKwlzZXRfbWZjX3RjbGFzc19pZChwcmV2LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgMjQuICovCisJcmVzdW1lX21mY19xdWV1ZShwcmV2LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgMjUuICovCit9CisKK3N0YXRpYyB2b2lkIHJlc3RvcmVfbHNjc2Eoc3RydWN0IHNwdV9zdGF0ZSAqbmV4dCwgc3RydWN0IHNwdSAqc3B1KQoreworCS8qCisJICogUGVyZm9ybSBzdGVwcyAyNi00MCBvZiBTUFUgY29udGV4dCByZXN0b3JlIHNlcXVlbmNlLAorCSAqIHdoaWNoIHJlc3RvcmVzIHJlZ2lvbnMgb2YgdGhlIGxvY2FsIHN0b3JlIGFuZCByZWdpc3RlcgorCSAqIGZpbGUuCisJICovCisKKwlzZXRfd2F0Y2hkb2dfdGltZXIobmV4dCwgc3B1KTsJICAgICAgICAvKiBTdGVwIDI2LiAqLworCXNldHVwX3NwdV9zdGF0dXNfcGFydDEobmV4dCwgc3B1KTsJLyogU3RlcCAyNy4gKi8KKwlzZXR1cF9zcHVfc3RhdHVzX3BhcnQyKG5leHQsIHNwdSk7CS8qIFN0ZXAgMjguICovCisJcmVzdG9yZV9tZmNfcmFnKG5leHQsIHNwdSk7CSAgICAgICAgLyogU3RlcCAyOS4gKi8KKwlzZXR1cF9tZmNfc2xicyhuZXh0LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgMzAuICovCisJc2V0X3NwdV9ucGMobmV4dCwgc3B1KTsJICAgICAgICAgICAgICAgIC8qIFN0ZXAgMzEuICovCisJc2V0X3NpZ25vdDEobmV4dCwgc3B1KTsJICAgICAgICAgICAgICAgIC8qIFN0ZXAgMzIuICovCisJc2V0X3NpZ25vdDIobmV4dCwgc3B1KTsJICAgICAgICAgICAgICAgIC8qIFN0ZXAgMzMuICovCisJc2V0dXBfZGVjcihuZXh0LCBzcHUpOwkgICAgICAgICAgICAgICAgLyogU3RlcCAzNC4gKi8KKwlzZXR1cF9wcHVfbWIobmV4dCwgc3B1KTsJICAgICAgICAvKiBTdGVwIDM1LiAqLworCXNldHVwX3BwdWludF9tYihuZXh0LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgMzYuICovCisJc2VuZF9yZXN0b3JlX2NvZGUobmV4dCwgc3B1KTsJICAgICAgICAvKiBTdGVwIDM3LiAqLworCXNldF9wcHVfcXVlcnltYXNrKG5leHQsIHNwdSk7CSAgICAgICAgLyogU3RlcCAzOC4gKi8KKwl3YWl0X3RhZ19jb21wbGV0ZShuZXh0LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgMzkuICovCisJd2FpdF9zcHVfc3RvcHBlZChuZXh0LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgNDAuICovCit9CisKK3N0YXRpYyB2b2lkIHJlc3RvcmVfY3NhKHN0cnVjdCBzcHVfc3RhdGUgKm5leHQsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwkvKgorCSAqIENvbWJpbmUgc3RlcHMgNDEtNzYgb2YgU1BVIGNvbnRleHQgcmVzdG9yZSBzZXF1ZW5jZSwgd2hpY2gKKwkgKiByZXN0b3JlIHJlZ2lvbnMgb2YgdGhlIHByaXZpbGVnZWQgJiBwcm9ibGVtIHN0YXRlIGFyZWFzLgorCSAqLworCisJcmVzdG9yZV9zcHVfcHJpdmNudGwobmV4dCwgc3B1KTsJLyogU3RlcCA0MS4gKi8KKwlyZXN0b3JlX3N0YXR1c19wYXJ0MShuZXh0LCBzcHUpOwkvKiBTdGVwIDQyLiAqLworCXJlc3RvcmVfc3RhdHVzX3BhcnQyKG5leHQsIHNwdSk7CS8qIFN0ZXAgNDMuICovCisJcmVzdG9yZV9sc18xNmtiKG5leHQsIHNwdSk7CSAgICAgICAgLyogU3RlcCA0NC4gKi8KKwl3YWl0X3RhZ19jb21wbGV0ZShuZXh0LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgNDUuICovCisJc3VzcGVuZF9tZmMobmV4dCwgc3B1KTsJICAgICAgICAgICAgICAgIC8qIFN0ZXAgNDYuICovCisJd2FpdF9zdXNwZW5kX21mY19jb21wbGV0ZShuZXh0LCBzcHUpOwkvKiBTdGVwIDQ3LiAqLworCWlzc3VlX21mY190bGJpZShuZXh0LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgNDguICovCisJY2xlYXJfaW50ZXJydXB0cyhuZXh0LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgNDkuICovCisJcmVzdG9yZV9tZmNfcXVldWVzKG5leHQsIHNwdSk7CSAgICAgICAgLyogU3RlcCA1MC4gKi8KKwlyZXN0b3JlX3BwdV9xdWVyeW1hc2sobmV4dCwgc3B1KTsJLyogU3RlcCA1MS4gKi8KKwlyZXN0b3JlX3BwdV9xdWVyeXR5cGUobmV4dCwgc3B1KTsJLyogU3RlcCA1Mi4gKi8KKwlyZXN0b3JlX21mY19jc3JfdHNxKG5leHQsIHNwdSk7CSAgICAgICAgLyogU3RlcCA1My4gKi8KKwlyZXN0b3JlX21mY19jc3JfY21kKG5leHQsIHNwdSk7CSAgICAgICAgLyogU3RlcCA1NC4gKi8KKwlyZXN0b3JlX21mY19jc3JfYXRvKG5leHQsIHNwdSk7CSAgICAgICAgLyogU3RlcCA1NS4gKi8KKwlyZXN0b3JlX21mY190Y2xhc3NfaWQobmV4dCwgc3B1KTsJLyogU3RlcCA1Ni4gKi8KKwlzZXRfbGxyX2V2ZW50KG5leHQsIHNwdSk7CSAgICAgICAgLyogU3RlcCA1Ny4gKi8KKwlyZXN0b3JlX2RlY3Jfd3JhcHBlZChuZXh0LCBzcHUpOwkvKiBTdGVwIDU4LiAqLworCXJlc3RvcmVfY2hfcGFydDEobmV4dCwgc3B1KTsJICAgICAgICAvKiBTdGVwIDU5LiAqLworCXJlc3RvcmVfY2hfcGFydDIobmV4dCwgc3B1KTsJICAgICAgICAvKiBTdGVwIDYwLiAqLworCXJlc3RvcmVfc3B1X2xzbHIobmV4dCwgc3B1KTsJICAgICAgICAvKiBTdGVwIDYxLiAqLworCXJlc3RvcmVfc3B1X2NmZyhuZXh0LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgNjIuICovCisJcmVzdG9yZV9wbV90cmFjZShuZXh0LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgNjMuICovCisJcmVzdG9yZV9zcHVfbnBjKG5leHQsIHNwdSk7CSAgICAgICAgLyogU3RlcCA2NC4gKi8KKwlyZXN0b3JlX3NwdV9tYihuZXh0LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgNjUuICovCisJY2hlY2tfcHB1X21iX3N0YXQobmV4dCwgc3B1KTsJICAgICAgICAvKiBTdGVwIDY2LiAqLworCWNoZWNrX3BwdWludF9tYl9zdGF0KG5leHQsIHNwdSk7CS8qIFN0ZXAgNjcuICovCisJcmVzdG9yZV9tZmNfc2xicyhuZXh0LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgNjguICovCisJcmVzdG9yZV9tZmNfc3IxKG5leHQsIHNwdSk7CSAgICAgICAgLyogU3RlcCA2OS4gKi8KKwlyZXN0b3JlX290aGVyX3NwdV9hY2Nlc3MobmV4dCwgc3B1KTsJLyogU3RlcCA3MC4gKi8KKwlyZXN0b3JlX3NwdV9ydW5jbnRsKG5leHQsIHNwdSk7CSAgICAgICAgLyogU3RlcCA3MS4gKi8KKwlyZXN0b3JlX21mY19jbnRsKG5leHQsIHNwdSk7CSAgICAgICAgLyogU3RlcCA3Mi4gKi8KKwllbmFibGVfdXNlcl9hY2Nlc3MobmV4dCwgc3B1KTsJICAgICAgICAvKiBTdGVwIDczLiAqLworCXJlc2V0X3N3aXRjaF9hY3RpdmUobmV4dCwgc3B1KTsJICAgICAgICAvKiBTdGVwIDc0LiAqLworCXJlZW5hYmxlX2ludGVycnVwdHMobmV4dCwgc3B1KTsJICAgICAgICAvKiBTdGVwIDc1LiAqLworfQorCitzdGF0aWMgaW50IF9fZG9fc3B1X3NhdmUoc3RydWN0IHNwdV9zdGF0ZSAqcHJldiwgc3RydWN0IHNwdSAqc3B1KQoreworCWludCByYzsKKworCS8qCisJICogU1BVIGNvbnRleHQgc2F2ZSBjYW4gYmUgYnJva2VuIGludG8gdGhyZWUgcGhhc2VzOgorCSAqCisJICogICAgIChhKSBxdWllc2NlIFtzdGVwcyAyLTE2XS4KKwkgKiAgICAgKGIpIHNhdmUgb2YgQ1NBLCBwZXJmb3JtZWQgYnkgUFBFIFtzdGVwcyAxNy00Ml0KKwkgKiAgICAgKGMpIHNhdmUgb2YgTFNDU0EsIG1vc3RseSBwZXJmb3JtZWQgYnkgU1BVIFtzdGVwcyA0My01Ml0uCisJICoKKwkgKiBSZXR1cm5zICAgICAgMCBvbiBzdWNjZXNzLgorCSAqICAgICAgICAgICAgICAyLDYgaWYgZmFpbGVkIHRvIHF1aWVjZSBTUFUKKwkgKiAgICAgICAgICAgICAgNTMgaWYgU1BVLXNpZGUgb2Ygc2F2ZSBmYWlsZWQuCisJICovCisKKwlyYyA9IHF1aWVjZV9zcHUocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwcyAyLTE2LiAqLworCXN3aXRjaCAocmMpIHsKKwlkZWZhdWx0OgorCWNhc2UgMjoKKwljYXNlIDY6CisJCWhhcnZlc3QocHJldiwgc3B1KTsKKwkJcmV0dXJuIHJjOworCQlicmVhazsKKwljYXNlIDA6CisJCWJyZWFrOworCX0KKwlzYXZlX2NzYShwcmV2LCBzcHUpOwkgICAgICAgICAgICAgICAgLyogU3RlcHMgMTctNDMuICovCisJc2F2ZV9sc2NzYShwcmV2LCBzcHUpOwkgICAgICAgICAgICAgICAgLyogU3RlcHMgNDQtNTMuICovCisJcmV0dXJuIGNoZWNrX3NhdmVfc3RhdHVzKHByZXYsIHNwdSk7CS8qIFN0ZXAgNTQuICAgICAqLworfQorCitzdGF0aWMgaW50IF9fZG9fc3B1X3Jlc3RvcmUoc3RydWN0IHNwdV9zdGF0ZSAqbmV4dCwgc3RydWN0IHNwdSAqc3B1KQoreworCWludCByYzsKKworCS8qCisJICogU1BVIGNvbnRleHQgcmVzdG9yZSBjYW4gYmUgYnJva2VuIGludG8gdGhyZWUgcGhhc2VzOgorCSAqCisJICogICAgKGEpIGhhcnZlc3QgKG9yIHJlc2V0KSBTUFUgW3N0ZXBzIDItMjRdLgorCSAqICAgIChiKSByZXN0b3JlIExTQ1NBIFtzdGVwcyAyNS00MF0sIG1vc3RseSBwZXJmb3JtZWQgYnkgU1BVLgorCSAqICAgIChjKSByZXN0b3JlIENTQSBbc3RlcHMgNDEtNzZdLCBwZXJmb3JtZWQgYnkgUFBFLgorCSAqCisJICogVGhlICdoYXJ2ZXN0JyBzdGVwIGlzIG5vdCBwZXJmb3JtZWQgaGVyZSwgYnV0IHJhdGhlcgorCSAqIGFzIG5lZWRlZCBiZWxvdy4KKwkgKi8KKworCXJlc3RvcmVfbHNjc2EobmV4dCwgc3B1KTsJICAgICAgICAvKiBTdGVwcyAyNC0zOS4gKi8KKwlyYyA9IGNoZWNrX3Jlc3RvcmVfc3RhdHVzKG5leHQsIHNwdSk7CS8qIFN0ZXAgNDAuICAgICAqLworCXN3aXRjaCAocmMpIHsKKwlkZWZhdWx0OgorCQkvKiBGYWlsZWQuIFJldHVybiBub3cuICovCisJCXJldHVybiByYzsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQkvKiBGYWxsIHRocm91Z2ggdG8gbmV4dCBzdGVwLiAqLworCQlicmVhazsKKwl9CisJcmVzdG9yZV9jc2EobmV4dCwgc3B1KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHNwdV9zYXZlIC0gU1BVIGNvbnRleHQgc2F2ZSwgd2l0aCBsb2NraW5nLgorICogQHByZXY6IHBvaW50ZXIgdG8gU1BVIGNvbnRleHQgc2F2ZSBhcmVhLCB0byBiZSBzYXZlZC4KKyAqIEBzcHU6IHBvaW50ZXIgdG8gU1BVIGlvbWVtIHN0cnVjdHVyZS4KKyAqCisgKiBBY3F1aXJlIGxvY2tzLCBwZXJmb3JtIHRoZSBzYXZlIG9wZXJhdGlvbiB0aGVuIHJldHVybi4KKyAqLworaW50IHNwdV9zYXZlKHN0cnVjdCBzcHVfc3RhdGUgKnByZXYsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlpbnQgcmM7CisKKwlhY3F1aXJlX3NwdV9sb2NrKHNwdSk7CSAgICAgICAgLyogU3RlcCAxLiAgICAgKi8KKwlyYyA9IF9fZG9fc3B1X3NhdmUocHJldiwgc3B1KTsJLyogU3RlcHMgMi01My4gKi8KKwlyZWxlYXNlX3NwdV9sb2NrKHNwdSk7CisJaWYgKHJjKSB7CisJCXBhbmljKCIlcyBmYWlsZWQgb24gU1BVWyVkXSwgcmM9JWQuXG4iLAorCQkgICAgICBfX2Z1bmNfXywgc3B1LT5udW1iZXIsIHJjKTsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIHNwdV9yZXN0b3JlIC0gU1BVIGNvbnRleHQgcmVzdG9yZSwgd2l0aCBoYXJ2ZXN0IGFuZCBsb2NraW5nLgorICogQG5ldzogcG9pbnRlciB0byBTUFUgY29udGV4dCBzYXZlIGFyZWEsIHRvIGJlIHJlc3RvcmVkLgorICogQHNwdTogcG9pbnRlciB0byBTUFUgaW9tZW0gc3RydWN0dXJlLgorICoKKyAqIFBlcmZvcm0gaGFydmVzdCArIHJlc3RvcmUsIGFzIHdlIG1heSBub3QgYmUgY29taW5nCisgKiBmcm9tIGEgcHJldmlvdXMgc3VjY2VzZnVsIHNhdmUgb3BlcmF0aW9uLCBhbmQgdGhlCisgKiBoYXJkd2FyZSBzdGF0ZSBpcyB1bmtub3duLgorICovCitpbnQgc3B1X3Jlc3RvcmUoc3RydWN0IHNwdV9zdGF0ZSAqbmV3LCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJaW50IHJjOworCisJYWNxdWlyZV9zcHVfbG9jayhzcHUpOworCWhhcnZlc3QoTlVMTCwgc3B1KTsKKwlzcHUtPnN0b3BfY29kZSA9IDA7CisJc3B1LT5kYXIgPSAwOworCXNwdS0+ZHNpc3IgPSAwOworCXNwdS0+c2xiX3JlcGxhY2UgPSAwOworCXNwdS0+Y2xhc3NfMF9wZW5kaW5nID0gMDsKKwlyYyA9IF9fZG9fc3B1X3Jlc3RvcmUobmV3LCBzcHUpOworCXJlbGVhc2Vfc3B1X2xvY2soc3B1KTsKKwlpZiAocmMpIHsKKwkJcGFuaWMoIiVzIGZhaWxlZCBvbiBTUFVbJWRdIHJjPSVkLlxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBzcHUtPm51bWJlciwgcmMpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogc3B1X2hhcnZlc3QgLSBTUFUgaGFydmVzdCAocmVzZXQpIG9wZXJhdGlvbgorICogQHNwdTogcG9pbnRlciB0byBTUFUgaW9tZW0gc3RydWN0dXJlLgorICoKKyAqIFBlcmZvcm0gU1BVIGhhcnZlc3QgKHJlc2V0KSBvcGVyYXRpb24uCisgKi8KK3ZvaWQgc3B1X2hhcnZlc3Qoc3RydWN0IHNwdSAqc3B1KQoreworCWFjcXVpcmVfc3B1X2xvY2soc3B1KTsKKwloYXJ2ZXN0KE5VTEwsIHNwdSk7CisJcmVsZWFzZV9zcHVfbG9jayhzcHUpOworfQorCitzdGF0aWMgdm9pZCBpbml0X3Byb2Ioc3RydWN0IHNwdV9zdGF0ZSAqY3NhKQoreworCWNzYS0+c3B1X2NobmxjbnRfUldbOV0gPSAxOworCWNzYS0+c3B1X2NobmxjbnRfUldbMjFdID0gMTY7CisJY3NhLT5zcHVfY2hubGNudF9SV1syM10gPSAxOworCWNzYS0+c3B1X2NobmxjbnRfUldbMjhdID0gMTsKKwljc2EtPnNwdV9jaG5sY250X1JXWzMwXSA9IDE7CisJY3NhLT5wcm9iLnNwdV9ydW5jbnRsX1JXID0gU1BVX1JVTkNOVExfU1RPUDsKK30KKworc3RhdGljIHZvaWQgaW5pdF9wcml2MShzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EpCit7CisJLyogRW5hYmxlIGRlY29kZSwgcmVsb2NhdGUsIHRsYmllIHJlc3BvbnNlLCBtYXN0ZXIgcnVuY250bC4gKi8KKwljc2EtPnByaXYxLm1mY19zcjFfUlcgPSBNRkNfU1RBVEUxX0xPQ0FMX1NUT1JBR0VfREVDT0RFX01BU0sgfAorCSAgICBNRkNfU1RBVEUxX01BU1RFUl9SVU5fQ09OVFJPTF9NQVNLIHwKKwkgICAgTUZDX1NUQVRFMV9QUk9CTEVNX1NUQVRFX01BU0sgfAorCSAgICBNRkNfU1RBVEUxX1JFTE9DQVRFX01BU0sgfCBNRkNfU1RBVEUxX0JVU19UTEJJRV9NQVNLOworCisJLyogU2V0IHN0b3JhZ2UgZGVzY3JpcHRpb24uICAqLworCWNzYS0+cHJpdjEubWZjX3Nkcl9SVyA9IG1mc3ByKFNQUk5fU0RSMSk7CisKKwkvKiBFbmFibGUgT1Mtc3BlY2lmaWMgc2V0IG9mIGludGVycnVwdHMuICovCisJY3NhLT5wcml2MS5pbnRfbWFza19jbGFzczBfUlcgPSBDTEFTUzBfRU5BQkxFX0RNQV9BTElHTk1FTlRfSU5UUiB8CisJICAgIENMQVNTMF9FTkFCTEVfSU5WQUxJRF9ETUFfQ09NTUFORF9JTlRSIHwKKwkgICAgQ0xBU1MwX0VOQUJMRV9TUFVfRVJST1JfSU5UUjsKKwljc2EtPnByaXYxLmludF9tYXNrX2NsYXNzMV9SVyA9IENMQVNTMV9FTkFCTEVfU0VHTUVOVF9GQVVMVF9JTlRSIHwKKwkgICAgQ0xBU1MxX0VOQUJMRV9TVE9SQUdFX0ZBVUxUX0lOVFI7CisJY3NhLT5wcml2MS5pbnRfbWFza19jbGFzczJfUlcgPSBDTEFTUzJfRU5BQkxFX1NQVV9TVE9QX0lOVFIgfAorCSAgICBDTEFTUzJfRU5BQkxFX1NQVV9IQUxUX0lOVFI7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcHJpdjIoc3RydWN0IHNwdV9zdGF0ZSAqY3NhKQoreworCWNzYS0+cHJpdjIuc3B1X2xzbHJfUlcgPSBMU19BRERSX01BU0s7CisJY3NhLT5wcml2Mi5tZmNfY29udHJvbF9SVyA9IE1GQ19DTlRMX1JFU1VNRV9ETUFfUVVFVUUgfAorCSAgICBNRkNfQ05UTF9OT1JNQUxfRE1BX1FVRVVFX09QRVJBVElPTiB8CisJICAgIE1GQ19DTlRMX0RNQV9RVUVVRVNfRU1QVFlfTUFTSzsKK30KKworLyoqCisgKiBzcHVfYWxsb2NfY3NhIC0gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYW4gU1BVIGNvbnRleHQgc2F2ZSBhcmVhLgorICoKKyAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBjb250ZW50cyBvZiBhbiBTUFUgY29udGV4dCBzYXZlIGFyZWEuCisgKiBUaGlzIGluY2x1ZGVzIGVuYWJsaW5nIGFkZHJlc3MgdHJhbnNsYXRpb24sIGludGVycnVwdCBtYXNrcywgZXRjLiwKKyAqIGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgZ2l2ZW4gT1MgZW52aXJvbm1lbnQuCisgKgorICogTm90ZSB0aGF0IHN0b3JhZ2UgZm9yIHRoZSAnbHNjc2EnIGlzIGFsbG9jYXRlZCBzZXBhcmF0ZWx5LAorICogYXMgaXQgaXMgYnkgZmFyIHRoZSBsYXJnZXN0IG9mIHRoZSBjb250ZXh0IHNhdmUgcmVnaW9ucywKKyAqIGFuZCBtYXkgbmVlZCB0byBiZSBwaW5uZWQgb3Igb3RoZXJ3aXNlIHNwZWNpYWxseSBhbGlnbmVkLgorICovCit2b2lkIHNwdV9pbml0X2NzYShzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EpCit7CisJc3RydWN0IHNwdV9sc2NzYSAqbHNjc2E7CisJdW5zaWduZWQgY2hhciAqcDsKKworCWlmICghY3NhKQorCQlyZXR1cm47CisJbWVtc2V0KGNzYSwgMCwgc2l6ZW9mKHN0cnVjdCBzcHVfc3RhdGUpKTsKKworCWxzY3NhID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IHNwdV9sc2NzYSkpOworCWlmICghbHNjc2EpCisJCXJldHVybjsKKworCW1lbXNldChsc2NzYSwgMCwgc2l6ZW9mKHN0cnVjdCBzcHVfbHNjc2EpKTsKKwljc2EtPmxzY3NhID0gbHNjc2E7CisJY3NhLT5yZWdpc3Rlcl9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCisJLyogU2V0IExTIHBhZ2VzIHJlc2VydmVkIHRvIGFsbG93IGZvciB1c2VyLXNwYWNlIG1hcHBpbmcuICovCisJZm9yIChwID0gbHNjc2EtPmxzOyBwIDwgbHNjc2EtPmxzICsgTFNfU0laRTsgcCArPSBQQUdFX1NJWkUpCisJCVNldFBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UocCkpOworCisJaW5pdF9wcm9iKGNzYSk7CisJaW5pdF9wcml2MShjc2EpOworCWluaXRfcHJpdjIoY3NhKTsKK30KKwordm9pZCBzcHVfZmluaV9jc2Eoc3RydWN0IHNwdV9zdGF0ZSAqY3NhKQoreworCS8qIENsZWFyIHJlc2VydmVkIGJpdCBiZWZvcmUgdmZyZWUuICovCisJdW5zaWduZWQgY2hhciAqcDsKKwlmb3IgKHAgPSBjc2EtPmxzY3NhLT5sczsgcCA8IGNzYS0+bHNjc2EtPmxzICsgTFNfU0laRTsgcCArPSBQQUdFX1NJWkUpCisJCUNsZWFyUGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZShwKSk7CisKKwl2ZnJlZShjc2EtPmxzY3NhKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zeXNjYWxscy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N5c2NhbGxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY1NjVhOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zeXNjYWxscy5jCkBAIC0wLDAgKzEsMTAzIEBACisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgInNwdWZzLmgiCisKKy8qKgorICogc3lzX3NwdV9ydW4gLSBydW4gY29kZSBsb2FkZWQgaW50byBhbiBTUFUKKyAqCisgKiBAdW5wYzogICAgbmV4dCBwcm9ncmFtIGNvdW50ZXIgZm9yIHRoZSBTUFUKKyAqIEB1c3RhdHVzOiBzdGF0dXMgb2YgdGhlIFNQVQorICoKKyAqIFRoaXMgc3lzdGVtIGNhbGwgdHJhbnNmZXJzIHRoZSBjb250cm9sIG9mIGV4ZWN1dGlvbiBvZiBhCisgKiB1c2VyIHNwYWNlIHRocmVhZCB0byBhbiBTUFUuIEl0IHdpbGwgcmV0dXJuIHdoZW4gdGhlCisgKiBTUFUgaGFzIGZpbmlzaGVkIGV4ZWN1dGluZyBvciB3aGVuIGl0IGhpdHMgYW4gZXJyb3IKKyAqIGNvbmRpdGlvbiBhbmQgaXQgd2lsbCBiZSBpbnRlcnJ1cHRlZCBpZiBhIHNpZ25hbCBuZWVkcworICogdG8gYmUgZGVsaXZlcmVkIHRvIGEgaGFuZGxlciBpbiB1c2VyIHNwYWNlLgorICoKKyAqIFRoZSBuZXh0IHByb2dyYW0gY291bnRlciBpcyBzZXQgdG8gdGhlIHBhc3NlZCB2YWx1ZQorICogYmVmb3JlIHRoZSBTUFUgc3RhcnRzIGZldGNoaW5nIGNvZGUgYW5kIHRoZSB1c2VyIHNwYWNlCisgKiBwb2ludGVyIGdldHMgdXBkYXRlZCB3aXRoIHRoZSBuZXcgdmFsdWUgd2hlbiByZXR1cm5pbmcKKyAqIGZyb20ga2VybmVsIHNwYWNlLgorICoKKyAqIFRoZSBzdGF0dXMgdmFsdWUgcmV0dXJuZWQgZnJvbSBzcHVfcnVuIHJlZmxlY3RzIHRoZQorICogdmFsdWUgb2YgdGhlIHNwdV9zdGF0dXMgcmVnaXN0ZXIgYWZ0ZXIgdGhlIFNQVSBoYXMgc3RvcHBlZC4KKyAqCisgKi8KK3N0YXRpYyBsb25nIGRvX3NwdV9ydW4oc3RydWN0IGZpbGUgKmZpbHAsCisJCQlfX3UzMiBfX3VzZXIgKnVucGMsCisJCQlfX3UzMiBfX3VzZXIgKnVzdGF0dXMpCit7CisJbG9uZyByZXQ7CisJc3RydWN0IHNwdWZzX2lub2RlX2luZm8gKmk7CisJdTMyIG5wYywgc3RhdHVzOworCisJcmV0ID0gLUVGQVVMVDsKKwlpZiAoZ2V0X3VzZXIobnBjLCB1bnBjKSB8fCBnZXRfdXNlcihzdGF0dXMsIHVzdGF0dXMpKQorCQlnb3RvIG91dDsKKworCS8qIGNoZWNrIGlmIHRoaXMgZmlsZSB3YXMgY3JlYXRlZCBieSBzcHVfY3JlYXRlICovCisJcmV0ID0gLUVJTlZBTDsKKwlpZiAoZmlscC0+Zl9vcCAhPSAmc3B1ZnNfY29udGV4dF9mb3BzKQorCQlnb3RvIG91dDsKKworCWkgPSBTUFVGU19JKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlyZXQgPSBzcHVmc19ydW5fc3B1KGZpbHAsIGktPmlfY3R4LCAmbnBjLCAmc3RhdHVzKTsKKworCWlmIChwdXRfdXNlcihucGMsIHVucGMpIHx8IHB1dF91c2VyKHN0YXR1cywgdXN0YXR1cykpCisJCXJldCA9IC1FRkFVTFQ7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworI2lmbmRlZiBNT0RVTEUKK2FzbWxpbmthZ2UgbG9uZyBzeXNfc3B1X3J1bihpbnQgZmQsIF9fdTMyIF9fdXNlciAqdW5wYywgX191MzIgX191c2VyICp1c3RhdHVzKQoreworCWludCBmcHV0X25lZWRlZDsKKwlzdHJ1Y3QgZmlsZSAqZmlscDsKKwlsb25nIHJldDsKKworCXJldCA9IC1FQkFERjsKKwlmaWxwID0gZmdldF9saWdodChmZCwgJmZwdXRfbmVlZGVkKTsKKwlpZiAoZmlscCkgeworCQlyZXQgPSBkb19zcHVfcnVuKGZpbHAsIHVucGMsIHVzdGF0dXMpOworCQlmcHV0X2xpZ2h0KGZpbHAsIGZwdXRfbmVlZGVkKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfc3B1X2NyZWF0ZShjb25zdCBjaGFyIF9fdXNlciAqcGF0aG5hbWUsCisJCQkJCXVuc2lnbmVkIGludCBmbGFncywgbW9kZV90IG1vZGUpCit7CisJY2hhciAqdG1wOworCWludCByZXQ7CisKKwl0bXAgPSBnZXRuYW1lKHBhdGhuYW1lKTsKKwlyZXQgPSBQVFJfRVJSKHRtcCk7CisJaWYgKCFJU19FUlIodG1wKSkgeworCQlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCisJCXJldCA9IHBhdGhfbG9va3VwKHRtcCwgTE9PS1VQX1BBUkVOVHwKKwkJCQlMT09LVVBfT1BFTnxMT09LVVBfQ1JFQVRFLCAmbmQpOworCQlpZiAoIXJldCkgeworCQkJcmV0ID0gc3B1ZnNfY3JlYXRlX3RocmVhZCgmbmQsIGZsYWdzLCBtb2RlKTsKKwkJCXBhdGhfcmVsZWFzZSgmbmQpOworCQl9CisJCXB1dG5hbWUodG1wKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3Qgc3B1ZnNfY2FsbHMgc3B1ZnNfY2FsbHMgPSB7CisJLmNyZWF0ZV90aHJlYWQgPSBzeXNfc3B1X2NyZWF0ZSwKKwkuc3B1X3J1biA9IGRvX3NwdV9ydW4sCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3BjaS5jCmluZGV4IDgyYzQyOWQuLjAwYzUyZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvcGNpLmMKQEAgLTEzNSwxMiArMTM1LDEzIEBACiBoeWRyYV9pbml0KHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlzdHJ1Y3QgcmVzb3VyY2UgcjsKIAogCW5wID0gZmluZF9kZXZpY2VzKCJtYWMtaW8iKTsKLQlpZiAobnAgPT0gTlVMTCB8fCBucC0+bl9hZGRycyA9PSAwKQorCWlmIChucCA9PSBOVUxMIHx8IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyKSkKIAkJcmV0dXJuIDA7Ci0JSHlkcmEgPSBpb3JlbWFwKG5wLT5hZGRyc1swXS5hZGRyZXNzLCBucC0+YWRkcnNbMF0uc2l6ZSk7Ci0JcHJpbnRrKCJIeWRyYSBNYWMgSS9PIGF0ICVseFxuIiwgbnAtPmFkZHJzWzBdLmFkZHJlc3MpOworCUh5ZHJhID0gaW9yZW1hcChyLnN0YXJ0LCByLmVuZC1yLnN0YXJ0KTsKKwlwcmludGsoIkh5ZHJhIE1hYyBJL08gYXQgJWx4XG4iLCByLnN0YXJ0KTsKIAlwcmludGsoIkh5ZHJhIEZlYXR1cmVfQ29udHJvbCB3YXMgJXgiLAogCSAgICAgICBpbl9sZTMyKCZIeWRyYS0+RmVhdHVyZV9Db250cm9sKSk7CiAJb3V0X2xlMzIoJkh5ZHJhLT5GZWF0dXJlX0NvbnRyb2wsIChIWURSQV9GQ19TQ0NfQ0VMTF9FTiB8CkBAIC0xNzcsMTggKzE3OCwyNCBAQAogewogCXUzMiBfX2lvbWVtICpyZWc7CiAJdTMyIHZhbDsKLQl1bnNpZ25lZCBsb25nIGFkZHIgPSBkZXYtPmFkZHJzWzBdLmFkZHJlc3M7CisJc3RydWN0IHJlc291cmNlIHI7CiAKLQlzZXR1cF9pbmRpcmVjdF9wY2koaG9zZSwgYWRkciArIDB4ZjgwMDAsIGFkZHIgKyAweGY4MDEwKTsKKwlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShkZXYsIDAsICZyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIk5vIGFkZHJlc3MgZm9yIFB5dGhvbiBQQ0kgY29udHJvbGxlclxuIik7CisJCXJldHVybjsKKwl9CiAKIAkvKiBDbGVhciB0aGUgbWFnaWMgZ28tc2xvdyBiaXQgKi8KLQlyZWcgPSBpb3JlbWFwKGRldi0+YWRkcnNbMF0uYWRkcmVzcyArIDB4ZjYwMDAsIDB4NDApOworCXJlZyA9IGlvcmVtYXAoci5zdGFydCArIDB4ZjYwMDAsIDB4NDApOworCUJVR19PTighcmVnKTsgCiAJdmFsID0gaW5fYmUzMigmcmVnWzEyXSk7CiAJaWYgKHZhbCAmIFBSR19DTF9SRVNFVF9WQUxJRCkgewogCQlvdXRfYmUzMigmcmVnWzEyXSwgdmFsICYgflBSR19DTF9SRVNFVF9WQUxJRCk7CiAJCWluX2JlMzIoJnJlZ1sxMl0pOwogCX0KIAlpb3VubWFwKHJlZyk7CisKKwlzZXR1cF9pbmRpcmVjdF9wY2koaG9zZSwgci5zdGFydCArIDB4ZjgwMDAsIHIuc3RhcnQgKyAweGY4MDEwKTsKIH0KIAogLyogTWFydmVsbCBEaXNjb3ZlcnkgSUkgYmFzZWQgUGVnYXNvcyAyICovCkBAIC0yMTgsNyArMjI1LDcgQEAKIAljaGFyICptb2RlbCwgKm1hY2hpbmU7CiAJaW50IGlzX2xvbmd0cmFpbCA9IDAsIGlzX21vdCA9IDAsIGlzX3BlZ2Fzb3MgPSAwOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcm9vdCA9IGZpbmRfcGF0aF9kZXZpY2UoIi8iKTsKLQorCXN0cnVjdCByZXNvdXJjZSByOwogCS8qCiAJICogVGhlIFBDSSBob3N0IGJyaWRnZSBub2RlcyBvbiBzb21lIG1hY2hpbmVzIGRvbid0IGhhdmUKIAkgKiBwcm9wZXJ0aWVzIHRvIGFkZXF1YXRlbHkgaWRlbnRpZnkgdGhlbSwgc28gd2UgaGF2ZSB0bwpAQCAtMjM4LDcgKzI0NSw3IEBACiAJCQljb250aW51ZTsKIAkJKytpbmRleDsKIAkJLyogVGhlIEdHMiBicmlkZ2Ugb24gdGhlIExvbmdUcmFpbCBkb2Vzbid0IGhhdmUgYW4gYWRkcmVzcyAqLwotCQlpZiAoZGV2LT5uX2FkZHJzIDwgMSAmJiAhaXNfbG9uZ3RyYWlsKSB7CisJCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKGRldiwgMCwgJnIpICYmICFpc19sb25ndHJhaWwpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbid0IHVzZSAlczogbm8gYWRkcmVzc1xuIiwKIAkJCSAgICAgICBkZXYtPmZ1bGxfbmFtZSk7CiAJCQljb250aW51ZTsKQEAgLTI1NSw4ICsyNjIsOCBAQAogCQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJIGJ1c2VzICVkLi4lZCIsCiAJCQkgICAgICAgYnVzX3JhbmdlWzBdLCBidXNfcmFuZ2VbMV0pOwogCQlwcmludGsoIiBjb250cm9sbGVkIGJ5ICVzIiwgZGV2LT50eXBlKTsKLQkJaWYgKGRldi0+bl9hZGRycyA+IDApCi0JCQlwcmludGsoIiBhdCAlbHgiLCBkZXYtPmFkZHJzWzBdLmFkZHJlc3MpOworCQlpZiAoIWlzX2xvbmd0cmFpbCkKKwkJCXByaW50aygiIGF0ICVseCIsIHIuc3RhcnQpOwogCQlwcmludGsoIlxuIik7CiAKIAkJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvc2V0dXAuYwppbmRleCBkZGE1ZjJjLi4yZGM4N2FhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvc2V0dXAuYwpAQCAtNDksNyArNDksNiBAQAogI2luY2x1ZGUgPGFzbS9oeWRyYS5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS90aW1lLmg+Ci0jaW5jbHVkZSA8YXNtL2J0ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL2k4MjU5Lmg+CiAjaW5jbHVkZSA8YXNtL21waWMuaD4KICNpbmNsdWRlIDxhc20vcnRhcy5oPgpAQCAtNTgsNyArNTcsNiBAQAogI2luY2x1ZGUgImNocnAuaCIKIAogdm9pZCBydGFzX2luZGljYXRvcl9wcm9ncmVzcyhjaGFyICosIHVuc2lnbmVkIHNob3J0KTsKLXZvaWQgYnRleHRfcHJvZ3Jlc3MoY2hhciAqLCB1bnNpZ25lZCBzaG9ydCk7CiAKIGludCBfY2hycF90eXBlOwogRVhQT1JUX1NZTUJPTChfY2hycF90eXBlKTsKQEAgLTI2NCwxMSArMjYyLDYgQEAKIAkJcHBjX21kLnNldF9ydGNfdGltZQk9IHJ0YXNfc2V0X3J0Y190aW1lOwogCX0KIAotI2lmZGVmIENPTkZJR19CT09UWF9URVhUCi0JaWYgKHBwY19tZC5wcm9ncmVzcyA9PSBOVUxMICYmIGJvb3RfdGV4dF9tYXBwZWQpCi0JCXBwY19tZC5wcm9ncmVzcyA9IGJ0ZXh0X3Byb2dyZXNzOwotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIAkvKiB0aGlzIGlzIGZpbmUgZm9yIGNocnAgKi8KIAlpbml0cmRfYmVsb3dfc3RhcnRfb2sgPSAxOwpAQCAtMzU5LDkgKzM1MiwxMCBAQAogCQlvcGFkZHIgPSBvcHByb3BbbmEtMV07CS8qIGFzc3VtZSAzMi1iaXQgKi8KIAkJb3BsZW4gLz0gbmEgKiBzaXplb2YodW5zaWduZWQgaW50KTsKIAl9IGVsc2UgewotCQlpZiAobnAtPm5fYWRkcnMgPT0gMCkKKwkJc3RydWN0IHJlc291cmNlIHI7CisJCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcikpCiAJCQlyZXR1cm47Ci0JCW9wYWRkciA9IG5wLT5hZGRyc1swXS5hZGRyZXNzOworCQlvcGFkZHIgPSByLnN0YXJ0OwogCQlvcGxlbiA9IDA7CiAJfQogCkBAIC0zODQsNyArMzc4LDcgQEAKIAkgKi8KIAlpZiAob3BsZW4gPCBsZW4pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJJbnN1ZmZpY2llbnQgYWRkcmVzc2VzIGZvciBkaXN0cmlidXRlZCIKLQkJICAgICAgICIgT3BlblBJQyAoJWQgPCAlZClcbiIsIG5wLT5uX2FkZHJzLCBsZW4pOworCQkgICAgICAgIiBPcGVuUElDICglZCA8ICVkKVxuIiwgb3BsZW4sIGxlbik7CiAJCWxlbiA9IG9wbGVuOwogCX0KIApAQCAtNTIyLDEyICs1MTYsMyBAQAogCXNtcF9vcHMgPSAmY2hycF9zbXBfb3BzOwogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIH0KLQotI2lmZGVmIENPTkZJR19CT09UWF9URVhUCi12b2lkCi1idGV4dF9wcm9ncmVzcyhjaGFyICpzLCB1bnNpZ25lZCBzaG9ydCBoZXgpCi17Ci0JYnRleHRfZHJhd3N0cmluZyhzKTsKLQlidGV4dF9kcmF3c3RyaW5nKCJcbiIpOwotfQotI2VuZGlmIC8qIENPTkZJR19CT09UWF9URVhUICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvdGltZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3RpbWUuYwppbmRleCA3MzdlZTVkLi4zNmEwZjk3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvdGltZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC90aW1lLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9udnJhbS5oPgpAQCAtMzcsMTQgKzM4LDE2IEBACiBsb25nIF9faW5pdCBjaHJwX3RpbWVfaW5pdCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcnRjczsKKwlzdHJ1Y3QgcmVzb3VyY2UgcjsKIAlpbnQgYmFzZTsKIAogCXJ0Y3MgPSBmaW5kX2NvbXBhdGlibGVfZGV2aWNlcygicnRjIiwgInBucFBOUCxiMDAiKTsKIAlpZiAocnRjcyA9PSBOVUxMKQogCQlydGNzID0gZmluZF9jb21wYXRpYmxlX2RldmljZXMoInJ0YyIsICJkczEzODUtcnRjIik7Ci0JaWYgKHJ0Y3MgPT0gTlVMTCB8fCBydGNzLT5hZGRycyA9PSBOVUxMKQorCWlmIChydGNzID09IE5VTEwgfHwgb2ZfYWRkcmVzc190b19yZXNvdXJjZShydGNzLCAwLCAmcikpCiAJCXJldHVybiAwOwotCWJhc2UgPSBydGNzLT5hZGRyc1swXS5hZGRyZXNzOworCQorCWJhc2UgPSByLnN0YXJ0OwogCW52cmFtX2FzMSA9IDA7CiAJbnZyYW1fYXMwID0gYmFzZTsKIAludnJhbV9kYXRhID0gYmFzZSArIDE7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L0tjb25maWcKaW5kZXggODEyNTAwOTAuLjRmZGJjOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L0tjb25maWcKQEAgLTE0NCwxNiArMTQ0LDYgQEAKIAkgIG11Y2ggYnV0IGl0J3Mgb25seSBiZWVuIHRlc3RlZCBvbiB0aGlzIGJvYXJkIHZlcnNpb24uIEkgdGhpbmsgdGhpcwogCSAgYm9hcmQgaXMgYWxzbyBrbm93biBhcyBJY2VDdWJlLgogCi1jb25maWcgTVBDODM0eF9TWVMKLQlib29sICJGcmVlc2NhbGUgTVBDODM0eCBTWVMiCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTVBDIDgzNHggU1lTIGV2YWx1YXRpb24gYm9hcmQuCi0KLQkgIEJlIGF3YXJlIHRoYXQgUENJIGJ1c2VzIGNhbiBvbmx5IGZ1bmN0aW9uIHdoZW4gU1lTIGJvYXJkIGlzIHBsdWdnZWQKLQkgIGludG8gdGhlIFBJQiAoUGxhdGZvcm0gSU8gQm9hcmQpIGJvYXJkIGZyb20gRnJlZXNjYWxlIHdoaWNoIHByb3ZpZGUKLQkgIDMgUENJIHNsb3RzLiAgVGhlIFBJQnMgUENJIGluaXRpYWxpemF0aW9uIGlzIHRoZSBib290bG9hZGVyJ3MKLQkgIHJlc3BvbnNpYmxpbHR5LgotCiBjb25maWcgRVY2NDM2MAogCWJvb2wgIk1hcnZlbGwtRVY2NDM2MEJQIgogCWhlbHAKQEAgLTE5MiwxNCArMTgyLDYgQEAKIAkgIFRoZSBNUEM4MjcyIENQTSBoYXMgYSBkaWZmZXJlbnQgaW50ZXJuYWwgZHByYW0gc2V0dXAgdGhhbiBvdGhlciBDUE0yCiAJICBkZXZpY2VzCiAKLWNvbmZpZyA4M3h4Ci0JYm9vbAotCWRlZmF1bHQgeSBpZiBNUEM4MzR4X1NZUwotCi1jb25maWcgTVBDODM0eAotCWJvb2wKLQlkZWZhdWx0IHkgaWYgTVBDODM0eF9TWVMKLQogY29uZmlnIENQTTIKIAlib29sCiAJZGVwZW5kcyBvbiA4MjYwIHx8IE1QQzg1NjAgfHwgTVBDODU1NQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL01ha2VmaWxlCmluZGV4IDEyN2I0NjUuLmNlOGMwYjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvTWFrZWZpbGUKQEAgLTEsOCArMSw4IEBACiBFWFRSQV9DRkxBR1MJKz0gLW1uby1taW5pbWFsLXRvYwogCiBvYmoteSArPSBodmxvZy5vIGh2bHBjb25maWcubyBscGFyZGF0YS5vIHNldHVwLm8gbWYubyBscGV2ZW50cy5vIFwKLQlodmNhbGwubyBwcm9jLm8gaHRhYi5vIGlvbW11Lm8gbWlzYy5vCi1vYmotJChDT05GSUdfUENJKSArPSBwY2kubyBpcnEubyB2cGRpbmZvLm8KKwlodmNhbGwubyBwcm9jLm8gaHRhYi5vIGlvbW11Lm8gbWlzYy5vIGlycS5vCitvYmotJChDT05GSUdfUENJKSArPSBwY2kubyB2cGRpbmZvLm8KIG9iai0kKENPTkZJR19JQk1WSU8pICs9IHZpby5vCiBvYmotJChDT05GSUdfU01QKSArPSBzbXAubwogb2JqLSQoQ09ORklHX1ZJT1BBVEgpICs9IHZpb3BhdGgubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaW9tbXUuYwppbmRleCAyYjU0ZWViLi5iZWEwYjcwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaW9tbXUuYwpAQCAtMzQsNiArMzQsOCBAQAogI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CiAjaW5jbHVkZSA8YXNtL2lzZXJpZXMvaHZfY2FsbF94bS5oPgogCisjaW5jbHVkZSAiaW9tbXUuaCIKKwogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgaVNlcmllc19HbG9iYWxfRGV2aWNlX0xpc3Q7CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lvbW11LmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaW9tbXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjU2NThmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lvbW11LmgKQEAgLTAsMCArMSwzNSBAQAorI2lmbmRlZiBfUExBVEZPUk1TX0lTRVJJRVNfSU9NTVVfSAorI2RlZmluZSBfUExBVEZPUk1TX0lTRVJJRVNfSU9NTVVfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1ICBTdGVwaGVuIFJvdGh3ZWxsLCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZToKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworc3RydWN0IGRldmljZV9ub2RlOworc3RydWN0IGlvbW11X3RhYmxlOworCisvKiBDcmVhdGVzIHRhYmxlIGZvciBhbiBpbmRpdmlkdWFsIGRldmljZSBub2RlICovCitleHRlcm4gdm9pZCBpb21tdV9kZXZub2RlX2luaXRfaVNlcmllcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKTsKKworLyogR2V0IHRhYmxlIHBhcmFtZXRlcnMgZnJvbSBIViAqLworZXh0ZXJuIHZvaWQgaW9tbXVfdGFibGVfZ2V0cGFybXNfaVNlcmllcyh1bnNpZ25lZCBsb25nIGJ1c25vLAorCQl1bnNpZ25lZCBjaGFyIHNsb3RubywgdW5zaWduZWQgY2hhciB2aXJ0YnVzLAorCQlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCk7CisKKyNlbmRpZiAvKiBfUExBVEZPUk1TX0lTRVJJRVNfSU9NTVVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lycS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lycS5jCmluZGV4IGE1OGRhYTEuLmJlM2ZiZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pcnEuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaXJxLmMKQEAgLTM1LDE2MSArMzUsMTMxIEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAorI2luY2x1ZGUgPGFzbS9wYWNhLmg+CiAjaW5jbHVkZSA8YXNtL2lzZXJpZXMvaHZfdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vaXNlcmllcy9odl9scF9ldmVudC5oPgogI2luY2x1ZGUgPGFzbS9pc2VyaWVzL2h2X2NhbGxfeG0uaD4KKyNpbmNsdWRlIDxhc20vaXNlcmllcy9pdF9scF9xdWV1ZS5oPgogCiAjaW5jbHVkZSAiaXJxLmgiCiAjaW5jbHVkZSAiY2FsbF9wY2kuaCIKIAotc3RhdGljIGxvbmcgUGNpX0ludGVycnVwdF9Db3VudDsKLXN0YXRpYyBsb25nIFBjaV9FdmVudF9Db3VudDsKKyNpZiBkZWZpbmVkKENPTkZJR19TTVApCitleHRlcm4gdm9pZCBpU2VyaWVzX3NtcF9tZXNzYWdlX3JlY3Yoc3RydWN0IHB0X3JlZ3MgKik7CisjZW5kaWYKIAotZW51bSBYbVBjaUxwRXZlbnRfU3VidHlwZSB7Ci0JWG1QY2lMcEV2ZW50X0J1c0NyZWF0ZWQJCT0gMCwJLy8gUEhCIGhhcyBiZWVuIGNyZWF0ZWQKLQlYbVBjaUxwRXZlbnRfQnVzRXJyb3IJCT0gMSwJLy8gUEhCIGhhcyBmYWlsZWQKLQlYbVBjaUxwRXZlbnRfQnVzRmFpbGVkCQk9IDIsCS8vIE1zZyB0byBTZWNvbmRhcnksIFByaW1hcnkgZmFpbGVkIGJ1cwotCVhtUGNpTHBFdmVudF9Ob2RlRmFpbGVkCQk9IDQsCS8vIE11bHRpLWFkYXB0ZXIgYnJpZGdlIGhhcyBmYWlsZWQKLQlYbVBjaUxwRXZlbnRfTm9kZVJlY292ZXJlZAk9IDUsCS8vIE11bHRpLWFkYXB0ZXIgYnJpZGdlIGhhcyByZWNvdmVyZWQKLQlYbVBjaUxwRXZlbnRfQnVzUmVjb3ZlcmVkCT0gMTIsCS8vIFBIQiBoYXMgYmVlbiByZWNvdmVyZWQKLQlYbVBjaUxwRXZlbnRfVW5RdWllc2NlQnVzCT0gMTgsCS8vIFNlY29uZGFyeSBidXMgdW5xaWVzY2luZwotCVhtUGNpTHBFdmVudF9CcmlkZ2VFcnJvcgk9IDIxLAkvLyBCcmlkZ2UgRXJyb3IKLQlYbVBjaUxwRXZlbnRfU2xvdEludGVycnVwdAk9IDIyCS8vIFNsb3QgaW50ZXJydXB0CisjaWZkZWYgQ09ORklHX1BDSQorCitlbnVtIHBjaV9ldmVudF90eXBlIHsKKwlwZV9idXNfY3JlYXRlZAkJPSAwLAkvKiBQSEIgaGFzIGJlZW4gY3JlYXRlZCAqLworCXBlX2J1c19lcnJvcgkJPSAxLAkvKiBQSEIgaGFzIGZhaWxlZCAqLworCXBlX2J1c19mYWlsZWQJCT0gMiwJLyogTXNnIHRvIFNlY29uZGFyeSwgUHJpbWFyeSBmYWlsZWQgYnVzICovCisJcGVfbm9kZV9mYWlsZWQJCT0gNCwJLyogTXVsdGktYWRhcHRlciBicmlkZ2UgaGFzIGZhaWxlZCAqLworCXBlX25vZGVfcmVjb3ZlcmVkCT0gNSwJLyogTXVsdGktYWRhcHRlciBicmlkZ2UgaGFzIHJlY292ZXJlZCAqLworCXBlX2J1c19yZWNvdmVyZWQJPSAxMiwJLyogUEhCIGhhcyBiZWVuIHJlY292ZXJlZCAqLworCXBlX3VucXVpZXNlX2J1cwkJPSAxOCwJLyogU2Vjb25kYXJ5IGJ1cyB1bnFpZXNjaW5nICovCisJcGVfYnJpZGdlX2Vycm9yCQk9IDIxLAkvKiBCcmlkZ2UgRXJyb3IgKi8KKwlwZV9zbG90X2ludGVycnVwdAk9IDIyCS8qIFNsb3QgaW50ZXJydXB0ICovCiB9OwogCi1zdHJ1Y3QgWG1QY2lMcEV2ZW50X0J1c0ludGVycnVwdCB7Ci0JSHZCdXNOdW1iZXIJYnVzTnVtYmVyOwotCUh2U3ViQnVzTnVtYmVyCXN1YkJ1c051bWJlcjsKLX07Ci0KLXN0cnVjdCBYbVBjaUxwRXZlbnRfTm9kZUludGVycnVwdCB7Ci0JSHZCdXNOdW1iZXIJYnVzTnVtYmVyOwotCUh2U3ViQnVzTnVtYmVyCXN1YkJ1c051bWJlcjsKLQlIdkFnZW50SWQJZGV2aWNlSWQ7Ci19OwotCi1zdHJ1Y3QgWG1QY2lMcEV2ZW50IHsKLQlzdHJ1Y3QgSHZMcEV2ZW50IGh2THBFdmVudDsKLQorc3RydWN0IHBjaV9ldmVudCB7CisJc3RydWN0IEh2THBFdmVudCBldmVudDsKIAl1bmlvbiB7Ci0JCXU2NCBhbGlnbkRhdGE7CQkJLy8gQWxpZ24gb24gYW4gOC1ieXRlIGJvdW5kYXJ5Ci0KKwkJdTY0IF9fYWxpZ247CQkvKiBBbGlnbiBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgKi8KIAkJc3RydWN0IHsKIAkJCXUzMgkJZmlzcjsKLQkJCUh2QnVzTnVtYmVyCWJ1c051bWJlcjsKLQkJCUh2U3ViQnVzTnVtYmVyCXN1YkJ1c051bWJlcjsKLQkJCUh2QWdlbnRJZAlkZXZpY2VJZDsKLQkJfSBzbG90SW50ZXJydXB0OwotCi0JCXN0cnVjdCBYbVBjaUxwRXZlbnRfQnVzSW50ZXJydXB0IGJ1c0ZhaWxlZDsKLQkJc3RydWN0IFhtUGNpTHBFdmVudF9CdXNJbnRlcnJ1cHQgYnVzUmVjb3ZlcmVkOwotCQlzdHJ1Y3QgWG1QY2lMcEV2ZW50X0J1c0ludGVycnVwdCBidXNDcmVhdGVkOwotCi0JCXN0cnVjdCBYbVBjaUxwRXZlbnRfTm9kZUludGVycnVwdCBub2RlRmFpbGVkOwotCQlzdHJ1Y3QgWG1QY2lMcEV2ZW50X05vZGVJbnRlcnJ1cHQgbm9kZVJlY292ZXJlZDsKLQotCX0gZXZlbnREYXRhOwotCisJCQlIdkJ1c051bWJlcglidXNfbnVtYmVyOworCQkJSHZTdWJCdXNOdW1iZXIJc3ViX2J1c19udW1iZXI7CisJCQlIdkFnZW50SWQJZGV2X2lkOworCQl9IHNsb3Q7CisJCXN0cnVjdCB7CisJCQlIdkJ1c051bWJlcglidXNfbnVtYmVyOworCQkJSHZTdWJCdXNOdW1iZXIJc3ViX2J1c19udW1iZXI7CisJCX0gYnVzOworCQlzdHJ1Y3QgeworCQkJSHZCdXNOdW1iZXIJYnVzX251bWJlcjsKKwkJCUh2U3ViQnVzTnVtYmVyCXN1Yl9idXNfbnVtYmVyOworCQkJSHZBZ2VudElkCWRldl9pZDsKKwkJfSBub2RlOworCX0gZGF0YTsKIH07CiAKLXN0YXRpYyB2b2lkIGludFJlY2VpdmVkKHN0cnVjdCBYbVBjaUxwRXZlbnQgKmV2ZW50UGFybSwKLQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3NQYXJtKQorc3RhdGljIERFRklORV9TUElOTE9DSyhwZW5kaW5nX2lycXNfbG9jayk7CitzdGF0aWMgaW50IG51bV9wZW5kaW5nX2lycXM7CitzdGF0aWMgaW50IHBlbmRpbmdfaXJxc1tOUl9JUlFTXTsKKworc3RhdGljIHZvaWQgaW50X3JlY2VpdmVkKHN0cnVjdCBwY2lfZXZlbnQgKmV2ZW50LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgaXJxOwotI2lmZGVmIENPTkZJR19JUlFTVEFDS1MKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKmN1cnRwLCAqaXJxdHA7Ci0jZW5kaWYKIAotCSsrUGNpX0ludGVycnVwdF9Db3VudDsKLQotCXN3aXRjaCAoZXZlbnRQYXJtLT5odkxwRXZlbnQueFN1YnR5cGUpIHsKLQljYXNlIFhtUGNpTHBFdmVudF9TbG90SW50ZXJydXB0OgotCQlpcnEgPSBldmVudFBhcm0tPmh2THBFdmVudC54Q29ycmVsYXRpb25Ub2tlbjsKLQkJLyogRGlzcGF0Y2ggdGhlIGludGVycnVwdCBoYW5kbGVycyBmb3IgdGhpcyBpcnEgKi8KLSNpZmRlZiBDT05GSUdfSVJRU1RBQ0tTCi0JCS8qIFN3aXRjaCB0byB0aGUgaXJxIHN0YWNrIHRvIGhhbmRsZSB0aGlzICovCi0JCWN1cnRwID0gY3VycmVudF90aHJlYWRfaW5mbygpOwotCQlpcnF0cCA9IGhhcmRpcnFfY3R4W3NtcF9wcm9jZXNzb3JfaWQoKV07Ci0JCWlmIChjdXJ0cCAhPSBpcnF0cCkgewotCQkJaXJxdHAtPnRhc2sgPSBjdXJ0cC0+dGFzazsKLQkJCWlycXRwLT5mbGFncyA9IDA7Ci0JCQljYWxsX19fZG9fSVJRKGlycSwgcmVnc1Bhcm0sIGlycXRwKTsKLQkJCWlycXRwLT50YXNrID0gTlVMTDsKLQkJCWlmIChpcnF0cC0+ZmxhZ3MpCi0JCQkJc2V0X2JpdHMoaXJxdHAtPmZsYWdzLCAmY3VydHAtPmZsYWdzKTsKLQkJfSBlbHNlCi0jZW5kaWYKLQkJCV9fZG9fSVJRKGlycSwgcmVnc1Bhcm0pOwotCQlIdkNhbGxQY2lfZW9pKGV2ZW50UGFybS0+ZXZlbnREYXRhLnNsb3RJbnRlcnJ1cHQuYnVzTnVtYmVyLAotCQkJZXZlbnRQYXJtLT5ldmVudERhdGEuc2xvdEludGVycnVwdC5zdWJCdXNOdW1iZXIsCi0JCQlldmVudFBhcm0tPmV2ZW50RGF0YS5zbG90SW50ZXJydXB0LmRldmljZUlkKTsKKwlzd2l0Y2ggKGV2ZW50LT5ldmVudC54U3VidHlwZSkgeworCWNhc2UgcGVfc2xvdF9pbnRlcnJ1cHQ6CisJCWlycSA9IGV2ZW50LT5ldmVudC54Q29ycmVsYXRpb25Ub2tlbjsKKwkJaWYgKGlycSA8IE5SX0lSUVMpIHsKKwkJCXNwaW5fbG9jaygmcGVuZGluZ19pcnFzX2xvY2spOworCQkJcGVuZGluZ19pcnFzW2lycV0rKzsKKwkJCW51bV9wZW5kaW5nX2lycXMrKzsKKwkJCXNwaW5fdW5sb2NrKCZwZW5kaW5nX2lycXNfbG9jayk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpbnRfcmVjZWl2ZWQ6IGJhZCBpcnEgbnVtYmVyICVkXG4iLAorCQkJCQlpcnEpOworCQkJSHZDYWxsUGNpX2VvaShldmVudC0+ZGF0YS5zbG90LmJ1c19udW1iZXIsCisJCQkJCWV2ZW50LT5kYXRhLnNsb3Quc3ViX2J1c19udW1iZXIsCisJCQkJCWV2ZW50LT5kYXRhLnNsb3QuZGV2X2lkKTsKKwkJfQogCQlicmVhazsKIAkJLyogSWdub3JlIGVycm9yIHJlY292ZXJ5IGV2ZW50cyBmb3Igbm93ICovCi0JY2FzZSBYbVBjaUxwRXZlbnRfQnVzQ3JlYXRlZDoKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaW50UmVjZWl2ZWQ6IHN5c3RlbSBidXMgJWQgY3JlYXRlZFxuIiwKLQkJCWV2ZW50UGFybS0+ZXZlbnREYXRhLmJ1c0NyZWF0ZWQuYnVzTnVtYmVyKTsKKwljYXNlIHBlX2J1c19jcmVhdGVkOgorCQlwcmludGsoS0VSTl9JTkZPICJpbnRfcmVjZWl2ZWQ6IHN5c3RlbSBidXMgJWQgY3JlYXRlZFxuIiwKKwkJCWV2ZW50LT5kYXRhLmJ1cy5idXNfbnVtYmVyKTsKIAkJYnJlYWs7Ci0JY2FzZSBYbVBjaUxwRXZlbnRfQnVzRXJyb3I6Ci0JY2FzZSBYbVBjaUxwRXZlbnRfQnVzRmFpbGVkOgotCQlwcmludGsoS0VSTl9JTkZPICJpbnRSZWNlaXZlZDogc3lzdGVtIGJ1cyAlZCBmYWlsZWRcbiIsCi0JCQlldmVudFBhcm0tPmV2ZW50RGF0YS5idXNGYWlsZWQuYnVzTnVtYmVyKTsKKwljYXNlIHBlX2J1c19lcnJvcjoKKwljYXNlIHBlX2J1c19mYWlsZWQ6CisJCXByaW50ayhLRVJOX0lORk8gImludF9yZWNlaXZlZDogc3lzdGVtIGJ1cyAlZCBmYWlsZWRcbiIsCisJCQlldmVudC0+ZGF0YS5idXMuYnVzX251bWJlcik7CiAJCWJyZWFrOwotCWNhc2UgWG1QY2lMcEV2ZW50X0J1c1JlY292ZXJlZDoKLQljYXNlIFhtUGNpTHBFdmVudF9VblF1aWVzY2VCdXM6Ci0JCXByaW50ayhLRVJOX0lORk8gImludFJlY2VpdmVkOiBzeXN0ZW0gYnVzICVkIHJlY292ZXJlZFxuIiwKLQkJCWV2ZW50UGFybS0+ZXZlbnREYXRhLmJ1c1JlY292ZXJlZC5idXNOdW1iZXIpOworCWNhc2UgcGVfYnVzX3JlY292ZXJlZDoKKwljYXNlIHBlX3VucXVpZXNlX2J1czoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaW50X3JlY2VpdmVkOiBzeXN0ZW0gYnVzICVkIHJlY292ZXJlZFxuIiwKKwkJCWV2ZW50LT5kYXRhLmJ1cy5idXNfbnVtYmVyKTsKIAkJYnJlYWs7Ci0JY2FzZSBYbVBjaUxwRXZlbnRfTm9kZUZhaWxlZDoKLQljYXNlIFhtUGNpTHBFdmVudF9CcmlkZ2VFcnJvcjoKKwljYXNlIHBlX25vZGVfZmFpbGVkOgorCWNhc2UgcGVfYnJpZGdlX2Vycm9yOgogCQlwcmludGsoS0VSTl9JTkZPCi0JCQkiaW50UmVjZWl2ZWQ6IG11bHRpLWFkYXB0ZXIgYnJpZGdlICVkLyVkLyVkIGZhaWxlZFxuIiwKLQkJCWV2ZW50UGFybS0+ZXZlbnREYXRhLm5vZGVGYWlsZWQuYnVzTnVtYmVyLAotCQkJZXZlbnRQYXJtLT5ldmVudERhdGEubm9kZUZhaWxlZC5zdWJCdXNOdW1iZXIsCi0JCQlldmVudFBhcm0tPmV2ZW50RGF0YS5ub2RlRmFpbGVkLmRldmljZUlkKTsKKwkJCSJpbnRfcmVjZWl2ZWQ6IG11bHRpLWFkYXB0ZXIgYnJpZGdlICVkLyVkLyVkIGZhaWxlZFxuIiwKKwkJCWV2ZW50LT5kYXRhLm5vZGUuYnVzX251bWJlciwKKwkJCWV2ZW50LT5kYXRhLm5vZGUuc3ViX2J1c19udW1iZXIsCisJCQlldmVudC0+ZGF0YS5ub2RlLmRldl9pZCk7CiAJCWJyZWFrOwotCWNhc2UgWG1QY2lMcEV2ZW50X05vZGVSZWNvdmVyZWQ6CisJY2FzZSBwZV9ub2RlX3JlY292ZXJlZDoKIAkJcHJpbnRrKEtFUk5fSU5GTwotCQkJImludFJlY2VpdmVkOiBtdWx0aS1hZGFwdGVyIGJyaWRnZSAlZC8lZC8lZCByZWNvdmVyZWRcbiIsCi0JCQlldmVudFBhcm0tPmV2ZW50RGF0YS5ub2RlUmVjb3ZlcmVkLmJ1c051bWJlciwKLQkJCWV2ZW50UGFybS0+ZXZlbnREYXRhLm5vZGVSZWNvdmVyZWQuc3ViQnVzTnVtYmVyLAotCQkJZXZlbnRQYXJtLT5ldmVudERhdGEubm9kZVJlY292ZXJlZC5kZXZpY2VJZCk7CisJCQkiaW50X3JlY2VpdmVkOiBtdWx0aS1hZGFwdGVyIGJyaWRnZSAlZC8lZC8lZCByZWNvdmVyZWRcbiIsCisJCQlldmVudC0+ZGF0YS5ub2RlLmJ1c19udW1iZXIsCisJCQlldmVudC0+ZGF0YS5ub2RlLnN1Yl9idXNfbnVtYmVyLAorCQkJZXZlbnQtPmRhdGEubm9kZS5kZXZfaWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9FUlIKLQkJCSJpbnRSZWNlaXZlZDogdW5yZWNvZ25pemVkIGV2ZW50IHN1YnR5cGUgMHgleFxuIiwKLQkJCWV2ZW50UGFybS0+aHZMcEV2ZW50LnhTdWJ0eXBlKTsKKwkJCSJpbnRfcmVjZWl2ZWQ6IHVucmVjb2duaXplZCBldmVudCBzdWJ0eXBlIDB4JXhcbiIsCisJCQlldmVudC0+ZXZlbnQueFN1YnR5cGUpOwogCQlicmVhazsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIFhtUGNpTHBFdmVudF9oYW5kbGVyKHN0cnVjdCBIdkxwRXZlbnQgKmV2ZW50UGFybSwKLQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3NQYXJtKQorc3RhdGljIHZvaWQgcGNpX2V2ZW50X2hhbmRsZXIoc3RydWN0IEh2THBFdmVudCAqZXZlbnQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmZGVmIENPTkZJR19QQ0kKLQkrK1BjaV9FdmVudF9Db3VudDsKLQotCWlmIChldmVudFBhcm0gJiYgKGV2ZW50UGFybS0+eFR5cGUgPT0gSHZMcEV2ZW50X1R5cGVfUGNpSW8pKSB7Ci0JCXN3aXRjaCAoZXZlbnRQYXJtLT54RmxhZ3MueEZ1bmN0aW9uKSB7Ci0JCWNhc2UgSHZMcEV2ZW50X0Z1bmN0aW9uX0ludDoKLQkJCWludFJlY2VpdmVkKChzdHJ1Y3QgWG1QY2lMcEV2ZW50ICopZXZlbnRQYXJtLCByZWdzUGFybSk7Ci0JCQlicmVhazsKLQkJY2FzZSBIdkxwRXZlbnRfRnVuY3Rpb25fQWNrOgorCWlmIChldmVudCAmJiAoZXZlbnQtPnhUeXBlID09IEh2THBFdmVudF9UeXBlX1BjaUlvKSkgeworCQlpZiAoaHZscGV2ZW50X2lzX2ludChldmVudCkpCisJCQlpbnRfcmVjZWl2ZWQoKHN0cnVjdCBwY2lfZXZlbnQgKilldmVudCwgcmVncyk7CisJCWVsc2UKIAkJCXByaW50ayhLRVJOX0VSUgotCQkJCSJYbVBjaUxwRXZlbnRfaGFuZGxlcjogdW5leHBlY3RlZCBhY2sgcmVjZWl2ZWRcbiIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCQkiWG1QY2lMcEV2ZW50X2hhbmRsZXI6IHVuZXhwZWN0ZWQgZXZlbnQgZnVuY3Rpb24gJWRcbiIsCi0JCQkJKGludClldmVudFBhcm0tPnhGbGFncy54RnVuY3Rpb24pOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgaWYgKGV2ZW50UGFybSkKKwkJCQkicGNpX2V2ZW50X2hhbmRsZXI6IHVuZXhwZWN0ZWQgYWNrIHJlY2VpdmVkXG4iKTsKKwl9IGVsc2UgaWYgKGV2ZW50KQogCQlwcmludGsoS0VSTl9FUlIKLQkJCSJYbVBjaUxwRXZlbnRfaGFuZGxlcjogVW5yZWNvZ25pemVkIFBDSSBldmVudCB0eXBlIDB4JXhcbiIsCi0JCQkoaW50KWV2ZW50UGFybS0+eFR5cGUpOworCQkJInBjaV9ldmVudF9oYW5kbGVyOiBVbnJlY29nbml6ZWQgUENJIGV2ZW50IHR5cGUgMHgleFxuIiwKKwkJCShpbnQpZXZlbnQtPnhUeXBlKTsKIAllbHNlCi0JCXByaW50ayhLRVJOX0VSUiAiWG1QY2lMcEV2ZW50X2hhbmRsZXI6IE5VTEwgZXZlbnQgcmVjZWl2ZWRcbiIpOwotI2VuZGlmCisJCXByaW50ayhLRVJOX0VSUiAicGNpX2V2ZW50X2hhbmRsZXI6IE5VTEwgZXZlbnQgcmVjZWl2ZWRcbiIpOwogfQogCiAvKgpAQCAtMTk5LDIwICsxNjksMjEgQEAKIHZvaWQgX19pbml0IGlTZXJpZXNfaW5pdF9JUlEodm9pZCkKIHsKIAkvKiBSZWdpc3RlciBQQ0kgZXZlbnQgaGFuZGxlciBhbmQgb3BlbiBhbiBldmVudCBwYXRoICovCi0JaW50IHhSYzsKKwlpbnQgcmV0OwogCi0JeFJjID0gSHZMcEV2ZW50X3JlZ2lzdGVySGFuZGxlcihIdkxwRXZlbnRfVHlwZV9QY2lJbywKLQkJCSZYbVBjaUxwRXZlbnRfaGFuZGxlcik7Ci0JaWYgKHhSYyA9PSAwKSB7Ci0JCXhSYyA9IEh2THBFdmVudF9vcGVuUGF0aChIdkxwRXZlbnRfVHlwZV9QY2lJbywgMCk7Ci0JCWlmICh4UmMgIT0gMCkKLQkJCXByaW50ayhLRVJOX0VSUiAiaVNlcmllc19pbml0X0lSUTogb3BlbiBldmVudCBwYXRoICIKLQkJCQkJImZhaWxlZCB3aXRoIHJjIDB4JXhcbiIsIHhSYyk7CisJcmV0ID0gSHZMcEV2ZW50X3JlZ2lzdGVySGFuZGxlcihIdkxwRXZlbnRfVHlwZV9QY2lJbywKKwkJCSZwY2lfZXZlbnRfaGFuZGxlcik7CisJaWYgKHJldCA9PSAwKSB7CisJCXJldCA9IEh2THBFdmVudF9vcGVuUGF0aChIdkxwRXZlbnRfVHlwZV9QY2lJbywgMCk7CisJCWlmIChyZXQgIT0gMCkKKwkJCXByaW50ayhLRVJOX0VSUiAiaXNlcmllc19pbml0X0lSUTogb3BlbiBldmVudCBwYXRoICIKKwkJCQkJImZhaWxlZCB3aXRoIHJjIDB4JXhcbiIsIHJldCk7CiAJfSBlbHNlCi0JCXByaW50ayhLRVJOX0VSUiAiaVNlcmllc19pbml0X0lSUTogcmVnaXN0ZXIgaGFuZGxlciAiCi0JCQkJImZhaWxlZCB3aXRoIHJjIDB4JXhcbiIsIHhSYyk7CisJCXByaW50ayhLRVJOX0VSUiAiaXNlcmllc19pbml0X0lSUTogcmVnaXN0ZXIgaGFuZGxlciAiCisJCQkJImZhaWxlZCB3aXRoIHJjIDB4JXhcbiIsIHJldCk7CiB9CiAKKyNkZWZpbmUgUkVBTF9JUlFfVE9fU1VCQlVTKGlycSkJKCgoaXJxKSA+PiAxNCkgJiAweGZmKQogI2RlZmluZSBSRUFMX0lSUV9UT19CVVMoaXJxKQkoKCgoaXJxKSA+PiA2KSAmIDB4ZmYpICsgMSkKICNkZWZpbmUgUkVBTF9JUlFfVE9fSURTRUwoaXJxKQkoKCgoaXJxKSA+PiAzKSAmIDcpICsgMSkKICNkZWZpbmUgUkVBTF9JUlFfVE9fRlVOQyhpcnEpCSgoaXJxKSAmIDcpCkBAIC0yMjEsNDAgKzE5Miw0MCBAQAogICogVGhpcyB3aWxsIGJlIGNhbGxlZCBieSBkZXZpY2UgZHJpdmVycyAodmlhIGVuYWJsZV9JUlEpCiAgKiB0byBlbmFibGUgSU5UQSBpbiB0aGUgYnJpZGdlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIuCiAgKi8KLXN0YXRpYyB2b2lkIGlTZXJpZXNfZW5hYmxlX0lSUSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgaXNlcmllc19lbmFibGVfSVJRKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdTMyIGJ1cywgZGV2aWNlSWQsIGZ1bmN0aW9uLCBtYXNrOwotCWNvbnN0IHUzMiBzdWJCdXMgPSAwOworCXUzMiBidXMsIGRldl9pZCwgZnVuY3Rpb24sIG1hc2s7CisJY29uc3QgdTMyIHN1Yl9idXMgPSAwOwogCXVuc2lnbmVkIGludCByaXJxID0gdmlydF9pcnFfdG9fcmVhbF9tYXBbaXJxXTsKIAogCS8qIFRoZSBJUlEgaGFzIGFscmVhZHkgYmVlbiBsb2NrZWQgYnkgdGhlIGNhbGxlciAqLwogCWJ1cyA9IFJFQUxfSVJRX1RPX0JVUyhyaXJxKTsKIAlmdW5jdGlvbiA9IFJFQUxfSVJRX1RPX0ZVTkMocmlycSk7Ci0JZGV2aWNlSWQgPSAoUkVBTF9JUlFfVE9fSURTRUwocmlycSkgPDwgNCkgKyBmdW5jdGlvbjsKKwlkZXZfaWQgPSAoUkVBTF9JUlFfVE9fSURTRUwocmlycSkgPDwgNCkgKyBmdW5jdGlvbjsKIAogCS8qIFVubWFzayBzZWNvbmRhcnkgSU5UQSAqLwogCW1hc2sgPSAweDgwMDAwMDAwOwotCUh2Q2FsbFBjaV91bm1hc2tJbnRlcnJ1cHRzKGJ1cywgc3ViQnVzLCBkZXZpY2VJZCwgbWFzayk7CisJSHZDYWxsUGNpX3VubWFza0ludGVycnVwdHMoYnVzLCBzdWJfYnVzLCBkZXZfaWQsIG1hc2spOwogfQogCi0vKiBUaGlzIGlzIGNhbGxlZCBieSBpU2VyaWVzX2FjdGl2YXRlX0lSUXMgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaVNlcmllc19zdGFydHVwX0lSUSh1bnNpZ25lZCBpbnQgaXJxKQorLyogVGhpcyBpcyBjYWxsZWQgYnkgaXNlcmllc19hY3RpdmF0ZV9JUlFzICovCitzdGF0aWMgdW5zaWduZWQgaW50IGlzZXJpZXNfc3RhcnR1cF9JUlEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1MzIgYnVzLCBkZXZpY2VJZCwgZnVuY3Rpb24sIG1hc2s7Ci0JY29uc3QgdTMyIHN1YkJ1cyA9IDA7CisJdTMyIGJ1cywgZGV2X2lkLCBmdW5jdGlvbiwgbWFzazsKKwljb25zdCB1MzIgc3ViX2J1cyA9IDA7CiAJdW5zaWduZWQgaW50IHJpcnEgPSB2aXJ0X2lycV90b19yZWFsX21hcFtpcnFdOwogCiAJYnVzID0gUkVBTF9JUlFfVE9fQlVTKHJpcnEpOwogCWZ1bmN0aW9uID0gUkVBTF9JUlFfVE9fRlVOQyhyaXJxKTsKLQlkZXZpY2VJZCA9IChSRUFMX0lSUV9UT19JRFNFTChyaXJxKSA8PCA0KSArIGZ1bmN0aW9uOworCWRldl9pZCA9IChSRUFMX0lSUV9UT19JRFNFTChyaXJxKSA8PCA0KSArIGZ1bmN0aW9uOwogCiAJLyogTGluayB0aGUgSVJRIG51bWJlciB0byB0aGUgYnJpZGdlICovCi0JSHZDYWxsWG1fY29ubmVjdEJ1c1VuaXQoYnVzLCBzdWJCdXMsIGRldmljZUlkLCBpcnEpOworCUh2Q2FsbFhtX2Nvbm5lY3RCdXNVbml0KGJ1cywgc3ViX2J1cywgZGV2X2lkLCBpcnEpOwogCiAJLyogVW5tYXNrIGJyaWRnZSBpbnRlcnJ1cHRzIGluIHRoZSBGSVNSICovCiAJbWFzayA9IDB4MDEwMTAwMDAgPDwgZnVuY3Rpb247Ci0JSHZDYWxsUGNpX3VubWFza0Zpc3IoYnVzLCBzdWJCdXMsIGRldmljZUlkLCBtYXNrKTsKLQlpU2VyaWVzX2VuYWJsZV9JUlEoaXJxKTsKKwlIdkNhbGxQY2lfdW5tYXNrRmlzcihidXMsIHN1Yl9idXMsIGRldl9pZCwgbWFzayk7CisJaXNlcmllc19lbmFibGVfSVJRKGlycSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI3OSw3OCArMjUwLDExNyBAQAogfQogCiAvKiAgdGhpcyBpcyBub3QgY2FsbGVkIGFueXdoZXJlIGN1cnJlbnRseSAqLwotc3RhdGljIHZvaWQgaVNlcmllc19zaHV0ZG93bl9JUlEodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIGlzZXJpZXNfc2h1dGRvd25fSVJRKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdTMyIGJ1cywgZGV2aWNlSWQsIGZ1bmN0aW9uLCBtYXNrOwotCWNvbnN0IHUzMiBzdWJCdXMgPSAwOworCXUzMiBidXMsIGRldl9pZCwgZnVuY3Rpb24sIG1hc2s7CisJY29uc3QgdTMyIHN1Yl9idXMgPSAwOwogCXVuc2lnbmVkIGludCByaXJxID0gdmlydF9pcnFfdG9fcmVhbF9tYXBbaXJxXTsKIAogCS8qIGlycSBzaG91bGQgYmUgbG9ja2VkIGJ5IHRoZSBjYWxsZXIgKi8KIAlidXMgPSBSRUFMX0lSUV9UT19CVVMocmlycSk7CiAJZnVuY3Rpb24gPSBSRUFMX0lSUV9UT19GVU5DKHJpcnEpOwotCWRldmljZUlkID0gKFJFQUxfSVJRX1RPX0lEU0VMKHJpcnEpIDw8IDQpICsgZnVuY3Rpb247CisJZGV2X2lkID0gKFJFQUxfSVJRX1RPX0lEU0VMKHJpcnEpIDw8IDQpICsgZnVuY3Rpb247CiAKIAkvKiBJbnZhbGlkYXRlIHRoZSBJUlEgbnVtYmVyIGluIHRoZSBicmlkZ2UgKi8KLQlIdkNhbGxYbV9jb25uZWN0QnVzVW5pdChidXMsIHN1YkJ1cywgZGV2aWNlSWQsIDApOworCUh2Q2FsbFhtX2Nvbm5lY3RCdXNVbml0KGJ1cywgc3ViX2J1cywgZGV2X2lkLCAwKTsKIAogCS8qIE1hc2sgYnJpZGdlIGludGVycnVwdHMgaW4gdGhlIEZJU1IgKi8KIAltYXNrID0gMHgwMTAxMDAwMCA8PCBmdW5jdGlvbjsKLQlIdkNhbGxQY2lfbWFza0Zpc3IoYnVzLCBzdWJCdXMsIGRldmljZUlkLCBtYXNrKTsKKwlIdkNhbGxQY2lfbWFza0Zpc3IoYnVzLCBzdWJfYnVzLCBkZXZfaWQsIG1hc2spOwogfQogCiAvKgogICogVGhpcyB3aWxsIGJlIGNhbGxlZCBieSBkZXZpY2UgZHJpdmVycyAodmlhIGRpc2FibGVfSVJRKQogICogdG8gZGlzYWJsZSBJTlRBIGluIHRoZSBicmlkZ2UgaW50ZXJydXB0IHN0YXR1cyByZWdpc3Rlci4KICAqLwotc3RhdGljIHZvaWQgaVNlcmllc19kaXNhYmxlX0lSUSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgaXNlcmllc19kaXNhYmxlX0lSUSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXUzMiBidXMsIGRldmljZUlkLCBmdW5jdGlvbiwgbWFzazsKLQljb25zdCB1MzIgc3ViQnVzID0gMDsKKwl1MzIgYnVzLCBkZXZfaWQsIGZ1bmN0aW9uLCBtYXNrOworCWNvbnN0IHUzMiBzdWJfYnVzID0gMDsKIAl1bnNpZ25lZCBpbnQgcmlycSA9IHZpcnRfaXJxX3RvX3JlYWxfbWFwW2lycV07CiAKIAkvKiBUaGUgSVJRIGhhcyBhbHJlYWR5IGJlZW4gbG9ja2VkIGJ5IHRoZSBjYWxsZXIgKi8KIAlidXMgPSBSRUFMX0lSUV9UT19CVVMocmlycSk7CiAJZnVuY3Rpb24gPSBSRUFMX0lSUV9UT19GVU5DKHJpcnEpOwotCWRldmljZUlkID0gKFJFQUxfSVJRX1RPX0lEU0VMKHJpcnEpIDw8IDQpICsgZnVuY3Rpb247CisJZGV2X2lkID0gKFJFQUxfSVJRX1RPX0lEU0VMKHJpcnEpIDw8IDQpICsgZnVuY3Rpb247CiAKIAkvKiBNYXNrIHNlY29uZGFyeSBJTlRBICAgKi8KIAltYXNrID0gMHg4MDAwMDAwMDsKLQlIdkNhbGxQY2lfbWFza0ludGVycnVwdHMoYnVzLCBzdWJCdXMsIGRldmljZUlkLCBtYXNrKTsKKwlIdkNhbGxQY2lfbWFza0ludGVycnVwdHMoYnVzLCBzdWJfYnVzLCBkZXZfaWQsIG1hc2spOwogfQogCi0vKgotICogVGhpcyBkb2VzIG5vdGhpbmcgYmVjYXVzZSB0aGVyZSBpcyBub3QgZW5vdWdoIGluZm9ybWF0aW9uCi0gKiBwcm92aWRlZCB0byBkbyB0aGUgRU9JIEh2Q2FsbC4gIFRoaXMgaXMgZG9uZSBieSBYbVBjaUxwRXZlbnQuYwotICovCi1zdGF0aWMgdm9pZCBpU2VyaWVzX2VuZF9JUlEodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIGlzZXJpZXNfZW5kX0lSUSh1bnNpZ25lZCBpbnQgaXJxKQogeworCXVuc2lnbmVkIGludCByaXJxID0gdmlydF9pcnFfdG9fcmVhbF9tYXBbaXJxXTsKKworCUh2Q2FsbFBjaV9lb2koUkVBTF9JUlFfVE9fQlVTKHJpcnEpLCBSRUFMX0lSUV9UT19TVUJCVVMocmlycSksCisJCShSRUFMX0lSUV9UT19JRFNFTChyaXJxKSA8PCA0KSArIFJFQUxfSVJRX1RPX0ZVTkMocmlycSkpOwogfQogCiBzdGF0aWMgaHdfaXJxX2NvbnRyb2xsZXIgaVNlcmllc19JUlFfaGFuZGxlciA9IHsKIAkudHlwZW5hbWUgPSAiaVNlcmllcyBpcnEgY29udHJvbGxlciIsCi0JLnN0YXJ0dXAgPSBpU2VyaWVzX3N0YXJ0dXBfSVJRLAotCS5zaHV0ZG93biA9IGlTZXJpZXNfc2h1dGRvd25fSVJRLAotCS5lbmFibGUgPSBpU2VyaWVzX2VuYWJsZV9JUlEsCi0JLmRpc2FibGUgPSBpU2VyaWVzX2Rpc2FibGVfSVJRLAotCS5lbmQgPSBpU2VyaWVzX2VuZF9JUlEKKwkuc3RhcnR1cCA9IGlzZXJpZXNfc3RhcnR1cF9JUlEsCisJLnNodXRkb3duID0gaXNlcmllc19zaHV0ZG93bl9JUlEsCisJLmVuYWJsZSA9IGlzZXJpZXNfZW5hYmxlX0lSUSwKKwkuZGlzYWJsZSA9IGlzZXJpZXNfZGlzYWJsZV9JUlEsCisJLmVuZCA9IGlzZXJpZXNfZW5kX0lSUQogfTsKIAogLyoKICAqIFRoaXMgaXMgY2FsbGVkIG91dCBvZiBpU2VyaWVzX3NjYW5fc2xvdCB0byBhbGxvY2F0ZSBhbiBJUlEgZm9yIGFuIEVBRFMgc2xvdAogICogSXQgY2FsY3VsYXRlcyB0aGUgaXJxIHZhbHVlIGZvciB0aGUgc2xvdC4KLSAqIE5vdGUgdGhhdCBzdWJCdXNOdW1iZXIgaXMgYWx3YXlzIDAgKGF0IHRoZSBtb21lbnQgYXQgbGVhc3QpLgorICogTm90ZSB0aGF0IHN1Yl9idXMgaXMgYWx3YXlzIDAgKGF0IHRoZSBtb21lbnQgYXQgbGVhc3QpLgogICovCi1pbnQgX19pbml0IGlTZXJpZXNfYWxsb2NhdGVfSVJRKEh2QnVzTnVtYmVyIGJ1c051bWJlciwKLQkJSHZTdWJCdXNOdW1iZXIgc3ViQnVzTnVtYmVyLCBIdkFnZW50SWQgZGV2aWNlSWQpCitpbnQgX19pbml0IGlTZXJpZXNfYWxsb2NhdGVfSVJRKEh2QnVzTnVtYmVyIGJ1cywKKwkJSHZTdWJCdXNOdW1iZXIgc3ViX2J1cywgSHZBZ2VudElkIGRldl9pZCkKIHsKIAlpbnQgdmlydGlycTsKIAl1bnNpZ25lZCBpbnQgcmVhbGlycTsKLQl1OCBpZHNlbCA9IChkZXZpY2VJZCA+PiA0KTsKLQl1OCBmdW5jdGlvbiA9IGRldmljZUlkICYgNzsKKwl1OCBpZHNlbCA9IChkZXZfaWQgPj4gNCk7CisJdTggZnVuY3Rpb24gPSBkZXZfaWQgJiA3OwogCi0JcmVhbGlycSA9ICgoYnVzTnVtYmVyIC0gMSkgPDwgNikgKyAoKGlkc2VsIC0gMSkgPDwgMykgKyBmdW5jdGlvbjsKKwlyZWFsaXJxID0gKCgoKChzdWJfYnVzIDw8IDgpICsgKGJ1cyAtIDEpKSA8PCAzKSArIChpZHNlbCAtIDEpKSA8PCAzKQorCQkrIGZ1bmN0aW9uOwogCXZpcnRpcnEgPSB2aXJ0X2lycV9jcmVhdGVfbWFwcGluZyhyZWFsaXJxKTsKIAogCWlycV9kZXNjW3ZpcnRpcnFdLmhhbmRsZXIgPSAmaVNlcmllc19JUlFfaGFuZGxlcjsKIAlyZXR1cm4gdmlydGlycTsKIH0KKworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKworLyoKKyAqIEdldCB0aGUgbmV4dCBwZW5kaW5nIElSUS4KKyAqLworaW50IGlTZXJpZXNfZ2V0X2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkvKiAtMiBtZWFucyBpZ25vcmUgdGhpcyBpbnRlcnJ1cHQgKi8KKwlpbnQgaXJxID0gLTI7CisKKyNpZmRlZiBDT05GSUdfU01QCisJaWYgKGdldF9scHBhY2EoKS0+aW50X2R3b3JkLmZpZWxkcy5pcGlfY250KSB7CisJCWdldF9scHBhY2EoKS0+aW50X2R3b3JkLmZpZWxkcy5pcGlfY250ID0gMDsKKwkJaVNlcmllc19zbXBfbWVzc2FnZV9yZWN2KHJlZ3MpOworCX0KKyNlbmRpZiAvKiBDT05GSUdfU01QICovCisJaWYgKGh2bHBldmVudF9pc19wZW5kaW5nKCkpCisJCXByb2Nlc3NfaHZscGV2ZW50cyhyZWdzKTsKKworI2lmZGVmIENPTkZJR19QQ0kKKwlpZiAobnVtX3BlbmRpbmdfaXJxcykgeworCQlzcGluX2xvY2soJnBlbmRpbmdfaXJxc19sb2NrKTsKKwkJZm9yIChpcnEgPSAwOyBpcnEgPCBOUl9JUlFTOyBpcnErKykgeworCQkJaWYgKHBlbmRpbmdfaXJxc1tpcnFdKSB7CisJCQkJcGVuZGluZ19pcnFzW2lycV0tLTsKKwkJCQludW1fcGVuZGluZ19pcnFzLS07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2soJnBlbmRpbmdfaXJxc19sb2NrKTsKKwkJaWYgKGlycSA+PSBOUl9JUlFTKQorCQkJaXJxID0gLTI7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gaXJxOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lycS5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lycS5oCmluZGV4IDVmNjQzZjEuLmI5YzgwMWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pcnEuaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaXJxLmgKQEAgLTQsNSArNCw2IEBACiBleHRlcm4gdm9pZCBpU2VyaWVzX2luaXRfSVJRKHZvaWQpOwogZXh0ZXJuIGludCAgaVNlcmllc19hbGxvY2F0ZV9JUlEoSHZCdXNOdW1iZXIsIEh2U3ViQnVzTnVtYmVyLCBIdkFnZW50SWQpOwogZXh0ZXJuIHZvaWQgaVNlcmllc19hY3RpdmF0ZV9JUlFzKHZvaWQpOworZXh0ZXJuIGludCBpU2VyaWVzX2dldF9pcnEoc3RydWN0IHB0X3JlZ3MgKik7CiAKICNlbmRpZiAvKiBfSVNFUklFU19JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2xwYXJkYXRhLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbHBhcmRhdGEuYwppbmRleCBiYjhjOTE1Li40MzhlMmRiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbHBhcmRhdGEuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbHBhcmRhdGEuYwpAQCAtOTMsMTAgKzkzLDcgQEAKIAkueFBpckVudmlyb25Nb2RlID0gMCwJCS8qIFBpcmFuaGEgc3R1ZmYgKi8KIAkueFBpckNvbnNvbGVNb2RlID0gMCwKIAkueFBpckRhc2RNb2RlID0gMCwKLQkueExwYXJJbnN0YWxsZWQgPSAwLAotCS54U3lzUGFydGl0aW9uZWQgPSAwLAotCS54SHdTeW5jZWRUQnMgPSAwLAotCS54SW50UHJvY1V0aWxIbXQgPSAwLAorCS5mbGFncyA9IDAsCiAJLnhTcFZwZEZvcm1hdCA9IDAsCiAJLnhJbnRQcm9jUmF0aW8gPSAwLAogCS54UGxpY1ZybUluZGV4ID0gMCwJCS8qIFZSTSBpbmRleCBvZiBQTElDICovCkBAIC0yMjUsMyArMjIyLDEwIEBACiAJCTAsMAogCX0KIH07CisKK3N0cnVjdCBJdExwUmVnU2F2ZSBpc2VyaWVzX3JlZ19zYXZlW10gPSB7CisJWzAgLi4uIChOUl9DUFVTLTEpXSA9IHsKKwkJLnhEZXNjID0gMHhkMzk3ZDllMiwJLyogIkxwUlMiICovCisJCS54U2l6ZSA9IHNpemVvZihzdHJ1Y3QgSXRMcFJlZ1NhdmUpLAorCX0sCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2xwZXZlbnRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbHBldmVudHMuYwppbmRleCBlOWZiOThiLi4wYjg4NTMwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbHBldmVudHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbHBldmVudHMuYwpAQCAtNTMsNyArNTMsNyBAQAogCXN0cnVjdCBIdkxwRXZlbnQgKiBldmVudDsKIAlldmVudCA9IChzdHJ1Y3QgSHZMcEV2ZW50ICopaHZscGV2ZW50X3F1ZXVlLnhTbGljQ3VyRXZlbnRQdHI7CiAKLQlpZiAoZXZlbnQtPnhGbGFncy54VmFsaWQpIHsKKwlpZiAoaHZscGV2ZW50X2lzX3ZhbGlkKGV2ZW50KSkgewogCQkvKiBybWIoKSBuZWVkZWQgb25seSBmb3Igd2Vha2x5IGNvbnNpc3RlbnQgbWFjaGluZXMgKHJlZ2F0dGEpICovCiAJCXJtYigpOwogCQkvKiBTZXQgcG9pbnRlciB0byBuZXh0IHBvdGVudGlhbCBldmVudCAqLwpAQCAtODQsNyArODQsNyBAQAogCiAJbmV4dF9ldmVudCA9IChzdHJ1Y3QgSHZMcEV2ZW50ICopaHZscGV2ZW50X3F1ZXVlLnhTbGljQ3VyRXZlbnRQdHI7CiAKLQlyZXR1cm4gbmV4dF9ldmVudC0+eEZsYWdzLnhWYWxpZCB8CisJcmV0dXJuIGh2bHBldmVudF9pc192YWxpZChuZXh0X2V2ZW50KSB8fAogCQlodmxwZXZlbnRfcXVldWUueFBsaWNPdmVyZmxvd0ludFBlbmRpbmc7CiB9CiAKQEAgLTEwMSwxOCArMTAxLDE4IEBACiAJc3dpdGNoIChleHRyYSkgewogCWNhc2UgMzoKIAkJdG1wID0gKHN0cnVjdCBIdkxwRXZlbnQqKSgoY2hhciopZXZlbnQgKyAzICogTHBFdmVudEFsaWduKTsKLQkJdG1wLT54RmxhZ3MueFZhbGlkID0gMDsKKwkJaHZscGV2ZW50X2ludmFsaWRhdGUodG1wKTsKIAljYXNlIDI6CiAJCXRtcCA9IChzdHJ1Y3QgSHZMcEV2ZW50KikoKGNoYXIqKWV2ZW50ICsgMiAqIExwRXZlbnRBbGlnbik7Ci0JCXRtcC0+eEZsYWdzLnhWYWxpZCA9IDA7CisJCWh2bHBldmVudF9pbnZhbGlkYXRlKHRtcCk7CiAJY2FzZSAxOgogCQl0bXAgPSAoc3RydWN0IEh2THBFdmVudCopKChjaGFyKilldmVudCArIDEgKiBMcEV2ZW50QWxpZ24pOwotCQl0bXAtPnhGbGFncy54VmFsaWQgPSAwOworCQlodmxwZXZlbnRfaW52YWxpZGF0ZSh0bXApOwogCX0KIAogCW1iKCk7CiAKLQlldmVudC0+eEZsYWdzLnhWYWxpZCA9IDA7CisJaHZscGV2ZW50X2ludmFsaWRhdGUoZXZlbnQpOwogfQogCiB2b2lkIHByb2Nlc3NfaHZscGV2ZW50cyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9tZi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL21mLmMKaW5kZXggNDllN2U0Yi4uYTQxZDhiNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL21mLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL21mLmMKQEAgLTI1MSwxMCArMjUxLDcgQEAKIAl9CiAJbWVtc2V0KGV2LCAwLCBzaXplb2Yoc3RydWN0IHBlbmRpbmdfZXZlbnQpKTsKIAloZXYgPSAmZXYtPmV2ZW50LmhwX2xwX2V2ZW50OwotCWhldi0+eEZsYWdzLnhWYWxpZCA9IDE7Ci0JaGV2LT54RmxhZ3MueEFja1R5cGUgPSBIdkxwRXZlbnRfQWNrVHlwZV9JbW1lZGlhdGVBY2s7Ci0JaGV2LT54RmxhZ3MueEFja0luZCA9IEh2THBFdmVudF9BY2tJbmRfRG9BY2s7Ci0JaGV2LT54RmxhZ3MueEZ1bmN0aW9uID0gSHZMcEV2ZW50X0Z1bmN0aW9uX0ludDsKKwloZXYtPmZsYWdzID0gSFZfTFBfRVZFTlRfVkFMSUQgfCBIVl9MUF9FVkVOVF9ET19BQ0sgfCBIVl9MUF9FVkVOVF9JTlQ7CiAJaGV2LT54VHlwZSA9IEh2THBFdmVudF9UeXBlX01hY2hpbmVGYWM7CiAJaGV2LT54U291cmNlTHAgPSBIdkxwQ29uZmlnX2dldExwSW5kZXgoKTsKIAloZXYtPnhUYXJnZXRMcCA9IHByaW1hcnlfbHA7CkBAIC01MTgsMTcgKzUxNSwxMCBAQAogc3RhdGljIHZvaWQgaHZfaGFuZGxlcihzdHJ1Y3QgSHZMcEV2ZW50ICpldmVudCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaWYgKChldmVudCAhPSBOVUxMKSAmJiAoZXZlbnQtPnhUeXBlID09IEh2THBFdmVudF9UeXBlX01hY2hpbmVGYWMpKSB7Ci0JCXN3aXRjaChldmVudC0+eEZsYWdzLnhGdW5jdGlvbikgewotCQljYXNlIEh2THBFdmVudF9GdW5jdGlvbl9BY2s6CisJCWlmIChodmxwZXZlbnRfaXNfYWNrKGV2ZW50KSkKIAkJCWhhbmRsZV9hY2soKHN0cnVjdCBpb19tZl9scF9ldmVudCAqKWV2ZW50KTsKLQkJCWJyZWFrOwotCQljYXNlIEh2THBFdmVudF9GdW5jdGlvbl9JbnQ6CisJCWVsc2UKIAkJCWhhbmRsZV9pbnQoKHN0cnVjdCBpb19tZl9scF9ldmVudCAqKWV2ZW50KTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fRVJSICJtZi5jOiBub24gYWNrL2ludCBldmVudCByZWNlaXZlZFxuIik7Ci0JCQlicmVhazsKLQkJfQogCX0gZWxzZQogCQlwcmludGsoS0VSTl9FUlIgIm1mLmM6IGFsaWVuIGV2ZW50IHJlY2VpdmVkXG4iKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9taXNjLlMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbWlzYy5TCmluZGV4IGRmZTdhYTEuLjc2NDFmYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9taXNjLlMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL21pc2MuUwpAQCAtNDQsNyArNDQsOCBAQAogCS8qIENoZWNrIHBlbmRpbmcgaW50ZXJydXB0cyAqLwogCS8qICAgQSBkZWNyZW1lbnRlciwgSVBJIG9yIFBNQyBpbnRlcnJ1cHQgbWF5IGhhdmUgb2NjdXJyZWQKIAkgKiAgIHdoaWxlIHdlIHdlcmUgaW4gdGhlIGh5cGVydmlzb3IgKHdoaWNoIGVuYWJsZXMpICovCi0JbGQJcjQsUEFDQUxQUEFDQStMUFBBQ0FBTllJTlQocjEzKQorCWxkCXI0LFBBQ0FMUFBBQ0FQVFIocjEzKQorCWxkCXI0LExQUEFDQUFOWUlOVChyNCkKIAljbXBkaQlyNCwwCiAJYmVxbHIKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3BjaS5jCmluZGV4IGRhZmM1MTguLmExOTgzM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvcGNpLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlICJpcnEuaCIKICNpbmNsdWRlICJwY2kuaCIKICNpbmNsdWRlICJjYWxsX3BjaS5oIgorI2luY2x1ZGUgImlvbW11LmgiCiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGlvX3BhZ2VfbWFzazsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwppbmRleCBkYTI2NjM5Li4zZjg3OTAxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwpAQCAtNTIsNiArNTIsNyBAQAogI2luY2x1ZGUgPGFzbS9pc2VyaWVzL21mLmg+CiAjaW5jbHVkZSA8YXNtL2lzZXJpZXMvaHZfbHBfZXZlbnQuaD4KICNpbmNsdWRlIDxhc20vaXNlcmllcy9scGFyX21hcC5oPgorI2luY2x1ZGUgPGFzbS91ZGJnLmg+CiAKICNpbmNsdWRlICJuYWNhLmgiCiAjaW5jbHVkZSAic2V0dXAuaCIKQEAgLTYyLDEwICs2Myw4IEBACiAjaW5jbHVkZSAiY2FsbF9zbS5oIgogI2luY2x1ZGUgImNhbGxfaHB0LmgiCiAKLWV4dGVybiB2b2lkIGh2bG9nKGNoYXIgKmZtdCwgLi4uKTsKLQogI2lmZGVmIERFQlVHCi0jZGVmaW5lIERCRyhmbXQuLi4pIGh2bG9nKGZtdCkKKyNkZWZpbmUgREJHKGZtdC4uLikgdWRiZ19wcmludGYoZm10KQogI2Vsc2UKICNkZWZpbmUgREJHKGZtdC4uLikKICNlbmRpZgpAQCAtNDc0LDE0ICs0NzMsNiBAQAogCXByaW50aygiSFBUIGFic29sdXRlIGFkZHIgPSAlMDE2bHgsIHNpemUgPSAlZEtcbiIsCiAJCQljaHVua190b19hZGRyKGhwdEZpcnN0Q2h1bmspLCBocHRTaXplQ2h1bmtzICogMjU2KTsKIAotCXBwYzY0X3BmdF9zaXplID0gX19pbG9nMihocHRTaXplUGFnZXMgKiBIV19QQUdFX1NJWkUpOwotCi0JLyoKLQkgKiBUaGUgYWN0dWFsIGhhc2hlZCBwYWdlIHRhYmxlIGlzIGluIHRoZSBoeXBlcnZpc29yLAotCSAqIHdlIGhhdmUgbm8gZGlyZWN0IGFjY2VzcwotCSAqLwotCWh0YWJfYWRkcmVzcyA9IE5VTEw7Ci0KIAkvKgogCSAqIERldGVybWluZSBpZiBhYnNvbHV0ZSBtZW1vcnkgaGFzIGFueQogCSAqIGhvbGVzIHNvIHRoYXQgd2UgY2FuIGludGVycHJldCB0aGUKQEAgLTU0Nyw3ICs1MzgsNyBAQAogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgaVNlcmllc19zZXR1cF9hcmNoKHZvaWQpCiB7Ci0JaWYgKGdldF9wYWNhKCktPmxwcGFjYS5zaGFyZWRfcHJvYykgeworCWlmIChnZXRfbHBwYWNhKCktPnNoYXJlZF9wcm9jKSB7CiAJCXBwY19tZC5pZGxlX2xvb3AgPSBpc2VyaWVzX3NoYXJlZF9pZGxlOwogCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBzaGFyZWQgcHJvY2Vzc29yIGlkbGUgbG9vcFxuIik7CiAJfSBlbHNlIHsKQEAgLTU3MSwxNiArNTYyLDYgQEAKIAogLyoKICAqIERvY3VtZW50IG1lLgotICogYW5kIEltcGxlbWVudCBtZS4KLSAqLwotc3RhdGljIGludCBpU2VyaWVzX2dldF9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JLyogLTIgbWVhbnMgaWdub3JlIHRoaXMgaW50ZXJydXB0ICovCi0JcmV0dXJuIC0yOwotfQotCi0vKgotICogRG9jdW1lbnQgbWUuCiAgKi8KIHN0YXRpYyB2b2lkIGlTZXJpZXNfcmVzdGFydChjaGFyICpjbWQpCiB7CkBAIC02NjYsNyArNjQ3LDcgQEAKIAkgKiBUaGUgZGVjcmVtZW50ZXIgc3RvcHMgZHVyaW5nIHRoZSB5aWVsZC4gIEZvcmNlIGEgZmFrZSBkZWNyZW1lbnRlcgogCSAqIGhlcmUgYW5kIGxldCB0aGUgdGltZXJfaW50ZXJydXB0IGNvZGUgc29ydCBvdXQgdGhlIGFjdHVhbCB0aW1lLgogCSAqLwotCWdldF9wYWNhKCktPmxwcGFjYS5pbnRfZHdvcmQuZmllbGRzLmRlY3JfaW50ID0gMTsKKwlnZXRfbHBwYWNhKCktPmludF9kd29yZC5maWVsZHMuZGVjcl9pbnQgPSAxOwogCXByb2Nlc3NfaVNlcmllc19ldmVudHMoKTsKIH0KIApAQCAtODcxLDYgKzg1MiwxMSBAQAogCWR0X3Byb3AoZHQsIG5hbWUsIChjaGFyICopZGF0YSwgc2l6ZW9mKHU2NCkgKiBuKTsKIH0KIAordm9pZCBkdF9wcm9wX3UzMl9saXN0KHN0cnVjdCBpc2VyaWVzX2ZsYXRfZHQgKmR0LCBjaGFyICpuYW1lLCB1MzIgKmRhdGEsIGludCBuKQoreworCWR0X3Byb3AoZHQsIG5hbWUsIChjaGFyICopZGF0YSwgc2l6ZW9mKHUzMikgKiBuKTsKK30KKwogdm9pZCBkdF9wcm9wX2VtcHR5KHN0cnVjdCBpc2VyaWVzX2ZsYXRfZHQgKmR0LCBjaGFyICpuYW1lKQogewogCWR0X3Byb3AoZHQsIG5hbWUsIE5VTEwsIDApOwpAQCAtODgyLDYgKzg2OCw3IEBACiAJdW5zaWduZWQgY2hhciAqcDsKIAl1bnNpZ25lZCBpbnQgaSwgaW5kZXg7CiAJc3RydWN0IElvSHJpUHJvY2Vzc29yVnBkICpkOworCXUzMiBwZnRfc2l6ZVsyXTsKIAogCS8qIHl1Y2sgKi8KIAlzbnByaW50ZihidWYsIDMyLCAiUG93ZXJQQywlcyIsIGN1cl9jcHVfc3BlYy0+Y3B1X25hbWUpOwpAQCAtODkyLDggKzg3OSwxMSBAQAogCWR0X3Byb3BfdTMyKGR0LCAiI2FkZHJlc3MtY2VsbHMiLCAxKTsKIAlkdF9wcm9wX3UzMihkdCwgIiNzaXplLWNlbGxzIiwgMCk7CiAKKwlwZnRfc2l6ZVswXSA9IDA7IC8qIE5VTUEgQ0VDIGNvb2tpZSwgMCBmb3Igbm9uIE5VTUEgICovCisJcGZ0X3NpemVbMV0gPSBfX2lsb2cyKEh2Q2FsbEhwdF9nZXRIcHRQYWdlcygpICogSFdfUEFHRV9TSVpFKTsKKwogCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKLQkJaWYgKHBhY2FbaV0ubHBwYWNhLmR5bl9wcm9jX3N0YXR1cyA+PSAyKQorCQlpZiAobHBwYWNhW2ldLmR5bl9wcm9jX3N0YXR1cyA+PSAyKQogCQkJY29udGludWU7CiAKIAkJc25wcmludGYocCwgMzIgLSAocCAtIGJ1ZiksICJAJWQiLCBpKTsKQEAgLTkwMSw3ICs4OTEsNyBAQAogCiAJCWR0X3Byb3Bfc3RyKGR0LCAiZGV2aWNlX3R5cGUiLCAiY3B1Iik7CiAKLQkJaW5kZXggPSBwYWNhW2ldLmxwcGFjYS5keW5faHZfcGh5c19wcm9jX2luZGV4OworCQlpbmRleCA9IGxwcGFjYVtpXS5keW5faHZfcGh5c19wcm9jX2luZGV4OwogCQlkID0gJnhJb0hyaVByb2Nlc3NvclZwZFtpbmRleF07CiAKIAkJZHRfcHJvcF91MzIoZHQsICJpLWNhY2hlLXNpemUiLCBkLT54SW5zdENhY2hlU2l6ZSAqIDEwMjQpOwpAQCAtOTE4LDYgKzkwOCw4IEBACiAKIAkJZHRfcHJvcF91MzIoZHQsICJyZWciLCBpKTsKIAorCQlkdF9wcm9wX3UzMl9saXN0KGR0LCAiaWJtLHBmdC1zaXplIiwgcGZ0X3NpemUsIDIpOworCiAJCWR0X2VuZF9ub2RlKGR0KTsKIAl9CiAKQEAgLTk5NCwzICs5ODYsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIGVhcmx5X3BhcmFtKCJtZW0iLCBlYXJseV9wYXJzZW1lbSk7CisKK3N0YXRpYyB2b2lkIGh2cHV0YyhjaGFyIGMpCit7CisJaWYgKGMgPT0gJ1xuJykKKwkJaHZwdXRjKCdccicpOworCisJSHZDYWxsX3dyaXRlTG9nQnVmZmVyKCZjLCAxKTsKK30KKwordm9pZCBfX2luaXQgdWRiZ19pbml0X2lzZXJpZXModm9pZCkKK3sKKwl1ZGJnX3B1dGMgPSBodnB1dGM7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc21wLmMKaW5kZXggZmNiMDk0ZS4uNmY5ZDQwNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zbXAuYwpAQCAtOTEsNyArOTEsNyBAQAogCUJVR19PTigobnIgPCAwKSB8fCAobnIgPj0gTlJfQ1BVUykpOwogCiAJLyogVmVyaWZ5IHRoYXQgb3VyIHBhcnRpdGlvbiBoYXMgYSBwcm9jZXNzb3IgbnIgKi8KLQlpZiAocGFjYVtucl0ubHBwYWNhLmR5bl9wcm9jX3N0YXR1cyA+PSAyKQorCWlmIChscHBhY2FbbnJdLmR5bl9wcm9jX3N0YXR1cyA+PSAyKQogCQlyZXR1cm47CiAKIAkvKiBUaGUgcHJvY2Vzc29yIGlzIGN1cnJlbnRseSBzcGlubmluZywgd2FpdGluZwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3Zpby5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3Zpby5jCmluZGV4IDM4NDM2MGUuLmFkMzZhYjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy92aW8uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvdmlvLmMKQEAgLTIyLDYgKzIyLDggQEAKICNpbmNsdWRlIDxhc20vaXNlcmllcy9odl9scF9jb25maWcuaD4KICNpbmNsdWRlIDxhc20vaXNlcmllcy9odl9jYWxsX3htLmg+CiAKKyNpbmNsdWRlICJpb21tdS5oIgorCiBzdHJ1Y3QgZGV2aWNlICppU2VyaWVzX3Zpb19kZXYgPSAmdmlvX2J1c19kZXZpY2UuZGV2OwogRVhQT1JUX1NZTUJPTChpU2VyaWVzX3Zpb19kZXYpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvdmlvcGF0aC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3Zpb3BhdGguYwppbmRleCA4NDI2NzI2OS4uNjIyYTMwMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3Zpb3BhdGguYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvdmlvcGF0aC5jCkBAIC0yNzAsNyArMjcwLDcgQEAKIAkgKiBGaXJzdCBzZWUgaWYgdGhpcyBpcyBqdXN0IGEgbm9ybWFsIG1vbml0b3IgbWVzc2FnZSBmcm9tIHRoZQogCSAqIG90aGVyIHBhcnRpdGlvbgogCSAqLwotCWlmIChldmVudC0+eEZsYWdzLnhGdW5jdGlvbiA9PSBIdkxwRXZlbnRfRnVuY3Rpb25fSW50KSB7CisJaWYgKGh2bHBldmVudF9pc19pbnQoZXZlbnQpKSB7CiAJCXJlbW90ZUxwID0gZXZlbnQtPnhTb3VyY2VMcDsKIAkJaWYgKCF2aW9wYXRoU3RhdHVzW3JlbW90ZUxwXS5pc0FjdGl2ZSkKIAkJCXNlbmRNb25Nc2cocmVtb3RlTHApOwpAQCAtMzMxLDEzICszMzEsMTIgQEAKIHsKIAlpZiAoIWV2ZW50KQogCQlyZXR1cm47Ci0JaWYgKGV2ZW50LT54RmxhZ3MueEZ1bmN0aW9uID09IEh2THBFdmVudF9GdW5jdGlvbl9JbnQpIHsKKwlpZiAoaHZscGV2ZW50X2lzX2ludChldmVudCkpIHsKIAkJcHJpbnRrKFZJT1BBVEhfS0VSTl9XQVJOCiAJCSAgICAgICAidW5leHBlY3RlZCBjb25maWcgcmVxdWVzdCBmcm9tIHBhcnRpdGlvbiAlZCIsCiAJCSAgICAgICBldmVudC0+eFNvdXJjZUxwKTsKIAotCQlpZiAoKGV2ZW50LT54RmxhZ3MueEZ1bmN0aW9uID09IEh2THBFdmVudF9GdW5jdGlvbl9JbnQpICYmCi0JCSAgICAoZXZlbnQtPnhGbGFncy54QWNrSW5kID09IEh2THBFdmVudF9BY2tJbmRfRG9BY2spKSB7CisJCWlmIChodmxwZXZlbnRfbmVlZF9hY2soZXZlbnQpKSB7CiAJCQlldmVudC0+eFJjID0gSHZMcEV2ZW50X1JjX0ludmFsaWRTdWJ0eXBlOwogCQkJSHZDYWxsRXZlbnRfYWNrTHBFdmVudChldmVudCk7CiAJCX0KQEAgLTM3Nyw3ICszNzYsNyBAQAogCWludCBzdWJ0eXBlID0gKGV2ZW50LT54U3VidHlwZSAmIFZJT01BSk9SX1NVQlRZUEVfTUFTSykKIAkJPj4gVklPTUFKT1JfU1VCVFlQRV9TSElGVDsKIAotCWlmIChldmVudC0+eEZsYWdzLnhGdW5jdGlvbiA9PSBIdkxwRXZlbnRfRnVuY3Rpb25fSW50KSB7CisJaWYgKGh2bHBldmVudF9pc19pbnQoZXZlbnQpKSB7CiAJCXJlbW90ZUxwID0gZXZlbnQtPnhTb3VyY2VMcDsKIAkJLyoKIAkJICogVGhlIGlzQWN0aXZlIGlzIGNoZWNrZWQgYmVjYXVzZSBpZiB0aGUgaG9zdGluZyBwYXJ0aXRpb24KQEAgLTQzNiw4ICs0MzUsNyBAQAogCQkgICAgICAgInVuZXhwZWN0ZWQgdmlydHVhbCBpbyBldmVudCBzdWJ0eXBlICVkIGZyb20gcGFydGl0aW9uICVkXG4iLAogCQkgICAgICAgZXZlbnQtPnhTdWJ0eXBlLCByZW1vdGVMcCk7CiAJCS8qIE5vIGhhbmRsZXIuICBBY2sgaWYgbmVjZXNzYXJ5ICovCi0JCWlmICgoZXZlbnQtPnhGbGFncy54RnVuY3Rpb24gPT0gSHZMcEV2ZW50X0Z1bmN0aW9uX0ludCkgJiYKLQkJICAgIChldmVudC0+eEZsYWdzLnhBY2tJbmQgPT0gSHZMcEV2ZW50X0Fja0luZF9Eb0FjaykpIHsKKwkJaWYgKGh2bHBldmVudF9pc19pbnQoZXZlbnQpICYmIGh2bHBldmVudF9uZWVkX2FjayhldmVudCkpIHsKIAkJCWV2ZW50LT54UmMgPSBIdkxwRXZlbnRfUmNfSW52YWxpZFN1YnR5cGU7CiAJCQlIdkNhbGxFdmVudF9hY2tMcEV2ZW50KGV2ZW50KTsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvcGNpLmMKaW5kZXggZjQwNDUxZC4uN2Q0MDk5YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3BjaS5jCkBAIC0zMTYsNyArMzE2LDYgQEAKIAljaGFyKiBkaXNwX25hbWU7CiAJaW50ICpidXNfcmFuZ2U7CiAJaW50IHByaW1hcnkgPSAxOwotCXN0cnVjdCBwcm9wZXJ0eSAqb2ZfcHJvcDsKIAogCURCRygiQWRkaW5nIFBDSSBob3N0IGJyaWRnZSAlc1xuIiwgZGV2LT5mdWxsX25hbWUpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3NldHVwLmMKaW5kZXggN2VjZTg5OC4uZWM1YzFlMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvc2V0dXAuYwpAQCAtNTEsNiArNTEsNyBAQAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9rZXhlYy5oPgogI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CiAjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KQEAgLTcwLDQxICs3MSw2MCBAQAogI2RlZmluZSBEQkcoZm10Li4uKQogI2VuZGlmCiAKLWV4dGVybiB2b2lkIGdlbmVyaWNfZmluZF9sZWdhY3lfc2VyaWFsX3BvcnRzKHU2NCAqcGh5c3BvcnQsCi0JCXVuc2lnbmVkIGludCAqZGVmYXVsdF9zcGVlZCk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBtYXBsZV9maW5kX252cmFtX2Jhc2Uodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJ0Y3M7CisJdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOworCisJLyogZmluZCBOVlJBTSBkZXZpY2UgKi8KKwlydGNzID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgIm52cmFtIiwgIkFNRDgxMTEiKTsKKwlpZiAocnRjcykgeworCQlzdHJ1Y3QgcmVzb3VyY2UgcjsKKwkJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UocnRjcywgMCwgJnIpKSB7CisJCQlwcmludGsoS0VSTl9FTUVSRyAiTWFwbGU6IFVuYWJsZSB0byB0cmFuc2xhdGUgTlZSQU0iCisJCQkgICAgICAgIiBhZGRyZXNzXG4iKTsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCQlpZiAoIShyLmZsYWdzICYgSU9SRVNPVVJDRV9JTykpIHsKKwkJCXByaW50ayhLRVJOX0VNRVJHICJNYXBsZTogTlZSQU0gYWRkcmVzcyBpc24ndCBQSU8hXG4iKTsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCQlyZXN1bHQgPSByLnN0YXJ0OworCX0gZWxzZQorCQlwcmludGsoS0VSTl9FTUVSRyAiTWFwbGU6IFVuYWJsZSB0byBmaW5kIE5WUkFNXG4iKTsKKyBiYWlsOgorCW9mX25vZGVfcHV0KHJ0Y3MpOworCXJldHVybiByZXN1bHQ7Cit9CiAKIHN0YXRpYyB2b2lkIG1hcGxlX3Jlc3RhcnQoY2hhciAqY21kKQogewogCXVuc2lnbmVkIGludCBtYXBsZV9udnJhbV9iYXNlOwogCXVuc2lnbmVkIGludCBtYXBsZV9udnJhbV9vZmZzZXQ7CiAJdW5zaWduZWQgaW50IG1hcGxlX252cmFtX2NvbW1hbmQ7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpydGNzOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc3A7CiAKLQkvKiBmaW5kIE5WUkFNIGRldmljZSAqLwotCXJ0Y3MgPSBmaW5kX2NvbXBhdGlibGVfZGV2aWNlcygibnZyYW0iLCAiQU1EODExMSIpOwotCWlmIChydGNzICYmIHJ0Y3MtPmFkZHJzKSB7Ci0JCW1hcGxlX252cmFtX2Jhc2UgPSBydGNzLT5hZGRyc1swXS5hZGRyZXNzOwotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VNRVJHICJNYXBsZTogVW5hYmxlIHRvIGZpbmQgTlZSQU1cbiIpOwotCQlwcmludGsoS0VSTl9FTUVSRyAiTWFwbGU6IE1hbnVhbCBSZXN0YXJ0IFJlcXVpcmVkXG4iKTsKLQkJcmV0dXJuOwotCX0KKwltYXBsZV9udnJhbV9iYXNlID0gbWFwbGVfZmluZF9udnJhbV9iYXNlKCk7CisJaWYgKG1hcGxlX252cmFtX2Jhc2UgPT0gMCkKKwkJZ290byBmYWlsOwogCiAJLyogZmluZCBzZXJ2aWNlIHByb2Nlc3NvciBkZXZpY2UgKi8KLQlydGNzID0gZmluZF9kZXZpY2VzKCJzZXJ2aWNlLXByb2Nlc3NvciIpOwotCWlmICghcnRjcykgeworCXNwID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInNlcnZpY2UtcHJvY2Vzc29yIik7CisJaWYgKCFzcCkgewogCQlwcmludGsoS0VSTl9FTUVSRyAiTWFwbGU6IFVuYWJsZSB0byBmaW5kIFNlcnZpY2UgUHJvY2Vzc29yXG4iKTsKLQkJcHJpbnRrKEtFUk5fRU1FUkcgIk1hcGxlOiBNYW51YWwgUmVzdGFydCBSZXF1aXJlZFxuIik7Ci0JCXJldHVybjsKKwkJZ290byBmYWlsOwogCX0KLQltYXBsZV9udnJhbV9vZmZzZXQgPSAqKHVuc2lnbmVkIGludCopIGdldF9wcm9wZXJ0eShydGNzLAorCW1hcGxlX252cmFtX29mZnNldCA9ICoodW5zaWduZWQgaW50KikgZ2V0X3Byb3BlcnR5KHNwLAogCQkJInJlc3RhcnQtYWRkciIsIE5VTEwpOwotCW1hcGxlX252cmFtX2NvbW1hbmQgPSAqKHVuc2lnbmVkIGludCopIGdldF9wcm9wZXJ0eShydGNzLAorCW1hcGxlX252cmFtX2NvbW1hbmQgPSAqKHVuc2lnbmVkIGludCopIGdldF9wcm9wZXJ0eShzcCwKIAkJCSJyZXN0YXJ0LXZhbHVlIiwgTlVMTCk7CisJb2Zfbm9kZV9wdXQoc3ApOwogCiAJLyogc2VuZCBjb21tYW5kICovCiAJb3V0Yl9wKG1hcGxlX252cmFtX2NvbW1hbmQsIG1hcGxlX252cmFtX2Jhc2UgKyBtYXBsZV9udnJhbV9vZmZzZXQpOwogCWZvciAoOzspIDsKKyBmYWlsOgorCXByaW50ayhLRVJOX0VNRVJHICJNYXBsZTogTWFudWFsIFJlc3RhcnQgUmVxdWlyZWRcbiIpOwogfQogCiBzdGF0aWMgdm9pZCBtYXBsZV9wb3dlcl9vZmYodm9pZCkKQEAgLTExMiwzMyArMTMyLDI5IEBACiAJdW5zaWduZWQgaW50IG1hcGxlX252cmFtX2Jhc2U7CiAJdW5zaWduZWQgaW50IG1hcGxlX252cmFtX29mZnNldDsKIAl1bnNpZ25lZCBpbnQgbWFwbGVfbnZyYW1fY29tbWFuZDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJ0Y3M7CisJc3RydWN0IGRldmljZV9ub2RlICpzcDsKIAotCS8qIGZpbmQgTlZSQU0gZGV2aWNlICovCi0JcnRjcyA9IGZpbmRfY29tcGF0aWJsZV9kZXZpY2VzKCJudnJhbSIsICJBTUQ4MTExIik7Ci0JaWYgKHJ0Y3MgJiYgcnRjcy0+YWRkcnMpIHsKLQkJbWFwbGVfbnZyYW1fYmFzZSA9IHJ0Y3MtPmFkZHJzWzBdLmFkZHJlc3M7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fRU1FUkcgIk1hcGxlOiBVbmFibGUgdG8gZmluZCBOVlJBTVxuIik7Ci0JCXByaW50ayhLRVJOX0VNRVJHICJNYXBsZTogTWFudWFsIFBvd2VyLURvd24gUmVxdWlyZWRcbiIpOwotCQlyZXR1cm47Ci0JfQorCW1hcGxlX252cmFtX2Jhc2UgPSBtYXBsZV9maW5kX252cmFtX2Jhc2UoKTsKKwlpZiAobWFwbGVfbnZyYW1fYmFzZSA9PSAwKQorCQlnb3RvIGZhaWw7CiAKIAkvKiBmaW5kIHNlcnZpY2UgcHJvY2Vzc29yIGRldmljZSAqLwotCXJ0Y3MgPSBmaW5kX2RldmljZXMoInNlcnZpY2UtcHJvY2Vzc29yIik7Ci0JaWYgKCFydGNzKSB7CisJc3AgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAic2VydmljZS1wcm9jZXNzb3IiKTsKKwlpZiAoIXNwKSB7CiAJCXByaW50ayhLRVJOX0VNRVJHICJNYXBsZTogVW5hYmxlIHRvIGZpbmQgU2VydmljZSBQcm9jZXNzb3JcbiIpOwotCQlwcmludGsoS0VSTl9FTUVSRyAiTWFwbGU6IE1hbnVhbCBQb3dlci1Eb3duIFJlcXVpcmVkXG4iKTsKLQkJcmV0dXJuOworCQlnb3RvIGZhaWw7CiAJfQotCW1hcGxlX252cmFtX29mZnNldCA9ICoodW5zaWduZWQgaW50KikgZ2V0X3Byb3BlcnR5KHJ0Y3MsCisJbWFwbGVfbnZyYW1fb2Zmc2V0ID0gKih1bnNpZ25lZCBpbnQqKSBnZXRfcHJvcGVydHkoc3AsCiAJCQkicG93ZXItb2ZmLWFkZHIiLCBOVUxMKTsKLQltYXBsZV9udnJhbV9jb21tYW5kID0gKih1bnNpZ25lZCBpbnQqKSBnZXRfcHJvcGVydHkocnRjcywKKwltYXBsZV9udnJhbV9jb21tYW5kID0gKih1bnNpZ25lZCBpbnQqKSBnZXRfcHJvcGVydHkoc3AsCiAJCQkicG93ZXItb2ZmLXZhbHVlIiwgTlVMTCk7CisJb2Zfbm9kZV9wdXQoc3ApOwogCiAJLyogc2VuZCBjb21tYW5kICovCiAJb3V0Yl9wKG1hcGxlX252cmFtX2NvbW1hbmQsIG1hcGxlX252cmFtX2Jhc2UgKyBtYXBsZV9udnJhbV9vZmZzZXQpOwogCWZvciAoOzspIDsKKyBmYWlsOgorCXByaW50ayhLRVJOX0VNRVJHICJNYXBsZTogTWFudWFsIFBvd2VyLURvd24gUmVxdWlyZWRcbiIpOwogfQogCiBzdGF0aWMgdm9pZCBtYXBsZV9oYWx0KHZvaWQpCkBAIC0xODEsOSArMTk3LDYgQEAKICAqLwogc3RhdGljIHZvaWQgX19pbml0IG1hcGxlX2luaXRfZWFybHkodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgZGVmYXVsdF9zcGVlZDsKLQl1NjQgcGh5c3BvcnQ7Ci0KIAlEQkcoIiAtPiBtYXBsZV9pbml0X2Vhcmx5XG4iKTsKIAogCS8qIEluaXRpYWxpemUgaGFzaCB0YWJsZSwgZnJvbSBub3cgb24sIHdlIGNhbiB0YWtlIGhhc2ggZmF1bHRzCkBAIC0xOTEsMjQgKzIwNCwxMCBAQAogCSAqLwogCWhwdGVfaW5pdF9uYXRpdmUoKTsKIAotCS8qIEZpbmQgdGhlIHNlcmlhbCBwb3J0ICovCi0JZ2VuZXJpY19maW5kX2xlZ2FjeV9zZXJpYWxfcG9ydHMoJnBoeXNwb3J0LCAmZGVmYXVsdF9zcGVlZCk7Ci0KLQlEQkcoInBoeXMgcG9ydCBhZGRyOiAlbHhcbiIsIChsb25nKXBoeXNwb3J0KTsKLQotCWlmIChwaHlzcG9ydCkgewotCQl2b2lkICpjb21wb3J0OwotCQkvKiBNYXAgdGhlIHVhcnQgZm9yIHVkYmcuICovCi0JCWNvbXBvcnQgPSAodm9pZCAqKWlvcmVtYXAocGh5c3BvcnQsIDE2KTsKLQkJdWRiZ19pbml0X3VhcnQoY29tcG9ydCwgZGVmYXVsdF9zcGVlZCk7Ci0KLQkJREJHKCJIZWxsbyBXb3JsZCAhXG4iKTsKLQl9Ci0KIAkvKiBTZXR1cCBpbnRlcnJ1cHQgbWFwcGluZyBvcHRpb25zICovCiAJcHBjNjRfaW50ZXJydXB0X2NvbnRyb2xsZXIgPSBJQ19PUEVOX1BJQzsKIAotCWlvbW11X2luaXRfZWFybHlfdTMoKTsKKwlpb21tdV9pbml0X2Vhcmx5X2RhcnQoKTsKIAogCURCRygiIDwtIG1hcGxlX2luaXRfZWFybHlcbiIpOwogfQpAQCAtMjcwLDcgKzI2OSw3IEBACiAJICogb2NjdXBpZXMgaGF2aW5nIHRvIGJlIGJyb2tlbiB1cCBzbyB0aGUgREFSVCBpdHNlbGYgaXMgbm90CiAJICogcGFydCBvZiB0aGUgY2FjaGVhYmxlIGxpbmFyIG1hcHBpbmcKIAkgKi8KLQlhbGxvY191M19kYXJ0X3RhYmxlKCk7CisJYWxsb2NfZGFydF90YWJsZSgpOwogCiAJcmV0dXJuIDE7CiB9CkBAIC0yOTIsNCArMjkxLDkgQEAKICAgICAgIAkuY2FsaWJyYXRlX2RlY3IJCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKIAkucHJvZ3Jlc3MJCT0gbWFwbGVfcHJvZ3Jlc3MsCiAJLmlkbGVfbG9vcAkJPSBuYXRpdmVfaWRsZSwKKyNpZmRlZiBDT05GSUdfS0VYRUMKKwkubWFjaGluZV9rZXhlYwkJPSBkZWZhdWx0X21hY2hpbmVfa2V4ZWMsCisJLm1hY2hpbmVfa2V4ZWNfcHJlcGFyZQk9IGRlZmF1bHRfbWFjaGluZV9rZXhlY19wcmVwYXJlLAorCS5tYWNoaW5lX2NyYXNoX3NodXRkb3duCT0gZGVmYXVsdF9tYWNoaW5lX2NyYXNoX3NodXRkb3duLAorI2VuZGlmCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS90aW1lLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3RpbWUuYwppbmRleCAxNTg0NmNjLi41MGJjNGViIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3RpbWUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3RpbWUuYwpAQCAtMTY4LDExICsxNjgsMjQgQEAKIAlzdHJ1Y3QgcnRjX3RpbWUgdG07CiAJc3RydWN0IGRldmljZV9ub2RlICpydGNzOwogCi0JcnRjcyA9IGZpbmRfY29tcGF0aWJsZV9kZXZpY2VzKCJydGMiLCAicG5wUE5QLGIwMCIpOwotCWlmIChydGNzICYmIHJ0Y3MtPmFkZHJzKSB7Ci0JCW1hcGxlX3J0Y19hZGRyID0gcnRjcy0+YWRkcnNbMF0uYWRkcmVzczsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiTWFwbGU6IEZvdW5kIFJUQyBhdCAweCV4XG4iLCBtYXBsZV9ydGNfYWRkcik7Ci0JfSBlbHNlIHsKKwlydGNzID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgInJ0YyIsICJwbnBQTlAsYjAwIik7CisJaWYgKHJ0Y3MpIHsKKwkJc3RydWN0IHJlc291cmNlIHI7CisJCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKHJ0Y3MsIDAsICZyKSkgeworCQkJcHJpbnRrKEtFUk5fRU1FUkcgIk1hcGxlOiBVbmFibGUgdG8gdHJhbnNsYXRlIFJUQyIKKwkJCSAgICAgICAiIGFkZHJlc3NcbiIpOworCQkJZ290byBiYWlsOworCQl9CisJCWlmICghKHIuZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSkgeworCQkJcHJpbnRrKEtFUk5fRU1FUkcgIk1hcGxlOiBSVEMgYWRkcmVzcyBpc24ndCBQSU8hXG4iKTsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCQltYXBsZV9ydGNfYWRkciA9IHIuc3RhcnQ7CisJCXByaW50ayhLRVJOX0lORk8gIk1hcGxlOiBGb3VuZCBSVEMgYXQgSU8gMHgleFxuIiwKKwkJICAgICAgIG1hcGxlX3J0Y19hZGRyKTsKKwl9CisgYmFpbDoKKwlpZiAobWFwbGVfcnRjX2FkZHIgPT0gMCkgewogCQltYXBsZV9ydGNfYWRkciA9IFJUQ19QT1JUKDApOyAvKiBsZWdhY3kgYWRkcmVzcyAqLwogCQlwcmludGsoS0VSTl9JTkZPICJNYXBsZTogTm8gZGV2aWNlIG5vZGUgZm9yIFJUQywgYXNzdW1pbmcgIgogCQkgICAgICAgImxlZ2FjeSBhZGRyZXNzICgweCV4KVxuIiwgbWFwbGVfcnRjX2FkZHIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvTWFrZWZpbGUKaW5kZXggYzlkZjQ0Zi4uNzgwOTNkNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL01ha2VmaWxlCkBAIC0xLDkgKzEsMTQgQEAKK0NGTEFHU19ib290eF9pbml0Lm8gIAkJKz0gLWZQSUMKKwogb2JqLXkJCQkJKz0gcGljLm8gc2V0dXAubyB0aW1lLm8gZmVhdHVyZS5vIHBjaS5vIFwKLQkJCQkgICBzbGVlcC5vIGxvd19pMmMubyBjYWNoZS5vCisJCQkJICAgc2xlZXAubyBsb3dfaTJjLm8gY2FjaGUubyBwZnVuY19jb3JlLm8gXAorCQkJCSAgIHBmdW5jX2Jhc2Uubwogb2JqLSQoQ09ORklHX1BNQUNfQkFDS0xJR0hUKQkrPSBiYWNrbGlnaHQubwogb2JqLSQoQ09ORklHX0NQVV9GUkVRX1BNQUMpCSs9IGNwdWZyZXFfMzIubwogb2JqLSQoQ09ORklHX0NQVV9GUkVRX1BNQUM2NCkJKz0gY3B1ZnJlcV82NC5vCiBvYmotJChDT05GSUdfTlZSQU0pCQkrPSBudnJhbS5vCiAjIHBwYzY0IHBtYWMgZG9lc24ndCBkZWZpbmUgQ09ORklHX05WUkFNIGJ1dCBuZWVkcyBudnJhbSBzdHVmZgogb2JqLSQoQ09ORklHX1BQQzY0KQkJKz0gbnZyYW0ubworb2JqLSQoQ09ORklHX1BQQzMyKQkJKz0gYm9vdHhfaW5pdC5vCiBvYmotJChDT05GSUdfU01QKQkJKz0gc21wLm8KK29iai0kKENPTkZJR19QUENfTUVSR0UpCQkrPSB1ZGJnX3NjYy5vIHVkYmdfYWRiLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvYm9vdHhfaW5pdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9ib290eF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4YjRkNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvYm9vdHhfaW5pdC5jCkBAIC0wLDAgKzEsNTQ3IEBACisvKgorICogIEVhcmx5IGJvb3Qgc3VwcG9ydCBjb2RlIGZvciBCb290WCBib290bG9hZGVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBCZW4uIEhlcnJlbnNjaG1pZHQgKGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZykKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Jvb3R4Lmg+CisjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CisjaW5jbHVkZSA8YXNtL2J0ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyN1bmRlZiBERUJVRworI2RlZmluZSBTRVRfQk9PVF9CQVQKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERCRyhmbXQuLi4pIGRvIHsgYm9vdHhfcHJpbnRmKGZtdCk7IH0gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIERCRyhmbXQuLi4pIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKK2V4dGVybiB2b2lkIF9fc3RhcnQodW5zaWduZWQgbG9uZyByMywgdW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSk7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgYm9vdHhfZHRfc3RyYmFzZTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgYm9vdHhfZHRfc3RyZW5kOworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBib290eF9ub2RlX2Nob3NlbjsKK3N0YXRpYyBib290X2luZm9zX3QgKiBfX2luaXRkYXRhIGJvb3R4X2luZm87CitzdGF0aWMgY2hhciBfX2luaXRkYXRhIGJvb3R4X2Rpc3BfcGF0aFsyNTZdOworCisvKiBJcyBib290LWluZm8gY29tcGF0aWJsZSA/ICovCisjZGVmaW5lIEJPT1RfSU5GT19JU19DT01QQVRJQkxFKGJpKSBcCisJKChiaSktPmNvbXBhdGlibGVfdmVyc2lvbiA8PSBCT09UX0lORk9fVkVSU0lPTikKKyNkZWZpbmUgQk9PVF9JTkZPX0lTX1YyX0NPTVBBVElCTEUoYmkpCSgoYmkpLT52ZXJzaW9uID49IDIpCisjZGVmaW5lIEJPT1RfSU5GT19JU19WNF9DT01QQVRJQkxFKGJpKQkoKGJpKS0+dmVyc2lvbiA+PSA0KQorCisjaWZkZWYgQ09ORklHX0JPT1RYX1RFWFQKK3N0YXRpYyB2b2lkIF9faW5pdCBib290eF9wcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJY29uc3QgY2hhciAqcCwgKnEsICpzOworCXZhX2xpc3QgYXJnczsKKwl1bnNpZ25lZCBsb25nIHY7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCWZvciAocCA9IGZvcm1hdDsgKnAgIT0gMDsgcCA9IHEpIHsKKwkJZm9yIChxID0gcDsgKnEgIT0gMCAmJiAqcSAhPSAnXG4nICYmICpxICE9ICclJzsgKytxKQorCQkJOworCQlpZiAocSA+IHApCisJCQlidGV4dF9kcmF3dGV4dChwLCBxIC0gcCk7CisJCWlmICgqcSA9PSAwKQorCQkJYnJlYWs7CisJCWlmICgqcSA9PSAnXG4nKSB7CisJCQkrK3E7CisJCQlidGV4dF9mbHVzaGxpbmUoKTsKKwkJCWJ0ZXh0X2RyYXdzdHJpbmcoIlxyXG4iKTsKKwkJCWJ0ZXh0X2ZsdXNobGluZSgpOworCQkJY29udGludWU7CisJCX0KKwkJKytxOworCQlpZiAoKnEgPT0gMCkKKwkJCWJyZWFrOworCQlzd2l0Y2ggKCpxKSB7CisJCWNhc2UgJ3MnOgorCQkJKytxOworCQkJcyA9IHZhX2FyZyhhcmdzLCBjb25zdCBjaGFyICopOworCQkJaWYgKHMgPT0gTlVMTCkKKwkJCQlzID0gIjxOVUxMPiI7CisJCQlidGV4dF9kcmF3c3RyaW5nKHMpOworCQkJYnJlYWs7CisJCWNhc2UgJ3gnOgorCQkJKytxOworCQkJdiA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBsb25nKTsKKwkJCWJ0ZXh0X2RyYXdoZXgodik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKyNlbHNlIC8qIENPTkZJR19CT09UWF9URVhUICovCitzdGF0aWMgdm9pZCBfX2luaXQgYm9vdHhfcHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7fQorI2VuZGlmIC8qIENPTkZJR19CT09UWF9URVhUICovCisKK3N0YXRpYyB2b2lkICogX19pbml0IGJvb3R4X2Vhcmx5X2dldHByb3AodW5zaWduZWQgbG9uZyBiYXNlLAorCQkJCQkgdW5zaWduZWQgbG9uZyBub2RlLAorCQkJCQkgY2hhciAqcHJvcCkKK3sKKwlzdHJ1Y3QgYm9vdHhfZHRfbm9kZSAqbnAgPSAoc3RydWN0IGJvb3R4X2R0X25vZGUgKikoYmFzZSArIG5vZGUpOworCXUzMiAqcHBwID0gJm5wLT5wcm9wZXJ0aWVzOworCisJd2hpbGUoKnBwcCkgeworCQlzdHJ1Y3QgYm9vdHhfZHRfcHJvcCAqcHAgPQorCQkJKHN0cnVjdCBib290eF9kdF9wcm9wICopKGJhc2UgKyAqcHBwKTsKKworCQlpZiAoc3RyY21wKChjaGFyICopKCh1bnNpZ25lZCBsb25nKXBwLT5uYW1lICsgYmFzZSksCisJCQkgICBwcm9wKSA9PSAwKSB7CisJCQlyZXR1cm4gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpcHAtPnZhbHVlICsgYmFzZSk7CisJCX0KKwkJcHBwID0gJnBwLT5uZXh0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworI2RlZmluZSBkdF9wdXNoX3Rva2VuKHRva2VuLCBtZW0pIFwKKwlkbyB7IFwKKwkJKihtZW0pID0gX0FMSUdOX1VQKCoobWVtKSw0KTsgXAorCQkqKCh1MzIgKikqKG1lbSkpID0gdG9rZW47IFwKKwkJKihtZW0pICs9IDQ7IFwKKwl9IHdoaWxlKDApCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBib290eF9kdF9maW5kX3N0cmluZyhjaGFyICpzdHIpCit7CisJY2hhciAqcywgKm9zOworCisJcyA9IG9zID0gKGNoYXIgKilib290eF9kdF9zdHJiYXNlOworCXMgKz0gNDsKKwl3aGlsZSAocyA8ICAoY2hhciAqKWJvb3R4X2R0X3N0cmVuZCkgeworCQlpZiAoc3RyY21wKHMsIHN0cikgPT0gMCkKKwkJCXJldHVybiBzIC0gb3M7CisJCXMgKz0gc3RybGVuKHMpICsgMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBib290eF9kdF9hZGRfcHJvcChjaGFyICpuYW1lLCB2b2lkICpkYXRhLCBpbnQgc2l6ZSwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgKm1lbV9lbmQpCit7CisJdW5zaWduZWQgbG9uZyBzb2ZmID0gYm9vdHhfZHRfZmluZF9zdHJpbmcobmFtZSk7CisJaWYgKGRhdGEgPT0gTlVMTCkKKwkJc2l6ZSA9IDA7CisJaWYgKHNvZmYgPT0gMCkgeworCQlib290eF9wcmludGYoIldBUk5JTkc6IENhbid0IGZpbmQgc3RyaW5nIGluZGV4IGZvciA8JXM+XG4iLAorCQkJICAgICBuYW1lKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoc2l6ZSA+IDB4MjAwMDApIHsKKwkJYm9vdHhfcHJpbnRmKCJXQVJOSU5HOiBpZ25vcmluZyBsYXJnZSBwcm9wZXJ0eSAiKTsKKwkJYm9vdHhfcHJpbnRmKCIlcyBsZW5ndGggMHgleFxuIiwgbmFtZSwgc2l6ZSk7CisJCXJldHVybjsKKwl9CisJZHRfcHVzaF90b2tlbihPRl9EVF9QUk9QLCBtZW1fZW5kKTsKKwlkdF9wdXNoX3Rva2VuKHNpemUsIG1lbV9lbmQpOworCWR0X3B1c2hfdG9rZW4oc29mZiwgbWVtX2VuZCk7CisKKwkvKiBwdXNoIHByb3BlcnR5IGNvbnRlbnQgKi8KKwlpZiAoc2l6ZSAmJiBkYXRhKSB7CisJCW1lbWNweSgodm9pZCAqKSptZW1fZW5kLCBkYXRhLCBzaXplKTsKKwkJKm1lbV9lbmQgPSBfQUxJR05fVVAoKm1lbV9lbmQgKyBzaXplLCA0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBib290eF9hZGRfY2hvc2VuX3Byb3BzKHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJCQkJICB1bnNpZ25lZCBsb25nICptZW1fZW5kKQoreworCXUzMiB2YWwgPSBfTUFDSF9QbWFjOworCisJYm9vdHhfZHRfYWRkX3Byb3AoImxpbnV4LHBsYXRmb3JtIiwgJnZhbCwgNCwgbWVtX2VuZCk7CisKKwlpZiAoYm9vdHhfaW5mby0+a2VybmVsUGFyYW1zT2Zmc2V0KSB7CisJCWNoYXIgKmFyZ3MgPSAoY2hhciAqKSgodW5zaWduZWQgbG9uZylib290eF9pbmZvKSArCisJCQlib290eF9pbmZvLT5rZXJuZWxQYXJhbXNPZmZzZXQ7CisJCWJvb3R4X2R0X2FkZF9wcm9wKCJib290YXJncyIsIGFyZ3MsIHN0cmxlbihhcmdzKSArIDEsIG1lbV9lbmQpOworCX0KKwlpZiAoYm9vdHhfaW5mby0+cmFtRGlzaykgeworCQl2YWwgPSAoKHVuc2lnbmVkIGxvbmcpYm9vdHhfaW5mbykgKyBib290eF9pbmZvLT5yYW1EaXNrOworCQlib290eF9kdF9hZGRfcHJvcCgibGludXgsaW5pdHJkLXN0YXJ0IiwgJnZhbCwgNCwgbWVtX2VuZCk7CisJCXZhbCArPSBib290eF9pbmZvLT5yYW1EaXNrU2l6ZTsKKwkJYm9vdHhfZHRfYWRkX3Byb3AoImxpbnV4LGluaXRyZC1lbmQiLCAmdmFsLCA0LCBtZW1fZW5kKTsKKwl9CisJaWYgKHN0cmxlbihib290eF9kaXNwX3BhdGgpKQorCQlib290eF9kdF9hZGRfcHJvcCgibGludXgsc3Rkb3V0LXBhdGgiLCBib290eF9kaXNwX3BhdGgsCisJCQkJICBzdHJsZW4oYm9vdHhfZGlzcF9wYXRoKSArIDEsIG1lbV9lbmQpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgYm9vdHhfYWRkX2Rpc3BsYXlfcHJvcHModW5zaWduZWQgbG9uZyBiYXNlLAorCQkJCQkgICB1bnNpZ25lZCBsb25nICptZW1fZW5kKQoreworCWJvb3R4X2R0X2FkZF9wcm9wKCJsaW51eCxib290LWRpc3BsYXkiLCBOVUxMLCAwLCBtZW1fZW5kKTsKKwlib290eF9kdF9hZGRfcHJvcCgibGludXgsb3BlbmVkIiwgTlVMTCwgMCwgbWVtX2VuZCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBib290eF9kdF9hZGRfc3RyaW5nKGNoYXIgKnMsIHVuc2lnbmVkIGxvbmcgKm1lbV9lbmQpCit7CisJdW5zaWduZWQgaW50IGwgPSBzdHJsZW4ocykgKyAxOworCW1lbWNweSgodm9pZCAqKSptZW1fZW5kLCBzLCBsKTsKKwlib290eF9kdF9zdHJlbmQgPSAqbWVtX2VuZCA9ICptZW1fZW5kICsgbDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGJvb3R4X3NjYW5fZHRfYnVpbGRfc3RyaW5ncyh1bnNpZ25lZCBsb25nIGJhc2UsCisJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIG5vZGUsCisJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nICptZW1fZW5kKQoreworCXN0cnVjdCBib290eF9kdF9ub2RlICpucCA9IChzdHJ1Y3QgYm9vdHhfZHRfbm9kZSAqKShiYXNlICsgbm9kZSk7CisJdTMyICpjcHAsICpwcHAgPSAmbnAtPnByb3BlcnRpZXM7CisJdW5zaWduZWQgbG9uZyBzb2ZmOworCWNoYXIgKm5hbWVwOworCisJLyogS2VlcCByZWZzIHRvIGtub3duIG5vZGVzICovCisJbmFtZXAgPSBucC0+ZnVsbF9uYW1lID8gKGNoYXIgKikoYmFzZSArIG5wLT5mdWxsX25hbWUpIDogTlVMTDsKKyAgICAgICAJaWYgKG5hbWVwID09IE5VTEwpIHsKKwkJYm9vdHhfcHJpbnRmKCJOb2RlIHdpdGhvdXQgYSBmdWxsIG5hbWUgIVxuIik7CisJCW5hbWVwID0gIiI7CisJfQorCURCRygiKiBzdHJpbmdzOiAlc1xuIiwgbmFtZXApOworCisJaWYgKCFzdHJjbXAobmFtZXAsICIvY2hvc2VuIikpIHsKKwkJREJHKCIgZGV0ZWN0ZWQgL2Nob3NlbiAhIGFkZGluZyBwcm9wZXJ0aWVzIG5hbWVzICFcbiIpOworCQlib290eF9kdF9hZGRfc3RyaW5nKCJsaW51eCxwbGF0Zm9ybSIsIG1lbV9lbmQpOworCQlib290eF9kdF9hZGRfc3RyaW5nKCJsaW51eCxzdGRvdXQtcGF0aCIsIG1lbV9lbmQpOworCQlib290eF9kdF9hZGRfc3RyaW5nKCJsaW51eCxpbml0cmQtc3RhcnQiLCBtZW1fZW5kKTsKKwkJYm9vdHhfZHRfYWRkX3N0cmluZygibGludXgsaW5pdHJkLWVuZCIsIG1lbV9lbmQpOworCQlib290eF9kdF9hZGRfc3RyaW5nKCJib290YXJncyIsIG1lbV9lbmQpOworCQlib290eF9ub2RlX2Nob3NlbiA9IG5vZGU7CisJfQorCWlmIChub2RlID09IGJvb3R4X2luZm8tPmRpc3BEZXZpY2VSZWdFbnRyeU9mZnNldCkgeworCQlEQkcoIiBkZXRlY3RlZCBkaXNwbGF5ICEgYWRkaW5nIHByb3BlcnRpZXMgbmFtZXMgIVxuIik7CisJCWJvb3R4X2R0X2FkZF9zdHJpbmcoImxpbnV4LGJvb3QtZGlzcGxheSIsIG1lbV9lbmQpOworCQlib290eF9kdF9hZGRfc3RyaW5nKCJsaW51eCxvcGVuZWQiLCBtZW1fZW5kKTsKKwkJc3RybmNweShib290eF9kaXNwX3BhdGgsIG5hbWVwLCAyNTUpOworCX0KKworCS8qIGdldCBhbmQgc3RvcmUgYWxsIHByb3BlcnR5IG5hbWVzICovCisJd2hpbGUgKCpwcHApIHsKKwkJc3RydWN0IGJvb3R4X2R0X3Byb3AgKnBwID0KKwkJCShzdHJ1Y3QgYm9vdHhfZHRfcHJvcCAqKShiYXNlICsgKnBwcCk7CisKKwkJbmFtZXAgPSBwcC0+bmFtZSA/IChjaGFyICopKGJhc2UgKyBwcC0+bmFtZSkgOiBOVUxMOworIAkJaWYgKG5hbWVwID09IE5VTEwgfHwgc3RyY21wKG5hbWVwLCAibmFtZSIpID09IDApCisgCQkJZ290byBuZXh0OworCQkvKiBnZXQvY3JlYXRlIHN0cmluZyBlbnRyeSAqLworCQlzb2ZmID0gYm9vdHhfZHRfZmluZF9zdHJpbmcobmFtZXApOworCQlpZiAoc29mZiA9PSAwKQorCQkJYm9vdHhfZHRfYWRkX3N0cmluZyhuYW1lcCwgbWVtX2VuZCk7CisJbmV4dDoKKwkJcHBwID0gJnBwLT5uZXh0OworCX0KKworCS8qIGRvIGFsbCBvdXIgY2hpbGRyZW4gKi8KKwljcHAgPSAmbnAtPmNoaWxkOworCXdoaWxlKCpjcHApIHsKKwkJbnAgPSAoc3RydWN0IGJvb3R4X2R0X25vZGUgKikoYmFzZSArICpjcHApOworCQlib290eF9zY2FuX2R0X2J1aWxkX3N0cmluZ3MoYmFzZSwgKmNwcCwgbWVtX2VuZCk7CisJCWNwcCA9ICZucC0+c2libGluZzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBib290eF9zY2FuX2R0X2J1aWxkX3N0cnVjdCh1bnNpZ25lZCBsb25nIGJhc2UsCisJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbm9kZSwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyAqbWVtX2VuZCkKK3sKKwlzdHJ1Y3QgYm9vdHhfZHRfbm9kZSAqbnAgPSAoc3RydWN0IGJvb3R4X2R0X25vZGUgKikoYmFzZSArIG5vZGUpOworCXUzMiAqY3BwLCAqcHBwID0gJm5wLT5wcm9wZXJ0aWVzOworCWNoYXIgKm5hbWVwLCAqcCwgKmVwLCAqbHA7CisJaW50IGw7CisKKwlkdF9wdXNoX3Rva2VuKE9GX0RUX0JFR0lOX05PREUsIG1lbV9lbmQpOworCisJLyogZ2V0IHRoZSBub2RlJ3MgZnVsbCBuYW1lICovCisJbmFtZXAgPSBucC0+ZnVsbF9uYW1lID8gKGNoYXIgKikoYmFzZSArIG5wLT5mdWxsX25hbWUpIDogTlVMTDsKKwlpZiAobmFtZXAgPT0gTlVMTCkKKwkJbmFtZXAgPSAiIjsKKwlsID0gc3RybGVuKG5hbWVwKTsKKworCURCRygiKiBzdHJ1Y3Q6ICVzXG4iLCBuYW1lcCk7CisKKwkvKiBGaXh1cCBhbiBBcHBsZSBidWcgd2hlcmUgdGhleSBoYXZlIGJvZ3VzIFwwIGNoYXJzIGluIHRoZQorCSAqIG1pZGRsZSBvZiB0aGUgcGF0aCBpbiBzb21lIHByb3BlcnRpZXMsIGFuZCBleHRyYWN0CisJICogdGhlIHVuaXQgbmFtZSAoZXZlcnl0aGluZyBhZnRlciB0aGUgbGFzdCAnLycpLgorCSAqLworCW1lbWNweSgodm9pZCAqKSptZW1fZW5kLCBuYW1lcCwgbCArIDEpOworCW5hbWVwID0gKGNoYXIgKikqbWVtX2VuZDsKKwlmb3IgKGxwID0gcCA9IG5hbWVwLCBlcCA9IG5hbWVwICsgbDsgcCA8IGVwOyBwKyspIHsKKwkJaWYgKCpwID09ICcvJykKKwkJCWxwID0gbmFtZXA7CisJCWVsc2UgaWYgKCpwICE9IDApCisJCQkqbHArKyA9ICpwOworCX0KKwkqbHAgPSAwOworCSptZW1fZW5kID0gX0FMSUdOX1VQKCh1bnNpZ25lZCBsb25nKWxwICsgMSwgNCk7CisKKwkvKiBnZXQgYW5kIHN0b3JlIGFsbCBwcm9wZXJ0aWVzICovCisJd2hpbGUgKCpwcHApIHsKKwkJc3RydWN0IGJvb3R4X2R0X3Byb3AgKnBwID0KKwkJCShzdHJ1Y3QgYm9vdHhfZHRfcHJvcCAqKShiYXNlICsgKnBwcCk7CisKKwkJbmFtZXAgPSBwcC0+bmFtZSA/IChjaGFyICopKGJhc2UgKyBwcC0+bmFtZSkgOiBOVUxMOworCQkvKiBTa2lwICJuYW1lIiAqLworIAkJaWYgKG5hbWVwID09IE5VTEwgfHwgIXN0cmNtcChuYW1lcCwgIm5hbWUiKSkKKyAJCQlnb3RvIG5leHQ7CisJCS8qIFNraXAgImJvb3RhcmdzIiBpbiAvY2hvc2VuIHRvbyBhcyB3ZSByZXBsYWNlIGl0ICovCisJCWlmIChub2RlID09IGJvb3R4X25vZGVfY2hvc2VuICYmICFzdHJjbXAobmFtZXAsICJib290YXJncyIpKQorCQkJZ290byBuZXh0OworCisJCS8qIHB1c2ggcHJvcGVydHkgaGVhZCAqLworCQlib290eF9kdF9hZGRfcHJvcChuYW1lcCwKKwkJCQkgIHBwLT52YWx1ZSA/ICh2b2lkICopKGJhc2UgKyBwcC0+dmFsdWUpOiBOVUxMLAorCQkJCSAgcHAtPmxlbmd0aCwgbWVtX2VuZCk7CisJbmV4dDoKKwkJcHBwID0gJnBwLT5uZXh0OworCX0KKworCWlmIChub2RlID09IGJvb3R4X25vZGVfY2hvc2VuKQorCQlib290eF9hZGRfY2hvc2VuX3Byb3BzKGJhc2UsIG1lbV9lbmQpOworCWlmIChub2RlID09IGJvb3R4X2luZm8tPmRpc3BEZXZpY2VSZWdFbnRyeU9mZnNldCkKKwkJYm9vdHhfYWRkX2Rpc3BsYXlfcHJvcHMoYmFzZSwgbWVtX2VuZCk7CisKKwkvKiBkbyBhbGwgb3VyIGNoaWxkcmVuICovCisJY3BwID0gJm5wLT5jaGlsZDsKKwl3aGlsZSgqY3BwKSB7CisJCW5wID0gKHN0cnVjdCBib290eF9kdF9ub2RlICopKGJhc2UgKyAqY3BwKTsKKwkJYm9vdHhfc2Nhbl9kdF9idWlsZF9zdHJ1Y3QoYmFzZSwgKmNwcCwgbWVtX2VuZCk7CisJCWNwcCA9ICZucC0+c2libGluZzsKKwl9CisKKwlkdF9wdXNoX3Rva2VuKE9GX0RUX0VORF9OT0RFLCBtZW1fZW5kKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGJvb3R4X2ZsYXR0ZW5fZHQodW5zaWduZWQgbG9uZyBzdGFydCkKK3sKKwlib290X2luZm9zX3QgKmJpID0gYm9vdHhfaW5mbzsKKwl1bnNpZ25lZCBsb25nIG1lbV9zdGFydCwgbWVtX2VuZDsKKwlzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKmhkcjsKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisJdTY0ICpyc3ZtYXA7CisKKwkvKiBTdGFydCB1c2luZyBtZW1vcnkgYWZ0ZXIgdGhlIGJpZyBibG9iIHBhc3NlZCBieSBCb290WCwgZ2V0CisJICogc29tZSBzcGFjZSBmb3IgdGhlIGhlYWRlcgorCSAqLworCW1lbV9zdGFydCA9IG1lbV9lbmQgPSBfQUxJR05fVVAoKCh1bnNpZ25lZCBsb25nKWJpKSArIHN0YXJ0LCA0KTsKKwlEQkcoIkJvb3QgcGFyYW1zIGhlYWRlciBhdDogJXhcbiIsIG1lbV9zdGFydCk7CisJaGRyID0gKHN0cnVjdCBib290X3BhcmFtX2hlYWRlciAqKW1lbV9zdGFydDsKKwltZW1fZW5kICs9IHNpemVvZihzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIpOworCXJzdm1hcCA9ICh1NjQgKikoX0FMSUdOX1VQKG1lbV9lbmQsIDgpKTsKKwloZHItPm9mZl9tZW1fcnN2bWFwID0gKCh1bnNpZ25lZCBsb25nKXJzdm1hcCkgLSBtZW1fc3RhcnQ7CisJbWVtX2VuZCA9ICgodW5zaWduZWQgbG9uZylyc3ZtYXApICsgOCAqIHNpemVvZih1NjQpOworCisJLyogR2V0IGJhc2Ugb2YgdHJlZSAqLworCWJhc2UgPSAoKHVuc2lnbmVkIGxvbmcpYmkpICsgYmktPmRldmljZVRyZWVPZmZzZXQ7CisKKwkvKiBCdWlsZCBzdHJpbmcgYXJyYXkgKi8KKwlEQkcoIkJ1aWxkaW5nIHN0cmluZyBhcnJheSBhdDogJXhcbiIsIG1lbV9lbmQpOworCURCRygiRGV2aWNlIFRyZWUgQmFzZT0leFxuIiwgYmFzZSk7CisJYm9vdHhfZHRfc3RyYmFzZSA9IG1lbV9lbmQ7CisJbWVtX2VuZCArPSA0OworCWJvb3R4X2R0X3N0cmVuZCA9IG1lbV9lbmQ7CisJYm9vdHhfc2Nhbl9kdF9idWlsZF9zdHJpbmdzKGJhc2UsIDQsICZtZW1fZW5kKTsKKwloZHItPm9mZl9kdF9zdHJpbmdzID0gYm9vdHhfZHRfc3RyYmFzZSAtIG1lbV9zdGFydDsKKwloZHItPmR0X3N0cmluZ3Nfc2l6ZSA9IGJvb3R4X2R0X3N0cmVuZCAtIGJvb3R4X2R0X3N0cmJhc2U7CisKKwkvKiBCdWlsZCBzdHJ1Y3R1cmUgKi8KKwltZW1fZW5kID0gX0FMSUdOKG1lbV9lbmQsIDE2KTsKKwlEQkcoIkJ1aWxkaW5nIGRldmljZSB0cmVlIHN0cnVjdHVyZSBhdDogJXhcbiIsIG1lbV9lbmQpOworCWhkci0+b2ZmX2R0X3N0cnVjdCA9IG1lbV9lbmQgLSBtZW1fc3RhcnQ7CisJYm9vdHhfc2Nhbl9kdF9idWlsZF9zdHJ1Y3QoYmFzZSwgNCwgJm1lbV9lbmQpOworCWR0X3B1c2hfdG9rZW4oT0ZfRFRfRU5ELCAmbWVtX2VuZCk7CisKKwkvKiBGaW5pc2ggaGVhZGVyICovCisJaGRyLT5ib290X2NwdWlkX3BoeXMgPSAwOworCWhkci0+bWFnaWMgPSBPRl9EVF9IRUFERVI7CisJaGRyLT50b3RhbHNpemUgPSBtZW1fZW5kIC0gbWVtX3N0YXJ0OworCWhkci0+dmVyc2lvbiA9IE9GX0RUX1ZFUlNJT047CisJLyogVmVyc2lvbiAxNiBpcyBub3QgYmFja3dhcmQgY29tcGF0aWJsZSAqLworCWhkci0+bGFzdF9jb21wX3ZlcnNpb24gPSAweDEwOworCisJLyogUmVzZXJ2ZSB0aGUgd2hvbGUgdGhpbmcgYW5kIGNvcHkgdGhlIHJlc2VydmUgbWFwIGluLCB3ZQorCSAqIGFsc28gYnVtcCBtZW1fcmVzZXJ2ZV9jbnQgdG8gY2F1c2UgZnVydGhlciByZXNlcnZhdGlvbnMgdG8KKwkgKiBmYWlsIHNpbmNlIGl0J3MgdG9vIGxhdGUuCisJICovCisJbWVtX2VuZCA9IF9BTElHTihtZW1fZW5kLCBQQUdFX1NJWkUpOworCURCRygiRW5kIG9mIGJvb3QgcGFyYW1zOiAleFxuIiwgbWVtX2VuZCk7CisJcnN2bWFwWzBdID0gbWVtX3N0YXJ0OworCXJzdm1hcFsxXSA9IG1lbV9lbmQ7CisJcnN2bWFwWzJdID0gMDsKKwlyc3ZtYXBbM10gPSAwOworCisJcmV0dXJuICh1bnNpZ25lZCBsb25nKWhkcjsKK30KKworCisjaWZkZWYgQ09ORklHX0JPT1RYX1RFWFQKK3N0YXRpYyB2b2lkIF9faW5pdCBidGV4dF93ZWxjb21lKGJvb3RfaW5mb3NfdCAqYmkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHB2cjsKKworCWJvb3R4X3ByaW50ZigiV2VsY29tZSB0byBMaW51eCwga2VybmVsICIgVVRTX1JFTEVBU0UgIlxuIik7CisJYm9vdHhfcHJpbnRmKCJcbmxpbmtlZCBhdCAgICAgICAgOiAweCV4IiwgS0VSTkVMQkFTRSk7CisJYm9vdHhfcHJpbnRmKCJcbmZyYW1lIGJ1ZmZlciBhdCAgOiAweCV4IiwgYmktPmRpc3BEZXZpY2VCYXNlKTsKKwlib290eF9wcmludGYoIiAocGh5cyksIDB4JXgiLCBiaS0+bG9naWNhbERpc3BsYXlCYXNlKTsKKwlib290eF9wcmludGYoIiAobG9nKSIpOworCWJvb3R4X3ByaW50ZigiXG5rbGltaXQgICAgICAgICAgIDogMHgleCIsKHVuc2lnbmVkIGxvbmcpa2xpbWl0KTsKKwlib290eF9wcmludGYoIlxuYm9vdF9pbmZvIGF0ICAgICA6IDB4JXgiLCBiaSk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtZm1zciAlMCIgOiAiPXIiIChmbGFncykpOworCWJvb3R4X3ByaW50ZigiXG5NU1IgICAgICAgICAgICAgIDogMHgleCIsIGZsYWdzKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1mc3ByICUwLCAyODciIDogIj1yIiAocHZyKSk7CisJYm9vdHhfcHJpbnRmKCJcblBWUiAgICAgICAgICAgICAgOiAweCV4IiwgcHZyKTsKKwlwdnIgPj49IDE2OworCWlmIChwdnIgPiAxKSB7CisJICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgibWZzcHIgJTAsIDEwMDgiIDogIj1yIiAoZmxhZ3MpKTsKKwkgICAgYm9vdHhfcHJpbnRmKCJcbkhJRDAgICAgICAgICAgICAgOiAweCV4IiwgZmxhZ3MpOworCX0KKwlpZiAocHZyID09IDggfHwgcHZyID09IDEyIHx8IHB2ciA9PSAweDgwMGMpIHsKKwkgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtZnNwciAlMCwgMTAxOSIgOiAiPXIiIChmbGFncykpOworCSAgICBib290eF9wcmludGYoIlxuSUNUQyAgICAgICAgICAgICA6IDB4JXgiLCBmbGFncyk7CisJfQorI2lmZGVmIERFQlVHCisJYm9vdHhfcHJpbnRmKCJcblxuIik7CisJYm9vdHhfcHJpbnRmKCJiaS0+ZGV2aWNlVHJlZU9mZnNldCAgIDogMHgleFxuIiwKKwkJICAgICBiaS0+ZGV2aWNlVHJlZU9mZnNldCk7CisJYm9vdHhfcHJpbnRmKCJiaS0+ZGV2aWNlVHJlZVNpemUgICAgIDogMHgleFxuIiwKKwkJICAgICBiaS0+ZGV2aWNlVHJlZVNpemUpOworI2VuZGlmCisJYm9vdHhfcHJpbnRmKCJcblxuIik7Cit9CisjZW5kaWYgLyogQ09ORklHX0JPT1RYX1RFWFQgKi8KKwordm9pZCBfX2luaXQgYm9vdHhfaW5pdCh1bnNpZ25lZCBsb25nIHIzLCB1bnNpZ25lZCBsb25nIHI0KQoreworCWJvb3RfaW5mb3NfdCAqYmkgPSAoYm9vdF9pbmZvc190ICopIHI0OworCXVuc2lnbmVkIGxvbmcgaGRyOworCXVuc2lnbmVkIGxvbmcgc3BhY2U7CisJdW5zaWduZWQgbG9uZyBwdHIsIHg7CisJY2hhciAqbW9kZWw7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSByZWxvY19vZmZzZXQoKTsKKworCXJlbG9jX2dvdDIob2Zmc2V0KTsKKworCWJvb3R4X2luZm8gPSBiaTsKKworCS8qIFdlIGhhdmVuJ3QgY2xlYXJlZCBhbnkgYnNzIGF0IHRoaXMgcG9pbnQsIG1ha2Ugc3VyZQorCSAqIHdoYXQgd2UgbmVlZCBpcyBpbml0aWFsaXplZAorCSAqLworCWJvb3R4X2R0X3N0cmJhc2UgPSBib290eF9kdF9zdHJlbmQgPSAwOworCWJvb3R4X25vZGVfY2hvc2VuID0gMDsKKwlib290eF9kaXNwX3BhdGhbMF0gPSAwOworCisJaWYgKCFCT09UX0lORk9fSVNfVjJfQ09NUEFUSUJMRShiaSkpCisJCWJpLT5sb2dpY2FsRGlzcGxheUJhc2UgPSBiaS0+ZGlzcERldmljZUJhc2U7CisKKyNpZmRlZiBDT05GSUdfQk9PVFhfVEVYVAorCWJ0ZXh0X3NldHVwX2Rpc3BsYXkoYmktPmRpc3BEZXZpY2VSZWN0WzJdIC0gYmktPmRpc3BEZXZpY2VSZWN0WzBdLAorCQkJICAgIGJpLT5kaXNwRGV2aWNlUmVjdFszXSAtIGJpLT5kaXNwRGV2aWNlUmVjdFsxXSwKKwkJCSAgICBiaS0+ZGlzcERldmljZURlcHRoLCBiaS0+ZGlzcERldmljZVJvd0J5dGVzLAorCQkJICAgICh1bnNpZ25lZCBsb25nKWJpLT5sb2dpY2FsRGlzcGxheUJhc2UpOworCWJ0ZXh0X2NsZWFyc2NyZWVuKCk7CisJYnRleHRfZmx1c2hzY3JlZW4oKTsKKyNlbmRpZiAvKiBDT05GSUdfQk9PVFhfVEVYVCAqLworCisJLyoKKwkgKiBUZXN0IGlmIGJvb3QtaW5mbyBpcyBjb21wYXRpYmxlLiAgRG9uZSBvbmx5IGluIGNvbmZpZworCSAqIENPTkZJR19CT09UWF9URVhUIHNpbmNlIHRoZXJlIGlzIG5vdGhpbmcgbXVjaCB3ZSBjYW4gZG8KKwkgKiB3aXRoIGFuIGluY29tcGF0aWJsZSB2ZXJzaW9uLCBleGNlcHQgZGlzcGxheSBhIG1lc3NhZ2UKKwkgKiBhbmQgZXZlbnR1YWxseSBoYW5nIHRoZSBwcm9jZXNzb3IuLi4KKwkgKgorCSAqIEknbGwgdHJ5IHRvIGtlZXAgZW5vdWdoIG9mIGJvb3QtaW5mbyBjb21wYXRpYmxlIGluIHRoZQorCSAqIGZ1dHVyZSB0byBhbHdheXMgYWxsb3cgZGlzcGxheSBvZiB0aGlzIG1lc3NhZ2U7CisJICovCisJaWYgKCFCT09UX0lORk9fSVNfQ09NUEFUSUJMRShiaSkpIHsKKwkJYm9vdHhfcHJpbnRmKCIgISEhIFdBUk5JTkcgLSBJbmNvbXBhdGlibGUgdmVyc2lvbiIKKwkJCSAgICAgIiBvZiBCb290WCAhISFcblxuXG4iKTsKKwkJZm9yICg7OykKKwkJCTsKKwl9CisJaWYgKGJpLT5hcmNoaXRlY3R1cmUgIT0gQk9PVF9BUkNIX1BDSSkgeworCQlib290eF9wcmludGYoIiAhISEgV0FSTklORyAtIFVzdXBwb3J0ZWQgbWFjaGluZSIKKwkJCSAgICAgIiBhcmNoaXRlY3R1cmUgIVxuIik7CisJCWZvciAoOzspCisJCQk7CisJfQorCisjaWZkZWYgQ09ORklHX0JPT1RYX1RFWFQKKwlidGV4dF93ZWxjb21lKGJpKTsKKyNlbmRpZgorCS8qIE5ldyBCb290WCBlbnRlcnMga2VybmVsIHdpdGggTU1VIG9mZiwgaS9vcyBhcmUgbm90IGFsbG93ZWQKKwkgKiBoZXJlLiBUaGlzIGhhY2sgd2lsbCBoYXZlIGJlZW4gZG9uZSBieSB0aGUgYm9vc3RyYXAgYW55d2F5LgorCSAqLworCWlmIChiaS0+dmVyc2lvbiA8IDQpIHsKKwkJLyoKKwkJICogWFhYIElmIHRoaXMgaXMgYW4gaU1hYywgdHVybiBvZmYgdGhlIFVTQiBjb250cm9sbGVyLgorCQkgKi8KKwkJbW9kZWwgPSAoY2hhciAqKSBib290eF9lYXJseV9nZXRwcm9wKHI0ICsgYmktPmRldmljZVRyZWVPZmZzZXQsCisJCQkJCQkgICAgIDQsICJtb2RlbCIpOworCQlpZiAobW9kZWwKKwkJICAgICYmIChzdHJjbXAobW9kZWwsICJpTWFjLDEiKSA9PSAwCisJCQl8fCBzdHJjbXAobW9kZWwsICJQb3dlck1hYzEsMSIpID09IDApKSB7CisJCQlib290eF9wcmludGYoImlNYWMsMSBkZXRlY3RlZCwgc2h1dHRpbmcgZG93biBVU0IgXG4iKTsKKwkJCW91dF9sZTMyKCh1bnNpZ25lZCAqKTB4ODA4ODAwMDgsIDEpOwkvKiBYWFggKi8KKwkJfQorCX0KKworCS8qIEdldCBhIHBvaW50ZXIgdGhhdCBwb2ludHMgYWJvdmUgdGhlIGRldmljZSB0cmVlLCBhcmdzLCByYW1kaXNrLAorCSAqIGV0Yy4uLiB0byB1c2UgZm9yIGdlbmVyYXRpbmcgdGhlIGZsYXR0ZW5lZCB0cmVlCisJICovCisJaWYgKGJpLT52ZXJzaW9uIDwgNSkgeworCQlzcGFjZSA9IGJpLT5kZXZpY2VUcmVlT2Zmc2V0ICsgYmktPmRldmljZVRyZWVTaXplOworCQlpZiAoYmktPnJhbURpc2spCisJCQlzcGFjZSA9IGJpLT5yYW1EaXNrICsgYmktPnJhbURpc2tTaXplOworCX0gZWxzZQorCQlzcGFjZSA9IGJpLT50b3RhbFBhcmFtc1NpemU7CisKKwlib290eF9wcmludGYoIlRvdGFsIHNwYWNlIHVzZWQgYnkgcGFyYW1ldGVycyAmIHJhbWRpc2s6ICV4IFxuIiwgc3BhY2UpOworCisJLyogTmV3IEJvb3RYIHdpbGwgaGF2ZSBmbHVzaGVkIGFsbCBUTEJzIGFuZCBlbnRlcnMga2VybmVsIHdpdGgKKwkgKiBNTVUgc3dpdGNoZWQgT0ZGLCBzbyB0aGlzIHNob3VsZCBub3QgYmUgdXNlZnVsIGFueW1vcmUuCisJICovCisJaWYgKGJpLT52ZXJzaW9uIDwgNCkgeworCQlib290eF9wcmludGYoIlRvdWNoaW5nIHBhZ2VzLi4uXG4iKTsKKworCQkvKgorCQkgKiBUb3VjaCBlYWNoIHBhZ2UgdG8gbWFrZSBzdXJlIHRoZSBQVEVzIGZvciB0aGVtCisJCSAqIGFyZSBpbiB0aGUgaGFzaCB0YWJsZSAtIHRoZSBhaW0gaXMgdG8gdHJ5IHRvIGF2b2lkCisJCSAqIGdldHRpbmcgRFNJIGV4Y2VwdGlvbnMgd2hpbGUgY29weWluZyB0aGUga2VybmVsIGltYWdlLgorCQkgKi8KKwkJZm9yIChwdHIgPSAoKHVuc2lnbmVkIGxvbmcpICZfc3RleHQpICYgUEFHRV9NQVNLOworCQkgICAgIHB0ciA8ICh1bnNpZ25lZCBsb25nKWJpICsgc3BhY2U7IHB0ciArPSBQQUdFX1NJWkUpCisJCQl4ID0gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopcHRyOworCX0KKworCS8qIE9rLCBub3cgd2UgbmVlZCB0byBnZW5lcmF0ZSBhIGZsYXR0ZW5lZCBkZXZpY2UtdHJlZSB0byBwYXNzCisJICogdG8gdGhlIGtlcm5lbAorCSAqLworCWJvb3R4X3ByaW50ZigiUHJlcGFyaW5nIGJvb3QgcGFyYW1zLi4uXG4iKTsKKworCWhkciA9IGJvb3R4X2ZsYXR0ZW5fZHQoc3BhY2UpOworCisjaWZkZWYgQ09ORklHX0JPT1RYX1RFWFQKKyNpZmRlZiBTRVRfQk9PVF9CQVQKKwlib290eF9wcmludGYoIlByZXBhcmluZyBCQVQuLi5cbiIpOworCWJ0ZXh0X3ByZXBhcmVfQkFUKCk7CisjZWxzZQorCWJ0ZXh0X3VubWFwKCk7CisjZW5kaWYKKyNlbmRpZgorCisJcmVsb2NfZ290Migtb2Zmc2V0KTsKKworCV9fc3RhcnQoaGRyLCBLRVJORUxCQVNFICsgb2Zmc2V0LCAwKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvY3B1ZnJlcV82NC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9jcHVmcmVxXzY0LmMKaW5kZXggMzkxNTAzNC4uYTQxNWU4ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9jcHVmcmVxXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9jcHVmcmVxXzY0LmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS9zbXUuaD4KKyNpbmNsdWRlIDxhc20vcG1hY19wZnVuYy5oPgogCiAjdW5kZWYgREVCVUcKIApAQCAtNzksMTIgKzgwLDE2IEBACiB9OwogCiAvKiBQb3dlciBtb2RlIGRhdGEgaXMgYW4gYXJyYXkgb2YgdGhlIDMyIGJpdHMgUENSIHZhbHVlcyB0byB1c2UgZm9yCi0gKiB0aGUgdmFyaW91cyBmcmVxdWVuY2llcywgcmV0cmVpdmVkIGZyb20gdGhlIGRldmljZS10cmVlCisgKiB0aGUgdmFyaW91cyBmcmVxdWVuY2llcywgcmV0cmlldmVkIGZyb20gdGhlIGRldmljZS10cmVlCiAgKi8KIHN0YXRpYyB1MzIgKmc1X3Btb2RlX2RhdGE7CiBzdGF0aWMgaW50IGc1X3Btb2RlX21heDsKIHN0YXRpYyBpbnQgZzVfcG1vZGVfY3VyOwogCitzdGF0aWMgdm9pZCAoKmc1X3N3aXRjaF92b2x0KShpbnQgc3BlZWRfbW9kZSk7CitzdGF0aWMgaW50ICgqZzVfc3dpdGNoX2ZyZXEpKGludCBzcGVlZF9tb2RlKTsKK3N0YXRpYyBpbnQgKCpnNV9xdWVyeV9mcmVxKSh2b2lkKTsKKwogc3RhdGljIERFQ0xBUkVfTVVURVgoZzVfc3dpdGNoX211dGV4KTsKIAogCkBAIC05Miw5ICs5NywxMSBAQAogc3RhdGljIGludCBnNV9mdnRfY291bnQ7CQkJLyogbnVtYmVyIG9mIG9wLiBwb2ludHMgKi8KIHN0YXRpYyBpbnQgZzVfZnZ0X2N1cjsJCQkJLyogY3VycmVudCBvcC4gcG9pbnQgKi8KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0gcmVhbCBoYXJkd2FyZSBpbnRlcmZhY2UgKi8KKy8qCisgKiBTTVUgYmFzZWQgdm9sdGFnZSBzd2l0Y2hpbmcgZm9yIE5lbzIgcGxhdGZvcm1zCisgKi8KIAotc3RhdGljIHZvaWQgZzVfc3dpdGNoX3ZvbHQoaW50IHNwZWVkX21vZGUpCitzdGF0aWMgdm9pZCBnNV9zbXVfc3dpdGNoX3ZvbHQoaW50IHNwZWVkX21vZGUpCiB7CiAJc3RydWN0IHNtdV9zaW1wbGVfY21kCWNtZDsKIApAQCAtMTA1LDI2ICsxMTIsNTcgQEAKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wKTsKIH0KIAotc3RhdGljIGludCBnNV9zd2l0Y2hfZnJlcShpbnQgc3BlZWRfbW9kZSkKKy8qCisgKiBQbGF0Zm9ybSBmdW5jdGlvbiBiYXNlZCB2b2x0YWdlL3ZkbmFwIHN3aXRjaGluZyBmb3IgTmVvMgorICovCisKK3N0YXRpYyBzdHJ1Y3QgcG1mX2Z1bmN0aW9uICpwZnVuY19zZXRfdmRuYXAwOworc3RhdGljIHN0cnVjdCBwbWZfZnVuY3Rpb24gKnBmdW5jX3ZkbmFwMF9jb21wbGV0ZTsKKworc3RhdGljIHZvaWQgZzVfdmRuYXBfc3dpdGNoX3ZvbHQoaW50IHNwZWVkX21vZGUpCiB7Ci0Jc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CisJc3RydWN0IHBtZl9hcmdzIGFyZ3M7CisJdTMyIHNsZXcsIGRvbmUgPSAwOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCXNsZXcgPSAoc3BlZWRfbW9kZSA9PSBDUFVGUkVRX0xPVykgPyAxIDogMDsKKwlhcmdzLmNvdW50ID0gMTsKKwlhcmdzLnVbMF0ucCA9ICZzbGV3OworCisJcG1mX2NhbGxfb25lKHBmdW5jX3NldF92ZG5hcDAsICZhcmdzKTsKKworCS8qIEl0J3MgYW4gaXJxIEdQSU8gc28gd2Ugc2hvdWxkIGJlIGFibGUgdG8ganVzdCBibG9jayBoZXJlLAorCSAqIEknbGwgZG8gdGhhdCBsYXRlciBhZnRlciBJJ3ZlIHByb3Blcmx5IHRlc3RlZCB0aGUgSVJRIGNvZGUgZm9yCisJICogcGxhdGZvcm0gZnVuY3Rpb25zCisJICovCisJdGltZW91dCA9IGppZmZpZXMgKyBIWi8xMDsKKwl3aGlsZSghdGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlhcmdzLmNvdW50ID0gMTsKKwkJYXJncy51WzBdLnAgPSAmZG9uZTsKKwkJcG1mX2NhbGxfb25lKHBmdW5jX3ZkbmFwMF9jb21wbGV0ZSwgJmFyZ3MpOworCQlpZiAoZG9uZSkKKwkJCWJyZWFrOworCQltc2xlZXAoMSk7CisJfQorCWlmIChkb25lID09IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNwdWZyZXE6IFRpbWVvdXQgaW4gY2xvY2sgc2xld2luZyAhXG4iKTsKK30KKworCisvKgorICogU0NPTSBiYXNlZCBmcmVxdWVuY3kgc3dpdGNoaW5nIGZvciA5NzBGWCByZXYzCisgKi8KK3N0YXRpYyBpbnQgZzVfc2NvbV9zd2l0Y2hfZnJlcShpbnQgc3BlZWRfbW9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCB0bzsKIAotCWlmIChnNV9wbW9kZV9jdXIgPT0gc3BlZWRfbW9kZSkKLQkJcmV0dXJuIDA7Ci0KLQlkb3duKCZnNV9zd2l0Y2hfbXV0ZXgpOwotCi0JZnJlcXMub2xkID0gZzVfY3B1X2ZyZXFzW2c1X3Btb2RlX2N1cl0uZnJlcXVlbmN5OwotCWZyZXFzLm5ldyA9IGc1X2NwdV9mcmVxc1tzcGVlZF9tb2RlXS5mcmVxdWVuY3k7Ci0JZnJlcXMuY3B1ID0gMDsKLQotCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7Ci0KIAkvKiBJZiBmcmVxdWVuY3kgaXMgZ29pbmcgdXAsIGZpcnN0IHJhbXAgdXAgdGhlIHZvbHRhZ2UgKi8KIAlpZiAoc3BlZWRfbW9kZSA8IGc1X3Btb2RlX2N1cikKIAkJZzVfc3dpdGNoX3ZvbHQoc3BlZWRfbW9kZSk7CiAKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKIAkvKiBDbGVhciBQQ1IgaGlnaCAqLwogCXNjb205NzBfd3JpdGUoU0NPTV9QQ1IsIDApOwogCS8qIENsZWFyIFBDUiBsb3cgKi8KQEAgLTE0Nyw2ICsxODUsOCBAQAogCQl1ZGVsYXkoMTAwKTsKIAl9CiAKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKIAkvKiBJZiBmcmVxdWVuY3kgaXMgZ29pbmcgZG93biwgbGFzdCByYW1wIHRoZSB2b2x0YWdlICovCiAJaWYgKHNwZWVkX21vZGUgPiBnNV9wbW9kZV9jdXIpCiAJCWc1X3N3aXRjaF92b2x0KHNwZWVkX21vZGUpOwpAQCAtMTU0LDE0ICsxOTQsMTAgQEAKIAlnNV9wbW9kZV9jdXIgPSBzcGVlZF9tb2RlOwogCXBwY19wcm9jX2ZyZXEgPSBnNV9jcHVfZnJlcXNbc3BlZWRfbW9kZV0uZnJlcXVlbmN5ICogMTAwMHVsOwogCi0JY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7Ci0KLQl1cCgmZzVfc3dpdGNoX211dGV4KTsKLQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGc1X3F1ZXJ5X2ZyZXEodm9pZCkKK3N0YXRpYyBpbnQgZzVfc2NvbV9xdWVyeV9mcmVxKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBwc3IgPSBzY29tOTcwX3JlYWQoU0NPTV9QU1IpOwogCWludCBpOwpAQCAtMTczLDcgKzIwOSwxMDQgQEAKIAlyZXR1cm4gaTsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0gY3B1ZnJlcSBib29ra2VlcGluZyAqLworLyoKKyAqIFBsYXRmb3JtIGZ1bmN0aW9uIGJhc2VkIHZvbHRhZ2Ugc3dpdGNoaW5nIGZvciBQb3dlck1hYzcsMiAmIDcsMworICovCisKK3N0YXRpYyBzdHJ1Y3QgcG1mX2Z1bmN0aW9uICpwZnVuY19jcHUwX3ZvbHRfaGlnaDsKK3N0YXRpYyBzdHJ1Y3QgcG1mX2Z1bmN0aW9uICpwZnVuY19jcHUwX3ZvbHRfbG93Oworc3RhdGljIHN0cnVjdCBwbWZfZnVuY3Rpb24gKnBmdW5jX2NwdTFfdm9sdF9oaWdoOworc3RhdGljIHN0cnVjdCBwbWZfZnVuY3Rpb24gKnBmdW5jX2NwdTFfdm9sdF9sb3c7CisKK3N0YXRpYyB2b2lkIGc1X3BmdW5jX3N3aXRjaF92b2x0KGludCBzcGVlZF9tb2RlKQoreworCWlmIChzcGVlZF9tb2RlID09IENQVUZSRVFfSElHSCkgeworCQlpZiAocGZ1bmNfY3B1MF92b2x0X2hpZ2gpCisJCQlwbWZfY2FsbF9vbmUocGZ1bmNfY3B1MF92b2x0X2hpZ2gsIE5VTEwpOworCQlpZiAocGZ1bmNfY3B1MV92b2x0X2hpZ2gpCisJCQlwbWZfY2FsbF9vbmUocGZ1bmNfY3B1MV92b2x0X2hpZ2gsIE5VTEwpOworCX0gZWxzZSB7CisJCWlmIChwZnVuY19jcHUwX3ZvbHRfbG93KQorCQkJcG1mX2NhbGxfb25lKHBmdW5jX2NwdTBfdm9sdF9sb3csIE5VTEwpOworCQlpZiAocGZ1bmNfY3B1MV92b2x0X2xvdykKKwkJCXBtZl9jYWxsX29uZShwZnVuY19jcHUxX3ZvbHRfbG93LCBOVUxMKTsKKwl9CisJbXNsZWVwKDEwKTsgLyogc2hvdWxkIGJlIGZhc3RlciAsIHRvIGZpeCAqLworfQorCisvKgorICogUGxhdGZvcm0gZnVuY3Rpb24gYmFzZWQgZnJlcXVlbmN5IHN3aXRjaGluZyBmb3IgUG93ZXJNYWM3LDIgJiA3LDMKKyAqLworCitzdGF0aWMgc3RydWN0IHBtZl9mdW5jdGlvbiAqcGZ1bmNfY3B1X3NldGZyZXFfaGlnaDsKK3N0YXRpYyBzdHJ1Y3QgcG1mX2Z1bmN0aW9uICpwZnVuY19jcHVfc2V0ZnJlcV9sb3c7CitzdGF0aWMgc3RydWN0IHBtZl9mdW5jdGlvbiAqcGZ1bmNfY3B1X2dldGZyZXE7CitzdGF0aWMgc3RydWN0IHBtZl9mdW5jdGlvbiAqcGZ1bmNfc2xld2luZ19kb25lOzsKKworc3RhdGljIGludCBnNV9wZnVuY19zd2l0Y2hfZnJlcShpbnQgc3BlZWRfbW9kZSkKK3sKKwlzdHJ1Y3QgcG1mX2FyZ3MgYXJnczsKKwl1MzIgZG9uZSA9IDA7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJLyogSWYgZnJlcXVlbmN5IGlzIGdvaW5nIHVwLCBmaXJzdCByYW1wIHVwIHRoZSB2b2x0YWdlICovCisJaWYgKHNwZWVkX21vZGUgPCBnNV9wbW9kZV9jdXIpCisJCWc1X3N3aXRjaF92b2x0KHNwZWVkX21vZGUpOworCisJLyogRG8gaXQgKi8KKwlpZiAoc3BlZWRfbW9kZSA9PSBDUFVGUkVRX0hJR0gpCisJCXBtZl9jYWxsX29uZShwZnVuY19jcHVfc2V0ZnJlcV9oaWdoLCBOVUxMKTsKKwllbHNlCisJCXBtZl9jYWxsX29uZShwZnVuY19jcHVfc2V0ZnJlcV9sb3csIE5VTEwpOworCisJLyogSXQncyBhbiBpcnEgR1BJTyBzbyB3ZSBzaG91bGQgYmUgYWJsZSB0byBqdXN0IGJsb2NrIGhlcmUsCisJICogSSdsbCBkbyB0aGF0IGxhdGVyIGFmdGVyIEkndmUgcHJvcGVybHkgdGVzdGVkIHRoZSBJUlEgY29kZSBmb3IKKwkgKiBwbGF0Zm9ybSBmdW5jdGlvbnMKKwkgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIEhaLzEwOworCXdoaWxlKCF0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCWFyZ3MuY291bnQgPSAxOworCQlhcmdzLnVbMF0ucCA9ICZkb25lOworCQlwbWZfY2FsbF9vbmUocGZ1bmNfc2xld2luZ19kb25lLCAmYXJncyk7CisJCWlmIChkb25lKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxKTsKKwl9CisJaWYgKGRvbmUgPT0gMCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY3B1ZnJlcTogVGltZW91dCBpbiBjbG9jayBzbGV3aW5nICFcbiIpOworCisJLyogSWYgZnJlcXVlbmN5IGlzIGdvaW5nIGRvd24sIGxhc3QgcmFtcCB0aGUgdm9sdGFnZSAqLworCWlmIChzcGVlZF9tb2RlID4gZzVfcG1vZGVfY3VyKQorCQlnNV9zd2l0Y2hfdm9sdChzcGVlZF9tb2RlKTsKKworCWc1X3Btb2RlX2N1ciA9IHNwZWVkX21vZGU7CisJcHBjX3Byb2NfZnJlcSA9IGc1X2NwdV9mcmVxc1tzcGVlZF9tb2RlXS5mcmVxdWVuY3kgKiAxMDAwdWw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnNV9wZnVuY19xdWVyeV9mcmVxKHZvaWQpCit7CisJc3RydWN0IHBtZl9hcmdzIGFyZ3M7CisJdTMyIHZhbCA9IDA7CisKKwlhcmdzLmNvdW50ID0gMTsKKwlhcmdzLnVbMF0ucCA9ICZ2YWw7CisJcG1mX2NhbGxfb25lKHBmdW5jX2NwdV9nZXRmcmVxLCAmYXJncyk7CisJcmV0dXJuIHZhbCA/IENQVUZSRVFfSElHSCA6IENQVUZSRVFfTE9XOworfQorCisvKgorICogRmFrZSB2b2x0YWdlIHN3aXRjaGluZyBmb3IgcGxhdGZvcm1zIHdpdGggbWlzc2luZyBzdXBwb3J0CisgKi8KKworc3RhdGljIHZvaWQgZzVfZHVtbXlfc3dpdGNoX3ZvbHQoaW50IHNwZWVkX21vZGUpCit7Cit9CisKKy8qCisgKiBDb21tb24gaW50ZXJmYWNlIHRvIHRoZSBjcHVmcmVxIGNvcmUKKyAqLwogCiBzdGF0aWMgaW50IGc1X2NwdWZyZXFfdmVyaWZ5KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQogewpAQCAtMTgzLDEzICszMTYsMzAgQEAKIHN0YXRpYyBpbnQgZzVfY3B1ZnJlcV90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCiAJdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLCB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCiB7Ci0JdW5zaWduZWQgaW50ICAgIG5ld3N0YXRlID0gMDsKKwl1bnNpZ25lZCBpbnQgbmV3c3RhdGUgPSAwOworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOworCWludCByYzsKIAogCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCBnNV9jcHVfZnJlcXMsCiAJCQl0YXJnZXRfZnJlcSwgcmVsYXRpb24sICZuZXdzdGF0ZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIGc1X3N3aXRjaF9mcmVxKG5ld3N0YXRlKTsKKwlpZiAoZzVfcG1vZGVfY3VyID09IG5ld3N0YXRlKQorCQlyZXR1cm4gMDsKKworCWRvd24oJmc1X3N3aXRjaF9tdXRleCk7CisKKwlmcmVxcy5vbGQgPSBnNV9jcHVfZnJlcXNbZzVfcG1vZGVfY3VyXS5mcmVxdWVuY3k7CisJZnJlcXMubmV3ID0gZzVfY3B1X2ZyZXFzW25ld3N0YXRlXS5mcmVxdWVuY3k7CisJZnJlcXMuY3B1ID0gMDsKKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisJcmMgPSBnNV9zd2l0Y2hfZnJlcShuZXdzdGF0ZSk7CisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CisKKwl1cCgmZzVfc3dpdGNoX211dGV4KTsKKworCXJldHVybiByYzsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBnNV9jcHVmcmVxX2dldF9zcGVlZCh1bnNpZ25lZCBpbnQgY3B1KQpAQCAtMjA1LDYgKzM1NSw3IEBACiAJcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKIAlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gQ1BVRlJFUV9FVEVSTkFMOwogCXBvbGljeS0+Y3VyID0gZzVfY3B1X2ZyZXFzW2c1X3F1ZXJ5X2ZyZXEoKV0uZnJlcXVlbmN5OworCXBvbGljeS0+Y3B1cyA9IGNwdV9wb3NzaWJsZV9tYXA7CiAJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoZzVfY3B1X2ZyZXFzLCBwb2xpY3ktPmNwdSk7CiAKIAlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2xpY3ksCkBAIC0yMjQsMTkgKzM3NSwzOSBAQAogfTsKIAogCi1zdGF0aWMgaW50IF9faW5pdCBnNV9jcHVmcmVxX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGc1X25lbzJfY3B1ZnJlcV9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1cykKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdW5vZGU7CiAJdW5zaWduZWQgaW50IHBzaXplLCBzc2l6ZTsKLQlzdHJ1Y3Qgc211X3NkYnBfaGVhZGVyICpzaGRyOwogCXVuc2lnbmVkIGxvbmcgbWF4X2ZyZXE7Ci0JdTMyICp2YWxwOworCWNoYXIgKmZyZXFfbWV0aG9kLCAqdm9sdF9tZXRob2Q7CisJdTMyICp2YWxwLCBwdnJfaGk7CisJaW50IHVzZV92b2x0c192ZG5hcCA9IDA7CisJaW50IHVzZV92b2x0c19zbXUgPSAwOwogCWludCByYyA9IC1FTk9ERVY7CiAKLQkvKiBMb29rIGZvciBDUFUgYW5kIFNNVSBub2RlcyAqLwotCWNwdW5vZGUgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiY3B1Iik7Ci0JaWYgKCFjcHVub2RlKSB7Ci0JCURCRygiTm8gQ1BVIG5vZGUgIVxuIik7CisJLyogQ2hlY2sgc3VwcG9ydGVkIHBsYXRmb3JtcyAqLworCWlmIChtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyTWFjOCwxIikgfHwKKwkgICAgbWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlck1hYzgsMiIpIHx8CisJICAgIG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJNYWM5LDEiKSkKKwkJdXNlX3ZvbHRzX3NtdSA9IDE7CisJZWxzZSBpZiAobWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlck1hYzExLDIiKSkKKwkJdXNlX3ZvbHRzX3ZkbmFwID0gMTsKKwllbHNlCisJCXJldHVybiAtRU5PREVWOworCisJLyogR2V0IGZpcnN0IENQVSBub2RlICovCisJZm9yIChjcHVub2RlID0gTlVMTDsKKwkgICAgIChjcHVub2RlID0gb2ZfZ2V0X25leHRfY2hpbGQoY3B1cywgY3B1bm9kZSkpICE9IE5VTEw7KSB7CisJCXUzMiAqcmVnID0KKwkJCSh1MzIgKilnZXRfcHJvcGVydHkoY3B1bm9kZSwgInJlZyIsIE5VTEwpOworCQlpZiAocmVnID09IE5VTEwgfHwgKCpyZWcpICE9IDApCisJCQljb250aW51ZTsKKwkJaWYgKCFzdHJjbXAoY3B1bm9kZS0+dHlwZSwgImNwdSIpKQorCQkJYnJlYWs7CisJfQorCWlmIChjcHVub2RlID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjcHVmcmVxOiBDYW4ndCBmaW5kIGFueSBDUFUgMCBub2RlXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0yNDYsOCArNDE3LDkgQEAKIAkJREJHKCJObyBjcHUtdmVyc2lvbiBwcm9wZXJ0eSAhXG4iKTsKIAkJZ290byBiYWlsX25vcHJvcHM7CiAJfQotCWlmICgoKCp2YWxwKSA+PiAxNikgIT0gMHgzYykgewotCQlEQkcoIldyb25nIENQVSB2ZXJzaW9uOiAlMDh4XG4iLCAqdmFscCk7CisJcHZyX2hpID0gKCp2YWxwKSA+PiAxNjsKKwlpZiAocHZyX2hpICE9IDB4M2MgJiYgcHZyX2hpICE9IDB4NDQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjcHVmcmVxOiBVbnN1cHBvcnRlZCBDUFUgdmVyc2lvblxuIik7CiAJCWdvdG8gYmFpbF9ub3Byb3BzOwogCX0KIApAQCAtMjU5LDE4ICs0MzEsNTAgQEAKIAl9CiAJZzVfcG1vZGVfbWF4ID0gcHNpemUgLyBzaXplb2YodTMyKSAtIDE7CiAKLQkvKiBMb29rIGZvciB0aGUgRlZUIHRhYmxlICovCi0Jc2hkciA9IHNtdV9nZXRfc2RiX3BhcnRpdGlvbihTTVVfU0RCX0ZWVF9JRCwgTlVMTCk7Ci0JaWYgKCFzaGRyKQotCQlnb3RvIGJhaWxfbm9wcm9wczsKLQlnNV9mdnRfdGFibGUgPSAoc3RydWN0IHNtdV9zZGJwX2Z2dCAqKSZzaGRyWzFdOwotCXNzaXplID0gKHNoZHItPmxlbiAqIHNpemVvZih1MzIpKSAtIHNpemVvZihzdHJ1Y3Qgc211X3NkYnBfaGVhZGVyKTsKLQlnNV9mdnRfY291bnQgPSBzc2l6ZSAvIHNpemVvZihzdHJ1Y3Qgc211X3NkYnBfZnZ0KTsKLQlnNV9mdnRfY3VyID0gMDsKKwlpZiAodXNlX3ZvbHRzX3NtdSkgeworCQlzdHJ1Y3Qgc211X3NkYnBfaGVhZGVyICpzaGRyOwogCi0JLyogU2FuaXR5IGNoZWNraW5nICovCi0JaWYgKGc1X2Z2dF9jb3VudCA8IDEgfHwgZzVfcG1vZGVfbWF4IDwgMSkKLQkJZ290byBiYWlsX25vcHJvcHM7CisJCS8qIExvb2sgZm9yIHRoZSBGVlQgdGFibGUgKi8KKwkJc2hkciA9IHNtdV9nZXRfc2RiX3BhcnRpdGlvbihTTVVfU0RCX0ZWVF9JRCwgTlVMTCk7CisJCWlmICghc2hkcikKKwkJCWdvdG8gYmFpbF9ub3Byb3BzOworCQlnNV9mdnRfdGFibGUgPSAoc3RydWN0IHNtdV9zZGJwX2Z2dCAqKSZzaGRyWzFdOworCQlzc2l6ZSA9IChzaGRyLT5sZW4gKiBzaXplb2YodTMyKSkgLQorCQkJc2l6ZW9mKHN0cnVjdCBzbXVfc2RicF9oZWFkZXIpOworCQlnNV9mdnRfY291bnQgPSBzc2l6ZSAvIHNpemVvZihzdHJ1Y3Qgc211X3NkYnBfZnZ0KTsKKwkJZzVfZnZ0X2N1ciA9IDA7CisKKwkJLyogU2FuaXR5IGNoZWNraW5nICovCisJCWlmIChnNV9mdnRfY291bnQgPCAxIHx8IGc1X3Btb2RlX21heCA8IDEpCisJCQlnb3RvIGJhaWxfbm9wcm9wczsKKworCQlnNV9zd2l0Y2hfdm9sdCA9IGc1X3NtdV9zd2l0Y2hfdm9sdDsKKwkJdm9sdF9tZXRob2QgPSAiU01VIjsKKwl9IGVsc2UgaWYgKHVzZV92b2x0c192ZG5hcCkgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3Q7CisKKwkJcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7CisJCWlmIChyb290ID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiY3B1ZnJlcTogQ2FuJ3QgZmluZCByb290IG9mICIKKwkJCSAgICAgICAiZGV2aWNlIHRyZWVcbiIpOworCQkJZ290byBiYWlsX25vcHJvcHM7CisJCX0KKwkJcGZ1bmNfc2V0X3ZkbmFwMCA9IHBtZl9maW5kX2Z1bmN0aW9uKHJvb3QsICJzZXQtdmRuYXAwIik7CisJCXBmdW5jX3ZkbmFwMF9jb21wbGV0ZSA9CisJCQlwbWZfZmluZF9mdW5jdGlvbihyb290LCAic2xld2luZy1kb25lIik7CisJCWlmIChwZnVuY19zZXRfdmRuYXAwID09IE5VTEwgfHwKKwkJICAgIHBmdW5jX3ZkbmFwMF9jb21wbGV0ZSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImNwdWZyZXE6IENhbid0IGZpbmQgcmVxdWlyZWQgIgorCQkJICAgICAgICJwbGF0Zm9ybSBmdW5jdGlvblxuIik7CisJCQlnb3RvIGJhaWxfbm9wcm9wczsKKwkJfQorCisJCWc1X3N3aXRjaF92b2x0ID0gZzVfdmRuYXBfc3dpdGNoX3ZvbHQ7CisJCXZvbHRfbWV0aG9kID0gIkdQSU8iOworCX0gZWxzZSB7CisJCWc1X3N3aXRjaF92b2x0ID0gZzVfZHVtbXlfc3dpdGNoX3ZvbHQ7CisJCXZvbHRfbWV0aG9kID0gIm5vbmUiOworCX0KIAogCS8qCiAJICogRnJvbSB3aGF0IEkgc2VlLCBjbG9jay1mcmVxdWVuY3kgaXMgYWx3YXlzIHRoZSBtYXhpbWFsIGZyZXF1ZW5jeS4KQEAgLTI4NiwxOSArNDkwLDIzIEBACiAJZzVfY3B1X2ZyZXFzWzBdLmZyZXF1ZW5jeSA9IG1heF9mcmVxOwogCWc1X2NwdV9mcmVxc1sxXS5mcmVxdWVuY3kgPSBtYXhfZnJlcS8yOwogCi0JLyogQ2hlY2sgY3VycmVudCBmcmVxdWVuY3kgKi8KLQlnNV9wbW9kZV9jdXIgPSBnNV9xdWVyeV9mcmVxKCk7Ci0JaWYgKGc1X3Btb2RlX2N1ciA+IDEpCi0JCS8qIFdlIGRvbid0IHN1cHBvcnQgYW55dGhpbmcgYnV0IDE6MSBhbmQgMToyLCBmaXh1cCAuLi4gKi8KLQkJZzVfcG1vZGVfY3VyID0gMTsKKwkvKiBTZXQgY2FsbGJhY2tzICovCisJZzVfc3dpdGNoX2ZyZXEgPSBnNV9zY29tX3N3aXRjaF9mcmVxOworCWc1X3F1ZXJ5X2ZyZXEgPSBnNV9zY29tX3F1ZXJ5X2ZyZXE7CisJZnJlcV9tZXRob2QgPSAiU0NPTSI7CiAKIAkvKiBGb3JjZSBhcHBseSBjdXJyZW50IGZyZXF1ZW5jeSB0byBtYWtlIHN1cmUgZXZlcnl0aGluZyBpcyBpbgogCSAqIHN5bmMgKHZvbHRhZ2UgaXMgcmlnaHQgZm9yIGV4YW1wbGUpLiBGaXJtd2FyZSBtYXkgbGVhdmUgdXMgd2l0aAogCSAqIGEgc3RyYW5nZSBzZXR0aW5nIC4uLgogCSAqLwotCWc1X3N3aXRjaF9mcmVxKGc1X3Btb2RlX2N1cik7CisJZzVfc3dpdGNoX3ZvbHQoQ1BVRlJFUV9ISUdIKTsKKwltc2xlZXAoMTApOworCWc1X3Btb2RlX2N1ciA9IC0xOworCWc1X3N3aXRjaF9mcmVxKGc1X3F1ZXJ5X2ZyZXEoKSk7CiAKIAlwcmludGsoS0VSTl9JTkZPICJSZWdpc3RlcmluZyBHNSBDUFUgZnJlcXVlbmN5IGRyaXZlclxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiRnJlcXVlbmN5IG1ldGhvZDogJXMsIFZvbHRhZ2UgbWV0aG9kOiAlc1xuIiwKKwkgICAgICAgZnJlcV9tZXRob2QsIHZvbHRfbWV0aG9kKTsKIAlwcmludGsoS0VSTl9JTkZPICJMb3c6ICVkIE1oeiwgSGlnaDogJWQgTWh6LCBDdXI6ICVkIE1IelxuIiwKIAkJZzVfY3B1X2ZyZXFzWzFdLmZyZXF1ZW5jeS8xMDAwLAogCQlnNV9jcHVfZnJlcXNbMF0uZnJlcXVlbmN5LzEwMDAsCkBAIC0zMTcsNiArNTI1LDIwMCBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludCBfX2luaXQgZzVfcG03Ml9jcHVmcmVxX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpjcHVzKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1aWQgPSBOVUxMLCAqaHdjbG9jayA9IE5VTEwsICpjcHVub2RlID0gTlVMTDsKKwl1OCAqZWVwcm9tID0gTlVMTDsKKwl1MzIgKnZhbHA7CisJdTY0IG1heF9mcmVxLCBtaW5fZnJlcSwgaWgsIGlsOworCWludCBoYXNfdm9sdCA9IDEsIHJjID0gMDsKKworCS8qIEdldCBmaXJzdCBDUFUgbm9kZSAqLworCWZvciAoY3B1bm9kZSA9IE5VTEw7CisJICAgICAoY3B1bm9kZSA9IG9mX2dldF9uZXh0X2NoaWxkKGNwdXMsIGNwdW5vZGUpKSAhPSBOVUxMOykgeworCQlpZiAoIXN0cmNtcChjcHVub2RlLT50eXBlLCAiY3B1IikpCisJCQlicmVhazsKKwl9CisJaWYgKGNwdW5vZGUgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImNwdWZyZXE6IENhbid0IGZpbmQgYW55IENQVSBub2RlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogTG9va3VwIHRoZSBjcHVpZCBlZXByb20gbm9kZSAqLworICAgICAgICBjcHVpZCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvdTNAMCxmODAwMDAwMC9pMmNAZjgwMDEwMDAvY3B1aWRAYTAiKTsKKwlpZiAoY3B1aWQgIT0gTlVMTCkKKwkJZWVwcm9tID0gKHU4ICopZ2V0X3Byb3BlcnR5KGNwdWlkLCAiY3B1aWQiLCBOVUxMKTsKKwlpZiAoZWVwcm9tID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjcHVmcmVxOiBDYW4ndCBmaW5kIGNwdWlkIEVFUFJPTSAhXG4iKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGJhaWw7CisJfQorCisJLyogTG9va3VwIHRoZSBpMmMgaHdjbG9jayAqLworCWZvciAoaHdjbG9jayA9IE5VTEw7CisJICAgICAoaHdjbG9jayA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKGh3Y2xvY2ssICJpMmMtaHdjbG9jayIpKSAhPSBOVUxMOyl7CisJCWNoYXIgKmxvYyA9IGdldF9wcm9wZXJ0eShod2Nsb2NrLCAiaHdjdHJsLWxvY2F0aW9uIiwgTlVMTCk7CisJCWlmIChsb2MgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlpZiAoc3RyY21wKGxvYywgIkNQVSBDTE9DSyIpKQorCQkJY29udGludWU7CisJCWlmICghZ2V0X3Byb3BlcnR5KGh3Y2xvY2ssICJwbGF0Zm9ybS1nZXQtZnJlcXVlbmN5IiwgTlVMTCkpCisJCQljb250aW51ZTsKKwkJYnJlYWs7CisJfQorCWlmIChod2Nsb2NrID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjcHVmcmVxOiBDYW4ndCBmaW5kIGkyYyBjbG9jayBjaGlwICFcbiIpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlEQkcoImNwdWZyZXE6IGkyYyBjbG9jayBjaGlwIGZvdW5kOiAlc1xuIiwgaHdjbG9jay0+ZnVsbF9uYW1lKTsKKworCS8qIE5vdyBnZXQgYWxsIHRoZSBwbGF0Zm9ybSBmdW5jdGlvbnMgKi8KKwlwZnVuY19jcHVfZ2V0ZnJlcSA9CisJCXBtZl9maW5kX2Z1bmN0aW9uKGh3Y2xvY2ssICJnZXQtZnJlcXVlbmN5Iik7CisJcGZ1bmNfY3B1X3NldGZyZXFfaGlnaCA9CisJCXBtZl9maW5kX2Z1bmN0aW9uKGh3Y2xvY2ssICJzZXQtZnJlcXVlbmN5LWhpZ2giKTsKKwlwZnVuY19jcHVfc2V0ZnJlcV9sb3cgPQorCQlwbWZfZmluZF9mdW5jdGlvbihod2Nsb2NrLCAic2V0LWZyZXF1ZW5jeS1sb3ciKTsKKwlwZnVuY19zbGV3aW5nX2RvbmUgPQorCQlwbWZfZmluZF9mdW5jdGlvbihod2Nsb2NrLCAic2xld2luZy1kb25lIik7CisJcGZ1bmNfY3B1MF92b2x0X2hpZ2ggPQorCQlwbWZfZmluZF9mdW5jdGlvbihod2Nsb2NrLCAic2V0LXZvbHRhZ2UtaGlnaC0wIik7CisJcGZ1bmNfY3B1MF92b2x0X2xvdyA9CisJCXBtZl9maW5kX2Z1bmN0aW9uKGh3Y2xvY2ssICJzZXQtdm9sdGFnZS1sb3ctMCIpOworCXBmdW5jX2NwdTFfdm9sdF9oaWdoID0KKwkJcG1mX2ZpbmRfZnVuY3Rpb24oaHdjbG9jaywgInNldC12b2x0YWdlLWhpZ2gtMSIpOworCXBmdW5jX2NwdTFfdm9sdF9sb3cgPQorCQlwbWZfZmluZF9mdW5jdGlvbihod2Nsb2NrLCAic2V0LXZvbHRhZ2UtbG93LTEiKTsKKworCS8qIENoZWNrIHdlIGhhdmUgbWluaW11bSByZXF1aXJlbWVudHMgKi8KKwlpZiAocGZ1bmNfY3B1X2dldGZyZXEgPT0gTlVMTCB8fCBwZnVuY19jcHVfc2V0ZnJlcV9oaWdoID09IE5VTEwgfHwKKwkgICAgcGZ1bmNfY3B1X3NldGZyZXFfbG93ID09IE5VTEwgfHwgcGZ1bmNfc2xld2luZ19kb25lID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjcHVmcmVxOiBDYW4ndCBmaW5kIHBsYXRmb3JtIGZ1bmN0aW9ucyAhXG4iKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGJhaWw7CisJfQorCisJLyogQ2hlY2sgdGhhdCB3ZSBoYXZlIGNvbXBsZXRlIHNldHMgKi8KKwlpZiAocGZ1bmNfY3B1MF92b2x0X2hpZ2ggPT0gTlVMTCB8fCBwZnVuY19jcHUwX3ZvbHRfbG93ID09IE5VTEwpIHsKKwkJcG1mX3B1dF9mdW5jdGlvbihwZnVuY19jcHUwX3ZvbHRfaGlnaCk7CisJCXBtZl9wdXRfZnVuY3Rpb24ocGZ1bmNfY3B1MF92b2x0X2xvdyk7CisJCXBmdW5jX2NwdTBfdm9sdF9oaWdoID0gcGZ1bmNfY3B1MF92b2x0X2xvdyA9IE5VTEw7CisJCWhhc192b2x0ID0gMDsKKwl9CisJaWYgKCFoYXNfdm9sdCB8fAorCSAgICBwZnVuY19jcHUxX3ZvbHRfaGlnaCA9PSBOVUxMIHx8IHBmdW5jX2NwdTFfdm9sdF9sb3cgPT0gTlVMTCkgeworCQlwbWZfcHV0X2Z1bmN0aW9uKHBmdW5jX2NwdTFfdm9sdF9oaWdoKTsKKwkJcG1mX3B1dF9mdW5jdGlvbihwZnVuY19jcHUxX3ZvbHRfbG93KTsKKwkJcGZ1bmNfY3B1MV92b2x0X2hpZ2ggPSBwZnVuY19jcHUxX3ZvbHRfbG93ID0gTlVMTDsKKwl9CisKKwkvKiBOb3RlOiBUaGUgZGV2aWNlIHRyZWUgYWxzbyBjb250YWlucyBhICJwbGF0Zm9ybS1zZXQtdmFsdWVzIgorCSAqIGZ1bmN0aW9uIGZvciB3aGljaCBJIGhhdmVuJ3QgcXVpdGUgZmlndXJlZCBvdXQgdGhlIHVzYWdlLiBJdAorCSAqIG1pZ2h0IGhhdmUgdG8gYmUgY2FsbGVkIG9uIGluaXQgYW5kL29yIHdha2V1cCwgSSdtIG5vdCB0b28gc3VyZQorCSAqIGJ1dCB0aGluZ3Mgc2VlbSB0byB3b3JrIGZpbmUgd2l0aG91dCBpdCBzbyBmYXIgLi4uCisJICovCisKKwkvKiBHZXQgbWF4IGZyZXF1ZW5jeSBmcm9tIGRldmljZS10cmVlICovCisJdmFscCA9ICh1MzIgKilnZXRfcHJvcGVydHkoY3B1bm9kZSwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOworCWlmICghdmFscCkgeworCQlwcmludGsoS0VSTl9FUlIgImNwdWZyZXE6IENhbid0IGZpbmQgQ1BVIGZyZXF1ZW5jeSAhXG4iKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGJhaWw7CisJfQorCisJbWF4X2ZyZXEgPSAoKnZhbHApLzEwMDA7CisKKwkvKiBOb3cgY2FsY3VsYXRlIHJlZHVjZWQgZnJlcXVlbmN5IGJ5IHVzaW5nIHRoZSBjcHVpZCBpbnB1dCBmcmVxCisJICogcmF0aW8uIFRoaXMgcmVxdWlyZXMgNjQgYml0cyBtYXRoIHVubGVzcyB3ZSBhcmUgd2lsbGluZyB0byBsb3NlCisJICogc29tZSBwcmVjaXNpb24KKwkgKi8KKwlpaCA9ICooKHUzMiAqKShlZXByb20gKyAweDEwKSk7CisJaWwgPSAqKCh1MzIgKikoZWVwcm9tICsgMHgyMCkpOworCW1pbl9mcmVxID0gMDsKKwlpZiAoaWggIT0gMCAmJiBpbCAhPSAwKQorCQltaW5fZnJlcSA9IChtYXhfZnJlcSAqIGlsKSAvIGloOworCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKG1pbl9mcmVxID49IG1heF9mcmVxIHx8IG1pbl9mcmVxIDwgMTAwMCkgeworCQlwcmludGsoS0VSTl9FUlIgImNwdWZyZXE6IENhbid0IGNhbGN1bGF0ZSBsb3cgZnJlcXVlbmN5ICFcbiIpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gYmFpbDsKKwl9CisJZzVfY3B1X2ZyZXFzWzBdLmZyZXF1ZW5jeSA9IG1heF9mcmVxOworCWc1X2NwdV9mcmVxc1sxXS5mcmVxdWVuY3kgPSBtaW5fZnJlcTsKKworCS8qIFNldCBjYWxsYmFja3MgKi8KKwlnNV9zd2l0Y2hfdm9sdCA9IGc1X3BmdW5jX3N3aXRjaF92b2x0OworCWc1X3N3aXRjaF9mcmVxID0gZzVfcGZ1bmNfc3dpdGNoX2ZyZXE7CisJZzVfcXVlcnlfZnJlcSA9IGc1X3BmdW5jX3F1ZXJ5X2ZyZXE7CisKKwkvKiBGb3JjZSBhcHBseSBjdXJyZW50IGZyZXF1ZW5jeSB0byBtYWtlIHN1cmUgZXZlcnl0aGluZyBpcyBpbgorCSAqIHN5bmMgKHZvbHRhZ2UgaXMgcmlnaHQgZm9yIGV4YW1wbGUpLiBGaXJtd2FyZSBtYXkgbGVhdmUgdXMgd2l0aAorCSAqIGEgc3RyYW5nZSBzZXR0aW5nIC4uLgorCSAqLworCWc1X3N3aXRjaF92b2x0KENQVUZSRVFfSElHSCk7CisJbXNsZWVwKDEwKTsKKwlnNV9wbW9kZV9jdXIgPSAtMTsKKwlnNV9zd2l0Y2hfZnJlcShnNV9xdWVyeV9mcmVxKCkpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUmVnaXN0ZXJpbmcgRzUgQ1BVIGZyZXF1ZW5jeSBkcml2ZXJcbiIpOworCXByaW50ayhLRVJOX0lORk8gIkZyZXF1ZW5jeSBtZXRob2Q6IGkyYy9wZnVuYywgIgorCSAgICAgICAiVm9sdGFnZSBtZXRob2Q6ICVzXG4iLCBoYXNfdm9sdCA/ICJpMmMvcGZ1bmMiIDogIm5vbmUiKTsKKwlwcmludGsoS0VSTl9JTkZPICJMb3c6ICVkIE1oeiwgSGlnaDogJWQgTWh6LCBDdXI6ICVkIE1IelxuIiwKKwkJZzVfY3B1X2ZyZXFzWzFdLmZyZXF1ZW5jeS8xMDAwLAorCQlnNV9jcHVfZnJlcXNbMF0uZnJlcXVlbmN5LzEwMDAsCisJCWc1X2NwdV9mcmVxc1tnNV9wbW9kZV9jdXJdLmZyZXF1ZW5jeS8xMDAwKTsKKworCXJjID0gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmc1X2NwdWZyZXFfZHJpdmVyKTsKKyBiYWlsOgorCWlmIChyYyAhPSAwKSB7CisJCXBtZl9wdXRfZnVuY3Rpb24ocGZ1bmNfY3B1X2dldGZyZXEpOworCQlwbWZfcHV0X2Z1bmN0aW9uKHBmdW5jX2NwdV9zZXRmcmVxX2hpZ2gpOworCQlwbWZfcHV0X2Z1bmN0aW9uKHBmdW5jX2NwdV9zZXRmcmVxX2xvdyk7CisJCXBtZl9wdXRfZnVuY3Rpb24ocGZ1bmNfc2xld2luZ19kb25lKTsKKwkJcG1mX3B1dF9mdW5jdGlvbihwZnVuY19jcHUwX3ZvbHRfaGlnaCk7CisJCXBtZl9wdXRfZnVuY3Rpb24ocGZ1bmNfY3B1MF92b2x0X2xvdyk7CisJCXBtZl9wdXRfZnVuY3Rpb24ocGZ1bmNfY3B1MV92b2x0X2hpZ2gpOworCQlwbWZfcHV0X2Z1bmN0aW9uKHBmdW5jX2NwdTFfdm9sdF9sb3cpOworCX0KKwlvZl9ub2RlX3B1dChod2Nsb2NrKTsKKwlvZl9ub2RlX3B1dChjcHVpZCk7CisJb2Zfbm9kZV9wdXQoY3B1bm9kZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGc1X3JtMzFfY3B1ZnJlcV9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1cykKK3sKKwkvKiBOWUkgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgZzVfY3B1ZnJlcV9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpjcHVzOworCWludCByYzsKKworCWNwdXMgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2NwdXMiKTsKKwlpZiAoY3B1cyA9PSBOVUxMKSB7CisJCURCRygiTm8gL2NwdXMgbm9kZSAhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJNYWM3LDIiKSB8fAorCSAgICBtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyTWFjNywzIikpCisJCXJjID0gZzVfcG03Ml9jcHVmcmVxX2luaXQoY3B1cyk7CisJZWxzZSBpZiAobWFjaGluZV9pc19jb21wYXRpYmxlKCJSYWNrTWFjMywxIikpCisJCXJjID0gZzVfcm0zMV9jcHVmcmVxX2luaXQoY3B1cyk7CisJZWxzZQorCQlyYyA9IGc1X25lbzJfY3B1ZnJlcV9pbml0KGNwdXMpOworCisJb2Zfbm9kZV9wdXQoY3B1cyk7CisJcmV0dXJuIHJjOworfQorCiBtb2R1bGVfaW5pdChnNV9jcHVmcmVxX2luaXQpOwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvZmVhdHVyZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9mZWF0dXJlLmMKaW5kZXggZjZlMjJkYS4uNTU4ZGQwNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9mZWF0dXJlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9mZWF0dXJlLmMKQEAgLTU4LDEyICs1OCwxMSBAQAogZXh0ZXJuIGludCBwb3dlcnNhdmVfbmFwOwogZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqazJfc2tpcGxpc3RbMl07CiAKLQogLyoKICAqIFdlIHVzZSBhIHNpbmdsZSBnbG9iYWwgbG9jayB0byBwcm90ZWN0IGFjY2Vzc2VzLiBFYWNoIGRyaXZlciBoYXMKICAqIHRvIHRha2UgY2FyZSBvZiBpdHMgb3duIGxvY2tpbmcKICAqLwotc3RhdGljIERFRklORV9TUElOTE9DSyhmZWF0dXJlX2xvY2spOworREVGSU5FX1NQSU5MT0NLKGZlYXR1cmVfbG9jayk7CiAKICNkZWZpbmUgTE9DSyhmbGFncykJc3Bpbl9sb2NrX2lycXNhdmUoJmZlYXR1cmVfbG9jaywgZmxhZ3MpOwogI2RlZmluZSBVTkxPQ0soZmxhZ3MpCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZlYXR1cmVfbG9jaywgZmxhZ3MpOwpAQCAtMTAxLDI2ICsxMDAsMTcgQEAKIAkiS2V5bGFyZ28iLAogCSJQYW5nZWEiLAogCSJJbnRyZXBpZCIsCi0JIksyIgorCSJLMiIsCisJIlNoYXN0YSIsCiB9OwogCiAKK3N0cnVjdCBkZXZpY2Vfbm9kZSAqdW5pbm9ydGhfbm9kZTsKK3UzMiBfX2lvbWVtICp1bmlub3J0aF9iYXNlOwogCi0vKgotICogVW5pbm9ydGggcmVnLiBhY2Nlc3MuIE5vdGUgdGhhdCBVbmktTiByZWdzIGFyZSBiaWcgZW5kaWFuCi0gKi8KLQotI2RlZmluZSBVTl9SRUcocikJKHVuaW5vcnRoX2Jhc2UgKyAoKHIpID4+IDIpKQotI2RlZmluZSBVTl9JTihyKQkoaW5fYmUzMihVTl9SRUcocikpKQotI2RlZmluZSBVTl9PVVQocix2KQkob3V0X2JlMzIoVU5fUkVHKHIpLCAodikpKQotI2RlZmluZSBVTl9CSVMocix2KQkoVU5fT1VUKChyKSwgVU5fSU4ocikgfCAodikpKQotI2RlZmluZSBVTl9CSUMocix2KQkoVU5fT1VUKChyKSwgVU5fSU4ocikgJiB+KHYpKSkKLQotc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqdW5pbm9ydGhfbm9kZTsKLXN0YXRpYyB1MzIgX19pb21lbSAqdW5pbm9ydGhfYmFzZTsKIHN0YXRpYyB1MzIgdW5pbm9ydGhfcmV2Owotc3RhdGljIGludCB1bmlub3J0aF91MzsKLXN0YXRpYyB2b2lkIF9faW9tZW0gKnUzX2h0Oworc3RhdGljIGludCB1bmlub3J0aF9tYWo7CitzdGF0aWMgdm9pZCBfX2lvbWVtICp1M19odF9iYXNlOwogCiAvKgogICogRm9yIGVhY2ggbW90aGVyYm9hcmQgZmFtaWx5LCB3ZSBoYXZlIGEgdGFibGUgb2YgZnVuY3Rpb25zIHBvaW50ZXJzCkBAIC0xMzk5LDggKzEzODksMTUgQEAKIHN0YXRpYyBsb25nIGc1X21waWNfZW5hYmxlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgbG9uZyBwYXJhbSwgbG9uZyB2YWx1ZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50ID0gb2ZfZ2V0X3BhcmVudChub2RlKTsKKwlpbnQgaXNfdTM7CiAKLQlpZiAobm9kZS0+cGFyZW50ID09IE5VTEwgfHwgc3RyY21wKG5vZGUtPnBhcmVudC0+bmFtZSwgInUzIikpCisJaWYgKHBhcmVudCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpc191MyA9IHN0cmNtcChwYXJlbnQtPm5hbWUsICJ1MyIpID09IDAgfHwKKwkJc3RyY21wKHBhcmVudC0+bmFtZSwgInU0IikgPT0gMDsKKwlvZl9ub2RlX3B1dChwYXJlbnQpOworCWlmICghaXNfdTMpCiAJCXJldHVybiAwOwogCiAJTE9DSyhmbGFncyk7CkBAIC0xNDQ1LDIwICsxNDQyLDUzIEBACiAJLyogVmVyeSBjcnVkZSBpbXBsZW1lbnRhdGlvbiBmb3Igbm93ICovCiAJc3RydWN0IG1hY2lvX2NoaXAgKm1hY2lvID0gJm1hY2lvX2NoaXBzWzBdOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNlbGw7CisJdTMyIGZjcnNbM11bM10gPSB7CisJCXsgMCwKKwkJICBLMl9GQ1IxX0kyUzBfQ0VMTF9FTkFCTEUgfAorCQkgIEsyX0ZDUjFfSTJTMF9DTEtfRU5BQkxFX0JJVCB8IEsyX0ZDUjFfSTJTMF9FTkFCTEUsCisJCSAgS0wzX0kyUzBfQ0xLMThfRU5BQkxFCisJCX0sCisJCXsgS0wwX1NDQ19BX0lOVEZfRU5BQkxFLAorCQkgIEsyX0ZDUjFfSTJTMV9DRUxMX0VOQUJMRSB8CisJCSAgSzJfRkNSMV9JMlMxX0NMS19FTkFCTEVfQklUIHwgSzJfRkNSMV9JMlMxX0VOQUJMRSwKKwkJICBLTDNfSTJTMV9DTEsxOF9FTkFCTEUKKwkJfSwKKwkJeyBLTDBfU0NDX0JfSU5URl9FTkFCTEUsCisJCSAgU0hfRkNSMV9JMlMyX0NFTExfRU5BQkxFIHwKKwkJICBTSF9GQ1IxX0kyUzJfQ0xLX0VOQUJMRV9CSVQgfCBTSF9GQ1IxX0kyUzJfRU5BQkxFLAorCQkgIFNIX0ZDUjNfSTJTMl9DTEsxOF9FTkFCTEUKKwkJfSwKKwl9OwogCi0JaWYgKHZhbHVlID09IDApCi0JCXJldHVybiAwOyAvKiBkb24ndCBkaXNhYmxlIHlldCAqLworCWlmIChtYWNpby0+dHlwZSAhPSBtYWNpb19rZXlsYXJnbzIgJiYgbWFjaW8tPnR5cGUgIT0gbWFjaW9fc2hhc3RhKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoc3RybmNtcChub2RlLT5uYW1lLCAiaTJzLSIsIDQpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwljZWxsID0gbm9kZS0+bmFtZVs0XSAtICdhJzsKKwlzd2l0Y2goY2VsbCkgeworCWNhc2UgMDoKKwljYXNlIDE6CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaWYgKG1hY2lvLT50eXBlID09IG1hY2lvX3NoYXN0YSkKKwkJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PREVWOworCX0KIAogCUxPQ0soZmxhZ3MpOwotCU1BQ0lPX0JJUyhLRVlMQVJHT19GQ1IzLCBLTDNfQ0xLNDVfRU5BQkxFIHwgS0wzX0NMSzQ5X0VOQUJMRSB8Ci0JCSAgS0wzX0kyUzBfQ0xLMThfRU5BQkxFKTsKKwlpZiAodmFsdWUpIHsKKwkJTUFDSU9fQklDKEtFWUxBUkdPX0ZDUjAsIGZjcnNbY2VsbF1bMF0pOworCQlNQUNJT19CSVMoS0VZTEFSR09fRkNSMSwgZmNyc1tjZWxsXVsxXSk7CisJCU1BQ0lPX0JJUyhLRVlMQVJHT19GQ1IzLCBmY3JzW2NlbGxdWzJdKTsKKwl9IGVsc2UgeworCQlNQUNJT19CSUMoS0VZTEFSR09fRkNSMywgZmNyc1tjZWxsXVsyXSk7CisJCU1BQ0lPX0JJQyhLRVlMQVJHT19GQ1IxLCBmY3JzW2NlbGxdWzFdKTsKKwkJTUFDSU9fQklTKEtFWUxBUkdPX0ZDUjAsIGZjcnNbY2VsbF1bMF0pOworCX0KIAl1ZGVsYXkoMTApOwotCU1BQ0lPX0JJUyhLRVlMQVJHT19GQ1IxLCBLMl9GQ1IxX0kyUzBfQ0VMTF9FTkFCTEUgfAotCQkgIEsyX0ZDUjFfSTJTMF9DTEtfRU5BQkxFX0JJVCB8IEsyX0ZDUjFfSTJTMF9FTkFCTEUpOwotCXVkZWxheSgxMCk7Ci0JTUFDSU9fQklDKEtFWUxBUkdPX0ZDUjEsIEsyX0ZDUjFfSTJTMF9SRVNFVCk7CiAJVU5MT0NLKGZsYWdzKTsKLQl1ZGVsYXkoMTApOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNDczLDcgKzE1MDMsNyBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAKIAltYWNpbyA9ICZtYWNpb19jaGlwc1swXTsKLQlpZiAobWFjaW8tPnR5cGUgIT0gbWFjaW9fa2V5bGFyZ28yKQorCWlmIChtYWNpby0+dHlwZSAhPSBtYWNpb19rZXlsYXJnbzIgJiYgbWFjaW8tPnR5cGUgIT0gbWFjaW9fc2hhc3RhKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCW5wID0gZmluZF9wYXRoX2RldmljZSgiL2NwdXMiKTsKQEAgLTE1MTIsMTQgKzE1NDIsMTcgQEAKICAqLwogdm9pZCBnNV9waHlfZGlzYWJsZV9jcHUxKHZvaWQpCiB7Ci0JVU5fT1VUKFUzX0FQSV9QSFlfQ09ORklHXzEsIDApOworCWlmICh1bmlub3J0aF9tYWogPT0gMykKKwkJVU5fT1VUKFUzX0FQSV9QSFlfQ09ORklHXzEsIDApOwogfQogI2VuZGlmIC8qIENPTkZJR19QT1dFUjQgKi8KIAogI2lmbmRlZiBDT05GSUdfUE9XRVI0CiAKLXN0YXRpYyB2b2lkCi1rZXlsYXJnb19zaHV0ZG93bihzdHJ1Y3QgbWFjaW9fY2hpcCAqbWFjaW8sIGludCBzbGVlcF9tb2RlKQorCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyB2b2lkIGtleWxhcmdvX3NodXRkb3duKHN0cnVjdCBtYWNpb19jaGlwICptYWNpbywgaW50IHNsZWVwX21vZGUpCiB7CiAJdTMyIHRlbXA7CiAKQEAgLTE1NzIsOCArMTYwNSw3IEBACiAJKHZvaWQpTUFDSU9fSU4zMihLRVlMQVJHT19GQ1IwKTsgbWRlbGF5KDEpOwogfQogCi1zdGF0aWMgdm9pZAotcGFuZ2VhX3NodXRkb3duKHN0cnVjdCBtYWNpb19jaGlwICptYWNpbywgaW50IHNsZWVwX21vZGUpCitzdGF0aWMgdm9pZCBwYW5nZWFfc2h1dGRvd24oc3RydWN0IG1hY2lvX2NoaXAgKm1hY2lvLCBpbnQgc2xlZXBfbW9kZSkKIHsKIAl1MzIgdGVtcDsKIApAQCAtMTYwNiw4ICsxNjM4LDcgQEAKIAkodm9pZClNQUNJT19JTjMyKEtFWUxBUkdPX0ZDUjApOyBtZGVsYXkoMSk7CiB9CiAKLXN0YXRpYyB2b2lkCi1pbnRyZXBpZF9zaHV0ZG93bihzdHJ1Y3QgbWFjaW9fY2hpcCAqbWFjaW8sIGludCBzbGVlcF9tb2RlKQorc3RhdGljIHZvaWQgaW50cmVwaWRfc2h1dGRvd24oc3RydWN0IG1hY2lvX2NoaXAgKm1hY2lvLCBpbnQgc2xlZXBfbW9kZSkKIHsKIAl1MzIgdGVtcDsKIApAQCAtMTYzNSwxMjQgKzE2NjYsNiBAQAogfQogCiAKLXZvaWQgcG1hY190d2Vha19jbG9ja19zcHJlYWRpbmcoaW50IGVuYWJsZSkKLXsKLQlzdHJ1Y3QgbWFjaW9fY2hpcCAqbWFjaW8gPSAmbWFjaW9fY2hpcHNbMF07Ci0KLQkvKiBIYWNrIGZvciBkb2luZyBjbG9jayBzcHJlYWRpbmcgb24gc29tZSBtYWNoaW5lcyBQb3dlckJvb2tzIGFuZAotCSAqIGlCb29rcy4gVGhpcyBpbXBsZW1lbnRzIHRoZSAicGxhdGZvcm0tZG8tY2xvY2tzcHJlYWRpbmciIE9GCi0JICogcHJvcGVydHkgYXMgZGVjb2RlZCBtYW51YWxseSBvbiB2YXJpb3VzIG1vZGVscy4gRm9yIHNhZmV0eSwgd2UgYWxzbwotCSAqIGNoZWNrIHRoZSBwcm9kdWN0IElEIGluIHRoZSBkZXZpY2UtdHJlZSBpbiBjYXNlcyB3ZSdsbCB3aGFjayB0aGUgaTJjCi0JICogY2hpcCB0byBtYWtlIHJlYXNvbmFibHkgc3VyZSB3ZSB3b24ndCBzZXQgd3JvbmcgdmFsdWVzIGluIHRoZXJlCi0JICoKLQkgKiBPZiBjb3Vyc2UsIHVsdGltYXRlbHksIHdlIGhhdmUgdG8gaW1wbGVtZW50IGEgcmVhbCBwYXJzZXIgZm9yCi0JICogdGhlIHBsYXRmb3JtLWRvLSogc3R1ZmYuLi4KLQkgKi8KLQotCWlmIChtYWNpby0+dHlwZSA9PSBtYWNpb19pbnRyZXBpZCkgewotCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNsb2NrID0KLQkJCW9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvdW5pLW5AZjgwMDAwMDAvaHctY2xvY2siKTsKLQkJaWYgKGNsb2NrICYmIGdldF9wcm9wZXJ0eShjbG9jaywgInBsYXRmb3JtLWRvLWNsb2Nrc3ByZWFkaW5nIiwKLQkJCQkJICBOVUxMKSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXNhYmxpbmcgY2xvY2sgc3ByZWFkaW5nIG9uIEludHJlcGlkIgotCQkJICAgICAgICIgQVNJQ1xuIiwgZW5hYmxlID8gIkVuIiA6ICJEaXMiKTsKLQkJCWlmIChlbmFibGUpCi0JCQkJVU5fT1VUKFVOSV9OX0NMT0NLX1NQUkVBRElORywgMik7Ci0JCQllbHNlCi0JCQkJVU5fT1VUKFVOSV9OX0NMT0NLX1NQUkVBRElORywgMCk7Ci0JCQltZGVsYXkoNDApOwotCQl9Ci0JCW9mX25vZGVfcHV0KGNsb2NrKTsKLQl9Ci0KLQl3aGlsZSAobWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlckJvb2s1LDIiKSB8fAotCSAgICAgICBtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyQm9vazUsMyIpIHx8Ci0JICAgICAgIG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rNiwyIikgfHwKLQkgICAgICAgbWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlckJvb2s2LDMiKSkgewotCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnVpMmMgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiaTJjIik7Ci0JCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHQgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiZGV2aWNlLXRyZWUiKTsKLQkJdTggYnVmZmVyWzldOwotCQl1MzIgKnByb2R1Y3RJRDsKLQkJaW50IGksIHJjLCBjaGFuZ2VkID0gMDsKLQotCQlpZiAoZHQgPT0gTlVMTCkKLQkJCWJyZWFrOwotCQlwcm9kdWN0SUQgPSAodTMyICopZ2V0X3Byb3BlcnR5KGR0LCAicGlkIyIsIE5VTEwpOwotCQlpZiAocHJvZHVjdElEID09IE5VTEwpCi0JCQlicmVhazsKLQkJd2hpbGUodWkyYykgewotCQkJc3RydWN0IGRldmljZV9ub2RlICpwID0gb2ZfZ2V0X3BhcmVudCh1aTJjKTsKLQkJCWlmIChwICYmICFzdHJjbXAocC0+bmFtZSwgInVuaS1uIikpCi0JCQkJYnJlYWs7Ci0JCQl1aTJjID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUodWkyYywgImkyYyIpOwotCQl9Ci0JCWlmICh1aTJjID09IE5VTEwpCi0JCQlicmVhazsKLQkJREJHKCJUcnlpbmcgdG8gYnVtcCBjbG9jayBzcGVlZCBmb3IgUElEOiAlMDh4Li4uXG4iLCAqcHJvZHVjdElEKTsKLQkJcmMgPSBwbWFjX2xvd19pMmNfb3Blbih1aTJjLCAxKTsKLQkJaWYgKHJjICE9IDApCi0JCQlicmVhazsKLQkJcG1hY19sb3dfaTJjX3NldG1vZGUodWkyYywgcG1hY19sb3dfaTJjX21vZGVfY29tYmluZWQpOwotCQlyYyA9IHBtYWNfbG93X2kyY194ZmVyKHVpMmMsIDB4ZDIgfCBwbWFjX2xvd19pMmNfcmVhZCwgMHg4MCwgYnVmZmVyLCA5KTsKLQkJREJHKCJyZWFkIHJlc3VsdDogJWQsIiwgcmMpOwotCQlpZiAocmMgIT0gMCkgewotCQkJcG1hY19sb3dfaTJjX2Nsb3NlKHVpMmMpOwotCQkJYnJlYWs7Ci0JCX0KLQkJZm9yIChpPTA7IGk8OTsgaSsrKQotCQkJREJHKCIgJTAyeCIsIGJ1ZmZlcltpXSk7Ci0JCURCRygiXG4iKTsKLQotCQlzd2l0Y2goKnByb2R1Y3RJRCkgewotCQljYXNlIDB4MTE4MjoJLyogQWxCb29rIDEyIiByZXYgMiAqLwotCQljYXNlIDB4MTE4MzoJLyogaUJvb2sgRzQgMTIiICovCi0JCQlidWZmZXJbMF0gPSAoYnVmZmVyWzBdICYgMHg4ZikgfCAweDcwOwotCQkJYnVmZmVyWzJdID0gKGJ1ZmZlclsyXSAmIDB4N2YpIHwgMHgwMDsKLQkJCWJ1ZmZlcls1XSA9IChidWZmZXJbNV0gJiAweDgwKSB8IDB4MzE7Ci0JCQlidWZmZXJbNl0gPSAoYnVmZmVyWzZdICYgMHg0MCkgfCAweGIwOwotCQkJYnVmZmVyWzddID0gKGJ1ZmZlcls3XSAmIDB4MDApIHwgKGVuYWJsZSA/IDB4YzAgOiAweGJhKTsKLQkJCWJ1ZmZlcls4XSA9IChidWZmZXJbOF0gJiAweDAwKSB8IDB4MzA7Ci0JCQljaGFuZ2VkID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIDB4MzE0MjoJLyogQWxCb29rIDE1IiAoQVRJIE0xMCkgKi8KLQkJY2FzZSAweDMxNDM6CS8qIEFsQm9vayAxNyIgKEFUSSBNMTApICovCi0JCQlidWZmZXJbMF0gPSAoYnVmZmVyWzBdICYgMHhhZikgfCAweDUwOwotCQkJYnVmZmVyWzJdID0gKGJ1ZmZlclsyXSAmIDB4N2YpIHwgMHgwMDsKLQkJCWJ1ZmZlcls1XSA9IChidWZmZXJbNV0gJiAweDgwKSB8IDB4MzE7Ci0JCQlidWZmZXJbNl0gPSAoYnVmZmVyWzZdICYgMHg0MCkgfCAweGIwOwotCQkJYnVmZmVyWzddID0gKGJ1ZmZlcls3XSAmIDB4MDApIHwgKGVuYWJsZSA/IDB4ZDAgOiAweGMwKTsKLQkJCWJ1ZmZlcls4XSA9IChidWZmZXJbOF0gJiAweDAwKSB8IDB4MzA7Ci0JCQljaGFuZ2VkID0gMTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJREJHKCJpMmMtaHdjbG9jazogTWFjaGluZSBtb2RlbCBub3QgaGFuZGxlZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoIWNoYW5nZWQpIHsKLQkJCXBtYWNfbG93X2kyY19jbG9zZSh1aTJjKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzYWJsaW5nIGNsb2NrIHNwcmVhZGluZyBvbiBpMmMgY2xvY2sgY2hpcFxuIiwKLQkJICAgICAgIGVuYWJsZSA/ICJFbiIgOiAiRGlzIik7Ci0KLQkJcG1hY19sb3dfaTJjX3NldG1vZGUodWkyYywgcG1hY19sb3dfaTJjX21vZGVfc3Rkc3ViKTsKLQkJcmMgPSBwbWFjX2xvd19pMmNfeGZlcih1aTJjLCAweGQyIHwgcG1hY19sb3dfaTJjX3dyaXRlLCAweDgwLCBidWZmZXIsIDkpOwotCQlEQkcoIndyaXRlIHJlc3VsdDogJWQsIiwgcmMpOwotCQlwbWFjX2xvd19pMmNfc2V0bW9kZSh1aTJjLCBwbWFjX2xvd19pMmNfbW9kZV9jb21iaW5lZCk7Ci0JCXJjID0gcG1hY19sb3dfaTJjX3hmZXIodWkyYywgMHhkMiB8IHBtYWNfbG93X2kyY19yZWFkLCAweDgwLCBidWZmZXIsIDkpOwotCQlEQkcoInJlYWQgcmVzdWx0OiAlZCwiLCByYyk7Ci0JCWlmIChyYyAhPSAwKSB7Ci0JCQlwbWFjX2xvd19pMmNfY2xvc2UodWkyYyk7Ci0JCQlicmVhazsKLQkJfQotCQlmb3IgKGk9MDsgaTw5OyBpKyspCi0JCQlEQkcoIiAlMDJ4IiwgYnVmZmVyW2ldKTsKLQkJcG1hY19sb3dfaTJjX2Nsb3NlKHVpMmMpOwotCQlicmVhazsKLQl9Ci19Ci0KLQogc3RhdGljIGludAogY29yZTk5X3NsZWVwKHZvaWQpCiB7CkBAIC0xOTA5LDYgKzE4MjIsOCBAQAogCXJldHVybiAwOwogfQogCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKIHN0YXRpYyBsb25nCiBjb3JlOTlfc2xlZXBfc3RhdGUoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCBsb25nIHBhcmFtLCBsb25nIHZhbHVlKQogewpAQCAtMTkzMCwxMCArMTg0NSwxMyBAQAogCWlmICgocG1hY19tYi5ib2FyZF9mbGFncyAmIFBNQUNfTUJfQ0FOX1NMRUVQKSA9PSAwKQogCQlyZXR1cm4gLUVQRVJNOwogCisjaWZkZWYgQ09ORklHX1BNCiAJaWYgKHZhbHVlID09IDEpCiAJCXJldHVybiBjb3JlOTlfc2xlZXAoKTsKIAllbHNlIGlmICh2YWx1ZSA9PSAwKQogCQlyZXR1cm4gY29yZTk5X3dha2VfdXAoKTsKKworI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCXJldHVybiAwOwogfQogCkBAIC0yMDU3LDcgKzE5NzUsOSBAQAogCXsgUE1BQ19GVFJfVVNCX0VOQUJMRSwJCWNvcmU5OV91c2JfZW5hYmxlIH0sCiAJeyBQTUFDX0ZUUl8xMzk0X0VOQUJMRSwJCWNvcmU5OV9maXJld2lyZV9lbmFibGUgfSwKIAl7IFBNQUNfRlRSXzEzOTRfQ0FCTEVfUE9XRVIsCWNvcmU5OV9maXJld2lyZV9jYWJsZV9wb3dlciB9LAorI2lmZGVmIENPTkZJR19QTQogCXsgUE1BQ19GVFJfU0xFRVBfU1RBVEUsCQljb3JlOTlfc2xlZXBfc3RhdGUgfSwKKyNlbmRpZgogI2lmZGVmIENPTkZJR19TTVAKIAl7IFBNQUNfRlRSX1JFU0VUX0NQVSwJCWNvcmU5OV9yZXNldF9jcHUgfSwKICNlbmRpZiAvKiBDT05GSUdfU01QICovCkBAIC0yNDI3LDYgKzIzNDcsMTQgQEAKIAkJUE1BQ19UWVBFX1BPV0VSTUFDX0c1X1UzTCwJZzVfZmVhdHVyZXMsCiAJCTAsCiAJfSwKKwl7CSJQb3dlck1hYzExLDIiLAkJCSJQb3dlck1hYyBHNSBEdWFsIENvcmUiLAorCQlQTUFDX1RZUEVfUE9XRVJNQUNfRzVfVTNMLAlnNV9mZWF0dXJlcywKKwkJMCwKKwl9LAorCXsJIlBvd2VyTWFjMTIsMSIsCQkJImlNYWMgRzUgKGlTaWdodCkiLAorCQlQTUFDX1RZUEVfUE9XRVJNQUNfRzVfVTNMLAlnNV9mZWF0dXJlcywKKwkJMCwKKwl9LAogCXsgICAgICAgIlJhY2tNYWMzLDEiLCAgICAgICAgICAgICAgICAgICAiWFNlcnZlIEc1IiwKIAkJUE1BQ19UWVBFX1hTRVJWRV9HNSwJCWc1X2ZlYXR1cmVzLAogCQkwLApAQCAtMjUzOSw2ICsyNDY3LDExIEBACiAJCXBtYWNfbWIubW9kZWxfbmFtZSA9ICJVbmtub3duIEsyLWJhc2VkIjsKIAkJcG1hY19tYi5mZWF0dXJlcyA9IGc1X2ZlYXR1cmVzOwogCQlicmVhazsKKwljYXNlIG1hY2lvX3NoYXN0YToKKwkJcG1hY19tYi5tb2RlbF9pZCA9IFBNQUNfVFlQRV9VTktOT1dOX1NIQVNUQTsKKwkJcG1hY19tYi5tb2RlbF9uYW1lID0gIlVua25vd24gU2hhc3RhLWJhc2VkIjsKKwkJcG1hY19tYi5mZWF0dXJlcyA9IGc1X2ZlYXR1cmVzOworCQlicmVhazsKICNlbmRpZiAvKiBDT05GSUdfUE9XRVI0ICovCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0yNjA3LDYgKzI1NDAsOCBAQAogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgcHJvYmVfdW5pbm9ydGgodm9pZCkKIHsKKwl1MzIgKmFkZHJwOworCXBoeXNfYWRkcl90IGFkZHJlc3M7CiAJdW5zaWduZWQgbG9uZyBhY3RybDsKIAogCS8qIExvY2F0ZSBjb3JlOTkgVW5pLU4gKi8KQEAgLTI2MTQsMjIgKzI1NDksMzEgQEAKIAkvKiBMb2NhdGUgRzUgdTMgKi8KIAlpZiAodW5pbm9ydGhfbm9kZSA9PSBOVUxMKSB7CiAJCXVuaW5vcnRoX25vZGUgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAidTMiKTsKLQkJdW5pbm9ydGhfdTMgPSAxOworCQl1bmlub3J0aF9tYWogPSAzOwogCX0KLQlpZiAodW5pbm9ydGhfbm9kZSAmJiB1bmlub3J0aF9ub2RlLT5uX2FkZHJzID4gMCkgewotCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSB1bmlub3J0aF9ub2RlLT5hZGRyc1swXS5hZGRyZXNzOwotCQl1bmlub3J0aF9iYXNlID0gaW9yZW1hcChhZGRyZXNzLCAweDQwMDAwKTsKLQkJdW5pbm9ydGhfcmV2ID0gaW5fYmUzMihVTl9SRUcoVU5JX05fVkVSU0lPTikpOwotCQlpZiAodW5pbm9ydGhfdTMpCi0JCQl1M19odCA9IGlvcmVtYXAoYWRkcmVzcyArIFUzX0hUX0NPTkZJR19CQVNFLCAweDEwMDApOwotCX0gZWxzZQotCQl1bmlub3J0aF9ub2RlID0gTlVMTDsKLQotCWlmICghdW5pbm9ydGhfbm9kZSkKKwkvKiBMb2NhdGUgRzUgdTQgKi8KKwlpZiAodW5pbm9ydGhfbm9kZSA9PSBOVUxMKSB7CisJCXVuaW5vcnRoX25vZGUgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAidTQiKTsKKwkJdW5pbm9ydGhfbWFqID0gNDsKKwl9CisJaWYgKHVuaW5vcnRoX25vZGUgPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgJXMgbWVtb3J5IGNvbnRyb2xsZXIgJiBob3N0IGJyaWRnZSwgcmV2aXNpb246ICVkXG4iLAotCSAgICAgICB1bmlub3J0aF91MyA/ICJVMyIgOiAiVW5pTm9ydGgiLCB1bmlub3J0aF9yZXYpOworCWFkZHJwID0gKHUzMiAqKWdldF9wcm9wZXJ0eSh1bmlub3J0aF9ub2RlLCAicmVnIiwgTlVMTCk7CisJaWYgKGFkZHJwID09IE5VTEwpCisJCXJldHVybjsKKwlhZGRyZXNzID0gb2ZfdHJhbnNsYXRlX2FkZHJlc3ModW5pbm9ydGhfbm9kZSwgYWRkcnApOworCWlmIChhZGRyZXNzID09IDApCisJCXJldHVybjsKKwl1bmlub3J0aF9iYXNlID0gaW9yZW1hcChhZGRyZXNzLCAweDQwMDAwKTsKKwl1bmlub3J0aF9yZXYgPSBpbl9iZTMyKFVOX1JFRyhVTklfTl9WRVJTSU9OKSk7CisJaWYgKHVuaW5vcnRoX21haiA9PSAzIHx8IHVuaW5vcnRoX21haiA9PSA0KQorCQl1M19odF9iYXNlID0gaW9yZW1hcChhZGRyZXNzICsgVTNfSFRfQ09ORklHX0JBU0UsIDB4MTAwMCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJGb3VuZCAlcyBtZW1vcnkgY29udHJvbGxlciAmIGhvc3QgYnJpZGdlIgorCSAgICAgICAiIEAgMHglMDh4IHJldmlzaW9uOiAweCUwMnhcbiIsIHVuaW5vcnRoX21haiA9PSAzID8gIlUzIiA6CisJICAgICAgIHVuaW5vcnRoX21haiA9PSA0ID8gIlU0IiA6ICJVbmlOb3J0aCIsCisJICAgICAgICh1bnNpZ25lZCBpbnQpYWRkcmVzcywgdW5pbm9ydGhfcmV2KTsKIAlwcmludGsoS0VSTl9JTkZPICJNYXBwZWQgYXQgMHglMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpdW5pbm9ydGhfYmFzZSk7CiAKIAkvKiBTZXQgdGhlIGFyYml0cmVyIFFBY2sgZGVsYXkgYWNjb3JkaW5nIHRvIHdoYXQgQXBwbGUgZG9lcwpAQCAtMjYzNyw3ICsyNTgxLDggQEAKIAlpZiAodW5pbm9ydGhfcmV2IDwgMHgxMSkgewogCQlhY3RybCA9IFVOX0lOKFVOSV9OX0FSQl9DVFJMKSAmIH5VTklfTl9BUkJfQ1RSTF9RQUNLX0RFTEFZX01BU0s7CiAJCWFjdHJsIHw9ICgodW5pbm9ydGhfcmV2IDwgMykgPyBVTklfTl9BUkJfQ1RSTF9RQUNLX0RFTEFZMTA1IDoKLQkJCVVOSV9OX0FSQl9DVFJMX1FBQ0tfREVMQVkpIDw8IFVOSV9OX0FSQl9DVFJMX1FBQ0tfREVMQVlfU0hJRlQ7CisJCQlVTklfTl9BUkJfQ1RSTF9RQUNLX0RFTEFZKSA8PAorCQkJVU5JX05fQVJCX0NUUkxfUUFDS19ERUxBWV9TSElGVDsKIAkJVU5fT1VUKFVOSV9OX0FSQl9DVFJMLCBhY3RybCk7CiAJfQogCkBAIC0yNjQ1LDcgKzI1OTAsOCBAQAogCSAqIHJldnMgMS41IHRvIDIuTyBhbmQgUGFuZ2VhLiBTZWVtIHRvIHRvZ2dsZSB0aGUgVW5pTiBNYXhidXMvUENJCiAJICogbWVtb3J5IHRpbWVvdXQKIAkgKi8KLQlpZiAoKHVuaW5vcnRoX3JldiA+PSAweDExICYmIHVuaW5vcnRoX3JldiA8PSAweDI0KSB8fCB1bmlub3J0aF9yZXYgPT0gMHhjMCkKKwlpZiAoKHVuaW5vcnRoX3JldiA+PSAweDExICYmIHVuaW5vcnRoX3JldiA8PSAweDI0KSB8fAorCSAgICB1bmlub3J0aF9yZXYgPT0gMHhjMCkKIAkJVU5fT1VUKDB4MjE2MCwgVU5fSU4oMHgyMTYwKSAmIDB4MDBmZmZmZmYpOwogfQogCkBAIC0yNjUzLDE4ICsyNTk5LDE3IEBACiB7CiAJc3RydWN0IGRldmljZV9ub2RlKglub2RlOwogCWludAkJCWk7Ci0Jdm9sYXRpbGUgdTMyIF9faW9tZW0gKgliYXNlOwotCXUzMioJCQlyZXZwOworCXZvbGF0aWxlIHUzMiBfX2lvbWVtCSpiYXNlOworCXUzMgkJCSphZGRycCwgKnJldnA7CisJcGh5c19hZGRyX3QJCWFkZHI7CisJdTY0CQkJc2l6ZTsKIAotCW5vZGUgPSBmaW5kX2RldmljZXMobmFtZSk7Ci0JaWYgKCFub2RlIHx8ICFub2RlLT5uX2FkZHJzKQotCQlyZXR1cm47Ci0JaWYgKGNvbXBhdCkKLQkJZG8gewotCQkJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKG5vZGUsIGNvbXBhdCkpCi0JCQkJYnJlYWs7Ci0JCQlub2RlID0gbm9kZS0+bmV4dDsKLQkJfSB3aGlsZSAobm9kZSk7CisJZm9yIChub2RlID0gTlVMTDsgKG5vZGUgPSBvZl9maW5kX25vZGVfYnlfbmFtZShub2RlLCBuYW1lKSkgIT0gTlVMTDspIHsKKwkJaWYgKCFjb21wYXQpCisJCQlicmVhazsKKwkJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKG5vZGUsIGNvbXBhdCkpCisJCQlicmVhazsKKwl9CiAJaWYgKCFub2RlKQogCQlyZXR1cm47CiAJZm9yKGk9MDsgaTxNQVhfTUFDSU9fQ0hJUFM7IGkrKykgewpAQCAtMjY3MywyMiArMjYxOCwzOCBAQAogCQlpZiAobWFjaW9fY2hpcHNbaV0ub2Zfbm9kZSA9PSBub2RlKQogCQkJcmV0dXJuOwogCX0KKwogCWlmIChpID49IE1BWF9NQUNJT19DSElQUykgewogCQlwcmludGsoS0VSTl9FUlIgInBtYWNfZmVhdHVyZTogUGxlYXNlIGluY3JlYXNlIE1BWF9NQUNJT19DSElQUyAhXG4iKTsKIAkJcHJpbnRrKEtFUk5fRVJSICJwbWFjX2ZlYXR1cmU6ICVzIHNraXBwZWRcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CiAJCXJldHVybjsKIAl9Ci0JYmFzZSA9IGlvcmVtYXAobm9kZS0+YWRkcnNbMF0uYWRkcmVzcywgbm9kZS0+YWRkcnNbMF0uc2l6ZSk7Ci0JaWYgKCFiYXNlKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicG1hY19mZWF0dXJlOiBDYW4ndCBtYXAgbWFjLWlvIGNoaXAgIVxuIik7CisJYWRkcnAgPSBvZl9nZXRfcGNpX2FkZHJlc3Mobm9kZSwgMCwgJnNpemUsIE5VTEwpOworCWlmIChhZGRycCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAicG1hY19mZWF0dXJlOiAlczogY2FuJ3QgZmluZCBiYXNlICFcbiIsCisJCSAgICAgICBub2RlLT5mdWxsX25hbWUpOwogCQlyZXR1cm47CiAJfQotCWlmICh0eXBlID09IG1hY2lvX2tleWxhcmdvKSB7CisJYWRkciA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKG5vZGUsIGFkZHJwKTsKKwlpZiAoYWRkciA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAicG1hY19mZWF0dXJlOiAlcywgY2FuJ3QgdHJhbnNsYXRlIGJhc2UgIVxuIiwKKwkJICAgICAgIG5vZGUtPmZ1bGxfbmFtZSk7CisJCXJldHVybjsKKwl9CisJYmFzZSA9IGlvcmVtYXAoYWRkciwgKHVuc2lnbmVkIGxvbmcpc2l6ZSk7CisJaWYgKCFiYXNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAicG1hY19mZWF0dXJlOiAlcywgY2FuJ3QgbWFwIG1hYy1pbyBjaGlwICFcbiIsCisJCSAgICAgICBub2RlLT5mdWxsX25hbWUpOworCQlyZXR1cm47CisJfQorCWlmICh0eXBlID09IG1hY2lvX2tleWxhcmdvIHx8IHR5cGUgPT0gbWFjaW9fa2V5bGFyZ28yKSB7CiAJCXUzMiAqZGlkID0gKHUzMiAqKWdldF9wcm9wZXJ0eShub2RlLCAiZGV2aWNlLWlkIiwgTlVMTCk7CiAJCWlmICgqZGlkID09IDB4MDAwMDAwMjUpCiAJCQl0eXBlID0gbWFjaW9fcGFuZ2VhOwogCQlpZiAoKmRpZCA9PSAweDAwMDAwMDNlKQogCQkJdHlwZSA9IG1hY2lvX2ludHJlcGlkOworCQlpZiAoKmRpZCA9PSAweDAwMDAwMDRmKQorCQkJdHlwZSA9IG1hY2lvX3NoYXN0YTsKIAl9CiAJbWFjaW9fY2hpcHNbaV0ub2Zfbm9kZQk9IG5vZGU7CiAJbWFjaW9fY2hpcHNbaV0udHlwZQk9IHR5cGU7CkBAIC0yNzg3LDcgKzI3NDgsOCBAQAogCX0KIAogI2lmZGVmIENPTkZJR19QT1dFUjQKLQlpZiAobWFjaW9fY2hpcHNbMF0udHlwZSA9PSBtYWNpb19rZXlsYXJnbzIpIHsKKwlpZiAobWFjaW9fY2hpcHNbMF0udHlwZSA9PSBtYWNpb19rZXlsYXJnbzIgfHwKKwkgICAgbWFjaW9fY2hpcHNbMF0udHlwZSA9PSBtYWNpb19zaGFzdGEpIHsKICNpZm5kZWYgQ09ORklHX1NNUAogCQkvKiBPbiBTTVAgbWFjaGluZXMgcnVubmluZyBVUCwgd2UgaGF2ZSB0aGUgc2Vjb25kIENQVSBlYXRpbmcKIAkJICogYnVzIGN5Y2xlcy4gV2UgbmVlZCB0byB0YWtlIGl0IG9mZiB0aGUgYnVzLiBUaGlzIGlzIGRvbmUKQEAgLTI4OTYsMTIgKzI4NTgsNiBAQAogCQlNQUNJT19CSUMoSEVBVEhST1dfRkNSLCBIUldfU09VTkRfUE9XRVJfTik7CiAJfQogCi0JLyogU29tZSBtYWNoaW5lIG1vZGVscyBuZWVkIHRoZSBjbG9jayBjaGlwIHRvIGJlIHByb3Blcmx5IHNldHVwIGZvcgotCSAqIGNsb2NrIHNwcmVhZGluZyBub3cuIFRoaXMgc2hvdWxkIGJlIGEgcGxhdGZvcm0gZnVuY3Rpb24gYnV0IHdlCi0JICogZG9uJ3QgZG8gdGhlc2UgYXQgdGhlIG1vbWVudAotCSAqLwotCXBtYWNfdHdlYWtfY2xvY2tfc3ByZWFkaW5nKDEpOwotCiAjZW5kaWYgLyogQ09ORklHX1BPV0VSNCAqLwogCiAJLyogT24gYWxsIG1hY2hpbmVzLCBzd2l0Y2ggbW9kZW0gJiBzZXJpYWwgcG9ydHMgb2ZmICovCkBAIC0yOTI5LDkgKzI4ODUsNiBAQAogCQlyZXR1cm47CiAJfQogCi0JLyogU2V0dXAgbG93LWxldmVsIGkyYyBzdHVmZnMgKi8KLQlwbWFjX2luaXRfbG93X2kyYygpOwotCiAJLyogUHJvYmUgbWFjaGluZSB0eXBlICovCiAJaWYgKHByb2JlX21vdGhlcmJvYXJkKCkpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVua25vd24gUG93ZXJNYWMgIVxuIik7CkBAIC0yOTQyLDI2ICsyODk1LDYgQEAKIAlzZXRfaW5pdGlhbF9mZWF0dXJlcygpOwogfQogCi1pbnQgX19pbml0IHBtYWNfZmVhdHVyZV9sYXRlX2luaXQodm9pZCkKLXsKLSNpZiAwCi0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQotCS8qIFJlcXVlc3Qgc29tZSByZXNvdXJjZXMgbGF0ZSAqLwotCWlmICh1bmlub3J0aF9ub2RlKQotCQlyZXF1ZXN0X09GX3Jlc291cmNlKHVuaW5vcnRoX25vZGUsIDAsIE5VTEwpOwotCW5wID0gZmluZF9kZXZpY2VzKCJoYW1tZXJoZWFkIik7Ci0JaWYgKG5wKQotCQlyZXF1ZXN0X09GX3Jlc291cmNlKG5wLCAwLCBOVUxMKTsKLQlucCA9IGZpbmRfZGV2aWNlcygiaW50ZXJydXB0LWNvbnRyb2xsZXIiKTsKLQlpZiAobnApCi0JCXJlcXVlc3RfT0ZfcmVzb3VyY2UobnAsIDAsIE5VTEwpOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChwbWFjX2ZlYXR1cmVfbGF0ZV9pbml0KTsKLQogI2lmIDAKIHN0YXRpYyB2b2lkIGR1bXBfSFRfc3BlZWRzKGNoYXIgKm5hbWUsIHUzMiBjZmcsIHUzMiBmcnEpCiB7CkBAIC0yOTg0LDkgKzI5MTcsOSBAQAogCXU4CXB4X2J1cywgcHhfZGV2Zm47CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpweF9ob3NlOwogCi0JKHZvaWQpaW5fYmUzMih1M19odCArIFUzX0hUX0xJTktfQ09NTUFORCk7Ci0JdWNmZyA9IGNmZyA9IGluX2JlMzIodTNfaHQgKyBVM19IVF9MSU5LX0NPTkZJRyk7Ci0JdWZyZXEgPSBmcmVxID0gaW5fYmUzMih1M19odCArIFUzX0hUX0xJTktfRlJFUSk7CisJKHZvaWQpaW5fYmUzMih1M19odF9iYXNlICsgVTNfSFRfTElOS19DT01NQU5EKTsKKwl1Y2ZnID0gY2ZnID0gaW5fYmUzMih1M19odF9iYXNlICsgVTNfSFRfTElOS19DT05GSUcpOworCXVmcmVxID0gZnJlcSA9IGluX2JlMzIodTNfaHRfYmFzZSArIFUzX0hUX0xJTktfRlJFUSk7CiAJZHVtcF9IVF9zcGVlZHMoIlUzIEh5cGVyVHJhbnNwb3J0IiwgY2ZnLCBmcmVxKTsKIAogCXBjaXhfbm9kZSA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsICJwY2kiLCAicGNpLXgiKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbG93X2kyYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9sb3dfaTJjLmMKaW5kZXggZjNmMzllOC4uNTM1YzgwMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9sb3dfaTJjLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9sb3dfaTJjLmMKQEAgLTEsMjIgKzEsMzQgQEAKIC8qCi0gKiAgYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfbG93X2kyYy5jCisgKiBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2xvd19pMmMuYwogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDMgQmVuLiBIZXJyZW5zY2htaWR0IChiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmcpCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgQmVuLiBIZXJyZW5zY2htaWR0IChiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmcpCiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKgotICogIFRoaXMgZmlsZSBjb250YWlucyBzb21lIGxvdy1sZXZlbCBpMmMgYWNjZXNzIHJvdXRpbmVzIHRoYXQKLSAqICBuZWVkIHRvIGJlIHVzZWQgYnkgdmFyaW91cyBiaXRzIG9mIHRoZSBQb3dlck1hYyBwbGF0Zm9ybSBjb2RlCi0gKiAgYXQgdGltZXMgd2hlcmUgdGhlIHJlYWwgYXN5bmNocm9ub3VzICYgaW50ZXJydXB0IGRyaXZlbiBkcml2ZXIKLSAqICBjYW5ub3QgYmUgdXNlZC4gVGhlIEFQSSBib3Jyb3dzIHNvbWUgc2VtYW50aWNzIGZyb20gdGhlIGRhcndpbgotICogIGRyaXZlciBpbiBvcmRlciB0byBlYXNlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcGxhdGZvcm0KLSAqICBwcm9wZXJ0aWVzIHBhcnNlcgorICogVGhlIGxpbnV4IGkyYyBsYXllciBpc24ndCBjb21wbGV0ZWx5IHN1aXRhYmxlIGZvciBvdXIgbmVlZHMgZm9yIHZhcmlvdXMKKyAqIHJlYXNvbnMgcmFuZ2luZyBmcm9tIHRvbyBsYXRlIGluaXRpYWxpc2F0aW9uIHRvIHNlbWFudGljcyBub3QgcGVyZmVjdGx5CisgKiBtYXRjaGluZyBzb21lIHJlcXVpcmVtZW50cyBvZiB0aGUgYXBwbGUgcGxhdGZvcm0gZnVuY3Rpb25zIGV0Yy4uLgorICoKKyAqIFRoaXMgZmlsZSB0aHVzIHByb3ZpZGVzIGEgc2ltcGxlIGxvdyBsZXZlbCB1bmlmaWVkIGkyYyBpbnRlcmZhY2UgZm9yCisgKiBwb3dlcm1hYyB0aGF0IGNvdmVycyB0aGUgdmFyaW91cyB0eXBlcyBvZiBpMmMgYnVzc2VzIHVzZWQgaW4gQXBwbGUgbWFjaGluZXMuCisgKiBGb3Igbm93LCBrZXl3ZXN0LCBQTVUgYW5kIFNNVSwgdGhvdWdoIHdlIGNvdWxkIGFkZCBDdWRhLCBvciBvdGhlciBiaXQKKyAqIGJhbmdpbmcgYnVzc2VzIGZvdW5kIG9uIG9sZGVyIGNoaXBzdGVzIGluIGVhcmxpZXIgbWFjaGluZXMgaWYgd2UgZXZlciBuZWVkCisgKiBvbmUgb2YgdGhlbS4KKyAqCisgKiBUaGUgZHJpdmVycyBpbiB0aGlzIGZpbGUgYXJlIHN5bmNocm9ub3VzL2Jsb2NraW5nLiBJbiBhZGRpdGlvbiwgdGhlCisgKiBrZXl3ZXN0IG9uZSBpcyBmYWlybHkgc2xvdyBkdWUgdG8gdGhlIHVzZSBvZiBtc2xlZXAgaW5zdGVhZCBvZiBpbnRlcnJ1cHRzCisgKiBhcyB0aGUgaW50ZXJydXB0IGlzIGN1cnJlbnRseSB1c2VkIGJ5IGkyYy1rZXl3ZXN0LiBJbiB0aGUgbG9uZyBydW4sIHdlCisgKiBtaWdodCB3YW50IHRvIGdldCByaWQgb2YgdGhvc2UgaGlnaC1sZXZlbCBpbnRlcmZhY2VzIHRvIGxpbnV4IGkyYyBsYXllcgorICogZWl0aGVyIGNvbXBsZXRlbHkgKGNvbnZlcnRpbmcgYWxsIGRyaXZlcnMpIG9yIHJlcGxhY2luZyB0aGVtIGFsbCB3aXRoIGEKKyAqIHNpbmdsZSBzdHViIGRyaXZlciBvbiB0b3Agb2YgdGhpcyBvbmUuIE9uY2UgZG9uZSwgdGhlIGludGVycnVwdCB3aWxsIGJlCisgKiBhdmFpbGFibGUgZm9yIG91ciB1c2UuCiAgKi8KIAogI3VuZGVmIERFQlVHCisjdW5kZWYgREVCVUdfTE9XCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtMjUsNjYgKzM3LDkxIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYWRiLmg+CiAjaW5jbHVkZSA8bGludXgvcG11Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8YXNtL2tleWxhcmdvLmg+CiAjaW5jbHVkZSA8YXNtL3VuaW5vcnRoLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9zbXUuaD4KKyNpbmNsdWRlIDxhc20vcG1hY19wZnVuYy5oPgogI2luY2x1ZGUgPGFzbS9wbWFjX2xvd19pMmMuaD4KIAotI2RlZmluZSBNQVhfTE9XX0kyQ19IT1NUCTQKLQogI2lmZGVmIERFQlVHCiAjZGVmaW5lIERCRyh4Li4uKSBkbyB7XAotCQlwcmludGsoS0VSTl9ERUJVRyAiS1c6IiB4KTsJXAorCQlwcmludGsoS0VSTl9ERUJVRyAibG93X2kyYzoiIHgpOwlcCiAJfSB3aGlsZSgwKQogI2Vsc2UKICNkZWZpbmUgREJHKHguLi4pCiAjZW5kaWYKIAotc3RydWN0IGxvd19pMmNfaG9zdDsKKyNpZmRlZiBERUJVR19MT1cKKyNkZWZpbmUgREJHX0xPVyh4Li4uKSBkbyB7XAorCQlwcmludGsoS0VSTl9ERUJVRyAibG93X2kyYzoiIHgpOwlcCisJfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgREJHX0xPVyh4Li4uKQorI2VuZGlmCiAKLXR5cGVkZWYgaW50ICgqbG93X2kyY19mdW5jX3QpKHN0cnVjdCBsb3dfaTJjX2hvc3QgKmhvc3QsIHU4IGFkZHIsIHU4IHN1YiwgdTggKmRhdGEsIGludCBsZW4pOwogCi1zdHJ1Y3QgbG93X2kyY19ob3N0CitzdGF0aWMgaW50IHBtYWNfaTJjX2ZvcmNlX3BvbGwgPSAxOworCisvKgorICogQSBidXMgc3RydWN0dXJlLiBFYWNoIGJ1cyBpbiB0aGUgc3lzdGVtIGhhcyBzdWNoIGEgc3RydWN0dXJlIGFzc29jaWF0ZWQuCisgKi8KK3N0cnVjdCBwbWFjX2kyY19idXMKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUJKm5wOwkJLyogT0YgZGV2aWNlIG5vZGUgKi8KLQlzdHJ1Y3Qgc2VtYXBob3JlCW11dGV4OwkJLyogQWNjZXNzIG11dGV4IGZvciB1c2UgYnkgaTJjLWtleXdlc3QgKi8KLQlsb3dfaTJjX2Z1bmNfdAkJZnVuYzsJCS8qIEFjY2VzcyBmdW5jdGlvbiAqLwotCXVuc2lnbmVkIGludAkJaXNfb3BlbiA6IDE7CS8qIFBvb3IgbWFuJ3MgYWNjZXNzIGNvbnRyb2wgKi8KLQlpbnQJCQltb2RlOwkJLyogQ3VycmVudCBtb2RlICovCi0JaW50CQkJY2hhbm5lbDsJLyogQ3VycmVudCBjaGFubmVsICovCi0JaW50CQkJbnVtX2NoYW5uZWxzOwkvKiBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KLQl2b2lkIF9faW9tZW0JCSpiYXNlOwkJLyogRm9yIGtleXdlc3QtaTJjLCBiYXNlIGFkZHJlc3MgKi8KLQlpbnQJCQlic3RlcHM7CQkvKiBBbmQgcmVnaXN0ZXIgc3RlcHBpbmcgKi8KLQlpbnQJCQlzcGVlZDsJCS8qIEFuZCBzcGVlZCAqLworCXN0cnVjdCBsaXN0X2hlYWQJbGluazsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUJKmNvbnRyb2xsZXI7CisJc3RydWN0IGRldmljZV9ub2RlCSpidXNub2RlOworCWludAkJCXR5cGU7CisJaW50CQkJZmxhZ3M7CisJc3RydWN0IGkyY19hZGFwdGVyCSphZGFwdGVyOworCXZvaWQJCQkqaG9zdGRhdGE7CisJaW50CQkJY2hhbm5lbDsJLyogc29tZSBob3N0cyBoYXZlIG11bHRpcGxlICovCisJaW50CQkJbW9kZTsJCS8qIGN1cnJlbnQgbW9kZSAqLworCXN0cnVjdCBzZW1hcGhvcmUJc2VtOworCWludAkJCW9wZW5lZDsKKwlpbnQJCQlwb2xsZWQ7CQkvKiBvcGVuIG1vZGUgKi8KKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwbGF0Zm9ybV9kZXY7CisKKwkvKiBvcHMgKi8KKwlpbnQgKCpvcGVuKShzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXMpOworCXZvaWQgKCpjbG9zZSkoc3RydWN0IHBtYWNfaTJjX2J1cyAqYnVzKTsKKwlpbnQgKCp4ZmVyKShzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXMsIHU4IGFkZHJkaXIsIGludCBzdWJzaXplLAorCQkgICAgdTMyIHN1YmFkZHIsIHU4ICpkYXRhLCBpbnQgbGVuKTsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbG93X2kyY19ob3N0CWxvd19pMmNfaG9zdHNbTUFYX0xPV19JMkNfSE9TVF07CitzdGF0aWMgTElTVF9IRUFEKHBtYWNfaTJjX2J1c3Nlcyk7CiAKLS8qIE5vIGxvY2tpbmcgaXMgbmVjZXNzYXJ5IG9uIGFsbG9jYXRpb24sIHdlIGFyZSBydW5uaW5nIHdheSBiZWZvcmUKLSAqIGFueXRoaW5nIGNhbiByYWNlIHdpdGggdXMKKy8qCisgKiBLZXl3ZXN0IGltcGxlbWVudGF0aW9uCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbG93X2kyY19ob3N0ICpmaW5kX2xvd19pMmNfaG9zdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQorCitzdHJ1Y3QgcG1hY19pMmNfaG9zdF9rdwogewotCWludCBpOworCXN0cnVjdCBzZW1hcGhvcmUJbXV0ZXg7CQkvKiBBY2Nlc3MgbXV0ZXggZm9yIHVzZSBieQorCQkJCQkJICogaTJjLWtleXdlc3QgKi8KKwl2b2lkIF9faW9tZW0JCSpiYXNlOwkJLyogcmVnaXN0ZXIgYmFzZSBhZGRyZXNzICovCisJaW50CQkJYnN0ZXBzOwkJLyogcmVnaXN0ZXIgc3RlcHBpbmcgKi8KKwlpbnQJCQlzcGVlZDsJCS8qIHNwZWVkICovCisJaW50CQkJaXJxOworCXU4CQkJKmRhdGE7CisJdW5zaWduZWQJCWxlbjsKKwlpbnQJCQlzdGF0ZTsKKwlpbnQJCQlydzsKKwlpbnQJCQlwb2xsZWQ7CisJaW50CQkJcmVzdWx0OworCXN0cnVjdCBjb21wbGV0aW9uCWNvbXBsZXRlOworCXNwaW5sb2NrX3QJCWxvY2s7CisJc3RydWN0IHRpbWVyX2xpc3QJdGltZW91dF90aW1lcjsKK307CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xPV19JMkNfSE9TVDsgaSsrKQotCQlpZiAobG93X2kyY19ob3N0c1tpXS5ucCA9PSBucCkKLQkJCXJldHVybiAmbG93X2kyY19ob3N0c1tpXTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqCi0gKiBpMmMta2V5d2VzdCBpbXBsZW1lbnRhdGlvbiAoVW5pTm9ydGgsIFUyLCBVMywgS2V5bGFyZ28ncykKLSAqCi0gKi8KLQotLyoKLSAqIEtleXdlc3QgaTJjIGRlZmluaXRpb25zIGJvcnJvd2VkIGZyb20gZHJpdmVycy9pMmMvaTJjLWtleXdlc3QuaCwKLSAqIHNob3VsZCBiZSBtb3ZlZCBzb21ld2hlcmUgaW4gaW5jbHVkZS9hc20tcHBjLwotICovCiAvKiBSZWdpc3RlciBpbmRpY2VzICovCiB0eXBlZGVmIGVudW0gewogCXJlZ19tb2RlID0gMCwKQEAgLTk3LDYgKzEzNCw4IEBACiAJcmVnX2RhdGEKIH0gcmVnX3Q7CiAKKy8qIFRoZSBUdW1ibGVyIGF1ZGlvIGVxdWFsaXplciBjYW4gYmUgcmVhbGx5IHNsb3cgc29tZXRpbWVzICovCisjZGVmaW5lIEtXX1BPTExfVElNRU9VVAkJKDIqSFopCiAKIC8qIE1vZGUgcmVnaXN0ZXIgKi8KICNkZWZpbmUgS1dfSTJDX01PREVfMTAwS0haCTB4MDAKQEAgLTE0MCw4ICsxNzksOSBAQAogfTsKIAogI2RlZmluZSBXUk9OR19TVEFURShuYW1lKSBkbyB7XAotCQlwcmludGsoS0VSTl9ERUJVRyAiS1c6IHdyb25nIHN0YXRlLiBHb3QgJXMsIHN0YXRlOiAlcyAoaXNyOiAlMDJ4KVxuIiwgXAotCQkgICAgICAgbmFtZSwgX19rd19zdGF0ZV9uYW1lc1tzdGF0ZV0sIGlzcik7IFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgIktXOiB3cm9uZyBzdGF0ZS4gR290ICVzLCBzdGF0ZTogJXMgIiBcCisJCSAgICAgICAiKGlzcjogJTAyeClcbiIsCVwKKwkJICAgICAgIG5hbWUsIF9fa3dfc3RhdGVfbmFtZXNbaG9zdC0+c3RhdGVdLCBpc3IpOyBcCiAJfSB3aGlsZSgwKQogCiBzdGF0aWMgY29uc3QgY2hhciAqX19rd19zdGF0ZV9uYW1lc1tdID0gewpAQCAtMTUzLDEyMCArMTkzLDEzNyBAQAogCSJzdGF0ZV9kZWFkIgogfTsKIAotc3RhdGljIGlubGluZSB1OCBfX2t3X3JlYWRfcmVnKHN0cnVjdCBsb3dfaTJjX2hvc3QgKmhvc3QsIHJlZ190IHJlZykKK3N0YXRpYyBpbmxpbmUgdTggX19rd19yZWFkX3JlZyhzdHJ1Y3QgcG1hY19pMmNfaG9zdF9rdyAqaG9zdCwgcmVnX3QgcmVnKQogewogCXJldHVybiByZWFkYihob3N0LT5iYXNlICsgKCgodW5zaWduZWQgaW50KXJlZykgPDwgaG9zdC0+YnN0ZXBzKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2t3X3dyaXRlX3JlZyhzdHJ1Y3QgbG93X2kyY19ob3N0ICpob3N0LCByZWdfdCByZWcsIHU4IHZhbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2t3X3dyaXRlX3JlZyhzdHJ1Y3QgcG1hY19pMmNfaG9zdF9rdyAqaG9zdCwKKwkJCQkgIHJlZ190IHJlZywgdTggdmFsKQogewogCXdyaXRlYih2YWwsIGhvc3QtPmJhc2UgKyAoKCh1bnNpZ25lZClyZWcpIDw8IGhvc3QtPmJzdGVwcykpOwogCSh2b2lkKV9fa3dfcmVhZF9yZWcoaG9zdCwgcmVnX3N1YmFkZHIpOwogfQogCi0jZGVmaW5lIGt3X3dyaXRlX3JlZyhyZWcsIHZhbCkJX19rd193cml0ZV9yZWcoaG9zdCwgcmVnLCB2YWwpIAotI2RlZmluZSBrd19yZWFkX3JlZyhyZWcpCV9fa3dfcmVhZF9yZWcoaG9zdCwgcmVnKSAKKyNkZWZpbmUga3dfd3JpdGVfcmVnKHJlZywgdmFsKQlfX2t3X3dyaXRlX3JlZyhob3N0LCByZWcsIHZhbCkKKyNkZWZpbmUga3dfcmVhZF9yZWcocmVnKQlfX2t3X3JlYWRfcmVnKGhvc3QsIHJlZykKIAotCi0vKiBEb24ndCBzY2hlZHVsZSwgdGhlIGc1IGZhbiBjb250cm9sbGVyIGlzIHRvbwotICogdGltaW5nIHNlbnNpdGl2ZQotICovCi1zdGF0aWMgdTgga3dfd2FpdF9pbnRlcnJ1cHQoc3RydWN0IGxvd19pMmNfaG9zdCogaG9zdCkKK3N0YXRpYyB1OCBrd19pMmNfd2FpdF9pbnRlcnJ1cHQoc3RydWN0IHBtYWNfaTJjX2hvc3Rfa3cgKmhvc3QpCiB7CiAJaW50IGksIGo7CiAJdTggaXNyOwogCQotCWZvciAoaSA9IDA7IGkgPCAxMDAwMDA7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKIAkJaXNyID0ga3dfcmVhZF9yZWcocmVnX2lzcikgJiBLV19JMkNfSVJRX01BU0s7CiAJCWlmIChpc3IgIT0gMCkKIAkJCXJldHVybiBpc3I7CiAKIAkJLyogVGhpcyBjb2RlIGlzIHVzZWQgd2l0aCB0aGUgdGltZWJhc2UgZnJvemVuLCB3ZSBjYW5ub3QgcmVseQotCQkgKiBvbiB1ZGVsYXkgISBGb3Igbm93LCBqdXN0IHVzZSBhIGJvZ3VzIGxvb3AKKwkJICogb24gdWRlbGF5IG5vciBzY2hlZHVsZSB3aGVuIGluIHBvbGxlZCBtb2RlICEKKwkJICogRm9yIG5vdywganVzdCB1c2UgYSBib2d1cyBsb29wLi4uLgogCQkgKi8KLQkJZm9yIChqID0gMTsgaiA8IDEwMDAwOyBqKyspCi0JCQltYigpOworCQlpZiAoaG9zdC0+cG9sbGVkKSB7CisJCQlmb3IgKGogPSAxOyBqIDwgMTAwMDAwOyBqKyspCisJCQkJbWIoKTsKKwkJfSBlbHNlCisJCQltc2xlZXAoMSk7CiAJfQogCXJldHVybiBpc3I7CiB9CiAKLXN0YXRpYyBpbnQga3dfaGFuZGxlX2ludGVycnVwdChzdHJ1Y3QgbG93X2kyY19ob3N0ICpob3N0LCBpbnQgc3RhdGUsIGludCBydywgaW50ICpyYywgdTggKipkYXRhLCBpbnQgKmxlbiwgdTggaXNyKQorc3RhdGljIHZvaWQga3dfaTJjX2hhbmRsZV9pbnRlcnJ1cHQoc3RydWN0IHBtYWNfaTJjX2hvc3Rfa3cgKmhvc3QsIHU4IGlzcikKIHsKIAl1OCBhY2s7CiAKLQlEQkcoImt3X2hhbmRsZV9pbnRlcnJ1cHQoJXMsIGlzcjogJXgpXG4iLCBfX2t3X3N0YXRlX25hbWVzW3N0YXRlXSwgaXNyKTsKKwlEQkdfTE9XKCJrd19oYW5kbGVfaW50ZXJydXB0KCVzLCBpc3I6ICV4KVxuIiwKKwkJX19rd19zdGF0ZV9uYW1lc1tob3N0LT5zdGF0ZV0sIGlzcik7CisKKwlpZiAoaG9zdC0+c3RhdGUgPT0gc3RhdGVfaWRsZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJsb3dfaTJjOiBLZXl3ZXN0IGdvdCBhbiBvdXQgb2Ygc3RhdGUiCisJCSAgICAgICAiIGludGVycnVwdCwgaWdub3JpbmdcbiIpOworCQlrd193cml0ZV9yZWcocmVnX2lzciwgaXNyKTsKKwkJcmV0dXJuOworCX0KIAogCWlmIChpc3IgPT0gMCkgewotCQlpZiAoc3RhdGUgIT0gc3RhdGVfc3RvcCkgewotCQkJREJHKCJLVzogVGltZW91dCAhXG4iKTsKLQkJCSpyYyA9IC1FSU87CisJCWlmIChob3N0LT5zdGF0ZSAhPSBzdGF0ZV9zdG9wKSB7CisJCQlEQkdfTE9XKCJLVzogVGltZW91dCAhXG4iKTsKKwkJCWhvc3QtPnJlc3VsdCA9IC1FSU87CiAJCQlnb3RvIHN0b3A7CiAJCX0KLQkJaWYgKHN0YXRlID09IHN0YXRlX3N0b3ApIHsKKwkJaWYgKGhvc3QtPnN0YXRlID09IHN0YXRlX3N0b3ApIHsKIAkJCWFjayA9IGt3X3JlYWRfcmVnKHJlZ19zdGF0dXMpOwotCQkJaWYgKCEoYWNrICYgS1dfSTJDX1NUQVRfQlVTWSkpIHsKLQkJCQlzdGF0ZSA9IHN0YXRlX2lkbGU7Ci0JCQkJa3dfd3JpdGVfcmVnKHJlZ19pZXIsIDB4MDApOwotCQkJfQorCQkJaWYgKGFjayAmIEtXX0kyQ19TVEFUX0JVU1kpCisJCQkJa3dfd3JpdGVfcmVnKHJlZ19zdGF0dXMsIDApOworCQkJaG9zdC0+c3RhdGUgPSBzdGF0ZV9pZGxlOworCQkJa3dfd3JpdGVfcmVnKHJlZ19pZXIsIDB4MDApOworCQkJaWYgKCFob3N0LT5wb2xsZWQpCisJCQkJY29tcGxldGUoJmhvc3QtPmNvbXBsZXRlKTsKIAkJfQotCQlyZXR1cm4gc3RhdGU7CisJCXJldHVybjsKIAl9CiAKIAlpZiAoaXNyICYgS1dfSTJDX0lSUV9BRERSKSB7CiAJCWFjayA9IGt3X3JlYWRfcmVnKHJlZ19zdGF0dXMpOwotCQlpZiAoc3RhdGUgIT0gc3RhdGVfYWRkcikgeworCQlpZiAoaG9zdC0+c3RhdGUgIT0gc3RhdGVfYWRkcikgewogCQkJa3dfd3JpdGVfcmVnKHJlZ19pc3IsIEtXX0kyQ19JUlFfQUREUik7CiAJCQlXUk9OR19TVEFURSgiS1dfSTJDX0lSUV9BRERSIik7IAotCQkJKnJjID0gLUVJTzsKKwkJCWhvc3QtPnJlc3VsdCA9IC1FSU87CiAJCQlnb3RvIHN0b3A7CiAJCX0KLQkJaWYgKChhY2sgJiBLV19JMkNfU1RBVF9MQVNUX0FBSykgPT0gMCkgewkJCQotCQkJKnJjID0gLUVOT0RFVjsKLQkJCURCRygiS1c6IE5BSyBvbiBhZGRyZXNzXG4iKTsKLQkJCXJldHVybiBzdGF0ZV9zdG9wOwkJICAgICAKKwkJaWYgKChhY2sgJiBLV19JMkNfU1RBVF9MQVNUX0FBSykgPT0gMCkgeworCQkJaG9zdC0+cmVzdWx0ID0gLUVOT0RFVjsKKwkJCURCR19MT1coIktXOiBOQUsgb24gYWRkcmVzc1xuIik7CisJCQlob3N0LT5zdGF0ZSA9IHN0YXRlX3N0b3A7CisJCQlyZXR1cm47CiAJCX0gZWxzZSB7Ci0JCQlpZiAocncpIHsKLQkJCQlzdGF0ZSA9IHN0YXRlX3JlYWQ7Ci0JCQkJaWYgKCpsZW4gPiAxKQotCQkJCQlrd193cml0ZV9yZWcocmVnX2NvbnRyb2wsIEtXX0kyQ19DVExfQUFLKTsKKwkJCWlmIChob3N0LT5sZW4gPT0gMCkgeworCQkJCWt3X3dyaXRlX3JlZyhyZWdfaXNyLCBLV19JMkNfSVJRX0FERFIpOworCQkJCWdvdG8gc3RvcDsKKwkJCX0KKwkJCWlmIChob3N0LT5ydykgeworCQkJCWhvc3QtPnN0YXRlID0gc3RhdGVfcmVhZDsKKwkJCQlpZiAoaG9zdC0+bGVuID4gMSkKKwkJCQkJa3dfd3JpdGVfcmVnKHJlZ19jb250cm9sLAorCQkJCQkJICAgICBLV19JMkNfQ1RMX0FBSyk7CiAJCQl9IGVsc2UgewotCQkJCXN0YXRlID0gc3RhdGVfd3JpdGU7Ci0JCQkJa3dfd3JpdGVfcmVnKHJlZ19kYXRhLCAqKmRhdGEpOwotCQkJCSgqZGF0YSkrKzsgKCpsZW4pLS07CisJCQkJaG9zdC0+c3RhdGUgPSBzdGF0ZV93cml0ZTsKKwkJCQlrd193cml0ZV9yZWcocmVnX2RhdGEsICooaG9zdC0+ZGF0YSsrKSk7CisJCQkJaG9zdC0+bGVuLS07CiAJCQl9CiAJCX0KIAkJa3dfd3JpdGVfcmVnKHJlZ19pc3IsIEtXX0kyQ19JUlFfQUREUik7CiAJfQogCiAJaWYgKGlzciAmIEtXX0kyQ19JUlFfREFUQSkgewotCQlpZiAoc3RhdGUgPT0gc3RhdGVfcmVhZCkgewotCQkJKipkYXRhID0ga3dfcmVhZF9yZWcocmVnX2RhdGEpOwotCQkJKCpkYXRhKSsrOyAoKmxlbiktLTsKKwkJaWYgKGhvc3QtPnN0YXRlID09IHN0YXRlX3JlYWQpIHsKKwkJCSooaG9zdC0+ZGF0YSsrKSA9IGt3X3JlYWRfcmVnKHJlZ19kYXRhKTsKKwkJCWhvc3QtPmxlbi0tOwogCQkJa3dfd3JpdGVfcmVnKHJlZ19pc3IsIEtXX0kyQ19JUlFfREFUQSk7Ci0JCQlpZiAoKCpsZW4pID09IDApCi0JCQkJc3RhdGUgPSBzdGF0ZV9zdG9wOwotCQkJZWxzZSBpZiAoKCpsZW4pID09IDEpCisJCQlpZiAoaG9zdC0+bGVuID09IDApCisJCQkJaG9zdC0+c3RhdGUgPSBzdGF0ZV9zdG9wOworCQkJZWxzZSBpZiAoaG9zdC0+bGVuID09IDEpCiAJCQkJa3dfd3JpdGVfcmVnKHJlZ19jb250cm9sLCAwKTsKLQkJfSBlbHNlIGlmIChzdGF0ZSA9PSBzdGF0ZV93cml0ZSkgeworCQl9IGVsc2UgaWYgKGhvc3QtPnN0YXRlID09IHN0YXRlX3dyaXRlKSB7CiAJCQlhY2sgPSBrd19yZWFkX3JlZyhyZWdfc3RhdHVzKTsKIAkJCWlmICgoYWNrICYgS1dfSTJDX1NUQVRfTEFTVF9BQUspID09IDApIHsKLQkJCQlEQkcoIktXOiBuYWNrIG9uIGRhdGEgd3JpdGVcbiIpOwotCQkJCSpyYyA9IC1FSU87CisJCQkJREJHX0xPVygiS1c6IG5hY2sgb24gZGF0YSB3cml0ZVxuIik7CisJCQkJaG9zdC0+cmVzdWx0ID0gLUVJTzsKIAkJCQlnb3RvIHN0b3A7Ci0JCQl9IGVsc2UgaWYgKCpsZW4pIHsKLQkJCQlrd193cml0ZV9yZWcocmVnX2RhdGEsICoqZGF0YSk7Ci0JCQkJKCpkYXRhKSsrOyAoKmxlbiktLTsKKwkJCX0gZWxzZSBpZiAoaG9zdC0+bGVuKSB7CisJCQkJa3dfd3JpdGVfcmVnKHJlZ19kYXRhLCAqKGhvc3QtPmRhdGErKykpOworCQkJCWhvc3QtPmxlbi0tOwogCQkJfSBlbHNlIHsKIAkJCQlrd193cml0ZV9yZWcocmVnX2NvbnRyb2wsIEtXX0kyQ19DVExfU1RPUCk7Ci0JCQkJc3RhdGUgPSBzdGF0ZV9zdG9wOwotCQkJCSpyYyA9IDA7CisJCQkJaG9zdC0+c3RhdGUgPSBzdGF0ZV9zdG9wOworCQkJCWhvc3QtPnJlc3VsdCA9IDA7CiAJCQl9CiAJCQlrd193cml0ZV9yZWcocmVnX2lzciwgS1dfSTJDX0lSUV9EQVRBKTsKIAkJfSBlbHNlIHsKIAkJCWt3X3dyaXRlX3JlZyhyZWdfaXNyLCBLV19JMkNfSVJRX0RBVEEpOwogCQkJV1JPTkdfU1RBVEUoIktXX0kyQ19JUlFfREFUQSIpOyAKLQkJCWlmIChzdGF0ZSAhPSBzdGF0ZV9zdG9wKSB7Ci0JCQkJKnJjID0gLUVJTzsKKwkJCWlmIChob3N0LT5zdGF0ZSAhPSBzdGF0ZV9zdG9wKSB7CisJCQkJaG9zdC0+cmVzdWx0ID0gLUVJTzsKIAkJCQlnb3RvIHN0b3A7CiAJCQl9CiAJCX0KQEAgLTI3NCw5OCArMzMxLDE5NCBAQAogCiAJaWYgKGlzciAmIEtXX0kyQ19JUlFfU1RPUCkgewogCQlrd193cml0ZV9yZWcocmVnX2lzciwgS1dfSTJDX0lSUV9TVE9QKTsKLQkJaWYgKHN0YXRlICE9IHN0YXRlX3N0b3ApIHsKKwkJaWYgKGhvc3QtPnN0YXRlICE9IHN0YXRlX3N0b3ApIHsKIAkJCVdST05HX1NUQVRFKCJLV19JMkNfSVJRX1NUT1AiKTsKLQkJCSpyYyA9IC1FSU87CisJCQlob3N0LT5yZXN1bHQgPSAtRUlPOwogCQl9Ci0JCXJldHVybiBzdGF0ZV9pZGxlOworCQlob3N0LT5zdGF0ZSA9IHN0YXRlX2lkbGU7CisJCWlmICghaG9zdC0+cG9sbGVkKQorCQkJY29tcGxldGUoJmhvc3QtPmNvbXBsZXRlKTsKIAl9CiAKIAlpZiAoaXNyICYgS1dfSTJDX0lSUV9TVEFSVCkKIAkJa3dfd3JpdGVfcmVnKHJlZ19pc3IsIEtXX0kyQ19JUlFfU1RBUlQpOwogCi0JcmV0dXJuIHN0YXRlOwotCisJcmV0dXJuOwogIHN0b3A6CiAJa3dfd3JpdGVfcmVnKHJlZ19jb250cm9sLCBLV19JMkNfQ1RMX1NUT1ApOwkKLQlyZXR1cm4gc3RhdGVfc3RvcDsKKwlob3N0LT5zdGF0ZSA9IHN0YXRlX3N0b3A7CisJcmV0dXJuOwogfQogCi1zdGF0aWMgaW50IGtleXdlc3RfbG93X2kyY19mdW5jKHN0cnVjdCBsb3dfaTJjX2hvc3QgKmhvc3QsIHU4IGFkZHIsIHU4IHN1YmFkZHIsIHU4ICpkYXRhLCBpbnQgbGVuKQorLyogSW50ZXJydXB0IGhhbmRsZXIgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBrd19pMmNfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CisJc3RydWN0IHBtYWNfaTJjX2hvc3Rfa3cgKmhvc3QgPSBkZXZfaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CisJZGVsX3RpbWVyKCZob3N0LT50aW1lb3V0X3RpbWVyKTsKKwlrd19pMmNfaGFuZGxlX2ludGVycnVwdChob3N0LCBrd19yZWFkX3JlZyhyZWdfaXNyKSk7CisJaWYgKGhvc3QtPnN0YXRlICE9IHN0YXRlX2lkbGUpIHsKKwkJaG9zdC0+dGltZW91dF90aW1lci5leHBpcmVzID0gamlmZmllcyArIEtXX1BPTExfVElNRU9VVDsKKwkJYWRkX3RpbWVyKCZob3N0LT50aW1lb3V0X3RpbWVyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQga3dfaTJjX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBwbWFjX2kyY19ob3N0X2t3ICpob3N0ID0gKHN0cnVjdCBwbWFjX2kyY19ob3N0X2t3ICopZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKKwlrd19pMmNfaGFuZGxlX2ludGVycnVwdChob3N0LCBrd19yZWFkX3JlZyhyZWdfaXNyKSk7CisJaWYgKGhvc3QtPnN0YXRlICE9IHN0YXRlX2lkbGUpIHsKKwkJaG9zdC0+dGltZW91dF90aW1lci5leHBpcmVzID0gamlmZmllcyArIEtXX1BPTExfVElNRU9VVDsKKwkJYWRkX3RpbWVyKCZob3N0LT50aW1lb3V0X3RpbWVyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGt3X2kyY19vcGVuKHN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgcG1hY19pMmNfaG9zdF9rdyAqaG9zdCA9IGJ1cy0+aG9zdGRhdGE7CisJZG93bigmaG9zdC0+bXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBrd19pMmNfY2xvc2Uoc3RydWN0IHBtYWNfaTJjX2J1cyAqYnVzKQoreworCXN0cnVjdCBwbWFjX2kyY19ob3N0X2t3ICpob3N0ID0gYnVzLT5ob3N0ZGF0YTsKKwl1cCgmaG9zdC0+bXV0ZXgpOworfQorCitzdGF0aWMgaW50IGt3X2kyY194ZmVyKHN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cywgdTggYWRkcmRpciwgaW50IHN1YnNpemUsCisJCSAgICAgICB1MzIgc3ViYWRkciwgdTggKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IHBtYWNfaTJjX2hvc3Rfa3cgKmhvc3QgPSBidXMtPmhvc3RkYXRhOwogCXU4IG1vZGVfcmVnID0gaG9zdC0+c3BlZWQ7Ci0JaW50IHN0YXRlID0gc3RhdGVfYWRkcjsKLQlpbnQgcmMgPSAwOworCWludCB1c2VfaXJxID0gaG9zdC0+aXJxICE9IE5PX0lSUSAmJiAhYnVzLT5wb2xsZWQ7CiAKIAkvKiBTZXR1cCBtb2RlICYgc3ViYWRkcmVzcyBpZiBhbnkgKi8KLQlzd2l0Y2goaG9zdC0+bW9kZSkgewotCWNhc2UgcG1hY19sb3dfaTJjX21vZGVfZHVtYjoKLQkJcHJpbnRrKEtFUk5fRVJSICJsb3dfaTJjOiBEdW1iIG1vZGUgbm90IHN1cHBvcnRlZCAhXG4iKTsKKwlzd2l0Y2goYnVzLT5tb2RlKSB7CisJY2FzZSBwbWFjX2kyY19tb2RlX2R1bWI6CiAJCXJldHVybiAtRUlOVkFMOwotCWNhc2UgcG1hY19sb3dfaTJjX21vZGVfc3RkOgorCWNhc2UgcG1hY19pMmNfbW9kZV9zdGQ6CiAJCW1vZGVfcmVnIHw9IEtXX0kyQ19NT0RFX1NUQU5EQVJEOworCQlpZiAoc3Vic2l6ZSAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWJyZWFrOwotCWNhc2UgcG1hY19sb3dfaTJjX21vZGVfc3Rkc3ViOgorCWNhc2UgcG1hY19pMmNfbW9kZV9zdGRzdWI6CiAJCW1vZGVfcmVnIHw9IEtXX0kyQ19NT0RFX1NUQU5EQVJEU1VCOworCQlpZiAoc3Vic2l6ZSAhPSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWJyZWFrOwotCWNhc2UgcG1hY19sb3dfaTJjX21vZGVfY29tYmluZWQ6CisJY2FzZSBwbWFjX2kyY19tb2RlX2NvbWJpbmVkOgogCQltb2RlX3JlZyB8PSBLV19JMkNfTU9ERV9DT01CSU5FRDsKKwkJaWYgKHN1YnNpemUgIT0gMSkKKwkJCXJldHVybiAtRUlOVkFMOwogCQlicmVhazsKIAl9CiAKIAkvKiBTZXR1cCBjaGFubmVsICYgY2xlYXIgcGVuZGluZyBpcnFzICovCiAJa3dfd3JpdGVfcmVnKHJlZ19pc3IsIGt3X3JlYWRfcmVnKHJlZ19pc3IpKTsKLQlrd193cml0ZV9yZWcocmVnX21vZGUsIG1vZGVfcmVnIHwgKGhvc3QtPmNoYW5uZWwgPDwgNCkpOworCWt3X3dyaXRlX3JlZyhyZWdfbW9kZSwgbW9kZV9yZWcgfCAoYnVzLT5jaGFubmVsIDw8IDQpKTsKIAlrd193cml0ZV9yZWcocmVnX3N0YXR1cywgMCk7CiAKLQkvKiBTZXQgdXAgYWRkcmVzcyBhbmQgci93IGJpdCAqLwotCWt3X3dyaXRlX3JlZyhyZWdfYWRkciwgYWRkcik7CisJLyogU2V0IHVwIGFkZHJlc3MgYW5kIHIvdyBiaXQsIHN0cmlwIHBvc3NpYmxlIHN0YWxlIGJ1cyBudW1iZXIgZnJvbQorCSAqIGFkZHJlc3MgdG9wIGJpdHMKKwkgKi8KKwlrd193cml0ZV9yZWcocmVnX2FkZHIsIGFkZHJkaXIgJiAweGZmKTsKIAogCS8qIFNldCB1cCB0aGUgc3ViIGFkZHJlc3MgKi8KIAlpZiAoKG1vZGVfcmVnICYgS1dfSTJDX01PREVfTU9ERV9NQVNLKSA9PSBLV19JMkNfTU9ERV9TVEFOREFSRFNVQgogCSAgICB8fCAobW9kZV9yZWcgJiBLV19JMkNfTU9ERV9NT0RFX01BU0spID09IEtXX0kyQ19NT0RFX0NPTUJJTkVEKQogCQlrd193cml0ZV9yZWcocmVnX3N1YmFkZHIsIHN1YmFkZHIpOwogCi0JLyogU3RhcnQgc2VuZGluZyBhZGRyZXNzICYgZGlzYWJsZSBpbnRlcnJ1cHQqLwotCWt3X3dyaXRlX3JlZyhyZWdfaWVyLCAwIC8qS1dfSTJDX0lSUV9NQVNLKi8pOwotCWt3X3dyaXRlX3JlZyhyZWdfY29udHJvbCwgS1dfSTJDX0NUTF9YQUREUik7CisJLyogUHJlcGFyZSBmb3IgYXN5bmMgb3BlcmF0aW9ucyAqLworCWhvc3QtPmRhdGEgPSBkYXRhOworCWhvc3QtPmxlbiA9IGxlbjsKKwlob3N0LT5zdGF0ZSA9IHN0YXRlX2FkZHI7CisJaG9zdC0+cmVzdWx0ID0gMDsKKwlob3N0LT5ydyA9IChhZGRyZGlyICYgMSk7CisJaG9zdC0+cG9sbGVkID0gYnVzLT5wb2xsZWQ7CiAKLQkvKiBTdGF0ZSBtYWNoaW5lLCB0byB0dXJuIGludG8gYW4gaW50ZXJydXB0IGhhbmRsZXIgKi8KLQl3aGlsZShzdGF0ZSAhPSBzdGF0ZV9pZGxlKSB7Ci0JCXU4IGlzciA9IGt3X3dhaXRfaW50ZXJydXB0KGhvc3QpOwotCQlzdGF0ZSA9IGt3X2hhbmRsZV9pbnRlcnJ1cHQoaG9zdCwgc3RhdGUsIGFkZHIgJiAxLCAmcmMsICZkYXRhLCAmbGVuLCBpc3IpOworCS8qIEVuYWJsZSBpbnRlcnJ1cHQgaWYgbm90IHVzaW5nIHBvbGxlZCBtb2RlIGFuZCBpbnRlcnJ1cHQgaXMKKwkgKiBhdmFpbGFibGUKKwkgKi8KKwlpZiAodXNlX2lycSkgeworCQkvKiBDbGVhciBjb21wbGV0aW9uICovCisJCUlOSVRfQ09NUExFVElPTihob3N0LT5jb21wbGV0ZSk7CisJCS8qIEFjayBzdGFsZSBpbnRlcnJ1cHRzICovCisJCWt3X3dyaXRlX3JlZyhyZWdfaXNyLCBrd19yZWFkX3JlZyhyZWdfaXNyKSk7CisJCS8qIEFybSB0aW1lb3V0ICovCisJCWhvc3QtPnRpbWVvdXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBLV19QT0xMX1RJTUVPVVQ7CisJCWFkZF90aW1lcigmaG9zdC0+dGltZW91dF90aW1lcik7CisJCS8qIEVuYWJsZSBlbWlzc2lvbiAqLworCQlrd193cml0ZV9yZWcocmVnX2llciwgS1dfSTJDX0lSUV9NQVNLKTsKIAl9CiAKLQlyZXR1cm4gcmM7CisJLyogU3RhcnQgc2VuZGluZyBhZGRyZXNzICovCisJa3dfd3JpdGVfcmVnKHJlZ19jb250cm9sLCBLV19JMkNfQ1RMX1hBRERSKTsKKworCS8qIFdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKwlpZiAodXNlX2lycSkKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmaG9zdC0+Y29tcGxldGUpOworCWVsc2UgeworCQl3aGlsZShob3N0LT5zdGF0ZSAhPSBzdGF0ZV9pZGxlKSB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCQl1OCBpc3IgPSBrd19pMmNfd2FpdF9pbnRlcnJ1cHQoaG9zdCk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+bG9jaywgZmxhZ3MpOworCQkJa3dfaTJjX2hhbmRsZV9pbnRlcnJ1cHQoaG9zdCwgaXNyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKKwkJfQorCX0KKworCS8qIERpc2FibGUgZW1pc3Npb24gKi8KKwlrd193cml0ZV9yZWcocmVnX2llciwgMCk7CisKKwlyZXR1cm4gaG9zdC0+cmVzdWx0OwogfQogCi1zdGF0aWMgdm9pZCBrZXl3ZXN0X2xvd19pMmNfYWRkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCitzdGF0aWMgc3RydWN0IHBtYWNfaTJjX2hvc3Rfa3cgKl9faW5pdCBrd19pMmNfaG9zdF9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IGxvd19pMmNfaG9zdAkqaG9zdCA9IGZpbmRfbG93X2kyY19ob3N0KE5VTEwpOwotCXUzMgkJCSpwc3RlcHMsICpwcmF0ZSwgc3RlcHMsIGFvZmZzZXQgPSAwOwotCXN0cnVjdCBkZXZpY2Vfbm9kZQkqcGFyZW50OworCXN0cnVjdCBwbWFjX2kyY19ob3N0X2t3ICpob3N0OworCXUzMgkJCSpwc3RlcHMsICpwcmF0ZSwgKmFkZHJwLCBzdGVwczsKIAorCWhvc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG1hY19pMmNfaG9zdF9rdyksIEdGUF9LRVJORUwpOwogCWlmIChob3N0ID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJsb3dfaTJjOiBDYW4ndCBhbGxvY2F0ZSBob3N0IGZvciAlc1xuIiwKIAkJICAgICAgIG5wLT5mdWxsX25hbWUpOwotCQlyZXR1cm47CisJCXJldHVybiBOVUxMOwogCX0KLQltZW1zZXQoaG9zdCwgMCwgc2l6ZW9mKCpob3N0KSk7CiAKKwkvKiBBcHBsZSBpcyBraW5kIGVub3VnaCB0byBwcm92aWRlIGEgdmFsaWQgQUFQTCxhZGRyZXNzIHByb3BlcnR5CisJICogb24gYWxsIGkyYyBrZXl3ZXN0IG5vZGVzIHNvIGZhciAuLi4gd2Ugd291bGQgaGF2ZSB0byBmYWxsYmFjaworCSAqIHRvIG1hY2lvIHBhcnNpbmcgaWYgdGhhdCB3YXNuJ3QgdGhlIGNhc2UKKwkgKi8KKwlhZGRycCA9ICh1MzIgKilnZXRfcHJvcGVydHkobnAsICJBQVBMLGFkZHJlc3MiLCBOVUxMKTsKKwlpZiAoYWRkcnAgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImxvd19pMmM6IENhbid0IGZpbmQgYWRkcmVzcyBmb3IgJXNcbiIsCisJCSAgICAgICBucC0+ZnVsbF9uYW1lKTsKKwkJa2ZyZWUoaG9zdCk7CisJCXJldHVybiBOVUxMOworCX0KIAlpbml0X01VVEVYKCZob3N0LT5tdXRleCk7Ci0JaG9zdC0+bnAgPSBvZl9ub2RlX2dldChucCk7CQorCWluaXRfY29tcGxldGlvbigmaG9zdC0+Y29tcGxldGUpOworCXNwaW5fbG9ja19pbml0KCZob3N0LT5sb2NrKTsKKwlpbml0X3RpbWVyKCZob3N0LT50aW1lb3V0X3RpbWVyKTsKKwlob3N0LT50aW1lb3V0X3RpbWVyLmZ1bmN0aW9uID0ga3dfaTJjX3RpbWVvdXQ7CisJaG9zdC0+dGltZW91dF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaG9zdDsKKwogCXBzdGVwcyA9ICh1MzIgKilnZXRfcHJvcGVydHkobnAsICJBQVBMLGFkZHJlc3Mtc3RlcCIsIE5VTEwpOwogCXN0ZXBzID0gcHN0ZXBzID8gKCpwc3RlcHMpIDogMHgxMDsKIAlmb3IgKGhvc3QtPmJzdGVwcyA9IDA7IChzdGVwcyAmIDB4MDEpID09IDA7IGhvc3QtPmJzdGVwcysrKQogCQlzdGVwcyA+Pj0gMTsKLQlwYXJlbnQgPSBvZl9nZXRfcGFyZW50KG5wKTsKLQlob3N0LT5udW1fY2hhbm5lbHMgPSAxOwotCWlmIChwYXJlbnQgJiYgcGFyZW50LT5uYW1lWzBdID09ICd1JykgewotCQlob3N0LT5udW1fY2hhbm5lbHMgPSAyOwotCQlhb2Zmc2V0ID0gMzsKLQl9CiAJLyogU2VsZWN0IGludGVyZmFjZSByYXRlICovCi0JaG9zdC0+c3BlZWQgPSBLV19JMkNfTU9ERV8xMDBLSFo7CisJaG9zdC0+c3BlZWQgPSBLV19JMkNfTU9ERV8yNUtIWjsKIAlwcmF0ZSA9ICh1MzIgKilnZXRfcHJvcGVydHkobnAsICJBQVBMLGkyYy1yYXRlIiwgTlVMTCk7CiAJaWYgKHByYXRlKSBzd2l0Y2goKnByYXRlKSB7CiAJY2FzZSAxMDA6CkBAIC0zNzgsMTQ2ICs1MzEsOTgxIEBACiAJCWhvc3QtPnNwZWVkID0gS1dfSTJDX01PREVfMjVLSFo7CiAJCWJyZWFrOwogCX0JCisJaWYgKG5wLT5uX2ludHJzID4gMCkKKwkJaG9zdC0+aXJxID0gbnAtPmludHJzWzBdLmxpbmU7CisJZWxzZQorCQlob3N0LT5pcnEgPSBOT19JUlE7CiAKLQlob3N0LT5tb2RlID0gcG1hY19sb3dfaTJjX21vZGVfc3RkOwotCWhvc3QtPmJhc2UgPSBpb3JlbWFwKG5wLT5hZGRyc1swXS5hZGRyZXNzICsgYW9mZnNldCwKLQkJCQkJCW5wLT5hZGRyc1swXS5zaXplKTsKLQlob3N0LT5mdW5jID0ga2V5d2VzdF9sb3dfaTJjX2Z1bmM7CisJaG9zdC0+YmFzZSA9IGlvcmVtYXAoKCphZGRycCksIDB4MTAwMCk7CisJaWYgKGhvc3QtPmJhc2UgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImxvd19pMmM6IENhbid0IG1hcCByZWdpc3RlcnMgZm9yICVzXG4iLAorCQkgICAgICAgbnAtPmZ1bGxfbmFtZSk7CisJCWtmcmVlKGhvc3QpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBNYWtlIHN1cmUgSVJBIGlzIGRpc2FibGVkICovCisJa3dfd3JpdGVfcmVnKHJlZ19pZXIsIDApOworCisJLyogUmVxdWVzdCBjaGlwIGludGVycnVwdCAqLworCWlmIChyZXF1ZXN0X2lycShob3N0LT5pcnEsIGt3X2kyY19pcnEsIFNBX1NISVJRLCAia2V5d2VzdCBpMmMiLCBob3N0KSkKKwkJaG9zdC0+aXJxID0gTk9fSVJROworCisJcHJpbnRrKEtFUk5fSU5GTyAiS2V5V2VzdCBpMmMgQDB4JTA4eCBpcnEgJWQgJXNcbiIsCisJICAgICAgICphZGRycCwgaG9zdC0+aXJxLCBucC0+ZnVsbF9uYW1lKTsKKworCXJldHVybiBob3N0OwogfQogCisKK3N0YXRpYyB2b2lkIF9faW5pdCBrd19pMmNfYWRkKHN0cnVjdCBwbWFjX2kyY19ob3N0X2t3ICpob3N0LAorCQkJICAgICAgc3RydWN0IGRldmljZV9ub2RlICpjb250cm9sbGVyLAorCQkJICAgICAgc3RydWN0IGRldmljZV9ub2RlICpidXNub2RlLAorCQkJICAgICAgaW50IGNoYW5uZWwpCit7CisJc3RydWN0IHBtYWNfaTJjX2J1cyAqYnVzOworCisJYnVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBtYWNfaTJjX2J1cyksIEdGUF9LRVJORUwpOworCWlmIChidXMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJYnVzLT5jb250cm9sbGVyID0gb2Zfbm9kZV9nZXQoY29udHJvbGxlcik7CisJYnVzLT5idXNub2RlID0gb2Zfbm9kZV9nZXQoYnVzbm9kZSk7CisJYnVzLT50eXBlID0gcG1hY19pMmNfYnVzX2tleXdlc3Q7CisJYnVzLT5ob3N0ZGF0YSA9IGhvc3Q7CisJYnVzLT5jaGFubmVsID0gY2hhbm5lbDsKKwlidXMtPm1vZGUgPSBwbWFjX2kyY19tb2RlX3N0ZDsKKwlidXMtPm9wZW4gPSBrd19pMmNfb3BlbjsKKwlidXMtPmNsb3NlID0ga3dfaTJjX2Nsb3NlOworCWJ1cy0+eGZlciA9IGt3X2kyY194ZmVyOworCWluaXRfTVVURVgoJmJ1cy0+c2VtKTsKKwlpZiAoY29udHJvbGxlciA9PSBidXNub2RlKQorCQlidXMtPmZsYWdzID0gcG1hY19pMmNfbXVsdGlidXM7CisJbGlzdF9hZGQoJmJ1cy0+bGluaywgJnBtYWNfaTJjX2J1c3Nlcyk7CisKKwlwcmludGsoS0VSTl9JTkZPICIgY2hhbm5lbCAlZCBidXMgJXNcbiIsIGNoYW5uZWwsCisJICAgICAgIChjb250cm9sbGVyID09IGJ1c25vZGUpID8gIjxtdWx0aWJ1cz4iIDogYnVzbm9kZS0+ZnVsbF9uYW1lKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGt3X2kyY19wcm9iZSh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsICpjaGlsZCwgKnBhcmVudDsKKworCS8qIFByb2JlIGtleXdlc3QtaTJjIGJ1c3NlcyAqLworCWZvciAobnAgPSBOVUxMOworCSAgICAgKG5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUobnAsICJpMmMiLCJrZXl3ZXN0LWkyYyIpKSAhPSBOVUxMOyl7CisJCXN0cnVjdCBwbWFjX2kyY19ob3N0X2t3ICpob3N0OworCQlpbnQgbXVsdGlidXMsIGNoYW5zLCBpOworCisJCS8qIEZvdW5kIG9uZSwgaW5pdCBhIGhvc3Qgc3RydWN0dXJlICovCisJCWhvc3QgPSBrd19pMmNfaG9zdF9pbml0KG5wKTsKKwkJaWYgKGhvc3QgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCS8qIE5vdyBjaGVjayBpZiB3ZSBoYXZlIGEgbXVsdGlidXMgc2V0dXAgKG9sZCBzdHlsZSkgb3IgaWYgd2UKKwkJICogaGF2ZSBwcm9wZXIgYnVzIG5vZGVzLiBOb3RlIHRoYXQgdGhlICJuZXciIHdheSAocHJvcGVyIGJ1cworCQkgKiBub2RlcykgbWlnaHQgY2F1c2UgdXMgdG8gbm90IGNyZWF0ZSBzb21lIGJ1c3NlcyB0aGF0IGFyZQorCQkgKiBrZXB0IGhpZGRlbiBpbiB0aGUgZGV2aWNlLXRyZWUuIEluIHRoZSBmdXR1cmUsIHdlIG1pZ2h0CisJCSAqIHdhbnQgdG8gd29yayBhcm91bmQgdGhhdCBieSBjcmVhdGluZyBidXNzZXMgd2l0aG91dCBhIG5vZGUKKwkJICogYnV0IG5vdCBmb3Igbm93CisJCSAqLworCQljaGlsZCA9IG9mX2dldF9uZXh0X2NoaWxkKG5wLCBOVUxMKTsKKwkJbXVsdGlidXMgPSAhY2hpbGQgfHwgc3RyY21wKGNoaWxkLT5uYW1lLCAiaTJjLWJ1cyIpOworCQlvZl9ub2RlX3B1dChjaGlsZCk7CisKKwkJLyogRm9yIGEgbXVsdGlidXMgc2V0dXAsIHdlIGdldCB0aGUgYnVzIGNvdW50IGJhc2VkIG9uIHRoZQorCQkgKiBwYXJlbnQgdHlwZQorCQkgKi8KKwkJaWYgKG11bHRpYnVzKSB7CisJCQlwYXJlbnQgPSBvZl9nZXRfcGFyZW50KG5wKTsKKwkJCWlmIChwYXJlbnQgPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCWNoYW5zID0gcGFyZW50LT5uYW1lWzBdID09ICd1JyA/IDIgOiAxOworCQkJZm9yIChpID0gMDsgaSA8IGNoYW5zOyBpKyspCisJCQkJa3dfaTJjX2FkZChob3N0LCBucCwgbnAsIGkpOworCQl9IGVsc2UgeworCQkJZm9yIChjaGlsZCA9IE5VTEw7CisJCQkgICAgIChjaGlsZCA9IG9mX2dldF9uZXh0X2NoaWxkKG5wLCBjaGlsZCkpICE9IE5VTEw7KSB7CisJCQkJdTMyICpyZWcgPQorCQkJCQkodTMyICopZ2V0X3Byb3BlcnR5KGNoaWxkLCAicmVnIiwgTlVMTCk7CisJCQkJaWYgKHJlZyA9PSBOVUxMKQorCQkJCQljb250aW51ZTsKKwkJCQlrd19pMmNfYWRkKGhvc3QsIG5wLCBjaGlsZCwgKnJlZyk7CisJCQl9CisJCX0KKwl9Cit9CisKKwogLyoKICAqCiAgKiBQTVUgaW1wbGVtZW50YXRpb24KICAqCiAgKi8KIAotCiAjaWZkZWYgQ09ORklHX0FEQl9QTVUKIAotc3RhdGljIGludCBwbXVfbG93X2kyY19mdW5jKHN0cnVjdCBsb3dfaTJjX2hvc3QgKmhvc3QsIHU4IGFkZHIsIHU4IHN1YiwgdTggKmRhdGEsIGludCBsZW4pCisvKgorICogaTJjIGNvbW1hbmQgYmxvY2sgdG8gdGhlIFBNVQorICovCitzdHJ1Y3QgcG11X2kyY19oZHIgeworCXU4CWJ1czsKKwl1OAltb2RlOworCXU4CWJ1czI7CisJdTgJYWRkcmVzczsKKwl1OAlzdWJfYWRkcjsKKwl1OAljb21iX2FkZHI7CisJdTgJY291bnQ7CisJdTgJZGF0YVtdOworfTsKKworc3RhdGljIHZvaWQgcG11X2kyY19jb21wbGV0ZShzdHJ1Y3QgYWRiX3JlcXVlc3QgKnJlcSkKIHsKLQkvLyBUT0RPCi0JcmV0dXJuIC1FTk9ERVY7CisJY29tcGxldGUocmVxLT5hcmcpOwogfQogCi1zdGF0aWMgdm9pZCBwbXVfbG93X2kyY19hZGQoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3N0YXRpYyBpbnQgcG11X2kyY194ZmVyKHN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cywgdTggYWRkcmRpciwgaW50IHN1YnNpemUsCisJCQl1MzIgc3ViYWRkciwgdTggKmRhdGEsIGludCBsZW4pCiB7Ci0Jc3RydWN0IGxvd19pMmNfaG9zdAkqaG9zdCA9IGZpbmRfbG93X2kyY19ob3N0KE5VTEwpOworCXN0cnVjdCBhZGJfcmVxdWVzdCAqcmVxID0gYnVzLT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgcG11X2kyY19oZHIgKmhkciA9IChzdHJ1Y3QgcG11X2kyY19oZHIgKikmcmVxLT5kYXRhWzFdOworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXA7CisJaW50IHJlYWQgPSBhZGRyZGlyICYgMTsKKwlpbnQgcmV0cnk7CisJaW50IHJjID0gMDsKIAotCWlmIChob3N0ID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJsb3dfaTJjOiBDYW4ndCBhbGxvY2F0ZSBob3N0IGZvciAlc1xuIiwKLQkJICAgICAgIG5wLT5mdWxsX25hbWUpOworCS8qIEZvciBub3csIGxpbWl0IG91cnNlbHZlcyB0byAxNiBieXRlcyB0cmFuc2ZlcnMgKi8KKwlpZiAobGVuID4gMTYpCisJCXJldHVybiAtRUlOVkFMOworCisJaW5pdF9jb21wbGV0aW9uKCZjb21wKTsKKworCWZvciAocmV0cnkgPSAwOyByZXRyeSA8IDE2OyByZXRyeSsrKSB7CisJCW1lbXNldChyZXEsIDAsIHNpemVvZihzdHJ1Y3QgYWRiX3JlcXVlc3QpKTsKKwkJaGRyLT5idXMgPSBidXMtPmNoYW5uZWw7CisJCWhkci0+Y291bnQgPSBsZW47CisKKwkJc3dpdGNoKGJ1cy0+bW9kZSkgeworCQljYXNlIHBtYWNfaTJjX21vZGVfc3RkOgorCQkJaWYgKHN1YnNpemUgIT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWhkci0+YWRkcmVzcyA9IGFkZHJkaXI7CisJCQloZHItPm1vZGUgPSBQTVVfSTJDX01PREVfU0lNUExFOworCQkJYnJlYWs7CisJCWNhc2UgcG1hY19pMmNfbW9kZV9zdGRzdWI6CisJCWNhc2UgcG1hY19pMmNfbW9kZV9jb21iaW5lZDoKKwkJCWlmIChzdWJzaXplICE9IDEpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQloZHItPmFkZHJlc3MgPSBhZGRyZGlyICYgMHhmZTsKKwkJCWhkci0+Y29tYl9hZGRyID0gYWRkcmRpcjsKKwkJCWhkci0+c3ViX2FkZHIgPSBzdWJhZGRyOworCQkJaWYgKGJ1cy0+bW9kZSA9PSBwbWFjX2kyY19tb2RlX3N0ZHN1YikKKwkJCQloZHItPm1vZGUgPSBQTVVfSTJDX01PREVfU1REU1VCOworCQkJZWxzZQorCQkJCWhkci0+bW9kZSA9IFBNVV9JMkNfTU9ERV9DT01CSU5FRDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlJTklUX0NPTVBMRVRJT04oY29tcCk7CisJCXJlcS0+ZGF0YVswXSA9IFBNVV9JMkNfQ01EOworCQlyZXEtPnJlcGx5WzBdID0gMHhmZjsKKwkJcmVxLT5uYnl0ZXMgPSBzaXplb2Yoc3RydWN0IHBtdV9pMmNfaGRyKSArIDE7CisJCXJlcS0+ZG9uZSA9IHBtdV9pMmNfY29tcGxldGU7CisJCXJlcS0+YXJnID0gJmNvbXA7CisJCWlmICghcmVhZCAmJiBsZW4pIHsKKwkJCW1lbWNweShoZHItPmRhdGEsIGRhdGEsIGxlbik7CisJCQlyZXEtPm5ieXRlcyArPSBsZW47CisJCX0KKwkJcmMgPSBwbXVfcXVldWVfcmVxdWVzdChyZXEpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbXApOworCQlpZiAocmVxLT5yZXBseVswXSA9PSBQTVVfSTJDX1NUQVRVU19PSykKKwkJCWJyZWFrOworCQltc2xlZXAoMTUpOworCX0KKwlpZiAocmVxLT5yZXBseVswXSAhPSBQTVVfSTJDX1NUQVRVU19PSykKKwkJcmV0dXJuIC1FSU87CisKKwlmb3IgKHJldHJ5ID0gMDsgcmV0cnkgPCAxNjsgcmV0cnkrKykgeworCQltZW1zZXQocmVxLCAwLCBzaXplb2Yoc3RydWN0IGFkYl9yZXF1ZXN0KSk7CisKKwkJLyogSSBrbm93IHRoYXQgbG9va3MgbGlrZSBhIGxvdCwgc2xvdyBhcyBoZWxsLCBidXQgZGFyd2luCisJCSAqIGRvZXMgaXQgc28gbGV0J3MgYmUgb24gdGhlIHNhZmUgc2lkZSBmb3Igbm93CisJCSAqLworCQltc2xlZXAoMTUpOworCisJCWhkci0+YnVzID0gUE1VX0kyQ19CVVNfU1RBVFVTOworCisJCUlOSVRfQ09NUExFVElPTihjb21wKTsKKwkJcmVxLT5kYXRhWzBdID0gUE1VX0kyQ19DTUQ7CisJCXJlcS0+cmVwbHlbMF0gPSAweGZmOworCQlyZXEtPm5ieXRlcyA9IDI7CisJCXJlcS0+ZG9uZSA9IHBtdV9pMmNfY29tcGxldGU7CisJCXJlcS0+YXJnID0gJmNvbXA7CisJCXJjID0gcG11X3F1ZXVlX3JlcXVlc3QocmVxKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wKTsKKworCQlpZiAocmVxLT5yZXBseVswXSA9PSBQTVVfSTJDX1NUQVRVU19PSyAmJiAhcmVhZCkKKwkJCXJldHVybiAwOworCQlpZiAocmVxLT5yZXBseVswXSA9PSBQTVVfSTJDX1NUQVRVU19EQVRBUkVBRCAmJiByZWFkKSB7CisJCQlpbnQgcmxlbiA9IHJlcS0+cmVwbHlfbGVuIC0gMTsKKworCQkJaWYgKHJsZW4gIT0gbGVuKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibG93X2kyYzogUE1VIHJldHVybmVkICVkIgorCQkJCSAgICAgICAiIGJ5dGVzLCBleHBlY3RlZCAlZCAhXG4iLCBybGVuLCBsZW4pOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJaWYgKGxlbikKKwkJCQltZW1jcHkoZGF0YSwgJnJlcS0+cmVwbHlbMV0sIGxlbik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHBtdV9pMmNfcHJvYmUodm9pZCkKK3sKKwlzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXM7CisJc3RydWN0IGRldmljZV9ub2RlICpidXNub2RlOworCWludCBjaGFubmVsLCBzejsKKworCWlmICghcG11X3ByZXNlbnQoKSkKIAkJcmV0dXJuOwotCX0KLQltZW1zZXQoaG9zdCwgMCwgc2l6ZW9mKCpob3N0KSk7CiAKLQlpbml0X01VVEVYKCZob3N0LT5tdXRleCk7Ci0JaG9zdC0+bnAgPSBvZl9ub2RlX2dldChucCk7CQotCWhvc3QtPm51bV9jaGFubmVscyA9IDM7Ci0JaG9zdC0+bW9kZSA9IHBtYWNfbG93X2kyY19tb2RlX3N0ZDsKLQlob3N0LT5mdW5jID0gcG11X2xvd19pMmNfZnVuYzsKKwkvKiBUaGVyZSBtaWdodCBvciBtaWdodCBub3QgYmUgYSAicG11LWkyYyIgbm9kZSwgd2UgdXNlIHRoYXQKKwkgKiBvciB2aWEtcG11IGl0c2VsZiwgd2hhdGV2ZXIgd2UgZmluZC4gSSBoYXZlbid0IHNlZW4gYSBtYWNoaW5lCisJICogd2l0aCBzZXBhcmF0ZSBidXMgbm9kZXMsIHNvIHdlIGFzc3VtZSBhIG11bHRpYnVzIHNldHVwCisJICovCisJYnVzbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJwbXUtaTJjIik7CisJaWYgKGJ1c25vZGUgPT0gTlVMTCkKKwkJYnVzbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJ2aWEtcG11Iik7CisJaWYgKGJ1c25vZGUgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUE1VIGkyYyAlc1xuIiwgYnVzbm9kZS0+ZnVsbF9uYW1lKTsKKworCS8qCisJICogV2UgYWRkIGJ1cyAxIGFuZCAyIG9ubHkgZm9yIG5vdywgYnVzIDAgaXMgInNwZWNpYWwiCisJICovCisJZm9yIChjaGFubmVsID0gMTsgY2hhbm5lbCA8PSAyOyBjaGFubmVsKyspIHsKKwkJc3ogPSBzaXplb2Yoc3RydWN0IHBtYWNfaTJjX2J1cykgKyBzaXplb2Yoc3RydWN0IGFkYl9yZXF1ZXN0KTsKKwkJYnVzID0ga3phbGxvYyhzeiwgR0ZQX0tFUk5FTCk7CisJCWlmIChidXMgPT0gTlVMTCkKKwkJCXJldHVybjsKKworCQlidXMtPmNvbnRyb2xsZXIgPSBidXNub2RlOworCQlidXMtPmJ1c25vZGUgPSBidXNub2RlOworCQlidXMtPnR5cGUgPSBwbWFjX2kyY19idXNfcG11OworCQlidXMtPmNoYW5uZWwgPSBjaGFubmVsOworCQlidXMtPm1vZGUgPSBwbWFjX2kyY19tb2RlX3N0ZDsKKwkJYnVzLT5ob3N0ZGF0YSA9IGJ1cyArIDE7CisJCWJ1cy0+eGZlciA9IHBtdV9pMmNfeGZlcjsKKwkJaW5pdF9NVVRFWCgmYnVzLT5zZW0pOworCQlidXMtPmZsYWdzID0gcG1hY19pMmNfbXVsdGlidXM7CisJCWxpc3RfYWRkKCZidXMtPmxpbmssICZwbWFjX2kyY19idXNzZXMpOworCisJCXByaW50ayhLRVJOX0lORk8gIiBjaGFubmVsICVkIGJ1cyA8bXVsdGlidXM+XG4iLCBjaGFubmVsKTsKKwl9CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfQURCX1BNVSAqLwogCi12b2lkIF9faW5pdCBwbWFjX2luaXRfbG93X2kyYyh2b2lkKQorCisvKgorICoKKyAqIFNNVSBpbXBsZW1lbnRhdGlvbgorICoKKyAqLworCisjaWZkZWYgQ09ORklHX1BNQUNfU01VCisKK3N0YXRpYyB2b2lkIHNtdV9pMmNfY29tcGxldGUoc3RydWN0IHNtdV9pMmNfY21kICpjbWQsIHZvaWQgKm1pc2MpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQotCS8qIFByb2JlIGtleXdlc3QtaTJjIGJ1c3NlcyAqLwotCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgImkyYyIsICJrZXl3ZXN0LWkyYyIpOwotCXdoaWxlKG5wKSB7Ci0JCWtleXdlc3RfbG93X2kyY19hZGQobnApOwotCQlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLCAiaTJjIiwgImtleXdlc3QtaTJjIik7Ci0JfQotCi0jaWZkZWYgQ09ORklHX0FEQl9QTVUKLQkvKiBQcm9iZSBQTVUgYnVzc2VzICovCi0JbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAidmlhLXBtdSIpOwotCWlmIChucCkKLQkJcG11X2xvd19pMmNfYWRkKG5wKTsKLSNlbmRpZiAvKiBDT05GSUdfQURCX1BNVSAqLwotCi0JLyogVE9ETzogQWRkIENVREEgc3VwcG9ydCBhcyB3ZWxsICovCisJY29tcGxldGUobWlzYyk7CiB9CiAKK3N0YXRpYyBpbnQgc211X2kyY194ZmVyKHN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cywgdTggYWRkcmRpciwgaW50IHN1YnNpemUsCisJCQl1MzIgc3ViYWRkciwgdTggKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IHNtdV9pMmNfY21kICpjbWQgPSBidXMtPmhvc3RkYXRhOworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXA7CisJaW50IHJlYWQgPSBhZGRyZGlyICYgMTsKKwlpbnQgcmMgPSAwOworCisJaWYgKChyZWFkICYmIGxlbiA+IFNNVV9JMkNfUkVBRF9NQVgpIHx8CisJICAgICgoIXJlYWQpICYmIGxlbiA+IFNNVV9JMkNfV1JJVEVfTUFYKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoY21kLCAwLCBzaXplb2Yoc3RydWN0IHNtdV9pMmNfY21kKSk7CisJY21kLT5pbmZvLmJ1cyA9IGJ1cy0+Y2hhbm5lbDsKKwljbWQtPmluZm8uZGV2YWRkciA9IGFkZHJkaXI7CisJY21kLT5pbmZvLmRhdGFsZW4gPSBsZW47CisKKwlzd2l0Y2goYnVzLT5tb2RlKSB7CisJY2FzZSBwbWFjX2kyY19tb2RlX3N0ZDoKKwkJaWYgKHN1YnNpemUgIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQljbWQtPmluZm8udHlwZSA9IFNNVV9JMkNfVFJBTlNGRVJfU0lNUExFOworCQlicmVhazsKKwljYXNlIHBtYWNfaTJjX21vZGVfc3Rkc3ViOgorCWNhc2UgcG1hY19pMmNfbW9kZV9jb21iaW5lZDoKKwkJaWYgKHN1YnNpemUgPiAzIHx8IHN1YnNpemUgPCAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNtZC0+aW5mby5zdWJsZW4gPSBzdWJzaXplOworCQkvKiB0aGF0J3MgYmlnLWVuZGlhbiBvbmx5IGJ1dCBoZWggISAqLworCQltZW1jcHkoJmNtZC0+aW5mby5zdWJhZGRyLCAoKGNoYXIgKikmc3ViYWRkcikgKyAoNCAtIHN1YnNpemUpLAorCQkgICAgICAgc3Vic2l6ZSk7CisJCWlmIChidXMtPm1vZGUgPT0gcG1hY19pMmNfbW9kZV9zdGRzdWIpCisJCQljbWQtPmluZm8udHlwZSA9IFNNVV9JMkNfVFJBTlNGRVJfU1REU1VCOworCQllbHNlCisJCQljbWQtPmluZm8udHlwZSA9IFNNVV9JMkNfVFJBTlNGRVJfQ09NQklORUQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIXJlYWQgJiYgbGVuKQorCQltZW1jcHkoY21kLT5pbmZvLmRhdGEsIGRhdGEsIGxlbik7CisKKwlpbml0X2NvbXBsZXRpb24oJmNvbXApOworCWNtZC0+ZG9uZSA9IHNtdV9pMmNfY29tcGxldGU7CisJY21kLT5taXNjID0gJmNvbXA7CisJcmMgPSBzbXVfcXVldWVfaTJjKGNtZCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbXApOworCXJjID0gY21kLT5zdGF0dXM7CisKKwlpZiAocmVhZCAmJiBsZW4pCisJCW1lbWNweShkYXRhLCBjbWQtPmluZm8uZGF0YSwgbGVuKTsKKwlyZXR1cm4gcmMgPCAwID8gcmMgOiAwOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc211X2kyY19wcm9iZSh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbGxlciwgKmJ1c25vZGU7CisJc3RydWN0IHBtYWNfaTJjX2J1cyAqYnVzOworCXUzMiAqcmVnOworCWludCBzejsKKworCWlmICghc211X3ByZXNlbnQoKSkKKwkJcmV0dXJuOworCisJY29udHJvbGxlciA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJzbXUtaTJjLWNvbnRyb2wiKTsKKwlpZiAoY29udHJvbGxlciA9PSBOVUxMKQorCQljb250cm9sbGVyID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInNtdSIpOworCWlmIChjb250cm9sbGVyID09IE5VTEwpCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX0lORk8gIlNNVSBpMmMgJXNcbiIsIGNvbnRyb2xsZXItPmZ1bGxfbmFtZSk7CisKKwkvKiBMb29rIGZvciBjaGlsZHMsIG5vdGUgdGhhdCB0aGV5IG1pZ2h0IG5vdCBiZSBvZiB0aGUgcmlnaHQKKwkgKiB0eXBlIGFzIG9sZGVyIGRldmljZSB0cmVlcyBtaXggaTJjIGJ1c3NlcyBhbmQgb3RoZXIgdGhpZ25zCisJICogYXQgdGhlIHNhbWUgbGV2ZWwKKwkgKi8KKwlmb3IgKGJ1c25vZGUgPSBOVUxMOworCSAgICAgKGJ1c25vZGUgPSBvZl9nZXRfbmV4dF9jaGlsZChjb250cm9sbGVyLCBidXNub2RlKSkgIT0gTlVMTDspIHsKKwkJaWYgKHN0cmNtcChidXNub2RlLT50eXBlLCAiaTJjIikgJiYKKwkJICAgIHN0cmNtcChidXNub2RlLT50eXBlLCAiaTJjLWJ1cyIpKQorCQkJY29udGludWU7CisJCXJlZyA9ICh1MzIgKilnZXRfcHJvcGVydHkoYnVzbm9kZSwgInJlZyIsIE5VTEwpOworCQlpZiAocmVnID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlzeiA9IHNpemVvZihzdHJ1Y3QgcG1hY19pMmNfYnVzKSArIHNpemVvZihzdHJ1Y3Qgc211X2kyY19jbWQpOworCQlidXMgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKKwkJaWYgKGJ1cyA9PSBOVUxMKQorCQkJcmV0dXJuOworCisJCWJ1cy0+Y29udHJvbGxlciA9IGNvbnRyb2xsZXI7CisJCWJ1cy0+YnVzbm9kZSA9IG9mX25vZGVfZ2V0KGJ1c25vZGUpOworCQlidXMtPnR5cGUgPSBwbWFjX2kyY19idXNfc211OworCQlidXMtPmNoYW5uZWwgPSAqcmVnOworCQlidXMtPm1vZGUgPSBwbWFjX2kyY19tb2RlX3N0ZDsKKwkJYnVzLT5ob3N0ZGF0YSA9IGJ1cyArIDE7CisJCWJ1cy0+eGZlciA9IHNtdV9pMmNfeGZlcjsKKwkJaW5pdF9NVVRFWCgmYnVzLT5zZW0pOworCQlidXMtPmZsYWdzID0gMDsKKwkJbGlzdF9hZGQoJmJ1cy0+bGluaywgJnBtYWNfaTJjX2J1c3Nlcyk7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiIGNoYW5uZWwgJXggYnVzICVzXG4iLAorCQkgICAgICAgYnVzLT5jaGFubmVsLCBidXNub2RlLT5mdWxsX25hbWUpOworCX0KK30KKworI2VuZGlmIC8qIENPTkZJR19QTUFDX1NNVSAqLworCisvKgorICoKKyAqIENvcmUgY29kZQorICoKKyAqLworCisKK3N0cnVjdCBwbWFjX2kyY19idXMgKnBtYWNfaTJjX2ZpbmRfYnVzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnAgPSBvZl9ub2RlX2dldChub2RlKTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnByZXYgPSBOVUxMOworCXN0cnVjdCBwbWFjX2kyY19idXMgKmJ1czsKKworCXdoaWxlKHApIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShidXMsICZwbWFjX2kyY19idXNzZXMsIGxpbmspIHsKKwkJCWlmIChwID09IGJ1cy0+YnVzbm9kZSkgeworCQkJCWlmIChwcmV2ICYmIGJ1cy0+ZmxhZ3MgJiBwbWFjX2kyY19tdWx0aWJ1cykgeworCQkJCQl1MzIgKnJlZzsKKwkJCQkJcmVnID0gKHUzMiAqKWdldF9wcm9wZXJ0eShwcmV2LCAicmVnIiwKKwkJCQkJCQkJICBOVUxMKTsKKwkJCQkJaWYgKCFyZWcpCisJCQkJCQljb250aW51ZTsKKwkJCQkJaWYgKCgoKnJlZykgPj4gOCkgIT0gYnVzLT5jaGFubmVsKQorCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJCW9mX25vZGVfcHV0KHApOworCQkJCW9mX25vZGVfcHV0KHByZXYpOworCQkJCXJldHVybiBidXM7CisJCQl9CisJCX0KKwkJb2Zfbm9kZV9wdXQocHJldik7CisJCXByZXYgPSBwOworCQlwID0gb2ZfZ2V0X3BhcmVudChwKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwbWFjX2kyY19maW5kX2J1cyk7CisKK3U4IHBtYWNfaTJjX2dldF9kZXZfYWRkcihzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSkKK3sKKwl1MzIgKnJlZyA9ICh1MzIgKilnZXRfcHJvcGVydHkoZGV2aWNlLCAicmVnIiwgTlVMTCk7CisKKwlpZiAocmVnID09IE5VTEwpCisJCXJldHVybiAwOworCisJcmV0dXJuICgqcmVnKSAmIDB4ZmY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwbWFjX2kyY19nZXRfZGV2X2FkZHIpOworCitzdHJ1Y3QgZGV2aWNlX25vZGUgKnBtYWNfaTJjX2dldF9jb250cm9sbGVyKHN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cykKK3sKKwlyZXR1cm4gYnVzLT5jb250cm9sbGVyOworfQorRVhQT1JUX1NZTUJPTF9HUEwocG1hY19pMmNfZ2V0X2NvbnRyb2xsZXIpOworCitzdHJ1Y3QgZGV2aWNlX25vZGUgKnBtYWNfaTJjX2dldF9idXNfbm9kZShzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXMpCit7CisJcmV0dXJuIGJ1cy0+YnVzbm9kZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBtYWNfaTJjX2dldF9idXNfbm9kZSk7CisKK2ludCBwbWFjX2kyY19nZXRfdHlwZShzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXMpCit7CisJcmV0dXJuIGJ1cy0+dHlwZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBtYWNfaTJjX2dldF90eXBlKTsKKworaW50IHBtYWNfaTJjX2dldF9mbGFncyhzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXMpCit7CisJcmV0dXJuIGJ1cy0+ZmxhZ3M7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwbWFjX2kyY19nZXRfZmxhZ3MpOworCitpbnQgcG1hY19pMmNfZ2V0X2NoYW5uZWwoc3RydWN0IHBtYWNfaTJjX2J1cyAqYnVzKQoreworCXJldHVybiBidXMtPmNoYW5uZWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwbWFjX2kyY19nZXRfY2hhbm5lbCk7CisKKwordm9pZCBwbWFjX2kyY19hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXMsCisJCQkgICAgIHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlXQVJOX09OKGJ1cy0+YWRhcHRlciAhPSBOVUxMKTsKKwlidXMtPmFkYXB0ZXIgPSBhZGFwdGVyOworfQorRVhQT1JUX1NZTUJPTF9HUEwocG1hY19pMmNfYXR0YWNoX2FkYXB0ZXIpOworCit2b2lkIHBtYWNfaTJjX2RldGFjaF9hZGFwdGVyKHN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cywKKwkJCSAgICAgc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCVdBUk5fT04oYnVzLT5hZGFwdGVyICE9IGFkYXB0ZXIpOworCWJ1cy0+YWRhcHRlciA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwbWFjX2kyY19kZXRhY2hfYWRhcHRlcik7CisKK3N0cnVjdCBpMmNfYWRhcHRlciAqcG1hY19pMmNfZ2V0X2FkYXB0ZXIoc3RydWN0IHBtYWNfaTJjX2J1cyAqYnVzKQoreworCXJldHVybiBidXMtPmFkYXB0ZXI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwbWFjX2kyY19nZXRfYWRhcHRlcik7CisKK3N0cnVjdCBwbWFjX2kyY19idXMgKnBtYWNfaTJjX2FkYXB0ZXJfdG9fYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXM7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ1cywgJnBtYWNfaTJjX2J1c3NlcywgbGluaykKKwkJaWYgKGJ1cy0+YWRhcHRlciA9PSBhZGFwdGVyKQorCQkJcmV0dXJuIGJ1czsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBtYWNfaTJjX2FkYXB0ZXJfdG9fYnVzKTsKKworZXh0ZXJuIGludCBwbWFjX2kyY19tYXRjaF9hZGFwdGVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LAorCQkJCSAgc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cyA9IHBtYWNfaTJjX2ZpbmRfYnVzKGRldik7CisKKwlpZiAoYnVzID09IE5VTEwpCisJCXJldHVybiAwOworCXJldHVybiAoYnVzLT5hZGFwdGVyID09IGFkYXB0ZXIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocG1hY19pMmNfbWF0Y2hfYWRhcHRlcik7CisKIGludCBwbWFjX2xvd19pMmNfbG9jayhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBsb3dfaTJjX2hvc3QgKmhvc3QgPSBmaW5kX2xvd19pMmNfaG9zdChucCk7CisJc3RydWN0IHBtYWNfaTJjX2J1cyAqYnVzLCAqZm91bmQgPSBOVUxMOwogCi0JaWYgKCFob3N0KQorCWxpc3RfZm9yX2VhY2hfZW50cnkoYnVzLCAmcG1hY19pMmNfYnVzc2VzLCBsaW5rKSB7CisJCWlmIChucCA9PSBidXMtPmNvbnRyb2xsZXIpIHsKKwkJCWZvdW5kID0gYnVzOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFmb3VuZCkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JZG93bigmaG9zdC0+bXV0ZXgpOwotCXJldHVybiAwOworCXJldHVybiBwbWFjX2kyY19vcGVuKGJ1cywgMCk7CiB9Ci1FWFBPUlRfU1lNQk9MKHBtYWNfbG93X2kyY19sb2NrKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHBtYWNfbG93X2kyY19sb2NrKTsKIAogaW50IHBtYWNfbG93X2kyY191bmxvY2soc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlzdHJ1Y3QgbG93X2kyY19ob3N0ICpob3N0ID0gZmluZF9sb3dfaTJjX2hvc3QobnApOworCXN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cywgKmZvdW5kID0gTlVMTDsKIAotCWlmICghaG9zdCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ1cywgJnBtYWNfaTJjX2J1c3NlcywgbGluaykgeworCQlpZiAobnAgPT0gYnVzLT5jb250cm9sbGVyKSB7CisJCQlmb3VuZCA9IGJ1czsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghZm91bmQpCiAJCXJldHVybiAtRU5PREVWOwotCXVwKCZob3N0LT5tdXRleCk7CisJcG1hY19pMmNfY2xvc2UoYnVzKTsKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wocG1hY19sb3dfaTJjX3VubG9jayk7CitFWFBPUlRfU1lNQk9MX0dQTChwbWFjX2xvd19pMmNfdW5sb2NrKTsKIAogCi1pbnQgcG1hY19sb3dfaTJjX29wZW4oc3RydWN0IGRldmljZV9ub2RlICpucCwgaW50IGNoYW5uZWwpCitpbnQgcG1hY19pMmNfb3BlbihzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXMsIGludCBwb2xsZWQpCiB7Ci0Jc3RydWN0IGxvd19pMmNfaG9zdCAqaG9zdCA9IGZpbmRfbG93X2kyY19ob3N0KG5wKTsKKwlpbnQgcmM7CiAKLQlpZiAoIWhvc3QpCi0JCXJldHVybiAtRU5PREVWOworCWRvd24oJmJ1cy0+c2VtKTsKKwlidXMtPnBvbGxlZCA9IHBvbGxlZCB8fCBwbWFjX2kyY19mb3JjZV9wb2xsOworCWJ1cy0+b3BlbmVkID0gMTsKKwlidXMtPm1vZGUgPSBwbWFjX2kyY19tb2RlX3N0ZDsKKwlpZiAoYnVzLT5vcGVuICYmIChyYyA9IGJ1cy0+b3BlbihidXMpKSAhPSAwKSB7CisJCWJ1cy0+b3BlbmVkID0gMDsKKwkJdXAoJmJ1cy0+c2VtKTsKKwkJcmV0dXJuIHJjOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBtYWNfaTJjX29wZW4pOwogCi0JaWYgKGNoYW5uZWwgPj0gaG9zdC0+bnVtX2NoYW5uZWxzKQordm9pZCBwbWFjX2kyY19jbG9zZShzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXMpCit7CisJV0FSTl9PTighYnVzLT5vcGVuZWQpOworCWlmIChidXMtPmNsb3NlKQorCQlidXMtPmNsb3NlKGJ1cyk7CisJYnVzLT5vcGVuZWQgPSAwOworCXVwKCZidXMtPnNlbSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwbWFjX2kyY19jbG9zZSk7CisKK2ludCBwbWFjX2kyY19zZXRtb2RlKHN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cywgaW50IG1vZGUpCit7CisJV0FSTl9PTighYnVzLT5vcGVuZWQpOworCisJLyogUmVwb3J0IG1lIGlmIHlvdSBzZWUgdGhlIGVycm9yIGJlbG93IGFzIHRoZXJlIG1pZ2h0IGJlIGEgbmV3CisJICogImNvbWJpbmVkNCIgbW9kZSB0aGF0IEkgbmVlZCB0byBpbXBsZW1lbnQgZm9yIHRoZSBTTVUgYnVzCisJICovCisJaWYgKG1vZGUgPCBwbWFjX2kyY19tb2RlX2R1bWIgfHwgbW9kZSA+IHBtYWNfaTJjX21vZGVfY29tYmluZWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsb3dfaTJjOiBJbnZhbGlkIG1vZGUgJWQgcmVxdWVzdGVkIG9uIgorCQkgICAgICAgIiBidXMgJXMgIVxuIiwgbW9kZSwgYnVzLT5idXNub2RlLT5mdWxsX25hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJYnVzLT5tb2RlID0gbW9kZTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocG1hY19pMmNfc2V0bW9kZSk7CisKK2ludCBwbWFjX2kyY194ZmVyKHN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cywgdTggYWRkcmRpciwgaW50IHN1YnNpemUsCisJCSAgdTMyIHN1YmFkZHIsIHU4ICpkYXRhLCBpbnQgbGVuKQoreworCWludCByYzsKKworCVdBUk5fT04oIWJ1cy0+b3BlbmVkKTsKKworCURCRygieGZlcigpIGNoYW49JWQsIGFkZHJkaXI9MHgleCwgbW9kZT0lZCwgc3Vic2l6ZT0lZCwgc3ViYWRkcj0weCV4LCIKKwkgICAgIiAlZCBieXRlcywgYnVzICVzXG4iLCBidXMtPmNoYW5uZWwsIGFkZHJkaXIsIGJ1cy0+bW9kZSwgc3Vic2l6ZSwKKwkgICAgc3ViYWRkciwgbGVuLCBidXMtPmJ1c25vZGUtPmZ1bGxfbmFtZSk7CisKKwlyYyA9IGJ1cy0+eGZlcihidXMsIGFkZHJkaXIsIHN1YnNpemUsIHN1YmFkZHIsIGRhdGEsIGxlbik7CisKKyNpZmRlZiBERUJVRworCWlmIChyYykKKwkJREJHKCJ4ZmVyIGVycm9yICVkXG4iLCByYyk7CisjZW5kaWYKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwbWFjX2kyY194ZmVyKTsKKworLyogc29tZSBxdWlya3MgZm9yIHBsYXRmb3JtIGZ1bmN0aW9uIGRlY29kaW5nICovCitlbnVtIHsKKwlwbWFjX2kyY19xdWlya19pbnZtYXNrID0gMHgwMDAwMDAwMXUsCit9OworCitzdGF0aWMgdm9pZCBwbWFjX2kyY19kZXZzY2FuKHZvaWQgKCpjYWxsYmFjaykoc3RydWN0IGRldmljZV9ub2RlICpkZXYsCisJCQkJCSAgICAgIGludCBxdWlya3MpKQoreworCXN0cnVjdCBwbWFjX2kyY19idXMgKmJ1czsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXN0YXRpYyBzdHJ1Y3Qgd2hpdGVsaXN0X2VudCB7CisJCWNoYXIgKm5hbWU7CisJCWNoYXIgKmNvbXBhdGlibGU7CisJCWludCBxdWlya3M7CisJfSB3aGl0ZWxpc3RbXSA9IHsKKwkJLyogWFhYIFN0dWR5IGRldmljZS10cmVlJ3MgJiBhcHBsZSBkcml2ZXJzIGFyZSBnZXQgdGhlIHF1aXJrcworCQkgKiByaWdodCAhCisJCSAqLworCQl7ICJpMmMtaHdjbG9jayIsIE5VTEwsIHBtYWNfaTJjX3F1aXJrX2ludm1hc2sgfSwKKwkJeyAiaTJjLWNwdS12b2x0YWdlIiwgTlVMTCwgMH0sCisJCXsgICJ0ZW1wLW1vbml0b3IiLCBOVUxMLCAwIH0sCisJCXsgICJzdXBwbHktbW9uaXRvciIsIE5VTEwsIDAgfSwKKwkJeyBOVUxMLCBOVUxMLCAwIH0sCisJfTsKKworCS8qIE9ubHkgc29tZSBkZXZpY2VzIG5lZWQgdG8gaGF2ZSBwbGF0Zm9ybSBmdW5jdGlvbnMgaW5zdGFuY2lhdGVkCisJICogaGVyZS4gRm9yIG5vdywgd2UgaGF2ZSBhIHRhYmxlLiBPdGhlcnMsIGxpa2UgOTU1NCBpMmMgR1BJT3MgdXNlZAorCSAqIG9uIFhzZXJ2ZSwgaWYgd2UgZXZlciBkbyBhIGRyaXZlciBmb3IgdGhlbSwgd2lsbCB1c2UgdGhlaXIgb3duCisJICogcGxhdGZvcm0gZnVuY3Rpb24gaW5zdGFuY2UKKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ1cywgJnBtYWNfaTJjX2J1c3NlcywgbGluaykgeworCQlmb3IgKG5wID0gTlVMTDsKKwkJICAgICAobnAgPSBvZl9nZXRfbmV4dF9jaGlsZChidXMtPmJ1c25vZGUsIG5wKSkgIT0gTlVMTDspIHsKKwkJCXN0cnVjdCB3aGl0ZWxpc3RfZW50ICpwOworCQkJLyogSWYgbXVsdGlidXMsIGNoZWNrIGlmIGRldmljZSBpcyBvbiB0aGF0IGJ1cyAqLworCQkJaWYgKGJ1cy0+ZmxhZ3MgJiBwbWFjX2kyY19tdWx0aWJ1cykKKwkJCQlpZiAoYnVzICE9IHBtYWNfaTJjX2ZpbmRfYnVzKG5wKSkKKwkJCQkJY29udGludWU7CisJCQlmb3IgKHAgPSB3aGl0ZWxpc3Q7IHAtPm5hbWUgIT0gTlVMTDsgcCsrKSB7CisJCQkJaWYgKHN0cmNtcChucC0+bmFtZSwgcC0+bmFtZSkpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChwLT5jb21wYXRpYmxlICYmCisJCQkJICAgICFkZXZpY2VfaXNfY29tcGF0aWJsZShucCwgcC0+Y29tcGF0aWJsZSkpCisJCQkJCWNvbnRpbnVlOworCQkJCWNhbGxiYWNrKG5wLCBwLT5xdWlya3MpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCisjZGVmaW5lIE1BWF9JMkNfREFUQQk2NAorCitzdHJ1Y3QgcG1hY19pMmNfcGZfaW5zdAoreworCXN0cnVjdCBwbWFjX2kyY19idXMJKmJ1czsKKwl1OAkJCWFkZHI7CisJdTgJCQlidWZmZXJbTUFYX0kyQ19EQVRBXTsKKwl1OAkJCXNjcmF0Y2hbTUFYX0kyQ19EQVRBXTsKKwlpbnQJCQlieXRlczsKKwlpbnQJCQlxdWlya3M7Cit9OworCitzdGF0aWMgdm9pZCogcG1hY19pMmNfZG9fYmVnaW4oc3RydWN0IHBtZl9mdW5jdGlvbiAqZnVuYywgc3RydWN0IHBtZl9hcmdzICphcmdzKQoreworCXN0cnVjdCBwbWFjX2kyY19wZl9pbnN0ICppbnN0OworCXN0cnVjdCBwbWFjX2kyY19idXMJKmJ1czsKKworCWJ1cyA9IHBtYWNfaTJjX2ZpbmRfYnVzKGZ1bmMtPm5vZGUpOworCWlmIChidXMgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImxvd19pMmM6IENhbid0IGZpbmQgYnVzIGZvciAlcyAocGZ1bmMpXG4iLAorCQkgICAgICAgZnVuYy0+bm9kZS0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChwbWFjX2kyY19vcGVuKGJ1cywgMCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsb3dfaTJjOiBDYW4ndCBvcGVuIGkyYyBidXMgZm9yICVzIChwZnVuYylcbiIsCisJCSAgICAgICBmdW5jLT5ub2RlLT5mdWxsX25hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBYWFggbWlnaHQgbmVlZCBHRlBfQVRPTUlDIHdoZW4gY2FsbGVkIGR1cmluZyB0aGUgc3VzcGVuZCBwcm9jZXNzLAorCSAqIGJ1dCB0aGVuLCB0aGVyZSBhcmUgYWxyZWFkeSBsb3RzIG9mIGlzc3VlcyB3aXRoIHN1c3BlbmRpbmcgd2hlbgorCSAqIG5lYXIgT09NIHRoYXQgbmVlZCB0byBiZSByZXNvbHZlZCwgdGhlIGFsbG9jYXRvciBpdHNlbGYgc2hvdWxkCisJICogcHJvYmFibHkgbWFrZSBHRlBfTk9JTyBpbXBsaWNpdCBkdXJpbmcgc3VzcGVuZAorCSAqLworCWluc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG1hY19pMmNfcGZfaW5zdCksIEdGUF9LRVJORUwpOworCWlmIChpbnN0ID09IE5VTEwpIHsKKwkJcG1hY19pMmNfY2xvc2UoYnVzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWluc3QtPmJ1cyA9IGJ1czsKKwlpbnN0LT5hZGRyID0gcG1hY19pMmNfZ2V0X2Rldl9hZGRyKGZ1bmMtPm5vZGUpOworCWluc3QtPnF1aXJrcyA9IChpbnQpKGxvbmcpZnVuYy0+ZHJpdmVyX2RhdGE7CisJcmV0dXJuIGluc3Q7Cit9CisKK3N0YXRpYyB2b2lkIHBtYWNfaTJjX2RvX2VuZChzdHJ1Y3QgcG1mX2Z1bmN0aW9uICpmdW5jLCB2b2lkICppbnN0ZGF0YSkKK3sKKwlzdHJ1Y3QgcG1hY19pMmNfcGZfaW5zdCAqaW5zdCA9IGluc3RkYXRhOworCisJaWYgKGluc3QgPT0gTlVMTCkKKwkJcmV0dXJuOworCXBtYWNfaTJjX2Nsb3NlKGluc3QtPmJ1cyk7CisJaWYgKGluc3QpCisJCWtmcmVlKGluc3QpOworfQorCitzdGF0aWMgaW50IHBtYWNfaTJjX2RvX3JlYWQoUE1GX1NURF9BUkdTLCB1MzIgbGVuKQoreworCXN0cnVjdCBwbWFjX2kyY19wZl9pbnN0ICppbnN0ID0gaW5zdGRhdGE7CisKKwlpbnN0LT5ieXRlcyA9IGxlbjsKKwlyZXR1cm4gcG1hY19pMmNfeGZlcihpbnN0LT5idXMsIGluc3QtPmFkZHIgfCBwbWFjX2kyY19yZWFkLCAwLCAwLAorCQkJICAgICBpbnN0LT5idWZmZXIsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgcG1hY19pMmNfZG9fd3JpdGUoUE1GX1NURF9BUkdTLCB1MzIgbGVuLCBjb25zdCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcG1hY19pMmNfcGZfaW5zdCAqaW5zdCA9IGluc3RkYXRhOworCisJcmV0dXJuIHBtYWNfaTJjX3hmZXIoaW5zdC0+YnVzLCBpbnN0LT5hZGRyIHwgcG1hY19pMmNfd3JpdGUsIDAsIDAsCisJCQkgICAgICh1OCAqKWRhdGEsIGxlbik7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBkbyB0aGUgbWFza2luZyAmIE9SJ2luZyBmb3IgdGhlICJybXciIHR5cGUKKyAqIGNhbGxiYWNrcy4gWmUgc2hvdWxkIGFwcGx5IHRoZSBtYXNrIGFuZCBPUiBpbiB0aGUgdmFsdWVzIGluIHRoZQorICogYnVmZmVyIGJlZm9yZSB3cml0aW5nIGJhY2suIFRoZSBwcm9ibGVtIGlzIHRoYXQgaXQgc2VlbXMgdGhhdAorICogdmFyaW91cyBkYXJ3aW4gZHJpdmVycyBpbXBsZW1lbnQgdGhlIG1hc2svb3IgZGlmZmVyZW50bHksIHRodXMKKyAqIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHF1aXJrcyBmaXJzdAorICovCitzdGF0aWMgdm9pZCBwbWFjX2kyY19kb19hcHBseV9ybXcoc3RydWN0IHBtYWNfaTJjX3BmX2luc3QgKmluc3QsCisJCQkJICB1MzIgbGVuLCBjb25zdCB1OCAqbWFzaywgY29uc3QgdTggKnZhbCkKK3sKKwlpbnQgaTsKKworCWlmIChpbnN0LT5xdWlya3MgJiBwbWFjX2kyY19xdWlya19pbnZtYXNrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKyspCisJCQlpbnN0LT5zY3JhdGNoW2ldID0gKGluc3QtPmJ1ZmZlcltpXSAmIG1hc2tbaV0pIHwgdmFsW2ldOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKyspCisJCQlpbnN0LT5zY3JhdGNoW2ldID0gKGluc3QtPmJ1ZmZlcltpXSAmIH5tYXNrW2ldKQorCQkJCXwgKHZhbFtpXSAmIG1hc2tbaV0pOworCX0KK30KKworc3RhdGljIGludCBwbWFjX2kyY19kb19ybXcoUE1GX1NURF9BUkdTLCB1MzIgbWFza2xlbiwgdTMyIHZhbHVlbGVuLAorCQkJICAgdTMyIHRvdGFsbGVuLCBjb25zdCB1OCAqbWFza2RhdGEsCisJCQkgICBjb25zdCB1OCAqdmFsdWVkYXRhKQoreworCXN0cnVjdCBwbWFjX2kyY19wZl9pbnN0ICppbnN0ID0gaW5zdGRhdGE7CisKKwlpZiAobWFza2xlbiA+IGluc3QtPmJ5dGVzIHx8IHZhbHVlbGVuID4gaW5zdC0+Ynl0ZXMgfHwKKwkgICAgdG90YWxsZW4gPiBpbnN0LT5ieXRlcyB8fCB2YWx1ZWxlbiA+IG1hc2tsZW4pCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZG93bigmaG9zdC0+bXV0ZXgpOwotCWhvc3QtPmlzX29wZW4gPSAxOwotCWhvc3QtPmNoYW5uZWwgPSBjaGFubmVsOworCXBtYWNfaTJjX2RvX2FwcGx5X3JtdyhpbnN0LCBtYXNrbGVuLCBtYXNrZGF0YSwgdmFsdWVkYXRhKTsKKworCXJldHVybiBwbWFjX2kyY194ZmVyKGluc3QtPmJ1cywgaW5zdC0+YWRkciB8IHBtYWNfaTJjX3dyaXRlLCAwLCAwLAorCQkJICAgICBpbnN0LT5zY3JhdGNoLCB0b3RhbGxlbik7Cit9CisKK3N0YXRpYyBpbnQgcG1hY19pMmNfZG9fcmVhZF9zdWIoUE1GX1NURF9BUkdTLCB1OCBzdWJhZGRyLCB1MzIgbGVuKQoreworCXN0cnVjdCBwbWFjX2kyY19wZl9pbnN0ICppbnN0ID0gaW5zdGRhdGE7CisKKwlpbnN0LT5ieXRlcyA9IGxlbjsKKwlyZXR1cm4gcG1hY19pMmNfeGZlcihpbnN0LT5idXMsIGluc3QtPmFkZHIgfCBwbWFjX2kyY19yZWFkLCAxLCBzdWJhZGRyLAorCQkJICAgICBpbnN0LT5idWZmZXIsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgcG1hY19pMmNfZG9fd3JpdGVfc3ViKFBNRl9TVERfQVJHUywgdTggc3ViYWRkciwgdTMyIGxlbiwKKwkJCQkgICAgIGNvbnN0IHU4ICpkYXRhKQoreworCXN0cnVjdCBwbWFjX2kyY19wZl9pbnN0ICppbnN0ID0gaW5zdGRhdGE7CisKKwlyZXR1cm4gcG1hY19pMmNfeGZlcihpbnN0LT5idXMsIGluc3QtPmFkZHIgfCBwbWFjX2kyY193cml0ZSwgMSwKKwkJCSAgICAgc3ViYWRkciwgKHU4ICopZGF0YSwgbGVuKTsKK30KKworc3RhdGljIGludCBwbWFjX2kyY19kb19zZXRfbW9kZShQTUZfU1REX0FSR1MsIGludCBtb2RlKQoreworCXN0cnVjdCBwbWFjX2kyY19wZl9pbnN0ICppbnN0ID0gaW5zdGRhdGE7CisKKwlyZXR1cm4gcG1hY19pMmNfc2V0bW9kZShpbnN0LT5idXMsIG1vZGUpOworfQorCitzdGF0aWMgaW50IHBtYWNfaTJjX2RvX3Jtd19zdWIoUE1GX1NURF9BUkdTLCB1OCBzdWJhZGRyLCB1MzIgbWFza2xlbiwKKwkJCSAgICAgICB1MzIgdmFsdWVsZW4sIHUzMiB0b3RhbGxlbiwgY29uc3QgdTggKm1hc2tkYXRhLAorCQkJICAgICAgIGNvbnN0IHU4ICp2YWx1ZWRhdGEpCit7CisJc3RydWN0IHBtYWNfaTJjX3BmX2luc3QgKmluc3QgPSBpbnN0ZGF0YTsKKworCWlmIChtYXNrbGVuID4gaW5zdC0+Ynl0ZXMgfHwgdmFsdWVsZW4gPiBpbnN0LT5ieXRlcyB8fAorCSAgICB0b3RhbGxlbiA+IGluc3QtPmJ5dGVzIHx8IHZhbHVlbGVuID4gbWFza2xlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwbWFjX2kyY19kb19hcHBseV9ybXcoaW5zdCwgbWFza2xlbiwgbWFza2RhdGEsIHZhbHVlZGF0YSk7CisKKwlyZXR1cm4gcG1hY19pMmNfeGZlcihpbnN0LT5idXMsIGluc3QtPmFkZHIgfCBwbWFjX2kyY193cml0ZSwgMSwKKwkJCSAgICAgc3ViYWRkciwgaW5zdC0+c2NyYXRjaCwgdG90YWxsZW4pOworfQorCitzdGF0aWMgaW50IHBtYWNfaTJjX2RvX21hc2tfYW5kX2NvbXAoUE1GX1NURF9BUkdTLCB1MzIgbGVuLAorCQkJCSAgICAgY29uc3QgdTggKm1hc2tkYXRhLAorCQkJCSAgICAgY29uc3QgdTggKnZhbHVlZGF0YSkKK3sKKwlzdHJ1Y3QgcG1hY19pMmNfcGZfaW5zdCAqaW5zdCA9IGluc3RkYXRhOworCWludCBpLCBtYXRjaDsKKworCS8qIEdldCByZXR1cm4gdmFsdWUgcG9pbnRlciwgaXQncyBhc3N1bWVkIHRvIGJlIGEgdTMyICovCisJaWYgKCFhcmdzIHx8ICFhcmdzLT5jb3VudCB8fCAhYXJncy0+dVswXS5wKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIENoZWNrIGJ1ZmZlciAqLworCWlmIChsZW4gPiBpbnN0LT5ieXRlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwLCBtYXRjaCA9IDE7IG1hdGNoICYmIGkgPCBsZW47IGkgKyspCisJCWlmICgoaW5zdC0+YnVmZmVyW2ldICYgbWFza2RhdGFbaV0pICE9IHZhbHVlZGF0YVtpXSkKKwkJCW1hdGNoID0gMDsKKwkqYXJncy0+dVswXS5wID0gbWF0Y2g7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG1hY19pMmNfZG9fZGVsYXkoUE1GX1NURF9BUkdTLCB1MzIgZHVyYXRpb24pCit7CisJbXNsZWVwKChkdXJhdGlvbiArIDk5OSkgLyAxMDAwKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IHBtZl9oYW5kbGVycyBwbWFjX2kyY19wZnVuY19oYW5kbGVycyA9IHsKKwkuYmVnaW4JCQk9IHBtYWNfaTJjX2RvX2JlZ2luLAorCS5lbmQJCQk9IHBtYWNfaTJjX2RvX2VuZCwKKwkucmVhZF9pMmMJCT0gcG1hY19pMmNfZG9fcmVhZCwKKwkud3JpdGVfaTJjCQk9IHBtYWNfaTJjX2RvX3dyaXRlLAorCS5ybXdfaTJjCQk9IHBtYWNfaTJjX2RvX3JtdywKKwkucmVhZF9pMmNfc3ViCQk9IHBtYWNfaTJjX2RvX3JlYWRfc3ViLAorCS53cml0ZV9pMmNfc3ViCQk9IHBtYWNfaTJjX2RvX3dyaXRlX3N1YiwKKwkucm13X2kyY19zdWIJCT0gcG1hY19pMmNfZG9fcm13X3N1YiwKKwkuc2V0X2kyY19tb2RlCQk9IHBtYWNfaTJjX2RvX3NldF9tb2RlLAorCS5tYXNrX2FuZF9jb21wYXJlCT0gcG1hY19pMmNfZG9fbWFza19hbmRfY29tcCwKKwkuZGVsYXkJCQk9IHBtYWNfaTJjX2RvX2RlbGF5LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHBtYWNfaTJjX2Rldl9jcmVhdGUoc3RydWN0IGRldmljZV9ub2RlICpucCwgaW50IHF1aXJrcykKK3sKKwlEQkcoImRldl9jcmVhdGUoJXMpXG4iLCBucC0+ZnVsbF9uYW1lKTsKKworCXBtZl9yZWdpc3Rlcl9kcml2ZXIobnAsICZwbWFjX2kyY19wZnVuY19oYW5kbGVycywKKwkJCSAgICAodm9pZCAqKShsb25nKXF1aXJrcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwbWFjX2kyY19kZXZfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBpbnQgcXVpcmtzKQoreworCURCRygiZGV2X2NyZWF0ZSglcylcbiIsIG5wLT5mdWxsX25hbWUpOworCisJcG1mX2RvX2Z1bmN0aW9ucyhucCwgTlVMTCwgMCwgUE1GX0ZMQUdTX09OX0lOSVQsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBwbWFjX2kyY19kZXZfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBpbnQgcXVpcmtzKQoreworCURCRygiZGV2X3N1c3BlbmQoJXMpXG4iLCBucC0+ZnVsbF9uYW1lKTsKKwlwbWZfZG9fZnVuY3Rpb25zKG5wLCBOVUxMLCAwLCBQTUZfRkxBR1NfT05fU0xFRVAsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBwbWFjX2kyY19kZXZfcmVzdW1lKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGludCBxdWlya3MpCit7CisJREJHKCJkZXZfcmVzdW1lKCVzKVxuIiwgbnAtPmZ1bGxfbmFtZSk7CisJcG1mX2RvX2Z1bmN0aW9ucyhucCwgTlVMTCwgMCwgUE1GX0ZMQUdTX09OX1dBS0UsIE5VTEwpOworfQorCit2b2lkIHBtYWNfcGZ1bmNfaTJjX3N1c3BlbmQodm9pZCkKK3sKKwlwbWFjX2kyY19kZXZzY2FuKHBtYWNfaTJjX2Rldl9zdXNwZW5kKTsKK30KKwordm9pZCBwbWFjX3BmdW5jX2kyY19yZXN1bWUodm9pZCkKK3sKKwlwbWFjX2kyY19kZXZzY2FuKHBtYWNfaTJjX2Rldl9yZXN1bWUpOworfQorCisvKgorICogSW5pdGlhbGl6ZSB1czogcHJvYmUgYWxsIGkyYyBidXNzZXMgb24gdGhlIG1hY2hpbmUsIGluc3RhbnRpYXRlCisgKiBidXNzZXMgYW5kIHBsYXRmb3JtIGZ1bmN0aW9ucyBhcyBuZWVkZWQuCisgKi8KKy8qIFRoaXMgaXMgbm9uLXN0YXRpYyBhcyBpdCBtaWdodCBiZSBjYWxsZWQgZWFybHkgYnkgc21wIGNvZGUgKi8KK2ludCBfX2luaXQgcG1hY19pMmNfaW5pdCh2b2lkKQoreworCXN0YXRpYyBpbnQgaTJjX2luaXRlZDsKKworCWlmIChpMmNfaW5pdGVkKQorCQlyZXR1cm4gMDsKKwlpMmNfaW5pdGVkID0gMTsKKworCS8qIFByb2JlIGtleXdlc3QtaTJjIGJ1c3NlcyAqLworCWt3X2kyY19wcm9iZSgpOworCisjaWZkZWYgQ09ORklHX0FEQl9QTVUKKwkvKiBQcm9iZSBQTVUgaTJjIGJ1c3NlcyAqLworCXBtdV9pMmNfcHJvYmUoKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BNQUNfU01VCisJLyogUHJvYmUgU01VIGkyYyBidXNzZXMgKi8KKwlzbXVfaTJjX3Byb2JlKCk7CisjZW5kaWYKKworCS8qIE5vdyBhZGQgcGxhZm9ybSBmdW5jdGlvbnMgZm9yIHNvbWUga25vd24gZGV2aWNlcyAqLworCXBtYWNfaTJjX2RldnNjYW4ocG1hY19pMmNfZGV2X2NyZWF0ZSk7CiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wocG1hY19sb3dfaTJjX29wZW4pOworYXJjaF9pbml0Y2FsbChwbWFjX2kyY19pbml0KTsKIAotaW50IHBtYWNfbG93X2kyY19jbG9zZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQorLyogU2luY2UgcG1hY19pMmNfaW5pdCBjYW4gYmUgY2FsbGVkIHRvbyBlYXJseSBmb3IgdGhlIHBsYXRmb3JtIGRldmljZQorICogcmVnaXN0cmF0aW9uLCB3ZSBuZWVkIHRvIGRvIGl0IGF0IGEgbGF0ZXIgdGltZS4gSW4gb3VyIGNhc2UsIHN1YnN5cworICogaGFwcGVucyB0byBmaXQgd2VsbCwgdGhvdWdoIEkgYWdyZWUgaXQncyBhIGJpdCBvZiBhIGhhY2suLi4KKyAqLworc3RhdGljIGludCBfX2luaXQgcG1hY19pMmNfY3JlYXRlX3BsYXRmb3JtX2RldmljZXModm9pZCkKIHsKLQlzdHJ1Y3QgbG93X2kyY19ob3N0ICpob3N0ID0gZmluZF9sb3dfaTJjX2hvc3QobnApOworCXN0cnVjdCBwbWFjX2kyY19idXMgKmJ1czsKKwlpbnQgaSA9IDA7CiAKLQlpZiAoIWhvc3QpCi0JCXJldHVybiAtRU5PREVWOworCS8qIEluIHRoZSBjYXNlIHdoZXJlIHdlIGFyZSBpbml0aWFsaXplZCBmcm9tIHNtcF9pbml0KCksIHdlIG11c3QKKwkgKiBub3QgdXNlIHRoZSB0aW1lciAoYW5kIHRodXMgdGhlIGlycSkuIEl0J3Mgc2FmZSBmcm9tIG5vdyBvbgorCSAqIHRob3VnaAorCSAqLworCXBtYWNfaTJjX2ZvcmNlX3BvbGwgPSAwOwogCi0JaG9zdC0+aXNfb3BlbiA9IDA7Ci0JdXAoJmhvc3QtPm11dGV4KTsKKwkvKiBDcmVhdGUgcGxhdGZvcm0gZGV2aWNlcyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoYnVzLCAmcG1hY19pMmNfYnVzc2VzLCBsaW5rKSB7CisJCWJ1cy0+cGxhdGZvcm1fZGV2ID0KKwkJCXBsYXRmb3JtX2RldmljZV9hbGxvYygiaTJjLXBvd2VybWFjIiwgaSsrKTsKKwkJaWYgKGJ1cy0+cGxhdGZvcm1fZGV2ID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJYnVzLT5wbGF0Zm9ybV9kZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gYnVzOworCQlwbGF0Zm9ybV9kZXZpY2VfYWRkKGJ1cy0+cGxhdGZvcm1fZGV2KTsKKwl9CisKKwkvKiBOb3cgY2FsbCBwbGF0Zm9ybSAiaW5pdCIgZnVuY3Rpb25zICovCisJcG1hY19pMmNfZGV2c2NhbihwbWFjX2kyY19kZXZfaW5pdCk7CiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wocG1hY19sb3dfaTJjX2Nsb3NlKTsKLQotaW50IHBtYWNfbG93X2kyY19zZXRtb2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGludCBtb2RlKQotewotCXN0cnVjdCBsb3dfaTJjX2hvc3QgKmhvc3QgPSBmaW5kX2xvd19pMmNfaG9zdChucCk7Ci0KLQlpZiAoIWhvc3QpCi0JCXJldHVybiAtRU5PREVWOwotCVdBUk5fT04oIWhvc3QtPmlzX29wZW4pOwotCWhvc3QtPm1vZGUgPSBtb2RlOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHBtYWNfbG93X2kyY19zZXRtb2RlKTsKLQotaW50IHBtYWNfbG93X2kyY194ZmVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHU4IGFkZHJkaXIsIHU4IHN1YmFkZHIsIHU4ICpkYXRhLCBpbnQgbGVuKQotewotCXN0cnVjdCBsb3dfaTJjX2hvc3QgKmhvc3QgPSBmaW5kX2xvd19pMmNfaG9zdChucCk7Ci0KLQlpZiAoIWhvc3QpCi0JCXJldHVybiAtRU5PREVWOwotCVdBUk5fT04oIWhvc3QtPmlzX29wZW4pOwotCi0JcmV0dXJuIGhvc3QtPmZ1bmMoaG9zdCwgYWRkcmRpciwgc3ViYWRkciwgZGF0YSwgbGVuKTsKLX0KLUVYUE9SVF9TWU1CT0wocG1hY19sb3dfaTJjX3hmZXIpOwotCitzdWJzeXNfaW5pdGNhbGwocG1hY19pMmNfY3JlYXRlX3BsYXRmb3JtX2RldmljZXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9udnJhbS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9udnJhbS5jCmluZGV4IDQwNDJlMmYuLjNlYmQwNDUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbnZyYW0uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL252cmFtLmMKQEAgLTUxNCw3ICs1MTQsNyBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGNvcmU5OV9udnJhbV9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQorc3RhdGljIGludCBfX2luaXQgY29yZTk5X252cmFtX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlpbnQgaTsKIAl1MzIgZ2VuX2JhbmswLCBnZW5fYmFuazE7CkBAIC01MjgsNyArNTI4LDcgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJudnJhbTogY2FuJ3QgYWxsb2NhdGUgcmFtIGltYWdlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW52cmFtX2RhdGEgPSBpb3JlbWFwKGRwLT5hZGRyc1swXS5hZGRyZXNzLCBOVlJBTV9TSVpFKjIpOworCW52cmFtX2RhdGEgPSBpb3JlbWFwKGFkZHIsIE5WUkFNX1NJWkUqMik7CiAJbnZyYW1fbmFkZHJzID0gMTsgLyogTWFrZSBzdXJlIHdlIGdldCB0aGUgY29ycmVjdCBjYXNlICovCiAKIAlEQkcoIm52cmFtOiBDaGVja2luZyBiYW5rIDAuLi5cbiIpOwpAQCAtNTQ5LDYgKzU0OSw3IEBACiAJcHBjX21kLm52cmFtX3dyaXRlCT0gY29yZTk5X252cmFtX3dyaXRlOwogCXBwY19tZC5udnJhbV9zaXplCT0gY29yZTk5X252cmFtX3NpemU7CiAJcHBjX21kLm52cmFtX3N5bmMJPSBjb3JlOTlfbnZyYW1fc3luYzsKKwlwcGNfbWQubWFjaGluZV9zaHV0ZG93bgk9IGNvcmU5OV9udnJhbV9zeW5jOwogCS8qIAogCSAqIE1heWJlIHdlIGNvdWxkIGJlIHNtYXJ0ZXIgaGVyZSB0aG91Z2ggbWFraW5nIGFuIGV4Y2x1c2l2ZSBsaXN0CiAJICogb2Yga25vd24gZmxhc2ggY2hpcHMgaXMgYSBiaXQgbmFzdHkgYXMgb2xkZXIgT0YgZGlkbid0IHByb3ZpZGUgdXMKQEAgLTU2OSwzNCArNTcwLDQ4IEBACiBpbnQgX19pbml0IHBtYWNfbnZyYW1faW5pdCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CisJc3RydWN0IHJlc291cmNlIHIxLCByMjsKKwl1bnNpZ25lZCBpbnQgczEgPSAwLCBzMiA9IDA7CiAJaW50IGVyciA9IDA7CiAKIAludnJhbV9uYWRkcnMgPSAwOwogCi0JZHAgPSBmaW5kX2RldmljZXMoIm52cmFtIik7CisJZHAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAibnZyYW0iKTsKIAlpZiAoZHAgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IGZpbmQgTlZSQU0gZGV2aWNlXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCW52cmFtX25hZGRycyA9IGRwLT5uX2FkZHJzOworCisJLyogVHJ5IHRvIG9idGFpbiBhbiBhZGRyZXNzICovCisJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZHAsIDAsICZyMSkgPT0gMCkgeworCQludnJhbV9uYWRkcnMgPSAxOworCQlzMSA9IChyMS5lbmQgLSByMS5zdGFydCkgKyAxOworCQlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShkcCwgMSwgJnIyKSA9PSAwKSB7CisJCQludnJhbV9uYWRkcnMgPSAyOworCQkJczIgPSAocjIuZW5kIC0gcjIuc3RhcnQpICsgMTsKKwkJfQorCX0KKwogCWlzX2NvcmVfOTkgPSBkZXZpY2VfaXNfY29tcGF0aWJsZShkcCwgIm52cmFtLGZsYXNoIik7Ci0JaWYgKGlzX2NvcmVfOTkpCi0JCWVyciA9IGNvcmU5OV9udnJhbV9zZXR1cChkcCk7CisJaWYgKGlzX2NvcmVfOTkpIHsKKwkJZXJyID0gY29yZTk5X252cmFtX3NldHVwKGRwLCByMS5zdGFydCk7CisJCWdvdG8gYmFpbDsKKwl9CisKICNpZmRlZiBDT05GSUdfUFBDMzIKLQllbHNlIGlmIChfbWFjaGluZSA9PSBfTUFDSF9jaHJwICYmIG52cmFtX25hZGRycyA9PSAxKSB7Ci0JCW52cmFtX2RhdGEgPSBpb3JlbWFwKGRwLT5hZGRyc1swXS5hZGRyZXNzICsgaXNhX21lbV9iYXNlLAotCQkJCSAgICAgZHAtPmFkZHJzWzBdLnNpemUpOworCWlmIChfbWFjaGluZSA9PSBfTUFDSF9jaHJwICYmIG52cmFtX25hZGRycyA9PSAxKSB7CisJCW52cmFtX2RhdGEgPSBpb3JlbWFwKHIxLnN0YXJ0LCBzMSk7CiAJCW52cmFtX211bHQgPSAxOwogCQlwcGNfbWQubnZyYW1fcmVhZF92YWwJPSBkaXJlY3RfbnZyYW1fcmVhZF9ieXRlOwogCQlwcGNfbWQubnZyYW1fd3JpdGVfdmFsCT0gZGlyZWN0X252cmFtX3dyaXRlX2J5dGU7CiAJfSBlbHNlIGlmIChudnJhbV9uYWRkcnMgPT0gMSkgewotCQludnJhbV9kYXRhID0gaW9yZW1hcChkcC0+YWRkcnNbMF0uYWRkcmVzcywgZHAtPmFkZHJzWzBdLnNpemUpOwotCQludnJhbV9tdWx0ID0gKGRwLT5hZGRyc1swXS5zaXplICsgTlZSQU1fU0laRSAtIDEpIC8gTlZSQU1fU0laRTsKKwkJbnZyYW1fZGF0YSA9IGlvcmVtYXAocjEuc3RhcnQsIHMxKTsKKwkJbnZyYW1fbXVsdCA9IChzMSArIE5WUkFNX1NJWkUgLSAxKSAvIE5WUkFNX1NJWkU7CiAJCXBwY19tZC5udnJhbV9yZWFkX3ZhbAk9IGRpcmVjdF9udnJhbV9yZWFkX2J5dGU7CiAJCXBwY19tZC5udnJhbV93cml0ZV92YWwJPSBkaXJlY3RfbnZyYW1fd3JpdGVfYnl0ZTsKIAl9IGVsc2UgaWYgKG52cmFtX25hZGRycyA9PSAyKSB7Ci0JCW52cmFtX2FkZHIgPSBpb3JlbWFwKGRwLT5hZGRyc1swXS5hZGRyZXNzLCBkcC0+YWRkcnNbMF0uc2l6ZSk7Ci0JCW52cmFtX2RhdGEgPSBpb3JlbWFwKGRwLT5hZGRyc1sxXS5hZGRyZXNzLCBkcC0+YWRkcnNbMV0uc2l6ZSk7CisJCW52cmFtX2FkZHIgPSBpb3JlbWFwKHIxLnN0YXJ0LCBzMSk7CisJCW52cmFtX2RhdGEgPSBpb3JlbWFwKHIyLnN0YXJ0LCBzMik7CiAJCXBwY19tZC5udnJhbV9yZWFkX3ZhbAk9IGluZGlyZWN0X252cmFtX3JlYWRfYnl0ZTsKIAkJcHBjX21kLm52cmFtX3dyaXRlX3ZhbAk9IGluZGlyZWN0X252cmFtX3dyaXRlX2J5dGU7CiAJfSBlbHNlIGlmIChudnJhbV9uYWRkcnMgPT0gMCAmJiBzeXNfY3RybGVyID09IFNZU19DVFJMRVJfUE1VKSB7CkBAIC02MDUsMTMgKzYyMCwxNSBAQAogCQlwcGNfbWQubnZyYW1fcmVhZF92YWwJPSBwbXVfbnZyYW1fcmVhZF9ieXRlOwogCQlwcGNfbWQubnZyYW1fd3JpdGVfdmFsCT0gcG11X252cmFtX3dyaXRlX2J5dGU7CiAjZW5kaWYgLyogQ09ORklHX0FEQl9QTVUgKi8KLQl9Ci0jZW5kaWYKLQllbHNlIHsKKwl9IGVsc2UgewogCQlwcmludGsoS0VSTl9FUlIgIkluY29tcGF0aWJsZSB0eXBlIG9mIE5WUkFNXG4iKTsKLQkJcmV0dXJuIC1FTlhJTzsKKwkJZXJyID0gLUVOWElPOwogCX0KLQlsb29rdXBfcGFydGl0aW9ucygpOworI2VuZGlmIC8qIENPTkZJR19QUEMzMiAqLworYmFpbDoKKwlvZl9ub2RlX3B1dChkcCk7CisJaWYgKGVyciA9PSAwKQorCQlsb29rdXBfcGFydGl0aW9ucygpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BjaS5jCmluZGV4IDQ0M2JlNTIuLmY2NzFlZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wY2kuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBTdXBwb3J0IGZvciBQQ0kgYnJpZGdlcyBmb3VuZCBvbiBQb3dlciBNYWNpbnRvc2hlcy4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgQmVuamFtaW4gSGVycmVuc2NobXVpZHQgKGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IEJlbmphbWluIEhlcnJlbnNjaG11aWR0IChiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmcpCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTcgUGF1bCBNYWNrZXJyYXMgKHBhdWx1c0BzYW1iYS5vcmcpCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGFzbS9wbWFjX2ZlYXR1cmUuaD4KICNpbmNsdWRlIDxhc20vZ3JhY2tsZS5oPgogI2lmZGVmIENPTkZJR19QUEM2NAotI2luY2x1ZGUgPGFzbS9pb21tdS5oPgorLy8jaW5jbHVkZSA8YXNtL2lvbW11Lmg+CiAjaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KICNlbmRpZgogCkBAIC00NCw2ICs0NCw3IEBACiBzdGF0aWMgaW50IGhhc191bmlub3J0aDsKICNpZmRlZiBDT05GSUdfUFBDNjQKIHN0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnUzX2FncDsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnU0X3BjaWU7CiBzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyICp1M19odDsKICNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIApAQCAtOTcsMTEgKzk4LDggQEAKIAogCS8qIExvb2t1cCB0aGUgImJ1cy1yYW5nZSIgcHJvcGVydHkgZm9yIHRoZSBob3NlICovCiAJYnVzX3JhbmdlID0gKGludCAqKSBnZXRfcHJvcGVydHkoYnJpZGdlLCAiYnVzLXJhbmdlIiwgJmxlbik7Ci0JaWYgKGJ1c19yYW5nZSA9PSBOVUxMIHx8IGxlbiA8IDIgKiBzaXplb2YoaW50KSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBnZXQgYnVzLXJhbmdlIGZvciAlc1xuIiwKLQkJCSAgICAgICBicmlkZ2UtPmZ1bGxfbmFtZSk7CisJaWYgKGJ1c19yYW5nZSA9PSBOVUxMIHx8IGxlbiA8IDIgKiBzaXplb2YoaW50KSkKIAkJcmV0dXJuOwotCX0KIAlidXNfcmFuZ2VbMV0gPSBmaXh1cF9vbmVfbGV2ZWxfYnVzX3JhbmdlKGJyaWRnZS0+Y2hpbGQsIGJ1c19yYW5nZVsxXSk7CiB9CiAKQEAgLTEyOCwxNCArMTI2LDE0IEBACiAgKi8KIAogI2RlZmluZSBNQUNSSVNDX0NGQTAoZGV2Zm4sIG9mZikJXAotCSgoMSA8PCAodW5zaWduZWQgbG9uZylQQ0lfU0xPVChkZXZfZm4pKSBcCi0JfCAoKCh1bnNpZ25lZCBsb25nKVBDSV9GVU5DKGRldl9mbikpIDw8IDgpIFwKLQl8ICgoKHVuc2lnbmVkIGxvbmcpKG9mZikpICYgMHhGQ1VMKSkKKwkoKDEgPDwgKHVuc2lnbmVkIGludClQQ0lfU0xPVChkZXZfZm4pKSBcCisJfCAoKCh1bnNpZ25lZCBpbnQpUENJX0ZVTkMoZGV2X2ZuKSkgPDwgOCkgXAorCXwgKCgodW5zaWduZWQgaW50KShvZmYpKSAmIDB4RkNVTCkpCiAKICNkZWZpbmUgTUFDUklTQ19DRkExKGJ1cywgZGV2Zm4sIG9mZikJXAotCSgoKCh1bnNpZ25lZCBsb25nKShidXMpKSA8PCAxNikgXAotCXwoKCh1bnNpZ25lZCBsb25nKShkZXZmbikpIDw8IDgpIFwKLQl8KCgodW5zaWduZWQgbG9uZykob2ZmKSkgJiAweEZDVUwpIFwKKwkoKCgodW5zaWduZWQgaW50KShidXMpKSA8PCAxNikgXAorCXwoKCh1bnNpZ25lZCBpbnQpKGRldmZuKSkgPDwgOCkgXAorCXwoKCh1bnNpZ25lZCBpbnQpKG9mZikpICYgMHhGQ1VMKSBcCiAJfDFVTCkKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFjcmlzY19jZmdfYWNjZXNzKHN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSwKQEAgLTE2OCw3ICsxNjYsOCBAQAogCWhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoYnVzKTsKIAlpZiAoaG9zZSA9PSBOVUxMKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwotCisJaWYgKG9mZnNldCA+PSAweDEwMCkKKwkJcmV0dXJuICBQQ0lCSU9TX0JBRF9SRUdJU1RFUl9OVU1CRVI7CiAJYWRkciA9IG1hY3Jpc2NfY2ZnX2FjY2Vzcyhob3NlLCBidXMtPm51bWJlciwgZGV2Zm4sIG9mZnNldCk7CiAJaWYgKCFhZGRyKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwpAQCAtMTk5LDcgKzE5OCw4IEBACiAJaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOwogCWlmIChob3NlID09IE5VTEwpCiAJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KKwlpZiAob2Zmc2V0ID49IDB4MTAwKQorCQlyZXR1cm4gIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKIAlhZGRyID0gbWFjcmlzY19jZmdfYWNjZXNzKGhvc2UsIGJ1cy0+bnVtYmVyLCBkZXZmbiwgb2Zmc2V0KTsKIAlpZiAoIWFkZHIpCiAJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CkBAIC0yMzQsMTIgKzIzNCwxMyBAQAogLyoKICAqIFZlcmlmeSB0aGF0IGEgc3BlY2lmaWMgKGJ1cywgZGV2X2ZuKSBleGlzdHMgb24gY2hhb3MKICAqLwotc3RhdGljIGludAotY2hhb3NfdmFsaWRhdGVfZGV2KHN0cnVjdCBwY2lfYnVzICpidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCkKK3N0YXRpYyBpbnQgY2hhb3NfdmFsaWRhdGVfZGV2KHN0cnVjdCBwY2lfYnVzICpidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCXUzMiAqdmVuZG9yLCAqZGV2aWNlOwogCisJaWYgKG9mZnNldCA+PSAweDEwMCkKKwkJcmV0dXJuICBQQ0lCSU9TX0JBRF9SRUdJU1RFUl9OVU1CRVI7CiAJbnAgPSBwY2lfYnVzZGV2X3RvX09GX25vZGUoYnVzLCBkZXZmbik7CiAJaWYgKG5wID09IE5VTEwpCiAJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CkBAIC0yODUsMTUgKzI4NiwxMyBAQAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IHNldHVwX2NoYW9zKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKLQkJCSAgICAgICBzdHJ1Y3QgcmVnX3Byb3BlcnR5ICphZGRyKQorCQkJICAgICAgIHN0cnVjdCByZXNvdXJjZSAqYWRkcikKIHsKIAkvKiBhc3N1bWUgYSBgY2hhb3MnIGJyaWRnZSAqLwogCWhvc2UtPm9wcyA9ICZjaGFvc19wY2lfb3BzOwotCWhvc2UtPmNmZ19hZGRyID0gaW9yZW1hcChhZGRyLT5hZGRyZXNzICsgMHg4MDAwMDAsIDB4MTAwMCk7Ci0JaG9zZS0+Y2ZnX2RhdGEgPSBpb3JlbWFwKGFkZHItPmFkZHJlc3MgKyAweGMwMDAwMCwgMHgxMDAwKTsKKwlob3NlLT5jZmdfYWRkciA9IGlvcmVtYXAoYWRkci0+c3RhcnQgKyAweDgwMDAwMCwgMHgxMDAwKTsKKwlob3NlLT5jZmdfZGF0YSA9IGlvcmVtYXAoYWRkci0+c3RhcnQgKyAweGMwMDAwMCwgMHgxMDAwKTsKIH0KLSNlbHNlCi0jZGVmaW5lIHNldHVwX2NoYW9zKGhvc2UsIGFkZHIpCiAjZW5kaWYgLyogQ09ORklHX1BQQzMyICovCiAKICNpZmRlZiBDT05GSUdfUFBDNjQKQEAgLTMyNiw3ICszMjUsNyBAQAogCWVsc2UKIAkJYnVzZG4gPSBob3NlLT5hcmNoX2RhdGE7CiAJZm9yIChkbiA9IGJ1c2RuLT5jaGlsZDsgZG47IGRuID0gZG4tPnNpYmxpbmcpCi0JCWlmIChkbi0+ZGF0YSAmJiBQQ0lfRE4oZG4pLT5kZXZmbiA9PSBkZXZmbikKKwkJaWYgKFBDSV9ETihkbikgJiYgUENJX0ROKGRuKS0+ZGV2Zm4gPT0gZGV2Zm4pCiAJCQlicmVhazsKIAlpZiAoZG4gPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwpAQCAtMzQzLDEwICszNDIsMTAgQEAKIH0KIAogI2RlZmluZSBVM19IVF9DRkEwKGRldmZuLCBvZmYpCQlcCi0JCSgoKCh1bnNpZ25lZCBsb25nKWRldmZuKSA8PCA4KSB8IG9mZnNldCkKKwkJKCgoKHVuc2lnbmVkIGludClkZXZmbikgPDwgOCkgfCBvZmZzZXQpCiAjZGVmaW5lIFUzX0hUX0NGQTEoYnVzLCBkZXZmbiwgb2ZmKQlcCiAJCShVM19IVF9DRkEwKGRldmZuLCBvZmYpIFwKLQkJKyAoKCh1bnNpZ25lZCBsb25nKWJ1cykgPDwgMTYpIFwKKwkJKyAoKCh1bnNpZ25lZCBpbnQpYnVzKSA8PCAxNikgXAogCQkrIDB4MDEwMDAwMDBVTCkKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgdTNfaHRfY2ZnX2FjY2VzcyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsCkBAIC0zNTYsOSArMzU1LDExIEBACiAJCS8qIEZvciBub3csIHdlIGRvbid0IHNlbGYgcHJvYmUgVTMgSFQgYnJpZGdlICovCiAJCWlmIChQQ0lfU0xPVChkZXZmbikgPT0gMCkKIAkJCXJldHVybiAwOwotCQlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKWhvc2UtPmNmZ19kYXRhKSArIFUzX0hUX0NGQTAoZGV2Zm4sIG9mZnNldCk7CisJCXJldHVybiAoKHVuc2lnbmVkIGxvbmcpaG9zZS0+Y2ZnX2RhdGEpICsKKwkJCVUzX0hUX0NGQTAoZGV2Zm4sIG9mZnNldCk7CiAJfSBlbHNlCi0JCXJldHVybiAoKHVuc2lnbmVkIGxvbmcpaG9zZS0+Y2ZnX2RhdGEpICsgVTNfSFRfQ0ZBMShidXMsIGRldmZuLCBvZmZzZXQpOworCQlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKWhvc2UtPmNmZ19kYXRhKSArCisJCQlVM19IVF9DRkExKGJ1cywgZGV2Zm4sIG9mZnNldCk7CiB9CiAKIHN0YXRpYyBpbnQgdTNfaHRfcmVhZF9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLApAQCAtMzcwLDcgKzM3MSw4IEBACiAJaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOwogCWlmIChob3NlID09IE5VTEwpCiAJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KKwlpZiAob2Zmc2V0ID49IDB4MTAwKQorCQlyZXR1cm4gIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKIAlhZGRyID0gdTNfaHRfY2ZnX2FjY2Vzcyhob3NlLCBidXMtPm51bWJlciwgZGV2Zm4sIG9mZnNldCk7CiAJaWYgKCFhZGRyKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwpAQCAtNDE5LDcgKzQyMSw4IEBACiAJaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOwogCWlmIChob3NlID09IE5VTEwpCiAJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KKwlpZiAob2Zmc2V0ID49IDB4MTAwKQorCQlyZXR1cm4gIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKIAlhZGRyID0gdTNfaHRfY2ZnX2FjY2Vzcyhob3NlLCBidXMtPm51bWJlciwgZGV2Zm4sIG9mZnNldCk7CiAJaWYgKCFhZGRyKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwpAQCAtNDU5LDYgKzQ2MiwxMTIgQEAKIAl1M19odF9yZWFkX2NvbmZpZywKIAl1M19odF93cml0ZV9jb25maWcKIH07CisKKyNkZWZpbmUgVTRfUENJRV9DRkEwKGRldmZuLCBvZmYpCVwKKwkoKDEgPDwgKCh1bnNpZ25lZCBpbnQpUENJX1NMT1QoZGV2X2ZuKSkpCVwKKwkgfCAoKCh1bnNpZ25lZCBpbnQpUENJX0ZVTkMoZGV2X2ZuKSkgPDwgOCkJXAorCSB8ICgoKCh1bnNpZ25lZCBpbnQpKG9mZikpID4+IDgpIDw8IDI4KSBcCisJIHwgKCgodW5zaWduZWQgaW50KShvZmYpKSAmIDB4ZmNVKSkKKworI2RlZmluZSBVNF9QQ0lFX0NGQTEoYnVzLCBkZXZmbiwgb2ZmKQlcCisJKCgoKHVuc2lnbmVkIGludCkoYnVzKSkgPDwgMTYpIFwKKwkgfCgoKHVuc2lnbmVkIGludCkoZGV2Zm4pKSA8PCA4KQlcCisJIHwgKCgoKHVuc2lnbmVkIGludCkob2ZmKSkgPj4gOCkgPDwgMjgpIFwKKwkgfCgoKHVuc2lnbmVkIGludCkob2ZmKSkgJiAweGZjVSkJXAorCSB8MVVMKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB1NF9wY2llX2NmZ19hY2Nlc3Moc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlLAorCQkJCQl1OCBidXMsIHU4IGRldl9mbiwgaW50IG9mZnNldCkKK3sKKwl1bnNpZ25lZCBpbnQgY2FkZHI7CisKKwlpZiAoYnVzID09IGhvc2UtPmZpcnN0X2J1c25vKSB7CisJCWNhZGRyID0gVTRfUENJRV9DRkEwKGRldl9mbiwgb2Zmc2V0KTsKKwl9IGVsc2UKKwkJY2FkZHIgPSBVNF9QQ0lFX0NGQTEoYnVzLCBkZXZfZm4sIG9mZnNldCk7CisKKwkvKiBVbmlub3J0aCB3aWxsIHJldHVybiBnYXJiYWdlIGlmIHdlIGRvbid0IHJlYWQgYmFjayB0aGUgdmFsdWUgISAqLworCWRvIHsKKwkJb3V0X2xlMzIoaG9zZS0+Y2ZnX2FkZHIsIGNhZGRyKTsKKwl9IHdoaWxlIChpbl9sZTMyKGhvc2UtPmNmZ19hZGRyKSAhPSBjYWRkcik7CisKKwlvZmZzZXQgJj0gMHgwMzsKKwlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKWhvc2UtPmNmZ19kYXRhKSArIG9mZnNldDsKK30KKworc3RhdGljIGludCB1NF9wY2llX3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCSAgICAgICBpbnQgb2Zmc2V0LCBpbnQgbGVuLCB1MzIgKnZhbCkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOworCWlmIChob3NlID09IE5VTEwpCisJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisJaWYgKG9mZnNldCA+PSAweDEwMDApCisJCXJldHVybiAgUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVSOworCWFkZHIgPSB1NF9wY2llX2NmZ19hY2Nlc3MoaG9zZSwgYnVzLT5udW1iZXIsIGRldmZuLCBvZmZzZXQpOworCWlmICghYWRkcikKKwkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKKwkvKgorCSAqIE5vdGU6IHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IG9mZnNldCBpcworCSAqIHN1aXRhYmx5IGFsaWduZWQgYW5kIHRoYXQgbGVuIGlzIDEsIDIgb3IgNC4KKwkgKi8KKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJKnZhbCA9IGluXzgoKHU4ICopYWRkcik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJKnZhbCA9IGluX2xlMTYoKHUxNiAqKWFkZHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkqdmFsID0gaW5fbGUzMigodTMyICopYWRkcik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdGF0aWMgaW50IHU0X3BjaWVfd3JpdGVfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCQlpbnQgb2Zmc2V0LCBpbnQgbGVuLCB1MzIgdmFsKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlob3NlID0gcGNpX2J1c190b19ob3N0KGJ1cyk7CisJaWYgKGhvc2UgPT0gTlVMTCkKKwkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKKwlpZiAob2Zmc2V0ID49IDB4MTAwMCkKKwkJcmV0dXJuICBQQ0lCSU9TX0JBRF9SRUdJU1RFUl9OVU1CRVI7CisJYWRkciA9IHU0X3BjaWVfY2ZnX2FjY2Vzcyhob3NlLCBidXMtPm51bWJlciwgZGV2Zm4sIG9mZnNldCk7CisJaWYgKCFhZGRyKQorCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCS8qCisJICogTm90ZTogdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIHRoYXQgb2Zmc2V0IGlzCisJICogc3VpdGFibHkgYWxpZ25lZCBhbmQgdGhhdCBsZW4gaXMgMSwgMiBvciA0LgorCSAqLworCXN3aXRjaCAobGVuKSB7CisJY2FzZSAxOgorCQlvdXRfOCgodTggKilhZGRyLCB2YWwpOworCQkodm9pZCkgaW5fOCgodTggKilhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlvdXRfbGUxNigodTE2ICopYWRkciwgdmFsKTsKKwkJKHZvaWQpIGluX2xlMTYoKHUxNiAqKWFkZHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlvdXRfbGUzMigodTMyICopYWRkciwgdmFsKTsKKwkJKHZvaWQpIGluX2xlMzIoKHUzMiAqKWFkZHIpOworCQlicmVhazsKKwl9CisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfb3BzIHU0X3BjaWVfcGNpX29wcyA9Cit7CisJdTRfcGNpZV9yZWFkX2NvbmZpZywKKwl1NF9wY2llX3dyaXRlX2NvbmZpZworfTsKKwogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCiAjaWZkZWYgQ09ORklHX1BQQzMyCkBAIC01MzIsNyArNjQxLDggQEAKIAl9CiAJaWYgKGVhcmx5X3JlYWRfY29uZmlnX3dvcmQoaG9zZSwgYnVzLCBkZXZmbiwKIAkJCQkgICBQQ0lfQlJJREdFX0NPTlRST0wsICZ2YWwpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImluaXRfcDJwYnJpZGdlOiBjb3VsZG4ndCByZWFkIGJyaWRnZSBjb250cm9sXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJpbml0X3AycGJyaWRnZTogY291bGRuJ3QgcmVhZCBicmlkZ2UiCisJCSAgICAgICAiIGNvbnRyb2xcbiIpOwogCQlyZXR1cm47CiAJfQogCXZhbCAmPSB+UENJX0JSSURHRV9DVExfTUFTVEVSX0FCT1JUOwpAQCAtNTc2LDM2ICs2ODYsMzggQEAKIAkJCWNvbnRpbnVlOwogCQllYXJseV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCBidXMsIGRldmZuLCAweGU0LCAmZGF0YSk7CiAJCWlmIChkYXRhICYgMVVMKSB7Ci0JCQlwcmludGsoIkZvdW5kIE5FQyBQRDcyMDEwMEEgVVNCMiBjaGlwIHdpdGggZGlzYWJsZWQgRUhDSSwgZml4aW5nIHVwLi4uXG4iKTsKKwkJCXByaW50aygiRm91bmQgTkVDIFBENzIwMTAwQSBVU0IyIGNoaXAgd2l0aCBkaXNhYmxlZCIKKwkJCSAgICAgICAiIEVIQ0ksIGZpeGluZyB1cC4uLlxuIik7CiAJCQlkYXRhICY9IH4xVUw7CiAJCQllYXJseV93cml0ZV9jb25maWdfZHdvcmQoaG9zZSwgYnVzLCBkZXZmbiwgMHhlNCwgZGF0YSk7Ci0JCQllYXJseV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBidXMsIGRldmZuIHwgMiwgUENJX0lOVEVSUlVQVF9MSU5FLAorCQkJZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgYnVzLAorCQkJCQkJZGV2Zm4gfCAyLCBQQ0lfSU5URVJSVVBUX0xJTkUsCiAJCQkJbmVjLT5pbnRyc1swXS5saW5lKTsKIAkJfQogCX0KIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHNldHVwX2JhbmRpdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCi0JCQkJc3RydWN0IHJlZ19wcm9wZXJ0eSAqYWRkcikKKwkJCQlzdHJ1Y3QgcmVzb3VyY2UgKmFkZHIpCiB7CiAJaG9zZS0+b3BzID0gJm1hY3Jpc2NfcGNpX29wczsKLQlob3NlLT5jZmdfYWRkciA9IGlvcmVtYXAoYWRkci0+YWRkcmVzcyArIDB4ODAwMDAwLCAweDEwMDApOwotCWhvc2UtPmNmZ19kYXRhID0gaW9yZW1hcChhZGRyLT5hZGRyZXNzICsgMHhjMDAwMDAsIDB4MTAwMCk7CisJaG9zZS0+Y2ZnX2FkZHIgPSBpb3JlbWFwKGFkZHItPnN0YXJ0ICsgMHg4MDAwMDAsIDB4MTAwMCk7CisJaG9zZS0+Y2ZnX2RhdGEgPSBpb3JlbWFwKGFkZHItPnN0YXJ0ICsgMHhjMDAwMDAsIDB4MTAwMCk7CiAJaW5pdF9iYW5kaXQoaG9zZSk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHNldHVwX3VuaW5vcnRoKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKLQkJCQkgc3RydWN0IHJlZ19wcm9wZXJ0eSAqYWRkcikKKwkJCQkgc3RydWN0IHJlc291cmNlICphZGRyKQogewogCXBjaV9hc3NpZ25fYWxsX2J1c2VzID0gMTsKIAloYXNfdW5pbm9ydGggPSAxOwogCWhvc2UtPm9wcyA9ICZtYWNyaXNjX3BjaV9vcHM7Ci0JaG9zZS0+Y2ZnX2FkZHIgPSBpb3JlbWFwKGFkZHItPmFkZHJlc3MgKyAweDgwMDAwMCwgMHgxMDAwKTsKLQlob3NlLT5jZmdfZGF0YSA9IGlvcmVtYXAoYWRkci0+YWRkcmVzcyArIDB4YzAwMDAwLCAweDEwMDApOworCWhvc2UtPmNmZ19hZGRyID0gaW9yZW1hcChhZGRyLT5zdGFydCArIDB4ODAwMDAwLCAweDEwMDApOworCWhvc2UtPmNmZ19kYXRhID0gaW9yZW1hcChhZGRyLT5zdGFydCArIDB4YzAwMDAwLCAweDEwMDApOwogCS8qIFdlICJrbm93IiB0aGF0IHRoZSBicmlkZ2UgYXQgZjIwMDAwMDAgaGFzIHRoZSBQQ0kgc2xvdHMuICovCi0JcmV0dXJuIGFkZHItPmFkZHJlc3MgPT0gMHhmMjAwMDAwMDsKKwlyZXR1cm4gYWRkci0+c3RhcnQgPT0gMHhmMjAwMDAwMDsKIH0KLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19QUEMzMiAqLwogCiAjaWZkZWYgQ09ORklHX1BQQzY0CiBzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfdTNfYWdwKHN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSkKQEAgLTYyNSwxNSArNzM3LDM2IEBACiAJaG9zZS0+b3BzID0gJm1hY3Jpc2NfcGNpX29wczsKIAlob3NlLT5jZmdfYWRkciA9IGlvcmVtYXAoMHhmMDAwMDAwMCArIDB4ODAwMDAwLCAweDEwMDApOwogCWhvc2UtPmNmZ19kYXRhID0gaW9yZW1hcCgweGYwMDAwMDAwICsgMHhjMDAwMDAsIDB4MTAwMCk7Ci0KIAl1M19hZ3AgPSBob3NlOwogfQogCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfdTRfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UpCit7CisJLyogV2UgY3VycmVudGx5IG9ubHkgaW1wbGVtZW50IHRoZSAibm9uLWF0b21pYyIgY29uZmlnIHNwYWNlLCB0bworCSAqIGJlIG9wdGltaXNlZCBsYXRlci4KKwkgKi8KKwlob3NlLT5vcHMgPSAmdTRfcGNpZV9wY2lfb3BzOworCWhvc2UtPmNmZ19hZGRyID0gaW9yZW1hcCgweGYwMDAwMDAwICsgMHg4MDAwMDAsIDB4MTAwMCk7CisJaG9zZS0+Y2ZnX2RhdGEgPSBpb3JlbWFwKDB4ZjAwMDAwMDAgKyAweGMwMDAwMCwgMHgxMDAwKTsKKworCS8qIFRoZSBidXMgY29udGFpbnMgYSBicmlkZ2UgZnJvbSByb290IC0+IGRldmljZSwgd2UgbmVlZCB0bworCSAqIG1ha2UgaXQgdmlzaWJsZSBvbiBidXMgMCBzbyB0aGF0IHdlIHBpY2sgdGhlIHJpZ2h0IHR5cGUKKwkgKiBvZiBjb25maWcgY3ljbGVzLiBJZiB3ZSBkaWRuJ3QsIHdlIHdvdWxkIGhhdmUgdG8gZm9yY2UgYWxsCisJICogY29uZmlnIGN5Y2xlcyB0byBiZSB0eXBlIDEuIFNvIHdlIG92ZXJyaWRlIHRoZSAiYnVzLXJhbmdlIgorCSAqIHByb3BlcnR5IGhlcmUKKwkgKi8KKwlob3NlLT5maXJzdF9idXNubyA9IDB4MDA7CisJaG9zZS0+bGFzdF9idXNubyA9IDB4ZmY7CisJdTRfcGNpZSA9IGhvc2U7Cit9CisKIHN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF91M19odChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IChzdHJ1Y3QgZGV2aWNlX25vZGUgKilob3NlLT5hcmNoX2RhdGE7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpvdGhlciA9IE5VTEw7CiAJaW50IGksIGN1cjsKIAorCiAJaG9zZS0+b3BzID0gJnUzX2h0X3BjaV9vcHM7CiAKIAkvKiBXZSBoYXJkIGNvZGUgdGhlIGFkZHJlc3MgYmVjYXVzZSBvZiB0aGUgZGlmZmVyZW50IHNpemUgb2YKQEAgLTY2NywxMSArODAwLDIwIEBACiAKIAl1M19odCA9IGhvc2U7CiAKLQlpZiAodTNfYWdwID09IE5VTEwpIHsKLQkJREJHKCJVMyBoYXMgbm8gQUdQLCB1c2luZyBmdWxsIHJlc291cmNlIHJhbmdlXG4iKTsKKwlpZiAodTNfYWdwICE9IE5VTEwpCisJCW90aGVyID0gdTNfYWdwOworCWVsc2UgaWYgKHU0X3BjaWUgIT0gTlVMTCkKKwkJb3RoZXIgPSB1NF9wY2llOworCisJaWYgKG90aGVyID09IE5VTEwpIHsKKwkJREJHKCJVMy80IGhhcyBubyBBR1AvUENJRSwgdXNpbmcgZnVsbCByZXNvdXJjZSByYW5nZVxuIik7CiAJCXJldHVybjsKIAl9CiAKKwkvKiBGaXh1cCBidXMgcmFuZ2UgdnMuIFBDSUUgKi8KKwlpZiAodTRfcGNpZSkKKwkJaG9zZS0+bGFzdF9idXNubyA9IHU0X3BjaWUtPmZpcnN0X2J1c25vIC0gMTsKKwogCS8qIFdlICJyZW1vdmUiIHRoZSBBR1AgcmVzb3VyY2VzIGZyb20gdGhlIHJlc291cmNlcyBhbGxvY2F0ZWQgdG8gSFQsCiAJICogdGhhdCBpcyB3ZSBjcmVhdGUgImhvbGVzIi4gSG93ZXZlciwgdGhhdCBjb2RlIGRvZXMgYXNzdW1wdGlvbnMKIAkgKiB0aGF0IHNvIGZhciBoYXBwZW4gdG8gYmUgdHJ1ZSAoY3Jvc3MgZmluZ2Vycy4uLiksIHR5cGljYWxseSB0aGF0CkBAIC02NzksNyArODIxLDcgQEAKIAkgKi8KIAljdXIgPSAwOwogCWZvciAoaT0wOyBpPDM7IGkrKykgewotCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZ1M19hZ3AtPm1lbV9yZXNvdXJjZXNbaV07CisJCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJm90aGVyLT5tZW1fcmVzb3VyY2VzW2ldOwogCQlpZiAocmVzLT5mbGFncyAhPSBJT1JFU09VUkNFX01FTSkKIAkJCWNvbnRpbnVlOwogCQkvKiBXZSBkb24ndCBjYXJlIGFib3V0ICJmaW5lIiByZXNvdXJjZXMgKi8KQEAgLTcyMiw3ICs4NjQsNyBAQAogCQlob3NlLT5tZW1fcmVzb3VyY2VzW2N1ci0xXS5lbmQgPSByZXMtPnN0YXJ0IC0gMTsKIAl9CiB9Ci0jZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIAogLyoKICAqIFdlIGFzc3VtZSB0aGF0IGlmIHdlIGhhdmUgYSBHMyBwb3dlcm1hYywgd2UgaGF2ZSBvbmUgYnJpZGdlIGNhbGxlZApAQCAtNzMzLDI0ICs4NzUsMTcgQEAKIHsKIAlpbnQgbGVuOwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLSNpZmRlZiBDT05GSUdfUFBDMzIKLQlzdHJ1Y3QgcmVnX3Byb3BlcnR5ICphZGRyOwotI2VuZGlmCisJc3RydWN0IHJlc291cmNlIHJzcmM7CiAJY2hhciAqZGlzcF9uYW1lOwogCWludCAqYnVzX3JhbmdlOwotCWludCBwcmltYXJ5ID0gMTsKKwlpbnQgcHJpbWFyeSA9IDEsIGhhc19hZGRyZXNzID0gMDsKIAogCURCRygiQWRkaW5nIFBDSSBob3N0IGJyaWRnZSAlc1xuIiwgZGV2LT5mdWxsX25hbWUpOwogCi0jaWZkZWYgQ09ORklHX1BQQzMyCi0JLyogWFhYIGZpeCB0aGlzICovCi0JYWRkciA9IChzdHJ1Y3QgcmVnX3Byb3BlcnR5ICopIGdldF9wcm9wZXJ0eShkZXYsICJyZWciLCAmbGVuKTsKLQlpZiAoYWRkciA9PSBOVUxMIHx8IGxlbiA8IHNpemVvZigqYWRkcikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgdXNlICVzOiBubyBhZGRyZXNzXG4iLAotCQkgICAgICAgZGV2LT5mdWxsX25hbWUpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0jZW5kaWYKKwkvKiBGZXRjaCBob3N0IGJyaWRnZSByZWdpc3RlcnMgYWRkcmVzcyAqLworCWhhc19hZGRyZXNzID0gKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZGV2LCAwLCAmcnNyYykgPT0gMCk7CisKKwkvKiBHZXQgYnVzIHJhbmdlIGlmIGFueSAqLwogCWJ1c19yYW5nZSA9IChpbnQgKikgZ2V0X3Byb3BlcnR5KGRldiwgImJ1cy1yYW5nZSIsICZsZW4pOwogCWlmIChidXNfcmFuZ2UgPT0gTlVMTCB8fCBsZW4gPCAyICogc2l6ZW9mKGludCkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgZ2V0IGJ1cy1yYW5nZSBmb3IgJXMsIGFzc3VtZSIKQEAgLTc3MCw2ICs5MDUsOCBAQAogCWhvc2UtPmxhc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMV0gOiAweGZmOwogCiAJZGlzcF9uYW1lID0gTlVMTDsKKworCS8qIDY0IGJpdHMgb25seSBicmlkZ2VzICovCiAjaWZkZWYgQ09ORklHX1BQQzY0CiAJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKGRldiwgInUzLWFncCIpKSB7CiAJCXNldHVwX3UzX2FncChob3NlKTsKQEAgLTc3OSwyOCArOTE2LDM3IEBACiAJCXNldHVwX3UzX2h0KGhvc2UpOwogCQlkaXNwX25hbWUgPSAiVTMtSFQiOwogCQlwcmltYXJ5ID0gMTsKKwl9IGVsc2UgaWYgKGRldmljZV9pc19jb21wYXRpYmxlKGRldiwgInU0LXBjaWUiKSkgeworCQlzZXR1cF91NF9wY2llKGhvc2UpOworCQlkaXNwX25hbWUgPSAiVTQtUENJRSI7CisJCXByaW1hcnkgPSAwOwogCX0KLQlwcmludGsoS0VSTl9JTkZPICJGb3VuZCAlcyBQQ0kgaG9zdCBicmlkZ2UuICBGaXJtd2FyZSBidXMgbnVtYmVyOiAlZC0+JWRcbiIsCi0JCWRpc3BfbmFtZSwgaG9zZS0+Zmlyc3RfYnVzbm8sIGhvc2UtPmxhc3RfYnVzbm8pOwotI2Vsc2UKKwlwcmludGsoS0VSTl9JTkZPICJGb3VuZCAlcyBQQ0kgaG9zdCBicmlkZ2UuICBGaXJtd2FyZSBidXMgbnVtYmVyOiIKKwkgICAgICAgIiAlZC0+JWRcbiIsIGRpc3BfbmFtZSwgaG9zZS0+Zmlyc3RfYnVzbm8sIGhvc2UtPmxhc3RfYnVzbm8pOworI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLworCisJLyogMzIgYml0cyBvbmx5IGJyaWRnZXMgKi8KKyNpZmRlZiBDT05GSUdfUFBDMzIKIAlpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUoZGV2LCAidW5pLW5vcnRoIikpIHsKLQkJcHJpbWFyeSA9IHNldHVwX3VuaW5vcnRoKGhvc2UsIGFkZHIpOworCQlwcmltYXJ5ID0gc2V0dXBfdW5pbm9ydGgoaG9zZSwgJnJzcmMpOwogCQlkaXNwX25hbWUgPSAiVW5pTm9ydGgiOwogCX0gZWxzZSBpZiAoc3RyY21wKGRldi0+bmFtZSwgInBjaSIpID09IDApIHsKIAkJLyogWFhYIGFzc3VtZSB0aGlzIGlzIGEgbXBjMTA2IChncmFja2xlKSAqLwogCQlzZXR1cF9ncmFja2xlKGhvc2UpOwogCQlkaXNwX25hbWUgPSAiR3JhY2tsZSAoTVBDMTA2KSI7CiAJfSBlbHNlIGlmIChzdHJjbXAoZGV2LT5uYW1lLCAiYmFuZGl0IikgPT0gMCkgewotCQlzZXR1cF9iYW5kaXQoaG9zZSwgYWRkcik7CisJCXNldHVwX2JhbmRpdChob3NlLCAmcnNyYyk7CiAJCWRpc3BfbmFtZSA9ICJCYW5kaXQiOwogCX0gZWxzZSBpZiAoc3RyY21wKGRldi0+bmFtZSwgImNoYW9zIikgPT0gMCkgewotCQlzZXR1cF9jaGFvcyhob3NlLCBhZGRyKTsKKwkJc2V0dXBfY2hhb3MoaG9zZSwgJnJzcmMpOwogCQlkaXNwX25hbWUgPSAiQ2hhb3MiOwogCQlwcmltYXJ5ID0gMDsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgJXMgUENJIGhvc3QgYnJpZGdlIGF0IDB4JTA4bHguIEZpcm13YXJlIGJ1cyBudW1iZXI6ICVkLT4lZFxuIiwKLQkJZGlzcF9uYW1lLCBhZGRyLT5hZGRyZXNzLCBob3NlLT5maXJzdF9idXNubywgaG9zZS0+bGFzdF9idXNubyk7Ci0jZW5kaWYKKwlwcmludGsoS0VSTl9JTkZPICJGb3VuZCAlcyBQQ0kgaG9zdCBicmlkZ2UgYXQgMHglMDhseC4gIgorCSAgICAgICAiRmlybXdhcmUgYnVzIG51bWJlcjogJWQtPiVkXG4iLAorCQlkaXNwX25hbWUsIHJzcmMuc3RhcnQsIGhvc2UtPmZpcnN0X2J1c25vLCBob3NlLT5sYXN0X2J1c25vKTsKKyNlbmRpZiAvKiBDT05GSUdfUFBDMzIgKi8KKwogCURCRygiIC0+SG9zZSBhdCAweCVwLCBjZmdfYWRkcj0weCVwLGNmZ19kYXRhPTB4JXBcbiIsCiAJCWhvc2UsIGhvc2UtPmNmZ19hZGRyLCBob3NlLT5jZmdfZGF0YSk7CiAKQEAgLTgxNCw4ICs5NjAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQKLXBjaWJpb3NfZml4dXBfT0ZfaW50ZXJydXB0cyh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IHBjaWJpb3NfZml4dXBfT0ZfaW50ZXJydXB0cyh2b2lkKQogewogCXN0cnVjdCBwY2lfZGV2KiBkZXYgPSBOVUxMOwogCkBAIC04MzUsOCArOTgwLDcgQEAKIAl9CiB9CiAKLXZvaWQgX19pbml0Ci1wbWFjX3BjaWJpb3NfZml4dXAodm9pZCkKK3ZvaWQgX19pbml0IHBtYWNfcGNpYmlvc19maXh1cCh2b2lkKQogewogCS8qIEZpeHVwIGludGVycnVwdHMgYWNjb3JkaW5nIHRvIE9GIHRyZWUgKi8KIAlwY2liaW9zX2ZpeHVwX09GX2ludGVycnVwdHMoKTsKQEAgLTg5OSw2ICsxMDQzLDggQEAKIAkJcGNpX3NldHVwX3BoYl9pbyh1M19odCwgMSk7CiAJaWYgKHUzX2FncCkKIAkJcGNpX3NldHVwX3BoYl9pbyh1M19hZ3AsIDApOworCWlmICh1NF9wY2llKQorCQlwY2lfc2V0dXBfcGhiX2lvKHU0X3BjaWUsIDApOwogCiAJLyoKIAkgKiBPbiBwcGM2NCwgZml4dXAgdGhlIElPIHJlc291cmNlcyBvbiBvdXIgaG9zdCBicmlkZ2VzIGFzCkBAIC05MTEsNyArMTA1Nyw4IEBACiAKIAkvKiBGaXh1cCB0aGUgUENJPC0+T0YgbWFwcGluZyBmb3IgVTMgQUdQIGR1ZSB0byBidXMgcmVudW1iZXJpbmcuIFdlCiAJICogYXNzdW1lIHRoZXJlIGlzIG5vIFAyUCBicmlkZ2Ugb24gdGhlIEFHUCBidXMsIHdoaWNoIHNob3VsZCBiZSBhCi0JICogc2FmZSBhc3N1bXB0aW9ucyBob3BlZnVsbHkuCisJICogc2FmZSBhc3N1bXB0aW9ucyBmb3Igbm93LiBXZSBzaG91bGQgZG8gc29tZXRoaW5nIGJldHRlciBpbiB0aGUKKwkgKiBmdXR1cmUgdGhvdWdoCiAJICovCiAJaWYgKHUzX2FncCkgewogCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gdTNfYWdwLT5hcmNoX2RhdGE7CkBAIC05MTksNyArMTA2Niw2IEBACiAJCWZvciAobnAgPSBucC0+Y2hpbGQ7IG5wOyBucCA9IG5wLT5zaWJsaW5nKQogCQkJUENJX0ROKG5wKS0+YnVzbm8gPSAweGYwOwogCX0KLQogCS8qIHBtYWNfY2hlY2tfaHRfbGluaygpOyAqLwogCiAJLyogVGVsbCBwY2kuYyB0byBub3QgdXNlIHRoZSBjb21tb24gcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gKi8KQEAgLTExMjYsNyArMTI3Miw4IEBACiAgZ29vZDoKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9DTEFTU19QUk9HLCAmcHJvZ2lmKTsKIAlpZiAoKHByb2dpZiAmIDUpICE9IDUpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRm9yY2luZyBQQ0kgSURFIGludG8gbmF0aXZlIG1vZGU6ICVzXG4iLCBwY2lfbmFtZShkZXYpKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRm9yY2luZyBQQ0kgSURFIGludG8gbmF0aXZlIG1vZGU6ICVzXG4iLAorCQkgICAgICAgcGNpX25hbWUoZGV2KSk7CiAJCSh2b2lkKSBwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfQ0xBU1NfUFJPRywgcHJvZ2lmfDUpOwogCQlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfQ0xBU1NfUFJPRywgJnByb2dpZikgfHwKIAkJICAgIChwcm9naWYgJiA1KSAhPSA1KQpAQCAtMTE1Miw3ICsxMjk5LDggQEAKIAkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewogCQkJZGV2LT5yZXNvdXJjZVtpXS5zdGFydCA9IGRldi0+cmVzb3VyY2VbaV0uZW5kID0gMDsKIAkJCWRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgPSAwOwotCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCArIDQgKiBpLCAwKTsKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAgKyA0ICogaSwKKwkJCQkJICAgICAgIDApOwogCQl9CiAJfSBlbHNlIHsKIAkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CkBAIC0xMTYxLDcgKzEzMDksOCBAQAogCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CiAJCQlkZXYtPnJlc291cmNlW2ldLnN0YXJ0ID0gZGV2LT5yZXNvdXJjZVtpXS5lbmQgPSAwOwogCQkJZGV2LT5yZXNvdXJjZVtpXS5mbGFncyA9IDA7Ci0JCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX0JBU0VfQUREUkVTU18wICsgNCAqIGksIDApOworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCArIDQgKiBpLAorCQkJCQkgICAgICAgMCk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BmdW5jX2Jhc2UuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGZ1bmNfYmFzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZmQyYTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BmdW5jX2Jhc2UuYwpAQCAtMCwwICsxLDQwNSBAQAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS9wbWFjX2ZlYXR1cmUuaD4KKyNpbmNsdWRlIDxhc20vcG1hY19wZnVuYy5oPgorCisjZGVmaW5lIERCRyhmbXQuLi4pCXByaW50ayhmbXQpCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtYWNpb19ncGlvX2lycShpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwbWZfZG9faXJxKGRhdGEpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IG1hY2lvX2RvX2dwaW9faXJxX2VuYWJsZShzdHJ1Y3QgcG1mX2Z1bmN0aW9uICpmdW5jKQoreworCWlmIChmdW5jLT5ub2RlLT5uX2ludHJzIDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gcmVxdWVzdF9pcnEoZnVuYy0+bm9kZS0+aW50cnNbMF0ubGluZSwgbWFjaW9fZ3Bpb19pcnEsIDAsCisJCQkgICBmdW5jLT5ub2RlLT5uYW1lLCBmdW5jKTsKK30KKworc3RhdGljIGludCBtYWNpb19kb19ncGlvX2lycV9kaXNhYmxlKHN0cnVjdCBwbWZfZnVuY3Rpb24gKmZ1bmMpCit7CisJaWYgKGZ1bmMtPm5vZGUtPm5faW50cnMgPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZyZWVfaXJxKGZ1bmMtPm5vZGUtPmludHJzWzBdLmxpbmUsIGZ1bmMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY2lvX2RvX2dwaW9fd3JpdGUoUE1GX1NURF9BUkdTLCB1OCB2YWx1ZSwgdTggbWFzaykKK3sKKwl1OCBfX2lvbWVtICphZGRyID0gKHU4IF9faW9tZW0gKilmdW5jLT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IHRtcDsKKworCS8qIENoZWNrIHBvbGFyaXR5ICovCisJaWYgKGFyZ3MgJiYgYXJncy0+Y291bnQgJiYgIWFyZ3MtPnVbMF0udikKKwkJdmFsdWUgPSB+dmFsdWU7CisKKwkvKiBUb2dnbGUgdGhlIEdQSU8gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmVhdHVyZV9sb2NrLCBmbGFncyk7CisJdG1wID0gcmVhZGIoYWRkcik7CisJdG1wID0gKHRtcCAmIH5tYXNrKSB8ICh2YWx1ZSAmIG1hc2spOworCURCRygiRG8gd3JpdGUgMHglMDJ4IHRvIEdQSU8gJXMgKCVwKVxuIiwKKwkgICAgdG1wLCBmdW5jLT5ub2RlLT5mdWxsX25hbWUsIGFkZHIpOworCXdyaXRlYih0bXAsIGFkZHIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZlYXR1cmVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFjaW9fZG9fZ3Bpb19yZWFkKFBNRl9TVERfQVJHUywgdTggbWFzaywgaW50IHJzaGlmdCwgdTggeG9yKQoreworCXU4IF9faW9tZW0gKmFkZHIgPSAodTggX19pb21lbSAqKWZ1bmMtPmRyaXZlcl9kYXRhOworCXUzMiB2YWx1ZTsKKworCS8qIENoZWNrIGlmIHdlIGhhdmUgcm9vbSBmb3IgcmVwbHkgKi8KKwlpZiAoYXJncyA9PSBOVUxMIHx8IGFyZ3MtPmNvdW50ID09IDAgfHwgYXJncy0+dVswXS5wID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJdmFsdWUgPSByZWFkYihhZGRyKTsKKwkqYXJncy0+dVswXS5wID0gKCh2YWx1ZSAmIG1hc2spID4+IHJzaGlmdCkgXiB4b3I7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWNpb19kb19kZWxheShQTUZfU1REX0FSR1MsIHUzMiBkdXJhdGlvbikKK3sKKwkvKiBhc3N1bWUgd2UgY2FuIHNsZWVwICEgKi8KKwltc2xlZXAoKGR1cmF0aW9uICsgOTk5KSAvIDEwMDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBtZl9oYW5kbGVycyBtYWNpb19ncGlvX2hhbmRsZXJzID0geworCS5pcnFfZW5hYmxlCT0gbWFjaW9fZG9fZ3Bpb19pcnFfZW5hYmxlLAorCS5pcnFfZGlzYWJsZQk9IG1hY2lvX2RvX2dwaW9faXJxX2Rpc2FibGUsCisJLndyaXRlX2dwaW8JPSBtYWNpb19kb19ncGlvX3dyaXRlLAorCS5yZWFkX2dwaW8JPSBtYWNpb19kb19ncGlvX3JlYWQsCisJLmRlbGF5CQk9IG1hY2lvX2RvX2RlbGF5LAorfTsKKworc3RhdGljIHZvaWQgbWFjaW9fZ3Bpb19pbml0X29uZShzdHJ1Y3QgbWFjaW9fY2hpcCAqbWFjaW8pCit7CisJc3RydWN0IGRldmljZV9ub2RlICpncGFyZW50LCAqZ3A7CisKKwkvKgorCSAqIEZpbmQgdGhlICJncGlvIiBwYXJlbnQgbm9kZQorCSAqLworCisJZm9yIChncGFyZW50ID0gTlVMTDsKKwkgICAgIChncGFyZW50ID0gb2ZfZ2V0X25leHRfY2hpbGQobWFjaW8tPm9mX25vZGUsIGdwYXJlbnQpKSAhPSBOVUxMOykKKwkJaWYgKHN0cmNtcChncGFyZW50LT5uYW1lLCAiZ3BpbyIpID09IDApCisJCQlicmVhazsKKwlpZiAoZ3BhcmVudCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlEQkcoIkluc3RhbGxpbmcgR1BJTyBmdW5jdGlvbnMgZm9yIG1hY2lvICVzXG4iLAorCSAgICBtYWNpby0+b2Zfbm9kZS0+ZnVsbF9uYW1lKTsKKworCS8qCisJICogT2ssIGdvdCBvbmUsIHdlIGRvbnQgbmVlZCBhbnl0aGluZyBzcGVjaWFsIHRvIHRyYWNrIHRoZW0gZG93biwgc28KKwkgKiB3ZSBqdXN0IGNyZWF0ZSB0aGVtIGFsbAorCSAqLworCWZvciAoZ3AgPSBOVUxMOyAoZ3AgPSBvZl9nZXRfbmV4dF9jaGlsZChncGFyZW50LCBncCkpICE9IE5VTEw7KSB7CisJCXUzMiAqcmVnID0gKHUzMiAqKWdldF9wcm9wZXJ0eShncCwgInJlZyIsIE5VTEwpOworCQl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwkJaWYgKHJlZyA9PSBOVUxMKQorCQkJY29udGludWU7CisJCW9mZnNldCA9ICpyZWc7CisJCS8qIERlYWwgd2l0aCBvbGQgc3R5bGUgZGV2aWNlLXRyZWUuIFdlIGNhbiBzYWZlbHkgaGFyZCBjb2RlIHRoZQorCQkgKiBvZmZzZXQgZm9yIG5vdyB0b28gZXZlbiBpZiBpdCdzIGEgYml0IGdyb3NzIC4uLgorCQkgKi8KKwkJaWYgKG9mZnNldCA8IDB4NTApCisJCQlvZmZzZXQgKz0gMHg1MDsKKwkJb2Zmc2V0ICs9ICh1bnNpZ25lZCBsb25nKW1hY2lvLT5iYXNlOworCQlwbWZfcmVnaXN0ZXJfZHJpdmVyKGdwLCAmbWFjaW9fZ3Bpb19oYW5kbGVycywgKHZvaWQgKilvZmZzZXQpOworCX0KKworCURCRygiQ2FsbGluZyBpbml0aWFsIEdQSU8gZnVuY3Rpb25zIGZvciBtYWNpbyAlc1xuIiwKKwkgICAgbWFjaW8tPm9mX25vZGUtPmZ1bGxfbmFtZSk7CisKKwkvKiBBbmQgbm93IHdlIHJ1biBhbGwgdGhlIGluaXQgb25lcyAqLworCWZvciAoZ3AgPSBOVUxMOyAoZ3AgPSBvZl9nZXRfbmV4dF9jaGlsZChncGFyZW50LCBncCkpICE9IE5VTEw7KQorCQlwbWZfZG9fZnVuY3Rpb25zKGdwLCBOVUxMLCAwLCBQTUZfRkxBR1NfT05fSU5JVCwgTlVMTCk7CisKKwkvKiBOb3RlOiBXZSBkbyBub3QgYXQgdGhpcyBwb2ludCBpbXBsZW1lbnQgdGhlICJhdCBzbGVlcCIgb3IgImF0IHdha2UiCisJICogZnVuY3Rpb25zLiBJIHlldCB0byBmaW5kIGFueSBmb3IgR1BJT3MgYW55d2F5CisJICovCit9CisKK3N0YXRpYyBpbnQgbWFjaW9fZG9fd3JpdGVfcmVnMzIoUE1GX1NURF9BUkdTLCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUsIHUzMiBtYXNrKQoreworCXN0cnVjdCBtYWNpb19jaGlwICptYWNpbyA9IGZ1bmMtPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmVhdHVyZV9sb2NrLCBmbGFncyk7CisJTUFDSU9fT1VUMzIob2Zmc2V0LCAoTUFDSU9fSU4zMihvZmZzZXQpICYgfm1hc2spIHwgKHZhbHVlICYgbWFzaykpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZlYXR1cmVfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY2lvX2RvX3JlYWRfcmVnMzIoUE1GX1NURF9BUkdTLCB1MzIgb2Zmc2V0KQoreworCXN0cnVjdCBtYWNpb19jaGlwICptYWNpbyA9IGZ1bmMtPmRyaXZlcl9kYXRhOworCisJLyogQ2hlY2sgaWYgd2UgaGF2ZSByb29tIGZvciByZXBseSAqLworCWlmIChhcmdzID09IE5VTEwgfHwgYXJncy0+Y291bnQgPT0gMCB8fCBhcmdzLT51WzBdLnAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqYXJncy0+dVswXS5wID0gTUFDSU9fSU4zMihvZmZzZXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY2lvX2RvX3dyaXRlX3JlZzgoUE1GX1NURF9BUkdTLCB1MzIgb2Zmc2V0LCB1OCB2YWx1ZSwgdTggbWFzaykKK3sKKwlzdHJ1Y3QgbWFjaW9fY2hpcCAqbWFjaW8gPSBmdW5jLT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZlYXR1cmVfbG9jaywgZmxhZ3MpOworCU1BQ0lPX09VVDgob2Zmc2V0LCAoTUFDSU9fSU44KG9mZnNldCkgJiB+bWFzaykgfCAodmFsdWUgJiBtYXNrKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmVhdHVyZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFjaW9fZG9fcmVhZF9yZWc4KFBNRl9TVERfQVJHUywgdTMyIG9mZnNldCkKK3sKKwlzdHJ1Y3QgbWFjaW9fY2hpcCAqbWFjaW8gPSBmdW5jLT5kcml2ZXJfZGF0YTsKKworCS8qIENoZWNrIGlmIHdlIGhhdmUgcm9vbSBmb3IgcmVwbHkgKi8KKwlpZiAoYXJncyA9PSBOVUxMIHx8IGFyZ3MtPmNvdW50ID09IDAgfHwgYXJncy0+dVswXS5wID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJKigodTggKikoYXJncy0+dVswXS5wKSkgPSBNQUNJT19JTjgob2Zmc2V0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWNpb19kb19yZWFkX3JlZzMyX21zcngoUE1GX1NURF9BUkdTLCB1MzIgb2Zmc2V0LCB1MzIgbWFzaywKKwkJCQkgICAgdTMyIHNoaWZ0LCB1MzIgeG9yKQoreworCXN0cnVjdCBtYWNpb19jaGlwICptYWNpbyA9IGZ1bmMtPmRyaXZlcl9kYXRhOworCisJLyogQ2hlY2sgaWYgd2UgaGF2ZSByb29tIGZvciByZXBseSAqLworCWlmIChhcmdzID09IE5VTEwgfHwgYXJncy0+Y291bnQgPT0gMCB8fCBhcmdzLT51WzBdLnAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqYXJncy0+dVswXS5wID0gKChNQUNJT19JTjMyKG9mZnNldCkgJiBtYXNrKSA+PiBzaGlmdCkgXiB4b3I7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFjaW9fZG9fcmVhZF9yZWc4X21zcngoUE1GX1NURF9BUkdTLCB1MzIgb2Zmc2V0LCB1MzIgbWFzaywKKwkJCQkgICB1MzIgc2hpZnQsIHUzMiB4b3IpCit7CisJc3RydWN0IG1hY2lvX2NoaXAgKm1hY2lvID0gZnVuYy0+ZHJpdmVyX2RhdGE7CisKKwkvKiBDaGVjayBpZiB3ZSBoYXZlIHJvb20gZm9yIHJlcGx5ICovCisJaWYgKGFyZ3MgPT0gTlVMTCB8fCBhcmdzLT5jb3VudCA9PSAwIHx8IGFyZ3MtPnVbMF0ucCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSooKHU4ICopKGFyZ3MtPnVbMF0ucCkpID0gKChNQUNJT19JTjgob2Zmc2V0KSAmIG1hc2spID4+IHNoaWZ0KSBeIHhvcjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWNpb19kb193cml0ZV9yZWczMl9zbG0oUE1GX1NURF9BUkdTLCB1MzIgb2Zmc2V0LCB1MzIgc2hpZnQsCisJCQkJICAgIHUzMiBtYXNrKQoreworCXN0cnVjdCBtYWNpb19jaGlwICptYWNpbyA9IGZ1bmMtPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHRtcCwgdmFsOworCisJLyogQ2hlY2sgYXJncyAqLworCWlmIChhcmdzID09IE5VTEwgfHwgYXJncy0+Y291bnQgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmVhdHVyZV9sb2NrLCBmbGFncyk7CisJdG1wID0gTUFDSU9fSU4zMihvZmZzZXQpOworCXZhbCA9IGFyZ3MtPnVbMF0udiA8PCBzaGlmdDsKKwl0bXAgPSAodG1wICYgfm1hc2spIHwgKHZhbCAmIG1hc2spOworCU1BQ0lPX09VVDMyKG9mZnNldCwgdG1wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZWF0dXJlX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWNpb19kb193cml0ZV9yZWc4X3NsbShQTUZfU1REX0FSR1MsIHUzMiBvZmZzZXQsIHUzMiBzaGlmdCwKKwkJCQkgICB1MzIgbWFzaykKK3sKKwlzdHJ1Y3QgbWFjaW9fY2hpcCAqbWFjaW8gPSBmdW5jLT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB0bXAsIHZhbDsKKworCS8qIENoZWNrIGFyZ3MgKi8KKwlpZiAoYXJncyA9PSBOVUxMIHx8IGFyZ3MtPmNvdW50ID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZlYXR1cmVfbG9jaywgZmxhZ3MpOworCXRtcCA9IE1BQ0lPX0lOOChvZmZzZXQpOworCXZhbCA9IGFyZ3MtPnVbMF0udiA8PCBzaGlmdDsKKwl0bXAgPSAodG1wICYgfm1hc2spIHwgKHZhbCAmIG1hc2spOworCU1BQ0lPX09VVDgob2Zmc2V0LCB0bXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZlYXR1cmVfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBtZl9oYW5kbGVycyBtYWNpb19tbWlvX2hhbmRsZXJzID0geworCS53cml0ZV9yZWczMgkJPSBtYWNpb19kb193cml0ZV9yZWczMiwKKwkucmVhZF9yZWczMgkJPSBtYWNpb19kb19yZWFkX3JlZzMyLAorCS53cml0ZV9yZWc4CQk9IG1hY2lvX2RvX3dyaXRlX3JlZzgsCisJLnJlYWRfcmVnMzIJCT0gbWFjaW9fZG9fcmVhZF9yZWc4LAorCS5yZWFkX3JlZzMyX21zcngJPSBtYWNpb19kb19yZWFkX3JlZzMyX21zcngsCisJLnJlYWRfcmVnOF9tc3J4CQk9IG1hY2lvX2RvX3JlYWRfcmVnOF9tc3J4LAorCS53cml0ZV9yZWczMl9zbG0JPSBtYWNpb19kb193cml0ZV9yZWczMl9zbG0sCisJLndyaXRlX3JlZzhfc2xtCQk9IG1hY2lvX2RvX3dyaXRlX3JlZzhfc2xtLAorCS5kZWxheQkJCT0gbWFjaW9fZG9fZGVsYXksCit9OworCitzdGF0aWMgdm9pZCBtYWNpb19tbWlvX2luaXRfb25lKHN0cnVjdCBtYWNpb19jaGlwICptYWNpbykKK3sKKwlEQkcoIkluc3RhbGxpbmcgTU1JTyBmdW5jdGlvbnMgZm9yIG1hY2lvICVzXG4iLAorCSAgICBtYWNpby0+b2Zfbm9kZS0+ZnVsbF9uYW1lKTsKKworCXBtZl9yZWdpc3Rlcl9kcml2ZXIobWFjaW8tPm9mX25vZGUsICZtYWNpb19tbWlvX2hhbmRsZXJzLCBtYWNpbyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKnVuaW5faHdjbG9jazsKKworc3RhdGljIGludCB1bmluX2RvX3dyaXRlX3JlZzMyKFBNRl9TVERfQVJHUywgdTMyIG9mZnNldCwgdTMyIHZhbHVlLCB1MzIgbWFzaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZlYXR1cmVfbG9jaywgZmxhZ3MpOworCS8qIFRoaXMgaXMgZmFpcmx5IGJvZ3VzIGluIGRhcndpbiwgYnV0IGl0IHNob3VsZCB3b3JrIGZvciBvdXIgbmVlZHMKKwkgKiBpbXBsZW1ldGVkIHRoYXQgd2F5OgorCSAqLworCVVOX09VVChvZmZzZXQsIChVTl9JTihvZmZzZXQpICYgfm1hc2spIHwgKHZhbHVlICYgbWFzaykpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZlYXR1cmVfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcG1mX2hhbmRsZXJzIHVuaW5fbW1pb19oYW5kbGVycyA9IHsKKwkud3JpdGVfcmVnMzIJCT0gdW5pbl9kb193cml0ZV9yZWczMiwKKwkuZGVsYXkJCQk9IG1hY2lvX2RvX2RlbGF5LAorfTsKKworc3RhdGljIHZvaWQgdW5pbm9ydGhfaW5zdGFsbF9wZnVuYyh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlEQkcoIkluc3RhbGxpbmcgZnVuY3Rpb25zIGZvciBVbmlOICVzXG4iLAorCSAgICB1bmlub3J0aF9ub2RlLT5mdWxsX25hbWUpOworCisJLyoKKwkgKiBJbnN0YWxsIGhhbmRsZXJzIGZvciB0aGUgYnJpZGdlIGl0c2VsZgorCSAqLworCXBtZl9yZWdpc3Rlcl9kcml2ZXIodW5pbm9ydGhfbm9kZSwgJnVuaW5fbW1pb19oYW5kbGVycywgTlVMTCk7CisJcG1mX2RvX2Z1bmN0aW9ucyh1bmlub3J0aF9ub2RlLCBOVUxMLCAwLCBQTUZfRkxBR1NfT05fSU5JVCwgTlVMTCk7CisKKworCS8qCisJICogSW5zdGFsbCBoYW5kbGVycyBmb3IgdGhlIGh3Y2xvY2sgY2hpbGQgaWYgYW55CisJICovCisJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2dldF9uZXh0X2NoaWxkKHVuaW5vcnRoX25vZGUsIG5wKSkgIT0gTlVMTDspCisJCWlmIChzdHJjbXAobnAtPm5hbWUsICJody1jbG9jayIpID09IDApIHsKKwkJCXVuaW5faHdjbG9jayA9IG5wOworCQkJYnJlYWs7CisJCX0KKwlpZiAodW5pbl9od2Nsb2NrKSB7CisJCURCRygiSW5zdGFsbGluZyBmdW5jdGlvbnMgZm9yIFVuaU4gY2xvY2sgJXNcbiIsCisJCSAgICB1bmluX2h3Y2xvY2stPmZ1bGxfbmFtZSk7CisJCXBtZl9yZWdpc3Rlcl9kcml2ZXIodW5pbl9od2Nsb2NrLCAmdW5pbl9tbWlvX2hhbmRsZXJzLCBOVUxMKTsKKwkJcG1mX2RvX2Z1bmN0aW9ucyh1bmluX2h3Y2xvY2ssIE5VTEwsIDAsIFBNRl9GTEFHU19PTl9JTklULAorCQkJCSBOVUxMKTsKKwl9Cit9CisKKy8qIFdlIGV4cG9ydCB0aGlzIGFzIHRoZSBTTVAgY29kZSBtaWdodCBpbml0IHVzIGVhcmx5ICovCitpbnQgX19pbml0IHBtYWNfcGZ1bmNfYmFzZV9pbnN0YWxsKHZvaWQpCit7CisJc3RhdGljIGludCBwZmJhc2VfaW5pdGVkOworCWludCBpOworCisJaWYgKHBmYmFzZV9pbml0ZWQpCisJCXJldHVybiAwOworCXBmYmFzZV9pbml0ZWQgPSAxOworCisKKwlEQkcoIkluc3RhbGxpbmcgYmFzZSBwbGF0Zm9ybSBmdW5jdGlvbnMuLi5cbiIpOworCisJLyoKKwkgKiBMb2NhdGUgbWFjLWlvIGNoaXBzIGFuZCBpbnN0YWxsIGhhbmRsZXJzCisJICovCisJZm9yIChpID0gMCA7IGkgPCBNQVhfTUFDSU9fQ0hJUFM7IGkrKykgeworCQlpZiAobWFjaW9fY2hpcHNbaV0ub2Zfbm9kZSkgeworCQkJbWFjaW9fbW1pb19pbml0X29uZSgmbWFjaW9fY2hpcHNbaV0pOworCQkJbWFjaW9fZ3Bpb19pbml0X29uZSgmbWFjaW9fY2hpcHNbaV0pOworCQl9CisJfQorCisJLyoKKwkgKiBJbnN0YWxsIGhhbmRsZXJzIGZvciBub3J0aGJyaWRnZSBhbmQgZGlyZWN0IG1hcHBlZCBod2Nsb2NrCisJICogaWYgYW55LiBXZSBkbyBub3QgaW1wbGVtZW50IHRoZSBjb25maWcgc3BhY2UgYWNjZXNzIGNhbGxiYWNrCisJICogd2hpY2ggaXMgb25seSBldmVyIHVzZWQgZm9yIGZ1bmN0aW9ucyB0aGF0IHdlIGRvIG5vdCBjYWxsIGluCisJICogdGhlIGN1cnJlbnQgZHJpdmVyIChlbmFibGluZy9kaXNhYmxpbmcgY2VsbHMgaW4gVTIsIG1vc3RseSB1c2VkCisJICogdG8gcmVzdG9yZSB0aGUgUENJIHNldHRpbmdzLCB3ZSBkbyB0aGF0IGRpZmZlcmVudGx5KQorCSAqLworCWlmICh1bmlub3J0aF9ub2RlICYmIHVuaW5vcnRoX2Jhc2UpCisJCXVuaW5vcnRoX2luc3RhbGxfcGZ1bmMoKTsKKworCURCRygiQWxsIGJhc2UgZnVuY3Rpb25zIGluc3RhbGxlZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChwbWFjX3BmdW5jX2Jhc2VfaW5zdGFsbCk7CisKKyNpZmRlZiBDT05GSUdfUE0KKworLyogVGhvc2UgY2FuIGJlIGNhbGxlZCBieSBwbWFjX2ZlYXR1cmUuIFVsdGltYXRlbHksIEkgc2hvdWxkIHVzZSBhIHN5c2RldgorICogb3IgYSBkZXZpY2UsIGJ1dCBmb3Igbm93LCB0aGF0J3MgZ29vZCBlbm91Z2ggdW50aWwgSSBzb3J0IG91dCBzb21lCisgKiBvcmRlcmluZyBpc3N1ZXMuIEFsc28sIHdlIGRvIG5vdCBib3RoZXIgd2l0aCBHUElPcywgYXMgc28gZmFyIEkgeWV0IGhhdmUKKyAqIHRvIHNlZSBhIGNhc2Ugd2hlcmUgYSBHUElPIGZ1bmN0aW9uIGhhcyB0aGUgb24tc3VzcGVuZCBvciBvbi1yZXN1bWUgYml0CisgKi8KK3ZvaWQgcG1hY19wZnVuY19iYXNlX3N1c3BlbmQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDAgOyBpIDwgTUFYX01BQ0lPX0NISVBTOyBpKyspIHsKKwkJaWYgKG1hY2lvX2NoaXBzW2ldLm9mX25vZGUpCisJCQlwbWZfZG9fZnVuY3Rpb25zKG1hY2lvX2NoaXBzW2ldLm9mX25vZGUsIE5VTEwsIDAsCisJCQkJCSBQTUZfRkxBR1NfT05fU0xFRVAsIE5VTEwpOworCX0KKwlpZiAodW5pbm9ydGhfbm9kZSkKKwkJcG1mX2RvX2Z1bmN0aW9ucyh1bmlub3J0aF9ub2RlLCBOVUxMLCAwLAorCQkJCSBQTUZfRkxBR1NfT05fU0xFRVAsIE5VTEwpOworCWlmICh1bmluX2h3Y2xvY2spCisJCXBtZl9kb19mdW5jdGlvbnModW5pbl9od2Nsb2NrLCBOVUxMLCAwLAorCQkJCSBQTUZfRkxBR1NfT05fU0xFRVAsIE5VTEwpOworfQorCit2b2lkIHBtYWNfcGZ1bmNfYmFzZV9yZXN1bWUodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmICh1bmluX2h3Y2xvY2spCisJCXBtZl9kb19mdW5jdGlvbnModW5pbl9od2Nsb2NrLCBOVUxMLCAwLAorCQkJCSBQTUZfRkxBR1NfT05fV0FLRSwgTlVMTCk7CisJaWYgKHVuaW5vcnRoX25vZGUpCisJCXBtZl9kb19mdW5jdGlvbnModW5pbm9ydGhfbm9kZSwgTlVMTCwgMCwKKwkJCQkgUE1GX0ZMQUdTX09OX1dBS0UsIE5VTEwpOworCWZvciAoaSA9IDAgOyBpIDwgTUFYX01BQ0lPX0NISVBTOyBpKyspIHsKKwkJaWYgKG1hY2lvX2NoaXBzW2ldLm9mX25vZGUpCisJCQlwbWZfZG9fZnVuY3Rpb25zKG1hY2lvX2NoaXBzW2ldLm9mX25vZGUsIE5VTEwsIDAsCisJCQkJCSBQTUZfRkxBR1NfT05fV0FLRSwgTlVMTCk7CisJfQorfQorCisjZW5kaWYgLyogQ09ORklHX1BNICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BmdW5jX2NvcmUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGZ1bmNfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMmM2MjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BmdW5jX2NvcmUuYwpAQCAtMCwwICsxLDk4OSBAQAorLyoKKyAqCisgKiBGSVhNRTogUHJvcGVybHkgbWFrZSB0aGlzIHJhY2UgZnJlZSB3aXRoIHJlZmNvdW50aW5nIGV0Yy4uLgorICoKKyAqIEZJWE1FOiBMT0NLSU5HICEhIQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3BtYWNfcGZ1bmMuaD4KKworLyogRGVidWcgKi8KKyNkZWZpbmUgTE9HX1BBUlNFKGZtdC4uLikKKyNkZWZpbmUgTE9HX0VSUk9SKGZtdC4uLikJcHJpbnRrKGZtdCkKKyNkZWZpbmUgTE9HX0JMT0IodCxiLGMpCisjZGVmaW5lIERCRyhmbXQuLi4pCQlwcmludGsoZm10KQorCisvKiBDb21tYW5kIG51bWJlcnMgKi8KKyNkZWZpbmUgUE1GX0NNRF9MSVNUCQkJMAorI2RlZmluZSBQTUZfQ01EX1dSSVRFX0dQSU8JCTEKKyNkZWZpbmUgUE1GX0NNRF9SRUFEX0dQSU8JCTIKKyNkZWZpbmUgUE1GX0NNRF9XUklURV9SRUczMgkJMworI2RlZmluZSBQTUZfQ01EX1JFQURfUkVHMzIJCTQKKyNkZWZpbmUgUE1GX0NNRF9XUklURV9SRUcxNgkJNQorI2RlZmluZSBQTUZfQ01EX1JFQURfUkVHMTYJCTYKKyNkZWZpbmUgUE1GX0NNRF9XUklURV9SRUc4CQk3CisjZGVmaW5lIFBNRl9DTURfUkVBRF9SRUc4CQk4CisjZGVmaW5lIFBNRl9DTURfREVMQVkJCQk5CisjZGVmaW5lIFBNRl9DTURfV0FJVF9SRUczMgkJMTAKKyNkZWZpbmUgUE1GX0NNRF9XQUlUX1JFRzE2CQkxMQorI2RlZmluZSBQTUZfQ01EX1dBSVRfUkVHOAkJMTIKKyNkZWZpbmUgUE1GX0NNRF9SRUFEX0kyQwkJMTMKKyNkZWZpbmUgUE1GX0NNRF9XUklURV9JMkMJCTE0CisjZGVmaW5lIFBNRl9DTURfUk1XX0kyQwkJCTE1CisjZGVmaW5lIFBNRl9DTURfR0VOX0kyQwkJCTE2CisjZGVmaW5lIFBNRl9DTURfU0hJRlRfQllURVNfUklHSFQJMTcKKyNkZWZpbmUgUE1GX0NNRF9TSElGVF9CWVRFU19MRUZUCTE4CisjZGVmaW5lIFBNRl9DTURfUkVBRF9DRkcJCTE5CisjZGVmaW5lIFBNRl9DTURfV1JJVEVfQ0ZHCQkyMAorI2RlZmluZSBQTUZfQ01EX1JNV19DRkcJCQkyMQorI2RlZmluZSBQTUZfQ01EX1JFQURfSTJDX1NVQkFERFIJMjIKKyNkZWZpbmUgUE1GX0NNRF9XUklURV9JMkNfU1VCQUREUgkyMworI2RlZmluZSBQTUZfQ01EX1NFVF9JMkNfTU9ERQkJMjQKKyNkZWZpbmUgUE1GX0NNRF9STVdfSTJDX1NVQkFERFIJCTI1CisjZGVmaW5lIFBNRl9DTURfUkVBRF9SRUczMl9NQVNLX1NIUl9YT1IJMjYKKyNkZWZpbmUgUE1GX0NNRF9SRUFEX1JFRzE2X01BU0tfU0hSX1hPUgkyNworI2RlZmluZSBQTUZfQ01EX1JFQURfUkVHOF9NQVNLX1NIUl9YT1IJMjgKKyNkZWZpbmUgUE1GX0NNRF9XUklURV9SRUczMl9TSExfTUFTSwkyOQorI2RlZmluZSBQTUZfQ01EX1dSSVRFX1JFRzE2X1NITF9NQVNLCTMwCisjZGVmaW5lIFBNRl9DTURfV1JJVEVfUkVHOF9TSExfTUFTSwkzMQorI2RlZmluZSBQTUZfQ01EX01BU0tfQU5EX0NPTVBBUkUJMzIKKyNkZWZpbmUgUE1GX0NNRF9DT1VOVAkJCTMzCisKKy8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIHRoZSBzdGF0ZSBvZiB0aGUgcGFyc2VyIHdoaWxlIHdhbGtpbmcgdGhyb3VnaAorICogYSBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cnVjdCBwbWZfY21kIHsKKwljb25zdCB2b2lkCQkqY21kcHRyOworCWNvbnN0IHZvaWQJCSpjbWRlbmQ7CisJc3RydWN0IHBtZl9mdW5jdGlvbgkqZnVuYzsKKwl2b2lkCQkJKmluc3RkYXRhOworCXN0cnVjdCBwbWZfYXJncwkJKmFyZ3M7CisJaW50CQkJZXJyb3I7Cit9OworCisjaWYgMAorLyogRGVidWcgb3V0cHV0ICovCitzdGF0aWMgdm9pZCBwcmludF9ibG9iKGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCB2b2lkICpibG9iLCBpbnQgYnl0ZXMpCit7CisJcHJpbnRrKCIlcyIsIHRpdGxlKTsKKwl3aGlsZShieXRlcy0tKSB7CisJCXByaW50aygiJTAyeCAiLCAqKCh1OCAqKWJsb2IpKTsKKwkJYmxvYiArPSAxOworCX0KKwlwcmludGsoIlxuIik7Cit9CisjZW5kaWYKKworLyoKKyAqIFBhcnNlciBoZWxwZXJzCisgKi8KKworc3RhdGljIHUzMiBwbWZfbmV4dDMyKHN0cnVjdCBwbWZfY21kICpjbWQpCit7CisJdTMyIHZhbHVlOworCWlmICgoY21kLT5jbWRlbmQgLSBjbWQtPmNtZHB0cikgPCA0KSB7CisJCWNtZC0+ZXJyb3IgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJdmFsdWUgPSAqKCh1MzIgKiljbWQtPmNtZHB0cik7CisJY21kLT5jbWRwdHIgKz0gNDsKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBjb25zdCB2b2lkKiBwbWZfbmV4dF9ibG9iKHN0cnVjdCBwbWZfY21kICpjbWQsIGludCBjb3VudCkKK3sKKwljb25zdCB2b2lkICp2YWx1ZTsKKwlpZiAoKGNtZC0+Y21kZW5kIC0gY21kLT5jbWRwdHIpIDwgY291bnQpIHsKKwkJY21kLT5lcnJvciA9IDE7CisJCXJldHVybiBOVUxMOworCX0KKwl2YWx1ZSA9IGNtZC0+Y21kcHRyOworCWNtZC0+Y21kcHRyICs9IGNvdW50OworCXJldHVybiB2YWx1ZTsKK30KKworLyoKKyAqIEluZGl2aWR1YWwgY29tbWFuZCBwYXJzZXJzCisgKi8KKworI2RlZmluZSBQTUZfUEFSU0VfQ0FMTChuYW1lLCBjbWQsIGhhbmRsZXJzLCBwLi4uKSBcCisJZG8geyBcCisJCWlmIChjbWQtPmVycm9yKSBcCisJCQlyZXR1cm4gLUVOWElPOyBcCisJCWlmIChoYW5kbGVycyA9PSBOVUxMKSBcCisJCQlyZXR1cm4gMDsgXAorCQlpZiAoaGFuZGxlcnMtPm5hbWUpCQkJCSAgICAgIFwKKwkJCXJldHVybiBoYW5kbGVycy0+bmFtZShjbWQtPmZ1bmMsIGNtZC0+aW5zdGRhdGEsIFwKKwkJCQkJICAgICAgY21kLT5hcmdzLCBwKTsJICAgICAgXAorCQlyZXR1cm4gLTE7IFwKKwl9IHdoaWxlKDApIFwKKworCitzdGF0aWMgaW50IHBtZl9wYXJzZXJfd3JpdGVfZ3BpbyhzdHJ1Y3QgcG1mX2NtZCAqY21kLCBzdHJ1Y3QgcG1mX2hhbmRsZXJzICpoKQoreworCXU4IHZhbHVlID0gKHU4KXBtZl9uZXh0MzIoY21kKTsKKwl1OCBtYXNrID0gKHU4KXBtZl9uZXh0MzIoY21kKTsKKworCUxPR19QQVJTRSgicG1mOiB3cml0ZV9ncGlvKHZhbHVlOiAlMDJ4LCBtYXNrOiAlMDJ4KVxuIiwgdmFsdWUsIG1hc2spOworCisJUE1GX1BBUlNFX0NBTEwod3JpdGVfZ3BpbywgY21kLCBoLCB2YWx1ZSwgbWFzayk7Cit9CisKK3N0YXRpYyBpbnQgcG1mX3BhcnNlcl9yZWFkX2dwaW8oc3RydWN0IHBtZl9jbWQgKmNtZCwgc3RydWN0IHBtZl9oYW5kbGVycyAqaCkKK3sKKwl1OCBtYXNrID0gKHU4KXBtZl9uZXh0MzIoY21kKTsKKwlpbnQgcnNoaWZ0ID0gKGludClwbWZfbmV4dDMyKGNtZCk7CisJdTggeG9yID0gKHU4KXBtZl9uZXh0MzIoY21kKTsKKworCUxPR19QQVJTRSgicG1mOiByZWFkX2dwaW8obWFzazogJTAyeCwgcnNoaWZ0OiAlZCwgeG9yOiAlMDJ4KVxuIiwKKwkJICBtYXNrLCByc2hpZnQsIHhvcik7CisKKwlQTUZfUEFSU0VfQ0FMTChyZWFkX2dwaW8sIGNtZCwgaCwgbWFzaywgcnNoaWZ0LCB4b3IpOworfQorCitzdGF0aWMgaW50IHBtZl9wYXJzZXJfd3JpdGVfcmVnMzIoc3RydWN0IHBtZl9jbWQgKmNtZCwgc3RydWN0IHBtZl9oYW5kbGVycyAqaCkKK3sKKwl1MzIgb2Zmc2V0ID0gcG1mX25leHQzMihjbWQpOworCXUzMiB2YWx1ZSA9IHBtZl9uZXh0MzIoY21kKTsKKwl1MzIgbWFzayA9IHBtZl9uZXh0MzIoY21kKTsKKworCUxPR19QQVJTRSgicG1mOiB3cml0ZV9yZWczMihvZmZzZXQ6ICUwOHgsIHZhbHVlOiAlMDh4LCBtYXNrOiAlMDh4KVxuIiwKKwkJICBvZmZzZXQsIHZhbHVlLCBtYXNrKTsKKworCVBNRl9QQVJTRV9DQUxMKHdyaXRlX3JlZzMyLCBjbWQsIGgsIG9mZnNldCwgdmFsdWUsIG1hc2spOworfQorCitzdGF0aWMgaW50IHBtZl9wYXJzZXJfcmVhZF9yZWczMihzdHJ1Y3QgcG1mX2NtZCAqY21kLCBzdHJ1Y3QgcG1mX2hhbmRsZXJzICpoKQoreworCXUzMiBvZmZzZXQgPSBwbWZfbmV4dDMyKGNtZCk7CisKKwlMT0dfUEFSU0UoInBtZjogcmVhZF9yZWczMihvZmZzZXQ6ICUwOHgpXG4iLCBvZmZzZXQpOworCisJUE1GX1BBUlNFX0NBTEwocmVhZF9yZWczMiwgY21kLCBoLCBvZmZzZXQpOworfQorCisKK3N0YXRpYyBpbnQgcG1mX3BhcnNlcl93cml0ZV9yZWcxNihzdHJ1Y3QgcG1mX2NtZCAqY21kLCBzdHJ1Y3QgcG1mX2hhbmRsZXJzICpoKQoreworCXUzMiBvZmZzZXQgPSBwbWZfbmV4dDMyKGNtZCk7CisJdTE2IHZhbHVlID0gKHUxNilwbWZfbmV4dDMyKGNtZCk7CisJdTE2IG1hc2sgPSAodTE2KXBtZl9uZXh0MzIoY21kKTsKKworCUxPR19QQVJTRSgicG1mOiB3cml0ZV9yZWcxNihvZmZzZXQ6ICUwOHgsIHZhbHVlOiAlMDR4LCBtYXNrOiAlMDR4KVxuIiwKKwkJICBvZmZzZXQsIHZhbHVlLCBtYXNrKTsKKworCVBNRl9QQVJTRV9DQUxMKHdyaXRlX3JlZzE2LCBjbWQsIGgsIG9mZnNldCwgdmFsdWUsIG1hc2spOworfQorCitzdGF0aWMgaW50IHBtZl9wYXJzZXJfcmVhZF9yZWcxNihzdHJ1Y3QgcG1mX2NtZCAqY21kLCBzdHJ1Y3QgcG1mX2hhbmRsZXJzICpoKQoreworCXUzMiBvZmZzZXQgPSBwbWZfbmV4dDMyKGNtZCk7CisKKwlMT0dfUEFSU0UoInBtZjogcmVhZF9yZWcxNihvZmZzZXQ6ICUwOHgpXG4iLCBvZmZzZXQpOworCisJUE1GX1BBUlNFX0NBTEwocmVhZF9yZWcxNiwgY21kLCBoLCBvZmZzZXQpOworfQorCisKK3N0YXRpYyBpbnQgcG1mX3BhcnNlcl93cml0ZV9yZWc4KHN0cnVjdCBwbWZfY21kICpjbWQsIHN0cnVjdCBwbWZfaGFuZGxlcnMgKmgpCit7CisJdTMyIG9mZnNldCA9IHBtZl9uZXh0MzIoY21kKTsKKwl1OCB2YWx1ZSA9ICh1MTYpcG1mX25leHQzMihjbWQpOworCXU4IG1hc2sgPSAodTE2KXBtZl9uZXh0MzIoY21kKTsKKworCUxPR19QQVJTRSgicG1mOiB3cml0ZV9yZWc4KG9mZnNldDogJTA4eCwgdmFsdWU6ICUwMngsIG1hc2s6ICUwMngpXG4iLAorCQkgIG9mZnNldCwgdmFsdWUsIG1hc2spOworCisJUE1GX1BBUlNFX0NBTEwod3JpdGVfcmVnOCwgY21kLCBoLCBvZmZzZXQsIHZhbHVlLCBtYXNrKTsKK30KKworc3RhdGljIGludCBwbWZfcGFyc2VyX3JlYWRfcmVnOChzdHJ1Y3QgcG1mX2NtZCAqY21kLCBzdHJ1Y3QgcG1mX2hhbmRsZXJzICpoKQoreworCXUzMiBvZmZzZXQgPSBwbWZfbmV4dDMyKGNtZCk7CisKKwlMT0dfUEFSU0UoInBtZjogcmVhZF9yZWc4KG9mZnNldDogJTA4eClcbiIsIG9mZnNldCk7CisKKwlQTUZfUEFSU0VfQ0FMTChyZWFkX3JlZzgsIGNtZCwgaCwgb2Zmc2V0KTsKK30KKworc3RhdGljIGludCBwbWZfcGFyc2VyX2RlbGF5KHN0cnVjdCBwbWZfY21kICpjbWQsIHN0cnVjdCBwbWZfaGFuZGxlcnMgKmgpCit7CisJdTMyIGR1cmF0aW9uID0gcG1mX25leHQzMihjbWQpOworCisJTE9HX1BBUlNFKCJwbWY6IGRlbGF5KGR1cmF0aW9uOiAlZCB1cylcbiIsIGR1cmF0aW9uKTsKKworCVBNRl9QQVJTRV9DQUxMKGRlbGF5LCBjbWQsIGgsIGR1cmF0aW9uKTsKK30KKworc3RhdGljIGludCBwbWZfcGFyc2VyX3dhaXRfcmVnMzIoc3RydWN0IHBtZl9jbWQgKmNtZCwgc3RydWN0IHBtZl9oYW5kbGVycyAqaCkKK3sKKwl1MzIgb2Zmc2V0ID0gcG1mX25leHQzMihjbWQpOworCXUzMiB2YWx1ZSA9IHBtZl9uZXh0MzIoY21kKTsKKwl1MzIgbWFzayA9IHBtZl9uZXh0MzIoY21kKTsKKworCUxPR19QQVJTRSgicG1mOiB3YWl0X3JlZzMyKG9mZnNldDogJTA4eCwgY29tcF92YWx1ZTogJTA4eCxtYXNrOiAlMDh4KVxuIiwKKwkJICBvZmZzZXQsIHZhbHVlLCBtYXNrKTsKKworCVBNRl9QQVJTRV9DQUxMKHdhaXRfcmVnMzIsIGNtZCwgaCwgb2Zmc2V0LCB2YWx1ZSwgbWFzayk7Cit9CisKK3N0YXRpYyBpbnQgcG1mX3BhcnNlcl93YWl0X3JlZzE2KHN0cnVjdCBwbWZfY21kICpjbWQsIHN0cnVjdCBwbWZfaGFuZGxlcnMgKmgpCit7CisJdTMyIG9mZnNldCA9IHBtZl9uZXh0MzIoY21kKTsKKwl1MTYgdmFsdWUgPSAodTE2KXBtZl9uZXh0MzIoY21kKTsKKwl1MTYgbWFzayA9ICh1MTYpcG1mX25leHQzMihjbWQpOworCisJTE9HX1BBUlNFKCJwbWY6IHdhaXRfcmVnMTYob2Zmc2V0OiAlMDh4LCBjb21wX3ZhbHVlOiAlMDR4LG1hc2s6ICUwNHgpXG4iLAorCQkgIG9mZnNldCwgdmFsdWUsIG1hc2spOworCisJUE1GX1BBUlNFX0NBTEwod2FpdF9yZWcxNiwgY21kLCBoLCBvZmZzZXQsIHZhbHVlLCBtYXNrKTsKK30KKworc3RhdGljIGludCBwbWZfcGFyc2VyX3dhaXRfcmVnOChzdHJ1Y3QgcG1mX2NtZCAqY21kLCBzdHJ1Y3QgcG1mX2hhbmRsZXJzICpoKQoreworCXUzMiBvZmZzZXQgPSBwbWZfbmV4dDMyKGNtZCk7CisJdTggdmFsdWUgPSAodTgpcG1mX25leHQzMihjbWQpOworCXU4IG1hc2sgPSAodTgpcG1mX25leHQzMihjbWQpOworCisJTE9HX1BBUlNFKCJwbWY6IHdhaXRfcmVnOChvZmZzZXQ6ICUwOHgsIGNvbXBfdmFsdWU6ICUwMngsbWFzazogJTAyeClcbiIsCisJCSAgb2Zmc2V0LCB2YWx1ZSwgbWFzayk7CisKKwlQTUZfUEFSU0VfQ0FMTCh3YWl0X3JlZzgsIGNtZCwgaCwgb2Zmc2V0LCB2YWx1ZSwgbWFzayk7Cit9CisKK3N0YXRpYyBpbnQgcG1mX3BhcnNlcl9yZWFkX2kyYyhzdHJ1Y3QgcG1mX2NtZCAqY21kLCBzdHJ1Y3QgcG1mX2hhbmRsZXJzICpoKQoreworCXUzMiBieXRlcyA9IHBtZl9uZXh0MzIoY21kKTsKKworCUxPR19QQVJTRSgicG1mOiByZWFkX2kyYyhieXRlczogJXVkKVxuIiwgYnl0ZXMpOworCisJUE1GX1BBUlNFX0NBTEwocmVhZF9pMmMsIGNtZCwgaCwgYnl0ZXMpOworfQorCitzdGF0aWMgaW50IHBtZl9wYXJzZXJfd3JpdGVfaTJjKHN0cnVjdCBwbWZfY21kICpjbWQsIHN0cnVjdCBwbWZfaGFuZGxlcnMgKmgpCit7CisJdTMyIGJ5dGVzID0gcG1mX25leHQzMihjbWQpOworCWNvbnN0IHZvaWQgKmJsb2IgPSBwbWZfbmV4dF9ibG9iKGNtZCwgYnl0ZXMpOworCisJTE9HX1BBUlNFKCJwbWY6IHdyaXRlX2kyYyhieXRlczogJXVkKSAuLi5cbiIsIGJ5dGVzKTsKKwlMT0dfQkxPQigicG1mOiAgIGRhdGE6IFxuIiwgYmxvYiwgYnl0ZXMpOworCisJUE1GX1BBUlNFX0NBTEwod3JpdGVfaTJjLCBjbWQsIGgsIGJ5dGVzLCBibG9iKTsKK30KKworCitzdGF0aWMgaW50IHBtZl9wYXJzZXJfcm13X2kyYyhzdHJ1Y3QgcG1mX2NtZCAqY21kLCBzdHJ1Y3QgcG1mX2hhbmRsZXJzICpoKQoreworCXUzMiBtYXNrYnl0ZXMgPSBwbWZfbmV4dDMyKGNtZCk7CisJdTMyIHZhbHVlc2J5dGVzID0gcG1mX25leHQzMihjbWQpOworCXUzMiB0b3RhbGJ5dGVzID0gcG1mX25leHQzMihjbWQpOworCWNvbnN0IHZvaWQgKm1hc2tibG9iID0gcG1mX25leHRfYmxvYihjbWQsIG1hc2tieXRlcyk7CisJY29uc3Qgdm9pZCAqdmFsdWVzYmxvYiA9IHBtZl9uZXh0X2Jsb2IoY21kLCB2YWx1ZXNieXRlcyk7CisKKwlMT0dfUEFSU0UoInBtZjogcm13X2kyYyhtYXNrYnl0ZXM6ICV1ZCwgdmFsdWVieXRlczogJXVkLCAiCisJCSAgInRvdGFsYnl0ZXM6ICVkKSAuLi5cbiIsCisJCSAgbWFza2J5dGVzLCB2YWx1ZXNieXRlcywgdG90YWxieXRlcyk7CisJTE9HX0JMT0IoInBtZjogICBtYXNrIGRhdGE6IFxuIiwgbWFza2Jsb2IsIG1hc2tieXRlcyk7CisJTE9HX0JMT0IoInBtZjogICB2YWx1ZXMgZGF0YTogXG4iLCB2YWx1ZXNibG9iLCB2YWx1ZXNieXRlcyk7CisKKwlQTUZfUEFSU0VfQ0FMTChybXdfaTJjLCBjbWQsIGgsIG1hc2tieXRlcywgdmFsdWVzYnl0ZXMsIHRvdGFsYnl0ZXMsCisJCSAgICAgICBtYXNrYmxvYiwgdmFsdWVzYmxvYik7Cit9CisKK3N0YXRpYyBpbnQgcG1mX3BhcnNlcl9yZWFkX2NmZyhzdHJ1Y3QgcG1mX2NtZCAqY21kLCBzdHJ1Y3QgcG1mX2hhbmRsZXJzICpoKQoreworCXUzMiBvZmZzZXQgPSBwbWZfbmV4dDMyKGNtZCk7CisJdTMyIGJ5dGVzID0gcG1mX25leHQzMihjbWQpOworCisJTE9HX1BBUlNFKCJwbWY6IHJlYWRfY2ZnKG9mZnNldDogJXgsIGJ5dGVzOiAldWQpXG4iLCBvZmZzZXQsIGJ5dGVzKTsKKworCVBNRl9QQVJTRV9DQUxMKHJlYWRfY2ZnLCBjbWQsIGgsIG9mZnNldCwgYnl0ZXMpOworfQorCisKK3N0YXRpYyBpbnQgcG1mX3BhcnNlcl93cml0ZV9jZmcoc3RydWN0IHBtZl9jbWQgKmNtZCwgc3RydWN0IHBtZl9oYW5kbGVycyAqaCkKK3sKKwl1MzIgb2Zmc2V0ID0gcG1mX25leHQzMihjbWQpOworCXUzMiBieXRlcyA9IHBtZl9uZXh0MzIoY21kKTsKKwljb25zdCB2b2lkICpibG9iID0gcG1mX25leHRfYmxvYihjbWQsIGJ5dGVzKTsKKworCUxPR19QQVJTRSgicG1mOiB3cml0ZV9jZmcob2Zmc2V0OiAleCwgYnl0ZXM6ICV1ZClcbiIsIG9mZnNldCwgYnl0ZXMpOworCUxPR19CTE9CKCJwbWY6ICAgZGF0YTogXG4iLCBibG9iLCBieXRlcyk7CisKKwlQTUZfUEFSU0VfQ0FMTCh3cml0ZV9jZmcsIGNtZCwgaCwgb2Zmc2V0LCBieXRlcywgYmxvYik7Cit9CisKK3N0YXRpYyBpbnQgcG1mX3BhcnNlcl9ybXdfY2ZnKHN0cnVjdCBwbWZfY21kICpjbWQsIHN0cnVjdCBwbWZfaGFuZGxlcnMgKmgpCit7CisJdTMyIG9mZnNldCA9IHBtZl9uZXh0MzIoY21kKTsKKwl1MzIgbWFza2J5dGVzID0gcG1mX25leHQzMihjbWQpOworCXUzMiB2YWx1ZXNieXRlcyA9IHBtZl9uZXh0MzIoY21kKTsKKwl1MzIgdG90YWxieXRlcyA9IHBtZl9uZXh0MzIoY21kKTsKKwljb25zdCB2b2lkICptYXNrYmxvYiA9IHBtZl9uZXh0X2Jsb2IoY21kLCBtYXNrYnl0ZXMpOworCWNvbnN0IHZvaWQgKnZhbHVlc2Jsb2IgPSBwbWZfbmV4dF9ibG9iKGNtZCwgdmFsdWVzYnl0ZXMpOworCisJTE9HX1BBUlNFKCJwbWY6IHJtd19jZmcobWFza2J5dGVzOiAldWQsIHZhbHVlYnl0ZXM6ICV1ZCwiCisJCSAgIiB0b3RhbGJ5dGVzOiAlZCkgLi4uXG4iLAorCQkgIG1hc2tieXRlcywgdmFsdWVzYnl0ZXMsIHRvdGFsYnl0ZXMpOworCUxPR19CTE9CKCJwbWY6ICAgbWFzayBkYXRhOiBcbiIsIG1hc2tibG9iLCBtYXNrYnl0ZXMpOworCUxPR19CTE9CKCJwbWY6ICAgdmFsdWVzIGRhdGE6IFxuIiwgdmFsdWVzYmxvYiwgdmFsdWVzYnl0ZXMpOworCisJUE1GX1BBUlNFX0NBTEwocm13X2NmZywgY21kLCBoLCBvZmZzZXQsIG1hc2tieXRlcywgdmFsdWVzYnl0ZXMsCisJCSAgICAgICB0b3RhbGJ5dGVzLCBtYXNrYmxvYiwgdmFsdWVzYmxvYik7Cit9CisKKworc3RhdGljIGludCBwbWZfcGFyc2VyX3JlYWRfaTJjX3N1YihzdHJ1Y3QgcG1mX2NtZCAqY21kLCBzdHJ1Y3QgcG1mX2hhbmRsZXJzICpoKQoreworCXU4IHN1YmFkZHIgPSAodTgpcG1mX25leHQzMihjbWQpOworCXUzMiBieXRlcyA9IHBtZl9uZXh0MzIoY21kKTsKKworCUxPR19QQVJTRSgicG1mOiByZWFkX2kyY19zdWIoc3ViYWRkcjogJXgsIGJ5dGVzOiAldWQpXG4iLAorCQkgIHN1YmFkZHIsIGJ5dGVzKTsKKworCVBNRl9QQVJTRV9DQUxMKHJlYWRfaTJjX3N1YiwgY21kLCBoLCBzdWJhZGRyLCBieXRlcyk7Cit9CisKK3N0YXRpYyBpbnQgcG1mX3BhcnNlcl93cml0ZV9pMmNfc3ViKHN0cnVjdCBwbWZfY21kICpjbWQsIHN0cnVjdCBwbWZfaGFuZGxlcnMgKmgpCit7CisJdTggc3ViYWRkciA9ICh1OClwbWZfbmV4dDMyKGNtZCk7CisJdTMyIGJ5dGVzID0gcG1mX25leHQzMihjbWQpOworCWNvbnN0IHZvaWQgKmJsb2IgPSBwbWZfbmV4dF9ibG9iKGNtZCwgYnl0ZXMpOworCisJTE9HX1BBUlNFKCJwbWY6IHdyaXRlX2kyY19zdWIoc3ViYWRkcjogJXgsIGJ5dGVzOiAldWQpIC4uLlxuIiwKKwkJICBzdWJhZGRyLCBieXRlcyk7CisJTE9HX0JMT0IoInBtZjogICBkYXRhOiBcbiIsIGJsb2IsIGJ5dGVzKTsKKworCVBNRl9QQVJTRV9DQUxMKHdyaXRlX2kyY19zdWIsIGNtZCwgaCwgc3ViYWRkciwgYnl0ZXMsIGJsb2IpOworfQorCitzdGF0aWMgaW50IHBtZl9wYXJzZXJfc2V0X2kyY19tb2RlKHN0cnVjdCBwbWZfY21kICpjbWQsIHN0cnVjdCBwbWZfaGFuZGxlcnMgKmgpCit7CisJdTMyIG1vZGUgPSBwbWZfbmV4dDMyKGNtZCk7CisKKwlMT0dfUEFSU0UoInBtZjogc2V0X2kyY19tb2RlKG1vZGU6ICVkKVxuIiwgbW9kZSk7CisKKwlQTUZfUEFSU0VfQ0FMTChzZXRfaTJjX21vZGUsIGNtZCwgaCwgbW9kZSk7Cit9CisKKworc3RhdGljIGludCBwbWZfcGFyc2VyX3Jtd19pMmNfc3ViKHN0cnVjdCBwbWZfY21kICpjbWQsIHN0cnVjdCBwbWZfaGFuZGxlcnMgKmgpCit7CisJdTggc3ViYWRkciA9ICh1OClwbWZfbmV4dDMyKGNtZCk7CisJdTMyIG1hc2tieXRlcyA9IHBtZl9uZXh0MzIoY21kKTsKKwl1MzIgdmFsdWVzYnl0ZXMgPSBwbWZfbmV4dDMyKGNtZCk7CisJdTMyIHRvdGFsYnl0ZXMgPSBwbWZfbmV4dDMyKGNtZCk7CisJY29uc3Qgdm9pZCAqbWFza2Jsb2IgPSBwbWZfbmV4dF9ibG9iKGNtZCwgbWFza2J5dGVzKTsKKwljb25zdCB2b2lkICp2YWx1ZXNibG9iID0gcG1mX25leHRfYmxvYihjbWQsIHZhbHVlc2J5dGVzKTsKKworCUxPR19QQVJTRSgicG1mOiBybXdfaTJjX3N1YihzdWJhZGRyOiAleCwgbWFza2J5dGVzOiAldWQsIHZhbHVlYnl0ZXM6ICV1ZCIKKwkJICAiLCB0b3RhbGJ5dGVzOiAlZCkgLi4uXG4iLAorCQkgIHN1YmFkZHIsIG1hc2tieXRlcywgdmFsdWVzYnl0ZXMsIHRvdGFsYnl0ZXMpOworCUxPR19CTE9CKCJwbWY6ICAgbWFzayBkYXRhOiBcbiIsIG1hc2tibG9iLCBtYXNrYnl0ZXMpOworCUxPR19CTE9CKCJwbWY6ICAgdmFsdWVzIGRhdGE6IFxuIiwgdmFsdWVzYmxvYiwgdmFsdWVzYnl0ZXMpOworCisJUE1GX1BBUlNFX0NBTEwocm13X2kyY19zdWIsIGNtZCwgaCwgc3ViYWRkciwgbWFza2J5dGVzLCB2YWx1ZXNieXRlcywKKwkJICAgICAgIHRvdGFsYnl0ZXMsIG1hc2tibG9iLCB2YWx1ZXNibG9iKTsKK30KKworc3RhdGljIGludCBwbWZfcGFyc2VyX3JlYWRfcmVnMzJfbXNyeChzdHJ1Y3QgcG1mX2NtZCAqY21kLAorCQkJCSAgICAgIHN0cnVjdCBwbWZfaGFuZGxlcnMgKmgpCit7CisJdTMyIG9mZnNldCA9IHBtZl9uZXh0MzIoY21kKTsKKwl1MzIgbWFzayA9IHBtZl9uZXh0MzIoY21kKTsKKwl1MzIgc2hpZnQgPSBwbWZfbmV4dDMyKGNtZCk7CisJdTMyIHhvciA9IHBtZl9uZXh0MzIoY21kKTsKKworCUxPR19QQVJTRSgicG1mOiByZWFkX3JlZzMyX21zcngob2Zmc2V0OiAleCwgbWFzazogJXgsIHNoaWZ0OiAleCwiCisJCSAgIiB4b3I6ICV4XG4iLCBvZmZzZXQsIG1hc2ssIHNoaWZ0LCB4b3IpOworCisJUE1GX1BBUlNFX0NBTEwocmVhZF9yZWczMl9tc3J4LCBjbWQsIGgsIG9mZnNldCwgbWFzaywgc2hpZnQsIHhvcik7Cit9CisKK3N0YXRpYyBpbnQgcG1mX3BhcnNlcl9yZWFkX3JlZzE2X21zcngoc3RydWN0IHBtZl9jbWQgKmNtZCwKKwkJCQkgICAgICBzdHJ1Y3QgcG1mX2hhbmRsZXJzICpoKQoreworCXUzMiBvZmZzZXQgPSBwbWZfbmV4dDMyKGNtZCk7CisJdTMyIG1hc2sgPSBwbWZfbmV4dDMyKGNtZCk7CisJdTMyIHNoaWZ0ID0gcG1mX25leHQzMihjbWQpOworCXUzMiB4b3IgPSBwbWZfbmV4dDMyKGNtZCk7CisKKwlMT0dfUEFSU0UoInBtZjogcmVhZF9yZWcxNl9tc3J4KG9mZnNldDogJXgsIG1hc2s6ICV4LCBzaGlmdDogJXgsIgorCQkgICIgeG9yOiAleFxuIiwgb2Zmc2V0LCBtYXNrLCBzaGlmdCwgeG9yKTsKKworCVBNRl9QQVJTRV9DQUxMKHJlYWRfcmVnMTZfbXNyeCwgY21kLCBoLCBvZmZzZXQsIG1hc2ssIHNoaWZ0LCB4b3IpOworfQorc3RhdGljIGludCBwbWZfcGFyc2VyX3JlYWRfcmVnOF9tc3J4KHN0cnVjdCBwbWZfY21kICpjbWQsCisJCQkJICAgICBzdHJ1Y3QgcG1mX2hhbmRsZXJzICpoKQoreworCXUzMiBvZmZzZXQgPSBwbWZfbmV4dDMyKGNtZCk7CisJdTMyIG1hc2sgPSBwbWZfbmV4dDMyKGNtZCk7CisJdTMyIHNoaWZ0ID0gcG1mX25leHQzMihjbWQpOworCXUzMiB4b3IgPSBwbWZfbmV4dDMyKGNtZCk7CisKKwlMT0dfUEFSU0UoInBtZjogcmVhZF9yZWc4X21zcngob2Zmc2V0OiAleCwgbWFzazogJXgsIHNoaWZ0OiAleCwiCisJCSAgIiB4b3I6ICV4XG4iLCBvZmZzZXQsIG1hc2ssIHNoaWZ0LCB4b3IpOworCisJUE1GX1BBUlNFX0NBTEwocmVhZF9yZWc4X21zcngsIGNtZCwgaCwgb2Zmc2V0LCBtYXNrLCBzaGlmdCwgeG9yKTsKK30KKworc3RhdGljIGludCBwbWZfcGFyc2VyX3dyaXRlX3JlZzMyX3NsbShzdHJ1Y3QgcG1mX2NtZCAqY21kLAorCQkJCSAgICAgIHN0cnVjdCBwbWZfaGFuZGxlcnMgKmgpCit7CisJdTMyIG9mZnNldCA9IHBtZl9uZXh0MzIoY21kKTsKKwl1MzIgc2hpZnQgPSBwbWZfbmV4dDMyKGNtZCk7CisJdTMyIG1hc2sgPSBwbWZfbmV4dDMyKGNtZCk7CisKKwlMT0dfUEFSU0UoInBtZjogd3JpdGVfcmVnMzJfc2xtKG9mZnNldDogJXgsIHNoaWZ0OiAleCwgbWFzazogJXhcbiIsCisJCSAgb2Zmc2V0LCBzaGlmdCwgbWFzayk7CisKKwlQTUZfUEFSU0VfQ0FMTCh3cml0ZV9yZWczMl9zbG0sIGNtZCwgaCwgb2Zmc2V0LCBzaGlmdCwgbWFzayk7Cit9CisKK3N0YXRpYyBpbnQgcG1mX3BhcnNlcl93cml0ZV9yZWcxNl9zbG0oc3RydWN0IHBtZl9jbWQgKmNtZCwKKwkJCQkgICAgICBzdHJ1Y3QgcG1mX2hhbmRsZXJzICpoKQoreworCXUzMiBvZmZzZXQgPSBwbWZfbmV4dDMyKGNtZCk7CisJdTMyIHNoaWZ0ID0gcG1mX25leHQzMihjbWQpOworCXUzMiBtYXNrID0gcG1mX25leHQzMihjbWQpOworCisJTE9HX1BBUlNFKCJwbWY6IHdyaXRlX3JlZzE2X3NsbShvZmZzZXQ6ICV4LCBzaGlmdDogJXgsIG1hc2s6ICV4XG4iLAorCQkgIG9mZnNldCwgc2hpZnQsIG1hc2spOworCisJUE1GX1BBUlNFX0NBTEwod3JpdGVfcmVnMTZfc2xtLCBjbWQsIGgsIG9mZnNldCwgc2hpZnQsIG1hc2spOworfQorCitzdGF0aWMgaW50IHBtZl9wYXJzZXJfd3JpdGVfcmVnOF9zbG0oc3RydWN0IHBtZl9jbWQgKmNtZCwKKwkJCQkgICAgIHN0cnVjdCBwbWZfaGFuZGxlcnMgKmgpCit7CisJdTMyIG9mZnNldCA9IHBtZl9uZXh0MzIoY21kKTsKKwl1MzIgc2hpZnQgPSBwbWZfbmV4dDMyKGNtZCk7CisJdTMyIG1hc2sgPSBwbWZfbmV4dDMyKGNtZCk7CisKKwlMT0dfUEFSU0UoInBtZjogd3JpdGVfcmVnOF9zbG0ob2Zmc2V0OiAleCwgc2hpZnQ6ICV4LCBtYXNrOiAleFxuIiwKKwkJICBvZmZzZXQsIHNoaWZ0LCBtYXNrKTsKKworCVBNRl9QQVJTRV9DQUxMKHdyaXRlX3JlZzhfc2xtLCBjbWQsIGgsIG9mZnNldCwgc2hpZnQsIG1hc2spOworfQorCitzdGF0aWMgaW50IHBtZl9wYXJzZXJfbWFza19hbmRfY29tcGFyZShzdHJ1Y3QgcG1mX2NtZCAqY21kLAorCQkJCSAgICAgICBzdHJ1Y3QgcG1mX2hhbmRsZXJzICpoKQoreworCXUzMiBieXRlcyA9IHBtZl9uZXh0MzIoY21kKTsKKwljb25zdCB2b2lkICptYXNrYmxvYiA9IHBtZl9uZXh0X2Jsb2IoY21kLCBieXRlcyk7CisJY29uc3Qgdm9pZCAqdmFsdWVzYmxvYiA9IHBtZl9uZXh0X2Jsb2IoY21kLCBieXRlcyk7CisKKwlMT0dfUEFSU0UoInBtZjogbWFza19hbmRfY29tcGFyZShsZW5ndGg6ICV1ZCAuLi5cbiIsIGJ5dGVzKTsKKwlMT0dfQkxPQigicG1mOiAgIG1hc2sgZGF0YTogXG4iLCBtYXNrYmxvYiwgYnl0ZXMpOworCUxPR19CTE9CKCJwbWY6ICAgdmFsdWVzIGRhdGE6IFxuIiwgdmFsdWVzYmxvYiwgYnl0ZXMpOworCisJUE1GX1BBUlNFX0NBTEwobWFza19hbmRfY29tcGFyZSwgY21kLCBoLAorCQkgICAgICAgYnl0ZXMsIG1hc2tibG9iLCB2YWx1ZXNibG9iKTsKK30KKworCit0eXBlZGVmIGludCAoKnBtZl9jbWRfcGFyc2VyX3QpKHN0cnVjdCBwbWZfY21kICpjbWQsIHN0cnVjdCBwbWZfaGFuZGxlcnMgKmgpOworCitzdGF0aWMgcG1mX2NtZF9wYXJzZXJfdCBwbWZfcGFyc2Vyc1tQTUZfQ01EX0NPVU5UXSA9Cit7CisJTlVMTCwKKwlwbWZfcGFyc2VyX3dyaXRlX2dwaW8sCisJcG1mX3BhcnNlcl9yZWFkX2dwaW8sCisJcG1mX3BhcnNlcl93cml0ZV9yZWczMiwKKwlwbWZfcGFyc2VyX3JlYWRfcmVnMzIsCisJcG1mX3BhcnNlcl93cml0ZV9yZWcxNiwKKwlwbWZfcGFyc2VyX3JlYWRfcmVnMTYsCisJcG1mX3BhcnNlcl93cml0ZV9yZWc4LAorCXBtZl9wYXJzZXJfcmVhZF9yZWc4LAorCXBtZl9wYXJzZXJfZGVsYXksCisJcG1mX3BhcnNlcl93YWl0X3JlZzMyLAorCXBtZl9wYXJzZXJfd2FpdF9yZWcxNiwKKwlwbWZfcGFyc2VyX3dhaXRfcmVnOCwKKwlwbWZfcGFyc2VyX3JlYWRfaTJjLAorCXBtZl9wYXJzZXJfd3JpdGVfaTJjLAorCXBtZl9wYXJzZXJfcm13X2kyYywKKwlOVUxMLCAvKiBCb2d1cyBjb21tYW5kICovCisJTlVMTCwgLyogU2hpZnQgYnl0ZXMgcmlnaHQ6IE5ZSSAqLworCU5VTEwsIC8qIFNoaWZ0IGJ5dGVzIGxlZnQ6IE5ZSSAqLworCXBtZl9wYXJzZXJfcmVhZF9jZmcsCisJcG1mX3BhcnNlcl93cml0ZV9jZmcsCisJcG1mX3BhcnNlcl9ybXdfY2ZnLAorCXBtZl9wYXJzZXJfcmVhZF9pMmNfc3ViLAorCXBtZl9wYXJzZXJfd3JpdGVfaTJjX3N1YiwKKwlwbWZfcGFyc2VyX3NldF9pMmNfbW9kZSwKKwlwbWZfcGFyc2VyX3Jtd19pMmNfc3ViLAorCXBtZl9wYXJzZXJfcmVhZF9yZWczMl9tc3J4LAorCXBtZl9wYXJzZXJfcmVhZF9yZWcxNl9tc3J4LAorCXBtZl9wYXJzZXJfcmVhZF9yZWc4X21zcngsCisJcG1mX3BhcnNlcl93cml0ZV9yZWczMl9zbG0sCisJcG1mX3BhcnNlcl93cml0ZV9yZWcxNl9zbG0sCisJcG1mX3BhcnNlcl93cml0ZV9yZWc4X3NsbSwKKwlwbWZfcGFyc2VyX21hc2tfYW5kX2NvbXBhcmUsCit9OworCitzdHJ1Y3QgcG1mX2RldmljZSB7CisJc3RydWN0IGxpc3RfaGVhZAlsaW5rOworCXN0cnVjdCBkZXZpY2Vfbm9kZQkqbm9kZTsKKwlzdHJ1Y3QgcG1mX2hhbmRsZXJzCSpoYW5kbGVyczsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWZ1bmN0aW9uczsKKwlzdHJ1Y3Qga3JlZgkJcmVmOworfTsKKworc3RhdGljIExJU1RfSEVBRChwbWZfZGV2aWNlcyk7CitzdGF0aWMgc3BpbmxvY2tfdCBwbWZfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKworc3RhdGljIHZvaWQgcG1mX3JlbGVhc2VfZGV2aWNlKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBwbWZfZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHBtZl9kZXZpY2UsIHJlZik7CisJa2ZyZWUoZGV2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBtZl9wdXRfZGV2aWNlKHN0cnVjdCBwbWZfZGV2aWNlICpkZXYpCit7CisJa3JlZl9wdXQoJmRldi0+cmVmLCBwbWZfcmVsZWFzZV9kZXZpY2UpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwbWZfZGV2aWNlICpwbWZfZ2V0X2RldmljZShzdHJ1Y3QgcG1mX2RldmljZSAqZGV2KQoreworCWtyZWZfZ2V0KCZkZXYtPnJlZik7CisJcmV0dXJuIGRldjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcG1mX2RldmljZSAqcG1mX2ZpbmRfZGV2aWNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RydWN0IHBtZl9kZXZpY2UgKmRldjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmcG1mX2RldmljZXMsIGxpbmspIHsKKwkJaWYgKGRldi0+bm9kZSA9PSBucCkKKwkJCXJldHVybiBwbWZfZ2V0X2RldmljZShkZXYpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBwbWZfcGFyc2Vfb25lKHN0cnVjdCBwbWZfZnVuY3Rpb24gKmZ1bmMsCisJCQkgc3RydWN0IHBtZl9oYW5kbGVycyAqaGFuZGxlcnMsCisJCQkgdm9pZCAqaW5zdGRhdGEsIHN0cnVjdCBwbWZfYXJncyAqYXJncykKK3sKKwlzdHJ1Y3QgcG1mX2NtZCBjbWQ7CisJdTMyIGNjb2RlOworCWludCBjb3VudCwgcmM7CisKKwljbWQuY21kcHRyCQk9IGZ1bmMtPmRhdGE7CisJY21kLmNtZGVuZAkJPSBmdW5jLT5kYXRhICsgZnVuYy0+bGVuZ3RoOworCWNtZC5mdW5jICAgICAgIAkJPSBmdW5jOworCWNtZC5pbnN0ZGF0YQkJPSBpbnN0ZGF0YTsKKwljbWQuYXJncwkJPSBhcmdzOworCWNtZC5lcnJvcgkJPSAwOworCisJTE9HX1BBUlNFKCJwbWY6IGZ1bmMgJXMsICVkIGJ5dGVzLCAlcy4uLlxuIiwKKwkJICBmdW5jLT5uYW1lLCBmdW5jLT5sZW5ndGgsCisJCSAgaGFuZGxlcnMgPyAiZXhlY3V0aW5nIiA6ICJwYXJzaW5nIik7CisKKwkvKiBPbmUgc3ViY29tbWFuZCB0byBwYXJzZSBmb3Igbm93ICovCisJY291bnQgPSAxOworCisJd2hpbGUoY291bnQtLSAmJiBjbWQuY21kcHRyIDwgY21kLmNtZGVuZCkgeworCQkvKiBHZXQgb3Bjb2RlICovCisJCWNjb2RlID0gcG1mX25leHQzMigmY21kKTsKKwkJLyogQ2hlY2sgaWYgd2UgYXJlIGhpdHRpbmcgYSBjb21tYW5kIGxpc3QsIGZldGNoIG5ldyBjb3VudCAqLworCQlpZiAoY2NvZGUgPT0gMCkgeworCQkJY291bnQgPSBwbWZfbmV4dDMyKCZjbWQpIC0gMTsKKwkJCWNjb2RlID0gcG1mX25leHQzMigmY21kKTsKKwkJfQorCQlpZiAoY21kLmVycm9yKSB7CisJCQlMT0dfRVJST1IoInBtZjogcGFyc2UgZXJyb3IsIG5vdCBlbm91Z2ggZGF0YVxuIik7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCWlmIChjY29kZSA+PSBQTUZfQ01EX0NPVU5UKSB7CisJCQlMT0dfRVJST1IoInBtZjogY29tbWFuZCBjb2RlICVkIHVua25vd24gIVxuIiwgY2NvZGUpOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCQlpZiAocG1mX3BhcnNlcnNbY2NvZGVdID09IE5VTEwpIHsKKwkJCUxPR19FUlJPUigicG1mOiBubyBwYXJzZXIgZm9yIGNvbW1hbmQgJWQgIVxuIiwgY2NvZGUpOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCQlyYyA9IHBtZl9wYXJzZXJzW2Njb2RlXSgmY21kLCBoYW5kbGVycyk7CisJCWlmIChyYyAhPSAwKSB7CisJCQlMT0dfRVJST1IoInBtZjogcGFyc2VyIGZvciBjb21tYW5kICVkIHJldHVybmVkIgorCQkJCSAgIiBlcnJvciAlZFxuIiwgY2NvZGUsIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCS8qIFdlIGFyZSBkb2luZyBhbiBpbml0aWFsIHBhcnNlIHBhc3MsIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBzaXplICovCisJaWYgKGhhbmRsZXJzID09IE5VTEwpCisJCWZ1bmMtPmxlbmd0aCA9IGNtZC5jbWRwdHIgLSBmdW5jLT5kYXRhOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG1mX2FkZF9mdW5jdGlvbl9wcm9wKHN0cnVjdCBwbWZfZGV2aWNlICpkZXYsIHZvaWQgKmRyaXZlcmRhdGEsCisJCQkJIGNvbnN0IGNoYXIgKm5hbWUsIHUzMiAqZGF0YSwKKwkJCQkgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwlpbnQgY291bnQgPSAwOworCXN0cnVjdCBwbWZfZnVuY3Rpb24gKmZ1bmMgPSBOVUxMOworCisJREJHKCJwbWY6IEFkZGluZyBmdW5jdGlvbnMgZm9yIHBsYXRmb3JtLWRvLSVzXG4iLCBuYW1lKTsKKworCXdoaWxlIChsZW5ndGggPj0gMTIpIHsKKwkJLyogQWxsb2NhdGUgYSBzdHJ1Y3R1cmUgKi8KKwkJZnVuYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbWZfZnVuY3Rpb24pLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGZ1bmMgPT0gTlVMTCkKKwkJCWdvdG8gYmFpbDsKKwkJa3JlZl9pbml0KCZmdW5jLT5yZWYpOworCQlJTklUX0xJU1RfSEVBRCgmZnVuYy0+aXJxX2NsaWVudHMpOworCQlmdW5jLT5ub2RlID0gZGV2LT5ub2RlOworCQlmdW5jLT5kcml2ZXJfZGF0YSA9IGRyaXZlcmRhdGE7CisJCWZ1bmMtPm5hbWUgPSBuYW1lOworCQlmdW5jLT5waGFuZGxlID0gZGF0YVswXTsKKwkJZnVuYy0+ZmxhZ3MgPSBkYXRhWzFdOworCQlkYXRhICs9IDI7CisJCWxlbmd0aCAtPSA4OworCQlmdW5jLT5kYXRhID0gZGF0YTsKKwkJZnVuYy0+bGVuZ3RoID0gbGVuZ3RoOworCQlmdW5jLT5kZXYgPSBkZXY7CisJCURCRygicG1mOiBpZHggJWQ6IGZsYWdzPSUwOHgsIHBoYW5kbGU9JTA4eCAiCisJCSAgICAiICVkIGJ5dGVzIHJlbWFpbmluZywgcGFyc2luZy4uLlxuIiwKKwkJICAgIGNvdW50KzEsIGZ1bmMtPmZsYWdzLCBmdW5jLT5waGFuZGxlLCBsZW5ndGgpOworCQlpZiAocG1mX3BhcnNlX29uZShmdW5jLCBOVUxMLCBOVUxMLCBOVUxMKSkgeworCQkJa2ZyZWUoZnVuYyk7CisJCQlnb3RvIGJhaWw7CisJCX0KKwkJbGVuZ3RoIC09IGZ1bmMtPmxlbmd0aDsKKwkJZGF0YSA9ICh1MzIgKikoKCh1OCAqKWRhdGEpICsgZnVuYy0+bGVuZ3RoKTsKKwkJbGlzdF9hZGQoJmZ1bmMtPmxpbmssICZkZXYtPmZ1bmN0aW9ucyk7CisJCXBtZl9nZXRfZGV2aWNlKGRldik7CisJCWNvdW50Kys7CisJfQorIGJhaWw6CisJREJHKCJwbWY6IEFkZGVkICVkIGZ1bmN0aW9uc1xuIiwgY291bnQpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHBtZl9hZGRfZnVuY3Rpb25zKHN0cnVjdCBwbWZfZGV2aWNlICpkZXYsIHZvaWQgKmRyaXZlcmRhdGEpCit7CisJc3RydWN0IHByb3BlcnR5ICpwcDsKKyNkZWZpbmUgUFBfUFJFRklYICJwbGF0Zm9ybS1kby0iCisJY29uc3QgaW50IHBsZW4gPSBzdHJsZW4oUFBfUFJFRklYKTsKKwlpbnQgY291bnQgPSAwOworCisJZm9yIChwcCA9IGRldi0+bm9kZS0+cHJvcGVydGllczsgcHAgIT0gMDsgcHAgPSBwcC0+bmV4dCkgeworCQljaGFyICpuYW1lOworCQlpZiAoc3RybmNtcChwcC0+bmFtZSwgUFBfUFJFRklYLCBwbGVuKSAhPSAwKQorCQkJY29udGludWU7CisJCW5hbWUgPSBwcC0+bmFtZSArIHBsZW47CisJCWlmIChzdHJsZW4obmFtZSkgJiYgcHAtPmxlbmd0aCA+PSAxMikKKwkJCWNvdW50ICs9IHBtZl9hZGRfZnVuY3Rpb25fcHJvcChkZXYsIGRyaXZlcmRhdGEsIG5hbWUsCisJCQkJCQkgICAgICAgKHUzMiAqKXBwLT52YWx1ZSwKKwkJCQkJCSAgICAgICBwcC0+bGVuZ3RoKTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCisKK2ludCBwbWZfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQlzdHJ1Y3QgcG1mX2hhbmRsZXJzICpoYW5kbGVycywKKwkJCXZvaWQgKmRyaXZlcmRhdGEpCit7CisJc3RydWN0IHBtZl9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYyA9IDA7CisKKwlpZiAoaGFuZGxlcnMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlEQkcoInBtZjogcmVnaXN0ZXJpbmcgZHJpdmVyIGZvciBub2RlICVzXG4iLCBucC0+ZnVsbF9uYW1lKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwbWZfbG9jaywgZmxhZ3MpOworCWRldiA9IHBtZl9maW5kX2RldmljZShucCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1mX2xvY2ssIGZsYWdzKTsKKwlpZiAoZGV2ICE9IE5VTEwpIHsKKwkJREJHKCJwbWY6IGFscmVhZHkgdGhlcmUgIVxuIik7CisJCXBtZl9wdXRfZGV2aWNlKGRldik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBtZl9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJREJHKCJwbWY6IG5vIG1lbW9yeSAhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWtyZWZfaW5pdCgmZGV2LT5yZWYpOworCWRldi0+bm9kZSA9IG9mX25vZGVfZ2V0KG5wKTsKKwlkZXYtPmhhbmRsZXJzID0gaGFuZGxlcnM7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+ZnVuY3Rpb25zKTsKKworCXJjID0gcG1mX2FkZF9mdW5jdGlvbnMoZGV2LCBkcml2ZXJkYXRhKTsKKwlpZiAocmMgPT0gMCkgeworCQlEQkcoInBtZjogbm8gZnVuY3Rpb25zLCBkaXNwb3NpbmcuLiBcbiIpOworCQlvZl9ub2RlX3B1dChucCk7CisJCWtmcmVlKGRldik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwbWZfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkKCZkZXYtPmxpbmssICZwbWZfZGV2aWNlcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1mX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocG1mX3JlZ2lzdGVyX2RyaXZlcik7CisKK3N0cnVjdCBwbWZfZnVuY3Rpb24gKnBtZl9nZXRfZnVuY3Rpb24oc3RydWN0IHBtZl9mdW5jdGlvbiAqZnVuYykKK3sKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KGZ1bmMtPmRldi0+aGFuZGxlcnMtPm93bmVyKSkKKwkJcmV0dXJuIE5VTEw7CisJa3JlZl9nZXQoJmZ1bmMtPnJlZik7CisJcmV0dXJuIGZ1bmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwbWZfZ2V0X2Z1bmN0aW9uKTsKKworc3RhdGljIHZvaWQgcG1mX3JlbGVhc2VfZnVuY3Rpb24oc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHBtZl9mdW5jdGlvbiAqZnVuYyA9CisJCWNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgcG1mX2Z1bmN0aW9uLCByZWYpOworCXBtZl9wdXRfZGV2aWNlKGZ1bmMtPmRldik7CisJa2ZyZWUoZnVuYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3BtZl9wdXRfZnVuY3Rpb24oc3RydWN0IHBtZl9mdW5jdGlvbiAqZnVuYykKK3sKKwlrcmVmX3B1dCgmZnVuYy0+cmVmLCBwbWZfcmVsZWFzZV9mdW5jdGlvbik7Cit9CisKK3ZvaWQgcG1mX3B1dF9mdW5jdGlvbihzdHJ1Y3QgcG1mX2Z1bmN0aW9uICpmdW5jKQoreworCWlmIChmdW5jID09IE5VTEwpCisJCXJldHVybjsKKwltb2R1bGVfcHV0KGZ1bmMtPmRldi0+aGFuZGxlcnMtPm93bmVyKTsKKwlfX3BtZl9wdXRfZnVuY3Rpb24oZnVuYyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwbWZfcHV0X2Z1bmN0aW9uKTsKKwordm9pZCBwbWZfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlzdHJ1Y3QgcG1mX2RldmljZSAqZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEQkcoInBtZjogdW5yZWdpc3RlcmluZyBkcml2ZXIgZm9yIG5vZGUgJXNcbiIsIG5wLT5mdWxsX25hbWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBtZl9sb2NrLCBmbGFncyk7CisJZGV2ID0gcG1mX2ZpbmRfZGV2aWNlKG5wKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJREJHKCJwbWY6IG5vdCBzdWNoIGRyaXZlciAhXG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1mX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlsaXN0X2RlbCgmZGV2LT5saW5rKTsKKworCXdoaWxlKCFsaXN0X2VtcHR5KCZkZXYtPmZ1bmN0aW9ucykpIHsKKwkJc3RydWN0IHBtZl9mdW5jdGlvbiAqZnVuYyA9CisJCQlsaXN0X2VudHJ5KGRldi0+ZnVuY3Rpb25zLm5leHQsIHR5cGVvZigqZnVuYyksIGxpbmspOworCQlsaXN0X2RlbCgmZnVuYy0+bGluayk7CisJCV9fcG1mX3B1dF9mdW5jdGlvbihmdW5jKTsKKwl9CisKKwlwbWZfcHV0X2RldmljZShkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtZl9sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwbWZfdW5yZWdpc3Rlcl9kcml2ZXIpOworCitzdHJ1Y3QgcG1mX2Z1bmN0aW9uICpfX3BtZl9maW5kX2Z1bmN0aW9uKHN0cnVjdCBkZXZpY2Vfbm9kZSAqdGFyZ2V0LAorCQkJCQkgY29uc3QgY2hhciAqbmFtZSwgdTMyIGZsYWdzKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqYWN0b3IgPSBvZl9ub2RlX2dldCh0YXJnZXQpOworCXN0cnVjdCBwbWZfZGV2aWNlICpkZXY7CisJc3RydWN0IHBtZl9mdW5jdGlvbiAqZnVuYywgKnJlc3VsdCA9IE5VTEw7CisJY2hhciBmbmFtZVs2NF07CisJdTMyICpwcm9wLCBwaDsKKworCS8qCisJICogTG9vayBmb3IgYSAicGxhdGZvcm0tKiIgZnVuY3Rpb24gcmVmZXJlbmNlLiBJZiB3ZSBjYW4ndCBmaW5kCisJICogb25lLCB0aGVuIHdlIGZhbGxiYWNrIHRvIGEgZGlyZWN0IGNhbGwgYXR0ZW1wdAorCSAqLworCXNucHJpbnRmKGZuYW1lLCA2MywgInBsYXRmb3JtLSVzIiwgbmFtZSk7CisJcHJvcCA9ICh1MzIgKilnZXRfcHJvcGVydHkodGFyZ2V0LCBmbmFtZSwgTlVMTCk7CisJaWYgKHByb3AgPT0gTlVMTCkKKwkJZ290byBmaW5kX2l0OworCXBoID0gKnByb3A7CisJaWYgKHBoID09IDApCisJCWdvdG8gZmluZF9pdDsKKworCS8qCisJICogT2ssIG5vdyB0cnkgdG8gZmluZCB0aGUgYWN0b3IuIElmIHdlIGNhbid0IGZpbmQgaXQsIHdlIGZhaWwsCisJICogdGhlcmUgaXMgbm8gcG9pbnQgaW4gZmFsbGluZyBiYWNrIHRoZXJlCisJICovCisJb2Zfbm9kZV9wdXQoYWN0b3IpOworCWFjdG9yID0gb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUocGgpOworCWlmIChhY3RvciA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKyBmaW5kX2l0OgorCWRldiA9IHBtZl9maW5kX2RldmljZShhY3Rvcik7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZnVuYywgJmRldi0+ZnVuY3Rpb25zLCBsaW5rKSB7CisJCWlmIChuYW1lICYmIHN0cmNtcChuYW1lLCBmdW5jLT5uYW1lKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZnVuYy0+cGhhbmRsZSAmJiB0YXJnZXQtPm5vZGUgIT0gZnVuYy0+cGhhbmRsZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKGZ1bmMtPmZsYWdzICYgZmxhZ3MpID09IDApCisJCQljb250aW51ZTsKKwkJcmVzdWx0ID0gZnVuYzsKKwkJYnJlYWs7CisJfQorCW9mX25vZGVfcHV0KGFjdG9yKTsKKwlwbWZfcHV0X2RldmljZShkZXYpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworaW50IHBtZl9yZWdpc3Rlcl9pcnFfY2xpZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqdGFyZ2V0LAorCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgc3RydWN0IHBtZl9pcnFfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHBtZl9mdW5jdGlvbiAqZnVuYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBtZl9sb2NrLCBmbGFncyk7CisJZnVuYyA9IF9fcG1mX2ZpbmRfZnVuY3Rpb24odGFyZ2V0LCBuYW1lLCBQTUZfRkxBR1NfSU5UX0dFTik7CisJaWYgKGZ1bmMgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbWZfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJbGlzdF9hZGQoJmNsaWVudC0+bGluaywgJmZ1bmMtPmlycV9jbGllbnRzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbWZfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwbWZfcmVnaXN0ZXJfaXJxX2NsaWVudCk7CisKK3ZvaWQgcG1mX3VucmVnaXN0ZXJfaXJxX2NsaWVudChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgIHN0cnVjdCBwbWZfaXJxX2NsaWVudCAqY2xpZW50KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG1mX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbCgmY2xpZW50LT5saW5rKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbWZfbG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocG1mX3VucmVnaXN0ZXJfaXJxX2NsaWVudCk7CisKKwordm9pZCBwbWZfZG9faXJxKHN0cnVjdCBwbWZfZnVuY3Rpb24gKmZ1bmMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcG1mX2lycV9jbGllbnQgKmNsaWVudDsKKworCS8qIEZvciBub3csIHVzaW5nIGEgc3BpbmxvY2sgb3ZlciB0aGUgd2hvbGUgZnVuY3Rpb24uIENhbiBiZSBtYWRlCisJICogdG8gZHJvcCB0aGUgbG9jayB1c2luZyAyIGxpc3RzIGlmIG5lY2Vzc2FyeQorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwbWZfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xpZW50LCAmZnVuYy0+aXJxX2NsaWVudHMsIGxpbmspIHsKKwkJaWYgKCF0cnlfbW9kdWxlX2dldChjbGllbnQtPm93bmVyKSkKKwkJCWNvbnRpbnVlOworCQljbGllbnQtPmhhbmRsZXIoY2xpZW50LT5kYXRhKTsKKwkJbW9kdWxlX3B1dChjbGllbnQtPm93bmVyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1mX2xvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBtZl9kb19pcnEpOworCisKK2ludCBwbWZfY2FsbF9vbmUoc3RydWN0IHBtZl9mdW5jdGlvbiAqZnVuYywgc3RydWN0IHBtZl9hcmdzICphcmdzKQoreworCXN0cnVjdCBwbWZfZGV2aWNlICpkZXYgPSBmdW5jLT5kZXY7CisJdm9pZCAqaW5zdGRhdGEgPSBOVUxMOworCWludCByYyA9IDA7CisKKwlEQkcoIiAqKiBwbWZfY2FsbF9vbmUoJXMvJXMpICoqXG4iLCBkZXYtPm5vZGUtPmZ1bGxfbmFtZSwgZnVuYy0+bmFtZSk7CisKKwlpZiAoZGV2LT5oYW5kbGVycy0+YmVnaW4pCisJCWluc3RkYXRhID0gZGV2LT5oYW5kbGVycy0+YmVnaW4oZnVuYywgYXJncyk7CisJcmMgPSBwbWZfcGFyc2Vfb25lKGZ1bmMsIGRldi0+aGFuZGxlcnMsIGluc3RkYXRhLCBhcmdzKTsKKwlpZiAoZGV2LT5oYW5kbGVycy0+ZW5kKQorCQlkZXYtPmhhbmRsZXJzLT5lbmQoZnVuYywgaW5zdGRhdGEpOworCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwocG1mX2NhbGxfb25lKTsKKworaW50IHBtZl9kb19mdW5jdGlvbnMoc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICB1MzIgcGhhbmRsZSwgdTMyIGZmbGFncywgc3RydWN0IHBtZl9hcmdzICphcmdzKQoreworCXN0cnVjdCBwbWZfZGV2aWNlICpkZXY7CisJc3RydWN0IHBtZl9mdW5jdGlvbiAqZnVuYywgKnRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYyA9IC1FTk9ERVY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG1mX2xvY2ssIGZsYWdzKTsKKworCWRldiA9IHBtZl9maW5kX2RldmljZShucCk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtZl9sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZnVuYywgdG1wLCAmZGV2LT5mdW5jdGlvbnMsIGxpbmspIHsKKwkJaWYgKG5hbWUgJiYgc3RyY21wKG5hbWUsIGZ1bmMtPm5hbWUpKQorCQkJY29udGludWU7CisJCWlmIChwaGFuZGxlICYmIGZ1bmMtPnBoYW5kbGUgJiYgcGhhbmRsZSAhPSBmdW5jLT5waGFuZGxlKQorCQkJY29udGludWU7CisJCWlmICgoZnVuYy0+ZmxhZ3MgJiBmZmxhZ3MpID09IDApCisJCQljb250aW51ZTsKKwkJaWYgKHBtZl9nZXRfZnVuY3Rpb24oZnVuYykgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbWZfbG9jaywgZmxhZ3MpOworCQlyYyA9IHBtZl9jYWxsX29uZShmdW5jLCBhcmdzKTsKKwkJcG1mX3B1dF9mdW5jdGlvbihmdW5jKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBtZl9sb2NrLCBmbGFncyk7CisJfQorCXBtZl9wdXRfZGV2aWNlKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1mX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBtZl9kb19mdW5jdGlvbnMpOworCisKK3N0cnVjdCBwbWZfZnVuY3Rpb24gKnBtZl9maW5kX2Z1bmN0aW9uKHN0cnVjdCBkZXZpY2Vfbm9kZSAqdGFyZ2V0LAorCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBwbWZfZnVuY3Rpb24gKmZ1bmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwbWZfbG9jaywgZmxhZ3MpOworCWZ1bmMgPSBfX3BtZl9maW5kX2Z1bmN0aW9uKHRhcmdldCwgbmFtZSwgUE1GX0ZMQUdTX09OX0RFTUFORCk7CisJaWYgKGZ1bmMpCisJCWZ1bmMgPSBwbWZfZ2V0X2Z1bmN0aW9uKGZ1bmMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtZl9sb2NrLCBmbGFncyk7CisJcmV0dXJuIGZ1bmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwbWZfZmluZF9mdW5jdGlvbik7CisKK2ludCBwbWZfY2FsbF9mdW5jdGlvbihzdHJ1Y3QgZGV2aWNlX25vZGUgKnRhcmdldCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgc3RydWN0IHBtZl9hcmdzICphcmdzKQoreworCXN0cnVjdCBwbWZfZnVuY3Rpb24gKmZ1bmMgPSBwbWZfZmluZF9mdW5jdGlvbih0YXJnZXQsIG5hbWUpOworCWludCByYzsKKworCWlmIChmdW5jID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJcmMgPSBwbWZfY2FsbF9vbmUoZnVuYywgYXJncyk7CisJcG1mX3B1dF9mdW5jdGlvbihmdW5jKTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwbWZfY2FsbF9mdW5jdGlvbik7CisKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGljLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BpYy5jCmluZGV4IDkwMDQwYzQuLjE4YmYzMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9waWMuYwpAQCAtNSw4ICs1LDggQEAKICAqICBpbiBhIHNlcGFyYXRlIGZpbGUKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAxOTk3IFBhdWwgTWFja2VycmFzIChwYXVsdXNAc2FtYmEub3JnKQotICoKLSAqICBNYWludGFpbmVkIGJ5IEJlbmphbWluIEhlcnJlbnNjaG1pZHQgKGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZykKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgQmVuamFtaW4gSGVycmVuc2NobWlkdCAoYmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnKQorICogICAgICAgICAgICAgICAgICAgICBJQk0sIENvcnAuCiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQpAQCAtNTQsMTIgKzU0LDcgQEAKIH07CiAKIC8qIERlZmF1bHQgYWRkcmVzc2VzICovCi1zdGF0aWMgdm9sYXRpbGUgc3RydWN0IHBtYWNfaXJxX2h3ICpwbWFjX2lycV9od1s0XSA9IHsKLSAgICAgICAgKHN0cnVjdCBwbWFjX2lycV9odyAqKSAweGYzMDAwMDIwLAotICAgICAgICAoc3RydWN0IHBtYWNfaXJxX2h3ICopIDB4ZjMwMDAwMTAsCi0gICAgICAgIChzdHJ1Y3QgcG1hY19pcnFfaHcgKikgMHhmNDAwMDAyMCwKLSAgICAgICAgKHN0cnVjdCBwbWFjX2lycV9odyAqKSAweGY0MDAwMDEwLAotfTsKK3N0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgcG1hY19pcnFfaHcgX19pb21lbSAqcG1hY19pcnFfaHdbNF07CiAKICNkZWZpbmUgR0NfTEVWRUxfTUFTSwkJMHgzZmYwMDAwMAogI2RlZmluZSBPSEFSRV9MRVZFTF9NQVNLCTB4MWZmMDAwMDAKQEAgLTgyLDggKzc3LDcgQEAKICAqIHNpbmNlIGl0IGNhbiBsb3NlIGludGVycnVwdHMgKHNlZSBwbWFjX3NldF9pcnFfbWFzaykuCiAgKiAtLSBDb3J0CiAgKi8KLXZvaWQKLV9fc2V0X2xvc3QodW5zaWduZWQgbG9uZyBpcnFfbnIsIGludCBub2tpY2spCit2b2lkIF9fc2V0X2xvc3QodW5zaWduZWQgbG9uZyBpcnFfbnIsIGludCBub2tpY2spCiB7CiAJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGlycV9uciwgcHBjX2xvc3RfaW50ZXJydXB0cykpIHsKIAkJYXRvbWljX2luYygmcHBjX25fbG9zdF9pbnRlcnJ1cHRzKTsKQEAgLTkyLDggKzg2LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkCi1wbWFjX21hc2tfYW5kX2Fja19pcnEodW5zaWduZWQgaW50IGlycV9ucikKK3N0YXRpYyB2b2lkIHBtYWNfbWFza19hbmRfYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQogewogICAgICAgICB1bnNpZ25lZCBsb25nIGJpdCA9IDFVTCA8PCAoaXJxX25yICYgMHgxZik7CiAgICAgICAgIGludCBpID0gaXJxX25yID4+IDU7CkBAIC0yMjQsOCArMjE3LDcgQEAKIAlyZXR1cm4gSVJRX05PTkU7CiB9CiAKLWludAotcG1hY19nZXRfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGludCBwbWFjX2dldF9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaW50IGlycTsKIAl1bnNpZ25lZCBsb25nIGJpdHMgPSAwOwpAQCAtMjU2LDM0ICsyNDgsNDAgQEAKIAogLyogVGhpcyByb3V0aW5lIHdpbGwgZml4IHNvbWUgbWlzc2luZyBpbnRlcnJ1cHQgdmFsdWVzIGluIHRoZSBkZXZpY2UgdHJlZQogICogb24gdGhlIGdhdHdpY2sgbWFjLWlvIGNvbnRyb2xsZXIgdXNlZCBieSBzb21lIFBvd2VyQm9va3MKKyAqCisgKiBXYWxraW5nIG9mIE9GIG5vZGVzIGNvdWxkIHVzZSBhIGJpdCBtb3JlIGZpeGluZyB1cCBoZXJlLCBidXQgaXQncyBub3QKKyAqIHZlcnkgaW1wb3J0YW50IGFzIHRoaXMgaXMgYWxsIGJvb3QgdGltZSBjb2RlIG9uIHN0YXRpYyBwb3J0aW9ucyBvZiB0aGUKKyAqIGRldmljZS10cmVlLgorICoKKyAqIEhvd2V2ZXIsIHRoZSBtb2RpZmljYXRpb25zIGRvbmUgdG8gImludHJzIiB3aWxsIGhhdmUgdG8gYmUgcmVtb3ZlZCBhbmQKKyAqIHJlcGxhY2VkIHdpdGggcHJvcGVyIHVwZGF0ZXMgb2YgdGhlICJpbnRlcnJ1cHRzIiBwcm9wZXJ0aWVzIG9yCisgKiBBQVBMLGludGVycnVwdHMsIHlldCB0byBiZSBkZWNpZGVkLCBvbmNlIHRoZSBkeW5hbWljIHBhcnNpbmcgaXMgdGhlcmUuCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdAotcG1hY19maXhfZ2F0d2lja19pbnRlcnJ1cHRzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZ3csIGludCBpcnFfYmFzZSkKK3N0YXRpYyB2b2lkIF9faW5pdCBwbWFjX2ZpeF9nYXR3aWNrX2ludGVycnVwdHMoc3RydWN0IGRldmljZV9ub2RlICpndywKKwkJCQkJICAgICAgIGludCBpcnFfYmFzZSkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CiAJaW50IGNvdW50OwogCiAJbWVtc2V0KGdhdHdpY2tfaW50X3Bvb2wsIDAsIHNpemVvZihnYXR3aWNrX2ludF9wb29sKSk7Ci0Jbm9kZSA9IGd3LT5jaGlsZDsKIAljb3VudCA9IDA7Ci0Jd2hpbGUobm9kZSkKLQl7CisJZm9yIChub2RlID0gTlVMTDsgKG5vZGUgPSBvZl9nZXRfbmV4dF9jaGlsZChndywgbm9kZSkpICE9IE5VTEw7KSB7CiAJCS8qIEZpeCBTQ0MgKi8KLQkJaWYgKHN0cmNhc2VjbXAobm9kZS0+bmFtZSwgImVzY2MiKSA9PSAwKQotCQkJaWYgKG5vZGUtPmNoaWxkKSB7Ci0JCQkJaWYgKG5vZGUtPmNoaWxkLT5uX2ludHJzIDwgMykgewotCQkJCQlub2RlLT5jaGlsZC0+aW50cnMgPSAmZ2F0d2lja19pbnRfcG9vbFtjb3VudF07Ci0JCQkJCWNvdW50ICs9IDM7Ci0JCQkJfQotCQkJCW5vZGUtPmNoaWxkLT5uX2ludHJzID0gMzsKLQkJCQlub2RlLT5jaGlsZC0+aW50cnNbMF0ubGluZSA9IDE1K2lycV9iYXNlOwotCQkJCW5vZGUtPmNoaWxkLT5pbnRyc1sxXS5saW5lID0gIDQraXJxX2Jhc2U7Ci0JCQkJbm9kZS0+Y2hpbGQtPmludHJzWzJdLmxpbmUgPSAgNStpcnFfYmFzZTsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJpcnE6IGZpeGVkIFNDQyBvbiBzZWNvbmQgY29udHJvbGxlciAoJWQsJWQsJWQpXG4iLAotCQkJCQlub2RlLT5jaGlsZC0+aW50cnNbMF0ubGluZSwKLQkJCQkJbm9kZS0+Y2hpbGQtPmludHJzWzFdLmxpbmUsCi0JCQkJCW5vZGUtPmNoaWxkLT5pbnRyc1syXS5saW5lKTsKKwkJaWYgKChzdHJjYXNlY21wKG5vZGUtPm5hbWUsICJlc2NjIikgPT0gMCkgJiYgbm9kZS0+Y2hpbGQpIHsKKwkJCWlmIChub2RlLT5jaGlsZC0+bl9pbnRycyA8IDMpIHsKKwkJCQlub2RlLT5jaGlsZC0+aW50cnMgPSAmZ2F0d2lja19pbnRfcG9vbFtjb3VudF07CisJCQkJY291bnQgKz0gMzsKIAkJCX0KKwkJCW5vZGUtPmNoaWxkLT5uX2ludHJzID0gMzsKKwkJCW5vZGUtPmNoaWxkLT5pbnRyc1swXS5saW5lID0gMTUraXJxX2Jhc2U7CisJCQlub2RlLT5jaGlsZC0+aW50cnNbMV0ubGluZSA9ICA0K2lycV9iYXNlOworCQkJbm9kZS0+Y2hpbGQtPmludHJzWzJdLmxpbmUgPSAgNStpcnFfYmFzZTsKKwkJCXByaW50ayhLRVJOX0lORk8gImlycTogZml4ZWQgU0NDIG9uIGdhdHdpY2siCisJCQkgICAgICAgIiAoJWQsJWQsJWQpXG4iLAorCQkJICAgICAgIG5vZGUtPmNoaWxkLT5pbnRyc1swXS5saW5lLAorCQkJICAgICAgIG5vZGUtPmNoaWxkLT5pbnRyc1sxXS5saW5lLAorCQkJICAgICAgIG5vZGUtPmNoaWxkLT5pbnRyc1syXS5saW5lKTsKKwkJfQogCQkvKiBGaXggbWVkaWEtYmF5ICYgbGVmdCBTV0lNICovCiAJCWlmIChzdHJjYXNlY21wKG5vZGUtPm5hbWUsICJtZWRpYS1iYXkiKSA9PSAwKSB7CiAJCQlzdHJ1Y3QgZGV2aWNlX25vZGUqIHlhX25vZGU7CkBAIC0yOTIsMTIgKzI5MCwxMSBAQAogCQkJCW5vZGUtPmludHJzID0gJmdhdHdpY2tfaW50X3Bvb2xbY291bnQrK107CiAJCQlub2RlLT5uX2ludHJzID0gMTsKIAkJCW5vZGUtPmludHJzWzBdLmxpbmUgPSAyOStpcnFfYmFzZTsKLQkJCXByaW50ayhLRVJOX0lORk8gImlycTogZml4ZWQgbWVkaWEtYmF5IG9uIHNlY29uZCBjb250cm9sbGVyICglZClcbiIsCi0JCQkJCW5vZGUtPmludHJzWzBdLmxpbmUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiaXJxOiBmaXhlZCBtZWRpYS1iYXkgb24gZ2F0d2ljayIKKwkJCSAgICAgICAiICglZClcbiIsIG5vZGUtPmludHJzWzBdLmxpbmUpOwogCiAJCQl5YV9ub2RlID0gbm9kZS0+Y2hpbGQ7Ci0JCQl3aGlsZSh5YV9ub2RlKQotCQkJeworCQkJd2hpbGUoeWFfbm9kZSkgewogCQkJCWlmIChzdHJjYXNlY21wKHlhX25vZGUtPm5hbWUsICJmbG9wcHkiKSA9PSAwKSB7CiAJCQkJCWlmICh5YV9ub2RlLT5uX2ludHJzIDwgMikgewogCQkJCQkJeWFfbm9kZS0+aW50cnMgPSAmZ2F0d2lja19pbnRfcG9vbFtjb3VudF07CkBAIC0zMjMsNyArMzIwLDYgQEAKIAkJCQl5YV9ub2RlID0geWFfbm9kZS0+c2libGluZzsKIAkJCX0KIAkJfQotCQlub2RlID0gbm9kZS0+c2libGluZzsKIAl9CiAJaWYgKGNvdW50ID4gMTApIHsKIAkJcHJpbnRrKCJXQVJOSU5HICEhIEdhdHdpY2sgaW50ZXJydXB0IHBvb2wgb3ZlcmZsb3dcbiIpOwpAQCAtMzM4LDQ1ICszMzQsNDEgQEAKICAqIGNvbnRyb2xsZXIuICBJZiB3ZSBmaW5kIHRoaXMgc2Vjb25kIG9oYXJlLCBzZXQgaXQgdXAgYW5kIGZpeCB0aGUKICAqIGludGVycnVwdCB2YWx1ZSBpbiB0aGUgZGV2aWNlIHRyZWUgZm9yIHRoZSBldGhlcm5ldCBjaGlwLgogICovCi1zdGF0aWMgaW50IF9faW5pdCBlbmFibGVfc2Vjb25kX29oYXJlKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgZW5hYmxlX3NlY29uZF9vaGFyZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewogCXVuc2lnbmVkIGNoYXIgYnVzLCBkZXZmbjsKIAl1bnNpZ25lZCBzaG9ydCBjbWQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcjsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmlycWN0cmxlciA9IGZpbmRfZGV2aWNlcygicGNpMTA2Yiw3Iik7CiAJc3RydWN0IGRldmljZV9ub2RlICpldGhlcjsKIAotCWlmIChpcnFjdHJsZXIgPT0gTlVMTCB8fCBpcnFjdHJsZXItPm5fYWRkcnMgPD0gMCkKLQkJcmV0dXJuIC0xOwotCWFkZHIgPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcChpcnFjdHJsZXItPmFkZHJzWzBdLmFkZHJlc3MsIDB4NDApOwotCXBtYWNfaXJxX2h3WzFdID0gKHZvbGF0aWxlIHN0cnVjdCBwbWFjX2lycV9odyAqKShhZGRyICsgMHgyMCk7Ci0JbWF4X2lycXMgPSA2NDsKLQlpZiAocGNpX2RldmljZV9mcm9tX09GX25vZGUoaXJxY3RybGVyLCAmYnVzLCAmZGV2Zm4pID09IDApIHsKLQkJc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlID0gcGNpX2ZpbmRfaG9zZV9mb3JfT0ZfZGV2aWNlKGlycWN0cmxlcik7Ci0JCWlmICghaG9zZSkKLQkJICAgIHByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZmluZCBQQ0kgaG9zZSBmb3IgT0hhcmUyICFcbiIpOwotCQllbHNlIHsKLQkJICAgIGVhcmx5X3JlYWRfY29uZmlnX3dvcmQoaG9zZSwgYnVzLCBkZXZmbiwgUENJX0NPTU1BTkQsICZjbWQpOwotCQkgICAgY21kIHw9IFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX01BU1RFUjsKLQkgIAkgICAgY21kICY9IH5QQ0lfQ09NTUFORF9JTzsKLQkJICAgIGVhcmx5X3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGJ1cywgZGV2Zm4sIFBDSV9DT01NQU5ELCBjbWQpOworCS8qIFRoaXMgY29kZSBkb2Vzbid0IHN0cmljdGx5IGJlbG9uZyBoZXJlLCBpdCBjb3VsZCBiZSBwYXJ0IG9mCisJICogZWl0aGVyIHRoZSBQQ0kgaW5pdGlhbGlzYXRpb24gb3IgdGhlIGZlYXR1cmUgY29kZS4gSXQncyBrZXB0CisJICogaGVyZSBmb3IgaGlzdG9yaWNhbCByZWFzb25zLgorCSAqLworCWlmIChwY2lfZGV2aWNlX2Zyb21fT0Zfbm9kZShucCwgJmJ1cywgJmRldmZuKSA9PSAwKSB7CisJCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSA9CisJCQlwY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2UobnApOworCQlpZiAoIWhvc2UpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZmluZCBQQ0kgaG9zZSBmb3IgT0hhcmUyICFcbiIpOworCQkJcmV0dXJuOwogCQl9CisJCWVhcmx5X3JlYWRfY29uZmlnX3dvcmQoaG9zZSwgYnVzLCBkZXZmbiwgUENJX0NPTU1BTkQsICZjbWQpOworCQljbWQgfD0gUENJX0NPTU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfTUFTVEVSOworCQljbWQgJj0gflBDSV9DT01NQU5EX0lPOworCQllYXJseV93cml0ZV9jb25maWdfd29yZChob3NlLCBidXMsIGRldmZuLCBQQ0lfQ09NTUFORCwgY21kKTsKIAl9CiAKIAkvKiBGaXggaW50ZXJydXB0IGZvciB0aGUgbW9kZW0vZXRoZXJuZXQgY29tYm8gY29udHJvbGxlci4gVGhlIG51bWJlcgotCSAgIGluIHRoZSBkZXZpY2UgdHJlZSAoMjcpIGlzIGJvZ3VzIChjb3JyZWN0IGZvciB0aGUgZXRoZXJuZXQtb25seQotCSAgIGJvYXJkIGJ1dCBub3QgdGhlIGNvbWJvIGV0aGVybmV0L21vZGVtIGJvYXJkKS4KLQkgICBUaGUgcmVhbCBpbnRlcnJ1cHQgaXMgMjggb24gdGhlIHNlY29uZCBjb250cm9sbGVyIC0+IDI4KzMyID0gNjAuCi0JKi8KLQlldGhlciA9IGZpbmRfZGV2aWNlcygicGNpMTAxMSwxNCIpOworCSAqIGluIHRoZSBkZXZpY2UgdHJlZSAoMjcpIGlzIGJvZ3VzIChjb3JyZWN0IGZvciB0aGUgZXRoZXJuZXQtb25seQorCSAqIGJvYXJkIGJ1dCBub3QgdGhlIGNvbWJvIGV0aGVybmV0L21vZGVtIGJvYXJkKS4KKwkgKiBUaGUgcmVhbCBpbnRlcnJ1cHQgaXMgMjggb24gdGhlIHNlY29uZCBjb250cm9sbGVyIC0+IDI4KzMyID0gNjAuCisJICovCisJZXRoZXIgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAicGNpMTAxMSwxNCIpOwogCWlmIChldGhlciAmJiBldGhlci0+bl9pbnRycyA+IDApIHsKIAkJZXRoZXItPmludHJzWzBdLmxpbmUgPSA2MDsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiaXJxOiBGaXhlZCBldGhlcm5ldCBJUlEgdG8gJWRcbiIsCiAJCSAgICAgICBldGhlci0+aW50cnNbMF0ubGluZSk7CiAJfQotCi0JLyogUmV0dXJuIHRoZSBpbnRlcnJ1cHQgbnVtYmVyIG9mIHRoZSBjYXNjYWRlICovCi0JcmV0dXJuIGlycWN0cmxlci0+aW50cnNbMF0ubGluZTsKKwlvZl9ub2RlX3B1dChldGhlcik7CiB9CiAKICNpZmRlZiBDT05GSUdfWE1PTgpAQCAtMzk0LDYgKzM4NiwxMjEgQEAKIAkubWFzawkJPSBDUFVfTUFTS19OT05FLAogCS5uYW1lCQk9ICJjYXNjYWRlIiwKIH07CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwbWFjX3BpY19wcm9iZV9vbGRzdHlsZSh2b2lkKQoreworICAgICAgICBpbnQgaTsKKwlpbnQgaXJxX2Nhc2NhZGUgPSAtMTsKKyAgICAgICAgc3RydWN0IGRldmljZV9ub2RlICptYXN0ZXIgPSBOVUxMOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc2xhdmUgPSBOVUxMOworCXU4IF9faW9tZW0gKmFkZHI7CisJc3RydWN0IHJlc291cmNlIHI7CisKKwkvKiBTZXQgb3VyIGdldF9pcnEgZnVuY3Rpb24gKi8KKwlwcGNfbWQuZ2V0X2lycSA9IHBtYWNfZ2V0X2lycTsKKworCS8qCisJICogRmluZCB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgdHlwZSAmIG5vZGUKKwkgKi8KKworCWlmICgobWFzdGVyID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImdjIikpICE9IE5VTEwpIHsKKwkJbWF4X2lycXMgPSBtYXhfcmVhbF9pcnFzID0gMzI7CisJCWxldmVsX21hc2tbMF0gPSBHQ19MRVZFTF9NQVNLOworCX0gZWxzZSBpZiAoKG1hc3RlciA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJvaGFyZSIpKSAhPSBOVUxMKSB7CisJCW1heF9pcnFzID0gbWF4X3JlYWxfaXJxcyA9IDMyOworCQlsZXZlbF9tYXNrWzBdID0gT0hBUkVfTEVWRUxfTUFTSzsKKworCQkvKiBXZSBtaWdodCBoYXZlIGEgc2Vjb25kIGNhc2NhZGVkIG9oYXJlICovCisJCXNsYXZlID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInBjaTEwNmIsNyIpOworCQlpZiAoc2xhdmUpIHsKKwkJCW1heF9pcnFzID0gNjQ7CisJCQlsZXZlbF9tYXNrWzFdID0gT0hBUkVfTEVWRUxfTUFTSzsKKwkJCWVuYWJsZV9zZWNvbmRfb2hhcmUoc2xhdmUpOworCQl9CisJfSBlbHNlIGlmICgobWFzdGVyID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgIm1hYy1pbyIpKSAhPSBOVUxMKSB7CisJCW1heF9pcnFzID0gbWF4X3JlYWxfaXJxcyA9IDY0OworCQlsZXZlbF9tYXNrWzBdID0gSEVBVEhST1dfTEVWRUxfTUFTSzsKKwkJbGV2ZWxfbWFza1sxXSA9IDA7CisKKwkJLyogV2UgbWlnaHQgaGF2ZSBhIHNlY29uZCBjYXNjYWRlZCBoZWF0aHJvdyAqLworCQlzbGF2ZSA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKG1hc3RlciwgIm1hYy1pbyIpOworCisJCS8qIENoZWNrIG9yZGVyaW5nIG9mIG1hc3RlciAmIHNsYXZlICovCisJCWlmIChkZXZpY2VfaXNfY29tcGF0aWJsZShtYXN0ZXIsICJnYXR3aWNrIikpIHsKKwkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqdG1wOworCQkJQlVHX09OKHNsYXZlID09IE5VTEwpOworCQkJdG1wID0gbWFzdGVyOworCQkJbWFzdGVyID0gc2xhdmU7CisJCQlzbGF2ZSA9IHRtcDsKKwkJfQorCisJCS8qIFdlIGZvdW5kIGEgc2xhdmUgKi8KKwkJaWYgKHNsYXZlKSB7CisJCQltYXhfaXJxcyA9IDEyODsKKwkJCWxldmVsX21hc2tbMl0gPSBIRUFUSFJPV19MRVZFTF9NQVNLOworCQkJbGV2ZWxfbWFza1szXSA9IDA7CisJCQlwbWFjX2ZpeF9nYXR3aWNrX2ludGVycnVwdHMoc2xhdmUsIG1heF9yZWFsX2lycXMpOworCQl9CisJfQorCUJVR19PTihtYXN0ZXIgPT0gTlVMTCk7CisKKwkvKiBTZXQgdGhlIGhhbmRsZXIgZm9yIHRoZSBtYWluIFBJQyAqLworCWZvciAoIGkgPSAwOyBpIDwgbWF4X3JlYWxfaXJxcyA7IGkrKyApCisJCWlycV9kZXNjW2ldLmhhbmRsZXIgPSAmcG1hY19waWM7CisKKwkvKiBHZXQgYWRkcmVzc2VzIG9mIGZpcnN0IGNvbnRyb2xsZXIgaWYgd2UgaGF2ZSBhIG5vZGUgZm9yIGl0ICovCisJQlVHX09OKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobWFzdGVyLCAwLCAmcikpOworCisJLyogTWFwIGludGVycnVwdHMgb2YgcHJpbWFyeSBjb250cm9sbGVyICovCisJYWRkciA9ICh1OCBfX2lvbWVtICopIGlvcmVtYXAoci5zdGFydCwgMHg0MCk7CisJaSA9IDA7CisJcG1hY19pcnFfaHdbaSsrXSA9ICh2b2xhdGlsZSBzdHJ1Y3QgcG1hY19pcnFfaHcgX19pb21lbSAqKQorCQkoYWRkciArIDB4MjApOworCWlmIChtYXhfcmVhbF9pcnFzID4gMzIpCisJCXBtYWNfaXJxX2h3W2krK10gPSAodm9sYXRpbGUgc3RydWN0IHBtYWNfaXJxX2h3IF9faW9tZW0gKikKKwkJCShhZGRyICsgMHgxMCk7CisJb2Zfbm9kZV9wdXQobWFzdGVyKTsKKworCXByaW50ayhLRVJOX0lORk8gImlycTogRm91bmQgcHJpbWFyeSBBcHBsZSBQSUMgJXMgZm9yICVkIGlycXNcbiIsCisJICAgICAgIG1hc3Rlci0+ZnVsbF9uYW1lLCBtYXhfcmVhbF9pcnFzKTsKKworCS8qIE1hcCBpbnRlcnJ1cHRzIG9mIGNhc2NhZGVkIGNvbnRyb2xsZXIgKi8KKwlpZiAoc2xhdmUgJiYgIW9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc2xhdmUsIDAsICZyKSkgeworCQlhZGRyID0gKHU4IF9faW9tZW0gKilpb3JlbWFwKHIuc3RhcnQsIDB4NDApOworCQlwbWFjX2lycV9od1tpKytdID0gKHZvbGF0aWxlIHN0cnVjdCBwbWFjX2lycV9odyBfX2lvbWVtICopCisJCQkoYWRkciArIDB4MjApOworCQlpZiAobWF4X2lycXMgPiA2NCkKKwkJCXBtYWNfaXJxX2h3W2krK10gPQorCQkJCSh2b2xhdGlsZSBzdHJ1Y3QgcG1hY19pcnFfaHcgX19pb21lbSAqKQorCQkJCShhZGRyICsgMHgxMCk7CisJCWlycV9jYXNjYWRlID0gc2xhdmUtPmludHJzWzBdLmxpbmU7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaXJxOiBGb3VuZCBzbGF2ZSBBcHBsZSBQSUMgJXMgZm9yICVkIGlycXMiCisJCSAgICAgICAiIGNhc2NhZGU6ICVkXG4iLCBzbGF2ZS0+ZnVsbF9uYW1lLAorCQkgICAgICAgbWF4X2lycXMgLSBtYXhfcmVhbF9pcnFzLCBpcnFfY2FzY2FkZSk7CisJfQorCW9mX25vZGVfcHV0KHNsYXZlKTsKKworCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMgaW4gYWxsIGNvbnRyb2xsZXJzICovCisJZm9yIChpID0gMDsgaSAqIDMyIDwgbWF4X2lycXM7ICsraSkKKwkJb3V0X2xlMzIoJnBtYWNfaXJxX2h3W2ldLT5lbmFibGUsIDApOworCisJLyogbWFyayBsZXZlbCBpbnRlcnJ1cHRzICovCisJZm9yIChpID0gMDsgaSA8IG1heF9pcnFzOyBpKyspCisJCWlmIChsZXZlbF9tYXNrW2kgPj4gNV0gJiAoMVVMIDw8IChpICYgMHgxZikpKQorCQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0xFVkVMOworCisJLyogU2V0dXAgaGFuZGxlcnMgZm9yIHNlY29uZGFyeSBjb250cm9sbGVyIGFuZCBob29rIGNhc2NhZGUgaXJxKi8KKwlpZiAoc2xhdmUpIHsKKwkJZm9yICggaSA9IG1heF9yZWFsX2lycXMgOyBpIDwgbWF4X2lycXMgOyBpKysgKQorCQkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZnYXR3aWNrX3BpYzsKKwkJc2V0dXBfaXJxKGlycV9jYXNjYWRlLCAmZ2F0d2lja19jYXNjYWRlX2FjdGlvbik7CisJfQorCXByaW50ayhLRVJOX0lORk8gImlycTogU3lzdGVtIGhhcyAlZCBwb3NzaWJsZSBpbnRlcnJ1cHRzXG4iLCBtYXhfaXJxcyk7CisjaWZkZWYgQ09ORklHX1hNT04KKwlzZXR1cF9pcnEoMjAsICZ4bW9uX2FjdGlvbik7CisjZW5kaWYKK30KICNlbmRpZiAvKiBDT05GSUdfUFBDMzIgKi8KIAogc3RhdGljIGludCBwbWFjX3UzX2Nhc2NhZGUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHZvaWQgKmRhdGEpCkBAIC00MDEsMTgyICs1MDgsMTI5IEBACiAJcmV0dXJuIG1waWNfZ2V0X29uZV9pcnEoKHN0cnVjdCBtcGljICopZGF0YSwgcmVncyk7CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBwbWFjX3BpY19zZXR1cF9tcGljX25taShzdHJ1Y3QgbXBpYyAqbXBpYykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19YTU9OKSAmJiBkZWZpbmVkKENPTkZJR19QUEMzMikKKwlzdHJ1Y3QgZGV2aWNlX25vZGUqIHBzd2l0Y2g7CisJaW50IG5taV9pcnE7CisKKwlwc3dpdGNoID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInByb2dyYW1tZXItc3dpdGNoIik7CisJaWYgKHBzd2l0Y2ggJiYgcHN3aXRjaC0+bl9pbnRycykgeworCQlubWlfaXJxID0gcHN3aXRjaC0+aW50cnNbMF0ubGluZTsKKwkJbXBpY19pcnFfc2V0X3ByaW9yaXR5KG5taV9pcnEsIDkpOworCQlzZXR1cF9pcnEobm1pX2lycSwgJnhtb25fYWN0aW9uKTsKKwl9CisJb2Zfbm9kZV9wdXQocHN3aXRjaCk7CisjZW5kaWYJLyogZGVmaW5lZChDT05GSUdfWE1PTikgJiYgZGVmaW5lZChDT05GSUdfUFBDMzIpICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgbXBpYyAqIF9faW5pdCBwbWFjX3NldHVwX29uZV9tcGljKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCQlpbnQgbWFzdGVyKQoreworCXVuc2lnbmVkIGNoYXIgc2Vuc2VzWzEyOF07CisJaW50IG9mZnNldCA9IG1hc3RlciA/IDAgOiAxMjg7CisJaW50IGNvdW50ID0gbWFzdGVyID8gMTI4IDogMTI0OworCWNvbnN0IGNoYXIgKm5hbWUgPSBtYXN0ZXIgPyAiIE1QSUMgMSAgICIgOiAiIE1QSUMgMiAgICI7CisJc3RydWN0IHJlc291cmNlIHI7CisJc3RydWN0IG1waWMgKm1waWM7CisJdW5zaWduZWQgaW50IGZsYWdzID0gbWFzdGVyID8gTVBJQ19QUklNQVJZIDogMDsKKwlpbnQgcmM7CisKKwlyYyA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyKTsKKwlpZiAocmMpCisJCXJldHVybiBOVUxMOworCisJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfRU5BQkxFX01QSUMsIG5wLCAwLCAwKTsKKworCXByb21fZ2V0X2lycV9zZW5zZXMoc2Vuc2VzLCBvZmZzZXQsIG9mZnNldCArIGNvdW50KTsKKworCWZsYWdzIHw9IE1QSUNfV0FOVFNfUkVTRVQ7CisJaWYgKGdldF9wcm9wZXJ0eShucCwgImJpZy1lbmRpYW4iLCBOVUxMKSkKKwkJZmxhZ3MgfD0gTVBJQ19CSUdfRU5ESUFOOworCisJLyogUHJpbWFyeSBCaWcgRW5kaWFuIG1lYW5zIEhUIGludGVycnVwdHMuIFRoaXMgaXMgcXVpdGUgZG9kZ3kKKwkgKiBidXQgd29ya3MgdW50aWwgSSBmaW5kIGEgYmV0dGVyIHdheQorCSAqLworCWlmIChtYXN0ZXIgJiYgKGZsYWdzICYgTVBJQ19CSUdfRU5ESUFOKSkKKwkJZmxhZ3MgfD0gTVBJQ19CUk9LRU5fVTM7CisKKwltcGljID0gbXBpY19hbGxvYyhyLnN0YXJ0LCBmbGFncywgMCwgb2Zmc2V0LCBjb3VudCwgbWFzdGVyID8gMjUyIDogMCwKKwkJCSAgc2Vuc2VzLCBjb3VudCwgbmFtZSk7CisJaWYgKG1waWMgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwltcGljX2luaXQobXBpYyk7CisKKwlyZXR1cm4gbXBpYzsKKyB9CisKK3N0YXRpYyBpbnQgX19pbml0IHBtYWNfcGljX3Byb2JlX21waWModm9pZCkKK3sKKwlzdHJ1Y3QgbXBpYyAqbXBpYzEsICptcGljMjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCAqbWFzdGVyID0gTlVMTCwgKnNsYXZlID0gTlVMTDsKKworCS8qIFdlIGNhbiBoYXZlIHVwIHRvIDIgTVBJQ3MgY2FzY2FkZWQgKi8KKwlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJvcGVuLXBpYyIpKQorCQkgICAgICE9IE5VTEw7KSB7CisJCWlmIChtYXN0ZXIgPT0gTlVMTCAmJgorCQkgICAgZ2V0X3Byb3BlcnR5KG5wLCAiaW50ZXJydXB0cyIsIE5VTEwpID09IE5VTEwpCisJCQltYXN0ZXIgPSBvZl9ub2RlX2dldChucCk7CisJCWVsc2UgaWYgKHNsYXZlID09IE5VTEwpCisJCQlzbGF2ZSA9IG9mX25vZGVfZ2V0KG5wKTsKKwkJaWYgKG1hc3RlciAmJiBzbGF2ZSkKKwkJCWJyZWFrOworCX0KKworCS8qIENoZWNrIGZvciBib2d1cyBzZXR1cHMgKi8KKwlpZiAobWFzdGVyID09IE5VTEwgJiYgc2xhdmUgIT0gTlVMTCkgeworCQltYXN0ZXIgPSBzbGF2ZTsKKwkJc2xhdmUgPSBOVUxMOworCX0KKworCS8qIE5vdCBmb3VuZCwgZGVmYXVsdCB0byBnb29kIG9sZCBwbWFjIHBpYyAqLworCWlmIChtYXN0ZXIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBTZXQgbWFzdGVyIGhhbmRsZXIgKi8KKwlwcGNfbWQuZ2V0X2lycSA9IG1waWNfZ2V0X2lycTsKKworCS8qIFNldHVwIG1hc3RlciAqLworCW1waWMxID0gcG1hY19zZXR1cF9vbmVfbXBpYyhtYXN0ZXIsIDEpOworCUJVR19PTihtcGljMSA9PSBOVUxMKTsKKworCS8qIEluc3RhbGwgTk1JIGlmIGFueSAqLworCXBtYWNfcGljX3NldHVwX21waWNfbm1pKG1waWMxKTsKKworCW9mX25vZGVfcHV0KG1hc3Rlcik7CisKKwkvKiBObyBzbGF2ZSwgbGV0J3MgZ28gb3V0ICovCisJaWYgKHNsYXZlID09IE5VTEwgfHwgc2xhdmUtPm5faW50cnMgPCAxKQorCQlyZXR1cm4gMDsKKworCW1waWMyID0gcG1hY19zZXR1cF9vbmVfbXBpYyhzbGF2ZSwgMCk7CisJaWYgKG1waWMyID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gc2V0dXAgc2xhdmUgTVBJQ1xuIik7CisJCW9mX25vZGVfcHV0KHNsYXZlKTsKKwkJcmV0dXJuIDA7CisJfQorCW1waWNfc2V0dXBfY2FzY2FkZShzbGF2ZS0+aW50cnNbMF0ubGluZSwgcG1hY191M19jYXNjYWRlLCBtcGljMik7CisKKwlvZl9ub2RlX3B1dChzbGF2ZSk7CisJcmV0dXJuIDA7Cit9CisKKwogdm9pZCBfX2luaXQgcG1hY19waWNfaW5pdCh2b2lkKQogewotICAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmlycWN0cmxlciAgPSBOVUxMOwotICAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmlycWN0cmxlcjIgPSBOVUxMOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0jaWZkZWYgQ09ORklHX1BQQzMyCi0gICAgICAgIGludCBpOwotICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHI7Ci0JaW50IGlycV9jYXNjYWRlID0gLTE7Ci0jZW5kaWYKLQlzdHJ1Y3QgbXBpYyAqbXBpYzEsICptcGljMjsKLQogCS8qIFdlIGZpcnN0IHRyeSB0byBkZXRlY3QgQXBwbGUncyBuZXcgQ29yZTk5IGNoaXBzZXQsIHNpbmNlIG1hYy1pbwogCSAqIGlzIHF1aXRlIGRpZmZlcmVudCBvbiB0aG9zZSBtYWNoaW5lcyBhbmQgY29udGFpbnMgYW4gSUJNIE1QSUMyLgogCSAqLwotCW5wID0gZmluZF90eXBlX2RldmljZXMoIm9wZW4tcGljIik7Ci0Jd2hpbGUgKG5wKSB7Ci0JCWlmIChucC0+cGFyZW50ICYmICFzdHJjbXAobnAtPnBhcmVudC0+bmFtZSwgInUzIikpCi0JCQlpcnFjdHJsZXIyID0gbnA7Ci0JCWVsc2UKLQkJCWlycWN0cmxlciA9IG5wOwotCQlucCA9IG5wLT5uZXh0OwotCX0KLQlpZiAoaXJxY3RybGVyICE9IE5VTEwgJiYgaXJxY3RybGVyLT5uX2FkZHJzID4gMCkgewotCQl1bnNpZ25lZCBjaGFyIHNlbnNlc1sxMjhdOwotCi0JCXByaW50ayhLRVJOX0lORk8gIlBvd2VyTWFjIHVzaW5nIE9wZW5QSUMgaXJxIGNvbnRyb2xsZXIgYXQgMHglMDh4XG4iLAotCQkgICAgICAgKHVuc2lnbmVkIGludClpcnFjdHJsZXItPmFkZHJzWzBdLmFkZHJlc3MpOwotCQlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9FTkFCTEVfTVBJQywgaXJxY3RybGVyLCAwLCAwKTsKLQotCQlwcm9tX2dldF9pcnFfc2Vuc2VzKHNlbnNlcywgMCwgMTI4KTsKLQkJbXBpYzEgPSBtcGljX2FsbG9jKGlycWN0cmxlci0+YWRkcnNbMF0uYWRkcmVzcywKLQkJCQkgICBNUElDX1BSSU1BUlkgfCBNUElDX1dBTlRTX1JFU0VULAotCQkJCSAgIDAsIDAsIDEyOCwgMjUyLCBzZW5zZXMsIDEyOCwgIiBPcGVuUElDICAiKTsKLQkJQlVHX09OKG1waWMxID09IE5VTEwpOwotCQltcGljX2luaXQobXBpYzEpOwkJCi0KLQkJaWYgKGlycWN0cmxlcjIgIT0gTlVMTCAmJiBpcnFjdHJsZXIyLT5uX2ludHJzID4gMCAmJgotCQkgICAgaXJxY3RybGVyMi0+bl9hZGRycyA+IDApIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIlNsYXZlIE9wZW5QSUMgYXQgMHglMDh4IGhvb2tlZCBvbiBJUlEgJWRcbiIsCi0JCQkgICAgICAgKHUzMilpcnFjdHJsZXIyLT5hZGRyc1swXS5hZGRyZXNzLAotCQkJICAgICAgIGlycWN0cmxlcjItPmludHJzWzBdLmxpbmUpOwotCi0JCQlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9FTkFCTEVfTVBJQywgaXJxY3RybGVyMiwgMCwgMCk7Ci0JCQlwcm9tX2dldF9pcnFfc2Vuc2VzKHNlbnNlcywgMTI4LCAxMjggKyAxMjQpOwotCi0JCQkvKiBXZSBkb24ndCBuZWVkIHRvIHNldCBNUElDX0JST0tFTl9VMyBoZXJlIHNpbmNlIHdlIGRvbid0IGhhdmUKLQkJCSAqIGh5cGVydHJhbnNwb3J0IGludGVycnVwdHMgcm91dGVkIHRvIGl0Ci0JCQkgKi8KLQkJCW1waWMyID0gbXBpY19hbGxvYyhpcnFjdHJsZXIyLT5hZGRyc1swXS5hZGRyZXNzLAotCQkJCQkgICBNUElDX0JJR19FTkRJQU4gfCBNUElDX1dBTlRTX1JFU0VULAotCQkJCQkgICAwLCAxMjgsIDEyNCwgMCwgc2Vuc2VzLCAxMjQsCi0JCQkJCSAgICIgVTMtTVBJQyAgIik7Ci0JCQlCVUdfT04obXBpYzIgPT0gTlVMTCk7Ci0JCQltcGljX2luaXQobXBpYzIpOwotCQkJbXBpY19zZXR1cF9jYXNjYWRlKGlycWN0cmxlcjItPmludHJzWzBdLmxpbmUsCi0JCQkJCSAgIHBtYWNfdTNfY2FzY2FkZSwgbXBpYzIpOwotCQl9Ci0jaWYgZGVmaW5lZChDT05GSUdfWE1PTikgJiYgZGVmaW5lZChDT05GSUdfUFBDMzIpCi0JCXsKLQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSogcHN3aXRjaDsKLQkJCWludCBubWlfaXJxOwotCi0JCQlwc3dpdGNoID0gZmluZF9kZXZpY2VzKCJwcm9ncmFtbWVyLXN3aXRjaCIpOwotCQkJaWYgKHBzd2l0Y2ggJiYgcHN3aXRjaC0+bl9pbnRycykgewotCQkJCW5taV9pcnEgPSBwc3dpdGNoLT5pbnRyc1swXS5saW5lOwotCQkJCW1waWNfaXJxX3NldF9wcmlvcml0eShubWlfaXJxLCA5KTsKLQkJCQlzZXR1cF9pcnEobm1pX2lycSwgJnhtb25fYWN0aW9uKTsKLQkJCX0KLQkJfQotI2VuZGlmCS8qIENPTkZJR19YTU9OICovCisJaWYgKHBtYWNfcGljX3Byb2JlX21waWMoKSA9PSAwKQogCQlyZXR1cm47Ci0JfQotCWlycWN0cmxlciA9IE5VTEw7CiAKICNpZmRlZiBDT05GSUdfUFBDMzIKLQkvKiBHZXQgdGhlIGxldmVsL2VkZ2Ugc2V0dGluZ3MsIGFzc3VtZSBpZiBpdCdzIG5vdAotCSAqIGEgR3JhbmQgQ2VudHJhbCBub3IgYW4gT0hhcmUsIHRoZW4gaXQncyBhbiBIZWF0aHJvdwotCSAqIChvciBQYWRkaW5ndG9uKS4KLQkgKi8KLQlwcGNfbWQuZ2V0X2lycSA9IHBtYWNfZ2V0X2lycTsKLQlpZiAoZmluZF9kZXZpY2VzKCJnYyIpKQotCQlsZXZlbF9tYXNrWzBdID0gR0NfTEVWRUxfTUFTSzsKLQllbHNlIGlmIChmaW5kX2RldmljZXMoIm9oYXJlIikpIHsKLQkJbGV2ZWxfbWFza1swXSA9IE9IQVJFX0xFVkVMX01BU0s7Ci0JCS8qIFdlIG1pZ2h0IGhhdmUgYSBzZWNvbmQgY2FzY2FkZWQgb2hhcmUgKi8KLQkJbGV2ZWxfbWFza1sxXSA9IE9IQVJFX0xFVkVMX01BU0s7Ci0JfSBlbHNlIHsKLQkJbGV2ZWxfbWFza1swXSA9IEhFQVRIUk9XX0xFVkVMX01BU0s7Ci0JCWxldmVsX21hc2tbMV0gPSAwOwotCQkvKiBXZSBtaWdodCBoYXZlIGEgc2Vjb25kIGNhc2NhZGVkIGhlYXRocm93ICovCi0JCWxldmVsX21hc2tbMl0gPSBIRUFUSFJPV19MRVZFTF9NQVNLOwotCQlsZXZlbF9tYXNrWzNdID0gMDsKLQl9Ci0KLQkvKgotCSAqIEczIHBvd2VybWFjcyBhbmQgMTk5OSBHMyBQb3dlckJvb2tzIGhhdmUgNjQgaW50ZXJydXB0cywKLQkgKiAxOTk4IEczIFNlcmllcyBQb3dlckJvb2tzIGhhdmUgMTI4LAotCSAqIG90aGVyIHBvd2VybWFjcyBoYXZlIDMyLgotCSAqIFRoZSBjb21ibyBldGhlcm5ldC9tb2RlbSBjYXJkIGZvciB0aGUgUG93ZXJzdGFyIHBvd2VyYm9va3MKLQkgKiAoMjQwMC8zNDAwLzM1MDAsIG9oYXJlIGJhc2VkKSBoYXMgYSBzZWNvbmQgb2hhcmUgY2hpcAotCSAqIGVmZmVjdGl2ZWx5IG1ha2luZyBhIHRvdGFsIG9mIDY0LgotCSAqLwotCW1heF9pcnFzID0gbWF4X3JlYWxfaXJxcyA9IDMyOwotCWlycWN0cmxlciA9IGZpbmRfZGV2aWNlcygibWFjLWlvIik7Ci0JaWYgKGlycWN0cmxlcikKLQl7Ci0JCW1heF9yZWFsX2lycXMgPSA2NDsKLQkJaWYgKGlycWN0cmxlci0+bmV4dCkKLQkJCW1heF9pcnFzID0gMTI4OwotCQllbHNlCi0JCQltYXhfaXJxcyA9IDY0OwotCX0KLQlmb3IgKCBpID0gMDsgaSA8IG1heF9yZWFsX2lycXMgOyBpKysgKQotCQlpcnFfZGVzY1tpXS5oYW5kbGVyID0gJnBtYWNfcGljOwotCi0JLyogZ2V0IGFkZHJlc3NlcyBvZiBmaXJzdCBjb250cm9sbGVyICovCi0JaWYgKGlycWN0cmxlcikgewotCQlpZiAgKGlycWN0cmxlci0+bl9hZGRycyA+IDApIHsKLQkJCWFkZHIgPSAodW5zaWduZWQgbG9uZykKLQkJCQlpb3JlbWFwKGlycWN0cmxlci0+YWRkcnNbMF0uYWRkcmVzcywgMHg0MCk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgMjsgKytpKQotCQkJCXBtYWNfaXJxX2h3W2ldID0gKHZvbGF0aWxlIHN0cnVjdCBwbWFjX2lycV9odyopCi0JCQkJCShhZGRyICsgKDIgLSBpKSAqIDB4MTApOwotCQl9Ci0KLQkJLyogZ2V0IGFkZHJlc3NlcyBvZiBzZWNvbmQgY29udHJvbGxlciAqLwotCQlpcnFjdHJsZXIgPSBpcnFjdHJsZXItPm5leHQ7Ci0JCWlmIChpcnFjdHJsZXIgJiYgaXJxY3RybGVyLT5uX2FkZHJzID4gMCkgewotCQkJYWRkciA9ICh1bnNpZ25lZCBsb25nKQotCQkJCWlvcmVtYXAoaXJxY3RybGVyLT5hZGRyc1swXS5hZGRyZXNzLCAweDQwKTsKLQkJCWZvciAoaSA9IDI7IGkgPCA0OyArK2kpCi0JCQkJcG1hY19pcnFfaHdbaV0gPSAodm9sYXRpbGUgc3RydWN0IHBtYWNfaXJxX2h3KikKLQkJCQkJKGFkZHIgKyAoNCAtIGkpICogMHgxMCk7Ci0JCQlpcnFfY2FzY2FkZSA9IGlycWN0cmxlci0+aW50cnNbMF0ubGluZTsKLQkJCWlmIChkZXZpY2VfaXNfY29tcGF0aWJsZShpcnFjdHJsZXIsICJnYXR3aWNrIikpCi0JCQkJcG1hY19maXhfZ2F0d2lja19pbnRlcnJ1cHRzKGlycWN0cmxlciwgbWF4X3JlYWxfaXJxcyk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBvbGRlciBwb3dlcm1hY3MgaGF2ZSBhIEdDIChncmFuZCBjZW50cmFsKSBvciBvaGFyZSBhdAotCQkgICBmMzAwMDAwMCwgd2l0aCBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlcnMgYXQgZjMwMDAwMjAuICovCi0JCWFkZHIgPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcCgweGYzMDAwMDAwLCAweDQwKTsKLQkJcG1hY19pcnFfaHdbMF0gPSAodm9sYXRpbGUgc3RydWN0IHBtYWNfaXJxX2h3ICopIChhZGRyICsgMHgyMCk7Ci0JfQotCi0JLyogUG93ZXJCb29rcyAzNDAwIGFuZCAzNTAwIGNhbiBoYXZlIGEgc2Vjb25kIGNvbnRyb2xsZXIgaW4gYSBzZWNvbmQKLQkgICBvaGFyZSBjaGlwLCBvbiB0aGUgY29tYm8gZXRoZXJuZXQvbW9kZW0gY2FyZCAqLwotCWlmIChtYWNoaW5lX2lzX2NvbXBhdGlibGUoIkFBUEwsMzQwMC8yNDAwIikKLQkgICAgIHx8IG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiQUFQTCwzNTAwIikpCi0JCWlycV9jYXNjYWRlID0gZW5hYmxlX3NlY29uZF9vaGFyZSgpOwotCi0JLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyBpbiBhbGwgY29udHJvbGxlcnMgKi8KLQlmb3IgKGkgPSAwOyBpICogMzIgPCBtYXhfaXJxczsgKytpKQotCQlvdXRfbGUzMigmcG1hY19pcnFfaHdbaV0tPmVuYWJsZSwgMCk7Ci0JLyogbWFyayBsZXZlbCBpbnRlcnJ1cHRzICovCi0JZm9yIChpID0gMDsgaSA8IG1heF9pcnFzOyBpKyspCi0JCWlmIChsZXZlbF9tYXNrW2kgPj4gNV0gJiAoMVVMIDw8IChpICYgMHgxZikpKQotCQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0xFVkVMOwotCi0JLyogZ2V0IGludGVycnVwdCBsaW5lIG9mIHNlY29uZGFyeSBpbnRlcnJ1cHQgY29udHJvbGxlciAqLwotCWlmIChpcnFfY2FzY2FkZSA+PSAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImlycTogc2Vjb25kYXJ5IGNvbnRyb2xsZXIgb24gaXJxICVkXG4iLAotCQkJKGludClpcnFfY2FzY2FkZSk7Ci0JCWZvciAoIGkgPSBtYXhfcmVhbF9pcnFzIDsgaSA8IG1heF9pcnFzIDsgaSsrICkKLQkJCWlycV9kZXNjW2ldLmhhbmRsZXIgPSAmZ2F0d2lja19waWM7Ci0JCXNldHVwX2lycShpcnFfY2FzY2FkZSwgJmdhdHdpY2tfY2FzY2FkZV9hY3Rpb24pOwotCX0KLQlwcmludGsoIlN5c3RlbSBoYXMgJWQgcG9zc2libGUgaW50ZXJydXB0c1xuIiwgbWF4X2lycXMpOwotCWlmIChtYXhfaXJxcyAhPSBtYXhfcmVhbF9pcnFzKQotCQlwcmludGsoS0VSTl9ERUJVRyAiJWQgaW50ZXJydXB0cyBvbiBtYWluIGNvbnRyb2xsZXJcbiIsCi0JCQltYXhfcmVhbF9pcnFzKTsKLQotI2lmZGVmIENPTkZJR19YTU9OCi0Jc2V0dXBfaXJxKDIwLCAmeG1vbl9hY3Rpb24pOwotI2VuZGlmCS8qIENPTkZJR19YTU9OICovCi0jZW5kaWYJLyogQ09ORklHX1BQQzMyICovCisJcG1hY19waWNfcHJvYmVfb2xkc3R5bGUoKTsKKyNlbmRpZgogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfUE0pICYmIGRlZmluZWQoQ09ORklHX1BQQzMyKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wbWFjLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BtYWMuaAppbmRleCAyYWQyNWUxLi4yMWM3YjBmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BtYWMuaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BtYWMuaApAQCAtNDIsMTAgKzQyLDYgQEAKIAl1bnNpZ25lZCBsb25nIGRhdGFfcG9ydCwgdW5zaWduZWQgbG9uZyBjdHJsX3BvcnQsIGludCAqaXJxKTsKIAogZXh0ZXJuIGludCBwbWFjX252cmFtX2luaXQodm9pZCk7Ci0KLWV4dGVybiBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgcG1hY19waWM7Ci0KLXZvaWQgcG1hY19waWNfaW5pdCh2b2lkKTsKLWludCBwbWFjX2dldF9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworZXh0ZXJuIHZvaWQgcG1hY19waWNfaW5pdCh2b2lkKTsKIAogI2VuZGlmIC8qIF9fUE1BQ19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc2V0dXAuYwppbmRleCA3YWNiMDU0Li44OWM0YzM2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jCkBAIC02MCw2ICs2MCw3IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2tleGVjLmg+CiAjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KICNpbmNsdWRlIDxhc20vb2hhcmUuaD4KICNpbmNsdWRlIDxhc20vbWVkaWFiYXkuaD4KQEAgLTc0LDggKzc1LDggQEAKICNpbmNsdWRlIDxhc20vaW9tbXUuaD4KICNpbmNsdWRlIDxhc20vc211Lmg+CiAjaW5jbHVkZSA8YXNtL3BtYy5oPgotI2luY2x1ZGUgPGFzbS9tcGljLmg+CiAjaW5jbHVkZSA8YXNtL2xtYi5oPgorI2luY2x1ZGUgPGFzbS91ZGJnLmg+CiAKICNpbmNsdWRlICJwbWFjLmgiCiAKQEAgLTI3Nyw3ICsyNzgsNyBAQAogfQogI2VuZGlmCiAKLXZvaWQgX19pbml0IHBtYWNfc2V0dXBfYXJjaCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IHBtYWNfc2V0dXBfYXJjaCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1LCAqaWM7CiAJaW50ICpmcDsKQEAgLTMyMSwxNiArMzIyLDYgQEAKIAlsMmNyX2luaXQoKTsKICNlbmRpZiAvKiBDT05GSUdfUFBDMzIgKi8KIAotI2lmZGVmIENPTkZJR19QUEM2NAotCS8qIFByb2JlIG1vdGhlcmJvYXJkIGNoaXBzZXQgKi8KLQkvKiB0aGlzIGlzIGRvbmUgZWFybGllciBpbiBzZXR1cF9hcmNoIGZvciAzMi1iaXQgKi8KLQlwbWFjX2ZlYXR1cmVfaW5pdCgpOwotCi0JLyogV2UgY2FuIE5BUCAqLwotCXBvd2Vyc2F2ZV9uYXAgPSAxOwotCXByaW50ayhLRVJOX0lORk8gIlVzaW5nIG5hdGl2ZS9OQVAgaWRsZSBsb29wXG4iKTsKLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX0tHREIKIAl6c19rZ2RiX2hvb2soMCk7CiAjZW5kaWYKQEAgLTM1NCw3ICszNDUsNyBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogCS8qIENoZWNrIGZvciBDb3JlOTkgKi8KLQlpZiAoZmluZF9kZXZpY2VzKCJ1bmktbiIpIHx8IGZpbmRfZGV2aWNlcygidTMiKSkKKwlpZiAoZmluZF9kZXZpY2VzKCJ1bmktbiIpIHx8IGZpbmRfZGV2aWNlcygidTMiKSB8fCBmaW5kX2RldmljZXMoInU0IikpCiAJCXNtcF9vcHMgPSAmY29yZTk5X3NtcF9vcHM7CiAjaWZkZWYgQ09ORklHX1BQQzMyCiAJZWxzZQpAQCAtNjIxLDM3ICs2MTIsMzMgQEAKIAkgKiBhbmQgY2FsbCBpb3JlbWFwCiAJICovCiAJaHB0ZV9pbml0X25hdGl2ZSgpOworI2VuZGlmCiAKLQkvKiBJbml0IFNDQyAqLwotCWlmIChzdHJzdHIoY21kX2xpbmUsICJzY2NkYmciKSkgewotCQlzY2NkYmcgPSAxOwotCQl1ZGJnX2luaXRfc2NjKE5VTEwpOworCS8qIEVuYWJsZSBlYXJseSBidGV4dCBkZWJ1ZyBpZiByZXF1ZXN0ZWQgKi8KKwlpZiAoc3Ryc3RyKGNtZF9saW5lLCAiYnRleHRkYmciKSkgeworCQl1ZGJnX2FkYl9pbml0X2Vhcmx5KCk7CisJCXJlZ2lzdGVyX2Vhcmx5X3VkYmdfY29uc29sZSgpOwogCX0KIAorCS8qIFByb2JlIG1vdGhlcmJvYXJkIGNoaXBzZXQgKi8KKwlwbWFjX2ZlYXR1cmVfaW5pdCgpOworCisJLyogV2UgY2FuIE5BUCAqLworCXBvd2Vyc2F2ZV9uYXAgPSAxOworCXByaW50ayhLRVJOX0lORk8gIlVzaW5nIG5hdGl2ZS9OQVAgaWRsZSBsb29wXG4iKTsKKworCS8qIEluaXRpYWxpemUgZGVidWcgc3R1ZmYgKi8KKwl1ZGJnX3NjY19pbml0KCEhc3Ryc3RyKGNtZF9saW5lLCAic2NjZGJnIikpOworCXVkYmdfYWRiX2luaXQoISFzdHJzdHIoY21kX2xpbmUsICJidGV4dGRiZyIpKTsKKworI2lmZGVmIENPTkZJR19QUEM2NAogCS8qIFNldHVwIGludGVycnVwdCBtYXBwaW5nIG9wdGlvbnMgKi8KIAlwcGM2NF9pbnRlcnJ1cHRfY29udHJvbGxlciA9IElDX09QRU5fUElDOwogCi0JaW9tbXVfaW5pdF9lYXJseV91MygpOworCWlvbW11X2luaXRfZWFybHlfZGFydCgpOwogI2VuZGlmCiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBwbWFjX3Byb2dyZXNzKGNoYXIgKnMsIHVuc2lnbmVkIHNob3J0IGhleCkKLXsKLSNpZmRlZiBDT05GSUdfUFBDNjQKLQlpZiAoc2NjZGJnKSB7Ci0JCXVkYmdfcHV0cyhzKTsKLQkJdWRiZ19wdXRzKCJcbiIpOwotCQlyZXR1cm47Ci0JfQotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0JPT1RYX1RFWFQKLQlpZiAoYm9vdF90ZXh0X21hcHBlZCkgewotCQlidGV4dF9kcmF3c3RyaW5nKHMpOwotCQlidGV4dF9kcmF3Y2hhcignXG4nKTsKLQl9Ci0jZW5kaWYgLyogQ09ORklHX0JPT1RYX1RFWFQgKi8KLX0KLQogLyoKICAqIHBtYWMgaGFzIG5vIGxlZ2FjeSBJTywgYW55dGhpbmcgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGhhcyB0bwogICogZmFpbCBvciBiYWQgdGhpbmdzIHdpbGwgaGFwcGVuCkBAIC02NjMsMzUgKzY1MCwxNCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBwbWFjX2RlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyh2b2lkKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsICpucHA7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKIAotCW5wID0gZmluZF9kZXZpY2VzKCJ1bmktbiIpOwotCWlmIChucCkgewotCQlmb3IgKG5wID0gbnAtPmNoaWxkOyBucCAhPSBOVUxMOyBucCA9IG5wLT5zaWJsaW5nKQotCQkJaWYgKHN0cm5jbXAobnAtPm5hbWUsICJpMmMiLCAzKSA9PSAwKSB7Ci0JCQkJb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShucCwgInVuaS1uLWkyYyIsCi0JCQkJCQkJICBOVUxMKTsKLQkJCQlicmVhazsKLQkJCX0KLQl9Ci0JbnAgPSBmaW5kX2RldmljZXMoInZhbGt5cmllIik7CisJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAidmFsa3lyaWUiKTsKIAlpZiAobnApCiAJCW9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUobnAsICJ2YWxreXJpZSIsIE5VTEwpOwotCW5wID0gZmluZF9kZXZpY2VzKCJwbGF0aW51bSIpOworCW5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInBsYXRpbnVtIik7CiAJaWYgKG5wKQogCQlvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKG5wLCAicGxhdGludW0iLCBOVUxMKTsKLQotCW5wcCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJ1MyIpOwotCWlmIChucHApIHsKLQkJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2dldF9uZXh0X2NoaWxkKG5wcCwgbnApKSAhPSBOVUxMOykgewotCQkJaWYgKHN0cm5jbXAobnAtPm5hbWUsICJpMmMiLCAzKSA9PSAwKSB7Ci0JCQkJb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShucCwgInUzLWkyYyIsIE5VTEwpOwotCQkJCW9mX25vZGVfcHV0KG5wKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlvZl9ub2RlX3B1dChucHApOwotCX0KICAgICAgICAgbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAic211Iik7CiAgICAgICAgIGlmIChucCkgewogCQlvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKG5wLCAic211IiwgTlVMTCk7CkBAIC03MTgsNyArNjg0LDcgQEAKIAkgKiBvY2N1cGllcyBoYXZpbmcgdG8gYmUgYnJva2VuIHVwIHNvIHRoZSBEQVJUIGl0c2VsZiBpcyBub3QKIAkgKiBwYXJ0IG9mIHRoZSBjYWNoZWFibGUgbGluYXIgbWFwcGluZwogCSAqLwotCWFsbG9jX3UzX2RhcnRfdGFibGUoKTsKKwlhbGxvY19kYXJ0X3RhYmxlKCk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QTUFDX1NNVQpAQCAtNzM0LDE1ICs3MDAsMTcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QUEM2NAotc3RhdGljIGludCBwbWFjX3Byb2JlX21vZGUoc3RydWN0IHBjaV9idXMgKmJ1cykKKy8qIE1vdmUgdGhhdCB0byBwY2kuYyAqLworc3RhdGljIGludCBwbWFjX3BjaV9wcm9iZV9tb2RlKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gYnVzLT5zeXNkYXRhOwogCiAJLyogV2UgbmVlZCB0byB1c2Ugbm9ybWFsIFBDSSBwcm9iaW5nIGZvciB0aGUgQUdQIGJ1cywKLQkgICBzaW5jZSB0aGUgZGV2aWNlIGZvciB0aGUgQUdQIGJyaWRnZSBpc24ndCBpbiB0aGUgdHJlZS4gKi8KLQlpZiAoYnVzLT5zZWxmID09IE5VTEwgJiYgZGV2aWNlX2lzX2NvbXBhdGlibGUobm9kZSwgInUzLWFncCIpKQorCSAqIHNpbmNlIHRoZSBkZXZpY2UgZm9yIHRoZSBBR1AgYnJpZGdlIGlzbid0IGluIHRoZSB0cmVlLgorCSAqLworCWlmIChidXMtPnNlbGYgPT0gTlVMTCAmJiAoZGV2aWNlX2lzX2NvbXBhdGlibGUobm9kZSwgInUzLWFncCIpIHx8CisJCQkJICBkZXZpY2VfaXNfY29tcGF0aWJsZShub2RlLCAidTQtcGNpZSIpKSkKIAkJcmV0dXJuIFBDSV9QUk9CRV9OT1JNQUw7Ci0KIAlyZXR1cm4gUENJX1BST0JFX0RFVlRSRUU7CiB9CiAjZW5kaWYKQEAgLTc1Niw3ICs3MjQsNyBAQAogCS5pbml0X2Vhcmx5CQk9IHBtYWNfaW5pdF9lYXJseSwKIAkuc2hvd19jcHVpbmZvCQk9IHBtYWNfc2hvd19jcHVpbmZvLAogCS5pbml0X0lSUQkJPSBwbWFjX3BpY19pbml0LAotCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwJLyogY2hhbmdlZCBsYXRlciAqLworCS5nZXRfaXJxCQk9IE5VTEwsCS8qIGNoYW5nZWQgbGF0ZXIgKi8KIAkucGNpYmlvc19maXh1cAkJPSBwbWFjX3BjaWJpb3NfZml4dXAsCiAJLnJlc3RhcnQJCT0gcG1hY19yZXN0YXJ0LAogCS5wb3dlcl9vZmYJCT0gcG1hY19wb3dlcl9vZmYsCkBAIC03NjgsMTIgKzczNiwxNyBAQAogCS5jYWxpYnJhdGVfZGVjcgkJPSBwbWFjX2NhbGlicmF0ZV9kZWNyLAogCS5mZWF0dXJlX2NhbGwJCT0gcG1hY19kb19mZWF0dXJlX2NhbGwsCiAJLmNoZWNrX2xlZ2FjeV9pb3BvcnQJPSBwbWFjX2NoZWNrX2xlZ2FjeV9pb3BvcnQsCi0JLnByb2dyZXNzCQk9IHBtYWNfcHJvZ3Jlc3MsCisJLnByb2dyZXNzCQk9IHVkYmdfcHJvZ3Jlc3MsCiAjaWZkZWYgQ09ORklHX1BQQzY0Ci0JLnBjaV9wcm9iZV9tb2RlCQk9IHBtYWNfcHJvYmVfbW9kZSwKKwkucGNpX3Byb2JlX21vZGUJCT0gcG1hY19wY2lfcHJvYmVfbW9kZSwKIAkuaWRsZV9sb29wCQk9IG5hdGl2ZV9pZGxlLAogCS5lbmFibGVfcG1jcwkJPSBwb3dlcjRfZW5hYmxlX3BtY3MsCisjaWZkZWYgQ09ORklHX0tFWEVDCisJLm1hY2hpbmVfa2V4ZWMJCT0gZGVmYXVsdF9tYWNoaW5lX2tleGVjLAorCS5tYWNoaW5lX2tleGVjX3ByZXBhcmUJPSBkZWZhdWx0X21hY2hpbmVfa2V4ZWNfcHJlcGFyZSwKKwkubWFjaGluZV9jcmFzaF9zaHV0ZG93bgk9IGRlZmF1bHRfbWFjaGluZV9jcmFzaF9zaHV0ZG93biwKICNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogI2lmZGVmIENPTkZJR19QUEMzMgogCS5wY2liaW9zX2VuYWJsZV9kZXZpY2VfaG9vayA9IHBtYWNfcGNpX2VuYWJsZV9kZXZpY2VfaG9vaywKIAkucGNpYmlvc19hZnRlcl9pbml0CT0gcG1hY19wY2liaW9zX2FmdGVyX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zbXAuYwppbmRleCBmYjJhN2M3Li4wZGYyY2RjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc21wLmMKQEAgLTUyLDggKzUyLDkgQEAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9rZXlsYXJnby5oPgogI2luY2x1ZGUgPGFzbS9wbWFjX2xvd19pMmMuaD4KKyNpbmNsdWRlIDxhc20vcG1hY19wZnVuYy5oPgogCi0jdW5kZWYgREVCVUcKKyNkZWZpbmUgREVCVUcKIAogI2lmZGVmIERFQlVHCiAjZGVmaW5lIERCRyhmbXQuLi4pIHVkYmdfcHJpbnRmKGZtdCkKQEAgLTYyLDYgKzYzLDcgQEAKICNlbmRpZgogCiBleHRlcm4gdm9pZCBfX3NlY29uZGFyeV9zdGFydF9wbWFjXzAodm9pZCk7CitleHRlcm4gaW50IHBtYWNfcGZ1bmNfYmFzZV9pbnN0YWxsKHZvaWQpOwogCiAjaWZkZWYgQ09ORklHX1BQQzMyCiAKQEAgLTM2MSw3ICszNjMsNiBAQAogCXNldF9kZWModGJfdGlja3NfcGVyX2ppZmZ5KTsKIAkvKiBYWFggZml4bWUgKi8KIAlzZXRfdGIoMCwgMCk7Ci0JbGFzdF9qaWZmeV9zdGFtcChjcHVfbnIpID0gMDsKIAogCWlmIChjcHVfbnIgPiAwKSB7CiAJCW1iKCk7CkBAIC00MjksMTUgKzQzMCw2MiBAQAogfTsKICNlbmRpZiAvKiBDT05GSUdfUFBDMzIgLSBhY3R1YWxseSBwb3dlcnN1cmdlIHN1cHBvcnQgKi8KIAorLyoKKyAqIENvcmUgOTkgYW5kIGxhdGVyIHN1cHBvcnQKKyAqLworCitzdGF0aWMgdm9pZCAoKnBtYWNfdGJfZnJlZXplKShpbnQgZnJlZXplKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWViYXNlOworc3RhdGljIGludCB0Yl9yZXE7CisKK3N0YXRpYyB2b2lkIHNtcF9jb3JlOTlfZ2l2ZV90aW1lYmFzZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwl3aGlsZSghdGJfcmVxKQorCQliYXJyaWVyKCk7CisJdGJfcmVxID0gMDsKKwkoKnBtYWNfdGJfZnJlZXplKSgxKTsKKwltYigpOworCXRpbWViYXNlID0gZ2V0X3RiKCk7CisJbWIoKTsKKwl3aGlsZSAodGltZWJhc2UpCisJCWJhcnJpZXIoKTsKKwltYigpOworCSgqcG1hY190Yl9mcmVlemUpKDApOworCW1iKCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgX19kZXZpbml0IHNtcF9jb3JlOTlfdGFrZV90aW1lYmFzZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwl0Yl9yZXEgPSAxOworCW1iKCk7CisJd2hpbGUgKCF0aW1lYmFzZSkKKwkJYmFycmllcigpOworCW1iKCk7CisJc2V0X3RiKHRpbWViYXNlID4+IDMyLCB0aW1lYmFzZSAmIDB4ZmZmZmZmZmYpOworCXRpbWViYXNlID0gMDsKKwltYigpOworCXNldF9kZWModGJfdGlja3NfcGVyX2ppZmZ5LzIpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCiAjaWZkZWYgQ09ORklHX1BQQzY0CiAvKgogICogRzVzIGVuYWJsZS9kaXNhYmxlIHRoZSB0aW1lYmFzZSB2aWEgYW4gaTJjLWNvbm5lY3RlZCBjbG9jayBjaGlwLgogICovCi1zdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpwbWFjX3RiX2Nsb2NrX2NoaXBfaG9zdDsKK3N0YXRpYyBzdHJ1Y3QgcG1hY19pMmNfYnVzICpwbWFjX3RiX2Nsb2NrX2NoaXBfaG9zdDsKIHN0YXRpYyB1OCBwbWFjX3RiX3B1bHNhcl9hZGRyOwotc3RhdGljIHZvaWQgKCpwbWFjX3RiX2ZyZWV6ZSkoaW50IGZyZWV6ZSk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHRpbWViYXNlX2xvY2spOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZWJhc2U7CiAKIHN0YXRpYyB2b2lkIHNtcF9jb3JlOTlfY3lwcmVzc190Yl9mcmVlemUoaW50IGZyZWV6ZSkKIHsKQEAgLTQ0NywxOSArNDk1LDIwIEBACiAJLyogU3RyYW5nZWx5LCB0aGUgZGV2aWNlLXRyZWUgc2F5cyBhZGRyZXNzIGlzIDB4ZDIsIGJ1dCBkYXJ3aW4KIAkgKiBhY2Nlc3NlcyAweGQwIC4uLgogCSAqLwotCXBtYWNfbG93X2kyY19zZXRtb2RlKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0LCBwbWFjX2xvd19pMmNfbW9kZV9jb21iaW5lZCk7Ci0JcmMgPSBwbWFjX2xvd19pMmNfeGZlcihwbWFjX3RiX2Nsb2NrX2NoaXBfaG9zdCwKLQkJCSAgICAgICAweGQwIHwgcG1hY19sb3dfaTJjX3JlYWQsCi0JCQkgICAgICAgMHg4MSwgJmRhdGEsIDEpOworCXBtYWNfaTJjX3NldG1vZGUocG1hY190Yl9jbG9ja19jaGlwX2hvc3QsCisJCQkgcG1hY19pMmNfbW9kZV9jb21iaW5lZCk7CisJcmMgPSBwbWFjX2kyY194ZmVyKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0LAorCQkJICAgMHhkMCB8IHBtYWNfaTJjX3JlYWQsCisJCQkgICAxLCAweDgxLCAmZGF0YSwgMSk7CiAJaWYgKHJjICE9IDApCiAJCWdvdG8gYmFpbDsKIAogCWRhdGEgPSAoZGF0YSAmIDB4ZjMpIHwgKGZyZWV6ZSA/IDB4MDAgOiAweDBjKTsKIAotICAgICAgIAlwbWFjX2xvd19pMmNfc2V0bW9kZShwbWFjX3RiX2Nsb2NrX2NoaXBfaG9zdCwgcG1hY19sb3dfaTJjX21vZGVfc3Rkc3ViKTsKLQlyYyA9IHBtYWNfbG93X2kyY194ZmVyKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0LAotCQkJICAgICAgIDB4ZDAgfCBwbWFjX2xvd19pMmNfd3JpdGUsCi0JCQkgICAgICAgMHg4MSwgJmRhdGEsIDEpOworICAgICAgIAlwbWFjX2kyY19zZXRtb2RlKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0LCBwbWFjX2kyY19tb2RlX3N0ZHN1Yik7CisJcmMgPSBwbWFjX2kyY194ZmVyKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0LAorCQkJICAgMHhkMCB8IHBtYWNfaTJjX3dyaXRlLAorCQkJICAgMSwgMHg4MSwgJmRhdGEsIDEpOwogCiAgYmFpbDoKIAlpZiAocmMgIT0gMCkgewpAQCAtNDc1LDE5ICs1MjQsMjAgQEAKIAl1OCBkYXRhOwogCWludCByYzsKIAotCXBtYWNfbG93X2kyY19zZXRtb2RlKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0LCBwbWFjX2xvd19pMmNfbW9kZV9jb21iaW5lZCk7Ci0JcmMgPSBwbWFjX2xvd19pMmNfeGZlcihwbWFjX3RiX2Nsb2NrX2NoaXBfaG9zdCwKLQkJCSAgICAgICBwbWFjX3RiX3B1bHNhcl9hZGRyIHwgcG1hY19sb3dfaTJjX3JlYWQsCi0JCQkgICAgICAgMHgyZSwgJmRhdGEsIDEpOworCXBtYWNfaTJjX3NldG1vZGUocG1hY190Yl9jbG9ja19jaGlwX2hvc3QsCisJCQkgcG1hY19pMmNfbW9kZV9jb21iaW5lZCk7CisJcmMgPSBwbWFjX2kyY194ZmVyKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0LAorCQkJICAgcG1hY190Yl9wdWxzYXJfYWRkciB8IHBtYWNfaTJjX3JlYWQsCisJCQkgICAxLCAweDJlLCAmZGF0YSwgMSk7CiAJaWYgKHJjICE9IDApCiAJCWdvdG8gYmFpbDsKIAogCWRhdGEgPSAoZGF0YSAmIDB4ODgpIHwgKGZyZWV6ZSA/IDB4MTEgOiAweDIyKTsKIAotCXBtYWNfbG93X2kyY19zZXRtb2RlKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0LCBwbWFjX2xvd19pMmNfbW9kZV9zdGRzdWIpOwotCXJjID0gcG1hY19sb3dfaTJjX3hmZXIocG1hY190Yl9jbG9ja19jaGlwX2hvc3QsCi0JCQkgICAgICAgcG1hY190Yl9wdWxzYXJfYWRkciB8IHBtYWNfbG93X2kyY193cml0ZSwKLQkJCSAgICAgICAweDJlLCAmZGF0YSwgMSk7CisJcG1hY19pMmNfc2V0bW9kZShwbWFjX3RiX2Nsb2NrX2NoaXBfaG9zdCwgcG1hY19pMmNfbW9kZV9zdGRzdWIpOworCXJjID0gcG1hY19pMmNfeGZlcihwbWFjX3RiX2Nsb2NrX2NoaXBfaG9zdCwKKwkJCSAgIHBtYWNfdGJfcHVsc2FyX2FkZHIgfCBwbWFjX2kyY193cml0ZSwKKwkJCSAgIDEsIDB4MmUsICZkYXRhLCAxKTsKICBiYWlsOgogCWlmIChyYyAhPSAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiUHVsc2FyIFRpbWViYXNlICVzIHJjOiAlZFxuIiwKQEAgLTQ5Niw1NCArNTQ2LDE0IEBACiAJfQogfQogCi0KLXN0YXRpYyB2b2lkIHNtcF9jb3JlOTlfZ2l2ZV90aW1lYmFzZSh2b2lkKQotewotCS8qIE9wZW4gaTJjIGJ1cyBmb3Igc3luY2hyb25vdXMgYWNjZXNzICovCi0JaWYgKHBtYWNfbG93X2kyY19vcGVuKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0LCAwKSkKLQkJcGFuaWMoIkNhbid0IG9wZW4gaTJjIGZvciBUQiBzeW5jICFcbiIpOwotCi0Jc3Bpbl9sb2NrKCZ0aW1lYmFzZV9sb2NrKTsKLQkoKnBtYWNfdGJfZnJlZXplKSgxKTsKLQltYigpOwotCXRpbWViYXNlID0gZ2V0X3RiKCk7Ci0Jc3Bpbl91bmxvY2soJnRpbWViYXNlX2xvY2spOwotCi0Jd2hpbGUgKHRpbWViYXNlKQotCQliYXJyaWVyKCk7Ci0KLQlzcGluX2xvY2soJnRpbWViYXNlX2xvY2spOwotCSgqcG1hY190Yl9mcmVlemUpKDApOwotCXNwaW5fdW5sb2NrKCZ0aW1lYmFzZV9sb2NrKTsKLQotCS8qIENsb3NlIGkyYyBidXMgKi8KLQlwbWFjX2xvd19pMmNfY2xvc2UocG1hY190Yl9jbG9ja19jaGlwX2hvc3QpOwotfQotCi0KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBzbXBfY29yZTk5X3Rha2VfdGltZWJhc2Uodm9pZCkKLXsKLQl3aGlsZSAoIXRpbWViYXNlKQotCQliYXJyaWVyKCk7Ci0Jc3Bpbl9sb2NrKCZ0aW1lYmFzZV9sb2NrKTsKLQlzZXRfdGIodGltZWJhc2UgPj4gMzIsIHRpbWViYXNlICYgMHhmZmZmZmZmZik7Ci0JdGltZWJhc2UgPSAwOwotCXNwaW5fdW5sb2NrKCZ0aW1lYmFzZV9sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHNtcF9jb3JlOTlfc2V0dXAoaW50IG5jcHVzKQorc3RhdGljIHZvaWQgX19pbml0IHNtcF9jb3JlOTlfc2V0dXBfaTJjX2h3c3luYyhpbnQgbmNwdXMpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpjYyA9IE5VTEw7CQogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcDsKKwljb25zdCBjaGFyICpuYW1lID0gTlVMTDsKIAl1MzIgKnJlZzsKIAlpbnQgb2s7CiAKLQkvKiBIVyBzeW5jIG9ubHkgb24gdGhlc2UgcGxhdGZvcm1zICovCi0JaWYgKCFtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyTWFjNywyIikgJiYKLQkgICAgIW1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJNYWM3LDMiKSAmJgotCSAgICAhbWFjaGluZV9pc19jb21wYXRpYmxlKCJSYWNrTWFjMywxIikpCi0JCXJldHVybjsKLQogCS8qIExvb2sgZm9yIHRoZSBjbG9jayBjaGlwICovCiAJd2hpbGUgKChjYyA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKGNjLCAiaTJjLWh3Y2xvY2siKSkgIT0gTlVMTCkgewogCQlwID0gb2ZfZ2V0X3BhcmVudChjYyk7CkBAIC01NTIsMTI0ICs1NjIsODYgQEAKIAkJaWYgKCFvaykKIAkJCWNvbnRpbnVlOwogCisJCXBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0ID0gcG1hY19pMmNfZmluZF9idXMoY2MpOworCQlpZiAocG1hY190Yl9jbG9ja19jaGlwX2hvc3QgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOwogCQlyZWcgPSAodTMyICopZ2V0X3Byb3BlcnR5KGNjLCAicmVnIiwgTlVMTCk7CiAJCWlmIChyZWcgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwotCiAJCXN3aXRjaCAoKnJlZykgewogCQljYXNlIDB4ZDI6Ci0JCQlpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUoY2MsICJwdWxzYXItbGVnYWN5LXNsZXdpbmciKSkgeworCQkJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKGNjLCJwdWxzYXItbGVnYWN5LXNsZXdpbmciKSkgewogCQkJCXBtYWNfdGJfZnJlZXplID0gc21wX2NvcmU5OV9wdWxzYXJfdGJfZnJlZXplOwogCQkJCXBtYWNfdGJfcHVsc2FyX2FkZHIgPSAweGQyOwotCQkJCXByaW50ayhLRVJOX0lORk8gIlRpbWViYXNlIGNsb2NrIGlzIFB1bHNhciBjaGlwXG4iKTsKKwkJCQluYW1lID0gIlB1bHNhciI7CiAJCQl9IGVsc2UgaWYgKGRldmljZV9pc19jb21wYXRpYmxlKGNjLCAiY3kyODUwOCIpKSB7CiAJCQkJcG1hY190Yl9mcmVlemUgPSBzbXBfY29yZTk5X2N5cHJlc3NfdGJfZnJlZXplOwotCQkJCXByaW50ayhLRVJOX0lORk8gIlRpbWViYXNlIGNsb2NrIGlzIEN5cHJlc3MgY2hpcFxuIik7CisJCQkJbmFtZSA9ICJDeXByZXNzIjsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIDB4ZDQ6CiAJCQlwbWFjX3RiX2ZyZWV6ZSA9IHNtcF9jb3JlOTlfcHVsc2FyX3RiX2ZyZWV6ZTsKIAkJCXBtYWNfdGJfcHVsc2FyX2FkZHIgPSAweGQ0OwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiVGltZWJhc2UgY2xvY2sgaXMgUHVsc2FyIGNoaXBcbiIpOworCQkJbmFtZSA9ICJQdWxzYXIiOwogCQkJYnJlYWs7CiAJCX0KLQkJaWYgKHBtYWNfdGJfZnJlZXplICE9IE5VTEwpIHsKLQkJCXBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0ID0gb2ZfZ2V0X3BhcmVudChjYyk7Ci0JCQlvZl9ub2RlX3B1dChjYyk7CisJCWlmIChwbWFjX3RiX2ZyZWV6ZSAhPSBOVUxMKQogCQkJYnJlYWs7CisJfQorCWlmIChwbWFjX3RiX2ZyZWV6ZSAhPSBOVUxMKSB7CisJCS8qIE9wZW4gaTJjIGJ1cyBmb3Igc3luY2hyb25vdXMgYWNjZXNzICovCisJCWlmIChwbWFjX2kyY19vcGVuKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0LCAxKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG9wIG9wZW4gaTJjIGJ1cyBmb3IgY2xvY2siCisJCQkgICAgICAgIiBzeW5jLCBmYWxsYmFjayB0byBzb2Z0d2FyZSBzeW5jICFcbiIpOworCQkJZ290byBub19pMmNfc3luYzsKIAkJfQorCQlwcmludGsoS0VSTl9JTkZPICJQcm9jZXNzb3IgdGltZWJhc2Ugc3luYyB1c2luZyAlcyBpMmMgY2xvY2tcbiIsCisJCSAgICAgICBuYW1lKTsKKwkJcmV0dXJuOwogCX0KLQlpZiAocG1hY190Yl9mcmVlemUgPT0gTlVMTCkgewotCQlzbXBfb3BzLT5naXZlX3RpbWViYXNlID0gc21wX2dlbmVyaWNfZ2l2ZV90aW1lYmFzZTsKLQkJc21wX29wcy0+dGFrZV90aW1lYmFzZSA9IHNtcF9nZW5lcmljX3Rha2VfdGltZWJhc2U7Ci0JfQorIG5vX2kyY19zeW5jOgorCXBtYWNfdGJfZnJlZXplID0gTlVMTDsKKwlwbWFjX3RiX2Nsb2NrX2NoaXBfaG9zdCA9IE5VTEw7CiB9CiAKLS8qIG5vdGhpbmcgdG8gZG8gaGVyZSwgY2FjaGVzIGFyZSBhbHJlYWR5IHNldCB1cCBieSBzZXJ2aWNlIHByb2Nlc3NvciAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fZGV2aW5pdCBjb3JlOTlfaW5pdF9jYWNoZXMoaW50IGNwdSkKKworCisvKgorICogTmV3ZXIgRzVzIHVzZXMgYSBwbGF0Zm9ybSBmdW5jdGlvbgorICovCisKK3N0YXRpYyB2b2lkIHNtcF9jb3JlOTlfcGZ1bmNfdGJfZnJlZXplKGludCBmcmVlemUpCiB7CisJc3RydWN0IGRldmljZV9ub2RlICpjcHVzOworCXN0cnVjdCBwbWZfYXJncyBhcmdzOworCisJY3B1cyA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvY3B1cyIpOworCUJVR19PTihjcHVzID09IE5VTEwpOworCWFyZ3MuY291bnQgPSAxOworCWFyZ3MudVswXS52ID0gIWZyZWV6ZTsKKwlwbWZfY2FsbF9mdW5jdGlvbihjcHVzLCAiY3B1LXRpbWViYXNlIiwgJmFyZ3MpOworCW9mX25vZGVfcHV0KGNwdXMpOwogfQogCiAjZWxzZSAvKiBDT05GSUdfUFBDNjQgKi8KIAogLyoKLSAqIFNNUCBHNCBwb3dlcm1hY3MgdXNlIGEgR1BJTyB0byBlbmFibGUvZGlzYWJsZSB0aGUgdGltZWJhc2UuCisgKiBTTVAgRzQgdXNlIGEgR1BJTyB0byBlbmFibGUvZGlzYWJsZSB0aGUgdGltZWJhc2UuCiAgKi8KIAogc3RhdGljIHVuc2lnbmVkIGludCBjb3JlOTlfdGJfZ3BpbzsJLyogVGltZWJhc2UgZnJlZXplIEdQSU8gKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCBwcmlfdGJfaGksIHByaV90Yl9sbzsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcHJpX3RiX3N0YW1wOwotCi0vKiBub3QgX19pbml0LCBjYWxsZWQgaW4gc2xlZXAvd2FrZXVwIGNvZGUgKi8KLXZvaWQgc21wX2NvcmU5OV9naXZlX3RpbWViYXNlKHZvaWQpCitzdGF0aWMgdm9pZCBzbXBfY29yZTk5X2dwaW9fdGJfZnJlZXplKGludCBmcmVlemUpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgdDsKLQotCS8qIHdhaXQgZm9yIHRoZSBzZWNvbmRhcnkgdG8gYmUgaW4gdGFrZV90aW1lYmFzZSAqLwotCWZvciAodCA9IDEwMDAwMDsgdCA+IDAgJiYgIXNlY190Yl9yZXNldDsgLS10KQotCQl1ZGVsYXkoMTApOwotCWlmICghc2VjX3RiX3Jlc2V0KSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlRpbWVvdXQgd2FpdGluZyBzeW5jIG9uIHNlY29uZCBDUFVcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogZnJlZXplIHRoZSB0aW1lYmFzZSBhbmQgcmVhZCBpdCAqLwotCS8qIGRpc2FibGUgaW50ZXJydXB0cyBzbyB0aGUgdGltZWJhc2UgaXMgZGlzYWJsZWQgZm9yIHRoZQotCSAgIHNob3J0ZXN0IHBvc3NpYmxlIHRpbWUgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfV1JJVEVfR1BJTywgTlVMTCwgY29yZTk5X3RiX2dwaW8sIDQpOworCWlmIChmcmVlemUpCisJCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1dSSVRFX0dQSU8sIE5VTEwsIGNvcmU5OV90Yl9ncGlvLCA0KTsKKwllbHNlCisJCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1dSSVRFX0dQSU8sIE5VTEwsIGNvcmU5OV90Yl9ncGlvLCAwKTsKIAlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9SRUFEX0dQSU8sIE5VTEwsIGNvcmU5OV90Yl9ncGlvLCAwKTsKLQltYigpOwotCXByaV90Yl9oaSA9IGdldF90YnUoKTsKLQlwcmlfdGJfbG8gPSBnZXRfdGJsKCk7Ci0JcHJpX3RiX3N0YW1wID0gbGFzdF9qaWZmeV9zdGFtcChzbXBfcHJvY2Vzc29yX2lkKCkpOwotCW1iKCk7Ci0KLQkvKiB0ZWxsIHRoZSBzZWNvbmRhcnkgd2UncmUgcmVhZHkgKi8KLQlzZWNfdGJfcmVzZXQgPSAyOwotCW1iKCk7Ci0KLQkvKiB3YWl0IGZvciB0aGUgc2Vjb25kYXJ5IHRvIGhhdmUgdGFrZW4gaXQgKi8KLQkvKiBub3RlOiBjYW4ndCB1c2UgdWRlbGF5IGhlcmUsIHNpbmNlIGl0IG5lZWRzIHRoZSB0aW1lYmFzZSBydW5uaW5nICovCi0JZm9yICh0ID0gMTAwMDAwMDA7IHQgPiAwICYmIHNlY190Yl9yZXNldDsgLS10KQotCQliYXJyaWVyKCk7Ci0JaWYgKHNlY190Yl9yZXNldCkKLQkJLyogWFhYIEJVR19PTiBoZXJlPyAqLwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJUaW1lb3V0IHdhaXRpbmcgc3luYygyKSBvbiBzZWNvbmQgQ1BVXG4iKTsKLQotCS8qIE5vdywgcmVzdGFydCB0aGUgdGltZWJhc2UgYnkgbGVhdmluZyB0aGUgR1BJTyB0byBhbiBvcGVuIGNvbGxlY3RvciAqLwotICAgICAgIAlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9XUklURV9HUElPLCBOVUxMLCBjb3JlOTlfdGJfZ3BpbywgMCk7Ci0gICAgICAgIHBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1JFQURfR1BJTywgTlVMTCwgY29yZTk5X3RiX2dwaW8sIDApOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAotLyogbm90IF9faW5pdCwgY2FsbGVkIGluIHNsZWVwL3dha2V1cCBjb2RlICovCi12b2lkIHNtcF9jb3JlOTlfdGFrZV90aW1lYmFzZSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkvKiB0ZWxsIHRoZSBwcmltYXJ5IHdlJ3JlIGhlcmUgKi8KLQlzZWNfdGJfcmVzZXQgPSAxOwotCW1iKCk7Ci0KLQkvKiB3YWl0IGZvciB0aGUgcHJpbWFyeSB0byBzZXQgcHJpX3RiX2hpL2xvICovCi0Jd2hpbGUgKHNlY190Yl9yZXNldCA8IDIpCi0JCW1iKCk7Ci0KLQkvKiBzZXQgb3VyIHN0dWZmIHRoZSBzYW1lIGFzIHRoZSBwcmltYXJ5ICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXNldF9kZWMoMSk7Ci0Jc2V0X3RiKHByaV90Yl9oaSwgcHJpX3RiX2xvKTsKLQlsYXN0X2ppZmZ5X3N0YW1wKHNtcF9wcm9jZXNzb3JfaWQoKSkgPSBwcmlfdGJfc3RhbXA7Ci0JbWIoKTsKLQotCS8qIHRlbGwgdGhlIHByaW1hcnkgd2UncmUgZG9uZSAqLwotICAgICAgIAlzZWNfdGJfcmVzZXQgPSAwOwotCW1iKCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQorI2VuZGlmIC8qICFDT05GSUdfUFBDNjQgKi8KIAogLyogTDIgYW5kIEwzIGNhY2hlIHNldHRpbmdzIHRvIHBhc3MgZnJvbSBDUFUwIHRvIENQVTEgb24gRzQgY3B1cyAqLwogdm9sYXRpbGUgc3RhdGljIGxvbmcgaW50IGNvcmU5OV9sMl9jYWNoZTsKQEAgLTY3Nyw2ICs2NDksNyBAQAogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgY29yZTk5X2luaXRfY2FjaGVzKGludCBjcHUpCiB7CisjaWZuZGVmIENPTkZJR19QUEM2NAogCWlmICghY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfTDJDUikpCiAJCXJldHVybjsKIApAQCAtNzAyLDMwICs2NzUsNzYgQEAKIAkJX3NldF9MM0NSKGNvcmU5OV9sM19jYWNoZSk7CiAJCXByaW50aygiQ1BVJWQ6IEwzQ1Igc2V0IHRvICVseFxuIiwgY3B1LCBjb3JlOTlfbDNfY2FjaGUpOwogCX0KKyNlbmRpZiAvKiAhQ09ORklHX1BQQzY0ICovCiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBzbXBfY29yZTk5X3NldHVwKGludCBuY3B1cykKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdTsKLQl1MzIgKnRicHJvcCA9IE5VTEw7Ci0JaW50IGk7CisjaWZkZWYgQ09ORklHX1BQQzY0CiAKLQljb3JlOTlfdGJfZ3BpbyA9IEtMX0dQSU9fVEJfRU5BQkxFOwkvKiBkZWZhdWx0IHZhbHVlICovCi0JY3B1ID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgImNwdSIpOwotCWlmIChjcHUgIT0gTlVMTCkgewotCQl0YnByb3AgPSAodTMyICopZ2V0X3Byb3BlcnR5KGNwdSwgInRpbWViYXNlLWVuYWJsZSIsIE5VTEwpOwotCQlpZiAodGJwcm9wKQotCQkJY29yZTk5X3RiX2dwaW8gPSAqdGJwcm9wOwotCQlvZl9ub2RlX3B1dChjcHUpOworCS8qIGkyYyBiYXNlZCBIVyBzeW5jIG9uIHNvbWUgRzVzICovCisJaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJNYWM3LDIiKSB8fAorCSAgICBtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyTWFjNywzIikgfHwKKwkgICAgbWFjaGluZV9pc19jb21wYXRpYmxlKCJSYWNrTWFjMywxIikpCisJCXNtcF9jb3JlOTlfc2V0dXBfaTJjX2h3c3luYyhuY3B1cyk7CisKKwkvKiBwZnVuYyBiYXNlZCBIVyBzeW5jIG9uIHJlY2VudCBHNXMgKi8KKwlpZiAocG1hY190Yl9mcmVlemUgPT0gTlVMTCkgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdXMgPQorCQkJb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9jcHVzIik7CisJCWlmIChjcHVzICYmCisJCSAgICBnZXRfcHJvcGVydHkoY3B1cywgInBsYXRmb3JtLWNwdS10aW1lYmFzZSIsIE5VTEwpKSB7CisJCQlwbWFjX3RiX2ZyZWV6ZSA9IHNtcF9jb3JlOTlfcGZ1bmNfdGJfZnJlZXplOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiUHJvY2Vzc29yIHRpbWViYXNlIHN5bmMgdXNpbmciCisJCQkgICAgICAgIiBwbGF0Zm9ybSBmdW5jdGlvblxuIik7CisJCX0KIAl9CiAKLQkvKiBYWFggc2hvdWxkIGdldCB0aGlzIGZyb20gcmVnIHByb3BlcnRpZXMgKi8KLQlmb3IgKGkgPSAxOyBpIDwgbmNwdXM7ICsraSkKLQkJc21wX2h3X2luZGV4W2ldID0gaTsKLQlwb3dlcnNhdmVfbmFwID0gMDsKLX0KKyNlbHNlIC8qIENPTkZJR19QUEM2NCAqLworCisJLyogR1BJTyBiYXNlZCBIVyBzeW5jIG9uIHBwYzMyIENvcmU5OSAqLworCWlmIChwbWFjX3RiX2ZyZWV6ZSA9PSBOVUxMICYmICFtYWNoaW5lX2lzX2NvbXBhdGlibGUoIk1hY1JJU0M0IikpIHsKKwkJc3RydWN0IGRldmljZV9ub2RlICpjcHU7CisJCXUzMiAqdGJwcm9wID0gTlVMTDsKKworCQljb3JlOTlfdGJfZ3BpbyA9IEtMX0dQSU9fVEJfRU5BQkxFOwkvKiBkZWZhdWx0IHZhbHVlICovCisJCWNwdSA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJjcHUiKTsKKwkJaWYgKGNwdSAhPSBOVUxMKSB7CisJCQl0YnByb3AgPSAodTMyICopZ2V0X3Byb3BlcnR5KGNwdSwgInRpbWViYXNlLWVuYWJsZSIsCisJCQkJCQkgICAgIE5VTEwpOworCQkJaWYgKHRicHJvcCkKKwkJCQljb3JlOTlfdGJfZ3BpbyA9ICp0YnByb3A7CisJCQlvZl9ub2RlX3B1dChjcHUpOworCQl9CisJCXBtYWNfdGJfZnJlZXplID0gc21wX2NvcmU5OV9ncGlvX3RiX2ZyZWV6ZTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUHJvY2Vzc29yIHRpbWViYXNlIHN5bmMgdXNpbmciCisJCSAgICAgICAiIEdQSU8gMHglMDJ4XG4iLCBjb3JlOTlfdGJfZ3Bpbyk7CisJfQorCisjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCisKKwkvKiBObyB0aW1lYmFzZSBzeW5jLCBmYWxsYmFjayB0byBzb2Z0d2FyZSAqLworCWlmIChwbWFjX3RiX2ZyZWV6ZSA9PSBOVUxMKSB7CisJCXNtcF9vcHMtPmdpdmVfdGltZWJhc2UgPSBzbXBfZ2VuZXJpY19naXZlX3RpbWViYXNlOworCQlzbXBfb3BzLT50YWtlX3RpbWViYXNlID0gc21wX2dlbmVyaWNfdGFrZV90aW1lYmFzZTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUHJvY2Vzc29yIHRpbWViYXNlIHN5bmMgdXNpbmcgc29mdHdhcmVcbiIpOworCX0KKworI2lmbmRlZiBDT05GSUdfUFBDNjQKKwl7CisJCWludCBpOworCisJCS8qIFhYWCBzaG91bGQgZ2V0IHRoaXMgZnJvbSByZWcgcHJvcGVydGllcyAqLworCQlmb3IgKGkgPSAxOyBpIDwgbmNwdXM7ICsraSkKKwkJCXNtcF9od19pbmRleFtpXSA9IGk7CisJfQogI2VuZGlmCiAKKwkvKiAzMiBiaXRzIFNNUCBjYW4ndCBOQVAgKi8KKwlpZiAoIW1hY2hpbmVfaXNfY29tcGF0aWJsZSgiTWFjUklTQzQiKSkKKwkJcG93ZXJzYXZlX25hcCA9IDA7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IHNtcF9jb3JlOTlfcHJvYmUodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdXM7CkBAIC03NDMsOCArNzYyLDE5IEBACiAJaWYgKG5jcHVzIDw9IDEpCiAJCXJldHVybiAxOwogCisJLyogV2UgbmVlZCB0byBwZXJmb3JtIHNvbWUgZWFybHkgaW5pdGlhbGlzYXRpb25zIGJlZm9yZSB3ZSBjYW4gc3RhcnQKKwkgKiBzZXR0aW5nIHVwIFNNUCBhcyB3ZSBhcmUgcnVubmluZyBiZWZvcmUgaW5pdGNhbGxzCisJICovCisJcG1hY19wZnVuY19iYXNlX2luc3RhbGwoKTsKKwlwbWFjX2kyY19pbml0KCk7CisKKwkvKiBTZXR1cCB2YXJpb3VzIGJpdHMgbGlrZSB0aW1lYmFzZSBzeW5jIG1ldGhvZCwgYWJpbGl0eSB0byBuYXAsIC4uLiAqLwogCXNtcF9jb3JlOTlfc2V0dXAobmNwdXMpOworCisJLyogSW5zdGFsbCBJUElzICovCiAJbXBpY19yZXF1ZXN0X2lwaXMoKTsKKworCS8qIENvbGxlY3QgbDJjciBhbmQgbDNjciB2YWx1ZXMgZnJvbSBDUFUgMCAqLwogCWNvcmU5OV9pbml0X2NhY2hlcygwKTsKIAogCXJldHVybiBuY3B1czsKQEAgLTc1MywxNCArNzgzLDE1IEBACiBzdGF0aWMgdm9pZCBfX2RldmluaXQgc21wX2NvcmU5OV9raWNrX2NwdShpbnQgbnIpCiB7CiAJdW5zaWduZWQgaW50IHNhdmVfdmVjdG9yOwotCXVuc2lnbmVkIGxvbmcgbmV3X3ZlY3RvcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBmbGFnczsKIAl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKnZlY3RvcgogCQkgPSAoKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKShLRVJORUxCQVNFKzB4MTAwKSk7CiAKIAlpZiAobnIgPCAwIHx8IG5yID4gMykKIAkJcmV0dXJuOwotCWlmIChwcGNfbWQucHJvZ3Jlc3MpIHBwY19tZC5wcm9ncmVzcygic21wX2NvcmU5OV9raWNrX2NwdSIsIDB4MzQ2KTsKKworCWlmIChwcGNfbWQucHJvZ3Jlc3MpCisJCXBwY19tZC5wcm9ncmVzcygic21wX2NvcmU5OV9raWNrX2NwdSIsIDB4MzQ2KTsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwpAQCAtNzY4LDE0ICs3OTksMTEgQEAKIAkvKiBTYXZlIHJlc2V0IHZlY3RvciAqLwogCXNhdmVfdmVjdG9yID0gKnZlY3RvcjsKIAotCS8qIFNldHVwIGZha2UgcmVzZXQgdmVjdG9yIHRoYXQgZG9lcwkKKwkvKiBTZXR1cCBmYWtlIHJlc2V0IHZlY3RvciB0aGF0IGRvZXMKIAkgKiAgIGIgX19zZWNvbmRhcnlfc3RhcnRfcG1hY18wICsgbnIqOCAtIEtFUk5FTEJBU0UKIAkgKi8KLQluZXdfdmVjdG9yID0gKHVuc2lnbmVkIGxvbmcpIF9fc2Vjb25kYXJ5X3N0YXJ0X3BtYWNfMCArIG5yICogODsKLQkqdmVjdG9yID0gMHg0ODAwMDAwMiArIG5ld192ZWN0b3IgLSBLRVJORUxCQVNFOwotCi0JLyogZmx1c2ggZGF0YSBjYWNoZSBhbmQgaW52YWwgaW5zdHJ1Y3Rpb24gY2FjaGUgKi8KLQlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpIHZlY3RvciwgKHVuc2lnbmVkIGxvbmcpIHZlY3RvciArIDQpOworCXRhcmdldCA9ICh1bnNpZ25lZCBsb25nKSBfX3NlY29uZGFyeV9zdGFydF9wbWFjXzAgKyBuciAqIDg7CisJY3JlYXRlX2JyYW5jaCgodW5zaWduZWQgbG9uZyl2ZWN0b3IsIHRhcmdldCwgQlJBTkNIX1NFVF9MSU5LKTsKIAogCS8qIFB1dCBzb21lIGxpZmUgaW4gb3VyIGZyaWVuZCAqLwogCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1JFU0VUX0NQVSwgTlVMTCwgbnIsIDApOwpAQCAtODA1LDE3ICs4MzMsMjUgQEAKIAltcGljX3NldHVwX3RoaXNfY3B1KCk7CiAKIAlpZiAoY3B1X25yID09IDApIHsKLSNpZmRlZiBDT05GSUdfUE9XRVI0CisjaWZkZWYgQ09ORklHX1BQQzY0CiAJCWV4dGVybiB2b2lkIGc1X3BoeV9kaXNhYmxlX2NwdTEodm9pZCk7CiAKKwkJLyogQ2xvc2UgaTJjIGJ1cyBpZiBpdCB3YXMgdXNlZCBmb3IgdGIgc3luYyAqLworCQlpZiAocG1hY190Yl9jbG9ja19jaGlwX2hvc3QpIHsKKwkJCXBtYWNfaTJjX2Nsb3NlKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0KTsKKwkJCXBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0CT0gTlVMTDsKKwkJfQorCiAJCS8qIElmIHdlIGRpZG4ndCBzdGFydCB0aGUgc2Vjb25kIENQVSwgd2UgbXVzdCB0YWtlCiAJCSAqIGl0IG9mZiB0aGUgYnVzCiAJCSAqLwogCQlpZiAobWFjaGluZV9pc19jb21wYXRpYmxlKCJNYWNSSVNDNCIpICYmCiAJCSAgICBudW1fb25saW5lX2NwdXMoKSA8IDIpCQkKIAkJCWc1X3BoeV9kaXNhYmxlX2NwdTEoKTsKLSNlbmRpZiAvKiBDT05GSUdfUE9XRVI0ICovCi0JCWlmIChwcGNfbWQucHJvZ3Jlc3MpIHBwY19tZC5wcm9ncmVzcygiY29yZTk5X3NldHVwX2NwdSAwIGRvbmUiLCAweDM0OSk7CisjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCisKKwkJaWYgKHBwY19tZC5wcm9ncmVzcykKKwkJCXBwY19tZC5wcm9ncmVzcygiY29yZTk5X3NldHVwX2NwdSAwIGRvbmUiLCAweDM0OSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3RpbWUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvdGltZS5jCmluZGV4IGZlYjBhOTQuLjVkOWFmYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvdGltZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvdGltZS5jCkBAIC0yNTgsMTUgKzI1OCwyMCBAQAogCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19pb21lbSAqdmlhOwogCWludCBjb3VudCA9IFZJQV9USU1FUl9GUkVRXzYgLyAxMDA7CiAJdW5zaWduZWQgaW50IGRzdGFydCwgZGVuZDsKKwlzdHJ1Y3QgcmVzb3VyY2UgcnNyYzsKIAotCXZpYXMgPSBmaW5kX2RldmljZXMoInZpYS1jdWRhIik7CisJdmlhcyA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJ2aWEtY3VkYSIpOwogCWlmICh2aWFzID09IDApCi0JCXZpYXMgPSBmaW5kX2RldmljZXMoInZpYS1wbXUiKTsKKwkJdmlhcyA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJ2aWEtcG11Iik7CiAJaWYgKHZpYXMgPT0gMCkKLQkJdmlhcyA9IGZpbmRfZGV2aWNlcygidmlhIik7Ci0JaWYgKHZpYXMgPT0gMCB8fCB2aWFzLT5uX2FkZHJzID09IDApCisJCXZpYXMgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAidmlhIik7CisJaWYgKHZpYXMgPT0gMCB8fCBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKHZpYXMsIDAsICZyc3JjKSkKIAkJcmV0dXJuIDA7Ci0JdmlhID0gaW9yZW1hcCh2aWFzLT5hZGRyc1swXS5hZGRyZXNzLCB2aWFzLT5hZGRyc1swXS5zaXplKTsKKwl2aWEgPSBpb3JlbWFwKHJzcmMuc3RhcnQsIHJzcmMuZW5kIC0gcnNyYy5zdGFydCArIDEpOworCWlmICh2aWEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBtYXAgVklBIGZvciB0aW1lciBjYWxpYnJhdGlvbiAhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQogCiAJLyogc2V0IHRpbWVyIDEgZm9yIGNvbnRpbnVvdXMgaW50ZXJydXB0cyAqLwogCW91dF84KCZ2aWFbQUNSXSwgKHZpYVtBQ1JdICYgflQxTU9ERSkgfCBUMU1PREVfQ09OVCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3VkYmdfYWRiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3VkYmdfYWRiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjODI2NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvdWRiZ19hZGIuYwpAQCAtMCwwICsxLDIyMSBAQAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvYWRiLmg+CisjaW5jbHVkZSA8bGludXgvcG11Lmg+CisjaW5jbHVkZSA8bGludXgvY3VkYS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20veG1vbi5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL2Jvb3R4Lmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vcG1hY19mZWF0dXJlLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9idGV4dC5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL3VkYmcuaD4KKworLyoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgInNwZWNpYWwiLCBpdCBjYW4gInBhdGNoIiB0aGUgY3VycmVudAorICogdWRiZyBpbXBsZW1lbnRhdGlvbiBhbmQgd29yayBvbiB0b3Agb2YgaXQuIEl0IG11c3QgdGh1cyBiZQorICogaW5pdGlhbGl6ZWQgbGFzdAorICovCisKK3N0YXRpYyB2b2lkICgqdWRiZ19hZGJfb2xkX3B1dGMpKGNoYXIgYyk7CitzdGF0aWMgaW50ICgqdWRiZ19hZGJfb2xkX2dldGMpKHZvaWQpOworc3RhdGljIGludCAoKnVkYmdfYWRiX29sZF9nZXRjX3BvbGwpKHZvaWQpOworCitzdGF0aWMgZW51bSB7CisJaW5wdXRfYWRiX25vbmUsCisJaW5wdXRfYWRiX3BtdSwKKwlpbnB1dF9hZGJfY3VkYSwKK30gaW5wdXRfdHlwZSA9IGlucHV0X2FkYl9ub25lOworCitpbnQgeG1vbl93YW50c19rZXksIHhtb25fYWRiX2tleWNvZGU7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1ZGJnX2FkYl9wb2xsKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0FEQl9QTVUKKwlpZiAoaW5wdXRfdHlwZSA9PSBpbnB1dF9hZGJfcG11KQorCQlwbXVfcG9sbF9hZGIoKTsKKyNlbmRpZiAvKiBDT05GSUdfQURCX1BNVSAqLworI2lmZGVmIENPTkZJR19BREJfQ1VEQQorCWlmIChpbnB1dF90eXBlID09IGlucHV0X2FkYl9jdWRhKQorCQljdWRhX3BvbGwoKTsKKyNlbmRpZiAvKiBDT05GSUdfQURCX0NVREEgKi8KK30KKworI2lmZGVmIENPTkZJR19CT09UWF9URVhUCisKK3N0YXRpYyBpbnQgdWRiZ19hZGJfdXNlX2J0ZXh0Oworc3RhdGljIGludCB4bW9uX2FkYl9zaGlmdHN0YXRlOworCitzdGF0aWMgdW5zaWduZWQgY2hhciB4bW9uX2tleXRhYlsxMjhdID0KKwkiYXNkZmhnenhjdlwwMDBicXdlciIJCQkJLyogMHgwMCAtIDB4MGYgKi8KKwkieXQxMjM0NjU9OTctODBdbyIJCQkJLyogMHgxMCAtIDB4MWYgKi8KKwkidVtpcFxybGonaztcXCwvbm0uIgkJCQkvKiAweDIwIC0gMHgyZiAqLworCSJcdCBgXDE3N1wwXDAzM1wwXDBcMFwwXDBcMFwwXDBcMFwwIgkJLyogMHgzMCAtIDB4M2YgKi8KKwkiXDAuXDAqXDArXDBcMFwwXDBcMC9cclwwLVwwIgkJCS8qIDB4NDAgLSAweDRmICovCisJIlwwXDAwMDAxMjM0NTY3ODlcMFwwXDAiOwkJCS8qIDB4NTAgLSAweDVmICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHhtb25fc2hpZnRfa2V5dGFiWzEyOF0gPQorCSJBU0RGSEdaWENWXDAwMEJRV0VSIgkJCQkvKiAweDAwIC0gMHgwZiAqLworCSJZVCFAIyReJSsoJl8qKX1PIgkJCQkvKiAweDEwIC0gMHgxZiAqLworCSJVe0lQXHJMSlwiSzp8PD9OTT4iCQkJCS8qIDB4MjAgLSAweDJmICovCisJIlx0IH5cMTc3XDBcMDMzXDBcMFwwXDBcMFwwXDBcMFwwXDAiCQkvKiAweDMwIC0gMHgzZiAqLworCSJcMC5cMCpcMCtcMFwwXDBcMFwwL1xyXDAtXDAiCQkJLyogMHg0MCAtIDB4NGYgKi8KKwkiXDBcMDAwMDEyMzQ1Njc4OVwwXDBcMCI7CQkJLyogMHg1MCAtIDB4NWYgKi8KKworc3RhdGljIGludCB1ZGJnX2FkYl9sb2NhbF9nZXRjKHZvaWQpCit7CisJaW50IGssIHQsIG9uOworCisJeG1vbl93YW50c19rZXkgPSAxOworCWZvciAoOzspIHsKKwkJeG1vbl9hZGJfa2V5Y29kZSA9IC0xOworCQl0ID0gMDsKKwkJb24gPSAwOworCQlrID0gLTE7CisJCWRvIHsKKwkJCWlmICgtLXQgPCAwKSB7CisJCQkJb24gPSAxIC0gb247CisJCQkJYnRleHRfZHJhd2NoYXIob24/IDB4ZGI6IDB4MjApOworCQkJCWJ0ZXh0X2RyYXdjaGFyKCdcYicpOworCQkJCXQgPSAyMDAwMDA7CisJCQl9CisJCQl1ZGJnX2FkYl9wb2xsKCk7CisJCQlpZiAodWRiZ19hZGJfb2xkX2dldGNfcG9sbCkKKwkJCQlrID0gdWRiZ19hZGJfb2xkX2dldGNfcG9sbCgpOworCQl9IHdoaWxlIChrID09IC0xICYmIHhtb25fYWRiX2tleWNvZGUgPT0gLTEpOworCQlpZiAob24pCisJCQlidGV4dF9kcmF3c3RyaW5nKCIgXGIiKTsKKwkJaWYgKGsgIT0gLTEpCisJCQlyZXR1cm4gazsKKwkJayA9IHhtb25fYWRiX2tleWNvZGU7CisKKwkJLyogdGVzdCBmb3Igc2hpZnQga2V5cyAqLworCQlpZiAoKGsgJiAweDdmKSA9PSAweDM4IHx8IChrICYgMHg3ZikgPT0gMHg3YikgeworCQkJeG1vbl9hZGJfc2hpZnRzdGF0ZSA9IChrICYgMHg4MCkgPT0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChrID49IDB4ODApCisJCQljb250aW51ZTsJLyogaWdub3JlIHVwIHRyYW5zaXRpb25zICovCisJCWsgPSAoeG1vbl9hZGJfc2hpZnRzdGF0ZT8geG1vbl9zaGlmdF9rZXl0YWI6IHhtb25fa2V5dGFiKVtrXTsKKwkJaWYgKGsgIT0gMCkKKwkJCWJyZWFrOworCX0KKwl4bW9uX3dhbnRzX2tleSA9IDA7CisJcmV0dXJuIGs7Cit9CisjZW5kaWYgLyogQ09ORklHX0JPT1RYX1RFWFQgKi8KKworc3RhdGljIGludCB1ZGJnX2FkYl9nZXRjKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0JPT1RYX1RFWFQKKwlpZiAodWRiZ19hZGJfdXNlX2J0ZXh0ICYmIGlucHV0X3R5cGUgIT0gaW5wdXRfYWRiX25vbmUpCisJCXJldHVybiB1ZGJnX2FkYl9sb2NhbF9nZXRjKCk7CisjZW5kaWYKKwlpZiAodWRiZ19hZGJfb2xkX2dldGMpCisJCXJldHVybiB1ZGJnX2FkYl9vbGRfZ2V0YygpOworCXJldHVybiAtMTsKK30KKworLyogZ2V0Y19wb2xsKCkgaXMgbm90IHJlYWxseSB1c2VkLCB1bmxlc3MgeW91IGhhdmUgdGhlIHhtb24tb3ZlciBtb2RlbQorICogaGFjayB0aGF0IGRvZXNuJ3QgcXVpdGUgY29uY2VybiB1cyBoZXJlLCB0aHVzIHdlIGp1c3QgcG9sbCB0aGUgbG93IGxldmVsCisgKiBBREIgZHJpdmVyIHRvIHByZXZlbnQgaXQgZnJvbSB0aW1pbmcgb3V0IGFuZCBjYWxsIGJhY2sgdGhlIG9yaWdpbmFsIHBvbGwKKyAqIHJvdXRpbmUuCisgKi8KK3N0YXRpYyBpbnQgdWRiZ19hZGJfZ2V0Y19wb2xsKHZvaWQpCit7CisJdWRiZ19hZGJfcG9sbCgpOworCisJaWYgKHVkYmdfYWRiX29sZF9nZXRjX3BvbGwpCisJCXJldHVybiB1ZGJnX2FkYl9vbGRfZ2V0Y19wb2xsKCk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCB1ZGJnX2FkYl9wdXRjKGNoYXIgYykKK3sKKyNpZmRlZiBDT05GSUdfQk9PVFhfVEVYVAorCWlmICh1ZGJnX2FkYl91c2VfYnRleHQpCisJCWJ0ZXh0X2RyYXdjaGFyKGMpOworI2VuZGlmCisJaWYgKHVkYmdfYWRiX29sZF9wdXRjKQorCQlyZXR1cm4gdWRiZ19hZGJfb2xkX3B1dGMoYyk7Cit9CisKK3ZvaWQgdWRiZ19hZGJfaW5pdF9lYXJseSh2b2lkKQoreworI2lmZGVmIENPTkZJR19CT09UWF9URVhUCisJaWYgKGJ0ZXh0X2ZpbmRfZGlzcGxheSgxKSA9PSAwKSB7CisJCXVkYmdfYWRiX3VzZV9idGV4dCA9IDE7CisJCXVkYmdfcHV0YyA9IHVkYmdfYWRiX3B1dGM7CisJfQorI2VuZGlmCit9CisKK2ludCB1ZGJnX2FkYl9pbml0KGludCBmb3JjZV9idGV4dCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJLyogQ2FwdHVyZSBleGlzdGluZyBjYWxsYmFja3MgKi8KKwl1ZGJnX2FkYl9vbGRfcHV0YyA9IHVkYmdfcHV0YzsKKwl1ZGJnX2FkYl9vbGRfZ2V0YyA9IHVkYmdfZ2V0YzsKKwl1ZGJnX2FkYl9vbGRfZ2V0Y19wb2xsID0gdWRiZ19nZXRjX3BvbGw7CisKKwkvKiBDaGVjayBpZiBvdXIgZWFybHkgaW5pdCB3YXMgYWxyZWFkeSBjYWxsZWQgKi8KKwlpZiAodWRiZ19hZGJfb2xkX3B1dGMgPT0gdWRiZ19hZGJfcHV0YykKKwkJdWRiZ19hZGJfb2xkX3B1dGMgPSBOVUxMOworI2lmZGVmIENPTkZJR19CT09UWF9URVhUCisJaWYgKHVkYmdfYWRiX29sZF9wdXRjID09IGJ0ZXh0X2RyYXdjaGFyKQorCQl1ZGJnX2FkYl9vbGRfcHV0YyA9IE5VTEw7CisjZW5kaWYKKworCS8qIFNldCBvdXJzIGFzIG91dHB1dCAqLworCXVkYmdfcHV0YyA9IHVkYmdfYWRiX3B1dGM7CisJdWRiZ19nZXRjID0gdWRiZ19hZGJfZ2V0YzsKKwl1ZGJnX2dldGNfcG9sbCA9IHVkYmdfYWRiX2dldGNfcG9sbDsKKworI2lmZGVmIENPTkZJR19CT09UWF9URVhUCisJLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIHVzZSBidGV4dCBvdXRwdXQgKi8KKwlpZiAoYnRleHRfZmluZF9kaXNwbGF5KGZvcmNlX2J0ZXh0KSA9PSAwKQorCQl1ZGJnX2FkYl91c2VfYnRleHQgPSAxOworI2VuZGlmCisKKwkvKiBTZWUgaWYgdGhlcmUgaXMgYSBrZXlib2FyZCBpbiB0aGUgZGV2aWNlIHRyZWUgd2l0aCBhIHBhcmVudAorCSAqIG9mIHR5cGUgImFkYiIuIElmIG5vdCwgd2UgcmV0dXJuIGEgZmFpbHVyZSwgYnV0IHdlIGtlZXAgdGhlCisJICogYmV4dCBvdXRwdXQgc2V0IGZvciBub3cKKwkgKi8KKwlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUobnAsICJrZXlib2FyZCIpKSAhPSBOVUxMOykgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCA9IG9mX2dldF9wYXJlbnQobnApOworCQlpbnQgZm91bmQgPSAocGFyZW50ICYmIHN0cmNtcChwYXJlbnQtPnR5cGUsICJhZGIiKSA9PSAwKTsKKwkJb2Zfbm9kZV9wdXQocGFyZW50KTsKKwkJaWYgKGZvdW5kKQorCQkJYnJlYWs7CisJfQorCWlmIChucCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlvZl9ub2RlX3B1dChucCk7CisKKyNpZmRlZiBDT05GSUdfQURCX1BNVQorCWlmIChmaW5kX3ZpYV9wbXUoKSkKKwkJaW5wdXRfdHlwZSA9IGlucHV0X2FkYl9wbXU7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQURCX0NVREEKKwlpZiAoZmluZF92aWFfY3VkYSgpKQorCQlpbnB1dF90eXBlID0gaW5wdXRfYWRiX2N1ZGE7CisjZW5kaWYKKworCS8qIFNhbWUgYXMgYWJvdmU6IG5vdGhpbmcgZm91bmQsIGtlZXAgYnRleHQgc2V0IGZvciBvdXRwdXQgKi8KKwlpZiAoaW5wdXRfdHlwZSA9PSBpbnB1dF9hZGJfbm9uZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvdWRiZ19zY2MuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvdWRiZ19zY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDM1MmE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy91ZGJnX3NjYy5jCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogdWRiZyBmb3IgZm9yIHppbG9nIHNjYyBwb3J0cyBhcyBmb3VuZCBvbiBBcHBsZSBQb3dlck1hY3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBQUEMgNjQgVGVhbSwgSUJNIENvcnAKKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgorCitleHRlcm4gdTggcmVhbF9yZWFkYih2b2xhdGlsZSB1OCBfX2lvbWVtICAqYWRkcik7CitleHRlcm4gdm9pZCByZWFsX3dyaXRlYih1OCBkYXRhLCB2b2xhdGlsZSB1OCBfX2lvbWVtICphZGRyKTsKKworI2RlZmluZQlTQ0NfVFhSRFkJNAorI2RlZmluZSBTQ0NfUlhSRFkJMQorCitzdGF0aWMgdm9sYXRpbGUgdTggX19pb21lbSAqc2NjYzsKK3N0YXRpYyB2b2xhdGlsZSB1OCBfX2lvbWVtICpzY2NkOworCitzdGF0aWMgdm9pZCB1ZGJnX3NjY19wdXRjKGNoYXIgYykKK3sKKwlpZiAoc2NjYykgeworCQl3aGlsZSAoKGluXzgoc2NjYykgJiBTQ0NfVFhSRFkpID09IDApCisJCQk7CisJCW91dF84KHNjY2QsICBjKTsKKwkJaWYgKGMgPT0gJ1xuJykKKwkJCXVkYmdfc2NjX3B1dGMoJ1xyJyk7CisJfQorfQorCitzdGF0aWMgaW50IHVkYmdfc2NjX2dldGNfcG9sbCh2b2lkKQoreworCWlmIChzY2NjKSB7CisJCWlmICgoaW5fOChzY2NjKSAmIFNDQ19SWFJEWSkgIT0gMCkKKwkJCXJldHVybiBpbl84KHNjY2QpOworCQllbHNlCisJCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCB1ZGJnX3NjY19nZXRjKHZvaWQpCit7CisJaWYgKHNjY2MpIHsKKwkJd2hpbGUgKChpbl84KHNjY2MpICYgU0NDX1JYUkRZKSA9PSAwKQorCQkJOworCQlyZXR1cm4gaW5fOChzY2NkKTsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBzY2NfaW5pdHRhYltdID0geworICAgIDEzLCAwLAkJLyogc2V0IGJhdWQgcmF0ZSBkaXZpc29yICovCisgICAgMTIsIDAsCisgICAgMTQsIDEsCQkvKiBiYXVkIHJhdGUgZ2VuIGVuYWJsZSwgc3JjPXJ0eGMgKi8KKyAgICAxMSwgMHg1MCwJCS8qIGNsb2NrcyA9IGJyIGdlbiAqLworICAgIDUsICAweGVhLAkJLyogdHggOCBiaXRzLCBhc3NlcnQgRFRSICYgUlRTICovCisgICAgNCwgIDB4NDYsCQkvKiB4MTYgY2xvY2ssIDEgc3RvcCAqLworICAgIDMsICAweGMxLAkJLyogcnggZW5hYmxlLCA4IGJpdHMgKi8KK307CisKK3ZvaWQgdWRiZ19zY2NfaW5pdChpbnQgZm9yY2Vfc2NjKQoreworCXUzMiAqcmVnOworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnN0ZG91dCA9IE5VTEwsICplc2NjID0gTlVMTCwgKm1hY2lvID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoLCAqY2hfZGVmID0gTlVMTCwgKmNoX2EgPSBOVUxMOworCWNoYXIgKnBhdGg7CisJaW50IGksIHg7CisKKwllc2NjID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImVzY2MiKTsKKwlpZiAoZXNjYyA9PSBOVUxMKQorCQlnb3RvIGJhaWw7CisJbWFjaW8gPSBvZl9nZXRfcGFyZW50KGVzY2MpOworCWlmIChtYWNpbyA9PSBOVUxMKQorCQlnb3RvIGJhaWw7CisJcGF0aCA9IChjaGFyICopZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LHN0ZG91dC1wYXRoIiwgTlVMTCk7CisJaWYgKHBhdGggIT0gTlVMTCkKKwkJc3Rkb3V0ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgocGF0aCk7CisJZm9yIChjaCA9IE5VTEw7IChjaCA9IG9mX2dldF9uZXh0X2NoaWxkKGVzY2MsIGNoKSkgIT0gTlVMTDspIHsKKwkJaWYgKGNoID09IHN0ZG91dCkKKwkJCWNoX2RlZiA9IG9mX25vZGVfZ2V0KGNoKTsKKwkJaWYgKHN0cmNtcChjaC0+bmFtZSwgImNoLWEiKSA9PSAwKQorCQkJY2hfYSA9IG9mX25vZGVfZ2V0KGNoKTsKKwl9CisJaWYgKGNoX2RlZiA9PSBOVUxMICYmICFmb3JjZV9zY2MpCisJCWdvdG8gYmFpbDsKKworCWNoID0gY2hfZGVmID8gY2hfZGVmIDogY2hfYTsKKworCS8qIEdldCBhZGRyZXNzIHdpdGhpbiBtYWMtaW8gQVNJQyAqLworCXJlZyA9ICh1MzIgKilnZXRfcHJvcGVydHkoZXNjYywgInJlZyIsIE5VTEwpOworCWlmIChyZWcgPT0gTlVMTCkKKwkJZ290byBiYWlsOworCWFkZHIgPSByZWdbMF07CisKKwkvKiBHZXQgYWRkcmVzcyBvZiBtYWMtaW8gUENJIGl0c2VsZiAqLworCXJlZyA9ICh1MzIgKilnZXRfcHJvcGVydHkobWFjaW8sICJhc3NpZ25lZC1hZGRyZXNzZXMiLCBOVUxMKTsKKwlpZiAocmVnID09IE5VTEwpCisJCWdvdG8gYmFpbDsKKwlhZGRyICs9IHJlZ1syXTsKKworCS8qIExvY2sgdGhlIHNlcmlhbCBwb3J0ICovCisJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfU0NDX0VOQUJMRSwgY2gsCisJCQkgIFBNQUNfU0NDX0FTWU5DIHwgUE1BQ19TQ0NfRkxBR19YTU9OLCAxKTsKKworCisJLyogU2V0dXAgZm9yIDU3NjAwIDhOMSAqLworCWlmIChjaCA9PSBjaF9hKQorCQlhZGRyICs9IDB4MjA7CisJc2NjYyA9ICh2b2xhdGlsZSB1OCAqIF9faW9tZW0pIGlvcmVtYXAoYWRkciAmIFBBR0VfTUFTSywgUEFHRV9TSVpFKSA7CisJc2NjYyArPSBhZGRyICYgflBBR0VfTUFTSzsKKwlzY2NkID0gc2NjYyArIDB4MTA7CisKKwltYigpOworCisJZm9yIChpID0gMjAwMDA7IGkgIT0gMDsgLS1pKQorCQl4ID0gaW5fOChzY2NjKTsKKwlvdXRfOChzY2NjLCAweDA5KTsJCS8qIHJlc2V0IEEgb3IgQiBzaWRlICovCisJb3V0Xzgoc2NjYywgMHhjMCk7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzY2NfaW5pdHRhYik7ICsraSkKKwkJb3V0Xzgoc2NjYywgc2NjX2luaXR0YWJbaV0pOworCisJdWRiZ19wdXRjID0gdWRiZ19zY2NfcHV0YzsKKwl1ZGJnX2dldGMgPSB1ZGJnX3NjY19nZXRjOworCXVkYmdfZ2V0Y19wb2xsID0gdWRiZ19zY2NfZ2V0Y19wb2xsOworCisJdWRiZ19wdXRzKCJIZWxsbyBXb3JsZCAhXG4iKTsKKworIGJhaWw6CisJb2Zfbm9kZV9wdXQobWFjaW8pOworCW9mX25vZGVfcHV0KGVzY2MpOworCW9mX25vZGVfcHV0KHN0ZG91dCk7CisJb2Zfbm9kZV9wdXQoY2hfZGVmKTsKKwlvZl9ub2RlX3B1dChjaF9hKTsKK30KKworI2lmZGVmIENPTkZJR19QUEM2NAorc3RhdGljIHZvaWQgdWRiZ19yZWFsX3NjY19wdXRjKGNoYXIgYykKK3sKKwl3aGlsZSAoKHJlYWxfcmVhZGIoc2NjYykgJiBTQ0NfVFhSRFkpID09IDApCisJCTsKKwlyZWFsX3dyaXRlYihjLCBzY2NkKTsKKwlpZiAoYyA9PSAnXG4nKQorCQl1ZGJnX3JlYWxfc2NjX3B1dGMoJ1xyJyk7Cit9CisKK3ZvaWQgX19pbml0IHVkYmdfaW5pdF9wbWFjX3JlYWxtb2RlKHZvaWQpCit7CisJc2NjYyA9ICh2b2xhdGlsZSB1OCBfX2lvbWVtICopMHg4MDAxMzAyMHVsOworCXNjY2QgPSAodm9sYXRpbGUgdTggX19pb21lbSAqKTB4ODAwMTMwMzB1bDsKKworCXVkYmdfcHV0YyA9IHVkYmdfcmVhbF9zY2NfcHV0YzsKKwl1ZGJnX2dldGMgPSBOVUxMOworCXVkYmdfZ2V0Y19wb2xsID0gTlVMTDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZQppbmRleCAwNmQ1ZWY1Li42MTYxNmQxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlCkBAIC0xLDEwICsxLDEwIEBACiBvYmoteQkJCTo9IHBjaS5vIGxwYXIubyBodkNhbGwubyBudnJhbS5vIHJlY29uZmlnLm8gXAotCQkJICAgc2V0dXAubyBpb21tdS5vIHJhcy5vIHJ0YXNkLm8KKwkJCSAgIHNldHVwLm8gaW9tbXUubyByYXMubyBydGFzZC5vIHBjaV9kbHBhci5vCiBvYmotJChDT05GSUdfU01QKQkrPSBzbXAubwogb2JqLSQoQ09ORklHX0lCTVZJTykJKz0gdmlvLm8KIG9iai0kKENPTkZJR19YSUNTKQkrPSB4aWNzLm8KIG9iai0kKENPTkZJR19TQ0FOTE9HKQkrPSBzY2FubG9nLm8KLW9iai0kKENPTkZJR19FRUgpCSs9IGVlaC5vIGVlaF9ldmVudC5vCitvYmotJChDT05GSUdfRUVIKQkrPSBlZWgubyBlZWhfY2FjaGUubyBlZWhfZHJpdmVyLm8gZWVoX2V2ZW50Lm8KIAogb2JqLSQoQ09ORklHX0hWQ19DT05TT0xFKQkrPSBodmNvbnNvbGUubwogb2JqLSQoQ09ORklHX0hWQ1MpCQkrPSBodmNzZXJ2ZXIubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaC5jCmluZGV4IGM4ZDJhNDAuLjgzNTc4MzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWguYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoLmMKQEAgLTc2LDE1ICs3NiwxNCBAQAogICovCiAjZGVmaW5lIEVFSF9NQVhfRkFJTFMJMTAwMDAwCiAKLS8qIE1pc2MgZm9yd2FyZCBkZWNsYXJhaW9ucyAqLwotc3RhdGljIHZvaWQgZWVoX3NhdmVfYmFycyhzdHJ1Y3QgcGNpX2RldiAqIHBkZXYsIHN0cnVjdCBwY2lfZG4gKnBkbik7Ci0KIC8qIFJUQVMgdG9rZW5zICovCiBzdGF0aWMgaW50IGlibV9zZXRfZWVoX29wdGlvbjsKIHN0YXRpYyBpbnQgaWJtX3NldF9zbG90X3Jlc2V0Owogc3RhdGljIGludCBpYm1fcmVhZF9zbG90X3Jlc2V0X3N0YXRlOwogc3RhdGljIGludCBpYm1fcmVhZF9zbG90X3Jlc2V0X3N0YXRlMjsKIHN0YXRpYyBpbnQgaWJtX3Nsb3RfZXJyb3JfZGV0YWlsOworc3RhdGljIGludCBpYm1fZ2V0X2NvbmZpZ19hZGRyX2luZm87CitzdGF0aWMgaW50IGlibV9jb25maWd1cmVfYnJpZGdlOwogCiBpbnQgZWVoX3N1YnN5c3RlbV9lbmFibGVkOwogRVhQT1JUX1NZTUJPTChlZWhfc3Vic3lzdGVtX2VuYWJsZWQpOwpAQCAtOTgsMzA4ICs5NywyMyBAQAogc3RhdGljIGludCBlZWhfZXJyb3JfYnVmX3NpemU7CiAKIC8qIFN5c3RlbSBtb25pdG9yaW5nIHN0YXRpc3RpY3MgKi8KLXN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBub19kZXZpY2UpOwotc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIG5vX2RuKTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBub19jZmdfYWRkcik7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgaWdub3JlZF9jaGVjayk7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgdG90YWxfbW1pb19mZnMpOwotc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIGZhbHNlX3Bvc2l0aXZlcyk7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgaWdub3JlZF9mYWlsdXJlcyk7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgc2xvdF9yZXNldHMpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbm9fZGV2aWNlOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbm9fZG47CitzdGF0aWMgdW5zaWduZWQgbG9uZyBub19jZmdfYWRkcjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlnbm9yZWRfY2hlY2s7CitzdGF0aWMgdW5zaWduZWQgbG9uZyB0b3RhbF9tbWlvX2ZmczsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZhbHNlX3Bvc2l0aXZlczsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlnbm9yZWRfZmFpbHVyZXM7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBzbG90X3Jlc2V0czsKIAotLyoqCi0gKiBUaGUgcGNpIGFkZHJlc3MgY2FjaGUgc3Vic3lzdGVtLiAgVGhpcyBzdWJzeXN0ZW0gcGxhY2VzCi0gKiBQQ0kgZGV2aWNlIGFkZHJlc3MgcmVzb3VyY2VzIGludG8gYSByZWQtYmxhY2sgdHJlZSwgc29ydGVkCi0gKiBhY2NvcmRpbmcgdG8gdGhlIGFkZHJlc3MgcmFuZ2UsIHNvIHRoYXQgZ2l2ZW4gb25seSBhbiBpL28KLSAqIGFkZHJlc3MsIHRoZSBjb3JyZXNwb25kaW5nIFBDSSBkZXZpY2UgY2FuIGJlICoqcXVpY2tseSoqCi0gKiBmb3VuZC4gSXQgaXMgc2FmZSB0byBwZXJmb3JtIGFuIGFkZHJlc3MgbG9va3VwIGluIGFuIGludGVycnVwdAotICogY29udGV4dDsgdGhpcyBhYmlsaXR5IGlzIGFuIGltcG9ydGFudCBmZWF0dXJlLgotICoKLSAqIEN1cnJlbnRseSwgdGhlIG9ubHkgY3VzdG9tZXIgb2YgdGhpcyBjb2RlIGlzIHRoZSBFRUggc3Vic3lzdGVtOwotICogdGh1cywgdGhpcyBjb2RlIGhhcyBiZWVuIHNvbWV3aGF0IHRhaWxvcmVkIHRvIHN1aXQgRUVIIGJldHRlci4KLSAqIEluIHBhcnRpY3VsYXIsIHRoZSBjYWNoZSBkb2VzICpub3QqIGhvbGQgdGhlIGFkZHJlc3NlcyBvZiBkZXZpY2VzCi0gKiBmb3Igd2hpY2ggRUVIIGlzIG5vdCBlbmFibGVkLgotICoKLSAqIChJbXBsZW1lbnRhdGlvbiBOb3RlOiBUaGUgUkIgdHJlZSBzZWVtcyB0byBiZSBiZXR0ZXIvZmFzdGVyCi0gKiB0aGFuIGFueSBoYXNoIGFsZ28gSSBjb3VsZCB0aGluayBvZiBmb3IgdGhpcyBwcm9ibGVtLCBldmVuCi0gKiB3aXRoIHRoZSBwZW5hbHR5IG9mIHNsb3cgcG9pbnRlciBjaGFzZXMgZm9yIGQtY2FjaGUgbWlzc2VzKS4KLSAqLwotc3RydWN0IHBjaV9pb19hZGRyX3JhbmdlCi17Ci0Jc3RydWN0IHJiX25vZGUgcmJfbm9kZTsKLQl1bnNpZ25lZCBsb25nIGFkZHJfbG87Ci0JdW5zaWduZWQgbG9uZyBhZGRyX2hpOwotCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7Ci0JdW5zaWduZWQgaW50IGZsYWdzOwotfTsKLQotc3RhdGljIHN0cnVjdCBwY2lfaW9fYWRkcl9jYWNoZQotewotCXN0cnVjdCByYl9yb290IHJiX3Jvb3Q7Ci0Jc3BpbmxvY2tfdCBwaWFyX2xvY2s7Ci19IHBjaV9pb19hZGRyX2NhY2hlX3Jvb3Q7Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHBjaV9kZXYgKl9fcGNpX2dldF9kZXZpY2VfYnlfYWRkcih1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0Jc3RydWN0IHJiX25vZGUgKm4gPSBwY2lfaW9fYWRkcl9jYWNoZV9yb290LnJiX3Jvb3QucmJfbm9kZTsKLQotCXdoaWxlIChuKSB7Ci0JCXN0cnVjdCBwY2lfaW9fYWRkcl9yYW5nZSAqcGlhcjsKLQkJcGlhciA9IHJiX2VudHJ5KG4sIHN0cnVjdCBwY2lfaW9fYWRkcl9yYW5nZSwgcmJfbm9kZSk7Ci0KLQkJaWYgKGFkZHIgPCBwaWFyLT5hZGRyX2xvKSB7Ci0JCQluID0gbi0+cmJfbGVmdDsKLQkJfSBlbHNlIHsKLQkJCWlmIChhZGRyID4gcGlhci0+YWRkcl9oaSkgewotCQkJCW4gPSBuLT5yYl9yaWdodDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGNpX2Rldl9nZXQocGlhci0+cGNpZGV2KTsKLQkJCQlyZXR1cm4gcGlhci0+cGNpZGV2OwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKgotICogcGNpX2dldF9kZXZpY2VfYnlfYWRkciAtIEdldCBkZXZpY2UsIGdpdmVuIG9ubHkgYWRkcmVzcwotICogQGFkZHI6IG1taW8gKFBJTykgcGh5cyBhZGRyZXNzIG9yIGkvbyBwb3J0IG51bWJlcgotICoKLSAqIEdpdmVuIGFuIG1taW8gcGh5cyBhZGRyZXNzLCBvciBhIHBvcnQgbnVtYmVyLCBmaW5kIGEgcGNpIGRldmljZQotICogdGhhdCBpbXBsZW1lbnRzIHRoaXMgYWRkcmVzcy4gIEJlIHN1cmUgdG8gcGNpX2Rldl9wdXQgdGhlIGRldmljZQotICogd2hlbiBmaW5pc2hlZC4gIEkvTyBwb3J0IG51bWJlcnMgYXJlIGFzc3VtZWQgdG8gYmUgb2Zmc2V0Ci0gKiBmcm9tIHplcm8gKHRoYXQgaXMsIHRoZXkgZG8gKm5vdCogaGF2ZSBwY2lfaW9fYWRkciBhZGRlZCBpbikuCi0gKiBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoaW4gYW4gaW50ZXJydXB0LgotICovCi1zdGF0aWMgc3RydWN0IHBjaV9kZXYgKnBjaV9nZXRfZGV2aWNlX2J5X2FkZHIodW5zaWduZWQgbG9uZyBhZGRyKQotewotCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lfaW9fYWRkcl9jYWNoZV9yb290LnBpYXJfbG9jaywgZmxhZ3MpOwotCWRldiA9IF9fcGNpX2dldF9kZXZpY2VfYnlfYWRkcihhZGRyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2lfaW9fYWRkcl9jYWNoZV9yb290LnBpYXJfbG9jaywgZmxhZ3MpOwotCXJldHVybiBkZXY7Ci19Ci0KLSNpZmRlZiBERUJVRwotLyoKLSAqIEhhbmR5LWRhbmR5IGRlYnVnIHByaW50IHJvdXRpbmUsIGRvZXMgbm90aGluZyBtb3JlCi0gKiB0aGFuIHByaW50IG91dCB0aGUgY29udGVudHMgb2Ygb3VyIGFkZHIgY2FjaGUuCi0gKi8KLXN0YXRpYyB2b2lkIHBjaV9hZGRyX2NhY2hlX3ByaW50KHN0cnVjdCBwY2lfaW9fYWRkcl9jYWNoZSAqY2FjaGUpCi17Ci0Jc3RydWN0IHJiX25vZGUgKm47Ci0JaW50IGNudCA9IDA7Ci0KLQluID0gcmJfZmlyc3QoJmNhY2hlLT5yYl9yb290KTsKLQl3aGlsZSAobikgewotCQlzdHJ1Y3QgcGNpX2lvX2FkZHJfcmFuZ2UgKnBpYXI7Ci0JCXBpYXIgPSByYl9lbnRyeShuLCBzdHJ1Y3QgcGNpX2lvX2FkZHJfcmFuZ2UsIHJiX25vZGUpOwotCQlwcmludGsoS0VSTl9ERUJVRyAiUENJOiAlcyBhZGRyIHJhbmdlICVkIFslbHgtJWx4XTogJXNcbiIsCi0JCSAgICAgICAocGlhci0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSA/ICJpL28iIDogIm1lbSIsIGNudCwKLQkJICAgICAgIHBpYXItPmFkZHJfbG8sIHBpYXItPmFkZHJfaGksIHBjaV9uYW1lKHBpYXItPnBjaWRldikpOwotCQljbnQrKzsKLQkJbiA9IHJiX25leHQobik7Ci0JfQotfQotI2VuZGlmCi0KLS8qIEluc2VydCBhZGRyZXNzIHJhbmdlIGludG8gdGhlIHJiIHRyZWUuICovCi1zdGF0aWMgc3RydWN0IHBjaV9pb19hZGRyX3JhbmdlICoKLXBjaV9hZGRyX2NhY2hlX2luc2VydChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1bnNpZ25lZCBsb25nIGFsbywKLQkJICAgICAgdW5zaWduZWQgbG9uZyBhaGksIHVuc2lnbmVkIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmcGNpX2lvX2FkZHJfY2FjaGVfcm9vdC5yYl9yb290LnJiX25vZGU7Ci0Jc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7Ci0Jc3RydWN0IHBjaV9pb19hZGRyX3JhbmdlICpwaWFyOwotCi0JLyogV2FsayB0cmVlLCBmaW5kIGEgcGxhY2UgdG8gaW5zZXJ0IGludG8gdHJlZSAqLwotCXdoaWxlICgqcCkgewotCQlwYXJlbnQgPSAqcDsKLQkJcGlhciA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHBjaV9pb19hZGRyX3JhbmdlLCByYl9ub2RlKTsKLQkJaWYgKGFoaSA8IHBpYXItPmFkZHJfbG8pIHsKLQkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OwotCQl9IGVsc2UgaWYgKGFsbyA+IHBpYXItPmFkZHJfaGkpIHsKLQkJCXAgPSAmcGFyZW50LT5yYl9yaWdodDsKLQkJfSBlbHNlIHsKLQkJCWlmIChkZXYgIT0gcGlhci0+cGNpZGV2IHx8Ci0JCQkgICAgYWxvICE9IHBpYXItPmFkZHJfbG8gfHwgYWhpICE9IHBpYXItPmFkZHJfaGkpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJQSUFSOiBvdmVybGFwcGluZyBhZGRyZXNzIHJhbmdlXG4iKTsKLQkJCX0KLQkJCXJldHVybiBwaWFyOwotCQl9Ci0JfQotCXBpYXIgPSAoc3RydWN0IHBjaV9pb19hZGRyX3JhbmdlICopa21hbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9pb19hZGRyX3JhbmdlKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwaWFyKQotCQlyZXR1cm4gTlVMTDsKLQotCXBpYXItPmFkZHJfbG8gPSBhbG87Ci0JcGlhci0+YWRkcl9oaSA9IGFoaTsKLQlwaWFyLT5wY2lkZXYgPSBkZXY7Ci0JcGlhci0+ZmxhZ3MgPSBmbGFnczsKLQotI2lmZGVmIERFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgIlBJQVI6IGluc2VydCByYW5nZT1bJWx4OiVseF0gZGV2PSVzXG4iLAotCSAgICAgICAgICAgICAgICAgIGFsbywgYWhpLCBwY2lfbmFtZSAoZGV2KSk7Ci0jZW5kaWYKLQotCXJiX2xpbmtfbm9kZSgmcGlhci0+cmJfbm9kZSwgcGFyZW50LCBwKTsKLQlyYl9pbnNlcnRfY29sb3IoJnBpYXItPnJiX25vZGUsICZwY2lfaW9fYWRkcl9jYWNoZV9yb290LnJiX3Jvb3QpOwotCi0JcmV0dXJuIHBpYXI7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fcGNpX2FkZHJfY2FjaGVfaW5zZXJ0X2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47Ci0Jc3RydWN0IHBjaV9kbiAqcGRuOwotCWludCBpOwotCWludCBpbnNlcnRlZCA9IDA7Ci0KLQlkbiA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShkZXYpOwotCWlmICghZG4pIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJOiBubyBwY2kgZG4gZm91bmQgZm9yIGRldj0lc1xuIiwgcGNpX25hbWUoZGV2KSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBTa2lwIGFueSBkZXZpY2VzIGZvciB3aGljaCBFRUggaXMgbm90IGVuYWJsZWQuICovCi0JcGRuID0gUENJX0ROKGRuKTsKLQlpZiAoIShwZG4tPmVlaF9tb2RlICYgRUVIX01PREVfU1VQUE9SVEVEKSB8fAotCSAgICBwZG4tPmVlaF9tb2RlICYgRUVIX01PREVfTk9DSEVDSykgewotI2lmZGVmIERFQlVHCi0JCXByaW50ayhLRVJOX0lORk8gIlBDSTogc2tpcCBidWlsZGluZyBhZGRyZXNzIGNhY2hlIGZvcj0lcyAtICVzXG4iLAotCQkgICAgICAgcGNpX25hbWUoZGV2KSwgcGRuLT5ub2RlLT5mdWxsX25hbWUpOwotI2VuZGlmCi0JCXJldHVybjsKLQl9Ci0KLQkvKiBUaGUgY2FjaGUgaG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIGRldmljZS4uLiAqLwotCXBjaV9kZXZfZ2V0KGRldik7Ci0KLQkvKiBXYWxrIHJlc291cmNlcyBvbiB0aGlzIGRldmljZSwgcG9rZSB0aGVtIGludG8gdGhlIHRyZWUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgREVWSUNFX0NPVU5UX1JFU09VUkNFOyBpKyspIHsKLQkJdW5zaWduZWQgbG9uZyBzdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsaSk7Ci0JCXVuc2lnbmVkIGxvbmcgZW5kID0gcGNpX3Jlc291cmNlX2VuZChkZXYsaSk7Ci0JCXVuc2lnbmVkIGludCBmbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFncyhkZXYsaSk7Ci0KLQkJLyogV2UgYXJlIGludGVyZXN0ZWQgb25seSBidXMgYWRkcmVzc2VzLCBub3QgZG1hIG9yIG90aGVyIHN0dWZmICovCi0JCWlmICgwID09IChmbGFncyAmIChJT1JFU09VUkNFX0lPIHwgSU9SRVNPVVJDRV9NRU0pKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoc3RhcnQgPT0gMCB8fCB+c3RhcnQgPT0gMCB8fCBlbmQgPT0gMCB8fCB+ZW5kID09IDApCi0JCQkgY29udGludWU7Ci0JCXBjaV9hZGRyX2NhY2hlX2luc2VydChkZXYsIHN0YXJ0LCBlbmQsIGZsYWdzKTsKLQkJaW5zZXJ0ZWQgPSAxOwotCX0KLQotCS8qIElmIHRoZXJlIHdhcyBub3RoaW5nIHRvIGFkZCwgdGhlIGNhY2hlIGhhcyBubyByZWZlcmVuY2UuLi4gKi8KLQlpZiAoIWluc2VydGVkKQotCQlwY2lfZGV2X3B1dChkZXYpOwotfQotCi0vKioKLSAqIHBjaV9hZGRyX2NhY2hlX2luc2VydF9kZXZpY2UgLSBBZGQgYSBkZXZpY2UgdG8gdGhlIGFkZHJlc3MgY2FjaGUKLSAqIEBkZXY6IFBDSSBkZXZpY2Ugd2hvc2UgSS9PIGFkZHJlc3NlcyB3ZSBhcmUgaW50ZXJlc3RlZCBpbi4KLSAqCi0gKiBJbiBvcmRlciB0byBzdXBwb3J0IHRoZSBmYXN0IGxvb2t1cCBvZiBkZXZpY2VzIGJhc2VkIG9uIGFkZHJlc3NlcywKLSAqIHdlIG1haW50YWluIGEgY2FjaGUgb2YgZGV2aWNlcyB0aGF0IGNhbiBiZSBxdWlja2x5IHNlYXJjaGVkLgotICogVGhpcyByb3V0aW5lIGFkZHMgYSBkZXZpY2UgdG8gdGhhdCBjYWNoZS4KLSAqLwotc3RhdGljIHZvaWQgcGNpX2FkZHJfY2FjaGVfaW5zZXJ0X2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGNpX2lvX2FkZHJfY2FjaGVfcm9vdC5waWFyX2xvY2ssIGZsYWdzKTsKLQlfX3BjaV9hZGRyX2NhY2hlX2luc2VydF9kZXZpY2UoZGV2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2lfaW9fYWRkcl9jYWNoZV9yb290LnBpYXJfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19wY2lfYWRkcl9jYWNoZV9yZW1vdmVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0Jc3RydWN0IHJiX25vZGUgKm47Ci0JaW50IHJlbW92ZWQgPSAwOwotCi1yZXN0YXJ0OgotCW4gPSByYl9maXJzdCgmcGNpX2lvX2FkZHJfY2FjaGVfcm9vdC5yYl9yb290KTsKLQl3aGlsZSAobikgewotCQlzdHJ1Y3QgcGNpX2lvX2FkZHJfcmFuZ2UgKnBpYXI7Ci0JCXBpYXIgPSByYl9lbnRyeShuLCBzdHJ1Y3QgcGNpX2lvX2FkZHJfcmFuZ2UsIHJiX25vZGUpOwotCi0JCWlmIChwaWFyLT5wY2lkZXYgPT0gZGV2KSB7Ci0JCQlyYl9lcmFzZShuLCAmcGNpX2lvX2FkZHJfY2FjaGVfcm9vdC5yYl9yb290KTsKLQkJCXJlbW92ZWQgPSAxOwotCQkJa2ZyZWUocGlhcik7Ci0JCQlnb3RvIHJlc3RhcnQ7Ci0JCX0KLQkJbiA9IHJiX25leHQobik7Ci0JfQotCi0JLyogVGhlIGNhY2hlIG5vIGxvbmdlciBob2xkcyBpdHMgcmVmZXJlbmNlIHRvIHRoaXMgZGV2aWNlLi4uICovCi0JaWYgKHJlbW92ZWQpCi0JCXBjaV9kZXZfcHV0KGRldik7Ci19Ci0KLS8qKgotICogcGNpX2FkZHJfY2FjaGVfcmVtb3ZlX2RldmljZSAtIHJlbW92ZSBwY2kgZGV2aWNlIGZyb20gYWRkciBjYWNoZQotICogQGRldjogZGV2aWNlIHRvIHJlbW92ZQotICoKLSAqIFJlbW92ZSBhIGRldmljZSBmcm9tIHRoZSBhZGRyLWNhY2hlIHRyZWUuCi0gKiBUaGlzIGlzIHBvdGVudGlhbGx5IGV4cGVuc2l2ZSwgc2luY2UgaXQgd2lsbCB3YWxrCi0gKiB0aGUgdHJlZSBtdWx0aXBsZSB0aW1lcyAob25jZSBwZXIgcmVzb3VyY2UpLgotICogQnV0IHNvIHdoYXQ7IGRldmljZSByZW1vdmFsIGRvZXNuJ3QgbmVlZCB0byBiZSB0aGF0IGZhc3QuCi0gKi8KLXN0YXRpYyB2b2lkIHBjaV9hZGRyX2NhY2hlX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9pb19hZGRyX2NhY2hlX3Jvb3QucGlhcl9sb2NrLCBmbGFncyk7Ci0JX19wY2lfYWRkcl9jYWNoZV9yZW1vdmVfZGV2aWNlKGRldik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpX2lvX2FkZHJfY2FjaGVfcm9vdC5waWFyX2xvY2ssIGZsYWdzKTsKLX0KLQotLyoqCi0gKiBwY2lfYWRkcl9jYWNoZV9idWlsZCAtIEJ1aWxkIGEgY2FjaGUgb2YgSS9PIGFkZHJlc3NlcwotICoKLSAqIEJ1aWxkIGEgY2FjaGUgb2YgcGNpIGkvbyBhZGRyZXNzZXMuICBUaGlzIGNhY2hlIHdpbGwgYmUgdXNlZCB0bwotICogZmluZCB0aGUgcGNpIGRldmljZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgZ2l2ZW4gYWRkcmVzcy4KLSAqIFRoaXMgcm91dGluZSBzY2FucyBhbGwgcGNpIGJ1c3NlcyB0byBidWlsZCB0aGUgY2FjaGUuCi0gKiBNdXN0IGJlIHJ1biBsYXRlIGluIGJvb3QgcHJvY2VzcywgYWZ0ZXIgdGhlIHBjaSBjb250cm9sbGVycwotICogaGF2ZSBiZWVuIHNjYW5lZCBmb3IgZGV2aWNlcyAoYWZ0ZXIgYWxsIGRldmljZSByZXNvdXJjZXMgYXJlIGtub3duKS4KLSAqLwotdm9pZCBfX2luaXQgcGNpX2FkZHJfY2FjaGVfYnVpbGQodm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOwotCi0JaWYgKCFlZWhfc3Vic3lzdGVtX2VuYWJsZWQpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pbml0KCZwY2lfaW9fYWRkcl9jYWNoZV9yb290LnBpYXJfbG9jayk7Ci0KLQl3aGlsZSAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldikpICE9IE5VTEwpIHsKLQkJLyogSWdub3JlIFBDSSBicmlkZ2VzICggWFhYIHdoeSA/PykgKi8KLQkJaWYgKChkZXYtPmNsYXNzID4+IDE2KSA9PSBQQ0lfQkFTRV9DTEFTU19CUklER0UpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXBjaV9hZGRyX2NhY2hlX2luc2VydF9kZXZpY2UoZGV2KTsKLQotCQkvKiBTYXZlIHRoZSBCQVInczsgZmlybXdhcmUgZG9lc24ndCByZXN0b3JlIHRoZXNlIGFmdGVyIEVFSCByZXNldCAqLwotCQlkbiA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShkZXYpOwotCQllZWhfc2F2ZV9iYXJzKGRldiwgUENJX0ROKGRuKSk7Ci0JfQotCi0jaWZkZWYgREVCVUcKLQkvKiBWZXJpZnkgdHJlZSBidWlsdCB1cCBhYm92ZSwgZWNobyBiYWNrIHRoZSBsaXN0IG9mIGFkZHJzLiAqLwotCXBjaV9hZGRyX2NhY2hlX3ByaW50KCZwY2lfaW9fYWRkcl9jYWNoZV9yb290KTsKLSNlbmRpZgotfQorI2RlZmluZSBJU19CUklER0UoY2xhc3NfY29kZSkgKCgoY2xhc3NfY29kZSk8PDE2KSA9PSBQQ0lfQkFTRV9DTEFTU19CUklER0UpCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogQWJvdmUgbGllcyB0aGUgUENJIEFkZHJlc3MgQ2FjaGUuIEJlbG93IGxpZXMgdGhlIEVFSCBldmVudCBpbmZyYXN0cnVjdHVyZSAqLworLyogQmVsb3cgbGllcyB0aGUgRUVIIGV2ZW50IGluZnJhc3RydWN0dXJlICovCiAKIHZvaWQgZWVoX3Nsb3RfZXJyb3JfZGV0YWlsIChzdHJ1Y3QgcGNpX2RuICpwZG4sIGludCBzZXZlcml0eSkKIHsKKwlpbnQgY29uZmlnX2FkZHI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmM7CiAKQEAgLTQwNyw4ICsxMjEsMTMgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc2xvdF9lcnJidWZfbG9jaywgZmxhZ3MpOwogCW1lbXNldChzbG90X2VycmJ1ZiwgMCwgZWVoX2Vycm9yX2J1Zl9zaXplKTsKIAorCS8qIFVzZSBQRSBjb25maWd1cmF0aW9uIGFkZHJlc3MsIGlmIHByZXNlbnQgKi8KKwljb25maWdfYWRkciA9IHBkbi0+ZWVoX2NvbmZpZ19hZGRyOworCWlmIChwZG4tPmVlaF9wZV9jb25maWdfYWRkcikKKwkJY29uZmlnX2FkZHIgPSBwZG4tPmVlaF9wZV9jb25maWdfYWRkcjsKKwogCXJjID0gcnRhc19jYWxsKGlibV9zbG90X2Vycm9yX2RldGFpbCwKLQkgICAgICAgICAgICAgICA4LCAxLCBOVUxMLCBwZG4tPmVlaF9jb25maWdfYWRkciwKKwkgICAgICAgICAgICAgICA4LCAxLCBOVUxMLCBjb25maWdfYWRkciwKIAkgICAgICAgICAgICAgICBCVUlEX0hJKHBkbi0+cGhiLT5idWlkKSwKIAkgICAgICAgICAgICAgICBCVUlEX0xPKHBkbi0+cGhiLT5idWlkKSwgTlVMTCwgMCwKIAkgICAgICAgICAgICAgICB2aXJ0X3RvX3BoeXMoc2xvdF9lcnJidWYpLApAQCAtNDI4LDYgKzE0Nyw3IEBACiBzdGF0aWMgaW50IHJlYWRfc2xvdF9yZXNldF9zdGF0ZShzdHJ1Y3QgcGNpX2RuICpwZG4sIGludCByZXRzW10pCiB7CiAJaW50IHRva2VuLCBvdXRwdXRzOworCWludCBjb25maWdfYWRkcjsKIAogCWlmIChpYm1fcmVhZF9zbG90X3Jlc2V0X3N0YXRlMiAhPSBSVEFTX1VOS05PV05fU0VSVklDRSkgewogCQl0b2tlbiA9IGlibV9yZWFkX3Nsb3RfcmVzZXRfc3RhdGUyOwpAQCAtNDM4LDcgKzE1OCwxMiBAQAogCQlvdXRwdXRzID0gMzsKIAl9CiAKLQlyZXR1cm4gcnRhc19jYWxsKHRva2VuLCAzLCBvdXRwdXRzLCByZXRzLCBwZG4tPmVlaF9jb25maWdfYWRkciwKKwkvKiBVc2UgUEUgY29uZmlndXJhdGlvbiBhZGRyZXNzLCBpZiBwcmVzZW50ICovCisJY29uZmlnX2FkZHIgPSBwZG4tPmVlaF9jb25maWdfYWRkcjsKKwlpZiAocGRuLT5lZWhfcGVfY29uZmlnX2FkZHIpCisJCWNvbmZpZ19hZGRyID0gcGRuLT5lZWhfcGVfY29uZmlnX2FkZHI7CisKKwlyZXR1cm4gcnRhc19jYWxsKHRva2VuLCAzLCBvdXRwdXRzLCByZXRzLCBjb25maWdfYWRkciwKIAkJCSBCVUlEX0hJKHBkbi0+cGhiLT5idWlkKSwgQlVJRF9MTyhwZG4tPnBoYi0+YnVpZCkpOwogfQogCkBAIC00NjIsNyArMTg3LDcgQEAKIC8qKiAKICAqIFJldHVybiB0aGUgInBhcnRpdGlvbmFibGUgZW5kcG9pbnQiIChwZSkgdW5kZXIgd2hpY2ggdGhpcyBkZXZpY2UgbGllcwogICovCi1zdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICogZmluZF9kZXZpY2VfcGUoc3RydWN0IGRldmljZV9ub2RlICpkbikKK3N0cnVjdCBkZXZpY2Vfbm9kZSAqIGZpbmRfZGV2aWNlX3BlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pCiB7CiAJd2hpbGUgKChkbi0+cGFyZW50KSAmJiBQQ0lfRE4oZG4tPnBhcmVudCkgJiYKIAkgICAgICAoUENJX0ROKGRuLT5wYXJlbnQpLT5lZWhfbW9kZSAmIEVFSF9NT0RFX1NVUFBPUlRFRCkpIHsKQEAgLTQ4Myw4ICsyMDgsMTQgQEAKIHsKIAl3aGlsZSAoZG4pIHsKIAkJaWYgKFBDSV9ETihkbikpIHsKKwkJCS8qIE1hcmsgdGhlIHBjaSBkZXZpY2UgZHJpdmVyIHRvbyAqLworCQkJc3RydWN0IHBjaV9kZXYgKmRldiA9IFBDSV9ETihkbiktPnBjaWRldjsKKwogCQkJUENJX0ROKGRuKS0+ZWVoX21vZGUgfD0gbW9kZV9mbGFnOwogCisJCQlpZiAoZGV2ICYmIGRldi0+ZHJpdmVyKQorCQkJCWRldi0+ZXJyb3Jfc3RhdGUgPSBwY2lfY2hhbm5lbF9pb19mcm96ZW47CisKIAkJCWlmIChkbi0+Y2hpbGQpCiAJCQkJX19lZWhfbWFya19zbG90IChkbi0+Y2hpbGQsIG1vZGVfZmxhZyk7CiAJCX0KQEAgLTQ5NSw2ICsyMjYsMTEgQEAKIHZvaWQgZWVoX21hcmtfc2xvdCAoc3RydWN0IGRldmljZV9ub2RlICpkbiwgaW50IG1vZGVfZmxhZykKIHsKIAlkbiA9IGZpbmRfZGV2aWNlX3BlIChkbik7CisKKwkvKiBCYWNrIHVwIG9uZSwgc2luY2UgY29uZmlnIGFkZHJzIG1pZ2h0IGJlIHNoYXJlZCAqLworCWlmIChQQ0lfRE4oZG4pICYmIFBDSV9ETihkbiktPmVlaF9wZV9jb25maWdfYWRkcikKKwkJZG4gPSBkbi0+cGFyZW50OworCiAJUENJX0ROKGRuKS0+ZWVoX21vZGUgfD0gbW9kZV9mbGFnOwogCV9fZWVoX21hcmtfc2xvdCAoZG4tPmNoaWxkLCBtb2RlX2ZsYWcpOwogfQpAQCAtNTE2LDcgKzI1MiwxMyBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbmZpcm1fZXJyb3JfbG9jaywgZmxhZ3MpOworCQogCWRuID0gZmluZF9kZXZpY2VfcGUgKGRuKTsKKwkKKwkvKiBCYWNrIHVwIG9uZSwgc2luY2UgY29uZmlnIGFkZHJzIG1pZ2h0IGJlIHNoYXJlZCAqLworCWlmIChQQ0lfRE4oZG4pICYmIFBDSV9ETihkbiktPmVlaF9wZV9jb25maWdfYWRkcikKKwkJZG4gPSBkbi0+cGFyZW50OworCiAJUENJX0ROKGRuKS0+ZWVoX21vZGUgJj0gfm1vZGVfZmxhZzsKIAlQQ0lfRE4oZG4pLT5lZWhfY2hlY2tfY291bnQgPSAwOwogCV9fZWVoX2NsZWFyX3Nsb3QgKGRuLT5jaGlsZCwgbW9kZV9mbGFnKTsKQEAgLTU0NCwxNSArMjg2LDE2IEBACiAJaW50IHJldHNbM107CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgcGNpX2RuICpwZG47CisJZW51bSBwY2lfY2hhbm5lbF9zdGF0ZSBzdGF0ZTsKIAlpbnQgcmMgPSAwOwogCi0JX19nZXRfY3B1X3Zhcih0b3RhbF9tbWlvX2ZmcykrKzsKKwl0b3RhbF9tbWlvX2ZmcysrOwogCiAJaWYgKCFlZWhfc3Vic3lzdGVtX2VuYWJsZWQpCiAJCXJldHVybiAwOwogCiAJaWYgKCFkbikgewotCQlfX2dldF9jcHVfdmFyKG5vX2RuKSsrOworCQlub19kbisrOwogCQlyZXR1cm4gMDsKIAl9CiAJcGRuID0gUENJX0ROKGRuKTsKQEAgLTU2MCw3ICszMDMsNyBAQAogCS8qIEFjY2VzcyB0byBJTyBCQVJzIG1pZ2h0IGdldCB0aGlzIGZhciBhbmQgc3RpbGwgbm90IHdhbnQgY2hlY2tpbmcuICovCiAJaWYgKCEocGRuLT5lZWhfbW9kZSAmIEVFSF9NT0RFX1NVUFBPUlRFRCkgfHwKIAkgICAgcGRuLT5lZWhfbW9kZSAmIEVFSF9NT0RFX05PQ0hFQ0spIHsKLQkJX19nZXRfY3B1X3ZhcihpZ25vcmVkX2NoZWNrKSsrOworCQlpZ25vcmVkX2NoZWNrKys7CiAjaWZkZWYgREVCVUcKIAkJcHJpbnRrICgiRUVIOmlnbm9yZWQgY2hlY2sgKCV4KSBmb3IgJXMgJXNcbiIsIAogCQkgICAgICAgIHBkbi0+ZWVoX21vZGUsIHBjaV9uYW1lIChkZXYpLCBkbi0+ZnVsbF9uYW1lKTsKQEAgLTU2OCw4ICszMTEsOCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoIXBkbi0+ZWVoX2NvbmZpZ19hZGRyKSB7Ci0JCV9fZ2V0X2NwdV92YXIobm9fY2ZnX2FkZHIpKys7CisJaWYgKCFwZG4tPmVlaF9jb25maWdfYWRkciAmJiAhcGRuLT5lZWhfcGVfY29uZmlnX2FkZHIpIHsKKwkJbm9fY2ZnX2FkZHIrKzsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC02MTEsNyArMzU0LDcgQEAKIAlpZiAocmV0ICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiRUVIOiByZWFkX3Nsb3RfcmVzZXRfc3RhdGUoKSBmYWlsZWQ7IHJjPSVkIGRuPSVzXG4iLAogCQkgICAgICAgcmV0LCBkbi0+ZnVsbF9uYW1lKTsKLQkJX19nZXRfY3B1X3ZhcihmYWxzZV9wb3NpdGl2ZXMpKys7CisJCWZhbHNlX3Bvc2l0aXZlcysrOwogCQlyYyA9IDA7CiAJCWdvdG8gZG5fdW5sb2NrOwogCX0KQEAgLTYyMCwxNCArMzYzLDE0IEBACiAJaWYgKHJldHNbMV0gIT0gMSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRUg6IGV2ZW50IG9uIHVuc3VwcG9ydGVkIGRldmljZSwgcmM9JWQgZG49JXNcbiIsCiAJCSAgICAgICByZXQsIGRuLT5mdWxsX25hbWUpOwotCQlfX2dldF9jcHVfdmFyKGZhbHNlX3Bvc2l0aXZlcykrKzsKKwkJZmFsc2VfcG9zaXRpdmVzKys7CiAJCXJjID0gMDsKIAkJZ290byBkbl91bmxvY2s7CiAJfQogCiAJLyogSWYgbm90IHRoZSBraW5kIG9mIGVycm9yIHdlIGtub3cgYWJvdXQsIHB1bnQuICovCiAJaWYgKHJldHNbMF0gIT0gMiAmJiByZXRzWzBdICE9IDQgJiYgcmV0c1swXSAhPSA1KSB7Ci0JCV9fZ2V0X2NwdV92YXIoZmFsc2VfcG9zaXRpdmVzKSsrOworCQlmYWxzZV9wb3NpdGl2ZXMrKzsKIAkJcmMgPSAwOwogCQlnb3RvIGRuX3VubG9jazsKIAl9CkBAIC02MzUsMTIgKzM3OCwxMiBAQAogCS8qIE5vdGUgdGhhdCBjb25maWctaW8gdG8gZW1wdHkgc2xvdHMgbWF5IGZhaWw7CiAJICogd2UgcmVjb2duaXplIGVtcHR5IGJlY2F1c2UgdGhleSBkb24ndCBoYXZlIGNoaWxkcmVuLiAqLwogCWlmICgocmV0c1swXSA9PSA1KSAmJiAoZG4tPmNoaWxkID09IE5VTEwpKSB7Ci0JCV9fZ2V0X2NwdV92YXIoZmFsc2VfcG9zaXRpdmVzKSsrOworCQlmYWxzZV9wb3NpdGl2ZXMrKzsKIAkJcmMgPSAwOwogCQlnb3RvIGRuX3VubG9jazsKIAl9CiAKLQlfX2dldF9jcHVfdmFyKHNsb3RfcmVzZXRzKSsrOworCXNsb3RfcmVzZXRzKys7CiAgCiAJLyogQXZvaWQgcmVwZWF0ZWQgcmVwb3J0cyBvZiB0aGlzIGZhaWx1cmUsIGluY2x1ZGluZyBwcm9ibGVtcwogCSAqIHdpdGggb3RoZXIgZnVuY3Rpb25zIG9uIHRoaXMgZGV2aWNlLCBhbmQgZnVuY3Rpb25zIHVuZGVyCkBAIC02NDgsOCArMzkxLDEzIEBACiAJZWVoX21hcmtfc2xvdCAoZG4sIEVFSF9NT0RFX0lTT0xBVEVEKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25maXJtX2Vycm9yX2xvY2ssIGZsYWdzKTsKIAotCWVlaF9zZW5kX2ZhaWx1cmVfZXZlbnQgKGRuLCBkZXYsIHJldHNbMF0sIHJldHNbMl0pOwotCQorCXN0YXRlID0gcGNpX2NoYW5uZWxfaW9fbm9ybWFsOworCWlmICgocmV0c1swXSA9PSAyKSB8fCAocmV0c1swXSA9PSA0KSkKKwkJc3RhdGUgPSBwY2lfY2hhbm5lbF9pb19mcm96ZW47CisJaWYgKHJldHNbMF0gPT0gNSkKKwkJc3RhdGUgPSBwY2lfY2hhbm5lbF9pb19wZXJtX2ZhaWx1cmU7CisJZWVoX3NlbmRfZmFpbHVyZV9ldmVudCAoZG4sIGRldiwgc3RhdGUsIHJldHNbMl0pOworCiAJLyogTW9zdCBFRUggZXZlbnRzIGFyZSBkdWUgdG8gZGV2aWNlIGRyaXZlciBidWdzLiAgSGF2aW5nCiAJICogYSBzdGFjayB0cmFjZSB3aWxsIGhlbHAgdGhlIGRldmljZS1kcml2ZXIgYXV0aG9ycyBmaWd1cmUKIAkgKiBvdXQgd2hhdCBoYXBwZW5lZC4gIFNvIHByaW50IHRoYXQgb3V0LiAqLwpAQCAtNjg1LDcgKzQzMyw3IEBACiAJYWRkciA9IGVlaF90b2tlbl90b19waHlzKCh1bnNpZ25lZCBsb25nIF9fZm9yY2UpIHRva2VuKTsKIAlkZXYgPSBwY2lfZ2V0X2RldmljZV9ieV9hZGRyKGFkZHIpOwogCWlmICghZGV2KSB7Ci0JCV9fZ2V0X2NwdV92YXIobm9fZGV2aWNlKSsrOworCQlub19kZXZpY2UrKzsKIAkJcmV0dXJuIHZhbDsKIAl9CiAKQEAgLTcxNiwxMSArNDY0LDE2IEBACiAJaWYgKHJjKSByZXR1cm4gcmM7CiAKIAlpZiAocmV0c1sxXSA9PSAwKSByZXR1cm4gLTE7ICAvKiBFRUggaXMgbm90IHN1cHBvcnRlZCAqLwotCWlmIChyZXRzWzBdID09IDApICByZXR1cm4gMDsgIC8qIE9sbCBLb3JyZWN0ICovCisJaWYgKHJldHNbMF0gPT0gMCkgcmV0dXJuIDA7ICAgLyogT2xsIEtvcnJlY3QgKi8KIAlpZiAocmV0c1swXSA9PSA1KSB7CiAJCWlmIChyZXRzWzJdID09IDApIHJldHVybiAtMTsgLyogcGVybWFuZW50bHkgdW5hdmFpbGFibGUgKi8KIAkJcmV0dXJuIHJldHNbMl07IC8qIG51bWJlciBvZiBtaWxsaXNlY3MgdG8gd2FpdCAqLwogCX0KKwlpZiAocmV0c1swXSA9PSAxKQorCQlyZXR1cm4gMjUwOworCisJcHJpbnRrIChLRVJOX0VSUiAiRUVIOiBTbG90IHVuYXZhaWxhYmxlOiByYz0lZCwgcmV0cz0lZCAlZCAlZFxuIiwKKwkJcmMsIHJldHNbMF0sIHJldHNbMV0sIHJldHNbMl0pOwogCXJldHVybiAtMTsKIH0KIApAQCAtNzM3LDYgKzQ5MCw3IEBACiBzdGF0aWMgdm9pZAogcnRhc19wY2lfc2xvdF9yZXNldChzdHJ1Y3QgcGNpX2RuICpwZG4sIGludCBzdGF0ZSkKIHsKKwlpbnQgY29uZmlnX2FkZHI7CiAJaW50IHJjOwogCiAJQlVHX09OIChwZG49PU5VTEwpOyAKQEAgLTc0Nyw4ICs1MDEsMTMgQEAKIAkJcmV0dXJuOwogCX0KIAorCS8qIFVzZSBQRSBjb25maWd1cmF0aW9uIGFkZHJlc3MsIGlmIHByZXNlbnQgKi8KKwljb25maWdfYWRkciA9IHBkbi0+ZWVoX2NvbmZpZ19hZGRyOworCWlmIChwZG4tPmVlaF9wZV9jb25maWdfYWRkcikKKwkJY29uZmlnX2FkZHIgPSBwZG4tPmVlaF9wZV9jb25maWdfYWRkcjsKKwogCXJjID0gcnRhc19jYWxsKGlibV9zZXRfc2xvdF9yZXNldCw0LDEsIE5VTEwsCi0JICAgICAgICAgICAgICAgcGRuLT5lZWhfY29uZmlnX2FkZHIsCisJICAgICAgICAgICAgICAgY29uZmlnX2FkZHIsCiAJICAgICAgICAgICAgICAgQlVJRF9ISShwZG4tPnBoYi0+YnVpZCksCiAJICAgICAgICAgICAgICAgQlVJRF9MTyhwZG4tPnBoYi0+YnVpZCksCiAJICAgICAgICAgICAgICAgc3RhdGUpOwpAQCAtNzYxLDkgKzUyMCwxMSBAQAogCiAvKiogcnRhc19zZXRfc2xvdF9yZXNldCAtLSBhc3NlcnQgdGhlIHBjaSAjUlNUIGxpbmUgZm9yIDEvNCBzZWNvbmQKICAqICBkbiAtLSBkZXZpY2Ugbm9kZSB0byBiZSByZXNldC4KKyAqCisgKiAgUmV0dXJuIDAgaWYgc3VjY2VzcywgZWxzZSBhIG5vbi16ZXJvIHZhbHVlLgogICovCiAKLXZvaWQKK2ludAogcnRhc19zZXRfc2xvdF9yZXNldChzdHJ1Y3QgcGNpX2RuICpwZG4pCiB7CiAJaW50IGksIHJjOwpAQCAtNzkzLDEwICs1NTQsMjEgQEAKIAkgKiByZWFkeSB0byBiZSB1c2VkOyBpZiBub3QsIHdhaXQgZm9yIHJlY292ZXJ5LiAqLwogCWZvciAoaT0wOyBpPDEwOyBpKyspIHsKIAkJcmMgPSBlZWhfc2xvdF9hdmFpbGFiaWxpdHkgKHBkbik7Ci0JCWlmIChyYyA8PSAwKSBicmVhazsKKwkJaWYgKHJjIDwgMCkKKwkJCXByaW50ayAoS0VSTl9FUlIgIkVFSDogZmFpbGVkICglZCkgdG8gcmVzZXQgc2xvdCAlc1xuIiwgcmMsIHBkbi0+bm9kZS0+ZnVsbF9uYW1lKTsKKwkJaWYgKHJjID09IDApCisJCQlyZXR1cm4gMDsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiAtMTsKIAogCQltc2xlZXAgKHJjKzEwMCk7CiAJfQorCisJcmMgPSBlZWhfc2xvdF9hdmFpbGFiaWxpdHkgKHBkbik7CisJaWYgKHJjKQorCQlwcmludGsgKEtFUk5fRVJSICJFRUg6IHRpbWVvdXQgcmVzZXR0aW5nIHNsb3QgJXNcbiIsIHBkbi0+bm9kZS0+ZnVsbF9uYW1lKTsKKworCXJldHVybiByYzsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtODUxLDcgKzYyMyw3IEBACiAJaWYgKCFwZG4pIAogCQlyZXR1cm47CiAJCi0JaWYgKCEgcGRuLT5lZWhfaXNfYnJpZGdlKQorCWlmICgocGRuLT5lZWhfbW9kZSAmIEVFSF9NT0RFX1NVUFBPUlRFRCkgJiYgIUlTX0JSSURHRShwZG4tPmNsYXNzX2NvZGUpKQogCQlfX3Jlc3RvcmVfYmFycyAocGRuKTsKIAogCWRuID0gcGRuLT5ub2RlLT5jaGlsZDsKQEAgLTg2OSwzMCArNjQxLDMwIEBACiAgKiBQQ0kgZGV2aWNlcyBhcmUgYWRkZWQgaW5kaXZpZHVhbGxseTsgYnV0LCBmb3IgdGhlIHJlc3RvcmUsCiAgKiBhbiBlbnRpcmUgc2xvdCBpcyByZXNldCBhdCBhIHRpbWUuCiAgKi8KLXN0YXRpYyB2b2lkIGVlaF9zYXZlX2JhcnMoc3RydWN0IHBjaV9kZXYgKiBwZGV2LCBzdHJ1Y3QgcGNpX2RuICpwZG4pCitzdGF0aWMgdm9pZCBlZWhfc2F2ZV9iYXJzKHN0cnVjdCBwY2lfZG4gKnBkbikKIHsKIAlpbnQgaTsKIAotCWlmICghcGRldiB8fCAhcGRuICkKKwlpZiAoIXBkbiApCiAJCXJldHVybjsKIAkKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGkgKiA0LCAmcGRuLT5jb25maWdfc3BhY2VbaV0pOwotCi0JaWYgKHBkZXYtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9CUklER0UpCi0JCXBkbi0+ZWVoX2lzX2JyaWRnZSA9IDE7CisJCXJ0YXNfcmVhZF9jb25maWcocGRuLCBpICogNCwgNCwgJnBkbi0+Y29uZmlnX3NwYWNlW2ldKTsKIH0KIAogdm9pZAogcnRhc19jb25maWd1cmVfYnJpZGdlKHN0cnVjdCBwY2lfZG4gKnBkbikKIHsKLQlpbnQgdG9rZW4gPSBydGFzX3Rva2VuICgiaWJtLGNvbmZpZ3VyZS1icmlkZ2UiKTsKKwlpbnQgY29uZmlnX2FkZHI7CiAJaW50IHJjOwogCi0JaWYgKHRva2VuID09IFJUQVNfVU5LTk9XTl9TRVJWSUNFKQotCQlyZXR1cm47Ci0JcmMgPSBydGFzX2NhbGwodG9rZW4sMywxLCBOVUxMLAotCSAgICAgICAgICAgICAgIHBkbi0+ZWVoX2NvbmZpZ19hZGRyLAorCS8qIFVzZSBQRSBjb25maWd1cmF0aW9uIGFkZHJlc3MsIGlmIHByZXNlbnQgKi8KKwljb25maWdfYWRkciA9IHBkbi0+ZWVoX2NvbmZpZ19hZGRyOworCWlmIChwZG4tPmVlaF9wZV9jb25maWdfYWRkcikKKwkJY29uZmlnX2FkZHIgPSBwZG4tPmVlaF9wZV9jb25maWdfYWRkcjsKKworCXJjID0gcnRhc19jYWxsKGlibV9jb25maWd1cmVfYnJpZGdlLDMsMSwgTlVMTCwKKwkgICAgICAgICAgICAgICBjb25maWdfYWRkciwKIAkgICAgICAgICAgICAgICBCVUlEX0hJKHBkbi0+cGhiLT5idWlkKSwKIAkgICAgICAgICAgICAgICBCVUlEX0xPKHBkbi0+cGhiLT5idWlkKSk7CiAJaWYgKHJjKSB7CkBAIC05MjcsNiArNjk5LDcgQEAKIAlpbnQgZW5hYmxlOwogCXN0cnVjdCBwY2lfZG4gKnBkbiA9IFBDSV9ETihkbik7CiAKKwlwZG4tPmNsYXNzX2NvZGUgPSAwOwogCXBkbi0+ZWVoX21vZGUgPSAwOwogCXBkbi0+ZWVoX2NoZWNrX2NvdW50ID0gMDsKIAlwZG4tPmVlaF9mcmVlemVfY291bnQgPSAwOwpAQCAtOTQzLDYgKzcxNiw3IEBACiAJCXBkbi0+ZWVoX21vZGUgfD0gRUVIX01PREVfTk9DSEVDSzsKIAkJcmV0dXJuIE5VTEw7CiAJfQorCXBkbi0+Y2xhc3NfY29kZSA9ICpjbGFzc19jb2RlOwogCiAJLyoKIAkgKiBOb3cgZGVjaWRlIGlmIHdlIGFyZSBnb2luZyB0byAiRGlzYWJsZSIgRUVIIGNoZWNraW5nCkBAIC05NTMsOCArNzI3LDEwIEBACiAJICogQnV0IHRoZXJlIGFyZSBhIGZldyBjYXNlcyBsaWtlIGRpc3BsYXkgZGV2aWNlcyB0aGF0IG1ha2Ugc2Vuc2UuCiAJICovCiAJZW5hYmxlID0gMTsJLyogaS5lLiB3ZSB3aWxsIGRvIGNoZWNraW5nICovCisjaWYgMAogCWlmICgoKmNsYXNzX2NvZGUgPj4gMTYpID09IFBDSV9CQVNFX0NMQVNTX0RJU1BMQVkpCiAJCWVuYWJsZSA9IDA7CisjZW5kaWYKIAogCWlmICghZW5hYmxlKQogCQlwZG4tPmVlaF9tb2RlIHw9IEVFSF9NT0RFX05PQ0hFQ0s7CkBAIC05NzMsOCArNzQ5LDIyIEBACiAJCQllZWhfc3Vic3lzdGVtX2VuYWJsZWQgPSAxOwogCQkJcGRuLT5lZWhfbW9kZSB8PSBFRUhfTU9ERV9TVVBQT1JURUQ7CiAJCQlwZG4tPmVlaF9jb25maWdfYWRkciA9IHJlZ3NbMF07CisKKwkJCS8qIElmIHRoZSBuZXdlciwgYmV0dGVyLCBpYm0sZ2V0LWNvbmZpZy1hZGRyLWluZm8gaXMgc3VwcG9ydGVkLCAKKwkJCSAqIHRoZW4gdXNlIHRoYXQgaW5zdGVhZC4gKi8KKwkJCXBkbi0+ZWVoX3BlX2NvbmZpZ19hZGRyID0gMDsKKwkJCWlmIChpYm1fZ2V0X2NvbmZpZ19hZGRyX2luZm8gIT0gUlRBU19VTktOT1dOX1NFUlZJQ0UpIHsKKwkJCQl1bnNpZ25lZCBpbnQgcmV0c1syXTsKKwkJCQlyZXQgPSBydGFzX2NhbGwgKGlibV9nZXRfY29uZmlnX2FkZHJfaW5mbywgNCwgMiwgcmV0cywgCisJCQkJCXBkbi0+ZWVoX2NvbmZpZ19hZGRyLCAKKwkJCQkJaW5mby0+YnVpZF9oaSwgaW5mby0+YnVpZF9sbywKKwkJCQkJMCk7CisJCQkJaWYgKHJldCA9PSAwKQorCQkJCQlwZG4tPmVlaF9wZV9jb25maWdfYWRkciA9IHJldHNbMF07CisJCQl9CiAjaWZkZWYgREVCVUcKLQkJCXByaW50ayhLRVJOX0RFQlVHICJFRUg6ICVzOiBlZWggZW5hYmxlZFxuIiwgZG4tPmZ1bGxfbmFtZSk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiRUVIOiAlczogZWVoIGVuYWJsZWQsIGNvbmZpZz0leCBwZV9jb25maWc9JXhcbiIsCisJCQkgICAgICAgZG4tPmZ1bGxfbmFtZSwgcGRuLT5lZWhfY29uZmlnX2FkZHIsIHBkbi0+ZWVoX3BlX2NvbmZpZ19hZGRyKTsKICNlbmRpZgogCQl9IGVsc2UgewogCkBAIC05OTMsNiArNzgzLDcgQEAKIAkJICAgICAgIGRuLT5mdWxsX25hbWUpOwogCX0KIAorCWVlaF9zYXZlX2JhcnMocGRuKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMTAyNiw2ICs4MTcsOCBAQAogCWlibV9yZWFkX3Nsb3RfcmVzZXRfc3RhdGUyID0gcnRhc190b2tlbigiaWJtLHJlYWQtc2xvdC1yZXNldC1zdGF0ZTIiKTsKIAlpYm1fcmVhZF9zbG90X3Jlc2V0X3N0YXRlID0gcnRhc190b2tlbigiaWJtLHJlYWQtc2xvdC1yZXNldC1zdGF0ZSIpOwogCWlibV9zbG90X2Vycm9yX2RldGFpbCA9IHJ0YXNfdG9rZW4oImlibSxzbG90LWVycm9yLWRldGFpbCIpOworCWlibV9nZXRfY29uZmlnX2FkZHJfaW5mbyA9IHJ0YXNfdG9rZW4oImlibSxnZXQtY29uZmlnLWFkZHItaW5mbyIpOworCWlibV9jb25maWd1cmVfYnJpZGdlID0gcnRhc190b2tlbiAoImlibSxjb25maWd1cmUtYnJpZGdlIik7CiAKIAlpZiAoaWJtX3NldF9lZWhfb3B0aW9uID09IFJUQVNfVU5LTk9XTl9TRVJWSUNFKQogCQlyZXR1cm47CkBAIC0xMDgwLDEyICs4NzMsMTAgQEAKIAlpZiAoIWRuIHx8ICFQQ0lfRE4oZG4pKQogCQlyZXR1cm47CiAJcGhiID0gUENJX0ROKGRuKS0+cGhiOwotCWlmIChOVUxMID09IHBoYiB8fCAwID09IHBoYi0+YnVpZCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRUg6IEV4cGVjdGVkIGJ1aWQgYnV0IGZvdW5kIG5vbmUgZm9yICVzXG4iLAotCQkgICAgICAgZG4tPmZ1bGxfbmFtZSk7Ci0JCWR1bXBfc3RhY2soKTsKKworCS8qIFVTQiBCdXMgY2hpbGRyZW4gb2YgUENJIGRldmljZXMgd2lsbCBub3QgaGF2ZSBCVUlEJ3MgKi8KKwlpZiAoTlVMTCA9PSBwaGIgfHwgMCA9PSBwaGItPmJ1aWQpCiAJCXJldHVybjsKLQl9CiAKIAlpbmZvLmJ1aWRfaGkgPSBCVUlEX0hJKHBoYi0+YnVpZCk7CiAJaW5mby5idWlkX2xvID0gQlVJRF9MTyhwaGItPmJ1aWQpOwpAQCAtMTA5Myw2ICs4ODQsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGVlaF9hZGRfZGV2aWNlX2Vhcmx5KTsKIAordm9pZCBlZWhfYWRkX2RldmljZV90cmVlX2Vhcmx5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pCit7CisJc3RydWN0IGRldmljZV9ub2RlICpzaWI7CisJZm9yIChzaWIgPSBkbi0+Y2hpbGQ7IHNpYjsgc2liID0gc2liLT5zaWJsaW5nKQorCQllZWhfYWRkX2RldmljZV90cmVlX2Vhcmx5KHNpYik7CisJZWVoX2FkZF9kZXZpY2VfZWFybHkoZG4pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZWVoX2FkZF9kZXZpY2VfdHJlZV9lYXJseSk7CisKIC8qKgogICogZWVoX2FkZF9kZXZpY2VfbGF0ZSAtIHBlcmZvcm0gRUVIIGluaXRpYWxpemF0aW9uIGZvciB0aGUgaW5kaWNhdGVkIHBjaSBkZXZpY2UKICAqIEBkZXY6IHBjaSBkZXZpY2UgZm9yIHdoaWNoIHRvIHNldCB1cCBFRUgKQEAgLTExMTgsNyArOTE4LDYgQEAKIAlwZG4tPnBjaWRldiA9IGRldjsKIAogCXBjaV9hZGRyX2NhY2hlX2luc2VydF9kZXZpY2UgKGRldik7Ci0JZWVoX3NhdmVfYmFycyhkZXYsIHBkbik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChlZWhfYWRkX2RldmljZV9sYXRlKTsKIApAQCAtMTE0NywyNyArOTQ2LDI4IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChlZWhfcmVtb3ZlX2RldmljZSk7CiAKK3ZvaWQgZWVoX3JlbW92ZV9idXNfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJZWVoX3JlbW92ZV9kZXZpY2UoZGV2KTsKKwlpZiAoZGV2LT5oZHJfdHlwZSA9PSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFKSB7CisJCXN0cnVjdCBwY2lfYnVzICpidXMgPSBkZXYtPnN1Ym9yZGluYXRlOworCQlzdHJ1Y3QgbGlzdF9oZWFkICpsbjsKKwkJaWYgKCFidXMpCisJCQlyZXR1cm47IAorCQlmb3IgKGxuID0gYnVzLT5kZXZpY2VzLm5leHQ7IGxuICE9ICZidXMtPmRldmljZXM7IGxuID0gbG4tPm5leHQpIHsKKwkJCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcGNpX2Rldl9iKGxuKTsKKwkJCWlmIChwZGV2KQorCQkJCWVlaF9yZW1vdmVfYnVzX2RldmljZShwZGV2KTsKKwkJfQorCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKGVlaF9yZW1vdmVfYnVzX2RldmljZSk7CisKIHN0YXRpYyBpbnQgcHJvY19lZWhfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7Ci0JdW5zaWduZWQgaW50IGNwdTsKLQl1bnNpZ25lZCBsb25nIGZmcyA9IDAsIHBvc2l0aXZlcyA9IDAsIGZhaWx1cmVzID0gMDsKLQl1bnNpZ25lZCBsb25nIHJlc2V0cyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBub19kZXYgPSAwLCBub19kbiA9IDAsIG5vX2NmZyA9IDAsIG5vX2NoZWNrID0gMDsKLQotCWZvcl9lYWNoX2NwdShjcHUpIHsKLQkJZmZzICs9IHBlcl9jcHUodG90YWxfbW1pb19mZnMsIGNwdSk7Ci0JCXBvc2l0aXZlcyArPSBwZXJfY3B1KGZhbHNlX3Bvc2l0aXZlcywgY3B1KTsKLQkJZmFpbHVyZXMgKz0gcGVyX2NwdShpZ25vcmVkX2ZhaWx1cmVzLCBjcHUpOwotCQlyZXNldHMgKz0gcGVyX2NwdShzbG90X3Jlc2V0cywgY3B1KTsKLQkJbm9fZGV2ICs9IHBlcl9jcHUobm9fZGV2aWNlLCBjcHUpOwotCQlub19kbiArPSBwZXJfY3B1KG5vX2RuLCBjcHUpOwotCQlub19jZmcgKz0gcGVyX2NwdShub19jZmdfYWRkciwgY3B1KTsKLQkJbm9fY2hlY2sgKz0gcGVyX2NwdShpZ25vcmVkX2NoZWNrLCBjcHUpOwotCX0KLQogCWlmICgwID09IGVlaF9zdWJzeXN0ZW1fZW5hYmxlZCkgewogCQlzZXFfcHJpbnRmKG0sICJFRUggU3Vic3lzdGVtIGlzIGdsb2JhbGx5IGRpc2FibGVkXG4iKTsKLQkJc2VxX3ByaW50ZihtLCAiZWVoX3RvdGFsX21taW9fZmZzPSVsZFxuIiwgZmZzKTsKKwkJc2VxX3ByaW50ZihtLCAiZWVoX3RvdGFsX21taW9fZmZzPSVsZFxuIiwgdG90YWxfbW1pb19mZnMpOwogCX0gZWxzZSB7CiAJCXNlcV9wcmludGYobSwgIkVFSCBTdWJzeXN0ZW0gaXMgZW5hYmxlZFxuIik7CiAJCXNlcV9wcmludGYobSwKQEAgLTExNzksOCArOTc5LDEwIEBACiAJCQkJImVlaF9mYWxzZV9wb3NpdGl2ZXM9JWxkXG4iCiAJCQkJImVlaF9pZ25vcmVkX2ZhaWx1cmVzPSVsZFxuIgogCQkJCSJlZWhfc2xvdF9yZXNldHM9JWxkXG4iLAotCQkJCW5vX2Rldiwgbm9fZG4sIG5vX2NmZywgbm9fY2hlY2ssCi0JCQkJZmZzLCBwb3NpdGl2ZXMsIGZhaWx1cmVzLCByZXNldHMpOworCQkJCW5vX2RldmljZSwgbm9fZG4sIG5vX2NmZ19hZGRyLCAKKwkJCQlpZ25vcmVkX2NoZWNrLCB0b3RhbF9tbWlvX2ZmcywgCisJCQkJZmFsc2VfcG9zaXRpdmVzLCBpZ25vcmVkX2ZhaWx1cmVzLCAKKwkJCQlzbG90X3Jlc2V0cyk7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2NhY2hlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2NhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRhNDAyYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfY2FjaGUuYwpAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqIGVlaF9jYWNoZS5jCisgKiBQQ0kgYWRkcmVzcyBjYWNoZTsgYWxsb3dzIHRoZSBsb29rdXAgb2YgUENJIGRldmljZXMgYmFzZWQgb24gSS9PIGFkZHJlc3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTGluYXMgVmVwc3RhcyA8bGluYXNAYXVzdGluLmlibS5jb20+IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgorCisjdW5kZWYgREVCVUcKKworLyoqCisgKiBUaGUgcGNpIGFkZHJlc3MgY2FjaGUgc3Vic3lzdGVtLiAgVGhpcyBzdWJzeXN0ZW0gcGxhY2VzCisgKiBQQ0kgZGV2aWNlIGFkZHJlc3MgcmVzb3VyY2VzIGludG8gYSByZWQtYmxhY2sgdHJlZSwgc29ydGVkCisgKiBhY2NvcmRpbmcgdG8gdGhlIGFkZHJlc3MgcmFuZ2UsIHNvIHRoYXQgZ2l2ZW4gb25seSBhbiBpL28KKyAqIGFkZHJlc3MsIHRoZSBjb3JyZXNwb25kaW5nIFBDSSBkZXZpY2UgY2FuIGJlICoqcXVpY2tseSoqCisgKiBmb3VuZC4gSXQgaXMgc2FmZSB0byBwZXJmb3JtIGFuIGFkZHJlc3MgbG9va3VwIGluIGFuIGludGVycnVwdAorICogY29udGV4dDsgdGhpcyBhYmlsaXR5IGlzIGFuIGltcG9ydGFudCBmZWF0dXJlLgorICoKKyAqIEN1cnJlbnRseSwgdGhlIG9ubHkgY3VzdG9tZXIgb2YgdGhpcyBjb2RlIGlzIHRoZSBFRUggc3Vic3lzdGVtOworICogdGh1cywgdGhpcyBjb2RlIGhhcyBiZWVuIHNvbWV3aGF0IHRhaWxvcmVkIHRvIHN1aXQgRUVIIGJldHRlci4KKyAqIEluIHBhcnRpY3VsYXIsIHRoZSBjYWNoZSBkb2VzICpub3QqIGhvbGQgdGhlIGFkZHJlc3NlcyBvZiBkZXZpY2VzCisgKiBmb3Igd2hpY2ggRUVIIGlzIG5vdCBlbmFibGVkLgorICoKKyAqIChJbXBsZW1lbnRhdGlvbiBOb3RlOiBUaGUgUkIgdHJlZSBzZWVtcyB0byBiZSBiZXR0ZXIvZmFzdGVyCisgKiB0aGFuIGFueSBoYXNoIGFsZ28gSSBjb3VsZCB0aGluayBvZiBmb3IgdGhpcyBwcm9ibGVtLCBldmVuCisgKiB3aXRoIHRoZSBwZW5hbHR5IG9mIHNsb3cgcG9pbnRlciBjaGFzZXMgZm9yIGQtY2FjaGUgbWlzc2VzKS4KKyAqLworc3RydWN0IHBjaV9pb19hZGRyX3JhbmdlCit7CisJc3RydWN0IHJiX25vZGUgcmJfbm9kZTsKKwl1bnNpZ25lZCBsb25nIGFkZHJfbG87CisJdW5zaWduZWQgbG9uZyBhZGRyX2hpOworCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7CisJdW5zaWduZWQgaW50IGZsYWdzOworfTsKKworc3RhdGljIHN0cnVjdCBwY2lfaW9fYWRkcl9jYWNoZQoreworCXN0cnVjdCByYl9yb290IHJiX3Jvb3Q7CisJc3BpbmxvY2tfdCBwaWFyX2xvY2s7Cit9IHBjaV9pb19hZGRyX2NhY2hlX3Jvb3Q7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBjaV9kZXYgKl9fcGNpX2dldF9kZXZpY2VfYnlfYWRkcih1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJc3RydWN0IHJiX25vZGUgKm4gPSBwY2lfaW9fYWRkcl9jYWNoZV9yb290LnJiX3Jvb3QucmJfbm9kZTsKKworCXdoaWxlIChuKSB7CisJCXN0cnVjdCBwY2lfaW9fYWRkcl9yYW5nZSAqcGlhcjsKKwkJcGlhciA9IHJiX2VudHJ5KG4sIHN0cnVjdCBwY2lfaW9fYWRkcl9yYW5nZSwgcmJfbm9kZSk7CisKKwkJaWYgKGFkZHIgPCBwaWFyLT5hZGRyX2xvKSB7CisJCQluID0gbi0+cmJfbGVmdDsKKwkJfSBlbHNlIHsKKwkJCWlmIChhZGRyID4gcGlhci0+YWRkcl9oaSkgeworCQkJCW4gPSBuLT5yYl9yaWdodDsKKwkJCX0gZWxzZSB7CisJCQkJcGNpX2Rldl9nZXQocGlhci0+cGNpZGV2KTsKKwkJCQlyZXR1cm4gcGlhci0+cGNpZGV2OworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogcGNpX2dldF9kZXZpY2VfYnlfYWRkciAtIEdldCBkZXZpY2UsIGdpdmVuIG9ubHkgYWRkcmVzcworICogQGFkZHI6IG1taW8gKFBJTykgcGh5cyBhZGRyZXNzIG9yIGkvbyBwb3J0IG51bWJlcgorICoKKyAqIEdpdmVuIGFuIG1taW8gcGh5cyBhZGRyZXNzLCBvciBhIHBvcnQgbnVtYmVyLCBmaW5kIGEgcGNpIGRldmljZQorICogdGhhdCBpbXBsZW1lbnRzIHRoaXMgYWRkcmVzcy4gIEJlIHN1cmUgdG8gcGNpX2Rldl9wdXQgdGhlIGRldmljZQorICogd2hlbiBmaW5pc2hlZC4gIEkvTyBwb3J0IG51bWJlcnMgYXJlIGFzc3VtZWQgdG8gYmUgb2Zmc2V0CisgKiBmcm9tIHplcm8gKHRoYXQgaXMsIHRoZXkgZG8gKm5vdCogaGF2ZSBwY2lfaW9fYWRkciBhZGRlZCBpbikuCisgKiBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoaW4gYW4gaW50ZXJydXB0LgorICovCitzdHJ1Y3QgcGNpX2RldiAqcGNpX2dldF9kZXZpY2VfYnlfYWRkcih1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9pb19hZGRyX2NhY2hlX3Jvb3QucGlhcl9sb2NrLCBmbGFncyk7CisJZGV2ID0gX19wY2lfZ2V0X2RldmljZV9ieV9hZGRyKGFkZHIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaV9pb19hZGRyX2NhY2hlX3Jvb3QucGlhcl9sb2NrLCBmbGFncyk7CisJcmV0dXJuIGRldjsKK30KKworI2lmZGVmIERFQlVHCisvKgorICogSGFuZHktZGFuZHkgZGVidWcgcHJpbnQgcm91dGluZSwgZG9lcyBub3RoaW5nIG1vcmUKKyAqIHRoYW4gcHJpbnQgb3V0IHRoZSBjb250ZW50cyBvZiBvdXIgYWRkciBjYWNoZS4KKyAqLworc3RhdGljIHZvaWQgcGNpX2FkZHJfY2FjaGVfcHJpbnQoc3RydWN0IHBjaV9pb19hZGRyX2NhY2hlICpjYWNoZSkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbjsKKwlpbnQgY250ID0gMDsKKworCW4gPSByYl9maXJzdCgmY2FjaGUtPnJiX3Jvb3QpOworCXdoaWxlIChuKSB7CisJCXN0cnVjdCBwY2lfaW9fYWRkcl9yYW5nZSAqcGlhcjsKKwkJcGlhciA9IHJiX2VudHJ5KG4sIHN0cnVjdCBwY2lfaW9fYWRkcl9yYW5nZSwgcmJfbm9kZSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJQQ0k6ICVzIGFkZHIgcmFuZ2UgJWQgWyVseC0lbHhdOiAlc1xuIiwKKwkJICAgICAgIChwaWFyLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pID8gImkvbyIgOiAibWVtIiwgY250LAorCQkgICAgICAgcGlhci0+YWRkcl9sbywgcGlhci0+YWRkcl9oaSwgcGNpX25hbWUocGlhci0+cGNpZGV2KSk7CisJCWNudCsrOworCQluID0gcmJfbmV4dChuKTsKKwl9Cit9CisjZW5kaWYKKworLyogSW5zZXJ0IGFkZHJlc3MgcmFuZ2UgaW50byB0aGUgcmIgdHJlZS4gKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2lvX2FkZHJfcmFuZ2UgKgorcGNpX2FkZHJfY2FjaGVfaW5zZXJ0KHN0cnVjdCBwY2lfZGV2ICpkZXYsIHVuc2lnbmVkIGxvbmcgYWxvLAorCQkgICAgICB1bnNpZ25lZCBsb25nIGFoaSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZwY2lfaW9fYWRkcl9jYWNoZV9yb290LnJiX3Jvb3QucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2lvX2FkZHJfcmFuZ2UgKnBpYXI7CisKKwkvKiBXYWxrIHRyZWUsIGZpbmQgYSBwbGFjZSB0byBpbnNlcnQgaW50byB0cmVlICovCisJd2hpbGUgKCpwKSB7CisJCXBhcmVudCA9ICpwOworCQlwaWFyID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgcGNpX2lvX2FkZHJfcmFuZ2UsIHJiX25vZGUpOworCQlpZiAoYWhpIDwgcGlhci0+YWRkcl9sbykgeworCQkJcCA9ICZwYXJlbnQtPnJiX2xlZnQ7CisJCX0gZWxzZSBpZiAoYWxvID4gcGlhci0+YWRkcl9oaSkgeworCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCQl9IGVsc2UgeworCQkJaWYgKGRldiAhPSBwaWFyLT5wY2lkZXYgfHwKKwkJCSAgICBhbG8gIT0gcGlhci0+YWRkcl9sbyB8fCBhaGkgIT0gcGlhci0+YWRkcl9oaSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBJQVI6IG92ZXJsYXBwaW5nIGFkZHJlc3MgcmFuZ2VcbiIpOworCQkJfQorCQkJcmV0dXJuIHBpYXI7CisJCX0KKwl9CisJcGlhciA9IChzdHJ1Y3QgcGNpX2lvX2FkZHJfcmFuZ2UgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGNpX2lvX2FkZHJfcmFuZ2UpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXBpYXIpCisJCXJldHVybiBOVUxMOworCisJcGlhci0+YWRkcl9sbyA9IGFsbzsKKwlwaWFyLT5hZGRyX2hpID0gYWhpOworCXBpYXItPnBjaWRldiA9IGRldjsKKwlwaWFyLT5mbGFncyA9IGZsYWdzOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAiUElBUjogaW5zZXJ0IHJhbmdlPVslbHg6JWx4XSBkZXY9JXNcbiIsCisJICAgICAgICAgICAgICAgICAgYWxvLCBhaGksIHBjaV9uYW1lIChkZXYpKTsKKyNlbmRpZgorCisJcmJfbGlua19ub2RlKCZwaWFyLT5yYl9ub2RlLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmcGlhci0+cmJfbm9kZSwgJnBjaV9pb19hZGRyX2NhY2hlX3Jvb3QucmJfcm9vdCk7CisKKwlyZXR1cm4gcGlhcjsKK30KKworc3RhdGljIHZvaWQgX19wY2lfYWRkcl9jYWNoZV9pbnNlcnRfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKKwlzdHJ1Y3QgcGNpX2RuICpwZG47CisJaW50IGk7CisJaW50IGluc2VydGVkID0gMDsKKworCWRuID0gcGNpX2RldmljZV90b19PRl9ub2RlKGRldik7CisJaWYgKCFkbikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IG5vIHBjaSBkbiBmb3VuZCBmb3IgZGV2PSVzXG4iLCBwY2lfbmFtZShkZXYpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFNraXAgYW55IGRldmljZXMgZm9yIHdoaWNoIEVFSCBpcyBub3QgZW5hYmxlZC4gKi8KKwlwZG4gPSBQQ0lfRE4oZG4pOworCWlmICghKHBkbi0+ZWVoX21vZGUgJiBFRUhfTU9ERV9TVVBQT1JURUQpIHx8CisJICAgIHBkbi0+ZWVoX21vZGUgJiBFRUhfTU9ERV9OT0NIRUNLKSB7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBza2lwIGJ1aWxkaW5nIGFkZHJlc3MgY2FjaGUgZm9yPSVzIC0gJXNcbiIsCisJCSAgICAgICBwY2lfbmFtZShkZXYpLCBwZG4tPm5vZGUtPmZ1bGxfbmFtZSk7CisjZW5kaWYKKwkJcmV0dXJuOworCX0KKworCS8qIFRoZSBjYWNoZSBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgZGV2aWNlLi4uICovCisJcGNpX2Rldl9nZXQoZGV2KTsKKworCS8qIFdhbGsgcmVzb3VyY2VzIG9uIHRoaXMgZGV2aWNlLCBwb2tlIHRoZW0gaW50byB0aGUgdHJlZSAqLworCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldixpKTsKKwkJdW5zaWduZWQgbG9uZyBlbmQgPSBwY2lfcmVzb3VyY2VfZW5kKGRldixpKTsKKwkJdW5zaWduZWQgaW50IGZsYWdzID0gcGNpX3Jlc291cmNlX2ZsYWdzKGRldixpKTsKKworCQkvKiBXZSBhcmUgaW50ZXJlc3RlZCBvbmx5IGJ1cyBhZGRyZXNzZXMsIG5vdCBkbWEgb3Igb3RoZXIgc3R1ZmYgKi8KKwkJaWYgKDAgPT0gKGZsYWdzICYgKElPUkVTT1VSQ0VfSU8gfCBJT1JFU09VUkNFX01FTSkpKQorCQkJY29udGludWU7CisJCWlmIChzdGFydCA9PSAwIHx8IH5zdGFydCA9PSAwIHx8IGVuZCA9PSAwIHx8IH5lbmQgPT0gMCkKKwkJCSBjb250aW51ZTsKKwkJcGNpX2FkZHJfY2FjaGVfaW5zZXJ0KGRldiwgc3RhcnQsIGVuZCwgZmxhZ3MpOworCQlpbnNlcnRlZCA9IDE7CisJfQorCisJLyogSWYgdGhlcmUgd2FzIG5vdGhpbmcgdG8gYWRkLCB0aGUgY2FjaGUgaGFzIG5vIHJlZmVyZW5jZS4uLiAqLworCWlmICghaW5zZXJ0ZWQpCisJCXBjaV9kZXZfcHV0KGRldik7Cit9CisKKy8qKgorICogcGNpX2FkZHJfY2FjaGVfaW5zZXJ0X2RldmljZSAtIEFkZCBhIGRldmljZSB0byB0aGUgYWRkcmVzcyBjYWNoZQorICogQGRldjogUENJIGRldmljZSB3aG9zZSBJL08gYWRkcmVzc2VzIHdlIGFyZSBpbnRlcmVzdGVkIGluLgorICoKKyAqIEluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIGZhc3QgbG9va3VwIG9mIGRldmljZXMgYmFzZWQgb24gYWRkcmVzc2VzLAorICogd2UgbWFpbnRhaW4gYSBjYWNoZSBvZiBkZXZpY2VzIHRoYXQgY2FuIGJlIHF1aWNrbHkgc2VhcmNoZWQuCisgKiBUaGlzIHJvdXRpbmUgYWRkcyBhIGRldmljZSB0byB0aGF0IGNhY2hlLgorICovCit2b2lkIHBjaV9hZGRyX2NhY2hlX2luc2VydF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9pb19hZGRyX2NhY2hlX3Jvb3QucGlhcl9sb2NrLCBmbGFncyk7CisJX19wY2lfYWRkcl9jYWNoZV9pbnNlcnRfZGV2aWNlKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpX2lvX2FkZHJfY2FjaGVfcm9vdC5waWFyX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fcGNpX2FkZHJfY2FjaGVfcmVtb3ZlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCByYl9ub2RlICpuOworCWludCByZW1vdmVkID0gMDsKKworcmVzdGFydDoKKwluID0gcmJfZmlyc3QoJnBjaV9pb19hZGRyX2NhY2hlX3Jvb3QucmJfcm9vdCk7CisJd2hpbGUgKG4pIHsKKwkJc3RydWN0IHBjaV9pb19hZGRyX3JhbmdlICpwaWFyOworCQlwaWFyID0gcmJfZW50cnkobiwgc3RydWN0IHBjaV9pb19hZGRyX3JhbmdlLCByYl9ub2RlKTsKKworCQlpZiAocGlhci0+cGNpZGV2ID09IGRldikgeworCQkJcmJfZXJhc2UobiwgJnBjaV9pb19hZGRyX2NhY2hlX3Jvb3QucmJfcm9vdCk7CisJCQlyZW1vdmVkID0gMTsKKwkJCWtmcmVlKHBpYXIpOworCQkJZ290byByZXN0YXJ0OworCQl9CisJCW4gPSByYl9uZXh0KG4pOworCX0KKworCS8qIFRoZSBjYWNoZSBubyBsb25nZXIgaG9sZHMgaXRzIHJlZmVyZW5jZSB0byB0aGlzIGRldmljZS4uLiAqLworCWlmIChyZW1vdmVkKQorCQlwY2lfZGV2X3B1dChkZXYpOworfQorCisvKioKKyAqIHBjaV9hZGRyX2NhY2hlX3JlbW92ZV9kZXZpY2UgLSByZW1vdmUgcGNpIGRldmljZSBmcm9tIGFkZHIgY2FjaGUKKyAqIEBkZXY6IGRldmljZSB0byByZW1vdmUKKyAqCisgKiBSZW1vdmUgYSBkZXZpY2UgZnJvbSB0aGUgYWRkci1jYWNoZSB0cmVlLgorICogVGhpcyBpcyBwb3RlbnRpYWxseSBleHBlbnNpdmUsIHNpbmNlIGl0IHdpbGwgd2FsaworICogdGhlIHRyZWUgbXVsdGlwbGUgdGltZXMgKG9uY2UgcGVyIHJlc291cmNlKS4KKyAqIEJ1dCBzbyB3aGF0OyBkZXZpY2UgcmVtb3ZhbCBkb2Vzbid0IG5lZWQgdG8gYmUgdGhhdCBmYXN0LgorICovCit2b2lkIHBjaV9hZGRyX2NhY2hlX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9pb19hZGRyX2NhY2hlX3Jvb3QucGlhcl9sb2NrLCBmbGFncyk7CisJX19wY2lfYWRkcl9jYWNoZV9yZW1vdmVfZGV2aWNlKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpX2lvX2FkZHJfY2FjaGVfcm9vdC5waWFyX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBwY2lfYWRkcl9jYWNoZV9idWlsZCAtIEJ1aWxkIGEgY2FjaGUgb2YgSS9PIGFkZHJlc3NlcworICoKKyAqIEJ1aWxkIGEgY2FjaGUgb2YgcGNpIGkvbyBhZGRyZXNzZXMuICBUaGlzIGNhY2hlIHdpbGwgYmUgdXNlZCB0bworICogZmluZCB0aGUgcGNpIGRldmljZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgZ2l2ZW4gYWRkcmVzcy4KKyAqIFRoaXMgcm91dGluZSBzY2FucyBhbGwgcGNpIGJ1c3NlcyB0byBidWlsZCB0aGUgY2FjaGUuCisgKiBNdXN0IGJlIHJ1biBsYXRlIGluIGJvb3QgcHJvY2VzcywgYWZ0ZXIgdGhlIHBjaSBjb250cm9sbGVycworICogaGF2ZSBiZWVuIHNjYW5lZCBmb3IgZGV2aWNlcyAoYWZ0ZXIgYWxsIGRldmljZSByZXNvdXJjZXMgYXJlIGtub3duKS4KKyAqLwordm9pZCBfX2luaXQgcGNpX2FkZHJfY2FjaGVfYnVpbGQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCisJc3Bpbl9sb2NrX2luaXQoJnBjaV9pb19hZGRyX2NhY2hlX3Jvb3QucGlhcl9sb2NrKTsKKworCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSkgIT0gTlVMTCkgeworCQkvKiBJZ25vcmUgUENJIGJyaWRnZXMgKi8KKwkJaWYgKChkZXYtPmNsYXNzID4+IDE2KSA9PSBQQ0lfQkFTRV9DTEFTU19CUklER0UpCisJCQljb250aW51ZTsKKworCQlwY2lfYWRkcl9jYWNoZV9pbnNlcnRfZGV2aWNlKGRldik7CisKKwkJZG4gPSBwY2lfZGV2aWNlX3RvX09GX25vZGUoZGV2KTsKKwkJcGNpX2Rldl9nZXQgKGRldik7ICAvKiBtYXRjaGluZyBwdXQgaXMgaW4gZWVoX3JlbW92ZV9kZXZpY2UoKSAqLworCQlQQ0lfRE4oZG4pLT5wY2lkZXYgPSBkZXY7CisJfQorCisjaWZkZWYgREVCVUcKKwkvKiBWZXJpZnkgdHJlZSBidWlsdCB1cCBhYm92ZSwgZWNobyBiYWNrIHRoZSBsaXN0IG9mIGFkZHJzLiAqLworCXBjaV9hZGRyX2NhY2hlX3ByaW50KCZwY2lfaW9fYWRkcl9jYWNoZV9yb290KTsKKyNlbmRpZgorfQorCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2RyaXZlci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9kcml2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzczMzcyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9kcml2ZXIuYwpAQCAtMCwwICsxLDM3NiBAQAorLyoKKyAqIFBDSSBFcnJvciBSZWNvdmVyeSBEcml2ZXIgZm9yIFJQQS1jb21wbGlhbnQgUFBDNjQgcGxhdGZvcm0uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgTGluYXMgVmVwc3RhcyA8bGluYXNAbGluYXMub3JnPgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogU2VuZCBmZWVkYmFjayB0byA8bGluYXNAdXMuaWJtLmNvbT4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8YXNtL2VlaC5oPgorI2luY2x1ZGUgPGFzbS9lZWhfZXZlbnQuaD4KKyNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vcnRhcy5oPgorCisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqIHBjaWRfbmFtZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaWYgKHBkZXYtPmRldi5kcml2ZXIpCisJCXJldHVybiBwZGV2LT5kZXYuZHJpdmVyLT5uYW1lOworCXJldHVybiAiIjsKK30KKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCBwcmludF9kZXZpY2Vfbm9kZV90cmVlIChzdHJ1Y3QgcGNpX2RuICpwZG4sIGludCBkZW50KQoreworCWludCBpOworCWlmICghcGRuKSByZXR1cm47CisJZm9yIChpPTA7aTxkZW50OyBpKyspCisJCXByaW50aygiICIpOworCXByaW50aygiZG49JXMgbW9kZT0leCBcdGNmZ19hZGRyPSV4IHBlX2FkZHI9JXggXHRmdWxsPSVzXG4iLAorCQlwZG4tPm5vZGUtPm5hbWUsIHBkbi0+ZWVoX21vZGUsIHBkbi0+ZWVoX2NvbmZpZ19hZGRyLAorCQlwZG4tPmVlaF9wZV9jb25maWdfYWRkciwgcGRuLT5ub2RlLT5mdWxsX25hbWUpOworCWRlbnQgKz0gMzsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBjID0gcGRuLT5ub2RlLT5jaGlsZDsKKwl3aGlsZSAocGMpIHsKKwkJcHJpbnRfZGV2aWNlX25vZGVfdHJlZShQQ0lfRE4ocGMpLCBkZW50KTsKKwkJcGMgPSBwYy0+c2libGluZzsKKwl9Cit9CisjZW5kaWYKKworLyoqIAorICogaXJxX2luX3VzZSAtIHJldHVybiB0cnVlIGlmIHRoaXMgaXJxIGlzIGJlaW5nIHVzZWQgCisgKi8KK3N0YXRpYyBpbnQgaXJxX2luX3VzZSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWludCByYyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgIHN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKKwlpZiAoZGVzYy0+YWN0aW9uKQorCQlyYyA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOworCXJldHVybiByYzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqIGVlaF9yZXBvcnRfZXJyb3IgLSByZXBvcnQgYW4gRUVIIGVycm9yIHRvIGVhY2ggZGV2aWNlLAorICogIGNvbGxlY3QgdXAgYW5kIG1lcmdlIHRoZSBkZXZpY2UgcmVzcG9uc2VzLgorICovCisKK3N0YXRpYyB2b2lkIGVlaF9yZXBvcnRfZXJyb3Ioc3RydWN0IHBjaV9kZXYgKmRldiwgdm9pZCAqdXNlcmRhdGEpCit7CisJZW51bSBwY2lfZXJzX3Jlc3VsdCByYywgKnJlcyA9IHVzZXJkYXRhOworCXN0cnVjdCBwY2lfZHJpdmVyICpkcml2ZXIgPSBkZXYtPmRyaXZlcjsKKworCWRldi0+ZXJyb3Jfc3RhdGUgPSBwY2lfY2hhbm5lbF9pb19mcm96ZW47CisKKwlpZiAoIWRyaXZlcikKKwkJcmV0dXJuOworCisJaWYgKGlycV9pbl91c2UgKGRldi0+aXJxKSkgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gcGNpX2RldmljZV90b19PRl9ub2RlKGRldik7CisJCVBDSV9ETihkbiktPmVlaF9tb2RlIHw9IEVFSF9NT0RFX0lSUV9ESVNBQkxFRDsKKwkJZGlzYWJsZV9pcnFfbm9zeW5jKGRldi0+aXJxKTsKKwl9CisJaWYgKCFkcml2ZXItPmVycl9oYW5kbGVyKQorCQlyZXR1cm47CisJaWYgKCFkcml2ZXItPmVycl9oYW5kbGVyLT5lcnJvcl9kZXRlY3RlZCkKKwkJcmV0dXJuOworCisJcmMgPSBkcml2ZXItPmVycl9oYW5kbGVyLT5lcnJvcl9kZXRlY3RlZCAoZGV2LCBwY2lfY2hhbm5lbF9pb19mcm96ZW4pOworCWlmICgqcmVzID09IFBDSV9FUlNfUkVTVUxUX05PTkUpICpyZXMgPSByYzsKKwlpZiAoKnJlcyA9PSBQQ0lfRVJTX1JFU1VMVF9ORUVEX1JFU0VUKSByZXR1cm47CisJaWYgKCpyZXMgPT0gUENJX0VSU19SRVNVTFRfRElTQ09OTkVDVCAmJgorCSAgICAgcmMgPT0gUENJX0VSU19SRVNVTFRfTkVFRF9SRVNFVCkgKnJlcyA9IHJjOworfQorCisvKiogZWVoX3JlcG9ydF9yZXNldCAtLSB0ZWxsIHRoaXMgZGV2aWNlIHRoYXQgdGhlIHBjaSBzbG90CisgKiAgaGFzIGJlZW4gcmVzZXQuCisgKi8KKworc3RhdGljIHZvaWQgZWVoX3JlcG9ydF9yZXNldChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB2b2lkICp1c2VyZGF0YSkKK3sKKwlzdHJ1Y3QgcGNpX2RyaXZlciAqZHJpdmVyID0gZGV2LT5kcml2ZXI7CisJc3RydWN0IGRldmljZV9ub2RlICpkbiA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShkZXYpOworCisJaWYgKCFkcml2ZXIpCisJCXJldHVybjsKKworCWlmICgoUENJX0ROKGRuKS0+ZWVoX21vZGUpICYgRUVIX01PREVfSVJRX0RJU0FCTEVEKSB7CisJCVBDSV9ETihkbiktPmVlaF9tb2RlICY9IH5FRUhfTU9ERV9JUlFfRElTQUJMRUQ7CisJCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCX0KKwlpZiAoIWRyaXZlci0+ZXJyX2hhbmRsZXIpCisJCXJldHVybjsKKwlpZiAoIWRyaXZlci0+ZXJyX2hhbmRsZXItPnNsb3RfcmVzZXQpCisJCXJldHVybjsKKworCWRyaXZlci0+ZXJyX2hhbmRsZXItPnNsb3RfcmVzZXQoZGV2KTsKK30KKworc3RhdGljIHZvaWQgZWVoX3JlcG9ydF9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKmRldiwgdm9pZCAqdXNlcmRhdGEpCit7CisJc3RydWN0IHBjaV9kcml2ZXIgKmRyaXZlciA9IGRldi0+ZHJpdmVyOworCisJZGV2LT5lcnJvcl9zdGF0ZSA9IHBjaV9jaGFubmVsX2lvX25vcm1hbDsKKworCWlmICghZHJpdmVyKQorCQlyZXR1cm47CisJaWYgKCFkcml2ZXItPmVycl9oYW5kbGVyKQorCQlyZXR1cm47CisJaWYgKCFkcml2ZXItPmVycl9oYW5kbGVyLT5yZXN1bWUpCisJCXJldHVybjsKKworCWRyaXZlci0+ZXJyX2hhbmRsZXItPnJlc3VtZShkZXYpOworfQorCitzdGF0aWMgdm9pZCBlZWhfcmVwb3J0X2ZhaWx1cmUoc3RydWN0IHBjaV9kZXYgKmRldiwgdm9pZCAqdXNlcmRhdGEpCit7CisJc3RydWN0IHBjaV9kcml2ZXIgKmRyaXZlciA9IGRldi0+ZHJpdmVyOworCisJZGV2LT5lcnJvcl9zdGF0ZSA9IHBjaV9jaGFubmVsX2lvX3Blcm1fZmFpbHVyZTsKKworCWlmICghZHJpdmVyKQorCQlyZXR1cm47CisKKwlpZiAoaXJxX2luX3VzZSAoZGV2LT5pcnEpKSB7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4gPSBwY2lfZGV2aWNlX3RvX09GX25vZGUoZGV2KTsKKwkJUENJX0ROKGRuKS0+ZWVoX21vZGUgfD0gRUVIX01PREVfSVJRX0RJU0FCTEVEOworCQlkaXNhYmxlX2lycV9ub3N5bmMoZGV2LT5pcnEpOworCX0KKwlpZiAoIWRyaXZlci0+ZXJyX2hhbmRsZXIpCisJCXJldHVybjsKKwlpZiAoIWRyaXZlci0+ZXJyX2hhbmRsZXItPmVycm9yX2RldGVjdGVkKQorCQlyZXR1cm47CisJZHJpdmVyLT5lcnJfaGFuZGxlci0+ZXJyb3JfZGV0ZWN0ZWQoZGV2LCBwY2lfY2hhbm5lbF9pb19wZXJtX2ZhaWx1cmUpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKioKKyAqIGhhbmRsZV9lZWhfZXZlbnRzIC0tIHJlc2V0IGEgUENJIGRldmljZSBhZnRlciBoYXJkIGxvY2t1cC4KKyAqCisgKiBwU2VyaWVzIHN5c3RlbXMgd2lsbCBpc29sYXRlIGEgUENJIHNsb3QgaWYgdGhlIFBDSS1Ib3N0CisgKiBicmlkZ2UgZGV0ZWN0cyBhZGRyZXNzIG9yIGRhdGEgcGFyaXR5IGVycm9ycywgRE1BJ3MKKyAqIG9jY3VyaW5nIHRvIHdpbGQgYWRkcmVzc2VzICh3aGljaCB1c3VhbGx5IGhhcHBlbiBkdWUgdG8KKyAqIGJ1Z3MgaW4gZGV2aWNlIGRyaXZlcnMgb3IgaW4gUENJIGFkYXB0ZXIgZmlybXdhcmUpLgorICogU2xvdCBpc29sYXRpb25zIGFsc28gb2NjdXIgaWYgI1NFUlIsICNQRVJSIG9yIG90aGVyIG1pc2MKKyAqIFBDSS1yZWxhdGVkIGVycm9ycyBhcmUgZGV0ZWN0ZWQuCisgKgorICogUmVjb3ZlcnkgcHJvY2VzcyBjb25zaXN0cyBvZiB1bnBsdWdnaW5nIHRoZSBkZXZpY2UgZHJpdmVyCisgKiAod2hpY2ggZ2VuZXJhdGVkIGhvdHBsdWcgZXZlbnRzIHRvIHVzZXJzcGFjZSksIHRoZW4gaXNzdWluZworICogYSBQQ0kgI1JTVCB0byB0aGUgZGV2aWNlLCB0aGVuIHJlY29uZmlndXJpbmcgdGhlIFBDSSBjb25maWcKKyAqIHNwYWNlIGZvciBhbGwgYnJpZGdlcyAmIGRldmljZXMgdW5kZXIgdGhpcyBzbG90LCBhbmQgdGhlbgorICogZmluYWxseSByZXN0YXJ0aW5nIHRoZSBkZXZpY2UgZHJpdmVycyAod2hpY2ggY2F1c2UgYSBzZWNvbmQKKyAqIHNldCBvZiBob3RwbHVnIGV2ZW50cyB0byBnbyBvdXQgdG8gdXNlcnNwYWNlKS4KKyAqLworCisvKioKKyAqIGVlaF9yZXNldF9kZXZpY2UoKSAtLSBwZXJmb3JtIGFjdHVhbCByZXNldCBvZiBhIHBjaSBzbG90CisgKiBBcmdzOiBidXM6IHBvaW50ZXIgdG8gdGhlIHBjaSBidXMgc3RydWN0dXJlIGNvcnJlc3BvbmRpbmcKKyAqICAgICAgICAgICAgdG8gdGhlIGlzb2xhdGVkIHNsb3QuIEEgbm9uLW51bGwgdmFsdWUgd2lsbAorICogICAgICAgICAgICBjYXVzZSBhbGwgZGV2aWNlcyB1bmRlciB0aGUgYnVzIHRvIGJlIHJlbW92ZWQKKyAqICAgICAgICAgICAgYW5kIHRoZW4gcmUtYWRkZWQuCisgKiAgICAgcGVfZG46IHBvaW50ZXIgdG8gYSAiUGFydGlvbmFibGUgRW5kcG9pbnQiIGRldmljZSBub2RlLgorICogICAgICAgICAgICBUaGlzIGlzIHRoZSB0b3AtbGV2ZWwgc3RydWN0dXJlIG9uIHdoaWNoIHBjaQorICogICAgICAgICAgICBidXMgcmVzZXRzIGNhbiBiZSBwZXJmb3JtZWQuCisgKi8KKworc3RhdGljIGludCBlZWhfcmVzZXRfZGV2aWNlIChzdHJ1Y3QgcGNpX2RuICpwZV9kbiwgc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlpbnQgcmM7CisJaWYgKGJ1cykKKwkJcGNpYmlvc19yZW1vdmVfcGNpX2RldmljZXMoYnVzKTsKKworCS8qIFJlc2V0IHRoZSBwY2kgY29udHJvbGxlci4gKEFzc2VydHMgUlNUIzsgcmVzZXRzIGNvbmZpZyBzcGFjZSkuCisJICogUmVjb25maWd1cmUgYnJpZGdlcyBhbmQgZGV2aWNlcy4gRG9uJ3QgdHJ5IHRvIGJyaW5nIHRoZSBzeXN0ZW0KKwkgKiB1cCBpZiB0aGUgcmVzZXQgZmFpbGVkIGZvciBzb21lIHJlYXNvbi4gKi8KKwlyYyA9IHJ0YXNfc2V0X3Nsb3RfcmVzZXQocGVfZG4pOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisgCS8qIE5ldy1zdHlsZSBjb25maWcgYWRkcnMgbWlnaHQgYmUgc2hhcmVkIGFjcm9zcyBtdWx0aXBsZSBkZXZpY2VzLAorIAkgKiBXYWxrIG92ZXIgYWxsIGZ1bmN0aW9ucyBvbiB0aGlzIGRldmljZSAqLworIAlpZiAocGVfZG4tPmVlaF9wZV9jb25maWdfYWRkcikgeworIAkJc3RydWN0IGRldmljZV9ub2RlICpwZSA9IHBlX2RuLT5ub2RlOworIAkJcGUgPSBwZS0+cGFyZW50LT5jaGlsZDsKKyAJCXdoaWxlIChwZSkgeworIAkJCXN0cnVjdCBwY2lfZG4gKnBwZSA9IFBDSV9ETihwZSk7CisgCQkJaWYgKHBlX2RuLT5lZWhfcGVfY29uZmlnX2FkZHIgPT0gcHBlLT5lZWhfcGVfY29uZmlnX2FkZHIpIHsKKyAJCQkJcnRhc19jb25maWd1cmVfYnJpZGdlKHBwZSk7CisgCQkJCWVlaF9yZXN0b3JlX2JhcnMocHBlKTsKKyAJCQl9CisgCQkJcGUgPSBwZS0+c2libGluZzsKKyAJCX0KKyAJfSBlbHNlIHsKKyAJCXJ0YXNfY29uZmlndXJlX2JyaWRnZShwZV9kbik7CisgCQllZWhfcmVzdG9yZV9iYXJzKHBlX2RuKTsKKyAJfQorCisJLyogR2l2ZSB0aGUgc3lzdGVtIDUgc2Vjb25kcyB0byBmaW5pc2ggcnVubmluZyB0aGUgdXNlci1zcGFjZQorCSAqIGhvdHBsdWcgc2h1dGRvd24gc2NyaXB0cywgZS5nLiBpZmRvd24gZm9yIGV0aGVybmV0LiAgWWVzLCAKKwkgKiB0aGlzIGlzIGEgaGFjaywgYnV0IGlmIHdlIGRvbid0IGRvIHRoaXMsIGFuZCB0cnkgdG8gYnJpbmcgCisJICogdGhlIGRldmljZSB1cCBiZWZvcmUgdGhlIHNjcmlwdHMgaGF2ZSB0YWtlbiBpdCBkb3duLCAKKwkgKiBwb3RlbnRpYWxseSB3ZWlyZCB0aGluZ3MgaGFwcGVuLgorCSAqLworCWlmIChidXMpIHsKKwkJc3NsZWVwICg1KTsKKwkJcGNpYmlvc19hZGRfcGNpX2RldmljZXMoYnVzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIGxvbmdlc3QgYW1vdW50IG9mIHRpbWUgdG8gd2FpdCBmb3IgYSBwY2kgZGV2aWNlCisgKiB0byBjb21lIGJhY2sgb24gbGluZSwgaW4gc2Vjb25kcy4KKyAqLworI2RlZmluZSBNQVhfV0FJVF9GT1JfUkVDT1ZFUlkgMTUKKwordm9pZCBoYW5kbGVfZWVoX2V2ZW50cyAoc3RydWN0IGVlaF9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpmcm96ZW5fZG47CisJc3RydWN0IHBjaV9kbiAqZnJvemVuX3BkbjsKKwlzdHJ1Y3QgcGNpX2J1cyAqZnJvemVuX2J1czsKKwlpbnQgcmMgPSAwOworCWVudW0gcGNpX2Vyc19yZXN1bHQgcmVzdWx0ID0gUENJX0VSU19SRVNVTFRfTk9ORTsKKworCWZyb3plbl9kbiA9IGZpbmRfZGV2aWNlX3BlKGV2ZW50LT5kbik7CisJZnJvemVuX2J1cyA9IHBjaWJpb3NfZmluZF9wY2lfYnVzKGZyb3plbl9kbik7CisKKwlpZiAoIWZyb3plbl9kbikgeworCQlwcmludGsoS0VSTl9FUlIgIkVFSDogRXJyb3I6IENhbm5vdCBmaW5kIHBhcnRpdGlvbiBlbmRwb2ludCBmb3IgJXNcbiIsCisJCSAgICAgICAgcGNpX25hbWUoZXZlbnQtPmRldikpOworCQlyZXR1cm47CisJfQorCisJLyogVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgc3R5bGVzIGZvciBjb21pbmcgdXAgd2l0aCB0aGUgUEUuCisJICogSW4gdGhlIG9sZCBzdHlsZSwgaXQgd2FzIHRoZSBoaWdoZXN0IEVFSC1jYXBhYmxlIGRldmljZQorCSAqIHdoaWNoIHdhcyBhbHdheXMgYW4gRUFEUyBwY2kgYnJpZGdlLiAgSW4gdGhlIG5ldyBzdHlsZSwKKwkgKiB0aGVyZSBtaWdodCBub3QgYmUgYW55IEVBRFMgYnJpZGdlcywgYW5kIGV2ZW4gd2hlbiB0aGVyZSBhcmUsCisJICogdGhlIGZpcm13YXJlIG1hcmtzIHRoZW0gYXMgIkVFSCBpbmNhcGFibGUiLiBTbyBhbm90aGVyCisJICogdHdvLXN0ZXAgaXMgbmVlZGVkIHRvIGZpbmQgdGhlIHBjaSBidXMuLiAqLworCWlmICghZnJvemVuX2J1cykKKwkJZnJvemVuX2J1cyA9IHBjaWJpb3NfZmluZF9wY2lfYnVzIChmcm96ZW5fZG4tPnBhcmVudCk7CisKKwlpZiAoIWZyb3plbl9idXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFRUg6IENhbm5vdCBmaW5kIFBDSSBidXMgZm9yICVzXG4iLAorCQkgICAgICAgIGZyb3plbl9kbi0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuOworCX0KKworI2lmIDAKKwkvKiBXZSBtYXkgZ2V0ICJwZXJtYW5lbnQgZmFpbHVyZSIgbWVzc2FnZXMgb24gZW1wdHkgc2xvdHMuCisJICogVGhlc2UgYXJlIGZhbHNlIGFsYXJtcy4gRW1wdHkgc2xvdHMgaGF2ZSBubyBjaGlsZCBkbi4gKi8KKwlpZiAoKGV2ZW50LT5zdGF0ZSA9PSBwY2lfY2hhbm5lbF9pb19wZXJtX2ZhaWx1cmUpICYmIChmcm96ZW5fZGV2aWNlID09IE5VTEwpKQorCQlyZXR1cm47CisjZW5kaWYKKworCWZyb3plbl9wZG4gPSBQQ0lfRE4oZnJvemVuX2RuKTsKKwlmcm96ZW5fcGRuLT5lZWhfZnJlZXplX2NvdW50Kys7CisJCisJaWYgKGZyb3plbl9wZG4tPmVlaF9mcmVlemVfY291bnQgPiBFRUhfTUFYX0FMTE9XRURfRlJFRVpFUykKKwkJZ290byBoYXJkX2ZhaWw7CisKKwkvKiBJZiB0aGUgcmVzZXQgc3RhdGUgaXMgYSAnNScgYW5kIHRoZSB0aW1lIHRvIHJlc2V0IGlzIDAgKGluZmluaXR5KQorCSAqIG9yIGlzIG1vcmUgdGhlbiAxNSBzZWNvbmRzLCB0aGVuIG1hcmsgdGhpcyBhcyBhIHBlcm1hbmVudCBmYWlsdXJlLgorCSAqLworCWlmICgoZXZlbnQtPnN0YXRlID09IHBjaV9jaGFubmVsX2lvX3Blcm1fZmFpbHVyZSkgJiYKKwkgICAgKChldmVudC0+dGltZV91bmF2YWlsIDw9IDApIHx8CisJICAgICAoZXZlbnQtPnRpbWVfdW5hdmFpbCA+IE1BWF9XQUlUX0ZPUl9SRUNPVkVSWSoxMDAwKSkpCisJCWdvdG8gaGFyZF9mYWlsOworCisJZWVoX3Nsb3RfZXJyb3JfZGV0YWlsKGZyb3plbl9wZG4sIDEgLyogVGVtcG9yYXJ5IEVycm9yICovKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HCisJICAgIkVFSDogVGhpcyBQQ0kgZGV2aWNlIGhhcyBmYWlsZWQgJWQgdGltZXMgc2luY2UgbGFzdCByZWJvb3Q6ICVzIC0gJXNcbiIsCisJCWZyb3plbl9wZG4tPmVlaF9mcmVlemVfY291bnQsCisJCXBjaV9uYW1lIChmcm96ZW5fcGRuLT5wY2lkZXYpLCAKKwkJcGNpZF9uYW1lKGZyb3plbl9wZG4tPnBjaWRldikpOworCisJLyogV2FsayB0aGUgdmFyaW91cyBkZXZpY2UgZHJpdmVycyBhdHRhY2hlZCB0byB0aGlzIHNsb3QgdGhyb3VnaAorCSAqIGEgcmVzZXQgc2VxdWVuY2UsIGdpdmluZyBlYWNoIGFuIG9wcG9ydHVuaXR5IHRvIGRvIHdoYXQgaXQgbmVlZHMKKwkgKiB0byBhY2NvbXBsaXNoIHRoZSByZXNldC4gIEVhY2ggY2hpbGQgZ2V0cyBhIHJlcG9ydCBvZiB0aGUKKwkgKiBzdGF0dXMgLi4uIGlmIGFueSBjaGlsZCBjYW4ndCBoYW5kbGUgdGhlIHJlc2V0LCB0aGVuIHRoZSBlbnRpcmUKKwkgKiBzbG90IGlzIGRscGFyIHJlbW92ZWQgYW5kIGFkZGVkLgorCSAqLworCXBjaV93YWxrX2J1cyhmcm96ZW5fYnVzLCBlZWhfcmVwb3J0X2Vycm9yLCAmcmVzdWx0KTsKKworCS8qIElmIGFsbCBkZXZpY2UgZHJpdmVycyB3ZXJlIEVFSC11bmF3YXJlLCB0aGVuIHNodXQKKwkgKiBkb3duIGFsbCBvZiB0aGUgZGV2aWNlIGRyaXZlcnMsIGFuZCBob3BlIHRoZXkKKwkgKiBnbyBkb3duIHdpbGxpbmdseSwgd2l0aG91dCBwYW5pY2luZyB0aGUgc3lzdGVtLgorCSAqLworCWlmIChyZXN1bHQgPT0gUENJX0VSU19SRVNVTFRfTk9ORSkgeworCQlyYyA9IGVlaF9yZXNldF9kZXZpY2UoZnJvemVuX3BkbiwgZnJvemVuX2J1cyk7CisJCWlmIChyYykKKwkJCWdvdG8gaGFyZF9mYWlsOworCX0KKworCS8qIElmIGFueSBkZXZpY2UgY2FsbGVkIG91dCBmb3IgYSByZXNldCwgdGhlbiByZXNldCB0aGUgc2xvdCAqLworCWlmIChyZXN1bHQgPT0gUENJX0VSU19SRVNVTFRfTkVFRF9SRVNFVCkgeworCQlyYyA9IGVlaF9yZXNldF9kZXZpY2UoZnJvemVuX3BkbiwgTlVMTCk7CisJCWlmIChyYykKKwkJCWdvdG8gaGFyZF9mYWlsOworCQlwY2lfd2Fsa19idXMoZnJvemVuX2J1cywgZWVoX3JlcG9ydF9yZXNldCwgMCk7CisJfQorCisJLyogSWYgYWxsIGRldmljZXMgcmVwb3J0ZWQgdGhleSBjYW4gcHJvY2VlZCwgdGhlIHJlLWVuYWJsZSBQSU8gKi8KKwlpZiAocmVzdWx0ID09IFBDSV9FUlNfUkVTVUxUX0NBTl9SRUNPVkVSKSB7CisJCS8qIFhYWCBOb3Qgc3VwcG9ydGVkOyB3ZSBicnV0ZS1mb3JjZSByZXNldCB0aGUgZGV2aWNlICovCisJCXJjID0gZWVoX3Jlc2V0X2RldmljZShmcm96ZW5fcGRuLCBOVUxMKTsKKwkJaWYgKHJjKQorCQkJZ290byBoYXJkX2ZhaWw7CisJCXBjaV93YWxrX2J1cyhmcm96ZW5fYnVzLCBlZWhfcmVwb3J0X3Jlc2V0LCAwKTsKKwl9CisKKwkvKiBUZWxsIGFsbCBkZXZpY2UgZHJpdmVycyB0aGF0IHRoZXkgY2FuIHJlc3VtZSBvcGVyYXRpb25zICovCisJcGNpX3dhbGtfYnVzKGZyb3plbl9idXMsIGVlaF9yZXBvcnRfcmVzdW1lLCAwKTsKKworCXJldHVybjsKKwkKK2hhcmRfZmFpbDoKKwkvKgorCSAqIEFib3V0IDkwJSBvZiBhbGwgcmVhbC1saWZlIEVFSCBmYWlsdXJlcyBpbiB0aGUgZmllbGQKKwkgKiBhcmUgZHVlIHRvIHBvb3JseSBzZWF0ZWQgUENJIGNhcmRzLiBPbmx5IDEwJSBvciBzbyBhcmUKKwkgKiBkdWUgdG8gYWN0dWFsLCBmYWlsZWQgY2FyZHMuCisJICovCisJcHJpbnRrKEtFUk5fRVJSCisJICAgIkVFSDogUENJIGRldmljZSAlcyAtICVzIGhhcyBmYWlsZWQgJWQgdGltZXMgXG4iCisJICAgImFuZCBoYXMgYmVlbiBwZXJtYW5lbnRseSBkaXNhYmxlZC4gIFBsZWFzZSB0cnkgcmVzZWF0aW5nXG4iCisJICAgInRoaXMgZGV2aWNlIG9yIHJlcGxhY2luZyBpdC5cbiIsCisJCXBjaV9uYW1lIChmcm96ZW5fcGRuLT5wY2lkZXYpLCAKKwkJcGNpZF9uYW1lKGZyb3plbl9wZG4tPnBjaWRldiksIAorCQlmcm96ZW5fcGRuLT5lZWhfZnJlZXplX2NvdW50KTsKKworCWVlaF9zbG90X2Vycm9yX2RldGFpbChmcm96ZW5fcGRuLCAyIC8qIFBlcm1hbmVudCBFcnJvciAqLyk7CisKKwkvKiBOb3RpZnkgYWxsIGRldmljZXMgdGhhdCB0aGV5J3JlIGFib3V0IHRvIGdvIGRvd24uICovCisJcGNpX3dhbGtfYnVzKGZyb3plbl9idXMsIGVlaF9yZXBvcnRfZmFpbHVyZSwgMCk7CisKKwkvKiBTaHV0IGRvd24gdGhlIGRldmljZSBkcml2ZXJzIGZvciBnb29kLiAqLworCXBjaWJpb3NfcmVtb3ZlX3BjaV9kZXZpY2VzKGZyb3plbl9idXMpOworfQorCisvKiAtLS0tLS0tLS0tIGVuZCBvZiBmaWxlIC0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZXZlbnQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZXZlbnQuYwppbmRleCA5MjQ5NzMzLi45YTk5NjFmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2V2ZW50LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9ldmVudC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGFzbS9lZWhfZXZlbnQuaD4KKyNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgogCiAvKiogT3ZlcnZpZXc6CiAgKiAgRUVIIGVycm9yIHN0YXRlcyBtYXkgYmUgZGV0ZWN0ZWQgd2l0aGluIGV4Y2VwdGlvbiBoYW5kbGVyczsKQEAgLTM3LDMxICszOCw2IEBACiBERUNMQVJFX1dPUksoZWVoX2V2ZW50X3dxLCBlZWhfdGhyZWFkX2xhdW5jaGVyLCBOVUxMKTsKIAogLyoqCi0gKiBlZWhfcGFuaWMgLSBjYWxsIHBhbmljKCkgZm9yIGFuIGVlaCBldmVudCB0aGF0IGNhbm5vdCBiZSBoYW5kbGVkLgotICogVGhlIHBoaWxvc29waHkgb2YgdGhpcyByb3V0aW5lIGlzIHRoYXQgaXQgaXMgYmV0dGVyIHRvIHBhbmljIGFuZAotICogaGFsdCB0aGUgT1MgdGhhbiBpdCBpcyB0byByaXNrIHBvc3NpYmxlIGRhdGEgY29ycnVwdGlvbiBieQotICogb2JsaXZpb3VzIGRldmljZSBkcml2ZXJzIHRoYXQgZG9uJ3Qga25vdyBiZXR0ZXIuCi0gKgotICogQGRldiBwY2kgZGV2aWNlIHRoYXQgaGFkIGFuIGVlaCBldmVudAotICogQHJlc2V0X3N0YXRlIGN1cnJlbnQgcmVzZXQgc3RhdGUgb2YgdGhlIGRldmljZSBzbG90Ci0gKi8KLXN0YXRpYyB2b2lkIGVlaF9wYW5pYyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcmVzZXRfc3RhdGUpCi17Ci0JLyoKLQkgKiBTaW5jZSB0aGUgcGFuaWNfb25fb29wcyBzeXNjdGwgaXMgdXNlZCB0byBoYWx0IHRoZSBzeXN0ZW0KLQkgKiBpbiBsaWdodCBvZiBwb3RlbnRpYWwgY29ycnVwdGlvbiwgd2UgY2FuIHVzZSBpdCBoZXJlLgotCSAqLwotCWlmIChwYW5pY19vbl9vb3BzKSB7Ci0JCXBhbmljKCJFRUg6IE1NSU8gZmFpbHVyZSAoJWQpIG9uIGRldmljZTolc1xuIiwgcmVzZXRfc3RhdGUsCi0JCSAgICAgIHBjaV9uYW1lKGRldikpOwotCX0KLQllbHNlIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRUVIOiBJZ25vcmVkIE1NSU8gZmFpbHVyZSAoJWQpIG9uIGRldmljZTolc1xuIiwKLQkJICAgICAgIHJlc2V0X3N0YXRlLCBwY2lfbmFtZShkZXYpKTsKLQl9Ci19Ci0KLS8qKgogICogZWVoX2V2ZW50X2hhbmRsZXIgLSBkaXNwYXRjaCBFRUggZXZlbnRzLiAgVGhlIGRldGVjdGlvbiBvZiBhIGZyb3plbgogICogc2xvdCBjYW4gb2NjdXIgaW5zaWRlIGFuIGludGVycnVwdCwgd2hlcmUgaXQgY2FuIGJlIGhhcmQgdG8gZG8KICAqIGFueXRoaW5nIGFib3V0IGl0LiAgVGhlIGdvYWwgb2YgdGhpcyByb3V0aW5lIGlzIHRvIHB1bGwgdGhlc2UKQEAgLTgyLDEwICs1OCwxNiBAQAogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZlZWhfZXZlbnRsaXN0X2xvY2ssIGZsYWdzKTsKIAkJZXZlbnQgPSBOVUxMOworCisJCS8qIFVucXVldWUgdGhlIGV2ZW50LCBnZXQgcmVhZHkgdG8gcHJvY2Vzcy4gKi8KIAkJaWYgKCFsaXN0X2VtcHR5KCZlZWhfZXZlbnRsaXN0KSkgewogCQkJZXZlbnQgPSBsaXN0X2VudHJ5KGVlaF9ldmVudGxpc3QubmV4dCwgc3RydWN0IGVlaF9ldmVudCwgbGlzdCk7CiAJCQlsaXN0X2RlbCgmZXZlbnQtPmxpc3QpOwogCQl9CisJCQorCQlpZiAoZXZlbnQpCisJCQllZWhfbWFya19zbG90KGV2ZW50LT5kbiwgRUVIX01PREVfUkVDT1ZFUklORyk7CisKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWVoX2V2ZW50bGlzdF9sb2NrLCBmbGFncyk7CiAJCWlmIChldmVudCA9PSBOVUxMKQogCQkJYnJlYWs7CkBAIC05Myw4ICs3NSwxMSBAQAogCQlwcmludGsoS0VSTl9JTkZPICJFRUg6IERldGVjdGVkIFBDSSBidXMgZXJyb3Igb24gZGV2aWNlICVzXG4iLAogCQkgICAgICAgcGNpX25hbWUoZXZlbnQtPmRldikpOwogCi0JCWVlaF9wYW5pYyAoZXZlbnQtPmRldiwgZXZlbnQtPnN0YXRlKTsKKwkJaGFuZGxlX2VlaF9ldmVudHMoZXZlbnQpOwogCisJCWVlaF9jbGVhcl9zbG90KGV2ZW50LT5kbiwgRUVIX01PREVfUkVDT1ZFUklORyk7CisKKwkJcGNpX2Rldl9wdXQoZXZlbnQtPmRldik7CiAJCWtmcmVlKGV2ZW50KTsKIAl9CiAKQEAgLTEyMiw3ICsxMDcsNyBAQAogICovCiBpbnQgZWVoX3NlbmRfZmFpbHVyZV9ldmVudCAoc3RydWN0IGRldmljZV9ub2RlICpkbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGNpX2RldiAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHBjaV9jaGFubmVsX3N0YXRlIHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lX3VuYXZhaWwpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odmNzZXJ2ZXIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odmNzZXJ2ZXIuYwppbmRleCA0ZDU4NDE3Li4yMmJmYjVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaHZjc2VydmVyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2h2Y3NlcnZlci5jCkBAIC00MCw3ICs0MCw3IEBACiAgKiBmdW5jdGlvbnMgYXJlbid0IHBlcmZvcm1hbmNlIHNlbnNpdGl2ZSwgc28gdGhpcyBjb252ZXJzaW9uIGlzbid0IGFuCiAgKiBpc3N1ZS4KICAqLwotaW50IGh2Y3NfY29udmVydChsb25nIHRvX2NvbnZlcnQpCitzdGF0aWMgaW50IGh2Y3NfY29udmVydChsb25nIHRvX2NvbnZlcnQpCiB7CiAJc3dpdGNoICh0b19jb252ZXJ0KSB7CiAJCWNhc2UgSF9TdWNjZXNzOgpAQCAtOTEsNyArOTEsNyBAQAogRVhQT1JUX1NZTUJPTChodmNzX2ZyZWVfcGFydG5lcl9pbmZvKTsKIAogLyogSGVscGVyIGZ1bmN0aW9uIGZvciBodmNzX2dldF9wYXJ0bmVyX2luZm8gKi8KLWludCBodmNzX25leHRfcGFydG5lcih1aW50MzJfdCB1bml0X2FkZHJlc3MsCitzdGF0aWMgaW50IGh2Y3NfbmV4dF9wYXJ0bmVyKHVpbnQzMl90IHVuaXRfYWRkcmVzcywKIAkJdW5zaWduZWQgbG9uZyBsYXN0X3BfcGFydGl0aW9uX0lELAogCQl1bnNpZ25lZCBsb25nIGxhc3RfcF91bml0X2FkZHJlc3MsIHVuc2lnbmVkIGxvbmcgKnBpX2J1ZmYpCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvbW11LmMKaW5kZXggMjA0MzY1OS4uNDhjZmJmYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvbW11LmMKQEAgLTUxLDggKzUxLDYgQEAKIAogI2RlZmluZSBEQkcoZm10Li4uKQogCi1leHRlcm4gaW50IGlzX3B5dGhvbihzdHJ1Y3QgZGV2aWNlX25vZGUgKik7Ci0KIHN0YXRpYyB2b2lkIHRjZV9idWlsZF9wU2VyaWVzKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBsb25nIGluZGV4LCAKIAkJCSAgICAgIGxvbmcgbnBhZ2VzLCB1bnNpZ25lZCBsb25nIHVhZGRyLCAKIAkJCSAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKQEAgLTQzNiw3ICs0MzQsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JcHBjaSA9IHBkbi0+ZGF0YTsKKwlwcGNpID0gUENJX0ROKHBkbik7CiAJaWYgKCFwcGNpLT5pb21tdV90YWJsZSkgewogCQkvKiBCdXNzdWJubyBoYXNuJ3QgYmVlbiBjb3BpZWQgeWV0LgogCQkgKiBEbyBpdCBub3cgYmVjYXVzZSBpb21tdV90YWJsZV9zZXRwYXJtc19scGFyIG5lZWRzIGl0LgpAQCAtNDgzLDEwICs0ODEsMTAgQEAKIAkgKiBhbiBhbHJlYWR5IGFsbG9jYXRlZCBpb21tdSB0YWJsZSBpcyBmb3VuZCBhbmQgdXNlIHRoYXQuCiAJICovCiAKLQl3aGlsZSAoZG4gJiYgZG4tPmRhdGEgJiYgUENJX0ROKGRuKS0+aW9tbXVfdGFibGUgPT0gTlVMTCkKKwl3aGlsZSAoZG4gJiYgUENJX0ROKGRuKSAmJiBQQ0lfRE4oZG4pLT5pb21tdV90YWJsZSA9PSBOVUxMKQogCQlkbiA9IGRuLT5wYXJlbnQ7CiAKLQlpZiAoZG4gJiYgZG4tPmRhdGEpIHsKKwlpZiAoZG4gJiYgUENJX0ROKGRuKSkgewogCQlQQ0lfRE4obXlkbiktPmlvbW11X3RhYmxlID0gUENJX0ROKGRuKS0+aW9tbXVfdGFibGU7CiAJfSBlbHNlIHsKIAkJREJHKCJpb21tdV9kZXZfc2V0dXBfcFNlcmllcywgZGV2ICVwICglcykgaGFzIG5vIGlvbW11IHRhYmxlXG4iLCBkZXYsIHBjaV9uYW1lKGRldikpOwpAQCAtNDk3LDcgKzQ5NSw3IEBACiB7CiAJaW50IGVyciA9IE5PVElGWV9PSzsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gbm9kZTsKLQlzdHJ1Y3QgcGNpX2RuICpwY2kgPSBucC0+ZGF0YTsKKwlzdHJ1Y3QgcGNpX2RuICpwY2kgPSBQQ0lfRE4obnApOwogCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIFBTRVJJRVNfUkVDT05GSUdfUkVNT1ZFOgpAQCAtNTMzLDcgKzUzMSw3IEBACiAJICovCiAJZG4gPSBwY2lfZGV2aWNlX3RvX09GX25vZGUoZGV2KTsKIAotCWZvciAocGRuID0gZG47IHBkbiAmJiBwZG4tPmRhdGEgJiYgIVBDSV9ETihwZG4pLT5pb21tdV90YWJsZTsKKwlmb3IgKHBkbiA9IGRuOyBwZG4gJiYgUENJX0ROKHBkbikgJiYgIVBDSV9ETihwZG4pLT5pb21tdV90YWJsZTsKIAkgICAgIHBkbiA9IHBkbi0+cGFyZW50KSB7CiAJCWRtYV93aW5kb3cgPSAodW5zaWduZWQgaW50ICopCiAJCQlnZXRfcHJvcGVydHkocGRuLCAiaWJtLGRtYS13aW5kb3ciLCBOVUxMKTsKQEAgLTU1Miw3ICs1NTAsNyBAQAogCQlEQkcoIkZvdW5kIERNQSB3aW5kb3csIGFsbG9jYXRpbmcgdGFibGVcbiIpOwogCX0KIAotCXBjaSA9IHBkbi0+ZGF0YTsKKwlwY2kgPSBQQ0lfRE4ocGRuKTsKIAlpZiAoIXBjaS0+aW9tbXVfdGFibGUpIHsKIAkJLyogaW9tbXVfdGFibGVfc2V0cGFybXNfbHBhciBuZWVkcyBidXNzdWJuby4gKi8KIAkJcGNpLT5idXNzdWJubyA9IHBjaS0+cGhiLT5idXMtPm51bWJlcjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jCmluZGV4IGNmMWJjMTEuLjg5NTI1MjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXIuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vbW11Lmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KQEAgLTYwLDcgKzYxLDcgQEAKIGludCB2dGVybW5vOwkvKiB2aXJ0dWFsIHRlcm1pbmFsIyBmb3IgdWRiZyAgKi8KIAogI2RlZmluZSBfX0FMSUdORURfXyBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhzaXplb2YobG9uZykpKSkKLXN0YXRpYyB2b2lkIHVkYmdfaHZzaV9wdXRjKHVuc2lnbmVkIGNoYXIgYykKK3N0YXRpYyB2b2lkIHVkYmdfaHZzaV9wdXRjKGNoYXIgYykKIHsKIAkvKiBwYWNrZXQncyBzZXFubyBpc24ndCB1c2VkIGFueXdheXMgKi8KIAl1aW50OF90IHBhY2tldFtdIF9fQUxJR05FRF9fID0geyAweGZmLCA1LCAwLCAwLCBjIH07CkBAIC0xMTEsNyArMTEyLDcgQEAKIAlyZXR1cm4gY2g7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHVkYmdfaHZzaV9nZXRjKHZvaWQpCitzdGF0aWMgaW50IHVkYmdfaHZzaV9nZXRjKHZvaWQpCiB7CiAJaW50IGNoOwogCWZvciAoOzspIHsKQEAgLTEyNyw3ICsxMjgsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgdWRiZ19wdXRjTFAodW5zaWduZWQgY2hhciBjKQorc3RhdGljIHZvaWQgdWRiZ19wdXRjTFAoY2hhciBjKQogewogCWNoYXIgYnVmWzE2XTsKIAl1bnNpZ25lZCBsb25nIHJjOwpAQCAtMTcyLDcgKzE3Myw3IEBACiAJcmV0dXJuIGNoOwogfQogCi1zdGF0aWMgdW5zaWduZWQgY2hhciB1ZGJnX2dldGNMUCh2b2lkKQorc3RhdGljIGludCB1ZGJnX2dldGNMUCh2b2lkKQogewogCWludCBjaDsKIAlmb3IgKDs7KSB7CkBAIC0xOTEsNyArMTkyLDcgQEAKIC8qIGNhbGwgdGhpcyBmcm9tIGVhcmx5X2luaXQoKSBmb3IgYSB3b3JraW5nIGRlYnVnIGNvbnNvbGUgb24KICAqIHZ0ZXJtIGNhcGFibGUgTFBBUiBtYWNoaW5lcwogICovCi12b2lkIHVkYmdfaW5pdF9kZWJ1Z19scGFyKHZvaWQpCit2b2lkIF9faW5pdCB1ZGJnX2luaXRfZGVidWdfbHBhcih2b2lkKQogewogCXZ0ZXJtbm8gPSAwOwogCXVkYmdfcHV0YyA9IHVkYmdfcHV0Y0xQOwpAQCAtMjAwLDczICsyMDEsNjQgQEAKIH0KIAogLyogcmV0dXJucyAwIGlmIGNvdWxkbid0IGZpbmQgb3IgdXNlIC9jaG9zZW4vc3Rkb3V0IGFzIGNvbnNvbGUgKi8KLWludCBmaW5kX3VkYmdfdnRlcm0odm9pZCkKK3ZvaWQgX19pbml0IGZpbmRfdWRiZ192dGVybSh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc3Rkb3V0X25vZGU7CiAJdTMyICp0ZXJtbm87CiAJY2hhciAqbmFtZTsKLQlpbnQgZm91bmQgPSAwOworCWludCBhZGRfY29uc29sZTsKIAogCS8qIGZpbmQgdGhlIGJvb3QgY29uc29sZSBmcm9tIC9jaG9zZW4vc3Rkb3V0ICovCiAJaWYgKCFvZl9jaG9zZW4pCi0JCXJldHVybiAwOworCQlyZXR1cm47CiAJbmFtZSA9IChjaGFyICopZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LHN0ZG91dC1wYXRoIiwgTlVMTCk7CiAJaWYgKG5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAlzdGRvdXRfbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKG5hbWUpOwogCWlmICghc3Rkb3V0X25vZGUpCi0JCXJldHVybiAwOwotCi0JLyogbm93IHdlIGhhdmUgdGhlIHN0ZG91dCBub2RlOyBmaWd1cmUgb3V0IHdoYXQgdHlwZSBvZiBkZXZpY2UgaXQgaXMuICovCisJCXJldHVybjsKIAluYW1lID0gKGNoYXIgKilnZXRfcHJvcGVydHkoc3Rkb3V0X25vZGUsICJuYW1lIiwgTlVMTCk7CiAJaWYgKCFuYW1lKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInN0ZG91dCBub2RlIG1pc3NpbmcgJ25hbWUnIHByb3BlcnR5IVxuIik7CiAJCWdvdG8gb3V0OwogCX0KKwkvKiBUaGUgdXNlciBoYXMgcmVxdWVzdGVkIGEgY29uc29sZSBzbyB0aGlzIGlzIGFscmVhZHkgc2V0IHVwLiAqLworCWFkZF9jb25zb2xlID0gIXN0cnN0cihjbWRfbGluZSwgImNvbnNvbGU9Iik7CiAKLQlpZiAoc3RybmNtcChuYW1lLCAidnR5IiwgMykgPT0gMCkgewotCQlpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUoc3Rkb3V0X25vZGUsICJodnRlcm0xIikpIHsKLQkJCXRlcm1ubyA9ICh1MzIgKilnZXRfcHJvcGVydHkoc3Rkb3V0X25vZGUsICJyZWciLCBOVUxMKTsKLQkJCWlmICh0ZXJtbm8pIHsKLQkJCQl2dGVybW5vID0gdGVybW5vWzBdOwotCQkJCXVkYmdfcHV0YyA9IHVkYmdfcHV0Y0xQOwotCQkJCXVkYmdfZ2V0YyA9IHVkYmdfZ2V0Y0xQOwotCQkJCXVkYmdfZ2V0Y19wb2xsID0gdWRiZ19nZXRjX3BvbGxMUDsKLQkJCQlmb3VuZCA9IDE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUoc3Rkb3V0X25vZGUsICJodnRlcm0tcHJvdG9jb2wiKSkgewotCQkJdGVybW5vID0gKHUzMiAqKWdldF9wcm9wZXJ0eShzdGRvdXRfbm9kZSwgInJlZyIsIE5VTEwpOwotCQkJaWYgKHRlcm1ubykgewotCQkJCXZ0ZXJtbm8gPSB0ZXJtbm9bMF07Ci0JCQkJdWRiZ19wdXRjID0gdWRiZ19odnNpX3B1dGM7Ci0JCQkJdWRiZ19nZXRjID0gdWRiZ19odnNpX2dldGM7Ci0JCQkJdWRiZ19nZXRjX3BvbGwgPSB1ZGJnX2h2c2lfZ2V0Y19wb2xsOwotCQkJCWZvdW5kID0gMTsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAoc3RybmNtcChuYW1lLCAic2VyaWFsIiwgNikpIHsKLQkJLyogWFhYIGZpeCBJU0Egc2VyaWFsIGNvbnNvbGUgKi8KLQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2VyaWFsIHN0ZG91dCBvbiBMUEFSICgnJXMnKSEgIgotCQkJCSJjYW4ndCBwcmludCB1ZGJnIG1lc3NhZ2VzXG4iLAotCQkgICAgICAgc3Rkb3V0X25vZGUtPmZ1bGxfbmFtZSk7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZG9uJ3Qga25vdyBob3cgdG8gcHJpbnQgdG8gc3Rkb3V0ICclcydcbiIsCi0JCSAgICAgICBzdGRvdXRfbm9kZS0+ZnVsbF9uYW1lKTsKKwkvKiBDaGVjayBpZiBpdCdzIGEgdmlydHVhbCB0ZXJtaW5hbCAqLworCWlmIChzdHJuY21wKG5hbWUsICJ2dHkiLCAzKSAhPSAwKQorCQlnb3RvIG91dDsKKwl0ZXJtbm8gPSAodTMyICopZ2V0X3Byb3BlcnR5KHN0ZG91dF9ub2RlLCAicmVnIiwgTlVMTCk7CisJaWYgKHRlcm1ubyA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwl2dGVybW5vID0gdGVybW5vWzBdOworCisJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKHN0ZG91dF9ub2RlLCAiaHZ0ZXJtMSIpKSB7CisJCXVkYmdfcHV0YyA9IHVkYmdfcHV0Y0xQOworCQl1ZGJnX2dldGMgPSB1ZGJnX2dldGNMUDsKKwkJdWRiZ19nZXRjX3BvbGwgPSB1ZGJnX2dldGNfcG9sbExQOworCQlpZiAoYWRkX2NvbnNvbGUpCisJCQlhZGRfcHJlZmVycmVkX2NvbnNvbGUoImh2YyIsIHRlcm1ub1swXSAmIDB4ZmYsIE5VTEwpOworCX0gZWxzZSBpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUoc3Rkb3V0X25vZGUsICJodnRlcm0tcHJvdG9jb2wiKSkgeworCQl2dGVybW5vID0gdGVybW5vWzBdOworCQl1ZGJnX3B1dGMgPSB1ZGJnX2h2c2lfcHV0YzsKKwkJdWRiZ19nZXRjID0gdWRiZ19odnNpX2dldGM7CisJCXVkYmdfZ2V0Y19wb2xsID0gdWRiZ19odnNpX2dldGNfcG9sbDsKKwkJaWYgKGFkZF9jb25zb2xlKQorCQkJYWRkX3ByZWZlcnJlZF9jb25zb2xlKCJodnNpIiwgdGVybW5vWzBdICYgMHhmZiwgTlVMTCk7CiAJfQotCiBvdXQ6CiAJb2Zfbm9kZV9wdXQoc3Rkb3V0X25vZGUpOwotCXJldHVybiBmb3VuZDsKIH0KIAogdm9pZCB2cGFfaW5pdChpbnQgY3B1KQogewogCWludCBod2NwdSA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoY3B1KTsKLQl1bnNpZ25lZCBsb25nIHZwYSA9IF9fcGEoJnBhY2FbY3B1XS5scHBhY2EpOworCXVuc2lnbmVkIGxvbmcgdnBhID0gX19wYSgmbHBwYWNhW2NwdV0pOwogCWxvbmcgcmV0OwogCiAJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0FMVElWRUMpKQotCQlwYWNhW2NwdV0ubHBwYWNhLnZteHJlZ3NfaW5fdXNlID0gMTsKKwkJbHBwYWNhW2NwdV0udm14cmVnc19pbl91c2UgPSAxOwogCiAJcmV0ID0gcmVnaXN0ZXJfdnBhKGh3Y3B1LCB2cGEpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5MzQ3OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYwpAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIFBDSSBEeW5hbWljIExQQVIsIFBDSSBIb3QgUGx1ZyBhbmQgUENJIEVFSCByZWNvdmVyeSBjb2RlCisgKiBmb3IgUlBBLWNvbXBsaWFudCBQUEM2NCBwbGF0Zm9ybS4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBMaW5kYSBYaWUgPGx4aWVAdXMuaWJtLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisgKgorICogVXBkYXRlcywgMjAwNSwgSm9obiBSb3NlIDxqb2hucm9zZUBhdXN0aW4uaWJtLmNvbT4KKyAqIFVwZGF0ZXMsIDIwMDUsIExpbmFzIFZlcHN0YXMgPGxpbmFzQGF1c3Rpbi5pYm0uY29tPgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2J1cyAqCitmaW5kX2J1c19hbW9uZ19jaGlsZHJlbihzdHJ1Y3QgcGNpX2J1cyAqYnVzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9ub2RlICpkbikKK3sKKwlzdHJ1Y3QgcGNpX2J1cyAqY2hpbGQgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmJ1c2RuOworCisJYnVzZG4gPSBwY2lfYnVzX3RvX09GX25vZGUoYnVzKTsKKwlpZiAoYnVzZG4gPT0gZG4pCisJCXJldHVybiBidXM7CisKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJmJ1cy0+Y2hpbGRyZW4pIHsKKwkJY2hpbGQgPSBmaW5kX2J1c19hbW9uZ19jaGlsZHJlbihwY2lfYnVzX2IodG1wKSwgZG4pOworCQlpZiAoY2hpbGQpCisJCQlicmVhazsKKwl9OworCXJldHVybiBjaGlsZDsKK30KKworc3RydWN0IHBjaV9idXMgKgorcGNpYmlvc19maW5kX3BjaV9idXMoc3RydWN0IGRldmljZV9ub2RlICpkbikKK3sKKwlzdHJ1Y3QgcGNpX2RuICpwZG4gPSBkbi0+ZGF0YTsKKworCWlmICghcGRuICB8fCAhcGRuLT5waGIgfHwgIXBkbi0+cGhiLT5idXMpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGZpbmRfYnVzX2Ftb25nX2NoaWxkcmVuKHBkbi0+cGhiLT5idXMsIGRuKTsKK30KKworLyoqCisgKiBwY2liaW9zX3JlbW92ZV9wY2lfZGV2aWNlcyAtIHJlbW92ZSBhbGwgZGV2aWNlcyB1bmRlciB0aGlzIGJ1cworICoKKyAqIFJlbW92ZSBhbGwgb2YgdGhlIFBDSSBkZXZpY2VzIHVuZGVyIHRoaXMgYnVzIGJvdGggZnJvbSB0aGUKKyAqIGxpbnV4IHBjaSBkZXZpY2UgdHJlZSwgYW5kIGZyb20gdGhlIHBvd2VycGMgRUVIIGFkZHJlc3MgY2FjaGUuCisgKi8KK3ZvaWQKK3BjaWJpb3NfcmVtb3ZlX3BjaV9kZXZpY2VzKHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldiwgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXYsIHRtcCwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKKwkJZWVoX3JlbW92ZV9idXNfZGV2aWNlKGRldik7CisJCXBjaV9yZW1vdmVfYnVzX2RldmljZShkZXYpOworCX0KK30KKworLyogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHBjaV9idXNfYWRkX2RldmljZXMgKi8KK3ZvaWQKK3BjaWJpb3NfZml4dXBfbmV3X3BjaV9kZXZpY2VzKHN0cnVjdCBwY2lfYnVzICpidXMsIGludCBmaXhfYnVzKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKKwkJLyoKKwkJICogU2tpcCBhbHJlYWR5LXByZXNlbnQgZGV2aWNlcyAod2hpY2ggYXJlIG9uIHRoZQorCQkgKiBnbG9iYWwgZGV2aWNlIGxpc3QuKQorCQkgKi8KKwkJaWYgKGxpc3RfZW1wdHkoJmRldi0+Z2xvYmFsX2xpc3QpKSB7CisJCQlpbnQgaTsKKworCQkJLyogTmVlZCB0byBzZXR1cCBJT01NVSB0YWJsZXMgKi8KKwkJCXBwY19tZC5pb21tdV9kZXZfc2V0dXAoZGV2KTsKKworCQkJaWYoZml4X2J1cykKKwkJCQlwY2liaW9zX2ZpeHVwX2RldmljZV9yZXNvdXJjZXMoZGV2LCBidXMpOworCQkJcGNpX3JlYWRfaXJxX2xpbmUoZGV2KTsKKwkJCWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7CisJCQkJc3RydWN0IHJlc291cmNlICpyID0gJmRldi0+cmVzb3VyY2VbaV07CisKKwkJCQlpZiAoci0+cGFyZW50IHx8ICFyLT5zdGFydCB8fCAhci0+ZmxhZ3MpCisJCQkJCWNvbnRpbnVlOworCQkJCXBjaV9jbGFpbV9yZXNvdXJjZShkZXYsIGkpOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW50CitwY2liaW9zX3BjaV9jb25maWdfYnJpZGdlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTggc2VjX2J1c25vOworCXN0cnVjdCBwY2lfYnVzICpjaGlsZF9idXM7CisJc3RydWN0IHBjaV9kZXYgKmNoaWxkX2RldjsKKworCS8qIEdldCBidXNubyBvZiBkb3duc3RyZWFtIGJ1cyAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX1NFQ09OREFSWV9CVVMsICZzZWNfYnVzbm8pOworCisJLyogQWRkIHRvIGNoaWxkcmVuIG9mIFBDSSBicmlkZ2UgZGV2LT5idXMgKi8KKwljaGlsZF9idXMgPSBwY2lfYWRkX25ld19idXMoZGV2LT5idXMsIGRldiwgc2VjX2J1c25vKTsKKwlpZiAoIWNoaWxkX2J1cykgeworCQlwcmludGsgKEtFUk5fRVJSICIlczogY291bGQgbm90IGFkZCBzZWNvbmQgYnVzXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisJc3ByaW50ZihjaGlsZF9idXMtPm5hbWUsICJQQ0kgQnVzICMlMDJ4IiwgY2hpbGRfYnVzLT5udW1iZXIpOworCisJcGNpX3NjYW5fY2hpbGRfYnVzKGNoaWxkX2J1cyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkX2RldiwgJmNoaWxkX2J1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKKwkJZWVoX2FkZF9kZXZpY2VfbGF0ZShjaGlsZF9kZXYpOworCX0KKworCS8qIEZpeHVwIG5ldyBwY2kgZGV2aWNlcyB3aXRob3V0IHRvdWNoaW5nIGJ1cyBzdHJ1Y3QgKi8KKwlwY2liaW9zX2ZpeHVwX25ld19wY2lfZGV2aWNlcyhjaGlsZF9idXMsIDApOworCisJLyogTWFrZSB0aGUgZGlzY292ZXJlZCBkZXZpY2VzIGF2YWlsYWJsZSAqLworCXBjaV9idXNfYWRkX2RldmljZXMoY2hpbGRfYnVzKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwY2liaW9zX2FkZF9wY2lfZGV2aWNlcyAtIGFkZHMgbmV3IHBjaSBkZXZpY2VzIHRvIGJ1cworICoKKyAqIFRoaXMgcm91dGluZSB3aWxsIGZpbmQgYW5kIGZpeHVwIG5ldyBwY2kgZGV2aWNlcyB1bmRlcgorICogdGhlIGluZGljYXRlZCBidXMuIFRoaXMgcm91dGluZSBwcmVzdW1lcyB0aGF0IHRoZXJlCisgKiBtaWdodCBhbHJlYWR5IGJlIHNvbWUgZGV2aWNlcyB1bmRlciB0aGlzIGJyaWRnZSwgc28KKyAqIGl0IGNhcmVmdWxseSB0cmllcyB0byBhZGQgb25seSBuZXcgZGV2aWNlcy4gIChBbmQgdGhhdAorICogaXMgaG93IHRoaXMgcm91dGluZSBkaWZmZXJzIGZyb20gb3RoZXIsIHNpbWlsYXIgcGNpYmlvcworICogcm91dGluZXMuKQorICovCit2b2lkCitwY2liaW9zX2FkZF9wY2lfZGV2aWNlcyhzdHJ1Y3QgcGNpX2J1cyAqIGJ1cykKK3sKKwlpbnQgc2xvdG5vLCBudW07CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gcGNpX2J1c190b19PRl9ub2RlKGJ1cyk7CisKKwllZWhfYWRkX2RldmljZV90cmVlX2Vhcmx5KGRuKTsKKworCS8qIHBjaV9zY2FuX3Nsb3Qgc2hvdWxkIGZpbmQgYWxsIGNoaWxkcmVuICovCisJc2xvdG5vID0gUENJX1NMT1QoUENJX0ROKGRuLT5jaGlsZCktPmRldmZuKTsKKwludW0gPSBwY2lfc2Nhbl9zbG90KGJ1cywgUENJX0RFVkZOKHNsb3RubywgMCkpOworCWlmIChudW0pIHsKKwkJcGNpYmlvc19maXh1cF9uZXdfcGNpX2RldmljZXMoYnVzLCAxKTsKKwkJcGNpX2J1c19hZGRfZGV2aWNlcyhidXMpOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgeworCQllZWhfYWRkX2RldmljZV9sYXRlIChkZXYpOworCQlpZiAoZGV2LT5oZHJfdHlwZSA9PSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFKQorCQkJcGNpYmlvc19wY2lfY29uZmlnX2JyaWRnZShkZXYpOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9yYXMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9yYXMuYwppbmRleCBmYmQyMTRkLi5iMDQ2YmNmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmFzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3Jhcy5jCkBAIC00OSwxNCArNDksMTQgQEAKICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9ydGFzLmg+CiAjaW5jbHVkZSA8YXNtL3VkYmcuaD4KKyNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KKworI2luY2x1ZGUgInJhcy5oIgogCiBzdGF0aWMgdW5zaWduZWQgY2hhciByYXNfbG9nX2J1ZltSVEFTX0VSUk9SX0xPR19NQVhdOwogc3RhdGljIERFRklORV9TUElOTE9DSyhyYXNfbG9nX2J1Zl9sb2NrKTsKIAotY2hhciBtY2VfZGF0YV9idWZbUlRBU19FUlJPUl9MT0dfTUFYXQotOwotLyogVGhpcyBpcyB0cnVlIGlmIHdlIGFyZSB1c2luZyB0aGUgZmlybXdhcmUgTk1JIGhhbmRsZXIgKHR5cGljYWxseSBMUEFSKSAqLwotZXh0ZXJuIGludCBmd25taV9hY3RpdmU7CitjaGFyIG1jZV9kYXRhX2J1ZltSVEFTX0VSUk9SX0xPR19NQVhdOwogCiBzdGF0aWMgaW50IHJhc19nZXRfc2Vuc29yX3N0YXRlX3Rva2VuOwogc3RhdGljIGludCByYXNfY2hlY2tfZXhjZXB0aW9uX3Rva2VuOwpAQCAtMjgwLDcgKzI4MCw3IEBACiAJCXByaW50aygiRldOTUk6IG5taS1pbnRlcmxvY2sgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIH0KIAotdm9pZCBwU2VyaWVzX3N5c3RlbV9yZXNldF9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitpbnQgcFNlcmllc19zeXN0ZW1fcmVzZXRfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWlmIChmd25taV9hY3RpdmUpIHsKIAkJc3RydWN0IHJ0YXNfZXJyb3JfbG9nICplcnJoZHIgPSBmd25taV9nZXRfZXJyaW5mbyhyZWdzKTsKQEAgLTI4OSw2ICsyODksNyBAQAogCQl9CiAJCWZ3bm1pX3JlbGVhc2VfZXJyaW5mbygpOwogCX0KKwlyZXR1cm4gMDsgLyogbmVlZCB0byBwZXJmb3JtIHJlc2V0ICovCiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmFzLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmFzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2NmIwZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9yYXMuaApAQCAtMCwwICsxLDkgQEAKKyNpZm5kZWYgX1BTRVJJRVNfUkFTX0gKKyNkZWZpbmUgX1BTRVJJRVNfUkFTX0gKKworc3RydWN0IHB0X3JlZ3M7CisKK2V4dGVybiBpbnQgcFNlcmllc19zeXN0ZW1fcmVzZXRfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiBpbnQgcFNlcmllc19tYWNoaW5lX2NoZWNrX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKyNlbmRpZiAvKiBfUFNFUklFU19SQVNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYwppbmRleCBkODg2NDE2Li44NmNmYTZlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYwpAQCAtMzUwLDYgKzM1MCwxMDAgQEAKIAlyZXR1cm4gcnY7CiB9CiAKK3N0YXRpYyBjaGFyICpwYXJzZV9ub2RlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKm5wcCkKK3sKKwljaGFyICpoYW5kbGVfc3RyOworCXBoYW5kbGUgaGFuZGxlOworCSpucHAgPSBOVUxMOworCisJaGFuZGxlX3N0ciA9IGJ1ZjsKKworCWJ1ZiA9IHN0cmNocihidWYsICcgJyk7CisJaWYgKCFidWYpCisJCXJldHVybiBOVUxMOworCSpidWYgPSAnXDAnOworCWJ1ZisrOworCisJaGFuZGxlID0gc2ltcGxlX3N0cnRvdWwoaGFuZGxlX3N0ciwgTlVMTCwgMTApOworCisJKm5wcCA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKGhhbmRsZSk7CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGludCBkb19hZGRfcHJvcGVydHkoY2hhciAqYnVmLCBzaXplX3QgYnVmc2l6ZSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBOVUxMOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJdW5zaWduZWQgY2hhciAqdmFsdWU7CisJY2hhciAqbmFtZSwgKmVuZDsKKwlpbnQgbGVuZ3RoOworCWVuZCA9IGJ1ZiArIGJ1ZnNpemU7CisJYnVmID0gcGFyc2Vfbm9kZShidWYsIGJ1ZnNpemUsICZucCk7CisKKwlpZiAoIW5wKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChwYXJzZV9uZXh0X3Byb3BlcnR5KGJ1ZiwgZW5kLCAmbmFtZSwgJmxlbmd0aCwgJnZhbHVlKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByb3AgPSBuZXdfcHJvcGVydHkobmFtZSwgbGVuZ3RoLCB2YWx1ZSwgTlVMTCk7CisJaWYgKCFwcm9wKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByb21fYWRkX3Byb3BlcnR5KG5wLCBwcm9wKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX3JlbW92ZV9wcm9wZXJ0eShjaGFyICpidWYsIHNpemVfdCBidWZzaXplKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJY2hhciAqdG1wOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlidWYgPSBwYXJzZV9ub2RlKGJ1ZiwgYnVmc2l6ZSwgJm5wKTsKKworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCisJdG1wID0gc3RyY2hyKGJ1ZiwnICcpOworCWlmICh0bXApCisJCSp0bXAgPSAnXDAnOworCisJaWYgKHN0cmxlbihidWYpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsIGJ1ZiwgTlVMTCk7CisKKwlyZXR1cm4gcHJvbV9yZW1vdmVfcHJvcGVydHkobnAsIHByb3ApOworfQorCitzdGF0aWMgaW50IGRvX3VwZGF0ZV9wcm9wZXJ0eShjaGFyICpidWYsIHNpemVfdCBidWZzaXplKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJdW5zaWduZWQgY2hhciAqdmFsdWU7CisJY2hhciAqbmFtZSwgKmVuZDsKKwlpbnQgbGVuZ3RoOworCXN0cnVjdCBwcm9wZXJ0eSAqbmV3cHJvcCwgKm9sZHByb3A7CisJYnVmID0gcGFyc2Vfbm9kZShidWYsIGJ1ZnNpemUsICZucCk7CisJZW5kID0gYnVmICsgYnVmc2l6ZTsKKworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHBhcnNlX25leHRfcHJvcGVydHkoYnVmLCBlbmQsICZuYW1lLCAmbGVuZ3RoLCAmdmFsdWUpID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJbmV3cHJvcCA9IG5ld19wcm9wZXJ0eShuYW1lLCBsZW5ndGgsIHZhbHVlLCBOVUxMKTsKKwlpZiAoIW5ld3Byb3ApCisJCXJldHVybiAtRU5PTUVNOworCisJb2xkcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsIG5hbWUsTlVMTCk7CisJaWYgKCFvbGRwcm9wKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBwcm9tX3VwZGF0ZV9wcm9wZXJ0eShucCwgbmV3cHJvcCwgb2xkcHJvcCk7Cit9CisKIC8qKgogICogb2ZkdF93cml0ZSAtIHBlcmZvcm0gb3BlcmF0aW9ucyBvbiB0aGUgT3BlbiBGaXJtd2FyZSBkZXZpY2UgdHJlZQogICoKQEAgLTM5Miw2ICs0ODYsMTIgQEAKIAkJcnYgPSBkb19hZGRfbm9kZSh0bXAsIGNvdW50IC0gKHRtcCAtIGtidWYpKTsKIAllbHNlIGlmICghc3RyY21wKGtidWYsICJyZW1vdmVfbm9kZSIpKQogCQlydiA9IGRvX3JlbW92ZV9ub2RlKHRtcCk7CisJZWxzZSBpZiAoIXN0cmNtcChrYnVmLCAiYWRkX3Byb3BlcnR5IikpCisJCXJ2ID0gZG9fYWRkX3Byb3BlcnR5KHRtcCwgY291bnQgLSAodG1wIC0ga2J1ZikpOworCWVsc2UgaWYgKCFzdHJjbXAoa2J1ZiwgInJlbW92ZV9wcm9wZXJ0eSIpKQorCQlydiA9IGRvX3JlbW92ZV9wcm9wZXJ0eSh0bXAsIGNvdW50IC0gKHRtcCAtIGtidWYpKTsKKwllbHNlIGlmICghc3RyY21wKGtidWYsICJ1cGRhdGVfcHJvcGVydHkiKSkKKwkJcnYgPSBkb191cGRhdGVfcHJvcGVydHkodG1wLCBjb3VudCAtICh0bXAgLSBrYnVmKSk7CiAJZWxzZQogCQlydiA9IC1FSU5WQUw7CiBvdXQ6CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2NhbmxvZy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NjYW5sb2cuYwppbmRleCAyZWRjOTQ3Li41MDY0MzQ5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2NhbmxvZy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zY2FubG9nLmMKQEAgLTE5Miw3ICsxOTIsNyBAQAogCS5yZWxlYXNlCT0gc2NhbmxvZ19yZWxlYXNlLAogfTsKIAotaW50IF9faW5pdCBzY2FubG9nX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHNjYW5sb2dfaW5pdCh2b2lkKQogewogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50OwogCkBAIC0yMjIsNyArMjIyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBfX2V4aXQgc2NhbmxvZ19jbGVhbnVwKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgc2NhbmxvZ19jbGVhbnVwKHZvaWQpCiB7CiAJaWYgKHByb2NfcHBjNjRfc2Nhbl9sb2dfZHVtcCkgewogCQlrZnJlZShwcm9jX3BwYzY0X3NjYW5fbG9nX2R1bXAtPmRhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYwppbmRleCA0YTQ2NWYwLi5kYTZjZWJhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYwpAQCAtNTYsNiArNTYsNyBAQAogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20va2V4ZWMuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS9udnJhbS5oPgogI2luY2x1ZGUgInhpY3MuaCIKQEAgLTY4LDYgKzY5LDcgQEAKICNpbmNsdWRlIDxhc20vc21wLmg+CiAKICNpbmNsdWRlICJwbHBhcl93cmFwcGVycy5oIgorI2luY2x1ZGUgInJhcy5oIgogCiAjaWZkZWYgREVCVUcKICNkZWZpbmUgREJHKGZtdC4uLikgdWRiZ19wcmludGYoZm10KQpAQCAtNzYsMjIgKzc4LDE1IEBACiAjZW5kaWYKIAogZXh0ZXJuIHZvaWQgZmluZF91ZGJnX3Z0ZXJtKHZvaWQpOwotZXh0ZXJuIHZvaWQgc3lzdGVtX3Jlc2V0X2Z3bm1pKHZvaWQpOwkvKiBmcm9tIGhlYWQuUyAqLwotZXh0ZXJuIHZvaWQgbWFjaGluZV9jaGVja19md25taSh2b2lkKTsJLyogZnJvbSBoZWFkLlMgKi8KLWV4dGVybiB2b2lkIGdlbmVyaWNfZmluZF9sZWdhY3lfc2VyaWFsX3BvcnRzKHU2NCAqcGh5c3BvcnQsCi0JCXVuc2lnbmVkIGludCAqZGVmYXVsdF9zcGVlZCk7CiAKIGludCBmd25taV9hY3RpdmU7ICAvKiBUUlVFIGlmIGFuIEZXTk1JIGhhbmRsZXIgaXMgcHJlc2VudCAqLwogCi1leHRlcm4gdm9pZCBwU2VyaWVzX3N5c3RlbV9yZXNldF9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotZXh0ZXJuIGludCBwU2VyaWVzX21hY2hpbmVfY2hlY2tfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLQogc3RhdGljIHZvaWQgcHNlcmllc19zaGFyZWRfaWRsZSh2b2lkKTsKIHN0YXRpYyB2b2lkIHBzZXJpZXNfZGVkaWNhdGVkX2lkbGUodm9pZCk7CiAKIHN0cnVjdCBtcGljICpwU2VyaWVzX21waWM7CiAKLXZvaWQgcFNlcmllc19zaG93X2NwdWluZm8oc3RydWN0IHNlcV9maWxlICptKQorc3RhdGljIHZvaWQgcFNlcmllc19zaG93X2NwdWluZm8oc3RydWN0IHNlcV9maWxlICptKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcm9vdDsKIAljb25zdCBjaGFyICptb2RlbCA9ICIiOwpAQCAtMTA1LDE4ICsxMDAsMjIgQEAKIAogLyogSW5pdGlhbGl6ZSBmaXJtd2FyZSBhc3Npc3RlZCBub24tbWFza2FibGUgaW50ZXJydXB0cyBpZgogICogdGhlIGZpcm13YXJlIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4KLSAqCiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBmd25taV9pbml0KHZvaWQpCiB7Ci0JaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIHN5c3RlbV9yZXNldF9hZGRyLCBtYWNoaW5lX2NoZWNrX2FkZHI7CisKIAlpbnQgaWJtX25taV9yZWdpc3RlciA9IHJ0YXNfdG9rZW4oImlibSxubWktcmVnaXN0ZXIiKTsKIAlpZiAoaWJtX25taV9yZWdpc3RlciA9PSBSVEFTX1VOS05PV05fU0VSVklDRSkKIAkJcmV0dXJuOwotCXJldCA9IHJ0YXNfY2FsbChpYm1fbm1pX3JlZ2lzdGVyLCAyLCAxLCBOVUxMLAotCQkJX19wYSgodW5zaWduZWQgbG9uZylzeXN0ZW1fcmVzZXRfZndubWkpLAotCQkJX19wYSgodW5zaWduZWQgbG9uZyltYWNoaW5lX2NoZWNrX2Z3bm1pKSk7Ci0JaWYgKHJldCA9PSAwKQorCisJLyogSWYgdGhlIGtlcm5lbCdzIG5vdCBsaW5rZWQgYXQgemVybyB3ZSBwb2ludCB0aGUgZmlybXdhcmUgYXQgbG93CisJICogYWRkcmVzc2VzIGFueXdheSwgYW5kIHVzZSBhIHRyYW1wb2xpbmUgdG8gZ2V0IHRvIHRoZSByZWFsIGNvZGUuICovCisJc3lzdGVtX3Jlc2V0X2FkZHIgID0gX19wYShzeXN0ZW1fcmVzZXRfZndubWkpIC0gUEhZU0lDQUxfU1RBUlQ7CisJbWFjaGluZV9jaGVja19hZGRyID0gX19wYShtYWNoaW5lX2NoZWNrX2Z3bm1pKSAtIFBIWVNJQ0FMX1NUQVJUOworCisJaWYgKDAgPT0gcnRhc19jYWxsKGlibV9ubWlfcmVnaXN0ZXIsIDIsIDEsIE5VTEwsIHN5c3RlbV9yZXNldF9hZGRyLAorCQkJCW1hY2hpbmVfY2hlY2tfYWRkcikpCiAJCWZ3bm1pX2FjdGl2ZSA9IDE7CiB9CiAKQEAgLTE5MSw3ICsxOTAsNyBAQAogCiAJLyogaW5zdHJ1Y3QgaHlwZXJ2aXNvciB0byBtYWludGFpbiBQTUNzICovCiAJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfU1BMUEFSKSkKLQkJZ2V0X3BhY2EoKS0+bHBwYWNhLnBtY3JlZ3NfaW5fdXNlID0gMTsKKwkJZ2V0X2xwcGFjYSgpLT5wbWNyZWdzX2luX3VzZSA9IDE7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBwU2VyaWVzX3NldHVwX2FyY2godm9pZCkKQEAgLTIzNSw3ICsyMzQsNyBAQAogCS8qIENob29zZSBhbiBpZGxlIGxvb3AgKi8KIAlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9TUExQQVIpKSB7CiAJCXZwYV9pbml0KGJvb3RfY3B1aWQpOwotCQlpZiAoZ2V0X3BhY2EoKS0+bHBwYWNhLnNoYXJlZF9wcm9jKSB7CisJCWlmIChnZXRfbHBwYWNhKCktPnNoYXJlZF9wcm9jKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBzaGFyZWQgcHJvY2Vzc29yIGlkbGUgbG9vcFxuIik7CiAJCQlwcGNfbWQuaWRsZV9sb29wID0gcHNlcmllc19zaGFyZWRfaWRsZTsKIAkJfSBlbHNlIHsKQEAgLTMyMywxNSArMzIyLDE4IEBACiAJcHBjNjRfaW50ZXJydXB0X2NvbnRyb2xsZXIgPSBJQ19JTlZBTElEOwogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShucCwgImludGVycnVwdC1jb250cm9sbGVyIikpOykgewogCQl0eXBlcCA9IChjaGFyICopZ2V0X3Byb3BlcnR5KG5wLCAiY29tcGF0aWJsZSIsIE5VTEwpOwotCQlpZiAoc3Ryc3RyKHR5cGVwLCAib3Blbi1waWMiKSkKKwkJaWYgKHN0cnN0cih0eXBlcCwgIm9wZW4tcGljIikpIHsKIAkJCXBwYzY0X2ludGVycnVwdF9jb250cm9sbGVyID0gSUNfT1BFTl9QSUM7Ci0JCWVsc2UgaWYgKHN0cnN0cih0eXBlcCwgInBwYy14aWNwIikpCisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChzdHJzdHIodHlwZXAsICJwcGMteGljcCIpKSB7CiAJCQlwcGM2NF9pbnRlcnJ1cHRfY29udHJvbGxlciA9IElDX1BQQ19YSUM7Ci0JCWVsc2UKLQkJCXByaW50aygicFNlcmllc19kaXNjb3Zlcl9waWM6IGZhaWxlZCB0byByZWNvZ25pemUiCi0JCQkgICAgICAgIiBpbnRlcnJ1cHQtY29udHJvbGxlclxuIik7Ci0JCWJyZWFrOworCQkJYnJlYWs7CisJCX0KIAl9CisJaWYgKHBwYzY0X2ludGVycnVwdF9jb250cm9sbGVyID09IElDX0lOVkFMSUQpCisJCXByaW50aygicFNlcmllc19kaXNjb3Zlcl9waWM6IGZhaWxlZCB0byByZWNvZ25pemUiCisJCQkiIGludGVycnVwdC1jb250cm9sbGVyXG4iKTsKKwogfQogCiBzdGF0aWMgdm9pZCBwU2VyaWVzX21hY2hfY3B1X2RpZSh2b2lkKQpAQCAtMzY1LDEwICszNjcsNyBAQAogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgcFNlcmllc19pbml0X2Vhcmx5KHZvaWQpCiB7Ci0Jdm9pZCAqY29tcG9ydDsKIAlpbnQgaW9tbXVfb2ZmID0gMDsKLQl1bnNpZ25lZCBpbnQgZGVmYXVsdF9zcGVlZDsKLQl1NjQgcGh5c3BvcnQ7CiAKIAlEQkcoIiAtPiBwU2VyaWVzX2luaXRfZWFybHkoKVxuIik7CiAKQEAgLTM4MiwxNyArMzgxLDggQEAKIAkJCSAgICAgZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LGlvbW11LW9mZiIsIE5VTEwpKTsKIAl9CiAKLQlnZW5lcmljX2ZpbmRfbGVnYWN5X3NlcmlhbF9wb3J0cygmcGh5c3BvcnQsICZkZWZhdWx0X3NwZWVkKTsKLQogCWlmIChwbGF0Zm9ybV9pc19scGFyKCkpCiAJCWZpbmRfdWRiZ192dGVybSgpOwotCWVsc2UgaWYgKHBoeXNwb3J0KSB7Ci0JCS8qIE1hcCB0aGUgdWFydCBmb3IgdWRiZy4gKi8KLQkJY29tcG9ydCA9ICh2b2lkICopaW9yZW1hcChwaHlzcG9ydCwgMTYpOwotCQl1ZGJnX2luaXRfdWFydChjb21wb3J0LCBkZWZhdWx0X3NwZWVkKTsKLQotCQlEQkcoIkhlbGxvIFdvcmxkICFcbiIpOwotCX0KIAogCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0RBQlIpKQogCQlwcGNfbWQuc2V0X2RhYnIgPSBwc2VyaWVzX3NldF9kYWJyOwpAQCAtNDU0LDEwICs0NDQsMTAgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGRlZGljYXRlZF9pZGxlX3NsZWVwKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0Jc3RydWN0IHBhY2Ffc3RydWN0ICpwcGFjYSA9ICZwYWNhW2NwdSBeIDFdOworCXN0cnVjdCBscHBhY2EgKnBscHBhY2EgPSAmbHBwYWNhW2NwdSBeIDFdOwogCiAJLyogT25seSBzbGVlcCBpZiB0aGUgb3RoZXIgdGhyZWFkIGlzIG5vdCBpZGxlICovCi0JaWYgKCEocHBhY2EtPmxwcGFjYS5pZGxlKSkgeworCWlmICghKHBscHBhY2EtPmlkbGUpKSB7CiAJCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAKIAkJLyoKQEAgLTQ5MCw3ICs0ODAsNiBAQAogCiBzdGF0aWMgdm9pZCBwc2VyaWVzX2RlZGljYXRlZF9pZGxlKHZvaWQpCiB7IAotCXN0cnVjdCBwYWNhX3N0cnVjdCAqbHBhY2EgPSBnZXRfcGFjYSgpOwogCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJdW5zaWduZWQgbG9uZyBzdGFydF9zbm9vemU7CiAJdW5zaWduZWQgbG9uZyAqc210X3Nub296ZV9kZWxheSA9ICZfX2dldF9jcHVfdmFyKHNtdF9zbm9vemVfZGVsYXkpOwpAQCAtNTAxLDcgKzQ5MCw3IEBACiAJCSAqIEluZGljYXRlIHRvIHRoZSBIViB0aGF0IHdlIGFyZSBpZGxlLiBOb3cgd291bGQgYmUKIAkJICogYSBnb29kIHRpbWUgdG8gZmluZCBvdGhlciB3b3JrIHRvIGRpc3BhdGNoLgogCQkgKi8KLQkJbHBhY2EtPmxwcGFjYS5pZGxlID0gMTsKKwkJZ2V0X2xwcGFjYSgpLT5pZGxlID0gMTsKIAogCQlpZiAoIW5lZWRfcmVzY2hlZCgpKSB7CiAJCQlzdGFydF9zbm9vemUgPSBnZXRfdGIoKSArCkBAIC01MjgsNyArNTE3LDcgQEAKIAkJCUhNVF9tZWRpdW0oKTsKIAkJfQogCi0JCWxwYWNhLT5scHBhY2EuaWRsZSA9IDA7CisJCWdldF9scHBhY2EoKS0+aWRsZSA9IDA7CiAJCXBwYzY0X3J1bmxhdGNoX29uKCk7CiAKIAkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwpAQCAtNTQyLDcgKzUzMSw2IEBACiAKIHN0YXRpYyB2b2lkIHBzZXJpZXNfc2hhcmVkX2lkbGUodm9pZCkKIHsKLQlzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKmxwYWNhID0gZ2V0X3BhY2EoKTsKIAl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCiAJd2hpbGUgKDEpIHsKQEAgLTU1MCw3ICs1MzgsNyBAQAogCQkgKiBJbmRpY2F0ZSB0byB0aGUgSFYgdGhhdCB3ZSBhcmUgaWRsZS4gTm93IHdvdWxkIGJlCiAJCSAqIGEgZ29vZCB0aW1lIHRvIGZpbmQgb3RoZXIgd29yayB0byBkaXNwYXRjaC4KIAkJICovCi0JCWxwYWNhLT5scHBhY2EuaWRsZSA9IDE7CisJCWdldF9scHBhY2EoKS0+aWRsZSA9IDE7CiAKIAkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSAmJiAhY3B1X2lzX29mZmxpbmUoY3B1KSkgewogCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKQEAgLTU3NCw3ICs1NjIsNyBAQAogCQkJSE1UX21lZGl1bSgpOwogCQl9CiAKLQkJbHBhY2EtPmxwcGFjYS5pZGxlID0gMDsKKwkJZ2V0X2xwcGFjYSgpLT5pZGxlID0gMDsKIAkJcHBjNjRfcnVubGF0Y2hfb24oKTsKIAogCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CkBAIC01OTgsNyArNTg2LDcgQEAKIHsKIAkvKiBEb24ndCByaXNrIGEgaHlwZXJ2aXNvciBjYWxsIGlmIHdlJ3JlIGNyYXNoaW5nICovCiAJaWYgKCFjcmFzaF9zaHV0ZG93bikgewotCQl1bnNpZ25lZCBsb25nIHZwYSA9IF9fcGEoJmdldF9wYWNhKCktPmxwcGFjYSk7CisJCXVuc2lnbmVkIGxvbmcgdnBhID0gX19wYShnZXRfbHBwYWNhKCkpOwogCiAJCWlmICh1bnJlZ2lzdGVyX3ZwYShoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKSwgdnBhKSkgewogCQkJcHJpbnRrKCJWUEEgZGVyZWdpc3RyYXRpb24gb2YgY3B1ICV1IChod19jcHVfaWQgJWQpICIKQEAgLTYzOCw1ICs2MjYsOCBAQAogCS5tYWNoaW5lX2NoZWNrX2V4Y2VwdGlvbiA9IHBTZXJpZXNfbWFjaGluZV9jaGVja19leGNlcHRpb24sCiAjaWZkZWYgQ09ORklHX0tFWEVDCiAJLmtleGVjX2NwdV9kb3duCQk9IHBzZXJpZXNfa2V4ZWNfY3B1X2Rvd24sCisJLm1hY2hpbmVfa2V4ZWMJCT0gZGVmYXVsdF9tYWNoaW5lX2tleGVjLAorCS5tYWNoaW5lX2tleGVjX3ByZXBhcmUJPSBkZWZhdWx0X21hY2hpbmVfa2V4ZWNfcHJlcGFyZSwKKwkubWFjaGluZV9jcmFzaF9zaHV0ZG93bgk9IGRlZmF1bHRfbWFjaGluZV9jcmFzaF9zaHV0ZG93biwKICNlbmRpZgogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zbXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zbXAuYwppbmRleCAyNTE4MWM1Li44ZTZiMWVkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NtcC5jCkBAIC05Myw3ICs5Myw3IEBACiAJcmV0dXJuIGNwdV9zdGF0dXM7CiB9CiAKLWludCBwU2VyaWVzX2NwdV9kaXNhYmxlKHZvaWQpCitzdGF0aWMgaW50IHBTZXJpZXNfY3B1X2Rpc2FibGUodm9pZCkKIHsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCkBAIC0xMDksNyArMTA5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBwU2VyaWVzX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKK3N0YXRpYyB2b2lkIHBTZXJpZXNfY3B1X2RpZSh1bnNpZ25lZCBpbnQgY3B1KQogewogCWludCB0cmllczsKIAlpbnQgY3B1X3N0YXR1czsKQEAgLTI4Miw3ICsyODIsNyBAQAogCXBjcHUgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGxjcHUpOwogCiAJLyogRml4dXAgYXRvbWljIGNvdW50OiBpdCBleGl0ZWQgaW5zaWRlIElSUSBoYW5kbGVyLiAqLwotCXBhY2FbbGNwdV0uX19jdXJyZW50LT50aHJlYWRfaW5mby0+cHJlZW1wdF9jb3VudAk9IDA7CisJdGFza190aHJlYWRfaW5mbyhwYWNhW2xjcHVdLl9fY3VycmVudCktPnByZWVtcHRfY291bnQJPSAwOwogCiAJLyogCiAJICogSWYgdGhlIFJUQVMgc3RhcnQtY3B1IHRva2VuIGRvZXMgbm90IGV4aXN0IHRoZW4gcHJlc3VtZSB0aGUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jCmluZGV4IDAzNzdkZWMuLmZkODIzYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYwpAQCAtMzgxLDcgKzM4MSw3IEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAKLWlycXJldHVybl90IHhpY3NfaXBpX2FjdGlvbihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGlycXJldHVybl90IHhpY3NfaXBpX2FjdGlvbihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKQEAgLTQwNyw3ICs0MDcsNyBAQAogCQkJc21wX21lc3NhZ2VfcmVjdihQUENfTVNHX01JR1JBVEVfVEFTSywgcmVncyk7CiAJCX0KICNlbmRpZgotI2lmZGVmIENPTkZJR19ERUJVR0dFUgorI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHR0VSKSB8fCBkZWZpbmVkKENPTkZJR19LRVhFQykKIAkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChQUENfTVNHX0RFQlVHR0VSX0JSRUFLLAogCQkJCSAgICAgICAmeGljc19pcGlfbWVzc2FnZVtjcHVdLnZhbHVlKSkgewogCQkJbWIoKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCmluZGV4IDZiN2VmY2ZjLi40YzJiMzU2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKQEAgLTQsNSArNCw3IEBACiBvYmotJChDT05GSUdfUFBDX01QQzEwNikJKz0gZ3JhY2tsZS5vCiBvYmotJChDT05GSUdfQk9PS0UpCQkrPSBkY3Iubwogb2JqLSQoQ09ORklHXzQweCkJCSs9IGRjci5vCi1vYmotJChDT05GSUdfVTNfREFSVCkJCSs9IHUzX2lvbW11Lm8KK29iai0kKENPTkZJR19VM19EQVJUKQkJKz0gZGFydF9pb21tdS5vCiBvYmotJChDT05GSUdfTU1JT19OVlJBTSkJKz0gbW1pb19udnJhbS5vCitvYmotJChDT05GSUdfUFBDXzgzeHgpCQkrPSBpcGljLm8KK29iai0kKENPTkZJR19GU0xfU09DKQkJKz0gZnNsX3NvYy5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2RhcnQuaCBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGFydC5oCmluZGV4IDMzZWQ5ZWQuLmMyZDA1NzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGFydC5oCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGFydC5oCkBAIC0yMCwyOSArMjAsNDQgQEAKICNkZWZpbmUgX1BPV0VSUENfU1lTREVWX0RBUlRfSAogCiAKLS8qIHBoeXNpY2FsIGJhc2Ugb2YgREFSVCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgREFSVF9CQVNFICAgICAgICAweGY4MDMzMDAwVUwKLQogLyogT2Zmc2V0IGZyb20gYmFzZSB0byBjb250cm9sIHJlZ2lzdGVyICovCi0jZGVmaW5lIERBUlRDTlRMICAgMAotLyogT2Zmc2V0IGZyb20gYmFzZSB0byBleGNlcHRpb24gcmVnaXN0ZXIgKi8KLSNkZWZpbmUgREFSVEVYQ1AgICAweDEwCi0vKiBPZmZzZXQgZnJvbSBiYXNlIHRvIFRMQiB0YWcgcmVnaXN0ZXJzICovCi0jZGVmaW5lIERBUlRUQUcgICAgMHgxMDAwCisjZGVmaW5lIERBUlRfQ05UTAkwCiAKKy8qIE9mZnNldCBmcm9tIGJhc2UgdG8gZXhjZXB0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIERBUlRfRVhDUF9VMwkweDEwCisvKiBPZmZzZXQgZnJvbSBiYXNlIHRvIFRMQiB0YWcgcmVnaXN0ZXJzICovCisjZGVmaW5lIERBUlRfVEFHU19VMwkweDEwMDAKKworLyogVTQgcmVnaXN0ZXJzICovCisjZGVmaW5lIERBUlRfQkFTRV9VNAkweDEwCisjZGVmaW5lIERBUlRfU0laRV9VNAkweDIwCisjZGVmaW5lIERBUlRfRVhDUF9VNAkweDMwCisjZGVmaW5lIERBUlRfVEFHU19VNAkweDEwMDAKIAogLyogQ29udHJvbCBSZWdpc3RlciBmaWVsZHMgKi8KIAotLyogYmFzZSBhZGRyZXNzIG9mIHRhYmxlIChwZm4pICovCi0jZGVmaW5lIERBUlRDTlRMX0JBU0VfTUFTSyAgICAweGZmZmZmCi0jZGVmaW5lIERBUlRDTlRMX0JBU0VfU0hJRlQgICAxMgorLyogVTMgcmVnaXN0ZXJzICovCisjZGVmaW5lIERBUlRfQ05UTF9VM19CQVNFX01BU0sJMHhmZmZmZgorI2RlZmluZSBEQVJUX0NOVExfVTNfQkFTRV9TSElGVAkxMgorI2RlZmluZSBEQVJUX0NOVExfVTNfRkxVU0hUTEIJMHg0MDAKKyNkZWZpbmUgREFSVF9DTlRMX1UzX0VOQUJMRQkweDIwMAorI2RlZmluZSBEQVJUX0NOVExfVTNfU0laRV9NQVNLCTB4MWZmCisjZGVmaW5lIERBUlRfQ05UTF9VM19TSVpFX1NISUZUCTAKIAotI2RlZmluZSBEQVJUQ05UTF9GTFVTSFRMQiAgICAgMHg0MDAKLSNkZWZpbmUgREFSVENOVExfRU5BQkxFICAgICAgIDB4MjAwCisvKiBVNCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgREFSVF9CQVNFX1U0X0JBU0VfTUFTSwkweGZmZmZmZgorI2RlZmluZSBEQVJUX0JBU0VfVTRfQkFTRV9TSElGVAkwCisjZGVmaW5lIERBUlRfQ05UTF9VNF9GTFVTSFRMQgkweDIwMDAwMDAwCisjZGVmaW5lIERBUlRfQ05UTF9VNF9FTkFCTEUJMHg4MDAwMDAwMAorI2RlZmluZSBEQVJUX1NJWkVfVTRfU0laRV9NQVNLCTB4MWZmZgorI2RlZmluZSBEQVJUX1NJWkVfVTRfU0laRV9TSElGVAkwCisKKyNkZWZpbmUgREFSVF9SRUcocikJKGRhcnQgKyAoKHIpID4+IDIpKQorI2RlZmluZSBEQVJUX0lOKHIpCShpbl9iZTMyKERBUlRfUkVHKHIpKSkKKyNkZWZpbmUgREFSVF9PVVQocix2KQkob3V0X2JlMzIoREFSVF9SRUcociksICh2KSkpCisKIAogLyogc2l6ZSBvZiB0YWJsZSBpbiBwYWdlcyAqLwotI2RlZmluZSBEQVJUQ05UTF9TSVpFX01BU0sgICAgMHgxZmYKLSNkZWZpbmUgREFSVENOVExfU0laRV9TSElGVCAgIDAKIAogCiAvKiBEQVJUIHRhYmxlIGZpZWxkcyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2RhcnRfaW9tbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzdkZTlkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMKQEAgLTAsMCArMSwzNDkgQEAKKy8qCisgKiBhcmNoL3Bvd2VycGMvc3lzZGV2L2RhcnRfaW9tbXUuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBPbG9mIEpvaGFuc3NvbiA8b2xvZkBsaXhvbS5uZXQ+LCBJQk0gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwNSBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+LAorICogICAgICAgICAgICAgICAgICAgIElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIEJhc2VkIG9uIHBTZXJpZXNfaW9tbXUuYzoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBNaWtlIENvcnJpZ2FuICYgRGF2ZSBFbmdlYnJldHNlbiwgSUJNIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgT2xvZiBKb2hhbnNzb24gPG9sb2ZAbGl4b20ubmV0PiwgSUJNIENvcnBvcmF0aW9uCisgKgorICogRHluYW1pYyBETUEgbWFwcGluZyBzdXBwb3J0LCBBcHBsZSBVMywgVTQgJiBJQk0gQ1BDOTI1ICJEQVJUIiBpb21tdS4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vaW9tbXUuaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL2Fic19hZGRyLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vbG1iLmg+CisjaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KKworI2luY2x1ZGUgImRhcnQuaCIKKworZXh0ZXJuIGludCBpb21tdV9mb3JjZV9vbjsKKworLyogUGh5c2ljYWwgYmFzZSBhZGRyZXNzIGFuZCBzaXplIG9mIHRoZSBEQVJUIHRhYmxlICovCit1bnNpZ25lZCBsb25nIGRhcnRfdGFibGViYXNlOyAvKiBleHBvcnRlZCB0byBodGFiX2luaXRpYWxpemUgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRhcnRfdGFibGVzaXplOworCisvKiBWaXJ0dWFsIGJhc2UgYWRkcmVzcyBvZiB0aGUgREFSVCB0YWJsZSAqLworc3RhdGljIHUzMiAqZGFydF92YmFzZTsKKworLyogTWFwcGVkIGJhc2UgYWRkcmVzcyBmb3IgdGhlIGRhcnQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgKl9faW9tZW0gZGFydDsKKworLyogRHVtbXkgdmFsIHRoYXQgZW50cmllcyBhcmUgc2V0IHRvIHdoZW4gdW51c2VkICovCitzdGF0aWMgdW5zaWduZWQgaW50IGRhcnRfZW1wdHl2YWw7CisKK3N0YXRpYyBzdHJ1Y3QgaW9tbXVfdGFibGUgaW9tbXVfdGFibGVfZGFydDsKK3N0YXRpYyBpbnQgaW9tbXVfdGFibGVfZGFydF9pbml0ZWQ7CitzdGF0aWMgaW50IGRhcnRfZGlydHk7CitzdGF0aWMgaW50IGRhcnRfaXNfdTQ7CisKKyNkZWZpbmUgREJHKC4uLikKKworc3RhdGljIGlubGluZSB2b2lkIGRhcnRfdGxiX2ludmFsaWRhdGVfYWxsKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBsID0gMDsKKwl1bnNpZ25lZCBpbnQgcmVnLCBpbnZfYml0OworCXVuc2lnbmVkIGxvbmcgbGltaXQ7CisKKwlEQkcoImRhcnQ6IGZsdXNoXG4iKTsKKworCS8qIFRvIGludmFsaWRhdGUgdGhlIERBUlQsIHNldCB0aGUgREFSVENOVExfRkxVU0hUTEIgYml0IGluIHRoZQorCSAqIGNvbnRyb2wgcmVnaXN0ZXIgYW5kIHdhaXQgZm9yIGl0IHRvIGNsZWFyLgorCSAqCisJICogR290Y2hhOiBTb21ldGltZXMsIHRoZSBEQVJUIHdvbid0IGRldGVjdCB0aGF0IHRoZSBiaXQgZ2V0cworCSAqIHNldC4gSWYgc28sIGNsZWFyIGl0IGFuZCBzZXQgaXQgYWdhaW4uCisJICovCisKKwlsaW1pdCA9IDA7CisKKwlpbnZfYml0ID0gZGFydF9pc191NCA/IERBUlRfQ05UTF9VNF9GTFVTSFRMQiA6IERBUlRfQ05UTF9VM19GTFVTSFRMQjsKK3JldHJ5OgorCWwgPSAwOworCXJlZyA9IERBUlRfSU4oREFSVF9DTlRMKTsKKwlyZWcgfD0gaW52X2JpdDsKKwlEQVJUX09VVChEQVJUX0NOVEwsIHJlZyk7CisKKwl3aGlsZSAoKERBUlRfSU4oREFSVF9DTlRMKSAmIGludl9iaXQpICYmIGwgPCAoMUwgPDwgbGltaXQpKQorCQlsKys7CisJaWYgKGwgPT0gKDFMIDw8IGxpbWl0KSkgeworCQlpZiAobGltaXQgPCA0KSB7CisJCQlsaW1pdCsrOworCQkgICAgICAgIHJlZyA9IERBUlRfSU4oREFSVF9DTlRMKTsKKwkJICAgICAgICByZWcgJj0gfmludl9iaXQ7CisJCQlEQVJUX09VVChEQVJUX0NOVEwsIHJlZyk7CisJCQlnb3RvIHJldHJ5OworCQl9IGVsc2UKKwkJCXBhbmljKCJEQVJUOiBUTEIgZGlkIG5vdCBmbHVzaCBhZnRlciB3YWl0aW5nIGEgbG9uZyAiCisJCQkgICAgICAidGltZS4gQnVnZ3kgVTMgPyIpOworCX0KK30KKworc3RhdGljIHZvaWQgZGFydF9mbHVzaChzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCkKK3sKKwlpZiAoZGFydF9kaXJ0eSkKKwkJZGFydF90bGJfaW52YWxpZGF0ZV9hbGwoKTsKKwlkYXJ0X2RpcnR5ID0gMDsKK30KKworc3RhdGljIHZvaWQgZGFydF9idWlsZChzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgbG9uZyBpbmRleCwKKwkJICAgICAgIGxvbmcgbnBhZ2VzLCB1bnNpZ25lZCBsb25nIHVhZGRyLAorCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCXVuc2lnbmVkIGludCAqZHA7CisJdW5zaWduZWQgaW50IHJwbjsKKworCURCRygiZGFydDogYnVpbGQgYXQ6ICVseCwgJWx4LCBhZGRyOiAleFxuIiwgaW5kZXgsIG5wYWdlcywgdWFkZHIpOworCisJaW5kZXggPDw9IERBUlRfUEFHRV9GQUNUT1I7CisJbnBhZ2VzIDw8PSBEQVJUX1BBR0VfRkFDVE9SOworCisJZHAgPSAoKHVuc2lnbmVkIGludCopdGJsLT5pdF9iYXNlKSArIGluZGV4OworCisJLyogT24gVTMsIGFsbCBtZW1vcnkgaXMgY29udGlnb3VzLCBzbyB3ZSBjYW4gbW92ZSB0aGlzCisJICogb3V0IG9mIHRoZSBsb29wLgorCSAqLworCXdoaWxlIChucGFnZXMtLSkgeworCQlycG4gPSB2aXJ0X3RvX2Ficyh1YWRkcikgPj4gREFSVF9QQUdFX1NISUZUOworCisJCSooZHArKykgPSBEQVJUTUFQX1ZBTElEIHwgKHJwbiAmIERBUlRNQVBfUlBOTUFTSyk7CisKKwkJdWFkZHIgKz0gREFSVF9QQUdFX1NJWkU7CisJfQorCisJZGFydF9kaXJ0eSA9IDE7Cit9CisKKworc3RhdGljIHZvaWQgZGFydF9mcmVlKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBsb25nIGluZGV4LCBsb25nIG5wYWdlcykKK3sKKwl1bnNpZ25lZCBpbnQgKmRwOworCisJLyogV2UgZG9uJ3Qgd29ycnkgYWJvdXQgZmx1c2hpbmcgdGhlIFRMQiBjYWNoZS4gVGhlIG9ubHkgZHJhd2JhY2sgb2YKKwkgKiBub3QgZG9pbmcgaXQgaXMgdGhhdCB3ZSB3b24ndCBjYXRjaCBidWdneSBkZXZpY2UgZHJpdmVycyBkb2luZworCSAqIGJhZCBETUFzLCBidXQgdGhlbiBubyAzMi1iaXQgYXJjaGl0ZWN0dXJlIGV2ZXIgZG9lcyBlaXRoZXIuCisJICovCisKKwlEQkcoImRhcnQ6IGZyZWUgYXQ6ICVseCwgJWx4XG4iLCBpbmRleCwgbnBhZ2VzKTsKKworCWluZGV4IDw8PSBEQVJUX1BBR0VfRkFDVE9SOworCW5wYWdlcyA8PD0gREFSVF9QQUdFX0ZBQ1RPUjsKKworCWRwICA9ICgodW5zaWduZWQgaW50ICopdGJsLT5pdF9iYXNlKSArIGluZGV4OworCisJd2hpbGUgKG5wYWdlcy0tKQorCQkqKGRwKyspID0gZGFydF9lbXB0eXZhbDsKK30KKworCitzdGF0aWMgaW50IGRhcnRfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRhcnRfbm9kZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHRtcCwgYmFzZSwgc2l6ZTsKKwlzdHJ1Y3QgcmVzb3VyY2UgcjsKKworCWlmIChkYXJ0X3RhYmxlYmFzZSA9PSAwIHx8IGRhcnRfdGFibGVzaXplID09IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiREFSVDogdGFibGUgbm90IGFsbG9jYXRlZCwgdXNpbmcgIgorCQkgICAgICAgImRpcmVjdCBETUFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShkYXJ0X25vZGUsIDAsICZyKSkKKwkJcGFuaWMoIkRBUlQ6IGNhbid0IGdldCByZWdpc3RlciBiYXNlICEgIik7CisKKwkvKiBNYWtlIHN1cmUgbm90aGluZyBmcm9tIHRoZSBEQVJUIHJhbmdlIHJlbWFpbnMgaW4gdGhlIENQVSBjYWNoZQorCSAqIGZyb20gYSBwcmV2aW91cyBtYXBwaW5nIHRoYXQgZXhpc3RlZCBiZWZvcmUgdGhlIGtlcm5lbCB0b29rCisJICogb3ZlcgorCSAqLworCWZsdXNoX2RjYWNoZV9waHlzX3JhbmdlKGRhcnRfdGFibGViYXNlLAorCQkJCWRhcnRfdGFibGViYXNlICsgZGFydF90YWJsZXNpemUpOworCisJLyogQWxsb2NhdGUgYSBzcGFyZSBwYWdlIHRvIG1hcCBhbGwgaW52YWxpZCBEQVJUIHBhZ2VzLiBXZSBuZWVkIHRvIGRvCisJICogdGhhdCB0byB3b3JrIGFyb3VuZCB3aGF0IGxvb2tzIGxpa2UgYSBwcm9ibGVtIHdpdGggdGhlIEhUIGJyaWRnZQorCSAqIHByZWZldGNoaW5nIGludG8gaW52YWxpZCBwYWdlcyBhbmQgY29ycnVwdGluZyBkYXRhCisJICovCisJdG1wID0gbG1iX2FsbG9jKERBUlRfUEFHRV9TSVpFLCBEQVJUX1BBR0VfU0laRSk7CisJaWYgKCF0bXApCisJCXBhbmljKCJEQVJUOiBDYW5ub3QgYWxsb2NhdGUgc3BhcmUgcGFnZSEiKTsKKwlkYXJ0X2VtcHR5dmFsID0gREFSVE1BUF9WQUxJRCB8ICgodG1wID4+IERBUlRfUEFHRV9TSElGVCkgJgorCQkJCQkgREFSVE1BUF9SUE5NQVNLKTsKKworCS8qIE1hcCBpbiBEQVJUIHJlZ2lzdGVycyAqLworCWRhcnQgPSBpb3JlbWFwKHIuc3RhcnQsIHIuZW5kIC0gci5zdGFydCArIDEpOworCWlmIChkYXJ0ID09IE5VTEwpCisJCXBhbmljKCJEQVJUOiBDYW5ub3QgbWFwIHJlZ2lzdGVycyEiKTsKKworCS8qIE1hcCBpbiBEQVJUIHRhYmxlICovCisJZGFydF92YmFzZSA9IGlvcmVtYXAodmlydF90b19hYnMoZGFydF90YWJsZWJhc2UpLCBkYXJ0X3RhYmxlc2l6ZSk7CisKKwkvKiBGaWxsIGluaXRpYWwgdGFibGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGFydF90YWJsZXNpemUvNDsgaSsrKQorCQlkYXJ0X3ZiYXNlW2ldID0gZGFydF9lbXB0eXZhbDsKKworCS8qIEluaXRpYWxpemUgREFSVCB3aXRoIHRhYmxlIGJhc2UgYW5kIGVuYWJsZSBpdC4gKi8KKwliYXNlID0gZGFydF90YWJsZWJhc2UgPj4gREFSVF9QQUdFX1NISUZUOworCXNpemUgPSBkYXJ0X3RhYmxlc2l6ZSA+PiBEQVJUX1BBR0VfU0hJRlQ7CisJaWYgKGRhcnRfaXNfdTQpIHsKKwkJc2l6ZSAmPSBEQVJUX1NJWkVfVTRfU0laRV9NQVNLOworCQlEQVJUX09VVChEQVJUX0JBU0VfVTQsIGJhc2UpOworCQlEQVJUX09VVChEQVJUX1NJWkVfVTQsIHNpemUpOworCQlEQVJUX09VVChEQVJUX0NOVEwsIERBUlRfQ05UTF9VNF9FTkFCTEUpOworCX0gZWxzZSB7CisJCXNpemUgJj0gREFSVF9DTlRMX1UzX1NJWkVfTUFTSzsKKwkJREFSVF9PVVQoREFSVF9DTlRMLAorCQkJIERBUlRfQ05UTF9VM19FTkFCTEUgfAorCQkJIChiYXNlIDw8IERBUlRfQ05UTF9VM19CQVNFX1NISUZUKSB8CisJCQkgKHNpemUgPDwgREFSVF9DTlRMX1UzX1NJWkVfU0hJRlQpKTsKKwl9CisKKwkvKiBJbnZhbGlkYXRlIERBUlQgdG8gZ2V0IHJpZCBvZiBwb3NzaWJsZSBzdGFsZSBUTEJzICovCisJZGFydF90bGJfaW52YWxpZGF0ZV9hbGwoKTsKKworCXByaW50ayhLRVJOX0lORk8gIkRBUlQgSU9NTVUgaW5pdGlhbGl6ZWQgZm9yICVzIHR5cGUgY2hpcHNldFxuIiwKKwkgICAgICAgZGFydF9pc191NCA/ICJVNCIgOiAiVTMiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpb21tdV90YWJsZV9kYXJ0X3NldHVwKHZvaWQpCit7CisJaW9tbXVfdGFibGVfZGFydC5pdF9idXNubyA9IDA7CisJaW9tbXVfdGFibGVfZGFydC5pdF9vZmZzZXQgPSAwOworCS8qIGl0X3NpemUgaXMgaW4gbnVtYmVyIG9mIGVudHJpZXMgKi8KKwlpb21tdV90YWJsZV9kYXJ0Lml0X3NpemUgPSAoZGFydF90YWJsZXNpemUgLyBzaXplb2YodTMyKSkgPj4gREFSVF9QQUdFX0ZBQ1RPUjsKKworCS8qIEluaXRpYWxpemUgdGhlIGNvbW1vbiBJT01NVSBjb2RlICovCisJaW9tbXVfdGFibGVfZGFydC5pdF9iYXNlID0gKHVuc2lnbmVkIGxvbmcpZGFydF92YmFzZTsKKwlpb21tdV90YWJsZV9kYXJ0Lml0X2luZGV4ID0gMDsKKwlpb21tdV90YWJsZV9kYXJ0Lml0X2Jsb2Nrc2l6ZSA9IDE7CisJaW9tbXVfaW5pdF90YWJsZSgmaW9tbXVfdGFibGVfZGFydCk7CisKKwkvKiBSZXNlcnZlIHRoZSBsYXN0IHBhZ2Ugb2YgdGhlIERBUlQgdG8gYXZvaWQgcG9zc2libGUgcHJlZmV0Y2gKKwkgKiBwYXN0IHRoZSBEQVJUIG1hcHBlZCBhcmVhCisJICovCisJc2V0X2JpdChpb21tdV90YWJsZV9kYXJ0Lml0X3NpemUgLSAxLCBpb21tdV90YWJsZV9kYXJ0Lml0X21hcCk7Cit9CisKK3N0YXRpYyB2b2lkIGlvbW11X2Rldl9zZXR1cF9kYXJ0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKKworCS8qIFdlIG9ubHkgaGF2ZSBvbmUgaW9tbXUgdGFibGUgb24gdGhlIG1hYyBmb3Igbm93LCB3aGljaCBtYWtlcworCSAqIHRoaW5ncyBzaW1wbGUuIFNldHVwIGFsbCBQQ0kgZGV2aWNlcyB0byBwb2ludCB0byB0aGlzIHRhYmxlCisJICoKKwkgKiBXZSBtdXN0IHVzZSBwY2lfZGV2aWNlX3RvX09GX25vZGUoKSB0byBtYWtlIHN1cmUgdGhhdAorCSAqIHdlIGdldCB0aGUgcmVhbCAiZmluYWwiIHBvaW50ZXIgdG8gdGhlIGRldmljZSBpbiB0aGUKKwkgKiBwY2lfZGV2IHN5c2RhdGEgYW5kIG5vdCB0aGUgdGVtcG9yYXJ5IFBIQiBvbmUKKwkgKi8KKwlkbiA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShkZXYpOworCisJaWYgKGRuKQorCQlQQ0lfRE4oZG4pLT5pb21tdV90YWJsZSA9ICZpb21tdV90YWJsZV9kYXJ0OworfQorCitzdGF0aWMgdm9pZCBpb21tdV9idXNfc2V0dXBfZGFydChzdHJ1Y3QgcGNpX2J1cyAqYnVzKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47CisKKwlpZiAoIWlvbW11X3RhYmxlX2RhcnRfaW5pdGVkKSB7CisJCWlvbW11X3RhYmxlX2RhcnRfaW5pdGVkID0gMTsKKwkJaW9tbXVfdGFibGVfZGFydF9zZXR1cCgpOworCX0KKworCWRuID0gcGNpX2J1c190b19PRl9ub2RlKGJ1cyk7CisKKwlpZiAoZG4pCisJCVBDSV9ETihkbiktPmlvbW11X3RhYmxlID0gJmlvbW11X3RhYmxlX2RhcnQ7Cit9CisKK3N0YXRpYyB2b2lkIGlvbW11X2Rldl9zZXR1cF9udWxsKHN0cnVjdCBwY2lfZGV2ICpkZXYpIHsgfQorc3RhdGljIHZvaWQgaW9tbXVfYnVzX3NldHVwX251bGwoc3RydWN0IHBjaV9idXMgKmJ1cykgeyB9CisKK3ZvaWQgaW9tbXVfaW5pdF9lYXJseV9kYXJ0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKKworCS8qIEZpbmQgdGhlIERBUlQgaW4gdGhlIGRldmljZS10cmVlICovCisJZG4gPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCAiZGFydCIsICJ1My1kYXJ0Iik7CisJaWYgKGRuID09IE5VTEwpIHsKKwkJZG4gPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCAiZGFydCIsICJ1NC1kYXJ0Iik7CisJCWlmIChkbiA9PSBOVUxMKQorCQkJZ290byBiYWlsOworCQlkYXJ0X2lzX3U0ID0gMTsKKwl9CisKKwkvKiBTZXR1cCBsb3cgbGV2ZWwgVENFIG9wZXJhdGlvbnMgZm9yIHRoZSBjb3JlIElPTU1VIGNvZGUgKi8KKwlwcGNfbWQudGNlX2J1aWxkID0gZGFydF9idWlsZDsKKwlwcGNfbWQudGNlX2ZyZWUgID0gZGFydF9mcmVlOworCXBwY19tZC50Y2VfZmx1c2ggPSBkYXJ0X2ZsdXNoOworCisJLyogSW5pdGlhbGl6ZSB0aGUgREFSVCBIVyAqLworCWlmIChkYXJ0X2luaXQoZG4pID09IDApIHsKKwkJcHBjX21kLmlvbW11X2Rldl9zZXR1cCA9IGlvbW11X2Rldl9zZXR1cF9kYXJ0OworCQlwcGNfbWQuaW9tbXVfYnVzX3NldHVwID0gaW9tbXVfYnVzX3NldHVwX2RhcnQ7CisKKwkJLyogU2V0dXAgcGNpX2RtYSBvcHMgKi8KKwkJcGNpX2lvbW11X2luaXQoKTsKKworCQlyZXR1cm47CisJfQorCisgYmFpbDoKKwkvKiBJZiBpbml0IGZhaWxlZCwgdXNlIGRpcmVjdCBpb21tdSBhbmQgbnVsbCBzZXR1cCBmdW5jdGlvbnMgKi8KKwlwcGNfbWQuaW9tbXVfZGV2X3NldHVwID0gaW9tbXVfZGV2X3NldHVwX251bGw7CisJcHBjX21kLmlvbW11X2J1c19zZXR1cCA9IGlvbW11X2J1c19zZXR1cF9udWxsOworCisJLyogU2V0dXAgcGNpX2RtYSBvcHMgKi8KKwlwY2lfZGlyZWN0X2lvbW11X2luaXQoKTsKK30KKworCit2b2lkIF9faW5pdCBhbGxvY19kYXJ0X3RhYmxlKHZvaWQpCit7CisJLyogT25seSByZXNlcnZlIERBUlQgc3BhY2UgaWYgbWFjaGluZSBoYXMgbW9yZSB0aGFuIDJHQiBvZiBSQU0KKwkgKiBvciBpZiByZXF1ZXN0ZWQgd2l0aCBpb21tdT1vbiBvbiBjbWRsaW5lLgorCSAqLworCWlmIChsbWJfZW5kX29mX0RSQU0oKSA8PSAweDgwMDAwMDAwdWxsICYmICFpb21tdV9mb3JjZV9vbikKKwkJcmV0dXJuOworCisJLyogNTEyIHBhZ2VzICgyTUIpIGlzIG1heCBEQVJUIHRhYmxlc2l6ZS4gKi8KKwlkYXJ0X3RhYmxlc2l6ZSA9IDFVTCA8PCAyMTsKKwkvKiAxNk1CICgxIDw8IDI0KSBhbGlnbm1lbnQuIFdlIGFsbG9jYXRlIGEgZnVsbCAxNk1iIGNodWNrIHNpbmNlIHdlCisJICogd2lsbCBibG93IHVwIGFuIGVudGlyZSBsYXJnZSBwYWdlIGFueXdheSBpbiB0aGUga2VybmVsIG1hcHBpbmcKKwkgKi8KKwlkYXJ0X3RhYmxlYmFzZSA9ICh1bnNpZ25lZCBsb25nKQorCQlhYnNfdG9fdmlydChsbWJfYWxsb2NfYmFzZSgxVUw8PDI0LCAxVUw8PDI0LCAweDgwMDAwMDAwTCkpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiREFSVCB0YWJsZSBhbGxvY2F0ZWQgYXQ6ICVseFxuIiwgZGFydF90YWJsZWJhc2UpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjRjOWRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMKQEAgLTAsMCArMSwzMTcgQEAKKy8qCisgKiBGU0wgU29DIHNldHVwIGNvZGUKKyAqCisgKiBNYWludGFpbmVkIGJ5IEt1bWFyIEdhbGEgKHNlZSBNQUlOVEFJTkVSUyBmb3IgY29udGFjdCBpbmZvcm1hdGlvbikKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZnNsX2RldmljZXMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KKyNpbmNsdWRlIDxtbS9tbXVfZGVjbC5oPgorCitzdGF0aWMgcGh5c19hZGRyX3QgaW1tcmJhc2UgPSAtMTsKKworcGh5c19hZGRyX3QgZ2V0X2ltbXJiYXNlKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpzb2M7CisKKwlpZiAoaW1tcmJhc2UgIT0gLTEpCisJCXJldHVybiBpbW1yYmFzZTsKKworCXNvYyA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJzb2MiKTsKKwlpZiAoc29jICE9IDApIHsKKwkJdW5zaWduZWQgaW50IHNpemU7CisJCXZvaWQgKnByb3AgPSBnZXRfcHJvcGVydHkoc29jLCAicmVnIiwgJnNpemUpOworCQlpbW1yYmFzZSA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKHNvYywgcHJvcCk7CisJCW9mX25vZGVfcHV0KHNvYyk7CisJfTsKKworCXJldHVybiBpbW1yYmFzZTsKK30KK0VYUE9SVF9TWU1CT0woZ2V0X2ltbXJiYXNlKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBnZmFyX3R4X2ludHIgPSAidHgiOworc3RhdGljIGNvbnN0IGNoYXIgKiBnZmFyX3J4X2ludHIgPSAicngiOworc3RhdGljIGNvbnN0IGNoYXIgKiBnZmFyX2Vycl9pbnRyID0gImVycm9yIjsKKworc3RhdGljIGludCBfX2luaXQgZ2Zhcl9vZl9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICptZGlvX2RldiwgKmdmYXJfZGV2OworCXN0cnVjdCByZXNvdXJjZSByZXM7CisJaW50IHJldDsKKworCWZvciAobnAgPSBOVUxMLCBpID0gMDsgKG5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUobnAsICJtZGlvIiwgImdpYW5mYXIiKSkgIT0gTlVMTDsgaSsrKSB7CisJCWludCBrOworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkID0gTlVMTDsKKwkJc3RydWN0IGdpYW5mYXJfbWRpb19kYXRhIG1kaW9fZGF0YTsKKworCQltZW1zZXQoJnJlcywgMCwgc2l6ZW9mKHJlcykpOworCQltZW1zZXQoJm1kaW9fZGF0YSwgMCwgc2l6ZW9mKG1kaW9fZGF0YSkpOworCisJCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpOworCQlpZiAocmV0KQorCQkJZ290byBtZGlvX2VycjsKKworCQltZGlvX2RldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImZzbC1naWFuZmFyX21kaW8iLCByZXMuc3RhcnQsICZyZXMsIDEpOworCQlpZiAoSVNfRVJSKG1kaW9fZGV2KSkgeworCQkJcmV0ID0gUFRSX0VSUihtZGlvX2Rldik7CisJCQlnb3RvIG1kaW9fZXJyOworCQl9CisKKwkJZm9yIChrID0gMDsgayA8IDMyOyBrKyspCisJCQltZGlvX2RhdGEuaXJxW2tdID0gLTE7CisKKwkJd2hpbGUgKChjaGlsZCA9IG9mX2dldF9uZXh0X2NoaWxkKG5wLCBjaGlsZCkpICE9IE5VTEwpIHsKKwkJCWlmIChjaGlsZC0+bl9pbnRycykgeworCQkJCXUzMiAqaWQgPSAodTMyICopIGdldF9wcm9wZXJ0eShjaGlsZCwgInJlZyIsIE5VTEwpOworCQkJCW1kaW9fZGF0YS5pcnFbKmlkXSA9IGNoaWxkLT5pbnRyc1swXS5saW5lOworCQkJfQorCQl9CisKKwkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKG1kaW9fZGV2LCAmbWRpb19kYXRhLCBzaXplb2Yoc3RydWN0IGdpYW5mYXJfbWRpb19kYXRhKSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG1kaW9fdW5yZWc7CisJfQorCisJZm9yIChucCA9IE5VTEwsIGkgPSAwOyAobnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShucCwgIm5ldHdvcmsiLCAiZ2lhbmZhciIpKSAhPSBOVUxMOyBpKyspIHsKKwkJc3RydWN0IHJlc291cmNlIHJbNF07CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGh5LCAqbWRpbzsKKwkJc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSBnZmFyX2RhdGE7CisJCXVuc2lnbmVkIGludCAqaWQ7CisJCWNoYXIgKm1vZGVsOworCQl2b2lkICptYWNfYWRkcjsKKwkJcGhhbmRsZSAqcGg7CisKKwkJbWVtc2V0KHIsIDAsIHNpemVvZihyKSk7CisJCW1lbXNldCgmZ2Zhcl9kYXRhLCAwLCBzaXplb2YoZ2Zhcl9kYXRhKSk7CisKKwkJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJbMF0pOworCQlpZiAocmV0KQorCQkJZ290byBnZmFyX2VycjsKKworCQlyWzFdLnN0YXJ0ID0gbnAtPmludHJzWzBdLmxpbmU7CisJCXJbMV0uZW5kID0gbnAtPmludHJzWzBdLmxpbmU7CisJCXJbMV0uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKKworCQltb2RlbCA9IGdldF9wcm9wZXJ0eShucCwgIm1vZGVsIiwgTlVMTCk7CisKKwkJLyogSWYgd2UgYXJlbid0IHRoZSBGRUMgd2UgaGF2ZSBtdWx0aXBsZSBpbnRlcnJ1cHRzICovCisJCWlmIChtb2RlbCAmJiBzdHJjYXNlY21wKG1vZGVsLCAiRkVDIikpIHsKKwkJCXJbMV0ubmFtZSA9IGdmYXJfdHhfaW50cjsKKworCQkJclsyXS5uYW1lID0gZ2Zhcl9yeF9pbnRyOworCQkJclsyXS5zdGFydCA9IG5wLT5pbnRyc1sxXS5saW5lOworCQkJclsyXS5lbmQgPSBucC0+aW50cnNbMV0ubGluZTsKKwkJCXJbMl0uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKKworCQkJclszXS5uYW1lID0gZ2Zhcl9lcnJfaW50cjsKKwkJCXJbM10uc3RhcnQgPSBucC0+aW50cnNbMl0ubGluZTsKKwkJCXJbM10uZW5kID0gbnAtPmludHJzWzJdLmxpbmU7CisJCQlyWzNdLmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7CisJCX0KKworCQlnZmFyX2RldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImZzbC1naWFuZmFyIiwgaSwgJnJbMF0sIG5wLT5uX2ludHJzICsgMSk7CisKKwkJaWYgKElTX0VSUihnZmFyX2RldikpIHsKKwkJCXJldCA9IFBUUl9FUlIoZ2Zhcl9kZXYpOworCQkJZ290byBnZmFyX2VycjsKKwkJfQorCisJCW1hY19hZGRyID0gZ2V0X3Byb3BlcnR5KG5wLCAiYWRkcmVzcyIsIE5VTEwpOworCQltZW1jcHkoZ2Zhcl9kYXRhLm1hY19hZGRyLCBtYWNfYWRkciwgNik7CisKKwkJaWYgKG1vZGVsICYmICFzdHJjYXNlY21wKG1vZGVsLCAiVFNFQyIpKQorCQkJZ2Zhcl9kYXRhLmRldmljZV9mbGFncyA9CisJCQkJRlNMX0dJQU5GQVJfREVWX0hBU19HSUdBQklUIHwKKwkJCQlGU0xfR0lBTkZBUl9ERVZfSEFTX0NPQUxFU0NFIHwKKwkJCQlGU0xfR0lBTkZBUl9ERVZfSEFTX1JNT04gfAorCQkJCUZTTF9HSUFORkFSX0RFVl9IQVNfTVVMVElfSU5UUjsKKwkJaWYgKG1vZGVsICYmICFzdHJjYXNlY21wKG1vZGVsLCAiZVRTRUMiKSkKKwkJCWdmYXJfZGF0YS5kZXZpY2VfZmxhZ3MgPQorCQkJCUZTTF9HSUFORkFSX0RFVl9IQVNfR0lHQUJJVCB8CisJCQkJRlNMX0dJQU5GQVJfREVWX0hBU19DT0FMRVNDRSB8CisJCQkJRlNMX0dJQU5GQVJfREVWX0hBU19STU9OIHwKKwkJCQlGU0xfR0lBTkZBUl9ERVZfSEFTX01VTFRJX0lOVFIgfAorCQkJCUZTTF9HSUFORkFSX0RFVl9IQVNfQ1NVTSB8CisJCQkJRlNMX0dJQU5GQVJfREVWX0hBU19WTEFOIHwKKwkJCQlGU0xfR0lBTkZBUl9ERVZfSEFTX0VYVEVOREVEX0hBU0g7CisKKwkJcGggPSAocGhhbmRsZSAqKSBnZXRfcHJvcGVydHkobnAsICJwaHktaGFuZGxlIiwgTlVMTCk7CisJCXBoeSA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKCpwaCk7CisKKwkJaWYgKHBoeSA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byBnZmFyX3VucmVnOworCQl9CisKKwkJbWRpbyA9IG9mX2dldF9wYXJlbnQocGh5KTsKKworCQlpZCA9ICh1MzIgKikgZ2V0X3Byb3BlcnR5KHBoeSwgInJlZyIsIE5VTEwpOworCQlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG1kaW8sIDAsICZyZXMpOworCQlpZiAocmV0KSB7CisJCQlvZl9ub2RlX3B1dChwaHkpOworCQkJb2Zfbm9kZV9wdXQobWRpbyk7CisJCQlnb3RvIGdmYXJfdW5yZWc7CisJCX0KKworCQlnZmFyX2RhdGEucGh5X2lkID0gKmlkOworCQlnZmFyX2RhdGEuYnVzX2lkID0gcmVzLnN0YXJ0OworCisJCW9mX25vZGVfcHV0KHBoeSk7CisJCW9mX25vZGVfcHV0KG1kaW8pOworCisJCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShnZmFyX2RldiwgJmdmYXJfZGF0YSwgc2l6ZW9mKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEpKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZ2Zhcl91bnJlZzsKKwl9CisKKwlyZXR1cm4gMDsKKworbWRpb191bnJlZzoKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihtZGlvX2Rldik7CittZGlvX2VycjoKKwlyZXR1cm4gcmV0OworCitnZmFyX3VucmVnOgorCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGdmYXJfZGV2KTsKK2dmYXJfZXJyOgorCXJldHVybiByZXQ7Cit9CithcmNoX2luaXRjYWxsKGdmYXJfb2ZfaW5pdCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGZzbF9pMmNfb2ZfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqaTJjX2RldjsKKwlpbnQgcmV0OworCisJZm9yIChucCA9IE5VTEwsIGkgPSAwOyAobnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShucCwgImkyYyIsICJmc2wtaTJjIikpICE9IE5VTEw7IGkrKykgeworCQlzdHJ1Y3QgcmVzb3VyY2UgclsyXTsKKwkJc3RydWN0IGZzbF9pMmNfcGxhdGZvcm1fZGF0YSBpMmNfZGF0YTsKKwkJdW5zaWduZWQgY2hhciAqIGZsYWdzID0gTlVMTDsKKworCQltZW1zZXQoJnIsIDAsIHNpemVvZihyKSk7CisJCW1lbXNldCgmaTJjX2RhdGEsIDAsIHNpemVvZihpMmNfZGF0YSkpOworCisJCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyWzBdKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gaTJjX2VycjsKKworCQlyWzFdLnN0YXJ0ID0gbnAtPmludHJzWzBdLmxpbmU7CisJCXJbMV0uZW5kID0gbnAtPmludHJzWzBdLmxpbmU7CisJCXJbMV0uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKKworCQlpMmNfZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiZnNsLWkyYyIsIGksIHIsIDIpOworCQlpZiAoSVNfRVJSKGkyY19kZXYpKSB7CisJCQlyZXQgPSBQVFJfRVJSKGkyY19kZXYpOworCQkJZ290byBpMmNfZXJyOworCQl9CisKKwkJaTJjX2RhdGEuZGV2aWNlX2ZsYWdzID0gMDsKKwkJZmxhZ3MgPSBnZXRfcHJvcGVydHkobnAsICJkZnNyciIsIE5VTEwpOworCQlpZiAoZmxhZ3MpCisJCQlpMmNfZGF0YS5kZXZpY2VfZmxhZ3MgfD0gRlNMX0kyQ19ERVZfU0VQQVJBVEVfREZTUlI7CisKKwkJZmxhZ3MgPSBnZXRfcHJvcGVydHkobnAsICJmc2w1MjAwLWNsb2NraW5nIiwgTlVMTCk7CisJCWlmIChmbGFncykKKwkJCWkyY19kYXRhLmRldmljZV9mbGFncyB8PSBGU0xfSTJDX0RFVl9DTE9DS181MjAwOworCisJCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShpMmNfZGV2LCAmaTJjX2RhdGEsIHNpemVvZihzdHJ1Y3QgZnNsX2kyY19wbGF0Zm9ybV9kYXRhKSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGkyY191bnJlZzsKKwl9CisKKwlyZXR1cm4gMDsKKworaTJjX3VucmVnOgorCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGkyY19kZXYpOworaTJjX2VycjoKKwlyZXR1cm4gcmV0OworfQorYXJjaF9pbml0Y2FsbChmc2xfaTJjX29mX2luaXQpOworCisjaWZkZWYgQ09ORklHX1BQQ184M3h4CitzdGF0aWMgaW50IF9faW5pdCBtcGM4M3h4X3dkdF9pbml0KHZvaWQpCit7CisJc3RydWN0IHJlc291cmNlIHI7CisJc3RydWN0IGRldmljZV9ub2RlICpzb2MsICpucDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXY7CisJdW5zaWduZWQgaW50ICpmcmVxOworCWludCByZXQ7CisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsICJ3YXRjaGRvZyIsICJtcGM4M3h4X3dkdCIpOworCisJaWYgKCFucCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG1wYzgzeHhfd2R0X25vZGV2OworCX0KKworCXNvYyA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJzb2MiKTsKKworCWlmICghc29jKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gbXBjODN4eF93ZHRfbm9zb2M7CisJfQorCisJZnJlcSA9ICh1bnNpZ25lZCBpbnQgKilnZXRfcHJvcGVydHkoc29jLCAiYnVzLWZyZXF1ZW5jeSIsIE5VTEwpOworCWlmICghZnJlcSkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG1wYzgzeHhfd2R0X2VycjsKKwl9CisKKwltZW1zZXQoJnIsIDAsIHNpemVvZihyKSk7CisKKwlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcik7CisJaWYgKHJldCkKKwkJZ290byBtcGM4M3h4X3dkdF9lcnI7CisKKwlkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJtcGM4M3h4X3dkdCIsIDAsICZyLCAxKTsKKwlpZiAoSVNfRVJSKGRldikpIHsKKwkJcmV0ID0gUFRSX0VSUihkZXYpOworCQlnb3RvIG1wYzgzeHhfd2R0X2VycjsKKwl9CisKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEoZGV2LCBmcmVxLCBzaXplb2YoaW50KSk7CisJaWYgKHJldCkKKwkJZ290byBtcGM4M3h4X3dkdF91bnJlZzsKKworCW9mX25vZGVfcHV0KHNvYyk7CisJb2Zfbm9kZV9wdXQobnApOworCisJcmV0dXJuIDA7CisKK21wYzgzeHhfd2R0X3VucmVnOgorCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGRldik7CittcGM4M3h4X3dkdF9lcnI6CisJb2Zfbm9kZV9wdXQoc29jKTsKK21wYzgzeHhfd2R0X25vc29jOgorCW9mX25vZGVfcHV0KG5wKTsKK21wYzgzeHhfd2R0X25vZGV2OgorCXJldHVybiByZXQ7Cit9CithcmNoX2luaXRjYWxsKG1wYzgzeHhfd2R0X2luaXQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuaCBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MzNkM2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX19QUENfRlNMX1NPQ19ICisjZGVmaW5lIF9fUFBDX0ZTTF9TT0NfSAorI2lmZGVmIF9fS0VSTkVMX18KKworZXh0ZXJuIHBoeXNfYWRkcl90IGdldF9pbW1yYmFzZSh2b2lkKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9pcGljLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2lwaWMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9wcGMvc3lzbGliL2lwaWMuYwpyZW5hbWUgdG8gYXJjaC9wb3dlcnBjL3N5c2Rldi9pcGljLmMKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9pcGljLmggYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2lwaWMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9wcGMvc3lzbGliL2lwaWMuaApyZW5hbWUgdG8gYXJjaC9wb3dlcnBjL3N5c2Rldi9pcGljLmgKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKaW5kZXggNThkMWNjMi4uNGYyNjMwNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKQEAgLTEzLDYgKzEzLDkgQEAKICAqLwogCiAjdW5kZWYgREVCVUcKKyN1bmRlZiBERUJVR19JUEkKKyN1bmRlZiBERUJVR19JUlEKKyN1bmRlZiBERUJVR19MT1cKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC00NSw3ICs0OCwxMSBAQAogc3RhdGljIERFRklORV9TUElOTE9DSyhtcGljX2xvY2spOwogCiAjaWZkZWYgQ09ORklHX1BQQzMyCS8qIFhYWCBmb3Igbm93ICovCi0jZGVmaW5lIGRpc3RyaWJ1dGVfaXJxcwlDT05GSUdfSVJRX0FMTF9DUFVTCisjaWZkZWYgQ09ORklHX0lSUV9BTExfQ1BVUworI2RlZmluZSBkaXN0cmlidXRlX2lycXMJKDEpCisjZWxzZQorI2RlZmluZSBkaXN0cmlidXRlX2lycXMJKDApCisjZW5kaWYKICNlbmRpZgogCiAvKgpAQCAtMTY0LDcwICsxNzEsMTI5IEBACiAvKiBUZXN0IGlmIGFuIGludGVycnVwdCBpcyBzb3VyY2VkIGZyb20gSHlwZXJUcmFuc3BvcnQgKHVzZWQgb24gYnJva2VuIFUzcykKICAqIHRvIGZvcmNlIHRoZSBlZGdlIHNldHRpbmcgb24gdGhlIE1QSUMgYW5kIGRvIHRoZSBhY2sgd29ya2Fyb3VuZC4KICAqLwotc3RhdGljIGlubGluZSBpbnQgbXBpY19pc19odF9pbnRlcnJ1cHQoc3RydWN0IG1waWMgKm1waWMsIHVuc2lnbmVkIGludCBzb3VyY2Vfbm8pCitzdGF0aWMgaW5saW5lIGludCBtcGljX2lzX2h0X2ludGVycnVwdChzdHJ1Y3QgbXBpYyAqbXBpYywgdW5zaWduZWQgaW50IHNvdXJjZSkKIHsKLQlpZiAoc291cmNlX25vID49IDEyOCB8fCAhbXBpYy0+Zml4dXBzKQorCWlmIChzb3VyY2UgPj0gMTI4IHx8ICFtcGljLT5maXh1cHMpCiAJCXJldHVybiAwOwotCXJldHVybiBtcGljLT5maXh1cHNbc291cmNlX25vXS5iYXNlICE9IE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtcGljX2FwaWNfZW5kX2lycShzdHJ1Y3QgbXBpYyAqbXBpYywgdW5zaWduZWQgaW50IHNvdXJjZV9ubykKLXsKLQlzdHJ1Y3QgbXBpY19pcnFfZml4dXAgKmZpeHVwID0gJm1waWMtPmZpeHVwc1tzb3VyY2Vfbm9dOwotCXUzMiB0bXA7Ci0KLQlzcGluX2xvY2soJm1waWMtPmZpeHVwX2xvY2spOwotCXdyaXRlYigweDExICsgMiAqIGZpeHVwLT5pcnEsIGZpeHVwLT5iYXNlKTsKLQl0bXAgPSByZWFkbChmaXh1cC0+YmFzZSArIDIpOwotCXdyaXRlbCh0bXAgfCAweDgwMDAwMDAwdWwsIGZpeHVwLT5iYXNlICsgMik7Ci0JLyogY29uZmlnIHdyaXRlcyBzaG91bGRuJ3QgYmUgcG9zdGVkIGJ1dCBsZXQncyBiZSBzYWZlIC4uLiAqLwotCSh2b2lkKXJlYWRsKGZpeHVwLT5iYXNlICsgMik7Ci0Jc3Bpbl91bmxvY2soJm1waWMtPmZpeHVwX2xvY2spOworCXJldHVybiBtcGljLT5maXh1cHNbc291cmNlXS5iYXNlICE9IE5VTEw7CiB9CiAKIAotc3RhdGljIHZvaWQgX19pbml0IG1waWNfYW1kODExMV9yZWFkX2lycShzdHJ1Y3QgbXBpYyAqbXBpYywgdTggX19pb21lbSAqZGV2YmFzZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBtcGljX2h0X2VuZF9pcnEoc3RydWN0IG1waWMgKm1waWMsIHVuc2lnbmVkIGludCBzb3VyY2UpCiB7Ci0JaW50IGksIGlycTsKKwlzdHJ1Y3QgbXBpY19pcnFfZml4dXAgKmZpeHVwID0gJm1waWMtPmZpeHVwc1tzb3VyY2VdOworCisJaWYgKGZpeHVwLT5hcHBsZWJhc2UpIHsKKwkJdW5zaWduZWQgaW50IHNvZmYgPSAoZml4dXAtPmluZGV4ID4+IDMpICYgfjM7CisJCXVuc2lnbmVkIGludCBtYXNrID0gMVUgPDwgKGZpeHVwLT5pbmRleCAmIDB4MWYpOworCQl3cml0ZWwobWFzaywgZml4dXAtPmFwcGxlYmFzZSArIHNvZmYpOworCX0gZWxzZSB7CisJCXNwaW5fbG9jaygmbXBpYy0+Zml4dXBfbG9jayk7CisJCXdyaXRlYigweDExICsgMiAqIGZpeHVwLT5pbmRleCwgZml4dXAtPmJhc2UgKyAyKTsKKwkJd3JpdGVsKGZpeHVwLT5kYXRhLCBmaXh1cC0+YmFzZSArIDQpOworCQlzcGluX3VubG9jaygmbXBpYy0+Zml4dXBfbG9jayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBtcGljX3N0YXJ0dXBfaHRfaW50ZXJydXB0KHN0cnVjdCBtcGljICptcGljLCB1bnNpZ25lZCBpbnQgc291cmNlLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBpcnFmbGFncykKK3sKKwlzdHJ1Y3QgbXBpY19pcnFfZml4dXAgKmZpeHVwID0gJm1waWMtPmZpeHVwc1tzb3VyY2VdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIHRtcDsKIAotCXByaW50ayhLRVJOX0lORk8gIm1waWM6ICAgIC0gV29ya2Fyb3VuZHMgb24gQU1EIDgxMTEgQCAlcFxuIiwgZGV2YmFzZSk7CisJaWYgKGZpeHVwLT5iYXNlID09IE5VTEwpCisJCXJldHVybjsKIAotCWZvciAoaT0wOyBpIDwgMjQ7IGkrKykgewotCQl3cml0ZWIoMHgxMCArIDIqaSwgZGV2YmFzZSArIDB4ZjIpOwotCQl0bXAgPSByZWFkbChkZXZiYXNlICsgMHhmNCk7Ci0JCWlmICgodG1wICYgMHgxKSB8fCAhKHRtcCAmIDB4MjApKQotCQkJY29udGludWU7CisJREJHKCJzdGFydHVwX2h0X2ludGVycnVwdCgldSwgJXUpIGluZGV4OiAlZFxuIiwKKwkgICAgc291cmNlLCBpcnFmbGFncywgZml4dXAtPmluZGV4KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXBpYy0+Zml4dXBfbG9jaywgZmxhZ3MpOworCS8qIEVuYWJsZSBhbmQgY29uZmlndXJlICovCisJd3JpdGViKDB4MTAgKyAyICogZml4dXAtPmluZGV4LCBmaXh1cC0+YmFzZSArIDIpOworCXRtcCA9IHJlYWRsKGZpeHVwLT5iYXNlICsgNCk7CisJdG1wICY9IH4oMHgyM1UpOworCWlmIChpcnFmbGFncyAmIElSUV9MRVZFTCkKKwkJdG1wIHw9IDB4MjI7CisJd3JpdGVsKHRtcCwgZml4dXAtPmJhc2UgKyA0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcGljLT5maXh1cF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG1waWNfc2h1dGRvd25faHRfaW50ZXJydXB0KHN0cnVjdCBtcGljICptcGljLCB1bnNpZ25lZCBpbnQgc291cmNlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgaXJxZmxhZ3MpCit7CisJc3RydWN0IG1waWNfaXJxX2ZpeHVwICpmaXh1cCA9ICZtcGljLT5maXh1cHNbc291cmNlXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB0bXA7CisKKwlpZiAoZml4dXAtPmJhc2UgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJREJHKCJzaHV0ZG93bl9odF9pbnRlcnJ1cHQoJXUsICV1KVxuIiwgc291cmNlLCBpcnFmbGFncyk7CisKKwkvKiBEaXNhYmxlICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1waWMtPmZpeHVwX2xvY2ssIGZsYWdzKTsKKwl3cml0ZWIoMHgxMCArIDIgKiBmaXh1cC0+aW5kZXgsIGZpeHVwLT5iYXNlICsgMik7CisJdG1wID0gcmVhZGwoZml4dXAtPmJhc2UgKyA0KTsKKwl0bXAgJj0gfjFVOworCXdyaXRlbCh0bXAsIGZpeHVwLT5iYXNlICsgNCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXBpYy0+Zml4dXBfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbXBpY19zY2FuX2h0X3BpYyhzdHJ1Y3QgbXBpYyAqbXBpYywgdTggX19pb21lbSAqZGV2YmFzZSwKKwkJCQkgICAgdW5zaWduZWQgaW50IGRldmZuLCB1MzIgdmRpZCkKK3sKKwlpbnQgaSwgaXJxLCBuOworCXU4IF9faW9tZW0gKmJhc2U7CisJdTMyIHRtcDsKKwl1OCBwb3M7CisKKwlmb3IgKHBvcyA9IHJlYWRiKGRldmJhc2UgKyBQQ0lfQ0FQQUJJTElUWV9MSVNUKTsgcG9zICE9IDA7CisJICAgICBwb3MgPSByZWFkYihkZXZiYXNlICsgcG9zICsgUENJX0NBUF9MSVNUX05FWFQpKSB7CisJCXU4IGlkID0gcmVhZGIoZGV2YmFzZSArIHBvcyArIFBDSV9DQVBfTElTVF9JRCk7CisJCWlmIChpZCA9PSBQQ0lfQ0FQX0lEX0hUX0lSUUNPTkYpIHsKKwkJCWlkID0gcmVhZGIoZGV2YmFzZSArIHBvcyArIDMpOworCQkJaWYgKGlkID09IDB4ODApCisJCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHBvcyA9PSAwKQorCQlyZXR1cm47CisKKwliYXNlID0gZGV2YmFzZSArIHBvczsKKwl3cml0ZWIoMHgwMSwgYmFzZSArIDIpOworCW4gPSAocmVhZGwoYmFzZSArIDQpID4+IDE2KSAmIDB4ZmY7CisKKwlwcmludGsoS0VSTl9JTkZPICJtcGljOiAgIC0gSFQ6JTAyeC4leCBbMHglMDJ4XSB2ZW5kb3IgJTA0eCBkZXZpY2UgJTA0eCIKKwkgICAgICAgIiBoYXMgJWQgaXJxc1xuIiwKKwkgICAgICAgZGV2Zm4gPj4gMywgZGV2Zm4gJiAweDcsIHBvcywgdmRpZCAmIDB4ZmZmZiwgdmRpZCA+PiAxNiwgbiArIDEpOworCisJZm9yIChpID0gMDsgaSA8PSBuOyBpKyspIHsKKwkJd3JpdGViKDB4MTAgKyAyICogaSwgYmFzZSArIDIpOworCQl0bXAgPSByZWFkbChiYXNlICsgNCk7CiAJCWlycSA9ICh0bXAgPj4gMTYpICYgMHhmZjsKLQkJbXBpYy0+Zml4dXBzW2lycV0uaXJxID0gaTsKLQkJbXBpYy0+Zml4dXBzW2lycV0uYmFzZSA9IGRldmJhc2UgKyAweGYyOworCQlEQkcoIkhUIFBJQyBpbmRleCAweCV4LCBpcnEgMHgleCwgdG1wOiAlMDh4XG4iLCBpLCBpcnEsIHRtcCk7CisJCS8qIG1hc2sgaXQgLCB3aWxsIGJlIHVubWFza2VkIGxhdGVyICovCisJCXRtcCB8PSAweDE7CisJCXdyaXRlbCh0bXAsIGJhc2UgKyA0KTsKKwkJbXBpYy0+Zml4dXBzW2lycV0uaW5kZXggPSBpOworCQltcGljLT5maXh1cHNbaXJxXS5iYXNlID0gYmFzZTsKKwkJLyogQXBwbGUgSFQgUElDIGhhcyBhIG5vbi1zdGFuZGFyZCB3YXkgb2YgZG9pbmcgRU9JcyAqLworCQlpZiAoKHZkaWQgJiAweGZmZmYpID09IDB4MTA2YikKKwkJCW1waWMtPmZpeHVwc1tpcnFdLmFwcGxlYmFzZSA9IGRldmJhc2UgKyAweDYwOworCQllbHNlCisJCQltcGljLT5maXh1cHNbaXJxXS5hcHBsZWJhc2UgPSBOVUxMOworCQl3cml0ZWIoMHgxMSArIDIgKiBpLCBiYXNlICsgMik7CisJCW1waWMtPmZpeHVwc1tpcnFdLmRhdGEgPSByZWFkbChiYXNlICsgNCkgfCAweDgwMDAwMDAwOwogCX0KIH0KICAKLXN0YXRpYyB2b2lkIF9faW5pdCBtcGljX2FtZDgxMzFfcmVhZF9pcnEoc3RydWN0IG1waWMgKm1waWMsIHU4IF9faW9tZW0gKmRldmJhc2UpCi17Ci0JaW50IGksIGlycTsKLQl1MzIgdG1wOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAibXBpYzogICAgLSBXb3JrYXJvdW5kcyBvbiBBTUQgODEzMSBAICVwXG4iLCBkZXZiYXNlKTsKLQotCWZvciAoaT0wOyBpIDwgNDsgaSsrKSB7Ci0JCXdyaXRlYigweDEwICsgMippLCBkZXZiYXNlICsgMHhiYSk7Ci0JCXRtcCA9IHJlYWRsKGRldmJhc2UgKyAweGJjKTsKLQkJaWYgKCh0bXAgJiAweDEpIHx8ICEodG1wICYgMHgyMCkpCi0JCQljb250aW51ZTsKLQkJaXJxID0gKHRtcCA+PiAxNikgJiAweGZmOwotCQltcGljLT5maXh1cHNbaXJxXS5pcnEgPSBpOwotCQltcGljLT5maXh1cHNbaXJxXS5iYXNlID0gZGV2YmFzZSArIDB4YmE7Ci0JfQotfQotIAotc3RhdGljIHZvaWQgX19pbml0IG1waWNfc2Nhbl9pb2FwaWNzKHN0cnVjdCBtcGljICptcGljKQorc3RhdGljIHZvaWQgX19pbml0IG1waWNfc2Nhbl9odF9waWNzKHN0cnVjdCBtcGljICptcGljKQogewogCXVuc2lnbmVkIGludCBkZXZmbjsKIAl1OCBfX2lvbWVtICpjZmdzcGFjZTsKIAotCXByaW50ayhLRVJOX0lORk8gIm1waWM6IFNldHRpbmcgdXAgSU8tQVBJQ3Mgd29ya2Fyb3VuZHMgZm9yIFUzXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJtcGljOiBTZXR0aW5nIHVwIEhUIFBJQ3Mgd29ya2Fyb3VuZHMgZm9yIFUzL1U0XG4iKTsKIAogCS8qIEFsbG9jYXRlIGZpeHVwcyBhcnJheSAqLwogCW1waWMtPmZpeHVwcyA9IGFsbG9jX2Jvb3RtZW0oMTI4ICogc2l6ZW9mKHN0cnVjdCBtcGljX2lycV9maXh1cCkpOwpAQCAtMjM3LDIxICszMDMsMjAgQEAKIAkvKiBJbml0IHNwaW5sb2NrICovCiAJc3Bpbl9sb2NrX2luaXQoJm1waWMtPmZpeHVwX2xvY2spOwogCi0JLyogTWFwIHUzIGNvbmZpZyBzcGFjZS4gV2UgYXNzdW1lIGFsbCBJTy1BUElDcyBhcmUgb24gdGhlIHByaW1hcnkgYnVzCi0JICogYW5kIHNsb3Qgd2lsbCBuZXZlciBiZSBhYm92ZSAiMHhmIiBzbyB3ZSBvbmx5IG5lZWQgdG8gbWFwIDMyaworCS8qIE1hcCBVMyBjb25maWcgc3BhY2UuIFdlIGFzc3VtZSBhbGwgSU8tQVBJQ3MgYXJlIG9uIHRoZSBwcmltYXJ5IGJ1cworCSAqIHNvIHdlIG9ubHkgbmVlZCB0byBtYXAgNjRrQi4KIAkgKi8KLQljZmdzcGFjZSA9ICh1bnNpZ25lZCBjaGFyIF9faW9tZW0gKilpb3JlbWFwKDB4ZjIwMDAwMDAsIDB4ODAwMCk7CisJY2Znc3BhY2UgPSBpb3JlbWFwKDB4ZjIwMDAwMDAsIDB4MTAwMDApOwogCUJVR19PTihjZmdzcGFjZSA9PSBOVUxMKTsKIAotCS8qIE5vdyB3ZSBzY2FuIGFsbCBzbG90cy4gV2UgZG8gYSB2ZXJ5IHF1aWNrIHNjYW4sIHdlIHJlYWQgdGhlIGhlYWRlciB0eXBlLAotCSAqIHZlbmRvciBJRCBhbmQgZGV2aWNlIElEIG9ubHksIHRoYXQncyBwbGVudHkgZW5vdWdoCisJLyogTm93IHdlIHNjYW4gYWxsIHNsb3RzLiBXZSBkbyBhIHZlcnkgcXVpY2sgc2Nhbiwgd2UgcmVhZCB0aGUgaGVhZGVyCisJICogdHlwZSwgdmVuZG9yIElEIGFuZCBkZXZpY2UgSUQgb25seSwgdGhhdCdzIHBsZW50eSBlbm91Z2gKIAkgKi8KLQlmb3IgKGRldmZuID0gMDsgZGV2Zm4gPCBQQ0lfREVWRk4oMHgxMCwwKTsgZGV2Zm4gKyspIHsKKwlmb3IgKGRldmZuID0gMDsgZGV2Zm4gPCAweDEwMDsgZGV2Zm4rKykgewogCQl1OCBfX2lvbWVtICpkZXZiYXNlID0gY2Znc3BhY2UgKyAoZGV2Zm4gPDwgOCk7CiAJCXU4IGhkcl90eXBlID0gcmVhZGIoZGV2YmFzZSArIFBDSV9IRUFERVJfVFlQRSk7CiAJCXUzMiBsID0gcmVhZGwoZGV2YmFzZSArIFBDSV9WRU5ET1JfSUQpOwotCQl1MTYgdmVuZG9yX2lkLCBkZXZpY2VfaWQ7Ci0JCWludCBtdWx0aWZ1bmMgPSAwOworCQl1MTYgczsKIAogCQlEQkcoImRldmZuICV4LCBsOiAleFxuIiwgZGV2Zm4sIGwpOwogCkBAIC0yNTksMjIgKzMyNCwxNiBAQAogCQlpZiAobCA9PSAweGZmZmZmZmZmIHx8IGwgPT0gMHgwMDAwMDAwMCB8fAogCQkgICAgbCA9PSAweDAwMDBmZmZmIHx8IGwgPT0gMHhmZmZmMDAwMCkKIAkJCWdvdG8gbmV4dDsKKwkJLyogQ2hlY2sgaWYgaXMgc3VwcG9ydHMgY2FwYWJpbGl0eSBsaXN0cyAqLworCQlzID0gcmVhZHcoZGV2YmFzZSArIFBDSV9TVEFUVVMpOworCQlpZiAoIShzICYgUENJX1NUQVRVU19DQVBfTElTVCkpCisJCQlnb3RvIG5leHQ7CiAKLQkJLyogQ2hlY2sgaWYgaXQncyBhIG11bHRpZnVuY3Rpb24gZGV2aWNlIChvbmx5IHJlYWxseSB1c2VkCi0JCSAqIHRvIGZ1bmN0aW9uIDAgdGhvdWdoCi0JCSAqLwotCQltdWx0aWZ1bmMgPSAhIShoZHJfdHlwZSAmIDB4ODApOwotCQl2ZW5kb3JfaWQgPSBsICYgMHhmZmZmOwotCQlkZXZpY2VfaWQgPSAobCA+PiAxNikgJiAweGZmZmY7CisJCW1waWNfc2Nhbl9odF9waWMobXBpYywgZGV2YmFzZSwgZGV2Zm4sIGwpOwogCi0JCS8qIElmIGEga25vd24gZGV2aWNlLCBnbyB0byBmaXh1cCBzZXR1cCBjb2RlICovCi0JCWlmICh2ZW5kb3JfaWQgPT0gUENJX1ZFTkRPUl9JRF9BTUQgJiYgZGV2aWNlX2lkID09IDB4NzQ2MCkKLQkJCW1waWNfYW1kODExMV9yZWFkX2lycShtcGljLCBkZXZiYXNlKTsKLQkJaWYgKHZlbmRvcl9pZCA9PSBQQ0lfVkVORE9SX0lEX0FNRCAmJiBkZXZpY2VfaWQgPT0gMHg3NDUwKQotCQkJbXBpY19hbWQ4MTMxX3JlYWRfaXJxKG1waWMsIGRldmJhc2UpOwogCW5leHQ6CiAJCS8qIG5leHQgZGV2aWNlLCBpZiBmdW5jdGlvbiAwICovCi0JCWlmICgoUENJX0ZVTkMoZGV2Zm4pID09IDApICYmICFtdWx0aWZ1bmMpCisJCWlmIChQQ0lfRlVOQyhkZXZmbikgPT0gMCAmJiAoaGRyX3R5cGUgJiAweDgwKSA9PSAwKQogCQkJZGV2Zm4gKz0gNzsKIAl9CiB9CkBAIC0zNzEsNiArNDMwLDMxIEBACiAJCQlicmVhazsKIAkJfQogCX0gd2hpbGUobXBpY19pcnFfcmVhZChzcmMsIE1QSUNfSVJRX1ZFQ1RPUl9QUkkpICYgTVBJQ19WRUNQUklfTUFTSyk7CQorCisjaWZkZWYgQ09ORklHX01QSUNfQlJPS0VOX1UzCisJaWYgKG1waWMtPmZsYWdzICYgTVBJQ19CUk9LRU5fVTMpIHsKKwkJdW5zaWduZWQgaW50IHNyYyA9IGlycSAtIG1waWMtPmlycV9vZmZzZXQ7CisJCWlmIChtcGljX2lzX2h0X2ludGVycnVwdChtcGljLCBzcmMpICYmCisJCSAgICAoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiBJUlFfTEVWRUwpKQorCQkJbXBpY19odF9lbmRfaXJxKG1waWMsIHNyYyk7CisJfQorI2VuZGlmIC8qIENPTkZJR19NUElDX0JST0tFTl9VMyAqLworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG1waWNfc3RhcnR1cF9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKyNpZmRlZiBDT05GSUdfTVBJQ19CUk9LRU5fVTMKKwlzdHJ1Y3QgbXBpYyAqbXBpYyA9IG1waWNfZnJvbV9pcnEoaXJxKTsKKwl1bnNpZ25lZCBpbnQgc3JjID0gaXJxIC0gbXBpYy0+aXJxX29mZnNldDsKKworCWlmIChtcGljX2lzX2h0X2ludGVycnVwdChtcGljLCBzcmMpKQorCQltcGljX3N0YXJ0dXBfaHRfaW50ZXJydXB0KG1waWMsIHNyYywgaXJxX2Rlc2NbaXJxXS5zdGF0dXMpOworCisjZW5kaWYgLyogQ09ORklHX01QSUNfQlJPS0VOX1UzICovCisKKwltcGljX2VuYWJsZV9pcnEoaXJxKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBtcGljX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCkBAIC0zOTQsMTIgKzQ3OCwyNyBAQAogCX0gd2hpbGUoIShtcGljX2lycV9yZWFkKHNyYywgTVBJQ19JUlFfVkVDVE9SX1BSSSkgJiBNUElDX1ZFQ1BSSV9NQVNLKSk7CiB9CiAKK3N0YXRpYyB2b2lkIG1waWNfc2h1dGRvd25faXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisjaWZkZWYgQ09ORklHX01QSUNfQlJPS0VOX1UzCisJc3RydWN0IG1waWMgKm1waWMgPSBtcGljX2Zyb21faXJxKGlycSk7CisJdW5zaWduZWQgaW50IHNyYyA9IGlycSAtIG1waWMtPmlycV9vZmZzZXQ7CisKKwlpZiAobXBpY19pc19odF9pbnRlcnJ1cHQobXBpYywgc3JjKSkKKwkJbXBpY19zaHV0ZG93bl9odF9pbnRlcnJ1cHQobXBpYywgc3JjLCBpcnFfZGVzY1tpcnFdLnN0YXR1cyk7CisKKyNlbmRpZiAvKiBDT05GSUdfTVBJQ19CUk9LRU5fVTMgKi8KKworCW1waWNfZGlzYWJsZV9pcnEoaXJxKTsKK30KKwogc3RhdGljIHZvaWQgbXBpY19lbmRfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJc3RydWN0IG1waWMgKm1waWMgPSBtcGljX2Zyb21faXJxKGlycSk7CiAKKyNpZmRlZiBERUJVR19JUlEKIAlEQkcoIiVzOiBlbmRfaXJxOiAlZFxuIiwgbXBpYy0+bmFtZSwgaXJxKTsKLQorI2VuZGlmCiAJLyogV2UgYWx3YXlzIEVPSSBvbiBlbmRfaXJxKCkgZXZlbiBmb3IgZWRnZSBpbnRlcnJ1cHRzIHNpbmNlIHRoYXQKIAkgKiBzaG91bGQgb25seSBsb3dlciB0aGUgcHJpb3JpdHksIHRoZSBNUElDIHNob3VsZCBoYXZlIHByb3Blcmx5CiAJICogbGF0Y2hlZCBhbm90aGVyIGVkZ2UgaW50ZXJydXB0IGNvbWluZyBpbiBhbnl3YXkKQEAgLTQwOCw4ICs1MDcsOSBAQAogI2lmZGVmIENPTkZJR19NUElDX0JST0tFTl9VMwogCWlmIChtcGljLT5mbGFncyAmIE1QSUNfQlJPS0VOX1UzKSB7CiAJCXVuc2lnbmVkIGludCBzcmMgPSBpcnEgLSBtcGljLT5pcnFfb2Zmc2V0OwotCQlpZiAobXBpY19pc19odF9pbnRlcnJ1cHQobXBpYywgc3JjKSkKLQkJCW1waWNfYXBpY19lbmRfaXJxKG1waWMsIHNyYyk7CisJCWlmIChtcGljX2lzX2h0X2ludGVycnVwdChtcGljLCBzcmMpICYmCisJCSAgICAoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiBJUlFfTEVWRUwpKQorCQkJbXBpY19odF9lbmRfaXJxKG1waWMsIHNyYyk7CiAJfQogI2VuZGlmIC8qIENPTkZJR19NUElDX0JST0tFTl9VMyAqLwogCkBAIC00OTAsNiArNTkwLDggQEAKIAltcGljLT5uYW1lID0gbmFtZTsKIAogCW1waWMtPmhjX2lycS50eXBlbmFtZSA9IG5hbWU7CisJbXBpYy0+aGNfaXJxLnN0YXJ0dXAgPSBtcGljX3N0YXJ0dXBfaXJxOworCW1waWMtPmhjX2lycS5zaHV0ZG93biA9IG1waWNfc2h1dGRvd25faXJxOwogCW1waWMtPmhjX2lycS5lbmFibGUgPSBtcGljX2VuYWJsZV9pcnE7CiAJbXBpYy0+aGNfaXJxLmRpc2FibGUgPSBtcGljX2Rpc2FibGVfaXJxOwogCW1waWMtPmhjX2lycS5lbmQgPSBtcGljX2VuZF9pcnE7CkBAIC02NTgsMTAgKzc2MCwxMCBAQAogCQltcGljLT5pcnFfY291bnQgPSBtcGljLT5udW1fc291cmNlczsKIAogI2lmZGVmIENPTkZJR19NUElDX0JST0tFTl9VMwotCS8qIERvIHRoZSBpb2FwaWMgZml4dXBzIG9uIFUzIGJyb2tlbiBtcGljICovCisJLyogRG8gdGhlIEhUIFBJQyBmaXh1cHMgb24gVTMgYnJva2VuIG1waWMgKi8KIAlEQkcoIk1QSUMgZmxhZ3M6ICV4XG4iLCBtcGljLT5mbGFncyk7CiAJaWYgKChtcGljLT5mbGFncyAmIE1QSUNfQlJPS0VOX1UzKSAmJiAobXBpYy0+ZmxhZ3MgJiBNUElDX1BSSU1BUlkpKQotCQltcGljX3NjYW5faW9hcGljcyhtcGljKTsKKwkJbXBpY19zY2FuX2h0X3BpY3MobXBpYyk7CiAjZW5kaWYgLyogQ09ORklHX01QSUNfQlJPS0VOX1UzICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgbXBpYy0+bnVtX3NvdXJjZXM7IGkrKykgewpAQCAtODQ4LDcgKzk1MCw5IEBACiAKIAlCVUdfT04obXBpYyA9PSBOVUxMKTsKIAorI2lmZGVmIERFQlVHX0lQSQogCURCRygiJXM6IHNlbmRfaXBpKGlwaV9ubzogJWQpXG4iLCBtcGljLT5uYW1lLCBpcGlfbm8pOworI2VuZGlmCiAKIAltcGljX2NwdV93cml0ZShNUElDX0NQVV9JUElfRElTUEFUQ0hfMCArIGlwaV9ubyAqIDB4MTAsCiAJCSAgICAgICBtcGljX3BoeXNtYXNrKGNwdV9tYXNrICYgY3B1c19hZGRyKGNwdV9vbmxpbmVfbWFwKVswXSkpOwpAQCAtODU5LDE5ICs5NjMsMjggQEAKIAl1MzIgaXJxOwogCiAJaXJxID0gbXBpY19jcHVfcmVhZChNUElDX0NQVV9JTlRBQ0spICYgTVBJQ19WRUNQUklfVkVDVE9SX01BU0s7CisjaWZkZWYgREVCVUdfTE9XCiAJREJHKCIlczogZ2V0X29uZV9pcnEoKTogJWRcbiIsIG1waWMtPm5hbWUsIGlycSk7Ci0KKyNlbmRpZgogCWlmIChtcGljLT5jYXNjYWRlICYmIGlycSA9PSBtcGljLT5jYXNjYWRlX3ZlYykgeworI2lmZGVmIERFQlVHX0xPVwogCQlEQkcoIiVzOiBjYXNjYWRpbmcgLi4uXG4iLCBtcGljLT5uYW1lKTsKKyNlbmRpZgogCQlpcnEgPSBtcGljLT5jYXNjYWRlKHJlZ3MsIG1waWMtPmNhc2NhZGVfZGF0YSk7CiAJCW1waWNfZW9pKG1waWMpOwogCQlyZXR1cm4gaXJxOwogCX0KIAlpZiAodW5saWtlbHkoaXJxID09IE1QSUNfVkVDX1NQVVJSSU9VUykpCiAJCXJldHVybiAtMTsKLQlpZiAoaXJxIDwgTVBJQ19WRUNfSVBJXzApIAorCWlmIChpcnEgPCBNUElDX1ZFQ19JUElfMCkgeworI2lmZGVmIERFQlVHX0lSUQorCQlEQkcoIiVzOiBpcnEgJWRcbiIsIG1waWMtPm5hbWUsIGlycSArIG1waWMtPmlycV9vZmZzZXQpOworI2VuZGlmCiAJCXJldHVybiBpcnEgKyBtcGljLT5pcnFfb2Zmc2V0OworCX0KKyNpZmRlZiBERUJVR19JUEkKICAgICAgICAJREJHKCIlczogaXBpICVkICFcbiIsIG1waWMtPm5hbWUsIGlycSAtIE1QSUNfVkVDX0lQSV8wKTsKKyNlbmRpZgogCXJldHVybiBpcnEgLSBNUElDX1ZFQ19JUElfMCArIG1waWMtPmlwaV9vZmZzZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvdTNfaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvdTNfaW9tbXUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxYTI2YS4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3UzX2lvbW11LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoKLSAqIGFyY2gvcG93ZXJwYy9zeXNkZXYvdTNfaW9tbXUuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNCBPbG9mIEpvaGFuc3NvbiA8b2xvZkBsaXhvbS5uZXQ+LCBJQk0gQ29ycG9yYXRpb24KLSAqCi0gKiBCYXNlZCBvbiBwU2VyaWVzX2lvbW11LmM6Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgTWlrZSBDb3JyaWdhbiAmIERhdmUgRW5nZWJyZXRzZW4sIElCTSBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IChDKSAyMDA0IE9sb2YgSm9oYW5zc29uIDxvbG9mQGxpeG9tLm5ldD4sIElCTSBDb3Jwb3JhdGlvbgotICoKLSAqIER5bmFtaWMgRE1BIG1hcHBpbmcgc3VwcG9ydCwgQXBwbGUgVTMgJiBJQk0gQ1BDOTI1ICJEQVJUIiBpb21tdS4KLSAqCi0gKiAKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKiAKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKiAKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vaW9tbXUuaD4KLSNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaW5jbHVkZSA8YXNtL2Fic19hZGRyLmg+Ci0jaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KLSNpbmNsdWRlIDxhc20vbG1iLmg+Ci0jaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KLQotI2luY2x1ZGUgImRhcnQuaCIKLQotZXh0ZXJuIGludCBpb21tdV9mb3JjZV9vbjsKLQotLyogUGh5c2ljYWwgYmFzZSBhZGRyZXNzIGFuZCBzaXplIG9mIHRoZSBEQVJUIHRhYmxlICovCi11bnNpZ25lZCBsb25nIGRhcnRfdGFibGViYXNlOyAvKiBleHBvcnRlZCB0byBodGFiX2luaXRpYWxpemUgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRhcnRfdGFibGVzaXplOwotCi0vKiBWaXJ0dWFsIGJhc2UgYWRkcmVzcyBvZiB0aGUgREFSVCB0YWJsZSAqLwotc3RhdGljIHUzMiAqZGFydF92YmFzZTsKLQotLyogTWFwcGVkIGJhc2UgYWRkcmVzcyBmb3IgdGhlIGRhcnQgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgKmRhcnQ7IAotCi0vKiBEdW1teSB2YWwgdGhhdCBlbnRyaWVzIGFyZSBzZXQgdG8gd2hlbiB1bnVzZWQgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGFydF9lbXB0eXZhbDsKLQotc3RhdGljIHN0cnVjdCBpb21tdV90YWJsZSBpb21tdV90YWJsZV91MzsKLXN0YXRpYyBpbnQgaW9tbXVfdGFibGVfdTNfaW5pdGVkOwotc3RhdGljIGludCBkYXJ0X2RpcnR5OwotCi0jZGVmaW5lIERCRyguLi4pCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkYXJ0X3RsYl9pbnZhbGlkYXRlX2FsbCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgbCA9IDA7Ci0JdW5zaWduZWQgaW50IHJlZzsKLQl1bnNpZ25lZCBsb25nIGxpbWl0OwotCi0JREJHKCJkYXJ0OiBmbHVzaFxuIik7Ci0KLQkvKiBUbyBpbnZhbGlkYXRlIHRoZSBEQVJULCBzZXQgdGhlIERBUlRDTlRMX0ZMVVNIVExCIGJpdCBpbiB0aGUKLQkgKiBjb250cm9sIHJlZ2lzdGVyIGFuZCB3YWl0IGZvciBpdCB0byBjbGVhci4KLQkgKgotCSAqIEdvdGNoYTogU29tZXRpbWVzLCB0aGUgREFSVCB3b24ndCBkZXRlY3QgdGhhdCB0aGUgYml0IGdldHMKLQkgKiBzZXQuIElmIHNvLCBjbGVhciBpdCBhbmQgc2V0IGl0IGFnYWluLgotCSAqLyAKLQotCWxpbWl0ID0gMDsKLQotcmV0cnk6Ci0JcmVnID0gaW5fYmUzMigodW5zaWduZWQgaW50ICopZGFydCtEQVJUQ05UTCk7Ci0JcmVnIHw9IERBUlRDTlRMX0ZMVVNIVExCOwotCW91dF9iZTMyKCh1bnNpZ25lZCBpbnQgKilkYXJ0K0RBUlRDTlRMLCByZWcpOwotCi0JbCA9IDA7Ci0Jd2hpbGUgKChpbl9iZTMyKCh1bnNpZ25lZCBpbnQgKilkYXJ0K0RBUlRDTlRMKSAmIERBUlRDTlRMX0ZMVVNIVExCKSAmJgotCQlsIDwgKDFMPDxsaW1pdCkpIHsKLQkJbCsrOwotCX0KLQlpZiAobCA9PSAoMUw8PGxpbWl0KSkgewotCQlpZiAobGltaXQgPCA0KSB7Ci0JCQlsaW1pdCsrOwotCQkgICAgICAgIHJlZyA9IGluX2JlMzIoKHVuc2lnbmVkIGludCAqKWRhcnQrREFSVENOVEwpOwotCQkgICAgICAgIHJlZyAmPSB+REFSVENOVExfRkxVU0hUTEI7Ci0JCSAgICAgICAgb3V0X2JlMzIoKHVuc2lnbmVkIGludCAqKWRhcnQrREFSVENOVEwsIHJlZyk7Ci0JCQlnb3RvIHJldHJ5OwotCQl9IGVsc2UKLQkJCXBhbmljKCJVMy1EQVJUOiBUTEIgZGlkIG5vdCBmbHVzaCBhZnRlciB3YWl0aW5nIGEgbG9uZyAiCi0JCQkgICAgICAidGltZS4gQnVnZ3kgVTMgPyIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZGFydF9mbHVzaChzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCkKLXsKLQlpZiAoZGFydF9kaXJ0eSkKLQkJZGFydF90bGJfaW52YWxpZGF0ZV9hbGwoKTsKLQlkYXJ0X2RpcnR5ID0gMDsKLX0KLQotc3RhdGljIHZvaWQgZGFydF9idWlsZChzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgbG9uZyBpbmRleCwgCi0JCSAgICAgICBsb25nIG5wYWdlcywgdW5zaWduZWQgbG9uZyB1YWRkciwKLQkJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLQl1bnNpZ25lZCBpbnQgKmRwOwotCXVuc2lnbmVkIGludCBycG47Ci0KLQlEQkcoImRhcnQ6IGJ1aWxkIGF0OiAlbHgsICVseCwgYWRkcjogJXhcbiIsIGluZGV4LCBucGFnZXMsIHVhZGRyKTsKLQotCWluZGV4IDw8PSBEQVJUX1BBR0VfRkFDVE9SOwotCW5wYWdlcyA8PD0gREFSVF9QQUdFX0ZBQ1RPUjsKLQotCWRwID0gKCh1bnNpZ25lZCBpbnQqKXRibC0+aXRfYmFzZSkgKyBpbmRleDsKLQkKLQkvKiBPbiBVMywgYWxsIG1lbW9yeSBpcyBjb250aWdvdXMsIHNvIHdlIGNhbiBtb3ZlIHRoaXMKLQkgKiBvdXQgb2YgdGhlIGxvb3AuCi0JICovCi0Jd2hpbGUgKG5wYWdlcy0tKSB7Ci0JCXJwbiA9IHZpcnRfdG9fYWJzKHVhZGRyKSA+PiBEQVJUX1BBR0VfU0hJRlQ7Ci0KLQkJKihkcCsrKSA9IERBUlRNQVBfVkFMSUQgfCAocnBuICYgREFSVE1BUF9SUE5NQVNLKTsKLQotCQlycG4rKzsKLQkJdWFkZHIgKz0gREFSVF9QQUdFX1NJWkU7Ci0JfQotCi0JZGFydF9kaXJ0eSA9IDE7Ci19Ci0KLQotc3RhdGljIHZvaWQgZGFydF9mcmVlKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBsb25nIGluZGV4LCBsb25nIG5wYWdlcykKLXsKLQl1bnNpZ25lZCBpbnQgKmRwOwotCQotCS8qIFdlIGRvbid0IHdvcnJ5IGFib3V0IGZsdXNoaW5nIHRoZSBUTEIgY2FjaGUuIFRoZSBvbmx5IGRyYXdiYWNrIG9mCi0JICogbm90IGRvaW5nIGl0IGlzIHRoYXQgd2Ugd29uJ3QgY2F0Y2ggYnVnZ3kgZGV2aWNlIGRyaXZlcnMgZG9pbmcKLQkgKiBiYWQgRE1BcywgYnV0IHRoZW4gbm8gMzItYml0IGFyY2hpdGVjdHVyZSBldmVyIGRvZXMgZWl0aGVyLgotCSAqLwotCi0JREJHKCJkYXJ0OiBmcmVlIGF0OiAlbHgsICVseFxuIiwgaW5kZXgsIG5wYWdlcyk7Ci0KLQlpbmRleCA8PD0gREFSVF9QQUdFX0ZBQ1RPUjsKLQlucGFnZXMgPDw9IERBUlRfUEFHRV9GQUNUT1I7Ci0KLQlkcCAgPSAoKHVuc2lnbmVkIGludCAqKXRibC0+aXRfYmFzZSkgKyBpbmRleDsKLQkJCi0Jd2hpbGUgKG5wYWdlcy0tKQotCQkqKGRwKyspID0gZGFydF9lbXB0eXZhbDsKLX0KLQotCi1zdGF0aWMgaW50IGRhcnRfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRhcnRfbm9kZSkKLXsKLQl1bnNpZ25lZCBpbnQgcmVnd29yZDsKLQl1bnNpZ25lZCBpbnQgaTsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQotCWlmIChkYXJ0X3RhYmxlYmFzZSA9PSAwIHx8IGRhcnRfdGFibGVzaXplID09IDApIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVTMtREFSVDogdGFibGUgbm90IGFsbG9jYXRlZCwgdXNpbmcgZGlyZWN0IERNQVxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qIE1ha2Ugc3VyZSBub3RoaW5nIGZyb20gdGhlIERBUlQgcmFuZ2UgcmVtYWlucyBpbiB0aGUgQ1BVIGNhY2hlCi0JICogZnJvbSBhIHByZXZpb3VzIG1hcHBpbmcgdGhhdCBleGlzdGVkIGJlZm9yZSB0aGUga2VybmVsIHRvb2sKLQkgKiBvdmVyCi0JICovCi0JZmx1c2hfZGNhY2hlX3BoeXNfcmFuZ2UoZGFydF90YWJsZWJhc2UsIGRhcnRfdGFibGViYXNlICsgZGFydF90YWJsZXNpemUpOwotCi0JLyogQWxsb2NhdGUgYSBzcGFyZSBwYWdlIHRvIG1hcCBhbGwgaW52YWxpZCBEQVJUIHBhZ2VzLiBXZSBuZWVkIHRvIGRvCi0JICogdGhhdCB0byB3b3JrIGFyb3VuZCB3aGF0IGxvb2tzIGxpa2UgYSBwcm9ibGVtIHdpdGggdGhlIEhUIGJyaWRnZQotCSAqIHByZWZldGNoaW5nIGludG8gaW52YWxpZCBwYWdlcyBhbmQgY29ycnVwdGluZyBkYXRhCi0JICovCi0JdG1wID0gbG1iX2FsbG9jKERBUlRfUEFHRV9TSVpFLCBEQVJUX1BBR0VfU0laRSk7Ci0JaWYgKCF0bXApCi0JCXBhbmljKCJVMy1EQVJUOiBDYW5ub3QgYWxsb2NhdGUgc3BhcmUgcGFnZSEiKTsKLQlkYXJ0X2VtcHR5dmFsID0gREFSVE1BUF9WQUxJRCB8ICgodG1wID4+IERBUlRfUEFHRV9TSElGVCkgJiBEQVJUTUFQX1JQTk1BU0spOwotCi0JLyogTWFwIGluIERBUlQgcmVnaXN0ZXJzLiBGSVhNRTogVXNlIGRldmljZSBub2RlIHRvIGdldCBiYXNlIGFkZHJlc3MgKi8KLQlkYXJ0ID0gaW9yZW1hcChEQVJUX0JBU0UsIDB4NzAwMCk7Ci0JaWYgKGRhcnQgPT0gTlVMTCkKLQkJcGFuaWMoIlUzLURBUlQ6IENhbm5vdCBtYXAgcmVnaXN0ZXJzISIpOwotCi0JLyogU2V0IGluaXRpYWwgY29udHJvbCByZWdpc3RlciBjb250ZW50czogdGFibGUgYmFzZSwgCi0JICogdGFibGUgc2l6ZSBhbmQgZW5hYmxlIGJpdAotCSAqLwotCXJlZ3dvcmQgPSBEQVJUQ05UTF9FTkFCTEUgfCAKLQkJKChkYXJ0X3RhYmxlYmFzZSA+PiBEQVJUX1BBR0VfU0hJRlQpIDw8IERBUlRDTlRMX0JBU0VfU0hJRlQpIHwKLQkJKCgoZGFydF90YWJsZXNpemUgPj4gREFSVF9QQUdFX1NISUZUKSAmIERBUlRDTlRMX1NJWkVfTUFTSykKLQkJCQkgPDwgREFSVENOVExfU0laRV9TSElGVCk7Ci0JZGFydF92YmFzZSA9IGlvcmVtYXAodmlydF90b19hYnMoZGFydF90YWJsZWJhc2UpLCBkYXJ0X3RhYmxlc2l6ZSk7Ci0KLQkvKiBGaWxsIGluaXRpYWwgdGFibGUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgZGFydF90YWJsZXNpemUvNDsgaSsrKQotCQlkYXJ0X3ZiYXNlW2ldID0gZGFydF9lbXB0eXZhbDsKLQotCS8qIEluaXRpYWxpemUgREFSVCB3aXRoIHRhYmxlIGJhc2UgYW5kIGVuYWJsZSBpdC4gKi8KLQlvdXRfYmUzMigodW5zaWduZWQgaW50ICopZGFydCwgcmVnd29yZCk7Ci0KLQkvKiBJbnZhbGlkYXRlIERBUlQgdG8gZ2V0IHJpZCBvZiBwb3NzaWJsZSBzdGFsZSBUTEJzICovCi0JZGFydF90bGJfaW52YWxpZGF0ZV9hbGwoKTsKLQotCXByaW50ayhLRVJOX0lORk8gIlUzL0NQQzkyNSBEQVJUIElPTU1VIGluaXRpYWxpemVkXG4iKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBpb21tdV90YWJsZV91M19zZXR1cCh2b2lkKQotewotCWlvbW11X3RhYmxlX3UzLml0X2J1c25vID0gMDsKLQlpb21tdV90YWJsZV91My5pdF9vZmZzZXQgPSAwOwotCS8qIGl0X3NpemUgaXMgaW4gbnVtYmVyIG9mIGVudHJpZXMgKi8KLQlpb21tdV90YWJsZV91My5pdF9zaXplID0gKGRhcnRfdGFibGVzaXplIC8gc2l6ZW9mKHUzMikpID4+IERBUlRfUEFHRV9GQUNUT1I7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBjb21tb24gSU9NTVUgY29kZSAqLwotCWlvbW11X3RhYmxlX3UzLml0X2Jhc2UgPSAodW5zaWduZWQgbG9uZylkYXJ0X3ZiYXNlOwotCWlvbW11X3RhYmxlX3UzLml0X2luZGV4ID0gMDsKLQlpb21tdV90YWJsZV91My5pdF9ibG9ja3NpemUgPSAxOwotCWlvbW11X2luaXRfdGFibGUoJmlvbW11X3RhYmxlX3UzKTsKLQotCS8qIFJlc2VydmUgdGhlIGxhc3QgcGFnZSBvZiB0aGUgREFSVCB0byBhdm9pZCBwb3NzaWJsZSBwcmVmZXRjaAotCSAqIHBhc3QgdGhlIERBUlQgbWFwcGVkIGFyZWEKLQkgKi8KLQlzZXRfYml0KGlvbW11X3RhYmxlX3UzLml0X3NpemUgLSAxLCBpb21tdV90YWJsZV91My5pdF9tYXApOwotfQotCi1zdGF0aWMgdm9pZCBpb21tdV9kZXZfc2V0dXBfdTMoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwotCi0JLyogV2Ugb25seSBoYXZlIG9uZSBpb21tdSB0YWJsZSBvbiB0aGUgbWFjIGZvciBub3csIHdoaWNoIG1ha2VzCi0JICogdGhpbmdzIHNpbXBsZS4gU2V0dXAgYWxsIFBDSSBkZXZpY2VzIHRvIHBvaW50IHRvIHRoaXMgdGFibGUKLQkgKgotCSAqIFdlIG11c3QgdXNlIHBjaV9kZXZpY2VfdG9fT0Zfbm9kZSgpIHRvIG1ha2Ugc3VyZSB0aGF0Ci0JICogd2UgZ2V0IHRoZSByZWFsICJmaW5hbCIgcG9pbnRlciB0byB0aGUgZGV2aWNlIGluIHRoZQotCSAqIHBjaV9kZXYgc3lzZGF0YSBhbmQgbm90IHRoZSB0ZW1wb3JhcnkgUEhCIG9uZQotCSAqLwotCWRuID0gcGNpX2RldmljZV90b19PRl9ub2RlKGRldik7Ci0KLQlpZiAoZG4pCi0JCVBDSV9ETihkbiktPmlvbW11X3RhYmxlID0gJmlvbW11X3RhYmxlX3UzOwotfQotCi1zdGF0aWMgdm9pZCBpb21tdV9idXNfc2V0dXBfdTMoc3RydWN0IHBjaV9idXMgKmJ1cykKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwotCi0JaWYgKCFpb21tdV90YWJsZV91M19pbml0ZWQpIHsKLQkJaW9tbXVfdGFibGVfdTNfaW5pdGVkID0gMTsKLQkJaW9tbXVfdGFibGVfdTNfc2V0dXAoKTsKLQl9Ci0KLQlkbiA9IHBjaV9idXNfdG9fT0Zfbm9kZShidXMpOwotCi0JaWYgKGRuKQotCQlQQ0lfRE4oZG4pLT5pb21tdV90YWJsZSA9ICZpb21tdV90YWJsZV91MzsKLX0KLQotc3RhdGljIHZvaWQgaW9tbXVfZGV2X3NldHVwX251bGwoc3RydWN0IHBjaV9kZXYgKmRldikgeyB9Ci1zdGF0aWMgdm9pZCBpb21tdV9idXNfc2V0dXBfbnVsbChzdHJ1Y3QgcGNpX2J1cyAqYnVzKSB7IH0KLQotdm9pZCBpb21tdV9pbml0X2Vhcmx5X3UzKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkbjsKLQotCS8qIEZpbmQgdGhlIERBUlQgaW4gdGhlIGRldmljZS10cmVlICovCi0JZG4gPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCAiZGFydCIsICJ1My1kYXJ0Iik7Ci0JaWYgKGRuID09IE5VTEwpCi0JCXJldHVybjsKLQotCS8qIFNldHVwIGxvdyBsZXZlbCBUQ0Ugb3BlcmF0aW9ucyBmb3IgdGhlIGNvcmUgSU9NTVUgY29kZSAqLwotCXBwY19tZC50Y2VfYnVpbGQgPSBkYXJ0X2J1aWxkOwotCXBwY19tZC50Y2VfZnJlZSAgPSBkYXJ0X2ZyZWU7Ci0JcHBjX21kLnRjZV9mbHVzaCA9IGRhcnRfZmx1c2g7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBEQVJUIEhXICovCi0JaWYgKGRhcnRfaW5pdChkbikpIHsKLQkJLyogSWYgaW5pdCBmYWlsZWQsIHVzZSBkaXJlY3QgaW9tbXUgYW5kIG51bGwgc2V0dXAgZnVuY3Rpb25zICovCi0JCXBwY19tZC5pb21tdV9kZXZfc2V0dXAgPSBpb21tdV9kZXZfc2V0dXBfbnVsbDsKLQkJcHBjX21kLmlvbW11X2J1c19zZXR1cCA9IGlvbW11X2J1c19zZXR1cF9udWxsOwotCi0JCS8qIFNldHVwIHBjaV9kbWEgb3BzICovCi0JCXBjaV9kaXJlY3RfaW9tbXVfaW5pdCgpOwotCX0gZWxzZSB7Ci0JCXBwY19tZC5pb21tdV9kZXZfc2V0dXAgPSBpb21tdV9kZXZfc2V0dXBfdTM7Ci0JCXBwY19tZC5pb21tdV9idXNfc2V0dXAgPSBpb21tdV9idXNfc2V0dXBfdTM7Ci0KLQkJLyogU2V0dXAgcGNpX2RtYSBvcHMgKi8KLQkJcGNpX2lvbW11X2luaXQoKTsKLQl9Ci19Ci0KLQotdm9pZCBfX2luaXQgYWxsb2NfdTNfZGFydF90YWJsZSh2b2lkKQotewotCS8qIE9ubHkgcmVzZXJ2ZSBEQVJUIHNwYWNlIGlmIG1hY2hpbmUgaGFzIG1vcmUgdGhhbiAyR0Igb2YgUkFNCi0JICogb3IgaWYgcmVxdWVzdGVkIHdpdGggaW9tbXU9b24gb24gY21kbGluZS4KLQkgKi8KLQlpZiAobG1iX2VuZF9vZl9EUkFNKCkgPD0gMHg4MDAwMDAwMHVsbCAmJiAhaW9tbXVfZm9yY2Vfb24pCi0JCXJldHVybjsKLQotCS8qIDUxMiBwYWdlcyAoMk1CKSBpcyBtYXggREFSVCB0YWJsZXNpemUuICovCi0JZGFydF90YWJsZXNpemUgPSAxVUwgPDwgMjE7Ci0JLyogMTZNQiAoMSA8PCAyNCkgYWxpZ25tZW50LiBXZSBhbGxvY2F0ZSBhIGZ1bGwgMTZNYiBjaHVjayBzaW5jZSB3ZQotCSAqIHdpbGwgYmxvdyB1cCBhbiBlbnRpcmUgbGFyZ2UgcGFnZSBhbnl3YXkgaW4gdGhlIGtlcm5lbCBtYXBwaW5nCi0JICovCi0JZGFydF90YWJsZWJhc2UgPSAodW5zaWduZWQgbG9uZykKLQkJYWJzX3RvX3ZpcnQobG1iX2FsbG9jX2Jhc2UoMVVMPDwyNCwgMVVMPDwyNCwgMHg4MDAwMDAwMEwpKTsKLQotCXByaW50ayhLRVJOX0lORk8gIlUzLURBUlQgYWxsb2NhdGVkIGF0OiAlbHhcbiIsIGRhcnRfdGFibGViYXNlKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy94bW9uL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3htb24vTWFrZWZpbGUKaW5kZXggYjIwMzEyZS4uMTA5ZDg3NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3htb24vTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3htb24vTWFrZWZpbGUKQEAgLTMsOSArMyw1IEBACiBpZmRlZiBDT05GSUdfUFBDNjQKIEVYVFJBX0NGTEFHUyArPSAtbW5vLW1pbmltYWwtdG9jCiBlbmRpZgotCi1vYmotJChDT05GSUdfOHh4KQkrPSBzdGFydF84eHgubwotb2JqLSQoQ09ORklHXzZ4eCkJKz0gc3RhcnRfMzIubwotb2JqLSQoQ09ORklHXzR4eCkJKz0gc3RhcnRfMzIubwotb2JqLSQoQ09ORklHX1BQQzY0KQkrPSBzdGFydF82NC5vCi1vYmoteQkJCSs9IHhtb24ubyBwcGMtZGlzLm8gcHBjLW9wYy5vIHNldGptcC5vIG5vbnN0ZGlvLm8KK29iai15CQkJKz0geG1vbi5vIHBwYy1kaXMubyBwcGMtb3BjLm8gc2V0am1wLm8gc3RhcnQubyBcCisJCQkgICBub25zdGRpby5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMveG1vbi9zdGFydF82NC5jIGIvYXJjaC9wb3dlcnBjL3htb24vc3RhcnQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9wb3dlcnBjL3htb24vc3RhcnRfNjQuYwpyZW5hbWUgdG8gYXJjaC9wb3dlcnBjL3htb24vc3RhcnQuYwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3htb24vc3RhcnRfMzIuYyBiL2FyY2gvcG93ZXJwYy94bW9uL3N0YXJ0XzMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNDY0ZGYuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3htb24vc3RhcnRfMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzLgotICovCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGxpbnV4L2FkYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BtdS5oPgotI2luY2x1ZGUgPGxpbnV4L2N1ZGEuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGFzbS94bW9uLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vYm9vdHguaD4KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS9wbWFjX2ZlYXR1cmUuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL2RlbGF5Lmg+Ci0jaW5jbHVkZSA8YXNtL2J0ZXh0Lmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWUuaD4KLSNpbmNsdWRlICJub25zdGRpby5oIgotCi1zdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBfX2lvbWVtICpzY2NjLCAqc2NjZDsKLXVuc2lnbmVkIGludCBUWFJEWSwgUlhSRFksIERMQUI7Ci0KLXN0YXRpYyBpbnQgdXNlX3NlcmlhbDsKLXN0YXRpYyBpbnQgdXNlX3NjcmVlbjsKLXN0YXRpYyBpbnQgdmlhX21vZGVtOwotc3RhdGljIGludCB4bW9uX3VzZV9zY2NiOwotc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hhbm5lbF9ub2RlOwotCi12b2lkIGJ1Zl9hY2Nlc3Modm9pZCkKLXsKLQlpZiAoRExBQikKLQkJc2NjZFszXSAmPSB+RExBQjsJLyogcmVzZXQgRExBQiAqLwotfQotCi1leHRlcm4gaW50IGFkYl9pbml0KHZvaWQpOwotCi0jaWZkZWYgQ09ORklHX1BQQ19DSFJQCi0vKgotICogVGhpcyBsb29rcyBpbiB0aGUgInJhbmdlcyIgcHJvcGVydHkgZm9yIHRoZSBwcmltYXJ5IFBDSSBob3N0IGJyaWRnZQotICogdG8gZmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgUENJL0lTQSBJL08gc3BhY2UuCi0gKiBJdCBpcyBiYXNpY2FsbHkgYSBjdXQtZG93biB2ZXJzaW9uIG9mIHBjaV9wcm9jZXNzX2JyaWRnZV9PRl9yYW5nZXMuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNocnBfZmluZF9waHlzX2lvX2Jhc2Uodm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7Ci0JdW5zaWduZWQgaW50ICpyYW5nZXM7Ci0JdW5zaWduZWQgbG9uZyBiYXNlID0gQ0hSUF9JU0FfSU9fQkFTRTsKLQlpbnQgcmxlbiA9IDA7Ci0JaW50IG5wOwotCi0Jbm9kZSA9IGZpbmRfZGV2aWNlcygiaXNhIik7Ci0JaWYgKG5vZGUgIT0gTlVMTCkgewotCQlub2RlID0gbm9kZS0+cGFyZW50OwotCQlpZiAobm9kZSA9PSBOVUxMIHx8IG5vZGUtPnR5cGUgPT0gTlVMTAotCQkgICAgfHwgc3RyY21wKG5vZGUtPnR5cGUsICJwY2kiKSAhPSAwKQotCQkJbm9kZSA9IE5VTEw7Ci0JfQotCWlmIChub2RlID09IE5VTEwpCi0JCW5vZGUgPSBmaW5kX2RldmljZXMoInBjaSIpOwotCWlmIChub2RlID09IE5VTEwpCi0JCXJldHVybiBiYXNlOwotCi0JcmFuZ2VzID0gKHVuc2lnbmVkIGludCAqKSBnZXRfcHJvcGVydHkobm9kZSwgInJhbmdlcyIsICZybGVuKTsKLQlucCA9IHByb21fbl9hZGRyX2NlbGxzKG5vZGUpICsgNTsKLQl3aGlsZSAoKHJsZW4gLT0gbnAgKiBzaXplb2YodW5zaWduZWQgaW50KSkgPj0gMCkgewotCQlpZiAoKHJhbmdlc1swXSA+PiAyNCkgPT0gMSAmJiByYW5nZXNbMl0gPT0gMCkgewotCQkJLyogSS9PIHNwYWNlIHN0YXJ0aW5nIGF0IDAsIGdyYWIgdGhlIHBoeXMgYmFzZSAqLwotCQkJYmFzZSA9IHJhbmdlc1tucCAtIDNdOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmFuZ2VzICs9IG5wOwotCX0KLQlyZXR1cm4gYmFzZTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfUFBDX0NIUlAgKi8KLQotdm9pZCB4bW9uX21hcF9zY2Modm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIF9faW9tZW0gKmJhc2U7Ci0KLQlpZiAoX21hY2hpbmUgPT0gX01BQ0hfUG1hYykgewotCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0jaWZkZWYgQ09ORklHX0JPT1RYX1RFWFQKLQkJaWYgKCF1c2Vfc2NyZWVuICYmICF1c2Vfc2VyaWFsCi0JCSAgICAmJiAhbWFjaGluZV9pc19jb21wYXRpYmxlKCJpTWFjIikpIHsKLQkJCS8qIHNlZSBpZiB0aGVyZSBpcyBhIGtleWJvYXJkIGluIHRoZSBkZXZpY2UgdHJlZQotCQkJICAgd2l0aCBhIHBhcmVudCBvZiB0eXBlICJhZGIiICovCi0JCQlmb3IgKG5wID0gZmluZF9kZXZpY2VzKCJrZXlib2FyZCIpOyBucDsgbnAgPSBucC0+bmV4dCkKLQkJCQlpZiAobnAtPnBhcmVudCAmJiBucC0+cGFyZW50LT50eXBlCi0JCQkJICAgICYmIHN0cmNtcChucC0+cGFyZW50LT50eXBlLCAiYWRiIikgPT0gMCkKLQkJCQkJYnJlYWs7Ci0KLQkJCS8qIG5lZWRzIHRvIGJlIGhhY2tlZCBpZiB4bW9uX3ByaW50ayBpcyB0byBiZSB1c2VkCi0JCQkgICBmcm9tIHdpdGhpbiBmaW5kX3ZpYV9wbXUoKSAqLwotI2lmZGVmIENPTkZJR19BREJfUE1VCi0JCQlpZiAobnAgIT0gTlVMTCAmJiBib290X3RleHRfbWFwcGVkICYmIGZpbmRfdmlhX3BtdSgpKQotCQkJCXVzZV9zY3JlZW4gPSAxOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FEQl9DVURBCi0JCQlpZiAobnAgIT0gTlVMTCAmJiBib290X3RleHRfbWFwcGVkICYmIGZpbmRfdmlhX2N1ZGEoKSkKLQkJCQl1c2Vfc2NyZWVuID0gMTsKLSNlbmRpZgotCQl9Ci0JCWlmICghdXNlX3NjcmVlbiAmJiAobnAgPSBmaW5kX2RldmljZXMoImVzY2MiKSkgIT0gTlVMTCkgewotCQkJLyoKLQkJCSAqIGxvb2sgZm9yIHRoZSBkZXZpY2Ugbm9kZSBmb3IgdGhlIHNlcmlhbCBwb3J0Ci0JCQkgKiB3ZSdyZSB1c2luZyBhbmQgc2VlIGlmIGl0IHNheXMgaXQgaGFzIGEgbW9kZW0KLQkJCSAqLwotCQkJY2hhciAqbmFtZSA9IHhtb25fdXNlX3NjY2I/ICJjaC1iIjogImNoLWEiOwotCQkJY2hhciAqc2xvdHM7Ci0JCQlpbnQgbDsKLQotCQkJbnAgPSBucC0+Y2hpbGQ7Ci0JCQl3aGlsZSAobnAgIT0gTlVMTCAmJiBzdHJjbXAobnAtPm5hbWUsIG5hbWUpICE9IDApCi0JCQkJbnAgPSBucC0+c2libGluZzsKLQkJCWlmIChucCAhPSBOVUxMKSB7Ci0JCQkJLyogWFhYIHNob3VsZCBwYXJzZSB0aGlzIHByb3Blcmx5ICovCi0JCQkJY2hhbm5lbF9ub2RlID0gbnA7Ci0JCQkJc2xvdHMgPSBnZXRfcHJvcGVydHkobnAsICJzbG90LW5hbWVzIiwgJmwpOwotCQkJCWlmIChzbG90cyAhPSBOVUxMICYmIGwgPj0gMTAKLQkJCQkgICAgJiYgc3RyY21wKHNsb3RzKzQsICJNb2RlbSIpID09IDApCi0JCQkJCXZpYV9tb2RlbSA9IDE7Ci0JCQl9Ci0JCX0KLQkJYnRleHRfZHJhd3N0cmluZygieG1vbiB1c2VzICIpOwotCQlpZiAodXNlX3NjcmVlbikKLQkJCWJ0ZXh0X2RyYXdzdHJpbmcoInNjcmVlbiBhbmQga2V5Ym9hcmRcbiIpOwotCQllbHNlIHsKLQkJCWlmICh2aWFfbW9kZW0pCi0JCQkJYnRleHRfZHJhd3N0cmluZygibW9kZW0gb24gIik7Ci0JCQlidGV4dF9kcmF3c3RyaW5nKHhtb25fdXNlX3NjY2I/ICJwcmludGVyIjogIm1vZGVtIik7Ci0JCQlidGV4dF9kcmF3c3RyaW5nKCIgcG9ydFxuIik7Ci0JCX0KLQotI2VuZGlmIC8qIENPTkZJR19CT09UWF9URVhUICovCi0KLSNpZmRlZiBDSFJQX0VTQ0MKLQkJYWRkciA9IDB4YzEwMTMwMjA7Ci0jZWxzZQotCQlhZGRyID0gMHhmMzAxMzAyMDsKLSNlbmRpZgotCQlUWFJEWSA9IDQ7Ci0JCVJYUkRZID0gMTsKLQkKLQkJbnAgPSBmaW5kX2RldmljZXMoIm1hYy1pbyIpOwotCQlpZiAobnAgJiYgbnAtPm5fYWRkcnMpCi0JCQlhZGRyID0gbnAtPmFkZHJzWzBdLmFkZHJlc3MgKyAweDEzMDIwOwotCQliYXNlID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgaW9yZW1hcChhZGRyICYgUEFHRV9NQVNLLCBQQUdFX1NJWkUpOwotCQlzY2NjID0gYmFzZSArIChhZGRyICYgflBBR0VfTUFTSyk7Ci0JCXNjY2QgPSBzY2NjICsgMHgxMDsKLQotCX0gZWxzZSB7Ci0JCWJhc2UgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSBpc2FfaW9fYmFzZTsKLQotI2lmZGVmIENPTkZJR19QUENfQ0hSUAotCQlpZiAoX21hY2hpbmUgPT0gX01BQ0hfY2hycCkKLQkJCWJhc2UgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciBfX2lvbWVtICopCi0JCQkJaW9yZW1hcChjaHJwX2ZpbmRfcGh5c19pb19iYXNlKCksIDB4MTAwMCk7Ci0jZW5kaWYKLQotCQlzY2NjID0gYmFzZSArIDB4M2ZkOwotCQlzY2NkID0gYmFzZSArIDB4M2Y4OwotCQlpZiAoeG1vbl91c2Vfc2NjYikgewotCQkJc2NjYyAtPSAweDEwMDsKLQkJCXNjY2QgLT0gMHgxMDA7Ci0JCX0KLQkJVFhSRFkgPSAweDIwOwotCQlSWFJEWSA9IDE7Ci0JCURMQUIgPSAweDgwOwotCX0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0dFTUlOSSkKLQkvKiBzaG91bGQgYWxyZWFkeSBiZSBtYXBwZWQgYnkgdGhlIGtlcm5lbCBib290ICovCi0Jc2NjYyA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIF9faW9tZW0gKikgMHhmZmVmZmIwZDsKLQlzY2NkID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19pb21lbSAqKSAweGZmZWZmYjA4OwotCVRYUkRZID0gMHgyMDsKLQlSWFJEWSA9IDE7Ci0JRExBQiA9IDB4ODA7Ci0jZWxpZiBkZWZpbmVkKENPTkZJR180MDVHUCkKLQlzY2NjID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19pb21lbSAqKTB4ZWY2MDAzMDU7Ci0Jc2NjZCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIF9faW9tZW0gKikweGVmNjAwMzAwOwotCVRYUkRZID0gMHgyMDsKLQlSWFJEWSA9IDE7Ci0JRExBQiA9IDB4ODA7Ci0jZW5kaWYgLyogcGxhdGZvcm0gKi8KLX0KLQotc3RhdGljIGludCBzY2NfaW5pdGlhbGl6ZWQgPSAwOwotCi12b2lkIHhtb25faW5pdF9zY2Modm9pZCk7Ci1leHRlcm4gdm9pZCBjdWRhX3BvbGwodm9pZCk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkb19wb2xsX2FkYih2b2lkKQotewotI2lmZGVmIENPTkZJR19BREJfUE1VCi0JaWYgKHN5c19jdHJsZXIgPT0gU1lTX0NUUkxFUl9QTVUpCi0JCXBtdV9wb2xsX2FkYigpOwotI2VuZGlmIC8qIENPTkZJR19BREJfUE1VICovCi0jaWZkZWYgQ09ORklHX0FEQl9DVURBCi0JaWYgKHN5c19jdHJsZXIgPT0gU1lTX0NUUkxFUl9DVURBKQotCQljdWRhX3BvbGwoKTsKLSNlbmRpZiAvKiBDT05GSUdfQURCX0NVREEgKi8KLX0KLQotaW50IHhtb25fd3JpdGUodm9pZCAqcHRyLCBpbnQgbmIpCi17Ci0JY2hhciAqcCA9IHB0cjsKLQlpbnQgaSwgYywgY3Q7Ci0KLSNpZmRlZiBDT05GSUdfU01QCi0Jc3RhdGljIHVuc2lnbmVkIGxvbmcgeG1vbl93cml0ZV9sb2NrOwotCWludCBsb2NrX3dhaXQgPSAxMDAwMDAwOwotCWludCBsb2NrZWQ7Ci0KLQl3aGlsZSAoKGxvY2tlZCA9IHRlc3RfYW5kX3NldF9iaXQoMCwgJnhtb25fd3JpdGVfbG9jaykpICE9IDApCi0JCWlmICgtLWxvY2tfd2FpdCA9PSAwKQotCQkJYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19CT09UWF9URVhUCi0JaWYgKHVzZV9zY3JlZW4pIHsKLQkJLyogd3JpdGUgaXQgb24gdGhlIHNjcmVlbiAqLwotCQlmb3IgKGkgPSAwOyBpIDwgbmI7ICsraSkKLQkJCWJ0ZXh0X2RyYXdjaGFyKCpwKyspOwotCQlnb3RvIG91dDsKLQl9Ci0jZW5kaWYKLQlpZiAoIXNjY19pbml0aWFsaXplZCkKLQkJeG1vbl9pbml0X3NjYygpOwotCWN0ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgbmI7ICsraSkgewotCQl3aGlsZSAoKCpzY2NjICYgVFhSRFkpID09IDApCi0JCQlkb19wb2xsX2FkYigpOwotCQljID0gcFtpXTsKLQkJaWYgKGMgPT0gJ1xuJyAmJiAhY3QpIHsKLQkJCWMgPSAnXHInOwotCQkJY3QgPSAxOwotCQkJLS1pOwotCQl9IGVsc2UgewotCQkJY3QgPSAwOwotCQl9Ci0JCWJ1Zl9hY2Nlc3MoKTsKLQkJKnNjY2QgPSBjOwotCQllaWVpbygpOwotCX0KLQotIG91dDoKLSNpZmRlZiBDT05GSUdfU01QCi0JaWYgKCFsb2NrZWQpCi0JCWNsZWFyX2JpdCgwLCAmeG1vbl93cml0ZV9sb2NrKTsKLSNlbmRpZgotCXJldHVybiBuYjsKLX0KLQotaW50IHhtb25fd2FudHNfa2V5OwotaW50IHhtb25fYWRiX2tleWNvZGU7Ci0KLSNpZmRlZiBDT05GSUdfQk9PVFhfVEVYVAotc3RhdGljIGludCB4bW9uX2FkYl9zaGlmdHN0YXRlOwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciB4bW9uX2tleXRhYlsxMjhdID0KLQkiYXNkZmhnenhjdlwwMDBicXdlciIJCQkJLyogMHgwMCAtIDB4MGYgKi8KLQkieXQxMjM0NjU9OTctODBdbyIJCQkJLyogMHgxMCAtIDB4MWYgKi8KLQkidVtpcFxybGonaztcXCwvbm0uIgkJCQkvKiAweDIwIC0gMHgyZiAqLwotCSJcdCBgXDE3N1wwXDAzM1wwXDBcMFwwXDBcMFwwXDBcMFwwIgkJLyogMHgzMCAtIDB4M2YgKi8KLQkiXDAuXDAqXDArXDBcMFwwXDBcMC9cclwwLVwwIgkJCS8qIDB4NDAgLSAweDRmICovCi0JIlwwXDAwMDAxMjM0NTY3ODlcMFwwXDAiOwkJCS8qIDB4NTAgLSAweDVmICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHhtb25fc2hpZnRfa2V5dGFiWzEyOF0gPQotCSJBU0RGSEdaWENWXDAwMEJRV0VSIgkJCQkvKiAweDAwIC0gMHgwZiAqLwotCSJZVCFAIyReJSsoJl8qKX1PIgkJCQkvKiAweDEwIC0gMHgxZiAqLwotCSJVe0lQXHJMSlwiSzp8PD9OTT4iCQkJCS8qIDB4MjAgLSAweDJmICovCi0JIlx0IH5cMTc3XDBcMDMzXDBcMFwwXDBcMFwwXDBcMFwwXDAiCQkvKiAweDMwIC0gMHgzZiAqLwotCSJcMC5cMCpcMCtcMFwwXDBcMFwwL1xyXDAtXDAiCQkJLyogMHg0MCAtIDB4NGYgKi8KLQkiXDBcMDAwMDEyMzQ1Njc4OVwwXDBcMCI7CQkJLyogMHg1MCAtIDB4NWYgKi8KLQotc3RhdGljIGludCB4bW9uX2dldF9hZGJfa2V5KHZvaWQpCi17Ci0JaW50IGssIHQsIG9uOwotCi0JeG1vbl93YW50c19rZXkgPSAxOwotCWZvciAoOzspIHsKLQkJeG1vbl9hZGJfa2V5Y29kZSA9IC0xOwotCQl0ID0gMDsKLQkJb24gPSAwOwotCQlkbyB7Ci0JCQlpZiAoLS10IDwgMCkgewotCQkJCW9uID0gMSAtIG9uOwotCQkJCWJ0ZXh0X2RyYXdjaGFyKG9uPyAweGRiOiAweDIwKTsKLQkJCQlidGV4dF9kcmF3Y2hhcignXGInKTsKLQkJCQl0ID0gMjAwMDAwOwotCQkJfQotCQkJZG9fcG9sbF9hZGIoKTsKLQkJfSB3aGlsZSAoeG1vbl9hZGJfa2V5Y29kZSA9PSAtMSk7Ci0JCWsgPSB4bW9uX2FkYl9rZXljb2RlOwotCQlpZiAob24pCi0JCQlidGV4dF9kcmF3c3RyaW5nKCIgXGIiKTsKLQotCQkvKiB0ZXN0IGZvciBzaGlmdCBrZXlzICovCi0JCWlmICgoayAmIDB4N2YpID09IDB4MzggfHwgKGsgJiAweDdmKSA9PSAweDdiKSB7Ci0JCQl4bW9uX2FkYl9zaGlmdHN0YXRlID0gKGsgJiAweDgwKSA9PSAwOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKGsgPj0gMHg4MCkKLQkJCWNvbnRpbnVlOwkvKiBpZ25vcmUgdXAgdHJhbnNpdGlvbnMgKi8KLQkJayA9ICh4bW9uX2FkYl9zaGlmdHN0YXRlPyB4bW9uX3NoaWZ0X2tleXRhYjogeG1vbl9rZXl0YWIpW2tdOwotCQlpZiAoayAhPSAwKQotCQkJYnJlYWs7Ci0JfQotCXhtb25fd2FudHNfa2V5ID0gMDsKLQlyZXR1cm4gazsKLX0KLSNlbmRpZiAvKiBDT05GSUdfQk9PVFhfVEVYVCAqLwotCi1pbnQgeG1vbl9yZWFkY2hhcih2b2lkKQotewotI2lmZGVmIENPTkZJR19CT09UWF9URVhUCi0JaWYgKHVzZV9zY3JlZW4pCi0JCXJldHVybiB4bW9uX2dldF9hZGJfa2V5KCk7Ci0jZW5kaWYKLQlpZiAoIXNjY19pbml0aWFsaXplZCkKLQkJeG1vbl9pbml0X3NjYygpOwotCXdoaWxlICgoKnNjY2MgJiBSWFJEWSkgPT0gMCkKLQkJZG9fcG9sbF9hZGIoKTsKLQlidWZfYWNjZXNzKCk7Ci0JcmV0dXJuICpzY2NkOwotfQotCi1pbnQgeG1vbl9yZWFkX3BvbGwodm9pZCkKLXsKLQlpZiAoKCpzY2NjICYgUlhSRFkpID09IDApIHsKLQkJZG9fcG9sbF9hZGIoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlidWZfYWNjZXNzKCk7Ci0JcmV0dXJuICpzY2NkOwotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBzY2NfaW5pdHRhYltdID0gewotICAgIDEzLCAwLAkJLyogc2V0IGJhdWQgcmF0ZSBkaXZpc29yICovCi0gICAgMTIsIDEsCi0gICAgMTQsIDEsCQkvKiBiYXVkIHJhdGUgZ2VuIGVuYWJsZSwgc3JjPXJ0eGMgKi8KLSAgICAxMSwgMHg1MCwJCS8qIGNsb2NrcyA9IGJyIGdlbiAqLwotICAgIDUsICAweGVhLAkJLyogdHggOCBiaXRzLCBhc3NlcnQgRFRSICYgUlRTICovCi0gICAgNCwgIDB4NDYsCQkvKiB4MTYgY2xvY2ssIDEgc3RvcCAqLwotICAgIDMsICAweGMxLAkJLyogcnggZW5hYmxlLCA4IGJpdHMgKi8KLX07Ci0KLXZvaWQgeG1vbl9pbml0X3NjYyh2b2lkKQotewotCWlmICggX21hY2hpbmUgPT0gX01BQ0hfY2hycCApCi0JewotCQlzY2NkWzNdID0gMHg4MzsgZWllaW8oKTsJLyogTENSID0gOE4xICsgRExBQiAqLwotCQlzY2NkWzBdID0gMTI7IGVpZWlvKCk7CQkvKiBETEwgPSA5NjAwIGJhdWQgKi8KLQkJc2NjZFsxXSA9IDA7IGVpZWlvKCk7Ci0JCXNjY2RbMl0gPSAwOyBlaWVpbygpOwkJLyogRkNSID0gMCAqLwotCQlzY2NkWzNdID0gMzsgZWllaW8oKTsJCS8qIExDUiA9IDhOMSAqLwotCQlzY2NkWzFdID0gMDsgZWllaW8oKTsJCS8qIElFUiA9IDAgKi8KLQl9Ci0JZWxzZSBpZiAoIF9tYWNoaW5lID09IF9NQUNIX1BtYWMgKQotCXsKLQkJaW50IGksIHg7Ci0JCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQotCQlpZiAoY2hhbm5lbF9ub2RlICE9IDApCi0JCQlwbWFjX2NhbGxfZmVhdHVyZSgKLQkJCQlQTUFDX0ZUUl9TQ0NfRU5BQkxFLAotCQkJCWNoYW5uZWxfbm9kZSwKLQkJCQlQTUFDX1NDQ19BU1lOQyB8IFBNQUNfU0NDX0ZMQUdfWE1PTiwgMSk7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJTZXJpYWwgcG9ydCBsb2NrZWQgT04gYnkgZGVidWdnZXIgIVxuIik7Ci0JCWlmICh2aWFfbW9kZW0gJiYgY2hhbm5lbF9ub2RlICE9IDApIHsKLQkJCXVuc2lnbmVkIGludCB0MDsKLQotCQkJcG1hY19jYWxsX2ZlYXR1cmUoCi0JCQkJUE1BQ19GVFJfTU9ERU1fRU5BQkxFLAotCQkJCWNoYW5uZWxfbm9kZSwgMCwgMSk7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJNb2RlbSBwb3dlcmVkIHVwIGJ5IGRlYnVnZ2VyICFcbiIpOwotCQkJdDAgPSBnZXRfdGJsKCk7Ci0JCQl0aW1lb3V0ID0gMyAqIHRiX3RpY2tzX3Blcl9zZWM7Ci0JCQlpZiAodGltZW91dCA9PSAwKQotCQkJCS8qIGFzc3VtZSAyNU1IeiBpZiB0Yl90aWNrc19wZXJfc2VjIG5vdCBzZXQgKi8KLQkJCQl0aW1lb3V0ID0gNzUwMDAwMDA7Ci0JCQl3aGlsZSAoZ2V0X3RibCgpIC0gdDAgPCB0aW1lb3V0KQotCQkJCWVpZWlvKCk7Ci0JCX0KLQkJLyogdXNlIHRoZSBCIGNoYW5uZWwgaWYgcmVxdWVzdGVkICovCi0JCWlmICh4bW9uX3VzZV9zY2NiKSB7Ci0JCQlzY2NjID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikKLQkJCQkoKHVuc2lnbmVkIGxvbmcpc2NjYyAmIH4weDIwKTsKLQkJCXNjY2QgPSBzY2NjICsgMHgxMDsKLQkJfQotCQlmb3IgKGkgPSAyMDAwMDsgaSAhPSAwOyAtLWkpIHsKLQkJCXggPSAqc2NjYzsgZWllaW8oKTsKLQkJfQotCQkqc2NjYyA9IDk7IGVpZWlvKCk7CQkvKiByZXNldCBBIG9yIEIgc2lkZSAqLwotCQkqc2NjYyA9ICgodW5zaWduZWQgbG9uZylzY2NjICYgMHgyMCk/IDB4ODA6IDB4NDA7IGVpZWlvKCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc2NjX2luaXR0YWIpOyArK2kpIHsKLQkJCSpzY2NjID0gc2NjX2luaXR0YWJbaV07Ci0JCQllaWVpbygpOwotCQl9Ci0JfQotCXNjY19pbml0aWFsaXplZCA9IDE7Ci0JaWYgKHZpYV9tb2RlbSkgewotCQlmb3IgKDs7KSB7Ci0JCQl4bW9uX3dyaXRlKCJBVEUxVjFcciIsIDcpOwotCQkJaWYgKHhtb25fZXhwZWN0KCJPSyIsIDUpKSB7Ci0JCQkJeG1vbl93cml0ZSgiQVRBXHIiLCA0KTsKLQkJCQlpZiAoeG1vbl9leHBlY3QoIkNPTk5FQ1QiLCA0MCkpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJeG1vbl93cml0ZSgiKysrIiwgMyk7Ci0JCQl4bW9uX2V4cGVjdCgiT0siLCAzKTsKLQkJfQotCX0KLX0KLQotdm9pZCB4bW9uX2VudGVyKHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX0FEQl9QTVUKLQlpZiAoX21hY2hpbmUgPT0gX01BQ0hfUG1hYykgewotCQlwbXVfc3VzcGVuZCgpOwotCX0KLSNlbmRpZgotfQotCi12b2lkIHhtb25fbGVhdmUodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfQURCX1BNVQotCWlmIChfbWFjaGluZSA9PSBfTUFDSF9QbWFjKSB7Ci0JCXBtdV9yZXN1bWUoKTsKLQl9Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy94bW9uL3N0YXJ0Xzh4eC5jIGIvYXJjaC9wb3dlcnBjL3htb24vc3RhcnRfOHh4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMTdiMDQuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3htb24vc3RhcnRfOHh4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzLgotICogQ29weXJpZ2h0IChDKSAyMDAwIERhbiBNYWxlay4KLSAqIFF1aWNrIGhhY2sgb2YgUGF1bCdzIGNvZGUgdG8gbWFrZSBYTU9OIHdvcmsgb24gOHh4IHByb2Nlc3NvcnMuICBMb3RzCi0gKiBvZiBhc3N1bXB0aW9ucywgbGlrZSB0aGUgU01DMSBpcyB1c2VkLCBpdCBoYXMgYmVlbiBpbml0aWFsaXplZCBieSB0aGUKLSAqIGxvYWRlciBhdCBzb21lIHBvaW50LCBhbmQgd2UgY2FuIGp1c3Qgc3R1ZmYgYW5kIHN1Y2sgYnl0ZXMuCi0gKiBXZSByZWx5IHVwb24gdGhlIDh4eCB1YXJ0IGRyaXZlciB0byBzdXBwb3J0IHVzLCBhcyB0aGUgaW50ZXJmYWNlCi0gKiBjaGFuZ2VzIGJldHdlZW4gYm9vdCB1cCBhbmQgb3BlcmF0aW9uYWwgcGhhc2VzIG9mIHRoZSBrZXJuZWwuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8YXNtLzh4eF9pbW1hcC5oPgotI2luY2x1ZGUgPGFzbS9tcGM4eHguaD4KLSNpbmNsdWRlIDxhc20vY29tbXByb2MuaD4KLSNpbmNsdWRlICJub25zdGRpby5oIgotCi1leHRlcm4gaW50IHhtb25fOHh4X3dyaXRlKGNoYXIgKnN0ciwgaW50IG5iKTsKLWV4dGVybiBpbnQgeG1vbl84eHhfcmVhZF9wb2xsKHZvaWQpOwotZXh0ZXJuIGludCB4bW9uXzh4eF9yZWFkX2NoYXIodm9pZCk7Ci0KLXZvaWQgeG1vbl9tYXBfc2NjKHZvaWQpCi17Ci0JY3BtcCA9IChjcG04eHhfdCAqKSYoKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fY3BtKTsKLX0KLQotdm9pZCB4bW9uX2luaXRfc2NjKHZvaWQpOwotCi1pbnQgeG1vbl93cml0ZSh2b2lkICpwdHIsIGludCBuYikKLXsKLQlyZXR1cm4oeG1vbl84eHhfd3JpdGUocHRyLCBuYikpOwotfQotCi1pbnQgeG1vbl9yZWFkY2hhcih2b2lkKQotewotCXJldHVybiB4bW9uXzh4eF9yZWFkX2NoYXIoKTsKLX0KLQotaW50IHhtb25fcmVhZF9wb2xsKHZvaWQpCi17Ci0JcmV0dXJuKHhtb25fOHh4X3JlYWRfcG9sbCgpKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYyBiL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYwppbmRleCBjNDVhNmFkLi43ZDAyZmEyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jCkBAIC0zMTEsNyArMzExLDcgQEAKIH0KICNlbmRpZgogCi1pbnQgeG1vbl9jb3JlKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgZnJvbWlwaSkKK3N0YXRpYyBpbnQgeG1vbl9jb3JlKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgZnJvbWlwaSkKIHsKIAlpbnQgY21kID0gMDsKIAl1bnNpZ25lZCBsb25nIG1zcjsKQEAgLTQ1MCw3ICs0NTAsNiBAQAogIGxlYXZlOgogCWNwdV9jbGVhcihjcHUsIGNwdXNfaW5feG1vbik7CiAJeG1vbl9mYXVsdF9qbXBbY3B1XSA9IE5VTEw7Ci0KICNlbHNlCiAJLyogVVAgaXMgc2ltcGxlLi4uICovCiAJaWYgKGluX3htb24pIHsKQEAgLTUyOSw3ICs1MjgsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotaW50IHhtb25fYnB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGludCB4bW9uX2JwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgYnB0ICpicDsKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKQEAgLTU1NSw3ICs1NTQsNyBAQAogCXJldHVybiAxOwogfQogCi1pbnQgeG1vbl9zc3RlcChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpbnQgeG1vbl9zc3RlcChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpZiAodXNlcl9tb2RlKHJlZ3MpKQogCQlyZXR1cm4gMDsKQEAgLTU2Myw3ICs1NjIsNyBAQAogCXJldHVybiAxOwogfQogCi1pbnQgeG1vbl9kYWJyX21hdGNoKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGludCB4bW9uX2RhYnJfbWF0Y2goc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaWYgKChyZWdzLT5tc3IgJiAoTVNSX0lSfE1TUl9QUnxNU1JfU0YpKSAhPSAoTVNSX0lSfE1TUl9TRikpCiAJCXJldHVybiAwOwpAQCAtNTczLDcgKzU3Miw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLWludCB4bW9uX2lhYnJfbWF0Y2goc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW50IHhtb25faWFicl9tYXRjaChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpZiAoKHJlZ3MtPm1zciAmIChNU1JfSVJ8TVNSX1BSfE1TUl9TRikpICE9IChNU1JfSVJ8TVNSX1NGKSkKIAkJcmV0dXJuIDA7CkBAIC01ODMsNyArNTgyLDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotaW50IHhtb25faXBpKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGludCB4bW9uX2lwaShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKICNpZmRlZiBDT05GSUdfU01QCiAJaWYgKGluX3htb24gJiYgIWNwdV9pc3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGNwdXNfaW5feG1vbikpCkBAIC01OTIsNyArNTkxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHhtb25fZmF1bHRfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpbnQgeG1vbl9mYXVsdF9oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBicHQgKmJwOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwpAQCAtODA1LDcgKzgwNCwxMCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgJ3gnOgogCQljYXNlICdYJzoKKwkJCXJldHVybiBjbWQ7CiAJCWNhc2UgRU9GOgorCQkJcHJpbnRmKCIgPG5vIGlucHV0IC4uLj5cbiIpOworCQkJbWRlbGF5KDIwMDApOwogCQkJcmV0dXJuIGNtZDsKIAkJY2FzZSAnPyc6CiAJCQlwcmludGYoaGVscF9zdHJpbmcpOwpAQCAtMTAxMSw3ICsxMDEzLDcgQEAKIAl1bnNpZ25lZCBpbnQgaW5zdHI7CiAKIAlhZGRyICY9IH4zOwotCWlmIChhZGRyIDwgS0VSTkVMQkFTRSkgeworCWlmICghaXNfa2VybmVsX2FkZHIoYWRkcikpIHsKIAkJcHJpbnRmKCJCcmVha3BvaW50cyBtYXkgb25seSBiZSBwbGFjZWQgYXQga2VybmVsIGFkZHJlc3Nlc1xuIik7CiAJCXJldHVybiAwOwogCX0KQEAgLTEwNjIsNyArMTA2NCw3IEBACiAJCWRhYnIuYWRkcmVzcyA9IDA7CiAJCWRhYnIuZW5hYmxlZCA9IDA7CiAJCWlmIChzY2FuaGV4KCZkYWJyLmFkZHJlc3MpKSB7Ci0JCQlpZiAoZGFici5hZGRyZXNzIDwgS0VSTkVMQkFTRSkgeworCQkJaWYgKCFpc19rZXJuZWxfYWRkcihkYWJyLmFkZHJlc3MpKSB7CiAJCQkJcHJpbnRmKGJhZGFkZHIpOwogCQkJCWJyZWFrOwogCQkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvNHh4X2lvL3NlcmlhbF9zaWNjLmMgYi9hcmNoL3BwYy80eHhfaW8vc2VyaWFsX3NpY2MuYwppbmRleCA4NGQ5NmI4Li44YWNlMmExIDEwMDY0NAotLS0gYS9hcmNoL3BwYy80eHhfaW8vc2VyaWFsX3NpY2MuYworKysgYi9hcmNoL3BwYy80eHhfaW8vc2VyaWFsX3NpY2MuYwpAQCAtNDcsNiArNDcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY2lyY19idWYuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CkBAIC0yMTQsNyArMjE1LDYgQEAKICAqIG1lbW9yeSBpZiBsYXJnZSBudW1iZXJzIG9mIHNlcmlhbCBwb3J0cyBhcmUgb3Blbi4KICAqLwogc3RhdGljIHVfY2hhciAqdG1wX2J1ZjsKLXN0YXRpYyBERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKIAogI2RlZmluZSBISUdIX0JJVFNfT0ZGU0VUICAgICgoc2l6ZW9mKGxvbmcpLXNpemVvZihpbnQpKSo4KQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9LY29uZmlnIGIvYXJjaC9wcGMvS2NvbmZpZwppbmRleCBjYzNmNjRjLi4xMTg5OWYwIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9LY29uZmlnCisrKyBiL2FyY2gvcHBjL0tjb25maWcKQEAgLTgsOSArOCw2IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCi1jb25maWcgVUlEMTYKLQlib29sCi0KIGNvbmZpZyBHRU5FUklDX0hBUkRJUlFTCiAJYm9vbAogCWRlZmF1bHQgeQpAQCAtNjEsMTEgKzU4LDExIEBACiAJaGVscAogCSAgVGhlcmUgYXJlIGZvdXIgdHlwZXMgb2YgUG93ZXJQQyBjaGlwcyBzdXBwb3J0ZWQuICBUaGUgbW9yZSBjb21tb24KIAkgIHR5cGVzICg2MDEsIDYwMywgNjA0LCA3NDAsIDc1MCwgNzQwMCksIHRoZSBNb3Rvcm9sYSBlbWJlZGRlZAotCSAgdmVyc2lvbnMgKDgyMSwgODIzLCA4NTAsIDg1NSwgODYwLCA1Mnh4LCA4Mnh4LCA4M3h4KSwgdGhlIElCTSBlbWJlZGRlZAotCSAgdmVyc2lvbnMgKDQwMyBhbmQgNDA1KSBhbmQgdGhlIGhpZ2ggZW5kIDY0IGJpdCBQb3dlciBwcm9jZXNzb3JzCi0JICAoUE9XRVIgMywgUE9XRVI0LCBhbmQgSUJNIDk3MCBhbHNvIGtub3duIGFzIEc1KQorCSAgdmVyc2lvbnMgKDgyMSwgODIzLCA4NTAsIDg1NSwgODYwLCA1Mnh4LCA4Mnh4LCA4M3h4KSwgdGhlIElCTQorCSAgZW1iZWRkZWQgdmVyc2lvbnMgKDQwMyBhbmQgNDA1KSBhbmQgdGhlIFBPV0VSMyBwcm9jZXNzb3IuCisJICAoRm9yIHN1cHBvcnQgZm9yIG1vcmUgcmVjZW50IDY0LWJpdCBwcm9jZXNzb3JzLCBzZXQgQVJDSD1wb3dlcnBjLikKIAkgIFVubGVzcyB5b3UgYXJlIGJ1aWxkaW5nIGEga2VybmVsIGZvciBvbmUgb2YgdGhlIGVtYmVkZGVkIHByb2Nlc3NvcgotCSAgc3lzdGVtcywgNjQgYml0IElCTSBSUy82MDAwIG9yIGFuIEFwcGxlIEc1LCBjaG9vc2UgNnh4LgorCSAgc3lzdGVtcyBvciBhIFBPV0VSMy1iYXNlZCBJQk0gUlMvNjAwMCwgY2hvb3NlIDZ4eC4KIAkgIE5vdGUgdGhhdCB0aGUga2VybmVsIHJ1bnMgaW4gMzItYml0IG1vZGUgZXZlbiBvbiA2NC1iaXQgY2hpcHMuCiAJICBBbHNvIG5vdGUgdGhhdCBiZWNhdXNlIHRoZSA1Mnh4LCA4Mnh4LCAmIDgzeHggZmFtaWx5IGhhcyBhIDYwM2UgY29yZSwKIAkgIHNwZWNpZmljIHN1cHBvcnQgZm9yIHRoYXQgY2hpcHNldCBpcyBhc2tlZCBsYXRlciBvbi4KQEAgLTgwLDEwICs3Nyw2IEBACiAJc2VsZWN0IFBQQ19GUFUKIAlib29sICJQT1dFUjMiCiAKLWNvbmZpZyBQT1dFUjQKLQlzZWxlY3QgUFBDX0ZQVQotCWJvb2wgIlBPV0VSNCBhbmQgOTcwIChHNSkiCi0KIGNvbmZpZyA4eHgKIAlib29sICI4eHgiCiAKQEAgLTEyNiw3ICsxMTksNyBAQAogCiBjb25maWcgQUxUSVZFQwogCWJvb2wgIkFsdGlWZWMgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIDZ4eCB8fCBQT1dFUjQKKwlkZXBlbmRzIG9uIDZ4eAogCWRlcGVuZHMgb24gITgyNjAgJiYgITgzeHgKIAktLS1oZWxwLS0tCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIGtlcm5lbCBzdXBwb3J0IGZvciB0aGUgQWx0aXZlYyBleHRlbnNpb25zIHRvIHRoZQpAQCAtMjM4LDE4ICsyMzEsOSBAQAogCiBzb3VyY2UgImRyaXZlcnMvY3B1ZnJlcS9LY29uZmlnIgogCi1jb25maWcgQ1BVX0ZSRVFfUE1BQwotCWJvb2wgIlN1cHBvcnQgZm9yIEFwcGxlIFBvd2VyQm9va3MiCi0JZGVwZW5kcyBvbiBDUFVfRlJFUSAmJiBBREJfUE1VCi0Jc2VsZWN0IENQVV9GUkVRX1RBQkxFCi0JaGVscAotCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIGZyZXF1ZW5jeSBzd2l0Y2hpbmcgb24gQXBwbGUgUG93ZXJCb29rcywKLQkgIHRoaXMgY3VycmVudGx5IGluY2x1ZGVzIHNvbWUgbW9kZWxzIG9mIGlCb29rICYgVGl0YW5pdW0KLQkgIFBvd2VyQm9vay4KLQogY29uZmlnIFBQQzYwMV9TWU5DX0ZJWAogCWJvb2wgIldvcmthcm91bmRzIGZvciBQUEM2MDEgYnVncyIKLQlkZXBlbmRzIG9uIDZ4eCAmJiAoUFBDX1BSRVAgfHwgUFBDX1BNQUMpCisJZGVwZW5kcyBvbiA2eHggJiYgUFBDX1BSRVAKIAloZWxwCiAJICBTb21lIHZlcnNpb25zIG9mIHRoZSBQUEM2MDEgKHRoZSBmaXJzdCBQb3dlclBDIGNoaXApIGhhdmUgYnVncyB3aGljaAogCSAgbWVhbiB0aGF0IGV4dHJhIHN5bmNocm9uaXphdGlvbiBpbnN0cnVjdGlvbnMgYXJlIHJlcXVpcmVkIG5lYXIKQEAgLTI2MSwyNiArMjQ1LDE3IEBACiAKIAkgIElmIGluIGRvdWJ0LCBzYXkgWSBoZXJlLgogCi1jb25maWcgSE9UUExVR19DUFUKLQlib29sICJTdXBwb3J0IGZvciBlbmFibGluZy9kaXNhYmxpbmcgQ1BVcyIKLQlkZXBlbmRzIG9uIFNNUCAmJiBIT1RQTFVHICYmIEVYUEVSSU1FTlRBTCAmJiBQUENfUE1BQwotCS0tLWhlbHAtLS0KLQkgIFNheSBZIGhlcmUgdG8gYmUgYWJsZSB0byBkaXNhYmxlIGFuZCByZS1lbmFibGUgaW5kaXZpZHVhbAotCSAgQ1BVcyBhdCBydW50aW1lIG9uIFNNUCBtYWNoaW5lcy4KLQotCSAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCi0KIHNvdXJjZSBhcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L0tjb25maWcKIHNvdXJjZSBhcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9LY29uZmlnCiAKIGNvbmZpZyBQUEM2NEJSSURHRQogCWJvb2wKLQlkZXBlbmRzIG9uIFBPV0VSMyB8fCBQT1dFUjQKKwlkZXBlbmRzIG9uIFBPV0VSMwogCWRlZmF1bHQgeQogCiBjb25maWcgUFBDX1NURF9NTVUKIAlib29sCi0JZGVwZW5kcyBvbiA2eHggfHwgUE9XRVIzIHx8IFBPV0VSNAorCWRlcGVuZHMgb24gNnh4IHx8IFBPV0VSMwogCWRlZmF1bHQgeQogCiBjb25maWcgTk9UX0NPSEVSRU5UX0NBQ0hFCkBAIC01MDgsNyArNDgzLDcgQEAKIAogY2hvaWNlCiAJcHJvbXB0ICJNYWNoaW5lIFR5cGUiCi0JZGVwZW5kcyBvbiA2eHggfHwgUE9XRVIzIHx8IFBPV0VSNAorCWRlcGVuZHMgb24gNnh4IHx8IFBPV0VSMwogCWRlZmF1bHQgUFBDX01VTFRJUExBVEZPUk0KIAktLS1oZWxwLS0tCiAJICBMaW51eCBjdXJyZW50bHkgc3VwcG9ydHMgc2V2ZXJhbCBkaWZmZXJlbnQga2luZHMgb2YgUG93ZXJQQy1iYXNlZApAQCAtNTE5LDExICs0OTQsMTUgQEAKIAkgIFBsYXRmb3JtKSBtYWNoaW5lcyAoaW5jbHVkaW5nIGFsbCBvZiB0aGUgcmVjZW50IElCTSBSUy82MDAwIGFuZAogCSAgcFNlcmllcyBtYWNoaW5lcyksIGFuZCBzZXZlcmFsIGVtYmVkZGVkIFBvd2VyUEMgc3lzdGVtcyBjb250YWluaW5nCiAJICA0eHgsIDZ4eCwgN3h4LCA4eHgsIDc0eHgsIGFuZCA4Mnh4IHByb2Nlc3NvcnMuICBDdXJyZW50bHksIHRoZQotCSAgZGVmYXVsdCBvcHRpb24gaXMgdG8gYnVpbGQgYSBrZXJuZWwgd2hpY2ggd29ya3Mgb24gdGhlIGZpcnN0IHRocmVlLgorCSAgZGVmYXVsdCBvcHRpb24gaXMgdG8gYnVpbGQgYSBrZXJuZWwgd2hpY2ggd29ya3Mgb24gUFJlUCBhbmQgQ0hSUC4KIAotCSAgU2VsZWN0IENIUlAvUG93ZXJNYWMvUFJlUCBpZiBjb25maWd1cmluZyBmb3IgYW4gSUJNIFJTLzYwMDAgb3IKLQkgIHBTZXJpZXMgbWFjaGluZSwgYSBQb3dlciBNYWNpbnRvc2ggKGluY2x1ZGluZyBpTWFjcywgaUJvb2tzIGFuZAotCSAgUG93ZXJib29rcyksIG9yIGEgUFJlUCBtYWNoaW5lLgorCSAgTm90ZSB0aGF0IHN1cHBvcnQgZm9yIEFwcGxlIG1hY2hpbmVzIGlzIG5vdyBvbmx5IGF2YWlsYWJsZSB3aXRoCisJICBBUkNIPXBvd2VycGMsIGFuZCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhpcyBtZW51LiAgSWYgeW91IHdpc2gKKwkgIHRvIGJ1aWxkIGEga2VybmVsIGZvciBhbiBBcHBsZSBtYWNoaW5lLCBleGl0IHRoaXMgY29uZmlndXJhdGlvbgorCSAgcHJvY2VzcyBhbmQgcmUtcnVuIGl0IHdpdGggQVJDSD1wb3dlcnBjLgorCisJICBTZWxlY3QgQ0hSUC9QUmVQIGlmIGNvbmZpZ3VyaW5nIGZvciBhbiBJQk0gUlMvNjAwMCBvcgorCSAgcFNlcmllcyBtYWNoaW5lLCBvciBhIFBSZVAgbWFjaGluZS4KIAogCSAgU2VsZWN0IEdlbWluaSBpZiBjb25maWd1cmluZyBmb3IgYSBTeW5lcmd5IE1pY3Jvc3lzdGVtcycgR2VtaW5pCiAJICBzZXJpZXMgU2luZ2xlIEJvYXJkIENvbXB1dGVyLiAgTW9yZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgYXQ6CkBAIC01MzMsNyArNTEyLDcgQEAKIAkgIGF2YWlsYWJsZSBhdDogPGh0dHA6Ly9saW51eC1hcHVzLnNvdXJjZWZvcmdlLm5ldC8+LgogCiBjb25maWcgUFBDX01VTFRJUExBVEZPUk0KLQlib29sICJDSFJQL1Bvd2VyTWFjL1BSZVAiCisJYm9vbCAiQ0hSUC9QUmVQIgogCiBjb25maWcgQVBVUwogCWJvb2wgIkFtaWdhLUFQVVMiCkBAIC03NDYsNiArNzI1LDEwIEBACiAJYm9vbAogCWRlZmF1bHQgeSBpZiBNUEM4MzR4X1NZUwogCitjb25maWcgUFBDXzgzeHgKKwlib29sCisJZGVmYXVsdCB5IGlmIDgzeHgKKwogY29uZmlnIENQTTEKIAlib29sCiAJZGVwZW5kcyBvbiA4eHgKQEAgLTc2NywyNSArNzUwLDE0IEBACiAJICBvbiBpdCAoODI2eCwgODI3eCwgODU2MCkuCiAKIGNvbmZpZyBQUENfQ0hSUAotCWJvb2wKKwlib29sICJTdXBwb3J0IGZvciBDSFJQIChDb21tb24gSGFyZHdhcmUgUmVmZXJlbmNlIFBsYXRmb3JtKSBtYWNoaW5lcyIKIAlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNCiAJc2VsZWN0IFBQQ19JODI1OQogCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCiAJZGVmYXVsdCB5CiAKLWNvbmZpZyBQUENfUE1BQwotCWJvb2wKLQlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNCi0Jc2VsZWN0IFBQQ19JTkRJUkVDVF9QQ0kKLQlkZWZhdWx0IHkKLQotY29uZmlnIFBQQ19QTUFDNjQKLQlib29sCi0JZGVwZW5kcyBvbiBQUENfUE1BQyAmJiBQT1dFUjQKLQlkZWZhdWx0IHkKLQogY29uZmlnIFBQQ19QUkVQCi0JYm9vbAorCWJvb2wgIlN1cHBvcnQgZm9yIFBSZVAgKFBvd2VyUEMgUmVmZXJlbmNlIFBsYXRmb3JtKSBtYWNoaW5lcyIKIAlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNCiAJc2VsZWN0IFBQQ19JODI1OQogCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCkBAIC03OTMsNyArNzY1LDcgQEAKIAogY29uZmlnIFBQQ19PRgogCWJvb2wKLQlkZXBlbmRzIG9uIFBQQ19QTUFDIHx8IFBQQ19DSFJQCisJZGVwZW5kcyBvbiBQUENfQ0hSUAogCWRlZmF1bHQgeQogCiBjb25maWcgUFBDX0dFTjU1MApAQCAtMTE2NSw3ICsxMTM3LDcgQEAKIAogY29uZmlnIEdFTkVSSUNfSVNBX0RNQQogCWJvb2wKLQlkZXBlbmRzIG9uIFBPV0VSMyB8fCBQT1dFUjQgfHwgNnh4ICYmICFDUE0yCisJZGVwZW5kcyBvbiBQT1dFUjMgfHwgNnh4ICYmICFDUE0yCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBQUENfSTgyNTkKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL01ha2VmaWxlIGIvYXJjaC9wcGMvTWFrZWZpbGUKaW5kZXggZTcxOWE0OS4uOThlOTQwYiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMvTWFrZWZpbGUKQEAgLTEyOCwxMCArMTI4LDkgQEAKICMgRW5zdXJlIHRoaXMgaXMgYmludXRpbHMgMi4xMi4xIChvciAyLjEyLjkwLjAuNykgb3IgbGF0ZXIgZm9yIGFsdGl2ZWMKICMgaW5zdHJ1Y3Rpb25zLgogIyBnY2MtMy40IGFuZCBiaW51dGlscy0yLjE0IGFyZSBhIGZhdGFsIGNvbWJpbmF0aW9uLgotR0NDX1ZFUlNJT04JOj0gJChjYWxsIGNjLXZlcnNpb24pCiAKIGNoZWNrYmluOgotCUBpZiB0ZXN0ICIkKEdDQ19WRVJTSU9OKSIgPSAiMDMwNCIgOyB0aGVuIFwKKwlAaWYgdGVzdCAiJChjYWxsIGNjLXZlcnNpb24pIiA9ICIwMzA0IiA7IHRoZW4gXAogCQlpZiAhIC9iaW4vZWNobyBtZnRiIDUgfCAkKEFTKSAtdiAtbXBwYyAtbWFueSAtbyAkKFRPVVQpID4vZGV2L251bGwgMj4mMSA7IHRoZW4gXAogCQkJZWNobyAtbiAnKioqICR7VkVSU0lPTn0uJHtQQVRDSExFVkVMfSBrZXJuZWxzIG5vIGxvbmdlciBidWlsZCAnOyBcCiAJCQllY2hvICdjb3JyZWN0bHkgd2l0aCBnY2MtMy40IGFuZCB5b3VyIHZlcnNpb24gb2YgYmludXRpbHMuJzsgXApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvYW1pZ2EvYW1paW50cy5jIGIvYXJjaC9wcGMvYW1pZ2EvYW1paW50cy5jCmluZGV4IDkxMTk1ZTIuLjVmMzVjZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2FtaWdhL2FtaWludHMuYworKysgYi9hcmNoL3BwYy9hbWlnYS9hbWlpbnRzLmMKQEAgLTk2LDggKzk2LDggQEAKIAkJZ2F5bGUuaW50ZW4gPSBHQVlMRV9JUlFfSURFOwogCiAJLyogdHVybiBvZmYgYWxsIGludGVycnVwdHMuLi4gKi8KLQljdXN0b20uaW50ZW5hID0gMHg3ZmZmOwotCWN1c3RvbS5pbnRyZXEgPSAweDdmZmY7CisJYW1pZ2FfY3VzdG9tLmludGVuYSA9IDB4N2ZmZjsKKwlhbWlnYV9jdXN0b20uaW50cmVxID0gMHg3ZmZmOwogCiAjaWZkZWYgQ09ORklHX0FQVVMKIAkvKiBDbGVhciBhbnkgaW50ZXItQ1BVIGludGVycnVwdCByZXF1ZXN0cy4gQ2lyY3VtdmVudHMgYnVnIGluCkBAIC0xMTAsNyArMTEwLDcgQEAKIAlBUFVTX1dSSVRFKEFQVVNfSVBMX0VNVSwgSVBMRU1VX1NFVFJFU0VUIHwgSVBMRU1VX0lQTE1BU0spOwogI2VuZGlmCiAJLyogLi4uIGFuZCBlbmFibGUgdGhlIG1hc3RlciBpbnRlcnJ1cHQgYml0ICovCi0JY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IElGX0lOVEVOOworCWFtaWdhX2N1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBJRl9JTlRFTjsKIAogCWNpYV9pbml0X0lSUSgmY2lhYV9iYXNlKTsKIAljaWFfaW5pdF9JUlEoJmNpYWJfYmFzZSk7CkBAIC0xNTEsNyArMTUxLDcgQEAKIAl9CiAKIAkvKiBlbmFibGUgdGhlIGludGVycnVwdCAqLwotCWN1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBhbWlfaW50ZW5hX3ZhbHNbaXJxXTsKKwlhbWlnYV9jdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgYW1pX2ludGVuYV92YWxzW2lycV07CiB9CiAKIHZvaWQgYW1pZ2FfZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCX0KIAogCS8qIGRpc2FibGUgdGhlIGludGVycnVwdCAqLwotCWN1c3RvbS5pbnRlbmEgPSBhbWlfaW50ZW5hX3ZhbHNbaXJxXTsKKwlhbWlnYV9jdXN0b20uaW50ZW5hID0gYW1pX2ludGVuYV92YWxzW2lycV07CiB9CiAKIGlubGluZSB2b2lkIGFtaWdhX2RvX2lycShpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqZnApCkBAIC0xOTYsNyArMTk2LDcgQEAKIAogCWtzdGF0X2NwdSgwKS5pcnFzW2lycV0rKzsKIAotCWN1c3RvbS5pbnRyZXEgPSBhbWlfaW50ZW5hX3ZhbHNbaXJxXTsKKwlhbWlnYV9jdXN0b20uaW50cmVxID0gYW1pX2ludGVuYV92YWxzW2lycV07CiAKIAlmb3IgKGFjdGlvbiA9IGRlc2MtPmFjdGlvbjsgYWN0aW9uOyBhY3Rpb24gPSBhY3Rpb24tPm5leHQpCiAJCWFjdGlvbi0+aGFuZGxlcihpcnEsIGFjdGlvbi0+ZGV2X2lkLCBmcCk7CkBAIC0yMDgsNDAgKzIwOCw0MCBAQAogCiBzdGF0aWMgdm9pZCBhbWlfaW50MShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKIHsKLQl1bnNpZ25lZCBzaG9ydCBpbnRzID0gY3VzdG9tLmludHJlcXIgJiBjdXN0b20uaW50ZW5hcjsKKwl1bnNpZ25lZCBzaG9ydCBpbnRzID0gYW1pZ2FfY3VzdG9tLmludHJlcXIgJiBhbWlnYV9jdXN0b20uaW50ZW5hcjsKIAogCS8qIGlmIHNlcmlhbCB0cmFuc21pdCBidWZmZXIgZW1wdHksIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfVEJFKSB7Ci0JCWN1c3RvbS5pbnRyZXEgPSBJRl9UQkU7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9UQkU7CiAJCWFtaWdhX2RvX2lycShJUlFfQU1JR0FfVEJFLCBmcCk7CiAJfQogCiAJLyogaWYgZmxvcHB5IGRpc2sgdHJhbnNmZXIgY29tcGxldGUsIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfRFNLQkxLKSB7Ci0JCWN1c3RvbS5pbnRyZXEgPSBJRl9EU0tCTEs7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9EU0tCTEs7CiAJCWFtaWdhX2RvX2lycShJUlFfQU1JR0FfRFNLQkxLLCBmcCk7CiAJfQogCiAJLyogaWYgc29mdHdhcmUgaW50ZXJydXB0IHNldCwgaW50ZXJydXB0ICovCiAJaWYgKGludHMgJiBJRl9TT0ZUKSB7Ci0JCWN1c3RvbS5pbnRyZXEgPSBJRl9TT0ZUOworCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfU09GVDsKIAkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9TT0ZULCBmcCk7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBhbWlfaW50MyhpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKIHsKLQl1bnNpZ25lZCBzaG9ydCBpbnRzID0gY3VzdG9tLmludHJlcXIgJiBjdXN0b20uaW50ZW5hcjsKKwl1bnNpZ25lZCBzaG9ydCBpbnRzID0gYW1pZ2FfY3VzdG9tLmludHJlcXIgJiBhbWlnYV9jdXN0b20uaW50ZW5hcjsKIAogCS8qIGlmIGEgYmxpdHRlciBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX0JMSVQpIHsKLQkJY3VzdG9tLmludHJlcSA9IElGX0JMSVQ7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9CTElUOwogCQlhbWlnYV9kb19pcnEoSVJRX0FNSUdBX0JMSVQsIGZwKTsKIAl9CiAKIAkvKiBpZiBhIGNvcHBlciBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX0NPUEVSKSB7Ci0JCWN1c3RvbS5pbnRyZXEgPSBJRl9DT1BFUjsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0NPUEVSOwogCQlhbWlnYV9kb19pcnEoSVJRX0FNSUdBX0NPUFBFUiwgZnApOwogCX0KIApAQCAtMjUyLDM2ICsyNTIsMzYgQEAKIAogc3RhdGljIHZvaWQgYW1pX2ludDQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCiB7Ci0JdW5zaWduZWQgc2hvcnQgaW50cyA9IGN1c3RvbS5pbnRyZXFyICYgY3VzdG9tLmludGVuYXI7CisJdW5zaWduZWQgc2hvcnQgaW50cyA9IGFtaWdhX2N1c3RvbS5pbnRyZXFyICYgYW1pZ2FfY3VzdG9tLmludGVuYXI7CiAKIAkvKiBpZiBhdWRpbyAwIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfQVVEMCkgewotCQljdXN0b20uaW50cmVxID0gSUZfQVVEMDsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0FVRDA7CiAJCWFtaWdhX2RvX2lycShJUlFfQU1JR0FfQVVEMCwgZnApOwogCX0KIAogCS8qIGlmIGF1ZGlvIDEgaW50ZXJydXB0ICovCiAJaWYgKGludHMgJiBJRl9BVUQxKSB7Ci0JCWN1c3RvbS5pbnRyZXEgPSBJRl9BVUQxOworCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQVVEMTsKIAkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9BVUQxLCBmcCk7CiAJfQogCiAJLyogaWYgYXVkaW8gMiBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX0FVRDIpIHsKLQkJY3VzdG9tLmludHJlcSA9IElGX0FVRDI7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9BVUQyOwogCQlhbWlnYV9kb19pcnEoSVJRX0FNSUdBX0FVRDIsIGZwKTsKIAl9CiAKIAkvKiBpZiBhdWRpbyAzIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfQVVEMykgewotCQljdXN0b20uaW50cmVxID0gSUZfQVVEMzsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0FVRDM7CiAJCWFtaWdhX2RvX2lycShJUlFfQU1JR0FfQVVEMywgZnApOwogCX0KIH0KIAogc3RhdGljIHZvaWQgYW1pX2ludDUoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCiB7Ci0JdW5zaWduZWQgc2hvcnQgaW50cyA9IGN1c3RvbS5pbnRyZXFyICYgY3VzdG9tLmludGVuYXI7CisJdW5zaWduZWQgc2hvcnQgaW50cyA9IGFtaWdhX2N1c3RvbS5pbnRyZXFyICYgYW1pZ2FfY3VzdG9tLmludGVuYXI7CiAKIAkvKiBpZiBzZXJpYWwgcmVjZWl2ZSBidWZmZXIgZnVsbCBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX1JCRikgewpAQCAtMjkxLDcgKzI5MSw3IEBACiAKIAkvKiBpZiBhIGRpc2sgc3luYyBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX0RTS1NZTikgewotCQljdXN0b20uaW50cmVxID0gSUZfRFNLU1lOOworCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfRFNLU1lOOwogCQlhbWlnYV9kb19pcnEoSVJRX0FNSUdBX0RTS1NZTiwgZnApOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2FtaWdhL2NpYS5jIGIvYXJjaC9wcGMvYW1pZ2EvY2lhLmMKaW5kZXggYWQ5NjE0Ni4uNDQzMWM1OCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvYW1pZ2EvY2lhLmMKKysrIGIvYXJjaC9wcGMvYW1pZ2EvY2lhLmMKQEAgLTY2LDcgKzY2LDcgQEAKIAllbHNlCiAJCWJhc2UtPmljcl9kYXRhICY9IH5tYXNrOwogCWlmIChiYXNlLT5pY3JfZGF0YSAmIGJhc2UtPmljcl9tYXNrKQotCQljdXN0b20uaW50cmVxID0gSUZfU0VUQ0xSIHwgYmFzZS0+aW50X21hc2s7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9TRVRDTFIgfCBiYXNlLT5pbnRfbWFzazsKIAlyZXR1cm4gb2xkICYgYmFzZS0+aWNyX21hc2s7CiB9CiAKQEAgLTExNCw3ICsxMTQsNyBAQAogCWJhc2UtPmljcl9tYXNrICY9IENJQV9JQ1JfQUxMOwogCiAJaWYgKGJhc2UtPmljcl9kYXRhICYgYmFzZS0+aWNyX21hc2spCi0JCWN1c3RvbS5pbnRyZXEgPSBJRl9TRVRDTFIgfCBiYXNlLT5pbnRfbWFzazsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX1NFVENMUiB8IGJhc2UtPmludF9tYXNrOwogCXJldHVybiBvbGQ7CiB9CiAKQEAgLTE0NSw3ICsxNDUsNyBAQAogCWlycSA9IGJhc2UtPmNpYV9pcnE7CiAJZGVzYyA9IGlycV9kZXNjICsgaXJxOwogCWludHMgPSBjaWFfc2V0X2lycV9wcml2YXRlKGJhc2UsIENJQV9JQ1JfQUxMKTsKLQljdXN0b20uaW50cmVxID0gYmFzZS0+aW50X21hc2s7CisJYW1pZ2FfY3VzdG9tLmludHJlcSA9IGJhc2UtPmludF9tYXNrOwogCWZvciAoaSA9IDA7IGkgPCBDSUFfSVJRUzsgaSsrLCBpcnErKykgewogCQlpZiAoaW50cyAmIDEpIHsKIAkJCWtzdGF0X2NwdSgwKS5pcnFzW2lycV0rKzsKQEAgLTE3NCw1ICsxNzQsNSBAQAogCWFjdGlvbi0+bmFtZSA9IGJhc2UtPm5hbWU7CiAJc2V0dXBfaXJxKGJhc2UtPmhhbmRsZXJfaXJxLCAmYW1pZ2Ffc3lzX2lycWFjdGlvbltiYXNlLT5oYW5kbGVyX2lycS1JUlFfQU1JR0FfQVVUT10pOwogCi0JY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IGJhc2UtPmludF9tYXNrOworCWFtaWdhX2N1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBiYXNlLT5pbnRfbWFzazsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2FtaWdhL2NvbmZpZy5jIGIvYXJjaC9wcGMvYW1pZ2EvY29uZmlnLmMKaW5kZXggYWY4ODFkNy4uNjBlMmRhMSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvYW1pZ2EvY29uZmlnLmMKKysrIGIvYXJjaC9wcGMvYW1pZ2EvY29uZmlnLmMKQEAgLTkwLDkgKzkwLDYgQEAKIHN0YXRpYyB2b2lkIGEyMDAwX2dldHRvZCAoaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKik7CiBzdGF0aWMgaW50IGFtaWdhX2h3Y2xrIChpbnQsIHN0cnVjdCBod2Nsa190aW1lICopOwogc3RhdGljIGludCBhbWlnYV9zZXRfY2xvY2tfbW1zcyAodW5zaWduZWQgbG9uZyk7Ci0jaWZkZWYgQ09ORklHX0FNSUdBX0ZMT1BQWQotZXh0ZXJuIHZvaWQgYW1pZ2FfZmxvcHB5X3NldHVwKGNoYXIgKiwgaW50ICopOwotI2VuZGlmCiBzdGF0aWMgdm9pZCBhbWlnYV9yZXNldCAodm9pZCk7CiBleHRlcm4gdm9pZCBhbWlnYV9pbml0X3NvdW5kKHZvaWQpOwogc3RhdGljIHZvaWQgYW1pZ2Ffc2F2ZWttc2dfaW5pdCh2b2lkKTsKQEAgLTI4MSw3ICsyNzgsNyBAQAogICAgIGNhc2UgQ1NfT0NTOgogICAgIGNhc2UgQ1NfRUNTOgogICAgIGNhc2UgQ1NfQUdBOgotICAgICAgc3dpdGNoIChjdXN0b20uZGVuaXNlaWQgJiAweGYpIHsKKyAgICAgIHN3aXRjaCAoYW1pZ2FfY3VzdG9tLmRlbmlzZWlkICYgMHhmKSB7CiAgICAgICBjYXNlIDB4MGM6CiAJQU1JR0FIV19TRVQoREVOSVNFX0hSKTsKIAlicmVhazsKQEAgLTI5NCw3ICsyOTEsNyBAQAogICAgICAgQU1JR0FIV19TRVQoREVOSVNFKTsKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBzd2l0Y2ggKChjdXN0b20udnBvc3I+PjgpICYgMHg3ZikgeworICAgIHN3aXRjaCAoKGFtaWdhX2N1c3RvbS52cG9zcj4+OCkgJiAweDdmKSB7CiAgICAgY2FzZSAweDAwOgogICAgICAgQU1JR0FIV19TRVQoQUdOVVNfUEFMKTsKICAgICAgIGJyZWFrOwpAQCAtNDE5LDkgKzQxNiw2IEBACiAKICAgbWFjaF9od2NsayAgICAgICAgICAgPSBhbWlnYV9od2NsazsKICAgbWFjaF9zZXRfY2xvY2tfbW1zcyAgPSBhbWlnYV9zZXRfY2xvY2tfbW1zczsKLSNpZmRlZiBDT05GSUdfQU1JR0FfRkxPUFBZCi0gIG1hY2hfZmxvcHB5X3NldHVwICAgID0gYW1pZ2FfZmxvcHB5X3NldHVwOwotI2VuZGlmCiAgIG1hY2hfcmVzZXQgICAgICAgICAgID0gYW1pZ2FfcmVzZXQ7CiAjaWZkZWYgQ09ORklHX0hFQVJUQkVBVAogICBtYWNoX2hlYXJ0YmVhdCA9IGFtaWdhX2hlYXJ0YmVhdDsKQEAgLTQzMiw5ICs0MjYsOSBAQAogICBhbWlnYV9jb2xvcmNsb2NrID0gNSphbWlnYV9lY2xvY2s7CS8qIDMuNSBNSHogKi8KIAogICAvKiBjbGVhciBhbGwgRE1BIGJpdHMgKi8KLSAgY3VzdG9tLmRtYWNvbiA9IERNQUZfQUxMOworICBhbWlnYV9jdXN0b20uZG1hY29uID0gRE1BRl9BTEw7CiAgIC8qIGVuc3VyZSB0aGF0IHRoZSBETUEgbWFzdGVyIGJpdCBpcyBzZXQgKi8KLSAgY3VzdG9tLmRtYWNvbiA9IERNQUZfU0VUQ0xSIHwgRE1BRl9NQVNURVI7CisgIGFtaWdhX2N1c3RvbS5kbWFjb24gPSBETUFGX1NFVENMUiB8IERNQUZfTUFTVEVSOwogCiAgIC8qIHJlcXVlc3QgYWxsIFJBTSAqLwogICBmb3IgKGkgPSAwOyBpIDwgbTY4a19udW1fbWVtb3J5OyBpKyspIHsKQEAgLTc1Myw5ICs3NDcsOSBAQAogCiBzdGF0aWMgdm9pZCBhbWlnYV9zZXJpYWxfcHV0YyhjaGFyIGMpCiB7Ci0gICAgY3VzdG9tLnNlcmRhdCA9ICh1bnNpZ25lZCBjaGFyKWMgfCAweDEwMDsKKyAgICBhbWlnYV9jdXN0b20uc2VyZGF0ID0gKHVuc2lnbmVkIGNoYXIpYyB8IDB4MTAwOwogICAgIG1iKCk7Ci0gICAgd2hpbGUgKCEoY3VzdG9tLnNlcmRhdHIgJiAweDIwMDApKQorICAgIHdoaWxlICghKGFtaWdhX2N1c3RvbS5zZXJkYXRyICYgMHgyMDAwKSkKICAgICAgICA7CiB9CiAKQEAgLTc4NSwxMSArNzc5LDExIEBACiB7CiAgICAgaW50IGNoOwogCi0gICAgd2hpbGUgKCEoY3VzdG9tLmludHJlcXIgJiBJRl9SQkYpKQorICAgIHdoaWxlICghKGFtaWdhX2N1c3RvbS5pbnRyZXFyICYgSUZfUkJGKSkKIAliYXJyaWVyKCk7Ci0gICAgY2ggPSBjdXN0b20uc2VyZGF0ciAmIDB4ZmY7CisgICAgY2ggPSBhbWlnYV9jdXN0b20uc2VyZGF0ciAmIDB4ZmY7CiAgICAgLyogY2xlYXIgdGhlIGludGVycnVwdCwgc28gdGhhdCBhbm90aGVyIGNoYXJhY3RlciBjYW4gYmUgcmVhZCAqLwotICAgIGN1c3RvbS5pbnRyZXEgPSBJRl9SQkY7CisgICAgYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX1JCRjsKICAgICByZXR1cm4gY2g7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2Jvb3QvTWFrZWZpbGUgYi9hcmNoL3BwYy9ib290L01ha2VmaWxlCmluZGV4IDk5NWY4OWIuLmVmZDhjZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMvYm9vdC9NYWtlZmlsZQpAQCAtMTgsNyArMTgsNyBAQAogYm9vdGRpci15CQkJOj0gc2ltcGxlCiBib290ZGlyLSQoQ09ORklHX1BQQ19PRikJKz0gb3BlbmZpcm13YXJlCiBzdWJkaXIteQkJCTo9IGxpYiBjb21tb24gaW1hZ2VzCi1zdWJkaXItJChDT05GSUdfUFBDX09GKQkJKz0gb2YxMjc1CitzdWJkaXItJChDT05GSUdfUFBDX01VTFRJUExBVEZPUk0pCSs9IG9mMTI3NQogCiAjIGZvciBjbGVhbmluZwogc3ViZGlyLQkJCQkrPSBzaW1wbGUgb3BlbmZpcm13YXJlCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9ib290L2NvbW1vbi91dGlsLlMgYi9hcmNoL3BwYy9ib290L2NvbW1vbi91dGlsLlMKaW5kZXggYzk2YzlmOC4uMzY4ZWMwMyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvYm9vdC9jb21tb24vdXRpbC5TCisrKyBiL2FyY2gvcHBjL2Jvb3QvY29tbW9uL3V0aWwuUwpAQCAtMjM0LDcgKzIzNCw4IEBACiAgKiBGaXJzdCwgZmx1c2ggdGhlIGRhdGEgY2FjaGUgaW4gY2FzZSBpdCB3YXMgZW5hYmxlZCBhbmQgbWF5IGJlCiAgKiBob2xkaW5nIGluc3RydWN0aW9ucyBmb3IgY29weSBiYWNrLgogICovCi1fR0xPQkFMKGZsdXNoX2luc3RydWN0aW9uX2NhY2hlKQorICAgICAgICAuZ2xvYmwgZmx1c2hfaW5zdHJ1Y3Rpb25fY2FjaGUKK2ZsdXNoX2luc3RydWN0aW9uX2NhY2hlOiAgICAgICAgCiAJbWZscglyNgogCWJsCWZsdXNoX2RhdGFfY2FjaGUKIApAQCAtMjc5LDcgKzI4MCw4IEBACiAgKiBGbHVzaCBkYXRhIGNhY2hlCiAgKiBEbyB0aGlzIGJ5IGp1c3QgcmVhZGluZyBsb3RzIG9mIHN0dWZmIGludG8gdGhlIGNhY2hlLgogICovCi1fR0xPQkFMKGZsdXNoX2RhdGFfY2FjaGUpCisgICAgICAgIC5nbG9ibCBmbHVzaF9kYXRhX2NhY2hlCitmbHVzaF9kYXRhX2NhY2hlOiAgICAgICAKIAlsaXMJcjMsY2FjaGVfZmx1c2hfYnVmZmVyQGgKIAlvcmkJcjMscjMsY2FjaGVfZmx1c2hfYnVmZmVyQGwKIAlsaQlyNCxOVU1fQ0FDSEVfTElORVMKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2Jvb3QvaW1hZ2VzL01ha2VmaWxlIGIvYXJjaC9wcGMvYm9vdC9pbWFnZXMvTWFrZWZpbGUKaW5kZXggNTMyZTdlZi4uNTg0MTVkNSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvYm9vdC9pbWFnZXMvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMvYm9vdC9pbWFnZXMvTWFrZWZpbGUKQEAgLTI2LDcgKzI2LDcgQEAKIHRhcmdldHMgKz0gdUltYWdlCiAkKG9iaikvdUltYWdlOiAkKG9iaikvdm1saW51eC5negogCSQoUSlybSAtZiAkQAotCSQoY2FsbCBpZl9jaGFuZ2VkLHVpbWFnZSkKKwkkKGNhbGwgY21kLHVpbWFnZSkKIAlAZWNobyAtbiAnICBJbWFnZTogJEAgJwogCUBpZiBbIC1mICRAIF07IHRoZW4gZWNobyAnaXMgcmVhZHknIDsgZWxzZSBlY2hvICdub3QgbWFkZSc7IGZpCiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2Jvb3Qvb3BlbmZpcm13YXJlL01ha2VmaWxlIGIvYXJjaC9wcGMvYm9vdC9vcGVuZmlybXdhcmUvTWFrZWZpbGUKaW5kZXggODNhNjQzMy4uMmE0MTFlYyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvYm9vdC9vcGVuZmlybXdhcmUvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMvYm9vdC9vcGVuZmlybXdhcmUvTWFrZWZpbGUKQEAgLTIxLDI2ICsyMSwxNiBAQAogb2YxMjc1CTo9ICQoYm9vdCkvb2YxMjc1CiBpbWFnZXMJOj0gJChib290KS9pbWFnZXMKIAotT0JKQ09QWV9BUkdTCTo9IC1PIGFpeGNvZmYtcnM2MDAwIC1SIC5zdGFiIC1SIC5zdGFic3RyIC1SIC5jb21tZW50Ci1DT0ZGX0xEX0FSR1MJOj0gLVQgJChzcmN0cmVlKS8kKGJvb3QpL2xkLnNjcmlwdCAtZSBfc3RhcnQgLVR0ZXh0IDB4MDA1MDAwMDAgXAotCQkJLUJzdGF0aWMKIENIUlBfTERfQVJHUwk6PSAtVCAkKHNyY3RyZWUpLyQoYm9vdCkvbGQuc2NyaXB0IC1lIF9zdGFydCAtVHRleHQgMHgwMDgwMDAwMAotTkVXV09STERfTERfQVJHUzo9IC1UICQoc3JjdHJlZSkvJChib290KS9sZC5zY3JpcHQgLWUgX3N0YXJ0IC1UdGV4dCAweDAxMDAwMDAwCiAKIENPTU1PTk9CSlMJOj0gc3RhcnQubyBtaXNjLm8gY29tbW9uLm8KLUNPRkZPQkpTCTo9IGNvZmZjcnQwLm8gJChDT01NT05PQkpTKSBjb2ZmbWFpbi5vCiBDSFJQT0JKUwk6PSBjcnQwLm8gICAgICQoQ09NTU9OT0JKUykgY2hycG1haW4ubwotTkVXV09STERPQkpTCTo9IGNydDAubyAgICAgJChDT01NT05PQkpTKSBuZXd3b3JsZG1haW4ubwogCi10YXJnZXRzIAk6PSAkKENPRkZPQkpTKSAkKENIUlBPQkpTKSAkKE5FV1dPUkxET0JKUykgZHVtbXkubwotQ09GRk9CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLywgJChDT0ZGT0JKUykpCit0YXJnZXRzIAk6PSAkKENIUlBPQkpTKSBkdW1teS5vCiBDSFJQT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCAkKENIUlBPQkpTKSkKLU5FV1dPUkxET0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCAkKE5FV1dPUkxET0JKUykpCiAKIExJQlMJCTo9IGxpYi9saWIuYSAkKGJvb3RsaWIpL2xpYi5hICQob2YxMjc1KS9saWIuYSAkKGNvbW1vbikvbGliLmEKIAotSEFDS0NPRkYgOj0gJCh1dGlscykvaGFjay1jb2ZmCi0KIGlmZGVmIENPTkZJR19TTVAKIEVORCA6PSAuc21wCiBlbmRpZgpAQCAtNzIsNTYgKzYyLDExIEBACiAkKG9iaikvaW1hZ2UuaW5pdHJkLm86ICQob2JqKS9pbWFnZS5vICQoaW1hZ2VzKS9yYW1kaXNrLmltYWdlLmd6IEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsZ2VuaW1hZ2UtaW5pdHJkKQogCi0jIENyZWF0ZSB0aGUgbm90ZSBzZWN0aW9uIGZvciBOZXctV29ybGQgUG93ZXJNYWNzLgotcXVpZXRfY21kX21rbm90ZSA9IE1LTk9URSAgJEAKLSAgICAgY21kX21rbm90ZSAgPSAkKHV0aWxzKS9ta25vdGUgPiAkQAotdGFyZ2V0cwkJKz0gbm90ZQotJChvYmopL25vdGU6ICQodXRpbHMpL21rbm90ZSBGT1JDRQotCSQoY2FsbCBpZl9jaGFuZ2VkLG1rbm90ZSkKIAotCi0kKG9iaikvY29mZmNydDAubzogRVhUUkFfQUZMQUdTIDo9IC1EWENPRkYKLXRhcmdldHMgKz0gY29mZmNydDAubyBjcnQwLm8KLSQob2JqKS9jb2ZmY3J0MC5vICQob2JqKS9jcnQwLm86ICQoY29tbW9uKS9jcnQwLlMgRk9SQ0UKK3RhcmdldHMgKz0gY3J0MC5vCiskKG9iaikvY3J0MC5vOiAkKGNvbW1vbikvY3J0MC5TIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGFzX29fUykKIAotcXVpZXRfY21kX2dlbmNvZmZiID0gQ09GRiAgICAkQAotICAgICAgY21kX2dlbmNvZmZiID0gJChMRCkgLW8gJEAgJChDT0ZGX0xEX0FSR1MpICQoQ09GRk9CSlMpICQ8ICQoTElCUykgJiYgXAotICAgICAgICAgICAgICAgICAgICAgJChPQkpDT1BZKSAkQCAkQCAtUiAuY29tbWVudCAkKGRlbC1yYW1kaXNrLXNlYykKLXRhcmdldHMgKz0gY29mZmJvb3QKLSQob2JqKS9jb2ZmYm9vdDogJChvYmopL2ltYWdlLm8gJChDT0ZGT0JKUykgJChMSUJTKSAkKHNyY3RyZWUpLyQoYm9vdCkvbGQuc2NyaXB0IEZPUkNFCi0JJChjYWxsIGlmX2NoYW5nZWQsZ2VuY29mZmIpCi10YXJnZXRzICs9IGNvZmZib290LmluaXRyZAotJChvYmopL2NvZmZib290LmluaXRyZDogJChvYmopL2ltYWdlLmluaXRyZC5vICQoQ09GRk9CSlMpICQoTElCUykgXAotCQkJJChzcmN0cmVlKS8kKGJvb3QpL2xkLnNjcmlwdCBGT1JDRQotCSQoY2FsbCBpZl9jaGFuZ2VkLGdlbmNvZmZiKQotCi0KLXF1aWV0X2NtZF9nZW4tY29mZiA9IENPRkYgICAgJEAKLSAgICAgIGNtZF9nZW4tY29mZiA9ICQoT0JKQ09QWSkgJChPQkpDT1BZX0FSR1MpICQ8ICRAICYmIFwKLQkJCSQoSEFDS0NPRkYpICRAICYmIFwKLQkJCWxuIC1zZiAkKG5vdGRpciAkQCkgJChpbWFnZXMpL3pJbWFnZSQoaW5pdHJkKS5wbWFjCi0KLSQoaW1hZ2VzKS92bWxpbnV4LmNvZmY6ICQob2JqKS9jb2ZmYm9vdAotCSQoY2FsbCBjbWQsZ2VuLWNvZmYpCi0KLSQoaW1hZ2VzKS92bWxpbnV4LmluaXRyZC5jb2ZmOiAkKG9iaikvY29mZmJvb3QuaW5pdHJkCi0JJChjYWxsIGNtZCxnZW4tY29mZikKLQotcXVpZXRfY21kX2dlbi1lbGYtcG1hYyA9IEVMRiAgICAgJEAKLSAgICAgIGNtZF9nZW4tZWxmLXBtYWMgPSAkKExEKSAkKE5FV1dPUkxEX0xEX0FSR1MpIC1vICRAIFwKLQkJCQkkKE5FV1dPUkxET0JKUykgJChMSUJTKSAkPCAmJiBcCi0JCQkkKE9CSkNPUFkpICRAICRAIC0tYWRkLXNlY3Rpb249Lm5vdGU9JChvYmopL25vdGUgXAotCQkJCQkgLVIgLmNvbW1lbnQgJChkZWwtcmFtZGlzay1zZWMpCi0KLSQoaW1hZ2VzKS92bWxpbnV4LmVsZi1wbWFjOiAkKG9iaikvaW1hZ2UubyAkKE5FV1dPUkxET0JKUykgJChMSUJTKSBcCi0JCQkkKG9iaikvbm90ZSAkKHNyY3RyZWUpLyQoYm9vdCkvbGQuc2NyaXB0Ci0JJChjYWxsIGNtZCxnZW4tZWxmLXBtYWMpCi0kKGltYWdlcykvdm1saW51eC5pbml0cmQuZWxmLXBtYWM6ICQob2JqKS9pbWFnZS5pbml0cmQubyAkKE5FV1dPUkxET0JKUykgXAotCQkJCSAgICQoTElCUykgJChvYmopL25vdGUgXAotCQkJCSAgICQoc3JjdHJlZSkvJChib290KS9sZC5zY3JpcHQKLQkkKGNhbGwgY21kLGdlbi1lbGYtcG1hYykKLQogcXVpZXRfY21kX2dlbi1jaHJwID0gQ0hSUCAgICAkQAogICAgICAgY21kX2dlbi1jaHJwID0gJChMRCkgJChDSFJQX0xEX0FSR1MpIC1vICRAICQoQ0hSUE9CSlMpICQ8ICQoTElCUykgJiYgXAogCQkJJChPQkpDT1BZKSAkQCAkQCAtUiAuY29tbWVudCAkKGRlbC1yYW1kaXNrLXNlYykKQEAgLTEzOSw0NiArODQsMjMgQEAKIAklLXJzNms6ICUKIAkkKGNhbGwgY21kLGFkZG5vdGUpCiAKLXF1aWV0X2NtZF9nZW4tbWlib290ID0gR0VOICAgICAkQAotICAgICAgY21kX2dlbi1taWJvb3QgPSAkKE9CSkNPUFkpICQoT0JKQ09QWV9BUkdTKSBcCi0JCSAgICAgICAtLWFkZC1zZWN0aW9uPSQxPSQod29yZCAyLCAkXikgJDwgJEAKLSQoaW1hZ2VzKS9taWJvb3QuaW1hZ2U6ICQob2JqKS9kdW1teS5vICQoaW1hZ2VzKS92bWxpbnV4Lmd6Ci0JJChjYWxsIGNtZCxnZW4tbWlib290LGltYWdlKQotCi0kKGltYWdlcykvbWlib290LmluaXRyZC5pbWFnZTogJChpbWFnZXMpL21pYm9vdC5pbWFnZSAkKGltYWdlcykvcmFtZGlzay5pbWFnZS5negotCSQoY2FsbCBjbWQsZ2VuLW1pYm9vdCxpbml0cmQpCi0KICMgVGhlIHRhcmdldHMgdXNlZCBvbiB0aGUgbWFrZSBjb21tYW5kLWxpbmUKIAogLlBIT05ZOiB6SW1hZ2UgekltYWdlLmluaXRyZAotekltYWdlOgkJICQoaW1hZ2VzKS92bWxpbnV4LmNvZmYgCVwKLQkJICQoaW1hZ2VzKS92bWxpbnV4LmVsZi1wbWFjCVwKLQkJICQoaW1hZ2VzKS96SW1hZ2UuY2hycAkJXAotCQkgJChpbWFnZXMpL3pJbWFnZS5jaHJwLXJzNmsJXAotCQkgJChpbWFnZXMpL21pYm9vdC5pbWFnZQorekltYWdlOgkJICQoaW1hZ2VzKS96SW1hZ2UuY2hycAkJXAorCQkgJChpbWFnZXMpL3pJbWFnZS5jaHJwLXJzNmsKIAlAZWNobyAnICBrZXJuZWw6ICRAIGlzIHJlYWR5ICgkPCknCi16SW1hZ2UuaW5pdHJkOgkgJChpbWFnZXMpL3ZtbGludXguaW5pdHJkLmNvZmYgCQlcCi0JCSAkKGltYWdlcykvdm1saW51eC5pbml0cmQuZWxmLXBtYWMJXAotCQkgJChpbWFnZXMpL3pJbWFnZS5pbml0cmQuY2hycAkJXAotCQkgJChpbWFnZXMpL3pJbWFnZS5pbml0cmQuY2hycC1yczZrCVwKLQkJICQoaW1hZ2VzKS9taWJvb3QuaW5pdHJkLmltYWdlCit6SW1hZ2UuaW5pdHJkOgkgJChpbWFnZXMpL3pJbWFnZS5pbml0cmQuY2hycAkJXAorCQkgJChpbWFnZXMpL3pJbWFnZS5pbml0cmQuY2hycC1yczZrCiAJQGVjaG8gJyAga2VybmVsOiAkQCBpcyByZWFkeSAoJDwpJwogCiBURlRQSU1BR0UJOj0gL3RmdHBib290L3pJbWFnZQogCiAuUEhPTlk6IHpuZXRib290IHpuZXRib290LmluaXRyZAotem5ldGJvb3Q6CSQoaW1hZ2VzKS92bWxpbnV4LmNvZmYJCVwKLQkJJChpbWFnZXMpL3ZtbGludXguZWxmLXBtYWMJXAotCQkkKGltYWdlcykvekltYWdlLmNocnAKLQljcCAkKGltYWdlcykvdm1saW51eC5jb2ZmICAgICAkKFRGVFBJTUFHRSkucG1hYyQoRU5EKQotCWNwICQoaW1hZ2VzKS92bWxpbnV4LmVsZi1wbWFjICQoVEZUUElNQUdFKS5wbWFjJChFTkQpLmVsZgorem5ldGJvb3Q6CSQoaW1hZ2VzKS96SW1hZ2UuY2hycAogCWNwICQoaW1hZ2VzKS96SW1hZ2UuY2hycCAgICAgICQoVEZUUElNQUdFKS5jaHJwJChFTkQpCiAJQGVjaG8gJyAga2VybmVsOiAkQCBpcyByZWFkeSAoJDwpJwotem5ldGJvb3QuaW5pdHJkOiQoaW1hZ2VzKS92bWxpbnV4LmluaXRyZC5jb2ZmCQlcCi0JCSQoaW1hZ2VzKS92bWxpbnV4LmluaXRyZC5lbGYtcG1hYwlcCi0JCSQoaW1hZ2VzKS96SW1hZ2UuaW5pdHJkLmNocnAKLQljcCAkKGltYWdlcykvdm1saW51eC5pbml0cmQuY29mZiAgICAgJChURlRQSU1BR0UpLnBtYWMkKEVORCkKLQljcCAkKGltYWdlcykvdm1saW51eC5pbml0cmQuZWxmLXBtYWMgJChURlRQSU1BR0UpLnBtYWMkKEVORCkuZWxmCit6bmV0Ym9vdC5pbml0cmQ6JChpbWFnZXMpL3pJbWFnZS5pbml0cmQuY2hycAogCWNwICQoaW1hZ2VzKS96SW1hZ2UuaW5pdHJkLmNocnAgICAgICAkKFRGVFBJTUFHRSkuY2hycCQoRU5EKQogCUBlY2hvICcgIGtlcm5lbDogJEAgaXMgcmVhZHkgKCQ8KScKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvYm9vdC9vcGVuZmlybXdhcmUvY29mZm1haW4uYyBiL2FyY2gvcHBjL2Jvb3Qvb3BlbmZpcm13YXJlL2NvZmZtYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYTg4NTUuLjAwMDAwMDAKLS0tIGEvYXJjaC9wcGMvYm9vdC9vcGVuZmlybXdhcmUvY29mZm1haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBQYXVsIE1hY2tlcnJhcyAxOTk3LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLQotI2luY2x1ZGUgIm5vbnN0ZGlvLmgiCi0jaW5jbHVkZSAib2YxMjc1LmgiCi0KLS8qIFBhc3NlZCBmcm9tIHRoZSBsaW5rZXIgKi8KLWV4dGVybiBjaGFyIF9faW1hZ2VfYmVnaW4sIF9faW1hZ2VfZW5kOwotZXh0ZXJuIGNoYXIgX19yYW1kaXNrX2JlZ2luW10sIF9fcmFtZGlza19lbmQ7Ci1leHRlcm4gY2hhciBfc3RhcnQsIF9lbmQ7Ci0KLWV4dGVybiBjaGFyIGltYWdlX2RhdGFbXSwgaW5pdHJkX2RhdGFbXTsKLWV4dGVybiBpbnQgaW5pdHJkX2xlbiwgaW1hZ2VfbGVuOwotZXh0ZXJuIHVuc2lnbmVkIGludCBoZWFwX21heDsKLWV4dGVybiB2b2lkIGZsdXNoX2NhY2hlKHZvaWQgKnN0YXJ0LCB1bnNpZ25lZCBpbnQgbGVuKTsKLWV4dGVybiB2b2lkIGd1bnppcCh2b2lkICosIGludCwgdW5zaWduZWQgY2hhciAqLCBpbnQgKik7Ci1leHRlcm4gdm9pZCBtYWtlX2JpX3JlY3ModW5zaWduZWQgbG9uZyBhZGRyLCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgbWFjaCwKLQkJdW5zaWduZWQgaW50IHByb2dlbmQpOwotZXh0ZXJuIHZvaWQgc2V0dXBfYmF0cyh1bnNpZ25lZCBsb25nIHN0YXJ0KTsKLQotY2hhciAqYXZhaWxfcmFtOwotY2hhciAqYmVnaW5fYXZhaWwsICplbmRfYXZhaWw7Ci1jaGFyICphdmFpbF9oaWdoOwotCi0jZGVmaW5lIFNDUkFUQ0hfU0laRQkoMTI4IDw8IDEwKQotCi1zdGF0aWMgY2hhciBoZWFwW1NDUkFUQ0hfU0laRV07Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHJhbV9zdGFydCA9IDA7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyByYW1fZW5kID0gMHgxMDAwMDAwOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBwcm9nX3N0YXJ0ID0gMHg4MDAwMDA7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBwcm9nX3NpemUgPSAweDcwMDAwMDsKLQotdHlwZWRlZiB2b2lkICgqa2VybmVsX3N0YXJ0X3QpKGludCwgaW50LCB2b2lkICopOwotCi12b2lkIGJvb3QoaW50IGExLCBpbnQgYTIsIHZvaWQgKnByb20pCi17Ci0gICAgdW5zaWduZWQgc2EsIGxlbjsKLSAgICB2b2lkICpkc3Q7Ci0gICAgdW5zaWduZWQgY2hhciAqaW07Ci0gICAgdW5zaWduZWQgaW5pdHJkX3N0YXJ0LCBpbml0cmRfc2l6ZTsKLQotICAgIHByaW50ZigiY29mZmJvb3Qgc3RhcnRpbmc6IGxvYWRlZCBhdCAweCVwXG4iLCAmX3N0YXJ0KTsKLSAgICBzZXR1cF9iYXRzKHJhbV9zdGFydCk7Ci0KLSAgICBpbml0cmRfc2l6ZSA9IChjaGFyICopKCZfX3JhbWRpc2tfZW5kKSAtIChjaGFyICopKCZfX3JhbWRpc2tfYmVnaW4pOwotICAgIGlmIChpbml0cmRfc2l6ZSkgewotCWluaXRyZF9zdGFydCA9IChyYW1fZW5kIC0gaW5pdHJkX3NpemUpICYgfjB4RkZGOwotCWExID0gaW5pdHJkX3N0YXJ0OwotCWEyID0gaW5pdHJkX3NpemU7Ci0JY2xhaW0oaW5pdHJkX3N0YXJ0LCByYW1fZW5kIC0gaW5pdHJkX3N0YXJ0LCAwKTsKLQlwcmludGYoImluaXRpYWwgcmFtZGlzayBtb3ZpbmcgMHgleCA8LSAweCVwICgleCBieXRlcylcblxyIiwKLQkgICAgICAgaW5pdHJkX3N0YXJ0LCAoY2hhciAqKSgmX19yYW1kaXNrX2JlZ2luKSwgaW5pdHJkX3NpemUpOwotCW1lbWNweSgoY2hhciAqKWluaXRyZF9zdGFydCwgKGNoYXIgKikoJl9fcmFtZGlza19iZWdpbiksIGluaXRyZF9zaXplKTsKLQlwcm9nX3NpemUgPSBpbml0cmRfc3RhcnQgLSBwcm9nX3N0YXJ0OwotICAgIH0gZWxzZQotCWEyID0gMHhkZWFkYmVlZjsKLQotICAgIGltID0gKGNoYXIgKikoJl9faW1hZ2VfYmVnaW4pOwotICAgIGxlbiA9IChjaGFyICopKCZfX2ltYWdlX2VuZCkgLSAoY2hhciAqKSgmX19pbWFnZV9iZWdpbik7Ci0gICAgLyogY2xhaW0gNE1CIHN0YXJ0aW5nIGF0IFBST0dfU1RBUlQgKi8KLSAgICBjbGFpbShwcm9nX3N0YXJ0LCBwcm9nX3NpemUsIDApOwotICAgIG1hcChwcm9nX3N0YXJ0LCBwcm9nX3N0YXJ0LCBwcm9nX3NpemUpOwotICAgIGRzdCA9ICh2b2lkICopIHByb2dfc3RhcnQ7Ci0gICAgaWYgKGltWzBdID09IDB4MWYgJiYgaW1bMV0gPT0gMHg4YikgewotCS8qIHNldCB1cCBzY3JhdGNoIHNwYWNlICovCi0JYmVnaW5fYXZhaWwgPSBhdmFpbF9oaWdoID0gYXZhaWxfcmFtID0gaGVhcDsKLQllbmRfYXZhaWwgPSBoZWFwICsgc2l6ZW9mKGhlYXApOwotCXByaW50ZigiaGVhcCBhdCAweCVwXG4iLCBhdmFpbF9yYW0pOwotCXByaW50ZigiZ3VuemlwcGluZyAoMHglcCA8LSAweCVwOjB4JXApLi4uIiwgZHN0LCBpbSwgaW0rbGVuKTsKLQlndW56aXAoZHN0LCBwcm9nX3NpemUsIGltLCAmbGVuKTsKLQlwcmludGYoImRvbmUgJXUgYnl0ZXNcbiIsIGxlbik7Ci0JcHJpbnRmKCIldSBieXRlcyBvZiBoZWFwIGNvbnN1bWVkLCBtYXggaW4gdXNlICV1XG4iLAotCSAgICAgICBhdmFpbF9oaWdoIC0gYmVnaW5fYXZhaWwsIGhlYXBfbWF4KTsKLSAgICB9IGVsc2UgewotCW1lbW1vdmUoZHN0LCBpbSwgbGVuKTsKLSAgICB9Ci0KLSAgICBmbHVzaF9jYWNoZShkc3QsIGxlbik7Ci0gICAgbWFrZV9iaV9yZWNzKCgodW5zaWduZWQgbG9uZykgZHN0ICsgbGVuKSwgImNvZmZib290IiwgX01BQ0hfUG1hYywKLQkJICAgIChwcm9nX3N0YXJ0ICsgcHJvZ19zaXplKSk7Ci0KLSAgICBzYSA9ICh1bnNpZ25lZCBsb25nKXByb2dfc3RhcnQ7Ci0gICAgcHJpbnRmKCJzdGFydCBhZGRyZXNzID0gMHgleFxuIiwgc2EpOwotCi0gICAgKCooa2VybmVsX3N0YXJ0X3Qpc2EpKGExLCBhMiwgcHJvbSk7Ci0KLSAgICBwcmludGYoInJldHVybmVkP1xuIik7Ci0KLSAgICBwYXVzZSgpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvYm9vdC9vcGVuZmlybXdhcmUvbmV3d29ybGRtYWluLmMgYi9hcmNoL3BwYy9ib290L29wZW5maXJtd2FyZS9uZXd3b3JsZG1haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE4YThmOS4uMDAwMDAwMAotLS0gYS9hcmNoL3BwYy9ib290L29wZW5maXJtd2FyZS9uZXd3b3JsZG1haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFBhdWwgTWFja2VycmFzIDE5OTcuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgIm5vbnN0ZGlvLmgiCi0jaW5jbHVkZSAib2YxMjc1LmgiCi0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0KLS8qIFBhc3NlZCBmcm9tIHRoZSBsaW5rZXIgKi8KLWV4dGVybiBjaGFyIF9faW1hZ2VfYmVnaW4sIF9faW1hZ2VfZW5kOwotZXh0ZXJuIGNoYXIgX19yYW1kaXNrX2JlZ2luW10sIF9fcmFtZGlza19lbmQ7Ci1leHRlcm4gY2hhciBfc3RhcnQsIF9lbmQ7Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgaGVhcF9tYXg7Ci1leHRlcm4gdm9pZCBmbHVzaF9jYWNoZSh2b2lkICpzdGFydCwgdW5zaWduZWQgaW50IGxlbik7Ci1leHRlcm4gdm9pZCBndW56aXAodm9pZCAqLCBpbnQsIHVuc2lnbmVkIGNoYXIgKiwgaW50ICopOwotZXh0ZXJuIHZvaWQgbWFrZV9iaV9yZWNzKHVuc2lnbmVkIGxvbmcgYWRkciwgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IG1hY2gsCi0JCXVuc2lnbmVkIGludCBwcm9nZW5kKTsKLQotY2hhciAqYXZhaWxfcmFtOwotY2hhciAqYmVnaW5fYXZhaWwsICplbmRfYXZhaWw7Ci1jaGFyICphdmFpbF9oaWdoOwotCi0KLSNkZWZpbmUgUkFNX0VORAkJKDE2IDw8IDIwKQotCi0jZGVmaW5lIFBST0dfU1RBUlQJMHgwMDAxMDAwMAotI2RlZmluZSBQUk9HX1NJWkUJMHgwMDdmMDAwMAotCi0jZGVmaW5lIFNDUkFUQ0hfU0laRQkoMTI4IDw8IDEwKQotCi10eXBlZGVmIHZvaWQgKCprZXJuZWxfc3RhcnRfdCkoaW50LCBpbnQsIHZvaWQgKik7Ci0KLXZvaWQgYm9vdChpbnQgYTEsIGludCBhMiwgdm9pZCAqcHJvbSkKLXsKLSAgICB1bnNpZ25lZCBzYSwgbGVuOwotICAgIHZvaWQgKmRzdDsKLSAgICB1bnNpZ25lZCBjaGFyICppbTsKLSAgICB1bnNpZ25lZCBpbml0cmRfc3RhcnQsIGluaXRyZF9zaXplOwotCi0gICAgcHJpbnRmKCJjaHJwYm9vdCBzdGFydGluZzogbG9hZGVkIGF0IDB4JXBcbiIsICZfc3RhcnQpOwotCi0gICAgaW5pdHJkX3NpemUgPSAoY2hhciAqKSgmX19yYW1kaXNrX2VuZCkgLSAoY2hhciAqKSgmX19yYW1kaXNrX2JlZ2luKTsKLSAgICBpZiAoaW5pdHJkX3NpemUpIHsKLQlpbml0cmRfc3RhcnQgPSAoUkFNX0VORCAtIGluaXRyZF9zaXplKSAmIH4weEZGRjsKLQlhMSA9IGluaXRyZF9zdGFydDsKLQlhMiA9IGluaXRyZF9zaXplOwotCWNsYWltKGluaXRyZF9zdGFydCwgUkFNX0VORCAtIGluaXRyZF9zdGFydCwgMCk7Ci0JcHJpbnRmKCJpbml0aWFsIHJhbWRpc2sgbW92aW5nIDB4JXggPC0gMHglcCAoJXggYnl0ZXMpXG5cciIsCi0JICAgICAgIGluaXRyZF9zdGFydCwgKGNoYXIgKikoJl9fcmFtZGlza19iZWdpbiksIGluaXRyZF9zaXplKTsKLQltZW1jcHkoKGNoYXIgKilpbml0cmRfc3RhcnQsIChjaGFyICopKCZfX3JhbWRpc2tfYmVnaW4pLCBpbml0cmRfc2l6ZSk7Ci0gICAgfSBlbHNlCi0JYTIgPSAweGRlYWRiZWVmOwotCi0gICAgaW0gPSAoY2hhciAqKSgmX19pbWFnZV9iZWdpbik7Ci0gICAgbGVuID0gKGNoYXIgKikoJl9faW1hZ2VfZW5kKSAtIChjaGFyICopKCZfX2ltYWdlX2JlZ2luKTsKLSAgICAvKiBjbGFpbSAzTUIgc3RhcnRpbmcgYXQgUFJPR19TVEFSVCAqLwotICAgIGNsYWltKFBST0dfU1RBUlQsIFBST0dfU0laRSwgMCk7Ci0gICAgZHN0ID0gKHZvaWQgKikgUFJPR19TVEFSVDsKLSAgICBpZiAoaW1bMF0gPT0gMHgxZiAmJiBpbVsxXSA9PSAweDhiKSB7Ci0JLyogY2xhaW0gc29tZSBtZW1vcnkgZm9yIHNjcmF0Y2ggc3BhY2UgKi8KLQlhdmFpbF9yYW0gPSAoY2hhciAqKSBjbGFpbSgwLCBTQ1JBVENIX1NJWkUsIDB4MTApOwotCWJlZ2luX2F2YWlsID0gYXZhaWxfaGlnaCA9IGF2YWlsX3JhbTsKLQllbmRfYXZhaWwgPSBhdmFpbF9yYW0gKyBTQ1JBVENIX1NJWkU7Ci0JcHJpbnRmKCJoZWFwIGF0IDB4JXBcbiIsIGF2YWlsX3JhbSk7Ci0JcHJpbnRmKCJndW56aXBwaW5nICgweCVwIDwtIDB4JXA6MHglcCkuLi4iLCBkc3QsIGltLCBpbStsZW4pOwotCWd1bnppcChkc3QsIFBST0dfU0laRSwgaW0sICZsZW4pOwotCXByaW50ZigiZG9uZSAldSBieXRlc1xuIiwgbGVuKTsKLQlwcmludGYoIiV1IGJ5dGVzIG9mIGhlYXAgY29uc3VtZWQsIG1heCBpbiB1c2UgJXVcbiIsCi0JICAgICAgIGF2YWlsX2hpZ2ggLSBiZWdpbl9hdmFpbCwgaGVhcF9tYXgpOwotCXJlbGVhc2UoYmVnaW5fYXZhaWwsIFNDUkFUQ0hfU0laRSk7Ci0gICAgfSBlbHNlIHsKLQltZW1tb3ZlKGRzdCwgaW0sIGxlbik7Ci0gICAgfQotCi0gICAgZmx1c2hfY2FjaGUoZHN0LCBsZW4pOwotICAgIG1ha2VfYmlfcmVjcygoKHVuc2lnbmVkIGxvbmcpIGRzdCArIGxlbiksICJjaHJwYm9vdCIsIF9NQUNIX1BtYWMsCi0JCSAgICAoUFJPR19TVEFSVCArIFBST0dfU0laRSkpOwotCi0gICAgc2EgPSAodW5zaWduZWQgbG9uZylQUk9HX1NUQVJUOwotICAgIHByaW50Zigic3RhcnQgYWRkcmVzcyA9IDB4JXhcbiIsIHNhKTsKLQotICAgICgqKGtlcm5lbF9zdGFydF90KXNhKShhMSwgYTIsIHByb20pOwotCi0gICAgcHJpbnRmKCJyZXR1cm5lZD9cbiIpOwotCi0gICAgcGF1c2UoKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2NvbmZpZ3MvVFFNODU0MF9kZWZjb25maWcgYi9hcmNoL3BwYy9jb25maWdzL1RRTTg1NDBfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YmYzYjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3BwYy9jb25maWdzL1RRTTg1NDBfZGVmY29uZmlnCkBAIC0wLDAgKzEsOTczIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTUtcmMyCisjIEZyaSBOb3YgMjUgMTc6MjY6NTAgMjAwNQorIworQ09ORklHX01NVT15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19QUEM9eQorQ09ORklHX1BQQzMyPXkKK0NPTkZJR19HRU5FUklDX05WUkFNPXkKK0NPTkZJR19TQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0FSQ0hfTUFZX0hBVkVfUENfRkRDPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCitDT05GSUdfRU1CRURERUQ9eQorIyBDT05GSUdfS0FMTFNZTVMgaXMgbm90IHNldAorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKKyMgQ09ORklHX0VQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworIyBDT05GSUdfTU9EVUxFUyBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbGF5ZXIKKyMKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorQ09ORklHX0RFRkFVTFRfQVM9eQorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorCisjCisjIFByb2Nlc3NvcgorIworIyBDT05GSUdfNnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQweCBpcyBub3Qgc2V0CisjIENPTkZJR180NHggaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSNCBpcyBub3Qgc2V0CisjIENPTkZJR184eHggaXMgbm90IHNldAorIyBDT05GSUdfRTIwMCBpcyBub3Qgc2V0CitDT05GSUdfRTUwMD15CitDT05GSUdfQk9PS0U9eQorQ09ORklHX0ZTTF9CT09LRT15CisjIENPTkZJR19QSFlTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19TUEU9eQorQ09ORklHX01BVEhfRU1VTEFUSU9OPXkKKyMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTlRfRUFSTFlfU0VSSUFMIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfR0VONTUwPXkKK0NPTkZJR184NXh4PXkKK0NPTkZJR19QUENfSU5ESVJFQ1RfUENJX0JFPXkKKworIworIyBGcmVlc2NhbGUgODV4eCBvcHRpb25zCisjCisjIENPTkZJR19NUEM4NTQwX0FEUyBpcyBub3Qgc2V0CisjIENPTkZJR19NUEM4NTQ4X0NEUyBpcyBub3Qgc2V0CisjIENPTkZJR19NUEM4NTU1X0NEUyBpcyBub3Qgc2V0CisjIENPTkZJR19NUEM4NTYwX0FEUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQkM4NTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUWF9HUDMgaXMgbm90IHNldAorQ09ORklHX1RRTTg1NDA9eQorIyBDT05GSUdfVFFNODU0MSBpcyBub3Qgc2V0CisjIENPTkZJR19UUU04NTU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RRTTg1NjAgaXMgbm90IHNldAorQ09ORklHX01QQzg1NDA9eQorCisjCisjIFBsYXRmb3JtIG9wdGlvbnMKKyMKKyMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldAorIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MjUwCitDT05GSUdfUFJFRU1QVF9OT05FPXkKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQgaXMgbm90IHNldAorQ09ORklHX1NFQ0NPTVA9eQorQ09ORklHX0lTQV9ETUFfQVBJPXkKKworIworIyBCdXMgb3B0aW9ucworIworQ09ORklHX1BQQ19JODI1OT15CitDT05GSUdfUFBDX0lORElSRUNUX1BDST15CitDT05GSUdfUENJPXkKK0NPTkZJR19QQ0lfRE9NQUlOUz15CisjIENPTkZJR19QQ0lfTEVHQUNZX1BST0MgaXMgbm90IHNldAorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19SQVBJRElPIGlzIG5vdCBzZXQKKworIworIyBBZHZhbmNlZCBzZXR1cAorIworIyBDT05GSUdfQURWQU5DRURfT1BUSU9OUyBpcyBub3Qgc2V0CisKKyMKKyMgRGVmYXVsdCBzZXR0aW5ncyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSB1c2VkCisjCitDT05GSUdfSElHSE1FTV9TVEFSVD0weGZlMDAwMDAwCitDT05GSUdfTE9XTUVNX1NJWkU9MHgzMDAwMDAwMAorQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwCitDT05GSUdfVEFTS19TSVpFPTB4ODAwMDAwMDAKK0NPTkZJR19CT09UX0xPQUQ9MHgwMDgwMDAwMAorCisjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CitDT05GSUdfU1lOX0NPT0tJRVM9eQorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19CSUM9eQorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorCisjCisjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKKyMKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorQ09ORklHX01URF9DT05DQVQ9eQorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSU5URUxFWFQgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfQU1EU1REPXkKK0NPTkZJR19NVERfQ0ZJX0FNRFNURF9SRVRSWT0wCisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAorQ09ORklHX01URF9UUU04NXh4PXkKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9QTUM1NTEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTEtNVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBPbmVOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9MzI3NjgKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworQ09ORklHX0lERT15CitDT05GSUdfQkxLX0RFVl9JREU9eQorCisjCisjIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcworIworIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVESVNLPXkKKyMgQ09ORklHX0lERURJU0tfTVVMVElfTU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFVEFQRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUZMT1BQWSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfVEFTS19JT0NUTCBpcyBub3Qgc2V0CisKKyMKKyMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcworIworQ09ORklHX0lERV9HRU5FUklDPXkKK0NPTkZJR19CTEtfREVWX0lERVBDST15CitDT05GSUdfSURFUENJX1NIQVJFX0lSUT15CisjIENPTkZJR19CTEtfREVWX09GRkJPQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0dFTkVSSUM9eQorIyBDT05GSUdfQkxLX0RFVl9PUFRJNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0w4MkMxMDUgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRE1BX1BDST15CisjIENPTkZJR19CTEtfREVWX0lERURNQV9GT1JDRUQgaXMgbm90IHNldAorQ09ORklHX0lERURNQV9QQ0lfQVVUTz15CisjIENPTkZJR19JREVETUFfT05MWURJU0sgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BRUM2MlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQUxJMTVYMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FNRDc0WFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DTUQ2NFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9UUklGTEVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1k4MkM2OTMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DUzU1MjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DUzU1MzAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IUFQzNFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IUFQzNjYgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TQzEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTlM4NzQxNSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NWV0tTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0lJTUFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NMQzkwRTY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVFJNMjkwIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1ZJQTgyQ1hYWD15CisjIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURNQT15CisjIENPTkZJR19JREVETUFfSVZCIGlzIG5vdCBzZXQKK0NPTkZJR19JREVETUFfQVVUTz15CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19JMk8gaXMgbm90IHNldAorCisjCisjIE1hY2ludG9zaCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfV0lOREZBUk0gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgUEhZIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfUEhZTElCPXkKKworIworIyBNSUkgUEhZIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NQVJWRUxMX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19EQVZJQ09NX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19RU0VNSV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTFhUX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19DSUNBREFfUEhZIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBU1NJTkkgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKKworIworIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfUENJPXkKKyMgQ09ORklHX1BDTkVUMzIgaXMgbm90IHNldAorIyBDT05GSUdfQU1EODExMV9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQURBUFRFQ19TVEFSRklSRSBpcyBub3Qgc2V0CisjIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfRk9SQ0VERVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RHUlMgaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk8xMDAgaXMgbm90IHNldAorQ09ORklHX0UxMDA9eQorIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAorIyBDT05GSUdfTkUyS19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfODEzOUNQIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlUT08gaXMgbm90IHNldAorIyBDT05GSUdfU0lTOTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VQSUMxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfVExBTiBpcyBub3Qgc2V0CisjIENPTkZJR19WSUFfUkhJTkUgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAorIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAorIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzE5MCBpcyBub3Qgc2V0CisjIENPTkZJR19TS0dFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKK0NPTkZJR19HSUFORkFSPXkKK0NPTkZJR19HRkFSX05BUEk9eQorCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworIyBDT05GSUdfQ0hFTFNJT19UMSBpcyBub3Qgc2V0CisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgVGVsZXBob255IFN1cHBvcnQKKyMKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00CisjIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CitDT05GSUdfR0VOX1JUQz15CisjIENPTkZJR19HRU5fUlRDX1ggaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19BR1AgaXMgbm90IHNldAorIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFTENMT0NLIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCisjIENPTkZJR19JMkNfQUxHT0JJVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0CitDT05GSUdfSTJDX01QQz15CisjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUFJPU0FWQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TQVZBR0U0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDeDIwMF9BQ0IgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTOTZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCitDT05GSUdfU0VOU09SU19EUzEzMzc9eQorIyBDT05GSUdfU0VOU09SU19EUzEzNzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTTQxVDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfWDEyMDVfSTJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIERhbGxhcydzIDEtd2lyZSBidXMKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMKK0NPTkZJR19IV01PTj15CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CitDT05GSUdfU0VOU09SU19MTTc1PXkKKyMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WSUE2ODZBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CitDT05GSUdfSFdNT05fREVCVUdfQ0hJUD15CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBDYXBhYmlsaXRpZXMgUG9ydCBkcml2ZXJzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKKyMKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKworIworIyBTTiBEZXZpY2VzCisjCisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorIyBDT05GSUdfUkVMQVlGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSPXkKKyMgQ09ORklHX0pGRlMyX1NVTU1BUlkgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorQ09ORklHX0NSQU1GUz15CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CisjIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTVNET1NfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfU0VSSUFMX1RFWFRfREVCVUcgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvY29uZmlncy9UUU04NTQxX2RlZmNvbmZpZyBiL2FyY2gvcHBjL2NvbmZpZ3MvVFFNODU0MV9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmNTY2OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcHBjL2NvbmZpZ3MvVFFNODU0MV9kZWZjb25maWcKQEAgLTAsMCArMSw5ODYgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xNS1yYzIKKyMgV2VkIE5vdiAzMCAxMzozNjoyOCAyMDA1CisjCitDT05GSUdfTU1VPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX1BQQz15CitDT05GSUdfUFBDMzI9eQorQ09ORklHX0dFTkVSSUNfTlZSQU09eQorQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfQVJDSF9NQVlfSEFWRV9QQ19GREM9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CitDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCisjIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBsYXllcgorIworIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CitDT05GSUdfREVGQVVMVF9BUz15CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCisKKyMKKyMgUHJvY2Vzc29yCisjCisjIENPTkZJR182eHggaXMgbm90IHNldAorIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0CisjIENPTkZJR19QT1dFUjMgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVI0IGlzIG5vdCBzZXQKKyMgQ09ORklHXzh4eCBpcyBub3Qgc2V0CisjIENPTkZJR19FMjAwIGlzIG5vdCBzZXQKK0NPTkZJR19FNTAwPXkKK0NPTkZJR19CT09LRT15CitDT05GSUdfRlNMX0JPT0tFPXkKKyMgQ09ORklHX1BIWVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1NQRT15CitDT05GSUdfTUFUSF9FTVVMQVRJT049eQorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAorIyBDT05GSUdfV0FOVF9FQVJMWV9TRVJJQUwgaXMgbm90IHNldAorQ09ORklHX1BQQ19HRU41NTA9eQorQ09ORklHXzg1eHg9eQorQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0lfQkU9eQorCisjCisjIEZyZWVzY2FsZSA4NXh4IG9wdGlvbnMKKyMKKyMgQ09ORklHX01QQzg1NDBfQURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01QQzg1NDhfQ0RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01QQzg1NTVfQ0RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01QQzg1NjBfQURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NCQzg1NjAgaXMgbm90IHNldAorIyBDT05GSUdfU1RYX0dQMyBpcyBub3Qgc2V0CisjIENPTkZJR19UUU04NTQwIGlzIG5vdCBzZXQKK0NPTkZJR19UUU04NTQxPXkKKyMgQ09ORklHX1RRTTg1NTUgaXMgbm90IHNldAorIyBDT05GSUdfVFFNODU2MCBpcyBub3Qgc2V0CitDT05GSUdfTVBDODU1NT15CisKKyMKKyMgUGxhdGZvcm0gb3B0aW9ucworIworQ09ORklHX0NQTTI9eQorIyBDT05GSUdfUENfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0yNTAKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorIyBDT05GSUdfUE0gaXMgbm90IHNldAorIyBDT05GSUdfU09GVFdBUkVfU1VTUEVORCBpcyBub3Qgc2V0CitDT05GSUdfU0VDQ09NUD15CitDT05GSUdfSVNBX0RNQV9BUEk9eQorCisjCisjIEJ1cyBvcHRpb25zCisjCitDT05GSUdfUFBDX0k4MjU5PXkKK0NPTkZJR19QUENfSU5ESVJFQ1RfUENJPXkKK0NPTkZJR19QQ0k9eQorQ09ORklHX1BDSV9ET01BSU5TPXkKKyMgQ09ORklHX1BDSV9MRUdBQ1lfUFJPQyBpcyBub3Qgc2V0CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBBZHZhbmNlZCBzZXR1cAorIworIyBDT05GSUdfQURWQU5DRURfT1BUSU9OUyBpcyBub3Qgc2V0CisKKyMKKyMgRGVmYXVsdCBzZXR0aW5ncyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSB1c2VkCisjCitDT05GSUdfSElHSE1FTV9TVEFSVD0weGZlMDAwMDAwCitDT05GSUdfTE9XTUVNX1NJWkU9MHgzMDAwMDAwMAorQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwCitDT05GSUdfVEFTS19TSVpFPTB4ODAwMDAwMDAKK0NPTkZJR19CT09UX0xPQUQ9MHgwMDgwMDAwMAorCisjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CitDT05GSUdfU1lOX0NPT0tJRVM9eQorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19CSUM9eQorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorCisjCisjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKKyMKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorQ09ORklHX01URF9DT05DQVQ9eQorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSU5URUxFWFQgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfQU1EU1REPXkKK0NPTkZJR19NVERfQ0ZJX0FNRFNURF9SRVRSWT0wCisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAorQ09ORklHX01URF9UUU04NXh4PXkKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9QTUM1NTEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTEtNVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBPbmVOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9MzI3NjgKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworQ09ORklHX0lERT15CitDT05GSUdfQkxLX0RFVl9JREU9eQorCisjCisjIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcworIworIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVESVNLPXkKKyMgQ09ORklHX0lERURJU0tfTVVMVElfTU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFVEFQRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUZMT1BQWSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfVEFTS19JT0NUTCBpcyBub3Qgc2V0CisKKyMKKyMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcworIworQ09ORklHX0lERV9HRU5FUklDPXkKK0NPTkZJR19CTEtfREVWX0lERVBDST15CitDT05GSUdfSURFUENJX1NIQVJFX0lSUT15CisjIENPTkZJR19CTEtfREVWX09GRkJPQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0dFTkVSSUM9eQorIyBDT05GSUdfQkxLX0RFVl9PUFRJNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0w4MkMxMDUgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRE1BX1BDST15CisjIENPTkZJR19CTEtfREVWX0lERURNQV9GT1JDRUQgaXMgbm90IHNldAorQ09ORklHX0lERURNQV9QQ0lfQVVUTz15CisjIENPTkZJR19JREVETUFfT05MWURJU0sgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BRUM2MlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQUxJMTVYMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FNRDc0WFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DTUQ2NFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9UUklGTEVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1k4MkM2OTMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DUzU1MjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DUzU1MzAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IUFQzNFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IUFQzNjYgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TQzEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTlM4NzQxNSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NWV0tTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0lJTUFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NMQzkwRTY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVFJNMjkwIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1ZJQTgyQ1hYWD15CisjIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURNQT15CisjIENPTkZJR19JREVETUFfSVZCIGlzIG5vdCBzZXQKK0NPTkZJR19JREVETUFfQVVUTz15CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19JMk8gaXMgbm90IHNldAorCisjCisjIE1hY2ludG9zaCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfV0lOREZBUk0gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgUEhZIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfUEhZTElCPXkKKworIworIyBNSUkgUEhZIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NQVJWRUxMX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19EQVZJQ09NX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19RU0VNSV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTFhUX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19DSUNBREFfUEhZIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBU1NJTkkgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKKworIworIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfUENJPXkKKyMgQ09ORklHX1BDTkVUMzIgaXMgbm90IHNldAorIyBDT05GSUdfQU1EODExMV9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQURBUFRFQ19TVEFSRklSRSBpcyBub3Qgc2V0CisjIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfRk9SQ0VERVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RHUlMgaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk8xMDAgaXMgbm90IHNldAorQ09ORklHX0UxMDA9eQorIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAorIyBDT05GSUdfTkUyS19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfODEzOUNQIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlUT08gaXMgbm90IHNldAorIyBDT05GSUdfU0lTOTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VQSUMxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfVExBTiBpcyBub3Qgc2V0CisjIENPTkZJR19WSUFfUkhJTkUgaXMgbm90IHNldAorIyBDT05GSUdfRlNfRU5FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAorIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAorIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLR0UgaXMgbm90IHNldAorIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0CisjIENPTkZJR19WSUFfVkVMT0NJVFkgaXMgbm90IHNldAorIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JOWDIgaXMgbm90IHNldAorQ09ORklHX0dJQU5GQVI9eQorQ09ORklHX0dGQVJfTkFQST15CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lYR0IgaXMgbm90IHNldAorIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBUZWxlcGhvbnkgU3VwcG9ydAorIworIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCitDT05GSUdfU0VSSUFMXzgyNTA9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKKyMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX0NQTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorQ09ORklHX0dFTl9SVEM9eQorIyBDT05GSUdfR0VOX1JUQ19YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfQUdQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisjIENPTkZJR19URUxDTE9DSyBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19DSEFSREVWPXkKKworIworIyBJMkMgQWxnb3JpdGhtcworIworIyBDT05GSUdfSTJDX0FMR09CSVQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDX0FMSTE1MzUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1NjMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1WDMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDc1NiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSTgwMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSTgxMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAorQ09ORklHX0kyQ19NUEM9eQorIyBDT05GSUdfSTJDX01QQzgyNjAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX05GT1JDRTIgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BST1NBVkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0FWQUdFNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ3gyMDBfQUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM1NTk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM2MzAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzk2WCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUFQUk8gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BDQV9JU0EgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAorIworQ09ORklHX1NFTlNPUlNfRFMxMzM3PXkKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTTQxVDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfWDEyMDVfSTJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIERhbGxhcydzIDEtd2lyZSBidXMKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMKK0NPTkZJR19IV01PTj15CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CitDT05GSUdfU0VOU09SU19MTTc1PXkKKyMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WSUE2ODZBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CitDT05GSUdfSFdNT05fREVCVUdfQ0hJUD15CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBDYXBhYmlsaXRpZXMgUG9ydCBkcml2ZXJzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKKyMKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKworIworIyBTTiBEZXZpY2VzCisjCisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorIyBDT05GSUdfUkVMQVlGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSPXkKKyMgQ09ORklHX0pGRlMyX1NVTU1BUlkgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorQ09ORklHX0NSQU1GUz15CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CisjIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTVNET1NfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0NfRU5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUNfRU5FVCBpcyBub3Qgc2V0CisKKyMKKyMgQ1BNMiBPcHRpb25zCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfS0dEQl9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9URVhUX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2NvbmZpZ3MvVFFNODU1NV9kZWZjb25maWcgYi9hcmNoL3BwYy9jb25maWdzL1RRTTg1NTVfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMGIzZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3BwYy9jb25maWdzL1RRTTg1NTVfZGVmY29uZmlnCkBAIC0wLDAgKzEsOTgzIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTUtcmMyCisjIFRodSBOb3YgMjQgMTc6MTA6NTIgMjAwNQorIworQ09ORklHX01NVT15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19QUEM9eQorQ09ORklHX1BQQzMyPXkKK0NPTkZJR19HRU5FUklDX05WUkFNPXkKK0NPTkZJR19TQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0FSQ0hfTUFZX0hBVkVfUENfRkRDPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCitDT05GSUdfRU1CRURERUQ9eQorIyBDT05GSUdfS0FMTFNZTVMgaXMgbm90IHNldAorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKKyMgQ09ORklHX0VQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworIyBDT05GSUdfTU9EVUxFUyBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbGF5ZXIKKyMKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorQ09ORklHX0RFRkFVTFRfQVM9eQorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorCisjCisjIFByb2Nlc3NvcgorIworIyBDT05GSUdfNnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQweCBpcyBub3Qgc2V0CisjIENPTkZJR180NHggaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSNCBpcyBub3Qgc2V0CisjIENPTkZJR184eHggaXMgbm90IHNldAorIyBDT05GSUdfRTIwMCBpcyBub3Qgc2V0CitDT05GSUdfRTUwMD15CitDT05GSUdfQk9PS0U9eQorQ09ORklHX0ZTTF9CT09LRT15CisjIENPTkZJR19QSFlTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19TUEU9eQorQ09ORklHX01BVEhfRU1VTEFUSU9OPXkKKyMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTlRfRUFSTFlfU0VSSUFMIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfR0VONTUwPXkKK0NPTkZJR184NXh4PXkKK0NPTkZJR19QUENfSU5ESVJFQ1RfUENJX0JFPXkKKworIworIyBGcmVlc2NhbGUgODV4eCBvcHRpb25zCisjCisjIENPTkZJR19NUEM4NTQwX0FEUyBpcyBub3Qgc2V0CisjIENPTkZJR19NUEM4NTQ4X0NEUyBpcyBub3Qgc2V0CisjIENPTkZJR19NUEM4NTU1X0NEUyBpcyBub3Qgc2V0CisjIENPTkZJR19NUEM4NTYwX0FEUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQkM4NTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUWF9HUDMgaXMgbm90IHNldAorIyBDT05GSUdfVFFNODU0MCBpcyBub3Qgc2V0CisjIENPTkZJR19UUU04NTQxIGlzIG5vdCBzZXQKK0NPTkZJR19UUU04NTU1PXkKKyMgQ09ORklHX1RRTTg1NjAgaXMgbm90IHNldAorQ09ORklHX01QQzg1NTU9eQorCisjCisjIFBsYXRmb3JtIG9wdGlvbnMKKyMKK0NPTkZJR19DUE0yPXkKKyMgQ09ORklHX1BDX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldAorIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MjUwCitDT05GSUdfUFJFRU1QVF9OT05FPXkKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQgaXMgbm90IHNldAorQ09ORklHX1NFQ0NPTVA9eQorQ09ORklHX0lTQV9ETUFfQVBJPXkKKworIworIyBCdXMgb3B0aW9ucworIworQ09ORklHX1BQQ19JODI1OT15CitDT05GSUdfUFBDX0lORElSRUNUX1BDST15CitDT05GSUdfUENJPXkKK0NPTkZJR19QQ0lfRE9NQUlOUz15CisjIENPTkZJR19QQ0lfTEVHQUNZX1BST0MgaXMgbm90IHNldAorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgQWR2YW5jZWQgc2V0dXAKKyMKKyMgQ09ORklHX0FEVkFOQ0VEX09QVElPTlMgaXMgbm90IHNldAorCisjCisjIERlZmF1bHQgc2V0dGluZ3MgZm9yIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdXNlZAorIworQ09ORklHX0hJR0hNRU1fU1RBUlQ9MHhmZTAwMDAwMAorQ09ORklHX0xPV01FTV9TSVpFPTB4MzAwMDAwMDAKK0NPTkZJR19LRVJORUxfU1RBUlQ9MHhjMDAwMDAwMAorQ09ORklHX1RBU0tfU0laRT0weDgwMDAwMDAwCitDT05GSUdfQk9PVF9MT0FEPTB4MDA4MDAwMDAKKworIworIyBOZXR3b3JraW5nCisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorQ09ORklHX1NZTl9DT09LSUVTPXkKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQklDPXkKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ09OQ0FUPXkKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0lOVEVMRVhUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CitDT05GSUdfTVREX0NGSV9BTURTVERfUkVUUlk9MAorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfVFFNODV4eD15CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfUE1DNTUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgT25lTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTMyNzY4CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKK0NPTkZJR19JREU9eQorQ09ORklHX0JMS19ERVZfSURFPXkKKworIworIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRElTSz15CisjIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVDRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAorIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAorCisjCisjIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKKyMKK0NPTkZJR19JREVfR0VORVJJQz15CitDT05GSUdfQkxLX0RFVl9JREVQQ0k9eQorQ09ORklHX0lERVBDSV9TSEFSRV9JUlE9eQorIyBDT05GSUdfQkxLX0RFVl9PRkZCT0FSRCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9HRU5FUklDPXkKKyMgQ09ORklHX0JMS19ERVZfT1BUSTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NMODJDMTA1IGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURNQV9QQ0k9eQorIyBDT05GSUdfQkxLX0RFVl9JREVETUFfRk9SQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19JREVETUFfUENJX0FVVE89eQorIyBDT05GSUdfSURFRE1BX09OTFlESVNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQUVDNjJYWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FMSTE1WDMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BTUQ3NFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ01ENjRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVFJJRkxFWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NZODJDNjkzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1M1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSFBUMzRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSFBUMzY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0MxMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lUODIxWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05TODc0MTUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9QREMyMDJYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9QREMyMDJYWF9ORVcgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TVldLUyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NJSU1BR0UgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TTEM5MEU2NiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1RSTTI5MCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9WSUE4MkNYWFg9eQorIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVETUE9eQorIyBDT05GSUdfSURFRE1BX0lWQiBpcyBub3Qgc2V0CitDT05GSUdfSURFRE1BX0FVVE89eQorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKKworIworIyBNYWNpbnRvc2ggZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX1dJTkRGQVJNIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEFSQ25ldCBkZXZpY2VzCisjCisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorCisjCisjIFBIWSBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX1BIWUxJQj15CisKKyMKKyMgTUlJIFBIWSBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUFSVkVMTF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xYVF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CisjIENPTkZJR19DQVNTSU5JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisKKyMKKyMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1BDST15CisjIENPTkZJR19QQ05FVDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNRDgxMTFfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FEQVBURUNfU1RBUkZJUkUgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPUkNFREVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19ER1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VFUFJPMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19FMTAwPXkKKyMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0CisjIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FMktfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlDUCBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5VE9PIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FUElDMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX0VORVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAorIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAorIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzE5MCBpcyBub3Qgc2V0CisjIENPTkZJR19TS0dFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKK0NPTkZJR19HSUFORkFSPXkKK0NPTkZJR19HRkFSX05BUEk9eQorCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworIyBDT05GSUdfQ0hFTFNJT19UMSBpcyBub3Qgc2V0CisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgVGVsZXBob255IFN1cHBvcnQKKyMKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00CisjIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9DUE0gaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5fUlRDPXkKKyMgQ09ORklHX0dFTl9SVENfWCBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0FHUCBpcyBub3Qgc2V0CisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CisKKyMKKyMgSTJDIEFsZ29yaXRobXMKKyMKKyMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQ19BTEkxNTM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ3NTYgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDgxMTEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfTVBDPXkKKyMgQ09ORklHX0kyQ19ORk9SQ0UyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAorIyBDT05GSUdfU0N4MjAwX0FDQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNjMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM5NlggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBUFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WT09ET08zIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKKyMKK0NPTkZJR19TRU5TT1JTX0RTMTMzNz15CisjIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NNDFUMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19YMTIwNV9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAorIworQ09ORklHX0hXTU9OPXkKKyMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKK0NPTkZJR19TRU5TT1JTX0xNNzU9eQorIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU0lTNTU5NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkyRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKK0NPTkZJR19IV01PTl9ERUJVR19DSElQPXkKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIENhcGFiaWxpdGllcyBQb3J0IGRyaXZlcnMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBJbmZpbmlCYW5kIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAorCisjCisjIFNOIERldmljZXMKKyMKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfWEFUVFI9eQorIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKKyMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfRlNfTUJDQUNIRT15CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisjIENPTkZJR19SRUxBWUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCitDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVI9eQorIyBDT05GSUdfSkZGUzJfU1VNTUFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9aTElCPXkKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CitDT05GSUdfQ1JBTUZTPXkKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKKyMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTkZTX0NPTU1PTj15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR185UF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKKyMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NU0RPU19QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDQ19FTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQ19FTkVUIGlzIG5vdCBzZXQKKworIworIyBDUE0yIE9wdGlvbnMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19LR0RCX0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX1RFWFRfREVCVUcgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvY29uZmlncy9UUU04NTYwX2RlZmNvbmZpZyBiL2FyY2gvcHBjL2NvbmZpZ3MvVFFNODU2MF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ5MDIwNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcHBjL2NvbmZpZ3MvVFFNODU2MF9kZWZjb25maWcKQEAgLTAsMCArMSw5OTIgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xNS1yYzIKKyMgV2VkIE5vdiAzMCAxNjo0Nzo1MyAyMDA1CisjCitDT05GSUdfTU1VPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX1BQQz15CitDT05GSUdfUFBDMzI9eQorQ09ORklHX0dFTkVSSUNfTlZSQU09eQorQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfQVJDSF9NQVlfSEFWRV9QQ19GREM9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CitDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCisjIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBsYXllcgorIworIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CitDT05GSUdfREVGQVVMVF9BUz15CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCisKKyMKKyMgUHJvY2Vzc29yCisjCisjIENPTkZJR182eHggaXMgbm90IHNldAorIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0CisjIENPTkZJR19QT1dFUjMgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVI0IGlzIG5vdCBzZXQKKyMgQ09ORklHXzh4eCBpcyBub3Qgc2V0CisjIENPTkZJR19FMjAwIGlzIG5vdCBzZXQKK0NPTkZJR19FNTAwPXkKK0NPTkZJR19CT09LRT15CitDT05GSUdfRlNMX0JPT0tFPXkKKyMgQ09ORklHX1BIWVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1NQRT15CitDT05GSUdfTUFUSF9FTVVMQVRJT049eQorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAorIyBDT05GSUdfV0FOVF9FQVJMWV9TRVJJQUwgaXMgbm90IHNldAorQ09ORklHXzg1eHg9eQorQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0lfQkU9eQorCisjCisjIEZyZWVzY2FsZSA4NXh4IG9wdGlvbnMKKyMKKyMgQ09ORklHX01QQzg1NDBfQURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01QQzg1NDhfQ0RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01QQzg1NTVfQ0RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01QQzg1NjBfQURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NCQzg1NjAgaXMgbm90IHNldAorIyBDT05GSUdfU1RYX0dQMyBpcyBub3Qgc2V0CisjIENPTkZJR19UUU04NTQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RRTTg1NDEgaXMgbm90IHNldAorIyBDT05GSUdfVFFNODU1NSBpcyBub3Qgc2V0CitDT05GSUdfVFFNODU2MD15CitDT05GSUdfTVBDODU2MD15CisKKyMKKyMgUGxhdGZvcm0gb3B0aW9ucworIworQ09ORklHX0NQTTI9eQorIyBDT05GSUdfUENfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0yNTAKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorIyBDT05GSUdfUE0gaXMgbm90IHNldAorIyBDT05GSUdfU09GVFdBUkVfU1VTUEVORCBpcyBub3Qgc2V0CitDT05GSUdfU0VDQ09NUD15CitDT05GSUdfSVNBX0RNQV9BUEk9eQorCisjCisjIEJ1cyBvcHRpb25zCisjCitDT05GSUdfUFBDX0k4MjU5PXkKK0NPTkZJR19QUENfSU5ESVJFQ1RfUENJPXkKK0NPTkZJR19QQ0k9eQorQ09ORklHX1BDSV9ET01BSU5TPXkKKyMgQ09ORklHX1BDSV9MRUdBQ1lfUFJPQyBpcyBub3Qgc2V0CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBUElESU8gaXMgbm90IHNldAorCisjCisjIEFkdmFuY2VkIHNldHVwCisjCisjIENPTkZJR19BRFZBTkNFRF9PUFRJT05TIGlzIG5vdCBzZXQKKworIworIyBEZWZhdWx0IHNldHRpbmdzIGZvciBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHVzZWQKKyMKK0NPTkZJR19ISUdITUVNX1NUQVJUPTB4ZmUwMDAwMDAKK0NPTkZJR19MT1dNRU1fU0laRT0weDMwMDAwMDAwCitDT05GSUdfS0VSTkVMX1NUQVJUPTB4YzAwMDAwMDAKK0NPTkZJR19UQVNLX1NJWkU9MHg4MDAwMDAwMAorQ09ORklHX0JPT1RfTE9BRD0weDAwODAwMDAwCisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKK0NPTkZJR19TWU5fQ09PS0lFUz15CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0JJQz15CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisKKyMKKyMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgorIworIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NPTkNBVD15CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKKyMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JTlRFTEVYVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9BTURTVEQ9eQorQ09ORklHX01URF9DRklfQU1EU1REX1JFVFJZPTAKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1RRTTg1eHg9eQorIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1BNQzU1MSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisKKyMKKyMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorCisjCisjIE9uZU5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT0zMjc2OAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCitDT05GSUdfSURFPXkKK0NPTkZJR19CTEtfREVWX0lERT15CisKKyMKKyMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCisjCisjIENPTkZJR19CTEtfREVWX0lERV9TQVRBIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURJU0s9eQorIyBDT05GSUdfSURFRElTS19NVUxUSV9NT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFQ0QgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVUQVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFRkxPUFBZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKKworIworIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCisjCitDT05GSUdfSURFX0dFTkVSSUM9eQorQ09ORklHX0JMS19ERVZfSURFUENJPXkKK0NPTkZJR19JREVQQ0lfU0hBUkVfSVJRPXkKKyMgQ09ORklHX0JMS19ERVZfT0ZGQk9BUkQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfR0VORVJJQz15CisjIENPTkZJR19CTEtfREVWX09QVEk2MjEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TTDgyQzEwNSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVETUFfUENJPXkKKyMgQ09ORklHX0JMS19ERVZfSURFRE1BX0ZPUkNFRCBpcyBub3Qgc2V0CitDT05GSUdfSURFRE1BX1BDSV9BVVRPPXkKKyMgQ09ORklHX0lERURNQV9PTkxZRElTSyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FFQzYyWFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQU1ENzRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NNRDY0WCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DWTgyQzY5MyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUyMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUzMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM0WCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM2NiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NDMTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JVDgyMVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OUzg3NDE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfTkVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1ZXS1MgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TSUlNQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0xDOTBFNjYgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9UUk0yOTAgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfVklBODJDWFhYPXkKKyMgQ09ORklHX0lERV9BUk0gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRE1BPXkKKyMgQ09ORklHX0lERURNQV9JVkIgaXMgbm90IHNldAorQ09ORklHX0lERURNQV9BVVRPPXkKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisKKyMKKyMgTWFjaW50b3NoIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19XSU5ERkFSTSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBQSFkgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19QSFlMSUI9eQorCisjCisjIE1JSSBQSFkgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01BUlZFTExfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RBVklDT01fUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FTRU1JX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19MWFRfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJQ0FEQV9QSFkgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKKyMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAorIyBDT05GSUdfQ0FTU0lOSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorCisjCisjIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorQ09ORklHX05FVF9QQ0k9eQorIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAorIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CitDT05GSUdfRTEwMD15CisjIENPTkZJR19GRUFMTlggaXMgbm90IHNldAorIyBDT05GSUdfTkFUU0VNSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORTJLX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5Q1AgaXMgbm90IHNldAorIyBDT05GSUdfODEzOVRPTyBpcyBub3Qgc2V0CisjIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAorIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0CisjIENPTkZJR19GU19FTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CisjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CitDT05GSUdfR0lBTkZBUj15CitDT05GSUdfR0ZBUl9OQVBJPXkKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAorIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CisjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKKyMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworIyBDT05GSUdfSU5QVVRfTU9VU0VERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NAorIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NQTT15CitDT05GSUdfU0VSSUFMX0NQTV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ1BNX1NDQzE9eQorIyBDT05GSUdfU0VSSUFMX0NQTV9TQ0MyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9DUE1fU0NDMyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfQ1BNX1NDQzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX0NQTV9TTUMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9DUE1fU01DMiBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorQ09ORklHX0dFTl9SVEM9eQorIyBDT05GSUdfR0VOX1JUQ19YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfQUdQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisjIENPTkZJR19URUxDTE9DSyBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19DSEFSREVWPXkKKworIworIyBJMkMgQWxnb3JpdGhtcworIworIyBDT05GSUdfSTJDX0FMR09CSVQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDX0FMSTE1MzUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1NjMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1WDMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDc1NiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSTgwMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSTgxMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAorQ09ORklHX0kyQ19NUEM9eQorIyBDT05GSUdfSTJDX01QQzgyNjAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX05GT1JDRTIgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BST1NBVkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0FWQUdFNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ3gyMDBfQUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM1NTk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM2MzAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzk2WCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUFQUk8gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BDQV9JU0EgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAorIworQ09ORklHX1NFTlNPUlNfRFMxMzM3PXkKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTTQxVDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfWDEyMDVfSTJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIERhbGxhcydzIDEtd2lyZSBidXMKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMKK0NPTkZJR19IV01PTj15CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CitDT05GSUdfU0VOU09SU19MTTc1PXkKKyMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WSUE2ODZBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CitDT05GSUdfSFdNT05fREVCVUdfQ0hJUD15CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBDYXBhYmlsaXRpZXMgUG9ydCBkcml2ZXJzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKKyMKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKworIworIyBTTiBEZXZpY2VzCisjCisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorIyBDT05GSUdfUkVMQVlGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSPXkKKyMgQ09ORklHX0pGRlMyX1NVTU1BUlkgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorQ09ORklHX0NSQU1GUz15CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CisjIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTVNET1NfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0NfRU5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUNfRU5FVCBpcyBub3Qgc2V0CisKKyMKKyMgQ1BNMiBPcHRpb25zCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfS0dEQl9DT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2NvbmZpZ3MvYmFtYm9vX2RlZmNvbmZpZyBiL2FyY2gvcHBjL2NvbmZpZ3MvYmFtYm9vX2RlZmNvbmZpZwppbmRleCAwYmE0ZTcwLi40MWZkMzkzIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9jb25maWdzL2JhbWJvb19kZWZjb25maWcKKysrIGIvYXJjaC9wcGMvY29uZmlncy9iYW1ib29fZGVmY29uZmlnCkBAIC00OTksNiArNDk5LDcgQEAKICMgQ09ORklHX0RMMksgaXMgbm90IHNldAogQ09ORklHX0UxMDAwPXkKICMgQ09ORklHX0UxMDAwX05BUEkgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDBfRElTQUJMRV9QQUNLRVRfU1BMSVQgaXMgbm90IHNldAogIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKICMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9jb25maWdzL2thdGFuYV9kZWZjb25maWcgYi9hcmNoL3BwYy9jb25maWdzL2thdGFuYV9kZWZjb25maWcKaW5kZXggMGYzYmI5YS4uNzMxMWZlNiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvY29uZmlncy9rYXRhbmFfZGVmY29uZmlnCisrKyBiL2FyY2gvcHBjL2NvbmZpZ3Mva2F0YW5hX2RlZmNvbmZpZwpAQCAtNDg4LDYgKzQ4OCw3IEBACiAjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKIENPTkZJR19FMTAwMD15CiAjIENPTkZJR19FMTAwMF9OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwX0RJU0FCTEVfUEFDS0VUX1NQTElUIGlzIG5vdCBzZXQKICMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvY29uZmlncy9tcGM4MzR4X3N5c19kZWZjb25maWcgYi9hcmNoL3BwYy9jb25maWdzL21wYzgzNHhfc3lzX2RlZmNvbmZpZwppbmRleCA2NzNkYzY0Li5iOTZhNmQ2IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9jb25maWdzL21wYzgzNHhfc3lzX2RlZmNvbmZpZworKysgYi9hcmNoL3BwYy9jb25maWdzL21wYzgzNHhfc3lzX2RlZmNvbmZpZwpAQCAtNDAyLDYgKzQwMiw3IEBACiAjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKIENPTkZJR19FMTAwMD15CiAjIENPTkZJR19FMTAwMF9OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwX0RJU0FCTEVfUEFDS0VUX1NQTElUIGlzIG5vdCBzZXQKICMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvY29uZmlncy9wb3dlcjNfZGVmY29uZmlnIGIvYXJjaC9wcGMvY29uZmlncy9wb3dlcjNfZGVmY29uZmlnCmluZGV4IDkzZGE1OTUuLmExZWY5MjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2NvbmZpZ3MvcG93ZXIzX2RlZmNvbmZpZworKysgYi9hcmNoL3BwYy9jb25maWdzL3Bvd2VyM19kZWZjb25maWcKQEAgLTQ0Miw2ICs0NDIsNyBAQAogIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CiBDT05GSUdfRTEwMDA9eQogIyBDT05GSUdfRTEwMDBfTkFQSSBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMF9ESVNBQkxFX1BBQ0tFVF9TUExJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAogIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvcHBjL2tlcm5lbC9NYWtlZmlsZQppbmRleCAwYmIyM2ZjLi5lMzk5YmJiIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMva2VybmVsL01ha2VmaWxlCkBAIC05LDE2ICs5LDEzIEBACiBleHRyYS0kKENPTkZJR19GU0xfQk9PS0UpCTo9IGhlYWRfZnNsX2Jvb2tlLm8KIGV4dHJhLSQoQ09ORklHXzh4eCkJCTo9IGhlYWRfOHh4Lm8KIGV4dHJhLSQoQ09ORklHXzZ4eCkJCSs9IGlkbGVfNnh4Lm8KLWV4dHJhLSQoQ09ORklHX1BPV0VSNCkJCSs9IGlkbGVfcG93ZXI0Lm8KIGV4dHJhLXkJCQkJKz0gdm1saW51eC5sZHMKIAogb2JqLXkJCQkJOj0gZW50cnkubyB0cmFwcy5vIGlkbGUubyB0aW1lLm8gbWlzYy5vIFwKLQkJCQkJcHJvY2Vzcy5vIFwKIAkJCQkJc2V0dXAubyBcCiAJCQkJCXBwY19odGFiLm8KIG9iai0kKENPTkZJR182eHgpCQkrPSBsMmNyLm8gY3B1X3NldHVwXzZ4eC5vCiBvYmotJChDT05GSUdfU09GVFdBUkVfU1VTUEVORCkJKz0gc3dzdXNwLm8KLW9iai0kKENPTkZJR19QT1dFUjQpCQkrPSBjcHVfc2V0dXBfcG93ZXI0Lm8KIG9iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gbW9kdWxlLm8gcHBjX2tzeW1zLm8KIG9iai0kKENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUpCSs9IGRtYS1tYXBwaW5nLm8KIG9iai0kKENPTkZJR19QQ0kpCQkrPSBwY2kubwpAQCAtNDMsMTEgKzQwLDkgQEAKIG9iai0kKENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EKQkrPSBzd3N1c3Aubwogb2JqLSQoQ09ORklHX01PRFVMRVMpCQkrPSBtb2R1bGUubwogb2JqLSQoQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRSkJKz0gZG1hLW1hcHBpbmcubwotb2JqLSQoQ09ORklHX1BDSSkJCSs9IHBjaS5vCiBvYmotJChDT05GSUdfS0dEQikJCSs9IHBwYy1zdHViLm8KIG9iai0kKENPTkZJR19UQVUpCQkrPSB0ZW1wLm8KIGlmbmRlZiBDT05GSUdfRTIwMAogb2JqLSQoQ09ORklHX0ZTTF9CT09LRSkJCSs9IHBlcmZtb25fZnNsX2Jvb2tlLm8KIGVuZGlmCi1vYmotJChDT05GSUdfS0VYRUMpCQkrPSBtYWNoaW5lX2tleGVjLm8gcmVsb2NhdGVfa2VybmVsLm8KIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvcHBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IGZlMGU3NjcuLjc5NjRiZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0xMzEsNyArMTMxLDcgQEAKIAlERUZJTkUoQ1BVX1NQRUNfRkVBVFVSRVMsIG9mZnNldG9mKHN0cnVjdCBjcHVfc3BlYywgY3B1X2ZlYXR1cmVzKSk7CiAJREVGSU5FKENQVV9TUEVDX1NFVFVQLCBvZmZzZXRvZihzdHJ1Y3QgY3B1X3NwZWMsIGNwdV9zZXR1cCkpOwogCi0JREVGSU5FKFRJX1NDX05PRVJSLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIHN5c2NhbGxfbm9lcnJvcikpOworCURFRklORShUSV9TSUdGUkFNRSwgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBudmdwcnNfZnJhbWUpKTsKIAlERUZJTkUoVElfVEFTSywgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCB0YXNrKSk7CiAJREVGSU5FKFRJX0VYRUNET01BSU4sIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgZXhlY19kb21haW4pKTsKIAlERUZJTkUoVElfRkxBR1MsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgZmxhZ3MpKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9wcGMva2VybmVsL2VudHJ5LlMKaW5kZXggZjA0NGVkYi4uYTQ4Yjk1MCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9wcGMva2VybmVsL2VudHJ5LlMKQEAgLTIwMCw4ICsyMDAsNiBAQAogCWJsCWRvX3Nob3dfc3lzY2FsbAogI2VuZGlmIC8qIFNIT1dfU1lTQ0FMTFMgKi8KIAlybHdpbm0JcjEwLHIxLDAsMCwxOAkvKiBjdXJyZW50X3RocmVhZF9pbmZvKCkgKi8KLQlsaQlyMTEsMAotCXN0YglyMTEsVElfU0NfTk9FUlIocjEwKQogCWx3eglyMTEsVElfRkxBR1MocjEwKQogCWFuZGkuCXIxMSxyMTEsX1RJRl9TWVNDQUxMX1RfT1JfQQogCWJuZS0Jc3lzY2FsbF9kb3RyYWNlCkBAIC0yMjIsMjUgKzIyMCwyMSBAQAogCWJsCWRvX3Nob3dfc3lzY2FsbF9leGl0CiAjZW5kaWYKIAltcglyNixyMwotCWxpCXIxMSwtX0xBU1RfRVJSTk8KLQljbXBsdwkwLHIzLHIxMQogCXJsd2lubQlyMTIscjEsMCwwLDE4CS8qIGN1cnJlbnRfdGhyZWFkX2luZm8oKSAqLwotCWJsdCsJMzBmCi0JbGJ6CXIxMSxUSV9TQ19OT0VSUihyMTIpCi0JY21wd2kJcjExLDAKLQlibmUJMzBmCi0JbmVnCXIzLHIzCi0JbHd6CXIxMCxfQ0NSKHIxKQkvKiBTZXQgU08gYml0IGluIENSICovCi0Jb3JpcwlyMTAscjEwLDB4MTAwMAotCXN0dwlyMTAsX0NDUihyMSkKLQogCS8qIGRpc2FibGUgaW50ZXJydXB0cyBzbyBjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzIGNhbid0IGNoYW5nZSAqLwotMzA6CUxPQURfTVNSX0tFUk5FTChyMTAsTVNSX0tFUk5FTCkJLyogZG9lc24ndCBpbmNsdWRlIE1TUl9FRSAqLworCUxPQURfTVNSX0tFUk5FTChyMTAsTVNSX0tFUk5FTCkJLyogZG9lc24ndCBpbmNsdWRlIE1TUl9FRSAqLwogCVNZTkMKIAlNVE1TUkQocjEwKQogCWx3eglyOSxUSV9GTEFHUyhyMTIpCi0JYW5kaS4JcjAscjksKF9USUZfU1lTQ0FMTF9UX09SX0F8X1RJRl9TSUdQRU5ESU5HfF9USUZfTkVFRF9SRVNDSEVEKQorCWxpCXI4LC1fTEFTVF9FUlJOTworCWFuZGkuCXIwLHI5LChfVElGX1NZU0NBTExfVF9PUl9BfF9USUZfU0lHUEVORElOR3xfVElGX05FRURfUkVTQ0hFRHxfVElGX1JFU1RPUkVBTEwpCiAJYm5lLQlzeXNjYWxsX2V4aXRfd29yaworCWNtcGx3CTAscjMscjgKKwlibHQrCXN5c2NhbGxfZXhpdF9jb250CisJbHd6CXIxMSxfQ0NSKHIxKQkJCS8qIExvYWQgQ1IgKi8KKwluZWcJcjMscjMKKwlvcmlzCXIxMSxyMTEsMHgxMDAwCS8qIFNldCBTTyBiaXQgaW4gQ1IgKi8KKwlzdHcJcjExLF9DQ1IocjEpCiBzeXNjYWxsX2V4aXRfY29udDoKICNpZiBkZWZpbmVkKENPTkZJR180eHgpIHx8IGRlZmluZWQoQ09ORklHX0JPT0tFKQogCS8qIElmIHRoZSBwcm9jZXNzIGhhcyBpdHMgb3duIERCQ1IwIHZhbHVlLCBsb2FkIGl0IHVwLiAgVGhlIHNpbmdsZQpAQCAtMjkyLDQ2ICsyODYsMTEzIEBACiAJYglzeXNjYWxsX2RvdHJhY2VfY29udAogCiBzeXNjYWxsX2V4aXRfd29yazoKLQlzdHcJcjYsUkVTVUxUKHIxKQkvKiBTYXZlIHJlc3VsdCAqLworCWFuZGkuCXIwLHI5LF9USUZfUkVTVE9SRUFMTAorCWJuZS0JMmYKKwljbXBsdwkwLHIzLHI4CisJYmx0KwkxZgorCWFuZGkuCXIwLHI5LF9USUZfTk9FUlJPUgorCWJuZS0JMWYKKwlsd3oJcjExLF9DQ1IocjEpCQkJLyogTG9hZCBDUiAqLworCW5lZwlyMyxyMworCW9yaXMJcjExLHIxMSwweDEwMDAJLyogU2V0IFNPIGJpdCBpbiBDUiAqLworCXN0dwlyMTEsX0NDUihyMSkKKworMToJc3R3CXI2LFJFU1VMVChyMSkJLyogU2F2ZSByZXN1bHQgKi8KIAlzdHcJcjMsR1BSMyhyMSkJLyogVXBkYXRlIHJldHVybiB2YWx1ZSAqLwotCWFuZGkuCXIwLHI5LF9USUZfU1lTQ0FMTF9UX09SX0EKLQliZXEJNWYKLQlvcmkJcjEwLHIxMCxNU1JfRUUKLQlTWU5DCi0JTVRNU1JEKHIxMCkJCS8qIHJlLWVuYWJsZSBpbnRlcnJ1cHRzICovCisyOglhbmRpLglyMCxyOSwoX1RJRl9QRVJTWVNDQUxMX01BU0spCisJYmVxCTRmCisKKwkvKiBDbGVhciBwZXItc3lzY2FsbCBUSUYgZmxhZ3MgaWYgYW55IGFyZSBzZXQsIGJ1dCBfbGVhdmVfCisJX1RJRl9TQVZFX05WR1BSUyBzZXQgaW4gcjkgc2luY2Ugd2UgaGF2ZW4ndCBkZWFsdCB3aXRoIHRoYXQKKwl5ZXQuICAqLworCisJbGkJcjExLF9USUZfUEVSU1lTQ0FMTF9NQVNLCisJYWRkaQlyMTIscjEyLFRJX0ZMQUdTCiszOglsd2FyeAlyOCwwLHIxMgorCWFuZGMJcjgscjgscjExCisjaWZkZWYgQ09ORklHX0lCTTQwNV9FUlI3NworCWRjYnQJMCxyMTIKKyNlbmRpZgorCXN0d2N4LglyOCwwLHIxMgorCWJuZS0JM2IKKwlzdWJpCXIxMixyMTIsVElfRkxBR1MKKwkKKzQ6CS8qIEFueXRoaW5nIHdoaWNoIHJlcXVpcmVzIGVuYWJsaW5nIGludGVycnVwdHM/ICovCisJYW5kaS4JcjAscjksKF9USUZfU1lTQ0FMTF9UX09SX0F8X1RJRl9TSU5HTEVTVEVQfF9USUZfU0FWRV9OVkdQUlMpCisJYmVxCTdmCisKKwkvKiBTYXZlIE5WR1BSUyBpZiB0aGV5J3JlIG5vdCBzYXZlZCBhbHJlYWR5ICovCiAJbHd6CXI0LFRSQVAocjEpCiAJYW5kaS4JcjQscjQsMQotCWJlcQk0ZgorCWJlcQk1ZgogCVNBVkVfTlZHUFJTKHIxKQogCWxpCXI0LDB4YzAwCiAJc3R3CXI0LFRSQVAocjEpCi00OgorCisJLyogUmUtZW5hYmxlIGludGVycnVwdHMgKi8KKzU6CW9yaQlyMTAscjEwLE1TUl9FRQorCVNZTkMKKwlNVE1TUkQocjEwKQorCisJYW5kaS4JcjAscjksX1RJRl9TQVZFX05WR1BSUworCWJuZQlzYXZlX3VzZXJfbnZncHJzCisKK3NhdmVfdXNlcl9udmdwcnNfY29udDoKKwlhbmRpLglyMCxyOSwoX1RJRl9TWVNDQUxMX1RfT1JfQXxfVElGX1NJTkdMRVNURVApCisJYmVxCTdmCisKIAlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECiAJYmwJZG9fc3lzY2FsbF90cmFjZV9sZWF2ZQogCVJFU1RfTlZHUFJTKHIxKQotMjoKLQlsd3oJcjMsR1BSMyhyMSkKKworNjoJbHd6CXIzLEdQUjMocjEpCiAJTE9BRF9NU1JfS0VSTkVMKHIxMCxNU1JfS0VSTkVMKQkvKiBkb2Vzbid0IGluY2x1ZGUgTVNSX0VFICovCiAJU1lOQwogCU1UTVNSRChyMTApCQkvKiBkaXNhYmxlIGludGVycnVwdHMgYWdhaW4gKi8KIAlybHdpbm0JcjEyLHIxLDAsMCwxOAkvKiBjdXJyZW50X3RocmVhZF9pbmZvKCkgKi8KIAlsd3oJcjksVElfRkxBR1MocjEyKQotNToKKzc6CiAJYW5kaS4JcjAscjksX1RJRl9ORUVEX1JFU0NIRUQKLQlibmUJMWYKKwlibmUJOGYKIAlsd3oJcjUsX01TUihyMSkKIAlhbmRpLglyNSxyNSxNU1JfUFIKLQliZXEJc3lzY2FsbF9leGl0X2NvbnQKKwliZXEJcmV0X2Zyb21fZXhjZXB0CiAJYW5kaS4JcjAscjksX1RJRl9TSUdQRU5ESU5HCi0JYmVxCXN5c2NhbGxfZXhpdF9jb250CisJYmVxCXJldF9mcm9tX2V4Y2VwdAogCWIJZG9fdXNlcl9zaWduYWwKLTE6Cis4OgogCW9yaQlyMTAscjEwLE1TUl9FRQogCVNZTkMKIAlNVE1TUkQocjEwKQkJLyogcmUtZW5hYmxlIGludGVycnVwdHMgKi8KIAlibAlzY2hlZHVsZQotCWIJMmIKKwliCTZiCiAKK3NhdmVfdXNlcl9udmdwcnM6CisJbHd6CXI4LFRJX1NJR0ZSQU1FKHIxMikKKworLm1hY3JvIHNhdmV3b3JkcyBzdGFydCwgZW5kCisgIDE6CXN0dyBcc3RhcnQsNCooXHN0YXJ0KShyOCkKKwkuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgorCS5hbGlnbgkyCisJLmxvbmcJMWIsc2F2ZV91c2VyX252Z3Byc19mYXVsdAorCS5wcmV2aW91cworCS5pZiBcZW5kIC0gXHN0YXJ0CisJc2F2ZXdvcmRzICIoXHN0YXJ0KzEpIixcZW5kCisJLmVuZGlmCisuZW5kbQkKKwlzYXZld29yZHMgMTQsMzEKKwliCXNhdmVfdXNlcl9udmdwcnNfY29udAorCisJCitzYXZlX3VzZXJfbnZncHJzX2ZhdWx0OgorCWxpCXIzLDExCQkvKiBTSUdTRUdWICovCisJbHd6CXI0LFRJX1RBU0socjEyKQorCWJsCWZvcmNlX3NpZ3NlZ3YKKworCXJsd2lubQlyMTIscjEsMCwwLDE4CS8qIGN1cnJlbnRfdGhyZWFkX2luZm8oKSAqLworCWx3eglyOSxUSV9GTEFHUyhyMTIpCisJYglzYXZlX3VzZXJfbnZncHJzX2NvbnQKKwkKICNpZmRlZiBTSE9XX1NZU0NBTExTCiBkb19zaG93X3N5c2NhbGw6CiAjaWZkZWYgU0hPV19TWVNDQUxMU19UQVNLCkBAIC00MDEsMjggKzQ2MiwxMCBAQAogI2VuZGlmIC8qIFNIT1dfU1lTQ0FMTFMgKi8KIAogLyoKLSAqIFRoZSBzaWdzdXNwZW5kIGFuZCBydF9zaWdzdXNwZW5kIHN5c3RlbSBjYWxscyBjYW4gY2FsbCBkb19zaWduYWwKLSAqIGFuZCB0aHVzIHB1dCB0aGUgcHJvY2VzcyBpbnRvIHRoZSBzdG9wcGVkIHN0YXRlIHdoZXJlIHdlIG1pZ2h0Ci0gKiB3YW50IHRvIGV4YW1pbmUgaXRzIHVzZXIgc3RhdGUgd2l0aCBwdHJhY2UuICBUaGVyZWZvcmUgd2UgbmVlZAotICogdG8gc2F2ZSBhbGwgdGhlIG5vbnZvbGF0aWxlIHJlZ2lzdGVycyAocjEzIC0gcjMxKSBiZWZvcmUgY2FsbGluZwotICogdGhlIEMgY29kZS4KKyAqIFRoZSBmb3JrL2Nsb25lIGZ1bmN0aW9ucyBuZWVkIHRvIGNvcHkgdGhlIGZ1bGwgcmVnaXN0ZXIgc2V0IGludG8KKyAqIHRoZSBjaGlsZCBwcm9jZXNzLiBUaGVyZWZvcmUgd2UgbmVlZCB0byBzYXZlIGFsbCB0aGUgbm9udm9sYXRpbGUKKyAqIHJlZ2lzdGVycyAocjEzIC0gcjMxKSBiZWZvcmUgY2FsbGluZyB0aGUgQyBjb2RlLgogICovCi0JLmdsb2JsCXBwY19zaWdzdXNwZW5kCi1wcGNfc2lnc3VzcGVuZDoKLQlTQVZFX05WR1BSUyhyMSkKLQlsd3oJcjAsVFJBUChyMSkKLQlybHdpbm0JcjAscjAsMCwwLDMwCQkvKiBjbGVhciBMU0IgdG8gaW5kaWNhdGUgZnVsbCAqLwotCXN0dwlyMCxUUkFQKHIxKQkJLyogcmVnaXN0ZXIgc2V0IHNhdmVkICovCi0JYglzeXNfc2lnc3VzcGVuZAotCi0JLmdsb2JsCXBwY19ydF9zaWdzdXNwZW5kCi1wcGNfcnRfc2lnc3VzcGVuZDoKLQlTQVZFX05WR1BSUyhyMSkKLQlsd3oJcjAsVFJBUChyMSkKLQlybHdpbm0JcjAscjAsMCwwLDMwCi0Jc3R3CXIwLFRSQVAocjEpCi0JYglzeXNfcnRfc2lnc3VzcGVuZAotCiAJLmdsb2JsCXBwY19mb3JrCiBwcGNfZm9yazoKIAlTQVZFX05WR1BSUyhyMSkKQEAgLTQ0NywxNCArNDkwLDYgQEAKIAlzdHcJcjAsVFJBUChyMSkJCS8qIHJlZ2lzdGVyIHNldCBzYXZlZCAqLwogCWIJc3lzX2Nsb25lCiAKLQkuZ2xvYmwJcHBjX3N3YXBjb250ZXh0Ci1wcGNfc3dhcGNvbnRleHQ6Ci0JU0FWRV9OVkdQUlMocjEpCi0JbHd6CXIwLFRSQVAocjEpCi0Jcmx3aW5tCXIwLHIwLDAsMCwzMAkJLyogY2xlYXIgTFNCIHRvIGluZGljYXRlIGZ1bGwgKi8KLQlzdHcJcjAsVFJBUChyMSkJCS8qIHJlZ2lzdGVyIHNldCBzYXZlZCAqLwotCWIJc3lzX3N3YXBjb250ZXh0Ci0KIC8qCiAgKiBUb3AtbGV2ZWwgcGFnZSBmYXVsdCBoYW5kbGluZy4KICAqIFRoaXMgaXMgaW4gYXNzZW1ibGVyIGJlY2F1c2UgaWYgZG9fcGFnZV9mYXVsdCB0ZWxscyB1cyB0aGF0CkBAIC02MjYsMTYgKzY2MSw2IEBACiAJLmxvbmcJcmV0X2Zyb21fZXhjZXB0CiAjZW5kaWYKIAotCS5nbG9ibAlzaWdyZXR1cm5fZXhpdAotc2lncmV0dXJuX2V4aXQ6Ci0Jc3ViaQlyMSxyMyxTVEFDS19GUkFNRV9PVkVSSEVBRAotCXJsd2lubQlyMTIscjEsMCwwLDE4CS8qIGN1cnJlbnRfdGhyZWFkX2luZm8oKSAqLwotCWx3eglyOSxUSV9GTEFHUyhyMTIpCi0JYW5kaS4JcjAscjksX1RJRl9TWVNDQUxMX1RfT1JfQQotCWJlcSsJcmV0X2Zyb21fZXhjZXB0X2Z1bGwKLQlibAlkb19zeXNjYWxsX3RyYWNlX2xlYXZlCi0JLyogZmFsbCB0aHJvdWdoICovCi0KIAkuZ2xvYmwJcmV0X2Zyb21fZXhjZXB0X2Z1bGwKIHJldF9mcm9tX2V4Y2VwdF9mdWxsOgogCVJFU1RfTlZHUFJTKHIxKQpAQCAtNjU4LDcgKzY4Myw3IEBACiAJLyogQ2hlY2sgY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncyAqLwogCXJsd2lubQlyOSxyMSwwLDAsMTgKIAlsd3oJcjksVElfRkxBR1MocjkpCi0JYW5kaS4JcjAscjksKF9USUZfU0lHUEVORElOR3xfVElGX05FRURfUkVTQ0hFRCkKKwlhbmRpLglyMCxyOSwoX1RJRl9TSUdQRU5ESU5HfF9USUZfTkVFRF9SRVNDSEVEfF9USUZfUkVTVE9SRUFMTCkKIAlibmUJZG9fd29yawogCiByZXN0b3JlX3VzZXI6CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvaGVhZF84eHguUyBiL2FyY2gvcHBjL2tlcm5lbC9oZWFkXzh4eC5TCmluZGV4IGRlMDk3ODcuLjNlNmNhN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9oZWFkXzh4eC5TCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9oZWFkXzh4eC5TCkBAIC0zNzUsNiArMzc1LDggQEAKIAlsaXMJcjExLCBzd2FwcGVyX3BnX2RpckBoCiAJb3JpCXIxMSwgcjExLCBzd2FwcGVyX3BnX2RpckBsCiAJcmx3aW1pCXIxMCwgcjExLCAwLCAyLCAxOQorCXN0dwlyMTIsIDE2KHIwKQorCWIgTG9hZExhcmdlRFRMQgogMzoKIAlsd3oJcjExLCAwKHIxMCkJLyogR2V0IHRoZSBsZXZlbCAxIGVudHJ5ICovCiAJcmx3aW5tLglyMTAsIHIxMSwwLDAsMTkJLyogRXh0cmFjdCBwYWdlIGRlc2NyaXB0b3IgcGFnZSBhZGRyZXNzICovCkBAIC00MzAsNiArNDMyLDgxIEBACiBJbnN0cnVjdGlvblRMQkVycm9yOgogCWIJSW5zdHJ1Y3Rpb25BY2Nlc3MKIAorTG9hZExhcmdlRFRMQjoKKwlsaQlyMTIsIDAKKwlsd3oJcjExLCAwKHIxMCkJLyogR2V0IHRoZSBsZXZlbCAxIGVudHJ5ICovCisJcmx3aW5tLglyMTAsIHIxMSwwLDAsMTkJLyogRXh0cmFjdCBwYWdlIGRlc2NyaXB0b3IgcGFnZSBhZGRyZXNzICovCisJYmVxCTNmCQkvKiBJZiB6ZXJvLCBkb24ndCB0cnkgdG8gZmluZCBhIHB0ZSAqLworCisJLyogV2UgaGF2ZSBhIHB0ZSB0YWJsZSwgc28gbG9hZCBmZXRjaCB0aGUgcHRlIGZyb20gdGhlIHRhYmxlLgorCSAqLworCW9yaQlyMTEsIHIxMSwgMQkvKiBTZXQgdmFsaWQgYml0IGluIHBoeXNpY2FsIEwyIHBhZ2UgKi8KKwlET184eHhfQ1BVNigweDNiODAsIHIzKQorCW10c3ByCVNQUk5fTURfVFdDLCByMTEJLyogTG9hZCBwdGUgdGFibGUgYmFzZSBhZGRyZXNzICovCisJbWZzcHIJcjEwLCBTUFJOX01EX1RXQwkvKiAuLi4uYW5kIGdldCB0aGUgcHRlIGFkZHJlc3MgKi8KKwlsd3oJcjEwLCAwKHIxMCkJLyogR2V0IHRoZSBwdGUgKi8KKworCS8qIEluc2VydCB0aGUgR3VhcmRlZCBmbGFnIGludG8gdGhlIFRXQyBmcm9tIHRoZSBMaW51eCBQVEUuCisJICogSXQgaXMgYml0IDI3IG9mIGJvdGggdGhlIExpbnV4IFBURSBhbmQgdGhlIFRXQyAoYXQgbGVhc3QKKwkgKiBJIGdvdCB0aGF0IHJpZ2h0IDotKS4gIEl0IHdpbGwgYmUgYmV0dGVyIHdoZW4gd2UgY2FuIHB1dAorCSAqIHRoaXMgaW50byB0aGUgTGludXggcGdkL3BtZCBhbmQgbG9hZCBpdCBpbiB0aGUgb3BlcmF0aW9uCisJICogYWJvdmUuCisJICovCisJcmx3aW1pCXIxMSwgcjEwLCAwLCAyNywgMjcKKworCXJsd2ltaSAgcjEyLCByMTAsIDAsIDAsIDkJLyogZXh0cmFjdCBwaHlzLiBhZGRyICovCisJbWZzcHIJcjMsIFNQUk5fTURfRVBOCisJcmx3aW5tCXIzLCByMywgMCwgMCwgOQkJLyogZXh0cmFjdCB2aXJ0dWFsIGFkZHJlc3MgKi8KKwl0b3BoeXMocjMsIHIzKQorCWNtcHcJcjMsIHIxMgkJCS8qIG9ubHkgdXNlIDhNIHBhZ2UgaWYgaXQgaXMgYSBkaXJlY3QgCisJCQkJCSAgIGtlcm5lbCBtYXBwaW5nICovCisJYm5lCTFmCisJb3JpICAgICByMTEsIHIxMSwgTURfUFM4TUVHCisJbGkJcjEyLCAxCisJYgkyZgorMToKKwlsaQlyMTIsIDAJCS8qIGNhbid0IHVzZSA4TUIgVExCLCBzbyB6ZXJvIHIxMi4gKi8KKzI6CisJRE9fOHh4X0NQVTYoMHgzYjgwLCByMykKKwltdHNwcglTUFJOX01EX1RXQywgcjExCisKKwkvKiBUaGUgTGludXggUFRFIHdvbid0IGdvIGV4YWN0bHkgaW50byB0aGUgTU1VIFRMQi4KKwkgKiBTb2Z0d2FyZSBpbmRpY2F0b3IgYml0cyAyMSwgMjIgYW5kIDI4IG11c3QgYmUgY2xlYXIuCisJICogU29mdHdhcmUgaW5kaWNhdG9yIGJpdHMgMjQsIDI1LCAyNiwgYW5kIDI3IG11c3QgYmUKKwkgKiBzZXQuICBBbGwgb3RoZXIgTGludXggUFRFIGJpdHMgY29udHJvbCB0aGUgYmVoYXZpb3IKKwkgKiBvZiB0aGUgTU1VLgorCSAqLworMzoJbGkJcjExLCAweDAwZjAKKwlybHdpbWkJcjEwLCByMTEsIDAsIDI0LCAyOAkvKiBTZXQgMjQtMjcsIGNsZWFyIDI4ICovCisJY21wd2kgICByMTIsIDEKKwlibmUgNGYKKwlvcmkgICAgIHIxMCwgcjEwLCAweDgKKworCW1mc3ByCXIxMiwgU1BSTl9NRF9FUE4KKwlsaXMJcjMsIDB4ZmY4MAkJLyogMTAtMTkgbXVzdCBiZSBjbGVhciBmb3IgOE1CIFRMQiAqLworCW9yaQlyMywgcjMsIDB4MGZmZgorCWFuZAlyMTIsIHIzLCByMTIKKwlET184eHhfQ1BVNigweDM3ODAsIHIzKQorCW10c3ByCVNQUk5fTURfRVBOLCByMTIKKworCWxpcwlyMywgMHhmZjgwCQkvKiAxMC0xOSBtdXN0IGJlIGNsZWFyIGZvciA4TUIgVExCICovCisJb3JpCXIzLCByMywgMHgwZmZmCisJYW5kCXIxMCwgcjMsIHIxMAorNDoKKwlET184eHhfQ1BVNigweDNkODAsIHIzKQorCW10c3ByCVNQUk5fTURfUlBOLCByMTAJLyogVXBkYXRlIFRMQiBlbnRyeSAqLworCisJbWZzcHIJcjEwLCBTUFJOX01fVFcJLyogUmVzdG9yZSByZWdpc3RlcnMgKi8KKwlsd3oJcjExLCAwKHIwKQorCW10Y3IJcjExCisJbHd6CXIxMSwgNChyMCkKKworCWx3eglyMTIsIDE2KHIwKQorI2lmZGVmIENPTkZJR184eHhfQ1BVNgorCWx3eglyMywgOChyMCkKKyNlbmRpZgorCXJmaQorCiAvKiBUaGlzIGlzIHRoZSBkYXRhIFRMQiBlcnJvciBvbiB0aGUgTVBDOHh4LiAgVGhpcyBjb3VsZCBiZSBkdWUgdG8KICAqIG1hbnkgcmVhc29ucywgaW5jbHVkaW5nIGEgZGlydHkgdXBkYXRlIHRvIGEgcHRlLiAgV2UgY2FuIGNhdGNoIHRoYXQKICAqIG9uZSBoZXJlLCBidXQgYW55dGhpbmcgZWxzZSBpcyBhbiBlcnJvci4gIEZpcnN0LCB3ZSB0cmFjayBkb3duIHRoZQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL21hY2hpbmVfa2V4ZWMuYyBiL2FyY2gvcHBjL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKaW5kZXggYTg4MmIwZC4uODRkNjVhOCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL21hY2hpbmVfa2V4ZWMuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCkBAIC0yOCwxMiArMjgsNiBAQAogY29uc3QgZXh0ZXJuIHVuc2lnbmVkIGNoYXIgcmVsb2NhdGVfbmV3X2tlcm5lbFtdOwogY29uc3QgZXh0ZXJuIHVuc2lnbmVkIGludCByZWxvY2F0ZV9uZXdfa2VybmVsX3NpemU7CiAKLS8qCi0gKiBQcm92aWRlIGEgZHVtbXkgY3Jhc2hfbm90ZXMgZGVmaW5pdGlvbiB3aGlsZSBjcmFzaCBkdW1wIGFycml2ZXMgdG8gcHBjLgotICogVGhpcyBwcmV2ZW50cyBicmVha2FnZSBvZiBjcmFzaF9ub3RlcyBhdHRyaWJ1dGUgaW4ga2VybmVsL2tzeXNmcy5jLgotICovCi1ub3RlX2J1Zl90IGNyYXNoX25vdGVzW05SX0NQVVNdOwotCiB2b2lkIG1hY2hpbmVfc2h1dGRvd24odm9pZCkKIHsKIAlpZiAocHBjX21kLm1hY2hpbmVfc2h1dGRvd24pCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvbWlzYy5TIGIvYXJjaC9wcGMva2VybmVsL21pc2MuUwppbmRleCA1ZTYxMTI0Li5jMzQyN2VlIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvbWlzYy5TCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9taXNjLlMKQEAgLTIwNCw3OCArMjA0LDYgQEAKIAltdGN0cglyNQogCWJjdHIKIAotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9GUkVRX1BNQUMpICYmIGRlZmluZWQoQ09ORklHXzZ4eCkKLQotLyogVGhpcyBnZXRzIGNhbGxlZCBieSB2aWEtcG11LmMgdG8gc3dpdGNoIHRoZSBQTEwgc2VsZWN0aW9uCi0gKiBvbiA3NTBmeCBDUFUuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJlYWxseSBiZSBtb3ZlZCB0byBzb21lCi0gKiBvdGhlciBwbGFjZSAoYXMgbW9zdCBvZiB0aGUgY3B1ZnJlcSBjb2RlIGluIHZpYS1wbXUKLSAqLwotX0dMT0JBTChsb3dfY2hvb3NlXzc1MGZ4X3BsbCkKLQkvKiBDbGVhciBNU1I6RUUgKi8KLQltZm1zcglyNwotCXJsd2lubQlyMCxyNywwLDE3LDE1Ci0JbXRtc3IJcjAKLQotCS8qIElmIHN3aXRjaGluZyB0byBQTEwxLCBkaXNhYmxlIEhJRDA6QlRJQyAqLwotCWNtcGx3aQljcjAscjMsMAotCWJlcQkxZgotCW1mc3ByCXI1LFNQUk5fSElEMAotCXJsd2lubQlyNSxyNSwwLDI3LDI1Ci0Jc3luYwotCW10c3ByCVNQUk5fSElEMCxyNQotCWlzeW5jCi0Jc3luYwotCi0xOgotCS8qIENhbGMgbmV3IEhJRDEgdmFsdWUgKi8KLQltZnNwcglyNCxTUFJOX0hJRDEJLyogQnVpbGQgYSBISUQxOlBTIGJpdCBmcm9tIHBhcmFtZXRlciAqLwotCXJsd2lubQlyNSxyMywxNiwxNSwxNQkvKiBDbGVhciBvdXQgSElEMTpQUyBmcm9tIHZhbHVlIHJlYWQgKi8KLQlybHdpbm0JcjQscjQsMCwxNiwxNAkvKiBDb3VsZCBoYXZlIEkgdXNlZCBybHdpbWkgaGVyZSA/ICovCi0Jb3IJcjQscjQscjUKLQltdHNwcglTUFJOX0hJRDEscjQKLQotCS8qIFN0b3JlIG5ldyBISUQxIGltYWdlICovCi0Jcmx3aW5tCXI2LHIxLDAsMCwxOAotCWx3eglyNixUSV9DUFUocjYpCi0Jc2x3aQlyNixyNiwyCi0JYWRkaXMJcjYscjYsbmFwX3NhdmVfaGlkMUBoYQotCXN0dwlyNCxuYXBfc2F2ZV9oaWQxQGwocjYpCi0KLQkvKiBJZiBzd2l0Y2hpbmcgdG8gUExMMCwgZW5hYmxlIEhJRDA6QlRJQyAqLwotCWNtcGx3aQljcjAscjMsMAotCWJuZQkxZgotCW1mc3ByCXI1LFNQUk5fSElEMAotCW9yaQlyNSxyNSxISUQwX0JUSUMKLQlzeW5jCi0JbXRzcHIJU1BSTl9ISUQwLHI1Ci0JaXN5bmMKLQlzeW5jCi0KLTE6Ci0JLyogUmV0dXJuICovCi0JbXRtc3IJcjcKLQlibHIKLQotX0dMT0JBTChsb3dfY2hvb3NlXzc0NDdhX2RmcykKLQkvKiBDbGVhciBNU1I6RUUgKi8KLQltZm1zcglyNwotCXJsd2lubQlyMCxyNywwLDE3LDE1Ci0JbXRtc3IJcjAKLQkKLQkvKiBDYWxjIG5ldyBISUQxIHZhbHVlICovCi0JbWZzcHIJcjQsU1BSTl9ISUQxCi0JaW5zcndpCXI0LHIzLDEsOQkvKiBpbnNlcnQgcGFyYW1ldGVyIGludG8gYml0IDkgKi8KLQlzeW5jCi0JbXRzcHIJU1BSTl9ISUQxLHI0Ci0Jc3luYwotCWlzeW5jCi0KLQkvKiBSZXR1cm4gKi8KLQltdG1zcglyNwotCWJscgotCi0jZW5kaWYgLyogQ09ORklHX0NQVV9GUkVRX1BNQUMgJiYgQ09ORklHXzZ4eCAqLwotCiAvKgogICogY29tcGxlbWVudCBtYXNrIG9uIHRoZSBtc3IgdGhlbiAib3IiIHNvbWUgdmFsdWVzIG9uLgogICogICAgIF9ubWFza19hbmRfb3JfbXNyKG5tYXNrLCB2YWx1ZV90b19vcikKQEAgLTExOTcsNyArMTEyNSw3IEBACiAJLmxvbmcgc3lzX3NzZXRtYXNrCiAJLmxvbmcgc3lzX3NldHJldWlkCS8qIDcwICovCiAJLmxvbmcgc3lzX3NldHJlZ2lkCi0JLmxvbmcgcHBjX3NpZ3N1c3BlbmQKKwkubG9uZyBzeXNfc2lnc3VzcGVuZAogCS5sb25nIHN5c19zaWdwZW5kaW5nCiAJLmxvbmcgc3lzX3NldGhvc3RuYW1lCiAJLmxvbmcgc3lzX3NldHJsaW1pdAkvKiA3NSAqLwpAQCAtMTMwMyw3ICsxMjMxLDcgQEAKIAkubG9uZyBzeXNfcnRfc2lncGVuZGluZwkvKiAxNzUgKi8KIAkubG9uZyBzeXNfcnRfc2lndGltZWR3YWl0CiAJLmxvbmcgc3lzX3J0X3NpZ3F1ZXVlaW5mbwotCS5sb25nIHBwY19ydF9zaWdzdXNwZW5kCisJLmxvbmcgc3lzX3J0X3NpZ3N1c3BlbmQKIAkubG9uZyBzeXNfcHJlYWQ2NAogCS5sb25nIHN5c19wd3JpdGU2NAkvKiAxODAgKi8KIAkubG9uZyBzeXNfY2hvd24KQEAgLTEzNzQsNyArMTMwMiw3IEBACiAJLmxvbmcgc3lzX2Nsb2NrX2dldHRpbWUKIAkubG9uZyBzeXNfY2xvY2tfZ2V0cmVzCiAJLmxvbmcgc3lzX2Nsb2NrX25hbm9zbGVlcAotCS5sb25nIHBwY19zd2FwY29udGV4dAorCS5sb25nIHN5c19zd2FwY29udGV4dAogCS5sb25nIHN5c190Z2tpbGwJLyogMjUwICovCiAJLmxvbmcgc3lzX3V0aW1lcwogCS5sb25nIHN5c19zdGF0ZnM2NApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL3BjaS5jIGIvYXJjaC9wcGMva2VybmVsL3BjaS5jCmluZGV4IGY3ZmFlNWYuLjA0ZDA0YzUgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9wY2kuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvcGNpLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29tbW9uIHBtYWMvcHJlcC9jaHJwIHBjaSByb3V0aW5lcy4gLS0gQ29ydAorICogQ29tbW9uIHByZXAvY2hycCBwY2kgcm91dGluZXMuIC0tIENvcnQKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CkBAIC01MCw4ICs1MCw3IEBACiBzdGF0aWMgdTgqIHBjaV90b19PRl9idXNfbWFwOwogI2VuZGlmCiAKLS8qIEJ5IGRlZmF1bHQsIHdlIGRvbid0IHJlLWFzc2lnbiBidXMgbnVtYmVycy4gV2UgZG8gdGhpcyBvbmx5IG9uCi0gKiBzb21lIHBtYWNzCisvKiBCeSBkZWZhdWx0LCB3ZSBkb24ndCByZS1hc3NpZ24gYnVzIG51bWJlcnMuCiAgKi8KIGludCBwY2lfYXNzaWduX2FsbF9idXNlczsKIApAQCAtNTAzLDcgKzUwMiw3IEBACiAJdTE2IGNvbW1hbmQ7CiAJc3RydWN0IHJlc291cmNlICpyOwogCi0Jd2hpbGUgKChkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSkgIT0gTlVMTCkgeworCWZvcl9lYWNoX3BjaV9kZXYoZGV2KSB7CiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjb21tYW5kKTsKIAkJZm9yIChpZHggPSAwOyBpZHggPCA2OyBpZHgrKykgewogCQkJciA9ICZkZXYtPnJlc291cmNlW2lkeF07CkBAIC01NDAsNyArNTM5LDcgQEAKIAlpbnQgaWR4OwogCXN0cnVjdCByZXNvdXJjZSAqcjsKIAotCXdoaWxlICgoZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldikpICE9IE5VTEwpIHsKKwlmb3JfZWFjaF9wY2lfZGV2KGRldikgewogCQlpbnQgY2xhc3MgPSBkZXYtPmNsYXNzID4+IDg7CiAKIAkJLyogRG9uJ3QgdG91Y2ggY2xhc3NsZXNzIGRldmljZXMgYW5kIGhvc3QgYnJpZGdlcyAqLwpAQCAtNzgwLDE3ICs3NzksNiBAQAogCQlyZXR1cm4gTlVMTDsKIAogCS8qIEZpeHVwIGJ1cyBudW1iZXIgYWNjb3JkaW5nIHRvIHdoYXQgT0YgdGhpbmsgaXQgaXMuICovCi0jaWZkZWYgQ09ORklHX1BQQ19QTUFDCi0JLyogVGhlIEc1IG5lZWQgYSBzcGVjaWFsIGNhc2UgaGVyZS4gQmFzaWNhbGx5LCB3ZSBkb24ndCByZW1hcCBhbGwKLQkgKiBidXNzZXMgb24gaXQgc28gd2UgZG9uJ3QgY3JlYXRlIHRoZSBwY2ktT0YtbWFwLiBIb3dldmVyLCB3ZSBkbwotCSAqIHJlbWFwIHRoZSBBR1AgYnVzIGFuZCBzbyBoYXZlIHRvIGRlYWwgd2l0aCBpdC4gQSBmdXR1cmUgYmV0dGVyCi0JICogZml4IGhhcyB0byBiZSBkb25lIGJ5IG1ha2luZyB0aGUgcmVtYXBwaW5nIHBlci1ob3N0IGFuZCBhbHdheXMKLQkgKiBmaWxsaW5nIHRoZSBwY2lfdG9fT0YgbWFwLiAtLUJlbkgKLQkgKi8KLQlpZiAoX21hY2hpbmUgPT0gX01BQ0hfUG1hYyAmJiBidXNuciA+PSAweGYwKQotCQlidXNuciAtPSAweGYwOwotCWVsc2UKLSNlbmRpZgogCWlmIChwY2lfdG9fT0ZfYnVzX21hcCkKIAkJYnVzbnIgPSBwY2lfdG9fT0ZfYnVzX21hcFtidXNucl07CiAJaWYgKGJ1c25yID09IDB4ZmYpCkBAIC04MTUsOCArODAzLDcgQEAKICAqIHRvIHNldCBwY2lfYXNzaWduX2FsbF9idXNlcyB0byAxIGFuZCBzdGlsbCB1c2UgUlRBUyBmb3IgUENJCiAgKiBjb25maWcgY3ljbGVzLgogICovCi1zdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqCi1wY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2Uoc3RydWN0IGRldmljZV9ub2RlKiBub2RlKQorc3RydWN0IHBjaV9jb250cm9sbGVyKiBwY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2Uoc3RydWN0IGRldmljZV9ub2RlKiBub2RlKQogewogCWlmICghaGF2ZV9vZikKIAkJcmV0dXJuIE5VTEw7CkBAIC04NjgsMTQgKzg1NSwxNSBAQAogCSAqLwogCWlmICghcGNpX3RvX09GX2J1c19tYXApCiAJCXJldHVybiAwOwotCXdoaWxlICgoZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldikpICE9IE5VTEwpIHsKLQkJaWYgKHBjaV90b19PRl9idXNfbWFwW2Rldi0+YnVzLT5udW1iZXJdICE9ICpidXMpCi0JCQljb250aW51ZTsKLQkJaWYgKGRldi0+ZGV2Zm4gIT0gKmRldmZuKQotCQkJY29udGludWU7Ci0JCSpidXMgPSBkZXYtPmJ1cy0+bnVtYmVyOwotCQlyZXR1cm4gMDsKLQl9CisKKwlmb3JfZWFjaF9wY2lfZGV2KGRldikKKwkJaWYgKHBjaV90b19PRl9idXNfbWFwW2Rldi0+YnVzLT5udW1iZXJdID09ICpidXMgJiYKKwkJCQlkZXYtPmRldmZuID09ICpkZXZmbikgeworCQkJKmJ1cyA9IGRldi0+YnVzLT5udW1iZXI7CisJCQlwY2lfZGV2X3B1dChkZXYpOworCQkJcmV0dXJuIDA7CisJCX0KKwogCXJldHVybiAtRU5PREVWOwogfQogRVhQT1JUX1NZTUJPTChwY2lfZGV2aWNlX2Zyb21fT0Zfbm9kZSk7CkBAIC05NDIsNyArOTMwLDcgQEAKIAl3aGlsZSAocmFuZ2VzICYmIChybGVuIC09IG5wICogc2l6ZW9mKHVuc2lnbmVkIGludCkpID49IDApIHsKIAkJcmVzID0gTlVMTDsKIAkJc2l6ZSA9IHJhbmdlc1tuYSs0XTsKLQkJc3dpdGNoIChyYW5nZXNbMF0gPj4gMjQpIHsKKwkJc3dpdGNoICgocmFuZ2VzWzBdID4+IDI0KSAmIDB4MykgewogCQljYXNlIDE6CQkvKiBJL08gc3BhY2UgKi8KIAkJCWlmIChyYW5nZXNbMl0gIT0gMCkKIAkJCQlicmVhazsKQEAgLTk1Niw2ICs5NDQsOCBAQAogCQkJcmVzID0gJmhvc2UtPmlvX3Jlc291cmNlOwogCQkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfSU87CiAJCQlyZXMtPnN0YXJ0ID0gcmFuZ2VzWzJdOworCQkJREJHKCJQQ0k6IElPIDB4JWx4IC0+IDB4JWx4XG4iLAorCQkJCSAgICByZXMtPnN0YXJ0LCByZXMtPnN0YXJ0ICsgc2l6ZSAtIDEpOwogCQkJYnJlYWs7CiAJCWNhc2UgMjoJCS8qIG1lbW9yeSBzcGFjZSAqLwogCQkJbWVtbm8gPSAwOwpAQCAtOTczLDcgKzk2MywxMSBAQAogCQkJaWYgKG1lbW5vIDwgMykgewogCQkJCXJlcyA9ICZob3NlLT5tZW1fcmVzb3VyY2VzW21lbW5vXTsKIAkJCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisJCQkJaWYocmFuZ2VzWzBdICYgMHg0MDAwMDAwMCkKKwkJCQkJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX1BSRUZFVENIOwogCQkJCXJlcy0+c3RhcnQgPSByYW5nZXNbbmErMl07CisJCQkJREJHKCJQQ0k6IE1FTVslZF0gMHglbHggLT4gMHglbHhcbiIsIG1lbW5vLAorCQkJCQkgICAgcmVzLT5zdGFydCwgcmVzLT5zdGFydCArIHNpemUgLSAxKTsKIAkJCX0KIAkJCWJyZWFrOwogCQl9CkBAIC0xMDM0LDIxNiArMTAyOCw2IEBACiB9CiAKIAotI2lmZGVmIENPTkZJR19QUENfUE1BQwotLyoKLSAqIFRoaXMgc2V0IG9mIHJvdXRpbmVzIGNoZWNrcyBmb3IgUENJPC0+UENJIGJyaWRnZXMgdGhhdCBoYXZlIGNsb3NlZAotICogSU8gcmVzb3VyY2VzIGFuZCBoYXZlIGNoaWxkIGRldmljZXMuIEl0IHRyaWVzIHRvIHJlLW9wZW4gYW4gSU8KLSAqIHdpbmRvdyBvbiB0aGVtLgotICoKLSAqIFRoaXMgaXMgYSBfdGVtcG9yYXJ5XyBmaXggdG8gd29ya2Fyb3VuZCBhIHByb2JsZW0gd2l0aCBBcHBsZSdzIE9GCi0gKiBjbG9zaW5nIElPIHdpbmRvd3Mgb24gUDJQIGJyaWRnZXMgd2hlbiB0aGUgT0YgZHJpdmVycyBvZiBjYXJkcwotICogYmVsb3cgdGhpcyBicmlkZ2UgZG9uJ3QgY2xhaW0gYW55IElPIHJhbmdlICh0eXBpY2FsbHkgQVRJIG9yCi0gKiBBZGFwdGVjKS4KLSAqCi0gKiBBIG1vcmUgY29tcGxldGUgZml4IHdvdWxkIGJlIHRvIHVzZSBkcml2ZXJzL3BjaS9zZXR1cC1idXMuYywgd2hpY2gKLSAqIGludm9sdmVzIGEgd29ya2luZyBwY2liaW9zX2ZpeHVwX3BidXNfcmFuZ2VzKCksIHNvbWUgbW9yZSBjYXJlIGFib3V0Ci0gKiBvcmRlcmluZyB3aGVuIGNyZWF0aW5nIHRoZSBob3N0IGJ1cyByZXNvdXJjZXMsIGFuZCBtYXliZSBhIGZldyBtb3JlCi0gKiBtaW5vciB0d2Vha3MKLSAqLwotCi0vKiBJbml0aWFsaXplIGJyaWRnZXMgd2l0aCBiYXNlL2xpbWl0IHZhbHVlcyB3ZSBoYXZlIGNvbGxlY3RlZCAqLwotc3RhdGljIHZvaWQgX19pbml0Ci1kb191cGRhdGVfcDJwX2lvX3Jlc291cmNlKHN0cnVjdCBwY2lfYnVzICpidXMsIGludCBlbmFibGVfdmdhKQotewotCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2UgPSBidXMtPnNlbGY7Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlID0gKHN0cnVjdCBwY2lfY29udHJvbGxlciAqKWJyaWRnZS0+c3lzZGF0YTsKLQl1MzIgbDsKLQl1MTYgdzsKLQlzdHJ1Y3QgcmVzb3VyY2UgcmVzOwotCi0JaWYgKGJ1cy0+cmVzb3VyY2VbMF0gPT0gTlVMTCkKLQkJcmV0dXJuOwotIAlyZXMgPSAqKGJ1cy0+cmVzb3VyY2VbMF0pOwotCi0JREJHKCJSZW1hcHBpbmcgQnVzICVkLCBicmlkZ2U6ICVzXG4iLCBidXMtPm51bWJlciwgcGNpX25hbWUoYnJpZGdlKSk7Ci0JcmVzLnN0YXJ0IC09ICgodW5zaWduZWQgbG9uZykgaG9zZS0+aW9fYmFzZV92aXJ0IC0gaXNhX2lvX2Jhc2UpOwotCXJlcy5lbmQgLT0gKCh1bnNpZ25lZCBsb25nKSBob3NlLT5pb19iYXNlX3ZpcnQgLSBpc2FfaW9fYmFzZSk7Ci0JREJHKCIgIElPIHdpbmRvdzogJTA4bHgtJTA4bHhcbiIsIHJlcy5zdGFydCwgcmVzLmVuZCk7Ci0KLQkvKiBTZXQgdXAgdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBQQ0kgSS9PIHNlZ21lbnQgZm9yIHRoaXMgYnVzLiAqLwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChicmlkZ2UsIFBDSV9JT19CQVNFLCAmbCk7Ci0JbCAmPSAweGZmZmYwMDBmOwotCWwgfD0gKHJlcy5zdGFydCA+PiA4KSAmIDB4MDBmMDsKLQlsIHw9IHJlcy5lbmQgJiAweGYwMDA7Ci0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmlkZ2UsIFBDSV9JT19CQVNFLCBsKTsKLQotCWlmICgobCAmIFBDSV9JT19SQU5HRV9UWVBFX01BU0spID09IFBDSV9JT19SQU5HRV9UWVBFXzMyKSB7Ci0JCWwgPSAocmVzLnN0YXJ0ID4+IDE2KSB8IChyZXMuZW5kICYgMHhmZmZmMDAwMCk7Ci0JCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfSU9fQkFTRV9VUFBFUjE2LCBsKTsKLQl9Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChicmlkZ2UsIFBDSV9DT01NQU5ELCAmdyk7Ci0JdyB8PSBQQ0lfQ09NTUFORF9JTzsKLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYnJpZGdlLCBQQ0lfQ09NTUFORCwgdyk7Ci0KLSNpZiAwIC8qIEVuYWJsaW5nIHRoaXMgY2F1c2VzIFhGcmVlIDQuMi4wIHRvIGhhbmcgZHVyaW5nIFBDSSBwcm9iZSAqLwotCWlmIChlbmFibGVfdmdhKSB7Ci0JCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJyaWRnZSwgUENJX0JSSURHRV9DT05UUk9MLCAmdyk7Ci0JCXcgfD0gUENJX0JSSURHRV9DVExfVkdBOwotCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYnJpZGdlLCBQQ0lfQlJJREdFX0NPTlRST0wsIHcpOwotCX0KLSNlbmRpZgotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHByZXR0eSBiYXNpYyBhbmQgYWN0dWFsbHkgcXVpdGUgYnJva2VuIGZvciB0aGUKLSAqIGdlbmVyYWwgY2FzZSwgaXQncyBlbm91Z2ggZm9yIHVzIHJpZ2h0IG5vdyB0aG91Z2guIEl0J3Mgc3VwcG9zZWQKLSAqIHRvIHRlbGwgdXMgaWYgd2UgbmVlZCB0byBvcGVuIGFuIElPIHJhbmdlIGF0IGFsbCBvciBub3QgYW5kIHdoYXQKLSAqIHNpemUuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0Ci1jaGVja19mb3JfaW9fY2hpbGRzKHN0cnVjdCBwY2lfYnVzICpidXMsIHN0cnVjdCByZXNvdXJjZSogcmVzLCBpbnQgKmZvdW5kX3ZnYSkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2OwotCWludAlpOwotCWludAlyYyA9IDA7Ci0KLSNkZWZpbmUgcHVzaF9lbmQocmVzLCBzaXplKSBkbyB7IHVuc2lnbmVkIGxvbmcgX19zeiA9IChzaXplKSA7IFwKLQlyZXMtPmVuZCA9ICgocmVzLT5lbmQgKyBfX3N6KSAvIChfX3N6ICsgMSkpICogKF9fc3ogKyAxKSArIF9fc3o7IFwKLSAgICB9IHdoaWxlICgwKQotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7Ci0JCXUxNiBjbGFzcyA9IGRldi0+Y2xhc3MgPj4gODsKLQotCQlpZiAoY2xhc3MgPT0gUENJX0NMQVNTX0RJU1BMQVlfVkdBIHx8Ci0JCSAgICBjbGFzcyA9PSBQQ0lfQ0xBU1NfTk9UX0RFRklORURfVkdBKQotCQkJKmZvdW5kX3ZnYSA9IDE7Ci0JCWlmIChjbGFzcyA+PiA4ID09IFBDSV9CQVNFX0NMQVNTX0JSSURHRSAmJiBkZXYtPnN1Ym9yZGluYXRlKQotCQkJcmMgfD0gY2hlY2tfZm9yX2lvX2NoaWxkcyhkZXYtPnN1Ym9yZGluYXRlLCByZXMsIGZvdW5kX3ZnYSk7Ci0JCWlmIChjbGFzcyA9PSBQQ0lfQ0xBU1NfQlJJREdFX0NBUkRCVVMpCi0JCQlwdXNoX2VuZChyZXMsIDB4ZmZmKTsKLQotCQlmb3IgKGk9MDsgaTxQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7Ci0JCQlzdHJ1Y3QgcmVzb3VyY2UgKnI7Ci0JCQl1bnNpZ25lZCBsb25nIHJfc2l6ZTsKLQotCQkJaWYgKGRldi0+Y2xhc3MgPj4gOCA9PSBQQ0lfQ0xBU1NfQlJJREdFX1BDSQotCQkJICAgICYmIGkgPj0gUENJX0JSSURHRV9SRVNPVVJDRVMpCi0JCQkJY29udGludWU7Ci0JCQlyID0gJmRldi0+cmVzb3VyY2VbaV07Ci0JCQlyX3NpemUgPSByLT5lbmQgLSByLT5zdGFydDsKLQkJCWlmIChyX3NpemUgPCAweGZmZikKLQkJCQlyX3NpemUgPSAweGZmZjsKLQkJCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8gJiYgKHJfc2l6ZSkgIT0gMCkgewotCQkJCXJjID0gMTsKLQkJCQlwdXNoX2VuZChyZXMsIHJfc2l6ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIEhlcmUgd2Ugc2NhbiBhbGwgUDJQIGJyaWRnZXMgb2YgYSBnaXZlbiBsZXZlbCB0aGF0IGhhdmUgYSBjbG9zZWQKLSAqIElPIHdpbmRvdy4gTm90ZSB0aGF0IHRoZSB0ZXN0IGZvciB0aGUgcHJlc2VuY2Ugb2YgYSBWR0EgY2FyZCBzaG91bGQKLSAqIGJlIGltcHJvdmVkIHRvIHRha2UgaW50byBhY2NvdW50IGFscmVhZHkgY29uZmlndXJlZCBQMlAgYnJpZGdlcywKLSAqIGN1cnJlbnRseSwgd2UgZG9uJ3Qgc2VlIHRoZW0gYW5kIG1pZ2h0IGVuZCB1cCBjb25maWd1cmluZyAyIGJyaWRnZXMKLSAqIHdpdGggVkdBIHBhc3MgdGhyb3VnaCBlbmFibGVkCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdAotZG9fZml4dXBfcDJwX2xldmVsKHN0cnVjdCBwY2lfYnVzICpidXMpCi17Ci0Jc3RydWN0IHBjaV9idXMgKmI7Ci0JaW50IGksIHBhcmVudF9pbzsKLQlpbnQgaGFzX3ZnYSA9IDA7Ci0KLQlmb3IgKHBhcmVudF9pbz0wOyBwYXJlbnRfaW88NDsgcGFyZW50X2lvKyspCi0JCWlmIChidXMtPnJlc291cmNlW3BhcmVudF9pb10KLQkJICAgICYmIGJ1cy0+cmVzb3VyY2VbcGFyZW50X2lvXS0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQotCQkJYnJlYWs7Ci0JaWYgKHBhcmVudF9pbyA+PSA0KQotCQlyZXR1cm47Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGIsICZidXMtPmNoaWxkcmVuLCBub2RlKSB7Ci0JCXN0cnVjdCBwY2lfZGV2ICpkID0gYi0+c2VsZjsKLQkJc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlID0gKHN0cnVjdCBwY2lfY29udHJvbGxlciAqKWQtPnN5c2RhdGE7Ci0JCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gYi0+cmVzb3VyY2VbMF07Ci0JCXN0cnVjdCByZXNvdXJjZSB0bXBfcmVzOwotCQl1bnNpZ25lZCBsb25nIG1heDsKLQkJaW50IGZvdW5kX3ZnYSA9IDA7Ci0KLQkJbWVtc2V0KCZ0bXBfcmVzLCAwLCBzaXplb2YodG1wX3JlcykpOwotCQl0bXBfcmVzLnN0YXJ0ID0gYnVzLT5yZXNvdXJjZVtwYXJlbnRfaW9dLT5zdGFydDsKLQotCQkvKiBXZSBkb24ndCBsZXQgbG93IGFkZHJlc3NlcyBnbyB0aHJvdWdoIHRoYXQgY2xvc2VkIFAyUCBicmlkZ2UsIHdlbGwsCi0JCSAqIHRoYXQgbWF5IG5vdCBiZSBuZWNlc3NhcnkgYnV0IEkgZmVlbCBzYWZlciB0aGF0IHdheQotCQkgKi8KLQkJaWYgKHRtcF9yZXMuc3RhcnQgPT0gMCkKLQkJCXRtcF9yZXMuc3RhcnQgPSAweDEwMDA7Ci0JCi0JCWlmICghbGlzdF9lbXB0eSgmYi0+ZGV2aWNlcykgJiYgcmVzICYmIHJlcy0+ZmxhZ3MgPT0gMCAmJgotCQkgICAgcmVzICE9IGJ1cy0+cmVzb3VyY2VbcGFyZW50X2lvXSAmJgotCQkgICAgKGQtPmNsYXNzID4+IDgpID09IFBDSV9DTEFTU19CUklER0VfUENJICYmCi0JCSAgICBjaGVja19mb3JfaW9fY2hpbGRzKGIsICZ0bXBfcmVzLCAmZm91bmRfdmdhKSkgewotCQkJdTggaW9fYmFzZV9sbzsKLQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiRml4aW5nIHVwIElPIGJ1cyAlc1xuIiwgYi0+bmFtZSk7Ci0KLQkJCWlmIChmb3VuZF92Z2EpIHsKLQkJCQlpZiAoaGFzX3ZnYSkgewotCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTa2lwcGluZyBWR0EsIGFscmVhZHkgYWN0aXZlIgotCQkJCQkgICAgIiBvbiBidXMgc2VnbWVudFxuIik7Ci0JCQkJCWZvdW5kX3ZnYSA9IDA7Ci0JCQkJfSBlbHNlCi0JCQkJCWhhc192Z2EgPSAxOwotCQkJfQotCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZCwgUENJX0lPX0JBU0UsICZpb19iYXNlX2xvKTsKLQotCQkJaWYgKChpb19iYXNlX2xvICYgUENJX0lPX1JBTkdFX1RZUEVfTUFTSykgPT0gUENJX0lPX1JBTkdFX1RZUEVfMzIpCi0JCQkJbWF4ID0gKCh1bnNpZ25lZCBsb25nKSBob3NlLT5pb19iYXNlX3ZpcnQKLQkJCQkJLSBpc2FfaW9fYmFzZSkgKyAweGZmZmZmZmZmOwotCQkJZWxzZQotCQkJCW1heCA9ICgodW5zaWduZWQgbG9uZykgaG9zZS0+aW9fYmFzZV92aXJ0Ci0JCQkJCS0gaXNhX2lvX2Jhc2UpICsgMHhmZmZmOwotCi0JCQkqcmVzID0gdG1wX3JlczsKLQkJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX0lPOwotCQkJcmVzLT5uYW1lID0gYi0+bmFtZTsKLQkJCi0JCQkvKiBGaW5kIGEgcmVzb3VyY2UgaW4gdGhlIHBhcmVudCB3aGVyZSB3ZSBjYW4gYWxsb2NhdGUgKi8KLQkJCWZvciAoaSA9IDAgOyBpIDwgNDsgaSsrKSB7Ci0JCQkJc3RydWN0IHJlc291cmNlICpyID0gYnVzLT5yZXNvdXJjZVtpXTsKLQkJCQlpZiAoIXIpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmICgoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSA9PSAwKQotCQkJCQljb250aW51ZTsKLQkJCQlEQkcoIlRyeWluZyB0byBhbGxvY2F0ZSBmcm9tICUwOGx4LCBzaXplICUwOGx4IGZyb20gcGFyZW50IgotCQkJCSAgICAiIHJlcyAlZDogJTA4bHggLT4gJTA4bHhcbiIsCi0JCQkJCXJlcy0+c3RhcnQsIHJlcy0+ZW5kLCBpLCByLT5zdGFydCwgci0+ZW5kKTsKLQkJCQotCQkJCWlmIChhbGxvY2F0ZV9yZXNvdXJjZShyLCByZXMsIHJlcy0+ZW5kICsgMSwgcmVzLT5zdGFydCwgbWF4LAotCQkJCSAgICByZXMtPmVuZCArIDEsIE5VTEwsIE5VTEwpIDwgMCkgewotCQkJCQlEQkcoIkZhaWxlZCAhXG4iKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWRvX3VwZGF0ZV9wMnBfaW9fcmVzb3VyY2UoYiwgZm91bmRfdmdhKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlkb19maXh1cF9wMnBfbGV2ZWwoYik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotcGNpYmlvc19maXh1cF9wMnBfYnJpZGdlcyh2b2lkKQotewotCXN0cnVjdCBwY2lfYnVzICpiOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShiLCAmcGNpX3Jvb3RfYnVzZXMsIG5vZGUpCi0JCWRvX2ZpeHVwX3AycF9sZXZlbChiKTsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLwotCiBzdGF0aWMgaW50IF9faW5pdAogcGNpYmlvc19pbml0KHZvaWQpCiB7CkBAIC0xMjg0LDkgKzEwNjgsNiBAQAogCXBjaWJpb3NfYWxsb2NhdGVfYnVzX3Jlc291cmNlcygmcGNpX3Jvb3RfYnVzZXMpOwogCXBjaWJpb3NfYWxsb2NhdGVfcmVzb3VyY2VzKDApOwogCXBjaWJpb3NfYWxsb2NhdGVfcmVzb3VyY2VzKDEpOwotI2lmZGVmIENPTkZJR19QUENfUE1BQwotCXBjaWJpb3NfZml4dXBfcDJwX2JyaWRnZXMoKTsKLSNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KIAlwY2liaW9zX2Fzc2lnbl9yZXNvdXJjZXMoKTsKIAogCS8qIENhbGwgbWFjaGluZSBkZXBlbmRlbnQgcG9zdC1pbml0IGNvZGUgKi8KQEAgLTE3MTYsMTcgKzE0OTcsNiBAQAogCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZTsKIAlsb25nIHJlc3VsdCA9IC1FT1BOT1RTVVBQOwogCi0JLyogQXJnaCAhIFBsZWFzZSBmb3JnaXZlIG1lIGZvciB0aGF0IGhhY2ssIGJ1dCB0aGF0J3MgdGhlCi0JICogc2ltcGxlc3Qgd2F5IHRvIGdldCBleGlzdGluZyBYRnJlZSB0byBub3QgbG9ja3VwIG9uIHNvbWUKLQkgKiBHNSBtYWNoaW5lcy4uLiBTbyB3aGVuIHNvbWV0aGluZyBhc2tzIGZvciBidXMgMCBpbyBiYXNlCi0JICogKGJ1cyAwIGlzIEhUIHJvb3QpLCB3ZSByZXR1cm4gdGhlIEFHUCBvbmUgaW5zdGVhZC4KLQkgKi8KLSNpZmRlZiBDT05GSUdfUFBDX1BNQUMKLQlpZiAoX21hY2hpbmUgPT0gX01BQ0hfUG1hYyAmJiBtYWNoaW5lX2lzX2NvbXBhdGlibGUoIk1hY1JJU0M0IikpCi0JCWlmIChidXMgPT0gMCkKLQkJCWJ1cyA9IDB4ZjA7Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCi0KIAlob3NlID0gcGNpX2J1c190b19ob3NlKGJ1cyk7CiAJaWYgKCFob3NlKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTE4MDYsNiArMTU3NiwyMyBAQAogRVhQT1JUX1NZTUJPTChwY2lfaW9tYXApOwogRVhQT1JUX1NZTUJPTChwY2lfaW91bm1hcCk7CiAKK3Vuc2lnbmVkIGxvbmcgcGNpX2FkZHJlc3NfdG9fcGlvKHBoeXNfYWRkcl90IGFkZHJlc3MpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlID0gaG9zZV9oZWFkOworCisJZm9yICg7IGhvc2U7IGhvc2UgPSBob3NlLT5uZXh0KSB7CisJCXVuc2lnbmVkIGludCBzaXplID0gaG9zZS0+aW9fcmVzb3VyY2UuZW5kIC0KKwkJCWhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0ICsgMTsKKwkJaWYgKGFkZHJlc3MgPj0gaG9zZS0+aW9fYmFzZV9waHlzICYmCisJCSAgICBhZGRyZXNzIDwgKGhvc2UtPmlvX2Jhc2VfcGh5cyArIHNpemUpKSB7CisJCQl1bnNpZ25lZCBsb25nIGJhc2UgPQorCQkJCSh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIF9JT19CQVNFOworCQkJcmV0dXJuIGJhc2UgKyAoYWRkcmVzcyAtIGhvc2UtPmlvX2Jhc2VfcGh5cyk7CisJCX0KKwl9CisJcmV0dXJuICh1bnNpZ25lZCBpbnQpLTE7Cit9CitFWFBPUlRfU1lNQk9MKHBjaV9hZGRyZXNzX3RvX3Bpbyk7CiAKIC8qCiAgKiBOdWxsIFBDSSBjb25maWcgYWNjZXNzIGZ1bmN0aW9ucywgZm9yIHRoZSBjYXNlIHdoZW4gd2UgY2FuJ3QKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9wcGNfaHRhYi5jIGIvYXJjaC9wcGMva2VybmVsL3BwY19odGFiLmMKaW5kZXggY2E4MTAwMi4uMmY1Yzc2NSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3BwY19odGFiLmMKKysrIGIvYXJjaC9wcGMva2VybmVsL3BwY19odGFiLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL3BwY19rc3ltcy5jIGIvYXJjaC9wcGMva2VybmVsL3BwY19rc3ltcy5jCmluZGV4IGJiNmE1YzYuLjNhNmU0YmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9wcGNfa3N5bXMuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvcHBjX2tzeW1zLmMKQEAgLTM0LDcgKzM0LDYgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9od19pcnEuaD4KQEAgLTU4LDcgKzU3LDYgQEAKIGV4dGVybiB2b2lkIGFsaWdubWVudF9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogZXh0ZXJuIHZvaWQgcHJvZ3JhbV9jaGVja19leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogZXh0ZXJuIHZvaWQgc2luZ2xlX3N0ZXBfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLWV4dGVybiBpbnQgcG1hY19uZXd3b3JsZDsKIGV4dGVybiBpbnQgc3lzX3NpZ3JldHVybihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKIGxvbmcgbG9uZyBfX2FzaHJkaTMobG9uZyBsb25nLCBpbnQpOwpAQCAtODIsMTAgKzgwLDYgQEAKIEVYUE9SVF9TWU1CT0woSVNBX0RNQV9USFJFU0hPTEQpOwogRVhQT1JUX1NZTUJPTChETUFfTU9ERV9SRUFEKTsKIEVYUE9SVF9TWU1CT0woRE1BX01PREVfV1JJVEUpOwotI2lmIGRlZmluZWQoQ09ORklHX1BQQ19QUkVQKQotRVhQT1JUX1NZTUJPTChfcHJlcF90eXBlKTsKLUVYUE9SVF9TWU1CT0wodWNTeXN0ZW1UeXBlKTsKLSNlbmRpZgogCiAjaWYgIWRlZmluZWQoX19JTkxJTkVfQklUT1BTKQogRVhQT1JUX1NZTUJPTChzZXRfYml0KTsKQEAgLTIxNywxMCArMjExLDYgQEAKIEVYUE9SVF9TWU1CT0woY3VkYV9yZXF1ZXN0KTsKIEVYUE9SVF9TWU1CT0woY3VkYV9wb2xsKTsKICNlbmRpZiAvKiBDT05GSUdfQURCX0NVREEgKi8KLSNpZmRlZiBDT05GSUdfUFBDX1BNQUMKLUVYUE9SVF9TWU1CT0woc3lzX2N0cmxlcik7Ci1FWFBPUlRfU1lNQk9MKHBtYWNfbmV3d29ybGQpOwotI2VuZGlmCiAjaWZkZWYgQ09ORklHX1BQQ19PRgogRVhQT1JUX1NZTUJPTChmaW5kX2RldmljZXMpOwogRVhQT1JUX1NZTUJPTChmaW5kX3R5cGVfZGV2aWNlcyk7CkBAIC0yNDUsOSArMjM1LDYgQEAKICNpZiBkZWZpbmVkKENPTkZJR19CT09UWF9URVhUKQogRVhQT1JUX1NZTUJPTChidGV4dF91cGRhdGVfZGlzcGxheSk7CiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19TQ1NJKSAmJiBkZWZpbmVkKENPTkZJR19QUENfUE1BQykKLUVYUE9SVF9TWU1CT0wobm90ZV9zY3NpX2hvc3QpOwotI2VuZGlmCiAjaWZkZWYgQ09ORklHX1ZUCiBFWFBPUlRfU1lNQk9MKGtkX21rc291bmQpOwogI2VuZGlmCkBAIC0yNzQsNyArMjYxLDYgQEAKIEVYUE9SVF9TWU1CT0wodGltZXJfaW50ZXJydXB0KTsKIEVYUE9SVF9TWU1CT0woaXJxX2Rlc2MpOwogRVhQT1JUX1NZTUJPTCh0Yl90aWNrc19wZXJfamlmZnkpOwotRVhQT1JUX1NZTUJPTChnZXRfd2NoYW4pOwogRVhQT1JUX1NZTUJPTChjb25zb2xlX2RyaXZlcnMpOwogI2lmZGVmIENPTkZJR19YTU9OCiBFWFBPUlRfU1lNQk9MKHhtb24pOwpAQCAtMzExLDcgKzI5Nyw2IEBACiAKIEVYUE9SVF9TWU1CT0wobmV4dF9tbXVfY29udGV4dCk7CiBFWFBPUlRfU1lNQk9MKHNldF9jb250ZXh0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKF9faGFuZGxlX21tX2ZhdWx0KTsgLyogRm9yIE1PTCAqLwogRVhQT1JUX1NZTUJPTChkaXNhcm1fZGVjcik7CiAjaWZkZWYgQ09ORklHX1BQQ19TVERfTU1VCiBleHRlcm4gbG9uZyBtb2xfdHJhbXBvbGluZTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3BwYy9rZXJuZWwvcHJvY2Vzcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWNiZGM4Li4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL2tlcm5lbC9wcm9jZXNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NTEgKzAsMCBAQAotLyoKLSAqICBhcmNoL3BwYy9rZXJuZWwvcHJvY2Vzcy5jCi0gKgotICogIERlcml2ZWQgZnJvbSAiYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMiCi0gKiAgICBDb3B5cmlnaHQgKEMpIDE5OTUgIExpbnVzIFRvcnZhbGRzCi0gKgotICogIFVwZGF0ZWQgYW5kIG1vZGlmaWVkIGJ5IENvcnQgRG91Z2FuIChjb3J0QGNzLm5tdC5lZHUpIGFuZAotICogIFBhdWwgTWFja2VycmFzIChwYXVsdXNAY3MuYW51LmVkdS5hdSkKLSAqCi0gKiAgUG93ZXJQQyB2ZXJzaW9uCi0gKiAgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NiBHYXJ5IFRob21hcyAoZ2R0QGxpbnV4cHBjLm9yZykKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+Ci0jaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0jaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9lbGYuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcHJjdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0X3Rhc2suaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgotI2luY2x1ZGUgPGxpbnV4L21xdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KLQotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9tbXUuaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBfZ2V0X1NQKHZvaWQpOwotCi1zdHJ1Y3QgdGFza19zdHJ1Y3QgKmxhc3RfdGFza191c2VkX21hdGggPSBOVUxMOwotc3RydWN0IHRhc2tfc3RydWN0ICpsYXN0X3Rhc2tfdXNlZF9hbHRpdmVjID0gTlVMTDsKLXN0cnVjdCB0YXNrX3N0cnVjdCAqbGFzdF90YXNrX3VzZWRfc3BlID0gTlVMTDsKLQotc3RhdGljIHN0cnVjdCBmc19zdHJ1Y3QgaW5pdF9mcyA9IElOSVRfRlM7Ci1zdGF0aWMgc3RydWN0IGZpbGVzX3N0cnVjdCBpbml0X2ZpbGVzID0gSU5JVF9GSUxFUzsKLXN0YXRpYyBzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCBpbml0X3NpZ25hbHMgPSBJTklUX1NJR05BTFMoaW5pdF9zaWduYWxzKTsKLXN0YXRpYyBzdHJ1Y3Qgc2lnaGFuZF9zdHJ1Y3QgaW5pdF9zaWdoYW5kID0gSU5JVF9TSUdIQU5EKGluaXRfc2lnaGFuZCk7Ci1zdHJ1Y3QgbW1fc3RydWN0IGluaXRfbW0gPSBJTklUX01NKGluaXRfbW0pOwotRVhQT1JUX1NZTUJPTChpbml0X21tKTsKLQotLyogdGhpcyBpcyA4a0ItYWxpZ25lZCBzbyB3ZSBjYW4gZ2V0IHRvIHRoZSB0aHJlYWRfaW5mbyBzdHJ1Y3QKLSAgIGF0IHRoZSBiYXNlIG9mIGl0IGZyb20gdGhlIHN0YWNrIHBvaW50ZXIgd2l0aCAxIGludGVnZXIgaW5zdHJ1Y3Rpb24uICovCi11bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24KLQlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmRhdGEuaW5pdF90YXNrIikpKSA9Ci17IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OwotCi0vKiBpbml0aWFsIHRhc2sgc3RydWN0dXJlICovCi1zdHJ1Y3QgdGFza19zdHJ1Y3QgaW5pdF90YXNrID0gSU5JVF9UQVNLKGluaXRfdGFzayk7Ci1FWFBPUlRfU1lNQk9MKGluaXRfdGFzayk7Ci0KLS8qIG9ubHkgdXNlZCB0byBnZXQgc2Vjb25kYXJ5IHByb2Nlc3NvciB1cCAqLwotc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyZW50X3NldFtOUl9DUFVTXSA9IHsmaW5pdF90YXNrLCB9OwotCi0jdW5kZWYgU0hPV19UQVNLX1NXSVRDSEVTCi0jdW5kZWYgQ0hFQ0tfU1RBQ0sKLQotI2lmIGRlZmluZWQoQ0hFQ0tfU1RBQ0spCi11bnNpZ25lZCBsb25nCi1rZXJuZWxfc3RhY2tfdG9wKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQotewotCXJldHVybiAoKHVuc2lnbmVkIGxvbmcpdHNrKSArIHNpemVvZih1bmlvbiB0YXNrX3VuaW9uKTsKLX0KLQotdW5zaWduZWQgbG9uZwotdGFza190b3Aoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCi17Ci0JcmV0dXJuICgodW5zaWduZWQgbG9uZyl0c2spICsgc2l6ZW9mKHN0cnVjdCB0aHJlYWRfaW5mbyk7Ci19Ci0KLS8qIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUga2VybmVsIHN0YWNrIGlzIGhlYWx0aHkgKi8KLWludCBjaGVja19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKLXsKLQl1bnNpZ25lZCBsb25nIHN0YWNrX3RvcCA9IGtlcm5lbF9zdGFja190b3AodHNrKTsKLQl1bnNpZ25lZCBsb25nIHRza190b3AgPSB0YXNrX3RvcCh0c2spOwotCWludCByZXQgPSAwOwotCi0jaWYgMAotCS8qIGNoZWNrIHRocmVhZCBtYWdpYyAqLwotCWlmICggdHNrLT50aHJlYWQubWFnaWMgIT0gVEhSRUFEX01BR0lDICkKLQl7Ci0JCXJldCB8PSAxOwotCQlwcmludGsoInRocmVhZC5tYWdpYyBiYWQ6ICUwOHhcbiIsIHRzay0+dGhyZWFkLm1hZ2ljKTsKLQl9Ci0jZW5kaWYKLQotCWlmICggIXRzayApCi0JCXByaW50aygiY2hlY2tfc3RhY2soKTogdHNrIGJhZCB0c2sgJXBcbiIsdHNrKTsKLQotCS8qIGNoZWNrIGlmIHN0b3JlZCBrc3AgaXMgYmFkICovCi0JaWYgKCAodHNrLT50aHJlYWQua3NwID4gc3RhY2tfdG9wKSB8fCAodHNrLT50aHJlYWQua3NwIDwgdHNrX3RvcCkgKQotCXsKLQkJcHJpbnRrKCJzdGFjayBvdXQgb2YgYm91bmRzOiAlcy8lZFxuIgotCQkgICAgICAgIiB0c2tfdG9wICUwOGx4IGtzcCAlMDhseCBzdGFja190b3AgJTA4bHhcbiIsCi0JCSAgICAgICB0c2stPmNvbW0sdHNrLT5waWQsCi0JCSAgICAgICB0c2tfdG9wLCB0c2stPnRocmVhZC5rc3AsIHN0YWNrX3RvcCk7Ci0JCXJldCB8PSAyOwotCX0KLQotCS8qIGNoZWNrIGlmIHN0YWNrIHB0ciBSSUdIVCBOT1cgaXMgYmFkICovCi0JaWYgKCAodHNrID09IGN1cnJlbnQpICYmICgoX2dldF9TUCgpID4gc3RhY2tfdG9wICkgfHwgKF9nZXRfU1AoKSA8IHRza190b3ApKSApCi0JewotCQlwcmludGsoImN1cnJlbnQgc3RhY2sgcHRyIG91dCBvZiBib3VuZHM6ICVzLyVkXG4iCi0JCSAgICAgICAiIHRza190b3AgJTA4bHggc3AgJTA4bHggc3RhY2tfdG9wICUwOGx4XG4iLAotCQkgICAgICAgY3VycmVudC0+Y29tbSxjdXJyZW50LT5waWQsCi0JCSAgICAgICB0c2tfdG9wLCBfZ2V0X1NQKCksIHN0YWNrX3RvcCk7Ci0JCXJldCB8PSA0OwotCX0KLQotI2lmIDAKLQkvKiBjaGVjayBhbW91bnQgb2YgZnJlZSBzdGFjayAqLwotCWZvciAoIGkgPSAodW5zaWduZWQgbG9uZyAqKXRhc2tfdG9wKHRzaykgOyBpIDwga2VybmVsX3N0YWNrX3RvcCh0c2spIDsgaSsrICkKLQl7Ci0JCWlmICggIWkgKQotCQkJcHJpbnRrKCJjaGVja19zdGFjaygpOiBpID0gJXBcbiIsIGkpOwotCQlpZiAoICppICE9IDAgKQotCQl7Ci0JCQkvKiBvbmx5IG5vdGlmeSBpZiBpdCdzIGxlc3MgdGhhbiA5MDAgYnl0ZXMgKi8KLQkJCWlmICggKGkgLSAodW5zaWduZWQgbG9uZyAqKXRhc2tfdG9wKHRzaykpICA8IDkwMCApCi0JCQkJcHJpbnRrKCIlZCBieXRlcyBmcmVlIG9uIHN0YWNrXG4iLAotCQkJCSAgICAgICBpIC0gdGFza190b3AodHNrKSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLSNlbmRpZgotCi0JaWYgKHJldCkKLQl7Ci0JCXBhbmljKCJiYWQga2VybmVsIHN0YWNrIik7Ci0JfQotCXJldHVybihyZXQpOwotfQotI2VuZGlmIC8qIGRlZmluZWQoQ0hFQ0tfU1RBQ0spICovCi0KLS8qCi0gKiBNYWtlIHN1cmUgdGhlIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyIHN0YXRlIGluIHRoZQotICogdGhlIHRocmVhZF9zdHJ1Y3QgaXMgdXAgdG8gZGF0ZSBmb3IgdGFzayB0c2suCi0gKi8KLXZvaWQgZmx1c2hfZnBfdG9fdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQotewotCWlmICh0c2stPnRocmVhZC5yZWdzKSB7Ci0JCS8qCi0JCSAqIFdlIG5lZWQgdG8gZGlzYWJsZSBwcmVlbXB0aW9uIGhlcmUgYmVjYXVzZSBpZiB3ZSBkaWRuJ3QsCi0JCSAqIGFub3RoZXIgcHJvY2VzcyBjb3VsZCBnZXQgc2NoZWR1bGVkIGFmdGVyIHRoZSByZWdzLT5tc3IKLQkJICogdGVzdCBidXQgYmVmb3JlIHdlIGhhdmUgZmluaXNoZWQgc2F2aW5nIHRoZSBGUCByZWdpc3RlcnMKLQkJICogdG8gdGhlIHRocmVhZF9zdHJ1Y3QuICBUaGF0IHByb2Nlc3MgY291bGQgdGFrZSBvdmVyIHRoZQotCQkgKiBGUFUsIGFuZCB0aGVuIHdoZW4gd2UgZ2V0IHNjaGVkdWxlZCBhZ2FpbiB3ZSB3b3VsZCBzdG9yZQotCQkgKiBib2d1cyB2YWx1ZXMgZm9yIHRoZSByZW1haW5pbmcgRlAgcmVnaXN0ZXJzLgotCQkgKi8KLQkJcHJlZW1wdF9kaXNhYmxlKCk7Ci0JCWlmICh0c2stPnRocmVhZC5yZWdzLT5tc3IgJiBNU1JfRlApIHsKLSNpZmRlZiBDT05GSUdfU01QCi0JCQkvKgotCQkJICogVGhpcyBzaG91bGQgb25seSBldmVyIGJlIGNhbGxlZCBmb3IgY3VycmVudCBvcgotCQkJICogZm9yIGEgc3RvcHBlZCBjaGlsZCBwcm9jZXNzLiAgU2luY2Ugd2Ugc2F2ZSBhd2F5Ci0JCQkgKiB0aGUgRlAgcmVnaXN0ZXIgc3RhdGUgb24gY29udGV4dCBzd2l0Y2ggb24gU01QLAotCQkJICogdGhlcmUgaXMgc29tZXRoaW5nIHdyb25nIGlmIGEgc3RvcHBlZCBjaGlsZCBhcHBlYXJzCi0JCQkgKiB0byBzdGlsbCBoYXZlIGl0cyBGUCBzdGF0ZSBpbiB0aGUgQ1BVIHJlZ2lzdGVycy4KLQkJCSAqLwotCQkJQlVHX09OKHRzayAhPSBjdXJyZW50KTsKLSNlbmRpZgotCQkJZ2l2ZXVwX2ZwdShjdXJyZW50KTsKLQkJfQotCQlwcmVlbXB0X2VuYWJsZSgpOwotCX0KLX0KLQotdm9pZCBlbmFibGVfa2VybmVsX2ZwKHZvaWQpCi17Ci0JV0FSTl9PTihwcmVlbXB0aWJsZSgpKTsKLQotI2lmZGVmIENPTkZJR19TTVAKLQlpZiAoY3VycmVudC0+dGhyZWFkLnJlZ3MgJiYgKGN1cnJlbnQtPnRocmVhZC5yZWdzLT5tc3IgJiBNU1JfRlApKQotCQlnaXZldXBfZnB1KGN1cnJlbnQpOwotCWVsc2UKLQkJZ2l2ZXVwX2ZwdShOVUxMKTsJLyoganVzdCBlbmFibGVzIEZQIGZvciBrZXJuZWwgKi8KLSNlbHNlCi0JZ2l2ZXVwX2ZwdShsYXN0X3Rhc2tfdXNlZF9tYXRoKTsKLSNlbmRpZiAvKiBDT05GSUdfU01QICovCi19Ci1FWFBPUlRfU1lNQk9MKGVuYWJsZV9rZXJuZWxfZnApOwotCi1pbnQgZHVtcF90YXNrX2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgZWxmX2ZwcmVnc2V0X3QgKmZwcmVncykKLXsKLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQlpZiAodHNrLT50aHJlYWQucmVncyAmJiAodHNrLT50aHJlYWQucmVncy0+bXNyICYgTVNSX0ZQKSkKLQkJZ2l2ZXVwX2ZwdSh0c2spOwotCXByZWVtcHRfZW5hYmxlKCk7Ci0JbWVtY3B5KGZwcmVncywgJnRzay0+dGhyZWFkLmZwclswXSwgc2l6ZW9mKCpmcHJlZ3MpKTsKLQlyZXR1cm4gMTsKLX0KLQotI2lmZGVmIENPTkZJR19BTFRJVkVDCi12b2lkIGVuYWJsZV9rZXJuZWxfYWx0aXZlYyh2b2lkKQotewotCVdBUk5fT04ocHJlZW1wdGlibGUoKSk7Ci0KLSNpZmRlZiBDT05GSUdfU01QCi0JaWYgKGN1cnJlbnQtPnRocmVhZC5yZWdzICYmIChjdXJyZW50LT50aHJlYWQucmVncy0+bXNyICYgTVNSX1ZFQykpCi0JCWdpdmV1cF9hbHRpdmVjKGN1cnJlbnQpOwotCWVsc2UKLQkJZ2l2ZXVwX2FsdGl2ZWMoTlVMTCk7CS8qIGp1c3QgZW5hYmxlIEFsdGlWZWMgZm9yIGtlcm5lbCAtIGZvcmNlICovCi0jZWxzZQotCWdpdmV1cF9hbHRpdmVjKGxhc3RfdGFza191c2VkX2FsdGl2ZWMpOwotI2VuZGlmIC8qIF9fU01QIF9fICovCi19Ci1FWFBPUlRfU1lNQk9MKGVuYWJsZV9rZXJuZWxfYWx0aXZlYyk7Ci0KLS8qCi0gKiBNYWtlIHN1cmUgdGhlIFZNWC9BbHRpdmVjIHJlZ2lzdGVyIHN0YXRlIGluIHRoZQotICogdGhlIHRocmVhZF9zdHJ1Y3QgaXMgdXAgdG8gZGF0ZSBmb3IgdGFzayB0c2suCi0gKi8KLXZvaWQgZmx1c2hfYWx0aXZlY190b190aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCi17Ci0JaWYgKHRzay0+dGhyZWFkLnJlZ3MpIHsKLQkJcHJlZW1wdF9kaXNhYmxlKCk7Ci0JCWlmICh0c2stPnRocmVhZC5yZWdzLT5tc3IgJiBNU1JfVkVDKSB7Ci0jaWZkZWYgQ09ORklHX1NNUAotCQkJQlVHX09OKHRzayAhPSBjdXJyZW50KTsKLSNlbmRpZgotCQkJZ2l2ZXVwX2FsdGl2ZWMoY3VycmVudCk7Ci0JCX0KLQkJcHJlZW1wdF9lbmFibGUoKTsKLQl9Ci19Ci0KLWludCBkdW1wX2FsdGl2ZWMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGVsZl92cnJlZ3NldF90ICp2cnJlZ3MpCi17Ci0JaWYgKHJlZ3MtPm1zciAmIE1TUl9WRUMpCi0JCWdpdmV1cF9hbHRpdmVjKGN1cnJlbnQpOwotCW1lbWNweSh2cnJlZ3MsICZjdXJyZW50LT50aHJlYWQudnJbMF0sIHNpemVvZigqdnJyZWdzKSk7Ci0JcmV0dXJuIDE7Ci19Ci0jZW5kaWYgLyogQ09ORklHX0FMVElWRUMgKi8KLQotI2lmZGVmIENPTkZJR19TUEUKLXZvaWQKLWVuYWJsZV9rZXJuZWxfc3BlKHZvaWQpCi17Ci0JV0FSTl9PTihwcmVlbXB0aWJsZSgpKTsKLQotI2lmZGVmIENPTkZJR19TTVAKLQlpZiAoY3VycmVudC0+dGhyZWFkLnJlZ3MgJiYgKGN1cnJlbnQtPnRocmVhZC5yZWdzLT5tc3IgJiBNU1JfU1BFKSkKLQkJZ2l2ZXVwX3NwZShjdXJyZW50KTsKLQllbHNlCi0JCWdpdmV1cF9zcGUoTlVMTCk7CS8qIGp1c3QgZW5hYmxlIFNQRSBmb3Iga2VybmVsIC0gZm9yY2UgKi8KLSNlbHNlCi0JZ2l2ZXVwX3NwZShsYXN0X3Rhc2tfdXNlZF9zcGUpOwotI2VuZGlmIC8qIF9fU01QIF9fICovCi19Ci1FWFBPUlRfU1lNQk9MKGVuYWJsZV9rZXJuZWxfc3BlKTsKLQotdm9pZCBmbHVzaF9zcGVfdG9fdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQotewotCWlmICh0c2stPnRocmVhZC5yZWdzKSB7Ci0JCXByZWVtcHRfZGlzYWJsZSgpOwotCQlpZiAodHNrLT50aHJlYWQucmVncy0+bXNyICYgTVNSX1NQRSkgewotI2lmZGVmIENPTkZJR19TTVAKLQkJCUJVR19PTih0c2sgIT0gY3VycmVudCk7Ci0jZW5kaWYKLQkJCWdpdmV1cF9zcGUoY3VycmVudCk7Ci0JCX0KLQkJcHJlZW1wdF9lbmFibGUoKTsKLQl9Ci19Ci0KLWludCBkdW1wX3NwZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgZWxmX3ZycmVnc2V0X3QgKmV2cnJlZ3MpCi17Ci0JaWYgKHJlZ3MtPm1zciAmIE1TUl9TUEUpCi0JCWdpdmV1cF9zcGUoY3VycmVudCk7Ci0JLyogV2UgY29weSB1MzIgZXZyWzMyXSArIHU2NCBhY2MgKyB1MzIgc3BlZnNjciAtPiAzNSAqLwotCW1lbWNweShldnJyZWdzLCAmY3VycmVudC0+dGhyZWFkLmV2clswXSwgc2l6ZW9mKHUzMikgKiAzNSk7Ci0JcmV0dXJuIDE7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1NQRSAqLwotCi1zdHJ1Y3QgdGFza19zdHJ1Y3QgKl9fc3dpdGNoX3RvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5ldykKLXsKLQlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqbmV3X3RocmVhZCwgKm9sZF90aHJlYWQ7Ci0JdW5zaWduZWQgbG9uZyBzOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqbGFzdDsKLQotCWxvY2FsX2lycV9zYXZlKHMpOwotI2lmZGVmIENIRUNLX1NUQUNLCi0JY2hlY2tfc3RhY2socHJldik7Ci0JY2hlY2tfc3RhY2sobmV3KTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1NNUAotCS8qIGF2b2lkIGNvbXBsZXhpdHkgb2YgbGF6eSBzYXZlL3Jlc3RvcmUgb2YgZnB1Ci0JICogYnkganVzdCBzYXZpbmcgaXQgZXZlcnkgdGltZSB3ZSBzd2l0Y2ggb3V0IGlmCi0JICogdGhpcyB0YXNrIHVzZWQgdGhlIGZwdSBkdXJpbmcgdGhlIGxhc3QgcXVhbnR1bS4KLQkgKgotCSAqIElmIGl0IHRyaWVzIHRvIHVzZSB0aGUgZnB1IGFnYWluLCBpdCdsbCB0cmFwIGFuZAotCSAqIHJlbG9hZCBpdHMgZnAgcmVncy4gIFNvIHdlIGRvbid0IGhhdmUgdG8gZG8gYSByZXN0b3JlCi0JICogZXZlcnkgc3dpdGNoLCBqdXN0IGEgc2F2ZS4KLQkgKiAgLS0gQ29ydAotCSAqLwotCWlmIChwcmV2LT50aHJlYWQucmVncyAmJiAocHJldi0+dGhyZWFkLnJlZ3MtPm1zciAmIE1TUl9GUCkpCi0JCWdpdmV1cF9mcHUocHJldik7Ci0jaWZkZWYgQ09ORklHX0FMVElWRUMKLQkvKgotCSAqIElmIHRoZSBwcmV2aW91cyB0aHJlYWQgdXNlZCBhbHRpdmVjIGluIHRoZSBsYXN0IHF1YW50dW0KLQkgKiAodGh1cyBjaGFuZ2luZyBhbHRpdmVjIHJlZ3MpIHRoZW4gc2F2ZSB0aGVtLgotCSAqIFdlIHVzZWQgdG8gY2hlY2sgdGhlIFZSU0FWRSByZWdpc3RlciBidXQgbm90IGFsbCBhcHBzCi0JICogc2V0IGl0LCBzbyB3ZSBkb24ndCByZWx5IG9uIGl0IG5vdyAoYW5kIGluIGZhY3Qgd2UgbmVlZAotCSAqIHRvIHNhdmUgJiByZXN0b3JlIFZTQ1IgZXZlbiBpZiBWUlNBVkUgPT0gMCkuICAtLSBwYXVsdXMKLQkgKgotCSAqIE9uIFNNUCB3ZSBhbHdheXMgc2F2ZS9yZXN0b3JlIGFsdGl2ZWMgcmVncyBqdXN0IHRvIGF2b2lkIHRoZQotCSAqIGNvbXBsZXhpdHkgb2YgY2hhbmdpbmcgcHJvY2Vzc29ycy4KLQkgKiAgLS0gQ29ydAotCSAqLwotCWlmICgocHJldi0+dGhyZWFkLnJlZ3MgJiYgKHByZXYtPnRocmVhZC5yZWdzLT5tc3IgJiBNU1JfVkVDKSkpCi0JCWdpdmV1cF9hbHRpdmVjKHByZXYpOwotI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCi0jaWZkZWYgQ09ORklHX1NQRQotCS8qCi0JICogSWYgdGhlIHByZXZpb3VzIHRocmVhZCB1c2VkIHNwZSBpbiB0aGUgbGFzdCBxdWFudHVtCi0JICogKHRodXMgY2hhbmdpbmcgc3BlIHJlZ3MpIHRoZW4gc2F2ZSB0aGVtLgotCSAqCi0JICogT24gU01QIHdlIGFsd2F5cyBzYXZlL3Jlc3RvcmUgc3BlIHJlZ3MganVzdCB0byBhdm9pZCB0aGUKLQkgKiBjb21wbGV4aXR5IG9mIGNoYW5naW5nIHByb2Nlc3NvcnMuCi0JICovCi0JaWYgKChwcmV2LT50aHJlYWQucmVncyAmJiAocHJldi0+dGhyZWFkLnJlZ3MtPm1zciAmIE1TUl9TUEUpKSkKLQkJZ2l2ZXVwX3NwZShwcmV2KTsKLSNlbmRpZiAvKiBDT05GSUdfU1BFICovCi0jZW5kaWYgLyogQ09ORklHX1NNUCAqLwotCi0jaWZkZWYgQ09ORklHX0FMVElWRUMKLQkvKiBBdm9pZCB0aGUgdHJhcC4gIE9uIHNtcCB0aGlzIHRoaXMgbmV2ZXIgaGFwcGVucyBzaW5jZQotCSAqIHdlIGRvbid0IHNldCBsYXN0X3Rhc2tfdXNlZF9hbHRpdmVjIC0tIENvcnQKLQkgKi8KLQlpZiAobmV3LT50aHJlYWQucmVncyAmJiBsYXN0X3Rhc2tfdXNlZF9hbHRpdmVjID09IG5ldykKLQkJbmV3LT50aHJlYWQucmVncy0+bXNyIHw9IE1TUl9WRUM7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfU1BFCi0JLyogQXZvaWQgdGhlIHRyYXAuICBPbiBzbXAgdGhpcyB0aGlzIG5ldmVyIGhhcHBlbnMgc2luY2UKLQkgKiB3ZSBkb24ndCBzZXQgbGFzdF90YXNrX3VzZWRfc3BlCi0JICovCi0JaWYgKG5ldy0+dGhyZWFkLnJlZ3MgJiYgbGFzdF90YXNrX3VzZWRfc3BlID09IG5ldykKLQkJbmV3LT50aHJlYWQucmVncy0+bXNyIHw9IE1TUl9TUEU7Ci0jZW5kaWYgLyogQ09ORklHX1NQRSAqLwotCW5ld190aHJlYWQgPSAmbmV3LT50aHJlYWQ7Ci0Jb2xkX3RocmVhZCA9ICZjdXJyZW50LT50aHJlYWQ7Ci0JbGFzdCA9IF9zd2l0Y2gob2xkX3RocmVhZCwgbmV3X3RocmVhZCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUocyk7Ci0JcmV0dXJuIGxhc3Q7Ci19Ci0KLXZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICogcmVncykKLXsKLQlpbnQgaSwgdHJhcDsKLQotCXByaW50aygiTklQOiAlMDhsWCBMUjogJTA4bFggU1A6ICUwOGxYIFJFR1M6ICVwIFRSQVA6ICUwNGx4ICAgICVzXG4iLAotCSAgICAgICByZWdzLT5uaXAsIHJlZ3MtPmxpbmssIHJlZ3MtPmdwclsxXSwgcmVncywgcmVncy0+dHJhcCwKLQkgICAgICAgcHJpbnRfdGFpbnRlZCgpKTsKLQlwcmludGsoIk1TUjogJTA4bHggRUU6ICUwMXggUFI6ICUwMXggRlA6ICUwMXggTUU6ICUwMXggSVIvRFI6ICUwMXglMDF4XG4iLAotCSAgICAgICByZWdzLT5tc3IsIHJlZ3MtPm1zciZNU1JfRUUgPyAxIDogMCwgcmVncy0+bXNyJk1TUl9QUiA/IDEgOiAwLAotCSAgICAgICByZWdzLT5tc3IgJiBNU1JfRlAgPyAxIDogMCxyZWdzLT5tc3ImTVNSX01FID8gMSA6IDAsCi0JICAgICAgIHJlZ3MtPm1zciZNU1JfSVIgPyAxIDogMCwKLQkgICAgICAgcmVncy0+bXNyJk1TUl9EUiA/IDEgOiAwKTsKLQl0cmFwID0gVFJBUChyZWdzKTsKLQlpZiAodHJhcCA9PSAweDMwMCB8fCB0cmFwID09IDB4NjAwKQotCQlwcmludGsoIkRBUjogJTA4bFgsIERTSVNSOiAlMDhsWFxuIiwgcmVncy0+ZGFyLCByZWdzLT5kc2lzcik7Ci0JcHJpbnRrKCJUQVNLID0gJXBbJWRdICclcycgVEhSRUFEOiAlcFxuIiwKLQkgICAgICAgY3VycmVudCwgY3VycmVudC0+cGlkLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT50aHJlYWRfaW5mbyk7Ci0JcHJpbnRrKCJMYXN0IHN5c2NhbGw6ICVsZCAiLCBjdXJyZW50LT50aHJlYWQubGFzdF9zeXNjYWxsKTsKLQotI2lmZGVmIENPTkZJR19TTVAKLQlwcmludGsoIiBDUFU6ICVkIiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLSNlbmRpZiAvKiBDT05GSUdfU01QICovCi0KLQlmb3IgKGkgPSAwOyAgaSA8IDMyOyAgaSsrKSB7Ci0JCWxvbmcgcjsKLQkJaWYgKChpICUgOCkgPT0gMCkKLQkJCXByaW50aygiXG4iIEtFUk5fSU5GTyAiR1BSJTAyZDogIiwgaSk7Ci0JCWlmIChfX2dldF91c2VyKHIsICZyZWdzLT5ncHJbaV0pKQotCQkJYnJlYWs7Ci0JCXByaW50aygiJTA4bFggIiwgcik7Ci0JCWlmIChpID09IDEyICYmICFGVUxMX1JFR1MocmVncykpCi0JCQlicmVhazsKLQl9Ci0JcHJpbnRrKCJcbiIpOwotI2lmZGVmIENPTkZJR19LQUxMU1lNUwotCS8qCi0JICogTG9va3VwIE5JUCBsYXRlIHNvIHdlIGhhdmUgdGhlIGJlc3QgY2hhbmdlIG9mIGdldHRpbmcgdGhlCi0JICogYWJvdmUgaW5mbyBvdXQgd2l0aG91dCBmYWlsaW5nCi0JICovCi0JcHJpbnRrKCJOSVAgWyUwOGx4XSAiLCByZWdzLT5uaXApOwotCXByaW50X3N5bWJvbCgiJXNcbiIsIHJlZ3MtPm5pcCk7Ci0JcHJpbnRrKCJMUiBbJTA4bHhdICIsIHJlZ3MtPmxpbmspOwotCXByaW50X3N5bWJvbCgiJXNcbiIsIHJlZ3MtPmxpbmspOwotI2VuZGlmCi0Jc2hvd19zdGFjayhjdXJyZW50LCAodW5zaWduZWQgbG9uZyAqKSByZWdzLT5ncHJbMV0pOwotfQotCi12b2lkIGV4aXRfdGhyZWFkKHZvaWQpCi17Ci0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0JaWYgKGxhc3RfdGFza191c2VkX21hdGggPT0gY3VycmVudCkKLQkJbGFzdF90YXNrX3VzZWRfbWF0aCA9IE5VTEw7Ci0JaWYgKGxhc3RfdGFza191c2VkX2FsdGl2ZWMgPT0gY3VycmVudCkKLQkJbGFzdF90YXNrX3VzZWRfYWx0aXZlYyA9IE5VTEw7Ci0jaWZkZWYgQ09ORklHX1NQRQotCWlmIChsYXN0X3Rhc2tfdXNlZF9zcGUgPT0gY3VycmVudCkKLQkJbGFzdF90YXNrX3VzZWRfc3BlID0gTlVMTDsKLSNlbmRpZgotCXByZWVtcHRfZW5hYmxlKCk7Ci19Ci0KLXZvaWQgZmx1c2hfdGhyZWFkKHZvaWQpCi17Ci0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0JaWYgKGxhc3RfdGFza191c2VkX21hdGggPT0gY3VycmVudCkKLQkJbGFzdF90YXNrX3VzZWRfbWF0aCA9IE5VTEw7Ci0JaWYgKGxhc3RfdGFza191c2VkX2FsdGl2ZWMgPT0gY3VycmVudCkKLQkJbGFzdF90YXNrX3VzZWRfYWx0aXZlYyA9IE5VTEw7Ci0jaWZkZWYgQ09ORklHX1NQRQotCWlmIChsYXN0X3Rhc2tfdXNlZF9zcGUgPT0gY3VycmVudCkKLQkJbGFzdF90YXNrX3VzZWRfc3BlID0gTlVMTDsKLSNlbmRpZgotCXByZWVtcHRfZW5hYmxlKCk7Ci19Ci0KLXZvaWQKLXJlbGVhc2VfdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKLXsKLX0KLQotLyoKLSAqIFRoaXMgZ2V0cyBjYWxsZWQgYmVmb3JlIHdlIGFsbG9jYXRlIGEgbmV3IHRocmVhZCBhbmQgY29weQotICogdGhlIGN1cnJlbnQgdGFzayBpbnRvIGl0LgotICovCi12b2lkIHByZXBhcmVfdG9fY29weShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKLXsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRzay0+dGhyZWFkLnJlZ3M7Ci0KLQlpZiAocmVncyA9PSBOVUxMKQotCQlyZXR1cm47Ci0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0JaWYgKHJlZ3MtPm1zciAmIE1TUl9GUCkKLQkJZ2l2ZXVwX2ZwdShjdXJyZW50KTsKLSNpZmRlZiBDT05GSUdfQUxUSVZFQwotCWlmIChyZWdzLT5tc3IgJiBNU1JfVkVDKQotCQlnaXZldXBfYWx0aXZlYyhjdXJyZW50KTsKLSNlbmRpZiAvKiBDT05GSUdfQUxUSVZFQyAqLwotI2lmZGVmIENPTkZJR19TUEUKLQlpZiAocmVncy0+bXNyICYgTVNSX1NQRSkKLQkJZ2l2ZXVwX3NwZShjdXJyZW50KTsKLSNlbmRpZiAvKiBDT05GSUdfU1BFICovCi0JcHJlZW1wdF9lbmFibGUoKTsKLX0KLQotLyoKLSAqIENvcHkgYSB0aHJlYWQuLgotICovCi1pbnQKLWNvcHlfdGhyZWFkKGludCBuciwgdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncywgdW5zaWduZWQgbG9uZyB1c3AsCi0JICAgIHVuc2lnbmVkIGxvbmcgdW51c2VkLAotCSAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXN0cnVjdCBwdF9yZWdzICpjaGlsZHJlZ3MsICprcmVnczsKLQlleHRlcm4gdm9pZCByZXRfZnJvbV9mb3JrKHZvaWQpOwotCXVuc2lnbmVkIGxvbmcgc3AgPSAodW5zaWduZWQgbG9uZylwLT50aHJlYWRfaW5mbyArIFRIUkVBRF9TSVpFOwotCXVuc2lnbmVkIGxvbmcgY2hpbGRmcmFtZTsKLQotCUNIRUNLX0ZVTExfUkVHUyhyZWdzKTsKLQkvKiBDb3B5IHJlZ2lzdGVycyAqLwotCXNwIC09IHNpemVvZihzdHJ1Y3QgcHRfcmVncyk7Ci0JY2hpbGRyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopIHNwOwotCSpjaGlsZHJlZ3MgPSAqcmVnczsKLQlpZiAoKGNoaWxkcmVncy0+bXNyICYgTVNSX1BSKSA9PSAwKSB7Ci0JCS8qIGZvciBrZXJuZWwgdGhyZWFkLCBzZXQgYGN1cnJlbnQnIGFuZCBzdGFja3B0ciBpbiBuZXcgdGFzayAqLwotCQljaGlsZHJlZ3MtPmdwclsxXSA9IHNwICsgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKTsKLQkJY2hpbGRyZWdzLT5ncHJbMl0gPSAodW5zaWduZWQgbG9uZykgcDsKLQkJcC0+dGhyZWFkLnJlZ3MgPSBOVUxMOwkvKiBubyB1c2VyIHJlZ2lzdGVyIHN0YXRlICovCi0JfSBlbHNlIHsKLQkJY2hpbGRyZWdzLT5ncHJbMV0gPSB1c3A7Ci0JCXAtPnRocmVhZC5yZWdzID0gY2hpbGRyZWdzOwotCQlpZiAoY2xvbmVfZmxhZ3MgJiBDTE9ORV9TRVRUTFMpCi0JCQljaGlsZHJlZ3MtPmdwclsyXSA9IGNoaWxkcmVncy0+Z3ByWzZdOwotCX0KLQljaGlsZHJlZ3MtPmdwclszXSA9IDA7ICAvKiBSZXN1bHQgZnJvbSBmb3JrKCkgKi8KLQlzcCAtPSBTVEFDS19GUkFNRV9PVkVSSEVBRDsKLQljaGlsZGZyYW1lID0gc3A7Ci0KLQkvKgotCSAqIFRoZSB3YXkgdGhpcyB3b3JrcyBpcyB0aGF0IGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZQotCSAqIHNvbWUgdGFzayB3aWxsIGNhbGwgX3N3aXRjaCB0byBzd2l0Y2ggdG8gdGhlIG5ldyB0YXNrLgotCSAqIFRoYXQgd2lsbCBwb3Agb2ZmIHRoZSBzdGFjayBmcmFtZSBjcmVhdGVkIGJlbG93IGFuZCBzdGFydAotCSAqIHRoZSBuZXcgdGFzayBydW5uaW5nIGF0IHJldF9mcm9tX2ZvcmsuICBUaGUgbmV3IHRhc2sgd2lsbAotCSAqIGRvIHNvbWUgaG91c2Uga2VlcGluZyBhbmQgdGhlbiByZXR1cm4gZnJvbSB0aGUgZm9yayBvciBjbG9uZQotCSAqIHN5c3RlbSBjYWxsLCB1c2luZyB0aGUgc3RhY2sgZnJhbWUgY3JlYXRlZCBhYm92ZS4KLQkgKi8KLQlzcCAtPSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpOwotCWtyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopIHNwOwotCXNwIC09IFNUQUNLX0ZSQU1FX09WRVJIRUFEOwotCXAtPnRocmVhZC5rc3AgPSBzcDsKLQlrcmVncy0+bmlwID0gKHVuc2lnbmVkIGxvbmcpcmV0X2Zyb21fZm9yazsKLQotCXAtPnRocmVhZC5sYXN0X3N5c2NhbGwgPSAtMTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogU2V0IHVwIGEgdGhyZWFkIGZvciBleGVjdXRpbmcgYSBuZXcgcHJvZ3JhbQotICovCi12b2lkIHN0YXJ0X3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBuaXAsIHVuc2lnbmVkIGxvbmcgc3ApCi17Ci0Jc2V0X2ZzKFVTRVJfRFMpOwotCW1lbXNldChyZWdzLT5ncHIsIDAsIHNpemVvZihyZWdzLT5ncHIpKTsKLQlyZWdzLT5jdHIgPSAwOwotCXJlZ3MtPmxpbmsgPSAwOwotCXJlZ3MtPnhlciA9IDA7Ci0JcmVncy0+Y2NyID0gMDsKLQlyZWdzLT5tcSA9IDA7Ci0JcmVncy0+bmlwID0gbmlwOwotCXJlZ3MtPmdwclsxXSA9IHNwOwotCXJlZ3MtPm1zciA9IE1TUl9VU0VSOwotCXByZWVtcHRfZGlzYWJsZSgpOwotCWlmIChsYXN0X3Rhc2tfdXNlZF9tYXRoID09IGN1cnJlbnQpCi0JCWxhc3RfdGFza191c2VkX21hdGggPSBOVUxMOwotCWlmIChsYXN0X3Rhc2tfdXNlZF9hbHRpdmVjID09IGN1cnJlbnQpCi0JCWxhc3RfdGFza191c2VkX2FsdGl2ZWMgPSBOVUxMOwotI2lmZGVmIENPTkZJR19TUEUKLQlpZiAobGFzdF90YXNrX3VzZWRfc3BlID09IGN1cnJlbnQpCi0JCWxhc3RfdGFza191c2VkX3NwZSA9IE5VTEw7Ci0jZW5kaWYKLQlwcmVlbXB0X2VuYWJsZSgpOwotCW1lbXNldChjdXJyZW50LT50aHJlYWQuZnByLCAwLCBzaXplb2YoY3VycmVudC0+dGhyZWFkLmZwcikpOwotCWN1cnJlbnQtPnRocmVhZC5mcHNjci52YWwgPSAwOwotI2lmZGVmIENPTkZJR19BTFRJVkVDCi0JbWVtc2V0KGN1cnJlbnQtPnRocmVhZC52ciwgMCwgc2l6ZW9mKGN1cnJlbnQtPnRocmVhZC52cikpOwotCW1lbXNldCgmY3VycmVudC0+dGhyZWFkLnZzY3IsIDAsIHNpemVvZihjdXJyZW50LT50aHJlYWQudnNjcikpOwotCWN1cnJlbnQtPnRocmVhZC52cnNhdmUgPSAwOwotCWN1cnJlbnQtPnRocmVhZC51c2VkX3ZyID0gMDsKLSNlbmRpZiAvKiBDT05GSUdfQUxUSVZFQyAqLwotI2lmZGVmIENPTkZJR19TUEUKLQltZW1zZXQoY3VycmVudC0+dGhyZWFkLmV2ciwgMCwgc2l6ZW9mKGN1cnJlbnQtPnRocmVhZC5ldnIpKTsKLQljdXJyZW50LT50aHJlYWQuYWNjID0gMDsKLQljdXJyZW50LT50aHJlYWQuc3BlZnNjciA9IDA7Ci0JY3VycmVudC0+dGhyZWFkLnVzZWRfc3BlID0gMDsKLSNlbmRpZiAvKiBDT05GSUdfU1BFICovCi19Ci0KLSNkZWZpbmUgUFJfRlBfQUxMX0VYQ0VQVCAoUFJfRlBfRVhDX0RJViB8IFBSX0ZQX0VYQ19PVkYgfCBQUl9GUF9FWENfVU5EIFwKLQkJfCBQUl9GUF9FWENfUkVTIHwgUFJfRlBfRVhDX0lOVikKLQotaW50IHNldF9mcGV4Y19tb2RlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBpbnQgdmFsKQotewotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdHNrLT50aHJlYWQucmVnczsKLQotCS8qIFRoaXMgaXMgYSBiaXQgaGFpcnkuICBJZiB3ZSBhcmUgYW4gU1BFIGVuYWJsZWQgIHByb2Nlc3NvcgotCSAqIChoYXZlIGVtYmVkZGVkIGZwKSB3ZSBzdG9yZSB0aGUgSUVFRSBleGNlcHRpb24gZW5hYmxlIGZsYWdzIGluCi0JICogZnBleGNfbW9kZS4gIGZwZXhjX21vZGUgaXMgYWxzbyB1c2VkIGZvciBzZXR0aW5nIEZQIGV4Y2VwdGlvbgotCSAqIG1vZGUgKGFzeW4sIHByZWNpc2UsIGRpc2FibGVkKSBmb3IgJ0NsYXNzaWMnIEZQLiAqLwotCWlmICh2YWwgJiBQUl9GUF9FWENfU1dfRU5BQkxFKSB7Ci0jaWZkZWYgQ09ORklHX1NQRQotCQl0c2stPnRocmVhZC5mcGV4Y19tb2RlID0gdmFsICYKLQkJCShQUl9GUF9FWENfU1dfRU5BQkxFIHwgUFJfRlBfQUxMX0VYQ0VQVCk7Ci0jZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLSNlbmRpZgotCX0gZWxzZSB7Ci0JCS8qIG9uIGEgQ09ORklHX1NQRSB0aGlzIGRvZXMgbm90IGh1cnQgdXMuICBUaGUgYml0cyB0aGF0Ci0JCSAqIF9fcGFja19mZTAxIHVzZSBkbyBub3Qgb3ZlcmxhcCB3aXRoIGJpdHMgdXNlZCBmb3IKLQkJICogUFJfRlBfRVhDX1NXX0VOQUJMRS4gIEFkZGl0aW9uYWxseSwgdGhlIE1TUltGRTAsRkUxXSBiaXRzCi0JCSAqIG9uIENPTkZJR19TUEUgaW1wbGVtZW50YXRpb25zIGFyZSByZXNlcnZlZCBzbyB3cml0aW5nIHRvCi0JCSAqIHRoZW0gZG9lcyBub3QgY2hhbmdlIGFueXRoaW5nICovCi0JCWlmICh2YWwgPiBQUl9GUF9FWENfUFJFQ0lTRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQl0c2stPnRocmVhZC5mcGV4Y19tb2RlID0gX19wYWNrX2ZlMDEodmFsKTsKLQkJaWYgKHJlZ3MgIT0gTlVMTCAmJiAocmVncy0+bXNyICYgTVNSX0ZQKSAhPSAwKQotCQkJcmVncy0+bXNyID0gKHJlZ3MtPm1zciAmIH4oTVNSX0ZFMHxNU1JfRkUxKSkKLQkJCQl8IHRzay0+dGhyZWFkLmZwZXhjX21vZGU7Ci0JfQotCXJldHVybiAwOwotfQotCi1pbnQgZ2V0X2ZwZXhjX21vZGUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgYWRyKQotewotCXVuc2lnbmVkIGludCB2YWw7Ci0KLQlpZiAodHNrLT50aHJlYWQuZnBleGNfbW9kZSAmIFBSX0ZQX0VYQ19TV19FTkFCTEUpCi0jaWZkZWYgQ09ORklHX1NQRQotCQl2YWwgPSB0c2stPnRocmVhZC5mcGV4Y19tb2RlOwotI2Vsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci0jZW5kaWYKLQllbHNlCi0JCXZhbCA9IF9fdW5wYWNrX2ZlMDEodHNrLT50aHJlYWQuZnBleGNfbW9kZSk7Ci0JcmV0dXJuIHB1dF91c2VyKHZhbCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKikgYWRyKTsKLX0KLQotaW50IHN5c19jbG9uZSh1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLCB1bnNpZ25lZCBsb25nIHVzcCwKLQkgICAgICBpbnQgX191c2VyICpwYXJlbnRfdGlkcCwgdm9pZCBfX3VzZXIgKmNoaWxkX3RocmVhZHB0ciwKLQkgICAgICBpbnQgX191c2VyICpjaGlsZF90aWRwLCBpbnQgcDYsCi0JICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JQ0hFQ0tfRlVMTF9SRUdTKHJlZ3MpOwotCWlmICh1c3AgPT0gMCkKLQkJdXNwID0gcmVncy0+Z3ByWzFdOwkvKiBzdGFjayBwb2ludGVyIGZvciBjaGlsZCAqLwotIAlyZXR1cm4gZG9fZm9yayhjbG9uZV9mbGFncywgdXNwLCByZWdzLCAwLCBwYXJlbnRfdGlkcCwgY2hpbGRfdGlkcCk7Ci19Ci0KLWludCBzeXNfZm9yayh1bnNpZ25lZCBsb25nIHAxLCB1bnNpZ25lZCBsb25nIHAyLCB1bnNpZ25lZCBsb25nIHAzLAotCSAgICAgdW5zaWduZWQgbG9uZyBwNCwgdW5zaWduZWQgbG9uZyBwNSwgdW5zaWduZWQgbG9uZyBwNiwKLQkgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCUNIRUNLX0ZVTExfUkVHUyhyZWdzKTsKLQlyZXR1cm4gZG9fZm9yayhTSUdDSExELCByZWdzLT5ncHJbMV0sIHJlZ3MsIDAsIE5VTEwsIE5VTEwpOwotfQotCi1pbnQgc3lzX3Zmb3JrKHVuc2lnbmVkIGxvbmcgcDEsIHVuc2lnbmVkIGxvbmcgcDIsIHVuc2lnbmVkIGxvbmcgcDMsCi0JICAgICAgdW5zaWduZWQgbG9uZyBwNCwgdW5zaWduZWQgbG9uZyBwNSwgdW5zaWduZWQgbG9uZyBwNiwKLQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlDSEVDS19GVUxMX1JFR1MocmVncyk7Ci0JcmV0dXJuIGRvX2ZvcmsoQ0xPTkVfVkZPUksgfCBDTE9ORV9WTSB8IFNJR0NITEQsIHJlZ3MtPmdwclsxXSwKLQkJCXJlZ3MsIDAsIE5VTEwsIE5VTEwpOwotfQotCi1pbnQgc3lzX2V4ZWN2ZSh1bnNpZ25lZCBsb25nIGEwLCB1bnNpZ25lZCBsb25nIGExLCB1bnNpZ25lZCBsb25nIGEyLAotCSAgICAgICB1bnNpZ25lZCBsb25nIGEzLCB1bnNpZ25lZCBsb25nIGE0LCB1bnNpZ25lZCBsb25nIGE1LAotCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlpbnQgZXJyb3I7Ci0JY2hhciAqIGZpbGVuYW1lOwotCi0JZmlsZW5hbWUgPSBnZXRuYW1lKChjaGFyIF9fdXNlciAqKSBhMCk7Ci0JZXJyb3IgPSBQVFJfRVJSKGZpbGVuYW1lKTsKLQlpZiAoSVNfRVJSKGZpbGVuYW1lKSkKLQkJZ290byBvdXQ7Ci0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0JaWYgKHJlZ3MtPm1zciAmIE1TUl9GUCkKLQkJZ2l2ZXVwX2ZwdShjdXJyZW50KTsKLSNpZmRlZiBDT05GSUdfQUxUSVZFQwotCWlmIChyZWdzLT5tc3IgJiBNU1JfVkVDKQotCQlnaXZldXBfYWx0aXZlYyhjdXJyZW50KTsKLSNlbmRpZiAvKiBDT05GSUdfQUxUSVZFQyAqLwotI2lmZGVmIENPTkZJR19TUEUKLQlpZiAocmVncy0+bXNyICYgTVNSX1NQRSkKLQkJZ2l2ZXVwX3NwZShjdXJyZW50KTsKLSNlbmRpZiAvKiBDT05GSUdfU1BFICovCi0JcHJlZW1wdF9lbmFibGUoKTsKLQllcnJvciA9IGRvX2V4ZWN2ZShmaWxlbmFtZSwgKGNoYXIgX191c2VyICpfX3VzZXIgKikgYTEsCi0JCQkgIChjaGFyIF9fdXNlciAqX191c2VyICopIGEyLCByZWdzKTsKLQlpZiAoZXJyb3IgPT0gMCkgewotCQl0YXNrX2xvY2soY3VycmVudCk7Ci0JCWN1cnJlbnQtPnB0cmFjZSAmPSB+UFRfRFRSQUNFOwotCQl0YXNrX3VubG9jayhjdXJyZW50KTsKLQl9Ci0JcHV0bmFtZShmaWxlbmFtZSk7Ci1vdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotCi12b2lkIGR1bXBfc3RhY2sodm9pZCkKLXsKLQlzaG93X3N0YWNrKGN1cnJlbnQsIE5VTEwpOwotfQotCi1FWFBPUlRfU1lNQk9MKGR1bXBfc3RhY2spOwotCi12b2lkIHNob3dfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgKnN0YWNrKQotewotCXVuc2lnbmVkIGxvbmcgc3AsIHN0YWNrX3RvcCwgcHJldl9zcCwgcmV0OwotCWludCBjb3VudCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBuZXh0X2V4YyA9IDA7Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3M7Ci0JZXh0ZXJuIGNoYXIgcmV0X2Zyb21fZXhjZXB0LCByZXRfZnJvbV9leGNlcHRfZnVsbCwgcmV0X2Zyb21fc3lzY2FsbDsKLQotCXNwID0gKHVuc2lnbmVkIGxvbmcpIHN0YWNrOwotCWlmICh0c2sgPT0gTlVMTCkKLQkJdHNrID0gY3VycmVudDsKLQlpZiAoc3AgPT0gMCkgewotCQlpZiAodHNrID09IGN1cnJlbnQpCi0JCQlhc20oIm1yICUwLDEiIDogIj1yIiAoc3ApKTsKLQkJZWxzZQotCQkJc3AgPSB0c2stPnRocmVhZC5rc3A7Ci0JfQotCi0JcHJldl9zcCA9ICh1bnNpZ25lZCBsb25nKSAodHNrLT50aHJlYWRfaW5mbyArIDEpOwotCXN0YWNrX3RvcCA9ICh1bnNpZ25lZCBsb25nKSB0c2stPnRocmVhZF9pbmZvICsgVEhSRUFEX1NJWkU7Ci0Jd2hpbGUgKGNvdW50IDwgMTYgJiYgc3AgPiBwcmV2X3NwICYmIHNwIDwgc3RhY2tfdG9wICYmIChzcCAmIDMpID09IDApIHsKLQkJaWYgKGNvdW50ID09IDApIHsKLQkJCXByaW50aygiQ2FsbCB0cmFjZToiKTsKLSNpZmRlZiBDT05GSUdfS0FMTFNZTVMKLQkJCXByaW50aygiXG4iKTsKLSNlbmRpZgotCQl9IGVsc2UgewotCQkJaWYgKG5leHRfZXhjKSB7Ci0JCQkJcmV0ID0gbmV4dF9leGM7Ci0JCQkJbmV4dF9leGMgPSAwOwotCQkJfSBlbHNlCi0JCQkJcmV0ID0gKih1bnNpZ25lZCBsb25nICopKHNwICsgNCk7Ci0JCQlwcmludGsoIiBbJTA4bHhdICIsIHJldCk7Ci0jaWZkZWYgQ09ORklHX0tBTExTWU1TCi0JCQlwcmludF9zeW1ib2woIiVzIiwgcmV0KTsKLQkJCXByaW50aygiXG4iKTsKLSNlbmRpZgotCQkJaWYgKHJldCA9PSAodW5zaWduZWQgbG9uZykgJnJldF9mcm9tX2V4Y2VwdAotCQkJICAgIHx8IHJldCA9PSAodW5zaWduZWQgbG9uZykgJnJldF9mcm9tX2V4Y2VwdF9mdWxsCi0JCQkgICAgfHwgcmV0ID09ICh1bnNpZ25lZCBsb25nKSAmcmV0X2Zyb21fc3lzY2FsbCkgewotCQkJCS8qIHNwICsgMTYgcG9pbnRzIHRvIGFuIGV4Y2VwdGlvbiBmcmFtZSAqLwotCQkJCXJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgKHNwICsgMTYpOwotCQkJCWlmIChzcCArIDE2ICsgc2l6ZW9mKCpyZWdzKSA8PSBzdGFja190b3ApCi0JCQkJCW5leHRfZXhjID0gcmVncy0+bmlwOwotCQkJfQotCQl9Ci0JCSsrY291bnQ7Ci0JCXNwID0gKih1bnNpZ25lZCBsb25nICopc3A7Ci0JfQotI2lmbmRlZiBDT05GSUdfS0FMTFNZTVMKLQlpZiAoY291bnQgPiAwKQotCQlwcmludGsoIlxuIik7Ci0jZW5kaWYKLX0KLQotI2lmIDAKLS8qCi0gKiBMb3cgbGV2ZWwgcHJpbnQgZm9yIGRlYnVnZ2luZyAtIENvcnQKLSAqLwotaW50IF9faW5pdCBsbF9wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgICAgIHZhX2xpc3QgYXJnczsKLQljaGFyIGJ1ZlsyNTZdOwotICAgICAgICBpbnQgaTsKLQotICAgICAgICB2YV9zdGFydChhcmdzLCBmbXQpOwotICAgICAgICBpPXZzcHJpbnRmKGJ1ZixmbXQsYXJncyk7Ci0JbGxfcHV0cyhidWYpOwotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiBpOwotfQotCi1pbnQgbGluZXMgPSAyNCwgY29scyA9IDgwOwotaW50IG9yaWdfeCA9IDAsIG9yaWdfeSA9IDA7Ci0KLXZvaWQgcHV0aGV4KHVuc2lnbmVkIGxvbmcgdmFsKQotewotCXVuc2lnbmVkIGNoYXIgYnVmWzEwXTsKLQlpbnQgaTsKLQlmb3IgKGkgPSA3OyAgaSA+PSAwOyAgaS0tKQotCXsKLQkJYnVmW2ldID0gIjAxMjM0NTY3ODlBQkNERUYiW3ZhbCAmIDB4MEZdOwotCQl2YWwgPj49IDQ7Ci0JfQotCWJ1Zls4XSA9ICdcMCc7Ci0JcHJvbV9wcmludChidWYpOwotfQotCi12b2lkIF9faW5pdCBsbF9wdXRzKGNvbnN0IGNoYXIgKnMpCi17Ci0JaW50IHgseTsKLQljaGFyICp2aWRtZW0gPSAoY2hhciAqKS8qKF9JU0FfTUVNX0JBU0UgKyAweEI4MDAwKSAqLzB4RDAwQjgwMDA7Ci0JY2hhciBjOwotCWV4dGVybiBpbnQgbWVtX2luaXRfZG9uZTsKLQotCWlmICggbWVtX2luaXRfZG9uZSApIC8qIGFzc3VtZSB0aGlzIG1lYW5zIHdlIGNhbiBwcmludGsgKi8KLQl7Ci0JCXByaW50ayhzKTsKLQkJcmV0dXJuOwotCX0KLQotI2lmIDAKLQlpZiAoIGhhdmVfb2YgKQotCXsKLQkJcHJvbV9wcmludChzKTsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZgotCi0JLyoKLQkgKiBjYW4ndCBsbF9wdXRzIG9uIGNocnAgd2l0aG91dCBvcGVuZmlybXdhcmUgeWV0LgotCSAqIHZpZG1lbSBqdXN0IG5lZWRzIHRvIGJlIHNldHVwIGZvciBpdC4KLQkgKiAtLSBDb3J0Ci0JICovCi0JaWYgKCBfbWFjaGluZSAhPSBfTUFDSF9wcmVwICkKLQkJcmV0dXJuOwotCXggPSBvcmlnX3g7Ci0JeSA9IG9yaWdfeTsKLQotCXdoaWxlICggKCBjID0gKnMrKyApICE9ICdcMCcgKSB7Ci0JCWlmICggYyA9PSAnXG4nICkgewotCQkJeCA9IDA7Ci0JCQlpZiAoICsreSA+PSBsaW5lcyApIHsKLQkJCQkvKnNjcm9sbCgpOyovCi0JCQkJLyp5LS07Ki8KLQkJCQl5ID0gMDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXZpZG1lbSBbICggeCArIGNvbHMgKiB5ICkgKiAyIF0gPSBjOwotCQkJaWYgKCArK3ggPj0gY29scyApIHsKLQkJCQl4ID0gMDsKLQkJCQlpZiAoICsreSA+PSBsaW5lcyApIHsKLQkJCQkJLypzY3JvbGwoKTsqLwotCQkJCQkvKnktLTsqLwotCQkJCQl5ID0gMDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlvcmlnX3ggPSB4OwotCW9yaWdfeSA9IHk7Ci19Ci0jZW5kaWYKLQotdW5zaWduZWQgbG9uZyBnZXRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKQotewotCXVuc2lnbmVkIGxvbmcgaXAsIHNwOwotCXVuc2lnbmVkIGxvbmcgc3RhY2tfcGFnZSA9ICh1bnNpZ25lZCBsb25nKSBwLT50aHJlYWRfaW5mbzsKLQlpbnQgY291bnQgPSAwOwotCWlmICghcCB8fCBwID09IGN1cnJlbnQgfHwgcC0+c3RhdGUgPT0gVEFTS19SVU5OSU5HKQotCQlyZXR1cm4gMDsKLQlzcCA9IHAtPnRocmVhZC5rc3A7Ci0JZG8gewotCQlzcCA9ICoodW5zaWduZWQgbG9uZyAqKXNwOwotCQlpZiAoc3AgPCBzdGFja19wYWdlIHx8IHNwID49IHN0YWNrX3BhZ2UgKyA4MTg4KQotCQkJcmV0dXJuIDA7Ci0JCWlmIChjb3VudCA+IDApIHsKLQkJCWlwID0gKih1bnNpZ25lZCBsb25nICopKHNwICsgNCk7Ci0JCQlpZiAoIWluX3NjaGVkX2Z1bmN0aW9ucyhpcCkpCi0JCQkJcmV0dXJuIGlwOwotCQl9Ci0JfSB3aGlsZSAoY291bnQrKyA8IDE2KTsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9wcGMva2VybmVsL3NldHVwLmMKaW5kZXggMGViMGI3MC4uYzA4YWI0MzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9zZXR1cC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvbW1vbiBwcmVwL3BtYWMvY2hycCBib290IGFuZCBzZXR1cCBjb2RlLgorICogQ29tbW9uIHByZXAvY2hycCBib290IGFuZCBzZXR1cCBjb2RlLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9wbWFjX2ZlYXR1cmUuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vbnZyYW0uaD4KICNpbmNsdWRlIDxhc20veG1vbi5oPgpAQCAtNTUsNyArNTQsNiBAQAogCiBleHRlcm4gdm9pZCBwbGF0Zm9ybV9pbml0KHVuc2lnbmVkIGxvbmcgcjMsIHVuc2lnbmVkIGxvbmcgcjQsCiAJCXVuc2lnbmVkIGxvbmcgcjUsIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcpOwotZXh0ZXJuIHZvaWQgYm9vdHhfaW5pdCh1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHBoeXMpOwogZXh0ZXJuIHZvaWQgaWRlbnRpZnlfY3B1KHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGNwdSk7CiBleHRlcm4gdm9pZCBkb19jcHVfZnRyX2ZpeHVwcyh1bnNpZ25lZCBsb25nIG9mZnNldCk7CiBleHRlcm4gdm9pZCByZWxvY19nb3QyKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKQEAgLTgwLDggKzc4LDYgQEAKIAogZXh0ZXJuIHZvaWQgcHJlcF9pbml0KHVuc2lnbmVkIGxvbmcgcjMsIHVuc2lnbmVkIGxvbmcgcjQsCiAJCXVuc2lnbmVkIGxvbmcgcjUsIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcpOwotZXh0ZXJuIHZvaWQgcG1hY19pbml0KHVuc2lnbmVkIGxvbmcgcjMsIHVuc2lnbmVkIGxvbmcgcjQsCi0JCXVuc2lnbmVkIGxvbmcgcjUsIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcpOwogZXh0ZXJuIHZvaWQgY2hycF9pbml0KHVuc2lnbmVkIGxvbmcgcjMsIHVuc2lnbmVkIGxvbmcgcjQsCiAJCXVuc2lnbmVkIGxvbmcgcjUsIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcpOwogCkBAIC0zMjQsMjAgKzMyMCwxNSBAQAogCWlkZW50aWZ5X2NwdShvZmZzZXQsIDApOwogCWRvX2NwdV9mdHJfZml4dXBzKG9mZnNldCk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19QUENfTVVMVElQTEFURk9STSkKKyNpZiBkZWZpbmVkKENPTkZJR19QUENfT0YpCiAJcmVsb2NfZ290MihvZmZzZXQpOwogCi0JLyogSWYgd2UgY2FtZSBoZXJlIGZyb20gQm9vdFgsIGNsZWFyIHRoZSBzY3JlZW4sCi0JICogc2V0IHVwIHNvbWUgcG9pbnRlcnMgYW5kIHJldHVybi4gKi8KLQlpZiAoKHIzID09IDB4NDI2ZjZmNTgpICYmIChyNSA9PSAwKSkKLQkJYm9vdHhfaW5pdChyNCwgcGh5cyk7Ci0KIAkvKgogCSAqIGRvbid0IGRvIGFueXRoaW5nIG9uIHByZXAKIAkgKiBmb3Igbm93LCBkb24ndCB1c2UgYm9vdGluZm8gYmVjYXVzZSBpdCBicmVha3MgeWFib290IDAuNQogCSAqIGFuZCBhc3N1bWUgdGhhdCBpZiB3ZSBkaWRuJ3QgZmluZCBhIG1hZ2ljIG51bWJlciwgd2UgaGF2ZSBPRgogCSAqLwotCWVsc2UgaWYgKCoodW5zaWduZWQgbG9uZyAqKSgwKSAhPSAweGRlYWRjMGRlKQorCWlmICgqKHVuc2lnbmVkIGxvbmcgKikoMCkgIT0gMHhkZWFkYzBkZSkKIAkJcGh5cyA9IHByb21faW5pdChyMywgcjQsIChwcm9tX2VudHJ5KXI1KTsKIAogCXJlbG9jX2dvdDIoLW9mZnNldCk7CkBAIC00MjQsNiArNDE1LDcgQEAKIAl9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19QUENfT0YKIAloYXZlX29mID0gMTsKIAogCS8qIHByb21faW5pdCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmcm9tIF9fc3RhcnQgKi8KQEAgLTQ5NSwxOSArNDg3LDE3IEBACiAjZW5kaWYgLyogQ09ORklHX0FEQiAqLwogCiAJc3dpdGNoIChfbWFjaGluZSkgewotI2lmZGVmIENPTkZJR19QUENfUE1BQwotCWNhc2UgX01BQ0hfUG1hYzoKLQkJcG1hY19pbml0KHIzLCByNCwgcjUsIHI2LCByNyk7Ci0JCWJyZWFrOwotI2VuZGlmCiAjaWZkZWYgQ09ORklHX1BQQ19DSFJQCiAJY2FzZSBfTUFDSF9jaHJwOgogCQljaHJwX2luaXQocjMsIHI0LCByNSwgcjYsIHI3KTsKIAkJYnJlYWs7CiAjZW5kaWYKIAl9CisjZW5kaWYgLyogQ09ORklHX1BQQ19PRiAqLwogfQorI2VuZGlmIC8qIENPTkZJR19QUENfTVVMVElQTEFURk9STSAqLwogCisjaWZkZWYgQ09ORklHX1BQQ19PRgogI2lmZGVmIENPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFCiBleHRlcm4gY2hhciAqb2Zfc3Rkb3V0X2RldmljZTsKIApAQCAtNTY0LDcgKzU1NCw3IEBACiB9CiBjb25zb2xlX2luaXRjYWxsKHNldF9wcmVmZXJyZWRfY29uc29sZSk7CiAjZW5kaWYgLyogQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEUgKi8KLSNlbmRpZiAvKiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0gKi8KKyNlbmRpZiAvKiBDT05GSUdfUFBDX09GICovCiAKIHN0cnVjdCBiaV9yZWNvcmQgKmZpbmRfYm9vdGluZm8odm9pZCkKIHsKQEAgLTc0NCwxMyArNzM0LDggQEAKIAkvKiBzbyB1ZGVsYXkgZG9lcyBzb21ldGhpbmcgc2Vuc2libGUsIGFzc3VtZSA8PSAxMDAwIGJvZ29taXBzICovCiAJbG9vcHNfcGVyX2ppZmZ5ID0gNTAwMDAwMDAwIC8gSFo7CiAKLSNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KLQkvKiBUaGlzIGNvdWxkIGJlIGNhbGxlZCAiZWFybHkgc2V0dXAgYXJjaCIsIGl0IG11c3QgYmUgZG9uZQotCSAqIG5vdyBiZWNhdXNlIHhtb24gbmVlZCBpdAotCSAqLwotCWlmIChfbWFjaGluZSA9PSBfTUFDSF9QbWFjKQotCQlwbWFjX2ZlYXR1cmVfaW5pdCgpOwkvKiBOZXcgY29vbCB3YXkgKi8KLSNlbmRpZgorCWlmIChwcGNfbWQuaW5pdF9lYXJseSkKKwkJcHBjX21kLmluaXRfZWFybHkoKTsKIAogI2lmZGVmIENPTkZJR19YTU9OCiAJeG1vbl9pbml0KDEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL3NtcC5jIGIvYXJjaC9wcGMva2VybmVsL3NtcC5jCmluZGV4IGJlY2JmYTMuLmU1NWNkZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvc21wLmMKQEAgLTMxOCw3ICszMTgsNyBAQAogCQlwID0gZm9ya19pZGxlKGNwdSk7CiAJCWlmIChJU19FUlIocCkpCiAJCQlwYW5pYygiZmFpbGVkIGZvcmsgZm9yIENQVSAldTogJWxpIiwgY3B1LCBQVFJfRVJSKHApKTsKLQkJcC0+dGhyZWFkX2luZm8tPmNwdSA9IGNwdTsKKwkJdGFza190aHJlYWRfaW5mbyhwKS0+Y3B1ID0gY3B1OwogCQlpZGxlX3Rhc2tzW2NwdV0gPSBwOwogCX0KIH0KQEAgLTM2OSw3ICszNjksNyBAQAogCWNoYXIgYnVmWzMyXTsKIAlpbnQgYzsKIAotCXNlY29uZGFyeV90aSA9IGlkbGVfdGFza3NbY3B1XS0+dGhyZWFkX2luZm87CisJc2Vjb25kYXJ5X3RpID0gdGFza190aHJlYWRfaW5mbyhpZGxlX3Rhc2tzW2NwdV0pOwogCW1iKCk7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL3RyYXBzLmMgYi9hcmNoL3BwYy9rZXJuZWwvdHJhcHMuYwppbmRleCA5ZGJjNGQyLi42ZDBhMTgzIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvdHJhcHMuYwpAQCAtMzgsOSArMzgsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9yZWcuaD4KICNpbmNsdWRlIDxhc20veG1vbi5oPgotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotI2luY2x1ZGUgPGFzbS9iYWNrbGlnaHQuaD4KLSNlbmRpZgogI2luY2x1ZGUgPGFzbS9wbWMuaD4KIAogI2lmZGVmIENPTkZJR19YTU9OCkBAIC04NSwxMiArODIsNiBAQAogCWludCBubCA9IDA7CiAJY29uc29sZV92ZXJib3NlKCk7CiAJc3Bpbl9sb2NrX2lycSgmZGllX2xvY2spOwotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotCWlmIChfbWFjaGluZSA9PSBfTUFDSF9QbWFjKSB7Ci0JCXNldF9iYWNrbGlnaHRfZW5hYmxlKDEpOwotCQlzZXRfYmFja2xpZ2h0X2xldmVsKEJBQ0tMSUdIVF9NQVgpOwotCX0KLSNlbmRpZgogCXByaW50aygiT29wczogJXMsIHNpZzogJWxkIFsjJWRdXG4iLCBzdHIsIGVyciwgKytkaWVfY291bnRlcik7CiAjaWZkZWYgQ09ORklHX1BSRUVNUFQKIAlwcmludGsoIlBSRUVNUFQgIik7CkBAIC0xNTksNyArMTUwLDcgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgY2hlY2tfaW9fYWNjZXNzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIGRlZmluZWQgQ09ORklHX1BQQ19QTUFDIHx8IGRlZmluZWQgQ09ORklHXzh4eAorI2lmIGRlZmluZWQgQ09ORklHXzh4eAogCXVuc2lnbmVkIGxvbmcgbXNyID0gcmVncy0+bXNyOwogCWNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKmVudHJ5OwogCXVuc2lnbmVkIGludCAqbmlwID0gKHVuc2lnbmVkIGludCAqKXJlZ3MtPm5pcDsKQEAgLTE5Niw3ICsxODcsNyBAQAogCQkJcmV0dXJuIDE7CiAJCX0KIAl9Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCisjZW5kaWYgLyogQ09ORklHXzh4eCAqLwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9tbS9pbml0LmMgYi9hcmNoL3BwYy9tbS9pbml0LmMKaW5kZXggNDVmMDc4Mi4uMTM0ZGI1YyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvbW0vaW5pdC5jCisrKyBiL2FyY2gvcHBjL21tL2luaXQuYwpAQCAtNjcsMTAgKzY3LDYgQEAKIGludCBtZW1faW5pdF9kb25lOwogaW50IGluaXRfYm9vdG1lbV9kb25lOwogaW50IGJvb3RfbWFwc2l6ZTsKLSNpZmRlZiBDT05GSUdfUFBDX1BNQUMKLXVuc2lnbmVkIGxvbmcgYWdwX3NwZWNpYWxfcGFnZTsKLUVYUE9SVF9TWU1CT0woYWdwX3NwZWNpYWxfcGFnZSk7Ci0jZW5kaWYKIAogZXh0ZXJuIGNoYXIgX2VuZFtdOwogZXh0ZXJuIGNoYXIgZXRleHRbXSwgX3N0ZXh0W107CkBAIC00MjQsMTAgKzQyMCw2IEBACiAJCSAgICAgYWRkciArPSBQQUdFX1NJWkUpCiAJCQlTZXRQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKGFkZHIpKTsKICNlbmRpZgotI2lmZGVmIENPTkZJR19QUENfUE1BQwotCWlmIChhZ3Bfc3BlY2lhbF9wYWdlKQotCQlTZXRQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKGFncF9zcGVjaWFsX3BhZ2UpKTsKLSNlbmRpZgogCWZvciAoYWRkciA9IFBBR0VfT0ZGU0VUOyBhZGRyIDwgKHVuc2lnbmVkIGxvbmcpaGlnaF9tZW1vcnk7CiAJICAgICBhZGRyICs9IFBBR0VfU0laRSkgewogCQlpZiAoIVBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UoYWRkcikpKQpAQCAtNDYzLDExICs0NTUsNiBAQAogCSAgICAgICBpbml0cGFnZXM8PCAoUEFHRV9TSElGVC0xMCksCiAJICAgICAgICh1bnNpZ25lZCBsb25nKSAodG90YWxoaWdoX3BhZ2VzIDw8IChQQUdFX1NISUZULTEwKSkpOwogCi0jaWZkZWYgQ09ORklHX1BQQ19QTUFDCi0JaWYgKGFncF9zcGVjaWFsX3BhZ2UpCi0JCXByaW50ayhLRVJOX0lORk8gIkFHUCBzcGVjaWFsIHBhZ2U6IDB4JTA4bHhcbiIsIGFncF9zcGVjaWFsX3BhZ2UpOwotI2VuZGlmCi0KIAltZW1faW5pdF9kb25lID0gMTsKIH0KIApAQCAtNTEyLDIyICs0OTksNiBAQAogCWlmIChydGFzX2RhdGEpCiAJCW1lbV9waWVjZXNfcmVtb3ZlKCZwaHlzX2F2YWlsLCBydGFzX2RhdGEsIHJ0YXNfc2l6ZSwgMSk7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfUFBDX1BNQUMKLQkvKiBCZWNhdXNlIG9mIHNvbWUgdW5pbm9ydGggd2VpcmRuZXNzLCB3ZSBuZWVkIGEgcGFnZSBvZgotCSAqIG1lbW9yeSBhcyBoaWdoIGFzIHBvc3NpYmxlIChpdCBtdXN0IGJlIG91dHNpZGUgb2YgdGhlCi0JICogYnVzIGFkZHJlc3Mgc2VlbiBhcyB0aGUgQUdQIGFwZXJ0dXJlKS4gSXQgd2lsbCBiZSB1c2VkCi0JICogYnkgdGhlIHIxMjggRFJNIGRyaXZlcgotCSAqCi0JICogRklYTUU6IFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgcGFnZSBkb2Vzbid0IG92ZXJsYXAgYW55IG9mIHRoZVwKLQkgKiBhYm92ZS4gVGhpcyBjb3VsZCBiZSBkb25lIGJ5IGltcHJvdmluZyBtZW1fcGllY2VzX2ZpbmQgdG8gYmUgYWJsZQotCSAqIHRvIGRvIGEgYmFja3dhcmQgc2VhcmNoIGZyb20gdGhlIGVuZCBvZiB0aGUgbGlzdC4KLQkgKi8KLQlpZiAoX21hY2hpbmUgPT0gX01BQ0hfUG1hYyAmJiBmaW5kX2RldmljZXMoInVuaS1ub3J0aC1hZ3AiKSkgewotCQlhZ3Bfc3BlY2lhbF9wYWdlID0gKHRvdGFsX21lbW9yeSAtIFBBR0VfU0laRSk7Ci0JCW1lbV9waWVjZXNfcmVtb3ZlKCZwaHlzX2F2YWlsLCBhZ3Bfc3BlY2lhbF9wYWdlLCBQQUdFX1NJWkUsIDApOwotCQlhZ3Bfc3BlY2lhbF9wYWdlID0gKHVuc2lnbmVkIGxvbmcpX192YShhZ3Bfc3BlY2lhbF9wYWdlKTsKLQl9Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCiB9CiAKIC8qIE1hcmsgc29tZSBtZW1vcnkgYXMgcmVzZXJ2ZWQgYnkgcmVtb3ZpbmcgaXQgZnJvbSBwaHlzX2F2YWlsLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfc3lzLmMKaW5kZXggMDRiZGMzOS4uMDEyZTFlNiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5jCkBAIC01MSw5ICs1MSw2IEBACiAKICNpbmNsdWRlIDxzeXNsaWIvcHBjODN4eF9zZXR1cC5oPgogCi1zdGF0aWMgY29uc3QgY2hhciAqR0ZBUl9QSFlfMCA9ICJwaHkwOjAiOwotc3RhdGljIGNvbnN0IGNoYXIgKkdGQVJfUEhZXzEgPSAicGh5MDoxIjsKLQogI2lmbmRlZiBDT05GSUdfUENJCiB1bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKIHVuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKQEAgLTEyOSwyMCArMTI2LDIxIEBACiAJbWRhdGEtPmlycVsxXSA9IE1QQzgzeHhfSVJRX0VYVDI7CiAJbWRhdGEtPmlycVsyXSA9IC0xOwogCW1kYXRhLT5pcnFbMzFdID0gLTE7Ci0JbWRhdGEtPnBhZGRyICs9IGJpbmZvLT5iaV9pbW1yX2Jhc2U7CiAKIAkvKiBzZXR1cCB0aGUgYm9hcmQgcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGVuZXQgY29udHJvbGxlcnMgKi8KIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzgzeHhfVFNFQzEpOwogCWlmIChwZGF0YSkgewogCQlwZGF0YS0+Ym9hcmRfZmxhZ3MgPSBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSOwotCQlwZGF0YS0+YnVzX2lkID0gR0ZBUl9QSFlfMDsKKwkJcGRhdGEtPmJ1c19pZCA9IDA7CisJCXBkYXRhLT5waHlfaWQgPSAwOwogCQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldGFkZHIsIDYpOwogCX0KIAogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODN4eF9UU0VDMik7CiAJaWYgKHBkYXRhKSB7CiAJCXBkYXRhLT5ib2FyZF9mbGFncyA9IEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFI7Ci0JCXBkYXRhLT5idXNfaWQgPSBHRkFSX1BIWV8xOworCQlwZGF0YS0+YnVzX2lkID0gMDsKKwkJcGRhdGEtPnBoeV9pZCA9IDE7CiAJCW1lbWNweShwZGF0YS0+bWFjX2FkZHIsIGJpbmZvLT5iaV9lbmV0MWFkZHIsIDYpOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvS2NvbmZpZyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L0tjb25maWcKaW5kZXggYzViYzI4Mi4uN2RkZDMzMSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvS2NvbmZpZworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9LY29uZmlnCkBAIC0zOSw3ICszOSw3IEBACiBjb25maWcgU0JDODU2MAogCWJvb2wgIldpbmRSaXZlciBQb3dlclFVSUNDIElJSSBTQkM4NTYwIgogCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFdpbmRSaXZlciBQb3dlclFVSUNDIElJSSAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFdpbmRSaXZlciBQb3dlclFVSUNDIElJSQogCSAgU0JDODU2MCBib2FyZC4KIAogY29uZmlnIFNUWF9HUDMKQEAgLTQ4LDYgKzQ4LDI2IEBACiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBTaWxpY29uIFR1cm5rZXkgRXhwcmVzcyBHUDMKIAkgIGJvYXJkLgogCitjb25maWcgVFFNODU0MAorCWJvb2wgIlRRIENvbXBvbmVudHMgVFFNODU0MCIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzZSBzdXBwb3J0IGZvciB0aGUgVFEgQ29tcG9uZW50cyBUUU04NTQwIGJvYXJkLgorCitjb25maWcgVFFNODU0MQorCWJvb2wgIlRRIENvbXBvbmVudHMgVFFNODU0MSIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzZSBzdXBwb3J0IGZvciB0aGUgVFEgQ29tcG9uZW50cyBUUU04NTQxIGJvYXJkLgorCitjb25maWcgVFFNODU1NQorCWJvb2wgIlRRIENvbXBvbmVudHMgVFFNODU1NSIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzZSBzdXBwb3J0IGZvciB0aGUgVFEgQ29tcG9uZW50cyBUUU04NTU1IGJvYXJkLgorCitjb25maWcgVFFNODU2MAorCWJvb2wgIlRRIENvbXBvbmVudHMgVFFNODU2MCIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzZSBzdXBwb3J0IGZvciB0aGUgVFEgQ29tcG9uZW50cyBUUU04NTYwIGJvYXJkLgorCiBlbmRjaG9pY2UKIAogIyBJdCdzIG9mdGVuIG5lY2Vzc2FyeSB0byBrbm93IHRoZSBzcGVjaWZpYyA4NXh4IHByb2Nlc3NvciB0eXBlLgpAQCAtNTUsNyArNzUsNyBAQAogIyBkb24ndCBuZWVkIHRvIGFzayBtb3JlIHJlZHVuZGFudCBxdWVzdGlvbnMuCiBjb25maWcgTVBDODU0MAogCWJvb2wKLQlkZXBlbmRzIG9uIE1QQzg1NDBfQURTCisJZGVwZW5kcyBvbiBNUEM4NTQwX0FEUyB8fCBUUU04NTQwCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBNUEM4NTQ4CkBAIC02NSwxMiArODUsMTIgQEAKIAogY29uZmlnIE1QQzg1NTUKIAlib29sCi0JZGVwZW5kcyBvbiBNUEM4NTU1X0NEUworCWRlcGVuZHMgb24gTVBDODU1NV9DRFMgfHwgVFFNODU0MSB8fCBUUU04NTU1CiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBNUEM4NTYwCiAJYm9vbAotCWRlcGVuZHMgb24gU0JDODU2MCB8fCBNUEM4NTYwX0FEUyB8fCBTVFhfR1AzCisJZGVwZW5kcyBvbiBTQkM4NTYwIHx8IE1QQzg1NjBfQURTIHx8IFNUWF9HUDMgfHwgVFFNODU2MAogCWRlZmF1bHQgeQogCiBjb25maWcgODV4eF9QQ0kyCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9NYWtlZmlsZSBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L01ha2VmaWxlCmluZGV4IGVmZGY4MTMuLjZjNDc1M2MgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L01ha2VmaWxlCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L01ha2VmaWxlCkBAIC03LDMgKzcsNyBAQAogb2JqLSQoQ09ORklHX01QQzg1NjBfQURTKQkrPSBtcGM4NXh4X2Fkc19jb21tb24ubyBtcGM4NTYwX2Fkcy5vCiBvYmotJChDT05GSUdfU0JDODU2MCkJCSs9IHNiYzg1eHgubyBzYmM4NTYwLm8KIG9iai0kKENPTkZJR19TVFhfR1AzKQkJKz0gc3R4X2dwMy5vCitvYmotJChDT05GSUdfVFFNODU0MCkJCSs9IHRxbTg1eHgubworb2JqLSQoQ09ORklHX1RRTTg1NDEpCQkrPSB0cW04NXh4Lm8KK29iai0kKENPTkZJR19UUU04NTU1KQkJKz0gdHFtODV4eC5vCitvYmotJChDT05GSUdfVFFNODU2MCkJCSs9IHRxbTg1eHgubwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODU0MF9hZHMuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NDBfYWRzLmMKaW5kZXggYzVjZGU5Ny4uMmVjZWIxZSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODU0MF9hZHMuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTQwX2Fkcy5jCkBAIC01MiwxMCArNTIsNiBAQAogCiAjaW5jbHVkZSA8c3lzbGliL3BwYzg1eHhfc2V0dXAuaD4KIAotc3RhdGljIGNvbnN0IGNoYXIgKkdGQVJfUEhZXzAgPSAicGh5MDowIjsKLXN0YXRpYyBjb25zdCBjaGFyICpHRkFSX1BIWV8xID0gInBoeTA6MSI7Ci1zdGF0aWMgY29uc3QgY2hhciAqR0ZBUl9QSFlfMyA9ICJwaHkwOjMiOwotCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCkBAIC0xMDIsMjcgKzk4LDI5IEBACiAJbWRhdGEtPmlycVsyXSA9IC0xOwogCW1kYXRhLT5pcnFbM10gPSBNUEM4NXh4X0lSUV9FWFQ1OwogCW1kYXRhLT5pcnFbMzFdID0gLTE7Ci0JbWRhdGEtPnBhZGRyICs9IGJpbmZvLT5iaV9pbW1yX2Jhc2U7CiAKIAkvKiBzZXR1cCB0aGUgYm9hcmQgcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGVuZXQgY29udHJvbGxlcnMgKi8KIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfVFNFQzEpOwogCWlmIChwZGF0YSkgewogCQlwZGF0YS0+Ym9hcmRfZmxhZ3MgPSBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSOwotCQlwZGF0YS0+YnVzX2lkID0gR0ZBUl9QSFlfMDsKKwkJcGRhdGEtPmJ1c19pZCA9IDA7CisJCXBkYXRhLT5waHlfaWQgPSAwOwogCQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldGFkZHIsIDYpOwogCX0KIAogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9UU0VDMik7CiAJaWYgKHBkYXRhKSB7CiAJCXBkYXRhLT5ib2FyZF9mbGFncyA9IEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFI7Ci0JCXBkYXRhLT5idXNfaWQgPSBHRkFSX1BIWV8xOworCQlwZGF0YS0+YnVzX2lkID0gMDsKKwkJcGRhdGEtPnBoeV9pZCA9IDE7CiAJCW1lbWNweShwZGF0YS0+bWFjX2FkZHIsIGJpbmZvLT5iaV9lbmV0MWFkZHIsIDYpOwogCX0KIAogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9GRUMpOwogCWlmIChwZGF0YSkgewogCQlwZGF0YS0+Ym9hcmRfZmxhZ3MgPSAwOwotCQlwZGF0YS0+YnVzX2lkID0gR0ZBUl9QSFlfMzsKKwkJcGRhdGEtPmJ1c19pZCA9IDA7CisJCXBkYXRhLT5waHlfaWQgPSAzOwogCQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldDJhZGRyLCA2KTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NjBfYWRzLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTYwX2Fkcy5jCmluZGV4IDhlMzlhNTUuLjQ0MmM3ZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NjBfYWRzLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODU2MF9hZHMuYwpAQCAtNTYsMTAgKzU2LDYgQEAKICNpbmNsdWRlIDxzeXNsaWIvcHBjODV4eF9zZXR1cC5oPgogCiAKLXN0YXRpYyBjb25zdCBjaGFyICpHRkFSX1BIWV8wID0gInBoeTA6MCI7Ci1zdGF0aWMgY29uc3QgY2hhciAqR0ZBUl9QSFlfMSA9ICJwaHkwOjEiOwotc3RhdGljIGNvbnN0IGNoYXIgKkdGQVJfUEhZXzMgPSAicGh5MDozIjsKLQogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogU2V0dXAgdGhlIGFyY2hpdGVjdHVyZQpAQCAtOTksMjAgKzk1LDIxIEBACiAJbWRhdGEtPmlycVsyXSA9IC0xOwogCW1kYXRhLT5pcnFbM10gPSBNUEM4NXh4X0lSUV9FWFQ1OwogCW1kYXRhLT5pcnFbMzFdID0gLTE7Ci0JbWRhdGEtPnBhZGRyICs9IGJpbmZvLT5iaV9pbW1yX2Jhc2U7CiAKIAkvKiBzZXR1cCB0aGUgYm9hcmQgcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGVuZXQgY29udHJvbGxlcnMgKi8KIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfVFNFQzEpOwogCWlmIChwZGF0YSkgewogCQlwZGF0YS0+Ym9hcmRfZmxhZ3MgPSBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSOwotCQlwZGF0YS0+YnVzX2lkID0gR0ZBUl9QSFlfMDsKKwkJcGRhdGEtPmJ1c19pZCA9IDA7CisJCXBkYXRhLT5waHlfaWQgPSAwOwogCQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldGFkZHIsIDYpOwogCX0KIAogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9UU0VDMik7CiAJaWYgKHBkYXRhKSB7CiAJCXBkYXRhLT5ib2FyZF9mbGFncyA9IEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFI7Ci0JCXBkYXRhLT5idXNfaWQgPSBHRkFSX1BIWV8xOworCQlwZGF0YS0+YnVzX2lkID0gMDsKKwkJcGRhdGEtPnBoeV9pZCA9IDE7CiAJCW1lbWNweShwZGF0YS0+bWFjX2FkZHIsIGJpbmZvLT5iaV9lbmV0MWFkZHIsIDYpOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHNfY29tbW9uLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkc19jb21tb24uYwppbmRleCA1ZThjYzVlLi5iMzMyZWJhIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkc19jb21tb24uYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkc19jb21tb24uYwpAQCAtMzUxLDEwICszNTEsMTAgQEAKIHZvaWQgX19pbml0CiBtcGM4NXh4X2Nkc19wY2liaW9zX2ZpeHVwKHZvaWQpCiB7Ci0gICAgICAgIHN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworICAgICAgICBzdHJ1Y3QgcGNpX2RldiAqZGV2OwogCXVfY2hhcgkJYzsKIAotICAgICAgICBpZiAoKGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX1ZJQSwKKwlpZiAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfVklBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8xLCBOVUxMKSkpIHsKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIFUtQm9vdCBkb2VzIG5vdCBzZXQgdGhlIGVuYWJsZSBiaXRzCkBAIC0zNzEsMzAgKzM3MSwzMCBAQAogCQkgKi8KICAgICAgICAgICAgICAgICBkZXYtPmlycSA9IDE0OwogICAgICAgICAgICAgICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgZGV2LT5pcnEpOworCQlwY2lfZGV2X3B1dChkZXYpOwogICAgICAgICB9CiAKIAkvKgogCSAqIEZvcmNlIGxlZ2FjeSBVU0IgaW50ZXJydXB0IHJvdXRpbmcKIAkgKi8KLSAgICAgICAgaWYgKChkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9WSUEsCisJaWYgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1ZJQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMiwgTlVMTCkpKSB7CiAgICAgICAgICAgICAgICAgZGV2LT5pcnEgPSAxMDsKICAgICAgICAgICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIDEwKTsKKwkJcGNpX2Rldl9wdXQoZGV2KTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgoZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfVklBLAorCWlmICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9WSUEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzIsIGRldikpKSB7CiAgICAgICAgICAgICAgICAgZGV2LT5pcnEgPSAxMTsKICAgICAgICAgICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIDExKTsKKwkJcGNpX2Rldl9wdXQoZGV2KTsKICAgICAgICAgfQogfQogI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KIAogVE9EQ19BTExPQygpOwogCi1zdGF0aWMgY29uc3QgY2hhciAqR0ZBUl9QSFlfMCA9ICJwaHkwOjAiOwotc3RhdGljIGNvbnN0IGNoYXIgKkdGQVJfUEhZXzEgPSAicGh5MDoxIjsKLQogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogU2V0dXAgdGhlIGFyY2hpdGVjdHVyZQpAQCAtNDU4LDM0ICs0NTgsMzcgQEAKIAltZGF0YS0+aXJxWzJdID0gLTE7CiAJbWRhdGEtPmlycVszXSA9IC0xOwogCW1kYXRhLT5pcnFbMzFdID0gLTE7Ci0JbWRhdGEtPnBhZGRyICs9IGJpbmZvLT5iaV9pbW1yX2Jhc2U7CiAKIAkvKiBzZXR1cCB0aGUgYm9hcmQgcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGVuZXQgY29udHJvbGxlcnMgKi8KIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfVFNFQzEpOwogCWlmIChwZGF0YSkgewogCQlwZGF0YS0+Ym9hcmRfZmxhZ3MgPSBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSOwotCQlwZGF0YS0+YnVzX2lkID0gR0ZBUl9QSFlfMDsKKwkJcGRhdGEtPmJ1c19pZCA9IDA7CisJCXBkYXRhLT5waHlfaWQgPSAwOwogCQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldGFkZHIsIDYpOwogCX0KIAogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9UU0VDMik7CiAJaWYgKHBkYXRhKSB7CiAJCXBkYXRhLT5ib2FyZF9mbGFncyA9IEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFI7Ci0JCXBkYXRhLT5idXNfaWQgPSBHRkFSX1BIWV8xOworCQlwZGF0YS0+YnVzX2lkID0gMDsKKwkJcGRhdGEtPnBoeV9pZCA9IDE7CiAJCW1lbWNweShwZGF0YS0+bWFjX2FkZHIsIGJpbmZvLT5iaV9lbmV0MWFkZHIsIDYpOwogCX0KIAogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9lVFNFQzEpOwogCWlmIChwZGF0YSkgewogCQlwZGF0YS0+Ym9hcmRfZmxhZ3MgPSBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSOwotCQlwZGF0YS0+YnVzX2lkID0gR0ZBUl9QSFlfMDsKKwkJcGRhdGEtPmJ1c19pZCA9IDA7CisJCXBkYXRhLT5waHlfaWQgPSAwOwogCQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldGFkZHIsIDYpOwogCX0KIAogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9lVFNFQzIpOwogCWlmIChwZGF0YSkgewogCQlwZGF0YS0+Ym9hcmRfZmxhZ3MgPSBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSOwotCQlwZGF0YS0+YnVzX2lkID0gR0ZBUl9QSFlfMTsKKwkJcGRhdGEtPmJ1c19pZCA9IDA7CisJCXBkYXRhLT5waHlfaWQgPSAxOwogCQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldDFhZGRyLCA2KTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L3NiYzg1NjAuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L3NiYzg1NjAuYwppbmRleCA0NWE1YjgxLi5lNzc3YmE4IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTYwLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvc2JjODU2MC5jCkBAIC05MSw5ICs5MSw2IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGNvbnN0IGNoYXIgKkdGQVJfUEhZXzI1ID0gInBoeTA6MjUiOwotc3RhdGljIGNvbnN0IGNoYXIgKkdGQVJfUEhZXzI2ID0gInBoeTA6MjYiOwotCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCkBAIC0xMzYsMjAgKzEzMywyMSBAQAogCW1kYXRhLT5pcnFbMjVdID0gTVBDODV4eF9JUlFfRVhUNjsKIAltZGF0YS0+aXJxWzI2XSA9IE1QQzg1eHhfSVJRX0VYVDc7CiAJbWRhdGEtPmlycVszMV0gPSAtMTsKLQltZGF0YS0+cGFkZHIgKz0gYmluZm8tPmJpX2ltbXJfYmFzZTsKIAogCS8qIHNldHVwIHRoZSBib2FyZCByZWxhdGVkIGluZm9ybWF0aW9uIGZvciB0aGUgZW5ldCBjb250cm9sbGVycyAqLwogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9UU0VDMSk7CiAJaWYgKHBkYXRhKSB7CiAJCXBkYXRhLT5ib2FyZF9mbGFncyA9IEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFI7Ci0JCXBkYXRhLT5idXNfaWQgPSBHRkFSX1BIWV8yNTsKKwkJcGRhdGEtPmJ1c19pZCA9IDA7CisJCXBkYXRhLT5waHlfaWQgPSAyNTsKIAkJbWVtY3B5KHBkYXRhLT5tYWNfYWRkciwgYmluZm8tPmJpX2VuZXRhZGRyLCA2KTsKIAl9CiAKIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfVFNFQzIpOwogCWlmIChwZGF0YSkgewogCQlwZGF0YS0+Ym9hcmRfZmxhZ3MgPSBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSOwotCQlwZGF0YS0+YnVzX2lkID0gR0ZBUl9QSFlfMjY7CisJCXBkYXRhLT5idXNfaWQgPSAwOworCQlwZGF0YS0+cGh5X2lkID0gMjY7CiAJCW1lbWNweShwZGF0YS0+bWFjX2FkZHIsIGJpbmZvLT5iaV9lbmV0MWFkZHIsIDYpOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvc3R4X2dwMy5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvc3R4X2dwMy5jCmluZGV4IDE1Y2U5ZDAuLjA2MWJiN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L3N0eF9ncDMuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9zdHhfZ3AzLmMKQEAgLTkzLDkgKzkzLDYgQEAKIAkweDAsCQkJCS8qIEV4dGVybmFsIDExOiAqLwogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKkdGQVJfUEhZXzIgPSAicGh5MDoyIjsKLXN0YXRpYyBjb25zdCBjaGFyICpHRkFSX1BIWV80ID0gInBoeTA6NCI7Ci0KIC8qCiAgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCiAgKi8KQEAgLTEzMCwyMCArMTI3LDIxIEBACiAJbWRhdGEtPmlycVsyXSA9IE1QQzg1eHhfSVJRX0VYVDU7CiAJbWRhdGEtPmlycVs0XSA9IE1QQzg1eHhfSVJRX0VYVDU7CiAJbWRhdGEtPmlycVszMV0gPSAtMTsKLQltZGF0YS0+cGFkZHIgKz0gYmluZm8tPmJpX2ltbXJfYmFzZTsKIAogCS8qIHNldHVwIHRoZSBib2FyZCByZWxhdGVkIGluZm9ybWF0aW9uIGZvciB0aGUgZW5ldCBjb250cm9sbGVycyAqLwogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9UU0VDMSk7CiAJaWYgKHBkYXRhKSB7CiAJLyoJcGRhdGEtPmJvYXJkX2ZsYWdzID0gRlNMX0dJQU5GQVJfQlJEX0hBU19QSFlfSU5UUjsgKi8KLQkJcGRhdGEtPmJ1c19pZCA9IEdGQVJfUEhZXzI7CisJCXBkYXRhLT5idXNfaWQgPSAwOworCQlwZGF0YS0+cGh5X2lkID0gMjsKIAkJbWVtY3B5KHBkYXRhLT5tYWNfYWRkciwgYmluZm8tPmJpX2VuZXRhZGRyLCA2KTsKIAl9CiAKIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfVFNFQzIpOwogCWlmIChwZGF0YSkgewogCS8qCXBkYXRhLT5ib2FyZF9mbGFncyA9IEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFI7ICovCi0JCXBkYXRhLT5idXNfaWQgPSBHRkFSX1BIWV80OworCQlwZGF0YS0+YnVzX2lkID0gMDsKKwkJcGRhdGEtPnBoeV9pZCA9IDQ7CiAJCW1lbWNweShwZGF0YS0+bWFjX2FkZHIsIGJpbmZvLT5iaV9lbmV0MWFkZHIsIDYpOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvdHFtODV4eC5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvdHFtODV4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MzZmNGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC90cW04NXh4LmMKQEAgLTAsMCArMSw0MTUgQEAKKy8qCisgKiBhcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC90cW04NXh4LmMKKyAqCisgKiBUUU04NXh4ICg0MC80MS81NS82MCkgYm9hcmQgc3BlY2lmaWMgcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZworICogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorICoKKyAqIEJhc2VkIG9uIG9yaWdpbmFsIHdvcmsgYnkKKyAqIAlLdW1hciBHYWxhIDxnYWxha0BrZXJuZWwuY3Jhc2hpbmcub3JnPgorICogICAgICBDb3B5cmlnaHQgMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CS8qIGZvciBsaW51eC9zZXJpYWxfY29yZS5oICovCisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mc2xfZGV2aWNlcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9vcGVuX3BpYy5oPgorI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8YXNtL21wYzg1eHguaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2ltbWFwXzg1eHguaD4KKyNpbmNsdWRlIDxhc20va2dkYi5oPgorI2luY2x1ZGUgPGFzbS9wcGNfc3lzLmg+CisjaW5jbHVkZSA8YXNtL2NwbTIuaD4KKyNpbmNsdWRlIDxtbS9tbXVfZGVjbC5oPgorCisjaW5jbHVkZSA8c3lzbGliL3BwYzg1eHhfc2V0dXAuaD4KKyNpbmNsdWRlIDxzeXNsaWIvY3BtMl9waWMuaD4KKyNpbmNsdWRlIDxzeXNsaWIvcHBjODV4eF9jb21tb24uaD4KKyNpbmNsdWRlIDxzeXNsaWIvcHBjODV4eF9yaW8uaD4KKworI2lmbmRlZiBDT05GSUdfUENJCit1bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKK3Vuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKKyNlbmRpZgorCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIHRvdGFsX21lbW9yeTsJLyogaW4gbW0vaW5pdCAqLworCit1bnNpZ25lZCBjaGFyIF9fcmVzW3NpemVvZiAoYmRfdCldOworCisvKiBJbnRlcm5hbCBpbnRlcnJ1cHRzIGFyZSBhbGwgTGV2ZWwgU2Vuc2l0aXZlLCBhbmQgUG9zaXRpdmUgUG9sYXJpdHkgKi8KK3N0YXRpYyB1X2NoYXIgdHFtODV4eF9vcGVucGljX2luaXRzZW5zZXNbXSBfX2luaXRkYXRhID0geworCU1QQzg1WFhfSU5URVJOQUxfSVJRX1NFTlNFUywKKwkweDAsCQkJCQkJLyogRXh0ZXJuYWwgIDA6ICovCisJMHgwLAkJCQkJCS8qIEV4dGVybmFsICAxOiAqLworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKwkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX05FR0FUSVZFKSwJLyogRXh0ZXJuYWwgMjogUENJIElOVEEgKi8KKwkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX05FR0FUSVZFKSwJLyogRXh0ZXJuYWwgMzogUENJIElOVEIgKi8KKyNlbHNlCisJMHgwLAkJCQkvKiBFeHRlcm5hbCAgMjogKi8KKwkweDAsCQkJCS8qIEV4dGVybmFsICAzOiAqLworI2VuZGlmCisJMHgwLAkJCQkvKiBFeHRlcm5hbCAgNDogKi8KKwkweDAsCQkJCS8qIEV4dGVybmFsICA1OiAqLworCTB4MCwJCQkJLyogRXh0ZXJuYWwgIDY6ICovCisJMHgwLAkJCQkvKiBFeHRlcm5hbCAgNzogKi8KKwkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX05FR0FUSVZFKSwJLyogRXh0ZXJuYWwgODogUEhZICovCisJMHgwLAkJCQkvKiBFeHRlcm5hbCAgOTogKi8KKwkweDAsCQkJCS8qIEV4dGVybmFsIDEwOiAqLworCTB4MCwJCQkJLyogRXh0ZXJuYWwgMTE6ICovCit9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCisgKgorICovCitzdGF0aWMgdm9pZCBfX2luaXQKK3RxbTg1eHhfc2V0dXBfYXJjaCh2b2lkKQoreworCWJkX3QgKmJpbmZvID0gKGJkX3QgKikgX19yZXM7CisJdW5zaWduZWQgaW50IGZyZXE7CisJc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IGdpYW5mYXJfbWRpb19kYXRhICptZGF0YTsKKworI2lmZGVmIENPTkZJR19NUEM4NTYwCisJY3BtMl9yZXNldCgpOworI2VuZGlmCisKKwkvKiBnZXQgdGhlIGNvcmUgZnJlcXVlbmN5ICovCisJZnJlcSA9IGJpbmZvLT5iaV9pbnRmcmVxOworCisJaWYgKHBwY19tZC5wcm9ncmVzcykKKwkJcHBjX21kLnByb2dyZXNzKCJ0cW04NXh4X3NldHVwX2FyY2goKSIsIDApOworCisJLyogU2V0IGxvb3BzX3Blcl9qaWZmeSB0byBhIGhhbGYtd2F5IHJlYXNvbmFibGUgdmFsdWUsCisJICAgZm9yIHVzZSB1bnRpbCBjYWxpYnJhdGVfZGVsYXkgZ2V0cyBjYWxsZWQuICovCisJbG9vcHNfcGVyX2ppZmZ5ID0gZnJlcSAvIEhaOworCisjaWZkZWYgQ09ORklHX1BDSQorCS8qIHNldHVwIFBDSSBob3N0IGJyaWRnZXMgKi8KKwltcGM4NXh4X3NldHVwX2hvc2UoKTsKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19NUEM4NTYwCisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMXzgyNTApCisJbXBjODV4eF9lYXJseV9zZXJpYWxfbWFwKCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TRVJJQUxfVEVYVF9ERUJVRworCS8qIEludmFsaWRhdGUgdGhlIGVudHJ5IHdlIHN0b2xlIGVhcmxpZXIgdGhlIHNlcmlhbCBwb3J0cworCSAqIHNob3VsZCBiZSBwcm9wZXJseSBtYXBwZWQgKi8KKwlpbnZhbGlkYXRlX3RsYmNhbV9lbnRyeShudW1fdGxiY2FtX2VudHJpZXMgLSAxKTsKKyNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19NUEM4NTYwICovCisKKwkvKiBzZXR1cCB0aGUgYm9hcmQgcmVsYXRlZCBpbmZvIGZvciB0aGUgTURJTyBidXMgKi8KKwltZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9tZGlvX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9NRElPKTsKKworCW1kYXRhLT5pcnFbMF0gPSBNUEM4NXh4X0lSUV9FWFQ4OworCW1kYXRhLT5pcnFbMV0gPSBNUEM4NXh4X0lSUV9FWFQ4OworCW1kYXRhLT5pcnFbMl0gPSAtMTsKKwltZGF0YS0+aXJxWzNdID0gTVBDODV4eF9JUlFfRVhUODsKKwltZGF0YS0+aXJxWzMxXSA9IC0xOworCisJLyogc2V0dXAgdGhlIGJvYXJkIHJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBlbmV0IGNvbnRyb2xsZXJzICovCisJcGRhdGEgPSAoc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSAqKSBwcGNfc3lzX2dldF9wZGF0YShNUEM4NXh4X1RTRUMxKTsKKwlpZiAocGRhdGEpIHsKKwkJcGRhdGEtPmJvYXJkX2ZsYWdzID0gRlNMX0dJQU5GQVJfQlJEX0hBU19QSFlfSU5UUjsKKwkJcGRhdGEtPmJ1c19pZCA9IDA7CisJCXBkYXRhLT5waHlfaWQgPSAyOworCQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldGFkZHIsIDYpOworCX0KKworCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9UU0VDMik7CisJaWYgKHBkYXRhKSB7CisJCXBkYXRhLT5ib2FyZF9mbGFncyA9IEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFI7CisJCXBkYXRhLT5idXNfaWQgPSAwOworCQlwZGF0YS0+cGh5X2lkID0gMTsKKwkJbWVtY3B5KHBkYXRhLT5tYWNfYWRkciwgYmluZm8tPmJpX2VuZXQxYWRkciwgNik7CisJfQorCisjaWZkZWYgQ09ORklHX01QQzg1NDAKKwlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfRkVDKTsKKwlpZiAocGRhdGEpIHsKKwkJcGRhdGEtPmJvYXJkX2ZsYWdzID0gMDsKKwkJcGRhdGEtPmJ1c19pZCA9IDA7CisJCXBkYXRhLT5waHlfaWQgPSAzOworCQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldDJhZGRyLCA2KTsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAorCWlmIChpbml0cmRfc3RhcnQpCisJCVJPT1RfREVWID0gUm9vdF9SQU0wOworCWVsc2UKKyNlbmRpZgorI2lmZGVmICBDT05GSUdfUk9PVF9ORlMKKwkJUk9PVF9ERVYgPSBSb290X05GUzsKKyNlbHNlCisJUk9PVF9ERVYgPSBSb290X0hEQTE7CisjZW5kaWYKK30KKworI2lmZGVmIENPTkZJR19NUEM4NTYwCitzdGF0aWMgaXJxcmV0dXJuX3QgY3BtMl9jYXNjYWRlKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJd2hpbGUgKChpcnEgPSBjcG0yX2dldF9pcnEocmVncykpID49IDApCisJCV9fZG9fSVJRKGlycSwgcmVncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBjcG0yX2lycWFjdGlvbiA9IHsKKwkuaGFuZGxlciA9IGNwbTJfY2FzY2FkZSwKKwkuZmxhZ3MgPSBTQV9JTlRFUlJVUFQsCisJLm1hc2sgPSBDUFVfTUFTS19OT05FLAorCS5uYW1lID0gImNwbTJfY2FzY2FkZSIsCit9OworI2VuZGlmIC8qIENPTkZJR19NUEM4NTYwICovCisKK3ZvaWQgX19pbml0Cit0cW04NXh4X2luaXRfSVJRKHZvaWQpCit7CisJYmRfdCAqYmluZm8gPSAoYmRfdCAqKSBfX3JlczsKKworCS8qIERldGVybWluZSB0aGUgUGh5c2ljYWwgQWRkcmVzcyBvZiB0aGUgT3BlblBJQyByZWdzICovCisJcGh5c19hZGRyX3QgT3BlblBJQ19QQWRkciA9CisJCWJpbmZvLT5iaV9pbW1yX2Jhc2UgKyBNUEM4NXh4X09QRU5QSUNfT0ZGU0VUOworCU9wZW5QSUNfQWRkciA9IGlvcmVtYXAoT3BlblBJQ19QQWRkciwgTVBDODV4eF9PUEVOUElDX1NJWkUpOworCU9wZW5QSUNfSW5pdFNlbnNlcyA9IHRxbTg1eHhfb3BlbnBpY19pbml0c2Vuc2VzOworCU9wZW5QSUNfTnVtSW5pdFNlbnNlcyA9IHNpemVvZiAodHFtODV4eF9vcGVucGljX2luaXRzZW5zZXMpOworCisJLyogU2tpcCByZXNlcnZlZCBzcGFjZSBhbmQgaW50ZXJuYWwgc291cmNlcyAqLworCW9wZW5waWNfc2V0X3NvdXJjZXMoMCwgMzIsIE9wZW5QSUNfQWRkciArIDB4MTAyMDApOworCisJLyogTWFwIFBJQyBJUlFzIDAtMTEgKi8KKwlvcGVucGljX3NldF9zb3VyY2VzKDQ4LCAxMiwgT3BlblBJQ19BZGRyICsgMHgxMDAwMCk7CisKKwkvKiB3ZSBsZXQgb3BlbnBpYyBpbnRlcnJ1cHRzIHN0YXJ0aW5nIGZyb20gYW4gb2Zmc2V0LCB0bworCSAqIGxlYXZlIHNwYWNlIGZvciBjYXNjYWRpbmcgaW50ZXJydXB0cyB1bmRlcm5lYXRoLgorCSAqLworCW9wZW5waWNfaW5pdChNUEM4NXh4X09QRU5QSUNfSVJRX09GRlNFVCk7CisKKyNpZmRlZiBDT05GSUdfTVBDODU2MAorCS8qIFNldHVwIENQTTIgUElDICovCisgICAgICAgIGNwbTJfaW5pdF9JUlEoKTsKKworCXNldHVwX2lycShNUEM4NXh4X0lSUV9DUE0sICZjcG0yX2lycWFjdGlvbik7CisjZW5kaWYgLyogQ09ORklHX01QQzg1NjAgKi8KKworCXJldHVybjsKK30KKworaW50IHRxbTg1eHhfc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKK3sKKwl1aW50IHB2aWQsIHN2aWQsIHBoaWQxOworCXVpbnQgbWVtc2l6ZSA9IHRvdGFsX21lbW9yeTsKKwliZF90ICpiaW5mbyA9IChiZF90ICopIF9fcmVzOworCXVuc2lnbmVkIGludCBmcmVxOworCisJLyogZ2V0IHRoZSBjb3JlIGZyZXF1ZW5jeSAqLworCWZyZXEgPSBiaW5mby0+YmlfaW50ZnJlcTsKKworCXB2aWQgPSBtZnNwcihTUFJOX1BWUik7CisJc3ZpZCA9IG1mc3ByKFNQUk5fU1ZSKTsKKworCXNlcV9wcmludGYobSwgIlZlbmRvclx0XHQ6IFRRIENvbXBvbmVudHNcbiIpOworCXNlcV9wcmludGYobSwgIk1hY2hpbmVcdFx0OiBUUU0lc1xuIiwgY3VyX3BwY19zeXNfc3BlYy0+cHBjX3N5c19uYW1lKTsKKwlzZXFfcHJpbnRmKG0sICJjbG9ja1x0XHQ6ICVkTUh6XG4iLCBmcmVxIC8gMTAwMDAwMCk7CisJc2VxX3ByaW50ZihtLCAiUFZSXHRcdDogMHgleFxuIiwgcHZpZCk7CisJc2VxX3ByaW50ZihtLCAiU1ZSXHRcdDogMHgleFxuIiwgc3ZpZCk7CisKKwkvKiBEaXNwbGF5IGNwdSBQbGwgc2V0dGluZyAqLworCXBoaWQxID0gbWZzcHIoU1BSTl9ISUQxKTsKKwlzZXFfcHJpbnRmKG0sICJQTEwgc2V0dGluZ1x0OiAweCV4XG4iLCAoKHBoaWQxID4+IDI0KSAmIDB4M2YpKTsKKworCS8qIERpc3BsYXkgdGhlIGFtb3VudCBvZiBtZW1vcnkgKi8KKwlzZXFfcHJpbnRmKG0sICJNZW1vcnlcdFx0OiAlZCBNQlxuIiwgbWVtc2l6ZSAvICgxMDI0ICogMTAyNCkpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkMpICYmIGRlZmluZWQoQ09ORklHX1NFTlNPUlNfRFMxMzM3KQorZXh0ZXJuIHVsb25nIGRzMTMzN19nZXRfcnRjX3RpbWUodm9pZCk7CitleHRlcm4gaW50IGRzMTMzN19zZXRfcnRjX3RpbWUodW5zaWduZWQgbG9uZyBub3d0aW1lKTsKKworc3RhdGljIGludCBfX2luaXQKK3RxbTg1eHhfcnRjX2hvb2t1cCh2b2lkKQoreworCXN0cnVjdCB0aW1lc3BlYwl0djsKKworICAgICAgICBwcGNfbWQuc2V0X3J0Y190aW1lID0gZHMxMzM3X3NldF9ydGNfdGltZTsKKyAgICAgICAgcHBjX21kLmdldF9ydGNfdGltZSA9IGRzMTMzN19nZXRfcnRjX3RpbWU7CisKKwl0di50dl9uc2VjID0gMDsKKwl0di50dl9zZWMgPSAocHBjX21kLmdldF9ydGNfdGltZSkoKTsKKwlkb19zZXR0aW1lb2ZkYXkoJnR2KTsKKworCXJldHVybiAwOworfQorbGF0ZV9pbml0Y2FsbCh0cW04NXh4X3J0Y19ob29rdXApOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENJCisvKgorICogaW50ZXJydXB0IHJvdXRpbmcKKyAqLworaW50IG1wYzg1eHhfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1bnNpZ25lZCBjaGFyIGlkc2VsLCB1bnNpZ25lZCBjaGFyIHBpbikKK3sKKwlzdGF0aWMgY2hhciBwY2lfaXJxX3RhYmxlW11bNF0gPQorCQkvKgorCQkgKiAgICAgIFBDSSBJRFNFTC9JTlRQSU4tPklOVExJTkUKKwkJICogICAgICAgQSAgICAgIEIgICAgICBDICAgICAgRAorCQkgKi8KKwkJeworCQkJe1BJUlFBLCBQSVJRQiwgMCwgMH0sCisJCX07CisKKwljb25zdCBsb25nIG1pbl9pZHNlbCA9IDB4MWMsIG1heF9pZHNlbCA9IDB4MWMsIGlycXNfcGVyX3Nsb3QgPSA0OworCXJldHVybiBQQ0lfSVJRX1RBQkxFX0xPT0tVUDsKK30KKworaW50IG1wYzg1eHhfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQoreworCWlmIChidXMgPT0gMCAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKKwkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKKwllbHNlCisJCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKKyNpZmRlZiBDT05GSUdfUkFQSURJTwordm9pZCBwbGF0Zm9ybV9yaW9faW5pdCh2b2lkKQoreworCS8qIDUxMk1CIFJJTyBMQVcgYXQgMHhjMDAwMDAwMCAqLworCW1wYzg1eHhfcmlvX3NldHVwKDB4YzAwMDAwMDAsIDB4MjAwMDAwMDApOworfQorI2VuZGlmIC8qIENPTkZJR19SQVBJRElPICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwordm9pZCBfX2luaXQKK3BsYXRmb3JtX2luaXQodW5zaWduZWQgbG9uZyByMywgdW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKKwkgICAgICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3KQoreworCS8qIHBhcnNlX2Jvb3RpbmZvIG11c3QgYWx3YXlzIGJlIGNhbGxlZCBmaXJzdCAqLworCXBhcnNlX2Jvb3RpbmZvKGZpbmRfYm9vdGluZm8oKSk7CisKKwkvKgorCSAqIElmIHdlIHdlcmUgcGFzc2VkIGluIGEgYm9hcmQgaW5mb3JtYXRpb24sIGNvcHkgaXQgaW50byB0aGUKKwkgKiByZXNpZHVhbCBkYXRhIGFyZWEuCisJICovCisJaWYgKHIzKSB7CisJCW1lbWNweSgodm9pZCAqKSBfX3JlcywgKHZvaWQgKikgKHIzICsgS0VSTkVMQkFTRSksCisJCSAgICAgICBzaXplb2YgKGJkX3QpKTsKKwl9CisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfVEVYVF9ERUJVRykgJiYgIWRlZmluZWQoQ09ORklHX01QQzg1NjApCisJeworCQliZF90ICpiaW5mbyA9IChiZF90ICopIF9fcmVzOworCQlzdHJ1Y3QgdWFydF9wb3J0IHA7CisKKwkJLyogVXNlIHRoZSBsYXN0IFRMQiBlbnRyeSB0byBtYXAgQ0NTUkJBUiB0byBhbGxvdyBhY2Nlc3MgdG8gRFVBUlQgcmVncyAqLworCQlzZXR0bGJjYW0obnVtX3RsYmNhbV9lbnRyaWVzIC0gMSwgYmluZm8tPmJpX2ltbXJfYmFzZSwKKwkJCSAgYmluZm8tPmJpX2ltbXJfYmFzZSwgTVBDODV4eF9DQ1NSQkFSX1NJWkUsIF9QQUdFX0lPLCAwKTsKKworCQltZW1zZXQoJnAsIDAsIHNpemVvZiAocCkpOworCQlwLmlvdHlwZSA9IFNFUklBTF9JT19NRU07CisJCXAubWVtYmFzZSA9ICh2b2lkICopIGJpbmZvLT5iaV9pbW1yX2Jhc2UgKyBNUEM4NXh4X1VBUlQwX09GRlNFVDsKKwkJcC51YXJ0Y2xrID0gYmluZm8tPmJpX2J1c2ZyZXE7CisKKwkJZ2VuNTUwX2luaXQoMCwgJnApOworCisJCW1lbXNldCgmcCwgMCwgc2l6ZW9mIChwKSk7CisJCXAuaW90eXBlID0gU0VSSUFMX0lPX01FTTsKKwkJcC5tZW1iYXNlID0gKHZvaWQgKikgYmluZm8tPmJpX2ltbXJfYmFzZSArIE1QQzg1eHhfVUFSVDFfT0ZGU0VUOworCQlwLnVhcnRjbGsgPSBiaW5mby0+YmlfYnVzZnJlcTsKKworCQlnZW41NTBfaW5pdCgxLCAmcCk7CisJfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX0lOSVRSRCkKKwkvKgorCSAqIElmIHRoZSBpbml0IFJBTSBkaXNrIGhhcyBiZWVuIGNvbmZpZ3VyZWQgaW4sIGFuZCB0aGVyZSdzIGEgdmFsaWQKKwkgKiBzdGFydGluZyBhZGRyZXNzIGZvciBpdCwgc2V0IGl0IHVwLgorCSAqLworCWlmIChyNCkgeworCQlpbml0cmRfc3RhcnQgPSByNCArIEtFUk5FTEJBU0U7CisJCWluaXRyZF9lbmQgPSByNSArIEtFUk5FTEJBU0U7CisJfQorI2VuZGlmCQkJCS8qIENPTkZJR19CTEtfREVWX0lOSVRSRCAqLworCisJLyogQ29weSB0aGUga2VybmVsIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gYSBzYWZlIHBsYWNlLiAqLworCisJaWYgKHI2KSB7CisJCSooY2hhciAqKSAocjcgKyBLRVJORUxCQVNFKSA9IDA7CisJCXN0cmNweShjbWRfbGluZSwgKGNoYXIgKikgKHI2ICsgS0VSTkVMQkFTRSkpOworCX0KKworCWlkZW50aWZ5X3BwY19zeXNfYnlfaWQobWZzcHIoU1BSTl9TVlIpKTsKKworCS8qIHNldHVwIHRoZSBQb3dlclBDIG1vZHVsZSBzdHJ1Y3QgKi8KKwlwcGNfbWQuc2V0dXBfYXJjaCA9IHRxbTg1eHhfc2V0dXBfYXJjaDsKKwlwcGNfbWQuc2hvd19jcHVpbmZvID0gdHFtODV4eF9zaG93X2NwdWluZm87CisKKwlwcGNfbWQuaW5pdF9JUlEgPSB0cW04NXh4X2luaXRfSVJROworCXBwY19tZC5nZXRfaXJxID0gb3BlbnBpY19nZXRfaXJxOworCisJcHBjX21kLnJlc3RhcnQgPSBtcGM4NXh4X3Jlc3RhcnQ7CisJcHBjX21kLnBvd2VyX29mZiA9IG1wYzg1eHhfcG93ZXJfb2ZmOworCXBwY19tZC5oYWx0ID0gbXBjODV4eF9oYWx0OworCisJcHBjX21kLmZpbmRfZW5kX29mX21lbW9yeSA9IG1wYzg1eHhfZmluZF9lbmRfb2ZfbWVtb3J5OworCisJcHBjX21kLnRpbWVfaW5pdCA9IE5VTEw7CisJcHBjX21kLnNldF9ydGNfdGltZSA9IE5VTEw7CisJcHBjX21kLmdldF9ydGNfdGltZSA9IE5VTEw7CisJcHBjX21kLmNhbGlicmF0ZV9kZWNyID0gbXBjODV4eF9jYWxpYnJhdGVfZGVjcjsKKworI2lmbmRlZiBDT05GSUdfTVBDODU2MAorI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF84MjUwKSAmJiBkZWZpbmVkKENPTkZJR19TRVJJQUxfVEVYVF9ERUJVRykKKwlwcGNfbWQucHJvZ3Jlc3MgPSBnZW41NTBfcHJvZ3Jlc3M7CisjZW5kaWYJLyogQ09ORklHX1NFUklBTF84MjUwICYmIENPTkZJR19TRVJJQUxfVEVYVF9ERUJVRyAqLworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF84MjUwKSAmJiBkZWZpbmVkKENPTkZJR19LR0RCKQorCXBwY19tZC5lYXJseV9zZXJpYWxfbWFwID0gbXBjODV4eF9lYXJseV9zZXJpYWxfbWFwOworI2VuZGlmCS8qIENPTkZJR19TRVJJQUxfODI1MCAmJiBDT05GSUdfS0dEQiAqLworI2VuZGlmIC8qIENPTkZJR19NUEM4NTYwICovCisKKwlpZiAocHBjX21kLnByb2dyZXNzKQorCQlwcGNfbWQucHJvZ3Jlc3MoInRxbTg1eHhfaW5pdCgpOiBleGl0IiwgMCk7CisKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC90cW04NXh4LmggYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC90cW04NXh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3NWViMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L3RxbTg1eHguaApAQCAtMCwwICsxLDU2IEBACisvKgorICogYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvdHFtODV4eC5oCisgKgorICogVFFNODV4eCAoNDAvNDEvNTUvNjApIGJvYXJkIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcKKyAqIFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fTUFDSF9UUU04NVhYX0gKKyNkZWZpbmUgX19NQUNIX1RRTTg1WFhfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9wcGNib290Lmg+CisKKyNkZWZpbmUgQk9BUkRfQ0NTUkJBUgkJKCh1aW50KTB4ZTAwMDAwMDApCisjZGVmaW5lIENDU1JCQVJfU0laRQkJKCh1aW50KTEwMjQqMTAyNCkKKworI2RlZmluZSBDUE1fTUFQX0FERFIJCShDQ1NSQkFSICsgTVBDODV4eF9DUE1fT0ZGU0VUKQorCisjZGVmaW5lIFBDSV9DRkdfQUREUl9PRkZTRVQJKDB4ODAwMCkKKyNkZWZpbmUgUENJX0NGR19EQVRBX09GRlNFVAkoMHg4MDA0KQorCisvKiBQQ0kgaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgUElSUUEJCQlNUEM4NXh4X0lSUV9FWFQyCisjZGVmaW5lIFBJUlFCCQkJTVBDODV4eF9JUlFfRVhUMworCisjZGVmaW5lIE1QQzg1WFhfUENJMV9MT1dFUl9JTwkweDAwMDAwMDAwCisjZGVmaW5lIE1QQzg1WFhfUENJMV9VUFBFUl9JTwkweDAwZmZmZmZmCisKKyNkZWZpbmUgTVBDODVYWF9QQ0kxX0xPV0VSX01FTQkweDgwMDAwMDAwCisjZGVmaW5lIE1QQzg1WFhfUENJMV9VUFBFUl9NRU0JMHg5ZmZmZmZmZgorCisjZGVmaW5lIE1QQzg1WFhfUENJMV9JT19CQVNFCTB4ZTIwMDAwMDAKKyNkZWZpbmUgTVBDODVYWF9QQ0kxX01FTV9PRkZTRVQJMHgwMDAwMDAwMAorCisjZGVmaW5lIE1QQzg1WFhfUENJMV9JT19TSVpFCTB4MDEwMDAwMDAKKworI2RlZmluZSBCQVNFX0JBVUQgMTE1MjAwCisKK2V4dGVybiB2b2lkIG1wYzg1eHhfc2V0dXBfaG9zZSh2b2lkKSBfX2luaXQ7CitleHRlcm4gdm9pZCBtcGM4NXh4X3Jlc3RhcnQoY2hhciAqY21kKTsKK2V4dGVybiB2b2lkIG1wYzg1eHhfcG93ZXJfb2ZmKHZvaWQpOworZXh0ZXJuIHZvaWQgbXBjODV4eF9oYWx0KHZvaWQpOworZXh0ZXJuIHZvaWQgbXBjODV4eF9pbml0X0lSUSh2b2lkKSBfX2luaXQ7CitleHRlcm4gdW5zaWduZWQgbG9uZyBtcGM4NXh4X2ZpbmRfZW5kX29mX21lbW9yeSh2b2lkKSBfX2luaXQ7CitleHRlcm4gdm9pZCBtcGM4NXh4X2NhbGlicmF0ZV9kZWNyKHZvaWQpIF9faW5pdDsKKworI2VuZGlmIC8qIF9fTUFDSF9UUU04NVhYX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9NYWtlZmlsZSBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9NYWtlZmlsZQppbmRleCA3YzVjZGFiLi41MTQzMGUyIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL01ha2VmaWxlCkBAIC0zLDI2ICszLDE4IEBACiAjCiAKICMgRXh0cmEgQ0ZMQUdTIHNvIHdlIGRvbid0IGhhdmUgdG8gZG8gcmVsYXRpdmUgaW5jbHVkZXMKLUNGTEFHU19wbWFjX3NldHVwLm8JKz0gLUlhcmNoLyQoQVJDSCkvbW0KK0NGTEFHU19jaHJwX3NldHVwLm8JKz0gLUlhcmNoLyQoQVJDSCkvbW0KIAogb2JqLSQoQ09ORklHX0FQVVMpCQkrPSBhcHVzX3NldHVwLm8KIGlmZXEgKCQoQ09ORklHX0FQVVMpLHkpCiBvYmotJChDT05GSUdfUENJKQkJKz0gYXB1c19wY2kubwogZW5kaWYKLW9iai0kKENPTkZJR19QUENfUE1BQykJCSs9IHBtYWNfcGljLm8gcG1hY19zZXR1cC5vIHBtYWNfdGltZS5vIFwKLQkJCQkJcG1hY19mZWF0dXJlLm8gcG1hY19wY2kubyBwbWFjX3NsZWVwLm8gXAotCQkJCQlwbWFjX2xvd19pMmMubyBwbWFjX2NhY2hlLm8KIG9iai0kKENPTkZJR19QUENfQ0hSUCkJCSs9IGNocnBfc2V0dXAubyBjaHJwX3RpbWUubyBjaHJwX3BjaS5vIFwKIAkJCQkJY2hycF9wZWdhc29zX2V0aC5vCiBpZmVxICgkKENPTkZJR19QUENfQ0hSUCkseSkKIG9iai0kKENPTkZJR19OVlJBTSkJCSs9IGNocnBfbnZyYW0ubwogZW5kaWYKIG9iai0kKENPTkZJR19QUENfUFJFUCkJCSs9IHByZXBfcGNpLm8gcHJlcF9zZXR1cC5vCi1pZmVxICgkKENPTkZJR19QUENfUE1BQykseSkKLW9iai0kKENPTkZJR19OVlJBTSkJCSs9IHBtYWNfbnZyYW0ubwotb2JqLSQoQ09ORklHX0NQVV9GUkVRX1BNQUMpCSs9IHBtYWNfY3B1ZnJlcS5vCi1lbmRpZgotb2JqLSQoQ09ORklHX1BNQUNfQkFDS0xJR0hUKQkrPSBwbWFjX2JhY2tsaWdodC5vCiBvYmotJChDT05GSUdfUFJFUF9SRVNJRFVBTCkJKz0gcmVzaWR1YWwubwogb2JqLSQoQ09ORklHX1BRMkFEUykJCSs9IHBxMmFkcy5vCiBvYmotJChDT05GSUdfVFFNODI2MCkJCSs9IHRxbTgyNjBfc2V0dXAubwpAQCAtNDcsNiArMzksNSBAQAogb2JqLSQoQ09ORklHX0VWNjQzNjApCQkrPSBldjY0MzYwLm8KIAogaWZlcSAoJChDT05GSUdfU01QKSx5KQotb2JqLSQoQ09ORklHX1BQQ19QTUFDKQkJKz0gcG1hY19zbXAubwogb2JqLSQoQ09ORklHX1BQQ19DSFJQKQkJKz0gY2hycF9zbXAubwogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9hcHVzX3NldHVwLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvYXB1c19zZXR1cC5jCmluZGV4IDJmNzRmZGUuLmM0MmM1MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9hcHVzX3NldHVwLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL2FwdXNfc2V0dXAuYwpAQCAtNTUsOSArNTUsNiBAQAogaW50ICgqbWFjaF9zZXRfY2xvY2tfbW1zcykgKHVuc2lnbmVkIGxvbmcpID0gTlVMTDsKIHZvaWQgKCptYWNoX3Jlc2V0KSggdm9pZCApOwogbG9uZyBtYWNoX21heF9kbWFfYWRkcmVzcyA9IDB4MDBmZmZmZmY7IC8qIGRlZmF1bHQgc2V0IHRvIHRoZSBsb3dlciAxNk1CICovCi0jaWYgZGVmaW5lZChDT05GSUdfQU1JR0FfRkxPUFBZKQotdm9pZCAoKm1hY2hfZmxvcHB5X3NldHVwKSAoY2hhciAqLCBpbnQgKikgX19pbml0ZGF0YSA9IE5VTEw7Ci0jZW5kaWYKICNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCiB2b2lkICgqbWFjaF9oZWFydGJlYXQpIChpbnQpID0gTlVMTDsKIGV4dGVybiB2b2lkIGFwdXNfaGVhcnRiZWF0ICh2b2lkKTsKQEAgLTc2LDcgKzczLDYgQEAKIAogc3RydWN0IG1lbV9pbmZvIHJhbWRpc2s7CiAKLWV4dGVybiB2b2lkIGFtaWdhX2Zsb3BweV9zZXR1cChjaGFyICosIGludCAqKTsKIGV4dGVybiB2b2lkIGNvbmZpZ19hbWlnYSh2b2lkKTsKIAogc3RhdGljIGludCBfXzYwbnNyYW0gPSAwOwpAQCAtMzA1LDE2ICszMDEsNiBAQAogewogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRkxPUFBZICovCi0jaWYgZGVmaW5lZChDT05GSUdfQU1JR0FfRkxPUFBZKQotX19pbml0Ci12b2lkIGZsb3BweV9zZXR1cChjaGFyICpzdHIsIGludCAqaW50cykKLXsKLQlpZiAobWFjaF9mbG9wcHlfc2V0dXApCi0JCW1hY2hfZmxvcHB5X3NldHVwIChzdHIsIGludHMpOwotfQotI2VuZGlmCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNRU1PUlkgKi8KICNkZWZpbmUgS01BUF9NQVggMzIKIHVuc2lnbmVkIGxvbmcga21hcF9jaHVua3NbS01BUF9NQVgqM107CkBAIC01NzQsOSArNTYwLDkgQEAKIAogaW50IF9fZGVidWdfc2VyX291dCggdW5zaWduZWQgY2hhciBjICkKIHsKLQljdXN0b20uc2VyZGF0ID0gYyB8IDB4MTAwOworCWFtaWdhX2N1c3RvbS5zZXJkYXQgPSBjIHwgMHgxMDA7CiAJbWIoKTsKLQl3aGlsZSAoIShjdXN0b20uc2VyZGF0ciAmIDB4MjAwMCkpCisJd2hpbGUgKCEoYW1pZ2FfY3VzdG9tLnNlcmRhdHIgJiAweDIwMDApKQogCQliYXJyaWVyKCk7CiAJcmV0dXJuIDE7CiB9CkBAIC01ODYsMTEgKzU3MiwxMSBAQAogCXVuc2lnbmVkIGNoYXIgYzsKIAogCS8qIFhYWDogaXMgdGhhdCBvaz8/IGRlcml2ZWQgZnJvbSBhbWlnYV9zZXIuYy4uLiAqLwotCXdoaWxlKCAhKGN1c3RvbS5pbnRyZXFyICYgSUZfUkJGKSApCisJd2hpbGUoICEoYW1pZ2FfY3VzdG9tLmludHJlcXIgJiBJRl9SQkYpICkKIAkJYmFycmllcigpOwotCWMgPSBjdXN0b20uc2VyZGF0cjsKKwljID0gYW1pZ2FfY3VzdG9tLnNlcmRhdHI7CiAJLyogY2xlYXIgdGhlIGludGVycnVwdCwgc28gdGhhdCBhbm90aGVyIGNoYXJhY3RlciBjYW4gYmUgcmVhZCAqLwotCWN1c3RvbS5pbnRyZXEgPSBJRl9SQkY7CisJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX1JCRjsKIAlyZXR1cm4gYzsKIH0KIApAQCAtNjAxLDEwICs1ODcsMTAgQEAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKIAkvKiB0dXJuIG9mZiBSeCBhbmQgVHggaW50ZXJydXB0cyAqLwotCWN1c3RvbS5pbnRlbmEgPSBJRl9SQkYgfCBJRl9UQkU7CisJYW1pZ2FfY3VzdG9tLmludGVuYSA9IElGX1JCRiB8IElGX1RCRTsKIAogCS8qIGNsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdCAqLwotCWN1c3RvbS5pbnRyZXEgPSBJRl9SQkYgfCBJRl9UQkU7CisJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX1JCRiB8IElGX1RCRTsKIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIApAQCAtNjE3LDcgKzYwMyw3IEBACiAKICNpZmRlZiBDT05GSUdfS0dEQgogCS8qIHR1cm4gUnggaW50ZXJydXB0cyBvbiBmb3IgR0RCICovCi0JY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IElGX1JCRjsKKwlhbWlnYV9jdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgSUZfUkJGOwogCXNlcl9SVFNvbigpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9jaHJwX3BjaS5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL2NocnBfcGNpLmMKaW5kZXggYmQwNDdhYS4uYzdmZTYxOCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL2NocnBfcGNpLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL2NocnBfcGNpLmMKQEAgLTI3NSw3ICsyNzUsNyBAQAogCQkJc2V0dXBfcHl0aG9uKGhvc2UsIGRldik7CiAJCX0gZWxzZSBpZiAoaXNfbW90CiAJCQkgICB8fCBzdHJuY21wKG1vZGVsLCAiTW90b3JvbGEsIEdyYWNrbGUiLCAxNykgPT0gMCkgewotCQkJc2V0dXBfZ3JhY2tsZShob3NlKTsKKwkJCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCAweGZlYzAwMDAwLCAweGZlZTAwMDAwKTsKIAkJfSBlbHNlIGlmIChpc19sb25ndHJhaWwpIHsKIAkJCXZvaWQgX19pb21lbSAqcCA9IGlvcmVtYXAoR0cyX1BDSV9DT05GSUdfQkFTRSwgMHg4MDAwMCk7CiAJCQlob3NlLT5vcHMgPSAmZ2cyX3BjaV9vcHM7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvY2hycF9zZXR1cC5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL2NocnBfc2V0dXAuYwppbmRleCBmMWI3MGFiLi40ODk5NmI3IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvY2hycF9zZXR1cC5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9jaHJwX3NldHVwLmMKQEAgLTUzLDYgKzUzLDcgQEAKICNpbmNsdWRlIDxhc20vaTgyNTkuaD4KICNpbmNsdWRlIDxhc20vb3Blbl9waWMuaD4KICNpbmNsdWRlIDxhc20veG1vbi5oPgorI2luY2x1ZGUgIm1lbV9waWVjZXMuaCIKIAogdW5zaWduZWQgbG9uZyBjaHJwX2dldF9ydGNfdGltZSh2b2lkKTsKIGludCBjaHJwX3NldF9ydGNfdGltZSh1bnNpZ25lZCBsb25nIG5vd3RpbWUpOwpAQCAtNjUsNyArNjYsNiBAQAogdm9pZCBydGFzX2luZGljYXRvcl9wcm9ncmVzcyhjaGFyICosIHVuc2lnbmVkIHNob3J0KTsKIHZvaWQgYnRleHRfcHJvZ3Jlc3MoY2hhciAqLCB1bnNpZ25lZCBzaG9ydCk7CiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIHBtYWNfZmluZF9lbmRfb2ZfbWVtb3J5KHZvaWQpOwogZXh0ZXJuIGludCBvZl9zaG93X3BlcmNwdWluZm8oc3RydWN0IHNlcV9maWxlICosIGludCk7CiAKIGludCBfY2hycF90eXBlOwpAQCAtNDA0LDcgKzQwNCw2IEBACiB2b2lkIF9faW5pdCBjaHJwX2luaXRfSVJRKHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKLQlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGNocnBfaW50X2FjayA9IDA7CiAJdW5zaWduZWQgY2hhciBpbml0X3NlbnNlc1tOUl9JUlFTIC0gTlVNXzgyNTlfSU5URVJSVVBUU107CiAjaWYgZGVmaW5lZChDT05GSUdfVlQpICYmIGRlZmluZWQoQ09ORklHX0lOUFVUX0FEQkhJRCkgJiYgZGVmaW5lZChYTU9OKQpAQCAtNDY4LDYgKzQ2Nyw3NSBAQAogCQlwcGNfbWQucHJvZ3Jlc3MoIiAgSGF2ZSBmdW4hICAgICIsIDB4Nzc3Nyk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKm1lbW9yeV9ub2RlOworCitzdGF0aWMgaW50IF9faW5pdCBnZXRfbWVtX3Byb3AoY2hhciAqbmFtZSwgc3RydWN0IG1lbV9waWVjZXMgKm1wKQoreworCXN0cnVjdCByZWdfcHJvcGVydHkgKnJwOworCWludCBpLCBzOworCXVuc2lnbmVkIGludCAqaXA7CisJaW50IG5hYyA9IHByb21fbl9hZGRyX2NlbGxzKG1lbW9yeV9ub2RlKTsKKwlpbnQgbnNjID0gcHJvbV9uX3NpemVfY2VsbHMobWVtb3J5X25vZGUpOworCisJaXAgPSAodW5zaWduZWQgaW50ICopIGdldF9wcm9wZXJ0eShtZW1vcnlfbm9kZSwgbmFtZSwgJnMpOworCWlmIChpcCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZXJyb3I6IGNvdWxkbid0IGdldCAlcyBwcm9wZXJ0eSBvbiAvbWVtb3J5XG4iLAorCQkgICAgICAgbmFtZSk7CisJCXJldHVybiAwOworCX0KKwlzIC89IChuc2MgKyBuYWMpICogNDsKKwlycCA9IG1wLT5yZWdpb25zOworCWZvciAoaSA9IDA7IGkgPCBzOyArK2ksIGlwICs9IG5hYytuc2MpIHsKKwkJaWYgKG5hYyA+PSAyICYmIGlwW25hYy0yXSAhPSAwKQorCQkJY29udGludWU7CisJCXJwLT5hZGRyZXNzID0gaXBbbmFjLTFdOworCQlpZiAobnNjID49IDIgJiYgaXBbbmFjK25zYy0yXSAhPSAwKQorCQkJcnAtPnNpemUgPSB+MFU7CisJCWVsc2UKKwkJCXJwLT5zaXplID0gaXBbbmFjK25zYy0xXTsKKwkJKytycDsKKwl9CisJbXAtPm5fcmVnaW9ucyA9IHJwIC0gbXAtPnJlZ2lvbnM7CisKKwkvKiBNYWtlIHN1cmUgdGhlIHBpZWNlcyBhcmUgc29ydGVkLiAqLworCW1lbV9waWVjZXNfc29ydChtcCk7CisJbWVtX3BpZWNlc19jb2FsZXNjZShtcCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBjaHJwX2ZpbmRfZW5kX29mX21lbW9yeSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgYSwgdG90YWw7CisJc3RydWN0IG1lbV9waWVjZXMgcGh5c19tZW07CisKKwkvKgorCSAqIEZpbmQgb3V0IHdoZXJlIHBoeXNpY2FsIG1lbW9yeSBpcywgYW5kIGNoZWNrIHRoYXQgaXQKKwkgKiBzdGFydHMgYXQgMCBhbmQgaXMgY29udGlndW91cy4gIEl0IHNlZW1zIHRoYXQgUkFNIGlzCisJICogYWx3YXlzIHBoeXNpY2FsbHkgY29udGlndW91cyBvbiBQb3dlciBNYWNpbnRvc2hlcy4KKwkgKgorCSAqIFN1cHBvcnRpbmcgZGlzY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkgaXNuJ3QgaGFyZCwKKwkgKiBpdCBqdXN0IG1ha2VzIHRoZSB2aXJ0dWFsIDwtPiBwaHlzaWNhbCBtYXBwaW5nIGZ1bmN0aW9ucworCSAqIG1vcmUgY29tcGxpY2F0ZWQgKG9yIGVsc2UgeW91IGVuZCB1cCB3YXN0aW5nIHNwYWNlCisJICogaW4gbWVtX21hcCkuCisJICovCisJbWVtb3J5X25vZGUgPSBmaW5kX2RldmljZXMoIm1lbW9yeSIpOworCWlmIChtZW1vcnlfbm9kZSA9PSBOVUxMIHx8ICFnZXRfbWVtX3Byb3AoInJlZyIsICZwaHlzX21lbSkKKwkgICAgfHwgcGh5c19tZW0ubl9yZWdpb25zID09IDApCisJCXBhbmljKCJObyBSQU0/PyIpOworCWEgPSBwaHlzX21lbS5yZWdpb25zWzBdLmFkZHJlc3M7CisJaWYgKGEgIT0gMCkKKwkJcGFuaWMoIlJBTSBkb2Vzbid0IHN0YXJ0IGF0IHBoeXNpY2FsIGFkZHJlc3MgMCIpOworCXRvdGFsID0gcGh5c19tZW0ucmVnaW9uc1swXS5zaXplOworCisJaWYgKHBoeXNfbWVtLm5fcmVnaW9ucyA+IDEpIHsKKwkJcHJpbnRrKCJSQU0gc3RhcnRpbmcgYXQgMHgleCBpcyBub3QgY29udGlndW91c1xuIiwKKwkJICAgICAgIHBoeXNfbWVtLnJlZ2lvbnNbMV0uYWRkcmVzcyk7CisJCXByaW50aygiVXNpbmcgUkFNIGZyb20gMCB0byAweCVseFxuIiwgdG90YWwtMSk7CisJfQorCisJcmV0dXJuIHRvdGFsOworfQorCiB2b2lkIF9faW5pdAogY2hycF9pbml0KHVuc2lnbmVkIGxvbmcgcjMsIHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCiAJICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3KQpAQCAtNTI2LDcgKzU5NCw3IEBACiAJcHBjX21kLmdldF9ydGNfdGltZSAgID0gY2hycF9nZXRfcnRjX3RpbWU7CiAJcHBjX21kLmNhbGlicmF0ZV9kZWNyID0gY2hycF9jYWxpYnJhdGVfZGVjcjsKIAotCXBwY19tZC5maW5kX2VuZF9vZl9tZW1vcnkgPSBwbWFjX2ZpbmRfZW5kX29mX21lbW9yeTsKKwlwcGNfbWQuZmluZF9lbmRfb2ZfbWVtb3J5ID0gY2hycF9maW5kX2VuZF9vZl9tZW1vcnk7CiAKIAlpZiAocnRhc19kYXRhKSB7CiAJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcnRhczsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9jaHJwX3RpbWUuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9jaHJwX3RpbWUuYwppbmRleCAyOWQwNzRjLi41Nzc1M2E1IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvY2hycF90aW1lLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL2NocnBfdGltZS5jCkBAIC0xNjMsMTMgKzE2Myw3NSBAQAogCXJldHVybiBta3RpbWUoeWVhciwgbW9uLCBkYXksIGhvdXIsIG1pbiwgc2VjKTsKIH0KIAorLyoKKyAqIENhbGlicmF0ZSB0aGUgZGVjcmVtZW50ZXIgZnJlcXVlbmN5IHdpdGggdGhlIFZJQSB0aW1lciAxLgorICovCisjZGVmaW5lIFZJQV9USU1FUl9GUkVRXzYJNDcwMDAwMAkvKiB0aW1lIDEgZnJlcXVlbmN5ICogNiAqLworCisvKiBWSUEgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJTCQkweDIwMAkJLyogc2tpcCBiZXR3ZWVuIHJlZ2lzdGVycyAqLworI2RlZmluZSBUMUNMCQkoNCpSUykJCS8qIFRpbWVyIDEgY3RyL2xhdGNoIChsb3cgOCBiaXRzKSAqLworI2RlZmluZSBUMUNICQkoNSpSUykJCS8qIFRpbWVyIDEgY291bnRlciAoaGlnaCA4IGJpdHMpICovCisjZGVmaW5lIFQxTEwJCSg2KlJTKQkJLyogVGltZXIgMSBsYXRjaCAobG93IDggYml0cykgKi8KKyNkZWZpbmUgVDFMSAkJKDcqUlMpCQkvKiBUaW1lciAxIGxhdGNoIChoaWdoIDggYml0cykgKi8KKyNkZWZpbmUgQUNSCQkoMTEqUlMpCQkvKiBBdXhpbGlhcnkgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBJRlIJCSgxMypSUykJCS8qIEludGVycnVwdCBmbGFnIHJlZ2lzdGVyICovCisKKy8qIEJpdHMgaW4gQUNSICovCisjZGVmaW5lIFQxTU9ERQkJMHhjMAkJLyogVGltZXIgMSBtb2RlICovCisjZGVmaW5lIFQxTU9ERV9DT05UCTB4NDAJCS8qICBjb250aW51b3VzIGludGVycnVwdHMgKi8KKworLyogQml0cyBpbiBJRlIgYW5kIElFUiAqLworI2RlZmluZSBUMV9JTlQJCTB4NDAJCS8qIFRpbWVyIDEgaW50ZXJydXB0ICovCisKK3N0YXRpYyBpbnQgX19pbml0IGNocnBfdmlhX2NhbGlicmF0ZV9kZWNyKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICp2aWFzOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19pb21lbSAqdmlhOworCWludCBjb3VudCA9IFZJQV9USU1FUl9GUkVRXzYgLyAxMDA7CisJdW5zaWduZWQgaW50IGRzdGFydCwgZGVuZDsKKworCXZpYXMgPSBmaW5kX2RldmljZXMoInZpYS1jdWRhIik7CisJaWYgKHZpYXMgPT0gMCkKKwkJdmlhcyA9IGZpbmRfZGV2aWNlcygidmlhIik7CisJaWYgKHZpYXMgPT0gMCB8fCB2aWFzLT5uX2FkZHJzID09IDApCisJCXJldHVybiAwOworCXZpYSA9IGlvcmVtYXAodmlhcy0+YWRkcnNbMF0uYWRkcmVzcywgdmlhcy0+YWRkcnNbMF0uc2l6ZSk7CisKKwkvKiBzZXQgdGltZXIgMSBmb3IgY29udGludW91cyBpbnRlcnJ1cHRzICovCisJb3V0XzgoJnZpYVtBQ1JdLCAodmlhW0FDUl0gJiB+VDFNT0RFKSB8IFQxTU9ERV9DT05UKTsKKwkvKiBzZXQgdGhlIGNvdW50ZXIgdG8gYSBzbWFsbCB2YWx1ZSAqLworCW91dF84KCZ2aWFbVDFDSF0sIDIpOworCS8qIHNldCB0aGUgbGF0Y2ggdG8gYGNvdW50JyAqLworCW91dF84KCZ2aWFbVDFMTF0sIGNvdW50KTsKKwlvdXRfOCgmdmlhW1QxTEhdLCBjb3VudCA+PiA4KTsKKwkvKiB3YWl0IHVudGlsIGl0IGhpdHMgMCAqLworCXdoaWxlICgoaW5fOCgmdmlhW0lGUl0pICYgVDFfSU5UKSA9PSAwKQorCQk7CisJZHN0YXJ0ID0gZ2V0X2RlYygpOworCS8qIGNsZWFyIHRoZSBpbnRlcnJ1cHQgJiB3YWl0IHVudGlsIGl0IGhpdHMgMCBhZ2FpbiAqLworCWluXzgoJnZpYVtUMUNMXSk7CisJd2hpbGUgKChpbl84KCZ2aWFbSUZSXSkgJiBUMV9JTlQpID09IDApCisJCTsKKwlkZW5kID0gZ2V0X2RlYygpOworCisJdGJfdGlja3NfcGVyX2ppZmZ5ID0gKGRzdGFydCAtIGRlbmQpIC8gKCg2ICogSFopLzEwMCk7CisJdGJfdG9fdXMgPSBtdWxod3Vfc2NhbGVfZmFjdG9yKGRzdGFydCAtIGRlbmQsIDYwMDAwKTsKKworCXByaW50ayhLRVJOX0lORk8gInZpYV9jYWxpYnJhdGVfZGVjcjogdGlja3MgcGVyIGppZmZ5ID0gJXUgKCV1IHRpY2tzKVxuIiwKKwkgICAgICAgdGJfdGlja3NfcGVyX2ppZmZ5LCBkc3RhcnQgLSBkZW5kKTsKKworCWlvdW5tYXAodmlhKTsKKwkKKwlyZXR1cm4gMTsKK30KIAogdm9pZCBfX2luaXQgY2hycF9jYWxpYnJhdGVfZGVjcih2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1OwogCXVuc2lnbmVkIGludCBmcmVxLCAqZnA7CiAKLQlpZiAodmlhX2NhbGlicmF0ZV9kZWNyKCkpCisJaWYgKGNocnBfdmlhX2NhbGlicmF0ZV9kZWNyKCkpCiAJCXJldHVybjsKIAogCS8qCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19iYWNrbGlnaHQuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX2JhY2tsaWdodC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmUyZjdkLi4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX2JhY2tsaWdodC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qCi0gKiBNaXNjZWxsYW5lb3VzIHByb2NlZHVyZXMgZm9yIGRlYWxpbmcgd2l0aCB0aGUgUG93ZXJNYWMgaGFyZHdhcmUuCi0gKiBDb250YWlucyBzdXBwb3J0IGZvciB0aGUgYmFja2xpZ2h0LgotICoKLSAqICAgQ29weXJpZ2h0IChDKSAyMDAwIEJlbmphbWluIEhlcnJlbnNjaG1pZHQKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgotI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgotI2luY2x1ZGUgPGxpbnV4L252cmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgotI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaW5jbHVkZSA8YXNtL252cmFtLmg+Ci0jaW5jbHVkZSA8YXNtL2JhY2tsaWdodC5oPgotCi0jaW5jbHVkZSA8bGludXgvYWRiLmg+Ci0jaW5jbHVkZSA8bGludXgvcG11Lmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X2NvbnRyb2xsZXIgKmJhY2tsaWdodGVyOwotc3RhdGljIHZvaWQqIGJhY2tsaWdodGVyX2RhdGE7Ci1zdGF0aWMgaW50IGJhY2tsaWdodF9hdXRvc2F2ZTsKLXN0YXRpYyBpbnQgYmFja2xpZ2h0X2xldmVsID0gQkFDS0xJR0hUX01BWDsKLXN0YXRpYyBpbnQgYmFja2xpZ2h0X2VuYWJsZWQgPSAxOwotc3RhdGljIGludCBiYWNrbGlnaHRfcmVxX2xldmVsID0gLTE7Ci1zdGF0aWMgaW50IGJhY2tsaWdodF9yZXFfZW5hYmxlID0gLTE7Ci0KLXN0YXRpYyB2b2lkIGJhY2tsaWdodF9jYWxsYmFjayh2b2lkICopOwotc3RhdGljIERFQ0xBUkVfV09SSyhiYWNrbGlnaHRfd29yaywgYmFja2xpZ2h0X2NhbGxiYWNrLCBOVUxMKTsKLQotdm9pZCByZWdpc3Rlcl9iYWNrbGlnaHRfY29udHJvbGxlcihzdHJ1Y3QgYmFja2xpZ2h0X2NvbnRyb2xsZXIgKmN0cmxlciwKLQkJCQkJICB2b2lkICpkYXRhLCBjaGFyICp0eXBlKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSogYmtfbm9kZTsKLQljaGFyICpwcm9wOwotCWludCB2YWxpZCA9IDA7Ci0KLQkvKiBUaGVyZSdzIGFscmVhZHkgYSBtYXRjaGluZyBjb250cm9sbGVyLCBiYWlsIG91dCAqLwotCWlmIChiYWNrbGlnaHRlciAhPSBOVUxMKQotCQlyZXR1cm47Ci0KLQlia19ub2RlID0gZmluZF9kZXZpY2VzKCJiYWNrbGlnaHQiKTsKLQotI2lmZGVmIENPTkZJR19BREJfUE1VCi0JLyogU3BlY2lhbCBjYXNlIGZvciB0aGUgb2xkIFBvd2VyQm9vayBzaW5jZSBJIGNhbid0IHRlc3Qgb24gaXQgKi8KLQliYWNrbGlnaHRfYXV0b3NhdmUgPSBtYWNoaW5lX2lzX2NvbXBhdGlibGUoIkFBUEwsMzQwMC8yNDAwIikKLQkJfHwgbWFjaGluZV9pc19jb21wYXRpYmxlKCJBQVBMLDM1MDAiKTsKLQlpZiAoKGJhY2tsaWdodF9hdXRvc2F2ZQotCSAgICAgfHwgbWFjaGluZV9pc19jb21wYXRpYmxlKCJBQVBMLFBvd2VyQm9vazE5OTgiKQotCSAgICAgfHwgbWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlckJvb2sxLDEiKSkKLQkgICAgJiYgIXN0cmNtcCh0eXBlLCAicG11IikpCi0JCXZhbGlkID0gMTsKLSNlbmRpZgotCWlmIChia19ub2RlKSB7Ci0JCXByb3AgPSBnZXRfcHJvcGVydHkoYmtfbm9kZSwgImJhY2tsaWdodC1jb250cm9sIiwgTlVMTCk7Ci0JCWlmIChwcm9wICYmICFzdHJuY21wKHByb3AsIHR5cGUsIHN0cmxlbih0eXBlKSkpCi0JCQl2YWxpZCA9IDE7Ci0JfQotCWlmICghdmFsaWQpCi0JCXJldHVybjsKLQliYWNrbGlnaHRlciA9IGN0cmxlcjsKLQliYWNrbGlnaHRlcl9kYXRhID0gZGF0YTsKLQotCWlmIChia19ub2RlICYmICFiYWNrbGlnaHRfYXV0b3NhdmUpCi0JCXByb3AgPSBnZXRfcHJvcGVydHkoYmtfbm9kZSwgImJrbHQiLCBOVUxMKTsKLQllbHNlCi0JCXByb3AgPSBOVUxMOwotCWlmIChwcm9wKSB7Ci0JCWJhY2tsaWdodF9sZXZlbCA9ICgoKnByb3ApKzEpID4+IDE7Ci0JCWlmIChiYWNrbGlnaHRfbGV2ZWwgPiBCQUNLTElHSFRfTUFYKQotCQkJYmFja2xpZ2h0X2xldmVsID0gQkFDS0xJR0hUX01BWDsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfQURCX1BNVQotCWlmIChiYWNrbGlnaHRfYXV0b3NhdmUpIHsKLQkJc3RydWN0IGFkYl9yZXF1ZXN0IHJlcTsKLQkJcG11X3JlcXVlc3QoJnJlcSwgTlVMTCwgMiwgMHhkOSwgMCk7Ci0JCXdoaWxlICghcmVxLmNvbXBsZXRlKQotCQkJcG11X3BvbGwoKTsKLQkJYmFja2xpZ2h0X2xldmVsID0gcmVxLnJlcGx5WzBdID4+IDQ7Ci0JfQotI2VuZGlmCi0JYWNxdWlyZV9jb25zb2xlX3NlbSgpOwotCWlmICghYmFja2xpZ2h0ZXItPnNldF9lbmFibGUoMSwgYmFja2xpZ2h0X2xldmVsLCBkYXRhKSkKLQkJYmFja2xpZ2h0X2VuYWJsZWQgPSAxOwotCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKLQotCXByaW50ayhLRVJOX0lORk8gIlJlZ2lzdGVyZWQgXCIlc1wiIGJhY2tsaWdodCBjb250cm9sbGVyLCIKLQkgICAgICAgImxldmVsOiAlZC8xNVxuIiwgdHlwZSwgYmFja2xpZ2h0X2xldmVsKTsKLX0KLUVYUE9SVF9TWU1CT0wocmVnaXN0ZXJfYmFja2xpZ2h0X2NvbnRyb2xsZXIpOwotCi12b2lkIHVucmVnaXN0ZXJfYmFja2xpZ2h0X2NvbnRyb2xsZXIoc3RydWN0IGJhY2tsaWdodF9jb250cm9sbGVyCi0JCQkJCSAgICAqY3RybGVyLCB2b2lkICpkYXRhKQotewotCS8qIFdlIGtlZXAgdGhlIGN1cnJlbnQgYmFja2xpZ2h0IGxldmVsIChmb3Igbm93KSAqLwotCWlmIChjdHJsZXIgPT0gYmFja2xpZ2h0ZXIgJiYgZGF0YSA9PSBiYWNrbGlnaHRlcl9kYXRhKQotCQliYWNrbGlnaHRlciA9IE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfYmFja2xpZ2h0X2NvbnRyb2xsZXIpOwotCi1zdGF0aWMgaW50IF9fc2V0X2JhY2tsaWdodF9lbmFibGUoaW50IGVuYWJsZSkKLXsKLQlpbnQgcmM7Ci0KLQlpZiAoIWJhY2tsaWdodGVyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7Ci0JcmMgPSBiYWNrbGlnaHRlci0+c2V0X2VuYWJsZShlbmFibGUsIGJhY2tsaWdodF9sZXZlbCwKLQkJCQkgICAgIGJhY2tsaWdodGVyX2RhdGEpOwotCWlmICghcmMpCi0JCWJhY2tsaWdodF9lbmFibGVkID0gZW5hYmxlOwotCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKLQlyZXR1cm4gcmM7Ci19Ci1pbnQgc2V0X2JhY2tsaWdodF9lbmFibGUoaW50IGVuYWJsZSkKLXsKLQlpZiAoIWJhY2tsaWdodGVyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQliYWNrbGlnaHRfcmVxX2VuYWJsZSA9IGVuYWJsZTsKLQlzY2hlZHVsZV93b3JrKCZiYWNrbGlnaHRfd29yayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLUVYUE9SVF9TWU1CT0woc2V0X2JhY2tsaWdodF9lbmFibGUpOwotCi1pbnQgZ2V0X2JhY2tsaWdodF9lbmFibGUodm9pZCkKLXsKLQlpZiAoIWJhY2tsaWdodGVyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlyZXR1cm4gYmFja2xpZ2h0X2VuYWJsZWQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGdldF9iYWNrbGlnaHRfZW5hYmxlKTsKLQotc3RhdGljIGludCBfX3NldF9iYWNrbGlnaHRfbGV2ZWwoaW50IGxldmVsKQotewotCWludCByYyA9IDA7Ci0KLQlpZiAoIWJhY2tsaWdodGVyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAobGV2ZWwgPCBCQUNLTElHSFRfTUlOKQotCQlsZXZlbCA9IEJBQ0tMSUdIVF9PRkY7Ci0JaWYgKGxldmVsID4gQkFDS0xJR0hUX01BWCkKLQkJbGV2ZWwgPSBCQUNLTElHSFRfTUFYOwotCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKLQlpZiAoYmFja2xpZ2h0X2VuYWJsZWQpCi0JCXJjID0gYmFja2xpZ2h0ZXItPnNldF9sZXZlbChsZXZlbCwgYmFja2xpZ2h0ZXJfZGF0YSk7Ci0JaWYgKCFyYykKLQkJYmFja2xpZ2h0X2xldmVsID0gbGV2ZWw7Ci0JcmVsZWFzZV9jb25zb2xlX3NlbSgpOwotCWlmICghcmMgJiYgIWJhY2tsaWdodF9hdXRvc2F2ZSkgewotCQlsZXZlbCA8PD0xOwotCQlpZiAobGV2ZWwgJiAweDEwKQotCQkJbGV2ZWwgfD0gMHgwMTsKLQkJLy8gLS0gdG9kbzogc2F2ZSB0byBwcm9wZXJ0eSAiYmtsdCIKLQl9Ci0JcmV0dXJuIHJjOwotfQotaW50IHNldF9iYWNrbGlnaHRfbGV2ZWwoaW50IGxldmVsKQotewotCWlmICghYmFja2xpZ2h0ZXIpCi0JCXJldHVybiAtRU5PREVWOwotCWJhY2tsaWdodF9yZXFfbGV2ZWwgPSBsZXZlbDsKLQlzY2hlZHVsZV93b3JrKCZiYWNrbGlnaHRfd29yayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLUVYUE9SVF9TWU1CT0woc2V0X2JhY2tsaWdodF9sZXZlbCk7Ci0KLWludCBnZXRfYmFja2xpZ2h0X2xldmVsKHZvaWQpCi17Ci0JaWYgKCFiYWNrbGlnaHRlcikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JcmV0dXJuIGJhY2tsaWdodF9sZXZlbDsKLX0KLUVYUE9SVF9TWU1CT0woZ2V0X2JhY2tsaWdodF9sZXZlbCk7Ci0KLXN0YXRpYyB2b2lkIGJhY2tsaWdodF9jYWxsYmFjayh2b2lkICpkdW1teSkKLXsKLQlpbnQgbGV2ZWwsIGVuYWJsZTsKLQotCWRvIHsKLQkJbGV2ZWwgPSBiYWNrbGlnaHRfcmVxX2xldmVsOwotCQllbmFibGUgPSBiYWNrbGlnaHRfcmVxX2VuYWJsZTsKLQkJbWIoKTsKLQotCQlpZiAobGV2ZWwgPj0gMCkKLQkJCV9fc2V0X2JhY2tsaWdodF9sZXZlbChsZXZlbCk7Ci0JCWlmIChlbmFibGUgPj0gMCkKLQkJCV9fc2V0X2JhY2tsaWdodF9lbmFibGUoZW5hYmxlKTsKLQl9IHdoaWxlKGNtcHhjaGcoJmJhY2tsaWdodF9yZXFfbGV2ZWwsIGxldmVsLCAtMSkgIT0gbGV2ZWwgfHwKLQkJY21weGNoZygmYmFja2xpZ2h0X3JlcV9lbmFibGUsIGVuYWJsZSwgLTEpICE9IGVuYWJsZSk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19jYWNoZS5TIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfY2FjaGUuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI5NzdkZS4uMDAwMDAwMAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19jYWNoZS5TCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgbG93LWxldmVsIGNhY2hlIG1hbmFnZW1lbnQgZnVuY3Rpb25zCi0gKiB1c2VkIGZvciBzbGVlcCBhbmQgQ1BVIHNwZWVkIGNoYW5nZXMgb24gQXBwbGUgbWFjaGluZXMuCi0gKiAoSW4gZmFjdCB0aGUgb25seSB0aGluZyB0aGF0IGlzIEFwcGxlLXNwZWNpZmljIGlzIHRoYXQgd2UgYXNzdW1lCi0gKiB0aGF0IHdlIGNhbiByZWFkIGZyb20gUk9NIGF0IHBoeXNpY2FsIGFkZHJlc3MgMHhmZmYwMDAwMC4pCi0gKgotICogICAgQ29weXJpZ2h0IChDKSAyMDA0IFBhdWwgTWFja2VycmFzIChwYXVsdXNAc2FtYmEub3JnKSBhbmQKLSAqICAgICAgICAgICAgICAgICAgICAgICBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IChiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmcpCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgotI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgotCi0vKgotICogRmx1c2ggYW5kIGRpc2FibGUgYWxsIGRhdGEgY2FjaGVzIChkTDEsIEwyLCBMMykuIFRoaXMgaXMgdXNlZAotICogd2hlbiBnb2luZyB0byBzbGVlcCwgd2hlbiBkb2luZyBhIFBNVSBiYXNlZCBjcHVmcmVxIHRyYW5zaXRpb24sCi0gKiBvciB3aGVuICJvZmZsaW5pbmciIGEgQ1BVIG9uIFNNUCBtYWNoaW5lcy4gVGhpcyBjb2RlIGlzIG92ZXIKLSAqIHBhcmFub2lkLCBidXQgSSd2ZSBoYWQgZW5vdWdoIGlzc3VlcyB3aXRoIHZhcmlvdXMgQ1BVIHJldnMgYW5kCi0gKiBidWdzIHRoYXQgSSBkZWNpZGVkIGl0IHdhcyB3b3J0aCBiZWVpbmcgb3ZlciBjYXV0aW91cwotICovCi0KLV9HTE9CQUwoZmx1c2hfZGlzYWJsZV9jYWNoZXMpCi0jaWZuZGVmIENPTkZJR182eHgKLQlibHIKLSNlbHNlCi1CRUdJTl9GVFJfU0VDVElPTgotCWIJZmx1c2hfZGlzYWJsZV83NDV4Ci1FTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9TUEVDNzQ1MCkKLUJFR0lOX0ZUUl9TRUNUSU9OCi0JYglmbHVzaF9kaXNhYmxlXzc1eAotRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfTDJDUikKLQliCV9fZmx1c2hfZGlzYWJsZV9MMQotCi0vKiBUaGlzIGlzIHRoZSBjb2RlIGZvciBHMyBhbmQgNzRbMDFdMCAqLwotZmx1c2hfZGlzYWJsZV83NXg6Ci0JbWZscglyMTAKLQotCS8qIFR1cm4gb2ZmIEVFIGFuZCBEUiBpbiBNU1IgKi8KLQltZm1zcglyMTEKLQlybHdpbm0JcjAscjExLDAsfk1TUl9FRQotCXJsd2lubQlyMCxyMCwwLH5NU1JfRFIKLQlzeW5jCi0JbXRtc3IJcjAKLQlpc3luYwotCi0JLyogU3RvcCBEU1Qgc3RyZWFtcyAqLwotQkVHSU5fRlRSX1NFQ1RJT04KLQlEU1NBTEwKLQlzeW5jCi1FTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BTFRJVkVDKQotCi0JLyogU3RvcCBEUE0gKi8KLQltZnNwcglyOCxTUFJOX0hJRDAJCS8qIFNhdmUgU1BSTl9ISUQwIGluIHI4ICovCi0Jcmx3aW5tCXI0LHI4LDAsMTIsMTAJCS8qIFR1cm4gb2ZmIEhJRDBbRFBNXSAqLwotCXN5bmMKLQltdHNwcglTUFJOX0hJRDAscjQJCS8qIERpc2FibGUgRFBNICovCi0Jc3luYwotCi0JLyogRGlzcC1mbHVzaCBMMS4gV2UgaGF2ZSBhIHdlaXJkIHByb2JsZW0gaGVyZSB0aGF0IEkgbmV2ZXIKLQkgKiB0b3RhbGx5IGZpZ3VyZWQgb3V0LiBPbiA3NTBGWCwgdXNpbmcgdGhlIFJPTSBmb3IgdGhlIGZsdXNoCi0JICogcmVzdWx0cyBpbiBhIG5vbi13b3JraW5nIGZsdXNoLiBXZSB1c2UgdGhhdCB3b3JrYXJvdW5kIGZvcgotCSAqIG5vdyB1bnRpbCBJIGZpbmFsbHkgdW5kZXJzdGFuZCB3aGF0J3MgZ29pbmcgb24uIC0tQmVuSAotCSAqLwotCi0JLyogUk9NIGJhc2UgYnkgZGVmYXVsdCAqLwotCWxpcwlyNCwweGZmZjAKLQltZnB2cglyMwotCXNyd2kJcjMscjMsMTYKLQljbXBsd2kJY3IwLHIzLDB4NzAwMAotCWJuZSsJMWYKLQkvKiBSQU0gYmFzZSBvbiA3NTBGWCAqLwotCWxpCXI0LDAKLTE6CWxpCXI0LDB4NDAwMAotCW10Y3RyCXI0Ci0xOglsd3oJcjAsMChyNCkKLQlhZGRpCXI0LHI0LDMyCi0JYmRuegkxYgotCXN5bmMKLQlpc3luYwotCi0JLyogRGlzYWJsZSAvIGludmFsaWRhdGUgLyBlbmFibGUgTDEgZGF0YSAqLwotCW1mc3ByCXIzLFNQUk5fSElEMAotCXJsd2lubQlyMyxyMywwLH4oSElEMF9EQ0UgfCBISUQwX0lDRSkKLQltdHNwcglTUFJOX0hJRDAscjMKLQlzeW5jCi0JaXN5bmMKLQlvcmkJcjMscjMsKEhJRDBfRENFfEhJRDBfRENJfEhJRDBfSUNFfEhJRDBfSUNGSSkKLQlzeW5jCi0JaXN5bmMKLQltdHNwcglTUFJOX0hJRDAscjMKLQl4b3JpCXIzLHIzLChISUQwX0RDSXxISUQwX0lDRkkpCi0JbXRzcHIJU1BSTl9ISUQwLHIzCi0Jc3luYwotCi0JLyogR2V0IHRoZSBjdXJyZW50IGVuYWJsZSBiaXQgb2YgdGhlIEwyQ1IgaW50byByNCAqLwotCW1mc3ByCXI1LFNQUk5fTDJDUgotCS8qIFNldCB0byBkYXRhLW9ubHkgKHByZS03NDV4IGJpdCkgKi8KLQlvcmlzCXIzLHI1LEwyQ1JfTDJET0BoCi0JYgkyZgotCS8qIFdoZW4gZGlzYWJsaW5nIEwyLCBjb2RlIG11c3QgYmUgaW4gTDEgKi8KLQkuYmFsaWduIDMyCi0xOgltdHNwcglTUFJOX0wyQ1IscjMKLTM6CXN5bmMKLQlpc3luYwotCWIJMWYKLTI6CWIJM2YKLTM6CXN5bmMKLQlpc3luYwotCWIJMWIKLTE6CS8qIGRpc3AtZmx1c2ggTDIuIFRoZSBpbnRlcmVzdGluZyB0aGluZyBoZXJlIGlzIHRoYXQgdGhlIEwyIGNhbiBiZQotCSAqIHVwIHRvIDJNYiAuLi4gc28gdXNpbmcgdGhlIFJPTSwgd2UnbGwgZW5kIHVwIHdyYXBwaW5nIGJhY2sgdG8gbWVtb3J5Ci0JICogYnV0IHRoYXQgaXMgcHJvYmJhbHkgZmluZS4gV2UgZGlzcC1mbHVzaCBvdmVyIDRNYiB0byBiZSBzYWZlCi0JICovCi0JbGlzCXI0LDIKLQltdGN0cglyNAotCWxpcwlyNCwweGZmZjAKLTE6CWx3eglyMCwwKHI0KQotCWFkZGkJcjQscjQsMzIKLQliZG56CTFiCi0Jc3luYwotCWlzeW5jCi0JbGlzCXI0LDIKLQltdGN0cglyNAotCWxpcwlyNCwweGZmZjAKLTE6CWRjYmYJMCxyNAotCWFkZGkJcjQscjQsMzIKLQliZG56CTFiCi0Jc3luYwotCWlzeW5jCi0KLQkvKiBub3cgZGlzYWJsZSBMMiAqLwotCXJsd2lubQlyNSxyNSwwLH5MMkNSX0wyRQotCWIJMmYKLQkvKiBXaGVuIGRpc2FibGluZyBMMiwgY29kZSBtdXN0IGJlIGluIEwxICovCi0JLmJhbGlnbiAzMgotMToJbXRzcHIJU1BSTl9MMkNSLHI1Ci0zOglzeW5jCi0JaXN5bmMKLQliCTFmCi0yOgliCTNmCi0zOglzeW5jCi0JaXN5bmMKLQliCTFiCi0xOglzeW5jCi0JaXN5bmMKLQkvKiBJbnZhbGlkYXRlIEwyLiBUaGlzIGlzIHByZS03NDV4LCB3ZSBjbGVhciB0aGUgTDJJIGJpdCBvdXJzZWx2ZXMgKi8KLQlvcmlzCXI0LHI1LEwyQ1JfTDJJQGgKLQltdHNwcglTUFJOX0wyQ1IscjQKLQlzeW5jCi0JaXN5bmMKLQotCS8qIFdhaXQgZm9yIHRoZSBpbnZhbGlkYXRpb24gdG8gY29tcGxldGUgKi8KLTE6CW1mc3ByCXIzLFNQUk5fTDJDUgotCXJsd2lubS4JcjAscjMsMCwzMSwzMQotCWJuZQkxYgotCi0JLyogQ2xlYXIgTDJJICovCi0JeG9yaXMJcjQscjQsTDJDUl9MMklAaAotCXN5bmMKLQltdHNwcglTUFJOX0wyQ1IscjQKLQlzeW5jCi0KLQkvKiBub3cgZGlzYWJsZSB0aGUgTDEgZGF0YSBjYWNoZSAqLwotCW1mc3ByCXIwLFNQUk5fSElEMAotCXJsd2lubQlyMCxyMCwwLH4oSElEMF9EQ0V8SElEMF9JQ0UpCi0JbXRzcHIJU1BSTl9ISUQwLHIwCi0Jc3luYwotCWlzeW5jCi0KLQkvKiBSZXN0b3JlIEhJRDBbRFBNXSB0byB3aGF0ZXZlciBpdCB3YXMgYmVmb3JlICovCi0Jc3luYwotCW1mc3ByCXIwLFNQUk5fSElEMAotCXJsd2ltaQlyMCxyOCwwLDExLDExCQkvKiBUdXJuIGJhY2sgSElEMFtEUE1dICovCi0JbXRzcHIJU1BSTl9ISUQwLHIwCi0Jc3luYwotCi0JLyogcmVzdG9yZSBEUiBhbmQgRUUgKi8KLQlzeW5jCi0JbXRtc3IJcjExCi0JaXN5bmMKLQotCW10bHIJcjEwCi0JYmxyCi0KLS8qIFRoaXMgY29kZSBpcyBmb3IgNzQ1eCBwcm9jZXNzb3JzICovCi1mbHVzaF9kaXNhYmxlXzc0NXg6Ci0JLyogVHVybiBvZmYgRUUgYW5kIERSIGluIE1TUiAqLwotCW1mbXNyCXIxMQotCXJsd2lubQlyMCxyMTEsMCx+TVNSX0VFCi0Jcmx3aW5tCXIwLHIwLDAsfk1TUl9EUgotCXN5bmMKLQltdG1zcglyMAotCWlzeW5jCi0KLQkvKiBTdG9wIHByZWZldGNoIHN0cmVhbXMgKi8KLQlEU1NBTEwKLQlzeW5jCi0KLQkvKiBEaXNhYmxlIEwyIHByZWZldGNoaW5nICovCi0JbWZzcHIJcjAsU1BSTl9NU1NDUjAKLQlybHdpbm0JcjAscjAsMCwwLDI5Ci0JbXRzcHIJU1BSTl9NU1NDUjAscjAKLQlzeW5jCi0JaXN5bmMKLQlsaXMJcjQsMAotCWRjYmYJMCxyNAotCWRjYmYJMCxyNAotCWRjYmYJMCxyNAotCWRjYmYJMCxyNAotCWRjYmYJMCxyNAotCWRjYmYJMCxyNAotCWRjYmYJMCxyNAotCWRjYmYJMCxyNAotCi0JLyogRHVlIHRvIGEgYnVnIHdpdGggdGhlIEhXIGZsdXNoIG9uIHNvbWUgQ1BVIHJldnMsIHdlIG9jY2FzaW9uYWxseQotCSAqIGV4cGVyaWVuY2UgZGF0YSBjb3JydXB0aW9uLiBJJ20gYWRkaW5nIGEgZGlzcGxhY2VtZW50IGZsdXNoIGFsb25nCi0JICogd2l0aCBhIGRjYmYgbG9vcCBvdmVyIGEgZmV3IE1iIHRvICJoZWxwIi4gVGhlIHByb2JsZW0gaXNuJ3QgdG90YWxseQotCSAqIGZpeGVkIGJ5IHRoaXMgaW4gdGhlb3J5LCBidXQgYXQgbGVhc3QsIGluIHByYWN0aWNlLCBJIGNvdWxkbid0IHJlcHJvZHVjZQotCSAqIGl0IGV2ZW4gd2l0aCBhIGJpZyBoYW1tZXIuLi4KLQkgKi8KLQotICAgICAgICBsaXMgICAgIHI0LDB4MDAwMgotICAgICAgICBtdGN0ciAgIHI0Ci0gCWxpICAgICAgcjQsMAotMToKLSAgICAgICAgbHd6ICAgICByMCwwKHI0KQotICAgICAgICBhZGRpICAgIHI0LHI0LDMyICAgICAgICAgICAgICAgIC8qIEdvIHRvIHN0YXJ0IG9mIG5leHQgY2FjaGUgbGluZSAqLwotICAgICAgICBiZG56ICAgIDFiCi0gICAgICAgIGlzeW5jCi0KLSAgICAgICAgLyogTm93LCBmbHVzaCB0aGUgZmlyc3QgNE1CIG9mIG1lbW9yeSAqLwotICAgICAgICBsaXMgICAgIHI0LDB4MDAwMgotICAgICAgICBtdGN0ciAgIHI0Ci0JbGkgICAgICByNCwwCi0gICAgICAgIHN5bmMKLTE6Ci0gICAgICAgIGRjYmYgICAgMCxyNAotICAgICAgICBhZGRpICAgIHI0LHI0LDMyICAgICAgICAgICAgICAgIC8qIEdvIHRvIHN0YXJ0IG9mIG5leHQgY2FjaGUgbGluZSAqLwotICAgICAgICBiZG56ICAgIDFiCi0KLQkvKiBGbHVzaCBhbmQgZGlzYWJsZSB0aGUgTDEgZGF0YSBjYWNoZSAqLwotCW1mc3ByCXI2LFNQUk5fTERTVENSCi0JbGlzCXIzLDB4ZmZmMAkvKiByZWFkIGZyb20gUk9NIGZvciBkaXNwbGFjZW1lbnQgZmx1c2ggKi8KLQlsaQlyNCwweGZlCQkvKiBzdGFydCB3aXRoIG9ubHkgd2F5IDAgdW5sb2NrZWQgKi8KLQlsaQlyNSwxMjgJCS8qIDEyOCBsaW5lcyBpbiBlYWNoIHdheSAqLwotMToJbXRjdHIJcjUKLQlybHdpbWkJcjYscjQsMCwyNCwzMQotCW10c3ByCVNQUk5fTERTVENSLHI2Ci0Jc3luYwotCWlzeW5jCi0yOglsd3oJcjAsMChyMykJLyogdG91Y2ggZWFjaCBjYWNoZSBsaW5lICovCi0JYWRkaQlyMyxyMywzMgotCWJkbnoJMmIKLQlybHdpbm0JcjQscjQsMSwyNCwzMAkvKiBtb3ZlIG9uIHRvIHRoZSBuZXh0IHdheSAqLwotCW9yaQlyNCxyNCwxCi0JY21wd2kJcjQsMHhmZgkJLyogYWxsIGRvbmU/ICovCi0JYm5lCTFiCi0JLyogbm93IHVubG9jayB0aGUgTDEgZGF0YSBjYWNoZSAqLwotCWxpCXI0LDAKLQlybHdpbWkJcjYscjQsMCwyNCwzMQotCXN5bmMKLQltdHNwcglTUFJOX0xEU1RDUixyNgotCXN5bmMKLQlpc3luYwotCi0JLyogRmx1c2ggdGhlIEwyIGNhY2hlIHVzaW5nIHRoZSBoYXJkd2FyZSBhc3Npc3QgKi8KLQltZnNwcglyMyxTUFJOX0wyQ1IKLQljbXB3aQlyMywwCQkvKiBjaGVjayBpZiBpdCBpcyBlbmFibGVkIGZpcnN0ICovCi0JYmdlCTRmCi0Jb3JpcwlyMCxyMywoTDJDUl9MMklPXzc0NXh8TDJDUl9MMkRPXzc0NXgpQGgKLQliCTJmCi0JLyogV2hlbiBkaXNhYmxpbmcvbG9ja2luZyBMMiwgY29kZSBtdXN0IGJlIGluIEwxICovCi0JLmJhbGlnbiAzMgotMToJbXRzcHIJU1BSTl9MMkNSLHIwCS8qIGxvY2sgdGhlIEwyIGNhY2hlICovCi0zOglzeW5jCi0JaXN5bmMKLQliCTFmCi0yOgliCTNmCi0zOglzeW5jCi0JaXN5bmMKLQliCTFiCi0xOglzeW5jCi0JaXN5bmMKLQlvcmkJcjAscjMsTDJDUl9MMkhXRl83NDV4Ci0Jc3luYwotCW10c3ByCVNQUk5fTDJDUixyMAkvKiBzZXQgdGhlIGhhcmR3YXJlIGZsdXNoIGJpdCAqLwotMzoJbWZzcHIJcjAsU1BSTl9MMkNSCS8qIHdhaXQgZm9yIGl0IHRvIGdvIHRvIDAgKi8KLQlhbmRpLglyMCxyMCxMMkNSX0wySFdGXzc0NXgKLQlibmUJM2IKLQlzeW5jCi0Jcmx3aW5tCXIzLHIzLDAsfkwyQ1JfTDJFCi0JYgkyZgotCS8qIFdoZW4gZGlzYWJsaW5nIEwyLCBjb2RlIG11c3QgYmUgaW4gTDEgKi8KLQkuYmFsaWduIDMyCi0xOgltdHNwcglTUFJOX0wyQ1IscjMJLyogZGlzYWJsZSB0aGUgTDIgY2FjaGUgKi8KLTM6CXN5bmMKLQlpc3luYwotCWIJMWYKLTI6CWIJM2YKLTM6CXN5bmMKLQlpc3luYwotCWIJMWIKLTE6CXN5bmMKLQlpc3luYwotCW9yaXMJcjQscjMsTDJDUl9MMklAaAotCW10c3ByCVNQUk5fTDJDUixyNAotCXN5bmMKLQlpc3luYwotMToJbWZzcHIJcjQsU1BSTl9MMkNSCi0JYW5kaXMuCXIwLHI0LEwyQ1JfTDJJQGgKLQlibmUJMWIKLQlzeW5jCi0KLUJFR0lOX0ZUUl9TRUNUSU9OCi0JLyogRmx1c2ggdGhlIEwzIGNhY2hlIHVzaW5nIHRoZSBoYXJkd2FyZSBhc3Npc3QgKi8KLTQ6CW1mc3ByCXIzLFNQUk5fTDNDUgotCWNtcHdpCXIzLDAJCS8qIGNoZWNrIGlmIGl0IGlzIGVuYWJsZWQgKi8KLQliZ2UJNmYKLQlvcmlzCXIwLHIzLEwzQ1JfTDNJT0BoCi0Jb3JpCXIwLHIwLEwzQ1JfTDNETwotCXN5bmMKLQltdHNwcglTUFJOX0wzQ1IscjAJLyogbG9jayB0aGUgTDMgY2FjaGUgKi8KLQlzeW5jCi0JaXN5bmMKLQlvcmkJcjAscjAsTDNDUl9MM0hXRgotCXN5bmMKLQltdHNwcglTUFJOX0wzQ1IscjAJLyogc2V0IHRoZSBoYXJkd2FyZSBmbHVzaCBiaXQgKi8KLTU6CW1mc3ByCXIwLFNQUk5fTDNDUgkvKiB3YWl0IGZvciBpdCB0byBnbyB0byB6ZXJvICovCi0JYW5kaS4JcjAscjAsTDNDUl9MM0hXRgotCWJuZQk1YgotCXJsd2lubQlyMyxyMywwLH5MM0NSX0wzRQotCXN5bmMKLQltdHNwcglTUFJOX0wzQ1IscjMJLyogZGlzYWJsZSB0aGUgTDMgY2FjaGUgKi8KLQlzeW5jCi0Jb3JpCXI0LHIzLEwzQ1JfTDNJCi0JbXRzcHIJU1BSTl9MM0NSLHI0Ci0xOgltZnNwcglyNCxTUFJOX0wzQ1IKLQlhbmRpLglyMCxyNCxMM0NSX0wzSQotCWJuZQkxYgotCXN5bmMKLUVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0wzQ1IpCi0KLTY6CW1mc3ByCXIwLFNQUk5fSElEMAkvKiBub3cgZGlzYWJsZSB0aGUgTDEgZGF0YSBjYWNoZSAqLwotCXJsd2lubQlyMCxyMCwwLH5ISUQwX0RDRQotCW10c3ByCVNQUk5fSElEMCxyMAotCXN5bmMKLQlpc3luYwotCW10bXNyCXIxMQkJLyogcmVzdG9yZSBEUiBhbmQgRUUgKi8KLQlpc3luYwotCWJscgotI2VuZGlmCS8qIENPTkZJR182eHggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX2NwdWZyZXEuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX2NwdWZyZXEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJhN2U0ZC4uMDAwMDAwMAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19jcHVmcmVxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MzUgKzAsMCBAQAotLyoKLSAqICBhcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19jcHVmcmVxLmMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNSBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+Ci0gKiAgQ29weXJpZ2h0IChDKSAyMDA0ICAgICAgICBKb2huIFN0ZWVsZSBTY290dCA8dG9vamF5c0B0b29qYXlzLm5ldD4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRPRE86IE5lZWQgYSBiaWcgY2xlYW51cCBoZXJlLiBCYXNpY2FsbHksIHdlIG5lZWQgdG8gaGF2ZSBkaWZmZXJlbnQKLSAqIGNwdWZyZXFfZHJpdmVyIHN0cnVjdHVyZXMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZSBvZiBIVyBpbnN0ZWFkIG9mIHRoZQotICogY3VycmVudCBtZXNzLiBXZSBhbHNvIG5lZWQgdG8gYmV0dGVyIGRlYWwgd2l0aCB0aGUgZGV0ZWN0aW9uIG9mIHRoZQotICogdHlwZSBvZiBtYWNoaW5lLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9hZGIuaD4KLSNpbmNsdWRlIDxsaW51eC9wbXUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vcG1hY19mZWF0dXJlLmg+Ci0jaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+Ci0jaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+Ci0jaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWUuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL29wZW5fcGljLmg+Ci0jaW5jbHVkZSA8YXNtL2tleWxhcmdvLmg+Ci0KLS8qIFdBUk5JTkcgISEhIFRoaXMgd2lsbCBjYXVzZSBjYWxpYnJhdGVfZGVsYXkoKSB0byBiZSBjYWxsZWQsCi0gKiBidXQgdGhpcyBpcyBhbiBfX2luaXQgZnVuY3Rpb24gISBTbyB5b3UgTVVTVCBnbyBlZGl0Ci0gKiBpbml0L21haW4uYyB0byBtYWtlIGl0IG5vbi1pbml0IGJlZm9yZSBlbmFibGluZyBERUJVR19GUkVRCi0gKi8KLSN1bmRlZiBERUJVR19GUkVRCi0KLS8qCi0gKiBUaGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgY29yZSBjcHVmcmVxIGNvZGUgb24gU01QIGtlcm5lbHMsCi0gKiBpdCB3b24ndCByZWNhbGN1bGF0ZSB0aGUgQm9nb21pcHMgcHJvcGVybHkKLSAqLwotI2lmZGVmIENPTkZJR19TTVAKLSN3YXJuaW5nICJXQVJOSU5HLCBDUFVGUkVRIG5vdCByZWNvbW1lbmRlZCBvbiBTTVAga2VybmVscyIKLSNlbmRpZgotCi1leHRlcm4gdm9pZCBsb3dfY2hvb3NlXzc0NDdhX2RmcyhpbnQgZGZzKTsKLWV4dGVybiB2b2lkIGxvd19jaG9vc2VfNzUwZnhfcGxsKGludCBwbGwpOwotZXh0ZXJuIHZvaWQgbG93X3NsZWVwX2hhbmRsZXIodm9pZCk7Ci0KLS8qCi0gKiBDdXJyZW50bHksIFBvd2VyTWFjIGNwdWZyZXEgc3VwcG9ydHMgb25seSBoaWdoICYgbG93IGZyZXF1ZW5jaWVzCi0gKiB0aGF0IGFyZSBzZXQgYnkgdGhlIGZpcm13YXJlCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbG93X2ZyZXE7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGhpX2ZyZXE7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGN1cl9mcmVxOwotc3RhdGljIHVuc2lnbmVkIGludCBzbGVlcF9mcmVxOwotCi0vKgotICogRGlmZmVyZW50IG1vZGVscyB1c2VzIGRpZmZlcmVudCBtZWNhbmlzbXMgdG8gc3dpdGNoIHRoZSBmcmVxdWVuY3kKLSAqLwotc3RhdGljIGludCAoKnNldF9zcGVlZF9wcm9jKShpbnQgbG93X3NwZWVkKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgKCpnZXRfc3BlZWRfcHJvYykodm9pZCk7Ci0KLS8qCi0gKiBTb21lIGRlZmluaXRpb25zIHVzZWQgYnkgdGhlIHZhcmlvdXMgc3BlZWRwcm9jcwotICovCi1zdGF0aWMgdTMyIHZvbHRhZ2VfZ3BpbzsKLXN0YXRpYyB1MzIgZnJlcXVlbmN5X2dwaW87Ci1zdGF0aWMgdTMyIHNsZXdfZG9uZV9ncGlvOwotc3RhdGljIGludCBub19zY2hlZHVsZTsKLXN0YXRpYyBpbnQgaGFzX2NwdV9sMmx2ZTsKLXN0YXRpYyBpbnQgaXNfcG11X2Jhc2VkOwotCi0vKiBUaGVyZSBhcmUgb25seSB0d28gZnJlcXVlbmN5IHN0YXRlcyBmb3IgZWFjaCBwcm9jZXNzb3IuIFZhbHVlcwotICogYXJlIGluIGtIeiBmb3IgdGhlIHRpbWUgYmVpbmcuCi0gKi8KLSNkZWZpbmUgQ1BVRlJFUV9ISUdIICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBDUFVGUkVRX0xPVyAgICAgICAgICAgICAgICAgICAxCi0KLXN0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgcG1hY19jcHVfZnJlcXNbXSA9IHsKLQl7Q1BVRlJFUV9ISUdILCAJCTB9LAotCXtDUFVGUkVRX0xPVywJCTB9LAotCXswLAkJCUNQVUZSRVFfVEFCTEVfRU5EfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyKiBwbWFjX2NwdV9mcmVxc19hdHRyW10gPSB7Ci0JJmNwdWZyZXFfZnJlcV9hdHRyX3NjYWxpbmdfYXZhaWxhYmxlX2ZyZXFzLAotCU5VTEwsCi19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgbG9jYWxfZGVsYXkodW5zaWduZWQgbG9uZyBtcykKLXsKLQlpZiAobm9fc2NoZWR1bGUpCi0JCW1kZWxheShtcyk7Ci0JZWxzZQotCQltc2xlZXAobXMpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgd2FrZXVwX2RlY3JlbWVudGVyKHZvaWQpCi17Ci0Jc2V0X2RlYyh0Yl90aWNrc19wZXJfamlmZnkpOwotCS8qIE5vIGN1cnJlbnRseS1zdXBwb3J0ZWQgcG93ZXJib29rIGhhcyBhIDYwMSwKLQkgKiBzbyB1c2UgZ2V0X3RibCwgbm90IG5hdGl2ZQotCSAqLwotCWxhc3RfamlmZnlfc3RhbXAoMCkgPSB0Yl9sYXN0X3N0YW1wID0gZ2V0X3RibCgpOwotfQotCi0jaWZkZWYgREVCVUdfRlJFUQotc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX2NhbGNfYm9nb21pcHModm9pZCkKLXsKLQkvKiBUaGlzIHdpbGwgY2F1c2UgYSByZWNhbGMgb2YgYm9nb21pcHMgYW5kIGRpc3BsYXkgdGhlCi0JICogcmVzdWx0LiBXZSBiYWNrdXAvcmVzdG9yZSB0aGUgdmFsdWUgdG8gYXZvaWQgYWZmZWN0aW5nIHRoZQotCSAqIGNvcmUgY3B1ZnJlcSBmcmFtZXdvcmsncyBvd24gY2FsY3VsYXRpb24uCi0JICovCi0JZXh0ZXJuIHZvaWQgY2FsaWJyYXRlX2RlbGF5KHZvaWQpOwotCi0JdW5zaWduZWQgbG9uZyBzYXZlX2xwaiA9IGxvb3BzX3Blcl9qaWZmeTsKLQljYWxpYnJhdGVfZGVsYXkoKTsKLQlsb29wc19wZXJfamlmZnkgPSBzYXZlX2xwajsKLX0KLSNlbmRpZiAvKiBERUJVR19GUkVRICovCi0KLS8qIFN3aXRjaCBDUFUgc3BlZWQgdW5kZXIgNzUwRlggQ1BVIGNvbnRyb2wKLSAqLwotc3RhdGljIGludCBjcHVfNzUwZnhfY3B1X3NwZWVkKGludCBsb3dfc3BlZWQpCi17Ci0JdTMyIGhpZDI7Ci0KLQlpZiAobG93X3NwZWVkID09IDApIHsKLQkJLyogcmFtcGluZyB1cCwgc2V0IHZvbHRhZ2UgZmlyc3QgKi8KLQkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfV1JJVEVfR1BJTywgTlVMTCwgdm9sdGFnZV9ncGlvLCAweDA1KTsKLQkJLyogTWFrZSBzdXJlIHdlIHNsZWVwIGZvciBhdCBsZWFzdCAxbXMgKi8KLQkJbG9jYWxfZGVsYXkoMTApOwotCi0JCS8qIHR3ZWFrIEwyIGZvciBoaWdoIHZvbHRhZ2UgKi8KLQkJaWYgKGhhc19jcHVfbDJsdmUpIHsKLQkJCWhpZDIgPSBtZnNwcihTUFJOX0hJRDIpOwotCQkJaGlkMiAmPSB+MHgyMDAwOwotCQkJbXRzcHIoU1BSTl9ISUQyLCBoaWQyKTsKLQkJfQotCX0KLSNpZmRlZiBDT05GSUdfNnh4Ci0JbG93X2Nob29zZV83NTBmeF9wbGwobG93X3NwZWVkKTsKLSNlbmRpZgotCWlmIChsb3dfc3BlZWQgPT0gMSkgewotCQkvKiB0d2VhayBMMiBmb3IgbG93IHZvbHRhZ2UgKi8KLQkJaWYgKGhhc19jcHVfbDJsdmUpIHsKLQkJCWhpZDIgPSBtZnNwcihTUFJOX0hJRDIpOwotCQkJaGlkMiB8PSAweDIwMDA7Ci0JCQltdHNwcihTUFJOX0hJRDIsIGhpZDIpOwotCQl9Ci0KLQkJLyogcmFtcGluZyBkb3duLCBzZXQgdm9sdGFnZSBsYXN0ICovCi0JCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1dSSVRFX0dQSU8sIE5VTEwsIHZvbHRhZ2VfZ3BpbywgMHgwNCk7Ci0JCWxvY2FsX2RlbGF5KDEwKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBjcHVfNzUwZnhfZ2V0X2NwdV9zcGVlZCh2b2lkKQotewotCWlmIChtZnNwcihTUFJOX0hJRDEpICYgSElEMV9QUykKLQkJcmV0dXJuIGxvd19mcmVxOwotCWVsc2UKLQkJcmV0dXJuIGhpX2ZyZXE7Ci19Ci0KLS8qIFN3aXRjaCBDUFUgc3BlZWQgdXNpbmcgREZTICovCi1zdGF0aWMgaW50IGRmc19zZXRfY3B1X3NwZWVkKGludCBsb3dfc3BlZWQpCi17Ci0JaWYgKGxvd19zcGVlZCA9PSAwKSB7Ci0JCS8qIHJhbXBpbmcgdXAsIHNldCB2b2x0YWdlIGZpcnN0ICovCi0JCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1dSSVRFX0dQSU8sIE5VTEwsIHZvbHRhZ2VfZ3BpbywgMHgwNSk7Ci0JCS8qIE1ha2Ugc3VyZSB3ZSBzbGVlcCBmb3IgYXQgbGVhc3QgMW1zICovCi0JCWxvY2FsX2RlbGF5KDEpOwotCX0KLQotCS8qIHNldCBmcmVxdWVuY3kgKi8KLSNpZmRlZiBDT05GSUdfNnh4Ci0JbG93X2Nob29zZV83NDQ3YV9kZnMobG93X3NwZWVkKTsKLSNlbmRpZgotCXVkZWxheSgxMDApOwotCi0JaWYgKGxvd19zcGVlZCA9PSAxKSB7Ci0JCS8qIHJhbXBpbmcgZG93biwgc2V0IHZvbHRhZ2UgbGFzdCAqLwotCQlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9XUklURV9HUElPLCBOVUxMLCB2b2x0YWdlX2dwaW8sIDB4MDQpOwotCQlsb2NhbF9kZWxheSgxKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBkZnNfZ2V0X2NwdV9zcGVlZCh2b2lkKQotewotCWlmIChtZnNwcihTUFJOX0hJRDEpICYgSElEMV9ERlMpCi0JCXJldHVybiBsb3dfZnJlcTsKLQllbHNlCi0JCXJldHVybiBoaV9mcmVxOwotfQotCi0KLS8qIFN3aXRjaCBDUFUgc3BlZWQgdXNpbmcgc2xld2luZyBHUElPcwotICovCi1zdGF0aWMgaW50IGdwaW9zX3NldF9jcHVfc3BlZWQoaW50IGxvd19zcGVlZCkKLXsKLQlpbnQgZ3BpbywgdGltZW91dCA9IDA7Ci0KLQkvKiBJZiByYW1waW5nIHVwLCBzZXQgdm9sdGFnZSBmaXJzdCAqLwotCWlmIChsb3dfc3BlZWQgPT0gMCkgewotCQlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9XUklURV9HUElPLCBOVUxMLCB2b2x0YWdlX2dwaW8sIDB4MDUpOwotCQkvKiBEZWxheSBpcyB3YXkgdG9vIGJpZyBidXQgaXQncyBvaywgd2Ugc2NoZWR1bGUgKi8KLQkJbG9jYWxfZGVsYXkoMTApOwotCX0KLQotCS8qIFNldCBmcmVxdWVuY3kgKi8KLQlncGlvID0gCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1JFQURfR1BJTywgTlVMTCwgZnJlcXVlbmN5X2dwaW8sIDApOwotCWlmIChsb3dfc3BlZWQgPT0gKChncGlvICYgMHgwMSkgPT0gMCkpCi0JCWdvdG8gc2tpcDsKLQotCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1dSSVRFX0dQSU8sIE5VTEwsIGZyZXF1ZW5jeV9ncGlvLAotCQkJICBsb3dfc3BlZWQgPyAweDA0IDogMHgwNSk7Ci0JdWRlbGF5KDIwMCk7Ci0JZG8gewotCQlpZiAoKyt0aW1lb3V0ID4gMTAwKQotCQkJYnJlYWs7Ci0JCWxvY2FsX2RlbGF5KDEpOwotCQlncGlvID0gcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfUkVBRF9HUElPLCBOVUxMLCBzbGV3X2RvbmVfZ3BpbywgMCk7Ci0JfSB3aGlsZSgoZ3BpbyAmIDB4MDIpID09IDApOwotIHNraXA6Ci0JLyogSWYgcmFtcGluZyBkb3duLCBzZXQgdm9sdGFnZSBsYXN0ICovCi0JaWYgKGxvd19zcGVlZCA9PSAxKSB7Ci0JCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1dSSVRFX0dQSU8sIE5VTEwsIHZvbHRhZ2VfZ3BpbywgMHgwNCk7Ci0JCS8qIERlbGF5IGlzIHdheSB0b28gYmlnIGJ1dCBpdCdzIG9rLCB3ZSBzY2hlZHVsZSAqLwotCQlsb2NhbF9kZWxheSgxMCk7Ci0JfQotCi0jaWZkZWYgREVCVUdfRlJFUQotCWRlYnVnX2NhbGNfYm9nb21pcHMoKTsKLSNlbmRpZgotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFN3aXRjaCBDUFUgc3BlZWQgdW5kZXIgUE1VIGNvbnRyb2wKLSAqLwotc3RhdGljIGludCBwbXVfc2V0X2NwdV9zcGVlZChpbnQgbG93X3NwZWVkKQotewotCXN0cnVjdCBhZGJfcmVxdWVzdCByZXE7Ci0JdW5zaWduZWQgbG9uZyBzYXZlX2wyY3I7Ci0JdW5zaWduZWQgbG9uZyBzYXZlX2wzY3I7Ci0JdW5zaWduZWQgaW50IHBpY19wcmlvOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQotI2lmZGVmIERFQlVHX0ZSRVEKLQlwcmludGsoS0VSTl9ERUJVRyAiSElEMSwgYmVmb3JlOiAleFxuIiwgbWZzcHIoU1BSTl9ISUQxKSk7Ci0jZW5kaWYKLQlwbXVfc3VzcGVuZCgpOwotCi0JLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0IHNvdXJjZXMgb24gb3BlbnBpYyAqLwotIAlwaWNfcHJpbyA9IG9wZW5waWNfZ2V0X3ByaW9yaXR5KCk7Ci0Jb3BlbnBpY19zZXRfcHJpb3JpdHkoMHhmKTsKLQotCS8qIE1ha2Ugc3VyZSB0aGUgZGVjcmVtZW50ZXIgd29uJ3QgaW50ZXJydXB0IHVzICovCi0JYXNtIHZvbGF0aWxlKCJtdGRlYyAlMCIgOiA6ICJyIiAoMHg3ZmZmZmZmZikpOwotCS8qIE1ha2Ugc3VyZSBhbnkgcGVuZGluZyBERUMgaW50ZXJydXB0IG9jY3VyaW5nIHdoaWxlIHdlIGRpZAotCSAqIHRoZSBhYm92ZSBkaWRuJ3QgcmUtZW5hYmxlIHRoZSBERUMgKi8KLQltYigpOwotCWFzbSB2b2xhdGlsZSgibXRkZWMgJTAiIDogOiAiciIgKDB4N2ZmZmZmZmYpKTsKLQotCS8qIFdlIGNhbiBub3cgZGlzYWJsZSBNU1JfRUUgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQkvKiBHaXZldXAgdGhlIEZQVSAmIHZlYyAqLwotCWVuYWJsZV9rZXJuZWxfZnAoKTsKLQotI2lmZGVmIENPTkZJR19BTFRJVkVDCi0JaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0FMVElWRUMpKQotCQllbmFibGVfa2VybmVsX2FsdGl2ZWMoKTsKLSNlbmRpZiAvKiBDT05GSUdfQUxUSVZFQyAqLwotCi0JLyogU2F2ZSAmIGRpc2FibGUgTDIgYW5kIEwzIGNhY2hlcyAqLwotCXNhdmVfbDNjciA9IF9nZXRfTDNDUigpOwkvKiAocmV0dXJucyAtMSBpZiBub3QgYXZhaWxhYmxlKSAqLwotCXNhdmVfbDJjciA9IF9nZXRfTDJDUigpOwkvKiAocmV0dXJucyAtMSBpZiBub3QgYXZhaWxhYmxlKSAqLwotCi0JLyogU2VuZCB0aGUgbmV3IHNwZWVkIGNvbW1hbmQuIE15IGFzc3VtcHRpb24gaXMgdGhhdCB0aGlzIGNvbW1hbmQKLQkgKiB3aWxsIGNhdXNlIFBMTF9DRkdbMC4uM10gdG8gYmUgY2hhbmdlZCBuZXh0IHRpbWUgQ1BVIGdvZXMgdG8gc2xlZXAKLQkgKi8KLQlwbXVfcmVxdWVzdCgmcmVxLCBOVUxMLCA2LCBQTVVfQ1BVX1NQRUVELCAnVycsICdPJywgJ08nLCAnRicsIGxvd19zcGVlZCk7Ci0Jd2hpbGUgKCFyZXEuY29tcGxldGUpCi0JCXBtdV9wb2xsKCk7Ci0KLQkvKiBQcmVwYXJlIHRoZSBub3J0aGJyaWRnZSBmb3IgdGhlIHNwZWVkIHRyYW5zaXRpb24gKi8KLQlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9TTEVFUF9TVEFURSxOVUxMLDEsMSk7Ci0KLQkvKiBDYWxsIGxvdyBsZXZlbCBjb2RlIHRvIGJhY2t1cCBDUFUgc3RhdGUgYW5kIHJlY292ZXIgZnJvbQotCSAqIGhhcmR3YXJlIHJlc2V0Ci0JICovCi0JbG93X3NsZWVwX2hhbmRsZXIoKTsKLQotCS8qIFJlc3RvcmUgdGhlIG5vcnRoYnJpZGdlICovCi0JcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfU0xFRVBfU1RBVEUsTlVMTCwxLDApOwotCi0JLyogUmVzdG9yZSBMMiBjYWNoZSAqLwotCWlmIChzYXZlX2wyY3IgIT0gMHhmZmZmZmZmZiAmJiAoc2F2ZV9sMmNyICYgTDJDUl9MMkUpICE9IDApCi0gCQlfc2V0X0wyQ1Ioc2F2ZV9sMmNyKTsKLQkvKiBSZXN0b3JlIEwzIGNhY2hlICovCi0JaWYgKHNhdmVfbDNjciAhPSAweGZmZmZmZmZmICYmIChzYXZlX2wzY3IgJiBMM0NSX0wzRSkgIT0gMCkKLSAJCV9zZXRfTDNDUihzYXZlX2wzY3IpOwotCi0JLyogUmVzdG9yZSB1c2VybGFuZCBNTVUgY29udGV4dCAqLwotCXNldF9jb250ZXh0KGN1cnJlbnQtPmFjdGl2ZV9tbS0+Y29udGV4dCwgY3VycmVudC0+YWN0aXZlX21tLT5wZ2QpOwotCi0jaWZkZWYgREVCVUdfRlJFUQotCXByaW50ayhLRVJOX0RFQlVHICJISUQxLCBhZnRlcjogJXhcbiIsIG1mc3ByKFNQUk5fSElEMSkpOwotI2VuZGlmCi0KLQkvKiBSZXN0b3JlIGxvdyBsZXZlbCBQTVUgb3BlcmF0aW9ucyAqLwotCXBtdV91bmxvY2soKTsKLQotCS8qIFJlc3RvcmUgZGVjcmVtZW50ZXIgKi8KLQl3YWtldXBfZGVjcmVtZW50ZXIoKTsKLQotCS8qIFJlc3RvcmUgaW50ZXJydXB0cyAqLwotIAlvcGVucGljX3NldF9wcmlvcml0eShwaWNfcHJpbyk7Ci0KLQkvKiBMZXQgaW50ZXJydXB0cyBmbG93IGFnYWluIC4uLiAqLwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotI2lmZGVmIERFQlVHX0ZSRVEKLQlkZWJ1Z19jYWxjX2JvZ29taXBzKCk7Ci0jZW5kaWYKLQotCXBtdV9yZXN1bWUoKTsKLQotCXByZWVtcHRfZW5hYmxlKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkb19zZXRfY3B1X3NwZWVkKGludCBzcGVlZF9tb2RlLCBpbnQgbm90aWZ5KQotewotCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOwotCXVuc2lnbmVkIGxvbmcgbDNjcjsKLQlzdGF0aWMgdW5zaWduZWQgbG9uZyBwcmV2X2wzY3I7Ci0KLQlmcmVxcy5vbGQgPSBjdXJfZnJlcTsKLQlmcmVxcy5uZXcgPSAoc3BlZWRfbW9kZSA9PSBDUFVGUkVRX0hJR0gpID8gaGlfZnJlcSA6IGxvd19mcmVxOwotCWZyZXFzLmNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQotCWlmIChmcmVxcy5vbGQgPT0gZnJlcXMubmV3KQotCQlyZXR1cm4gMDsKLQotCWlmIChub3RpZnkpCi0JCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7Ci0JaWYgKHNwZWVkX21vZGUgPT0gQ1BVRlJFUV9MT1cgJiYKLQkgICAgY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfTDNDUikpIHsKLQkJbDNjciA9IF9nZXRfTDNDUigpOwotCQlpZiAobDNjciAmIEwzQ1JfTDNFKSB7Ci0JCQlwcmV2X2wzY3IgPSBsM2NyOwotCQkJX3NldF9MM0NSKDApOwotCQl9Ci0JfQotCXNldF9zcGVlZF9wcm9jKHNwZWVkX21vZGUgPT0gQ1BVRlJFUV9MT1cpOwotCWlmIChzcGVlZF9tb2RlID09IENQVUZSRVFfSElHSCAmJgotCSAgICBjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9MM0NSKSkgewotCQlsM2NyID0gX2dldF9MM0NSKCk7Ci0JCWlmICgocHJldl9sM2NyICYgTDNDUl9MM0UpICYmIGwzY3IgIT0gcHJldl9sM2NyKQotCQkJX3NldF9MM0NSKHByZXZfbDNjcik7Ci0JfQotCWlmIChub3RpZnkpCi0JCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOwotCWN1cl9mcmVxID0gKHNwZWVkX21vZGUgPT0gQ1BVRlJFUV9ISUdIKSA/IGhpX2ZyZXEgOiBsb3dfZnJlcTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHBtYWNfY3B1ZnJlcV9nZXRfc3BlZWQodW5zaWduZWQgaW50IGNwdSkKLXsKLQlyZXR1cm4gY3VyX2ZyZXE7Ci19Ci0KLXN0YXRpYyBpbnQgcG1hY19jcHVmcmVxX3ZlcmlmeShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKLXsKLQlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdmVyaWZ5KHBvbGljeSwgcG1hY19jcHVfZnJlcXMpOwotfQotCi1zdGF0aWMgaW50IHBtYWNfY3B1ZnJlcV90YXJnZXQoCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAotCQkJCQl1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZyZXEsCi0JCQkJCXVuc2lnbmVkIGludCByZWxhdGlvbikKLXsKLQl1bnNpZ25lZCBpbnQgICAgbmV3c3RhdGUgPSAwOwotCi0JaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksIHBtYWNfY3B1X2ZyZXFzLAotCQkJdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uLCAmbmV3c3RhdGUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiBkb19zZXRfY3B1X3NwZWVkKG5ld3N0YXRlLCAxKTsKLX0KLQotdW5zaWduZWQgaW50IHBtYWNfZ2V0X29uZV9jcHVmcmVxKGludCBpKQotewotCS8qIFN1cHBvcnRzIG9ubHkgb25lIENQVSBmb3Igbm93ICovCi0JcmV0dXJuIChpID09IDApID8gY3VyX2ZyZXEgOiAwOwotfQotCi1zdGF0aWMgaW50IHBtYWNfY3B1ZnJlcV9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKLXsKLQlpZiAocG9saWN5LT5jcHUgIT0gMCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOwotCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kJPSBDUFVGUkVRX0VURVJOQUw7Ci0JcG9saWN5LT5jdXIgPSBjdXJfZnJlcTsKLQotCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKHBtYWNfY3B1X2ZyZXFzLCBwb2xpY3ktPmNwdSk7Ci0JcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBwbWFjX2NwdV9mcmVxcyk7Ci19Ci0KLXN0YXRpYyB1MzIgcmVhZF9ncGlvKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCi17Ci0JdTMyICpyZWcgPSAodTMyICopZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgTlVMTCk7Ci0JdTMyIG9mZnNldDsKLQotCWlmIChyZWcgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JLyogVGhhdCB3b3JrcyBmb3IgYWxsIGtleWxhcmdvcyBidXQgc2hhbGwgYmUgZml4ZWQgcHJvcGVybHkKLQkgKiBzb21lIGRheS4uLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGl0IHNlZW1zIHdlIGNhbid0IHJlbHkKLQkgKiBvbiB0aGUgInJlZyIgcHJvcGVydHkgb2YgdGhlIEdQSU8gbm9kZXMsIHRoZXkgYXJlIGVpdGhlcgotCSAqIHJlbGF0aXZlIHRvIHRoZSBiYXNlIG9mIEtleUxhcmdvIG9yIHRvIHRoZSBiYXNlIG9mIHRoZQotCSAqIEdQSU8gc3BhY2UsIGFuZCB0aGUgZGV2aWNlLXRyZWUgZG9lc24ndCBoZWxwLgotCSAqLwotCW9mZnNldCA9ICpyZWc7Ci0JaWYgKG9mZnNldCA8IEtFWUxBUkdPX0dQSU9fTEVWRUxTMCkKLQkJb2Zmc2V0ICs9IEtFWUxBUkdPX0dQSU9fTEVWRUxTMDsKLQlyZXR1cm4gb2Zmc2V0OwotfQotCi1zdGF0aWMgaW50IHBtYWNfY3B1ZnJlcV9zdXNwZW5kKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LCBwbV9tZXNzYWdlX3QgcG1zZykKLXsKLQkvKiBPaywgdGhpcyBjb3VsZCBiZSBtYWRlIGEgYml0IHNtYXJ0ZXIsIGJ1dCBsZXQncyBiZSByb2J1c3QgZm9yIG5vdy4gV2UKLQkgKiBhbHdheXMgZm9yY2UgYSBzcGVlZCBjaGFuZ2UgdG8gaGlnaCBzcGVlZCBiZWZvcmUgc2xlZXAsIHRvIG1ha2Ugc3VyZQotCSAqIHdlIGhhdmUgYXBwcm9wcmlhdGUgdm9sdGFnZSBhbmQvb3IgYnVzIHNwZWVkIGZvciB0aGUgd2FrZXVwIHByb2Nlc3MsCi0JICogYW5kIHRvIG1ha2Ugc3VyZSBvdXIgbG9vcHNfcGVyX2ppZmZpZXMgYXJlICJnb29kIGVub3VnaCIsIHRoYXQgaXMgd2lsbAotCSAqIG5vdCBjYXVzZSB0b28gc2hvcnQgZGVsYXlzIGlmIHdlIHNsZWVwIGluIGxvdyBzcGVlZCBhbmQgd2FrZSBpbiBoaWdoCi0JICogc3BlZWQuLgotCSAqLwotCW5vX3NjaGVkdWxlID0gMTsKLQlzbGVlcF9mcmVxID0gY3VyX2ZyZXE7Ci0JaWYgKGN1cl9mcmVxID09IGxvd19mcmVxICYmICFpc19wbXVfYmFzZWQpCi0JCWRvX3NldF9jcHVfc3BlZWQoQ1BVRlJFUV9ISUdILCAwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwbWFjX2NwdWZyZXFfcmVzdW1lKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQotewotCS8qIElmIHdlIHJlc3VtZSwgZmlyc3QgY2hlY2sgaWYgd2UgaGF2ZSBhIGdldCgpIGZ1bmN0aW9uICovCi0JaWYgKGdldF9zcGVlZF9wcm9jKQotCQljdXJfZnJlcSA9IGdldF9zcGVlZF9wcm9jKCk7Ci0JZWxzZQotCQljdXJfZnJlcSA9IDA7Ci0KLQkvKiBXZSBkb24ndCwgaHJtLi4uIHdlIGRvbid0IHJlYWxseSBrbm93IG91ciBzcGVlZCBoZXJlLCBiZXN0Ci0JICogaXMgdGhhdCB3ZSBmb3JjZSBhIHN3aXRjaCB0byB3aGF0ZXZlciBpdCB3YXMsIHdoaWNoIGlzCi0JICogcHJvYmFibHkgaGlnaCBzcGVlZCBkdWUgdG8gb3VyIHN1c3BlbmQoKSByb3V0aW5lCi0JICovCi0JZG9fc2V0X2NwdV9zcGVlZChzbGVlcF9mcmVxID09IGxvd19mcmVxID8KLQkJCSBDUFVGUkVRX0xPVyA6IENQVUZSRVFfSElHSCwgMCk7Ci0KLQlub19zY2hlZHVsZSA9IDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgcG1hY19jcHVmcmVxX2RyaXZlciA9IHsKLQkudmVyaWZ5IAk9IHBtYWNfY3B1ZnJlcV92ZXJpZnksCi0JLnRhcmdldCAJPSBwbWFjX2NwdWZyZXFfdGFyZ2V0LAotCS5nZXQJCT0gcG1hY19jcHVmcmVxX2dldF9zcGVlZCwKLQkuaW5pdAkJPSBwbWFjX2NwdWZyZXFfY3B1X2luaXQsCi0JLnN1c3BlbmQJPSBwbWFjX2NwdWZyZXFfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHBtYWNfY3B1ZnJlcV9yZXN1bWUsCi0JLmZsYWdzCQk9IENQVUZSRVFfUE1fTk9fV0FSTiwKLQkuYXR0cgkJPSBwbWFjX2NwdV9mcmVxc19hdHRyLAotCS5uYW1lCQk9ICJwb3dlcm1hYyIsCi0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotfTsKLQotCi1zdGF0aWMgaW50IHBtYWNfY3B1ZnJlcV9pbml0X01hY1JJU0MzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1bm9kZSkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnZvbHRfZ3Bpb19ucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsCi0JCQkJCQkJCSJ2b2x0YWdlLWdwaW8iKTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmZyZXFfZ3Bpb19ucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsCi0JCQkJCQkJCSJmcmVxdWVuY3ktZ3BpbyIpOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc2xld19kb25lX2dwaW9fbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLAotCQkJCQkJCQkgICAgICJzbGV3aW5nLWRvbmUiKTsKLQl1MzIgKnZhbHVlOwotCi0JLyoKLQkgKiBDaGVjayB0byBzZWUgaWYgaXQncyBHUElPIGRyaXZlbiBvciBQTVUgb25seQotCSAqCi0JICogVGhlIHdheSB3ZSBleHRyYWN0IHRoZSBHUElPIGFkZHJlc3MgaXMgc2xpZ2h0bHkgaGFja2lzaCwgYnV0IGl0Ci0JICogd29ya3Mgd2VsbCBlbm91Z2ggZm9yIG5vdy4gV2UgbmVlZCB0byBhYnN0cmFjdCB0aGUgd2hvbGUgR1BJTwotCSAqIHN0dWZmIHNvb25lciBvciBsYXRlciBhbnl3YXkKLQkgKi8KLQotCWlmICh2b2x0X2dwaW9fbnApCi0JCXZvbHRhZ2VfZ3BpbyA9IHJlYWRfZ3Bpbyh2b2x0X2dwaW9fbnApOwotCWlmIChmcmVxX2dwaW9fbnApCi0JCWZyZXF1ZW5jeV9ncGlvID0gcmVhZF9ncGlvKGZyZXFfZ3Bpb19ucCk7Ci0JaWYgKHNsZXdfZG9uZV9ncGlvX25wKQotCQlzbGV3X2RvbmVfZ3BpbyA9IHJlYWRfZ3BpbyhzbGV3X2RvbmVfZ3Bpb19ucCk7Ci0KLQkvKiBJZiB3ZSB1c2UgdGhlIGZyZXF1ZW5jeSBHUElPcywgY2FsY3VsYXRlIHRoZSBtaW4vbWF4IHNwZWVkcyBiYXNlZAotCSAqIG9uIHRoZSBidXMgZnJlcXVlbmNpZXMKLQkgKi8KLQlpZiAoZnJlcXVlbmN5X2dwaW8gJiYgc2xld19kb25lX2dwaW8pIHsKLQkJaW50IGxlbnAsIHJjOwotCQl1MzIgKmZyZXFzLCAqcmF0aW87Ci0KLQkJZnJlcXMgPSAodTMyICopZ2V0X3Byb3BlcnR5KGNwdW5vZGUsICJidXMtZnJlcXVlbmNpZXMiLCAmbGVucCk7Ci0JCWxlbnAgLz0gc2l6ZW9mKHUzMik7Ci0JCWlmIChmcmVxcyA9PSBOVUxMIHx8IGxlbnAgIT0gMikgewotCQkJcHJpbnRrKEtFUk5fRVJSICJjcHVmcmVxOiBidXMtZnJlcXVlbmNpZXMgaW5jb3JyZWN0IG9yIG1pc3NpbmdcbiIpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJcmF0aW8gPSAodTMyICopZ2V0X3Byb3BlcnR5KGNwdW5vZGUsICJwcm9jZXNzb3ItdG8tYnVzLXJhdGlvKjIiLCBOVUxMKTsKLQkJaWYgKHJhdGlvID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiY3B1ZnJlcTogcHJvY2Vzc29yLXRvLWJ1cy1yYXRpbyoyIG1pc3NpbmdcbiIpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQotCQkvKiBHZXQgdGhlIG1pbi9tYXggYnVzIGZyZXF1ZW5jaWVzICovCi0JCWxvd19mcmVxID0gbWluKGZyZXFzWzBdLCBmcmVxc1sxXSk7Ci0JCWhpX2ZyZXEgPSBtYXgoZnJlcXNbMF0sIGZyZXFzWzFdKTsKLQotCQkvKiBHcnJyci4uIEl0IF9zZWVtc18gdGhhdCB0aGUgZGV2aWNlLXRyZWUgaXMgbHlpbmcgb24gdGhlIGxvdyBidXMKLQkJICogZnJlcXVlbmN5LCBpdCBjbGFpbXMgaXQgdG8gYmUgYXJvdW5kIDg0TWh6IG9uIHNvbWUgbW9kZWxzIHdoaWxlCi0JCSAqIGl0IGFwcGVhcnMgdG8gYmUgYXBwcm94LiAxMDFNaHogb24gYWxsLiBMZXQncyBoYWNrIGFyb3VuZCBoZXJlLi4uCi0JCSAqIGZvcnR1bmF0ZWx5LCB3ZSBkb24ndCBuZWVkIHRvIGJlIHRvbyBwcmVjaXNlCi0JCSAqLwotCQlpZiAobG93X2ZyZXEgPCA5ODAwMDAwMCkKLQkJCWxvd19mcmVxID0gMTAxMDAwMDAwOwotCQkJCi0JCS8qIENvbnZlcnQgdGhvc2UgdG8gQ1BVIGNvcmUgY2xvY2tzICovCi0JCWxvd19mcmVxID0gKGxvd19mcmVxICogKCpyYXRpbykpIC8gMjAwMDsKLQkJaGlfZnJlcSA9IChoaV9mcmVxICogKCpyYXRpbykpIC8gMjAwMDsKLQotCQkvKiBOb3cgd2UgZ2V0IHRoZSBmcmVxdWVuY2llcywgd2UgcmVhZCB0aGUgR1BJTyB0byBzZWUgd2hhdCBpcyBvdXQgY3VycmVudAotCQkgKiBzcGVlZAotCQkgKi8KLQkJcmMgPSBwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9SRUFEX0dQSU8sIE5VTEwsIGZyZXF1ZW5jeV9ncGlvLCAwKTsKLQkJY3VyX2ZyZXEgPSAocmMgJiAweDAxKSA/IGhpX2ZyZXEgOiBsb3dfZnJlcTsKLQotCQlzZXRfc3BlZWRfcHJvYyA9IGdwaW9zX3NldF9jcHVfc3BlZWQ7Ci0JCXJldHVybiAxOwotCX0KLQotCS8qIElmIHdlIHVzZSB0aGUgUE1VLCBsb29rIGZvciB0aGUgbWluICYgbWF4IGZyZXF1ZW5jaWVzIGluIHRoZQotCSAqIGRldmljZS10cmVlCi0JICovCi0JdmFsdWUgPSAodTMyICopZ2V0X3Byb3BlcnR5KGNwdW5vZGUsICJtaW4tY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7Ci0JaWYgKCF2YWx1ZSkKLQkJcmV0dXJuIDE7Ci0JbG93X2ZyZXEgPSAoKnZhbHVlKSAvIDEwMDA7Ci0JLyogVGhlIFBvd2VyQm9vayBHNCAxMiIgKFBvd2VyQm9vazYsMSkgaGFzIGFuIGVycm9yIGluIHRoZSBkZXZpY2UtdHJlZQotCSAqIGhlcmUgKi8KLQlpZiAobG93X2ZyZXEgPCAxMDAwMDApCi0JCWxvd19mcmVxICo9IDEwOwotCi0JdmFsdWUgPSAodTMyICopZ2V0X3Byb3BlcnR5KGNwdW5vZGUsICJtYXgtY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7Ci0JaWYgKCF2YWx1ZSkKLQkJcmV0dXJuIDE7Ci0JaGlfZnJlcSA9ICgqdmFsdWUpIC8gMTAwMDsKLQlzZXRfc3BlZWRfcHJvYyA9IHBtdV9zZXRfY3B1X3NwZWVkOwotCWlzX3BtdV9iYXNlZCA9IDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwbWFjX2NwdWZyZXFfaW5pdF83NDQ3QShzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdW5vZGUpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICp2b2x0X2dwaW9fbnA7Ci0KLQlpZiAoZ2V0X3Byb3BlcnR5KGNwdW5vZGUsICJkeW5hbWljLXBvd2VyLXN0ZXAiLCBOVUxMKSA9PSBOVUxMKQotCQlyZXR1cm4gMTsKLQotCXZvbHRfZ3Bpb19ucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJjcHUtdmNvcmUtc2VsZWN0Iik7Ci0JaWYgKHZvbHRfZ3Bpb19ucCkKLQkJdm9sdGFnZV9ncGlvID0gcmVhZF9ncGlvKHZvbHRfZ3Bpb19ucCk7Ci0JaWYgKCF2b2x0YWdlX2dwaW8pewotCQlwcmludGsoS0VSTl9FUlIgImNwdWZyZXE6IG1pc3NpbmcgY3B1LXZjb3JlLXNlbGVjdCBncGlvXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyogT0Ygb25seSByZXBvcnRzIHRoZSBoaWdoIGZyZXF1ZW5jeSAqLwotCWhpX2ZyZXEgPSBjdXJfZnJlcTsKLQlsb3dfZnJlcSA9IGN1cl9mcmVxLzI7Ci0KLQkvKiBSZWFkIGFjdHVhbCBmcmVxdWVuY3kgZnJvbSBDUFUgKi8KLQljdXJfZnJlcSA9IGRmc19nZXRfY3B1X3NwZWVkKCk7Ci0Jc2V0X3NwZWVkX3Byb2MgPSBkZnNfc2V0X2NwdV9zcGVlZDsKLQlnZXRfc3BlZWRfcHJvYyA9IGRmc19nZXRfY3B1X3NwZWVkOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcG1hY19jcHVmcmVxX2luaXRfNzUwRlgoc3RydWN0IGRldmljZV9ub2RlICpjcHVub2RlKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqdm9sdF9ncGlvX25wOwotCXUzMiBwdnIsICp2YWx1ZTsKLQotCWlmIChnZXRfcHJvcGVydHkoY3B1bm9kZSwgImR5bmFtaWMtcG93ZXItc3RlcCIsIE5VTEwpID09IE5VTEwpCi0JCXJldHVybiAxOwotCi0JaGlfZnJlcSA9IGN1cl9mcmVxOwotCXZhbHVlID0gKHUzMiAqKWdldF9wcm9wZXJ0eShjcHVub2RlLCAicmVkdWNlZC1jbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKLQlpZiAoIXZhbHVlKQotCQlyZXR1cm4gMTsKLQlsb3dfZnJlcSA9ICgqdmFsdWUpIC8gMTAwMDsKLQotCXZvbHRfZ3Bpb19ucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJjcHUtdmNvcmUtc2VsZWN0Iik7Ci0JaWYgKHZvbHRfZ3Bpb19ucCkKLQkJdm9sdGFnZV9ncGlvID0gcmVhZF9ncGlvKHZvbHRfZ3Bpb19ucCk7Ci0KLQlwdnIgPSBtZnNwcihTUFJOX1BWUik7Ci0JaGFzX2NwdV9sMmx2ZSA9ICEoKHB2ciAmIDB4ZjAwKSA9PSAweDEwMCk7Ci0KLQlzZXRfc3BlZWRfcHJvYyA9IGNwdV83NTBmeF9jcHVfc3BlZWQ7Ci0JZ2V0X3NwZWVkX3Byb2MgPSBjcHVfNzUwZnhfZ2V0X2NwdV9zcGVlZDsKLQljdXJfZnJlcSA9IGNwdV83NTBmeF9nZXRfY3B1X3NwZWVkKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogQ3VycmVudGx5LCB3ZSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgbWFjaGluZXM6Ci0gKgotICogIC0gVGl0YW5pdW0gUG93ZXJCb29rIDFHaHogKFBNVSBiYXNlZCwgNjY3TWh6ICYgMUdoeikKLSAqICAtIFRpdGFuaXVtIFBvd2VyQm9vayA4MDAgKFBNVSBiYXNlZCwgNjY3TWh6ICYgODAwTWh6KQotICogIC0gVGl0YW5pdW0gUG93ZXJCb29rIDQwMCAoUE1VIGJhc2VkLCAzMDBNaHogJiA0MDBNaHopCi0gKiAgLSBUaXRhbml1bSBQb3dlckJvb2sgNTAwIChQTVUgYmFzZWQsIDMwME1oeiAmIDUwME1oeikKLSAqICAtIGlCb29rMiA1MDAvNjAwIChQTVUgYmFzZWQsIDQwME1oeiAmIDUwMC82MDBNaHopCi0gKiAgLSBpQm9vazIgNzAwIChDUFUgYmFzZWQsIDQwME1oeiAmIDcwME1oeiwgc3VwcG9ydCBsb3cgdm9sdGFnZSkKLSAqICAtIFJlY2VudCBNYWNSSVNDMyBsYXB0b3BzCi0gKiAgLSBBbGwgbmV3IG1hY2hpbmVzIHdpdGggNzQ0N0EgQ1BVcwotICovCi1zdGF0aWMgaW50IF9faW5pdCBwbWFjX2NwdWZyZXFfc2V0dXAodm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUJKmNwdW5vZGU7Ci0JdTMyCQkJKnZhbHVlOwotCi0JaWYgKHN0cnN0cihjbWRfbGluZSwgIm5vY3B1ZnJlcSIpKQotCQlyZXR1cm4gMDsKLQotCS8qIEFzc3VtZSBvbmx5IG9uZSBDUFUgKi8KLQljcHVub2RlID0gZmluZF90eXBlX2RldmljZXMoImNwdSIpOwotCWlmICghY3B1bm9kZSkKLQkJZ290byBvdXQ7Ci0KLQkvKiBHZXQgY3VycmVudCBjcHUgY2xvY2sgZnJlcSAqLwotCXZhbHVlID0gKHUzMiAqKWdldF9wcm9wZXJ0eShjcHVub2RlLCAiY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7Ci0JaWYgKCF2YWx1ZSkKLQkJZ290byBvdXQ7Ci0JY3VyX2ZyZXEgPSAoKnZhbHVlKSAvIDEwMDA7Ci0KLQkvKiAgQ2hlY2sgZm9yIDc0NDdBIGJhc2VkIE1hY1JJU0MzICovCi0JaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiTWFjUklTQzMiKSAmJgotCSAgICBnZXRfcHJvcGVydHkoY3B1bm9kZSwgImR5bmFtaWMtcG93ZXItc3RlcCIsIE5VTEwpICYmCi0JICAgIFBWUl9WRVIobWZzcHIoU1BSTl9QVlIpKSA9PSAweDgwMDMpIHsKLQkJcG1hY19jcHVmcmVxX2luaXRfNzQ0N0EoY3B1bm9kZSk7Ci0JLyogQ2hlY2sgZm9yIG90aGVyIE1hY1JJU0MzIG1hY2hpbmVzICovCi0JfSBlbHNlIGlmIChtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyQm9vazMsNCIpIHx8Ci0JCSAgIG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rMyw1IikgfHwKLQkJICAgbWFjaGluZV9pc19jb21wYXRpYmxlKCJNYWNSSVNDMyIpKSB7Ci0JCXBtYWNfY3B1ZnJlcV9pbml0X01hY1JJU0MzKGNwdW5vZGUpOwotCS8qIEVsc2UgY2hlY2sgZm9yIGlCb29rMiA1MDAvNjAwICovCi0JfSBlbHNlIGlmIChtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyQm9vazQsMSIpKSB7Ci0JCWhpX2ZyZXEgPSBjdXJfZnJlcTsKLQkJbG93X2ZyZXEgPSA0MDAwMDA7Ci0JCXNldF9zcGVlZF9wcm9jID0gcG11X3NldF9jcHVfc3BlZWQ7Ci0JCWlzX3BtdV9iYXNlZCA9IDE7Ci0JfQotCS8qIEVsc2UgY2hlY2sgZm9yIFRpUGIgNTUwICovCi0JZWxzZSBpZiAobWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlckJvb2szLDMiKSAmJiBjdXJfZnJlcSA9PSA1NTAwMDApIHsKLQkJaGlfZnJlcSA9IGN1cl9mcmVxOwotCQlsb3dfZnJlcSA9IDUwMDAwMDsKLQkJc2V0X3NwZWVkX3Byb2MgPSBwbXVfc2V0X2NwdV9zcGVlZDsKLQkJaXNfcG11X2Jhc2VkID0gMTsKLQl9Ci0JLyogRWxzZSBjaGVjayBmb3IgVGlQYiA0MDAgJiA1MDAgKi8KLQllbHNlIGlmIChtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyQm9vazMsMiIpKSB7Ci0JCS8qIFdlIG9ubHkga25vdyBhYm91dCB0aGUgNDAwIE1IeiBhbmQgdGhlIDUwME1oeiBtb2RlbAotCQkgKiB0aGV5IGJvdGggaGF2ZSAzMDAgTUh6IGFzIGxvdyBmcmVxdWVuY3kKLQkJICovCi0JCWlmIChjdXJfZnJlcSA8IDM1MDAwMCB8fCBjdXJfZnJlcSA+IDU1MDAwMCkKLQkJCWdvdG8gb3V0OwotCQloaV9mcmVxID0gY3VyX2ZyZXE7Ci0JCWxvd19mcmVxID0gMzAwMDAwOwotCQlzZXRfc3BlZWRfcHJvYyA9IHBtdV9zZXRfY3B1X3NwZWVkOwotCQlpc19wbXVfYmFzZWQgPSAxOwotCX0KLQkvKiBFbHNlIGNoZWNrIGZvciA3NTBGWCAqLwotCWVsc2UgaWYgKFBWUl9WRVIobWZzcHIoU1BSTl9QVlIpKSA9PSAweDcwMDApCi0JCXBtYWNfY3B1ZnJlcV9pbml0Xzc1MEZYKGNwdW5vZGUpOwotb3V0OgotCWlmIChzZXRfc3BlZWRfcHJvYyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXBtYWNfY3B1X2ZyZXFzW0NQVUZSRVFfTE9XXS5mcmVxdWVuY3kgPSBsb3dfZnJlcTsKLQlwbWFjX2NwdV9mcmVxc1tDUFVGUkVRX0hJR0hdLmZyZXF1ZW5jeSA9IGhpX2ZyZXE7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJSZWdpc3RlcmluZyBQb3dlck1hYyBDUFUgZnJlcXVlbmN5IGRyaXZlclxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiTG93OiAlZCBNaHosIEhpZ2g6ICVkIE1oeiwgQm9vdDogJWQgTWh6XG4iLAotCSAgICAgICBsb3dfZnJlcS8xMDAwLCBoaV9mcmVxLzEwMDAsIGN1cl9mcmVxLzEwMDApOwotCi0JcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZwbWFjX2NwdWZyZXFfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQocG1hY19jcHVmcmVxX3NldHVwKTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfZmVhdHVyZS5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfZmVhdHVyZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjdiM2ExLi4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX2ZlYXR1cmUuYworKysgL2Rldi9udWxsCkBAIC0xLDMwMjMgKzAsMCBAQAotLyoKLSAqICBhcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19mZWF0dXJlLmMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDEgUGF1bCBNYWNrZXJyYXMgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQotICogICAgICAgICAgICAgICAgICAgICAgICAgIEJlbi4gSGVycmVuc2NobWlkdCAoYmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnKQotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUT0RPOgotICoKLSAqICAgLSBSZXBsYWNlIG1kZWxheSB3aXRoIHNvbWUgc2NoZWR1bGUgbG9vcCBpZiBwb3NzaWJsZQotICogICAtIFNob3J0ZW4gc29tZSBvYmZ1c2NhdGVkIGRlbGF5cyBvbiBzb21lIHJvdXRpbmVzIChsaWtlIG1vZGVtCi0gKiAgICAgcG93ZXIpCi0gKiAgIC0gUmVmY291bnQgc29tZSBjbG9ja3MgKHNlZSBkYXJ3aW4pCi0gKiAgIC0gU3BsaXQgc3BsaXQgc3BsaXQuLi4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9hZGIuaD4KLSNpbmNsdWRlIDxsaW51eC9wbXUuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KLSNpbmNsdWRlIDxhc20vZXJybm8uaD4KLSNpbmNsdWRlIDxhc20vb2hhcmUuaD4KLSNpbmNsdWRlIDxhc20vaGVhdGhyb3cuaD4KLSNpbmNsdWRlIDxhc20va2V5bGFyZ28uaD4KLSNpbmNsdWRlIDxhc20vdW5pbm9ydGguaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgotI2luY2x1ZGUgPGFzbS9kYmRtYS5oPgotI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+Ci0jaW5jbHVkZSA8YXNtL3BtYWNfbG93X2kyYy5oPgotCi0jdW5kZWYgREVCVUdfRkVBVFVSRQotCi0jaWZkZWYgREVCVUdfRkVBVFVSRQotI2RlZmluZSBEQkcoZm10LC4uLikgcHJpbnRrKEtFUk5fREVCVUcgZm10KQotI2Vsc2UKLSNkZWZpbmUgREJHKGZtdCwuLi4pCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR182eHgKLWV4dGVybiBpbnQgcG93ZXJzYXZlX2xvd3NwZWVkOwotI2VuZGlmCi0KLWV4dGVybiBpbnQgcG93ZXJzYXZlX25hcDsKLWV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKmsyX3NraXBsaXN0WzJdOwotCi0KLS8qCi0gKiBXZSB1c2UgYSBzaW5nbGUgZ2xvYmFsIGxvY2sgdG8gcHJvdGVjdCBhY2Nlc3Nlcy4gRWFjaCBkcml2ZXIgaGFzCi0gKiB0byB0YWtlIGNhcmUgb2YgaXRzIG93biBsb2NraW5nCi0gKi8KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZmVhdHVyZV9sb2NrKTsKLQotI2RlZmluZSBMT0NLKGZsYWdzKQlzcGluX2xvY2tfaXJxc2F2ZSgmZmVhdHVyZV9sb2NrLCBmbGFncyk7Ci0jZGVmaW5lIFVOTE9DSyhmbGFncykJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmVhdHVyZV9sb2NrLCBmbGFncyk7Ci0KLQotLyoKLSAqIEluc3RhbmNlIG9mIHNvbWUgbWFjaW8gc3R1ZmZzCi0gKi8KLXN0cnVjdCBtYWNpb19jaGlwIG1hY2lvX2NoaXBzW01BWF9NQUNJT19DSElQU107Ci0KLXN0cnVjdCBtYWNpb19jaGlwKiBtYWNpb19maW5kKHN0cnVjdCBkZXZpY2Vfbm9kZSogY2hpbGQsIGludCB0eXBlKQotewotCXdoaWxlKGNoaWxkKSB7Ci0JCWludAlpOwotCi0JCWZvciAoaT0wOyBpIDwgTUFYX01BQ0lPX0NISVBTICYmIG1hY2lvX2NoaXBzW2ldLm9mX25vZGU7IGkrKykKLQkJCWlmIChjaGlsZCA9PSBtYWNpb19jaGlwc1tpXS5vZl9ub2RlICYmCi0JCQkgICAgKCF0eXBlIHx8IG1hY2lvX2NoaXBzW2ldLnR5cGUgPT0gdHlwZSkpCi0JCQkJcmV0dXJuICZtYWNpb19jaGlwc1tpXTsKLQkJY2hpbGQgPSBjaGlsZC0+cGFyZW50OwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG1hY2lvX2ZpbmQpOwotCi1zdGF0aWMgY29uc3QgY2hhciogbWFjaW9fbmFtZXNbXSA9Ci17Ci0JIlVua25vd24iLAotCSJHcmFuZCBDZW50cmFsIiwKLQkiT0hhcmUiLAotCSJPSGFyZUlJIiwKLQkiSGVhdGhyb3ciLAotCSJHYXR3aWNrIiwKLQkiUGFkZGluZ3RvbiIsCi0JIktleWxhcmdvIiwKLQkiUGFuZ2VhIiwKLQkiSW50cmVwaWQiLAotCSJLMiIKLX07Ci0KLQotCi0vKgotICogVW5pbm9ydGggcmVnLiBhY2Nlc3MuIE5vdGUgdGhhdCBVbmktTiByZWdzIGFyZSBiaWcgZW5kaWFuCi0gKi8KLQotI2RlZmluZSBVTl9SRUcocikJKHVuaW5vcnRoX2Jhc2UgKyAoKHIpID4+IDIpKQotI2RlZmluZSBVTl9JTihyKQkoaW5fYmUzMihVTl9SRUcocikpKQotI2RlZmluZSBVTl9PVVQocix2KQkob3V0X2JlMzIoVU5fUkVHKHIpLCAodikpKQotI2RlZmluZSBVTl9CSVMocix2KQkoVU5fT1VUKChyKSwgVU5fSU4ocikgfCAodikpKQotI2RlZmluZSBVTl9CSUMocix2KQkoVU5fT1VUKChyKSwgVU5fSU4ocikgJiB+KHYpKSkKLQotc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSogdW5pbm9ydGhfbm9kZTsKLXN0YXRpYyB1MzIgX19pb21lbSAqIHVuaW5vcnRoX2Jhc2U7Ci1zdGF0aWMgdTMyIHVuaW5vcnRoX3JldjsKLXN0YXRpYyBpbnQgdW5pbm9ydGhfdTM7Ci1zdGF0aWMgdm9pZCBfX2lvbWVtICp1M19odDsKLQotLyoKLSAqIEZvciBlYWNoIG1vdGhlcmJvYXJkIGZhbWlseSwgd2UgaGF2ZSBhIHRhYmxlIG9mIGZ1bmN0aW9ucyBwb2ludGVycwotICogdGhhdCBoYW5kbGUgdGhlIHZhcmlvdXMgZmVhdHVyZXMuCi0gKi8KLQotdHlwZWRlZiBsb25nICgqZmVhdHVyZV9jYWxsKShzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUsIGxvbmcgcGFyYW0sIGxvbmcgdmFsdWUpOwotCi1zdHJ1Y3QgZmVhdHVyZV90YWJsZV9lbnRyeSB7Ci0JdW5zaWduZWQgaW50CXNlbGVjdG9yOwotCWZlYXR1cmVfY2FsbAlmdW5jdGlvbjsKLX07Ci0KLXN0cnVjdCBwbWFjX21iX2RlZgotewotCWNvbnN0IGNoYXIqCQkJbW9kZWxfc3RyaW5nOwotCWNvbnN0IGNoYXIqCQkJbW9kZWxfbmFtZTsKLQlpbnQJCQkJbW9kZWxfaWQ7Ci0Jc3RydWN0IGZlYXR1cmVfdGFibGVfZW50cnkqIAlmZWF0dXJlczsKLQl1bnNpZ25lZCBsb25nCQkJYm9hcmRfZmxhZ3M7Ci19Owotc3RhdGljIHN0cnVjdCBwbWFjX21iX2RlZiBwbWFjX21iOwotCi0vKgotICogSGVyZSBhcmUgdGhlIGNoaXAgc3BlY2lmaWMgZmVhdHVyZSBmdW5jdGlvbnMKLSAqLwotCi1zdGF0aWMgaW5saW5lIGludAotc2ltcGxlX2ZlYXR1cmVfdHdlYWsoc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCBpbnQgdHlwZSwgaW50IHJlZywgdTMyIG1hc2ssIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgbWFjaW9fY2hpcCoJbWFjaW87Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0KLQltYWNpbyA9IG1hY2lvX2ZpbmQobm9kZSwgdHlwZSk7Ci0JaWYgKCFtYWNpbykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JTE9DSyhmbGFncyk7Ci0JaWYgKHZhbHVlKQotCQlNQUNJT19CSVMocmVnLCBtYXNrKTsKLQllbHNlCi0JCU1BQ0lPX0JJQyhyZWcsIG1hc2spOwotCSh2b2lkKU1BQ0lPX0lOMzIocmVnKTsKLQlVTkxPQ0soZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZm5kZWYgQ09ORklHX1BPV0VSNAotCi1zdGF0aWMgbG9uZwotb2hhcmVfaHR3X3NjY19lbmFibGUoc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCBsb25nIHBhcmFtLCBsb25nIHZhbHVlKQotewotCXN0cnVjdCBtYWNpb19jaGlwKgltYWNpbzsKLQl1bnNpZ25lZCBsb25nCQljaGFuX21hc2s7Ci0JdW5zaWduZWQgbG9uZwkJZmNyOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwotCWludAkJCWh0dywgdHJhbnM7Ci0JdW5zaWduZWQgbG9uZwkJcm1hc2s7Ci0KLQltYWNpbyA9IG1hY2lvX2ZpbmQobm9kZSwgMCk7Ci0JaWYgKCFtYWNpbykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKCFzdHJjbXAobm9kZS0+bmFtZSwgImNoLWEiKSkKLQkJY2hhbl9tYXNrID0gTUFDSU9fRkxBR19TQ0NBX09OOwotCWVsc2UgaWYgKCFzdHJjbXAobm9kZS0+bmFtZSwgImNoLWIiKSkKLQkJY2hhbl9tYXNrID0gTUFDSU9fRkxBR19TQ0NCX09OOwotCWVsc2UKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlodHcgPSAobWFjaW8tPnR5cGUgPT0gbWFjaW9faGVhdGhyb3cgfHwgbWFjaW8tPnR5cGUgPT0gbWFjaW9fcGFkZGluZ3RvbgotCQl8fCBtYWNpby0+dHlwZSA9PSBtYWNpb19nYXR3aWNrKTsKLQkvKiBPbiB0aGVzZSBtYWNoaW5lcywgdGhlIEhSV19TQ0NfVFJBTlNfRU5fTiBiaXQgbXVzdG4ndCBiZSB0b3VjaGVkICovCi0JdHJhbnMgPSAocG1hY19tYi5tb2RlbF9pZCAhPSBQTUFDX1RZUEVfWU9TRU1JVEUgJiYKLQkgICAgCSBwbWFjX21iLm1vZGVsX2lkICE9IFBNQUNfVFlQRV9ZSUtFUyk7Ci0JaWYgKHZhbHVlKSB7Ci0jaWZkZWYgQ09ORklHX0FEQl9QTVUKLQkJaWYgKChwYXJhbSAmIDB4ZmZmKSA9PSBQTUFDX1NDQ19JUkRBKQotCQkJcG11X2VuYWJsZV9pcmxlZCgxKTsKLSNlbmRpZiAvKiBDT05GSUdfQURCX1BNVSAqLwotCQlMT0NLKGZsYWdzKTsKLQkJZmNyID0gTUFDSU9fSU4zMihPSEFSRV9GQ1IpOwotCQkvKiBDaGVjayBpZiBzY2MgY2VsbCBuZWVkIGVuYWJsaW5nICovCi0JCWlmICghKGZjciAmIE9IX1NDQ19FTkFCTEUpKSB7Ci0JCQlmY3IgfD0gT0hfU0NDX0VOQUJMRTsKLQkJCWlmIChodHcpIHsKLQkJCQkvKiBTaWRlIGVmZmVjdDogdGhpcyB3aWxsIGFsc28gcG93ZXIgdXAgdGhlCi0JCQkJICogbW9kZW0sIGJ1dCBpdCdzIHRvbyBtZXNzeSB0byBmaWd1cmUgb3V0IG9uIHdoaWNoCi0JCQkJICogcG9ydHMgdGhpcyBjb250cm9scyB0aGUgdHJhbmNlaXZlciBhbmQgb24gd2hpY2gKLQkJCQkgKiBpdCBjb250cm9scyB0aGUgbW9kZW0KLQkJCQkgKi8KLQkJCQlpZiAodHJhbnMpCi0JCQkJCWZjciAmPSB+SFJXX1NDQ19UUkFOU19FTl9OOwotCQkJCU1BQ0lPX09VVDMyKE9IQVJFX0ZDUiwgZmNyKTsKLQkJCQlmY3IgfD0gKHJtYXNrID0gSFJXX1JFU0VUX1NDQyk7Ci0JCQkJTUFDSU9fT1VUMzIoT0hBUkVfRkNSLCBmY3IpOwotCQkJfSBlbHNlIHsKLQkJCQlmY3IgfD0gKHJtYXNrID0gT0hfU0NDX1JFU0VUKTsKLQkJCQlNQUNJT19PVVQzMihPSEFSRV9GQ1IsIGZjcik7Ci0JCQl9Ci0JCQlVTkxPQ0soZmxhZ3MpOwotCQkJKHZvaWQpTUFDSU9fSU4zMihPSEFSRV9GQ1IpOwotCQkJbWRlbGF5KDE1KTsKLQkJCUxPQ0soZmxhZ3MpOwotCQkJZmNyICY9IH5ybWFzazsKLQkJCU1BQ0lPX09VVDMyKE9IQVJFX0ZDUiwgZmNyKTsKLQkJfQotCQlpZiAoY2hhbl9tYXNrICYgTUFDSU9fRkxBR19TQ0NBX09OKQotCQkJZmNyIHw9IE9IX1NDQ0FfSU87Ci0JCWlmIChjaGFuX21hc2sgJiBNQUNJT19GTEFHX1NDQ0JfT04pCi0JCQlmY3IgfD0gT0hfU0NDQl9JTzsKLQkJTUFDSU9fT1VUMzIoT0hBUkVfRkNSLCBmY3IpOwotCQltYWNpby0+ZmxhZ3MgfD0gY2hhbl9tYXNrOwotCQlVTkxPQ0soZmxhZ3MpOwotCQlpZiAocGFyYW0gJiBQTUFDX1NDQ19GTEFHX1hNT04pCi0JCQltYWNpby0+ZmxhZ3MgfD0gTUFDSU9fRkxBR19TQ0NfTE9DS0VEOwotCX0gZWxzZSB7Ci0JCWlmIChtYWNpby0+ZmxhZ3MgJiBNQUNJT19GTEFHX1NDQ19MT0NLRUQpCi0JCQlyZXR1cm4gLUVQRVJNOwotCQlMT0NLKGZsYWdzKTsKLQkJZmNyID0gTUFDSU9fSU4zMihPSEFSRV9GQ1IpOwotCQlpZiAoY2hhbl9tYXNrICYgTUFDSU9fRkxBR19TQ0NBX09OKQotCQkJZmNyICY9IH5PSF9TQ0NBX0lPOwotCQlpZiAoY2hhbl9tYXNrICYgTUFDSU9fRkxBR19TQ0NCX09OKQotCQkJZmNyICY9IH5PSF9TQ0NCX0lPOwotCQlNQUNJT19PVVQzMihPSEFSRV9GQ1IsIGZjcik7Ci0JCWlmICgoZmNyICYgKE9IX1NDQ0FfSU8gfCBPSF9TQ0NCX0lPKSkgPT0gMCkgewotCQkJZmNyICY9IH5PSF9TQ0NfRU5BQkxFOwotCQkJaWYgKGh0dyAmJiB0cmFucykKLQkJCQlmY3IgfD0gSFJXX1NDQ19UUkFOU19FTl9OOwotCQkJTUFDSU9fT1VUMzIoT0hBUkVfRkNSLCBmY3IpOwotCQl9Ci0JCW1hY2lvLT5mbGFncyAmPSB+KGNoYW5fbWFzayk7Ci0JCVVOTE9DSyhmbGFncyk7Ci0JCW1kZWxheSgxMCk7Ci0jaWZkZWYgQ09ORklHX0FEQl9QTVUKLQkJaWYgKChwYXJhbSAmIDB4ZmZmKSA9PSBQTUFDX1NDQ19JUkRBKQotCQkJcG11X2VuYWJsZV9pcmxlZCgwKTsKLSNlbmRpZiAvKiBDT05GSUdfQURCX1BNVSAqLwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcKLW9oYXJlX2Zsb3BweV9lbmFibGUoc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCBsb25nIHBhcmFtLCBsb25nIHZhbHVlKQotewotCXJldHVybiBzaW1wbGVfZmVhdHVyZV90d2Vhayhub2RlLCBtYWNpb19vaGFyZSwKLQkJT0hBUkVfRkNSLCBPSF9GTE9QUFlfRU5BQkxFLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBsb25nCi1vaGFyZV9tZXNoX2VuYWJsZShzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUsIGxvbmcgcGFyYW0sIGxvbmcgdmFsdWUpCi17Ci0JcmV0dXJuIHNpbXBsZV9mZWF0dXJlX3R3ZWFrKG5vZGUsIG1hY2lvX29oYXJlLAotCQlPSEFSRV9GQ1IsIE9IX01FU0hfRU5BQkxFLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBsb25nCi1vaGFyZV9pZGVfZW5hYmxlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgbG9uZyBwYXJhbSwgbG9uZyB2YWx1ZSkKLXsKLQlzd2l0Y2gocGFyYW0pIHsKLQkgICAgY2FzZSAwOgotCSAgICAJLyogRm9yIHNvbWUgcmVhc29uLCBzZXR0aW5nIHRoZSBiaXQgaW4gc2V0X2luaXRpYWxfZmVhdHVyZXMoKQotCSAgICAJICogZG9lc24ndCBzdGljay4gSSdtIHN0aWxsIGludmVzdGlnYXRpbmcuLi4gLS1CZW5ILgotCSAgICAJICovCi0JICAgIAlpZiAodmFsdWUpCi0JICAgIAkJc2ltcGxlX2ZlYXR1cmVfdHdlYWsobm9kZSwgbWFjaW9fb2hhcmUsCi0JCQkJT0hBUkVfRkNSLCBPSF9JT0JVU19FTkFCTEUsIDEpOwotCQlyZXR1cm4gc2ltcGxlX2ZlYXR1cmVfdHdlYWsobm9kZSwgbWFjaW9fb2hhcmUsCi0JCQlPSEFSRV9GQ1IsIE9IX0lERTBfRU5BQkxFLCB2YWx1ZSk7Ci0JICAgIGNhc2UgMToKLQkJcmV0dXJuIHNpbXBsZV9mZWF0dXJlX3R3ZWFrKG5vZGUsIG1hY2lvX29oYXJlLAotCQkJT0hBUkVfRkNSLCBPSF9CQVlfSURFX0VOQUJMRSwgdmFsdWUpOwotCSAgICBkZWZhdWx0OgotCSAgICAJcmV0dXJuIC1FTk9ERVY7Ci0JfQotfQotCi1zdGF0aWMgbG9uZwotb2hhcmVfaWRlX3Jlc2V0KHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgbG9uZyBwYXJhbSwgbG9uZyB2YWx1ZSkKLXsKLQlzd2l0Y2gocGFyYW0pIHsKLQkgICAgY2FzZSAwOgotCQlyZXR1cm4gc2ltcGxlX2ZlYXR1cmVfdHdlYWsobm9kZSwgbWFjaW9fb2hhcmUsCi0JCQlPSEFSRV9GQ1IsIE9IX0lERTBfUkVTRVRfTiwgIXZhbHVlKTsKLQkgICAgY2FzZSAxOgotCQlyZXR1cm4gc2ltcGxlX2ZlYXR1cmVfdHdlYWsobm9kZSwgbWFjaW9fb2hhcmUsCi0JCQlPSEFSRV9GQ1IsIE9IX0lERTFfUkVTRVRfTiwgIXZhbHVlKTsKLQkgICAgZGVmYXVsdDoKLQkgICAgCXJldHVybiAtRU5PREVWOwotCX0KLX0KLQotc3RhdGljIGxvbmcKLW9oYXJlX3NsZWVwX3N0YXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgbG9uZyBwYXJhbSwgbG9uZyB2YWx1ZSkKLXsKLQlzdHJ1Y3QgbWFjaW9fY2hpcCoJbWFjaW8gPSAmbWFjaW9fY2hpcHNbMF07Ci0KLQlpZiAoKHBtYWNfbWIuYm9hcmRfZmxhZ3MgJiBQTUFDX01CX0NBTl9TTEVFUCkgPT0gMCkKLQkJcmV0dXJuIC1FUEVSTTsKLQlpZiAodmFsdWUgPT0gMSkgewotCQlNQUNJT19CSUMoT0hBUkVfRkNSLCBPSF9JT0JVU19FTkFCTEUpOwotCX0gZWxzZSBpZiAodmFsdWUgPT0gMCkgewotCQlNQUNJT19CSVMoT0hBUkVfRkNSLCBPSF9JT0JVU19FTkFCTEUpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZwotaGVhdGhyb3dfbW9kZW1fZW5hYmxlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgbG9uZyBwYXJhbSwgbG9uZyB2YWx1ZSkKLXsKLQlzdHJ1Y3QgbWFjaW9fY2hpcCoJbWFjaW87Ci0JdTgJCQlncGlvOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwotCi0JbWFjaW8gPSBtYWNpb19maW5kKG5vZGUsIG1hY2lvX3Vua25vd24pOwotCWlmICghbWFjaW8pCi0JCXJldHVybiAtRU5PREVWOwotCWdwaW8gPSBNQUNJT19JTjgoSFJXX0dQSU9fTU9ERU1fUkVTRVQpICYgfjE7Ci0JaWYgKCF2YWx1ZSkgewotCQlMT0NLKGZsYWdzKTsKLQkJTUFDSU9fT1VUOChIUldfR1BJT19NT0RFTV9SRVNFVCwgZ3Bpbyk7Ci0JCVVOTE9DSyhmbGFncyk7Ci0JCSh2b2lkKU1BQ0lPX0lOOChIUldfR1BJT19NT0RFTV9SRVNFVCk7Ci0JCW1kZWxheSgyNTApOwotCX0KLQlpZiAocG1hY19tYi5tb2RlbF9pZCAhPSBQTUFDX1RZUEVfWU9TRU1JVEUgJiYKLQkgICAgcG1hY19tYi5tb2RlbF9pZCAhPSBQTUFDX1RZUEVfWUlLRVMpIHsKLQkgICAgCUxPQ0soZmxhZ3MpOwotCSAgICAJaWYgKHZhbHVlKQotCSAgICAJCU1BQ0lPX0JJQyhIRUFUSFJPV19GQ1IsIEhSV19TQ0NfVFJBTlNfRU5fTik7Ci0JICAgIAllbHNlCi0JICAgIAkJTUFDSU9fQklTKEhFQVRIUk9XX0ZDUiwgSFJXX1NDQ19UUkFOU19FTl9OKTsKLQkgICAgCVVOTE9DSyhmbGFncyk7Ci0JICAgIAkodm9pZClNQUNJT19JTjMyKEhFQVRIUk9XX0ZDUik7Ci0JCW1kZWxheSgyNTApOwotCX0KLQlpZiAodmFsdWUpIHsKLQkJTE9DSyhmbGFncyk7Ci0JCU1BQ0lPX09VVDgoSFJXX0dQSU9fTU9ERU1fUkVTRVQsIGdwaW8gfCAxKTsKLQkJKHZvaWQpTUFDSU9fSU44KEhSV19HUElPX01PREVNX1JFU0VUKTsKLQkgICAgCVVOTE9DSyhmbGFncyk7IG1kZWxheSgyNTApOyBMT0NLKGZsYWdzKTsKLQkJTUFDSU9fT1VUOChIUldfR1BJT19NT0RFTV9SRVNFVCwgZ3Bpbyk7Ci0JCSh2b2lkKU1BQ0lPX0lOOChIUldfR1BJT19NT0RFTV9SRVNFVCk7Ci0JICAgIAlVTkxPQ0soZmxhZ3MpOyBtZGVsYXkoMjUwKTsgTE9DSyhmbGFncyk7Ci0JCU1BQ0lPX09VVDgoSFJXX0dQSU9fTU9ERU1fUkVTRVQsIGdwaW8gfCAxKTsKLQkJKHZvaWQpTUFDSU9fSU44KEhSV19HUElPX01PREVNX1JFU0VUKTsKLQkgICAgCVVOTE9DSyhmbGFncyk7IG1kZWxheSgyNTApOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcKLWhlYXRocm93X2Zsb3BweV9lbmFibGUoc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCBsb25nIHBhcmFtLCBsb25nIHZhbHVlKQotewotCXJldHVybiBzaW1wbGVfZmVhdHVyZV90d2Vhayhub2RlLCBtYWNpb191bmtub3duLAotCQlIRUFUSFJPV19GQ1IsCi0JCUhSV19TV0lNX0VOQUJMRXxIUldfQkFZX0ZMT1BQWV9FTkFCTEUsCi0JCXZhbHVlKTsKLX0KLQotc3RhdGljIGxvbmcKLWhlYXRocm93X21lc2hfZW5hYmxlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgbG9uZyBwYXJhbSwgbG9uZyB2YWx1ZSkKLXsKLQlzdHJ1Y3QgbWFjaW9fY2hpcCoJbWFjaW87Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0KLQltYWNpbyA9IG1hY2lvX2ZpbmQobm9kZSwgbWFjaW9fdW5rbm93bik7Ci0JaWYgKCFtYWNpbykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JTE9DSyhmbGFncyk7Ci0JLyogU2V0IGNsZWFyIG1lc2ggY2VsbCBlbmFibGUgKi8KLQlpZiAodmFsdWUpCi0JCU1BQ0lPX0JJUyhIRUFUSFJPV19GQ1IsIEhSV19NRVNIX0VOQUJMRSk7Ci0JZWxzZQotCQlNQUNJT19CSUMoSEVBVEhST1dfRkNSLCBIUldfTUVTSF9FTkFCTEUpOwotCSh2b2lkKU1BQ0lPX0lOMzIoSEVBVEhST1dfRkNSKTsKLQl1ZGVsYXkoMTApOwotCS8qIFNldC9DbGVhciB0ZXJtaW5hdGlvbiBwb3dlciAqLwotCWlmICh2YWx1ZSkKLQkJTUFDSU9fQklDKEhFQVRIUk9XX01CQ1IsIDB4MDQwMDAwMDApOwotCWVsc2UKLQkJTUFDSU9fQklTKEhFQVRIUk9XX01CQ1IsIDB4MDQwMDAwMDApOwotCSh2b2lkKU1BQ0lPX0lOMzIoSEVBVEhST1dfTUJDUik7Ci0JdWRlbGF5KDEwKTsKLQlVTkxPQ0soZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nCi1oZWF0aHJvd19pZGVfZW5hYmxlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgbG9uZyBwYXJhbSwgbG9uZyB2YWx1ZSkKLXsKLQlzd2l0Y2gocGFyYW0pIHsKLQkgICAgY2FzZSAwOgotCQlyZXR1cm4gc2ltcGxlX2ZlYXR1cmVfdHdlYWsobm9kZSwgbWFjaW9fdW5rbm93biwKLQkJCUhFQVRIUk9XX0ZDUiwgSFJXX0lERTBfRU5BQkxFLCB2YWx1ZSk7Ci0JICAgIGNhc2UgMToKLQkJcmV0dXJuIHNpbXBsZV9mZWF0dXJlX3R3ZWFrKG5vZGUsIG1hY2lvX3Vua25vd24sCi0JCQlIRUFUSFJPV19GQ1IsIEhSV19CQVlfSURFX0VOQUJMRSwgdmFsdWUpOwotCSAgICBkZWZhdWx0OgotCSAgICAJcmV0dXJuIC1FTk9ERVY7Ci0JfQotfQotCi1zdGF0aWMgbG9uZwotaGVhdGhyb3dfaWRlX3Jlc2V0KHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgbG9uZyBwYXJhbSwgbG9uZyB2YWx1ZSkKLXsKLQlzd2l0Y2gocGFyYW0pIHsKLQkgICAgY2FzZSAwOgotCQlyZXR1cm4gc2ltcGxlX2ZlYXR1cmVfdHdlYWsobm9kZSwgbWFjaW9fdW5rbm93biwKLQkJCUhFQVRIUk9XX0ZDUiwgSFJXX0lERTBfUkVTRVRfTiwgIXZhbHVlKTsKLQkgICAgY2FzZSAxOgotCQlyZXR1cm4gc2ltcGxlX2ZlYXR1cmVfdHdlYWsobm9kZSwgbWFjaW9fdW5rbm93biwKLQkJCUhFQVRIUk9XX0ZDUiwgSFJXX0lERTFfUkVTRVRfTiwgIXZhbHVlKTsKLQkgICAgZGVmYXVsdDoKLQkgICAgCXJldHVybiAtRU5PREVWOwotCX0KLX0KLQotc3RhdGljIGxvbmcKLWhlYXRocm93X2JtYWNfZW5hYmxlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgbG9uZyBwYXJhbSwgbG9uZyB2YWx1ZSkKLXsKLQlzdHJ1Y3QgbWFjaW9fY2hpcCoJbWFjaW87Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0KLQltYWNpbyA9IG1hY2lvX2ZpbmQobm9kZSwgMCk7Ci0JaWYgKCFtYWNpbykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKHZhbHVlKSB7Ci0JCUxPQ0soZmxhZ3MpOwotCQlNQUNJT19CSVMoSEVBVEhST1dfRkNSLCBIUldfQk1BQ19JT19FTkFCTEUpOwotCQlNQUNJT19CSVMoSEVBVEhST1dfRkNSLCBIUldfQk1BQ19SRVNFVCk7Ci0JCVVOTE9DSyhmbGFncyk7Ci0JCSh2b2lkKU1BQ0lPX0lOMzIoSEVBVEhST1dfRkNSKTsKLQkJbWRlbGF5KDEwKTsKLQkJTE9DSyhmbGFncyk7Ci0JCU1BQ0lPX0JJQyhIRUFUSFJPV19GQ1IsIEhSV19CTUFDX1JFU0VUKTsKLQkJVU5MT0NLKGZsYWdzKTsKLQkJKHZvaWQpTUFDSU9fSU4zMihIRUFUSFJPV19GQ1IpOwotCQltZGVsYXkoMTApOwotCX0gZWxzZSB7Ci0JCUxPQ0soZmxhZ3MpOwotCQlNQUNJT19CSUMoSEVBVEhST1dfRkNSLCBIUldfQk1BQ19JT19FTkFCTEUpOwotCQlVTkxPQ0soZmxhZ3MpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcKLWhlYXRocm93X3NvdW5kX2VuYWJsZShzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUsIGxvbmcgcGFyYW0sIGxvbmcgdmFsdWUpCi17Ci0Jc3RydWN0IG1hY2lvX2NoaXAqCW1hY2lvOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwotCi0JLyogQiZXIEczIGFuZCBZaWtlcyBkb24ndCBzdXBwb3J0IHRoYXQgcHJvcGVybHkgKHRoZQotCSAqIHNvdW5kIGFwcGVhciB0byBuZXZlciBjb21lIGJhY2sgYWZ0ZXIgYmVlaW5nIHNodXQgZG93bikuCi0JICovCi0JaWYgKHBtYWNfbWIubW9kZWxfaWQgPT0gUE1BQ19UWVBFX1lPU0VNSVRFIHx8Ci0JICAgIHBtYWNfbWIubW9kZWxfaWQgPT0gUE1BQ19UWVBFX1lJS0VTKQotCQlyZXR1cm4gMDsKLQotCW1hY2lvID0gbWFjaW9fZmluZChub2RlLCAwKTsKLQlpZiAoIW1hY2lvKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAodmFsdWUpIHsKLQkJTE9DSyhmbGFncyk7Ci0JCU1BQ0lPX0JJUyhIRUFUSFJPV19GQ1IsIEhSV19TT1VORF9DTEtfRU5BQkxFKTsKLQkJTUFDSU9fQklDKEhFQVRIUk9XX0ZDUiwgSFJXX1NPVU5EX1BPV0VSX04pOwotCQlVTkxPQ0soZmxhZ3MpOwotCQkodm9pZClNQUNJT19JTjMyKEhFQVRIUk9XX0ZDUik7Ci0JfSBlbHNlIHsKLQkJTE9DSyhmbGFncyk7Ci0JCU1BQ0lPX0JJUyhIRUFUSFJPV19GQ1IsIEhSV19TT1VORF9QT1dFUl9OKTsKLQkJTUFDSU9fQklDKEhFQVRIUk9XX0ZDUiwgSFJXX1NPVU5EX0NMS19FTkFCTEUpOwotCQlVTkxPQ0soZmxhZ3MpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHUzMiBzYXZlX2Zjcls2XTsKLXN0YXRpYyB1MzIgc2F2ZV9tYmNyOwotc3RhdGljIHUzMiBzYXZlX2dwaW9fbGV2ZWxzWzJdOwotc3RhdGljIHU4IHNhdmVfZ3Bpb19leHRpbnRbS0VZTEFSR09fR1BJT19FWFRJTlRfQ05UXTsKLXN0YXRpYyB1OCBzYXZlX2dwaW9fbm9ybWFsW0tFWUxBUkdPX0dQSU9fQ05UXTsKLXN0YXRpYyB1MzIgc2F2ZV91bmluX2Nsb2NrX2N0bDsKLXN0YXRpYyBzdHJ1Y3QgZGJkbWFfcmVncyBzYXZlX2RiZG1hWzEzXTsKLXN0YXRpYyBzdHJ1Y3QgZGJkbWFfcmVncyBzYXZlX2FsdF9kYmRtYVsxM107Ci0KLXN0YXRpYyB2b2lkCi1kYmRtYV9zYXZlKHN0cnVjdCBtYWNpb19jaGlwKiBtYWNpbywgc3RydWN0IGRiZG1hX3JlZ3MqIHNhdmUpCi17Ci0JaW50IGk7Ci0KLQkvKiBTYXZlIHN0YXRlICYgY29uZmlnIG9mIERCRE1BIGNoYW5uZWxzICovCi0JZm9yIChpPTA7IGk8MTM7IGkrKykgewotCQl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICogY2hhbiA9ICh2b2lkIF9faW9tZW0gKikKLQkJCShtYWNpby0+YmFzZSArICgoMHg4MDAwK2kqMHgxMDApPj4yKSk7Ci0JCXNhdmVbaV0uY21kcHRyX2hpID0gaW5fbGUzMigmY2hhbi0+Y21kcHRyX2hpKTsKLQkJc2F2ZVtpXS5jbWRwdHIgPSBpbl9sZTMyKCZjaGFuLT5jbWRwdHIpOwotCQlzYXZlW2ldLmludHJfc2VsID0gaW5fbGUzMigmY2hhbi0+aW50cl9zZWwpOwotCQlzYXZlW2ldLmJyX3NlbCA9IGluX2xlMzIoJmNoYW4tPmJyX3NlbCk7Ci0JCXNhdmVbaV0ud2FpdF9zZWwgPSBpbl9sZTMyKCZjaGFuLT53YWl0X3NlbCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotZGJkbWFfcmVzdG9yZShzdHJ1Y3QgbWFjaW9fY2hpcCogbWFjaW8sIHN0cnVjdCBkYmRtYV9yZWdzKiBzYXZlKQotewotCWludCBpOwotCi0JLyogU2F2ZSBzdGF0ZSAmIGNvbmZpZyBvZiBEQkRNQSBjaGFubmVscyAqLwotCWZvciAoaT0wOyBpPDEzOyBpKyspIHsKLQkJdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqIGNoYW4gPSAodm9pZCBfX2lvbWVtICopCi0JCQkobWFjaW8tPmJhc2UgKyAoKDB4ODAwMCtpKjB4MTAwKT4+MikpOwotCQlvdXRfbGUzMigmY2hhbi0+Y29udHJvbCwgKEFDVElWRXxERUFEfFdBS0V8RkxVU0h8UEFVU0V8UlVOKTw8MTYpOwotCQl3aGlsZSAoaW5fbGUzMigmY2hhbi0+c3RhdHVzKSAmIEFDVElWRSkKLQkJCW1iKCk7Ci0JCW91dF9sZTMyKCZjaGFuLT5jbWRwdHJfaGksIHNhdmVbaV0uY21kcHRyX2hpKTsKLQkJb3V0X2xlMzIoJmNoYW4tPmNtZHB0ciwgc2F2ZVtpXS5jbWRwdHIpOwotCQlvdXRfbGUzMigmY2hhbi0+aW50cl9zZWwsIHNhdmVbaV0uaW50cl9zZWwpOwotCQlvdXRfbGUzMigmY2hhbi0+YnJfc2VsLCBzYXZlW2ldLmJyX3NlbCk7Ci0JCW91dF9sZTMyKCZjaGFuLT53YWl0X3NlbCwgc2F2ZVtpXS53YWl0X3NlbCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotaGVhdGhyb3dfc2xlZXAoc3RydWN0IG1hY2lvX2NoaXAqIG1hY2lvLCBpbnQgc2Vjb25kYXJ5KQotewotCWlmIChzZWNvbmRhcnkpIHsKLQkJZGJkbWFfc2F2ZShtYWNpbywgc2F2ZV9hbHRfZGJkbWEpOwotCQlzYXZlX2ZjclsyXSA9IE1BQ0lPX0lOMzIoMHgzOCk7Ci0JCXNhdmVfZmNyWzNdID0gTUFDSU9fSU4zMigweDNjKTsKLQl9IGVsc2UgewotCQlkYmRtYV9zYXZlKG1hY2lvLCBzYXZlX2RiZG1hKTsKLQkJc2F2ZV9mY3JbMF0gPSBNQUNJT19JTjMyKDB4MzgpOwotCQlzYXZlX2ZjclsxXSA9IE1BQ0lPX0lOMzIoMHgzYyk7Ci0JCXNhdmVfbWJjciA9IE1BQ0lPX0lOMzIoMHgzNCk7Ci0JCS8qIE1ha2Ugc3VyZSBzb3VuZCBpcyBzaHV0IGRvd24gKi8KLQkJTUFDSU9fQklTKEhFQVRIUk9XX0ZDUiwgSFJXX1NPVU5EX1BPV0VSX04pOwotCQlNQUNJT19CSUMoSEVBVEhST1dfRkNSLCBIUldfU09VTkRfQ0xLX0VOQUJMRSk7Ci0JCS8qIFRoaXMgc2VlbXMgdG8gYmUgbmVjZXNzYXJ5IGFzIHdlbGwgb3IgdGhlIGZhbgotCQkgKiBrZWVwcyBjb21pbmcgdXAgYW5kIGJhdHRlcnkgZHJhaW5zIGZhc3QgKi8KLQkJTUFDSU9fQklDKEhFQVRIUk9XX0ZDUiwgSFJXX0lPQlVTX0VOQUJMRSk7Ci0JCU1BQ0lPX0JJQyhIRUFUSFJPV19GQ1IsIEhSV19JREUwX1JFU0VUX04pOwotCQkvKiBNYWtlIHN1cmUgZXRoIGlzIGRvd24gZXZlbiBpZiBtb2R1bGUgb3Igc2xlZXAKLQkJICogd29uJ3Qgd29yayBwcm9wZXJseSAqLwotCQlNQUNJT19CSUMoSEVBVEhST1dfRkNSLCBIUldfQk1BQ19JT19FTkFCTEUgfCBIUldfQk1BQ19SRVNFVCk7Ci0JfQotCS8qIE1ha2Ugc3VyZSBtb2RlbSBpcyBzaHV0IGRvd24gKi8KLQlNQUNJT19PVVQ4KEhSV19HUElPX01PREVNX1JFU0VULAotCQlNQUNJT19JTjgoSFJXX0dQSU9fTU9ERU1fUkVTRVQpICYgfjEpOwotCU1BQ0lPX0JJUyhIRUFUSFJPV19GQ1IsIEhSV19TQ0NfVFJBTlNfRU5fTik7Ci0JTUFDSU9fQklDKEhFQVRIUk9XX0ZDUiwgT0hfU0NDQV9JT3xPSF9TQ0NCX0lPfEhSV19TQ0NfRU5BQkxFKTsKLQotCS8qIExldCB0aGluZ3Mgc2V0dGxlICovCi0JKHZvaWQpTUFDSU9fSU4zMihIRUFUSFJPV19GQ1IpOwotfQotCi1zdGF0aWMgdm9pZAotaGVhdGhyb3dfd2FrZXVwKHN0cnVjdCBtYWNpb19jaGlwKiBtYWNpbywgaW50IHNlY29uZGFyeSkKLXsKLQlpZiAoc2Vjb25kYXJ5KSB7Ci0JCU1BQ0lPX09VVDMyKDB4MzgsIHNhdmVfZmNyWzJdKTsKLQkJKHZvaWQpTUFDSU9fSU4zMigweDM4KTsKLQkJbWRlbGF5KDEpOwotCQlNQUNJT19PVVQzMigweDNjLCBzYXZlX2ZjclszXSk7Ci0JCSh2b2lkKU1BQ0lPX0lOMzIoMHgzOCk7Ci0JCW1kZWxheSgxMCk7Ci0JCWRiZG1hX3Jlc3RvcmUobWFjaW8sIHNhdmVfYWx0X2RiZG1hKTsKLQl9IGVsc2UgewotCQlNQUNJT19PVVQzMigweDM4LCBzYXZlX2ZjclswXSB8IEhSV19JT0JVU19FTkFCTEUpOwotCQkodm9pZClNQUNJT19JTjMyKDB4MzgpOwotCQltZGVsYXkoMSk7Ci0JCU1BQ0lPX09VVDMyKDB4M2MsIHNhdmVfZmNyWzFdKTsKLQkJKHZvaWQpTUFDSU9fSU4zMigweDM4KTsKLQkJbWRlbGF5KDEpOwotCQlNQUNJT19PVVQzMigweDM0LCBzYXZlX21iY3IpOwotCQkodm9pZClNQUNJT19JTjMyKDB4MzgpOwotCQltZGVsYXkoMTApOwotCQlkYmRtYV9yZXN0b3JlKG1hY2lvLCBzYXZlX2RiZG1hKTsKLQl9Ci19Ci0KLXN0YXRpYyBsb25nCi1oZWF0aHJvd19zbGVlcF9zdGF0ZShzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUsIGxvbmcgcGFyYW0sIGxvbmcgdmFsdWUpCi17Ci0JaWYgKChwbWFjX21iLmJvYXJkX2ZsYWdzICYgUE1BQ19NQl9DQU5fU0xFRVApID09IDApCi0JCXJldHVybiAtRVBFUk07Ci0JaWYgKHZhbHVlID09IDEpIHsKLQkJaWYgKG1hY2lvX2NoaXBzWzFdLnR5cGUgPT0gbWFjaW9fZ2F0d2ljaykKLQkJCWhlYXRocm93X3NsZWVwKCZtYWNpb19jaGlwc1swXSwgMSk7Ci0JCWhlYXRocm93X3NsZWVwKCZtYWNpb19jaGlwc1swXSwgMCk7Ci0JfSBlbHNlIGlmICh2YWx1ZSA9PSAwKSB7Ci0JCWhlYXRocm93X3dha2V1cCgmbWFjaW9fY2hpcHNbMF0sIDApOwotCQlpZiAobWFjaW9fY2hpcHNbMV0udHlwZSA9PSBtYWNpb19nYXR3aWNrKQotCQkJaGVhdGhyb3dfd2FrZXVwKCZtYWNpb19jaGlwc1swXSwgMSk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZwotY29yZTk5X3NjY19lbmFibGUoc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCBsb25nIHBhcmFtLCBsb25nIHZhbHVlKQotewotCXN0cnVjdCBtYWNpb19jaGlwKgltYWNpbzsKLQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQl1bnNpZ25lZCBsb25nCQljaGFuX21hc2s7Ci0JdTMyCQkJZmNyOwotCi0JbWFjaW8gPSBtYWNpb19maW5kKG5vZGUsIDApOwotCWlmICghbWFjaW8pCi0JCXJldHVybiAtRU5PREVWOwotCWlmICghc3RyY21wKG5vZGUtPm5hbWUsICJjaC1hIikpCi0JCWNoYW5fbWFzayA9IE1BQ0lPX0ZMQUdfU0NDQV9PTjsKLQllbHNlIGlmICghc3RyY21wKG5vZGUtPm5hbWUsICJjaC1iIikpCi0JCWNoYW5fbWFzayA9IE1BQ0lPX0ZMQUdfU0NDQl9PTjsKLQllbHNlCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKHZhbHVlKSB7Ci0JCWludCBuZWVkX3Jlc2V0X3NjYyA9IDA7Ci0JCWludCBuZWVkX3Jlc2V0X2lyZGEgPSAwOwotCi0JCUxPQ0soZmxhZ3MpOwotCQlmY3IgPSBNQUNJT19JTjMyKEtFWUxBUkdPX0ZDUjApOwotCQkvKiBDaGVjayBpZiBzY2MgY2VsbCBuZWVkIGVuYWJsaW5nICovCi0JCWlmICghKGZjciAmIEtMMF9TQ0NfQ0VMTF9FTkFCTEUpKSB7Ci0JCQlmY3IgfD0gS0wwX1NDQ19DRUxMX0VOQUJMRTsKLQkJCW5lZWRfcmVzZXRfc2NjID0gMTsKLQkJfQotCQlpZiAoY2hhbl9tYXNrICYgTUFDSU9fRkxBR19TQ0NBX09OKSB7Ci0JCQlmY3IgfD0gS0wwX1NDQ0FfRU5BQkxFOwotCQkJLyogRG9uJ3QgZW5hYmxlIGxpbmUgZHJpdmVycyBmb3IgSTJTIG1vZGVtICovCi0JCQlpZiAoKHBhcmFtICYgMHhmZmYpID09IFBNQUNfU0NDX0kyUzEpCi0JCQkJZmNyICY9IH5LTDBfU0NDX0FfSU5URl9FTkFCTEU7Ci0JCQllbHNlCi0JCQkJZmNyIHw9IEtMMF9TQ0NfQV9JTlRGX0VOQUJMRTsKLQkJfQotCQlpZiAoY2hhbl9tYXNrICYgTUFDSU9fRkxBR19TQ0NCX09OKSB7Ci0JCQlmY3IgfD0gS0wwX1NDQ0JfRU5BQkxFOwotCQkJLyogUGVyZm9ybSBpcmRhIHNwZWNpZmljIGluaXRzICovCi0JCQlpZiAoKHBhcmFtICYgMHhmZmYpID09IFBNQUNfU0NDX0lSREEpIHsKLQkJCQlmY3IgJj0gfktMMF9TQ0NfQl9JTlRGX0VOQUJMRTsKLQkJCQlmY3IgfD0gS0wwX0lSREFfRU5BQkxFOwotCQkJCWZjciB8PSBLTDBfSVJEQV9DTEszMl9FTkFCTEUgfCBLTDBfSVJEQV9DTEsxOV9FTkFCTEU7Ci0JCQkJZmNyIHw9IEtMMF9JUkRBX1NPVVJDRTFfU0VMOwotCQkJCWZjciAmPSB+KEtMMF9JUkRBX0ZBU1RfQ09OTkVDVHxLTDBfSVJEQV9ERUZBVUxUMXxLTDBfSVJEQV9ERUZBVUxUMCk7Ci0JCQkJZmNyICY9IH4oS0wwX0lSREFfU09VUkNFMl9TRUx8S0wwX0lSREFfSElHSF9CQU5EKTsKLQkJCQluZWVkX3Jlc2V0X2lyZGEgPSAxOwotCQkJfSBlbHNlCi0JCQkJZmNyIHw9IEtMMF9TQ0NfQl9JTlRGX0VOQUJMRTsKLQkJfQotCQlNQUNJT19PVVQzMihLRVlMQVJHT19GQ1IwLCBmY3IpOwotCQltYWNpby0+ZmxhZ3MgfD0gY2hhbl9tYXNrOwotCQlpZiAobmVlZF9yZXNldF9zY2MpICB7Ci0JCQlNQUNJT19CSVMoS0VZTEFSR09fRkNSMCwgS0wwX1NDQ19SRVNFVCk7Ci0JCQkodm9pZClNQUNJT19JTjMyKEtFWUxBUkdPX0ZDUjApOwotCQkJVU5MT0NLKGZsYWdzKTsKLQkJCW1kZWxheSgxNSk7Ci0JCQlMT0NLKGZsYWdzKTsKLQkJCU1BQ0lPX0JJQyhLRVlMQVJHT19GQ1IwLCBLTDBfU0NDX1JFU0VUKTsKLQkJfQotCQlpZiAobmVlZF9yZXNldF9pcmRhKSAgewotCQkJTUFDSU9fQklTKEtFWUxBUkdPX0ZDUjAsIEtMMF9JUkRBX1JFU0VUKTsKLQkJCSh2b2lkKU1BQ0lPX0lOMzIoS0VZTEFSR09fRkNSMCk7Ci0JCQlVTkxPQ0soZmxhZ3MpOwotCQkJbWRlbGF5KDE1KTsKLQkJCUxPQ0soZmxhZ3MpOwotCQkJTUFDSU9fQklDKEtFWUxBUkdPX0ZDUjAsIEtMMF9JUkRBX1JFU0VUKTsKLQkJfQotCQlVTkxPQ0soZmxhZ3MpOwotCQlpZiAocGFyYW0gJiBQTUFDX1NDQ19GTEFHX1hNT04pCi0JCQltYWNpby0+ZmxhZ3MgfD0gTUFDSU9fRkxBR19TQ0NfTE9DS0VEOwotCX0gZWxzZSB7Ci0JCWlmIChtYWNpby0+ZmxhZ3MgJiBNQUNJT19GTEFHX1NDQ19MT0NLRUQpCi0JCQlyZXR1cm4gLUVQRVJNOwotCQlMT0NLKGZsYWdzKTsKLQkJZmNyID0gTUFDSU9fSU4zMihLRVlMQVJHT19GQ1IwKTsKLQkJaWYgKGNoYW5fbWFzayAmIE1BQ0lPX0ZMQUdfU0NDQV9PTikKLQkJCWZjciAmPSB+S0wwX1NDQ0FfRU5BQkxFOwotCQlpZiAoY2hhbl9tYXNrICYgTUFDSU9fRkxBR19TQ0NCX09OKSB7Ci0JCQlmY3IgJj0gfktMMF9TQ0NCX0VOQUJMRTsKLQkJCS8qIFBlcmZvcm0gaXJkYSBzcGVjaWZpYyBjbGVhcnMgKi8KLQkJCWlmICgocGFyYW0gJiAweGZmZikgPT0gUE1BQ19TQ0NfSVJEQSkgewotCQkJCWZjciAmPSB+S0wwX0lSREFfRU5BQkxFOwotCQkJCWZjciAmPSB+KEtMMF9JUkRBX0NMSzMyX0VOQUJMRSB8IEtMMF9JUkRBX0NMSzE5X0VOQUJMRSk7Ci0JCQkJZmNyICY9IH4oS0wwX0lSREFfRkFTVF9DT05ORUNUfEtMMF9JUkRBX0RFRkFVTFQxfEtMMF9JUkRBX0RFRkFVTFQwKTsKLQkJCQlmY3IgJj0gfihLTDBfSVJEQV9TT1VSQ0UxX1NFTHxLTDBfSVJEQV9TT1VSQ0UyX1NFTHxLTDBfSVJEQV9ISUdIX0JBTkQpOwotCQkJfQotCQl9Ci0JCU1BQ0lPX09VVDMyKEtFWUxBUkdPX0ZDUjAsIGZjcik7Ci0JCWlmICgoZmNyICYgKEtMMF9TQ0NBX0VOQUJMRSB8IEtMMF9TQ0NCX0VOQUJMRSkpID09IDApIHsKLQkJCWZjciAmPSB+S0wwX1NDQ19DRUxMX0VOQUJMRTsKLQkJCU1BQ0lPX09VVDMyKEtFWUxBUkdPX0ZDUjAsIGZjcik7Ci0JCX0KLQkJbWFjaW8tPmZsYWdzICY9IH4oY2hhbl9tYXNrKTsKLQkJVU5MT0NLKGZsYWdzKTsKLQkJbWRlbGF5KDEwKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nCi1jb3JlOTlfbW9kZW1fZW5hYmxlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgbG9uZyBwYXJhbSwgbG9uZyB2YWx1ZSkKLXsKLQlzdHJ1Y3QgbWFjaW9fY2hpcCoJbWFjaW87Ci0JdTgJCQlncGlvOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwotCi0JLyogSGFjayBmb3IgaW50ZXJuYWwgVVNCIG1vZGVtICovCi0JaWYgKG5vZGUgPT0gTlVMTCkgewotCQlpZiAobWFjaW9fY2hpcHNbMF0udHlwZSAhPSBtYWNpb19rZXlsYXJnbykKLQkJCXJldHVybiAtRU5PREVWOwotCQlub2RlID0gbWFjaW9fY2hpcHNbMF0ub2Zfbm9kZTsKLQl9Ci0JbWFjaW8gPSBtYWNpb19maW5kKG5vZGUsIDApOwotCWlmICghbWFjaW8pCi0JCXJldHVybiAtRU5PREVWOwotCWdwaW8gPSBNQUNJT19JTjgoS0xfR1BJT19NT0RFTV9SRVNFVCk7Ci0JZ3BpbyB8PSBLRVlMQVJHT19HUElPX09VVFBVVF9FTkFCTEU7Ci0JZ3BpbyAmPSB+S0VZTEFSR09fR1BJT19PVVRPVVRfREFUQTsKLQotCWlmICghdmFsdWUpIHsKLQkJTE9DSyhmbGFncyk7Ci0JCU1BQ0lPX09VVDgoS0xfR1BJT19NT0RFTV9SRVNFVCwgZ3Bpbyk7Ci0JCVVOTE9DSyhmbGFncyk7Ci0JCSh2b2lkKU1BQ0lPX0lOOChLTF9HUElPX01PREVNX1JFU0VUKTsKLQkJbWRlbGF5KDI1MCk7Ci0JfQotICAgIAlMT0NLKGZsYWdzKTsKLSAgICAJaWYgKHZhbHVlKSB7Ci0gICAgCQlNQUNJT19CSUMoS0VZTEFSR09fRkNSMiwgS0wyX0FMVF9EQVRBX09VVCk7Ci0JICAgIAlVTkxPQ0soZmxhZ3MpOwotCSAgICAJKHZvaWQpTUFDSU9fSU4zMihLRVlMQVJHT19GQ1IyKTsKLQkJbWRlbGF5KDI1MCk7Ci0gICAgCX0gZWxzZSB7Ci0gICAgCQlNQUNJT19CSVMoS0VZTEFSR09fRkNSMiwgS0wyX0FMVF9EQVRBX09VVCk7Ci0JICAgIAlVTkxPQ0soZmxhZ3MpOwotICAgIAl9Ci0JaWYgKHZhbHVlKSB7Ci0JCUxPQ0soZmxhZ3MpOwotCQlNQUNJT19PVVQ4KEtMX0dQSU9fTU9ERU1fUkVTRVQsIGdwaW8gfCBLRVlMQVJHT19HUElPX09VVE9VVF9EQVRBKTsKLQkJKHZvaWQpTUFDSU9fSU44KEtMX0dQSU9fTU9ERU1fUkVTRVQpOwotCSAgICAJVU5MT0NLKGZsYWdzKTsgbWRlbGF5KDI1MCk7IExPQ0soZmxhZ3MpOwotCQlNQUNJT19PVVQ4KEtMX0dQSU9fTU9ERU1fUkVTRVQsIGdwaW8pOwotCQkodm9pZClNQUNJT19JTjgoS0xfR1BJT19NT0RFTV9SRVNFVCk7Ci0JICAgIAlVTkxPQ0soZmxhZ3MpOyBtZGVsYXkoMjUwKTsgTE9DSyhmbGFncyk7Ci0JCU1BQ0lPX09VVDgoS0xfR1BJT19NT0RFTV9SRVNFVCwgZ3BpbyB8IEtFWUxBUkdPX0dQSU9fT1VUT1VUX0RBVEEpOwotCQkodm9pZClNQUNJT19JTjgoS0xfR1BJT19NT0RFTV9SRVNFVCk7Ci0JICAgIAlVTkxPQ0soZmxhZ3MpOyBtZGVsYXkoMjUwKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nCi1wYW5nZWFfbW9kZW1fZW5hYmxlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgbG9uZyBwYXJhbSwgbG9uZyB2YWx1ZSkKLXsKLQlzdHJ1Y3QgbWFjaW9fY2hpcCoJbWFjaW87Ci0JdTgJCQlncGlvOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwotCi0JLyogSGFjayBmb3IgaW50ZXJuYWwgVVNCIG1vZGVtICovCi0JaWYgKG5vZGUgPT0gTlVMTCkgewotCQlpZiAobWFjaW9fY2hpcHNbMF0udHlwZSAhPSBtYWNpb19wYW5nZWEgJiYKLQkJICAgIG1hY2lvX2NoaXBzWzBdLnR5cGUgIT0gbWFjaW9faW50cmVwaWQpCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJbm9kZSA9IG1hY2lvX2NoaXBzWzBdLm9mX25vZGU7Ci0JfQotCW1hY2lvID0gbWFjaW9fZmluZChub2RlLCAwKTsKLQlpZiAoIW1hY2lvKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlncGlvID0gTUFDSU9fSU44KEtMX0dQSU9fTU9ERU1fUkVTRVQpOwotCWdwaW8gfD0gS0VZTEFSR09fR1BJT19PVVRQVVRfRU5BQkxFOwotCWdwaW8gJj0gfktFWUxBUkdPX0dQSU9fT1VUT1VUX0RBVEE7Ci0KLQlpZiAoIXZhbHVlKSB7Ci0JCUxPQ0soZmxhZ3MpOwotCQlNQUNJT19PVVQ4KEtMX0dQSU9fTU9ERU1fUkVTRVQsIGdwaW8pOwotCQlVTkxPQ0soZmxhZ3MpOwotCQkodm9pZClNQUNJT19JTjgoS0xfR1BJT19NT0RFTV9SRVNFVCk7Ci0JCW1kZWxheSgyNTApOwotCX0KLSAgICAJTE9DSyhmbGFncyk7Ci0JaWYgKHZhbHVlKSB7Ci0JCU1BQ0lPX09VVDgoS0xfR1BJT19NT0RFTV9QT1dFUiwKLQkJCUtFWUxBUkdPX0dQSU9fT1VUUFVUX0VOQUJMRSk7Ci0gICAgCQlVTkxPQ0soZmxhZ3MpOwotCSAgICAJKHZvaWQpTUFDSU9fSU4zMihLRVlMQVJHT19GQ1IyKTsKLQkJbWRlbGF5KDI1MCk7Ci0JfSBlbHNlIHsKLQkJTUFDSU9fT1VUOChLTF9HUElPX01PREVNX1BPV0VSLAotCQkJS0VZTEFSR09fR1BJT19PVVRQVVRfRU5BQkxFIHwgS0VZTEFSR09fR1BJT19PVVRPVVRfREFUQSk7Ci0gICAgCQlVTkxPQ0soZmxhZ3MpOwotCX0KLQlpZiAodmFsdWUpIHsKLQkJTE9DSyhmbGFncyk7Ci0JCU1BQ0lPX09VVDgoS0xfR1BJT19NT0RFTV9SRVNFVCwgZ3BpbyB8IEtFWUxBUkdPX0dQSU9fT1VUT1VUX0RBVEEpOwotCQkodm9pZClNQUNJT19JTjgoS0xfR1BJT19NT0RFTV9SRVNFVCk7Ci0JICAgIAlVTkxPQ0soZmxhZ3MpOyBtZGVsYXkoMjUwKTsgTE9DSyhmbGFncyk7Ci0JCU1BQ0lPX09VVDgoS0xfR1BJT19NT0RFTV9SRVNFVCwgZ3Bpbyk7Ci0JCSh2b2lkKU1BQ0lPX0lOOChLTF9HUElPX01PREVNX1JFU0VUKTsKLQkgICAgCVVOTE9DSyhmbGFncyk7IG1kZWxheSgyNTApOyBMT0NLKGZsYWdzKTsKLQkJTUFDSU9fT1VUOChLTF9HUElPX01PREVNX1JFU0VULCBncGlvIHwgS0VZTEFSR09fR1BJT19PVVRPVVRfREFUQSk7Ci0JCSh2b2lkKU1BQ0lPX0lOOChLTF9HUElPX01PREVNX1JFU0VUKTsKLQkgICAgCVVOTE9DSyhmbGFncyk7IG1kZWxheSgyNTApOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcKLWNvcmU5OV9hdGExMDBfZW5hYmxlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgbG9uZyB2YWx1ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKLQl1OCBwYnVzLCBwaWQ7Ci0KLSAgICAJaWYgKHVuaW5vcnRoX3JldiA8IDB4MjQpCi0gICAgCQlyZXR1cm4gLUVOT0RFVjsKLQotCUxPQ0soZmxhZ3MpOwotCWlmICh2YWx1ZSkKLQkJVU5fQklTKFVOSV9OX0NMT0NLX0NOVEwsIFVOSV9OX0NMT0NLX0NOVExfQVRBMTAwKTsKLQllbHNlCi0JCVVOX0JJQyhVTklfTl9DTE9DS19DTlRMLCBVTklfTl9DTE9DS19DTlRMX0FUQTEwMCk7Ci0JKHZvaWQpVU5fSU4oVU5JX05fQ0xPQ0tfQ05UTCk7Ci0JVU5MT0NLKGZsYWdzKTsKLQl1ZGVsYXkoMjApOwotCi0JaWYgKHZhbHVlKSB7Ci0JCWlmIChwY2lfZGV2aWNlX2Zyb21fT0Zfbm9kZShub2RlLCAmcGJ1cywgJnBpZCkgPT0gMCkKLQkJCXBkZXYgPSBwY2lfZmluZF9zbG90KHBidXMsIHBpZCk7Ci0JCWlmIChwZGV2ID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKLQkJcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwotCX0KLSAgICAJcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nCi1jb3JlOTlfaWRlX2VuYWJsZShzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUsIGxvbmcgcGFyYW0sIGxvbmcgdmFsdWUpCi17Ci0JLyogQnVzIElEIDAgdG8gMiBhcmUgS2V5TGFyZ28gYmFzZWQgSURFLCBidXNJRCAzIGlzIFUyCi0JICogYmFzZWQgYXRhLTEwMAotCSAqLwotCXN3aXRjaChwYXJhbSkgewotCSAgICBjYXNlIDA6Ci0JCXJldHVybiBzaW1wbGVfZmVhdHVyZV90d2Vhayhub2RlLCBtYWNpb191bmtub3duLAotCQkJS0VZTEFSR09fRkNSMSwgS0wxX0VJREUwX0VOQUJMRSwgdmFsdWUpOwotCSAgICBjYXNlIDE6Ci0JCXJldHVybiBzaW1wbGVfZmVhdHVyZV90d2Vhayhub2RlLCBtYWNpb191bmtub3duLAotCQkJS0VZTEFSR09fRkNSMSwgS0wxX0VJREUxX0VOQUJMRSwgdmFsdWUpOwotCSAgICBjYXNlIDI6Ci0JCXJldHVybiBzaW1wbGVfZmVhdHVyZV90d2Vhayhub2RlLCBtYWNpb191bmtub3duLAotCQkJS0VZTEFSR09fRkNSMSwgS0wxX1VJREVfRU5BQkxFLCB2YWx1ZSk7Ci0JICAgIGNhc2UgMzoKLQkgICAgCXJldHVybiBjb3JlOTlfYXRhMTAwX2VuYWJsZShub2RlLCB2YWx1ZSk7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIAlyZXR1cm4gLUVOT0RFVjsKLQl9Ci19Ci0KLXN0YXRpYyBsb25nCi1jb3JlOTlfaWRlX3Jlc2V0KHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgbG9uZyBwYXJhbSwgbG9uZyB2YWx1ZSkKLXsKLQlzd2l0Y2gocGFyYW0pIHsKLQkgICAgY2FzZSAwOgotCQlyZXR1cm4gc2ltcGxlX2ZlYXR1cmVfdHdlYWsobm9kZSwgbWFjaW9fdW5rbm93biwKLQkJCUtFWUxBUkdPX0ZDUjEsIEtMMV9FSURFMF9SRVNFVF9OLCAhdmFsdWUpOwotCSAgICBjYXNlIDE6Ci0JCXJldHVybiBzaW1wbGVfZmVhdHVyZV90d2Vhayhub2RlLCBtYWNpb191bmtub3duLAotCQkJS0VZTEFSR09fRkNSMSwgS0wxX0VJREUxX1JFU0VUX04sICF2YWx1ZSk7Ci0JICAgIGNhc2UgMjoKLQkJcmV0dXJuIHNpbXBsZV9mZWF0dXJlX3R3ZWFrKG5vZGUsIG1hY2lvX3Vua25vd24sCi0JCQlLRVlMQVJHT19GQ1IxLCBLTDFfVUlERV9SRVNFVF9OLCAhdmFsdWUpOwotCSAgICBkZWZhdWx0OgotCSAgICAJcmV0dXJuIC1FTk9ERVY7Ci0JfQotfQotCi1zdGF0aWMgbG9uZwotY29yZTk5X2dtYWNfZW5hYmxlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgbG9uZyBwYXJhbSwgbG9uZyB2YWx1ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JTE9DSyhmbGFncyk7Ci0JaWYgKHZhbHVlKQotCQlVTl9CSVMoVU5JX05fQ0xPQ0tfQ05UTCwgVU5JX05fQ0xPQ0tfQ05UTF9HTUFDKTsKLQllbHNlCi0JCVVOX0JJQyhVTklfTl9DTE9DS19DTlRMLCBVTklfTl9DTE9DS19DTlRMX0dNQUMpOwotCSh2b2lkKVVOX0lOKFVOSV9OX0NMT0NLX0NOVEwpOwotCVVOTE9DSyhmbGFncyk7Ci0JdWRlbGF5KDIwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZwotY29yZTk5X2dtYWNfcGh5X3Jlc2V0KHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgbG9uZyBwYXJhbSwgbG9uZyB2YWx1ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBtYWNpb19jaGlwKiBtYWNpbzsKLQotCW1hY2lvID0gJm1hY2lvX2NoaXBzWzBdOwotCWlmIChtYWNpby0+dHlwZSAhPSBtYWNpb19rZXlsYXJnbyAmJiBtYWNpby0+dHlwZSAhPSBtYWNpb19wYW5nZWEgJiYKLQkgICAgbWFjaW8tPnR5cGUgIT0gbWFjaW9faW50cmVwaWQpCi0JCXJldHVybiAtRU5PREVWOwotCi0JTE9DSyhmbGFncyk7Ci0JTUFDSU9fT1VUOChLTF9HUElPX0VUSF9QSFlfUkVTRVQsIEtFWUxBUkdPX0dQSU9fT1VUUFVUX0VOQUJMRSk7Ci0JKHZvaWQpTUFDSU9fSU44KEtMX0dQSU9fRVRIX1BIWV9SRVNFVCk7Ci0JVU5MT0NLKGZsYWdzKTsKLQltZGVsYXkoMTApOwotCUxPQ0soZmxhZ3MpOwotCU1BQ0lPX09VVDgoS0xfR1BJT19FVEhfUEhZX1JFU0VULCAvKktFWUxBUkdPX0dQSU9fT1VUUFVUX0VOQUJMRSB8ICovCi0JCUtFWUxBUkdPX0dQSU9fT1VUT1VUX0RBVEEpOwotCVVOTE9DSyhmbGFncyk7Ci0JbWRlbGF5KDEwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZwotY29yZTk5X3NvdW5kX2NoaXBfZW5hYmxlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgbG9uZyBwYXJhbSwgbG9uZyB2YWx1ZSkKLXsKLQlzdHJ1Y3QgbWFjaW9fY2hpcCoJbWFjaW87Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0KLQltYWNpbyA9IG1hY2lvX2ZpbmQobm9kZSwgMCk7Ci0JaWYgKCFtYWNpbykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKiBEbyBhIGJldHRlciBwcm9iZSBjb2RlLCBzY3JlYW1lciBHNCBkZXNrdG9wcyAmCi0JICogaU1hY3MgY2FuIGRvIHRoYXQgdG9vLCBhZGQgYSByZWNhbGlicmF0ZSAgaW4KLQkgKiB0aGUgZHJpdmVyIGFzIHdlbGwKLQkgKi8KLQlpZiAocG1hY19tYi5tb2RlbF9pZCA9PSBQTUFDX1RZUEVfUElTTU8gfHwKLQkgICAgcG1hY19tYi5tb2RlbF9pZCA9PSBQTUFDX1RZUEVfVElUQU5JVU0pIHsKLQkJTE9DSyhmbGFncyk7Ci0JCWlmICh2YWx1ZSkKLQkgICAgCQlNQUNJT19PVVQ4KEtMX0dQSU9fU09VTkRfUE9XRVIsCi0JICAgIAkJCUtFWUxBUkdPX0dQSU9fT1VUUFVUX0VOQUJMRSB8Ci0JICAgIAkJCUtFWUxBUkdPX0dQSU9fT1VUT1VUX0RBVEEpOwotCSAgICAJZWxzZQotCSAgICAJCU1BQ0lPX09VVDgoS0xfR1BJT19TT1VORF9QT1dFUiwKLQkgICAgCQkJS0VZTEFSR09fR1BJT19PVVRQVVRfRU5BQkxFKTsKLQkgICAgCSh2b2lkKU1BQ0lPX0lOOChLTF9HUElPX1NPVU5EX1BPV0VSKTsKLQkgICAgCVVOTE9DSyhmbGFncyk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZwotY29yZTk5X2FpcnBvcnRfZW5hYmxlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgbG9uZyBwYXJhbSwgbG9uZyB2YWx1ZSkKLXsKLQlzdHJ1Y3QgbWFjaW9fY2hpcCoJbWFjaW87Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0JaW50CQkJc3RhdGU7Ci0KLQltYWNpbyA9IG1hY2lvX2ZpbmQobm9kZSwgMCk7Ci0JaWYgKCFtYWNpbykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKiBIaW50OiB3ZSBhbGxvdyBwYXNzaW5nIG9mIG1hY2lvIGl0c2VsZiBmb3IgdGhlIHNha2Ugb2YgdGhlCi0JICogc2xlZXAgY29kZQotCSAqLwotCWlmIChub2RlICE9IG1hY2lvLT5vZl9ub2RlICYmCi0JICAgICghbm9kZS0+cGFyZW50IHx8IG5vZGUtPnBhcmVudCAhPSBtYWNpby0+b2Zfbm9kZSkpCi0JCXJldHVybiAtRU5PREVWOwotCXN0YXRlID0gKG1hY2lvLT5mbGFncyAmIE1BQ0lPX0ZMQUdfQUlSUE9SVF9PTikgIT0gMDsKLQlpZiAodmFsdWUgPT0gc3RhdGUpCi0JCXJldHVybiAwOwotCWlmICh2YWx1ZSkgewotCQkvKiBUaGlzIGNvZGUgaXMgYSByZXByb2R1Y3Rpb24gb2YgT0YgZW5hYmxlLWNhcmRzbG90Ci0JCSAqIGFuZCBpbml0LXdpcmVsZXNzIG1ldGhvZHMsIHNsaWdodGx5IGhhY2tlZCB1bnRpbAotCQkgKiBJIGdvdCBpdCB3b3JraW5nLgotCQkgKi8KLQkJTE9DSyhmbGFncyk7Ci0JCU1BQ0lPX09VVDgoS0VZTEFSR09fR1BJT18wKzB4ZiwgNSk7Ci0JCSh2b2lkKU1BQ0lPX0lOOChLRVlMQVJHT19HUElPXzArMHhmKTsKLQkJVU5MT0NLKGZsYWdzKTsKLQkJbWRlbGF5KDEwKTsKLQkJTE9DSyhmbGFncyk7Ci0JCU1BQ0lPX09VVDgoS0VZTEFSR09fR1BJT18wKzB4ZiwgNCk7Ci0JCSh2b2lkKU1BQ0lPX0lOOChLRVlMQVJHT19HUElPXzArMHhmKTsKLQkJVU5MT0NLKGZsYWdzKTsKLQotCQltZGVsYXkoMTApOwotCi0JCUxPQ0soZmxhZ3MpOwotCQlNQUNJT19CSUMoS0VZTEFSR09fRkNSMiwgS0wyX0NBUkRTRUxfMTYpOwotCQkodm9pZClNQUNJT19JTjMyKEtFWUxBUkdPX0ZDUjIpOwotCQl1ZGVsYXkoMTApOwotCQlNQUNJT19PVVQ4KEtFWUxBUkdPX0dQSU9fRVhUSU5UXzArMHhiLCAwKTsKLQkJKHZvaWQpTUFDSU9fSU44KEtFWUxBUkdPX0dQSU9fRVhUSU5UXzArMHhiKTsKLQkJdWRlbGF5KDEwKTsKLQkJTUFDSU9fT1VUOChLRVlMQVJHT19HUElPX0VYVElOVF8wKzB4YSwgMHgyOCk7Ci0JCSh2b2lkKU1BQ0lPX0lOOChLRVlMQVJHT19HUElPX0VYVElOVF8wKzB4YSk7Ci0JCXVkZWxheSgxMCk7Ci0JCU1BQ0lPX09VVDgoS0VZTEFSR09fR1BJT19FWFRJTlRfMCsweGQsIDB4MjgpOwotCQkodm9pZClNQUNJT19JTjgoS0VZTEFSR09fR1BJT19FWFRJTlRfMCsweGQpOwotCQl1ZGVsYXkoMTApOwotCQlNQUNJT19PVVQ4KEtFWUxBUkdPX0dQSU9fMCsweGQsIDB4MjgpOwotCQkodm9pZClNQUNJT19JTjgoS0VZTEFSR09fR1BJT18wKzB4ZCk7Ci0JCXVkZWxheSgxMCk7Ci0JCU1BQ0lPX09VVDgoS0VZTEFSR09fR1BJT18wKzB4ZSwgMHgyOCk7Ci0JCSh2b2lkKU1BQ0lPX0lOOChLRVlMQVJHT19HUElPXzArMHhlKTsKLQkJVU5MT0NLKGZsYWdzKTsKLQkJdWRlbGF5KDEwKTsKLQkJTUFDSU9fT1VUMzIoMHgxYzAwMCwgMCk7Ci0JCW1kZWxheSgxKTsKLQkJTUFDSU9fT1VUOCgweDFhM2UwLCAweDQxKTsKLQkJKHZvaWQpTUFDSU9fSU44KDB4MWEzZTApOwotCQl1ZGVsYXkoMTApOwotCQlMT0NLKGZsYWdzKTsKLQkJTUFDSU9fQklTKEtFWUxBUkdPX0ZDUjIsIEtMMl9DQVJEU0VMXzE2KTsKLQkJKHZvaWQpTUFDSU9fSU4zMihLRVlMQVJHT19GQ1IyKTsKLQkJVU5MT0NLKGZsYWdzKTsKLQkJbWRlbGF5KDEwMCk7Ci0KLQkJbWFjaW8tPmZsYWdzIHw9IE1BQ0lPX0ZMQUdfQUlSUE9SVF9PTjsKLQl9IGVsc2UgewotCQlMT0NLKGZsYWdzKTsKLQkJTUFDSU9fQklDKEtFWUxBUkdPX0ZDUjIsIEtMMl9DQVJEU0VMXzE2KTsKLQkJKHZvaWQpTUFDSU9fSU4zMihLRVlMQVJHT19GQ1IyKTsKLQkJTUFDSU9fT1VUOChLTF9HUElPX0FJUlBPUlRfMCwgMCk7Ci0JCU1BQ0lPX09VVDgoS0xfR1BJT19BSVJQT1JUXzEsIDApOwotCQlNQUNJT19PVVQ4KEtMX0dQSU9fQUlSUE9SVF8yLCAwKTsKLQkJTUFDSU9fT1VUOChLTF9HUElPX0FJUlBPUlRfMywgMCk7Ci0JCU1BQ0lPX09VVDgoS0xfR1BJT19BSVJQT1JUXzQsIDApOwotCQkodm9pZClNQUNJT19JTjgoS0xfR1BJT19BSVJQT1JUXzQpOwotCQlVTkxPQ0soZmxhZ3MpOwotCi0JCW1hY2lvLT5mbGFncyAmPSB+TUFDSU9fRkxBR19BSVJQT1JUX09OOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19TTVAKLXN0YXRpYyBsb25nCi1jb3JlOTlfcmVzZXRfY3B1KHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgbG9uZyBwYXJhbSwgbG9uZyB2YWx1ZSkKLXsKLQl1bnNpZ25lZCBpbnQgcmVzZXRfaW8gPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IG1hY2lvX2NoaXAqIG1hY2lvOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSogbnA7Ci0JY29uc3QgaW50IGRmbHRfcmVzZXRfbGluZXNbXSA9IHsJS0xfR1BJT19SRVNFVF9DUFUwLAotCQkJCQkJS0xfR1BJT19SRVNFVF9DUFUxLAotCQkJCQkJS0xfR1BJT19SRVNFVF9DUFUyLAotCQkJCQkJS0xfR1BJT19SRVNFVF9DUFUzIH07Ci0KLQltYWNpbyA9ICZtYWNpb19jaGlwc1swXTsKLQlpZiAobWFjaW8tPnR5cGUgIT0gbWFjaW9fa2V5bGFyZ28pCi0JCXJldHVybiAtRU5PREVWOwotCi0JbnAgPSBmaW5kX3BhdGhfZGV2aWNlKCIvY3B1cyIpOwotCWlmIChucCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlmb3IgKG5wID0gbnAtPmNoaWxkOyBucCAhPSBOVUxMOyBucCA9IG5wLT5zaWJsaW5nKSB7Ci0JCXUzMiogbnVtID0gKHUzMiAqKWdldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOwotCQl1MzIqIHJzdCA9ICh1MzIgKilnZXRfcHJvcGVydHkobnAsICJzb2Z0LXJlc2V0IiwgTlVMTCk7Ci0JCWlmIChudW0gPT0gTlVMTCB8fCByc3QgPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlpZiAocGFyYW0gPT0gKm51bSkgewotCQkJcmVzZXRfaW8gPSAqcnN0OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKG5wID09IE5VTEwgfHwgcmVzZXRfaW8gPT0gMCkKLQkJcmVzZXRfaW8gPSBkZmx0X3Jlc2V0X2xpbmVzW3BhcmFtXTsKLQotCUxPQ0soZmxhZ3MpOwotCU1BQ0lPX09VVDgocmVzZXRfaW8sIEtFWUxBUkdPX0dQSU9fT1VUUFVUX0VOQUJMRSk7Ci0JKHZvaWQpTUFDSU9fSU44KHJlc2V0X2lvKTsKLQl1ZGVsYXkoMSk7Ci0JTUFDSU9fT1VUOChyZXNldF9pbywgMCk7Ci0JKHZvaWQpTUFDSU9fSU44KHJlc2V0X2lvKTsKLQlVTkxPQ0soZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1NNUCAqLwotCi1zdGF0aWMgbG9uZwotY29yZTk5X3VzYl9lbmFibGUoc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCBsb25nIHBhcmFtLCBsb25nIHZhbHVlKQotewotCXN0cnVjdCBtYWNpb19jaGlwKiBtYWNpbzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWNoYXIqIHByb3A7Ci0JaW50IG51bWJlcjsKLQl1MzIgcmVnOwotCi0JbWFjaW8gPSAmbWFjaW9fY2hpcHNbMF07Ci0JaWYgKG1hY2lvLT50eXBlICE9IG1hY2lvX2tleWxhcmdvICYmIG1hY2lvLT50eXBlICE9IG1hY2lvX3BhbmdlYSAmJgotCSAgICBtYWNpby0+dHlwZSAhPSBtYWNpb19pbnRyZXBpZCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlwcm9wID0gKGNoYXIgKilnZXRfcHJvcGVydHkobm9kZSwgIkFBUEwsY2xvY2staWQiLCBOVUxMKTsKLQlpZiAoIXByb3ApCi0JCXJldHVybiAtRU5PREVWOwotCWlmIChzdHJuY21wKHByb3AsICJ1c2IwdTA0OCIsIDgpID09IDApCi0JCW51bWJlciA9IDA7Ci0JZWxzZSBpZiAoc3RybmNtcChwcm9wLCAidXNiMXUxNDgiLCA4KSA9PSAwKQotCQludW1iZXIgPSAyOwotCWVsc2UgaWYgKHN0cm5jbXAocHJvcCwgInVzYjJ1MjQ4IiwgOCkgPT0gMCkKLQkJbnVtYmVyID0gNDsKLQllbHNlCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyogU29ycnkgZm9yIHRoZSBicnV0ZS1mb3JjZSBsb2NraW5nLCBidXQgdGhpcyBpcyBvbmx5IHVzZWQgZHVyaW5nCi0JICogc2xlZXAgYW5kIHRoZSB0aW1pbmcgc2VlbSB0byBiZSBjcml0aWNhbAotCSAqLwotCUxPQ0soZmxhZ3MpOwotCWlmICh2YWx1ZSkgewotCQkvKiBUdXJuIE9OICovCi0JCWlmIChudW1iZXIgPT0gMCkgewotCQkJTUFDSU9fQklDKEtFWUxBUkdPX0ZDUjAsIChLTDBfVVNCMF9QQURfU1VTUEVORDAgfCBLTDBfVVNCMF9QQURfU1VTUEVORDEpKTsKLQkJCSh2b2lkKU1BQ0lPX0lOMzIoS0VZTEFSR09fRkNSMCk7Ci0JCQlVTkxPQ0soZmxhZ3MpOwotCQkJbWRlbGF5KDEpOwotCQkJTE9DSyhmbGFncyk7Ci0JCQlNQUNJT19CSVMoS0VZTEFSR09fRkNSMCwgS0wwX1VTQjBfQ0VMTF9FTkFCTEUpOwotCQl9IGVsc2UgaWYgKG51bWJlciA9PSAyKSB7Ci0JCQlNQUNJT19CSUMoS0VZTEFSR09fRkNSMCwgKEtMMF9VU0IxX1BBRF9TVVNQRU5EMCB8IEtMMF9VU0IxX1BBRF9TVVNQRU5EMSkpOwotCQkJVU5MT0NLKGZsYWdzKTsKLQkJCSh2b2lkKU1BQ0lPX0lOMzIoS0VZTEFSR09fRkNSMCk7Ci0JCQltZGVsYXkoMSk7Ci0JCQlMT0NLKGZsYWdzKTsKLQkJCU1BQ0lPX0JJUyhLRVlMQVJHT19GQ1IwLCBLTDBfVVNCMV9DRUxMX0VOQUJMRSk7Ci0JCX0gZWxzZSBpZiAobnVtYmVyID09IDQpIHsKLQkJCU1BQ0lPX0JJQyhLRVlMQVJHT19GQ1IxLCAoS0wxX1VTQjJfUEFEX1NVU1BFTkQwIHwgS0wxX1VTQjJfUEFEX1NVU1BFTkQxKSk7Ci0JCQlVTkxPQ0soZmxhZ3MpOwotCQkJKHZvaWQpTUFDSU9fSU4zMihLRVlMQVJHT19GQ1IxKTsKLQkJCW1kZWxheSgxKTsKLQkJCUxPQ0soZmxhZ3MpOwotCQkJTUFDSU9fQklTKEtFWUxBUkdPX0ZDUjEsIEtMMV9VU0IyX0NFTExfRU5BQkxFKTsKLQkJfQotCQlpZiAobnVtYmVyIDwgNCkgewotCQkJcmVnID0gTUFDSU9fSU4zMihLRVlMQVJHT19GQ1I0KTsKLQkJCXJlZyAmPQl+KEtMNF9QT1JUX1dBS0VVUF9FTkFCTEUobnVtYmVyKSB8IEtMNF9QT1JUX1JFU1VNRV9XQUtFX0VOKG51bWJlcikgfAotCQkJCUtMNF9QT1JUX0NPTk5FQ1RfV0FLRV9FTihudW1iZXIpIHwgS0w0X1BPUlRfRElTQ09OTkVDVF9XQUtFX0VOKG51bWJlcikpOwotCQkJcmVnICY9CX4oS0w0X1BPUlRfV0FLRVVQX0VOQUJMRShudW1iZXIrMSkgfCBLTDRfUE9SVF9SRVNVTUVfV0FLRV9FTihudW1iZXIrMSkgfAotCQkJCUtMNF9QT1JUX0NPTk5FQ1RfV0FLRV9FTihudW1iZXIrMSkgfCBLTDRfUE9SVF9ESVNDT05ORUNUX1dBS0VfRU4obnVtYmVyKzEpKTsKLQkJCU1BQ0lPX09VVDMyKEtFWUxBUkdPX0ZDUjQsIHJlZyk7Ci0JCQkodm9pZClNQUNJT19JTjMyKEtFWUxBUkdPX0ZDUjQpOwotCQkJdWRlbGF5KDEwKTsKLQkJfSBlbHNlIHsKLQkJCXJlZyA9IE1BQ0lPX0lOMzIoS0VZTEFSR09fRkNSMyk7Ci0JCQlyZWcgJj0JfihLTDNfSVRfUE9SVF9XQUtFVVBfRU5BQkxFKDApIHwgS0wzX0lUX1BPUlRfUkVTVU1FX1dBS0VfRU4oMCkgfAotCQkJCUtMM19JVF9QT1JUX0NPTk5FQ1RfV0FLRV9FTigwKSB8IEtMM19JVF9QT1JUX0RJU0NPTk5FQ1RfV0FLRV9FTigwKSk7Ci0JCQlyZWcgJj0JfihLTDNfSVRfUE9SVF9XQUtFVVBfRU5BQkxFKDEpIHwgS0wzX0lUX1BPUlRfUkVTVU1FX1dBS0VfRU4oMSkgfAotCQkJCUtMM19JVF9QT1JUX0NPTk5FQ1RfV0FLRV9FTigxKSB8IEtMM19JVF9QT1JUX0RJU0NPTk5FQ1RfV0FLRV9FTigxKSk7Ci0JCQlNQUNJT19PVVQzMihLRVlMQVJHT19GQ1IzLCByZWcpOwotCQkJKHZvaWQpTUFDSU9fSU4zMihLRVlMQVJHT19GQ1IzKTsKLQkJCXVkZWxheSgxMCk7Ci0JCX0KLQkJaWYgKG1hY2lvLT50eXBlID09IG1hY2lvX2ludHJlcGlkKSB7Ci0JCQkvKiB3YWl0IGZvciBjbG9jayBzdG9wcGVkIGJpdHMgdG8gY2xlYXIgKi8KLQkJCXUzMiB0ZXN0MCA9IDAsIHRlc3QxID0gMDsKLQkJCXUzMiBzdGF0dXMwLCBzdGF0dXMxOwotCQkJaW50IHRpbWVvdXQgPSAxMDAwOwotCi0JCQlVTkxPQ0soZmxhZ3MpOwotCQkJc3dpdGNoIChudW1iZXIpIHsKLQkJCWNhc2UgMDoKLQkJCQl0ZXN0MCA9IFVOSV9OX0NMT0NLX1NUT1BQRURfVVNCMDsKLQkJCQl0ZXN0MSA9IFVOSV9OX0NMT0NLX1NUT1BQRURfVVNCMFBDSTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQl0ZXN0MCA9IFVOSV9OX0NMT0NLX1NUT1BQRURfVVNCMTsKLQkJCQl0ZXN0MSA9IFVOSV9OX0NMT0NLX1NUT1BQRURfVVNCMVBDSTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNDoKLQkJCQl0ZXN0MCA9IFVOSV9OX0NMT0NLX1NUT1BQRURfVVNCMjsKLQkJCQl0ZXN0MSA9IFVOSV9OX0NMT0NLX1NUT1BQRURfVVNCMlBDSTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRvIHsKLQkJCQlpZiAoLS10aW1lb3V0IDw9IDApIHsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICJjb3JlOTlfdXNiX2VuYWJsZTogIgotCQkJCQkgICAgICAgIlRpbWVvdXQgd2FpdGluZyBmb3IgY2xvY2tzXG4iKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCW1kZWxheSgxKTsKLQkJCQlzdGF0dXMwID0gVU5fSU4oVU5JX05fQ0xPQ0tfU1RPUF9TVEFUVVMwKTsKLQkJCQlzdGF0dXMxID0gVU5fSU4oVU5JX05fQ0xPQ0tfU1RPUF9TVEFUVVMxKTsKLQkJCX0gd2hpbGUgKChzdGF0dXMwICYgdGVzdDApIHwgKHN0YXR1czEgJiB0ZXN0MSkpOwotCQkJTE9DSyhmbGFncyk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBUdXJuIE9GRiAqLwotCQlpZiAobnVtYmVyIDwgNCkgewotCQkJcmVnID0gTUFDSU9fSU4zMihLRVlMQVJHT19GQ1I0KTsKLQkJCXJlZyB8PQlLTDRfUE9SVF9XQUtFVVBfRU5BQkxFKG51bWJlcikgfCBLTDRfUE9SVF9SRVNVTUVfV0FLRV9FTihudW1iZXIpIHwKLQkJCQlLTDRfUE9SVF9DT05ORUNUX1dBS0VfRU4obnVtYmVyKSB8IEtMNF9QT1JUX0RJU0NPTk5FQ1RfV0FLRV9FTihudW1iZXIpOwotCQkJcmVnIHw9CUtMNF9QT1JUX1dBS0VVUF9FTkFCTEUobnVtYmVyKzEpIHwgS0w0X1BPUlRfUkVTVU1FX1dBS0VfRU4obnVtYmVyKzEpIHwKLQkJCQlLTDRfUE9SVF9DT05ORUNUX1dBS0VfRU4obnVtYmVyKzEpIHwgS0w0X1BPUlRfRElTQ09OTkVDVF9XQUtFX0VOKG51bWJlcisxKTsKLQkJCU1BQ0lPX09VVDMyKEtFWUxBUkdPX0ZDUjQsIHJlZyk7Ci0JCQkodm9pZClNQUNJT19JTjMyKEtFWUxBUkdPX0ZDUjQpOwotCQkJdWRlbGF5KDEpOwotCQl9IGVsc2UgewotCQkJcmVnID0gTUFDSU9fSU4zMihLRVlMQVJHT19GQ1IzKTsKLQkJCXJlZyB8PQlLTDNfSVRfUE9SVF9XQUtFVVBfRU5BQkxFKDApIHwgS0wzX0lUX1BPUlRfUkVTVU1FX1dBS0VfRU4oMCkgfAotCQkJCUtMM19JVF9QT1JUX0NPTk5FQ1RfV0FLRV9FTigwKSB8IEtMM19JVF9QT1JUX0RJU0NPTk5FQ1RfV0FLRV9FTigwKTsKLQkJCXJlZyB8PQlLTDNfSVRfUE9SVF9XQUtFVVBfRU5BQkxFKDEpIHwgS0wzX0lUX1BPUlRfUkVTVU1FX1dBS0VfRU4oMSkgfAotCQkJCUtMM19JVF9QT1JUX0NPTk5FQ1RfV0FLRV9FTigxKSB8IEtMM19JVF9QT1JUX0RJU0NPTk5FQ1RfV0FLRV9FTigxKTsKLQkJCU1BQ0lPX09VVDMyKEtFWUxBUkdPX0ZDUjMsIHJlZyk7Ci0JCQkodm9pZClNQUNJT19JTjMyKEtFWUxBUkdPX0ZDUjMpOwotCQkJdWRlbGF5KDEpOwotCQl9Ci0JCWlmIChudW1iZXIgPT0gMCkgewotCQkJaWYgKG1hY2lvLT50eXBlICE9IG1hY2lvX2ludHJlcGlkKQotCQkJCU1BQ0lPX0JJQyhLRVlMQVJHT19GQ1IwLCBLTDBfVVNCMF9DRUxMX0VOQUJMRSk7Ci0JCQkodm9pZClNQUNJT19JTjMyKEtFWUxBUkdPX0ZDUjApOwotCQkJdWRlbGF5KDEpOwotCQkJTUFDSU9fQklTKEtFWUxBUkdPX0ZDUjAsIChLTDBfVVNCMF9QQURfU1VTUEVORDAgfCBLTDBfVVNCMF9QQURfU1VTUEVORDEpKTsKLQkJCSh2b2lkKU1BQ0lPX0lOMzIoS0VZTEFSR09fRkNSMCk7Ci0JCX0gZWxzZSBpZiAobnVtYmVyID09IDIpIHsKLQkJCWlmIChtYWNpby0+dHlwZSAhPSBtYWNpb19pbnRyZXBpZCkKLQkJCQlNQUNJT19CSUMoS0VZTEFSR09fRkNSMCwgS0wwX1VTQjFfQ0VMTF9FTkFCTEUpOwotCQkJKHZvaWQpTUFDSU9fSU4zMihLRVlMQVJHT19GQ1IwKTsKLQkJCXVkZWxheSgxKTsKLQkJCU1BQ0lPX0JJUyhLRVlMQVJHT19GQ1IwLCAoS0wwX1VTQjFfUEFEX1NVU1BFTkQwIHwgS0wwX1VTQjFfUEFEX1NVU1BFTkQxKSk7Ci0JCQkodm9pZClNQUNJT19JTjMyKEtFWUxBUkdPX0ZDUjApOwotCQl9IGVsc2UgaWYgKG51bWJlciA9PSA0KSB7Ci0JCQl1ZGVsYXkoMSk7Ci0JCQlNQUNJT19CSVMoS0VZTEFSR09fRkNSMSwgKEtMMV9VU0IyX1BBRF9TVVNQRU5EMCB8IEtMMV9VU0IyX1BBRF9TVVNQRU5EMSkpOwotCQkJKHZvaWQpTUFDSU9fSU4zMihLRVlMQVJHT19GQ1IxKTsKLQkJfQotCQl1ZGVsYXkoMSk7Ci0JfQotCVVOTE9DSyhmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcKLWNvcmU5OV9maXJld2lyZV9lbmFibGUoc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCBsb25nIHBhcmFtLCBsb25nIHZhbHVlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IG1hY2lvX2NoaXAqIG1hY2lvOwotCi0JbWFjaW8gPSAmbWFjaW9fY2hpcHNbMF07Ci0JaWYgKG1hY2lvLT50eXBlICE9IG1hY2lvX2tleWxhcmdvICYmIG1hY2lvLT50eXBlICE9IG1hY2lvX3BhbmdlYSAmJgotCSAgICBtYWNpby0+dHlwZSAhPSBtYWNpb19pbnRyZXBpZCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKCEobWFjaW8tPmZsYWdzICYgTUFDSU9fRkxBR19GV19TVVBQT1JURUQpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCUxPQ0soZmxhZ3MpOwotCWlmICh2YWx1ZSkgewotCQlVTl9CSVMoVU5JX05fQ0xPQ0tfQ05UTCwgVU5JX05fQ0xPQ0tfQ05UTF9GVyk7Ci0JCSh2b2lkKVVOX0lOKFVOSV9OX0NMT0NLX0NOVEwpOwotCX0gZWxzZSB7Ci0JCVVOX0JJQyhVTklfTl9DTE9DS19DTlRMLCBVTklfTl9DTE9DS19DTlRMX0ZXKTsKLQkJKHZvaWQpVU5fSU4oVU5JX05fQ0xPQ0tfQ05UTCk7Ci0JfQotCVVOTE9DSyhmbGFncyk7Ci0JbWRlbGF5KDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nCi1jb3JlOTlfZmlyZXdpcmVfY2FibGVfcG93ZXIoc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCBsb25nIHBhcmFtLCBsb25nIHZhbHVlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IG1hY2lvX2NoaXAqIG1hY2lvOwotCi0JLyogVHJpY2s6IHdlIGFsbG93IE5VTEwgbm9kZSAqLwotCWlmICgocG1hY19tYi5ib2FyZF9mbGFncyAmIFBNQUNfTUJfSEFTX0ZXX1BPV0VSKSA9PSAwKQotCSAgICAJcmV0dXJuIC1FTk9ERVY7Ci0JbWFjaW8gPSAmbWFjaW9fY2hpcHNbMF07Ci0JaWYgKG1hY2lvLT50eXBlICE9IG1hY2lvX2tleWxhcmdvICYmIG1hY2lvLT50eXBlICE9IG1hY2lvX3BhbmdlYSAmJgotCSAgICBtYWNpby0+dHlwZSAhPSBtYWNpb19pbnRyZXBpZCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKCEobWFjaW8tPmZsYWdzICYgTUFDSU9fRkxBR19GV19TVVBQT1JURUQpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCUxPQ0soZmxhZ3MpOwotCWlmICh2YWx1ZSkgewotCQlNQUNJT19PVVQ4KEtMX0dQSU9fRldfQ0FCTEVfUE9XRVIgLCAwKTsKLQkJTUFDSU9fSU44KEtMX0dQSU9fRldfQ0FCTEVfUE9XRVIpOwotCQl1ZGVsYXkoMTApOwotCX0gZWxzZSB7Ci0JCU1BQ0lPX09VVDgoS0xfR1BJT19GV19DQUJMRV9QT1dFUiAsIDQpOwotCQlNQUNJT19JTjgoS0xfR1BJT19GV19DQUJMRV9QT1dFUik7IHVkZWxheSgxMCk7Ci0JfQotCVVOTE9DSyhmbGFncyk7Ci0JbWRlbGF5KDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nCi1pbnRyZXBpZF9hYWNrX2RlbGF5X2VuYWJsZShzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUsIGxvbmcgcGFyYW0sIGxvbmcgdmFsdWUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotICAgIAlpZiAodW5pbm9ydGhfcmV2IDwgMHhkMikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlMT0NLKGZsYWdzKTsKLQlpZiAocGFyYW0pCi0JCVVOX0JJUyhVTklfTl9BQUNLX0RFTEFZLCBVTklfTl9BQUNLX0RFTEFZX0VOQUJMRSk7Ci0JZWxzZQotCQlVTl9CSUMoVU5JX05fQUFDS19ERUxBWSwgVU5JX05fQUFDS19ERUxBWV9FTkFCTEUpOwotCVVOTE9DSyhmbGFncyk7Ci0KLSAgICAJcmV0dXJuIDA7Ci19Ci0KLQotI2VuZGlmIC8qIENPTkZJR19QT1dFUjQgKi8KLQotc3RhdGljIGxvbmcKLWNvcmU5OV9yZWFkX2dwaW8oc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCBsb25nIHBhcmFtLCBsb25nIHZhbHVlKQotewotCXN0cnVjdCBtYWNpb19jaGlwKiBtYWNpbyA9ICZtYWNpb19jaGlwc1swXTsKLQotCXJldHVybiBNQUNJT19JTjgocGFyYW0pOwotfQotCi0KLXN0YXRpYyBsb25nCi1jb3JlOTlfd3JpdGVfZ3BpbyhzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUsIGxvbmcgcGFyYW0sIGxvbmcgdmFsdWUpCi17Ci0Jc3RydWN0IG1hY2lvX2NoaXAqIG1hY2lvID0gJm1hY2lvX2NoaXBzWzBdOwotCi0JTUFDSU9fT1VUOChwYXJhbSwgKHU4KSh2YWx1ZSAmIDB4ZmYpKTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19QT1dFUjQKLQotc3RhdGljIGxvbmcKLWc1X2dtYWNfZW5hYmxlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgbG9uZyBwYXJhbSwgbG9uZyB2YWx1ZSkKLXsKLQlzdHJ1Y3QgbWFjaW9fY2hpcCogbWFjaW8gPSAmbWFjaW9fY2hpcHNbMF07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1OCBwYnVzLCBwaWQ7Ci0KLQlMT0NLKGZsYWdzKTsKLQlpZiAodmFsdWUpIHsKLQkJTUFDSU9fQklTKEtFWUxBUkdPX0ZDUjEsIEsyX0ZDUjFfR01BQ19DTEtfRU5BQkxFKTsKLQkJbWIoKTsKLQkJazJfc2tpcGxpc3RbMF0gPSBOVUxMOwotCX0gZWxzZSB7Ci0JCWsyX3NraXBsaXN0WzBdID0gbm9kZTsKLQkJbWIoKTsKLQkJTUFDSU9fQklDKEtFWUxBUkdPX0ZDUjEsIEsyX0ZDUjFfR01BQ19DTEtfRU5BQkxFKTsKLQl9Ci0JCi0JVU5MT0NLKGZsYWdzKTsKLQltZGVsYXkoMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcKLWc1X2Z3X2VuYWJsZShzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUsIGxvbmcgcGFyYW0sIGxvbmcgdmFsdWUpCi17Ci0Jc3RydWN0IG1hY2lvX2NoaXAqIG1hY2lvID0gJm1hY2lvX2NoaXBzWzBdOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlMT0NLKGZsYWdzKTsKLQlpZiAodmFsdWUpIHsKLQkJTUFDSU9fQklTKEtFWUxBUkdPX0ZDUjEsIEsyX0ZDUjFfRldfQ0xLX0VOQUJMRSk7Ci0JCW1iKCk7Ci0JCWsyX3NraXBsaXN0WzFdID0gTlVMTDsKLQl9IGVsc2UgewotCQlrMl9za2lwbGlzdFsxXSA9IG5vZGU7Ci0JCW1iKCk7Ci0JCU1BQ0lPX0JJQyhLRVlMQVJHT19GQ1IxLCBLMl9GQ1IxX0ZXX0NMS19FTkFCTEUpOwotCX0KLQkKLQlVTkxPQ0soZmxhZ3MpOwotCW1kZWxheSgxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZwotZzVfbXBpY19lbmFibGUoc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCBsb25nIHBhcmFtLCBsb25nIHZhbHVlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAobm9kZS0+cGFyZW50ID09IE5VTEwgfHwgc3RyY21wKG5vZGUtPnBhcmVudC0+bmFtZSwgInUzIikpCi0JCXJldHVybiAwOwotCi0JTE9DSyhmbGFncyk7Ci0JVU5fQklTKFUzX1RPR0dMRV9SRUcsIFUzX01QSUNfUkVTRVQgfCBVM19NUElDX09VVFBVVF9FTkFCTEUpOwotCVVOTE9DSyhmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19TTVAKLXN0YXRpYyBsb25nCi1nNV9yZXNldF9jcHUoc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCBsb25nIHBhcmFtLCBsb25nIHZhbHVlKQotewotCXVuc2lnbmVkIGludCByZXNldF9pbyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgbWFjaW9fY2hpcCogbWFjaW87Ci0Jc3RydWN0IGRldmljZV9ub2RlKiBucDsKLQotCW1hY2lvID0gJm1hY2lvX2NoaXBzWzBdOwotCWlmIChtYWNpby0+dHlwZSAhPSBtYWNpb19rZXlsYXJnbzIpCi0JCXJldHVybiAtRU5PREVWOwotCi0JbnAgPSBmaW5kX3BhdGhfZGV2aWNlKCIvY3B1cyIpOwotCWlmIChucCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlmb3IgKG5wID0gbnAtPmNoaWxkOyBucCAhPSBOVUxMOyBucCA9IG5wLT5zaWJsaW5nKSB7Ci0JCXUzMiogbnVtID0gKHUzMiAqKWdldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOwotCQl1MzIqIHJzdCA9ICh1MzIgKilnZXRfcHJvcGVydHkobnAsICJzb2Z0LXJlc2V0IiwgTlVMTCk7Ci0JCWlmIChudW0gPT0gTlVMTCB8fCByc3QgPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlpZiAocGFyYW0gPT0gKm51bSkgewotCQkJcmVzZXRfaW8gPSAqcnN0OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKG5wID09IE5VTEwgfHwgcmVzZXRfaW8gPT0gMCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlMT0NLKGZsYWdzKTsKLQlNQUNJT19PVVQ4KHJlc2V0X2lvLCBLRVlMQVJHT19HUElPX09VVFBVVF9FTkFCTEUpOwotCSh2b2lkKU1BQ0lPX0lOOChyZXNldF9pbyk7Ci0JdWRlbGF5KDEpOwotCU1BQ0lPX09VVDgocmVzZXRfaW8sIDApOwotCSh2b2lkKU1BQ0lPX0lOOChyZXNldF9pbyk7Ci0JVU5MT0NLKGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KLQotLyoKLSAqIFRoaXMgY2FuIGJlIGNhbGxlZCBmcm9tIHBtYWNfc21wIHNvIGlzbid0IHN0YXRpYwotICoKLSAqIFRoaXMgdGFrZXMgdGhlIHNlY29uZCBDUFUgb2ZmIHRoZSBidXMgb24gZHVhbCBDUFUgbWFjaGluZXMKLSAqIHJ1bm5pbmcgVVAKLSAqLwotdm9pZCBnNV9waHlfZGlzYWJsZV9jcHUxKHZvaWQpCi17Ci0JVU5fT1VUKFUzX0FQSV9QSFlfQ09ORklHXzEsIDApOwotfQotCi0jZW5kaWYgLyogQ09ORklHX1BPV0VSNCAqLwotCi0jaWZuZGVmIENPTkZJR19QT1dFUjQKLQotc3RhdGljIHZvaWQKLWtleWxhcmdvX3NodXRkb3duKHN0cnVjdCBtYWNpb19jaGlwKiBtYWNpbywgaW50IHNsZWVwX21vZGUpCi17Ci0JdTMyIHRlbXA7Ci0KLQlpZiAoc2xlZXBfbW9kZSkgewotCQltZGVsYXkoMSk7Ci0JCU1BQ0lPX0JJUyhLRVlMQVJHT19GQ1IwLCBLTDBfVVNCX1JFRl9TVVNQRU5EKTsKLQkJKHZvaWQpTUFDSU9fSU4zMihLRVlMQVJHT19GQ1IwKTsKLQkJbWRlbGF5KDEpOwotCX0KLQotCU1BQ0lPX0JJQyhLRVlMQVJHT19GQ1IwLEtMMF9TQ0NBX0VOQUJMRSB8IEtMMF9TQ0NCX0VOQUJMRSB8Ci0JCQkJS0wwX1NDQ19DRUxMX0VOQUJMRSB8Ci0JCSAgICAgIAkJS0wwX0lSREFfRU5BQkxFIHwgS0wwX0lSREFfQ0xLMzJfRU5BQkxFIHwKLQkJICAgICAgCQlLTDBfSVJEQV9DTEsxOV9FTkFCTEUpOwotCi0JTUFDSU9fQklDKEtFWUxBUkdPX01CQ1IsIEtMX01CQ1JfTUIwX0RFVl9NQVNLKTsKLQlNQUNJT19CSVMoS0VZTEFSR09fTUJDUiwgS0xfTUJDUl9NQjBfSURFX0VOQUJMRSk7Ci0KLQlNQUNJT19CSUMoS0VZTEFSR09fRkNSMSwKLQkJS0wxX0FVRElPX1NFTF8yMk1DTEsgfCBLTDFfQVVESU9fQ0xLX0VOQUJMRV9CSVQgfAotCQlLTDFfQVVESU9fQ0xLX09VVF9FTkFCTEUgfCBLTDFfQVVESU9fQ0VMTF9FTkFCTEUgfAotCQlLTDFfSTJTMF9DRUxMX0VOQUJMRSB8IEtMMV9JMlMwX0NMS19FTkFCTEVfQklUIHwKLQkJS0wxX0kyUzBfRU5BQkxFIHwgS0wxX0kyUzFfQ0VMTF9FTkFCTEUgfAotCQlLTDFfSTJTMV9DTEtfRU5BQkxFX0JJVCB8IEtMMV9JMlMxX0VOQUJMRSB8Ci0JCUtMMV9FSURFMF9FTkFCTEUgfCBLTDFfRUlERTBfUkVTRVRfTiB8Ci0JCUtMMV9FSURFMV9FTkFCTEUgfCBLTDFfRUlERTFfUkVTRVRfTiB8Ci0JCUtMMV9VSURFX0VOQUJMRSk7Ci0KLQlNQUNJT19CSVMoS0VZTEFSR09fRkNSMiwgS0wyX0FMVF9EQVRBX09VVCk7Ci0gCU1BQ0lPX0JJQyhLRVlMQVJHT19GQ1IyLCBLTDJfSU9CVVNfRU5BQkxFKTsKLQotCXRlbXAgPSBNQUNJT19JTjMyKEtFWUxBUkdPX0ZDUjMpOwotCWlmIChtYWNpby0+cmV2ID49IDIpIHsKLQkJdGVtcCB8PSBLTDNfU0hVVERPV05fUExMMlg7Ci0JCWlmIChzbGVlcF9tb2RlKQotCQkJdGVtcCB8PSBLTDNfU0hVVERPV05fUExMX1RPVEFMOwotCX0KLQotCXRlbXAgfD0gS0wzX1NIVVRET1dOX1BMTEtXNiB8IEtMM19TSFVURE9XTl9QTExLVzQgfAotCQlLTDNfU0hVVERPV05fUExMS1czNTsKLQlpZiAoc2xlZXBfbW9kZSkKLQkJdGVtcCB8PSBLTDNfU0hVVERPV05fUExMS1cxMjsKLQl0ZW1wICY9IH4oS0wzX0NMSzY2X0VOQUJMRSB8IEtMM19DTEs0OV9FTkFCTEUgfCBLTDNfQ0xLNDVfRU5BQkxFCi0JCXwgS0wzX0NMSzMxX0VOQUJMRSB8IEtMM19JMlMxX0NMSzE4X0VOQUJMRSB8IEtMM19JMlMwX0NMSzE4X0VOQUJMRSk7Ci0JaWYgKHNsZWVwX21vZGUpCi0JCXRlbXAgJj0gfihLTDNfVElNRVJfQ0xLMThfRU5BQkxFIHwgS0wzX1ZJQV9DTEsxNl9FTkFCTEUpOwotCU1BQ0lPX09VVDMyKEtFWUxBUkdPX0ZDUjMsIHRlbXApOwotCi0JLyogRmx1c2ggcG9zdGVkIHdyaXRlcyAmIHdhaXQgYSBiaXQgKi8KLQkodm9pZClNQUNJT19JTjMyKEtFWUxBUkdPX0ZDUjApOyBtZGVsYXkoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wYW5nZWFfc2h1dGRvd24oc3RydWN0IG1hY2lvX2NoaXAqIG1hY2lvLCBpbnQgc2xlZXBfbW9kZSkKLXsKLQl1MzIgdGVtcDsKLQotCU1BQ0lPX0JJQyhLRVlMQVJHT19GQ1IwLEtMMF9TQ0NBX0VOQUJMRSB8IEtMMF9TQ0NCX0VOQUJMRSB8Ci0JCQkJS0wwX1NDQ19DRUxMX0VOQUJMRSB8Ci0JCQkJS0wwX1VTQjBfQ0VMTF9FTkFCTEUgfCBLTDBfVVNCMV9DRUxMX0VOQUJMRSk7Ci0KLQlNQUNJT19CSUMoS0VZTEFSR09fRkNSMSwKLQkJS0wxX0FVRElPX1NFTF8yMk1DTEsgfCBLTDFfQVVESU9fQ0xLX0VOQUJMRV9CSVQgfAotCQlLTDFfQVVESU9fQ0xLX09VVF9FTkFCTEUgfCBLTDFfQVVESU9fQ0VMTF9FTkFCTEUgfAotCQlLTDFfSTJTMF9DRUxMX0VOQUJMRSB8IEtMMV9JMlMwX0NMS19FTkFCTEVfQklUIHwKLQkJS0wxX0kyUzBfRU5BQkxFIHwgS0wxX0kyUzFfQ0VMTF9FTkFCTEUgfAotCQlLTDFfSTJTMV9DTEtfRU5BQkxFX0JJVCB8IEtMMV9JMlMxX0VOQUJMRSB8Ci0JCUtMMV9VSURFX0VOQUJMRSk7Ci0JaWYgKHBtYWNfbWIuYm9hcmRfZmxhZ3MgJiBQTUFDX01CX01PQklMRSkKLQkJTUFDSU9fQklDKEtFWUxBUkdPX0ZDUjEsIEtMMV9VSURFX1JFU0VUX04pOwotCi0JTUFDSU9fQklTKEtFWUxBUkdPX0ZDUjIsIEtMMl9BTFRfREFUQV9PVVQpOwotCi0JdGVtcCA9IE1BQ0lPX0lOMzIoS0VZTEFSR09fRkNSMyk7Ci0JdGVtcCB8PSBLTDNfU0hVVERPV05fUExMS1c2IHwgS0wzX1NIVVRET1dOX1BMTEtXNCB8Ci0JCUtMM19TSFVURE9XTl9QTExLVzM1OwotCXRlbXAgJj0gfihLTDNfQ0xLNDlfRU5BQkxFIHwgS0wzX0NMSzQ1X0VOQUJMRSB8IEtMM19DTEszMV9FTkFCTEUKLQkJfCBLTDNfSTJTMF9DTEsxOF9FTkFCTEUgfCBLTDNfSTJTMV9DTEsxOF9FTkFCTEUpOwotCWlmIChzbGVlcF9tb2RlKQotCQl0ZW1wICY9IH4oS0wzX1ZJQV9DTEsxNl9FTkFCTEUgfCBLTDNfVElNRVJfQ0xLMThfRU5BQkxFKTsKLQlNQUNJT19PVVQzMihLRVlMQVJHT19GQ1IzLCB0ZW1wKTsKLQotCS8qIEZsdXNoIHBvc3RlZCB3cml0ZXMgJiB3YWl0IGEgYml0ICovCi0JKHZvaWQpTUFDSU9fSU4zMihLRVlMQVJHT19GQ1IwKTsgbWRlbGF5KDEpOwotfQotCi1zdGF0aWMgdm9pZAotaW50cmVwaWRfc2h1dGRvd24oc3RydWN0IG1hY2lvX2NoaXAqIG1hY2lvLCBpbnQgc2xlZXBfbW9kZSkKLXsKLQl1MzIgdGVtcDsKLQotCU1BQ0lPX0JJQyhLRVlMQVJHT19GQ1IwLEtMMF9TQ0NBX0VOQUJMRSB8IEtMMF9TQ0NCX0VOQUJMRSB8Ci0JCSAgS0wwX1NDQ19DRUxMX0VOQUJMRSk7Ci0KLQlNQUNJT19CSUMoS0VZTEFSR09fRkNSMSwKLQkJICAvKktMMV9VU0IyX0NFTExfRU5BQkxFIHwqLwotCQlLTDFfSTJTMF9DRUxMX0VOQUJMRSB8IEtMMV9JMlMwX0NMS19FTkFCTEVfQklUIHwKLQkJS0wxX0kyUzBfRU5BQkxFIHwgS0wxX0kyUzFfQ0VMTF9FTkFCTEUgfAotCQlLTDFfSTJTMV9DTEtfRU5BQkxFX0JJVCB8IEtMMV9JMlMxX0VOQUJMRSk7Ci0JaWYgKHBtYWNfbWIuYm9hcmRfZmxhZ3MgJiBQTUFDX01CX01PQklMRSkKLQkJTUFDSU9fQklDKEtFWUxBUkdPX0ZDUjEsIEtMMV9VSURFX1JFU0VUX04pOwotCi0JdGVtcCA9IE1BQ0lPX0lOMzIoS0VZTEFSR09fRkNSMyk7Ci0JdGVtcCAmPSB+KEtMM19DTEs0OV9FTkFCTEUgfCBLTDNfQ0xLNDVfRU5BQkxFIHwKLQkJICBLTDNfSTJTMV9DTEsxOF9FTkFCTEUgfCBLTDNfSTJTMF9DTEsxOF9FTkFCTEUpOwotCWlmIChzbGVlcF9tb2RlKQotCQl0ZW1wICY9IH4oS0wzX1RJTUVSX0NMSzE4X0VOQUJMRSB8IEtMM19JVF9WSUFfQ0xLMzJfRU5BQkxFKTsKLQlNQUNJT19PVVQzMihLRVlMQVJHT19GQ1IzLCB0ZW1wKTsKLQotCS8qIEZsdXNoIHBvc3RlZCB3cml0ZXMgJiB3YWl0IGEgYml0ICovCi0JKHZvaWQpTUFDSU9fSU4zMihLRVlMQVJHT19GQ1IwKTsKLQltZGVsYXkoMTApOwotfQotCi0KLXZvaWQgcG1hY190d2Vha19jbG9ja19zcHJlYWRpbmcoaW50IGVuYWJsZSkKLXsKLQlzdHJ1Y3QgbWFjaW9fY2hpcCogbWFjaW8gPSAmbWFjaW9fY2hpcHNbMF07Ci0KLQkvKiBIYWNrIGZvciBkb2luZyBjbG9jayBzcHJlYWRpbmcgb24gc29tZSBtYWNoaW5lcyBQb3dlckJvb2tzIGFuZAotCSAqIGlCb29rcy4gVGhpcyBpbXBsZW1lbnRzIHRoZSAicGxhdGZvcm0tZG8tY2xvY2tzcHJlYWRpbmciIE9GCi0JICogcHJvcGVydHkgYXMgZGVjb2RlZCBtYW51YWxseSBvbiB2YXJpb3VzIG1vZGVscy4gRm9yIHNhZmV0eSwgd2UgYWxzbwotCSAqIGNoZWNrIHRoZSBwcm9kdWN0IElEIGluIHRoZSBkZXZpY2UtdHJlZSBpbiBjYXNlcyB3ZSdsbCB3aGFjayB0aGUgaTJjCi0JICogY2hpcCB0byBtYWtlIHJlYXNvbmFibHkgc3VyZSB3ZSB3b24ndCBzZXQgd3JvbmcgdmFsdWVzIGluIHRoZXJlCi0JICoKLQkgKiBPZiBjb3Vyc2UsIHVsdGltYXRlbHksIHdlIGhhdmUgdG8gaW1wbGVtZW50IGEgcmVhbCBwYXJzZXIgZm9yCi0JICogdGhlIHBsYXRmb3JtLWRvLSogc3R1ZmYuLi4KLQkgKi8KLQotCWlmIChtYWNpby0+dHlwZSA9PSBtYWNpb19pbnRyZXBpZCkgewotCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNsb2NrID0KLQkJCW9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvdW5pLW5AZjgwMDAwMDAvaHctY2xvY2siKTsKLQkJaWYgKGNsb2NrICYmIGdldF9wcm9wZXJ0eShjbG9jaywgInBsYXRmb3JtLWRvLWNsb2Nrc3ByZWFkaW5nIiwKLQkJCQkJICBOVUxMKSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXNhYmxpbmcgY2xvY2sgc3ByZWFkaW5nIG9uIEludHJlcGlkIgotCQkJICAgICAgICIgQVNJQ1xuIiwgZW5hYmxlID8gIkVuIiA6ICJEaXMiKTsKLQkJCWlmIChlbmFibGUpCi0JCQkJVU5fT1VUKFVOSV9OX0NMT0NLX1NQUkVBRElORywgMik7Ci0JCQllbHNlCi0JCQkJVU5fT1VUKFVOSV9OX0NMT0NLX1NQUkVBRElORywgMCk7Ci0JCQltZGVsYXkoNDApOwotCQl9Ci0JCW9mX25vZGVfcHV0KGNsb2NrKTsKLQl9Ci0KLQl3aGlsZSAobWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlckJvb2s1LDIiKSB8fAotCSAgICAgICBtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyQm9vazUsMyIpIHx8Ci0JICAgICAgIG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rNiwyIikgfHwKLQkgICAgICAgbWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlckJvb2s2LDMiKSkgewotCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnVpMmMgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiaTJjIik7Ci0JCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHQgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiZGV2aWNlLXRyZWUiKTsKLQkJdTggYnVmZmVyWzldOwotCQl1MzIgKnByb2R1Y3RJRDsKLQkJaW50IGksIHJjLCBjaGFuZ2VkID0gMDsKLQotCQlpZiAoZHQgPT0gTlVMTCkKLQkJCWJyZWFrOwotCQlwcm9kdWN0SUQgPSAodTMyICopZ2V0X3Byb3BlcnR5KGR0LCAicGlkIyIsIE5VTEwpOwotCQlpZiAocHJvZHVjdElEID09IE5VTEwpCi0JCQlicmVhazsKLQkJd2hpbGUodWkyYykgewotCQkJc3RydWN0IGRldmljZV9ub2RlICpwID0gb2ZfZ2V0X3BhcmVudCh1aTJjKTsKLQkJCWlmIChwICYmICFzdHJjbXAocC0+bmFtZSwgInVuaS1uIikpCi0JCQkJYnJlYWs7Ci0JCQl1aTJjID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUodWkyYywgImkyYyIpOwotCQl9Ci0JCWlmICh1aTJjID09IE5VTEwpCi0JCQlicmVhazsKLQkJREJHKCJUcnlpbmcgdG8gYnVtcCBjbG9jayBzcGVlZCBmb3IgUElEOiAlMDh4Li4uXG4iLCAqcHJvZHVjdElEKTsKLQkJcmMgPSBwbWFjX2xvd19pMmNfb3Blbih1aTJjLCAxKTsKLQkJaWYgKHJjICE9IDApCi0JCQlicmVhazsKLQkJcG1hY19sb3dfaTJjX3NldG1vZGUodWkyYywgcG1hY19sb3dfaTJjX21vZGVfY29tYmluZWQpOwotCQlyYyA9IHBtYWNfbG93X2kyY194ZmVyKHVpMmMsIDB4ZDIgfCBwbWFjX2xvd19pMmNfcmVhZCwgMHg4MCwgYnVmZmVyLCA5KTsKLQkJREJHKCJyZWFkIHJlc3VsdDogJWQsIiwgcmMpOwotCQlpZiAocmMgIT0gMCkgewotCQkJcG1hY19sb3dfaTJjX2Nsb3NlKHVpMmMpOwotCQkJYnJlYWs7Ci0JCX0KLQkJZm9yIChpPTA7IGk8OTsgaSsrKQotCQkJREJHKCIgJTAyeCIsIGJ1ZmZlcltpXSk7Ci0JCURCRygiXG4iKTsKLQotCQlzd2l0Y2goKnByb2R1Y3RJRCkgewotCQljYXNlIDB4MTE4MjoJLyogQWxCb29rIDEyIiByZXYgMiAqLwotCQljYXNlIDB4MTE4MzoJLyogaUJvb2sgRzQgMTIiICovCi0JCQlidWZmZXJbMF0gPSAoYnVmZmVyWzBdICYgMHg4ZikgfCAweDcwOwotCQkJYnVmZmVyWzJdID0gKGJ1ZmZlclsyXSAmIDB4N2YpIHwgMHgwMDsKLQkJCWJ1ZmZlcls1XSA9IChidWZmZXJbNV0gJiAweDgwKSB8IDB4MzE7Ci0JCQlidWZmZXJbNl0gPSAoYnVmZmVyWzZdICYgMHg0MCkgfCAweGIwOwotCQkJYnVmZmVyWzddID0gKGJ1ZmZlcls3XSAmIDB4MDApIHwgKGVuYWJsZSA/IDB4YzAgOiAweGJhKTsKLQkJCWJ1ZmZlcls4XSA9IChidWZmZXJbOF0gJiAweDAwKSB8IDB4MzA7Ci0JCQljaGFuZ2VkID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIDB4MzE0MjoJLyogQWxCb29rIDE1IiAoQVRJIE0xMCkgKi8KLQkJY2FzZSAweDMxNDM6CS8qIEFsQm9vayAxNyIgKEFUSSBNMTApICovCi0JCQlidWZmZXJbMF0gPSAoYnVmZmVyWzBdICYgMHhhZikgfCAweDUwOwotCQkJYnVmZmVyWzJdID0gKGJ1ZmZlclsyXSAmIDB4N2YpIHwgMHgwMDsKLQkJCWJ1ZmZlcls1XSA9IChidWZmZXJbNV0gJiAweDgwKSB8IDB4MzE7Ci0JCQlidWZmZXJbNl0gPSAoYnVmZmVyWzZdICYgMHg0MCkgfCAweGIwOwotCQkJYnVmZmVyWzddID0gKGJ1ZmZlcls3XSAmIDB4MDApIHwgKGVuYWJsZSA/IDB4ZDAgOiAweGMwKTsKLQkJCWJ1ZmZlcls4XSA9IChidWZmZXJbOF0gJiAweDAwKSB8IDB4MzA7Ci0JCQljaGFuZ2VkID0gMTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJREJHKCJpMmMtaHdjbG9jazogTWFjaGluZSBtb2RlbCBub3QgaGFuZGxlZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoIWNoYW5nZWQpIHsKLQkJCXBtYWNfbG93X2kyY19jbG9zZSh1aTJjKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzYWJsaW5nIGNsb2NrIHNwcmVhZGluZyBvbiBpMmMgY2xvY2sgY2hpcFxuIiwKLQkJICAgICAgIGVuYWJsZSA/ICJFbiIgOiAiRGlzIik7Ci0JCXBtYWNfbG93X2kyY19zZXRtb2RlKHVpMmMsIHBtYWNfbG93X2kyY19tb2RlX3N0ZHN1Yik7Ci0JCXJjID0gcG1hY19sb3dfaTJjX3hmZXIodWkyYywgMHhkMiB8IHBtYWNfbG93X2kyY193cml0ZSwgMHg4MCwgYnVmZmVyLCA5KTsKLQkJREJHKCJ3cml0ZSByZXN1bHQ6ICVkLCIsIHJjKTsKLQkJcG1hY19sb3dfaTJjX3NldG1vZGUodWkyYywgcG1hY19sb3dfaTJjX21vZGVfY29tYmluZWQpOwotCQlyYyA9IHBtYWNfbG93X2kyY194ZmVyKHVpMmMsIDB4ZDIgfCBwbWFjX2xvd19pMmNfcmVhZCwgMHg4MCwgYnVmZmVyLCA5KTsKLQkJREJHKCJyZWFkIHJlc3VsdDogJWQsIiwgcmMpOwotCQlpZiAocmMgIT0gMCkgewotCQkJcG1hY19sb3dfaTJjX2Nsb3NlKHVpMmMpOwotCQkJYnJlYWs7Ci0JCX0KLQkJZm9yIChpPTA7IGk8OTsgaSsrKQotCQkJREJHKCIgJTAyeCIsIGJ1ZmZlcltpXSk7Ci0JCXBtYWNfbG93X2kyY19jbG9zZSh1aTJjKTsKLQkJYnJlYWs7Ci0JfQotfQotCi0KLXN0YXRpYyBpbnQKLWNvcmU5OV9zbGVlcCh2b2lkKQotewotCXN0cnVjdCBtYWNpb19jaGlwKiBtYWNpbzsKLQlpbnQgaTsKLQotCW1hY2lvID0gJm1hY2lvX2NoaXBzWzBdOwotCWlmIChtYWNpby0+dHlwZSAhPSBtYWNpb19rZXlsYXJnbyAmJiBtYWNpby0+dHlwZSAhPSBtYWNpb19wYW5nZWEgJiYKLQkgICAgbWFjaW8tPnR5cGUgIT0gbWFjaW9faW50cmVwaWQpCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyogV2UgcG93ZXIgb2ZmIHRoZSB3aXJlbGVzcyBzbG90IGluIGNhc2UgaXQgd2FzIG5vdCBkb25lCi0JICogYnkgdGhlIGRyaXZlci4gV2UgZG9uJ3QgcG93ZXIgaXQgb24gYXV0b21hdGljYWxseSBob3dldmVyCi0JICovCi0JaWYgKG1hY2lvLT5mbGFncyAmIE1BQ0lPX0ZMQUdfQUlSUE9SVF9PTikKLQkJY29yZTk5X2FpcnBvcnRfZW5hYmxlKG1hY2lvLT5vZl9ub2RlLCAwLCAwKTsKLQotCS8qIFdlIHBvd2VyIG9mZiB0aGUgRlcgY2FibGUuIFNob3VsZCBiZSBkb25lIGJ5IHRoZSBkcml2ZXIuLi4gKi8KLQlpZiAobWFjaW8tPmZsYWdzICYgTUFDSU9fRkxBR19GV19TVVBQT1JURUQpIHsKLQkJY29yZTk5X2ZpcmV3aXJlX2VuYWJsZShOVUxMLCAwLCAwKTsKLQkJY29yZTk5X2ZpcmV3aXJlX2NhYmxlX3Bvd2VyKE5VTEwsIDAsIDApOwotCX0KLQotCS8qIFdlIG1ha2Ugc3VyZSBpbnQuIG1vZGVtIGlzIG9mZiAoaW4gY2FzZSBkcml2ZXIgbG9zdCBpdCkgKi8KLQlpZiAobWFjaW8tPnR5cGUgPT0gbWFjaW9fa2V5bGFyZ28pCi0JCWNvcmU5OV9tb2RlbV9lbmFibGUobWFjaW8tPm9mX25vZGUsIDAsIDApOwotCWVsc2UKLQkJcGFuZ2VhX21vZGVtX2VuYWJsZShtYWNpby0+b2Zfbm9kZSwgMCwgMCk7Ci0KLQkvKiBXZSBtYWtlIHN1cmUgdGhlIHNvdW5kIGlzIG9mZiBhcyB3ZWxsICovCi0JY29yZTk5X3NvdW5kX2NoaXBfZW5hYmxlKG1hY2lvLT5vZl9ub2RlLCAwLCAwKTsKLQotCS8qCi0JICogU2F2ZSB2YXJpb3VzIGJpdHMgb2YgS2V5TGFyZ28KLQkgKi8KLQotCS8qIFNhdmUgdGhlIHN0YXRlIG9mIHRoZSB2YXJpb3VzIEdQSU9zICovCi0Jc2F2ZV9ncGlvX2xldmVsc1swXSA9IE1BQ0lPX0lOMzIoS0VZTEFSR09fR1BJT19MRVZFTFMwKTsKLQlzYXZlX2dwaW9fbGV2ZWxzWzFdID0gTUFDSU9fSU4zMihLRVlMQVJHT19HUElPX0xFVkVMUzEpOwotCWZvciAoaT0wOyBpPEtFWUxBUkdPX0dQSU9fRVhUSU5UX0NOVDsgaSsrKQotCQlzYXZlX2dwaW9fZXh0aW50W2ldID0gTUFDSU9fSU44KEtFWUxBUkdPX0dQSU9fRVhUSU5UXzAraSk7Ci0JZm9yIChpPTA7IGk8S0VZTEFSR09fR1BJT19DTlQ7IGkrKykKLQkJc2F2ZV9ncGlvX25vcm1hbFtpXSA9IE1BQ0lPX0lOOChLRVlMQVJHT19HUElPXzAraSk7Ci0KLQkvKiBTYXZlIHRoZSBGQ1JzICovCi0JaWYgKG1hY2lvLT50eXBlID09IG1hY2lvX2tleWxhcmdvKQotCQlzYXZlX21iY3IgPSBNQUNJT19JTjMyKEtFWUxBUkdPX01CQ1IpOwotCXNhdmVfZmNyWzBdID0gTUFDSU9fSU4zMihLRVlMQVJHT19GQ1IwKTsKLQlzYXZlX2ZjclsxXSA9IE1BQ0lPX0lOMzIoS0VZTEFSR09fRkNSMSk7Ci0Jc2F2ZV9mY3JbMl0gPSBNQUNJT19JTjMyKEtFWUxBUkdPX0ZDUjIpOwotCXNhdmVfZmNyWzNdID0gTUFDSU9fSU4zMihLRVlMQVJHT19GQ1IzKTsKLQlzYXZlX2Zjcls0XSA9IE1BQ0lPX0lOMzIoS0VZTEFSR09fRkNSNCk7Ci0JaWYgKG1hY2lvLT50eXBlID09IG1hY2lvX3BhbmdlYSB8fCBtYWNpby0+dHlwZSA9PSBtYWNpb19pbnRyZXBpZCkKLQkJc2F2ZV9mY3JbNV0gPSBNQUNJT19JTjMyKEtFWUxBUkdPX0ZDUjUpOwotCi0JLyogU2F2ZSBzdGF0ZSAmIGNvbmZpZyBvZiBEQkRNQSBjaGFubmVscyAqLwotCWRiZG1hX3NhdmUobWFjaW8sIHNhdmVfZGJkbWEpOwotCi0JLyoKLQkgKiBUdXJuIG9mZiBhcyBtdWNoIGFzIHdlIGNhbgotCSAqLwotCWlmIChtYWNpby0+dHlwZSA9PSBtYWNpb19wYW5nZWEpCi0JCXBhbmdlYV9zaHV0ZG93bihtYWNpbywgMSk7Ci0JZWxzZSBpZiAobWFjaW8tPnR5cGUgPT0gbWFjaW9faW50cmVwaWQpCi0JCWludHJlcGlkX3NodXRkb3duKG1hY2lvLCAxKTsKLQllbHNlIGlmIChtYWNpby0+dHlwZSA9PSBtYWNpb19rZXlsYXJnbykKLQkJa2V5bGFyZ29fc2h1dGRvd24obWFjaW8sIDEpOwotCi0JLyoKLQkgKiBQdXQgdGhlIGhvc3QgYnJpZGdlIHRvIHNsZWVwCi0JICovCi0KLQlzYXZlX3VuaW5fY2xvY2tfY3RsID0gVU5fSU4oVU5JX05fQ0xPQ0tfQ05UTCk7Ci0JLyogTm90ZTogZG8gbm90IHN3aXRjaCBHTUFDIG9mZiwgZHJpdmVyIGRvZXMgaXQgd2hlbiBuZWNlc3NhcnksIFdPTCBtdXN0IGtlZXAgaXQKLQkgKiBlbmFibGVkICEKLQkgKi8KLQlVTl9PVVQoVU5JX05fQ0xPQ0tfQ05UTCwgc2F2ZV91bmluX2Nsb2NrX2N0bCAmCi0JICAgICAgIH4oLypVTklfTl9DTE9DS19DTlRMX0dNQUN8Ki9VTklfTl9DTE9DS19DTlRMX0ZXLyp8VU5JX05fQ0xPQ0tfQ05UTF9QQ0kqLykpOwotCXVkZWxheSgxMDApOwotCVVOX09VVChVTklfTl9IV0lOSVRfU1RBVEUsIFVOSV9OX0hXSU5JVF9TVEFURV9TTEVFUElORyk7Ci0JVU5fT1VUKFVOSV9OX1BPV0VSX01HVCwgVU5JX05fUE9XRVJfTUdUX1NMRUVQKTsKLQltZGVsYXkoMTApOwotCi0JLyoKLQkgKiBGSVhNRTogQSBiaXQgb2YgYmxhY2sgbWFnaWMgd2l0aCBPcGVuUElDIChkb24ndCBhc2sgbWUgd2h5KQotCSAqLwotCWlmIChwbWFjX21iLm1vZGVsX2lkID09IFBNQUNfVFlQRV9TQVdUT09USCkgewotCQlNQUNJT19CSVMoMHg1MDZlMCwgMHgwMDQwMDAwMCk7Ci0JCU1BQ0lPX0JJUygweDUwNmUwLCAweDgwMDAwMDAwKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvcmU5OV93YWtlX3VwKHZvaWQpCi17Ci0Jc3RydWN0IG1hY2lvX2NoaXAqIG1hY2lvOwotCWludCBpOwotCi0JbWFjaW8gPSAmbWFjaW9fY2hpcHNbMF07Ci0JaWYgKG1hY2lvLT50eXBlICE9IG1hY2lvX2tleWxhcmdvICYmIG1hY2lvLT50eXBlICE9IG1hY2lvX3BhbmdlYSAmJgotCSAgICBtYWNpby0+dHlwZSAhPSBtYWNpb19pbnRyZXBpZCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKgotCSAqIFdha2V1cCB0aGUgaG9zdCBicmlkZ2UKLQkgKi8KLQlVTl9PVVQoVU5JX05fUE9XRVJfTUdULCBVTklfTl9QT1dFUl9NR1RfTk9STUFMKTsKLQl1ZGVsYXkoMTApOwotCVVOX09VVChVTklfTl9IV0lOSVRfU1RBVEUsIFVOSV9OX0hXSU5JVF9TVEFURV9SVU5OSU5HKTsKLQl1ZGVsYXkoMTApOwotCi0JLyoKLQkgKiBSZXN0b3JlIEtleUxhcmdvCi0JICovCi0KLQlpZiAobWFjaW8tPnR5cGUgPT0gbWFjaW9fa2V5bGFyZ28pIHsKLQkJTUFDSU9fT1VUMzIoS0VZTEFSR09fTUJDUiwgc2F2ZV9tYmNyKTsKLQkJKHZvaWQpTUFDSU9fSU4zMihLRVlMQVJHT19NQkNSKTsgdWRlbGF5KDEwKTsKLQl9Ci0JTUFDSU9fT1VUMzIoS0VZTEFSR09fRkNSMCwgc2F2ZV9mY3JbMF0pOwotCSh2b2lkKU1BQ0lPX0lOMzIoS0VZTEFSR09fRkNSMCk7IHVkZWxheSgxMCk7Ci0JTUFDSU9fT1VUMzIoS0VZTEFSR09fRkNSMSwgc2F2ZV9mY3JbMV0pOwotCSh2b2lkKU1BQ0lPX0lOMzIoS0VZTEFSR09fRkNSMSk7IHVkZWxheSgxMCk7Ci0JTUFDSU9fT1VUMzIoS0VZTEFSR09fRkNSMiwgc2F2ZV9mY3JbMl0pOwotCSh2b2lkKU1BQ0lPX0lOMzIoS0VZTEFSR09fRkNSMik7IHVkZWxheSgxMCk7Ci0JTUFDSU9fT1VUMzIoS0VZTEFSR09fRkNSMywgc2F2ZV9mY3JbM10pOwotCSh2b2lkKU1BQ0lPX0lOMzIoS0VZTEFSR09fRkNSMyk7IHVkZWxheSgxMCk7Ci0JTUFDSU9fT1VUMzIoS0VZTEFSR09fRkNSNCwgc2F2ZV9mY3JbNF0pOwotCSh2b2lkKU1BQ0lPX0lOMzIoS0VZTEFSR09fRkNSNCk7IHVkZWxheSgxMCk7Ci0JaWYgKG1hY2lvLT50eXBlID09IG1hY2lvX3BhbmdlYSB8fCBtYWNpby0+dHlwZSA9PSBtYWNpb19pbnRyZXBpZCkgewotCQlNQUNJT19PVVQzMihLRVlMQVJHT19GQ1I1LCBzYXZlX2Zjcls1XSk7Ci0JCSh2b2lkKU1BQ0lPX0lOMzIoS0VZTEFSR09fRkNSNSk7IHVkZWxheSgxMCk7Ci0JfQotCi0JZGJkbWFfcmVzdG9yZShtYWNpbywgc2F2ZV9kYmRtYSk7Ci0KLQlNQUNJT19PVVQzMihLRVlMQVJHT19HUElPX0xFVkVMUzAsIHNhdmVfZ3Bpb19sZXZlbHNbMF0pOwotCU1BQ0lPX09VVDMyKEtFWUxBUkdPX0dQSU9fTEVWRUxTMSwgc2F2ZV9ncGlvX2xldmVsc1sxXSk7Ci0JZm9yIChpPTA7IGk8S0VZTEFSR09fR1BJT19FWFRJTlRfQ05UOyBpKyspCi0JCU1BQ0lPX09VVDgoS0VZTEFSR09fR1BJT19FWFRJTlRfMCtpLCBzYXZlX2dwaW9fZXh0aW50W2ldKTsKLQlmb3IgKGk9MDsgaTxLRVlMQVJHT19HUElPX0NOVDsgaSsrKQotCQlNQUNJT19PVVQ4KEtFWUxBUkdPX0dQSU9fMCtpLCBzYXZlX2dwaW9fbm9ybWFsW2ldKTsKLQotCS8qIEZJWE1FIG1vcmUgYmxhY2sgbWFnaWMgd2l0aCBPcGVuUElDIC4uLiAqLwotCWlmIChwbWFjX21iLm1vZGVsX2lkID09IFBNQUNfVFlQRV9TQVdUT09USCkgewotCQlNQUNJT19CSUMoMHg1MDZlMCwgMHgwMDQwMDAwMCk7Ci0JCU1BQ0lPX0JJQygweDUwNmUwLCAweDgwMDAwMDAwKTsKLQl9Ci0KLQlVTl9PVVQoVU5JX05fQ0xPQ0tfQ05UTCwgc2F2ZV91bmluX2Nsb2NrX2N0bCk7Ci0JdWRlbGF5KDEwMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcKLWNvcmU5OV9zbGVlcF9zdGF0ZShzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUsIGxvbmcgcGFyYW0sIGxvbmcgdmFsdWUpCi17Ci0JLyogUGFyYW0gPT0gMSBtZWFucyB0byBlbnRlciB0aGUgImZha2Ugc2xlZXAiIG1vZGUgdGhhdCBpcwotCSAqIHVzZWQgZm9yIENQVSBzcGVlZCBzd2l0Y2gKLQkgKi8KLQlpZiAocGFyYW0gPT0gMSkgewotCQlpZiAodmFsdWUgPT0gMSkgewotCQkJVU5fT1VUKFVOSV9OX0hXSU5JVF9TVEFURSwgVU5JX05fSFdJTklUX1NUQVRFX1NMRUVQSU5HKTsKLQkJCVVOX09VVChVTklfTl9QT1dFUl9NR1QsIFVOSV9OX1BPV0VSX01HVF9JRExFMik7Ci0JCX0gZWxzZSB7Ci0JCQlVTl9PVVQoVU5JX05fUE9XRVJfTUdULCBVTklfTl9QT1dFUl9NR1RfTk9STUFMKTsKLQkJCXVkZWxheSgxMCk7Ci0JCQlVTl9PVVQoVU5JX05fSFdJTklUX1NUQVRFLCBVTklfTl9IV0lOSVRfU1RBVEVfUlVOTklORyk7Ci0JCQl1ZGVsYXkoMTApOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoKHBtYWNfbWIuYm9hcmRfZmxhZ3MgJiBQTUFDX01CX0NBTl9TTEVFUCkgPT0gMCkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCWlmICh2YWx1ZSA9PSAxKQotCQlyZXR1cm4gY29yZTk5X3NsZWVwKCk7Ci0JZWxzZSBpZiAodmFsdWUgPT0gMCkKLQkJcmV0dXJuIGNvcmU5OV93YWtlX3VwKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfUE9XRVI0ICovCi0KLXN0YXRpYyBsb25nCi1nZW5lcmljX2Rldl9jYW5fd2FrZShzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUsIGxvbmcgcGFyYW0sIGxvbmcgdmFsdWUpCi17Ci0JLyogVG9kbzogZXZlbnR1YWxseSBjaGVjayB3ZSBhcmUgcmVhbGx5IGRlYWxpbmcgd2l0aCBvbi1ib2FyZAotCSAqIHZpZGVvIGRldmljZSAuLi4KLQkgKi8KLQotCWlmIChwbWFjX21iLmJvYXJkX2ZsYWdzICYgUE1BQ19NQl9NQVlfU0xFRVApCi0JCXBtYWNfbWIuYm9hcmRfZmxhZ3MgfD0gUE1BQ19NQl9DQU5fU0xFRVA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nCi1nZW5lcmljX2dldF9tYl9pbmZvKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgbG9uZyBwYXJhbSwgbG9uZyB2YWx1ZSkKLXsKLQlzd2l0Y2gocGFyYW0pIHsKLQkJY2FzZSBQTUFDX01CX0lORk9fTU9ERUw6Ci0JCQlyZXR1cm4gcG1hY19tYi5tb2RlbF9pZDsKLQkJY2FzZSBQTUFDX01CX0lORk9fRkxBR1M6Ci0JCQlyZXR1cm4gcG1hY19tYi5ib2FyZF9mbGFnczsKLQkJY2FzZSBQTUFDX01CX0lORk9fTkFNRToKLQkJCS8qIGhhY2sgaGFjayBoYWNrLi4uIGJ1dCBzaG91bGQgd29yayAqLwotCQkJKigoY29uc3QgY2hhciAqKil2YWx1ZSkgPSBwbWFjX21iLm1vZGVsX25hbWU7Ci0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLQotLyoKLSAqIFRhYmxlIGRlZmluaXRpb25zCi0gKi8KLQotLyogVXNlZCBvbiBhbnkgbWFjaGluZQotICovCi1zdGF0aWMgc3RydWN0IGZlYXR1cmVfdGFibGVfZW50cnkgYW55X2ZlYXR1cmVzW10gPSB7Ci0JeyBQTUFDX0ZUUl9HRVRfTUJfSU5GTywJCWdlbmVyaWNfZ2V0X21iX2luZm8gfSwKLQl7IFBNQUNfRlRSX0RFVklDRV9DQU5fV0FLRSwJZ2VuZXJpY19kZXZfY2FuX3dha2UgfSwKLQl7IDAsIE5VTEwgfQotfTsKLQotI2lmbmRlZiBDT05GSUdfUE9XRVI0Ci0KLS8qIE9IYXJlIGJhc2VkIG1vdGhlcmJvYXJkcy4gQ3VycmVudGx5LCB3ZSBvbmx5IHVzZSB0aGVzZSBvbiB0aGUKLSAqIDI0MDAsMzQwMCBhbmQgMzUwMCBzZXJpZXMgcG93ZXJib29rcy4gU29tZSBvbGRlciBkZXNrdG9wcyBzZWVtCi0gKiB0byBoYXZlIGlzc3VlcyB3aXRoIHR1cm5pbmcgb24vb2ZmIHRob3NlIGFzaWMgY2VsbHMKLSAqLwotc3RhdGljIHN0cnVjdCBmZWF0dXJlX3RhYmxlX2VudHJ5IG9oYXJlX2ZlYXR1cmVzW10gPSB7Ci0JeyBQTUFDX0ZUUl9TQ0NfRU5BQkxFLAkJb2hhcmVfaHR3X3NjY19lbmFibGUgfSwKLQl7IFBNQUNfRlRSX1NXSU0zX0VOQUJMRSwJb2hhcmVfZmxvcHB5X2VuYWJsZSB9LAotCXsgUE1BQ19GVFJfTUVTSF9FTkFCTEUsCQlvaGFyZV9tZXNoX2VuYWJsZSB9LAotCXsgUE1BQ19GVFJfSURFX0VOQUJMRSwJCW9oYXJlX2lkZV9lbmFibGV9LAotCXsgUE1BQ19GVFJfSURFX1JFU0VULAkJb2hhcmVfaWRlX3Jlc2V0fSwKLQl7IFBNQUNfRlRSX1NMRUVQX1NUQVRFLAkJb2hhcmVfc2xlZXBfc3RhdGUgfSwKLQl7IDAsIE5VTEwgfQotfTsKLQotLyogSGVhdGhyb3cgZGVza3RvcCBtYWNoaW5lcyAoQmVpZ2UgRzMpLgotICogU2VwYXJhdGVkIGFzIHNvbWUgZmVhdHVyZXMgY291bGRuJ3QgYmUgcHJvcGVybHkgdGVzdGVkCi0gKiBhbmQgdGhlIHNlcmlhbCBwb3J0IGNvbnRyb2wgYml0cyBhcHBlYXIgdG8gY29uZnVzZSBpdC4KLSAqLwotc3RhdGljIHN0cnVjdCBmZWF0dXJlX3RhYmxlX2VudHJ5IGhlYXRocm93X2Rlc2t0b3BfZmVhdHVyZXNbXSA9IHsKLQl7IFBNQUNfRlRSX1NXSU0zX0VOQUJMRSwJaGVhdGhyb3dfZmxvcHB5X2VuYWJsZSB9LAotCXsgUE1BQ19GVFJfTUVTSF9FTkFCTEUsCQloZWF0aHJvd19tZXNoX2VuYWJsZSB9LAotCXsgUE1BQ19GVFJfSURFX0VOQUJMRSwJCWhlYXRocm93X2lkZV9lbmFibGUgfSwKLQl7IFBNQUNfRlRSX0lERV9SRVNFVCwJCWhlYXRocm93X2lkZV9yZXNldCB9LAotCXsgUE1BQ19GVFJfQk1BQ19FTkFCTEUsCQloZWF0aHJvd19ibWFjX2VuYWJsZSB9LAotCXsgMCwgTlVMTCB9Ci19OwotCi0vKiBIZWF0aHJvdyBiYXNlZCBsYXB0b3AsIHRoYXQgaXMgdGhlIFdhbGxzdHJlZXQgYW5kIG1haW5zdHJlZXQKLSAqIHBvd2VyYm9va3MuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgZmVhdHVyZV90YWJsZV9lbnRyeSBoZWF0aHJvd19sYXB0b3BfZmVhdHVyZXNbXSA9IHsKLQl7IFBNQUNfRlRSX1NDQ19FTkFCTEUsCQlvaGFyZV9odHdfc2NjX2VuYWJsZSB9LAotCXsgUE1BQ19GVFJfTU9ERU1fRU5BQkxFLAloZWF0aHJvd19tb2RlbV9lbmFibGUgfSwKLQl7IFBNQUNfRlRSX1NXSU0zX0VOQUJMRSwJaGVhdGhyb3dfZmxvcHB5X2VuYWJsZSB9LAotCXsgUE1BQ19GVFJfTUVTSF9FTkFCTEUsCQloZWF0aHJvd19tZXNoX2VuYWJsZSB9LAotCXsgUE1BQ19GVFJfSURFX0VOQUJMRSwJCWhlYXRocm93X2lkZV9lbmFibGUgfSwKLQl7IFBNQUNfRlRSX0lERV9SRVNFVCwJCWhlYXRocm93X2lkZV9yZXNldCB9LAotCXsgUE1BQ19GVFJfQk1BQ19FTkFCTEUsCQloZWF0aHJvd19ibWFjX2VuYWJsZSB9LAotCXsgUE1BQ19GVFJfU09VTkRfQ0hJUF9FTkFCTEUsCWhlYXRocm93X3NvdW5kX2VuYWJsZSB9LAotCXsgUE1BQ19GVFJfU0xFRVBfU1RBVEUsCQloZWF0aHJvd19zbGVlcF9zdGF0ZSB9LAotCXsgMCwgTlVMTCB9Ci19OwotCi0vKiBQYWRkaW5ndG9uIGJhc2VkIG1hY2hpbmVzCi0gKiBUaGUgbG9tYmFyZCAoMTAxKSBwb3dlcmJvb2ssIGZpcnN0IGlNYWMgbW9kZWxzLCBCJlcgRzMgYW5kIFlpa2VzIEc0LgotICovCi1zdGF0aWMgc3RydWN0IGZlYXR1cmVfdGFibGVfZW50cnkgcGFkZGluZ3Rvbl9mZWF0dXJlc1tdID0gewotCXsgUE1BQ19GVFJfU0NDX0VOQUJMRSwJCW9oYXJlX2h0d19zY2NfZW5hYmxlIH0sCi0JeyBQTUFDX0ZUUl9NT0RFTV9FTkFCTEUsCWhlYXRocm93X21vZGVtX2VuYWJsZSB9LAotCXsgUE1BQ19GVFJfU1dJTTNfRU5BQkxFLAloZWF0aHJvd19mbG9wcHlfZW5hYmxlIH0sCi0JeyBQTUFDX0ZUUl9NRVNIX0VOQUJMRSwJCWhlYXRocm93X21lc2hfZW5hYmxlIH0sCi0JeyBQTUFDX0ZUUl9JREVfRU5BQkxFLAkJaGVhdGhyb3dfaWRlX2VuYWJsZSB9LAotCXsgUE1BQ19GVFJfSURFX1JFU0VULAkJaGVhdGhyb3dfaWRlX3Jlc2V0IH0sCi0JeyBQTUFDX0ZUUl9CTUFDX0VOQUJMRSwJCWhlYXRocm93X2JtYWNfZW5hYmxlIH0sCi0JeyBQTUFDX0ZUUl9TT1VORF9DSElQX0VOQUJMRSwJaGVhdGhyb3dfc291bmRfZW5hYmxlIH0sCi0JeyBQTUFDX0ZUUl9TTEVFUF9TVEFURSwJCWhlYXRocm93X3NsZWVwX3N0YXRlIH0sCi0JeyAwLCBOVUxMIH0KLX07Ci0KLS8qIENvcmU5OSAmIE1hY1JJU0MgMiBtYWNoaW5lcyAoYWxsIG1hY2hpbmVzIHJlbGVhc2VkIHNpbmNlIHRoZQotICogaUJvb2sgKGluY2x1ZGVkKSwgdGhhdCBpcyBhbGwgQUdQIG1hY2hpbmVzLCBleGNlcHQgcGFuZ2VhCi0gKiBjaGlwc2V0LiBUaGUgcGFuZ2VhIGNoaXBzZXQgaXMgdGhlICJjb21ibyIgVW5pTm9ydGgvS2V5TGFyZ28KLSAqIHVzZWQgb24gaUJvb2syICYgaU1hYyAiZmxvdyBwb3dlciIuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgZmVhdHVyZV90YWJsZV9lbnRyeSBjb3JlOTlfZmVhdHVyZXNbXSA9IHsKLQl7IFBNQUNfRlRSX1NDQ19FTkFCTEUsCQljb3JlOTlfc2NjX2VuYWJsZSB9LAotCXsgUE1BQ19GVFJfTU9ERU1fRU5BQkxFLAljb3JlOTlfbW9kZW1fZW5hYmxlIH0sCi0JeyBQTUFDX0ZUUl9JREVfRU5BQkxFLAkJY29yZTk5X2lkZV9lbmFibGUgfSwKLQl7IFBNQUNfRlRSX0lERV9SRVNFVCwJCWNvcmU5OV9pZGVfcmVzZXQgfSwKLQl7IFBNQUNfRlRSX0dNQUNfRU5BQkxFLAkJY29yZTk5X2dtYWNfZW5hYmxlIH0sCi0JeyBQTUFDX0ZUUl9HTUFDX1BIWV9SRVNFVCwJY29yZTk5X2dtYWNfcGh5X3Jlc2V0IH0sCi0JeyBQTUFDX0ZUUl9TT1VORF9DSElQX0VOQUJMRSwJY29yZTk5X3NvdW5kX2NoaXBfZW5hYmxlIH0sCi0JeyBQTUFDX0ZUUl9BSVJQT1JUX0VOQUJMRSwJY29yZTk5X2FpcnBvcnRfZW5hYmxlIH0sCi0JeyBQTUFDX0ZUUl9VU0JfRU5BQkxFLAkJY29yZTk5X3VzYl9lbmFibGUgfSwKLQl7IFBNQUNfRlRSXzEzOTRfRU5BQkxFLAkJY29yZTk5X2ZpcmV3aXJlX2VuYWJsZSB9LAotCXsgUE1BQ19GVFJfMTM5NF9DQUJMRV9QT1dFUiwJY29yZTk5X2ZpcmV3aXJlX2NhYmxlX3Bvd2VyIH0sCi0JeyBQTUFDX0ZUUl9TTEVFUF9TVEFURSwJCWNvcmU5OV9zbGVlcF9zdGF0ZSB9LAotI2lmZGVmIENPTkZJR19TTVAKLQl7IFBNQUNfRlRSX1JFU0VUX0NQVSwJCWNvcmU5OV9yZXNldF9jcHUgfSwKLSNlbmRpZiAvKiBDT05GSUdfU01QICovCi0JeyBQTUFDX0ZUUl9SRUFEX0dQSU8sCQljb3JlOTlfcmVhZF9ncGlvIH0sCi0JeyBQTUFDX0ZUUl9XUklURV9HUElPLAkJY29yZTk5X3dyaXRlX2dwaW8gfSwKLQl7IDAsIE5VTEwgfQotfTsKLQotLyogUmFja01hYwotICovCi1zdGF0aWMgc3RydWN0IGZlYXR1cmVfdGFibGVfZW50cnkgcmFja21hY19mZWF0dXJlc1tdID0gewotCXsgUE1BQ19GVFJfU0NDX0VOQUJMRSwJCWNvcmU5OV9zY2NfZW5hYmxlIH0sCi0JeyBQTUFDX0ZUUl9JREVfRU5BQkxFLAkJY29yZTk5X2lkZV9lbmFibGUgfSwKLQl7IFBNQUNfRlRSX0lERV9SRVNFVCwJCWNvcmU5OV9pZGVfcmVzZXQgfSwKLQl7IFBNQUNfRlRSX0dNQUNfRU5BQkxFLAkJY29yZTk5X2dtYWNfZW5hYmxlIH0sCi0JeyBQTUFDX0ZUUl9HTUFDX1BIWV9SRVNFVCwJY29yZTk5X2dtYWNfcGh5X3Jlc2V0IH0sCi0JeyBQTUFDX0ZUUl9VU0JfRU5BQkxFLAkJY29yZTk5X3VzYl9lbmFibGUgfSwKLQl7IFBNQUNfRlRSXzEzOTRfRU5BQkxFLAkJY29yZTk5X2ZpcmV3aXJlX2VuYWJsZSB9LAotCXsgUE1BQ19GVFJfMTM5NF9DQUJMRV9QT1dFUiwJY29yZTk5X2ZpcmV3aXJlX2NhYmxlX3Bvd2VyIH0sCi0JeyBQTUFDX0ZUUl9TTEVFUF9TVEFURSwJCWNvcmU5OV9zbGVlcF9zdGF0ZSB9LAotI2lmZGVmIENPTkZJR19TTVAKLQl7IFBNQUNfRlRSX1JFU0VUX0NQVSwJCWNvcmU5OV9yZXNldF9jcHUgfSwKLSNlbmRpZiAvKiBDT05GSUdfU01QICovCi0JeyBQTUFDX0ZUUl9SRUFEX0dQSU8sCQljb3JlOTlfcmVhZF9ncGlvIH0sCi0JeyBQTUFDX0ZUUl9XUklURV9HUElPLAkJY29yZTk5X3dyaXRlX2dwaW8gfSwKLQl7IDAsIE5VTEwgfQotfTsKLQotLyogUGFuZ2VhIGZlYXR1cmVzCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgZmVhdHVyZV90YWJsZV9lbnRyeSBwYW5nZWFfZmVhdHVyZXNbXSA9IHsKLQl7IFBNQUNfRlRSX1NDQ19FTkFCTEUsCQljb3JlOTlfc2NjX2VuYWJsZSB9LAotCXsgUE1BQ19GVFJfTU9ERU1fRU5BQkxFLAlwYW5nZWFfbW9kZW1fZW5hYmxlIH0sCi0JeyBQTUFDX0ZUUl9JREVfRU5BQkxFLAkJY29yZTk5X2lkZV9lbmFibGUgfSwKLQl7IFBNQUNfRlRSX0lERV9SRVNFVCwJCWNvcmU5OV9pZGVfcmVzZXQgfSwKLQl7IFBNQUNfRlRSX0dNQUNfRU5BQkxFLAkJY29yZTk5X2dtYWNfZW5hYmxlIH0sCi0JeyBQTUFDX0ZUUl9HTUFDX1BIWV9SRVNFVCwJY29yZTk5X2dtYWNfcGh5X3Jlc2V0IH0sCi0JeyBQTUFDX0ZUUl9TT1VORF9DSElQX0VOQUJMRSwJY29yZTk5X3NvdW5kX2NoaXBfZW5hYmxlIH0sCi0JeyBQTUFDX0ZUUl9BSVJQT1JUX0VOQUJMRSwJY29yZTk5X2FpcnBvcnRfZW5hYmxlIH0sCi0JeyBQTUFDX0ZUUl9VU0JfRU5BQkxFLAkJY29yZTk5X3VzYl9lbmFibGUgfSwKLQl7IFBNQUNfRlRSXzEzOTRfRU5BQkxFLAkJY29yZTk5X2ZpcmV3aXJlX2VuYWJsZSB9LAotCXsgUE1BQ19GVFJfMTM5NF9DQUJMRV9QT1dFUiwJY29yZTk5X2ZpcmV3aXJlX2NhYmxlX3Bvd2VyIH0sCi0JeyBQTUFDX0ZUUl9TTEVFUF9TVEFURSwJCWNvcmU5OV9zbGVlcF9zdGF0ZSB9LAotCXsgUE1BQ19GVFJfUkVBRF9HUElPLAkJY29yZTk5X3JlYWRfZ3BpbyB9LAotCXsgUE1BQ19GVFJfV1JJVEVfR1BJTywJCWNvcmU5OV93cml0ZV9ncGlvIH0sCi0JeyAwLCBOVUxMIH0KLX07Ci0KLS8qIEludHJlcGlkIGZlYXR1cmVzCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgZmVhdHVyZV90YWJsZV9lbnRyeSBpbnRyZXBpZF9mZWF0dXJlc1tdID0gewotCXsgUE1BQ19GVFJfU0NDX0VOQUJMRSwJCWNvcmU5OV9zY2NfZW5hYmxlIH0sCi0JeyBQTUFDX0ZUUl9NT0RFTV9FTkFCTEUsCXBhbmdlYV9tb2RlbV9lbmFibGUgfSwKLQl7IFBNQUNfRlRSX0lERV9FTkFCTEUsCQljb3JlOTlfaWRlX2VuYWJsZSB9LAotCXsgUE1BQ19GVFJfSURFX1JFU0VULAkJY29yZTk5X2lkZV9yZXNldCB9LAotCXsgUE1BQ19GVFJfR01BQ19FTkFCTEUsCQljb3JlOTlfZ21hY19lbmFibGUgfSwKLQl7IFBNQUNfRlRSX0dNQUNfUEhZX1JFU0VULAljb3JlOTlfZ21hY19waHlfcmVzZXQgfSwKLQl7IFBNQUNfRlRSX1NPVU5EX0NISVBfRU5BQkxFLAljb3JlOTlfc291bmRfY2hpcF9lbmFibGUgfSwKLQl7IFBNQUNfRlRSX0FJUlBPUlRfRU5BQkxFLAljb3JlOTlfYWlycG9ydF9lbmFibGUgfSwKLQl7IFBNQUNfRlRSX1VTQl9FTkFCTEUsCQljb3JlOTlfdXNiX2VuYWJsZSB9LAotCXsgUE1BQ19GVFJfMTM5NF9FTkFCTEUsCQljb3JlOTlfZmlyZXdpcmVfZW5hYmxlIH0sCi0JeyBQTUFDX0ZUUl8xMzk0X0NBQkxFX1BPV0VSLAljb3JlOTlfZmlyZXdpcmVfY2FibGVfcG93ZXIgfSwKLQl7IFBNQUNfRlRSX1NMRUVQX1NUQVRFLAkJY29yZTk5X3NsZWVwX3N0YXRlIH0sCi0JeyBQTUFDX0ZUUl9SRUFEX0dQSU8sCQljb3JlOTlfcmVhZF9ncGlvIH0sCi0JeyBQTUFDX0ZUUl9XUklURV9HUElPLAkJY29yZTk5X3dyaXRlX2dwaW8gfSwKLQl7IFBNQUNfRlRSX0FBQ0tfREVMQVlfRU5BQkxFLAlpbnRyZXBpZF9hYWNrX2RlbGF5X2VuYWJsZSB9LAotCXsgMCwgTlVMTCB9Ci19OwotCi0jZWxzZSAvKiBDT05GSUdfUE9XRVI0ICovCi0KLS8qIEc1IGZlYXR1cmVzCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgZmVhdHVyZV90YWJsZV9lbnRyeSBnNV9mZWF0dXJlc1tdID0gewotCXsgUE1BQ19GVFJfR01BQ19FTkFCTEUsCQlnNV9nbWFjX2VuYWJsZSB9LAotCXsgUE1BQ19GVFJfMTM5NF9FTkFCTEUsCQlnNV9md19lbmFibGUgfSwKLQl7IFBNQUNfRlRSX0VOQUJMRV9NUElDLAkJZzVfbXBpY19lbmFibGUgfSwKLSNpZmRlZiBDT05GSUdfU01QCi0JeyBQTUFDX0ZUUl9SRVNFVF9DUFUsCQlnNV9yZXNldF9jcHUgfSwKLSNlbmRpZiAvKiBDT05GSUdfU01QICovCi0JeyBQTUFDX0ZUUl9SRUFEX0dQSU8sCQljb3JlOTlfcmVhZF9ncGlvIH0sCi0JeyBQTUFDX0ZUUl9XUklURV9HUElPLAkJY29yZTk5X3dyaXRlX2dwaW8gfSwKLQl7IDAsIE5VTEwgfQotfTsKLQotI2VuZGlmIC8qIENPTkZJR19QT1dFUjQgKi8KLQotc3RhdGljIHN0cnVjdCBwbWFjX21iX2RlZiBwbWFjX21iX2RlZnNbXSA9IHsKLSNpZm5kZWYgQ09ORklHX1BPV0VSNAotCS8qCi0JICogRGVza3RvcHMKLQkgKi8KLQotCXsJIkFBUEwsODUwMCIsCQkJIlBvd2VyTWFjIDg1MDAvODYwMCIsCi0JCVBNQUNfVFlQRV9QU1VSR0UsCQlOVUxMLAotCQkwCi0JfSwKLQl7CSJBQVBMLDk1MDAiLAkJCSJQb3dlck1hYyA5NTAwLzk2MDAiLAotCQlQTUFDX1RZUEVfUFNVUkdFLAkJTlVMTCwKLQkJMAotCX0sCi0JewkiQUFQTCw3MjAwIiwJCQkiUG93ZXJNYWMgNzIwMCIsCi0JCVBNQUNfVFlQRV9QU1VSR0UsCQlOVUxMLAotCQkwCi0JfSwKLQl7CSJBQVBMLDczMDAiLAkJCSJQb3dlck1hYyA3MjAwLzczMDAiLAotCQlQTUFDX1RZUEVfUFNVUkdFLAkJTlVMTCwKLQkJMAotCX0sCi0JewkiQUFQTCw3NTAwIiwJCQkiUG93ZXJNYWMgNzUwMCIsCi0JCVBNQUNfVFlQRV9QU1VSR0UsCQlOVUxMLAotCQkwCi0JfSwKLQl7CSJBQVBMLFNoaW5lckVTQiIsCQkiQXBwbGUgTmV0d29yayBTZXJ2ZXIiLAotCQlQTUFDX1RZUEVfQU5TLAkJCU5VTEwsCi0JCTAKLQl9LAotCXsJIkFBUEwsZTQwNyIsCQkJIkFsY2hlbXkiLAotCQlQTUFDX1RZUEVfQUxDSEVNWSwJCU5VTEwsCi0JCTAKLQl9LAotCXsJIkFBUEwsZTQxMSIsCQkJIkdhemVsbGUiLAotCQlQTUFDX1RZUEVfR0FaRUxMRSwJCU5VTEwsCi0JCTAKLQl9LAotCXsJIkFBUEwsR29zc2FtZXIiLAkJIlBvd2VyTWFjIEczIChHb3NzYW1lcikiLAotCQlQTUFDX1RZUEVfR09TU0FNRVIsCQloZWF0aHJvd19kZXNrdG9wX2ZlYXR1cmVzLAotCQkwCi0JfSwKLQl7CSJBQVBMLFBvd2VyTWFjIEczIiwJCSJQb3dlck1hYyBHMyAoU2lsaykiLAotCQlQTUFDX1RZUEVfU0lMSywJCQloZWF0aHJvd19kZXNrdG9wX2ZlYXR1cmVzLAotCQkwCi0JfSwKLQl7CSJQb3dlck1hYzEsMSIsCQkJIkJsdWUmV2hpdGUgRzMiLAotCQlQTUFDX1RZUEVfWU9TRU1JVEUsCQlwYWRkaW5ndG9uX2ZlYXR1cmVzLAotCQkwCi0JfSwKLQl7CSJQb3dlck1hYzEsMiIsCQkJIlBvd2VyTWFjIEc0IFBDSSBHcmFwaGljcyIsCi0JCVBNQUNfVFlQRV9ZSUtFUywJCXBhZGRpbmd0b25fZmVhdHVyZXMsCi0JCTAKLQl9LAotCXsJIlBvd2VyTWFjMiwxIiwJCQkiaU1hYyBGaXJlV2lyZSIsCi0JCVBNQUNfVFlQRV9GV19JTUFDLAkJY29yZTk5X2ZlYXR1cmVzLAotCQlQTUFDX01CX01BWV9TTEVFUCB8IFBNQUNfTUJfT0xEX0NPUkU5OQotCX0sCi0JewkiUG93ZXJNYWMyLDIiLAkJCSJpTWFjIEZpcmVXaXJlIiwKLQkJUE1BQ19UWVBFX0ZXX0lNQUMsCQljb3JlOTlfZmVhdHVyZXMsCi0JCVBNQUNfTUJfTUFZX1NMRUVQIHwgUE1BQ19NQl9PTERfQ09SRTk5Ci0JfSwKLQl7CSJQb3dlck1hYzMsMSIsCQkJIlBvd2VyTWFjIEc0IEFHUCBHcmFwaGljcyIsCi0JCVBNQUNfVFlQRV9TQVdUT09USCwJCWNvcmU5OV9mZWF0dXJlcywKLQkJUE1BQ19NQl9PTERfQ09SRTk5Ci0JfSwKLQl7CSJQb3dlck1hYzMsMiIsCQkJIlBvd2VyTWFjIEc0IEFHUCBHcmFwaGljcyIsCi0JCVBNQUNfVFlQRV9TQVdUT09USCwJCWNvcmU5OV9mZWF0dXJlcywKLQkJUE1BQ19NQl9NQVlfU0xFRVAgfCBQTUFDX01CX09MRF9DT1JFOTkKLQl9LAotCXsJIlBvd2VyTWFjMywzIiwJCQkiUG93ZXJNYWMgRzQgQUdQIEdyYXBoaWNzIiwKLQkJUE1BQ19UWVBFX1NBV1RPT1RILAkJY29yZTk5X2ZlYXR1cmVzLAotCQlQTUFDX01CX01BWV9TTEVFUCB8IFBNQUNfTUJfT0xEX0NPUkU5OQotCX0sCi0JewkiUG93ZXJNYWMzLDQiLAkJCSJQb3dlck1hYyBHNCBTaWx2ZXIiLAotCQlQTUFDX1RZUEVfUVVJQ0tTSUxWRVIsCQljb3JlOTlfZmVhdHVyZXMsCi0JCVBNQUNfTUJfTUFZX1NMRUVQCi0JfSwKLQl7CSJQb3dlck1hYzMsNSIsCQkJIlBvd2VyTWFjIEc0IFNpbHZlciIsCi0JCVBNQUNfVFlQRV9RVUlDS1NJTFZFUiwJCWNvcmU5OV9mZWF0dXJlcywKLQkJUE1BQ19NQl9NQVlfU0xFRVAKLQl9LAotCXsJIlBvd2VyTWFjMyw2IiwJCQkiUG93ZXJNYWMgRzQgV2luZHR1bm5lbCIsCi0JCVBNQUNfVFlQRV9XSU5EVFVOTkVMLAkJY29yZTk5X2ZlYXR1cmVzLAotCQlQTUFDX01CX01BWV9TTEVFUCwKLQl9LAotCXsJIlBvd2VyTWFjNCwxIiwJCQkiaU1hYyBcIkZsb3dlciBQb3dlclwiIiwKLQkJUE1BQ19UWVBFX1BBTkdFQV9JTUFDLAkJcGFuZ2VhX2ZlYXR1cmVzLAotCQlQTUFDX01CX01BWV9TTEVFUAotCX0sCi0JewkiUG93ZXJNYWM0LDIiLAkJCSJGbGF0IHBhbmVsIGlNYWMiLAotCQlQTUFDX1RZUEVfRkxBVF9QQU5FTF9JTUFDLAlwYW5nZWFfZmVhdHVyZXMsCi0JCVBNQUNfTUJfQ0FOX1NMRUVQCi0JfSwKLQl7CSJQb3dlck1hYzQsNCIsCQkJImVNYWMiLAotCQlQTUFDX1RZUEVfRU1BQywJCQljb3JlOTlfZmVhdHVyZXMsCi0JCVBNQUNfTUJfTUFZX1NMRUVQCi0JfSwKLQl7CSJQb3dlck1hYzUsMSIsCQkJIlBvd2VyTWFjIEc0IEN1YmUiLAotCQlQTUFDX1RZUEVfQ1VCRSwJCQljb3JlOTlfZmVhdHVyZXMsCi0JCVBNQUNfTUJfTUFZX1NMRUVQIHwgUE1BQ19NQl9PTERfQ09SRTk5Ci0JfSwKLQl7CSJQb3dlck1hYzYsMSIsCQkJIkZsYXQgcGFuZWwgaU1hYyIsCi0JCVBNQUNfVFlQRV9VTktOT1dOX0lOVFJFUElELAlpbnRyZXBpZF9mZWF0dXJlcywKLQkJUE1BQ19NQl9NQVlfU0xFRVAsCi0JfSwKLQl7CSJQb3dlck1hYzYsMyIsCQkJIkZsYXQgcGFuZWwgaU1hYyIsCi0JCVBNQUNfVFlQRV9VTktOT1dOX0lOVFJFUElELAlpbnRyZXBpZF9mZWF0dXJlcywKLQkJUE1BQ19NQl9NQVlfU0xFRVAsCi0JfSwKLQl7CSJQb3dlck1hYzYsNCIsCQkJImVNYWMiLAotCQlQTUFDX1RZUEVfVU5LTk9XTl9JTlRSRVBJRCwJaW50cmVwaWRfZmVhdHVyZXMsCi0JCVBNQUNfTUJfTUFZX1NMRUVQLAotCX0sCi0JewkiUG93ZXJNYWMxMCwxIiwJCQkiTWFjIG1pbmkiLAotCQlQTUFDX1RZUEVfVU5LTk9XTl9JTlRSRVBJRCwJaW50cmVwaWRfZmVhdHVyZXMsCi0JCVBNQUNfTUJfTUFZX1NMRUVQIHwgUE1BQ19NQl9IQVNfRldfUE9XRVIsCi0JfSwKLQl7CSJpTWFjLDEiLAkJCSJpTWFjIChmaXJzdCBnZW5lcmF0aW9uKSIsCi0JCVBNQUNfVFlQRV9PUklHX0lNQUMsCQlwYWRkaW5ndG9uX2ZlYXR1cmVzLAotCQkwCi0JfSwKLQotCS8qCi0JICogWHNlcnZlJ3MKLQkgKi8KLQotCXsJIlJhY2tNYWMxLDEiLAkJCSJYU2VydmUiLAotCQlQTUFDX1RZUEVfUkFDS01BQywJCXJhY2ttYWNfZmVhdHVyZXMsCi0JCTAsCi0JfSwKLQl7CSJSYWNrTWFjMSwyIiwJCQkiWFNlcnZlIHJldi4gMiIsCi0JCVBNQUNfVFlQRV9SQUNLTUFDLAkJcmFja21hY19mZWF0dXJlcywKLQkJMCwKLQl9LAotCi0JLyoKLQkgKiBMYXB0b3BzCi0JICovCi0KLQl7CSJBQVBMLDM0MDAvMjQwMCIsCQkiUG93ZXJCb29rIDM0MDAiLAotCQlQTUFDX1RZUEVfSE9PUEVSLAkJb2hhcmVfZmVhdHVyZXMsCi0JCVBNQUNfTUJfQ0FOX1NMRUVQIHwgUE1BQ19NQl9NT0JJTEUKLQl9LAotCXsJIkFBUEwsMzUwMCIsCQkJIlBvd2VyQm9vayAzNTAwIiwKLQkJUE1BQ19UWVBFX0tBTkdBLAkJb2hhcmVfZmVhdHVyZXMsCi0JCVBNQUNfTUJfQ0FOX1NMRUVQIHwgUE1BQ19NQl9NT0JJTEUKLQl9LAotCXsJIkFBUEwsUG93ZXJCb29rMTk5OCIsCQkiUG93ZXJCb29rIFdhbGxzdHJlZXQiLAotCQlQTUFDX1RZUEVfV0FMTFNUUkVFVCwJCWhlYXRocm93X2xhcHRvcF9mZWF0dXJlcywKLQkJUE1BQ19NQl9DQU5fU0xFRVAgfCBQTUFDX01CX01PQklMRQotCX0sCi0JewkiUG93ZXJCb29rMSwxIiwJCQkiUG93ZXJCb29rIDEwMSAoTG9tYmFyZCkiLAotCQlQTUFDX1RZUEVfMTAxX1BCT09LLAkJcGFkZGluZ3Rvbl9mZWF0dXJlcywKLQkJUE1BQ19NQl9DQU5fU0xFRVAgfCBQTUFDX01CX01PQklMRQotCX0sCi0JewkiUG93ZXJCb29rMiwxIiwJCQkiaUJvb2sgKGZpcnN0IGdlbmVyYXRpb24pIiwKLQkJUE1BQ19UWVBFX09SSUdfSUJPT0ssCQljb3JlOTlfZmVhdHVyZXMsCi0JCVBNQUNfTUJfQ0FOX1NMRUVQIHwgUE1BQ19NQl9PTERfQ09SRTk5IHwgUE1BQ19NQl9NT0JJTEUKLQl9LAotCXsJIlBvd2VyQm9vazIsMiIsCQkJImlCb29rIEZpcmVXaXJlIiwKLQkJUE1BQ19UWVBFX0ZXX0lCT09LLAkJY29yZTk5X2ZlYXR1cmVzLAotCQlQTUFDX01CX01BWV9TTEVFUCB8IFBNQUNfTUJfSEFTX0ZXX1BPV0VSIHwKLQkJUE1BQ19NQl9PTERfQ09SRTk5IHwgUE1BQ19NQl9NT0JJTEUKLQl9LAotCXsJIlBvd2VyQm9vazMsMSIsCQkJIlBvd2VyQm9vayBQaXNtbyIsCi0JCVBNQUNfVFlQRV9QSVNNTywJCWNvcmU5OV9mZWF0dXJlcywKLQkJUE1BQ19NQl9NQVlfU0xFRVAgfCBQTUFDX01CX0hBU19GV19QT1dFUiB8Ci0JCVBNQUNfTUJfT0xEX0NPUkU5OSB8IFBNQUNfTUJfTU9CSUxFCi0JfSwKLQl7CSJQb3dlckJvb2szLDIiLAkJCSJQb3dlckJvb2sgVGl0YW5pdW0iLAotCQlQTUFDX1RZUEVfVElUQU5JVU0sCQljb3JlOTlfZmVhdHVyZXMsCi0JCVBNQUNfTUJfTUFZX1NMRUVQIHwgUE1BQ19NQl9IQVNfRldfUE9XRVIgfCBQTUFDX01CX01PQklMRQotCX0sCi0JewkiUG93ZXJCb29rMywzIiwJCQkiUG93ZXJCb29rIFRpdGFuaXVtIElJIiwKLQkJUE1BQ19UWVBFX1RJVEFOSVVNMiwJCWNvcmU5OV9mZWF0dXJlcywKLQkJUE1BQ19NQl9NQVlfU0xFRVAgfCBQTUFDX01CX0hBU19GV19QT1dFUiB8IFBNQUNfTUJfTU9CSUxFCi0JfSwKLQl7CSJQb3dlckJvb2szLDQiLAkJCSJQb3dlckJvb2sgVGl0YW5pdW0gSUlJIiwKLQkJUE1BQ19UWVBFX1RJVEFOSVVNMywJCWNvcmU5OV9mZWF0dXJlcywKLQkJUE1BQ19NQl9NQVlfU0xFRVAgfCBQTUFDX01CX0hBU19GV19QT1dFUiB8IFBNQUNfTUJfTU9CSUxFCi0JfSwKLQl7CSJQb3dlckJvb2szLDUiLAkJCSJQb3dlckJvb2sgVGl0YW5pdW0gSVYiLAotCQlQTUFDX1RZUEVfVElUQU5JVU00LAkJY29yZTk5X2ZlYXR1cmVzLAotCQlQTUFDX01CX01BWV9TTEVFUCB8IFBNQUNfTUJfSEFTX0ZXX1BPV0VSIHwgUE1BQ19NQl9NT0JJTEUKLQl9LAotCXsJIlBvd2VyQm9vazQsMSIsCQkJImlCb29rIDIiLAotCQlQTUFDX1RZUEVfSUJPT0syLAkJcGFuZ2VhX2ZlYXR1cmVzLAotCQlQTUFDX01CX01BWV9TTEVFUCB8IFBNQUNfTUJfSEFTX0ZXX1BPV0VSIHwgUE1BQ19NQl9NT0JJTEUKLQl9LAotCXsJIlBvd2VyQm9vazQsMiIsCQkJImlCb29rIDIiLAotCQlQTUFDX1RZUEVfSUJPT0syLAkJcGFuZ2VhX2ZlYXR1cmVzLAotCQlQTUFDX01CX01BWV9TTEVFUCB8IFBNQUNfTUJfSEFTX0ZXX1BPV0VSIHwgUE1BQ19NQl9NT0JJTEUKLQl9LAotCXsJIlBvd2VyQm9vazQsMyIsCQkJImlCb29rIDIgcmV2LiAyIiwKLQkJUE1BQ19UWVBFX0lCT09LMiwJCXBhbmdlYV9mZWF0dXJlcywKLQkJUE1BQ19NQl9NQVlfU0xFRVAgfCBQTUFDX01CX0hBU19GV19QT1dFUiB8IFBNQUNfTUJfTU9CSUxFCi0JfSwKLQl7CSJQb3dlckJvb2s1LDEiLAkJCSJQb3dlckJvb2sgRzQgMTdcIiIsCi0JCVBNQUNfVFlQRV9VTktOT1dOX0lOVFJFUElELAlpbnRyZXBpZF9mZWF0dXJlcywKLQkJUE1BQ19NQl9IQVNfRldfUE9XRVIgfCBQTUFDX01CX01PQklMRSwKLQl9LAotCXsJIlBvd2VyQm9vazUsMiIsCQkJIlBvd2VyQm9vayBHNCAxNVwiIiwKLQkJUE1BQ19UWVBFX1VOS05PV05fSU5UUkVQSUQsCWludHJlcGlkX2ZlYXR1cmVzLAotCQlQTUFDX01CX01BWV9TTEVFUCB8IFBNQUNfTUJfSEFTX0ZXX1BPV0VSIHwgUE1BQ19NQl9NT0JJTEUsCi0JfSwKLQl7CSJQb3dlckJvb2s1LDMiLAkJCSJQb3dlckJvb2sgRzQgMTdcIiIsCi0JCVBNQUNfVFlQRV9VTktOT1dOX0lOVFJFUElELAlpbnRyZXBpZF9mZWF0dXJlcywKLQkJUE1BQ19NQl9NQVlfU0xFRVAgfCBQTUFDX01CX0hBU19GV19QT1dFUiB8IFBNQUNfTUJfTU9CSUxFLAotCX0sCi0JewkiUG93ZXJCb29rNSw0IiwJCQkiUG93ZXJCb29rIEc0IDE1XCIiLAotCQlQTUFDX1RZUEVfVU5LTk9XTl9JTlRSRVBJRCwJaW50cmVwaWRfZmVhdHVyZXMsCi0JCVBNQUNfTUJfTUFZX1NMRUVQIHwgUE1BQ19NQl9IQVNfRldfUE9XRVIgfCBQTUFDX01CX01PQklMRSwKLQl9LAotCXsJIlBvd2VyQm9vazUsNSIsCQkJIlBvd2VyQm9vayBHNCAxN1wiIiwKLQkJUE1BQ19UWVBFX1VOS05PV05fSU5UUkVQSUQsCWludHJlcGlkX2ZlYXR1cmVzLAotCQlQTUFDX01CX01BWV9TTEVFUCB8IFBNQUNfTUJfSEFTX0ZXX1BPV0VSIHwgUE1BQ19NQl9NT0JJTEUsCi0JfSwKLQl7CSJQb3dlckJvb2s1LDYiLAkJCSJQb3dlckJvb2sgRzQgMTVcIiIsCi0JCVBNQUNfVFlQRV9VTktOT1dOX0lOVFJFUElELAlpbnRyZXBpZF9mZWF0dXJlcywKLQkJUE1BQ19NQl9NQVlfU0xFRVAgfCBQTUFDX01CX0hBU19GV19QT1dFUiB8IFBNQUNfTUJfTU9CSUxFLAotCX0sCi0JewkiUG93ZXJCb29rNSw3IiwJCQkiUG93ZXJCb29rIEc0IDE3XCIiLAotCQlQTUFDX1RZUEVfVU5LTk9XTl9JTlRSRVBJRCwJaW50cmVwaWRfZmVhdHVyZXMsCi0JCVBNQUNfTUJfTUFZX1NMRUVQIHwgUE1BQ19NQl9IQVNfRldfUE9XRVIgfCBQTUFDX01CX01PQklMRSwKLQl9LAotCXsJIlBvd2VyQm9vazUsOCIsCQkJIlBvd2VyQm9vayBHNCAxNVwiIiwKLQkJUE1BQ19UWVBFX1VOS05PV05fSU5UUkVQSUQsCWludHJlcGlkX2ZlYXR1cmVzLAotCQlQTUFDX01CX01BWV9TTEVFUCB8IFBNQUNfTUJfSEFTX0ZXX1BPV0VSIHwgUE1BQ19NQl9NT0JJTEUsCi0JfSwKLQl7CSJQb3dlckJvb2s1LDkiLAkJCSJQb3dlckJvb2sgRzQgMTdcIiIsCi0JCVBNQUNfVFlQRV9VTktOT1dOX0lOVFJFUElELAlpbnRyZXBpZF9mZWF0dXJlcywKLQkJUE1BQ19NQl9NQVlfU0xFRVAgfCBQTUFDX01CX0hBU19GV19QT1dFUiB8IFBNQUNfTUJfTU9CSUxFLAotCX0sCi0JewkiUG93ZXJCb29rNiwxIiwJCQkiUG93ZXJCb29rIEc0IDEyXCIiLAotCQlQTUFDX1RZUEVfVU5LTk9XTl9JTlRSRVBJRCwJaW50cmVwaWRfZmVhdHVyZXMsCi0JCVBNQUNfTUJfTUFZX1NMRUVQIHwgUE1BQ19NQl9IQVNfRldfUE9XRVIgfCBQTUFDX01CX01PQklMRSwKLQl9LAotCXsJIlBvd2VyQm9vazYsMiIsCQkJIlBvd2VyQm9vayBHNCIsCi0JCVBNQUNfVFlQRV9VTktOT1dOX0lOVFJFUElELAlpbnRyZXBpZF9mZWF0dXJlcywKLQkJUE1BQ19NQl9NQVlfU0xFRVAgfCBQTUFDX01CX0hBU19GV19QT1dFUiB8IFBNQUNfTUJfTU9CSUxFLAotCX0sCi0JewkiUG93ZXJCb29rNiwzIiwJCQkiaUJvb2sgRzQiLAotCQlQTUFDX1RZUEVfVU5LTk9XTl9JTlRSRVBJRCwJaW50cmVwaWRfZmVhdHVyZXMsCi0JCVBNQUNfTUJfTUFZX1NMRUVQIHwgUE1BQ19NQl9IQVNfRldfUE9XRVIgfCBQTUFDX01CX01PQklMRSwKLQl9LAotCXsJIlBvd2VyQm9vazYsNCIsCQkJIlBvd2VyQm9vayBHNCAxMlwiIiwKLQkJUE1BQ19UWVBFX1VOS05PV05fSU5UUkVQSUQsCWludHJlcGlkX2ZlYXR1cmVzLAotCQlQTUFDX01CX01BWV9TTEVFUCB8IFBNQUNfTUJfSEFTX0ZXX1BPV0VSIHwgUE1BQ19NQl9NT0JJTEUsCi0JfSwKLQl7CSJQb3dlckJvb2s2LDUiLAkJCSJpQm9vayBHNCIsCi0JCVBNQUNfVFlQRV9VTktOT1dOX0lOVFJFUElELAlpbnRyZXBpZF9mZWF0dXJlcywKLQkJUE1BQ19NQl9NQVlfU0xFRVAgfCBQTUFDX01CX0hBU19GV19QT1dFUiB8IFBNQUNfTUJfTU9CSUxFLAotCX0sCi0JewkiUG93ZXJCb29rNiw3IiwJCQkiaUJvb2sgRzQiLAotCQlQTUFDX1RZUEVfVU5LTk9XTl9JTlRSRVBJRCwJaW50cmVwaWRfZmVhdHVyZXMsCi0JCVBNQUNfTUJfTUFZX1NMRUVQIHwgUE1BQ19NQl9IQVNfRldfUE9XRVIgfCBQTUFDX01CX01PQklMRSwKLQl9LAotCXsJIlBvd2VyQm9vazYsOCIsCQkJIlBvd2VyQm9vayBHNCAxMlwiIiwKLQkJUE1BQ19UWVBFX1VOS05PV05fSU5UUkVQSUQsCWludHJlcGlkX2ZlYXR1cmVzLAotCQlQTUFDX01CX01BWV9TTEVFUCB8IFBNQUNfTUJfSEFTX0ZXX1BPV0VSIHwgUE1BQ19NQl9NT0JJTEUsCi0JfSwKLSNlbHNlIC8qIENPTkZJR19QT1dFUjQgKi8KLQl7CSJQb3dlck1hYzcsMiIsCQkJIlBvd2VyTWFjIEc1IiwKLQkJUE1BQ19UWVBFX1BPV0VSTUFDX0c1LAkJZzVfZmVhdHVyZXMsCi0JCTAsCi0JfSwKLSNlbmRpZiAvKiBDT05GSUdfUE9XRVI0ICovCi19OwotCi0vKgotICogVGhlIHRvcGxldmVsIGZlYXR1cmVfY2FsbCBjYWxsYmFjawotICovCi1sb25nCi1wbWFjX2RvX2ZlYXR1cmVfY2FsbCh1bnNpZ25lZCBpbnQgc2VsZWN0b3IsIC4uLikKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGU7Ci0JbG9uZyBwYXJhbSwgdmFsdWU7Ci0JaW50IGk7Ci0JZmVhdHVyZV9jYWxsIGZ1bmMgPSBOVUxMOwotCXZhX2xpc3QgYXJnczsKLQotCWlmIChwbWFjX21iLmZlYXR1cmVzKQotCQlmb3IgKGk9MDsgcG1hY19tYi5mZWF0dXJlc1tpXS5mdW5jdGlvbjsgaSsrKQotCQkJaWYgKHBtYWNfbWIuZmVhdHVyZXNbaV0uc2VsZWN0b3IgPT0gc2VsZWN0b3IpIHsKLQkJCQlmdW5jID0gcG1hY19tYi5mZWF0dXJlc1tpXS5mdW5jdGlvbjsKLQkJCQlicmVhazsKLQkJCX0KLQlpZiAoIWZ1bmMpCi0JCWZvciAoaT0wOyBhbnlfZmVhdHVyZXNbaV0uZnVuY3Rpb247IGkrKykKLQkJCWlmIChhbnlfZmVhdHVyZXNbaV0uc2VsZWN0b3IgPT0gc2VsZWN0b3IpIHsKLQkJCQlmdW5jID0gYW55X2ZlYXR1cmVzW2ldLmZ1bmN0aW9uOwotCQkJCWJyZWFrOwotCQkJfQotCWlmICghZnVuYykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQl2YV9zdGFydChhcmdzLCBzZWxlY3Rvcik7Ci0Jbm9kZSA9IChzdHJ1Y3QgZGV2aWNlX25vZGUqKXZhX2FyZyhhcmdzLCB2b2lkKik7Ci0JcGFyYW0gPSB2YV9hcmcoYXJncywgbG9uZyk7Ci0JdmFsdWUgPSB2YV9hcmcoYXJncywgbG9uZyk7Ci0JdmFfZW5kKGFyZ3MpOwotCi0JcmV0dXJuIGZ1bmMobm9kZSwgcGFyYW0sIHZhbHVlKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQKLXByb2JlX21vdGhlcmJvYXJkKHZvaWQpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IG1hY2lvX2NoaXAqIG1hY2lvID0gJm1hY2lvX2NoaXBzWzBdOwotCWNvbnN0IGNoYXIqIG1vZGVsID0gTlVMTDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmR0OwotCi0JLyogTG9va3VwIGtub3duIG1vdGhlcmJvYXJkIHR5cGUgaW4gZGV2aWNlLXRyZWUuIEZpcnN0IHRyeSBhbgotCSAqIGV4YWN0IG1hdGNoIG9uIHRoZSAibW9kZWwiIHByb3BlcnR5LCB0aGVuIHRyeSBhICJjb21wYXRpYmxlIgotCSAqIG1hdGNoIGlzIG5vbmUgaXMgZm91bmQuCi0JICovCi0JZHQgPSBmaW5kX2RldmljZXMoImRldmljZS10cmVlIik7Ci0JaWYgKGR0ICE9IE5VTEwpCi0JCW1vZGVsID0gKGNvbnN0IGNoYXIgKikgZ2V0X3Byb3BlcnR5KGR0LCAibW9kZWwiLCBOVUxMKTsKLQlmb3IoaT0wOyBtb2RlbCAmJiBpPChzaXplb2YocG1hY19tYl9kZWZzKS9zaXplb2Yoc3RydWN0IHBtYWNfbWJfZGVmKSk7IGkrKykgewotCSAgICBpZiAoc3RyY21wKG1vZGVsLCBwbWFjX21iX2RlZnNbaV0ubW9kZWxfc3RyaW5nKSA9PSAwKSB7Ci0JCXBtYWNfbWIgPSBwbWFjX21iX2RlZnNbaV07Ci0JCWdvdG8gZm91bmQ7Ci0JICAgIH0KLQl9Ci0JZm9yKGk9MDsgaTwoc2l6ZW9mKHBtYWNfbWJfZGVmcykvc2l6ZW9mKHN0cnVjdCBwbWFjX21iX2RlZikpOyBpKyspIHsKLQkgICAgaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZShwbWFjX21iX2RlZnNbaV0ubW9kZWxfc3RyaW5nKSkgewotCQlwbWFjX21iID0gcG1hY19tYl9kZWZzW2ldOwotCQlnb3RvIGZvdW5kOwotCSAgICB9Ci0JfQotCi0JLyogRmFsbGJhY2sgdG8gc2VsZWN0aW9uIGRlcGVuZGluZyBvbiBtYWMtaW8gY2hpcCB0eXBlICovCi0Jc3dpdGNoKG1hY2lvLT50eXBlKSB7Ci0jaWZuZGVmIENPTkZJR19QT1dFUjQKLQkgICAgY2FzZSBtYWNpb19ncmFuZF9jZW50cmFsOgotCQlwbWFjX21iLm1vZGVsX2lkID0gUE1BQ19UWVBFX1BTVVJHRTsKLQkJcG1hY19tYi5tb2RlbF9uYW1lID0gIlVua25vd24gUG93ZXJTdXJnZSI7Ci0JCWJyZWFrOwotCSAgICBjYXNlIG1hY2lvX29oYXJlOgotCQlwbWFjX21iLm1vZGVsX2lkID0gUE1BQ19UWVBFX1VOS05PV05fT0hBUkU7Ci0JCXBtYWNfbWIubW9kZWxfbmFtZSA9ICJVbmtub3duIE9IYXJlLWJhc2VkIjsKLQkgICAgCWJyZWFrOwotCSAgICBjYXNlIG1hY2lvX2hlYXRocm93OgotCQlwbWFjX21iLm1vZGVsX2lkID0gUE1BQ19UWVBFX1VOS05PV05fSEVBVEhST1c7Ci0JCXBtYWNfbWIubW9kZWxfbmFtZSA9ICJVbmtub3duIEhlYXRocm93LWJhc2VkIjsKLQkJcG1hY19tYi5mZWF0dXJlcyA9IGhlYXRocm93X2Rlc2t0b3BfZmVhdHVyZXM7Ci0JCWJyZWFrOwotCSAgICBjYXNlIG1hY2lvX3BhZGRpbmd0b246Ci0JCXBtYWNfbWIubW9kZWxfaWQgPSBQTUFDX1RZUEVfVU5LTk9XTl9QQURESU5HVE9OOwotCQlwbWFjX21iLm1vZGVsX25hbWUgPSAiVW5rbm93biBQYWRkaW5ndG9uLWJhc2VkIjsKLQkgICAgCXBtYWNfbWIuZmVhdHVyZXMgPSBwYWRkaW5ndG9uX2ZlYXR1cmVzOwotCQlicmVhazsKLQkgICAgY2FzZSBtYWNpb19rZXlsYXJnbzoKLQkJcG1hY19tYi5tb2RlbF9pZCA9IFBNQUNfVFlQRV9VTktOT1dOX0NPUkU5OTsKLQkJcG1hY19tYi5tb2RlbF9uYW1lID0gIlVua25vd24gS2V5bGFyZ28tYmFzZWQiOwotCSAgICAJcG1hY19tYi5mZWF0dXJlcyA9IGNvcmU5OV9mZWF0dXJlczsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgbWFjaW9fcGFuZ2VhOgotCQlwbWFjX21iLm1vZGVsX2lkID0gUE1BQ19UWVBFX1VOS05PV05fUEFOR0VBOwotCQlwbWFjX21iLm1vZGVsX25hbWUgPSAiVW5rbm93biBQYW5nZWEtYmFzZWQiOwotCSAgICAJcG1hY19tYi5mZWF0dXJlcyA9IHBhbmdlYV9mZWF0dXJlczsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgbWFjaW9faW50cmVwaWQ6Ci0JCXBtYWNfbWIubW9kZWxfaWQgPSBQTUFDX1RZUEVfVU5LTk9XTl9JTlRSRVBJRDsKLQkJcG1hY19tYi5tb2RlbF9uYW1lID0gIlVua25vd24gSW50cmVwaWQtYmFzZWQiOwotCSAgICAJcG1hY19tYi5mZWF0dXJlcyA9IGludHJlcGlkX2ZlYXR1cmVzOwotCSAgICAJYnJlYWs7Ci0jZWxzZSAvKiBDT05GSUdfUE9XRVI0ICovCi0JICAgIGNhc2UgbWFjaW9fa2V5bGFyZ28yOgotCQlwbWFjX21iLm1vZGVsX2lkID0gUE1BQ19UWVBFX1VOS05PV05fSzI7Ci0JCXBtYWNfbWIubW9kZWxfbmFtZSA9ICJVbmtub3duIEc1IjsKLQkgICAgCXBtYWNfbWIuZmVhdHVyZXMgPSBnNV9mZWF0dXJlczsKLQkgICAgCWJyZWFrOwotI2VuZGlmIC8qIENPTkZJR19QT1dFUjQgKi8KLQkgICAgZGVmYXVsdDoKLQkgICAgCXJldHVybiAtRU5PREVWOwotCX0KLWZvdW5kOgotI2lmbmRlZiBDT05GSUdfUE9XRVI0Ci0JLyogRml4dXAgSG9vcGVyIHZzLiBDb21ldCAqLwotCWlmIChwbWFjX21iLm1vZGVsX2lkID09IFBNQUNfVFlQRV9IT09QRVIpIHsKLQkJdTMyIF9faW9tZW0gKiBtYWNoX2lkX3B0ciA9IGlvcmVtYXAoMHhmMzAwMDAzNCwgNCk7Ci0JCWlmICghbWFjaF9pZF9wdHIpCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJLyogSGVyZSwgSSB1c2VkIHRvIGRpc2FibGUgdGhlIG1lZGlhLWJheSBvbiBjb21ldC4gSXQKLQkJICogYXBwZWFycyB0aGlzIGlzIHdyb25nLCB0aGUgZmxvcHB5IGNvbm5lY3RvciBpcyBhY3R1YWxseQotCQkgKiBhIGtpbmQgb2YgbWVkaWEtYmF5IGFuZCB3b3JrcyB3aXRoIHRoZSBjdXJyZW50IGRyaXZlci4KLQkJICovCi0JCWlmIChfX3Jhd19yZWFkbChtYWNoX2lkX3B0cikgJiAweDIwMDAwMDAwVUwpCi0JCQlwbWFjX21iLm1vZGVsX2lkID0gUE1BQ19UWVBFX0NPTUVUOwotCQlpb3VubWFwKG1hY2hfaWRfcHRyKTsKLQl9Ci0jZW5kaWYgLyogQ09ORklHX1BPV0VSNCAqLwotCi0jaWZkZWYgQ09ORklHXzZ4eAotCS8qIFNldCBkZWZhdWx0IHZhbHVlIG9mIHBvd2Vyc2F2ZV9uYXAgb24gbWFjaGluZXMgdGhhdCBzdXBwb3J0IGl0LgotCSAqIEl0IGFwcGVhcnMgdGhhdCB1bmlub3J0aCByZXYgMyBoYXMgYSBwcm9ibGVtIHdpdGggaXQsIHdlIGRvbid0Ci0JICogZW5hYmxlIGl0IG9uIHRob3NlLiBJbiB0aGVvcnksIHRoZSBmbHVzaC1vbi1sb2NrIHByb3BlcnR5IGlzCi0JICogc3VwcG9zZWQgdG8gYmUgc2V0IHdoZW4gbm90IHN1cHBvcnRlZCwgYnV0IEknbSBub3QgdmVyeSBjb25maWRlbnQKLQkgKiB0aGF0IGFsbCBBcHBsZSBPRiByZXZzIGRpZCBpdCBwcm9wZXJseSwgSSBkbyBpdCB0aGUgcGFyYW5vaWQgd2F5LgotCSAqLwotCXdoaWxlICh1bmlub3J0aF9iYXNlICYmIHVuaW5vcnRoX3JldiA+IDMpIHsKLQkJc3RydWN0IGRldmljZV9ub2RlKiBucCA9IGZpbmRfcGF0aF9kZXZpY2UoIi9jcHVzIik7Ci0JCWlmICghbnAgfHwgIW5wLT5jaGlsZCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgZmluZCBDUFUocykgaW4gZGV2aWNlIHRyZWUgIVxuIik7Ci0JCQlicmVhazsKLQkJfQotCQlucCA9IG5wLT5jaGlsZDsKLQkJLyogTmFwIG1vZGUgbm90IHN1cHBvcnRlZCBvbiBTTVAgKi8KLQkJaWYgKG5wLT5zaWJsaW5nKQotCQkJYnJlYWs7Ci0JCS8qIE5hcCBtb2RlIG5vdCBzdXBwb3J0ZWQgaWYgZmx1c2gtb24tbG9jayBwcm9wZXJ0eSBpcyBwcmVzZW50ICovCi0JCWlmIChnZXRfcHJvcGVydHkobnAsICJmbHVzaC1vbi1sb2NrIiwgTlVMTCkpCi0JCQlicmVhazsKLQkJcG93ZXJzYXZlX25hcCA9IDE7Ci0JCXByaW50ayhLRVJOX0lORk8gIlByb2Nlc3NvciBOQVAgbW9kZSBvbiBpZGxlIGVuYWJsZWQuXG4iKTsKLQkJYnJlYWs7Ci0JfQotCi0JLyogT24gQ1BVcyB0aGF0IHN1cHBvcnQgaXQgKDc1MEZYKSwgbG93c3BlZWQgYnkgZGVmYXVsdCBkdXJpbmcKLQkgKiBOQVAgbW9kZQotCSAqLwotCXBvd2Vyc2F2ZV9sb3dzcGVlZCA9IDE7Ci0jZW5kaWYgLyogQ09ORklHXzZ4eCAqLwotI2lmZGVmIENPTkZJR19QT1dFUjQKLQlwb3dlcnNhdmVfbmFwID0gMTsKLSNlbmRpZgotCS8qIENoZWNrIGZvciAibW9iaWxlIiBtYWNoaW5lICovCi0JaWYgKG1vZGVsICYmIChzdHJuY21wKG1vZGVsLCAiUG93ZXJCb29rIiwgOSkgPT0gMAotCQkgICB8fCBzdHJuY21wKG1vZGVsLCAiaUJvb2siLCA1KSA9PSAwKSkKLQkJcG1hY19tYi5ib2FyZF9mbGFncyB8PSBQTUFDX01CX01PQklMRTsKLQotCi0JcHJpbnRrKEtFUk5fSU5GTyAiUG93ZXJNYWMgbW90aGVyYm9hcmQ6ICVzXG4iLCBwbWFjX21iLm1vZGVsX25hbWUpOwotCXJldHVybiAwOwotfQotCi0vKiBJbml0aWFsaXplIHRoZSBDb3JlOTkgVW5pTm9ydGggaG9zdCBicmlkZ2UgYW5kIG1lbW9yeSBjb250cm9sbGVyCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdAotcHJvYmVfdW5pbm9ydGgodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGFjdHJsOwotCi0JLyogTG9jYXRlIGNvcmU5OSBVbmktTiAqLwotCXVuaW5vcnRoX25vZGUgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAidW5pLW4iKTsKLQkvKiBMb2NhdGUgRzUgdTMgKi8KLQlpZiAodW5pbm9ydGhfbm9kZSA9PSBOVUxMKSB7Ci0JCXVuaW5vcnRoX25vZGUgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAidTMiKTsKLQkJdW5pbm9ydGhfdTMgPSAxOwotCX0KLQlpZiAodW5pbm9ydGhfbm9kZSAmJiB1bmlub3J0aF9ub2RlLT5uX2FkZHJzID4gMCkgewotCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSB1bmlub3J0aF9ub2RlLT5hZGRyc1swXS5hZGRyZXNzOwotCQl1bmlub3J0aF9iYXNlID0gaW9yZW1hcChhZGRyZXNzLCAweDQwMDAwKTsKLQkJdW5pbm9ydGhfcmV2ID0gaW5fYmUzMihVTl9SRUcoVU5JX05fVkVSU0lPTikpOwotCQlpZiAodW5pbm9ydGhfdTMpCi0JCQl1M19odCA9IGlvcmVtYXAoYWRkcmVzcyArIFUzX0hUX0NPTkZJR19CQVNFLCAweDEwMDApOwotCX0gZWxzZQotCQl1bmlub3J0aF9ub2RlID0gTlVMTDsKLQotCWlmICghdW5pbm9ydGhfbm9kZSkKLQkJcmV0dXJuOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgJXMgbWVtb3J5IGNvbnRyb2xsZXIgJiBob3N0IGJyaWRnZSwgcmV2aXNpb246ICVkXG4iLAotCSAgICAgICB1bmlub3J0aF91MyA/ICJVMyIgOiAiVW5pTm9ydGgiLCB1bmlub3J0aF9yZXYpOwotCXByaW50ayhLRVJOX0lORk8gIk1hcHBlZCBhdCAweCUwOGx4XG4iLCAodW5zaWduZWQgbG9uZyl1bmlub3J0aF9iYXNlKTsKLQotCS8qIFNldCB0aGUgYXJiaXRyZXIgUUFjayBkZWxheSBhY2NvcmRpbmcgdG8gd2hhdCBBcHBsZSBkb2VzCi0JICovCi0JaWYgKHVuaW5vcnRoX3JldiA8IDB4MTEpIHsKLQkJYWN0cmwgPSBVTl9JTihVTklfTl9BUkJfQ1RSTCkgJiB+VU5JX05fQVJCX0NUUkxfUUFDS19ERUxBWV9NQVNLOwotCQlhY3RybCB8PSAoKHVuaW5vcnRoX3JldiA8IDMpID8gVU5JX05fQVJCX0NUUkxfUUFDS19ERUxBWTEwNSA6Ci0JCQlVTklfTl9BUkJfQ1RSTF9RQUNLX0RFTEFZKSA8PCBVTklfTl9BUkJfQ1RSTF9RQUNLX0RFTEFZX1NISUZUOwotCQlVTl9PVVQoVU5JX05fQVJCX0NUUkwsIGFjdHJsKTsKLQl9Ci0KLQkvKiBTb21lIG1vcmUgbWFnaWMgYXMgZG9uZSBieSB0aGVtIGluIHJlY2VudCBNYWNPUyBYIG9uIFVuaU5vcnRoCi0JICogcmV2cyAxLjUgdG8gMi5PIGFuZCBQYW5nZWEuIFNlZW0gdG8gdG9nZ2xlIHRoZSBVbmlOIE1heGJ1cy9QQ0kKLQkgKiBtZW1vcnkgdGltZW91dAotCSAqLwotCWlmICgodW5pbm9ydGhfcmV2ID49IDB4MTEgJiYgdW5pbm9ydGhfcmV2IDw9IDB4MjQpIHx8IHVuaW5vcnRoX3JldiA9PSAweGMwKQotCQlVTl9PVVQoMHgyMTYwLCBVTl9JTigweDIxNjApICYgMHgwMGZmZmZmZik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdAotcHJvYmVfb25lX21hY2lvKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIGNvbXBhdCwgaW50IHR5cGUpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlKglub2RlOwotCWludAkJCWk7Ci0Jdm9sYXRpbGUgdTMyIF9faW9tZW0gKgliYXNlOwotCXUzMioJCQlyZXZwOwotCi0Jbm9kZSA9IGZpbmRfZGV2aWNlcyhuYW1lKTsKLQlpZiAoIW5vZGUgfHwgIW5vZGUtPm5fYWRkcnMpCi0JCXJldHVybjsKLQlpZiAoY29tcGF0KQotCQlkbyB7Ci0JCQlpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUobm9kZSwgY29tcGF0KSkKLQkJCQlicmVhazsKLQkJCW5vZGUgPSBub2RlLT5uZXh0OwotCQl9IHdoaWxlIChub2RlKTsKLQlpZiAoIW5vZGUpCi0JCXJldHVybjsKLQlmb3IoaT0wOyBpPE1BWF9NQUNJT19DSElQUzsgaSsrKSB7Ci0JCWlmICghbWFjaW9fY2hpcHNbaV0ub2Zfbm9kZSkKLQkJCWJyZWFrOwotCQlpZiAobWFjaW9fY2hpcHNbaV0ub2Zfbm9kZSA9PSBub2RlKQotCQkJcmV0dXJuOwotCX0KLQlpZiAoaSA+PSBNQVhfTUFDSU9fQ0hJUFMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJwbWFjX2ZlYXR1cmU6IFBsZWFzZSBpbmNyZWFzZSBNQVhfTUFDSU9fQ0hJUFMgIVxuIik7Ci0JCXByaW50ayhLRVJOX0VSUiAicG1hY19mZWF0dXJlOiAlcyBza2lwcGVkXG4iLCBub2RlLT5mdWxsX25hbWUpOwotCQlyZXR1cm47Ci0JfQotCWJhc2UgPSBpb3JlbWFwKG5vZGUtPmFkZHJzWzBdLmFkZHJlc3MsIG5vZGUtPmFkZHJzWzBdLnNpemUpOwotCWlmICghYmFzZSkgewotCQlwcmludGsoS0VSTl9FUlIgInBtYWNfZmVhdHVyZTogQ2FuJ3QgbWFwIG1hYy1pbyBjaGlwICFcbiIpOwotCQlyZXR1cm47Ci0JfQotCWlmICh0eXBlID09IG1hY2lvX2tleWxhcmdvKSB7Ci0JCXUzMiogZGlkID0gKHUzMiAqKWdldF9wcm9wZXJ0eShub2RlLCAiZGV2aWNlLWlkIiwgTlVMTCk7Ci0JCWlmICgqZGlkID09IDB4MDAwMDAwMjUpCi0JCQl0eXBlID0gbWFjaW9fcGFuZ2VhOwotCQlpZiAoKmRpZCA9PSAweDAwMDAwMDNlKQotCQkJdHlwZSA9IG1hY2lvX2ludHJlcGlkOwotCX0KLQltYWNpb19jaGlwc1tpXS5vZl9ub2RlCT0gbm9kZTsKLQltYWNpb19jaGlwc1tpXS50eXBlCT0gdHlwZTsKLQltYWNpb19jaGlwc1tpXS5iYXNlCT0gYmFzZTsKLQltYWNpb19jaGlwc1tpXS5mbGFncwk9IE1BQ0lPX0ZMQUdfU0NDQl9PTiB8IE1BQ0lPX0ZMQUdfU0NDQl9PTjsKLQltYWNpb19jaGlwc1tpXS5uYW1lIAk9IG1hY2lvX25hbWVzW3R5cGVdOwotCXJldnAgPSAodTMyICopZ2V0X3Byb3BlcnR5KG5vZGUsICJyZXZpc2lvbi1pZCIsIE5VTEwpOwotCWlmIChyZXZwKQotCQltYWNpb19jaGlwc1tpXS5yZXYgPSAqcmV2cDsKLQlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBhICVzIG1hYy1pbyBjb250cm9sbGVyLCByZXY6ICVkLCBtYXBwZWQgYXQgMHglcFxuIiwKLQkJbWFjaW9fbmFtZXNbdHlwZV0sIG1hY2lvX2NoaXBzW2ldLnJldiwgbWFjaW9fY2hpcHNbaV0uYmFzZSk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0Ci1wcm9iZV9tYWNpb3Modm9pZCkKLXsKLQkvKiBXYXJuaW5nLCBvcmRlcmluZyBpcyBpbXBvcnRhbnQgKi8KLQlwcm9iZV9vbmVfbWFjaW8oImdjIiwgTlVMTCwgbWFjaW9fZ3JhbmRfY2VudHJhbCk7Ci0JcHJvYmVfb25lX21hY2lvKCJvaGFyZSIsIE5VTEwsIG1hY2lvX29oYXJlKTsKLQlwcm9iZV9vbmVfbWFjaW8oInBjaTEwNmIsNyIsIE5VTEwsIG1hY2lvX29oYXJlSUkpOwotCXByb2JlX29uZV9tYWNpbygibWFjLWlvIiwgImtleWxhcmdvIiwgbWFjaW9fa2V5bGFyZ28pOwotCXByb2JlX29uZV9tYWNpbygibWFjLWlvIiwgInBhZGRpbmd0b24iLCBtYWNpb19wYWRkaW5ndG9uKTsKLQlwcm9iZV9vbmVfbWFjaW8oIm1hYy1pbyIsICJnYXR3aWNrIiwgbWFjaW9fZ2F0d2ljayk7Ci0JcHJvYmVfb25lX21hY2lvKCJtYWMtaW8iLCAiaGVhdGhyb3ciLCBtYWNpb19oZWF0aHJvdyk7Ci0JcHJvYmVfb25lX21hY2lvKCJtYWMtaW8iLCAiSzItS2V5bGFyZ28iLCBtYWNpb19rZXlsYXJnbzIpOwotCi0JLyogTWFrZSBzdXJlIHRoZSAibWFpbiIgbWFjaW8gY2hpcCBhcHBlYXIgZmlyc3QgKi8KLQlpZiAobWFjaW9fY2hpcHNbMF0udHlwZSA9PSBtYWNpb19nYXR3aWNrCi0JICAgICYmIG1hY2lvX2NoaXBzWzFdLnR5cGUgPT0gbWFjaW9faGVhdGhyb3cpIHsKLQkJc3RydWN0IG1hY2lvX2NoaXAgdGVtcCA9IG1hY2lvX2NoaXBzWzBdOwotCQltYWNpb19jaGlwc1swXSA9IG1hY2lvX2NoaXBzWzFdOwotCQltYWNpb19jaGlwc1sxXSA9IHRlbXA7Ci0JfQotCWlmIChtYWNpb19jaGlwc1swXS50eXBlID09IG1hY2lvX29oYXJlSUkKLQkgICAgJiYgbWFjaW9fY2hpcHNbMV0udHlwZSA9PSBtYWNpb19vaGFyZSkgewotCQlzdHJ1Y3QgbWFjaW9fY2hpcCB0ZW1wID0gbWFjaW9fY2hpcHNbMF07Ci0JCW1hY2lvX2NoaXBzWzBdID0gbWFjaW9fY2hpcHNbMV07Ci0JCW1hY2lvX2NoaXBzWzFdID0gdGVtcDsKLQl9Ci0JbWFjaW9fY2hpcHNbMF0ubGJ1cy5pbmRleCA9IDA7Ci0JbWFjaW9fY2hpcHNbMV0ubGJ1cy5pbmRleCA9IDE7Ci0KLQlyZXR1cm4gKG1hY2lvX2NoaXBzWzBdLm9mX25vZGUgPT0gTlVMTCkgPyAtRU5PREVWIDogMDsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0Ci1pbml0aWFsX3NlcmlhbF9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlX25vZGUqIG5wKQotewotCWludCBsZW47Ci0Jc3RydWN0IHNsb3RfbmFtZXNfcHJvcCB7Ci0JCWludAljb3VudDsKLQkJY2hhcgluYW1lWzFdOwotCX0gKnNsb3RzOwotCWNoYXIgKmNvbm47Ci0JaW50IHBvcnRfdHlwZSA9IFBNQUNfU0NDX0FTWU5DOwotCWludCBtb2RlbSA9IDA7Ci0KLQlzbG90cyA9IChzdHJ1Y3Qgc2xvdF9uYW1lc19wcm9wICopZ2V0X3Byb3BlcnR5KG5wLCAic2xvdC1uYW1lcyIsICZsZW4pOwotCWNvbm4gPSBnZXRfcHJvcGVydHkobnAsICJBQVBMLGNvbm5lY3RvciIsICZsZW4pOwotCWlmIChjb25uICYmIChzdHJjbXAoY29ubiwgImluZnJhcmVkIikgPT0gMCkpCi0JCXBvcnRfdHlwZSA9IFBNQUNfU0NDX0lSREE7Ci0JZWxzZSBpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJjb2JhbHQiKSkKLQkJbW9kZW0gPSAxOwotCWVsc2UgaWYgKHNsb3RzICYmIHNsb3RzLT5jb3VudCA+IDApIHsKLQkJaWYgKHN0cmNtcChzbG90cy0+bmFtZSwgIklyREEiKSA9PSAwKQotCQkJcG9ydF90eXBlID0gUE1BQ19TQ0NfSVJEQTsKLQkJZWxzZSBpZiAoc3RyY21wKHNsb3RzLT5uYW1lLCAiTW9kZW0iKSA9PSAwKQotCQkJbW9kZW0gPSAxOwotCX0KLQlpZiAobW9kZW0pCi0JCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX01PREVNX0VOQUJMRSwgbnAsIDAsIDApOwotCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1NDQ19FTkFCTEUsIG5wLCBwb3J0X3R5cGUsIDApOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQKLXNldF9pbml0aWFsX2ZlYXR1cmVzKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlKiBucDsKLQotCS8qIFRoYXQgaGFjayBhcHBlYXJzIHRvIGJlIG5lY2Vzc2FyeSBmb3Igc29tZSBTdGFyTWF4IG1vdGhlcmJvYXJkcwotCSAqIGJ1dCBJJ20gbm90IHRvbyBzdXJlIGl0IHdhcyBhdWRpdGVkIGZvciBzaWRlLWVmZmVjdHMgb24gb3RoZXIKLQkgKiBvaGFyZSBiYXNlZCBtYWNoaW5lcy4uLgotCSAqIFNpbmNlIEkgc3RpbGwgaGF2ZSBkaWZmaWN1bHRpZXMgZmlndXJpbmcgdGhlIHJpZ2h0IHdheSB0bwotCSAqIGRpZmZlcmVuY2lhdGUgdGhlbSBhbGwgYW5kIHNpbmNlIHRoYXQgaGFjayB3YXMgdGhlcmUgZm9yIGEgbG9uZwotCSAqIHRpbWUsIEknbGwga2VlcCBpdCBhcm91bmQKLQkgKi8KLQlpZiAobWFjaW9fY2hpcHNbMF0udHlwZSA9PSBtYWNpb19vaGFyZSAmJiAhZmluZF9kZXZpY2VzKCJ2aWEtcG11IikpIHsKLQkJc3RydWN0IG1hY2lvX2NoaXAqIG1hY2lvID0gJm1hY2lvX2NoaXBzWzBdOwotCQlNQUNJT19PVVQzMihPSEFSRV9GQ1IsIFNUQVJNQVhfRkVBVFVSRVMpOwotCX0gZWxzZSBpZiAobWFjaW9fY2hpcHNbMF0udHlwZSA9PSBtYWNpb19vaGFyZSkgewotCQlzdHJ1Y3QgbWFjaW9fY2hpcCogbWFjaW8gPSAmbWFjaW9fY2hpcHNbMF07Ci0JCU1BQ0lPX0JJUyhPSEFSRV9GQ1IsIE9IX0lPQlVTX0VOQUJMRSk7Ci0JfSBlbHNlIGlmIChtYWNpb19jaGlwc1sxXS50eXBlID09IG1hY2lvX29oYXJlKSB7Ci0JCXN0cnVjdCBtYWNpb19jaGlwKiBtYWNpbyA9ICZtYWNpb19jaGlwc1sxXTsKLQkJTUFDSU9fQklTKE9IQVJFX0ZDUiwgT0hfSU9CVVNfRU5BQkxFKTsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfUE9XRVI0Ci0JaWYgKG1hY2lvX2NoaXBzWzBdLnR5cGUgPT0gbWFjaW9fa2V5bGFyZ28yKSB7Ci0jaWZuZGVmIENPTkZJR19TTVAKLQkJLyogT24gU01QIG1hY2hpbmVzIHJ1bm5pbmcgVVAsIHdlIGhhdmUgdGhlIHNlY29uZCBDUFUgZWF0aW5nCi0JCSAqIGJ1cyBjeWNsZXMuIFdlIG5lZWQgdG8gdGFrZSBpdCBvZmYgdGhlIGJ1cy4gVGhpcyBpcyBkb25lCi0JCSAqIGZyb20gcG1hY19zbXAgZm9yIFNNUCBrZXJuZWxzIHJ1bm5pbmcgb24gb25lIENQVQotCQkgKi8KLQkJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiY3B1Iik7Ci0JCWlmIChucCAhPSBOVUxMKQotCQkJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgImNwdSIpOwotCQlpZiAobnAgIT0gTlVMTCkgewotCQkJZzVfcGh5X2Rpc2FibGVfY3B1MSgpOwotCQkJb2Zfbm9kZV9wdXQobnApOwotCQl9Ci0jZW5kaWYgLyogQ09ORklHX1NNUCAqLwotCQkvKiBFbmFibGUgR01BQyBmb3Igbm93IGZvciBQQ0kgcHJvYmluZy4gSXQgd2lsbCBiZSBkaXNhYmxlZAotCQkgKiBsYXRlciBvbiBhZnRlciBQQ0kgcHJvYmUKLQkJICovCi0JCW5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImV0aGVybmV0Iik7Ci0JCXdoaWxlKG5wKSB7Ci0JCQlpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJLMi1HTUFDIikpCi0JCQkJZzVfZ21hY19lbmFibGUobnAsIDAsIDEpOwotCQkJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShucCwgImV0aGVybmV0Iik7Ci0JCX0KLQotCQkvKiBFbmFibGUgRlcgYmVmb3JlIFBDSSBwcm9iZS4gV2lsbCBiZSBkaXNhYmxlZCBsYXRlciBvbgotCQkgKiBOb3RlOiBXZSBzaG91bGQgaGF2ZSBhIGJhdHRlciB3YXkgdG8gY2hlY2sgdGhhdCB3ZSBhcmUKLQkJICogZGVhbGluZyB3aXRoIHVuaW5vcnRoIGludGVybmFsIGNlbGwgYW5kIG5vdCBhIFBDSSBjZWxsCi0JCSAqIG9uIHRoZSBleHRlcm5hbCBQQ0kuIFRoZSBjb2RlIGJlbG93IHdvcmtzIHRob3VnaC4KLQkJICovCi0JCW5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImZpcmV3aXJlIik7Ci0JCXdoaWxlKG5wKSB7Ci0JCQlpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJwY2kxMDZiLDU4MTEiKSkgewotCQkJCW1hY2lvX2NoaXBzWzBdLmZsYWdzIHw9IE1BQ0lPX0ZMQUdfRldfU1VQUE9SVEVEOwotCQkJCWc1X2Z3X2VuYWJsZShucCwgMCwgMSk7Ci0JCQl9Ci0JCQlucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKG5wLCAiZmlyZXdpcmUiKTsKLQkJfQotCX0KLSNlbHNlIC8qIENPTkZJR19QT1dFUjQgKi8KLQotCWlmIChtYWNpb19jaGlwc1swXS50eXBlID09IG1hY2lvX2tleWxhcmdvIHx8Ci0JICAgIG1hY2lvX2NoaXBzWzBdLnR5cGUgPT0gbWFjaW9fcGFuZ2VhIHx8Ci0JICAgIG1hY2lvX2NoaXBzWzBdLnR5cGUgPT0gbWFjaW9faW50cmVwaWQpIHsKLQkJLyogRW5hYmxlIEdNQUMgZm9yIG5vdyBmb3IgUENJIHByb2JpbmcuIEl0IHdpbGwgYmUgZGlzYWJsZWQKLQkJICogbGF0ZXIgb24gYWZ0ZXIgUENJIHByb2JlCi0JCSAqLwotCQlucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJldGhlcm5ldCIpOwotCQl3aGlsZShucCkgewotCQkJaWYgKG5wLT5wYXJlbnQKLQkJCSAgICAmJiBkZXZpY2VfaXNfY29tcGF0aWJsZShucC0+cGFyZW50LCAidW5pLW5vcnRoIikKLQkJCSAgICAmJiBkZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImdtYWMiKSkKLQkJCQljb3JlOTlfZ21hY19lbmFibGUobnAsIDAsIDEpOwotCQkJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShucCwgImV0aGVybmV0Iik7Ci0JCX0KLQotCQkvKiBFbmFibGUgRlcgYmVmb3JlIFBDSSBwcm9iZS4gV2lsbCBiZSBkaXNhYmxlZCBsYXRlciBvbgotCQkgKiBOb3RlOiBXZSBzaG91bGQgaGF2ZSBhIGJhdHRlciB3YXkgdG8gY2hlY2sgdGhhdCB3ZSBhcmUKLQkJICogZGVhbGluZyB3aXRoIHVuaW5vcnRoIGludGVybmFsIGNlbGwgYW5kIG5vdCBhIFBDSSBjZWxsCi0JCSAqIG9uIHRoZSBleHRlcm5hbCBQQ0kuIFRoZSBjb2RlIGJlbG93IHdvcmtzIHRob3VnaC4KLQkJICovCi0JCW5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImZpcmV3aXJlIik7Ci0JCXdoaWxlKG5wKSB7Ci0JCQlpZiAobnAtPnBhcmVudAotCQkJICAgICYmIGRldmljZV9pc19jb21wYXRpYmxlKG5wLT5wYXJlbnQsICJ1bmktbm9ydGgiKQotCQkJICAgICYmIChkZXZpY2VfaXNfY29tcGF0aWJsZShucCwgInBjaTEwNmIsMTgiKSB8fAotCSAgICAgCQkgICAgICAgIGRldmljZV9pc19jb21wYXRpYmxlKG5wLCAicGNpMTA2YiwzMCIpIHx8Ci0JICAgICAJCSAgICAgICAgZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJwY2kxMWMxLDU4MTEiKSkpIHsKLQkJCQltYWNpb19jaGlwc1swXS5mbGFncyB8PSBNQUNJT19GTEFHX0ZXX1NVUFBPUlRFRDsKLQkJCQljb3JlOTlfZmlyZXdpcmVfZW5hYmxlKG5wLCAwLCAxKTsKLQkJCX0KLQkJCW5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUobnAsICJmaXJld2lyZSIpOwotCQl9Ci0KLQkJLyogRW5hYmxlIEFUQS0xMDAgYmVmb3JlIFBDSSBwcm9iZS4gKi8KLQkJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiYXRhLTYiKTsKLQkJd2hpbGUobnApIHsKLQkJCWlmIChucC0+cGFyZW50Ci0JCQkgICAgJiYgZGV2aWNlX2lzX2NvbXBhdGlibGUobnAtPnBhcmVudCwgInVuaS1ub3J0aCIpCi0JCQkgICAgJiYgZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJrYXVhaS1hdGEiKSkgewotCQkJCWNvcmU5OV9hdGExMDBfZW5hYmxlKG5wLCAxKTsKLQkJCX0KLQkJCW5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUobnAsICJhdGEtNiIpOwotCQl9Ci0KLQkJLyogU3dpdGNoIGFpcnBvcnQgb2ZmICovCi0JCW5wID0gZmluZF9kZXZpY2VzKCJyYWRpbyIpOwotCQl3aGlsZShucCkgewotCQkJaWYgKG5wICYmIG5wLT5wYXJlbnQgPT0gbWFjaW9fY2hpcHNbMF0ub2Zfbm9kZSkgewotCQkJCW1hY2lvX2NoaXBzWzBdLmZsYWdzIHw9IE1BQ0lPX0ZMQUdfQUlSUE9SVF9PTjsKLQkJCQljb3JlOTlfYWlycG9ydF9lbmFibGUobnAsIDAsIDApOwotCQkJfQotCQkJbnAgPSBucC0+bmV4dDsKLQkJfQotCX0KLQotCS8qIE9uIGFsbCBtYWNoaW5lcyB0aGF0IHN1cHBvcnQgc291bmQgUE0sIHN3aXRjaCBzb3VuZCBvZmYgKi8KLQlpZiAobWFjaW9fY2hpcHNbMF0ub2Zfbm9kZSkKLQkJcG1hY19kb19mZWF0dXJlX2NhbGwoUE1BQ19GVFJfU09VTkRfQ0hJUF9FTkFCTEUsCi0JCQltYWNpb19jaGlwc1swXS5vZl9ub2RlLCAwLCAwKTsKLQotCS8qIFdoaWxlIG9uIHNvbWUgZGVza3RvcCBHM3MsIHdlIHR1cm4gaXQgYmFjayBvbiAqLwotCWlmIChtYWNpb19jaGlwc1swXS5vZl9ub2RlICYmIG1hY2lvX2NoaXBzWzBdLnR5cGUgPT0gbWFjaW9faGVhdGhyb3cKLQkJJiYgKHBtYWNfbWIubW9kZWxfaWQgPT0gUE1BQ19UWVBFX0dPU1NBTUVSIHx8Ci0JCSAgICBwbWFjX21iLm1vZGVsX2lkID09IFBNQUNfVFlQRV9TSUxLKSkgewotCQlzdHJ1Y3QgbWFjaW9fY2hpcCogbWFjaW8gPSAmbWFjaW9fY2hpcHNbMF07Ci0JCU1BQ0lPX0JJUyhIRUFUSFJPV19GQ1IsIEhSV19TT1VORF9DTEtfRU5BQkxFKTsKLQkJTUFDSU9fQklDKEhFQVRIUk9XX0ZDUiwgSFJXX1NPVU5EX1BPV0VSX04pOwotCX0KLQotCS8qIFNvbWUgbWFjaGluZSBtb2RlbHMgbmVlZCB0aGUgY2xvY2sgY2hpcCB0byBiZSBwcm9wZXJseSBzZXR1cCBmb3IKLQkgKiBjbG9jayBzcHJlYWRpbmcgbm93LiBUaGlzIHNob3VsZCBiZSBhIHBsYXRmb3JtIGZ1bmN0aW9uIGJ1dCB3ZQotCSAqIGRvbid0IGRvIHRoZXNlIGF0IHRoZSBtb21lbnQKLQkgKi8KLQlwbWFjX3R3ZWFrX2Nsb2NrX3NwcmVhZGluZygxKTsKLQotI2VuZGlmIC8qIENPTkZJR19QT1dFUjQgKi8KLQotCS8qIE9uIGFsbCBtYWNoaW5lcywgc3dpdGNoIG1vZGVtICYgc2VyaWFsIHBvcnRzIG9mZiAqLwotCW5wID0gZmluZF9kZXZpY2VzKCJjaC1hIik7Ci0Jd2hpbGUobnApIHsKLQkJaW5pdGlhbF9zZXJpYWxfc2h1dGRvd24obnApOwotCQlucCA9IG5wLT5uZXh0OwotCX0KLQlucCA9IGZpbmRfZGV2aWNlcygiY2gtYiIpOwotCXdoaWxlKG5wKSB7Ci0JCWluaXRpYWxfc2VyaWFsX3NodXRkb3duKG5wKTsKLQkJbnAgPSBucC0+bmV4dDsKLQl9Ci19Ci0KLXZvaWQgX19pbml0Ci1wbWFjX2ZlYXR1cmVfaW5pdCh2b2lkKQotewotCS8qIERldGVjdCB0aGUgVW5pTm9ydGggbWVtb3J5IGNvbnRyb2xsZXIgKi8KLQlwcm9iZV91bmlub3J0aCgpOwotCi0JLyogUHJvYmUgbWFjLWlvIGNvbnRyb2xsZXJzICovCi0JaWYgKHByb2JlX21hY2lvcygpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIk5vIG1hYy1pbyBjaGlwIGZvdW5kXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFNldHVwIGxvdy1sZXZlbCBpMmMgc3R1ZmZzICovCi0JcG1hY19pbml0X2xvd19pMmMoKTsKLQotCS8qIFByb2JlIG1hY2hpbmUgdHlwZSAqLwotCWlmIChwcm9iZV9tb3RoZXJib2FyZCgpKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbmtub3duIFBvd2VyTWFjICFcbiIpOwotCi0JLyogU2V0IHNvbWUgaW5pdGlhbCBmZWF0dXJlcyAodHVybiBvZmYgc29tZSBjaGlwcyB0aGF0IHdpbGwKLQkgKiBiZSBsYXRlciB0dXJuZWQgb24pCi0JICovCi0Jc2V0X2luaXRpYWxfZmVhdHVyZXMoKTsKLX0KLQotaW50IF9faW5pdAotcG1hY19mZWF0dXJlX2xhdGVfaW5pdCh2b2lkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSogbnA7Ci0KLQkvKiBSZXF1ZXN0IHNvbWUgcmVzb3VyY2VzIGxhdGUgKi8KLQlpZiAodW5pbm9ydGhfbm9kZSkKLQkJcmVxdWVzdF9PRl9yZXNvdXJjZSh1bmlub3J0aF9ub2RlLCAwLCBOVUxMKTsKLQlucCA9IGZpbmRfZGV2aWNlcygiaGFtbWVyaGVhZCIpOwotCWlmIChucCkKLQkJcmVxdWVzdF9PRl9yZXNvdXJjZShucCwgMCwgTlVMTCk7Ci0JbnAgPSBmaW5kX2RldmljZXMoImludGVycnVwdC1jb250cm9sbGVyIik7Ci0JaWYgKG5wKQotCQlyZXF1ZXN0X09GX3Jlc291cmNlKG5wLCAwLCBOVUxMKTsKLQlyZXR1cm4gMDsKLX0KLQotZGV2aWNlX2luaXRjYWxsKHBtYWNfZmVhdHVyZV9sYXRlX2luaXQpOwotCi0jaWZkZWYgQ09ORklHX1BPV0VSNAotCi1zdGF0aWMgdm9pZCBkdW1wX0hUX3NwZWVkcyhjaGFyICpuYW1lLCB1MzIgY2ZnLCB1MzIgZnJxKQotewotCWludAlmcmVxc1sxNl0gPSB7IDIwMCwzMDAsNDAwLDUwMCw2MDAsODAwLDEwMDAsMCwwLDAsMCwwLDAsMCwwLDAgfTsKLQlpbnQJYml0c1s4XSA9IHsgOCwxNiwwLDMyLDIsNCwwLDAgfTsKLQlpbnQJZnJlcSA9IChmcnEgPj4gOCkgJiAweGY7Ci0KLQlpZiAoZnJlcXNbZnJlcV0gPT0gMCkKLQkJcHJpbnRrKCIlczogVW5rbm93biBIVCBsaW5rIGZyZXF1ZW5jeSAleFxuIiwgbmFtZSwgZnJlcSk7Ci0JZWxzZQotCQlwcmludGsoIiVzOiAlZCBNSHogb24gbWFpbiBsaW5rLCAoJWQgaW4gLyAlZCBvdXQpIGJpdHMgd2lkdGhcbiIsCi0JCSAgICAgICBuYW1lLCBmcmVxc1tmcmVxXSwKLQkJICAgICAgIGJpdHNbKGNmZyA+PiAyOCkgJiAweDddLCBiaXRzWyhjZmcgPj4gMjQpICYgMHg3XSk7Ci19Ci0KLXZvaWQgX19pbml0IHBtYWNfY2hlY2tfaHRfbGluayh2b2lkKQotewotCXUzMgl1ZnJlcSwgZnJlcSwgdWNmZywgY2ZnOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGNpeF9ub2RlOwotCXU4ICAJcHhfYnVzLCBweF9kZXZmbjsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnB4X2hvc2U7Ci0KLQkodm9pZClpbl9iZTMyKHUzX2h0ICsgVTNfSFRfTElOS19DT01NQU5EKTsKLQl1Y2ZnID0gY2ZnID0gaW5fYmUzMih1M19odCArIFUzX0hUX0xJTktfQ09ORklHKTsKLQl1ZnJlcSA9IGZyZXEgPSBpbl9iZTMyKHUzX2h0ICsgVTNfSFRfTElOS19GUkVRKTsKLQlkdW1wX0hUX3NwZWVkcygiVTMgSHlwZXJUcmFuc3BvcnQiLCBjZmcsIGZyZXEpOwotCi0JcGNpeF9ub2RlID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgInBjaSIsICJwY2kteCIpOwotCWlmIChwY2l4X25vZGUgPT0gTlVMTCkgewotCQlwcmludGsoIk5vIFBDSS1YIGJyaWRnZSBmb3VuZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHBjaV9kZXZpY2VfZnJvbV9PRl9ub2RlKHBjaXhfbm9kZSwgJnB4X2J1cywgJnB4X2RldmZuKSAhPSAwKSB7Ci0JCXByaW50aygiUENJLVggYnJpZGdlIGZvdW5kIGJ1dCBub3QgbWF0Y2hlZCB0byBwY2lcbiIpOwotCQlyZXR1cm47Ci0JfQotCXB4X2hvc2UgPSBwY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2UocGNpeF9ub2RlKTsKLQlpZiAocHhfaG9zZSA9PSBOVUxMKSB7Ci0JCXByaW50aygiUENJLVggYnJpZGdlIGZvdW5kIGJ1dCBub3QgbWF0Y2hlZCB0byBob3N0XG4iKTsKLQkJcmV0dXJuOwotCX0JCi0JZWFybHlfcmVhZF9jb25maWdfZHdvcmQocHhfaG9zZSwgcHhfYnVzLCBweF9kZXZmbiwgMHhjNCwgJmNmZyk7Ci0JZWFybHlfcmVhZF9jb25maWdfZHdvcmQocHhfaG9zZSwgcHhfYnVzLCBweF9kZXZmbiwgMHhjYywgJmZyZXEpOwotCWR1bXBfSFRfc3BlZWRzKCJQQ0ktWCBIVCBVcGxpbmsiLCBjZmcsIGZyZXEpOwotCWVhcmx5X3JlYWRfY29uZmlnX2R3b3JkKHB4X2hvc2UsIHB4X2J1cywgcHhfZGV2Zm4sIDB4YzgsICZjZmcpOwotCWVhcmx5X3JlYWRfY29uZmlnX2R3b3JkKHB4X2hvc2UsIHB4X2J1cywgcHhfZGV2Zm4sIDB4ZDAsICZmcmVxKTsKLQlkdW1wX0hUX3NwZWVkcygiUENJLVggSFQgRG93bmxpbmsiLCBjZmcsIGZyZXEpOwotfQotCi0jZW5kaWYgLyogQ09ORklHX1BPV0VSNCAqLwotCi0vKgotICogRWFybHkgdmlkZW8gcmVzdW1lIGhvb2sKLSAqLwotCi1zdGF0aWMgdm9pZCAoKnBtYWNfZWFybHlfdnJlc3VtZV9wcm9jKSh2b2lkICpkYXRhKTsKLXN0YXRpYyB2b2lkICpwbWFjX2Vhcmx5X3ZyZXN1bWVfZGF0YTsKLQotdm9pZCBwbWFjX3NldF9lYXJseV92aWRlb19yZXN1bWUodm9pZCAoKnByb2MpKHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKQotewotCWlmIChfbWFjaGluZSAhPSBfTUFDSF9QbWFjKQotCQlyZXR1cm47Ci0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0JcG1hY19lYXJseV92cmVzdW1lX3Byb2MgPSBwcm9jOwotCXBtYWNfZWFybHlfdnJlc3VtZV9kYXRhID0gZGF0YTsKLQlwcmVlbXB0X2VuYWJsZSgpOwotfQotRVhQT1JUX1NZTUJPTChwbWFjX3NldF9lYXJseV92aWRlb19yZXN1bWUpOwotCi12b2lkIHBtYWNfY2FsbF9lYXJseV92aWRlb19yZXN1bWUodm9pZCkKLXsKLQlpZiAocG1hY19lYXJseV92cmVzdW1lX3Byb2MpCi0JCXBtYWNfZWFybHlfdnJlc3VtZV9wcm9jKHBtYWNfZWFybHlfdnJlc3VtZV9kYXRhKTsKLX0KLQotLyoKLSAqIEFHUCByZWxhdGVkIHN1c3BlbmQvcmVzdW1lIGNvZGUKLSAqLwotCi1zdGF0aWMgc3RydWN0IHBjaV9kZXYgKnBtYWNfYWdwX2JyaWRnZTsKLXN0YXRpYyBpbnQgKCpwbWFjX2FncF9zdXNwZW5kKShzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlKTsKLXN0YXRpYyBpbnQgKCpwbWFjX2FncF9yZXN1bWUpKHN0cnVjdCBwY2lfZGV2ICpicmlkZ2UpOwotCi12b2lkIHBtYWNfcmVnaXN0ZXJfYWdwX3BtKHN0cnVjdCBwY2lfZGV2ICpicmlkZ2UsCi0JCQkJIGludCAoKnN1c3BlbmQpKHN0cnVjdCBwY2lfZGV2ICpicmlkZ2UpLAotCQkJCSBpbnQgKCpyZXN1bWUpKHN0cnVjdCBwY2lfZGV2ICpicmlkZ2UpKQotewotCWlmIChzdXNwZW5kIHx8IHJlc3VtZSkgewotCQlwbWFjX2FncF9icmlkZ2UgPSBicmlkZ2U7Ci0JCXBtYWNfYWdwX3N1c3BlbmQgPSBzdXNwZW5kOwotCQlwbWFjX2FncF9yZXN1bWUgPSByZXN1bWU7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGJyaWRnZSAhPSBwbWFjX2FncF9icmlkZ2UpCi0JCXJldHVybjsKLQlwbWFjX2FncF9zdXNwZW5kID0gcG1hY19hZ3BfcmVzdW1lID0gTlVMTDsKLQlyZXR1cm47Ci19Ci1FWFBPUlRfU1lNQk9MKHBtYWNfcmVnaXN0ZXJfYWdwX3BtKTsKLQotdm9pZCBwbWFjX3N1c3BlbmRfYWdwX2Zvcl9jYXJkKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JaWYgKHBtYWNfYWdwX2JyaWRnZSA9PSBOVUxMIHx8IHBtYWNfYWdwX3N1c3BlbmQgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWlmIChwbWFjX2FncF9icmlkZ2UtPmJ1cyAhPSBkZXYtPmJ1cykKLQkJcmV0dXJuOwotCXBtYWNfYWdwX3N1c3BlbmQocG1hY19hZ3BfYnJpZGdlKTsKLX0KLUVYUE9SVF9TWU1CT0wocG1hY19zdXNwZW5kX2FncF9mb3JfY2FyZCk7Ci0KLXZvaWQgcG1hY19yZXN1bWVfYWdwX2Zvcl9jYXJkKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JaWYgKHBtYWNfYWdwX2JyaWRnZSA9PSBOVUxMIHx8IHBtYWNfYWdwX3Jlc3VtZSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JaWYgKHBtYWNfYWdwX2JyaWRnZS0+YnVzICE9IGRldi0+YnVzKQotCQlyZXR1cm47Ci0JcG1hY19hZ3BfcmVzdW1lKHBtYWNfYWdwX2JyaWRnZSk7Ci19Ci1FWFBPUlRfU1lNQk9MKHBtYWNfcmVzdW1lX2FncF9mb3JfY2FyZCk7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19sb3dfaTJjLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19sb3dfaTJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NTgzZmMuLjAwMDAwMDAKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfbG93X2kyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTExICswLDAgQEAKLS8qCi0gKiAgYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfbG93X2kyYy5jCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMyBCZW4uIEhlcnJlbnNjaG1pZHQgKGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZykKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHNvbWUgbG93LWxldmVsIGkyYyBhY2Nlc3Mgcm91dGluZXMgdGhhdAotICogIG5lZWQgdG8gYmUgdXNlZCBieSB2YXJpb3VzIGJpdHMgb2YgdGhlIFBvd2VyTWFjIHBsYXRmb3JtIGNvZGUKLSAqICBhdCB0aW1lcyB3aGVyZSB0aGUgcmVhbCBhc3luY2hyb25vdXMgJiBpbnRlcnJ1cHQgZHJpdmVuIGRyaXZlcgotICogIGNhbm5vdCBiZSB1c2VkLiBUaGUgQVBJIGJvcnJvd3Mgc29tZSBzZW1hbnRpY3MgZnJvbSB0aGUgZGFyd2luCi0gKiAgZHJpdmVyIGluIG9yZGVyIHRvIGVhc2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwbGF0Zm9ybQotICogIHByb3BlcnRpZXMgcGFyc2VyCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9hZGIuaD4KLSNpbmNsdWRlIDxsaW51eC9wbXUuaD4KLSNpbmNsdWRlIDxhc20va2V5bGFyZ28uaD4KLSNpbmNsdWRlIDxhc20vdW5pbm9ydGguaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaW5jbHVkZSA8YXNtL3BtYWNfbG93X2kyYy5oPgotCi0jZGVmaW5lIE1BWF9MT1dfSTJDX0hPU1QJNAotCi0jaWYgMQotI2RlZmluZSBEQkcoeC4uLikgZG8ge1wKLQkJcHJpbnRrKEtFUk5fREVCVUcgIktXOiIgeCk7CVwKLQl9IHdoaWxlKDApCi0jZWxzZQotI2RlZmluZSBEQkdHKHguLi4pCi0jZW5kaWYKLQotc3RydWN0IGxvd19pMmNfaG9zdDsKLQotdHlwZWRlZiBpbnQgKCpsb3dfaTJjX2Z1bmNfdCkoc3RydWN0IGxvd19pMmNfaG9zdCAqaG9zdCwgdTggYWRkciwgdTggc3ViLCB1OCAqZGF0YSwgaW50IGxlbik7Ci0KLXN0cnVjdCBsb3dfaTJjX2hvc3QKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUJKm5wOwkJLyogT0YgZGV2aWNlIG5vZGUgKi8KLQlzdHJ1Y3Qgc2VtYXBob3JlCW11dGV4OwkJLyogQWNjZXNzIG11dGV4IGZvciB1c2UgYnkgaTJjLWtleXdlc3QgKi8KLQlsb3dfaTJjX2Z1bmNfdAkJZnVuYzsJCS8qIEFjY2VzcyBmdW5jdGlvbiAqLwotCWludAkJCWlzX29wZW4gOiAxOwkvKiBQb29yIG1hbidzIGFjY2VzcyBjb250cm9sICovCi0JaW50CQkJbW9kZTsJCS8qIEN1cnJlbnQgbW9kZSAqLwotCWludAkJCWNoYW5uZWw7CS8qIEN1cnJlbnQgY2hhbm5lbCAqLwotCWludAkJCW51bV9jaGFubmVsczsJLyogTnVtYmVyIG9mIGNoYW5uZWxzICovCi0Jdm9pZCBfX2lvbWVtICoJCWJhc2U7CQkvKiBGb3Iga2V5d2VzdC1pMmMsIGJhc2UgYWRkcmVzcyAqLwotCWludAkJCWJzdGVwczsJCS8qIEFuZCByZWdpc3RlciBzdGVwcGluZyAqLwotCWludAkJCXNwZWVkOwkJLyogQW5kIHNwZWVkICovCi19OwotCi1zdGF0aWMgc3RydWN0IGxvd19pMmNfaG9zdAlsb3dfaTJjX2hvc3RzW01BWF9MT1dfSTJDX0hPU1RdOwotCi0vKiBObyBsb2NraW5nIGlzIG5lY2Vzc2FyeSBvbiBhbGxvY2F0aW9uLCB3ZSBhcmUgcnVubmluZyB3YXkgYmVmb3JlCi0gKiBhbnl0aGluZyBjYW4gcmFjZSB3aXRoIHVzCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbG93X2kyY19ob3N0ICpmaW5kX2xvd19pMmNfaG9zdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9MT1dfSTJDX0hPU1Q7IGkrKykKLQkJaWYgKGxvd19pMmNfaG9zdHNbaV0ubnAgPT0gbnApCi0JCQlyZXR1cm4gJmxvd19pMmNfaG9zdHNbaV07Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKgotICogaTJjLWtleXdlc3QgaW1wbGVtZW50YXRpb24gKFVuaU5vcnRoLCBVMiwgVTMsIEtleWxhcmdvJ3MpCi0gKgotICovCi0KLS8qCi0gKiBLZXl3ZXN0IGkyYyBkZWZpbml0aW9ucyBib3Jyb3dlZCBmcm9tIGRyaXZlcnMvaTJjL2kyYy1rZXl3ZXN0LmgsCi0gKiBzaG91bGQgYmUgbW92ZWQgc29tZXdoZXJlIGluIGluY2x1ZGUvYXNtLXBwYy8KLSAqLwotLyogUmVnaXN0ZXIgaW5kaWNlcyAqLwotdHlwZWRlZiBlbnVtIHsKLQlyZWdfbW9kZSA9IDAsCi0JcmVnX2NvbnRyb2wsCi0JcmVnX3N0YXR1cywKLQlyZWdfaXNyLAotCXJlZ19pZXIsCi0JcmVnX2FkZHIsCi0JcmVnX3N1YmFkZHIsCi0JcmVnX2RhdGEKLX0gcmVnX3Q7Ci0KLQotLyogTW9kZSByZWdpc3RlciAqLwotI2RlZmluZSBLV19JMkNfTU9ERV8xMDBLSFoJMHgwMAotI2RlZmluZSBLV19JMkNfTU9ERV81MEtIWgkweDAxCi0jZGVmaW5lIEtXX0kyQ19NT0RFXzI1S0haCTB4MDIKLSNkZWZpbmUgS1dfSTJDX01PREVfRFVNQgkweDAwCi0jZGVmaW5lIEtXX0kyQ19NT0RFX1NUQU5EQVJECTB4MDQKLSNkZWZpbmUgS1dfSTJDX01PREVfU1RBTkRBUkRTVUIJMHgwOAotI2RlZmluZSBLV19JMkNfTU9ERV9DT01CSU5FRAkweDBDCi0jZGVmaW5lIEtXX0kyQ19NT0RFX01PREVfTUFTSwkweDBDCi0jZGVmaW5lIEtXX0kyQ19NT0RFX0NIQU5fTUFTSwkweEYwCi0KLS8qIENvbnRyb2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgS1dfSTJDX0NUTF9BQUsJCTB4MDEKLSNkZWZpbmUgS1dfSTJDX0NUTF9YQUREUgkweDAyCi0jZGVmaW5lIEtXX0kyQ19DVExfU1RPUAkJMHgwNAotI2RlZmluZSBLV19JMkNfQ1RMX1NUQVJUCTB4MDgKLQotLyogU3RhdHVzIHJlZ2lzdGVyICovCi0jZGVmaW5lIEtXX0kyQ19TVEFUX0JVU1kJMHgwMQotI2RlZmluZSBLV19JMkNfU1RBVF9MQVNUX0FBSwkweDAyCi0jZGVmaW5lIEtXX0kyQ19TVEFUX0xBU1RfUlcJMHgwNAotI2RlZmluZSBLV19JMkNfU1RBVF9TREEJCTB4MDgKLSNkZWZpbmUgS1dfSTJDX1NUQVRfU0NMCQkweDEwCi0KLS8qIElFUiAmIElTUiByZWdpc3RlcnMgKi8KLSNkZWZpbmUgS1dfSTJDX0lSUV9EQVRBCQkweDAxCi0jZGVmaW5lIEtXX0kyQ19JUlFfQUREUgkJMHgwMgotI2RlZmluZSBLV19JMkNfSVJRX1NUT1AJCTB4MDQKLSNkZWZpbmUgS1dfSTJDX0lSUV9TVEFSVAkweDA4Ci0jZGVmaW5lIEtXX0kyQ19JUlFfTUFTSwkJMHgwRgotCi0vKiBTdGF0ZSBtYWNoaW5lIHN0YXRlcyAqLwotZW51bSB7Ci0Jc3RhdGVfaWRsZSwKLQlzdGF0ZV9hZGRyLAotCXN0YXRlX3JlYWQsCi0Jc3RhdGVfd3JpdGUsCi0Jc3RhdGVfc3RvcCwKLQlzdGF0ZV9kZWFkCi19OwotCi0jZGVmaW5lIFdST05HX1NUQVRFKG5hbWUpIGRvIHtcCi0JCXByaW50ayhLRVJOX0RFQlVHICJLVzogd3Jvbmcgc3RhdGUuIEdvdCAlcywgc3RhdGU6ICVzIChpc3I6ICUwMngpXG4iLCBcCi0JCSAgICAgICBuYW1lLCBfX2t3X3N0YXRlX25hbWVzW3N0YXRlXSwgaXNyKTsgXAotCX0gd2hpbGUoMCkKLQotc3RhdGljIGNvbnN0IGNoYXIgKl9fa3dfc3RhdGVfbmFtZXNbXSA9IHsKLQkic3RhdGVfaWRsZSIsCi0JInN0YXRlX2FkZHIiLAotCSJzdGF0ZV9yZWFkIiwKLQkic3RhdGVfd3JpdGUiLAotCSJzdGF0ZV9zdG9wIiwKLQkic3RhdGVfZGVhZCIKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdTggX19rd19yZWFkX3JlZyhzdHJ1Y3QgbG93X2kyY19ob3N0ICpob3N0LCByZWdfdCByZWcpCi17Ci0JcmV0dXJuIGluXzgoaG9zdC0+YmFzZSArICgoKHVuc2lnbmVkKXJlZykgPDwgaG9zdC0+YnN0ZXBzKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2t3X3dyaXRlX3JlZyhzdHJ1Y3QgbG93X2kyY19ob3N0ICpob3N0LCByZWdfdCByZWcsIHU4IHZhbCkKLXsKLQlvdXRfOChob3N0LT5iYXNlICsgKCgodW5zaWduZWQpcmVnKSA8PCBob3N0LT5ic3RlcHMpLCB2YWwpOwotCSh2b2lkKV9fa3dfcmVhZF9yZWcoaG9zdCwgcmVnX3N1YmFkZHIpOwotfQotCi0jZGVmaW5lIGt3X3dyaXRlX3JlZyhyZWcsIHZhbCkJX19rd193cml0ZV9yZWcoaG9zdCwgcmVnLCB2YWwpIAotI2RlZmluZSBrd19yZWFkX3JlZyhyZWcpCV9fa3dfcmVhZF9yZWcoaG9zdCwgcmVnKSAKLQotCi0vKiBEb24ndCBzY2hlZHVsZSwgdGhlIGc1IGZhbiBjb250cm9sbGVyIGlzIHRvbwotICogdGltaW5nIHNlbnNpdGl2ZQotICovCi1zdGF0aWMgdTgga3dfd2FpdF9pbnRlcnJ1cHQoc3RydWN0IGxvd19pMmNfaG9zdCogaG9zdCkKLXsKLQlpbnQgaTsKLQl1OCBpc3I7Ci0JCi0JZm9yIChpID0gMDsgaSA8IDIwMDAwMDsgaSsrKSB7Ci0JCWlzciA9IGt3X3JlYWRfcmVnKHJlZ19pc3IpICYgS1dfSTJDX0lSUV9NQVNLOwotCQlpZiAoaXNyICE9IDApCi0JCQlyZXR1cm4gaXNyOwotCQl1ZGVsYXkoMSk7Ci0JfQotCXJldHVybiBpc3I7Ci19Ci0KLXN0YXRpYyBpbnQga3dfaGFuZGxlX2ludGVycnVwdChzdHJ1Y3QgbG93X2kyY19ob3N0ICpob3N0LCBpbnQgc3RhdGUsIGludCBydywgaW50ICpyYywgdTggKipkYXRhLCBpbnQgKmxlbiwgdTggaXNyKQotewotCXU4IGFjazsKLQotCWlmIChpc3IgPT0gMCkgewotCQlpZiAoc3RhdGUgIT0gc3RhdGVfc3RvcCkgewotCQkJREJHKCJLVzogVGltZW91dCAhXG4iKTsKLQkJCSpyYyA9IC1FSU87Ci0JCQlnb3RvIHN0b3A7Ci0JCX0KLQkJaWYgKHN0YXRlID09IHN0YXRlX3N0b3ApIHsKLQkJCWFjayA9IGt3X3JlYWRfcmVnKHJlZ19zdGF0dXMpOwotCQkJaWYgKCEoYWNrICYgS1dfSTJDX1NUQVRfQlVTWSkpIHsKLQkJCQlzdGF0ZSA9IHN0YXRlX2lkbGU7Ci0JCQkJa3dfd3JpdGVfcmVnKHJlZ19pZXIsIDB4MDApOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdGF0ZTsKLQl9Ci0KLQlpZiAoaXNyICYgS1dfSTJDX0lSUV9BRERSKSB7Ci0JCWFjayA9IGt3X3JlYWRfcmVnKHJlZ19zdGF0dXMpOwotCQlpZiAoc3RhdGUgIT0gc3RhdGVfYWRkcikgewotCQkJa3dfd3JpdGVfcmVnKHJlZ19pc3IsIEtXX0kyQ19JUlFfQUREUik7Ci0JCQlXUk9OR19TVEFURSgiS1dfSTJDX0lSUV9BRERSIik7IAotCQkJKnJjID0gLUVJTzsKLQkJCWdvdG8gc3RvcDsKLQkJfQotCQlpZiAoKGFjayAmIEtXX0kyQ19TVEFUX0xBU1RfQUFLKSA9PSAwKSB7CQkJCi0JCQkqcmMgPSAtRU5PREVWOwotCQkJREJHKCJLVzogTkFLIG9uIGFkZHJlc3NcbiIpOwotCQkJcmV0dXJuIHN0YXRlX3N0b3A7CQkgICAgIAotCQl9IGVsc2UgewotCQkJaWYgKHJ3KSB7Ci0JCQkJc3RhdGUgPSBzdGF0ZV9yZWFkOwotCQkJCWlmICgqbGVuID4gMSkKLQkJCQkJa3dfd3JpdGVfcmVnKHJlZ19jb250cm9sLCBLV19JMkNfQ1RMX0FBSyk7Ci0JCQl9IGVsc2UgewotCQkJCXN0YXRlID0gc3RhdGVfd3JpdGU7Ci0JCQkJa3dfd3JpdGVfcmVnKHJlZ19kYXRhLCAqKmRhdGEpOwotCQkJCSgqZGF0YSkrKzsgKCpsZW4pLS07Ci0JCQl9Ci0JCX0KLQkJa3dfd3JpdGVfcmVnKHJlZ19pc3IsIEtXX0kyQ19JUlFfQUREUik7Ci0JfQotCi0JaWYgKGlzciAmIEtXX0kyQ19JUlFfREFUQSkgewotCQlpZiAoc3RhdGUgPT0gc3RhdGVfcmVhZCkgewotCQkJKipkYXRhID0ga3dfcmVhZF9yZWcocmVnX2RhdGEpOwotCQkJKCpkYXRhKSsrOyAoKmxlbiktLTsKLQkJCWt3X3dyaXRlX3JlZyhyZWdfaXNyLCBLV19JMkNfSVJRX0RBVEEpOwotCQkJaWYgKCgqbGVuKSA9PSAwKQotCQkJCXN0YXRlID0gc3RhdGVfc3RvcDsKLQkJCWVsc2UgaWYgKCgqbGVuKSA9PSAxKQotCQkJCWt3X3dyaXRlX3JlZyhyZWdfY29udHJvbCwgMCk7Ci0JCX0gZWxzZSBpZiAoc3RhdGUgPT0gc3RhdGVfd3JpdGUpIHsKLQkJCWFjayA9IGt3X3JlYWRfcmVnKHJlZ19zdGF0dXMpOwotCQkJaWYgKChhY2sgJiBLV19JMkNfU1RBVF9MQVNUX0FBSykgPT0gMCkgewotCQkJCURCRygiS1c6IG5hY2sgb24gZGF0YSB3cml0ZVxuIik7Ci0JCQkJKnJjID0gLUVJTzsKLQkJCQlnb3RvIHN0b3A7Ci0JCQl9IGVsc2UgaWYgKCpsZW4pIHsKLQkJCQlrd193cml0ZV9yZWcocmVnX2RhdGEsICoqZGF0YSk7Ci0JCQkJKCpkYXRhKSsrOyAoKmxlbiktLTsKLQkJCX0gZWxzZSB7Ci0JCQkJa3dfd3JpdGVfcmVnKHJlZ19jb250cm9sLCBLV19JMkNfQ1RMX1NUT1ApOwotCQkJCXN0YXRlID0gc3RhdGVfc3RvcDsKLQkJCQkqcmMgPSAwOwotCQkJfQotCQkJa3dfd3JpdGVfcmVnKHJlZ19pc3IsIEtXX0kyQ19JUlFfREFUQSk7Ci0JCX0gZWxzZSB7Ci0JCQlrd193cml0ZV9yZWcocmVnX2lzciwgS1dfSTJDX0lSUV9EQVRBKTsKLQkJCVdST05HX1NUQVRFKCJLV19JMkNfSVJRX0RBVEEiKTsgCi0JCQlpZiAoc3RhdGUgIT0gc3RhdGVfc3RvcCkgewotCQkJCSpyYyA9IC1FSU87Ci0JCQkJZ290byBzdG9wOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKGlzciAmIEtXX0kyQ19JUlFfU1RPUCkgewotCQlrd193cml0ZV9yZWcocmVnX2lzciwgS1dfSTJDX0lSUV9TVE9QKTsKLQkJaWYgKHN0YXRlICE9IHN0YXRlX3N0b3ApIHsKLQkJCVdST05HX1NUQVRFKCJLV19JMkNfSVJRX1NUT1AiKTsKLQkJCSpyYyA9IC1FSU87Ci0JCX0KLQkJcmV0dXJuIHN0YXRlX2lkbGU7Ci0JfQotCi0JaWYgKGlzciAmIEtXX0kyQ19JUlFfU1RBUlQpCi0JCWt3X3dyaXRlX3JlZyhyZWdfaXNyLCBLV19JMkNfSVJRX1NUQVJUKTsKLQotCXJldHVybiBzdGF0ZTsKLQotIHN0b3A6Ci0Ja3dfd3JpdGVfcmVnKHJlZ19jb250cm9sLCBLV19JMkNfQ1RMX1NUT1ApOwkKLQlyZXR1cm4gc3RhdGVfc3RvcDsKLX0KLQotc3RhdGljIGludCBrZXl3ZXN0X2xvd19pMmNfZnVuYyhzdHJ1Y3QgbG93X2kyY19ob3N0ICpob3N0LCB1OCBhZGRyLCB1OCBzdWJhZGRyLCB1OCAqZGF0YSwgaW50IGxlbikKLXsKLQl1OCBtb2RlX3JlZyA9IGhvc3QtPnNwZWVkOwotCWludCBzdGF0ZSA9IHN0YXRlX2FkZHI7Ci0JaW50IHJjID0gMDsKLQotCS8qIFNldHVwIG1vZGUgJiBzdWJhZGRyZXNzIGlmIGFueSAqLwotCXN3aXRjaChob3N0LT5tb2RlKSB7Ci0JY2FzZSBwbWFjX2xvd19pMmNfbW9kZV9kdW1iOgotCQlwcmludGsoS0VSTl9FUlIgImxvd19pMmM6IER1bWIgbW9kZSBub3Qgc3VwcG9ydGVkICFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQljYXNlIHBtYWNfbG93X2kyY19tb2RlX3N0ZDoKLQkJbW9kZV9yZWcgfD0gS1dfSTJDX01PREVfU1RBTkRBUkQ7Ci0JCWJyZWFrOwotCWNhc2UgcG1hY19sb3dfaTJjX21vZGVfc3Rkc3ViOgotCQltb2RlX3JlZyB8PSBLV19JMkNfTU9ERV9TVEFOREFSRFNVQjsKLQkJa3dfd3JpdGVfcmVnKHJlZ19zdWJhZGRyLCBzdWJhZGRyKTsKLQkJYnJlYWs7Ci0JY2FzZSBwbWFjX2xvd19pMmNfbW9kZV9jb21iaW5lZDoKLQkJbW9kZV9yZWcgfD0gS1dfSTJDX01PREVfQ09NQklORUQ7Ci0JCWt3X3dyaXRlX3JlZyhyZWdfc3ViYWRkciwgc3ViYWRkcik7Ci0JCWJyZWFrOwotCX0KLQotCS8qIFNldHVwIGNoYW5uZWwgJiBjbGVhciBwZW5kaW5nIGlycXMgKi8KLQlrd193cml0ZV9yZWcocmVnX2lzciwga3dfcmVhZF9yZWcocmVnX2lzcikpOwotCWt3X3dyaXRlX3JlZyhyZWdfbW9kZSwgbW9kZV9yZWcgfCAoaG9zdC0+Y2hhbm5lbCA8PCA0KSk7Ci0Ja3dfd3JpdGVfcmVnKHJlZ19zdGF0dXMsIDApOwotCi0JLyogU2V0IHVwIGFkZHJlc3MgYW5kIHIvdyBiaXQgKi8KLQlrd193cml0ZV9yZWcocmVnX2FkZHIsIGFkZHIpOwotCi0JLyogU3RhcnQgc2VuZGluZyBhZGRyZXNzICYgZGlzYWJsZSBpbnRlcnJ1cHQqLwotCWt3X3dyaXRlX3JlZyhyZWdfaWVyLCAwIC8qS1dfSTJDX0lSUV9NQVNLKi8pOwotCWt3X3dyaXRlX3JlZyhyZWdfY29udHJvbCwgS1dfSTJDX0NUTF9YQUREUik7Ci0KLQkvKiBTdGF0ZSBtYWNoaW5lLCB0byB0dXJuIGludG8gYW4gaW50ZXJydXB0IGhhbmRsZXIgKi8KLQl3aGlsZShzdGF0ZSAhPSBzdGF0ZV9pZGxlKSB7Ci0JCXU4IGlzciA9IGt3X3dhaXRfaW50ZXJydXB0KGhvc3QpOwotCQlzdGF0ZSA9IGt3X2hhbmRsZV9pbnRlcnJ1cHQoaG9zdCwgc3RhdGUsIGFkZHIgJiAxLCAmcmMsICZkYXRhLCAmbGVuLCBpc3IpOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQga2V5d2VzdF9sb3dfaTJjX2FkZChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQotewotCXN0cnVjdCBsb3dfaTJjX2hvc3QJKmhvc3QgPSBmaW5kX2xvd19pMmNfaG9zdChOVUxMKTsKLQl1bnNpZ25lZCBsb25nCQkqcHN0ZXBzLCAqcHJhdGUsIHN0ZXBzLCBhb2Zmc2V0ID0gMDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUJKnBhcmVudDsKLQotCWlmIChob3N0ID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJsb3dfaTJjOiBDYW4ndCBhbGxvY2F0ZSBob3N0IGZvciAlc1xuIiwKLQkJICAgICAgIG5wLT5mdWxsX25hbWUpOwotCQlyZXR1cm47Ci0JfQotCW1lbXNldChob3N0LCAwLCBzaXplb2YoKmhvc3QpKTsKLQotCWluaXRfTVVURVgoJmhvc3QtPm11dGV4KTsKLQlob3N0LT5ucCA9IG9mX25vZGVfZ2V0KG5wKTsJCi0JcHN0ZXBzID0gKHVuc2lnbmVkIGxvbmcgKilnZXRfcHJvcGVydHkobnAsICJBQVBMLGFkZHJlc3Mtc3RlcCIsIE5VTEwpOwotCXN0ZXBzID0gcHN0ZXBzID8gKCpwc3RlcHMpIDogMHgxMDsKLQlmb3IgKGhvc3QtPmJzdGVwcyA9IDA7IChzdGVwcyAmIDB4MDEpID09IDA7IGhvc3QtPmJzdGVwcysrKQotCQlzdGVwcyA+Pj0gMTsKLQlwYXJlbnQgPSBvZl9nZXRfcGFyZW50KG5wKTsKLQlob3N0LT5udW1fY2hhbm5lbHMgPSAxOwotCWlmIChwYXJlbnQgJiYgcGFyZW50LT5uYW1lWzBdID09ICd1JykgewotCQlob3N0LT5udW1fY2hhbm5lbHMgPSAyOwotCQlhb2Zmc2V0ID0gMzsKLQl9Ci0JLyogU2VsZWN0IGludGVyZmFjZSByYXRlICovCi0JaG9zdC0+c3BlZWQgPSBLV19JMkNfTU9ERV8xMDBLSFo7Ci0JcHJhdGUgPSAodW5zaWduZWQgbG9uZyAqKWdldF9wcm9wZXJ0eShucCwgIkFBUEwsaTJjLXJhdGUiLCBOVUxMKTsKLQlpZiAocHJhdGUpIHN3aXRjaCgqcHJhdGUpIHsKLQljYXNlIDEwMDoKLQkJaG9zdC0+c3BlZWQgPSBLV19JMkNfTU9ERV8xMDBLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNTA6Ci0JCWhvc3QtPnNwZWVkID0gS1dfSTJDX01PREVfNTBLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMjU6Ci0JCWhvc3QtPnNwZWVkID0gS1dfSTJDX01PREVfMjVLSFo7Ci0JCWJyZWFrOwotCX0JCi0JaG9zdC0+bW9kZSA9IHBtYWNfbG93X2kyY19tb2RlX3N0ZDsKLQlob3N0LT5iYXNlID0gaW9yZW1hcChucC0+YWRkcnNbMF0uYWRkcmVzcyArIGFvZmZzZXQsCi0JCQkJCQlucC0+YWRkcnNbMF0uc2l6ZSk7Ci0JaG9zdC0+ZnVuYyA9IGtleXdlc3RfbG93X2kyY19mdW5jOwotfQotCi0vKgotICoKLSAqIFBNVSBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotCi0KLSNpZmRlZiBDT05GSUdfQURCX1BNVQotCi1zdGF0aWMgaW50IHBtdV9sb3dfaTJjX2Z1bmMoc3RydWN0IGxvd19pMmNfaG9zdCAqaG9zdCwgdTggYWRkciwgdTggc3ViLCB1OCAqZGF0YSwgaW50IGxlbikKLXsKLQkvLyBUT0RPCi0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyB2b2lkIHBtdV9sb3dfaTJjX2FkZChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQotewotCXN0cnVjdCBsb3dfaTJjX2hvc3QJKmhvc3QgPSBmaW5kX2xvd19pMmNfaG9zdChOVUxMKTsKLQotCWlmIChob3N0ID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJsb3dfaTJjOiBDYW4ndCBhbGxvY2F0ZSBob3N0IGZvciAlc1xuIiwKLQkJICAgICAgIG5wLT5mdWxsX25hbWUpOwotCQlyZXR1cm47Ci0JfQotCW1lbXNldChob3N0LCAwLCBzaXplb2YoKmhvc3QpKTsKLQotCWluaXRfTVVURVgoJmhvc3QtPm11dGV4KTsKLQlob3N0LT5ucCA9IG9mX25vZGVfZ2V0KG5wKTsJCi0JaG9zdC0+bnVtX2NoYW5uZWxzID0gMzsKLQlob3N0LT5tb2RlID0gcG1hY19sb3dfaTJjX21vZGVfc3RkOwotCWhvc3QtPmZ1bmMgPSBwbXVfbG93X2kyY19mdW5jOwotfQotCi0jZW5kaWYgLyogQ09ORklHX0FEQl9QTVUgKi8KLQotdm9pZCBfX2luaXQgcG1hY19pbml0X2xvd19pMmModm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCi0JLyogUHJvYmUga2V5d2VzdC1pMmMgYnVzc2VzICovCi0JbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCAiaTJjIiwgImtleXdlc3QtaTJjIik7Ci0Jd2hpbGUobnApIHsKLQkJa2V5d2VzdF9sb3dfaTJjX2FkZChucCk7Ci0JCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUobnAsICJpMmMiLCAia2V5d2VzdC1pMmMiKTsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfQURCX1BNVQotCS8qIFByb2JlIFBNVSBidXNzZXMgKi8KLQlucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJ2aWEtcG11Iik7Ci0JaWYgKG5wKQotCQlwbXVfbG93X2kyY19hZGQobnApOwotI2VuZGlmIC8qIENPTkZJR19BREJfUE1VICovCi0KLQkvKiBUT0RPOiBBZGQgQ1VEQSBzdXBwb3J0IGFzIHdlbGwgKi8KLX0KLQotaW50IHBtYWNfbG93X2kyY19sb2NrKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCi17Ci0Jc3RydWN0IGxvd19pMmNfaG9zdCAqaG9zdCA9IGZpbmRfbG93X2kyY19ob3N0KG5wKTsKLQotCWlmICghaG9zdCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JZG93bigmaG9zdC0+bXV0ZXgpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChwbWFjX2xvd19pMmNfbG9jayk7Ci0KLWludCBwbWFjX2xvd19pMmNfdW5sb2NrKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCi17Ci0Jc3RydWN0IGxvd19pMmNfaG9zdCAqaG9zdCA9IGZpbmRfbG93X2kyY19ob3N0KG5wKTsKLQotCWlmICghaG9zdCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JdXAoJmhvc3QtPm11dGV4KTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wocG1hY19sb3dfaTJjX3VubG9jayk7Ci0KLQotaW50IHBtYWNfbG93X2kyY19vcGVuKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGludCBjaGFubmVsKQotewotCXN0cnVjdCBsb3dfaTJjX2hvc3QgKmhvc3QgPSBmaW5kX2xvd19pMmNfaG9zdChucCk7Ci0KLQlpZiAoIWhvc3QpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKGNoYW5uZWwgPj0gaG9zdC0+bnVtX2NoYW5uZWxzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRvd24oJmhvc3QtPm11dGV4KTsKLQlob3N0LT5pc19vcGVuID0gMTsKLQlob3N0LT5jaGFubmVsID0gY2hhbm5lbDsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChwbWFjX2xvd19pMmNfb3Blbik7Ci0KLWludCBwbWFjX2xvd19pMmNfY2xvc2Uoc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQlzdHJ1Y3QgbG93X2kyY19ob3N0ICpob3N0ID0gZmluZF9sb3dfaTJjX2hvc3QobnApOwotCi0JaWYgKCFob3N0KQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWhvc3QtPmlzX29wZW4gPSAwOwotCXVwKCZob3N0LT5tdXRleCk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wocG1hY19sb3dfaTJjX2Nsb3NlKTsKLQotaW50IHBtYWNfbG93X2kyY19zZXRtb2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGludCBtb2RlKQotewotCXN0cnVjdCBsb3dfaTJjX2hvc3QgKmhvc3QgPSBmaW5kX2xvd19pMmNfaG9zdChucCk7Ci0KLQlpZiAoIWhvc3QpCi0JCXJldHVybiAtRU5PREVWOwotCVdBUk5fT04oIWhvc3QtPmlzX29wZW4pOwotCWhvc3QtPm1vZGUgPSBtb2RlOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHBtYWNfbG93X2kyY19zZXRtb2RlKTsKLQotaW50IHBtYWNfbG93X2kyY194ZmVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHU4IGFkZHJkaXIsIHU4IHN1YmFkZHIsIHU4ICpkYXRhLCBpbnQgbGVuKQotewotCXN0cnVjdCBsb3dfaTJjX2hvc3QgKmhvc3QgPSBmaW5kX2xvd19pMmNfaG9zdChucCk7Ci0KLQlpZiAoIWhvc3QpCi0JCXJldHVybiAtRU5PREVWOwotCVdBUk5fT04oIWhvc3QtPmlzX29wZW4pOwotCi0JcmV0dXJuIGhvc3QtPmZ1bmMoaG9zdCwgYWRkcmRpciwgc3ViYWRkciwgZGF0YSwgbGVuKTsKLX0KLUVYUE9SVF9TWU1CT0wocG1hY19sb3dfaTJjX3hmZXIpOwotCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19udnJhbS5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfbnZyYW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM5YjAwOC4uMDAwMDAwMAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19udnJhbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTg0ICswLDAgQEAKLS8qCi0gKiAgYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfbnZyYW0uYwotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDIgQmVuamFtaW4gSGVycmVuc2NobWlkdCAoYmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnKQotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUb2RvOiAtIGFkZCBzdXBwb3J0IGZvciB0aGUgT0YgcGVyc2lzdGVudCBwcm9wZXJ0aWVzCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9udnJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2FkYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BtdS5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS9udnJhbS5oPgotCi0jZGVmaW5lIERFQlVHCi0KLSNpZmRlZiBERUJVRwotI2RlZmluZSBEQkcoeC4uLikgcHJpbnRrKHgpCi0jZWxzZQotI2RlZmluZSBEQkcoeC4uLikKLSNlbmRpZgotCi0jZGVmaW5lIE5WUkFNX1NJWkUJCTB4MjAwMAkvKiA4a0Igb2Ygbm9uLXZvbGF0aWxlIFJBTSAqLwotCi0jZGVmaW5lIENPUkU5OV9TSUdOQVRVUkUJMHg1YQotI2RlZmluZSBDT1JFOTlfQURMRVJfU1RBUlQJMHgxNAotCi0vKiBPbiBDb3JlOTksIG52cmFtIGlzIGVpdGhlciBhIHNoYXJwLCBhIG1pY3JvbiBvciBhbiBBTUQgZmxhc2ggKi8KLSNkZWZpbmUgU01fRkxBU0hfU1RBVFVTX0RPTkUJMHg4MAotI2RlZmluZSBTTV9GTEFTSF9TVEFUVVNfRVJSCQkweDM4Ci0jZGVmaW5lIFNNX0ZMQVNIX0NNRF9FUkFTRV9DT05GSVJNCTB4ZDAKLSNkZWZpbmUgU01fRkxBU0hfQ01EX0VSQVNFX1NFVFVQCTB4MjAKLSNkZWZpbmUgU01fRkxBU0hfQ01EX1JFU0VUCQkweGZmCi0jZGVmaW5lIFNNX0ZMQVNIX0NNRF9XUklURV9TRVRVUAkweDQwCi0jZGVmaW5lIFNNX0ZMQVNIX0NNRF9DTEVBUl9TVEFUVVMJMHg1MAotI2RlZmluZSBTTV9GTEFTSF9DTURfUkVBRF9TVEFUVVMJMHg3MAotCi0vKiBDSFJQIE5WUkFNIGhlYWRlciAqLwotc3RydWN0IGNocnBfaGVhZGVyIHsKLSAgdTgJCXNpZ25hdHVyZTsKLSAgdTgJCWNrc3VtOwotICB1MTYJCWxlbjsKLSAgY2hhciAgICAgICAgICBuYW1lWzEyXTsKLSAgdTgJCWRhdGFbMF07Ci19OwotCi1zdHJ1Y3QgY29yZTk5X2hlYWRlciB7Ci0gIHN0cnVjdCBjaHJwX2hlYWRlcgloZHI7Ci0gIHUzMgkJCWFkbGVyOwotICB1MzIJCQlnZW5lcmF0aW9uOwotICB1MzIJCQlyZXNlcnZlZFsyXTsKLX07Ci0KLS8qCi0gKiBSZWFkIGFuZCB3cml0ZSB0aGUgbm9uLXZvbGF0aWxlIFJBTSBvbiBQb3dlck1hY3MgYW5kIENIUlAgbWFjaGluZXMuCi0gKi8KLXN0YXRpYyBpbnQgbnZyYW1fbmFkZHJzOwotc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKm52cmFtX2FkZHI7Ci1zdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqbnZyYW1fZGF0YTsKLXN0YXRpYyBpbnQgbnZyYW1fbXVsdCwgaXNfY29yZV85OTsKLXN0YXRpYyBpbnQgY29yZTk5X2JhbmsgPSAwOwotc3RhdGljIGludCBudnJhbV9wYXJ0aXRpb25zWzNdOwotc3RhdGljIERFRklORV9TUElOTE9DSyhudl9sb2NrKTsKLQotZXh0ZXJuIGludCBwbWFjX25ld3dvcmxkOwotZXh0ZXJuIGludCBzeXN0ZW1fcnVubmluZzsKLQotc3RhdGljIGludCAoKmNvcmU5OV93cml0ZV9iYW5rKShpbnQgYmFuaywgdTgqIGRhdGFzKTsKLXN0YXRpYyBpbnQgKCpjb3JlOTlfZXJhc2VfYmFuaykoaW50IGJhbmspOwotCi1zdGF0aWMgY2hhciAqbnZyYW1faW1hZ2U7Ci0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgY29yZTk5X252cmFtX3JlYWRfYnl0ZShpbnQgYWRkcikKLXsKLQlpZiAobnZyYW1faW1hZ2UgPT0gTlVMTCkKLQkJcmV0dXJuIDB4ZmY7Ci0JcmV0dXJuIG52cmFtX2ltYWdlW2FkZHJdOwotfQotCi1zdGF0aWMgdm9pZCBjb3JlOTlfbnZyYW1fd3JpdGVfYnl0ZShpbnQgYWRkciwgdW5zaWduZWQgY2hhciB2YWwpCi17Ci0JaWYgKG52cmFtX2ltYWdlID09IE5VTEwpCi0JCXJldHVybjsKLQludnJhbV9pbWFnZVthZGRyXSA9IHZhbDsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBkaXJlY3RfbnZyYW1fcmVhZF9ieXRlKGludCBhZGRyKQotewotCXJldHVybiBpbl84KCZudnJhbV9kYXRhWyhhZGRyICYgKE5WUkFNX1NJWkUgLSAxKSkgKiBudnJhbV9tdWx0XSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRpcmVjdF9udnJhbV93cml0ZV9ieXRlKGludCBhZGRyLCB1bnNpZ25lZCBjaGFyIHZhbCkKLXsKLQlvdXRfOCgmbnZyYW1fZGF0YVsoYWRkciAmIChOVlJBTV9TSVpFIC0gMSkpICogbnZyYW1fbXVsdF0sIHZhbCk7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgaW5kaXJlY3RfbnZyYW1fcmVhZF9ieXRlKGludCBhZGRyKQotewotCXVuc2lnbmVkIGNoYXIgdmFsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbnZfbG9jaywgZmxhZ3MpOwotCW91dF84KG52cmFtX2FkZHIsIGFkZHIgPj4gNSk7Ci0JdmFsID0gaW5fOCgmbnZyYW1fZGF0YVsoYWRkciAmIDB4MWYpIDw8IDRdKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZudl9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgdm9pZCBpbmRpcmVjdF9udnJhbV93cml0ZV9ieXRlKGludCBhZGRyLCB1bnNpZ25lZCBjaGFyIHZhbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm52X2xvY2ssIGZsYWdzKTsKLQlvdXRfOChudnJhbV9hZGRyLCBhZGRyID4+IDUpOwotCW91dF84KCZudnJhbV9kYXRhWyhhZGRyICYgMHgxZikgPDwgNF0sIHZhbCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnZfbG9jaywgZmxhZ3MpOwotfQotCi0KLSNpZmRlZiBDT05GSUdfQURCX1BNVQotCi1zdGF0aWMgdm9pZCBwbXVfbnZyYW1fY29tcGxldGUoc3RydWN0IGFkYl9yZXF1ZXN0ICpyZXEpCi17Ci0JaWYgKHJlcS0+YXJnKQotCQljb21wbGV0ZSgoc3RydWN0IGNvbXBsZXRpb24gKilyZXEtPmFyZyk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBtdV9udnJhbV9yZWFkX2J5dGUoaW50IGFkZHIpCi17Ci0Jc3RydWN0IGFkYl9yZXF1ZXN0IHJlcTsKLQlERUNMQVJFX0NPTVBMRVRJT04ocmVxX2NvbXBsZXRlKTsgCi0JCi0JcmVxLmFyZyA9IHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fUlVOTklORyA/ICZyZXFfY29tcGxldGUgOiBOVUxMOwotCWlmIChwbXVfcmVxdWVzdCgmcmVxLCBwbXVfbnZyYW1fY29tcGxldGUsIDMsIFBNVV9SRUFEX05WUkFNLAotCQkJKGFkZHIgPj4gOCkgJiAweGZmLCBhZGRyICYgMHhmZikpCi0JCXJldHVybiAweGZmOwotCWlmIChzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1JVTk5JTkcpCi0JCXdhaXRfZm9yX2NvbXBsZXRpb24oJnJlcV9jb21wbGV0ZSk7Ci0Jd2hpbGUgKCFyZXEuY29tcGxldGUpCi0JCXBtdV9wb2xsKCk7Ci0JcmV0dXJuIHJlcS5yZXBseVswXTsKLX0KLQotc3RhdGljIHZvaWQgcG11X252cmFtX3dyaXRlX2J5dGUoaW50IGFkZHIsIHVuc2lnbmVkIGNoYXIgdmFsKQotewotCXN0cnVjdCBhZGJfcmVxdWVzdCByZXE7Ci0JREVDTEFSRV9DT01QTEVUSU9OKHJlcV9jb21wbGV0ZSk7IAotCQotCXJlcS5hcmcgPSBzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1JVTk5JTkcgPyAmcmVxX2NvbXBsZXRlIDogTlVMTDsKLQlpZiAocG11X3JlcXVlc3QoJnJlcSwgcG11X252cmFtX2NvbXBsZXRlLCA0LCBQTVVfV1JJVEVfTlZSQU0sCi0JCQkoYWRkciA+PiA4KSAmIDB4ZmYsIGFkZHIgJiAweGZmLCB2YWwpKQotCQlyZXR1cm47Ci0JaWYgKHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fUlVOTklORykKLQkJd2FpdF9mb3JfY29tcGxldGlvbigmcmVxX2NvbXBsZXRlKTsKLQl3aGlsZSAoIXJlcS5jb21wbGV0ZSkKLQkJcG11X3BvbGwoKTsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19BREJfUE1VICovCi0KLQotc3RhdGljIHU4IGNocnBfY2hlY2tzdW0oc3RydWN0IGNocnBfaGVhZGVyKiBoZHIpCi17Ci0JdTggKnB0cjsKLQl1MTYgc3VtID0gaGRyLT5zaWduYXR1cmU7Ci0JZm9yIChwdHIgPSAodTggKikmaGRyLT5sZW47IHB0ciA8IGhkci0+ZGF0YTsgcHRyKyspCi0JCXN1bSArPSAqcHRyOwotCXdoaWxlIChzdW0gPiAweEZGKQotCQlzdW0gPSAoc3VtICYgMHhGRikgKyAoc3VtPj44KTsKLQlyZXR1cm4gc3VtOwotfQotCi1zdGF0aWMgdTMyIGNvcmU5OV9jYWxjX2FkbGVyKHU4ICpidWZmZXIpCi17Ci0JaW50IGNudDsKLQl1MzIgbG93LCBoaWdoOwotCi0gICAJYnVmZmVyICs9IENPUkU5OV9BRExFUl9TVEFSVDsKLQlsb3cgPSAxOwotCWhpZ2ggPSAwOwotCWZvciAoY250PTA7IGNudDwoTlZSQU1fU0laRS1DT1JFOTlfQURMRVJfU1RBUlQpOyBjbnQrKykgewotCQlpZiAoKGNudCAlIDUwMDApID09IDApIHsKLQkJCWhpZ2ggICU9IDY1NTIxVUw7Ci0JCQloaWdoICU9IDY1NTIxVUw7Ci0JCX0KLQkJbG93ICs9IGJ1ZmZlcltjbnRdOwotCQloaWdoICs9IGxvdzsKLQl9Ci0JbG93ICAlPSA2NTUyMVVMOwotCWhpZ2ggJT0gNjU1MjFVTDsKLQotCXJldHVybiAoaGlnaCA8PCAxNikgfCBsb3c7Ci19Ci0KLXN0YXRpYyB1MzIgY29yZTk5X2NoZWNrKHU4KiBkYXRhcykKLXsKLQlzdHJ1Y3QgY29yZTk5X2hlYWRlciogaGRyOTkgPSAoc3RydWN0IGNvcmU5OV9oZWFkZXIqKWRhdGFzOwotCi0JaWYgKGhkcjk5LT5oZHIuc2lnbmF0dXJlICE9IENPUkU5OV9TSUdOQVRVUkUpIHsKLQkJREJHKCJJbnZhbGlkIHNpZ25hdHVyZVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoaGRyOTktPmhkci5ja3N1bSAhPSBjaHJwX2NoZWNrc3VtKCZoZHI5OS0+aGRyKSkgewotCQlEQkcoIkludmFsaWQgY2hlY2tzdW1cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGhkcjk5LT5hZGxlciAhPSBjb3JlOTlfY2FsY19hZGxlcihkYXRhcykpIHsKLQkJREJHKCJJbnZhbGlkIGFkbGVyXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiBoZHI5OS0+Z2VuZXJhdGlvbjsKLX0KLQotc3RhdGljIGludCBzbV9lcmFzZV9iYW5rKGludCBiYW5rKQotewotCWludCBzdGF0LCBpOwotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQotCXU4KiBiYXNlID0gKHU4ICopbnZyYW1fZGF0YSArIGNvcmU5OV9iYW5rKk5WUkFNX1NJWkU7Ci0KLSAgICAgICAJREJHKCJudnJhbTogU2hhcnAvTWljcm9uIEVyYXNpbmcgYmFuayAlZC4uLlxuIiwgYmFuayk7Ci0KLQlvdXRfOChiYXNlLCBTTV9GTEFTSF9DTURfRVJBU0VfU0VUVVApOwotCW91dF84KGJhc2UsIFNNX0ZMQVNIX0NNRF9FUkFTRV9DT05GSVJNKTsKLQl0aW1lb3V0ID0gMDsKLQlkbyB7Ci0JCWlmICgrK3RpbWVvdXQgPiAxMDAwMDAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIm52cmFtOiBTaGFycC9NaXJvbiBmbGFzaCBlcmFzZSB0aW1lb3V0ICFcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJb3V0XzgoYmFzZSwgU01fRkxBU0hfQ01EX1JFQURfU1RBVFVTKTsKLQkJc3RhdCA9IGluXzgoYmFzZSk7Ci0JfSB3aGlsZSAoIShzdGF0ICYgU01fRkxBU0hfU1RBVFVTX0RPTkUpKTsKLQotCW91dF84KGJhc2UsIFNNX0ZMQVNIX0NNRF9DTEVBUl9TVEFUVVMpOwotCW91dF84KGJhc2UsIFNNX0ZMQVNIX0NNRF9SRVNFVCk7Ci0KLQlmb3IgKGk9MDsgaTxOVlJBTV9TSVpFOyBpKyspCi0JCWlmIChiYXNlW2ldICE9IDB4ZmYpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAibnZyYW06IFNoYXJwL01pY3JvbiBmbGFzaCBlcmFzZSBmYWlsZWQgIVxuIik7Ci0JCQlyZXR1cm4gLUVOWElPOwotCQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc21fd3JpdGVfYmFuayhpbnQgYmFuaywgdTgqIGRhdGFzKQotewotCWludCBpLCBzdGF0ID0gMDsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0KLQl1OCogYmFzZSA9ICh1OCAqKW52cmFtX2RhdGEgKyBjb3JlOTlfYmFuaypOVlJBTV9TSVpFOwotCi0gICAgICAgCURCRygibnZyYW06IFNoYXJwL01pY3JvbiBXcml0aW5nIGJhbmsgJWQuLi5cbiIsIGJhbmspOwotCi0JZm9yIChpPTA7IGk8TlZSQU1fU0laRTsgaSsrKSB7Ci0JCW91dF84KGJhc2UraSwgU01fRkxBU0hfQ01EX1dSSVRFX1NFVFVQKTsKLQkJdWRlbGF5KDEpOwotCQlvdXRfOChiYXNlK2ksIGRhdGFzW2ldKTsKLQkJdGltZW91dCA9IDA7Ci0JCWRvIHsKLQkJCWlmICgrK3RpbWVvdXQgPiAxMDAwMDAwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJudnJhbTogU2hhcnAvTWljcm9uIGZsYXNoIHdyaXRlIHRpbWVvdXQgIVxuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlvdXRfOChiYXNlLCBTTV9GTEFTSF9DTURfUkVBRF9TVEFUVVMpOwotCQkJc3RhdCA9IGluXzgoYmFzZSk7Ci0JCX0gd2hpbGUgKCEoc3RhdCAmIFNNX0ZMQVNIX1NUQVRVU19ET05FKSk7Ci0JCWlmICghKHN0YXQgJiBTTV9GTEFTSF9TVEFUVVNfRE9ORSkpCi0JCQlicmVhazsKLQl9Ci0Jb3V0XzgoYmFzZSwgU01fRkxBU0hfQ01EX0NMRUFSX1NUQVRVUyk7Ci0Jb3V0XzgoYmFzZSwgU01fRkxBU0hfQ01EX1JFU0VUKTsKLQlmb3IgKGk9MDsgaTxOVlJBTV9TSVpFOyBpKyspCi0JCWlmIChiYXNlW2ldICE9IGRhdGFzW2ldKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIm52cmFtOiBTaGFycC9NaWNyb24gZmxhc2ggd3JpdGUgZmFpbGVkICFcbiIpOwotCQkJcmV0dXJuIC1FTlhJTzsKLQkJfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFtZF9lcmFzZV9iYW5rKGludCBiYW5rKQotewotCWludCBpLCBzdGF0ID0gMDsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0KLQl1OCogYmFzZSA9ICh1OCAqKW52cmFtX2RhdGEgKyBjb3JlOTlfYmFuaypOVlJBTV9TSVpFOwotCi0gICAgICAgCURCRygibnZyYW06IEFNRCBFcmFzaW5nIGJhbmsgJWQuLi5cbiIsIGJhbmspOwotCi0JLyogVW5sb2NrIDEgKi8KLQlvdXRfOChiYXNlKzB4NTU1LCAweGFhKTsKLQl1ZGVsYXkoMSk7Ci0JLyogVW5sb2NrIDIgKi8KLQlvdXRfOChiYXNlKzB4MmFhLCAweDU1KTsKLQl1ZGVsYXkoMSk7Ci0KLQkvKiBTZWN0b3ItRXJhc2UgKi8KLQlvdXRfOChiYXNlKzB4NTU1LCAweDgwKTsKLQl1ZGVsYXkoMSk7Ci0Jb3V0XzgoYmFzZSsweDU1NSwgMHhhYSk7Ci0JdWRlbGF5KDEpOwotCW91dF84KGJhc2UrMHgyYWEsIDB4NTUpOwotCXVkZWxheSgxKTsKLQlvdXRfOChiYXNlLCAweDMwKTsKLQl1ZGVsYXkoMSk7Ci0KLQl0aW1lb3V0ID0gMDsKLQlkbyB7Ci0JCWlmICgrK3RpbWVvdXQgPiAxMDAwMDAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIm52cmFtOiBBTUQgZmxhc2ggZXJhc2UgdGltZW91dCAhXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXN0YXQgPSBpbl84KGJhc2UpIF4gaW5fOChiYXNlKTsKLQl9IHdoaWxlIChzdGF0ICE9IDApOwotCQotCS8qIFJlc2V0ICovCi0Jb3V0XzgoYmFzZSwgMHhmMCk7Ci0JdWRlbGF5KDEpOwotCQotCWZvciAoaT0wOyBpPE5WUkFNX1NJWkU7IGkrKykKLQkJaWYgKGJhc2VbaV0gIT0gMHhmZikgewotCQkJcHJpbnRrKEtFUk5fRVJSICJudnJhbTogQU1EIGZsYXNoIGVyYXNlIGZhaWxlZCAhXG4iKTsKLQkJCXJldHVybiAtRU5YSU87Ci0JCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhbWRfd3JpdGVfYmFuayhpbnQgYmFuaywgdTgqIGRhdGFzKQotewotCWludCBpLCBzdGF0ID0gMDsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0KLQl1OCogYmFzZSA9ICh1OCAqKW52cmFtX2RhdGEgKyBjb3JlOTlfYmFuaypOVlJBTV9TSVpFOwotCi0gICAgICAgCURCRygibnZyYW06IEFNRCBXcml0aW5nIGJhbmsgJWQuLi5cbiIsIGJhbmspOwotCi0JZm9yIChpPTA7IGk8TlZSQU1fU0laRTsgaSsrKSB7Ci0JCS8qIFVubG9jayAxICovCi0JCW91dF84KGJhc2UrMHg1NTUsIDB4YWEpOwotCQl1ZGVsYXkoMSk7Ci0JCS8qIFVubG9jayAyICovCi0JCW91dF84KGJhc2UrMHgyYWEsIDB4NTUpOwotCQl1ZGVsYXkoMSk7Ci0KLQkJLyogV3JpdGUgc2luZ2xlIHdvcmQgKi8KLQkJb3V0XzgoYmFzZSsweDU1NSwgMHhhMCk7Ci0JCXVkZWxheSgxKTsKLQkJb3V0XzgoYmFzZStpLCBkYXRhc1tpXSk7Ci0JCQotCQl0aW1lb3V0ID0gMDsKLQkJZG8gewotCQkJaWYgKCsrdGltZW91dCA+IDEwMDAwMDApIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIm52cmFtOiBBTUQgZmxhc2ggd3JpdGUgdGltZW91dCAhXG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXN0YXQgPSBpbl84KGJhc2UpIF4gaW5fOChiYXNlKTsKLQkJfSB3aGlsZSAoc3RhdCAhPSAwKTsKLQkJaWYgKHN0YXQgIT0gMCkKLQkJCWJyZWFrOwotCX0KLQotCS8qIFJlc2V0ICovCi0Jb3V0XzgoYmFzZSwgMHhmMCk7Ci0JdWRlbGF5KDEpOwotCi0JZm9yIChpPTA7IGk8TlZSQU1fU0laRTsgaSsrKQotCQlpZiAoYmFzZVtpXSAhPSBkYXRhc1tpXSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJudnJhbTogQU1EIGZsYXNoIHdyaXRlIGZhaWxlZCAhXG4iKTsKLQkJCXJldHVybiAtRU5YSU87Ci0JCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGxvb2t1cF9wYXJ0aXRpb25zKHZvaWQpCi17Ci0JdTggYnVmZmVyWzE3XTsKLQlpbnQgaSwgb2Zmc2V0OwotCXN0cnVjdCBjaHJwX2hlYWRlciogaGRyOwotCi0JaWYgKHBtYWNfbmV3d29ybGQpIHsKLQkJbnZyYW1fcGFydGl0aW9uc1twbWFjX252cmFtX09GXSA9IC0xOwotCQludnJhbV9wYXJ0aXRpb25zW3BtYWNfbnZyYW1fWFBSQU1dID0gLTE7Ci0JCW52cmFtX3BhcnRpdGlvbnNbcG1hY19udnJhbV9OUl0gPSAtMTsKLQkJaGRyID0gKHN0cnVjdCBjaHJwX2hlYWRlciAqKWJ1ZmZlcjsKLQotCQlvZmZzZXQgPSAwOwotCQlidWZmZXJbMTZdID0gMDsKLQkJZG8gewotCQkJZm9yIChpPTA7aTwxNjtpKyspCi0JCQkJYnVmZmVyW2ldID0gbnZyYW1fcmVhZF9ieXRlKG9mZnNldCtpKTsKLQkJCWlmICghc3RyY21wKGhkci0+bmFtZSwgImNvbW1vbiIpKQotCQkJCW52cmFtX3BhcnRpdGlvbnNbcG1hY19udnJhbV9PRl0gPSBvZmZzZXQgKyAweDEwOwotCQkJaWYgKCFzdHJjbXAoaGRyLT5uYW1lLCAiQVBMLE1hY09TNzUiKSkgewotCQkJCW52cmFtX3BhcnRpdGlvbnNbcG1hY19udnJhbV9YUFJBTV0gPSBvZmZzZXQgKyAweDEwOwotCQkJCW52cmFtX3BhcnRpdGlvbnNbcG1hY19udnJhbV9OUl0gPSBvZmZzZXQgKyAweDExMDsKLQkJCX0KLQkJCW9mZnNldCArPSAoaGRyLT5sZW4gKiAweDEwKTsKLQkJfSB3aGlsZShvZmZzZXQgPCBOVlJBTV9TSVpFKTsKLQl9IGVsc2UgewotCQludnJhbV9wYXJ0aXRpb25zW3BtYWNfbnZyYW1fT0ZdID0gMHgxODAwOwotCQludnJhbV9wYXJ0aXRpb25zW3BtYWNfbnZyYW1fWFBSQU1dID0gMHgxMzAwOwotCQludnJhbV9wYXJ0aXRpb25zW3BtYWNfbnZyYW1fTlJdID0gMHgxNDAwOwotCX0KLQlEQkcoIm52cmFtOiBPRiBwYXJ0aXRpb24gYXQgMHgleFxuIiwgbnZyYW1fcGFydGl0aW9uc1twbWFjX252cmFtX09GXSk7Ci0JREJHKCJudnJhbTogWFAgcGFydGl0aW9uIGF0IDB4JXhcbiIsIG52cmFtX3BhcnRpdGlvbnNbcG1hY19udnJhbV9YUFJBTV0pOwotCURCRygibnZyYW06IE5SIHBhcnRpdGlvbiBhdCAweCV4XG4iLCBudnJhbV9wYXJ0aXRpb25zW3BtYWNfbnZyYW1fTlJdKTsKLX0KLQotc3RhdGljIHZvaWQgY29yZTk5X252cmFtX3N5bmModm9pZCkKLXsKLQlzdHJ1Y3QgY29yZTk5X2hlYWRlciogaGRyOTk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghaXNfY29yZV85OSB8fCAhbnZyYW1fZGF0YSB8fCAhbnZyYW1faW1hZ2UpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZudl9sb2NrLCBmbGFncyk7Ci0JaWYgKCFtZW1jbXAobnZyYW1faW1hZ2UsICh1OCopbnZyYW1fZGF0YSArIGNvcmU5OV9iYW5rKk5WUkFNX1NJWkUsCi0JCU5WUkFNX1NJWkUpKQotCQlnb3RvIGJhaWw7Ci0KLQlEQkcoIlVwZGF0aW5nIG52cmFtLi4uXG4iKTsKLQotCWhkcjk5ID0gKHN0cnVjdCBjb3JlOTlfaGVhZGVyKiludnJhbV9pbWFnZTsKLQloZHI5OS0+Z2VuZXJhdGlvbisrOwotCWhkcjk5LT5oZHIuc2lnbmF0dXJlID0gQ09SRTk5X1NJR05BVFVSRTsKLQloZHI5OS0+aGRyLmNrc3VtID0gY2hycF9jaGVja3N1bSgmaGRyOTktPmhkcik7Ci0JaGRyOTktPmFkbGVyID0gY29yZTk5X2NhbGNfYWRsZXIobnZyYW1faW1hZ2UpOwotCWNvcmU5OV9iYW5rID0gY29yZTk5X2JhbmsgPyAwIDogMTsKLQlpZiAoY29yZTk5X2VyYXNlX2JhbmspCi0JCWlmIChjb3JlOTlfZXJhc2VfYmFuayhjb3JlOTlfYmFuaykpIHsKLQkJCXByaW50aygibnZyYW06IEVycm9yIGVyYXNpbmcgYmFuayAlZFxuIiwgY29yZTk5X2JhbmspOwotCQkJZ290byBiYWlsOwotCQl9Ci0JaWYgKGNvcmU5OV93cml0ZV9iYW5rKQotCQlpZiAoY29yZTk5X3dyaXRlX2JhbmsoY29yZTk5X2JhbmssIG52cmFtX2ltYWdlKSkKLQkJCXByaW50aygibnZyYW06IEVycm9yIHdyaXRpbmcgYmFuayAlZFxuIiwgY29yZTk5X2JhbmspOwotIGJhaWw6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnZfbG9jaywgZmxhZ3MpOwotCi0jaWZkZWYgREVCVUcKLSAgICAgICAJbWRlbGF5KDIwMDApOwotI2VuZGlmCi19Ci0KLXZvaWQgX19pbml0IHBtYWNfbnZyYW1faW5pdCh2b2lkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7Ci0KLQludnJhbV9uYWRkcnMgPSAwOwotCi0JZHAgPSBmaW5kX2RldmljZXMoIm52cmFtIik7Ci0JaWYgKGRwID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBmaW5kIE5WUkFNIGRldmljZVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JbnZyYW1fbmFkZHJzID0gZHAtPm5fYWRkcnM7Ci0JaXNfY29yZV85OSA9IGRldmljZV9pc19jb21wYXRpYmxlKGRwLCAibnZyYW0sZmxhc2giKTsKLQlpZiAoaXNfY29yZV85OSkgewotCQlpbnQgaTsKLQkJdTMyIGdlbl9iYW5rMCwgZ2VuX2JhbmsxOwotCi0JCWlmIChudnJhbV9uYWRkcnMgPCAxKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIm52cmFtOiBubyBhZGRyZXNzXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCQludnJhbV9pbWFnZSA9IGFsbG9jX2Jvb3RtZW0oTlZSQU1fU0laRSk7Ci0JCWlmIChudnJhbV9pbWFnZSA9PSBOVUxMKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIm52cmFtOiBjYW4ndCBhbGxvY2F0ZSByYW0gaW1hZ2VcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCW52cmFtX2RhdGEgPSBpb3JlbWFwKGRwLT5hZGRyc1swXS5hZGRyZXNzLCBOVlJBTV9TSVpFKjIpOwotCQludnJhbV9uYWRkcnMgPSAxOyAvKiBNYWtlIHN1cmUgd2UgZ2V0IHRoZSBjb3JyZWN0IGNhc2UgKi8KLQotCQlEQkcoIm52cmFtOiBDaGVja2luZyBiYW5rIDAuLi5cbiIpOwotCi0JCWdlbl9iYW5rMCA9IGNvcmU5OV9jaGVjaygodTggKiludnJhbV9kYXRhKTsKLQkJZ2VuX2JhbmsxID0gY29yZTk5X2NoZWNrKCh1OCAqKW52cmFtX2RhdGEgKyBOVlJBTV9TSVpFKTsKLQkJY29yZTk5X2JhbmsgPSAoZ2VuX2JhbmswIDwgZ2VuX2JhbmsxKSA/IDEgOiAwOwotCi0JCURCRygibnZyYW06IGdlbjA9JWQsIGdlbjE9JWRcbiIsIGdlbl9iYW5rMCwgZ2VuX2JhbmsxKTsKLQkJREJHKCJudnJhbTogQWN0aXZlIGJhbmsgaXM6ICVkXG4iLCBjb3JlOTlfYmFuayk7Ci0KLQkJZm9yIChpPTA7IGk8TlZSQU1fU0laRTsgaSsrKQotCQkJbnZyYW1faW1hZ2VbaV0gPSBudnJhbV9kYXRhW2kgKyBjb3JlOTlfYmFuaypOVlJBTV9TSVpFXTsKLQotCQlwcGNfbWQubnZyYW1fcmVhZF92YWwJPSBjb3JlOTlfbnZyYW1fcmVhZF9ieXRlOwotCQlwcGNfbWQubnZyYW1fd3JpdGVfdmFsCT0gY29yZTk5X252cmFtX3dyaXRlX2J5dGU7Ci0JCXBwY19tZC5udnJhbV9zeW5jCT0gY29yZTk5X252cmFtX3N5bmM7Ci0JCS8qIAotCQkgKiBNYXliZSB3ZSBjb3VsZCBiZSBzbWFydGVyIGhlcmUgdGhvdWdoIG1ha2luZyBhbiBleGNsdXNpdmUgbGlzdAotCQkgKiBvZiBrbm93biBmbGFzaCBjaGlwcyBpcyBhIGJpdCBuYXN0eSBhcyBvbGRlciBPRiBkaWRuJ3QgcHJvdmlkZSB1cwotCQkgKiB3aXRoIGEgdXNlZnVsICJjb21wYXRpYmxlIiBlbnRyeS4gQSBzb2x1dGlvbiB3b3VsZCBiZSB0byByZWFsbHkKLQkJICogaWRlbnRpZnkgdGhlIGNoaXAgdXNpbmcgZmxhc2ggaWQgY29tbWFuZHMgYW5kIGJhc2Ugb3Vyc2VsdmVzIG9uCi0JCSAqIGEgbGlzdCBvZiBrbm93biBjaGlwcyBJRHMKLQkJICovCi0JCWlmIChkZXZpY2VfaXNfY29tcGF0aWJsZShkcCwgImFtZC0wMTM3IikpIHsKLQkJCWNvcmU5OV9lcmFzZV9iYW5rID0gYW1kX2VyYXNlX2Jhbms7Ci0JCQljb3JlOTlfd3JpdGVfYmFuayA9IGFtZF93cml0ZV9iYW5rOwotCQl9IGVsc2UgewotCQkJY29yZTk5X2VyYXNlX2JhbmsgPSBzbV9lcmFzZV9iYW5rOwotCQkJY29yZTk5X3dyaXRlX2JhbmsgPSBzbV93cml0ZV9iYW5rOwotCQl9Ci0JfSBlbHNlIGlmIChfbWFjaGluZSA9PSBfTUFDSF9jaHJwICYmIG52cmFtX25hZGRycyA9PSAxKSB7Ci0JCW52cmFtX2RhdGEgPSBpb3JlbWFwKGRwLT5hZGRyc1swXS5hZGRyZXNzICsgaXNhX21lbV9iYXNlLAotCQkJCSAgICAgZHAtPmFkZHJzWzBdLnNpemUpOwotCQludnJhbV9tdWx0ID0gMTsKLQkJcHBjX21kLm52cmFtX3JlYWRfdmFsCT0gZGlyZWN0X252cmFtX3JlYWRfYnl0ZTsKLQkJcHBjX21kLm52cmFtX3dyaXRlX3ZhbAk9IGRpcmVjdF9udnJhbV93cml0ZV9ieXRlOwotCX0gZWxzZSBpZiAobnZyYW1fbmFkZHJzID09IDEpIHsKLQkJbnZyYW1fZGF0YSA9IGlvcmVtYXAoZHAtPmFkZHJzWzBdLmFkZHJlc3MsIGRwLT5hZGRyc1swXS5zaXplKTsKLQkJbnZyYW1fbXVsdCA9IChkcC0+YWRkcnNbMF0uc2l6ZSArIE5WUkFNX1NJWkUgLSAxKSAvIE5WUkFNX1NJWkU7Ci0JCXBwY19tZC5udnJhbV9yZWFkX3ZhbAk9IGRpcmVjdF9udnJhbV9yZWFkX2J5dGU7Ci0JCXBwY19tZC5udnJhbV93cml0ZV92YWwJPSBkaXJlY3RfbnZyYW1fd3JpdGVfYnl0ZTsKLQl9IGVsc2UgaWYgKG52cmFtX25hZGRycyA9PSAyKSB7Ci0JCW52cmFtX2FkZHIgPSBpb3JlbWFwKGRwLT5hZGRyc1swXS5hZGRyZXNzLCBkcC0+YWRkcnNbMF0uc2l6ZSk7Ci0JCW52cmFtX2RhdGEgPSBpb3JlbWFwKGRwLT5hZGRyc1sxXS5hZGRyZXNzLCBkcC0+YWRkcnNbMV0uc2l6ZSk7Ci0JCXBwY19tZC5udnJhbV9yZWFkX3ZhbAk9IGluZGlyZWN0X252cmFtX3JlYWRfYnl0ZTsKLQkJcHBjX21kLm52cmFtX3dyaXRlX3ZhbAk9IGluZGlyZWN0X252cmFtX3dyaXRlX2J5dGU7Ci0JfSBlbHNlIGlmIChudnJhbV9uYWRkcnMgPT0gMCAmJiBzeXNfY3RybGVyID09IFNZU19DVFJMRVJfUE1VKSB7Ci0jaWZkZWYgQ09ORklHX0FEQl9QTVUKLQkJbnZyYW1fbmFkZHJzID0gLTE7Ci0JCXBwY19tZC5udnJhbV9yZWFkX3ZhbAk9IHBtdV9udnJhbV9yZWFkX2J5dGU7Ci0JCXBwY19tZC5udnJhbV93cml0ZV92YWwJPSBwbXVfbnZyYW1fd3JpdGVfYnl0ZTsKLSNlbmRpZiAvKiBDT05GSUdfQURCX1BNVSAqLwotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRG9uJ3Qga25vdyBob3cgdG8gYWNjZXNzIE5WUkFNIHdpdGggJWQgYWRkcmVzc2VzXG4iLAotCQkgICAgICAgbnZyYW1fbmFkZHJzKTsKLQl9Ci0JbG9va3VwX3BhcnRpdGlvbnMoKTsKLX0KLQotaW50IHBtYWNfZ2V0X3BhcnRpdGlvbihpbnQgcGFydGl0aW9uKQotewotCXJldHVybiBudnJhbV9wYXJ0aXRpb25zW3BhcnRpdGlvbl07Ci19Ci0KLXU4IHBtYWNfeHByYW1fcmVhZChpbnQgeHBhZGRyKQotewotCWludCBvZmZzZXQgPSBudnJhbV9wYXJ0aXRpb25zW3BtYWNfbnZyYW1fWFBSQU1dOwotCi0JaWYgKG9mZnNldCA8IDApCi0JCXJldHVybiAweGZmOwotCi0JcmV0dXJuIHBwY19tZC5udnJhbV9yZWFkX3ZhbCh4cGFkZHIgKyBvZmZzZXQpOwotfQotCi12b2lkIHBtYWNfeHByYW1fd3JpdGUoaW50IHhwYWRkciwgdTggZGF0YSkKLXsKLQlpbnQgb2Zmc2V0ID0gbnZyYW1fcGFydGl0aW9uc1twbWFjX252cmFtX1hQUkFNXTsKLQotCWlmIChvZmZzZXQgPCAwKQotCQlyZXR1cm47Ci0KLQlwcGNfbWQubnZyYW1fd3JpdGVfdmFsKHhwYWRkciArIG9mZnNldCwgZGF0YSk7Ci19Ci0KLUVYUE9SVF9TWU1CT0wocG1hY19nZXRfcGFydGl0aW9uKTsKLUVYUE9SVF9TWU1CT0wocG1hY194cHJhbV9yZWFkKTsKLUVYUE9SVF9TWU1CT0wocG1hY194cHJhbV93cml0ZSk7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19wY2kuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX3BjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODYyOTViLi4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX3BjaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEyNCArMCwwIEBACi0vKgotICogU3VwcG9ydCBmb3IgUENJIGJyaWRnZXMgZm91bmQgb24gUG93ZXIgTWFjaW50b3NoZXMuCi0gKiBBdCBwcmVzZW50IHRoZSAiYmFuZGl0IiBhbmQgImNoYW9zIiBicmlkZ2VzIGFyZSBzdXBwb3J0ZWQuCi0gKiBGb3J0dW5hdGVseSB5b3UgYWNjZXNzIGNvbmZpZ3VyYXRpb24gc3BhY2UgaW4gdGhlIHNhbWUKLSAqIHdheSB3aXRoIGVpdGhlciBicmlkZ2UuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk3IFBhdWwgTWFja2VycmFzIChwYXVsdXNAY3MuYW51LmVkdS5hdSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9wcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS9wbWFjX2ZlYXR1cmUuaD4KLQotI3VuZGVmIERFQlVHCi0KLSNpZmRlZiBERUJVRwotI2lmZGVmIENPTkZJR19YTU9OCi1leHRlcm4gdm9pZCB4bW9uX3ByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLik7Ci0jZGVmaW5lIERCRyh4Li4uKSB4bW9uX3ByaW50Zih4KQotI2Vsc2UKLSNkZWZpbmUgREJHKHguLi4pIHByaW50ayh4KQotI2VuZGlmCi0jZWxzZQotI2RlZmluZSBEQkcoeC4uLikKLSNlbmRpZgotCi1zdGF0aWMgaW50IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOwotZXh0ZXJuIHZvaWQgcG1hY19jaGVja19odF9saW5rKHZvaWQpOwotCi0vKiBYWFggQ291bGQgYmUgcGVyLWNvbnRyb2xsZXIsIGJ1dCBJIGRvbid0IHRoaW5rIHdlIHJpc2sgYW55dGhpbmcgYnkKLSAqIGFzc3VtaW5nIHdlIHdvbid0IGhhdmUgYm90aCBVbmlOb3J0aCBhbmQgQmFuZGl0ICovCi1zdGF0aWMgaW50IGhhc191bmlub3J0aDsKLSNpZmRlZiBDT05GSUdfUE9XRVI0Ci1zdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyICp1M19hZ3A7Ci0jZW5kaWYgLyogQ09ORklHX1BPV0VSNCAqLwotCi1leHRlcm4gdTggcGNpX2NhY2hlX2xpbmVfc2l6ZTsKLWV4dGVybiBpbnQgcGNpYmlvc19hc3NpZ25fYnVzX29mZnNldDsKLQotc3RydWN0IGRldmljZV9ub2RlICprMl9za2lwbGlzdFsyXTsKLQotLyoKLSAqIE1hZ2ljIGNvbnN0YW50cyBmb3IgZW5hYmxpbmcgY2FjaGUgY29oZXJlbmN5IGluIHRoZSBiYW5kaXQvUFNYIGJyaWRnZS4KLSAqLwotI2RlZmluZSBCQU5ESVRfREVWSURfMgk4Ci0jZGVmaW5lIEJBTkRJVF9SRVZJRAkzCi0KLSNkZWZpbmUgQkFORElUX0RFVk5VTQkxMQotI2RlZmluZSBCQU5ESVRfTUFHSUMJMHg1MAotI2RlZmluZSBCQU5ESVRfQ09IRVJFTlQJMHg0MAotCi1zdGF0aWMgaW50IF9faW5pdAotZml4dXBfb25lX2xldmVsX2J1c19yYW5nZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIGludCBoaWdoZXIpCi17Ci0JZm9yICg7IG5vZGUgIT0gMDtub2RlID0gbm9kZS0+c2libGluZykgewotCQlpbnQgKiBidXNfcmFuZ2U7Ci0JCXVuc2lnbmVkIGludCAqY2xhc3NfY29kZTsKLQkJaW50IGxlbjsKLQotCQkvKiBGb3IgUENJPC0+UENJIGJyaWRnZXMgb3IgQ2FyZEJ1cyBicmlkZ2VzLCB3ZSBnbyBkb3duICovCi0JCWNsYXNzX2NvZGUgPSAodW5zaWduZWQgaW50ICopIGdldF9wcm9wZXJ0eShub2RlLCAiY2xhc3MtY29kZSIsIE5VTEwpOwotCQlpZiAoIWNsYXNzX2NvZGUgfHwgKCgqY2xhc3NfY29kZSA+PiA4KSAhPSBQQ0lfQ0xBU1NfQlJJREdFX1BDSSAmJgotCQkJKCpjbGFzc19jb2RlID4+IDgpICE9IFBDSV9DTEFTU19CUklER0VfQ0FSREJVUykpCi0JCQljb250aW51ZTsKLQkJYnVzX3JhbmdlID0gKGludCAqKSBnZXRfcHJvcGVydHkobm9kZSwgImJ1cy1yYW5nZSIsICZsZW4pOwotCQlpZiAoYnVzX3JhbmdlICE9IE5VTEwgJiYgbGVuID4gMiAqIHNpemVvZihpbnQpKSB7Ci0JCQlpZiAoYnVzX3JhbmdlWzFdID4gaGlnaGVyKQotCQkJCWhpZ2hlciA9IGJ1c19yYW5nZVsxXTsKLQkJfQotCQloaWdoZXIgPSBmaXh1cF9vbmVfbGV2ZWxfYnVzX3JhbmdlKG5vZGUtPmNoaWxkLCBoaWdoZXIpOwotCX0KLQlyZXR1cm4gaGlnaGVyOwotfQotCi0vKiBUaGlzIHJvdXRpbmUgZml4ZXMgdGhlICJidXMtcmFuZ2UiIHByb3BlcnR5IG9mIGFsbCBicmlkZ2VzIGluIHRoZQotICogc3lzdGVtIHNpbmNlIHRoZXkgdGVuZCB0byBoYXZlIHRoZWlyICJsYXN0IiBtZW1iZXIgd3Jvbmcgb24gbWFjcwotICoKLSAqIE5vdGUgdGhhdCB0aGUgYnVzIG51bWJlcnMgbWFuaXB1bGF0ZWQgaGVyZSBhcmUgT0YgYnVzIG51bWJlcnMsIHRoZXkKLSAqIGFyZSBub3QgTGludXggYnVzIG51bWJlcnMuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdAotZml4dXBfYnVzX3JhbmdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqYnJpZGdlKQotewotCWludCAqIGJ1c19yYW5nZTsKLQlpbnQgbGVuOwotCi0JLyogTG9va3VwIHRoZSAiYnVzLXJhbmdlIiBwcm9wZXJ0eSBmb3IgdGhlIGhvc2UgKi8KLQlidXNfcmFuZ2UgPSAoaW50ICopIGdldF9wcm9wZXJ0eShicmlkZ2UsICJidXMtcmFuZ2UiLCAmbGVuKTsKLQlpZiAoYnVzX3JhbmdlID09IE5VTEwgfHwgbGVuIDwgMiAqIHNpemVvZihpbnQpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbid0IGdldCBidXMtcmFuZ2UgZm9yICVzXG4iLAotCQkJICAgICAgIGJyaWRnZS0+ZnVsbF9uYW1lKTsKLQkJcmV0dXJuOwotCX0KLQlidXNfcmFuZ2VbMV0gPSBmaXh1cF9vbmVfbGV2ZWxfYnVzX3JhbmdlKGJyaWRnZS0+Y2hpbGQsIGJ1c19yYW5nZVsxXSk7Ci19Ci0KLS8qCi0gKiBBcHBsZSBNYWNSSVNDIChVMywgVW5pTm9ydGgsIEJhbmRpdCwgQ2hhb3MpIFBDSSBjb250cm9sbGVycy4KLSAqCi0gKiBUaGUgIkJhbmRpdCIgdmVyc2lvbiBpcyBwcmVzZW50IGluIGFsbCBlYXJseSBQQ0kgUG93ZXJNYWNzLAotICogYW5kIHVwIHRvIHRoZSBmaXJzdCBvbmVzIHVzaW5nIEdyYWNrbGUuIFNvbWUgbWFjaGluZXMgbWF5Ci0gKiBoYXZlIDIgYmFuZGl0IGNvbnRyb2xsZXJzICgyIFBDSSBidXNzZXMpLgotICoKLSAqICJDaGFvcyIgaXMgdXNlZCBpbiBzb21lICJCYW5kaXQiLXR5cGUgbWFjaGluZXMgYXMgYSBicmlkZ2UKLSAqIGZvciB0aGUgc2VwYXJhdGUgZGlzcGxheSBidXMuIEl0IGlzIGFjY2Vzc2VkIHRoZSBzYW1lCi0gKiB3YXkgYXMgYmFuZGl0LCBidXQgY2Fubm90IGJlIHByb2JlZCBmb3IgZGV2aWNlcy4gSXQgdGhlcmVmb3JlCi0gKiBoYXMgaXRzIG93biBjb25maWcgYWNjZXNzIGZ1bmN0aW9ucy4KLSAqCi0gKiBUaGUgIlVuaU5vcnRoIiB2ZXJzaW9uIGlzIHByZXNlbnQgaW4gYWxsIENvcmU5OSBtYWNoaW5lcwotICogKGlCb29rLCBHNCwgbmV3IElNYWNzLCBhbmQgYWxsIHRoZSByZWNlbnQgQXBwbGUgbWFjaGluZXMpLgotICogSXQgY29udGFpbnMgMyBjb250cm9sbGVycyBpbiBvbmUgQVNJQy4KLSAqCi0gKiBUaGUgVTMgaXMgdGhlIGJyaWRnZSB1c2VkIG9uIEc1IG1hY2hpbmVzLiBJdCBjb250YWlucyBhbgotICogQUdQIGJ1cyB3aGljaCBpcyBkZWFsdCB3aXRoIHRoZSBvbGQgVW5pTm9ydGggYWNjZXNzIHJvdXRpbmVzCi0gKiBhbmQgYSBIeXBlclRyYW5zcG9ydCBidXMgd2hpY2ggdXNlcyBpdHMgb3duIHNldCBvZiBhY2Nlc3MKLSAqIGZ1bmN0aW9ucy4KLSAqLwotCi0jZGVmaW5lIE1BQ1JJU0NfQ0ZBMChkZXZmbiwgb2ZmKQlcCi0JKCgxIDw8ICh1bnNpZ25lZCBsb25nKVBDSV9TTE9UKGRldl9mbikpIFwKLQl8ICgoKHVuc2lnbmVkIGxvbmcpUENJX0ZVTkMoZGV2X2ZuKSkgPDwgOCkgXAotCXwgKCgodW5zaWduZWQgbG9uZykob2ZmKSkgJiAweEZDVUwpKQotCi0jZGVmaW5lIE1BQ1JJU0NfQ0ZBMShidXMsIGRldmZuLCBvZmYpCVwKLQkoKCgodW5zaWduZWQgbG9uZykoYnVzKSkgPDwgMTYpIFwKLQl8KCgodW5zaWduZWQgbG9uZykoZGV2Zm4pKSA8PCA4KSBcCi0JfCgoKHVuc2lnbmVkIGxvbmcpKG9mZikpICYgMHhGQ1VMKSBcCi0JfDFVTCkKLQotc3RhdGljIHZvaWQgdm9sYXRpbGUgX19pb21lbSAqCi1tYWNyaXNjX2NmZ19hY2Nlc3Moc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlLCB1OCBidXMsIHU4IGRldl9mbiwgdTggb2Zmc2V0KQotewotCXVuc2lnbmVkIGludCBjYWRkcjsKLQotCWlmIChidXMgPT0gaG9zZS0+Zmlyc3RfYnVzbm8pIHsKLQkJaWYgKGRldl9mbiA8ICgxMSA8PCAzKSkKLQkJCXJldHVybiBOVUxMOwotCQljYWRkciA9IE1BQ1JJU0NfQ0ZBMChkZXZfZm4sIG9mZnNldCk7Ci0JfSBlbHNlCi0JCWNhZGRyID0gTUFDUklTQ19DRkExKGJ1cywgZGV2X2ZuLCBvZmZzZXQpOwotCi0JLyogVW5pbm9ydGggd2lsbCByZXR1cm4gZ2FyYmFnZSBpZiB3ZSBkb24ndCByZWFkIGJhY2sgdGhlIHZhbHVlICEgKi8KLQlkbyB7Ci0JCW91dF9sZTMyKGhvc2UtPmNmZ19hZGRyLCBjYWRkcik7Ci0JfSB3aGlsZSAoaW5fbGUzMihob3NlLT5jZmdfYWRkcikgIT0gY2FkZHIpOwotCi0Jb2Zmc2V0ICY9IGhhc191bmlub3J0aCA/IDB4MDcgOiAweDAzOwotCXJldHVybiBob3NlLT5jZmdfZGF0YSArIG9mZnNldDsKLX0KLQotc3RhdGljIGludAotbWFjcmlzY19yZWFkX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCBvZmZzZXQsCi0JCSAgICBpbnQgbGVuLCB1MzIgKnZhbCkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7Ci0Jdm9pZCB2b2xhdGlsZSBfX2lvbWVtICphZGRyOwotCi0JYWRkciA9IG1hY3Jpc2NfY2ZnX2FjY2Vzcyhob3NlLCBidXMtPm51bWJlciwgZGV2Zm4sIG9mZnNldCk7Ci0JaWYgKCFhZGRyKQotCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwotCS8qCi0JICogTm90ZTogdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIHRoYXQgb2Zmc2V0IGlzCi0JICogc3VpdGFibHkgYWxpZ25lZCBhbmQgdGhhdCBsZW4gaXMgMSwgMiBvciA0LgotCSAqLwotCXN3aXRjaCAobGVuKSB7Ci0JY2FzZSAxOgotCQkqdmFsID0gaW5fOChhZGRyKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQkqdmFsID0gaW5fbGUxNihhZGRyKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJKnZhbCA9IGluX2xlMzIoYWRkcik7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgaW50Ci1tYWNyaXNjX3dyaXRlX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCBvZmZzZXQsCi0JCSAgICAgaW50IGxlbiwgdTMyIHZhbCkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7Ci0Jdm9pZCB2b2xhdGlsZSBfX2lvbWVtICphZGRyOwotCi0JYWRkciA9IG1hY3Jpc2NfY2ZnX2FjY2Vzcyhob3NlLCBidXMtPm51bWJlciwgZGV2Zm4sIG9mZnNldCk7Ci0JaWYgKCFhZGRyKQotCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwotCS8qCi0JICogTm90ZTogdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIHRoYXQgb2Zmc2V0IGlzCi0JICogc3VpdGFibHkgYWxpZ25lZCBhbmQgdGhhdCBsZW4gaXMgMSwgMiBvciA0LgotCSAqLwotCXN3aXRjaCAobGVuKSB7Ci0JY2FzZSAxOgotCQlvdXRfOChhZGRyLCB2YWwpOwotCQkodm9pZCkgaW5fOChhZGRyKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlvdXRfbGUxNihhZGRyLCB2YWwpOwotCQkodm9pZCkgaW5fbGUxNihhZGRyKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJb3V0X2xlMzIoYWRkciwgdmFsKTsKLQkJKHZvaWQpIGluX2xlMzIoYWRkcik7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgc3RydWN0IHBjaV9vcHMgbWFjcmlzY19wY2lfb3BzID0KLXsKLQltYWNyaXNjX3JlYWRfY29uZmlnLAotCW1hY3Jpc2Nfd3JpdGVfY29uZmlnCi19OwotCi0vKgotICogVmVyaWZpeSB0aGF0IGEgc3BlY2lmaWMgKGJ1cywgZGV2X2ZuKSBleGlzdHMgb24gY2hhb3MKLSAqLwotc3RhdGljIGludAotY2hhb3NfdmFsaWRhdGVfZGV2KHN0cnVjdCBwY2lfYnVzICpidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCXUzMiAqdmVuZG9yLCAqZGV2aWNlOwotCi0JbnAgPSBwY2lfYnVzZGV2X3RvX09GX25vZGUoYnVzLCBkZXZmbik7Ci0JaWYgKG5wID09IE5VTEwpCi0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KLQl2ZW5kb3IgPSAodTMyICopZ2V0X3Byb3BlcnR5KG5wLCAidmVuZG9yLWlkIiwgTlVMTCk7Ci0JZGV2aWNlID0gKHUzMiAqKWdldF9wcm9wZXJ0eShucCwgImRldmljZS1pZCIsIE5VTEwpOwotCWlmICh2ZW5kb3IgPT0gTlVMTCB8fCBkZXZpY2UgPT0gTlVMTCkKLQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQotCWlmICgoKnZlbmRvciA9PSAweDEwNmIpICYmICgqZGV2aWNlID09IDMpICYmIChvZmZzZXQgPj0gMHgxMCkKLQkgICAgJiYgKG9mZnNldCAhPSAweDE0KSAmJiAob2Zmc2V0ICE9IDB4MTgpICYmIChvZmZzZXQgPD0gMHgyNCkpCi0JCXJldHVybiBQQ0lCSU9TX0JBRF9SRUdJU1RFUl9OVU1CRVI7Ci0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgaW50Ci1jaGFvc19yZWFkX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCBvZmZzZXQsCi0JCSAgaW50IGxlbiwgdTMyICp2YWwpCi17Ci0JaW50IHJlc3VsdCA9IGNoYW9zX3ZhbGlkYXRlX2RldihidXMsIGRldmZuLCBvZmZzZXQpOwotCWlmIChyZXN1bHQgPT0gUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVSKQotCQkqdmFsID0gfjBVOwotCWlmIChyZXN1bHQgIT0gUENJQklPU19TVUNDRVNTRlVMKQotCQlyZXR1cm4gcmVzdWx0OwotCXJldHVybiBtYWNyaXNjX3JlYWRfY29uZmlnKGJ1cywgZGV2Zm4sIG9mZnNldCwgbGVuLCB2YWwpOwotfQotCi1zdGF0aWMgaW50Ci1jaGFvc193cml0ZV9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgb2Zmc2V0LAotCQkgICBpbnQgbGVuLCB1MzIgdmFsKQotewotCWludCByZXN1bHQgPSBjaGFvc192YWxpZGF0ZV9kZXYoYnVzLCBkZXZmbiwgb2Zmc2V0KTsKLQlpZiAocmVzdWx0ICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkKLQkJcmV0dXJuIHJlc3VsdDsKLQlyZXR1cm4gbWFjcmlzY193cml0ZV9jb25maWcoYnVzLCBkZXZmbiwgb2Zmc2V0LCBsZW4sIHZhbCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX29wcyBjaGFvc19wY2lfb3BzID0KLXsKLQljaGFvc19yZWFkX2NvbmZpZywKLQljaGFvc193cml0ZV9jb25maWcKLX07Ci0KLSNpZmRlZiBDT05GSUdfUE9XRVI0Ci0KLS8qCi0gKiBUaGVzZSB2ZXJzaW9ucyBvZiBVMyBIeXBlclRyYW5zcG9ydCBjb25maWcgc3BhY2UgYWNjZXNzIG9wcyBkbyBub3QKLSAqIGltcGxlbWVudCBzZWxmLXZpZXcgb2YgdGhlIEhUIGhvc3QgeWV0Ci0gKi8KLQotI2RlZmluZSBVM19IVF9DRkEwKGRldmZuLCBvZmYpCQlcCi0JCSgoKCh1bnNpZ25lZCBsb25nKWRldmZuKSA8PCA4KSB8IG9mZnNldCkKLSNkZWZpbmUgVTNfSFRfQ0ZBMShidXMsIGRldmZuLCBvZmYpCVwKLQkJKFUzX0hUX0NGQTAoZGV2Zm4sIG9mZikgXAotCQkrICgoKHVuc2lnbmVkIGxvbmcpYnVzKSA8PCAxNikgXAotCQkrIDB4MDEwMDAwMDBVTCkKLQotc3RhdGljIHZvaWQgdm9sYXRpbGUgX19pb21lbSAqCi11M19odF9jZmdfYWNjZXNzKHN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSwgdTggYnVzLCB1OCBkZXZmbiwgdTggb2Zmc2V0KQotewotCWlmIChidXMgPT0gaG9zZS0+Zmlyc3RfYnVzbm8pIHsKLQkJLyogRm9yIG5vdywgd2UgZG9uJ3Qgc2VsZiBwcm9iZSBVMyBIVCBicmlkZ2UgKi8KLQkJaWYgKFBDSV9GVU5DKGRldmZuKSAhPSAwIHx8IFBDSV9TTE9UKGRldmZuKSA+IDcgfHwKLQkJICAgIFBDSV9TTE9UKGRldmZuKSA8IDEpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGhvc2UtPmNmZ19kYXRhICsgVTNfSFRfQ0ZBMChkZXZmbiwgb2Zmc2V0KTsKLQl9IGVsc2UKLQkJcmV0dXJuIGhvc2UtPmNmZ19kYXRhICsgVTNfSFRfQ0ZBMShidXMsIGRldmZuLCBvZmZzZXQpOwotfQotCi1zdGF0aWMgaW50Ci11M19odF9yZWFkX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCBvZmZzZXQsCi0JCSAgICBpbnQgbGVuLCB1MzIgKnZhbCkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7Ci0Jdm9pZCB2b2xhdGlsZSBfX2lvbWVtICphZGRyOwotCWludCBpOwotCi0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBjaV9idXNkZXZfdG9fT0Zfbm9kZShidXMsIGRldmZuKTsKLQlpZiAobnAgPT0gTlVMTCkKLQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQotCS8qCi0JICogV2hlbiBhIGRldmljZSBpbiBLMiBpcyBwb3dlcmVkIGRvd24sIHdlIGRpZSBvbiBjb25maWcKLQkgKiBjeWNsZSBhY2Nlc3Nlcy4gRml4IHRoYXQgaGVyZS4KLQkgKi8KLQlmb3IgKGk9MDsgaTwyOyBpKyspCi0JCWlmIChrMl9za2lwbGlzdFtpXSA9PSBucCkgewotCQkJc3dpdGNoIChsZW4pIHsKLQkJCWNhc2UgMToKLQkJCQkqdmFsID0gMHhmZjsgYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJKnZhbCA9IDB4ZmZmZjsgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCSp2YWwgPSAweGZmZmZmZmZmdWw7IGJyZWFrOwotCQkJfQotCQkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQkJfQotCSAgICAKLQlhZGRyID0gdTNfaHRfY2ZnX2FjY2Vzcyhob3NlLCBidXMtPm51bWJlciwgZGV2Zm4sIG9mZnNldCk7Ci0JaWYgKCFhZGRyKQotCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwotCS8qCi0JICogTm90ZTogdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIHRoYXQgb2Zmc2V0IGlzCi0JICogc3VpdGFibHkgYWxpZ25lZCBhbmQgdGhhdCBsZW4gaXMgMSwgMiBvciA0LgotCSAqLwotCXN3aXRjaCAobGVuKSB7Ci0JY2FzZSAxOgotCQkqdmFsID0gaW5fOChhZGRyKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQkqdmFsID0gaW5fbGUxNihhZGRyKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJKnZhbCA9IGluX2xlMzIoYWRkcik7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgaW50Ci11M19odF93cml0ZV9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgb2Zmc2V0LAotCQkgICAgIGludCBsZW4sIHUzMiB2YWwpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gYnVzLT5zeXNkYXRhOwotCXZvaWQgdm9sYXRpbGUgX19pb21lbSAqYWRkcjsKLQlpbnQgaTsKLQotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwY2lfYnVzZGV2X3RvX09GX25vZGUoYnVzLCBkZXZmbik7Ci0JaWYgKG5wID09IE5VTEwpCi0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0JLyoKLQkgKiBXaGVuIGEgZGV2aWNlIGluIEsyIGlzIHBvd2VyZWQgZG93biwgd2UgZGllIG9uIGNvbmZpZwotCSAqIGN5Y2xlIGFjY2Vzc2VzLiBGaXggdGhhdCBoZXJlLgotCSAqLwotCWZvciAoaT0wOyBpPDI7IGkrKykKLQkJaWYgKGsyX3NraXBsaXN0W2ldID09IG5wKQotCQkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQotCWFkZHIgPSB1M19odF9jZmdfYWNjZXNzKGhvc2UsIGJ1cy0+bnVtYmVyLCBkZXZmbiwgb2Zmc2V0KTsKLQlpZiAoIWFkZHIpCi0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0JLyoKLQkgKiBOb3RlOiB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBvZmZzZXQgaXMKLQkgKiBzdWl0YWJseSBhbGlnbmVkIGFuZCB0aGF0IGxlbiBpcyAxLCAyIG9yIDQuCi0JICovCi0Jc3dpdGNoIChsZW4pIHsKLQljYXNlIDE6Ci0JCW91dF84KGFkZHIsIHZhbCk7Ci0JCSh2b2lkKSBpbl84KGFkZHIpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCW91dF9sZTE2KGFkZHIsIHZhbCk7Ci0JCSh2b2lkKSBpbl9sZTE2KGFkZHIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlvdXRfbGUzMihhZGRyLCB2YWwpOwotCQkodm9pZCkgaW5fbGUzMihhZGRyKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX29wcyB1M19odF9wY2lfb3BzID0KLXsKLQl1M19odF9yZWFkX2NvbmZpZywKLQl1M19odF93cml0ZV9jb25maWcKLX07Ci0KLSNlbmRpZiAvKiBDT05GSUdfUE9XRVI0ICovCi0KLS8qCi0gKiBGb3IgYSBiYW5kaXQgYnJpZGdlLCB0dXJuIG9uIGNhY2hlIGNvaGVyZW5jeSBpZiBuZWNlc3NhcnkuCi0gKiBOLkIuIHdlIGNvdWxkIGNsZWFuIHRoaXMgdXAgdXNpbmcgdGhlIGhvc2Ugb3BzIGRpcmVjdGx5LgotICovCi1zdGF0aWMgdm9pZCBfX2luaXQKLWluaXRfYmFuZGl0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqYnApCi17Ci0JdW5zaWduZWQgaW50IHZlbmRldiwgbWFnaWM7Ci0JaW50IHJldjsKLQotCS8qIHJlYWQgdGhlIHdvcmQgYXQgb2Zmc2V0IDAgaW4gY29uZmlnIHNwYWNlIGZvciBkZXZpY2UgMTEgKi8KLQlvdXRfbGUzMihicC0+Y2ZnX2FkZHIsICgxVUwgPDwgQkFORElUX0RFVk5VTSkgKyBQQ0lfVkVORE9SX0lEKTsKLQl1ZGVsYXkoMik7Ci0JdmVuZGV2ID0gaW5fbGUzMihicC0+Y2ZnX2RhdGEpOwotCWlmICh2ZW5kZXYgPT0gKFBDSV9ERVZJQ0VfSURfQVBQTEVfQkFORElUIDw8IDE2KSArCi0JCQlQQ0lfVkVORE9SX0lEX0FQUExFKSB7Ci0JCS8qIHJlYWQgdGhlIHJldmlzaW9uIGlkICovCi0JCW91dF9sZTMyKGJwLT5jZmdfYWRkciwKLQkJCSAoMVVMIDw8IEJBTkRJVF9ERVZOVU0pICsgUENJX1JFVklTSU9OX0lEKTsKLQkJdWRlbGF5KDIpOwotCQlyZXYgPSBpbl84KGJwLT5jZmdfZGF0YSk7Ci0JCWlmIChyZXYgIT0gQkFORElUX1JFVklEKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICJVbmtub3duIHJldmlzaW9uICVkIGZvciBiYW5kaXRcbiIsIHJldik7Ci0JfSBlbHNlIGlmICh2ZW5kZXYgIT0gKEJBTkRJVF9ERVZJRF8yIDw8IDE2KSArIFBDSV9WRU5ET1JfSURfQVBQTEUpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYmFuZGl0IGlzbid0PyAoJXgpXG4iLCB2ZW5kZXYpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogcmVhZCB0aGUgd29yZCBhdCBvZmZzZXQgMHg1MCAqLwotCW91dF9sZTMyKGJwLT5jZmdfYWRkciwgKDFVTCA8PCBCQU5ESVRfREVWTlVNKSArIEJBTkRJVF9NQUdJQyk7Ci0JdWRlbGF5KDIpOwotCW1hZ2ljID0gaW5fbGUzMihicC0+Y2ZnX2RhdGEpOwotCWlmICgobWFnaWMgJiBCQU5ESVRfQ09IRVJFTlQpICE9IDApCi0JCXJldHVybjsKLQltYWdpYyB8PSBCQU5ESVRfQ09IRVJFTlQ7Ci0JdWRlbGF5KDIpOwotCW91dF9sZTMyKGJwLT5jZmdfZGF0YSwgbWFnaWMpOwotCXByaW50ayhLRVJOX0lORk8gIkNhY2hlIGNvaGVyZW5jeSBlbmFibGVkIGZvciBiYW5kaXQvUFNYXG4iKTsKLX0KLQotCi0vKgotICogVHdlYWsgdGhlIFBDSS1QQ0kgYnJpZGdlIGNoaXAgb24gdGhlIGJsdWUgJiB3aGl0ZSBHM3MuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdAotaW5pdF9wMnBicmlkZ2Uodm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnAycGJyaWRnZTsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2U7Ci0JdTggYnVzLCBkZXZmbjsKLQl1MTYgdmFsOwotCi0JLyogWFhYIGl0IHdvdWxkIGJlIGJldHRlciBoZXJlIHRvIGlkZW50aWZ5IHRoZSBzcGVjaWZpYwotCSAgIFBDSS1QQ0kgYnJpZGdlIGNoaXAgd2UgaGF2ZS4gKi8KLQlpZiAoKHAycGJyaWRnZSA9IGZpbmRfZGV2aWNlcygicGNpLWJyaWRnZSIpKSA9PSAwCi0JICAgIHx8IHAycGJyaWRnZS0+cGFyZW50ID09IE5VTEwKLQkgICAgfHwgc3RyY21wKHAycGJyaWRnZS0+cGFyZW50LT5uYW1lLCAicGNpIikgIT0gMCkKLQkJcmV0dXJuOwotCWlmIChwY2lfZGV2aWNlX2Zyb21fT0Zfbm9kZShwMnBicmlkZ2UsICZidXMsICZkZXZmbikgPCAwKSB7Ci0JCURCRygiQ2FuJ3QgZmluZCBQQ0kgaW5mb3MgZm9yIFBDSTwtPlBDSSBicmlkZ2VcbiIpOwotCQlyZXR1cm47Ci0JfQotCS8qIFdhcm5pbmc6IEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgbm90IHlldCByZW51bWJlcmVkIGFsbCBidXNzZXMuCi0JICogU28gd2UgbXVzdCB1c2UgT0Ygd2Fsa2luZyB0byBmaW5kIG91dCBob3NlCi0JICovCi0JaG9zZSA9IHBjaV9maW5kX2hvc2VfZm9yX09GX2RldmljZShwMnBicmlkZ2UpOwotCWlmICghaG9zZSkgewotCQlEQkcoIkNhbid0IGZpbmQgaG9zZSBmb3IgUENJPC0+UENJIGJyaWRnZVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGVhcmx5X3JlYWRfY29uZmlnX3dvcmQoaG9zZSwgYnVzLCBkZXZmbiwKLQkJCQkgICBQQ0lfQlJJREdFX0NPTlRST0wsICZ2YWwpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImluaXRfcDJwYnJpZGdlOiBjb3VsZG4ndCByZWFkIGJyaWRnZSBjb250cm9sXG4iKTsKLQkJcmV0dXJuOwotCX0KLQl2YWwgJj0gflBDSV9CUklER0VfQ1RMX01BU1RFUl9BQk9SVDsKLQllYXJseV93cml0ZV9jb25maWdfd29yZChob3NlLCBidXMsIGRldmZuLCBQQ0lfQlJJREdFX0NPTlRST0wsIHZhbCk7Ci19Ci0KLS8qCi0gKiBTb21lIEFwcGxlIGRlc2t0b3AgbWFjaGluZXMgaGF2ZSBhIE5FQyBQRDcyMDEwMEEgVVNCMiBjb250cm9sbGVyCi0gKiBvbiB0aGUgbW90aGVyYm9hcmQuIE9wZW4gRmlybXdhcmUsIG9uIHRoZXNlLCB3aWxsIGRpc2FibGUgdGhlCi0gKiBFSENJIHBhcnQgb2YgaXQgc28gaXQgYmVoYXZlcyBsaWtlIGEgcGFpciBvZiBPSENJJ3MuIFRoaXMgZml4dXAKLSAqIGNvZGUgcmUtZW5hYmxlcyBpdCA7KQotICovCi1zdGF0aWMgdm9pZCBfX2luaXQKLWZpeHVwX25lY191c2IyKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpuZWM7Ci0KLQlmb3IgKG5lYyA9IE5VTEw7IChuZWMgPSBvZl9maW5kX25vZGVfYnlfbmFtZShuZWMsICJ1c2IiKSkgIT0gTlVMTDspIHsKLQkJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwotCQl1MzIgZGF0YSwgKnByb3A7Ci0JCXU4IGJ1cywgZGV2Zm47Ci0JCQotCQlwcm9wID0gKHUzMiAqKWdldF9wcm9wZXJ0eShuZWMsICJ2ZW5kb3ItaWQiLCBOVUxMKTsKLQkJaWYgKHByb3AgPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoMHgxMDMzICE9ICpwcm9wKQotCQkJY29udGludWU7Ci0JCXByb3AgPSAodTMyICopZ2V0X3Byb3BlcnR5KG5lYywgImRldmljZS1pZCIsIE5VTEwpOwotCQlpZiAocHJvcCA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCWlmICgweDAwMzUgIT0gKnByb3ApCi0JCQljb250aW51ZTsKLQkJcHJvcCA9ICh1MzIgKilnZXRfcHJvcGVydHkobmVjLCAicmVnIiwgTlVMTCk7Ci0JCWlmIChwcm9wID09IE5VTEwpCi0JCQljb250aW51ZTsKLQkJZGV2Zm4gPSAocHJvcFswXSA+PiA4KSAmIDB4ZmY7Ci0JCWJ1cyA9IChwcm9wWzBdID4+IDE2KSAmIDB4ZmY7Ci0JCWlmIChQQ0lfRlVOQyhkZXZmbikgIT0gMCkKLQkJCWNvbnRpbnVlOwotCQlob3NlID0gcGNpX2ZpbmRfaG9zZV9mb3JfT0ZfZGV2aWNlKG5lYyk7Ci0JCWlmICghaG9zZSkKLQkJCWNvbnRpbnVlOwotCQllYXJseV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCBidXMsIGRldmZuLCAweGU0LCAmZGF0YSk7Ci0JCWlmIChkYXRhICYgMVVMKSB7Ci0JCQlwcmludGsoIkZvdW5kIE5FQyBQRDcyMDEwMEEgVVNCMiBjaGlwIHdpdGggZGlzYWJsZWQgRUhDSSwgZml4aW5nIHVwLi4uXG4iKTsKLQkJCWRhdGEgJj0gfjFVTDsKLQkJCWVhcmx5X3dyaXRlX2NvbmZpZ19kd29yZChob3NlLCBidXMsIGRldmZuLCAweGU0LCBkYXRhKTsKLQkJCWVhcmx5X3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGJ1cywgZGV2Zm4gfCAyLCBQQ0lfSU5URVJSVVBUX0xJTkUsCi0JCQkJbmVjLT5pbnRyc1swXS5saW5lKTsKLQkJfQotCX0KLX0KLQotdm9pZCBfX2luaXQKLXBtYWNfZmluZF9icmlkZ2VzKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCwgKnJvb3Q7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpodCA9IE5VTEw7Ci0KLQlyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKLQlpZiAocm9vdCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0NSSVQgInBtYWNfZmluZF9icmlkZ2VzOiBjYW4ndCBmaW5kIHJvb3Qgb2YgZGV2aWNlIHRyZWVcbiIpOwotCQlyZXR1cm47Ci0JfQotCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9nZXRfbmV4dF9jaGlsZChyb290LCBucCkpICE9IE5VTEw7KSB7Ci0JCWlmIChucC0+bmFtZSA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCWlmIChzdHJjbXAobnAtPm5hbWUsICJiYW5kaXQiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAobnAtPm5hbWUsICJjaGFvcyIpID09IDAKLQkJICAgIHx8IHN0cmNtcChucC0+bmFtZSwgInBjaSIpID09IDApIHsKLQkJCWlmIChhZGRfYnJpZGdlKG5wKSA9PSAwKQotCQkJCW9mX25vZGVfZ2V0KG5wKTsKLQkJfQotCQlpZiAoc3RyY21wKG5wLT5uYW1lLCAiaHQiKSA9PSAwKSB7Ci0JCQlvZl9ub2RlX2dldChucCk7Ci0JCQlodCA9IG5wOwotCQl9Ci0JfQotCW9mX25vZGVfcHV0KHJvb3QpOwotCi0JLyogUHJvYmUgSFQgbGFzdCBhcyBpdCByZWxpZXMgb24gdGhlIGFncCByZXNvdXJjZXMgdG8gYmUgYWxyZWFkeQotCSAqIHNldHVwCi0JICovCi0JaWYgKGh0ICYmIGFkZF9icmlkZ2UoaHQpICE9IDApCi0JCW9mX25vZGVfcHV0KGh0KTsKLQotCWluaXRfcDJwYnJpZGdlKCk7Ci0JZml4dXBfbmVjX3VzYjIoKTsKLQkKLQkvKiBXZSBhcmUgc3RpbGwgaGF2aW5nIHNvbWUgaXNzdWVzIHdpdGggdGhlIFhzZXJ2ZSBHNCwgZW5hYmxpbmcKLQkgKiBzb21lIG9mZnNldCBiZXR3ZWVuIGJ1cyBudW1iZXIgYW5kIGRvbWFpbnMgZm9yIG5vdyB3aGVuIHdlCi0JICogYXNzaWduIGFsbCBidXNzZXMgc2hvdWxkIGhlbHAgZm9yIG5vdwotCSAqLwotCWlmIChwY2lfYXNzaWduX2FsbF9idXNlcykKLQkJcGNpYmlvc19hc3NpZ25fYnVzX29mZnNldCA9IDB4MTA7Ci0KLSNpZmRlZiBDT05GSUdfUE9XRVI0IAotCS8qIFRoZXJlIGlzIHNvbWV0aGluZyB3cm9uZyB3aXRoIERNQSBvbiBVMy9IVC4gSSBoYXZlbid0IGZpZ3VyZWQgb3V0Ci0JICogdGhlIGRldGFpbHMgeWV0LCBidXQgaWYgSSBzZXQgdGhlIGNhY2hlIGxpbmUgc2l6ZSB0byAxMjggYnl0ZXMgbGlrZQotCSAqIGl0IHNob3VsZCwgSSdtIGdldHRpbmcgbWVtb3J5IGNvcnJ1cHRpb24gY2F1c2VkIGJ5IGRldmljZXMgbGlrZQotCSAqIHN1bmdlbSAoZXZlbiB3aXRob3V0IHRoZSBNV0kgYml0IHNldCwgYnV0IG1heWJlIHN1bmdlbSBkb2Vzbid0Ci0JICogY2FyZSkuIFJpZ2h0IG5vdywgaXQgYXBwZWFycyB0aGF0IHNldHRpbmcgdXAgYSA2NCBieXRlcyBsaW5lIHNpemUKLQkgKiB3b3JrcyBwcm9wZXJseSwgNjQgYnl0ZXMgYmVlaW5nIHRoZSBtYXggdHJhbnNmZXIgc2l6ZSBvZiBIVCwgSQotCSAqIHN1cHBvc2UgdGhpcyBpcyByZWxhdGVkIHRoZSB3YXkgSFQvUENJIGFyZSBob29rZWQgdG9nZXRoZXIuIEkgc3RpbGwKLQkgKiBuZWVkIHRvIGRpdmUgaW50byBtb3JlIHNwZWNzIHRob3VnaCB0byBiZSByZWFsbHkgc3VyZSBvZiB3aGF0J3MKLQkgKiBnb2luZyBvbi4gLS1CZW5ILgotCSAqCi0JICogT2ssIGFwcGFyZW50bHksIGl0J3MganVzdCB0aGF0IEhUIGNhbid0IGRvIG1vcmUgdGhhbiA2NCBieXRlcwotCSAqIHRyYW5zYWN0aW9ucy4gTVdJIHNlZW0gdG8gYmUgbWVhbmluZ2xlc3MgdGhlcmUgYXMgd2VsbCwgaXQgbWF5Ci0JICogYmUgd29ydGggbm9wJ2luZyBvdXQgcGNpX3NldF9td2kgdG9vIHRob3VnaCBJIGhhdmVuJ3QgZG9uZSB0aGF0Ci0JICogeWV0LgotCSAqCi0JICogTm90ZSB0aGF0IGl0J3MgYSBiaXQgZGlmZmVyZW50IGZvciB3aGF0ZXZlciBpcyBpbiB0aGUgQUdQIHNsb3QuCi0JICogRm9yIG5vdywgSSBkb24ndCBjYXJlLCBidXQgdGhpcyBjYW4gYmVjb21lIGEgcmVhbCBpc3N1ZSwgd2UKLQkgKiBzaG91bGQgcHJvYmFibHkgaG9vayBwY2lfc2V0X213aSBhbnl3YXkgdG8gbWFrZSBzdXJlIGl0IHNldHMKLQkgKiB0aGUgcmVhbCBjYWNoZSBsaW5lIHNpemUgaW4gdGhlcmUuCi0JICovCi0JaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiTWFjUklTQzQiKSkKLQkJcGNpX2NhY2hlX2xpbmVfc2l6ZSA9IDE2OyAvKiA2NCBieXRlcyAqLwotCi0JcG1hY19jaGVja19odF9saW5rKCk7Ci0jZW5kaWYgLyogQ09ORklHX1BPV0VSNCAqLwotfQotCi0jZGVmaW5lIEdSQUNLTEVfQ0ZBKGIsIGQsIG8pCSgweDgwIHwgKChiKSA8PCA4KSB8ICgoZCkgPDwgMTYpIFwKLQkJCQkgfCAoKChvKSAmIH4zKSA8PCAyNCkpCi0KLSNkZWZpbmUgR1JBQ0tMRV9QSUNSMV9TVEcJCTB4MDAwMDAwNDAKLSNkZWZpbmUgR1JBQ0tMRV9QSUNSMV9MT09QU05PT1AJCTB4MDAwMDAwMTAKLQotLyogTi5CLiB0aGlzIGlzIGNhbGxlZCBiZWZvcmUgYnJpZGdlcyBpcyBpbml0aWFsaXplZCwgc28gd2UgY2FuJ3QKLSAgIHVzZSBncmFja2xlX3BjaWJpb3Nfe3JlYWQsd3JpdGV9X2NvbmZpZ19kd29yZC4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBncmFja2xlX3NldF9zdGcoc3RydWN0IHBjaV9jb250cm9sbGVyKiBicCwgaW50IGVuYWJsZSkKLXsKLQl1bnNpZ25lZCBpbnQgdmFsOwotCi0Jb3V0X2JlMzIoYnAtPmNmZ19hZGRyLCBHUkFDS0xFX0NGQSgwLCAwLCAweGE4KSk7Ci0JdmFsID0gaW5fbGUzMihicC0+Y2ZnX2RhdGEpOwotCXZhbCA9IGVuYWJsZT8gKHZhbCB8IEdSQUNLTEVfUElDUjFfU1RHKSA6Ci0JCSh2YWwgJiB+R1JBQ0tMRV9QSUNSMV9TVEcpOwotCW91dF9iZTMyKGJwLT5jZmdfYWRkciwgR1JBQ0tMRV9DRkEoMCwgMCwgMHhhOCkpOwotCW91dF9sZTMyKGJwLT5jZmdfZGF0YSwgdmFsKTsKLQkodm9pZClpbl9sZTMyKGJwLT5jZmdfZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBncmFja2xlX3NldF9sb29wX3Nub29wKHN0cnVjdCBwY2lfY29udHJvbGxlciAqYnAsIGludCBlbmFibGUpCi17Ci0JdW5zaWduZWQgaW50IHZhbDsKLQotCW91dF9iZTMyKGJwLT5jZmdfYWRkciwgR1JBQ0tMRV9DRkEoMCwgMCwgMHhhOCkpOwotCXZhbCA9IGluX2xlMzIoYnAtPmNmZ19kYXRhKTsKLQl2YWwgPSBlbmFibGU/ICh2YWwgfCBHUkFDS0xFX1BJQ1IxX0xPT1BTTk9PUCkgOgotCQkodmFsICYgfkdSQUNLTEVfUElDUjFfTE9PUFNOT09QKTsKLQlvdXRfYmUzMihicC0+Y2ZnX2FkZHIsIEdSQUNLTEVfQ0ZBKDAsIDAsIDB4YTgpKTsKLQlvdXRfbGUzMihicC0+Y2ZnX2RhdGEsIHZhbCk7Ci0JKHZvaWQpaW5fbGUzMihicC0+Y2ZnX2RhdGEpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdAotc2V0dXBfdW5pbm9ydGgoc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlLCBzdHJ1Y3QgcmVnX3Byb3BlcnR5KiBhZGRyKQotewotCXBjaV9hc3NpZ25fYWxsX2J1c2VzID0gMTsKLQloYXNfdW5pbm9ydGggPSAxOwotCWhvc2UtPm9wcyA9ICZtYWNyaXNjX3BjaV9vcHM7Ci0JaG9zZS0+Y2ZnX2FkZHIgPSBpb3JlbWFwKGFkZHItPmFkZHJlc3MgKyAweDgwMDAwMCwgMHgxMDAwKTsKLQlob3NlLT5jZmdfZGF0YSA9IGlvcmVtYXAoYWRkci0+YWRkcmVzcyArIDB4YzAwMDAwLCAweDEwMDApOwotCS8qIFdlICJrbm93IiB0aGF0IHRoZSBicmlkZ2UgYXQgZjIwMDAwMDAgaGFzIHRoZSBQQ0kgc2xvdHMuICovCi0JcmV0dXJuIGFkZHItPmFkZHJlc3MgPT0gMHhmMjAwMDAwMDsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0Ci1zZXR1cF9iYW5kaXQoc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlLCBzdHJ1Y3QgcmVnX3Byb3BlcnR5KiBhZGRyKQotewotCWhvc2UtPm9wcyA9ICZtYWNyaXNjX3BjaV9vcHM7Ci0JaG9zZS0+Y2ZnX2FkZHIgPSBpb3JlbWFwKGFkZHItPmFkZHJlc3MgKyAweDgwMDAwMCwgMHgxMDAwKTsKLQlob3NlLT5jZmdfZGF0YSA9IGlvcmVtYXAoYWRkci0+YWRkcmVzcyArIDB4YzAwMDAwLCAweDEwMDApOwotCWluaXRfYmFuZGl0KGhvc2UpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQKLXNldHVwX2NoYW9zKHN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSwgc3RydWN0IHJlZ19wcm9wZXJ0eSogYWRkcikKLXsKLQkvKiBhc3N1bWUgYSBgY2hhb3MnIGJyaWRnZSAqLwotCWhvc2UtPm9wcyA9ICZjaGFvc19wY2lfb3BzOwotCWhvc2UtPmNmZ19hZGRyID0gaW9yZW1hcChhZGRyLT5hZGRyZXNzICsgMHg4MDAwMDAsIDB4MTAwMCk7Ci0JaG9zZS0+Y2ZnX2RhdGEgPSBpb3JlbWFwKGFkZHItPmFkZHJlc3MgKyAweGMwMDAwMCwgMHgxMDAwKTsKLX0KLQotI2lmZGVmIENPTkZJR19QT1dFUjQKLQotc3RhdGljIHZvaWQgX19pbml0Ci1zZXR1cF91M19hZ3Aoc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlLCBzdHJ1Y3QgcmVnX3Byb3BlcnR5KiBhZGRyKQotewotCS8qIE9uIEc1LCB3ZSBtb3ZlIEFHUCB1cCB0byBoaWdoIGJ1cyBudW1iZXIgc28gd2UgZG9uJ3QgbmVlZAotCSAqIHRvIHJlYXNzaWduIGJ1cyBudW1iZXJzIGZvciBIVC4gSWYgd2UgZXZlciBoYXZlIFAyUCBicmlkZ2VzCi0JICogb24gQUdQLCB3ZSdsbCBoYXZlIHRvIG1vdmUgcGNpX2Fzc2lnbl9hbGxfYnVzZXMgdG8gdGhlCi0JICogcGNpX2NvbnRyb2xsZXIgc3RydWN0dXJlIHNvIHdlIGVuYWJsZSBpdCBmb3IgQUdQIGFuZCBub3QgZm9yCi0JICogSFQgY2hpbGRzLgotCSAqIFdlIGhhcmQgY29kZSB0aGUgYWRkcmVzcyBiZWNhdXNlIG9mIHRoZSBkaWZmZXJlbnQgc2l6ZSBvZgotCSAqIHRoZSByZWcgYWRkcmVzcyBjZWxsLCB3ZSBzaGFsbCBmaXggdGhhdCBieSBraWxsaW5nIHN0cnVjdAotCSAqIHJlZ19wcm9wZXJ0eSBhbmQgdXNpbmcgc29tZSBhY2Nlc3NvciBmdW5jdGlvbnMgaW5zdGVhZAotCSAqLwotICAgICAgIAlob3NlLT5maXJzdF9idXNubyA9IDB4ZjA7Ci0JaG9zZS0+bGFzdF9idXNubyA9IDB4ZmY7Ci0JaGFzX3VuaW5vcnRoID0gMTsKLQlob3NlLT5vcHMgPSAmbWFjcmlzY19wY2lfb3BzOwotCWhvc2UtPmNmZ19hZGRyID0gaW9yZW1hcCgweGYwMDAwMDAwICsgMHg4MDAwMDAsIDB4MTAwMCk7Ci0JaG9zZS0+Y2ZnX2RhdGEgPSBpb3JlbWFwKDB4ZjAwMDAwMDAgKyAweGMwMDAwMCwgMHgxMDAwKTsKLQotCXUzX2FncCA9IGhvc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdAotc2V0dXBfdTNfaHQoc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlLCBzdHJ1Y3QgcmVnX3Byb3BlcnR5ICphZGRyKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSAoc3RydWN0IGRldmljZV9ub2RlICopaG9zZS0+YXJjaF9kYXRhOwotCWludCBpLCBjdXI7Ci0KLQlob3NlLT5vcHMgPSAmdTNfaHRfcGNpX29wczsKLQotCS8qIFdlIGhhcmQgY29kZSB0aGUgYWRkcmVzcyBiZWNhdXNlIG9mIHRoZSBkaWZmZXJlbnQgc2l6ZSBvZgotCSAqIHRoZSByZWcgYWRkcmVzcyBjZWxsLCB3ZSBzaGFsbCBmaXggdGhhdCBieSBraWxsaW5nIHN0cnVjdAotCSAqIHJlZ19wcm9wZXJ0eSBhbmQgdXNpbmcgc29tZSBhY2Nlc3NvciBmdW5jdGlvbnMgaW5zdGVhZAotCSAqLwotCWhvc2UtPmNmZ19kYXRhID0gaW9yZW1hcCgweGYyMDAwMDAwLCAweDAyMDAwMDAwKTsKLQotCS8qCi0JICogL2h0IG5vZGUgZG9lc24ndCBleHBvc2UgYSAicmFuZ2VzIiBwcm9wZXJ0eSwgc28gd2UgInJlbW92ZSIgcmVnaW9ucyB0aGF0Ci0JICogaGF2ZSBiZWVuIGFsbG9jYXRlZCB0byBBR1AuIFNvIGZhciwgdGhpcyB2ZXJzaW9uIG9mIHRoZSBjb2RlIGRvZXNuJ3QgYXNzaWduCi0JICogYW55IG9mIHRoZSAweGZ4eHh4eHh4ICJmaW5lIiBtZW1vcnkgcmVnaW9ucyB0byAvaHQuCi0JICogV2UgbmVlZCB0byBmaXggdGhhdCBzb29uZXIgb3IgbGF0ZXIgYnkgZWl0aGVyIHBhcnNpbmcgYWxsIGNoaWxkICJyYW5nZXMiCi0JICogcHJvcGVydGllcyBvciBmaWd1cmluZyBvdXQgdGhlIFUzIGFkZHJlc3Mgc3BhY2UgZGVjb2RpbmcgbG9naWMgYW5kCi0JICogdGhlbiByZWFkIGl0cyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIChpZiBhbnkpLgotCSAqLwotCWhvc2UtPmlvX2Jhc2VfcGh5cyA9IDB4ZjQwMDAwMDA7Ci0JaG9zZS0+aW9fYmFzZV92aXJ0ID0gaW9yZW1hcChob3NlLT5pb19iYXNlX3BoeXMsIDB4MDA0MDAwMDApOwotCWlzYV9pb19iYXNlID0gKHVuc2lnbmVkIGxvbmcpIGhvc2UtPmlvX2Jhc2VfdmlydDsKLQlob3NlLT5pb19yZXNvdXJjZS5uYW1lID0gbnAtPmZ1bGxfbmFtZTsKLQlob3NlLT5pb19yZXNvdXJjZS5zdGFydCA9IDA7Ci0JaG9zZS0+aW9fcmVzb3VyY2UuZW5kID0gMHgwMDNmZmZmZjsKLQlob3NlLT5pb19yZXNvdXJjZS5mbGFncyA9IElPUkVTT1VSQ0VfSU87Ci0JaG9zZS0+cGNpX21lbV9vZmZzZXQgPSAwOwotCWhvc2UtPmZpcnN0X2J1c25vID0gMDsKLQlob3NlLT5sYXN0X2J1c25vID0gMHhlZjsKLQlob3NlLT5tZW1fcmVzb3VyY2VzWzBdLm5hbWUgPSBucC0+ZnVsbF9uYW1lOwotCWhvc2UtPm1lbV9yZXNvdXJjZXNbMF0uc3RhcnQgPSAweDgwMDAwMDAwOwotCWhvc2UtPm1lbV9yZXNvdXJjZXNbMF0uZW5kID0gMHhlZmZmZmZmZjsKLQlob3NlLT5tZW1fcmVzb3VyY2VzWzBdLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07Ci0KLQlpZiAodTNfYWdwID09IE5VTEwpIHsKLQkJREJHKCJVMyBoYXMgbm8gQUdQLCB1c2luZyBmdWxsIHJlc291cmNlIHJhbmdlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFdlICJyZW1vdmUiIHRoZSBBR1AgcmVzb3VyY2VzIGZyb20gdGhlIHJlc291cmNlcyBhbGxvY2F0ZWQgdG8gSFQsIHRoYXQKLQkgKiBpcyB3ZSBjcmVhdGUgImhvbGVzIi4gSG93ZXZlciwgdGhhdCBjb2RlIGRvZXMgYXNzdW1wdGlvbnMgdGhhdCBzbyBmYXIKLQkgKiBoYXBwZW4gdG8gYmUgdHJ1ZSAoY3Jvc3MgZmluZ2Vycy4uLiksIHR5cGljYWxseSB0aGF0IHJlc291cmNlcyBpbiB0aGUKLQkgKiBBR1Agbm9kZSBhcmUgcHJvcGVybHkgb3JkZXJlZAotCSAqLwotCWN1ciA9IDA7Ci0JZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0JCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJnUzX2FncC0+bWVtX3Jlc291cmNlc1tpXTsKLQkJaWYgKHJlcy0+ZmxhZ3MgIT0gSU9SRVNPVVJDRV9NRU0pCi0JCQljb250aW51ZTsKLQkJLyogV2UgZG9uJ3QgY2FyZSBhYm91dCAiZmluZSIgcmVzb3VyY2VzICovCi0JCWlmIChyZXMtPnN0YXJ0ID49IDB4ZjAwMDAwMDApCi0JCQljb250aW51ZTsKLQkJLyogQ2hlY2sgaWYgaXQncyBqdXN0IGEgbWF0dGVyIG9mICJzaHJpbmtpbmciIHVzIGluIG9uZSBkaXJlY3Rpb24gKi8KLQkJaWYgKGhvc2UtPm1lbV9yZXNvdXJjZXNbY3VyXS5zdGFydCA9PSByZXMtPnN0YXJ0KSB7Ci0JCQlEQkcoIlUzL0hUOiBzaHJpbmsgc3RhcnQgb2YgJWQsICUwOGx4IC0+ICUwOGx4XG4iLAotCQkJICAgIGN1ciwgaG9zZS0+bWVtX3Jlc291cmNlc1tjdXJdLnN0YXJ0LCByZXMtPmVuZCArIDEpOwotCQkJaG9zZS0+bWVtX3Jlc291cmNlc1tjdXJdLnN0YXJ0ID0gcmVzLT5lbmQgKyAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKGhvc2UtPm1lbV9yZXNvdXJjZXNbY3VyXS5lbmQgPT0gcmVzLT5lbmQpIHsKLQkJCURCRygiVTMvSFQ6IHNocmluayBlbmQgb2YgJWQsICUwOGx4IC0+ICUwOGx4XG4iLAotCQkJICAgIGN1ciwgaG9zZS0+bWVtX3Jlc291cmNlc1tjdXJdLmVuZCwgcmVzLT5zdGFydCAtIDEpOwotCQkJaG9zZS0+bWVtX3Jlc291cmNlc1tjdXJdLmVuZCA9IHJlcy0+c3RhcnQgLSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJLyogTm8sIGl0J3Mgbm90IHRoZSBjYXNlLCB3ZSBuZWVkIGEgaG9sZSAqLwotCQlpZiAoY3VyID09IDIpIHsKLQkJCS8qIG5vdCBlbm91Z2ggcmVzb3VyY2VzIHRvIG1ha2UgYSBob2xlLCB3ZSBkcm9wIHBhcnQgb2YgdGhlIHJhbmdlICovCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJSdW5uaW5nIG91dCBvZiByZXNvdXJjZXMgZm9yIC9odCBob3N0ICFcbiIpOwotCQkJaG9zZS0+bWVtX3Jlc291cmNlc1tjdXJdLmVuZCA9IHJlcy0+c3RhcnQgLSAxOwotCQkJY29udGludWU7Ci0JCX0JCQotCQljdXIrKzsKLSAgICAgICAJCURCRygiVTMvSFQ6IGhvbGUsICVkIGVuZCBhdCAlMDhseCwgJWQgc3RhcnQgYXQgJTA4bHhcbiIsCi0JCSAgICBjdXItMSwgcmVzLT5zdGFydCAtIDEsIGN1ciwgcmVzLT5lbmQgKyAxKTsKLQkJaG9zZS0+bWVtX3Jlc291cmNlc1tjdXJdLm5hbWUgPSBucC0+ZnVsbF9uYW1lOwotCQlob3NlLT5tZW1fcmVzb3VyY2VzW2N1cl0uZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKLQkJaG9zZS0+bWVtX3Jlc291cmNlc1tjdXJdLnN0YXJ0ID0gcmVzLT5lbmQgKyAxOwotCQlob3NlLT5tZW1fcmVzb3VyY2VzW2N1cl0uZW5kID0gaG9zZS0+bWVtX3Jlc291cmNlc1tjdXItMV0uZW5kOwotCQlob3NlLT5tZW1fcmVzb3VyY2VzW2N1ci0xXS5lbmQgPSByZXMtPnN0YXJ0IC0gMTsKLQl9Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfUE9XRVI0ICovCi0KLXZvaWQgX19pbml0Ci1zZXR1cF9ncmFja2xlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKLXsKLQlzZXR1cF9pbmRpcmVjdF9wY2koaG9zZSwgMHhmZWMwMDAwMCwgMHhmZWUwMDAwMCk7Ci0JaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiQUFQTCxQb3dlckJvb2sxOTk4IikpCi0JCWdyYWNrbGVfc2V0X2xvb3Bfc25vb3AoaG9zZSwgMSk7Ci0jaWYgMAkvKiBEaXNhYmxlZCBmb3Igbm93LCBIVyBwcm9ibGVtcyA/Pz8gKi8KLQlncmFja2xlX3NldF9zdGcoaG9zZSwgMSk7Ci0jZW5kaWYKLX0KLQotLyoKLSAqIFdlIGFzc3VtZSB0aGF0IGlmIHdlIGhhdmUgYSBHMyBwb3dlcm1hYywgd2UgaGF2ZSBvbmUgYnJpZGdlIGNhbGxlZAotICogInBjaSIgKGEgTVBDMTA2KSBhbmQgbm8gYmFuZGl0IG9yIGNoYW9zIGJyaWRnZXMsIGFuZCBjb250cmFyaXdpc2UsCi0gKiBpZiB3ZSBoYXZlIG9uZSBvciBtb3JlIGJhbmRpdCBvciBjaGFvcyBicmlkZ2VzLCB3ZSBkb24ndCBoYXZlIGEgTVBDMTA2LgotICovCi1zdGF0aWMgaW50IF9faW5pdAotYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKLXsKLQlpbnQgbGVuOwotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLQlzdHJ1Y3QgcmVnX3Byb3BlcnR5ICphZGRyOwotCWNoYXIqIGRpc3BfbmFtZTsKLQlpbnQgKmJ1c19yYW5nZTsKLQlpbnQgcHJpbWFyeSA9IDE7Ci0KLQlEQkcoIkFkZGluZyBQQ0kgaG9zdCBicmlkZ2UgJXNcbiIsIGRldi0+ZnVsbF9uYW1lKTsKLQotICAgICAgIAlhZGRyID0gKHN0cnVjdCByZWdfcHJvcGVydHkgKikgZ2V0X3Byb3BlcnR5KGRldiwgInJlZyIsICZsZW4pOwotICAgICAgIAlpZiAoYWRkciA9PSBOVUxMIHx8IGxlbiA8IHNpemVvZigqYWRkcikpIHsKLSAgICAgICAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbid0IHVzZSAlczogbm8gYWRkcmVzc1xuIiwKLSAgICAgICAJCSAgICAgICBkZXYtPmZ1bGxfbmFtZSk7Ci0gICAgICAgCQlyZXR1cm4gLUVOT0RFVjsKLSAgICAgICAJfQotICAgICAgIAlidXNfcmFuZ2UgPSAoaW50ICopIGdldF9wcm9wZXJ0eShkZXYsICJidXMtcmFuZ2UiLCAmbGVuKTsKLSAgICAgICAJaWYgKGJ1c19yYW5nZSA9PSBOVUxMIHx8IGxlbiA8IDIgKiBzaXplb2YoaW50KSkgewotICAgICAgIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgZ2V0IGJ1cy1yYW5nZSBmb3IgJXMsIGFzc3VtZSBidXMgMFxuIiwKLSAgICAgICAJCQkgICAgICAgZGV2LT5mdWxsX25hbWUpOwotICAgICAgIAl9Ci0KLSAgICAgICAJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOwotICAgICAgIAlpZiAoIWhvc2UpCi0gICAgICAgCQlyZXR1cm4gLUVOT01FTTsKLSAgICAgICAJaG9zZS0+YXJjaF9kYXRhID0gZGV2OwotICAgICAgIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7Ci0gICAgICAgCWhvc2UtPmxhc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMV0gOiAweGZmOwotCi0JZGlzcF9uYW1lID0gTlVMTDsKLSNpZmRlZiBDT05GSUdfUE9XRVI0Ci0gICAgICAgCWlmIChkZXZpY2VfaXNfY29tcGF0aWJsZShkZXYsICJ1My1hZ3AiKSkgewotICAgICAgIAkJc2V0dXBfdTNfYWdwKGhvc2UsIGFkZHIpOwotICAgICAgIAkJZGlzcF9uYW1lID0gIlUzLUFHUCI7Ci0gICAgICAgCQlwcmltYXJ5ID0gMDsKLSAgICAgICAJfSBlbHNlIGlmIChkZXZpY2VfaXNfY29tcGF0aWJsZShkZXYsICJ1My1odCIpKSB7Ci0gICAgICAgCQlzZXR1cF91M19odChob3NlLCBhZGRyKTsKLSAgICAgICAJCWRpc3BfbmFtZSA9ICJVMy1IVCI7Ci0gICAgICAgCQlwcmltYXJ5ID0gMTsKLSAgICAgICAJfSBlbHNlCi0jZW5kaWYgLyogQ09ORklHX1BPV0VSNCAqLwotCWlmIChkZXZpY2VfaXNfY29tcGF0aWJsZShkZXYsICJ1bmktbm9ydGgiKSkgewotICAgICAgIAkJcHJpbWFyeSA9IHNldHVwX3VuaW5vcnRoKGhvc2UsIGFkZHIpOwotICAgICAgIAkJZGlzcF9uYW1lID0gIlVuaU5vcnRoIjsKLSAgICAgICAJfSBlbHNlIGlmIChzdHJjbXAoZGV2LT5uYW1lLCAicGNpIikgPT0gMCkgewotICAgICAgIAkJLyogWFhYIGFzc3VtZSB0aGlzIGlzIGEgbXBjMTA2IChncmFja2xlKSAqLwotICAgICAgIAkJc2V0dXBfZ3JhY2tsZShob3NlKTsKLSAgICAgICAJCWRpc3BfbmFtZSA9ICJHcmFja2xlIChNUEMxMDYpIjsKLSAgICAgICAJfSBlbHNlIGlmIChzdHJjbXAoZGV2LT5uYW1lLCAiYmFuZGl0IikgPT0gMCkgewotICAgICAgIAkJc2V0dXBfYmFuZGl0KGhvc2UsIGFkZHIpOwotICAgICAgIAkJZGlzcF9uYW1lID0gIkJhbmRpdCI7Ci0gICAgICAgCX0gZWxzZSBpZiAoc3RyY21wKGRldi0+bmFtZSwgImNoYW9zIikgPT0gMCkgewotICAgICAgIAkJc2V0dXBfY2hhb3MoaG9zZSwgYWRkcik7Ci0gICAgICAgCQlkaXNwX25hbWUgPSAiQ2hhb3MiOwotICAgICAgIAkJcHJpbWFyeSA9IDA7Ci0gICAgICAgCX0KLSAgICAgICAJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgJXMgUENJIGhvc3QgYnJpZGdlIGF0IDB4JTA4eC4gRmlybXdhcmUgYnVzIG51bWJlcjogJWQtPiVkXG4iLAotICAgICAgIAkJZGlzcF9uYW1lLCBhZGRyLT5hZGRyZXNzLCBob3NlLT5maXJzdF9idXNubywgaG9zZS0+bGFzdF9idXNubyk7Ci0gICAgICAgCURCRygiIC0+SG9zZSBhdCAweCVwLCBjZmdfYWRkcj0weCVwLGNmZ19kYXRhPTB4JXBcbiIsCi0gICAgICAgCQlob3NlLCBob3NlLT5jZmdfYWRkciwgaG9zZS0+Y2ZnX2RhdGEpOwotCi0gICAgICAgCS8qIEludGVycHJldCB0aGUgInJhbmdlcyIgcHJvcGVydHkgKi8KLSAgICAgICAJLyogVGhpcyBhbHNvIG1hcHMgdGhlIEkvTyByZWdpb24gYW5kIHNldHMgaXNhX2lvL21lbV9iYXNlICovCi0gICAgICAgCXBjaV9wcm9jZXNzX2JyaWRnZV9PRl9yYW5nZXMoaG9zZSwgZGV2LCBwcmltYXJ5KTsKLQotICAgICAgIAkvKiBGaXh1cCAiYnVzLXJhbmdlIiBPRiBwcm9wZXJ0eSAqLwotICAgICAgIAlmaXh1cF9idXNfcmFuZ2UoZGV2KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQKLXBjaWJpb3NfZml4dXBfT0ZfaW50ZXJydXB0cyh2b2lkKQotewotCXN0cnVjdCBwY2lfZGV2KiBkZXYgPSBOVUxMOwotCi0JLyoKLQkgKiBPcGVuIEZpcm13YXJlIG9mdGVuIGRvZXNuJ3QgaW5pdGlhbGl6ZSB0aGUKLQkgKiBQQ0lfSU5URVJSVVBUX0xJTkUgY29uZmlnIHJlZ2lzdGVyIHByb3Blcmx5LCBzbyB3ZQotCSAqIHNob3VsZCBmaW5kIHRoZSBkZXZpY2Ugbm9kZSBhbmQgYXBwbHkgdGhlIGludGVycnVwdAotCSAqIG9idGFpbmVkIGZyb20gdGhlIE9GIGRldmljZS10cmVlCi0JICovCi0JZm9yX2VhY2hfcGNpX2RldihkZXYpIHsKLQkJc3RydWN0IGRldmljZV9ub2RlICpub2RlOwotCQlub2RlID0gcGNpX2RldmljZV90b19PRl9ub2RlKGRldik7Ci0JCS8qIHRoaXMgaXMgdGhlIG5vZGUsIHNlZSBpZiBpdCBoYXMgaW50ZXJydXB0cyAqLwotCQlpZiAobm9kZSAmJiBub2RlLT5uX2ludHJzID4gMCkKLQkJCWRldi0+aXJxID0gbm9kZS0+aW50cnNbMF0ubGluZTsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBkZXYtPmlycSk7Ci0JfQotfQotCi12b2lkIF9faW5pdAotcG1hY19wY2liaW9zX2ZpeHVwKHZvaWQpCi17Ci0JLyogRml4dXAgaW50ZXJydXB0cyBhY2NvcmRpbmcgdG8gT0YgdHJlZSAqLwotCXBjaWJpb3NfZml4dXBfT0ZfaW50ZXJydXB0cygpOwotfQotCi1pbnQKLXBtYWNfcGNpX2VuYWJsZV9kZXZpY2VfaG9vayhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgaW5pdGlhbCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGU7Ci0JaW50IHVwZGF0ZWNmZyA9IDA7Ci0JaW50IHVuaW5vcnRoX2NoaWxkOwotCi0Jbm9kZSA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShkZXYpOwotCi0JLyogV2UgZG9uJ3Qgd2FudCB0byBlbmFibGUgVVNCIGNvbnRyb2xsZXJzIGFic2VudCBmcm9tIHRoZSBPRiB0cmVlCi0JICogKGlCb29rIHNlY29uZCBjb250cm9sbGVyKQotCSAqLwotCWlmIChkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FQUExFCi0JICAgICYmIChkZXYtPmNsYXNzID09ICgoUENJX0NMQVNTX1NFUklBTF9VU0IgPDwgOCkgfCAweDEwKSkKLQkgICAgJiYgIW5vZGUpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQXBwbGUgVVNCIE9IQ0kgJXMgZGlzYWJsZWQgYnkgZmlybXdhcmVcbiIsCi0JCSAgICAgICBwY2lfbmFtZShkZXYpKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFub2RlKQotCQlyZXR1cm4gMDsKLQotCXVuaW5vcnRoX2NoaWxkID0gbm9kZS0+cGFyZW50ICYmCi0JCWRldmljZV9pc19jb21wYXRpYmxlKG5vZGUtPnBhcmVudCwgInVuaS1ub3J0aCIpOwotCQotCS8qIEZpcmV3aXJlICYgR01BQyB3ZXJlIGRpc2FibGVkIGFmdGVyIFBDSSBwcm9iZSwgdGhlIGRyaXZlciBpcwotCSAqIGNsYWltaW5nIHRoZW0sIHdlIG11c3QgcmUtZW5hYmxlIHRoZW0gbm93LgotCSAqLwotCWlmICh1bmlub3J0aF9jaGlsZCAmJiAhc3RyY21wKG5vZGUtPm5hbWUsICJmaXJld2lyZSIpICYmCi0JICAgIChkZXZpY2VfaXNfY29tcGF0aWJsZShub2RlLCAicGNpMTA2YiwxOCIpIHx8Ci0JICAgICBkZXZpY2VfaXNfY29tcGF0aWJsZShub2RlLCAicGNpMTA2YiwzMCIpIHx8Ci0JICAgICBkZXZpY2VfaXNfY29tcGF0aWJsZShub2RlLCAicGNpMTFjMSw1ODExIikpKSB7Ci0JCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSXzEzOTRfQ0FCTEVfUE9XRVIsIG5vZGUsIDAsIDEpOwotCQlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl8xMzk0X0VOQUJMRSwgbm9kZSwgMCwgMSk7Ci0JCXVwZGF0ZWNmZyA9IDE7Ci0JfQotCWlmICh1bmlub3J0aF9jaGlsZCAmJiAhc3RyY21wKG5vZGUtPm5hbWUsICJldGhlcm5ldCIpICYmCi0JICAgIGRldmljZV9pc19jb21wYXRpYmxlKG5vZGUsICJnbWFjIikpIHsKLQkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfR01BQ19FTkFCTEUsIG5vZGUsIDAsIDEpOwotCQl1cGRhdGVjZmcgPSAxOwotCX0KLQotCWlmICh1cGRhdGVjZmcpIHsKLQkJdTE2IGNtZDsKLQkKLQkJLyoKLQkJICogTWFrZSBzdXJlIFBDSSBpcyBjb3JyZWN0bHkgY29uZmlndXJlZAotCQkgKgotCQkgKiBXZSB1c2Ugb2xkIHBjaV9iaW9zIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiBzaW5jZSwgYnkKLQkJICogZGVmYXVsdCwgZ21hYyBpcyBub3QgcG93ZXJlZCB1cCwgYW5kIHNvIHdpbGwgYmUgYWJzZW50Ci0JCSAqIGZyb20gdGhlIGtlcm5lbCBpbml0aWFsIFBDSSBsb29rdXAuCi0JCSAqCi0JCSAqIFNob3VsZCBiZSByZXBsYWNlZCBieSAyLjQgbmV3IFBDSSBtZWNoYW5pc21zIGFuZCByZWFsbHkKLQkJICogcmVnaXN0ZXIgdGhlIGRldmljZS4KLQkJICovCi0JCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwotCQljbWQgfD0gUENJX0NPTU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfTUFTVEVSIHwgUENJX0NPTU1BTkRfSU5WQUxJREFURTsKLSAgICAJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBjbWQpOwotICAgIAkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDE2KTsKLSAgICAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsIHBjaV9jYWNoZV9saW5lX3NpemUpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBXZSBwb3dlciBkb3duIHNvbWUgZGV2aWNlcyBhZnRlciB0aGV5IGhhdmUgYmVlbiBwcm9iZWQuIFRoZXknbGwKLSAqIGJlIHBvd2VyZWQgYmFjayBvbiBsYXRlciBvbgotICovCi12b2lkIF9faW5pdAotcG1hY19wY2liaW9zX2FmdGVyX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUqIG5kOwotCi0jaWZkZWYgQ09ORklHX0JMS19ERVZfSURFCi0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7Ci0KLQkvKiBPRiBmYWlscyB0byBpbml0aWFsaXplIElERSBjb250cm9sbGVycyBvbiBtYWNzCi0JICogKGFuZCBtYXliZSBvdGhlciBtYWNoaW5lcykKLQkgKgotCSAqIElkZWFsbHksIHRoaXMgc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSBJREUgbGF5ZXIsIGJ1dCB3ZSBuZWVkCi0JICogdG8gY2hlY2sgc3BlY2lmaWNhbGx5IHdpdGggQW5kcmUgSGVkcmljayBob3cgdG8gZG8gaXQgY2xlYW5seQotCSAqIHNpbmNlIHRoZSBjb21tb24gSURFIGNvZGUgc2VlbSB0byBjYXJlIGFib3V0IHRoZSBmYWN0IHRoYXQgdGhlCi0JICogQklPUyBtYXkgaGF2ZSBkaXNhYmxlZCBhIGNvbnRyb2xsZXIuCi0JICoKLQkgKiAtLSBCZW5ICi0JICovCi0JZm9yX2VhY2hfcGNpX2RldihkZXYpIHsKLQkJaWYgKChkZXYtPmNsYXNzID4+IDE2KSA9PSBQQ0lfQkFTRV9DTEFTU19TVE9SQUdFKQotCQkJcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKLQl9Ci0jZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSURFICovCi0KLQluZCA9IGZpbmRfZGV2aWNlcygiZmlyZXdpcmUiKTsKLQl3aGlsZSAobmQpIHsKLQkJaWYgKG5kLT5wYXJlbnQgJiYgKGRldmljZV9pc19jb21wYXRpYmxlKG5kLCAicGNpMTA2YiwxOCIpIHx8Ci0JCQkJICAgZGV2aWNlX2lzX2NvbXBhdGlibGUobmQsICJwY2kxMDZiLDMwIikgfHwKLQkJCQkgICBkZXZpY2VfaXNfY29tcGF0aWJsZShuZCwgInBjaTExYzEsNTgxMSIpKQotCQkgICAgJiYgZGV2aWNlX2lzX2NvbXBhdGlibGUobmQtPnBhcmVudCwgInVuaS1ub3J0aCIpKSB7Ci0JCQlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl8xMzk0X0VOQUJMRSwgbmQsIDAsIDApOwotCQkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfMTM5NF9DQUJMRV9QT1dFUiwgbmQsIDAsIDApOwotCQl9Ci0JCW5kID0gbmQtPm5leHQ7Ci0JfQotCW5kID0gZmluZF9kZXZpY2VzKCJldGhlcm5ldCIpOwotCXdoaWxlIChuZCkgewotCQlpZiAobmQtPnBhcmVudCAmJiBkZXZpY2VfaXNfY29tcGF0aWJsZShuZCwgImdtYWMiKQotCQkgICAgJiYgZGV2aWNlX2lzX2NvbXBhdGlibGUobmQtPnBhcmVudCwgInVuaS1ub3J0aCIpKQotCQkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfR01BQ19FTkFCTEUsIG5kLCAwLCAwKTsKLQkJbmQgPSBuZC0+bmV4dDsKLQl9Ci19Ci0KLXZvaWQgcG1hY19wY2lfZml4dXBfY2FyZGJ1cyhzdHJ1Y3QgcGNpX2RldiogZGV2KQotewotCWlmIChfbWFjaGluZSAhPSBfTUFDSF9QbWFjKQotCQlyZXR1cm47Ci0JLyoKLQkgKiBGaXggdGhlIGludGVycnVwdCByb3V0aW5nIG9uIHRoZSB2YXJpb3VzIGNhcmRidXMgYnJpZGdlcwotCSAqIHVzZWQgb24gcG93ZXJib29rcwotCSAqLwotCWlmIChkZXYtPnZlbmRvciAhPSBQQ0lfVkVORE9SX0lEX1RJKQotCQlyZXR1cm47Ci0JaWYgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVElfMTEzMCB8fAotCSAgICBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1RJXzExMzEpIHsKLQkJdTggdmFsOwotCSAgICAJLyogRW5hYmxlIFBDSSBpbnRlcnJ1cHQgKi8KLQkJaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg5MSwgJnZhbCkgPT0gMCkKLQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4OTEsIHZhbCB8IDB4MzApOwotCQkvKiBEaXNhYmxlIElTQSBpbnRlcnJ1cHQgbW9kZSAqLwotCQlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDkyLCAmdmFsKSA9PSAwKQotCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg5MiwgdmFsICYgfjB4MDYpOwotCX0KLQlpZiAoZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9USV8xMjEwIHx8Ci0JICAgIGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVElfMTIxMSB8fAotCSAgICBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1RJXzE0MTAgfHwKLQkgICAgZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9USV8xNTEwKSB7Ci0JCXU4IHZhbDsKLQkJLyogMHg4YyA9PSBUSTEyMlhfSVJRTVVYLCAyIHNheXMgdG8gcm91dGUgdGhlIElOVEEKLQkJICAgc2lnbmFsIG91dCB0aGUgTUZVTkMwIHBpbiAqLwotCQlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDhjLCAmdmFsKSA9PSAwKQotCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg4YywgKHZhbCAmIH4weDBmKSB8IDIpOwotCQkvKiBEaXNhYmxlIElTQSBpbnRlcnJ1cHQgbW9kZSAqLwotCQlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDkyLCAmdmFsKSA9PSAwKQotCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg5MiwgdmFsICYgfjB4MDYpOwotCX0KLX0KLQotREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9USSwgUENJX0FOWV9JRCwgcG1hY19wY2lfZml4dXBfY2FyZGJ1cyk7Ci0KLXZvaWQgcG1hY19wY2lfZml4dXBfcGNpYXRhKHN0cnVjdCBwY2lfZGV2KiBkZXYpCi17Ci0gICAgICAgdTggcHJvZ2lmID0gMDsKLQotICAgICAgIC8qCi0gICAgICAgICogT24gUG93ZXJNYWNzLCB3ZSB0cnkgdG8gc3dpdGNoIGFueSBQQ0kgQVRBIGNvbnRyb2xsZXIgdG8KLQkqIGZ1bGx5IG5hdGl2ZSBtb2RlCi0gICAgICAgICovCi0JaWYgKF9tYWNoaW5lICE9IF9NQUNIX1BtYWMpCi0JCXJldHVybjsKLQkvKiBTb21lIGNvbnRyb2xsZXJzIGRvbid0IGhhdmUgdGhlIGNsYXNzIElERSAqLwotCWlmIChkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1BST01JU0UpCi0JCXN3aXRjaChkZXYtPmRldmljZSkgewotCQljYXNlIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI0NjoKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNjI6Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjYzOgotCQljYXNlIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI2NToKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNjc6Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjY4OgotCQljYXNlIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI2OToKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNzA6Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjcxOgotCQljYXNlIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI3NToKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNzY6Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjc3OgotCQkJZ290byBnb29kOwotCQl9Ci0JLyogT3RoZXJzLCBjaGVjayBQQ0kgY2xhc3MgKi8KLQlpZiAoKGRldi0+Y2xhc3MgPj4gOCkgIT0gUENJX0NMQVNTX1NUT1JBR0VfSURFKQotCQlyZXR1cm47Ci0gZ29vZDoKLQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9DTEFTU19QUk9HLCAmcHJvZ2lmKTsKLQlpZiAoKHByb2dpZiAmIDUpICE9IDUpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRm9yY2luZyBQQ0kgSURFIGludG8gbmF0aXZlIG1vZGU6ICVzXG4iLCBwY2lfbmFtZShkZXYpKTsKLQkJKHZvaWQpIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9DTEFTU19QUk9HLCBwcm9naWZ8NSk7Ci0JCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9DTEFTU19QUk9HLCAmcHJvZ2lmKSB8fAotCQkgICAgKHByb2dpZiAmIDUpICE9IDUpCi0JCQlwcmludGsoS0VSTl9FUlIgIlJld3JpdGUgb2YgUFJPR0lGIGZhaWxlZCAhXG4iKTsKLQl9Ci19Ci1ERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwbWFjX3BjaV9maXh1cF9wY2lhdGEpOwotCi0KLS8qCi0gKiBEaXNhYmxlIHNlY29uZCBmdW5jdGlvbiBvbiBLMi1TQVRBLCBpdCdzIGJyb2tlbgotICogYW5kIGRpc2FibGUgSU8gQkFScyBvbiBmaXJzdCBvbmUKLSAqLwotdm9pZCBwbWFjX3BjaV9maXh1cF9rMl9zYXRhKHN0cnVjdCBwY2lfZGV2KiBkZXYpCi17Ci0JaW50IGk7Ci0JdTE2IGNtZDsKLQotCWlmIChQQ0lfRlVOQyhkZXYtPmRldmZuKSA+IDApIHsKLQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7Ci0JCWNtZCAmPSB+KFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUVNT1JZKTsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsIGNtZCk7Ci0JCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKLQkJCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQgPSBkZXYtPnJlc291cmNlW2ldLmVuZCA9IDA7Ci0JCQlkZXYtPnJlc291cmNlW2ldLmZsYWdzID0gMDsKLQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAgKyA0ICogaSwgMCk7Ci0JCX0KLQl9IGVsc2UgewotCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKLQkJY21kICY9IH5QQ0lfQ09NTUFORF9JTzsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsIGNtZCk7Ci0JCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQgPSBkZXYtPnJlc291cmNlW2ldLmVuZCA9IDA7Ci0JCQlkZXYtPnJlc291cmNlW2ldLmZsYWdzID0gMDsKLQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAgKyA0ICogaSwgMCk7Ci0JCX0KLQl9Ci19Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9TRVJWRVJXT1JLUywgMHgwMjQwLCBwbWFjX3BjaV9maXh1cF9rMl9zYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX3BpYy5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfcGljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NDJiZjYuLjAwMDAwMDAKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfcGljLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OTMgKzAsMCBAQAotLyoKLSAqICBTdXBwb3J0IGZvciB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXJzIGZvdW5kIG9uIFBvd2VyIE1hY2ludG9zaCwKLSAqICBjdXJyZW50bHkgQXBwbGUncyAiR3JhbmQgQ2VudHJhbCIgaW50ZXJydXB0IGNvbnRyb2xsZXIgaW4gYWxsCi0gKiAgaXQncyBpbmNhcm5hdGlvbnMuIE9wZW5QSUMgc3VwcG9ydCB1c2VkIG9uIG5ld2VyIG1hY2hpbmVzIGlzCi0gKiAgaW4gYSBzZXBhcmF0ZSBmaWxlCi0gKgotICogIENvcHlyaWdodCAoQykgMTk5NyBQYXVsIE1hY2tlcnJhcyAocGF1bHVzQGNzLmFudS5lZHUuYXUpCi0gKgotICogIE1haW50YWluZWQgYnkgQmVuamFtaW4gSGVycmVuc2NobWlkdCAoYmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnKQotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvYWRiLmg+Ci0jaW5jbHVkZSA8bGludXgvcG11Lmg+Ci0KLSNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vc21wLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgotI2luY2x1ZGUgPGFzbS90aW1lLmg+Ci0jaW5jbHVkZSA8YXNtL29wZW5fcGljLmg+Ci0jaW5jbHVkZSA8YXNtL3htb24uaD4KLSNpbmNsdWRlIDxhc20vcG1hY19mZWF0dXJlLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLQotI2luY2x1ZGUgInBtYWNfcGljLmgiCi0KLS8qCi0gKiBYWFggdGhpcyBzaG91bGQgYmUgaW4geG1vbi5oLCBidXQgcHV0dGluZyBpdCB0aGVyZSBtZWFucyB4bW9uLmgKLSAqIGhhcyB0byBpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4gKHRvIGdldCBpcnFyZXR1cm5fdCksIHdoaWNoCi0gKiBjYXVzZXMgYWxsIHNvcnRzIG9mIHByb2JsZW1zLiAgLS0gcGF1bHVzCi0gKi8KLWV4dGVybiBpcnFyZXR1cm5fdCB4bW9uX2lycShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci0KLXN0cnVjdCBwbWFjX2lycV9odyB7Ci0gICAgICAgIHVuc2lnbmVkIGludCAgICBldmVudDsKLSAgICAgICAgdW5zaWduZWQgaW50ICAgIGVuYWJsZTsKLSAgICAgICAgdW5zaWduZWQgaW50ICAgIGFjazsKLSAgICAgICAgdW5zaWduZWQgaW50ICAgIGxldmVsOwotfTsKLQotLyogRGVmYXVsdCBhZGRyZXNzZXMgKi8KLXN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgcG1hY19pcnFfaHcgKnBtYWNfaXJxX2h3WzRdID0gewotICAgICAgICAoc3RydWN0IHBtYWNfaXJxX2h3ICopIDB4ZjMwMDAwMjAsCi0gICAgICAgIChzdHJ1Y3QgcG1hY19pcnFfaHcgKikgMHhmMzAwMDAxMCwKLSAgICAgICAgKHN0cnVjdCBwbWFjX2lycV9odyAqKSAweGY0MDAwMDIwLAotICAgICAgICAoc3RydWN0IHBtYWNfaXJxX2h3ICopIDB4ZjQwMDAwMTAsCi19OwotCi0jZGVmaW5lIEdDX0xFVkVMX01BU0sJCTB4M2ZmMDAwMDAKLSNkZWZpbmUgT0hBUkVfTEVWRUxfTUFTSwkweDFmZjAwMDAwCi0jZGVmaW5lIEhFQVRIUk9XX0xFVkVMX01BU0sJMHgxZmYwMDAwMAotCi1zdGF0aWMgaW50IG1heF9pcnFzOwotc3RhdGljIGludCBtYXhfcmVhbF9pcnFzOwotc3RhdGljIHUzMiBsZXZlbF9tYXNrWzRdOwotCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBtYWNfcGljX2xvY2spOwotCi0KLSNkZWZpbmUgR0FUV0lDS19JUlFfUE9PTF9TSVpFICAgICAgICAxMAotc3RhdGljIHN0cnVjdCBpbnRlcnJ1cHRfaW5mbyBnYXR3aWNrX2ludF9wb29sW0dBVFdJQ0tfSVJRX1BPT0xfU0laRV07Ci0KLSNkZWZpbmUgTlJfTUFTS19XT1JEUwkoKE5SX0lSUVMgKyAzMSkgLyAzMikKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBwY19sb3N0X2ludGVycnVwdHNbTlJfTUFTS19XT1JEU107Ci0KLS8qCi0gKiBNYXJrIGFuIGlycSBhcyAibG9zdCIuICBUaGlzIGlzIG9ubHkgdXNlZCBvbiB0aGUgcG1hYwotICogc2luY2UgaXQgY2FuIGxvc2UgaW50ZXJydXB0cyAoc2VlIHBtYWNfc2V0X2lycV9tYXNrKS4KLSAqIC0tIENvcnQKLSAqLwotdm9pZAotX19zZXRfbG9zdCh1bnNpZ25lZCBsb25nIGlycV9uciwgaW50IG5va2ljaykKLXsKLQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoaXJxX25yLCBwcGNfbG9zdF9pbnRlcnJ1cHRzKSkgewotCQlhdG9taWNfaW5jKCZwcGNfbl9sb3N0X2ludGVycnVwdHMpOwotCQlpZiAoIW5va2ljaykKLQkJCXNldF9kZWMoMSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotcG1hY19tYXNrX2FuZF9hY2tfaXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgYml0ID0gMVVMIDw8IChpcnFfbnIgJiAweDFmKTsKLSAgICAgICAgaW50IGkgPSBpcnFfbnIgPj4gNTsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQotICAgICAgICBpZiAoKHVuc2lnbmVkKWlycV9uciA+PSBtYXhfaXJxcykKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgY2xlYXJfYml0KGlycV9uciwgcHBjX2NhY2hlZF9pcnFfbWFzayk7Ci0gICAgICAgIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoaXJxX25yLCBwcGNfbG9zdF9pbnRlcnJ1cHRzKSkKLSAgICAgICAgICAgICAgICBhdG9taWNfZGVjKCZwcGNfbl9sb3N0X2ludGVycnVwdHMpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZwbWFjX3BpY19sb2NrLCBmbGFncyk7Ci0gICAgICAgIG91dF9sZTMyKCZwbWFjX2lycV9od1tpXS0+ZW5hYmxlLCBwcGNfY2FjaGVkX2lycV9tYXNrW2ldKTsKLSAgICAgICAgb3V0X2xlMzIoJnBtYWNfaXJxX2h3W2ldLT5hY2ssIGJpdCk7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAvKiBtYWtlIHN1cmUgYWNrIGdldHMgdG8gY29udHJvbGxlciBiZWZvcmUgd2UgZW5hYmxlCi0gICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyAqLwotICAgICAgICAgICAgICAgIG1iKCk7Ci0gICAgICAgIH0gd2hpbGUoKGluX2xlMzIoJnBtYWNfaXJxX2h3W2ldLT5lbmFibGUpICYgYml0KQotICAgICAgICAgICAgICAgICE9IChwcGNfY2FjaGVkX2lycV9tYXNrW2ldICYgYml0KSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1hY19waWNfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBwbWFjX3NldF9pcnFfbWFzayh1bnNpZ25lZCBpbnQgaXJxX25yLCBpbnQgbm9raWNrbG9zdCkKLXsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBiaXQgPSAxVUwgPDwgKGlycV9uciAmIDB4MWYpOwotICAgICAgICBpbnQgaSA9IGlycV9uciA+PiA1OwotICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0gICAgICAgIGlmICgodW5zaWduZWQpaXJxX25yID49IG1heF9pcnFzKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwbWFjX3BpY19sb2NrLCBmbGFncyk7Ci0gICAgICAgIC8qIGVuYWJsZSB1bm1hc2tlZCBpbnRlcnJ1cHRzICovCi0gICAgICAgIG91dF9sZTMyKCZwbWFjX2lycV9od1tpXS0+ZW5hYmxlLCBwcGNfY2FjaGVkX2lycV9tYXNrW2ldKTsKLQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgLyogbWFrZSBzdXJlIG1hc2sgZ2V0cyB0byBjb250cm9sbGVyIGJlZm9yZSB3ZQotICAgICAgICAgICAgICAgICAgIHJldHVybiB0byB1c2VyICovCi0gICAgICAgICAgICAgICAgbWIoKTsKLSAgICAgICAgfSB3aGlsZSgoaW5fbGUzMigmcG1hY19pcnFfaHdbaV0tPmVuYWJsZSkgJiBiaXQpCi0gICAgICAgICAgICAgICAgIT0gKHBwY19jYWNoZWRfaXJxX21hc2tbaV0gJiBiaXQpKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBVbmZvcnR1bmF0ZWx5LCBzZXR0aW5nIHRoZSBiaXQgaW4gdGhlIGVuYWJsZSByZWdpc3RlcgotICAgICAgICAgKiB3aGVuIHRoZSBkZXZpY2UgaW50ZXJydXB0IGlzIGFscmVhZHkgb24gKmRvZXNuJ3QqIHNldAotICAgICAgICAgKiB0aGUgYml0IGluIHRoZSBmbGFnIHJlZ2lzdGVyIG9yIHJlcXVlc3QgYW5vdGhlciBpbnRlcnJ1cHQuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoYml0ICYgcHBjX2NhY2hlZF9pcnFfbWFza1tpXSAmIGluX2xlMzIoJnBtYWNfaXJxX2h3W2ldLT5sZXZlbCkpCi0JCV9fc2V0X2xvc3QoKHVsb25nKWlycV9uciwgbm9raWNrbG9zdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1hY19waWNfbG9jaywgZmxhZ3MpOwotfQotCi0vKiBXaGVuIGFuIGlycSBnZXRzIHJlcXVlc3RlZCBmb3IgdGhlIGZpcnN0IGNsaWVudCwgaWYgaXQncyBhbgotICogZWRnZSBpbnRlcnJ1cHQsIHdlIGNsZWFyIGFueSBwcmV2aW91cyBvbmUgb24gdGhlIGNvbnRyb2xsZXIKLSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBwbWFjX3N0YXJ0dXBfaXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgYml0ID0gMVVMIDw8IChpcnFfbnIgJiAweDFmKTsKLSAgICAgICAgaW50IGkgPSBpcnFfbnIgPj4gNTsKLQotCWlmICgoaXJxX2Rlc2NbaXJxX25yXS5zdGF0dXMgJiBJUlFfTEVWRUwpID09IDApCi0JCW91dF9sZTMyKCZwbWFjX2lycV9od1tpXS0+YWNrLCBiaXQpOwotICAgICAgICBzZXRfYml0KGlycV9uciwgcHBjX2NhY2hlZF9pcnFfbWFzayk7Ci0gICAgICAgIHBtYWNfc2V0X2lycV9tYXNrKGlycV9uciwgMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcG1hY19tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotICAgICAgICBjbGVhcl9iaXQoaXJxX25yLCBwcGNfY2FjaGVkX2lycV9tYXNrKTsKLSAgICAgICAgcG1hY19zZXRfaXJxX21hc2soaXJxX25yLCAwKTsKLSAgICAgICAgbWIoKTsKLX0KLQotc3RhdGljIHZvaWQgcG1hY191bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0gICAgICAgIHNldF9iaXQoaXJxX25yLCBwcGNfY2FjaGVkX2lycV9tYXNrKTsKLSAgICAgICAgcG1hY19zZXRfaXJxX21hc2soaXJxX25yLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgcG1hY19lbmRfaXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0JaWYgKCEoaXJxX2Rlc2NbaXJxX25yXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkKLQkgICAgJiYgaXJxX2Rlc2NbaXJxX25yXS5hY3Rpb24pIHsKLSAgICAgICAgCXNldF9iaXQoaXJxX25yLCBwcGNfY2FjaGVkX2lycV9tYXNrKTsKLQkgICAgICAgIHBtYWNfc2V0X2lycV9tYXNrKGlycV9uciwgMSk7Ci0JfQotfQotCi0KLXN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBwbWFjX3BpYyA9IHsKLQkudHlwZW5hbWUJPSAiIFBNQUMtUElDICIsCi0JLnN0YXJ0dXAJPSBwbWFjX3N0YXJ0dXBfaXJxLAotCS5lbmFibGUJCT0gcG1hY191bm1hc2tfaXJxLAotCS5kaXNhYmxlCT0gcG1hY19tYXNrX2lycSwKLQkuYWNrCQk9IHBtYWNfbWFza19hbmRfYWNrX2lycSwKLQkuZW5kCQk9IHBtYWNfZW5kX2lycSwKLX07Ci0KLXN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBnYXR3aWNrX3BpYyA9IHsKLQkudHlwZW5hbWUJPSAiIEdBVFdJQ0sgICIsCi0JLnN0YXJ0dXAJPSBwbWFjX3N0YXJ0dXBfaXJxLAotCS5lbmFibGUJCT0gcG1hY191bm1hc2tfaXJxLAotCS5kaXNhYmxlCT0gcG1hY19tYXNrX2lycSwKLQkuYWNrCQk9IHBtYWNfbWFza19hbmRfYWNrX2lycSwKLQkuZW5kCQk9IHBtYWNfZW5kX2lycSwKLX07Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBnYXR3aWNrX2FjdGlvbihpbnQgY3BsLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWludCBpcnEsIGJpdHM7Ci0KLQlmb3IgKGlycSA9IG1heF9pcnFzOyAoaXJxIC09IDMyKSA+PSBtYXhfcmVhbF9pcnFzOyApIHsKLQkJaW50IGkgPSBpcnEgPj4gNTsKLQkJYml0cyA9IGluX2xlMzIoJnBtYWNfaXJxX2h3W2ldLT5ldmVudCkgfCBwcGNfbG9zdF9pbnRlcnJ1cHRzW2ldOwotCQkvKiBXZSBtdXN0IHJlYWQgbGV2ZWwgaW50ZXJydXB0cyBmcm9tIHRoZSBsZXZlbCByZWdpc3RlciAqLwotCQliaXRzIHw9IChpbl9sZTMyKCZwbWFjX2lycV9od1tpXS0+bGV2ZWwpICYgbGV2ZWxfbWFza1tpXSk7Ci0JCWJpdHMgJj0gcHBjX2NhY2hlZF9pcnFfbWFza1tpXTsKLQkJaWYgKGJpdHMgPT0gMCkKLQkJCWNvbnRpbnVlOwotCQlpcnEgKz0gX19pbG9nMihiaXRzKTsKLQkJX19kb19JUlEoaXJxLCByZWdzKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQlwcmludGsoImdhdHdpY2sgaXJxIG5vdCBmcm9tIGdhdHdpY2sgcGljXG4iKTsKLQlyZXR1cm4gSVJRX05PTkU7Ci19Ci0KLWludAotcG1hY19nZXRfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWludCBpcnE7Ci0JdW5zaWduZWQgbG9uZyBiaXRzID0gMDsKLQotI2lmZGVmIENPTkZJR19TTVAKLQl2b2lkIHBzdXJnZV9zbXBfbWVzc2FnZV9yZWN2KHN0cnVjdCBwdF9yZWdzICopOwotCi0gICAgICAgCS8qIElQSSdzIGFyZSBhIGhhY2sgb24gdGhlIHBvd2Vyc3VyZ2UgLS0gQ29ydCAqLwotICAgICAgIAlpZiAoIHNtcF9wcm9jZXNzb3JfaWQoKSAhPSAwICkgewotCQlwc3VyZ2Vfc21wX21lc3NhZ2VfcmVjdihyZWdzKTsKLQkJcmV0dXJuIC0yOwkvKiBpZ25vcmUsIGFscmVhZHkgaGFuZGxlZCAqLwotICAgICAgICB9Ci0jZW5kaWYgLyogQ09ORklHX1NNUCAqLwotCWZvciAoaXJxID0gbWF4X3JlYWxfaXJxczsgKGlycSAtPSAzMikgPj0gMDsgKSB7Ci0JCWludCBpID0gaXJxID4+IDU7Ci0JCWJpdHMgPSBpbl9sZTMyKCZwbWFjX2lycV9od1tpXS0+ZXZlbnQpIHwgcHBjX2xvc3RfaW50ZXJydXB0c1tpXTsKLQkJLyogV2UgbXVzdCByZWFkIGxldmVsIGludGVycnVwdHMgZnJvbSB0aGUgbGV2ZWwgcmVnaXN0ZXIgKi8KLQkJYml0cyB8PSAoaW5fbGUzMigmcG1hY19pcnFfaHdbaV0tPmxldmVsKSAmIGxldmVsX21hc2tbaV0pOwotCQliaXRzICY9IHBwY19jYWNoZWRfaXJxX21hc2tbaV07Ci0JCWlmIChiaXRzID09IDApCi0JCQljb250aW51ZTsKLQkJaXJxICs9IF9faWxvZzIoYml0cyk7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBpcnE7Ci19Ci0KLS8qIFRoaXMgcm91dGluZSB3aWxsIGZpeCBzb21lIG1pc3NpbmcgaW50ZXJydXB0IHZhbHVlcyBpbiB0aGUgZGV2aWNlIHRyZWUKLSAqIG9uIHRoZSBnYXR3aWNrIG1hYy1pbyBjb250cm9sbGVyIHVzZWQgYnkgc29tZSBQb3dlckJvb2tzCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdAotcG1hY19maXhfZ2F0d2lja19pbnRlcnJ1cHRzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZ3csIGludCBpcnFfYmFzZSkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7Ci0JaW50IGNvdW50OwotCi0JbWVtc2V0KGdhdHdpY2tfaW50X3Bvb2wsIDAsIHNpemVvZihnYXR3aWNrX2ludF9wb29sKSk7Ci0Jbm9kZSA9IGd3LT5jaGlsZDsKLQljb3VudCA9IDA7Ci0Jd2hpbGUobm9kZSkKLQl7Ci0JCS8qIEZpeCBTQ0MgKi8KLQkJaWYgKHN0cmNhc2VjbXAobm9kZS0+bmFtZSwgImVzY2MiKSA9PSAwKQotCQkJaWYgKG5vZGUtPmNoaWxkKSB7Ci0JCQkJaWYgKG5vZGUtPmNoaWxkLT5uX2ludHJzIDwgMykgewotCQkJCQlub2RlLT5jaGlsZC0+aW50cnMgPSAmZ2F0d2lja19pbnRfcG9vbFtjb3VudF07Ci0JCQkJCWNvdW50ICs9IDM7Ci0JCQkJfQotCQkJCW5vZGUtPmNoaWxkLT5uX2ludHJzID0gMzsKLQkJCQlub2RlLT5jaGlsZC0+aW50cnNbMF0ubGluZSA9IDE1K2lycV9iYXNlOwotCQkJCW5vZGUtPmNoaWxkLT5pbnRyc1sxXS5saW5lID0gIDQraXJxX2Jhc2U7Ci0JCQkJbm9kZS0+Y2hpbGQtPmludHJzWzJdLmxpbmUgPSAgNStpcnFfYmFzZTsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJpcnE6IGZpeGVkIFNDQyBvbiBzZWNvbmQgY29udHJvbGxlciAoJWQsJWQsJWQpXG4iLAotCQkJCQlub2RlLT5jaGlsZC0+aW50cnNbMF0ubGluZSwKLQkJCQkJbm9kZS0+Y2hpbGQtPmludHJzWzFdLmxpbmUsCi0JCQkJCW5vZGUtPmNoaWxkLT5pbnRyc1syXS5saW5lKTsKLQkJCX0KLQkJLyogRml4IG1lZGlhLWJheSAmIGxlZnQgU1dJTSAqLwotCQlpZiAoc3RyY2FzZWNtcChub2RlLT5uYW1lLCAibWVkaWEtYmF5IikgPT0gMCkgewotCQkJc3RydWN0IGRldmljZV9ub2RlKiB5YV9ub2RlOwotCi0JCQlpZiAobm9kZS0+bl9pbnRycyA9PSAwKQotCQkJCW5vZGUtPmludHJzID0gJmdhdHdpY2tfaW50X3Bvb2xbY291bnQrK107Ci0JCQlub2RlLT5uX2ludHJzID0gMTsKLQkJCW5vZGUtPmludHJzWzBdLmxpbmUgPSAyOStpcnFfYmFzZTsKLQkJCXByaW50ayhLRVJOX0lORk8gImlycTogZml4ZWQgbWVkaWEtYmF5IG9uIHNlY29uZCBjb250cm9sbGVyICglZClcbiIsCi0JCQkJCW5vZGUtPmludHJzWzBdLmxpbmUpOwotCi0JCQl5YV9ub2RlID0gbm9kZS0+Y2hpbGQ7Ci0JCQl3aGlsZSh5YV9ub2RlKQotCQkJewotCQkJCWlmIChzdHJjYXNlY21wKHlhX25vZGUtPm5hbWUsICJmbG9wcHkiKSA9PSAwKSB7Ci0JCQkJCWlmICh5YV9ub2RlLT5uX2ludHJzIDwgMikgewotCQkJCQkJeWFfbm9kZS0+aW50cnMgPSAmZ2F0d2lja19pbnRfcG9vbFtjb3VudF07Ci0JCQkJCQljb3VudCArPSAyOwotCQkJCQl9Ci0JCQkJCXlhX25vZGUtPm5faW50cnMgPSAyOwotCQkJCQl5YV9ub2RlLT5pbnRyc1swXS5saW5lID0gMTkraXJxX2Jhc2U7Ci0JCQkJCXlhX25vZGUtPmludHJzWzFdLmxpbmUgPSAgMStpcnFfYmFzZTsKLQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiaXJxOiBmaXhlZCBmbG9wcHkgb24gc2Vjb25kIGNvbnRyb2xsZXIgKCVkLCVkKVxuIiwKLQkJCQkJCXlhX25vZGUtPmludHJzWzBdLmxpbmUsIHlhX25vZGUtPmludHJzWzFdLmxpbmUpOwotCQkJCX0KLQkJCQlpZiAoc3RyY2FzZWNtcCh5YV9ub2RlLT5uYW1lLCAiYXRhNCIpID09IDApIHsKLQkJCQkJaWYgKHlhX25vZGUtPm5faW50cnMgPCAyKSB7Ci0JCQkJCQl5YV9ub2RlLT5pbnRycyA9ICZnYXR3aWNrX2ludF9wb29sW2NvdW50XTsKLQkJCQkJCWNvdW50ICs9IDI7Ci0JCQkJCX0KLQkJCQkJeWFfbm9kZS0+bl9pbnRycyA9IDI7Ci0JCQkJCXlhX25vZGUtPmludHJzWzBdLmxpbmUgPSAxNCtpcnFfYmFzZTsKLQkJCQkJeWFfbm9kZS0+aW50cnNbMV0ubGluZSA9ICAzK2lycV9iYXNlOwotCQkJCQlwcmludGsoS0VSTl9JTkZPICJpcnE6IGZpeGVkIGlkZSBvbiBzZWNvbmQgY29udHJvbGxlciAoJWQsJWQpXG4iLAotCQkJCQkJeWFfbm9kZS0+aW50cnNbMF0ubGluZSwgeWFfbm9kZS0+aW50cnNbMV0ubGluZSk7Ci0JCQkJfQotCQkJCXlhX25vZGUgPSB5YV9ub2RlLT5zaWJsaW5nOwotCQkJfQotCQl9Ci0JCW5vZGUgPSBub2RlLT5zaWJsaW5nOwotCX0KLQlpZiAoY291bnQgPiAxMCkgewotCQlwcmludGsoIldBUk5JTkcgISEgR2F0d2ljayBpbnRlcnJ1cHQgcG9vbCBvdmVyZmxvd1xuIik7Ci0JCXByaW50aygiICBHQVRXSUNLX0lSUV9QT09MX1NJWkUgPSAlZFxuIiwgR0FUV0lDS19JUlFfUE9PTF9TSVpFKTsKLQkJcHJpbnRrKCIgICAgICAgICAgICAgIHJlcXVlc3RlZCA9ICVkXG4iLCBjb3VudCk7Ci0JfQotfQotCi0vKgotICogVGhlIFBvd2VyQm9vayAzNDAwLzI0MDAvMzUwMCBjYW4gaGF2ZSBhIGNvbWJvIGV0aGVybmV0L21vZGVtCi0gKiBjYXJkIHdoaWNoIGluY2x1ZGVzIGFuIG9oYXJlIGNoaXAgdGhhdCBhY3RzIGFzIGEgc2Vjb25kIGludGVycnVwdAotICogY29udHJvbGxlci4gIElmIHdlIGZpbmQgdGhpcyBzZWNvbmQgb2hhcmUsIHNldCBpdCB1cCBhbmQgZml4IHRoZQotICogaW50ZXJydXB0IHZhbHVlIGluIHRoZSBkZXZpY2UgdHJlZSBmb3IgdGhlIGV0aGVybmV0IGNoaXAuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGVuYWJsZV9zZWNvbmRfb2hhcmUodm9pZCkKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1cywgZGV2Zm47Ci0JdW5zaWduZWQgc2hvcnQgY21kOwotICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHI7Ci0Jc3RydWN0IGRldmljZV9ub2RlICppcnFjdHJsZXIgPSBmaW5kX2RldmljZXMoInBjaTEwNmIsNyIpOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZXRoZXI7Ci0KLQlpZiAoaXJxY3RybGVyID09IE5VTEwgfHwgaXJxY3RybGVyLT5uX2FkZHJzIDw9IDApCi0JCXJldHVybiAtMTsKLQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXAoaXJxY3RybGVyLT5hZGRyc1swXS5hZGRyZXNzLCAweDQwKTsKLQlwbWFjX2lycV9od1sxXSA9ICh2b2xhdGlsZSBzdHJ1Y3QgcG1hY19pcnFfaHcgKikoYWRkciArIDB4MjApOwotCW1heF9pcnFzID0gNjQ7Ci0JaWYgKHBjaV9kZXZpY2VfZnJvbV9PRl9ub2RlKGlycWN0cmxlciwgJmJ1cywgJmRldmZuKSA9PSAwKSB7Ci0JCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSA9IHBjaV9maW5kX2hvc2VfZm9yX09GX2RldmljZShpcnFjdHJsZXIpOwotCQlpZiAoIWhvc2UpCi0JCSAgICBwcmludGsoS0VSTl9FUlIgIkNhbid0IGZpbmQgUENJIGhvc2UgZm9yIE9IYXJlMiAhXG4iKTsKLQkJZWxzZSB7Ci0JCSAgICBlYXJseV9yZWFkX2NvbmZpZ193b3JkKGhvc2UsIGJ1cywgZGV2Zm4sIFBDSV9DT01NQU5ELCAmY21kKTsKLQkJICAgIGNtZCB8PSBQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9NQVNURVI7Ci0JICAJICAgIGNtZCAmPSB+UENJX0NPTU1BTkRfSU87Ci0JCSAgICBlYXJseV93cml0ZV9jb25maWdfd29yZChob3NlLCBidXMsIGRldmZuLCBQQ0lfQ09NTUFORCwgY21kKTsKLQkJfQotCX0KLQotCS8qIEZpeCBpbnRlcnJ1cHQgZm9yIHRoZSBtb2RlbS9ldGhlcm5ldCBjb21ibyBjb250cm9sbGVyLiBUaGUgbnVtYmVyCi0JICAgaW4gdGhlIGRldmljZSB0cmVlICgyNykgaXMgYm9ndXMgKGNvcnJlY3QgZm9yIHRoZSBldGhlcm5ldC1vbmx5Ci0JICAgYm9hcmQgYnV0IG5vdCB0aGUgY29tYm8gZXRoZXJuZXQvbW9kZW0gYm9hcmQpLgotCSAgIFRoZSByZWFsIGludGVycnVwdCBpcyAyOCBvbiB0aGUgc2Vjb25kIGNvbnRyb2xsZXIgLT4gMjgrMzIgPSA2MC4KLQkqLwotCWV0aGVyID0gZmluZF9kZXZpY2VzKCJwY2kxMDExLDE0Iik7Ci0JaWYgKGV0aGVyICYmIGV0aGVyLT5uX2ludHJzID4gMCkgewotCQlldGhlci0+aW50cnNbMF0ubGluZSA9IDYwOwotCQlwcmludGsoS0VSTl9JTkZPICJpcnE6IEZpeGVkIGV0aGVybmV0IElSUSB0byAlZFxuIiwKLQkJICAgICAgIGV0aGVyLT5pbnRyc1swXS5saW5lKTsKLQl9Ci0KLQkvKiBSZXR1cm4gdGhlIGludGVycnVwdCBudW1iZXIgb2YgdGhlIGNhc2NhZGUgKi8KLQlyZXR1cm4gaXJxY3RybGVyLT5pbnRyc1swXS5saW5lOwotfQotCi0jaWZkZWYgQ09ORklHX1BPV0VSNAotc3RhdGljIGlycXJldHVybl90IGsydTNfYWN0aW9uKGludCBjcGwsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JaW50IGlycTsKLQotCWlycSA9IG9wZW5waWMyX2dldF9pcnEocmVncyk7Ci0JaWYgKGlycSAhPSAtMSkKLQkJX19kb19JUlEoaXJxLCByZWdzKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGsydTNfY2FzY2FkZV9hY3Rpb24gPSB7Ci0JLmhhbmRsZXIJPSBrMnUzX2FjdGlvbiwKLQkuZmxhZ3MJCT0gMCwKLQkubWFzawkJPSBDUFVfTUFTS19OT05FLAotCS5uYW1lCQk9ICJVMy0+SzIgQ2FzY2FkZSIsCi19OwotI2VuZGlmIC8qIENPTkZJR19QT1dFUjQgKi8KLQotI2lmZGVmIENPTkZJR19YTU9OCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiB4bW9uX2FjdGlvbiA9IHsKLQkuaGFuZGxlcgk9IHhtb25faXJxLAotCS5mbGFncwkJPSAwLAotCS5tYXNrCQk9IENQVV9NQVNLX05PTkUsCi0JLm5hbWUJCT0gIk5NSSAtIFhNT04iCi19OwotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGdhdHdpY2tfY2FzY2FkZV9hY3Rpb24gPSB7Ci0JLmhhbmRsZXIJPSBnYXR3aWNrX2FjdGlvbiwKLQkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAotCS5tYXNrCQk9IENQVV9NQVNLX05PTkUsCi0JLm5hbWUJCT0gImNhc2NhZGUiLAotfTsKLQotdm9pZCBfX2luaXQgcG1hY19waWNfaW5pdCh2b2lkKQotewotICAgICAgICBpbnQgaTsKLSAgICAgICAgc3RydWN0IGRldmljZV9ub2RlICppcnFjdHJsZXIgID0gTlVMTDsKLSAgICAgICAgc3RydWN0IGRldmljZV9ub2RlICppcnFjdHJsZXIyID0gTlVMTDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHI7Ci0JaW50IGlycV9jYXNjYWRlID0gLTE7Ci0KLQkvKiBXZSBmaXJzdCB0cnkgdG8gZGV0ZWN0IEFwcGxlJ3MgbmV3IENvcmU5OSBjaGlwc2V0LCBzaW5jZSBtYWMtaW8KLQkgKiBpcyBxdWl0ZSBkaWZmZXJlbnQgb24gdGhvc2UgbWFjaGluZXMgYW5kIGNvbnRhaW5zIGFuIElCTSBNUElDMi4KLQkgKi8KLQlucCA9IGZpbmRfdHlwZV9kZXZpY2VzKCJvcGVuLXBpYyIpOwotCXdoaWxlKG5wKSB7Ci0JCWlmIChucC0+cGFyZW50ICYmICFzdHJjbXAobnAtPnBhcmVudC0+bmFtZSwgInUzIikpCi0JCQlpcnFjdHJsZXIyID0gbnA7Ci0JCWVsc2UKLQkJCWlycWN0cmxlciA9IG5wOwotCQlucCA9IG5wLT5uZXh0OwotCX0KLQlpZiAoaXJxY3RybGVyICE9IE5VTEwpCi0JewotCQlpZiAoaXJxY3RybGVyLT5uX2FkZHJzID4gMCkKLQkJewotCQkJdW5zaWduZWQgY2hhciBzZW5zZXNbMTI4XTsKLQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiUG93ZXJNYWMgdXNpbmcgT3BlblBJQyBpcnEgY29udHJvbGxlciBhdCAweCUwOHhcbiIsCi0JCQkgICAgICAgaXJxY3RybGVyLT5hZGRyc1swXS5hZGRyZXNzKTsKLQotCQkJcHJvbV9nZXRfaXJxX3NlbnNlcyhzZW5zZXMsIDAsIDEyOCk7Ci0JCQlPcGVuUElDX0luaXRTZW5zZXMgPSBzZW5zZXM7Ci0JCQlPcGVuUElDX051bUluaXRTZW5zZXMgPSAxMjg7Ci0JCQlwcGNfbWQuZ2V0X2lycSA9IG9wZW5waWNfZ2V0X2lycTsKLQkJCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX0VOQUJMRV9NUElDLCBpcnFjdHJsZXIsIDAsIDApOwotCQkJT3BlblBJQ19BZGRyID0gaW9yZW1hcChpcnFjdHJsZXItPmFkZHJzWzBdLmFkZHJlc3MsCi0JCQkJCSAgICAgICBpcnFjdHJsZXItPmFkZHJzWzBdLnNpemUpOwotCQkJb3BlbnBpY19pbml0KDApOwotCi0jaWZkZWYgQ09ORklHX1BPV0VSNAotCQkJaWYgKGlycWN0cmxlcjIgIT0gTlVMTCAmJiBpcnFjdHJsZXIyLT5uX2ludHJzID4gMCAmJgotCQkJICAgIGlycWN0cmxlcjItPm5fYWRkcnMgPiAwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiU2xhdmUgT3BlblBJQyBhdCAweCUwOHggaG9va2VkIG9uIElSUSAlZFxuIiwKLQkJCQkgICAgICAgaXJxY3RybGVyMi0+YWRkcnNbMF0uYWRkcmVzcywKLQkJCQkgICAgICAgaXJxY3RybGVyMi0+aW50cnNbMF0ubGluZSk7Ci0JCQkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfRU5BQkxFX01QSUMsIGlycWN0cmxlcjIsIDAsIDApOwotCQkJCU9wZW5QSUMyX0FkZHIgPSBpb3JlbWFwKGlycWN0cmxlcjItPmFkZHJzWzBdLmFkZHJlc3MsCi0JCQkJCQkJaXJxY3RybGVyMi0+YWRkcnNbMF0uc2l6ZSk7Ci0JCQkJcHJvbV9nZXRfaXJxX3NlbnNlcyhzZW5zZXMsIFBNQUNfT1BFTlBJQzJfT0ZGU0VULAotCQkJCQkJICAgIFBNQUNfT1BFTlBJQzJfT0ZGU0VUKzEyOCk7Ci0JCQkJT3BlblBJQ19Jbml0U2Vuc2VzID0gc2Vuc2VzOwotCQkJCU9wZW5QSUNfTnVtSW5pdFNlbnNlcyA9IDEyODsKLQkJCQlvcGVucGljMl9pbml0KFBNQUNfT1BFTlBJQzJfT0ZGU0VUKTsKLQotCQkJCWlmIChzZXR1cF9pcnEoaXJxY3RybGVyMi0+aW50cnNbMF0ubGluZSwKLQkJCQkJICAgICAgJmsydTNfY2FzY2FkZV9hY3Rpb24pKQotCQkJCQlwcmludGsoIlVuYWJsZSB0byBnZXQgT3BlblBJQyBJUlEgZm9yIGNhc2NhZGVcbiIpOwotCQkJfQotI2VuZGlmIC8qIENPTkZJR19QT1dFUjQgKi8KLQotI2lmZGVmIENPTkZJR19YTU9OCi0JCQl7Ci0JCQkJc3RydWN0IGRldmljZV9ub2RlKiBwc3dpdGNoOwotCQkJCWludCBubWlfaXJxOwotCi0JCQkJcHN3aXRjaCA9IGZpbmRfZGV2aWNlcygicHJvZ3JhbW1lci1zd2l0Y2giKTsKLQkJCQlpZiAocHN3aXRjaCAmJiBwc3dpdGNoLT5uX2ludHJzKSB7Ci0JCQkJCW5taV9pcnEgPSBwc3dpdGNoLT5pbnRyc1swXS5saW5lOwotCQkJCQlvcGVucGljX2luaXRfbm1pX2lycShubWlfaXJxKTsKLQkJCQkJc2V0dXBfaXJxKG5taV9pcnEsICZ4bW9uX2FjdGlvbik7Ci0JCQkJfQotCQkJfQotI2VuZGlmCS8qIENPTkZJR19YTU9OICovCi0JCQlyZXR1cm47Ci0JCX0KLQkJaXJxY3RybGVyID0gTlVMTDsKLQl9Ci0KLQkvKiBHZXQgdGhlIGxldmVsL2VkZ2Ugc2V0dGluZ3MsIGFzc3VtZSBpZiBpdCdzIG5vdAotCSAqIGEgR3JhbmQgQ2VudHJhbCBub3IgYW4gT0hhcmUsIHRoZW4gaXQncyBhbiBIZWF0aHJvdwotCSAqIChvciBQYWRkaW5ndG9uKS4KLQkgKi8KLQlpZiAoZmluZF9kZXZpY2VzKCJnYyIpKQotCQlsZXZlbF9tYXNrWzBdID0gR0NfTEVWRUxfTUFTSzsKLQllbHNlIGlmIChmaW5kX2RldmljZXMoIm9oYXJlIikpIHsKLQkJbGV2ZWxfbWFza1swXSA9IE9IQVJFX0xFVkVMX01BU0s7Ci0JCS8qIFdlIG1pZ2h0IGhhdmUgYSBzZWNvbmQgY2FzY2FkZWQgb2hhcmUgKi8KLQkJbGV2ZWxfbWFza1sxXSA9IE9IQVJFX0xFVkVMX01BU0s7Ci0JfSBlbHNlIHsKLQkJbGV2ZWxfbWFza1swXSA9IEhFQVRIUk9XX0xFVkVMX01BU0s7Ci0JCWxldmVsX21hc2tbMV0gPSAwOwotCQkvKiBXZSBtaWdodCBoYXZlIGEgc2Vjb25kIGNhc2NhZGVkIGhlYXRocm93ICovCi0JCWxldmVsX21hc2tbMl0gPSBIRUFUSFJPV19MRVZFTF9NQVNLOwotCQlsZXZlbF9tYXNrWzNdID0gMDsKLQl9Ci0KLQkvKgotCSAqIEczIHBvd2VybWFjcyBhbmQgMTk5OSBHMyBQb3dlckJvb2tzIGhhdmUgNjQgaW50ZXJydXB0cywKLQkgKiAxOTk4IEczIFNlcmllcyBQb3dlckJvb2tzIGhhdmUgMTI4LAotCSAqIG90aGVyIHBvd2VybWFjcyBoYXZlIDMyLgotCSAqIFRoZSBjb21ibyBldGhlcm5ldC9tb2RlbSBjYXJkIGZvciB0aGUgUG93ZXJzdGFyIHBvd2VyYm9va3MKLQkgKiAoMjQwMC8zNDAwLzM1MDAsIG9oYXJlIGJhc2VkKSBoYXMgYSBzZWNvbmQgb2hhcmUgY2hpcAotCSAqIGVmZmVjdGl2ZWx5IG1ha2luZyBhIHRvdGFsIG9mIDY0LgotCSAqLwotCW1heF9pcnFzID0gbWF4X3JlYWxfaXJxcyA9IDMyOwotCWlycWN0cmxlciA9IGZpbmRfZGV2aWNlcygibWFjLWlvIik7Ci0JaWYgKGlycWN0cmxlcikKLQl7Ci0JCW1heF9yZWFsX2lycXMgPSA2NDsKLQkJaWYgKGlycWN0cmxlci0+bmV4dCkKLQkJCW1heF9pcnFzID0gMTI4OwotCQllbHNlCi0JCQltYXhfaXJxcyA9IDY0OwotCX0KLQlmb3IgKCBpID0gMDsgaSA8IG1heF9yZWFsX2lycXMgOyBpKysgKQotCQlpcnFfZGVzY1tpXS5oYW5kbGVyID0gJnBtYWNfcGljOwotCi0JLyogZ2V0IGFkZHJlc3NlcyBvZiBmaXJzdCBjb250cm9sbGVyICovCi0JaWYgKGlycWN0cmxlcikgewotCQlpZiAgKGlycWN0cmxlci0+bl9hZGRycyA+IDApIHsKLQkJCWFkZHIgPSAodW5zaWduZWQgbG9uZykKLQkJCQlpb3JlbWFwKGlycWN0cmxlci0+YWRkcnNbMF0uYWRkcmVzcywgMHg0MCk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgMjsgKytpKQotCQkJCXBtYWNfaXJxX2h3W2ldID0gKHZvbGF0aWxlIHN0cnVjdCBwbWFjX2lycV9odyopCi0JCQkJCShhZGRyICsgKDIgLSBpKSAqIDB4MTApOwotCQl9Ci0KLQkJLyogZ2V0IGFkZHJlc3NlcyBvZiBzZWNvbmQgY29udHJvbGxlciAqLwotCQlpcnFjdHJsZXIgPSBpcnFjdHJsZXItPm5leHQ7Ci0JCWlmIChpcnFjdHJsZXIgJiYgaXJxY3RybGVyLT5uX2FkZHJzID4gMCkgewotCQkJYWRkciA9ICh1bnNpZ25lZCBsb25nKQotCQkJCWlvcmVtYXAoaXJxY3RybGVyLT5hZGRyc1swXS5hZGRyZXNzLCAweDQwKTsKLQkJCWZvciAoaSA9IDI7IGkgPCA0OyArK2kpCi0JCQkJcG1hY19pcnFfaHdbaV0gPSAodm9sYXRpbGUgc3RydWN0IHBtYWNfaXJxX2h3KikKLQkJCQkJKGFkZHIgKyAoNCAtIGkpICogMHgxMCk7Ci0JCQlpcnFfY2FzY2FkZSA9IGlycWN0cmxlci0+aW50cnNbMF0ubGluZTsKLQkJCWlmIChkZXZpY2VfaXNfY29tcGF0aWJsZShpcnFjdHJsZXIsICJnYXR3aWNrIikpCi0JCQkJcG1hY19maXhfZ2F0d2lja19pbnRlcnJ1cHRzKGlycWN0cmxlciwgbWF4X3JlYWxfaXJxcyk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBvbGRlciBwb3dlcm1hY3MgaGF2ZSBhIEdDIChncmFuZCBjZW50cmFsKSBvciBvaGFyZSBhdAotCQkgICBmMzAwMDAwMCwgd2l0aCBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlcnMgYXQgZjMwMDAwMjAuICovCi0JCWFkZHIgPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcCgweGYzMDAwMDAwLCAweDQwKTsKLQkJcG1hY19pcnFfaHdbMF0gPSAodm9sYXRpbGUgc3RydWN0IHBtYWNfaXJxX2h3ICopIChhZGRyICsgMHgyMCk7Ci0JfQotCi0JLyogUG93ZXJCb29rcyAzNDAwIGFuZCAzNTAwIGNhbiBoYXZlIGEgc2Vjb25kIGNvbnRyb2xsZXIgaW4gYSBzZWNvbmQKLQkgICBvaGFyZSBjaGlwLCBvbiB0aGUgY29tYm8gZXRoZXJuZXQvbW9kZW0gY2FyZCAqLwotCWlmIChtYWNoaW5lX2lzX2NvbXBhdGlibGUoIkFBUEwsMzQwMC8yNDAwIikKLQkgICAgIHx8IG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiQUFQTCwzNTAwIikpCi0JCWlycV9jYXNjYWRlID0gZW5hYmxlX3NlY29uZF9vaGFyZSgpOwotCi0JLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyBpbiBhbGwgY29udHJvbGxlcnMgKi8KLQlmb3IgKGkgPSAwOyBpICogMzIgPCBtYXhfaXJxczsgKytpKQotCQlvdXRfbGUzMigmcG1hY19pcnFfaHdbaV0tPmVuYWJsZSwgMCk7Ci0JLyogbWFyayBsZXZlbCBpbnRlcnJ1cHRzICovCi0JZm9yIChpID0gMDsgaSA8IG1heF9pcnFzOyBpKyspCi0JCWlmIChsZXZlbF9tYXNrW2kgPj4gNV0gJiAoMVVMIDw8IChpICYgMHgxZikpKQotCQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0xFVkVMOwotCi0JLyogZ2V0IGludGVycnVwdCBsaW5lIG9mIHNlY29uZGFyeSBpbnRlcnJ1cHQgY29udHJvbGxlciAqLwotCWlmIChpcnFfY2FzY2FkZSA+PSAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImlycTogc2Vjb25kYXJ5IGNvbnRyb2xsZXIgb24gaXJxICVkXG4iLAotCQkJKGludClpcnFfY2FzY2FkZSk7Ci0JCWZvciAoIGkgPSBtYXhfcmVhbF9pcnFzIDsgaSA8IG1heF9pcnFzIDsgaSsrICkKLQkJCWlycV9kZXNjW2ldLmhhbmRsZXIgPSAmZ2F0d2lja19waWM7Ci0JCXNldHVwX2lycShpcnFfY2FzY2FkZSwgJmdhdHdpY2tfY2FzY2FkZV9hY3Rpb24pOwotCX0KLQlwcmludGsoIlN5c3RlbSBoYXMgJWQgcG9zc2libGUgaW50ZXJydXB0c1xuIiwgbWF4X2lycXMpOwotCWlmIChtYXhfaXJxcyAhPSBtYXhfcmVhbF9pcnFzKQotCQlwcmludGsoS0VSTl9ERUJVRyAiJWQgaW50ZXJydXB0cyBvbiBtYWluIGNvbnRyb2xsZXJcbiIsCi0JCQltYXhfcmVhbF9pcnFzKTsKLQotI2lmZGVmIENPTkZJR19YTU9OCi0Jc2V0dXBfaXJxKDIwLCAmeG1vbl9hY3Rpb24pOwotI2VuZGlmCS8qIENPTkZJR19YTU9OICovCi19Ci0KLSNpZmRlZiBDT05GSUdfUE0KLS8qCi0gKiBUaGVzZSBwcm9jZWR1cmVzIGFyZSB1c2VkIGluIGltcGxlbWVudGluZyBzbGVlcCBvbiB0aGUgcG93ZXJib29rcy4KLSAqIHNsZWVwX3NhdmVfaW50cnMoKSBzYXZlcyB0aGUgc3RhdGVzIG9mIGFsbCBpbnRlcnJ1cHQgZW5hYmxlcwotICogYW5kIGRpc2FibGVzIGFsbCBpbnRlcnJ1cHRzIGV4Y2VwdCBmb3IgdGhlIG5vbWluYXRlZCBvbmUuCi0gKiBzbGVlcF9yZXN0b3JlX2ludHJzKCkgcmVzdG9yZXMgdGhlIHN0YXRlcyBvZiBhbGwgaW50ZXJydXB0IGVuYWJsZXMuCi0gKi8KLXVuc2lnbmVkIGxvbmcgc2xlZXBfc2F2ZV9tYXNrWzJdOwotCi0vKiBUaGlzIHVzZWQgdG8gYmUgcGFzc2VkIGJ5IHRoZSBQTVUgZHJpdmVyIGJ1dCB0aGF0IGxpbmsgZ290Ci0gKiBicm9rZW4gd2l0aCB0aGUgbmV3IGRyaXZlciBtb2RlbC4gV2UgdXNlIHRoaXMgdHdlYWsgZm9yIG5vdy4uLgotICovCi1zdGF0aWMgaW50IHBtYWNwaWNfZmluZF92aWFpbnQodm9pZCkKLXsKLQlpbnQgdmlhaW50ID0gLTE7Ci0KLSNpZmRlZiBDT05GSUdfQURCX1BNVQotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0KLQlpZiAocG11X2dldF9tb2RlbCgpICE9IFBNVV9PSEFSRV9CQVNFRCkKLQkJZ290byBub3RfZm91bmQ7Ci0JbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAidmlhLXBtdSIpOwotCWlmIChucCA9PSBOVUxMKQotCQlnb3RvIG5vdF9mb3VuZDsKLQl2aWFpbnQgPSBucC0+aW50cnNbMF0ubGluZTsKLSNlbmRpZiAvKiBDT05GSUdfQURCX1BNVSAqLwotCi1ub3RfZm91bmQ6Ci0JcmV0dXJuIHZpYWludDsKLX0KLQotc3RhdGljIGludCBwbWFjcGljX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCWludCB2aWFpbnQgPSBwbWFjcGljX2ZpbmRfdmlhaW50KCk7Ci0KLQlzbGVlcF9zYXZlX21hc2tbMF0gPSBwcGNfY2FjaGVkX2lycV9tYXNrWzBdOwotCXNsZWVwX3NhdmVfbWFza1sxXSA9IHBwY19jYWNoZWRfaXJxX21hc2tbMV07Ci0JcHBjX2NhY2hlZF9pcnFfbWFza1swXSA9IDA7Ci0JcHBjX2NhY2hlZF9pcnFfbWFza1sxXSA9IDA7Ci0JaWYgKHZpYWludCA+IDApCi0JCXNldF9iaXQodmlhaW50LCBwcGNfY2FjaGVkX2lycV9tYXNrKTsKLQlvdXRfbGUzMigmcG1hY19pcnFfaHdbMF0tPmVuYWJsZSwgcHBjX2NhY2hlZF9pcnFfbWFza1swXSk7Ci0JaWYgKG1heF9yZWFsX2lycXMgPiAzMikKLQkJb3V0X2xlMzIoJnBtYWNfaXJxX2h3WzFdLT5lbmFibGUsIHBwY19jYWNoZWRfaXJxX21hc2tbMV0pOwotCSh2b2lkKWluX2xlMzIoJnBtYWNfaXJxX2h3WzBdLT5ldmVudCk7Ci0JLyogbWFrZSBzdXJlIG1hc2sgZ2V0cyB0byBjb250cm9sbGVyIGJlZm9yZSB3ZSByZXR1cm4gdG8gY2FsbGVyICovCi0JbWIoKTsKLSAgICAgICAgKHZvaWQpaW5fbGUzMigmcG1hY19pcnFfaHdbMF0tPmVuYWJsZSk7Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcG1hY3BpY19yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldikKLXsKLQlpbnQgaTsKLQotCW91dF9sZTMyKCZwbWFjX2lycV9od1swXS0+ZW5hYmxlLCAwKTsKLQlpZiAobWF4X3JlYWxfaXJxcyA+IDMyKQotCQlvdXRfbGUzMigmcG1hY19pcnFfaHdbMV0tPmVuYWJsZSwgMCk7Ci0JbWIoKTsKLQlmb3IgKGkgPSAwOyBpIDwgbWF4X3JlYWxfaXJxczsgKytpKQotCQlpZiAodGVzdF9iaXQoaSwgc2xlZXBfc2F2ZV9tYXNrKSkKLQkJCXBtYWNfdW5tYXNrX2lycShpKTsKLQotCXJldHVybiAwOwotfQotCi0jZW5kaWYgLyogQ09ORklHX1BNICovCi0KLXN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHBtYWNwaWNfc3lzY2xhc3MgPSB7Ci0Jc2V0X2tzZXRfbmFtZSgicG1hY19waWMiKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBkZXZpY2VfcG1hY3BpYyA9IHsKLQkuaWQJCT0gMCwKLQkuY2xzCQk9ICZwbWFjcGljX3N5c2NsYXNzLAotfTsKLQotc3RhdGljIHN0cnVjdCBzeXNkZXZfZHJpdmVyIGRyaXZlcl9wbWFjcGljID0gewotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kCT0gJnBtYWNwaWNfc3VzcGVuZCwKLQkucmVzdW1lCQk9ICZwbWFjcGljX3Jlc3VtZSwKLSNlbmRpZiAvKiBDT05GSUdfUE0gKi8KLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXRfcG1hY3BpY19zeXNmcyh2b2lkKQotewotCWlmIChtYXhfaXJxcyA9PSAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXByaW50ayhLRVJOX0RFQlVHICJSZWdpc3RlcmluZyBwbWFjIHBpYyB3aXRoIHN5c2ZzLi4uXG4iKTsKLQlzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJnBtYWNwaWNfc3lzY2xhc3MpOwotCXN5c2Rldl9yZWdpc3RlcigmZGV2aWNlX3BtYWNwaWMpOwotCXN5c2Rldl9kcml2ZXJfcmVnaXN0ZXIoJnBtYWNwaWNfc3lzY2xhc3MsICZkcml2ZXJfcG1hY3BpYyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN1YnN5c19pbml0Y2FsbChpbml0X3BtYWNwaWNfc3lzZnMpOwotCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19waWMuaCBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX3BpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjQxMDNkLi4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX3BpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotI2lmbmRlZiBfX1BQQ19QTEFURk9STVNfUE1BQ19QSUNfSAotI2RlZmluZSBfX1BQQ19QTEFURk9STVNfUE1BQ19QSUNfSAotCi0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0KLWV4dGVybiBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgcG1hY19waWM7Ci0KLXZvaWQgcG1hY19waWNfaW5pdCh2b2lkKTsKLWludCBwbWFjX2dldF9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotCi0jZW5kaWYgLyogX19QUENfUExBVEZPUk1TX1BNQUNfUElDX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX3NldHVwLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19zZXR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWQyYmVmLi4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX3NldHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NDUgKzAsMCBAQAotLyoKLSAqICBhcmNoL3BwYy9wbGF0Zm9ybXMvc2V0dXAuYwotICoKLSAqICBQb3dlclBDIHZlcnNpb24KLSAqICAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk2IEdhcnkgVGhvbWFzIChnZHRAbGludXhwcGMub3JnKQotICoKLSAqICBBZGFwdGVkIGZvciBQb3dlciBNYWNpbnRvc2ggYnkgUGF1bCBNYWNrZXJyYXMKLSAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcyAocGF1bHVzQGNzLmFudS5lZHUuYXUpCi0gKgotICogIERlcml2ZWQgZnJvbSAiYXJjaC9hbHBoYS9rZXJuZWwvc2V0dXAuYyIKLSAqICAgIENvcHlyaWdodCAoQykgMTk5NSBMaW51cyBUb3J2YWxkcwotICoKLSAqICBNYWludGFpbmVkIGJ5IEJlbmphbWluIEhlcnJlbnNjaG1pZHQgKGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZykKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotLyoKLSAqIGJvb3R1cCBzZXR1cCBzdHVmZi4uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNlci5oPgotI2luY2x1ZGUgPGxpbnV4L2Eub3V0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgotI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4KLSNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+Ci0jaW5jbHVkZSA8bGludXgvaWRlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvYWRiLmg+Ci0jaW5jbHVkZSA8bGludXgvY3VkYS5oPgotI2luY2x1ZGUgPGxpbnV4L3BtdS5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+Ci0KLSNpbmNsdWRlIDxhc20vcmVnLmg+Ci0jaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgotI2luY2x1ZGUgPGFzbS9vaGFyZS5oPgotI2luY2x1ZGUgPGFzbS9tZWRpYWJheS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9ib290eC5oPgotI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9idGV4dC5oPgotI2luY2x1ZGUgPGFzbS9wbWFjX2ZlYXR1cmUuaD4KLSNpbmNsdWRlIDxhc20vdGltZS5oPgotI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KLQotI2luY2x1ZGUgInBtYWNfcGljLmgiCi0jaW5jbHVkZSAibWVtX3BpZWNlcy5oIgotCi0jdW5kZWYgU0hPV19HQVRXSUNLX0lSUVMKLQotZXh0ZXJuIGxvbmcgcG1hY190aW1lX2luaXQodm9pZCk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBwbWFjX2dldF9ydGNfdGltZSh2b2lkKTsKLWV4dGVybiBpbnQgcG1hY19zZXRfcnRjX3RpbWUodW5zaWduZWQgbG9uZyBub3d0aW1lKTsKLWV4dGVybiB2b2lkIHBtYWNfcmVhZF9ydGNfdGltZSh2b2lkKTsKLWV4dGVybiB2b2lkIHBtYWNfY2FsaWJyYXRlX2RlY3Iodm9pZCk7Ci1leHRlcm4gdm9pZCBwbWFjX3BjaWJpb3NfZml4dXAodm9pZCk7Ci1leHRlcm4gdm9pZCBwbWFjX2ZpbmRfYnJpZGdlcyh2b2lkKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHBtYWNfaWRlX2dldF9iYXNlKGludCBpbmRleCk7Ci1leHRlcm4gdm9pZCBwbWFjX2lkZV9pbml0X2h3aWZfcG9ydHMoaHdfcmVnc190ICpodywKLQl1bnNpZ25lZCBsb25nIGRhdGFfcG9ydCwgdW5zaWduZWQgbG9uZyBjdHJsX3BvcnQsIGludCAqaXJxKTsKLQotZXh0ZXJuIHZvaWQgcG1hY19udnJhbV91cGRhdGUodm9pZCk7Ci1leHRlcm4gdW5zaWduZWQgY2hhciBwbWFjX252cmFtX3JlYWRfYnl0ZShpbnQgYWRkcik7Ci1leHRlcm4gdm9pZCBwbWFjX252cmFtX3dyaXRlX2J5dGUoaW50IGFkZHIsIHVuc2lnbmVkIGNoYXIgdmFsKTsKLWV4dGVybiBpbnQgcG1hY19wY2lfZW5hYmxlX2RldmljZV9ob29rKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBpbml0aWFsKTsKLWV4dGVybiB2b2lkIHBtYWNfcGNpYmlvc19hZnRlcl9pbml0KHZvaWQpOwotZXh0ZXJuIGludCBvZl9zaG93X3BlcmNwdWluZm8oc3RydWN0IHNlcV9maWxlICptLCBpbnQgaSk7Ci0KLXN0cnVjdCBkZXZpY2Vfbm9kZSAqbWVtb3J5X25vZGU7Ci0KLXVuc2lnbmVkIGNoYXIgZHJpdmVfaW5mbzsKLQotaW50IHBwY19vdmVycmlkZV9sMmNyID0gMDsKLWludCBwcGNfb3ZlcnJpZGVfbDJjcl92YWx1ZTsKLWludCBoYXNfbDJjYWNoZSA9IDA7Ci0KLXN0YXRpYyBpbnQgY3VycmVudF9yb290X2dvb2RuZXNzID0gLTE7Ci0KLWV4dGVybiBpbnQgcG1hY19uZXd3b3JsZDsKLQotI2RlZmluZSBERUZBVUxUX1JPT1RfREVWSUNFIFJvb3RfU0RBMQkvKiBzZGExIC0gc2xpZ2h0bHkgc2lsbHkgY2hvaWNlICovCi0KLWV4dGVybiB2b2lkIHpzX2tnZGJfaG9vayhpbnQgdHR5X251bSk7Ci1zdGF0aWMgdm9pZCBvaGFyZV9pbml0KHZvaWQpOwotI2lmZGVmIENPTkZJR19CT09UWF9URVhUCi1zdGF0aWMgdm9pZCBwbWFjX3Byb2dyZXNzKGNoYXIgKnMsIHVuc2lnbmVkIHNob3J0IGhleCk7Ci0jZW5kaWYKLQotc3lzX2N0cmxlcl90IHN5c19jdHJsZXIgPSBTWVNfQ1RSTEVSX1VOS05PV047Ci0KLSNpZmRlZiBDT05GSUdfU01QCi1leHRlcm4gc3RydWN0IHNtcF9vcHNfdCBwc3VyZ2Vfc21wX29wczsKLWV4dGVybiBzdHJ1Y3Qgc21wX29wc190IGNvcmU5OV9zbXBfb3BzOwotI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KLQotc3RhdGljIGludAotcG1hY19zaG93X2NwdWluZm8oc3RydWN0IHNlcV9maWxlICptKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0JY2hhciAqcHA7Ci0JaW50IHBsZW47Ci0JaW50IG1ibW9kZWwgPSBwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9HRVRfTUJfSU5GTywKLQkJTlVMTCwgUE1BQ19NQl9JTkZPX01PREVMLCAwKTsKLQl1bnNpZ25lZCBpbnQgbWJmbGFncyA9ICh1bnNpZ25lZCBpbnQpcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfR0VUX01CX0lORk8sCi0JCU5VTEwsIFBNQUNfTUJfSU5GT19GTEFHUywgMCk7Ci0JY2hhciogbWJuYW1lOwotCi0JaWYgKHBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX0dFVF9NQl9JTkZPLCBOVUxMLCBQTUFDX01CX0lORk9fTkFNRSwgKGludCkmbWJuYW1lKSAhPSAwKQotCQltYm5hbWUgPSAiVW5rbm93biI7Ci0KLQkvKiBmaW5kIG1vdGhlcmJvYXJkIHR5cGUgKi8KLQlzZXFfcHJpbnRmKG0sICJtYWNoaW5lXHRcdDogIik7Ci0JbnAgPSBmaW5kX2RldmljZXMoImRldmljZS10cmVlIik7Ci0JaWYgKG5wICE9IE5VTEwpIHsKLQkJcHAgPSAoY2hhciAqKSBnZXRfcHJvcGVydHkobnAsICJtb2RlbCIsIE5VTEwpOwotCQlpZiAocHAgIT0gTlVMTCkKLQkJCXNlcV9wcmludGYobSwgIiVzXG4iLCBwcCk7Ci0JCWVsc2UKLQkJCXNlcV9wcmludGYobSwgIlBvd2VyTWFjXG4iKTsKLQkJcHAgPSAoY2hhciAqKSBnZXRfcHJvcGVydHkobnAsICJjb21wYXRpYmxlIiwgJnBsZW4pOwotCQlpZiAocHAgIT0gTlVMTCkgewotCQkJc2VxX3ByaW50ZihtLCAibW90aGVyYm9hcmRcdDoiKTsKLQkJCXdoaWxlIChwbGVuID4gMCkgewotCQkJCWludCBsID0gc3RybGVuKHBwKSArIDE7Ci0JCQkJc2VxX3ByaW50ZihtLCAiICVzIiwgcHApOwotCQkJCXBsZW4gLT0gbDsKLQkJCQlwcCArPSBsOwotCQkJfQotCQkJc2VxX3ByaW50ZihtLCAiXG4iKTsKLQkJfQotCX0gZWxzZQotCQlzZXFfcHJpbnRmKG0sICJQb3dlck1hY1xuIik7Ci0KLQkvKiBwcmludCBwYXJzZWQgbW9kZWwgKi8KLQlzZXFfcHJpbnRmKG0sICJkZXRlY3RlZCBhc1x0OiAlZCAoJXMpXG4iLCBtYm1vZGVsLCBtYm5hbWUpOwotCXNlcV9wcmludGYobSwgInBtYWMgZmxhZ3NcdDogJTA4eFxuIiwgbWJmbGFncyk7Ci0KLQkvKiBmaW5kIGwyIGNhY2hlIGluZm8gKi8KLQlucCA9IGZpbmRfZGV2aWNlcygibDItY2FjaGUiKTsKLQlpZiAobnAgPT0gMCkKLQkJbnAgPSBmaW5kX3R5cGVfZGV2aWNlcygiY2FjaGUiKTsKLQlpZiAobnAgIT0gMCkgewotCQl1bnNpZ25lZCBpbnQgKmljID0gKHVuc2lnbmVkIGludCAqKQotCQkJZ2V0X3Byb3BlcnR5KG5wLCAiaS1jYWNoZS1zaXplIiwgTlVMTCk7Ci0JCXVuc2lnbmVkIGludCAqZGMgPSAodW5zaWduZWQgaW50ICopCi0JCQlnZXRfcHJvcGVydHkobnAsICJkLWNhY2hlLXNpemUiLCBOVUxMKTsKLQkJc2VxX3ByaW50ZihtLCAiTDIgY2FjaGVcdDoiKTsKLQkJaGFzX2wyY2FjaGUgPSAxOwotCQlpZiAoZ2V0X3Byb3BlcnR5KG5wLCAiY2FjaGUtdW5pZmllZCIsIE5VTEwpICE9IDAgJiYgZGMpIHsKLQkJCXNlcV9wcmludGYobSwgIiAlZEsgdW5pZmllZCIsICpkYyAvIDEwMjQpOwotCQl9IGVsc2UgewotCQkJaWYgKGljKQotCQkJCXNlcV9wcmludGYobSwgIiAlZEsgaW5zdHJ1Y3Rpb24iLCAqaWMgLyAxMDI0KTsKLQkJCWlmIChkYykKLQkJCQlzZXFfcHJpbnRmKG0sICIlcyAlZEsgZGF0YSIsCi0JCQkJCSAgIChpYz8gIiArIjogIiIpLCAqZGMgLyAxMDI0KTsKLQkJfQotCQlwcCA9IGdldF9wcm9wZXJ0eShucCwgInJhbS10eXBlIiwgTlVMTCk7Ci0JCWlmIChwcCkKLQkJCXNlcV9wcmludGYobSwgIiAlcyIsIHBwKTsKLQkJc2VxX3ByaW50ZihtLCAiXG4iKTsKLQl9Ci0KLQkvKiBmaW5kIHJhbSBpbmZvICovCi0JbnAgPSBmaW5kX2RldmljZXMoIm1lbW9yeSIpOwotCWlmIChucCAhPSAwKSB7Ci0JCWludCBuOwotCQlzdHJ1Y3QgcmVnX3Byb3BlcnR5ICpyZWcgPSAoc3RydWN0IHJlZ19wcm9wZXJ0eSAqKQotCQkJZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgJm4pOwotCi0JCWlmIChyZWcgIT0gMCkgewotCQkJdW5zaWduZWQgbG9uZyB0b3RhbCA9IDA7Ci0KLQkJCWZvciAobiAvPSBzaXplb2Yoc3RydWN0IHJlZ19wcm9wZXJ0eSk7IG4gPiAwOyAtLW4pCi0JCQkJdG90YWwgKz0gKHJlZysrKS0+c2l6ZTsKLQkJCXNlcV9wcmludGYobSwgIm1lbW9yeVx0XHQ6ICVsdU1CXG4iLCB0b3RhbCA+PiAyMCk7Ci0JCX0KLQl9Ci0KLQkvKiBDaGVja3MgImwyY3ItdmFsdWUiIHByb3BlcnR5IGluIHRoZSByZWdpc3RyeSAqLwotCW5wID0gZmluZF9kZXZpY2VzKCJjcHVzIik7Ci0JaWYgKG5wID09IDApCi0JCW5wID0gZmluZF90eXBlX2RldmljZXMoImNwdSIpOwotCWlmIChucCAhPSAwKSB7Ci0JCXVuc2lnbmVkIGludCAqbDJjciA9ICh1bnNpZ25lZCBpbnQgKikKLQkJCWdldF9wcm9wZXJ0eShucCwgImwyY3ItdmFsdWUiLCBOVUxMKTsKLQkJaWYgKGwyY3IgIT0gMCkgewotCQkJc2VxX3ByaW50ZihtLCAibDJjciBvdmVycmlkZVx0OiAweCV4XG4iLCAqbDJjcik7Ci0JCX0KLQl9Ci0KLQkvKiBJbmRpY2F0ZSBuZXd3b3JsZC9vbGR3b3JsZCAqLwotCXNlcV9wcmludGYobSwgInBtYWMtZ2VuZXJhdGlvblx0OiAlc1xuIiwKLQkJICAgcG1hY19uZXd3b3JsZCA/ICJOZXdXb3JsZCIgOiAiT2xkV29ybGQiKTsKLQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXBtYWNfc2hvd19wZXJjcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgaW50IGkpCi17Ci0jaWZkZWYgQ09ORklHX0NQVV9GUkVRX1BNQUMKLQlleHRlcm4gdW5zaWduZWQgaW50IHBtYWNfZ2V0X29uZV9jcHVmcmVxKGludCBpKTsKLQl1bnNpZ25lZCBpbnQgZnJlcSA9IHBtYWNfZ2V0X29uZV9jcHVmcmVxKGkpOwotCWlmIChmcmVxICE9IDApIHsKLQkJc2VxX3ByaW50ZihtLCAiY2xvY2tcdFx0OiAlZE1IelxuIiwgZnJlcS8xMDAwKTsKLQkJcmV0dXJuIDA7Ci0JfQotI2VuZGlmIC8qIENPTkZJR19DUFVfRlJFUV9QTUFDICovCi0JcmV0dXJuIG9mX3Nob3dfcGVyY3B1aW5mbyhtLCBpKTsKLX0KLQotc3RhdGljIHZvbGF0aWxlIHUzMiAqc3lzY3RybF9yZWdzOwotCi12b2lkIF9faW5pdAotcG1hY19zZXR1cF9hcmNoKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpjcHU7Ci0JaW50ICpmcDsKLQl1bnNpZ25lZCBsb25nIHB2cjsKLQotCXB2ciA9IFBWUl9WRVIobWZzcHIoU1BSTl9QVlIpKTsKLQotCS8qIFNldCBsb29wc19wZXJfamlmZnkgdG8gYSBoYWxmLXdheSByZWFzb25hYmxlIHZhbHVlLAotCSAgIGZvciB1c2UgdW50aWwgY2FsaWJyYXRlX2RlbGF5IGdldHMgY2FsbGVkLiAqLwotCWNwdSA9IGZpbmRfdHlwZV9kZXZpY2VzKCJjcHUiKTsKLQlpZiAoY3B1ICE9IDApIHsKLQkJZnAgPSAoaW50ICopIGdldF9wcm9wZXJ0eShjcHUsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKLQkJaWYgKGZwICE9IDApIHsKLQkJCWlmIChwdnIgPT0gNCB8fCBwdnIgPj0gOCkKLQkJCQkvKiA2MDQsIEczLCBHNCBldGMuICovCi0JCQkJbG9vcHNfcGVyX2ppZmZ5ID0gKmZwIC8gSFo7Ci0JCQllbHNlCi0JCQkJLyogNjAxLCA2MDMsIGV0Yy4gKi8KLQkJCQlsb29wc19wZXJfamlmZnkgPSAqZnAgLyAoMipIWik7Ci0JCX0gZWxzZQotCQkJbG9vcHNfcGVyX2ppZmZ5ID0gNTAwMDAwMDAgLyBIWjsKLQl9Ci0KLQkvKiB0aGlzIGFyZWEgaGFzIHRoZSBDUFUgaWRlbnRpZmljYXRpb24gcmVnaXN0ZXIKLQkgICBhbmQgc29tZSByZWdpc3RlcnMgdXNlZCBieSBzbXAgYm9hcmRzICovCi0Jc3lzY3RybF9yZWdzID0gKHZvbGF0aWxlIHUzMiAqKSBpb3JlbWFwKDB4ZjgwMDAwMDAsIDB4MTAwMCk7Ci0Jb2hhcmVfaW5pdCgpOwotCi0JLyogTG9va3VwIFBDSSBob3N0cyAqLwotCXBtYWNfZmluZF9icmlkZ2VzKCk7Ci0KLQkvKiBDaGVja3MgImwyY3ItdmFsdWUiIHByb3BlcnR5IGluIHRoZSByZWdpc3RyeSAqLwotCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9MMkNSKSkgewotCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZmluZF9kZXZpY2VzKCJjcHVzIik7Ci0JCWlmIChucCA9PSAwKQotCQkJbnAgPSBmaW5kX3R5cGVfZGV2aWNlcygiY3B1Iik7Ci0JCWlmIChucCAhPSAwKSB7Ci0JCQl1bnNpZ25lZCBpbnQgKmwyY3IgPSAodW5zaWduZWQgaW50ICopCi0JCQkJZ2V0X3Byb3BlcnR5KG5wLCAibDJjci12YWx1ZSIsIE5VTEwpOwotCQkJaWYgKGwyY3IgIT0gMCkgewotCQkJCXBwY19vdmVycmlkZV9sMmNyID0gMTsKLQkJCQlwcGNfb3ZlcnJpZGVfbDJjcl92YWx1ZSA9ICpsMmNyOwotCQkJCV9zZXRfTDJDUigwKTsKLQkJCQlfc2V0X0wyQ1IocHBjX292ZXJyaWRlX2wyY3JfdmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKHBwY19vdmVycmlkZV9sMmNyKQotCQlwcmludGsoS0VSTl9JTkZPICJMMkNSIG92ZXJyaWRlbiAoMHgleCksIGJhY2tzaWRlIGNhY2hlIGlzICVzXG4iLAotCQkJcHBjX292ZXJyaWRlX2wyY3JfdmFsdWUsIChwcGNfb3ZlcnJpZGVfbDJjcl92YWx1ZSAmIDB4ODAwMDAwMDApCi0JCQkJPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKLQotI2lmZGVmIENPTkZJR19LR0RCCi0JenNfa2dkYl9ob29rKDApOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQURCX0NVREEKLQlmaW5kX3ZpYV9jdWRhKCk7Ci0jZWxzZQotCWlmIChmaW5kX2RldmljZXMoInZpYS1jdWRhIikpIHsKLQkJcHJpbnRrKCJXQVJOSU5HICEgWW91ciBtYWNoaW5lIGlzIEN1ZGEgYmFzZWQgYnV0IHlvdXIga2VybmVsXG4iKTsKLQkJcHJpbnRrKCIgICAgICAgICAgd2Fzbid0IGNvbXBpbGVkIHdpdGggQ09ORklHX0FEQl9DVURBIG9wdGlvbiAhXG4iKTsKLQl9Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQURCX1BNVQotCWZpbmRfdmlhX3BtdSgpOwotI2Vsc2UKLQlpZiAoZmluZF9kZXZpY2VzKCJ2aWEtcG11IikpIHsKLQkJcHJpbnRrKCJXQVJOSU5HICEgWW91ciBtYWNoaW5lIGlzIFBNVSBiYXNlZCBidXQgeW91ciBrZXJuZWxcbiIpOwotCQlwcmludGsoIiAgICAgICAgICB3YXNuJ3QgY29tcGlsZWQgd2l0aCBDT05GSUdfQURCX1BNVSBvcHRpb24gIVxuIik7Ci0JfQotI2VuZGlmCi0jaWZkZWYgQ09ORklHX05WUkFNCi0JcG1hY19udnJhbV9pbml0KCk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKLQlpZiAoaW5pdHJkX3N0YXJ0KQotCQlST09UX0RFViA9IFJvb3RfUkFNMDsKLQllbHNlCi0jZW5kaWYKLQkJUk9PVF9ERVYgPSBERUZBVUxUX1JPT1RfREVWSUNFOwotCi0jaWZkZWYgQ09ORklHX1NNUAotCS8qIENoZWNrIGZvciBDb3JlOTkgKi8KLQlpZiAoZmluZF9kZXZpY2VzKCJ1bmktbiIpIHx8IGZpbmRfZGV2aWNlcygidTMiKSkKLQkJc21wX29wcyA9ICZjb3JlOTlfc21wX29wczsKLQllbHNlCi0JCXNtcF9vcHMgPSAmcHN1cmdlX3NtcF9vcHM7Ci0jZW5kaWYgLyogQ09ORklHX1NNUCAqLwotCi0JcGNpX2NyZWF0ZV9PRl9idXNfbWFwKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBvaGFyZV9pbml0KHZvaWQpCi17Ci0JLyoKLQkgKiBUdXJuIG9uIHRoZSBMMiBjYWNoZS4KLQkgKiBXZSBhc3N1bWUgdGhhdCB3ZSBoYXZlIGEgUFNYIG1lbW9yeSBjb250cm9sbGVyIGlmZgotCSAqIHdlIGhhdmUgYW4gb2hhcmUgSS9PIGNvbnRyb2xsZXIuCi0JICovCi0JaWYgKGZpbmRfZGV2aWNlcygib2hhcmUiKSAhPSBOVUxMKSB7Ci0JCWlmICgoKHN5c2N0cmxfcmVnc1syXSA+PiAyNCkgJiAweGYpID49IDMpIHsKLQkJCWlmIChzeXNjdHJsX3JlZ3NbNF0gJiAweDEwKQotCQkJCXN5c2N0cmxfcmVnc1s0XSB8PSAweDA0MDAwMDIwOwotCQkJZWxzZQotCQkJCXN5c2N0cmxfcmVnc1s0XSB8PSAweDA0MDAwMDAwOwotCQkJaWYoaGFzX2wyY2FjaGUpCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiTGV2ZWwgMiBjYWNoZSBlbmFibGVkXG4iKTsKLQkJfQotCX0KLX0KLQotZXh0ZXJuIGNoYXIgKmJvb3RwYXRoOwotZXh0ZXJuIGNoYXIgKmJvb3RkZXZpY2U7Ci12b2lkICpib290X2hvc3Q7Ci1pbnQgYm9vdF90YXJnZXQ7Ci1pbnQgYm9vdF9wYXJ0OwotZXh0ZXJuIGRldl90IGJvb3RfZGV2OwotCi0jaWZkZWYgQ09ORklHX1NDU0kKLXZvaWQgX19pbml0Ci1ub3RlX3Njc2lfaG9zdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHZvaWQgKmhvc3QpCi17Ci0JaW50IGw7Ci0JY2hhciAqcDsKLQotCWwgPSBzdHJsZW4obm9kZS0+ZnVsbF9uYW1lKTsKLQlpZiAoYm9vdHBhdGggIT0gTlVMTCAmJiBib290ZGV2aWNlICE9IE5VTEwKLQkgICAgJiYgc3RybmNtcChub2RlLT5mdWxsX25hbWUsIGJvb3RkZXZpY2UsIGwpID09IDAKLQkgICAgJiYgKGJvb3RkZXZpY2VbbF0gPT0gJy8nIHx8IGJvb3RkZXZpY2VbbF0gPT0gMCkpIHsKLQkJYm9vdF9ob3N0ID0gaG9zdDsKLQkJLyoKLQkJICogVGhlcmUncyBhIGJ1ZyBpbiBPRiAxLjAuNS4gIChXaHkgYW0gSSBub3Qgc3VycHJpc2VkLikKLQkJICogSWYgeW91IHBhc3MgYSBwYXRoIGxpa2Ugc2NzaS9zZEAxOjAgdG8gY2Fub24sIGl0IHJldHVybnMKLQkJICogc29tZXRoaW5nIGxpa2UgL2JhbmRpdEBGMjAwMDAwMC9nY0AxMC81M2M5NEAxMDAwMC9zZEAwLDAKLQkJICogVGhhdCBpcywgdGhlIHNjc2kgdGFyZ2V0IG51bWJlciBkb2Vzbid0IGdldCBwcmVzZXJ2ZWQuCi0JCSAqIFNvIHdlIHBpY2sgdGhlIHRhcmdldCBudW1iZXIgb3V0IG9mIGJvb3RwYXRoIGFuZCB1c2UgdGhhdC4KLQkJICovCi0JCXAgPSBzdHJzdHIoYm9vdHBhdGgsICIvc2RAIik7Ci0JCWlmIChwICE9IE5VTEwpIHsKLQkJCXAgKz0gNDsKLQkJCWJvb3RfdGFyZ2V0ID0gc2ltcGxlX3N0cnRvdWwocCwgTlVMTCwgMTApOwotCQkJcCA9IHN0cmNocihwLCAnOicpOwotCQkJaWYgKHAgIT0gTlVMTCkKLQkJCQlib290X3BhcnQgPSBzaW1wbGVfc3RydG91bChwICsgMSwgTlVMTCwgMTApOwotCQl9Ci0JfQotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX0lERSkgJiYgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9JREVfUE1BQykKLXN0YXRpYyBkZXZfdCBfX2luaXQKLWZpbmRfaWRlX2Jvb3Qodm9pZCkKLXsKLQljaGFyICpwOwotCWludCBuOwotCWRldl90IF9faW5pdCBwbWFjX2ZpbmRfaWRlX2Jvb3QoY2hhciAqYm9vdGRldmljZSwgaW50IG4pOwotCi0JaWYgKGJvb3RkZXZpY2UgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JcCA9IHN0cnJjaHIoYm9vdGRldmljZSwgJy8nKTsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQluID0gcCAtIGJvb3RkZXZpY2U7Ci0KLQlyZXR1cm4gcG1hY19maW5kX2lkZV9ib290KGJvb3RkZXZpY2UsIG4pOwotfQotI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lERSAmJiBDT05GSUdfQkxLX0RFVl9JREVfUE1BQyAqLwotCi1zdGF0aWMgdm9pZCBfX2luaXQKLWZpbmRfYm9vdF9kZXZpY2Uodm9pZCkKLXsKLSNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX0lERSkgJiYgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9JREVfUE1BQykKLQlib290X2RldiA9IGZpbmRfaWRlX2Jvb3QoKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW50IGluaXRpYWxpemluZyA9IDE7Ci0vKiBUT0RPOiBNZXJnZSB0aGUgc3VzcGVuZC10by1yYW0gd2l0aCB0aGUgY29tbW9uIGNvZGUgISEhCi0gKiBjdXJyZW50bHksIHRoaXMgaXMgYSBzdHViIGltcGxlbWVudGF0aW9uIGZvciBzdXNwZW5kLXRvLWRpc2sKLSAqIG9ubHkKLSAqLwotCi0jaWZkZWYgQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQKLQotc3RhdGljIGludCBwbWFjX3BtX3ByZXBhcmUoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQotewotCXByaW50ayhLRVJOX0RFQlVHICIlcyglZClcbiIsIF9fRlVOQ1RJT05fXywgc3RhdGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcG1hY19wbV9lbnRlcihzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCi17Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzKCVkKVxuIiwgX19GVU5DVElPTl9fLCBzdGF0ZSk7Ci0KLQkvKiBHaXZldXAgdGhlIGxhenkgRlBVICYgdmVjIHNvIHdlIGRvbid0IGhhdmUgdG8gYmFjayB0aGVtCi0JICogdXAgZnJvbSB0aGUgbG93IGxldmVsIGNvZGUKLQkgKi8KLQllbmFibGVfa2VybmVsX2ZwKCk7Ci0KLSNpZmRlZiBDT05GSUdfQUxUSVZFQwotCWlmIChjdXJfY3B1X3NwZWMtPmNwdV9mZWF0dXJlcyAmIENQVV9GVFJfQUxUSVZFQykKLQkJZW5hYmxlX2tlcm5lbF9hbHRpdmVjKCk7Ci0jZW5kaWYgLyogQ09ORklHX0FMVElWRUMgKi8KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHBtYWNfcG1fZmluaXNoKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKLXsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXMoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXRlKTsKLQotCS8qIFJlc3RvcmUgdXNlcmxhbmQgTU1VIGNvbnRleHQgKi8KLQlzZXRfY29udGV4dChjdXJyZW50LT5hY3RpdmVfbW0tPmNvbnRleHQsIGN1cnJlbnQtPmFjdGl2ZV9tbS0+cGdkKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBtX29wcyBwbWFjX3BtX29wcyA9IHsKLQkucG1fZGlza19tb2RlCT0gUE1fRElTS19TSFVURE9XTiwKLQkucHJlcGFyZQk9IHBtYWNfcG1fcHJlcGFyZSwKLQkuZW50ZXIJCT0gcG1hY19wbV9lbnRlciwKLQkuZmluaXNoCQk9IHBtYWNfcG1fZmluaXNoLAotfTsKLQotI2VuZGlmIC8qIENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EICovCi0KLXN0YXRpYyBpbnQgcG1hY19sYXRlX2luaXQodm9pZCkKLXsKLQlpbml0aWFsaXppbmcgPSAwOwotI2lmZGVmIENPTkZJR19TT0ZUV0FSRV9TVVNQRU5ECi0JcG1fc2V0X29wcygmcG1hY19wbV9vcHMpOwotI2VuZGlmIC8qIENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EICovCi0JcmV0dXJuIDA7Ci19Ci0KLWxhdGVfaW5pdGNhbGwocG1hY19sYXRlX2luaXQpOwotCi0vKiBjYW4ndCBiZSBfX2luaXQgLSBjYW4gYmUgY2FsbGVkIHdoZW5ldmVyIGEgZGlzayBpcyBmaXJzdCBhY2Nlc3NlZCAqLwotdm9pZAotbm90ZV9ib290YWJsZV9wYXJ0KGRldl90IGRldiwgaW50IHBhcnQsIGludCBnb29kbmVzcykKLXsKLQlzdGF0aWMgaW50IGZvdW5kX2Jvb3QgPSAwOwotCWNoYXIgKnA7Ci0KLQlpZiAoIWluaXRpYWxpemluZykKLQkJcmV0dXJuOwotCWlmICgoZ29vZG5lc3MgPD0gY3VycmVudF9yb290X2dvb2RuZXNzKSAmJgotCSAgICBST09UX0RFViAhPSBERUZBVUxUX1JPT1RfREVWSUNFKQotCQlyZXR1cm47Ci0JcCA9IHN0cnN0cihzYXZlZF9jb21tYW5kX2xpbmUsICJyb290PSIpOwotCWlmIChwICE9IE5VTEwgJiYgKHAgPT0gc2F2ZWRfY29tbWFuZF9saW5lIHx8IHBbLTFdID09ICcgJykpCi0JCXJldHVybjsKLQotCWlmICghZm91bmRfYm9vdCkgewotCQlmaW5kX2Jvb3RfZGV2aWNlKCk7Ci0JCWZvdW5kX2Jvb3QgPSAxOwotCX0KLQlpZiAoIWJvb3RfZGV2IHx8IGRldiA9PSBib290X2RldikgewotCQlST09UX0RFViA9IGRldiArIHBhcnQ7Ci0JCWJvb3RfZGV2ID0gMDsKLQkJY3VycmVudF9yb290X2dvb2RuZXNzID0gZ29vZG5lc3M7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotcG1hY19yZXN0YXJ0KGNoYXIgKmNtZCkKLXsKLSNpZmRlZiBDT05GSUdfQURCX0NVREEKLQlzdHJ1Y3QgYWRiX3JlcXVlc3QgcmVxOwotI2VuZGlmIC8qIENPTkZJR19BREJfQ1VEQSAqLwotCi0Jc3dpdGNoIChzeXNfY3RybGVyKSB7Ci0jaWZkZWYgQ09ORklHX0FEQl9DVURBCi0JY2FzZSBTWVNfQ1RSTEVSX0NVREE6Ci0JCWN1ZGFfcmVxdWVzdCgmcmVxLCBOVUxMLCAyLCBDVURBX1BBQ0tFVCwKLQkJCSAgICAgQ1VEQV9SRVNFVF9TWVNURU0pOwotCQlmb3IgKDs7KQotCQkJY3VkYV9wb2xsKCk7Ci0JCWJyZWFrOwotI2VuZGlmIC8qIENPTkZJR19BREJfQ1VEQSAqLwotI2lmZGVmIENPTkZJR19BREJfUE1VCi0JY2FzZSBTWVNfQ1RSTEVSX1BNVToKLQkJcG11X3Jlc3RhcnQoKTsKLQkJYnJlYWs7Ci0jZW5kaWYgLyogQ09ORklHX0FEQl9QTVUgKi8KLQlkZWZhdWx0OiA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotcG1hY19wb3dlcl9vZmYodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfQURCX0NVREEKLQlzdHJ1Y3QgYWRiX3JlcXVlc3QgcmVxOwotI2VuZGlmIC8qIENPTkZJR19BREJfQ1VEQSAqLwotCi0Jc3dpdGNoIChzeXNfY3RybGVyKSB7Ci0jaWZkZWYgQ09ORklHX0FEQl9DVURBCi0JY2FzZSBTWVNfQ1RSTEVSX0NVREE6Ci0JCWN1ZGFfcmVxdWVzdCgmcmVxLCBOVUxMLCAyLCBDVURBX1BBQ0tFVCwKLQkJCSAgICAgQ1VEQV9QT1dFUkRPV04pOwotCQlmb3IgKDs7KQotCQkJY3VkYV9wb2xsKCk7Ci0JCWJyZWFrOwotI2VuZGlmIC8qIENPTkZJR19BREJfQ1VEQSAqLwotI2lmZGVmIENPTkZJR19BREJfUE1VCi0JY2FzZSBTWVNfQ1RSTEVSX1BNVToKLQkJcG11X3NodXRkb3duKCk7Ci0JCWJyZWFrOwotI2VuZGlmIC8qIENPTkZJR19BREJfUE1VICovCi0JZGVmYXVsdDogOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLXBtYWNfaGFsdCh2b2lkKQotewotICAgcG1hY19wb3dlcl9vZmYoKTsKLX0KLQotLyoKLSAqIFJlYWQgaW4gYSBwcm9wZXJ0eSBkZXNjcmliaW5nIHNvbWUgcGllY2VzIG9mIG1lbW9yeS4KLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdAotZ2V0X21lbV9wcm9wKGNoYXIgKm5hbWUsIHN0cnVjdCBtZW1fcGllY2VzICptcCkKLXsKLQlzdHJ1Y3QgcmVnX3Byb3BlcnR5ICpycDsKLQlpbnQgaSwgczsKLQl1bnNpZ25lZCBpbnQgKmlwOwotCWludCBuYWMgPSBwcm9tX25fYWRkcl9jZWxscyhtZW1vcnlfbm9kZSk7Ci0JaW50IG5zYyA9IHByb21fbl9zaXplX2NlbGxzKG1lbW9yeV9ub2RlKTsKLQotCWlwID0gKHVuc2lnbmVkIGludCAqKSBnZXRfcHJvcGVydHkobWVtb3J5X25vZGUsIG5hbWUsICZzKTsKLQlpZiAoaXAgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImVycm9yOiBjb3VsZG4ndCBnZXQgJXMgcHJvcGVydHkgb24gL21lbW9yeVxuIiwKLQkJICAgICAgIG5hbWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcyAvPSAobnNjICsgbmFjKSAqIDQ7Ci0JcnAgPSBtcC0+cmVnaW9uczsKLQlmb3IgKGkgPSAwOyBpIDwgczsgKytpLCBpcCArPSBuYWMrbnNjKSB7Ci0JCWlmIChuYWMgPj0gMiAmJiBpcFtuYWMtMl0gIT0gMCkKLQkJCWNvbnRpbnVlOwotCQlycC0+YWRkcmVzcyA9IGlwW25hYy0xXTsKLQkJaWYgKG5zYyA+PSAyICYmIGlwW25hYytuc2MtMl0gIT0gMCkKLQkJCXJwLT5zaXplID0gfjBVOwotCQllbHNlCi0JCQlycC0+c2l6ZSA9IGlwW25hYytuc2MtMV07Ci0JCSsrcnA7Ci0JfQotCW1wLT5uX3JlZ2lvbnMgPSBycCAtIG1wLT5yZWdpb25zOwotCi0JLyogTWFrZSBzdXJlIHRoZSBwaWVjZXMgYXJlIHNvcnRlZC4gKi8KLQltZW1fcGllY2VzX3NvcnQobXApOwotCW1lbV9waWVjZXNfY29hbGVzY2UobXApOwotCXJldHVybiAxOwotfQotCi0vKgotICogT24gc3lzdGVtcyB3aXRoIE9wZW4gRmlybXdhcmUsIGNvbGxlY3QgaW5mb3JtYXRpb24gYWJvdXQKLSAqIHBoeXNpY2FsIFJBTSBhbmQgd2hpY2ggcGllY2VzIGFyZSBhbHJlYWR5IGluIHVzZS4KLSAqIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgKGF0IGxlYXN0KSB0aGUgZmlyc3QgOE1CIG1hcHBlZCB3aXRoIGEgQkFULgotICogT3VyIHRleHQsIGRhdGEsIGJzcyB1c2Ugc29tZXRoaW5nIG92ZXIgMU1CLCBzdGFydGluZyBhdCAwLgotICogT3BlbiBGaXJtd2FyZSBtYXkgYmUgdXNpbmcgMU1CIGF0IHRoZSA0TUIgcG9pbnQuCi0gKi8KLXVuc2lnbmVkIGxvbmcgX19pbml0Ci1wbWFjX2ZpbmRfZW5kX29mX21lbW9yeSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgYSwgdG90YWw7Ci0Jc3RydWN0IG1lbV9waWVjZXMgcGh5c19tZW07Ci0KLQkvKgotCSAqIEZpbmQgb3V0IHdoZXJlIHBoeXNpY2FsIG1lbW9yeSBpcywgYW5kIGNoZWNrIHRoYXQgaXQKLQkgKiBzdGFydHMgYXQgMCBhbmQgaXMgY29udGlndW91cy4gIEl0IHNlZW1zIHRoYXQgUkFNIGlzCi0JICogYWx3YXlzIHBoeXNpY2FsbHkgY29udGlndW91cyBvbiBQb3dlciBNYWNpbnRvc2hlcy4KLQkgKgotCSAqIFN1cHBvcnRpbmcgZGlzY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkgaXNuJ3QgaGFyZCwKLQkgKiBpdCBqdXN0IG1ha2VzIHRoZSB2aXJ0dWFsIDwtPiBwaHlzaWNhbCBtYXBwaW5nIGZ1bmN0aW9ucwotCSAqIG1vcmUgY29tcGxpY2F0ZWQgKG9yIGVsc2UgeW91IGVuZCB1cCB3YXN0aW5nIHNwYWNlCi0JICogaW4gbWVtX21hcCkuCi0JICovCi0JbWVtb3J5X25vZGUgPSBmaW5kX2RldmljZXMoIm1lbW9yeSIpOwotCWlmIChtZW1vcnlfbm9kZSA9PSBOVUxMIHx8ICFnZXRfbWVtX3Byb3AoInJlZyIsICZwaHlzX21lbSkKLQkgICAgfHwgcGh5c19tZW0ubl9yZWdpb25zID09IDApCi0JCXBhbmljKCJObyBSQU0/PyIpOwotCWEgPSBwaHlzX21lbS5yZWdpb25zWzBdLmFkZHJlc3M7Ci0JaWYgKGEgIT0gMCkKLQkJcGFuaWMoIlJBTSBkb2Vzbid0IHN0YXJ0IGF0IHBoeXNpY2FsIGFkZHJlc3MgMCIpOwotCXRvdGFsID0gcGh5c19tZW0ucmVnaW9uc1swXS5zaXplOwotCi0JaWYgKHBoeXNfbWVtLm5fcmVnaW9ucyA+IDEpIHsKLQkJcHJpbnRrKCJSQU0gc3RhcnRpbmcgYXQgMHgleCBpcyBub3QgY29udGlndW91c1xuIiwKLQkJICAgICAgIHBoeXNfbWVtLnJlZ2lvbnNbMV0uYWRkcmVzcyk7Ci0JCXByaW50aygiVXNpbmcgUkFNIGZyb20gMCB0byAweCVseFxuIiwgdG90YWwtMSk7Ci0JfQotCi0JcmV0dXJuIHRvdGFsOwotfQotCi12b2lkIF9faW5pdAotcG1hY19pbml0KHVuc2lnbmVkIGxvbmcgcjMsIHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCi0JICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3KQotewotCS8qIGlzYV9pb19iYXNlIGdldHMgc2V0IGluIHBtYWNfZmluZF9icmlkZ2VzICovCi0JaXNhX21lbV9iYXNlID0gUE1BQ19JU0FfTUVNX0JBU0U7Ci0JcGNpX2RyYW1fb2Zmc2V0ID0gUE1BQ19QQ0lfRFJBTV9PRkZTRVQ7Ci0JSVNBX0RNQV9USFJFU0hPTEQgPSB+MEw7Ci0JRE1BX01PREVfUkVBRCA9IDE7Ci0JRE1BX01PREVfV1JJVEUgPSAyOwotCi0JcHBjX21kLnNldHVwX2FyY2ggICAgID0gcG1hY19zZXR1cF9hcmNoOwotCXBwY19tZC5zaG93X2NwdWluZm8gICA9IHBtYWNfc2hvd19jcHVpbmZvOwotCXBwY19tZC5zaG93X3BlcmNwdWluZm8gPSBwbWFjX3Nob3dfcGVyY3B1aW5mbzsKLQlwcGNfbWQuaW5pdF9JUlEgICAgICAgPSBwbWFjX3BpY19pbml0OwotCXBwY19tZC5nZXRfaXJxICAgICAgICA9IHBtYWNfZ2V0X2lycTsgLyogQ2hhbmdlZCBsYXRlciBvbiAuLi4gKi8KLQotCXBwY19tZC5wY2liaW9zX2ZpeHVwICA9IHBtYWNfcGNpYmlvc19maXh1cDsKLQlwcGNfbWQucGNpYmlvc19lbmFibGVfZGV2aWNlX2hvb2sgPSBwbWFjX3BjaV9lbmFibGVfZGV2aWNlX2hvb2s7Ci0JcHBjX21kLnBjaWJpb3NfYWZ0ZXJfaW5pdCA9IHBtYWNfcGNpYmlvc19hZnRlcl9pbml0OwotCXBwY19tZC5waHlzX21lbV9hY2Nlc3NfcHJvdCA9IHBjaV9waHlzX21lbV9hY2Nlc3NfcHJvdDsKLQotCXBwY19tZC5yZXN0YXJ0ICAgICAgICA9IHBtYWNfcmVzdGFydDsKLQlwcGNfbWQucG93ZXJfb2ZmICAgICAgPSBwbWFjX3Bvd2VyX29mZjsKLQlwcGNfbWQuaGFsdCAgICAgICAgICAgPSBwbWFjX2hhbHQ7Ci0KLQlwcGNfbWQudGltZV9pbml0ICAgICAgPSBwbWFjX3RpbWVfaW5pdDsKLQlwcGNfbWQuc2V0X3J0Y190aW1lICAgPSBwbWFjX3NldF9ydGNfdGltZTsKLQlwcGNfbWQuZ2V0X3J0Y190aW1lICAgPSBwbWFjX2dldF9ydGNfdGltZTsKLQlwcGNfbWQuY2FsaWJyYXRlX2RlY3IgPSBwbWFjX2NhbGlicmF0ZV9kZWNyOwotCi0JcHBjX21kLmZpbmRfZW5kX29mX21lbW9yeSA9IHBtYWNfZmluZF9lbmRfb2ZfbWVtb3J5OwotCi0JcHBjX21kLmZlYXR1cmVfY2FsbCAgID0gcG1hY19kb19mZWF0dXJlX2NhbGw7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX0lERSkgfHwgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9JREVfTU9EVUxFKQotI2lmZGVmIENPTkZJR19CTEtfREVWX0lERV9QTUFDCi0gICAgICAgIHBwY19pZGVfbWQuaWRlX2luaXRfaHdpZgk9IHBtYWNfaWRlX2luaXRfaHdpZl9wb3J0czsKLSAgICAgICAgcHBjX2lkZV9tZC5kZWZhdWx0X2lvX2Jhc2UJPSBwbWFjX2lkZV9nZXRfYmFzZTsKLSNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVfUE1BQyAqLwotI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0JMS19ERVZfSURFKSB8fCBkZWZpbmVkKENPTkZJR19CTEtfREVWX0lERV9NT0RVTEUpICovCi0KLSNpZmRlZiBDT05GSUdfQk9PVFhfVEVYVAotCXBwY19tZC5wcm9ncmVzcyA9IHBtYWNfcHJvZ3Jlc3M7Ci0jZW5kaWYgLyogQ09ORklHX0JPT1RYX1RFWFQgKi8KLQotCWlmIChwcGNfbWQucHJvZ3Jlc3MpIHBwY19tZC5wcm9ncmVzcygicG1hY19pbml0KCk6IGV4aXQiLCAwKTsKLQotfQotCi0jaWZkZWYgQ09ORklHX0JPT1RYX1RFWFQKLXN0YXRpYyB2b2lkIF9faW5pdAotcG1hY19wcm9ncmVzcyhjaGFyICpzLCB1bnNpZ25lZCBzaG9ydCBoZXgpCi17Ci0JaWYgKGJvb3RfdGV4dF9tYXBwZWQpIHsKLQkJYnRleHRfZHJhd3N0cmluZyhzKTsKLQkJYnRleHRfZHJhd2NoYXIoJ1xuJyk7Ci0JfQotfQotI2VuZGlmIC8qIENPTkZJR19CT09UWF9URVhUICovCi0KLXN0YXRpYyBpbnQgX19pbml0Ci1wbWFjX2RlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyh2b2lkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0KLQlucCA9IGZpbmRfZGV2aWNlcygidW5pLW4iKTsKLQlpZiAobnApIHsKLQkJZm9yIChucCA9IG5wLT5jaGlsZDsgbnAgIT0gTlVMTDsgbnAgPSBucC0+c2libGluZykKLQkJCWlmIChzdHJuY21wKG5wLT5uYW1lLCAiaTJjIiwgMykgPT0gMCkgewotCQkJCW9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUobnAsICJ1bmktbi1pMmMiLAotCQkJCQkJCSAgTlVMTCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JfQotCW5wID0gZmluZF9kZXZpY2VzKCJ1MyIpOwotCWlmIChucCkgewotCQlmb3IgKG5wID0gbnAtPmNoaWxkOyBucCAhPSBOVUxMOyBucCA9IG5wLT5zaWJsaW5nKQotCQkJaWYgKHN0cm5jbXAobnAtPm5hbWUsICJpMmMiLCAzKSA9PSAwKSB7Ci0JCQkJb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShucCwgInUzLWkyYyIsCi0JCQkJCQkJICBOVUxMKTsKLQkJCQlicmVhazsKLQkJCX0KLQl9Ci0KLQlucCA9IGZpbmRfZGV2aWNlcygidmFsa3lyaWUiKTsKLQlpZiAobnApCi0JCW9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUobnAsICJ2YWxreXJpZSIsIE5VTEwpOwotCW5wID0gZmluZF9kZXZpY2VzKCJwbGF0aW51bSIpOwotCWlmIChucCkKLQkJb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShucCwgInBsYXRpbnVtIiwgTlVMTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotZGV2aWNlX2luaXRjYWxsKHBtYWNfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX3NsZWVwLlMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19zbGVlcC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmIxMTNkLi4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX3NsZWVwLlMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBzbGVlcCBsb3ctbGV2ZWwgZnVuY3Rpb25zIGZvciBQb3dlckJvb2sgRzMuCi0gKiAgICBDb3B5cmlnaHQgKEMpIDE5OTkgQmVuamFtaW4gSGVycmVuc2NobWlkdCAoYmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnKQotICogICAgYW5kIFBhdWwgTWFja2VycmFzIChwYXVsdXNAc2FtYmEub3JnKS4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KLSNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KLSNpbmNsdWRlIDxhc20vY2FjaGUuaD4KLSNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KLSNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KLQotI2RlZmluZSBNQUdJQwkweDRjNjE3MjczCS8qICdMYXJzJyAqLwotCi0vKgotICogU3RydWN0dXJlIGZvciBzdG9yaW5nIENQVSByZWdpc3RlcnMgb24gdGhlIHN0YWNrLgotICovCi0jZGVmaW5lIFNMX1NQCQkwCi0jZGVmaW5lIFNMX1BDCQk0Ci0jZGVmaW5lIFNMX01TUgkJOAotI2RlZmluZSBTTF9TRFIxCQkweGMKLSNkZWZpbmUgU0xfU1BSRzAJMHgxMAkvKiA0IHNwcmcncyAqLwotI2RlZmluZSBTTF9EQkFUMAkweDIwCi0jZGVmaW5lIFNMX0lCQVQwCTB4MjgKLSNkZWZpbmUgU0xfREJBVDEJMHgzMAotI2RlZmluZSBTTF9JQkFUMQkweDM4Ci0jZGVmaW5lIFNMX0RCQVQyCTB4NDAKLSNkZWZpbmUgU0xfSUJBVDIJMHg0OAotI2RlZmluZSBTTF9EQkFUMwkweDUwCi0jZGVmaW5lIFNMX0lCQVQzCTB4NTgKLSNkZWZpbmUgU0xfVEIJCTB4NjAKLSNkZWZpbmUgU0xfUjIJCTB4NjgKLSNkZWZpbmUgU0xfQ1IJCTB4NmMKLSNkZWZpbmUgU0xfUjEyCQkweDcwCS8qIHIxMiB0byByMzEgKi8KLSNkZWZpbmUgU0xfU0laRQkJKFNMX1IxMiArIDgwKQotCi0JLnNlY3Rpb24gLnRleHQKLQkuYWxpZ24JNQotCi0jaWYgZGVmaW5lZChDT05GSUdfUE0pIHx8IGRlZmluZWQoQ09ORklHX0NQVV9GUkVRX1BNQUMpCi0KLS8qIFRoaXMgZ2V0cyBjYWxsZWQgYnkgdmlhLXBtdS5jIGxhdGUgZHVyaW5nIHRoZSBzbGVlcCBwcm9jZXNzLgotICogVGhlIFBNVSB3YXMgYWxyZWFkeSBzZW5kIHRoZSBzbGVlcCBjb21tYW5kIGFuZCB3aWxsIHNodXQgdXMgZG93bgotICogc29vbi4gV2UgbmVlZCB0byBzYXZlIGFsbCB0aGF0IGlzIG5lZWRlZCBhbmQgc2V0dXAgdGhlIHdha2V1cAotICogdmVjdG9yIHRoYXQgd2lsbCBiZSBjYWxsZWQgYnkgdGhlIFJPTSBvbiB3YWtldXAKLSAqLwotX0dMT0JBTChsb3dfc2xlZXBfaGFuZGxlcikKLSNpZm5kZWYgQ09ORklHXzZ4eAotCWJscgotI2Vsc2UKLQltZmxyCXIwCi0Jc3R3CXIwLDQocjEpCi0Jc3R3dQlyMSwtU0xfU0laRShyMSkKLQltZmNyCXIwCi0Jc3R3CXIwLFNMX0NSKHIxKQotCXN0dwlyMixTTF9SMihyMSkKLQlzdG13CXIxMixTTF9SMTIocjEpCi0KLQkvKiBTYXZlIE1TUiAmIFNEUjEgKi8KLQltZm1zcglyNAotCXN0dwlyNCxTTF9NU1IocjEpCi0JbWZzZHIxCXI0Ci0Jc3R3CXI0LFNMX1NEUjEocjEpCi0KLQkvKiBHZXQgYSBzdGFibGUgdGltZWJhc2UgYW5kIHNhdmUgaXQgKi8KLTE6CW1mdGJ1CXI0Ci0Jc3R3CXI0LFNMX1RCKHIxKQotCW1mdGIJcjUKLQlzdHcJcjUsU0xfVEIrNChyMSkKLQltZnRidQlyMwotCWNtcHcJcjMscjQKLQlibmUJMWIKLQotCS8qIFNhdmUgU1BSR3MgKi8KLQltZnNwcmcJcjQsMAotCXN0dwlyNCxTTF9TUFJHMChyMSkKLQltZnNwcmcJcjQsMQotCXN0dwlyNCxTTF9TUFJHMCs0KHIxKQotCW1mc3ByZwlyNCwyCi0Jc3R3CXI0LFNMX1NQUkcwKzgocjEpCi0JbWZzcHJnCXI0LDMKLQlzdHcJcjQsU0xfU1BSRzArMTIocjEpCi0KLQkvKiBTYXZlIEJBVHMgKi8KLQltZmRiYXR1CXI0LDAKLQlzdHcJcjQsU0xfREJBVDAocjEpCi0JbWZkYmF0bAlyNCwwCi0Jc3R3CXI0LFNMX0RCQVQwKzQocjEpCi0JbWZkYmF0dQlyNCwxCi0Jc3R3CXI0LFNMX0RCQVQxKHIxKQotCW1mZGJhdGwJcjQsMQotCXN0dwlyNCxTTF9EQkFUMSs0KHIxKQotCW1mZGJhdHUJcjQsMgotCXN0dwlyNCxTTF9EQkFUMihyMSkKLQltZmRiYXRsCXI0LDIKLQlzdHcJcjQsU0xfREJBVDIrNChyMSkKLQltZmRiYXR1CXI0LDMKLQlzdHcJcjQsU0xfREJBVDMocjEpCi0JbWZkYmF0bAlyNCwzCi0Jc3R3CXI0LFNMX0RCQVQzKzQocjEpCi0JbWZpYmF0dQlyNCwwCi0Jc3R3CXI0LFNMX0lCQVQwKHIxKQotCW1maWJhdGwJcjQsMAotCXN0dwlyNCxTTF9JQkFUMCs0KHIxKQotCW1maWJhdHUJcjQsMQotCXN0dwlyNCxTTF9JQkFUMShyMSkKLQltZmliYXRsCXI0LDEKLQlzdHcJcjQsU0xfSUJBVDErNChyMSkKLQltZmliYXR1CXI0LDIKLQlzdHcJcjQsU0xfSUJBVDIocjEpCi0JbWZpYmF0bAlyNCwyCi0Jc3R3CXI0LFNMX0lCQVQyKzQocjEpCi0JbWZpYmF0dQlyNCwzCi0Jc3R3CXI0LFNMX0lCQVQzKHIxKQotCW1maWJhdGwJcjQsMwotCXN0dwlyNCxTTF9JQkFUMys0KHIxKQotCi0JLyogQmFja3VwIHZhcmlvdXMgQ1BVIGNvbmZpZyBzdHVmZnMgKi8KLQlibAlfX3NhdmVfY3B1X3NldHVwCi0KLQkvKiBUaGUgUk9NIGNhbiB3YWtlIHVzIHVwIHZpYSAyIGRpZmZlcmVudCB2ZWN0b3JzOgotCSAqICAtIE9uIHdhbGxzdHJlZXQgJiBsb21iYXJkLCB3ZSBtdXN0IHdyaXRlIGEgbWFnaWMKLQkgKiAgICB2YWx1ZSAnTGFycycgYXQgYWRkcmVzcyA0IGFuZCBhIHBvaW50ZXIgdG8gYQotCSAqICAgIG1lbW9yeSBsb2NhdGlvbiBjb250YWluaW5nIHRoZSBQQyB0byByZXN1bWUgZnJvbQotCSAqICAgIGF0IGFkZHJlc3MgMC4KLQkgKiAgLSBPbiBDb3JlOTksIHdlIG11c3Qgc3RvcmUgdGhlIHdha2V1cCB2ZWN0b3IgYXQKLQkgKiAgICBhZGRyZXNzIDB4ODAgYW5kIGV2ZW50dWFsbHkgaXQncyBwYXJhbWV0ZXJzCi0JICogICAgYXQgYWRkcmVzcyAweDg0LiBJJ3ZlIGhhdmUgc29tZSB0cm91YmxlIHdpdGggdGhvc2UKLQkgKiAgICBwYXJhbWV0ZXJzIGhvd2V2ZXIgYW5kIEkgbm8gbG9uZ2VyIHVzZSB0aGVtLgotCSAqLwotCWxpcwlyNSxncmFja2xlX3dha2VfdXBAaGEKLQlhZGRpCXI1LHI1LGdyYWNrbGVfd2FrZV91cEBsCi0JdG9waHlzKHI1LHI1KQotCXN0dwlyNSxTTF9QQyhyMSkKLQlsaXMJcjQsS0VSTkVMQkFTRUBoCi0JdG9waHlzKHI1LHIxKQotCWFkZGkJcjUscjUsU0xfUEMKLQlsaXMJcjYsTUFHSUNAaGEKLQlhZGRpCXI2LHI2LE1BR0lDQGwKLQlzdHcJcjUsMChyNCkKLQlzdHcJcjYsNChyNCkKLQkvKiBTZXR1cCBzdHVmZnMgYXQgMHg4MC0weDg0IGZvciBDb3JlOTkgKi8KLQlsaXMJcjMsY29yZTk5X3dha2VfdXBAaGEKLQlhZGRpCXIzLHIzLGNvcmU5OV93YWtlX3VwQGwKLQl0b3BoeXMocjMscjMpCi0Jc3R3CXIzLDB4ODAocjQpCi0Jc3R3CXI1LDB4ODQocjQpCi0JLyogU3RvcmUgYSBwb2ludGVyIHRvIG91ciBiYWNrdXAgc3RvcmFnZSBpbnRvCi0JICogYSBrZXJuZWwgZ2xvYmFsCi0JICovCi0JbGlzIHIzLHNsZWVwX3N0b3JhZ2VAaGEKLQlhZGRpIHIzLHIzLHNsZWVwX3N0b3JhZ2VAbAotCXN0dyByNSwwKHIzKQotCi0JLmdsb2JsCWxvd19jcHVfZGllCi1sb3dfY3B1X2RpZToKLQkvKiBGbHVzaCAmIGRpc2FibGUgYWxsIGNhY2hlcyAqLwotCWJsCWZsdXNoX2Rpc2FibGVfY2FjaGVzCi0KLQkvKiBUdXJuIG9mZiBkYXRhIHJlbG9jYXRpb24uICovCi0JbWZtc3IJcjMJCS8qIFNhdmUgTVNSIGluIHI3ICovCi0Jcmx3aW5tCXIzLHIzLDAsMjgsMjYJLyogVHVybiBvZmYgRFIgYml0ICovCi0Jc3luYwotCW10bXNyCXIzCi0JaXN5bmMKLQotQkVHSU5fRlRSX1NFQ1RJT04KLQkvKiBGbHVzaCBhbnkgcGVuZGluZyBMMiBkYXRhIHByZWZldGNoZXMgdG8gd29yayBhcm91bmQgSFcgYnVnICovCi0Jc3luYwotCWxpcwlyMywweGZmZjAKLQlsd3oJcjAsMChyMykJLyogcGVyZm9ybSBjYWNoZS1pbmhpYml0ZWQgbG9hZCB0byBST00gKi8KLQlzeW5jCQkJLyogKGNhY2hlcyBhcmUgZGlzYWJsZWQgYXQgdGhpcyBwb2ludCkgKi8KLUVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX1NQRUM3NDUwKQotCi0vKgotICogU2V0IHRoZSBISUQwIGFuZCBNU1IgZm9yIHNsZWVwLgotICovCi0JbWZzcHIJcjIsU1BSTl9ISUQwCi0Jcmx3aW5tCXIyLHIyLDAsMTAsNwkvKiBjbGVhciBkb3plLCBuYXAgKi8KLQlvcmlzCXIyLHIyLEhJRDBfU0xFRVBAaAotCXN5bmMKLQlpc3luYwotCW10c3ByCVNQUk5fSElEMCxyMgotCXN5bmMKLQotLyogVGhpcyBsb29wIHB1dHMgdXMgYmFjayB0byBzbGVlcCBpbiBjYXNlIHdlIGhhdmUgYSBzcHVycmlvdXMKLSAqIHdha2V1cCBzbyB0aGF0IHRoZSBob3N0IGJyaWRnZSBwcm9wZXJseSBzdGF5cyBhc2xlZXAuIFRoZQotICogQ1BVIHdpbGwgYmUgdHVybmVkIG9mZiwgZWl0aGVyIGFmdGVyIGEga25vd24gdGltZSAoYWJvdXQgMQotICogc2Vjb25kKSBvbiB3YWxsc3RyZWV0ICYgbG9tYmFyZCwgb3IgYXMgc29vbiBhcyB0aGUgQ1BVIGVudGVycwotICogU0xFRVAgbW9kZSBvbiBjb3JlOTkKLSAqLwotCW1mbXNyCXIyCi0Jb3JpcwlyMixyMixNU1JfUE9XQGgKLTE6CXN5bmMKLQltdG1zcglyMgotCWlzeW5jCi0JYgkxYgotCi0vKgotICogSGVyZSBpcyB0aGUgcmVzdW1lIGNvZGUuCi0gKi8KLQotCi0vKgotICogQ29yZTk5IG1hY2hpbmVzIHJlc3VtZSBoZXJlCi0gKiByNCBoYXMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgU0xfUEMoc3ApICh1bnVzZWQpCi0gKi8KLV9HTE9CQUwoY29yZTk5X3dha2VfdXApCi0JLyogTWFrZSBzdXJlIEhJRDAgbm8gbG9uZ2VyIGNvbnRhaW5zIGFueSBzbGVlcCBiaXQgYW5kIHRoYXQgZGF0YSBjYWNoZQotCSAqIGlzIGRpc2FibGVkCi0JICovCi0JbWZzcHIJcjMsU1BSTl9ISUQwCi0Jcmx3aW5tCXIzLHIzLDAsMTEsNwkJLyogY2xlYXIgU0xFRVAsIE5BUCwgRE9aRSBiaXRzICovCi0Jcmx3aW5tCTMscjMsMCwxOCwxNQkJLyogY2xlYXIgRENFLCBJQ0UgKi8KLQltdHNwcglTUFJOX0hJRDAscjMKLQlzeW5jCi0JaXN5bmMKLQotCS8qIHNhbml0aXplIE1TUiAqLwotCW1mbXNyCXIzCi0Jb3JpCXIzLHIzLE1TUl9FRXxNU1JfSVAKLQl4b3JpCXIzLHIzLE1TUl9FRXxNU1JfSVAKLQlzeW5jCi0JaXN5bmMKLQltdG1zcglyMwotCXN5bmMKLQlpc3luYwotCi0JLyogUmVjb3ZlciBzbGVlcCBzdG9yYWdlICovCi0JbGlzCXIzLHNsZWVwX3N0b3JhZ2VAaGEKLQlhZGRpCXIzLHIzLHNsZWVwX3N0b3JhZ2VAbAotCXRvcGh5cyhyMyxyMykKLQlsd3oJcjEsMChyMykKLQotCS8qIFBhc3MgdGhydSB0byBvbGRlciByZXN1bWUgY29kZSAuLi4gKi8KLS8qCi0gKiBIZXJlIGlzIHRoZSByZXN1bWUgY29kZSBmb3Igb2xkZXIgbWFjaGluZXMuCi0gKiByMSBoYXMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgU0xfUEMoc3ApLgotICovCi0KLWdyYWNrbGVfd2FrZV91cDoKLQotCS8qIFJlc3RvcmUgdGhlIGtlcm5lbCdzIHNlZ21lbnQgcmVnaXN0ZXJzIGJlZm9yZQotCSAqIHdlIGRvIGFueSByMSBtZW1vcnkgYWNjZXNzIGFzIHdlIGFyZSBub3Qgc3VyZSB0aGV5Ci0JICogYXJlIGluIGEgc2FuZSBzdGF0ZSBhYm92ZSB0aGUgZmlyc3QgMjU2TWIgcmVnaW9uCi0JICovCi0JbGkJcjAsMTYJCS8qIGxvYWQgdXAgc2VnbWVudCByZWdpc3RlciB2YWx1ZXMgKi8KLQltdGN0cglyMAkJLyogZm9yIGNvbnRleHQgMCAqLwotCWxpcwlyMywweDIwMDAJLyogS3UgPSAxLCBWU0lEID0gMCAqLwotCWxpCXI0LDAKLTM6CW10c3JpbglyMyxyNAotCWFkZGkJcjMscjMsMHgxMTEJLyogaW5jcmVtZW50IFZTSUQgKi8KLQlhZGRpcwlyNCxyNCwweDEwMDAJLyogYWRkcmVzcyBvZiBuZXh0IHNlZ21lbnQgKi8KLQliZG56CTNiCi0Jc3luYwotCWlzeW5jCi0KLQlzdWJpCXIxLHIxLFNMX1BDCi0KLQkvKiBSZXN0b3JlIHZhcmlvdXMgQ1BVIGNvbmZpZyBzdHVmZnMgKi8KLQlibAlfX3Jlc3RvcmVfY3B1X3NldHVwCi0KLQkvKiBNYWtlIHN1cmUgYWxsIEZQUnMgaGF2ZSBiZWVuIGluaXRpYWxpemVkICovCi0JYmwJcmVsb2Nfb2Zmc2V0Ci0JYmwJX19pbml0X2ZwdV9yZWdpc3RlcnMKLQotCS8qIEludmFsaWRhdGUgJiBlbmFibGUgTDEgY2FjaGUsIHdlIGRvbid0IGNhcmUgYWJvdXQKLQkgKiB3aGF0ZXZlciB0aGUgUk9NIG1heSBoYXZlIHRyaWVkIHRvIHdyaXRlIHRvIG1lbW9yeQotCSAqLwotCWJsCV9faW52YWxfZW5hYmxlX0wxCi0KLQkvKiBSZXN0b3JlIHRoZSBCQVRzLCBhbmQgU0RSMS4gIFRoZW4gd2UgY2FuIHR1cm4gb24gdGhlIE1NVS4gKi8KLQlsd3oJcjQsU0xfU0RSMShyMSkKLQltdHNkcjEJcjQKLQlsd3oJcjQsU0xfU1BSRzAocjEpCi0JbXRzcHJnCTAscjQKLQlsd3oJcjQsU0xfU1BSRzArNChyMSkKLQltdHNwcmcJMSxyNAotCWx3eglyNCxTTF9TUFJHMCs4KHIxKQotCW10c3ByZwkyLHI0Ci0JbHd6CXI0LFNMX1NQUkcwKzEyKHIxKQotCW10c3ByZwkzLHI0Ci0KLQlsd3oJcjQsU0xfREJBVDAocjEpCi0JbXRkYmF0dQkwLHI0Ci0JbHd6CXI0LFNMX0RCQVQwKzQocjEpCi0JbXRkYmF0bAkwLHI0Ci0JbHd6CXI0LFNMX0RCQVQxKHIxKQotCW10ZGJhdHUJMSxyNAotCWx3eglyNCxTTF9EQkFUMSs0KHIxKQotCW10ZGJhdGwJMSxyNAotCWx3eglyNCxTTF9EQkFUMihyMSkKLQltdGRiYXR1CTIscjQKLQlsd3oJcjQsU0xfREJBVDIrNChyMSkKLQltdGRiYXRsCTIscjQKLQlsd3oJcjQsU0xfREJBVDMocjEpCi0JbXRkYmF0dQkzLHI0Ci0JbHd6CXI0LFNMX0RCQVQzKzQocjEpCi0JbXRkYmF0bAkzLHI0Ci0JbHd6CXI0LFNMX0lCQVQwKHIxKQotCW10aWJhdHUJMCxyNAotCWx3eglyNCxTTF9JQkFUMCs0KHIxKQotCW10aWJhdGwJMCxyNAotCWx3eglyNCxTTF9JQkFUMShyMSkKLQltdGliYXR1CTEscjQKLQlsd3oJcjQsU0xfSUJBVDErNChyMSkKLQltdGliYXRsCTEscjQKLQlsd3oJcjQsU0xfSUJBVDIocjEpCi0JbXRpYmF0dQkyLHI0Ci0JbHd6CXI0LFNMX0lCQVQyKzQocjEpCi0JbXRpYmF0bAkyLHI0Ci0JbHd6CXI0LFNMX0lCQVQzKHIxKQotCW10aWJhdHUJMyxyNAotCWx3eglyNCxTTF9JQkFUMys0KHIxKQotCW10aWJhdGwJMyxyNAotCi1CRUdJTl9GVFJfU0VDVElPTgotCWxpCXI0LDAKLQltdHNwcglTUFJOX0RCQVQ0VSxyNAotCW10c3ByCVNQUk5fREJBVDRMLHI0Ci0JbXRzcHIJU1BSTl9EQkFUNVUscjQKLQltdHNwcglTUFJOX0RCQVQ1TCxyNAotCW10c3ByCVNQUk5fREJBVDZVLHI0Ci0JbXRzcHIJU1BSTl9EQkFUNkwscjQKLQltdHNwcglTUFJOX0RCQVQ3VSxyNAotCW10c3ByCVNQUk5fREJBVDdMLHI0Ci0JbXRzcHIJU1BSTl9JQkFUNFUscjQKLQltdHNwcglTUFJOX0lCQVQ0TCxyNAotCW10c3ByCVNQUk5fSUJBVDVVLHI0Ci0JbXRzcHIJU1BSTl9JQkFUNUwscjQKLQltdHNwcglTUFJOX0lCQVQ2VSxyNAotCW10c3ByCVNQUk5fSUJBVDZMLHI0Ci0JbXRzcHIJU1BSTl9JQkFUN1UscjQKLQltdHNwcglTUFJOX0lCQVQ3TCxyNAotRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfSEFTX0hJR0hfQkFUUykKLQotCS8qIEZsdXNoIGFsbCBUTEJzICovCi0JbGlzCXI0LDB4MTAwMAotMToJYWRkaWMuCXI0LHI0LC0weDEwMDAKLQl0bGJpZQlyNAotCWJsdAkxYgotCXN5bmMKLQotCS8qIHJlc3RvcmUgdGhlIE1TUiBhbmQgdHVybiBvbiB0aGUgTU1VICovCi0JbHd6CXIzLFNMX01TUihyMSkKLQlibAl0dXJuX29uX21tdQotCi0JLyogZ2V0IGJhY2sgdGhlIHN0YWNrIHBvaW50ZXIgKi8KLQl0b3ZpcnQocjEscjEpCi0KLQkvKiBSZXN0b3JlIFRCICovCi0JbGkJcjMsMAotCW10dGJsCXIzCi0JbHd6CXIzLFNMX1RCKHIxKQotCWx3eglyNCxTTF9UQis0KHIxKQotCW10dGJ1CXIzCi0JbXR0YmwJcjQKLQotCS8qIFJlc3RvcmUgdGhlIGNhbGxlZS1zYXZlZCByZWdpc3RlcnMgYW5kIHJldHVybiAqLwotCWx3eglyMCxTTF9DUihyMSkKLQltdGNyCXIwCi0JbHd6CXIyLFNMX1IyKHIxKQotCWxtdwlyMTIsU0xfUjEyKHIxKQotCWFkZGkJcjEscjEsU0xfU0laRQotCWx3eglyMCw0KHIxKQotCW10bHIJcjAKLQlibHIKLQotdHVybl9vbl9tbXU6Ci0JbWZscglyNAotCXRvdmlydChyNCxyNCkKLQltdHNycjAJcjQKLQltdHNycjEJcjMKLQlzeW5jCi0JaXN5bmMKLQlyZmkKLQotI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1BNKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfRlJFUSkgKi8KLQotCS5zZWN0aW9uIC5kYXRhCi0JLmJhbGlnbglMMV9DQUNIRV9CWVRFUwotc2xlZXBfc3RvcmFnZToKLQkubG9uZyAwCi0JLmJhbGlnbglMMV9DQUNIRV9CWVRFUywgMAotCi0jZW5kaWYgLyogQ09ORklHXzZ4eCAqLwotCS5zZWN0aW9uIC50ZXh0CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19zbXAuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX3NtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmZmMjYyLi4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX3NtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjkyICswLDAgQEAKLS8qCi0gKiBTTVAgc3VwcG9ydCBmb3IgcG93ZXIgbWFjaW50b3NoLgotICoKLSAqIFdlIHN1cHBvcnQgYm90aCB0aGUgb2xkICJwb3dlcnN1cmdlIiBTTVAgYXJjaGl0ZWN0dXJlCi0gKiBhbmQgdGhlIGN1cnJlbnQgQ29yZTk5IChHNCBQb3dlck1hYykgbWFjaGluZXMuCi0gKgotICogTm90ZSB0aGF0IHdlIGRvbid0IHN1cHBvcnQgdGhlIHZlcnkgZmlyc3QgcmV2LiBvZgotICogQXBwbGUvRGF5U3RhciAyIENQVXMgYm9hcmQsIHRoZSBvbmUgd2l0aCB0aGUgZnVua3kKLSAqIHdhdGNoZG9nLiBIb3BlZnVsbHksIG5vbmUgb2YgdGhlc2Ugc2hvdWxkIGJlIHRoZXJlIGV4Y2VwdAotICogbWF5YmUgaW50ZXJuYWxseSB0byBBcHBsZS4gSSBzaG91bGQgcHJvYmFibHkgc3RpbGwgYWRkIHNvbWUKLSAqIGNvZGUgdG8gZGV0ZWN0IHRoaXMgY2FyZCB0aG91Z2ggYW5kIGRpc2FibGUgU01QLiAtLUJlbkguCi0gKgotICogU3VwcG9ydCBNYWNpbnRvc2ggRzQgU01QIGJ5IFRyb3kgQmVuamVnZXJkZXMgKGhvemVyQGRyZ3cubmV0KQotICogYW5kIEJlbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+LgotICoKLSAqIFN1cHBvcnQgZm9yIERheVN0YXIgcXVhZCBDUFUgY2FyZHMKLSAqIENvcHlyaWdodCAoQykgWExSOCwgSW5jLiAxOTk0LTIwMDAKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1Lmg+Ci0KLSNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vc21wLmg+Ci0jaW5jbHVkZSA8YXNtL3Jlc2lkdWFsLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20vcG1hY19mZWF0dXJlLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWUuaD4KLSNpbmNsdWRlIDxhc20vb3Blbl9waWMuaD4KLSNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgotI2luY2x1ZGUgPGFzbS9rZXlsYXJnby5oPgotCi0vKgotICogUG93ZXJzdXJnZSAob2xkIHBvd2VybWFjIFNNUCkgc3VwcG9ydC4KLSAqLwotCi1leHRlcm4gdm9pZCBfX3NlY29uZGFyeV9zdGFydF9wbWFjXzAodm9pZCk7Ci0KLS8qIEFkZHJlc3NlcyBmb3IgcG93ZXJzdXJnZSByZWdpc3RlcnMgKi8KLSNkZWZpbmUgSEFNTUVSSEVBRF9CQVNFCQkweGY4MDAwMDAwCi0jZGVmaW5lIEhIRUFEX0NPTkZJRwkJMHg5MAotI2RlZmluZSBISEVBRF9TRUNfSU5UUgkJMHhjMAotCi0vKiByZWdpc3RlciBmb3IgaW50ZXJydXB0aW5nIHRoZSBwcmltYXJ5IHByb2Nlc3NvciBvbiB0aGUgcG93ZXJzdXJnZSAqLwotLyogTi5CLiB0aGlzIGlzIGFjdHVhbGx5IHRoZSBldGhlcm5ldCBST00hICovCi0jZGVmaW5lIFBTVVJHRV9QUklfSU5UUgkJMHhmMzAxOTAwMAotCi0vKiByZWdpc3RlciBmb3Igc3RvcmluZyB0aGUgc3RhcnQgYWRkcmVzcyBmb3IgdGhlIHNlY29uZGFyeSBwcm9jZXNzb3IgKi8KLS8qIE4uQi4gdGhpcyBpcyB0aGUgUENJIGNvbmZpZyBzcGFjZSBhZGRyZXNzIHJlZ2lzdGVyIGZvciB0aGUgMXN0IGJyaWRnZSAqLwotI2RlZmluZSBQU1VSR0VfU1RBUlQJCTB4ZjI4MDAwMDAKLQotLyogRGF5c3Rhci9YTFI4IDQtQ1BVIGNhcmQgKi8KLSNkZWZpbmUgUFNVUkdFX1FVQURfUkVHX0FERFIJMHhmODgwMDAwMAotCi0jZGVmaW5lIFBTVVJHRV9RVUFEX0lSUV9TRVQJMAotI2RlZmluZSBQU1VSR0VfUVVBRF9JUlFfQ0xSCTEKLSNkZWZpbmUgUFNVUkdFX1FVQURfSVJRX1BSSU1BUlkJMgotI2RlZmluZSBQU1VSR0VfUVVBRF9DS1NUT1BfQ1RMCTMKLSNkZWZpbmUgUFNVUkdFX1FVQURfUFJJTUFSWV9BUkIJNAotI2RlZmluZSBQU1VSR0VfUVVBRF9CT0FSRF9JRAk2Ci0jZGVmaW5lIFBTVVJHRV9RVUFEX1dISUNIX0NQVQk3Ci0jZGVmaW5lIFBTVVJHRV9RVUFEX0NLU1RPUF9SREJLCTgKLSNkZWZpbmUgUFNVUkdFX1FVQURfUkVTRVRfQ1RMCTExCi0KLSNkZWZpbmUgUFNVUkdFX1FVQURfT1VUKHIsIHYpCShvdXRfOChxdWFkX2Jhc2UgKyAoKHIpIDw8IDQpICsgNCwgKHYpKSkKLSNkZWZpbmUgUFNVUkdFX1FVQURfSU4ocikJKGluXzgocXVhZF9iYXNlICsgKChyKSA8PCA0KSArIDQpICYgMHgwZikKLSNkZWZpbmUgUFNVUkdFX1FVQURfQklTKHIsIHYpCShQU1VSR0VfUVVBRF9PVVQoKHIpLCBQU1VSR0VfUVVBRF9JTihyKSB8ICh2KSkpCi0jZGVmaW5lIFBTVVJHRV9RVUFEX0JJQyhyLCB2KQkoUFNVUkdFX1FVQURfT1VUKChyKSwgUFNVUkdFX1FVQURfSU4ocikgJiB+KHYpKSkKLQotLyogdmlydHVhbCBhZGRyZXNzZXMgZm9yIHRoZSBhYm92ZSAqLwotc3RhdGljIHZvbGF0aWxlIHU4IF9faW9tZW0gKmhoZWFkX2Jhc2U7Ci1zdGF0aWMgdm9sYXRpbGUgdTggX19pb21lbSAqcXVhZF9iYXNlOwotc3RhdGljIHZvbGF0aWxlIHUzMiBfX2lvbWVtICpwc3VyZ2VfcHJpX2ludHI7Ci1zdGF0aWMgdm9sYXRpbGUgdTggX19pb21lbSAqcHN1cmdlX3NlY19pbnRyOwotc3RhdGljIHZvbGF0aWxlIHUzMiBfX2lvbWVtICpwc3VyZ2Vfc3RhcnQ7Ci0KLS8qIHZhbHVlcyBmb3IgcHN1cmdlX3R5cGUgKi8KLSNkZWZpbmUgUFNVUkdFX05PTkUJCS0xCi0jZGVmaW5lIFBTVVJHRV9EVUFMCQkwCi0jZGVmaW5lIFBTVVJHRV9RVUFEX09LRUUJMQotI2RlZmluZSBQU1VSR0VfUVVBRF9DT1RUT04JMgotI2RlZmluZSBQU1VSR0VfUVVBRF9JQ0VHUkFTUwkzCi0KLS8qIHdoYXQgc29ydCBvZiBwb3dlcnN1cmdlIGJvYXJkIHdlIGhhdmUgKi8KLXN0YXRpYyBpbnQgcHN1cmdlX3R5cGUgPSBQU1VSR0VfTk9ORTsKLQotLyogTDIgYW5kIEwzIGNhY2hlIHNldHRpbmdzIHRvIHBhc3MgZnJvbSBDUFUwIHRvIENQVTEgKi8KLXZvbGF0aWxlIHN0YXRpYyBsb25nIGludCBjb3JlOTlfbDJfY2FjaGU7Ci12b2xhdGlsZSBzdGF0aWMgbG9uZyBpbnQgY29yZTk5X2wzX2NhY2hlOwotCi0vKiBUaW1lYmFzZSBmcmVlemUgR1BJTyAqLwotc3RhdGljIHVuc2lnbmVkIGludCBjb3JlOTlfdGJfZ3BpbzsKLQotLyogU3luYyBmbGFnIGZvciBIVyB0YiBzeW5jICovCi1zdGF0aWMgdm9sYXRpbGUgaW50IHNlY190Yl9yZXNldCA9IDA7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHByaV90Yl9oaSwgcHJpX3RiX2xvOwotc3RhdGljIHVuc2lnbmVkIGludCBwcmlfdGJfc3RhbXA7Ci0KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBjb3JlOTlfaW5pdF9jYWNoZXMoaW50IGNwdSkKLXsKLQlpZiAoIWNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0wyQ1IpKQotCQlyZXR1cm47Ci0KLQlpZiAoY3B1ID09IDApIHsKLQkJY29yZTk5X2wyX2NhY2hlID0gX2dldF9MMkNSKCk7Ci0JCXByaW50aygiQ1BVMDogTDJDUiBpcyAlbHhcbiIsIGNvcmU5OV9sMl9jYWNoZSk7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKCJDUFUlZDogTDJDUiB3YXMgJWx4XG4iLCBjcHUsIF9nZXRfTDJDUigpKTsKLQkJX3NldF9MMkNSKDApOwotCQlfc2V0X0wyQ1IoY29yZTk5X2wyX2NhY2hlKTsKLQkJcHJpbnRrKCJDUFUlZDogTDJDUiBzZXQgdG8gJWx4XG4iLCBjcHUsIGNvcmU5OV9sMl9jYWNoZSk7Ci0JfQotCi0JaWYgKCFjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9MM0NSKSkKLQkJcmV0dXJuOwotCi0JaWYgKGNwdSA9PSAwKXsKLQkJY29yZTk5X2wzX2NhY2hlID0gX2dldF9MM0NSKCk7Ci0JCXByaW50aygiQ1BVMDogTDNDUiBpcyAlbHhcbiIsIGNvcmU5OV9sM19jYWNoZSk7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKCJDUFUlZDogTDNDUiB3YXMgJWx4XG4iLCBjcHUsIF9nZXRfTDNDUigpKTsKLQkJX3NldF9MM0NSKDApOwotCQlfc2V0X0wzQ1IoY29yZTk5X2wzX2NhY2hlKTsKLQkJcHJpbnRrKCJDUFUlZDogTDNDUiBzZXQgdG8gJWx4XG4iLCBjcHUsIGNvcmU5OV9sM19jYWNoZSk7Ci0JfQotfQotCi0vKgotICogU2V0IGFuZCBjbGVhciBJUElzIGZvciBwb3dlcnN1cmdlLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcHN1cmdlX3NldF9pcGkoaW50IGNwdSkKLXsKLQlpZiAocHN1cmdlX3R5cGUgPT0gUFNVUkdFX05PTkUpCi0JCXJldHVybjsKLQlpZiAoY3B1ID09IDApCi0JCWluX2JlMzIocHN1cmdlX3ByaV9pbnRyKTsKLQllbHNlIGlmIChwc3VyZ2VfdHlwZSA9PSBQU1VSR0VfRFVBTCkKLQkJb3V0XzgocHN1cmdlX3NlY19pbnRyLCAwKTsKLQllbHNlCi0JCVBTVVJHRV9RVUFEX09VVChQU1VSR0VfUVVBRF9JUlFfU0VULCAxIDw8IGNwdSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwc3VyZ2VfY2xyX2lwaShpbnQgY3B1KQotewotCWlmIChjcHUgPiAwKSB7Ci0JCXN3aXRjaChwc3VyZ2VfdHlwZSkgewotCQljYXNlIFBTVVJHRV9EVUFMOgotCQkJb3V0XzgocHN1cmdlX3NlY19pbnRyLCB+MCk7Ci0JCWNhc2UgUFNVUkdFX05PTkU6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCVBTVVJHRV9RVUFEX09VVChQU1VSR0VfUVVBRF9JUlFfQ0xSLCAxIDw8IGNwdSk7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBPbiBwb3dlcnN1cmdlIChvbGQgU01QIHBvd2VybWFjIGFyY2hpdGVjdHVyZSkgd2UgZG9uJ3QgaGF2ZQotICogc2VwYXJhdGUgSVBJcyBmb3Igc2VwYXJhdGUgbWVzc2FnZXMgbGlrZSBvcGVucGljIGRvZXMuICBJbnN0ZWFkCi0gKiB3ZSBoYXZlIGEgYml0bWFwIGZvciBlYWNoIHByb2Nlc3Nvciwgd2hlcmUgYSAxIGJpdCBtZWFucyB0aGF0Ci0gKiB0aGUgY29ycmVzcG9uZGluZyBtZXNzYWdlIGlzIHBlbmRpbmcgZm9yIHRoYXQgcHJvY2Vzc29yLgotICogSWRlYWxseSBlYWNoIGNwdSdzIGVudHJ5IHdvdWxkIGJlIGluIGEgZGlmZmVyZW50IGNhY2hlIGxpbmUuCi0gKiAgLS0gcGF1bHVzLgotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBwc3VyZ2Vfc21wX21lc3NhZ2VbTlJfQ1BVU107Ci0KLXZvaWQgcHN1cmdlX3NtcF9tZXNzYWdlX3JlY3Yoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlpbnQgbXNnOwotCi0JLyogY2xlYXIgaW50ZXJydXB0ICovCi0JcHN1cmdlX2Nscl9pcGkoY3B1KTsKLQotCWlmIChudW1fb25saW5lX2NwdXMoKSA8IDIpCi0JCXJldHVybjsKLQotCS8qIG1ha2Ugc3VyZSB0aGVyZSBpcyBhIG1lc3NhZ2UgdGhlcmUgKi8KLQlmb3IgKG1zZyA9IDA7IG1zZyA8IDQ7IG1zZysrKQotCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KG1zZywgJnBzdXJnZV9zbXBfbWVzc2FnZVtjcHVdKSkKLQkJCXNtcF9tZXNzYWdlX3JlY3YobXNnLCByZWdzKTsKLX0KLQotaXJxcmV0dXJuX3QgcHN1cmdlX3ByaW1hcnlfaW50cihpbnQgaXJxLCB2b2lkICpkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlwc3VyZ2Vfc21wX21lc3NhZ2VfcmVjdihyZWdzKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHNtcF9wc3VyZ2VfbWVzc2FnZV9wYXNzKGludCB0YXJnZXQsIGludCBtc2cpCi17Ci0JaW50IGk7Ci0KLQlpZiAobnVtX29ubGluZV9jcHVzKCkgPCAyKQotCQlyZXR1cm47Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7Ci0JCWlmICghY3B1X29ubGluZShpKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAodGFyZ2V0ID09IE1TR19BTEwKLQkJICAgIHx8ICh0YXJnZXQgPT0gTVNHX0FMTF9CVVRfU0VMRiAmJiBpICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkKLQkJICAgIHx8IHRhcmdldCA9PSBpKSB7Ci0JCQlzZXRfYml0KG1zZywgJnBzdXJnZV9zbXBfbWVzc2FnZVtpXSk7Ci0JCQlwc3VyZ2Vfc2V0X2lwaShpKTsKLQkJfQotCX0KLX0KLQotLyoKLSAqIERldGVybWluZSBhIHF1YWQgY2FyZCBwcmVzZW5jZS4gV2UgcmVhZCB0aGUgYm9hcmQgSUQgcmVnaXN0ZXIsIHdlCi0gKiBmb3JjZSB0aGUgZGF0YSBidXMgdG8gY2hhbmdlIHRvIHNvbWV0aGluZyBlbHNlLCBhbmQgd2UgcmVhZCBpdCBhZ2Fpbi4KLSAqIEl0IGl0J3Mgc3RhYmxlLCB0aGVuIHRoZSByZWdpc3RlciBwcm9iYWJseSBleGlzdCAodWdoICEpCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHBzdXJnZV9xdWFkX3Byb2JlKHZvaWQpCi17Ci0JaW50IHR5cGU7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQl0eXBlID0gUFNVUkdFX1FVQURfSU4oUFNVUkdFX1FVQURfQk9BUkRfSUQpOwotCWlmICh0eXBlIDwgUFNVUkdFX1FVQURfT0tFRSB8fCB0eXBlID4gUFNVUkdFX1FVQURfSUNFR1JBU1MKLQkgICAgfHwgdHlwZSAhPSBQU1VSR0VfUVVBRF9JTihQU1VSR0VfUVVBRF9CT0FSRF9JRCkpCi0JCXJldHVybiBQU1VSR0VfRFVBTDsKLQotCS8qIGxvb2tzIE9LLCB0cnkgYSBzbGlnaHRseSBtb3JlIHJpZ29yb3VzIHRlc3QgKi8KLQkvKiBib2d1cyBpcyBub3QgbmVjZXNzYXJpbHkgY2FjaGVsaW5lLWFsaWduZWQsCi0JICAgdGhvdWdoIEkgZG9uJ3Qgc3VwcG9zZSB0aGF0IHJlYWxseSBtYXR0ZXJzLiAgLS0gcGF1bHVzICovCi0JZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0JCXZvbGF0aWxlIHUzMiBib2d1c1s4XTsKLQkJYm9ndXNbKDAraSklOF0gPSAweDAwMDAwMDAwOwotCQlib2d1c1soMStpKSU4XSA9IDB4NTU1NTU1NTU7Ci0JCWJvZ3VzWygyK2kpJThdID0gMHhGRkZGRkZGRjsKLQkJYm9ndXNbKDMraSklOF0gPSAweEFBQUFBQUFBOwotCQlib2d1c1soNCtpKSU4XSA9IDB4MzMzMzMzMzM7Ci0JCWJvZ3VzWyg1K2kpJThdID0gMHhDQ0NDQ0NDQzsKLQkJYm9ndXNbKDYraSklOF0gPSAweENDQ0NDQ0NDOwotCQlib2d1c1soNytpKSU4XSA9IDB4MzMzMzMzMzM7Ci0JCXdtYigpOwotCQlhc20gdm9sYXRpbGUoImRjYmYgMCwlMCIgOiA6ICJyIiAoYm9ndXMpIDogIm1lbW9yeSIpOwotCQltYigpOwotCQlpZiAodHlwZSAhPSBQU1VSR0VfUVVBRF9JTihQU1VSR0VfUVVBRF9CT0FSRF9JRCkpCi0JCQlyZXR1cm4gUFNVUkdFX0RVQUw7Ci0JfQotCXJldHVybiB0eXBlOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgcHN1cmdlX3F1YWRfaW5pdCh2b2lkKQotewotCWludCBwcm9jYml0czsKLQotCWlmIChwcGNfbWQucHJvZ3Jlc3MpIHBwY19tZC5wcm9ncmVzcygicHN1cmdlX3F1YWRfaW5pdCIsIDB4MzUxKTsKLQlwcm9jYml0cyA9IH5QU1VSR0VfUVVBRF9JTihQU1VSR0VfUVVBRF9XSElDSF9DUFUpOwotCWlmIChwc3VyZ2VfdHlwZSA9PSBQU1VSR0VfUVVBRF9JQ0VHUkFTUykKLQkJUFNVUkdFX1FVQURfQklTKFBTVVJHRV9RVUFEX1JFU0VUX0NUTCwgcHJvY2JpdHMpOwotCWVsc2UKLQkJUFNVUkdFX1FVQURfQklDKFBTVVJHRV9RVUFEX0NLU1RPUF9DVEwsIHByb2NiaXRzKTsKLQltZGVsYXkoMzMpOwotCW91dF84KHBzdXJnZV9zZWNfaW50ciwgfjApOwotCVBTVVJHRV9RVUFEX09VVChQU1VSR0VfUVVBRF9JUlFfQ0xSLCBwcm9jYml0cyk7Ci0JUFNVUkdFX1FVQURfQklTKFBTVVJHRV9RVUFEX1JFU0VUX0NUTCwgcHJvY2JpdHMpOwotCWlmIChwc3VyZ2VfdHlwZSAhPSBQU1VSR0VfUVVBRF9JQ0VHUkFTUykKLQkJUFNVUkdFX1FVQURfQklTKFBTVVJHRV9RVUFEX0NLU1RPUF9DVEwsIHByb2NiaXRzKTsKLQlQU1VSR0VfUVVBRF9CSUMoUFNVUkdFX1FVQURfUFJJTUFSWV9BUkIsIHByb2NiaXRzKTsKLQltZGVsYXkoMzMpOwotCVBTVVJHRV9RVUFEX0JJQyhQU1VSR0VfUVVBRF9SRVNFVF9DVEwsIHByb2NiaXRzKTsKLQltZGVsYXkoMzMpOwotCVBTVVJHRV9RVUFEX0JJUyhQU1VSR0VfUVVBRF9QUklNQVJZX0FSQiwgcHJvY2JpdHMpOwotCW1kZWxheSgzMyk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNtcF9wc3VyZ2VfcHJvYmUodm9pZCkKLXsKLQlpbnQgaSwgbmNwdXM7Ci0KLQkvKiBXZSBkb24ndCBkbyBTTVAgb24gdGhlIFBQQzYwMSAtLSBwYXVsdXMgKi8KLQlpZiAoUFZSX1ZFUihtZnNwcihTUFJOX1BWUikpID09IDEpCi0JCXJldHVybiAxOwotCi0JLyoKLQkgKiBUaGUgcG93ZXJzdXJnZSBjcHUgYm9hcmQgY2FuIGJlIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24KLQkgKiBvZiBwb3dlcm1hY3MgdGhhdCBoYXZlIGEgc29ja2V0IGZvciBhbiB1cGdyYWRlYWJsZSBjcHUgY2FyZCwKLQkgKiBpbmNsdWRpbmcgdGhlIDc1MDAsIDg1MDAsIDk1MDAsIDk2MDAuCi0JICogVGhlIGRldmljZSB0cmVlIGRvZXNuJ3QgdGVsbCB5b3UgaWYgeW91IGhhdmUgMiBjcHVzIGJlY2F1c2UKLQkgKiBPRiBkb2Vzbid0IGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIDJuZCBwcm9jZXNzb3IuCi0JICogSW5zdGVhZCB3ZSBsb29rIGZvciBtYWdpYyBiaXRzIGluIG1hZ2ljIHJlZ2lzdGVycywKLQkgKiBpbiB0aGUgaGFtbWVyaGVhZCBtZW1vcnkgY29udHJvbGxlciBpbiB0aGUgY2FzZSBvZiB0aGUKLQkgKiBkdWFsLWNwdSBwb3dlcnN1cmdlIGJvYXJkLiAgLS0gcGF1bHVzLgotCSAqLwotCWlmIChmaW5kX2RldmljZXMoImhhbW1lcmhlYWQiKSA9PSBOVUxMKQotCQlyZXR1cm4gMTsKLQotCWhoZWFkX2Jhc2UgPSBpb3JlbWFwKEhBTU1FUkhFQURfQkFTRSwgMHg4MDApOwotCXF1YWRfYmFzZSA9IGlvcmVtYXAoUFNVUkdFX1FVQURfUkVHX0FERFIsIDEwMjQpOwotCXBzdXJnZV9zZWNfaW50ciA9IGhoZWFkX2Jhc2UgKyBISEVBRF9TRUNfSU5UUjsKLQotCXBzdXJnZV90eXBlID0gcHN1cmdlX3F1YWRfcHJvYmUoKTsKLQlpZiAocHN1cmdlX3R5cGUgIT0gUFNVUkdFX0RVQUwpIHsKLQkJcHN1cmdlX3F1YWRfaW5pdCgpOwotCQkvKiBBbGwgcmVsZWFzZWQgY2FyZHMgdXNpbmcgdGhpcyBIVyBkZXNpZ24gaGF2ZSA0IENQVXMgKi8KLQkJbmNwdXMgPSA0OwotCX0gZWxzZSB7Ci0JCWlvdW5tYXAocXVhZF9iYXNlKTsKLQkJaWYgKChpbl84KGhoZWFkX2Jhc2UgKyBISEVBRF9DT05GSUcpICYgMHgwMikgPT0gMCkgewotCQkJLyogbm90IGEgZHVhbC1jcHUgY2FyZCAqLwotCQkJaW91bm1hcChoaGVhZF9iYXNlKTsKLQkJCXBzdXJnZV90eXBlID0gUFNVUkdFX05PTkU7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQluY3B1cyA9IDI7Ci0JfQotCi0JcHN1cmdlX3N0YXJ0ID0gaW9yZW1hcChQU1VSR0VfU1RBUlQsIDQpOwotCXBzdXJnZV9wcmlfaW50ciA9IGlvcmVtYXAoUFNVUkdFX1BSSV9JTlRSLCA0KTsKLQotCS8qIHRoaXMgaXMgbm90IGFjdHVhbGx5IHN0cmljdGx5IG5lY2Vzc2FyeSAtLSBwYXVsdXMuICovCi0JZm9yIChpID0gMTsgaSA8IG5jcHVzOyArK2kpCi0JCXNtcF9od19pbmRleFtpXSA9IGk7Ci0KLQlpZiAocHBjX21kLnByb2dyZXNzKSBwcGNfbWQucHJvZ3Jlc3MoInNtcF9wc3VyZ2VfcHJvYmUgLSBkb25lIiwgMHgzNTIpOwotCi0JcmV0dXJuIG5jcHVzOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgc21wX3BzdXJnZV9raWNrX2NwdShpbnQgbnIpCi17Ci0JdW5zaWduZWQgbG9uZyBzdGFydCA9IF9fcGEoX19zZWNvbmRhcnlfc3RhcnRfcG1hY18wKSArIG5yICogODsKLQl1bnNpZ25lZCBsb25nIGE7Ci0KLQkvKiBtYXkgbmVlZCB0byBmbHVzaCBoZXJlIGlmIHNlY29uZGFyeSBiYXRzIGFyZW4ndCBzZXR1cCAqLwotCWZvciAoYSA9IEtFUk5FTEJBU0U7IGEgPCBLRVJORUxCQVNFICsgMHg4MDAwMDA7IGEgKz0gMzIpCi0JCWFzbSB2b2xhdGlsZSgiZGNiZiAwLCUwIiA6IDogInIiIChhKSA6ICJtZW1vcnkiKTsKLQlhc20gdm9sYXRpbGUoInN5bmMiKTsKLQotCWlmIChwcGNfbWQucHJvZ3Jlc3MpIHBwY19tZC5wcm9ncmVzcygic21wX3BzdXJnZV9raWNrX2NwdSIsIDB4MzUzKTsKLQotCW91dF9iZTMyKHBzdXJnZV9zdGFydCwgc3RhcnQpOwotCW1iKCk7Ci0KLQlwc3VyZ2Vfc2V0X2lwaShucik7Ci0JdWRlbGF5KDEwKTsKLQlwc3VyZ2VfY2xyX2lwaShucik7Ci0KLQlpZiAocHBjX21kLnByb2dyZXNzKSBwcGNfbWQucHJvZ3Jlc3MoInNtcF9wc3VyZ2Vfa2lja19jcHUgLSBkb25lIiwgMHgzNTQpOwotfQotCi0vKgotICogV2l0aCB0aGUgZHVhbC1jcHUgcG93ZXJzdXJnZSBib2FyZCwgdGhlIGRlY3JlbWVudGVycyBhbmQgdGltZWJhc2VzCi0gKiBvZiBib3RoIGNwdXMgYXJlIGZyb3plbiBhZnRlciB0aGUgc2Vjb25kYXJ5IGNwdSBpcyBzdGFydGVkIHVwLAotICogdW50aWwgd2UgZ2l2ZSB0aGUgc2Vjb25kYXJ5IGNwdSBhbm90aGVyIGludGVycnVwdC4gIFRoaXMgcm91dGluZQotICogdXNlcyB0aGlzIHRvIGdldCB0aGUgdGltZWJhc2VzIHN5bmNocm9uaXplZC4KLSAqICAtLSBwYXVsdXMuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBwc3VyZ2VfZHVhbF9zeW5jX3RiKGludCBjcHVfbnIpCi17Ci0JaW50IHQ7Ci0KLQlzZXRfZGVjKHRiX3RpY2tzX3Blcl9qaWZmeSk7Ci0Jc2V0X3RiKDAsIDApOwotCWxhc3RfamlmZnlfc3RhbXAoY3B1X25yKSA9IDA7Ci0KLQlpZiAoY3B1X25yID4gMCkgewotCQltYigpOwotCQlzZWNfdGJfcmVzZXQgPSAxOwotCQlyZXR1cm47Ci0JfQotCi0JLyogd2FpdCBmb3IgdGhlIHNlY29uZGFyeSB0byBoYXZlIHJlc2V0IGl0cyBUQiBiZWZvcmUgcHJvY2VlZGluZyAqLwotCWZvciAodCA9IDEwMDAwMDAwOyB0ID4gMCAmJiAhc2VjX3RiX3Jlc2V0OyAtLXQpCi0JCTsKLQotCS8qIG5vdyBpbnRlcnJ1cHQgdGhlIHNlY29uZGFyeSwgc3RhcnRpbmcgYm90aCBUQnMgKi8KLQlwc3VyZ2Vfc2V0X2lwaSgxKTsKLQotCXNtcF90Yl9zeW5jaHJvbml6ZWQgPSAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBwc3VyZ2VfaXJxYWN0aW9uID0gewotCS5oYW5kbGVyID0gcHN1cmdlX3ByaW1hcnlfaW50ciwKLQkuZmxhZ3MgPSBTQV9JTlRFUlJVUFQsCi0JLm1hc2sgPSBDUFVfTUFTS19OT05FLAotCS5uYW1lID0gInByaW1hcnkgSVBJIiwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBzbXBfcHN1cmdlX3NldHVwX2NwdShpbnQgY3B1X25yKQotewotCi0JaWYgKGNwdV9uciA9PSAwKSB7Ci0JCS8qIElmIHdlIGZhaWxlZCB0byBzdGFydCB0aGUgc2Vjb25kIENQVSwgd2Ugc2hvdWxkIHN0aWxsCi0JCSAqIHNlbmQgaXQgYW4gSVBJIHRvIHN0YXJ0IHRoZSB0aW1lYmFzZSAmIERFQyBvciB3ZSBtaWdodAotCQkgKiBoYXZlIHRoZW0gc3R1Y2suCi0JCSAqLwotCQlpZiAobnVtX29ubGluZV9jcHVzKCkgPCAyKSB7Ci0JCQlpZiAocHN1cmdlX3R5cGUgPT0gUFNVUkdFX0RVQUwpCi0JCQkJcHN1cmdlX3NldF9pcGkoMSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLyogcmVzZXQgdGhlIGVudHJ5IHBvaW50IHNvIGlmIHdlIGdldCBhbm90aGVyIGludHIgd2Ugd29uJ3QKLQkJICogdHJ5IHRvIHN0YXJ0dXAgYWdhaW4gKi8KLQkJb3V0X2JlMzIocHN1cmdlX3N0YXJ0LCAweDEwMCk7Ci0JCWlmIChzZXR1cF9pcnEoMzAsICZwc3VyZ2VfaXJxYWN0aW9uKSkKLQkJCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgZ2V0IHByaW1hcnkgSVBJIGludGVycnVwdCIpOwotCX0KLQotCWlmIChwc3VyZ2VfdHlwZSA9PSBQU1VSR0VfRFVBTCkKLQkJcHN1cmdlX2R1YWxfc3luY190YihjcHVfbnIpOwotfQotCi12b2lkIF9faW5pdCBzbXBfcHN1cmdlX3Rha2VfdGltZWJhc2Uodm9pZCkKLXsKLQkvKiBEdW1teSBpbXBsZW1lbnRhdGlvbiAqLwotfQotCi12b2lkIF9faW5pdCBzbXBfcHN1cmdlX2dpdmVfdGltZWJhc2Uodm9pZCkKLXsKLQkvKiBEdW1teSBpbXBsZW1lbnRhdGlvbiAqLwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBzbXBfY29yZTk5X3Byb2JlKHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHXzZ4eAotCWV4dGVybiBpbnQgcG93ZXJzYXZlX25hcDsKLSNlbmRpZgotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1cywgKmZpcnN0Y3B1OwotCWludCBpLCBuY3B1cyA9IDAsIGJvb3RfY3B1ID0gLTE7Ci0JdTMyICp0YnByb3AgPSBOVUxMOwotCi0JaWYgKHBwY19tZC5wcm9ncmVzcykgcHBjX21kLnByb2dyZXNzKCJzbXBfY29yZTk5X3Byb2JlIiwgMHgzNDUpOwotCWNwdXMgPSBmaXJzdGNwdSA9IGZpbmRfdHlwZV9kZXZpY2VzKCJjcHUiKTsKLQl3aGlsZShjcHVzICE9IE5VTEwpIHsKLQkJdTMyICpyZWdwcm9wID0gKHUzMiAqKWdldF9wcm9wZXJ0eShjcHVzLCAicmVnIiwgTlVMTCk7Ci0JCWNoYXIgKnN0YXRlcHJvcCA9IChjaGFyICopZ2V0X3Byb3BlcnR5KGNwdXMsICJzdGF0ZSIsIE5VTEwpOwotCQlpZiAocmVncHJvcCAhPSBOVUxMICYmIHN0YXRlcHJvcCAhPSBOVUxMICYmCi0JCSAgICAhc3RybmNtcChzdGF0ZXByb3AsICJydW5uaW5nIiwgNykpCi0JCQlib290X2NwdSA9ICpyZWdwcm9wOwotCQkrK25jcHVzOwotCQljcHVzID0gY3B1cy0+bmV4dDsKLQl9Ci0JaWYgKGJvb3RfY3B1ID09IC0xKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJDb3VsZG4ndCBkZXRlY3QgYm9vdCBDUFUgIVxuIik7Ci0JaWYgKGJvb3RfY3B1ICE9IDApCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkJvb3QgQ1BVIGlzICVkLCB1bnN1cHBvcnRlZCBzZXR1cCAhXG4iLCBib290X2NwdSk7Ci0KLQlpZiAobWFjaGluZV9pc19jb21wYXRpYmxlKCJNYWNSSVNDNCIpKSB7Ci0JCWV4dGVybiBzdHJ1Y3Qgc21wX29wc190IGNvcmU5OV9zbXBfb3BzOwotCi0JCWNvcmU5OV9zbXBfb3BzLnRha2VfdGltZWJhc2UgPSBzbXBfZ2VuZXJpY190YWtlX3RpbWViYXNlOwotCQljb3JlOTlfc21wX29wcy5naXZlX3RpbWViYXNlID0gc21wX2dlbmVyaWNfZ2l2ZV90aW1lYmFzZTsKLQl9IGVsc2UgewotCQlpZiAoZmlyc3RjcHUgIT0gTlVMTCkKLQkJCXRicHJvcCA9ICh1MzIgKilnZXRfcHJvcGVydHkoZmlyc3RjcHUsICJ0aW1lYmFzZS1lbmFibGUiLCBOVUxMKTsKLQkJaWYgKHRicHJvcCkKLQkJCWNvcmU5OV90Yl9ncGlvID0gKnRicHJvcDsKLQkJZWxzZQotCQkJY29yZTk5X3RiX2dwaW8gPSBLTF9HUElPX1RCX0VOQUJMRTsKLQl9Ci0KLQlpZiAobmNwdXMgPiAxKSB7Ci0JCW9wZW5waWNfcmVxdWVzdF9JUElzKCk7Ci0JCWZvciAoaSA9IDE7IGkgPCBuY3B1czsgKytpKQotCQkJc21wX2h3X2luZGV4W2ldID0gaTsKLSNpZmRlZiBDT05GSUdfNnh4Ci0JCXBvd2Vyc2F2ZV9uYXAgPSAwOwotI2VuZGlmCi0JCWNvcmU5OV9pbml0X2NhY2hlcygwKTsKLQl9Ci0KLQlyZXR1cm4gbmNwdXM7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBzbXBfY29yZTk5X2tpY2tfY3B1KGludCBucikKLXsKLQl1bnNpZ25lZCBsb25nIHNhdmVfdmVjdG9yLCBuZXdfdmVjdG9yOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICp2ZWN0b3IKLQkJID0gKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKEtFUk5FTEJBU0UrMHgxMDApKTsKLQlpZiAobnIgPCAwIHx8IG5yID4gMykKLQkJcmV0dXJuOwotCWlmIChwcGNfbWQucHJvZ3Jlc3MpIHBwY19tZC5wcm9ncmVzcygic21wX2NvcmU5OV9raWNrX2NwdSIsIDB4MzQ2KTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCi0JLyogU2F2ZSByZXNldCB2ZWN0b3IgKi8KLQlzYXZlX3ZlY3RvciA9ICp2ZWN0b3I7Ci0KLQkvKiBTZXR1cCBmYWtlIHJlc2V0IHZlY3RvciB0aGF0IGRvZXMJCi0JICogICBiIF9fc2Vjb25kYXJ5X3N0YXJ0X3BtYWNfMCArIG5yKjggLSBLRVJORUxCQVNFCi0JICovCi0JbmV3X3ZlY3RvciA9ICh1bnNpZ25lZCBsb25nKSBfX3NlY29uZGFyeV9zdGFydF9wbWFjXzAgKyBuciAqIDg7Ci0JKnZlY3RvciA9IDB4NDgwMDAwMDIgKyBuZXdfdmVjdG9yIC0gS0VSTkVMQkFTRTsKLQotCS8qIGZsdXNoIGRhdGEgY2FjaGUgYW5kIGludmFsIGluc3RydWN0aW9uIGNhY2hlICovCi0JZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKSB2ZWN0b3IsICh1bnNpZ25lZCBsb25nKSB2ZWN0b3IgKyA0KTsKLQotCS8qIFB1dCBzb21lIGxpZmUgaW4gb3VyIGZyaWVuZCAqLwotCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1JFU0VUX0NQVSwgTlVMTCwgbnIsIDApOwotCi0JLyogRklYTUU6IFdlIHdhaXQgYSBiaXQgZm9yIHRoZSBDUFUgdG8gdGFrZSB0aGUgZXhjZXB0aW9uLCBJIHNob3VsZAotCSAqIGluc3RlYWQgd2FpdCBmb3IgdGhlIGVudHJ5IGNvZGUgdG8gc2V0IHNvbWV0aGluZyBmb3IgbWUuIFdlbGwsCi0JICogaWRlYWxseSwgYWxsIHRoYXQgY3JhcCB3aWxsIGJlIGRvbmUgaW4gcHJvbS5jIGFuZCB0aGUgQ1BVIGxlZnQKLQkgKiBpbiBhIFJBTS1iYXNlZCB3YWl0IGxvb3AgbGlrZSBDSFJQLgotCSAqLwotCW1kZWxheSgxKTsKLQotCS8qIFJlc3RvcmUgb3VyIGV4Y2VwdGlvbiB2ZWN0b3IgKi8KLQkqdmVjdG9yID0gc2F2ZV92ZWN0b3I7Ci0JZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKSB2ZWN0b3IsICh1bnNpZ25lZCBsb25nKSB2ZWN0b3IgKyA0KTsKLQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlpZiAocHBjX21kLnByb2dyZXNzKSBwcGNfbWQucHJvZ3Jlc3MoInNtcF9jb3JlOTlfa2lja19jcHUgZG9uZSIsIDB4MzQ3KTsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZpbml0IHNtcF9jb3JlOTlfc2V0dXBfY3B1KGludCBjcHVfbnIpCi17Ci0JLyogU2V0dXAgTDIvTDMgKi8KLQlpZiAoY3B1X25yICE9IDApCi0JCWNvcmU5OV9pbml0X2NhY2hlcyhjcHVfbnIpOwotCi0JLyogU2V0dXAgb3BlbnBpYyAqLwotCWRvX29wZW5waWNfc2V0dXBfY3B1KCk7Ci0KLQlpZiAoY3B1X25yID09IDApIHsKLSNpZmRlZiBDT05GSUdfUE9XRVI0Ci0JCWV4dGVybiB2b2lkIGc1X3BoeV9kaXNhYmxlX2NwdTEodm9pZCk7Ci0KLQkJLyogSWYgd2UgZGlkbid0IHN0YXJ0IHRoZSBzZWNvbmQgQ1BVLCB3ZSBtdXN0IHRha2UKLQkJICogaXQgb2ZmIHRoZSBidXMKLQkJICovCi0JCWlmIChtYWNoaW5lX2lzX2NvbXBhdGlibGUoIk1hY1JJU0M0IikgJiYKLQkJICAgIG51bV9vbmxpbmVfY3B1cygpIDwgMikJCQotCQkJZzVfcGh5X2Rpc2FibGVfY3B1MSgpOwotI2VuZGlmIC8qIENPTkZJR19QT1dFUjQgKi8KLQkJaWYgKHBwY19tZC5wcm9ncmVzcykgcHBjX21kLnByb2dyZXNzKCJjb3JlOTlfc2V0dXBfY3B1IDAgZG9uZSIsIDB4MzQ5KTsKLQl9Ci19Ci0KLS8qIG5vdCBfX2luaXQsIGNhbGxlZCBpbiBzbGVlcC93YWtldXAgY29kZSAqLwotdm9pZCBzbXBfY29yZTk5X3Rha2VfdGltZWJhc2Uodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogdGVsbCB0aGUgcHJpbWFyeSB3ZSdyZSBoZXJlICovCi0Jc2VjX3RiX3Jlc2V0ID0gMTsKLQltYigpOwotCi0JLyogd2FpdCBmb3IgdGhlIHByaW1hcnkgdG8gc2V0IHByaV90Yl9oaS9sbyAqLwotCXdoaWxlIChzZWNfdGJfcmVzZXQgPCAyKQotCQltYigpOwotCi0JLyogc2V0IG91ciBzdHVmZiB0aGUgc2FtZSBhcyB0aGUgcHJpbWFyeSAqLwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlzZXRfZGVjKDEpOwotCXNldF90YihwcmlfdGJfaGksIHByaV90Yl9sbyk7Ci0JbGFzdF9qaWZmeV9zdGFtcChzbXBfcHJvY2Vzc29yX2lkKCkpID0gcHJpX3RiX3N0YW1wOwotCW1iKCk7Ci0KLQkvKiB0ZWxsIHRoZSBwcmltYXJ5IHdlJ3JlIGRvbmUgKi8KLSAgICAgICAJc2VjX3RiX3Jlc2V0ID0gMDsKLQltYigpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotLyogbm90IF9faW5pdCwgY2FsbGVkIGluIHNsZWVwL3dha2V1cCBjb2RlICovCi12b2lkIHNtcF9jb3JlOTlfZ2l2ZV90aW1lYmFzZSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IHQ7Ci0KLQkvKiB3YWl0IGZvciB0aGUgc2Vjb25kYXJ5IHRvIGJlIGluIHRha2VfdGltZWJhc2UgKi8KLQlmb3IgKHQgPSAxMDAwMDA7IHQgPiAwICYmICFzZWNfdGJfcmVzZXQ7IC0tdCkKLQkJdWRlbGF5KDEwKTsKLQlpZiAoIXNlY190Yl9yZXNldCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJUaW1lb3V0IHdhaXRpbmcgc3luYyBvbiBzZWNvbmQgQ1BVXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGZyZWV6ZSB0aGUgdGltZWJhc2UgYW5kIHJlYWQgaXQgKi8KLQkvKiBkaXNhYmxlIGludGVycnVwdHMgc28gdGhlIHRpbWViYXNlIGlzIGRpc2FibGVkIGZvciB0aGUKLQkgICBzaG9ydGVzdCBwb3NzaWJsZSB0aW1lICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1dSSVRFX0dQSU8sIE5VTEwsIGNvcmU5OV90Yl9ncGlvLCA0KTsKLQlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9SRUFEX0dQSU8sIE5VTEwsIGNvcmU5OV90Yl9ncGlvLCAwKTsKLQltYigpOwotCXByaV90Yl9oaSA9IGdldF90YnUoKTsKLQlwcmlfdGJfbG8gPSBnZXRfdGJsKCk7Ci0JcHJpX3RiX3N0YW1wID0gbGFzdF9qaWZmeV9zdGFtcChzbXBfcHJvY2Vzc29yX2lkKCkpOwotCW1iKCk7Ci0KLQkvKiB0ZWxsIHRoZSBzZWNvbmRhcnkgd2UncmUgcmVhZHkgKi8KLQlzZWNfdGJfcmVzZXQgPSAyOwotCW1iKCk7Ci0KLQkvKiB3YWl0IGZvciB0aGUgc2Vjb25kYXJ5IHRvIGhhdmUgdGFrZW4gaXQgKi8KLQlmb3IgKHQgPSAxMDAwMDA7IHQgPiAwICYmIHNlY190Yl9yZXNldDsgLS10KQotCQl1ZGVsYXkoMTApOwotCWlmIChzZWNfdGJfcmVzZXQpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlRpbWVvdXQgd2FpdGluZyBzeW5jKDIpIG9uIHNlY29uZCBDUFVcbiIpOwotCWVsc2UKLQkJc21wX3RiX3N5bmNocm9uaXplZCA9IDE7Ci0KLQkvKiBOb3csIHJlc3RhcnQgdGhlIHRpbWViYXNlIGJ5IGxlYXZpbmcgdGhlIEdQSU8gdG8gYW4gb3BlbiBjb2xsZWN0b3IgKi8KLSAgICAgICAJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfV1JJVEVfR1BJTywgTlVMTCwgY29yZTk5X3RiX2dwaW8sIDApOwotICAgICAgICBwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9SRUFEX0dQSU8sIE5VTEwsIGNvcmU5OV90Yl9ncGlvLCAwKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLQotLyogUG93ZXJTdXJnZS1zdHlsZSBNYWNzICovCi1zdHJ1Y3Qgc21wX29wc190IHBzdXJnZV9zbXBfb3BzID0gewotCS5tZXNzYWdlX3Bhc3MJPSBzbXBfcHN1cmdlX21lc3NhZ2VfcGFzcywKLQkucHJvYmUJCT0gc21wX3BzdXJnZV9wcm9iZSwKLQkua2lja19jcHUJPSBzbXBfcHN1cmdlX2tpY2tfY3B1LAotCS5zZXR1cF9jcHUJPSBzbXBfcHN1cmdlX3NldHVwX2NwdSwKLQkuZ2l2ZV90aW1lYmFzZQk9IHNtcF9wc3VyZ2VfZ2l2ZV90aW1lYmFzZSwKLQkudGFrZV90aW1lYmFzZQk9IHNtcF9wc3VyZ2VfdGFrZV90aW1lYmFzZSwKLX07Ci0KLS8qIENvcmU5OSBNYWNzIChkdWFsIEc0cykgKi8KLXN0cnVjdCBzbXBfb3BzX3QgY29yZTk5X3NtcF9vcHMgPSB7Ci0JLm1lc3NhZ2VfcGFzcwk9IHNtcF9vcGVucGljX21lc3NhZ2VfcGFzcywKLQkucHJvYmUJCT0gc21wX2NvcmU5OV9wcm9iZSwKLQkua2lja19jcHUJPSBzbXBfY29yZTk5X2tpY2tfY3B1LAotCS5zZXR1cF9jcHUJPSBzbXBfY29yZTk5X3NldHVwX2NwdSwKLQkuZ2l2ZV90aW1lYmFzZQk9IHNtcF9jb3JlOTlfZ2l2ZV90aW1lYmFzZSwKLQkudGFrZV90aW1lYmFzZQk9IHNtcF9jb3JlOTlfdGFrZV90aW1lYmFzZSwKLX07Ci0KLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLQotaW50IF9fY3B1X2Rpc2FibGUodm9pZCkKLXsKLQljcHVfY2xlYXIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfb25saW5lX21hcCk7Ci0KLQkvKiBYWFggcmVzZXQgY3B1IGFmZmluaXR5IGhlcmUgKi8KLQlvcGVucGljX3NldF9wcmlvcml0eSgweGYpOwotCWFzbSB2b2xhdGlsZSgibXRkZWMgJTAiIDogOiAiciIgKDB4N2ZmZmZmZmYpKTsKLQltYigpOwotCXVkZWxheSgyMCk7Ci0JYXNtIHZvbGF0aWxlKCJtdGRlYyAlMCIgOiA6ICJyIiAoMHg3ZmZmZmZmZikpOwotCXJldHVybiAwOwotfQotCi1leHRlcm4gdm9pZCBsb3dfY3B1X2RpZSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOyAvKiBpbiBwbWFjX3NsZWVwLlMgKi8KLXN0YXRpYyBpbnQgY3B1X2RlYWRbTlJfQ1BVU107Ci0KLXZvaWQgY3B1X2RpZSh2b2lkKQotewotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JY3B1X2RlYWRbc21wX3Byb2Nlc3Nvcl9pZCgpXSA9IDE7Ci0JbWIoKTsKLQlsb3dfY3B1X2RpZSgpOwotfQotCi12b2lkIF9fY3B1X2RpZSh1bnNpZ25lZCBpbnQgY3B1KQotewotCWludCB0aW1lb3V0OwotCi0JdGltZW91dCA9IDEwMDA7Ci0Jd2hpbGUgKCFjcHVfZGVhZFtjcHVdKSB7Ci0JCWlmICgtLXRpbWVvdXQgPT0gMCkgewotCQkJcHJpbnRrKCJDUFUgJXUgcmVmdXNlZCB0byBkaWUhXG4iLCBjcHUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJbXNsZWVwKDEpOwotCX0KLQljcHVfY2FsbGluX21hcFtjcHVdID0gMDsKLQljcHVfZGVhZFtjcHVdID0gMDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY190aW1lLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY190aW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYjlmY2MuLjAwMDAwMDAKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfdGltZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qCi0gKiBTdXBwb3J0IGZvciBwZXJpb2RpYyBpbnRlcnJ1cHRzICgxMDAgcGVyIHNlY29uZCkgYW5kIGZvciBnZXR0aW5nCi0gKiB0aGUgY3VycmVudCB0aW1lIGZyb20gdGhlIFJUQyBvbiBQb3dlciBNYWNpbnRvc2hlcy4KLSAqCi0gKiBXZSB1c2UgdGhlIGRlY3JlbWVudGVyIHJlZ2lzdGVyIGZvciBvdXIgcGVyaW9kaWMgaW50ZXJydXB0cy4KLSAqCi0gKiBQYXVsIE1hY2tlcnJhcwlBdWd1c3QgMTk5Ni4KLSAqIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcy4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9hZGIuaD4KLSNpbmNsdWRlIDxsaW51eC9jdWRhLmg+Ci0jaW5jbHVkZSA8bGludXgvcG11Lmg+Ci0jaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgotCi0jaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS90aW1lLmg+Ci0jaW5jbHVkZSA8YXNtL252cmFtLmg+Ci0KLS8qIEFwcGFyZW50bHkgdGhlIFJUQyBzdG9yZXMgc2Vjb25kcyBzaW5jZSAxIEphbiAxOTA0ICovCi0jZGVmaW5lIFJUQ19PRkZTRVQJMjA4Mjg0NDgwMAotCi0vKgotICogQ2FsaWJyYXRlIHRoZSBkZWNyZW1lbnRlciBmcmVxdWVuY3kgd2l0aCB0aGUgVklBIHRpbWVyIDEuCi0gKi8KLSNkZWZpbmUgVklBX1RJTUVSX0ZSRVFfNgk0NzAwMDAwCS8qIHRpbWUgMSBmcmVxdWVuY3kgKiA2ICovCi0KLS8qIFZJQSByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUlMJCTB4MjAwCQkvKiBza2lwIGJldHdlZW4gcmVnaXN0ZXJzICovCi0jZGVmaW5lIFQxQ0wJCSg0KlJTKQkJLyogVGltZXIgMSBjdHIvbGF0Y2ggKGxvdyA4IGJpdHMpICovCi0jZGVmaW5lIFQxQ0gJCSg1KlJTKQkJLyogVGltZXIgMSBjb3VudGVyIChoaWdoIDggYml0cykgKi8KLSNkZWZpbmUgVDFMTAkJKDYqUlMpCQkvKiBUaW1lciAxIGxhdGNoIChsb3cgOCBiaXRzKSAqLwotI2RlZmluZSBUMUxICQkoNypSUykJCS8qIFRpbWVyIDEgbGF0Y2ggKGhpZ2ggOCBiaXRzKSAqLwotI2RlZmluZSBBQ1IJCSgxMSpSUykJCS8qIEF1eGlsaWFyeSBjb250cm9sIHJlZ2lzdGVyICovCi0jZGVmaW5lIElGUgkJKDEzKlJTKQkJLyogSW50ZXJydXB0IGZsYWcgcmVnaXN0ZXIgKi8KLQotLyogQml0cyBpbiBBQ1IgKi8KLSNkZWZpbmUgVDFNT0RFCQkweGMwCQkvKiBUaW1lciAxIG1vZGUgKi8KLSNkZWZpbmUgVDFNT0RFX0NPTlQJMHg0MAkJLyogIGNvbnRpbnVvdXMgaW50ZXJydXB0cyAqLwotCi0vKiBCaXRzIGluIElGUiBhbmQgSUVSICovCi0jZGVmaW5lIFQxX0lOVAkJMHg0MAkJLyogVGltZXIgMSBpbnRlcnJ1cHQgKi8KLQotZXh0ZXJuIHN0cnVjdCB0aW1lem9uZSBzeXNfdHo7Ci0KLWxvbmcgX19pbml0Ci1wbWFjX3RpbWVfaW5pdCh2b2lkKQotewotI2lmZGVmIENPTkZJR19OVlJBTQotCXMzMiBkZWx0YSA9IDA7Ci0JaW50IGRzdDsKLQkKLQlkZWx0YSA9ICgoczMyKXBtYWNfeHByYW1fcmVhZChQTUFDX1hQUkFNX01BQ0hJTkVfTE9DICsgMHg5KSkgPDwgMTY7Ci0JZGVsdGEgfD0gKChzMzIpcG1hY194cHJhbV9yZWFkKFBNQUNfWFBSQU1fTUFDSElORV9MT0MgKyAweGEpKSA8PCA4OwotCWRlbHRhIHw9IHBtYWNfeHByYW1fcmVhZChQTUFDX1hQUkFNX01BQ0hJTkVfTE9DICsgMHhiKTsKLQlpZiAoZGVsdGEgJiAweDAwODAwMDAwVUwpCi0JCWRlbHRhIHw9IDB4RkYwMDAwMDBVTDsKLQlkc3QgPSAoKHBtYWNfeHByYW1fcmVhZChQTUFDX1hQUkFNX01BQ0hJTkVfTE9DICsgMHg4KSAmIDB4ODApICE9IDApOwotCXByaW50aygiR01UIERlbHRhIHJlYWQgZnJvbSBYUFJBTTogJWQgbWludXRlcywgRFNUOiAlc1xuIiwgZGVsdGEvNjAsCi0JCWRzdCA/ICJvbiIgOiAib2ZmIik7Ci0JcmV0dXJuIGRlbHRhOwotI2Vsc2UKLQlyZXR1cm4gMDsKLSNlbmRpZgotfQotCi11bnNpZ25lZCBsb25nCi1wbWFjX2dldF9ydGNfdGltZSh2b2lkKQotewotI2lmIGRlZmluZWQoQ09ORklHX0FEQl9DVURBKSB8fCBkZWZpbmVkKENPTkZJR19BREJfUE1VKQotCXN0cnVjdCBhZGJfcmVxdWVzdCByZXE7Ci0JdW5zaWduZWQgbG9uZyBub3c7Ci0jZW5kaWYKLQotCS8qIEdldCB0aGUgdGltZSBmcm9tIHRoZSBSVEMgKi8KLQlzd2l0Y2ggKHN5c19jdHJsZXIpIHsKLSNpZmRlZiBDT05GSUdfQURCX0NVREEKLQljYXNlIFNZU19DVFJMRVJfQ1VEQToKLQkJaWYgKGN1ZGFfcmVxdWVzdCgmcmVxLCBOVUxMLCAyLCBDVURBX1BBQ0tFVCwgQ1VEQV9HRVRfVElNRSkgPCAwKQotCQkJcmV0dXJuIDA7Ci0JCXdoaWxlICghcmVxLmNvbXBsZXRlKQotCQkJY3VkYV9wb2xsKCk7Ci0JCWlmIChyZXEucmVwbHlfbGVuICE9IDcpCi0JCQlwcmludGsoS0VSTl9FUlIgInBtYWNfZ2V0X3J0Y190aW1lOiBnb3QgJWQgYnl0ZSByZXBseVxuIiwKLQkJCSAgICAgICByZXEucmVwbHlfbGVuKTsKLQkJbm93ID0gKHJlcS5yZXBseVszXSA8PCAyNCkgKyAocmVxLnJlcGx5WzRdIDw8IDE2KQotCQkJKyAocmVxLnJlcGx5WzVdIDw8IDgpICsgcmVxLnJlcGx5WzZdOwotCQlyZXR1cm4gbm93IC0gUlRDX09GRlNFVDsKLSNlbmRpZiAvKiBDT05GSUdfQURCX0NVREEgKi8KLSNpZmRlZiBDT05GSUdfQURCX1BNVQotCWNhc2UgU1lTX0NUUkxFUl9QTVU6Ci0JCWlmIChwbXVfcmVxdWVzdCgmcmVxLCBOVUxMLCAxLCBQTVVfUkVBRF9SVEMpIDwgMCkKLQkJCXJldHVybiAwOwotCQl3aGlsZSAoIXJlcS5jb21wbGV0ZSkKLQkJCXBtdV9wb2xsKCk7Ci0JCWlmIChyZXEucmVwbHlfbGVuICE9IDQpCi0JCQlwcmludGsoS0VSTl9FUlIgInBtYWNfZ2V0X3J0Y190aW1lOiBnb3QgJWQgYnl0ZSByZXBseVxuIiwKLQkJCSAgICAgICByZXEucmVwbHlfbGVuKTsKLQkJbm93ID0gKHJlcS5yZXBseVswXSA8PCAyNCkgKyAocmVxLnJlcGx5WzFdIDw8IDE2KQotCQkJKyAocmVxLnJlcGx5WzJdIDw8IDgpICsgcmVxLnJlcGx5WzNdOwotCQlyZXR1cm4gbm93IC0gUlRDX09GRlNFVDsKLSNlbmRpZiAvKiBDT05GSUdfQURCX1BNVSAqLwotCWRlZmF1bHQ6IDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludAotcG1hY19zZXRfcnRjX3RpbWUodW5zaWduZWQgbG9uZyBub3d0aW1lKQotewotI2lmIGRlZmluZWQoQ09ORklHX0FEQl9DVURBKSB8fCBkZWZpbmVkKENPTkZJR19BREJfUE1VKQotCXN0cnVjdCBhZGJfcmVxdWVzdCByZXE7Ci0jZW5kaWYKLQotCW5vd3RpbWUgKz0gUlRDX09GRlNFVDsKLQotCXN3aXRjaCAoc3lzX2N0cmxlcikgewotI2lmZGVmIENPTkZJR19BREJfQ1VEQQotCWNhc2UgU1lTX0NUUkxFUl9DVURBOgotCQlpZiAoY3VkYV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDYsIENVREFfUEFDS0VULCBDVURBX1NFVF9USU1FLAotCQkJCSBub3d0aW1lID4+IDI0LCBub3d0aW1lID4+IDE2LCBub3d0aW1lID4+IDgsIG5vd3RpbWUpIDwgMCkKLQkJCXJldHVybiAwOwotCQl3aGlsZSAoIXJlcS5jb21wbGV0ZSkKLQkJCWN1ZGFfcG9sbCgpOwotCQlpZiAoKHJlcS5yZXBseV9sZW4gIT0gMykgJiYgKHJlcS5yZXBseV9sZW4gIT0gNykpCi0JCQlwcmludGsoS0VSTl9FUlIgInBtYWNfc2V0X3J0Y190aW1lOiBnb3QgJWQgYnl0ZSByZXBseVxuIiwKLQkJCSAgICAgICByZXEucmVwbHlfbGVuKTsKLQkJcmV0dXJuIDE7Ci0jZW5kaWYgLyogQ09ORklHX0FEQl9DVURBICovCi0jaWZkZWYgQ09ORklHX0FEQl9QTVUKLQljYXNlIFNZU19DVFJMRVJfUE1VOgotCQlpZiAocG11X3JlcXVlc3QoJnJlcSwgTlVMTCwgNSwgUE1VX1NFVF9SVEMsCi0JCQkJbm93dGltZSA+PiAyNCwgbm93dGltZSA+PiAxNiwgbm93dGltZSA+PiA4LCBub3d0aW1lKSA8IDApCi0JCQlyZXR1cm4gMDsKLQkJd2hpbGUgKCFyZXEuY29tcGxldGUpCi0JCQlwbXVfcG9sbCgpOwotCQlpZiAocmVxLnJlcGx5X2xlbiAhPSAwKQotCQkJcHJpbnRrKEtFUk5fRVJSICJwbWFjX3NldF9ydGNfdGltZTogZ290ICVkIGJ5dGUgcmVwbHlcbiIsCi0JCQkgICAgICAgcmVxLnJlcGx5X2xlbik7Ci0JCXJldHVybiAxOwotI2VuZGlmIC8qIENPTkZJR19BREJfUE1VICovCi0JZGVmYXVsdDoKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi0vKgotICogQ2FsaWJyYXRlIHRoZSBkZWNyZW1lbnRlciByZWdpc3RlciB1c2luZyBWSUEgdGltZXIgMS4KLSAqIFRoaXMgaXMgdXNlZCBib3RoIG9uIHBvd2VybWFjcyBhbmQgQ0hSUCBtYWNoaW5lcy4KLSAqLwotaW50IF9faW5pdAotdmlhX2NhbGlicmF0ZV9kZWNyKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICp2aWFzOwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19pb21lbSAqdmlhOwotCWludCBjb3VudCA9IFZJQV9USU1FUl9GUkVRXzYgLyAxMDA7Ci0JdW5zaWduZWQgaW50IGRzdGFydCwgZGVuZDsKLQotCXZpYXMgPSBmaW5kX2RldmljZXMoInZpYS1jdWRhIik7Ci0JaWYgKHZpYXMgPT0gMCkKLQkJdmlhcyA9IGZpbmRfZGV2aWNlcygidmlhLXBtdSIpOwotCWlmICh2aWFzID09IDApCi0JCXZpYXMgPSBmaW5kX2RldmljZXMoInZpYSIpOwotCWlmICh2aWFzID09IDAgfHwgdmlhcy0+bl9hZGRycyA9PSAwKQotCQlyZXR1cm4gMDsKLQl2aWEgPSBpb3JlbWFwKHZpYXMtPmFkZHJzWzBdLmFkZHJlc3MsIHZpYXMtPmFkZHJzWzBdLnNpemUpOwotCi0JLyogc2V0IHRpbWVyIDEgZm9yIGNvbnRpbnVvdXMgaW50ZXJydXB0cyAqLwotCW91dF84KCZ2aWFbQUNSXSwgKHZpYVtBQ1JdICYgflQxTU9ERSkgfCBUMU1PREVfQ09OVCk7Ci0JLyogc2V0IHRoZSBjb3VudGVyIHRvIGEgc21hbGwgdmFsdWUgKi8KLQlvdXRfOCgmdmlhW1QxQ0hdLCAyKTsKLQkvKiBzZXQgdGhlIGxhdGNoIHRvIGBjb3VudCcgKi8KLQlvdXRfOCgmdmlhW1QxTExdLCBjb3VudCk7Ci0Jb3V0XzgoJnZpYVtUMUxIXSwgY291bnQgPj4gOCk7Ci0JLyogd2FpdCB1bnRpbCBpdCBoaXRzIDAgKi8KLQl3aGlsZSAoKGluXzgoJnZpYVtJRlJdKSAmIFQxX0lOVCkgPT0gMCkKLQkJOwotCWRzdGFydCA9IGdldF9kZWMoKTsKLQkvKiBjbGVhciB0aGUgaW50ZXJydXB0ICYgd2FpdCB1bnRpbCBpdCBoaXRzIDAgYWdhaW4gKi8KLQlpbl84KCZ2aWFbVDFDTF0pOwotCXdoaWxlICgoaW5fOCgmdmlhW0lGUl0pICYgVDFfSU5UKSA9PSAwKQotCQk7Ci0JZGVuZCA9IGdldF9kZWMoKTsKLQotCXRiX3RpY2tzX3Blcl9qaWZmeSA9IChkc3RhcnQgLSBkZW5kKSAvICgoNiAqIEhaKS8xMDApOwotCXRiX3RvX3VzID0gbXVsaHd1X3NjYWxlX2ZhY3Rvcihkc3RhcnQgLSBkZW5kLCA2MDAwMCk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJ2aWFfY2FsaWJyYXRlX2RlY3I6IHRpY2tzIHBlciBqaWZmeSA9ICV1ICgldSB0aWNrcylcbiIsCi0JICAgICAgIHRiX3RpY2tzX3Blcl9qaWZmeSwgZHN0YXJ0IC0gZGVuZCk7Ci0KLQlpb3VubWFwKHZpYSk7Ci0JCi0JcmV0dXJuIDE7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE0KLS8qCi0gKiBSZXNldCB0aGUgdGltZSBhZnRlciBhIHNsZWVwLgotICovCi1zdGF0aWMgaW50Ci10aW1lX3NsZWVwX25vdGlmeShzdHJ1Y3QgcG11X3NsZWVwX25vdGlmaWVyICpzZWxmLCBpbnQgd2hlbikKLXsKLQlzdGF0aWMgdW5zaWduZWQgbG9uZyB0aW1lX2RpZmY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIHNlcTsKLQotCXN3aXRjaCAod2hlbikgewotCWNhc2UgUEJPT0tfU0xFRVBfTk9XOgotCQlkbyB7Ci0JCQlzZXEgPSByZWFkX3NlcWJlZ2luX2lycXNhdmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKLQkJCXRpbWVfZGlmZiA9IHh0aW1lLnR2X3NlYyAtIHBtYWNfZ2V0X3J0Y190aW1lKCk7Ci0JCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnlfaXJxcmVzdG9yZSgmeHRpbWVfbG9jaywgc2VxLCBmbGFncykpOwotCQlicmVhazsKLQljYXNlIFBCT09LX1dBS0U6Ci0JCXdyaXRlX3NlcWxvY2tfaXJxc2F2ZSgmeHRpbWVfbG9jaywgZmxhZ3MpOwotCQl4dGltZS50dl9zZWMgPSBwbWFjX2dldF9ydGNfdGltZSgpICsgdGltZV9kaWZmOwotCQl4dGltZS50dl9uc2VjID0gMDsKLQkJbGFzdF9ydGNfdXBkYXRlID0geHRpbWUudHZfc2VjOwotCQl3cml0ZV9zZXF1bmxvY2tfaXJxcmVzdG9yZSgmeHRpbWVfbG9jaywgZmxhZ3MpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIFBCT09LX1NMRUVQX09LOwotfQotCi1zdGF0aWMgc3RydWN0IHBtdV9zbGVlcF9ub3RpZmllciB0aW1lX3NsZWVwX25vdGlmaWVyID0gewotCXRpbWVfc2xlZXBfbm90aWZ5LCBTTEVFUF9MRVZFTF9NSVNDLAotfTsKLSNlbmRpZiAvKiBDT05GSUdfUE0gKi8KLQotLyoKLSAqIFF1ZXJ5IHRoZSBPRiBhbmQgZ2V0IHRoZSBkZWNyIGZyZXF1ZW5jeS4KLSAqIFRoaXMgd2FzIHRha2VuIGZyb20gdGhlIHBtYWMgdGltZV9pbml0KCkgd2hlbiBtZXJnaW5nIHRoZSBwcmVwL3BtYWMKLSAqIHRpbWUgZnVuY3Rpb25zLgotICovCi12b2lkIF9faW5pdAotcG1hY19jYWxpYnJhdGVfZGVjcih2b2lkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1OwotCXVuc2lnbmVkIGludCBmcmVxLCAqZnA7Ci0KLSNpZmRlZiBDT05GSUdfUE0KLQlwbXVfcmVnaXN0ZXJfc2xlZXBfbm90aWZpZXIoJnRpbWVfc2xlZXBfbm90aWZpZXIpOwotI2VuZGlmIC8qIENPTkZJR19QTSAqLwotCi0JLyogV2UgYXNzdW1lIE1hY1JJU0MyIG1hY2hpbmVzIGhhdmUgY29ycmVjdCBkZXZpY2UtdHJlZQotCSAqIGNhbGlicmF0aW9uLiBUaGF0J3MgYmV0dGVyIHNpbmNlIHRoZSBWSUEgaXRzZWxmIHNlZW1zCi0JICogdG8gYmUgc2xpZ2h0bHkgb2ZmLiAtLUJlbkgKLQkgKi8KLQlpZiAoIW1hY2hpbmVfaXNfY29tcGF0aWJsZSgiTWFjUklTQzIiKSAmJgotCSAgICAhbWFjaGluZV9pc19jb21wYXRpYmxlKCJNYWNSSVNDMyIpICYmCi0JICAgICFtYWNoaW5lX2lzX2NvbXBhdGlibGUoIk1hY1JJU0M0IikpCi0JCWlmICh2aWFfY2FsaWJyYXRlX2RlY3IoKSkKLQkJCXJldHVybjsKLQotCS8qIFNwZWNpYWwgY2FzZTogUXVpY2tTaWx2ZXIgRzRzIHNlZW0gdG8gaGF2ZSBhIGJhZGx5IGNhbGlicmF0ZWQKLQkgKiB0aW1lYmFzZS1mcmVxdWVuY3kgaW4gT0YsIFZJQSBpcyBtdWNoIGJldHRlciBvbiB0aGVzZS4gV2Ugc2hvdWxkCi0JICogcHJvYmFibHkgaW1wbGVtZW50IGNhbGlicmF0aW9uIGJhc2VkIG9uIHRoZSBLTCB0aW1lciBvbiB0aGVzZQotCSAqIG1hY2hpbmVzIGFueXdheS4uLiAtQmVuSAotCSAqLwotCWlmIChtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyTWFjMyw1IikpCi0JCWlmICh2aWFfY2FsaWJyYXRlX2RlY3IoKSkKLQkJCXJldHVybjsKLQkvKgotCSAqIFRoZSBjcHUgbm9kZSBzaG91bGQgaGF2ZSBhIHRpbWViYXNlLWZyZXF1ZW5jeSBwcm9wZXJ0eQotCSAqIHRvIHRlbGwgdXMgdGhlIHJhdGUgYXQgd2hpY2ggdGhlIGRlY3JlbWVudGVyIGNvdW50cy4KLQkgKi8KLQljcHUgPSBmaW5kX3R5cGVfZGV2aWNlcygiY3B1Iik7Ci0JaWYgKGNwdSA9PSAwKQotCQlwYW5pYygiY2FuJ3QgZmluZCBjcHUgbm9kZSBpbiB0aW1lX2luaXQiKTsKLQlmcCA9ICh1bnNpZ25lZCBpbnQgKikgZ2V0X3Byb3BlcnR5KGNwdSwgInRpbWViYXNlLWZyZXF1ZW5jeSIsIE5VTEwpOwotCWlmIChmcCA9PSAwKQotCQlwYW5pYygiY2FuJ3QgZ2V0IGNwdSB0aW1lYmFzZSBmcmVxdWVuY3kiKTsKLQlmcmVxID0gKmZwOwotCXByaW50aygidGltZV9pbml0OiBkZWNyZW1lbnRlciBmcmVxdWVuY3kgPSAldS4lLjZ1IE1IelxuIiwKLQkgICAgICAgZnJlcS8xMDAwMDAwLCBmcmVxJTEwMDAwMDApOwotCXRiX3RpY2tzX3Blcl9qaWZmeSA9IGZyZXEgLyBIWjsKLQl0Yl90b191cyA9IG11bGh3dV9zY2FsZV9mYWN0b3IoZnJlcSwgMTAwMDAwMCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcHJlcF9zZXR1cC5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3ByZXBfc2V0dXAuYwppbmRleCA0NDE1NzQ4Li5kMDY1MzU4IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcHJlcF9zZXR1cC5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9wcmVwX3NldHVwLmMKQEAgLTcyLDcgKzcyLDYgQEAKIAogVE9EQ19BTExPQygpOwogCi11bnNpZ25lZCBjaGFyIHVjU3lzdGVtVHlwZTsKIHVuc2lnbmVkIGNoYXIgdWNCb2FyZFJldjsKIHVuc2lnbmVkIGNoYXIgdWNCb2FyZFJldk1haiwgdWNCb2FyZFJldk1pbjsKIApAQCAtOTU0LDcgKzk1Myw2IEBACiBzdGF0aWMgdm9pZCBfX2luaXQKIHByZXBfaW5pdF9JUlEodm9pZCkKIHsKLQlpbnQgaTsKIAl1bnNpZ25lZCBpbnQgcGNpX3ZpZGRpZCwgcGNpX2RpZDsKIAogCWlmIChPcGVuUElDX0FkZHIgIT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL01ha2VmaWxlIGIvYXJjaC9wcGMvc3lzbGliL01ha2VmaWxlCmluZGV4IDViN2YyYjguLjE1OWRjZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9NYWtlZmlsZQorKysgYi9hcmNoL3BwYy9zeXNsaWIvTWFrZWZpbGUKQEAgLTM5LDggKzM5LDYgQEAKIAkJCQkgICBwcGNfc3lzLm8gbXBjOHh4X2RldmljZXMubyBtcGM4eHhfc3lzLm8KIG9iai0kKENPTkZJR19QQ0lfUVNQQU4pCQkrPSBxc3Bhbl9wY2kubwogb2JqLSQoQ09ORklHX1BQQ19PRikJCSs9IHByb21faW5pdC5vIHByb20ubwotb2JqLSQoQ09ORklHX1BQQ19QTUFDKQkJKz0gb3Blbl9waWMubwotb2JqLSQoQ09ORklHX1BPV0VSNCkJCSs9IG9wZW5fcGljMi5vCiBvYmotJChDT05GSUdfUFBDX0NIUlApCQkrPSBvcGVuX3BpYy5vCiBvYmotJChDT05GSUdfUFBDX1BSRVApCQkrPSBvcGVuX3BpYy5vIHRvZGNfdGltZS5vCiBvYmotJChDT05GSUdfQkFNQk9PKQkJKz0gcGNpX2F1dG8ubyB0b2RjX3RpbWUubwpAQCAtOTYsNyArOTQsNyBAQAogb2JqLSQoQ09ORklHX1BDSSkJCSs9IHBjaV9hdXRvLm8KIGVuZGlmCiBvYmotJChDT05GSUdfUkFQSURJTykJCSs9IHBwYzg1eHhfcmlvLm8KLW9iai0kKENPTkZJR184M3h4KQkJKz0gaXBpYy5vIHBwYzgzeHhfc2V0dXAubyBwcGNfc3lzLm8gXAorb2JqLSQoQ09ORklHXzgzeHgpCQkrPSBwcGM4M3h4X3NldHVwLm8gcHBjX3N5cy5vIFwKIAkJCQkJbXBjODN4eF9zeXMubyBtcGM4M3h4X2RldmljZXMubwogaWZlcSAoJChDT05GSUdfODN4eCkseSkKIG9iai0kKENPTkZJR19QQ0kpCQkrPSBwY2lfYXV0by5vCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvbTh4eF9zZXR1cC5jIGIvYXJjaC9wcGMvc3lzbGliL204eHhfc2V0dXAuYwppbmRleCAxY2MzYWJlLi42ODg2MTZkIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvbTh4eF9zZXR1cC5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9tOHh4X3NldHVwLmMKQEAgLTEzNSw2ICsxMzUsMTYgQEAKIAkubmFtZSA9ICJ0YmludCIsCiB9OwogCisvKiBwZXItYm9hcmQgb3ZlcnJpZGFibGUgaW5pdF9pbnRlcm5hbF9ydGMoKSBmdW5jdGlvbi4gKi8KK3ZvaWQgX19pbml0IF9fYXR0cmlidXRlX18gKCh3ZWFrKSkKK2luaXRfaW50ZXJuYWxfcnRjKHZvaWQpCit7CisJLyogRGlzYWJsZSB0aGUgUlRDIG9uZSBzZWNvbmQgYW5kIGFsYXJtIGludGVycnVwdHMuICovCisJb3V0X2JlMTYoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3NpdC5zaXRfcnRjc2MsIGluX2JlMTYoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3NpdC5zaXRfcnRjc2MpICYgfihSVENTQ19TSUUgfCBSVENTQ19BTEUpKTsKKwkvKiBFbmFibGUgdGhlIFJUQyAqLworCW91dF9iZTE2KCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9zaXQuc2l0X3J0Y3NjLCBpbl9iZTE2KCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9zaXQuc2l0X3J0Y3NjKSB8IChSVENTQ19SVEYgfCBSVENTQ19SVEUpKTsKK30KKwogLyogVGhlIGRlY3JlbWVudGVyIGNvdW50cyBhdCB0aGUgc3lzdGVtIChpbnRlcm5hbCkgY2xvY2sgZnJlcXVlbmN5IGRpdmlkZWQgYnkKICAqIHNpeHRlZW4sIG9yIGV4dGVybmFsIG9zY2lsbGF0b3IgZGl2aWRlZCBieSBmb3VyLiAgV2UgZm9yY2UgdGhlIHByb2Nlc3NvcgogICogdG8gdXNlIHN5c3RlbSBjbG9jayBkaXZpZGVkIGJ5IHNpeHRlZW4uCkBAIC0xODMsMTAgKzE5Myw3IEBACiAJb3V0X2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3NpdGsuc2l0a19ydGNzY2ssIEtBUFdSX0tFWSk7CiAJb3V0X2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3NpdGsuc2l0a190YmssIEtBUFdSX0tFWSk7CiAKLQkvKiBEaXNhYmxlIHRoZSBSVEMgb25lIHNlY29uZCBhbmQgYWxhcm0gaW50ZXJydXB0cy4gKi8KLQlvdXRfYmUxNigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fc2l0LnNpdF9ydGNzYywgaW5fYmUxNigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fc2l0LnNpdF9ydGNzYykgJiB+KFJUQ1NDX1NJRSB8IFJUQ1NDX0FMRSkpOwotCS8qIEVuYWJsZSB0aGUgUlRDICovCi0Jb3V0X2JlMTYoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3NpdC5zaXRfcnRjc2MsIGluX2JlMTYoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3NpdC5zaXRfcnRjc2MpIHwgKFJUQ1NDX1JURiB8IFJUQ1NDX1JURSkpOworCWluaXRfaW50ZXJuYWxfcnRjKCk7CiAKIAkvKiBFbmFibGluZyB0aGUgZGVjcmVtZW50ZXIgYWxzbyBlbmFibGVzIHRoZSB0aW1lYmFzZSBpbnRlcnJ1cHRzCiAJICogKG9yIGZyb20gdGhlIG90aGVyIHBvaW50IG9mIHZpZXcsIHRvIGdldCBkZWNyZW1lbnRlciBpbnRlcnJ1cHRzCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvbTh4eF93ZHQuYyBiL2FyY2gvcHBjL3N5c2xpYi9tOHh4X3dkdC5jCmluZGV4IGEyMTYzMmQuLmRmNmM5NTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9tOHh4X3dkdC5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9tOHh4X3dkdC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8c3lzbGliL204eHhfd2R0Lmg+CiAKIHN0YXRpYyBpbnQgd2R0X3RpbWVvdXQ7CitpbnQgbTh4eF9oYXNfaW50ZXJuYWxfcnRjID0gMDsKIAogc3RhdGljIGlycXJldHVybl90IG04eHhfd2R0X2ludGVycnVwdChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBtOHh4X3dkdF9pcnFhY3Rpb24gPSB7CkBAIC00NSwzNSArNDYsMTUgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXZvaWQgX19pbml0IG04eHhfd2R0X2hhbmRsZXJfaW5zdGFsbChiZF90ICogYmluZm8pCisjZGVmaW5lIFNZUENSX1NXUCAweDEKKyNkZWZpbmUgU1lQQ1JfU1dFIDB4NAorCisKK3ZvaWQgX19pbml0IG04eHhfd2R0X2luc3RhbGxfaXJxKHZvbGF0aWxlIGltbWFwX3QgKmltYXAsIGJkX3QgKmJpbmZvKQogewotCXZvbGF0aWxlIGltbWFwX3QgKmltYXAgPSAodm9sYXRpbGUgaW1tYXBfdCAqKUlNQVBfQUREUjsKIAl1MzIgcGl0YzsKLQl1MzIgc3lwY3I7CiAJdTMyIHBpdHJ0Y2xrOwogCi0Jc3lwY3IgPSBpbl9iZTMyKCZpbWFwLT5pbV9zaXVfY29uZi5zY19zeXBjcik7Ci0KLQlpZiAoIShzeXBjciAmIDB4MDQpKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAibTh4eF93ZHQ6IHdkdCBkaXNhYmxlZCAoU1lQQ1I6IDB4JTA4WClcbiIsCi0JCSAgICAgICBzeXBjcik7Ci0JCXJldHVybjsKLQl9Ci0KLQltOHh4X3dkdF9yZXNldCgpOwotCi0JcHJpbnRrKEtFUk5fTk9USUNFCi0JICAgICAgICJtOHh4X3dkdDogYWN0aXZlIHdkdCBmb3VuZCAoU1dUQzogMHglMDRYLCBTV1A6IDB4JTAxWClcbiIsCi0JICAgICAgIChzeXBjciA+PiAxNiksIHN5cGNyICYgMHgwMSk7Ci0KLQl3ZHRfdGltZW91dCA9IChzeXBjciA+PiAxNikgJiAweEZGRkY7Ci0KLQlpZiAoIXdkdF90aW1lb3V0KQotCQl3ZHRfdGltZW91dCA9IDB4RkZGRjsKLQotCWlmIChzeXBjciAmIDB4MDEpCi0JCXdkdF90aW1lb3V0ICo9IDIwNDg7Ci0KIAkvKgogCSAqIEZpcmUgdHJpZ2dlciBpZiBoYWxmIG9mIHRoZSB3ZHQgdGlja2VkIGRvd24gCiAJICovCkBAIC05OCw2ICs3OSw2NyBAQAogCXByaW50ayhLRVJOX05PVElDRQogCSAgICAgICAibTh4eF93ZHQ6IGtlZXAtYWxpdmUgdHJpZ2dlciBpbnN0YWxsZWQgKFBJVEM6IDB4JTA0WClcbiIsIHBpdGMpOwogCit9CisKK3N0YXRpYyB2b2lkIG04eHhfd2R0X3RpbWVyX2Z1bmModW5zaWduZWQgbG9uZyBkYXRhKTsKKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IG04eHhfd2R0X3RpbWVyID0KKwlUSU1FUl9JTklUSUFMSVpFUihtOHh4X3dkdF90aW1lcl9mdW5jLCAwLCAwKTsKKwordm9pZCBtOHh4X3dkdF9zdG9wX3RpbWVyKHZvaWQpCit7CisJZGVsX3RpbWVyKCZtOHh4X3dkdF90aW1lcik7Cit9CisKK3ZvaWQgbTh4eF93ZHRfaW5zdGFsbF90aW1lcih2b2lkKQoreworCW04eHhfd2R0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaLzIpOworCWFkZF90aW1lcigmbTh4eF93ZHRfdGltZXIpOworfQorCitzdGF0aWMgdm9pZCBtOHh4X3dkdF90aW1lcl9mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwltOHh4X3dkdF9yZXNldCgpOworCW04eHhfd2R0X2luc3RhbGxfdGltZXIoKTsKK30KKwordm9pZCBfX2luaXQgbTh4eF93ZHRfaGFuZGxlcl9pbnN0YWxsKGJkX3QgKiBiaW5mbykKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbWFwID0gKHZvbGF0aWxlIGltbWFwX3QgKilJTUFQX0FERFI7CisJdTMyIHN5cGNyOworCisJc3lwY3IgPSBpbl9iZTMyKCZpbWFwLT5pbV9zaXVfY29uZi5zY19zeXBjcik7CisKKwlpZiAoIShzeXBjciAmIFNZUENSX1NXRSkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJtOHh4X3dkdDogd2R0IGRpc2FibGVkIChTWVBDUjogMHglMDhYKVxuIiwKKwkJICAgICAgIHN5cGNyKTsKKwkJcmV0dXJuOworCX0KKworCW04eHhfd2R0X3Jlc2V0KCk7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UKKwkgICAgICAgIm04eHhfd2R0OiBhY3RpdmUgd2R0IGZvdW5kIChTV1RDOiAweCUwNFgsIFNXUDogMHglMDFYKVxuIiwKKwkgICAgICAgKHN5cGNyID4+IDE2KSwgc3lwY3IgJiBTWVBDUl9TV1ApOworCisJd2R0X3RpbWVvdXQgPSAoc3lwY3IgPj4gMTYpICYgMHhGRkZGOworCisJaWYgKCF3ZHRfdGltZW91dCkKKwkJd2R0X3RpbWVvdXQgPSAweEZGRkY7CisKKwlpZiAoc3lwY3IgJiBTWVBDUl9TV1ApCisJCXdkdF90aW1lb3V0ICo9IDIwNDg7CisKKwltOHh4X2hhc19pbnRlcm5hbF9ydGMgPSBpbl9iZTE2KCZpbWFwLT5pbV9zaXQuc2l0X3J0Y3NjKSAmIFJUQ1NDX1JURTsKKworCS8qIGlmIHRoZSBpbnRlcm5hbCBSVEMgaXMgb2ZmIHVzZSBhIGtlcm5lbCB0aW1lciAqLworCWlmICghbTh4eF9oYXNfaW50ZXJuYWxfcnRjKSB7CisJCWlmICh3ZHRfdGltZW91dCA8IChiaW5mby0+YmlfaW50ZnJlcS9IWikpCisJCQlwcmludGsoS0VSTl9FUlIgIm04eHhfd2R0OiB0aW1lb3V0IHRvbyBzaG9ydCBmb3Iga3RpbWVyIVxuIik7CisJCW04eHhfd2R0X2luc3RhbGxfdGltZXIoKTsKKwl9IGVsc2UKKwkJbTh4eF93ZHRfaW5zdGFsbF9pcnEoaW1hcCwgYmluZm8pOworCiAJd2R0X3RpbWVvdXQgLz0gYmluZm8tPmJpX2ludGZyZXE7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9tOHh4X3dkdC5oIGIvYXJjaC9wcGMvc3lzbGliL204eHhfd2R0LmgKaW5kZXggMGQ4MWE5Zi4uZTc1ODM1ZiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL204eHhfd2R0LmgKKysrIGIvYXJjaC9wcGMvc3lzbGliL204eHhfd2R0LmgKQEAgLTksOCArOSwxMiBAQAogI2lmbmRlZiBfUFBDX1NZU0xJQl9NOFhYX1dEVF9ICiAjZGVmaW5lIF9QUENfU1lTTElCX004WFhfV0RUX0gKIAorZXh0ZXJuIGludCBtOHh4X2hhc19pbnRlcm5hbF9ydGM7CisKIGV4dGVybiB2b2lkIG04eHhfd2R0X2hhbmRsZXJfaW5zdGFsbChiZF90ICogYmluZm8pOwogZXh0ZXJuIGludCBtOHh4X3dkdF9nZXRfdGltZW91dCh2b2lkKTsKIGV4dGVybiB2b2lkIG04eHhfd2R0X3Jlc2V0KHZvaWQpOworZXh0ZXJuIHZvaWQgbTh4eF93ZHRfaW5zdGFsbF90aW1lcih2b2lkKTsKK2V4dGVybiB2b2lkIG04eHhfd2R0X3N0b3BfdGltZXIodm9pZCk7CiAKICNlbmRpZgkJCQkvKiBfUFBDX1NZU0xJQl9NOFhYX1dEVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvbXBjODN4eF9kZXZpY2VzLmMgYi9hcmNoL3BwYy9zeXNsaWIvbXBjODN4eF9kZXZpY2VzLmMKaW5kZXggODQ3ZGY0NC4uZjliOTVkZSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL21wYzgzeHhfZGV2aWNlcy5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9tcGM4M3h4X2RldmljZXMuYwpAQCAtMjgsNyArMjgsNiBAQAogICovCiAKIHN0cnVjdCBnaWFuZmFyX21kaW9fZGF0YSBtcGM4M3h4X21kaW9fcGRhdGEgPSB7Ci0JLnBhZGRyID0gMHgyNDUyMCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhIG1wYzgzeHhfdHNlYzFfcGRhdGEgPSB7CkBAIC0yMjYsNyArMjI1LDE0IEBACiAJCS5uYW1lID0gImZzbC1naWFuZmFyX21kaW8iLAogCQkuaWQgPSAwLAogCQkuZGV2LnBsYXRmb3JtX2RhdGEgPSAmbXBjODN4eF9tZGlvX3BkYXRhLAotCQkubnVtX3Jlc291cmNlcyA9IDAsCisJCS5udW1fcmVzb3VyY2VzID0gMSwKKwkJLnJlc291cmNlID0gKHN0cnVjdCByZXNvdXJjZVtdKSB7CisJCQl7CisJCQkJLnN0YXJ0CT0gMHgyNDUyMCwKKwkJCQkuZW5kCT0gMHgyNDUzZiwKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwkJCX0sCisJCX0sCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9tcGM4NXh4X2RldmljZXMuYyBiL2FyY2gvcHBjL3N5c2xpYi9tcGM4NXh4X2RldmljZXMuYwppbmRleCA2OTk0OWQyLi4wMGU5YjZmZiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL21wYzg1eHhfZGV2aWNlcy5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9tcGM4NXh4X2RldmljZXMuYwpAQCAtMjYsNyArMjYsNiBAQAogICogd2hhdCBDQ1NSQkFSIGlzLCB3aWxsIGdldCBmaXhlZCB1cCBieSBtYWNoX21wYzg1eHhfZml4dXAKICAqLwogc3RydWN0IGdpYW5mYXJfbWRpb19kYXRhIG1wYzg1eHhfbWRpb19wZGF0YSA9IHsKLQkucGFkZHIgPSBNUEM4NXh4X01JSU1fT0ZGU0VULAogfTsKIAogc3RhdGljIHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgbXBjODV4eF90c2VjMV9wZGF0YSA9IHsKQEAgLTcyMCw3ICs3MTksMTQgQEAKIAkJLm5hbWUgPSAiZnNsLWdpYW5mYXJfbWRpbyIsCiAJCS5pZCA9IDAsCiAJCS5kZXYucGxhdGZvcm1fZGF0YSA9ICZtcGM4NXh4X21kaW9fcGRhdGEsCi0JCS5udW1fcmVzb3VyY2VzID0gMCwKKwkJLm51bV9yZXNvdXJjZXMgPSAxLAorCQkucmVzb3VyY2UgPSAoc3RydWN0IHJlc291cmNlW10pIHsKKwkJCXsKKwkJCQkuc3RhcnQJPSAweDI0NTIwLAorCQkJCS5lbmQJPSAweDI0NTNmLAorCQkJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCQkJfSwKKwkJfSwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL29jcC5jIGIvYXJjaC9wcGMvc3lzbGliL29jcC5jCmluZGV4IDljY2NlNDMuLmFiMzRiMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9vY3AuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvb2NwLmMKQEAgLTE4OSw2ICsxODksOCBAQAogc3RydWN0IGJ1c190eXBlIG9jcF9idXNfdHlwZSA9IHsKIAkubmFtZSA9ICJvY3AiLAogCS5tYXRjaCA9IG9jcF9kZXZpY2VfbWF0Y2gsCisJLnByb2JlID0gb2NwX2RyaXZlcl9wcm9iZSwKKwkucmVtb3ZlID0gb2NwX2RyaXZlcl9yZW1vdmUsCiAJLnN1c3BlbmQgPSBvY3BfZGV2aWNlX3N1c3BlbmQsCiAJLnJlc3VtZSA9IG9jcF9kZXZpY2VfcmVzdW1lLAogfTsKQEAgLTIxMCw4ICsyMTIsNiBAQAogCS8qIGluaXRpYWxpemUgY29tbW9uIGRyaXZlciBmaWVsZHMgKi8KIAlkcnYtPmRyaXZlci5uYW1lID0gZHJ2LT5uYW1lOwogCWRydi0+ZHJpdmVyLmJ1cyA9ICZvY3BfYnVzX3R5cGU7Ci0JZHJ2LT5kcml2ZXIucHJvYmUgPSBvY3BfZGV2aWNlX3Byb2JlOwotCWRydi0+ZHJpdmVyLnJlbW92ZSA9IG9jcF9kZXZpY2VfcmVtb3ZlOwogCiAJLyogcmVnaXN0ZXIgd2l0aCBjb3JlICovCiAJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL3Byb20uYyBiL2FyY2gvcHBjL3N5c2xpYi9wcm9tLmMKaW5kZXggYWY0ZGVhYy4uNDgyZjgzNyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL3Byb20uYworKysgYi9hcmNoL3BwYy9zeXNsaWIvcHJvbS5jCkBAIC03MCw4ICs3MCw2IEBACiBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRmbHRfaW50ZXJydXB0X2NvbnRyb2xsZXI7CiBpbnQgbnVtX2ludGVycnVwdF9jb250cm9sbGVyczsKIAotaW50IHBtYWNfbmV3d29ybGQ7Ci0KIGV4dGVybiB1bnNpZ25lZCBpbnQgcnRhc19lbnRyeTsgIC8qIHBoeXNpY2FsIHBvaW50ZXIgKi8KIAogZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqYWxsbm9kZXM7CkBAIC0xMjMsMjIgKzEyMSwxMyBAQAogCXVuc2lnbmVkIGxvbmcgbWVtID0gKHVuc2lnbmVkIGxvbmcpIGtsaW1pdDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCi0JLyogQWxsIG5ld3dvcmxkIHBtYWMgbWFjaGluZXMgYW5kIENIUlBzIG5vdyB1c2UgdGhlIGludGVycnVwdCB0cmVlICovCisJLyogQWxsIENIUlBzIG5vdyB1c2UgdGhlIGludGVycnVwdCB0cmVlICovCiAJZm9yIChucCA9IGFsbG5vZGVzOyBucCAhPSBOVUxMOyBucCA9IG5wLT5hbGxuZXh0KSB7CiAJCWlmIChnZXRfcHJvcGVydHkobnAsICJpbnRlcnJ1cHQtcGFyZW50IiwgTlVMTCkpIHsKIAkJCXVzZV9vZl9pbnRlcnJ1cHRfdHJlZSA9IDE7CiAJCQlicmVhazsKIAkJfQogCX0KLQlpZiAoX21hY2hpbmUgPT0gX01BQ0hfUG1hYyAmJiB1c2Vfb2ZfaW50ZXJydXB0X3RyZWUpCi0JCXBtYWNfbmV3d29ybGQgPSAxOwotCi0jaWZkZWYgQ09ORklHX0JPT1RYX1RFWFQKLQlpZiAoYm9vdF9pbmZvcyAmJiBwbWFjX25ld3dvcmxkKSB7Ci0JCXByb21fcHJpbnQoIldBUk5JTkcgISBCb290WC9taUJvb3QgYm9vdGluZyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgbWFjaGluZVxuIik7Ci0JCXByb21fcHJpbnQoIiAgICAgICAgICBZb3Ugc2hvdWxkIHVzZSBhbiBPcGVuIEZpcm13YXJlIGJvb3Rsb2FkZXJcbiIpOwotCX0KLSNlbmRpZiAvKiBDT05GSUdfQk9PVFhfVEVYVCAqLwogCiAJaWYgKHVzZV9vZl9pbnRlcnJ1cHRfdHJlZSkgewogCQkvKgpAQCAtNDM0LDE2ICs0MjMsMTAgQEAKIAkJICogdGhvc2UgbWFjaGluZXMsIHdlIHdhbnQgdG8gb2Zmc2V0IGludGVycnVwdHMgZnJvbSB0aGUKIAkJICogc2Vjb25kIG9wZW5waWMgYnkgMTI4IC0tIEJlbkgKIAkJICovCi0JCWlmIChfbWFjaGluZSAhPSBfTUFDSF9QbWFjICYmIG51bV9pbnRlcnJ1cHRfY29udHJvbGxlcnMgPiAxCisJCWlmIChudW1faW50ZXJydXB0X2NvbnRyb2xsZXJzID4gMQogCQkgICAgJiYgaWMgIT0gTlVMTAogCQkgICAgJiYgZ2V0X3Byb3BlcnR5KGljLCAiaW50ZXJydXB0LXBhcmVudCIsIE5VTEwpID09IE5VTEwpCiAJCQlvZmZzZXQgPSAxNjsKLQkJZWxzZSBpZiAoX21hY2hpbmUgPT0gX01BQ0hfUG1hYyAmJiBudW1faW50ZXJydXB0X2NvbnRyb2xsZXJzID4gMQotCQkJICYmIGljICE9IE5VTEwgJiYgaWMtPnBhcmVudCAhPSBOVUxMKSB7Ci0JCQljaGFyICpuYW1lID0gZ2V0X3Byb3BlcnR5KGljLT5wYXJlbnQsICJuYW1lIiwgTlVMTCk7Ci0JCQlpZiAobmFtZSAmJiAhc3RyY21wKG5hbWUsICJ1MyIpKQotCQkJCW9mZnNldCA9IDEyODsKLQkJfQogCiAJCW5wLT5pbnRyc1tpXS5saW5lID0gaXJxWzBdICsgb2Zmc2V0OwogCQlpZiAobiA+IDEpCmRpZmYgLS1naXQgYS9hcmNoL3BwYy94bW9uL3N0YXJ0LmMgYi9hcmNoL3BwYy94bW9uL3N0YXJ0LmMKaW5kZXggYzgwMTc3Zi4uNDM0NGNiZSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMveG1vbi9zdGFydC5jCisrKyBiL2FyY2gvcHBjL3htb24vc3RhcnQuYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPGFzbS9ib290eC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vYnRleHQuaD4KQEAgLTI3LDExICsyNiw5IEBACiB1bnNpZ25lZCBpbnQgVFhSRFksIFJYUkRZLCBETEFCOwogc3RhdGljIGludCB4bW9uX2V4cGVjdChjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGludCB0aW1lb3V0KTsKIAotc3RhdGljIGludCB1c2Vfc2VyaWFsOwogc3RhdGljIGludCB1c2Vfc2NyZWVuOwogc3RhdGljIGludCB2aWFfbW9kZW07CiBzdGF0aWMgaW50IHhtb25fdXNlX3NjY2I7Ci1zdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpjaGFubmVsX25vZGU7CiAKICNkZWZpbmUgVEJfU1BFRUQJMjUwMDAwMDAKIApAQCAtMTEyLDk2ICsxMDksMjEgQEAKICNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KIAl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpiYXNlOwogCi0JaWYgKF9tYWNoaW5lID09IF9NQUNIX1BtYWMpIHsKLQkJc3RydWN0IGRldmljZV9ub2RlICpucDsKLQkJdW5zaWduZWQgbG9uZyBhZGRyOwotI2lmZGVmIENPTkZJR19CT09UWF9URVhUCi0JCWlmICghdXNlX3NjcmVlbiAmJiAhdXNlX3NlcmlhbAotCQkgICAgJiYgIW1hY2hpbmVfaXNfY29tcGF0aWJsZSgiaU1hYyIpKSB7Ci0JCQkvKiBzZWUgaWYgdGhlcmUgaXMgYSBrZXlib2FyZCBpbiB0aGUgZGV2aWNlIHRyZWUKLQkJCSAgIHdpdGggYSBwYXJlbnQgb2YgdHlwZSAiYWRiIiAqLwotCQkJZm9yIChucCA9IGZpbmRfZGV2aWNlcygia2V5Ym9hcmQiKTsgbnA7IG5wID0gbnAtPm5leHQpCi0JCQkJaWYgKG5wLT5wYXJlbnQgJiYgbnAtPnBhcmVudC0+dHlwZQotCQkJCSAgICAmJiBzdHJjbXAobnAtPnBhcmVudC0+dHlwZSwgImFkYiIpID09IDApCi0JCQkJCWJyZWFrOwotCi0JCQkvKiBuZWVkcyB0byBiZSBoYWNrZWQgaWYgeG1vbl9wcmludGsgaXMgdG8gYmUgdXNlZAotCQkJICAgZnJvbSB3aXRoaW4gZmluZF92aWFfcG11KCkgKi8KLSNpZmRlZiBDT05GSUdfQURCX1BNVQotCQkJaWYgKG5wICE9IE5VTEwgJiYgYm9vdF90ZXh0X21hcHBlZCAmJiBmaW5kX3ZpYV9wbXUoKSkKLQkJCQl1c2Vfc2NyZWVuID0gMTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19BREJfQ1VEQQotCQkJaWYgKG5wICE9IE5VTEwgJiYgYm9vdF90ZXh0X21hcHBlZCAmJiBmaW5kX3ZpYV9jdWRhKCkpCi0JCQkJdXNlX3NjcmVlbiA9IDE7Ci0jZW5kaWYKLQkJfQotCQlpZiAoIXVzZV9zY3JlZW4gJiYgKG5wID0gZmluZF9kZXZpY2VzKCJlc2NjIikpICE9IE5VTEwpIHsKLQkJCS8qCi0JCQkgKiBsb29rIGZvciB0aGUgZGV2aWNlIG5vZGUgZm9yIHRoZSBzZXJpYWwgcG9ydAotCQkJICogd2UncmUgdXNpbmcgYW5kIHNlZSBpZiBpdCBzYXlzIGl0IGhhcyBhIG1vZGVtCi0JCQkgKi8KLQkJCWNoYXIgKm5hbWUgPSB4bW9uX3VzZV9zY2NiPyAiY2gtYiI6ICJjaC1hIjsKLQkJCWNoYXIgKnNsb3RzOwotCQkJaW50IGw7Ci0KLQkJCW5wID0gbnAtPmNoaWxkOwotCQkJd2hpbGUgKG5wICE9IE5VTEwgJiYgc3RyY21wKG5wLT5uYW1lLCBuYW1lKSAhPSAwKQotCQkJCW5wID0gbnAtPnNpYmxpbmc7Ci0JCQlpZiAobnAgIT0gTlVMTCkgewotCQkJCS8qIFhYWCBzaG91bGQgcGFyc2UgdGhpcyBwcm9wZXJseSAqLwotCQkJCWNoYW5uZWxfbm9kZSA9IG5wOwotCQkJCXNsb3RzID0gZ2V0X3Byb3BlcnR5KG5wLCAic2xvdC1uYW1lcyIsICZsKTsKLQkJCQlpZiAoc2xvdHMgIT0gTlVMTCAmJiBsID49IDEwCi0JCQkJICAgICYmIHN0cmNtcChzbG90cys0LCAiTW9kZW0iKSA9PSAwKQotCQkJCQl2aWFfbW9kZW0gPSAxOwotCQkJfQotCQl9Ci0JCWJ0ZXh0X2RyYXdzdHJpbmcoInhtb24gdXNlcyAiKTsKLQkJaWYgKHVzZV9zY3JlZW4pCi0JCQlidGV4dF9kcmF3c3RyaW5nKCJzY3JlZW4gYW5kIGtleWJvYXJkXG4iKTsKLQkJZWxzZSB7Ci0JCQlpZiAodmlhX21vZGVtKQotCQkJCWJ0ZXh0X2RyYXdzdHJpbmcoIm1vZGVtIG9uICIpOwotCQkJYnRleHRfZHJhd3N0cmluZyh4bW9uX3VzZV9zY2NiPyAicHJpbnRlciI6ICJtb2RlbSIpOwotCQkJYnRleHRfZHJhd3N0cmluZygiIHBvcnRcbiIpOwotCQl9Ci0KLSNlbmRpZiAvKiBDT05GSUdfQk9PVFhfVEVYVCAqLwotCi0jaWZkZWYgQ0hSUF9FU0NDCi0JCWFkZHIgPSAweGMxMDEzMDIwOwotI2Vsc2UKLQkJYWRkciA9IDB4ZjMwMTMwMjA7Ci0jZW5kaWYKLQkJVFhSRFkgPSA0OwotCQlSWFJEWSA9IDE7Ci0JCi0JCW5wID0gZmluZF9kZXZpY2VzKCJtYWMtaW8iKTsKLQkJaWYgKG5wICYmIG5wLT5uX2FkZHJzKQotCQkJYWRkciA9IG5wLT5hZGRyc1swXS5hZGRyZXNzICsgMHgxMzAyMDsKLQkJYmFzZSA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIGlvcmVtYXAoYWRkciAmIFBBR0VfTUFTSywgUEFHRV9TSVpFKTsKLQkJc2NjYyA9IGJhc2UgKyAoYWRkciAmIH5QQUdFX01BU0spOwotCQlzY2NkID0gc2NjYyArIDB4MTA7Ci0KLQl9CiAjaWZkZWYgQ09ORklHX1BQQ19DSFJQCi0JZWxzZSB7Ci0JCWJhc2UgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSBpc2FfaW9fYmFzZTsKLQkJaWYgKF9tYWNoaW5lID09IF9NQUNIX2NocnApCi0JCQliYXNlID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikKLQkJCQlpb3JlbWFwKGNocnBfZmluZF9waHlzX2lvX2Jhc2UoKSwgMHgxMDAwKTsKKwliYXNlID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgaXNhX2lvX2Jhc2U7CisJaWYgKF9tYWNoaW5lID09IF9NQUNIX2NocnApCisJCWJhc2UgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKQorCQkJaW9yZW1hcChjaHJwX2ZpbmRfcGh5c19pb19iYXNlKCksIDB4MTAwMCk7CiAKLQkJc2NjYyA9IGJhc2UgKyAweDNmZDsKLQkJc2NjZCA9IGJhc2UgKyAweDNmODsKLQkJaWYgKHhtb25fdXNlX3NjY2IpIHsKLQkJCXNjY2MgLT0gMHgxMDA7Ci0JCQlzY2NkIC09IDB4MTAwOwotCQl9Ci0JCVRYUkRZID0gMHgyMDsKLQkJUlhSRFkgPSAxOwotCQlETEFCID0gMHg4MDsKKwlzY2NjID0gYmFzZSArIDB4M2ZkOworCXNjY2QgPSBiYXNlICsgMHgzZjg7CisJaWYgKHhtb25fdXNlX3NjY2IpIHsKKwkJc2NjYyAtPSAweDEwMDsKKwkJc2NjZCAtPSAweDEwMDsKIAl9CisJVFhSRFkgPSAweDIwOworCVJYUkRZID0gMTsKKwlETEFCID0gMHg4MDsKICNlbmRpZiAvKiBDT05GSUdfUFBDX0NIUlAgKi8KICNlbGlmIGRlZmluZWQoQ09ORklHX0dFTUlOSSkKIAkvKiBzaG91bGQgYWxyZWFkeSBiZSBtYXBwZWQgYnkgdGhlIGtlcm5lbCBib290ICovCkBAIC0zODUsMTYgKzMwNyw2IEBACiAJcmV0dXJuICpzY2NkOwogfQogCi1zdGF0aWMgdW5zaWduZWQgY2hhciBzY2NfaW5pdHRhYltdID0gewotICAgIDEzLCAwLAkJLyogc2V0IGJhdWQgcmF0ZSBkaXZpc29yICovCi0gICAgMTIsIDEsCi0gICAgMTQsIDEsCQkvKiBiYXVkIHJhdGUgZ2VuIGVuYWJsZSwgc3JjPXJ0eGMgKi8KLSAgICAxMSwgMHg1MCwJCS8qIGNsb2NrcyA9IGJyIGdlbiAqLwotICAgIDUsICAweGVhLAkJLyogdHggOCBiaXRzLCBhc3NlcnQgRFRSICYgUlRTICovCi0gICAgNCwgIDB4NDYsCQkvKiB4MTYgY2xvY2ssIDEgc3RvcCAqLwotICAgIDMsICAweGMxLAkJLyogcnggZW5hYmxlLCA4IGJpdHMgKi8KLX07Ci0KIHZvaWQKIHhtb25faW5pdF9zY2Modm9pZCkKIHsKQEAgLTQwNyw0MyArMzE5LDYgQEAKIAkJc2NjZFszXSA9IDM7IGVpZWlvKCk7CQkvKiBMQ1IgPSA4TjEgKi8KIAkJc2NjZFsxXSA9IDA7IGVpZWlvKCk7CQkvKiBJRVIgPSAwICovCiAJfQotCWVsc2UgaWYgKCBfbWFjaGluZSA9PSBfTUFDSF9QbWFjICkKLQl7Ci0JCWludCBpLCB4OwotCi0JCWlmIChjaGFubmVsX25vZGUgIT0gMCkKLQkJCXBtYWNfY2FsbF9mZWF0dXJlKAotCQkJCVBNQUNfRlRSX1NDQ19FTkFCTEUsCi0JCQkJY2hhbm5lbF9ub2RlLAotCQkJCVBNQUNfU0NDX0FTWU5DIHwgUE1BQ19TQ0NfRkxBR19YTU9OLCAxKTsKLQkJCXByaW50ayhLRVJOX0lORk8gIlNlcmlhbCBwb3J0IGxvY2tlZCBPTiBieSBkZWJ1Z2dlciAhXG4iKTsKLQkJaWYgKHZpYV9tb2RlbSAmJiBjaGFubmVsX25vZGUgIT0gMCkgewotCQkJdW5zaWduZWQgaW50IHQwOwotCi0JCQlwbWFjX2NhbGxfZmVhdHVyZSgKLQkJCQlQTUFDX0ZUUl9NT0RFTV9FTkFCTEUsCi0JCQkJY2hhbm5lbF9ub2RlLCAwLCAxKTsKLQkJCXByaW50ayhLRVJOX0lORk8gIk1vZGVtIHBvd2VyZWQgdXAgYnkgZGVidWdnZXIgIVxuIik7Ci0JCQl0MCA9IHJlYWR0YigpOwotCQkJd2hpbGUgKHJlYWR0YigpIC0gdDAgPCAzKlRCX1NQRUVEKQotCQkJCWVpZWlvKCk7Ci0JCX0KLQkJLyogdXNlIHRoZSBCIGNoYW5uZWwgaWYgcmVxdWVzdGVkICovCi0JCWlmICh4bW9uX3VzZV9zY2NiKSB7Ci0JCQlzY2NjID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikKLQkJCQkoKHVuc2lnbmVkIGxvbmcpc2NjYyAmIH4weDIwKTsKLQkJCXNjY2QgPSBzY2NjICsgMHgxMDsKLQkJfQotCQlmb3IgKGkgPSAyMDAwMDsgaSAhPSAwOyAtLWkpIHsKLQkJCXggPSAqc2NjYzsgZWllaW8oKTsKLQkJfQotCQkqc2NjYyA9IDk7IGVpZWlvKCk7CQkvKiByZXNldCBBIG9yIEIgc2lkZSAqLwotCQkqc2NjYyA9ICgodW5zaWduZWQgbG9uZylzY2NjICYgMHgyMCk/IDB4ODA6IDB4NDA7IGVpZWlvKCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc2NjX2luaXR0YWIpOyArK2kpIHsKLQkJCSpzY2NjID0gc2NjX2luaXR0YWJbaV07Ci0JCQllaWVpbygpOwotCQl9Ci0JfQogCXNjY19pbml0aWFsaXplZCA9IDE7CiAJaWYgKHZpYV9tb2RlbSkgewogCQlmb3IgKDs7KSB7CkBAIC02MzIsMTkgKzUwNyw5IEBACiB2b2lkCiB4bW9uX2VudGVyKHZvaWQpCiB7Ci0jaWZkZWYgQ09ORklHX0FEQl9QTVUKLQlpZiAoX21hY2hpbmUgPT0gX01BQ0hfUG1hYykgewotCQlwbXVfc3VzcGVuZCgpOwotCX0KLSNlbmRpZgogfQogCiB2b2lkCiB4bW9uX2xlYXZlKHZvaWQpCiB7Ci0jaWZkZWYgQ09ORklHX0FEQl9QTVUKLQlpZiAoX21hY2hpbmUgPT0gX01BQ0hfUG1hYykgewotCQlwbXVfcmVzdW1lKCk7Ci0JfQotI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9hcmNoL3BwYy94bW9uL3htb24uYyBiL2FyY2gvcHBjL3htb24veG1vbi5jCmluZGV4IDJiNDgzYjQuLmJkYWY2NTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3htb24veG1vbi5jCisrKyBiL2FyY2gvcHBjL3htb24veG1vbi5jCkBAIC0xNiw5ICsxNiw2IEBACiAjaW5jbHVkZSA8YXNtL2Jvb3R4Lmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20veG1vbi5oPgotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotI2luY2x1ZGUgPGFzbS9iYWNrbGlnaHQuaD4KLSNlbmRpZgogI2luY2x1ZGUgIm5vbnN0ZGlvLmgiCiAjaW5jbHVkZSAicHJpdmluc3QuaCIKIApAQCAtOTksNyArOTYsNyBAQAogc3RhdGljIHZvaWQgaW5zZXJ0X2JwdHModm9pZCk7CiBzdGF0aWMgc3RydWN0IGJwdCAqYXRfYnJlYWtwb2ludCh1bnNpZ25lZCBwYyk7CiBzdGF0aWMgdm9pZCBicHRfY21kcyh2b2lkKTsKLXN0YXRpYyB2b2lkIGNhY2hlZmx1c2godm9pZCk7Cit2b2lkIGNhY2hlZmx1c2godm9pZCk7CiAjaWZkZWYgQ09ORklHX1NNUAogc3RhdGljIHZvaWQgY3B1X2NtZCh2b2lkKTsKICNlbmRpZiAvKiBDT05GSUdfU01QICovCkBAIC0yNjAsMTYgKzI1Nyw2IEBACiAJICovCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCXJlbW92ZV9icHRzKCk7Ci0jaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCi0JaWYoIHNldGptcChidXNfZXJyb3Jfam1wKSA9PSAwICkgewotCQlkZWJ1Z2dlcl9mYXVsdF9oYW5kbGVyID0gaGFuZGxlX2ZhdWx0OwotCQlzeW5jKCk7Ci0JCXNldF9iYWNrbGlnaHRfZW5hYmxlKDEpOwotCQlzZXRfYmFja2xpZ2h0X2xldmVsKEJBQ0tMSUdIVF9NQVgpOwotCQlzeW5jKCk7Ci0JfQotCWRlYnVnZ2VyX2ZhdWx0X2hhbmRsZXIgPSBOVUxMOwotI2VuZGlmCS8qIENPTkZJR19QTUFDX0JBQ0tMSUdIVCAqLwogCWNtZCA9IGNtZHMoZXhjcCk7CiAJaWYgKGNtZCA9PSAncycpIHsKIAkJeG1vbl90cmFjZVtzbXBfcHJvY2Vzc29yX2lkKCldID0gU1NURVA7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvS2NvbmZpZyBiL2FyY2gvczM5MC9LY29uZmlnCmluZGV4IDZmZTUzMmQuLmI2NjYwMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9LY29uZmlnCisrKyBiL2FyY2gvczM5MC9LY29uZmlnCkBAIC0yNywxMSArMjcsNiBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAotY29uZmlnIFVJRDE2Ci0JYm9vbAotCWRlZmF1bHQgeQotCWRlcGVuZHMgb24gITY0QklUCi0KIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCiBtZW51ICJCYXNlIHNldHVwIgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9hZXNfczM5MC5jIGIvYXJjaC9zMzkwL2NyeXB0by9hZXNfczM5MC5jCmluZGV4IDdhMTAzM2QuLmM1Y2EyZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vYWVzX3MzOTAuYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL2Flc19zMzkwLmMKQEAgLTExNCw4MCArMTE0LDEwOCBAQAogCQkJCSAgICBjb25zdCB1OCAqaW4sIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7CiAJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KGRlc2MtPnRmbSk7CisJaW50IHJldDsKKworCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLworCW5ieXRlcyAmPSB+KEFFU19CTE9DS19TSVpFIC0gMSk7CiAKIAlzd2l0Y2ggKHNjdHgtPmtleV9sZW4pIHsKIAljYXNlIDE2OgotCQljcnlwdF9zMzkwX2ttKEtNX0FFU18xMjhfRU5DUllQVCwgJnNjdHgtPmtleSwgb3V0LCBpbiwgbmJ5dGVzKTsKKwkJcmV0ID0gY3J5cHRfczM5MF9rbShLTV9BRVNfMTI4X0VOQ1JZUFQsICZzY3R4LT5rZXksIG91dCwgaW4sIG5ieXRlcyk7CisJCUJVR19PTigocmV0IDwgMCkgfHwgKHJldCAhPSBuYnl0ZXMpKTsKIAkJYnJlYWs7CiAJY2FzZSAyNDoKLQkJY3J5cHRfczM5MF9rbShLTV9BRVNfMTkyX0VOQ1JZUFQsICZzY3R4LT5rZXksIG91dCwgaW4sIG5ieXRlcyk7CisJCXJldCA9IGNyeXB0X3MzOTBfa20oS01fQUVTXzE5Ml9FTkNSWVBULCAmc2N0eC0+a2V5LCBvdXQsIGluLCBuYnl0ZXMpOworCQlCVUdfT04oKHJldCA8IDApIHx8IChyZXQgIT0gbmJ5dGVzKSk7CiAJCWJyZWFrOwogCWNhc2UgMzI6Ci0JCWNyeXB0X3MzOTBfa20oS01fQUVTXzI1Nl9FTkNSWVBULCAmc2N0eC0+a2V5LCBvdXQsIGluLCBuYnl0ZXMpOworCQlyZXQgPSBjcnlwdF9zMzkwX2ttKEtNX0FFU18yNTZfRU5DUllQVCwgJnNjdHgtPmtleSwgb3V0LCBpbiwgbmJ5dGVzKTsKKwkJQlVHX09OKChyZXQgPCAwKSB8fCAocmV0ICE9IG5ieXRlcykpOwogCQlicmVhazsKIAl9Ci0JcmV0dXJuIG5ieXRlcyAmIH4oQUVTX0JMT0NLX1NJWkUgLSAxKTsKKwlyZXR1cm4gbmJ5dGVzOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGFlc19kZWNyeXB0X2VjYihjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsIHU4ICpvdXQsCiAJCQkJICAgIGNvbnN0IHU4ICppbiwgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKIAlzdHJ1Y3QgczM5MF9hZXNfY3R4ICpzY3R4ID0gY3J5cHRvX3RmbV9jdHgoZGVzYy0+dGZtKTsKKwlpbnQgcmV0OworCisJLyogb25seSB1c2UgY29tcGxldGUgYmxvY2tzICovCisJbmJ5dGVzICY9IH4oQUVTX0JMT0NLX1NJWkUgLSAxKTsKIAogCXN3aXRjaCAoc2N0eC0+a2V5X2xlbikgewogCWNhc2UgMTY6Ci0JCWNyeXB0X3MzOTBfa20oS01fQUVTXzEyOF9ERUNSWVBULCAmc2N0eC0+a2V5LCBvdXQsIGluLCBuYnl0ZXMpOworCQlyZXQgPSBjcnlwdF9zMzkwX2ttKEtNX0FFU18xMjhfREVDUllQVCwgJnNjdHgtPmtleSwgb3V0LCBpbiwgbmJ5dGVzKTsKKwkJQlVHX09OKChyZXQgPCAwKSB8fCAocmV0ICE9IG5ieXRlcykpOwogCQlicmVhazsKIAljYXNlIDI0OgotCQljcnlwdF9zMzkwX2ttKEtNX0FFU18xOTJfREVDUllQVCwgJnNjdHgtPmtleSwgb3V0LCBpbiwgbmJ5dGVzKTsKKwkJcmV0ID0gY3J5cHRfczM5MF9rbShLTV9BRVNfMTkyX0RFQ1JZUFQsICZzY3R4LT5rZXksIG91dCwgaW4sIG5ieXRlcyk7CisJCUJVR19PTigocmV0IDwgMCkgfHwgKHJldCAhPSBuYnl0ZXMpKTsKIAkJYnJlYWs7CiAJY2FzZSAzMjoKLQkJY3J5cHRfczM5MF9rbShLTV9BRVNfMjU2X0RFQ1JZUFQsICZzY3R4LT5rZXksIG91dCwgaW4sIG5ieXRlcyk7CisJCXJldCA9IGNyeXB0X3MzOTBfa20oS01fQUVTXzI1Nl9ERUNSWVBULCAmc2N0eC0+a2V5LCBvdXQsIGluLCBuYnl0ZXMpOworCQlCVUdfT04oKHJldCA8IDApIHx8IChyZXQgIT0gbmJ5dGVzKSk7CiAJCWJyZWFrOwogCX0KLQlyZXR1cm4gbmJ5dGVzICYgfihBRVNfQkxPQ0tfU0laRSAtIDEpOworCXJldHVybiBuYnl0ZXM7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYWVzX2VuY3J5cHRfY2JjKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywgdTggKm91dCwKIAkJCQkgICAgY29uc3QgdTggKmluLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewogCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eChkZXNjLT50Zm0pOworCWludCByZXQ7CisKKwkvKiBvbmx5IHVzZSBjb21wbGV0ZSBibG9ja3MgKi8KKwluYnl0ZXMgJj0gfihBRVNfQkxPQ0tfU0laRSAtIDEpOwogCiAJbWVtY3B5KCZzY3R4LT5pdiwgZGVzYy0+aW5mbywgQUVTX0JMT0NLX1NJWkUpOwogCXN3aXRjaCAoc2N0eC0+a2V5X2xlbikgewogCWNhc2UgMTY6Ci0JCWNyeXB0X3MzOTBfa21jKEtNQ19BRVNfMTI4X0VOQ1JZUFQsICZzY3R4LT5pdiwgb3V0LCBpbiwgbmJ5dGVzKTsKKwkJcmV0ID0gY3J5cHRfczM5MF9rbWMoS01DX0FFU18xMjhfRU5DUllQVCwgJnNjdHgtPml2LCBvdXQsIGluLCBuYnl0ZXMpOworCQlCVUdfT04oKHJldCA8IDApIHx8IChyZXQgIT0gbmJ5dGVzKSk7CiAJCWJyZWFrOwogCWNhc2UgMjQ6Ci0JCWNyeXB0X3MzOTBfa21jKEtNQ19BRVNfMTkyX0VOQ1JZUFQsICZzY3R4LT5pdiwgb3V0LCBpbiwgbmJ5dGVzKTsKKwkJcmV0ID0gY3J5cHRfczM5MF9rbWMoS01DX0FFU18xOTJfRU5DUllQVCwgJnNjdHgtPml2LCBvdXQsIGluLCBuYnl0ZXMpOworCQlCVUdfT04oKHJldCA8IDApIHx8IChyZXQgIT0gbmJ5dGVzKSk7CiAJCWJyZWFrOwogCWNhc2UgMzI6Ci0JCWNyeXB0X3MzOTBfa21jKEtNQ19BRVNfMjU2X0VOQ1JZUFQsICZzY3R4LT5pdiwgb3V0LCBpbiwgbmJ5dGVzKTsKKwkJcmV0ID0gY3J5cHRfczM5MF9rbWMoS01DX0FFU18yNTZfRU5DUllQVCwgJnNjdHgtPml2LCBvdXQsIGluLCBuYnl0ZXMpOworCQlCVUdfT04oKHJldCA8IDApIHx8IChyZXQgIT0gbmJ5dGVzKSk7CiAJCWJyZWFrOwogCX0KIAltZW1jcHkoZGVzYy0+aW5mbywgJnNjdHgtPml2LCBBRVNfQkxPQ0tfU0laRSk7CiAKLQlyZXR1cm4gbmJ5dGVzICYgfihBRVNfQkxPQ0tfU0laRSAtIDEpOworCXJldHVybiBuYnl0ZXM7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYWVzX2RlY3J5cHRfY2JjKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywgdTggKm91dCwKIAkJCQkgICAgY29uc3QgdTggKmluLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewogCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eChkZXNjLT50Zm0pOworCWludCByZXQ7CisKKwkvKiBvbmx5IHVzZSBjb21wbGV0ZSBibG9ja3MgKi8KKwluYnl0ZXMgJj0gfihBRVNfQkxPQ0tfU0laRSAtIDEpOwogCiAJbWVtY3B5KCZzY3R4LT5pdiwgZGVzYy0+aW5mbywgQUVTX0JMT0NLX1NJWkUpOwogCXN3aXRjaCAoc2N0eC0+a2V5X2xlbikgewogCWNhc2UgMTY6Ci0JCWNyeXB0X3MzOTBfa21jKEtNQ19BRVNfMTI4X0RFQ1JZUFQsICZzY3R4LT5pdiwgb3V0LCBpbiwgbmJ5dGVzKTsKKwkJcmV0ID0gY3J5cHRfczM5MF9rbWMoS01DX0FFU18xMjhfREVDUllQVCwgJnNjdHgtPml2LCBvdXQsIGluLCBuYnl0ZXMpOworCQlCVUdfT04oKHJldCA8IDApIHx8IChyZXQgIT0gbmJ5dGVzKSk7CiAJCWJyZWFrOwogCWNhc2UgMjQ6Ci0JCWNyeXB0X3MzOTBfa21jKEtNQ19BRVNfMTkyX0RFQ1JZUFQsICZzY3R4LT5pdiwgb3V0LCBpbiwgbmJ5dGVzKTsKKwkJcmV0ID0gY3J5cHRfczM5MF9rbWMoS01DX0FFU18xOTJfREVDUllQVCwgJnNjdHgtPml2LCBvdXQsIGluLCBuYnl0ZXMpOworCQlCVUdfT04oKHJldCA8IDApIHx8IChyZXQgIT0gbmJ5dGVzKSk7CiAJCWJyZWFrOwogCWNhc2UgMzI6Ci0JCWNyeXB0X3MzOTBfa21jKEtNQ19BRVNfMjU2X0RFQ1JZUFQsICZzY3R4LT5pdiwgb3V0LCBpbiwgbmJ5dGVzKTsKKwkJcmV0ID0gY3J5cHRfczM5MF9rbWMoS01DX0FFU18yNTZfREVDUllQVCwgJnNjdHgtPml2LCBvdXQsIGluLCBuYnl0ZXMpOworCQlCVUdfT04oKHJldCA8IDApIHx8IChyZXQgIT0gbmJ5dGVzKSk7CiAJCWJyZWFrOwogCX0KLQlyZXR1cm4gbmJ5dGVzICYgfihBRVNfQkxPQ0tfU0laRSAtIDEpOworCXJldHVybiBuYnl0ZXM7CiB9CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9kZXNfczM5MC5jIGIvYXJjaC9zMzkwL2NyeXB0by9kZXNfczM5MC5jCmluZGV4IGEzOGJiMmEuLmUzYzM3YWEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vZGVzX3MzOTAuYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL2Rlc19zMzkwLmMKQEAgLTE1LDEwICsxNSw4IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorCiAjaW5jbHVkZSAiY3J5cHRfczM5MC5oIgogI2luY2x1ZGUgImNyeXB0b19kZXMuaCIKIApAQCAtNDYsMzggKzQ0LDkyIEBACiAJdTgga2V5W0RFUzNfMTkyX0tFWV9TSVpFXTsKIH07CiAKLXN0YXRpYyBpbnQKLWRlc19zZXRrZXkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuLCB1MzIgKmZsYWdzKQorc3RhdGljIGludCBkZXNfc2V0a2V5KHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbiwKKwkJICAgICAgdTMyICpmbGFncykKIHsKLQlzdHJ1Y3QgY3J5cHRfczM5MF9kZXNfY3R4ICpkY3R4OworCXN0cnVjdCBjcnlwdF9zMzkwX2Rlc19jdHggKmRjdHggPSBjdHg7CiAJaW50IHJldDsKIAotCWRjdHggPSBjdHg7Ci0JLy90ZXN0IGlmIGtleSBpcyB2YWxpZCAobm90IGEgd2VhayBrZXkpCisJLyogdGVzdCBpZiBrZXkgaXMgdmFsaWQgKG5vdCBhIHdlYWsga2V5KSAqLwogCXJldCA9IGNyeXB0b19kZXNfY2hlY2tfa2V5KGtleSwga2V5bGVuLCBmbGFncyk7Ci0JaWYgKHJldCA9PSAwKXsKKwlpZiAocmV0ID09IDApCiAJCW1lbWNweShkY3R4LT5rZXksIGtleSwga2V5bGVuKTsKLQl9CiAJcmV0dXJuIHJldDsKIH0KIAotCi1zdGF0aWMgdm9pZAotZGVzX2VuY3J5cHQodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQorc3RhdGljIHZvaWQgZGVzX2VuY3J5cHQodm9pZCAqY3R4LCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCiB7Ci0Jc3RydWN0IGNyeXB0X3MzOTBfZGVzX2N0eCAqZGN0eDsKKwlzdHJ1Y3QgY3J5cHRfczM5MF9kZXNfY3R4ICpkY3R4ID0gY3R4OwogCi0JZGN0eCA9IGN0eDsKLQljcnlwdF9zMzkwX2ttKEtNX0RFQV9FTkNSWVBULCBkY3R4LT5rZXksIGRzdCwgc3JjLCBERVNfQkxPQ0tfU0laRSk7CisJY3J5cHRfczM5MF9rbShLTV9ERUFfRU5DUllQVCwgZGN0eC0+a2V5LCBvdXQsIGluLCBERVNfQkxPQ0tfU0laRSk7CiB9CiAKLXN0YXRpYyB2b2lkCi1kZXNfZGVjcnlwdCh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCitzdGF0aWMgdm9pZCBkZXNfZGVjcnlwdCh2b2lkICpjdHgsIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKIHsKLQlzdHJ1Y3QgY3J5cHRfczM5MF9kZXNfY3R4ICpkY3R4OworCXN0cnVjdCBjcnlwdF9zMzkwX2Rlc19jdHggKmRjdHggPSBjdHg7CiAKLQlkY3R4ID0gY3R4OwotCWNyeXB0X3MzOTBfa20oS01fREVBX0RFQ1JZUFQsIGRjdHgtPmtleSwgZHN0LCBzcmMsIERFU19CTE9DS19TSVpFKTsKKwljcnlwdF9zMzkwX2ttKEtNX0RFQV9ERUNSWVBULCBkY3R4LT5rZXksIG91dCwgaW4sIERFU19CTE9DS19TSVpFKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBkZXNfZW5jcnlwdF9lY2IoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLCB1OCAqb3V0LAorCQkJCSAgICBjb25zdCB1OCAqaW4sIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGNyeXB0X3MzOTBfZGVzX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KGRlc2MtPnRmbSk7CisJaW50IHJldDsKKworCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLworCW5ieXRlcyAmPSB+KERFU19CTE9DS19TSVpFIC0gMSk7CisJcmV0ID0gY3J5cHRfczM5MF9rbShLTV9ERUFfRU5DUllQVCwgc2N0eC0+a2V5LCBvdXQsIGluLCBuYnl0ZXMpOworCUJVR19PTigocmV0IDwgMCkgfHwgKHJldCAhPSBuYnl0ZXMpKTsKKworCXJldHVybiBuYnl0ZXM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVzX2RlY3J5cHRfZWNiKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywgdTggKm91dCwKKwkJCQkgICAgY29uc3QgdTggKmluLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBjcnlwdF9zMzkwX2Rlc19jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eChkZXNjLT50Zm0pOworCWludCByZXQ7CisKKwkvKiBvbmx5IHVzZSBjb21wbGV0ZSBibG9ja3MgKi8KKwluYnl0ZXMgJj0gfihERVNfQkxPQ0tfU0laRSAtIDEpOworCXJldCA9IGNyeXB0X3MzOTBfa20oS01fREVBX0RFQ1JZUFQsIHNjdHgtPmtleSwgb3V0LCBpbiwgbmJ5dGVzKTsKKwlCVUdfT04oKHJldCA8IDApIHx8IChyZXQgIT0gbmJ5dGVzKSk7CisKKwlyZXR1cm4gbmJ5dGVzOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRlc19lbmNyeXB0X2NiYyhjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsIHU4ICpvdXQsCisJCQkJICAgIGNvbnN0IHU4ICppbiwgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgY3J5cHRfczM5MF9kZXNfY3R4ICpzY3R4ID0gY3J5cHRvX3RmbV9jdHgoZGVzYy0+dGZtKTsKKwlpbnQgcmV0OworCisJLyogb25seSB1c2UgY29tcGxldGUgYmxvY2tzICovCisJbmJ5dGVzICY9IH4oREVTX0JMT0NLX1NJWkUgLSAxKTsKKworCW1lbWNweShzY3R4LT5pdiwgZGVzYy0+aW5mbywgREVTX0JMT0NLX1NJWkUpOworCXJldCA9IGNyeXB0X3MzOTBfa21jKEtNQ19ERUFfRU5DUllQVCwgJnNjdHgtPml2LCBvdXQsIGluLCBuYnl0ZXMpOworCUJVR19PTigocmV0IDwgMCkgfHwgKHJldCAhPSBuYnl0ZXMpKTsKKworCW1lbWNweShkZXNjLT5pbmZvLCBzY3R4LT5pdiwgREVTX0JMT0NLX1NJWkUpOworCXJldHVybiBuYnl0ZXM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVzX2RlY3J5cHRfY2JjKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywgdTggKm91dCwKKwkJCQkgICAgY29uc3QgdTggKmluLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBjcnlwdF9zMzkwX2Rlc19jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eChkZXNjLT50Zm0pOworCWludCByZXQ7CisKKwkvKiBvbmx5IHVzZSBjb21wbGV0ZSBibG9ja3MgKi8KKwluYnl0ZXMgJj0gfihERVNfQkxPQ0tfU0laRSAtIDEpOworCisJbWVtY3B5KCZzY3R4LT5pdiwgZGVzYy0+aW5mbywgREVTX0JMT0NLX1NJWkUpOworCXJldCA9IGNyeXB0X3MzOTBfa21jKEtNQ19ERUFfREVDUllQVCwgJnNjdHgtPml2LCBvdXQsIGluLCBuYnl0ZXMpOworCUJVR19PTigocmV0IDwgMCkgfHwgKHJldCAhPSBuYnl0ZXMpKTsKKworCXJldHVybiBuYnl0ZXM7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBkZXNfYWxnID0gewpAQCAtODcsMTIgKzEzOSwxOSBAQAogCS5jcmFfY3R4c2l6ZQkJPQlzaXplb2Yoc3RydWN0IGNyeXB0X3MzOTBfZGVzX2N0eCksCiAJLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCiAJLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKGRlc19hbGcuY3JhX2xpc3QpLAotCS5jcmFfdQkJCT0JeyAuY2lwaGVyID0gewotCS5jaWFfbWluX2tleXNpemUJPQlERVNfS0VZX1NJWkUsCi0JLmNpYV9tYXhfa2V5c2l6ZQk9CURFU19LRVlfU0laRSwKLQkuY2lhX3NldGtleQkJPSAJZGVzX3NldGtleSwKLQkuY2lhX2VuY3J5cHQJCT0JZGVzX2VuY3J5cHQsCi0JLmNpYV9kZWNyeXB0CQk9CWRlc19kZWNyeXB0IH0gfQorCS5jcmFfdQkJCT0JeworCQkuY2lwaGVyID0geworCQkJLmNpYV9taW5fa2V5c2l6ZQk9CURFU19LRVlfU0laRSwKKwkJCS5jaWFfbWF4X2tleXNpemUJPQlERVNfS0VZX1NJWkUsCisJCQkuY2lhX3NldGtleQkJPQlkZXNfc2V0a2V5LAorCQkJLmNpYV9lbmNyeXB0CQk9CWRlc19lbmNyeXB0LAorCQkJLmNpYV9kZWNyeXB0CQk9CWRlc19kZWNyeXB0LAorCQkJLmNpYV9lbmNyeXB0X2VjYgk9CWRlc19lbmNyeXB0X2VjYiwKKwkJCS5jaWFfZGVjcnlwdF9lY2IJPQlkZXNfZGVjcnlwdF9lY2IsCisJCQkuY2lhX2VuY3J5cHRfY2JjCT0JZGVzX2VuY3J5cHRfY2JjLAorCQkJLmNpYV9kZWNyeXB0X2NiYwk9CWRlc19kZWNyeXB0X2NiYywKKwkJfQorCX0KIH07CiAKIC8qCkBAIC0xMDcsMjAgKzE2NiwxOCBAQAogICogICBJbXBsZW1lbnRlcnMgTVVTVCByZWplY3Qga2V5cyB0aGF0IGV4aGliaXQgdGhpcyBwcm9wZXJ0eS4KICAqCiAgKi8KLXN0YXRpYyBpbnQKLWRlczNfMTI4X3NldGtleSh2b2lkICpjdHgsIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpCitzdGF0aWMgaW50IGRlczNfMTI4X3NldGtleSh2b2lkICpjdHgsIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4sCisJCQkgICB1MzIgKmZsYWdzKQogewogCWludCBpLCByZXQ7Ci0Jc3RydWN0IGNyeXB0X3MzOTBfZGVzM18xMjhfY3R4ICpkY3R4OworCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTI4X2N0eCAqZGN0eCA9IGN0eDsKIAljb25zdCB1OCogdGVtcF9rZXkgPSBrZXk7CiAKLQlkY3R4ID0gY3R4OwogCWlmICghKG1lbWNtcChrZXksICZrZXlbREVTX0tFWV9TSVpFXSwgREVTX0tFWV9TSVpFKSkpIHsKLQogCQkqZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9TQ0hFRDsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWZvciAoaSA9IDA7IGkgPCAyOyBpKyssCXRlbXBfa2V5ICs9IERFU19LRVlfU0laRSkgeworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyssIHRlbXBfa2V5ICs9IERFU19LRVlfU0laRSkgewogCQlyZXQgPSBjcnlwdG9fZGVzX2NoZWNrX2tleSh0ZW1wX2tleSwgREVTX0tFWV9TSVpFLCBmbGFncyk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKQEAgLTEyOSwyNCArMTg2LDg1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1kZXMzXzEyOF9lbmNyeXB0KHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3N0YXRpYyB2b2lkIGRlczNfMTI4X2VuY3J5cHQodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQogewotCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTI4X2N0eCAqZGN0eDsKKwlzdHJ1Y3QgY3J5cHRfczM5MF9kZXMzXzEyOF9jdHggKmRjdHggPSBjdHg7CiAKLQlkY3R4ID0gY3R4OwogCWNyeXB0X3MzOTBfa20oS01fVERFQV8xMjhfRU5DUllQVCwgZGN0eC0+a2V5LCBkc3QsICh2b2lkKilzcmMsCi0JCQlERVMzXzEyOF9CTE9DS19TSVpFKTsKKwkJICAgICAgREVTM18xMjhfQkxPQ0tfU0laRSk7CiB9CiAKLXN0YXRpYyB2b2lkCi1kZXMzXzEyOF9kZWNyeXB0KHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3N0YXRpYyB2b2lkIGRlczNfMTI4X2RlY3J5cHQodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQogewotCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTI4X2N0eCAqZGN0eDsKKwlzdHJ1Y3QgY3J5cHRfczM5MF9kZXMzXzEyOF9jdHggKmRjdHggPSBjdHg7CiAKLQlkY3R4ID0gY3R4OwogCWNyeXB0X3MzOTBfa20oS01fVERFQV8xMjhfREVDUllQVCwgZGN0eC0+a2V5LCBkc3QsICh2b2lkKilzcmMsCi0JCQlERVMzXzEyOF9CTE9DS19TSVpFKTsKKwkJICAgICAgREVTM18xMjhfQkxPQ0tfU0laRSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVzM18xMjhfZW5jcnlwdF9lY2IoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAorCQkJCQkgdTggKm91dCwgY29uc3QgdTggKmluLAorCQkJCQkgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgY3J5cHRfczM5MF9kZXMzXzEyOF9jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eChkZXNjLT50Zm0pOworCWludCByZXQ7CisKKwkvKiBvbmx5IHVzZSBjb21wbGV0ZSBibG9ja3MgKi8KKwluYnl0ZXMgJj0gfihERVMzXzEyOF9CTE9DS19TSVpFIC0gMSk7CisJcmV0ID0gY3J5cHRfczM5MF9rbShLTV9UREVBXzEyOF9FTkNSWVBULCBzY3R4LT5rZXksIG91dCwgaW4sIG5ieXRlcyk7CisJQlVHX09OKChyZXQgPCAwKSB8fCAocmV0ICE9IG5ieXRlcykpOworCisJcmV0dXJuIG5ieXRlczsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBkZXMzXzEyOF9kZWNyeXB0X2VjYihjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJCSB1OCAqb3V0LCBjb25zdCB1OCAqaW4sCisJCQkJCSB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTI4X2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KGRlc2MtPnRmbSk7CisJaW50IHJldDsKKworCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLworCW5ieXRlcyAmPSB+KERFUzNfMTI4X0JMT0NLX1NJWkUgLSAxKTsKKwlyZXQgPSBjcnlwdF9zMzkwX2ttKEtNX1RERUFfMTI4X0RFQ1JZUFQsIHNjdHgtPmtleSwgb3V0LCBpbiwgbmJ5dGVzKTsKKwlCVUdfT04oKHJldCA8IDApIHx8IChyZXQgIT0gbmJ5dGVzKSk7CisKKwlyZXR1cm4gbmJ5dGVzOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRlczNfMTI4X2VuY3J5cHRfY2JjKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKKwkJCQkJIHU4ICpvdXQsIGNvbnN0IHU4ICppbiwKKwkJCQkJIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGNyeXB0X3MzOTBfZGVzM18xMjhfY3R4ICpzY3R4ID0gY3J5cHRvX3RmbV9jdHgoZGVzYy0+dGZtKTsKKwlpbnQgcmV0OworCisJLyogb25seSB1c2UgY29tcGxldGUgYmxvY2tzICovCisJbmJ5dGVzICY9IH4oREVTM18xMjhfQkxPQ0tfU0laRSAtIDEpOworCisJbWVtY3B5KHNjdHgtPml2LCBkZXNjLT5pbmZvLCBERVMzXzEyOF9CTE9DS19TSVpFKTsKKwlyZXQgPSBjcnlwdF9zMzkwX2ttYyhLTUNfVERFQV8xMjhfRU5DUllQVCwgJnNjdHgtPml2LCBvdXQsIGluLCBuYnl0ZXMpOworCUJVR19PTigocmV0IDwgMCkgfHwgKHJldCAhPSBuYnl0ZXMpKTsKKworCW1lbWNweShkZXNjLT5pbmZvLCBzY3R4LT5pdiwgREVTM18xMjhfQkxPQ0tfU0laRSk7CisJcmV0dXJuIG5ieXRlczsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBkZXMzXzEyOF9kZWNyeXB0X2NiYyhjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJCSB1OCAqb3V0LCBjb25zdCB1OCAqaW4sCisJCQkJCSB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTI4X2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KGRlc2MtPnRmbSk7CisJaW50IHJldDsKKworCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLworCW5ieXRlcyAmPSB+KERFUzNfMTI4X0JMT0NLX1NJWkUgLSAxKTsKKworCW1lbWNweSgmc2N0eC0+aXYsIGRlc2MtPmluZm8sIERFUzNfMTI4X0JMT0NLX1NJWkUpOworCXJldCA9IGNyeXB0X3MzOTBfa21jKEtNQ19UREVBXzEyOF9ERUNSWVBULCAmc2N0eC0+aXYsIG91dCwgaW4sIG5ieXRlcyk7CisJQlVHX09OKChyZXQgPCAwKSB8fCAocmV0ICE9IG5ieXRlcykpOworCisJcmV0dXJuIG5ieXRlczsKIH0KIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGRlczNfMTI4X2FsZyA9IHsKQEAgLTE1NiwxMiArMjc0LDE5IEBACiAJLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgY3J5cHRfczM5MF9kZXMzXzEyOF9jdHgpLAogCS5jcmFfbW9kdWxlCQk9CVRISVNfTU9EVUxFLAogCS5jcmFfbGlzdAkJPQlMSVNUX0hFQURfSU5JVChkZXMzXzEyOF9hbGcuY3JhX2xpc3QpLAotCS5jcmFfdQkJCT0JeyAuY2lwaGVyID0gewotCS5jaWFfbWluX2tleXNpemUJPQlERVMzXzEyOF9LRVlfU0laRSwKLQkuY2lhX21heF9rZXlzaXplCT0JREVTM18xMjhfS0VZX1NJWkUsCi0JLmNpYV9zZXRrZXkJCT0gCWRlczNfMTI4X3NldGtleSwKLQkuY2lhX2VuY3J5cHQJCT0JZGVzM18xMjhfZW5jcnlwdCwKLQkuY2lhX2RlY3J5cHQJCT0JZGVzM18xMjhfZGVjcnlwdCB9IH0KKwkuY3JhX3UJCQk9CXsKKwkJLmNpcGhlciA9IHsKKwkJCS5jaWFfbWluX2tleXNpemUJPQlERVMzXzEyOF9LRVlfU0laRSwKKwkJCS5jaWFfbWF4X2tleXNpemUJPQlERVMzXzEyOF9LRVlfU0laRSwKKwkJCS5jaWFfc2V0a2V5CQk9CWRlczNfMTI4X3NldGtleSwKKwkJCS5jaWFfZW5jcnlwdAkJPQlkZXMzXzEyOF9lbmNyeXB0LAorCQkJLmNpYV9kZWNyeXB0CQk9CWRlczNfMTI4X2RlY3J5cHQsCisJCQkuY2lhX2VuY3J5cHRfZWNiCT0JZGVzM18xMjhfZW5jcnlwdF9lY2IsCisJCQkuY2lhX2RlY3J5cHRfZWNiCT0JZGVzM18xMjhfZGVjcnlwdF9lY2IsCisJCQkuY2lhX2VuY3J5cHRfY2JjCT0JZGVzM18xMjhfZW5jcnlwdF9jYmMsCisJCQkuY2lhX2RlY3J5cHRfY2JjCT0JZGVzM18xMjhfZGVjcnlwdF9jYmMsCisJCX0KKwl9CiB9OwogCiAvKgpAQCAtMTc3LDUwICszMDIsMTA4IEBACiAgKiAgIHByb3BlcnR5LgogICoKICAqLwotc3RhdGljIGludAotZGVzM18xOTJfc2V0a2V5KHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbiwgdTMyICpmbGFncykKK3N0YXRpYyBpbnQgZGVzM18xOTJfc2V0a2V5KHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbiwKKwkJCSAgIHUzMiAqZmxhZ3MpCiB7CiAJaW50IGksIHJldDsKLQlzdHJ1Y3QgY3J5cHRfczM5MF9kZXMzXzE5Ml9jdHggKmRjdHg7Ci0JY29uc3QgdTgqIHRlbXBfa2V5OworCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTkyX2N0eCAqZGN0eCA9IGN0eDsKKwljb25zdCB1OCogdGVtcF9rZXkgPSBrZXk7CiAKLQlkY3R4ID0gY3R4OwotCXRlbXBfa2V5ID0ga2V5OwogCWlmICghKG1lbWNtcChrZXksICZrZXlbREVTX0tFWV9TSVpFXSwgREVTX0tFWV9TSVpFKSAmJgogCSAgICBtZW1jbXAoJmtleVtERVNfS0VZX1NJWkVdLCAma2V5W0RFU19LRVlfU0laRSAqIDJdLAotCSAgICAJCQkJCURFU19LRVlfU0laRSkpKSB7CisJCSAgIERFU19LRVlfU0laRSkpKSB7CiAKIAkJKmZsYWdzIHw9IENSWVBUT19URk1fUkVTX0JBRF9LRVlfU0NIRUQ7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrLCB0ZW1wX2tleSArPSBERVNfS0VZX1NJWkUpIHsKIAkJcmV0ID0gY3J5cHRvX2Rlc19jaGVja19rZXkodGVtcF9rZXksIERFU19LRVlfU0laRSwgZmxhZ3MpOwotCQlpZiAocmV0IDwgMCl7CisJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKLQkJfQogCX0KIAltZW1jcHkoZGN0eC0+a2V5LCBrZXksIGtleWxlbik7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1kZXMzXzE5Ml9lbmNyeXB0KHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3N0YXRpYyB2b2lkIGRlczNfMTkyX2VuY3J5cHQodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQogewotCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTkyX2N0eCAqZGN0eDsKKwlzdHJ1Y3QgY3J5cHRfczM5MF9kZXMzXzE5Ml9jdHggKmRjdHggPSBjdHg7CiAKLQlkY3R4ID0gY3R4OwogCWNyeXB0X3MzOTBfa20oS01fVERFQV8xOTJfRU5DUllQVCwgZGN0eC0+a2V5LCBkc3QsICh2b2lkKilzcmMsCi0JCQlERVMzXzE5Ml9CTE9DS19TSVpFKTsKKwkJICAgICAgREVTM18xOTJfQkxPQ0tfU0laRSk7CiB9CiAKLXN0YXRpYyB2b2lkCi1kZXMzXzE5Ml9kZWNyeXB0KHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3N0YXRpYyB2b2lkIGRlczNfMTkyX2RlY3J5cHQodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQogewotCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTkyX2N0eCAqZGN0eDsKKwlzdHJ1Y3QgY3J5cHRfczM5MF9kZXMzXzE5Ml9jdHggKmRjdHggPSBjdHg7CiAKLQlkY3R4ID0gY3R4OwogCWNyeXB0X3MzOTBfa20oS01fVERFQV8xOTJfREVDUllQVCwgZGN0eC0+a2V5LCBkc3QsICh2b2lkKilzcmMsCi0JCQlERVMzXzE5Ml9CTE9DS19TSVpFKTsKKwkJICAgICAgREVTM18xOTJfQkxPQ0tfU0laRSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVzM18xOTJfZW5jcnlwdF9lY2IoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAorCQkJCQkgdTggKm91dCwgY29uc3QgdTggKmluLAorCQkJCQkgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgY3J5cHRfczM5MF9kZXMzXzE5Ml9jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eChkZXNjLT50Zm0pOworCWludCByZXQ7CisKKwkvKiBvbmx5IHVzZSBjb21wbGV0ZSBibG9ja3MgKi8KKwluYnl0ZXMgJj0gfihERVMzXzE5Ml9CTE9DS19TSVpFIC0gMSk7CisJcmV0ID0gY3J5cHRfczM5MF9rbShLTV9UREVBXzE5Ml9FTkNSWVBULCBzY3R4LT5rZXksIG91dCwgaW4sIG5ieXRlcyk7CisJQlVHX09OKChyZXQgPCAwKSB8fCAocmV0ICE9IG5ieXRlcykpOworCisJcmV0dXJuIG5ieXRlczsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBkZXMzXzE5Ml9kZWNyeXB0X2VjYihjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJCSB1OCAqb3V0LCBjb25zdCB1OCAqaW4sCisJCQkJCSB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTkyX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KGRlc2MtPnRmbSk7CisJaW50IHJldDsKKworCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLworCW5ieXRlcyAmPSB+KERFUzNfMTkyX0JMT0NLX1NJWkUgLSAxKTsKKwlyZXQgPSBjcnlwdF9zMzkwX2ttKEtNX1RERUFfMTkyX0RFQ1JZUFQsIHNjdHgtPmtleSwgb3V0LCBpbiwgbmJ5dGVzKTsKKwlCVUdfT04oKHJldCA8IDApIHx8IChyZXQgIT0gbmJ5dGVzKSk7CisKKwlyZXR1cm4gbmJ5dGVzOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRlczNfMTkyX2VuY3J5cHRfY2JjKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKKwkJCQkJIHU4ICpvdXQsIGNvbnN0IHU4ICppbiwKKwkJCQkJIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGNyeXB0X3MzOTBfZGVzM18xOTJfY3R4ICpzY3R4ID0gY3J5cHRvX3RmbV9jdHgoZGVzYy0+dGZtKTsKKwlpbnQgcmV0OworCisJLyogb25seSB1c2UgY29tcGxldGUgYmxvY2tzICovCisJbmJ5dGVzICY9IH4oREVTM18xOTJfQkxPQ0tfU0laRSAtIDEpOworCisJbWVtY3B5KHNjdHgtPml2LCBkZXNjLT5pbmZvLCBERVMzXzE5Ml9CTE9DS19TSVpFKTsKKwlyZXQgPSBjcnlwdF9zMzkwX2ttYyhLTUNfVERFQV8xOTJfRU5DUllQVCwgJnNjdHgtPml2LCBvdXQsIGluLCBuYnl0ZXMpOworCUJVR19PTigocmV0IDwgMCkgfHwgKHJldCAhPSBuYnl0ZXMpKTsKKworCW1lbWNweShkZXNjLT5pbmZvLCBzY3R4LT5pdiwgREVTM18xOTJfQkxPQ0tfU0laRSk7CisJcmV0dXJuIG5ieXRlczsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBkZXMzXzE5Ml9kZWNyeXB0X2NiYyhjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJCSB1OCAqb3V0LCBjb25zdCB1OCAqaW4sCisJCQkJCSB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBjcnlwdF9zMzkwX2RlczNfMTkyX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KGRlc2MtPnRmbSk7CisJaW50IHJldDsKKworCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLworCW5ieXRlcyAmPSB+KERFUzNfMTkyX0JMT0NLX1NJWkUgLSAxKTsKKworCW1lbWNweSgmc2N0eC0+aXYsIGRlc2MtPmluZm8sIERFUzNfMTkyX0JMT0NLX1NJWkUpOworCXJldCA9IGNyeXB0X3MzOTBfa21jKEtNQ19UREVBXzE5Ml9ERUNSWVBULCAmc2N0eC0+aXYsIG91dCwgaW4sIG5ieXRlcyk7CisJQlVHX09OKChyZXQgPCAwKSB8fCAocmV0ICE9IG5ieXRlcykpOworCisJcmV0dXJuIG5ieXRlczsKIH0KIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGRlczNfMTkyX2FsZyA9IHsKQEAgLTIzMCw0NCArNDEzLDQzIEBACiAJLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgY3J5cHRfczM5MF9kZXMzXzE5Ml9jdHgpLAogCS5jcmFfbW9kdWxlCQk9CVRISVNfTU9EVUxFLAogCS5jcmFfbGlzdAkJPQlMSVNUX0hFQURfSU5JVChkZXMzXzE5Ml9hbGcuY3JhX2xpc3QpLAotCS5jcmFfdQkJCT0JeyAuY2lwaGVyID0gewotCS5jaWFfbWluX2tleXNpemUJPQlERVMzXzE5Ml9LRVlfU0laRSwKLQkuY2lhX21heF9rZXlzaXplCT0JREVTM18xOTJfS0VZX1NJWkUsCi0JLmNpYV9zZXRrZXkJCT0gCWRlczNfMTkyX3NldGtleSwKLQkuY2lhX2VuY3J5cHQJCT0JZGVzM18xOTJfZW5jcnlwdCwKLQkuY2lhX2RlY3J5cHQJCT0JZGVzM18xOTJfZGVjcnlwdCB9IH0KKwkuY3JhX3UJCQk9CXsKKwkJLmNpcGhlciA9IHsKKwkJCS5jaWFfbWluX2tleXNpemUJPQlERVMzXzE5Ml9LRVlfU0laRSwKKwkJCS5jaWFfbWF4X2tleXNpemUJPQlERVMzXzE5Ml9LRVlfU0laRSwKKwkJCS5jaWFfc2V0a2V5CQk9CWRlczNfMTkyX3NldGtleSwKKwkJCS5jaWFfZW5jcnlwdAkJPQlkZXMzXzE5Ml9lbmNyeXB0LAorCQkJLmNpYV9kZWNyeXB0CQk9CWRlczNfMTkyX2RlY3J5cHQsCisJCQkuY2lhX2VuY3J5cHRfZWNiCT0JZGVzM18xOTJfZW5jcnlwdF9lY2IsCisJCQkuY2lhX2RlY3J5cHRfZWNiCT0JZGVzM18xOTJfZGVjcnlwdF9lY2IsCisJCQkuY2lhX2VuY3J5cHRfY2JjCT0JZGVzM18xOTJfZW5jcnlwdF9jYmMsCisJCQkuY2lhX2RlY3J5cHRfY2JjCT0JZGVzM18xOTJfZGVjcnlwdF9jYmMsCisJCX0KKwl9CiB9OwogCi0KLQotc3RhdGljIGludAotaW5pdCh2b2lkKQorc3RhdGljIGludCBpbml0KHZvaWQpCiB7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAogCWlmICghY3J5cHRfczM5MF9mdW5jX2F2YWlsYWJsZShLTV9ERUFfRU5DUllQVCkgfHwKIAkgICAgIWNyeXB0X3MzOTBfZnVuY19hdmFpbGFibGUoS01fVERFQV8xMjhfRU5DUllQVCkgfHwKLQkgICAgIWNyeXB0X3MzOTBfZnVuY19hdmFpbGFibGUoS01fVERFQV8xOTJfRU5DUllQVCkpeworCSAgICAhY3J5cHRfczM5MF9mdW5jX2F2YWlsYWJsZShLTV9UREVBXzE5Ml9FTkNSWVBUKSkKIAkJcmV0dXJuIC1FTk9TWVM7Ci0JfQogCi0JcmV0ID0gMDsKLQlyZXQgfD0gKGNyeXB0b19yZWdpc3Rlcl9hbGcoJmRlc19hbGcpID09IDApPyAwOjE7Ci0JcmV0IHw9IChjcnlwdG9fcmVnaXN0ZXJfYWxnKCZkZXMzXzEyOF9hbGcpID09IDApPyAwOjI7Ci0JcmV0IHw9IChjcnlwdG9fcmVnaXN0ZXJfYWxnKCZkZXMzXzE5Ml9hbGcpID09IDApPyAwOjQ7Ci0JaWYgKHJldCl7CisJcmV0IHw9IChjcnlwdG9fcmVnaXN0ZXJfYWxnKCZkZXNfYWxnKSA9PSAwKSA/IDA6MTsKKwlyZXQgfD0gKGNyeXB0b19yZWdpc3Rlcl9hbGcoJmRlczNfMTI4X2FsZykgPT0gMCkgPyAwOjI7CisJcmV0IHw9IChjcnlwdG9fcmVnaXN0ZXJfYWxnKCZkZXMzXzE5Ml9hbGcpID09IDApID8gMDo0OworCWlmIChyZXQpIHsKIAkJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZkZXMzXzE5Ml9hbGcpOwogCQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmRlczNfMTI4X2FsZyk7CiAJCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmZGVzX2FsZyk7CiAJCXJldHVybiAtRUVYSVNUOwogCX0KLQotCXByaW50ayhLRVJOX0lORk8gImNyeXB0X3MzOTA6IGRlc19zMzkwIGxvYWRlZC5cbiIpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQKLWZpbmkodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCiB7CiAJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZkZXMzXzE5Ml9hbGcpOwogCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmZGVzM18xMjhfYWxnKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jcnlwdG8vc2hhMjU2X3MzOTAuYyBiL2FyY2gvczM5MC9jcnlwdG8vc2hhMjU2X3MzOTAuYwppbmRleCBiNzViZGJkLi4xZWM1ZTkyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY3J5cHRvL3NoYTI1Nl9zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2NyeXB0by9zaGEyNTZfczM5MC5jCkBAIC01MSw2ICs1MSw3IEBACiB7CiAJc3RydWN0IHMzOTBfc2hhMjU2X2N0eCAqc2N0eCA9IGN0eDsKIAl1bnNpZ25lZCBpbnQgaW5kZXg7CisJaW50IHJldDsKIAogCS8qIGhvdyBtdWNoIGlzIGFscmVhZHkgaW4gdGhlIGJ1ZmZlcj8gKi8KIAlpbmRleCA9IHNjdHgtPmNvdW50IC8gOCAmIDB4M2Y7CkBAIC01OCwxNSArNTksMjkgQEAKIAkvKiB1cGRhdGUgbWVzc2FnZSBiaXQgbGVuZ3RoICovCiAJc2N0eC0+Y291bnQgKz0gbGVuICogODsKIAotCS8qIHByb2Nlc3Mgb25lIGJsb2NrICovCi0JaWYgKChpbmRleCArIGxlbikgPj0gU0hBMjU2X0JMT0NLX1NJWkUpIHsKKwlpZiAoKGluZGV4ICsgbGVuKSA8IFNIQTI1Nl9CTE9DS19TSVpFKQorCQlnb3RvIHN0b3JlOworCisJLyogcHJvY2VzcyBvbmUgc3RvcmVkIGJsb2NrICovCisJaWYgKGluZGV4KSB7CiAJCW1lbWNweShzY3R4LT5idWYgKyBpbmRleCwgZGF0YSwgU0hBMjU2X0JMT0NLX1NJWkUgLSBpbmRleCk7Ci0JCWNyeXB0X3MzOTBfa2ltZChLSU1EX1NIQV8yNTYsIHNjdHgtPnN0YXRlLCBzY3R4LT5idWYsCi0JCQkJU0hBMjU2X0JMT0NLX1NJWkUpOworCQlyZXQgPSBjcnlwdF9zMzkwX2tpbWQoS0lNRF9TSEFfMjU2LCBzY3R4LT5zdGF0ZSwgc2N0eC0+YnVmLAorCQkJCSAgICAgIFNIQTI1Nl9CTE9DS19TSVpFKTsKKwkJQlVHX09OKHJldCAhPSBTSEEyNTZfQkxPQ0tfU0laRSk7CiAJCWRhdGEgKz0gU0hBMjU2X0JMT0NLX1NJWkUgLSBpbmRleDsKIAkJbGVuIC09IFNIQTI1Nl9CTE9DS19TSVpFIC0gaW5kZXg7CiAJfQogCisJLyogcHJvY2VzcyBhcyBtYW55IGJsb2NrcyBhcyBwb3NzaWJsZSAqLworCWlmIChsZW4gPj0gU0hBMjU2X0JMT0NLX1NJWkUpIHsKKwkJcmV0ID0gY3J5cHRfczM5MF9raW1kKEtJTURfU0hBXzI1Niwgc2N0eC0+c3RhdGUsIGRhdGEsCisJCQkJICAgICAgbGVuICYgfihTSEEyNTZfQkxPQ0tfU0laRSAtIDEpKTsKKwkJQlVHX09OKHJldCAhPSAobGVuICYgfihTSEEyNTZfQkxPQ0tfU0laRSAtIDEpKSk7CisJCWRhdGEgKz0gcmV0OworCQlsZW4gLT0gcmV0OworCX0KKworc3RvcmU6CiAJLyogYW55dGhpbmcgbGVmdD8gKi8KIAlpZiAobGVuKQogCQltZW1jcHkoc2N0eC0+YnVmICsgaW5kZXggLCBkYXRhLCBsZW4pOwpAQCAtMTE5LDkgKzEzNCw5IEBACiAJLmNyYV9saXN0CT0JTElTVF9IRUFEX0lOSVQoYWxnLmNyYV9saXN0KSwKIAkuY3JhX3UJCT0JeyAuZGlnZXN0ID0gewogCS5kaWFfZGlnZXN0c2l6ZQk9CVNIQTI1Nl9ESUdFU1RfU0laRSwKLQkuZGlhX2luaXQgICAJPSAJc2hhMjU2X2luaXQsCi0JLmRpYV91cGRhdGUgCT0Jc2hhMjU2X3VwZGF0ZSwKLQkuZGlhX2ZpbmFsICAJPQlzaGEyNTZfZmluYWwgfSB9CisJLmRpYV9pbml0CT0Jc2hhMjU2X2luaXQsCisJLmRpYV91cGRhdGUJPQlzaGEyNTZfdXBkYXRlLAorCS5kaWFfZmluYWwJPQlzaGEyNTZfZmluYWwgfSB9CiB9OwogCiBzdGF0aWMgaW50IGluaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlCmluZGV4IDQ4NjVlNGIuLjkyNjliNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9NYWtlZmlsZQpAQCAtMTcsOCArMTcsNyBAQAogb2JqLSQoQ09ORklHX1NNUCkJCSs9IHNtcC5vCiAKIG9iai0kKENPTkZJR19DT01QQVQpCQkrPSBjb21wYXRfbGludXgubyBjb21wYXRfc2lnbmFsLm8gXAotCQkJCQljb21wYXRfaW9jdGwubyBjb21wYXRfd3JhcHBlci5vIFwKLQkJCQkJY29tcGF0X2V4ZWNfZG9tYWluLm8KKwkJCQkJY29tcGF0X3dyYXBwZXIubyBjb21wYXRfZXhlY19kb21haW4ubwogb2JqLSQoQ09ORklHX0JJTkZNVF9FTEYzMikJKz0gYmluZm10X2VsZjMyLm8KIAogb2JqLSQoQ09ORklHX1ZJUlRfVElNRVIpCSs9IHZ0aW1lLm8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvYmluZm10X2VsZjMyLmMgYi9hcmNoL3MzOTAva2VybmVsL2JpbmZtdF9lbGYzMi5jCmluZGV4IDAzYmE1ODkuLjFmNDUxYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvYmluZm10X2VsZjMyLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9iaW5mbXRfZWxmMzIuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGR1bXBfdGFza19yZWdzMzIoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGVsZl9ncmVnc2V0X3QgKnJlZ3MpCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgKnB0cmVncyA9IF9fS1NUS19QVFJFR1ModHNrKTsKKwlzdHJ1Y3QgcHRfcmVncyAqcHRyZWdzID0gdGFza19wdF9yZWdzKHRzayk7CiAJaW50IGk7CiAKIAltZW1jcHkoJnJlZ3MtPnBzdy5tYXNrLCAmcHRyZWdzLT5wc3cubWFzaywgNCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9pb2N0bC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfaW9jdGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwNGM0ZS4uMDAwMDAwMAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9pb2N0bC5jCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIGlvY3RsMzIuYzogQ29udmVyc2lvbiBiZXR3ZWVuIDMyYml0IGFuZCA2NGJpdCBuYXRpdmUgaW9jdGxzLgotICoKLSAqICBTMzkwIHZlcnNpb24KLSAqICAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KLSAqICAgIEF1dGhvcihzKTogR2VyaGFyZCBUb25uICh0b25AZGUuaWJtLmNvbSkKLSAqICAgICAgICAgICAgICAgQXJuZCBCZXJnbWFubiAoYXJuZGJAZGUuaWJtLmNvbSkKLSAqCi0gKiBPcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBmcm9tIDMyLWJpdCBTcGFyYyBjb21wYXQgY29kZSB3aGljaCBpcwotICogQ29weXJpZ2h0IChDKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAqIFdyaXR0ZW4gYnkgVWxmIENhcmxzc29uICh1bGZjQGVuZ3Iuc2dpLmNvbSkgCi0gKi8KLQotI2luY2x1ZGUgImNvbXBhdF9saW51eC5oIgotI2RlZmluZSBJTkNMVURFUwotI2RlZmluZSBDT0RFCi0jaW5jbHVkZSAiLi4vLi4vLi4vZnMvY29tcGF0X2lvY3RsLmMiCi0jaW5jbHVkZSA8YXNtL2Rhc2QuaD4KLSNpbmNsdWRlIDxhc20vY21iLmg+Ci0jaW5jbHVkZSA8YXNtL3RhcGUzOTAuaD4KLSNpbmNsdWRlIDxhc20vY2N3ZGV2Lmg+Ci0jaW5jbHVkZSAiLi4vLi4vLi4vZHJpdmVycy9zMzkwL2NoYXIvcmF3MzI3MC5oIgotCi1zdGF0aWMgaW50IGRvX2lvY3RsMzJfcG9pbnRlcih1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJdW5zaWduZWQgbG9uZyBhcmcsIHN0cnVjdCBmaWxlICpmKQotewotCXJldHVybiBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpY29tcGF0X3B0cihhcmcpKTsKLX0KLQotc3RhdGljIGludCBkb19pb2N0bDMyX3Vsb25nKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQl1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZpbGUgKmYpCi17Ci0JcmV0dXJuIHN5c19pb2N0bChmZCwgY21kLCBhcmcpOwotfQotCi0jZGVmaW5lIENPTVBBVElCTEVfSU9DVEwoY21kKQkJSEFORExFX0lPQ1RMKChjbWQpLChpb2N0bF90cmFuc19oYW5kbGVyX3QpZG9faW9jdGwzMl9wb2ludGVyKQotI2RlZmluZSBVTE9OR19JT0NUTChjbWQpCQlIQU5ETEVfSU9DVEwoKGNtZCksKGlvY3RsX3RyYW5zX2hhbmRsZXJfdClkb19pb2N0bDMyX3Vsb25nKQotI2RlZmluZSBIQU5ETEVfSU9DVEwoY21kLGhhbmRsZXIpCXsgKGNtZCksIChpb2N0bF90cmFuc19oYW5kbGVyX3QpKGhhbmRsZXIpLCBOVUxMIH0sCi0KLXN0cnVjdCBpb2N0bF90cmFucyBpb2N0bF9zdGFydFtdID0gewotLyogYXJjaGl0ZWN0dXJlIGluZGVwZW5kZW50IGlvY3RscyAqLwotI2luY2x1ZGUgPGxpbnV4L2NvbXBhdF9pb2N0bC5oPgotI2RlZmluZSBERUNMQVJFUwotI2luY2x1ZGUgIi4uLy4uLy4uL2ZzL2NvbXBhdF9pb2N0bC5jIgotCi0vKiBzMzkwIG9ubHkgaW9jdGxzICovCi1DT01QQVRJQkxFX0lPQ1RMKERBU0RBUElWRVIpCi1DT01QQVRJQkxFX0lPQ1RMKEJJT0RBU0RESVNBQkxFKQotQ09NUEFUSUJMRV9JT0NUTChCSU9EQVNERU5BQkxFKQotQ09NUEFUSUJMRV9JT0NUTChCSU9EQVNEUlNSVikKLUNPTVBBVElCTEVfSU9DVEwoQklPREFTRFJMU0UpCi1DT01QQVRJQkxFX0lPQ1RMKEJJT0RBU0RTTENLKQotQ09NUEFUSUJMRV9JT0NUTChCSU9EQVNESU5GTykKLUNPTVBBVElCTEVfSU9DVEwoQklPREFTRElORk8yKQotQ09NUEFUSUJMRV9JT0NUTChCSU9EQVNERk1UKQotQ09NUEFUSUJMRV9JT0NUTChCSU9EQVNEUFJSU1QpCi1DT01QQVRJQkxFX0lPQ1RMKEJJT0RBU0RRVUlFU0NFKQotQ09NUEFUSUJMRV9JT0NUTChCSU9EQVNEUkVTVU1FKQotQ09NUEFUSUJMRV9JT0NUTChCSU9EQVNEUFJSRCkKLUNPTVBBVElCTEVfSU9DVEwoQklPREFTRFBTUkQpCi1DT01QQVRJQkxFX0lPQ1RMKEJJT0RBU0RHQVRUUikKLUNPTVBBVElCTEVfSU9DVEwoQklPREFTRFNBVFRSKQotQ09NUEFUSUJMRV9JT0NUTChCSU9EQVNEQ01GRU5BQkxFKQotQ09NUEFUSUJMRV9JT0NUTChCSU9EQVNEQ01GRElTQUJMRSkKLUNPTVBBVElCTEVfSU9DVEwoQklPREFTRFJFQURBTExDTUIpCi0KLUNPTVBBVElCTEVfSU9DVEwoVFVCSUNNRCkKLUNPTVBBVElCTEVfSU9DVEwoVFVCT0NNRCkKLUNPTVBBVElCTEVfSU9DVEwoVFVCR0VUSSkKLUNPTVBBVElCTEVfSU9DVEwoVFVCR0VUTykKLUNPTVBBVElCTEVfSU9DVEwoVFVCU0VUTU9EKQotQ09NUEFUSUJMRV9JT0NUTChUVUJHRVRNT0QpCi0KLUNPTVBBVElCTEVfSU9DVEwoVEFQRTM5MF9ESVNQTEFZKQotCi0vKiBzMzkwIGRvZXNuJ3QgbmVlZCBoYW5kbGVycyBoZXJlICovCi1DT01QQVRJQkxFX0lPQ1RMKFRJT0NHU0VSSUFMKQotQ09NUEFUSUJMRV9JT0NUTChUSU9DU1NFUklBTCkKLX07Ci0KLWludCBpb2N0bF90YWJsZV9zaXplID0gQVJSQVlfU0laRShpb2N0bF9zdGFydCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYwppbmRleCA0MWIxOTdhLi5iZjlhN2EzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMKQEAgLTU1LDYgKzU1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpbmZtdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CkBAIC0xMDE0LDM4ICsxMDE1LDYgQEAKIH0KIAogLyoKLSAqIFdyYXBwZXIgZnVuY3Rpb24gZm9yIHN5c190aW1lcl9jcmVhdGUuCi0gKi8KLWV4dGVybiBhc21saW5rYWdlIGxvbmcKLXN5c190aW1lcl9jcmVhdGUoY2xvY2tpZF90LCBzdHJ1Y3Qgc2lnZXZlbnQgKiwgdGltZXJfdCAqKTsKLQotYXNtbGlua2FnZSBsb25nCi1zeXMzMl90aW1lcl9jcmVhdGUoY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBzdHJ1Y3QgY29tcGF0X3NpZ2V2ZW50ICpzZTMyLAotCQl0aW1lcl90ICp0aW1lcl9pZCkKLXsKLQlzdHJ1Y3Qgc2lnZXZlbnQgc2U7Ci0JdGltZXJfdCBrdGltZXJfaWQ7Ci0JbW1fc2VnbWVudF90IG9sZF9mczsKLQlsb25nIHJldDsKLQotCWlmIChzZTMyID09IE5VTEwpCi0JCXJldHVybiBzeXNfdGltZXJfY3JlYXRlKHdoaWNoX2Nsb2NrLCBOVUxMLCB0aW1lcl9pZCk7Ci0KLQlpZiAoZ2V0X2NvbXBhdF9zaWdldmVudCgmc2UsIHNlMzIpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCW9sZF9mcyA9IGdldF9mcygpOwotCXNldF9mcyhLRVJORUxfRFMpOwotCXJldCA9IHN5c190aW1lcl9jcmVhdGUod2hpY2hfY2xvY2ssICZzZSwgJmt0aW1lcl9pZCk7Ci0Jc2V0X2ZzKG9sZF9mcyk7Ci0KLQlpZiAoIXJldCkKLQkJcmV0ID0gcHV0X3VzZXIgKGt0aW1lcl9pZCwgdGltZXJfaWQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKICAqIDMxIGJpdCBlbXVsYXRpb24gd3JhcHBlciBmdW5jdGlvbnMgZm9yIHN5c19mYWR2aXNlNjQvZmFkdmlzZTY0XzY0LgogICogVGhlc2UgbmVlZCB0byByZXdyaXRlIHRoZSBhZHZpc2UgdmFsdWVzIGZvciBQT1NJWF9GQURWX3tET05UTkVFRCxOT1JFVVNFfQogICogYmVjYXVzZSB0aGUgMzEgYml0IHZhbHVlcyBkaWZmZXIgZnJvbSB0aGUgNjQgYml0IHZhbHVlcy4KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUwppbmRleCAyM2ZlOTRlLi5jZmRlMTkwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfd3JhcHBlci5TCkBAIC0xMjg5LDcgKzEyODksNyBAQAogCWxnZnIJJXIyLCVyMgkJCSMgdGltZXJfdCAoaW50KQogCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBjb21wYXRfc2lnZXZlbnQgKgogCWxsZ3RyCSVyNCwlcjQJCQkjIHRpbWVyX3QgKgotCWpnCXN5czMyX3RpbWVyX2NyZWF0ZQorCWpnCWNvbXBhdF9zeXNfdGltZXJfY3JlYXRlCiAKIAkuZ2xvYmwJc3lzMzJfdGltZXJfc2V0dGltZV93cmFwcGVyCiBzeXMzMl90aW1lcl9zZXR0aW1lX3dyYXBwZXI6CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NyYXNoLmMgYi9hcmNoL3MzOTAva2VybmVsL2NyYXNoLmMKaW5kZXggN2JkMTY5Yy4uOTI2Y2NlZSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9jcmFzaC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvY3Jhc2guYwpAQCAtMTAsOCArMTAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgogCi1ub3RlX2J1Zl90IGNyYXNoX25vdGVzW05SX0NQVVNdOwotCiB2b2lkIG1hY2hpbmVfY3Jhc2hfc2h1dGRvd24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGE5NDJiZjIuLjAwOGM3NDUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC01OCwxMCArNTgsMTggQEAKICAqLwogdW5zaWduZWQgbG9uZyB0aHJlYWRfc2F2ZWRfcGMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7Ci0Jc3RydWN0IHN0YWNrX2ZyYW1lICpzZjsKKwlzdHJ1Y3Qgc3RhY2tfZnJhbWUgKnNmLCAqbG93LCAqaGlnaDsKIAotCXNmID0gKHN0cnVjdCBzdGFja19mcmFtZSAqKSB0c2stPnRocmVhZC5rc3A7Ci0Jc2YgPSAoc3RydWN0IHN0YWNrX2ZyYW1lICopIHNmLT5iYWNrX2NoYWluOworCWlmICghdHNrIHx8ICF0YXNrX3N0YWNrX3BhZ2UodHNrKSkKKwkJcmV0dXJuIDA7CisJbG93ID0gdGFza19zdGFja19wYWdlKHRzayk7CisJaGlnaCA9IChzdHJ1Y3Qgc3RhY2tfZnJhbWUgKikgdGFza19wdF9yZWdzKHRzayk7CisJc2YgPSAoc3RydWN0IHN0YWNrX2ZyYW1lICopICh0c2stPnRocmVhZC5rc3AgJiBQU1dfQUREUl9JTlNOKTsKKwlpZiAoc2YgPD0gbG93IHx8IHNmID4gaGlnaCkKKwkJcmV0dXJuIDA7CisJc2YgPSAoc3RydWN0IHN0YWNrX2ZyYW1lICopIChzZi0+YmFja19jaGFpbiAmIFBTV19BRERSX0lOU04pOworCWlmIChzZiA8PSBsb3cgfHwgc2YgPiBoaWdoKQorCQlyZXR1cm4gMDsKIAlyZXR1cm4gc2YtPmdwcnNbOF07CiB9CiAKQEAgLTE1Myw3ICsxNjEsNyBAQAogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKIAotICAgICAgICBwcmludGsoIkNQVTogICAgJWQgICAgJXNcbiIsIHRzay0+dGhyZWFkX2luZm8tPmNwdSwgcHJpbnRfdGFpbnRlZCgpKTsKKyAgICAgICAgcHJpbnRrKCJDUFU6ICAgICVkICAgICVzXG4iLCB0YXNrX3RocmVhZF9pbmZvKHRzayktPmNwdSwgcHJpbnRfdGFpbnRlZCgpKTsKICAgICAgICAgcHJpbnRrKCJQcm9jZXNzICVzIChwaWQ6ICVkLCB0YXNrOiAlcCwga3NwOiAlcClcbiIsCiAJICAgICAgIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgKHZvaWQgKikgdHNrLAogCSAgICAgICAodm9pZCAqKSB0c2stPnRocmVhZC5rc3ApOwpAQCAtMjE3LDggKzIyNSw3IEBACiAgICAgICAgICAgICBzdHJ1Y3QgcHRfcmVncyBjaGlsZHJlZ3M7CiAgICAgICAgICAgfSAqZnJhbWU7CiAKLSAgICAgICAgZnJhbWUgPSAoKHN0cnVjdCBmYWtlX2ZyYW1lICopCi0JCSAoVEhSRUFEX1NJWkUgKyAodW5zaWduZWQgbG9uZykgcC0+dGhyZWFkX2luZm8pKSAtIDE7CisgICAgICAgIGZyYW1lID0gY29udGFpbmVyX29mKHRhc2tfcHRfcmVncyhwKSwgc3RydWN0IGZha2VfZnJhbWUsIGNoaWxkcmVncyk7CiAgICAgICAgIHAtPnRocmVhZC5rc3AgPSAodW5zaWduZWQgbG9uZykgZnJhbWU7CiAJLyogU3RvcmUgYWNjZXNzIHJlZ2lzdGVycyB0byBrZXJuZWwgc3RhY2sgb2YgbmV3IHByb2Nlc3MuICovCiAgICAgICAgIGZyYW1lLT5jaGlsZHJlZ3MgPSAqcmVnczsKQEAgLTM1MiwzOCArMzU5LDE2IEBACiAJcmV0dXJuIDE7CiB9CiAKLS8qCi0gKiBmaWxsIGluIHRoZSB1c2VyIHN0cnVjdHVyZSBmb3IgYSBjb3JlIGR1bXAuLgotICovCi12b2lkIGR1bXBfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICogcmVncywgc3RydWN0IHVzZXIgKiBkdW1wKQotewotCi0vKiBjaGFuZ2VkIHRoZSBzaXplIGNhbGN1bGF0aW9ucyAtIHNob3VsZCBob3BlZnVsbHkgd29yayBiZXR0ZXIuIGxidCAqLwotCWR1bXAtPm1hZ2ljID0gQ01BR0lDOwotCWR1bXAtPnN0YXJ0X2NvZGUgPSAwOwotCWR1bXAtPnN0YXJ0X3N0YWNrID0gcmVncy0+Z3Byc1sxNV0gJiB+KFBBR0VfU0laRSAtIDEpOwotCWR1bXAtPnVfdHNpemUgPSBjdXJyZW50LT5tbS0+ZW5kX2NvZGUgPj4gUEFHRV9TSElGVDsKLQlkdW1wLT51X2RzaXplID0gKGN1cnJlbnQtPm1tLT5icmsgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwotCWR1bXAtPnVfZHNpemUgLT0gZHVtcC0+dV90c2l6ZTsKLQlkdW1wLT51X3NzaXplID0gMDsKLQlpZiAoZHVtcC0+c3RhcnRfc3RhY2sgPCBUQVNLX1NJWkUpCi0JCWR1bXAtPnVfc3NpemUgPSAoVEFTS19TSVpFIC0gZHVtcC0+c3RhcnRfc3RhY2spID4+IFBBR0VfU0hJRlQ7Ci0JbWVtY3B5KCZkdW1wLT5yZWdzLCByZWdzLCBzaXplb2YoczM5MF9yZWdzKSk7Ci0JZHVtcF9mcHUgKHJlZ3MsICZkdW1wLT5yZWdzLmZwX3JlZ3MpOwotCWR1bXAtPnJlZ3MucGVyX2luZm8gPSBjdXJyZW50LT50aHJlYWQucGVyX2luZm87Ci19Ci0KIHVuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKIAlzdHJ1Y3Qgc3RhY2tfZnJhbWUgKnNmLCAqbG93LCAqaGlnaDsKIAl1bnNpZ25lZCBsb25nIHJldHVybl9hZGRyZXNzOwogCWludCBjb3VudDsKIAotCWlmICghcCB8fCBwID09IGN1cnJlbnQgfHwgcC0+c3RhdGUgPT0gVEFTS19SVU5OSU5HIHx8ICFwLT50aHJlYWRfaW5mbykKKwlpZiAoIXAgfHwgcCA9PSBjdXJyZW50IHx8IHAtPnN0YXRlID09IFRBU0tfUlVOTklORyB8fCAhdGFza19zdGFja19wYWdlKHApKQogCQlyZXR1cm4gMDsKLQlsb3cgPSAoc3RydWN0IHN0YWNrX2ZyYW1lICopIHAtPnRocmVhZF9pbmZvOwotCWhpZ2ggPSAoc3RydWN0IHN0YWNrX2ZyYW1lICopCi0JCSgodW5zaWduZWQgbG9uZykgcC0+dGhyZWFkX2luZm8gKyBUSFJFQURfU0laRSkgLSAxOworCWxvdyA9IHRhc2tfc3RhY2tfcGFnZShwKTsKKwloaWdoID0gKHN0cnVjdCBzdGFja19mcmFtZSAqKSB0YXNrX3B0X3JlZ3MocCk7CiAJc2YgPSAoc3RydWN0IHN0YWNrX2ZyYW1lICopIChwLT50aHJlYWQua3NwICYgUFNXX0FERFJfSU5TTik7CiAJaWYgKHNmIDw9IGxvdyB8fCBzZiA+IGhpZ2gpCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvczM5MC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggOGVjZGE2ZC4uMzdkZmUzMyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jCkBAIC01Miw3ICs1Miw3IEBACiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CiAJcGVyX3N0cnVjdCAqcGVyX2luZm87CiAKLQlyZWdzID0gX19LU1RLX1BUUkVHUyh0YXNrKTsKKwlyZWdzID0gdGFza19wdF9yZWdzKHRhc2spOwogCXBlcl9pbmZvID0gKHBlcl9zdHJ1Y3QgKikgJnRhc2stPnRocmVhZC5wZXJfaW5mbzsKIAlwZXJfaW5mby0+Y29udHJvbF9yZWdzLmJpdHMuZW1faW5zdHJ1Y3Rpb25fZmV0Y2ggPQogCQlwZXJfaW5mby0+c2luZ2xlX3N0ZXAgfCBwZXJfaW5mby0+aW5zdHJ1Y3Rpb25fZmV0Y2g7CkBAIC0xNTAsNyArMTUwLDcgQEAKIAkJLyoKIAkJICogcHN3IGFuZCBncHJzIGFyZSBzdG9yZWQgb24gdGhlIHN0YWNrCiAJCSAqLwotCQl0bXAgPSAqKGFkZHJfdCAqKSgoYWRkcl90KSAmX19LU1RLX1BUUkVHUyhjaGlsZCktPnBzdyArIGFkZHIpOworCQl0bXAgPSAqKGFkZHJfdCAqKSgoYWRkcl90KSAmdGFza19wdF9yZWdzKGNoaWxkKS0+cHN3ICsgYWRkcik7CiAJCWlmIChhZGRyID09IChhZGRyX3QpICZkdW1teS0+cmVncy5wc3cubWFzaykKIAkJCS8qIFJlbW92ZSBwZXIgYml0IGZyb20gdXNlciBwc3cuICovCiAJCQl0bXAgJj0gflBTV19NQVNLX1BFUjsKQEAgLTE3Niw3ICsxNzYsNyBAQAogCQkvKgogCQkgKiBvcmlnX2dwcjIgaXMgc3RvcmVkIG9uIHRoZSBrZXJuZWwgc3RhY2sKIAkJICovCi0JCXRtcCA9IChhZGRyX3QpIF9fS1NUS19QVFJFR1MoY2hpbGQpLT5vcmlnX2dwcjI7CisJCXRtcCA9IChhZGRyX3QpIHRhc2tfcHRfcmVncyhjaGlsZCktPm9yaWdfZ3ByMjsKIAogCX0gZWxzZSBpZiAoYWRkciA8IChhZGRyX3QpICgmZHVtbXktPnJlZ3MuZnBfcmVncyArIDEpKSB7CiAJCS8qIApAQCAtMjQzLDcgKzI0Myw3IEBACiAJCQkgICBoaWdoIG9yZGVyIGJpdCBidXQgb2xkZXIgZ2RiJ3MgcmVseSBvbiBpdCAqLwogCQkJZGF0YSB8PSBQU1dfQUREUl9BTU9ERTsKICNlbmRpZgotCQkqKGFkZHJfdCAqKSgoYWRkcl90KSAmX19LU1RLX1BUUkVHUyhjaGlsZCktPnBzdyArIGFkZHIpID0gZGF0YTsKKwkJKihhZGRyX3QgKikoKGFkZHJfdCkgJnRhc2tfcHRfcmVncyhjaGlsZCktPnBzdyArIGFkZHIpID0gZGF0YTsKIAogCX0gZWxzZSBpZiAoYWRkciA8IChhZGRyX3QpICgmZHVtbXktPnJlZ3Mub3JpZ19ncHIyKSkgewogCQkvKgpAQCAtMjY3LDcgKzI2Nyw3IEBACiAJCS8qCiAJCSAqIG9yaWdfZ3ByMiBpcyBzdG9yZWQgb24gdGhlIGtlcm5lbCBzdGFjawogCQkgKi8KLQkJX19LU1RLX1BUUkVHUyhjaGlsZCktPm9yaWdfZ3ByMiA9IGRhdGE7CisJCXRhc2tfcHRfcmVncyhjaGlsZCktPm9yaWdfZ3ByMiA9IGRhdGE7CiAKIAl9IGVsc2UgaWYgKGFkZHIgPCAoYWRkcl90KSAoJmR1bW15LT5yZWdzLmZwX3JlZ3MgKyAxKSkgewogCQkvKgpAQCAtMzkzLDE1ICszOTMsMTUgQEAKIAkJICovCiAJCWlmIChhZGRyID09IChhZGRyX3QpICZkdW1teTMyLT5yZWdzLnBzdy5tYXNrKSB7CiAJCQkvKiBGYWtlIGEgMzEgYml0IHBzdyBtYXNrLiAqLwotCQkJdG1wID0gKF9fdTMyKShfX0tTVEtfUFRSRUdTKGNoaWxkKS0+cHN3Lm1hc2sgPj4gMzIpOworCQkJdG1wID0gKF9fdTMyKSh0YXNrX3B0X3JlZ3MoY2hpbGQpLT5wc3cubWFzayA+PiAzMik7CiAJCQl0bXAgPSBQU1czMl9NQVNLX01FUkdFKFBTVzMyX1VTRVJfQklUUywgdG1wKTsKIAkJfSBlbHNlIGlmIChhZGRyID09IChhZGRyX3QpICZkdW1teTMyLT5yZWdzLnBzdy5hZGRyKSB7CiAJCQkvKiBGYWtlIGEgMzEgYml0IHBzdyBhZGRyZXNzLiAqLwotCQkJdG1wID0gKF9fdTMyKSBfX0tTVEtfUFRSRUdTKGNoaWxkKS0+cHN3LmFkZHIgfAorCQkJdG1wID0gKF9fdTMyKSB0YXNrX3B0X3JlZ3MoY2hpbGQpLT5wc3cuYWRkciB8CiAJCQkJUFNXMzJfQUREUl9BTU9ERTMxOwogCQl9IGVsc2UgewogCQkJLyogZ3ByIDAtMTUgKi8KLQkJCXRtcCA9ICooX191MzIgKikoKGFkZHJfdCkgJl9fS1NUS19QVFJFR1MoY2hpbGQpLT5wc3cgKworCQkJdG1wID0gKihfX3UzMiAqKSgoYWRkcl90KSAmdGFza19wdF9yZWdzKGNoaWxkKS0+cHN3ICsKIAkJCQkJIGFkZHIqMiArIDQpOwogCQl9CiAJfSBlbHNlIGlmIChhZGRyIDwgKGFkZHJfdCkgKCZkdW1teTMyLT5yZWdzLm9yaWdfZ3ByMikpIHsKQEAgLTQxNSw3ICs0MTUsNyBAQAogCQkvKgogCQkgKiBvcmlnX2dwcjIgaXMgc3RvcmVkIG9uIHRoZSBrZXJuZWwgc3RhY2sKIAkJICovCi0JCXRtcCA9ICooX191MzIqKSgoYWRkcl90KSAmX19LU1RLX1BUUkVHUyhjaGlsZCktPm9yaWdfZ3ByMiArIDQpOworCQl0bXAgPSAqKF9fdTMyKikoKGFkZHJfdCkgJnRhc2tfcHRfcmVncyhjaGlsZCktPm9yaWdfZ3ByMiArIDQpOwogCiAJfSBlbHNlIGlmIChhZGRyIDwgKGFkZHJfdCkgKCZkdW1teTMyLT5yZWdzLmZwX3JlZ3MgKyAxKSkgewogCQkvKgpAQCAtNDcyLDE1ICs0NzIsMTUgQEAKIAkJCWlmICh0bXAgIT0gUFNXMzJfTUFTS19NRVJHRShQU1czMl9VU0VSX0JJVFMsIHRtcCkpCiAJCQkJLyogSW52YWxpZCBwc3cgbWFzay4gKi8KIAkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCV9fS1NUS19QVFJFR1MoY2hpbGQpLT5wc3cubWFzayA9CisJCQl0YXNrX3B0X3JlZ3MoY2hpbGQpLT5wc3cubWFzayA9CiAJCQkJUFNXX01BU0tfTUVSR0UoUFNXX1VTRVIzMl9CSVRTLCAoX191NjQpIHRtcCA8PCAzMik7CiAJCX0gZWxzZSBpZiAoYWRkciA9PSAoYWRkcl90KSAmZHVtbXkzMi0+cmVncy5wc3cuYWRkcikgewogCQkJLyogQnVpbGQgYSA2NCBiaXQgcHN3IGFkZHJlc3MgZnJvbSAzMSBiaXQgYWRkcmVzcy4gKi8KLQkJCV9fS1NUS19QVFJFR1MoY2hpbGQpLT5wc3cuYWRkciA9IAorCQkJdGFza19wdF9yZWdzKGNoaWxkKS0+cHN3LmFkZHIgPQogCQkJCShfX3U2NCkgdG1wICYgUFNXMzJfQUREUl9JTlNOOwogCQl9IGVsc2UgewogCQkJLyogZ3ByIDAtMTUgKi8KLQkJCSooX191MzIqKSgoYWRkcl90KSAmX19LU1RLX1BUUkVHUyhjaGlsZCktPnBzdworCQkJKihfX3UzMiopKChhZGRyX3QpICZ0YXNrX3B0X3JlZ3MoY2hpbGQpLT5wc3cKIAkJCQkgICsgYWRkcioyICsgNCkgPSB0bXA7CiAJCX0KIAl9IGVsc2UgaWYgKGFkZHIgPCAoYWRkcl90KSAoJmR1bW15MzItPnJlZ3Mub3JpZ19ncHIyKSkgewpAQCAtNDk0LDcgKzQ5NCw3IEBACiAJCS8qCiAJCSAqIG9yaWdfZ3ByMiBpcyBzdG9yZWQgb24gdGhlIGtlcm5lbCBzdGFjawogCQkgKi8KLQkJKihfX3UzMiopKChhZGRyX3QpICZfX0tTVEtfUFRSRUdTKGNoaWxkKS0+b3JpZ19ncHIyICsgNCkgPSB0bXA7CisJCSooX191MzIqKSgoYWRkcl90KSAmdGFza19wdF9yZWdzKGNoaWxkKS0+b3JpZ19ncHIyICsgNCkgPSB0bXA7CiAKIAl9IGVsc2UgaWYgKGFkZHIgPCAoYWRkcl90KSAoJmR1bW15MzItPnJlZ3MuZnBfcmVncyArIDEpKSB7CiAJCS8qCkBAIC03MTIsMzUgKzcxMiwxOCBAQAogCWludCByZXQ7CiAKIAlsb2NrX2tlcm5lbCgpOwotCiAJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1RSQUNFTUUpIHsKLQkJLyogYXJlIHdlIGFscmVhZHkgYmVpbmcgdHJhY2VkPyAqLwotCQlyZXQgPSAtRVBFUk07Ci0JCWlmIChjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKQotCQkJZ290byBvdXQ7Ci0JCXJldCA9IHNlY3VyaXR5X3B0cmFjZShjdXJyZW50LT5wYXJlbnQsIGN1cnJlbnQpOwotCQlpZiAocmV0KQotCQkJZ290byBvdXQ7Ci0JCS8qIHNldCB0aGUgcHRyYWNlIGJpdCBpbiB0aGUgcHJvY2VzcyBmbGFncy4gKi8KLQkJY3VycmVudC0+cHRyYWNlIHw9IFBUX1BUUkFDRUQ7CisJCSByZXQgPSBwdHJhY2VfdHJhY2VtZSgpOworCQkgZ290byBvdXQ7CisJfQorCisJY2hpbGQgPSBwdHJhY2VfZ2V0X3Rhc2tfc3RydWN0KHBpZCk7CisJaWYgKElTX0VSUihjaGlsZCkpIHsKKwkJcmV0ID0gUFRSX0VSUihjaGlsZCk7CiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IC1FUEVSTTsKLQlpZiAocGlkID09IDEpCQkvKiB5b3UgbWF5IG5vdCBtZXNzIHdpdGggaW5pdCAqLwotCQlnb3RvIG91dDsKLQotCXJldCA9IC1FU1JDSDsKLQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwotCWNoaWxkID0gZmluZF90YXNrX2J5X3BpZChwaWQpOwotCWlmIChjaGlsZCkKLQkJZ2V0X3Rhc2tfc3RydWN0KGNoaWxkKTsKLQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7Ci0JaWYgKCFjaGlsZCkKLQkJZ290byBvdXQ7Ci0KIAlyZXQgPSBkb19wdHJhY2UoY2hpbGQsIHJlcXVlc3QsIGFkZHIsIGRhdGEpOwotCiAJcHV0X3Rhc2tfc3RydWN0KGNoaWxkKTsKIG91dDoKIAl1bmxvY2tfa2VybmVsKCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3MzOTBfa3N5bXMuYyBiL2FyY2gvczM5MC9rZXJuZWwvczM5MF9rc3ltcy5jCmluZGV4IGJlZTY1NGEuLjQxNzZjNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvczM5MF9rc3ltcy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvczM5MF9rc3ltcy5jCkBAIC0xMCw3ICsxMCw2IEBACiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CiAjaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8YXNtL2NwY21kLmg+CiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMgYi9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKaW5kZXggYjAzODQ3ZC4uZGU4Nzg0MiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYwpAQCAtMjY4LDcgKzI2OCw3IEBACiAJcmVpcGxfZGlhZygpOwogCiAJaWYgKE1BQ0hJTkVfSVNfVk0pCi0JCWNwY21kICgiSVBMIiwgTlVMTCwgMCk7CisJCWNwY21kICgiSVBMIiwgTlVMTCwgMCwgTlVMTCk7CiAJZWxzZQogCQlyZWlwbCAoMHgxMDAwMCB8IFMzOTBfbG93Y29yZS5pcGxfZGV2aWNlKTsKIH0KQEAgLTI3NiwxNCArMjc2LDE0IEBACiBzdGF0aWMgdm9pZCBkb19tYWNoaW5lX2hhbHRfbm9uc21wKHZvaWQpCiB7CiAgICAgICAgIGlmIChNQUNISU5FX0lTX1ZNICYmIHN0cmxlbih2bWhhbHRfY21kKSA+IDApCi0gICAgICAgICAgICAgICAgY3BjbWQodm1oYWx0X2NtZCwgTlVMTCwgMCk7CisgICAgICAgICAgICAgICAgY3BjbWQodm1oYWx0X2NtZCwgTlVMTCwgMCwgTlVMTCk7CiAgICAgICAgIHNpZ25hbF9wcm9jZXNzb3Ioc21wX3Byb2Nlc3Nvcl9pZCgpLCBzaWdwX3N0b3BfYW5kX3N0b3JlX3N0YXR1cyk7CiB9CiAKIHN0YXRpYyB2b2lkIGRvX21hY2hpbmVfcG93ZXJfb2ZmX25vbnNtcCh2b2lkKQogewogICAgICAgICBpZiAoTUFDSElORV9JU19WTSAmJiBzdHJsZW4odm1wb2ZmX2NtZCkgPiAwKQotICAgICAgICAgICAgICAgIGNwY21kKHZtcG9mZl9jbWQsIE5VTEwsIDApOworICAgICAgICAgICAgICAgIGNwY21kKHZtcG9mZl9jbWQsIE5VTEwsIDAsIE5VTEwpOwogICAgICAgICBzaWduYWxfcHJvY2Vzc29yKHNtcF9wcm9jZXNzb3JfaWQoKSwgc2lncF9zdG9wX2FuZF9zdG9yZV9zdGF0dXMpOwogfQogCkBAIC0zMTUsNiArMzE1LDExIEBACiAJX21hY2hpbmVfcG93ZXJfb2ZmKCk7CiB9CiAKKy8qCisgKiBEdW1teSBwb3dlciBvZmYgZnVuY3Rpb24uCisgKi8KK3ZvaWQgKCpwbV9wb3dlcl9vZmYpKHZvaWQpID0gbWFjaGluZV9wb3dlcl9vZmY7CisKIHN0YXRpYyB2b2lkIF9faW5pdAogYWRkX21lbW9yeV9ob2xlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYyBiL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKaW5kZXggZTEwZjRjYS4uY2JmY2ZkMCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3NtcC5jCkBAIC02NTcsNyArNjU3LDcgQEAKIAlpZGxlID0gY3VycmVudF9zZXRbY3B1XTsKICAgICAgICAgY3B1X2xvd2NvcmUgPSBsb3djb3JlX3B0cltjcHVdOwogCWNwdV9sb3djb3JlLT5rZXJuZWxfc3RhY2sgPSAodW5zaWduZWQgbG9uZykKLQkJaWRsZS0+dGhyZWFkX2luZm8gKyAoVEhSRUFEX1NJWkUpOworCQl0YXNrX3N0YWNrX3BhZ2UoaWRsZSkgKyAoVEhSRUFEX1NJWkUpOwogCXNmID0gKHN0cnVjdCBzdGFja19mcmFtZSAqKSAoY3B1X2xvd2NvcmUtPmtlcm5lbF9zdGFjawogCQkJCSAgICAgLSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpCiAJCQkJICAgICAtIHNpemVvZihzdHJ1Y3Qgc3RhY2tfZnJhbWUpKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdGltZS5jIGIvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKaW5kZXggYzM2MzUzZS4uN2MwZmUxNSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKQEAgLTIxNCw3ICsyMTQsNyBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORwotCWFjY291bnRfdXNlcl92dGltZShjdXJyZW50KTsKKwlhY2NvdW50X3RpY2tfdnRpbWUoY3VycmVudCk7CiAjZWxzZQogCXdoaWxlICh0aWNrcy0tKQogCQl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGUocmVncykpOwpAQCAtMjgyLDcgKzI4Miw3IEBACiB7CiAJaWYgKCFjcHVfaXNzZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBub2h6X2NwdV9tYXNrKSkKIAkJcmV0dXJuOwotCWFjY291bnRfdGlja3MoX19LU1RLX1BUUkVHUyhjdXJyZW50KSk7CisJYWNjb3VudF90aWNrcyh0YXNrX3B0X3JlZ3MoY3VycmVudCkpOwogCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIG5vaHpfY3B1X21hc2spOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMgYi9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMKaW5kZXggOTVkMTA5OS4uNWQyMWU5ZSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYwpAQCAtMTM2LDggKzEzNiw4IEBACiAJc3AgPSBfX3Nob3dfdHJhY2Uoc3AsIFMzOTBfbG93Y29yZS5hc3luY19zdGFjayAtIEFTWU5DX1NJWkUsCiAJCQkgIFMzOTBfbG93Y29yZS5hc3luY19zdGFjayk7CiAJaWYgKHRhc2spCi0JCV9fc2hvd190cmFjZShzcCwgKHVuc2lnbmVkIGxvbmcpIHRhc2stPnRocmVhZF9pbmZvLAotCQkJICAgICAodW5zaWduZWQgbG9uZykgdGFzay0+dGhyZWFkX2luZm8gKyBUSFJFQURfU0laRSk7CisJCV9fc2hvd190cmFjZShzcCwgKHVuc2lnbmVkIGxvbmcpIHRhc2tfc3RhY2tfcGFnZSh0YXNrKSwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHRhc2tfc3RhY2tfcGFnZSh0YXNrKSArIFRIUkVBRF9TSVpFKTsKIAllbHNlCiAJCV9fc2hvd190cmFjZShzcCwgUzM5MF9sb3djb3JlLnRocmVhZF9pbmZvLAogCQkJICAgICBTMzkwX2xvd2NvcmUudGhyZWFkX2luZm8gKyBUSFJFQURfU0laRSk7CkBAIC0yNDAsNyArMjQwLDcgQEAKIHsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKIAotCXJlZ3MgPSBfX0tTVEtfUFRSRUdTKHRhc2spOworCXJlZ3MgPSB0YXNrX3B0X3JlZ3ModGFzayk7CiAJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAidGFzazogJXAsIGtzcDogJXBcbiIsCiAJCSAgICAgICB0YXNrLCAodm9pZCAqKXRhc2stPnRocmVhZC5rc3ApOwogCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIlVzZXIgUFNXIDogJXAgJXBcbiIsCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3Z0aW1lLmMgYi9hcmNoL3MzOTAva2VybmVsL3Z0aW1lLmMKaW5kZXggMjJhODk1ZS4uZGZlNmYwOCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC92dGltZS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdnRpbWUuYwpAQCAtMzIsNyArMzIsNyBAQAogICogVXBkYXRlIHByb2Nlc3MgdGltZXMgYmFzZWQgb24gdmlydHVhbCBjcHUgdGltZXMgc3RvcmVkIGJ5IGVudHJ5LlMKICAqIHRvIHRoZSBsb3djb3JlIGZpZWxkcyB1c2VyX3RpbWVyLCBzeXN0ZW1fdGltZXIgJiBzdGVhbF9jbG9jay4KICAqLwotdm9pZCBhY2NvdW50X3VzZXJfdnRpbWUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit2b2lkIGFjY291bnRfdGlja192dGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAljcHV0aW1lX3QgY3B1dGltZTsKIAlfX3U2NCB0aW1lciwgY2xvY2s7CkBAIC03Niw2ICs3NiwzMSBAQAogICogVXBkYXRlIHByb2Nlc3MgdGltZXMgYmFzZWQgb24gdmlydHVhbCBjcHUgdGltZXMgc3RvcmVkIGJ5IGVudHJ5LlMKICAqIHRvIHRoZSBsb3djb3JlIGZpZWxkcyB1c2VyX3RpbWVyLCBzeXN0ZW1fdGltZXIgJiBzdGVhbF9jbG9jay4KICAqLwordm9pZCBhY2NvdW50X3Z0aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCWNwdXRpbWVfdCBjcHV0aW1lOworCV9fdTY0IHRpbWVyOworCisJdGltZXIgPSBTMzkwX2xvd2NvcmUubGFzdF91cGRhdGVfdGltZXI7CisJYXNtIHZvbGF0aWxlICgiICBTVFBUICUwIiAgICAvKiBTdG9yZSBjdXJyZW50IGNwdSB0aW1lciB2YWx1ZSAqLworCQkgICAgICA6ICI9bSIgKFMzOTBfbG93Y29yZS5sYXN0X3VwZGF0ZV90aW1lcikgKTsKKwlTMzkwX2xvd2NvcmUuc3lzdGVtX3RpbWVyICs9IHRpbWVyIC0gUzM5MF9sb3djb3JlLmxhc3RfdXBkYXRlX3RpbWVyOworCisJY3B1dGltZSA9IFMzOTBfbG93Y29yZS51c2VyX3RpbWVyID4+IDEyOworCVMzOTBfbG93Y29yZS51c2VyX3RpbWVyIC09IGNwdXRpbWUgPDwgMTI7CisJUzM5MF9sb3djb3JlLnN0ZWFsX2Nsb2NrIC09IGNwdXRpbWUgPDwgMTI7CisJYWNjb3VudF91c2VyX3RpbWUodHNrLCBjcHV0aW1lKTsKKworCWNwdXRpbWUgPSAgUzM5MF9sb3djb3JlLnN5c3RlbV90aW1lciA+PiAxMjsKKwlTMzkwX2xvd2NvcmUuc3lzdGVtX3RpbWVyIC09IGNwdXRpbWUgPDwgMTI7CisJUzM5MF9sb3djb3JlLnN0ZWFsX2Nsb2NrIC09IGNwdXRpbWUgPDwgMTI7CisJYWNjb3VudF9zeXN0ZW1fdGltZSh0c2ssIDAsIGNwdXRpbWUpOworfQorCisvKgorICogVXBkYXRlIHByb2Nlc3MgdGltZXMgYmFzZWQgb24gdmlydHVhbCBjcHUgdGltZXMgc3RvcmVkIGJ5IGVudHJ5LlMKKyAqIHRvIHRoZSBsb3djb3JlIGZpZWxkcyB1c2VyX3RpbWVyLCBzeXN0ZW1fdGltZXIgJiBzdGVhbF9jbG9jay4KKyAqLwogdm9pZCBhY2NvdW50X3N5c3RlbV92dGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAljcHV0aW1lX3QgY3B1dGltZTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9saWIvTWFrZWZpbGUgYi9hcmNoL3MzOTAvbGliL01ha2VmaWxlCmluZGV4IGQ5Yjk3YjMuLmYyMGI1MWZmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvczM5MC9saWIvTWFrZWZpbGUKQEAgLTQsNSArNCw2IEBACiAKIEVYVFJBX0FGTEFHUyA6PSAtdHJhZGl0aW9uYWwKIAotbGliLXkgKz0gZGVsYXkubyBzdHJpbmcubyBzcGlubG9jay5vCitsaWIteSArPSBkZWxheS5vIHN0cmluZy5vCiBsaWIteSArPSAkKGlmICQoQ09ORklHXzY0QklUKSx1YWNjZXNzNjQubyx1YWNjZXNzLm8pCitsaWItJChDT05GSUdfU01QKSArPSBzcGlubG9jay5vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2xpYi9zcGlubG9jay5jIGIvYXJjaC9zMzkwL2xpYi9zcGlubG9jay5jCmluZGV4IDY4ZDc5YzUuLjYwZjgwYTQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9saWIvc3BpbmxvY2suYworKysgYi9hcmNoL3MzOTAvbGliL3NwaW5sb2NrLmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLWF0b21pY190IHNwaW5fcmV0cnlfY291bnRlcjsKIGludCBzcGluX3JldHJ5ID0gMTAwMDsKIAogLyoqCkBAIC00NSw3ICs0NCw2IEBACiAJCQlfZGlhZzQ0KCk7CiAJCQljb3VudCA9IHNwaW5fcmV0cnk7CiAJCX0KLQkJYXRvbWljX2luYygmc3Bpbl9yZXRyeV9jb3VudGVyKTsKIAkJaWYgKF9yYXdfY29tcGFyZV9hbmRfc3dhcCgmbHAtPmxvY2ssIDAsIHBjKSA9PSAwKQogCQkJcmV0dXJuOwogCX0KQEAgLTU4LDcgKzU2LDYgQEAKIAlpbnQgY291bnQgPSBzcGluX3JldHJ5OwogCiAJd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0JCWF0b21pY19pbmMoJnNwaW5fcmV0cnlfY291bnRlcik7CiAJCWlmIChfcmF3X2NvbXBhcmVfYW5kX3N3YXAoJmxwLT5sb2NrLCAwLCBwYykgPT0gMCkKIAkJCXJldHVybiAxOwogCX0KQEAgLTc3LDcgKzc0LDYgQEAKIAkJCV9kaWFnNDQoKTsKIAkJCWNvdW50ID0gc3Bpbl9yZXRyeTsKIAkJfQotCQlhdG9taWNfaW5jKCZzcGluX3JldHJ5X2NvdW50ZXIpOwogCQlvbGQgPSBydy0+bG9jayAmIDB4N2ZmZmZmZmZVOwogCQlpZiAoX3Jhd19jb21wYXJlX2FuZF9zd2FwKCZydy0+bG9jaywgb2xkLCBvbGQgKyAxKSA9PSBvbGQpCiAJCQlyZXR1cm47CkBAIC05Miw3ICs4OCw2IEBACiAJaW50IGNvdW50ID0gc3Bpbl9yZXRyeTsKIAogCXdoaWxlIChjb3VudC0tID4gMCkgewotCQlhdG9taWNfaW5jKCZzcGluX3JldHJ5X2NvdW50ZXIpOwogCQlvbGQgPSBydy0+bG9jayAmIDB4N2ZmZmZmZmZVOwogCQlpZiAoX3Jhd19jb21wYXJlX2FuZF9zd2FwKCZydy0+bG9jaywgb2xkLCBvbGQgKyAxKSA9PSBvbGQpCiAJCQlyZXR1cm4gMTsKQEAgLTExMSw3ICsxMDYsNiBAQAogCQkJX2RpYWc0NCgpOwogCQkJY291bnQgPSBzcGluX3JldHJ5OwogCQl9Ci0JCWF0b21pY19pbmMoJnNwaW5fcmV0cnlfY291bnRlcik7CiAJCWlmIChfcmF3X2NvbXBhcmVfYW5kX3N3YXAoJnJ3LT5sb2NrLCAwLCAweDgwMDAwMDAwKSA9PSAwKQogCQkJcmV0dXJuOwogCX0KQEAgLTEyNCw3ICsxMTgsNiBAQAogCWludCBjb3VudCA9IHNwaW5fcmV0cnk7CiAKIAl3aGlsZSAoY291bnQtLSA+IDApIHsKLQkJYXRvbWljX2luYygmc3Bpbl9yZXRyeV9jb3VudGVyKTsKIAkJaWYgKF9yYXdfY29tcGFyZV9hbmRfc3dhcCgmcnctPmxvY2ssIDAsIDB4ODAwMDAwMDApID09IDApCiAJCQlyZXR1cm4gMTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3NoL0tjb25maWcgYi9hcmNoL3NoL0tjb25maWcKaW5kZXggNjRmNWFlMC4uMDFiYzdkNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9LY29uZmlnCisrKyBiL2FyY2gvc2gvS2NvbmZpZwpAQCAtMTQsMTAgKzE0LDYgQEAKIAkgIGdhbWluZyBjb25zb2xlLiAgVGhlIFN1cGVySCBwb3J0IGhhcyBhIGhvbWUgcGFnZSBhdAogCSAgPGh0dHA6Ly93d3cubGludXgtc2gub3JnLz4uCiAKLWNvbmZpZyBVSUQxNgotCWJvb2wKLQlkZWZhdWx0IHkKLQogY29uZmlnIFJXU0VNX0dFTkVSSUNfU1BJTkxPQ0sKIAlib29sCiAJZGVmYXVsdCB5CkBAIC0zNyw5ICszMywxMSBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEdFTkVSSUNfSU9NQVAKKwlib29sCisKIGNvbmZpZyBBUkNIX01BWV9IQVZFX1BDX0ZEQwogCWJvb2wKLQlkZWZhdWx0IHkKIAogc291cmNlICJpbml0L0tjb25maWciCiAKQEAgLTU3LDI0ICs1NSwyOCBAQAogCiBjb25maWcgU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUKIAlib29sICJTb2x1dGlvbkVuZ2luZTc3NTEiCisJc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MQogCWhlbHAKIAkgIFNlbGVjdCA3NzUxIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NzUxCiAJICBldmFsdWF0aW9uIGJvYXJkLgogCiBjb25maWcgU0hfNzMwMF9TT0xVVElPTl9FTkdJTkUKIAlib29sICJTb2x1dGlvbkVuZ2luZTczMDAiCisJc2VsZWN0IENQVV9TVUJUWVBFX1NINzMwMAogCWhlbHAKIAkgIFNlbGVjdCA3MzAwIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3MzAwKFNILU1vYmlsZSBWKQogCSAgZXZhbHVhdGlvbiBib2FyZC4KIAogY29uZmlnIFNIXzczMTgwX1NPTFVUSU9OX0VOR0lORQogICAgICAgIGJvb2wgIlNvbHV0aW9uRW5naW5lNzMxODAiCisgICAgICAgc2VsZWN0IENQVV9TVUJUWVBFX1NINzMxODAKICAgICAgICBoZWxwCiAgICAgICAgICBTZWxlY3QgNzMxODAgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaSBTSDczMTgwKFNILU1vYmlsZSAzKQogICAgICAgICAgZXZhbHVhdGlvbiBib2FyZC4KIAogY29uZmlnIFNIXzc3NTFfU1lTVEVNSAogCWJvb2wgIlN5c3RlbUg3NzUxUiIKKwlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUxUgogCWhlbHAKIAkgIFNlbGVjdCBTeXN0ZW1IIGlmIHlvdSBhcmUgY29uZmlndXJpbmcgZm9yIGEgUmVuZXNhcyBTeXN0ZW1ICiAJICA3NzUxUiBldmFsdWF0aW9uIGJvYXJkLgpAQCAtODUsMjcgKzg3LDEzIEBACiBjb25maWcgU0hfU1RCMV9PVkVSRFJJVkUKIAlib29sICJTVEIxX092ZXJkcml2ZSIKIAotY29uZmlnIFNIX0hQNjIwCi0JYm9vbCAiSFA2MjAiCitjb25maWcgU0hfSFA2WFgKKwlib29sICJIUDZYWCIKIAloZWxwCi0JICBTZWxlY3QgSFA2MjAgaWYgY29uZmlndXJpbmcgZm9yIGEgSFAgam9ybmFkYSBIUDYyMC4KKwkgIFNlbGVjdCBIUDZYWCBpZiBjb25maWd1cmluZyBmb3IgYSBIUCBqb3JuYWRhIEhQNnh4LgogCSAgTW9yZSBpbmZvcm1hdGlvbiAoaGFyZHdhcmUgb25seSkgYXQKIAkgIDxodHRwOi8vd3d3LmhwLmNvbS9qb3JuYWRhLz4uCiAKLWNvbmZpZyBTSF9IUDY4MAotCWJvb2wgIkhQNjgwIgotCWhlbHAKLQkgIFNlbGVjdCBIUDY4MCBpZiBjb25maWd1cmluZyBmb3IgYSBIUCBKb3JuYWRhIEhQNjgwLgotCSAgTW9yZSBpbmZvcm1hdGlvbiAoaGFyZHdhcmUgb25seSkgYXQKLQkgIDxodHRwOi8vd3d3LmhwLmNvbS9qb3JuYWRhL3Byb2R1Y3RzLzY4MC8+LgotCi1jb25maWcgU0hfSFA2OTAKLQlib29sICJIUDY5MCIKLQloZWxwCi0JICBTZWxlY3QgSFA2OTAgaWYgY29uZmlndXJpbmcgZm9yIGEgSFAgSm9ybmFkYSBIUDY5MC4KLQkgIE1vcmUgaW5mb3JtYXRpb24gKGhhcmR3YXJlIG9ubHkpCi0JICBhdCA8aHR0cDovL3d3dy5ocC5jb20vam9ybmFkYS9wcm9kdWN0cy82ODAvPi4KLQogY29uZmlnIFNIX0NRUkVFSwogCWJvb2wgIkNxUkVFSyIKIAloZWxwCkBAIC0xMjcsMTEgKzExNSwxMyBAQAogCiBjb25maWcgU0hfU0FUVVJOCiAJYm9vbCAiU2F0dXJuIgorCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc2MDQKIAloZWxwCiAJICBTZWxlY3QgU2F0dXJuIGlmIGNvbmZpZ3VyaW5nIGZvciBhIFNFR0EgU2F0dXJuLgogCiBjb25maWcgU0hfRFJFQU1DQVNUCiAJYm9vbCAiRHJlYW1jYXN0IgorCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDcwOTEKIAloZWxwCiAJICBTZWxlY3QgRHJlYW1jYXN0IGlmIGNvbmZpZ3VyaW5nIGZvciBhIFNFR0EgRHJlYW1jYXN0LgogCSAgTW9yZSBpbmZvcm1hdGlvbiBhdApAQCAtMTQ2LDYgKzEzNiw3IEBACiAKIGNvbmZpZyBTSF9TSDIwMDAKIAlib29sICJTSDIwMDAiCisJc2VsZWN0IENQVV9TVUJUWVBFX1NINzcwOQogCWhlbHAKIAkgIFNILTIwMDAgaXMgYSBzaW5nbGUtYm9hcmQgY29tcHV0ZXIgYmFzZWQgYXJvdW5kIFNINzcwOUEgY2hpcAogCSAgaW50ZW5kZWQgZm9yIGVtYmVkZGVkIGFwcGxpY2F0aW9ucy4KQEAgLTE1NywyMCArMTQ4LDIyIEBACiAJYm9vbCAiQURYIgogCiBjb25maWcgU0hfTVBDMTIxMQotCWJvb2wgIk1QQzEyMTEiCisJYm9vbCAiSW50ZXJmYWNlIE1QQzEyMTEiCisJaGVscAorCSAgQ1RQL1BDSS1TSDAyIGlzIGEgQ1BVIG1vZHVsZSBjb21wdXRlciB0aGF0IGlzIHByb2R1Y2VkCisJICBieSBJbnRlcmZhY2UgQ29ycG9yYXRpb24uCisJICBNb3JlIGluZm9ybWF0aW9uIGF0IDxodHRwOi8vd3d3LmludGVyZmFjZS5jby5qcD4KIAogY29uZmlnIFNIX1NIMDMKLQlib29sICJTSDAzIgorCWJvb2wgIkludGVyZmFjZSBDVFAvUENJLVNIMDMiCiAJaGVscAotCSAgQ1RQL1BDSS1TSDAzIGlzIGEgQ1BVIG1vZHVsZSBjb21wdXRlciB0aGF0IHByb2R1Y2VkCisJICBDVFAvUENJLVNIMDMgaXMgYSBDUFUgbW9kdWxlIGNvbXB1dGVyIHRoYXQgaXMgcHJvZHVjZWQKIAkgIGJ5IEludGVyZmFjZSBDb3Jwb3JhdGlvbi4KLQkgIEl0IGlzIGNvbXBhY3QgYW5kIGV4Y2VsbGVudCBpbiBkdXJhYmlsaXR5LgotCSAgSXQgd2lsbCBwbGF5IGFuIGFjdGl2ZSBwYXJ0IGluIHlvdXIgZmFjdG9yeSBvciBsYWJvcmF0b3J5Ci0JICBhcyBhIEZBIGNvbXB1dGVyLgogCSAgTW9yZSBpbmZvcm1hdGlvbiBhdCA8aHR0cDovL3d3dy5pbnRlcmZhY2UuY28uanA+CiAKIGNvbmZpZyBTSF9TRUNVUkVFREdFNTQxMAogCWJvb2wgIlNlY3VyZUVkZ2U1NDEwIgorCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTFSCiAJaGVscAogCSAgU2VsZWN0IFNlY3VyZUVkZ2U1NDEwIGlmIGNvbmZpZ3VyaW5nIGZvciBhIFNuYXBHZWFyIFNIIGJvYXJkLgogCSAgVGhpcyBpbmNsdWRlcyBib3RoIHRoZSBPRU0gU2VjdXJlRWRnZSBwcm9kdWN0cyBhcyB3ZWxsIGFzIHRoZQpAQCAtMTc4LDI1ICsxNzEsNDkgQEAKIAogY29uZmlnIFNIX0hTNzc1MVJWT0lQCiAJYm9vbCAiSFM3NzUxUlZPSVAiCisJc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MVIKIAloZWxwCiAJICBTZWxlY3QgSFM3NzUxUlZPSVAgaWYgY29uZmlndXJpbmcgZm9yIGEgUmVuZXNhcyBUZWNobm9sb2d5CiAJICBTYWxlcyBWb0lQIGJvYXJkLgogCiBjb25maWcgU0hfUlRTNzc1MVIyRAogCWJvb2wgIlJUUzc3NTFSMkQiCisJc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MVIKIAloZWxwCiAJICBTZWxlY3QgUlRTNzc1MVIyRCBpZiBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFRlY2hub2xvZ3kKIAkgIFNhbGVzIFNILUdyYXBoaWNzIGJvYXJkLgogCitjb25maWcgU0hfUjc3ODBSUAorCWJvb2wgIlI3NzgwUlAtMSIKKwlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzgwCisJaGVscAorCSAgU2VsZWN0IFI3NzgwUlAtMSBpZiBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFNvbHV0aW9ucworCSAgSElHSExBTkRFUiBib2FyZC4KKwogY29uZmlnIFNIX0VET1NLNzcwNQogCWJvb2wgIkVET1NLNzcwNSIKKwlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzA1CiAKIGNvbmZpZyBTSF9TSDQyMDJfTUlDUk9ERVYKIAlib29sICJTSDQtMjAyIE1pY3JvRGV2IgorCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDRfMjAyCiAJaGVscAogCSAgU2VsZWN0IFNINC0yMDIgTWljcm9EZXYgaWYgY29uZmlndXJpbmcgZm9yIGEgU3VwZXJIIE1pY3JvRGV2IGJvYXJkCiAJICB3aXRoIGFuIFNINC0yMDIgQ1BVLgogCitjb25maWcgU0hfTEFORElTSworCWJvb2wgIkxBTkRJU0siCisJc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MVIKKwloZWxwCisJICBJLU8gREFUQSBERVZJQ0UsIElOQy4gIkxBTkRJU0sgU2VyaWVzIiBzdXBwb3J0LgorCitjb25maWcgU0hfVElUQU4KKwlib29sICJUSVRBTiIKKwlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUxUgorCWhlbHAKKwkgIFNlbGVjdCBUaXRhbiBpZiB5b3UgYXJlIGNvbmZpZ3VyaW5nIGZvciBhIE5pbWJsZSBNaWNyb3N5c3RlbXMKKwkgIE5ldEVuZ2luZSBOUDUxUi4KKwogY29uZmlnIFNIX1VOS05PV04KIAlib29sICJCYXJlQ1BVIgogCWhlbHAKQEAgLTIxMSwxNjggKzIyOCwyNyBAQAogCiBlbmRjaG9pY2UKIAotY2hvaWNlCi0JcHJvbXB0ICJQcm9jZXNzb3IgZmFtaWx5IgotCWRlZmF1bHQgQ1BVX1NINAotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGRldGVybWluZXMgdGhlIENQVSBmYW1pbHkgdG8gY29tcGlsZSBmb3IuIFN1cHBvcnRlZAotCSAgdGFyZ2V0cyBhcmUgU0gtMiwgU0gtMywgYW5kIFNILTQuIFRoZXNlIG9wdGlvbnMgYXJlIGluZGVwZW5kZW50IG9mCi0JICBDUFUgZnVuY3Rpb25hbGl0eS4gQXMgc3VjaCwgU0gtRFNQIHVzZXJzIHdpbGwgc3RpbGwgd2FudCB0byBzZWxlY3QKLQkgIHRoZWlyIHJlc3BlY3RpdmUgcHJvY2Vzc29yIGZhbWlseSBpbiBhZGRpdGlvbiB0byB0aGUgRFNQIHN1cHBvcnQKLQkgIG9wdGlvbi4KK3NvdXJjZSAiYXJjaC9zaC9tbS9LY29uZmlnIgogCi1jb25maWcgQ1BVX1NIMgotCWJvb2wgIlNILTIiCi0Jc2VsZWN0IFNIX1dSSVRFVEhST1VHSAotCi1jb25maWcgQ1BVX1NIMwotCWJvb2wgIlNILTMiCi0KLWNvbmZpZyBDUFVfU0g0Ci0JYm9vbCAiU0gtNCIKLQotZW5kY2hvaWNlCi0KLWNob2ljZQotCXByb21wdCAiUHJvY2Vzc29yIHN1YnR5cGUiCi0KLWNvbmZpZyBDUFVfU1VCVFlQRV9TSDc2MDQKLQlib29sICJTSDc2MDQiCi0JZGVwZW5kcyBvbiBDUFVfU0gyCi0JaGVscAotCSAgU2VsZWN0IFNINzYwNCBpZiB5b3UgaGF2ZSBTSDc2MDQKLQotY29uZmlnIENQVV9TVUJUWVBFX1NINzMwMAotCWJvb2wgIlNINzMwMCIKLQlkZXBlbmRzIG9uIENQVV9TSDMKLQotY29uZmlnIENQVV9TVUJUWVBFX1NINzcwNQotCWJvb2wgIlNINzcwNSIKLQlkZXBlbmRzIG9uIENQVV9TSDMKLQotY29uZmlnIENQVV9TVUJUWVBFX1NINzcwNwotCWJvb2wgIlNINzcwNyIKLQlkZXBlbmRzIG9uIENQVV9TSDMKLQloZWxwCi0JICBTZWxlY3QgU0g3NzA3IGlmIHlvdSBoYXZlIGEgIDYwIE1oeiBTSC0zIEhENjQxNzcwNyBDUFUuCi0KLWNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3MDgKLQlib29sICJTSDc3MDgiCi0JZGVwZW5kcyBvbiBDUFVfU0gzCi0JaGVscAotCSAgU2VsZWN0IFNINzcwOCBpZiB5b3UgaGF2ZSBhICA2MCBNaHogU0gtMyBIRDY0MTc3MDhTIG9yCi0JICBpZiB5b3UgaGF2ZSBhIDEwMCBNaHogU0gtMyBIRDY0MTc3MDhSIENQVS4KLQotY29uZmlnIENQVV9TVUJUWVBFX1NINzcwOQotCWJvb2wgIlNINzcwOSIKLQlkZXBlbmRzIG9uIENQVV9TSDMKLQloZWxwCi0JICBTZWxlY3QgU0g3NzA5IGlmIHlvdSBoYXZlIGEgIDgwIE1oeiBTSC0zIEhENjQxNzcwOSBDUFUuCi0KLWNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NTAKLQlib29sICJTSDc3NTAiCi0JZGVwZW5kcyBvbiBDUFVfU0g0Ci0JaGVscAotCSAgU2VsZWN0IFNINzc1MCBpZiB5b3UgaGF2ZSBhIDIwMCBNaHogU0gtNCBIRDY0MTc3NTAgQ1BVLgotCi1jb25maWcgQ1BVX1NVQlRZUEVfU0g3NzUxCi0JYm9vbCAiU0g3NzUxL1NINzc1MVIiCi0JZGVwZW5kcyBvbiBDUFVfU0g0Ci0JaGVscAotCSAgU2VsZWN0IFNINzc1MSBpZiB5b3UgaGF2ZSBhIDE2NiBNaHogU0gtNCBIRDY0MTc3NTEgQ1BVLAotCSAgb3IgaWYgeW91IGhhdmUgYSBIRDY0MTc3NTFSIENQVS4KLQotY29uZmlnIENQVV9TVUJUWVBFX1NINzc2MAotCWJvb2wgIlNINzc2MCIKLQlkZXBlbmRzIG9uIENQVV9TSDQKLQotY29uZmlnIENQVV9TVUJUWVBFX1NINzMxODAKLSAgICAgICBib29sICJTSDczMTgwIgotICAgICAgIGRlcGVuZHMgb24gQ1BVX1NINAotCi1jb25maWcgQ1BVX1NVQlRZUEVfU1Q0MFNUQjEKLSAgICAgICBib29sICJTVDQwU1RCMSAvIFNUNDBSQSIKLSAgICAgICBkZXBlbmRzIG9uIENQVV9TSDQKLSAgICAgICBoZWxwCi0gICAgICAgICBTZWxlY3QgU1Q0MFNUQjEgaWYgeW91IGhhdmUgYSBTVDQwUkEgQ1BVLgotICAgICAgICAgVGhpcyB3YXMgcHJldmlvdXNseSBjYWxsZWQgdGhlIFNUNDBTVEIxLCBoZW5jZSB0aGUgb3B0aW9uIG5hbWUuCi0KLWNvbmZpZyBDUFVfU1VCVFlQRV9TVDQwR1gxCi0gICAgICAgYm9vbCAiU1Q0MEdYMSIKLSAgICAgICBkZXBlbmRzIG9uIENQVV9TSDQKLSAgICAgICBoZWxwCi0gICAgICAgICBTZWxlY3QgU1Q0MEdYMSBpZiB5b3UgaGF2ZSBhIFNUNDBHWDEgQ1BVLgotCi1jb25maWcgQ1BVX1NVQlRZUEVfU0g0XzIwMgotCWJvb2wgIlNINC0yMDIiCi0JZGVwZW5kcyBvbiBDUFVfU0g0Ci0KLWVuZGNob2ljZQotCi1jb25maWcgU0g3NzA1X0NBQ0hFXzMyS0IKLSAgICBib29sICJFbmFibGUgMzJLQiBjYWNoZSBzaXplIGZvciBTSDc3MDUiCi0gICAgZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3MDUKLSAgICBkZWZhdWx0IHkKLQotY29uZmlnIE1NVQotICAgICAgICBib29sICJTdXBwb3J0IGZvciBtZW1vcnkgbWFuYWdlbWVudCBoYXJkd2FyZSIKLQlkZXBlbmRzIG9uICFDUFVfU0gyCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgRWFybHkgU0ggcHJvY2Vzc29ycyAoc3VjaCBhcyB0aGUgU0g3NjA0KSBsYWNrIGFuIE1NVS4gSW4gb3JkZXIgdG8KLQkgIGJvb3Qgb24gdGhlc2Ugc3lzdGVtcywgdGhpcyBvcHRpb24gbXVzdCBub3QgYmUgc2V0LgotCi0JICBPbiBvdGhlciBzeXN0ZW1zIChzdWNoIGFzIHRoZSBTSC0zIGFuZCA0KSB3aGVyZSBhbiBNTVUgZXhpc3RzLAotCSAgdHVybmluZyB0aGlzIG9mZiB3aWxsIGJvb3QgdGhlIGtlcm5lbCBvbiB0aGVzZSBtYWNoaW5lcyB3aXRoIHRoZQotCSAgTU1VIGltcGxpY2l0bHkgc3dpdGNoZWQgb2ZmLgotCi1jaG9pY2UKLQlwcm9tcHQgIkh1Z2VUTEIgcGFnZSBzaXplIgotCWRlcGVuZHMgb24gSFVHRVRMQl9QQUdFICYmIENQVV9TSDQgJiYgTU1VCi0JZGVmYXVsdCBIVUdFVExCX1BBR0VfU0laRV82NEsKLQotY29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFXzY0SwotCWJvb2wgIjY0SyIKLQotY29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFXzFNQgotCWJvb2wgIjFNQiIKLQotZW5kY2hvaWNlCi0KLWNvbmZpZyBDTURMSU5FX0JPT0wKLQlib29sICJEZWZhdWx0IGJvb3Rsb2FkZXIga2VybmVsIGFyZ3VtZW50cyIKLQotY29uZmlnIENNRExJTkUKLQlzdHJpbmcgIkluaXRpYWwga2VybmVsIGNvbW1hbmQgc3RyaW5nIgotCWRlcGVuZHMgb24gQ01ETElORV9CT09MCi0JZGVmYXVsdCAiY29uc29sZT10dHlTQzEsMTE1MjAwIgotCi0jIFBsYXRmb3JtLXNwZWNpZmljIG1lbW9yeSBzdGFydCBhbmQgc2l6ZSBkZWZpbml0aW9ucwogY29uZmlnIE1FTU9SWV9TVEFSVAotCWhleCAiUGh5c2ljYWwgbWVtb3J5IHN0YXJ0IGFkZHJlc3MiIGlmICFNRU1PUllfU0VUIHx8IE1FTU9SWV9PVkVSUklERQotCWRlZmF1bHQgIjB4MDgwMDAwMDAiIGlmICFNRU1PUllfU0VUIHx8IE1FTU9SWV9PVkVSUklERSB8fCAhTUVNT1JZX09WRVJSSURFICYmIFNIX0FEWCB8fCBTSF9NUEMxMjExIHx8IFNIX1NIMDMgfHwgU0hfU0VDVVJFRURHRTU0MTAgfHwgU0hfU0g0MjAyX01JQ1JPREVWCi0JZGVmYXVsdCAiMHgwYzAwMDAwMCIgaWYgIU1FTU9SWV9PVkVSUklERSAmJiAoU0hfRFJFQU1DQVNUIHx8IFNIX0hQNjAwIHx8IFNIX0JJR1NVUiB8fCBTSF9TSDIwMDAgfHwgU0hfNzMxODBfU09MVVRJT05fRU5HSU5FIHx8IFNIXzczMDBfU09MVVRJT05fRU5HSU5FIHx8IFNIXzc3NTFfU09MVVRJT05fRU5HSU5FIHx8IFNIX1NPTFVUSU9OX0VOR0lORSB8fCBTSF9IUzc3NTFSVk9JUCB8fCBTSF9SVFM3NzUxUjJEIHx8IFNIX0VET1NLNzcwNSkKKwloZXggIlBoeXNpY2FsIG1lbW9yeSBzdGFydCBhZGRyZXNzIgorCWRlZmF1bHQgIjB4MDgwMDAwMDAiCiAJLS0taGVscC0tLQogCSAgQ29tcHV0ZXJzIGJ1aWx0IHdpdGggSGl0YWNoaSBTdXBlckggcHJvY2Vzc29ycyBhbHdheXMKIAkgIG1hcCB0aGUgUk9NIHN0YXJ0aW5nIGF0IGFkZHJlc3MgemVyby4gIEJ1dCB0aGUgcHJvY2Vzc29yCiAJICBkb2VzIG5vdCBzcGVjaWZ5IHRoZSByYW5nZSB0aGF0IFJBTSB0YWtlcy4KIAogCSAgVGhlIHBoeXNpY2FsIG1lbW9yeSAoUkFNKSBzdGFydCBhZGRyZXNzIHdpbGwgYmUgYXV0b21hdGljYWxseQotCSAgc2V0IHRvIDA4MDAwMDAwLCB1bmxlc3MgeW91IHNlbGVjdGVkIG9uZSBvZiB0aGUgZm9sbG93aW5nCi0JICBwcm9jZXNzb3IgdHlwZXM6IFNvbHV0aW9uRW5naW5lLCBPdmVyZHJpdmUsIEhQNjIwLCBIUDY4MCwgSFA2OTAsCi0JICBpbiB3aGljaCBjYXNlIHRoZSBzdGFydCBhZGRyZXNzIHdpbGwgYmUgc2V0IHRvIDBjMDAwMDAwLgorCSAgc2V0IHRvIDA4MDAwMDAwLiBPdGhlciBwbGF0Zm9ybXMsIHN1Y2ggYXMgdGhlIFNvbHV0aW9uIEVuZ2luZQorCSAgYm9hcmRzIHR5cGljYWxseSBtYXAgUkFNIGF0IDBDMDAwMDAwLgogCi0JICBUd2VhayB0aGlzIG9ubHkgd2hlbiBwb3J0aW5nIHRvIGEgbmV3IG1hY2hpbmUgd2hpY2ggaXMgbm90IGFscmVhZHkKLQkgIGtub3duIGJ5IHRoZSBjb25maWcgc3lzdGVtLiAgQ2hhbmdpbmcgaXQgZnJvbSB0aGUga25vd24gY29ycmVjdAorCSAgVHdlYWsgdGhpcyBvbmx5IHdoZW4gcG9ydGluZyB0byBhIG5ldyBtYWNoaW5lIHdoaWNoIGRvZXMgbm90CisJICBhbHJlYWR5IGhhdmUgYSBkZWZjb25maWcuIENoYW5naW5nIGl0IGZyb20gdGhlIGtub3duIGNvcnJlY3QKIAkgIHZhbHVlIG9uIGFueSBvZiB0aGUga25vd24gc3lzdGVtcyB3aWxsIG9ubHkgbGVhZCB0byBkaXNhc3Rlci4KIAogY29uZmlnIE1FTU9SWV9TSVpFCi0JaGV4ICJQaHlzaWNhbCBtZW1vcnkgc2l6ZSIgaWYgIU1FTU9SWV9TRVQgfHwgTUVNT1JZX09WRVJSSURFCi0JZGVmYXVsdCAiMHgwMDQwMDAwMCIgaWYgIU1FTU9SWV9TRVQgfHwgTUVNT1JZX09WRVJSSURFIHx8ICFNRU1PUllfT1ZFUlJJREUgJiYgU0hfQURYIHx8ICFNRU1PUllfT1ZFUlJJREUgJiYgKFNIX0hQNjAwIHx8IFNIX0JJR1NVUiB8fCBTSF9TSDIwMDApCi0JZGVmYXVsdCAiMHgwMTAwMDAwMCIgaWYgIU1FTU9SWV9PVkVSUklERSAmJiBTSF9EUkVBTUNBU1QgfHwgU0hfU0VDVVJFRURHRTU0MTAgfHwgU0hfRURPU0s3NzA1Ci0gICAgICAgIGRlZmF1bHQgIjB4MDIwMDAwMDAiIGlmICFNRU1PUllfT1ZFUlJJREUgJiYgKFNIXzczMTgwX1NPTFVUSU9OX0VOR0lORSB8fCBTSF9TT0xVVElPTl9FTkdJTkUpCi0gICAgICAgIGRlZmF1bHQgIjB4MDQwMDAwMDAiIGlmICFNRU1PUllfT1ZFUlJJREUgJiYgKFNIXzczMDBfU09MVVRJT05fRU5HSU5FIHx8IFNIXzc3NTFfU09MVVRJT05fRU5HSU5FIHx8IFNIX0hTNzc1MVJWT0lQIHx8IFNIX1JUUzc3NTFSMkQgfHwgU0hfU0g0MjAyX01JQ1JPREVWKQotCWRlZmF1bHQgIjB4MDgwMDAwMDAiIGlmIFNIX01QQzEyMTEgfHwgU0hfU0gwMworCWhleCAiUGh5c2ljYWwgbWVtb3J5IHNpemUiCisJZGVmYXVsdCAiMHgwMDQwMDAwMCIKIAloZWxwCiAJICBUaGlzIHNldHMgdGhlIGRlZmF1bHQgbWVtb3J5IHNpemUgYXNzdW1lZCBieSB5b3VyIFNIIGtlcm5lbC4gSXQgY2FuCiAJICBiZSBvdmVycmlkZGVuIGFzIG5vcm1hbCBieSB0aGUgJ21lbT0nIGFyZ3VtZW50IG9uIHRoZSBrZXJuZWwgY29tbWFuZApAQCAtMzgwLDIxICsyNTYsNiBAQAogCSAgYXMgMHgwMDQwMDAwMCB3aGljaCB3YXMgdGhlIGRlZmF1bHQgdmFsdWUgYmVmb3JlIHRoaXMgYmVjYW1lCiAJICBjb25maWd1cmFibGUuCiAKLWNvbmZpZyBNRU1PUllfU0VUCi0JYm9vbAotCWRlcGVuZHMgb24gIU1FTU9SWV9PVkVSUklERSAmJiAoU0hfTVBDMTIxMSB8fCBTSF9TSDAzIHx8IFNIX0FEWCB8fCBTSF9EUkVBTUNBU1QgfHwgU0hfSFA2MDAgfHwgU0hfQklHU1VSIHx8IFNIX1NIMjAwMCB8fCBTSF83NzUxX1NPTFVUSU9OX0VOR0lORSB8fCBTSF9TT0xVVElPTl9FTkdJTkUgfHwgU0hfU0VDVVJFRURHRTU0MTAgfHwgU0hfSFM3NzUxUlZPSVAgfHwgU0hfUlRTNzc1MVIyRCB8fCBTSF9TSDQyMDJfTUlDUk9ERVYgfHwgU0hfRURPU0s3NzA1KQotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFRoaXMgaXMgYW4gb3B0aW9uIGFib3V0IHdoaWNoIHlvdSB3aWxsIG5ldmVyIGJlIGFza2VkIGEgcXVlc3Rpb24uCi0JICBUaGVyZWZvcmUsIEkgY29uY2x1ZGUgdGhhdCB5b3UgZG8gbm90IGV4aXN0IC0gZ28gYXdheS4KLQotCSAgVGhlcmUgaXMgYSBncnVlIGhlcmUuCi0KLSMgSWYgbm9uZSBvZiB0aGUgYWJvdmUgaGF2ZSBzZXQgbWVtb3J5IHN0YXJ0L3NpemUsIGFzayB0aGUgdXNlci4KLWNvbmZpZyBNRU1PUllfT1ZFUlJJREUKLQlib29sICJPdmVycmlkZSBkZWZhdWx0IGxvYWQgYWRkcmVzcyBhbmQgbWVtb3J5IHNpemUiCi0KLSMgWFhYOiBicmVhayB0aGVzZSBvdXQgaW50byB0aGUgYm9hcmQtc3BlY2lmaWMgY29uZmlncyBiZWxvdwogY29uZmlnIENGX0VOQUJMRVIKIAlib29sICJDb21wYWN0IEZsYXNoIEVuYWJsZXIgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFNIX0FEWCB8fCBTSF9TT0xVVElPTl9FTkdJTkUgfHwgU0hfVU5LTk9XTiB8fCBTSF9DQVQ2ODcwMSB8fCBTSF9TSDAzCkBAIC00MzgsMTAgKzI5OSwyMSBAQAogCWRlZmF1bHQgIjB4YjgwMDAwMDAiIGlmIENGX0FSRUE2CiAJZGVmYXVsdCAiMHhiNDAwMDAwMCIgaWYgQ0ZfQVJFQTUKIAorbWVudSAiUHJvY2Vzc29yIGZlYXR1cmVzIgorCitjb25maWcgQ1BVX0xJVFRMRV9FTkRJQU4KKwlib29sICJMaXR0bGUgRW5kaWFuIgorCWhlbHAKKwkgIFNvbWUgU3VwZXJIIG1hY2hpbmVzIGNhbiBiZSBjb25maWd1cmVkIGZvciBlaXRoZXIgbGl0dGxlIG9yIGJpZworCSAgZW5kaWFuIGJ5dGUgb3JkZXIuIFRoZXNlIG1vZGVzIHJlcXVpcmUgZGlmZmVyZW50IGtlcm5lbHMuIFNheSBZIGlmCisJICB5b3VyIG1hY2hpbmUgaXMgbGl0dGxlIGVuZGlhbiwgTiBpZiBpdCdzIGEgYmlnIGVuZGlhbiBtYWNoaW5lLgorCiAjIFRoZSBTSDc3NTAgUlRDIG1vZHVsZSBpcyBkaXNhYmxlZCBpbiB0aGUgRHJlYW1jYXN0CiBjb25maWcgU0hfUlRDCiAJYm9vbAotCWRlcGVuZHMgb24gIVNIX0RSRUFNQ0FTVCAmJiAhU0hfU0FUVVJOICYmICFTSF83MzAwX1NPTFVUSU9OX0VOR0lORSAmJiAhU0hfNzMxODBfU09MVVRJT05fRU5HSU5FCisJZGVwZW5kcyBvbiAhU0hfRFJFQU1DQVNUICYmICFTSF9TQVRVUk4gJiYgIVNIXzczMDBfU09MVVRJT05fRU5HSU5FICYmIFwKKwkJICAgIVNIXzczMTgwX1NPTFVUSU9OX0VOR0lORSAmJiAhU0hfTEFORElTSyAmJiBcCisJCSAgICFTSF9SNzc4MFJQCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgYWxsb3cgdGhlIExpbnV4IGtlcm5lbCB0byBlbXVsYXRlCkBAIC00ODAsOTggKzM1Miw2IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBTSF9IUDYwMAotCWJvb2wKLQlkZXBlbmRzIG9uIFNIX0hQNjIwIHx8IFNIX0hQNjgwIHx8IFNIX0hQNjkwCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBDUFVfU1VCVFlQRV9TVDQwCi0gICAgICAgYm9vbAotICAgICAgIGRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU1Q0MFNUQjEgfHwgQ1BVX1NVQlRZUEVfU1Q0MEdYMQotICAgICAgIGRlZmF1bHQgeQotCi1zb3VyY2UgIm1tL0tjb25maWciCi0KLWNvbmZpZyBaRVJPX1BBR0VfT0ZGU0VUCi0JaGV4ICJaZXJvIHBhZ2Ugb2Zmc2V0IgotCWRlZmF1bHQgIjB4MDAwMDEwMDAiIGlmICEoU0hfTVBDMTIxMSB8fCBTSF9TSDAzKQotCWRlZmF1bHQgIjB4MDAwMDQwMDAiIGlmIFNIX01QQzEyMTEgfHwgU0hfU0gwMwotCWhlbHAKLQkgIFRoaXMgc2V0cyB0aGUgZGVmYXVsdCBvZmZzZXQgb2YgemVybyBwYWdlLgotCi0jIFhYWDogbmVlZHMgdG8gbG9zZSBzdWJ0eXBlIGZvciBzeXN0ZW0gdHlwZQotY29uZmlnIFNUNDBfTE1JX01FTU9SWQotCWJvb2wgIk1lbW9yeSBvbiBMTUkiCi0JZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TVDQwU1RCMQotCi1jb25maWcgTUVNT1JZX1NUQVJUCi0JaGV4Ci0JZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TVDQwU1RCMSAmJiBTVDQwX0xNSV9NRU1PUlkKLQlkZWZhdWx0ICIweDA4MDAwMDAwIgotCi1jb25maWcgTUVNT1JZX1NJWkUKLQloZXgKLQlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NUNDBTVEIxICYmIFNUNDBfTE1JX01FTU9SWQotCWRlZmF1bHQgIjB4MDA0MDAwMDAiCi0KLWNvbmZpZyBNRU1PUllfU0VUCi0JYm9vbAotCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU1Q0MFNUQjEgJiYgU1Q0MF9MTUlfTUVNT1JZCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBCT09UX0xJTktfT0ZGU0VUCi0JaGV4ICJMaW5rIGFkZHJlc3Mgb2Zmc2V0IGZvciBib290aW5nIgotCWRlZmF1bHQgIjB4MDA4MDAwMDAiCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBzZXQgdGhlIGxpbmsgYWRkcmVzcyBvZmZzZXQgb2YgdGhlIHpJbWFnZS4KLQkgIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgYXJlIG9uIGEgYm9hcmQgd2hpY2ggaGFzIGEgc21hbGwgYW1vdW50IG9mCi0JICBtZW1vcnkuCi0KLWNvbmZpZyBDUFVfTElUVExFX0VORElBTgotCWJvb2wgIkxpdHRsZSBFbmRpYW4iCi0JaGVscAotCSAgU29tZSBTdXBlckggbWFjaGluZXMgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIGVpdGhlciBsaXR0bGUgb3IgYmlnCi0JICBlbmRpYW4gYnl0ZSBvcmRlci4gVGhlc2UgbW9kZXMgcmVxdWlyZSBkaWZmZXJlbnQga2VybmVscy4gU2F5IFkgaWYKLQkgIHlvdXIgbWFjaGluZSBpcyBsaXR0bGUgZW5kaWFuLCBOIGlmIGl0J3MgYSBiaWcgZW5kaWFuIG1hY2hpbmUuCi0KLWNvbmZpZyBQUkVFTVBUCi0JYm9vbCAiUHJlZW1wdGlibGUgS2VybmVsIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCi0KLWNvbmZpZyBVQkNfV0FLRVVQCi0JYm9vbCAiV2FrZXVwIFVCQyBvbiBzdGFydHVwIgotCWhlbHAKLQkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIHdha2V1cCB0aGUgVXNlciBCcmVhayBDb250cm9sbGVyIChVQkMpIG9uCi0JICBzdGFydHVwLiBBbHRob3VnaCB0aGUgVUJDIGlzIGxlZnQgaW4gYW4gYXdha2Ugc3RhdGUgd2hlbiB0aGUgcHJvY2Vzc29yCi0JICBjb21lcyB1cCwgc29tZSBib290IGxvYWRlcnMgbWlzYmVoYXZlIGJ5IHB1dHRpbmcgdGhlIFVCQyB0byBzbGVlcCBpbiBhCi0JICBwb3dlciBzYXZpbmcgc3RhdGUsIHdoaWNoIGNhdXNlcyBpc3N1ZXMgd2l0aCB0aGluZ3MgbGlrZSBwdHJhY2UoKS4KLQotCSAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIFNIX1dSSVRFVEhST1VHSAotCWJvb2wgIlVzZSB3cml0ZS10aHJvdWdoIGNhY2hpbmciCi0JZGVmYXVsdCB5IGlmIENQVV9TSDIKLQloZWxwCi0JICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gd2lsbCBjb25maWd1cmUgdGhlIGNhY2hlcyBpbiB3cml0ZS10aHJvdWdoCi0JICBtb2RlLCBhcyBvcHBvc2VkIHRvIHRoZSBkZWZhdWx0IHdyaXRlLWJhY2sgY29uZmlndXJhdGlvbi4KLQotCSAgU2luY2UgdGhlcmUncyBzaWxsIHNvbWUgYWxpYXNpbmcgaXNzdWVzIG9uIFNILTQsIHRoaXMgb3B0aW9uIHdpbGwKLQkgIHVuZm9ydHVuYXRlbHkgc3RpbGwgcmVxdWlyZSB0aGUgbWFqb3JpdHkgb2YgZmx1c2hpbmcgZnVuY3Rpb25zIHRvCi0JICBiZSBpbXBsZW1lbnRlZCB0byBkZWFsIHdpdGggYWxpYXNpbmcuCi0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBTSF9PQ1JBTQotCWJvb2wgIk9wZXJhbmQgQ2FjaGUgUkFNIChPQ1JBTSkgc3VwcG9ydCIKLQloZWxwCi0JICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gd2lsbCBhdXRvbWF0aWNhbGx5IHRlYXIgZG93biB0aGUgbnVtYmVyIG9mCi0JICBzZXRzIGluIHRoZSBkY2FjaGUgYnkgaGFsZiwgd2hpY2ggaW4gdHVybiBleHBvc2VzIGEgbWVtb3J5IHJhbmdlLgotCi0JICBUaGUgYWRkcmVzc2VzIGZvciB0aGUgT0MgUkFNIGJhc2Ugd2lsbCB2YXJ5IGFjY29yZGluZyB0byB0aGUKLQkgIHByb2Nlc3NvciB2ZXJzaW9uLiBDb25zdWx0IHZlbmRvciBkb2N1bWVudGF0aW9uIGZvciBzcGVjaWZpY3MuCi0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBTSF9TVE9SRV9RVUVVRVMKIAlib29sICJTdXBwb3J0IGZvciBTdG9yZSBRdWV1ZXMiCiAJZGVwZW5kcyBvbiBDUFVfU0g0CkBAIC01NzksNiArMzU5LDEyNSBAQAogCSAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgZW5hYmxlIGFuIGluLWtlcm5lbCBBUEkgZm9yIG1hbmlwdWxhdGluZwogCSAgdGhlIHN0b3JlIHF1ZXVlcyBpbnRlZ3JhdGVkIGluIHRoZSBTSC00IHByb2Nlc3NvcnMuCiAKK2NvbmZpZyBDUFVfSEFTX0lOVEVWVAorCWJvb2wKKworY29uZmlnIENQVV9IQVNfUElOVF9JUlEKKwlib29sCisKK2NvbmZpZyBDUFVfSEFTX0lOVEMyX0lSUQorCWJvb2wKKworY29uZmlnIENQVV9IQVNfU1JfUkIKKwlib29sICJDUFUgaGFzIFNSLlJCIgorCWRlcGVuZHMgb24gQ1BVX1NIMyB8fCBDUFVfU0g0CisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyB3aWxsIGVuYWJsZSB0aGUgdXNlIG9mIFNSLlJCIHJlZ2lzdGVyIGJhbmsgdXNhZ2UuIFByb2Nlc3NvcnMKKwkgIHRoYXQgYXJlIGxhY2tpbmcgdGhpcyBiaXQgbXVzdCBoYXZlIGFub3RoZXIgbWV0aG9kIGluIHBsYWNlIGZvcgorCSAgYWNjb21wbGlzaGluZyB3aGF0IGlzIHRha2VuIGNhcmUgb2YgYnkgdGhlIGJhbmtlZCByZWdpc3RlcnMuCisKKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3NoL3JlZ2lzdGVyLWJhbmtzLnR4dD4gZm9yIGZ1cnRoZXIKKwkgIGluZm9ybWF0aW9uIG9uIFNSLlJCIGFuZCByZWdpc3RlciBiYW5raW5nIGluIHRoZSBrZXJuZWwgaW4gZ2VuZXJhbC4KKworZW5kbWVudQorCittZW51ICJUaW1lciBzdXBwb3J0IgorCitjb25maWcgU0hfVE1VCisJYm9vbCAiVE1VIHRpbWVyIHN1cHBvcnQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBlbmFibGVzIHRoZSB1c2Ugb2YgdGhlIFRNVSBhcyB0aGUgc3lzdGVtIHRpbWVyLgorCitlbmRtZW51CisKK3NvdXJjZSAiYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9LY29uZmlnIgorCitzb3VyY2UgImFyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9LY29uZmlnIgorCitjb25maWcgU0hfUENMS19GUkVRX0JPT0wKKwlib29sICJTZXQgZGVmYXVsdCBwY2xrIGZyZXF1ZW5jeSIKKwlkZWZhdWx0IHkgaWYgIVNIX1JUQworCWRlZmF1bHQgbgorCitjb25maWcgU0hfUENMS19GUkVRCisJaW50ICJQZXJpcGhlcmFsIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopIgorCWRlcGVuZHMgb24gU0hfUENMS19GUkVRX0JPT0wKKwlkZWZhdWx0ICI1MDAwMDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3NzUwIHx8IENQVV9TVUJUWVBFX1NINzc4MAorCWRlZmF1bHQgIjYwMDAwMDAwIiBpZiBDUFVfU1VCVFlQRV9TSDc3NTEKKwlkZWZhdWx0ICIzMzMzMzMzMyIgaWYgQ1BVX1NVQlRZUEVfU0g3MzAwIHx8IENQVV9TVUJUWVBFX1NINzc3MCB8fCBDUFVfU1VCVFlQRV9TSDc3NjAKKwlkZWZhdWx0ICIyNzAwMDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3MzE4MAorCWRlZmF1bHQgIjY2MDAwMDAwIiBpZiBDUFVfU1VCVFlQRV9TSDRfMjAyCisJaGVscAorCSAgVGhpcyBvcHRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBwZXJpcGhlcmFsIGNsb2NrIGZyZXF1ZW5jeS4KKwkgIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBkZXRlcm1pbmluZyB0aGUgcmVmZXJlbmNlIGNsb2NrIHZhbHVlIG9uCisJICBwbGF0Zm9ybXMgbGFja2luZyBhbiBSVEMuCisKK21lbnUgIkNQVSBGcmVxdWVuY3kgc2NhbGluZyIKKworc291cmNlICJkcml2ZXJzL2NwdWZyZXEvS2NvbmZpZyIKKworY29uZmlnIFNIX0NQVV9GUkVRCisJdHJpc3RhdGUgIlN1cGVySCBDUFUgRnJlcXVlbmN5IGRyaXZlciIKKwlkZXBlbmRzIG9uIENQVV9GUkVRCisJc2VsZWN0IENQVV9GUkVRX1RBQkxFCisJaGVscAorCSAgVGhpcyBhZGRzIHRoZSBjcHVmcmVxIGRyaXZlciBmb3IgU3VwZXJILiBBdCBwcmVzZW50LCBvbmx5CisJICB0aGUgU0gtNCBpcyBzdXBwb3J0ZWQuCisKKwkgIEZvciBkZXRhaWxzLCB0YWtlIGEgbG9vayBhdCA8ZmlsZTpEb2N1bWVudGF0aW9uL2NwdS1mcmVxPi4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworZW5kbWVudQorCitzb3VyY2UgImFyY2gvc2gvZHJpdmVycy9kbWEvS2NvbmZpZyIKKworc291cmNlICJhcmNoL3NoL2NjaGlwcy9LY29uZmlnIgorCitjb25maWcgSEVBUlRCRUFUCisJYm9vbCAiSGVhcnRiZWF0IExFRCIKKwlkZXBlbmRzIG9uIFNIX01QQzEyMTEgfHwgU0hfU0gwMyB8fCBTSF9DQVQ2ODcwMSB8fCBcCisJCSAgIFNIX1NUQjFfSEFSUCB8fCBTSF9TVEIxX09WRVJEUklWRSB8fCBTSF9CSUdTVVIgfHwgXAorCQkgICBTSF83NzUxX1NPTFVUSU9OX0VOR0lORSB8fCBTSF83MzAwX1NPTFVUSU9OX0VOR0lORSB8fCBcCisJCSAgIFNIXzczMTgwX1NPTFVUSU9OX0VOR0lORSB8fCBTSF9TT0xVVElPTl9FTkdJTkUgfHwgXAorCQkgICBTSF9SVFM3NzUxUjJEIHx8IFNIX1NINDIwMl9NSUNST0RFViB8fCBTSF9MQU5ESVNLCisJaGVscAorCSAgVXNlIHRoZSBwb3dlci1vbiBMRUQgb24geW91ciBtYWNoaW5lIGFzIGEgbG9hZCBtZXRlci4gIFRoZSBleGFjdAorCSAgYmVoYXZpb3IgaXMgcGxhdGZvcm0tZGVwZW5kZW50LCBidXQgbm9ybWFsbHkgdGhlIGZsYXNoIGZyZXF1ZW5jeSBpcworCSAgYSBoeXBlcmJvbGljIGZ1bmN0aW9uIG9mIHRoZSA1LW1pbnV0ZSBsb2FkIGF2ZXJhZ2UuCisKK2VuZG1lbnUKKworY29uZmlnIElTQV9ETUFfQVBJCisJYm9vbAorCWRlcGVuZHMgb24gTVBDMTIxMQorCWRlZmF1bHQgeQorCittZW51ICJLZXJuZWwgZmVhdHVyZXMiCisKK2NvbmZpZyBLRVhFQworCWJvb2wgImtleGVjIHN5c3RlbSBjYWxsIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJaGVscAorCSAga2V4ZWMgaXMgYSBzeXN0ZW0gY2FsbCB0aGF0IGltcGxlbWVudHMgdGhlIGFiaWxpdHkgdG8gc2h1dGRvd24geW91cgorCSAgY3VycmVudCBrZXJuZWwsIGFuZCB0byBzdGFydCBhbm90aGVyIGtlcm5lbC4gIEl0IGlzIGxpa2UgYSByZWJvb3QKKwkgIGJ1dCBpdCBpcyBpbmRlcGVkZW50IG9mIHRoZSBzeXN0ZW0gZmlybXdhcmUuICBBbmQgbGlrZSBhIHJlYm9vdAorCSAgeW91IGNhbiBzdGFydCBhbnkga2VybmVsIHdpdGggaXQsIG5vdCBqdXN0IExpbnV4LgorCisJICBUaGUgbmFtZSBjb21lcyBmcm9tIHRoZSBzaW1pbGlhcml0eSB0byB0aGUgZXhlYyBzeXN0ZW0gY2FsbC4KKworCSAgSXQgaXMgYW4gb25nb2luZyBwcm9jZXNzIHRvIGJlIGNlcnRhaW4gdGhlIGhhcmR3YXJlIGluIGEgbWFjaGluZQorCSAgaXMgcHJvcGVybHkgc2h1dGRvd24sIHNvIGRvIG5vdCBiZSBzdXJwcmlzZWQgaWYgdGhpcyBjb2RlIGRvZXMgbm90CisJICBpbml0aWFsbHkgd29yayBmb3IgeW91LiAgSXQgbWF5IGhlbHAgdG8gZW5hYmxlIGRldmljZSBob3RwbHVnZ2luZworCSAgc3VwcG9ydC4gIEFzIG9mIHRoaXMgd3JpdGluZyB0aGUgZXhhY3QgaGFyZHdhcmUgaW50ZXJmYWNlIGlzCisJICBzdHJvbmdseSBpbiBmbHV4LCBzbyBubyBnb29kIHJlY29tbWVuZGF0aW9uIGNhbiBiZSBtYWRlLgorCitjb25maWcgUFJFRU1QVAorCWJvb2wgIlByZWVtcHRpYmxlIEtlcm5lbCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCiBjb25maWcgU01QCiAJYm9vbCAiU3ltbWV0cmljIG11bHRpLXByb2Nlc3Npbmcgc3VwcG9ydCIKIAktLS1oZWxwLS0tCkBAIC02MTQsODcgKzUxMyw1OCBAQAogCSAgVGhpcyBpcyBwdXJlbHkgdG8gc2F2ZSBtZW1vcnkgLSBlYWNoIHN1cHBvcnRlZCBDUFUgYWRkcwogCSAgYXBwcm94aW1hdGVseSBlaWdodCBraWxvYnl0ZXMgdG8gdGhlIGtlcm5lbCBpbWFnZS4KIAotY29uZmlnIEhTNzc1MVJWT0lQX0NPREVDCi0JYm9vbCAiU3VwcG9ydCBWb0lQIENvZGVjIHNlY3Rpb24iCi0JZGVwZW5kcyBvbiBTSF9IUzc3NTFSVk9JUAotCWhlbHAKLQkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIHN1cHBvcnQgQ09ERUMgc2VjdGlvbi4KLQotY29uZmlnIFJUUzc3NTFSMkRfUkVWMTEKLQlib29sICJSVFM3NzUxUjJEIFJldi4gMS4xIGJvYXJkIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTSF9SVFM3NzUxUjJECi0JaGVscAotCSAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgc3VwcG9ydCB2ZXJzaW9uIHJldi4gMS4xLgotCi1jb25maWcgU0hfUENMS19DQUxDCi0JYm9vbAotCWRlZmF1bHQgbiBpZiBDUFVfU1VCVFlQRV9TSDczMDAgfHwgQ1BVX1NVQlRZUEVfU0g3MzE4MAorY29uZmlnIENQVV9IQVNfU1JfUkIKKwlib29sICJDUFUgaGFzIFNSLlJCIgorCWRlcGVuZHMgb24gQ1BVX1NIMyB8fCBDUFVfU0g0CiAJZGVmYXVsdCB5CiAJaGVscAotCSAgVGhpcyBvcHRpb24gd2lsbCBjYXVzZSB0aGUgUENMSyB2YWx1ZSB0byBiZSBwcm9iZWQgYXQgcnVuLXRpbWUuIEl0Ci0JICB3aWxsIGRpc3BsYXkgYSBub3RpZmljYXRpb24gaWYgdGhlIHByb2JlZCB2YWx1ZSBoYXMgZ3JlYXRlciB0aGFuIGEKLQkgIDElIHZhcmlhbmNlIG9mIHRoZSBoYXJkY29kZWQgQ09ORklHX1NIX1BDTEtfRlJFUS4KKwkgIFRoaXMgd2lsbCBlbmFibGUgdGhlIHVzZSBvZiBTUi5SQiByZWdpc3RlciBiYW5rIHVzYWdlLiBQcm9jZXNzb3JzCisJICB0aGF0IGFyZSBsYWNraW5nIHRoaXMgYml0IG11c3QgaGF2ZSBhbm90aGVyIG1ldGhvZCBpbiBwbGFjZSBmb3IKKwkgIGFjY29tcGxpc2hpbmcgd2hhdCBpcyB0YWtlbiBjYXJlIG9mIGJ5IHRoZSBiYW5rZWQgcmVnaXN0ZXJzLgogCi1jb25maWcgU0hfUENMS19GUkVRCi0JaW50ICJQZXJpcGhlcmFsIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopIgotCWRlZmF1bHQgIjUwMDAwMDAwIiBpZiBDUFVfU1VCVFlQRV9TSDc3NTAKLQlkZWZhdWx0ICI2MDAwMDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3NzUxCi0JZGVmYXVsdCAiMzMzMzMzMzMiIGlmIENQVV9TVUJUWVBFX1NINzMwMAotCWRlZmF1bHQgIjI3MDAwMDAwIiBpZiBDUFVfU1VCVFlQRV9TSDczMTgwCi0JZGVmYXVsdCAiNjYwMDAwMDAiIGlmIENQVV9TVUJUWVBFX1NINF8yMDIKLQlkZWZhdWx0ICIxMTkzMTgyIgorCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vc2gvcmVnaXN0ZXItYmFua3MudHh0PiBmb3IgZnVydGhlcgorCSAgaW5mb3JtYXRpb24gb24gU1IuUkIgYW5kIHJlZ2lzdGVyIGJhbmtpbmcgaW4gdGhlIGtlcm5lbCBpbiBnZW5lcmFsLgorCitlbmRtZW51CisKK21lbnUgIkJvb3Qgb3B0aW9ucyIKKworY29uZmlnIFpFUk9fUEFHRV9PRkZTRVQKKwloZXggIlplcm8gcGFnZSBvZmZzZXQiCisJZGVmYXVsdCAiMHgwMDAwNDAwMCIgaWYgU0hfTVBDMTIxMSB8fCBTSF9TSDAzCisJZGVmYXVsdCAiMHgwMDAwMTAwMCIKIAloZWxwCi0JICBUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHBlcmlwaGVyYWwgY2xvY2sgZnJlcXVlbmN5LiBUaGlzCi0JICBvcHRpb24gbXVzdCBiZSBzZXQgZm9yIGVhY2ggcHJvY2Vzc29yIGluIG9yZGVyIGZvciB0aGUga2VybmVsIHRvCi0JICBmdW5jdGlvbiByZWxpYWJseS4gSWYgbm8gc2FuZSBkZWZhdWx0IGV4aXN0cywgd2UgdXNlIGEgZGVmYXVsdCBmcm9tCi0JICB0aGUgbGVnYWN5IGk4MjU0LiBBbnkgZGlzY3JlcGFuY2llcyB3aWxsIGJlIHJlcG9ydGVkIG9uIGJvb3QgdGltZQotCSAgd2l0aCBhbiBhdXRvLXByb2JlZCBmcmVxdWVuY3kgd2hpY2ggc2hvdWxkIGJlIGNvbnNpZGVyZWQgdGhlIHByb3BlcgotCSAgdmFsdWUgZm9yIHlvdXIgaGFyZHdhcmUuCisJICBUaGlzIHNldHMgdGhlIGRlZmF1bHQgb2Zmc2V0IG9mIHplcm8gcGFnZS4KIAotbWVudSAiQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nIgotCi1zb3VyY2UgImRyaXZlcnMvY3B1ZnJlcS9LY29uZmlnIgotCi1jb25maWcgU0hfQ1BVX0ZSRVEKLQl0cmlzdGF0ZSAiU3VwZXJIIENQVSBGcmVxdWVuY3kgZHJpdmVyIgotCWRlcGVuZHMgb24gQ1BVX0ZSRVEKLQlzZWxlY3QgQ1BVX0ZSRVFfVEFCTEUKK2NvbmZpZyBCT09UX0xJTktfT0ZGU0VUCisJaGV4ICJMaW5rIGFkZHJlc3Mgb2Zmc2V0IGZvciBib290aW5nIgorCWRlZmF1bHQgIjB4MDA4MDAwMDAiCiAJaGVscAotCSAgVGhpcyBhZGRzIHRoZSBjcHVmcmVxIGRyaXZlciBmb3IgU3VwZXJILiBBdCBwcmVzZW50LCBvbmx5Ci0JICB0aGUgU0gtNCBpcyBzdXBwb3J0ZWQuCisJICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIHNldCB0aGUgbGluayBhZGRyZXNzIG9mZnNldCBvZiB0aGUgekltYWdlLgorCSAgVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBhcmUgb24gYSBib2FyZCB3aGljaCBoYXMgYSBzbWFsbCBhbW91bnQgb2YKKwkgIG1lbW9yeS4KIAotCSAgRm9yIGRldGFpbHMsIHRha2UgYSBsb29rIGF0IDxmaWxlOkRvY3VtZW50YXRpb24vY3B1LWZyZXE+LgorY29uZmlnIFVCQ19XQUtFVVAKKwlib29sICJXYWtldXAgVUJDIG9uIHN0YXJ0dXAiCisJaGVscAorCSAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgd2FrZXVwIHRoZSBVc2VyIEJyZWFrIENvbnRyb2xsZXIgKFVCQykgb24KKwkgIHN0YXJ0dXAuIEFsdGhvdWdoIHRoZSBVQkMgaXMgbGVmdCBpbiBhbiBhd2FrZSBzdGF0ZSB3aGVuIHRoZSBwcm9jZXNzb3IKKwkgIGNvbWVzIHVwLCBzb21lIGJvb3QgbG9hZGVycyBtaXNiZWhhdmUgYnkgcHV0dGluZyB0aGUgVUJDIHRvIHNsZWVwIGluIGEKKwkgIHBvd2VyIHNhdmluZyBzdGF0ZSwgd2hpY2ggY2F1c2VzIGlzc3VlcyB3aXRoIHRoaW5ncyBsaWtlIHB0cmFjZSgpLgogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCi1lbmRtZW51Citjb25maWcgQ01ETElORV9CT09MCisJYm9vbCAiRGVmYXVsdCBib290bG9hZGVyIGtlcm5lbCBhcmd1bWVudHMiCiAKLXNvdXJjZSAiYXJjaC9zaC9kcml2ZXJzL2RtYS9LY29uZmlnIgotCi1zb3VyY2UgImFyY2gvc2gvY2NoaXBzL0tjb25maWciCi0KLWNvbmZpZyBIRUFSVEJFQVQKLQlib29sICJIZWFydGJlYXQgTEVEIgotCWRlcGVuZHMgb24gU0hfTVBDMTIxMSB8fCBTSF9TSDAzIHx8IFNIX0NBVDY4NzAxIHx8IFNIX1NUQjFfSEFSUCB8fCBTSF9TVEIxX09WRVJEUklWRSB8fCBTSF9CSUdTVVIgfHwgU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUgfHwgU0hfNzMwMF9TT0xVVElPTl9FTkdJTkUgfHwgU0hfNzMxODBfU09MVVRJT05fRU5HSU5FIHx8IFNIX1NPTFVUSU9OX0VOR0lORSB8fCBTSF9SVFM3NzUxUjJEIHx8IFNIX1NINDIwMl9NSUNST0RFVgotCWhlbHAKLQkgIFVzZSB0aGUgcG93ZXItb24gTEVEIG9uIHlvdXIgbWFjaGluZSBhcyBhIGxvYWQgbWV0ZXIuICBUaGUgZXhhY3QKLQkgIGJlaGF2aW9yIGlzIHBsYXRmb3JtLWRlcGVuZGVudCwgYnV0IG5vcm1hbGx5IHRoZSBmbGFzaCBmcmVxdWVuY3kgaXMKLQkgIGEgaHlwZXJib2xpYyBmdW5jdGlvbiBvZiB0aGUgNS1taW51dGUgbG9hZCBhdmVyYWdlLgotCi1jb25maWcgUlRDXzk3MDFKRQotCXRyaXN0YXRlICJFUFNPTiBSVEMtOTcwMUpFIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTSF9SVFM3NzUxUjJECi0JaGVscAotCSAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgc3VwcG9ydCBFUFNPTiBSVEMtOTcwMUpFLgorY29uZmlnIENNRExJTkUKKwlzdHJpbmcgIkluaXRpYWwga2VybmVsIGNvbW1hbmQgc3RyaW5nIgorCWRlcGVuZHMgb24gQ01ETElORV9CT09MCisJZGVmYXVsdCAiY29uc29sZT10dHlTQzEsMTE1MjAwIgogCiBlbmRtZW51CiAKLWNvbmZpZyBJU0FfRE1BX0FQSQotCWJvb2wKLQlkZXBlbmRzIG9uIE1QQzEyMTEKLQlkZWZhdWx0IHkKLQotbWVudSAiQnVzIG9wdGlvbnMgKFBDSSwgUENNQ0lBLCBFSVNBLCBNQ0EsIElTQSkiCittZW51ICJCdXMgb3B0aW9ucyIKIAogIyBFdmVuIG9uIFN1cGVySCBkZXZpY2VzIHdoaWNoIGRvbid0IGhhdmUgYW4gSVNBIGJ1cywKICMgdGhpcyB2YXJpYWJsZSBoZWxwcyB0aGUgUENNQ0lBIG1vZHVsZXMgaGFuZGxlCkBAIC03MDUsNyArNTc1LDcgQEAKICMgUENNQ0lBIG91dHJpZ2h0LiAtLSBQRk0uCiBjb25maWcgSVNBCiAJYm9vbAotCWRlZmF1bHQgeSBpZiBQQ01DSUEgfHwgU01DOTFYCisJZGVmYXVsdCB5IGlmIFBDTUNJQQogCWhlbHAKIAkgIEZpbmQgb3V0IHdoZXRoZXIgeW91IGhhdmUgSVNBIHNsb3RzIG9uIHlvdXIgbW90aGVyYm9hcmQuICBJU0EgaXMgdGhlCiAJICBuYW1lIG9mIGEgYnVzIHN5c3RlbSwgaS5lLiB0aGUgd2F5IHRoZSBDUFUgdGFsa3MgdG8gdGhlIG90aGVyIHN0dWZmCkBAIC03MzksMTAgKzYwOSw5IEBACiBjb25maWcgU0JVUwogCWJvb2wKIAotY29uZmlnIE1BUExFCi0JdHJpc3RhdGUgIk1hcGxlIEJ1cyBzdXBwb3J0IgotCWRlcGVuZHMgb24gU0hfRFJFQU1DQVNUCi0JZGVmYXVsdCB5Citjb25maWcgU1VQRVJIWVdBWQorCXRyaXN0YXRlICJTdXBlckh5d2F5IEJ1cyBzdXBwb3J0IgorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g0XzIwMgogCiBzb3VyY2UgImFyY2gvc2gvZHJpdmVycy9wY2kvS2NvbmZpZyIKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9LY29uZmlnLmRlYnVnIGIvYXJjaC9zaC9LY29uZmlnLmRlYnVnCmluZGV4IDNmYWIxODEuLjhmYjMxYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL3NoL0tjb25maWcuZGVidWcKQEAgLTE3LDcgKzE3LDcgQEAKIAogY29uZmlnIEVBUkxZX1NDSUZfQ09OU09MRQogCWJvb2wgIlVzZSBlYXJseSBTQ0lGIGNvbnNvbGUiCi0JZGVwZW5kcyBvbiBDUFVfU0g0CisJZGVwZW5kcyBvbiBDUFVfU0g0IHx8IENQVV9TSDJBICYmICFTSF9TVEFOREFSRF9CSU9TCiAKIGNvbmZpZyBFQVJMWV9QUklOVEsKIAlib29sICJFYXJseSBwcmludGsgc3VwcG9ydCIKZGlmZiAtLWdpdCBhL2FyY2gvc2gvTWFrZWZpbGUgYi9hcmNoL3NoL01ha2VmaWxlCmluZGV4IDY3MTkyZDYuLjA4Yzk1MTVjIDEwMDY0NAotLS0gYS9hcmNoL3NoL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvTWFrZWZpbGUKQEAgLTE3LDEwICsxNywzMCBAQAogY2ZsYWdzLXkJCQkJOj0gLW1iCiBjZmxhZ3MtJChDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4pCTo9IC1tbAogCitpc2EteQkJCQkJOj0gYW55Citpc2EtJChDT05GSUdfQ1BVX1NIMikJCQk6PSBzaDIKK2lzYS0kKENPTkZJR19DUFVfU0gzKQkJCTo9IHNoMworaXNhLSQoQ09ORklHX0NQVV9TSDQpCQkJOj0gc2g0Citpc2EtJChDT05GSUdfQ1BVX1NINEEpCQkJOj0gc2g0YQoraXNhLSQoQ09ORklHX0NQVV9TSDJBKQkJCTo9IHNoMmEKKworaXNhLSQoQ09ORklHX1NIX0RTUCkJCQk6PSAkKGlzYS15KS1kc3AKKworaWZuZGVmIENPTkZJR19NTVUKK2lzYS15CQkJOj0gJChpc2EteSktbm9tbXUKK2VuZGlmCisKK2lmbmRlZiBDT05GSUdfU0hfRlBVCitpc2EteQkJCTo9ICQoaXNhLXkpLW5vZnB1CitlbmRpZgorCitjZmxhZ3MteQkrPSAkKGNhbGwgYXMtb3B0aW9uLC1XYSQoY29tbWEpLWlzYT0kKGlzYS15KSwpCisKIGNmbGFncy0kKENPTkZJR19DUFVfU0gyKQkJKz0gLW0yCiBjZmxhZ3MtJChDT05GSUdfQ1BVX1NIMykJCSs9IC1tMwogY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDQpCQkrPSAtbTQgXAogCSQoY2FsbCBjYy1vcHRpb24sLW1uby1pbXBsaWNpdC1mcCwtbTQtbm9mcHUpCitjZmxhZ3MtJChDT05GSUdfQ1BVX1NINEEpCQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tNGEtbm9mcHUsKQogCiBjZmxhZ3MtJChDT05GSUdfU0hfRFNQKQkJCSs9IC1XYSwtZHNwCiBjZmxhZ3MtJChDT05GSUdfU0hfS0dEQikJCSs9IC1nCkBAIC02Nyw5ICs4Nyw3IEBACiBtYWNoZGlyLSQoQ09ORklHX1NIXzczMTgwX1NPTFVUSU9OX0VOR0lORSkJOj0gc2UvNzMxODAKIG1hY2hkaXItJChDT05GSUdfU0hfU1RCMV9IQVJQKQkJCTo9IGhhcnAKIG1hY2hkaXItJChDT05GSUdfU0hfU1RCMV9PVkVSRFJJVkUpCQk6PSBvdmVyZHJpdmUKLW1hY2hkaXItJChDT05GSUdfU0hfSFA2MjApCQkJOj0gaHA2eHgvaHA2MjAKLW1hY2hkaXItJChDT05GSUdfU0hfSFA2ODApCQkJOj0gaHA2eHgvaHA2ODAKLW1hY2hkaXItJChDT05GSUdfU0hfSFA2OTApCQkJOj0gaHA2eHgvaHA2OTAKK21hY2hkaXItJChDT05GSUdfU0hfSFA2WFgpCQkJOj0gaHA2eHgKIG1hY2hkaXItJChDT05GSUdfU0hfQ1FSRUVLKQkJCTo9IGNxcmVlawogbWFjaGRpci0kKENPTkZJR19TSF9ETUlEQSkJCQk6PSBkbWlkYQogbWFjaGRpci0kKENPTkZJR19TSF9FQzMxMDQpCQkJOj0gZWMzMTA0CkBAIC0xMTksMzEgKzEzNywzOSBAQAogCiBDUFBGTEFHU192bWxpbnV4LmxkcyA6PSAtdHJhZGl0aW9uYWwKIAoraWZuZXEgKCQoS0JVSUxEX1NSQyksKQoraW5jZGlyLXByZWZpeAk6PSAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLXNoLworZWxzZQoraW5jZGlyLXByZWZpeAk6PQorZW5kaWYKKwogIwlVcGRhdGUgbWFjaGluZSBhcmNoIGFuZCBwcm9jIHN5bWxpbmtzIGlmIHNvbWV0aGluZyB3aGljaCBhZmZlY3RzCiAjCXRoZW0gY2hhbmdlZC4gIFdlIHVzZSAuYXJjaCBhbmQgLm1hY2ggdG8gaW5kaWNhdGUgd2hlbiB0aGV5IHdlcmUKICMJdXBkYXRlZCBsYXN0LCBvdGhlcndpc2UgbWFrZSB1c2VzIHRoZSB0YXJnZXQgZGlyZWN0b3J5IG10aW1lLgogCiBpbmNsdWRlL2FzbS1zaC8uY3B1OiAkKHdpbGRjYXJkIGluY2x1ZGUvY29uZmlnL2NwdS8qLmgpIGluY2x1ZGUvY29uZmlnL01BUktFUgogCUBlY2hvICcgIFNZTUxJTksgaW5jbHVkZS9hc20tc2gvY3B1IC0+IGluY2x1ZGUvYXNtLXNoLyQoY3B1aW5jZGlyLXkpJwotaWZuZXEgKCQoS0JVSUxEX1NSQyksKQotCSQoUSlta2RpciAtcCBpbmNsdWRlL2FzbS1zaAotCSQoUSlsbiAtZnNuICQoc3JjdHJlZSkvaW5jbHVkZS9hc20tc2gvJChjcHVpbmNkaXIteSkgaW5jbHVkZS9hc20tc2gvY3B1Ci1lbHNlCi0JJChRKWxuIC1mc24gJChjcHVpbmNkaXIteSkgaW5jbHVkZS9hc20tc2gvY3B1Ci1lbmRpZgorCSQoUSlpZiBbICEgLWQgaW5jbHVkZS9hc20tc2ggXTsgdGhlbiBta2RpciAtcCBpbmNsdWRlL2FzbS1zaDsgZmkKKwkkKFEpbG4gLWZzbiAkKGluY2Rpci1wcmVmaXgpJChjcHVpbmNkaXIteSkgaW5jbHVkZS9hc20tc2gvY3B1CiAJQHRvdWNoICRACiAKKyMJTW9zdCBib2FyZHMgaGF2ZSB0aGVpciBvd24gbWFjaCBkaXJlY3Rvcmllcy4gIEZvciB0aGUgb25lcyB0aGF0CisjCWRvbid0LCBqdXN0IHJlZmVyZW5jZSB0aGUgcGFyZW50IGRpcmVjdG9yeSBzbyB0aGUgc2VtYW50aWNzIGFyZQorIwlrZXB0IHJvdWdobHkgdGhlIHNhbWUuCisKIGluY2x1ZGUvYXNtLXNoLy5tYWNoOiAkKHdpbGRjYXJkIGluY2x1ZGUvY29uZmlnL3NoLyouaCkgaW5jbHVkZS9jb25maWcvTUFSS0VSCi0JQGVjaG8gJyAgU1lNTElOSyBpbmNsdWRlL2FzbS1zaC9tYWNoIC0+IGluY2x1ZGUvYXNtLXNoLyQoaW5jZGlyLXkpJwotaWZuZXEgKCQoS0JVSUxEX1NSQyksKQotCSQoUSlta2RpciAtcCBpbmNsdWRlL2FzbS1zaAotCSQoUSlsbiAtZnNuICQoc3JjdHJlZSkvaW5jbHVkZS9hc20tc2gvJChpbmNkaXIteSkgaW5jbHVkZS9hc20tc2gvbWFjaAotZWxzZQotCSQoUSlsbiAtZnNuICQoaW5jZGlyLXkpIGluY2x1ZGUvYXNtLXNoL21hY2gKLWVuZGlmCisJQGVjaG8gLW4gJyAgU1lNTElOSyBpbmNsdWRlL2FzbS1zaC9tYWNoIC0+ICcKKwkkKFEpaWYgWyAhIC1kIGluY2x1ZGUvYXNtLXNoIF07IHRoZW4gbWtkaXIgLXAgaW5jbHVkZS9hc20tc2g7IGZpCisJJChRKWlmIFsgLWQgJChpbmNkaXItcHJlZml4KSQoaW5jZGlyLXkpIF07IHRoZW4gXAorCQllY2hvIC1lICdpbmNsdWRlL2FzbS1zaC8kKGluY2Rpci15KSc7IFwKKwkJbG4gLWZzbiAkKGluY2Rpci1wcmVmaXgpJChpbmNkaXIteSkgXAorCQkJaW5jbHVkZS9hc20tc2gvbWFjaDsgXAorCWVsc2UgXAorCQllY2hvIC1lICdpbmNsdWRlL2FzbS1zaCc7IFwKKwkJbG4gLWZzbiAkKGluY2Rpci1wcmVmaXgpIGluY2x1ZGUvYXNtLXNoL21hY2g7IFwKKwlmaQogCUB0b3VjaCAkQAogCi0KIGFyY2hwcmVwYXJlOiBtYWtldG9vbHMgaW5jbHVkZS9hc20tc2gvLmNwdSBpbmNsdWRlL2FzbS1zaC8ubWFjaAogCiAuUEhPTlk6IG1ha2V0b29scyBGT1JDRQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjdmZTBhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9ib2FyZHMvaHA2eHgvTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgSFA2eHggc3BlY2lmaWMgcGFydHMgb2YgdGhlIGtlcm5lbAorIworCitvYmoteQkgOj0gbWFjaC5vIHNldHVwLm8KKwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvaHA2MjAvTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9ocDYyMC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA2OTFkYi4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9ocDYyMC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgdGhlIEhQNjIwIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBrZXJuZWwKLSMKLQotb2JqLXkJIDo9IG1hY2gubyBzZXR1cC5vCi0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2hwNnh4L2hwNjIwL21hY2guYyBiL2FyY2gvc2gvYm9hcmRzL2hwNnh4L2hwNjIwL21hY2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM5MmQ4Mi4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9ocDYyMC9tYWNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9ib2FyZHMvaHA2eHgvaHA2MjAvbWFjaC5jCi0gKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMCBTdHVhcnQgTWVuZWZ5IChzdHVhcnQubWVuZWZ5QHN0LmNvbSkKLSAqIAotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqIE1hY2hpbmUgdmVjdG9yIGZvciB0aGUgSFA2MjAKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLSNpbmNsdWRlIDxhc20vcnRjLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2h2ZWNfaW5pdC5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2hkNjQ0NjEvaGQ2NDQ2MS5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLQotLyoKLSAqIFRoZSBNYWNoaW5lIFZlY3RvcgotICovCi0KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9ocDYyMCBfX2luaXRtdiA9IHsKLSAgICAgICAgLm12X25yX2lycXMgICAgICAgICAgICAgPSBIRDY0NDYxX0lSUUJBU0UrSEQ2NDQ2MV9JUlFfTlVNLAotCi0gICAgICAgIC5tdl9pbmIgICAgICAgICAgICAgICAgID0gaGQ2NDQ2MV9pbmIsCi0gICAgICAgIC5tdl9pbncgICAgICAgICAgICAgICAgID0gaGQ2NDQ2MV9pbncsCi0gICAgICAgIC5tdl9pbmwgICAgICAgICAgICAgICAgID0gaGQ2NDQ2MV9pbmwsCi0gICAgICAgIC5tdl9vdXRiICAgICAgICAgICAgICAgID0gaGQ2NDQ2MV9vdXRiLAotICAgICAgICAubXZfb3V0dyAgICAgICAgICAgICAgICA9IGhkNjQ0NjFfb3V0dywKLSAgICAgICAgLm12X291dGwgICAgICAgICAgICAgICAgPSBoZDY0NDYxX291dGwsCi0KLSAgICAgICAgLm12X2luYl9wICAgICAgICAgICAgICAgPSBoZDY0NDYxX2luYl9wLAotICAgICAgICAubXZfaW53X3AgICAgICAgICAgICAgICA9IGhkNjQ0NjFfaW53LAotICAgICAgICAubXZfaW5sX3AgICAgICAgICAgICAgICA9IGhkNjQ0NjFfaW5sLAotICAgICAgICAubXZfb3V0Yl9wICAgICAgICAgICAgICA9IGhkNjQ0NjFfb3V0Yl9wLAotICAgICAgICAubXZfb3V0d19wICAgICAgICAgICAgICA9IGhkNjQ0NjFfb3V0dywKLSAgICAgICAgLm12X291dGxfcCAgICAgICAgICAgICAgPSBoZDY0NDYxX291dGwsCi0KLSAgICAgICAgLm12X2luc2IgICAgICAgICAgICAgICAgPSBoZDY0NDYxX2luc2IsCi0gICAgICAgIC5tdl9pbnN3ICAgICAgICAgICAgICAgID0gaGQ2NDQ2MV9pbnN3LAotICAgICAgICAubXZfaW5zbCAgICAgICAgICAgICAgICA9IGhkNjQ0NjFfaW5zbCwKLSAgICAgICAgLm12X291dHNiICAgICAgICAgICAgICAgPSBoZDY0NDYxX291dHNiLAotICAgICAgICAubXZfb3V0c3cgICAgICAgICAgICAgICA9IGhkNjQ0NjFfb3V0c3csCi0gICAgICAgIC5tdl9vdXRzbCAgICAgICAgICAgICAgID0gaGQ2NDQ2MV9vdXRzbCwKLQotICAgICAgICAubXZfaXJxX2RlbXV4ICAgICAgICAgICA9IGhkNjQ0NjFfaXJxX2RlbXV4LAotfTsKLUFMSUFTX01WKGhwNjIwKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvaHA2MjAvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL2hwNnh4L2hwNjIwL3NldHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NWZjNWQuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvaHA2MjAvc2V0dXAuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9ocDYyMC9zZXR1cC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIEFuZHJpeSBTa3VseXNoLCAyMDA1IEtyaXN0b2ZmZXIgRXJpY3NvbgotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuIFNlZSBMaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqIFNldHVwIGNvZGUgZm9yIGFuIEhQNjIwLgotICogRHVlIHRvIHNpbWlsaWFyaXR5IHdpdGggaHA2ODAvaHA2OTAgc2FtZSBpbml0cyBhcmUgZG9uZSAoZm9yIG5vdykKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9oZDY0NDYxL2hkNjQ0NjEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaHA2eHgvaHA2eHguaD4KLSNpbmNsdWRlIDxhc20vY3B1L2RhYy5oPgotCi1jb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKLXsKLQlyZXR1cm4gIkhQNjIwIjsKLX0KLQotaW50IF9faW5pdCBwbGF0Zm9ybV9zZXR1cCh2b2lkKQotewotCXUxNiB2OwotCi0JdiAgPSBpbncoSEQ2NDQ2MV9TVEJDUik7Ci0JdiB8PSBIRDY0NDYxX1NUQkNSX1NVUlRTVCB8IEhENjQ0NjFfU1RCQ1JfU0lSU1QgIHwKLQkgICAgIEhENjQ0NjFfU1RCQ1JfU1RNMVNUIHwgSEQ2NDQ2MV9TVEJDUl9TVE0wU1QgfAotCSAgICAgSEQ2NDQ2MV9TVEJDUl9TQUZFU1QgfCBIRDY0NDYxX1NUQkNSX1NQQzBTVCB8Ci0JICAgICBIRDY0NDYxX1NUQkNSX1NNSUFTVCB8IEhENjQ0NjFfU1RCQ1JfU0FGRUNLRV9PU1QgfAotCSAgICAgSEQ2NDQ2MV9TVEJDUl9TQUZFQ0tFX0lTVDsKLQlvdXR3KHYsIEhENjQ0NjFfU1RCQ1IpOwotCi0JdiAgPSBpbncoSEQ2NDQ2MV9HUEFEUik7Ci0JdiB8PSBIRDY0NDYxX0dQQURSX1NQRUFLRVIgfCBIRDY0NDYxX0dQQURSX1BDTUNJQTA7Ci0Jb3V0dyh2LCBIRDY0NDYxX0dQQURSKTsKLQotCXNoX2RhY19kaXNhYmxlKERBQ19TUEVBS0VSX1ZPTFVNRSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvaHA2ODAvTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9ocDY4MC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJlZWYxMS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9ocDY4MC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgdGhlIEhQNjgwIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBrZXJuZWwKLSMKLQotb2JqLXkJIDo9IG1hY2gubyBzZXR1cC5vCi0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2hwNnh4L2hwNjgwL21hY2guYyBiL2FyY2gvc2gvYm9hcmRzL2hwNnh4L2hwNjgwL21hY2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczNDg2MS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9ocDY4MC9tYWNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9ib2FyZHMvaHA2eHgvaHA2ODAvbWFjaC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIFN0dWFydCBNZW5lZnkgKHN0dWFydC5tZW5lZnlAc3QuY29tKQotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBNYWNoaW5lIHZlY3RvciBmb3IgdGhlIEhQNjgwCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+Ci0jaW5jbHVkZSA8YXNtL3J0Yy5oPgotI2luY2x1ZGUgPGFzbS9tYWNodmVjX2luaXQuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9oZDY0NDYxL2hkNjQ0NjEuaD4KLSNpbmNsdWRlIDxhc20vaHA2eHgvaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9ocDY4MCBfX2luaXRtdiA9IHsKLQkubXZfbnJfaXJxcyA9IEhENjQ0NjFfSVJRQkFTRSArIEhENjQ0NjFfSVJRX05VTSwKLQotCS5tdl9pbmIgPSBoZDY0NDYxX2luYiwKLQkubXZfaW53ID0gaGQ2NDQ2MV9pbncsCi0JLm12X2lubCA9IGhkNjQ0NjFfaW5sLAotCS5tdl9vdXRiID0gaGQ2NDQ2MV9vdXRiLAotCS5tdl9vdXR3ID0gaGQ2NDQ2MV9vdXR3LAotCS5tdl9vdXRsID0gaGQ2NDQ2MV9vdXRsLAotCi0JLm12X2luYl9wID0gaGQ2NDQ2MV9pbmJfcCwKLQkubXZfaW53X3AgPSBoZDY0NDYxX2ludywKLQkubXZfaW5sX3AgPSBoZDY0NDYxX2lubCwKLQkubXZfb3V0Yl9wID0gaGQ2NDQ2MV9vdXRiX3AsCi0JLm12X291dHdfcCA9IGhkNjQ0NjFfb3V0dywKLQkubXZfb3V0bF9wID0gaGQ2NDQ2MV9vdXRsLAotCi0JLm12X2luc2IgPSBoZDY0NDYxX2luc2IsCi0JLm12X2luc3cgPSBoZDY0NDYxX2luc3csCi0JLm12X2luc2wgPSBoZDY0NDYxX2luc2wsCi0JLm12X291dHNiID0gaGQ2NDQ2MV9vdXRzYiwKLQkubXZfb3V0c3cgPSBoZDY0NDYxX291dHN3LAotCS5tdl9vdXRzbCA9IGhkNjQ0NjFfb3V0c2wsCi0KLQkubXZfcmVhZHcgPSBoZDY0NDYxX3JlYWR3LAotCS5tdl93cml0ZXcgPSBoZDY0NDYxX3dyaXRldywKLQotCS5tdl9pcnFfZGVtdXggPSBoZDY0NDYxX2lycV9kZW11eCwKLX07Ci0KLUFMSUFTX01WKGhwNjgwKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvaHA2ODAvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL2hwNnh4L2hwNjgwL3NldHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNzAxOTAuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvaHA2ODAvc2V0dXAuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9ocDY4MC9zZXR1cC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIEFuZHJpeSBTa3VseXNoCi0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqIFNldHVwIGNvZGUgZm9yIGFuIEhQNjgwICAoaW50ZXJuYWwgcGVyaXBoZXJpYWxzIG9ubHkpCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vaGQ2NDQ2MS9oZDY0NDYxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2hwNnh4L2hwNnh4Lmg+Ci0jaW5jbHVkZSA8YXNtL2NwdS9kYWMuaD4KLQotY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCi17Ci0JcmV0dXJuICJIUDY4MCI7Ci19Ci0KLWludCBfX2luaXQgcGxhdGZvcm1fc2V0dXAodm9pZCkKLXsKLQl1MTYgdjsKLQl2ID0gaW53KEhENjQ0NjFfU1RCQ1IpOwotCXYgfD0gSEQ2NDQ2MV9TVEJDUl9TVVJUU1QgfCBIRDY0NDYxX1NUQkNSX1NJUlNUIHwKLQkgICAgSEQ2NDQ2MV9TVEJDUl9TVE0xU1QgfCBIRDY0NDYxX1NUQkNSX1NUTTBTVCB8Ci0JICAgIEhENjQ0NjFfU1RCQ1JfU0FGRVNUIHwgSEQ2NDQ2MV9TVEJDUl9TUEMwU1QgfAotCSAgICBIRDY0NDYxX1NUQkNSX1NNSUFTVCB8IEhENjQ0NjFfU1RCQ1JfU0FGRUNLRV9PU1QgfAotCSAgICBIRDY0NDYxX1NUQkNSX1NBRkVDS0VfSVNUOwotCW91dHcodiwgSEQ2NDQ2MV9TVEJDUik7Ci0JdiA9IGludyhIRDY0NDYxX0dQQURSKTsKLQl2IHw9IEhENjQ0NjFfR1BBRFJfU1BFQUtFUiB8IEhENjQ0NjFfR1BBRFJfUENNQ0lBMDsKLQlvdXR3KHYsIEhENjQ0NjFfR1BBRFIpOwotCi0Jc2hfZGFjX2Rpc2FibGUoREFDX1NQRUFLRVJfVk9MVU1FKTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvaHA2OTAvTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9ocDY5MC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJiZTk1ZS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9ocDY5MC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgdGhlIEhQNjkwIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBrZXJuZWwKLSMKLQotb2JqLXkJIDo9IG1hY2gubwotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9ocDY5MC9tYWNoLmMgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9ocDY5MC9tYWNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNGM2ODcuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvaHA2OTAvbWFjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvc2gvYm9hcmRzL2hwNnh4L2hwNjkwL21hY2guYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCBTdHVhcnQgTWVuZWZ5IChzdHVhcnQubWVuZWZ5QHN0LmNvbSkKLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogTWFjaGluZSB2ZWN0b3IgZm9yIHRoZSBIUDY5MAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotI2luY2x1ZGUgPGFzbS9ydGMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaHZlY19pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaGQ2NDQ2MS9oZDY0NDYxLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfaHA2OTAgX19pbml0bXYgPSB7Ci0gICAgICAgIC5tdl9ucl9pcnFzICAgICAgICAgICAgID0gSEQ2NDQ2MV9JUlFCQVNFK0hENjQ0NjFfSVJRX05VTSwKLQotICAgICAgICAubXZfaW5iICAgICAgICAgICAgICAgICA9IGhkNjQ0NjFfaW5iLAotICAgICAgICAubXZfaW53ICAgICAgICAgICAgICAgICA9IGhkNjQ0NjFfaW53LAotICAgICAgICAubXZfaW5sICAgICAgICAgICAgICAgICA9IGhkNjQ0NjFfaW5sLAotICAgICAgICAubXZfb3V0YiAgICAgICAgICAgICAgICA9IGhkNjQ0NjFfb3V0YiwKLSAgICAgICAgLm12X291dHcgICAgICAgICAgICAgICAgPSBoZDY0NDYxX291dHcsCi0gICAgICAgIC5tdl9vdXRsICAgICAgICAgICAgICAgID0gaGQ2NDQ2MV9vdXRsLAotCi0gICAgICAgIC5tdl9pbmJfcCAgICAgICAgICAgICAgID0gaGQ2NDQ2MV9pbmJfcCwKLSAgICAgICAgLm12X2lud19wICAgICAgICAgICAgICAgPSBoZDY0NDYxX2ludywKLSAgICAgICAgLm12X2lubF9wICAgICAgICAgICAgICAgPSBoZDY0NDYxX2lubCwKLSAgICAgICAgLm12X291dGJfcCAgICAgICAgICAgICAgPSBoZDY0NDYxX291dGJfcCwKLSAgICAgICAgLm12X291dHdfcCAgICAgICAgICAgICAgPSBoZDY0NDYxX291dHcsCi0gICAgICAgIC5tdl9vdXRsX3AgICAgICAgICAgICAgID0gaGQ2NDQ2MV9vdXRsLAotCi0gICAgICAgIC5tdl9pbnNiICAgICAgICAgICAgICAgID0gaGQ2NDQ2MV9pbnNiLAotICAgICAgICAubXZfaW5zdyAgICAgICAgICAgICAgICA9IGhkNjQ0NjFfaW5zdywKLSAgICAgICAgLm12X2luc2wgICAgICAgICAgICAgICAgPSBoZDY0NDYxX2luc2wsCi0gICAgICAgIC5tdl9vdXRzYiAgICAgICAgICAgICAgID0gaGQ2NDQ2MV9vdXRzYiwKLSAgICAgICAgLm12X291dHN3ICAgICAgICAgICAgICAgPSBoZDY0NDYxX291dHN3LAotICAgICAgICAubXZfb3V0c2wgICAgICAgICAgICAgICA9IGhkNjQ0NjFfb3V0c2wsCi0KLSAgICAgICAgLm12X2lycV9kZW11eCAgICAgICAgICAgPSBoZDY0NDYxX2lycV9kZW11eCwKLX07Ci1BTElBU19NVihocDY5MCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2hwNnh4L21hY2guYyBiL2FyY2gvc2gvYm9hcmRzL2hwNnh4L21hY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGRiYmE5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9ib2FyZHMvaHA2eHgvbWFjaC5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBsaW51eC9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9tYWNoLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgU3R1YXJ0IE1lbmVmeSAoc3R1YXJ0Lm1lbmVmeUBzdC5jb20pCisgKgorICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIE1hY2hpbmUgdmVjdG9yIGZvciB0aGUgSFA2ODAKKyAqLworI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CisjaW5jbHVkZSA8YXNtL2hkNjQ0NjEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKK3N0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9ocDZ4eCBfX2luaXRtdiA9IHsKKwkubXZfbnJfaXJxcyA9IEhENjQ0NjFfSVJRQkFTRSArIEhENjQ0NjFfSVJRX05VTSwKKworCS5tdl9pbmIgPSBoZDY0NDYxX2luYiwKKwkubXZfaW53ID0gaGQ2NDQ2MV9pbncsCisJLm12X2lubCA9IGhkNjQ0NjFfaW5sLAorCS5tdl9vdXRiID0gaGQ2NDQ2MV9vdXRiLAorCS5tdl9vdXR3ID0gaGQ2NDQ2MV9vdXR3LAorCS5tdl9vdXRsID0gaGQ2NDQ2MV9vdXRsLAorCisJLm12X2luYl9wID0gaGQ2NDQ2MV9pbmJfcCwKKwkubXZfaW53X3AgPSBoZDY0NDYxX2ludywKKwkubXZfaW5sX3AgPSBoZDY0NDYxX2lubCwKKwkubXZfb3V0Yl9wID0gaGQ2NDQ2MV9vdXRiX3AsCisJLm12X291dHdfcCA9IGhkNjQ0NjFfb3V0dywKKwkubXZfb3V0bF9wID0gaGQ2NDQ2MV9vdXRsLAorCisJLm12X2luc2IgPSBoZDY0NDYxX2luc2IsCisJLm12X2luc3cgPSBoZDY0NDYxX2luc3csCisJLm12X2luc2wgPSBoZDY0NDYxX2luc2wsCisJLm12X291dHNiID0gaGQ2NDQ2MV9vdXRzYiwKKwkubXZfb3V0c3cgPSBoZDY0NDYxX291dHN3LAorCS5tdl9vdXRzbCA9IGhkNjQ0NjFfb3V0c2wsCisKKwkubXZfcmVhZHcgPSBoZDY0NDYxX3JlYWR3LAorCS5tdl93cml0ZXcgPSBoZDY0NDYxX3dyaXRldywKKworCS5tdl9pcnFfZGVtdXggPSBoZDY0NDYxX2lycV9kZW11eCwKK307CisKK0FMSUFTX01WKGhwNnh4KQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL2hwNnh4L3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ5NGE4ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvYm9hcmRzL2hwNnh4L3NldHVwLmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvc2gvYm9hcmRzL2hwNnh4L2hwNjgwL3NldHVwLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgQW5kcml5IFNrdWx5c2gKKyAqCisgKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogU2V0dXAgY29kZSBmb3IgYW4gSFA2ODAgIChpbnRlcm5hbCBwZXJpcGhlcmlhbHMgb25seSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9oZDY0NDYxLmg+CisjaW5jbHVkZSA8YXNtL2hwNnh4L2hwNnh4Lmg+CisjaW5jbHVkZSA8YXNtL2NwdS9kYWMuaD4KKworY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCit7CisJcmV0dXJuICJIUDZ4eCI7Cit9CisKK2ludCBfX2luaXQgcGxhdGZvcm1fc2V0dXAodm9pZCkKK3sKKwl1OCB2ODsKKwl1MTYgdjsKKwl2ID0gaW53KEhENjQ0NjFfU1RCQ1IpOworCXYgfD0gSEQ2NDQ2MV9TVEJDUl9TVVJUU1QgfCBIRDY0NDYxX1NUQkNSX1NJUlNUIHwKKwkgICAgSEQ2NDQ2MV9TVEJDUl9TVE0xU1QgfCBIRDY0NDYxX1NUQkNSX1NUTTBTVCB8CisJICAgIEhENjQ0NjFfU1RCQ1JfU0FGRVNUIHwgSEQ2NDQ2MV9TVEJDUl9TUEMwU1QgfAorCSAgICBIRDY0NDYxX1NUQkNSX1NNSUFTVCB8IEhENjQ0NjFfU1RCQ1JfU0FGRUNLRV9PU1QgfAorCSAgICBIRDY0NDYxX1NUQkNSX1NBRkVDS0VfSVNUOworI2lmbmRlZiBDT05GSUdfSEQ2NDQ2MV9FTkFCTEVSCisJdiB8PSBIRDY0NDYxX1NUQkNSX1NQQzFTVDsKKyNlbmRpZgorCW91dHcodiwgSEQ2NDQ2MV9TVEJDUik7CisJdiA9IGludyhIRDY0NDYxX0dQQURSKTsKKwl2IHw9IEhENjQ0NjFfR1BBRFJfU1BFQUtFUiB8IEhENjQ0NjFfR1BBRFJfUENNQ0lBMDsKKwlvdXR3KHYsIEhENjQ0NjFfR1BBRFIpOworCisJb3V0dyhIRDY0NDYxX1BDQ0dDUl9WQ0MwIHwgSEQ2NDQ2MV9QQ0NTQ1JfVkNDMSwgSEQ2NDQ2MV9QQ0MwR0NSKTsKKworI2lmbmRlZiBDT05GSUdfSEQ2NDQ2MV9FTkFCTEVSCisJb3V0dyhIRDY0NDYxX1BDQ0dDUl9WQ0MwIHwgSEQ2NDQ2MV9QQ0NTQ1JfVkNDMSwgSEQ2NDQ2MV9QQ0MxR0NSKTsKKyNlbmRpZgorCisJc2hfZGFjX291dHB1dCgwLCBEQUNfU1BFQUtFUl9WT0xVTUUpOworCXNoX2RhY19kaXNhYmxlKERBQ19TUEVBS0VSX1ZPTFVNRSk7CisJdjggPSBjdHJsX2luYihEQUNSKTsKKwl2OCAmPSB+REFDUl9EQUU7CisJY3RybF9vdXRiKHY4LERBQ1IpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9vdmVyZHJpdmUvTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9vdmVyZHJpdmUvTWFrZWZpbGUKaW5kZXggMTc2MmI1OS4uMjQ1ZjAzYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvb3ZlcmRyaXZlL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvYm9hcmRzL292ZXJkcml2ZS9NYWtlZmlsZQpAQCAtMiw3ICsyLDcgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBTVE1pY3JvZWxlY3Ryb25pY3MgT3ZlcmRyaXZlIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBrZXJuZWwKICMKIAotb2JqLXkJIDo9IG1hY2gubyBzZXR1cC5vIGlvLm8gaXJxLm8gbGVkLm8gdGltZS5vCitvYmoteQkgOj0gbWFjaC5vIHNldHVwLm8gaW8ubyBpcnEubyBsZWQubwogCiBvYmotJChDT05GSUdfUENJKSArPSBmcGdhLm8gZ2FsaWxlby5vIHBjaWRtYS5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL292ZXJkcml2ZS9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvb3ZlcmRyaXZlL3NldHVwLmMKaW5kZXggYTM2Y2UwMi4uOTRmNjE2NSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvb3ZlcmRyaXZlL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvb3ZlcmRyaXZlL3NldHVwLmMKQEAgLTE3LDggKzE3LDYgQEAKICNpbmNsdWRlIDxhc20vb3ZlcmRyaXZlL292ZXJkcml2ZS5oPgogI2luY2x1ZGUgPGFzbS9vdmVyZHJpdmUvZnBnYS5oPgogCi1leHRlcm4gdm9pZCBvZF90aW1lX2luaXQodm9pZCk7Ci0KIGNvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQogewogCXJldHVybiAiU0g3NzUwIE92ZXJkcml2ZSI7CkBAIC0zMSwxMSArMjksOSBAQAogewogI2lmZGVmIENPTkZJR19QQ0kKIAlpbml0X292ZXJkcml2ZV9mcGdhKCk7Ci0JZ2FsaWxlb19pbml0KCk7IAorCWdhbGlsZW9faW5pdCgpOwogI2VuZGlmCiAKLQlib2FyZF90aW1lX2luaXQgPSBvZF90aW1lX2luaXQ7Ci0KICAgICAgICAgLyogRW5hYmxlIFJTMjMyIHJlY2VpdmUgYnVmZmVycyAqLwogCXdyaXRlbCgweDFlLCBPVkVSRFJJVkVfQ1RSTCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9vdmVyZHJpdmUvdGltZS5jIGIvYXJjaC9zaC9ib2FyZHMvb3ZlcmRyaXZlL3RpbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg1MzM2OS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9vdmVyZHJpdmUvdGltZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBhcmNoL3NoL2JvYXJkcy9vdmVyZHJpdmUvdGltZS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIFN0dWFydCBNZW5lZnkgKHN0dWFydC5tZW5lZnlAc3QuY29tKQotICogQ29weXJpZ2h0IChDKSAyMDAyIFBhdWwgTXVuZHQgKGxldGhhbEBjaGFvdGljZHJlYW1zLm9yZykKLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogU1RNaWNyb2VsZWN0cm9uaWNzIE92ZXJkcml2ZSBTdXBwb3J0LgotICovCi0KLXZvaWQgb2RfdGltZV9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IGZycWNyX2RhdGEgewotCQl1bnNpZ25lZCBzaG9ydCBmcnFjcjsKLQkJc3RydWN0IHsKLQkJCXVuc2lnbmVkIGNoYXIgbXVsdGlwbGllcjsKLQkJCXVuc2lnbmVkIGNoYXIgZGl2aXNvcjsKLQkJfSBmYWN0b3JbM107Ci0JfTsKLQotCXN0YXRpYyBzdHJ1Y3QgZnJxY3JfZGF0YSBzdDQwX2ZycWNyX3RhYmxlW10gPSB7CQkKLQkJeyAweDAwMCwge3sxLDF9LCB7MSwxfSwgezEsMn19fSwKLQkJeyAweDAwMiwge3sxLDF9LCB7MSwxfSwgezEsNH19fSwKLQkJeyAweDAwNCwge3sxLDF9LCB7MSwxfSwgezEsOH19fSwKLQkJeyAweDAwOCwge3sxLDF9LCB7MSwyfSwgezEsMn19fSwKLQkJeyAweDAwQSwge3sxLDF9LCB7MSwyfSwgezEsNH19fSwKLQkJeyAweDAwQywge3sxLDF9LCB7MSwyfSwgezEsOH19fSwKLQkJeyAweDAxMSwge3sxLDF9LCB7MiwzfSwgezEsNn19fSwKLQkJeyAweDAxMywge3sxLDF9LCB7MiwzfSwgezEsM319fSwKLQkJeyAweDAxQSwge3sxLDF9LCB7MSwyfSwgezEsNH19fSwKLQkJeyAweDAxQywge3sxLDF9LCB7MSwyfSwgezEsOH19fSwKLQkJeyAweDAyMywge3sxLDF9LCB7MiwzfSwgezEsM319fSwKLQkJeyAweDAyQywge3sxLDF9LCB7MSwyfSwgezEsOH19fSwKLQkJeyAweDA0OCwge3sxLDJ9LCB7MSwyfSwgezEsNH19fSwKLQkJeyAweDA0QSwge3sxLDJ9LCB7MSwyfSwgezEsNn19fSwKLQkJeyAweDA0Qywge3sxLDJ9LCB7MSwyfSwgezEsOH19fSwKLQkJeyAweDA1QSwge3sxLDJ9LCB7MSwzfSwgezEsNn19fSwKLQkJeyAweDA1Qywge3sxLDJ9LCB7MSwzfSwgezEsNn19fSwKLQkJeyAweDA2Mywge3sxLDJ9LCB7MSw0fSwgezEsNH19fSwKLQkJeyAweDA2Qywge3sxLDJ9LCB7MSw0fSwgezEsOH19fSwKLQkJeyAweDA5MSwge3sxLDN9LCB7MSwzfSwgezEsNn19fSwKLQkJeyAweDA5Mywge3sxLDN9LCB7MSwzfSwgezEsNn19fSwKLQkJeyAweDBBMywge3sxLDN9LCB7MSw2fSwgezEsNn19fSwKLQkJeyAweDBEQSwge3sxLDR9LCB7MSw0fSwgezEsOH19fSwKLQkJeyAweDBEQywge3sxLDR9LCB7MSw0fSwgezEsOH19fSwKLQkJeyAweDBFQywge3sxLDR9LCB7MSw4fSwgezEsOH19fSwKLQkJeyAweDEyMywge3sxLDR9LCB7MSw0fSwgezEsOH19fSwKLQkJeyAweDE2Qywge3sxLDR9LCB7MSw4fSwgezEsOH19fSwKLQl9OwotCi0Jc3RydWN0IG1lbWNsa19kYXRhIHsKLQkJdW5zaWduZWQgY2hhciBtdWx0aXBsaWVyOwotCQl1bnNpZ25lZCBjaGFyIGRpdmlzb3I7Ci0JfTsKLQlzdGF0aWMgc3RydWN0IG1lbWNsa19kYXRhIHN0NDBfbWVtY2xrX3RhYmxlWzhdID0gewotCQl7MSwxfSwJLy8gMDAwCi0JCXsxLDJ9LAkvLyAwMDEKLQkJezEsM30sCS8vIDAxMAotCQl7MiwzfSwJLy8gMDExCi0JCXsxLDR9LAkvLyAxMDAKLQkJezEsNn0sCS8vIDEwMQotCQl7MSw4fSwJLy8gMTEwCi0JCXsxLDh9CS8vIDExMQotCX07Ci0KLQl1bnNpZ25lZCBsb25nIHB2cjsKLQotCS8qIAotCSAqIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIG1vdmVkIGludG8gdGhlIFNIMyBwcm9iaW5nIGNvZGUsIGFuZCB0aGVuCi0JICogdXNlIHRoZSBwcm9jZXNzb3Igc3RydWN0dXJlIHRvIGRldGVybWluZSB3aGljaCBDUFUgd2UgYXJlIHJ1bm5pbmcKLQkgKiBvbi4KLQkgKi8KLQlwdnIgPSBjdHJsX2lubChDQ05fUFZSKTsKLQlwcmludGsoIlBWUiAlMDh4XG4iLCBwdnIpOwotCi0JaWYgKCgocHZyID4+IENDTl9QVlJfQ0hJUF9TSElGVCkgJiBDQ05fUFZSX0NISVBfTUFTSykgPT0gQ0NOX1BWUl9DSElQX1NUNDBTVEIxKSB7Ci0JCS8qIAotCQkgKiBVbmZvcnR1bmF0bHkgdGhlIFNUQjEgRlJRQ1IgdmFsdWVzIGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUKLQkJICogNzc1MCBvbmVzLgotCQkgKi8KLQkJc3RydWN0IGZycWNyX2RhdGEgKmQ7Ci0JCWludCBhOwotCQl1bnNpZ25lZCBsb25nIG1lbWNsa2NyOwotCQlzdHJ1Y3QgbWVtY2xrX2RhdGEgKmU7Ci0KLQkJZm9yIChhPTA7IGE8QVJSQVlfU0laRShzdDQwX2ZycWNyX3RhYmxlKTsgYSsrKSB7Ci0JCQlkID0gJnN0NDBfZnJxY3JfdGFibGVbYV07Ci0JCQlpZiAoZC0+ZnJxY3IgPT0gKGZycWNyICYgMHgxZmYpKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChhID09IEFSUkFZX1NJWkUoc3Q0MF9mcnFjcl90YWJsZSkpIHsKLQkJCWQgPSBzdDQwX2ZycWNyX3RhYmxlOwotCQkJcHJpbnRrKCJFUlJPUjogVW5yZWNvZ25pc2VkIEZSUUNSIHZhbHVlLCB1c2luZyBkZWZhdWx0IG11bHRpcGxpZXJzXG4iKTsKLQkJfQotCi0JCW1lbWNsa2NyID0gY3RybF9pbmwoQ0xPQ0tHRU5fTUVNQ0xLQ1IpOwotCQllID0gJnN0NDBfbWVtY2xrX3RhYmxlW21lbWNsa2NyICYgTUVNQ0xLQ1JfUkFUSU9fTUFTS107Ci0KLQkJcHJpbnRrKCJDbG9jayBtdWx0aXBsaWVyczogQ1BVOiAlZC8lZCBCdXM6ICVkLyVkIE1lbTogJWQvJWQgUGVyaXBoOiAlZC8lZFxuIiwKLQkJICAgICAgIGQtPmZhY3RvclswXS5tdWx0aXBsaWVyLCBkLT5mYWN0b3JbMF0uZGl2aXNvciwKLQkJICAgICAgIGQtPmZhY3RvclsxXS5tdWx0aXBsaWVyLCBkLT5mYWN0b3JbMV0uZGl2aXNvciwKLQkJICAgICAgIGUtPm11bHRpcGxpZXIsICAgICAgICAgICBlLT5kaXZpc29yLAotCQkgICAgICAgZC0+ZmFjdG9yWzJdLm11bHRpcGxpZXIsIGQtPmZhY3RvclsyXS5kaXZpc29yKTsKLQkJCi0JCWN1cnJlbnRfY3B1X2RhdGEubWFzdGVyX2Nsb2NrID0gY3VycmVudF9jcHVfZGF0YS5tb2R1bGVfY2xvY2sgKgotCQkJCQkJZC0+ZmFjdG9yWzJdLmRpdmlzb3IgLwotCQkJCQkJZC0+ZmFjdG9yWzJdLm11bHRpcGxpZXI7Ci0JCWN1cnJlbnRfY3B1X2RhdGEuYnVzX2Nsb2NrICAgID0gY3VycmVudF9jcHVfZGF0YS5tYXN0ZXJfY2xvY2sgKgotCQkJCQkJZC0+ZmFjdG9yWzFdLm11bHRpcGxpZXIgLwotCQkJCQkJZC0+ZmFjdG9yWzFdLmRpdmlzb3I7Ci0JCWN1cnJlbnRfY3B1X2RhdGEubWVtb3J5X2Nsb2NrID0gY3VycmVudF9jcHVfZGF0YS5tYXN0ZXJfY2xvY2sgKgotCQkJCQkJZS0+bXVsdGlwbGllciAvIGUtPmRpdmlzb3I7Ci0JCWN1cnJlbnRfY3B1X2RhdGEuY3B1X2Nsb2NrICAgID0gY3VycmVudF9jcHVfZGF0YS5tYXN0ZXJfY2xvY2sgKgotCQkJCQkJZC0+ZmFjdG9yWzBdLm11bHRpcGxpZXIgLwotCQkJCQkJZC0+ZmFjdG9yWzBdLmRpdmlzb3I7Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9ocDY4MF9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3MvaHA2ODBfZGVmY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODVkMzY1Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvY29uZmlncy9ocDY4MF9kZWZjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw1NTQgKzAsMCBAQAotIwotIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjExLXNoCi0jIFdlZCBNYXIgIDIgMTU6MDk6NDEgMjAwNQotIwotQ09ORklHX1NVUEVSSD15Ci1DT05GSUdfVUlEMTY9eQotQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQotQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQotQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKLUNPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15Ci0KLSMKLSMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCi0jCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLSMgQ09ORklHX0NMRUFOX0NPTVBJTEUgaXMgbm90IHNldAotQ09ORklHX0JST0tFTj15Ci1DT05GSUdfQlJPS0VOX09OX1NNUD15Ci0KLSMKLSMgR2VuZXJhbCBzZXR1cAotIwotQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgotQ09ORklHX1NXQVA9eQotIyBDT05GSUdfU1lTVklQQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU0NUTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVURJVCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0Ci1DT05GSUdfS0FMTFNZTVM9eQotIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0Ci1DT05GSUdfRlVURVg9eQotQ09ORklHX0VQT0xMPXkKLSMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKLUNPTkZJR19TSE1FTT15Ci1DT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKLUNPTkZJR19DQ19BTElHTl9MQUJFTFM9MAotQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKLUNPTkZJR19DQ19BTElHTl9KVU1QUz0wCi0jIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKLQotIwotIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAotIwotIyBDT05GSUdfTU9EVUxFUyBpcyBub3Qgc2V0Ci0KLSMKLSMgU3lzdGVtIHR5cGUKLSMKLSMgQ09ORklHX1NIX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzUxX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MzAwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MzE4MF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzc1MV9TWVNURU1IIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NUQjFfSEFSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TVEIxX09WRVJEUklWRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUDYyMCBpcyBub3Qgc2V0Ci1DT05GSUdfU0hfSFA2ODA9eQotIyBDT05GSUdfU0hfSFA2OTAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfQ1FSRUVLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0RNSURBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0VDMzEwNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TQVRVUk4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfRFJFQU1DQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0NBVDY4NzAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0JJR1NVUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TSDIwMDAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfQURYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX01QQzEyMTEgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0gwMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUzc3NTFSVk9JUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9SVFM3NzUxUjJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0VET1NLNzcwNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TSDQyMDJfTUlDUk9ERVYgaXMgbm90IHNldAotIyBDT05GSUdfU0hfVU5LTk9XTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU0gyIGlzIG5vdCBzZXQKLUNPTkZJR19DUFVfU0gzPXkKLSMgQ09ORklHX0NQVV9TSDQgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjA0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5PXkKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODAgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MEdYMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKLUNPTkZJR19NTVU9eQotIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKLUNPTkZJR19NRU1PUllfU1RBUlQ9MHgwYzAwMDAwMAotQ09ORklHX01FTU9SWV9TSVpFPTB4MDA0MDAwMDAKLUNPTkZJR19NRU1PUllfU0VUPXkKLSMgQ09ORklHX01FTU9SWV9PVkVSUklERSBpcyBub3Qgc2V0Ci1DT05GSUdfU0hfUlRDPXkKLSMgQ09ORklHX1NIX0RTUCBpcyBub3Qgc2V0Ci1DT05GSUdfU0hfQURDPXkKLUNPTkZJR19TSF9IUDYwMD15Ci1DT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCi1DT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCi1DT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQotIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VQkNfV0FLRVVQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9PQ1JBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTVAgaXMgbm90IHNldAotQ09ORklHX1NIX1BDTEtfQ0FMQz15Ci1DT05GSUdfU0hfUENMS19GUkVRPTExOTMxODIKLQotIwotIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKLSMKLSMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKLQotIwotIyBETUEgc3VwcG9ydAotIwotIyBDT05GSUdfU0hfRE1BIGlzIG5vdCBzZXQKLQotIwotIyBDb21wYW5pb24gQ2hpcHMKLSMKLUNPTkZJR19IRDY0NDZYX1NFUklFUz15Ci1DT05GSUdfSEQ2NDQ2MT15Ci0jIENPTkZJR19IRDY0NDY1IGlzIG5vdCBzZXQKLUNPTkZJR19IRDY0NDYxX0lSUT0zNgotIyBDT05GSUdfSEQ2NDQ2MV9FTkFCTEVSIGlzIG5vdCBzZXQKLQotIwotIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIE1DQSwgSVNBKQotIwotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKLQotIwotIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0Ci0jCi0jIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAotCi0jCi0jIFBDLWNhcmQgYnJpZGdlcwotIwotCi0jCi0jIFBDSSBIb3RwbHVnIFN1cHBvcnQKLSMKLQotIwotIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cwotIwotQ09ORklHX0JJTkZNVF9FTEY9eQotIyBDT05GSUdfQklORk1UX0ZMQVQgaXMgbm90IHNldAotIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAotCi0jCi0jIFNIIGluaXRyZCBvcHRpb25zCi0jCi0jIENPTkZJR19FTUJFRERFRF9SQU1ESVNLIGlzIG5vdCBzZXQKLQotIwotIyBEZXZpY2UgRHJpdmVycwotIwotCi0jCi0jIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKLSMKLSMgQ09ORklHX1NUQU5EQUxPTkUgaXMgbm90IHNldAotQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCi0jIENPTkZJR19NVEQgaXMgbm90IHNldAotCi0jCi0jIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAotIwotIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0Ci0jCi0KLSMKLSMgQmxvY2sgZGV2aWNlcwotIwotIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX1JBTT15Ci1DT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKLUNPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKLUNPTkZJR19CTEtfREVWX0lOSVRSRD15Ci1DT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgotIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAotCi0jCi0jIElPIFNjaGVkdWxlcnMKLSMKLUNPTkZJR19JT1NDSEVEX05PT1A9eQotQ09ORklHX0lPU0NIRURfQVM9eQotQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQotQ09ORklHX0lPU0NIRURfQ0ZRPXkKLQotIwotIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0Ci0jCi1DT05GSUdfSURFPXkKLUNPTkZJR19JREVfTUFYX0hXSUZTPTQKLUNPTkZJR19CTEtfREVWX0lERT15Ci0KLSMKLSMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCi0jCi0jIENPTkZJR19CTEtfREVWX0lERV9TQVRBIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lERURJU0s9eQotIyBDT05GSUdfSURFRElTS19NVUxUSV9NT0RFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFQ0QgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVUQVBFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFRkxPUFBZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKLQotIwotIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCi0jCi1DT05GSUdfSURFX0dFTkVSSUM9eQotQ09ORklHX0lERV9TSD15Ci0jIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFRE1BIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lERURNQV9BVVRPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1NDU0kgaXMgbm90IHNldAotCi0jCi0jIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCi0jCi0jIENPTkZJR19NRCBpcyBub3Qgc2V0Ci0KLSMKLSMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAotIwotCi0jCi0jIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKLQotIwotIyBJMk8gZGV2aWNlIHN1cHBvcnQKLSMKLQotIwotIyBOZXR3b3JraW5nIHN1cHBvcnQKLSMKLSMgQ09ORklHX05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAotCi0jCi0jIElTRE4gc3Vic3lzdGVtCi0jCi0KLSMKLSMgVGVsZXBob255IFN1cHBvcnQKLSMKLSMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAotIwotQ09ORklHX0lOUFVUPXkKLQotIwotIyBVc2VybGFuZCBpbnRlcmZhY2VzCi0jCi1DT05GSUdfSU5QVVRfTU9VU0VERVY9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4Ci0jIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAotCi0jCi0jIElucHV0IEkvTyBkcml2ZXJzCi0jCi0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfU09VTkRfR0FNRVBPUlQ9eQotQ09ORklHX1NFUklPPXkKLSMgQ09ORklHX1NFUklPX0k4MDQyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fQ1Q4MkM3MTAgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBEZXZpY2UgRHJpdmVycwotIwotIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0Ci0KLSMKLSMgQ2hhcmFjdGVyIGRldmljZXMKLSMKLUNPTkZJR19WVD15Ci1DT05GSUdfVlRfQ09OU09MRT15Ci1DT05GSUdfSFdfQ09OU09MRT15Ci0jIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBkcml2ZXJzCi0jCi0jIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0Ci0KLSMKLSMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAotIwotIyBDT05GSUdfU0VSSUFMX1NIX1NDSSBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWDk4X1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlTPXkKLUNPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgotCi0jCi0jIElQTUkKLSMKLSMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2F0Y2hkb2cgQ2FyZHMKLSMKLSMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RUTEsgaXMgbm90IHNldAotIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAotCi0jCi0jIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgotIwotIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMkMgaXMgbm90IHNldAotCi0jCi0jIERhbGxhcydzIDEtd2lyZSBidXMKLSMKLSMgQ09ORklHX1cxIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjIGRldmljZXMKLSMKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotCi0jCi0jIEdyYXBoaWNzIHN1cHBvcnQKLSMKLUNPTkZJR19GQj15Ci0jIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0VQU09OMTM1NSBpcyBub3Qgc2V0Ci1DT05GSUdfRkJfSElUPXkKLSMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAotCi0jCi0jIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAotIwotIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAotQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQotQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQotQ09ORklHX0ZPTlRTPXkKLSMgQ09ORklHX0ZPTlRfOHg4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPTlRfOHgxNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT05UXzZ4MTEgaXMgbm90IHNldAotQ09ORklHX0ZPTlRfUEVBUkxfOHg4PXkKLSMgQ09ORklHX0ZPTlRfQUNPUk5fOHg4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPTlRfTUlOSV80eDYgaXMgbm90IHNldAotIyBDT05GSUdfRk9OVF9TVU44eDE2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPTlRfU1VOMTJ4MjIgaXMgbm90IHNldAotCi0jCi0jIExvZ28gY29uZmlndXJhdGlvbgotIwotIyBDT05GSUdfTE9HTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAotCi0jCi0jIFNvdW5kCi0jCi0jIENPTkZJR19TT1VORCBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIHN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9BUkNIX0hBU19IQ0QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAotCi0jCi0jIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgotIwotCi0jCi0jIFVTQiBHYWRnZXQgU3VwcG9ydAotIwotIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0Ci0KLSMKLSMgTU1DL1NEIENhcmQgc3VwcG9ydAotIwotIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKLQotIwotIyBJbmZpbmlCYW5kIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAotCi0jCi0jIEZpbGUgc3lzdGVtcwotIwotQ09ORklHX0VYVDJfRlM9eQotIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFhGUyBzdXBwb3J0Ci0jCi0jIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotQ09ORklHX0ROT1RJRlk9eQotIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAotCi0jCi0jIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBzZXVkbyBmaWxlc3lzdGVtcwotIwotQ09ORklHX1BST0NfRlM9eQotQ09ORklHX1BST0NfS0NPUkU9eQotQ09ORklHX1NZU0ZTPXkKLUNPTkZJR19ERVZGU19GUz15Ci1DT05GSUdfREVWRlNfTU9VTlQ9eQotIyBDT05GSUdfREVWRlNfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAotQ09ORklHX1JBTUZTPXkKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQYXJ0aXRpb24gVHlwZXMKLSMKLSMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLQotIwotIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAotIwotIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKLQotIwotIyBQcm9maWxpbmcgc3VwcG9ydAotIwotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKLQotIwotIyBTZWN1cml0eSBvcHRpb25zCi0jCi0jIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLQotIwotIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKLSMKLSMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKLSMKLQotIwotIyBMaWJyYXJ5IHJvdXRpbmVzCi0jCi0jIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAotQ09ORklHX0NSQzMyPXkKLSMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3MvaHA2eHhfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL2hwNnh4X2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzZmMTAyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9jb25maWdzL2hwNnh4X2RlZmNvbmZpZwpAQCAtMCwwICsxLDc0MyBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE1LXNoCisjIFdlZCBKYW4gIDQgMTU6MzI6NTYgMjAwNgorIworQ09ORklHX1NVUEVSSD15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKKyMgQ09ORklHX0NMRUFOX0NPTVBJTEUgaXMgbm90IHNldAorQ09ORklHX0JST0tFTj15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19TV0FQPXkKKyMgQ09ORklHX1NZU1ZJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNDVEwgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CisjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworIyBDT05GSUdfTU9EVUxFUyBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbGF5ZXIKKyMKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorQ09ORklHX0RFRkFVTFRfQVM9eQorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorCisjCisjIFN5c3RlbSB0eXBlCisjCisjIENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0hfNzMwMF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0hfNzMxODBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIXzc3NTFfU1lTVEVNSCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9TVEIxX0hBUlAgaXMgbm90IHNldAorIyBDT05GSUdfU0hfU1RCMV9PVkVSRFJJVkUgaXMgbm90IHNldAorQ09ORklHX1NIX0hQNlhYPXkKKyMgQ09ORklHX1NIX0NRUkVFSyBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9ETUlEQSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9FQzMxMDQgaXMgbm90IHNldAorIyBDT05GSUdfU0hfU0FUVVJOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0RSRUFNQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9DQVQ2ODcwMSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9CSUdTVVIgaXMgbm90IHNldAorIyBDT05GSUdfU0hfU0gyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0FEWCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9NUEMxMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1NIMDMgaXMgbm90IHNldAorIyBDT05GSUdfU0hfU0VDVVJFRURHRTU0MTAgaXMgbm90IHNldAorIyBDT05GSUdfU0hfSFM3NzUxUlZPSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hfUlRTNzc1MVIyRCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9FRE9TSzc3MDUgaXMgbm90IHNldAorIyBDT05GSUdfU0hfU0g0MjAyX01JQ1JPREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0xBTkRJU0sgaXMgbm90IHNldAorIyBDT05GSUdfU0hfVElUQU4gaXMgbm90IHNldAorIyBDT05GSUdfU0hfVU5LTk9XTiBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIHNlbGVjdGlvbgorIworQ09ORklHX0NQVV9TSDM9eQorCisjCisjIFNILTIgUHJvY2Vzc29yIFN1cHBvcnQKKyMKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYwNCBpcyBub3Qgc2V0CisKKyMKKyMgU0gtMyBQcm9jZXNzb3IgU3VwcG9ydAorIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDcgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA4IGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDk9eQorCisjCisjIFNILTQgUHJvY2Vzc29yIFN1cHBvcnQKKyMKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcwOTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKKworIworIyBTVDQwIFByb2Nlc3NvciBTdXBwb3J0CisjCisjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwR1gxIGlzIG5vdCBzZXQKKworIworIyBTSC00QSBQcm9jZXNzb3IgU3VwcG9ydAorIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCisjCitDT05GSUdfTU1VPXkKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKKyMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKKworIworIyBDYWNoZSBjb25maWd1cmF0aW9uCisjCisjIENPTkZJR19TSF9ESVJFQ1RfTUFQUEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9PQ1JBTSBpcyBub3Qgc2V0CitDT05GSUdfTUVNT1JZX1NUQVJUPTB4MGMwMDAwMDAKK0NPTkZJR19NRU1PUllfU0laRT0weDAwNDAwMDAwCisKKyMKKyMgUHJvY2Vzc29yIGZlYXR1cmVzCisjCitDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQorQ09ORklHX1NIX1JUQz15CisjIENPTkZJR19TSF9EU1AgaXMgbm90IHNldAorQ09ORklHX1NIX0FEQz15CisKKyMKKyMgVGltZXIgc3VwcG9ydAorIworQ09ORklHX1NIX1RNVT15CitDT05GSUdfU0hfUENMS19GUkVRX0JPT0w9eQorQ09ORklHX1NIX1BDTEtfRlJFUT0yMjExMDAwMAorCisjCisjIENQVSBGcmVxdWVuY3kgc2NhbGluZworIworIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAorCisjCisjIERNQSBzdXBwb3J0CisjCitDT05GSUdfU0hfRE1BPXkKK0NPTkZJR19OUl9PTkNISVBfRE1BX0NIQU5ORUxTPTQKKyMgQ09ORklHX05SX0RNQV9DSEFOTkVMU19CT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQV9QQUdFX09QUyBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcGFuaW9uIENoaXBzCisjCitDT05GSUdfSEQ2NDQ2WF9TRVJJRVM9eQorQ09ORklHX0hENjQ0NjE9eQorIyBDT05GSUdfSEQ2NDQ2NSBpcyBub3Qgc2V0CitDT05GSUdfSEQ2NDQ2MV9JUlE9MzYKK0NPTkZJR19IRDY0NDYxX0lPQkFTRT0weGIwMDAwMDAwCitDT05GSUdfSEQ2NDQ2MV9FTkFCTEVSPXkKKworIworIyBLZXJuZWwgZmVhdHVyZXMKKyMKKyMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aRVJPX1BBR0VfT0ZGU0VUPTB4MDAwMDEwMDAKK0NPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKKyMgQ09ORklHX1VCQ19XQUtFVVAgaXMgbm90IHNldAorIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKKworIworIyBCdXMgb3B0aW9ucworIworQ09ORklHX0lTQT15CisjIENPTkZJR19QQ0kgaXMgbm90IHNldAorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKK0NPTkZJR19QQ0NBUkQ9eQorIyBDT05GSUdfUENNQ0lBX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19QQ01DSUE9eQorQ09ORklHX1BDTUNJQV9MT0FEX0NJUz15CitDT05GSUdfUENNQ0lBX0lPQ1RMPXkKKworIworIyBQQy1jYXJkIGJyaWRnZXMKKyMKKyMgQ09ORklHX0k4MjM2NSBpcyBub3Qgc2V0CisjIENPTkZJR19UQ0lDIGlzIG5vdCBzZXQKK0NPTkZJR19IRDY0NDYxX1BDTUNJQT15CitDT05GSUdfSEQ2NDQ2MV9QQ01DSUFfU09DS0VUUz0xCitDT05GSUdfUENNQ0lBX1BST0JFPXkKKworIworIyBQQ0kgSG90cGx1ZyBTdXBwb3J0CisjCisKKyMKKyMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9GTEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nCisjCisjIENPTkZJR19ORVQgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworIyBDT05GSUdfU1RBTkRBTE9ORSBpcyBub3Qgc2V0CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CitDT05GSUdfRldfTE9BREVSPXkKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworIyBDT05GSUdfUE5QIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCitDT05GSUdfSURFPXkKK0NPTkZJR19JREVfTUFYX0hXSUZTPTQKK0NPTkZJR19CTEtfREVWX0lERT15CisKKyMKKyMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCisjCisjIENPTkZJR19CTEtfREVWX0lERV9TQVRBIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURJU0s9eQorIyBDT05GSUdfSURFRElTS19NVUxUSV9NT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFQ1MgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVDRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAorIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAorCisjCisjIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKKyMKK0NPTkZJR19JREVfR0VORVJJQz15CitDT05GSUdfSURFX1NIPXkKKyMgQ09ORklHX0lERV9BUk0gaXMgbm90IHNldAorIyBDT05GSUdfSURFX0NISVBTRVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERURNQV9BVVRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgT2xkIENELVJPTSBkcml2ZXJzIChub3QgU0NTSSwgbm90IElERSkKKyMKKyMgQ09ORklHX0NEX05PX0lERVNDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFUklBTF9TSF9TQ0kgaXMgbm90IHNldAorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKworIworIyBQQ01DSUEgY2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1NZTkNMSU5LX0NTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBUkRNQU5fNDAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DQVJETUFOXzQwNDAgaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIERhbGxhcydzIDEtd2lyZSBidXMKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMKK0NPTkZJR19IV01PTj15CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBDYXBhYmlsaXRpZXMgUG9ydCBkcml2ZXJzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCitDT05GSUdfRkI9eQorQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CitDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKK0NPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKKyMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkJfRVBTT04xMzU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1MxRDEzWFhYIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9ISVQ9eQorIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19NREFfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CisjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX1JPVEFUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19GT05UUz15CisjIENPTkZJR19GT05UXzh4OCBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UXzh4MTYgaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF82eDExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRfN3gxNCBpcyBub3Qgc2V0CitDT05GSUdfRk9OVF9QRUFSTF84eDg9eQorIyBDT05GSUdfRk9OVF9BQ09STl84eDggaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF9NSU5JXzR4NiBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX1NVTjh4MTYgaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF9TVU4xMngyMiBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UXzEweDE4IGlzIG5vdCBzZXQKKworIworIyBMb2dvIGNvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0xPR08gaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworQ09ORklHX1NPVU5EPXkKKworIworIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyMKKyMgQ09ORklHX1NORCBpcyBub3Qgc2V0CisKKyMKKyMgT3BlbiBTb3VuZCBTeXN0ZW0KKyMKK0NPTkZJR19TT1VORF9QUklNRT15CisjIENPTkZJR19PQlNPTEVURV9PU1NfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX01TTkRDTEFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX01TTkRQSU4gaXMgbm90IHNldAorQ09ORklHX1NPVU5EX1NIX0RBQ19BVURJTz15CitDT05GSUdfU09VTkRfU0hfREFDX0FVRElPX0NIQU5ORUw9MQorCisjCisjIFVTQiBzdXBwb3J0CisjCisjIENPTkZJR19VU0JfQVJDSF9IQVNfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEluZmluaUJhbmQgc3VwcG9ydAorIworIyBDT05GSUdfSU5GSU5JQkFORCBpcyBub3Qgc2V0CisKKyMKKyMgU04gRGV2aWNlcworIworCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pCRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworQ09ORklHX0ZBVF9GUz15CisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisjIENPTkZJR19SRUxBWUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19GUkFNRV9QT0lOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAorIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtYXBpLmMgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1hcGkuYwppbmRleCA5NmUzMDM2Li40N2MzZTgzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1hcGkuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1hcGkuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBTdXBlckgtc3BlY2lmaWMgRE1BIG1hbmFnZW1lbnQgQVBJCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBQYXVsIE11bmR0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUgIFBhdWwgTXVuZHQKICAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAKIERFRklORV9TUElOTE9DSyhkbWFfc3Bpbl9sb2NrKTsKQEAgLTU1LDE2ICs1NiwxNCBAQAogCiBzdHJ1Y3QgZG1hX2luZm8gKmdldF9kbWFfaW5mbyh1bnNpZ25lZCBpbnQgY2hhbikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICp0bXA7CisJc3RydWN0IGRtYV9pbmZvICppbmZvOwogCXVuc2lnbmVkIGludCB0b3RhbCA9IDA7CiAKIAkvKgogCSAqIExvb2sgZm9yIGVhY2ggRE1BQydzIHJhbmdlIHRvIGRldGVybWluZSB3aG8gdGhlIG93bmVyIG9mCiAJICogdGhlIGNoYW5uZWwgaXMuCiAJICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmcmVnaXN0ZXJlZF9kbWFjX2xpc3QpIHsKLQkJc3RydWN0IGRtYV9pbmZvICppbmZvID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBkbWFfaW5mbywgbGlzdCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGluZm8sICZyZWdpc3RlcmVkX2RtYWNfbGlzdCwgbGlzdCkgewogCQl0b3RhbCArPSBpbmZvLT5ucl9jaGFubmVsczsKIAkJaWYgKGNoYW4gPiB0b3RhbCkKIAkJCWNvbnRpbnVlOwpAQCAtNzUsNiArNzQsMjAgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCBnZXRfbnJfY2hhbm5lbHModm9pZCkKK3sKKwlzdHJ1Y3QgZG1hX2luZm8gKmluZm87CisJdW5zaWduZWQgaW50IG5yID0gMDsKKworCWlmICh1bmxpa2VseShsaXN0X2VtcHR5KCZyZWdpc3RlcmVkX2RtYWNfbGlzdCkpKQorCQlyZXR1cm4gbnI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGluZm8sICZyZWdpc3RlcmVkX2RtYWNfbGlzdCwgbGlzdCkKKwkJbnIgKz0gaW5mby0+bnJfY2hhbm5lbHM7CisKKwlyZXR1cm4gbnI7Cit9CisKIHN0cnVjdCBkbWFfY2hhbm5lbCAqZ2V0X2RtYV9jaGFubmVsKHVuc2lnbmVkIGludCBjaGFuKQogewogCXN0cnVjdCBkbWFfaW5mbyAqaW5mbyA9IGdldF9kbWFfaW5mbyhjaGFuKTsKQEAgLTE3Myw3ICsxODYsNyBAQAogc3RhdGljIGludCBkbWFfcmVhZF9wcm9jKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCiAJCQkgaW50IGxlbiwgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqdG1wOworCXN0cnVjdCBkbWFfaW5mbyAqaW5mbzsKIAljaGFyICpwID0gYnVmOwogCiAJaWYgKGxpc3RfZW1wdHkoJnJlZ2lzdGVyZWRfZG1hY19saXN0KSkKQEAgLTE4Miw4ICsxOTUsNyBAQAogCS8qCiAJICogSXRlcmF0ZSBvdmVyIGVhY2ggcmVnaXN0ZXJlZCBETUFDCiAJICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmcmVnaXN0ZXJlZF9kbWFjX2xpc3QpIHsKLQkJc3RydWN0IGRtYV9pbmZvICppbmZvID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBkbWFfaW5mbywgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbmZvLCAmcmVnaXN0ZXJlZF9kbWFjX2xpc3QsIGxpc3QpIHsKIAkJaW50IGk7CiAKIAkJLyoKQEAgLTIwNSw5ICsyMTcsOSBAQAogI2VuZGlmCiAKIAotaW50IF9faW5pdCByZWdpc3Rlcl9kbWFjKHN0cnVjdCBkbWFfaW5mbyAqaW5mbykKK2ludCByZWdpc3Rlcl9kbWFjKHN0cnVjdCBkbWFfaW5mbyAqaW5mbykKIHsKLQlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgdG90YWxfY2hhbm5lbHMsIGk7CiAKIAlJTklUX0xJU1RfSEVBRCgmaW5mby0+bGlzdCk7CiAKQEAgLTIxNyw2ICsyMjksMTEgQEAKIAogCUJVR19PTigoaW5mby0+ZmxhZ3MgJiBETUFDX0NIQU5ORUxTX0NPTkZJR1VSRUQpICYmICFpbmZvLT5jaGFubmVscyk7CiAKKwlpbmZvLT5wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgoY2hhciAqKWluZm8tPm5hbWUsIC0xLAorCQkJCQkJICAgICBOVUxMLCAwKTsKKwlpZiAoSVNfRVJSKGluZm8tPnBkZXYpKQorCQlyZXR1cm4gUFRSX0VSUihpbmZvLT5wZGV2KTsKKwogCS8qCiAJICogRG9uJ3QgdG91Y2ggcHJlLWNvbmZpZ3VyZWQgY2hhbm5lbHMKIAkgKi8KQEAgLTIzMiwxMCArMjQ5LDEyIEBACiAJCW1lbXNldChpbmZvLT5jaGFubmVscywgMCwgc2l6ZSk7CiAJfQogCisJdG90YWxfY2hhbm5lbHMgPSBnZXRfbnJfY2hhbm5lbHMoKTsKIAlmb3IgKGkgPSAwOyBpIDwgaW5mby0+bnJfY2hhbm5lbHM7IGkrKykgewogCQlzdHJ1Y3QgZG1hX2NoYW5uZWwgKmNoYW4gPSBpbmZvLT5jaGFubmVscyArIGk7CiAKIAkJY2hhbi0+Y2hhbiA9IGk7CisJCWNoYW4tPnZjaGFuID0gaSArIHRvdGFsX2NoYW5uZWxzOwogCiAJCW1lbWNweShjaGFuLT5kZXZfaWQsICJVbnVzZWQiLCA3KTsKIApAQCAtMjQ1LDkgKzI2NCw3IEBACiAJCWluaXRfTVVURVgoJmNoYW4tPnNlbSk7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNoYW4tPndhaXRfcXVldWUpOwogCi0jaWZkZWYgQ09ORklHX1NZU0ZTCi0JCWRtYV9jcmVhdGVfc3lzZnNfZmlsZXMoY2hhbik7Ci0jZW5kaWYKKwkJZG1hX2NyZWF0ZV9zeXNmc19maWxlcyhjaGFuLCBpbmZvKTsKIAl9CiAKIAlsaXN0X2FkZCgmaW5mby0+bGlzdCwgJnJlZ2lzdGVyZWRfZG1hY19saXN0KTsKQEAgLTI1NSwxMiArMjcyLDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgX19leGl0IHVucmVnaXN0ZXJfZG1hYyhzdHJ1Y3QgZG1hX2luZm8gKmluZm8pCit2b2lkIHVucmVnaXN0ZXJfZG1hYyhzdHJ1Y3QgZG1hX2luZm8gKmluZm8pCiB7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+bnJfY2hhbm5lbHM7IGkrKykKKwkJZG1hX3JlbW92ZV9zeXNmc19maWxlcyhpbmZvLT5jaGFubmVscyArIGksIGluZm8pOworCiAJaWYgKCEoaW5mby0+ZmxhZ3MgJiBETUFDX0NIQU5ORUxTX0NPTkZJR1VSRUQpKQogCQlrZnJlZShpbmZvLT5jaGFubmVscyk7CiAKIAlsaXN0X2RlbCgmaW5mby0+bGlzdCk7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoaW5mby0+cGRldik7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGRtYV9hcGlfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtZzIuYyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLWcyLmMKaW5kZXggMjMxZTNmNi4uNWFmYWI2ZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtZzIuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1nMi5jCkBAIC0xNDAsNyArMTQwLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZG1hX2luZm8gZzJfZG1hX2luZm8gPSB7Ci0JLm5hbWUJCT0gIkcyIERNQSIsCisJLm5hbWUJCT0gImcyX2RtYWMiLAogCS5ucl9jaGFubmVscwk9IDQsCiAJLm9wcwkJPSAmZzJfZG1hX29wcywKIAkuZmxhZ3MJCT0gRE1BQ19DSEFOTkVMU19URUlfQ0FQQUJMRSwKQEAgLTE2MCw2ICsxNjAsNyBAQAogc3RhdGljIHZvaWQgX19leGl0IGcyX2RtYV9leGl0KHZvaWQpCiB7CiAJZnJlZV9pcnEoSFdfRVZFTlRfRzJfRE1BLCAwKTsKKwl1bnJlZ2lzdGVyX2RtYWMoJmcyX2RtYV9pbmZvKTsKIH0KIAogc3Vic3lzX2luaXRjYWxsKGcyX2RtYV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLWlzYS5jIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtaXNhLmMKaW5kZXggMWM5YmM0NS4uMDVhNzRmZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtaXNhLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtaXNhLmMKQEAgLTI1LDE0ICsyNSwxNCBAQAogICogc3VjaCwgdGhpcyBjb2RlIGlzIG1lYW50IGZvciBvbmx5IHRoZSBzaW1wbGVzdCBvZiB0YXNrcyAoYW5kIHNob3VsZG4ndCBiZQogICogdXNlZCBpbiBhbnkgbmV3IGRyaXZlcnMgYXQgYWxsKS4KICAqCi0gKiBJdCBzaG91bGQgYWxzbyBiZSBub3RlZCB0aGF0IHZhcmlvdXMgZnVuY3Rpb25zIGhlcmUgYXJlIGxhYmVsbGVkIGFzCi0gKiBiZWluZyBkZXByZWNhdGVkLiBUaGlzIGlzIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSBvcHMtPnhmZXIoKSBtZXRob2QgaXMKLSAqIHRoZSBwcmVmZXJyZWQgd2F5IG9mIGRvaW5nIHRoaW5ncyAoYXMgd2VsbCBhcyBqdXN0IGdyYWJiaW5nIHRoZSBzcGlubG9jawotICogZGlyZWN0bHkpLiBBcyBzdWNoLCBhbnkgdXNlcnMgb2YgdGhpcyBpbnRlcmZhY2Ugd2lsbCBiZSB3YXJuZWQgcmF0aGVyCi0gKiBsb3VkbHkuCisgKiBOT1RFOiBvcHMtPnhmZXIoKSBpcyB0aGUgcHJlZmVycmVkIHdheSBvZiBkb2luZyB0aGluZ3MuIEhvd2V2ZXIsIHRoZXJlCisgKiBhcmUgc29tZSB1c2VycyBvZiB0aGUgSVNBIERNQSBBUEkgdGhhdCBleGlzdCBpbiBjb21tb24gY29kZSB0aGF0IHdlCisgKiBkb24ndCBuZWNlc3NhcmlseSB3YW50IHRvIGdvIG91dCBvZiBvdXIgd2F5IHRvIGJyZWFrLCBzbyB3ZSBzdGlsbAorICogYWxsb3cgZm9yIHNvbWUgY29tcGF0YWJpbGl0eSBhdCB0aGF0IGxldmVsLiBBbnkgbmV3IGNvZGUgaXMgc3Ryb25nbHkKKyAqIGFkdmlzZWQgdG8gcnVuIGZhciBhd2F5IGZyb20gdGhlIElTQSBETUEgQVBJIGFuZCB1c2UgdGhlIFNIIERNQSBBUEkKKyAqIGRpcmVjdGx5LgogICovCi0KLXVuc2lnbmVkIGxvbmcgX19kZXByZWNhdGVkIGNsYWltX2RtYV9sb2NrKHZvaWQpCit1bnNpZ25lZCBsb25nIGNsYWltX2RtYV9sb2NrKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtNDIsMTkgKzQyLDE5IEBACiB9CiBFWFBPUlRfU1lNQk9MKGNsYWltX2RtYV9sb2NrKTsKIAotdm9pZCBfX2RlcHJlY2F0ZWQgcmVsZWFzZV9kbWFfbG9jayh1bnNpZ25lZCBsb25nIGZsYWdzKQordm9pZCByZWxlYXNlX2RtYV9sb2NrKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hX3NwaW5fbG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTChyZWxlYXNlX2RtYV9sb2NrKTsKIAotdm9pZCBfX2RlcHJlY2F0ZWQgZGlzYWJsZV9kbWEodW5zaWduZWQgaW50IGNoYW4pCit2b2lkIGRpc2FibGVfZG1hKHVuc2lnbmVkIGludCBjaGFuKQogewogCS8qIE5vdGhpbmcgKi8KIH0KIEVYUE9SVF9TWU1CT0woZGlzYWJsZV9kbWEpOwogCi12b2lkIF9fZGVwcmVjYXRlZCBlbmFibGVfZG1hKHVuc2lnbmVkIGludCBjaGFuKQordm9pZCBlbmFibGVfZG1hKHVuc2lnbmVkIGludCBjaGFuKQogewogCXN0cnVjdCBkbWFfaW5mbyAqaW5mbyA9IGdldF9kbWFfaW5mbyhjaGFuKTsKIAlzdHJ1Y3QgZG1hX2NoYW5uZWwgKmNoYW5uZWwgPSAmaW5mby0+Y2hhbm5lbHNbY2hhbl07CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1wdnIyLmMgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1wdnIyLmMKaW5kZXggMmUxZDU4Zi4uZGY2MDQ5NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtcHZyMi5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXB2cjIuYwpAQCAtODAsNyArODAsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBkbWFfaW5mbyBwdnIyX2RtYV9pbmZvID0gewotCS5uYW1lCQk9ICJQb3dlclZSIDIgRE1BIiwKKwkubmFtZQkJPSAicHZyMl9kbWFjIiwKIAkubnJfY2hhbm5lbHMJPSAxLAogCS5vcHMJCT0gJnB2cjJfZG1hX29wcywKIAkuZmxhZ3MJCT0gRE1BQ19DSEFOTkVMU19URUlfQ0FQQUJMRSwKQEAgLTk4LDYgKzk4LDcgQEAKIHsKIAlmcmVlX2RtYShQVlIyX0NBU0NBREVfQ0hBTik7CiAJZnJlZV9pcnEoSFdfRVZFTlRfUFZSMl9ETUEsIDApOworCXVucmVnaXN0ZXJfZG1hYygmcHZyMl9kbWFfaW5mbyk7CiB9CiAKIHN1YnN5c19pbml0Y2FsbChwdnIyX2RtYV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXNoLmMgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1zaC5jCmluZGV4IDMxZGFjZDQuLmNjYTI2YzQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXNoLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtc2guYwpAQCAtNSw2ICs1LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAgVGFrYXNoaSBZT1NISUkKICAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCBQYXVsIE11bmR0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgQW5kcml5IFNrdWx5c2gKICAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQpAQCAtMTYsNTEgKzE3LDI4IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL2RyZWFtY2FzdC9kbWEuaD4KICNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlICJkbWEtc2guaCIKIAotLyoKLSAqIFRoZSBTdXBlckggRE1BQyBzdXBwb3J0cyBhIG51bWJlciBvZiB0cmFuc21pdCBzaXplcywgd2UgbGlzdCB0aGVtIGhlcmUsCi0gKiB3aXRoIHRoZWlyIHJlc3BlY3RpdmUgdmFsdWVzIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBDSENSIHJlZ2lzdGVycy4KLSAqCi0gKiBEZWZhdWx0cyB0byBhIDY0LWJpdCB0cmFuc2ZlciBzaXplLgotICovCi1lbnVtIHsKLQlYTUlUX1NaXzY0QklULAotCVhNSVRfU1pfOEJJVCwKLQlYTUlUX1NaXzE2QklULAotCVhNSVRfU1pfMzJCSVQsCi0JWE1JVF9TWl8yNTZCSVQsCi19OwotCi0vKgotICogVGhlIERNQSBjb3VudCBpcyBkZWZpbmVkIGFzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdHNfc2hpZnRbXSA9IHsKLQlbWE1JVF9TWl82NEJJVF0JCT0gMywKLQlbWE1JVF9TWl84QklUXQkJPSAwLAotCVtYTUlUX1NaXzE2QklUXQkJPSAxLAotCVtYTUlUX1NaXzMyQklUXQkJPSAyLAotCVtYTUlUX1NaXzI1NkJJVF0JPSA1LAotfTsKLQogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X2RtdGVfaXJxKHVuc2lnbmVkIGludCBjaGFuKQogewotCXVuc2lnbmVkIGludCBpcnE7CisJdW5zaWduZWQgaW50IGlycSA9IDA7CiAKIAkvKgogCSAqIE5vcm1hbGx5IHdlIGNvdWxkIGp1c3QgZG8gRE1URTBfSVJRICsgY2hhbiBvdXRyaWdodCwgdGhvdWdoIGluIHRoZQogCSAqIGNhc2Ugb2YgdGhlIDc3NTFSLCB0aGUgRE1URSBJUlFzIGZvciBjaGFubmVscyA+IDQgc3RhcnQgcmlnaHQgYWJvdmUKIAkgKiB0aGUgU0NJRgogCSAqLwotCiAJaWYgKGNoYW4gPCA0KSB7CiAJCWlycSA9IERNVEUwX0lSUSArIGNoYW47CiAJfSBlbHNlIHsKKyNpZmRlZiBETVRFNF9JUlEKIAkJaXJxID0gRE1URTRfSVJRICsgY2hhbiAtIDQ7CisjZW5kaWYKIAl9CiAKIAlyZXR1cm4gaXJxOwpAQCAtNzgsOSArNTYsNyBAQAogewogCXUzMiBjaGNyID0gY3RybF9pbmwoQ0hDUltjaGFuLT5jaGFuXSk7CiAKLQljaGNyID4+PSA0OwotCi0JcmV0dXJuIHRzX3NoaWZ0W2NoY3IgJiAweDAwMDddOworCXJldHVybiB0c19zaGlmdFsoY2hjciAmIENIQ1JfVFNfTUFTSyk+PkNIQ1JfVFNfU0hJRlRdOwogfQogCiAvKgpAQCAtMTA5LDggKzg1LDEzIEBACiAKIHN0YXRpYyBpbnQgc2hfZG1hY19yZXF1ZXN0X2RtYShzdHJ1Y3QgZG1hX2NoYW5uZWwgKmNoYW4pCiB7CisJY2hhciBuYW1lWzMyXTsKKworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIkRNQUMgVHJhbnNmZXIgRW5kIChDaGFubmVsICVkKSIsCisJCSBjaGFuLT5jaGFuKTsKKwogCXJldHVybiByZXF1ZXN0X2lycShnZXRfZG10ZV9pcnEoY2hhbi0+Y2hhbiksIGRtYV90ZWksCi0JCQkgICBTQV9JTlRFUlJVUFQsICJETUFDIFRyYW5zZmVyIEVuZCIsIGNoYW4pOworCQkJICAgU0FfSU5URVJSVVBULCBuYW1lLCBjaGFuKTsKIH0KIAogc3RhdGljIHZvaWQgc2hfZG1hY19mcmVlX2RtYShzdHJ1Y3QgZG1hX2NoYW5uZWwgKmNoYW4pCkBAIC0xMTgsMTAgKzk5LDE4IEBACiAJZnJlZV9pcnEoZ2V0X2RtdGVfaXJxKGNoYW4tPmNoYW4pLCBjaGFuKTsKIH0KIAotc3RhdGljIHZvaWQgc2hfZG1hY19jb25maWd1cmVfY2hhbm5lbChzdHJ1Y3QgZG1hX2NoYW5uZWwgKmNoYW4sIHVuc2lnbmVkIGxvbmcgY2hjcikKK3N0YXRpYyB2b2lkCitzaF9kbWFjX2NvbmZpZ3VyZV9jaGFubmVsKHN0cnVjdCBkbWFfY2hhbm5lbCAqY2hhbiwgdW5zaWduZWQgbG9uZyBjaGNyKQogewogCWlmICghY2hjcikKLQkJY2hjciA9IFJTX0RVQUw7CisJCWNoY3IgPSBSU19EVUFMIHwgQ0hDUl9JRTsKKworCWlmIChjaGNyICYgQ0hDUl9JRSkgeworCQljaGNyICY9IH5DSENSX0lFOworCQljaGFuLT5mbGFncyB8PSBETUFfVEVJX0NBUEFCTEU7CisJfSBlbHNlIHsKKwkJY2hhbi0+ZmxhZ3MgJj0gfkRNQV9URUlfQ0FQQUJMRTsKKwl9CiAKIAljdHJsX291dGwoY2hjciwgQ0hDUltjaGFuLT5jaGFuXSk7CiAKQEAgLTEzMCwyMiArMTE5LDMyIEBACiAKIHN0YXRpYyB2b2lkIHNoX2RtYWNfZW5hYmxlX2RtYShzdHJ1Y3QgZG1hX2NoYW5uZWwgKmNoYW4pCiB7Ci0JaW50IGlycSA9IGdldF9kbXRlX2lycShjaGFuLT5jaGFuKTsKKwlpbnQgaXJxOwogCXUzMiBjaGNyOwogCiAJY2hjciA9IGN0cmxfaW5sKENIQ1JbY2hhbi0+Y2hhbl0pOwotCWNoY3IgfD0gQ0hDUl9ERSB8IENIQ1JfSUU7CisJY2hjciB8PSBDSENSX0RFOworCisJaWYgKGNoYW4tPmZsYWdzICYgRE1BX1RFSV9DQVBBQkxFKQorCQljaGNyIHw9IENIQ1JfSUU7CisKIAljdHJsX291dGwoY2hjciwgQ0hDUltjaGFuLT5jaGFuXSk7CiAKLQllbmFibGVfaXJxKGlycSk7CisJaWYgKGNoYW4tPmZsYWdzICYgRE1BX1RFSV9DQVBBQkxFKSB7CisJCWlycSA9IGdldF9kbXRlX2lycShjaGFuLT5jaGFuKTsKKwkJZW5hYmxlX2lycShpcnEpOworCX0KIH0KIAogc3RhdGljIHZvaWQgc2hfZG1hY19kaXNhYmxlX2RtYShzdHJ1Y3QgZG1hX2NoYW5uZWwgKmNoYW4pCiB7Ci0JaW50IGlycSA9IGdldF9kbXRlX2lycShjaGFuLT5jaGFuKTsKKwlpbnQgaXJxOwogCXUzMiBjaGNyOwogCi0JZGlzYWJsZV9pcnEoaXJxKTsKKwlpZiAoY2hhbi0+ZmxhZ3MgJiBETUFfVEVJX0NBUEFCTEUpIHsKKwkJaXJxID0gZ2V0X2RtdGVfaXJxKGNoYW4tPmNoYW4pOworCQlkaXNhYmxlX2lycShpcnEpOworCX0KIAogCWNoY3IgPSBjdHJsX2lubChDSENSW2NoYW4tPmNoYW5dKTsKIAljaGNyICY9IH4oQ0hDUl9ERSB8IENIQ1JfVEUgfCBDSENSX0lFKTsKQEAgLTE1OCw3ICsxNTcsNyBAQAogCSAqIElmIHdlIGhhdmVuJ3QgcHJlLWNvbmZpZ3VyZWQgdGhlIGNoYW5uZWwgd2l0aCBzcGVjaWFsIGZsYWdzLCB1c2UKIAkgKiB0aGUgZGVmYXVsdHMuCiAJICovCi0JaWYgKCEoY2hhbi0+ZmxhZ3MgJiBETUFfQ09ORklHVVJFRCkpCisJaWYgKHVubGlrZWx5KCEoY2hhbi0+ZmxhZ3MgJiBETUFfQ09ORklHVVJFRCkpKQogCQlzaF9kbWFjX2NvbmZpZ3VyZV9jaGFubmVsKGNoYW4sIDApOwogCiAJc2hfZG1hY19kaXNhYmxlX2RtYShjaGFuKTsKQEAgLTE3OCw5ICsxNzcsMTEgQEAKIAkgKiBjYXNjYWRpbmcgdG8gdGhlIFBWUjIgRE1BQy4gSW4gdGhpcyBjYXNlLCB3ZSBzdGlsbCBuZWVkIHRvIHdyaXRlCiAJICogU0FSIGFuZCBEQVIsIHJlZ2FyZGxlc3Mgb2YgdmFsdWUsIGluIG9yZGVyIGZvciBjYXNjYWRpbmcgdG8gd29yay4KIAkgKi8KLQlpZiAoY2hhbi0+c2FyIHx8IChtYWNoX2lzX2RyZWFtY2FzdCgpICYmIGNoYW4tPmNoYW4gPT0gMikpCisJaWYgKGNoYW4tPnNhciB8fCAobWFjaF9pc19kcmVhbWNhc3QoKSAmJgorCQkJICBjaGFuLT5jaGFuID09IFBWUjJfQ0FTQ0FERV9DSEFOKSkKIAkJY3RybF9vdXRsKGNoYW4tPnNhciwgU0FSW2NoYW4tPmNoYW5dKTsKLQlpZiAoY2hhbi0+ZGFyIHx8IChtYWNoX2lzX2RyZWFtY2FzdCgpICYmIGNoYW4tPmNoYW4gPT0gMikpCisJaWYgKGNoYW4tPmRhciB8fCAobWFjaF9pc19kcmVhbWNhc3QoKSAmJgorCQkJICBjaGFuLT5jaGFuID09IFBWUjJfQ0FTQ0FERV9DSEFOKSkKIAkJY3RybF9vdXRsKGNoYW4tPmRhciwgREFSW2NoYW4tPmNoYW5dKTsKIAogCWN0cmxfb3V0bChjaGFuLT5jb3VudCA+PiBjYWxjX3htaXRfc2hpZnQoY2hhbiksIERNQVRDUltjaGFuLT5jaGFuXSk7CkBAIC0xOTgsMTcgKzE5OSwzOCBAQAogCXJldHVybiBjdHJsX2lubChETUFUQ1JbY2hhbi0+Y2hhbl0pIDw8IGNhbGNfeG1pdF9zaGlmdChjaGFuKTsKIH0KIAorI2lmZGVmIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAKKyNkZWZpbmUgZG1hb3JfcmVhZF9yZWcoKQljdHJsX2ludyhETUFPUikKKyNkZWZpbmUgZG1hb3Jfd3JpdGVfcmVnKGRhdGEpCWN0cmxfb3V0dyhkYXRhLCBETUFPUikKKyNlbHNlCisjZGVmaW5lIGRtYW9yX3JlYWRfcmVnKCkJY3RybF9pbmwoRE1BT1IpCisjZGVmaW5lIGRtYW9yX3dyaXRlX3JlZyhkYXRhKQljdHJsX291dGwoZGF0YSwgRE1BT1IpCisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgZG1hb3JfcmVzZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGRtYW9yID0gZG1hb3JfcmVhZF9yZWcoKTsKKworCS8qIFRyeSB0byBjbGVhciB0aGUgZXJyb3IgZmxhZ3MgZmlyc3QsIGluY2FzZSB0aGV5IGFyZSBzZXQgKi8KKwlkbWFvciAmPSB+KERNQU9SX05NSUYgfCBETUFPUl9BRSk7CisJZG1hb3Jfd3JpdGVfcmVnKGRtYW9yKTsKKworCWRtYW9yIHw9IERNQU9SX0lOSVQ7CisJZG1hb3Jfd3JpdGVfcmVnKGRtYW9yKTsKKworCS8qIFNlZSBpZiB3ZSBnb3QgYW4gZXJyb3IgYWdhaW4gKi8KKwlpZiAoKGRtYW9yX3JlYWRfcmVnKCkgJiAoRE1BT1JfQUUgfCBETUFPUl9OTUlGKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWEtc2g6IENhbid0IGluaXRpYWxpemUgRE1BT1IuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KQogc3RhdGljIGlycXJldHVybl90IGRtYV9lcnIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQl1bnNpZ25lZCBsb25nIGRtYW9yID0gY3RybF9pbmwoRE1BT1IpOwotCi0JcHJpbnRrKCJETUFFOiBETUFPUj0lbHhcbiIsIGRtYW9yKTsKLQotCWN0cmxfb3V0bChjdHJsX2lubChETUFPUikmfkRNQU9SX05NSUYsIERNQU9SKTsKLQljdHJsX291dGwoY3RybF9pbmwoRE1BT1IpJn5ETUFPUl9BRSwgRE1BT1IpOwotCWN0cmxfb3V0bChjdHJsX2lubChETUFPUil8RE1BT1JfRE1FLCBETUFPUik7Ci0KKwlkbWFvcl9yZXNldCgpOwogCWRpc2FibGVfaXJxKGlycSk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC0yMjQsOCArMjQ2LDggQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZG1hX2luZm8gc2hfZG1hY19pbmZvID0gewotCS5uYW1lCQk9ICJTdXBlckggRE1BQyIsCi0JLm5yX2NoYW5uZWxzCT0gNCwKKwkubmFtZQkJPSAic2hfZG1hYyIsCisJLm5yX2NoYW5uZWxzCT0gQ09ORklHX05SX09OQ0hJUF9ETUFfQ0hBTk5FTFMsCiAJLm9wcwkJPSAmc2hfZG1hY19vcHMsCiAJLmZsYWdzCQk9IERNQUNfQ0hBTk5FTFNfVEVJX0NBUEFCTEUsCiB9OwpAQCAtMjQ4LDcgKzI3MCwxMyBAQAogCQltYWtlX2lwcl9pcnEoaXJxLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkpOwogCX0KIAotCWN0cmxfb3V0bCgweDgwMDAgfCBETUFPUl9ETUUsIERNQU9SKTsKKwkvKgorCSAqIEluaXRpYWxpemUgRE1BT1IsIGFuZCBjbGVhbiB1cCBhbnkgZXJyb3IgZmxhZ3MgdGhhdCBtYXkgaGF2ZQorCSAqIGJlZW4gc2V0LgorCSAqLworCWkgPSBkbWFvcl9yZXNldCgpOworCWlmIChpIDwgMCkKKwkJcmV0dXJuIGk7CiAKIAlyZXR1cm4gcmVnaXN0ZXJfZG1hYyhpbmZvKTsKIH0KQEAgLTI1OCwxMCArMjg2LDEyIEBACiAjaWZkZWYgQ09ORklHX0NQVV9TSDQKIAlmcmVlX2lycShETUFFX0lSUSwgMCk7CiAjZW5kaWYKKwl1bnJlZ2lzdGVyX2RtYWMoJnNoX2RtYWNfaW5mbyk7CiB9CiAKIHN1YnN5c19pbml0Y2FsbChzaF9kbWFjX2luaXQpOwogbW9kdWxlX2V4aXQoc2hfZG1hY19leGl0KTsKIAorTU9EVUxFX0FVVEhPUigiVGFrYXNoaSBZT1NISUksIFBhdWwgTXVuZHQsIEFuZHJpeSBTa3VseXNoIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN1cGVySCBPbi1DaGlwIERNQUMgU3VwcG9ydCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1zaC5oIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtc2guaAppbmRleCBkZDlkNTQ3Li4wZjU5MWZiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1zaC5oCisrKyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXNoLmgKQEAgLTExLDYgKzExLDggQEAKICNpZm5kZWYgX19ETUFfU0hfSAogI2RlZmluZSBfX0RNQV9TSF9ICiAKKyNpbmNsdWRlIDxhc20vY3B1L2RtYS5oPgorCiAvKiBEZWZpbml0aW9ucyBmb3IgdGhlIFN1cGVySCBETUFDICovCiAjZGVmaW5lIFJFUV9MCTB4MDAwMDAwMDAKICNkZWZpbmUgUkVRX0UJMHgwMDA4MDAwMApAQCAtMjYsMjcgKzI4LDQ3IEBACiAjZGVmaW5lIFNNX0RFQwkweDAwMDAyMDAwCiAjZGVmaW5lIFJTX0lOCTB4MDAwMDAyMDAKICNkZWZpbmUgUlNfT1VUCTB4MDAwMDAzMDAKLSNkZWZpbmUgVE1fQlVSU1QgMHgwMDAwMDgwCi0jZGVmaW5lIFRTXzgJMHgwMDAwMDAxMAotI2RlZmluZSBUU18xNgkweDAwMDAwMDIwCi0jZGVmaW5lIFRTXzMyCTB4MDAwMDAwMzAKLSNkZWZpbmUgVFNfNjQJMHgwMDAwMDAwMAogI2RlZmluZSBUU19CTEsJMHgwMDAwMDA0MAogI2RlZmluZSBDSENSX0RFIDB4MDAwMDAwMDEKICNkZWZpbmUgQ0hDUl9URSAweDAwMDAwMDAyCiAjZGVmaW5lIENIQ1JfSUUgMHgwMDAwMDAwNAogCi0vKiBEZWZpbmUgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgZHVhbCBhZGRyZXNzIG1lbW9yeS1tZW1vcnkgdHJhbnNmZXIuCi0gKiBUaGUgMHg0MDAgdmFsdWUgcmVwcmVzZW50cyBhdXRvLXJlcXVlc3QsIGV4dGVybmFsLT5leHRlcm5hbC4KLSAqLwotI2RlZmluZSBSU19EVUFMCShETV9JTkMgfCBTTV9JTkMgfCAweDQwMCB8IFRTXzMyKQotCi0jZGVmaW5lIERNQU9SX0NPRAkweDAwMDAwMDA4CisvKiBETUFPUiBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBETUFPUl9BRQkweDAwMDAwMDA0CiAjZGVmaW5lIERNQU9SX05NSUYJMHgwMDAwMDAwMgogI2RlZmluZSBETUFPUl9ETUUJMHgwMDAwMDAwMQogCisvKgorICogRGVmaW5lIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIGR1YWwgYWRkcmVzcyBtZW1vcnktbWVtb3J5IHRyYW5zZmVyLgorICogVGhlIDB4NDAwIHZhbHVlIHJlcHJlc2VudHMgYXV0by1yZXF1ZXN0LCBleHRlcm5hbC0+ZXh0ZXJuYWwuCisgKi8KKyNkZWZpbmUgUlNfRFVBTAkoRE1fSU5DIHwgU01fSU5DIHwgMHg0MDAgfCBUU18zMikKKwogI2RlZmluZSBNQVhfRE1BQ19DSEFOTkVMUwkoQ09ORklHX05SX09OQ0hJUF9ETUFfQ0hBTk5FTFMpCiAKKy8qCisgKiBTdWJ0eXBlcyB0aGF0IGhhdmUgZmV3ZXIgY2hhbm5lbHMgdGhhbiB0aGlzIHNpbXBseSBuZWVkIHRvIGNoYW5nZQorICogQ09ORklHX05SX09OQ0hJUF9ETUFfQ0hBTk5FTFMuIExpa2V3aXNlLCBzdWJ0eXBlcyB3aXRoIGEgbGFyZ2VyIG51bWJlcgorICogb2YgY2hhbm5lbHMgc2hvdWxkIGV4cGFuZCBvbiB0aGlzLgorICoKKyAqIEZvciBtb3N0IHN1YnR5cGVzIHdlIGNhbiBlYXNpbHkgZmlndXJlIHRoZXNlIHZhbHVlcyBvdXQgd2l0aCBzb21lCisgKiBiYXNpYyBjYWxjdWxhdGlvbiwgdW5mb3J0dW5hdGVseSBvbiBvdGhlciBzdWJ0eXBlcyB0aGVzZSBhcmUgbW9yZQorICogc2NhdHRlcmVkLCBzbyB3ZSBqdXN0IGxlYXZlIGl0IHVucm9sbGVkIGZvciBzaW1wbGljaXR5LgorICovCisjZGVmaW5lIFNBUgkoKHVuc2lnbmVkIGxvbmdbXSl7U0hfRE1BQ19CQVNFICsgMHgwMCwgU0hfRE1BQ19CQVNFICsgMHgxMCwgXAorCQkJCSAgIFNIX0RNQUNfQkFTRSArIDB4MjAsIFNIX0RNQUNfQkFTRSArIDB4MzAsIFwKKwkJCQkgICBTSF9ETUFDX0JBU0UgKyAweDUwLCBTSF9ETUFDX0JBU0UgKyAweDYwfSkKKyNkZWZpbmUgREFSCSgodW5zaWduZWQgbG9uZ1tdKXtTSF9ETUFDX0JBU0UgKyAweDA0LCBTSF9ETUFDX0JBU0UgKyAweDE0LCBcCisJCQkJICAgU0hfRE1BQ19CQVNFICsgMHgyNCwgU0hfRE1BQ19CQVNFICsgMHgzNCwgXAorCQkJCSAgIFNIX0RNQUNfQkFTRSArIDB4NTQsIFNIX0RNQUNfQkFTRSArIDB4NjR9KQorI2RlZmluZSBETUFUQ1IJKCh1bnNpZ25lZCBsb25nW10pe1NIX0RNQUNfQkFTRSArIDB4MDgsIFNIX0RNQUNfQkFTRSArIDB4MTgsIFwKKwkJCQkgICBTSF9ETUFDX0JBU0UgKyAweDI4LCBTSF9ETUFDX0JBU0UgKyAweDM4LCBcCisJCQkJICAgU0hfRE1BQ19CQVNFICsgMHg1OCwgU0hfRE1BQ19CQVNFICsgMHg2OH0pCisjZGVmaW5lIENIQ1IJKCh1bnNpZ25lZCBsb25nW10pe1NIX0RNQUNfQkFTRSArIDB4MGMsIFNIX0RNQUNfQkFTRSArIDB4MWMsIFwKKwkJCQkgICBTSF9ETUFDX0JBU0UgKyAweDJjLCBTSF9ETUFDX0JBU0UgKyAweDNjLCBcCisJCQkJICAgU0hfRE1BQ19CQVNFICsgMHg1YywgU0hfRE1BQ19CQVNFICsgMHg2Y30pCisKKyNkZWZpbmUgRE1BT1IJKFNIX0RNQUNfQkFTRSArIDB4NDApCisKICNlbmRpZiAvKiBfX0RNQV9TSF9IICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXN5c2ZzLmMgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1zeXNmcy5jCmluZGV4IDZlM2I1OGIuLjcwYTVkODIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXN5c2ZzLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtc3lzZnMuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBzeXNmcyBpbnRlcmZhY2UgZm9yIFNIIERNQSBBUEkKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgIFBhdWwgTXVuZHQKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSAgUGF1bCBNdW5kdAogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCkBAIC0xMiw3ICsxMiw5IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KIApAQCAtNzcsNyArNzksNyBAQAogCXVuc2lnbmVkIGxvbmcgY29uZmlnOwogCiAJY29uZmlnID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKLQlkbWFfY29uZmlndXJlX2NoYW5uZWwoY2hhbm5lbC0+Y2hhbiwgY29uZmlnKTsKKwlkbWFfY29uZmlndXJlX2NoYW5uZWwoY2hhbm5lbC0+dmNoYW4sIGNvbmZpZyk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0xMTEsMTIgKzExMywxMyBAQAogZG1hX3JvX2F0dHIoY291bnQsICIweCUwOHhcbiIpOwogZG1hX3JvX2F0dHIoZmxhZ3MsICIweCUwOGx4XG4iKTsKIAotaW50IF9faW5pdCBkbWFfY3JlYXRlX3N5c2ZzX2ZpbGVzKHN0cnVjdCBkbWFfY2hhbm5lbCAqY2hhbikKK2ludCBkbWFfY3JlYXRlX3N5c2ZzX2ZpbGVzKHN0cnVjdCBkbWFfY2hhbm5lbCAqY2hhbiwgc3RydWN0IGRtYV9pbmZvICppbmZvKQogewogCXN0cnVjdCBzeXNfZGV2aWNlICpkZXYgPSAmY2hhbi0+ZGV2OworCWNoYXIgbmFtZVsxNl07CiAJaW50IHJldDsKIAotCWRldi0+aWQgID0gY2hhbi0+Y2hhbjsKKwlkZXYtPmlkICA9IGNoYW4tPnZjaGFuOwogCWRldi0+Y2xzID0gJmRtYV9zeXNjbGFzczsKIAogCXJldCA9IHN5c2Rldl9yZWdpc3RlcihkZXYpOwpAQCAtMTI5LDYgKzEzMiwyNCBAQAogCXN5c2Rldl9jcmVhdGVfZmlsZShkZXYsICZhdHRyX2ZsYWdzKTsKIAlzeXNkZXZfY3JlYXRlX2ZpbGUoZGV2LCAmYXR0cl9jb25maWcpOwogCi0JcmV0dXJuIDA7CisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiZG1hJWQiLCBjaGFuLT5jaGFuKTsKKwlyZXR1cm4gc3lzZnNfY3JlYXRlX2xpbmsoJmluZm8tPnBkZXYtPmRldi5rb2JqLCAmZGV2LT5rb2JqLCBuYW1lKTsKK30KKwordm9pZCBkbWFfcmVtb3ZlX3N5c2ZzX2ZpbGVzKHN0cnVjdCBkbWFfY2hhbm5lbCAqY2hhbiwgc3RydWN0IGRtYV9pbmZvICppbmZvKQoreworCXN0cnVjdCBzeXNfZGV2aWNlICpkZXYgPSAmY2hhbi0+ZGV2OworCWNoYXIgbmFtZVsxNl07CisKKwlzeXNkZXZfcmVtb3ZlX2ZpbGUoZGV2LCAmYXR0cl9kZXZfaWQpOworCXN5c2Rldl9yZW1vdmVfZmlsZShkZXYsICZhdHRyX2NvdW50KTsKKwlzeXNkZXZfcmVtb3ZlX2ZpbGUoZGV2LCAmYXR0cl9tb2RlKTsKKwlzeXNkZXZfcmVtb3ZlX2ZpbGUoZGV2LCAmYXR0cl9mbGFncyk7CisJc3lzZGV2X3JlbW92ZV9maWxlKGRldiwgJmF0dHJfY29uZmlnKTsKKworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImRtYSVkIiwgY2hhbi0+Y2hhbik7CisJc3lzZnNfcmVtb3ZlX2xpbmsoJmluZm8tPnBkZXYtPmRldi5rb2JqLCBuYW1lKTsKKworCXN5c2Rldl91bnJlZ2lzdGVyKGRldik7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL01ha2VmaWxlIGIvYXJjaC9zaC9rZXJuZWwvTWFrZWZpbGUKaW5kZXggOGI4MTk2OS4uN2E4NmVlYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9rZXJuZWwvTWFrZWZpbGUKQEAgLTE3LDYgKzE3LDQgQEAKIG9iai0kKENPTkZJR19TSF9DUFVfRlJFUSkJKz0gY3B1ZnJlcS5vCiBvYmotJChDT05GSUdfTU9EVUxFUykJCSs9IG1vZHVsZS5vCiBvYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKQkrPSBlYXJseV9wcmludGsubwotCi1VU0VfU1RBTkRBUkRfQVNfUlVMRSA6PSB0cnVlCi0KK29iai0kKENPTkZJR19LRVhFQykJCSs9IG1hY2hpbmVfa2V4ZWMubyByZWxvY2F0ZV9rZXJuZWwubwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L01ha2VmaWxlIGIvYXJjaC9zaC9rZXJuZWwvY3B1L01ha2VmaWxlCmluZGV4IGNkNDM3MTQuLjViZmMzM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvTWFrZWZpbGUKQEAgLTIsMTUgKzIsMTIgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eC9TdXBlckggQ1BVLXNwZWNpZmMgYmFja2VuZHMuCiAjCiAKLW9iai15CTo9IGlycV9pcHIubyBpcnFfaW1hc2subyBpbml0Lm8gYnVzLm8KK29iai15CSs9IGlycS8gaW5pdC5vIGJ1cy5vIGNsb2NrLm8KIAogb2JqLSQoQ09ORklHX0NQVV9TSDIpCQkrPSBzaDIvCiBvYmotJChDT05GSUdfQ1BVX1NIMykJCSs9IHNoMy8KIG9iai0kKENPTkZJR19DUFVfU0g0KQkJKz0gc2g0LwogCi1vYmotJChDT05GSUdfU0hfUlRDKSAgICAgICAgICAgICs9IHJ0Yy5vCitvYmotJChDT05GSUdfU0hfUlRDKQkJKz0gcnRjLm8KIG9iai0kKENPTkZJR19VQkNfV0FLRVVQKQkrPSB1YmMubwotb2JqLSQoQ09ORklHX1NIX0FEQykgICAgICAgICAgICArPSBhZGMubwotCi1VU0VfU1RBTkRBUkRfQVNfUlVMRSA6PSB0cnVlCi0KK29iai0kKENPTkZJR19TSF9BREMpCQkrPSBhZGMubwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2J1cy5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2J1cy5jCmluZGV4IGQ0ZmVlMmE3Li5mYzZjNGJkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvYnVzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2J1cy5jCkBAIC01MywyMSArNTMsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGRldmljZSBzaF9idXNfZGV2aWNlc1tTSF9OUl9CVVNFU10gPSB7Ci0JewotCQkuYnVzX2lkCQk9IFNIX0JVU19OQU1FX1ZJUlQsCi0JfSwKLX07Ci0KLXN0cnVjdCBidXNfdHlwZSBzaF9idXNfdHlwZXNbU0hfTlJfQlVTRVNdID0gewotCXsKLQkJLm5hbWUJCT0gU0hfQlVTX05BTUVfVklSVCwKLQkJLm1hdGNoCQk9IHNoX2J1c19tYXRjaCwKLQkJLnN1c3BlbmQJPSBzaF9idXNfc3VzcGVuZCwKLQkJLnJlc3VtZQkJPSBzaF9idXNfcmVzdW1lLAotCX0sCi19OwotCiBzdGF0aWMgaW50IHNoX2RldmljZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHNoX2RldiAqc2hkZXYgPSB0b19zaF9kZXYoZGV2KTsKQEAgLTkwLDYgKzc1LDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlIHNoX2J1c19kZXZpY2VzW1NIX05SX0JVU0VTXSA9IHsKKwl7CisJCS5idXNfaWQJCT0gU0hfQlVTX05BTUVfVklSVCwKKwl9LAorfTsKKworc3RydWN0IGJ1c190eXBlIHNoX2J1c190eXBlc1tTSF9OUl9CVVNFU10gPSB7CisJeworCQkubmFtZQkJPSBTSF9CVVNfTkFNRV9WSVJULAorCQkubWF0Y2gJCT0gc2hfYnVzX21hdGNoLAorCQkucHJvYmUJCT0gc2hfYnVzX3Byb2JlLAorCQkucmVtb3ZlCQk9IHNoX2J1c19yZW1vdmUsCisJCS5zdXNwZW5kCT0gc2hfYnVzX3N1c3BlbmQsCisJCS5yZXN1bWUJCT0gc2hfYnVzX3Jlc3VtZSwKKwl9LAorfTsKKwogaW50IHNoX2RldmljZV9yZWdpc3RlcihzdHJ1Y3Qgc2hfZGV2ICpkZXYpCiB7CiAJaWYgKCFkZXYpCkBAIC0xMDcsNiArMTA5LDggQEAKIAkvKiBUaGlzIGlzIG5lZWRlZCBmb3IgVVNCIE9IQ0kgdG8gd29yayAqLwogCWlmIChkZXYtPmRtYV9tYXNrKQogCQlkZXYtPmRldi5kbWFfbWFzayA9IGRldi0+ZG1hX21hc2s7CisJaWYgKGRldi0+Y29oZXJlbnRfZG1hX21hc2spCisJCWRldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrID0gZGV2LT5jb2hlcmVudF9kbWFfbWFzazsKIAogCXNucHJpbnRmKGRldi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlcyV1IiwKIAkJIGRldi0+bmFtZSwgZGV2LT5kZXZfaWQpOwpAQCAtMTMzLDggKzEzNyw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWRydi0+ZHJ2LnByb2JlICA9IHNoX2RldmljZV9wcm9iZTsKLQlkcnYtPmRydi5yZW1vdmUgPSBzaF9kZXZpY2VfcmVtb3ZlOwogCWRydi0+ZHJ2LmJ1cyAgICA9ICZzaF9idXNfdHlwZXNbZHJ2LT5idXNfaWRdOwogCiAJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcnYpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2Nsb2NrLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvY2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODllN2ZkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2Nsb2NrLmMKQEAgLTAsMCArMSwyODcgQEAKKy8qCisgKiBhcmNoL3NoL2tlcm5lbC9jcHUvY2xvY2suYyAtIFN1cGVySCBjbG9jayBmcmFtZXdvcmsKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1ICBQYXVsIE11bmR0CisgKgorICogVGhpcyBjbG9jayBmcmFtZXdvcmsgaXMgZGVyaXZlZCBmcm9tIHRoZSBPTUFQIHZlcnNpb24gYnk6CisgKgorICoJQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uCisgKglXcml0dGVuIGJ5IFR1dWtrYSBUaWtrYW5lbiA8dHV1a2thLnRpa2thbmVuQGVsZWt0cm9iaXQuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxhc20vY2xvY2suaD4KKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KKworc3RhdGljIExJU1RfSEVBRChjbG9ja19saXN0KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2xvY2tfbG9jayk7CitzdGF0aWMgREVDTEFSRV9NVVRFWChjbG9ja19saXN0X3NlbSk7CisKKy8qCisgKiBFYWNoIHN1YnR5cGUgaXMgZXhwZWN0ZWQgdG8gZGVmaW5lIHRoZSBpbml0IHJvdXRpbmVzIGZvciB0aGVzZSBjbG9ja3MsCisgKiBhcyBlYWNoIHN1YnR5cGUgKG9yIHByb2Nlc3NvciBmYW1pbHkpIHdpbGwgaGF2ZSB0aGVzZSBjbG9ja3MgYXQgdGhlCisgKiB2ZXJ5IGxlYXN0LiBUaGVzZSBhcmUgYWxsIHByb3ZpZGVkIHRocm91Z2ggdGhlIENQRywgd2hpY2ggZXZlbiBzb21lIG9mCisgKiB0aGUgbW9yZSBxdWlya3kgcGFydHMgKHN1Y2ggYXMgU1Q0MCwgU0g0LTIwMiwgZXRjLikgc3RpbGwgaGF2ZS4KKyAqCisgKiBUaGUgcHJvY2Vzc29yLXNwZWNpZmljIGNvZGUgaXMgZXhwZWN0ZWQgdG8gcmVnaXN0ZXIgYW55IGFkZGl0aW9uYWwKKyAqIGNsb2NrIHNvdXJjZXMgdGhhdCBhcmUgb2YgaW50ZXJlc3QuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIG1hc3Rlcl9jbGsgPSB7CisJLm5hbWUJCT0gIm1hc3Rlcl9jbGsiLAorCS5mbGFncwkJPSBDTEtfQUxXQVlTX0VOQUJMRUQgfCBDTEtfUkFURV9QUk9QQUdBVEVTLAorI2lmZGVmIENPTkZJR19TSF9QQ0xLX0ZSRVFfQk9PTAorCS5yYXRlCQk9IENPTkZJR19TSF9QQ0xLX0ZSRVEsCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1vZHVsZV9jbGsgPSB7CisJLm5hbWUJCT0gIm1vZHVsZV9jbGsiLAorCS5wYXJlbnQJCT0gJm1hc3Rlcl9jbGssCisJLmZsYWdzCQk9IENMS19BTFdBWVNfRU5BQkxFRCB8IENMS19SQVRFX1BST1BBR0FURVMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBidXNfY2xrID0geworCS5uYW1lCQk9ICJidXNfY2xrIiwKKwkucGFyZW50CQk9ICZtYXN0ZXJfY2xrLAorCS5mbGFncwkJPSBDTEtfQUxXQVlTX0VOQUJMRUQgfCBDTEtfUkFURV9QUk9QQUdBVEVTLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY3B1X2NsayA9IHsKKwkubmFtZQkJPSAiY3B1X2NsayIsCisJLnBhcmVudAkJPSAmbWFzdGVyX2NsaywKKwkuZmxhZ3MJCT0gQ0xLX0FMV0FZU19FTkFCTEVELAorfTsKKworLyoKKyAqIFRoZSBvcmRlcmluZyBvZiB0aGVzZSBjbG9ja3MgbWF0dGVycywgZG8gbm90IGNoYW5nZSBpdC4KKyAqLworc3RhdGljIHN0cnVjdCBjbGsgKm9uY2hpcF9jbG9ja3NbXSA9IHsKKwkmbWFzdGVyX2NsaywKKwkmbW9kdWxlX2NsaywKKwkmYnVzX2NsaywKKwkmY3B1X2NsaywKK307CisKK3N0YXRpYyB2b2lkIHByb3BhZ2F0ZV9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlzdHJ1Y3QgY2xrICpjbGtwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbGtwLCAmY2xvY2tfbGlzdCwgbm9kZSkgeworCQlpZiAobGlrZWx5KGNsa3AtPnBhcmVudCAhPSBjbGspKQorCQkJY29udGludWU7CisJCWlmIChsaWtlbHkoY2xrcC0+b3BzICYmIGNsa3AtPm9wcy0+cmVjYWxjKSkKKwkJCWNsa3AtPm9wcy0+cmVjYWxjKGNsa3ApOworCX0KK30KKworaW50IF9fY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJLyoKKwkgKiBTZWUgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSdyZSBlbmFibGluZyB0aGUgY2xvY2ssIHNvbWUKKwkgKiBjbG9ja3MgdGhhdCBhcmUgYWx3YXlzIGVuYWJsZWQgc3RpbGwgcmVxdWlyZSAic3BlY2lhbCIKKwkgKiBpbml0aWFsaXphdGlvbi4gVGhpcyBpcyBlc3BlY2lhbGx5IHRydWUgaWYgdGhlIGNsb2NrIG1vZGUKKwkgKiBjaGFuZ2VzIGFuZCB0aGUgY2xvY2sgbmVlZHMgdG8gaHVudCBmb3IgdGhlIHByb3BlciBzZXQgb2YKKwkgKiBkaXZpc29ycyB0byB1c2UgYmVmb3JlIGl0IGNhbiBlZmZlY3RpdmVseSByZWNhbGMuCisJICovCisJaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZjbGstPmtyZWYucmVmY291bnQpID09IDEpKQorCQlpZiAoY2xrLT5vcHMgJiYgY2xrLT5vcHMtPmluaXQpCisJCQljbGstPm9wcy0+aW5pdChjbGspOworCisJaWYgKGNsay0+ZmxhZ3MgJiBDTEtfQUxXQVlTX0VOQUJMRUQpCisJCXJldHVybiAwOworCisJaWYgKGxpa2VseShjbGstPm9wcyAmJiBjbGstPm9wcy0+ZW5hYmxlKSkKKwkJY2xrLT5vcHMtPmVuYWJsZShjbGspOworCisJa3JlZl9nZXQoJmNsay0+a3JlZik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tfbG9jaywgZmxhZ3MpOworCXJldCA9IF9fY2xrX2VuYWJsZShjbGspOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsb2NrX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGNsa19rcmVmX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJLyogTm90aGluZyB0byBkbyAqLworfQorCit2b2lkIF9fY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQoreworCWlmIChjbGstPmZsYWdzICYgQ0xLX0FMV0FZU19FTkFCTEVEKQorCQlyZXR1cm47CisKKwlrcmVmX3B1dCgmY2xrLT5rcmVmLCBjbGtfa3JlZl9yZWxlYXNlKTsKK30KKwordm9pZCBjbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjbG9ja19sb2NrLCBmbGFncyk7CisJX19jbGtfZGlzYWJsZShjbGspOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsb2NrX2xvY2ssIGZsYWdzKTsKK30KKworaW50IGNsa19yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspCit7CisJZG93bigmY2xvY2tfbGlzdF9zZW0pOworCisJbGlzdF9hZGQoJmNsay0+bm9kZSwgJmNsb2NrX2xpc3QpOworCWtyZWZfaW5pdCgmY2xrLT5rcmVmKTsKKworCXVwKCZjbG9ja19saXN0X3NlbSk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjbGtfdW5yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspCit7CisJZG93bigmY2xvY2tfbGlzdF9zZW0pOworCWxpc3RfZGVsKCZjbGstPm5vZGUpOworCXVwKCZjbG9ja19saXN0X3NlbSk7Cit9CisKK2lubGluZSB1bnNpZ25lZCBsb25nIGNsa19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNsay0+cmF0ZTsKK30KKworaW50IGNsa19zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7CisKKwlpZiAobGlrZWx5KGNsay0+b3BzICYmIGNsay0+b3BzLT5zZXRfcmF0ZSkpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tfbG9jaywgZmxhZ3MpOworCQlyZXQgPSBjbGstPm9wcy0+c2V0X3JhdGUoY2xrLCByYXRlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tfbG9jaywgZmxhZ3MpOworCX0KKworCWlmICh1bmxpa2VseShjbGstPmZsYWdzICYgQ0xLX1JBVEVfUFJPUEFHQVRFUykpCisJCXByb3BhZ2F0ZV9yYXRlKGNsayk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGNsa19yZWNhbGNfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJaWYgKGxpa2VseShjbGstPm9wcyAmJiBjbGstPm9wcy0+cmVjYWxjKSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjbG9ja19sb2NrLCBmbGFncyk7CisJCWNsay0+b3BzLT5yZWNhbGMoY2xrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tfbG9jaywgZmxhZ3MpOworCX0KKworCWlmICh1bmxpa2VseShjbGstPmZsYWdzICYgQ0xLX1JBVEVfUFJPUEFHQVRFUykpCisJCXByb3BhZ2F0ZV9yYXRlKGNsayk7Cit9CisKK3N0cnVjdCBjbGsgKmNsa19nZXQoY29uc3QgY2hhciAqaWQpCit7CisJc3RydWN0IGNsayAqcCwgKmNsayA9IEVSUl9QVFIoLUVOT0VOVCk7CisKKwlkb3duKCZjbG9ja19saXN0X3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2xvY2tfbGlzdCwgbm9kZSkgeworCQlpZiAoc3RyY21wKGlkLCBwLT5uYW1lKSA9PSAwICYmIHRyeV9tb2R1bGVfZ2V0KHAtPm93bmVyKSkgeworCQkJY2xrID0gcDsKKwkJCWJyZWFrOworCQl9CisJfQorCXVwKCZjbG9ja19saXN0X3NlbSk7CisKKwlyZXR1cm4gY2xrOworfQorCit2b2lkIGNsa19wdXQoc3RydWN0IGNsayAqY2xrKQoreworCWlmIChjbGsgJiYgIUlTX0VSUihjbGspKQorCQltb2R1bGVfcHV0KGNsay0+b3duZXIpOworfQorCit2b2lkIF9faW5pdCBfX2F0dHJpYnV0ZV9fICgod2VhaykpCithcmNoX2luaXRfY2xrX29wcyhzdHJ1Y3QgY2xrX29wcyAqKm9wcywgaW50IHR5cGUpCit7Cit9CisKK2ludCBfX2luaXQgY2xrX2luaXQodm9pZCkKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKworCWlmICh1bmxpa2VseSghbWFzdGVyX2Nsay5yYXRlKSkKKwkJLyoKKwkJICogTk9URTogVGhpcyB3aWxsIGJyZWFrIGlmIHRoZSBkZWZhdWx0IGRpdmlzb3IgaGFzIGJlZW4KKwkJICogY2hhbmdlZC4KKwkJICoKKwkJICogTm8gb25lIHNob3VsZCBiZSBjaGFuZ2luZyB0aGUgZGVmYXVsdCBvbiB1cyBob3dldmVyLAorCQkgKiBleHBlY3QgdGhhdCBhIHNhbmUgdmFsdWUgZm9yIENPTkZJR19TSF9QQ0xLX0ZSRVEgd2lsbAorCQkgKiBiZSBkZWZpbmVkIGluIHRoZSBldmVudCBvZiBhIGRpZmZlcmVudCBkaXZpc29yLgorCQkgKi8KKwkJbWFzdGVyX2Nsay5yYXRlID0gZ2V0X3RpbWVyX2ZyZXF1ZW5jeSgpICogNDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9uY2hpcF9jbG9ja3MpOyBpKyspIHsKKwkJc3RydWN0IGNsayAqY2xrID0gb25jaGlwX2Nsb2Nrc1tpXTsKKworCQlhcmNoX2luaXRfY2xrX29wcygmY2xrLT5vcHMsIGkpOworCQlyZXQgfD0gY2xrX3JlZ2lzdGVyKGNsayk7CisJCWNsa19lbmFibGUoY2xrKTsKKwl9CisKKwkvKiBLaWNrIHRoZSBjaGlsZCBjbG9ja3MuLiAqLworCXByb3BhZ2F0ZV9yYXRlKCZtYXN0ZXJfY2xrKTsKKwlwcm9wYWdhdGVfcmF0ZSgmYnVzX2Nsayk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgc2hvd19jbG9ja3Moc3RydWN0IHNlcV9maWxlICptKQoreworCXN0cnVjdCBjbGsgKmNsazsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShjbGssICZjbG9ja19saXN0LCBub2RlKSB7CisJCXVuc2lnbmVkIGxvbmcgcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGspOworCisJCS8qCisJCSAqIERvbid0IGJvdGhlciBsaXN0aW5nIGR1bW15IGNsb2NrcyB3aXRoIG5vIGFuY2VzdHJ5CisJCSAqIHRoYXQgb25seSBzdXBwb3J0IGVuYWJsZSBhbmQgZGlzYWJsZSBvcHMuCisJCSAqLworCQlpZiAodW5saWtlbHkoIXJhdGUgJiYgIWNsay0+cGFyZW50KSkKKwkJCWNvbnRpbnVlOworCisJCXNlcV9wcmludGYobSwgIiUtMTJzXHQ6ICVsZC4lMDJsZE1IelxuIiwgY2xrLT5uYW1lLAorCQkJICAgcmF0ZSAvIDEwMDAwMDAsIChyYXRlICUgMTAwMDAwMCkgLyAxMDAwMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGNsa19yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MX0dQTChjbGtfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MX0dQTChjbGtfZ2V0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNsa19wdXQpOworRVhQT1JUX1NZTUJPTF9HUEwoY2xrX2VuYWJsZSk7CitFWFBPUlRfU1lNQk9MX0dQTChjbGtfZGlzYWJsZSk7CitFWFBPUlRfU1lNQk9MX0dQTChfX2Nsa19lbmFibGUpOworRVhQT1JUX1NZTUJPTF9HUEwoX19jbGtfZGlzYWJsZSk7CitFWFBPUlRfU1lNQk9MX0dQTChjbGtfZ2V0X3JhdGUpOworRVhQT1JUX1NZTUJPTF9HUEwoY2xrX3NldF9yYXRlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNsa19yZWNhbGNfcmF0ZSk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL01ha2VmaWxlIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2NjY2VhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eC9TdXBlckggQ1BVLXNwZWNpZmMgSVJRIGhhbmRsZXJzLgorIworb2JqLXkJKz0gaXByLm8gaW1hc2subworCitvYmotJChDT05GSUdfQ1BVX0hBU19QSU5UX0lSUSkJKz0gcGludC5vCitvYmotJChDT05GSUdfQ1BVX0hBU19JTlRDMl9JUlEpCSs9IGludGMyLm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaW1hc2suYyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaW1hc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWVkOWE1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pbWFzay5jCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pbWFzay5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwICBOaWliZSBZdXRha2EKKyAqCisgKiBTaW1wbGUgaW50ZXJydXB0IGhhbmRsaW5nIHVzaW5nIElNQVNLIG9mIFNSIHJlZ2lzdGVyLgorICoKKyAqLworLyogTk9URTogV2lsbCBub3Qgd29yayBvbiBsZXZlbCAxNSAqLworI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworLyogQml0bWFwIG9mIElSUSBtYXNrZWQgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGltYXNrX21hc2sgPSAweDdmZmY7CitzdGF0aWMgaW50IGludGVycnVwdF9wcmlvcml0eSA9IDA7CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9pbWFza19pcnEodW5zaWduZWQgaW50IGlycSk7CitzdGF0aWMgdm9pZCBkaXNhYmxlX2ltYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKK3N0YXRpYyB2b2lkIHNodXRkb3duX2ltYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKK3N0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19pbWFzayh1bnNpZ25lZCBpbnQpOworc3RhdGljIHZvaWQgZW5kX2ltYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKKworI2RlZmluZSBJTUFTS19QUklPUklUWQkxNQorCitzdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfaW1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJLyogTm90aGluZyB0byBkbyAqLworCXJldHVybiAwOyAvKiBuZXZlciBhbnl0aGluZyBwZW5kaW5nICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaW1hc2tfaXJxX3R5cGUgPSB7CisJLnR5cGVuYW1lID0gIlNSLklNQVNLIiwKKwkuc3RhcnR1cCA9IHN0YXJ0dXBfaW1hc2tfaXJxLAorCS5zaHV0ZG93biA9IHNodXRkb3duX2ltYXNrX2lycSwKKwkuZW5hYmxlID0gZW5hYmxlX2ltYXNrX2lycSwKKwkuZGlzYWJsZSA9IGRpc2FibGVfaW1hc2tfaXJxLAorCS5hY2sgPSBtYXNrX2FuZF9hY2tfaW1hc2ssCisJLmVuZCA9IGVuZF9pbWFza19pcnEKK307CisKK3ZvaWQgc3RhdGljIGlubGluZSBzZXRfaW50ZXJydXB0X3JlZ2lzdGVycyhpbnQgaXApCit7CisJdW5zaWduZWQgbG9uZyBfX2R1bW15OworCisJYXNtIHZvbGF0aWxlKCJsZGMJJTIsIHI2X2Jhbmtcblx0IgorCQkgICAgICJzdGMJc3IsICUwXG5cdCIKKwkJICAgICAiYW5kCSMweGYwLCAlMFxuXHQiCisJCSAgICAgInNobHIyCSUwXG5cdCIKKwkJICAgICAiY21wL2VxCSMweDNjLCAlMFxuXHQiCisJCSAgICAgImJ0L3MJMWYJISBDTEktZWRcblx0IgorCQkgICAgICIgc3RjCXNyLCAlMFxuXHQiCisJCSAgICAgImFuZAklMSwgJTBcblx0IgorCQkgICAgICJvcgklMiwgJTBcblx0IgorCQkgICAgICJsZGMJJTAsIHNyXG4iCisJCSAgICAgIjE6IgorCQkgICAgIDogIj0meiIgKF9fZHVtbXkpCisJCSAgICAgOiAiciIgKH4weGYwKSwgInIiIChpcCA8PCA0KQorCQkgICAgIDogInQiKTsKK30KKworc3RhdGljIHZvaWQgZGlzYWJsZV9pbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwljbGVhcl9iaXQoaXJxLCAmaW1hc2tfbWFzayk7CisJaWYgKGludGVycnVwdF9wcmlvcml0eSA8IElNQVNLX1BSSU9SSVRZIC0gaXJxKQorCQlpbnRlcnJ1cHRfcHJpb3JpdHkgPSBJTUFTS19QUklPUklUWSAtIGlycTsKKworCXNldF9pbnRlcnJ1cHRfcmVnaXN0ZXJzKGludGVycnVwdF9wcmlvcml0eSk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9pbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlzZXRfYml0KGlycSwgJmltYXNrX21hc2spOworCWludGVycnVwdF9wcmlvcml0eSA9IElNQVNLX1BSSU9SSVRZIC0gZmZ6KGltYXNrX21hc2spOworCisJc2V0X2ludGVycnVwdF9yZWdpc3RlcnMoaW50ZXJydXB0X3ByaW9yaXR5KTsKK30KKworc3RhdGljIHZvaWQgbWFza19hbmRfYWNrX2ltYXNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJZGlzYWJsZV9pbWFza19pcnEoaXJxKTsKK30KKworc3RhdGljIHZvaWQgZW5kX2ltYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKQorCQllbmFibGVfaW1hc2tfaXJxKGlycSk7Cit9CisKK3N0YXRpYyB2b2lkIHNodXRkb3duX2ltYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCS8qIE5vdGhpbmcgdG8gZG8gKi8KK30KKwordm9pZCBtYWtlX2ltYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOworCWlycV9kZXNjW2lycV0uaGFuZGxlciA9ICZpbWFza19pcnFfdHlwZTsKKwllbmFibGVfaXJxKGlycSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2ludGMyLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2ludGMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlOGFmYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaW50YzIuYwpAQCAtMCwwICsxLDI4NCBAQAorLyoKKyAqIEludGVycnVwdCBoYW5kbGluZyBmb3IgSU5UQzItYmFzZWQgSVJRLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBEYXZpZCBKLiBNY2theSAoZGF2aWQubWNrYXlAc3QuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2IFBhdWwgTXVuZHQgKGxldGhhbEBsaW51eC1zaC5vcmcpCisgKgorICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIFRoZXNlIGFyZSB0aGUgIm5ldyBIaXRhY2hpIHN0eWxlIiBpbnRlcnJ1cHRzLCBhcyBwcmVzZW50IG9uIHRoZQorICogSGl0YWNoaSA3NzUxLCB0aGUgU1RNIFNUNDAgU1RCMSwgU0g3NzYwLCBhbmQgU0g3NzgwLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CisKK3N0cnVjdCBpbnRjMl9kYXRhIHsKKwl1bnNpZ25lZCBjaGFyIG1za19vZmZzZXQ7CisJdW5zaWduZWQgY2hhciBtc2tfc2hpZnQ7CisKKwlpbnQgKCpjbGVhcl9pcnEpIChpbnQpOworfTsKKworc3RhdGljIHN0cnVjdCBpbnRjMl9kYXRhIGludGMyX2RhdGFbTlJfSU5UQzJfSVJRU107CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9pbnRjMl9pcnEodW5zaWduZWQgaW50IGlycSk7CitzdGF0aWMgdm9pZCBkaXNhYmxlX2ludGMyX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKKworLyogc2h1dGRvd24gaXMgc2FtZSBhcyAiZGlzYWJsZSIgKi8KKyNkZWZpbmUgc2h1dGRvd25faW50YzJfaXJxIGRpc2FibGVfaW50YzJfaXJxCisKK3N0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19pbnRjMih1bnNpZ25lZCBpbnQpOworc3RhdGljIHZvaWQgZW5kX2ludGMyX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2ludGMyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWVuYWJsZV9pbnRjMl9pcnEoaXJxKTsKKwlyZXR1cm4gMDsgLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLworfQorCitzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGludGMyX2lycV90eXBlID0geworCS50eXBlbmFtZQk9ICJJTlRDMi1JUlEiLAorCS5zdGFydHVwCT0gc3RhcnR1cF9pbnRjMl9pcnEsCisJLnNodXRkb3duCT0gc2h1dGRvd25faW50YzJfaXJxLAorCS5lbmFibGUJCT0gZW5hYmxlX2ludGMyX2lycSwKKwkuZGlzYWJsZQk9IGRpc2FibGVfaW50YzJfaXJxLAorCS5hY2sJCT0gbWFza19hbmRfYWNrX2ludGMyLAorCS5lbmQJCT0gZW5kX2ludGMyX2lycQorfTsKKworc3RhdGljIHZvaWQgZGlzYWJsZV9pbnRjMl9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpbnQgaXJxX29mZnNldCA9IGlycSAtIElOVEMyX0ZJUlNUX0lSUTsKKwlpbnQgbXNrX3NoaWZ0LCBtc2tfb2Zmc2V0OworCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKHVubGlrZWx5KGlycV9vZmZzZXQgPCAwIHx8IGlycV9vZmZzZXQgPj0gTlJfSU5UQzJfSVJRUykpCisJCXJldHVybjsKKworCW1za19zaGlmdCA9IGludGMyX2RhdGFbaXJxX29mZnNldF0ubXNrX3NoaWZ0OworCW1za19vZmZzZXQgPSBpbnRjMl9kYXRhW2lycV9vZmZzZXRdLm1za19vZmZzZXQ7CisKKwljdHJsX291dGwoMSA8PCBtc2tfc2hpZnQsCisJCSAgSU5UQzJfQkFTRSArIElOVEMyX0lOVE1TS19PRkZTRVQgKyBtc2tfb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2ludGMyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWludCBpcnFfb2Zmc2V0ID0gaXJxIC0gSU5UQzJfRklSU1RfSVJROworCWludCBtc2tfc2hpZnQsIG1za19vZmZzZXQ7CisKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAodW5saWtlbHkoaXJxX29mZnNldCA8IDAgfHwgaXJxX29mZnNldCA+PSBOUl9JTlRDMl9JUlFTKSkKKwkJcmV0dXJuOworCisJbXNrX3NoaWZ0ID0gaW50YzJfZGF0YVtpcnFfb2Zmc2V0XS5tc2tfc2hpZnQ7CisJbXNrX29mZnNldCA9IGludGMyX2RhdGFbaXJxX29mZnNldF0ubXNrX29mZnNldDsKKworCWN0cmxfb3V0bCgxIDw8IG1za19zaGlmdCwKKwkJICBJTlRDMl9CQVNFICsgSU5UQzJfSU5UTVNLQ0xSX09GRlNFVCArIG1za19vZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfaW50YzIodW5zaWduZWQgaW50IGlycSkKK3sKKwlkaXNhYmxlX2ludGMyX2lycShpcnEpOworfQorCitzdGF0aWMgdm9pZCBlbmRfaW50YzJfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkpCisJCWVuYWJsZV9pbnRjMl9pcnEoaXJxKTsKKworCWlmICh1bmxpa2VseShpbnRjMl9kYXRhW2lycSAtIElOVEMyX0ZJUlNUX0lSUV0uY2xlYXJfaXJxKSkKKwkJaW50YzJfZGF0YVtpcnEgLSBJTlRDMl9GSVJTVF9JUlFdLmNsZWFyX2lycShpcnEpOworfQorCisvKgorICogU2V0dXAgYW4gSU5UQzIgc3R5bGUgaW50ZXJydXB0LgorICogTk9URTogVW5saWtlIElQUiBpbnRlcnJ1cHRzLCBwYXJhbWV0ZXJzIGFyZSBub3Qgc2hpZnRlZCBieSB0aGlzIGNvZGUsCisgKiBhbGxvd2luZyB0aGUgdXNlIG9mIHRoZSBudW1iZXJzIHN0cmFpZ2h0IG91dCBvZiB0aGUgZGF0YXNoZWV0LgorICogRm9yIGV4YW1wbGU6CisgKiAgICBQSU8xIHdoaWNoIGlzIElOVFBSSTAwWzE5LDE2XSBhbmQgSU5UTVNLMDBbMTNdCisgKiB3b3VsZCBiZTogICAgICAgICAgICAgICBeICAgICBeICAgICAgICAgICAgIF4gIF4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgICAgICAgICAgICAgfCAgfAorICogICAgbWFrZV9pbnRjMl9pcnEoODQsICAgMCwgICAxNiwgICAgICAgICAgICAwLCAxMyk7CisgKi8KK3ZvaWQgbWFrZV9pbnRjMl9pcnEodW5zaWduZWQgaW50IGlycSwKKwkJICAgIHVuc2lnbmVkIGludCBpcHJfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgaXByX3NoaWZ0LAorCQkgICAgdW5zaWduZWQgaW50IG1za19vZmZzZXQsIHVuc2lnbmVkIGludCBtc2tfc2hpZnQsCisJCSAgICB1bnNpZ25lZCBpbnQgcHJpb3JpdHkpCit7CisJaW50IGlycV9vZmZzZXQgPSBpcnEgLSBJTlRDMl9GSVJTVF9JUlE7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGxvbmcgaXByOworCisJaWYgKHVubGlrZWx5KGlycV9vZmZzZXQgPCAwIHx8IGlycV9vZmZzZXQgPj0gTlJfSU5UQzJfSVJRUykpCisJCXJldHVybjsKKworCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOworCisJLyogRmlsbCB0aGUgZGF0YSB3ZSBuZWVkICovCisJaW50YzJfZGF0YVtpcnFfb2Zmc2V0XS5tc2tfb2Zmc2V0ID0gbXNrX29mZnNldDsKKwlpbnRjMl9kYXRhW2lycV9vZmZzZXRdLm1za19zaGlmdCAgPSBtc2tfc2hpZnQ7CisJaW50YzJfZGF0YVtpcnFfb2Zmc2V0XS5jbGVhcl9pcnEgPSBOVUxMOworCisJLyogU2V0IHRoZSBwcmlvcml0eSBsZXZlbCAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWlwciA9IGN0cmxfaW5sKElOVEMyX0JBU0UgKyBJTlRDMl9JTlRQUklfT0ZGU0VUICsgaXByX29mZnNldCk7CisJaXByICY9IH4oMHhmIDw8IGlwcl9zaGlmdCk7CisJaXByIHw9IHByaW9yaXR5IDw8IGlwcl9zaGlmdDsKKwljdHJsX291dGwoaXByLCBJTlRDMl9CQVNFICsgSU5UQzJfSU5UUFJJX09GRlNFVCArIGlwcl9vZmZzZXQpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJaXJxX2Rlc2NbaXJxXS5oYW5kbGVyID0gJmludGMyX2lycV90eXBlOworCisJZGlzYWJsZV9pbnRjMl9pcnEoaXJxKTsKK30KKworc3RhdGljIHN0cnVjdCBpbnRjMl9pbml0IHsKKwl1bnNpZ25lZCBzaG9ydCBpcnE7CisJdW5zaWduZWQgY2hhciBpcHJfb2Zmc2V0LCBpcHJfc2hpZnQ7CisJdW5zaWduZWQgY2hhciBtc2tfb2Zmc2V0LCBtc2tfc2hpZnQ7CisJdW5zaWduZWQgY2hhciBwcmlvcml0eTsKK30gaW50YzJfaW5pdF9kYXRhW10gIF9faW5pdGRhdGEgPSB7CisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MCkKKwl7NjQsICAwLCAgMCwgMCwgIDAsIDEzfSwJLyogUENJIHNlcnIgKi8KKwl7NjUsICAwLCAgNCwgMCwgIDEsIDEzfSwJLyogUENJIGVyciAqLworCXs2NiwgIDAsICA0LCAwLCAgMiwgMTN9LAkvKiBQQ0kgYWQgKi8KKwl7NjcsICAwLCAgNCwgMCwgIDMsIDEzfSwJLyogUENJIHB3ZCBkb3duICovCisJezcyLCAgMCwgIDgsIDAsICA1LCAxM30sCS8qIERNQUMgSU5UMCAqLworCXs3MywgIDAsICA4LCAwLCAgNiwgMTN9LAkvKiBETUFDIElOVDEgKi8KKwl7NzQsICAwLCAgOCwgMCwgIDcsIDEzfSwJLyogRE1BQyBJTlQyICovCisJezc1LCAgMCwgIDgsIDAsICA4LCAxM30sCS8qIERNQUMgSU5UMyAqLworCXs3NiwgIDAsICA4LCAwLCAgOSwgMTN9LAkvKiBETUFDIElOVDQgKi8KKwl7NzgsICAwLCAgOCwgMCwgMTEsIDEzfSwJLyogRE1BQyBFUlIgKi8KKwl7ODAsICAwLCAxMiwgMCwgMTIsIDEzfSwJLyogUElPMCAqLworCXs4NCwgIDAsIDE2LCAwLCAxMywgMTN9LAkvKiBQSU8xICovCisJezg4LCAgMCwgMjAsIDAsIDE0LCAxM30sCS8qIFBJTzIgKi8KKwl7MTEyLCA0LCAgMCwgNCwgIDAsIDEzfSwJLyogTWFpbGJveCAqLworICNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MEdYMQorCXsxMTYsIDQsICA0LCA0LCAgNCwgMTN9LAkvKiBTU0MwICovCisJezEyMCwgNCwgIDgsIDQsICA4LCAxM30sCS8qIElSIEJsYXN0ZXIgKi8KKwl7MTI0LCA0LCAxMiwgNCwgMTIsIDEzfSwJLyogVVNCIGhvc3QgKi8KKwl7MTI4LCA0LCAxNiwgNCwgMTYsIDEzfSwJLyogVmlkZW8gcHJvY2Vzc29yIEJMSVRURVIgKi8KKwl7MTMyLCA0LCAyMCwgNCwgMjAsIDEzfSwJLyogVUFSVDAgKi8KKwl7MTM0LCA0LCAyMCwgNCwgMjIsIDEzfSwJLyogVUFSVDIgKi8KKwl7MTM2LCA0LCAyNCwgNCwgMjQsIDEzfSwJLyogSU9fUElPMCAqLworCXsxNDAsIDQsIDI4LCA0LCAyOCwgMTN9LAkvKiBFTVBJICovCisJezE0NCwgOCwgIDAsIDgsICAwLCAxM30sCS8qIE1BRkUgKi8KKwl7MTQ4LCA4LCAgNCwgOCwgIDQsIDEzfSwJLyogUFdNICovCisJezE1MiwgOCwgIDgsIDgsICA4LCAxM30sCS8qIFNTQzEgKi8KKwl7MTU2LCA4LCAxMiwgOCwgMTIsIDEzfSwJLyogSU9fUElPMSAqLworCXsxNjAsIDgsIDE2LCA4LCAxNiwgMTN9LAkvKiBVU0IgdGFyZ2V0ICovCisJezE2NCwgOCwgMjAsIDgsIDIwLCAxM30sCS8qIFVBUlQxICovCisJezE2OCwgOCwgMjQsIDgsIDI0LCAxM30sCS8qIFRlbGV0ZXh0ICovCisJezE3MiwgOCwgMjgsIDgsIDI4LCAxM30sCS8qIFZpZGVvU3luYyBWVEcgKi8KKwl7MTczLCA4LCAyOCwgOCwgMjksIDEzfSwJLyogVmlkZW9TeW5jIERWUDAgKi8KKwl7MTc0LCA4LCAyOCwgOCwgMzAsIDEzfSwJLyogVmlkZW9TeW5jIERWUDEgKi8KKyNlbmRpZgorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwKQorLyoKKyAqIFNINzc2MCBJTlRDMi1TdHlsZSBpbnRlcnJ1cHRzLCB2ZWN0b3JzIElSUTQ4LTExMSBJTlRFVlQgMHg4MDAtMHhGRTAKKyAqLworCS8qIElOVFBSSU8wIHwgSU5UTVNLMCAqLworCXs0OCwgIDAsIDI4LCAwLCAzMSwgIDN9LAkvKiBJUlEgNCAqLworCXs0OSwgIDAsIDI0LCAwLCAzMCwgIDN9LAkvKiBJUlEgMyAqLworCXs1MCwgIDAsIDIwLCAwLCAyOSwgIDN9LAkvKiBJUlEgMiAqLworCXs1MSwgIDAsIDE2LCAwLCAyOCwgIDN9LAkvKiBJUlEgMSAqLworCS8qIDUyLTU1IChJTlRFVlQgMHg4ODAtMHg4RTApIHVudXNlZC9yZXNlcnZlZCAqLworCS8qIElOVFBSSU80IHwgSU5UTVNLMCAqLworCXs1NiwgIDQsIDI4LCAwLCAyNSwgIDN9LAkvKiBIQ0FOMl9DSEFOMCAqLworCXs1NywgIDQsIDI0LCAwLCAyNCwgIDN9LAkvKiBIQ0FOMl9DSEFOMSAqLworCXs1OCwgIDQsIDIwLCAwLCAyMywgIDN9LAkvKiBJMlNfQ0hBTjAgICAqLworCXs1OSwgIDQsIDE2LCAwLCAyMiwgIDN9LAkvKiBJMlNfQ0hBTjEgICAqLworCXs2MCwgIDQsIDEyLCAwLCAyMSwgIDN9LAkvKiBBQzk3X0NIQU4wICAqLworCXs2MSwgIDQsICA4LCAwLCAyMCwgIDN9LAkvKiBBQzk3X0NIQU4xICAqLworCXs2MiwgIDQsICA0LCAwLCAxOSwgIDN9LAkvKiBJMkNfQ0hBTjAgICAqLworCXs2MywgIDQsICAwLCAwLCAxOCwgIDN9LAkvKiBJMkNfQ0hBTjEgICAqLworCS8qIElOVFBSSU84IHwgSU5UTVNLMCAqLworCXs1MiwgIDgsIDE2LCAwLCAxMSwgIDN9LAkvKiBTQ0lGMF9FUklfSVJRICovCisJezUzLCAgOCwgMTYsIDAsIDEwLCAgM30sCS8qIFNDSUYwX1JYSV9JUlEgKi8KKwl7NTQsICA4LCAxNiwgMCwgIDksICAzfSwJLyogU0NJRjBfQlJJX0lSUSAqLworCXs1NSwgIDgsIDE2LCAwLCAgOCwgIDN9LAkvKiBTQ0lGMF9UWElfSVJRICovCisJezY0LCAgOCwgMjgsIDAsIDE3LCAgM30sCS8qIFVTQkhJX0lSUSAqLworCXs2NSwgIDgsIDI0LCAwLCAxNiwgIDN9LAkvKiBMQ0RDICAgICAgKi8KKwkvKiA2NiwgNjcgdW51c2VkICovCisJezY4LCAgOCwgMjAsIDAsIDE0LCAxM30sCS8qIERNQUJSR0kwX0lSUSAqLworCXs2OSwgIDgsIDIwLCAwLCAxMywgMTN9LAkvKiBETUFCUkdJMV9JUlEgKi8KKwl7NzAsICA4LCAyMCwgMCwgMTIsIDEzfSwJLyogRE1BQlJHSTJfSVJRICovCisJLyogNzEgdW51c2VkICovCisJezcyLCAgOCwgMTIsIDAsICA3LCAgM30sCS8qIFNDSUYxX0VSSV9JUlEgKi8KKwl7NzMsICA4LCAxMiwgMCwgIDYsICAzfSwJLyogU0NJRjFfUlhJX0lSUSAqLworCXs3NCwgIDgsIDEyLCAwLCAgNSwgIDN9LAkvKiBTQ0lGMV9CUklfSVJRICovCisJezc1LCAgOCwgMTIsIDAsICA0LCAgM30sCS8qIFNDSUYxX1RYSV9JUlEgKi8KKwl7NzYsICA4LCAgOCwgMCwgIDMsICAzfSwJLyogU0NJRjJfRVJJX0lSUSAqLworCXs3NywgIDgsICA4LCAwLCAgMiwgIDN9LAkvKiBTQ0lGMl9SWElfSVJRICovCisJezc4LCAgOCwgIDgsIDAsICAxLCAgM30sCS8qIFNDSUYyX0JSSV9JUlEgKi8KKwl7NzksICA4LCAgOCwgMCwgIDAsICAzfSwJLyogU0NJRjJfVFhJX0lSUSAqLworCS8qICAgICAgICAgIHwgSU5UTVNLNCAqLworCXs4MCwgIDgsICA0LCA0LCAyMywgIDN9LAkvKiBTSU1fRVJJICovCisJezgxLCAgOCwgIDQsIDQsIDIyLCAgM30sCS8qIFNJTV9SWEkgKi8KKwl7ODIsICA4LCAgNCwgNCwgMjEsICAzfSwJLyogU0lNX1RYSSAqLworCXs4MywgIDgsICA0LCA0LCAyMCwgIDN9LAkvKiBTSU1fVEVJICovCisJezg0LCAgOCwgIDAsIDQsIDE5LCAgM30sCS8qIEhTUElJICovCisJLyogSU5UUFJJT0MgfCBJTlRNU0s0ICovCisJLyogODUtODcgdW51c2VkL3Jlc2VydmVkICovCisJezg4LCAxMiwgMjAsIDQsIDE4LCAgM30sCS8qIE1NQ0kwICovCisJezg5LCAxMiwgMjAsIDQsIDE3LCAgM30sCS8qIE1NQ0kxICovCisJezkwLCAxMiwgMjAsIDQsIDE2LCAgM30sCS8qIE1NQ0kyICovCisJezkxLCAxMiwgMjAsIDQsIDE1LCAgM30sCS8qIE1NQ0kzICovCisJezkyLCAxMiwgMTIsIDQsICA2LCAgM30sCS8qIE1GSSAodW5zdXJlLCBidWc/IGluIG15IDc3NjAgbWFudWFsKi8KKwkvKiA5My0xMDcgcmVzZXJ2ZWQvdW5kb2N1bWVudGVkICovCisJezEwOCwxMiwgIDQsIDQsICAxLCAgM30sCS8qIEFEQyAgKi8KKwl7MTA5LDEyLCAgMCwgNCwgIDAsICAzfSwJLyogQ01USSAqLworCS8qIDExMC0xMTEgcmVzZXJ2ZWQvdW51c2VkICovCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApCisJeyBUSU1FUl9JUlEsIDAsIDI0LCAwLCBJTlRDX1RNVTBfTVNLLCAyfSwKKyNpZmRlZiBDT05GSUdfU0hfUlRDCisJeyBSVENfSVJRLCA0LCAwLCAwLCBJTlRDX1JUQ19NU0ssIFRJTUVSX1BSSU9SSVRZIH0sCisjZW5kaWYKKwl7IFNDSUYwX0VSSV9JUlEsIDgsIDI0LCAwLCBJTlRDX1NDSUYwX01TSywgU0NJRjBfUFJJT1JJVFkgfSwKKwl7IFNDSUYwX1JYSV9JUlEsIDgsIDI0LCAwLCBJTlRDX1NDSUYwX01TSywgU0NJRjBfUFJJT1JJVFkgfSwKKwl7IFNDSUYwX0JSSV9JUlEsIDgsIDI0LCAwLCBJTlRDX1NDSUYwX01TSywgU0NJRjBfUFJJT1JJVFkgfSwKKwl7IFNDSUYwX1RYSV9JUlEsIDgsIDI0LCAwLCBJTlRDX1NDSUYwX01TSywgU0NJRjBfUFJJT1JJVFkgfSwKKworCXsgU0NJRjFfRVJJX0lSUSwgOCwgMTYsIDAsIElOVENfU0NJRjFfTVNLLCBTQ0lGMV9QUklPUklUWSB9LAorCXsgU0NJRjFfUlhJX0lSUSwgOCwgMTYsIDAsIElOVENfU0NJRjFfTVNLLCBTQ0lGMV9QUklPUklUWSB9LAorCXsgU0NJRjFfQlJJX0lSUSwgOCwgMTYsIDAsIElOVENfU0NJRjFfTVNLLCBTQ0lGMV9QUklPUklUWSB9LAorCXsgU0NJRjFfVFhJX0lSUSwgOCwgMTYsIDAsIElOVENfU0NJRjFfTVNLLCBTQ0lGMV9QUklPUklUWSB9LAorCisJeyBQQ0lDMF9JUlEsIDB4MTAsICA4LCAwLCBJTlRDX1BDSUMwX01TSywgUENJQzBfUFJJT1JJVFkgfSwKKwl7IFBDSUMxX0lSUSwgMHgxMCwgIDAsIDAsIElOVENfUENJQzFfTVNLLCBQQ0lDMV9QUklPUklUWSB9LAorCXsgUENJQzJfSVJRLCAweDE0LCAyNCwgMCwgSU5UQ19QQ0lDMl9NU0ssIFBDSUMyX1BSSU9SSVRZIH0sCisJeyBQQ0lDM19JUlEsIDB4MTQsIDE2LCAwLCBJTlRDX1BDSUMzX01TSywgUENJQzNfUFJJT1JJVFkgfSwKKwl7IFBDSUM0X0lSUSwgMHgxNCwgIDgsIDAsIElOVENfUENJQzRfTVNLLCBQQ0lDNF9QUklPUklUWSB9LAorI2VuZGlmCit9OworCit2b2lkIF9faW5pdCBpbml0X0lSUV9pbnRjMih2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW50YzJfaW5pdF9kYXRhKTsgaSsrKSB7CisJCXN0cnVjdCBpbnRjMl9pbml0ICpwID0gaW50YzJfaW5pdF9kYXRhICsgaTsKKwkJbWFrZV9pbnRjMl9pcnEocC0+aXJxLCBwLT5pcHJfb2Zmc2V0LCBwLT5pcHJfc2hpZnQsCisJCQkgICAgICAgcC0+IG1za19vZmZzZXQsIHAtPm1za19zaGlmdCwgcC0+cHJpb3JpdHkpOworCX0KK30KKworLyogQWRkcyBhIHRlcm1pbmF0aW9uIGNhbGxiYWNrIHRvIHRoZSBpbnRlcnJ1cHQgKi8KK3ZvaWQgaW50YzJfYWRkX2NsZWFyX2lycShpbnQgaXJxLCBpbnQgKCpmbikoaW50KSkKK3sKKwlpZiAodW5saWtlbHkoaXJxIDwgSU5UQzJfRklSU1RfSVJRKSkKKwkJcmV0dXJuOworCisJaW50YzJfZGF0YVtpcnEgLSBJTlRDMl9GSVJTVF9JUlFdLmNsZWFyX2lycSA9IGZuOworfQorCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2lwci5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pcHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGJkNzE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pcHIuYwpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIGFyY2gvc2gva2VybmVsL2NwdS9pcnEvaXByLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgIE5paWJlIFl1dGFrYSAmIFRha2VzaGkgWWFlZ2FzaGkKKyAqIENvcHlyaWdodCAoQykgMjAwMCAgS2F6dW1vdG8gS29qaW1hCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgVGFrYXNoaSBLdXN1ZGEgPGt1c3VkYS10YWthc2hpQGhpdGFjaGktdWwuY28uanA+CisgKgorICogSW50ZXJydXB0IGhhbmRsaW5nIGZvciBJUFItYmFzZWQgSVJRLgorICoKKyAqIFN1cHBvcnRlZCBzeXN0ZW06CisgKglPbi1jaGlwIHN1cHBvcnRpbmcgbW9kdWxlcyAoVE1VLCBSVEMsIGV0Yy4pLgorICoJT24tY2hpcCBzdXBwb3J0aW5nIG1vZHVsZXMgZm9yIFNINzcwOS9TSDc3MDlBL1NINzcyOS9TSDczMDAuCisgKglIaXRhY2hpIFNvbHV0aW9uRW5naW5lIGV4dGVybmFsIEkvTzoKKyAqCQlNUzc3MDlTRTAxLCBNUzc3MDlBU0UwMSwgYW5kIE1TNzc1MFNFMDEKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgorCitzdHJ1Y3QgaXByX2RhdGEgeworCXVuc2lnbmVkIGludCBhZGRyOwkvKiBBZGRyZXNzIG9mIEludGVycnVwdCBQcmlvcml0eSBSZWdpc3RlciAqLworCWludCBzaGlmdDsJCS8qIFNoaWZ0cyBvZiB0aGUgMTYtYml0IGRhdGEgKi8KKwlpbnQgcHJpb3JpdHk7CQkvKiBUaGUgcHJpb3JpdHkgKi8KK307CitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIGlwcl9kYXRhW05SX0lSUVNdOworCitzdGF0aWMgdm9pZCBlbmFibGVfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKK3N0YXRpYyB2b2lkIGRpc2FibGVfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKKworLyogc2h1dGRvd24gaXMgc2FtZSBhcyAiZGlzYWJsZSIgKi8KKyNkZWZpbmUgc2h1dGRvd25faXByX2lycSBkaXNhYmxlX2lwcl9pcnEKKworc3RhdGljIHZvaWQgbWFza19hbmRfYWNrX2lwcih1bnNpZ25lZCBpbnQpOworc3RhdGljIHZvaWQgZW5kX2lwcl9pcnEodW5zaWduZWQgaW50IGlycSk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9pcHJfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJZW5hYmxlX2lwcl9pcnEoaXJxKTsKKwlyZXR1cm4gMDsgLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLworfQorCitzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGlwcl9pcnFfdHlwZSA9IHsKKwkudHlwZW5hbWUgPSAiSVBSLUlSUSIsCisJLnN0YXJ0dXAgPSBzdGFydHVwX2lwcl9pcnEsCisJLnNodXRkb3duID0gc2h1dGRvd25faXByX2lycSwKKwkuZW5hYmxlID0gZW5hYmxlX2lwcl9pcnEsCisJLmRpc2FibGUgPSBkaXNhYmxlX2lwcl9pcnEsCisJLmFjayA9IG1hc2tfYW5kX2Fja19pcHIsCisJLmVuZCA9IGVuZF9pcHJfaXJxCit9OworCitzdGF0aWMgdm9pZCBkaXNhYmxlX2lwcl9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbCwgZmxhZ3M7CisJdW5zaWduZWQgaW50IGFkZHIgPSBpcHJfZGF0YVtpcnFdLmFkZHI7CisJdW5zaWduZWQgc2hvcnQgbWFzayA9IDB4ZmZmZiBeICgweDBmIDw8IGlwcl9kYXRhW2lycV0uc2hpZnQpOworCisJLyogU2V0IHRoZSBwcmlvcml0eSBpbiBJUFIgdG8gMCAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwl2YWwgPSBjdHJsX2ludyhhZGRyKTsKKwl2YWwgJj0gbWFzazsKKwljdHJsX291dHcodmFsLCBhZGRyKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9pcHJfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgbG9uZyB2YWwsIGZsYWdzOworCXVuc2lnbmVkIGludCBhZGRyID0gaXByX2RhdGFbaXJxXS5hZGRyOworCWludCBwcmlvcml0eSA9IGlwcl9kYXRhW2lycV0ucHJpb3JpdHk7CisJdW5zaWduZWQgc2hvcnQgdmFsdWUgPSAocHJpb3JpdHkgPDwgaXByX2RhdGFbaXJxXS5zaGlmdCk7CisKKwkvKiBTZXQgcHJpb3JpdHkgaW4gSVBSIGJhY2sgdG8gb3JpZ2luYWwgdmFsdWUgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdmFsID0gY3RybF9pbncoYWRkcik7CisJdmFsIHw9IHZhbHVlOworCWN0cmxfb3V0dyh2YWwsIGFkZHIpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbWFza19hbmRfYWNrX2lwcih1bnNpZ25lZCBpbnQgaXJxKQoreworCWRpc2FibGVfaXByX2lycShpcnEpOworCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3KSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkKKwkvKiBUaGlzIGlzIG5lZWRlZCB3aGVuIHdlIHVzZSBlZGdlIHRyaWdnZXJlZCBzZXR0aW5nICovCisJLyogWFhYOiBJcyBpdCByZWFsbHkgbmVlZGVkPyAqLworCWlmIChJUlEwX0lSUSA8PSBpcnEgJiYgaXJxIDw9IElSUTVfSVJRKSB7CisJCS8qIENsZWFyIGV4dGVybmFsIGludGVycnVwdCByZXF1ZXN0ICovCisJCWludCBhID0gY3RybF9pbmIoSU5UQ19JUlIwKTsKKwkJYSAmPSB+KDEgPDwgKGlycSAtIElSUTBfSVJRKSk7CisJCWN0cmxfb3V0YihhLCBJTlRDX0lSUjApOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBlbmRfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKQorCQllbmFibGVfaXByX2lycShpcnEpOworfQorCit2b2lkIG1ha2VfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgYWRkciwgaW50IHBvcywKKwkJICBpbnQgcHJpb3JpdHksIGludCBtYXNrcG9zKQoreworCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOworCWlwcl9kYXRhW2lycV0uYWRkciA9IGFkZHI7CisJaXByX2RhdGFbaXJxXS5zaGlmdCA9IHBvcyo0OyAvKiBQT1NpdGlvbiAoMC0zKSB4IDQgbWVhbnMgc2hpZnQgKi8KKwlpcHJfZGF0YVtpcnFdLnByaW9yaXR5ID0gcHJpb3JpdHk7CisKKwlpcnFfZGVzY1tpcnFdLmhhbmRsZXIgPSAmaXByX2lycV90eXBlOworCWRpc2FibGVfaXByX2lycShpcnEpOworfQorCit2b2lkIF9faW5pdCBpbml0X0lSUSh2b2lkKQoreworI2lmbmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwCisJbWFrZV9pcHJfaXJxKFRJTUVSX0lSUSwgVElNRVJfSVBSX0FERFIsIFRJTUVSX0lQUl9QT1MsIFRJTUVSX1BSSU9SSVRZLCAwKTsKKwltYWtlX2lwcl9pcnEoVElNRVIxX0lSUSwgVElNRVIxX0lQUl9BRERSLCBUSU1FUjFfSVBSX1BPUywgVElNRVIxX1BSSU9SSVRZLCAwKTsKKyNpZiBkZWZpbmVkKENPTkZJR19TSF9SVEMpCisJbWFrZV9pcHJfaXJxKFJUQ19JUlEsIFJUQ19JUFJfQUREUiwgUlRDX0lQUl9QT1MsIFJUQ19QUklPUklUWSwgMCk7CisjZW5kaWYKKworI2lmZGVmIFNDSV9FUklfSVJRCisJbWFrZV9pcHJfaXJxKFNDSV9FUklfSVJRLCBTQ0lfSVBSX0FERFIsIFNDSV9JUFJfUE9TLCBTQ0lfUFJJT1JJVFksIDApOworCW1ha2VfaXByX2lycShTQ0lfUlhJX0lSUSwgU0NJX0lQUl9BRERSLCBTQ0lfSVBSX1BPUywgU0NJX1BSSU9SSVRZLCAwKTsKKwltYWtlX2lwcl9pcnEoU0NJX1RYSV9JUlEsIFNDSV9JUFJfQUREUiwgU0NJX0lQUl9QT1MsIFNDSV9QUklPUklUWSwgMCk7CisjZW5kaWYKKworI2lmZGVmIFNDSUYxX0VSSV9JUlEKKwltYWtlX2lwcl9pcnEoU0NJRjFfRVJJX0lSUSwgU0NJRjFfSVBSX0FERFIsIFNDSUYxX0lQUl9QT1MsIFNDSUYxX1BSSU9SSVRZLCAwKTsKKwltYWtlX2lwcl9pcnEoU0NJRjFfUlhJX0lSUSwgU0NJRjFfSVBSX0FERFIsIFNDSUYxX0lQUl9QT1MsIFNDSUYxX1BSSU9SSVRZLCAwKTsKKwltYWtlX2lwcl9pcnEoU0NJRjFfQlJJX0lSUSwgU0NJRjFfSVBSX0FERFIsIFNDSUYxX0lQUl9QT1MsIFNDSUYxX1BSSU9SSVRZLCAwKTsKKwltYWtlX2lwcl9pcnEoU0NJRjFfVFhJX0lSUSwgU0NJRjFfSVBSX0FERFIsIFNDSUYxX0lQUl9QT1MsIFNDSUYxX1BSSU9SSVRZLCAwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKQorCW1ha2VfaXByX2lycShTQ0lGMF9JUlEsIFNDSUYwX0lQUl9BRERSLCBTQ0lGMF9JUFJfUE9TLCBTQ0lGMF9QUklPUklUWSwgMCk7CisJbWFrZV9pcHJfaXJxKERNVEUyX0lSUSwgRE1BMV9JUFJfQUREUiwgRE1BMV9JUFJfUE9TLCBETUExX1BSSU9SSVRZLCAwKTsKKwltYWtlX2lwcl9pcnEoRE1URTNfSVJRLCBETUExX0lQUl9BRERSLCBETUExX0lQUl9QT1MsIERNQTFfUFJJT1JJVFksIDApOworCW1ha2VfaXByX2lycShWSU9fSVJRLCBWSU9fSVBSX0FERFIsIFZJT19JUFJfUE9TLCBWSU9fUFJJT1JJVFksIDApOworI2VuZGlmCisKKyNpZmRlZiBTQ0lGX0VSSV9JUlEKKwltYWtlX2lwcl9pcnEoU0NJRl9FUklfSVJRLCBTQ0lGX0lQUl9BRERSLCBTQ0lGX0lQUl9QT1MsIFNDSUZfUFJJT1JJVFksIDApOworCW1ha2VfaXByX2lycShTQ0lGX1JYSV9JUlEsIFNDSUZfSVBSX0FERFIsIFNDSUZfSVBSX1BPUywgU0NJRl9QUklPUklUWSwgMCk7CisJbWFrZV9pcHJfaXJxKFNDSUZfQlJJX0lSUSwgU0NJRl9JUFJfQUREUiwgU0NJRl9JUFJfUE9TLCBTQ0lGX1BSSU9SSVRZLCAwKTsKKwltYWtlX2lwcl9pcnEoU0NJRl9UWElfSVJRLCBTQ0lGX0lQUl9BRERSLCBTQ0lGX0lQUl9QT1MsIFNDSUZfUFJJT1JJVFksIDApOworI2VuZGlmCisKKyNpZmRlZiBJUkRBX0VSSV9JUlEKKwltYWtlX2lwcl9pcnEoSVJEQV9FUklfSVJRLCBJUkRBX0lQUl9BRERSLCBJUkRBX0lQUl9QT1MsIElSREFfUFJJT1JJVFksIDApOworCW1ha2VfaXByX2lycShJUkRBX1JYSV9JUlEsIElSREFfSVBSX0FERFIsIElSREFfSVBSX1BPUywgSVJEQV9QUklPUklUWSwgMCk7CisJbWFrZV9pcHJfaXJxKElSREFfQlJJX0lSUSwgSVJEQV9JUFJfQUREUiwgSVJEQV9JUFJfUE9TLCBJUkRBX1BSSU9SSVRZLCAwKTsKKwltYWtlX2lwcl9pcnEoSVJEQV9UWElfSVJRLCBJUkRBX0lQUl9BRERSLCBJUkRBX0lQUl9QT1MsIElSREFfUFJJT1JJVFksIDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDcpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KQorCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgSW50ZXJydXB0IENvbnRyb2xsZXIgKElOVEMpCisJICogcmVnaXN0ZXJzIHRvIHRoZWlyIHBvd2VyIG9uIHZhbHVlcworCSAqLworCisJLyoKKwkgKiBFbmFibGUgZXh0ZXJuYWwgaXJxIChJTlRDIElSUSBtb2RlKS4KKwkgKiBZb3Ugc2hvdWxkIHNldCBjb3JyZXNwb25kaW5nIGJpdHMgb2YgUEZDIHRvICIwMCIKKwkgKiB0byBlbmFibGUgdGhlc2UgaW50ZXJydXB0cy4KKwkgKi8KKwltYWtlX2lwcl9pcnEoSVJRMF9JUlEsIElSUTBfSVBSX0FERFIsIElSUTBfSVBSX1BPUywgSVJRMF9QUklPUklUWSwgMCk7CisJbWFrZV9pcHJfaXJxKElSUTFfSVJRLCBJUlExX0lQUl9BRERSLCBJUlExX0lQUl9QT1MsIElSUTFfUFJJT1JJVFksIDApOworCW1ha2VfaXByX2lycShJUlEyX0lSUSwgSVJRMl9JUFJfQUREUiwgSVJRMl9JUFJfUE9TLCBJUlEyX1BSSU9SSVRZLCAwKTsKKwltYWtlX2lwcl9pcnEoSVJRM19JUlEsIElSUTNfSVBSX0FERFIsIElSUTNfSVBSX1BPUywgSVJRM19QUklPUklUWSwgMCk7CisJbWFrZV9pcHJfaXJxKElSUTRfSVJRLCBJUlE0X0lQUl9BRERSLCBJUlE0X0lQUl9QT1MsIElSUTRfUFJJT1JJVFksIDApOworCW1ha2VfaXByX2lycShJUlE1X0lSUSwgSVJRNV9JUFJfQUREUiwgSVJRNV9JUFJfUE9TLCBJUlE1X1BSSU9SSVRZLCAwKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ1BVX0hBU19QSU5UX0lSUQorCWluaXRfSVJRX3BpbnQoKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NQVV9IQVNfSU5UQzJfSVJRCisJaW5pdF9JUlFfaW50YzIoKTsKKyNlbmRpZgorCS8qIFBlcmZvcm0gdGhlIG1hY2hpbmUgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb24gKi8KKwlpZiAoc2hfbXYubXZfaW5pdF9pcnEgIT0gTlVMTCkKKwkJc2hfbXYubXZfaW5pdF9pcnEoKTsKK30KKworI2lmICFkZWZpbmVkKENPTkZJR19DUFVfSEFTX1BJTlRfSVJRKQoraW50IGlwcl9pcnFfZGVtdXgoaW50IGlycSkKK3sKKwlyZXR1cm4gaXJxOworfQorI2VuZGlmCisKK0VYUE9SVF9TWU1CT0wobWFrZV9pcHJfaXJxKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvcGludC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9waW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVkNjAyNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvcGludC5jCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9waW50LmMgLSBJbnRlcnJ1cHQgaGFuZGxpbmcgZm9yIFBJTlQtYmFzZWQgSVJRcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgIE5paWJlIFl1dGFrYSAmIFRha2VzaGkgWWFlZ2FzaGkKKyAqIENvcHlyaWdodCAoQykgMjAwMCAgS2F6dW1vdG8gS29qaW1hCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgVGFrYXNoaSBLdXN1ZGEgPGt1c3VkYS10YWthc2hpQGhpdGFjaGktdWwuY28uanA+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgorCitzdGF0aWMgdW5zaWduZWQgY2hhciBwaW50X21hcFsyNTZdOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcG9ydGNyX21hc2s7CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9waW50X2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKK3N0YXRpYyB2b2lkIGRpc2FibGVfcGludF9pcnEodW5zaWduZWQgaW50IGlycSk7CisKKy8qIHNodXRkb3duIGlzIHNhbWUgYXMgImRpc2FibGUiICovCisjZGVmaW5lIHNodXRkb3duX3BpbnRfaXJxIGRpc2FibGVfcGludF9pcnEKKworc3RhdGljIHZvaWQgbWFza19hbmRfYWNrX3BpbnQodW5zaWduZWQgaW50KTsKK3N0YXRpYyB2b2lkIGVuZF9waW50X2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3BpbnRfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJZW5hYmxlX3BpbnRfaXJxKGlycSk7CisJcmV0dXJuIDA7IC8qIG5ldmVyIGFueXRoaW5nIHBlbmRpbmcgKi8KK30KKworc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBwaW50X2lycV90eXBlID0geworCS50eXBlbmFtZSA9ICJQSU5ULUlSUSIsCisJLnN0YXJ0dXAgPSBzdGFydHVwX3BpbnRfaXJxLAorCS5zaHV0ZG93biA9IHNodXRkb3duX3BpbnRfaXJxLAorCS5lbmFibGUgPSBlbmFibGVfcGludF9pcnEsCisJLmRpc2FibGUgPSBkaXNhYmxlX3BpbnRfaXJxLAorCS5hY2sgPSBtYXNrX2FuZF9hY2tfcGludCwKKwkuZW5kID0gZW5kX3BpbnRfaXJxCit9OworCitzdGF0aWMgdm9pZCBkaXNhYmxlX3BpbnRfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgbG9uZyB2YWwsIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXZhbCA9IGN0cmxfaW53KElOVENfSU5URVIpOworCXZhbCAmPSB+KDEgPDwgKGlycSAtIFBJTlRfSVJRX0JBU0UpKTsKKwljdHJsX291dHcodmFsLCBJTlRDX0lOVEVSKTsJLyogZGlzYWJsZSBQSU5UbiAqLworCXBvcnRjcl9tYXNrICY9IH4oMyA8PCAoaXJxIC0gUElOVF9JUlFfQkFTRSkqMik7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfcGludF9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbCwgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdmFsID0gY3RybF9pbncoSU5UQ19JTlRFUik7CisJdmFsIHw9IDEgPDwgKGlycSAtIFBJTlRfSVJRX0JBU0UpOworCWN0cmxfb3V0dyh2YWwsIElOVENfSU5URVIpOwkvKiBlbmFibGUgUElOVG4gKi8KKwlwb3J0Y3JfbWFzayB8PSAzIDw8IChpcnEgLSBQSU5UX0lSUV9CQVNFKSoyOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbWFza19hbmRfYWNrX3BpbnQodW5zaWduZWQgaW50IGlycSkKK3sKKwlkaXNhYmxlX3BpbnRfaXJxKGlycSk7Cit9CisKK3N0YXRpYyB2b2lkIGVuZF9waW50X2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKQorCQllbmFibGVfcGludF9pcnEoaXJxKTsKK30KKwordm9pZCBtYWtlX3BpbnRfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7CisJaXJxX2Rlc2NbaXJxXS5oYW5kbGVyID0gJnBpbnRfaXJxX3R5cGU7CisJZGlzYWJsZV9waW50X2lycShpcnEpOworfQorCit2b2lkIF9faW5pdCBpbml0X0lSUV9waW50KHZvaWQpCit7CisJaW50IGk7CisKKwltYWtlX2lwcl9pcnEoUElOVDBfSVJRLCBQSU5UMF9JUFJfQUREUiwgUElOVDBfSVBSX1BPUywgUElOVDBfUFJJT1JJVFkpOworCW1ha2VfaXByX2lycShQSU5UOF9JUlEsIFBJTlQ4X0lQUl9BRERSLCBQSU5UOF9JUFJfUE9TLCBQSU5UOF9QUklPUklUWSk7CisKKwllbmFibGVfaXJxKFBJTlQwX0lSUSk7CisJZW5hYmxlX2lycShQSU5UOF9JUlEpOworCisJZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJbWFrZV9waW50X2lycShQSU5UX0lSUV9CQVNFICsgaSk7CisKKwlmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlpZiAoaSAmIDEpCisJCQlwaW50X21hcFtpXSA9IDA7CisJCWVsc2UgaWYgKGkgJiAyKQorCQkJcGludF9tYXBbaV0gPSAxOworCQllbHNlIGlmIChpICYgNCkKKwkJCXBpbnRfbWFwW2ldID0gMjsKKwkJZWxzZSBpZiAoaSAmIDgpCisJCQlwaW50X21hcFtpXSA9IDM7CisJCWVsc2UgaWYgKGkgJiAweDEwKQorCQkJcGludF9tYXBbaV0gPSA0OworCQllbHNlIGlmIChpICYgMHgyMCkKKwkJCXBpbnRfbWFwW2ldID0gNTsKKwkJZWxzZSBpZiAoaSAmIDB4NDApCisJCQlwaW50X21hcFtpXSA9IDY7CisJCWVsc2UgaWYgKGkgJiAweDgwKQorCQkJcGludF9tYXBbaV0gPSA3OworCX0KK30KKworaW50IGlwcl9pcnFfZGVtdXgoaW50IGlycSkKK3sKKwl1bnNpZ25lZCBsb25nIGNyZWcsIGRyZWcsIGQsIHNhdjsKKworCWlmIChpcnEgPT0gUElOVDBfSVJRKSB7CisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3KQorCQljcmVnID0gUE9SVF9QQUNSOworCQlkcmVnID0gUE9SVF9QQURSOworI2Vsc2UKKwkJY3JlZyA9IFBPUlRfUENDUjsKKwkJZHJlZyA9IFBPUlRfUENEUjsKKyNlbmRpZgorCQlzYXYgPSBjdHJsX2ludyhjcmVnKTsKKwkJY3RybF9vdXR3KHNhdiB8IHBvcnRjcl9tYXNrLCBjcmVnKTsKKwkJZCA9ICh+Y3RybF9pbmIoZHJlZykgXiBjdHJsX2ludyhJTlRDX0lDUjIpKSAmCisJCQljdHJsX2ludyhJTlRDX0lOVEVSKSAmIDB4ZmY7CisJCWN0cmxfb3V0dyhzYXYsIGNyZWcpOworCisJCWlmIChkID09IDApCisJCQlyZXR1cm4gaXJxOworCisJCXJldHVybiBQSU5UX0lSUV9CQVNFICsgcGludF9tYXBbZF07CisJfSBlbHNlIGlmIChpcnEgPT0gUElOVDhfSVJRKSB7CisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3KQorCQljcmVnID0gUE9SVF9QQkNSOworCQlkcmVnID0gUE9SVF9QQkRSOworI2Vsc2UKKwkJY3JlZyA9IFBPUlRfUEZDUjsKKwkJZHJlZyA9IFBPUlRfUEZEUjsKKyNlbmRpZgorCQlzYXYgPSBjdHJsX2ludyhjcmVnKTsKKwkJY3RybF9vdXR3KHNhdiB8IChwb3J0Y3JfbWFzayA+PiAxNiksIGNyZWcpOworCQlkID0gKH5jdHJsX2luYihkcmVnKSBeIChjdHJsX2ludyhJTlRDX0lDUjIpID4+IDgpKSAmCisJCQkoY3RybF9pbncoSU5UQ19JTlRFUikgPj4gOCkgJiAweGZmOworCQljdHJsX291dHcoc2F2LCBjcmVnKTsKKworCQlpZiAoZCA9PSAwKQorCQkJcmV0dXJuIGlycTsKKworCQlyZXR1cm4gUElOVF9JUlFfQkFTRSArIDggKyBwaW50X21hcFtkXTsKKwl9CisKKwlyZXR1cm4gaXJxOworfQorCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxX2ltYXNrLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxX2ltYXNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NjNkMDAuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycV9pbWFzay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qICRJZDogaXJxX2ltYXNrLmMsdiAxLjEuMi4xIDIwMDIvMTEvMTcgMTA6NTM6NDMgbXJicm93biBFeHAgJAotICoKLSAqIGxpbnV4L2FyY2gvc2gva2VybmVsL2lycV9pbWFzay5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwICBOaWliZSBZdXRha2EKLSAqCi0gKiBTaW1wbGUgaW50ZXJydXB0IGhhbmRsaW5nIHVzaW5nIElNQVNLIG9mIFNSIHJlZ2lzdGVyLgotICoKLSAqLwotCi0vKiBOT1RFOiBXaWxsIG5vdCB3b3JrIG9uIGxldmVsIDE1ICovCi0KLQotI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLQotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0KLS8qIEJpdG1hcCBvZiBJUlEgbWFza2VkICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbWFza19tYXNrID0gMHg3ZmZmOwotc3RhdGljIGludCBpbnRlcnJ1cHRfcHJpb3JpdHkgPSAwOwotCi1zdGF0aWMgdm9pZCBlbmFibGVfaW1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIHZvaWQgZGlzYWJsZV9pbWFza19pcnEodW5zaWduZWQgaW50IGlycSk7Ci1zdGF0aWMgdm9pZCBzaHV0ZG93bl9pbWFza19pcnEodW5zaWduZWQgaW50IGlycSk7Ci1zdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfaW1hc2sodW5zaWduZWQgaW50KTsKLXN0YXRpYyB2b2lkIGVuZF9pbWFza19pcnEodW5zaWduZWQgaW50IGlycSk7Ci0KLSNkZWZpbmUgSU1BU0tfUFJJT1JJVFkJMTUKLQotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2ltYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoteyAKLQkvKiBOb3RoaW5nIHRvIGRvICovCi0JcmV0dXJuIDA7IC8qIG5ldmVyIGFueXRoaW5nIHBlbmRpbmcgKi8KLX0KLQotc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpbWFza19pcnFfdHlwZSA9IHsKLQkudHlwZW5hbWUgPSAiU1IuSU1BU0siLAotCS5zdGFydHVwID0gc3RhcnR1cF9pbWFza19pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25faW1hc2tfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfaW1hc2tfaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV9pbWFza19pcnEsCi0JLmFjayA9IG1hc2tfYW5kX2Fja19pbWFzaywKLQkuZW5kID0gZW5kX2ltYXNrX2lycQotfTsKLQotdm9pZCBzdGF0aWMgaW5saW5lIHNldF9pbnRlcnJ1cHRfcmVnaXN0ZXJzKGludCBpcCkKLXsKLQl1bnNpZ25lZCBsb25nIF9fZHVtbXk7Ci0KLQlhc20gdm9sYXRpbGUoImxkYwklMiwgcjZfYmFua1xuXHQiCi0JCSAgICAgInN0YwlzciwgJTBcblx0IgotCQkgICAgICJhbmQJIzB4ZjAsICUwXG5cdCIKLQkJICAgICAic2hscjIJJTBcblx0IgotCQkgICAgICJjbXAvZXEJIzB4M2MsICUwXG5cdCIKLQkJICAgICAiYnQvcwkxZgkhIENMSS1lZFxuXHQiCi0JCSAgICAgIiBzdGMJc3IsICUwXG5cdCIKLQkJICAgICAiYW5kCSUxLCAlMFxuXHQiCi0JCSAgICAgIm9yCSUyLCAlMFxuXHQiCi0JCSAgICAgImxkYwklMCwgc3JcbiIKLQkJICAgICAiMToiCi0JCSAgICAgOiAiPSZ6IiAoX19kdW1teSkKLQkJICAgICA6ICJyIiAofjB4ZjApLCAiciIgKGlwIDw8IDQpCi0JCSAgICAgOiAidCIpOwotfQotCi1zdGF0aWMgdm9pZCBkaXNhYmxlX2ltYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWNsZWFyX2JpdChpcnEsICZpbWFza19tYXNrKTsKLQlpZiAoaW50ZXJydXB0X3ByaW9yaXR5IDwgSU1BU0tfUFJJT1JJVFkgLSBpcnEpCi0JCWludGVycnVwdF9wcmlvcml0eSA9IElNQVNLX1BSSU9SSVRZIC0gaXJxOwotCi0Jc2V0X2ludGVycnVwdF9yZWdpc3RlcnMoaW50ZXJydXB0X3ByaW9yaXR5KTsKLX0KLQotc3RhdGljIHZvaWQgZW5hYmxlX2ltYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXNldF9iaXQoaXJxLCAmaW1hc2tfbWFzayk7Ci0JaW50ZXJydXB0X3ByaW9yaXR5ID0gSU1BU0tfUFJJT1JJVFkgLSBmZnooaW1hc2tfbWFzayk7Ci0KLQlzZXRfaW50ZXJydXB0X3JlZ2lzdGVycyhpbnRlcnJ1cHRfcHJpb3JpdHkpOwotfQotCi1zdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfaW1hc2sodW5zaWduZWQgaW50IGlycSkKLXsKLQlkaXNhYmxlX2ltYXNrX2lycShpcnEpOwotfQotCi1zdGF0aWMgdm9pZCBlbmRfaW1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkpCi0JCWVuYWJsZV9pbWFza19pcnEoaXJxKTsKLX0KLQotc3RhdGljIHZvaWQgc2h1dGRvd25faW1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JLyogTm90aGluZyB0byBkbyAqLwotfQotCi12b2lkIG1ha2VfaW1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7Ci0JaXJxX2Rlc2NbaXJxXS5oYW5kbGVyID0gJmltYXNrX2lycV90eXBlOwotCWVuYWJsZV9pcnEoaXJxKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9pcnFfaXByLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxX2lwci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWY5MjA5Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9pcnFfaXByLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyogJElkOiBpcnFfaXByLmMsdiAxLjEuMi4xIDIwMDIvMTEvMTcgMTA6NTM6NDMgbXJicm93biBFeHAgJAotICoKLSAqIGxpbnV4L2FyY2gvc2gva2VybmVsL2lycV9pcHIuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5OSAgTmlpYmUgWXV0YWthICYgVGFrZXNoaSBZYWVnYXNoaQotICogQ29weXJpZ2h0IChDKSAyMDAwICBLYXp1bW90byBLb2ppbWEKLSAqIENvcHlyaWdodCAoQykgMjAwMyBUYWthc2hpIEt1c3VkYSA8a3VzdWRhLXRha2FzaGlAaGl0YWNoaS11bC5jby5qcD4KLSAqCi0gKiBJbnRlcnJ1cHQgaGFuZGxpbmcgZm9yIElQUi1iYXNlZCBJUlEuCi0gKgotICogU3VwcG9ydGVkIHN5c3RlbToKLSAqCU9uLWNoaXAgc3VwcG9ydGluZyBtb2R1bGVzIChUTVUsIFJUQywgZXRjLikuCi0gKglPbi1jaGlwIHN1cHBvcnRpbmcgbW9kdWxlcyBmb3IgU0g3NzA5L1NINzcwOUEvU0g3NzI5L1NINzMwMC4KLSAqCUhpdGFjaGkgU29sdXRpb25FbmdpbmUgZXh0ZXJuYWwgSS9POgotICoJCU1TNzcwOVNFMDEsIE1TNzcwOUFTRTAxLCBhbmQgTVM3NzUwU0UwMQotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+Ci0KLXN0cnVjdCBpcHJfZGF0YSB7Ci0JdW5zaWduZWQgaW50IGFkZHI7CS8qIEFkZHJlc3Mgb2YgSW50ZXJydXB0IFByaW9yaXR5IFJlZ2lzdGVyICovCi0JaW50IHNoaWZ0OwkJLyogU2hpZnRzIG9mIHRoZSAxNi1iaXQgZGF0YSAqLwotCWludCBwcmlvcml0eTsJCS8qIFRoZSBwcmlvcml0eSAqLwotfTsKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2RhdGFbTlJfSVJRU107Ci0KLXN0YXRpYyB2b2lkIGVuYWJsZV9pcHJfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIHZvaWQgZGlzYWJsZV9pcHJfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotCi0vKiBzaHV0ZG93biBpcyBzYW1lIGFzICJkaXNhYmxlIiAqLwotI2RlZmluZSBzaHV0ZG93bl9pcHJfaXJxIGRpc2FibGVfaXByX2lycQotCi1zdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfaXByKHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgdm9pZCBlbmRfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2lwcl9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQllbmFibGVfaXByX2lycShpcnEpOwotCXJldHVybiAwOyAvKiBuZXZlciBhbnl0aGluZyBwZW5kaW5nICovCi19Ci0KLXN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaXByX2lycV90eXBlID0gewotCS50eXBlbmFtZSA9ICJJUFItSVJRIiwKLQkuc3RhcnR1cCA9IHN0YXJ0dXBfaXByX2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl9pcHJfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfaXByX2lycSwKLQkuZGlzYWJsZSA9IGRpc2FibGVfaXByX2lycSwKLQkuYWNrID0gbWFza19hbmRfYWNrX2lwciwKLQkuZW5kID0gZW5kX2lwcl9pcnEKLX07Ci0KLXN0YXRpYyB2b2lkIGRpc2FibGVfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIGxvbmcgdmFsLCBmbGFnczsKLQl1bnNpZ25lZCBpbnQgYWRkciA9IGlwcl9kYXRhW2lycV0uYWRkcjsKLQl1bnNpZ25lZCBzaG9ydCBtYXNrID0gMHhmZmZmIF4gKDB4MGYgPDwgaXByX2RhdGFbaXJxXS5zaGlmdCk7Ci0KLQkvKiBTZXQgdGhlIHByaW9yaXR5IGluIElQUiB0byAwICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXZhbCA9IGN0cmxfaW53KGFkZHIpOwotCXZhbCAmPSBtYXNrOwotCWN0cmxfb3V0dyh2YWwsIGFkZHIpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgZW5hYmxlX2lwcl9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bnNpZ25lZCBsb25nIHZhbCwgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGFkZHIgPSBpcHJfZGF0YVtpcnFdLmFkZHI7Ci0JaW50IHByaW9yaXR5ID0gaXByX2RhdGFbaXJxXS5wcmlvcml0eTsKLQl1bnNpZ25lZCBzaG9ydCB2YWx1ZSA9IChwcmlvcml0eSA8PCBpcHJfZGF0YVtpcnFdLnNoaWZ0KTsKLQotCS8qIFNldCBwcmlvcml0eSBpbiBJUFIgYmFjayB0byBvcmlnaW5hbCB2YWx1ZSAqLwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl2YWwgPSBjdHJsX2ludyhhZGRyKTsKLQl2YWwgfD0gdmFsdWU7Ci0JY3RybF9vdXR3KHZhbCwgYWRkcik7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfaXByKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZGlzYWJsZV9pcHJfaXJxKGlycSk7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDcpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KQotCS8qIFRoaXMgaXMgbmVlZGVkIHdoZW4gd2UgdXNlIGVkZ2UgdHJpZ2dlcmVkIHNldHRpbmcgKi8KLQkvKiBYWFg6IElzIGl0IHJlYWxseSBuZWVkZWQ/ICovCi0JaWYgKElSUTBfSVJRIDw9IGlycSAmJiBpcnEgPD0gSVJRNV9JUlEpIHsKLQkJLyogQ2xlYXIgZXh0ZXJuYWwgaW50ZXJydXB0IHJlcXVlc3QgKi8KLQkJaW50IGEgPSBjdHJsX2luYihJTlRDX0lSUjApOwotCQlhICY9IH4oMSA8PCAoaXJxIC0gSVJRMF9JUlEpKTsKLQkJY3RybF9vdXRiKGEsIElOVENfSVJSMCk7Ci0JfQotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIGVuZF9pcHJfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkpCi0JCWVuYWJsZV9pcHJfaXJxKGlycSk7Ci19Ci0KLXZvaWQgbWFrZV9pcHJfaXJxKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBhZGRyLCBpbnQgcG9zLCBpbnQgcHJpb3JpdHkpCi17Ci0JZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7Ci0JaXByX2RhdGFbaXJxXS5hZGRyID0gYWRkcjsKLQlpcHJfZGF0YVtpcnFdLnNoaWZ0ID0gcG9zKjQ7IC8qIFBPU2l0aW9uICgwLTMpIHggNCBtZWFucyBzaGlmdCAqLwotCWlwcl9kYXRhW2lycV0ucHJpb3JpdHkgPSBwcmlvcml0eTsKLQotCWlycV9kZXNjW2lycV0uaGFuZGxlciA9ICZpcHJfaXJxX3R5cGU7Ci0JZGlzYWJsZV9pcHJfaXJxKGlycSk7Ci19Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDcpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpCi1zdGF0aWMgdW5zaWduZWQgY2hhciBwaW50X21hcFsyNTZdOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcG9ydGNyX21hc2sgPSAwOwotCi1zdGF0aWMgdm9pZCBlbmFibGVfcGludF9pcnEodW5zaWduZWQgaW50IGlycSk7Ci1zdGF0aWMgdm9pZCBkaXNhYmxlX3BpbnRfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotCi0vKiBzaHV0ZG93biBpcyBzYW1lIGFzICJkaXNhYmxlIiAqLwotI2RlZmluZSBzaHV0ZG93bl9waW50X2lycSBkaXNhYmxlX3BpbnRfaXJxCi0KLXN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19waW50KHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgdm9pZCBlbmRfcGludF9pcnEodW5zaWduZWQgaW50IGlycSk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9waW50X2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWVuYWJsZV9waW50X2lycShpcnEpOwotCXJldHVybiAwOyAvKiBuZXZlciBhbnl0aGluZyBwZW5kaW5nICovCi19Ci0KLXN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgcGludF9pcnFfdHlwZSA9IHsKLQkudHlwZW5hbWUgPSAiUElOVC1JUlEiLAotCS5zdGFydHVwID0gc3RhcnR1cF9waW50X2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl9waW50X2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX3BpbnRfaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV9waW50X2lycSwKLQkuYWNrID0gbWFza19hbmRfYWNrX3BpbnQsCi0JLmVuZCA9IGVuZF9waW50X2lycQotfTsKLQotc3RhdGljIHZvaWQgZGlzYWJsZV9waW50X2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIGxvbmcgdmFsLCBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl2YWwgPSBjdHJsX2ludyhJTlRDX0lOVEVSKTsKLQl2YWwgJj0gfigxIDw8IChpcnEgLSBQSU5UX0lSUV9CQVNFKSk7Ci0JY3RybF9vdXR3KHZhbCwgSU5UQ19JTlRFUik7CS8qIGRpc2FibGUgUElOVG4gKi8KLQlwb3J0Y3JfbWFzayAmPSB+KDMgPDwgKGlycSAtIFBJTlRfSVJRX0JBU0UpKjIpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgZW5hYmxlX3BpbnRfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWwsIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXZhbCA9IGN0cmxfaW53KElOVENfSU5URVIpOwotCXZhbCB8PSAxIDw8IChpcnEgLSBQSU5UX0lSUV9CQVNFKTsKLQljdHJsX291dHcodmFsLCBJTlRDX0lOVEVSKTsJLyogZW5hYmxlIFBJTlRuICovCi0JcG9ydGNyX21hc2sgfD0gMyA8PCAoaXJxIC0gUElOVF9JUlFfQkFTRSkqMjsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19waW50KHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZGlzYWJsZV9waW50X2lycShpcnEpOwotfQotCi1zdGF0aWMgdm9pZCBlbmRfcGludF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUR8SVJRX0lOUFJPR1JFU1MpKSkKLQkJZW5hYmxlX3BpbnRfaXJxKGlycSk7Ci19Ci0KLXZvaWQgbWFrZV9waW50X2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOwotCWlycV9kZXNjW2lycV0uaGFuZGxlciA9ICZwaW50X2lycV90eXBlOwotCWRpc2FibGVfcGludF9pcnEoaXJxKTsKLX0KLSNlbmRpZgotCi12b2lkIF9faW5pdCBpbml0X0lSUSh2b2lkKQotewotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSkKLQlpbnQgaTsKLSNlbmRpZgotCi0JbWFrZV9pcHJfaXJxKFRJTUVSX0lSUSwgVElNRVJfSVBSX0FERFIsIFRJTUVSX0lQUl9QT1MsIFRJTUVSX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoVElNRVIxX0lSUSwgVElNRVIxX0lQUl9BRERSLCBUSU1FUjFfSVBSX1BPUywgVElNRVIxX1BSSU9SSVRZKTsKLSNpZiBkZWZpbmVkKENPTkZJR19TSF9SVEMpCi0JbWFrZV9pcHJfaXJxKFJUQ19JUlEsIFJUQ19JUFJfQUREUiwgUlRDX0lQUl9QT1MsIFJUQ19QUklPUklUWSk7Ci0jZW5kaWYKLQotI2lmZGVmIFNDSV9FUklfSVJRCi0JbWFrZV9pcHJfaXJxKFNDSV9FUklfSVJRLCBTQ0lfSVBSX0FERFIsIFNDSV9JUFJfUE9TLCBTQ0lfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShTQ0lfUlhJX0lSUSwgU0NJX0lQUl9BRERSLCBTQ0lfSVBSX1BPUywgU0NJX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoU0NJX1RYSV9JUlEsIFNDSV9JUFJfQUREUiwgU0NJX0lQUl9QT1MsIFNDSV9QUklPUklUWSk7Ci0jZW5kaWYKLQotI2lmZGVmIFNDSUYxX0VSSV9JUlEKLQltYWtlX2lwcl9pcnEoU0NJRjFfRVJJX0lSUSwgU0NJRjFfSVBSX0FERFIsIFNDSUYxX0lQUl9QT1MsIFNDSUYxX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoU0NJRjFfUlhJX0lSUSwgU0NJRjFfSVBSX0FERFIsIFNDSUYxX0lQUl9QT1MsIFNDSUYxX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoU0NJRjFfQlJJX0lSUSwgU0NJRjFfSVBSX0FERFIsIFNDSUYxX0lQUl9QT1MsIFNDSUYxX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoU0NJRjFfVFhJX0lSUSwgU0NJRjFfSVBSX0FERFIsIFNDSUYxX0lQUl9QT1MsIFNDSUYxX1BSSU9SSVRZKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKQotCW1ha2VfaXByX2lycShTQ0lGMF9JUlEsIFNDSUYwX0lQUl9BRERSLCBTQ0lGMF9JUFJfUE9TLCBTQ0lGMF9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKERNVEUyX0lSUSwgRE1BMV9JUFJfQUREUiwgRE1BMV9JUFJfUE9TLCBETUExX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoRE1URTNfSVJRLCBETUExX0lQUl9BRERSLCBETUExX0lQUl9QT1MsIERNQTFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShWSU9fSVJRLCBWSU9fSVBSX0FERFIsIFZJT19JUFJfUE9TLCBWSU9fUFJJT1JJVFkpOwotI2VuZGlmCi0KLSNpZmRlZiBTQ0lGX0VSSV9JUlEKLQltYWtlX2lwcl9pcnEoU0NJRl9FUklfSVJRLCBTQ0lGX0lQUl9BRERSLCBTQ0lGX0lQUl9QT1MsIFNDSUZfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShTQ0lGX1JYSV9JUlEsIFNDSUZfSVBSX0FERFIsIFNDSUZfSVBSX1BPUywgU0NJRl9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFNDSUZfQlJJX0lSUSwgU0NJRl9JUFJfQUREUiwgU0NJRl9JUFJfUE9TLCBTQ0lGX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoU0NJRl9UWElfSVJRLCBTQ0lGX0lQUl9BRERSLCBTQ0lGX0lQUl9QT1MsIFNDSUZfUFJJT1JJVFkpOwotI2VuZGlmCi0KLSNpZmRlZiBJUkRBX0VSSV9JUlEKLQltYWtlX2lwcl9pcnEoSVJEQV9FUklfSVJRLCBJUkRBX0lQUl9BRERSLCBJUkRBX0lQUl9QT1MsIElSREFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJUkRBX1JYSV9JUlEsIElSREFfSVBSX0FERFIsIElSREFfSVBSX1BPUywgSVJEQV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElSREFfQlJJX0lSUSwgSVJEQV9JUFJfQUREUiwgSVJEQV9JUFJfUE9TLCBJUkRBX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSVJEQV9UWElfSVJRLCBJUkRBX0lQUl9BRERSLCBJUkRBX0lQUl9QT1MsIElSREFfUFJJT1JJVFkpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDcpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KQotCS8qCi0JICogSW5pdGlhbGl6ZSB0aGUgSW50ZXJydXB0IENvbnRyb2xsZXIgKElOVEMpCi0JICogcmVnaXN0ZXJzIHRvIHRoZWlyIHBvd2VyIG9uIHZhbHVlcwotCSAqLwotCi0JLyoKLQkgKiBFbmFibGUgZXh0ZXJuYWwgaXJxIChJTlRDIElSUSBtb2RlKS4KLQkgKiBZb3Ugc2hvdWxkIHNldCBjb3JyZXNwb25kaW5nIGJpdHMgb2YgUEZDIHRvICIwMCIKLQkgKiB0byBlbmFibGUgdGhlc2UgaW50ZXJydXB0cy4KLQkgKi8KLQltYWtlX2lwcl9pcnEoSVJRMF9JUlEsIElSUTBfSVBSX0FERFIsIElSUTBfSVBSX1BPUywgSVJRMF9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElSUTFfSVJRLCBJUlExX0lQUl9BRERSLCBJUlExX0lQUl9QT1MsIElSUTFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJUlEyX0lSUSwgSVJRMl9JUFJfQUREUiwgSVJRMl9JUFJfUE9TLCBJUlEyX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSVJRM19JUlEsIElSUTNfSVBSX0FERFIsIElSUTNfSVBSX1BPUywgSVJRM19QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElSUTRfSVJRLCBJUlE0X0lQUl9BRERSLCBJUlE0X0lQUl9QT1MsIElSUTRfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJUlE1X0lSUSwgSVJRNV9JUFJfQUREUiwgSVJRNV9JUFJfUE9TLCBJUlE1X1BSSU9SSVRZKTsKLSNpZiAhZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKQotCW1ha2VfaXByX2lycShQSU5UMF9JUlEsIFBJTlQwX0lQUl9BRERSLCBQSU5UMF9JUFJfUE9TLCBQSU5UMF9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFBJTlQ4X0lSUSwgUElOVDhfSVBSX0FERFIsIFBJTlQ4X0lQUl9QT1MsIFBJTlQ4X1BSSU9SSVRZKTsKLQllbmFibGVfaXByX2lycShQSU5UMF9JUlEpOwotCWVuYWJsZV9pcHJfaXJxKFBJTlQ4X0lSUSk7Ci0KLQlmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQltYWtlX3BpbnRfaXJxKFBJTlRfSVJRX0JBU0UgKyBpKTsKLQlmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKLQl7Ci0JCWlmKGkgJiAxKSBwaW50X21hcFtpXSA9IDA7Ci0JCWVsc2UgaWYoaSAmIDIpIHBpbnRfbWFwW2ldID0gMTsKLQkJZWxzZSBpZihpICYgNCkgcGludF9tYXBbaV0gPSAyOwotCQllbHNlIGlmKGkgJiA4KSBwaW50X21hcFtpXSA9IDM7Ci0JCWVsc2UgaWYoaSAmIDB4MTApIHBpbnRfbWFwW2ldID0gNDsKLQkJZWxzZSBpZihpICYgMHgyMCkgcGludF9tYXBbaV0gPSA1OwotCQllbHNlIGlmKGkgJiAweDQwKSBwaW50X21hcFtpXSA9IDY7Ci0JCWVsc2UgaWYoaSAmIDB4ODApIHBpbnRfbWFwW2ldID0gNzsKLQl9Ci0jZW5kaWYgLyogIUNPTkZJR19DUFVfU1VCVFlQRV9TSDczMDAgKi8KLSNlbmRpZiAvKiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3IHx8IENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkgIHx8IENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDAqLwotCi0jaWZkZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDAKLQlpbml0X0lSUV9pbnRjMigpOwotI2VuZGlmCi0KLQkvKiBQZXJmb3JtIHRoZSBtYWNoaW5lIHNwZWNpZmljIGluaXRpYWxpc2F0aW9uICovCi0JaWYgKHNoX212Lm12X2luaXRfaXJxICE9IE5VTEwpIHsKLQkJc2hfbXYubXZfaW5pdF9pcnEoKTsKLQl9Ci19Ci0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3KSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkKLWludCBpcHJfaXJxX2RlbXV4KGludCBpcnEpCi17Ci0jaWYgIWRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCkKLQl1bnNpZ25lZCBsb25nIGNyZWcsIGRyZWcsIGQsIHNhdjsKLQotCWlmKGlycSA9PSBQSU5UMF9JUlEpCi0JewotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNykKLQkJY3JlZyA9IFBPUlRfUEFDUjsKLQkJZHJlZyA9IFBPUlRfUEFEUjsKLSNlbHNlCi0JCWNyZWcgPSBQT1JUX1BDQ1I7Ci0JCWRyZWcgPSBQT1JUX1BDRFI7Ci0jZW5kaWYKLQkJc2F2ID0gY3RybF9pbncoY3JlZyk7Ci0JCWN0cmxfb3V0dyhzYXYgfCBwb3J0Y3JfbWFzaywgY3JlZyk7Ci0JCWQgPSAofmN0cmxfaW5iKGRyZWcpIF4gY3RybF9pbncoSU5UQ19JQ1IyKSkgJiBjdHJsX2ludyhJTlRDX0lOVEVSKSAmIDB4ZmY7Ci0JCWN0cmxfb3V0dyhzYXYsIGNyZWcpOwotCQlpZihkID09IDApIHJldHVybiBpcnE7Ci0JCXJldHVybiBQSU5UX0lSUV9CQVNFICsgcGludF9tYXBbZF07Ci0JfQotCWVsc2UgaWYoaXJxID09IFBJTlQ4X0lSUSkKLQl7Ci0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3KQotCQljcmVnID0gUE9SVF9QQkNSOwotCQlkcmVnID0gUE9SVF9QQkRSOwotI2Vsc2UKLQkJY3JlZyA9IFBPUlRfUEZDUjsKLQkJZHJlZyA9IFBPUlRfUEZEUjsKLSNlbmRpZgotCQlzYXYgPSBjdHJsX2ludyhjcmVnKTsKLQkJY3RybF9vdXR3KHNhdiB8IChwb3J0Y3JfbWFzayA+PiAxNiksIGNyZWcpOwotCQlkID0gKH5jdHJsX2luYihkcmVnKSBeIChjdHJsX2ludyhJTlRDX0lDUjIpID4+IDgpKSAmIChjdHJsX2ludyhJTlRDX0lOVEVSKSA+PiA4KSAmIDB4ZmY7Ci0JCWN0cmxfb3V0dyhzYXYsIGNyZWcpOwotCQlpZihkID09IDApIHJldHVybiBpcnE7Ci0JCXJldHVybiBQSU5UX0lSUV9CQVNFICsgOCArIHBpbnRfbWFwW2RdOwotCX0KLSNlbmRpZgotCXJldHVybiBpcnE7Ci19Ci0jZW5kaWYKLQotRVhQT1JUX1NZTUJPTChtYWtlX2lwcl9pcnEpOwotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL01ha2VmaWxlIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9NYWtlZmlsZQppbmRleCBhNjQ1MzJlLi5iNTRkYmI5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL01ha2VmaWxlCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvTWFrZWZpbGUKQEAgLTQsMyArNCwxMCBAQAogCiBvYmoteQk6PSBleC5vIHByb2JlLm8KIAorY2xvY2stJChDT05GSUdfQ1BVX1NIMykJCQk6PSBjbG9jay1zaDMubworY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKQk6PSBjbG9jay1zaDczMDAubworY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KQk6PSBjbG9jay1zaDc3MDUubworY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5KQk6PSBjbG9jay1zaDc3MDkubworCitvYmoteQkrPSAkKGNsb2NrLXkpCisKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvY2xvY2stc2gzLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2Nsb2NrLXNoMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYzk0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2Nsb2NrLXNoMy5jCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBhcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2Nsb2NrLXNoMy5jCisgKgorICogR2VuZXJpYyBTSC0zIHN1cHBvcnQgZm9yIHRoZSBjbG9jayBmcmFtZXdvcmsKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1ICBQYXVsIE11bmR0CisgKgorICogRlJRQ1IgcGFyc2luZyBoYWNrZWQgb3V0IG9mIGFyY2gvc2gva2VybmVsL3RpbWUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTkgIFRldHN1eWEgT2thZGEgJiBOaWliZSBZdXRha2EKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgIFBoaWxpcHAgUnVtcGYgPHBydW1wZkB0dXgub3JnPgorICogIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCAgUGF1bCBNdW5kdAorICogIENvcHlyaWdodCAoQykgMjAwMiAgTS4gUi4gQnJvd24gIDxtcmJyb3duQGxpbnV4LXNoLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vY2xvY2suaD4KKyNpbmNsdWRlIDxhc20vZnJlcS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitzdGF0aWMgaW50IHN0Y19tdWx0aXBsaWVyc1tdID0geyAxLCAyLCAzLCA0LCA2LCAxLCAxLCAxIH07CitzdGF0aWMgaW50IGlmY19kaXZpc29yc1tdICAgID0geyAxLCAyLCAzLCA0LCAxLCAxLCAxLCAxIH07CitzdGF0aWMgaW50IHBmY19kaXZpc29yc1tdICAgID0geyAxLCAyLCAzLCA0LCA2LCAxLCAxLCAxIH07CisKK3N0YXRpYyB2b2lkIG1hc3Rlcl9jbGtfaW5pdChzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGZycWNyID0gY3RybF9pbncoRlJRQ1IpOworCWludCBpZHggPSAoKGZycWNyICYgMHgyMDAwKSA+PiAxMSkgfCAoZnJxY3IgJiAweDAwMDMpOworCisJY2xrLT5yYXRlICo9IHBmY19kaXZpc29yc1tpZHhdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2gzX21hc3Rlcl9jbGtfb3BzID0geworCS5pbml0CQk9IG1hc3Rlcl9jbGtfaW5pdCwKK307CisKK3N0YXRpYyB2b2lkIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgZnJxY3IgPSBjdHJsX2ludyhGUlFDUik7CisJaW50IGlkeCA9ICgoZnJxY3IgJiAweDIwMDApID4+IDExKSB8IChmcnFjciAmIDB4MDAwMyk7CisKKwljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIHBmY19kaXZpc29yc1tpZHhdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2gzX21vZHVsZV9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gbW9kdWxlX2Nsa19yZWNhbGMsCit9OworCitzdGF0aWMgdm9pZCBidXNfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGZycWNyID0gY3RybF9pbncoRlJRQ1IpOworCWludCBpZHggPSAoKGZycWNyICYgMHg4MDAwKSA+PiAxMykgfCAoKGZycWNyICYgMHgwMDMwKSA+PiA0KTsKKworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gc3RjX211bHRpcGxpZXJzW2lkeF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDNfYnVzX2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBidXNfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyB2b2lkIGNwdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgZnJxY3IgPSBjdHJsX2ludyhGUlFDUik7CisJaW50IGlkeCA9ICgoZnJxY3IgJiAweDQwMDApID4+IDEyKSB8ICgoZnJxY3IgJiAweDAwMGMpID4+IDIpOworCisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBpZmNfZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoM19jcHVfY2xrX29wcyA9IHsKKwkucmVjYWxjCQk9IGNwdV9jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfb3BzICpzaDNfY2xrX29wc1tdID0geworCSZzaDNfbWFzdGVyX2Nsa19vcHMsCisJJnNoM19tb2R1bGVfY2xrX29wcywKKwkmc2gzX2J1c19jbGtfb3BzLAorCSZzaDNfY3B1X2Nsa19vcHMsCit9OworCit2b2lkIF9faW5pdCBhcmNoX2luaXRfY2xrX29wcyhzdHJ1Y3QgY2xrX29wcyAqKm9wcywgaW50IGlkeCkKK3sKKwlpZiAoaWR4IDwgQVJSQVlfU0laRShzaDNfY2xrX29wcykpCisJCSpvcHMgPSBzaDNfY2xrX29wc1tpZHhdOworfQorCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2Nsb2NrLXNoNzMwMC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9jbG9jay1zaDczMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODA0MTc0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9jbG9jay1zaDczMDAuYwpAQCAtMCwwICsxLDc4IEBACisvKgorICogYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9jbG9jay1zaDczMDAuYworICoKKyAqIFNINzMwMCBzdXBwb3J0IGZvciB0aGUgY2xvY2sgZnJhbWV3b3JrCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSAgUGF1bCBNdW5kdAorICoKKyAqIEZSUUNSIHBhcnNpbmcgaGFja2VkIG91dCBvZiBhcmNoL3NoL2tlcm5lbC90aW1lLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5ICBUZXRzdXlhIE9rYWRhICYgTmlpYmUgWXV0YWthCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwICBQaGlsaXBwIFJ1bXBmIDxwcnVtcGZAdHV4Lm9yZz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQgIFBhdWwgTXVuZHQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgIE0uIFIuIEJyb3duICA8bXJicm93bkBsaW51eC1zaC5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXNtL2ZyZXEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworc3RhdGljIGludCBtZF90YWJsZVtdID0geyAxLCAyLCAzLCA0LCA2LCA4LCAxMiB9OworCitzdGF0aWMgdm9pZCBtYXN0ZXJfY2xrX2luaXQoc3RydWN0IGNsayAqY2xrKQoreworCWNsay0+cmF0ZSAqPSBtZF90YWJsZVtjdHJsX2ludyhGUlFDUikgJiAweDAwMDddOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3MzAwX21hc3Rlcl9jbGtfb3BzID0geworCS5pbml0CQk9IG1hc3Rlcl9jbGtfaW5pdCwKK307CisKK3N0YXRpYyB2b2lkIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgaWR4ID0gKGN0cmxfaW53KEZSUUNSKSAmIDB4MDAwNyk7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBtZF90YWJsZVtpZHhdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3MzAwX21vZHVsZV9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gbW9kdWxlX2Nsa19yZWNhbGMsCit9OworCitzdGF0aWMgdm9pZCBidXNfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGlkeCA9IChjdHJsX2ludyhGUlFDUikgJiAweDA3MDApID4+IDg7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBtZF90YWJsZVtpZHhdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3MzAwX2J1c19jbGtfb3BzID0geworCS5yZWNhbGMJCT0gYnVzX2Nsa19yZWNhbGMsCit9OworCitzdGF0aWMgdm9pZCBjcHVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGlkeCA9IChjdHJsX2ludyhGUlFDUikgJiAweDAwNzApID4+IDQ7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBtZF90YWJsZVtpZHhdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3MzAwX2NwdV9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gY3B1X2Nsa19yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsa19vcHMgKnNoNzMwMF9jbGtfb3BzW10gPSB7CisJJnNoNzMwMF9tYXN0ZXJfY2xrX29wcywKKwkmc2g3MzAwX21vZHVsZV9jbGtfb3BzLAorCSZzaDczMDBfYnVzX2Nsa19vcHMsCisJJnNoNzMwMF9jcHVfY2xrX29wcywKK307CisKK3ZvaWQgX19pbml0IGFyY2hfaW5pdF9jbGtfb3BzKHN0cnVjdCBjbGtfb3BzICoqb3BzLCBpbnQgaWR4KQoreworCWlmIChpZHggPCBBUlJBWV9TSVpFKHNoNzMwMF9jbGtfb3BzKSkKKwkJKm9wcyA9IHNoNzMwMF9jbGtfb3BzW2lkeF07Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvY2xvY2stc2g3NzA1LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2Nsb2NrLXNoNzcwNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZGJmMzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2Nsb2NrLXNoNzcwNS5jCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBhcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2Nsb2NrLXNoNzcwNS5jCisgKgorICogU0g3NzA1IHN1cHBvcnQgZm9yIHRoZSBjbG9jayBmcmFtZXdvcmsKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1ICBQYXVsIE11bmR0CisgKgorICogRlJRQ1IgcGFyc2luZyBoYWNrZWQgb3V0IG9mIGFyY2gvc2gva2VybmVsL3RpbWUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTkgIFRldHN1eWEgT2thZGEgJiBOaWliZSBZdXRha2EKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgIFBoaWxpcHAgUnVtcGYgPHBydW1wZkB0dXgub3JnPgorICogIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCAgUGF1bCBNdW5kdAorICogIENvcHlyaWdodCAoQykgMjAwMiAgTS4gUi4gQnJvd24gIDxtcmJyb3duQGxpbnV4LXNoLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vY2xvY2suaD4KKyNpbmNsdWRlIDxhc20vZnJlcS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisvKgorICogU0g3NzA1IHVzZXMgdGhlIHNhbWUgZGl2aXNvcnMgYXMgdGhlIGdlbmVyaWMgU0gtMyBjYXNlLCBpdCdzIGp1c3QgdGhlCisgKiBGUlFDUiBsYXlvdXQgdGhhdCBpcyBhIGJpdCBkaWZmZXJlbnQuLgorICovCitzdGF0aWMgaW50IHN0Y19tdWx0aXBsaWVyc1tdID0geyAxLCAyLCAzLCA0LCA2LCAxLCAxLCAxIH07CitzdGF0aWMgaW50IGlmY19kaXZpc29yc1tdICAgID0geyAxLCAyLCAzLCA0LCAxLCAxLCAxLCAxIH07CitzdGF0aWMgaW50IHBmY19kaXZpc29yc1tdICAgID0geyAxLCAyLCAzLCA0LCA2LCAxLCAxLCAxIH07CisKK3N0YXRpYyB2b2lkIG1hc3Rlcl9jbGtfaW5pdChzdHJ1Y3QgY2xrICpjbGspCit7CisJY2xrLT5yYXRlICo9IHBmY19kaXZpc29yc1tjdHJsX2ludyhGUlFDUikgJiAweDAwMDNdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NzA1X21hc3Rlcl9jbGtfb3BzID0geworCS5pbml0CQk9IG1hc3Rlcl9jbGtfaW5pdCwKK307CisKK3N0YXRpYyB2b2lkIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgaWR4ID0gY3RybF9pbncoRlJRQ1IpICYgMHgwMDAzOworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gcGZjX2Rpdmlzb3JzW2lkeF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3MDVfbW9kdWxlX2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBtb2R1bGVfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyB2b2lkIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgaWR4ID0gKGN0cmxfaW53KEZSUUNSKSAmIDB4MDMwMCkgPj4gODsKKwljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIHN0Y19tdWx0aXBsaWVyc1tpZHhdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NzA1X2J1c19jbGtfb3BzID0geworCS5yZWNhbGMJCT0gYnVzX2Nsa19yZWNhbGMsCit9OworCitzdGF0aWMgdm9pZCBjcHVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGlkeCA9IChjdHJsX2ludyhGUlFDUikgJiAweDAwMzApID4+IDQ7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBpZmNfZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzcwNV9jcHVfY2xrX29wcyA9IHsKKwkucmVjYWxjCQk9IGNwdV9jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfb3BzICpzaDc3MDVfY2xrX29wc1tdID0geworCSZzaDc3MDVfbWFzdGVyX2Nsa19vcHMsCisJJnNoNzcwNV9tb2R1bGVfY2xrX29wcywKKwkmc2g3NzA1X2J1c19jbGtfb3BzLAorCSZzaDc3MDVfY3B1X2Nsa19vcHMsCit9OworCit2b2lkIF9faW5pdCBhcmNoX2luaXRfY2xrX29wcyhzdHJ1Y3QgY2xrX29wcyAqKm9wcywgaW50IGlkeCkKK3sKKwlpZiAoaWR4IDwgQVJSQVlfU0laRShzaDc3MDVfY2xrX29wcykpCisJCSpvcHMgPSBzaDc3MDVfY2xrX29wc1tpZHhdOworfQorCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2Nsb2NrLXNoNzcwOS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9jbG9jay1zaDc3MDkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDQ2MWE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9jbG9jay1zaDc3MDkuYwpAQCAtMCwwICsxLDk2IEBACisvKgorICogYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9jbG9jay1zaDc3MDkuYworICoKKyAqIFNINzcwOSBzdXBwb3J0IGZvciB0aGUgY2xvY2sgZnJhbWV3b3JrCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSAgQW5kcml5IFNrdWx5c2gKKyAqCisgKiBCYXNlZCBvbiBhcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2Nsb2NrLXNoNzcwNS5jCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1ICBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXNtL2ZyZXEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworc3RhdGljIGludCBzdGNfbXVsdGlwbGllcnNbXSA9IHsgMSwgMiwgNCwgOCwgMywgNiwgMSwgMSB9Oworc3RhdGljIGludCBpZmNfZGl2aXNvcnNbXSAgICA9IHsgMSwgMiwgNCwgMSwgMywgMSwgMSwgMSB9Oworc3RhdGljIGludCBwZmNfZGl2aXNvcnNbXSAgICA9IHsgMSwgMiwgNCwgMSwgMywgNiwgMSwgMSB9OworCitzdGF0aWMgdm9pZCBzZXRfYnVzX3BhcmVudChzdHJ1Y3QgY2xrICpjbGspCit7CisJc3RydWN0IGNsayAqYnVzX2NsayA9IGNsa19nZXQoImJ1c19jbGsiKTsKKwljbGstPnBhcmVudCA9IGJ1c19jbGs7CisJY2xrX3B1dChidXNfY2xrKTsKK30KKworc3RhdGljIHZvaWQgbWFzdGVyX2Nsa19pbml0KHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgZnJxY3IgPSBjdHJsX2ludyhGUlFDUik7CisJaW50IGlkeCA9ICgoZnJxY3IgJiAweDIwMDApID4+IDExKSB8IChmcnFjciAmIDB4MDAwMyk7CisKKwljbGstPnJhdGUgKj0gcGZjX2Rpdmlzb3JzW2lkeF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3MDlfbWFzdGVyX2Nsa19vcHMgPSB7CisJLmluaXQJCT0gbWFzdGVyX2Nsa19pbml0LAorfTsKKworc3RhdGljIHZvaWQgbW9kdWxlX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCWludCBmcnFjciA9IGN0cmxfaW53KEZSUUNSKTsKKwlpbnQgaWR4ID0gKChmcnFjciAmIDB4MjAwMCkgPj4gMTEpIHwgKGZycWNyICYgMHgwMDAzKTsKKworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gcGZjX2Rpdmlzb3JzW2lkeF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3MDlfbW9kdWxlX2Nsa19vcHMgPSB7CisjaWZkZWYgQ0xPQ0tfTU9ERV8wXzFfMl83CisJLmluaXQJCT0gc2V0X2J1c19wYXJlbnQsCisjZW5kaWYKKwkucmVjYWxjCQk9IG1vZHVsZV9jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHZvaWQgYnVzX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCWludCBmcnFjciA9IGN0cmxfaW53KEZSUUNSKTsKKwlpbnQgaWR4ID0gKGZycWNyICYgMHgwMDgwKSA/CisJCSgoZnJxY3IgJiAweDgwMDApID4+IDEzKSB8ICgoZnJxY3IgJiAweDAwMzApID4+IDQpIDogMTsKKworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlICogc3RjX211bHRpcGxpZXJzW2lkeF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3MDlfYnVzX2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBidXNfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyB2b2lkIGNwdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgZnJxY3IgPSBjdHJsX2ludyhGUlFDUik7CisJaW50IGlkeCA9ICgoZnJxY3IgJiAweDQwMDApID4+IDEyKSB8ICgoZnJxY3IgJiAweDAwMGMpID4+IDIpOworCisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBpZmNfZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzcwOV9jcHVfY2xrX29wcyA9IHsKKwkuaW5pdAkJPSBzZXRfYnVzX3BhcmVudCwKKwkucmVjYWxjCQk9IGNwdV9jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfb3BzICpzaDc3MDlfY2xrX29wc1tdID0geworCSZzaDc3MDlfbWFzdGVyX2Nsa19vcHMsCisJJnNoNzcwOV9tb2R1bGVfY2xrX29wcywKKwkmc2g3NzA5X2J1c19jbGtfb3BzLAorCSZzaDc3MDlfY3B1X2Nsa19vcHMsCit9OworCit2b2lkIF9faW5pdCBhcmNoX2luaXRfY2xrX29wcyhzdHJ1Y3QgY2xrX29wcyAqKm9wcywgaW50IGlkeCkKK3sKKwlpZiAoaWR4IDwgQVJSQVlfU0laRShzaDc3MDlfY2xrX29wcykpCisJCSpvcHMgPSBzaDc3MDlfY2xrX29wc1tpZHhdOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9NYWtlZmlsZSBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvTWFrZWZpbGUKaW5kZXggZWFkMTA3MS4uM2Q1Y2FmYyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L01ha2VmaWxlCkBAIC01LDYgKzUsMTUgQEAKIG9iai15CTo9IGV4Lm8gcHJvYmUubwogCiBvYmotJChDT05GSUdfU0hfRlBVKSAgICAgICAgICAgICAgICAgICAgKz0gZnB1Lm8KLW9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSkJKz0gaXJxX2ludGMyLm8KIG9iai0kKENPTkZJR19TSF9TVE9SRV9RVUVVRVMpCQkrPSBzcS5vCiAKKyMgUHJpbWFyeSBvbi1jaGlwIGNsb2NrcyAoY29tbW9uKQorY2xvY2stJChDT05GSUdfQ1BVX1NINCkJCQk6PSBjbG9jay1zaDQubworY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCkJOj0gY2xvY2stc2g3MzE4MC5vCitjbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzApCTo9IGNsb2NrLXNoNzc3MC5vCitjbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApCTo9IGNsb2NrLXNoNzc4MC5vCisKKyMgQWRkaXRpb25hbCBjbG9ja3MgYnkgc3VidHlwZQorY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMikJKz0gY2xvY2stc2g0LTIwMi5vCisKK29iai15CSs9ICQoY2xvY2steSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvY2xvY2stc2g0LTIwMi5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDQtMjAyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZkZjVmZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvY2xvY2stc2g0LTIwMi5jCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDQtMjAyLmMKKyAqCisgKiBBZGRpdGlvbmFsIFNINC0yMDIgc3VwcG9ydCBmb3IgdGhlIGNsb2NrIGZyYW1ld29yaworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxhc20vY2xvY2suaD4KKyNpbmNsdWRlIDxhc20vZnJlcS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIENQRzJfRlJRQ1IzCTB4ZmUwYTAwMTgKKworc3RhdGljIGludCBmcnFjcjNfZGl2aXNvcnNbXSA9IHsgMSwgMiwgMywgNCwgNiwgOCwgMTYgfTsKK3N0YXRpYyBpbnQgZnJxY3IzX3ZhbHVlc1tdICAgPSB7IDAsIDEsIDIsIDMsIDQsIDUsIDYgIH07CisKK3N0YXRpYyB2b2lkIGVtaV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgaWR4ID0gY3RybF9pbmwoQ1BHMl9GUlFDUjMpICYgMHgwMDA3OworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gZnJxY3IzX2Rpdmlzb3JzW2lkeF07Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZycWNyM19sb29rdXAoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJaW50IGRpdmlzb3IgPSBjbGstPnBhcmVudC0+cmF0ZSAvIHJhdGU7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmcnFjcjNfZGl2aXNvcnMpOyBpKyspCisJCWlmIChmcnFjcjNfZGl2aXNvcnNbaV0gPT0gZGl2aXNvcikKKwkJCXJldHVybiBmcnFjcjNfdmFsdWVzW2ldOworCisJLyogU2FmZSBmYWxsYmFjayAqLworCXJldHVybiA1OworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g0MjAyX2VtaV9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gZW1pX2Nsa19yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBzaDQyMDJfZW1pX2NsayA9IHsKKwkubmFtZQkJPSAiZW1pX2NsayIsCisJLmZsYWdzCQk9IENMS19BTFdBWVNfRU5BQkxFRCwKKwkub3BzCQk9ICZzaDQyMDJfZW1pX2Nsa19vcHMsCit9OworCitzdGF0aWMgdm9pZCBmZW1pX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCWludCBpZHggPSAoY3RybF9pbmwoQ1BHMl9GUlFDUjMpID4+IDMpICYgMHgwMDA3OworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gZnJxY3IzX2Rpdmlzb3JzW2lkeF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDQyMDJfZmVtaV9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gZmVtaV9jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgc2g0MjAyX2ZlbWlfY2xrID0geworCS5uYW1lCQk9ICJmZW1pX2NsayIsCisJLmZsYWdzCQk9IENMS19BTFdBWVNfRU5BQkxFRCwKKwkub3BzCQk9ICZzaDQyMDJfZmVtaV9jbGtfb3BzLAorfTsKKworc3RhdGljIHZvaWQgc2hvY19jbGtfaW5pdChzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGk7CisKKwkvKgorCSAqIEZvciBzb21lIHJlYXNvbiwgdGhlIHNob2NfY2xrIHNlZW1zIHRvIGJlIHNldCB0byBzb21lIHJlYWxseQorCSAqIGluc2FuZSB2YWx1ZSBhdCBib290ICh2YWx1ZXMgb3V0c2lkZSBvZiB0aGUgYWxsb3dhYmxlIGZyZXF1ZW5jeQorCSAqIHJhbmdlIGZvciBpbnN0YW5jZSkuIFdlIGRlYWwgd2l0aCB0aGlzIGJ5IHNjYWxpbmcgaXQgYmFjayBkb3duCisJICogdG8gc29tZXRoaW5nIHNlbnNpYmxlIGp1c3QgaW4gY2FzZS4KKwkgKgorCSAqIFN0YXJ0IHNjYWxpbmcgZnJvbSB0aGUgaGlnaCBlbmQgZG93biB1bnRpbCB3ZSBmaW5kIHNvbWV0aGluZworCSAqIHRoYXQgcGFzc2VzIHJhdGUgdmVyaWZpY2F0aW9uLi4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmcnFjcjNfZGl2aXNvcnMpOyBpKyspIHsKKwkJaW50IGRpdmlzb3IgPSBmcnFjcjNfZGl2aXNvcnNbaV07CisKKwkJaWYgKGNsay0+b3BzLT5zZXRfcmF0ZShjbGssIGNsay0+cGFyZW50LT5yYXRlIC8gZGl2aXNvcikgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCVdBUk5fT04oaSA9PSBBUlJBWV9TSVpFKGZycWNyM19kaXZpc29ycykpOwkvKiBVbmRlZmluZWQgY2xvY2sgKi8KK30KKworc3RhdGljIHZvaWQgc2hvY19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgaWR4ID0gKGN0cmxfaW5sKENQRzJfRlJRQ1IzKSA+PiA2KSAmIDB4MDAwNzsKKwljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGZycWNyM19kaXZpc29yc1tpZHhdOworfQorCitzdGF0aWMgaW50IHNob2NfY2xrX3ZlcmlmeV9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXN0cnVjdCBjbGsgKmJjbGsgPSBjbGtfZ2V0KCJidXNfY2xrIik7CisJdW5zaWduZWQgbG9uZyBiY2xrX3JhdGUgPSBjbGtfZ2V0X3JhdGUoYmNsayk7CisKKwljbGtfcHV0KGJjbGspOworCisJaWYgKHJhdGUgPiBiY2xrX3JhdGUpCisJCXJldHVybiAxOworCWlmIChyYXRlID4gNjYwMDAwMDApCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hvY19jbGtfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmcnFjcjM7CisJdW5zaWduZWQgaW50IHRtcDsKKworCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWV0aGluZyBzZW5zaWJsZSB0byBzd2l0Y2ggdG8gKi8KKwlpZiAoc2hvY19jbGtfdmVyaWZ5X3JhdGUoY2xrLCByYXRlKSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRtcCA9IGZycWNyM19sb29rdXAoY2xrLCByYXRlKTsKKworCWZycWNyMyA9IGN0cmxfaW5sKENQRzJfRlJRQ1IzKTsKKwlmcnFjcjMgJj0gfigweDAwMDcgPDwgNik7CisJZnJxY3IzIHw9IHRtcCA8PCA2OworCWN0cmxfb3V0bChmcnFjcjMsIENQRzJfRlJRQ1IzKTsKKworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gZnJxY3IzX2Rpdmlzb3JzW3RtcF07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNDIwMl9zaG9jX2Nsa19vcHMgPSB7CisJLmluaXQJCT0gc2hvY19jbGtfaW5pdCwKKwkucmVjYWxjCQk9IHNob2NfY2xrX3JlY2FsYywKKwkuc2V0X3JhdGUJPSBzaG9jX2Nsa19zZXRfcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNoNDIwMl9zaG9jX2NsayA9IHsKKwkubmFtZQkJPSAic2hvY19jbGsiLAorCS5mbGFncwkJPSBDTEtfQUxXQVlTX0VOQUJMRUQsCisJLm9wcwkJPSAmc2g0MjAyX3Nob2NfY2xrX29wcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpzaDQyMDJfb25jaGlwX2Nsb2Nrc1tdID0geworCSZzaDQyMDJfZW1pX2NsaywKKwkmc2g0MjAyX2ZlbWlfY2xrLAorCSZzaDQyMDJfc2hvY19jbGssCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaDQyMDJfY2xrX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY2xrICpjbGsgPSBjbGtfZ2V0KCJtYXN0ZXJfY2xrIik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzaDQyMDJfb25jaGlwX2Nsb2Nrcyk7IGkrKykgeworCQlzdHJ1Y3QgY2xrICpjbGtwID0gc2g0MjAyX29uY2hpcF9jbG9ja3NbaV07CisKKwkJY2xrcC0+cGFyZW50ID0gY2xrOworCQljbGtfcmVnaXN0ZXIoY2xrcCk7CisJCWNsa19lbmFibGUoY2xrcCk7CisJfQorCisJLyoKKwkgKiBOb3cgdGhhdCB3ZSBoYXZlIHRoZSByZXN0IG9mIHRoZSBjbG9ja3MgcmVnaXN0ZXJlZCwgd2UgbmVlZCB0bworCSAqIGZvcmNlIHRoZSBwYXJlbnQgY2xvY2sgdG8gcHJvcGFnYXRlIHNvIHRoYXQgdGhlc2UgY2xvY2tzIHdpbGwKKwkgKiBhdXRvbWF0aWNhbGx5IGZpZ3VyZSBvdXQgdGhlaXIgcmF0ZS4gV2UgY2hlYXQgYnkgaGFuZGluZyB0aGUKKwkgKiBwYXJlbnQgY2xvY2sgaXRzIGN1cnJlbnQgcmF0ZSBhbmQgZm9yY2luZyBjaGlsZCBwcm9wYWdhdGlvbi4KKwkgKi8KKwljbGtfc2V0X3JhdGUoY2xrLCBjbGtfZ2V0X3JhdGUoY2xrKSk7CisKKwljbGtfcHV0KGNsayk7CisKKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChzaDQyMDJfY2xrX2luaXQpOworCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2Nsb2NrLXNoNC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2E5Zjg3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDQuYwpAQCAtMCwwICsxLDgwIEBACisvKgorICogYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDQuYworICoKKyAqIEdlbmVyaWMgU0gtNCBzdXBwb3J0IGZvciB0aGUgY2xvY2sgZnJhbWV3b3JrCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSAgUGF1bCBNdW5kdAorICoKKyAqIEZSUUNSIHBhcnNpbmcgaGFja2VkIG91dCBvZiBhcmNoL3NoL2tlcm5lbC90aW1lLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5ICBUZXRzdXlhIE9rYWRhICYgTmlpYmUgWXV0YWthCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwICBQaGlsaXBwIFJ1bXBmIDxwcnVtcGZAdHV4Lm9yZz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQgIFBhdWwgTXVuZHQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgIE0uIFIuIEJyb3duICA8bXJicm93bkBsaW51eC1zaC5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXNtL2ZyZXEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworc3RhdGljIGludCBpZmNfZGl2aXNvcnNbXSA9IHsgMSwgMiwgMywgNCwgNiwgOCwgMSwgMSB9OworI2RlZmluZSBiZmNfZGl2aXNvcnMgaWZjX2Rpdmlzb3JzCS8qIFNhbWUgKi8KK3N0YXRpYyBpbnQgcGZjX2Rpdmlzb3JzW10gPSB7IDIsIDMsIDQsIDYsIDgsIDIsIDIsIDIgfTsKKworc3RhdGljIHZvaWQgbWFzdGVyX2Nsa19pbml0KHN0cnVjdCBjbGsgKmNsaykKK3sKKwljbGstPnJhdGUgKj0gcGZjX2Rpdmlzb3JzW2N0cmxfaW53KEZSUUNSKSAmIDB4MDAwN107Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDRfbWFzdGVyX2Nsa19vcHMgPSB7CisJLmluaXQJCT0gbWFzdGVyX2Nsa19pbml0LAorfTsKKworc3RhdGljIHZvaWQgbW9kdWxlX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCWludCBpZHggPSAoY3RybF9pbncoRlJRQ1IpICYgMHgwMDA3KTsKKwljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIHBmY19kaXZpc29yc1tpZHhdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g0X21vZHVsZV9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gbW9kdWxlX2Nsa19yZWNhbGMsCit9OworCitzdGF0aWMgdm9pZCBidXNfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGlkeCA9IChjdHJsX2ludyhGUlFDUikgPj4gMykgJiAweDAwMDc7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBiZmNfZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNF9idXNfY2xrX29wcyA9IHsKKwkucmVjYWxjCQk9IGJ1c19jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHZvaWQgY3B1X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCWludCBpZHggPSAoY3RybF9pbncoRlJRQ1IpID4+IDYpICYgMHgwMDA3OworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gaWZjX2Rpdmlzb3JzW2lkeF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDRfY3B1X2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBjcHVfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyAqc2g0X2Nsa19vcHNbXSA9IHsKKwkmc2g0X21hc3Rlcl9jbGtfb3BzLAorCSZzaDRfbW9kdWxlX2Nsa19vcHMsCisJJnNoNF9idXNfY2xrX29wcywKKwkmc2g0X2NwdV9jbGtfb3BzLAorfTsKKwordm9pZCBfX2luaXQgYXJjaF9pbml0X2Nsa19vcHMoc3RydWN0IGNsa19vcHMgKipvcHMsIGludCBpZHgpCit7CisJaWYgKGlkeCA8IEFSUkFZX1NJWkUoc2g0X2Nsa19vcHMpKQorCQkqb3BzID0gc2g0X2Nsa19vcHNbaWR4XTsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDczMTgwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2Nsb2NrLXNoNzMxODAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmE1Y2IyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDczMTgwLmMKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIGFyY2gvc2gva2VybmVsL2NwdS9zaDQvY2xvY2stc2g3MzE4MC5jCisgKgorICogU0g3MzE4MCBzdXBwb3J0IGZvciB0aGUgY2xvY2sgZnJhbWV3b3JrCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSAgUGF1bCBNdW5kdAorICoKKyAqIEZSUUNSIHBhcnNpbmcgaGFja2VkIG91dCBvZiBhcmNoL3NoL2tlcm5lbC90aW1lLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5ICBUZXRzdXlhIE9rYWRhICYgTmlpYmUgWXV0YWthCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwICBQaGlsaXBwIFJ1bXBmIDxwcnVtcGZAdHV4Lm9yZz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQgIFBhdWwgTXVuZHQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgIE0uIFIuIEJyb3duICA8bXJicm93bkBsaW51eC1zaC5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXNtL2ZyZXEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyoKKyAqIFNINzMxODAgdXNlcyBhIGNvbW1vbiBzZXQgb2YgZGl2aXNvcnMsIHNvIHRoaXMgaXMgcXVpdGUgc2ltcGxlLi4KKyAqLworc3RhdGljIGludCBkaXZpc29yc1tdID0geyAxLCAyLCAzLCA0LCA2LCA4LCAxMiwgMTYgfTsKKworc3RhdGljIHZvaWQgbWFzdGVyX2Nsa19pbml0KHN0cnVjdCBjbGsgKmNsaykKK3sKKwljbGstPnJhdGUgKj0gZGl2aXNvcnNbY3RybF9pbmwoRlJRQ1IpICYgMHgwMDA3XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzMxODBfbWFzdGVyX2Nsa19vcHMgPSB7CisJLmluaXQJCT0gbWFzdGVyX2Nsa19pbml0LAorfTsKKworc3RhdGljIHZvaWQgbW9kdWxlX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCWludCBpZHggPSAoY3RybF9pbmwoRlJRQ1IpICYgMHgwMDA3KTsKKwljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGRpdmlzb3JzW2lkeF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDczMTgwX21vZHVsZV9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gbW9kdWxlX2Nsa19yZWNhbGMsCit9OworCitzdGF0aWMgdm9pZCBidXNfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGlkeCA9IChjdHJsX2lubChGUlFDUikgPj4gMTIpICYgMHgwMDA3OworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzMxODBfYnVzX2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBidXNfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyB2b2lkIGNwdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgaWR4ID0gKGN0cmxfaW5sKEZSUUNSKSA+PiAyMCkgJiAweDAwMDc7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBkaXZpc29yc1tpZHhdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3MzE4MF9jcHVfY2xrX29wcyA9IHsKKwkucmVjYWxjCQk9IGNwdV9jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfb3BzICpzaDczMTgwX2Nsa19vcHNbXSA9IHsKKwkmc2g3MzE4MF9tYXN0ZXJfY2xrX29wcywKKwkmc2g3MzE4MF9tb2R1bGVfY2xrX29wcywKKwkmc2g3MzE4MF9idXNfY2xrX29wcywKKwkmc2g3MzE4MF9jcHVfY2xrX29wcywKK307CisKK3ZvaWQgX19pbml0IGFyY2hfaW5pdF9jbGtfb3BzKHN0cnVjdCBjbGtfb3BzICoqb3BzLCBpbnQgaWR4KQoreworCWlmIChpZHggPCBBUlJBWV9TSVpFKHNoNzMxODBfY2xrX29wcykpCisJCSpvcHMgPSBzaDczMTgwX2Nsa19vcHNbaWR4XTsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDc3NzAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvY2xvY2stc2g3NzcwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg2OTRiYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvY2xvY2stc2g3NzcwLmMKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIGFyY2gvc2gva2VybmVsL2NwdS9zaDQvY2xvY2stc2g3NzcwLmMKKyAqCisgKiBTSDc3NzAgc3VwcG9ydCBmb3IgdGhlIGNsb2NrIGZyYW1ld29yaworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vY2xvY2suaD4KKyNpbmNsdWRlIDxhc20vZnJlcS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitzdGF0aWMgaW50IGlmY19kaXZpc29yc1tdID0geyAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxIH07CitzdGF0aWMgaW50IGJmY19kaXZpc29yc1tdID0geyAxLCAxLCAxLCAxLCAxLCA4LDEyLCAxIH07CitzdGF0aWMgaW50IHBmY19kaXZpc29yc1tdID0geyAxLCA4LCAxLDEwLDEyLDE2LCAxLCAxIH07CisKK3N0YXRpYyB2b2lkIG1hc3Rlcl9jbGtfaW5pdChzdHJ1Y3QgY2xrICpjbGspCit7CisJY2xrLT5yYXRlICo9IHBmY19kaXZpc29yc1soY3RybF9pbmwoRlJRQ1IpID4+IDI4KSAmIDB4MDAwZl07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3NzBfbWFzdGVyX2Nsa19vcHMgPSB7CisJLmluaXQJCT0gbWFzdGVyX2Nsa19pbml0LAorfTsKKworc3RhdGljIHZvaWQgbW9kdWxlX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCWludCBpZHggPSAoKGN0cmxfaW5sKEZSUUNSKSA+PiAyOCkgJiAweDAwMGYpOworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gcGZjX2Rpdmlzb3JzW2lkeF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3NzBfbW9kdWxlX2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBtb2R1bGVfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyB2b2lkIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgaWR4ID0gKGN0cmxfaW5sKEZSUUNSKSAmIDB4MDAwZik7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBiZmNfZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzc3MF9idXNfY2xrX29wcyA9IHsKKwkucmVjYWxjCQk9IGJ1c19jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHZvaWQgY3B1X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCWludCBpZHggPSAoKGN0cmxfaW5sKEZSUUNSKSA+PiAyNCkgJiAweDAwMGYpOworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gaWZjX2Rpdmlzb3JzW2lkeF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3NzBfY3B1X2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBjcHVfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyAqc2g3NzcwX2Nsa19vcHNbXSA9IHsKKwkmc2g3NzcwX21hc3Rlcl9jbGtfb3BzLAorCSZzaDc3NzBfbW9kdWxlX2Nsa19vcHMsCisJJnNoNzc3MF9idXNfY2xrX29wcywKKwkmc2g3NzcwX2NwdV9jbGtfb3BzLAorfTsKKwordm9pZCBfX2luaXQgYXJjaF9pbml0X2Nsa19vcHMoc3RydWN0IGNsa19vcHMgKipvcHMsIGludCBpZHgpCit7CisJaWYgKGlkeCA8IEFSUkFZX1NJWkUoc2g3NzcwX2Nsa19vcHMpKQorCQkqb3BzID0gc2g3NzcwX2Nsa19vcHNbaWR4XTsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDc3ODAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvY2xvY2stc2g3NzgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhZDM2NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvY2xvY2stc2g3NzgwLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBhcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2Nsb2NrLXNoNzc4MC5jCisgKgorICogU0g3NzgwIHN1cHBvcnQgZm9yIHRoZSBjbG9jayBmcmFtZXdvcmsKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1ICBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXNtL2ZyZXEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworc3RhdGljIGludCBpZmNfZGl2aXNvcnNbXSA9IHsgMiwgNCB9Oworc3RhdGljIGludCBiZmNfZGl2aXNvcnNbXSA9IHsgMSwgMSwgMSwgOCwgMTIsIDE2LCAyNCwgMSB9Oworc3RhdGljIGludCBwZmNfZGl2aXNvcnNbXSA9IHsgMSwgMjQsIDI0LCAxIH07CitzdGF0aWMgaW50IGNmY19kaXZpc29yc1tdID0geyAxLCAxLCA0LCAxLCA2LCAxLCAxLCAxIH07CisKK3N0YXRpYyB2b2lkIG1hc3Rlcl9jbGtfaW5pdChzdHJ1Y3QgY2xrICpjbGspCit7CisJY2xrLT5yYXRlICo9IHBmY19kaXZpc29yc1tjdHJsX2lubChGUlFDUikgJiAweDAwMDNdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NzgwX21hc3Rlcl9jbGtfb3BzID0geworCS5pbml0CQk9IG1hc3Rlcl9jbGtfaW5pdCwKK307CisKK3N0YXRpYyB2b2lkIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgaWR4ID0gKGN0cmxfaW5sKEZSUUNSKSAmIDB4MDAwMyk7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzc4MF9tb2R1bGVfY2xrX29wcyA9IHsKKwkucmVjYWxjCQk9IG1vZHVsZV9jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHZvaWQgYnVzX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCWludCBpZHggPSAoKGN0cmxfaW5sKEZSUUNSKSA+PiAxNikgJiAweDAwMDcpOworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gYmZjX2Rpdmlzb3JzW2lkeF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3ODBfYnVzX2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBidXNfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyB2b2lkIGNwdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgaWR4ID0gKChjdHJsX2lubChGUlFDUikgPj4gMjQpICYgMHgwMDAxKTsKKwljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGlmY19kaXZpc29yc1tpZHhdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NzgwX2NwdV9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gY3B1X2Nsa19yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsa19vcHMgKnNoNzc4MF9jbGtfb3BzW10gPSB7CisJJnNoNzc4MF9tYXN0ZXJfY2xrX29wcywKKwkmc2g3NzgwX21vZHVsZV9jbGtfb3BzLAorCSZzaDc3ODBfYnVzX2Nsa19vcHMsCisJJnNoNzc4MF9jcHVfY2xrX29wcywKK307CisKK3ZvaWQgX19pbml0IGFyY2hfaW5pdF9jbGtfb3BzKHN0cnVjdCBjbGtfb3BzICoqb3BzLCBpbnQgaWR4KQoreworCWlmIChpZHggPCBBUlJBWV9TSVpFKHNoNzc4MF9jbGtfb3BzKSkKKwkJKm9wcyA9IHNoNzc4MF9jbGtfb3BzW2lkeF07Cit9CisKK3N0YXRpYyB2b2lkIHNoeXdheV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgaWR4ID0gKChjdHJsX2lubChGUlFDUikgPj4gMjApICYgMHgwMDA3KTsKKwljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGNmY19kaXZpc29yc1tpZHhdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NzgwX3NoeXdheV9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gc2h5d2F5X2Nsa19yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBzaDc3ODBfc2h5d2F5X2NsayA9IHsKKwkubmFtZQkJPSAic2h5d2F5X2NsayIsCisJLmZsYWdzCQk9IENMS19BTFdBWVNfRU5BQkxFRCwKKwkub3BzCQk9ICZzaDc3ODBfc2h5d2F5X2Nsa19vcHMsCit9OworCisvKgorICogQWRkaXRpb25hbCBTSDc3ODAtc3BlY2lmaWMgb24tY2hpcCBjbG9ja3MgdGhhdCBhcmVuJ3QgYWxyZWFkeSBwYXJ0IG9mIHRoZQorICogY2xvY2sgZnJhbWV3b3JrCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrICpzaDc3ODBfb25jaGlwX2Nsb2Nrc1tdID0geworCSZzaDc3ODBfc2h5d2F5X2NsaywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNoNzc4MF9jbGtfaW5pdCh2b2lkKQoreworCXN0cnVjdCBjbGsgKmNsayA9IGNsa19nZXQoIm1hc3Rlcl9jbGsiKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNoNzc4MF9vbmNoaXBfY2xvY2tzKTsgaSsrKSB7CisJCXN0cnVjdCBjbGsgKmNsa3AgPSBzaDc3ODBfb25jaGlwX2Nsb2Nrc1tpXTsKKworCQljbGtwLT5wYXJlbnQgPSBjbGs7CisJCWNsa19yZWdpc3RlcihjbGtwKTsKKwkJY2xrX2VuYWJsZShjbGtwKTsKKwl9CisKKwkvKgorCSAqIE5vdyB0aGF0IHdlIGhhdmUgdGhlIHJlc3Qgb2YgdGhlIGNsb2NrcyByZWdpc3RlcmVkLCB3ZSBuZWVkIHRvCisJICogZm9yY2UgdGhlIHBhcmVudCBjbG9jayB0byBwcm9wYWdhdGUgc28gdGhhdCB0aGVzZSBjbG9ja3Mgd2lsbAorCSAqIGF1dG9tYXRpY2FsbHkgZmlndXJlIG91dCB0aGVpciByYXRlLiBXZSBjaGVhdCBieSBoYW5kaW5nIHRoZQorCSAqIHBhcmVudCBjbG9jayBpdHMgY3VycmVudCByYXRlIGFuZCBmb3JjaW5nIGNoaWxkIHByb3BhZ2F0aW9uLgorCSAqLworCWNsa19zZXRfcmF0ZShjbGssIGNsa19nZXRfcmF0ZShjbGspKTsKKworCWNsa19wdXQoY2xrKTsKKworCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKHNoNzc4MF9jbGtfaW5pdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvaXJxX2ludGMyLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2lycV9pbnRjMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmIxNmJhLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvaXJxX2ludGMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvc2gva2VybmVsL2lycV9pbnRjMi5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxIERhdmlkIEouIE1ja2F5IChkYXZpZC5tY2theUBzdC5jb20pCi0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqCi0gKiBJbnRlcnJ1cHQgaGFuZGxpbmcgZm9yIElOVEMyLWJhc2VkIElSUS4KLSAqCi0gKiBUaGVzZSBhcmUgdGhlICJuZXcgSGl0YWNoaSBzdHlsZSIgaW50ZXJydXB0cywgYXMgcHJlc2VudCBvbiB0aGUgCi0gKiBIaXRhY2hpIDc3NTEgYW5kIHRoZSBTVE0gU1Q0MCBTVEIxLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLQotCi1zdHJ1Y3QgaW50YzJfZGF0YSB7Ci0JdW5zaWduZWQgY2hhciBtc2tfb2Zmc2V0OwotCXVuc2lnbmVkIGNoYXIgbXNrX3NoaWZ0OwotI2lmZGVmIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwCi0JaW50ICgqY2xlYXJfaXJxKSAoaW50KTsKLSNlbmRpZgotfTsKLQotCi1zdGF0aWMgc3RydWN0IGludGMyX2RhdGEgaW50YzJfZGF0YVtOUl9JTlRDMl9JUlFTXTsKLQotc3RhdGljIHZvaWQgZW5hYmxlX2ludGMyX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIGRpc2FibGVfaW50YzJfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotCi0vKiBzaHV0ZG93biBpcyBzYW1lIGFzICJkaXNhYmxlIiAqLwotI2RlZmluZSBzaHV0ZG93bl9pbnRjMl9pcnEgZGlzYWJsZV9pbnRjMl9pcnEKLQotc3RhdGljIHZvaWQgbWFza19hbmRfYWNrX2ludGMyKHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgdm9pZCBlbmRfaW50YzJfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfaW50YzJfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17IAotCWVuYWJsZV9pbnRjMl9pcnEoaXJxKTsKLQlyZXR1cm4gMDsgLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLwotfQotCi1zdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGludGMyX2lycV90eXBlID0gewotCS50eXBlbmFtZSA9ICJJTlRDMi1JUlEiLAotCS5zdGFydHVwID0gc3RhcnR1cF9pbnRjMl9pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25faW50YzJfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfaW50YzJfaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV9pbnRjMl9pcnEsCi0JLmFjayA9IG1hc2tfYW5kX2Fja19pbnRjMiwKLQkuZW5kID0gZW5kX2ludGMyX2lycQotfTsKLQotc3RhdGljIHZvaWQgZGlzYWJsZV9pbnRjMl9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlpbnQgaXJxX29mZnNldCA9IGlycSAtIElOVEMyX0ZJUlNUX0lSUTsKLQlpbnQgbXNrX3NoaWZ0LCBtc2tfb2Zmc2V0OwotCi0JLy8gU2FuaXR5IGNoZWNrCi0JaWYoKGlycV9vZmZzZXQ8MCkgfHwgKGlycV9vZmZzZXQ+PU5SX0lOVEMyX0lSUVMpKQotCQlyZXR1cm47Ci0KLQltc2tfc2hpZnQgPSBpbnRjMl9kYXRhW2lycV9vZmZzZXRdLm1za19zaGlmdDsKLQltc2tfb2Zmc2V0ID0gaW50YzJfZGF0YVtpcnFfb2Zmc2V0XS5tc2tfb2Zmc2V0OwotCi0JY3RybF9vdXRsKDE8PG1za19zaGlmdCwKLQkJICBJTlRDMl9CQVNFK0lOVEMyX0lOVE1TS19PRkZTRVQrbXNrX29mZnNldCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuYWJsZV9pbnRjMl9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlpbnQgaXJxX29mZnNldCA9IGlycSAtIElOVEMyX0ZJUlNUX0lSUTsKLQlpbnQgbXNrX3NoaWZ0LCBtc2tfb2Zmc2V0OwotCi0JLyogU2FuaXR5IGNoZWNrICovCi0JaWYoKGlycV9vZmZzZXQ8MCkgfHwgKGlycV9vZmZzZXQ+PU5SX0lOVEMyX0lSUVMpKQotCQlyZXR1cm47Ci0KLQltc2tfc2hpZnQgPSBpbnRjMl9kYXRhW2lycV9vZmZzZXRdLm1za19zaGlmdDsKLQltc2tfb2Zmc2V0ID0gaW50YzJfZGF0YVtpcnFfb2Zmc2V0XS5tc2tfb2Zmc2V0OwotCi0JY3RybF9vdXRsKDE8PG1za19zaGlmdCwKLQkJICBJTlRDMl9CQVNFK0lOVEMyX0lOVE1TS0NMUl9PRkZTRVQrbXNrX29mZnNldCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19pbnRjMih1bnNpZ25lZCBpbnQgaXJxKQotewotCWRpc2FibGVfaW50YzJfaXJxKGlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuZF9pbnRjMl9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUR8SVJRX0lOUFJPR1JFU1MpKSkKLQkJZW5hYmxlX2ludGMyX2lycShpcnEpOwotCi0jaWZkZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDAKLQlpZiAoaW50YzJfZGF0YVtpcnEgLSBJTlRDMl9GSVJTVF9JUlFdLmNsZWFyX2lycSkKLQkJaW50YzJfZGF0YVtpcnEgLSBJTlRDMl9GSVJTVF9JUlFdLmNsZWFyX2lycSAoaXJxKTsKLSNlbmRpZgotfQotCi0vKgotICogU2V0dXAgYW4gSU5UQzIgc3R5bGUgaW50ZXJydXB0LgotICogTk9URTogVW5saWtlIElQUiBpbnRlcnJ1cHRzLCBwYXJhbWV0ZXJzIGFyZSBub3Qgc2hpZnRlZCBieSB0aGlzIGNvZGUsCi0gKiBhbGxvd2luZyB0aGUgdXNlIG9mIHRoZSBudW1iZXJzIHN0cmFpZ2h0IG91dCBvZiB0aGUgZGF0YXNoZWV0LgotICogRm9yIGV4YW1wbGU6Ci0gKiAgICBQSU8xIHdoaWNoIGlzIElOVFBSSTAwWzE5LDE2XSBhbmQgSU5UTVNLMDBbMTNdCi0gKiB3b3VsZCBiZTogICAgICAgICAgICAgICBeICAgICBeICAgICAgICAgICAgIF4gIF4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgICAgICAgICAgICAgfCAgfAotICogICAgbWFrZV9pbnRjMl9pcnEoODQsICAgMCwgICAxNiwgICAgICAgICAgICAwLCAxMyk7Ci0gKi8KLXZvaWQgbWFrZV9pbnRjMl9pcnEodW5zaWduZWQgaW50IGlycSwKLQkJICAgIHVuc2lnbmVkIGludCBpcHJfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgaXByX3NoaWZ0LAotCQkgICAgdW5zaWduZWQgaW50IG1za19vZmZzZXQsIHVuc2lnbmVkIGludCBtc2tfc2hpZnQsCi0JCSAgICB1bnNpZ25lZCBpbnQgcHJpb3JpdHkpCi17Ci0JaW50IGlycV9vZmZzZXQgPSBpcnEgLSBJTlRDMl9GSVJTVF9JUlE7Ci0JdW5zaWduZWQgaW50IGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgaXByOwotCi0JaWYoKGlycV9vZmZzZXQ8MCkgfHwgKGlycV9vZmZzZXQ+PU5SX0lOVEMyX0lSUVMpKQotCQlyZXR1cm47Ci0KLQlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKLQotCS8qIEZpbGwgdGhlIGRhdGEgd2UgbmVlZCAqLwotCWludGMyX2RhdGFbaXJxX29mZnNldF0ubXNrX29mZnNldCA9IG1za19vZmZzZXQ7Ci0JaW50YzJfZGF0YVtpcnFfb2Zmc2V0XS5tc2tfc2hpZnQgID0gbXNrX3NoaWZ0OwotI2lmZGVmIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwCi0JaW50YzJfZGF0YVtpcnFfb2Zmc2V0XS5jbGVhcl9pcnEgPSBOVUxMOwotI2VuZGlmCi0JCQotCS8qIFNldCB0aGUgcHJpb3JpdHkgbGV2ZWwgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlpcHI9Y3RybF9pbmwoSU5UQzJfQkFTRStJTlRDMl9JTlRQUklfT0ZGU0VUK2lwcl9vZmZzZXQpOwotCWlwciY9figweGY8PGlwcl9zaGlmdCk7Ci0JaXByfD0ocHJpb3JpdHkpPDxpcHJfc2hpZnQ7Ci0JY3RybF9vdXRsKGlwciwgSU5UQzJfQkFTRStJTlRDMl9JTlRQUklfT0ZGU0VUK2lwcl9vZmZzZXQpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JaXJxX2Rlc2NbaXJxXS5oYW5kbGVyPSZpbnRjMl9pcnFfdHlwZTsKLQotCWRpc2FibGVfaW50YzJfaXJxKGlycSk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MAotCi1zdHJ1Y3QgaW50YzJfaW5pdCB7Ci0JdW5zaWduZWQgc2hvcnQgaXJxOwotCXVuc2lnbmVkIGNoYXIgaXByX29mZnNldCwgaXByX3NoaWZ0OwotCXVuc2lnbmVkIGNoYXIgbXNrX29mZnNldCwgbXNrX3NoaWZ0OwotfTsKLQotc3RhdGljIHN0cnVjdCBpbnRjMl9pbml0IGludGMyX2luaXRfZGF0YVtdICBfX2luaXRkYXRhID0gewotCXs2NCwgIDAsICAwLCAwLCAgMH0sCS8qIFBDSSBzZXJyICovCi0JezY1LCAgMCwgIDQsIDAsICAxfSwJLyogUENJIGVyciAqLwotCXs2NiwgIDAsICA0LCAwLCAgMn0sCS8qIFBDSSBhZCAqLwotCXs2NywgIDAsICA0LCAwLCAgM30sCS8qIFBDSSBwd2QgZG93biAqLwotCXs3MiwgIDAsICA4LCAwLCAgNX0sCS8qIERNQUMgSU5UMCAqLwotCXs3MywgIDAsICA4LCAwLCAgNn0sCS8qIERNQUMgSU5UMSAqLwotCXs3NCwgIDAsICA4LCAwLCAgN30sCS8qIERNQUMgSU5UMiAqLwotCXs3NSwgIDAsICA4LCAwLCAgOH0sCS8qIERNQUMgSU5UMyAqLwotCXs3NiwgIDAsICA4LCAwLCAgOX0sCS8qIERNQUMgSU5UNCAqLwotCXs3OCwgIDAsICA4LCAwLCAxMX0sCS8qIERNQUMgRVJSICovCi0JezgwLCAgMCwgMTIsIDAsIDEyfSwJLyogUElPMCAqLwotCXs4NCwgIDAsIDE2LCAwLCAxM30sCS8qIFBJTzEgKi8KLQl7ODgsICAwLCAyMCwgMCwgMTR9LAkvKiBQSU8yICovCi0JezExMiwgNCwgIDAsIDQsICAwfSwJLyogTWFpbGJveCAqLwotI2lmZGVmIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwR1gxCi0JezExNiwgNCwgIDQsIDQsICA0fSwJLyogU1NDMCAqLwotCXsxMjAsIDQsICA4LCA0LCAgOH0sCS8qIElSIEJsYXN0ZXIgKi8KLQl7MTI0LCA0LCAxMiwgNCwgMTJ9LAkvKiBVU0IgaG9zdCAqLwotCXsxMjgsIDQsIDE2LCA0LCAxNn0sCS8qIFZpZGVvIHByb2Nlc3NvciBCTElUVEVSICovCi0JezEzMiwgNCwgMjAsIDQsIDIwfSwJLyogVUFSVDAgKi8KLQl7MTM0LCA0LCAyMCwgNCwgMjJ9LAkvKiBVQVJUMiAqLwotCXsxMzYsIDQsIDI0LCA0LCAyNH0sCS8qIElPX1BJTzAgKi8KLQl7MTQwLCA0LCAyOCwgNCwgMjh9LAkvKiBFTVBJICovCi0JezE0NCwgOCwgIDAsIDgsICAwfSwJLyogTUFGRSAqLwotCXsxNDgsIDgsICA0LCA4LCAgNH0sCS8qIFBXTSAqLwotCXsxNTIsIDgsICA4LCA4LCAgOH0sCS8qIFNTQzEgKi8KLQl7MTU2LCA4LCAxMiwgOCwgMTJ9LAkvKiBJT19QSU8xICovCi0JezE2MCwgOCwgMTYsIDgsIDE2fSwJLyogVVNCIHRhcmdldCAqLwotCXsxNjQsIDgsIDIwLCA4LCAyMH0sCS8qIFVBUlQxICovCi0JezE2OCwgOCwgMjQsIDgsIDI0fSwJLyogVGVsZXRleHQgKi8KLQl7MTcyLCA4LCAyOCwgOCwgMjh9LAkvKiBWaWRlb1N5bmMgVlRHICovCi0JezE3MywgOCwgMjgsIDgsIDI5fSwJLyogVmlkZW9TeW5jIERWUDAgKi8KLQl7MTc0LCA4LCAyOCwgOCwgMzB9LAkvKiBWaWRlb1N5bmMgRFZQMSAqLwotI2VuZGlmCi19OwotCi12b2lkIF9faW5pdCBpbml0X0lSUV9pbnRjMih2b2lkKQotewotCXN0cnVjdCBpbnRjMl9pbml0ICpwOwotCi0JcHJpbnRrKEtFUk5fQUxFUlQgImluaXRfSVJRX2ludGMyXG4iKTsKLQotCWZvciAocCA9IGludGMyX2luaXRfZGF0YTsKLQkgICAgIHA8aW50YzJfaW5pdF9kYXRhK0FSUkFZX1NJWkUoaW50YzJfaW5pdF9kYXRhKTsKLQkgICAgIHArKykgewotCQltYWtlX2ludGMyX2lycShwLT5pcnEsIHAtPmlwcl9vZmZzZXQsIHAtPmlwcl9zaGlmdCwKLQkJCSAgICAgICBwLT4gbXNrX29mZnNldCwgcC0+bXNrX3NoaWZ0LCAxMyk7Ci0JfQotfQotCi0vKiBBZGRzIGEgdGVybWluYXRpb24gY2FsbGJhY2sgdG8gdGhlIGludGVycnVwdCAqLwotdm9pZCBpbnRjMl9hZGRfY2xlYXJfaXJxKGludCBpcnEsIGludCAoKmZuKShpbnQpKQotewotCWlmIChpcnEgPCBJTlRDMl9GSVJTVF9JUlEpCi0JCXJldHVybjsKLQotCWludGMyX2RhdGFbaXJxIC0gSU5UQzJfRklSU1RfSVJRXS5jbGVhcl9pcnEgPSBmbjsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9pby5jIGIvYXJjaC9zaC9rZXJuZWwvaW8uYwppbmRleCBkOTkzMmYyLi43MWM5ZmRlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9pby5jCisrKyBiL2FyY2gvc2gva2VybmVsL2lvLmMKQEAgLTIsNTggKzIsNzMgQEAKICAqIGxpbnV4L2FyY2gvc2gva2VybmVsL2lvLmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAgIFN0dWFydCBNZW5lZnkKKyAqIENvcHlyaWdodCAoQykgMjAwNSAgUGF1bCBNdW5kdAogICoKICAqIFByb3ZpZGUgcmVhbCBmdW5jdGlvbnMgd2hpY2ggZXhwYW5kIHRvIHdoYXRldmVyIHRoZSBoZWFkZXIgZmlsZSBkZWZpbmVkLgogICogQWxzbyBkZWZpbml0aW9ucyBvZiBtYWNoaW5lIGluZGVwZW5kZW50IElPIGZ1bmN0aW9ucy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KICAqLwotCi0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KIAogLyoKICAqIENvcHkgZGF0YSBmcm9tIElPIG1lbW9yeSBzcGFjZSB0byAicmVhbCIgbWVtb3J5IHNwYWNlLgogICogVGhpcyBuZWVkcyB0byBiZSBvcHRpbWl6ZWQuCiAgKi8KLXZvaWQgIG1lbWNweV9mcm9taW8odm9pZCAqIHRvLCB1bnNpZ25lZCBsb25nIGZyb20sIHVuc2lnbmVkIGxvbmcgY291bnQpCit2b2lkIG1lbWNweV9mcm9taW8odm9pZCAqdG8sIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqZnJvbSwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKIAljaGFyICpwID0gdG87CiAgICAgICAgIHdoaWxlIChjb3VudCkgewogICAgICAgICAgICAgICAgIGNvdW50LS07Ci0gICAgICAgICAgICAgICAgKnAgPSByZWFkYihmcm9tKTsKKyAgICAgICAgICAgICAgICAqcCA9IHJlYWRiKCh2b2lkIF9faW9tZW0gKilmcm9tKTsKICAgICAgICAgICAgICAgICBwKys7CiAgICAgICAgICAgICAgICAgZnJvbSsrOwogICAgICAgICB9CiB9Ci0gCitFWFBPUlRfU1lNQk9MKG1lbWNweV9mcm9taW8pOworCiAvKgogICogQ29weSBkYXRhIGZyb20gInJlYWwiIG1lbW9yeSBzcGFjZSB0byBJTyBtZW1vcnkgc3BhY2UuCiAgKiBUaGlzIG5lZWRzIHRvIGJlIG9wdGltaXplZC4KICAqLwotdm9pZCAgbWVtY3B5X3RvaW8odW5zaWduZWQgbG9uZyB0bywgY29uc3Qgdm9pZCAqIGZyb20sIHVuc2lnbmVkIGxvbmcgY291bnQpCit2b2lkIG1lbWNweV90b2lvKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7CiAJY29uc3QgY2hhciAqcCA9IGZyb207CiAgICAgICAgIHdoaWxlIChjb3VudCkgewogICAgICAgICAgICAgICAgIGNvdW50LS07Ci0gICAgICAgICAgICAgICAgd3JpdGViKCpwLCB0byk7CisgICAgICAgICAgICAgICAgd3JpdGViKCpwLCAodm9pZCBfX2lvbWVtICopdG8pOwogICAgICAgICAgICAgICAgIHArKzsKICAgICAgICAgICAgICAgICB0bysrOwogICAgICAgICB9CiB9Ci0gCitFWFBPUlRfU1lNQk9MKG1lbWNweV90b2lvKTsKKwogLyoKICAqICJtZW1zZXQiIG9uIElPIG1lbW9yeSBzcGFjZS4KICAqIFRoaXMgbmVlZHMgdG8gYmUgb3B0aW1pemVkLgogICovCi12b2lkICBtZW1zZXRfaW8odW5zaWduZWQgbG9uZyBkc3QsIGludCBjLCB1bnNpZ25lZCBsb25nIGNvdW50KQordm9pZCBtZW1zZXRfaW8odm9sYXRpbGUgdm9pZCBfX2lvbWVtICpkc3QsIGludCBjLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewogICAgICAgICB3aGlsZSAoY291bnQpIHsKICAgICAgICAgICAgICAgICBjb3VudC0tOwotICAgICAgICAgICAgICAgIHdyaXRlYihjLCBkc3QpOworICAgICAgICAgICAgICAgIHdyaXRlYihjLCAodm9pZCBfX2lvbWVtICopZHN0KTsKICAgICAgICAgICAgICAgICBkc3QrKzsKICAgICAgICAgfQogfQotCi1FWFBPUlRfU1lNQk9MKG1lbWNweV9mcm9taW8pOwotRVhQT1JUX1NZTUJPTChtZW1jcHlfdG9pbyk7CiBFWFBPUlRfU1lNQk9MKG1lbXNldF9pbyk7CiAKK3ZvaWQgX19pb21lbSAqaW9wb3J0X21hcCh1bnNpZ25lZCBsb25nIHBvcnQsIHVuc2lnbmVkIGludCBucikKK3sKKwlyZXR1cm4gc2hfbXYubXZfaW9wb3J0X21hcChwb3J0LCBucik7Cit9CitFWFBPUlRfU1lNQk9MKGlvcG9ydF9tYXApOworCit2b2lkIGlvcG9ydF91bm1hcCh2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJc2hfbXYubXZfaW9wb3J0X3VubWFwKGFkZHIpOworfQorRVhQT1JUX1NZTUJPTChpb3BvcnRfdW5tYXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvaW9fZ2VuZXJpYy5jIGIvYXJjaC9zaC9rZXJuZWwvaW9fZ2VuZXJpYy5jCmluZGV4IGE5MTFiMDEuLjI4ZWM3NDggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2lvX2dlbmVyaWMuYworKysgYi9hcmNoL3NoL2tlcm5lbC9pb19nZW5lcmljLmMKQEAgLTMsNiArMyw3IEBACiAgKiBsaW51eC9hcmNoL3NoL2tlcm5lbC9pb19nZW5lcmljLmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAgIE5paWJlIFl1dGFrYQorICogQ29weXJpZ2h0IChDKSAyMDA1ICBQYXVsIE11bmR0CiAgKgogICogR2VuZXJpYyBJL08gcm91dGluZS4gVGhlc2UgY2FuIGJlIHVzZWQgd2hlcmUgYSBtYWNoaW5lIHNwZWNpZmljIHZlcnNpb24KICAqIGlzIG5vdCByZXF1aXJlZC4KQEAgLTEwLDIxICsxMSwyMCBAQAogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NIMykKKyNpZmRlZiBDT05GSUdfQ1BVX1NIMworLyogU0gzIGhhcyBhIFBDTUNJQSBidWcgdGhhdCBuZWVkcyBhIGR1bW15IHJlYWQgZnJvbSBhcmVhIDYgZm9yIGEKKyAqIHdvcmthcm91bmQuICovCiAvKiBJJ20gbm90IHN1cmUgU0g3NzA5IGhhcyB0aGlzIGtpbmQgb2YgYnVnICovCi0jZGVmaW5lIFNIM19QQ01DSUFfQlVHX1dPUktBUk9VTkQgMQotI2RlZmluZSBEVU1NWV9SRUFEX0FSRUE2CSAgMHhiYTAwMDAwMAorI2RlZmluZSBkdW1teV9yZWFkKCkJY3RybF9pbmIoMHhiYTAwMDAwMCkKKyNlbHNlCisjZGVmaW5lIGR1bW15X3JlYWQoKQogI2VuZGlmCiAKLSNkZWZpbmUgUE9SVDJBRERSKHgpIChzaF9tdi5tdl9pc2FfcG9ydDJhZGRyKHgpKQotCiB1bnNpZ25lZCBsb25nIGdlbmVyaWNfaW9fYmFzZTsKIAogc3RhdGljIGlubGluZSB2b2lkIGRlbGF5KHZvaWQpCkBAIC0zMiw0MCArMzIsNDAgQEAKIAljdHJsX2ludygweGEwMDAwMDAwKTsKIH0KIAotdW5zaWduZWQgY2hhciBnZW5lcmljX2luYih1bnNpZ25lZCBsb25nIHBvcnQpCit1OCBnZW5lcmljX2luYih1bnNpZ25lZCBsb25nIHBvcnQpCiB7Ci0JcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciopUE9SVDJBRERSKHBvcnQpOworCXJldHVybiBjdHJsX2luYigodW5zaWduZWQgbG9uZyBfX2ZvcmNlKWlvcG9ydF9tYXAocG9ydCwgMSkpOwogfQogCi11bnNpZ25lZCBzaG9ydCBnZW5lcmljX2ludyh1bnNpZ25lZCBsb25nIHBvcnQpCit1MTYgZ2VuZXJpY19pbncodW5zaWduZWQgbG9uZyBwb3J0KQogewotCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0KilQT1JUMkFERFIocG9ydCk7CisJcmV0dXJuIGN0cmxfaW53KCh1bnNpZ25lZCBsb25nIF9fZm9yY2UpaW9wb3J0X21hcChwb3J0LCAyKSk7CiB9CiAKLXVuc2lnbmVkIGludCBnZW5lcmljX2lubCh1bnNpZ25lZCBsb25nIHBvcnQpCit1MzIgZ2VuZXJpY19pbmwodW5zaWduZWQgbG9uZyBwb3J0KQogewotCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcqKVBPUlQyQUREUihwb3J0KTsKKwlyZXR1cm4gY3RybF9pbmwoKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlpb3BvcnRfbWFwKHBvcnQsIDQpKTsKIH0KIAotdW5zaWduZWQgY2hhciBnZW5lcmljX2luYl9wKHVuc2lnbmVkIGxvbmcgcG9ydCkKK3U4IGdlbmVyaWNfaW5iX3AodW5zaWduZWQgbG9uZyBwb3J0KQogewotCXVuc2lnbmVkIGxvbmcgdiA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciopUE9SVDJBRERSKHBvcnQpOworCXVuc2lnbmVkIGxvbmcgdiA9IGdlbmVyaWNfaW5iKHBvcnQpOwogCiAJZGVsYXkoKTsKIAlyZXR1cm4gdjsKIH0KIAotdW5zaWduZWQgc2hvcnQgZ2VuZXJpY19pbndfcCh1bnNpZ25lZCBsb25nIHBvcnQpCit1MTYgZ2VuZXJpY19pbndfcCh1bnNpZ25lZCBsb25nIHBvcnQpCiB7Ci0JdW5zaWduZWQgbG9uZyB2ID0gKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCopUE9SVDJBRERSKHBvcnQpOworCXVuc2lnbmVkIGxvbmcgdiA9IGdlbmVyaWNfaW53KHBvcnQpOwogCiAJZGVsYXkoKTsKIAlyZXR1cm4gdjsKIH0KIAotdW5zaWduZWQgaW50IGdlbmVyaWNfaW5sX3AodW5zaWduZWQgbG9uZyBwb3J0KQordTMyIGdlbmVyaWNfaW5sX3AodW5zaWduZWQgbG9uZyBwb3J0KQogewotCXVuc2lnbmVkIGxvbmcgdiA9ICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyopUE9SVDJBRERSKHBvcnQpOworCXVuc2lnbmVkIGxvbmcgdiA9IGdlbmVyaWNfaW5sKHBvcnQpOwogCiAJZGVsYXkoKTsKIAlyZXR1cm4gdjsKQEAgLTc3LDc1ICs3Nyw3MCBAQAogICogY29udmVydCB0aGUgcG9ydCBhZGRyZXNzIHRvIHJlYWwgYWRkcmVzcyBvbmNlLgogICovCiAKLXZvaWQgZ2VuZXJpY19pbnNiKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50KQordm9pZCBnZW5lcmljX2luc2IodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqcG9ydF9hZGRyOwotCXVuc2lnbmVkIGNoYXIgKmJ1Zj1idWZmZXI7CisJdm9sYXRpbGUgdTggKnBvcnRfYWRkcjsKKwl1OCAqYnVmID0gZHN0OwogCi0JcG9ydF9hZGRyID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilQT1JUMkFERFIocG9ydCk7Ci0KLQl3aGlsZShjb3VudC0tKQotCSAgICAqYnVmKysgPSAqcG9ydF9hZGRyOworCXBvcnRfYWRkciA9ICh2b2xhdGlsZSB1OCAqKWlvcG9ydF9tYXAocG9ydCwgMSk7CisJd2hpbGUgKGNvdW50LS0pCisJCSpidWYrKyA9ICpwb3J0X2FkZHI7CiB9CiAKLXZvaWQgZ2VuZXJpY19pbnN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50KQordm9pZCBnZW5lcmljX2luc3codW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKnBvcnRfYWRkcjsKLQl1bnNpZ25lZCBzaG9ydCAqYnVmPWJ1ZmZlcjsKKwl2b2xhdGlsZSB1MTYgKnBvcnRfYWRkcjsKKwl1MTYgKmJ1ZiA9IGRzdDsKIAotCXBvcnRfYWRkciA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKVBPUlQyQUREUihwb3J0KTsKKwlwb3J0X2FkZHIgPSAodm9sYXRpbGUgdTE2ICopaW9wb3J0X21hcChwb3J0LCAyKTsKKwl3aGlsZSAoY291bnQtLSkKKwkJKmJ1ZisrID0gKnBvcnRfYWRkcjsKIAotCXdoaWxlKGNvdW50LS0pCi0JICAgICpidWYrKyA9ICpwb3J0X2FkZHI7Ci0jaWZkZWYgU0gzX1BDTUNJQV9CVUdfV09SS0FST1VORAotCWN0cmxfaW5iIChEVU1NWV9SRUFEX0FSRUE2KTsKLSNlbmRpZgorCWR1bW15X3JlYWQoKTsKIH0KIAotdm9pZCBnZW5lcmljX2luc2wodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQpCit2b2lkIGdlbmVyaWNfaW5zbCh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpwb3J0X2FkZHI7Ci0JdW5zaWduZWQgbG9uZyAqYnVmPWJ1ZmZlcjsKKwl2b2xhdGlsZSB1MzIgKnBvcnRfYWRkcjsKKwl1MzIgKmJ1ZiA9IGRzdDsKIAotCXBvcnRfYWRkciA9ICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopUE9SVDJBRERSKHBvcnQpOworCXBvcnRfYWRkciA9ICh2b2xhdGlsZSB1MzIgKilpb3BvcnRfbWFwKHBvcnQsIDQpOworCXdoaWxlIChjb3VudC0tKQorCQkqYnVmKysgPSAqcG9ydF9hZGRyOwogCi0Jd2hpbGUoY291bnQtLSkKLQkgICAgKmJ1ZisrID0gKnBvcnRfYWRkcjsKLSNpZmRlZiBTSDNfUENNQ0lBX0JVR19XT1JLQVJPVU5ECi0JY3RybF9pbmIgKERVTU1ZX1JFQURfQVJFQTYpOwotI2VuZGlmCisJZHVtbXlfcmVhZCgpOwogfQogCi12b2lkIGdlbmVyaWNfb3V0Yih1bnNpZ25lZCBjaGFyIGIsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3ZvaWQgZ2VuZXJpY19vdXRiKHU4IGIsIHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKLQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKVBPUlQyQUREUihwb3J0KSA9IGI7CisJY3RybF9vdXRiKGIsICh1bnNpZ25lZCBsb25nIF9fZm9yY2UpaW9wb3J0X21hcChwb3J0LCAxKSk7CiB9CiAKLXZvaWQgZ2VuZXJpY19vdXR3KHVuc2lnbmVkIHNob3J0IGIsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3ZvaWQgZ2VuZXJpY19vdXR3KHUxNiBiLCB1bnNpZ25lZCBsb25nIHBvcnQpCiB7Ci0JKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCopUE9SVDJBRERSKHBvcnQpID0gYjsKKwljdHJsX291dHcoYiwgKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlpb3BvcnRfbWFwKHBvcnQsIDIpKTsKIH0KIAotdm9pZCBnZW5lcmljX291dGwodW5zaWduZWQgaW50IGIsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3ZvaWQgZ2VuZXJpY19vdXRsKHUzMiBiLCB1bnNpZ25lZCBsb25nIHBvcnQpCiB7Ci0gICAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyopUE9SVDJBRERSKHBvcnQpID0gYjsKKwljdHJsX291dGwoYiwgKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlpb3BvcnRfbWFwKHBvcnQsIDQpKTsKIH0KIAotdm9pZCBnZW5lcmljX291dGJfcCh1bnNpZ25lZCBjaGFyIGIsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3ZvaWQgZ2VuZXJpY19vdXRiX3AodTggYiwgdW5zaWduZWQgbG9uZyBwb3J0KQogewotCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciopUE9SVDJBRERSKHBvcnQpID0gYjsKKwlnZW5lcmljX291dGIoYiwgcG9ydCk7CiAJZGVsYXkoKTsKIH0KIAotdm9pZCBnZW5lcmljX291dHdfcCh1bnNpZ25lZCBzaG9ydCBiLCB1bnNpZ25lZCBsb25nIHBvcnQpCit2b2lkIGdlbmVyaWNfb3V0d19wKHUxNiBiLCB1bnNpZ25lZCBsb25nIHBvcnQpCiB7Ci0JKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCopUE9SVDJBRERSKHBvcnQpID0gYjsKKwlnZW5lcmljX291dHcoYiwgcG9ydCk7CiAJZGVsYXkoKTsKIH0KIAotdm9pZCBnZW5lcmljX291dGxfcCh1bnNpZ25lZCBpbnQgYiwgdW5zaWduZWQgbG9uZyBwb3J0KQordm9pZCBnZW5lcmljX291dGxfcCh1MzIgYiwgdW5zaWduZWQgbG9uZyBwb3J0KQogewotCSoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyopUE9SVDJBRERSKHBvcnQpID0gYjsKKwlnZW5lcmljX291dGwoYiwgcG9ydCk7CiAJZGVsYXkoKTsKIH0KIApAQCAtMTU0LDkwICsxNDksNzcgQEAKICAqIGFkZHJlc3MuIEhvd2V2ZXIgYXMgdGhlIHBvcnQgYWRkcmVzcyBkb2Vzbid0IGNoYW5nZSB3ZSBvbmx5IG5lZWQgdG8KICAqIGNvbnZlcnQgdGhlIHBvcnQgYWRkcmVzcyB0byByZWFsIGFkZHJlc3Mgb25jZS4KICAqLwotCi12b2lkIGdlbmVyaWNfb3V0c2IodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQpCit2b2lkIGdlbmVyaWNfb3V0c2IodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqcG9ydF9hZGRyOwotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1Zj1idWZmZXI7CisJdm9sYXRpbGUgdTggKnBvcnRfYWRkcjsKKwljb25zdCB1OCAqYnVmID0gc3JjOwogCi0JcG9ydF9hZGRyID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilQT1JUMkFERFIocG9ydCk7CisJcG9ydF9hZGRyID0gKHZvbGF0aWxlIHU4IF9fZm9yY2UgKilpb3BvcnRfbWFwKHBvcnQsIDEpOwogCi0Jd2hpbGUoY291bnQtLSkKLQkgICAgKnBvcnRfYWRkciA9ICpidWYrKzsKKwl3aGlsZSAoY291bnQtLSkKKwkJKnBvcnRfYWRkciA9ICpidWYrKzsKIH0KIAotdm9pZCBnZW5lcmljX291dHN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50KQordm9pZCBnZW5lcmljX291dHN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICpwb3J0X2FkZHI7Ci0JY29uc3QgdW5zaWduZWQgc2hvcnQgKmJ1Zj1idWZmZXI7CisJdm9sYXRpbGUgdTE2ICpwb3J0X2FkZHI7CisJY29uc3QgdTE2ICpidWYgPSBzcmM7CiAKLQlwb3J0X2FkZHIgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilQT1JUMkFERFIocG9ydCk7CisJcG9ydF9hZGRyID0gKHZvbGF0aWxlIHUxNiBfX2ZvcmNlICopaW9wb3J0X21hcChwb3J0LCAyKTsKIAotCXdoaWxlKGNvdW50LS0pCi0JICAgICpwb3J0X2FkZHIgPSAqYnVmKys7CisJd2hpbGUgKGNvdW50LS0pCisJCSpwb3J0X2FkZHIgPSAqYnVmKys7CiAKLSNpZmRlZiBTSDNfUENNQ0lBX0JVR19XT1JLQVJPVU5ECi0JY3RybF9pbmIgKERVTU1ZX1JFQURfQVJFQTYpOwotI2VuZGlmCisJZHVtbXlfcmVhZCgpOwogfQogCi12b2lkIGdlbmVyaWNfb3V0c2wodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQpCit2b2lkIGdlbmVyaWNfb3V0c2wodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqcG9ydF9hZGRyOwotCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmJ1Zj1idWZmZXI7CisJdm9sYXRpbGUgdTMyICpwb3J0X2FkZHI7CisJY29uc3QgdTMyICpidWYgPSBzcmM7CiAKLQlwb3J0X2FkZHIgPSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKVBPUlQyQUREUihwb3J0KTsKKwlwb3J0X2FkZHIgPSAodm9sYXRpbGUgdTMyIF9fZm9yY2UgKilpb3BvcnRfbWFwKHBvcnQsIDQpOworCXdoaWxlIChjb3VudC0tKQorCQkqcG9ydF9hZGRyID0gKmJ1ZisrOwogCi0Jd2hpbGUoY291bnQtLSkKLQkgICAgKnBvcnRfYWRkciA9ICpidWYrKzsKLQotI2lmZGVmIFNIM19QQ01DSUFfQlVHX1dPUktBUk9VTkQKLQljdHJsX2luYiAoRFVNTVlfUkVBRF9BUkVBNik7Ci0jZW5kaWYKKwlkdW1teV9yZWFkKCk7CiB9CiAKLXVuc2lnbmVkIGNoYXIgZ2VuZXJpY19yZWFkYih1bnNpZ25lZCBsb25nIGFkZHIpCit1OCBnZW5lcmljX3JlYWRiKHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKilhZGRyOworCXJldHVybiBjdHJsX2luYigodW5zaWduZWQgbG9uZyBfX2ZvcmNlKWFkZHIpOwogfQogCi11bnNpZ25lZCBzaG9ydCBnZW5lcmljX3JlYWR3KHVuc2lnbmVkIGxvbmcgYWRkcikKK3UxNiBnZW5lcmljX3JlYWR3KHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCopYWRkcjsKKwlyZXR1cm4gY3RybF9pbncoKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlhZGRyKTsKIH0KIAotdW5zaWduZWQgaW50IGdlbmVyaWNfcmVhZGwodW5zaWduZWQgbG9uZyBhZGRyKQordTMyIGdlbmVyaWNfcmVhZGwodm9pZCBfX2lvbWVtICphZGRyKQogewotCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcqKWFkZHI7CisJcmV0dXJuIGN0cmxfaW5sKCh1bnNpZ25lZCBsb25nIF9fZm9yY2UpYWRkcik7CiB9CiAKLXZvaWQgZ2VuZXJpY193cml0ZWIodW5zaWduZWQgY2hhciBiLCB1bnNpZ25lZCBsb25nIGFkZHIpCit2b2lkIGdlbmVyaWNfd3JpdGViKHU4IGIsIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKWFkZHIgPSBiOworCWN0cmxfb3V0YihiLCAodW5zaWduZWQgbG9uZyBfX2ZvcmNlKWFkZHIpOwogfQogCi12b2lkIGdlbmVyaWNfd3JpdGV3KHVuc2lnbmVkIHNob3J0IGIsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3ZvaWQgZ2VuZXJpY193cml0ZXcodTE2IGIsIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQkqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0KilhZGRyID0gYjsKKwljdHJsX291dHcoYiwgKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlhZGRyKTsKIH0KIAotdm9pZCBnZW5lcmljX3dyaXRlbCh1bnNpZ25lZCBpbnQgYiwgdW5zaWduZWQgbG9uZyBhZGRyKQordm9pZCBnZW5lcmljX3dyaXRlbCh1MzIgYiwgdm9pZCBfX2lvbWVtICphZGRyKQogewotICAgICAgICAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcqKWFkZHIgPSBiOworCWN0cmxfb3V0bChiLCAodW5zaWduZWQgbG9uZyBfX2ZvcmNlKWFkZHIpOwogfQogCi12b2lkICogZ2VuZXJpY19pb3JlbWFwKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUpCit2b2lkIF9faW9tZW0gKmdlbmVyaWNfaW9wb3J0X21hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBzaXplKQogewotCXJldHVybiAodm9pZCAqKSBQMlNFR0FERFIob2Zmc2V0KTsKKwlyZXR1cm4gKHZvaWQgX19pb21lbSAqKShhZGRyICsgZ2VuZXJpY19pb19iYXNlKTsKIH0KLUVYUE9SVF9TWU1CT0woZ2VuZXJpY19pb3JlbWFwKTsKIAotdm9pZCBnZW5lcmljX2lvdW5tYXAodm9pZCAqYWRkcikKK3ZvaWQgZ2VuZXJpY19pb3BvcnRfdW5tYXAodm9pZCBfX2lvbWVtICphZGRyKQogewogfQotRVhQT1JUX1NZTUJPTChnZW5lcmljX2lvdW5tYXApOwotCi11bnNpZ25lZCBsb25nIGdlbmVyaWNfaXNhX3BvcnQyYWRkcih1bnNpZ25lZCBsb25nIG9mZnNldCkKLXsKLQlyZXR1cm4gb2Zmc2V0ICsgZ2VuZXJpY19pb19iYXNlOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvaXJxLmMgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwppbmRleCA1NGMxNzEyLi42ODgzYzAwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwpAQCAtOCwzOCArOCwxMyBAQAogICogU3VwZXJIIHZlcnNpb246ICBDb3B5cmlnaHQgKEMpIDE5OTkgIE5paWJlIFl1dGFrYQogICovCiAKLS8qCi0gKiBJUlFzIGFyZSBpbiBmYWN0IGltcGxlbWVudGVkIGEgYml0IGxpa2Ugc2lnbmFsIGhhbmRsZXJzIGZvciB0aGUga2VybmVsLgotICogTmF0dXJhbGx5IGl0J3Mgbm90IGEgMToxIHJlbGF0aW9uLCBidXQgdGhlcmUgYXJlIHNpbWlsYXJpdGllcy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXguaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KLSNpbmNsdWRlIDxhc20vZGVsYXkuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vY3B1L21tdV9jb250ZXh0Lmg+CiAKIC8qCiAgKiAnd2hhdCBzaG91bGQgd2UgZG8gaWYgd2UgZ2V0IGEgaHcgaXJxIGV2ZW50IG9uIGFuIGlsbGVnYWwgdmVjdG9yJy4KQEAgLTY2LDcgKzQxLDcgQEAKIAkJc2VxX3B1dGMocCwgJ1xuJyk7CiAJfQogCi0JaWYgKGkgPCBBQ1RVQUxfTlJfSVJRUykgeworCWlmIChpIDwgTlJfSVJRUykgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2Rlc2NbaV0ubG9jaywgZmxhZ3MpOwogCQlhY3Rpb24gPSBpcnFfZGVzY1tpXS5hY3Rpb247CiAJCWlmICghYWN0aW9uKQpAQCAtODYsMTkgKzYxLDMyIEBACiB9CiAjZW5kaWYKIAorCiBhc21saW5rYWdlIGludCBkb19JUlEodW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKIAkJICAgICAgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKIAkJICAgICAgc3RydWN0IHB0X3JlZ3MgcmVncykKLXsJCi0JaW50IGlycTsKK3sKKwlpbnQgaXJxID0gcjQ7CiAKIAlpcnFfZW50ZXIoKTsKLQlhc20gdm9sYXRpbGUoInN0YwlyMl9iYW5rLCAlMFxuXHQiCi0JCSAgICAgInNobHIyCSUwXG5cdCIKLQkJICAgICAic2hscjIJJTBcblx0IgotCQkgICAgICJzaGxyCSUwXG5cdCIKLQkJICAgICAiYWRkCSMtMTYsICUwXG5cdCIKLQkJICAgICA6Ij16IiAoaXJxKSk7CisKKyNpZmRlZiBDT05GSUdfQ1BVX0hBU19JTlRFVlQKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisjaWZkZWYgQ09ORklHX0NQVV9IQVNfU1JfUkIKKwkJInN0YwlyMl9iYW5rLCAlMFxuXHQiCisjZWxzZQorCQkibW92LmwJQCUxLCAlMFxuXHQiCisjZW5kaWYKKwkJInNobHIyCSUwXG5cdCIKKwkJInNobHIyCSUwXG5cdCIKKwkJInNobHIJJTBcblx0IgorCQkiYWRkCSMtMTYsICUwXG5cdCIKKwkJOiAiPXoiIChpcnEpLCAiPXIiIChyNCkKKwkJOiAiMSIgKElOVEVWVCkKKwkJOiAibWVtb3J5IgorCSk7CisjZW5kaWYKKwogCWlycSA9IGlycV9kZW11eChpcnEpOwogCV9fZG9fSVJRKGlycSwgJnJlZ3MpOwogCWlycV9leGl0KCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMgYi9hcmNoL3NoL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM1NDY1MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL21hY2hpbmVfa2V4ZWMuYwpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIG1hY2hpbmVfa2V4ZWMuYyAtIGhhbmRsZSB0cmFuc2l0aW9uIG9mIExpbnV4IGJvb3RpbmcgYW5vdGhlciBrZXJuZWwKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIEVyaWMgQmllZGVybWFuICA8ZWJpZWRlcm1AeG1pc3Npb24uY29tPgorICoKKyAqIEdhbWVDdWJlL3BwYzMyIHBvcnQgQ29weXJpZ2h0IChDKSAyMDA0IEFsYmVydCBIZXJyYW56CisgKiBMQU5ESVNLL3NoNCBzdXBwb3J0ZWQgYnkga29naWlkZW5hCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiBWZXJzaW9uIDIuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CisjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKwordHlwZWRlZiBOT1JFVF9UWVBFIHZvaWQgKCpyZWxvY2F0ZV9uZXdfa2VybmVsX3QpKAorCQkJCXVuc2lnbmVkIGxvbmcgaW5kaXJlY3Rpb25fcGFnZSwKKwkJCQl1bnNpZ25lZCBsb25nIHJlYm9vdF9jb2RlX2J1ZmZlciwKKwkJCQl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHJlc3MsCisJCQkJdW5zaWduZWQgbG9uZyB2YnJfcmVnKSBBVFRSSUJfTk9SRVQ7CisKK2NvbnN0IGV4dGVybiB1bnNpZ25lZCBjaGFyIHJlbG9jYXRlX25ld19rZXJuZWxbXTsKK2NvbnN0IGV4dGVybiB1bnNpZ25lZCBpbnQgcmVsb2NhdGVfbmV3X2tlcm5lbF9zaXplOworZXh0ZXJuIHZvaWQgKmdkYl92YnJfdmVjdG9yOworCisvKgorICogUHJvdmlkZSBhIGR1bW15IGNyYXNoX25vdGVzIGRlZmluaXRpb24gd2hpbGUgY3Jhc2ggZHVtcCBhcnJpdmVzIHRvIHBwYy4KKyAqIFRoaXMgcHJldmVudHMgYnJlYWthZ2Ugb2YgY3Jhc2hfbm90ZXMgYXR0cmlidXRlIGluIGtlcm5lbC9rc3lzZnMuYy4KKyAqLwordm9pZCAqY3Jhc2hfbm90ZXMgPSBOVUxMOworCit2b2lkIG1hY2hpbmVfc2h1dGRvd24odm9pZCkKK3sKK30KKwordm9pZCBtYWNoaW5lX2NyYXNoX3NodXRkb3duKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworfQorCisvKgorICogRG8gd2hhdCBldmVyeSBzZXR1cCBpcyBuZWVkZWQgb24gaW1hZ2UgYW5kIHRoZQorICogcmVib290IGNvZGUgYnVmZmVyIHRvIGFsbG93IHVzIHRvIGF2b2lkIGFsbG9jYXRpb25zCisgKiBsYXRlci4KKyAqLworaW50IG1hY2hpbmVfa2V4ZWNfcHJlcGFyZShzdHJ1Y3Qga2ltYWdlICppbWFnZSkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtYWNoaW5lX2tleGVjX2NsZWFudXAoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCit7Cit9CisKK3N0YXRpYyB2b2lkIGtleGVjX2luZm8oc3RydWN0IGtpbWFnZSAqaW1hZ2UpCit7CisgICAgICAgIGludCBpOworCXByaW50aygia2V4ZWMgaW5mb3JtYXRpb25cbiIpOworCWZvciAoaSA9IDA7IGkgPCBpbWFnZS0+bnJfc2VnbWVudHM7IGkrKykgeworCSAgICAgICAgcHJpbnRrKCIgIHNlZ21lbnRbJWRdOiAweCUwOHggLSAweCUwOHggKDB4JTA4eClcbiIsCisJCSAgICAgICBpLAorCQkgICAgICAgKHVuc2lnbmVkIGludClpbWFnZS0+c2VnbWVudFtpXS5tZW0sCisJCSAgICAgICAodW5zaWduZWQgaW50KWltYWdlLT5zZWdtZW50W2ldLm1lbSArIGltYWdlLT5zZWdtZW50W2ldLm1lbXN6LAorCQkgICAgICAgKHVuc2lnbmVkIGludClpbWFnZS0+c2VnbWVudFtpXS5tZW1zeik7CisgCX0KKwlwcmludGsoIiAgc3RhcnQgICAgIDogMHglMDh4XG5cbiIsICh1bnNpZ25lZCBpbnQpaW1hZ2UtPnN0YXJ0KTsKK30KKworCisvKgorICogRG8gbm90IGFsbG9jYXRlIG1lbW9yeSAob3IgZmFpbCBpbiBhbnkgd2F5KSBpbiBtYWNoaW5lX2tleGVjKCkuCisgKiBXZSBhcmUgcGFzdCB0aGUgcG9pbnQgb2Ygbm8gcmV0dXJuLCBjb21taXR0ZWQgdG8gcmVib290aW5nIG5vdy4KKyAqLworTk9SRVRfVFlQRSB2b2lkIG1hY2hpbmVfa2V4ZWMoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCit7CisKKwl1bnNpZ25lZCBsb25nIHBhZ2VfbGlzdDsKKwl1bnNpZ25lZCBsb25nIHJlYm9vdF9jb2RlX2J1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIHZicl9yZWc7CisJcmVsb2NhdGVfbmV3X2tlcm5lbF90IHJuazsKKworI2lmIGRlZmluZWQoQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MpCisJdmJyX3JlZyA9ICgodW5zaWduZWQgbG9uZyApZ2RiX3Zicl92ZWN0b3IpIC0gMHgxMDA7CisjZWxzZQorCXZicl9yZWcgPSAweDgwMDAwMDAwOyAgLy8gZHVtbXkKKyNlbmRpZgorCS8qIEludGVycnVwdHMgYXJlbid0IGFjY2VwdGFibGUgd2hpbGUgd2UgcmVib290ICovCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCXBhZ2VfbGlzdCA9IGltYWdlLT5oZWFkOworCisJLyogd2UgbmVlZCBib3RoIGVmZmVjdGl2ZSBhbmQgcmVhbCBhZGRyZXNzIGhlcmUgKi8KKwlyZWJvb3RfY29kZV9idWZmZXIgPQorCQkJKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKGltYWdlLT5jb250cm9sX2NvZGVfcGFnZSk7CisKKwkvKiBjb3B5IG91ciBrZXJuZWwgcmVsb2NhdGlvbiBjb2RlIHRvIHRoZSBjb250cm9sIGNvZGUgcGFnZSAqLworCW1lbWNweSgodm9pZCAqKXJlYm9vdF9jb2RlX2J1ZmZlciwgcmVsb2NhdGVfbmV3X2tlcm5lbCwKKwkJCQkJCXJlbG9jYXRlX25ld19rZXJuZWxfc2l6ZSk7CisKKyAgICAgICAga2V4ZWNfaW5mbyhpbWFnZSk7CisJZmx1c2hfY2FjaGVfYWxsKCk7CisKKwkvKiBub3cgY2FsbCBpdCAqLworCXJuayA9IChyZWxvY2F0ZV9uZXdfa2VybmVsX3QpIHJlYm9vdF9jb2RlX2J1ZmZlcjsKKyAgICAgICAJKCpybmspKHBhZ2VfbGlzdCwgcmVib290X2NvZGVfYnVmZmVyLCBpbWFnZS0+c3RhcnQsIHZicl9yZWcpOworfQorCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggZmQ0ZjI0MC4uYTRkYzJiNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvc2gva2VybmVsL3Byb2Nlc3MuYwpAQCAtNzEsNiArNzEsMTYgQEAKIAogdm9pZCBtYWNoaW5lX3Jlc3RhcnQoY2hhciAqIF9fdW51c2VkKQogeworCisjaWZkZWYgQ09ORklHX0tFWEVDCisJc3RydWN0IGtpbWFnZSAqaW1hZ2U7CisJaW1hZ2UgPSB4Y2hnKCZrZXhlY19pbWFnZSwgMCk7CisJaWYgKGltYWdlKSB7CisJCW1hY2hpbmVfc2h1dGRvd24oKTsKKwkJbWFjaGluZV9rZXhlYyhpbWFnZSk7CisJfQorI2VuZGlmCisKIAkvKiBTUi5CTD0xIGFuZCBpbnZva2UgYWRkcmVzcyBlcnJvciB0byBsZXQgQ1BVIHJlc2V0IChtYW51YWwgcmVzZXQpICovCiAJYXNtIHZvbGF0aWxlKCJsZGMgJTAsIHNyXG5cdCIKIAkJICAgICAibW92LmwgQCUxLCAlMCIgOiA6ICJyIiAoMHgxMDAwMDAwMCksICJyIiAoMHg4MDAwMDAwMSkpOwpAQCAtMTkxLDEzICsyMDEsOCBAQAogewogI2lmIGRlZmluZWQoQ09ORklHX1NIX0ZQVSkKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikKLQkJCQkoKHVuc2lnbmVkIGxvbmcpdHNrLT50aHJlYWRfaW5mbwotCQkJCSArIFRIUkVBRF9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKQotCQkJCSAtIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0KIAkvKiBGb3JnZXQgbGF6eSBGUFUgc3RhdGUgKi8KLQljbGVhcl9mcHUodHNrLCByZWdzKTsKKwljbGVhcl9mcHUodHNrLCB0YXNrX3B0X3JlZ3ModHNrKSk7CiAJY2xlYXJfdXNlZF9tYXRoKCk7CiAjZW5kaWYKIH0KQEAgLTIzMiwxMyArMjM3LDcgQEAKIHsKIAlzdHJ1Y3QgcHRfcmVncyBwdHJlZ3M7CiAJCi0JcHRyZWdzID0gKihzdHJ1Y3QgcHRfcmVncyAqKQotCQkoKHVuc2lnbmVkIGxvbmcpdHNrLT50aHJlYWRfaW5mbyArIFRIUkVBRF9TSVpFCi0JCSAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncykKLSNpZmRlZiBDT05GSUdfU0hfRFNQCi0JCSAtIHNpemVvZihzdHJ1Y3QgcHRfZHNwcmVncykKLSNlbmRpZgotCQkgLSBzaXplb2YodW5zaWduZWQgbG9uZykpOworCXB0cmVncyA9ICp0YXNrX3B0X3JlZ3ModHNrKTsKIAllbGZfY29yZV9jb3B5X3JlZ3MocmVncywgJnB0cmVncyk7CiAKIAlyZXR1cm4gMTsKQEAgLTI1MiwxMSArMjUxLDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19TSF9GUFUpCiAJZnB2YWxpZCA9ICEhdHNrX3VzZWRfbWF0aCh0c2spOwogCWlmIChmcHZhbGlkKSB7Ci0JCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopCi0JCQkJCSgodW5zaWduZWQgbG9uZyl0c2stPnRocmVhZF9pbmZvCi0JCQkJCSArIFRIUkVBRF9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKQotCQkJCQkgLSBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCQl1bmxhenlfZnB1KHRzaywgcmVncyk7CisJCXVubGF6eV9mcHUodHNrLCB0YXNrX3B0X3JlZ3ModHNrKSk7CiAJCW1lbWNweShmcHUsICZ0c2stPnRocmVhZC5mcHUuaGFyZCwgc2l6ZW9mKCpmcHUpKTsKIAl9CiAjZW5kaWYKQEAgLTI3OSwxOCArMjc0LDEzIEBACiAJY29weV90b19zdG9wcGVkX2NoaWxkX3VzZWRfbWF0aChwKTsKICNlbmRpZgogCi0JY2hpbGRyZWdzID0gKChzdHJ1Y3QgcHRfcmVncyAqKQotCQkoVEhSRUFEX1NJWkUgKyAodW5zaWduZWQgbG9uZykgcC0+dGhyZWFkX2luZm8pCi0jaWZkZWYgQ09ORklHX1NIX0RTUAotCQktIHNpemVvZihzdHJ1Y3QgcHRfZHNwcmVncykKLSNlbmRpZgotCQktIHNpemVvZih1bnNpZ25lZCBsb25nKSkgLSAxOworCWNoaWxkcmVncyA9IHRhc2tfcHRfcmVncyhwKTsKIAkqY2hpbGRyZWdzID0gKnJlZ3M7CiAKIAlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CiAJCWNoaWxkcmVncy0+cmVnc1sxNV0gPSB1c3A7CiAJfSBlbHNlIHsKLQkJY2hpbGRyZWdzLT5yZWdzWzE1XSA9ICh1bnNpZ25lZCBsb25nKXAtPnRocmVhZF9pbmZvICsgVEhSRUFEX1NJWkU7CisJCWNoaWxkcmVncy0+cmVnc1sxNV0gPSAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UocCkgKyBUSFJFQURfU0laRTsKIAl9CiAgICAgICAgIGlmIChjbG9uZV9mbGFncyAmIENMT05FX1NFVFRMUykgewogCQljaGlsZHJlZ3MtPmdiciA9IGNoaWxkcmVncy0+cmVnc1swXTsKQEAgLTMwNSwyNiArMjk1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIGZpbGwgaW4gdGhlIHVzZXIgc3RydWN0dXJlIGZvciBhIGNvcmUgZHVtcC4uCi0gKi8KLXZvaWQgZHVtcF90aHJlYWQoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBzdHJ1Y3QgdXNlciAqIGR1bXApCi17Ci0JZHVtcC0+bWFnaWMgPSBDTUFHSUM7Ci0JZHVtcC0+c3RhcnRfY29kZSA9IGN1cnJlbnQtPm1tLT5zdGFydF9jb2RlOwotCWR1bXAtPnN0YXJ0X2RhdGEgID0gY3VycmVudC0+bW0tPnN0YXJ0X2RhdGE7Ci0JZHVtcC0+c3RhcnRfc3RhY2sgPSByZWdzLT5yZWdzWzE1XSAmIH4oUEFHRV9TSVpFIC0gMSk7Ci0JZHVtcC0+dV90c2l6ZSA9IChjdXJyZW50LT5tbS0+ZW5kX2NvZGUgLSBkdW1wLT5zdGFydF9jb2RlKSA+PiBQQUdFX1NISUZUOwotCWR1bXAtPnVfZHNpemUgPSAoY3VycmVudC0+bW0tPmJyayArIChQQUdFX1NJWkUtMSkgLSBkdW1wLT5zdGFydF9kYXRhKSA+PiBQQUdFX1NISUZUOwotCWR1bXAtPnVfc3NpemUgPSAoY3VycmVudC0+bW0tPnN0YXJ0X3N0YWNrIC0gZHVtcC0+c3RhcnRfc3RhY2sgKwotCQkJIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7Ci0JLyogRGVidWcgcmVnaXN0ZXJzIHdpbGwgY29tZSBoZXJlLiAqLwotCi0JZHVtcC0+cmVncyA9ICpyZWdzOwotCi0JZHVtcC0+dV9mcHZhbGlkID0gZHVtcF9mcHUocmVncywgJmR1bXAtPmZwdSk7Ci19Ci0KIC8qIFRyYWNpbmcgYnkgdXNlciBicmVhayBjb250cm9sbGVyLiAgKi8KIHN0YXRpYyB2b2lkCiB1YmNfc2V0X3RyYWNpbmcoaW50IGFzaWQsIHVuc2lnbmVkIGxvbmcgcGMpCkBAIC0zNTMsMTEgKzMyMyw3IEBACiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKl9fc3dpdGNoX3RvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0KQogewogI2lmIGRlZmluZWQoQ09ORklHX1NIX0ZQVSkKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKQotCQkJCSgodW5zaWduZWQgbG9uZylwcmV2LT50aHJlYWRfaW5mbwotCQkJCSArIFRIUkVBRF9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKQotCQkJCSAtIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0JdW5sYXp5X2ZwdShwcmV2LCByZWdzKTsKKwl1bmxhenlfZnB1KHByZXYsIHRhc2tfcHRfcmVncyhwcmV2KSk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QUkVFTVBUCkBAIC0zNjYsMTMgKzMzMiw3IEBACiAJCXN0cnVjdCBwdF9yZWdzICpyZWdzOwogCiAJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKQotCQkJKCh1bnNpZ25lZCBsb25nKXByZXYtPnRocmVhZF9pbmZvCi0JCQkgKyBUSFJFQURfU0laRSAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncykKLSNpZmRlZiBDT05GSUdfU0hfRFNQCi0JCQkgLSBzaXplb2Yoc3RydWN0IHB0X2RzcHJlZ3MpCi0jZW5kaWYKLQkJCSAtIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJCXJlZ3MgPSB0YXNrX3B0X3JlZ3MocHJldik7CiAJCWlmICh1c2VyX21vZGUocmVncykgJiYgcmVncy0+cmVnc1sxNV0gPj0gMHhjMDAwMDAwMCkgewogCQkJaW50IG9mZnNldCA9IChpbnQpcmVncy0+cmVnc1sxNV07CiAKQEAgLTM5Miw3ICszNTIsNyBAQAogCSAqLwogCWFzbSB2b2xhdGlsZSgibGRjCSUwLCByN19iYW5rIgogCQkgICAgIDogLyogbm8gb3V0cHV0ICovCi0JCSAgICAgOiAiciIgKG5leHQtPnRocmVhZF9pbmZvKSk7CisJCSAgICAgOiAiciIgKHRhc2tfdGhyZWFkX2luZm8obmV4dCkpKTsKIAogI2lmZGVmIENPTkZJR19NTVUKIAkvKiBJZiBubyB0YXNrcyBhcmUgdXNpbmcgdGhlIFVCQywgd2UncmUgZG9uZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL3NoL2tlcm5lbC9wdHJhY2UuYwppbmRleCAxYThiZTA2Li4zODg3YjRmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3NoL2tlcm5lbC9wdHJhY2UuYwpAQCAtNDEsMTIgKzQxLDcgQEAKIHsKIAl1bnNpZ25lZCBjaGFyICpzdGFjazsKIAotCXN0YWNrID0gKHVuc2lnbmVkIGNoYXIgKikKLQkJdGFzay0+dGhyZWFkX2luZm8gKyBUSFJFQURfU0laRQktIHNpemVvZihzdHJ1Y3QgcHRfcmVncykKLSNpZmRlZiBDT05GSUdfU0hfRFNQCi0JCS0gc2l6ZW9mKHN0cnVjdCBwdF9kc3ByZWdzKQotI2VuZGlmCi0JCS0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCXN0YWNrID0gKHVuc2lnbmVkIGNoYXIgKil0YXNrX3B0X3JlZ3ModGFzayk7CiAJc3RhY2sgKz0gb2Zmc2V0OwogCXJldHVybiAoKigoaW50ICopc3RhY2spKTsKIH0KQEAgLTU5LDEyICs1NCw3IEBACiB7CiAJdW5zaWduZWQgY2hhciAqc3RhY2s7CiAKLQlzdGFjayA9ICh1bnNpZ25lZCBjaGFyICopCi0JCXRhc2stPnRocmVhZF9pbmZvICsgVEhSRUFEX1NJWkUgLSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpCi0jaWZkZWYgQ09ORklHX1NIX0RTUAotCQktIHNpemVvZihzdHJ1Y3QgcHRfZHNwcmVncykKLSNlbmRpZgotCQktIHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwlzdGFjayA9ICh1bnNpZ25lZCBjaGFyICopdGFza19wdF9yZWdzKHRhc2spOwogCXN0YWNrICs9IG9mZnNldDsKIAkqKHVuc2lnbmVkIGxvbmcgKikgc3RhY2sgPSBkYXRhOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMgYi9hcmNoL3NoL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDY5NWNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiByZWxvY2F0ZV9rZXJuZWwuUyAtIHB1dCB0aGUga2VybmVsIGltYWdlIGluIHBsYWNlIHRvIGJvb3QKKyAqIDIwMDUuOS4xNyBrb2dpaWRlbmFAZWdncGxhbnQuZGRvLmpwCisgKgorICogTEFORElTSy9zaDQgaXMgc3VwcG9ydGVkLiBNYXliZSwgU0ggYXJjaHRlY3R1cmUgd29ya3Mgd2VsbC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIFZlcnNpb24gMi4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKworI2RlZmluZSBQQUdFX1NJWkUgICAgICA0MDk2IC8qIG11c3QgYmUgc2FtZSB2YWx1ZSBhcyBpbiA8YXNtL3BhZ2UuaD4gKi8KKworCisJCS5nbG9ibCByZWxvY2F0ZV9uZXdfa2VybmVsCityZWxvY2F0ZV9uZXdfa2VybmVsOgorCS8qIHI0ID0gaW5kaXJlY3Rpb25fcGFnZSAgICovCisJLyogcjUgPSByZWJvb3RfY29kZV9idWZmZXIgKi8KKwkvKiByNiA9IHN0YXJ0X2FkZHJlc3MgICAgICAqLworCS8qIHI3ID0gdmJyX3JlZyAgICAgICAgICAgICovCisKKwltb3YubAkxMGYscjgJICAvKiA0MDk2ICovCisJbW92LmwJMTFmLHI5ICAgIC8qIDB4YTAwMDAwMDAgKi8KKworCS8qICBzdGFjayBzZXR0aW5nICovCisJYWRkCXI4LHI1CisJbW92CXI1LHIxNQorCisJYnJhCTFmCisJbW92CXI0LHIwCSAgLyogY21kID0gaW5kaXJlY3Rpb25fcGFnZSAqLworMDoKKwltb3YubAlAcjQrLHIwCSAgLyogY21kID0gKmluZCsrICovCisKKzE6CS8qIGFkZHIgPSAoY21kIHwgMHhhMDAwMDAwMCkgJiAweGZmZmZmZmYwICovCisJbW92CXIwLHIyCisJb3IJcjkscjIKKwltb3YJIy0xNixyMQorCWFuZAlyMSxyMgorCisJLyogaWYoY21kICYgSU5EX0RFU1RJTkFUSU9OKSBkc3QgPSBhZGRyICAqLworCXRzdAkjMSxyMAorCWJ0CTJmCisJYnJhCTBiCisJbW92CXIyLHI1CisKKzI6CS8qIGVsc2UgaWYoY21kICYgSU5EX0lORElSRUNUSU9OKSBpbmQgPSBhZGRyICAqLworCXRzdAkjMixyMAorCWJ0CTNmCisJYnJhCTBiCisJbW92CXIyLHI0CisKKzM6CS8qIGVsc2UgaWYoY21kICYgSU5EX0RPTkUpIGdvdG8gNiAgKi8KKwl0c3QJIzQscjAKKwlidAk0ZgorCWJyYQk2ZgorCW5vcAorCis0OgkvKiBlbHNlIGlmKGNtZCAmIElORF9TT1VSQ0UpIG1lbWNweShkc3QsYWRkcixQQUdFX1NJWkUpICovCisJdHN0CSM4LHIwCisJYnQJMGIKKworCW1vdglyOCxyMworCXNobHIyCXIzCisJc2hscjIJcjMKKzU6CisJZHQJcjMKKwltb3YubAlAcjIrLHIxICAgLyogIDE2biswICovCisJbW92LmwJcjEsQHI1CisJYWRkCSM0LHI1CisJbW92LmwJQHIyKyxyMQkgIC8qICAxNm4rNCAqLworCW1vdi5sCXIxLEByNQorCWFkZAkjNCxyNQorCW1vdi5sCUByMisscjEgICAvKiAgMTZuKzggKi8KKwltb3YubAlyMSxAcjUKKwlhZGQJIzQscjUKKwltb3YubAlAcjIrLHIxICAgLyogIDE2bisxMiAqLworCW1vdi5sCXIxLEByNQorCWFkZAkjNCxyNQorCWJmCTViCisKKwlicmEJMGIKKwlub3AKKzY6CisjaWZkZWYgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MKKwlsZGMgICByNywgdmJyCisjZW5kaWYKKwlqbXAgQHI2CisJbm9wCisKKwkuYWxpZ24gMgorMTA6CisJLmxvbmcJUEFHRV9TSVpFCisxMToKKwkubG9uZwkweGEwMDAwMDAwCisKK3JlbG9jYXRlX25ld19rZXJuZWxfZW5kOgorCisJLmdsb2JsIHJlbG9jYXRlX25ld19rZXJuZWxfc2l6ZQorcmVsb2NhdGVfbmV3X2tlcm5lbF9zaXplOgorCS5sb25nIHJlbG9jYXRlX25ld19rZXJuZWxfZW5kIC0gcmVsb2NhdGVfbmV3X2tlcm5lbApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc2hfa3N5bXMuYyBiL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zLmMKaW5kZXggNjk1NGZkNi4uMWNmOTRhNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvc2hfa3N5bXMuYworKysgYi9hcmNoL3NoL2tlcm5lbC9zaF9rc3ltcy5jCkBAIC0yMSwxNCArMjEsMTIgQEAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgogCi1leHRlcm4gdm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgdXNlciAqKTsKIGV4dGVybiBpbnQgZHVtcF9mcHUoc3RydWN0IHB0X3JlZ3MgKiwgZWxmX2ZwcmVnc2V0X3QgKik7CiBleHRlcm4gc3RydWN0IGh3X2ludGVycnVwdF90eXBlIG5vX2lycV90eXBlOwogCiBFWFBPUlRfU1lNQk9MKHNoX212KTsKIAogLyogcGxhdGZvcm0gZGVwZW5kZW50IHN1cHBvcnQgKi8KLUVYUE9SVF9TWU1CT0woZHVtcF90aHJlYWQpOwogRVhQT1JUX1NZTUJPTChkdW1wX2ZwdSk7CiBFWFBPUlRfU1lNQk9MKGlvdW5tYXApOwogRVhQT1JUX1NZTUJPTChlbmFibGVfaXJxKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3NtcC5jIGIvYXJjaC9zaC9rZXJuZWwvc21wLmMKaW5kZXggNTllNDliMS4uNjJjN2QxYyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvc21wLmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogCWlmIChJU19FUlIodHNrKSkKIAkJcGFuaWMoIkZhaWxlZCBmb3JraW5nIGlkbGUgdGFzayBmb3IgY3B1ICVkXG4iLCBjcHUpOwogCQotCXRzay0+dGhyZWFkX2luZm8tPmNwdSA9IGNwdTsKKwl0YXNrX3RocmVhZF9pbmZvKHRzayktPmNwdSA9IGNwdTsKIAogCWNwdV9zZXQoY3B1LCBjcHVfb25saW5lX21hcCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3RpbWUuYyBiL2FyY2gvc2gva2VybmVsL3RpbWUuYwppbmRleCA2NzFiODc2Li4zMTRhMjc1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdGltZS5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqICBDb3B5cmlnaHQgKEMpIDE5OTkgIFRldHN1eWEgT2thZGEgJiBOaWliZSBZdXRha2EKICAqICBDb3B5cmlnaHQgKEMpIDIwMDAgIFBoaWxpcHAgUnVtcGYgPHBydW1wZkB0dXgub3JnPgotICogIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCAgUGF1bCBNdW5kdAorICogIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSAgUGF1bCBNdW5kdAogICogIENvcHlyaWdodCAoQykgMjAwMiAgTS4gUi4gQnJvd24gIDxtcmJyb3duQGxpbnV4LXNoLm9yZz4KICAqCiAgKiAgU29tZSBjb2RlIHRha2VuIGZyb20gaTM4NiB2ZXJzaW9uLgpAQCAtMTEsNTAgKzExLDIxIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2ZpbGUuaD4KLQotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vZGVsYXkuaD4KLSNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgorI2luY2x1ZGUgPGFzbS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9ydGMuaD4KLSNpbmNsdWRlIDxhc20vZnJlcS5oPgotI2luY2x1ZGUgPGFzbS9jcHUvdGltZXIuaD4KLSNpZmRlZiBDT05GSUdfU0hfS0dEQgorI2luY2x1ZGUgPGFzbS90aW1lci5oPgogI2luY2x1ZGUgPGFzbS9rZ2RiLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0KLSNkZWZpbmUgVE1VX1RPQ1JfSU5JVAkweDAwCi0jZGVmaW5lIFRNVTBfVENSX0lOSVQJMHgwMDIwCi0jZGVmaW5lIFRNVV9UU1RSX0lOSVQJMQotCi0jZGVmaW5lIFRNVTBfVENSX0NBTElCCTB4MDAwMAotCi0jaWZkZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBTVEIxCi0jZGVmaW5lIENMT0NLR0VOX01FTUNMS0NSIDB4YmIwNDAwMzgKLSNkZWZpbmUgTUVNQ0xLQ1JfUkFUSU9fTUFTSyAweDcKLSNlbmRpZiAvKiBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEgKi8KIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgd2FsbF9qaWZmaWVzOwotI2RlZmluZSBUSUNLX1NJWkUgKHRpY2tfbnNlYyAvIDEwMDApCi1ERUZJTkVfU1BJTkxPQ0sodG11MF9sb2NrKTsKK3N0cnVjdCBzeXNfdGltZXIgKnN5c190aW1lcjsKKworLyogTW92ZSB0aGlzIHNvbWV3aGVyZSBtb3JlIHNlbnNpYmxlLi4gKi8KK0RFRklORV9TUElOTE9DSyhydGNfbG9jayk7CitFWFBPUlRfU1lNQk9MKHJ0Y19sb2NrKTsKIAogLyogWFhYOiBDYW4gd2UgaW5pdGlhbGl6ZSB0aGlzIGluIGEgcm91dGluZSBzb21ld2hlcmU/ICBEcmVhbWNhc3QgZG9lc24ndCB3YW50CiAgKiB0aGVzZSByb3V0aW5lcyBhbnl3aGVyZS4uLiAqLwpAQCAtNjYsOTggKzM3LDE0IEBACiBpbnQgKCpydGNfc2V0X3RpbWUpKGNvbnN0IHRpbWVfdCk7CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCkKLXN0YXRpYyBpbnQgbWRfdGFibGVbXSA9IHsgMSwgMiwgMywgNCwgNiwgOCwgMTIgfTsKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDMpCi1zdGF0aWMgaW50IHN0Y19tdWx0aXBsaWVyc1tdID0geyAxLCAyLCAzLCA0LCA2LCAxLCAxLCAxIH07Ci1zdGF0aWMgaW50IHN0Y192YWx1ZXNbXSAgICAgID0geyAwLCAxLCA0LCAyLCA1LCAwLCAwLCAwIH07Ci0jZGVmaW5lIGJmY19kaXZpc29ycyBzdGNfbXVsdGlwbGllcnMKLSNkZWZpbmUgYmZjX3ZhbHVlcyBzdGNfdmFsdWVzCi1zdGF0aWMgaW50IGlmY19kaXZpc29yc1tdICAgID0geyAxLCAyLCAzLCA0LCAxLCAxLCAxLCAxIH07Ci1zdGF0aWMgaW50IGlmY192YWx1ZXNbXSAgICAgID0geyAwLCAxLCA0LCAyLCAwLCAwLCAwLCAwIH07Ci1zdGF0aWMgaW50IHBmY19kaXZpc29yc1tdICAgID0geyAxLCAyLCAzLCA0LCA2LCAxLCAxLCAxIH07Ci1zdGF0aWMgaW50IHBmY192YWx1ZXNbXSAgICAgID0geyAwLCAxLCA0LCAyLCA1LCAwLCAwLCAwIH07Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KQotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODApCi1zdGF0aWMgaW50IGlmY19kaXZpc29yc1tdID0geyAxLCAyLCAzLCA0LCA2LCA4LCAxMiwgMTYgfTsKLXN0YXRpYyBpbnQgaWZjX3ZhbHVlc1tdID0geyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3IH07Ci0jZGVmaW5lIGJmY19kaXZpc29ycyBpZmNfZGl2aXNvcnMJLyogU2FtZSAqLwotI2RlZmluZSBiZmNfdmFsdWVzIGlmY192YWx1ZXMKLSNkZWZpbmUgcGZjX2Rpdmlzb3JzIGlmY19kaXZpc29ycwkvKiBTYW1lICovCi0jZGVmaW5lIHBmY192YWx1ZXMgaWZjX3ZhbHVlcwotI2Vsc2UKLXN0YXRpYyBpbnQgaWZjX2Rpdmlzb3JzW10gPSB7IDEsIDIsIDMsIDQsIDYsIDgsIDEsIDEgfTsKLXN0YXRpYyBpbnQgaWZjX3ZhbHVlc1tdICAgPSB7IDAsIDEsIDIsIDMsIDAsIDQsIDAsIDUgfTsKLSNkZWZpbmUgYmZjX2Rpdmlzb3JzIGlmY19kaXZpc29ycwkvKiBTYW1lICovCi0jZGVmaW5lIGJmY192YWx1ZXMgaWZjX3ZhbHVlcwotc3RhdGljIGludCBwZmNfZGl2aXNvcnNbXSA9IHsgMiwgMywgNCwgNiwgOCwgMiwgMiwgMiB9Owotc3RhdGljIGludCBwZmNfdmFsdWVzW10gICA9IHsgMCwgMCwgMSwgMiwgMCwgMywgMCwgNCB9OwotI2VuZGlmCi0jZWxzZQotI2Vycm9yICJVbmtub3duIGlmYy9iZmMvcGZjL3N0YyB2YWx1ZXMgZm9yIHRoaXMgcHJvY2Vzc29yIgotI2VuZGlmCi0KIC8qCiAgKiBTY2hlZHVsZXIgY2xvY2sgLSByZXR1cm5zIGN1cnJlbnQgdGltZSBpbiBuYW5vc2VjIHVuaXRzLgogICovCi11bnNpZ25lZCBsb25nIGxvbmcgc2NoZWRfY2xvY2sodm9pZCkKK3Vuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fICgod2VhaykpIHNjaGVkX2Nsb2NrKHZvaWQpCiB7CiAJcmV0dXJuICh1bnNpZ25lZCBsb25nIGxvbmcpamlmZmllcyAqICgxMDAwMDAwMDAwIC8gSFopOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBkb19nZXR0aW1lb2Zmc2V0KHZvaWQpCi17Ci0JaW50IGNvdW50OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzdGF0aWMgaW50IGNvdW50X3AgPSAweDdmZmZmZmZmOyAgICAvKiBmb3IgdGhlIGZpcnN0IGNhbGwgYWZ0ZXIgYm9vdCAqLwotCXN0YXRpYyB1bnNpZ25lZCBsb25nIGppZmZpZXNfcCA9IDA7Ci0KLQkvKgotCSAqIGNhY2hlIHZvbGF0aWxlIGppZmZpZXMgdGVtcG9yYXJpbHk7IHdlIGhhdmUgSVJRcyB0dXJuZWQgb2ZmLgotCSAqLwotCXVuc2lnbmVkIGxvbmcgamlmZmllc190OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRtdTBfbG9jaywgZmxhZ3MpOwotCS8qIHRpbWVyIGNvdW50IG1heSB1bmRlcmZsb3cgcmlnaHQgaGVyZSAqLwotCWNvdW50ID0gY3RybF9pbmwoVE1VMF9UQ05UKTsJLyogcmVhZCB0aGUgbGF0Y2hlZCBjb3VudCAqLwotCi0JamlmZmllc190ID0gamlmZmllczsKLQotCS8qCi0JICogYXZvaWRpbmcgdGltZXIgaW5jb25zaXN0ZW5jaWVzICh0aGV5IGFyZSByYXJlLCBidXQgdGhleSBoYXBwZW4pLi4uCi0JICogdGhlcmUgaXMgb25lIGtpbmQgb2YgcHJvYmxlbSB0aGF0IG11c3QgYmUgYXZvaWRlZCBoZXJlOgotCSAqICAxLiB0aGUgdGltZXIgY291bnRlciB1bmRlcmZsb3dzCi0JICovCi0KLQlpZiggamlmZmllc190ID09IGppZmZpZXNfcCApIHsKLQkJaWYoIGNvdW50ID4gY291bnRfcCApIHsKLQkJCS8qIHRoZSBudXRjYXNlICovCi0KLQkJCWlmKGN0cmxfaW53KFRNVTBfVENSKSAmIDB4MTAwKSB7IC8qIENoZWNrIFVORiBiaXQgKi8KLQkJCQkvKgotCQkJCSAqIFdlIGNhbm5vdCBkZXRlY3QgbG9zdCB0aW1lciBpbnRlcnJ1cHRzIC4uLgotCQkJCSAqIHdlbGwsIHRoYXQncyB3aHkgd2UgY2FsbCB0aGVtIGxvc3QsIGRvbid0IHdlPyA6KQotCQkJCSAqIFtobW0sIG9uIHRoZSBQZW50aXVtIGFuZCBBbHBoYSB3ZSBjYW4gLi4uIHNvcnQgb2ZdCi0JCQkJICovCi0JCQkJY291bnQgLT0gTEFUQ0g7Ci0JCQl9IGVsc2UgewotCQkJCXByaW50aygiZG9fc2xvd19nZXR0aW1lb2Zmc2V0KCk6IGhhcmR3YXJlIHRpbWVyIHByb2JsZW0/XG4iKTsKLQkJCX0KLQkJfQotCX0gZWxzZQotCQlqaWZmaWVzX3AgPSBqaWZmaWVzX3Q7Ci0KLQljb3VudF9wID0gY291bnQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdG11MF9sb2NrLCBmbGFncyk7Ci0KLQljb3VudCA9ICgoTEFUQ0gtMSkgLSBjb3VudCkgKiBUSUNLX1NJWkU7Ci0JY291bnQgPSAoY291bnQgKyBMQVRDSC8yKSAvIExBVENIOwotCi0JcmV0dXJuIGNvdW50OwotfQotCiB2b2lkIGRvX2dldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqdHYpCiB7CiAJdW5zaWduZWQgbG9uZyBzZXE7CkBAIC0xNjYsNyArNTMsNyBAQAogCiAJZG8gewogCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKLQkJdXNlYyA9IGRvX2dldHRpbWVvZmZzZXQoKTsKKwkJdXNlYyA9IGdldF90aW1lcl9vZmZzZXQoKTsKIAogCQlsb3N0ID0gamlmZmllcyAtIHdhbGxfamlmZmllczsKIAkJaWYgKGxvc3QpCkBAIC0yMDIsNyArODksNyBAQAogCSAqIHdhbGwgdGltZS4gIERpc2NvdmVyIHdoYXQgY29ycmVjdGlvbiBnZXR0aW1lb2ZkYXkoKSB3b3VsZCBoYXZlCiAJICogbWFkZSwgYW5kIHRoZW4gdW5kbyBpdCEKIAkgKi8KLQluc2VjIC09IDEwMDAgKiAoZG9fZ2V0dGltZW9mZnNldCgpICsKKwluc2VjIC09IDEwMDAgKiAoZ2V0X3RpbWVyX29mZnNldCgpICsKIAkJCQkoamlmZmllcyAtIHdhbGxfamlmZmllcykgKiAoMTAwMDAwMCAvIEhaKSk7CiAKIAl3dG1fc2VjICA9IHdhbGxfdG9fbW9ub3RvbmljLnR2X3NlYyArICh4dGltZS50dl9zZWMgLSBzZWMpOwpAQCAtMjI0LDEwICsxMTEsMTAgQEAKIHN0YXRpYyBsb25nIGxhc3RfcnRjX3VwZGF0ZTsKIAogLyoKLSAqIHRpbWVyX2ludGVycnVwdCgpIG5lZWRzIHRvIGtlZXAgdXAgdGhlIHJlYWwtdGltZSBjbG9jaywKKyAqIGhhbmRsZV90aW1lcl90aWNrKCkgbmVlZHMgdG8ga2VlcCB1cCB0aGUgcmVhbC10aW1lIGNsb2NrLAogICogYXMgd2VsbCBhcyBjYWxsIHRoZSAiZG9fdGltZXIoKSIgcm91dGluZSBldmVyeSBjbG9ja3RpY2sKICAqLwotc3RhdGljIGlubGluZSB2b2lkIGRvX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3ZvaWQgaGFuZGxlX3RpbWVyX3RpY2soc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJZG9fdGltZXIocmVncyk7CiAjaWZuZGVmIENPTkZJR19TTVAKQEAgLTI1MiwzMzcgKzEzOSwzNSBAQAogCQlpZiAocnRjX3NldF90aW1lKHh0aW1lLnR2X3NlYykgPT0gMCkKIAkJCWxhc3RfcnRjX3VwZGF0ZSA9IHh0aW1lLnR2X3NlYzsKIAkJZWxzZQotCQkJbGFzdF9ydGNfdXBkYXRlID0geHRpbWUudHZfc2VjIC0gNjAwOyAvKiBkbyBpdCBhZ2FpbiBpbiA2MCBzICovCisJCQkvKiBkbyBpdCBhZ2FpbiBpbiA2MHMgKi8KKwkJCWxhc3RfcnRjX3VwZGF0ZSA9IHh0aW1lLnR2X3NlYyAtIDYwMDsKIAl9CiB9CiAKLS8qCi0gKiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBhYm92ZSwgZXhjZXB0IHdlIF9hbHNvXyBzYXZlIHRoZSBjdXJyZW50Ci0gKiBUaW1lIFN0YW1wIENvdW50ZXIgdmFsdWUgYXQgdGhlIHRpbWUgb2YgdGhlIHRpbWVyIGludGVycnVwdCwgc28gdGhhdAotICogd2UgbGF0ZXIgb24gY2FuIGVzdGltYXRlIHRoZSB0aW1lIG9mIGRheSBtb3JlIGV4YWN0bHkuCi0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHRpbWVyX3N5c2NsYXNzID0geworCXNldF9rc2V0X25hbWUoInRpbWVyIiksCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0aW1lcl9pbml0X3N5c2ZzKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyB0aW1lcl9zdGF0dXM7CisJaW50IHJldCA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmdGltZXJfc3lzY2xhc3MpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKIAotCS8qIENsZWFyIFVORiBiaXQgKi8KLQl0aW1lcl9zdGF0dXMgPSBjdHJsX2ludyhUTVUwX1RDUik7Ci0JdGltZXJfc3RhdHVzICY9IH4weDEwMDsKLQljdHJsX291dHcodGltZXJfc3RhdHVzLCBUTVUwX1RDUik7Ci0KLQkvKgotCSAqIEhlcmUgd2UgYXJlIGluIHRoZSB0aW1lciBpcnEgaGFuZGxlci4gV2UganVzdCBoYXZlIGlycXMgbG9jYWxseQotCSAqIGRpc2FibGVkIGJ1dCB3ZSBkb24ndCBrbm93IGlmIHRoZSB0aW1lcl9iaCBpcyBydW5uaW5nIG9uIHRoZSBvdGhlcgotCSAqIENQVS4gV2UgbmVlZCB0byBhdm9pZCB0byBTTVAgcmFjZSB3aXRoIGl0LiBOT1RFOiB3ZSBkb24nIHQgbmVlZAotCSAqIHRoZSBpcnEgdmVyc2lvbiBvZiB3cml0ZV9sb2NrIGJlY2F1c2UgYXMganVzdCBzYWlkIHdlIGhhdmUgaXJxCi0JICogbG9jYWxseSBkaXNhYmxlZC4gLWFyY2EKLQkgKi8KLQl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKLQlkb190aW1lcl9pbnRlcnJ1cHQoaXJxLCByZWdzKTsKLQl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOworCXN5c190aW1lci0+ZGV2LmNscyA9ICZ0aW1lcl9zeXNjbGFzczsKKwlyZXR1cm4gc3lzZGV2X3JlZ2lzdGVyKCZzeXNfdGltZXItPmRldik7CiB9CiAKLS8qCi0gKiBIYWghICBXZSdsbCBzZWUgaWYgdGhpcyB3b3JrcyAoc3dpdGNoaW5nIGZyb20gdXNlY3MgdG8gbnNlY3MpLgotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBnZXRfdGltZXJfZnJlcXVlbmN5KHZvaWQpCi17Ci0JdTMyIGZyZXE7Ci0Jc3RydWN0IHRpbWVzcGVjIHRzMSwgdHMyOwotCXVuc2lnbmVkIGxvbmcgZGlmZl9uc2VjOwotCXVuc2lnbmVkIGxvbmcgZmFjdG9yOwotCi0JLyogU2V0dXAgdGhlIHRpbWVyOiAgV2UgZG9uJ3Qgd2FudCB0byBnZW5lcmF0ZSBpbnRlcnJ1cHRzLCBqdXN0Ci0JICogaGF2ZSBpdCBjb3VudCBkb3duIGF0IGl0cyBuYXR1cmFsIHJhdGUuCi0JICovCi0JY3RybF9vdXRiKDAsIFRNVV9UU1RSKTsKLSNpZiAhZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKQotCWN0cmxfb3V0YihUTVVfVE9DUl9JTklULCBUTVVfVE9DUik7Ci0jZW5kaWYKLQljdHJsX291dHcoVE1VMF9UQ1JfQ0FMSUIsIFRNVTBfVENSKTsKLQljdHJsX291dGwoMHhmZmZmZmZmZiwgVE1VMF9UQ09SKTsKLQljdHJsX291dGwoMHhmZmZmZmZmZiwgVE1VMF9UQ05UKTsKLQotCXJ0Y19nZXRfdGltZSgmdHMyKTsKLQotCWRvIHsKLQkJcnRjX2dldF90aW1lKCZ0czEpOwotCX0gd2hpbGUgKHRzMS50dl9uc2VjID09IHRzMi50dl9uc2VjICYmIHRzMS50dl9zZWMgPT0gdHMyLnR2X3NlYyk7Ci0KLQkvKiBhY3R1YWxseSBzdGFydCB0aGUgdGltZXIgKi8KLQljdHJsX291dGIoVE1VX1RTVFJfSU5JVCwgVE1VX1RTVFIpOwotCi0JZG8gewotCQlydGNfZ2V0X3RpbWUoJnRzMik7Ci0JfSB3aGlsZSAodHMxLnR2X25zZWMgPT0gdHMyLnR2X25zZWMgJiYgdHMxLnR2X3NlYyA9PSB0czIudHZfc2VjKTsKLQotCWZyZXEgPSAweGZmZmZmZmZmIC0gY3RybF9pbmwoVE1VMF9UQ05UKTsKLQlpZiAodHMyLnR2X25zZWMgPCB0czEudHZfbnNlYykgewotCQl0czIudHZfbnNlYyArPSAxMDAwMDAwMDAwOwotCQl0czIudHZfc2VjLS07Ci0JfQotCi0JZGlmZl9uc2VjID0gKHRzMi50dl9zZWMgLSB0czEudHZfc2VjKSAqIDEwMDAwMDAwMDAgKyAodHMyLnR2X25zZWMgLSB0czEudHZfbnNlYyk7Ci0KLQkvKiB0aGlzIHNob3VsZCB3b3JrIHdlbGwgaWYgdGhlIFJUQyBoYXMgYSBwcmVjaXNpb24gb2YgbiBIeiwgd2hlcmUKLQkgKiBuIGlzIGFuIGludGVnZXIuICBJIGRvbid0IHRoaW5rIHdlIGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIG90aGVyCi0JICogY2FzZXMuICovCi0JZmFjdG9yID0gKDEwMDAwMDAwMDAgKyBkaWZmX25zZWMvMikgLyBkaWZmX25zZWM7Ci0KLQlpZiAoZmFjdG9yICogZGlmZl9uc2VjID4gMTEwMDAwMDAwMCB8fAotCSAgICBmYWN0b3IgKiBkaWZmX25zZWMgPCAgOTAwMDAwMDAwKQotCQlwYW5pYygid2VpcmQgUlRDIChkaWZmX25zZWMgJWxkKSIsIGRpZmZfbnNlYyk7Ci0KLQlyZXR1cm4gZnJlcSAqIGZhY3RvcjsKLX0KK2RldmljZV9pbml0Y2FsbCh0aW1lcl9pbml0X3N5c2ZzKTsKIAogdm9pZCAoKmJvYXJkX3RpbWVfaW5pdCkodm9pZCk7Ci12b2lkICgqYm9hcmRfdGltZXJfc2V0dXApKHN0cnVjdCBpcnFhY3Rpb24gKmlycSk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2hfcGNsa19mcmVxIF9faW5pdGRhdGEgPSBDT05GSUdfU0hfUENMS19GUkVROwotCi1zdGF0aWMgaW50IF9faW5pdCBzaF9wY2xrX3NldHVwKGNoYXIgKnN0cikKLXsKLSAgICAgICAgdW5zaWduZWQgaW50IGZyZXE7Ci0KLQlpZiAoZ2V0X29wdGlvbigmc3RyLCAmZnJlcSkpCi0JCXNoX3BjbGtfZnJlcSA9IGZyZXE7Ci0KLQlyZXR1cm4gMTsKLX0KLV9fc2V0dXAoInNoX3BjbGs9Iiwgc2hfcGNsa19zZXR1cCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlycTAgID0geyB0aW1lcl9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwgQ1BVX01BU0tfTk9ORSwgInRpbWVyIiwgTlVMTCwgTlVMTH07Ci0KLXZvaWQgZ2V0X2N1cnJlbnRfZnJlcXVlbmN5X2Rpdmlzb3JzKHVuc2lnbmVkIGludCAqaWZjLCB1bnNpZ25lZCBpbnQgKmJmYywgdW5zaWduZWQgaW50ICpwZmMpCi17Ci0JdW5zaWduZWQgaW50IGZycWNyID0gY3RybF9pbncoRlJRQ1IpOwotCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NIMykKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDApCi0JKmlmYyA9IG1kX3RhYmxlWygoZnJxY3IgJiAweDAwNzApID4+IDQpXTsKLQkqYmZjID0gbWRfdGFibGVbKChmcnFjciAmIDB4MDcwMCkgPj4gOCldOwotCSpwZmMgPSBtZF90YWJsZVtmcnFjciAmIDB4MDAwN107Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUpCi0JKmJmYyA9IHN0Y19tdWx0aXBsaWVyc1soZnJxY3IgJiAweDAzMDApID4+IDhdOwotCSppZmMgPSBpZmNfZGl2aXNvcnNbKGZycWNyICYgMHgwMDMwKSA+PiA0XTsKLQkqcGZjID0gcGZjX2Rpdmlzb3JzW2ZycWNyICYgMHgwMDAzXTsKLSNlbHNlCi0JdW5zaWduZWQgaW50IHRtcDsKLQotCXRtcCAgPSAoZnJxY3IgJiAweDgwMDApID4+IDEzOwotCXRtcCB8PSAoZnJxY3IgJiAweDAwMzApID4+ICA0OwotCSpiZmMgPSBzdGNfbXVsdGlwbGllcnNbdG1wXTsKLQl0bXAgID0gKGZycWNyICYgMHg0MDAwKSAgPj4gMTI7Ci0JdG1wIHw9IChmcnFjciAmIDB4MDAwYykgPj4gMjsKLQkqaWZjID0gaWZjX2Rpdmlzb3JzW3RtcF07Ci0JdG1wICA9IChmcnFjciAmIDB4MjAwMCkgPj4gMTE7Ci0JdG1wIHw9IGZycWNyICYgMHgwMDAzOwotCSpwZmMgPSBwZmNfZGl2aXNvcnNbdG1wXTsKLSNlbmRpZgotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NINCkKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMTgwKQotCSppZmMgPSBpZmNfZGl2aXNvcnNbKGZycWNyPj4gMjApICYgMHgwMDA3XTsKLQkqYmZjID0gYmZjX2Rpdmlzb3JzWyhmcnFjcj4+IDEyKSAmIDB4MDAwN107Ci0JKnBmYyA9IHBmY19kaXZpc29yc1tmcnFjciAmIDB4MDAwN107Ci0jZWxzZQotCSppZmMgPSBpZmNfZGl2aXNvcnNbKGZycWNyID4+IDYpICYgMHgwMDA3XTsKLQkqYmZjID0gYmZjX2Rpdmlzb3JzWyhmcnFjciA+PiAzKSAmIDB4MDAwN107Ci0JKnBmYyA9IHBmY19kaXZpc29yc1tmcnFjciAmIDB4MDAwN107Ci0jZW5kaWYKLSNlbmRpZgotfQotCi0vKgotICogVGhpcyBiaXQgb2YgdWdsaW5lc3MgYnVpbGRzIHVwIGFjY2Vzc29yIHJvdXRpbmVzIHRvIGdldCBhdCBib3RoCi0gKiB0aGUgZGl2aXNvcnMgYW5kIHRoZSBwaHlzaWNhbCB2YWx1ZXMuCi0gKi8KLSNkZWZpbmUgX0ZSRVFfVEFCTEUoeCkgXAotCXVuc2lnbmVkIGludCBnZXRfIyN4IyNfZGl2aXNvcih1bnNpZ25lZCBpbnQgdmFsdWUpCVwKLQkJeyByZXR1cm4geCMjX2Rpdmlzb3JzW3ZhbHVlXTsgfQkJCVwKLQkJCQkJCQkJXAotCXVuc2lnbmVkIGludCBnZXRfIyN4IyNfdmFsdWUodW5zaWduZWQgaW50IGRpdmlzb3IpCVwKLQkJeyByZXR1cm4geCMjX3ZhbHVlc1soZGl2aXNvciAtIDEpXTsgfQotCi1fRlJFUV9UQUJMRShpZmMpOwotX0ZSRVFfVEFCTEUoYmZjKTsKLV9GUkVRX1RBQkxFKHBmYyk7Ci0KLSNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEKLQotLyoKLSAqIFRoZSBTVDQwIGRpdmlzb3JzIGFyZSB0b3RhbGx5IGRpZmZlcmVudCBzbyB3ZSBzZXQgdGhlIGNwdSBkYXRhCi0gKiBjbG9ja3MgdXNpbmcgYSBkaWZmZXJlbnQgYWxnb3JpdGhtCi0gKgotICogSSd2ZSBqdXN0IHBsdWdnZWQgdGhpcyBmcm9tIHRoZSAyLjQgY29kZQotICoJLSBBbGV4IEJlbm5lZSA8a2VybmVsLWhhY2tlckBiZW5uZWUuY29tPgotICovCi0jZGVmaW5lIENDTl9QVlJfQ0hJUF9TSElGVCAyNAotI2RlZmluZSBDQ05fUFZSX0NISVBfTUFTSyAgMHhmZgotI2RlZmluZSBDQ05fUFZSX0NISVBfU1Q0MFNUQjEgMHg0Ci0KLQotc3RydWN0IGZycWNyX2RhdGEgewotCXVuc2lnbmVkIHNob3J0IGZycWNyOwotCi0Jc3RydWN0IHsKLQkJdW5zaWduZWQgY2hhciBtdWx0aXBsaWVyOwotCQl1bnNpZ25lZCBjaGFyIGRpdmlzb3I7Ci0JfSBmYWN0b3JbM107Ci19OwotCi1zdGF0aWMgc3RydWN0IGZycWNyX2RhdGEgc3Q0MF9mcnFjcl90YWJsZVtdID0gewotCXsgMHgwMDAsIHt7MSwxfSwgezEsMX0sIHsxLDJ9fX0sCi0JeyAweDAwMiwge3sxLDF9LCB7MSwxfSwgezEsNH19fSwKLQl7IDB4MDA0LCB7ezEsMX0sIHsxLDF9LCB7MSw4fX19LAotCXsgMHgwMDgsIHt7MSwxfSwgezEsMn0sIHsxLDJ9fX0sCi0JeyAweDAwQSwge3sxLDF9LCB7MSwyfSwgezEsNH19fSwKLQl7IDB4MDBDLCB7ezEsMX0sIHsxLDJ9LCB7MSw4fX19LAotCXsgMHgwMTEsIHt7MSwxfSwgezIsM30sIHsxLDZ9fX0sCi0JeyAweDAxMywge3sxLDF9LCB7MiwzfSwgezEsM319fSwKLQl7IDB4MDFBLCB7ezEsMX0sIHsxLDJ9LCB7MSw0fX19LAotCXsgMHgwMUMsIHt7MSwxfSwgezEsMn0sIHsxLDh9fX0sCi0JeyAweDAyMywge3sxLDF9LCB7MiwzfSwgezEsM319fSwKLQl7IDB4MDJDLCB7ezEsMX0sIHsxLDJ9LCB7MSw4fX19LAotCXsgMHgwNDgsIHt7MSwyfSwgezEsMn0sIHsxLDR9fX0sCi0JeyAweDA0QSwge3sxLDJ9LCB7MSwyfSwgezEsNn19fSwKLQl7IDB4MDRDLCB7ezEsMn0sIHsxLDJ9LCB7MSw4fX19LAotCXsgMHgwNUEsIHt7MSwyfSwgezEsM30sIHsxLDZ9fX0sCi0JeyAweDA1Qywge3sxLDJ9LCB7MSwzfSwgezEsNn19fSwKLQl7IDB4MDYzLCB7ezEsMn0sIHsxLDR9LCB7MSw0fX19LAotCXsgMHgwNkMsIHt7MSwyfSwgezEsNH0sIHsxLDh9fX0sCi0JeyAweDA5MSwge3sxLDN9LCB7MSwzfSwgezEsNn19fSwKLQl7IDB4MDkzLCB7ezEsM30sIHsxLDN9LCB7MSw2fX19LAotCXsgMHgwQTMsIHt7MSwzfSwgezEsNn0sIHsxLDZ9fX0sCi0JeyAweDBEQSwge3sxLDR9LCB7MSw0fSwgezEsOH19fSwKLQl7IDB4MERDLCB7ezEsNH0sIHsxLDR9LCB7MSw4fX19LAotCXsgMHgwRUMsIHt7MSw0fSwgezEsOH0sIHsxLDh9fX0sCi0JeyAweDEyMywge3sxLDR9LCB7MSw0fSwgezEsOH19fSwKLQl7IDB4MTZDLCB7ezEsNH0sIHsxLDh9LCB7MSw4fX19LAotfTsKLQotc3RydWN0IG1lbWNsa19kYXRhIHsKLQl1bnNpZ25lZCBjaGFyIG11bHRpcGxpZXI7Ci0JdW5zaWduZWQgY2hhciBkaXZpc29yOwotfTsKLQotc3RhdGljIHN0cnVjdCBtZW1jbGtfZGF0YSBzdDQwX21lbWNsa190YWJsZVs4XSA9IHsKLQl7MSwxfSwJLy8gMDAwCi0JezEsMn0sCS8vIDAwMQotCXsxLDN9LAkvLyAwMTAKLQl7MiwzfSwJLy8gMDExCi0JezEsNH0sCS8vIDEwMAotCXsxLDZ9LAkvLyAxMDEKLQl7MSw4fSwJLy8gMTEwCi0JezEsOH0JLy8gMTExCi19OwotCi1zdGF0aWMgdm9pZCBzdDQwX3NwZWNpZmljX3RpbWVfaW5pdCh1bnNpZ25lZCBpbnQgbW9kdWxlX2Nsb2NrLCB1bnNpZ25lZCBzaG9ydCBmcnFjcikKLXsKLQl1bnNpZ25lZCBpbnQgY3B1X2Nsb2NrLCBtYXN0ZXJfY2xvY2ssIGJ1c19jbG9jaywgbWVtb3J5X2Nsb2NrOwotCXN0cnVjdCBmcnFjcl9kYXRhICpkOwotCWludCBhOwotCXVuc2lnbmVkIGxvbmcgbWVtY2xrY3I7Ci0Jc3RydWN0IG1lbWNsa19kYXRhICplOwotCi0JZm9yIChhID0gMDsgYSA8IEFSUkFZX1NJWkUoc3Q0MF9mcnFjcl90YWJsZSk7IGErKykgewotCQlkID0gJnN0NDBfZnJxY3JfdGFibGVbYV07Ci0KLQkJaWYgKGQtPmZycWNyID09IChmcnFjciAmIDB4MWZmKSkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChhID09IEFSUkFZX1NJWkUoc3Q0MF9mcnFjcl90YWJsZSkpIHsKLQkJZCA9IHN0NDBfZnJxY3JfdGFibGU7Ci0KLQkJcHJpbnRrKCJFUlJPUjogVW5yZWNvZ25pc2VkIEZSUUNSIHZhbHVlICgweCV4KSwgIgotCQkgICAgICAgInVzaW5nIGRlZmF1bHQgbXVsdGlwbGllcnNcbiIsIGZycWNyKTsKLQl9Ci0KLQltZW1jbGtjciA9IGN0cmxfaW5sKENMT0NLR0VOX01FTUNMS0NSKTsKLQllID0gJnN0NDBfbWVtY2xrX3RhYmxlW21lbWNsa2NyICYgTUVNQ0xLQ1JfUkFUSU9fTUFTS107Ci0KLQlwcmludGsoS0VSTl9JTkZPICJDbG9jayBtdWx0aXBsaWVyczogQ1BVOiAlZC8lZCBCdXM6ICVkLyVkICIKLQkgICAgICAgIk1lbTogJWQvJWQgUGVyaXBoOiAlZC8lZFxuIiwKLQkgICAgICAgZC0+ZmFjdG9yWzBdLm11bHRpcGxpZXIsIGQtPmZhY3RvclswXS5kaXZpc29yLAotCSAgICAgICBkLT5mYWN0b3JbMV0ubXVsdGlwbGllciwgZC0+ZmFjdG9yWzFdLmRpdmlzb3IsCi0JICAgICAgIGUtPm11bHRpcGxpZXIsICAgICAgICAgICBlLT5kaXZpc29yLAotCSAgICAgICBkLT5mYWN0b3JbMl0ubXVsdGlwbGllciwgZC0+ZmFjdG9yWzJdLmRpdmlzb3IpOwotCi0JbWFzdGVyX2Nsb2NrID0gbW9kdWxlX2Nsb2NrICogZC0+ZmFjdG9yWzJdLmRpdmlzb3IKLQkJCQkgICAgLyBkLT5mYWN0b3JbMl0ubXVsdGlwbGllcjsKLQlidXNfY2xvY2sgICAgPSBtYXN0ZXJfY2xvY2sgKiBkLT5mYWN0b3JbMV0ubXVsdGlwbGllcgotCQkJCSAgICAvIGQtPmZhY3RvclsxXS5kaXZpc29yOwotCW1lbW9yeV9jbG9jayA9IG1hc3Rlcl9jbG9jayAqIGUtPm11bHRpcGxpZXIKLQkJCQkgICAgLyBlLT5kaXZpc29yOwotCWNwdV9jbG9jayAgICA9IG1hc3Rlcl9jbG9jayAqIGQtPmZhY3RvclswXS5tdWx0aXBsaWVyCi0JCQkJICAgIC8gZC0+ZmFjdG9yWzBdLmRpdmlzb3I7Ci0KLQljdXJyZW50X2NwdV9kYXRhLmNwdV9jbG9jayAgICA9IGNwdV9jbG9jazsKLQljdXJyZW50X2NwdV9kYXRhLm1hc3Rlcl9jbG9jayA9IG1hc3Rlcl9jbG9jazsKLQljdXJyZW50X2NwdV9kYXRhLmJ1c19jbG9jayAgICA9IGJ1c19jbG9jazsKLQljdXJyZW50X2NwdV9kYXRhLm1lbW9yeV9jbG9jayA9IG1lbW9yeV9jbG9jazsKLQljdXJyZW50X2NwdV9kYXRhLm1vZHVsZV9jbG9jayA9IG1vZHVsZV9jbG9jazsKLX0KLSNlbmRpZgogCiB2b2lkIF9faW5pdCB0aW1lX2luaXQodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgdGltZXJfZnJlcSA9IDA7Ci0JdW5zaWduZWQgaW50IGlmYywgcGZjLCBiZmM7Ci0JdW5zaWduZWQgbG9uZyBpbnRlcnZhbDsKLSNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEKLQl1bnNpZ25lZCBsb25nIHB2cjsKLQl1bnNpZ25lZCBzaG9ydCBmcnFjcjsKLSNlbmRpZgotCiAJaWYgKGJvYXJkX3RpbWVfaW5pdCkKIAkJYm9hcmRfdGltZV9pbml0KCk7CiAKLQkvKgotCSAqIElmIHdlIGRvbid0IGhhdmUgYW4gUlRDIChzdWNoIGFzIHdpdGggdGhlIFNINzMwMCksIGRvbid0IGF0dGVtcHQgdG8KLQkgKiBwcm9iZSB0aGUgdGltZXIgZnJlcXVlbmN5LiBSZWx5IG9uIGFuIGVpdGhlciBoYXJkY29kZWQgcGVyaXBoZXJhbAotCSAqIGNsb2NrIHZhbHVlLCBvciBvbiB0aGUgc2hfcGNsayBjb21tYW5kIGxpbmUgb3B0aW9uLiBOb3RlIHRoYXQgd2UKLQkgKiBzdGlsbCBuZWVkIHRvIGhhdmUgQ09ORklHX1NIX1BDTEtfRlJFUSBzZXQgaW4gb3JkZXIgZm9yIHRoaW5ncyBsaWtlCi0JICogQ0xPQ0tfVElDS19SQVRFIHRvIGJlIHNhbmUuCi0JICovCi0JY3VycmVudF9jcHVfZGF0YS5tb2R1bGVfY2xvY2sgPSBzaF9wY2xrX2ZyZXE7Ci0KLSNpZmRlZiBDT05GSUdfU0hfUENMS19DQUxDCi0JLyogWFhYOiBTd2l0Y2ggdGhpcyBvdmVyIHRvIGEgbW9yZSBnZW5lcmljIHRlc3QuICovCi0JewotCQl1bnNpZ25lZCBpbnQgZnJlcTsKLQotCQkvKgotCQkgKiBJZiB3ZSd2ZSBzcGVjaWZpZWQgYSBwZXJpcGhlcmFsIGNsb2NrIGZyZXF1ZW5jeSwgYW5kIHdlIGhhdmUKLQkJICogYW4gUlRDLCBjb21wYXJlIGl0IGFnYWluc3QgdGhlIGF1dG9kZXRlY3RlZCB2YWx1ZS4gQ29tcGxhaW4KLQkJICogaWYgdGhlcmUncyBhIG1pc21hdGNoLgotCQkgKi8KLQkJdGltZXJfZnJlcSA9IGdldF90aW1lcl9mcmVxdWVuY3koKTsKLQkJZnJlcSA9IHRpbWVyX2ZyZXEgKiA0OwotCi0JCWlmIChzaF9wY2xrX2ZyZXEgJiYgKHNoX3BjbGtfZnJlcS8xMDAqOTkgPiBmcmVxIHx8IHNoX3BjbGtfZnJlcS8xMDAqMTAxIDwgZnJlcSkpIHsKLQkJCXByaW50ayhLRVJOX05PVElDRSAiQ2FsY3VsYXRlZCBwZXJpcGhlcmFsIGNsb2NrIHZhbHVlICIKLQkJCSAgICAgICAiJWQgZGlmZmVycyBmcm9tIHNoX3BjbGsgdmFsdWUgJWQsIGZpeGluZy4uXG4iLAotCQkJICAgICAgIGZyZXEsIHNoX3BjbGtfZnJlcSk7Ci0JCQljdXJyZW50X2NwdV9kYXRhLm1vZHVsZV9jbG9jayA9IGZyZXE7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMQotCS8qIFhYWDogVXBkYXRlIFNUNDAgY29kZSB0byB1c2UgYm9hcmRfdGltZV9pbml0KCkgKi8KLQlwdnIgPSBjdHJsX2lubChDQ05fUFZSKTsKLQlmcnFjciA9IGN0cmxfaW53KEZSUUNSKTsKLQlwcmludGsoInRpbWUuYyBTVDQwIFByb2JlOiBQVlIgJTA4bHgsIEZSUUNSICUwNGh4XG4iLCBwdnIsIGZycWNyKTsKLQotCWlmICgoKHB2ciA+PiBDQ05fUFZSX0NISVBfU0hJRlQpICYgQ0NOX1BWUl9DSElQX01BU0spID09IENDTl9QVlJfQ0hJUF9TVDQwU1RCMSkKLQkJc3Q0MF9zcGVjaWZpY190aW1lX2luaXQoY3VycmVudF9jcHVfZGF0YS5tb2R1bGVfY2xvY2ssIGZycWNyKTsKLQllbHNlCi0jZW5kaWYKLQkJZ2V0X2N1cnJlbnRfZnJlcXVlbmN5X2Rpdmlzb3JzKCZpZmMsICZiZmMsICZwZmMpOworCWNsa19pbml0KCk7CiAKIAlpZiAocnRjX2dldF90aW1lKSB7CiAJCXJ0Y19nZXRfdGltZSgmeHRpbWUpOwpAQCAtNTk0LDUxICsxNzksMTIgQEAKICAgICAgICAgc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAteHRpbWUudHZfc2VjLCAteHRpbWUudHZfbnNlYyk7CiAKLQlpZiAoYm9hcmRfdGltZXJfc2V0dXApIHsKLQkJYm9hcmRfdGltZXJfc2V0dXAoJmlycTApOwotCX0gZWxzZSB7Ci0JCXNldHVwX2lycShUSU1FUl9JUlEsICZpcnEwKTsKLQl9Ci0KIAkvKgotCSAqIGZvciBTVDQwIGNoaXBzIHRoZSBjdXJyZW50X2NwdV9kYXRhIHNob3VsZCBhbHJlYWR5IGJlIHNldAotCSAqIHNvIG5vdCBoYXZpbmcgdmFsaWQgcGZjL2JmYy9pZmMgc2hvdWxkbid0IGJlIGEgcHJvYmxlbQorCSAqIEZpbmQgdGhlIHRpbWVyIHRvIHVzZSBhcyB0aGUgc3lzdGVtIHRpbWVyLCBpdCB3aWxsIGJlCisJICogaW5pdGlhbGl6ZWQgZm9yIHVzLgogCSAqLwotCWlmICghY3VycmVudF9jcHVfZGF0YS5tYXN0ZXJfY2xvY2spCi0JCWN1cnJlbnRfY3B1X2RhdGEubWFzdGVyX2Nsb2NrID0gY3VycmVudF9jcHVfZGF0YS5tb2R1bGVfY2xvY2sgKiBwZmM7Ci0JaWYgKCFjdXJyZW50X2NwdV9kYXRhLmJ1c19jbG9jaykKLQkJY3VycmVudF9jcHVfZGF0YS5idXNfY2xvY2sgPSBjdXJyZW50X2NwdV9kYXRhLm1hc3Rlcl9jbG9jayAvIGJmYzsKLQlpZiAoIWN1cnJlbnRfY3B1X2RhdGEuY3B1X2Nsb2NrKQotCQljdXJyZW50X2NwdV9kYXRhLmNwdV9jbG9jayA9IGN1cnJlbnRfY3B1X2RhdGEubWFzdGVyX2Nsb2NrIC8gaWZjOwotCi0JcHJpbnRrKCJDUFUgY2xvY2s6ICVkLiUwMmRNSHpcbiIsCi0JICAgICAgIChjdXJyZW50X2NwdV9kYXRhLmNwdV9jbG9jayAvIDEwMDAwMDApLAotCSAgICAgICAoY3VycmVudF9jcHVfZGF0YS5jcHVfY2xvY2sgJSAxMDAwMDAwKS8xMDAwMCk7Ci0JcHJpbnRrKCJCdXMgY2xvY2s6ICVkLiUwMmRNSHpcbiIsCi0JICAgICAgIChjdXJyZW50X2NwdV9kYXRhLmJ1c19jbG9jayAvIDEwMDAwMDApLAotCSAgICAgICAoY3VycmVudF9jcHVfZGF0YS5idXNfY2xvY2sgJSAxMDAwMDAwKS8xMDAwMCk7Ci0jaWZkZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBTVEIxCi0JcHJpbnRrKCJNZW1vcnkgY2xvY2s6ICVkLiUwMmRNSHpcbiIsCi0JICAgICAgIChjdXJyZW50X2NwdV9kYXRhLm1lbW9yeV9jbG9jayAvIDEwMDAwMDApLAotCSAgICAgICAoY3VycmVudF9jcHVfZGF0YS5tZW1vcnlfY2xvY2sgJSAxMDAwMDAwKS8xMDAwMCk7Ci0jZW5kaWYKLQlwcmludGsoIk1vZHVsZSBjbG9jazogJWQuJTAyZE1IelxuIiwKLQkgICAgICAgKGN1cnJlbnRfY3B1X2RhdGEubW9kdWxlX2Nsb2NrIC8gMTAwMDAwMCksCi0JICAgICAgIChjdXJyZW50X2NwdV9kYXRhLm1vZHVsZV9jbG9jayAlIDEwMDAwMDApLzEwMDAwKTsKLQotCWludGVydmFsID0gKGN1cnJlbnRfY3B1X2RhdGEubW9kdWxlX2Nsb2NrLzQgKyBIWi8yKSAvIEhaOwotCi0JcHJpbnRrKCJJbnRlcnZhbCA9ICVsZFxuIiwgaW50ZXJ2YWwpOwotCi0JLyogU3RhcnQgVE1VMCAqLwotCWN0cmxfb3V0YigwLCBUTVVfVFNUUik7Ci0jaWYgIWRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCkKLQljdHJsX291dGIoVE1VX1RPQ1JfSU5JVCwgVE1VX1RPQ1IpOwotI2VuZGlmCi0JY3RybF9vdXR3KFRNVTBfVENSX0lOSVQsIFRNVTBfVENSKTsKLQljdHJsX291dGwoaW50ZXJ2YWwsIFRNVTBfVENPUik7Ci0JY3RybF9vdXRsKGludGVydmFsLCBUTVUwX1RDTlQpOwotCWN0cmxfb3V0YihUTVVfVFNUUl9JTklULCBUTVVfVFNUUik7CisJc3lzX3RpbWVyID0gZ2V0X3N5c190aW1lcigpOworCXByaW50ayhLRVJOX0lORk8gIlVzaW5nICVzIGZvciBzeXN0ZW0gdGltZXJcbiIsIHN5c190aW1lci0+bmFtZSk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19TSF9LR0RCKQogCS8qCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90aW1lcnMvTWFrZWZpbGUgYi9hcmNoL3NoL2tlcm5lbC90aW1lcnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUxYTZhMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL3RpbWVycy9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSB2YXJpb3VzIExpbnV4L1N1cGVySCB0aW1lcnMKKyMKKworb2JqLXkJOj0gdGltZXIubworCitvYmotJChDT05GSUdfU0hfVE1VKQkJKz0gdGltZXItdG11Lm8KKwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLXRtdS5jIGIvYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLXRtdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YTY0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXItdG11LmMKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiBhcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXItdG11LmMgLSBUTVUgVGltZXIgU3VwcG9ydAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgIFBhdWwgTXVuZHQKKyAqCisgKiBUTVUgaGFuZGxpbmcgY29kZSBoYWNrZWQgb3V0IG9mIGFyY2gvc2gva2VybmVsL3RpbWUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTkgIFRldHN1eWEgT2thZGEgJiBOaWliZSBZdXRha2EKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgIFBoaWxpcHAgUnVtcGYgPHBydW1wZkB0dXgub3JnPgorICogIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCAgUGF1bCBNdW5kdAorICogIENvcHlyaWdodCAoQykgMjAwMiAgTS4gUi4gQnJvd24gIDxtcmJyb3duQGxpbnV4LXNoLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcWxvY2suaD4KKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vcnRjLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9jbG9jay5oPgorCisjZGVmaW5lIFRNVV9UT0NSX0lOSVQJMHgwMAorI2RlZmluZSBUTVUwX1RDUl9JTklUCTB4MDAyMAorI2RlZmluZSBUTVVfVFNUUl9JTklUCTEKKworI2RlZmluZSBUTVUwX1RDUl9DQUxJQgkweDAwMDAKKworc3RhdGljIERFRklORV9TUElOTE9DSyh0bXUwX2xvY2spOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0bXVfdGltZXJfZ2V0X29mZnNldCh2b2lkKQoreworCWludCBjb3VudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3RhdGljIGludCBjb3VudF9wID0gMHg3ZmZmZmZmZjsgICAgLyogZm9yIHRoZSBmaXJzdCBjYWxsIGFmdGVyIGJvb3QgKi8KKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBqaWZmaWVzX3AgPSAwOworCisJLyoKKwkgKiBjYWNoZSB2b2xhdGlsZSBqaWZmaWVzIHRlbXBvcmFyaWx5OyB3ZSBoYXZlIElSUXMgdHVybmVkIG9mZi4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIGppZmZpZXNfdDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0bXUwX2xvY2ssIGZsYWdzKTsKKwkvKiB0aW1lciBjb3VudCBtYXkgdW5kZXJmbG93IHJpZ2h0IGhlcmUgKi8KKwljb3VudCA9IGN0cmxfaW5sKFRNVTBfVENOVCk7CS8qIHJlYWQgdGhlIGxhdGNoZWQgY291bnQgKi8KKworCWppZmZpZXNfdCA9IGppZmZpZXM7CisKKwkvKgorCSAqIGF2b2lkaW5nIHRpbWVyIGluY29uc2lzdGVuY2llcyAodGhleSBhcmUgcmFyZSwgYnV0IHRoZXkgaGFwcGVuKS4uLgorCSAqIHRoZXJlIGlzIG9uZSBraW5kIG9mIHByb2JsZW0gdGhhdCBtdXN0IGJlIGF2b2lkZWQgaGVyZToKKwkgKiAgMS4gdGhlIHRpbWVyIGNvdW50ZXIgdW5kZXJmbG93cworCSAqLworCisJaWYgKGppZmZpZXNfdCA9PSBqaWZmaWVzX3ApIHsKKwkJaWYgKGNvdW50ID4gY291bnRfcCkgeworCQkJLyogdGhlIG51dGNhc2UgKi8KKwkJCWlmIChjdHJsX2ludyhUTVUwX1RDUikgJiAweDEwMCkgeyAvKiBDaGVjayBVTkYgYml0ICovCisJCQkJY291bnQgLT0gTEFUQ0g7CisJCQl9IGVsc2UgeworCQkJCXByaW50aygiJXMgKCk6IGhhcmR3YXJlIHRpbWVyIHByb2JsZW0/XG4iLAorCQkJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQkJfQorCQl9CisJfSBlbHNlCisJCWppZmZpZXNfcCA9IGppZmZpZXNfdDsKKworCWNvdW50X3AgPSBjb3VudDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0bXUwX2xvY2ssIGZsYWdzKTsKKworCWNvdW50ID0gKChMQVRDSC0xKSAtIGNvdW50KSAqIFRJQ0tfU0laRTsKKwljb3VudCA9IChjb3VudCArIExBVENILzIpIC8gTEFUQ0g7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB0bXVfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lcl9zdGF0dXM7CisKKwkvKiBDbGVhciBVTkYgYml0ICovCisJdGltZXJfc3RhdHVzID0gY3RybF9pbncoVE1VMF9UQ1IpOworCXRpbWVyX3N0YXR1cyAmPSB+MHgxMDA7CisJY3RybF9vdXR3KHRpbWVyX3N0YXR1cywgVE1VMF9UQ1IpOworCisJLyoKKwkgKiBIZXJlIHdlIGFyZSBpbiB0aGUgdGltZXIgaXJxIGhhbmRsZXIuIFdlIGp1c3QgaGF2ZSBpcnFzIGxvY2FsbHkKKwkgKiBkaXNhYmxlZCBidXQgd2UgZG9uJ3Qga25vdyBpZiB0aGUgdGltZXJfYmggaXMgcnVubmluZyBvbiB0aGUgb3RoZXIKKwkgKiBDUFUuIFdlIG5lZWQgdG8gYXZvaWQgdG8gU01QIHJhY2Ugd2l0aCBpdC4gTk9URTogd2UgZG9uJyB0IG5lZWQKKwkgKiB0aGUgaXJxIHZlcnNpb24gb2Ygd3JpdGVfbG9jayBiZWNhdXNlIGFzIGp1c3Qgc2FpZCB3ZSBoYXZlIGlycQorCSAqIGxvY2FsbHkgZGlzYWJsZWQuIC1hcmNhCisJICovCisJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7CisJaGFuZGxlX3RpbWVyX3RpY2socmVncyk7CisJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gdG11X2lycSA9IHsKKwkubmFtZQkJPSAidGltZXIiLAorCS5oYW5kbGVyCT0gdG11X3RpbWVyX2ludGVycnVwdCwKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAorCS5tYXNrCQk9IENQVV9NQVNLX05PTkUsCit9OworCisvKgorICogSGFoISAgV2UnbGwgc2VlIGlmIHRoaXMgd29ya3MgKHN3aXRjaGluZyBmcm9tIHVzZWNzIHRvIG5zZWNzKS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgdG11X3RpbWVyX2dldF9mcmVxdWVuY3kodm9pZCkKK3sKKwl1MzIgZnJlcTsKKwlzdHJ1Y3QgdGltZXNwZWMgdHMxLCB0czI7CisJdW5zaWduZWQgbG9uZyBkaWZmX25zZWM7CisJdW5zaWduZWQgbG9uZyBmYWN0b3I7CisKKwkvKiBTZXR1cCB0aGUgdGltZXI6ICBXZSBkb24ndCB3YW50IHRvIGdlbmVyYXRlIGludGVycnVwdHMsIGp1c3QKKwkgKiBoYXZlIGl0IGNvdW50IGRvd24gYXQgaXRzIG5hdHVyYWwgcmF0ZS4KKwkgKi8KKwljdHJsX291dGIoMCwgVE1VX1RTVFIpOworI2lmICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDApICYmICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjApCisJY3RybF9vdXRiKFRNVV9UT0NSX0lOSVQsIFRNVV9UT0NSKTsKKyNlbmRpZgorCWN0cmxfb3V0dyhUTVUwX1RDUl9DQUxJQiwgVE1VMF9UQ1IpOworCWN0cmxfb3V0bCgweGZmZmZmZmZmLCBUTVUwX1RDT1IpOworCWN0cmxfb3V0bCgweGZmZmZmZmZmLCBUTVUwX1RDTlQpOworCisJcnRjX2dldF90aW1lKCZ0czIpOworCisJZG8geworCQlydGNfZ2V0X3RpbWUoJnRzMSk7CisJfSB3aGlsZSAodHMxLnR2X25zZWMgPT0gdHMyLnR2X25zZWMgJiYgdHMxLnR2X3NlYyA9PSB0czIudHZfc2VjKTsKKworCS8qIGFjdHVhbGx5IHN0YXJ0IHRoZSB0aW1lciAqLworCWN0cmxfb3V0YihUTVVfVFNUUl9JTklULCBUTVVfVFNUUik7CisKKwlkbyB7CisJCXJ0Y19nZXRfdGltZSgmdHMyKTsKKwl9IHdoaWxlICh0czEudHZfbnNlYyA9PSB0czIudHZfbnNlYyAmJiB0czEudHZfc2VjID09IHRzMi50dl9zZWMpOworCisJZnJlcSA9IDB4ZmZmZmZmZmYgLSBjdHJsX2lubChUTVUwX1RDTlQpOworCWlmICh0czIudHZfbnNlYyA8IHRzMS50dl9uc2VjKSB7CisJCXRzMi50dl9uc2VjICs9IDEwMDAwMDAwMDA7CisJCXRzMi50dl9zZWMtLTsKKwl9CisKKwlkaWZmX25zZWMgPSAodHMyLnR2X3NlYyAtIHRzMS50dl9zZWMpICogMTAwMDAwMDAwMCArICh0czIudHZfbnNlYyAtIHRzMS50dl9uc2VjKTsKKworCS8qIHRoaXMgc2hvdWxkIHdvcmsgd2VsbCBpZiB0aGUgUlRDIGhhcyBhIHByZWNpc2lvbiBvZiBuIEh6LCB3aGVyZQorCSAqIG4gaXMgYW4gaW50ZWdlci4gIEkgZG9uJ3QgdGhpbmsgd2UgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgb3RoZXIKKwkgKiBjYXNlcy4gKi8KKwlmYWN0b3IgPSAoMTAwMDAwMDAwMCArIGRpZmZfbnNlYy8yKSAvIGRpZmZfbnNlYzsKKworCWlmIChmYWN0b3IgKiBkaWZmX25zZWMgPiAxMTAwMDAwMDAwIHx8CisJICAgIGZhY3RvciAqIGRpZmZfbnNlYyA8ICA5MDAwMDAwMDApCisJCXBhbmljKCJ3ZWlyZCBSVEMgKGRpZmZfbnNlYyAlbGQpIiwgZGlmZl9uc2VjKTsKKworCXJldHVybiBmcmVxICogZmFjdG9yOworfQorCitzdGF0aWMgdm9pZCB0bXVfY2xrX2luaXQoc3RydWN0IGNsayAqY2xrKQoreworCXU4IGRpdmlzb3IgPSBUTVUwX1RDUl9JTklUICYgMHg3OworCWN0cmxfb3V0dyhUTVUwX1RDUl9JTklULCBUTVUwX1RDUik7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyAoNCA8PCAoZGl2aXNvciA8PCAxKSk7Cit9CisKK3N0YXRpYyB2b2lkIHRtdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1OCBkaXZpc29yID0gY3RybF9pbncoVE1VMF9UQ1IpICYgMHg3OworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gKDQgPDwgKGRpdmlzb3IgPDwgMSkpOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgdG11X2Nsa19vcHMgPSB7CisJLmluaXQJCT0gdG11X2Nsa19pbml0LAorCS5yZWNhbGMJCT0gdG11X2Nsa19yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB0bXUwX2NsayA9IHsKKwkubmFtZQkJPSAidG11MF9jbGsiLAorCS5vcHMJCT0gJnRtdV9jbGtfb3BzLAorfTsKKworc3RhdGljIGludCB0bXVfdGltZXJfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgaW50ZXJ2YWw7CisKKwlzZXR1cF9pcnEoVElNRVJfSVJRLCAmdG11X2lycSk7CisKKwl0bXUwX2Nsay5wYXJlbnQgPSBjbGtfZ2V0KCJtb2R1bGVfY2xrIik7CisKKwkvKiBTdGFydCBUTVUwICovCisJY3RybF9vdXRiKDAsIFRNVV9UU1RSKTsKKyNpZiAhZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKSAmJiAhZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwKQorCWN0cmxfb3V0YihUTVVfVE9DUl9JTklULCBUTVVfVE9DUik7CisjZW5kaWYKKworCWNsa19yZWdpc3RlcigmdG11MF9jbGspOworCWNsa19lbmFibGUoJnRtdTBfY2xrKTsKKworCWludGVydmFsID0gKGNsa19nZXRfcmF0ZSgmdG11MF9jbGspICsgSFogLyAyKSAvIEhaOworCXByaW50ayhLRVJOX0lORk8gIkludGVydmFsID0gJWxkXG4iLCBpbnRlcnZhbCk7CisKKwljdHJsX291dGwoaW50ZXJ2YWwsIFRNVTBfVENPUik7CisJY3RybF9vdXRsKGludGVydmFsLCBUTVUwX1RDTlQpOworCisJY3RybF9vdXRiKFRNVV9UU1RSX0lOSVQsIFRNVV9UU1RSKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc3lzX3RpbWVyX29wcyB0bXVfdGltZXJfb3BzID0geworCS5pbml0CQk9IHRtdV90aW1lcl9pbml0LAorCS5nZXRfZnJlcXVlbmN5CT0gdG11X3RpbWVyX2dldF9mcmVxdWVuY3ksCisJLmdldF9vZmZzZXQJPSB0bXVfdGltZXJfZ2V0X29mZnNldCwKK307CisKK3N0cnVjdCBzeXNfdGltZXIgdG11X3RpbWVyID0geworCS5uYW1lCT0gInRtdSIsCisJLm9wcwk9ICZ0bXVfdGltZXJfb3BzLAorfTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLmMgYi9hcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzFmNjMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLmMKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIGFyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci5jIC0gQ29tbW9uIHRpbWVyIGNvZGUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1ICBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KKworc3RhdGljIHN0cnVjdCBzeXNfdGltZXIgKnN5c190aW1lcnNbXSBfX2luaXRkYXRhID0geworI2lmZGVmIENPTkZJR19TSF9UTVUKKwkmdG11X3RpbWVyLAorI2VuZGlmCisJTlVMTCwKK307CisKK3N0YXRpYyBjaGFyIHRpbWVyX292ZXJyaWRlWzEwXSBfX2luaXRkYXRhOworc3RhdGljIGludCBfX2luaXQgdGltZXJfc2V0dXAoY2hhciAqc3RyKQoreworCWlmIChzdHIpCisJCXN0cmxjcHkodGltZXJfb3ZlcnJpZGUsIHN0ciwgc2l6ZW9mKHRpbWVyX292ZXJyaWRlKSk7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJ0aW1lcj0iLCB0aW1lcl9zZXR1cCk7CisKK3N0cnVjdCBzeXNfdGltZXIgKmdldF9zeXNfdGltZXIodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN5c190aW1lcnMpOyBpKyspIHsKKwkJc3RydWN0IHN5c190aW1lciAqdCA9IHN5c190aW1lcnNbaV07CisKKwkJaWYgKHVubGlrZWx5KCF0KSkKKwkJCWJyZWFrOworCQlpZiAodW5saWtlbHkodGltZXJfb3ZlcnJpZGVbMF0pKQorCQkJaWYgKChzdHJjbXAodGltZXJfb3ZlcnJpZGUsIHQtPm5hbWUpICE9IDApKQorCQkJCWNvbnRpbnVlOworCQlpZiAobGlrZWx5KHQtPm9wcy0+aW5pdCgpID09IDApKQorCQkJcmV0dXJuIHQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vS2NvbmZpZyBiL2FyY2gvc2gvbW0vS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjU4NmIxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9tbS9LY29uZmlnCkBAIC0wLDAgKzEsMjMzIEBACittZW51ICJQcm9jZXNzb3Igc2VsZWN0aW9uIgorCisjCisjIFByb2Nlc3NvciBmYW1pbGllcworIworY29uZmlnIENQVV9TSDIKKwlib29sCisJc2VsZWN0IFNIX1dSSVRFVEhST1VHSAorCitjb25maWcgQ1BVX1NIMworCWJvb2wKKwlzZWxlY3QgQ1BVX0hBU19JTlRFVlQKKwlzZWxlY3QgQ1BVX0hBU19TUl9SQgorCitjb25maWcgQ1BVX1NINAorCWJvb2wKKwlzZWxlY3QgQ1BVX0hBU19JTlRFVlQKKwlzZWxlY3QgQ1BVX0hBU19TUl9SQgorCitjb25maWcgQ1BVX1NINEEKKwlib29sCisJc2VsZWN0IENQVV9TSDQKKwlzZWxlY3QgQ1BVX0hBU19JTlRDMl9JUlEKKworY29uZmlnIENQVV9TVUJUWVBFX1NUNDAKKwlib29sCisJc2VsZWN0IENQVV9TSDQKKwlzZWxlY3QgQ1BVX0hBU19JTlRDMl9JUlEKKworIworIyBQcm9jZXNzb3Igc3VidHlwZXMKKyMKKworY29tbWVudCAiU0gtMiBQcm9jZXNzb3IgU3VwcG9ydCIKKworY29uZmlnIENQVV9TVUJUWVBFX1NINzYwNAorCWJvb2wgIlN1cHBvcnQgU0g3NjA0IHByb2Nlc3NvciIKKwlzZWxlY3QgQ1BVX1NIMgorCitjb21tZW50ICJTSC0zIFByb2Nlc3NvciBTdXBwb3J0IgorCitjb25maWcgQ1BVX1NVQlRZUEVfU0g3MzAwCisJYm9vbCAiU3VwcG9ydCBTSDczMDAgcHJvY2Vzc29yIgorCXNlbGVjdCBDUFVfU0gzCisKK2NvbmZpZyBDUFVfU1VCVFlQRV9TSDc3MDUKKwlib29sICJTdXBwb3J0IFNINzcwNSBwcm9jZXNzb3IiCisJc2VsZWN0IENQVV9TSDMKKwlzZWxlY3QgQ1BVX0hBU19QSU5UX0lSUQorCitjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzA3CisJYm9vbCAiU3VwcG9ydCBTSDc3MDcgcHJvY2Vzc29yIgorCXNlbGVjdCBDUFVfU0gzCisJc2VsZWN0IENQVV9IQVNfUElOVF9JUlEKKwloZWxwCisJICBTZWxlY3QgU0g3NzA3IGlmIHlvdSBoYXZlIGEgIDYwIE1oeiBTSC0zIEhENjQxNzcwNyBDUFUuCisKK2NvbmZpZyBDUFVfU1VCVFlQRV9TSDc3MDgKKwlib29sICJTdXBwb3J0IFNINzcwOCBwcm9jZXNzb3IiCisJc2VsZWN0IENQVV9TSDMKKwloZWxwCisJICBTZWxlY3QgU0g3NzA4IGlmIHlvdSBoYXZlIGEgIDYwIE1oeiBTSC0zIEhENjQxNzcwOFMgb3IKKwkgIGlmIHlvdSBoYXZlIGEgMTAwIE1oeiBTSC0zIEhENjQxNzcwOFIgQ1BVLgorCitjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzA5CisJYm9vbCAiU3VwcG9ydCBTSDc3MDkgcHJvY2Vzc29yIgorCXNlbGVjdCBDUFVfU0gzCisJc2VsZWN0IENQVV9IQVNfUElOVF9JUlEKKwloZWxwCisJICBTZWxlY3QgU0g3NzA5IGlmIHlvdSBoYXZlIGEgIDgwIE1oeiBTSC0zIEhENjQxNzcwOSBDUFUuCisKK2NvbW1lbnQgIlNILTQgUHJvY2Vzc29yIFN1cHBvcnQiCisKK2NvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NTAKKwlib29sICJTdXBwb3J0IFNINzc1MCBwcm9jZXNzb3IiCisJc2VsZWN0IENQVV9TSDQKKwloZWxwCisJICBTZWxlY3QgU0g3NzUwIGlmIHlvdSBoYXZlIGEgMjAwIE1oeiBTSC00IEhENjQxNzc1MCBDUFUuCisKK2NvbmZpZyBDUFVfU1VCVFlQRV9TSDcwOTEKKwlib29sICJTdXBwb3J0IFNINzA5MSBwcm9jZXNzb3IiCisJc2VsZWN0IENQVV9TSDQKKwlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUwCisJaGVscAorCSAgU2VsZWN0IFNINzA5MSBpZiB5b3UgaGF2ZSBhbiBTSC00IGJhc2VkIFNlZ2EgZGV2aWNlIChzdWNoIGFzCisJICB0aGUgRHJlYW1jYXN0LCBOYW9taSwgYW5kIE5hb21pIDIpLgorCitjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzUwUgorCWJvb2wgIlN1cHBvcnQgU0g3NzUwUiBwcm9jZXNzb3IiCisJc2VsZWN0IENQVV9TSDQKKwlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUwCisKK2NvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NTBTCisJYm9vbCAiU3VwcG9ydCBTSDc3NTBTIHByb2Nlc3NvciIKKwlzZWxlY3QgQ1BVX1NINAorCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTAKKworY29uZmlnIENQVV9TVUJUWVBFX1NINzc1MQorCWJvb2wgIlN1cHBvcnQgU0g3NzUxIHByb2Nlc3NvciIKKwlzZWxlY3QgQ1BVX1NINAorCWhlbHAKKwkgIFNlbGVjdCBTSDc3NTEgaWYgeW91IGhhdmUgYSAxNjYgTWh6IFNILTQgSEQ2NDE3NzUxIENQVSwKKwkgIG9yIGlmIHlvdSBoYXZlIGEgSEQ2NDE3NzUxUiBDUFUuCisKK2NvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NTFSCisJYm9vbCAiU3VwcG9ydCBTSDc3NTFSIHByb2Nlc3NvciIKKwlzZWxlY3QgQ1BVX1NINAorCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTEKKworY29uZmlnIENQVV9TVUJUWVBFX1NINzc2MAorCWJvb2wgIlN1cHBvcnQgU0g3NzYwIHByb2Nlc3NvciIKKwlzZWxlY3QgQ1BVX1NINAorCXNlbGVjdCBDUFVfSEFTX0lOVEMyX0lSUQorCitjb25maWcgQ1BVX1NVQlRZUEVfU0g0XzIwMgorCWJvb2wgIlN1cHBvcnQgU0g0LTIwMiBwcm9jZXNzb3IiCisJc2VsZWN0IENQVV9TSDQKKworY29tbWVudCAiU1Q0MCBQcm9jZXNzb3IgU3VwcG9ydCIKKworY29uZmlnIENQVV9TVUJUWVBFX1NUNDBTVEIxCisJYm9vbCAiU3VwcG9ydCBTVDQwU1RCMS9TVDQwUkEgcHJvY2Vzc29ycyIKKwlzZWxlY3QgQ1BVX1NVQlRZUEVfU1Q0MAorCWhlbHAKKwkgIFNlbGVjdCBTVDQwU1RCMSBpZiB5b3UgaGF2ZSBhIFNUNDBSQSBDUFUuCisJICBUaGlzIHdhcyBwcmV2aW91c2x5IGNhbGxlZCB0aGUgU1Q0MFNUQjEsIGhlbmNlIHRoZSBvcHRpb24gbmFtZS4KKworY29uZmlnIENQVV9TVUJUWVBFX1NUNDBHWDEKKwlib29sICJTdXBwb3J0IFNUNDBHWDEgcHJvY2Vzc29yIgorCXNlbGVjdCBDUFVfU1VCVFlQRV9TVDQwCisJaGVscAorCSAgU2VsZWN0IFNUNDBHWDEgaWYgeW91IGhhdmUgYSBTVDQwR1gxIENQVS4KKworY29tbWVudCAiU0gtNEEgUHJvY2Vzc29yIFN1cHBvcnQiCisKK2NvbmZpZyBDUFVfU1VCVFlQRV9TSDczMTgwCisJYm9vbCAiU3VwcG9ydCBTSDczMTgwIHByb2Nlc3NvciIKKwlzZWxlY3QgQ1BVX1NINEEKKworY29uZmlnIENQVV9TVUJUWVBFX1NINzc3MAorCWJvb2wgIlN1cHBvcnQgU0g3NzcwIHByb2Nlc3NvciIKKwlzZWxlY3QgQ1BVX1NINEEKKworY29uZmlnIENQVV9TVUJUWVBFX1NINzc4MAorCWJvb2wgIlN1cHBvcnQgU0g3NzgwIHByb2Nlc3NvciIKKwlzZWxlY3QgQ1BVX1NINEEKKworZW5kbWVudQorCittZW51ICJNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zIgorCitjb25maWcgTU1VCisgICAgICAgIGJvb2wgIlN1cHBvcnQgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IGhhcmR3YXJlIgorCWRlcGVuZHMgb24gIUNQVV9TSDIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTb21lIFNIIHByb2Nlc3NvcnMgKHN1Y2ggYXMgU0gtMi9TSC0yQSkgbGFjayBhbiBNTVUuIEluIG9yZGVyIHRvCisJICBib290IG9uIHRoZXNlIHN5c3RlbXMsIHRoaXMgb3B0aW9uIG11c3Qgbm90IGJlIHNldC4KKworCSAgT24gb3RoZXIgc3lzdGVtcyAoc3VjaCBhcyB0aGUgU0gtMyBhbmQgNCkgd2hlcmUgYW4gTU1VIGV4aXN0cywKKwkgIHR1cm5pbmcgdGhpcyBvZmYgd2lsbCBib290IHRoZSBrZXJuZWwgb24gdGhlc2UgbWFjaGluZXMgd2l0aCB0aGUKKwkgIE1NVSBpbXBsaWNpdGx5IHN3aXRjaGVkIG9mZi4KKworY29uZmlnIDMyQklUCisJYm9vbCAiU3VwcG9ydCAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzc2luZyB0aHJvdWdoIFBNQiIKKwlkZXBlbmRzIG9uIENQVV9TSDRBCisJZGVmYXVsdCB5CisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHBoeXNpY2FsIGFkZHJlc3Npbmcgd2lsbCBiZSBleHRlbmRlZCB0bworCSAgMzItYml0cyB0aHJvdWdoIHRoZSBTSC00QSBQTUIuIElmIHRoaXMgaXMgbm90IHNldCwgbGVnYWN5CisJICAyOS1iaXQgcGh5c2ljYWwgYWRkcmVzc2luZyB3aWxsIGJlIHVzZWQuCisKK2Nob2ljZQorCXByb21wdCAiSHVnZVRMQiBwYWdlIHNpemUiCisJZGVwZW5kcyBvbiBIVUdFVExCX1BBR0UgJiYgQ1BVX1NINCAmJiBNTVUKKwlkZWZhdWx0IEhVR0VUTEJfUEFHRV9TSVpFXzY0SworCitjb25maWcgSFVHRVRMQl9QQUdFX1NJWkVfNjRLCisJYm9vbCAiNjRLIgorCitjb25maWcgSFVHRVRMQl9QQUdFX1NJWkVfMU1CCisJYm9vbCAiMU1CIgorCitlbmRjaG9pY2UKKworc291cmNlICJtbS9LY29uZmlnIgorCitlbmRtZW51CisKK21lbnUgIkNhY2hlIGNvbmZpZ3VyYXRpb24iCisKK2NvbmZpZyBTSDc3MDVfQ0FDSEVfMzJLQgorCWJvb2wgIkVuYWJsZSAzMktCIGNhY2hlIHNpemUgZm9yIFNINzcwNSIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzcwNQorCWRlZmF1bHQgeQorCitjb25maWcgU0hfRElSRUNUX01BUFBFRAorCWJvb2wgIlVzZSBkaXJlY3QtbWFwcGVkIGNhY2hpbmciCisJZGVmYXVsdCBuCisJaGVscAorCSAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgY29uZmlndXJlIHRoZSBjYWNoZXMgdG8gYmUgZGlyZWN0LW1hcHBlZCwKKwkgIGV2ZW4gaWYgdGhlIGNhY2hlIHN1cHBvcnRzIGEgMiBvciA0LXdheSBtb2RlLiBUaGlzIGlzIHVzZWZ1bCBwcmltYXJpbHkKKwkgIGZvciBkZWJ1Z2dpbmcgb24gcGxhdGZvcm1zIHdpdGggMiBhbmQgNC13YXkgY2FjaGVzIChTSDc3NTBSL1NINzc1MVIsCisJICBTSDQtMjAyLCBTSDQtNTAxLCBldGMuKQorCisJICBUdXJuIHRoaXMgb3B0aW9uIG9mZiBmb3IgcGxhdGZvcm1zIHRoYXQgZG8gbm90IGhhdmUgYSBkaXJlY3QtbWFwcGVkCisJICBjYWNoZSwgYW5kIHlvdSBoYXZlIG5vIG5lZWQgdG8gcnVuIHRoZSBjYWNoZXMgaW4gc3VjaCBhIGNvbmZpZ3VyYXRpb24uCisKK2NvbmZpZyBTSF9XUklURVRIUk9VR0gKKwlib29sICJVc2Ugd3JpdGUtdGhyb3VnaCBjYWNoaW5nIgorCWRlZmF1bHQgeSBpZiBDUFVfU0gyCisJaGVscAorCSAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgY29uZmlndXJlIHRoZSBjYWNoZXMgaW4gd3JpdGUtdGhyb3VnaAorCSAgbW9kZSwgYXMgb3Bwb3NlZCB0byB0aGUgZGVmYXVsdCB3cml0ZS1iYWNrIGNvbmZpZ3VyYXRpb24uCisKKwkgIFNpbmNlIHRoZXJlJ3Mgc2lsbCBzb21lIGFsaWFzaW5nIGlzc3VlcyBvbiBTSC00LCB0aGlzIG9wdGlvbiB3aWxsCisJICB1bmZvcnR1bmF0ZWx5IHN0aWxsIHJlcXVpcmUgdGhlIG1ham9yaXR5IG9mIGZsdXNoaW5nIGZ1bmN0aW9ucyB0bworCSAgYmUgaW1wbGVtZW50ZWQgdG8gZGVhbCB3aXRoIGFsaWFzaW5nLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgU0hfT0NSQU0KKwlib29sICJPcGVyYW5kIENhY2hlIFJBTSAoT0NSQU0pIHN1cHBvcnQiCisJaGVscAorCSAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgYXV0b21hdGljYWxseSB0ZWFyIGRvd24gdGhlIG51bWJlciBvZgorCSAgc2V0cyBpbiB0aGUgZGNhY2hlIGJ5IGhhbGYsIHdoaWNoIGluIHR1cm4gZXhwb3NlcyBhIG1lbW9yeSByYW5nZS4KKworCSAgVGhlIGFkZHJlc3NlcyBmb3IgdGhlIE9DIFJBTSBiYXNlIHdpbGwgdmFyeSBhY2NvcmRpbmcgdG8gdGhlCisJICBwcm9jZXNzb3IgdmVyc2lvbi4gQ29uc3VsdCB2ZW5kb3IgZG9jdW1lbnRhdGlvbiBmb3Igc3BlY2lmaWNzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL2lvcmVtYXAuYyBiL2FyY2gvc2gvbW0vaW9yZW1hcC5jCmluZGV4IGU3OTRlMjcuLjk2ZmE0YTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vaW9yZW1hcC5jCisrKyBiL2FyY2gvc2gvbW0vaW9yZW1hcC5jCkBAIC02LDEzICs2LDE5IEBACiAgKiA2NDBrLTFNQiBJTyBtZW1vcnkgYXJlYSBvbiBQQydzCiAgKgogICogKEMpIENvcHlyaWdodCAxOTk1IDE5OTYgTGludXMgVG9ydmFsZHMKKyAqIChDKSBDb3B5cmlnaHQgMjAwNSwgMjAwNiBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMKKyAqIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KICAqLwotCiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogCkBAIC04MCw5ICs4NiwxNSBAQAogCWlmIChhZGRyZXNzID49IGVuZCkKIAkJQlVHKCk7CiAJZG8geworCQlwdWRfdCAqcHVkOwogCQlwbWRfdCAqcG1kOwotCQlwbWQgPSBwbWRfYWxsb2MoJmluaXRfbW0sIGRpciwgYWRkcmVzcyk7CisKIAkJZXJyb3IgPSAtRU5PTUVNOworCisJCXB1ZCA9IHB1ZF9hbGxvYygmaW5pdF9tbSwgZGlyLCBhZGRyZXNzKTsKKwkJaWYgKCFwdWQpCisJCQlicmVhazsKKwkJcG1kID0gcG1kX2FsbG9jKCZpbml0X21tLCBwdWQsIGFkZHJlc3MpOwogCQlpZiAoIXBtZCkKIAkJCWJyZWFrOwogCQlpZiAocmVtYXBfYXJlYV9wbWQocG1kLCBhZGRyZXNzLCBlbmQgLSBhZGRyZXNzLApAQCAtOTcsMTAgKzEwOSw2IEBACiB9CiAKIC8qCi0gKiBHZW5lcmljIG1hcHBpbmcgZnVuY3Rpb24gKG5vdCB2aXNpYmxlIG91dHNpZGUpOgotICovCi0KLS8qCiAgKiBSZW1hcCBhbiBhcmJpdHJhcnkgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZSBpbnRvIHRoZSBrZXJuZWwgdmlydHVhbAogICogYWRkcmVzcyBzcGFjZS4gTmVlZGVkIHdoZW4gdGhlIGtlcm5lbCB3YW50cyB0byBhY2Nlc3MgaGlnaCBhZGRyZXNzZXMKICAqIGRpcmVjdGx5LgpAQCAtMTA5LDExICsxMTcsMTEgQEAKICAqIGhhdmUgdG8gY29udmVydCB0aGVtIGludG8gYW4gb2Zmc2V0IGluIGEgcGFnZS1hbGlnbmVkIG1hcHBpbmcsIGJ1dCB0aGUKICAqIGNhbGxlciBzaG91bGRuJ3QgbmVlZCB0byBrbm93IHRoYXQgc21hbGwgZGV0YWlsLgogICovCi12b2lkICogcDNfaW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQordm9pZCBfX2lvbWVtICpfX2lvcmVtYXAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7Ci0Jdm9pZCAqIGFkZHI7CiAJc3RydWN0IHZtX3N0cnVjdCAqIGFyZWE7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQsIGxhc3RfYWRkcjsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgbGFzdF9hZGRyLCBhZGRyLCBvcmlnX2FkZHI7CiAKIAkvKiBEb24ndCBhbGxvdyB3cmFwYXJvdW5kIG9yIHplcm8gc2l6ZSAqLwogCWxhc3RfYWRkciA9IHBoeXNfYWRkciArIHNpemUgLSAxOwpAQCAtMTI0LDcgKzEzMiw3IEBACiAJICogRG9uJ3QgcmVtYXAgdGhlIGxvdyBQQ0kvSVNBIGFyZWEsIGl0J3MgYWx3YXlzIG1hcHBlZC4uCiAJICovCiAJaWYgKHBoeXNfYWRkciA+PSAweEEwMDAwICYmIGxhc3RfYWRkciA8IDB4MTAwMDAwKQotCQlyZXR1cm4gcGh5c190b192aXJ0KHBoeXNfYWRkcik7CisJCXJldHVybiAodm9pZCBfX2lvbWVtICopcGh5c190b192aXJ0KHBoeXNfYWRkcik7CiAKIAkvKgogCSAqIERvbid0IGFsbG93IGFueWJvZHkgdG8gcmVtYXAgbm9ybWFsIFJBTSB0aGF0IHdlJ3JlIHVzaW5nLi4KQEAgLTE0NiwxNiArMTU0LDcxIEBACiAJaWYgKCFhcmVhKQogCQlyZXR1cm4gTlVMTDsKIAlhcmVhLT5waHlzX2FkZHIgPSBwaHlzX2FkZHI7Ci0JYWRkciA9IGFyZWEtPmFkZHI7Ci0JaWYgKHJlbWFwX2FyZWFfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGFkZHIsIHBoeXNfYWRkciwgc2l6ZSwgZmxhZ3MpKSB7Ci0JCXZ1bm1hcChhZGRyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAodm9pZCAqKSAob2Zmc2V0ICsgKGNoYXIgKilhZGRyKTsKLX0KKwlvcmlnX2FkZHIgPSBhZGRyID0gKHVuc2lnbmVkIGxvbmcpYXJlYS0+YWRkcjsKIAotdm9pZCBwM19pb3VubWFwKHZvaWQgKmFkZHIpCi17Ci0JaWYgKGFkZHIgPiBoaWdoX21lbW9yeSkKLQkJdmZyZWUoKHZvaWQgKikoUEFHRV9NQVNLICYgKHVuc2lnbmVkIGxvbmcpYWRkcikpOworI2lmZGVmIENPTkZJR18zMkJJVAorCS8qCisJICogRmlyc3QgdHJ5IHRvIHJlbWFwIHRocm91Z2ggdGhlIFBNQiBvbmNlIGEgdmFsaWQgVk1BIGhhcyBiZWVuCisJICogZXN0YWJsaXNoZWQuIFNtYWxsZXIgYWxsb2NhdGlvbnMgKG9yIHRoZSByZXN0IG9mIHRoZSBzaXplCisJICogcmVtYWluaW5nIGFmdGVyIGEgUE1CIG1hcHBpbmcgZHVlIHRvIHRoZSBzaXplIG5vdCBiZWluZworCSAqIHBlcmZlY3RseSBhbGlnbmVkIG9uIGEgUE1CIHNpemUgYm91bmRhcnkpIGFyZSB0aGVuIG1hcHBlZAorCSAqIHRocm91Z2ggdGhlIFVUTEIgdXNpbmcgY29udmVudGlvbmFsIHBhZ2UgdGFibGVzLgorCSAqCisJICogUE1CIGVudHJpZXMgYXJlIGFsbCBwcmUtZmF1bHRlZC4KKwkgKi8KKwlpZiAodW5saWtlbHkoc2l6ZSA+PSAweDEwMDAwMDApKSB7CisJCXVuc2lnbmVkIGxvbmcgbWFwcGVkID0gcG1iX3JlbWFwKGFkZHIsIHBoeXNfYWRkciwgc2l6ZSwgZmxhZ3MpOworCisJCWlmIChsaWtlbHkobWFwcGVkKSkgeworCQkJYWRkcgkJKz0gbWFwcGVkOworCQkJcGh5c19hZGRyCSs9IG1hcHBlZDsKKwkJCXNpemUJCS09IG1hcHBlZDsKKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKGxpa2VseShzaXplKSkKKwkJaWYgKHJlbWFwX2FyZWFfcGFnZXMoYWRkciwgcGh5c19hZGRyLCBzaXplLCBmbGFncykpIHsKKwkJCXZ1bm1hcCgodm9pZCAqKW9yaWdfYWRkcik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJcmV0dXJuICh2b2lkIF9faW9tZW0gKikob2Zmc2V0ICsgKGNoYXIgKilvcmlnX2FkZHIpOwogfQorRVhQT1JUX1NZTUJPTChfX2lvcmVtYXApOworCit2b2lkIF9faW91bm1hcCh2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJdW5zaWduZWQgbG9uZyB2YWRkciA9ICh1bnNpZ25lZCBsb25nIF9fZm9yY2UpYWRkcjsKKwlzdHJ1Y3Qgdm1fc3RydWN0ICpwOworCisJaWYgKFBYU0VHKHZhZGRyKSA8IFAzU0VHKQorCQlyZXR1cm47CisKKyNpZmRlZiBDT05GSUdfMzJCSVQKKwkvKgorCSAqIFB1cmdlIGFueSBQTUIgZW50cmllcyB0aGF0IG1heSBoYXZlIGJlZW4gZXN0YWJsaXNoZWQgZm9yIHRoaXMKKwkgKiBtYXBwaW5nLCB0aGVuIHByb2NlZWQgd2l0aCBjb252ZW50aW9uYWwgVk1BIHRlYXJkb3duLgorCSAqCisJICogWFhYOiBOb3RlIHRoYXQgZHVlIHRvIHRoZSB3YXkgdGhhdCByZW1vdmVfdm1fYXJlYSgpIGRvZXMKKwkgKiBtYXRjaGluZyBvZiB0aGUgcmVzdWx0YW50IFZNQSwgd2UgYXJlbid0IGFibGUgdG8gZmFzdC1mb3J3YXJkCisJICogdGhlIGFkZHJlc3MgcGFzdCB0aGUgUE1CIHNwYWNlIHVudGlsIHRoZSBlbmQgb2YgdGhlIFZNQSB3aGVyZQorCSAqIHRoZSBwYWdlIHRhYmxlcyByZXNpZGUuIEFzIHN1Y2gsIHVubWFwX3ZtX2FyZWEoKSB3aWxsIGJlCisJICogZm9yY2VkIHRvIGxpbmVhcmx5IHNjYW4gb3ZlciB0aGUgYXJlYSB1bnRpbCBpdCBmaW5kcyB0aGUgcGFnZQorCSAqIHRhYmxlcyB3aGVyZSBQVEVzIHRoYXQgbmVlZCB0byBiZSB1bm1hcHBlZCBhY3R1YWxseSByZXNpZGUsCisJICogd2hpY2ggaXMgZmFyIGZyb20gb3B0aW1hbC4gUGVyaGFwcyB3ZSBuZWVkIHRvIHVzZSBhIHNlcGFyYXRlCisJICogVk1BIGZvciB0aGUgUE1CIG1hcHBpbmdzPworCSAqCQkJCQktLSBQRk0uCisJICovCisJcG1iX3VubWFwKHZhZGRyKTsKKyNlbmRpZgorCisJcCA9IHJlbW92ZV92bV9hcmVhKCh2b2lkICopKHZhZGRyICYgUEFHRV9NQVNLKSk7CisJaWYgKCFwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGJhZCBhZGRyZXNzICVwXG4iLCBfX0ZVTkNUSU9OX18sIGFkZHIpOworCQlyZXR1cm47CisJfQorCisJa2ZyZWUocCk7Cit9CitFWFBPUlRfU1lNQk9MKF9faW91bm1hcCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL3Rvb2xzL21hY2gtdHlwZXMgYi9hcmNoL3NoL3Rvb2xzL21hY2gtdHlwZXMKaW5kZXggMDY5M2ZiZC4uMTgyZmU5MCAxMDA2NDQKLS0tIGEvYXJjaC9zaC90b29scy9tYWNoLXR5cGVzCisrKyBiL2FyY2gvc2gvdG9vbHMvbWFjaC10eXBlcwpAQCAtMTAsMTAgKzEwLDcgQEAKIDczMDBTRQkJCVNIXzczMDBfU09MVVRJT05fRU5HSU5FCiA3MzE4MFNFCQkJU0hfNzMxODBfU09MVVRJT05fRU5HSU5FCiA3NzUxU1lTVEVNSAkJU0hfNzc1MV9TWVNURU1ICi1IUDYwMAkJCVNIX0hQNjAwCi1IUDYyMAkJCVNIX0hQNjIwCi1IUDY4MAkJCVNIX0hQNjgwCi1IUDY5MAkJCVNIX0hQNjkwCitIUDZYWAkJCVNIX0hQNlhYCiBIRDY0NDYxCQkJSEQ2NDQ2MQogSEQ2NDQ2NQkJCUhENjQ0NjUKIFNIMjAwMAkJCVNIX1NIMjAwMApkaWZmIC0tZ2l0IGEvYXJjaC9zaDY0L0tjb25maWcgYi9hcmNoL3NoNjQvS2NvbmZpZwppbmRleCBmYjM1YjQ1Li4wN2IxNzJkIDEwMDY0NAotLS0gYS9hcmNoL3NoNjQvS2NvbmZpZworKysgYi9hcmNoL3NoNjQvS2NvbmZpZwpAQCAtMTcsMTAgKzE3LDYgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKLWNvbmZpZyBVSUQxNgotCWJvb2wKLQlkZWZhdWx0IHkKLQogY29uZmlnIFJXU0VNX0dFTkVSSUNfU1BJTkxPQ0sKIAlib29sCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL3NoNjQva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvc2g2NC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGI5NWQwNDEuLjFkYTljNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2g2NC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvc2g2NC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC03NDQsNyArNzQ0LDcgQEAKIAl9CiAjZW5kaWYKIAkvKiBDb3B5IGZyb20gc2ggdmVyc2lvbiAqLwotCWNoaWxkcmVncyA9ICgoc3RydWN0IHB0X3JlZ3MgKikoVEhSRUFEX1NJWkUgKyAodW5zaWduZWQgbG9uZykgcC0+dGhyZWFkX2luZm8gKSkgLSAxOworCWNoaWxkcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKShUSFJFQURfU0laRSArIHRhc2tfc3RhY2tfcGFnZShwKSkgLSAxOwogCiAJKmNoaWxkcmVncyA9ICpyZWdzOwogCkBAIC03NTIsNyArNzUyLDcgQEAKIAkJY2hpbGRyZWdzLT5yZWdzWzE1XSA9IHVzcDsKIAkJcC0+dGhyZWFkLnVyZWdzID0gY2hpbGRyZWdzOwogCX0gZWxzZSB7Ci0JCWNoaWxkcmVncy0+cmVnc1sxNV0gPSAodW5zaWduZWQgbG9uZylwLT50aHJlYWRfaW5mbyArIFRIUkVBRF9TSVpFOworCQljaGlsZHJlZ3MtPnJlZ3NbMTVdID0gKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHApICsgVEhSRUFEX1NJWkU7CiAJfQogCiAJY2hpbGRyZWdzLT5yZWdzWzldID0gMDsgLyogU2V0IHJldHVybiB2YWx1ZSBmb3IgY2hpbGQgKi8KQEAgLTc3NSwyNiArNzc1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIGZpbGwgaW4gdGhlIHVzZXIgc3RydWN0dXJlIGZvciBhIGNvcmUgZHVtcC4uCi0gKi8KLXZvaWQgZHVtcF90aHJlYWQoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBzdHJ1Y3QgdXNlciAqIGR1bXApCi17Ci0JZHVtcC0+bWFnaWMgPSBDTUFHSUM7Ci0JZHVtcC0+c3RhcnRfY29kZSA9IGN1cnJlbnQtPm1tLT5zdGFydF9jb2RlOwotCWR1bXAtPnN0YXJ0X2RhdGEgID0gY3VycmVudC0+bW0tPnN0YXJ0X2RhdGE7Ci0JZHVtcC0+c3RhcnRfc3RhY2sgPSByZWdzLT5yZWdzWzE1XSAmIH4oUEFHRV9TSVpFIC0gMSk7Ci0JZHVtcC0+dV90c2l6ZSA9IChjdXJyZW50LT5tbS0+ZW5kX2NvZGUgLSBkdW1wLT5zdGFydF9jb2RlKSA+PiBQQUdFX1NISUZUOwotCWR1bXAtPnVfZHNpemUgPSAoY3VycmVudC0+bW0tPmJyayArIChQQUdFX1NJWkUtMSkgLSBkdW1wLT5zdGFydF9kYXRhKSA+PiBQQUdFX1NISUZUOwotCWR1bXAtPnVfc3NpemUgPSAoY3VycmVudC0+bW0tPnN0YXJ0X3N0YWNrIC0gZHVtcC0+c3RhcnRfc3RhY2sgKwotCQkJIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7Ci0JLyogRGVidWcgcmVnaXN0ZXJzIHdpbGwgY29tZSBoZXJlLiAqLwotCi0JZHVtcC0+cmVncyA9ICpyZWdzOwotCi0JZHVtcC0+dV9mcHZhbGlkID0gZHVtcF9mcHUocmVncywgJmR1bXAtPmZwdSk7Ci19Ci0KIGFzbWxpbmthZ2UgaW50IHN5c19mb3JrKHVuc2lnbmVkIGxvbmcgcjIsIHVuc2lnbmVkIGxvbmcgcjMsCiAJCQl1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAogCQkJdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKZGlmZiAtLWdpdCBhL2FyY2gvc2g2NC9rZXJuZWwvc2hfa3N5bXMuYyBiL2FyY2gvc2g2NC9rZXJuZWwvc2hfa3N5bXMuYwppbmRleCAwYjU0OTdkLi40NzJiNDUwIDEwMDY0NAotLS0gYS9hcmNoL3NoNjQva2VybmVsL3NoX2tzeW1zLmMKKysrIGIvYXJjaC9zaDY0L2tlcm5lbC9zaF9rc3ltcy5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCi1leHRlcm4gdm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgdXNlciAqKTsKIGV4dGVybiBpbnQgZHVtcF9mcHUoc3RydWN0IHB0X3JlZ3MgKiwgZWxmX2ZwcmVnc2V0X3QgKik7CiAKICNpZiAwCkBAIC00MSw3ICs0MCw2IEBACiAjZW5kaWYKIAogLyogcGxhdGZvcm0gZGVwZW5kZW50IHN1cHBvcnQgKi8KLUVYUE9SVF9TWU1CT0woZHVtcF90aHJlYWQpOwogRVhQT1JUX1NZTUJPTChkdW1wX2ZwdSk7CiBFWFBPUlRfU1lNQk9MKGlvdW5tYXApOwogRVhQT1JUX1NZTUJPTChlbmFibGVfaXJxKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2g2NC9rZXJuZWwvdGltZS5jIGIvYXJjaC9zaDY0L2tlcm5lbC90aW1lLmMKaW5kZXggODcwZmU1My4uMTE5NWFmMyAxMDA2NDQKLS0tIGEvYXJjaC9zaDY0L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9zaDY0L2tlcm5lbC90aW1lLmMKQEAgLTQxNyw3ICs0MTcsNyBAQAogCS8qCiAJKiogUmVnYXJkbGVzcyB0aGUgdG9vbGNoYWluLCBmb3JjZSB0aGUgY29tcGlsZXIgdG8gdXNlIHRoZQogCSoqIGFyYml0cmFyeSByZWdpc3RlciByMyBhcyBhIGNsb2NrIHRpY2sgY291bnRlci4KLQkqKiBOT1RFOiByMyBtdXN0IGJlIGluIGFjY29yZGFuY2Ugd2l0aCBydGNfaW50ZXJydXB0KCkKKwkqKiBOT1RFOiByMyBtdXN0IGJlIGluIGFjY29yZGFuY2Ugd2l0aCBzaDY0X3J0Y19pbnRlcnJ1cHQoKQogCSovCiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBsb25nICBfX3J0Y19pcnFfZmxhZyBfX2FzbV9fICgicjMiKTsKIApAQCAtNDgyLDcgKzQ4Miw4IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGlycXJldHVybl90IHJ0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpcnFyZXR1cm5fdCBzaDY0X3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWN0cmxfb3V0YigwLCBSQ1IxKTsJLyogRGlzYWJsZSBDYXJyeSBJbnRlcnJ1cHRzICovCiAJcmVncy0+cmVnc1szXSA9IDE7CS8qIFVzaW5nIHIzICovCkBAIC00OTEsNyArNDkyLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXJxMCAgPSB7IHRpbWVyX2ludGVycnVwdCwgU0FfSU5URVJSVVBULCBDUFVfTUFTS19OT05FLCAidGltZXIiLCBOVUxMLCBOVUxMfTsKLXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlycTEgID0geyBydGNfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsIENQVV9NQVNLX05PTkUsICJydGMiLCBOVUxMLCBOVUxMfTsKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlycTEgID0geyBzaDY0X3J0Y19pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwgQ1BVX01BU0tfTk9ORSwgInJ0YyIsIE5VTEwsIE5VTEx9OwogCiB2b2lkIF9faW5pdCB0aW1lX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvc2g2NC9saWIvZGJnLmMgYi9hcmNoL3NoNjQvbGliL2RiZy5jCmluZGV4IDUyNmZlZGEuLjU4MDg3MzMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2g2NC9saWIvZGJnLmMKKysrIGIvYXJjaC9zaDY0L2xpYi9kYmcuYwpAQCAtMTc0LDcgKzE3NCw3IEBACiAJc3RydWN0IHJpbmdfbm9kZSAqcnI7CiAKIAlwaWQgPSBjdXJyZW50LT5waWQ7Ci0Jc3RhY2tfYm90dG9tID0gKHVuc2lnbmVkIGxvbmcpIGN1cnJlbnQtPnRocmVhZF9pbmZvOworCXN0YWNrX2JvdHRvbSA9ICh1bnNpZ25lZCBsb25nKSB0YXNrX3N0YWNrX3BhZ2UoY3VycmVudCk7CiAJYXNtIHZvbGF0aWxlKCJvcmkgcjE1LCAwLCAlMCIgOiAiPXIiIChzcCkpOwogCXJyID0gZXZlbnRfcmluZyArIGV2ZW50X3B0cjsKIAlyci0+ZXZ0ID0gZXZ0OwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9LY29uZmlnIGIvYXJjaC9zcGFyYy9LY29uZmlnCmluZGV4IDU2YzM0ZTcuLmY5NDRiNTggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvS2NvbmZpZworKysgYi9hcmNoL3NwYXJjL0tjb25maWcKQEAgLTksMTAgKzksNiBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAotY29uZmlnIFVJRDE2Ci0JYm9vbAotCWRlZmF1bHQgeQotCiBjb25maWcgSElHSE1FTQogCWJvb2wKIAlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2VudHJ5LlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9lbnRyeS5TCmluZGV4IDAzZWNiNGUuLmM1MWQwOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvZW50cnkuUwpAQCAtMTI3Nyw2MiArMTI3Nyw2IEBACiAJIG1vdgklbDUsICVvNwogCiAJLmFsaWduCTQKLQkuZ2xvYmwJc3lzX3NpZ3BhdXNlCi1zeXNfc2lncGF1c2U6Ci0JLyogTm90ZTogJW8wIGFscmVhZHkgaGFzIGNvcnJlY3QgdmFsdWUuLi4gKi8KLQljYWxsCWRvX3NpZ3BhdXNlCi0JIGFkZAklc3AsIFNUQUNLRlJBTUVfU1osICVvMQotCi0JbGQJWyVjdXJwdHIgKyBUSV9GTEFHU10sICVsNQotCWFuZGNjCSVsNSwgX1RJRl9TWVNDQUxMX1RSQUNFLCAlZzAKLQliZQkxZgotCSBub3AKLQotCWNhbGwJc3lzY2FsbF90cmFjZQotCSBub3AKLQotMToKLQkvKiBXZSBhcmUgcmV0dXJuaW5nIHRvIGEgc2lnbmFsIGhhbmRsZXIuICovCi0JUkVTVE9SRV9BTEwKLQotCS5hbGlnbgk0Ci0JLmdsb2JsCXN5c19zaWdzdXNwZW5kCi1zeXNfc2lnc3VzcGVuZDoKLQljYWxsCWRvX3NpZ3N1c3BlbmQKLQkgYWRkCSVzcCwgU1RBQ0tGUkFNRV9TWiwgJW8wCi0KLQlsZAlbJWN1cnB0ciArIFRJX0ZMQUdTXSwgJWw1Ci0JYW5kY2MJJWw1LCBfVElGX1NZU0NBTExfVFJBQ0UsICVnMAotCWJlCTFmCi0JIG5vcAotCi0JY2FsbAlzeXNjYWxsX3RyYWNlCi0JIG5vcAotCi0xOgotCS8qIFdlIGFyZSByZXR1cm5pbmcgdG8gYSBzaWduYWwgaGFuZGxlci4gKi8KLQlSRVNUT1JFX0FMTAotCi0JLmFsaWduCTQKLQkuZ2xvYmwJc3lzX3J0X3NpZ3N1c3BlbmQKLXN5c19ydF9zaWdzdXNwZW5kOgotCS8qIE5vdGU6ICVvMCwgJW8xIGFscmVhZHkgaGF2ZSBjb3JyZWN0IHZhbHVlLi4uICovCi0JY2FsbAlkb19ydF9zaWdzdXNwZW5kCi0JIGFkZAklc3AsIFNUQUNLRlJBTUVfU1osICVvMgotCi0JbGQJWyVjdXJwdHIgKyBUSV9GTEFHU10sICVsNQotCWFuZGNjCSVsNSwgX1RJRl9TWVNDQUxMX1RSQUNFLCAlZzAKLQliZQkxZgotCSBub3AKLQotCWNhbGwJc3lzY2FsbF90cmFjZQotCSBub3AKLQotMToKLQkvKiBXZSBhcmUgcmV0dXJuaW5nIHRvIGEgc2lnbmFsIGhhbmRsZXIuICovCi0JUkVTVE9SRV9BTEwKLQotCS5hbGlnbgk0CiAJLmdsb2JsCXN5c19zaWdyZXR1cm4KIHN5c19zaWdyZXR1cm46CiAJY2FsbAlkb19zaWdyZXR1cm4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3MuYwppbmRleCBlYTg2NDc0Li5mYmIwNWE0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zMDIsNyArMzAyLDcgQEAKIAlpbnQgY291bnQgPSAwOwogCiAJaWYgKHRzayAhPSBOVUxMKQotCQl0YXNrX2Jhc2UgPSAodW5zaWduZWQgbG9uZykgdHNrLT50aHJlYWRfaW5mbzsKKwkJdGFza19iYXNlID0gKHVuc2lnbmVkIGxvbmcpIHRhc2tfc3RhY2tfcGFnZSh0c2spOwogCWVsc2UKIAkJdGFza19iYXNlID0gKHVuc2lnbmVkIGxvbmcpIGN1cnJlbnRfdGhyZWFkX2luZm8oKTsKIApAQCAtMzM3LDcgKzMzNyw3IEBACiAgKi8KIHVuc2lnbmVkIGxvbmcgdGhyZWFkX3NhdmVkX3BjKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewotCXJldHVybiB0c2stPnRocmVhZF9pbmZvLT5rcGM7CisJcmV0dXJuIHRhc2tfdGhyZWFkX2luZm8odHNrKS0+a3BjOwogfQogCiAvKgpAQCAtMzkyLDcgKzM5Miw3IEBACiAJCS8qIFdlIG11c3QgZml4dXAga3JlZ3MgYXMgd2VsbC4gKi8KIAkJLyogWFhYIFRoaXMgd2FzIG5vdCBmaXhlZCBmb3IgdGkgZm9yIGEgd2hpbGUsIHdvcmtlZC4gVW51c2VkPyAqLwogCQljdXJyZW50LT50aHJlYWQua3JlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikKLQkJICAgICgoY2hhciAqKWN1cnJlbnQtPnRocmVhZF9pbmZvICsgKFRIUkVBRF9TSVpFIC0gVFJBQ0VSRUdfU1opKTsKKwkJICAgICh0YXNrX3N0YWNrX3BhZ2UoY3VycmVudCkgKyAoVEhSRUFEX1NJWkUgLSBUUkFDRVJFR19TWikpOwogCX0KIH0KIApAQCAtNDU5LDcgKzQ1OSw3IEBACiAJCXVuc2lnbmVkIGxvbmcgdW51c2VkLAogCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSBwLT50aHJlYWRfaW5mbzsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gdGFza190aHJlYWRfaW5mbyhwKTsKIAlzdHJ1Y3QgcHRfcmVncyAqY2hpbGRyZWdzOwogCWNoYXIgKm5ld19zdGFjazsKIApAQCAtNDgyLDcgKzQ4Miw3IEBACiAJICogIFYgICAgICAgICAgICAgICAgICAgICAgViAoc3RrLmZyLikgViAgKHB0X3JlZ3MpICB7IChzdGsuZnIuKSB9CiAJICogICstLS0tLSAtIC0gLSAtIC0gLS0tLS0tKz09PT09PT09PT09Kz09PT09PT09PT09PT17Kz09PT09PT09PT19KwogCSAqLwotCW5ld19zdGFjayA9IChjaGFyKil0aSArIFRIUkVBRF9TSVpFOworCW5ld19zdGFjayA9IHRhc2tfc3RhY2tfcGFnZShwKSArIFRIUkVBRF9TSVpFOwogCWlmIChyZWdzLT5wc3IgJiBQU1JfUFMpCiAJCW5ld19zdGFjayAtPSBTVEFDS0ZSQU1FX1NaOwogCW5ld19zdGFjayAtPSBTVEFDS0ZSQU1FX1NaICsgVFJBQ0VSRUdfU1o7CkBAIC03MjQsNyArNzI0LDcgQEAKICAgICAgICAgICAgIHRhc2stPnN0YXRlID09IFRBU0tfUlVOTklORykKIAkJZ290byBvdXQ7CiAKLQlmcCA9IHRhc2stPnRocmVhZF9pbmZvLT5rc3AgKyBiaWFzOworCWZwID0gdGFza190aHJlYWRfaW5mbyh0YXNrKS0+a3NwICsgYmlhczsKIAlkbyB7CiAJCS8qIEJvZ3VzIGZyYW1lIHBvaW50ZXI/ICovCiAJCWlmIChmcCA8ICh0YXNrX2Jhc2UgKyBzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSkgfHwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHRyYWNlLmMKaW5kZXggNDc1YzRjMS4uMWJhZjEzZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHRyYWNlLmMKQEAgLTc1LDcgKzc1LDcgQEAKIAkJCQkgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgbG9uZyBfX3VzZXIgKmFkZHIpCiB7CiAJc3RydWN0IHB0X3JlZ3MgKmNyZWdzID0gdHNrLT50aHJlYWQua3JlZ3M7Ci0Jc3RydWN0IHRocmVhZF9pbmZvICp0ID0gdHNrLT50aHJlYWRfaW5mbzsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnQgPSB0YXNrX3RocmVhZF9pbmZvKHRzayk7CiAJaW50IHY7CiAJCiAJaWYob2Zmc2V0ID49IDEwMjQpCkBAIC0xNzAsNyArMTcwLDcgQEAKIAkJCQkgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJc3RydWN0IHB0X3JlZ3MgKmNyZWdzID0gdHNrLT50aHJlYWQua3JlZ3M7Ci0Jc3RydWN0IHRocmVhZF9pbmZvICp0ID0gdHNrLT50aHJlYWRfaW5mbzsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnQgPSB0YXNrX3RocmVhZF9pbmZvKHRzayk7CiAJdW5zaWduZWQgbG9uZyB2YWx1ZSA9IHJlZ3MtPnVfcmVnc1tVUkVHX0kzXTsKIAogCWlmKG9mZnNldCA+PSAxMDI0KQpAQCAtMjg2LDQwICsyODYsMTcgQEAKIAkJCSAgICAgICBzLCAoaW50KSByZXF1ZXN0LCAoaW50KSBwaWQsIGFkZHIsIGRhdGEsIGFkZHIyKTsKIAl9CiAjZW5kaWYKKwogCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9UUkFDRU1FKSB7Ci0JCWludCBteV9yZXQ7Ci0KLQkJLyogYXJlIHdlIGFscmVhZHkgYmVpbmcgdHJhY2VkPyAqLwotCQlpZiAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkgewotCQkJcHRfZXJyb3JfcmV0dXJuKHJlZ3MsIEVQRVJNKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCW15X3JldCA9IHNlY3VyaXR5X3B0cmFjZShjdXJyZW50LT5wYXJlbnQsIGN1cnJlbnQpOwotCQlpZiAobXlfcmV0KSB7Ci0JCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgLW15X3JldCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCS8qIHNldCB0aGUgcHRyYWNlIGJpdCBpbiB0aGUgcHJvY2VzcyBmbGFncy4gKi8KLQkJY3VycmVudC0+cHRyYWNlIHw9IFBUX1BUUkFDRUQ7CisJCXJldCA9IHB0cmFjZV90cmFjZW1lKCk7CiAJCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOwogCQlnb3RvIG91dDsKIAl9Ci0jaWZuZGVmIEFMTE9XX0lOSVRfVFJBQ0lORwotCWlmIChwaWQgPT0gMSkgewotCQkvKiBDYW4ndCBkb3JrIHdpdGggaW5pdC4gKi8KLQkJcHRfZXJyb3JfcmV0dXJuKHJlZ3MsIEVQRVJNKTsKLQkJZ290byBvdXQ7Ci0JfQotI2VuZGlmCi0JcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQljaGlsZCA9IGZpbmRfdGFza19ieV9waWQocGlkKTsKLQlpZiAoY2hpbGQpCi0JCWdldF90YXNrX3N0cnVjdChjaGlsZCk7Ci0JcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogCi0JaWYgKCFjaGlsZCkgewotCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgRVNSQ0gpOworCWNoaWxkID0gcHRyYWNlX2dldF90YXNrX3N0cnVjdChwaWQpOworCWlmIChJU19FUlIoY2hpbGQpKSB7CisJCXJldCA9IFBUUl9FUlIoY2hpbGQpOworCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgLXJldCk7CiAJCWdvdG8gb3V0OwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcnRyYXAuUyBiL2FyY2gvc3BhcmMva2VybmVsL3J0cmFwLlMKaW5kZXggZjc0NjBkOC4uNzdjYTZmZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcnRyYXAuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9ydHJhcC5TCkBAIC02OCwxNSArNjgsMTQgQEAKIAogCWxkCVslY3VycHRyICsgVElfRkxBR1NdLCAlZzIKIHNpZ25hbF9wOgotCWFuZGNjCSVnMiwgKF9USUZfTk9USUZZX1JFU1VNRXxfVElGX1NJR1BFTkRJTkcpLCAlZzAKKwlhbmRjYwklZzIsIChfVElGX1NJR1BFTkRJTkd8X1RJRl9SRVNUT1JFX1NJR01BU0spLCAlZzAKIAlieixhCXJldF90cmFwX2NvbnRpbnVlCiAJIGxkCVslc3AgKyBTVEFDS0ZSQU1FX1NaICsgUFRfUFNSXSwgJXRfcHNyCiAKLQljbHIJJW8wCi0JbW92CSVsNSwgJW8yCi0JbW92CSVsNiwgJW8zCisJbW92CSVsNSwgJW8xCisJbW92CSVsNiwgJW8yCiAJY2FsbAlkb19zaWduYWwKLQkgYWRkCSVzcCwgU1RBQ0tGUkFNRV9TWiwgJW8xCSEgcHRfcmVncyBwdHIKKwkgYWRkCSVzcCwgU1RBQ0tGUkFNRV9TWiwgJW8wCSEgcHRfcmVncyBwdHIKIAogCS8qIEZhbGwgdGhyb3VnaC4gKi8KIAlsZAlbJXNwICsgU1RBQ0tGUkFNRV9TWiArIFBUX1BTUl0sICV0X3BzcgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zaWduYWwuYwppbmRleCA1ZjM0ZDdkLi4wNzQ4ZDgxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zaWduYWwuYwpAQCAtMzUsOSArMzUsNiBAQAogCQkgICB2b2lkICpmcHF1ZXVlLCB1bnNpZ25lZCBsb25nICpmcHFkZXB0aCk7CiBleHRlcm4gdm9pZCBmcGxvYWQodW5zaWduZWQgbG9uZyAqZnByZWdzLCB1bnNpZ25lZCBsb25nICpmc3IpOwogCi1hc21saW5rYWdlIGludCBkb19zaWduYWwoc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzLAotCQkJIHVuc2lnbmVkIGxvbmcgb3JpZ19vMCwgaW50IHJlc3RhcnRfc3lzY2FsbCk7Ci0KIC8qIFNpZ25hbCBmcmFtZXM6IHRoZSBvcmlnaW5hbCBvbmUgKGNvbXBhdGlibGUgd2l0aCBTdW5PUyk6CiAgKgogICogU2V0IHVwIGEgc2lnbmFsIGZyYW1lLi4uIE1ha2UgdGhlIHN0YWNrIGxvb2sgdGhlIHdheSBTdW5PUwpAQCAtOTUsOTggKzkyLDMwIEBACiAjZGVmaW5lIE5GX0FMSUdORURTWiAgKCgoc2l6ZW9mKHN0cnVjdCBuZXdfc2lnbmFsX2ZyYW1lKSArIDcpICYgKH43KSkpCiAjZGVmaW5lIFJUX0FMSUdORURTWiAgKCgoc2l6ZW9mKHN0cnVjdCBydF9zaWduYWxfZnJhbWUpICsgNykgJiAofjcpKSkKIAotLyoKLSAqIGF0b21pY2FsbHkgc3dhcCBpbiB0aGUgbmV3IHNpZ25hbCBtYXNrLCBhbmQgd2FpdCBmb3IgYSBzaWduYWwuCi0gKiBUaGlzIGlzIHJlYWxseSB0cmlja3kgb24gdGhlIFNwYXJjLCB3YXRjaCBvdXQuLi4KLSAqLwotYXNtbGlua2FnZSB2b2lkIF9zaWdwYXVzZV9jb21tb24ob2xkX3NpZ3NldF90IHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW50IF9zaWdwYXVzZV9jb21tb24ob2xkX3NpZ3NldF90IHNldCkKIHsKLQlzaWdzZXRfdCBzYXZlc2V0OwotCiAJc2V0ICY9IF9CTE9DS0FCTEU7CiAJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0Jc2F2ZXNldCA9IGN1cnJlbnQtPmJsb2NrZWQ7CisJY3VycmVudC0+c2F2ZWRfc2lnbWFzayA9IGN1cnJlbnQtPmJsb2NrZWQ7CiAJc2lnaW5pdHNldCgmY3VycmVudC0+YmxvY2tlZCwgc2V0KTsKIAlyZWNhbGNfc2lncGVuZGluZygpOwogCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAKLQlyZWdzLT5wYyA9IHJlZ3MtPm5wYzsKLQlyZWdzLT5ucGMgKz0gNDsKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwlzY2hlZHVsZSgpOworCXNldF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKIAotCS8qIENvbmRpdGlvbiBjb2RlcyBhbmQgcmV0dXJuIHZhbHVlIHdoZXJlIHNldCBoZXJlIGZvciBzaWdwYXVzZSwKLQkgKiBhbmQgc28gZ290IHVzZWQgYnkgc2V0dXBfZnJhbWUsIHdoaWNoIGFnYWluIGNhdXNlcyBzaWdyZXR1cm4oKQotCSAqIHRvIHJldHVybiAtRUlOVFIuCi0JICovCi0Jd2hpbGUgKDEpIHsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlKCk7Ci0JCS8qCi0JCSAqIFJldHVybiAtRUlOVFIgYW5kIHNldCBjb25kaXRpb24gY29kZSBoZXJlLAotCQkgKiBzbyB0aGUgaW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwgYWN0dWFsbHkgcmV0dXJucwotCQkgKiB0aGVzZS4KLQkJICovCi0JCXJlZ3MtPnBzciB8PSBQU1JfQzsKLQkJcmVncy0+dV9yZWdzW1VSRUdfSTBdID0gRUlOVFI7Ci0JCWlmIChkb19zaWduYWwoJnNhdmVzZXQsIHJlZ3MsIDAsIDApKQotCQkJcmV0dXJuOwotCX0KKwlyZXR1cm4gLUVSRVNUQVJUTk9IQU5EOwogfQogCi1hc21saW5rYWdlIHZvaWQgZG9fc2lncGF1c2UodW5zaWduZWQgaW50IHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCithc21saW5rYWdlIGludCBzeXNfc2lncGF1c2UodW5zaWduZWQgaW50IHNldCkKIHsKLQlfc2lncGF1c2VfY29tbW9uKHNldCwgcmVncyk7CisJcmV0dXJuIF9zaWdwYXVzZV9jb21tb24oc2V0KTsKIH0KIAotYXNtbGlua2FnZSB2b2lkIGRvX3NpZ3N1c3BlbmQgKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorYXNtbGlua2FnZSBpbnQgc3lzX3NpZ3N1c3BlbmQob2xkX3NpZ3NldF90IHNldCkKIHsKLQlfc2lncGF1c2VfY29tbW9uKHJlZ3MtPnVfcmVnc1tVUkVHX0kwXSwgcmVncyk7Ci19Ci0KLWFzbWxpbmthZ2Ugdm9pZCBkb19ydF9zaWdzdXNwZW5kKHNpZ3NldF90IF9fdXNlciAqdXNldCwgc2l6ZV90IHNpZ3NldHNpemUsCi0JCQkJIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXNpZ3NldF90IG9sZHNldCwgc2V0OwotCi0JLyogWFhYOiBEb24ndCBwcmVjbHVkZSBoYW5kbGluZyBkaWZmZXJlbnQgc2l6ZWQgc2lnc2V0X3Qncy4gICovCi0JaWYgKHNpZ3NldHNpemUgIT0gc2l6ZW9mKHNpZ3NldF90KSkgewotCQlyZWdzLT5wc3IgfD0gUFNSX0M7Ci0JCXJlZ3MtPnVfcmVnc1tVUkVHX0kwXSA9IEVJTlZBTDsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcigmc2V0LCB1c2V0LCBzaXplb2Yoc2V0KSkpIHsKLQkJcmVncy0+cHNyIHw9IFBTUl9DOwotCQlyZWdzLT51X3JlZ3NbVVJFR19JMF0gPSBFRkFVTFQ7Ci0JCXJldHVybjsKLQl9Ci0KLQlzaWdkZWxzZXRtYXNrKCZzZXQsIH5fQkxPQ0tBQkxFKTsKLQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQlvbGRzZXQgPSBjdXJyZW50LT5ibG9ja2VkOwotCWN1cnJlbnQtPmJsb2NrZWQgPSBzZXQ7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCi0JcmVncy0+cGMgPSByZWdzLT5ucGM7Ci0JcmVncy0+bnBjICs9IDQ7Ci0KLQkvKiBDb25kaXRpb24gY29kZXMgYW5kIHJldHVybiB2YWx1ZSB3aGVyZSBzZXQgaGVyZSBmb3Igc2lncGF1c2UsCi0JICogYW5kIHNvIGdvdCB1c2VkIGJ5IHNldHVwX2ZyYW1lLCB3aGljaCBhZ2FpbiBjYXVzZXMgc2lncmV0dXJuKCkKLQkgKiB0byByZXR1cm4gLUVJTlRSLgotCSAqLwotCXdoaWxlICgxKSB7Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQlzY2hlZHVsZSgpOwotCQkvKgotCQkgKiBSZXR1cm4gLUVJTlRSIGFuZCBzZXQgY29uZGl0aW9uIGNvZGUgaGVyZSwKLQkJICogc28gdGhlIGludGVycnVwdGVkIHN5c3RlbSBjYWxsIGFjdHVhbGx5IHJldHVybnMKLQkJICogdGhlc2UuCi0JCSAqLwotCQlyZWdzLT5wc3IgfD0gUFNSX0M7Ci0JCXJlZ3MtPnVfcmVnc1tVUkVHX0kwXSA9IEVJTlRSOwotCQlpZiAoZG9fc2lnbmFsKCZvbGRzZXQsIHJlZ3MsIDAsIDApKQotCQkJcmV0dXJuOwotCX0KKwlyZXR1cm4gX3NpZ3BhdXNlX2NvbW1vbihzZXQpOwogfQogCiBzdGF0aWMgaW5saW5lIGludApAQCAtMTA2NywxMyArOTk2LDEzIEBACiAgKiB3YW50IHRvIGhhbmRsZS4gVGh1cyB5b3UgY2Fubm90IGtpbGwgaW5pdCBldmVuIHdpdGggYSBTSUdLSUxMIGV2ZW4gYnkKICAqIG1pc3Rha2UuCiAgKi8KLWFzbWxpbmthZ2UgaW50IGRvX3NpZ25hbChzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsCi0JCQkgdW5zaWduZWQgbG9uZyBvcmlnX2kwLCBpbnQgcmVzdGFydF9zeXNjYWxsKQorYXNtbGlua2FnZSB2b2lkIGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIHVuc2lnbmVkIGxvbmcgb3JpZ19pMCwgaW50IHJlc3RhcnRfc3lzY2FsbCkKIHsKIAlzaWdpbmZvX3QgaW5mbzsKIAlzdHJ1Y3Qgc3BhcmNfZGVsaXZlcl9jb29raWUgY29va2llOwogCXN0cnVjdCBrX3NpZ2FjdGlvbiBrYTsKIAlpbnQgc2lnbnI7CisJc2lnc2V0X3QgKm9sZHNldDsKIAogCS8qCiAJICogWFhYIERpc2FibGUgc3ZyNCBzaWduYWwgaGFuZGxpbmcgdW50aWwgc29sYXJpcyBlbXVsYXRpb24gd29ya3MuCkBAIC0xMDg5LDcgKzEwMTgsOSBAQAogCWNvb2tpZS5yZXN0YXJ0X3N5c2NhbGwgPSByZXN0YXJ0X3N5c2NhbGw7CiAJY29va2llLm9yaWdfaTAgPSBvcmlnX2kwOwogCi0JaWYgKCFvbGRzZXQpCisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCisJCW9sZHNldCA9ICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrOworCWVsc2UKIAkJb2xkc2V0ID0gJmN1cnJlbnQtPmJsb2NrZWQ7CiAKIAlzaWduciA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJmthLCByZWdzLCAmY29va2llKTsKQEAgLTEwOTgsNyArMTAyOSwxNCBAQAogCQkJc3lzY2FsbF9yZXN0YXJ0KGNvb2tpZS5vcmlnX2kwLCByZWdzLCAma2Euc2EpOwogCQloYW5kbGVfc2lnbmFsKHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsCiAJCQkgICAgICByZWdzLCBzdnI0X3NpZ25hbCk7Ci0JCXJldHVybiAxOworCQkvKiBhIHNpZ25hbCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZDsgdGhlIHNhdmVkCisJCSAqIHNpZ21hc2sgd2lsbCBoYXZlIGJlZW4gc3RvcmVkIGluIHRoZSBzaWduYWwgZnJhbWUsCisJCSAqIGFuZCB3aWxsIGJlIHJlc3RvcmVkIGJ5IHNpZ3JldHVybiwgc28gd2UgY2FuIHNpbXBseQorCQkgKiBjbGVhciB0aGUgVElGX1JFU1RPUkVfU0lHTUFTSyBmbGFnLgorCQkgKi8KKwkJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCisJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwkJcmV0dXJuOwogCX0KIAlpZiAoY29va2llLnJlc3RhcnRfc3lzY2FsbCAmJgogCSAgICAocmVncy0+dV9yZWdzW1VSRUdfSTBdID09IEVSRVNUQVJUTk9IQU5EIHx8CkBAIC0xMTE1LDcgKzEwNTMsMTQgQEAKIAkJcmVncy0+cGMgLT0gNDsKIAkJcmVncy0+bnBjIC09IDQ7CiAJfQotCXJldHVybiAwOworCisJLyogaWYgdGhlcmUncyBubyBzaWduYWwgdG8gZGVsaXZlciwgd2UganVzdCBwdXQgdGhlIHNhdmVkIHNpZ21hc2sKKwkgKiBiYWNrCisJICovCisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpIHsKKwkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmY3VycmVudC0+c2F2ZWRfc2lnbWFzaywgTlVMTCk7CisJfQogfQogCiBhc21saW5rYWdlIGludApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3BhcmNfa3N5bXMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NwYXJjX2tzeW1zLmMKaW5kZXggMWM4ZmQwZi4uMTliMjUzOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3BhcmNfa3N5bXMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zcGFyY19rc3ltcy5jCkBAIC02Niw3ICs2Niw2IEBACiAKIGV4dGVybiBpbnQgc3ZyNF9nZXRjb250ZXh0IChzdnI0X3Vjb250ZXh0X3QgKiwgc3RydWN0IHB0X3JlZ3MgKik7CiBleHRlcm4gaW50IHN2cjRfc2V0Y29udGV4dCAoc3ZyNF91Y29udGV4dF90ICosIHN0cnVjdCBwdF9yZWdzICopOwotdm9pZCBfc2lncGF1c2VfY29tbW9uICh1bnNpZ25lZCBpbnQgc2V0LCBzdHJ1Y3QgcHRfcmVncyAqKTsKIGV4dGVybiB2b2lkICgqX19jb3B5XzFwYWdlKSh2b2lkICosIGNvbnN0IHZvaWQgKik7CiBleHRlcm4gdm9pZCBfX21lbW1vdmUodm9pZCAqLCBjb25zdCB2b2lkICosIF9fa2VybmVsX3NpemVfdCk7CiBleHRlcm4gdm9pZCAoKmJ6ZXJvXzFwYWdlKSh2b2lkICopOwpAQCAtODIsOCArODEsNiBAQAogZXh0ZXJuIGludCBfX211bGRpMyhpbnQsIGludCk7CiBleHRlcm4gaW50IF9fZGl2ZGkzKGludCwgaW50KTsKIAotZXh0ZXJuIHZvaWQgZHVtcF90aHJlYWQoc3RydWN0IHB0X3JlZ3MgKiwgc3RydWN0IHVzZXIgKik7Ci0KIC8qIFByaXZhdGUgZnVuY3Rpb25zIHdpdGggb2RkIGNhbGxpbmcgY29udmVudGlvbnMuICovCiBleHRlcm4gdm9pZCBfX19hdG9taWMyNF9hZGQodm9pZCk7CiBleHRlcm4gdm9pZCBfX19hdG9taWMyNF9zdWIodm9pZCk7CkBAIC0yMjksNyArMjI2LDYgQEAKIC8qIFNvbGFyaXMvU3VuT1MgYmluYXJ5IGNvbXBhdGliaWxpdHkgKi8KIEVYUE9SVF9TWU1CT0woc3ZyNF9zZXRjb250ZXh0KTsKIEVYUE9SVF9TWU1CT0woc3ZyNF9nZXRjb250ZXh0KTsKLUVYUE9SVF9TWU1CT0woX3NpZ3BhdXNlX2NvbW1vbik7CiAKIEVYUE9SVF9TWU1CT0woZHVtcF90aHJlYWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zdW40ZF9zbXAuYyBiL2FyY2gvc3BhcmMva2VybmVsL3N1bjRkX3NtcC5jCmluZGV4IGNjMWZjODkuLjQwZDQyNmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N1bjRkX3NtcC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N1bjRkX3NtcC5jCkBAIC0yMDAsNyArMjAwLDcgQEAKIAkJCS8qIENvb2sgdXAgYW4gaWRsZXIgZm9yIHRoaXMgZ3V5LiAqLwogCQkJcCA9IGZvcmtfaWRsZShpKTsKIAkJCWNwdWNvdW50Kys7Ci0JCQljdXJyZW50X3NldFtpXSA9IHAtPnRocmVhZF9pbmZvOworCQkJY3VycmVudF9zZXRbaV0gPSB0YXNrX3RocmVhZF9pbmZvKHApOwogCQkJZm9yIChubyA9IDA7ICFjcHVfZmluZF9ieV9pbnN0YW5jZShubywgTlVMTCwgJm1pZCkKIAkJCQkgICAgICYmIG1pZCAhPSBpOyBubysrKSA7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3N1bjRtX3NtcC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNG1fc21wLmMKaW5kZXggZjExMzQyMi4uYTIxZjI3ZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNG1fc21wLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNG1fc21wLmMKQEAgLTE3Myw3ICsxNzMsNyBAQAogCQkJLyogQ29vayB1cCBhbiBpZGxlciBmb3IgdGhpcyBndXkuICovCiAJCQlwID0gZm9ya19pZGxlKGkpOwogCQkJY3B1Y291bnQrKzsKLQkJCWN1cnJlbnRfc2V0W2ldID0gcC0+dGhyZWFkX2luZm87CisJCQljdXJyZW50X3NldFtpXSA9IHRhc2tfdGhyZWFkX2luZm8ocCk7CiAJCQkvKiBTZWUgdHJhbXBvbGluZS5TIGZvciBkZXRhaWxzLi4uICovCiAJCQllbnRyeSArPSAoKGktMSkgKiAzKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3N1bm9zLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3Vub3MuYwppbmRleCBkMDdhZTAyLi4yODhkZTI3IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3Vub3MuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3Vub3MuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzLlMKaW5kZXggZTQ1N2E0MC4uNjg3N2FlNCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJscy5TCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHMuUwpAQCAtNzUsNyArNzUsMTAgQEAKIC8qMjY1Ki8JLmxvbmcgc3lzX3RpbWVyX2RlbGV0ZSwgc3lzX3RpbWVyX2NyZWF0ZSwgc3lzX25pc19zeXNjYWxsLCBzeXNfaW9fc2V0dXAsIHN5c19pb19kZXN0cm95CiAvKjI3MCovCS5sb25nIHN5c19pb19zdWJtaXQsIHN5c19pb19jYW5jZWwsIHN5c19pb19nZXRldmVudHMsIHN5c19tcV9vcGVuLCBzeXNfbXFfdW5saW5rCiAvKjI3NSovCS5sb25nIHN5c19tcV90aW1lZHNlbmQsIHN5c19tcV90aW1lZHJlY2VpdmUsIHN5c19tcV9ub3RpZnksIHN5c19tcV9nZXRzZXRhdHRyLCBzeXNfd2FpdGlkCi0vKjI4MCovCS5sb25nIHN5c19uaV9zeXNjYWxsLCBzeXNfYWRkX2tleSwgc3lzX3JlcXVlc3Rfa2V5LCBzeXNfa2V5Y3RsCisvKjI4MCovCS5sb25nIHN5c19uaV9zeXNjYWxsLCBzeXNfYWRkX2tleSwgc3lzX3JlcXVlc3Rfa2V5LCBzeXNfa2V5Y3RsLCBzeXNfb3BlbmF0CisvKjI4NSovCS5sb25nIHN5c19ta2RpcmF0LCBzeXNfbWtub2RhdCwgc3lzX2ZjaG93bmF0LCBzeXNfZnV0aW1lc2F0LCBzeXNfbmV3ZnN0YXRhdAorLyoyOTAqLwkubG9uZyBzeXNfdW5saW5rYXQsIHN5c19yZW5hbWVhdCwgc3lzX2xpbmthdCwgc3lzX3N5bWxpbmthdCwgc3lzX3JlYWRsaW5rYXQKKy8qMjk1Ki8JLmxvbmcgc3lzX2ZjaG1vZGF0LCBzeXNfZmFjY2Vzc2F0LCBzeXNfcHNlbGVjdDYsIHN5c19wcG9sbAogCiAjaWZkZWYgQ09ORklHX1NVTk9TX0VNVUwKIAkvKiBOb3cgdGhlIFN1bk9TIHN5c2NhbGwgdGFibGUuICovCkBAIC0xODEsNiArMTg0LDExIEBACiAJLmxvbmcgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cwogCS5sb25nIHN1bm9zX25vc3lzCiAvKjI4MCovCS5sb25nIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMKKwkubG9uZyBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzCisJLmxvbmcgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cwogCS5sb25nIHN1bm9zX25vc3lzCisvKjI5MCovCS5sb25nIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMKKwkubG9uZyBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzCisJLmxvbmcgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC90cmFwcy5jCmluZGV4IDNmNDUxYWUuLjQxZDQ1YzIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHMuYwpAQCAtMjkxLDcgKzI5MSw3IEBACiAjaWZuZGVmIENPTkZJR19TTVAKIAlpZighZnB0KSB7CiAjZWxzZQotICAgICAgICBpZighKGZwdC0+dGhyZWFkX2luZm8tPmZsYWdzICYgX1RJRl9VU0VERlBVKSkgeworICAgICAgICBpZighKHRhc2tfdGhyZWFkX2luZm8oZnB0KS0+ZmxhZ3MgJiBfVElGX1VTRURGUFUpKSB7CiAjZW5kaWYKIAkJZnBzYXZlKCZmYWtlX3JlZ3NbMF0sICZmYWtlX2ZzciwgJmZha2VfcXVldWVbMF0sICZmYWtlX2RlcHRoKTsKIAkJcmVncy0+cHNyICY9IH5QU1JfRUY7CkBAIC0zMzQsNyArMzM0LDcgQEAKIAkvKiBub3BlLCBiZXR0ZXIgU0lHRlBFIHRoZSBvZmZlbmRpbmcgcHJvY2Vzcy4uLiAqLwogCSAgICAgICAKICNpZmRlZiBDT05GSUdfU01QCi0JZnB0LT50aHJlYWRfaW5mby0+ZmxhZ3MgJj0gfl9USUZfVVNFREZQVTsKKwl0YXNrX3RocmVhZF9pbmZvKGZwdCktPmZsYWdzICY9IH5fVElGX1VTRURGUFU7CiAjZW5kaWYKIAlpZihwc3IgJiBQU1JfUFMpIHsKIAkJLyogVGhlIGZpcnN0IGZzciBzdG9yZS9sb2FkIHdlIHRyaWVkIHRyYXBwZWQsCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2lvbW11LmMgYi9hcmNoL3NwYXJjL21tL2lvbW11LmMKaW5kZXggNDg5YmY2OC4uNzc4NDBjOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9pb21tdS5jCisrKyBiL2FyY2gvc3BhcmMvbW0vaW9tbXUuYwpAQCAtMjk1LDggKzI5NSw3IEBACiAJaW50IGlvcHRleDsKIAlpbnQgaTsKIAotCWlmIChidXNhIDwgaW9tbXUtPnN0YXJ0KQotCQlCVUcoKTsKKwlCVUdfT04oYnVzYSA8IGlvbW11LT5zdGFydCk7CiAJaW9wdGV4ID0gKGJ1c2EgLSBpb21tdS0+c3RhcnQpID4+IFBBR0VfU0hJRlQ7CiAJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKSB7CiAJCWlvcHRlX3ZhbChpb21tdS0+cGFnZV90YWJsZVtpb3B0ZXggKyBpXSkgPSAwOwpAQCAtMzQwLDkgKzMzOSw5IEBACiAJaW9wdGVfdCAqZmlyc3Q7CiAJaW50IGlvcHRleDsKIAotCWlmICgodmEgJiB+UEFHRV9NQVNLKSAhPSAwKSBCVUcoKTsKLQlpZiAoKGFkZHIgJiB+UEFHRV9NQVNLKSAhPSAwKSBCVUcoKTsKLQlpZiAoKGxlbiAmIH5QQUdFX01BU0spICE9IDApIEJVRygpOworCUJVR19PTigodmEgJiB+UEFHRV9NQVNLKSAhPSAwKTsKKwlCVUdfT04oKGFkZHIgJiB+UEFHRV9NQVNLKSAhPSAwKTsKKwlCVUdfT04oKGxlbiAmIH5QQUdFX01BU0spICE9IDApOwogCiAJLyogcGFnZSBjb2xvciA9IHBoeXNpY2FsIGFkZHJlc3MgKi8KIAlpb3B0ZXggPSBiaXRfbWFwX3N0cmluZ19nZXQoJmlvbW11LT51c2VtYXAsIGxlbiA+PiBQQUdFX1NISUZULApAQCAtNDA1LDggKzQwNCw4IEBACiAJdW5zaWduZWQgbG9uZyBlbmQ7CiAJaW50IGlvcHRleCA9IChidXNhIC0gaW9tbXUtPnN0YXJ0KSA+PiBQQUdFX1NISUZUOwogCi0JaWYgKChidXNhICYgflBBR0VfTUFTSykgIT0gMCkgQlVHKCk7Ci0JaWYgKChsZW4gJiB+UEFHRV9NQVNLKSAhPSAwKSBCVUcoKTsKKwlCVUdfT04oKGJ1c2EgJiB+UEFHRV9NQVNLKSAhPSAwKTsKKwlCVUdfT04oKGxlbiAmIH5QQUdFX01BU0spICE9IDApOwogCiAJaW9wdGUgKz0gaW9wdGV4OwogCWVuZCA9IGJ1c2EgKyBsZW47CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvS2NvbmZpZyBiL2FyY2gvc3BhcmM2NC9LY29uZmlnCmluZGV4IGM0YjdhZDcuLmFiNzMzYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmM2NC9LY29uZmlnCkBAIC0xNzksNyArMTc5LDcgQEAKIAlib29sICI1MTJLIgogCiBjb25maWcgSFVHRVRMQl9QQUdFX1NJWkVfNjRLCi0JZGVwZW5kcyBvbiAhU1BBUkM2NF9QQUdFX1NJWkVfNE1CICYmICFTUEFSQzY0X1BBR0VfU0laRV81MTJLCisJZGVwZW5kcyBvbiAhU1BBUkM2NF9QQUdFX1NJWkVfNE1CICYmICFTUEFSQzY0X1BBR0VfU0laRV81MTJLQgogCWJvb2wgIjY0SyIKIAogZW5kY2hvaWNlCkBAIC0zMDksMTEgKzMwOSw2IEBACiAJZGVwZW5kcyBvbiBTUEFSQzMyX0NPTVBBVAogCWRlZmF1bHQgeQogCi1jb25maWcgVUlEMTYKLQlib29sCi0JZGVwZW5kcyBvbiBTUEFSQzMyX0NPTVBBVAotCWRlZmF1bHQgeQotCiBjb25maWcgQklORk1UX0VMRjMyCiAJdHJpc3RhdGUgIktlcm5lbCBzdXBwb3J0IGZvciAzMi1iaXQgRUxGIGJpbmFyaWVzIgogCWRlcGVuZHMgb24gU1BBUkMzMl9DT01QQVQKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9kZWZjb25maWcgYi9hcmNoL3NwYXJjNjQvZGVmY29uZmlnCmluZGV4IDQ2YTZhZDYuLjljZWRkYWQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9kZWZjb25maWcKKysrIGIvYXJjaC9zcGFyYzY0L2RlZmNvbmZpZwpAQCAtMSw0NiArMSw2NyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjExCi0jIFN1biBNYXIgIDYgMjA6NDc6MjkgMjAwNQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE2LXJjMQorIyBXZWQgSmFuIDE4IDEzOjQxOjAyIDIwMDYKICMKK0NPTkZJR19TUEFSQz15CitDT05GSUdfU1BBUkM2ND15CiBDT05GSUdfNjRCSVQ9eQogQ09ORklHX01NVT15CiBDT05GSUdfVElNRV9JTlRFUlBPTEFUSU9OPXkKK0NPTkZJR19BUkNIX01BWV9IQVZFX1BDX0ZEQz15CitDT05GSUdfU1BBUkM2NF9QQUdFX1NJWkVfOEtCPXkKKyMgQ09ORklHX1NQQVJDNjRfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUkM2NF9QQUdFX1NJWkVfNTEyS0IgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUkM2NF9QQUdFX1NJWkVfNE1CIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNDT01QPXkKKyMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CitDT05GSUdfSFpfMjUwPXkKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAogCiAjCiAjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwogIwogQ09ORklHX0VYUEVSSU1FTlRBTD15CiBDT05GSUdfQ0xFQU5fQ09NUElMRT15Ci1DT05GSUdfTE9DS19LRVJORUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogCiAjCiAjIEdlbmVyYWwgc2V0dXAKICMKIENPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CiBDT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfUE9TSVhfTVFVRVVFPXkKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAogQ09ORklHX1NZU0NUTD15CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNQotQ09ORklHX0hPVFBMVUc9eQotQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCitDT05GSUdfVUlEMTY9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKICMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19FUE9MTD15Ci0jIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CiBDT05GSUdfU0hNRU09eQogQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCiBDT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKIENPTkZJR19DQ19BTElHTl9MT09QUz0wCiBDT05GSUdfQ0NfQUxJR05fSlVNUFM9MAorQ09ORklHX1NMQUI9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKIAogIwogIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydApAQCAtNTIsMjAgKzczLDMyIEBACiBDT05GSUdfTU9EVkVSU0lPTlM9eQogQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTD15CiBDT05GSUdfS01PRD15Ci1DT05GSUdfU1RPUF9NQUNISU5FPXkKKworIworIyBCbG9jayBsYXllcgorIworCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKK0NPTkZJR19ERUZBVUxUX0FTPXkKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKIENPTkZJR19TWVNWSVBDX0NPTVBBVD15CiAKICMKICMgR2VuZXJhbCBtYWNoaW5lIHNldHVwCiAjCi1DT05GSUdfQkJDX0kyQz1tCi1DT05GSUdfVlQ9eQotQ09ORklHX1ZUX0NPTlNPTEU9eQotQ09ORklHX0hXX0NPTlNPTEU9eQotQ09ORklHX1NNUD15CisjIENPTkZJR19TTVAgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0Ci1DT05GSUdfTlJfQ1BVUz00CiBDT05GSUdfQ1BVX0ZSRVE9eQorQ09ORklHX0NQVV9GUkVRX1RBQkxFPW0KICMgQ09ORklHX0NQVV9GUkVRX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfRlJFUV9TVEFUPW0KIENPTkZJR19DUFVfRlJFUV9TVEFUX0RFVEFJTFM9eQpAQCAtNzUsMTUgKzEwOCwyMiBAQAogQ09ORklHX0NQVV9GUkVRX0dPVl9QT1dFUlNBVkU9bQogQ09ORklHX0NQVV9GUkVRX0dPVl9VU0VSU1BBQ0U9bQogQ09ORklHX0NQVV9GUkVRX0dPVl9PTkRFTUFORD1tCi1DT05GSUdfQ1BVX0ZSRVFfVEFCTEU9eQorQ09ORklHX0NQVV9GUkVRX0dPVl9DT05TRVJWQVRJVkU9bQogQ09ORklHX1VTM19GUkVRPW0KIENPTkZJR19VUzJFX0ZSRVE9bQotQ09ORklHX1NQQVJDNjQ9eQogQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CiBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNE1CPXkKICMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzUxMksgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNjRLIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKKyMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKIENPTkZJR19HRU5FUklDX0lTQV9ETUE9eQogQ09ORklHX1NCVVM9eQogQ09ORklHX1NCVVNDSEFSPXkKQEAgLTkxLDEzMCArMTMxLDE0NyBAQAogQ09ORklHX1NVTl9JTz15CiBDT05GSUdfUENJPXkKIENPTkZJR19QQ0lfRE9NQUlOUz15Ci1DT05GSUdfUlRDPXkKICMgQ09ORklHX1BDSV9MRUdBQ1lfUFJPQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0lfTkFNRVMgaXMgbm90IHNldAorIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19TVU5fT1BFTlBST01GUz1tCiBDT05GSUdfU1BBUkMzMl9DT01QQVQ9eQogQ09ORklHX0NPTVBBVD15Ci1DT05GSUdfVUlEMTY9eQogQ09ORklHX0JJTkZNVF9FTEYzMj15CiAjIENPTkZJR19CSU5GTVRfQU9VVDMyIGlzIG5vdCBzZXQKLUNPTkZJR19CSU5GTVRfRUxGPXkKLUNPTkZJR19CSU5GTVRfTUlTQz1tCi1DT05GSUdfU09MQVJJU19FTVVMPW0KIAogIwotIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKICMKLUNPTkZJR19QQVJQT1JUPW0KLUNPTkZJR19QQVJQT1JUX1BDPW0KLUNPTkZJR19QQVJQT1JUX1BDX0ZJRk89eQotIyBDT05GSUdfUEFSUE9SVF9QQ19TVVBFUklPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBUlBPUlRfU1VOQlBQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBUlBPUlRfT1RIRVIgaXMgbm90IHNldAotQ09ORklHX1BBUlBPUlRfMTI4ND15Ci1DT05GSUdfUFJJTlRFUj1tCi1DT05GSUdfRU5WQ1RSTD1tCi1DT05GSUdfRElTUExBWTdTRUc9bQorQ09ORklHX0JJTkZNVF9FTEY9eQorQ09ORklHX0JJTkZNVF9NSVNDPW0KKyMgQ09ORklHX1NPTEFSSVNfRU1VTCBpcyBub3Qgc2V0CiAjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAogCiAjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CitDT05GSUdfUEFDS0VUX01NQVA9eQorQ09ORklHX1VOSVg9eQorQ09ORklHX1hGUk09eQorQ09ORklHX1hGUk1fVVNFUj1tCitDT05GSUdfTkVUX0tFWT1tCitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorIyBDT05GSUdfSVBfUE5QIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfSVBJUD1tCitDT05GSUdfTkVUX0lQR1JFPW0KK0NPTkZJR19ORVRfSVBHUkVfQlJPQURDQVNUPXkKK0NPTkZJR19JUF9NUk9VVEU9eQorQ09ORklHX0lQX1BJTVNNX1YxPXkKK0NPTkZJR19JUF9QSU1TTV9WMj15CitDT05GSUdfQVJQRD15CitDT05GSUdfU1lOX0NPT0tJRVM9eQorQ09ORklHX0lORVRfQUg9eQorQ09ORklHX0lORVRfRVNQPXkKK0NPTkZJR19JTkVUX0lQQ09NUD15CitDT05GSUdfSU5FVF9UVU5ORUw9eQorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CitDT05GSUdfVENQX0NPTkdfQURWQU5DRUQ9eQorCisjCisjIFRDUCBjb25nZXN0aW9uIGNvbnRyb2wKKyMKK0NPTkZJR19UQ1BfQ09OR19CSUM9eQorQ09ORklHX1RDUF9DT05HX0NVQklDPW0KK0NPTkZJR19UQ1BfQ09OR19XRVNUV09PRD1tCitDT05GSUdfVENQX0NPTkdfSFRDUD1tCitDT05GSUdfVENQX0NPTkdfSFNUQ1A9bQorQ09ORklHX1RDUF9DT05HX0hZQkxBPW0KK0NPTkZJR19UQ1BfQ09OR19WRUdBUz1tCitDT05GSUdfVENQX0NPTkdfU0NBTEFCTEU9bQorQ09ORklHX0lQVjY9bQorQ09ORklHX0lQVjZfUFJJVkFDWT15CitDT05GSUdfSU5FVDZfQUg9bQorQ09ORklHX0lORVQ2X0VTUD1tCitDT05GSUdfSU5FVDZfSVBDT01QPW0KK0NPTkZJR19JTkVUNl9UVU5ORUw9bQorQ09ORklHX0lQVjZfVFVOTkVMPW0KKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCitDT05GSUdfSVBfRENDUD1tCitDT05GSUdfSU5FVF9EQ0NQX0RJQUc9bQorCisjCisjIERDQ1AgQ0NJRHMgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworQ09ORklHX0lQX0RDQ1BfQ0NJRDM9bQorQ09ORklHX0lQX0RDQ1BfVEZSQ19MSUI9bQorCisjCisjIERDQ1AgS2VybmVsIEhhY2tpbmcKKyMKKyMgQ09ORklHX0lQX0RDQ1BfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBfRENDUF9VTkxPQURfSEFDSyBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorQ09ORklHX1ZMQU5fODAyMVE9bQorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKworIworIyBUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworQ09ORklHX05FVF9QS1RHRU49bQorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKICMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwogIwogQ09ORklHX1NUQU5EQUxPTkU9eQogIyBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRCBpcyBub3Qgc2V0Ci1DT05GSUdfRldfTE9BREVSPW0KK0NPTkZJR19GV19MT0FERVI9eQogIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKIAogIwotIyBHcmFwaGljcyBzdXBwb3J0CisjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKICMKLUNPTkZJR19GQj15Ci1DT05GSUdfRkJfTU9ERV9IRUxQRVJTPXkKLUNPTkZJR19GQl9USUxFQkxJVFRJTkc9eQotIyBDT05GSUdfRkJfQ0lSUlVTIGlzIG5vdCBzZXQKLUNPTkZJR19GQl9QTTI9eQotIyBDT05GSUdfRkJfUE0yX0ZJRk9fRElTQ09OTkVDVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9BU0lMSUFOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9JTVNUVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9CVzIgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQ0czIGlzIG5vdCBzZXQKLUNPTkZJR19GQl9DRzY9eQotIyBDT05GSUdfRkJfUklWQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9NQVRST1ggaXMgbm90IHNldAotIyBDT05GSUdfRkJfUkFERU9OX09MRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9SQURFT04gaXMgbm90IHNldAotIyBDT05GSUdfRkJfQVRZMTI4IGlzIG5vdCBzZXQKLUNPTkZJR19GQl9BVFk9eQotQ09ORklHX0ZCX0FUWV9DVD15Ci0jIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQVRZX1hMX0lOSVQgaXMgbm90IHNldAotQ09ORklHX0ZCX0FUWV9HWD15Ci0jIENPTkZJR19GQl9TQVZBR0UgaXMgbm90IHNldAotIyBDT05GSUdfRkJfU0lTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX05FT01BR0lDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0tZUk8gaXMgbm90IHNldAotIyBDT05GSUdfRkJfM0RGWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9WT09ET08xIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1RSSURFTlQgaXMgbm90IHNldAotQ09ORklHX0ZCX1NCVVM9eQotQ09ORklHX0ZCX0ZGQj15Ci0jIENPTkZJR19GQl9UQ1ggaXMgbm90IHNldAotIyBDT05GSUdfRkJfQ0cxNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9QOTEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9MRU8gaXMgbm90IHNldAotIyBDT05GSUdfRkJfUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAotCi0jCi0jIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAotIwotIyBDT05GSUdfUFJPTV9DT05TT0xFIGlzIG5vdCBzZXQKLUNPTkZJR19EVU1NWV9DT05TT0xFPXkKLUNPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKLUNPTkZJR19GT05UUz15Ci0jIENPTkZJR19GT05UXzh4OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT05UXzh4MTYgaXMgbm90IHNldAotIyBDT05GSUdfRk9OVF82eDExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPTlRfUEVBUkxfOHg4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPTlRfQUNPUk5fOHg4IGlzIG5vdCBzZXQKLUNPTkZJR19GT05UX1NVTjh4MTY9eQotIyBDT05GSUdfRk9OVF9TVU4xMngyMiBpcyBub3Qgc2V0Ci0KLSMKLSMgTG9nbyBjb25maWd1cmF0aW9uCi0jCi1DT05GSUdfTE9HTz15Ci0jIENPTkZJR19MT0dPX0xJTlVYX01PTk8gaXMgbm90IHNldAotIyBDT05GSUdfTE9HT19MSU5VWF9WR0ExNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQgaXMgbm90IHNldAotQ09ORklHX0xPR09fU1VOX0NMVVQyMjQ9eQotIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBTZXJpYWwgZHJpdmVycwotIwotCi0jCi0jIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKLSMKLUNPTkZJR19TRVJJQUxfU1VOQ09SRT15Ci1DT05GSUdfU0VSSUFMX1NVTlpJTE9HPXkKLUNPTkZJR19TRVJJQUxfU1VOWklMT0dfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMX1NVTlNVPXkKLUNPTkZJR19TRVJJQUxfU1VOU1VfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMX1NVTlNBQj1tCi1DT05GSUdfU0VSSUFMX0NPUkU9eQotQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQotCi0jCi0jIE1pc2MgTGludXgvU1BBUkMgZHJpdmVycwotIwotQ09ORklHX1NVTl9PUEVOUFJPTUlPPW0KLUNPTkZJR19TVU5fTU9TVEVLX1JUQz15Ci1DT05GSUdfT0JQX0ZMQVNIPW0KLSMgQ09ORklHX1NVTl9CUFAgaXMgbm90IHNldAorQ09ORklHX0NPTk5FQ1RPUj1tCiAKICMKICMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQpAQCAtMjIyLDEwICsyNzksMTggQEAKICMgQ09ORklHX01URCBpcyBub3Qgc2V0CiAKICMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIwogIyBCbG9jayBkZXZpY2VzCiAjCiAjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBUklERSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CkBAIC0yMzQsMjIgKzI5OSwxMyBAQAogQ09ORklHX0JMS19ERVZfTE9PUD1tCiBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QPW0KIENPTkZJR19CTEtfREVWX05CRD1tCi1DT05GSUdfQkxLX0RFVl9TWDg9bQorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfVUI9bQogIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2Ci1DT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgogQ09ORklHX0NEUk9NX1BLVENEVkQ9bQogQ09ORklHX0NEUk9NX1BLVENEVkRfQlVGRkVSUz04CiBDT05GSUdfQ0RST01fUEtUQ0RWRF9XQ0FDSEU9eQotCi0jCi0jIElPIFNjaGVkdWxlcnMKLSMKLUNPTkZJR19JT1NDSEVEX05PT1A9eQotQ09ORklHX0lPU0NIRURfQVM9eQotQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQotQ09ORklHX0lPU0NIRURfQ0ZRPXkKIENPTkZJR19BVEFfT1ZFUl9FVEg9bQogCiAjCkBAIC0yNjUsNyArMzIxLDcgQEAKIENPTkZJR19CTEtfREVWX0lERURJU0s9eQogIyBDT05GSUdfSURFRElTS19NVUxUSV9NT0RFIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0lERUNEPXkKLUNPTkZJR19CTEtfREVWX0lERVRBUEU9bQorIyBDT05GSUdfQkxLX0RFVl9JREVUQVBFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSURFRkxPUFBZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSURFU0NTSSBpcyBub3Qgc2V0CiAjIENPTkZJR19JREVfVEFTS19JT0NUTCBpcyBub3Qgc2V0CkBAIC0yNzgsNyArMzM0LDcgQEAKICMgQ09ORklHX0lERVBDSV9TSEFSRV9JUlEgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9PRkZCT0FSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0dFTkVSSUMgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfT1BUSTYyMT1tCisjIENPTkZJR19CTEtfREVWX09QVEk2MjEgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfSURFRE1BX1BDST15CiAjIENPTkZJR19CTEtfREVWX0lERURNQV9GT1JDRUQgaXMgbm90IHNldAogQ09ORklHX0lERURNQV9QQ0lfQVVUTz15CkBAIC0yODYsMjcgKzM0MiwyNSBAQAogIyBDT05GSUdfQkxLX0RFVl9BRUM2MlhYIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0FMSTE1WDM9eQogIyBDT05GSUdfV0RDX0FMSTE1WDMgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfQU1ENzRYWD1tCi1DT05GSUdfQkxLX0RFVl9DTUQ2NFg9bQotQ09ORklHX0JMS19ERVZfVFJJRkxFWD1tCi1DT05GSUdfQkxLX0RFVl9DWTgyQzY5Mz1tCi1DT05GSUdfQkxLX0RFVl9DUzU1MjA9bQotQ09ORklHX0JMS19ERVZfQ1M1NTMwPW0KLUNPTkZJR19CTEtfREVWX0hQVDM0WD1tCi0jIENPTkZJR19IUFQzNFhfQVVUT0RNQSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9IUFQzNjY9bQotQ09ORklHX0JMS19ERVZfU0MxMjAwPW0KLUNPTkZJR19CTEtfREVWX1BJSVg9bQotQ09ORklHX0JMS19ERVZfTlM4NzQxNT1tCi1DT05GSUdfQkxLX0RFVl9QREMyMDJYWF9PTEQ9bQotIyBDT05GSUdfUERDMjAyWFhfQlVSU1QgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfUERDMjAyWFhfTkVXPW0KLSMgQ09ORklHX1BEQzIwMlhYX0ZPUkNFIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX1NWV0tTPW0KLUNPTkZJR19CTEtfREVWX1NJSU1BR0U9bQotQ09ORklHX0JMS19ERVZfU0xDOTBFNjY9bQotQ09ORklHX0JMS19ERVZfVFJNMjkwPW0KLUNPTkZJR19CTEtfREVWX1ZJQTgyQ1hYWD1tCisjIENPTkZJR19CTEtfREVWX0FNRDc0WFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DTUQ2NFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9UUklGTEVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1k4MkM2OTMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DUzU1MjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DUzU1MzAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IUFQzNFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IUFQzNjYgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TQzEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTlM4NzQxNSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NWV0tTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0lJTUFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NMQzkwRTY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVFJNMjkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVklBODJDWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0lERV9BUk0gaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfSURFRE1BPXkKICMgQ09ORklHX0lERURNQV9JVkIgaXMgbm90IHNldApAQCAtMzE2LDYgKzM3MCw3IEBACiAjCiAjIFNDU0kgZGV2aWNlIHN1cHBvcnQKICMKK0NPTkZJR19SQUlEX0FUVFJTPW0KIENPTkZJR19TQ1NJPXkKIENPTkZJR19TQ1NJX1BST0NfRlM9eQogCkBAIC0zMjMsMTEgKzM3OCwxMiBAQAogIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQogIwogQ09ORklHX0JMS19ERVZfU0Q9eQotQ09ORklHX0NIUl9ERVZfU1Q9bQotQ09ORklHX0NIUl9ERVZfT1NTVD1tCisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9TUj1tCiBDT05GSUdfQkxLX0RFVl9TUl9WRU5ET1I9eQogQ09ORklHX0NIUl9ERVZfU0c9bQorIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAogCiAjCiAjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcwpAQCAtMzQwLDg5ICszOTYsNDEgQEAKICMgU0NTSSBUcmFuc3BvcnQgQXR0cmlidXRlcwogIwogQ09ORklHX1NDU0lfU1BJX0FUVFJTPXkKLUNPTkZJR19TQ1NJX0ZDX0FUVFJTPW0KK0NPTkZJR19TQ1NJX0ZDX0FUVFJTPXkKIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTPW0KKyMgQ09ORklHX1NDU0lfU0FTX0FUVFJTIGlzIG5vdCBzZXQKIAogIwogIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCiAjCi1DT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQ9bQotQ09ORklHX1NDU0lfM1dfOVhYWD1tCi1DT05GSUdfU0NTSV9BQ0FSRD1tCi1DT05GSUdfU0NTSV9BQUNSQUlEPW0KK0NPTkZJR19JU0NTSV9UQ1A9bQorIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQUlDN1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX0FJQzc5WFg9bQotQ09ORklHX0FJQzc5WFhfQ01EU19QRVJfREVWSUNFPTMyCi1DT05GSUdfQUlDNzlYWF9SRVNFVF9ERUxBWV9NUz0xNTAwMAotIyBDT05GSUdfQUlDNzlYWF9CVUlMRF9GSVJNV0FSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BSUM3OVhYX0VOQUJMRV9SRF9TVFJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FJQzc5WFhfREVCVUdfRU5BQkxFIGlzIG5vdCBzZXQKLUNPTkZJR19BSUM3OVhYX0RFQlVHX01BU0s9MAotIyBDT05GSUdfQUlDNzlYWF9SRUdfUFJFVFRZX1BSSU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAogIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX1NBVEE9eQotQ09ORklHX1NDU0lfU0FUQV9BSENJPW0KLUNPTkZJR19TQ1NJX1NBVEFfU1ZXPW0KLUNPTkZJR19TQ1NJX0FUQV9QSUlYPW0KLUNPTkZJR19TQ1NJX1NBVEFfTlY9bQotQ09ORklHX1NDU0lfU0FUQV9QUk9NSVNFPW0KLUNPTkZJR19TQ1NJX1NBVEFfUVNUT1I9bQotQ09ORklHX1NDU0lfU0FUQV9TWDQ9bQotQ09ORklHX1NDU0lfU0FUQV9TSUw9bQotQ09ORklHX1NDU0lfU0FUQV9TSVM9bQotQ09ORklHX1NDU0lfU0FUQV9VTEk9bQotQ09ORklHX1NDU0lfU0FUQV9WSUE9bQotQ09ORklHX1NDU0lfU0FUQV9WSVRFU1NFPW0KLUNPTkZJR19TQ1NJX0RNWDMxOTFEPW0KLUNPTkZJR19TQ1NJX0VBVEFfUElPPW0KKyMgQ09ORklHX01FR0FSQUlEX1NBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBVEEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAotQ09ORklHX1NDU0lfSVBTPW0KLUNPTkZJR19TQ1NJX0lOSVRJTz1tCi1DT05GSUdfU0NTSV9JTklBMTAwPW0KLUNPTkZJR19TQ1NJX1BQQT1tCi1DT05GSUdfU0NTSV9JTU09bQotIyBDT05GSUdfU0NTSV9JWklQX0VQUDE2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSVpJUF9TTE9XX0NUUiBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9TWU01M0M4WFhfMj15Ci1DT05GSUdfU0NTSV9TWU01M0M4WFhfRE1BX0FERFJFU1NJTkdfTU9ERT0xCi1DT05GSUdfU0NTSV9TWU01M0M4WFhfREVGQVVMVF9UQUdTPTE2Ci1DT05GSUdfU0NTSV9TWU01M0M4WFhfTUFYX1RBR1M9NjQKLSMgQ09ORklHX1NDU0lfU1lNNTNDOFhYX0lPTUFQUEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX1FMT0dJQ19JU1A9bQotQ09ORklHX1NDU0lfUUxPR0lDX0ZDPXkKLUNPTkZJR19TQ1NJX1FMT0dJQ19GQ19GSVJNV0FSRT15CisjIENPTkZJR19TQ1NJX1FMT0dJQ19GQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX1FMT0dJQ1BUST1tCi1DT05GSUdfU0NTSV9RTEEyWFhYPXkKLSMgQ09ORklHX1NDU0lfUUxBMjFYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1FMQTIyWFggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9RTEEyMzAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfUUxBMjMyMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1FMQTYzMTIgaXMgbm90IHNldAotQ09ORklHX1NDU0lfREMzOTV4PW0KKyMgQ09ORklHX1NDU0lfUUxPR0lDUFRJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTFBGQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9ERUJVRz1tCi1DT05GSUdfU0NTSV9TVU5FU1A9eQotCi0jCi0jIEZpYnJlIENoYW5uZWwgc3VwcG9ydAotIwotQ09ORklHX0ZDND1tCi0KLSMKLSMgRkM0IGRyaXZlcnMKLSMKLUNPTkZJR19GQzRfU09DPW0KLUNPTkZJR19GQzRfU09DQUw9bQotCi0jCi0jIEZDNCB0YXJnZXRzCi0jCi1DT05GSUdfU0NTSV9QTFVUTz1tCi1DT05GSUdfU0NTSV9GQ0FMPW0KKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TVU5FU1AgaXMgbm90IHNldAogCiAjCiAjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCkBAIC00NDIsNDI3ICs0NTAsMzQgQEAKIENPTkZJR19ETV9TTkFQU0hPVD1tCiBDT05GSUdfRE1fTUlSUk9SPW0KIENPTkZJR19ETV9aRVJPPW0KKyMgQ09ORklHX0RNX01VTFRJUEFUSCBpcyBub3Qgc2V0CiAKICMKICMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAogIwotQ09ORklHX0ZVU0lPTj1tCi1DT05GSUdfRlVTSU9OX01BWF9TR0U9NDAKLUNPTkZJR19GVVNJT05fQ1RMPW0KLUNPTkZJR19GVVNJT05fTEFOPW0KKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT05fU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9GQyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT05fU0FTIGlzIG5vdCBzZXQKIAogIwogIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CiAjCi1DT05GSUdfSUVFRTEzOTQ9bQorIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAogCiAjCi0jIFN1YnN5c3RlbSBPcHRpb25zCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAogIwotIyBDT05GSUdfSUVFRTEzOTRfVkVSQk9TRURFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19JRUVFMTM5NF9PVUlfREI9eQotQ09ORklHX0lFRUUxMzk0X0VYVFJBX0NPTkZJR19ST01TPXkKLUNPTkZJR19JRUVFMTM5NF9DT05GSUdfUk9NX0lQMTM5ND15CisjIENPTkZJR19JMk8gaXMgbm90IHNldAogCiAjCi0jIERldmljZSBEcml2ZXJzCisjIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKICMKLUNPTkZJR19JRUVFMTM5NF9QQ0lMWU5YPW0KLUNPTkZJR19JRUVFMTM5NF9PSENJMTM5ND1tCi0KLSMKLSMgUHJvdG9jb2wgRHJpdmVycwotIwotQ09ORklHX0lFRUUxMzk0X1ZJREVPMTM5ND1tCi1DT05GSUdfSUVFRTEzOTRfU0JQMj1tCi0jIENPTkZJR19JRUVFMTM5NF9TQlAyX1BIWVNfRE1BIGlzIG5vdCBzZXQKLUNPTkZJR19JRUVFMTM5NF9FVEgxMzk0PW0KLUNPTkZJR19JRUVFMTM5NF9EVjEzOTQ9bQotQ09ORklHX0lFRUUxMzk0X1JBV0lPPW0KLUNPTkZJR19JRUVFMTM5NF9DTVA9bQotQ09ORklHX0lFRUUxMzk0X0FNRFRQPW0KLQotIwotIyBOZXR3b3JraW5nIHN1cHBvcnQKLSMKLUNPTkZJR19ORVQ9eQotCi0jCi0jIE5ldHdvcmtpbmcgb3B0aW9ucwotIwotQ09ORklHX1BBQ0tFVD15Ci1DT05GSUdfUEFDS0VUX01NQVA9eQotQ09ORklHX05FVExJTktfREVWPXkKLUNPTkZJR19VTklYPXkKLUNPTkZJR19ORVRfS0VZPW0KLUNPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9NVUxUSUNBU1Q9eQotIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX1BOUCBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUX0lQSVA9bQotQ09ORklHX05FVF9JUEdSRT1tCi1DT05GSUdfTkVUX0lQR1JFX0JST0FEQ0FTVD15Ci1DT05GSUdfSVBfTVJPVVRFPXkKLUNPTkZJR19JUF9QSU1TTV9WMT15Ci1DT05GSUdfSVBfUElNU01fVjI9eQotQ09ORklHX0FSUEQ9eQotQ09ORklHX1NZTl9DT09LSUVTPXkKLUNPTkZJR19JTkVUX0FIPXkKLUNPTkZJR19JTkVUX0VTUD15Ci1DT05GSUdfSU5FVF9JUENPTVA9eQotQ09ORklHX0lORVRfVFVOTkVMPXkKLUNPTkZJR19JUF9UQ1BESUFHPXkKLSMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0Ci0KLSMKLSMgSVA6IFZpcnR1YWwgU2VydmVyIENvbmZpZ3VyYXRpb24KLSMKLUNPTkZJR19JUF9WUz1tCi0jIENPTkZJR19JUF9WU19ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfVlNfVEFCX0JJVFM9MTIKLQotIwotIyBJUFZTIHRyYW5zcG9ydCBwcm90b2NvbCBsb2FkIGJhbGFuY2luZyBzdXBwb3J0Ci0jCi1DT05GSUdfSVBfVlNfUFJPVE9fVENQPXkKLUNPTkZJR19JUF9WU19QUk9UT19VRFA9eQotQ09ORklHX0lQX1ZTX1BST1RPX0VTUD15Ci1DT05GSUdfSVBfVlNfUFJPVE9fQUg9eQotCi0jCi0jIElQVlMgc2NoZWR1bGVyCi0jCi1DT05GSUdfSVBfVlNfUlI9bQotQ09ORklHX0lQX1ZTX1dSUj1tCi1DT05GSUdfSVBfVlNfTEM9bQotQ09ORklHX0lQX1ZTX1dMQz1tCi1DT05GSUdfSVBfVlNfTEJMQz1tCi1DT05GSUdfSVBfVlNfTEJMQ1I9bQotQ09ORklHX0lQX1ZTX0RIPW0KLUNPTkZJR19JUF9WU19TSD1tCi1DT05GSUdfSVBfVlNfU0VEPW0KLUNPTkZJR19JUF9WU19OUT1tCi0KLSMKLSMgSVBWUyBhcHBsaWNhdGlvbiBoZWxwZXIKLSMKLUNPTkZJR19JUF9WU19GVFA9bQotQ09ORklHX0lQVjY9bQotQ09ORklHX0lQVjZfUFJJVkFDWT15Ci1DT05GSUdfSU5FVDZfQUg9bQotQ09ORklHX0lORVQ2X0VTUD1tCi1DT05GSUdfSU5FVDZfSVBDT01QPW0KLUNPTkZJR19JTkVUNl9UVU5ORUw9bQotQ09ORklHX0lQVjZfVFVOTkVMPW0KLUNPTkZJR19ORVRGSUxURVI9eQotIyBDT05GSUdfTkVURklMVEVSX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19CUklER0VfTkVURklMVEVSPXkKLQotIwotIyBJUDogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KLSMKLUNPTkZJR19JUF9ORl9DT05OVFJBQ0s9bQotQ09ORklHX0lQX05GX0NUX0FDQ1Q9eQotQ09ORklHX0lQX05GX0NPTk5UUkFDS19NQVJLPXkKLUNPTkZJR19JUF9ORl9DVF9QUk9UT19TQ1RQPW0KLUNPTkZJR19JUF9ORl9GVFA9bQotQ09ORklHX0lQX05GX0lSQz1tCi1DT05GSUdfSVBfTkZfVEZUUD1tCi1DT05GSUdfSVBfTkZfQU1BTkRBPW0KLUNPTkZJR19JUF9ORl9RVUVVRT1tCi1DT05GSUdfSVBfTkZfSVBUQUJMRVM9bQotQ09ORklHX0lQX05GX01BVENIX0xJTUlUPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9JUFJBTkdFPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9NQUM9bQotQ09ORklHX0lQX05GX01BVENIX1BLVFRZUEU9bQotQ09ORklHX0lQX05GX01BVENIX01BUks9bQotQ09ORklHX0lQX05GX01BVENIX01VTFRJUE9SVD1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfVE9TPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9SRUNFTlQ9bQotQ09ORklHX0lQX05GX01BVENIX0VDTj1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfRFNDUD1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfQUhfRVNQPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9MRU5HVEg9bQotQ09ORklHX0lQX05GX01BVENIX1RUTD1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfVENQTVNTPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9IRUxQRVI9bQotQ09ORklHX0lQX05GX01BVENIX1NUQVRFPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9DT05OVFJBQ0s9bQotQ09ORklHX0lQX05GX01BVENIX09XTkVSPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9QSFlTREVWPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9BRERSVFlQRT1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfUkVBTE09bQotQ09ORklHX0lQX05GX01BVENIX1NDVFA9bQotQ09ORklHX0lQX05GX01BVENIX0NPTU1FTlQ9bQotQ09ORklHX0lQX05GX01BVENIX0NPTk5NQVJLPW0KLUNPTkZJR19JUF9ORl9NQVRDSF9IQVNITElNSVQ9bQotQ09ORklHX0lQX05GX0ZJTFRFUj1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX0xPRz1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX1VMT0c9bQotQ09ORklHX0lQX05GX1RBUkdFVF9UQ1BNU1M9bQotQ09ORklHX0lQX05GX05BVD1tCi1DT05GSUdfSVBfTkZfTkFUX05FRURFRD15Ci1DT05GSUdfSVBfTkZfVEFSR0VUX01BU1FVRVJBREU9bQotQ09ORklHX0lQX05GX1RBUkdFVF9SRURJUkVDVD1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX05FVE1BUD1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX1NBTUU9bQotQ09ORklHX0lQX05GX05BVF9TTk1QX0JBU0lDPW0KLUNPTkZJR19JUF9ORl9OQVRfSVJDPW0KLUNPTkZJR19JUF9ORl9OQVRfRlRQPW0KLUNPTkZJR19JUF9ORl9OQVRfVEZUUD1tCi1DT05GSUdfSVBfTkZfTkFUX0FNQU5EQT1tCi1DT05GSUdfSVBfTkZfTUFOR0xFPW0KLUNPTkZJR19JUF9ORl9UQVJHRVRfVE9TPW0KLUNPTkZJR19JUF9ORl9UQVJHRVRfRUNOPW0KLUNPTkZJR19JUF9ORl9UQVJHRVRfRFNDUD1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX01BUks9bQotQ09ORklHX0lQX05GX1RBUkdFVF9DTEFTU0lGWT1tCi1DT05GSUdfSVBfTkZfVEFSR0VUX0NPTk5NQVJLPW0KLUNPTkZJR19JUF9ORl9UQVJHRVRfQ0xVU1RFUklQPW0KLUNPTkZJR19JUF9ORl9SQVc9bQotQ09ORklHX0lQX05GX1RBUkdFVF9OT1RSQUNLPW0KLUNPTkZJR19JUF9ORl9BUlBUQUJMRVM9bQotQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCi1DT05GSUdfSVBfTkZfQVJQX01BTkdMRT1tCi0KLSMKLSMgSVB2NjogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KLSMKLUNPTkZJR19JUDZfTkZfUVVFVUU9bQotQ09ORklHX0lQNl9ORl9JUFRBQkxFUz1tCi1DT05GSUdfSVA2X05GX01BVENIX0xJTUlUPW0KLUNPTkZJR19JUDZfTkZfTUFUQ0hfTUFDPW0KLUNPTkZJR19JUDZfTkZfTUFUQ0hfUlQ9bQotQ09ORklHX0lQNl9ORl9NQVRDSF9PUFRTPW0KLUNPTkZJR19JUDZfTkZfTUFUQ0hfRlJBRz1tCi1DT05GSUdfSVA2X05GX01BVENIX0hMPW0KLUNPTkZJR19JUDZfTkZfTUFUQ0hfTVVMVElQT1JUPW0KLUNPTkZJR19JUDZfTkZfTUFUQ0hfT1dORVI9bQotQ09ORklHX0lQNl9ORl9NQVRDSF9NQVJLPW0KLUNPTkZJR19JUDZfTkZfTUFUQ0hfSVBWNkhFQURFUj1tCi1DT05GSUdfSVA2X05GX01BVENIX0FIRVNQPW0KLUNPTkZJR19JUDZfTkZfTUFUQ0hfTEVOR1RIPW0KLUNPTkZJR19JUDZfTkZfTUFUQ0hfRVVJNjQ9bQotQ09ORklHX0lQNl9ORl9NQVRDSF9QSFlTREVWPW0KLUNPTkZJR19JUDZfTkZfRklMVEVSPW0KLUNPTkZJR19JUDZfTkZfVEFSR0VUX0xPRz1tCi1DT05GSUdfSVA2X05GX01BTkdMRT1tCi1DT05GSUdfSVA2X05GX1RBUkdFVF9NQVJLPW0KLUNPTkZJR19JUDZfTkZfUkFXPW0KLQotIwotIyBERUNuZXQ6IE5ldGZpbHRlciBDb25maWd1cmF0aW9uCi0jCi1DT05GSUdfREVDTkVUX05GX0dSQUJVTEFUT1I9bQotCi0jCi0jIEJyaWRnZTogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KLSMKLUNPTkZJR19CUklER0VfTkZfRUJUQUJMRVM9bQotQ09ORklHX0JSSURHRV9FQlRfQlJPVVRFPW0KLUNPTkZJR19CUklER0VfRUJUX1RfRklMVEVSPW0KLUNPTkZJR19CUklER0VfRUJUX1RfTkFUPW0KLUNPTkZJR19CUklER0VfRUJUXzgwMl8zPW0KLUNPTkZJR19CUklER0VfRUJUX0FNT05HPW0KLUNPTkZJR19CUklER0VfRUJUX0FSUD1tCi1DT05GSUdfQlJJREdFX0VCVF9JUD1tCi1DT05GSUdfQlJJREdFX0VCVF9MSU1JVD1tCi1DT05GSUdfQlJJREdFX0VCVF9NQVJLPW0KLUNPTkZJR19CUklER0VfRUJUX1BLVFRZUEU9bQotQ09ORklHX0JSSURHRV9FQlRfU1RQPW0KLUNPTkZJR19CUklER0VfRUJUX1ZMQU49bQotQ09ORklHX0JSSURHRV9FQlRfQVJQUkVQTFk9bQotQ09ORklHX0JSSURHRV9FQlRfRE5BVD1tCi1DT05GSUdfQlJJREdFX0VCVF9NQVJLX1Q9bQotQ09ORklHX0JSSURHRV9FQlRfUkVESVJFQ1Q9bQotQ09ORklHX0JSSURHRV9FQlRfU05BVD1tCi1DT05GSUdfQlJJREdFX0VCVF9MT0c9bQotQ09ORklHX0JSSURHRV9FQlRfVUxPRz1tCi1DT05GSUdfWEZSTT15Ci1DT05GSUdfWEZSTV9VU0VSPW0KLQotIwotIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLUNPTkZJR19JUF9TQ1RQPW0KLSMgQ09ORklHX1NDVFBfREJHX01TRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1RQX0RCR19PQkpDTlQgaXMgbm90IHNldAotIyBDT05GSUdfU0NUUF9ITUFDX05PTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0NUUF9ITUFDX1NIQTEgaXMgbm90IHNldAotQ09ORklHX1NDVFBfSE1BQ19NRDU9eQotQ09ORklHX0FUTT15Ci1DT05GSUdfQVRNX0NMSVA9eQotIyBDT05GSUdfQVRNX0NMSVBfTk9fSUNNUCBpcyBub3Qgc2V0Ci1DT05GSUdfQVRNX0xBTkU9bQotQ09ORklHX0FUTV9NUE9BPW0KLUNPTkZJR19BVE1fQlIyNjg0PW0KLUNPTkZJR19BVE1fQlIyNjg0X0lQRklMVEVSPXkKLUNPTkZJR19CUklER0U9bQotQ09ORklHX1ZMQU5fODAyMVE9bQotQ09ORklHX0RFQ05FVD1tCi1DT05GSUdfREVDTkVUX1JPVVRFUj15Ci1DT05GSUdfREVDTkVUX1JPVVRFX0ZXTUFSSz15Ci1DT05GSUdfTExDPW0KLUNPTkZJR19MTEMyPW0KLUNPTkZJR19JUFg9bQotIyBDT05GSUdfSVBYX0lOVEVSTiBpcyBub3Qgc2V0Ci1DT05GSUdfQVRBTEs9bQotIyBDT05GSUdfREVWX0FQUExFVEFMSyBpcyBub3Qgc2V0Ci1DT05GSUdfWDI1PW0KLUNPTkZJR19MQVBCPW0KLUNPTkZJR19ORVRfRElWRVJUPXkKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLQotIwotIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKLSMKLUNPTkZJR19ORVRfU0NIRUQ9eQotIyBDT05GSUdfTkVUX1NDSF9DTEtfSklGRklFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfU0NIX0NMS19HRVRUSU1FT0ZEQVkgaXMgbm90IHNldAotQ09ORklHX05FVF9TQ0hfQ0xLX0NQVT15Ci1DT05GSUdfTkVUX1NDSF9DQlE9bQotQ09ORklHX05FVF9TQ0hfSFRCPW0KLUNPTkZJR19ORVRfU0NIX0hGU0M9bQotQ09ORklHX05FVF9TQ0hfQVRNPXkKLUNPTkZJR19ORVRfU0NIX1BSSU89bQotQ09ORklHX05FVF9TQ0hfUkVEPW0KLUNPTkZJR19ORVRfU0NIX1NGUT1tCi1DT05GSUdfTkVUX1NDSF9URVFMPW0KLUNPTkZJR19ORVRfU0NIX1RCRj1tCi1DT05GSUdfTkVUX1NDSF9HUkVEPW0KLUNPTkZJR19ORVRfU0NIX0RTTUFSSz1tCi1DT05GSUdfTkVUX1NDSF9ORVRFTT1tCi1DT05GSUdfTkVUX1NDSF9JTkdSRVNTPW0KLUNPTkZJR19ORVRfUU9TPXkKLUNPTkZJR19ORVRfRVNUSU1BVE9SPXkKLUNPTkZJR19ORVRfQ0xTPXkKLUNPTkZJR19ORVRfQ0xTX0JBU0lDPW0KLUNPTkZJR19ORVRfQ0xTX1RDSU5ERVg9bQotQ09ORklHX05FVF9DTFNfUk9VVEU0PW0KLUNPTkZJR19ORVRfQ0xTX1JPVVRFPXkKLUNPTkZJR19ORVRfQ0xTX0ZXPW0KLUNPTkZJR19ORVRfQ0xTX1UzMj1tCi1DT05GSUdfQ0xTX1UzMl9QRVJGPXkKLUNPTkZJR19ORVRfQ0xTX0lORD15Ci1DT05GSUdfQ0xTX1UzMl9NQVJLPXkKLUNPTkZJR19ORVRfQ0xTX1JTVlA9bQotQ09ORklHX05FVF9DTFNfUlNWUDY9bQotQ09ORklHX05FVF9FTUFUQ0g9eQotQ09ORklHX05FVF9FTUFUQ0hfU1RBQ0s9MzIKLUNPTkZJR19ORVRfRU1BVENIX0NNUD1tCi1DT05GSUdfTkVUX0VNQVRDSF9OQllURT1tCi1DT05GSUdfTkVUX0VNQVRDSF9VMzI9bQotQ09ORklHX05FVF9FTUFUQ0hfTUVUQT1tCi1DT05GSUdfTkVUX0NMU19BQ1Q9eQotQ09ORklHX05FVF9BQ1RfUE9MSUNFPW0KLUNPTkZJR19ORVRfQUNUX0dBQ1Q9bQotQ09ORklHX0dBQ1RfUFJPQj15Ci1DT05GSUdfTkVUX0FDVF9NSVJSRUQ9bQotQ09ORklHX05FVF9BQ1RfSVBUPW0KLUNPTkZJR19ORVRfQUNUX1BFRElUPW0KLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLUNPTkZJR19ORVRfUEtUR0VOPW0KLUNPTkZJR19ORVRQT0xMPXkKLSMgQ09ORklHX05FVFBPTExfUlggaXMgbm90IHNldAotIyBDT05GSUdfTkVUUE9MTF9UUkFQIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSPXkKLUNPTkZJR19IQU1SQURJTz15Ci0KLSMKLSMgUGFja2V0IFJhZGlvIHByb3RvY29scwotIwotQ09ORklHX0FYMjU9bQotQ09ORklHX0FYMjVfREFNQV9TTEFWRT15Ci1DT05GSUdfTkVUUk9NPW0KLUNPTkZJR19ST1NFPW0KLQotIwotIyBBWC4yNSBuZXR3b3JrIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19CUFFFVEhFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQVlDT01fU0VSX0ZEWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQVlDT01fU0VSX0hEWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQVlDT01fUEFSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1lBTSBpcyBub3Qgc2V0Ci1DT05GSUdfSVJEQT1tCi0KLSMKLSMgSXJEQSBwcm90b2NvbHMKLSMKLUNPTkZJR19JUkxBTj1tCi1DT05GSUdfSVJORVQ9bQotQ09ORklHX0lSQ09NTT1tCi1DT05GSUdfSVJEQV9VTFRSQT15Ci0KLSMKLSMgSXJEQSBvcHRpb25zCi0jCi1DT05GSUdfSVJEQV9DQUNIRV9MQVNUX0xTQVA9eQotQ09ORklHX0lSREFfRkFTVF9SUj15Ci0jIENPTkZJR19JUkRBX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBJbmZyYXJlZC1wb3J0IGRldmljZSBkcml2ZXJzCi0jCi0KLSMKLSMgU0lSIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19JUlRUWV9TSVIgaXMgbm90IHNldAotCi0jCi0jIERvbmdsZSBzdXBwb3J0Ci0jCi0KLSMKLSMgT2xkIFNJUiBkZXZpY2UgZHJpdmVycwotIwotCi0jCi0jIE9sZCBTZXJpYWwgZG9uZ2xlIHN1cHBvcnQKLSMKLQotIwotIyBGSVIgZGV2aWNlIGRyaXZlcnMKLSMKLSMgQ09ORklHX1VTQl9JUkRBIGlzIG5vdCBzZXQKLUNPTkZJR19TSUdNQVRFTF9GSVI9bQotIyBDT05GSUdfVkxTSV9GSVIgaXMgbm90IHNldAotQ09ORklHX0JUPW0KLUNPTkZJR19CVF9MMkNBUD1tCi1DT05GSUdfQlRfU0NPPW0KLUNPTkZJR19CVF9SRkNPTU09bQotQ09ORklHX0JUX1JGQ09NTV9UVFk9eQotQ09ORklHX0JUX0JORVA9bQotQ09ORklHX0JUX0JORVBfTUNfRklMVEVSPXkKLUNPTkZJR19CVF9CTkVQX1BST1RPX0ZJTFRFUj15Ci1DT05GSUdfQlRfQ01UUD1tCi1DT05GSUdfQlRfSElEUD1tCi0KLSMKLSMgQmx1ZXRvb3RoIGRldmljZSBkcml2ZXJzCi0jCi1DT05GSUdfQlRfSENJVVNCPW0KLUNPTkZJR19CVF9IQ0lVU0JfU0NPPXkKLUNPTkZJR19CVF9IQ0lVQVJUPW0KLUNPTkZJR19CVF9IQ0lVQVJUX0g0PXkKLUNPTkZJR19CVF9IQ0lVQVJUX0JDU1A9eQotQ09ORklHX0JUX0hDSVVBUlRfQkNTUF9UWENSQz15Ci1DT05GSUdfQlRfSENJQkNNMjAzWD1tCi1DT05GSUdfQlRfSENJQlBBMTBYPW0KLUNPTkZJR19CVF9IQ0lCRlVTQj1tCi1DT05GSUdfQlRfSENJVkhDST1tCiBDT05GSUdfTkVUREVWSUNFUz15CiBDT05GSUdfRFVNTVk9bQotQ09ORklHX0JPTkRJTkc9bQotQ09ORklHX0VRVUFMSVpFUj1tCi1DT05GSUdfVFVOPW0KLSMgQ09ORklHX0VUSEVSVEFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CiAKICMKICMgQVJDbmV0IGRldmljZXMKQEAgLTg3MCw4NiArNDg1LDc0IEBACiAjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAogCiAjCisjIFBIWSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKKworIwogIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKICMKIENPTkZJR19ORVRfRVRIRVJORVQ9eQogQ09ORklHX01JST1tCi1DT05GSUdfU1VOTEFOQ0U9eQotQ09ORklHX0hBUFBZTUVBTD15Ci1DT05GSUdfU1VOQk1BQz1tCi1DT05GSUdfU1VOUUU9bQotQ09ORklHX1NVTkdFTT15Ci1DT05GSUdfTkVUX1ZFTkRPUl8zQ09NPXkKLUNPTkZJR19WT1JURVg9bQotQ09ORklHX1RZUEhPT049bQorIyBDT05GSUdfU1VOTEFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkJNQUMgaXMgbm90IHNldAorIyBDT05GSUdfU1VOUUUgaXMgbm90IHNldAorIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKK0NPTkZJR19DQVNTSU5JPW0KKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CiAKICMKICMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKICMKLUNPTkZJR19ORVRfVFVMSVA9eQotQ09ORklHX0RFMjEwNFg9bQotQ09ORklHX1RVTElQPW0KLSMgQ09ORklHX1RVTElQX01XSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVUxJUF9NTUlPIGlzIG5vdCBzZXQKLUNPTkZJR19UVUxJUF9OQVBJPXkKLUNPTkZJR19UVUxJUF9OQVBJX0hXX01JVElHQVRJT049eQotQ09ORklHX0RFNFg1PW0KLUNPTkZJR19XSU5CT05EXzg0MD1tCi0jIENPTkZJR19ETTkxMDIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKIENPTkZJR19ORVRfUENJPXkKLUNPTkZJR19QQ05FVDMyPW0KKyMgQ09ORklHX1BDTkVUMzIgaXMgbm90IHNldAogIyBDT05GSUdfQU1EODExMV9FVEggaXMgbm90IHNldAotQ09ORklHX0FEQVBURUNfU1RBUkZJUkU9bQotQ09ORklHX0FEQVBURUNfU1RBUkZJUkVfTkFQST15Ci1DT05GSUdfQjQ0PW0KLUNPTkZJR19GT1JDRURFVEg9bQotQ09ORklHX0RHUlM9bQotQ09ORklHX0VFUFJPMTAwPW0KLUNPTkZJR19FMTAwPW0KLUNPTkZJR19GRUFMTlg9bQotQ09ORklHX05BVFNFTUk9bQotQ09ORklHX05FMktfUENJPW0KKyMgQ09ORklHX0FEQVBURUNfU1RBUkZJUkUgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPUkNFREVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19ER1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VFUFJPMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAorIyBDT05GSUdfTkUyS19QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfODEzOUNQIGlzIG5vdCBzZXQKLUNPTkZJR184MTM5VE9PPW0KLSMgQ09ORklHXzgxMzlUT09fUElPIGlzIG5vdCBzZXQKLSMgQ09ORklHXzgxMzlUT09fVFVORV9UV0lTVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHXzgxMzlUT09fODEyOSBpcyBub3Qgc2V0Ci0jIENPTkZJR184MTM5X09MRF9SWF9SRVNFVCBpcyBub3Qgc2V0Ci1DT05GSUdfU0lTOTAwPW0KLUNPTkZJR19FUElDMTAwPW0KLUNPTkZJR19TVU5EQU5DRT1tCi1DT05GSUdfU1VOREFOQ0VfTU1JTz15Ci1DT05GSUdfVklBX1JISU5FPW0KLSMgQ09ORklHX1ZJQV9SSElORV9NTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlUT08gaXMgbm90IHNldAorIyBDT05GSUdfU0lTOTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VQSUMxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKIAogIwogIyBFdGhlcm5ldCAoMTAwMCBNYml0KQogIwotQ09ORklHX0FDRU5JQz1tCi0jIENPTkZJR19BQ0VOSUNfT01JVF9USUdPTl9JIGlzIG5vdCBzZXQKLUNPTkZJR19ETDJLPW0KKyMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKIENPTkZJR19FMTAwMD1tCiBDT05GSUdfRTEwMDBfTkFQST15Ci1DT05GSUdfTVlSSV9TQlVTPW0KLUNPTkZJR19OUzgzODIwPW0KLUNPTkZJR19IQU1BQ0hJPW0KLUNPTkZJR19ZRUxMT1dGSU49bQotQ09ORklHX1I4MTY5PW0KLUNPTkZJR19SODE2OV9OQVBJPXkKLUNPTkZJR19SODE2OV9WTEFOPXkKLUNPTkZJR19TSzk4TElOPW0KLUNPTkZJR19WSUFfVkVMT0NJVFk9bQorIyBDT05GSUdfRTEwMDBfRElTQUJMRV9QQUNLRVRfU1BMSVQgaXMgbm90IHNldAorIyBDT05GSUdfTVlSSV9TQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAorIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAorIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLR0UgaXMgbm90IHNldAorIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CiBDT05GSUdfVElHT04zPW0KK0NPTkZJR19CTlgyPW0KIAogIwogIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKICMKLUNPTkZJR19JWEdCPW0KLUNPTkZJR19JWEdCX05BUEk9eQotQ09ORklHX1MySU89bQotQ09ORklHX1MySU9fTkFQST15Ci1DT05GSUdfMkJVRkZfTU9ERT15CisjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lYR0IgaXMgbm90IHNldAorIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CiAKICMKICMgVG9rZW4gUmluZyBkZXZpY2VzCkBAIC05NTksMTQwICs1NjIsMzEgQEAKICMKICMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCiAjCi1DT05GSUdfTkVUX1JBRElPPXkKLQotIwotIyBPYnNvbGV0ZSBXaXJlbGVzcyBjYXJkcyBzdXBwb3J0IChwcmUtODAyLjExKQotIwotIyBDT05GSUdfU1RSSVAgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIDgwMi4xMWIgSVNBL1BDSSBjYXJkcyBzdXBwb3J0Ci0jCi1DT05GSUdfSEVSTUVTPW0KLUNPTkZJR19QTFhfSEVSTUVTPW0KLUNPTkZJR19UTURfSEVSTUVTPW0KLUNPTkZJR19QQ0lfSEVSTUVTPW0KLUNPTkZJR19BVE1FTD1tCi1DT05GSUdfUENJX0FUTUVMPW0KLQotIwotIyBQcmlzbSBHVC9EdWV0dGUgODAyLjExKGEvYi9nKSBQQ0kvQ2FyZGJ1cyBzdXBwb3J0Ci0jCi1DT05GSUdfUFJJU001ND1tCi1DT05GSUdfTkVUX1dJUkVMRVNTPXkKKyMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0CiAKICMKICMgV2FuIGludGVyZmFjZXMKICMKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0Ci0KLSMKLSMgQVRNIGRyaXZlcnMKLSMKLUNPTkZJR19BVE1fVENQPW0KLSMgQ09ORklHX0FUTV9MQU5BSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE1fRU5JIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTV9GSVJFU1RSRUFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTV9aQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTV9JRFQ3NzI1MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE1fQU1CQVNTQURPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE1fSE9SSVpPTiBpcyBub3Qgc2V0Ci1DT05GSUdfQVRNX0ZPUkUyMDBFX01BWUJFPW0KLUNPTkZJR19BVE1fRk9SRTIwMEVfUENBPXkKLUNPTkZJR19BVE1fRk9SRTIwMEVfUENBX0RFRkFVTFRfRlc9eQotQ09ORklHX0FUTV9GT1JFMjAwRV9TQkE9eQotQ09ORklHX0FUTV9GT1JFMjAwRV9TQkFfREVGQVVMVF9GVz15Ci1DT05GSUdfQVRNX0ZPUkUyMDBFX1VTRV9UQVNLTEVUPXkKLUNPTkZJR19BVE1fRk9SRTIwMEVfVFhfUkVUUlk9MTYKLUNPTkZJR19BVE1fRk9SRTIwMEVfREVCVUc9MAotQ09ORklHX0FUTV9GT1JFMjAwRT1tCi1DT05GSUdfQVRNX0hFPW0KLUNPTkZJR19BVE1fSEVfVVNFX1NVTkk9eQotQ09ORklHX0ZEREk9eQotIyBDT05GSUdfREVGWFggaXMgbm90IHNldAotQ09ORklHX1NLRlA9bQotQ09ORklHX0hJUFBJPXkKLSMgQ09ORklHX1JPQURSVU5ORVIgaXMgbm90IHNldAotQ09ORklHX1BMSVA9bQotQ09ORklHX1BQUD1tCi1DT05GSUdfUFBQX01VTFRJTElOSz15Ci1DT05GSUdfUFBQX0ZJTFRFUj15Ci1DT05GSUdfUFBQX0FTWU5DPW0KLUNPTkZJR19QUFBfU1lOQ19UVFk9bQotQ09ORklHX1BQUF9ERUZMQVRFPW0KLUNPTkZJR19QUFBfQlNEQ09NUD1tCi1DT05GSUdfUFBQT0U9bQotQ09ORklHX1BQUE9BVE09bQotQ09ORklHX1NMSVA9bQotQ09ORklHX1NMSVBfQ09NUFJFU1NFRD15Ci1DT05GSUdfU0xJUF9TTUFSVD15Ci0jIENPTkZJR19TTElQX01PREVfU0xJUDYgaXMgbm90IHNldAotQ09ORklHX05FVF9GQz15Ci1DT05GSUdfU0hBUEVSPW0KLUNPTkZJR19ORVRDT05TT0xFPW0KKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CiAKICMKICMgSVNETiBzdWJzeXN0ZW0KICMKLUNPTkZJR19JU0ROPW0KLQotIwotIyBPbGQgSVNETjRMaW51eAotIwotIyBDT05GSUdfSVNETl9JNEwgaXMgbm90IHNldAotCi0jCi0jIENBUEkgc3Vic3lzdGVtCi0jCi1DT05GSUdfSVNETl9DQVBJPW0KLSMgQ09ORklHX0lTRE5fRFJWX0FWTUIxX1ZFUkJPU0VfUkVBU09OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lTRE5fQ0FQSV9NSURETEVXQVJFIGlzIG5vdCBzZXQKLUNPTkZJR19JU0ROX0NBUElfQ0FQSTIwPW0KLQotIwotIyBDQVBJIGhhcmR3YXJlIGRyaXZlcnMKLSMKLQotIwotIyBBY3RpdmUgQVZNIGNhcmRzCi0jCi1DT05GSUdfQ0FQSV9BVk09eQotQ09ORklHX0lTRE5fRFJWX0FWTUIxX0IxUENJPW0KLUNPTkZJR19JU0ROX0RSVl9BVk1CMV9CMVBDSVY0PXkKLUNPTkZJR19JU0ROX0RSVl9BVk1CMV9CMVBDTUNJQT1tCi1DT05GSUdfSVNETl9EUlZfQVZNQjFfVDFQQ0k9bQotQ09ORklHX0lTRE5fRFJWX0FWTUIxX0M0PW0KLQotIwotIyBBY3RpdmUgRWljb24gRElWQSBTZXJ2ZXIgY2FyZHMKLSMKLUNPTkZJR19DQVBJX0VJQ09OPXkKLUNPTkZJR19JU0ROX0RJVkFTPW0KLUNPTkZJR19JU0ROX0RJVkFTX0JSSVBDST15Ci1DT05GSUdfSVNETl9ESVZBU19QUklQQ0k9eQotQ09ORklHX0lTRE5fRElWQVNfRElWQUNBUEk9bQotQ09ORklHX0lTRE5fRElWQVNfVVNFUklEST1tCi1DT05GSUdfSVNETl9ESVZBU19NQUlOVD1tCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKIAogIwogIyBUZWxlcGhvbnkgU3VwcG9ydAogIwotQ09ORklHX1BIT05FPW0KLUNPTkZJR19QSE9ORV9JWEo9bQotCi0jCi0jIFVuaXg5OCBQVFkgc3VwcG9ydAotIwotQ09ORklHX1VOSVg5OF9QVFlTPXkKLUNPTkZJR19VTklYOThfUFRZX0NPVU5UPTI1NgotCi0jCi0jIFhGcmVlODYgRFJJIHN1cHBvcnQKLSMKLUNPTkZJR19EUk09eQotQ09ORklHX0RSTV9UREZYPW0KLSMgQ09ORklHX0RSTV9SMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKIAogIwogIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydApAQCAtMTExMiwyNiArNjA2LDYgQEAKICMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKIAogIwotIyBJbnB1dCBJL08gZHJpdmVycwotIwotQ09ORklHX0dBTUVQT1JUPW0KLUNPTkZJR19TT1VORF9HQU1FUE9SVD1tCi0jIENPTkZJR19HQU1FUE9SVF9OUzU1OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVF9MNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVF9FTVUxMEsxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dBTUVQT1JUX1ZPUlRFWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVF9GTTgwMSBpcyBub3Qgc2V0Ci1DT05GSUdfR0FNRVBPUlRfQ1M0NjFYPW0KLUNPTkZJR19TRVJJTz15Ci1DT05GSUdfU0VSSU9fSTgwNDI9eQotIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJT19DVDgyQzcxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJT19QQVJLQkQgaXMgbm90IHNldAotQ09ORklHX1NFUklPX1BDSVBTMj1tCi1DT05GSUdfU0VSSU9fTElCUFMyPXkKLUNPTkZJR19TRVJJT19SQVc9bQotCi0jCiAjIElucHV0IERldmljZSBEcml2ZXJzCiAjCiBDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQpAQCAtMTE0Myw3ICs2MTcsNyBAQAogQ09ORklHX0lOUFVUX01PVVNFPXkKIENPTkZJR19NT1VTRV9QUzI9eQogQ09ORklHX01PVVNFX1NFUklBTD15Ci1DT05GSUdfTU9VU0VfVlNYWFhBQT1tCisjIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKIENPTkZJR19JTlBVVF9NSVNDPXkKQEAgLTExNTEsNDA2ICs2MjUsMjU1IEBACiAjIENPTkZJR19JTlBVVF9VSU5QVVQgaXMgbm90IHNldAogCiAjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKK0NPTkZJR19TRVJJT19JODA0Mj15CisjIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJT19QQ0lQUzI9bQorQ09ORklHX1NFUklPX0xJQlBTMj15CitDT05GSUdfU0VSSU9fUkFXPW0KKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX1NVTkNPUkU9eQorIyBDT05GSUdfU0VSSUFMX1NVTlpJTE9HIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfU1VOU1U9eQorQ09ORklHX1NFUklBTF9TVU5TVV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfU1VOU0FCPW0KK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19SVEM9eQorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAorCisjCiAjIEkyQyBzdXBwb3J0CiAjCiBDT05GSUdfSTJDPXkKLUNPTkZJR19JMkNfQ0hBUkRFVj1tCisjIENPTkZJR19JMkNfQ0hBUkRFViBpcyBub3Qgc2V0CiAKICMKICMgSTJDIEFsZ29yaXRobXMKICMKIENPTkZJR19JMkNfQUxHT0JJVD15Ci1DT05GSUdfSTJDX0FMR09QQ0Y9bQotQ09ORklHX0kyQ19BTEdPUENBPW0KKyMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKIAogIwogIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKICMKLUNPTkZJR19JMkNfQUxJMTUzNT1tCi1DT05GSUdfSTJDX0FMSTE1NjM9bQotQ09ORklHX0kyQ19BTEkxNVgzPW0KLUNPTkZJR19JMkNfQU1ENzU2PW0KLSMgQ09ORklHX0kyQ19BTUQ3NTZfUzQ4ODIgaXMgbm90IHNldAotQ09ORklHX0kyQ19BTUQ4MTExPW0KLUNPTkZJR19JMkNfSTgwMT1tCi1DT05GSUdfSTJDX0k4MTA9bQotQ09ORklHX0kyQ19JU0E9bQotQ09ORklHX0kyQ19ORk9SQ0UyPW0KLUNPTkZJR19JMkNfUEFSUE9SVD1tCi1DT05GSUdfSTJDX1BBUlBPUlRfTElHSFQ9bQotQ09ORklHX0kyQ19QSUlYND1tCi1DT05GSUdfSTJDX1BST1NBVkFHRT1tCi1DT05GSUdfSTJDX1NBVkFHRTQ9bQotQ09ORklHX1NDeDIwMF9BQ0I9bQotQ09ORklHX0kyQ19TSVM1NTk1PW0KLUNPTkZJR19JMkNfU0lTNjMwPW0KLUNPTkZJR19JMkNfU0lTOTZYPW0KLUNPTkZJR19JMkNfU1RVQj1tCi1DT05GSUdfSTJDX1ZJQT1tCi1DT05GSUdfSTJDX1ZJQVBSTz1tCi1DT05GSUdfSTJDX1ZPT0RPTzM9bQotQ09ORklHX0kyQ19QQ0FfSVNBPW0KKyMgQ09ORklHX0kyQ19BTEkxNTM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ3NTYgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDgxMTEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ORk9SQ0UyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAorIyBDT05GSUdfU0N4MjAwX0FDQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNjMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM5NlggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBUFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WT09ET08zIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKIAogIwotIyBIYXJkd2FyZSBTZW5zb3JzIENoaXAgc3VwcG9ydAorIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKICMKLUNPTkZJR19JMkNfU0VOU09SPW0KLUNPTkZJR19TRU5TT1JTX0FETTEwMjE9bQotQ09ORklHX1NFTlNPUlNfQURNMTAyNT1tCi1DT05GSUdfU0VOU09SU19BRE0xMDI2PW0KLUNPTkZJR19TRU5TT1JTX0FETTEwMzE9bQotQ09ORklHX1NFTlNPUlNfQVNCMTAwPW0KLUNPTkZJR19TRU5TT1JTX0RTMTYyMT1tCi1DT05GSUdfU0VOU09SU19GU0NIRVI9bQotQ09ORklHX1NFTlNPUlNfRlNDUE9TPW0KLUNPTkZJR19TRU5TT1JTX0dMNTE4U009bQotQ09ORklHX1NFTlNPUlNfR0w1MjBTTT1tCi1DT05GSUdfU0VOU09SU19JVDg3PW0KLUNPTkZJR19TRU5TT1JTX0xNNjM9bQotQ09ORklHX1NFTlNPUlNfTE03NT1tCi1DT05GSUdfU0VOU09SU19MTTc3PW0KLUNPTkZJR19TRU5TT1JTX0xNNzg9bQotQ09ORklHX1NFTlNPUlNfTE04MD1tCi1DT05GSUdfU0VOU09SU19MTTgzPW0KLUNPTkZJR19TRU5TT1JTX0xNODU9bQotQ09ORklHX1NFTlNPUlNfTE04Nz1tCi1DT05GSUdfU0VOU09SU19MTTkwPW0KLUNPTkZJR19TRU5TT1JTX01BWDE2MTk9bQotQ09ORklHX1NFTlNPUlNfUEM4NzM2MD1tCi1DT05GSUdfU0VOU09SU19TTVNDNDdCMzk3PW0KLUNPTkZJR19TRU5TT1JTX1NJUzU1OTU9bQotQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE9bQotQ09ORklHX1NFTlNPUlNfVklBNjg2QT1tCi1DT05GSUdfU0VOU09SU19XODM3ODFEPW0KLUNPTkZJR19TRU5TT1JTX1c4M0w3ODVUUz1tCi1DT05GSUdfU0VOU09SU19XODM2MjdIRj1tCi0KLSMKLSMgT3RoZXIgSTJDIENoaXAgc3VwcG9ydAotIwotQ09ORklHX1NFTlNPUlNfRUVQUk9NPW0KLUNPTkZJR19TRU5TT1JTX1BDRjg1NzQ9bQotQ09ORklHX1NFTlNPUlNfUENGODU5MT1tCi1DT05GSUdfU0VOU09SU19SVEM4NTY0PW0KKyMgQ09ORklHX1NFTlNPUlNfRFMxMzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUlRDODU2NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX1gxMjA1X0kyQyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKIAogIwotIyBGaWxlIHN5c3RlbXMKKyMgU1BJIHN1cHBvcnQKICMKLUNPTkZJR19FWFQyX0ZTPXkKLUNPTkZJR19FWFQyX0ZTX1hBVFRSPXkKLUNPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTD15Ci1DT05GSUdfRVhUMl9GU19TRUNVUklUWT15Ci1DT05GSUdfRVhUM19GUz15Ci1DT05GSUdfRVhUM19GU19YQVRUUj15Ci1DT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQotQ09ORklHX0VYVDNfRlNfU0VDVVJJVFk9eQotQ09ORklHX0pCRD15Ci0jIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0ZTX01CQ0FDSEU9eQotIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAotQ09ORklHX0pGU19GUz1tCi1DT05GSUdfSkZTX1BPU0lYX0FDTD15Ci1DT05GSUdfSkZTX1NFQ1VSSVRZPXkKLSMgQ09ORklHX0pGU19ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRlNfU1RBVElTVElDUyBpcyBub3Qgc2V0Ci1DT05GSUdfRlNfUE9TSVhfQUNMPXkKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKIAogIwotIyBYRlMgc3VwcG9ydAorIyBEYWxsYXMncyAxLXdpcmUgYnVzCiAjCi1DT05GSUdfWEZTX0ZTPW0KLUNPTkZJR19YRlNfRVhQT1JUPXkKLSMgQ09ORklHX1hGU19SVCBpcyBub3Qgc2V0Ci1DT05GSUdfWEZTX1FVT1RBPXkKLUNPTkZJR19YRlNfU0VDVVJJVFk9eQotQ09ORklHX1hGU19QT1NJWF9BQ0w9eQotQ09ORklHX01JTklYX0ZTPW0KLUNPTkZJR19ST01GU19GUz1tCi0jIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci1DT05GSUdfUVVPVEFDVEw9eQotQ09ORklHX0ROT1RJRlk9eQotQ09ORklHX0FVVE9GU19GUz1tCi1DT05GSUdfQVVUT0ZTNF9GUz1tCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAKICMKLSMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKICMKLUNPTkZJR19JU085NjYwX0ZTPW0KLUNPTkZJR19KT0xJRVQ9eQotIyBDT05GSUdfWklTT0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19VREZfRlM9bQotQ09ORklHX1VERl9OTFM9eQorQ09ORklHX0hXTU9OPXkKKyMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVklBNjg2QSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZUODIzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CiAKICMKLSMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIyBNaXNjIGRldmljZXMKICMKLUNPTkZJR19GQVRfRlM9bQotQ09ORklHX01TRE9TX0ZTPW0KLUNPTkZJR19WRkFUX0ZTPW0KLUNPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKLUNPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKLSMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAogCiAjCi0jIFBzZXVkbyBmaWxlc3lzdGVtcworIyBNdWx0aW1lZGlhIENhcGFiaWxpdGllcyBQb3J0IGRyaXZlcnMKICMKLUNPTkZJR19QUk9DX0ZTPXkKLUNPTkZJR19QUk9DX0tDT1JFPXkKLUNPTkZJR19TWVNGUz15Ci1DT05GSUdfREVWRlNfRlM9eQotQ09ORklHX0RFVkZTX01PVU5UPXkKLSMgQ09ORklHX0RFVkZTX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19ERVZQVFNfRlNfWEFUVFI9eQotIyBDT05GSUdfREVWUFRTX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLUNPTkZJR19UTVBGUz15Ci1DT05GSUdfVE1QRlNfWEFUVFI9eQotQ09ORklHX1RNUEZTX1NFQ1VSSVRZPXkKLUNPTkZJR19IVUdFVExCRlM9eQotQ09ORklHX0hVR0VUTEJfUEFHRT15Ci1DT05GSUdfUkFNRlM9eQotCi0jCi0jIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKLSMKLUNPTkZJR19BREZTX0ZTPW0KLSMgQ09ORklHX0FERlNfRlNfUlcgaXMgbm90IHNldAotQ09ORklHX0FGRlNfRlM9bQotQ09ORklHX0hGU19GUz1tCi1DT05GSUdfSEZTUExVU19GUz1tCi1DT05GSUdfQkVGU19GUz1tCi0jIENPTkZJR19CRUZTX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19CRlNfRlM9bQotQ09ORklHX0VGU19GUz1tCi1DT05GSUdfQ1JBTUZTPW0KLUNPTkZJR19WWEZTX0ZTPW0KLUNPTkZJR19IUEZTX0ZTPW0KLUNPTkZJR19RTlg0RlNfRlM9bQotQ09ORklHX1NZU1ZfRlM9bQotQ09ORklHX1VGU19GUz1tCi1DT05GSUdfVUZTX0ZTX1dSSVRFPXkKLQotIwotIyBOZXR3b3JrIEZpbGUgU3lzdGVtcwotIwotQ09ORklHX05GU19GUz1tCi1DT05GSUdfTkZTX1YzPXkKLUNPTkZJR19ORlNfVjQ9eQotQ09ORklHX05GU19ESVJFQ1RJTz15Ci1DT05GSUdfTkZTRD1tCi1DT05GSUdfTkZTRF9WMz15Ci1DT05GSUdfTkZTRF9WND15Ci1DT05GSUdfTkZTRF9UQ1A9eQotQ09ORklHX0xPQ0tEPW0KLUNPTkZJR19MT0NLRF9WND15Ci1DT05GSUdfRVhQT1JURlM9bQotQ09ORklHX1NVTlJQQz1tCi1DT05GSUdfU1VOUlBDX0dTUz1tCi1DT05GSUdfUlBDU0VDX0dTU19LUkI1PW0KLUNPTkZJR19SUENTRUNfR1NTX1NQS00zPW0KLUNPTkZJR19TTUJfRlM9bQotIyBDT05GSUdfU01CX05MU19ERUZBVUxUIGlzIG5vdCBzZXQKLUNPTkZJR19DSUZTPW0KLSMgQ09ORklHX0NJRlNfU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGU19YQVRUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTCBpcyBub3Qgc2V0Ci1DT05GSUdfTkNQX0ZTPW0KLSMgQ09ORklHX05DUEZTX1BBQ0tFVF9TSUdOSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUEZTX0lPQ1RMX0xPQ0tJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTkNQRlNfU1RST05HIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUEZTX05GU19OUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BGU19PUzJfTlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQRlNfU01BTExET1MgaXMgbm90IHNldAotIyBDT05GSUdfTkNQRlNfTkxTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUEZTX0VYVFJBUyBpcyBub3Qgc2V0Ci1DT05GSUdfQ09EQV9GUz1tCi0jIENPTkZJR19DT0RBX0ZTX09MRF9BUEkgaXMgbm90IHNldAotQ09ORklHX0FGU19GUz1tCi1DT05GSUdfUlhSUEM9bQotCi0jCi0jIFBhcnRpdGlvbiBUeXBlcwotIwotIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19NU0RPU19QQVJUSVRJT049eQotQ09ORklHX1NVTl9QQVJUSVRJT049eQotCi0jCi0jIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0Ci0jCi1DT05GSUdfTkxTPXkKLUNPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgotQ09ORklHX05MU19DT0RFUEFHRV80Mzc9bQotQ09ORklHX05MU19DT0RFUEFHRV83Mzc9bQotQ09ORklHX05MU19DT0RFUEFHRV83NzU9bQotQ09ORklHX05MU19DT0RFUEFHRV84NTA9bQotQ09ORklHX05MU19DT0RFUEFHRV84NTI9bQotQ09ORklHX05MU19DT0RFUEFHRV84NTU9bQotQ09ORklHX05MU19DT0RFUEFHRV84NTc9bQotQ09ORklHX05MU19DT0RFUEFHRV84NjA9bQotQ09ORklHX05MU19DT0RFUEFHRV84NjE9bQotQ09ORklHX05MU19DT0RFUEFHRV84NjI9bQotQ09ORklHX05MU19DT0RFUEFHRV84NjM9bQotQ09ORklHX05MU19DT0RFUEFHRV84NjQ9bQotQ09ORklHX05MU19DT0RFUEFHRV84NjU9bQotQ09ORklHX05MU19DT0RFUEFHRV84NjY9bQotQ09ORklHX05MU19DT0RFUEFHRV84Njk9bQotQ09ORklHX05MU19DT0RFUEFHRV85MzY9bQotQ09ORklHX05MU19DT0RFUEFHRV85NTA9bQotQ09ORklHX05MU19DT0RFUEFHRV85MzI9bQotQ09ORklHX05MU19DT0RFUEFHRV85NDk9bQotQ09ORklHX05MU19DT0RFUEFHRV84NzQ9bQotQ09ORklHX05MU19JU084ODU5Xzg9bQotQ09ORklHX05MU19DT0RFUEFHRV8xMjUwPW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfMTI1MT1tCi1DT05GSUdfTkxTX0FTQ0lJPW0KLUNPTkZJR19OTFNfSVNPODg1OV8xPW0KLUNPTkZJR19OTFNfSVNPODg1OV8yPW0KLUNPTkZJR19OTFNfSVNPODg1OV8zPW0KLUNPTkZJR19OTFNfSVNPODg1OV80PW0KLUNPTkZJR19OTFNfSVNPODg1OV81PW0KLUNPTkZJR19OTFNfSVNPODg1OV82PW0KLUNPTkZJR19OTFNfSVNPODg1OV83PW0KLUNPTkZJR19OTFNfSVNPODg1OV85PW0KLUNPTkZJR19OTFNfSVNPODg1OV8xMz1tCi1DT05GSUdfTkxTX0lTTzg4NTlfMTQ9bQotQ09ORklHX05MU19JU084ODU5XzE1PW0KLUNPTkZJR19OTFNfS09JOF9SPW0KLUNPTkZJR19OTFNfS09JOF9VPW0KLUNPTkZJR19OTFNfVVRGOD1tCiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCi1DT05GSUdfVklERU9fREVWPXkKLQotIwotIyBWaWRlbyBGb3IgTGludXgKLSMKLQotIwotIyBWaWRlbyBBZGFwdGVycwotIwotQ09ORklHX1ZJREVPX0JUODQ4PW0KLUNPTkZJR19WSURFT19CV1FDQU09bQotQ09ORklHX1ZJREVPX0NRQ0FNPW0KLUNPTkZJR19WSURFT19XOTk2Nj1tCi1DT05GSUdfVklERU9fQ1BJQT1tCi1DT05GSUdfVklERU9fQ1BJQV9QUD1tCi1DT05GSUdfVklERU9fQ1BJQV9VU0I9bQotQ09ORklHX1ZJREVPX1NBQTUyNDZBPW0KLUNPTkZJR19WSURFT19TQUE1MjQ5PW0KLUNPTkZJR19UVU5FUl8zMDM2PW0KLSMgQ09ORklHX1ZJREVPX1NUUkFESVMgaXMgbm90IHNldAotIyBDT05GSUdfVklERU9fWk9SQU4gaXMgbm90IHNldAotIyBDT05GSUdfVklERU9fU0FBNzEzNCBpcyBub3Qgc2V0Ci1DT05GSUdfVklERU9fTVhCPW0KLUNPTkZJR19WSURFT19EUEM9bQotQ09ORklHX1ZJREVPX0hFWElVTV9PUklPTj1tCi1DT05GSUdfVklERU9fSEVYSVVNX0dFTUlOST1tCi1DT05GSUdfVklERU9fQ1g4OD1tCi1DT05GSUdfVklERU9fT1ZDQU1DSElQPW0KLQotIwotIyBSYWRpbyBBZGFwdGVycwotIwotQ09ORklHX1JBRElPX0dFTVRFS19QQ0k9bQotQ09ORklHX1JBRElPX01BWElSQURJTz1tCi1DT05GSUdfUkFESU9fTUFFU1RSTz1tCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAogCiAjCiAjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKICMKLUNPTkZJR19EVkI9eQotQ09ORklHX0RWQl9DT1JFPW0KKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CiAKICMKLSMgU3VwcG9ydGVkIFNBQTcxNDYgYmFzZWQgUENJIEFkYXB0ZXJzCisjIEdyYXBoaWNzIHN1cHBvcnQKICMKLUNPTkZJR19EVkJfQVY3MTEwPW0KLSMgQ09ORklHX0RWQl9BVjcxMTBfT1NEIGlzIG5vdCBzZXQKLUNPTkZJR19EVkJfQlVER0VUPW0KLUNPTkZJR19EVkJfQlVER0VUX0NJPW0KLUNPTkZJR19EVkJfQlVER0VUX0FWPW0KLUNPTkZJR19EVkJfQlVER0VUX1BBVENIPW0KK0NPTkZJR19GQj15CitDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKK0NPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQorQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQorIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAorQ09ORklHX0ZCX01PREVfSEVMUEVSUz15CitDT05GSUdfRkJfVElMRUJMSVRUSU5HPXkKKyMgQ09ORklHX0ZCX0NJUlJVUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9QTTIgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVNJTElBTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfSU1TVFQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9OVklESUEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfUklWQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NQVRST1ggaXMgbm90IHNldAorIyBDT05GSUdfRkJfUkFERU9OX09MRCBpcyBub3Qgc2V0CitDT05GSUdfRkJfUkFERU9OPXkKK0NPTkZJR19GQl9SQURFT05fSTJDPXkKKyMgQ09ORklHX0ZCX1JBREVPTl9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9BVFkxMjggaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NBVkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TSVMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTkVPTUFHSUMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfS1lSTyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl8zREZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1ZPT0RPTzEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVFJJREVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CiAKICMKLSMgU3VwcG9ydGVkIFVTQiBBZGFwdGVycworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKICMKLSMgQ09ORklHX0RWQl9UVFVTQl9CVURHRVQgaXMgbm90IHNldAotQ09ORklHX0RWQl9UVFVTQl9ERUM9bQotQ09ORklHX0RWQl9ESUJVU0I9bQotIyBDT05GSUdfRFZCX0RJQlVTQl9NSVNERVNJR05FRF9ERVZJQ0VTIGlzIG5vdCBzZXQKLUNPTkZJR19EVkJfRElCQ09NX0RFQlVHPXkKLUNPTkZJR19EVkJfQ0lORVJHWVQyPW0KLSMgQ09ORklHX0RWQl9DSU5FUkdZVDJfVFVOSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST01fQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CisjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX1JPVEFUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19GT05UUz15CisjIENPTkZJR19GT05UXzh4OCBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UXzh4MTYgaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF82eDExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRfN3gxNCBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX1BFQVJMXzh4OCBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX0FDT1JOXzh4OCBpcyBub3Qgc2V0CitDT05GSUdfRk9OVF9TVU44eDE2PXkKKyMgQ09ORklHX0ZPTlRfU1VOMTJ4MjIgaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF8xMHgxOCBpcyBub3Qgc2V0CiAKICMKLSMgU3VwcG9ydGVkIEZsZXhDb3BJSSAoQjJDMikgQWRhcHRlcnMKKyMgTG9nbyBjb25maWd1cmF0aW9uCiAjCi1DT05GSUdfRFZCX0IyQzJfU0tZU1RBUj1tCi1DT05GSUdfRFZCX0IyQzJfVVNCPW0KLQotIwotIyBTdXBwb3J0ZWQgQlQ4NzggQWRhcHRlcnMKLSMKLUNPTkZJR19EVkJfQlQ4WFg9bQotCi0jCi0jIFN1cHBvcnRlZCBEVkIgRnJvbnRlbmRzCi0jCi0KLSMKLSMgQ3VzdG9taXNlIERWQiBGcm9udGVuZHMKLSMKLQotIwotIyBEVkItUyAoc2F0ZWxsaXRlKSBmcm9udGVuZHMKLSMKLUNPTkZJR19EVkJfU1RWMDI5OT1tCi1DT05GSUdfRFZCX0NYMjQxMTA9bQotQ09ORklHX0RWQl9UREE4MDgzPW0KLUNPTkZJR19EVkJfVERBODBYWD1tCi1DT05GSUdfRFZCX01UMzEyPW0KLUNPTkZJR19EVkJfVkVTMVg5Mz1tCi0KLSMKLSMgRFZCLVQgKHRlcnJlc3RyaWFsKSBmcm9udGVuZHMKLSMKLUNPTkZJR19EVkJfU1A4ODcwPW0KLUNPTkZJR19EVkJfU1A4ODdYPW0KLUNPTkZJR19EVkJfQ1gyMjcwMD1tCi1DT05GSUdfRFZCX0NYMjI3MDI9bQotQ09ORklHX0RWQl9MNjQ3ODE9bQotQ09ORklHX0RWQl9UREExMDA0WD1tCi1DT05GSUdfRFZCX05YVDYwMDA9bQotQ09ORklHX0RWQl9NVDM1Mj1tCi1DT05GSUdfRFZCX0RJQjMwMDBNQj1tCi1DT05GSUdfRFZCX0RJQjMwMDBNQz1tCi0KLSMKLSMgRFZCLUMgKGNhYmxlKSBmcm9udGVuZHMKLSMKLUNPTkZJR19EVkJfQVRNRUxfQVQ3NkM2NTE9bQotQ09ORklHX0RWQl9WRVMxODIwPW0KLUNPTkZJR19EVkJfVERBMTAwMjE9bQotQ09ORklHX0RWQl9TVFYwMjk3PW0KLQotIwotIyBBVFNDIChOb3J0aCBBbWVyaWNhbi9Lb3JlYW4gVGVycmVzdGVyaWFsIERUVikgZnJvbnRlbmRzCi0jCi1DT05GSUdfRFZCX05YVDIwMDI9bQotQ09ORklHX1ZJREVPX1NBQTcxNDY9bQotQ09ORklHX1ZJREVPX1NBQTcxNDZfVlY9bQotQ09ORklHX1ZJREVPX1ZJREVPQlVGPW0KLUNPTkZJR19WSURFT19UVU5FUj1tCi1DT05GSUdfVklERU9fQlVGPW0KLUNPTkZJR19WSURFT19CVENYPW0KLUNPTkZJR19WSURFT19JUj1tCi1DT05GSUdfVklERU9fVFZFRVBST009bQorQ09ORklHX0xPR089eQorIyBDT05GSUdfTE9HT19MSU5VWF9NT05PIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR09fTElOVVhfVkdBMTYgaXMgbm90IHNldAorIyBDT05GSUdfTE9HT19MSU5VWF9DTFVUMjI0IGlzIG5vdCBzZXQKK0NPTkZJR19MT0dPX1NVTl9DTFVUMjI0PXkKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKICMgU291bmQKQEAgLTE1NjMsNyArODg2LDYgQEAKIENPTkZJR19TTkQ9bQogQ09ORklHX1NORF9USU1FUj1tCiBDT05GSUdfU05EX1BDTT1tCi1DT05GSUdfU05EX0hXREVQPW0KIENPTkZJR19TTkRfUkFXTUlEST1tCiBDT05GSUdfU05EX1NFUVVFTkNFUj1tCiBDT05GSUdfU05EX1NFUV9EVU1NWT1tCkBAIC0xNTcxLDggKzg5Myw5IEBACiBDT05GSUdfU05EX01JWEVSX09TUz1tCiBDT05GSUdfU05EX1BDTV9PU1M9bQogQ09ORklHX1NORF9TRVFVRU5DRVJfT1NTPXkKLUNPTkZJR19TTkRfQklUMzJfRU1VTD1tCiAjIENPTkZJR19TTkRfUlRDVElNRVIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfU1VQUE9SVF9PTERfQVBJPXkKICMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAogCkBAIC0xNTgwLDU5ICs5MDMsNTggQEAKICMgR2VuZXJpYyBkZXZpY2VzCiAjCiBDT05GSUdfU05EX01QVTQwMV9VQVJUPW0KLUNPTkZJR19TTkRfT1BMM19MSUI9bQotQ09ORklHX1NORF9WWF9MSUI9bQorQ09ORklHX1NORF9BQzk3X0NPREVDPW0KK0NPTkZJR19TTkRfQUM5N19CVVM9bQogQ09ORklHX1NORF9EVU1NWT1tCiBDT05GSUdfU05EX1ZJUk1JREk9bQotIyBDT05GSUdfU05EX01UUEFWIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfTVRQQVY9bQogIyBDT05GSUdfU05EX1NFUklBTF9VMTY1NTAgaXMgbm90IHNldAogIyBDT05GSUdfU05EX01QVTQwMSBpcyBub3Qgc2V0CiAKICMKICMgUENJIGRldmljZXMKICMKLUNPTkZJR19TTkRfQUM5N19DT0RFQz1tCisjIENPTkZJR19TTkRfQUQxODg5IGlzIG5vdCBzZXQKIENPTkZJR19TTkRfQUxJNTQ1MT1tCi1DT05GSUdfU05EX0FUSUlYUD1tCi1DT05GSUdfU05EX0FUSUlYUF9NT0RFTT1tCi1DT05GSUdfU05EX0FVODgxMD1tCi1DT05GSUdfU05EX0FVODgyMD1tCi1DT05GSUdfU05EX0FVODgzMD1tCi1DT05GSUdfU05EX0FaVDMzMjg9bQotQ09ORklHX1NORF9CVDg3WD1tCi0jIENPTkZJR19TTkRfQlQ4N1hfT1ZFUkNMT0NLIGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfQ1M0NlhYPW0KLSMgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUCBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX0NTNDI4MT1tCi1DT05GSUdfU05EX0VNVTEwSzE9bQotQ09ORklHX1NORF9FTVUxMEsxWD1tCi1DT05GSUdfU05EX0NBMDEwNj1tCi1DT05GSUdfU05EX0tPUkcxMjEyPW0KLUNPTkZJR19TTkRfTUlYQVJUPW0KLUNPTkZJR19TTkRfTk0yNTY9bQorIyBDT05GSUdfU05EX0FUSUlYUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVRJSVhQX01PREVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BVTg4MTAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FVODgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVU4ODMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BWlQzMzI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9CVDg3WCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ0EwMTA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DTUlQQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NTNDI4MSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ1M0NlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FTVUxMEsxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FTVUxMEsxWCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRU5TMTM3MCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRU5TMTM3MSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRVMxOTM4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FUzE5NjggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0ZNODAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9IREFfSU5URUwgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0hEU1AgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0hEU1BNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JQ0UxNzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JQ0UxNzI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JTlRFTDhYMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5URUw4WDBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9LT1JHMTIxMiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTUFFU1RSTzMgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01JWEFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTk0yNTYgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1BDWEhSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9STUUzMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfUk1FOTYgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1JNRTk2NTIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0hEU1AgaXMgbm90IHNldAotQ09ORklHX1NORF9UUklERU5UPW0KLUNPTkZJR19TTkRfWU1GUENJPW0KLUNPTkZJR19TTkRfQUxTNDAwMD1tCi1DT05GSUdfU05EX0NNSVBDST1tCi1DT05GSUdfU05EX0VOUzEzNzA9bQotQ09ORklHX1NORF9FTlMxMzcxPW0KLUNPTkZJR19TTkRfRVMxOTM4PW0KLUNPTkZJR19TTkRfRVMxOTY4PW0KLUNPTkZJR19TTkRfTUFFU1RSTzM9bQotQ09ORklHX1NORF9GTTgwMT1tCi1DT05GSUdfU05EX0ZNODAxX1RFQTU3NVg9bQotQ09ORklHX1NORF9JQ0UxNzEyPW0KLSMgQ09ORklHX1NORF9JQ0UxNzI0IGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfSU5URUw4WDA9bQotQ09ORklHX1NORF9JTlRFTDhYME09bQotQ09ORklHX1NORF9TT05JQ1ZJQkVTPW0KKyMgQ09ORklHX1NORF9TT05JQ1ZJQkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9UUklERU5UIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9WSUE4MlhYIGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfVklBODJYWF9NT0RFTT1tCi1DT05GSUdfU05EX1ZYMjIyPW0KKyMgQ09ORklHX1NORF9WSUE4MlhYX01PREVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WWDIyMiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfWU1GUENJIGlzIG5vdCBzZXQKIAogIwogIyBVU0IgZGV2aWNlcwpAQCAtMTY0MiwxMiArOTY0LDIwIEBACiAjCiAjIEFMU0EgU3BhcmMgZGV2aWNlcwogIwotQ09ORklHX1NORF9TVU5fQU1ENzkzMD1tCisjIENPTkZJR19TTkRfU1VOX0FNRDc5MzAgaXMgbm90IHNldAogQ09ORklHX1NORF9TVU5fQ1M0MjMxPW0KKyMgQ09ORklHX1NORF9TVU5fREJSSSBpcyBub3Qgc2V0CisKKyMKKyMgT3BlbiBTb3VuZCBTeXN0ZW0KKyMKKyMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKIAogIwogIyBVU0Igc3VwcG9ydAogIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKIENPTkZJR19VU0I9eQogIyBDT05GSUdfVVNCX0RFQlVHIGlzIG5vdCBzZXQKIApAQCAtMTY1OCw4ICs5ODgsNiBAQAogIyBDT05GSUdfVVNCX0JBTkRXSURUSCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15Ci1DT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQogCiAjCiAjIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycwpAQCAtMTY2NywxNzQgKzk5NSwxMDggQEAKIENPTkZJR19VU0JfRUhDSV9IQ0Q9bQogIyBDT05GSUdfVVNCX0VIQ0lfU1BMSVRfSVNPIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX09IQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQogQ09ORklHX1VTQl9VSENJX0hDRD1tCi1DT05GSUdfVVNCX1NMODExX0hDRD1tCisjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKIAogIwogIyBVU0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKICMKLSMgQ09ORklHX1VTQl9BVURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19PQlNPTEVURV9PU1NfVVNCX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQKIAogIwotIyBVU0IgQmx1ZXRvb3RoIFRUWSBjYW4gb25seSBiZSB1c2VkIHdpdGggZGlzYWJsZWQgQmx1ZXRvb3RoIHN1YnN5c3RlbQorIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCiAjCi0jIENPTkZJR19VU0JfTUlESSBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX0FDTT1tCi1DT05GSUdfVVNCX1BSSU5URVI9bQogCiAjCi0jIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgorIyBtYXkgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCiAjCi1DT05GSUdfVVNCX1NUT1JBR0U9bQotIyBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcgaXMgbm90IHNldAotQ09ORklHX1VTQl9TVE9SQUdFX1JXX0RFVEVDVD15Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfU1RPUkFHRV9GUkVFQ09NPXkKLUNPTkZJR19VU0JfU1RPUkFHRV9JU0QyMDA9eQotQ09ORklHX1VTQl9TVE9SQUdFX0RQQ009eQotQ09ORklHX1VTQl9TVE9SQUdFX0hQODIwMGU9eQotQ09ORklHX1VTQl9TVE9SQUdFX1NERFIwOT15Ci1DT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1PXkKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MSUJVU1VBTCBpcyBub3Qgc2V0CiAKICMKICMgVVNCIElucHV0IERldmljZXMKICMKIENPTkZJR19VU0JfSElEPXkKIENPTkZJR19VU0JfSElESU5QVVQ9eQorIyBDT05GSUdfVVNCX0hJRElOUFVUX1BPV0VSQk9PSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfRkYgaXMgbm90IHNldAogQ09ORklHX1VTQl9ISURERVY9eQogIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX1dBQ09NPW0KLUNPTkZJR19VU0JfS0JUQUI9bQorIyBDT05GSUdfVVNCX1dBQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BQ0VDQUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tCVEFCIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9QT1dFUk1BVEUgaXMgbm90IHNldAotQ09ORklHX1VTQl9NVE9VQ0g9bQotQ09ORklHX1VTQl9FR0FMQVg9bQorIyBDT05GSUdfVVNCX01UT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVRNVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VHQUxBWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWUVBTElOSyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfWFBBRCBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX0FUSV9SRU1PVEU9bQorIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CiAKICMKICMgVVNCIEltYWdpbmcgZGV2aWNlcwogIwotQ09ORklHX1VTQl9NREM4MDA9bQotQ09ORklHX1VTQl9NSUNST1RFSz1tCisjIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NSUNST1RFSyBpcyBub3Qgc2V0CiAKICMKICMgVVNCIE11bHRpbWVkaWEgZGV2aWNlcwogIwogIyBDT05GSUdfVVNCX0RBQlVTQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfVklDQU0gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0RTQlIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0lCTUNBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfS09OSUNBV0MgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX09WNTExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TRTQwMSBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX1NOOUMxMDI9bQotIyBDT05GSUdfVVNCX1NUVjY4MCBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX1c5OTY4Q0Y9bQorCisjCisjIFZpZGVvNExpbnV4IHN1cHBvcnQgaXMgbmVlZGVkIGZvciBVU0IgTXVsdGltZWRpYSBkZXZpY2Ugc3VwcG9ydAorIwogCiAjCiAjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCiAjCi1DT05GSUdfVVNCX0NBVEM9bQotQ09ORklHX1VTQl9LQVdFVEg9bQotQ09ORklHX1VTQl9QRUdBU1VTPW0KLUNPTkZJR19VU0JfUlRMODE1MD1tCi1DT05GSUdfVVNCX1VTQk5FVD1tCi0KLSMKLSMgVVNCIEhvc3QtdG8tSG9zdCBDYWJsZXMKLSMKLUNPTkZJR19VU0JfQUxJX001NjMyPXkKLUNPTkZJR19VU0JfQU4yNzIwPXkKLUNPTkZJR19VU0JfQkVMS0lOPXkKLUNPTkZJR19VU0JfR0VORVNZUz15Ci1DT05GSUdfVVNCX05FVDEwODA9eQotQ09ORklHX1VTQl9QTDIzMDE9eQotQ09ORklHX1VTQl9LQzIxOTA9eQotCi0jCi0jIEludGVsbGlnZW50IFVTQiBEZXZpY2VzL0dhZGdldHMKLSMKLUNPTkZJR19VU0JfQVJNTElOVVg9eQotQ09ORklHX1VTQl9FUFNPTjI4ODg9eQotQ09ORklHX1VTQl9aQVVSVVM9eQotQ09ORklHX1VTQl9DRENFVEhFUj15Ci0KLSMKLSMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKLSMKLUNPTkZJR19VU0JfQVg4ODE3WD15CisjIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01PTiBpcyBub3Qgc2V0CiAKICMKICMgVVNCIHBvcnQgZHJpdmVycwogIwotQ09ORklHX1VTQl9VU1M3MjA9bQogCiAjCiAjIFVTQiBTZXJpYWwgQ29udmVydGVyIHN1cHBvcnQKICMKLUNPTkZJR19VU0JfU0VSSUFMPW0KLUNPTkZJR19VU0JfU0VSSUFMX0dFTkVSSUM9eQotQ09ORklHX1VTQl9TRVJJQUxfQkVMS0lOPW0KLUNPTkZJR19VU0JfU0VSSUFMX0RJR0lfQUNDRUxFUE9SVD1tCi1DT05GSUdfVVNCX1NFUklBTF9DWVBSRVNTX004PW0KLUNPTkZJR19VU0JfU0VSSUFMX0VNUEVHPW0KLUNPTkZJR19VU0JfU0VSSUFMX0ZURElfU0lPPW0KLSMgQ09ORklHX1VTQl9TRVJJQUxfVklTT1IgaXMgbm90IHNldAotQ09ORklHX1VTQl9TRVJJQUxfSVBBUT1tCi0jIENPTkZJR19VU0JfU0VSSUFMX0lSIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfU0VSSUFMX0VER0VQT1JUPW0KLSMgQ09ORklHX1VTQl9TRVJJQUxfRURHRVBPUlRfVEkgaXMgbm90IHNldAotQ09ORklHX1VTQl9TRVJJQUxfR0FSTUlOPW0KLUNPTkZJR19VU0JfU0VSSUFMX0lQVz1tCi1DT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1BEQT1tCi1DT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOPW0KLSMgQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9NUFIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTI4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0EyOFggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTI4WEEgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTI4WEIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTE5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0ExOFggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTE5VyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMTlRVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMTlRSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBNDlXIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0E0OVdMQyBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX1NFUklBTF9LTFNJPW0KLSMgQ09ORklHX1VTQl9TRVJJQUxfS09CSUxfU0NUIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfU0VSSUFMX01DVF9VMjMyPW0KLUNPTkZJR19VU0JfU0VSSUFMX1BMMjMwMz1tCi0jIENPTkZJR19VU0JfU0VSSUFMX1NBRkUgaXMgbm90IHNldAotQ09ORklHX1VTQl9TRVJJQUxfVEk9bQotQ09ORklHX1VTQl9TRVJJQUxfQ1lCRVJKQUNLPW0KLUNPTkZJR19VU0JfU0VSSUFMX1hJUkNPTT1tCi1DT05GSUdfVVNCX1NFUklBTF9PTU5JTkVUPW0KLUNPTkZJR19VU0JfRVpVU0I9eQorIyBDT05GSUdfVVNCX1NFUklBTCBpcyBub3Qgc2V0CiAKICMKICMgVVNCIE1pc2NlbGxhbmVvdXMgZHJpdmVycwogIwotQ09ORklHX1VTQl9FTUk2Mj1tCi1DT05GSUdfVVNCX0VNSTI2PW0KLUNPTkZJR19VU0JfQVVFUlNXQUxEPW0KLUNPTkZJR19VU0JfUklPNTAwPW0KLUNPTkZJR19VU0JfTEVHT1RPV0VSPW0KLUNPTkZJR19VU0JfTENEPW0KLUNPTkZJR19VU0JfTEVEPW0KLUNPTkZJR19VU0JfQ1lUSEVSTT1tCi1DT05GSUdfVVNCX1BISURHRVRLSVQ9bQotQ09ORklHX1VTQl9QSElER0VUU0VSVk89bQotQ09ORklHX1VTQl9JRE1PVVNFPW0KLUNPTkZJR19VU0JfVEVTVD1tCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVUVSU1dBTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVEtJVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVFNFUlZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TSVNVU0JWR0EgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKIAogIwotIyBVU0IgQVRNL0RTTCBkcml2ZXJzCisjIFVTQiBEU0wgbW9kZW0gc3VwcG9ydAogIwotQ09ORklHX1VTQl9BVE09bQotQ09ORklHX1VTQl9TUEVFRFRPVUNIPW0KIAogIwogIyBVU0IgR2FkZ2V0IFN1cHBvcnQKQEAgLTE4NDIsNjQgKzExMDQsMjAyIEBACiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKIAogIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCiAjIEluZmluaUJhbmQgc3VwcG9ydAogIwotQ09ORklHX0lORklOSUJBTkQ9bQotQ09ORklHX0lORklOSUJBTkRfTVRIQ0E9bQotIyBDT05GSUdfSU5GSU5JQkFORF9NVEhDQV9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfSU5GSU5JQkFORF9JUE9JQj1tCi0jIENPTkZJR19JTkZJTklCQU5EX0lQT0lCX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAogCiAjCi0jIFdhdGNoZG9nIENhcmRzCisjIFNOIERldmljZXMKICMKLUNPTkZJR19XQVRDSERPRz15Ci0jIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CiAKICMKLSMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKKyMgTWlzYyBMaW51eC9TUEFSQyBkcml2ZXJzCiAjCi1DT05GSUdfU09GVF9XQVRDSERPRz1tCi1DT05GSUdfV0FUQ0hET0dfQ1AxWFhYPW0KLUNPTkZJR19XQVRDSERPR19SSU89bQorQ09ORklHX1NVTl9PUEVOUFJPTUlPPW0KK0NPTkZJR19TVU5fTU9TVEVLX1JUQz15CisjIENPTkZJR19PQlBfRkxBU0ggaXMgbm90IHNldAorIyBDT05GSUdfU1VOX0JQUCBpcyBub3Qgc2V0CisjIENPTkZJR19CQkNfSTJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOVkNUUkwgaXMgbm90IHNldAorIyBDT05GSUdfRElTUExBWTdTRUcgaXMgbm90IHNldAogCiAjCi0jIFBDSS1iYXNlZCBXYXRjaGRvZyBDYXJkcworIyBGaWJyZSBDaGFubmVsIHN1cHBvcnQKICMKLUNPTkZJR19QQ0lQQ1dBVENIRE9HPW0KLUNPTkZJR19XRFRQQ0k9bQotQ09ORklHX1dEVF81MDFfUENJPXkKKyMgQ09ORklHX0ZDNCBpcyBub3Qgc2V0CiAKICMKLSMgVVNCLWJhc2VkIFdhdGNoZG9nIENhcmRzCisjIEZpbGUgc3lzdGVtcwogIwotQ09ORklHX1VTQlBDV0FUQ0hET0c9bQorQ09ORklHX0VYVDJfRlM9eQorQ09ORklHX0VYVDJfRlNfWEFUVFI9eQorQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMPXkKK0NPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZPXkKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKK0NPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTD15CitDT05GSUdfRVhUM19GU19TRUNVUklUWT15CitDT05GSUdfSkJEPXkKKyMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfRlNfTUJDQUNIRT15CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0ZTX1BPU0lYX0FDTD15CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CiAKICMKLSMgUHJvZmlsaW5nIHN1cHBvcnQKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKK0NPTkZJR19IVUdFVExCRlM9eQorQ09ORklHX0hVR0VUTEJfUEFHRT15CitDT05GSUdfUkFNRlM9eQorQ09ORklHX1JFTEFZRlNfRlM9bQorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCisjIENPTkZJR19ORlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorQ09ORklHX1NVTl9QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCitDT05GSUdfTkxTPW0KK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTkxTX0NPREVQQUdFXzQzNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorCisjCisjIEluc3RydW1lbnRhdGlvbiBTdXBwb3J0CiAjCiBDT05GSUdfUFJPRklMSU5HPXkKIENPTkZJR19PUFJPRklMRT1tCitDT05GSUdfS1BST0JFUz15CiAKICMKICMgS2VybmVsIGhhY2tpbmcKICMKLUNPTkZJR19ERUJVR19LRVJORUw9eQorQ09ORklHX1BSSU5US19USU1FPXkKIENPTkZJR19NQUdJQ19TWVNSUT15CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE4CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQogQ09ORklHX1NDSEVEU1RBVFM9eQogIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQogIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRlM9eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorQ09ORklHX0ZPUkNFRF9JTkxJTklORz15CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKLUNPTkZJR19LUFJPQkVTPXkKICMgQ09ORklHX0RFQlVHX0RDRkxVU0ggaXMgbm90IHNldAogIyBDT05GSUdfU1RBQ0tfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfQk9PVE1FTSBpcyBub3Qgc2V0Ci1DT05GSUdfSEFWRV9ERUNfTE9DSz15CisjIENPTkZJR19ERUJVR19QQUdFQUxMT0MgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKQEAgLTE5NDUsNiArMTM0NSw3IEBACiAjIExpYnJhcnkgcm91dGluZXMKICMKIENPTkZJR19DUkNfQ0NJVFQ9bQorQ09ORklHX0NSQzE2PW0KIENPTkZJR19DUkMzMj15CiBDT05GSUdfTElCQ1JDMzJDPW0KIENPTkZJR19aTElCX0lORkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvTWFrZWZpbGUKaW5kZXggNmYwMGFiOC4uODNkNjdlYiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL01ha2VmaWxlCkBAIC0xNiw3ICsxNiw3IEBACiBvYmotJChDT05GSUdfUENJKQkgKz0gZWJ1cy5vIGlzYS5vIHBjaV9jb21tb24ubyBwY2lfaW9tbXUubyBcCiAJCQkgICAgcGNpX3BzeWNoby5vIHBjaV9zYWJyZS5vIHBjaV9zY2hpem8ubwogb2JqLSQoQ09ORklHX1NNUCkJICs9IHNtcC5vIHRyYW1wb2xpbmUubwotb2JqLSQoQ09ORklHX1NQQVJDMzJfQ09NUEFUKSArPSBzeXMzMi5vIHN5c19zcGFyYzMyLm8gc2lnbmFsMzIubyBpb2N0bDMyLm8KK29iai0kKENPTkZJR19TUEFSQzMyX0NPTVBBVCkgKz0gc3lzMzIubyBzeXNfc3BhcmMzMi5vIHNpZ25hbDMyLm8KIG9iai0kKENPTkZJR19CSU5GTVRfRUxGMzIpICs9IGJpbmZtdF9lbGYzMi5vCiBvYmotJChDT05GSUdfQklORk1UX0FPVVQzMikgKz0gYmluZm10X2FvdXQzMi5vCiBvYmotJChDT05GSUdfTU9EVUxFUykgKz0gbW9kdWxlLm8KQEAgLTQwLDUgKzQwLDMgQEAKIAogaGVhZC5vOiBoZWFkLlMgdHRhYmxlLlMgaXRsYl9iYXNlLlMgZHRsYl9iYXNlLlMgZHRsYl9iYWNrZW5kLlMgZHRsYl9wcm90LlMgXAogCWV0cmFwLlMgcnRyYXAuUyB3aW5maXh1cC5TIGVudHJ5LlMKLQotQ0ZMQUdTX2lvY3RsMzIubyArPSAtSWZzLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9iaW5mbXRfYW91dDMyLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2JpbmZtdF9hb3V0MzIuYwppbmRleCBlZGY1MmQwNi4uMjAyYTgwYyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9iaW5mbXRfYW91dDMyLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9iaW5mbXRfYW91dDMyLmMKQEAgLTM2LDggKzM2LDYgQEAKIHN0YXRpYyBpbnQgbG9hZF9hb3V0MzJfbGlicmFyeShzdHJ1Y3QgZmlsZSopOwogc3RhdGljIGludCBhb3V0MzJfY29yZV9kdW1wKGxvbmcgc2lnbnIsIHN0cnVjdCBwdF9yZWdzICogcmVncywgc3RydWN0IGZpbGUgKmZpbGUpOwogCi1leHRlcm4gdm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgdXNlciAqKTsKLQogc3RhdGljIHN0cnVjdCBsaW51eF9iaW5mbXQgYW91dDMyX2Zvcm1hdCA9IHsKIAlOVUxMLCBUSElTX01PRFVMRSwgbG9hZF9hb3V0MzJfYmluYXJ5LCBsb2FkX2FvdXQzMl9saWJyYXJ5LCBhb3V0MzJfY29yZV9kdW1wLAogCVBBR0VfU0laRQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9lYnVzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2VidXMuYwppbmRleCA2ZmZiZWI3Li43OTkxZTkxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2VidXMuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2VidXMuYwpAQCAtNTI3LDE4ICs1MjcsMTIgQEAKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHN0YXJ0OwogCi0JZG8gewotCQlwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfU1VOLCBQQ0lfQU5ZX0lELCBwZGV2KTsKLQkJaWYgKHBkZXYgJiYKLQkJICAgIChwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TVU5fRUJVUyB8fAotCQkgICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NVTl9SSU9fRUJVUykpCisJd2hpbGUgKChwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9TVU4sIFBDSV9BTllfSUQsIHBkZXYpKSkKKwkJaWYgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NVTl9FQlVTIHx8CisJCQlwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TVU5fUklPX0VCVVMpCiAJCQlicmVhazsKLQl9IHdoaWxlIChwZGV2ICE9IE5VTEwpOwogCi0JaWYgKHBkZXYgJiYgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NVTl9SSU9fRUJVUykpCi0JCSppc19yaW9fcCA9IDE7Ci0JZWxzZQotCQkqaXNfcmlvX3AgPSAwOworCSppc19yaW9fcCA9ICEhKHBkZXYgJiYgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NVTl9SSU9fRUJVUykpOwogCiAJcmV0dXJuIHBkZXY7CiB9CkBAIC02MzcsNiArNjMxLDcgQEAKIAkJZWJ1cy0+aXNfcmlvID0gaXNfcmlvOwogCQkrK251bV9lYnVzOwogCX0KKwlwY2lfZGV2X3B1dChwZGV2KTsgLyogWFhYIGZvciB0aGUgY2FzZSwgd2hlbiBlYnVzbmQgaXMgMCwgaXMgaXQgT0s/ICovCiAKICNpZmRlZiBDT05GSUdfU1VOX0FVWElPCiAJYXV4aW9fcHJvYmUoKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZW50cnkuUwppbmRleCAxMWE4NDg0Li5lNTBlNTZlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9lbnRyeS5TCkBAIC0xNDE2LDcgKzE0MTYsNiBAQAogCSBhZGQJCSVzcCwgUFRSRUdTX09GRiwgJW8wCiAKIAkuZ2xvYmwJc3lzX3BpcGUsIHN5c19zaWdwYXVzZSwgc3lzX25pc19zeXNjYWxsCi0JLmdsb2JsCXN5c19zaWdzdXNwZW5kLCBzeXNfcnRfc2lnc3VzcGVuZAogCS5nbG9ibAlzeXNfcnRfc2lncmV0dXJuCiAJLmdsb2JsCXN5c19wdHJhY2UKIAkuZ2xvYmwJc3lzX3NpZ2FsdHN0YWNrCkBAIC0xNDQwLDI4ICsxNDM5LDYgQEAKIAkJIG1vdgkJJWk2LCAlbzIKICNlbmRpZgogCQkuYWxpZ24JCTMyCi1zeXNfc2lnc3VzcGVuZDoJYWRkCQklc3AsIFBUUkVHU19PRkYsICVvMAotCQljYWxsCQlkb19zaWdzdXNwZW5kCi0JCSBhZGQJCSVvNywgMWYtLi00LCAlbzcKLQkJbm9wCi1zeXNfcnRfc2lnc3VzcGVuZDogLyogTk9URTogJW8wLCVvMSBoYXZlIGEgY29ycmVjdCB2YWx1ZSBhbHJlYWR5ICovCi0JCWFkZAkJJXNwLCBQVFJFR1NfT0ZGLCAlbzIKLQkJY2FsbAkJZG9fcnRfc2lnc3VzcGVuZAotCQkgYWRkCQklbzcsIDFmLS4tNCwgJW83Ci0JCW5vcAotI2lmZGVmIENPTkZJR19DT01QQVQKLQkuZ2xvYmwJc3lzMzJfcnRfc2lnc3VzcGVuZAotc3lzMzJfcnRfc2lnc3VzcGVuZDogLyogTk9URTogJW8wLCVvMSBoYXZlIGEgY29ycmVjdCB2YWx1ZSBhbHJlYWR5ICovCi0JCXNybAkJJW8wLCAwLCAlbzAKLQkJYWRkCQklc3AsIFBUUkVHU19PRkYsICVvMgotCQljYWxsCQlkb19ydF9zaWdzdXNwZW5kMzIKLQkJIGFkZAkJJW83LCAxZi0uLTQsICVvNwotI2VuZGlmCi0JCS8qIE5PVEU6ICVvMCBoYXMgYSBjb3JyZWN0IHZhbHVlIGFscmVhZHkgKi8KLXN5c19zaWdwYXVzZToJYWRkCQklc3AsIFBUUkVHU19PRkYsICVvMQotCQljYWxsCQlkb19zaWdwYXVzZQotCQkgYWRkCQklbzcsIDFmLS4tNCwgJW83Ci0JCW5vcAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkuZ2xvYmwJc3lzMzJfc2lncmV0dXJuCiBzeXMzMl9zaWdyZXR1cm46CkBAIC0xNjU3LDEzICsxNjM0LDEwIEBACiAJLyogQ2hlY2sgaWYgZm9yY2Vfc3VjY2Vzc2Z1bF9zeXNjYWxsX3JldHVybigpCiAJICogd2FzIGludm9rZWQuCiAJICovCi0JbGR1YgkJWyVjdXJwdHIgKyBUSV9TWVNfTk9FUlJPUl0sICVsMAotCWJyeixwdAkJJWwwLCAxZgotCSBub3AKLQliYSxwdAkJJXhjYywgODBmCisJbGR1YiAgICAgICAgICAgIFslY3VycHRyICsgVElfU1lTX05PRVJST1JdLCAlbDIKKwlicm56LGEscG4gICAgICAgJWwyLCA4MGYKIAkgc3RiCQklZzAsIFslY3VycHRyICsgVElfU1lTX05PRVJST1JdCiAKLTE6CiAJY21wCQklbzAsIC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0sKIAliZ2V1LHBuCQkleGNjLCAxZgogCSBhbmRjYwkJJWwwLCAoX1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU0VDQ09NUHxfVElGX1NZU0NBTExfQVVESVQpLCAlbDYKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaW9jdGwzMi5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9pb2N0bDMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NmIyMDguLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9pb2N0bDMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiAkSWQ6IGlvY3RsMzIuYyx2IDEuMTM2IDIwMDIvMDEvMTQgMDk6NDk6NTIgZGF2ZW0gRXhwICQKLSAqIGlvY3RsMzIuYzogQ29udmVyc2lvbiBiZXR3ZWVuIDMyYml0IGFuZCA2NGJpdCBuYXRpdmUgaW9jdGxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwICBKYWt1YiBKZWxpbmVrICAoamFrdWJAcmVkaGF0LmNvbSkKLSAqIENvcHlyaWdodCAoQykgMTk5OCAgRWRkaWUgQy4gRG9zdCAgKGVjZEBza3luZXQuYmUpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFBhdmVsIE1hY2hlayAocGF2ZWxAc3VzZS5jeikKLSAqCi0gKiBUaGVzZSByb3V0aW5lcyBtYWludGFpbiBhcmd1bWVudCBzaXplIGNvbnZlcnNpb24gYmV0d2VlbiAzMmJpdCBhbmQgNjRiaXQKLSAqIGlvY3Rscy4KLSAqLwotCi0jZGVmaW5lIElOQ0xVREVTCi0jaW5jbHVkZSAiY29tcGF0X2lvY3RsLmMiCi0jaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KLQotI2RlZmluZSBDT0RFCi0jaW5jbHVkZSAiY29tcGF0X2lvY3RsLmMiCi0KLSNkZWZpbmUgQ09NUEFUSUJMRV9JT0NUTChjbWQpCQlIQU5ETEVfSU9DVEwoKGNtZCksc3lzX2lvY3RsKQotI2RlZmluZSBIQU5ETEVfSU9DVEwoY21kLGhhbmRsZXIpCXsgKGNtZCksIChpb2N0bF90cmFuc19oYW5kbGVyX3QpKGhhbmRsZXIpLCBOVUxMIH0sCi0jZGVmaW5lIElPQ1RMX1RBQkxFX1NUQVJUIFwKLQlzdHJ1Y3QgaW9jdGxfdHJhbnMgaW9jdGxfc3RhcnRbXSA9IHsKLSNkZWZpbmUgSU9DVExfVEFCTEVfRU5EIFwKLQl9OwotCi1JT0NUTF9UQUJMRV9TVEFSVAotI2luY2x1ZGUgPGxpbnV4L2NvbXBhdF9pb2N0bC5oPgotI2RlZmluZSBERUNMQVJFUwotI2luY2x1ZGUgImNvbXBhdF9pb2N0bC5jIgotI2lmIDAKLUhBTkRMRV9JT0NUTChSVEMzMl9JUlFQX1JFQUQsIGRvX3J0Y19pb2N0bCkKLUhBTkRMRV9JT0NUTChSVEMzMl9JUlFQX1NFVCwgZG9fcnRjX2lvY3RsKQotSEFORExFX0lPQ1RMKFJUQzMyX0VQT0NIX1JFQUQsIGRvX3J0Y19pb2N0bCkKLUhBTkRMRV9JT0NUTChSVEMzMl9FUE9DSF9TRVQsIGRvX3J0Y19pb2N0bCkKLSNlbmRpZgotLyogdGFrZSBjYXJlIG9mIHNpemVvZihzaXplb2YoKSkgYnJlYWthZ2UgKi8KLUlPQ1RMX1RBQkxFX0VORAotCi1pbnQgaW9jdGxfdGFibGVfc2l6ZSA9IEFSUkFZX1NJWkUoaW9jdGxfc3RhcnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2twcm9iZXMuYwppbmRleCBhOTdiMGYwLi5iOWE5Y2U3IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2twcm9iZXMuYwpAQCAtNDMsMTQgKzQzLDEwIEBACiAKIGludCBfX2twcm9iZXMgYXJjaF9wcmVwYXJlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewotCXJldHVybiAwOwotfQotCi12b2lkIF9fa3Byb2JlcyBhcmNoX2NvcHlfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCi17CiAJcC0+YWluc24uaW5zblswXSA9ICpwLT5hZGRyOwogCXAtPmFpbnNuLmluc25bMV0gPSBCUkVBS1BPSU5UX0lOU1RSVUNUSU9OXzI7CiAJcC0+b3Bjb2RlID0gKnAtPmFkZHI7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgX19rcHJvYmVzIGFyY2hfYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQpAQCAtNjUsMTAgKzYxLDYgQEAKIAlmbHVzaGkocC0+YWRkcik7CiB9CiAKLXZvaWQgX19rcHJvYmVzIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQotewotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9wcmV2aW91c19rcHJvYmUoc3RydWN0IGtwcm9iZV9jdGxibGsgKmtjYikKIHsKIAlrY2ItPnByZXZfa3Byb2JlLmtwID0ga3Byb2JlX3J1bm5pbmcoKTsKQEAgLTE0Myw2ICsxMzUsMTQgQEAKIAkJCXByZXBhcmVfc2luZ2xlc3RlcChwLCByZWdzLCBrY2IpOwogCQkJcmV0dXJuIDE7CiAJCX0gZWxzZSB7CisJCQlpZiAoKih1MzIgKilhZGRyICE9IEJSRUFLUE9JTlRfSU5TVFJVQ1RJT04pIHsKKwkJCS8qIFRoZSBicmVha3BvaW50IGluc3RydWN0aW9uIHdhcyByZW1vdmVkIGJ5CisJCQkgKiBhbm90aGVyIGNwdSByaWdodCBhZnRlciB3ZSBoaXQsIG5vIGZ1cnRoZXIKKwkJCSAqIGhhbmRsaW5nIG9mIHRoaXMgaW50ZXJydXB0IGlzIGFwcHJvcHJpYXRlCisJCQkgKi8KKwkJCQlyZXQgPSAxOworCQkJCWdvdG8gbm9fa3Byb2JlOworCQkJfQogCQkJcCA9IF9fZ2V0X2NwdV92YXIoY3VycmVudF9rcHJvYmUpOwogCQkJaWYgKHAtPmJyZWFrX2hhbmRsZXIgJiYgcC0+YnJlYWtfaGFuZGxlcihwLCByZWdzKSkKIAkJCQlnb3RvIHNzX3Byb2JlOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wb3dlci5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wb3dlci5jCmluZGV4IDllODM2MmUuLjMwYmNhZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcG93ZXIuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Bvd2VyLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2VidXMuaD4KQEAgLTcwLDYgKzcxLDkgQEAKIAltYWNoaW5lX2hhbHQoKTsKIH0KIAordm9pZCAoKnBtX3Bvd2VyX29mZikodm9pZCkgPSBtYWNoaW5lX3Bvd2VyX29mZjsKK0VYUE9SVF9TWU1CT0wocG1fcG93ZXJfb2ZmKTsKKwogI2lmZGVmIENPTkZJR19QQ0kKIHN0YXRpYyBpbnQgcG93ZXJkKHZvaWQgKl9fdW51c2VkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYwppbmRleCAwMmY5ZGVjLi4wNTliMGQwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYwpAQCAtMTY0LDYgKzE2NCw3IEBACiAJcGFuaWMoIlJlYm9vdCBmYWlsZWQhIik7CiB9CiAKKyNpZmRlZiBDT05GSUdfQ09NUEFUCiBzdGF0aWMgdm9pZCBzaG93X3JlZ3dpbmRvdzMyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCByZWdfd2luZG93MzIgX191c2VyICpydzsKQEAgLTE4OSw2ICsxOTAsOSBAQAogCSAgICAgICByX3cuaW5zWzBdLCByX3cuaW5zWzFdLCByX3cuaW5zWzJdLCByX3cuaW5zWzNdLAogCSAgICAgICByX3cuaW5zWzRdLCByX3cuaW5zWzVdLCByX3cuaW5zWzZdLCByX3cuaW5zWzddKTsKIH0KKyNlbHNlCisjZGVmaW5lIHNob3dfcmVnd2luZG93MzIocmVncykJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCiAKIHN0YXRpYyB2b2lkIHNob3dfcmVnd2luZG93KHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewpAQCAtMzkwLDcgKzM5NCw3IEBACiAKIHVuc2lnbmVkIGxvbmcgdGhyZWFkX3NhdmVkX3BjKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSB0c2stPnRocmVhZF9pbmZvOworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSB0YXNrX3RocmVhZF9pbmZvKHRzayk7CiAJdW5zaWduZWQgbG9uZyByZXQgPSAweGRlYWRiZWVmVUw7CiAJCiAJaWYgKHRpICYmIHRpLT5rc3ApIHsKQEAgLTYxNiwxMSArNjIwLDExIEBACiAJCXVuc2lnbmVkIGxvbmcgdW51c2VkLAogCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdCA9IHAtPnRocmVhZF9pbmZvOworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdCA9IHRhc2tfdGhyZWFkX2luZm8ocCk7CiAJY2hhciAqY2hpbGRfdHJhcF9mcmFtZTsKIAogCS8qIENhbGN1bGF0ZSBvZmZzZXQgdG8gc3RhY2tfZnJhbWUgJiBwdF9yZWdzICovCi0JY2hpbGRfdHJhcF9mcmFtZSA9ICgoY2hhciAqKXQpICsgKFRIUkVBRF9TSVpFIC0gKFRSQUNFUkVHX1NaK1NUQUNLRlJBTUVfU1opKTsKKwljaGlsZF90cmFwX2ZyYW1lID0gdGFza19zdGFja19wYWdlKHApICsgKFRIUkVBRF9TSVpFIC0gKFRSQUNFUkVHX1NaK1NUQUNLRlJBTUVfU1opKTsKIAltZW1jcHkoY2hpbGRfdHJhcF9mcmFtZSwgKCgoc3RydWN0IHNwYXJjX3N0YWNrZiAqKXJlZ3MpLTEpLCAoVFJBQ0VSRUdfU1orU1RBQ0tGUkFNRV9TWikpOwogCiAJdC0+ZmxhZ3MgPSAodC0+ZmxhZ3MgJiB+KCgweGZmVUwgPDwgVElfRkxBR19DV1BfU0hJRlQpIHwgKDB4ZmZVTCA8PCBUSV9GTEFHX0NVUlJFTlRfRFNfU0hJRlQpKSkgfApAQCAtODQ1LDkgKzg0OSw5IEBACiAgICAgICAgICAgICB0YXNrLT5zdGF0ZSA9PSBUQVNLX1JVTk5JTkcpCiAJCWdvdG8gb3V0OwogCi0JdGhyZWFkX2luZm9fYmFzZSA9ICh1bnNpZ25lZCBsb25nKSB0YXNrLT50aHJlYWRfaW5mbzsKKwl0aHJlYWRfaW5mb19iYXNlID0gKHVuc2lnbmVkIGxvbmcpIHRhc2tfc3RhY2tfcGFnZSh0YXNrKTsKIAliaWFzID0gU1RBQ0tfQklBUzsKLQlmcCA9IHRhc2stPnRocmVhZF9pbmZvLT5rc3AgKyBiaWFzOworCWZwID0gdGFza190aHJlYWRfaW5mbyh0YXNrKS0+a3NwICsgYmlhczsKIAogCWRvIHsKIAkJLyogQm9ndXMgZnJhbWUgcG9pbnRlcj8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3B0cmFjZS5jCmluZGV4IDc3NGVjYmIuLjNmOTc0NmYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wdHJhY2UuYwpAQCAtMTk4LDM5ICsxOTgsMTUgQEAKIAl9CiAjZW5kaWYKIAlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfVFJBQ0VNRSkgewotCQlpbnQgcmV0OwotCi0JCS8qIGFyZSB3ZSBhbHJlYWR5IGJlaW5nIHRyYWNlZD8gKi8KLQkJaWYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpIHsKLQkJCXB0X2Vycm9yX3JldHVybihyZWdzLCBFUEVSTSk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlyZXQgPSBzZWN1cml0eV9wdHJhY2UoY3VycmVudC0+cGFyZW50LCBjdXJyZW50KTsKLQkJaWYgKHJldCkgewotCQkJcHRfZXJyb3JfcmV0dXJuKHJlZ3MsIC1yZXQpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQkvKiBzZXQgdGhlIHB0cmFjZSBiaXQgaW4gdGhlIHByb2Nlc3MgZmxhZ3MuICovCi0JCWN1cnJlbnQtPnB0cmFjZSB8PSBQVF9QVFJBQ0VEOworCQlyZXQgPSBwdHJhY2VfdHJhY2VtZSgpOwogCQlwdF9zdWNjX3JldHVybihyZWdzLCAwKTsKIAkJZ290byBvdXQ7CiAJfQotI2lmbmRlZiBBTExPV19JTklUX1RSQUNJTkcKLQlpZiAocGlkID09IDEpIHsKLQkJLyogQ2FuJ3QgZG9yayB3aXRoIGluaXQuICovCi0JCXB0X2Vycm9yX3JldHVybihyZWdzLCBFUEVSTSk7Ci0JCWdvdG8gb3V0OwotCX0KLSNlbmRpZgotCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7Ci0JY2hpbGQgPSBmaW5kX3Rhc2tfYnlfcGlkKHBpZCk7Ci0JaWYgKGNoaWxkKQotCQlnZXRfdGFza19zdHJ1Y3QoY2hpbGQpOwotCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAotCWlmICghY2hpbGQpIHsKLQkJcHRfZXJyb3JfcmV0dXJuKHJlZ3MsIEVTUkNIKTsKKwljaGlsZCA9IHB0cmFjZV9nZXRfdGFza19zdHJ1Y3QocGlkKTsKKwlpZiAoSVNfRVJSKGNoaWxkKSkgeworCQlyZXQgPSBQVFJfRVJSKGNoaWxkKTsKKwkJcHRfZXJyb3JfcmV0dXJuKHJlZ3MsIC1yZXQpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTMyMCw3ICsyOTYsNyBAQAogCWNhc2UgUFRSQUNFX0dFVFJFR1M6IHsKIAkJc3RydWN0IHB0X3JlZ3MzMiBfX3VzZXIgKnByZWdzID0KIAkJCShzdHJ1Y3QgcHRfcmVnczMyIF9fdXNlciAqKSBhZGRyOwotCQlzdHJ1Y3QgcHRfcmVncyAqY3JlZ3MgPSBjaGlsZC0+dGhyZWFkX2luZm8tPmtyZWdzOworCQlzdHJ1Y3QgcHRfcmVncyAqY3JlZ3MgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwogCQlpbnQgcnZhbDsKIAogCQlpZiAoX19wdXRfdXNlcih0c3RhdGVfdG9fcHNyKGNyZWdzLT50c3RhdGUpLCAoJnByZWdzLT5wc3IpKSB8fApAQCAtMzQ0LDExICszMjAsMTEgQEAKIAogCWNhc2UgUFRSQUNFX0dFVFJFR1M2NDogewogCQlzdHJ1Y3QgcHRfcmVncyBfX3VzZXIgKnByZWdzID0gKHN0cnVjdCBwdF9yZWdzIF9fdXNlciAqKSBhZGRyOwotCQlzdHJ1Y3QgcHRfcmVncyAqY3JlZ3MgPSBjaGlsZC0+dGhyZWFkX2luZm8tPmtyZWdzOworCQlzdHJ1Y3QgcHRfcmVncyAqY3JlZ3MgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwogCQl1bnNpZ25lZCBsb25nIHRwYyA9IGNyZWdzLT50cGM7CiAJCWludCBydmFsOwogCi0JCWlmICgoY2hpbGQtPnRocmVhZF9pbmZvLT5mbGFncyAmIF9USUZfMzJCSVQpICE9IDApCisJCWlmICgodGFza190aHJlYWRfaW5mbyhjaGlsZCktPmZsYWdzICYgX1RJRl8zMkJJVCkgIT0gMCkKIAkJCXRwYyAmPSAweGZmZmZmZmZmOwogCQlpZiAoX19wdXRfdXNlcihjcmVncy0+dHN0YXRlLCAoJnByZWdzLT50c3RhdGUpKSB8fAogCQkgICAgX19wdXRfdXNlcih0cGMsICgmcHJlZ3MtPnRwYykpIHx8CkBAIC0zNzIsNyArMzQ4LDcgQEAKIAljYXNlIFBUUkFDRV9TRVRSRUdTOiB7CiAJCXN0cnVjdCBwdF9yZWdzMzIgX191c2VyICpwcmVncyA9CiAJCQkoc3RydWN0IHB0X3JlZ3MzMiBfX3VzZXIgKikgYWRkcjsKLQkJc3RydWN0IHB0X3JlZ3MgKmNyZWdzID0gY2hpbGQtPnRocmVhZF9pbmZvLT5rcmVnczsKKwkJc3RydWN0IHB0X3JlZ3MgKmNyZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAkJdW5zaWduZWQgaW50IHBzciwgcGMsIG5wYywgeTsKIAkJaW50IGk7CiAKQEAgLTQwNSw3ICszODEsNyBAQAogCiAJY2FzZSBQVFJBQ0VfU0VUUkVHUzY0OiB7CiAJCXN0cnVjdCBwdF9yZWdzIF9fdXNlciAqcHJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgX191c2VyICopIGFkZHI7Ci0JCXN0cnVjdCBwdF9yZWdzICpjcmVncyA9IGNoaWxkLT50aHJlYWRfaW5mby0+a3JlZ3M7CisJCXN0cnVjdCBwdF9yZWdzICpjcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CiAJCXVuc2lnbmVkIGxvbmcgdHN0YXRlLCB0cGMsIHRucGMsIHk7CiAJCWludCBpOwogCkBAIC00MTksNyArMzk1LDcgQEAKIAkJCXB0X2Vycm9yX3JldHVybihyZWdzLCBFRkFVTFQpOwogCQkJZ290byBvdXRfdHNrOwogCQl9Ci0JCWlmICgoY2hpbGQtPnRocmVhZF9pbmZvLT5mbGFncyAmIF9USUZfMzJCSVQpICE9IDApIHsKKwkJaWYgKCh0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+ZmxhZ3MgJiBfVElGXzMyQklUKSAhPSAwKSB7CiAJCQl0cGMgJj0gMHhmZmZmZmZmZjsKIAkJCXRucGMgJj0gMHhmZmZmZmZmZjsKIAkJfQpAQCAtNDU0LDExICs0MzAsMTEgQEAKIAkJCX0gZnBxWzE2XTsKIAkJfTsKIAkJc3RydWN0IGZwcyBfX3VzZXIgKmZwcyA9IChzdHJ1Y3QgZnBzIF9fdXNlciAqKSBhZGRyOwotCQl1bnNpZ25lZCBsb25nICpmcHJlZ3MgPSBjaGlsZC0+dGhyZWFkX2luZm8tPmZwcmVnczsKKwkJdW5zaWduZWQgbG9uZyAqZnByZWdzID0gdGFza190aHJlYWRfaW5mbyhjaGlsZCktPmZwcmVnczsKIAogCQlpZiAoY29weV90b191c2VyKCZmcHMtPnJlZ3NbMF0sIGZwcmVncywKIAkJCQkgKDMyICogc2l6ZW9mKHVuc2lnbmVkIGludCkpKSB8fAotCQkgICAgX19wdXRfdXNlcihjaGlsZC0+dGhyZWFkX2luZm8tPnhmc3JbMF0sICgmZnBzLT5mc3IpKSB8fAorCQkgICAgX19wdXRfdXNlcih0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+eGZzclswXSwgKCZmcHMtPmZzcikpIHx8CiAJCSAgICBfX3B1dF91c2VyKDAsICgmZnBzLT5mcHFkKSkgfHwKIAkJICAgIF9fcHV0X3VzZXIoMCwgKCZmcHMtPmZsYWdzKSkgfHwKIAkJICAgIF9fcHV0X3VzZXIoMCwgKCZmcHMtPmV4dHJhKSkgfHwKQEAgLTQ3NiwxMSArNDUyLDExIEBACiAJCQl1bnNpZ25lZCBsb25nIGZzcjsKIAkJfTsKIAkJc3RydWN0IGZwcyBfX3VzZXIgKmZwcyA9IChzdHJ1Y3QgZnBzIF9fdXNlciAqKSBhZGRyOwotCQl1bnNpZ25lZCBsb25nICpmcHJlZ3MgPSBjaGlsZC0+dGhyZWFkX2luZm8tPmZwcmVnczsKKwkJdW5zaWduZWQgbG9uZyAqZnByZWdzID0gdGFza190aHJlYWRfaW5mbyhjaGlsZCktPmZwcmVnczsKIAogCQlpZiAoY29weV90b191c2VyKCZmcHMtPnJlZ3NbMF0sIGZwcmVncywKIAkJCQkgKDY0ICogc2l6ZW9mKHVuc2lnbmVkIGludCkpKSB8fAotCQkgICAgX19wdXRfdXNlcihjaGlsZC0+dGhyZWFkX2luZm8tPnhmc3JbMF0sICgmZnBzLT5mc3IpKSkgeworCQkgICAgX19wdXRfdXNlcih0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+eGZzclswXSwgKCZmcHMtPmZzcikpKSB7CiAJCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgRUZBVUxUKTsKIAkJCWdvdG8gb3V0X3RzazsKIAkJfQpAQCAtNTAxLDcgKzQ3Nyw3IEBACiAJCQl9IGZwcVsxNl07CiAJCX07CiAJCXN0cnVjdCBmcHMgX191c2VyICpmcHMgPSAoc3RydWN0IGZwcyBfX3VzZXIgKikgYWRkcjsKLQkJdW5zaWduZWQgbG9uZyAqZnByZWdzID0gY2hpbGQtPnRocmVhZF9pbmZvLT5mcHJlZ3M7CisJCXVuc2lnbmVkIGxvbmcgKmZwcmVncyA9IHRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5mcHJlZ3M7CiAJCXVuc2lnbmVkIGZzcjsKIAogCQlpZiAoY29weV9mcm9tX3VzZXIoZnByZWdzLCAmZnBzLT5yZWdzWzBdLApAQCAtNTEwLDExICs0ODYsMTEgQEAKIAkJCXB0X2Vycm9yX3JldHVybihyZWdzLCBFRkFVTFQpOwogCQkJZ290byBvdXRfdHNrOwogCQl9Ci0JCWNoaWxkLT50aHJlYWRfaW5mby0+eGZzclswXSAmPSAweGZmZmZmZmZmMDAwMDAwMDBVTDsKLQkJY2hpbGQtPnRocmVhZF9pbmZvLT54ZnNyWzBdIHw9IGZzcjsKLQkJaWYgKCEoY2hpbGQtPnRocmVhZF9pbmZvLT5mcHNhdmVkWzBdICYgRlBSU19GRUYpKQotCQkJY2hpbGQtPnRocmVhZF9pbmZvLT5nc3JbMF0gPSAwOwotCQljaGlsZC0+dGhyZWFkX2luZm8tPmZwc2F2ZWRbMF0gfD0gKEZQUlNfRkVGIHwgRlBSU19ETCk7CisJCXRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT54ZnNyWzBdICY9IDB4ZmZmZmZmZmYwMDAwMDAwMFVMOworCQl0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+eGZzclswXSB8PSBmc3I7CisJCWlmICghKHRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5mcHNhdmVkWzBdICYgRlBSU19GRUYpKQorCQkJdGFza190aHJlYWRfaW5mbyhjaGlsZCktPmdzclswXSA9IDA7CisJCXRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5mcHNhdmVkWzBdIHw9IChGUFJTX0ZFRiB8IEZQUlNfREwpOwogCQlwdF9zdWNjX3JldHVybihyZWdzLCAwKTsKIAkJZ290byBvdXRfdHNrOwogCX0KQEAgLTUyNSwxNyArNTAxLDE3IEBACiAJCQl1bnNpZ25lZCBsb25nIGZzcjsKIAkJfTsKIAkJc3RydWN0IGZwcyBfX3VzZXIgKmZwcyA9IChzdHJ1Y3QgZnBzIF9fdXNlciAqKSBhZGRyOwotCQl1bnNpZ25lZCBsb25nICpmcHJlZ3MgPSBjaGlsZC0+dGhyZWFkX2luZm8tPmZwcmVnczsKKwkJdW5zaWduZWQgbG9uZyAqZnByZWdzID0gdGFza190aHJlYWRfaW5mbyhjaGlsZCktPmZwcmVnczsKIAogCQlpZiAoY29weV9mcm9tX3VzZXIoZnByZWdzLCAmZnBzLT5yZWdzWzBdLAogCQkJCSAgICg2NCAqIHNpemVvZih1bnNpZ25lZCBpbnQpKSkgfHwKLQkJICAgIF9fZ2V0X3VzZXIoY2hpbGQtPnRocmVhZF9pbmZvLT54ZnNyWzBdLCAoJmZwcy0+ZnNyKSkpIHsKKwkJICAgIF9fZ2V0X3VzZXIodGFza190aHJlYWRfaW5mbyhjaGlsZCktPnhmc3JbMF0sICgmZnBzLT5mc3IpKSkgewogCQkJcHRfZXJyb3JfcmV0dXJuKHJlZ3MsIEVGQVVMVCk7CiAJCQlnb3RvIG91dF90c2s7CiAJCX0KLQkJaWYgKCEoY2hpbGQtPnRocmVhZF9pbmZvLT5mcHNhdmVkWzBdICYgRlBSU19GRUYpKQotCQkJY2hpbGQtPnRocmVhZF9pbmZvLT5nc3JbMF0gPSAwOwotCQljaGlsZC0+dGhyZWFkX2luZm8tPmZwc2F2ZWRbMF0gfD0gKEZQUlNfRkVGIHwgRlBSU19ETCB8IEZQUlNfRFUpOworCQlpZiAoISh0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+ZnBzYXZlZFswXSAmIEZQUlNfRkVGKSkKKwkJCXRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5nc3JbMF0gPSAwOworCQl0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+ZnBzYXZlZFswXSB8PSAoRlBSU19GRUYgfCBGUFJTX0RMIHwgRlBSU19EVSk7CiAJCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOwogCQlnb3RvIG91dF90c2s7CiAJfQpAQCAtNTg2LDggKzU2Miw4IEBACiAjaWZkZWYgREVCVUdfUFRSQUNFCiAJCXByaW50aygiQ09OVDogJXMgWyVkXTogc2V0IGV4aXRfY29kZSA9ICV4ICVseCAlbHhcbiIsIGNoaWxkLT5jb21tLAogCQkJY2hpbGQtPnBpZCwgY2hpbGQtPmV4aXRfY29kZSwKLQkJCWNoaWxkLT50aHJlYWRfaW5mby0+a3JlZ3MtPnRwYywKLQkJCWNoaWxkLT50aHJlYWRfaW5mby0+a3JlZ3MtPnRucGMpOworCQkJdGFza19wdF9yZWdzKGNoaWxkKS0+dHBjLAorCQkJdGFza19wdF9yZWdzKGNoaWxkKS0+dG5wYyk7CiAJCSAgICAgICAKICNlbmRpZgogCQl3YWtlX3VwX3Byb2Nlc3MoY2hpbGQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9ydHJhcC5TIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9ydHJhcC5TCmluZGV4IDA5MGRjY2EuLmI4MGViYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcnRyYXAuUworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3J0cmFwLlMKQEAgLTUzLDE0ICs1MywxMyBAQAogCQl3cnByCQkJJWcwLCBSVFJBUF9QU1RBVEVfSVJRT0ZGLCAlcHN0YXRlCiAJCWxkeAkJCVslZzYgKyBUSV9GTEFHU10sICVsMAogCi0xOgkJYW5kY2MJCQklbDAsIChfVElGX05PVElGWV9SRVNVTUUgfCBfVElGX1NJR1BFTkRJTkcpLCAlZzAKKzE6CQlhbmRjYwkJCSVsMCwgKF9USUZfU0lHUEVORElORyB8IF9USUZfUkVTVE9SRV9TSUdNQVNLKSwgJWcwCiAJCWJlLHB0CQkJJXhjYywgX19oYW5kbGVfdXNlcl93aW5kb3dzX2NvbnRpbnVlCiAJCSBub3AKLQkJY2xyCQkJJW8wCi0JCW1vdgkJCSVsNSwgJW8yCi0JCW1vdgkJCSVsNiwgJW8zCi0JCWFkZAkJCSVzcCwgUFRSRUdTX09GRiwgJW8xCi0JCW1vdgkJCSVsMCwgJW80CisJCW1vdgkJCSVsNSwgJW8xCisJCW1vdgkJCSVsNiwgJW8yCisJCWFkZAkJCSVzcCwgUFRSRUdTX09GRiwgJW8wCisJCW1vdgkJCSVsMCwgJW8zCiAKIAkJY2FsbAkJCWRvX25vdGlmeV9yZXN1bWUKIAkJIHdycHIJCQklZzAsIFJUUkFQX1BTVEFURSwgJXBzdGF0ZQpAQCAtOTYsMTUgKzk1LDE0IEBACiAJCSB3cnByCQkJJWcwLCBSVFJBUF9QU1RBVEUsICVwc3RhdGUKIAkJd3JwcgkJCSVnMCwgUlRSQVBfUFNUQVRFX0lSUU9GRiwgJXBzdGF0ZQogCQlsZHgJCQlbJWc2ICsgVElfRkxBR1NdLCAlbDAKLTE6CQlhbmRjYwkJCSVsMCwgKF9USUZfTk9USUZZX1JFU1VNRSB8IF9USUZfU0lHUEVORElORyksICVnMAorMToJCWFuZGNjCQkJJWwwLCAoX1RJRl9TSUdQRU5ESU5HIHwgX1RJRl9SRVNUT1JFX1NJR01BU0spLCAlZzAKIAogCQliZSxwdAkJCSV4Y2MsIF9faGFuZGxlX3BlcmZjdHJzX2NvbnRpbnVlCiAJCSBzZXRoaQkJCSVoaShUU1RBVEVfUEVGKSwgJW8wCi0JCWNscgkJCSVvMAotCQltb3YJCQklbDUsICVvMgotCQltb3YJCQklbDYsICVvMwotCQlhZGQJCQklc3AsIFBUUkVHU19PRkYsICVvMQotCQltb3YJCQklbDAsICVvNAorCQltb3YJCQklbDUsICVvMQorCQltb3YJCQklbDYsICVvMgorCQlhZGQJCQklc3AsIFBUUkVHU19PRkYsICVvMAorCQltb3YJCQklbDAsICVvMwogCQljYWxsCQkJZG9fbm90aWZ5X3Jlc3VtZQogCiAJCSB3cnByCQkJJWcwLCBSVFJBUF9QU1RBVEUsICVwc3RhdGUKQEAgLTEyOSwxMSArMTI3LDEwIEBACiAJCWJhLGEscHQJCQkleGNjLCBfX2hhbmRsZV91c2VyZnB1X2NvbnRpbnVlCiAKIF9faGFuZGxlX3NpZ25hbDoKLQkJY2xyCQkJJW8wCi0JCW1vdgkJCSVsNSwgJW8yCi0JCW1vdgkJCSVsNiwgJW8zCi0JCWFkZAkJCSVzcCwgUFRSRUdTX09GRiwgJW8xCi0JCW1vdgkJCSVsMCwgJW80CisJCW1vdgkJCSVsNSwgJW8xCisJCW1vdgkJCSVsNiwgJW8yCisJCWFkZAkJCSVzcCwgUFRSRUdTX09GRiwgJW8wCisJCW1vdgkJCSVsMCwgJW8zCiAJCWNhbGwJCQlkb19ub3RpZnlfcmVzdW1lCiAJCSB3cnByCQkJJWcwLCBSVFJBUF9QU1RBVEUsICVwc3RhdGUKIAkJd3JwcgkJCSVnMCwgUlRSQVBfUFNUQVRFX0lSUU9GRiwgJXBzdGF0ZQpAQCAtMjAwLDcgKzE5Nyw3IEBACiAJCSBhbmRjYwkJCSVsMSwgJW8wLCAlZzAKIAkJYW5kY2MJCQklbDAsIF9USUZfTkVFRF9SRVNDSEVELCAlZzAKIAkJYm5lLHBuCQkJJXhjYywgX19oYW5kbGVfcHJlZW1wdGlvbgotCQkgYW5kY2MJCQklbDAsIChfVElGX05PVElGWV9SRVNVTUUgfCBfVElGX1NJR1BFTkRJTkcpLCAlZzAKKwkJIGFuZGNjCQkJJWwwLCAoX1RJRl9TSUdQRU5ESU5HIHwgX1RJRl9SRVNUT1JFX1NJR01BU0spLCAlZzAKIAkJYm5lLHBuCQkJJXhjYywgX19oYW5kbGVfc2lnbmFsCiBfX2hhbmRsZV9zaWduYWxfY29udGludWU6CiAJCSBsZHViCQkJWyVnNiArIFRJX1dTQVZFRF0sICVvMgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IDQ4MTgwNTMuLjA1NDQ2MWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NldHVwLmMKQEAgLTUyMCw3ICs1MjAsNyBAQAogCXJkX2RvbG9hZCA9ICgocmFtX2ZsYWdzICYgUkFNRElTS19MT0FEX0ZMQUcpICE9IDApOwkKICNlbmRpZgogCi0JaW5pdF90YXNrLnRocmVhZF9pbmZvLT5rcmVncyA9ICZmYWtlX3N3YXBwZXJfcmVnczsKKwl0YXNrX3RocmVhZF9pbmZvKCZpbml0X3Rhc2spLT5rcmVncyA9ICZmYWtlX3N3YXBwZXJfcmVnczsKIAogI2lmZGVmIENPTkZJR19JUF9QTlAKIAlpZiAoIWljX3NldF9tYW51YWxseSkgewpAQCAtNTYxLDYgKzU2MSw4IEBACiAJCXNlcmlhbF9jb25zb2xlID0gMTsKIAl9IGVsc2UgaWYgKGlkZXYgPT0gUFJPTURFVl9JVFRZQiAmJiBvZGV2ID09IFBST01ERVZfT1RUWUIpIHsKIAkJc2VyaWFsX2NvbnNvbGUgPSAyOworCX0gZWxzZSBpZiAoaWRldiA9PSBQUk9NREVWX0lSU0MgJiYgb2RldiA9PSBQUk9NREVWX09SU0MpIHsKKwkJc2VyaWFsX2NvbnNvbGUgPSAzOwogCX0gZWxzZSB7CiAJCXByb21fcHJpbnRmKCJJbmNvbnNpc3RlbnQgY29uc29sZTogIgogCQkJICAgICJpbnB1dCAlZCwgb3V0cHV0ICVkXG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2lnbmFsLmMKaW5kZXggNjBmNWRmYS4uY2ExMWE0YyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NpZ25hbC5jCkBAIC0zNiw5ICszNiw2IEBACiAKICNkZWZpbmUgX0JMT0NLQUJMRSAofihzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSkpCiAKLXN0YXRpYyBpbnQgZG9fc2lnbmFsKHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICogcmVncywKLQkJICAgICB1bnNpZ25lZCBsb25nIG9yaWdfbzAsIGludCByZXRfZnJvbV9zeXNjYWxsKTsKLQogLyoge3NldCwgZ2V0fWNvbnRleHQoKSBuZWVkZWQgZm9yIDY0LWJpdCBTcGFyY0xpbnV4IHVzZXJsYW5kLiAqLwogYXNtbGlua2FnZSB2b2lkIHNwYXJjNjRfc2V0X2NvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CkBAIC0yNDIsMTE0ICsyMzksMjkgQEAKIC8qIEFsaWduIG1hY3JvcyAqLwogI2RlZmluZSBSVF9BTElHTkVEU1ogICgoKHNpemVvZihzdHJ1Y3QgcnRfc2lnbmFsX2ZyYW1lKSArIDcpICYgKH43KSkpCiAKLS8qCi0gKiBhdG9taWNhbGx5IHN3YXAgaW4gdGhlIG5ldyBzaWduYWwgbWFzaywgYW5kIHdhaXQgZm9yIGEgc2lnbmFsLgotICogVGhpcyBpcyByZWFsbHkgdHJpY2t5IG9uIHRoZSBTcGFyYywgd2F0Y2ggb3V0Li4uCi0gKi8KLWFzbWxpbmthZ2Ugdm9pZCBfc2lncGF1c2VfY29tbW9uKG9sZF9zaWdzZXRfdCBzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGxvbmcgX3NpZ3BhdXNlX2NvbW1vbihvbGRfc2lnc2V0X3Qgc2V0KQogewotCXNpZ3NldF90IHNhdmVzZXQ7Ci0KLSNpZmRlZiBDT05GSUdfU1BBUkMzMl9DT01QQVQKLQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfMzJCSVQpKSB7Ci0JCWV4dGVybiBhc21saW5rYWdlIHZvaWQgX3NpZ3BhdXNlMzJfY29tbW9uKGNvbXBhdF9vbGRfc2lnc2V0X3QsCi0JCQkJCQkJICBzdHJ1Y3QgcHRfcmVncyAqKTsKLQkJX3NpZ3BhdXNlMzJfY29tbW9uKHNldCwgcmVncyk7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYKIAlzZXQgJj0gX0JMT0NLQUJMRTsKIAlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQlzYXZlc2V0ID0gY3VycmVudC0+YmxvY2tlZDsKKwljdXJyZW50LT5zYXZlZF9zaWdtYXNrID0gY3VycmVudC0+YmxvY2tlZDsKIAlzaWdpbml0c2V0KCZjdXJyZW50LT5ibG9ja2VkLCBzZXQpOwogCXJlY2FsY19zaWdwZW5kaW5nKCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQkKLQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfMzJCSVQpKSB7Ci0JCXJlZ3MtPnRwYyA9IChyZWdzLT50bnBjICYgMHhmZmZmZmZmZik7Ci0JCXJlZ3MtPnRucGMgPSAocmVncy0+dG5wYyArIDQpICYgMHhmZmZmZmZmZjsKLQl9IGVsc2UgewotCQlyZWdzLT50cGMgPSByZWdzLT50bnBjOwotCQlyZWdzLT50bnBjICs9IDQ7Ci0JfQogCi0JLyogQ29uZGl0aW9uIGNvZGVzIGFuZCByZXR1cm4gdmFsdWUgd2hlcmUgc2V0IGhlcmUgZm9yIHNpZ3BhdXNlLAotCSAqIGFuZCBzbyBnb3QgdXNlZCBieSBzZXR1cF9mcmFtZSwgd2hpY2ggYWdhaW4gY2F1c2VzIHNpZ3JldHVybigpCi0JICogdG8gcmV0dXJuIC1FSU5UUi4KLQkgKi8KLQl3aGlsZSAoMSkgewotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJc2NoZWR1bGUoKTsKLQkJLyoKLQkJICogUmV0dXJuIC1FSU5UUiBhbmQgc2V0IGNvbmRpdGlvbiBjb2RlIGhlcmUsCi0JCSAqIHNvIHRoZSBpbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCBhY3R1YWxseSByZXR1cm5zCi0JCSAqIHRoZXNlLgotCQkgKi8KLQkJcmVncy0+dHN0YXRlIHw9IChUU1RBVEVfSUNBUlJZfFRTVEFURV9YQ0FSUlkpOwotCQlyZWdzLT51X3JlZ3NbVVJFR19JMF0gPSBFSU5UUjsKLQkJaWYgKGRvX3NpZ25hbCgmc2F2ZXNldCwgcmVncywgMCwgMCkpCi0JCQlyZXR1cm47Ci0JfQorCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCXNjaGVkdWxlKCk7CisJc2V0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOworCXJldHVybiAtRVJFU1RBUlROT0hBTkQ7CiB9CiAKLWFzbWxpbmthZ2Ugdm9pZCBkb19zaWdwYXVzZSh1bnNpZ25lZCBpbnQgc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2FzbWxpbmthZ2UgbG9uZyBzeXNfc2lncGF1c2UodW5zaWduZWQgaW50IHNldCkKIHsKLQlfc2lncGF1c2VfY29tbW9uKHNldCwgcmVncyk7CisJcmV0dXJuIF9zaWdwYXVzZV9jb21tb24oc2V0KTsKIH0KIAotYXNtbGlua2FnZSB2b2lkIGRvX3NpZ3N1c3BlbmQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCithc21saW5rYWdlIGxvbmcgc3lzX3NpZ3N1c3BlbmQob2xkX3NpZ3NldF90IHNldCkKIHsKLQlfc2lncGF1c2VfY29tbW9uKHJlZ3MtPnVfcmVnc1tVUkVHX0kwXSwgcmVncyk7Ci19Ci0KLWFzbWxpbmthZ2Ugdm9pZCBkb19ydF9zaWdzdXNwZW5kKHNpZ3NldF90IF9fdXNlciAqdXNldCwgc2l6ZV90IHNpZ3NldHNpemUsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXNpZ3NldF90IG9sZHNldCwgc2V0OwotICAgICAgICAKLQkvKiBYWFg6IERvbid0IHByZWNsdWRlIGhhbmRsaW5nIGRpZmZlcmVudCBzaXplZCBzaWdzZXRfdCdzLiAgKi8KLQlpZiAoc2lnc2V0c2l6ZSAhPSBzaXplb2Yoc2lnc2V0X3QpKSB7Ci0JCXJlZ3MtPnRzdGF0ZSB8PSAoVFNUQVRFX0lDQVJSWXxUU1RBVEVfWENBUlJZKTsKLQkJcmVncy0+dV9yZWdzW1VSRUdfSTBdID0gRUlOVkFMOwotCQlyZXR1cm47Ci0JfQotCWlmIChjb3B5X2Zyb21fdXNlcigmc2V0LCB1c2V0LCBzaXplb2Yoc2V0KSkpIHsKLQkJcmVncy0+dHN0YXRlIHw9IChUU1RBVEVfSUNBUlJZfFRTVEFURV9YQ0FSUlkpOwotCQlyZWdzLT51X3JlZ3NbVVJFR19JMF0gPSBFRkFVTFQ7Ci0JCXJldHVybjsKLQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0Jc2lnZGVsc2V0bWFzaygmc2V0LCB+X0JMT0NLQUJMRSk7Ci0Jc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0Jb2xkc2V0ID0gY3VycmVudC0+YmxvY2tlZDsKLQljdXJyZW50LT5ibG9ja2VkID0gc2V0OwotCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQkKLQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfMzJCSVQpKSB7Ci0JCXJlZ3MtPnRwYyA9IChyZWdzLT50bnBjICYgMHhmZmZmZmZmZik7Ci0JCXJlZ3MtPnRucGMgPSAocmVncy0+dG5wYyArIDQpICYgMHhmZmZmZmZmZjsKLQl9IGVsc2UgewotCQlyZWdzLT50cGMgPSByZWdzLT50bnBjOwotCQlyZWdzLT50bnBjICs9IDQ7Ci0JfQotCi0JLyogQ29uZGl0aW9uIGNvZGVzIGFuZCByZXR1cm4gdmFsdWUgd2hlcmUgc2V0IGhlcmUgZm9yIHNpZ3BhdXNlLAotCSAqIGFuZCBzbyBnb3QgdXNlZCBieSBzZXR1cF9mcmFtZSwgd2hpY2ggYWdhaW4gY2F1c2VzIHNpZ3JldHVybigpCi0JICogdG8gcmV0dXJuIC1FSU5UUi4KLQkgKi8KLQl3aGlsZSAoMSkgewotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJc2NoZWR1bGUoKTsKLQkJLyoKLQkJICogUmV0dXJuIC1FSU5UUiBhbmQgc2V0IGNvbmRpdGlvbiBjb2RlIGhlcmUsCi0JCSAqIHNvIHRoZSBpbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCBhY3R1YWxseSByZXR1cm5zCi0JCSAqIHRoZXNlLgotCQkgKi8KLQkJcmVncy0+dHN0YXRlIHw9IChUU1RBVEVfSUNBUlJZfFRTVEFURV9YQ0FSUlkpOwotCQlyZWdzLT51X3JlZ3NbVVJFR19JMF0gPSBFSU5UUjsKLQkJaWYgKGRvX3NpZ25hbCgmb2xkc2V0LCByZWdzLCAwLCAwKSkKLQkJCXJldHVybjsKLQl9CisJcmV0dXJuIF9zaWdwYXVzZV9jb21tb24oc2V0KTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKQEAgLTYwNywyNiArNTE5LDI5IEBACiAgKiB3YW50IHRvIGhhbmRsZS4gVGh1cyB5b3UgY2Fubm90IGtpbGwgaW5pdCBldmVuIHdpdGggYSBTSUdLSUxMIGV2ZW4gYnkKICAqIG1pc3Rha2UuCiAgKi8KLXN0YXRpYyBpbnQgZG9fc2lnbmFsKHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICogcmVncywKLQkJICAgICB1bnNpZ25lZCBsb25nIG9yaWdfaTAsIGludCByZXN0YXJ0X3N5c2NhbGwpCitzdGF0aWMgdm9pZCBkb19zaWduYWwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgb3JpZ19pMCwgaW50IHJlc3RhcnRfc3lzY2FsbCkKIHsKIAlzaWdpbmZvX3QgaW5mbzsKIAlzdHJ1Y3Qgc2lnbmFsX2RlbGl2ZXJfY29va2llIGNvb2tpZTsKIAlzdHJ1Y3Qga19zaWdhY3Rpb24ga2E7CiAJaW50IHNpZ25yOworCXNpZ3NldF90ICpvbGRzZXQ7CiAJCiAJY29va2llLnJlc3RhcnRfc3lzY2FsbCA9IHJlc3RhcnRfc3lzY2FsbDsKIAljb29raWUub3JpZ19pMCA9IG9yaWdfaTA7CiAKLQlpZiAoIW9sZHNldCkKKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJb2xkc2V0ID0gJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2s7CisJZWxzZQogCQlvbGRzZXQgPSAmY3VycmVudC0+YmxvY2tlZDsKIAogI2lmZGVmIENPTkZJR19TUEFSQzMyX0NPTVBBVAogCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCkpIHsKLQkJZXh0ZXJuIGludCBkb19zaWduYWwzMihzaWdzZXRfdCAqLCBzdHJ1Y3QgcHRfcmVncyAqLAotCQkJCSAgICAgICB1bnNpZ25lZCBsb25nLCBpbnQpOwotCQlyZXR1cm4gZG9fc2lnbmFsMzIob2xkc2V0LCByZWdzLCBvcmlnX2kwLAotCQkJCSAgIGNvb2tpZS5yZXN0YXJ0X3N5c2NhbGwpOworCQlleHRlcm4gdm9pZCBkb19zaWduYWwzMihzaWdzZXRfdCAqLCBzdHJ1Y3QgcHRfcmVncyAqLAorCQkJCQl1bnNpZ25lZCBsb25nLCBpbnQpOworCQlkb19zaWduYWwzMihvbGRzZXQsIHJlZ3MsIG9yaWdfaTAsCisJCQkgICAgY29va2llLnJlc3RhcnRfc3lzY2FsbCk7CisJCXJldHVybjsKIAl9CiAjZW5kaWYJCiAKQEAgLTYzNSw3ICs1NTAsMTUgQEAKIAkJaWYgKGNvb2tpZS5yZXN0YXJ0X3N5c2NhbGwpCiAJCQlzeXNjYWxsX3Jlc3RhcnQob3JpZ19pMCwgcmVncywgJmthLnNhKTsKIAkJaGFuZGxlX3NpZ25hbChzaWduciwgJmthLCAmaW5mbywgb2xkc2V0LCByZWdzKTsKLQkJcmV0dXJuIDE7CisKKwkJLyogYSBzaWduYWwgd2FzIHN1Y2Nlc3NmdWxseSBkZWxpdmVyZWQ7IHRoZSBzYXZlZAorCQkgKiBzaWdtYXNrIHdpbGwgaGF2ZSBiZWVuIHN0b3JlZCBpbiB0aGUgc2lnbmFsIGZyYW1lLAorCQkgKiBhbmQgd2lsbCBiZSByZXN0b3JlZCBieSBzaWdyZXR1cm4sIHNvIHdlIGNhbiBzaW1wbHkKKwkJICogY2xlYXIgdGhlIFRJRl9SRVNUT1JFX1NJR01BU0sgZmxhZy4KKwkJICovCisJCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKQorCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CisJCXJldHVybjsKIAl9CiAJaWYgKGNvb2tpZS5yZXN0YXJ0X3N5c2NhbGwgJiYKIAkgICAgKHJlZ3MtPnVfcmVnc1tVUkVHX0kwXSA9PSBFUkVTVEFSVE5PSEFORCB8fApAQCAtNjUyLDE1ICs1NzUsMjEgQEAKIAkJcmVncy0+dHBjIC09IDQ7CiAJCXJlZ3MtPnRucGMgLT0gNDsKIAl9Ci0JcmV0dXJuIDA7CisKKwkvKiBpZiB0aGVyZSdzIG5vIHNpZ25hbCB0byBkZWxpdmVyLCB3ZSBqdXN0IHB1dCB0aGUgc2F2ZWQgc2lnbWFzaworCSAqIGJhY2sKKwkgKi8KKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkgeworCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrLCBOVUxMKTsKKwl9CiB9CiAKLXZvaWQgZG9fbm90aWZ5X3Jlc3VtZShzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJICAgICAgdW5zaWduZWQgbG9uZyBvcmlnX2kwLCBpbnQgcmVzdGFydF9zeXNjYWxsLAordm9pZCBkb19ub3RpZnlfcmVzdW1lKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIG9yaWdfaTAsIGludCByZXN0YXJ0X3N5c2NhbGwsCiAJCSAgICAgIHVuc2lnbmVkIGxvbmcgdGhyZWFkX2luZm9fZmxhZ3MpCiB7Ci0JaWYgKHRocmVhZF9pbmZvX2ZsYWdzICYgX1RJRl9TSUdQRU5ESU5HKQotCQlkb19zaWduYWwob2xkc2V0LCByZWdzLCBvcmlnX2kwLCByZXN0YXJ0X3N5c2NhbGwpOworCWlmICh0aHJlYWRfaW5mb19mbGFncyAmIChfVElGX1NJR1BFTkRJTkcgfCBfVElGX1JFU1RPUkVfU0lHTUFTSykpCisJCWRvX3NpZ25hbChyZWdzLCBvcmlnX2kwLCByZXN0YXJ0X3N5c2NhbGwpOwogfQogCiB2b2lkIHB0cmFjZV9zaWduYWxfZGVsaXZlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgdm9pZCAqY29va2llKQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zaWduYWwzMi5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zaWduYWwzMi5jCmluZGV4IDAwOWE4NmUuLjcwOGJhOWIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2lnbmFsMzIuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NpZ25hbDMyLmMKQEAgLTMyLDkgKzMyLDYgQEAKIAogI2RlZmluZSBfQkxPQ0tBQkxFICh+KHNpZ21hc2soU0lHS0lMTCkgfCBzaWdtYXNrKFNJR1NUT1ApKSkKIAotaW50IGRvX3NpZ25hbDMyKHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQl1bnNpZ25lZCBsb25nIG9yaWdfbzAsIGludCByZXRfZnJvbV9zeXNjYWxsKTsKLQogLyogU2lnbmFsIGZyYW1lczogdGhlIG9yaWdpbmFsIG9uZSAoY29tcGF0aWJsZSB3aXRoIFN1bk9TKToKICAqCiAgKiBTZXQgdXAgYSBzaWduYWwgZnJhbWUuLi4gTWFrZSB0aGUgc3RhY2sgbG9vayB0aGUgd2F5IFN1bk9TCkBAIC0yMjYsMTAyICsyMjMsNiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogYXRvbWljYWxseSBzd2FwIGluIHRoZSBuZXcgc2lnbmFsIG1hc2ssIGFuZCB3YWl0IGZvciBhIHNpZ25hbC4KLSAqIFRoaXMgaXMgcmVhbGx5IHRyaWNreSBvbiB0aGUgU3BhcmMsIHdhdGNoIG91dC4uLgotICovCi1hc21saW5rYWdlIHZvaWQgX3NpZ3BhdXNlMzJfY29tbW9uKGNvbXBhdF9vbGRfc2lnc2V0X3Qgc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzaWdzZXRfdCBzYXZlc2V0OwotCi0Jc2V0ICY9IF9CTE9DS0FCTEU7Ci0Jc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0Jc2F2ZXNldCA9IGN1cnJlbnQtPmJsb2NrZWQ7Ci0Jc2lnaW5pdHNldCgmY3VycmVudC0+YmxvY2tlZCwgc2V0KTsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JCi0JcmVncy0+dHBjID0gcmVncy0+dG5wYzsKLQlyZWdzLT50bnBjICs9IDQ7Ci0JaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKSkgewotCQlyZWdzLT50cGMgJj0gMHhmZmZmZmZmZjsKLQkJcmVncy0+dG5wYyAmPSAweGZmZmZmZmZmOwotCX0KLQotCS8qIENvbmRpdGlvbiBjb2RlcyBhbmQgcmV0dXJuIHZhbHVlIHdoZXJlIHNldCBoZXJlIGZvciBzaWdwYXVzZSwKLQkgKiBhbmQgc28gZ290IHVzZWQgYnkgc2V0dXBfZnJhbWUsIHdoaWNoIGFnYWluIGNhdXNlcyBzaWdyZXR1cm4oKQotCSAqIHRvIHJldHVybiAtRUlOVFIuCi0JICovCi0Jd2hpbGUgKDEpIHsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlKCk7Ci0JCS8qCi0JCSAqIFJldHVybiAtRUlOVFIgYW5kIHNldCBjb25kaXRpb24gY29kZSBoZXJlLAotCQkgKiBzbyB0aGUgaW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwgYWN0dWFsbHkgcmV0dXJucwotCQkgKiB0aGVzZS4KLQkJICovCi0JCXJlZ3MtPnRzdGF0ZSB8PSBUU1RBVEVfSUNBUlJZOwotCQlyZWdzLT51X3JlZ3NbVVJFR19JMF0gPSBFSU5UUjsKLQkJaWYgKGRvX3NpZ25hbDMyKCZzYXZlc2V0LCByZWdzLCAwLCAwKSkKLQkJCXJldHVybjsKLQl9Ci19Ci0KLWFzbWxpbmthZ2Ugdm9pZCBkb19ydF9zaWdzdXNwZW5kMzIodTMyIHVzZXQsIHNpemVfdCBzaWdzZXRzaXplLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzaWdzZXRfdCBvbGRzZXQsIHNldDsKLQljb21wYXRfc2lnc2V0X3Qgc2V0MzI7Ci0gICAgICAgIAotCS8qIFhYWDogRG9uJ3QgcHJlY2x1ZGUgaGFuZGxpbmcgZGlmZmVyZW50IHNpemVkIHNpZ3NldF90J3MuICAqLwotCWlmICgoKGNvbXBhdF9zaXplX3Qpc2lnc2V0c2l6ZSkgIT0gc2l6ZW9mKHNpZ3NldF90KSkgewotCQlyZWdzLT50c3RhdGUgfD0gVFNUQVRFX0lDQVJSWTsKLQkJcmVncy0+dV9yZWdzW1VSRUdfSTBdID0gRUlOVkFMOwotCQlyZXR1cm47Ci0JfQotCWlmIChjb3B5X2Zyb21fdXNlcigmc2V0MzIsIGNvbXBhdF9wdHIodXNldCksIHNpemVvZihzZXQzMikpKSB7Ci0JCXJlZ3MtPnRzdGF0ZSB8PSBUU1RBVEVfSUNBUlJZOwotCQlyZWdzLT51X3JlZ3NbVVJFR19JMF0gPSBFRkFVTFQ7Ci0JCXJldHVybjsKLQl9Ci0Jc3dpdGNoIChfTlNJR19XT1JEUykgewotCWNhc2UgNDogc2V0LnNpZ1szXSA9IHNldDMyLnNpZ1s2XSArICgoKGxvbmcpc2V0MzIuc2lnWzddKSA8PCAzMik7Ci0JY2FzZSAzOiBzZXQuc2lnWzJdID0gc2V0MzIuc2lnWzRdICsgKCgobG9uZylzZXQzMi5zaWdbNV0pIDw8IDMyKTsKLQljYXNlIDI6IHNldC5zaWdbMV0gPSBzZXQzMi5zaWdbMl0gKyAoKChsb25nKXNldDMyLnNpZ1szXSkgPDwgMzIpOwotCWNhc2UgMTogc2V0LnNpZ1swXSA9IHNldDMyLnNpZ1swXSArICgoKGxvbmcpc2V0MzIuc2lnWzFdKSA8PCAzMik7Ci0JfQotCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOwotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCW9sZHNldCA9IGN1cnJlbnQtPmJsb2NrZWQ7Ci0JY3VycmVudC0+YmxvY2tlZCA9IHNldDsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JCi0JcmVncy0+dHBjID0gcmVncy0+dG5wYzsKLQlyZWdzLT50bnBjICs9IDQ7Ci0JaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKSkgewotCQlyZWdzLT50cGMgJj0gMHhmZmZmZmZmZjsKLQkJcmVncy0+dG5wYyAmPSAweGZmZmZmZmZmOwotCX0KLQotCS8qIENvbmRpdGlvbiBjb2RlcyBhbmQgcmV0dXJuIHZhbHVlIHdoZXJlIHNldCBoZXJlIGZvciBzaWdwYXVzZSwKLQkgKiBhbmQgc28gZ290IHVzZWQgYnkgc2V0dXBfZnJhbWUsIHdoaWNoIGFnYWluIGNhdXNlcyBzaWdyZXR1cm4oKQotCSAqIHRvIHJldHVybiAtRUlOVFIuCi0JICovCi0Jd2hpbGUgKDEpIHsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlKCk7Ci0JCS8qCi0JCSAqIFJldHVybiAtRUlOVFIgYW5kIHNldCBjb25kaXRpb24gY29kZSBoZXJlLAotCQkgKiBzbyB0aGUgaW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwgYWN0dWFsbHkgcmV0dXJucwotCQkgKiB0aGVzZS4KLQkJICovCi0JCXJlZ3MtPnRzdGF0ZSB8PSBUU1RBVEVfSUNBUlJZOwotCQlyZWdzLT51X3JlZ3NbVVJFR19JMF0gPSBFSU5UUjsKLQkJaWYgKGRvX3NpZ25hbDMyKCZvbGRzZXQsIHJlZ3MsIDAsIDApKQotCQkJcmV0dXJuOwotCX0KLX0KLQogc3RhdGljIGludCByZXN0b3JlX2ZwdV9zdGF0ZTMyKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBfX3NpZ2luZm9fZnB1X3QgX191c2VyICpmcHUpCiB7CiAJdW5zaWduZWQgbG9uZyAqZnByZWdzID0gY3VycmVudF90aHJlYWRfaW5mbygpLT5mcHJlZ3M7CkBAIC0xMzYyLDggKzEyNjMsOCBAQAogICogd2FudCB0byBoYW5kbGUuIFRodXMgeW91IGNhbm5vdCBraWxsIGluaXQgZXZlbiB3aXRoIGEgU0lHS0lMTCBldmVuIGJ5CiAgKiBtaXN0YWtlLgogICovCi1pbnQgZG9fc2lnbmFsMzIoc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzLAotCQl1bnNpZ25lZCBsb25nIG9yaWdfaTAsIGludCByZXN0YXJ0X3N5c2NhbGwpCit2b2lkIGRvX3NpZ25hbDMyKHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICogcmVncywKKwkJIHVuc2lnbmVkIGxvbmcgb3JpZ19pMCwgaW50IHJlc3RhcnRfc3lzY2FsbCkKIHsKIAlzaWdpbmZvX3QgaW5mbzsKIAlzdHJ1Y3Qgc2lnbmFsX2RlbGl2ZXJfY29va2llIGNvb2tpZTsKQEAgLTEzODAsNyArMTI4MSwxNSBAQAogCQkJc3lzY2FsbF9yZXN0YXJ0MzIob3JpZ19pMCwgcmVncywgJmthLnNhKTsKIAkJaGFuZGxlX3NpZ25hbDMyKHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsCiAJCQkJcmVncywgc3ZyNF9zaWduYWwpOwotCQlyZXR1cm4gMTsKKworCQkvKiBhIHNpZ25hbCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZDsgdGhlIHNhdmVkCisJCSAqIHNpZ21hc2sgd2lsbCBoYXZlIGJlZW4gc3RvcmVkIGluIHRoZSBzaWduYWwgZnJhbWUsCisJCSAqIGFuZCB3aWxsIGJlIHJlc3RvcmVkIGJ5IHNpZ3JldHVybiwgc28gd2UgY2FuIHNpbXBseQorCQkgKiBjbGVhciB0aGUgVElGX1JFU1RPUkVfU0lHTUFTSyBmbGFnLgorCQkgKi8KKwkJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCisJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwkJcmV0dXJuOwogCX0KIAlpZiAoY29va2llLnJlc3RhcnRfc3lzY2FsbCAmJgogCSAgICAocmVncy0+dV9yZWdzW1VSRUdfSTBdID09IEVSRVNUQVJUTk9IQU5EIHx8CkBAIC0xMzk3LDcgKzEzMDYsMTQgQEAKIAkJcmVncy0+dHBjIC09IDQ7CiAJCXJlZ3MtPnRucGMgLT0gNDsKIAl9Ci0JcmV0dXJuIDA7CisKKwkvKiBpZiB0aGVyZSdzIG5vIHNpZ25hbCB0byBkZWxpdmVyLCB3ZSBqdXN0IHB1dCB0aGUgc2F2ZWQgc2lnbWFzaworCSAqIGJhY2sKKwkgKi8KKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkgeworCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrLCBOVUxMKTsKKwl9CiB9CiAKIHN0cnVjdCBzaWdzdGFjazMyIHsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc21wLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jCmluZGV4IDZlZmMwM2RmLi4xZmI2MzIzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc21wLmMKQEAgLTMzNSw3ICszMzUsNyBAQAogCiAJcCA9IGZvcmtfaWRsZShjcHUpOwogCWNhbGxpbl9mbGFnID0gMDsKLQljcHVfbmV3X3RocmVhZCA9IHAtPnRocmVhZF9pbmZvOworCWNwdV9uZXdfdGhyZWFkID0gdGFza190aHJlYWRfaW5mbyhwKTsKIAljcHVfc2V0KGNwdSwgY3B1X2NhbGxvdXRfbWFwKTsKIAogCWNwdV9maW5kX2J5X21pZChjcHUsICZjcHVfbm9kZSk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NwYXJjNjRfa3N5bXMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jCmluZGV4IGZiN2E1MzcuLjNjMDZiZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jCkBAIC02OSw3ICs2OSw2IEBACiAKIGV4dGVybiB2b2lkIGRpZV9pZl9rZXJuZWwoY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBleHRlcm4gcGlkX3Qga2VybmVsX3RocmVhZChpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqIGFyZywgdW5zaWduZWQgbG9uZyBmbGFncyk7Ci12b2lkIF9zaWdwYXVzZV9jb21tb24gKHVuc2lnbmVkIGludCBzZXQsIHN0cnVjdCBwdF9yZWdzICopOwogZXh0ZXJuIHZvaWQgKl9fYnplcm8odm9pZCAqLCBzaXplX3QpOwogZXh0ZXJuIHZvaWQgKl9fbWVtc2Nhbl96ZXJvKHZvaWQgKiwgc2l6ZV90KTsKIGV4dGVybiB2b2lkICpfX21lbXNjYW5fZ2VuZXJpYyh2b2lkICosIGludCwgc2l6ZV90KTsKQEAgLTk0LDcgKzkzLDYgQEAKIAogZXh0ZXJuIGludCBfX2FzaHJkaTMoaW50LCBpbnQpOwogCi1leHRlcm4gdm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgdXNlciAqKTsKIGV4dGVybiBpbnQgZHVtcF9mcHUgKHN0cnVjdCBwdF9yZWdzICogcmVncywgZWxmX2ZwcmVnc2V0X3QgKiBmcHJlZ3MpOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBwaHlzX2Jhc2U7CkBAIC0yMzcsMTEgKzIzNSwxMSBAQAogLyogSS9PIGRldmljZSBtbWFwaW5nIG9uIFNwYXJjNjQuICovCiBFWFBPUlRfU1lNQk9MKGlvX3JlbWFwX3Bmbl9yYW5nZSk7CiAKKyNpZmRlZiBDT05GSUdfQ09NUEFUCiAvKiBTb2xhcmlzL1N1bk9TIGJpbmFyeSBjb21wYXRpYmlsaXR5ICovCi1FWFBPUlRfU1lNQk9MKF9zaWdwYXVzZV9jb21tb24pOwogRVhQT1JUX1NZTUJPTCh2ZXJpZnlfY29tcGF0X2lvdmVjKTsKKyNlbmRpZgogCi1FWFBPUlRfU1lNQk9MKGR1bXBfdGhyZWFkKTsKIEVYUE9SVF9TWU1CT0woZHVtcF9mcHUpOwogRVhQT1JUX1NZTUJPTChwdGVfYWxsb2Nfb25lX2tlcm5lbCk7CiAjaWZuZGVmIENPTkZJR19TTVAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzX3NwYXJjMzIuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzX3NwYXJjMzIuYwppbmRleCA3ZjYyMzllLi45MjY0Y2NiIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5c19zcGFyYzMyLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNfc3BhcmMzMi5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4gCiAjaW5jbHVkZSA8bGludXgvbW0uaD4gCiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPiAKQEAgLTgyMCw3ICs4MjEsNyBAQAogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JcmV0dXJuIGRvX3V0aW1lcyhmaWxlbmFtZSwgKHR2cyA/ICZrdHZzWzBdIDogTlVMTCkpOworCXJldHVybiBkb191dGltZXMoQVRfRkRDV0QsIGZpbGVuYW1lLCAodHZzID8gJmt0dnNbMF0gOiBOVUxMKSk7CiB9CiAKIC8qIFRoZXNlIGFyZSBoZXJlIGp1c3QgaW4gY2FzZSBzb21lIG9sZCBzcGFyYzMyIGJpbmFyeSBjYWxscyBpdC4gKi8KQEAgLTEwMDIsNyArMTAwMyw3IEBACiBhc21saW5rYWdlIGxvbmcgc3BhcmMzMl9vcGVuKGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwKIAkJCSAgICAgaW50IGZsYWdzLCBpbnQgbW9kZSkKIHsKLQlyZXR1cm4gZG9fc3lzX29wZW4oZmlsZW5hbWUsIGZsYWdzLCBtb2RlKTsKKwlyZXR1cm4gZG9fc3lzX29wZW4oQVRfRkRDV0QsIGZpbGVuYW1lLCBmbGFncywgbW9kZSk7CiB9CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGRvX21yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsCkBAIC0xMTIwLDM5ICsxMTIxLDMgQEAKIAlyZXR1cm4gc3lzX2xvb2t1cF9kY29va2llKChjb29raWVfaGlnaCA8PCAzMikgfCBjb29raWVfbG93LAogCQkJCSAgYnVmLCBsZW4pOwogfQotCi1leHRlcm4gYXNtbGlua2FnZSBsb25nCi1zeXNfdGltZXJfY3JlYXRlKGNsb2NraWRfdCB3aGljaF9jbG9jaywKLQkJIHN0cnVjdCBzaWdldmVudCBfX3VzZXIgKnRpbWVyX2V2ZW50X3NwZWMsCi0JCSB0aW1lcl90IF9fdXNlciAqY3JlYXRlZF90aW1lcl9pZCk7Ci0KLWxvbmcKLXN5czMyX3RpbWVyX2NyZWF0ZSh1MzIgY2xvY2ssIHN0cnVjdCBjb21wYXRfc2lnZXZlbnQgX191c2VyICpzZTMyLAotCQkgICB0aW1lcl90IF9fdXNlciAqdGltZXJfaWQpCi17Ci0Jc3RydWN0IHNpZ2V2ZW50IHNlOwotCW1tX3NlZ21lbnRfdCBvbGRmczsKLQl0aW1lcl90IHQ7Ci0JbG9uZyBlcnI7Ci0KLQlpZiAoc2UzMiA9PSBOVUxMKQotCQlyZXR1cm4gc3lzX3RpbWVyX2NyZWF0ZShjbG9jaywgTlVMTCwgdGltZXJfaWQpOwotCi0JaWYgKGdldF9jb21wYXRfc2lnZXZlbnQoJnNlLCBzZTMyKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsdGltZXJfaWQsc2l6ZW9mKHRpbWVyX3QpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlvbGRmcyA9IGdldF9mcygpOwotCXNldF9mcyhLRVJORUxfRFMpOwotCWVyciA9IHN5c190aW1lcl9jcmVhdGUoY2xvY2ssCi0JCQkgICAgICAgKHN0cnVjdCBzaWdldmVudCBfX3VzZXIgKikgJnNlLAotCQkJICAgICAgICh0aW1lcl90IF9fdXNlciAqKSAmdCk7Ci0Jc2V0X2ZzKG9sZGZzKTsKLQotCWlmICghZXJyKQotCQllcnIgPSBfX3B1dF91c2VyICh0LCB0aW1lcl9pZCk7Ci0KLQlyZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNfc3Vub3MzMi5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNfc3Vub3MzMi5jCmluZGV4IGJmYTRhYTYuLmFlNWIzMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzX3N1bm9zMzIuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3N5c19zdW5vczMyLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXN0YmxzLlMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3N5c3RibHMuUwppbmRleCA1M2VhZjIzLi5iZjBmYzViIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5c3RibHMuUworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3N5c3RibHMuUwpAQCAtNDEsNyArNDEsNyBAQAogLyo5MCovCS53b3JkIHN5c19kdXAyLCBzeXNfc2V0ZnN1aWQsIGNvbXBhdF9zeXNfZmNudGwsIHN5czMyX3NlbGVjdCwgc3lzX3NldGZzZ2lkCiAJLndvcmQgc3lzX2ZzeW5jLCBzeXMzMl9zZXRwcmlvcml0eSwgc3lzX25pc19zeXNjYWxsLCBzeXNfbmlzX3N5c2NhbGwsIHN5c19uaXNfc3lzY2FsbAogLyoxMDAqLyAud29yZCBzeXMzMl9nZXRwcmlvcml0eSwgc3lzMzJfcnRfc2lncmV0dXJuLCBzeXMzMl9ydF9zaWdhY3Rpb24sIHN5czMyX3J0X3NpZ3Byb2NtYXNrLCBzeXMzMl9ydF9zaWdwZW5kaW5nCi0JLndvcmQgY29tcGF0X3N5c19ydF9zaWd0aW1lZHdhaXQsIHN5czMyX3J0X3NpZ3F1ZXVlaW5mbywgc3lzMzJfcnRfc2lnc3VzcGVuZCwgc3lzX3NldHJlc3VpZCwgc3lzX2dldHJlc3VpZAorCS53b3JkIGNvbXBhdF9zeXNfcnRfc2lndGltZWR3YWl0LCBzeXMzMl9ydF9zaWdxdWV1ZWluZm8sIGNvbXBhdF9zeXNfcnRfc2lnc3VzcGVuZCwgc3lzX3NldHJlc3VpZCwgc3lzX2dldHJlc3VpZAogLyoxMTAqLwkud29yZCBzeXNfc2V0cmVzZ2lkLCBzeXNfZ2V0cmVzZ2lkLCBzeXNfc2V0cmVnaWQsIHN5c19uaXNfc3lzY2FsbCwgc3lzX25pc19zeXNjYWxsCiAJLndvcmQgc3lzMzJfZ2V0Z3JvdXBzLCBzeXMzMl9nZXR0aW1lb2ZkYXksIHN5czMyX2dldHJ1c2FnZSwgc3lzX25pc19zeXNjYWxsLCBzeXNfZ2V0Y3dkCiAvKjEyMCovCS53b3JkIGNvbXBhdF9zeXNfcmVhZHYsIGNvbXBhdF9zeXNfd3JpdGV2LCBzeXMzMl9zZXR0aW1lb2ZkYXksIHN5czMyX2ZjaG93bjE2LCBzeXNfZmNobW9kCkBAIC03MywxMCArNzMsMTMgQEAKIC8qMjUwKi8JLndvcmQgc3lzMzJfbXJlbWFwLCBzeXMzMl9zeXNjdGwsIHN5czMyX2dldHNpZCwgc3lzX2ZkYXRhc3luYywgc3lzMzJfbmZzc2VydmN0bAogCS53b3JkIHN5c19uaV9zeXNjYWxsLCBzeXMzMl9jbG9ja19zZXR0aW1lLCBjb21wYXRfc3lzX2Nsb2NrX2dldHRpbWUsIGNvbXBhdF9zeXNfY2xvY2tfZ2V0cmVzLCBzeXMzMl9jbG9ja19uYW5vc2xlZXAKIC8qMjYwKi8JLndvcmQgY29tcGF0X3N5c19zY2hlZF9nZXRhZmZpbml0eSwgY29tcGF0X3N5c19zY2hlZF9zZXRhZmZpbml0eSwgc3lzMzJfdGltZXJfc2V0dGltZSwgY29tcGF0X3N5c190aW1lcl9nZXR0aW1lLCBzeXNfdGltZXJfZ2V0b3ZlcnJ1bgotCS53b3JkIHN5c190aW1lcl9kZWxldGUsIHN5czMyX3RpbWVyX2NyZWF0ZSwgc3lzX25pX3N5c2NhbGwsIGNvbXBhdF9zeXNfaW9fc2V0dXAsIHN5c19pb19kZXN0cm95CisJLndvcmQgc3lzX3RpbWVyX2RlbGV0ZSwgY29tcGF0X3N5c190aW1lcl9jcmVhdGUsIHN5c19uaV9zeXNjYWxsLCBjb21wYXRfc3lzX2lvX3NldHVwLCBzeXNfaW9fZGVzdHJveQogLyoyNzAqLwkud29yZCBzeXMzMl9pb19zdWJtaXQsIHN5c19pb19jYW5jZWwsIGNvbXBhdF9zeXNfaW9fZ2V0ZXZlbnRzLCBzeXMzMl9tcV9vcGVuLCBzeXNfbXFfdW5saW5rCiAJLndvcmQgY29tcGF0X3N5c19tcV90aW1lZHNlbmQsIGNvbXBhdF9zeXNfbXFfdGltZWRyZWNlaXZlLCBjb21wYXRfc3lzX21xX25vdGlmeSwgY29tcGF0X3N5c19tcV9nZXRzZXRhdHRyLCBjb21wYXRfc3lzX3dhaXRpZAotLyoyODAqLwkud29yZCBzeXNfbmlfc3lzY2FsbCwgc3lzX2FkZF9rZXksIHN5c19yZXF1ZXN0X2tleSwgc3lzX2tleWN0bAorLyoyODAqLwkud29yZCBzeXNfbmlfc3lzY2FsbCwgc3lzX2FkZF9rZXksIHN5c19yZXF1ZXN0X2tleSwgc3lzX2tleWN0bCwgY29tcGF0X3N5c19vcGVuYXQKKwkud29yZCBzeXNfbWtkaXJhdCwgc3lzX21rbm9kYXQsIHN5c19mY2hvd25hdCwgY29tcGF0X3N5c19mdXRpbWVzYXQsIGNvbXBhdF9zeXNfbmV3ZnN0YXRhdAorLyoyODUqLwkud29yZCBzeXNfdW5saW5rYXQsIHN5c19yZW5hbWVhdCwgc3lzX2xpbmthdCwgc3lzX3N5bWxpbmthdCwgc3lzX3JlYWRsaW5rYXQKKwkud29yZCBzeXNfZmNobW9kYXQsIHN5c19mYWNjZXNzYXQsIGNvbXBhdF9zeXNfcHNlbGVjdDYsIGNvbXBhdF9zeXNfcHBvbGwKIAogI2VuZGlmIC8qIENPTkZJR19DT01QQVQgKi8KIApAQCAtOTgsNyArMTAxLDcgQEAKIAkud29yZCBzeXNfdW1vdW50LCBzeXNfc2V0Z2lkLCBzeXNfZ2V0Z2lkLCBzeXNfc2lnbmFsLCBzeXNfZ2V0ZXVpZAogLyo1MCovCS53b3JkIHN5c19nZXRlZ2lkLCBzeXNfYWNjdCwgc3lzX21lbW9yeV9vcmRlcmluZywgc3lzX25pc19zeXNjYWxsLCBzeXNfaW9jdGwKIAkud29yZCBzeXNfcmVib290LCBzeXNfbmlzX3N5c2NhbGwsIHN5c19zeW1saW5rLCBzeXNfcmVhZGxpbmssIHN5c19leGVjdmUKLS8qNjAqLwkud29yZCBzeXNfdW1hc2ssIHN5c19jaHJvb3QsIHN5c19uZXdmc3RhdCwgc3lzX3N0YXQ2NCwgc3lzX2dldHBhZ2VzaXplCisvKjYwKi8JLndvcmQgc3lzX3VtYXNrLCBzeXNfY2hyb290LCBzeXNfbmV3ZnN0YXQsIHN5c19mc3RhdDY0LCBzeXNfZ2V0cGFnZXNpemUKIAkud29yZCBzeXNfbXN5bmMsIHN5c192Zm9yaywgc3lzX3ByZWFkNjQsIHN5c19wd3JpdGU2NCwgc3lzX25pc19zeXNjYWxsCiAvKjcwKi8JLndvcmQgc3lzX25pc19zeXNjYWxsLCBzeXNfbW1hcCwgc3lzX25pc19zeXNjYWxsLCBzeXM2NF9tdW5tYXAsIHN5c19tcHJvdGVjdAogCS53b3JkIHN5c19tYWR2aXNlLCBzeXNfdmhhbmd1cCwgc3lzX25pc19zeXNjYWxsLCBzeXNfbWluY29yZSwgc3lzX2dldGdyb3VwcwpAQCAtMTQyLDcgKzE0NSwxMCBAQAogCS53b3JkIHN5c190aW1lcl9kZWxldGUsIHN5c190aW1lcl9jcmVhdGUsIHN5c19uaV9zeXNjYWxsLCBzeXNfaW9fc2V0dXAsIHN5c19pb19kZXN0cm95CiAvKjI3MCovCS53b3JkIHN5c19pb19zdWJtaXQsIHN5c19pb19jYW5jZWwsIHN5c19pb19nZXRldmVudHMsIHN5c19tcV9vcGVuLCBzeXNfbXFfdW5saW5rCiAJLndvcmQgc3lzX21xX3RpbWVkc2VuZCwgc3lzX21xX3RpbWVkcmVjZWl2ZSwgc3lzX21xX25vdGlmeSwgc3lzX21xX2dldHNldGF0dHIsIHN5c193YWl0aWQKLS8qMjgwKi8JLndvcmQgc3lzX25pc19zeXNjYWxsLCBzeXNfYWRkX2tleSwgc3lzX3JlcXVlc3Rfa2V5LCBzeXNfa2V5Y3RsCisvKjI4MCovCS53b3JkIHN5c19uaXNfc3lzY2FsbCwgc3lzX2FkZF9rZXksIHN5c19yZXF1ZXN0X2tleSwgc3lzX2tleWN0bCwgc3lzX29wZW5hdAorCS53b3JkIHN5c19ta2RpcmF0LCBzeXNfbWtub2RhdCwgc3lzX2ZjaG93bmF0LCBzeXNfZnV0aW1lc2F0LCBjb21wYXRfc3lzX25ld2ZzdGF0YXQKKy8qMjg1Ki8JLndvcmQgc3lzX3VubGlua2F0LCBzeXNfcmVuYW1lYXQsIHN5c19saW5rYXQsIHN5c19zeW1saW5rYXQsIHN5c19yZWFkbGlua2F0CisJLndvcmQgc3lzX2ZjaG1vZGF0LCBzeXNfZmFjY2Vzc2F0LCBzeXNfcHNlbGVjdDYsIHN5c19wcG9sbAogCiAjaWYgZGVmaW5lZChDT05GSUdfU1VOT1NfRU1VTCkgfHwgZGVmaW5lZChDT05GSUdfU09MQVJJU19FTVVMKSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfU09MQVJJU19FTVVMX01PRFVMRSkKQEAgLTIzOSwxMyArMjQ1LDIwIEBACiAvKjI1MCovCS53b3JkIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMKIAkud29yZCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzCiAJLndvcmQgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cwotCS53b3JkIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMKLQkud29yZCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzCi0JLndvcmQgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cwotCS53b3JkIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMKLQkud29yZCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzCi0JLndvcmQgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cworCS53b3JkIHN1bm9zX25vc3lzCisvKjI2MCovCS53b3JkIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMKIAkud29yZCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzCiAJLndvcmQgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cwogCS53b3JkIHN1bm9zX25vc3lzCisvKjI3MCovCS53b3JkIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMKKwkud29yZCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzCisJLndvcmQgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cworCS53b3JkIHN1bm9zX25vc3lzCisvKjI4MCovCS53b3JkIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMKKwkud29yZCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzCisJLndvcmQgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cworCS53b3JkIHN1bm9zX25vc3lzCisvKjI5MCovCS53b3JkIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMKKwkud29yZCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzCisJLndvcmQgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3RpbWUuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jCmluZGV4IDQ1OWM4ZmIuLmEyMjkzMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jCkBAIC0yODAsOSArMjgwLDkgQEAKICAqIFNpbmNlIFNUSUNLIGlzIGNvbnN0YW50bHkgdXBkYXRpbmcsIHdlIGhhdmUgdG8gYWNjZXNzIGl0IGNhcmVmdWxseS4KICAqCiAgKiBUaGUgc2VxdWVuY2Ugd2UgdXNlIHRvIHJlYWQgaXM6Ci0gKiAxKSByZWFkIGxvdwotICogMikgcmVhZCBoaWdoCi0gKiAzKSByZWFkIGxvdyBhZ2FpbiwgaWYgaXQgcm9sbGVkIG92ZXIgaW5jcmVtZW50IGhpZ2ggYnkgMQorICogMSkgcmVhZCBoaWdoCisgKiAyKSByZWFkIGxvdworICogMykgcmVhZCBoaWdoIGFnYWluLCBpZiBpdCByb2xsZWQgcmUtcmVhZCBib3RoIGxvdyBhbmQgaGlnaCBhZ2Fpbi4KICAqCiAgKiBXcml0aW5nIFNUSUNLIHNhZmVseSBpcyBhbHNvIHRyaWNreToKICAqIDEpIHdyaXRlIGxvdyB0byB6ZXJvCkBAIC0yOTUsMTggKzI5NSwxOCBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgX19oYmlyZF9yZWFkX3N0aWNrKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyByZXQsIHRtcDEsIHRtcDIsIHRtcDM7Ci0JdW5zaWduZWQgbG9uZyBhZGRyID0gSEJJUkRfU1RJQ0tfQUREUjsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBIQklSRF9TVElDS19BRERSKzg7CiAKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGR4YQlbJTFdICU1LCAlMlxuXHQiCi0JCQkgICAgICJhZGQJJTEsIDB4OCwgJTFcblx0IgotCQkJICAgICAibGR4YQlbJTFdICU1LCAlM1xuXHQiCisJX19hc21fXyBfX3ZvbGF0aWxlX18oImxkeGEJWyUxXSAlNSwgJTJcbiIKKwkJCSAgICAgIjE6XG5cdCIKIAkJCSAgICAgInN1YgklMSwgMHg4LCAlMVxuXHQiCisJCQkgICAgICJsZHhhCVslMV0gJTUsICUzXG5cdCIKKwkJCSAgICAgImFkZAklMSwgMHg4LCAlMVxuXHQiCiAJCQkgICAgICJsZHhhCVslMV0gJTUsICU0XG5cdCIKIAkJCSAgICAgImNtcAklNCwgJTJcblx0IgotCQkJICAgICAiYmx1LGEscG4JJSV4Y2MsIDFmXG5cdCIKLQkJCSAgICAgIiBhZGQJJTMsIDEsICUzXG4iCi0JCQkgICAgICIxOlxuXHQiCi0JCQkgICAgICJzbGx4CSUzLCAzMiwgJTNcblx0IgorCQkJICAgICAiYm5lLGEscG4JJSV4Y2MsIDFiXG5cdCIKKwkJCSAgICAgIiBtb3YJJTQsICUyXG5cdCIKKwkJCSAgICAgInNsbHgJJTQsIDMyLCAlNFxuXHQiCiAJCQkgICAgICJvcgklMywgJTQsICUwXG5cdCIKIAkJCSAgICAgOiAiPSZyIiAocmV0KSwgIj0mciIgKGFkZHIpLAogCQkJICAgICAgICI9JnIiICh0bXAxKSwgIj0mciIgKHRtcDIpLCAiPSZyIiAodG1wMykKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHJhcHMuYwppbmRleCA1NTcwZTdiLi44ZDQ0YWU1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC90cmFwcy5jCkBAIC0xODA4LDcgKzE4MDgsNyBAQAogdm9pZCBzaG93X3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBsb25nICpfa3NwKQogewogCXVuc2lnbmVkIGxvbmcgcGMsIGZwLCB0aHJlYWRfYmFzZSwga3NwOwotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdHAgPSB0c2stPnRocmVhZF9pbmZvOworCXZvaWQgKnRwID0gdGFza19zdGFja19wYWdlKHRzayk7CiAJc3RydWN0IHJlZ193aW5kb3cgKnJ3OwogCWludCBjb3VudCA9IDA7CiAKQEAgLTE4NjIsNyArMTg2Miw3IEBACiAJCQlyZXR1cm4gMDsKIAl9CiAKLQl0aHJlYWRfYmFzZSA9ICh1bnNpZ25lZCBsb25nKSB0YXNrLT50aHJlYWRfaW5mbzsKKwl0aHJlYWRfYmFzZSA9ICh1bnNpZ25lZCBsb25nKSB0YXNrX3N0YWNrX3BhZ2UodGFzayk7CiAJdGhyZWFkX2VuZCA9IHRocmVhZF9iYXNlICsgc2l6ZW9mKHVuaW9uIHRocmVhZF91bmlvbik7CiAJaWYgKHJ3X2FkZHIgPj0gdGhyZWFkX2Jhc2UgJiYKIAkgICAgcndfYWRkciA8IHRocmVhZF9lbmQgJiYKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9wcm9tL2NvbnNvbGUuYyBiL2FyY2gvc3BhcmM2NC9wcm9tL2NvbnNvbGUuYwppbmRleCBlYWU1ZGI4Li5hYzZkMDM1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvcHJvbS9jb25zb2xlLmMKKysrIGIvYXJjaC9zcGFyYzY0L3Byb20vY29uc29sZS5jCkBAIC05OSw4ICs5OSwxMiBAQAogCWlmICghc3RybmNtcChwcm9wYiwgImtleWJvYXJkIiwgOCkpCiAJCXJldHVybiBQUk9NREVWX0lUVFlBOwogCisJaWYgKCFzdHJuY21wIChwcm9wYiwgInJzYyIsIDMpKQorCQlyZXR1cm4gUFJPTURFVl9JUlNDOworCiAJaWYgKHN0cm5jbXAgKHByb3BiLCAidHR5IiwgMykgfHwgIXByb3BiWzNdKQogCQlyZXR1cm4gUFJPTURFVl9JX1VOSzsKKwogCXN3aXRjaCAocHJvcGJbM10pIHsKIAkJY2FzZSAnYSc6IHJldHVybiBQUk9NREVWX0lUVFlBOwogCQljYXNlICdiJzogcmV0dXJuIFBST01ERVZfSVRUWUI7CkBAIC0xMzYsOCArMTQwLDEyIEBACiAJaWYgKCFzdHJuY21wKHByb3BiLCAic2NyZWVuIiwgNikpCiAJCXJldHVybiBQUk9NREVWX09UVFlBOwogCisJaWYgKCFzdHJuY21wIChwcm9wYiwgInJzYyIsIDMpKQorCQlyZXR1cm4gUFJPTURFVl9PUlNDOworCiAJaWYgKHN0cm5jbXAgKHByb3BiLCAidHR5IiwgMykgfHwgIXByb3BiWzNdKQogCQlyZXR1cm4gUFJPTURFVl9PX1VOSzsKKwogCXN3aXRjaCAocHJvcGJbM10pIHsKIAkJY2FzZSAnYSc6IHJldHVybiBQUk9NREVWX09UVFlBOwogCQljYXNlICdiJzogcmV0dXJuIFBST01ERVZfT1RUWUI7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvc29sYXJpcy9lbnRyeTY0LlMgYi9hcmNoL3NwYXJjNjQvc29sYXJpcy9lbnRyeTY0LlMKaW5kZXggNGI2YWU1OC4uZWIzMTRlZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L3NvbGFyaXMvZW50cnk2NC5TCisrKyBiL2FyY2gvc3BhcmM2NC9zb2xhcmlzL2VudHJ5NjQuUwpAQCAtMTgwLDYgKzE4MCw4IEBACiAJIG5vcAogCWNhbGwJCXN5c19zaWdzdXNwZW5kCiAJIHN0eAkJJW8wLCBbJXNwICsgUFRSRUdTX09GRiArIFBUX1Y5X0kwXQorCWIscHQJCSV4Y2MsIHJldF9mcm9tX3NvbGFyaXMKKwkgbm9wCiAKIAkuZ2xvYmwJCXNvbGFyaXNfZ2V0cGlkCiBzb2xhcmlzX2dldHBpZDoKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9zb2xhcmlzL2ZzLmMgYi9hcmNoL3NwYXJjNjQvc29sYXJpcy9mcy5jCmluZGV4IGQ3Yzk5ZmEuLjQ4ODVjYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9zb2xhcmlzL2ZzLmMKKysrIGIvYXJjaC9zcGFyYzY0L3NvbGFyaXMvZnMuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9LY29uZmlnIGIvYXJjaC91bS9LY29uZmlnCmluZGV4IDFlYjIxZGUuLjU5ODJmZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vS2NvbmZpZworKysgYi9hcmNoL3VtL0tjb25maWcKQEAgLTIyLDEwICsyMiw2IEBACiBjb25maWcgUENJCiAJYm9vbAogCi1jb25maWcgVUlEMTYKLQlib29sCi0JZGVmYXVsdCB5Ci0KIGNvbmZpZyBHRU5FUklDX0NBTElCUkFURV9ERUxBWQogCWJvb2wKIAlkZWZhdWx0IHkKQEAgLTM5LDEyICszNSwxMiBAQAogCiBjb25maWcgTU9ERV9UVAogCWJvb2wgIlRyYWNpbmcgdGhyZWFkIHN1cHBvcnQiCi0JZGVmYXVsdCB5CisJZGVmYXVsdCBuCiAJaGVscAogCVRoaXMgb3B0aW9uIGNvbnRyb2xzIHdoZXRoZXIgdHJhY2luZyB0aHJlYWQgc3VwcG9ydCBpcyBjb21waWxlZAotCWludG8gVU1MLiAgTm9ybWFsbHksIHRoaXMgc2hvdWxkIGJlIHNldCB0byBZLiAgSWYgeW91IGludGVuZCB0bwotCXVzZSBvbmx5IHNrYXMgbW9kZSAoYW5kIHRoZSBob3N0IGhhcyB0aGUgc2thcyBwYXRjaCBhcHBsaWVkIHRvIGl0KSwKLQl0aGVuIGl0IGlzIE9LIHRvIHNheSBOIGhlcmUuCisJaW50byBVTUwuICBUaGlzIG9wdGlvbiBpcyBsYXJnZWx5IG9ic29sZXRlLCBnaXZlbiB0aGF0IHNrYXMwIHByb3ZpZGVzCisJc2thcyBzZWN1cml0eSBhbmQgcGVyZm9ybWFuY2Ugd2l0aG91dCBuZWVkaW5nIHRvIHBhdGNoIHRoZSBob3N0LgorCUl0IGlzIHNhZmUgdG8gc2F5ICdOJyBoZXJlLgogCiBjb25maWcgU1RBVElDX0xJTksKIAlib29sICJGb3JjZSBhIHN0YXRpYyBsaW5rIgpAQCAtODMsNyArNzksNyBAQAogICAgICAgICBvZiBwaHlzaWNhbCBtZW1vcnkuCiAKIGNvbmZpZyBNT0RFX1NLQVMKLQlib29sICJTZXBhcmF0ZSBLZXJuZWwgQWRkcmVzcyBTcGFjZSBzdXBwb3J0IgorCWJvb2wgIlNlcGFyYXRlIEtlcm5lbCBBZGRyZXNzIFNwYWNlIHN1cHBvcnQiIGlmIE1PREVfVFQKIAlkZWZhdWx0IHkKIAloZWxwCiAJVGhpcyBvcHRpb24gY29udHJvbHMgd2hldGhlciBza2FzIChzZXBhcmF0ZSBrZXJuZWwgYWRkcmVzcyBzcGFjZSkKQEAgLTE0Nyw2ICsxNDMsNyBAQAogCiBjb25maWcgSFBQRlMKIAl0cmlzdGF0ZSAiSG9uZXlQb3QgUHJvY0ZTIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJaGVscAogCWhwcGZzIChIb25leVBvdCBQcm9jRlMpIGlzIGEgZmlsZXN5c3RlbSB3aGljaCBhbGxvd3MgVU1MIC9wcm9jCiAJZW50cmllcyB0byBiZSBvdmVycmlkZGVuLCByZW1vdmVkLCBvciBmYWJyaWNhdGVkIGZyb20gdGhlIGhvc3QuCkBAIC0xNTksMTAgKzE1Niw2IEBACiAJWW91IG9ubHkgbmVlZCB0aGlzIGlmIHlvdSBhcmUgc2V0dGluZyB1cCBhIFVNTCBob25leXBvdC4gIE90aGVyd2lzZSwKIAlpdCBpcyBzYWZlIHRvIHNheSAnTicgaGVyZS4KIAotCUlmIHlvdSBhcmUgYWN0aXZlbHkgdXNpbmcgaXQsIHBsZWFzZSByZXBvcnQgYW55IHByb2JsZW1zLCBzaW5jZSBpdCdzCi0JZ2V0dGluZyBmaXhlZC4gSW4gdGhpcyBtb21lbnQsIGl0IGlzIGV4cGVyaW1lbnRhbCBvbiAyLjYgKGl0IHdvcmtzIG9uCi0JMi40KS4KLQogY29uZmlnIE1DT05TT0xFCiAJYm9vbCAiTWFuYWdlbWVudCBjb25zb2xlIgogCWRlZmF1bHQgeQpAQCAtMjQ3LDggKzI0MCwxNiBAQAogICAgICAgICBPbmx5IGNoYW5nZSB0aGlzIGlmIHlvdSBhcmUgcnVubmluZyBuZXN0ZWQgVU1Mcy4KIAogY29uZmlnIEhJR0hNRU0KLQlib29sICJIaWdobWVtIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAhNjRCSVQKKwlib29sICJIaWdobWVtIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiAhNjRCSVQgJiYgRVhQRVJJTUVOVEFMCisJZGVmYXVsdCBuCisJaGVscAorCVRoaXMgd2FzIHVzZWQgdG8gYWxsb3cgVU1MIHRvIHJ1biB3aXRoIGJpZyBhbW91bnRzIG9mIG1lbW9yeS4KKwlDdXJyZW50bHkgaXQgaXMgdW5zdGFibGUsIHNvIGlmIHVuc3VyZSBzYXkgTi4KKworCVRvIHVzZSBiaWcgYW1vdW50cyBvZiBtZW1vcnksIGl0IGlzIHJlY29tbWVuZGVkIHRvIGRpc2FibGUgVFQgbW9kZSAoaS5lLgorCUNPTkZJR19NT0RFX1RUKSBhbmQgZW5hYmxlIHN0YXRpYyBsaW5raW5nIChpLmUuIENPTkZJR19TVEFUSUNfTElOSykgLQorCXRoaXMgc2hvdWxkIGFsbG93IHRoZSBndWVzdCB0byB1c2UgdXAgdG8gMi43NUcgb2YgbWVtb3J5LgogCiBjb25maWcgS0VSTkVMX1NUQUNLX09SREVSCiAJaW50ICJLZXJuZWwgc3RhY2sgc2l6ZSBvcmRlciIKQEAgLTI3MywxNyArMjc0LDEzIEBACiAKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCi1zb3VyY2UgIm5ldC9LY29uZmlnIgotCi1zb3VyY2UgImRyaXZlcnMvYmFzZS9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL2Jsb2NrL0tjb25maWciCiAKIHNvdXJjZSAiYXJjaC91bS9LY29uZmlnLmNoYXIiCiAKLXNvdXJjZSAiZHJpdmVycy9ibG9jay9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL2Jhc2UvS2NvbmZpZyIKIAotY29uZmlnIE5FVERFVklDRVMKLQlib29sCi0JZGVmYXVsdCBORVQKK3NvdXJjZSAibmV0L0tjb25maWciCiAKIHNvdXJjZSAiYXJjaC91bS9LY29uZmlnLm5ldCIKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9LY29uZmlnLmkzODYgYi9hcmNoL3VtL0tjb25maWcuaTM4NgppbmRleCBjNzFiMzlhLi5lZjc5ZWQyIDEwMDY0NAotLS0gYS9hcmNoL3VtL0tjb25maWcuaTM4NgorKysgYi9hcmNoL3VtL0tjb25maWcuaTM4NgpAQCAtMjIsMTMgKzIyLDE3IEBACiAgCWRlZmF1bHQgMHg4MDAwMDAwMCBpZiBIT1NUXzJHXzJHCiAKIGNvbmZpZyAzX0xFVkVMX1BHVEFCTEVTCi0JYm9vbCAiVGhyZWUtbGV2ZWwgcGFnZXRhYmxlcyIKKwlib29sICJUaHJlZS1sZXZlbCBwYWdldGFibGVzIChFWFBFUklNRU5UQUwpIgogCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJaGVscAogCVRocmVlLWxldmVsIHBhZ2V0YWJsZXMgd2lsbCBsZXQgVU1MIGhhdmUgbW9yZSB0aGFuIDRHIG9mIHBoeXNpY2FsCiAJbWVtb3J5LiAgQWxsIHRoZSBtZW1vcnkgdGhhdCBjYW4ndCBiZSBtYXBwZWQgZGlyZWN0bHkgd2lsbCBiZSB0cmVhdGVkCiAJYXMgaGlnaCBtZW1vcnkuCiAKKwlIb3dldmVyLCB0aGlzIGl0IGV4cGVyaW1lbnRhbCBvbiAzMi1iaXQgYXJjaGl0ZWN0dXJlcywgc28gaWYgdW5zdXJlIHNheQorCU4gKG9uIHg4Ni02NCBpdCdzIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCwgaW5zdGVhZCwgYXMgaXQncyBzYWZlIHRoZXJlKS4KKwogY29uZmlnIFNUVUJfQ09ERQogCWhleAogCWRlZmF1bHQgMHhiZmZmZTAwMApkaWZmIC0tZ2l0IGEvYXJjaC91bS9NYWtlZmlsZSBiL2FyY2gvdW0vTWFrZWZpbGUKaW5kZXggMWIxMmZlZS4uNjQzMGE2MyAxMDA2NDQKLS0tIGEvYXJjaC91bS9NYWtlZmlsZQorKysgYi9hcmNoL3VtL01ha2VmaWxlCkBAIC0zMiw3ICszMiw3IEBACiB1bS1tb2Rlcy0kKENPTkZJR19NT0RFX1NLQVMpICs9IHNrYXMKIAogTU9ERV9JTkNMVURFCSs9ICQoZm9yZWFjaCBtb2RlLCQodW0tbW9kZXMteSksXAotCQkgICAtSSQoc3JjdHJlZSkvJChBUkNIX0RJUikva2VybmVsLyQobW9kZSkvaW5jbHVkZSkKKwkJICAgLUkkKHNyY3RyZWUpLyQoQVJDSF9ESVIpL2luY2x1ZGUvJChtb2RlKSkKIAogTUFLRUZJTEVTLUlOQ0wJKz0gJChmb3JlYWNoIG1vZGUsJCh1bS1tb2Rlcy15KSxcCiAJCSAgICQoc3JjdHJlZSkvJChBUkNIX0RJUikvTWFrZWZpbGUtJChtb2RlKSkKQEAgLTY3LDcgKzY3LDggQEAKICMgaW4gQ0ZMQUdTLiAgT3RoZXJ3aXNlLCBpdCB3b3VsZCBjYXVzZSBsZCB0byBjb21wbGFpbiBhYm91dCB0aGUgdHdvIGRpZmZlcmVudAogIyBlcnJub3MuCiAKLUNGTEFHUyArPSAtRGVycm5vPWtlcm5lbF9lcnJubyAtRHNpZ3Byb2NtYXNrPWtlcm5lbF9zaWdwcm9jbWFzaworQ0ZMQUdTICs9IC1EZXJybm89a2VybmVsX2Vycm5vIC1Ec2lncHJvY21hc2s9a2VybmVsX3NpZ3Byb2NtYXNrIFwKKwktRG1rdGltZT1rZXJuZWxfbWt0aW1lCiBDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtZm5vLXVuaXQtYXQtYS10aW1lLCkKIAogaW5jbHVkZSAkKHNyY3RyZWUpLyQoQVJDSF9ESVIpL01ha2VmaWxlLSQoU1VCQVJDSCkKQEAgLTE4OSw2ICsxOTAsMTIgQEAKIAlzZWQgJ3MvIENPTkZJRy8gVU1MX0NPTkZJRy8nCiBlbmRlZgogCiskKEFSQ0hfRElSKS9pbmNsdWRlL3VtbC1jb25maWcuaCA6IGluY2x1ZGUvbGludXgvYXV0b2NvbmYuaAorCSQoY2FsbCBmaWxlY2hrLHVtbGNvbmZpZykKKworJChBUkNIX0RJUikvdXNlci1vZmZzZXRzLnM6ICQoQVJDSF9ESVIpL3N5cy0kKFNVQkFSQ0gpL3VzZXItb2Zmc2V0cy5jCisJJChDQykgJChVU0VSX0NGTEFHUykgLVMgLW8gJEAgJDwKKwogZGVmaW5lIGZpbGVjaGtfZ2VuLWFzbS1vZmZzZXRzCiAgICAgICAgIChzZXQgLWU7IFwKICAgICAgICAgIGVjaG8gIi8qIjsgXApAQCAtMjAyLDI0ICsyMDksMTMgQEAKICAgICAgICAgIGVjaG8gIiI7ICkKIGVuZGVmCiAKLSQoQVJDSF9ESVIpL2luY2x1ZGUvdW1sLWNvbmZpZy5oIDogaW5jbHVkZS9saW51eC9hdXRvY29uZi5oCi0JJChjYWxsIGZpbGVjaGssdW1sY29uZmlnKQotCi0kKEFSQ0hfRElSKS91c2VyLW9mZnNldHMuczogJChBUkNIX0RJUikvc3lzLSQoU1VCQVJDSCkvdXNlci1vZmZzZXRzLmMKLQkkKENDKSAkKFVTRVJfQ0ZMQUdTKSAtUyAtbyAkQCAkPAotCiAkKEFSQ0hfRElSKS9pbmNsdWRlL3VzZXJfY29uc3RhbnRzLmg6ICQoQVJDSF9ESVIpL3VzZXItb2Zmc2V0cy5zCiAJJChjYWxsIGZpbGVjaGssZ2VuLWFzbS1vZmZzZXRzKQogCiBDTEVBTl9GSUxFUyArPSAkKEFSQ0hfRElSKS91c2VyLW9mZnNldHMucwogCi0kKEFSQ0hfRElSKS9rZXJuZWwtb2Zmc2V0cy5zOiAkKEFSQ0hfRElSKS9zeXMtJChTVUJBUkNIKS9rZXJuZWwtb2Zmc2V0cy5jIFwKLQkJCQkgICBhcmNocHJlcGFyZQotCSQoQ0MpICQoQ0ZMQUdTKSAkKE5PU1RESU5DX0ZMQUdTKSAkKENQUEZMQUdTKSAtUyAtbyAkQCAkPAotCi0kKEFSQ0hfRElSKS9pbmNsdWRlL2tlcm5fY29uc3RhbnRzLmg6ICQoQVJDSF9ESVIpL2tlcm5lbC1vZmZzZXRzLnMKLQkkKGNhbGwgZmlsZWNoayxnZW4tYXNtLW9mZnNldHMpCi0KLUNMRUFOX0ZJTEVTICs9ICQoQVJDSF9ESVIpL2tlcm5lbC1vZmZzZXRzLnMKKyQoQVJDSF9ESVIpL2luY2x1ZGUva2Vybl9jb25zdGFudHMuaDoKKwlAZWNobyAnICBTWU1MSU5LICRAJworCSQoUSkgbG4gLXNmIC4uLy4uLy4uL2luY2x1ZGUvYXNtLXVtL2FzbS1vZmZzZXRzLmggJEAKIAogZXhwb3J0IFNVQkFSQ0ggVVNFUl9DRkxBR1MgT1MKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9jaGFuX2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy9jaGFuX2tlcm4uYwppbmRleCBjZDEzYjkxLi5hYjBkMGIxIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvY2hhbl9rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2NoYW5fa2Vybi5jCkBAIC0xODYsOSArMTg2LDYgQEAKIAkJfQogCX0KIAotCWlmKCh0dHktPmZsaXAuZmxhZ19idWZfcHRyID09IE5VTEwpIHx8Ci0JICAgKHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgPT0gTlVMTCkpCi0JCXJldHVybjsKIAl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBUVFlfTk9STUFMKTsKIH0KIApAQCAtNjUzLDggKzY1MCw3IEBACiAJCWNoYW4gPSBsaXN0X2VudHJ5KGVsZSwgc3RydWN0IGNoYW4sIGxpc3QpOwogCQlpZighY2hhbi0+aW5wdXQgfHwgKGNoYW4tPm9wcy0+cmVhZCA9PSBOVUxMKSkgY29udGludWU7CiAJCWRvIHsKLQkJCWlmKCh0dHkgIT0gTlVMTCkgJiYKLQkJCSAgICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkpeworCQkJaWYgKHR0eSAmJiAhdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCAxKSkgewogCQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yayh0YXNrLCAxKTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9kYWVtb25fa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl9rZXJuLmMKaW5kZXggMzBkMjg1Yi4uNTA3ZTNjYiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl9rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl9rZXJuLmMKQEAgLTMxLDYgKzMxLDEwIEBACiAJZHByaS0+ZmQgPSAtMTsKIAlkcHJpLT5jb250cm9sID0gLTE7CiAJZHByaS0+ZGV2ID0gZGV2OworCS8qIFdlIHdpbGwgZnJlZSB0aGlzIHBvaW50ZXIuIElmIGl0IGNvbnRhaW5zIGNyYXAgd2UncmUgYnVybmVkLiAqLworCWRwcmktPmN0bF9hZGRyID0gTlVMTDsKKwlkcHJpLT5kYXRhX2FkZHIgPSBOVUxMOworCWRwcmktPmxvY2FsX2FkZHIgPSBOVUxMOwogCiAJcHJpbnRrKCJkYWVtb24gYmFja2VuZCAodW1sX3N3aXRjaCB2ZXJzaW9uICVkKSAtICVzOiVzIiwgCiAJICAgICAgIFNXSVRDSF9WRVJTSU9OLCBkcHJpLT5zb2NrX3R5cGUsIGRwcmktPmN0bF9zb2NrKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9kYWVtb25fdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMKaW5kZXggMWJiMDg1YjIuLmM5NDQyNjUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9kYWVtb25fdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9kYWVtb25fdXNlci5jCkBAIC0xNTgsMTAgKzE1OCwxNiBAQAogCXN0cnVjdCBkYWVtb25fZGF0YSAqcHJpID0gZGF0YTsKIAogCW9zX2Nsb3NlX2ZpbGUocHJpLT5mZCk7CisJcHJpLT5mZCA9IC0xOwogCW9zX2Nsb3NlX2ZpbGUocHJpLT5jb250cm9sKTsKKwlwcmktPmNvbnRyb2wgPSAtMTsKKwogCWtmcmVlKHByaS0+ZGF0YV9hZGRyKTsKKwlwcmktPmRhdGFfYWRkciA9IE5VTEw7CiAJa2ZyZWUocHJpLT5jdGxfYWRkcik7CisJcHJpLT5jdGxfYWRkciA9IE5VTEw7CiAJa2ZyZWUocHJpLT5sb2NhbF9hZGRyKTsKKwlwcmktPmxvY2FsX2FkZHIgPSBOVUxMOwogfQogCiBpbnQgZGFlbW9uX3VzZXJfd3JpdGUoaW50IGZkLCB2b2lkICpidWYsIGludCBsZW4sIHN0cnVjdCBkYWVtb25fZGF0YSAqcHJpKQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2ZkLmMgYi9hcmNoL3VtL2RyaXZlcnMvZmQuYwppbmRleCAzMjk2ZTg2Li5jNDFmNzVlIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvZmQuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvZmQuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJ1c2VyX3V0aWwuaCIKICNpbmNsdWRlICJjaGFuX3VzZXIuaCIKKyNpbmNsdWRlICJvcy5oIgogCiBzdHJ1Y3QgZmRfY2hhbiB7CiAJaW50IGZkOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlX2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV9rZXJuLmMKaW5kZXggYmU2MTAxMi4uZTNkNTc2NSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfa2Vybi5jCkBAIC01MDAsNyArNTAwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBjb25zb2xlIG1jX2NvbnNvbGUgPSB7IC5uYW1lCT0gIm1jIiwKIAkJCQkgICAgIC53cml0ZQk9IGNvbnNvbGVfd3JpdGUsCi0JCQkJICAgICAuZmxhZ3MJPSBDT05fUFJJTlRCVUZGRVIgfCBDT05fRU5BQkxFRCwKKwkJCQkgICAgIC5mbGFncwk9IENPTl9FTkFCTEVELAogCQkJCSAgICAgLmluZGV4CT0gLTEgfTsKIAogc3RhdGljIGludCBtY19hZGRfY29uc29sZSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL25ldF9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvbmV0X2tlcm4uYwppbmRleCBmYjFmOWZiLi44ZWJiMjI0IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbmV0X2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvbmV0X2tlcm4uYwpAQCAtNjgsNiArNjgsMTEgQEAKIAlyZXR1cm4gcGt0X2xlbjsKIH0KIAorc3RhdGljIHZvaWQgdW1sX2Rldl9jbG9zZSh2b2lkKiBkZXYpCit7CisJZGV2X2Nsb3NlKCAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2KTsKK30KKwogaXJxcmV0dXJuX3QgdW1sX25ldF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOwpAQCAtODAsMTUgKzg1LDIxIEBACiAJc3Bpbl9sb2NrKCZscC0+bG9jayk7CiAJd2hpbGUoKGVyciA9IHVtbF9uZXRfcngoZGV2KSkgPiAwKSA7CiAJaWYoZXJyIDwgMCkgeworCQlERUNMQVJFX1dPUksoY2xvc2Vfd29yaywgdW1sX2Rldl9jbG9zZSwgZGV2KTsKIAkJcHJpbnRrKEtFUk5fRVJSIAogCQkgICAgICAgIkRldmljZSAnJXMnIHJlYWQgcmV0dXJuZWQgJWQsIHNodXR0aW5nIGl0IGRvd25cbiIsIAogCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOwotCQlkZXZfY2xvc2UoZGV2KTsKKwkJLyogZGV2X2Nsb3NlIGNhbid0IGJlIGNhbGxlZCBpbiBpbnRlcnJ1cHQgY29udGV4dCwgYW5kIHRha2VzCisJCSAqIGFnYWluIGxwLT5sb2NrLgorCQkgKiBBbmQgZGV2X2Nsb3NlKCkgY2FuIGJlIHNhZmVseSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgb24gdGhlCisJCSAqIHNhbWUgZGV2aWNlLCBzaW5jZSBpdCB0ZXN0cyBmb3IgKGRldi0+ZmxhZ3MgJiBJRkZfVVApLiBTbworCQkgKiB0aGVyZSdzIG5vIGhhcm0gaW4gZGVsYXlpbmcgdGhlIGRldmljZSBzaHV0ZG93bi4gKi8KKwkJc2NoZWR1bGVfd29yaygmY2xvc2Vfd29yayk7CiAJCWdvdG8gb3V0OwogCX0KIAlyZWFjdGl2YXRlX2ZkKGxwLT5mZCwgVU1fRVRIX0lSUSk7CiAKLSBvdXQ6CitvdXQ6CiAJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKIAlyZXR1cm4oSVJRX0hBTkRMRUQpOwogfQpAQCAtMzE3LDYgKzMyOCwxMSBAQAogCQlyZXR1cm4gMTsKIAl9CiAKKwlscCA9IGRldi0+cHJpdjsKKwkvKiBUaGlzIHBvaW50cyB0byB0aGUgdHJhbnNwb3J0IHByaXZhdGUgZGF0YS4gSXQncyBzdGlsbCBjbGVhciwgYnV0IHdlCisJICogbXVzdCBtZW1zZXQgaXQgdG8gMCAqbm93Ki4gTGV0J3MgaGVscCB0aGUgZHJpdmVycy4gKi8KKwltZW1zZXQobHAsIDAsIHNpemUpOworCiAJLyogc3lzZnMgcmVnaXN0ZXIgKi8KIAlpZiAoIWRyaXZlcl9yZWdpc3RlcmVkKSB7CiAJCXBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdW1sX25ldF9kcml2ZXIpOwpAQCAtMzU4LDcgKzM3NCw2IEBACiAJCWZyZWVfbmV0ZGV2KGRldik7CiAJCXJldHVybiAxOwogCX0KLQlscCA9IGRldi0+cHJpdjsKIAogCS8qIGxwLnVzZXIgaXMgdGhlIGZpcnN0IGZvdXIgYnl0ZXMgb2YgdGhlIHRyYW5zcG9ydCBkYXRhLCB3aGljaAogCSAqIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuICBUaGlzIHN0cnVjdHVyZSBhc3NpZ25tZW50IHdpbGwKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL3ViZF9rZXJuLmMKaW5kZXggNzNmOTY1Mi4uMTAxZWZkMiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3ViZF9rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3ViZF9rZXJuLmMKQEAgLTExNyw2ICsxMTcsNyBAQAogc3RhdGljIGludCB1YmRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKTsKIHN0YXRpYyBpbnQgdWJkX2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCiAJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCB1YmRfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKTsKIAogI2RlZmluZSBNQVhfREVWICg4KQogCkBAIC0xMjUsNiArMTI2LDcgQEAKICAgICAgICAgLm9wZW4JCT0gdWJkX29wZW4sCiAgICAgICAgIC5yZWxlYXNlCT0gdWJkX3JlbGVhc2UsCiAgICAgICAgIC5pb2N0bAkJPSB1YmRfaW9jdGwsCisJLmdldGdlbwkJPSB1YmRfZ2V0Z2VvLAogfTsKIAogLyogUHJvdGVjdGVkIGJ5IHRoZSBxdWV1ZV9sb2NrICovCkBAIC0xMDU4LDEwICsxMDYwLDE5IEBACiAJfQogfQogCitzdGF0aWMgaW50IHViZF9nZXRnZW8oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8pCit7CisJc3RydWN0IHViZCAqZGV2ID0gYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOworCisJZ2VvLT5oZWFkcyA9IDEyODsKKwlnZW8tPnNlY3RvcnMgPSAzMjsKKwlnZW8tPmN5bGluZGVycyA9IGRldi0+c2l6ZSAvICgxMjggKiAzMiAqIDUxMik7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgdWJkX2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCiAJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0Jc3RydWN0IGhkX2dlb21ldHJ5IF9fdXNlciAqbG9jID0gKHN0cnVjdCBoZF9nZW9tZXRyeSBfX3VzZXIgKikgYXJnOwogCXN0cnVjdCB1YmQgKmRldiA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgaGRfZHJpdmVpZCB1YmRfaWQgPSB7CiAJCS5jeWxzCQk9IDAsCkBAIC0xMDcwLDE2ICsxMDgxLDcgQEAKIAl9OwogCiAJc3dpdGNoIChjbWQpIHsKLQkgICAgICAgIHN0cnVjdCBoZF9nZW9tZXRyeSBnOwogCQlzdHJ1Y3QgY2Ryb21fdm9sY3RybCB2b2x1bWU7Ci0JY2FzZSBIRElPX0dFVEdFTzoKLQkJaWYoIWxvYykgcmV0dXJuKC1FSU5WQUwpOwotCQlnLmhlYWRzID0gMTI4OwotCQlnLnNlY3RvcnMgPSAzMjsKLQkJZy5jeWxpbmRlcnMgPSBkZXYtPnNpemUgLyAoMTI4ICogMzIgKiA1MTIpOwotCQlnLnN0YXJ0ID0gZ2V0X3N0YXJ0X3NlY3QoaW5vZGUtPmlfYmRldik7Ci0JCXJldHVybihjb3B5X3RvX3VzZXIobG9jLCAmZywgc2l6ZW9mKGcpKSA/IC1FRkFVTFQgOiAwKTsKLQogCWNhc2UgSERJT19HRVRfSURFTlRJVFk6CiAJCXViZF9pZC5jeWxzID0gZGV2LT5zaXplIC8gKDEyOCAqIDMyICogNTEyKTsKIAkJaWYoY29weV90b191c2VyKChjaGFyIF9fdXNlciAqKSBhcmcsIChjaGFyICopICZ1YmRfaWQsCkBAIC0xMTAxLDMxICsxMTAzLDMzIEBACiAJcmV0dXJuKC1FSU5WQUwpOwogfQogCi1zdGF0aWMgaW50IHNhbWVfYmFja2luZ19maWxlcyhjaGFyICpmcm9tX2NtZGxpbmUsIGNoYXIgKmZyb21fY293LCBjaGFyICpjb3cpCitzdGF0aWMgaW50IHBhdGhfcmVxdWlyZXNfc3dpdGNoKGNoYXIgKmZyb21fY21kbGluZSwgY2hhciAqZnJvbV9jb3csIGNoYXIgKmNvdykKIHsKIAlzdHJ1Y3QgdW1sX3N0YXQgYnVmMSwgYnVmMjsKIAlpbnQgZXJyOwogCi0JaWYoZnJvbV9jbWRsaW5lID09IE5VTEwpIHJldHVybigxKTsKLQlpZighc3RyY21wKGZyb21fY21kbGluZSwgZnJvbV9jb3cpKSByZXR1cm4oMSk7CisJaWYoZnJvbV9jbWRsaW5lID09IE5VTEwpCisJCXJldHVybiAwOworCWlmKCFzdHJjbXAoZnJvbV9jbWRsaW5lLCBmcm9tX2NvdykpCisJCXJldHVybiAwOwogCiAJZXJyID0gb3Nfc3RhdF9maWxlKGZyb21fY21kbGluZSwgJmJ1ZjEpOwogCWlmKGVyciA8IDApewogCQlwcmludGsoIkNvdWxkbid0IHN0YXQgJyVzJywgZXJyID0gJWRcbiIsIGZyb21fY21kbGluZSwgLWVycik7Ci0JCXJldHVybigxKTsKKwkJcmV0dXJuIDA7CiAJfQogCWVyciA9IG9zX3N0YXRfZmlsZShmcm9tX2NvdywgJmJ1ZjIpOwogCWlmKGVyciA8IDApewogCQlwcmludGsoIkNvdWxkbid0IHN0YXQgJyVzJywgZXJyID0gJWRcbiIsIGZyb21fY293LCAtZXJyKTsKLQkJcmV0dXJuKDEpOworCQlyZXR1cm4gMTsKIAl9CiAJaWYoKGJ1ZjEudXN0X2RldiA9PSBidWYyLnVzdF9kZXYpICYmIChidWYxLnVzdF9pbm8gPT0gYnVmMi51c3RfaW5vKSkKLQkJcmV0dXJuKDEpOworCQlyZXR1cm4gMDsKIAogCXByaW50aygiQmFja2luZyBmaWxlIG1pc21hdGNoIC0gXCIlc1wiIHJlcXVlc3RlZCxcbiIKIAkgICAgICAgIlwiJXNcIiBzcGVjaWZpZWQgaW4gQ09XIGhlYWRlciBvZiBcIiVzXCJcbiIsCiAJICAgICAgIGZyb21fY21kbGluZSwgZnJvbV9jb3csIGNvdyk7Ci0JcmV0dXJuKDApOworCXJldHVybiAxOwogfQogCiBzdGF0aWMgaW50IGJhY2tpbmdfZmlsZV9taXNtYXRjaChjaGFyICpmaWxlLCBfX3U2NCBzaXplLCB0aW1lX3QgbXRpbWUpCkBAIC0xMTg3LDE4ICsxMTkxLDE5IEBACiAJdW5zaWduZWQgbG9uZyBsb25nIHNpemU7CiAJX191MzIgdmVyc2lvbiwgYWxpZ247CiAJY2hhciAqYmFja2luZ19maWxlOwotCWludCBmZCwgZXJyLCBzZWN0b3JzaXplLCBzYW1lLCBtb2RlID0gMDY0NDsKKwlpbnQgZmQsIGVyciwgc2VjdG9yc2l6ZSwgYXNrZWRfc3dpdGNoLCBtb2RlID0gMDY0NDsKIAogCWZkID0gb3Nfb3Blbl9maWxlKGZpbGUsICpvcGVuZmxhZ3MsIG1vZGUpOwotCWlmKGZkIDwgMCl7Ci0JCWlmKChmZCA9PSAtRU5PRU5UKSAmJiAoY3JlYXRlX2Nvd19vdXQgIT0gTlVMTCkpCisJaWYgKGZkIDwgMCkgeworCQlpZiAoKGZkID09IC1FTk9FTlQpICYmIChjcmVhdGVfY293X291dCAhPSBOVUxMKSkKIAkJCSpjcmVhdGVfY293X291dCA9IDE7Ci0gICAgICAgICAgICAgICAgaWYoIW9wZW5mbGFncy0+dyB8fAotICAgICAgICAgICAgICAgICAgICgoZmQgIT0gLUVST0ZTKSAmJiAoZmQgIT0gLUVBQ0NFUykpKSByZXR1cm4oZmQpOworICAgICAgICAgICAgICAgIGlmICghb3BlbmZsYWdzLT53IHx8CisgICAgICAgICAgICAgICAgICAgKChmZCAhPSAtRVJPRlMpICYmIChmZCAhPSAtRUFDQ0VTKSkpCisJCQlyZXR1cm4gZmQ7CiAJCW9wZW5mbGFncy0+dyA9IDA7CiAJCWZkID0gb3Nfb3Blbl9maWxlKGZpbGUsICpvcGVuZmxhZ3MsIG1vZGUpOwotCQlpZihmZCA8IDApCi0JCQlyZXR1cm4oZmQpOworCQlpZiAoZmQgPCAwKQorCQkJcmV0dXJuIGZkOwogICAgICAgICB9CiAKIAllcnIgPSBvc19sb2NrX2ZpbGUoZmQsIG9wZW5mbGFncy0+dyk7CkBAIC0xMjA3LDcgKzEyMTIsOSBAQAogCQlnb3RvIG91dF9jbG9zZTsKIAl9CiAKLQlpZihiYWNraW5nX2ZpbGVfb3V0ID09IE5VTEwpIHJldHVybihmZCk7CisJLyogU3VjY2VzZnVsIHJldHVybiBjYXNlISAqLworCWlmKGJhY2tpbmdfZmlsZV9vdXQgPT0gTlVMTCkKKwkJcmV0dXJuKGZkKTsKIAogCWVyciA9IHJlYWRfY293X2hlYWRlcihmaWxlX3JlYWRlciwgJmZkLCAmdmVyc2lvbiwgJmJhY2tpbmdfZmlsZSwgJm10aW1lLAogCQkJICAgICAgJnNpemUsICZzZWN0b3JzaXplLCAmYWxpZ24sIGJpdG1hcF9vZmZzZXRfb3V0KTsKQEAgLTEyMTYsMzQgKzEyMjMsMzQgQEAKIAkJICAgICAgICJlcnJubyA9ICVkXG4iLCBmaWxlLCAtZXJyKTsKIAkJZ290byBvdXRfY2xvc2U7CiAJfQotCWlmKGVycikgcmV0dXJuKGZkKTsKKwlpZihlcnIpCisJCXJldHVybihmZCk7CiAKLQlpZihiYWNraW5nX2ZpbGVfb3V0ID09IE5VTEwpIHJldHVybihmZCk7CisJYXNrZWRfc3dpdGNoID0gcGF0aF9yZXF1aXJlc19zd2l0Y2goKmJhY2tpbmdfZmlsZV9vdXQsIGJhY2tpbmdfZmlsZSwgZmlsZSk7CiAKLQlzYW1lID0gc2FtZV9iYWNraW5nX2ZpbGVzKCpiYWNraW5nX2ZpbGVfb3V0LCBiYWNraW5nX2ZpbGUsIGZpbGUpOwotCi0JaWYoIXNhbWUgJiYgIWJhY2tpbmdfZmlsZV9taXNtYXRjaCgqYmFja2luZ19maWxlX291dCwgc2l6ZSwgbXRpbWUpKXsKKwkvKiBBbGxvdyBzd2l0Y2hpbmcgb25seSBpZiBubyBtaXNtYXRjaC4gKi8KKwlpZiAoYXNrZWRfc3dpdGNoICYmICFiYWNraW5nX2ZpbGVfbWlzbWF0Y2goKmJhY2tpbmdfZmlsZV9vdXQsIHNpemUsIG10aW1lKSkgewogCQlwcmludGsoIlN3aXRjaGluZyBiYWNraW5nIGZpbGUgdG8gJyVzJ1xuIiwgKmJhY2tpbmdfZmlsZV9vdXQpOwogCQllcnIgPSB3cml0ZV9jb3dfaGVhZGVyKGZpbGUsIGZkLCAqYmFja2luZ19maWxlX291dCwKIAkJCQkgICAgICAgc2VjdG9yc2l6ZSwgYWxpZ24sICZzaXplKTsKLQkJaWYoZXJyKXsKKwkJaWYgKGVycikgewogCQkJcHJpbnRrKCJTd2l0Y2ggZmFpbGVkLCBlcnJubyA9ICVkXG4iLCAtZXJyKTsKLQkJCXJldHVybihlcnIpOworCQkJZ290byBvdXRfY2xvc2U7CiAJCX0KLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJKmJhY2tpbmdfZmlsZV9vdXQgPSBiYWNraW5nX2ZpbGU7CiAJCWVyciA9IGJhY2tpbmdfZmlsZV9taXNtYXRjaCgqYmFja2luZ19maWxlX291dCwgc2l6ZSwgbXRpbWUpOwotCQlpZihlcnIpIGdvdG8gb3V0X2Nsb3NlOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfY2xvc2U7CiAJfQogCiAJY293X3NpemVzKHZlcnNpb24sIHNpemUsIHNlY3RvcnNpemUsIGFsaWduLCAqYml0bWFwX29mZnNldF9vdXQsCiAJCSAgYml0bWFwX2xlbl9vdXQsIGRhdGFfb2Zmc2V0X291dCk7CiAKLSAgICAgICAgcmV0dXJuKGZkKTsKKyAgICAgICAgcmV0dXJuIGZkOwogIG91dF9jbG9zZToKIAlvc19jbG9zZV9maWxlKGZkKTsKLQlyZXR1cm4oZXJyKTsKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgY3JlYXRlX2Nvd19maWxlKGNoYXIgKmNvd19maWxlLCBjaGFyICpiYWNraW5nX2ZpbGUsIHN0cnVjdCBvcGVuZmxhZ3MgZmxhZ3MsCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUva2Vybl91dGlsLmggYi9hcmNoL3VtL2luY2x1ZGUva2Vybl91dGlsLmgKaW5kZXggZTVmZWM1NS4uYzY0OTEwOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2tlcm5fdXRpbC5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9rZXJuX3V0aWwuaApAQCAtMSw0ICsxLDQgQEAKLS8qIAorLyoKICAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCiAgKi8KQEAgLTEwLDYgKzEwLDE5IEBACiAjaW5jbHVkZSAic3lzZGVwL3B0cmFjZS5oIgogI2luY2x1ZGUgInN5c2RlcC9mYXVsdGluZm8uaCIKIAordHlwZWRlZiB2b2lkICgqa2Vybl9obmRsKShpbnQsIHVuaW9uIHVtbF9wdF9yZWdzICopOworCitzdHJ1Y3Qga2Vybl9oYW5kbGVycyB7CisJa2Vybl9obmRsIHJlbGF5X3NpZ25hbDsKKwlrZXJuX2huZGwgd2luY2g7CisJa2Vybl9obmRsIGJ1c19oYW5kbGVyOworCWtlcm5faG5kbCBwYWdlX2ZhdWx0OworCWtlcm5faG5kbCBzaWdpb19oYW5kbGVyOworCWtlcm5faG5kbCB0aW1lcl9oYW5kbGVyOworfTsKKworZXh0ZXJuIHN0cnVjdCBrZXJuX2hhbmRsZXJzIGhhbmRsaW5mb19rZXJuOworCiBleHRlcm4gaW50IG5jcHVzOwogZXh0ZXJuIGNoYXIgKmxpbnV4X3Byb2c7CiBleHRlcm4gY2hhciAqZ2RiX2luaXQ7CkBAIC01MSw4ICs2NCw2IEBACiBleHRlcm4gaW50IHNldF9zaWduYWxzKGludCBlbmFibGUpOwogZXh0ZXJuIHZvaWQgZm9yY2Vfc2lnYnVzKHZvaWQpOwogZXh0ZXJuIGludCBwaWRfdG9fcHJvY2Vzc29yX2lkKGludCBwaWQpOwotZXh0ZXJuIHZvaWQgYmxvY2tfc2lnbmFscyh2b2lkKTsKLWV4dGVybiB2b2lkIHVuYmxvY2tfc2lnbmFscyh2b2lkKTsKIGV4dGVybiB2b2lkIGRlbGl2ZXJfc2lnbmFscyh2b2lkICp0KTsKIGV4dGVybiBpbnQgbmV4dF9zeXNjYWxsX2luZGV4KGludCBtYXgpOwogZXh0ZXJuIGludCBuZXh0X3RyYXBfaW5kZXgoaW50IG1heCk7CkBAIC0xMDksOSArMTIwLDEzIEBACiBleHRlcm4gaW50IGlzX3N5c2NhbGwodW5zaWduZWQgbG9uZyBhZGRyKTsKIGV4dGVybiB2b2lkIGFyY2hfc3dpdGNoKHZvaWQpOwogZXh0ZXJuIHZvaWQgZnJlZV9pcnEodW5zaWduZWQgaW50LCB2b2lkICopOwotZXh0ZXJuIGludCB1bV9pbl9pbnRlcnJ1cHQodm9pZCk7CiBleHRlcm4gaW50IGNwdSh2b2lkKTsKIAorLyogQXJlIHdlIGRpc2FsbG93ZWQgdG8gc2xlZXA/IFVzZWQgdG8gY2hvb3NlIGJldHdlZW4gR0ZQX0tFUk5FTCBhbmQgR0ZQX0FUT01JQy4gKi8KK2V4dGVybiBpbnQgX19jYW50X3NsZWVwKHZvaWQpOworZXh0ZXJuIHZvaWQgc2Vndl9oYW5kbGVyKGludCBzaWcsIHVuaW9uIHVtbF9wdF9yZWdzICpyZWdzKTsKK2V4dGVybiB2b2lkIHNpZ2lvX2hhbmRsZXIoaW50IHNpZywgdW5pb24gdW1sX3B0X3JlZ3MgKnJlZ3MpOworCiAjZW5kaWYKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9sb25nam1wLmggYi9hcmNoL3VtL2luY2x1ZGUvbG9uZ2ptcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOGIzODEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL2luY2x1ZGUvbG9uZ2ptcC5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX19VTUxfTE9OR0pNUF9ICisjZGVmaW5lIF9fVU1MX0xPTkdKTVBfSAorCisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSAib3MuaCIKKworI2RlZmluZSBVTUxfU0lHTE9OR0pNUChidWYsIHZhbCkgZG8geyBcCisJbG9uZ2ptcCgqYnVmLCB2YWwpOwlcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgVU1MX1NJR1NFVEpNUChidWYsIGVuYWJsZSkgKHsgXAorCWludCBuOyBcCisJZW5hYmxlID0gZ2V0X3NpZ25hbHMoKTsgXAorCW4gPSBzZXRqbXAoKmJ1Zik7IFwKKwlpZihuICE9IDApIFwKKwkJc2V0X3NpZ25hbHMoZW5hYmxlKTsgXAorCW47IH0pCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL21vZGVfa2Vybi5oIGIvYXJjaC91bS9pbmNsdWRlL21vZGVfa2Vybi5oCmluZGV4IDJkODhhZmQuLmU3NTM5YTggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9tb2RlX2tlcm4uaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvbW9kZV9rZXJuLmgKQEAgLTksMjIgKzksMTEgQEAKICNpbmNsdWRlICJsaW51eC9jb25maWcuaCIKIAogI2lmZGVmIENPTkZJR19NT0RFX1RUCi0jaW5jbHVkZSAibW9kZV9rZXJuLXR0LmgiCisjaW5jbHVkZSAibW9kZV9rZXJuX3R0LmgiCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19NT0RFX1NLQVMKLSNpbmNsdWRlICJtb2RlX2tlcm4tc2thcy5oIgorI2luY2x1ZGUgIm1vZGVfa2Vybl9za2FzLmgiCiAjZW5kaWYKIAogI2VuZGlmCi0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvb3MuaCBiL2FyY2gvdW0vaW5jbHVkZS9vcy5oCmluZGV4IGMyNzllZTYuLmViMTcxMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9vcy5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9vcy5oCkBAIC05LDYgKzksOSBAQAogI2luY2x1ZGUgInVtbC1jb25maWcuaCIKICNpbmNsdWRlICJhc20vdHlwZXMuaCIKICNpbmNsdWRlICIuLi9vcy9pbmNsdWRlL2ZpbGUuaCIKKyNpbmNsdWRlICJzeXNkZXAvcHRyYWNlLmgiCisjaW5jbHVkZSAia2Vybl91dGlsLmgiCisjaW5jbHVkZSAic2thcy9tbV9pZC5oIgogCiAjZGVmaW5lIE9TX1RZUEVfRklMRSAxIAogI2RlZmluZSBPU19UWVBFX0RJUiAyIApAQCAtMTg4LDExICsxOTEsMTIgQEAKIAkJCSAgICAgaW50IHIsIGludCB3LCBpbnQgeCk7CiBleHRlcm4gaW50IG9zX3VubWFwX21lbW9yeSh2b2lkICphZGRyLCBpbnQgbGVuKTsKIGV4dGVybiB2b2lkIG9zX2ZsdXNoX3N0ZG91dCh2b2lkKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgb3NfdXNlY3Modm9pZCk7CiAKIC8qIHR0LmMKICAqIGZvciB0dCBtb2RlIG9ubHkgKHdpbGwgYmUgZGVsZXRlZCBpbiBmdXR1cmUuLi4pCiAgKi8KK2V4dGVybiB2b2lkIHN0b3Aodm9pZCk7CitleHRlcm4gaW50IHdhaXRfZm9yX3N0b3AoaW50IHBpZCwgaW50IHNpZywgaW50IGNvbnRfdHlwZSwgdm9pZCAqcmVsYXkpOwogZXh0ZXJuIGludCBwcm90ZWN0X21lbW9yeSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAogCQkJICBpbnQgciwgaW50IHcsIGludCB4LCBpbnQgbXVzdF9zdWNjZWVkKTsKIGV4dGVybiB2b2lkIGZvcndhcmRfcGVuZGluZ19zaWdpbyhpbnQgdGFyZ2V0KTsKQEAgLTIxOSw0ICsyMjMsNzIgQEAKIGV4dGVybiBpbnQgc2V0X3VtaWQoY2hhciAqbmFtZSk7CiBleHRlcm4gY2hhciAqZ2V0X3VtaWQodm9pZCk7CiAKKy8qIHNpZ25hbC5jICovCitleHRlcm4gdm9pZCBzZXRfc2lnc3RhY2sodm9pZCAqc2lnX3N0YWNrLCBpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCByZW1vdmVfc2lnc3RhY2sodm9pZCk7CitleHRlcm4gdm9pZCBzZXRfaGFuZGxlcihpbnQgc2lnLCB2b2lkICgqaGFuZGxlcikoaW50KSwgaW50IGZsYWdzLCAuLi4pOworZXh0ZXJuIGludCBjaGFuZ2Vfc2lnKGludCBzaWduYWwsIGludCBvbik7CitleHRlcm4gdm9pZCBibG9ja19zaWduYWxzKHZvaWQpOworZXh0ZXJuIHZvaWQgdW5ibG9ja19zaWduYWxzKHZvaWQpOworZXh0ZXJuIGludCBnZXRfc2lnbmFscyh2b2lkKTsKK2V4dGVybiBpbnQgc2V0X3NpZ25hbHMoaW50IGVuYWJsZSk7CitleHRlcm4gdm9pZCBvc191c3IxX3NpZ25hbChpbnQgb24pOworCisvKiB0cmFwLmMgKi8KK2V4dGVybiB2b2lkIG9zX2ZpbGxfaGFuZGxpbmZvKHN0cnVjdCBrZXJuX2hhbmRsZXJzIGgpOworZXh0ZXJuIHZvaWQgZG9fbG9uZ2ptcCh2b2lkICpwLCBpbnQgdmFsKTsKKworLyogdXRpbC5jICovCitleHRlcm4gdm9pZCBzdGFja19wcm90ZWN0aW9ucyh1bnNpZ25lZCBsb25nIGFkZHJlc3MpOworZXh0ZXJuIHZvaWQgdGFza19wcm90ZWN0aW9ucyh1bnNpZ25lZCBsb25nIGFkZHJlc3MpOworZXh0ZXJuIGludCByYXcoaW50IGZkKTsKK2V4dGVybiB2b2lkIHNldHVwX21hY2hpbmVuYW1lKGNoYXIgKm1hY2hpbmVfb3V0KTsKK2V4dGVybiB2b2lkIHNldHVwX2hvc3RpbmZvKHZvaWQpOworZXh0ZXJuIGludCBzZXRqbXBfd3JhcHBlcih2b2lkICgqcHJvYykodm9pZCAqLCB2b2lkICopLCAuLi4pOworCisvKiB0aW1lLmMgKi8KKyNkZWZpbmUgQklMTElPTiAoMTAwMCAqIDEwMDAgKiAxMDAwKQorCitleHRlcm4gdm9pZCBzd2l0Y2hfdGltZXJzKGludCB0b19yZWFsKTsKK2V4dGVybiB2b2lkIGlkbGVfc2xlZXAoaW50IHNlY3MpOworZXh0ZXJuIHZvaWQgZW5hYmxlX3RpbWVyKHZvaWQpOworZXh0ZXJuIHZvaWQgZGlzYWJsZV90aW1lcih2b2lkKTsKK2V4dGVybiB2b2lkIHVzZXJfdGltZV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgdW1sX2lkbGVfdGltZXIodm9pZCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIG9zX25zZWNzKHZvaWQpOworCisvKiBza2FzL21lbS5jICovCitleHRlcm4gbG9uZyBydW5fc3lzY2FsbF9zdHViKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCwKKwkJCSAgICAgaW50IHN5c2NhbGwsIHVuc2lnbmVkIGxvbmcgKmFyZ3MsIGxvbmcgZXhwZWN0ZWQsCisJCQkgICAgIHZvaWQgKiphZGRyLCBpbnQgZG9uZSk7CitleHRlcm4gbG9uZyBzeXNjYWxsX3N0dWJfZGF0YShzdHJ1Y3QgbW1faWQgKiBtbV9pZHAsCisJCQkgICAgICB1bnNpZ25lZCBsb25nICpkYXRhLCBpbnQgZGF0YV9jb3VudCwKKwkJCSAgICAgIHZvaWQgKiphZGRyLCB2b2lkICoqc3R1Yl9hZGRyKTsKK2V4dGVybiBpbnQgbWFwKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCwgdW5zaWduZWQgbG9uZyB2aXJ0LAorCSAgICAgICB1bnNpZ25lZCBsb25nIGxlbiwgaW50IHIsIGludCB3LCBpbnQgeCwgaW50IHBoeXNfZmQsCisJICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQsIGludCBkb25lLCB2b2lkICoqZGF0YSk7CitleHRlcm4gaW50IHVubWFwKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCisJCSBpbnQgZG9uZSwgdm9pZCAqKmRhdGEpOworZXh0ZXJuIGludCBwcm90ZWN0KHN0cnVjdCBtbV9pZCAqIG1tX2lkcCwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkgICB1bnNpZ25lZCBsb25nIGxlbiwgaW50IHIsIGludCB3LCBpbnQgeCwgaW50IGRvbmUsCisJCSAgIHZvaWQgKipkYXRhKTsKKworLyogc2thcy9wcm9jZXNzLmMgKi8KK2V4dGVybiBpbnQgaXNfc2thc193aW5jaChpbnQgcGlkLCBpbnQgZmQsIHZvaWQgKmRhdGEpOworZXh0ZXJuIGludCBzdGFydF91c2Vyc3BhY2UodW5zaWduZWQgbG9uZyBzdHViX3N0YWNrKTsKK2V4dGVybiBpbnQgY29weV9jb250ZXh0X3NrYXMwKHVuc2lnbmVkIGxvbmcgc3RhY2ssIGludCBwaWQpOworZXh0ZXJuIHZvaWQgdXNlcnNwYWNlKHVuaW9uIHVtbF9wdF9yZWdzICpyZWdzKTsKK2V4dGVybiB2b2lkIG1hcF9zdHViX3BhZ2VzKGludCBmZCwgdW5zaWduZWQgbG9uZyBjb2RlLAorCQkJICAgdW5zaWduZWQgbG9uZyBkYXRhLCB1bnNpZ25lZCBsb25nIHN0YWNrKTsKK2V4dGVybiB2b2lkIG5ld190aHJlYWQodm9pZCAqc3RhY2ssIHZvaWQgKipzd2l0Y2hfYnVmX3B0ciwKKwkJCSB2b2lkICoqZm9ya19idWZfcHRyLCB2b2lkICgqaGFuZGxlcikoaW50KSk7CitleHRlcm4gdm9pZCB0aHJlYWRfd2FpdCh2b2lkICpzdywgdm9pZCAqZmIpOworZXh0ZXJuIHZvaWQgc3dpdGNoX3RocmVhZHModm9pZCAqbWUsIHZvaWQgKm5leHQpOworZXh0ZXJuIGludCBzdGFydF9pZGxlX3RocmVhZCh2b2lkICpzdGFjaywgdm9pZCAqc3dpdGNoX2J1Zl9wdHIsCisJCQkgICAgIHZvaWQgKipmb3JrX2J1Zl9wdHIpOworZXh0ZXJuIHZvaWQgaW5pdGlhbF90aHJlYWRfY2Jfc2thcyh2b2lkICgqcHJvYykodm9pZCAqKSwKKwkJCQkgdm9pZCAqYXJnKTsKK2V4dGVybiB2b2lkIGhhbHRfc2thcyh2b2lkKTsKK2V4dGVybiB2b2lkIHJlYm9vdF9za2FzKHZvaWQpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zaWduYWxfdXNlci5oIGIvYXJjaC91bS9pbmNsdWRlL3NpZ25hbF91c2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNzVlNTQuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3NpZ25hbF91c2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMSBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1NJR05BTF9VU0VSX0hfXwotI2RlZmluZSBfX1NJR05BTF9VU0VSX0hfXwotCi1leHRlcm4gaW50IHNpZ25hbF9zdGFja19zaXplOwotCi1leHRlcm4gaW50IGNoYW5nZV9zaWcoaW50IHNpZ25hbCwgaW50IG9uKTsKLWV4dGVybiB2b2lkIHNldF9zaWdzdGFjayh2b2lkICpzdGFjaywgaW50IHNpemUpOwotZXh0ZXJuIHZvaWQgc2V0X2hhbmRsZXIoaW50IHNpZywgdm9pZCAoKmhhbmRsZXIpKGludCksIGludCBmbGFncywgLi4uKTsKLWV4dGVybiBpbnQgc2V0X3NpZ25hbHMoaW50IGVuYWJsZSk7Ci1leHRlcm4gaW50IGdldF9zaWduYWxzKHZvaWQpOwotCi0jZW5kaWYKLQotLyoKLSAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgotICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5Ci0gKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgZmlsZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1maWxlLXN0eWxlOiAibGludXgiCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9tbV9pZC5oIGIvYXJjaC91bS9pbmNsdWRlL3NrYXMvbW1faWQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21tX2lkLmgKcmVuYW1lIHRvIGFyY2gvdW0vaW5jbHVkZS9za2FzL21tX2lkLmgKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9za2FzL21tdS1za2FzLmggYi9hcmNoL3VtL2luY2x1ZGUvc2thcy9tbXUtc2thcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ODY5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc2thcy9tbXUtc2thcy5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpZm5kZWYgX19TS0FTX01NVV9ICisjZGVmaW5lIF9fU0tBU19NTVVfSAorCisjaW5jbHVkZSAibGludXgvY29uZmlnLmgiCisjaW5jbHVkZSAibW1faWQuaCIKKyNpbmNsdWRlICJhc20vbGR0LmgiCisKK3N0cnVjdCBtbXVfY29udGV4dF9za2FzIHsKKwlzdHJ1Y3QgbW1faWQgaWQ7CisJdW5zaWduZWQgbG9uZyBsYXN0X3BhZ2VfdGFibGU7CisjaWZkZWYgQ09ORklHXzNfTEVWRUxfUEdUQUJMRVMKKwl1bnNpZ25lZCBsb25nIGxhc3RfcG1kOworI2VuZGlmCisJdW1sX2xkdF90IGxkdDsKK307CisKK2V4dGVybiB2b2lkIHN3aXRjaF9tbV9za2FzKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3NrYXMvbW9kZS1za2FzLmggYi9hcmNoL3VtL2luY2x1ZGUvc2thcy9tb2RlLXNrYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjAwNjVjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9pbmNsdWRlL3NrYXMvbW9kZS1za2FzLmgKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2lmbmRlZiBfX01PREVfU0tBU19IX18KKyNkZWZpbmUgX19NT0RFX1NLQVNfSF9fCisKKyNpbmNsdWRlIDxzeXNkZXAvcHRyYWNlLmg+CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIGV4ZWNfcmVnc1tdOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXhlY19mcF9yZWdzW107CitleHRlcm4gdW5zaWduZWQgbG9uZyBleGVjX2ZweF9yZWdzW107CitleHRlcm4gaW50IGhhdmVfZnB4X3JlZ3M7CisKK2V4dGVybiB2b2lkIHNpZ19oYW5kbGVyX2NvbW1vbl9za2FzKGludCBzaWcsIHZvaWQgKnNjX3B0cik7CitleHRlcm4gdm9pZCBraWxsX29mZl9wcm9jZXNzZXNfc2thcyh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc2thcy9tb2RlX2tlcm5fc2thcy5oIGIvYXJjaC91bS9pbmNsdWRlL3NrYXMvbW9kZV9rZXJuX3NrYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2M1ODczCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9pbmNsdWRlL3NrYXMvbW9kZV9rZXJuX3NrYXMuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fU0tBU19NT0RFX0tFUk5fSF9fCisjZGVmaW5lIF9fU0tBU19NT0RFX0tFUk5fSF9fCisKKyNpbmNsdWRlICJsaW51eC9zY2hlZC5oIgorI2luY2x1ZGUgImFzbS9wYWdlLmgiCisjaW5jbHVkZSAiYXNtL3B0cmFjZS5oIgorCitleHRlcm4gdm9pZCBmbHVzaF90aHJlYWRfc2thcyh2b2lkKTsKK2V4dGVybiB2b2lkIHN3aXRjaF90b19za2FzKHZvaWQgKnByZXYsIHZvaWQgKm5leHQpOworZXh0ZXJuIHZvaWQgc3RhcnRfdGhyZWFkX3NrYXMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgZWlwLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBlc3ApOworZXh0ZXJuIGludCBjb3B5X3RocmVhZF9za2FzKGludCBuciwgdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncywKKwkJCSAgICB1bnNpZ25lZCBsb25nIHNwLCB1bnNpZ25lZCBsb25nIHN0YWNrX3RvcCwKKwkJCSAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiB2b2lkIHJlbGVhc2VfdGhyZWFkX3NrYXMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKK2V4dGVybiB2b2lkIGluaXRfaWRsZV9za2FzKHZvaWQpOworZXh0ZXJuIHZvaWQgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZV9za2FzKHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkJCXVuc2lnbmVkIGxvbmcgZW5kKTsKK2V4dGVybiB2b2lkIGZsdXNoX3RsYl9rZXJuZWxfdm1fc2thcyh2b2lkKTsKK2V4dGVybiB2b2lkIF9fZmx1c2hfdGxiX29uZV9za2FzKHVuc2lnbmVkIGxvbmcgYWRkcik7CitleHRlcm4gdm9pZCBmbHVzaF90bGJfcmFuZ2Vfc2thcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOworZXh0ZXJuIHZvaWQgZmx1c2hfdGxiX21tX3NrYXMoc3RydWN0IG1tX3N0cnVjdCAqbW0pOworZXh0ZXJuIHZvaWQgZm9yY2VfZmx1c2hfYWxsX3NrYXModm9pZCk7CitleHRlcm4gbG9uZyBleGVjdXRlX3N5c2NhbGxfc2thcyh2b2lkICpyKTsKK2V4dGVybiB2b2lkIGJlZm9yZV9tZW1fc2thcyh1bnNpZ25lZCBsb25nIHVudXNlZCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBzZXRfdGFza19zaXplc19za2FzKGludCBhcmcsIHVuc2lnbmVkIGxvbmcgKmhvc3Rfc2l6ZV9vdXQsCisJCQkJCSB1bnNpZ25lZCBsb25nICp0YXNrX3NpemVfb3V0KTsKK2V4dGVybiBpbnQgc3RhcnRfdW1sX3NrYXModm9pZCk7CitleHRlcm4gaW50IGV4dGVybmFsX3BpZF9za2FzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CitleHRlcm4gaW50IHRocmVhZF9waWRfc2thcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOworCisjZGVmaW5lIGttZW1fZW5kX3NrYXMgKGhvc3RfdGFza19zaXplIC0gMTAyNCAqIDEwMjQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3NrYXMvcHJvY19tbS5oIGIvYXJjaC91bS9pbmNsdWRlL3NrYXMvcHJvY19tbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMjgwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc2thcy9wcm9jX21tLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2lmbmRlZiBfX1NLQVNfUFJPQ19NTV9ICisjZGVmaW5lIF9fU0tBU19QUk9DX01NX0gKKworI2RlZmluZSBNTV9NTUFQIDU0CisjZGVmaW5lIE1NX01VTk1BUCA1NQorI2RlZmluZSBNTV9NUFJPVEVDVCA1NgorI2RlZmluZSBNTV9DT1BZX1NFR01FTlRTIDU3CisKK3N0cnVjdCBtbV9tbWFwIHsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdW5zaWduZWQgbG9uZyBsZW47CisJdW5zaWduZWQgbG9uZyBwcm90OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmZDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKK307CisKK3N0cnVjdCBtbV9tdW5tYXAgeworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl1bnNpZ25lZCBsb25nIGxlbjsKK307CisKK3N0cnVjdCBtbV9tcHJvdGVjdCB7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCXVuc2lnbmVkIGxvbmcgbGVuOworCXVuc2lnbmVkIGludCBwcm90OworfTsKKworc3RydWN0IHByb2NfbW1fb3AgeworCWludCBvcDsKKwl1bmlvbiB7CisJCXN0cnVjdCBtbV9tbWFwIG1tYXA7CisJCXN0cnVjdCBtbV9tdW5tYXAgbXVubWFwOworCSAgICAgICAgc3RydWN0IG1tX21wcm90ZWN0IG1wcm90ZWN0OworCQlpbnQgY29weV9zZWdtZW50czsKKwl9IHU7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9za2FzL3NrYXMuaCBiL2FyY2gvdW0vaW5jbHVkZS9za2FzL3NrYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjM1NzI4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9pbmNsdWRlL3NrYXMvc2thcy5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpZm5kZWYgX19TS0FTX0gKKyNkZWZpbmUgX19TS0FTX0gKKworI2luY2x1ZGUgIm1tX2lkLmgiCisjaW5jbHVkZSAic3lzZGVwL3B0cmFjZS5oIgorCitleHRlcm4gaW50IHVzZXJzcGFjZV9waWRbXTsKK2V4dGVybiBpbnQgcHJvY19tbSwgcHRyYWNlX2ZhdWx0aW5mbywgcHRyYWNlX2xkdDsKK2V4dGVybiBpbnQgc2thc19uZWVkc19zdHViOworCitleHRlcm4gaW50IHVzZXJfdGhyZWFkKHVuc2lnbmVkIGxvbmcgc3RhY2ssIGludCBmbGFncyk7CitleHRlcm4gdm9pZCBuZXdfdGhyZWFkX3Byb2Modm9pZCAqc3RhY2ssIHZvaWQgKCpoYW5kbGVyKShpbnQgc2lnKSk7CitleHRlcm4gdm9pZCBuZXdfdGhyZWFkX2hhbmRsZXIoaW50IHNpZyk7CitleHRlcm4gdm9pZCBoYW5kbGVfc3lzY2FsbCh1bmlvbiB1bWxfcHRfcmVncyAqcmVncyk7CitleHRlcm4gdm9pZCB1c2VyX3NpZ25hbChpbnQgc2lnLCB1bmlvbiB1bWxfcHRfcmVncyAqcmVncywgaW50IHBpZCk7CitleHRlcm4gaW50IG5ld19tbSh1bnNpZ25lZCBsb25nIHN0YWNrKTsKK2V4dGVybiB2b2lkIGdldF9za2FzX2ZhdWx0aW5mbyhpbnQgcGlkLCBzdHJ1Y3QgZmF1bHRpbmZvICogZmkpOworZXh0ZXJuIGxvbmcgZXhlY3V0ZV9zeXNjYWxsX3NrYXModm9pZCAqcik7CitleHRlcm4gdW5zaWduZWQgbG9uZyBjdXJyZW50X3N0dWJfc3RhY2sodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL3N0dWItZGF0YS5oIGIvYXJjaC91bS9pbmNsdWRlL3NrYXMvc3R1Yi1kYXRhLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9zdHViLWRhdGEuaApyZW5hbWUgdG8gYXJjaC91bS9pbmNsdWRlL3NrYXMvc3R1Yi1kYXRhLmgKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9za2FzL3VhY2Nlc3Mtc2thcy5oIGIvYXJjaC91bS9pbmNsdWRlL3NrYXMvdWFjY2Vzcy1za2FzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI0YTc1ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9za2FzL3VhY2Nlc3Mtc2thcy5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpZm5kZWYgX19TS0FTX1VBQ0NFU1NfSAorI2RlZmluZSBfX1NLQVNfVUFDQ0VTU19ICisKKyNpbmNsdWRlICJhc20vZXJybm8uaCIKKworLyogTm8gU0tBUy1zcGVjaWZpYyBjaGVja2luZy4gKi8KKyNkZWZpbmUgYWNjZXNzX29rX3NrYXModHlwZSwgYWRkciwgc2l6ZSkgMAorCitleHRlcm4gaW50IGNvcHlfZnJvbV91c2VyX3NrYXModm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCBpbnQgbik7CitleHRlcm4gaW50IGNvcHlfdG9fdXNlcl9za2FzKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgaW50IG4pOworZXh0ZXJuIGludCBzdHJuY3B5X2Zyb21fdXNlcl9za2FzKGNoYXIgKmRzdCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywgaW50IGNvdW50KTsKK2V4dGVybiBpbnQgX19jbGVhcl91c2VyX3NrYXModm9pZCBfX3VzZXIgKm1lbSwgaW50IGxlbik7CitleHRlcm4gaW50IGNsZWFyX3VzZXJfc2thcyh2b2lkIF9fdXNlciAqbWVtLCBpbnQgbGVuKTsKK2V4dGVybiBpbnQgc3Rybmxlbl91c2VyX3NrYXMoY29uc3Qgdm9pZCBfX3VzZXIgKnN0ciwgaW50IGxlbik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC1pMzg2L2NoZWNrc3VtLmggYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvY2hlY2tzdW0uaAppbmRleCA3NjRiYTRkLi43ZDNkMjAyIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvY2hlY2tzdW0uaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvY2hlY2tzdW0uaApAQCAtMzYsNyArMzYsNyBAQAogCQkJCSAgICAgICBpbnQgbGVuLCBpbnQgc3VtKQogewogCW1lbWNweShkc3QsIHNyYywgbGVuKTsKLQlyZXR1cm4oY3N1bV9wYXJ0aWFsKGRzdCwgbGVuLCBzdW0pKTsKKwlyZXR1cm4gY3N1bV9wYXJ0aWFsKGRzdCwgbGVuLCBzdW0pOwogfQogCiAvKgpAQCAtMTA0LDcgKzEwNCw3IEBACiAJOiAiPXIiIChzdW0pLCAiPXIiIChpcGgpLCAiPXIiIChpaGwpCiAJOiAiMSIgKGlwaCksICIyIiAoaWhsKQogCTogIm1lbW9yeSIpOwotCXJldHVybihzdW0pOworCXJldHVybiBzdW07CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYva2VybmVsLW9mZnNldHMuaCBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9rZXJuZWwtb2Zmc2V0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZjk2YzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYva2VybmVsLW9mZnNldHMuaApAQCAtMCwwICsxLDIzIEBACisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKworI2RlZmluZSBERUZJTkUoc3ltLCB2YWwpIFwKKwlhc20gdm9sYXRpbGUoIlxuLT4iICNzeW0gIiAlMCAiICN2YWwgOiA6ICJpIiAodmFsKSkKKworI2RlZmluZSBTVFIoeCkgI3gKKyNkZWZpbmUgREVGSU5FX1NUUihzeW0sIHZhbCkgYXNtIHZvbGF0aWxlKCJcbi0+IiAjc3ltICIgIiBTVFIodmFsKSAiICIgI3ZhbDogOiApCisKKyNkZWZpbmUgQkxBTksoKSBhc20gdm9sYXRpbGUoIlxuLT4iIDogOiApCisKKyNkZWZpbmUgT0ZGU0VUKHN5bSwgc3RyLCBtZW0pIFwKKwlERUZJTkUoc3ltLCBvZmZzZXRvZihzdHJ1Y3Qgc3RyLCBtZW0pKTsKKwordm9pZCBmb28odm9pZCkKK3sKKwlPRkZTRVQoSE9TVF9UQVNLX0RFQlVHUkVHUywgdGFza19zdHJ1Y3QsIHRocmVhZC5hcmNoLmRlYnVncmVncyk7CisjaWZkZWYgQ09ORklHX01PREVfVFQKKwlPRkZTRVQoSE9TVF9UQVNLX0VYVEVSTl9QSUQsIHRhc2tfc3RydWN0LCB0aHJlYWQubW9kZS50dC5leHRlcm5fcGlkKTsKKyNlbmRpZgorI2luY2x1ZGUgPGNvbW1vbi1vZmZzZXRzLmg+Cit9CmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9rZXJuZWwtb2Zmc2V0cy5oIGIvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQva2VybmVsLW9mZnNldHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2U5M2FiZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L2tlcm5lbC1vZmZzZXRzLmgKQEAgLTAsMCArMSwyNSBAQAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKKyNkZWZpbmUgREVGSU5FKHN5bSwgdmFsKSBcCisJYXNtIHZvbGF0aWxlKCJcbi0+IiAjc3ltICIgJTAgIiAjdmFsIDogOiAiaSIgKHZhbCkpCisKKyNkZWZpbmUgREVGSU5FX1NUUjEoeCkgI3gKKyNkZWZpbmUgREVGSU5FX1NUUihzeW0sIHZhbCkgYXNtIHZvbGF0aWxlKCJcbi0+IiAjc3ltICIgIiBERUZJTkVfU1RSMSh2YWwpICIgIiAjdmFsOiA6ICkKKworI2RlZmluZSBCTEFOSygpIGFzbSB2b2xhdGlsZSgiXG4tPiIgOiA6ICkKKworI2RlZmluZSBPRkZTRVQoc3ltLCBzdHIsIG1lbSkgXAorCURFRklORShzeW0sIG9mZnNldG9mKHN0cnVjdCBzdHIsIG1lbSkpOworCit2b2lkIGZvbyh2b2lkKQoreworI2lmZGVmIENPTkZJR19NT0RFX1RUCisJT0ZGU0VUKEhPU1RfVEFTS19FWFRFUk5fUElELCB0YXNrX3N0cnVjdCwgdGhyZWFkLm1vZGUudHQuZXh0ZXJuX3BpZCk7CisjZW5kaWYKKyNpbmNsdWRlIDxjb21tb24tb2Zmc2V0cy5oPgorfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3RpbWVfdXNlci5oIGIvYXJjaC91bS9pbmNsdWRlL3RpbWVfdXNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2Q3ZWYyLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vaW5jbHVkZS90aW1lX3VzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qIAotICogQ29weXJpZ2h0IChDKSAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fVElNRV9VU0VSX0hfXwotI2RlZmluZSBfX1RJTUVfVVNFUl9IX18KLQotZXh0ZXJuIHZvaWQgdGltZXIodm9pZCk7Ci1leHRlcm4gdm9pZCBzd2l0Y2hfdGltZXJzKGludCB0b19yZWFsKTsKLWV4dGVybiB2b2lkIGlkbGVfc2xlZXAoaW50IHNlY3MpOwotZXh0ZXJuIHZvaWQgZW5hYmxlX3RpbWVyKHZvaWQpOwotZXh0ZXJuIHZvaWQgcHJlcGFyZV90aW1lcih2b2lkICogcHRyKTsKLWV4dGVybiB2b2lkIGRpc2FibGVfdGltZXIodm9pZCk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyB0aW1lX2xvY2sodm9pZCk7Ci1leHRlcm4gdm9pZCB0aW1lX3VubG9jayh1bnNpZ25lZCBsb25nKTsKLWV4dGVybiB2b2lkIHVzZXJfdGltZV9pbml0KHZvaWQpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS90dC9kZWJ1Zy5oIGIvYXJjaC91bS9pbmNsdWRlL3R0L2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc3OGZhOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdW0vaW5jbHVkZS90dC9kZWJ1Zy5oCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkgYW5kCisgKiBMYXJzIEJyaW5raG9mZi4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fVU1MX1RUX0RFQlVHX0gKKyNkZWZpbmUgX19VTUxfVFRfREVCVUdfSAorCitleHRlcm4gaW50IGRlYnVnZ2VyX3Byb3h5KGludCBzdGF0dXMsIHBpZF90IHBpZCk7CitleHRlcm4gdm9pZCBjaGlsZF9wcm94eShwaWRfdCBwaWQsIGludCBzdGF0dXMpOworZXh0ZXJuIHZvaWQgaW5pdF9wcm94eSAocGlkX3QgcGlkLCBpbnQgd2FpdGluZywgaW50IHN0YXR1cyk7CitleHRlcm4gaW50IHN0YXJ0X2RlYnVnZ2VyKGNoYXIgKnByb2csIGludCBzdGFydHVwLCBpbnQgc3RvcCwgaW50ICpkZWJ1Z2dlcl9mZCk7CitleHRlcm4gdm9pZCBmYWtlX2NoaWxkX2V4aXQodm9pZCk7CitleHRlcm4gaW50IGdkYl9jb25maWcoY2hhciAqc3RyKTsKK2V4dGVybiBpbnQgZ2RiX3JlbW92ZShpbnQgdW51c2VkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvdHQvbW11LXR0LmggYi9hcmNoL3VtL2luY2x1ZGUvdHQvbW11LXR0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcyYTc4YjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL2luY2x1ZGUvdHQvbW11LXR0LmgKQEAgLTAsMCArMSwxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2lmbmRlZiBfX1RUX01NVV9ICisjZGVmaW5lIF9fVFRfTU1VX0gKKworc3RydWN0IG1tdV9jb250ZXh0X3R0IHsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3R0L21vZGUtdHQuaCBiL2FyY2gvdW0vaW5jbHVkZS90dC9tb2RlLXR0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgyM2NkNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdW0vaW5jbHVkZS90dC9tb2RlLXR0LmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2lmbmRlZiBfX01PREVfVFRfSF9fCisjZGVmaW5lIF9fTU9ERV9UVF9IX18KKworI2luY2x1ZGUgInN5c2RlcC9wdHJhY2UuaCIKKworZW51bSB7IE9QX05PTkUsIE9QX0VYRUMsIE9QX0ZPUkssIE9QX1RSQUNFX09OLCBPUF9SRUJPT1QsIE9QX0hBTFQsIE9QX0NCIH07CisKK2V4dGVybiBpbnQgdHJhY2luZ19waWQ7CisKK2V4dGVybiBpbnQgdHJhY2VyKGludCAoKmluaXRfcHJvYykodm9pZCAqKSwgdm9pZCAqc3ApOworZXh0ZXJuIHZvaWQgc2lnX2hhbmRsZXJfY29tbW9uX3R0KGludCBzaWcsIHZvaWQgKnNjKTsKK2V4dGVybiB2b2lkIHN5c2NhbGxfaGFuZGxlcl90dChpbnQgc2lnLCB1bmlvbiB1bWxfcHRfcmVncyAqcmVncyk7CitleHRlcm4gdm9pZCByZWJvb3RfdHQodm9pZCk7CitleHRlcm4gdm9pZCBoYWx0X3R0KHZvaWQpOworZXh0ZXJuIGludCBpc190cmFjZXJfd2luY2goaW50IHBpZCwgaW50IGZkLCB2b2lkICpkYXRhKTsKK2V4dGVybiB2b2lkIGtpbGxfb2ZmX3Byb2Nlc3Nlc190dCh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvdHQvbW9kZV9rZXJuX3R0LmggYi9hcmNoL3VtL2luY2x1ZGUvdHQvbW9kZV9rZXJuX3R0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhMDAxMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdW0vaW5jbHVkZS90dC9tb2RlX2tlcm5fdHQuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fVFRfTU9ERV9LRVJOX0hfXworI2RlZmluZSBfX1RUX01PREVfS0VSTl9IX18KKworI2luY2x1ZGUgImxpbnV4L3NjaGVkLmgiCisjaW5jbHVkZSAiYXNtL3BhZ2UuaCIKKyNpbmNsdWRlICJhc20vcHRyYWNlLmgiCisjaW5jbHVkZSAiYXNtL3VhY2Nlc3MuaCIKKworZXh0ZXJuIHZvaWQgc3dpdGNoX3RvX3R0KHZvaWQgKnByZXYsIHZvaWQgKm5leHQpOworZXh0ZXJuIHZvaWQgZmx1c2hfdGhyZWFkX3R0KHZvaWQpOworZXh0ZXJuIHZvaWQgc3RhcnRfdGhyZWFkX3R0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGVpcCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgZXNwKTsKK2V4dGVybiBpbnQgY29weV90aHJlYWRfdHQoaW50IG5yLCB1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLCB1bnNpZ25lZCBsb25nIHNwLAorCQkJICB1bnNpZ25lZCBsb25nIHN0YWNrX3RvcCwgc3RydWN0IHRhc2tfc3RydWN0ICpwLAorCQkJICBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitleHRlcm4gdm9pZCByZWxlYXNlX3RocmVhZF90dChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOworZXh0ZXJuIHZvaWQgaW5pdGlhbF90aHJlYWRfY2JfdHQodm9pZCAoKnByb2MpKHZvaWQgKiksIHZvaWQgKmFyZyk7CitleHRlcm4gdm9pZCBpbml0X2lkbGVfdHQodm9pZCk7CitleHRlcm4gdm9pZCBmbHVzaF90bGJfa2VybmVsX3JhbmdlX3R0KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKK2V4dGVybiB2b2lkIGZsdXNoX3RsYl9rZXJuZWxfdm1fdHQodm9pZCk7CitleHRlcm4gdm9pZCBfX2ZsdXNoX3RsYl9vbmVfdHQodW5zaWduZWQgbG9uZyBhZGRyKTsKK2V4dGVybiB2b2lkIGZsdXNoX3RsYl9yYW5nZV90dChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CitleHRlcm4gdm9pZCBmbHVzaF90bGJfbW1fdHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pOworZXh0ZXJuIHZvaWQgZm9yY2VfZmx1c2hfYWxsX3R0KHZvaWQpOworZXh0ZXJuIGxvbmcgZXhlY3V0ZV9zeXNjYWxsX3R0KHZvaWQgKnIpOworZXh0ZXJuIHZvaWQgYmVmb3JlX21lbV90dCh1bnNpZ25lZCBsb25nIGJya19zdGFydCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBzZXRfdGFza19zaXplc190dChpbnQgYXJnLCB1bnNpZ25lZCBsb25nICpob3N0X3NpemVfb3V0LAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nICp0YXNrX3NpemVfb3V0KTsKK2V4dGVybiBpbnQgc3RhcnRfdW1sX3R0KHZvaWQpOworZXh0ZXJuIGludCBleHRlcm5hbF9waWRfdHQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKK2V4dGVybiBpbnQgdGhyZWFkX3BpZF90dChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOworCisjZGVmaW5lIGttZW1fZW5kX3R0IChob3N0X3Rhc2tfc2l6ZSAtIEFCT1ZFX0tNRU0pCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3R0L3R0LmggYi9hcmNoL3VtL2luY2x1ZGUvdHQvdHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDg1MjE5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9pbmNsdWRlL3R0L3R0LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2lmbmRlZiBfX1RUX0hfXworI2RlZmluZSBfX1RUX0hfXworCisjaW5jbHVkZSAic3lzZGVwL3B0cmFjZS5oIgorCitleHRlcm4gaW50IGdkYl9waWQ7CitleHRlcm4gaW50IGRlYnVnOworZXh0ZXJuIGludCBkZWJ1Z19zdG9wOworZXh0ZXJuIGludCBkZWJ1Z190cmFjZTsKKworZXh0ZXJuIGludCBob25leXBvdDsKKworZXh0ZXJuIGludCBmb3JrX3RyYW1wKHZvaWQgKnNpZ19zdGFjayk7CitleHRlcm4gaW50IGRvX3Byb2Nfb3Aodm9pZCAqdCwgaW50IHByb2NfaWQpOworZXh0ZXJuIGludCB0cmFjZXIoaW50ICgqaW5pdF9wcm9jKSh2b2lkICopLCB2b2lkICpzcCk7CitleHRlcm4gdm9pZCBhdHRhY2hfcHJvY2VzcyhpbnQgcGlkKTsKK2V4dGVybiB2b2lkIHRyYWNlcl9wYW5pYyhjaGFyICpmb3JtYXQsIC4uLik7CitleHRlcm4gdm9pZCBzZXRfaW5pdF9waWQoaW50IHBpZCk7CitleHRlcm4gaW50IHNldF91c2VyX21vZGUodm9pZCAqdGFzayk7CitleHRlcm4gdm9pZCBzZXRfdHJhY2luZyh2b2lkICp0LCBpbnQgdHJhY2luZyk7CitleHRlcm4gaW50IGlzX3RyYWNpbmcodm9pZCAqdGFzayk7CitleHRlcm4gdm9pZCBzeXNjYWxsX2hhbmRsZXIoaW50IHNpZywgdW5pb24gdW1sX3B0X3JlZ3MgKnJlZ3MpOworZXh0ZXJuIHZvaWQgZXhpdF9rZXJuZWwoaW50IHBpZCwgdm9pZCAqdGFzayk7CitleHRlcm4gdm9pZCBkb19zeXNjYWxsKHZvaWQgKnRhc2ssIGludCBwaWQsIGludCBsb2NhbF91c2luZ19zeXNlbXUpOworZXh0ZXJuIHZvaWQgZG9fc2lndHJhcCh2b2lkICp0YXNrKTsKK2V4dGVybiBpbnQgaXNfdmFsaWRfcGlkKGludCBwaWQpOworZXh0ZXJuIHZvaWQgcmVtYXBfZGF0YSh2b2lkICpzZWdtZW50X3N0YXJ0LCB2b2lkICpzZWdtZW50X2VuZCwgaW50IHcpOworZXh0ZXJuIGxvbmcgZXhlY3V0ZV9zeXNjYWxsX3R0KHZvaWQgKnIpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3R0L3VhY2Nlc3MtdHQuaCBiL2FyY2gvdW0vaW5jbHVkZS90dC91YWNjZXNzLXR0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5NjQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdW0vaW5jbHVkZS90dC91YWNjZXNzLXR0LmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDMgSmVmZiBEaWtlIChqZGlrZUBhZGR0b2l0LmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fVFRfVUFDQ0VTU19ICisjZGVmaW5lIF9fVFRfVUFDQ0VTU19ICisKKyNpbmNsdWRlICJsaW51eC9zdHJpbmcuaCIKKyNpbmNsdWRlICJsaW51eC9zY2hlZC5oIgorI2luY2x1ZGUgImFzbS9wcm9jZXNzb3IuaCIKKyNpbmNsdWRlICJhc20vZXJybm8uaCIKKyNpbmNsdWRlICJhc20vY3VycmVudC5oIgorI2luY2x1ZGUgImFzbS9hLm91dC5oIgorI2luY2x1ZGUgInVtbF91YWNjZXNzLmgiCisKKyNkZWZpbmUgQUJPVkVfS01FTSAoMTYgKiAxMDI0ICogMTAyNCkKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZW5kX3ZtOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdW1sX3BoeXNtZW07CisKKyNkZWZpbmUgaXNfc3RhY2soYWRkciwgc2l6ZSkgXAorCSgoKHVuc2lnbmVkIGxvbmcpIChhZGRyKSA8IFNUQUNLX1RPUCkgJiYgXAorCSAoKHVuc2lnbmVkIGxvbmcpIChhZGRyKSA+PSBTVEFDS19UT1AgLSBBQk9WRV9LTUVNKSAmJiBcCisJICgoKHVuc2lnbmVkIGxvbmcpIChhZGRyKSArIChzaXplKSkgPD0gU1RBQ0tfVE9QKSkKKworI2RlZmluZSBhY2Nlc3Nfb2tfdHQodHlwZSwgYWRkciwgc2l6ZSkgXAorCShpc19zdGFjayhhZGRyLCBzaXplKSkKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X2ZhdWx0X2FkZHIodm9pZCk7CisKK2V4dGVybiBpbnQgX19kb19jb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgaW50IG4sCisJCQkgICAgICAgdm9pZCAqKmZhdWx0X2FkZHIsIHZvaWQgKipmYXVsdF9jYXRjaGVyKTsKK2V4dGVybiBpbnQgX19kb19zdHJuY3B5X2Zyb21fdXNlcihjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IG4sCisJCQkJICB2b2lkICoqZmF1bHRfYWRkciwgdm9pZCAqKmZhdWx0X2NhdGNoZXIpOworZXh0ZXJuIGludCBfX2RvX2NsZWFyX3VzZXIodm9pZCAqbWVtLCBzaXplX3QgbGVuLCB2b2lkICoqZmF1bHRfYWRkciwKKwkJCSAgIHZvaWQgKipmYXVsdF9jYXRjaGVyKTsKK2V4dGVybiBpbnQgX19kb19zdHJubGVuX3VzZXIoY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBsb25nIG4sCisJCQkgICAgIHZvaWQgKipmYXVsdF9hZGRyLCB2b2lkICoqZmF1bHRfY2F0Y2hlcik7CisKK2V4dGVybiBpbnQgY29weV9mcm9tX3VzZXJfdHQodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCBpbnQgbik7CitleHRlcm4gaW50IGNvcHlfdG9fdXNlcl90dCh2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIGludCBuKTsKK2V4dGVybiBpbnQgc3RybmNweV9mcm9tX3VzZXJfdHQoY2hhciAqZHN0LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBpbnQgY291bnQpOworZXh0ZXJuIGludCBfX2NsZWFyX3VzZXJfdHQodm9pZCBfX3VzZXIgKm1lbSwgaW50IGxlbik7CitleHRlcm4gaW50IGNsZWFyX3VzZXJfdHQodm9pZCBfX3VzZXIgKm1lbSwgaW50IGxlbik7CitleHRlcm4gaW50IHN0cm5sZW5fdXNlcl90dChjb25zdCB2b2lkIF9fdXNlciAqc3RyLCBpbnQgbGVuKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvdXNlci5oIGIvYXJjaC91bS9pbmNsdWRlL3VzZXIuaAppbmRleCAwZjg2NWVmLi45MWIwYWM0IDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvdXNlci5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS91c2VyLmgKQEAgLTE4LDYgKzE4LDcgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHN0cmxjcHkoY2hhciAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3RybGNhdChjaGFyICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gdm9pZCAqdW1fdm1hbGxvYyhpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCAqdW1fdm1hbGxvY19hdG9taWMoaW50IHNpemUpOwogZXh0ZXJuIHZvaWQgdmZyZWUodm9pZCAqcHRyKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvdXNlcl91dGlsLmggYi9hcmNoL3VtL2luY2x1ZGUvdXNlcl91dGlsLmgKaW5kZXggYjk5ODQwMC4uYTZmMWYxNyAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3VzZXJfdXRpbC5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS91c2VyX3V0aWwuaApAQCAtMSw0ICsxLDQgQEAKLS8qIAorLyoKICAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCiAgKi8KQEAgLTIzLDEyICsyMyw3IEBACiAKIGV4dGVybiBzdHJ1Y3QgY3B1X3Rhc2sgY3B1X3Rhc2tzW107CiAKLXN0cnVjdCBzaWduYWxfaW5mbyB7Ci0Jdm9pZCAoKmhhbmRsZXIpKGludCwgdW5pb24gdW1sX3B0X3JlZ3MgKik7Ci0JaW50IGlzX2lycTsKLX07Ci0KLWV4dGVybiBzdHJ1Y3Qgc2lnbmFsX2luZm8gc2lnX2luZm9bXTsKK2V4dGVybiB2b2lkICgqc2lnX2luZm9bXSkoaW50LCB1bmlvbiB1bWxfcHRfcmVncyAqKTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG93X3BoeXNtZW07CiBleHRlcm4gdW5zaWduZWQgbG9uZyBoaWdoX3BoeXNtZW07CkBAIC00OSwxMCArNDQsNiBAQAogZXh0ZXJuIGludCBwdHlfb3V0cHV0X3NpZ2lvOwogZXh0ZXJuIGludCBwdHlfY2xvc2Vfc2lnaW87CiAKLWV4dGVybiB2b2lkIHN0b3Aodm9pZCk7Ci1leHRlcm4gdm9pZCBzdGFja19wcm90ZWN0aW9ucyh1bnNpZ25lZCBsb25nIGFkZHJlc3MpOwotZXh0ZXJuIHZvaWQgdGFza19wcm90ZWN0aW9ucyh1bnNpZ25lZCBsb25nIGFkZHJlc3MpOwotZXh0ZXJuIGludCB3YWl0X2Zvcl9zdG9wKGludCBwaWQsIGludCBzaWcsIGludCBjb250X3R5cGUsIHZvaWQgKnJlbGF5KTsKIGV4dGVybiB2b2lkICphZGRfc2lnbmFsX2hhbmRsZXIoaW50IHNpZywgdm9pZCAoKmhhbmRsZXIpKGludCkpOwogZXh0ZXJuIGludCBsaW51eF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndik7CiBleHRlcm4gdm9pZCBzZXRfY21kbGluZShjaGFyICpjbWQpOwpAQCAtNjAsMTEgKzUxLDggQEAKIGV4dGVybiBpbnQgZ2V0X3B0eSh2b2lkKTsKIGV4dGVybiB2b2lkICp1bV9rbWFsbG9jKGludCBzaXplKTsKIGV4dGVybiBpbnQgc3dpdGNoZXJvbyhpbnQgZmQsIGludCBwcm90LCB2b2lkICpmcm9tLCB2b2lkICp0bywgaW50IHNpemUpOwotZXh0ZXJuIHZvaWQgc2V0dXBfbWFjaGluZW5hbWUoY2hhciAqbWFjaGluZV9vdXQpOwotZXh0ZXJuIHZvaWQgc2V0dXBfaG9zdGluZm8odm9pZCk7CiBleHRlcm4gdm9pZCBkb19leGVjKGludCBvbGRfcGlkLCBpbnQgbmV3X3BpZCk7CiBleHRlcm4gdm9pZCB0cmFjZXJfcGFuaWMoY2hhciAqbXNnLCAuLi4pOwotZXh0ZXJuIHZvaWQgZG9fbG9uZ2ptcCh2b2lkICpwLCBpbnQgdmFsKTsKIGV4dGVybiBpbnQgZGV0YWNoKGludCBwaWQsIGludCBzaWcpOwogZXh0ZXJuIGludCBhdHRhY2goaW50IHBpZCk7CiBleHRlcm4gdm9pZCBraWxsX2NoaWxkX2RlYWQoaW50IHBpZCk7CkBAIC03NiwxOCArNjQsNiBAQAogZXh0ZXJuIGludCBhcmNoX2hhbmRsZV9zaWduYWwoaW50IHNpZywgdW5pb24gdW1sX3B0X3JlZ3MgKnJlZ3MpOwogZXh0ZXJuIGludCBhcmNoX2ZpeHVwKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdm9pZCAqc2NfcHRyKTsKIGV4dGVybiB2b2lkIGFyY2hfaW5pdF90aHJlYWQodm9pZCk7Ci1leHRlcm4gaW50IHNldGptcF93cmFwcGVyKHZvaWQgKCpwcm9jKSh2b2lkICosIHZvaWQgKiksIC4uLik7CiBleHRlcm4gaW50IHJhdyhpbnQgZmQpOwogCiAjZW5kaWYKLQotLyoKLSAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgotICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5Ci0gKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgZmlsZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1maWxlLXN0eWxlOiAibGludXgiCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL01ha2VmaWxlIGIvYXJjaC91bS9rZXJuZWwvTWFrZWZpbGUKaW5kZXggNmY3NzAwNS4uNjkzMDE4YiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC91bS9rZXJuZWwvTWFrZWZpbGUKQEAgLTksOSArOSw4IEBACiBvYmoteSA9IGNvbmZpZy5vIGV4ZWNfa2Vybi5vIGV4aXRjb2RlLm8gXAogCWluaXRfdGFzay5vIGlycS5vIGlycV91c2VyLm8ga3N5bXMubyBtZW0ubyBwaHlzbWVtLm8gXAogCXByb2Nlc3Nfa2Vybi5vIHB0cmFjZS5vIHJlYm9vdC5vIHJlc291cmNlLm8gc2lnaW9fdXNlci5vIHNpZ2lvX2tlcm4ubyBcCi0Jc2lnbmFsX2tlcm4ubyBzaWduYWxfdXNlci5vIHNtcC5vIHN5c2NhbGxfa2Vybi5vIHN5c3JxLm8gdGltZS5vIFwKLQl0aW1lX2tlcm4ubyB0bGIubyB0cmFwX2tlcm4ubyB0cmFwX3VzZXIubyB1YWNjZXNzLm8gdW1fYXJjaC5vIHVtaWQubyBcCi0JdXNlcl91dGlsLm8KKwlzaWduYWxfa2Vybi5vIHNtcC5vIHN5c2NhbGxfa2Vybi5vIHN5c3JxLm8gXAorCXRpbWVfa2Vybi5vIHRsYi5vIHRyYXBfa2Vybi5vIHVhY2Nlc3MubyB1bV9hcmNoLm8gdW1pZC5vCiAKIG9iai0kKENPTkZJR19CTEtfREVWX0lOSVRSRCkgKz0gaW5pdHJkLm8KIG9iai0kKENPTkZJR19HUFJPRikJKz0gZ3Byb2Zfc3ltcy5vCkBAIC0yNCw3ICsyMyw3IEBACiAKIHVzZXItb2Jqcy0kKENPTkZJR19UVFlfTE9HKSArPSB0dHlfbG9nLm8KIAotVVNFUl9PQkpTIDo9ICQodXNlci1vYmpzLXkpIGNvbmZpZy5vIHRpbWUubyB0dHlfbG9nLm8gdXNlcl91dGlsLm8KK1VTRVJfT0JKUyA6PSAkKHVzZXItb2Jqcy15KSBjb25maWcubyB0dHlfbG9nLm8KIAogaW5jbHVkZSBhcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUucnVsZXMKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvdW0va2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggYzEzYTY0YS4uOTFlYTUzOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL3VtL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0xICsxIEBACi0vKiBEdW1teSBmaWxlIHRvIG1ha2Uga2J1aWxkIGhhcHB5IC0gdW51c2VkISAqLworI2luY2x1ZGUgInN5c2RlcC9rZXJuZWwtb2Zmc2V0cy5oIgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvZXhlY19rZXJuLmMgYi9hcmNoL3VtL2tlcm5lbC9leGVjX2tlcm4uYwppbmRleCBlZmQyMjJmLi41NjlmZThiIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9leGVjX2tlcm4uYworKysgYi9hcmNoL3VtL2tlcm5lbC9leGVjX2tlcm4uYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgImlycV91c2VyLmgiCiAjaW5jbHVkZSAidGxiLmgiCiAjaW5jbHVkZSAib3MuaCIKLSNpbmNsdWRlICJ0aW1lX3VzZXIuaCIKICNpbmNsdWRlICJjaG9vc2UtbW9kZS5oIgogI2luY2x1ZGUgIm1vZGVfa2Vybi5oIgogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9pcnFfdXNlci5jIGIvYXJjaC91bS9rZXJuZWwvaXJxX3VzZXIuYwppbmRleCA1MGEyYWEzLi4wZTMyZjVmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9pcnFfdXNlci5jCisrKyBiL2FyY2gvdW0va2VybmVsL2lycV91c2VyLmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlICJrZXJuX3V0aWwuaCIKICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAicHJvY2Vzcy5oIgotI2luY2x1ZGUgInNpZ25hbF91c2VyLmgiCiAjaW5jbHVkZSAic2lnaW8uaCIKICNpbmNsdWRlICJpcnFfdXNlci5oIgogI2luY2x1ZGUgIm9zLmgiCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzX2tlcm4uYyBiL2FyY2gvdW0va2VybmVsL3Byb2Nlc3Nfa2Vybi5jCmluZGV4IDY1MWFiZjIuLjMxMTNjYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3Byb2Nlc3Nfa2Vybi5jCisrKyBiL2FyY2gvdW0va2VybmVsL3Byb2Nlc3Nfa2Vybi5jCkBAIC0zNiwxMSArMzYsOSBAQAogI2luY2x1ZGUgImtlcm5fdXRpbC5oIgogI2luY2x1ZGUgImtlcm4uaCIKICNpbmNsdWRlICJzaWduYWxfa2Vybi5oIgotI2luY2x1ZGUgInNpZ25hbF91c2VyLmgiCiAjaW5jbHVkZSAiaW5pdC5oIgogI2luY2x1ZGUgImlycV91c2VyLmgiCiAjaW5jbHVkZSAibWVtX3VzZXIuaCIKLSNpbmNsdWRlICJ0aW1lX3VzZXIuaCIKICNpbmNsdWRlICJ0bGIuaCIKICNpbmNsdWRlICJmcmFtZV9rZXJuLmgiCiAjaW5jbHVkZSAic2lnY29udGV4dC5oIgpAQCAtMTA4LDcgKzEwNiw3IEBACiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gdDsKIAotCWNwdV90YXNrc1t0YXNrLT50aHJlYWRfaW5mby0+Y3B1XSA9ICgoc3RydWN0IGNwdV90YXNrKSAKKwljcHVfdGFza3NbdGFza190aHJlYWRfaW5mbyh0YXNrKS0+Y3B1XSA9ICgoc3RydWN0IGNwdV90YXNrKQogCQl7IGV4dGVybmFsX3BpZCh0YXNrKSwgdGFzayB9KTsKIH0KIApAQCAtMjg5LDE3ICsyODcsMjcgQEAKIAogdm9pZCAqdW1fa21hbGxvYyhpbnQgc2l6ZSkKIHsKLQlyZXR1cm4oa21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKSk7CisJcmV0dXJuIGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiB9CiAKIHZvaWQgKnVtX2ttYWxsb2NfYXRvbWljKGludCBzaXplKQogewotCXJldHVybihrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpKTsKKwlyZXR1cm4ga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKIH0KIAogdm9pZCAqdW1fdm1hbGxvYyhpbnQgc2l6ZSkKIHsKLQlyZXR1cm4odm1hbGxvYyhzaXplKSk7CisJcmV0dXJuIHZtYWxsb2Moc2l6ZSk7Cit9CisKK3ZvaWQgKnVtX3ZtYWxsb2NfYXRvbWljKGludCBzaXplKQoreworCXJldHVybiBfX3ZtYWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyB8IF9fR0ZQX0hJR0hNRU0sIFBBR0VfS0VSTkVMKTsKK30KKworaW50IF9fY2FudF9zbGVlcCh2b2lkKSB7CisJcmV0dXJuIGluX2F0b21pYygpIHx8IGlycXNfZGlzYWJsZWQoKSB8fCBpbl9pbnRlcnJ1cHQoKTsKKwkvKiBJcyBpbl9pbnRlcnJ1cHQoKSByZWFsbHkgbmVlZGVkPyAqLwogfQogCiB1bnNpZ25lZCBsb25nIGdldF9mYXVsdF9hZGRyKHZvaWQpCkBAIC0zNzEsMTEgKzM3OSw2IEBACiAJcmV0dXJuKDApOwogfQogCi1pbnQgdW1faW5faW50ZXJydXB0KHZvaWQpCi17Ci0JcmV0dXJuKGluX2ludGVycnVwdCgpKTsKLX0KLQogaW50IGNwdSh2b2lkKQogewogCXJldHVybihjdXJyZW50X3RocmVhZC0+Y3B1KTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3JlYm9vdC5jIGIvYXJjaC91bS9rZXJuZWwvcmVib290LmMKaW5kZXggYTYzN2U4OC4uNmYxYTNhMiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvcmVib290LmMKKysrIGIvYXJjaC91bS9rZXJuZWwvcmVib290LmMKQEAgLTEyLDYgKzEyLDggQEAKICNpbmNsdWRlICJtb2RlLmgiCiAjaW5jbHVkZSAiY2hvb3NlLW1vZGUuaCIKIAordm9pZCAoKnBtX3Bvd2VyX29mZikodm9pZCk7CisKICNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgdm9pZCBraWxsX2lkbGVycyhpbnQgbWUpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9zaWdpb191c2VyLmMgYi9hcmNoL3VtL2tlcm5lbC9zaWdpb191c2VyLmMKaW5kZXggNjJlNWNmZC4uZjdiMThlMSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2lnaW9fdXNlci5jCisrKyBiL2FyY2gvdW0va2VybmVsL3NpZ2lvX3VzZXIuYwpAQCAtMzM3LDcwICszMzcsMTAzIEBACiAJcmV0dXJuKGVycik7CiB9CiAKLXN0YXRpYyBpbnQgc2V0dXBfaW5pdGlhbF9wb2xsKGludCBmZCkKK3N0YXRpYyBzdHJ1Y3QgcG9sbGZkKiBzZXR1cF9pbml0aWFsX3BvbGwoaW50IGZkKQogewogCXN0cnVjdCBwb2xsZmQgKnA7CiAKLQlwID0gdW1fa21hbGxvY19hdG9taWMoc2l6ZW9mKHN0cnVjdCBwb2xsZmQpKTsKLQlpZihwID09IE5VTEwpeworCXAgPSB1bV9rbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG9sbGZkKSk7CisJaWYgKHAgPT0gTlVMTCkgewogCQlwcmludGsoInNldHVwX2luaXRpYWxfcG9sbCA6IGZhaWxlZCB0byBhbGxvY2F0ZSBwb2xsXG4iKTsKLQkJcmV0dXJuKC0xKTsKKwkJcmV0dXJuIE5VTEw7CiAJfQogCSpwID0gKChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCAgCT0gZmQsCiAJCQkJLmV2ZW50cyAJPSBQT0xMSU4sCiAJCQkJLnJldmVudHMgCT0gMCB9KTsKLQljdXJyZW50X3BvbGwgPSAoKHN0cnVjdCBwb2xsZmRzKSB7IC5wb2xsIAk9IHAsCi0JCQkJCSAgIC51c2VkIAk9IDEsCi0JCQkJCSAgIC5zaXplIAk9IDEgfSk7Ci0JcmV0dXJuKDApOworCXJldHVybiBwOwogfQogCiB2b2lkIHdyaXRlX3NpZ2lvX3dvcmthcm91bmQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHN0YWNrOworCXN0cnVjdCBwb2xsZmQgKnA7CiAJaW50IGVycjsKKwlpbnQgbF93cml0ZV9zaWdpb19mZHNbMl07CisJaW50IGxfc2lnaW9fcHJpdmF0ZVsyXTsKKwlpbnQgbF93cml0ZV9zaWdpb19waWQ7CiAKKwkvKiBXZSBjYWxsIHRoaXMgKnRvbnMqIG9mIHRpbWVzIC0gYW5kIG1vc3Qgb25lcyB3ZSBtdXN0IGp1c3QgZmFpbC4gKi8KIAlzaWdpb19sb2NrKCk7Ci0JaWYod3JpdGVfc2lnaW9fcGlkICE9IC0xKQotCQlnb3RvIG91dDsKKwlsX3dyaXRlX3NpZ2lvX3BpZCA9IHdyaXRlX3NpZ2lvX3BpZDsKKwlzaWdpb191bmxvY2soKTsKIAotCWVyciA9IG9zX3BpcGUod3JpdGVfc2lnaW9fZmRzLCAxLCAxKTsKKwlpZiAobF93cml0ZV9zaWdpb19waWQgIT0gLTEpCisJCXJldHVybjsKKworCWVyciA9IG9zX3BpcGUobF93cml0ZV9zaWdpb19mZHMsIDEsIDEpOwogCWlmKGVyciA8IDApewogCQlwcmludGsoIndyaXRlX3NpZ2lvX3dvcmthcm91bmQgLSBvc19waXBlIDEgZmFpbGVkLCAiCiAJCSAgICAgICAiZXJyID0gJWRcbiIsIC1lcnIpOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCX0KLQllcnIgPSBvc19waXBlKHNpZ2lvX3ByaXZhdGUsIDEsIDEpOworCWVyciA9IG9zX3BpcGUobF9zaWdpb19wcml2YXRlLCAxLCAxKTsKIAlpZihlcnIgPCAwKXsKLQkJcHJpbnRrKCJ3cml0ZV9zaWdpb193b3JrYXJvdW5kIC0gb3NfcGlwZSAyIGZhaWxlZCwgIgorCQlwcmludGsoIndyaXRlX3NpZ2lvX3dvcmthcm91bmQgLSBvc19waXBlIDEgZmFpbGVkLCAiCiAJCSAgICAgICAiZXJyID0gJWRcbiIsIC1lcnIpOwogCQlnb3RvIG91dF9jbG9zZTE7CiAJfQotCWlmKHNldHVwX2luaXRpYWxfcG9sbChzaWdpb19wcml2YXRlWzFdKSkKKworCXAgPSBzZXR1cF9pbml0aWFsX3BvbGwobF9zaWdpb19wcml2YXRlWzFdKTsKKwlpZighcCkKIAkJZ290byBvdXRfY2xvc2UyOwogCi0Jd3JpdGVfc2lnaW9fcGlkID0gcnVuX2hlbHBlcl90aHJlYWQod3JpdGVfc2lnaW9fdGhyZWFkLCBOVUxMLCAKKwlzaWdpb19sb2NrKCk7CisKKwkvKiBEaWQgd2UgcmFjZT8gRG9uJ3QgdHJ5IHRvIG9wdGltaXplIHRoaXMsIHBsZWFzZSwgaXQncyBub3Qgc28gbGlrZWx5CisJICogdG8gaGFwcGVuLCBhbmQgbm8gbW9yZSB0aGFuIG9uY2UgYXQgdGhlIGJvb3QuICovCisJaWYod3JpdGVfc2lnaW9fcGlkICE9IC0xKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwl3cml0ZV9zaWdpb19waWQgPSBydW5faGVscGVyX3RocmVhZCh3cml0ZV9zaWdpb190aHJlYWQsIE5VTEwsCiAJCQkJCSAgICBDTE9ORV9GSUxFUyB8IENMT05FX1ZNLCAmc3RhY2ssIDApOwogCi0JaWYod3JpdGVfc2lnaW9fcGlkIDwgMCkgZ290byBvdXRfY2xvc2UyOworCWlmICh3cml0ZV9zaWdpb19waWQgPCAwKQorCQlnb3RvIG91dF9jbGVhcjsKIAotCWlmKHdyaXRlX3NpZ2lvX2lycSh3cml0ZV9zaWdpb19mZHNbMF0pKSAKKwlpZiAod3JpdGVfc2lnaW9faXJxKGxfd3JpdGVfc2lnaW9fZmRzWzBdKSkKIAkJZ290byBvdXRfa2lsbDsKIAotIG91dDoKKwkvKiBTdWNjZXNzLCBmaW5hbGx5LiAqLworCW1lbWNweSh3cml0ZV9zaWdpb19mZHMsIGxfd3JpdGVfc2lnaW9fZmRzLCBzaXplb2YobF93cml0ZV9zaWdpb19mZHMpKTsKKwltZW1jcHkoc2lnaW9fcHJpdmF0ZSwgbF9zaWdpb19wcml2YXRlLCBzaXplb2YobF9zaWdpb19wcml2YXRlKSk7CisKKwljdXJyZW50X3BvbGwgPSAoKHN0cnVjdCBwb2xsZmRzKSB7IC5wb2xsIAk9IHAsCisJCQkJCSAgIC51c2VkIAk9IDEsCisJCQkJCSAgIC5zaXplIAk9IDEgfSk7CisKIAlzaWdpb191bmxvY2soKTsKIAlyZXR1cm47CiAKICBvdXRfa2lsbDoKLQlvc19raWxsX3Byb2Nlc3Mod3JpdGVfc2lnaW9fcGlkLCAxKTsKKwlsX3dyaXRlX3NpZ2lvX3BpZCA9IHdyaXRlX3NpZ2lvX3BpZDsKIAl3cml0ZV9zaWdpb19waWQgPSAtMTsKLSBvdXRfY2xvc2UyOgotCW9zX2Nsb3NlX2ZpbGUoc2lnaW9fcHJpdmF0ZVswXSk7Ci0Jb3NfY2xvc2VfZmlsZShzaWdpb19wcml2YXRlWzFdKTsKLSBvdXRfY2xvc2UxOgotCW9zX2Nsb3NlX2ZpbGUod3JpdGVfc2lnaW9fZmRzWzBdKTsKLQlvc19jbG9zZV9maWxlKHdyaXRlX3NpZ2lvX2Zkc1sxXSk7CiAJc2lnaW9fdW5sb2NrKCk7CisJLyogR29pbmcgdG8gY2FsbCB3YWl0cGlkLCBhdm9pZCBob2xkaW5nIHRoZSBsb2NrLiAqLworCW9zX2tpbGxfcHJvY2VzcyhsX3dyaXRlX3NpZ2lvX3BpZCwgMSk7CisJZ290byBvdXRfZnJlZTsKKworIG91dF9jbGVhcjoKKwl3cml0ZV9zaWdpb19waWQgPSAtMTsKKyBvdXRfdW5sb2NrOgorCXNpZ2lvX3VubG9jaygpOworIG91dF9mcmVlOgorCWtmcmVlKHApOworIG91dF9jbG9zZTI6CisJb3NfY2xvc2VfZmlsZShsX3NpZ2lvX3ByaXZhdGVbMF0pOworCW9zX2Nsb3NlX2ZpbGUobF9zaWdpb19wcml2YXRlWzFdKTsKKyBvdXRfY2xvc2UxOgorCW9zX2Nsb3NlX2ZpbGUobF93cml0ZV9zaWdpb19mZHNbMF0pOworCW9zX2Nsb3NlX2ZpbGUobF93cml0ZV9zaWdpb19mZHNbMV0pOworCXJldHVybjsKIH0KIAogaW50IHJlYWRfc2lnaW9fZmQoaW50IGZkKQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2lnbmFsX2tlcm4uYyBiL2FyY2gvdW0va2VybmVsL3NpZ25hbF9rZXJuLmMKaW5kZXggMDM2MThiZC4uZGExN2I3NSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2lnbmFsX2tlcm4uYworKysgYi9hcmNoL3VtL2tlcm5lbC9zaWduYWxfa2Vybi5jCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSAiYXNtL3Vjb250ZXh0LmgiCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAic2lnbmFsX2tlcm4uaCIKLSNpbmNsdWRlICJzaWduYWxfdXNlci5oIgogI2luY2x1ZGUgImtlcm4uaCIKICNpbmNsdWRlICJmcmFtZV9rZXJuLmgiCiAjaW5jbHVkZSAic2lnY29udGV4dC5oIgpAQCAtMTAwLDMxICs5OSw0NiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQga2Vybl9kb19zaWduYWwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHNpZ3NldF90ICpvbGRzZXQpCitzdGF0aWMgaW50IGtlcm5fZG9fc2lnbmFsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBrX3NpZ2FjdGlvbiBrYV9jb3B5OwogCXNpZ2luZm9fdCBpbmZvOworCXNpZ3NldF90ICpvbGRzZXQ7CiAJaW50IHNpZywgaGFuZGxlZF9zaWcgPSAwOwogCisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCisJCW9sZHNldCA9ICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrOworCWVsc2UKKwkJb2xkc2V0ID0gJmN1cnJlbnQtPmJsb2NrZWQ7CisKIAl3aGlsZSgoc2lnID0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKCZpbmZvLCAma2FfY29weSwgcmVncywgTlVMTCkpID4gMCl7CiAJCWhhbmRsZWRfc2lnID0gMTsKIAkJLyogV2hlZSEgIEFjdHVhbGx5IGRlbGl2ZXIgdGhlIHNpZ25hbC4gICovCi0JCWlmKCFoYW5kbGVfc2lnbmFsKHJlZ3MsIHNpZywgJmthX2NvcHksICZpbmZvLCBvbGRzZXQpKQorCQlpZighaGFuZGxlX3NpZ25hbChyZWdzLCBzaWcsICZrYV9jb3B5LCAmaW5mbywgb2xkc2V0KSl7CisJCQkvKiBhIHNpZ25hbCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZDsgdGhlIHNhdmVkCisJCQkgKiBzaWdtYXNrIHdpbGwgaGF2ZSBiZWVuIHN0b3JlZCBpbiB0aGUgc2lnbmFsIGZyYW1lLAorCQkJICogYW5kIHdpbGwgYmUgcmVzdG9yZWQgYnkgc2lncmV0dXJuLCBzbyB3ZSBjYW4gc2ltcGx5CisJCQkgKiBjbGVhciB0aGUgVElGX1JFU1RPUkVfU0lHTUFTSyBmbGFnICovCisJCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKIAkJCWJyZWFrOworCQl9CiAJfQogCiAJLyogRGlkIHdlIGNvbWUgZnJvbSBhIHN5c3RlbSBjYWxsPyAqLwogCWlmKCFoYW5kbGVkX3NpZyAmJiAoUFRfUkVHU19TWVNDQUxMX05SKHJlZ3MpID49IDApKXsKIAkJLyogUmVzdGFydCB0aGUgc3lzdGVtIGNhbGwgLSBubyBoYW5kbGVycyBwcmVzZW50ICovCi0JCWlmKFBUX1JFR1NfU1lTQ0FMTF9SRVQocmVncykgPT0gLUVSRVNUQVJUTk9IQU5EIHx8Ci0JCSAgIFBUX1JFR1NfU1lTQ0FMTF9SRVQocmVncykgPT0gLUVSRVNUQVJUU1lTIHx8Ci0JCSAgIFBUX1JFR1NfU1lTQ0FMTF9SRVQocmVncykgPT0gLUVSRVNUQVJUTk9JTlRSKXsKKwkJc3dpdGNoKFBUX1JFR1NfU1lTQ0FMTF9SRVQocmVncykpeworCQljYXNlIC1FUkVTVEFSVE5PSEFORDoKKwkJY2FzZSAtRVJFU1RBUlRTWVM6CisJCWNhc2UgLUVSRVNUQVJUTk9JTlRSOgogCQkJUFRfUkVHU19PUklHX1NZU0NBTEwocmVncykgPSBQVF9SRUdTX1NZU0NBTExfTlIocmVncyk7CiAJCQlQVF9SRUdTX1JFU1RBUlRfU1lTQ0FMTChyZWdzKTsKLQkJfQotCQllbHNlIGlmKFBUX1JFR1NfU1lTQ0FMTF9SRVQocmVncykgPT0gLUVSRVNUQVJUX1JFU1RBUlRCTE9DSyl7CisJCQlicmVhazsKKwkJY2FzZSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLOgogCQkJUFRfUkVHU19TWVNDQUxMX1JFVChyZWdzKSA9IF9fTlJfcmVzdGFydF9zeXNjYWxsOwogCQkJUFRfUkVHU19SRVNUQVJUX1NZU0NBTEwocmVncyk7CisJCQlicmVhazsKICAJCX0KIAl9CiAKQEAgLTEzOCwxMiArMTUyLDE5IEBACiAJaWYoY3VycmVudC0+cHRyYWNlICYgUFRfRFRSQUNFKQogCQljdXJyZW50LT50aHJlYWQuc2luZ2xlc3RlcF9zeXNjYWxsID0KIAkJCWlzX3N5c2NhbGwoUFRfUkVHU19JUCgmY3VycmVudC0+dGhyZWFkLnJlZ3MpKTsKKworCS8qIGlmIHRoZXJlJ3Mgbm8gc2lnbmFsIHRvIGRlbGl2ZXIsIHdlIGp1c3QgcHV0IHRoZSBzYXZlZCBzaWdtYXNrCisJICogYmFjayAqLworCWlmICghaGFuZGxlZF9zaWcgJiYgdGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkgeworCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrLCBOVUxMKTsKKwl9CiAJcmV0dXJuKGhhbmRsZWRfc2lnKTsKIH0KIAogaW50IGRvX3NpZ25hbCh2b2lkKQogewotCXJldHVybihrZXJuX2RvX3NpZ25hbCgmY3VycmVudC0+dGhyZWFkLnJlZ3MsICZjdXJyZW50LT5ibG9ja2VkKSk7CisJcmV0dXJuKGtlcm5fZG9fc2lnbmFsKCZjdXJyZW50LT50aHJlYWQucmVncykpOwogfQogCiAvKgpAQCAtMTUxLDYzICsxNzIsMjAgQEAKICAqLwogbG9uZyBzeXNfc2lnc3VzcGVuZChpbnQgaGlzdG9yeTAsIGludCBoaXN0b3J5MSwgb2xkX3NpZ3NldF90IG1hc2spCiB7Ci0Jc2lnc2V0X3Qgc2F2ZXNldDsKLQogCW1hc2sgJj0gX0JMT0NLQUJMRTsKIAlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQlzYXZlc2V0ID0gY3VycmVudC0+YmxvY2tlZDsKKwljdXJyZW50LT5zYXZlZF9zaWdtYXNrID0gY3VycmVudC0+YmxvY2tlZDsKIAlzaWdpbml0c2V0KCZjdXJyZW50LT5ibG9ja2VkLCBtYXNrKTsKIAlyZWNhbGNfc2lncGVuZGluZygpOwogCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAKLQlQVF9SRUdTX1NZU0NBTExfUkVUKCZjdXJyZW50LT50aHJlYWQucmVncykgPSAtRUlOVFI7Ci0Jd2hpbGUgKDEpIHsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlKCk7Ci0JCWlmKGtlcm5fZG9fc2lnbmFsKCZjdXJyZW50LT50aHJlYWQucmVncywgJnNhdmVzZXQpKQotCQkJcmV0dXJuKC1FSU5UUik7Ci0JfQotfQotCi1sb25nIHN5c19ydF9zaWdzdXNwZW5kKHNpZ3NldF90IF9fdXNlciAqdW5ld3NldCwgc2l6ZV90IHNpZ3NldHNpemUpCi17Ci0Jc2lnc2V0X3Qgc2F2ZXNldCwgbmV3c2V0OwotCi0JLyogWFhYOiBEb24ndCBwcmVjbHVkZSBoYW5kbGluZyBkaWZmZXJlbnQgc2l6ZWQgc2lnc2V0X3Qncy4gICovCi0JaWYgKHNpZ3NldHNpemUgIT0gc2l6ZW9mKHNpZ3NldF90KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJm5ld3NldCwgdW5ld3NldCwgc2l6ZW9mKG5ld3NldCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlzaWdkZWxzZXRtYXNrKCZuZXdzZXQsIH5fQkxPQ0tBQkxFKTsKLQotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCXNhdmVzZXQgPSBjdXJyZW50LT5ibG9ja2VkOwotCWN1cnJlbnQtPmJsb2NrZWQgPSBuZXdzZXQ7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCi0JUFRfUkVHU19TWVNDQUxMX1JFVCgmY3VycmVudC0+dGhyZWFkLnJlZ3MpID0gLUVJTlRSOwotCXdoaWxlICgxKSB7Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQlzY2hlZHVsZSgpOwotCQlpZiAoa2Vybl9kb19zaWduYWwoJmN1cnJlbnQtPnRocmVhZC5yZWdzLCAmc2F2ZXNldCkpCi0JCQlyZXR1cm4oLUVJTlRSKTsKLQl9CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJc2NoZWR1bGUoKTsKKwlzZXRfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CisJcmV0dXJuIC1FUkVTVEFSVE5PSEFORDsKIH0KIAogbG9uZyBzeXNfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCBfX3VzZXIgKnVzcywgc3RhY2tfdCBfX3VzZXIgKnVvc3MpCiB7CiAJcmV0dXJuKGRvX3NpZ2FsdHN0YWNrKHVzcywgdW9zcywgUFRfUkVHU19TUCgmY3VycmVudC0+dGhyZWFkLnJlZ3MpKSk7CiB9Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9zaWduYWxfdXNlci5jIGIvYXJjaC91bS9rZXJuZWwvc2lnbmFsX3VzZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJmNDU3OC4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2tlcm5lbC9zaWduYWxfdXNlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qIAotICogQ29weXJpZ2h0IChDKSAyMDAwIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSAidXNlcl91dGlsLmgiCi0jaW5jbHVkZSAia2Vybl91dGlsLmgiCi0jaW5jbHVkZSAidXNlci5oIgotI2luY2x1ZGUgInNpZ25hbF91c2VyLmgiCi0jaW5jbHVkZSAic2lnbmFsX2tlcm4uaCIKLSNpbmNsdWRlICJzeXNkZXAvc2lnY29udGV4dC5oIgotI2luY2x1ZGUgInNpZ2NvbnRleHQuaCIKLQotdm9pZCBzZXRfc2lnc3RhY2sodm9pZCAqc2lnX3N0YWNrLCBpbnQgc2l6ZSkKLXsKLQlzdGFja190IHN0YWNrID0gKChzdGFja190KSB7IC5zc19mbGFncwk9IDAsCi0JCQkJICAgICAuc3Nfc3AJPSAoX19wdHJfdCkgc2lnX3N0YWNrLAotCQkJCSAgICAgLnNzX3NpemUgCT0gc2l6ZSAtIHNpemVvZih2b2lkICopIH0pOwotCi0JaWYoc2lnYWx0c3RhY2soJnN0YWNrLCBOVUxMKSAhPSAwKQotCQlwYW5pYygiZW5hYmxpbmcgc2lnbmFsIHN0YWNrIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwgZXJybm8pOwotfQotCi12b2lkIHNldF9oYW5kbGVyKGludCBzaWcsIHZvaWQgKCpoYW5kbGVyKShpbnQpLCBpbnQgZmxhZ3MsIC4uLikKLXsKLQlzdHJ1Y3Qgc2lnYWN0aW9uIGFjdGlvbjsKLQl2YV9saXN0IGFwOwotCWludCBtYXNrOwotCi0JdmFfc3RhcnQoYXAsIGZsYWdzKTsKLQlhY3Rpb24uc2FfaGFuZGxlciA9IGhhbmRsZXI7Ci0Jc2lnZW1wdHlzZXQoJmFjdGlvbi5zYV9tYXNrKTsKLQl3aGlsZSgobWFzayA9IHZhX2FyZyhhcCwgaW50KSkgIT0gLTEpewotCQlzaWdhZGRzZXQoJmFjdGlvbi5zYV9tYXNrLCBtYXNrKTsKLQl9Ci0JdmFfZW5kKGFwKTsKLQlhY3Rpb24uc2FfZmxhZ3MgPSBmbGFnczsKLQlhY3Rpb24uc2FfcmVzdG9yZXIgPSBOVUxMOwotCWlmKHNpZ2FjdGlvbihzaWcsICZhY3Rpb24sIE5VTEwpIDwgMCkKLQkJcGFuaWMoInNpZ2FjdGlvbiBmYWlsZWQiKTsKLX0KLQotaW50IGNoYW5nZV9zaWcoaW50IHNpZ25hbCwgaW50IG9uKQotewotCXNpZ3NldF90IHNpZ3NldCwgb2xkOwotCi0Jc2lnZW1wdHlzZXQoJnNpZ3NldCk7Ci0Jc2lnYWRkc2V0KCZzaWdzZXQsIHNpZ25hbCk7Ci0Jc2lncHJvY21hc2sob24gPyBTSUdfVU5CTE9DSyA6IFNJR19CTE9DSywgJnNpZ3NldCwgJm9sZCk7Ci0JcmV0dXJuKCFzaWdpc21lbWJlcigmb2xkLCBzaWduYWwpKTsKLX0KLQotLyogQm90aCBoZXJlIGFuZCBpbiBzZXQvZ2V0X3NpZ25hbCB3ZSBkb24ndCB0b3VjaCBTSUdQUk9GLCBiZWNhdXNlIHdlIG11c3Qgbm90Ci0gKiBkaXNhYmxlIHByb2ZpbGluZzsgaXQncyBzYWZlIGJlY2F1c2UgdGhlIHByb2ZpbGluZyBjb2RlIGRvZXMgbm90IGludGVyYWN0Ci0gKiB3aXRoIHRoZSBrZXJuZWwgY29kZSBhdCBhbGwuKi8KLQotc3RhdGljIHZvaWQgY2hhbmdlX3NpZ25hbHMoaW50IHR5cGUpCi17Ci0Jc2lnc2V0X3QgbWFzazsKLQotCXNpZ2VtcHR5c2V0KCZtYXNrKTsKLQlzaWdhZGRzZXQoJm1hc2ssIFNJR1ZUQUxSTSk7Ci0Jc2lnYWRkc2V0KCZtYXNrLCBTSUdBTFJNKTsKLQlzaWdhZGRzZXQoJm1hc2ssIFNJR0lPKTsKLQlpZihzaWdwcm9jbWFzayh0eXBlLCAmbWFzaywgTlVMTCkgPCAwKQotCQlwYW5pYygiRmFpbGVkIHRvIGNoYW5nZSBzaWduYWwgbWFzayAtIGVycm5vID0gJWQiLCBlcnJubyk7Ci19Ci0KLXZvaWQgYmxvY2tfc2lnbmFscyh2b2lkKQotewotCWNoYW5nZV9zaWduYWxzKFNJR19CTE9DSyk7Ci19Ci0KLXZvaWQgdW5ibG9ja19zaWduYWxzKHZvaWQpCi17Ci0JY2hhbmdlX3NpZ25hbHMoU0lHX1VOQkxPQ0spOwotfQotCi0vKiBUaGVzZSBhcmUgdGhlIGFzeW5jaHJvbm91cyBzaWduYWxzLiAgU0lHVlRBTFJNIGFuZCBTSUdBUkxNIGFyZSBoYW5kbGVkCi0gKiB0b2dldGhlciB1bmRlciBTSUdWVEFMUk1fQklULiAgU0lHUFJPRiBpcyBleGNsdWRlZCBiZWNhdXNlIHdlIHdhbnQgdG8KLSAqIGJlIGFibGUgdG8gcHJvZmlsZSBhbGwgb2YgVU1MLCBub3QganVzdCB0aGUgbm9uLWNyaXRpY2FsIHNlY3Rpb25zLiAgSWYKLSAqIHByb2ZpbGluZyBpcyBub3QgdGhyZWFkLXNhZmUsIHRoZW4gdGhhdCBpcyBub3QgbXkgcHJvYmxlbS4gIFdlIGNhbiBkaXNhYmxlCi0gKiBwcm9maWxpbmcgd2hlbiBTTVAgaXMgZW5hYmxlZCBpbiB0aGF0IGNhc2UuCi0gKi8KLSNkZWZpbmUgU0lHSU9fQklUIDAKLSNkZWZpbmUgU0lHVlRBTFJNX0JJVCAxCi0KLXN0YXRpYyBpbnQgZW5hYmxlX21hc2soc2lnc2V0X3QgKm1hc2spCi17Ci0JaW50IHNpZ3M7Ci0KLQlzaWdzID0gc2lnaXNtZW1iZXIobWFzaywgU0lHSU8pID8gMCA6IDEgPDwgU0lHSU9fQklUOwotCXNpZ3MgfD0gc2lnaXNtZW1iZXIobWFzaywgU0lHVlRBTFJNKSA/IDAgOiAxIDw8IFNJR1ZUQUxSTV9CSVQ7Ci0Jc2lncyB8PSBzaWdpc21lbWJlcihtYXNrLCBTSUdBTFJNKSA/IDAgOiAxIDw8IFNJR1ZUQUxSTV9CSVQ7Ci0JcmV0dXJuKHNpZ3MpOwotfQotCi1pbnQgZ2V0X3NpZ25hbHModm9pZCkKLXsKLQlzaWdzZXRfdCBtYXNrOwotCQotCWlmKHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBOVUxMLCAmbWFzaykgPCAwKQotCQlwYW5pYygiRmFpbGVkIHRvIGdldCBzaWduYWwgbWFzayIpOwotCXJldHVybihlbmFibGVfbWFzaygmbWFzaykpOwotfQotCi1pbnQgc2V0X3NpZ25hbHMoaW50IGVuYWJsZSkKLXsKLQlzaWdzZXRfdCBtYXNrOwotCWludCByZXQ7Ci0KLQlzaWdlbXB0eXNldCgmbWFzayk7Ci0JaWYoZW5hYmxlICYgKDEgPDwgU0lHSU9fQklUKSkgCi0JCXNpZ2FkZHNldCgmbWFzaywgU0lHSU8pOwotCWlmKGVuYWJsZSAmICgxIDw8IFNJR1ZUQUxSTV9CSVQpKXsKLQkJc2lnYWRkc2V0KCZtYXNrLCBTSUdWVEFMUk0pOwotCQlzaWdhZGRzZXQoJm1hc2ssIFNJR0FMUk0pOwotCX0KLQotCS8qIFRoaXMgaXMgc2FmZSAtIHNpZ3Byb2NtYXNrIGlzIGd1YXJhbnRlZWQgdG8gY29weSBsb2NhbGx5IHRoZQotCSAqIHZhbHVlIG9mIG5ld19zZXQsIGRvIGhpcyB3b3JrIGFuZCB0aGVuLCBhdCB0aGUgZW5kLCB3cml0ZSB0bwotCSAqIG9sZF9zZXQuCi0JICovCi0JaWYoc2lncHJvY21hc2soU0lHX1VOQkxPQ0ssICZtYXNrLCAmbWFzaykgPCAwKQotCQlwYW5pYygiRmFpbGVkIHRvIGVuYWJsZSBzaWduYWxzIik7Ci0JcmV0ID0gZW5hYmxlX21hc2soJm1hc2spOwotCXNpZ2VtcHR5c2V0KCZtYXNrKTsKLQlpZigoZW5hYmxlICYgKDEgPDwgU0lHSU9fQklUKSkgPT0gMCkgCi0JCXNpZ2FkZHNldCgmbWFzaywgU0lHSU8pOwotCWlmKChlbmFibGUgJiAoMSA8PCBTSUdWVEFMUk1fQklUKSkgPT0gMCl7Ci0JCXNpZ2FkZHNldCgmbWFzaywgU0lHVlRBTFJNKTsKLQkJc2lnYWRkc2V0KCZtYXNrLCBTSUdBTFJNKTsKLQl9Ci0JaWYoc2lncHJvY21hc2soU0lHX0JMT0NLLCAmbWFzaywgTlVMTCkgPCAwKQotCQlwYW5pYygiRmFpbGVkIHRvIGJsb2NrIHNpZ25hbHMiKTsKLQotCXJldHVybihyZXQpOwotfQotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9NYWtlZmlsZSBiL2FyY2gvdW0va2VybmVsL3NrYXMvTWFrZWZpbGUKaW5kZXggOGRlNDcxYi4uNTcxODFhOSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9NYWtlZmlsZQorKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL01ha2VmaWxlCkBAIC0xLDEyICsxLDEyIEBACi0jIAorIwogIyBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA0IEplZmYgRGlrZSAoamRpa2VAYWRkdG9pdC5jb20pCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICMKIAotb2JqLXkgOj0gY2xvbmUubyBleGVjX2tlcm4ubyBtZW0ubyBtZW1fdXNlci5vIG1tdS5vIHByb2Nlc3MubyBwcm9jZXNzX2tlcm4ubyBcCi0Jc3lzY2FsbC5vIHRsYi5vIHRyYXBfdXNlci5vIHVhY2Nlc3Mubworb2JqLXkgOj0gY2xvbmUubyBleGVjX2tlcm4ubyBtZW0ubyBtbXUubyBwcm9jZXNzX2tlcm4ubyBcCisJc3lzY2FsbC5vIHRsYi5vIHVhY2Nlc3MubwogCi1VU0VSX09CSlMgOj0gcHJvY2Vzcy5vIGNsb25lLm8KK1VTRVJfT0JKUyA6PSBjbG9uZS5vCiAKIGluY2x1ZGUgYXJjaC91bS9zY3JpcHRzL01ha2VmaWxlLnJ1bGVzCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9tbXUtc2thcy5oIGIvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21tdS1za2FzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MTEwYzUuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21tdS1za2FzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fU0tBU19NTVVfSAotI2RlZmluZSBfX1NLQVNfTU1VX0gKLQotI2luY2x1ZGUgImxpbnV4L2NvbmZpZy5oIgotI2luY2x1ZGUgIm1tX2lkLmgiCi0jaW5jbHVkZSAiYXNtL2xkdC5oIgotCi1zdHJ1Y3QgbW11X2NvbnRleHRfc2thcyB7Ci0Jc3RydWN0IG1tX2lkIGlkOwotICAgICAgICB1bnNpZ25lZCBsb25nIGxhc3RfcGFnZV90YWJsZTsKLSNpZmRlZiBDT05GSUdfM19MRVZFTF9QR1RBQkxFUwotICAgICAgICB1bnNpZ25lZCBsb25nIGxhc3RfcG1kOwotI2VuZGlmCi0JdW1sX2xkdF90IGxkdDsKLX07Ci0KLWV4dGVybiB2b2lkIHN3aXRjaF9tbV9za2FzKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCk7Ci0KLSNlbmRpZgotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21vZGUtc2thcy5oIGIvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21vZGUtc2thcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2QyNmE2Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9tb2RlLXNrYXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19NT0RFX1NLQVNfSF9fCi0jZGVmaW5lIF9fTU9ERV9TS0FTX0hfXwotCi0jaW5jbHVkZSA8c3lzZGVwL3B0cmFjZS5oPgotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBleGVjX3JlZ3NbXTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGV4ZWNfZnBfcmVnc1tdOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXhlY19mcHhfcmVnc1tdOwotZXh0ZXJuIGludCBoYXZlX2ZweF9yZWdzOwotCi1leHRlcm4gdm9pZCBzaWdfaGFuZGxlcl9jb21tb25fc2thcyhpbnQgc2lnLCB2b2lkICpzY19wdHIpOwotZXh0ZXJuIHZvaWQgaGFsdF9za2FzKHZvaWQpOwotZXh0ZXJuIHZvaWQgcmVib290X3NrYXModm9pZCk7Ci1leHRlcm4gdm9pZCBraWxsX29mZl9wcm9jZXNzZXNfc2thcyh2b2lkKTsKLWV4dGVybiBpbnQgaXNfc2thc193aW5jaChpbnQgcGlkLCBpbnQgZmQsIHZvaWQgKmRhdGEpOwotCi0jZW5kaWYKLQotLyoKLSAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgotICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5Ci0gKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgZmlsZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1maWxlLXN0eWxlOiAibGludXgiCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9tb2RlX2tlcm4tc2thcy5oIGIvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21vZGVfa2Vybi1za2FzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5N2E4MGQuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21vZGVfa2Vybi1za2FzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fU0tBU19NT0RFX0tFUk5fSF9fCi0jZGVmaW5lIF9fU0tBU19NT0RFX0tFUk5fSF9fCi0KLSNpbmNsdWRlICJsaW51eC9zY2hlZC5oIgotI2luY2x1ZGUgImFzbS9wYWdlLmgiCi0jaW5jbHVkZSAiYXNtL3B0cmFjZS5oIgotCi1leHRlcm4gdm9pZCBmbHVzaF90aHJlYWRfc2thcyh2b2lkKTsKLWV4dGVybiB2b2lkIHN3aXRjaF90b19za2FzKHZvaWQgKnByZXYsIHZvaWQgKm5leHQpOwotZXh0ZXJuIHZvaWQgc3RhcnRfdGhyZWFkX3NrYXMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgZWlwLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBlc3ApOwotZXh0ZXJuIGludCBjb3B5X3RocmVhZF9za2FzKGludCBuciwgdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncywKLQkJCSAgICB1bnNpZ25lZCBsb25nIHNwLCB1bnNpZ25lZCBsb25nIHN0YWNrX3RvcCwKLQkJCSAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLWV4dGVybiB2b2lkIHJlbGVhc2VfdGhyZWFkX3NrYXMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKLWV4dGVybiB2b2lkIGluaXRpYWxfdGhyZWFkX2NiX3NrYXModm9pZCAoKnByb2MpKHZvaWQgKiksIHZvaWQgKmFyZyk7Ci1leHRlcm4gdm9pZCBpbml0X2lkbGVfc2thcyh2b2lkKTsKLWV4dGVybiB2b2lkIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2Vfc2thcyh1bnNpZ25lZCBsb25nIHN0YXJ0LAotCQkJCQl1bnNpZ25lZCBsb25nIGVuZCk7Ci1leHRlcm4gdm9pZCBmbHVzaF90bGJfa2VybmVsX3ZtX3NrYXModm9pZCk7Ci1leHRlcm4gdm9pZCBfX2ZsdXNoX3RsYl9vbmVfc2thcyh1bnNpZ25lZCBsb25nIGFkZHIpOwotZXh0ZXJuIHZvaWQgZmx1c2hfdGxiX3JhbmdlX3NrYXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKLWV4dGVybiB2b2lkIGZsdXNoX3RsYl9tbV9za2FzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKLWV4dGVybiB2b2lkIGZvcmNlX2ZsdXNoX2FsbF9za2FzKHZvaWQpOwotZXh0ZXJuIGxvbmcgZXhlY3V0ZV9zeXNjYWxsX3NrYXModm9pZCAqcik7Ci1leHRlcm4gdm9pZCBiZWZvcmVfbWVtX3NrYXModW5zaWduZWQgbG9uZyB1bnVzZWQpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2V0X3Rhc2tfc2l6ZXNfc2thcyhpbnQgYXJnLCB1bnNpZ25lZCBsb25nICpob3N0X3NpemVfb3V0LAotCQkJCQkgdW5zaWduZWQgbG9uZyAqdGFza19zaXplX291dCk7Ci1leHRlcm4gaW50IHN0YXJ0X3VtbF9za2FzKHZvaWQpOwotZXh0ZXJuIGludCBleHRlcm5hbF9waWRfc2thcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwotZXh0ZXJuIGludCB0aHJlYWRfcGlkX3NrYXMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKLQotI2RlZmluZSBrbWVtX2VuZF9za2FzIChob3N0X3Rhc2tfc2l6ZSAtIDEwMjQgKiAxMDI0KQotCi0jZW5kaWYKLQotLyoKLSAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgotICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5Ci0gKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgZmlsZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1maWxlLXN0eWxlOiAibGludXgiCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9wcm9jX21tLmggYi9hcmNoL3VtL2tlcm5lbC9za2FzL2luY2x1ZGUvcHJvY19tbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2U2MWE2Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9wcm9jX21tLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1NLQVNfUFJPQ19NTV9ICi0jZGVmaW5lIF9fU0tBU19QUk9DX01NX0gKLQotI2RlZmluZSBNTV9NTUFQIDU0Ci0jZGVmaW5lIE1NX01VTk1BUCA1NQotI2RlZmluZSBNTV9NUFJPVEVDVCA1NgotI2RlZmluZSBNTV9DT1BZX1NFR01FTlRTIDU3Ci0KLXN0cnVjdCBtbV9tbWFwIHsKLQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0JdW5zaWduZWQgbG9uZyBsZW47Ci0JdW5zaWduZWQgbG9uZyBwcm90OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBmZDsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKLX07Ci0KLXN0cnVjdCBtbV9tdW5tYXAgewotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQl1bnNpZ25lZCBsb25nIGxlbjsJCi19OwotCi1zdHJ1Y3QgbW1fbXByb3RlY3QgewotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQl1bnNpZ25lZCBsb25nIGxlbjsKLSAgICAgICAgdW5zaWduZWQgaW50IHByb3Q7Ci19OwotCi1zdHJ1Y3QgcHJvY19tbV9vcCB7Ci0JaW50IG9wOwotCXVuaW9uIHsKLQkJc3RydWN0IG1tX21tYXAgbW1hcDsKLQkJc3RydWN0IG1tX211bm1hcCBtdW5tYXA7Ci0JICAgICAgICBzdHJ1Y3QgbW1fbXByb3RlY3QgbXByb3RlY3Q7Ci0JCWludCBjb3B5X3NlZ21lbnRzOwotCX0gdTsKLX07Ci0KLSNlbmRpZgotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL3NrYXMuaCBiL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9za2FzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYTJmODUuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL3NrYXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qIAotICogQ29weXJpZ2h0IChDKSAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fU0tBU19ICi0jZGVmaW5lIF9fU0tBU19ICi0KLSNpbmNsdWRlICJtbV9pZC5oIgotI2luY2x1ZGUgInN5c2RlcC9wdHJhY2UuaCIKLQotZXh0ZXJuIGludCB1c2Vyc3BhY2VfcGlkW107Ci1leHRlcm4gaW50IHByb2NfbW0sIHB0cmFjZV9mYXVsdGluZm8sIHB0cmFjZV9sZHQ7Ci1leHRlcm4gaW50IHNrYXNfbmVlZHNfc3R1YjsKLQotZXh0ZXJuIHZvaWQgc3dpdGNoX3RocmVhZHModm9pZCAqbWUsIHZvaWQgKm5leHQpOwotZXh0ZXJuIHZvaWQgdGhyZWFkX3dhaXQodm9pZCAqc3csIHZvaWQgKmZiKTsKLWV4dGVybiB2b2lkIG5ld190aHJlYWQodm9pZCAqc3RhY2ssIHZvaWQgKipzd2l0Y2hfYnVmX3B0ciwgdm9pZCAqKmZvcmtfYnVmX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmhhbmRsZXIpKGludCkpOwotZXh0ZXJuIGludCBzdGFydF9pZGxlX3RocmVhZCh2b2lkICpzdGFjaywgdm9pZCAqc3dpdGNoX2J1Zl9wdHIsIAotCQkJICAgICB2b2lkICoqZm9ya19idWZfcHRyKTsKLWV4dGVybiBpbnQgdXNlcl90aHJlYWQodW5zaWduZWQgbG9uZyBzdGFjaywgaW50IGZsYWdzKTsKLWV4dGVybiB2b2lkIHVzZXJzcGFjZSh1bmlvbiB1bWxfcHRfcmVncyAqcmVncyk7Ci1leHRlcm4gdm9pZCBuZXdfdGhyZWFkX3Byb2Modm9pZCAqc3RhY2ssIHZvaWQgKCpoYW5kbGVyKShpbnQgc2lnKSk7Ci1leHRlcm4gdm9pZCByZW1vdmVfc2lnc3RhY2sodm9pZCk7Ci1leHRlcm4gdm9pZCBuZXdfdGhyZWFkX2hhbmRsZXIoaW50IHNpZyk7Ci1leHRlcm4gdm9pZCBoYW5kbGVfc3lzY2FsbCh1bmlvbiB1bWxfcHRfcmVncyAqcmVncyk7Ci1leHRlcm4gaW50IG1hcChzdHJ1Y3QgbW1faWQgKiBtbV9pZHAsIHVuc2lnbmVkIGxvbmcgdmlydCwKLQkgICAgICAgdW5zaWduZWQgbG9uZyBsZW4sIGludCByLCBpbnQgdywgaW50IHgsIGludCBwaHlzX2ZkLAotCSAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0LCBpbnQgZG9uZSwgdm9pZCAqKmRhdGEpOwotZXh0ZXJuIGludCB1bm1hcChzdHJ1Y3QgbW1faWQgKiBtbV9pZHAsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAotCQkgaW50IGRvbmUsIHZvaWQgKipkYXRhKTsKLWV4dGVybiBpbnQgcHJvdGVjdChzdHJ1Y3QgbW1faWQgKiBtbV9pZHAsIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJICAgdW5zaWduZWQgbG9uZyBsZW4sIGludCByLCBpbnQgdywgaW50IHgsIGludCBkb25lLAotCQkgICB2b2lkICoqZGF0YSk7Ci1leHRlcm4gdm9pZCB1c2VyX3NpZ25hbChpbnQgc2lnLCB1bmlvbiB1bWxfcHRfcmVncyAqcmVncywgaW50IHBpZCk7Ci1leHRlcm4gaW50IG5ld19tbShpbnQgZnJvbSwgdW5zaWduZWQgbG9uZyBzdGFjayk7Ci1leHRlcm4gaW50IHN0YXJ0X3VzZXJzcGFjZSh1bnNpZ25lZCBsb25nIHN0dWJfc3RhY2spOwotZXh0ZXJuIGludCBjb3B5X2NvbnRleHRfc2thczAodW5zaWduZWQgbG9uZyBzdGFjaywgaW50IHBpZCk7Ci1leHRlcm4gdm9pZCBnZXRfc2thc19mYXVsdGluZm8oaW50IHBpZCwgc3RydWN0IGZhdWx0aW5mbyAqIGZpKTsKLWV4dGVybiBsb25nIGV4ZWN1dGVfc3lzY2FsbF9za2FzKHZvaWQgKnIpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY3VycmVudF9zdHViX3N0YWNrKHZvaWQpOwotZXh0ZXJuIGxvbmcgcnVuX3N5c2NhbGxfc3R1YihzdHJ1Y3QgbW1faWQgKiBtbV9pZHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeXNjYWxsLCB1bnNpZ25lZCBsb25nICphcmdzLCBsb25nIGV4cGVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYWRkciwgaW50IGRvbmUpOwotZXh0ZXJuIGxvbmcgc3lzY2FsbF9zdHViX2RhdGEoc3RydWN0IG1tX2lkICogbW1faWRwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqZGF0YSwgaW50IGRhdGFfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYWRkciwgdm9pZCAqKnN0dWJfYWRkcik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL3VhY2Nlc3Mtc2thcy5oIGIvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL3VhY2Nlc3Mtc2thcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDUxNmM1Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS91YWNjZXNzLXNrYXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19TS0FTX1VBQ0NFU1NfSAotI2RlZmluZSBfX1NLQVNfVUFDQ0VTU19ICi0KLSNpbmNsdWRlICJhc20vZXJybm8uaCIKLQotLyogTm8gU0tBUy1zcGVjaWZpYyBjaGVja2luZy4gKi8KLSNkZWZpbmUgYWNjZXNzX29rX3NrYXModHlwZSwgYWRkciwgc2l6ZSkgMAotCi1leHRlcm4gaW50IGNvcHlfZnJvbV91c2VyX3NrYXModm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCBpbnQgbik7Ci1leHRlcm4gaW50IGNvcHlfdG9fdXNlcl9za2FzKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgaW50IG4pOwotZXh0ZXJuIGludCBzdHJuY3B5X2Zyb21fdXNlcl9za2FzKGNoYXIgKmRzdCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywgaW50IGNvdW50KTsKLWV4dGVybiBpbnQgX19jbGVhcl91c2VyX3NrYXModm9pZCBfX3VzZXIgKm1lbSwgaW50IGxlbik7Ci1leHRlcm4gaW50IGNsZWFyX3VzZXJfc2thcyh2b2lkIF9fdXNlciAqbWVtLCBpbnQgbGVuKTsKLWV4dGVybiBpbnQgc3Rybmxlbl91c2VyX3NrYXMoY29uc3Qgdm9pZCBfX3VzZXIgKnN0ciwgaW50IGxlbik7Ci0KLSNlbmRpZgotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9tZW1fdXNlci5jIGIvYXJjaC91bS9rZXJuZWwvc2thcy9tZW1fdXNlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDg5NjQwLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0va2VybmVsL3NrYXMvbWVtX3VzZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgotI2luY2x1ZGUgIm1lbV91c2VyLmgiCi0jaW5jbHVkZSAibWVtLmgiCi0jaW5jbHVkZSAic2thcy5oIgotI2luY2x1ZGUgInVzZXIuaCIKLSNpbmNsdWRlICJvcy5oIgotI2luY2x1ZGUgInByb2NfbW0uaCIKLSNpbmNsdWRlICJwdHJhY2VfdXNlci5oIgotI2luY2x1ZGUgInVzZXJfdXRpbC5oIgotI2luY2x1ZGUgImtlcm5fdXRpbC5oIgotI2luY2x1ZGUgInRhc2suaCIKLSNpbmNsdWRlICJyZWdpc3RlcnMuaCIKLSNpbmNsdWRlICJ1bWwtY29uZmlnLmgiCi0jaW5jbHVkZSAic3lzZGVwL3B0cmFjZS5oIgotI2luY2x1ZGUgInN5c2RlcC9zdHViLmgiCi0KLWV4dGVybiB1bnNpZ25lZCBsb25nIGJhdGNoX3N5c2NhbGxfc3R1YiwgX19zeXNjYWxsX3N0dWJfc3RhcnQ7Ci0KLWV4dGVybiB2b2lkIHdhaXRfc3R1Yl9kb25lKGludCBwaWQsIGludCBzaWcsIGNoYXIgKiBmbmFtZSk7Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyAqY2hlY2tfaW5pdF9zdGFjayhzdHJ1Y3QgbW1faWQgKiBtbV9pZHAsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnN0YWNrKQotewotCWlmKHN0YWNrID09IE5VTEwpewotCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopIG1tX2lkcC0+c3RhY2sgKyAyOwotCQkqc3RhY2sgPSAwOwotCX0KLQlyZXR1cm4gc3RhY2s7Ci19Ci0KLWV4dGVybiBpbnQgcHJvY19tbTsKLQotaW50IHNpbmdsZV9jb3VudCA9IDA7Ci1pbnQgbXVsdGlfY291bnQgPSAwOwotaW50IG11bHRpX29wX2NvdW50ID0gMDsKLQotc3RhdGljIGxvbmcgZG9fc3lzY2FsbF9zdHViKHN0cnVjdCBtbV9pZCAqbW1faWRwLCB2b2lkICoqYWRkcikKLXsKLQl1bnNpZ25lZCBsb25nIHJlZ3NbTUFYX1JFR19OUl07Ci0JdW5zaWduZWQgbG9uZyAqZGF0YTsKLQl1bnNpZ25lZCBsb25nICpzeXNjYWxsOwotCWxvbmcgcmV0LCBvZmZzZXQ7Ci0gICAgICAgIGludCBuLCBwaWQgPSBtbV9pZHAtPnUucGlkOwotCi0JaWYocHJvY19tbSkKLSN3YXJuaW5nIE5lZWQgdG8gbG9vayB1cCB1c2Vyc3BhY2VfcGlkIGJ5IGNwdQotCQlwaWQgPSB1c2Vyc3BhY2VfcGlkWzBdOwotCi0JbXVsdGlfY291bnQrKzsKLQotICAgICAgICBnZXRfc2FmZV9yZWdpc3RlcnMocmVncyk7Ci0gICAgICAgIHJlZ3NbUkVHU19JUF9JTkRFWF0gPSBVTUxfQ09ORklHX1NUVUJfQ09ERSArCi0JCSgodW5zaWduZWQgbG9uZykgJmJhdGNoX3N5c2NhbGxfc3R1YiAtCi0gICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSAmX19zeXNjYWxsX3N0dWJfc3RhcnQpOwotCW4gPSBwdHJhY2Vfc2V0cmVncyhwaWQsIHJlZ3MpOwotCWlmKG4gPCAwKQotCQlwYW5pYygiZG9fc3lzY2FsbF9zdHViIDogUFRSQUNFX1NFVFJFR1MgZmFpbGVkLCBlcnJubyA9ICVkXG4iLAotCQkgICAgICBuKTsKLQotCXdhaXRfc3R1Yl9kb25lKHBpZCwgMCwgImRvX3N5c2NhbGxfc3R1YiIpOwotCi0JLyogV2hlbiB0aGUgc3R1YiBzdG9wcywgd2UgZmluZCB0aGUgZm9sbG93aW5nIHZhbHVlcyBvbiB0aGUKLQkgKiBiZWdpbm5pbmcgb2YgdGhlIHN0YWNrOgotCSAqIChsb25nIClyZXR1cm5fdmFsdWUKLQkgKiAobG9uZyApb2Zmc2V0IHRvIGZhaWxlZCBzeWNhbGwtZGF0YSAoMCwgaWYgbm8gZXJyb3IpCi0JICovCi0JcmV0ID0gKigodW5zaWduZWQgbG9uZyAqKSBtbV9pZHAtPnN0YWNrKTsKLQlvZmZzZXQgPSAqKCh1bnNpZ25lZCBsb25nICopIG1tX2lkcC0+c3RhY2sgKyAxKTsKLQlpZiAob2Zmc2V0KSB7Ci0JCWRhdGEgPSAodW5zaWduZWQgbG9uZyAqKShtbV9pZHAtPnN0YWNrICsKLQkJCQkJIG9mZnNldCAtIFVNTF9DT05GSUdfU1RVQl9EQVRBKTsKLQkJc3lzY2FsbCA9ICh1bnNpZ25lZCBsb25nICopKCh1bnNpZ25lZCBsb25nKWRhdGEgKyBkYXRhWzBdKTsKLQkJcHJpbnRrKCJkb19zeXNjYWxsX3N0dWI6IHN5c2NhbGwgJWxkIGZhaWxlZCwgcmV0dXJuIHZhbHVlID0gIgotCQkgICAgICAgIjB4JWx4LCBleHBlY3RlZCByZXR1cm4gdmFsdWUgPSAweCVseFxuIiwKLQkJICAgICAgIHN5c2NhbGxbMF0sIHJldCwgc3lzY2FsbFs3XSk7Ci0JCXByaW50aygiICAgIHN5c2NhbGwgcGFyYW1ldGVyczogIgotCQkgICAgICAgIjB4JWx4IDB4JWx4IDB4JWx4IDB4JWx4IDB4JWx4IDB4JWx4XG4iLAotCQkgICAgICAgc3lzY2FsbFsxXSwgc3lzY2FsbFsyXSwgc3lzY2FsbFszXSwKLQkJICAgICAgIHN5c2NhbGxbNF0sIHN5c2NhbGxbNV0sIHN5c2NhbGxbNl0pOwotCQlmb3IobiA9IDE7IG4gPCBkYXRhWzBdL3NpemVvZihsb25nKTsgbisrKSB7Ci0JCQlpZihuID09IDEpCi0JCQkJcHJpbnRrKCIgICAgYWRkaXRpb25hbCBzeXNjYWxsIGRhdGE6Iik7Ci0JCQlpZihuICUgNCA9PSAxKQotCQkJCXByaW50aygiXG4gICAgICAiKTsKLQkJCXByaW50aygiICAweCVseCIsIGRhdGFbbl0pOwotCQl9Ci0JCWlmKG4gPiAxKQotCQkJcHJpbnRrKCJcbiIpOwotCX0KLQllbHNlIHJldCA9IDA7Ci0KLQkqYWRkciA9IGNoZWNrX2luaXRfc3RhY2sobW1faWRwLCBOVUxMKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWxvbmcgcnVuX3N5c2NhbGxfc3R1YihzdHJ1Y3QgbW1faWQgKiBtbV9pZHAsIGludCBzeXNjYWxsLAotCQkgICAgICB1bnNpZ25lZCBsb25nICphcmdzLCBsb25nIGV4cGVjdGVkLCB2b2lkICoqYWRkciwKLSAJCSAgICAgIGludCBkb25lKQotewotIAl1bnNpZ25lZCBsb25nICpzdGFjayA9IGNoZWNrX2luaXRfc3RhY2sobW1faWRwLCAqYWRkcik7Ci0KLQlpZihkb25lICYmICphZGRyID09IE5VTEwpCi0JCXNpbmdsZV9jb3VudCsrOwotCi0gCSpzdGFjayArPSBzaXplb2YobG9uZyk7Ci0Jc3RhY2sgKz0gKnN0YWNrIC8gc2l6ZW9mKGxvbmcpOwotCi0gICAgICAgICpzdGFjaysrID0gc3lzY2FsbDsKLSAgICAgICAgKnN0YWNrKysgPSBhcmdzWzBdOwotICAgICAgICAqc3RhY2srKyA9IGFyZ3NbMV07Ci0gICAgICAgICpzdGFjaysrID0gYXJnc1syXTsKLSAgICAgICAgKnN0YWNrKysgPSBhcmdzWzNdOwotICAgICAgICAqc3RhY2srKyA9IGFyZ3NbNF07Ci0gICAgICAgICpzdGFjaysrID0gYXJnc1s1XTsKLQkqc3RhY2srKyA9IGV4cGVjdGVkOwotICAgICAgICAqc3RhY2sgPSAwOwotICAgICAgICBtdWx0aV9vcF9jb3VudCsrOwotCi0gICAgICAgIGlmKCFkb25lICYmICgoKCh1bnNpZ25lZCBsb25nKSBzdGFjaykgJiB+UEFHRV9NQVNLKSA8Ci0JCSAgICAgUEFHRV9TSVpFIC0gMTAgKiBzaXplb2YobG9uZykpKXsKLQkJKmFkZHIgPSBzdGFjazsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0JcmV0dXJuIGRvX3N5c2NhbGxfc3R1YihtbV9pZHAsIGFkZHIpOwotfQotCi1sb25nIHN5c2NhbGxfc3R1Yl9kYXRhKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmRhdGEsIGludCBkYXRhX2NvdW50LAotCQkgICAgICAgdm9pZCAqKmFkZHIsIHZvaWQgKipzdHViX2FkZHIpCi17Ci0JdW5zaWduZWQgbG9uZyAqc3RhY2s7Ci0JaW50IHJldCA9IDA7Ci0KLQkvKiBJZiAqYWRkciBzdGlsbCBpcyB1bmluaXRpYWxpemVkLCBpdCAqbXVzdCogY29udGFpbiBOVUxMLgotCSAqIFRodXMgaW4gdGhpcyBjYXNlIGRvX3N5c2NhbGxfc3R1YiBjb3JyZWN0bHkgd29uJ3QgYmUgY2FsbGVkLgotCSAqLwotCWlmKCgoKHVuc2lnbmVkIGxvbmcpICphZGRyKSAmIH5QQUdFX01BU0spID49Ci0JICAgUEFHRV9TSVpFIC0gKDEwICsgZGF0YV9jb3VudCkgKiBzaXplb2YobG9uZykpIHsKLQkJcmV0ID0gZG9fc3lzY2FsbF9zdHViKG1tX2lkcCwgYWRkcik7Ci0gCQkvKiBpbiBjYXNlIG9mIGVycm9yLCBkb24ndCBvdmVyd3JpdGUgZGF0YSBvbiBzdGFjayAqLwotCQlpZihyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCXN0YWNrID0gY2hlY2tfaW5pdF9zdGFjayhtbV9pZHAsICphZGRyKTsKLQkqYWRkciA9IHN0YWNrOwotCi0JKnN0YWNrID0gZGF0YV9jb3VudCAqIHNpemVvZihsb25nKTsKLQotCW1lbWNweShzdGFjayArIDEsIGRhdGEsIGRhdGFfY291bnQgKiBzaXplb2YobG9uZykpOwotCi0JKnN0dWJfYWRkciA9ICh2b2lkICopKCgodW5zaWduZWQgbG9uZykoc3RhY2sgKyAxKSAmIH5QQUdFX01BU0spICsKLQkJCSAgICAgIFVNTF9DT05GSUdfU1RVQl9EQVRBKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgbWFwKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCwgdW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwKLQlpbnQgciwgaW50IHcsIGludCB4LCBpbnQgcGh5c19mZCwgdW5zaWduZWQgbG9uZyBsb25nIG9mZnNldCwKLQlpbnQgZG9uZSwgdm9pZCAqKmRhdGEpCi17Ci0gICAgICAgIGludCBwcm90LCByZXQ7Ci0KLSAgICAgICAgcHJvdCA9IChyID8gUFJPVF9SRUFEIDogMCkgfCAodyA/IFBST1RfV1JJVEUgOiAwKSB8Ci0gICAgICAgICAgICAgICAgKHggPyBQUk9UX0VYRUMgOiAwKTsKLQotICAgICAgICBpZihwcm9jX21tKXsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgcHJvY19tbV9vcCBtYXA7Ci0gICAgICAgICAgICAgICAgaW50IGZkID0gbW1faWRwLT51Lm1tX2ZkOwotCi0gICAgICAgICAgICAgICAgbWFwID0gKChzdHJ1Y3QgcHJvY19tbV9vcCkgeyAub3AJPSBNTV9NTUFQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnUJCT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm1tYXAJPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5hZGRyCT0gdmlydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuCT0gbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm90CT0gcHJvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmxhZ3MJPSBNQVBfU0hBUkVEIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfRklYRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZkCT0gcGh5c19mZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2Zmc2V0PSBvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9IH0gKTsKLQkJcmV0ID0gb3Nfd3JpdGVfZmlsZShmZCwgJm1hcCwgc2l6ZW9mKG1hcCkpOwotCQlpZihyZXQgIT0gc2l6ZW9mKG1hcCkpCi0JCQlwcmludGsoIm1hcCA6IC9wcm9jL21tIG1hcCBmYWlsZWQsIGVyciA9ICVkXG4iLCAtcmV0KTsKLQkJZWxzZSByZXQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnc1tdID0geyB2aXJ0LCBsZW4sIHByb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BUF9TSEFSRUQgfCBNQVBfRklYRUQsIHBoeXNfZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NQVBfT0ZGU0VUKG9mZnNldCkgfTsKLQotCQlyZXQgPSBydW5fc3lzY2FsbF9zdHViKG1tX2lkcCwgU1RVQl9NTUFQX05SLCBhcmdzLCB2aXJ0LAotCQkJCSAgICAgICBkYXRhLCBkb25lKTsKLSAgICAgICAgfQotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IHVubWFwKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIGludCBkb25lLAotCSAgdm9pZCAqKmRhdGEpCi17Ci0gICAgICAgIGludCByZXQ7Ci0KLSAgICAgICAgaWYocHJvY19tbSl7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHByb2NfbW1fb3AgdW5tYXA7Ci0gICAgICAgICAgICAgICAgaW50IGZkID0gbW1faWRwLT51Lm1tX2ZkOwotCi0gICAgICAgICAgICAgICAgdW5tYXAgPSAoKHN0cnVjdCBwcm9jX21tX29wKSB7IC5vcAk9IE1NX01VTk1BUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnUJPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5tdW5tYXAJPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLmFkZHIJPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuCQk9IGxlbiB9IH0gfSApOwotCQlyZXQgPSBvc193cml0ZV9maWxlKGZkLCAmdW5tYXAsIHNpemVvZih1bm1hcCkpOwotCQlpZihyZXQgIT0gc2l6ZW9mKHVubWFwKSkKLQkJCXByaW50aygidW5tYXAgLSBwcm9jX21tIHdyaXRlIHJldHVybmVkICVkXG4iLCByZXQpOwotCQllbHNlIHJldCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmdzW10gPSB7ICh1bnNpZ25lZCBsb25nKSBhZGRyLCBsZW4sIDAsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgfTsKLQotCQlyZXQgPSBydW5fc3lzY2FsbF9zdHViKG1tX2lkcCwgX19OUl9tdW5tYXAsIGFyZ3MsIDAsCi0JCQkJICAgICAgIGRhdGEsIGRvbmUpOwotICAgICAgICAgICAgICAgIGlmKHJldCA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIm11bm1hcCBzdHViIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwgcmV0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBwcm90ZWN0KHN0cnVjdCBtbV9pZCAqIG1tX2lkcCwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkgICAgaW50IHIsIGludCB3LCBpbnQgeCwgaW50IGRvbmUsIHZvaWQgKipkYXRhKQotewotICAgICAgICBzdHJ1Y3QgcHJvY19tbV9vcCBwcm90ZWN0OwotICAgICAgICBpbnQgcHJvdCwgcmV0OwotCi0gICAgICAgIHByb3QgPSAociA/IFBST1RfUkVBRCA6IDApIHwgKHcgPyBQUk9UX1dSSVRFIDogMCkgfAotICAgICAgICAgICAgICAgICh4ID8gUFJPVF9FWEVDIDogMCk7Ci0KLSAgICAgICAgaWYocHJvY19tbSl7Ci0gICAgICAgICAgICAgICAgaW50IGZkID0gbW1faWRwLT51Lm1tX2ZkOwotICAgICAgICAgICAgICAgIHByb3RlY3QgPSAoKHN0cnVjdCBwcm9jX21tX29wKSB7IC5vcAk9IE1NX01QUk9URUNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51CT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5tcHJvdGVjdAk9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5hZGRyCT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW4JPSBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm90CT0gcHJvdCB9IH0gfSApOwotCi0gICAgICAgICAgICAgICAgcmV0ID0gb3Nfd3JpdGVfZmlsZShmZCwgJnByb3RlY3QsIHNpemVvZihwcm90ZWN0KSk7Ci0gICAgICAgICAgICAgICAgaWYocmV0ICE9IHNpemVvZihwcm90ZWN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygicHJvdGVjdCBmYWlsZWQsIGVyciA9ICVkIiwgLXJldCk7Ci0gICAgICAgICAgICAgICAgZWxzZSByZXQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnc1tdID0geyBhZGRyLCBsZW4sIHByb3QsIDAsIDAsIDAgfTsKLQotICAgICAgICAgICAgICAgIHJldCA9IHJ1bl9zeXNjYWxsX3N0dWIobW1faWRwLCBfX05SX21wcm90ZWN0LCBhcmdzLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgZG9uZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0OwotfQotCi12b2lkIGJlZm9yZV9tZW1fc2thcyh1bnNpZ25lZCBsb25nIHVudXNlZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvbW11LmMgYi9hcmNoL3VtL2tlcm5lbC9za2FzL21tdS5jCmluZGV4IDY3Nzg3MWYuLmM1Yzk4ODUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3NrYXMvbW11LmMKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9tbXUuYwpAQCAtNzgsNyArNzgsNyBAQAogIAlzdHJ1Y3QgbW11X2NvbnRleHRfc2thcyAqZnJvbV9tbSA9IE5VTEw7CiAJc3RydWN0IG1tdV9jb250ZXh0X3NrYXMgKnRvX21tID0gJm1tLT5jb250ZXh0LnNrYXM7CiAJdW5zaWduZWQgbG9uZyBzdGFjayA9IDA7Ci0JaW50IGZyb21fZmQsIHJldCA9IC1FTk9NRU07CisJaW50IHJldCA9IC1FTk9NRU07CiAKIAlpZihza2FzX25lZWRzX3N0dWIpewogCQlzdGFjayA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKQEAgLTEwOCwxMSArMTA4LDcgQEAKIAkJZnJvbV9tbSA9ICZjdXJyZW50LT5tbS0+Y29udGV4dC5za2FzOwogCiAJaWYocHJvY19tbSl7Ci0JCWlmKGZyb21fbW0pCi0JCQlmcm9tX2ZkID0gZnJvbV9tbS0+aWQudS5tbV9mZDsKLQkJZWxzZSBmcm9tX2ZkID0gLTE7Ci0KLQkJcmV0ID0gbmV3X21tKGZyb21fZmQsIHN0YWNrKTsKKwkJcmV0ID0gbmV3X21tKHN0YWNrKTsKIAkJaWYocmV0IDwgMCl7CiAJCQlwcmludGsoImluaXRfbmV3X2NvbnRleHRfc2thcyAtIG5ld19tbSBmYWlsZWQsICIKIAkJCSAgICAgICAiZXJybm8gPSAlZFxuIiwgcmV0KTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzcy5jIGIvYXJjaC91bS9rZXJuZWwvc2thcy9wcm9jZXNzLmMKaW5kZXggNTk5ZDY3OS4uZWVhMWM5YzQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzcy5jCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzcy5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgInB0cmFjZV91c2VyLmgiCi0jaW5jbHVkZSAidGltZV91c2VyLmgiCiAjaW5jbHVkZSAic3lzZGVwL3B0cmFjZS5oIgogI2luY2x1ZGUgInVzZXJfdXRpbC5oIgogI2luY2x1ZGUgImtlcm5fdXRpbC5oIgpAQCAtMzEsNyArMzAsNiBAQAogI2luY2x1ZGUgInByb2NfbW0uaCIKICNpbmNsdWRlICJza2FzX3B0cmFjZS5oIgogI2luY2x1ZGUgImNoYW5fdXNlci5oIgotI2luY2x1ZGUgInNpZ25hbF91c2VyLmgiCiAjaW5jbHVkZSAicmVnaXN0ZXJzLmgiCiAjaW5jbHVkZSAibWVtLmgiCiAjaW5jbHVkZSAidW1sLWNvbmZpZy5oIgpAQCAtNjksNyArNjcsNyBAQAogCiAgICAgICAgIGlmKChuIDwgMCkgfHwgIVdJRlNUT1BQRUQoc3RhdHVzKSB8fAogICAgICAgICAgICAoV1NUT1BTSUcoc3RhdHVzKSAhPSBTSUdVU1IxICYmIFdTVE9QU0lHKHN0YXR1cykgIT0gU0lHVFJBUCkpewotCQl1bnNpZ25lZCBsb25nIHJlZ3NbRlJBTUVfU0laRV07CisJCXVuc2lnbmVkIGxvbmcgcmVnc1tIT1NUX0ZSQU1FX1NJWkVdOwogCQlpZihwdHJhY2UoUFRSQUNFX0dFVFJFR1MsIHBpZCwgMCwgcmVncykgPCAwKQogCQkJcHJpbnRrKCJGYWlsZWQgdG8gZ2V0IHJlZ2lzdGVycyBmcm9tIHN0dWIsICIKIAkJCSAgICAgICAiZXJybm8gPSAlZFxuIiwgZXJybm8pOwpAQCAtNzcsNyArNzUsNyBAQAogCQkJaW50IGk7CiAKIAkJCXByaW50aygiU3R1YiByZWdpc3RlcnMgLVxuIik7Ci0JCQlmb3IoaSA9IDA7IGkgPCBGUkFNRV9TSVpFOyBpKyspCisJCQlmb3IoaSA9IDA7IGkgPCBIT1NUX0ZSQU1FX1NJWkU7IGkrKykKIAkJCQlwcmludGsoIlx0JWQgLSAlbHhcbiIsIGksIHJlZ3NbaV0pOwogCQl9CiAgICAgICAgICAgICAgICAgcGFuaWMoIiVzIDogZmFpbGVkIHRvIHdhaXQgZm9yIFNJR1VTUjEvU0lHVFJBUCwgIgpAQCAtNTE0LDE2ICs1MTIsNiBAQAogCXNpZ2xvbmdqbXAoKipzd2l0Y2hfYnVmLCAxKTsKIH0KIAotdm9pZCByZW1vdmVfc2lnc3RhY2sodm9pZCkKLXsKLQlzdGFja190IHN0YWNrID0gKChzdGFja190KSB7IC5zc19mbGFncwk9IFNTX0RJU0FCTEUsCi0JCQkJICAgICAuc3Nfc3AJPSBOVUxMLAotCQkJCSAgICAgLnNzX3NpemUJPSAwIH0pOwotCi0JaWYoc2lnYWx0c3RhY2soJnN0YWNrLCBOVUxMKSAhPSAwKQotCQlwYW5pYygiZGlzYWJsaW5nIHNpZ25hbCBzdGFjayBmYWlsZWQsIGVycm5vID0gJWRcbiIsIGVycm5vKTsKLX0KLQogdm9pZCBpbml0aWFsX3RocmVhZF9jYl9za2FzKHZvaWQgKCpwcm9jKSh2b2lkICopLCB2b2lkICphcmcpCiB7CiAJc2lnam1wX2J1ZiBoZXJlOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9wcm9jZXNzX2tlcm4uYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzc19rZXJuLmMKaW5kZXggOWM5OTAyNS4uM2Y3MGEyZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9wcm9jZXNzX2tlcm4uYworKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL3Byb2Nlc3Nfa2Vybi5jCkBAIC0xLDQgKzEsNCBAQAotLyogCisvKgogICogQ29weXJpZ2h0IChDKSAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICAqLwpAQCAtMTMsMTUgKzEzLDEyIEBACiAjaW5jbHVkZSAiYXNtL3VhY2Nlc3MuaCIKICNpbmNsdWRlICJhc20vYXRvbWljLmgiCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCi0jaW5jbHVkZSAidGltZV91c2VyLmgiCi0jaW5jbHVkZSAic2lnbmFsX3VzZXIuaCIKICNpbmNsdWRlICJza2FzLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJ1c2VyX3V0aWwuaCIKICNpbmNsdWRlICJ0bGIuaCIKICNpbmNsdWRlICJrZXJuLmgiCiAjaW5jbHVkZSAibW9kZS5oIgotI2luY2x1ZGUgInByb2NfbW0uaCIKICNpbmNsdWRlICJyZWdpc3RlcnMuaCIKIAogdm9pZCBzd2l0Y2hfdG9fc2thcyh2b2lkICpwcmV2LCB2b2lkICpuZXh0KQpAQCAtMzUsNyArMzIsNyBAQAogCWlmKGN1cnJlbnQtPnBpZCA9PSAwKQogCQlzd2l0Y2hfdGltZXJzKDApOwogCi0Jc3dpdGNoX3RocmVhZHMoJmZyb20tPnRocmVhZC5tb2RlLnNrYXMuc3dpdGNoX2J1ZiwgCisJc3dpdGNoX3RocmVhZHMoJmZyb20tPnRocmVhZC5tb2RlLnNrYXMuc3dpdGNoX2J1ZiwKIAkJICAgICAgIHRvLT50aHJlYWQubW9kZS5za2FzLnN3aXRjaF9idWYpOwogCiAJaWYoY3VycmVudC0+cGlkID09IDApCkBAIC01MSw4ICs0OCw4IEBACiAKIAlmbiA9IGN1cnJlbnQtPnRocmVhZC5yZXF1ZXN0LnUudGhyZWFkLnByb2M7CiAJYXJnID0gY3VycmVudC0+dGhyZWFkLnJlcXVlc3QudS50aHJlYWQuYXJnOwotCWNoYW5nZV9zaWcoU0lHVVNSMSwgMSk7Ci0JdGhyZWFkX3dhaXQoJmN1cnJlbnQtPnRocmVhZC5tb2RlLnNrYXMuc3dpdGNoX2J1ZiwgCisJb3NfdXNyMV9zaWduYWwoMSk7CisJdGhyZWFkX3dhaXQoJmN1cnJlbnQtPnRocmVhZC5tb2RlLnNrYXMuc3dpdGNoX2J1ZiwKIAkJICAgIGN1cnJlbnQtPnRocmVhZC5tb2RlLnNrYXMuZm9ya19idWYpOwogCiAJaWYoY3VycmVudC0+dGhyZWFkLnByZXZfc2NoZWQgIT0gTlVMTCkKQEAgLTgzLDggKzgwLDggQEAKIAogdm9pZCBmb3JrX2hhbmRsZXIoaW50IHNpZykKIHsKLSAgICAgICAgY2hhbmdlX3NpZyhTSUdVU1IxLCAxKTsKLSAJdGhyZWFkX3dhaXQoJmN1cnJlbnQtPnRocmVhZC5tb2RlLnNrYXMuc3dpdGNoX2J1ZiwgCisJb3NfdXNyMV9zaWduYWwoMSk7CisJdGhyZWFkX3dhaXQoJmN1cnJlbnQtPnRocmVhZC5tb2RlLnNrYXMuc3dpdGNoX2J1ZiwKIAkJICAgIGN1cnJlbnQtPnRocmVhZC5tb2RlLnNrYXMuZm9ya19idWYpOwogICAJCiAJZm9yY2VfZmx1c2hfYWxsKCk7CkBAIC05NCwxMyArOTEsMTMgQEAKIAlzY2hlZHVsZV90YWlsKGN1cnJlbnQtPnRocmVhZC5wcmV2X3NjaGVkKTsKIAljdXJyZW50LT50aHJlYWQucHJldl9zY2hlZCA9IE5VTEw7CiAKLQkvKiBIYW5kbGUgYW55IGltbWVkaWF0ZSByZXNjaGVkdWxlcyBvciBzaWduYWxzICovCisvKiBIYW5kbGUgYW55IGltbWVkaWF0ZSByZXNjaGVkdWxlcyBvciBzaWduYWxzICovCiAJaW50ZXJydXB0X2VuZCgpOwogCXVzZXJzcGFjZSgmY3VycmVudC0+dGhyZWFkLnJlZ3MucmVncyk7CiB9CiAKIGludCBjb3B5X3RocmVhZF9za2FzKGludCBuciwgdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncywgdW5zaWduZWQgbG9uZyBzcCwKLQkJICAgICB1bnNpZ25lZCBsb25nIHN0YWNrX3RvcCwgc3RydWN0IHRhc2tfc3RydWN0ICogcCwgCisJCSAgICAgdW5zaWduZWQgbG9uZyBzdGFja190b3AsIHN0cnVjdCB0YXNrX3N0cnVjdCAqIHAsCiAJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAgIAl2b2lkICgqaGFuZGxlcikoaW50KTsKQEAgLTExOSwzMiArMTE2LDE5IEBACiAJCWhhbmRsZXIgPSBuZXdfdGhyZWFkX2hhbmRsZXI7CiAJfQogCi0JbmV3X3RocmVhZChwLT50aHJlYWRfaW5mbywgJnAtPnRocmVhZC5tb2RlLnNrYXMuc3dpdGNoX2J1ZiwKKwluZXdfdGhyZWFkKHRhc2tfc3RhY2tfcGFnZShwKSwgJnAtPnRocmVhZC5tb2RlLnNrYXMuc3dpdGNoX2J1ZiwKIAkJICAgJnAtPnRocmVhZC5tb2RlLnNrYXMuZm9ya19idWYsIGhhbmRsZXIpOwogCXJldHVybigwKTsKIH0KIAotZXh0ZXJuIHZvaWQgbWFwX3N0dWJfcGFnZXMoaW50IGZkLCB1bnNpZ25lZCBsb25nIGNvZGUsCi0JCQkgICB1bnNpZ25lZCBsb25nIGRhdGEsIHVuc2lnbmVkIGxvbmcgc3RhY2spOwotaW50IG5ld19tbShpbnQgZnJvbSwgdW5zaWduZWQgbG9uZyBzdGFjaykKK2ludCBuZXdfbW0odW5zaWduZWQgbG9uZyBzdGFjaykKIHsKLQlzdHJ1Y3QgcHJvY19tbV9vcCBjb3B5OwotCWludCBuLCBmZDsKKwlpbnQgZmQ7CiAKIAlmZCA9IG9zX29wZW5fZmlsZSgiL3Byb2MvbW0iLCBvZl9jbG9leGVjKG9mX3dyaXRlKE9QRU5GTEFHUygpKSksIDApOwogCWlmKGZkIDwgMCkKIAkJcmV0dXJuKGZkKTsKIAotCWlmKGZyb20gIT0gLTEpewotCQljb3B5ID0gKChzdHJ1Y3QgcHJvY19tbV9vcCkgeyAub3AgCT0gTU1fQ09QWV9TRUdNRU5UUywKLQkJCQkJICAgICAgLnUgCT0KLQkJCQkJICAgICAgeyAuY29weV9zZWdtZW50cwk9IGZyb20gfSB9ICk7Ci0JCW4gPSBvc193cml0ZV9maWxlKGZkLCAmY29weSwgc2l6ZW9mKGNvcHkpKTsKLQkJaWYobiAhPSBzaXplb2YoY29weSkpCi0JCQlwcmludGsoIm5ld19tbSA6IC9wcm9jL21tIGNvcHlfc2VnbWVudHMgZmFpbGVkLCAiCi0JCQkgICAgICAgImVyciA9ICVkXG4iLCAtbik7Ci0JfQotCiAJaWYoc2thc19uZWVkc19zdHViKQogCQltYXBfc3R1Yl9wYWdlcyhmZCwgQ09ORklHX1NUVUJfQ09ERSwgQ09ORklHX1NUVUJfREFUQSwgc3RhY2spOwogCkBAIC0xODYsNyArMTcwLDcgQEAKIAogCWluaXRfdGFzay50aHJlYWQucmVxdWVzdC51LnRocmVhZC5wcm9jID0gc3RhcnRfa2VybmVsX3Byb2M7CiAJaW5pdF90YXNrLnRocmVhZC5yZXF1ZXN0LnUudGhyZWFkLmFyZyA9IE5VTEw7Ci0JcmV0dXJuKHN0YXJ0X2lkbGVfdGhyZWFkKGluaXRfdGFzay50aHJlYWRfaW5mbywKKwlyZXR1cm4oc3RhcnRfaWRsZV90aHJlYWQodGFza19zdGFja19wYWdlKCZpbml0X3Rhc2spLAogCQkJCSAmaW5pdF90YXNrLnRocmVhZC5tb2RlLnNrYXMuc3dpdGNoX2J1ZiwKIAkJCQkgJmluaXRfdGFzay50aHJlYWQubW9kZS5za2FzLmZvcmtfYnVmKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL3RyYXBfdXNlci5jIGIvYXJjaC91bS9rZXJuZWwvc2thcy90cmFwX3VzZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk1MGE2Ny4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2tlcm5lbC9za2FzL3RyYXBfdXNlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDAzIEplZmYgRGlrZSAoamRpa2VAYWRkdG9pdC5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSAic2lnbmFsX3VzZXIuaCIKLSNpbmNsdWRlICJ1c2VyX3V0aWwuaCIKLSNpbmNsdWRlICJrZXJuX3V0aWwuaCIKLSNpbmNsdWRlICJ0YXNrLmgiCi0jaW5jbHVkZSAic2lnY29udGV4dC5oIgotI2luY2x1ZGUgInNrYXMuaCIKLSNpbmNsdWRlICJwdHJhY2VfdXNlci5oIgotI2luY2x1ZGUgInN5c2RlcC9wdHJhY2UuaCIKLSNpbmNsdWRlICJzeXNkZXAvcHRyYWNlX3VzZXIuaCIKLQotdm9pZCBzaWdfaGFuZGxlcl9jb21tb25fc2thcyhpbnQgc2lnLCB2b2lkICpzY19wdHIpCi17Ci0Jc3RydWN0IHNpZ2NvbnRleHQgKnNjID0gc2NfcHRyOwotCXN0cnVjdCBza2FzX3JlZ3MgKnI7Ci0Jc3RydWN0IHNpZ25hbF9pbmZvICppbmZvOwotCWludCBzYXZlX2Vycm5vID0gZXJybm87Ci0JaW50IHNhdmVfdXNlcjsKLQotCS8qIFRoaXMgaXMgZG9uZSBiZWNhdXNlIHRvIGFsbG93IFNJR1NFR1YgdG8gYmUgZGVsaXZlcmVkIGluc2lkZSBhIFNFR1YKLQkgKiBoYW5kbGVyLiAgVGhpcyBjYW4gaGFwcGVuIGluIGNvcHlfdXNlciwgYW5kIGlmIFNFR1YgaXMgZGlzYWJsZWQsCi0JICogdGhlIHByb2Nlc3Mgd2lsbCBkaWUuCi0JICogWFhYIEZpZ3VyZSBvdXQgd2h5IHRoaXMgaXMgYmV0dGVyIHRoYW4gU0FfTk9ERUZFUgotCSAqLwotCWlmKHNpZyA9PSBTSUdTRUdWKQotCQljaGFuZ2Vfc2lnKFNJR1NFR1YsIDEpOwotCi0JciA9ICZUQVNLX1JFR1MoZ2V0X2N1cnJlbnQoKSktPnNrYXM7Ci0Jc2F2ZV91c2VyID0gci0+aXNfdXNlcjsKLQlyLT5pc191c2VyID0gMDsKLSAgICAgICAgaWYgKCBzaWcgPT0gU0lHRlBFIHx8IHNpZyA9PSBTSUdTRUdWIHx8Ci0gICAgICAgICAgICAgc2lnID09IFNJR0JVUyB8fCBzaWcgPT0gU0lHSUxMIHx8Ci0gICAgICAgICAgICAgc2lnID09IFNJR1RSQVAgKSB7Ci0gICAgICAgICAgICAgICAgR0VUX0ZBVUxUSU5GT19GUk9NX1NDKHItPmZhdWx0aW5mbywgc2MpOwotICAgICAgICB9Ci0KLQljaGFuZ2Vfc2lnKFNJR1VTUjEsIDEpOwotCWluZm8gPSAmc2lnX2luZm9bc2lnXTsKLQlpZighaW5mby0+aXNfaXJxKSB1bmJsb2NrX3NpZ25hbHMoKTsKLQotCSgqaW5mby0+aGFuZGxlcikoc2lnLCAodW5pb24gdW1sX3B0X3JlZ3MgKikgcik7Ci0KLQllcnJubyA9IHNhdmVfZXJybm87Ci0Jci0+aXNfdXNlciA9IHNhdmVfdXNlcjsKLX0KLQotZXh0ZXJuIGludCBwdHJhY2VfZmF1bHRpbmZvOwotCi12b2lkIHVzZXJfc2lnbmFsKGludCBzaWcsIHVuaW9uIHVtbF9wdF9yZWdzICpyZWdzLCBpbnQgcGlkKQotewotCXN0cnVjdCBzaWduYWxfaW5mbyAqaW5mbzsKLSAgICAgICAgaW50IHNlZ3YgPSAoKHNpZyA9PSBTSUdGUEUpIHx8IChzaWcgPT0gU0lHU0VHVikgfHwgKHNpZyA9PSBTSUdCVVMpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChzaWcgPT0gU0lHSUxMKSB8fCAoc2lnID09IFNJR1RSQVApKTsKLQotCWlmIChzZWd2KQotCQlnZXRfc2thc19mYXVsdGluZm8ocGlkLCAmcmVncy0+c2thcy5mYXVsdGluZm8pOwotCWluZm8gPSAmc2lnX2luZm9bc2lnXTsKLQkoKmluZm8tPmhhbmRsZXIpKHNpZywgcmVncyk7Ci0KLQl1bmJsb2NrX3NpZ25hbHMoKTsKLX0KLQotLyoKLSAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgotICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5Ci0gKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgZmlsZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1maWxlLXN0eWxlOiAibGludXgiCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvdWFjY2Vzcy5jIGIvYXJjaC91bS9rZXJuZWwvc2thcy91YWNjZXNzLmMKaW5kZXggYTVhNDc1Mi4uNTk5MmMzMiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy91YWNjZXNzLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy91YWNjZXNzLmMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlICJhc20vcGd0YWJsZS5oIgogI2luY2x1ZGUgImFzbS91YWNjZXNzLmgiCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCi0jaW5jbHVkZSAidXNlcl91dGlsLmgiCisjaW5jbHVkZSAib3MuaCIKIAogZXh0ZXJuIHZvaWQgKnVtX3ZpcnRfdG9fcGh5cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCSAgICAgcHRlX3QgKnB0ZV9vdXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc3lzY2FsbC5jIGIvYXJjaC91bS9rZXJuZWwvc3lzY2FsbC5jCmluZGV4IDE0MjljMTMuLjE3MzFkOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3N5c2NhbGwuYworKysgYi9hcmNoL3VtL2tlcm5lbC9zeXNjYWxsLmMKQEAgLTI1LDEyICsyNSwxMiBAQAogCXN5c2NhbGxfcmVjb3JkW2luZGV4XS5zeXNjYWxsID0gc3lzY2FsbDsKIAlzeXNjYWxsX3JlY29yZFtpbmRleF0ucGlkID0gY3VycmVudF9waWQoKTsKIAlzeXNjYWxsX3JlY29yZFtpbmRleF0ucmVzdWx0ID0gMHhkZWFkYmVlZjsKLQlzeXNjYWxsX3JlY29yZFtpbmRleF0uc3RhcnQgPSBvc191c2VjcygpOworCXN5c2NhbGxfcmVjb3JkW2luZGV4XS5zdGFydCA9IG9zX25zZWNzKCk7CiAJcmV0dXJuKGluZGV4KTsKIH0KIAogdm9pZCByZWNvcmRfc3lzY2FsbF9lbmQoaW50IGluZGV4LCBsb25nIHJlc3VsdCkKIHsKIAlzeXNjYWxsX3JlY29yZFtpbmRleF0ucmVzdWx0ID0gcmVzdWx0OwotCXN5c2NhbGxfcmVjb3JkW2luZGV4XS5lbmQgPSBvc191c2VjcygpOworCXN5c2NhbGxfcmVjb3JkW2luZGV4XS5lbmQgPSBvc19uc2VjcygpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdGltZS5jIGIvYXJjaC91bS9rZXJuZWwvdGltZS5jCmluZGV4IGM0MGI2MTEuLjhmYTJhZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3RpbWUuYworKysgYi9hcmNoL3VtL2tlcm5lbC90aW1lLmMKQEAgLTE0LDkgKzE0LDkgQEAKICNpbmNsdWRlICJrZXJuX3V0aWwuaCIKICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAicHJvY2Vzcy5oIgotI2luY2x1ZGUgInNpZ25hbF91c2VyLmgiCiAjaW5jbHVkZSAidGltZV91c2VyLmgiCiAjaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJvcy5oIgogCiAvKiBYWFggVGhpcyByZWFsbHkgbmVlZHMgdG8gYmUgZGVjbGFyZWQgYW5kIGluaXRpYWxpemVkIGluIGEga2VybmVsIGZpbGUgc2luY2UKICAqIGl0J3MgaW4gPGxpbnV4L3RpbWUuaD4KQEAgLTk5LDcgKzk5LDggQEAKIAlzZXRfaW50ZXJ2YWwoSVRJTUVSX1JFQUwpOwogfQogCi1leHRlcm4gaW50IGRvX3Bvc2l4X2Nsb2NrX21vbm90b25pY19nZXR0aW1lKHN0cnVjdCB0aW1lc3BlYyAqdHApOworZXh0ZXJuIHZvaWQga3RpbWVfZ2V0X3RzKHN0cnVjdCB0aW1lc3BlYyAqdHMpOworI2RlZmluZSBkb19wb3NpeF9jbG9ja19tb25vdG9uaWNfZ2V0dGltZSh0cykga3RpbWVfZ2V0X3RzKHRzKQogCiB2b2lkIHRpbWVfaW5pdCh2b2lkKQogewpAQCAtMTE0LDggKzExNSw4IEBACiAJd2FsbF90b19tb25vdG9uaWMudHZfbnNlYyA9IC1ub3cudHZfbnNlYzsKIH0KIAotLyogRGVjbGFyZWQgaW4gbGludXgvdGltZS5oLCB3aGljaCBjYW4ndCBiZSBpbmNsdWRlZCBoZXJlICovCi1leHRlcm4gdm9pZCBjbG9ja193YXNfc2V0KHZvaWQpOworLyogRGVmaW5lZCBpbiBsaW51eC9rdGltZXIuaCwgd2hpY2ggY2FuJ3QgYmUgaW5jbHVkZWQgaGVyZSAqLworI2RlZmluZSBjbG9ja193YXNfc2V0KCkJCWRvIHsgfSB3aGlsZSAoMCkKIAogdm9pZCBkb19nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnR2KQogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdGltZV9rZXJuLmMgYi9hcmNoL3VtL2tlcm5lbC90aW1lX2tlcm4uYwppbmRleCAwMjBjYTc5Li4zYzc2MjZjIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC90aW1lX2tlcm4uYworKysgYi9hcmNoL3VtL2tlcm5lbC90aW1lX2tlcm4uYwpAQCAtMSw0ICsxLDQgQEAKLS8qIAorLyoKICAqIENvcHlyaWdodCAoQykgMjAwMCBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCiAgKi8KQEAgLTEzLDEyICsxMywxMiBAQAogI2luY2x1ZGUgImxpbnV4L2ludGVycnVwdC5oIgogI2luY2x1ZGUgImxpbnV4L2luaXQuaCIKICNpbmNsdWRlICJsaW51eC9kZWxheS5oIgorI2luY2x1ZGUgImxpbnV4L2hydGltZXIuaCIKICNpbmNsdWRlICJhc20vaXJxLmgiCiAjaW5jbHVkZSAiYXNtL3BhcmFtLmgiCiAjaW5jbHVkZSAiYXNtL2N1cnJlbnQuaCIKICNpbmNsdWRlICJrZXJuX3V0aWwuaCIKICNpbmNsdWRlICJ1c2VyX3V0aWwuaCIKLSNpbmNsdWRlICJ0aW1lX3VzZXIuaCIKICNpbmNsdWRlICJtb2RlLmgiCiAjaW5jbHVkZSAib3MuaCIKIApAQCAtMzksNyArMzksNyBAQAogaW50IHRpbWVyX2lycV9pbml0ZWQgPSAwOwogCiBzdGF0aWMgaW50IGZpcnN0X3RpY2s7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHByZXZfdXNlY3M7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHByZXZfbnNlY3M7CiAjaWZkZWYgQ09ORklHX1VNTF9SRUFMX1RJTUVfQ0xPQ0sKIHN0YXRpYyBsb25nIGxvbmcgZGVsdGE7ICAgCQkvKiBEZXZpYXRpb24gcGVyIGludGVydmFsICovCiAjZW5kaWYKQEAgLTU4LDIzICs1OCwyMyBAQAogCWlmKGZpcnN0X3RpY2spewogI2lmZGVmIENPTkZJR19VTUxfUkVBTF9USU1FX0NMT0NLCiAJCS8qIFdlJ3ZlIGhhZCAxIHRpY2sgKi8KLQkJdW5zaWduZWQgbG9uZyBsb25nIHVzZWNzID0gb3NfdXNlY3MoKTsKKwkJdW5zaWduZWQgbG9uZyBsb25nIG5zZWNzID0gb3NfbnNlY3MoKTsKIAotCQlkZWx0YSArPSB1c2VjcyAtIHByZXZfdXNlY3M7Ci0JCXByZXZfdXNlY3MgPSB1c2VjczsKKwkJZGVsdGEgKz0gbnNlY3MgLSBwcmV2X25zZWNzOworCQlwcmV2X25zZWNzID0gbnNlY3M7CiAKIAkJLyogUHJvdGVjdCBhZ2FpbnN0IHRoZSBob3N0IGNsb2NrIGJlaW5nIHNldCBiYWNrd2FyZHMgKi8KIAkJaWYoZGVsdGEgPCAwKQogCQkJZGVsdGEgPSAwOwogCi0JCXRpY2tzICs9IChkZWx0YSAqIEhaKSAvIE1JTExJT047Ci0JCWRlbHRhIC09ICh0aWNrcyAqIE1JTExJT04pIC8gSFo7CisJCXRpY2tzICs9IChkZWx0YSAqIEhaKSAvIEJJTExJT047CisJCWRlbHRhIC09ICh0aWNrcyAqIEJJTExJT04pIC8gSFo7CiAjZWxzZQogCQl0aWNrcyA9IDE7CiAjZW5kaWYKIAl9CiAJZWxzZSB7Ci0JCXByZXZfdXNlY3MgPSBvc191c2VjcygpOworCQlwcmV2X25zZWNzID0gb3NfbnNlY3MoKTsKIAkJZmlyc3RfdGljayA9IDE7CiAJfQogCkBAIC04NCw0OSArODQsMTAyIEBACiAJfQogfQogCi12b2lkIGJvb3RfdGltZXJfaGFuZGxlcihpbnQgc2lnKQordm9pZCBkb19ib290X3RpbWVyX2hhbmRsZXIoc3RydWN0IHNpZ2NvbnRleHQgKiBzYykKIHsKIAlzdHJ1Y3QgcHRfcmVncyByZWdzOwogCi0JQ0hPT1NFX01PREUoKHZvaWQpIAotCQkgICAgKFVQVF9TQygmcmVncy5yZWdzKSA9IChzdHJ1Y3Qgc2lnY29udGV4dCAqKSAoJnNpZyArIDEpKSwKKwlDSE9PU0VfTU9ERSgodm9pZCkgKFVQVF9TQygmcmVncy5yZWdzKSA9IHNjKSwKIAkJICAgICh2b2lkKSAocmVncy5yZWdzLnNrYXMuaXNfdXNlciA9IDApKTsKIAlkb190aW1lcigmcmVncyk7CiB9CiAKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodGltZXJfc3BpbmxvY2spOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGxvY2FsX29mZnNldCA9IDA7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIGdldF90aW1lKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIG5zZWNzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGltZXJfc3BpbmxvY2ssIGZsYWdzKTsKKwluc2VjcyA9IG9zX25zZWNzKCk7CisJbnNlY3MgKz0gbG9jYWxfb2Zmc2V0OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpbWVyX3NwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gbnNlY3M7Cit9CisKIGlycXJldHVybl90IHVtX3RpbWVyKGludCBpcnEsIHZvaWQgKmRldiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CisJdW5zaWduZWQgbG9uZyBsb25nIG5zZWNzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlkb190aW1lcihyZWdzKTsKKwogCXdyaXRlX3NlcWxvY2tfaXJxc2F2ZSgmeHRpbWVfbG9jaywgZmxhZ3MpOwotCXRpbWVyKCk7CisJbnNlY3MgPSBnZXRfdGltZSgpICsgbG9jYWxfb2Zmc2V0OworCXh0aW1lLnR2X3NlYyA9IG5zZWNzIC8gTlNFQ19QRVJfU0VDOworCXh0aW1lLnR2X25zZWMgPSBuc2VjcyAtIHh0aW1lLnR2X3NlYyAqIE5TRUNfUEVSX1NFQzsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxcmVzdG9yZSgmeHRpbWVfbG9jaywgZmxhZ3MpOworCiAJcmV0dXJuKElSUV9IQU5ETEVEKTsKIH0KIAogbG9uZyB1bV90aW1lKGludCBfX3VzZXIgKnRsb2MpCiB7Ci0Jc3RydWN0IHRpbWV2YWwgbm93OworCWxvbmcgcmV0ID0gZ2V0X3RpbWUoKSAvIE5TRUNfUEVSX1NFQzsKIAotCWRvX2dldHRpbWVvZmRheSgmbm93KTsKLQlpZiAodGxvYykgewotIAkJaWYgKHB1dF91c2VyKG5vdy50dl9zZWMsIHRsb2MpKQotCQkJbm93LnR2X3NlYyA9IC1FRkFVTFQ7Ci0JfQotCXJldHVybiBub3cudHZfc2VjOworCWlmKCh0bG9jICE9IE5VTEwpICYmIHB1dF91c2VyKHJldCwgdGxvYykpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBkb19nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnR2KQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBuc2VjcyA9IGdldF90aW1lKCk7CisKKwl0di0+dHZfc2VjID0gbnNlY3MgLyBOU0VDX1BFUl9TRUM7CisJLyogQ2FyZWZ1bCBhYm91dCBjYWxjdWxhdGlvbnMgaGVyZSAtIHRoaXMgd2FzIG9yaWdpbmFsbHkgZG9uZSBhcworCSAqIChuc2VjcyAtIHR2LT50dl9zZWMgKiBOU0VDX1BFUl9TRUMpIC8gTlNFQ19QRVJfVVNFQworCSAqIHdoaWNoIGdhdmUgYm9ndXMgKD4gMTAwMDAwMCkgdmFsdWVzLiAgRHVubm8gd2h5LCBzdXNwZWN0IGdjYworCSAqICg0LjAuMCkgbWlzY29tcGlsZWQgaXQsIG9yIHRoZXJlJ3MgYSBzdWJ0bGUgNjQvMzItYml0IGNvbnZlcnNpb24KKwkgKiBwcm9ibGVtIHRoYXQgSSBtaXNzZWQuCisJICovCisJbnNlY3MgLT0gdHYtPnR2X3NlYyAqIE5TRUNfUEVSX1NFQzsKKwl0di0+dHZfdXNlYyA9ICh1bnNpZ25lZCBsb25nKSBuc2VjcyAvIE5TRUNfUEVSX1VTRUM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfdGltZSh1bnNpZ25lZCBsb25nIGxvbmcgbnNlY3MpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIG5vdzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpbWVyX3NwaW5sb2NrLCBmbGFncyk7CisJbm93ID0gb3NfbnNlY3MoKTsKKwlsb2NhbF9vZmZzZXQgPSBuc2VjcyAtIG5vdzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aW1lcl9zcGlubG9jaywgZmxhZ3MpOworCisJY2xvY2tfd2FzX3NldCgpOwogfQogCiBsb25nIHVtX3N0aW1lKGludCBfX3VzZXIgKnRwdHIpCiB7CiAJaW50IHZhbHVlOwotCXN0cnVjdCB0aW1lc3BlYyBuZXc7CiAKIAlpZiAoZ2V0X3VzZXIodmFsdWUsIHRwdHIpKQogICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwotCW5ldy50dl9zZWMgPSB2YWx1ZTsKLQluZXcudHZfbnNlYyA9IDA7Ci0JZG9fc2V0dGltZW9mZGF5KCZuZXcpOworCisJc2V0X3RpbWUoKHVuc2lnbmVkIGxvbmcgbG9uZykgdmFsdWUgKiBOU0VDX1BFUl9TRUMpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkb19zZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWVzcGVjICp0dikKK3sKKwlzZXRfdGltZSgodW5zaWduZWQgbG9uZyBsb25nKSB0di0+dHZfc2VjICogTlNFQ19QRVJfU0VDICsgdHYtPnR2X25zZWMpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzNCwyOSArMTg3LDE1IEBACiB7CiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAlpcnFfZW50ZXIoKTsKLQl1cGRhdGVfcHJvY2Vzc190aW1lcyhDSE9PU0VfTU9ERSh1c2VyX2NvbnRleHQoVVBUX1NQKHJlZ3MpKSwKLQkJCQkJIChyZWdzKS0+c2thcy5pc191c2VyKSk7CisJdXBkYXRlX3Byb2Nlc3NfdGltZXMoQ0hPT1NFX01PREUoCisJICAgICAgICAgICAgICAgICAgICAgKFVQVF9TQyhyZWdzKSAmJiB1c2VyX2NvbnRleHQoVVBUX1NQKHJlZ3MpKSksCisJCQkgICAgIChyZWdzKS0+c2thcy5pc191c2VyKSk7CiAJaXJxX2V4aXQoKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJaWYoY3VycmVudF90aHJlYWQtPmNwdSA9PSAwKQogCQl0aW1lcl9pcnEocmVncyk7CiB9CiAKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodGltZXJfc3BpbmxvY2spOwotCi11bnNpZ25lZCBsb25nIHRpbWVfbG9jayh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdGltZXJfc3BpbmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4oZmxhZ3MpOwotfQotCi12b2lkIHRpbWVfdW5sb2NrKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGltZXJfc3BpbmxvY2ssIGZsYWdzKTsKLX0KLQogaW50IF9faW5pdCB0aW1lcl9pbml0KHZvaWQpCiB7CiAJaW50IGVycjsKQEAgLTE3MSwxNCArMjEwLDMgQEAKIH0KIAogX19pbml0Y2FsbCh0aW1lcl9pbml0KTsKLQotLyoKLSAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgotICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5Ci0gKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgZmlsZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1maWxlLXN0eWxlOiAibGludXgiCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3RyYXBfa2Vybi5jIGIvYXJjaC91bS9rZXJuZWwvdHJhcF9rZXJuLmMKaW5kZXggMGQ0YzEwYS4uZDU2MDQ2YyAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdHJhcF9rZXJuLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvdHJhcF9rZXJuLmMKQEAgLTEsNCArMSw0IEBACi0vKiAKKy8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCkBAIC0yNiw5ICsyNiwxMyBAQAogI2luY2x1ZGUgIm1jb25zb2xlX2tlcm4uaCIKICNpbmNsdWRlICJtZW0uaCIKICNpbmNsdWRlICJtZW1fa2Vybi5oIgorI2luY2x1ZGUgInN5c2RlcC9zaWdjb250ZXh0LmgiCisjaW5jbHVkZSAic3lzZGVwL3B0cmFjZS5oIgorI2luY2x1ZGUgIm9zLmgiCiAjaWZkZWYgQ09ORklHX01PREVfU0tBUwogI2luY2x1ZGUgInNrYXMuaCIKICNlbmRpZgorI2luY2x1ZGUgIm9zLmgiCiAKIC8qIE5vdGUgdGhpcyBpcyBjb25zdHJhaW5lZCB0byByZXR1cm4gMCwgLUVGQVVMVCwgLUVBQ0NFU1MsIC1FTk9NRU0gYnkgc2VndigpLiAqLwogaW50IGhhbmRsZV9wYWdlX2ZhdWx0KHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBpcCwgCkBAIC0xMjUsNiArMTI5LDI1IEBACiAJZ290byBvdXQ7CiB9CiAKK3ZvaWQgc2Vndl9oYW5kbGVyKGludCBzaWcsIHVuaW9uIHVtbF9wdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBmYXVsdGluZm8gKiBmaSA9IFVQVF9GQVVMVElORk8ocmVncyk7CisKKwlpZihVUFRfSVNfVVNFUihyZWdzKSAmJiAhU0VHVl9JU19GSVhBQkxFKGZpKSl7CisJCWJhZF9zZWd2KCpmaSwgVVBUX0lQKHJlZ3MpKTsKKwkJcmV0dXJuOworCX0KKwlzZWd2KCpmaSwgVVBUX0lQKHJlZ3MpLCBVUFRfSVNfVVNFUihyZWdzKSwgcmVncyk7Cit9CisKK3N0cnVjdCBrZXJuX2hhbmRsZXJzIGhhbmRsaW5mb19rZXJuID0geworCS5yZWxheV9zaWduYWwgPSByZWxheV9zaWduYWwsCisJLndpbmNoID0gd2luY2gsCisJLmJ1c19oYW5kbGVyID0gcmVsYXlfc2lnbmFsLAorCS5wYWdlX2ZhdWx0ID0gc2Vndl9oYW5kbGVyLAorCS5zaWdpb19oYW5kbGVyID0gc2lnaW9faGFuZGxlciwKKwkudGltZXJfaGFuZGxlciA9IHRpbWVyX2hhbmRsZXIKK307CiAvKgogICogV2UgZ2l2ZSBhICpjb3B5KiBvZiB0aGUgZmF1bHRpbmZvIGluIHRoZSByZWdzIHRvIHNlZ3YuCiAgKiBUaGlzIG11c3QgYmUgZG9uZSwgc2luY2UgbmVzdGluZyBTRUdWcyBjb3VsZCBvdmVyd3JpdGUKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3RyYXBfdXNlci5jIGIvYXJjaC91bS9rZXJuZWwvdHJhcF91c2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5Y2NkNmIuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9rZXJuZWwvdHJhcF91c2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c2V0am1wLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlICJpbml0LmgiCi0jaW5jbHVkZSAic3lzZGVwL3B0cmFjZS5oIgotI2luY2x1ZGUgInNpZ2NvbnRleHQuaCIKLSNpbmNsdWRlICJzeXNkZXAvc2lnY29udGV4dC5oIgotI2luY2x1ZGUgImlycV91c2VyLmgiCi0jaW5jbHVkZSAic2lnbmFsX3VzZXIuaCIKLSNpbmNsdWRlICJ0aW1lX3VzZXIuaCIKLSNpbmNsdWRlICJ0YXNrLmgiCi0jaW5jbHVkZSAibW9kZS5oIgotI2luY2x1ZGUgImNob29zZS1tb2RlLmgiCi0jaW5jbHVkZSAia2Vybl91dGlsLmgiCi0jaW5jbHVkZSAidXNlcl91dGlsLmgiCi0jaW5jbHVkZSAib3MuaCIKLQotdm9pZCBraWxsX2NoaWxkX2RlYWQoaW50IHBpZCkKLXsKLQlraWxsKHBpZCwgU0lHS0lMTCk7Ci0Ja2lsbChwaWQsIFNJR0NPTlQpOwotCWRvIHsKLQkJaW50IG47Ci0JCUNBVENIX0VJTlRSKG4gPSB3YWl0cGlkKHBpZCwgTlVMTCwgMCkpOwotCQlpZiAobiA+IDApCi0JCQlraWxsKHBpZCwgU0lHQ09OVCk7Ci0JCWVsc2UKLQkJCWJyZWFrOwotCX0gd2hpbGUoMSk7Ci19Ci0KLXZvaWQgc2Vndl9oYW5kbGVyKGludCBzaWcsIHVuaW9uIHVtbF9wdF9yZWdzICpyZWdzKQotewotICAgICAgICBzdHJ1Y3QgZmF1bHRpbmZvICogZmkgPSBVUFRfRkFVTFRJTkZPKHJlZ3MpOwotCi0gICAgICAgIGlmKFVQVF9JU19VU0VSKHJlZ3MpICYmICFTRUdWX0lTX0ZJWEFCTEUoZmkpKXsKLSAgICAgICAgICAgICAgICBiYWRfc2VndigqZmksIFVQVF9JUChyZWdzKSk7Ci0JCXJldHVybjsKLQl9Ci0gICAgICAgIHNlZ3YoKmZpLCBVUFRfSVAocmVncyksIFVQVF9JU19VU0VSKHJlZ3MpLCByZWdzKTsKLX0KLQotdm9pZCB1c3IyX2hhbmRsZXIoaW50IHNpZywgdW5pb24gdW1sX3B0X3JlZ3MgKnJlZ3MpCi17Ci0JQ0hPT1NFX01PREUoc3lzY2FsbF9oYW5kbGVyX3R0KHNpZywgcmVncyksICh2b2lkKSAwKTsKLX0KLQotc3RydWN0IHNpZ25hbF9pbmZvIHNpZ19pbmZvW10gPSB7Ci0JWyBTSUdUUkFQIF0geyAuaGFuZGxlciAJCT0gcmVsYXlfc2lnbmFsLAotCQkgICAgICAuaXNfaXJxIAkJPSAwIH0sCi0JWyBTSUdGUEUgXSB7IC5oYW5kbGVyIAkJPSByZWxheV9zaWduYWwsCi0JCSAgICAgLmlzX2lycSAJCT0gMCB9LAotCVsgU0lHSUxMIF0geyAuaGFuZGxlciAJCT0gcmVsYXlfc2lnbmFsLAotCQkgICAgIC5pc19pcnEgCQk9IDAgfSwKLQlbIFNJR1dJTkNIIF0geyAuaGFuZGxlcgkJPSB3aW5jaCwKLQkJICAgICAgIC5pc19pcnEJCT0gMSB9LAotCVsgU0lHQlVTIF0geyAuaGFuZGxlciAJCT0gYnVzX2hhbmRsZXIsCi0JCSAgICAgLmlzX2lycSAJCT0gMCB9LAotCVsgU0lHU0VHVl0geyAuaGFuZGxlciAJCT0gc2Vndl9oYW5kbGVyLAotCQkgICAgIC5pc19pcnEgCQk9IDAgfSwKLQlbIFNJR0lPIF0geyAuaGFuZGxlciAJCT0gc2lnaW9faGFuZGxlciwKLQkJICAgIC5pc19pcnEgCQk9IDEgfSwKLQlbIFNJR1ZUQUxSTSBdIHsgLmhhbmRsZXIgCT0gdGltZXJfaGFuZGxlciwKLQkJCS5pc19pcnEgCT0gMSB9LAotICAgICAgICBbIFNJR0FMUk0gXSB7IC5oYW5kbGVyICAgICAgICAgID0gdGltZXJfaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAuaXNfaXJxICAgICAgICAgICA9IDEgfSwKLQlbIFNJR1VTUjIgXSB7IC5oYW5kbGVyIAkJPSB1c3IyX2hhbmRsZXIsCi0JCSAgICAgIC5pc19pcnEgCQk9IDAgfSwKLX07Ci0KLXZvaWQgZG9fbG9uZ2ptcCh2b2lkICpiLCBpbnQgdmFsKQotewotCXNpZ2ptcF9idWYgKmJ1ZiA9IGI7Ci0KLQlzaWdsb25nam1wKCpidWYsIHZhbCk7Ci19Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC90dC9leGVjX2tlcm4uYyBiL2FyY2gvdW0va2VybmVsL3R0L2V4ZWNfa2Vybi5jCmluZGV4IDA2NWI1MDQuLjVjMWU0Y2MgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3R0L2V4ZWNfa2Vybi5jCisrKyBiL2FyY2gvdW0va2VybmVsL3R0L2V4ZWNfa2Vybi5jCkBAIC0xMyw4ICsxMyw2IEBACiAjaW5jbHVkZSAidXNlcl91dGlsLmgiCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAiaXJxX3VzZXIuaCIKLSNpbmNsdWRlICJ0aW1lX3VzZXIuaCIKLSNpbmNsdWRlICJzaWduYWxfdXNlci5oIgogI2luY2x1ZGUgIm1lbV91c2VyLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJ0bGIuaCIKQEAgLTQwLDcgKzM4LDcgQEAKIAkJZG9fZXhpdChTSUdLSUxMKTsKIAl9CiAJCQotCW5ld19waWQgPSBzdGFydF9mb3JrX3RyYW1wKGN1cnJlbnQtPnRocmVhZF9pbmZvLCBzdGFjaywgMCwgZXhlY190cmFtcCk7CisJbmV3X3BpZCA9IHN0YXJ0X2ZvcmtfdHJhbXAodGFza19zdGFja19wYWdlKGN1cnJlbnQpLCBzdGFjaywgMCwgZXhlY190cmFtcCk7CiAJaWYobmV3X3BpZCA8IDApewogCQlwcmludGsoS0VSTl9FUlIgCiAJCSAgICAgICAiZmx1c2hfdGhyZWFkIDogbmV3IHRocmVhZCBmYWlsZWQsIGVycm5vID0gJWRcbiIsCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC90dC9nZGIuYyBiL2FyY2gvdW0va2VybmVsL3R0L2dkYi5jCmluZGV4IDM3ZTIyZDcuLjc4NmU0ZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3R0L2dkYi5jCisrKyBiL2FyY2gvdW0va2VybmVsL3R0L2dkYi5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSAidXNlcl91dGlsLmgiCiAjaW5jbHVkZSAidHQuaCIKICNpbmNsdWRlICJzeXNkZXAvdGhyZWFkLmgiCisjaW5jbHVkZSAib3MuaCIKIAogZXh0ZXJuIGludCBkZWJ1Z2dlcl9waWQ7CiBleHRlcm4gaW50IGRlYnVnZ2VyX2ZkOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdHQvaW5jbHVkZS9kZWJ1Zy5oIGIvYXJjaC91bS9rZXJuZWwvdHQvaW5jbHVkZS9kZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mzg0MzU0Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0va2VybmVsL3R0L2luY2x1ZGUvZGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qIAotICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyICBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pIGFuZAotICogTGFycyBCcmlua2hvZmYuCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1VNTF9UVF9ERUJVR19ICi0jZGVmaW5lIF9fVU1MX1RUX0RFQlVHX0gKLQotZXh0ZXJuIGludCBkZWJ1Z2dlcl9wcm94eShpbnQgc3RhdHVzLCBwaWRfdCBwaWQpOwotZXh0ZXJuIHZvaWQgY2hpbGRfcHJveHkocGlkX3QgcGlkLCBpbnQgc3RhdHVzKTsKLWV4dGVybiB2b2lkIGluaXRfcHJveHkgKHBpZF90IHBpZCwgaW50IHdhaXRpbmcsIGludCBzdGF0dXMpOwotZXh0ZXJuIGludCBzdGFydF9kZWJ1Z2dlcihjaGFyICpwcm9nLCBpbnQgc3RhcnR1cCwgaW50IHN0b3AsIGludCAqZGVidWdnZXJfZmQpOwotZXh0ZXJuIHZvaWQgZmFrZV9jaGlsZF9leGl0KHZvaWQpOwotZXh0ZXJuIGludCBnZGJfY29uZmlnKGNoYXIgKnN0cik7Ci1leHRlcm4gaW50IGdkYl9yZW1vdmUoaW50IHVudXNlZCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdHQvaW5jbHVkZS9tbXUtdHQuaCBiL2FyY2gvdW0va2VybmVsL3R0L2luY2x1ZGUvbW11LXR0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NDA1MTAuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9rZXJuZWwvdHQvaW5jbHVkZS9tbXUtdHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19UVF9NTVVfSAotI2RlZmluZSBfX1RUX01NVV9ICi0KLXN0cnVjdCBtbXVfY29udGV4dF90dCB7Ci19OwotCi0jZW5kaWYKLQotLyoKLSAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgotICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5Ci0gKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgZmlsZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1maWxlLXN0eWxlOiAibGludXgiCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3R0L2luY2x1ZGUvdHQuaCBiL2FyY2gvdW0va2VybmVsL3R0L2luY2x1ZGUvdHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY2N2I2Ny4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2tlcm5lbC90dC9pbmNsdWRlL3R0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1RUX0hfXwotI2RlZmluZSBfX1RUX0hfXwotCi0jaW5jbHVkZSAic3lzZGVwL3B0cmFjZS5oIgotCi1leHRlcm4gaW50IGdkYl9waWQ7Ci1leHRlcm4gaW50IGRlYnVnOwotZXh0ZXJuIGludCBkZWJ1Z19zdG9wOwotZXh0ZXJuIGludCBkZWJ1Z190cmFjZTsKLQotZXh0ZXJuIGludCBob25leXBvdDsKLQotZXh0ZXJuIGludCBmb3JrX3RyYW1wKHZvaWQgKnNpZ19zdGFjayk7Ci1leHRlcm4gaW50IGRvX3Byb2Nfb3Aodm9pZCAqdCwgaW50IHByb2NfaWQpOwotZXh0ZXJuIGludCB0cmFjZXIoaW50ICgqaW5pdF9wcm9jKSh2b2lkICopLCB2b2lkICpzcCk7Ci1leHRlcm4gdm9pZCBhdHRhY2hfcHJvY2VzcyhpbnQgcGlkKTsKLWV4dGVybiB2b2lkIHRyYWNlcl9wYW5pYyhjaGFyICpmb3JtYXQsIC4uLik7Ci1leHRlcm4gdm9pZCBzZXRfaW5pdF9waWQoaW50IHBpZCk7Ci1leHRlcm4gaW50IHNldF91c2VyX21vZGUodm9pZCAqdGFzayk7Ci1leHRlcm4gdm9pZCBzZXRfdHJhY2luZyh2b2lkICp0LCBpbnQgdHJhY2luZyk7Ci1leHRlcm4gaW50IGlzX3RyYWNpbmcodm9pZCAqdGFzayk7Ci1leHRlcm4gdm9pZCBzeXNjYWxsX2hhbmRsZXIoaW50IHNpZywgdW5pb24gdW1sX3B0X3JlZ3MgKnJlZ3MpOwotZXh0ZXJuIHZvaWQgZXhpdF9rZXJuZWwoaW50IHBpZCwgdm9pZCAqdGFzayk7Ci1leHRlcm4gdm9pZCBkb19zeXNjYWxsKHZvaWQgKnRhc2ssIGludCBwaWQsIGludCBsb2NhbF91c2luZ19zeXNlbXUpOwotZXh0ZXJuIHZvaWQgZG9fc2lndHJhcCh2b2lkICp0YXNrKTsKLWV4dGVybiBpbnQgaXNfdmFsaWRfcGlkKGludCBwaWQpOwotZXh0ZXJuIHZvaWQgcmVtYXBfZGF0YSh2b2lkICpzZWdtZW50X3N0YXJ0LCB2b2lkICpzZWdtZW50X2VuZCwgaW50IHcpOwotZXh0ZXJuIGxvbmcgZXhlY3V0ZV9zeXNjYWxsX3R0KHZvaWQgKnIpOwotCi0jZW5kaWYKLQotLyoKLSAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgotICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5Ci0gKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgZmlsZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1maWxlLXN0eWxlOiAibGludXgiCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3R0L2luY2x1ZGUvdWFjY2Vzcy10dC5oIGIvYXJjaC91bS9rZXJuZWwvdHQvaW5jbHVkZS91YWNjZXNzLXR0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YmZlOWMuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9rZXJuZWwvdHQvaW5jbHVkZS91YWNjZXNzLXR0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwMyBKZWZmIERpa2UgKGpkaWtlQGFkZHRvaXQuY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19UVF9VQUNDRVNTX0gKLSNkZWZpbmUgX19UVF9VQUNDRVNTX0gKLQotI2luY2x1ZGUgImxpbnV4L3N0cmluZy5oIgotI2luY2x1ZGUgImxpbnV4L3NjaGVkLmgiCi0jaW5jbHVkZSAiYXNtL3Byb2Nlc3Nvci5oIgotI2luY2x1ZGUgImFzbS9lcnJuby5oIgotI2luY2x1ZGUgImFzbS9jdXJyZW50LmgiCi0jaW5jbHVkZSAiYXNtL2Eub3V0LmgiCi0jaW5jbHVkZSAidW1sX3VhY2Nlc3MuaCIKLQotI2RlZmluZSBBQk9WRV9LTUVNICgxNiAqIDEwMjQgKiAxMDI0KQotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBlbmRfdm07Ci1leHRlcm4gdW5zaWduZWQgbG9uZyB1bWxfcGh5c21lbTsKLQotI2RlZmluZSBpc19zdGFjayhhZGRyLCBzaXplKSBcCi0JKCgodW5zaWduZWQgbG9uZykgKGFkZHIpIDwgU1RBQ0tfVE9QKSAmJiBcCi0JICgodW5zaWduZWQgbG9uZykgKGFkZHIpID49IFNUQUNLX1RPUCAtIEFCT1ZFX0tNRU0pICYmIFwKLQkgKCgodW5zaWduZWQgbG9uZykgKGFkZHIpICsgKHNpemUpKSA8PSBTVEFDS19UT1ApKQotCi0jZGVmaW5lIGFjY2Vzc19va190dCh0eXBlLCBhZGRyLCBzaXplKSBcCi0JKGlzX3N0YWNrKGFkZHIsIHNpemUpKQotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfZmF1bHRfYWRkcih2b2lkKTsKLQotZXh0ZXJuIGludCBfX2RvX2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbiwKLQkJCSAgICAgICB2b2lkICoqZmF1bHRfYWRkciwgdm9pZCAqKmZhdWx0X2NhdGNoZXIpOwotZXh0ZXJuIGludCBfX2RvX3N0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgbiwKLQkJCQkgIHZvaWQgKipmYXVsdF9hZGRyLCB2b2lkICoqZmF1bHRfY2F0Y2hlcik7Ci1leHRlcm4gaW50IF9fZG9fY2xlYXJfdXNlcih2b2lkICptZW0sIHNpemVfdCBsZW4sIHZvaWQgKipmYXVsdF9hZGRyLAotCQkJICAgdm9pZCAqKmZhdWx0X2NhdGNoZXIpOwotZXh0ZXJuIGludCBfX2RvX3N0cm5sZW5fdXNlcihjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGxvbmcgbiwKLQkJCSAgICAgdm9pZCAqKmZhdWx0X2FkZHIsIHZvaWQgKipmYXVsdF9jYXRjaGVyKTsKLQotZXh0ZXJuIGludCBjb3B5X2Zyb21fdXNlcl90dCh2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIGludCBuKTsKLWV4dGVybiBpbnQgY29weV90b191c2VyX3R0KHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgaW50IG4pOwotZXh0ZXJuIGludCBzdHJuY3B5X2Zyb21fdXNlcl90dChjaGFyICpkc3QsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGludCBjb3VudCk7Ci1leHRlcm4gaW50IF9fY2xlYXJfdXNlcl90dCh2b2lkIF9fdXNlciAqbWVtLCBpbnQgbGVuKTsKLWV4dGVybiBpbnQgY2xlYXJfdXNlcl90dCh2b2lkIF9fdXNlciAqbWVtLCBpbnQgbGVuKTsKLWV4dGVybiBpbnQgc3Rybmxlbl91c2VyX3R0KGNvbnN0IHZvaWQgX191c2VyICpzdHIsIGludCBsZW4pOwotCi0jZW5kaWYKLQotLyoKLSAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgotICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5Ci0gKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgZmlsZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1maWxlLXN0eWxlOiAibGludXgiCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3R0L3Byb2Nlc3Nfa2Vybi5jIGIvYXJjaC91bS9rZXJuZWwvdHQvcHJvY2Vzc19rZXJuLmMKaW5kZXggY2ZhYTM3My4uMjk1YzFhYyAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdHQvcHJvY2Vzc19rZXJuLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvdHQvcHJvY2Vzc19rZXJuLmMKQEAgLTEzLDEzICsxMywxMSBAQAogI2luY2x1ZGUgImFzbS9wdHJhY2UuaCIKICNpbmNsdWRlICJhc20vdGxiZmx1c2guaCIKICNpbmNsdWRlICJpcnFfdXNlci5oIgotI2luY2x1ZGUgInNpZ25hbF91c2VyLmgiCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAidXNlcl91dGlsLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJrZXJuLmgiCiAjaW5jbHVkZSAic2lnY29udGV4dC5oIgotI2luY2x1ZGUgInRpbWVfdXNlci5oIgogI2luY2x1ZGUgIm1lbV91c2VyLmgiCiAjaW5jbHVkZSAidGxiLmgiCiAjaW5jbHVkZSAibW9kZS5oIgpAQCAtMzcsNyArMzUsNyBAQAogCWZyb20gPSBwcmV2OwogCXRvID0gbmV4dDsKIAotCWNwdSA9IGZyb20tPnRocmVhZF9pbmZvLT5jcHU7CisJY3B1ID0gdGFza190aHJlYWRfaW5mbyhmcm9tKS0+Y3B1OwogCWlmKGNwdSA9PSAwKQogCQlmb3J3YXJkX2ludGVycnVwdHModG8tPnRocmVhZC5tb2RlLnR0LmV4dGVybl9waWQpOwogI2lmZGVmIENPTkZJR19TTVAKQEAgLTI1NCw3ICsyNTIsNyBAQAogCiAJY2xvbmVfZmxhZ3MgJj0gQ0xPTkVfVk07CiAJcC0+dGhyZWFkLnRlbXBfc3RhY2sgPSBzdGFjazsKLQluZXdfcGlkID0gc3RhcnRfZm9ya190cmFtcChwLT50aHJlYWRfaW5mbywgc3RhY2ssIGNsb25lX2ZsYWdzLCB0cmFtcCk7CisJbmV3X3BpZCA9IHN0YXJ0X2ZvcmtfdHJhbXAodGFza19zdGFja19wYWdlKHApLCBzdGFjaywgY2xvbmVfZmxhZ3MsIHRyYW1wKTsKIAlpZihuZXdfcGlkIDwgMCl7CiAJCXByaW50ayhLRVJOX0VSUiAiY29weV90aHJlYWQgOiBjbG9uZSBmYWlsZWQgLSBlcnJubyA9ICVkXG4iLCAKIAkJICAgICAgIC1uZXdfcGlkKTsKQEAgLTM0NCw3ICszNDIsNyBAQAogCQlwaWQgPSB0aHJlYWQtPnJlcXVlc3QudS5leGVjLnBpZDsKIAkJZG9fZXhlYyh0aHJlYWQtPm1vZGUudHQuZXh0ZXJuX3BpZCwgcGlkKTsKIAkJdGhyZWFkLT5tb2RlLnR0LmV4dGVybl9waWQgPSBwaWQ7Ci0JCWNwdV90YXNrc1t0YXNrLT50aHJlYWRfaW5mby0+Y3B1XS5waWQgPSBwaWQ7CisJCWNwdV90YXNrc1t0YXNrX3RocmVhZF9pbmZvKHRhc2spLT5jcHVdLnBpZCA9IHBpZDsKIAkJYnJlYWs7CiAJY2FzZSBPUF9GT1JLOgogCQlhdHRhY2hfcHJvY2Vzcyh0aHJlYWQtPnJlcXVlc3QudS5mb3JrLnBpZCk7CkBAIC00MjYsNyArNDI0LDcgQEAKIAlpbnQgcGFnZXM7CiAKIAlwYWdlcyA9ICgxIDw8IENPTkZJR19LRVJORUxfU1RBQ0tfT1JERVIpOwotCXNwID0gKHZvaWQgKikgKCh1bnNpZ25lZCBsb25nKSBpbml0X3Rhc2sudGhyZWFkX2luZm8pICsKKwlzcCA9IHRhc2tfc3RhY2tfcGFnZSgmaW5pdF90YXNrKSArCiAJCXBhZ2VzICogUEFHRV9TSVpFIC0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOwogCXJldHVybih0cmFjZXIoc3RhcnRfa2VybmVsX3Byb2MsIHNwKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC90dC9wdHByb3h5L3B0cmFjZS5jIGIvYXJjaC91bS9rZXJuZWwvdHQvcHRwcm94eS9wdHJhY2UuYwppbmRleCA1MjhhNWZjLi4wMzc3NDQyIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC90dC9wdHByb3h5L3B0cmFjZS5jCisrKyBiL2FyY2gvdW0va2VybmVsL3R0L3B0cHJveHkvcHRyYWNlLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlICJrZXJuX3V0aWwuaCIKICNpbmNsdWRlICJwdHJhY2VfdXNlci5oIgogI2luY2x1ZGUgInR0LmgiCisjaW5jbHVkZSAib3MuaCIKIAogbG9uZyBwcm94eV9wdHJhY2Uoc3RydWN0IGRlYnVnZ2VyICpkZWJ1Z2dlciwgaW50IGFyZzEsIHBpZF90IGFyZzIsCiAJCSAgbG9uZyBhcmczLCBsb25nIGFyZzQsIHBpZF90IGNoaWxkLCBpbnQgKnJldCkKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3R0L3B0cHJveHkvc3lzZGVwLmMgYi9hcmNoL3VtL2tlcm5lbC90dC9wdHByb3h5L3N5c2RlcC5jCmluZGV4IGE1ZjBlMDEuLjk5ZjE3ODMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3R0L3B0cHJveHkvc3lzZGVwLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvdHQvcHRwcm94eS9zeXNkZXAuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgInB0cmFjZV91c2VyLmgiCiAjaW5jbHVkZSAidXNlcl91dGlsLmgiCiAjaW5jbHVkZSAidXNlci5oIgorI2luY2x1ZGUgIm9zLmgiCiAKIGludCBnZXRfc3lzY2FsbChwaWRfdCBwaWQsIGxvbmcgKmFyZzEsIGxvbmcgKmFyZzIsIGxvbmcgKmFyZzMsIGxvbmcgKmFyZzQsIAogCQlsb25nICphcmc1KQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdHQvdHJhY2VyLmMgYi9hcmNoL3VtL2tlcm5lbC90dC90cmFjZXIuYwppbmRleCBkMTFlNzM5Li43MWRhYWUyIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC90dC90cmFjZXIuYworKysgYi9hcmNoL3VtL2tlcm5lbC90dC90cmFjZXIuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgInNpZ2NvbnRleHQuaCIKICNpbmNsdWRlICJzeXNkZXAvc2lnY29udGV4dC5oIgogI2luY2x1ZGUgIm9zLmgiCi0jaW5jbHVkZSAic2lnbmFsX3VzZXIuaCIKICNpbmNsdWRlICJ1c2VyX3V0aWwuaCIKICNpbmNsdWRlICJtZW1fdXNlci5oIgogI2luY2x1ZGUgInByb2Nlc3MuaCIKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3R0L3RyYXBfdXNlci5jIGIvYXJjaC91bS9rZXJuZWwvdHQvdHJhcF91c2VyLmMKaW5kZXggZmMxMDg2MS4uYjVkOWQ2NCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdHQvdHJhcF91c2VyLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvdHQvdHJhcF91c2VyLmMKQEAgLTEsNCArMSw0IEBACi0vKiAKKy8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCkBAIC04LDE4ICs4LDE4IEBACiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSAic3lzZGVwL3B0cmFjZS5oIgogI2luY2x1ZGUgInN5c2RlcC9zaWdjb250ZXh0LmgiCi0jaW5jbHVkZSAic2lnbmFsX3VzZXIuaCIKICNpbmNsdWRlICJ1c2VyX3V0aWwuaCIKICNpbmNsdWRlICJrZXJuX3V0aWwuaCIKICNpbmNsdWRlICJ0YXNrLmgiCiAjaW5jbHVkZSAidHQuaCIKKyNpbmNsdWRlICJvcy5oIgogCiB2b2lkIHNpZ19oYW5kbGVyX2NvbW1vbl90dChpbnQgc2lnLCB2b2lkICpzY19wdHIpCiB7CiAJc3RydWN0IHNpZ2NvbnRleHQgKnNjID0gc2NfcHRyOwogCXN0cnVjdCB0dF9yZWdzIHNhdmVfcmVncywgKnI7Ci0Jc3RydWN0IHNpZ25hbF9pbmZvICppbmZvOwotCWludCBzYXZlX2Vycm5vID0gZXJybm8sIGlzX3VzZXI7CisJaW50IHNhdmVfZXJybm8gPSBlcnJubywgaXNfdXNlciA9IDA7CisJdm9pZCAoKmhhbmRsZXIpKGludCwgdW5pb24gdW1sX3B0X3JlZ3MgKik7CiAKIAkvKiBUaGlzIGlzIGRvbmUgYmVjYXVzZSB0byBhbGxvdyBTSUdTRUdWIHRvIGJlIGRlbGl2ZXJlZCBpbnNpZGUgYSBTRUdWCiAJICogaGFuZGxlci4gIFRoaXMgY2FuIGhhcHBlbiBpbiBjb3B5X3VzZXIsIGFuZCBpZiBTRUdWIGlzIGRpc2FibGVkLApAQCAtMzUsMTUgKzM1LDIwIEBACiAgICAgICAgICAgICAgICAgR0VUX0ZBVUxUSU5GT19GUk9NX1NDKHItPmZhdWx0aW5mbywgc2MpOwogICAgICAgICB9CiAJc2F2ZV9yZWdzID0gKnI7Ci0JaXNfdXNlciA9IHVzZXJfY29udGV4dChTQ19TUChzYykpOworCWlmIChzYykKKwkJaXNfdXNlciA9IHVzZXJfY29udGV4dChTQ19TUChzYykpOwogCXItPnNjID0gc2M7CiAJaWYoc2lnICE9IFNJR1VTUjIpIAogCQlyLT5zeXNjYWxsID0gLTE7CiAKLQlpbmZvID0gJnNpZ19pbmZvW3NpZ107Ci0JaWYoIWluZm8tPmlzX2lycSkgdW5ibG9ja19zaWduYWxzKCk7CisJaGFuZGxlciA9IHNpZ19pbmZvW3NpZ107CiAKLQkoKmluZm8tPmhhbmRsZXIpKHNpZywgKHVuaW9uIHVtbF9wdF9yZWdzICopIHIpOworCS8qIHVuYmxvY2sgU0lHQUxSTSwgU0lHVlRBTFJNLCBTSUdJTyBpZiBzaWcgaXNuJ3QgSVJRIHNpZ25hbCAqLworCWlmIChzaWcgIT0gU0lHSU8gJiYgc2lnICE9IFNJR1dJTkNIICYmCisJICAgIHNpZyAhPSBTSUdWVEFMUk0gJiYgc2lnICE9IFNJR0FMUk0pCisJCXVuYmxvY2tfc2lnbmFscygpOworCisJaGFuZGxlcihzaWcsICh1bmlvbiB1bWxfcHRfcmVncyAqKSByKTsKIAogCWlmKGlzX3VzZXIpewogCQlpbnRlcnJ1cHRfZW5kKCk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC91bV9hcmNoLmMgYi9hcmNoL3VtL2tlcm5lbC91bV9hcmNoLmMKaW5kZXggMjY2MjZiMmIuLmUyZDNjYTQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3VtX2FyY2guYworKysgYi9hcmNoL3VtL2tlcm5lbC91bV9hcmNoLmMKQEAgLTEsNCArMSw0IEBACi0vKiAKKy8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCkBAIC0yNDMsMTAgKzI0Myw2IEBACiAJcmV0dXJuKDApOwogfQogCi0jZWxzZQotCi0jZXJyb3IgRWl0aGVyIENPTkZJR19NT0RFX1RUIG9yIENPTkZJR19NT0RFX1NLQVMgbXVzdCBiZSBlbmFibGVkCi0KICNlbmRpZgogI2VuZGlmCiAjZW5kaWYKQEAgLTM2Myw2ICszNTksMTEgQEAKIAl1bWxfc3RhcnQgPSBDSE9PU0VfTU9ERV9QUk9DKHNldF90YXNrX3NpemVzX3R0LCBzZXRfdGFza19zaXplc19za2FzLCAwLAogCQkJCSAgICAgJmhvc3RfdGFza19zaXplLCAmdGFza19zaXplKTsKIAorCS8qCisgCSAqIFNldHRpbmcgdXAgaGFuZGxlcnMgdG8gJ3NpZ19pbmZvJyBzdHJ1Y3QKKyAJICovCisJb3NfZmlsbF9oYW5kbGluZm8oaGFuZGxpbmZvX2tlcm4pOworCiAJYnJrX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIHNicmsoMCk7CiAJQ0hPT1NFX01PREVfUFJPQyhiZWZvcmVfbWVtX3R0LCBiZWZvcmVfbWVtX3NrYXMsIGJya19zdGFydCk7CiAJLyogSW5jcmVhc2UgcGh5c2ljYWwgbWVtb3J5IHNpemUgZm9yIGV4ZWMtc2hpZWxkIHVzZXJzCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC91c2VyX3V0aWwuYyBiL2FyY2gvdW0va2VybmVsL3VzZXJfdXRpbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzIzMTE2Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0va2VybmVsL3VzZXJfdXRpbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qIAotICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgImFzbS90eXBlcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8d2FpdC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c2NoZWQuaD4KLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAidXNlcl91dGlsLmgiCi0jaW5jbHVkZSAia2Vybl91dGlsLmgiCi0jaW5jbHVkZSAidXNlci5oIgotI2luY2x1ZGUgIm1lbV91c2VyLmgiCi0jaW5jbHVkZSAiaW5pdC5oIgotI2luY2x1ZGUgInB0cmFjZV91c2VyLmgiCi0jaW5jbHVkZSAidW1sLWNvbmZpZy5oIgotCi12b2lkIHN0b3Aodm9pZCkKLXsKLQl3aGlsZSgxKSBzbGVlcCgxMDAwMDAwKTsKLX0KLQotdm9pZCBzdGFja19wcm90ZWN0aW9ucyh1bnNpZ25lZCBsb25nIGFkZHJlc3MpCi17Ci0JaW50IHByb3QgPSBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFIHwgUFJPVF9FWEVDOwotCi0gICAgICAgIGlmKG1wcm90ZWN0KCh2b2lkICopIGFkZHJlc3MsIHBhZ2Vfc2l6ZSgpLCBwcm90KSA8IDApCi0JCXBhbmljKCJwcm90ZWN0aW5nIHN0YWNrIGZhaWxlZCwgZXJybm8gPSAlZCIsIGVycm5vKTsKLX0KLQotdm9pZCB0YXNrX3Byb3RlY3Rpb25zKHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKLXsKLQl1bnNpZ25lZCBsb25nIGd1YXJkID0gYWRkcmVzcyArIHBhZ2Vfc2l6ZSgpOwotCXVuc2lnbmVkIGxvbmcgc3RhY2sgPSBndWFyZCArIHBhZ2Vfc2l6ZSgpOwotCWludCBwcm90ID0gMCwgcGFnZXM7Ci0KLSNpZmRlZiBub3RkZWYKLQlpZihtcHJvdGVjdCgodm9pZCAqKSBzdGFjaywgcGFnZV9zaXplKCksIHByb3QpIDwgMCkKLQkJcGFuaWMoInByb3RlY3RpbmcgZ3VhcmQgcGFnZSBmYWlsZWQsIGVycm5vID0gJWQiLCBlcnJubyk7Ci0jZW5kaWYKLQlwYWdlcyA9ICgxIDw8IFVNTF9DT05GSUdfS0VSTkVMX1NUQUNLX09SREVSKSAtIDI7Ci0JcHJvdCA9IFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUM7Ci0JaWYobXByb3RlY3QoKHZvaWQgKikgc3RhY2ssIHBhZ2VzICogcGFnZV9zaXplKCksIHByb3QpIDwgMCkKLQkJcGFuaWMoInByb3RlY3Rpbmcgc3RhY2sgZmFpbGVkLCBlcnJubyA9ICVkIiwgZXJybm8pOwotfQotCi1pbnQgd2FpdF9mb3Jfc3RvcChpbnQgcGlkLCBpbnQgc2lnLCBpbnQgY29udF90eXBlLCB2b2lkICpyZWxheSkKLXsKLQlzaWdzZXRfdCAqcmVsYXlfc2lnbmFscyA9IHJlbGF5OwotCWludCBzdGF0dXMsIHJldDsKLQotCXdoaWxlKDEpewotCQlDQVRDSF9FSU5UUihyZXQgPSB3YWl0cGlkKHBpZCwgJnN0YXR1cywgV1VOVFJBQ0VEKSk7Ci0JCWlmKChyZXQgPCAwKSB8fAotCQkgICAhV0lGU1RPUFBFRChzdGF0dXMpIHx8IChXU1RPUFNJRyhzdGF0dXMpICE9IHNpZykpewotCQkJaWYocmV0IDwgMCl7Ci0JCQkJcHJpbnRrKCJ3YWl0IGZhaWxlZCwgZXJybm8gPSAlZFxuIiwKLQkJCQkgICAgICAgZXJybm8pOwotCQkJfQotCQkJZWxzZSBpZihXSUZFWElURUQoc3RhdHVzKSkgCi0JCQkJcHJpbnRrKCJwcm9jZXNzICVkIGV4aXRlZCB3aXRoIHN0YXR1cyAlZFxuIiwKLQkJCQkgICAgICAgcGlkLCBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKLQkJCWVsc2UgaWYoV0lGU0lHTkFMRUQoc3RhdHVzKSkKLQkJCQlwcmludGsoInByb2Nlc3MgJWQgZXhpdGVkIHdpdGggc2lnbmFsICVkXG4iLAotCQkJCSAgICAgICBwaWQsIFdURVJNU0lHKHN0YXR1cykpOwotCQkJZWxzZSBpZigoV1NUT1BTSUcoc3RhdHVzKSA9PSBTSUdWVEFMUk0pIHx8Ci0JCQkJKFdTVE9QU0lHKHN0YXR1cykgPT0gU0lHQUxSTSkgfHwKLQkJCQkoV1NUT1BTSUcoc3RhdHVzKSA9PSBTSUdJTykgfHwKLQkJCQkoV1NUT1BTSUcoc3RhdHVzKSA9PSBTSUdQUk9GKSB8fAotCQkJCShXU1RPUFNJRyhzdGF0dXMpID09IFNJR0NITEQpIHx8Ci0JCQkJKFdTVE9QU0lHKHN0YXR1cykgPT0gU0lHV0lOQ0gpIHx8Ci0JCQkJKFdTVE9QU0lHKHN0YXR1cykgPT0gU0lHSU5UKSl7Ci0JCQkJcHRyYWNlKGNvbnRfdHlwZSwgcGlkLCAwLCBXU1RPUFNJRyhzdGF0dXMpKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UgaWYoKHJlbGF5X3NpZ25hbHMgIT0gTlVMTCkgJiYKLQkJCQlzaWdpc21lbWJlcihyZWxheV9zaWduYWxzLCBXU1RPUFNJRyhzdGF0dXMpKSl7Ci0JCQkJcHRyYWNlKGNvbnRfdHlwZSwgcGlkLCAwLCBXU1RPUFNJRyhzdGF0dXMpKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UgcHJpbnRrKCJwcm9jZXNzICVkIHN0b3BwZWQgd2l0aCBzaWduYWwgJWRcbiIsCi0JCQkJICAgIHBpZCwgV1NUT1BTSUcoc3RhdHVzKSk7Ci0JCQlwYW5pYygid2FpdF9mb3Jfc3RvcCBmYWlsZWQgdG8gd2FpdCBmb3IgJWQgdG8gc3RvcCAiCi0JCQkgICAgICAid2l0aCAlZFxuIiwgcGlkLCBzaWcpOwotCQl9Ci0JCXJldHVybihzdGF0dXMpOwotCX0KLX0KLQotaW50IHJhdyhpbnQgZmQpCi17Ci0Jc3RydWN0IHRlcm1pb3MgdHQ7Ci0JaW50IGVycjsKLQotCUNBVENIX0VJTlRSKGVyciA9IHRjZ2V0YXR0cihmZCwgJnR0KSk7Ci0JaWYoZXJyIDwgMCkKLQkJcmV0dXJuIC1lcnJubzsKLQotCWNmbWFrZXJhdygmdHQpOwotCi0gCUNBVENIX0VJTlRSKGVyciA9IHRjc2V0YXR0cihmZCwgVENTQURSQUlOLCAmdHQpKTsKLQlpZihlcnIgPCAwKQotCQlyZXR1cm4gLWVycm5vOwotCi0JLyogWFhYIHRjc2V0YXR0ciBjb3VsZCBoYXZlIGFwcGxpZWQgb25seSBzb21lIGNoYW5nZXMKLQkgKiAoYW5kIGNmbWFrZXJhdygpIGlzIGEgc2V0IG9mIGNoYW5nZXMpICovCi0JcmV0dXJuKDApOwotfQotCi12b2lkIHNldHVwX21hY2hpbmVuYW1lKGNoYXIgKm1hY2hpbmVfb3V0KQotewotCXN0cnVjdCB1dHNuYW1lIGhvc3Q7Ci0KLQl1bmFtZSgmaG9zdCk7Ci0jaWYgZGVmaW5lZChVTUxfQ09ORklHX1VNTF9YODYpICYmICFkZWZpbmVkKFVNTF9DT05GSUdfNjRCSVQpCi0JaWYgKCFzdHJjbXAoaG9zdC5tYWNoaW5lLCAieDg2XzY0IikpIHsKLQkJc3RyY3B5KG1hY2hpbmVfb3V0LCAiaTY4NiIpOwotCQlyZXR1cm47Ci0JfQotI2VuZGlmCi0Jc3RyY3B5KG1hY2hpbmVfb3V0LCBob3N0Lm1hY2hpbmUpOwotfQotCi1jaGFyIGhvc3RfaW5mb1soX1VUU05BTUVfTEVOR1RIICsgMSkgKiA0ICsgX1VUU05BTUVfTk9ERU5BTUVfTEVOR1RIICsgMV07Ci0KLXZvaWQgc2V0dXBfaG9zdGluZm8odm9pZCkKLXsKLQlzdHJ1Y3QgdXRzbmFtZSBob3N0OwotCi0JdW5hbWUoJmhvc3QpOwotCXNwcmludGYoaG9zdF9pbmZvLCAiJXMgJXMgJXMgJXMgJXMiLCBob3N0LnN5c25hbWUsIGhvc3Qubm9kZW5hbWUsCi0JCWhvc3QucmVsZWFzZSwgaG9zdC52ZXJzaW9uLCBob3N0Lm1hY2hpbmUpOwotfQotCi1pbnQgc2V0am1wX3dyYXBwZXIodm9pZCAoKnByb2MpKHZvaWQgKiwgdm9pZCAqKSwgLi4uKQotewotICAgICAgICB2YV9saXN0IGFyZ3M7Ci0Jc2lnam1wX2J1ZiBidWY7Ci0JaW50IG47Ci0KLQluID0gc2lnc2V0am1wKGJ1ZiwgMSk7Ci0JaWYobiA9PSAwKXsKLQkJdmFfc3RhcnQoYXJncywgcHJvYyk7Ci0JCSgqcHJvYykoJmJ1ZiwgJmFyZ3MpOwotCX0KLQl2YV9lbmQoYXJncyk7Ci0JcmV0dXJuKG4pOwotfQotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9NYWtlZmlsZSBiL2FyY2gvdW0vb3MtTGludXgvTWFrZWZpbGUKaW5kZXggMTFlMzBiMTMuLjA4YTRlNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvTWFrZWZpbGUKKysrIGIvYXJjaC91bS9vcy1MaW51eC9NYWtlZmlsZQpAQCAtNCwxMSArNCwxMyBAQAogIwogCiBvYmoteSA9IGFpby5vIGVsZl9hdXgubyBmaWxlLm8gaGVscGVyLm8gbWFpbi5vIG1lbS5vIHByb2Nlc3MubyBzaWduYWwubyBcCi0Jc3RhcnRfdXAubyB0aW1lLm8gdHQubyB0dHkubyB1YWNjZXNzLm8gdW1pZC5vIHVzZXJfc3ltcy5vIGRyaXZlcnMvIFwKLQlzeXMtJChTVUJBUkNIKS8KKwlzdGFydF91cC5vIHRpbWUubyB0cmFwLm8gdHQubyB0dHkubyB1YWNjZXNzLm8gdW1pZC5vIHVzZXJfc3ltcy5vIFwKKwl1dGlsLm8gZHJpdmVycy8gc3lzLSQoU1VCQVJDSCkvCisKK29iai0kKENPTkZJR19NT0RFX1NLQVMpICs9IHNrYXMvCiAKIFVTRVJfT0JKUyA6PSBhaW8ubyBlbGZfYXV4Lm8gZmlsZS5vIGhlbHBlci5vIG1haW4ubyBtZW0ubyBwcm9jZXNzLm8gc2lnbmFsLm8gXAotCXN0YXJ0X3VwLm8gdGltZS5vIHR0Lm8gdHR5Lm8gdWFjY2Vzcy5vIHVtaWQubworCXN0YXJ0X3VwLm8gdGltZS5vIHRyYXAubyB0dC5vIHR0eS5vIHVhY2Nlc3MubyB1bWlkLm8gdXRpbC5vCiAKIGVsZl9hdXgubzogJChBUkNIX0RJUikva2VybmVsLW9mZnNldHMuaAogQ0ZMQUdTX2VsZl9hdXgubyArPSAtSSQob2JqdHJlZSkvYXJjaC91bQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9oZWxwZXIuYyBiL2FyY2gvdW0vb3MtTGludXgvaGVscGVyLmMKaW5kZXggMzZjYzg0Ny4uNjQ5MGE0ZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9oZWxwZXIuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2hlbHBlci5jCkBAIC02MCw3ICs2MCw3IEBACiAKIAlpZigoc3RhY2tfb3V0ICE9IE5VTEwpICYmICgqc3RhY2tfb3V0ICE9IDApKQogCQlzdGFjayA9ICpzdGFja19vdXQ7Ci0JZWxzZSBzdGFjayA9IGFsbG9jX3N0YWNrKDAsIHVtX2luX2ludGVycnVwdCgpKTsKKwllbHNlIHN0YWNrID0gYWxsb2Nfc3RhY2soMCwgX19jYW50X3NsZWVwKCkpOwogCWlmKHN0YWNrID09IDApCiAJCXJldHVybigtRU5PTUVNKTsKIApAQCAtMTI0LDcgKzEyNCw3IEBACiAJdW5zaWduZWQgbG9uZyBzdGFjaywgc3A7CiAJaW50IHBpZCwgc3RhdHVzLCBlcnI7CiAKLQlzdGFjayA9IGFsbG9jX3N0YWNrKHN0YWNrX29yZGVyLCB1bV9pbl9pbnRlcnJ1cHQoKSk7CisJc3RhY2sgPSBhbGxvY19zdGFjayhzdGFja19vcmRlciwgX19jYW50X3NsZWVwKCkpOwogCWlmKHN0YWNrID09IDApIHJldHVybigtRU5PTUVNKTsKIAogCXNwID0gc3RhY2sgKyAocGFnZV9zaXplKCkgPDwgc3RhY2tfb3JkZXIpIC0gc2l6ZW9mKHZvaWQgKik7CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L21haW4uYyBiL2FyY2gvdW0vb3MtTGludXgvbWFpbi5jCmluZGV4IDIzZGEyN2QuLjI4NzhlODkgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvbWFpbi5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvbWFpbi5jCkBAIC0xNiw4ICsxNiw2IEBACiAjaW5jbHVkZSAidXNlcl91dGlsLmgiCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAibWVtX3VzZXIuaCIKLSNpbmNsdWRlICJzaWduYWxfdXNlci5oIgotI2luY2x1ZGUgInRpbWVfdXNlci5oIgogI2luY2x1ZGUgImlycV91c2VyLmgiCiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgImluaXQuaCIKQEAgLTgzLDIwICs4MSw4IEBACiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKQogewogCWNoYXIgKipuZXdfYXJndjsKLQlzaWdzZXRfdCBtYXNrOwogCWludCByZXQsIGksIGVycjsKIAotCS8qIEVuYWJsZSBhbGwgc2lnbmFscyBleGNlcHQgU0lHSU8gLSBpbiBzb21lIGVudmlyb25tZW50cywgd2UgY2FuCi0JICogZW50ZXIgd2l0aCBzb21lIHNpZ25hbHMgYmxvY2tlZAotCSAqLwotCi0Jc2lnZW1wdHlzZXQoJm1hc2spOwotCXNpZ2FkZHNldCgmbWFzaywgU0lHSU8pOwotCWlmKHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmbWFzaywgTlVMTCkgPCAwKXsKLQkJcGVycm9yKCJzaWdwcm9jbWFzayIpOwotCQlleGl0KDEpOwotCX0KLQogI2lmZGVmIFVNTF9DT05GSUdfQ01ETElORV9PTl9IT1NUCiAJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aHJlYWQgY29tbWFuZCBsaW5lcyAqLwogCWlmKGFyZ2MgPCAyIHx8IHN0cmxlbihhcmd2WzFdKSA8IFRIUkVBRF9OQU1FX0xFTiAtIDEpewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9wcm9jZXNzLmMgYi9hcmNoL3VtL29zLUxpbnV4L3Byb2Nlc3MuYwppbmRleCBkOWM1MjM4Li43ZjVlMmRhIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3Byb2Nlc3MuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3Byb2Nlc3MuYwpAQCAtMTUsMTAgKzE1LDEwIEBACiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAidXNlcl91dGlsLmgiCi0jaW5jbHVkZSAic2lnbmFsX3VzZXIuaCIKICNpbmNsdWRlICJwcm9jZXNzLmgiCiAjaW5jbHVkZSAiaXJxX3VzZXIuaCIKICNpbmNsdWRlICJrZXJuX3V0aWwuaCIKKyNpbmNsdWRlICJsb25nam1wLmgiCiAKICNkZWZpbmUgQVJCSVRSQVJZX0FERFIgLTEKICNkZWZpbmUgRkFJTFVSRV9QSUQgICAgLTEKQEAgLTIwNiwyNCArMjA2LDEzIEBACiAKIGludCBydW5fa2VybmVsX3RocmVhZChpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqYXJnLCB2b2lkICoqam1wX3B0cikKIHsKLSAgICAgICBzaWdqbXBfYnVmIGJ1ZjsKLSAgICAgICBpbnQgbjsKKwlzaWdqbXBfYnVmIGJ1ZjsKKwlpbnQgbiwgZW5hYmxlOwogCi0gICAgICAgKmptcF9wdHIgPSAmYnVmOwotICAgICAgIG4gPSBzaWdzZXRqbXAoYnVmLCAxKTsKLSAgICAgICBpZihuICE9IDApCi0gICAgICAgICAgICAgICByZXR1cm4obik7Ci0gICAgICAgKCpmbikoYXJnKTsKLSAgICAgICByZXR1cm4oMCk7CisJKmptcF9wdHIgPSAmYnVmOworCW4gPSBVTUxfU0lHU0VUSk1QKCZidWYsIGVuYWJsZSk7CisJaWYobiAhPSAwKQorCQlyZXR1cm4obik7CisJKCpmbikoYXJnKTsKKwlyZXR1cm4oMCk7CiB9Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3NpZ25hbC5jIGIvYXJjaC91bS9vcy1MaW51eC9zaWduYWwuYwppbmRleCBjN2JmZDVlLi5mMTFiMzEyIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3NpZ25hbC5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvc2lnbmFsLmMKQEAgLTQsMjcgKzQsNzQgQEAKICAqLwogCiAjaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSAidGltZV91c2VyLmgiCi0jaW5jbHVkZSAibW9kZS5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgInVzZXJfdXRpbC5oIgorI2luY2x1ZGUgInVzZXIuaCIKKyNpbmNsdWRlICJzaWduYWxfa2Vybi5oIgorI2luY2x1ZGUgInN5c2RlcC9zaWdjb250ZXh0LmgiCiAjaW5jbHVkZSAic3lzZGVwL3NpZ25hbC5oIgorI2luY2x1ZGUgInNpZ2NvbnRleHQuaCIKKyNpbmNsdWRlICJtb2RlLmgiCisjaW5jbHVkZSAib3MuaCIKKworLyogVGhlc2UgYXJlIHRoZSBhc3luY2hyb25vdXMgc2lnbmFscy4gIFNJR1ZUQUxSTSBhbmQgU0lHQVJMTSBhcmUgaGFuZGxlZAorICogdG9nZXRoZXIgdW5kZXIgU0lHVlRBTFJNX0JJVC4gIFNJR1BST0YgaXMgZXhjbHVkZWQgYmVjYXVzZSB3ZSB3YW50IHRvCisgKiBiZSBhYmxlIHRvIHByb2ZpbGUgYWxsIG9mIFVNTCwgbm90IGp1c3QgdGhlIG5vbi1jcml0aWNhbCBzZWN0aW9ucy4gIElmCisgKiBwcm9maWxpbmcgaXMgbm90IHRocmVhZC1zYWZlLCB0aGVuIHRoYXQgaXMgbm90IG15IHByb2JsZW0uICBXZSBjYW4gZGlzYWJsZQorICogcHJvZmlsaW5nIHdoZW4gU01QIGlzIGVuYWJsZWQgaW4gdGhhdCBjYXNlLgorICovCisjZGVmaW5lIFNJR0lPX0JJVCAwCisjZGVmaW5lIFNJR0lPX01BU0sgKDEgPDwgU0lHSU9fQklUKQorCisjZGVmaW5lIFNJR1ZUQUxSTV9CSVQgMQorI2RlZmluZSBTSUdWVEFMUk1fTUFTSyAoMSA8PCBTSUdWVEFMUk1fQklUKQorCisjZGVmaW5lIFNJR0FMUk1fQklUIDIKKyNkZWZpbmUgU0lHQUxSTV9NQVNLICgxIDw8IFNJR0FMUk1fQklUKQorCitzdGF0aWMgaW50IHNpZ25hbHNfZW5hYmxlZCA9IDE7CitzdGF0aWMgaW50IHBlbmRpbmcgPSAwOwogCiB2b2lkIHNpZ19oYW5kbGVyKEFSQ0hfU0lHSERMUl9QQVJBTSkKIHsKIAlzdHJ1Y3Qgc2lnY29udGV4dCAqc2M7CisJaW50IGVuYWJsZWQ7CisKKwkvKiBNdXN0IGJlIHRoZSBmaXJzdCB0aGluZyB0aGF0IHRoaXMgaGFuZGxlciBkb2VzIC0geDg2XzY0IHN0b3JlcworCSAqIHRoZSBzaWdjb250ZXh0IGluICVyZHgsIGFuZCB3ZSBuZWVkIHRvIHNhdmUgaXQgYmVmb3JlIGl0IGhhcyBhCisJICogY2hhbmNlIHRvIGdldCB0cmFzaGVkLgorCSAqLwogCiAJQVJDSF9HRVRfU0lHQ09OVEVYVChzYywgc2lnKTsKKworCWVuYWJsZWQgPSBzaWduYWxzX2VuYWJsZWQ7CisJaWYoIWVuYWJsZWQgJiYgKHNpZyA9PSBTSUdJTykpeworCQlwZW5kaW5nIHw9IFNJR0lPX01BU0s7CisJCXJldHVybjsKKwl9CisKKwlibG9ja19zaWduYWxzKCk7CisKIAlDSE9PU0VfTU9ERV9QUk9DKHNpZ19oYW5kbGVyX2NvbW1vbl90dCwgc2lnX2hhbmRsZXJfY29tbW9uX3NrYXMsCiAJCQkgc2lnLCBzYyk7CisKKwlzZXRfc2lnbmFscyhlbmFibGVkKTsKIH0KIAogZXh0ZXJuIGludCB0aW1lcl9pcnFfaW5pdGVkOwogCi12b2lkIGFsYXJtX2hhbmRsZXIoQVJDSF9TSUdIRExSX1BBUkFNKQorc3RhdGljIHZvaWQgcmVhbF9hbGFybV9oYW5kbGVyKGludCBzaWcsIHN0cnVjdCBzaWdjb250ZXh0ICpzYykKIHsKLQlzdHJ1Y3Qgc2lnY29udGV4dCAqc2M7Ci0KLQlBUkNIX0dFVF9TSUdDT05URVhUKHNjLCBzaWcpOwotCWlmKCF0aW1lcl9pcnFfaW5pdGVkKSByZXR1cm47CisJaWYoIXRpbWVyX2lycV9pbml0ZWQpeworCQlzaWduYWxzX2VuYWJsZWQgPSAxOworCQlyZXR1cm47CisJfQogCiAJaWYoc2lnID09IFNJR0FMUk0pCiAJCXN3aXRjaF90aW1lcnMoMCk7CkBAIC0zNCwxNSArODEsMTgwIEBACiAKIAlpZihzaWcgPT0gU0lHQUxSTSkKIAkJc3dpdGNoX3RpbWVycygxKTsKKwogfQogCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwordm9pZCBhbGFybV9oYW5kbGVyKEFSQ0hfU0lHSERMUl9QQVJBTSkKK3sKKwlzdHJ1Y3Qgc2lnY29udGV4dCAqc2M7CisJaW50IGVuYWJsZWQ7CisKKwlBUkNIX0dFVF9TSUdDT05URVhUKHNjLCBzaWcpOworCisJZW5hYmxlZCA9IHNpZ25hbHNfZW5hYmxlZDsKKwlpZighc2lnbmFsc19lbmFibGVkKXsKKwkJaWYoc2lnID09IFNJR1ZUQUxSTSkKKwkJCXBlbmRpbmcgfD0gU0lHVlRBTFJNX01BU0s7CisJCWVsc2UgcGVuZGluZyB8PSBTSUdBTFJNX01BU0s7CisKKwkJcmV0dXJuOworCX0KKworCWJsb2NrX3NpZ25hbHMoKTsKKworCXJlYWxfYWxhcm1faGFuZGxlcihzaWcsIHNjKTsKKwlzZXRfc2lnbmFscyhlbmFibGVkKTsKK30KKworZXh0ZXJuIHZvaWQgZG9fYm9vdF90aW1lcl9oYW5kbGVyKHN0cnVjdCBzaWdjb250ZXh0ICogc2MpOworCit2b2lkIGJvb3RfdGltZXJfaGFuZGxlcihBUkNIX1NJR0hETFJfUEFSQU0pCit7CisJc3RydWN0IHNpZ2NvbnRleHQgKnNjOworCWludCBlbmFibGVkOworCisJQVJDSF9HRVRfU0lHQ09OVEVYVChzYywgc2lnKTsKKworCWVuYWJsZWQgPSBzaWduYWxzX2VuYWJsZWQ7CisJaWYoIWVuYWJsZWQpeworCQlpZihzaWcgPT0gU0lHVlRBTFJNKQorCQkJcGVuZGluZyB8PSBTSUdWVEFMUk1fTUFTSzsKKwkJZWxzZSBwZW5kaW5nIHw9IFNJR0FMUk1fTUFTSzsKKwkJcmV0dXJuOworCX0KKworCWJsb2NrX3NpZ25hbHMoKTsKKworCWRvX2Jvb3RfdGltZXJfaGFuZGxlcihzYyk7CisJc2V0X3NpZ25hbHMoZW5hYmxlZCk7Cit9CisKK3ZvaWQgc2V0X3NpZ3N0YWNrKHZvaWQgKnNpZ19zdGFjaywgaW50IHNpemUpCit7CisJc3RhY2tfdCBzdGFjayA9ICgoc3RhY2tfdCkgeyAuc3NfZmxhZ3MJPSAwLAorCQkJCSAgICAgLnNzX3NwCT0gKF9fcHRyX3QpIHNpZ19zdGFjaywKKwkJCQkgICAgIC5zc19zaXplIAk9IHNpemUgLSBzaXplb2Yodm9pZCAqKSB9KTsKKworCWlmKHNpZ2FsdHN0YWNrKCZzdGFjaywgTlVMTCkgIT0gMCkKKwkJcGFuaWMoImVuYWJsaW5nIHNpZ25hbCBzdGFjayBmYWlsZWQsIGVycm5vID0gJWRcbiIsIGVycm5vKTsKK30KKwordm9pZCByZW1vdmVfc2lnc3RhY2sodm9pZCkKK3sKKwlzdGFja190IHN0YWNrID0gKChzdGFja190KSB7IC5zc19mbGFncwk9IFNTX0RJU0FCTEUsCisJCQkJICAgICAuc3Nfc3AJPSBOVUxMLAorCQkJCSAgICAgLnNzX3NpemUJPSAwIH0pOworCisJaWYoc2lnYWx0c3RhY2soJnN0YWNrLCBOVUxMKSAhPSAwKQorCQlwYW5pYygiZGlzYWJsaW5nIHNpZ25hbCBzdGFjayBmYWlsZWQsIGVycm5vID0gJWRcbiIsIGVycm5vKTsKK30KKwordm9pZCBzZXRfaGFuZGxlcihpbnQgc2lnLCB2b2lkICgqaGFuZGxlcikoaW50KSwgaW50IGZsYWdzLCAuLi4pCit7CisJc3RydWN0IHNpZ2FjdGlvbiBhY3Rpb247CisJdmFfbGlzdCBhcDsKKwlzaWdzZXRfdCBzaWdfbWFzazsKKwlpbnQgbWFzazsKKworCXZhX3N0YXJ0KGFwLCBmbGFncyk7CisJYWN0aW9uLnNhX2hhbmRsZXIgPSBoYW5kbGVyOworCXNpZ2VtcHR5c2V0KCZhY3Rpb24uc2FfbWFzayk7CisJd2hpbGUoKG1hc2sgPSB2YV9hcmcoYXAsIGludCkpICE9IC0xKXsKKwkJc2lnYWRkc2V0KCZhY3Rpb24uc2FfbWFzaywgbWFzayk7CisJfQorCXZhX2VuZChhcCk7CisJYWN0aW9uLnNhX2ZsYWdzID0gZmxhZ3M7CisJYWN0aW9uLnNhX3Jlc3RvcmVyID0gTlVMTDsKKwlpZihzaWdhY3Rpb24oc2lnLCAmYWN0aW9uLCBOVUxMKSA8IDApCisJCXBhbmljKCJzaWdhY3Rpb24gZmFpbGVkIC0gZXJybm8gPSAlZFxuIiwgZXJybm8pOworCisJc2lnZW1wdHlzZXQoJnNpZ19tYXNrKTsKKwlzaWdhZGRzZXQoJnNpZ19tYXNrLCBzaWcpOworCWlmKHNpZ3Byb2NtYXNrKFNJR19VTkJMT0NLLCAmc2lnX21hc2ssIE5VTEwpIDwgMCkKKwkJcGFuaWMoInNpZ3Byb2NtYXNrIGZhaWxlZCAtIGVycm5vID0gJWRcbiIsIGVycm5vKTsKK30KKworaW50IGNoYW5nZV9zaWcoaW50IHNpZ25hbCwgaW50IG9uKQoreworCXNpZ3NldF90IHNpZ3NldCwgb2xkOworCisJc2lnZW1wdHlzZXQoJnNpZ3NldCk7CisJc2lnYWRkc2V0KCZzaWdzZXQsIHNpZ25hbCk7CisJc2lncHJvY21hc2sob24gPyBTSUdfVU5CTE9DSyA6IFNJR19CTE9DSywgJnNpZ3NldCwgJm9sZCk7CisJcmV0dXJuKCFzaWdpc21lbWJlcigmb2xkLCBzaWduYWwpKTsKK30KKwordm9pZCBibG9ja19zaWduYWxzKHZvaWQpCit7CisJc2lnbmFsc19lbmFibGVkID0gMDsKK30KKwordm9pZCB1bmJsb2NrX3NpZ25hbHModm9pZCkKK3sKKwlpbnQgc2F2ZV9wZW5kaW5nOworCisJaWYoc2lnbmFsc19lbmFibGVkID09IDEpCisJCXJldHVybjsKKworCS8qIFdlIGxvb3AgYmVjYXVzZSB0aGUgSVJRIGhhbmRsZXIgcmV0dXJucyB3aXRoIGludGVycnVwdHMgb2ZmLiAgU28sCisJICogaW50ZXJydXB0cyBtYXkgaGF2ZSBhcnJpdmVkIGFuZCB3ZSBuZWVkIHRvIHJlLWVuYWJsZSB0aGVtIGFuZAorCSAqIHJlY2hlY2sgcGVuZGluZy4KKwkgKi8KKwl3aGlsZSgxKXsKKwkJLyogU2F2ZSBhbmQgcmVzZXQgc2F2ZV9wZW5kaW5nIGFmdGVyIGVuYWJsaW5nIHNpZ25hbHMuICBUaGlzCisJCSAqIHdheSwgcGVuZGluZyB3b24ndCBiZSBjaGFuZ2VkIHdoaWxlIHdlJ3JlIHJlYWRpbmcgaXQuCisJCSAqLworCQlzaWduYWxzX2VuYWJsZWQgPSAxOworCisJCXNhdmVfcGVuZGluZyA9IHBlbmRpbmc7CisJCWlmKHNhdmVfcGVuZGluZyA9PSAwKQorCQkJcmV0dXJuOworCisJCXBlbmRpbmcgPSAwOworCisJCS8qIFdlIGhhdmUgcGVuZGluZyBpbnRlcnJ1cHRzLCBzbyBkaXNhYmxlIHNpZ25hbHMsIGFzIHRoZQorCQkgKiBoYW5kbGVycyBleHBlY3QgdGhlbSBvZmYgd2hlbiB0aGV5IGFyZSBjYWxsZWQuICBUaGV5IHdpbGwKKwkJICogYmUgZW5hYmxlZCBhZ2FpbiBhYm92ZS4KKwkJICovCisKKwkJc2lnbmFsc19lbmFibGVkID0gMDsKKworCQkvKiBEZWFsIHdpdGggU0lHSU8gZmlyc3QgYmVjYXVzZSB0aGUgYWxhcm0gaGFuZGxlciBtaWdodAorCQkgKiBzY2hlZHVsZSwgbGVhdmluZyB0aGUgcGVuZGluZyBTSUdJTyBzdHJhbmRlZCB1bnRpbCB3ZSBjb21lCisJCSAqIGJhY2sgaGVyZS4KKwkJICovCisJCWlmKHNhdmVfcGVuZGluZyAmIFNJR0lPX01BU0spCisJCQlDSE9PU0VfTU9ERV9QUk9DKHNpZ19oYW5kbGVyX2NvbW1vbl90dCwKKwkJCQkJIHNpZ19oYW5kbGVyX2NvbW1vbl9za2FzLCBTSUdJTywgTlVMTCk7CisKKwkJaWYoc2F2ZV9wZW5kaW5nICYgU0lHQUxSTV9NQVNLKQorCQkJcmVhbF9hbGFybV9oYW5kbGVyKFNJR0FMUk0sIE5VTEwpOworCisJCWlmKHNhdmVfcGVuZGluZyAmIFNJR1ZUQUxSTV9NQVNLKQorCQkJcmVhbF9hbGFybV9oYW5kbGVyKFNJR1ZUQUxSTSwgTlVMTCk7CisJfQorfQorCitpbnQgZ2V0X3NpZ25hbHModm9pZCkKK3sKKwlyZXR1cm4gc2lnbmFsc19lbmFibGVkOworfQorCitpbnQgc2V0X3NpZ25hbHMoaW50IGVuYWJsZSkKK3sKKwlpbnQgcmV0OworCWlmKHNpZ25hbHNfZW5hYmxlZCA9PSBlbmFibGUpCisJCXJldHVybiBlbmFibGU7CisKKwlyZXQgPSBzaWduYWxzX2VuYWJsZWQ7CisJaWYoZW5hYmxlKQorCQl1bmJsb2NrX3NpZ25hbHMoKTsKKwllbHNlIGJsb2NrX3NpZ25hbHMoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgb3NfdXNyMV9zaWduYWwoaW50IG9uKQoreworCWNoYW5nZV9zaWcoU0lHVVNSMSwgb24pOworfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9za2FzL01ha2VmaWxlIGIvYXJjaC91bS9vcy1MaW51eC9za2FzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZDhkNGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL29zLUxpbnV4L3NrYXMvTWFrZWZpbGUKQEAgLTAsMCArMSwxMCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA0IEplZmYgRGlrZSAoamRpa2VAYWRkdG9pdC5jb20pCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyMKKworb2JqLXkgOj0gbWVtLm8gcHJvY2Vzcy5vIHRyYXAubworCitVU0VSX09CSlMgOj0gbWVtLm8gcHJvY2Vzcy5vIHRyYXAubworCitpbmNsdWRlIGFyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS5ydWxlcwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9za2FzL21lbS5jIGIvYXJjaC91bS9vcy1MaW51eC9za2FzL21lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OTBlOTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL29zLUxpbnV4L3NrYXMvbWVtLmMKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlICJtZW1fdXNlci5oIgorI2luY2x1ZGUgIm1lbS5oIgorI2luY2x1ZGUgInNrYXMuaCIKKyNpbmNsdWRlICJ1c2VyLmgiCisjaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlICJwcm9jX21tLmgiCisjaW5jbHVkZSAicHRyYWNlX3VzZXIuaCIKKyNpbmNsdWRlICJ1c2VyX3V0aWwuaCIKKyNpbmNsdWRlICJrZXJuX3V0aWwuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisjaW5jbHVkZSAicmVnaXN0ZXJzLmgiCisjaW5jbHVkZSAidW1sLWNvbmZpZy5oIgorI2luY2x1ZGUgInN5c2RlcC9wdHJhY2UuaCIKKyNpbmNsdWRlICJzeXNkZXAvc3R1Yi5oIgorCitleHRlcm4gdW5zaWduZWQgbG9uZyBiYXRjaF9zeXNjYWxsX3N0dWIsIF9fc3lzY2FsbF9zdHViX3N0YXJ0OworCitleHRlcm4gdm9pZCB3YWl0X3N0dWJfZG9uZShpbnQgcGlkLCBpbnQgc2lnLCBjaGFyICogZm5hbWUpOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgKmNoZWNrX2luaXRfc3RhY2soc3RydWN0IG1tX2lkICogbW1faWRwLAorCQkJCQkgICAgICB1bnNpZ25lZCBsb25nICpzdGFjaykKK3sKKwlpZihzdGFjayA9PSBOVUxMKSB7CisJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKikgbW1faWRwLT5zdGFjayArIDI7CisJCSpzdGFjayA9IDA7CisJfQorCXJldHVybiBzdGFjazsKK30KKworZXh0ZXJuIGludCBwcm9jX21tOworCitpbnQgc2luZ2xlX2NvdW50ID0gMDsKK2ludCBtdWx0aV9jb3VudCA9IDA7CitpbnQgbXVsdGlfb3BfY291bnQgPSAwOworCitzdGF0aWMgaW5saW5lIGxvbmcgZG9fc3lzY2FsbF9zdHViKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCwgdm9pZCAqKmFkZHIpCit7CisJdW5zaWduZWQgbG9uZyByZWdzW01BWF9SRUdfTlJdOworCWludCBuOworCWxvbmcgcmV0LCBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyAqIGRhdGE7CisJdW5zaWduZWQgbG9uZyAqIHN5c2NhbGw7CisJaW50IHBpZCA9IG1tX2lkcC0+dS5waWQ7CisKKwlpZihwcm9jX21tKQorI3dhcm5pbmcgTmVlZCB0byBsb29rIHVwIHVzZXJzcGFjZV9waWQgYnkgY3B1CisJCXBpZCA9IHVzZXJzcGFjZV9waWRbMF07CisKKwltdWx0aV9jb3VudCsrOworCisJZ2V0X3NhZmVfcmVnaXN0ZXJzKHJlZ3MpOworCXJlZ3NbUkVHU19JUF9JTkRFWF0gPSBVTUxfQ09ORklHX1NUVUJfQ09ERSArCisJCSgodW5zaWduZWQgbG9uZykgJmJhdGNoX3N5c2NhbGxfc3R1YiAtCisJCSAodW5zaWduZWQgbG9uZykgJl9fc3lzY2FsbF9zdHViX3N0YXJ0KTsKKworCW4gPSBwdHJhY2Vfc2V0cmVncyhwaWQsIHJlZ3MpOworCWlmKG4gPCAwKQorCQlwYW5pYygiZG9fc3lzY2FsbF9zdHViIDogUFRSQUNFX1NFVFJFR1MgZmFpbGVkLCBlcnJubyA9ICVkXG4iLAorCQkgICAgICBuKTsKKworCXdhaXRfc3R1Yl9kb25lKHBpZCwgMCwgImRvX3N5c2NhbGxfc3R1YiIpOworCisJLyogV2hlbiB0aGUgc3R1YiBzdG9wcywgd2UgZmluZCB0aGUgZm9sbG93aW5nIHZhbHVlcyBvbiB0aGUKKwkgKiBiZWdpbm5pbmcgb2YgdGhlIHN0YWNrOgorCSAqIChsb25nIClyZXR1cm5fdmFsdWUKKwkgKiAobG9uZyApb2Zmc2V0IHRvIGZhaWxlZCBzeWNhbGwtZGF0YSAoMCwgaWYgbm8gZXJyb3IpCisJICovCisJcmV0ID0gKigodW5zaWduZWQgbG9uZyAqKSBtbV9pZHAtPnN0YWNrKTsKKwlvZmZzZXQgPSAqKCh1bnNpZ25lZCBsb25nICopIG1tX2lkcC0+c3RhY2sgKyAxKTsKKwlpZiAob2Zmc2V0KSB7CisJCWRhdGEgPSAodW5zaWduZWQgbG9uZyAqKShtbV9pZHAtPnN0YWNrICsKKwkJCQkJIG9mZnNldCAtIFVNTF9DT05GSUdfU1RVQl9EQVRBKTsKKwkJcHJpbnRrKCJkb19zeXNjYWxsX3N0dWIgOiByZXQgPSAlZCwgb2Zmc2V0ID0gJWQsICIKKwkJICAgICAgICJkYXRhID0gMHgleFxuIiwgcmV0LCBvZmZzZXQsIGRhdGEpOworCQlzeXNjYWxsID0gKHVuc2lnbmVkIGxvbmcgKikoKHVuc2lnbmVkIGxvbmcpZGF0YSArIGRhdGFbMF0pOworCQlwcmludGsoImRvX3N5c2NhbGxfc3R1Yjogc3lzY2FsbCAlbGQgZmFpbGVkLCByZXR1cm4gdmFsdWUgPSAiCisJCSAgICAgICAiMHglbHgsIGV4cGVjdGVkIHJldHVybiB2YWx1ZSA9IDB4JWx4XG4iLAorCQkgICAgICAgc3lzY2FsbFswXSwgcmV0LCBzeXNjYWxsWzddKTsKKwkJcHJpbnRrKCIgICAgc3lzY2FsbCBwYXJhbWV0ZXJzOiAiCisJCSAgICAgICAiMHglbHggMHglbHggMHglbHggMHglbHggMHglbHggMHglbHhcbiIsCisJCSAgICAgICBzeXNjYWxsWzFdLCBzeXNjYWxsWzJdLCBzeXNjYWxsWzNdLAorCQkgICAgICAgc3lzY2FsbFs0XSwgc3lzY2FsbFs1XSwgc3lzY2FsbFs2XSk7CisJCWZvcihuID0gMTsgbiA8IGRhdGFbMF0vc2l6ZW9mKGxvbmcpOyBuKyspIHsKKwkJCWlmKG4gPT0gMSkKKwkJCQlwcmludGsoIiAgICBhZGRpdGlvbmFsIHN5c2NhbGwgZGF0YToiKTsKKwkJCWlmKG4gJSA0ID09IDEpCisJCQkJcHJpbnRrKCJcbiAgICAgICIpOworCQkJcHJpbnRrKCIgIDB4JWx4IiwgZGF0YVtuXSk7CisJCX0KKwkJaWYobiA+IDEpCisJCQlwcmludGsoIlxuIik7CisJfQorCWVsc2UgcmV0ID0gMDsKKworCSphZGRyID0gY2hlY2tfaW5pdF9zdGFjayhtbV9pZHAsIE5VTEwpOworCisJcmV0dXJuIHJldDsKK30KKworbG9uZyBydW5fc3lzY2FsbF9zdHViKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCwgaW50IHN5c2NhbGwsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgKmFyZ3MsIGxvbmcgZXhwZWN0ZWQsIHZvaWQgKiphZGRyLAorCQkgICAgICBpbnQgZG9uZSkKK3sKKwl1bnNpZ25lZCBsb25nICpzdGFjayA9IGNoZWNrX2luaXRfc3RhY2sobW1faWRwLCAqYWRkcik7CisKKwlpZihkb25lICYmICphZGRyID09IE5VTEwpCisJCXNpbmdsZV9jb3VudCsrOworCisJKnN0YWNrICs9IHNpemVvZihsb25nKTsKKwlzdGFjayArPSAqc3RhY2sgLyBzaXplb2YobG9uZyk7CisKKwkqc3RhY2srKyA9IHN5c2NhbGw7CisJKnN0YWNrKysgPSBhcmdzWzBdOworCSpzdGFjaysrID0gYXJnc1sxXTsKKwkqc3RhY2srKyA9IGFyZ3NbMl07CisJKnN0YWNrKysgPSBhcmdzWzNdOworCSpzdGFjaysrID0gYXJnc1s0XTsKKwkqc3RhY2srKyA9IGFyZ3NbNV07CisJKnN0YWNrKysgPSBleHBlY3RlZDsKKwkqc3RhY2sgPSAwOworCW11bHRpX29wX2NvdW50Kys7CisKKwlpZighZG9uZSAmJiAoKCgodW5zaWduZWQgbG9uZykgc3RhY2spICYgflBBR0VfTUFTSykgPAorCQkgICAgIFBBR0VfU0laRSAtIDEwICogc2l6ZW9mKGxvbmcpKSl7CisJCSphZGRyID0gc3RhY2s7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBkb19zeXNjYWxsX3N0dWIobW1faWRwLCBhZGRyKTsKK30KKworbG9uZyBzeXNjYWxsX3N0dWJfZGF0YShzdHJ1Y3QgbW1faWQgKiBtbV9pZHAsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpkYXRhLCBpbnQgZGF0YV9jb3VudCwKKwkJICAgICAgIHZvaWQgKiphZGRyLCB2b2lkICoqc3R1Yl9hZGRyKQoreworCXVuc2lnbmVkIGxvbmcgKnN0YWNrOworCWludCByZXQgPSAwOworCisJLyogSWYgKmFkZHIgc3RpbGwgaXMgdW5pbml0aWFsaXplZCwgaXQgKm11c3QqIGNvbnRhaW4gTlVMTC4KKwkgKiBUaHVzIGluIHRoaXMgY2FzZSBkb19zeXNjYWxsX3N0dWIgY29ycmVjdGx5IHdvbid0IGJlIGNhbGxlZC4KKwkgKi8KKwlpZigoKCh1bnNpZ25lZCBsb25nKSAqYWRkcikgJiB+UEFHRV9NQVNLKSA+PQorCSAgIFBBR0VfU0laRSAtICgxMCArIGRhdGFfY291bnQpICogc2l6ZW9mKGxvbmcpKSB7CisJCXJldCA9IGRvX3N5c2NhbGxfc3R1YihtbV9pZHAsIGFkZHIpOworCQkvKiBpbiBjYXNlIG9mIGVycm9yLCBkb24ndCBvdmVyd3JpdGUgZGF0YSBvbiBzdGFjayAqLworCQlpZihyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXN0YWNrID0gY2hlY2tfaW5pdF9zdGFjayhtbV9pZHAsICphZGRyKTsKKwkqYWRkciA9IHN0YWNrOworCisJKnN0YWNrID0gZGF0YV9jb3VudCAqIHNpemVvZihsb25nKTsKKworCW1lbWNweShzdGFjayArIDEsIGRhdGEsIGRhdGFfY291bnQgKiBzaXplb2YobG9uZykpOworCisJKnN0dWJfYWRkciA9ICh2b2lkICopKCgodW5zaWduZWQgbG9uZykoc3RhY2sgKyAxKSAmIH5QQUdFX01BU0spICsKKwkJCSAgICAgIFVNTF9DT05GSUdfU1RVQl9EQVRBKTsKKworCXJldHVybiAwOworfQorCitpbnQgbWFwKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCwgdW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwKKwlpbnQgciwgaW50IHcsIGludCB4LCBpbnQgcGh5c19mZCwgdW5zaWduZWQgbG9uZyBsb25nIG9mZnNldCwKKwlpbnQgZG9uZSwgdm9pZCAqKmRhdGEpCit7CisJaW50IHByb3QsIHJldDsKKworCXByb3QgPSAociA/IFBST1RfUkVBRCA6IDApIHwgKHcgPyBQUk9UX1dSSVRFIDogMCkgfAorCQkoeCA/IFBST1RfRVhFQyA6IDApOworCisJaWYocHJvY19tbSl7CisJCXN0cnVjdCBwcm9jX21tX29wIG1hcDsKKwkJaW50IGZkID0gbW1faWRwLT51Lm1tX2ZkOworCisJCW1hcCA9ICgoc3RydWN0IHByb2NfbW1fb3ApIHsgLm9wCT0gTU1fTU1BUCwKKwkJCQkgICAgICAgLnUJCT0KKwkJCQkgICAgICAgeyAubW1hcAk9CisJCQkJCSB7IC5hZGRyCT0gdmlydCwKKwkJCQkJICAgLmxlbgk9IGxlbiwKKwkJCQkJICAgLnByb3QJPSBwcm90LAorCQkJCQkgICAuZmxhZ3MJPSBNQVBfU0hBUkVEIHwKKwkJCQkJICAgTUFQX0ZJWEVELAorCQkJCQkgICAuZmQJPSBwaHlzX2ZkLAorCQkJCQkgICAub2Zmc2V0PSBvZmZzZXQKKwkJCQkJIH0gfSB9ICk7CisJCXJldCA9IG9zX3dyaXRlX2ZpbGUoZmQsICZtYXAsIHNpemVvZihtYXApKTsKKwkJaWYocmV0ICE9IHNpemVvZihtYXApKQorCQkJcHJpbnRrKCJtYXAgOiAvcHJvYy9tbSBtYXAgZmFpbGVkLCBlcnIgPSAlZFxuIiwgLXJldCk7CisJCWVsc2UgcmV0ID0gMDsKKwl9CisJZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgYXJnc1tdID0geyB2aXJ0LCBsZW4sIHByb3QsCisJCQkJCSBNQVBfU0hBUkVEIHwgTUFQX0ZJWEVELCBwaHlzX2ZkLAorCQkJCQkgTU1BUF9PRkZTRVQob2Zmc2V0KSB9OworCisJCXJldCA9IHJ1bl9zeXNjYWxsX3N0dWIobW1faWRwLCBTVFVCX01NQVBfTlIsIGFyZ3MsIHZpcnQsCisJCQkJICAgICAgIGRhdGEsIGRvbmUpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCB1bm1hcChzdHJ1Y3QgbW1faWQgKiBtbV9pZHAsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgZG9uZSwKKwkgIHZvaWQgKipkYXRhKQoreworCWludCByZXQ7CisKKwlpZihwcm9jX21tKXsKKwkJc3RydWN0IHByb2NfbW1fb3AgdW5tYXA7CisJCWludCBmZCA9IG1tX2lkcC0+dS5tbV9mZDsKKworCQl1bm1hcCA9ICgoc3RydWN0IHByb2NfbW1fb3ApIHsgLm9wCT0gTU1fTVVOTUFQLAorCQkJCQkgLnUJPQorCQkJCQkgeyAubXVubWFwCT0KKwkJCQkJICAgeyAuYWRkcgk9CisJCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIGFkZHIsCisJCQkJCSAgICAgLmxlbgkJPSBsZW4gfSB9IH0gKTsKKwkJcmV0ID0gb3Nfd3JpdGVfZmlsZShmZCwgJnVubWFwLCBzaXplb2YodW5tYXApKTsKKwkJaWYocmV0ICE9IHNpemVvZih1bm1hcCkpCisJCQlwcmludGsoInVubWFwIC0gcHJvY19tbSB3cml0ZSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJZWxzZSByZXQgPSAwOworCX0KKwllbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBhcmdzW10gPSB7ICh1bnNpZ25lZCBsb25nKSBhZGRyLCBsZW4sIDAsIDAsIDAsCisJCQkJCSAwIH07CisKKwkJcmV0ID0gcnVuX3N5c2NhbGxfc3R1YihtbV9pZHAsIF9fTlJfbXVubWFwLCBhcmdzLCAwLAorCQkJCSAgICAgICBkYXRhLCBkb25lKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgcHJvdGVjdChzdHJ1Y3QgbW1faWQgKiBtbV9pZHAsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCisJICAgIGludCByLCBpbnQgdywgaW50IHgsIGludCBkb25lLCB2b2lkICoqZGF0YSkKK3sKKwlzdHJ1Y3QgcHJvY19tbV9vcCBwcm90ZWN0OworCWludCBwcm90LCByZXQ7CisKKwlwcm90ID0gKHIgPyBQUk9UX1JFQUQgOiAwKSB8ICh3ID8gUFJPVF9XUklURSA6IDApIHwKKwkJKHggPyBQUk9UX0VYRUMgOiAwKTsKKwlpZihwcm9jX21tKXsKKwkJaW50IGZkID0gbW1faWRwLT51Lm1tX2ZkOworCisJCXByb3RlY3QgPSAoKHN0cnVjdCBwcm9jX21tX29wKSB7IC5vcAk9IE1NX01QUk9URUNULAorCQkJCQkgICAudQk9CisJCQkJCSAgIHsgLm1wcm90ZWN0CT0KKwkJCQkJICAgICB7IC5hZGRyCT0KKwkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBhZGRyLAorCQkJCQkgICAgICAgLmxlbgk9IGxlbiwKKwkJCQkJICAgICAgIC5wcm90CT0gcHJvdCB9IH0gfSApOworCisJCXJldCA9IG9zX3dyaXRlX2ZpbGUoZmQsICZwcm90ZWN0LCBzaXplb2YocHJvdGVjdCkpOworCQlpZihyZXQgIT0gc2l6ZW9mKHByb3RlY3QpKQorCQkJcHJpbnRrKCJwcm90ZWN0IGZhaWxlZCwgZXJyID0gJWQiLCAtcmV0KTsKKwkJZWxzZSByZXQgPSAwOworCX0KKwllbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBhcmdzW10gPSB7IGFkZHIsIGxlbiwgcHJvdCwgMCwgMCwgMCB9OworCisJCXJldCA9IHJ1bl9zeXNjYWxsX3N0dWIobW1faWRwLCBfX05SX21wcm90ZWN0LCBhcmdzLCAwLAorCQkJCSAgICAgICBkYXRhLCBkb25lKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGJlZm9yZV9tZW1fc2thcyh1bnNpZ25lZCBsb25nIHVudXNlZCkKK3sKK30KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMgYi9hcmNoL3VtL29zLUxpbnV4L3NrYXMvcHJvY2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMGEyMWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL29zLUxpbnV4L3NrYXMvcHJvY2Vzcy5jCkBAIC0wLDAgKzEsNTY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyLSAyMDA0IEplZmYgRGlrZSAoamRpa2VAYWRkdG9pdC5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlICJwdHJhY2VfdXNlci5oIgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvdXNlci5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgInVzZXIuaCIKKyNpbmNsdWRlICJzeXNkZXAvcHRyYWNlLmgiCisjaW5jbHVkZSAidXNlcl91dGlsLmgiCisjaW5jbHVkZSAia2Vybl91dGlsLmgiCisjaW5jbHVkZSAic2thcy5oIgorI2luY2x1ZGUgInN0dWItZGF0YS5oIgorI2luY2x1ZGUgIm1tX2lkLmgiCisjaW5jbHVkZSAic3lzZGVwL3NpZ2NvbnRleHQuaCIKKyNpbmNsdWRlICJzeXNkZXAvc3R1Yi5oIgorI2luY2x1ZGUgIm9zLmgiCisjaW5jbHVkZSAicHJvY19tbS5oIgorI2luY2x1ZGUgInNrYXNfcHRyYWNlLmgiCisjaW5jbHVkZSAiY2hhbl91c2VyLmgiCisjaW5jbHVkZSAicmVnaXN0ZXJzLmgiCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSAidW1sLWNvbmZpZy5oIgorI2luY2x1ZGUgInByb2Nlc3MuaCIKKyNpbmNsdWRlICJsb25nam1wLmgiCisKK2ludCBpc19za2FzX3dpbmNoKGludCBwaWQsIGludCBmZCwgdm9pZCAqZGF0YSkKK3sKKwlpZihwaWQgIT0gb3NfZ2V0cGdycCgpKQorCQlyZXR1cm4oMCk7CisKKwlyZWdpc3Rlcl93aW5jaF9pcnEoLTEsIGZkLCAtMSwgZGF0YSk7CisJcmV0dXJuKDEpOworfQorCit2b2lkIHdhaXRfc3R1Yl9kb25lKGludCBwaWQsIGludCBzaWcsIGNoYXIgKiBmbmFtZSkKK3sKKwlpbnQgbiwgc3RhdHVzLCBlcnI7CisKKwlkbyB7CisJCWlmICggc2lnICE9IC0xICkgeworCQkJZXJyID0gcHRyYWNlKFBUUkFDRV9DT05ULCBwaWQsIDAsIHNpZyk7CisJCQlpZihlcnIpCisJCQkJcGFuaWMoIiVzIDogY29udGludWUgZmFpbGVkLCBlcnJubyA9ICVkXG4iLAorCQkJCSAgICAgIGZuYW1lLCBlcnJubyk7CisJCX0KKwkJc2lnID0gMDsKKworCQlDQVRDSF9FSU5UUihuID0gd2FpdHBpZChwaWQsICZzdGF0dXMsIFdVTlRSQUNFRCkpOworCX0gd2hpbGUoKG4gPj0gMCkgJiYgV0lGU1RPUFBFRChzdGF0dXMpICYmCisJICAgICAgICAoKFdTVE9QU0lHKHN0YXR1cykgPT0gU0lHVlRBTFJNKSB8fAorCQkgLyogcnVubmluZyBVTUwgaW5zaWRlIGEgZGV0YWNoZWQgc2NyZWVuIGNhbiBjYXVzZQorCQkgICogU0lHV0lOQ0hlcworCQkgICovCisJCSAoV1NUT1BTSUcoc3RhdHVzKSA9PSBTSUdXSU5DSCkpKTsKKworCWlmKChuIDwgMCkgfHwgIVdJRlNUT1BQRUQoc3RhdHVzKSB8fAorCSAgIChXU1RPUFNJRyhzdGF0dXMpICE9IFNJR1VTUjEgJiYgV1NUT1BTSUcoc3RhdHVzKSAhPSBTSUdUUkFQKSl7CisJCXVuc2lnbmVkIGxvbmcgcmVnc1tIT1NUX0ZSQU1FX1NJWkVdOworCisJCWlmKHB0cmFjZShQVFJBQ0VfR0VUUkVHUywgcGlkLCAwLCByZWdzKSA8IDApCisJCQlwcmludGsoIkZhaWxlZCB0byBnZXQgcmVnaXN0ZXJzIGZyb20gc3R1YiwgIgorCQkJICAgICAgICJlcnJubyA9ICVkXG4iLCBlcnJubyk7CisJCWVsc2UgeworCQkJaW50IGk7CisKKwkJCXByaW50aygiU3R1YiByZWdpc3RlcnMgLVxuIik7CisJCQlmb3IoaSA9IDA7IGkgPCBIT1NUX0ZSQU1FX1NJWkU7IGkrKykKKwkJCQlwcmludGsoIlx0JWQgLSAlbHhcbiIsIGksIHJlZ3NbaV0pOworCQl9CisJCXBhbmljKCIlcyA6IGZhaWxlZCB0byB3YWl0IGZvciBTSUdVU1IxL1NJR1RSQVAsICIKKwkJICAgICAgInBpZCA9ICVkLCBuID0gJWQsIGVycm5vID0gJWQsIHN0YXR1cyA9IDB4JXhcbiIsCisJCSAgICAgIGZuYW1lLCBwaWQsIG4sIGVycm5vLCBzdGF0dXMpOworCX0KK30KKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY3VycmVudF9zdHViX3N0YWNrKHZvaWQpOworCit2b2lkIGdldF9za2FzX2ZhdWx0aW5mbyhpbnQgcGlkLCBzdHJ1Y3QgZmF1bHRpbmZvICogZmkpCit7CisJaW50IGVycjsKKworCWlmKHB0cmFjZV9mYXVsdGluZm8peworCQllcnIgPSBwdHJhY2UoUFRSQUNFX0ZBVUxUSU5GTywgcGlkLCAwLCBmaSk7CisJCWlmKGVycikKKwkJCXBhbmljKCJnZXRfc2thc19mYXVsdGluZm8gLSBQVFJBQ0VfRkFVTFRJTkZPIGZhaWxlZCwgIgorCQkJICAgICAgImVycm5vID0gJWRcbiIsIGVycm5vKTsKKworCQkvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBpMzg2LCB3aGljaCBoYXMgZGlmZmVyZW50IHN0cnVjdHMgKi8KKwkJaWYgKHNpemVvZihzdHJ1Y3QgcHRyYWNlX2ZhdWx0aW5mbykgPCBzaXplb2Yoc3RydWN0IGZhdWx0aW5mbykpCisJCQltZW1zZXQoKGNoYXIgKilmaSArIHNpemVvZihzdHJ1Y3QgcHRyYWNlX2ZhdWx0aW5mbyksIDAsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBmYXVsdGluZm8pIC0KKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHB0cmFjZV9mYXVsdGluZm8pKTsKKwl9CisJZWxzZSB7CisJCXdhaXRfc3R1Yl9kb25lKHBpZCwgU0lHU0VHViwgImdldF9za2FzX2ZhdWx0aW5mbyIpOworCisJCS8qIGZhdWx0aW5mbyBpcyBwcmVwYXJlZCBieSB0aGUgc3R1Yi1zZWd2LWhhbmRsZXIgYXQgc3RhcnQgb2YKKwkJICogdGhlIHN0dWIgc3RhY2sgcGFnZS4gV2UganVzdCBoYXZlIHRvIGNvcHkgaXQuCisJCSAqLworCQltZW1jcHkoZmksICh2b2lkICopY3VycmVudF9zdHViX3N0YWNrKCksIHNpemVvZigqZmkpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9zZWd2KGludCBwaWQsIHVuaW9uIHVtbF9wdF9yZWdzICogcmVncykKK3sKKwlnZXRfc2thc19mYXVsdGluZm8ocGlkLCAmcmVncy0+c2thcy5mYXVsdGluZm8pOworCXNlZ3YocmVncy0+c2thcy5mYXVsdGluZm8sIDAsIDEsIE5VTEwpOworfQorCisvKlRvIHVzZSB0aGUgc2FtZSB2YWx1ZSBvZiB1c2luZ19zeXNlbXUgYXMgdGhlIGNhbGxlciwgYXNrIGl0IHRoYXQgdmFsdWUgKGluIGxvY2FsX3VzaW5nX3N5c2VtdSkqLworc3RhdGljIHZvaWQgaGFuZGxlX3RyYXAoaW50IHBpZCwgdW5pb24gdW1sX3B0X3JlZ3MgKnJlZ3MsIGludCBsb2NhbF91c2luZ19zeXNlbXUpCit7CisJaW50IGVyciwgc3RhdHVzOworCisJLyogTWFyayB0aGlzIGFzIGEgc3lzY2FsbCAqLworCVVQVF9TWVNDQUxMX05SKHJlZ3MpID0gUFRfU1lTQ0FMTF9OUihyZWdzLT5za2FzLnJlZ3MpOworCisJaWYgKCFsb2NhbF91c2luZ19zeXNlbXUpCisJeworCQllcnIgPSBwdHJhY2UoUFRSQUNFX1BPS0VVU1IsIHBpZCwgUFRfU1lTQ0FMTF9OUl9PRkZTRVQsCisJCQkgICAgIF9fTlJfZ2V0cGlkKTsKKwkJaWYoZXJyIDwgMCkKKwkJCXBhbmljKCJoYW5kbGVfdHJhcCAtIG51bGxpZnlpbmcgc3lzY2FsbCBmYWlsZWQgZXJybm8gPSAlZFxuIiwKKwkJCSAgICAgIGVycm5vKTsKKworCQllcnIgPSBwdHJhY2UoUFRSQUNFX1NZU0NBTEwsIHBpZCwgMCwgMCk7CisJCWlmKGVyciA8IDApCisJCQlwYW5pYygiaGFuZGxlX3RyYXAgLSBjb250aW51aW5nIHRvIGVuZCBvZiBzeXNjYWxsIGZhaWxlZCwgIgorCQkJICAgICAgImVycm5vID0gJWRcbiIsIGVycm5vKTsKKworCQlDQVRDSF9FSU5UUihlcnIgPSB3YWl0cGlkKHBpZCwgJnN0YXR1cywgV1VOVFJBQ0VEKSk7CisJCWlmKChlcnIgPCAwKSB8fCAhV0lGU1RPUFBFRChzdGF0dXMpIHx8CisJCSAgIChXU1RPUFNJRyhzdGF0dXMpICE9IFNJR1RSQVAgKyAweDgwKSkKKwkJCXBhbmljKCJoYW5kbGVfdHJhcCAtIGZhaWxlZCB0byB3YWl0IGF0IGVuZCBvZiBzeXNjYWxsLCAiCisJCQkgICAgICAiZXJybm8gPSAlZCwgc3RhdHVzID0gJWRcbiIsIGVycm5vLCBzdGF0dXMpOworCX0KKworCWhhbmRsZV9zeXNjYWxsKHJlZ3MpOworfQorCitleHRlcm4gaW50IF9fc3lzY2FsbF9zdHViX3N0YXJ0OworCitzdGF0aWMgaW50IHVzZXJzcGFjZV90cmFtcCh2b2lkICpzdGFjaykKK3sKKwl2b2lkICphZGRyOworCisJcHRyYWNlKFBUUkFDRV9UUkFDRU1FLCAwLCAwLCAwKTsKKworCWluaXRfbmV3X3RocmVhZF9zaWduYWxzKDEpOworCWVuYWJsZV90aW1lcigpOworCisJaWYoIXByb2NfbW0peworCQkvKiBUaGlzIGhhcyBhIHB0ZSwgYnV0IGl0IGNhbid0IGJlIG1hcHBlZCBpbiB3aXRoIHRoZSB1c3VhbAorCQkgKiB0bGJfZmx1c2ggbWVjaGFuaXNtIGJlY2F1c2UgdGhpcyBpcyBwYXJ0IG9mIHRoYXQgbWVjaGFuaXNtCisJCSAqLworCQlpbnQgZmQ7CisJCV9fdTY0IG9mZnNldDsKKwkJZmQgPSBwaHlzX21hcHBpbmcodG9fcGh5cygmX19zeXNjYWxsX3N0dWJfc3RhcnQpLCAmb2Zmc2V0KTsKKwkJYWRkciA9IG1tYXA2NCgodm9pZCAqKSBVTUxfQ09ORklHX1NUVUJfQ09ERSwgcGFnZV9zaXplKCksCisJCQkgICAgICBQUk9UX0VYRUMsIE1BUF9GSVhFRCB8IE1BUF9QUklWQVRFLCBmZCwgb2Zmc2V0KTsKKwkJaWYoYWRkciA9PSBNQVBfRkFJTEVEKXsKKwkJCXByaW50aygibWFwcGluZyBtbWFwIHN0dWIgZmFpbGVkLCBlcnJubyA9ICVkXG4iLAorCQkJICAgICAgIGVycm5vKTsKKwkJCWV4aXQoMSk7CisJCX0KKworCQlpZihzdGFjayAhPSBOVUxMKXsKKwkJCWZkID0gcGh5c19tYXBwaW5nKHRvX3BoeXMoc3RhY2spLCAmb2Zmc2V0KTsKKwkJCWFkZHIgPSBtbWFwKCh2b2lkICopIFVNTF9DT05GSUdfU1RVQl9EQVRBLCBwYWdlX3NpemUoKSwKKwkJCQkgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkJCQkgICAgTUFQX0ZJWEVEIHwgTUFQX1NIQVJFRCwgZmQsIG9mZnNldCk7CisJCQlpZihhZGRyID09IE1BUF9GQUlMRUQpeworCQkJCXByaW50aygibWFwcGluZyBzZWdmYXVsdCBzdGFjayBmYWlsZWQsICIKKwkJCQkgICAgICAgImVycm5vID0gJWRcbiIsIGVycm5vKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQl9CisJfQorCWlmKCFwdHJhY2VfZmF1bHRpbmZvICYmIChzdGFjayAhPSBOVUxMKSl7CisJCXVuc2lnbmVkIGxvbmcgdiA9IFVNTF9DT05GSUdfU1RVQl9DT0RFICsKKwkJCQkgICh1bnNpZ25lZCBsb25nKSBzdHViX3NlZ3ZfaGFuZGxlciAtCisJCQkJICAodW5zaWduZWQgbG9uZykgJl9fc3lzY2FsbF9zdHViX3N0YXJ0OworCisJCXNldF9zaWdzdGFjaygodm9pZCAqKSBVTUxfQ09ORklHX1NUVUJfREFUQSwgcGFnZV9zaXplKCkpOworCQlzZXRfaGFuZGxlcihTSUdTRUdWLCAodm9pZCAqKSB2LCBTQV9PTlNUQUNLLAorCQkJICAgIFNJR0lPLCBTSUdXSU5DSCwgU0lHQUxSTSwgU0lHVlRBTFJNLAorCQkJICAgIFNJR1VTUjEsIC0xKTsKKwl9CisKKwlvc19zdG9wX3Byb2Nlc3Mob3NfZ2V0cGlkKCkpOworCXJldHVybigwKTsKK30KKworLyogRWFjaCBlbGVtZW50IHNldCBvbmNlLCBhbmQgb25seSBhY2Nlc3NlZCBieSBhIHNpbmdsZSBwcm9jZXNzb3IgYW55d2F5ICovCisjdW5kZWYgTlJfQ1BVUworI2RlZmluZSBOUl9DUFVTIDEKK2ludCB1c2Vyc3BhY2VfcGlkW05SX0NQVVNdOworCitpbnQgc3RhcnRfdXNlcnNwYWNlKHVuc2lnbmVkIGxvbmcgc3R1Yl9zdGFjaykKK3sKKwl2b2lkICpzdGFjazsKKwl1bnNpZ25lZCBsb25nIHNwOworCWludCBwaWQsIHN0YXR1cywgbiwgZmxhZ3M7CisKKwlzdGFjayA9IG1tYXAoTlVMTCwgUEFHRV9TSVpFLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFIHwgUFJPVF9FWEVDLAorCQkgICAgIE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywgLTEsIDApOworCWlmKHN0YWNrID09IE1BUF9GQUlMRUQpCisJCXBhbmljKCJzdGFydF91c2Vyc3BhY2UgOiBtbWFwIGZhaWxlZCwgZXJybm8gPSAlZCIsIGVycm5vKTsKKwlzcCA9ICh1bnNpZ25lZCBsb25nKSBzdGFjayArIFBBR0VfU0laRSAtIHNpemVvZih2b2lkICopOworCisJZmxhZ3MgPSBDTE9ORV9GSUxFUyB8IFNJR0NITEQ7CisJaWYocHJvY19tbSkgZmxhZ3MgfD0gQ0xPTkVfVk07CisJcGlkID0gY2xvbmUodXNlcnNwYWNlX3RyYW1wLCAodm9pZCAqKSBzcCwgZmxhZ3MsICh2b2lkICopIHN0dWJfc3RhY2spOworCWlmKHBpZCA8IDApCisJCXBhbmljKCJzdGFydF91c2Vyc3BhY2UgOiBjbG9uZSBmYWlsZWQsIGVycm5vID0gJWQiLCBlcnJubyk7CisKKwlkbyB7CisJCUNBVENIX0VJTlRSKG4gPSB3YWl0cGlkKHBpZCwgJnN0YXR1cywgV1VOVFJBQ0VEKSk7CisJCWlmKG4gPCAwKQorCQkJcGFuaWMoInN0YXJ0X3VzZXJzcGFjZSA6IHdhaXQgZmFpbGVkLCBlcnJubyA9ICVkIiwKKwkJCSAgICAgIGVycm5vKTsKKwl9IHdoaWxlKFdJRlNUT1BQRUQoc3RhdHVzKSAmJiAoV1NUT1BTSUcoc3RhdHVzKSA9PSBTSUdWVEFMUk0pKTsKKworCWlmKCFXSUZTVE9QUEVEKHN0YXR1cykgfHwgKFdTVE9QU0lHKHN0YXR1cykgIT0gU0lHU1RPUCkpCisJCXBhbmljKCJzdGFydF91c2Vyc3BhY2UgOiBleHBlY3RlZCBTSUdTVE9QLCBnb3Qgc3RhdHVzID0gJWQiLAorCQkgICAgICBzdGF0dXMpOworCisJaWYgKHB0cmFjZShQVFJBQ0VfT0xEU0VUT1BUSU9OUywgcGlkLCBOVUxMLCAodm9pZCAqKVBUUkFDRV9PX1RSQUNFU1lTR09PRCkgPCAwKQorCQlwYW5pYygic3RhcnRfdXNlcnNwYWNlIDogUFRSQUNFX09MRFNFVE9QVElPTlMgZmFpbGVkLCBlcnJubz0lZFxuIiwKKwkJICAgICAgZXJybm8pOworCisJaWYobXVubWFwKHN0YWNrLCBQQUdFX1NJWkUpIDwgMCkKKwkJcGFuaWMoInN0YXJ0X3VzZXJzcGFjZSA6IG11bm1hcCBmYWlsZWQsIGVycm5vID0gJWRcbiIsIGVycm5vKTsKKworCXJldHVybihwaWQpOworfQorCit2b2lkIHVzZXJzcGFjZSh1bmlvbiB1bWxfcHRfcmVncyAqcmVncykKK3sKKwlpbnQgZXJyLCBzdGF0dXMsIG9wLCBwaWQgPSB1c2Vyc3BhY2VfcGlkWzBdOworCWludCBsb2NhbF91c2luZ19zeXNlbXU7IC8qVG8gcHJldmVudCByYWNlcyBpZiB1c2luZ19zeXNlbXUgY2hhbmdlcyB1bmRlciB1cy4qLworCisJd2hpbGUoMSl7CisJCXJlc3RvcmVfcmVnaXN0ZXJzKHBpZCwgcmVncyk7CisKKwkJLyogTm93IHdlIHNldCBsb2NhbF91c2luZ19zeXNlbXUgdG8gYmUgdXNlZCBmb3Igb25lIGxvb3AgKi8KKwkJbG9jYWxfdXNpbmdfc3lzZW11ID0gZ2V0X3VzaW5nX3N5c2VtdSgpOworCisJCW9wID0gU0VMRUNUX1BUUkFDRV9PUEVSQVRJT04obG9jYWxfdXNpbmdfc3lzZW11LCBzaW5nbGVzdGVwcGluZyhOVUxMKSk7CisKKwkJZXJyID0gcHRyYWNlKG9wLCBwaWQsIDAsIDApOworCQlpZihlcnIpCisJCQlwYW5pYygidXNlcnNwYWNlIC0gY291bGQgbm90IHJlc3VtZSB1c2Vyc3BhY2UgcHJvY2VzcywgIgorCQkJICAgICAgInBpZD0lZCwgcHRyYWNlIG9wZXJhdGlvbiA9ICVkLCBlcnJubyA9ICVkXG4iLAorCQkJICAgICAgb3AsIGVycm5vKTsKKworCQlDQVRDSF9FSU5UUihlcnIgPSB3YWl0cGlkKHBpZCwgJnN0YXR1cywgV1VOVFJBQ0VEKSk7CisJCWlmKGVyciA8IDApCisJCQlwYW5pYygidXNlcnNwYWNlIC0gd2FpdHBpZCBmYWlsZWQsIGVycm5vID0gJWRcbiIsCisJCQkgICAgICBlcnJubyk7CisKKwkJcmVncy0+c2thcy5pc191c2VyID0gMTsKKwkJc2F2ZV9yZWdpc3RlcnMocGlkLCByZWdzKTsKKwkJVVBUX1NZU0NBTExfTlIocmVncykgPSAtMTsgLyogQXNzdW1lOiBJdCdzIG5vdCBhIHN5c2NhbGwgKi8KKworCQlpZihXSUZTVE9QUEVEKHN0YXR1cykpeworCQkgIAlzd2l0Y2goV1NUT1BTSUcoc3RhdHVzKSl7CisJCQljYXNlIFNJR1NFR1Y6CisJCQkJaWYoUFRSQUNFX0ZVTExfRkFVTFRJTkZPIHx8ICFwdHJhY2VfZmF1bHRpbmZvKQorCQkJCQl1c2VyX3NpZ25hbChTSUdTRUdWLCByZWdzLCBwaWQpOworCQkJCWVsc2UgaGFuZGxlX3NlZ3YocGlkLCByZWdzKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0lHVFJBUCArIDB4ODA6CisJCQkgICAgICAgIGhhbmRsZV90cmFwKHBpZCwgcmVncywgbG9jYWxfdXNpbmdfc3lzZW11KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0lHVFJBUDoKKwkJCQlyZWxheV9zaWduYWwoU0lHVFJBUCwgcmVncyk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNJR0lPOgorCQkJY2FzZSBTSUdWVEFMUk06CisJCQljYXNlIFNJR0lMTDoKKwkJCWNhc2UgU0lHQlVTOgorCQkJY2FzZSBTSUdGUEU6CisJCQljYXNlIFNJR1dJTkNIOgorCQkJCXVzZXJfc2lnbmFsKFdTVE9QU0lHKHN0YXR1cyksIHJlZ3MsIHBpZCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJICAgICAgICBwcmludGsoInVzZXJzcGFjZSAtIGNoaWxkIHN0b3BwZWQgd2l0aCBzaWduYWwgIgorCQkJCSAgICAgICAiJWRcbiIsIFdTVE9QU0lHKHN0YXR1cykpOworCQkJfQorCQkJcGlkID0gdXNlcnNwYWNlX3BpZFswXTsKKwkJCWludGVycnVwdF9lbmQoKTsKKworCQkJLyogQXZvaWQgLUVSRVNUQVJUU1lTIGhhbmRsaW5nIGluIGhvc3QgKi8KKwkJCWlmKFBUX1NZU0NBTExfTlJfT0ZGU0VUICE9IFBUX1NZU0NBTExfUkVUX09GRlNFVCkKKwkJCQlQVF9TWVNDQUxMX05SKHJlZ3MtPnNrYXMucmVncykgPSAtMTsKKwkJfQorCX0KK30KKyNkZWZpbmUgSU5JVF9KTVBfTkVXX1RIUkVBRCAwCisjZGVmaW5lIElOSVRfSk1QX1JFTU9WRV9TSUdTVEFDSyAxCisjZGVmaW5lIElOSVRfSk1QX0NBTExCQUNLIDIKKyNkZWZpbmUgSU5JVF9KTVBfSEFMVCAzCisjZGVmaW5lIElOSVRfSk1QX1JFQk9PVCA0CisKK2ludCBjb3B5X2NvbnRleHRfc2thczAodW5zaWduZWQgbG9uZyBuZXdfc3RhY2ssIGludCBwaWQpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIHJlZ3NbTUFYX1JFR19OUl07CisJdW5zaWduZWQgbG9uZyBjdXJyZW50X3N0YWNrID0gY3VycmVudF9zdHViX3N0YWNrKCk7CisJc3RydWN0IHN0dWJfZGF0YSAqZGF0YSA9IChzdHJ1Y3Qgc3R1Yl9kYXRhICopIGN1cnJlbnRfc3RhY2s7CisJc3RydWN0IHN0dWJfZGF0YSAqY2hpbGRfZGF0YSA9IChzdHJ1Y3Qgc3R1Yl9kYXRhICopIG5ld19zdGFjazsKKwlfX3U2NCBuZXdfb2Zmc2V0OworCWludCBuZXdfZmQgPSBwaHlzX21hcHBpbmcodG9fcGh5cygodm9pZCAqKW5ld19zdGFjayksICZuZXdfb2Zmc2V0KTsKKworCS8qIHByZXBhcmUgb2Zmc2V0IGFuZCBmZCBvZiBjaGlsZCdzIHN0YWNrIGFzIGFyZ3VtZW50IGZvciBwYXJlbnQncworCSAqIGFuZCBjaGlsZCdzIG1tYXAyIGNhbGxzCisJICovCisJKmRhdGEgPSAoKHN0cnVjdCBzdHViX2RhdGEpIHsgLm9mZnNldAk9IE1NQVBfT0ZGU0VUKG5ld19vZmZzZXQpLAorCQkJCSAgICAgIC5mZAk9IG5ld19mZCwKKwkJCQkgICAgICAudGltZXIgICAgPSAoKHN0cnVjdCBpdGltZXJ2YWwpCisJCQkJCSAgICAgICAgICAgIHsgeyAwLCAxMDAwMDAwIC8gaHooKSB9LAorCQkJCQkJICAgICAgeyAwLCAxMDAwMDAwIC8gaHooKSB9fSl9KTsKKwlnZXRfc2FmZV9yZWdpc3RlcnMocmVncyk7CisKKwkvKiBTZXQgcGFyZW50J3MgaW5zdHJ1Y3Rpb24gcG9pbnRlciB0byBzdGFydCBvZiBjbG9uZS1zdHViICovCisJcmVnc1tSRUdTX0lQX0lOREVYXSA9IFVNTF9DT05GSUdfU1RVQl9DT0RFICsKKwkJCQkodW5zaWduZWQgbG9uZykgc3R1Yl9jbG9uZV9oYW5kbGVyIC0KKwkJCQkodW5zaWduZWQgbG9uZykgJl9fc3lzY2FsbF9zdHViX3N0YXJ0OworCXJlZ3NbUkVHU19TUF9JTkRFWF0gPSBVTUxfQ09ORklHX1NUVUJfREFUQSArIFBBR0VfU0laRSAtCisJCXNpemVvZih2b2lkICopOworI2lmZGVmIF9fU0lHTkFMX0ZSQU1FU0laRQorCXJlZ3NbUkVHU19TUF9JTkRFWF0gLT0gX19TSUdOQUxfRlJBTUVTSVpFOworI2VuZGlmCisJZXJyID0gcHRyYWNlX3NldHJlZ3MocGlkLCByZWdzKTsKKwlpZihlcnIgPCAwKQorCQlwYW5pYygiY29weV9jb250ZXh0X3NrYXMwIDogUFRSQUNFX1NFVFJFR1MgZmFpbGVkLCAiCisJCSAgICAgICJwaWQgPSAlZCwgZXJybm8gPSAlZFxuIiwgcGlkLCBlcnJubyk7CisKKwkvKiBzZXQgYSB3ZWxsIGtub3duIHJldHVybiBjb2RlIGZvciBkZXRlY3Rpb24gb2YgY2hpbGQgd3JpdGUgZmFpbHVyZSAqLworCWNoaWxkX2RhdGEtPmVyciA9IDEyMzQ1Njc4OworCisJLyogV2FpdCwgdW50aWwgcGFyZW50IGhhcyBmaW5pc2hlZCBpdHMgd29yazogcmVhZCBjaGlsZCdzIHBpZCBmcm9tCisJICogcGFyZW50J3Mgc3RhY2ssIGFuZCBjaGVjaywgaWYgYmFkIHJlc3VsdC4KKwkgKi8KKwl3YWl0X3N0dWJfZG9uZShwaWQsIDAsICJjb3B5X2NvbnRleHRfc2thczAiKTsKKworCXBpZCA9IGRhdGEtPmVycjsKKwlpZihwaWQgPCAwKQorCQlwYW5pYygiY29weV9jb250ZXh0X3NrYXMwIC0gc3R1Yi1wYXJlbnQgcmVwb3J0cyBlcnJvciAlZFxuIiwKKwkJICAgICAgcGlkKTsKKworCS8qIFdhaXQsIHVudGlsIGNoaWxkIGhhcyBmaW5pc2hlZCB0b286IHJlYWQgY2hpbGQncyByZXN1bHQgZnJvbQorCSAqIGNoaWxkJ3Mgc3RhY2sgYW5kIGNoZWNrIGl0LgorCSAqLworCXdhaXRfc3R1Yl9kb25lKHBpZCwgLTEsICJjb3B5X2NvbnRleHRfc2thczAiKTsKKwlpZiAoY2hpbGRfZGF0YS0+ZXJyICE9IFVNTF9DT05GSUdfU1RVQl9EQVRBKQorCQlwYW5pYygiY29weV9jb250ZXh0X3NrYXMwIC0gc3R1Yi1jaGlsZCByZXBvcnRzIGVycm9yICVkXG4iLAorCQkgICAgICBjaGlsZF9kYXRhLT5lcnIpOworCisJaWYgKHB0cmFjZShQVFJBQ0VfT0xEU0VUT1BUSU9OUywgcGlkLCBOVUxMLAorCQkgICAodm9pZCAqKVBUUkFDRV9PX1RSQUNFU1lTR09PRCkgPCAwKQorCQlwYW5pYygiY29weV9jb250ZXh0X3NrYXMwIDogUFRSQUNFX09MRFNFVE9QVElPTlMgZmFpbGVkLCAiCisJCSAgICAgICJlcnJubyA9ICVkXG4iLCBlcnJubyk7CisKKwlyZXR1cm4gcGlkOworfQorCisvKgorICogVGhpcyBpcyB1c2VkIG9ubHksIGlmIHN0dWIgcGFnZXMgYXJlIG5lZWRlZCwgd2hpbGUgcHJvY19tbSBpcworICogYXZhaWxhYmwuIE9wZW5pbmcgL3Byb2MvbW0gY3JlYXRlcyBhIG5ldyBtbV9jb250ZXh0LCB3aGljaCBsYWNrcworICogdGhlIHN0dWItcGFnZXMuIFRodXMsIHdlIG1hcCB0aGVtIHVzaW5nIC9wcm9jL21tLWZkCisgKi8KK3ZvaWQgbWFwX3N0dWJfcGFnZXMoaW50IGZkLCB1bnNpZ25lZCBsb25nIGNvZGUsCisJCSAgICB1bnNpZ25lZCBsb25nIGRhdGEsIHVuc2lnbmVkIGxvbmcgc3RhY2spCit7CisJc3RydWN0IHByb2NfbW1fb3AgbW1vcDsKKwlpbnQgbjsKKwlfX3U2NCBjb2RlX29mZnNldDsKKwlpbnQgY29kZV9mZCA9IHBoeXNfbWFwcGluZyh0b19waHlzKCh2b2lkICopICZfX3N5c2NhbGxfc3R1Yl9zdGFydCksCisJCQkJICAgJmNvZGVfb2Zmc2V0KTsKKworCW1tb3AgPSAoKHN0cnVjdCBwcm9jX21tX29wKSB7IC5vcCAgICAgICAgPSBNTV9NTUFQLAorCQkJCSAgICAgIC51ICAgICAgICAgPQorCQkJCSAgICAgIHsgLm1tYXAgICAgPQorCQkJCQl7IC5hZGRyICAgID0gY29kZSwKKwkJCQkJICAubGVuICAgICA9IFBBR0VfU0laRSwKKwkJCQkJICAucHJvdCAgICA9IFBST1RfRVhFQywKKwkJCQkJICAuZmxhZ3MgICA9IE1BUF9GSVhFRCB8IE1BUF9QUklWQVRFLAorCQkJCQkgIC5mZCAgICAgID0gY29kZV9mZCwKKwkJCQkJICAub2Zmc2V0ICA9IGNvZGVfb2Zmc2V0CisJfSB9IH0pOworCW4gPSBvc193cml0ZV9maWxlKGZkLCAmbW1vcCwgc2l6ZW9mKG1tb3ApKTsKKwlpZihuICE9IHNpemVvZihtbW9wKSkKKwkJcGFuaWMoIm1hcF9zdHViX3BhZ2VzIDogL3Byb2MvbW0gbWFwIGZvciBjb2RlIGZhaWxlZCwgIgorCQkgICAgICAiZXJyID0gJWRcbiIsIC1uKTsKKworCWlmICggc3RhY2sgKSB7CisJCV9fdTY0IG1hcF9vZmZzZXQ7CisJCWludCBtYXBfZmQgPSBwaHlzX21hcHBpbmcodG9fcGh5cygodm9pZCAqKXN0YWNrKSwgJm1hcF9vZmZzZXQpOworCQltbW9wID0gKChzdHJ1Y3QgcHJvY19tbV9vcCkKKwkJCQl7IC5vcCAgICAgICAgPSBNTV9NTUFQLAorCQkJCSAgLnUgICAgICAgICA9CisJCQkJICB7IC5tbWFwICAgID0KKwkJCQkgICAgeyAuYWRkciAgICA9IGRhdGEsCisJCQkJICAgICAgLmxlbiAgICAgPSBQQUdFX1NJWkUsCisJCQkJICAgICAgLnByb3QgICAgPSBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCQkJCSAgICAgIC5mbGFncyAgID0gTUFQX0ZJWEVEIHwgTUFQX1NIQVJFRCwKKwkJCQkgICAgICAuZmQgICAgICA9IG1hcF9mZCwKKwkJCQkgICAgICAub2Zmc2V0ICA9IG1hcF9vZmZzZXQKKwkJfSB9IH0pOworCQluID0gb3Nfd3JpdGVfZmlsZShmZCwgJm1tb3AsIHNpemVvZihtbW9wKSk7CisJCWlmKG4gIT0gc2l6ZW9mKG1tb3ApKQorCQkJcGFuaWMoIm1hcF9zdHViX3BhZ2VzIDogL3Byb2MvbW0gbWFwIGZvciBkYXRhIGZhaWxlZCwgIgorCQkJICAgICAgImVyciA9ICVkXG4iLCAtbik7CisJfQorfQorCit2b2lkIG5ld190aHJlYWQodm9pZCAqc3RhY2ssIHZvaWQgKipzd2l0Y2hfYnVmX3B0ciwgdm9pZCAqKmZvcmtfYnVmX3B0ciwKKwkJdm9pZCAoKmhhbmRsZXIpKGludCkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaWdqbXBfYnVmIHN3aXRjaF9idWYsIGZvcmtfYnVmOworCWludCBlbmFibGU7CisKKwkqc3dpdGNoX2J1Zl9wdHIgPSAmc3dpdGNoX2J1ZjsKKwkqZm9ya19idWZfcHRyID0gJmZvcmtfYnVmOworCisJLyogU29tZXdoYXQgc3VidGxlIC0gc2lnbG9uZ2ptcCByZXN0b3JlcyB0aGUgc2lnbmFsIG1hc2sgYmVmb3JlIGRvaW5nCisJICogdGhlIGxvbmdqbXAuICBUaGlzIG1lYW5zIHRoYXQgd2hlbiBqdW1waW5nIGZyb20gb25lIHN0YWNrIHRvIGFub3RoZXIKKwkgKiB3aGVuIHRoZSB0YXJnZXQgc3RhY2sgaGFzIGludGVycnVwdHMgZW5hYmxlZCwgYW4gaW50ZXJydXB0IG1heSBvY2N1cgorCSAqIG9uIHRoZSBzb3VyY2Ugc3RhY2suICBUaGlzIGlzIGJhZCB3aGVuIHN0YXJ0aW5nIHVwIGEgcHJvY2VzcyBiZWNhdXNlCisJICogaXQncyBub3Qgc3VwcG9zZWQgdG8gZ2V0IHRpbWVyIHRpY2tzIHVudGlsIGl0IGhhcyBiZWVuIHNjaGVkdWxlZC4KKwkgKiBTbywgd2UgZGlzYWJsZSBpbnRlcnJ1cHRzIGFyb3VuZCB0aGUgc2lnc2V0am1wIHRvIGVuc3VyZSB0aGF0CisJICogdGhleSBjYW4ndCBoYXBwZW4gdW50aWwgd2UgZ2V0IGJhY2sgaGVyZSB3aGVyZSB0aGV5IGFyZSBzYWZlLgorCSAqLworCWZsYWdzID0gZ2V0X3NpZ25hbHMoKTsKKwlibG9ja19zaWduYWxzKCk7CisJaWYoVU1MX1NJR1NFVEpNUCgmZm9ya19idWYsIGVuYWJsZSkgPT0gMCkKKwkJbmV3X3RocmVhZF9wcm9jKHN0YWNrLCBoYW5kbGVyKTsKKworCXJlbW92ZV9zaWdzdGFjaygpOworCisJc2V0X3NpZ25hbHMoZmxhZ3MpOworfQorCit2b2lkIHRocmVhZF93YWl0KHZvaWQgKnN3LCB2b2lkICpmYikKK3sKKwlzaWdqbXBfYnVmIGJ1ZiwgKipzd2l0Y2hfYnVmID0gc3csICpmb3JrX2J1ZjsKKwlpbnQgZW5hYmxlOworCisJKnN3aXRjaF9idWYgPSAmYnVmOworCWZvcmtfYnVmID0gZmI7CisJaWYoVU1MX1NJR1NFVEpNUCgmYnVmLCBlbmFibGUpID09IDApCisJCXNpZ2xvbmdqbXAoKmZvcmtfYnVmLCBJTklUX0pNUF9SRU1PVkVfU0lHU1RBQ0spOworfQorCit2b2lkIHN3aXRjaF90aHJlYWRzKHZvaWQgKm1lLCB2b2lkICpuZXh0KQoreworCXNpZ2ptcF9idWYgbXlfYnVmLCAqKm1lX3B0ciA9IG1lLCAqbmV4dF9idWYgPSBuZXh0OworCWludCBlbmFibGU7CisKKwkqbWVfcHRyID0gJm15X2J1ZjsKKwlpZihVTUxfU0lHU0VUSk1QKCZteV9idWYsIGVuYWJsZSkgPT0gMCkKKwkJVU1MX1NJR0xPTkdKTVAobmV4dF9idWYsIDEpOworfQorCitzdGF0aWMgc2lnam1wX2J1ZiBpbml0aWFsX2ptcGJ1ZjsKKworLyogWFhYIE1ha2UgdGhlc2UgcGVyY3B1ICovCitzdGF0aWMgdm9pZCAoKmNiX3Byb2MpKHZvaWQgKmFyZyk7CitzdGF0aWMgdm9pZCAqY2JfYXJnOworc3RhdGljIHNpZ2ptcF9idWYgKmNiX2JhY2s7CisKK2ludCBzdGFydF9pZGxlX3RocmVhZCh2b2lkICpzdGFjaywgdm9pZCAqc3dpdGNoX2J1Zl9wdHIsIHZvaWQgKipmb3JrX2J1Zl9wdHIpCit7CisJc2lnam1wX2J1ZiAqKnN3aXRjaF9idWYgPSBzd2l0Y2hfYnVmX3B0cjsKKwlpbnQgbiwgZW5hYmxlOworCisJc2V0X2hhbmRsZXIoU0lHV0lOQ0gsIChfX3NpZ2hhbmRsZXJfdCkgc2lnX2hhbmRsZXIsCisJCSAgICBTQV9PTlNUQUNLIHwgU0FfUkVTVEFSVCwgU0lHVVNSMSwgU0lHSU8sIFNJR0FMUk0sCisJCSAgICBTSUdWVEFMUk0sIC0xKTsKKworCSpmb3JrX2J1Zl9wdHIgPSAmaW5pdGlhbF9qbXBidWY7CisJbiA9IFVNTF9TSUdTRVRKTVAoJmluaXRpYWxfam1wYnVmLCBlbmFibGUpOworCXN3aXRjaChuKXsKKwljYXNlIElOSVRfSk1QX05FV19USFJFQUQ6CisJCW5ld190aHJlYWRfcHJvYygodm9pZCAqKSBzdGFjaywgbmV3X3RocmVhZF9oYW5kbGVyKTsKKwkJYnJlYWs7CisJY2FzZSBJTklUX0pNUF9SRU1PVkVfU0lHU1RBQ0s6CisJCXJlbW92ZV9zaWdzdGFjaygpOworCQlicmVhazsKKwljYXNlIElOSVRfSk1QX0NBTExCQUNLOgorCQkoKmNiX3Byb2MpKGNiX2FyZyk7CisJCVVNTF9TSUdMT05HSk1QKGNiX2JhY2ssIDEpOworCQlicmVhazsKKwljYXNlIElOSVRfSk1QX0hBTFQ6CisJCWttYWxsb2Nfb2sgPSAwOworCQlyZXR1cm4oMCk7CisJY2FzZSBJTklUX0pNUF9SRUJPT1Q6CisJCWttYWxsb2Nfb2sgPSAwOworCQlyZXR1cm4oMSk7CisJZGVmYXVsdDoKKwkJcGFuaWMoIkJhZCBzaWdzZXRqbXAgcmV0dXJuIGluIHN0YXJ0X2lkbGVfdGhyZWFkIC0gJWRcbiIsIG4pOworCX0KKwlVTUxfU0lHTE9OR0pNUCgqc3dpdGNoX2J1ZiwgMSk7Cit9CisKK3ZvaWQgaW5pdGlhbF90aHJlYWRfY2Jfc2thcyh2b2lkICgqcHJvYykodm9pZCAqKSwgdm9pZCAqYXJnKQoreworCXNpZ2ptcF9idWYgaGVyZTsKKwlpbnQgZW5hYmxlOworCisJY2JfcHJvYyA9IHByb2M7CisJY2JfYXJnID0gYXJnOworCWNiX2JhY2sgPSAmaGVyZTsKKworCWJsb2NrX3NpZ25hbHMoKTsKKwlpZihVTUxfU0lHU0VUSk1QKCZoZXJlLCBlbmFibGUpID09IDApCisJCVVNTF9TSUdMT05HSk1QKCZpbml0aWFsX2ptcGJ1ZiwgSU5JVF9KTVBfQ0FMTEJBQ0spOworCXVuYmxvY2tfc2lnbmFscygpOworCisJY2JfcHJvYyA9IE5VTEw7CisJY2JfYXJnID0gTlVMTDsKKwljYl9iYWNrID0gTlVMTDsKK30KKwordm9pZCBoYWx0X3NrYXModm9pZCkKK3sKKwlibG9ja19zaWduYWxzKCk7CisJVU1MX1NJR0xPTkdKTVAoJmluaXRpYWxfam1wYnVmLCBJTklUX0pNUF9IQUxUKTsKK30KKwordm9pZCByZWJvb3Rfc2thcyh2b2lkKQoreworCWJsb2NrX3NpZ25hbHMoKTsKKwlVTUxfU0lHTE9OR0pNUCgmaW5pdGlhbF9qbXBidWYsIElOSVRfSk1QX1JFQk9PVCk7Cit9CisKK3ZvaWQgc3dpdGNoX21tX3NrYXMoc3RydWN0IG1tX2lkICptbV9pZHApCit7CisJaW50IGVycjsKKworI3dhcm5pbmcgbmVlZCBjcHUgcGlkIGluIHN3aXRjaF9tbV9za2FzCisJaWYocHJvY19tbSl7CisJCWVyciA9IHB0cmFjZShQVFJBQ0VfU1dJVENIX01NLCB1c2Vyc3BhY2VfcGlkWzBdLCAwLAorCQkJICAgICBtbV9pZHAtPnUubW1fZmQpOworCQlpZihlcnIpCisJCQlwYW5pYygic3dpdGNoX21tX3NrYXMgLSBQVFJBQ0VfU1dJVENIX01NIGZhaWxlZCwgIgorCQkJICAgICAgImVycm5vID0gJWRcbiIsIGVycm5vKTsKKwl9CisJZWxzZSB1c2Vyc3BhY2VfcGlkWzBdID0gbW1faWRwLT51LnBpZDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc2thcy90cmFwLmMgYi9hcmNoL3VtL29zLUxpbnV4L3NrYXMvdHJhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZDVmYmVjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9vcy1MaW51eC9za2FzL3RyYXAuYwpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwMyBKZWZmIERpa2UgKGpkaWtlQGFkZHRvaXQuY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgInVzZXJfdXRpbC5oIgorI2luY2x1ZGUgImtlcm5fdXRpbC5oIgorI2luY2x1ZGUgInRhc2suaCIKKyNpbmNsdWRlICJzaWdjb250ZXh0LmgiCisjaW5jbHVkZSAic2thcy5oIgorI2luY2x1ZGUgInB0cmFjZV91c2VyLmgiCisjaW5jbHVkZSAic3lzZGVwL3B0cmFjZS5oIgorI2luY2x1ZGUgInN5c2RlcC9wdHJhY2VfdXNlci5oIgorI2luY2x1ZGUgIm9zLmgiCisKK3ZvaWQgc2lnX2hhbmRsZXJfY29tbW9uX3NrYXMoaW50IHNpZywgdm9pZCAqc2NfcHRyKQoreworCXN0cnVjdCBzaWdjb250ZXh0ICpzYyA9IHNjX3B0cjsKKwlzdHJ1Y3Qgc2thc19yZWdzICpyOworCXZvaWQgKCpoYW5kbGVyKShpbnQsIHVuaW9uIHVtbF9wdF9yZWdzICopOworCWludCBzYXZlX2Vycm5vID0gZXJybm87CisJaW50IHNhdmVfdXNlcjsKKworCS8qIFRoaXMgaXMgZG9uZSBiZWNhdXNlIHRvIGFsbG93IFNJR1NFR1YgdG8gYmUgZGVsaXZlcmVkIGluc2lkZSBhIFNFR1YKKwkgKiBoYW5kbGVyLiAgVGhpcyBjYW4gaGFwcGVuIGluIGNvcHlfdXNlciwgYW5kIGlmIFNFR1YgaXMgZGlzYWJsZWQsCisJICogdGhlIHByb2Nlc3Mgd2lsbCBkaWUuCisJICogWFhYIEZpZ3VyZSBvdXQgd2h5IHRoaXMgaXMgYmV0dGVyIHRoYW4gU0FfTk9ERUZFUgorCSAqLworCWlmKHNpZyA9PSBTSUdTRUdWKQorCQljaGFuZ2Vfc2lnKFNJR1NFR1YsIDEpOworCisJciA9ICZUQVNLX1JFR1MoZ2V0X2N1cnJlbnQoKSktPnNrYXM7CisJc2F2ZV91c2VyID0gci0+aXNfdXNlcjsKKwlyLT5pc191c2VyID0gMDsKKwlpZiAoIHNpZyA9PSBTSUdGUEUgfHwgc2lnID09IFNJR1NFR1YgfHwKKwkgICAgIHNpZyA9PSBTSUdCVVMgfHwgc2lnID09IFNJR0lMTCB8fAorCSAgICAgc2lnID09IFNJR1RSQVAgKSB7CisJCUdFVF9GQVVMVElORk9fRlJPTV9TQyhyLT5mYXVsdGluZm8sIHNjKTsKKwl9CisKKwljaGFuZ2Vfc2lnKFNJR1VTUjEsIDEpOworCisJaGFuZGxlciA9IHNpZ19pbmZvW3NpZ107CisKKwkvKiB1bmJsb2NrIFNJR0FMUk0sIFNJR1ZUQUxSTSwgU0lHSU8gaWYgc2lnIGlzbid0IElSUSBzaWduYWwgKi8KKwlpZiAoc2lnICE9IFNJR0lPICYmIHNpZyAhPSBTSUdXSU5DSCAmJgorCSAgICBzaWcgIT0gU0lHVlRBTFJNICYmIHNpZyAhPSBTSUdBTFJNKQorCQl1bmJsb2NrX3NpZ25hbHMoKTsKKworCWhhbmRsZXIoc2lnLCAodW5pb24gdW1sX3B0X3JlZ3MgKikgcik7CisKKwllcnJubyA9IHNhdmVfZXJybm87CisJci0+aXNfdXNlciA9IHNhdmVfdXNlcjsKK30KKworZXh0ZXJuIGludCBwdHJhY2VfZmF1bHRpbmZvOworCit2b2lkIHVzZXJfc2lnbmFsKGludCBzaWcsIHVuaW9uIHVtbF9wdF9yZWdzICpyZWdzLCBpbnQgcGlkKQoreworCXZvaWQgKCpoYW5kbGVyKShpbnQsIHVuaW9uIHVtbF9wdF9yZWdzICopOworCWludCBzZWd2ID0gKChzaWcgPT0gU0lHRlBFKSB8fCAoc2lnID09IFNJR1NFR1YpIHx8IChzaWcgPT0gU0lHQlVTKSB8fAorCQkgICAgKHNpZyA9PSBTSUdJTEwpIHx8IChzaWcgPT0gU0lHVFJBUCkpOworCisJaWYgKHNlZ3YpCisJCWdldF9za2FzX2ZhdWx0aW5mbyhwaWQsICZyZWdzLT5za2FzLmZhdWx0aW5mbyk7CisKKwloYW5kbGVyID0gc2lnX2luZm9bc2lnXTsKKwloYW5kbGVyKHNpZywgKHVuaW9uIHVtbF9wdF9yZWdzICopIHJlZ3MpOworCisJdW5ibG9ja19zaWduYWxzKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3N0YXJ0X3VwLmMgYi9hcmNoL3VtL29zLUxpbnV4L3N0YXJ0X3VwLmMKaW5kZXggMjlhOWUzZi4uNmM1YjE3ZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9zdGFydF91cC5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvc3RhcnRfdXAuYwpAQCAtMjQsMTMgKzI0LDExIEBACiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgInNpZ25hbF9rZXJuLmgiCi0jaW5jbHVkZSAic2lnbmFsX3VzZXIuaCIKICNpbmNsdWRlICJzeXNkZXAvcHRyYWNlLmgiCiAjaW5jbHVkZSAic3lzZGVwL3NpZ2NvbnRleHQuaCIKICNpbmNsdWRlICJpcnFfdXNlci5oIgogI2luY2x1ZGUgInB0cmFjZV91c2VyLmgiCiAjaW5jbHVkZSAibWVtX3VzZXIuaCIKLSNpbmNsdWRlICJ0aW1lX3VzZXIuaCIKICNpbmNsdWRlICJpbml0LmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJ1bWwtY29uZmlnLmgiCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3RpbWUuYyBiL2FyY2gvdW0vb3MtTGludXgvdGltZS5jCmluZGV4IGNmMzBhMzkuLjZmNzYyNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvdGltZS5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvdGltZS5jCkBAIC0xLDIxICsxLDEyOCBAQAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+CisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLwogCi11bnNpZ25lZCBsb25nIGxvbmcgb3NfdXNlY3Modm9pZCkKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAidXNlcl91dGlsLmgiCisjaW5jbHVkZSAia2Vybl91dGlsLmgiCisjaW5jbHVkZSAidXNlci5oIgorI2luY2x1ZGUgInByb2Nlc3MuaCIKKyNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgorI2luY2x1ZGUgIm9zLmgiCisKKy8qIFhYWCBUaGlzIHJlYWxseSBuZWVkcyB0byBiZSBkZWNsYXJlZCBhbmQgaW5pdGlhbGl6ZWQgaW4gYSBrZXJuZWwgZmlsZSBzaW5jZQorICogaXQncyBpbiA8bGludXgvdGltZS5oPgorICovCitleHRlcm4gc3RydWN0IHRpbWVzcGVjIHdhbGxfdG9fbW9ub3RvbmljOworCitzdGF0aWMgdm9pZCBzZXRfaW50ZXJ2YWwoaW50IHRpbWVyX3R5cGUpCit7CisJaW50IHVzZWMgPSAxMDAwMDAwL2h6KCk7CisJc3RydWN0IGl0aW1lcnZhbCBpbnRlcnZhbCA9ICgoc3RydWN0IGl0aW1lcnZhbCkgeyB7IDAsIHVzZWMgfSwKKwkJCQkJCQkgIHsgMCwgdXNlYyB9IH0pOworCisJaWYoc2V0aXRpbWVyKHRpbWVyX3R5cGUsICZpbnRlcnZhbCwgTlVMTCkgPT0gLTEpCisJCXBhbmljKCJzZXRpdGltZXIgZmFpbGVkIC0gZXJybm8gPSAlZFxuIiwgZXJybm8pOworfQorCit2b2lkIGVuYWJsZV90aW1lcih2b2lkKQoreworCXNldF9pbnRlcnZhbChJVElNRVJfVklSVFVBTCk7Cit9CisKK3ZvaWQgZGlzYWJsZV90aW1lcih2b2lkKQoreworCXN0cnVjdCBpdGltZXJ2YWwgZGlzYWJsZSA9ICgoc3RydWN0IGl0aW1lcnZhbCkgeyB7IDAsIDAgfSwgeyAwLCAwIH19KTsKKwlpZigoc2V0aXRpbWVyKElUSU1FUl9WSVJUVUFMLCAmZGlzYWJsZSwgTlVMTCkgPCAwKSB8fAorCSAgIChzZXRpdGltZXIoSVRJTUVSX1JFQUwsICZkaXNhYmxlLCBOVUxMKSA8IDApKQorCQlwcmludGsoImRpc25hYmxlX3RpbWVyIC0gc2V0aXRpbWVyIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwKKwkJICAgICAgIGVycm5vKTsKKwkvKiBJZiB0aGVyZSBhcmUgc2lnbmFscyBhbHJlYWR5IHF1ZXVlZCwgYWZ0ZXIgdW5ibG9ja2luZyBpZ25vcmUgdGhlbSAqLworCXNldF9oYW5kbGVyKFNJR0FMUk0sIFNJR19JR04sIDAsIC0xKTsKKwlzZXRfaGFuZGxlcihTSUdWVEFMUk0sIFNJR19JR04sIDAsIC0xKTsKK30KKwordm9pZCBzd2l0Y2hfdGltZXJzKGludCB0b19yZWFsKQoreworCXN0cnVjdCBpdGltZXJ2YWwgZGlzYWJsZSA9ICgoc3RydWN0IGl0aW1lcnZhbCkgeyB7IDAsIDAgfSwgeyAwLCAwIH19KTsKKwlzdHJ1Y3QgaXRpbWVydmFsIGVuYWJsZSA9ICgoc3RydWN0IGl0aW1lcnZhbCkgeyB7IDAsIDEwMDAwMDAvaHooKSB9LAorCQkJCQkJCXsgMCwgMTAwMDAwMC9oeigpIH19KTsKKwlpbnQgb2xkLCBuZXc7CisKKwlpZih0b19yZWFsKXsKKwkJb2xkID0gSVRJTUVSX1ZJUlRVQUw7CisJCW5ldyA9IElUSU1FUl9SRUFMOworCX0KKwllbHNlIHsKKwkJb2xkID0gSVRJTUVSX1JFQUw7CisJCW5ldyA9IElUSU1FUl9WSVJUVUFMOworCX0KKworCWlmKChzZXRpdGltZXIob2xkLCAmZGlzYWJsZSwgTlVMTCkgPCAwKSB8fAorCSAgIChzZXRpdGltZXIobmV3LCAmZW5hYmxlLCBOVUxMKSkpCisJCXByaW50aygic3dpdGNoX3RpbWVycyAtIHNldGl0aW1lciBmYWlsZWQsIGVycm5vID0gJWRcbiIsCisJCSAgICAgICBlcnJubyk7Cit9CisKK3ZvaWQgdW1sX2lkbGVfdGltZXIodm9pZCkKK3sKKwlpZihzaWduYWwoU0lHVlRBTFJNLCBTSUdfSUdOKSA9PSBTSUdfRVJSKQorCQlwYW5pYygiQ291bGRuJ3QgdW5zZXQgU0lHVlRBTFJNIGhhbmRsZXIiKTsKKworCXNldF9oYW5kbGVyKFNJR0FMUk0sIChfX3NpZ2hhbmRsZXJfdCkgYWxhcm1faGFuZGxlciwKKwkJICAgIFNBX1JFU1RBUlQsIFNJR1VTUjEsIFNJR0lPLCBTSUdXSU5DSCwgU0lHVlRBTFJNLCAtMSk7CisJc2V0X2ludGVydmFsKElUSU1FUl9SRUFMKTsKK30KKworZXh0ZXJuIHZvaWQga3RpbWVfZ2V0X3RzKHN0cnVjdCB0aW1lc3BlYyAqdHMpOworI2RlZmluZSBkb19wb3NpeF9jbG9ja19tb25vdG9uaWNfZ2V0dGltZSh0cykga3RpbWVfZ2V0X3RzKHRzKQorCit2b2lkIHRpbWVfaW5pdCh2b2lkKQoreworCXN0cnVjdCB0aW1lc3BlYyBub3c7CisKKwlpZihzaWduYWwoU0lHVlRBTFJNLCBib290X3RpbWVyX2hhbmRsZXIpID09IFNJR19FUlIpCisJCXBhbmljKCJDb3VsZG4ndCBzZXQgU0lHVlRBTFJNIGhhbmRsZXIiKTsKKwlzZXRfaW50ZXJ2YWwoSVRJTUVSX1ZJUlRVQUwpOworCisJZG9fcG9zaXhfY2xvY2tfbW9ub3RvbmljX2dldHRpbWUoJm5vdyk7CisJd2FsbF90b19tb25vdG9uaWMudHZfc2VjID0gLW5vdy50dl9zZWM7CisJd2FsbF90b19tb25vdG9uaWMudHZfbnNlYyA9IC1ub3cudHZfbnNlYzsKK30KKwordW5zaWduZWQgbG9uZyBsb25nIG9zX25zZWNzKHZvaWQpCiB7CiAJc3RydWN0IHRpbWV2YWwgdHY7CiAKIAlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKLQlyZXR1cm4oKHVuc2lnbmVkIGxvbmcgbG9uZykgdHYudHZfc2VjICogMTAwMDAwMCArIHR2LnR2X3VzZWMpOworCXJldHVybigodW5zaWduZWQgbG9uZyBsb25nKSB0di50dl9zZWMgKiBCSUxMSU9OICsgdHYudHZfdXNlYyAqIDEwMDApOwogfQogCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwordm9pZCBpZGxlX3NsZWVwKGludCBzZWNzKQoreworCXN0cnVjdCB0aW1lc3BlYyB0czsKKworCXRzLnR2X3NlYyA9IHNlY3M7CisJdHMudHZfbnNlYyA9IDA7CisJbmFub3NsZWVwKCZ0cywgTlVMTCk7Cit9CisKKy8qIFhYWCBUaGlzIHBhcnRseSBkdXBsaWNhdGVzIGluaXRfaXJxX3NpZ25hbHMgKi8KKwordm9pZCB1c2VyX3RpbWVfaW5pdCh2b2lkKQoreworCXNldF9oYW5kbGVyKFNJR1ZUQUxSTSwgKF9fc2lnaGFuZGxlcl90KSBhbGFybV9oYW5kbGVyLAorCQkgICAgU0FfT05TVEFDSyB8IFNBX1JFU1RBUlQsIFNJR1VTUjEsIFNJR0lPLCBTSUdXSU5DSCwKKwkJICAgIFNJR0FMUk0sIFNJR1VTUjIsIC0xKTsKKwlzZXRfaGFuZGxlcihTSUdBTFJNLCAoX19zaWdoYW5kbGVyX3QpIGFsYXJtX2hhbmRsZXIsCisJCSAgICBTQV9PTlNUQUNLIHwgU0FfUkVTVEFSVCwgU0lHVVNSMSwgU0lHSU8sIFNJR1dJTkNILAorCQkgICAgU0lHVlRBTFJNLCBTSUdVU1IyLCAtMSk7CisJc2V0X2ludGVydmFsKElUSU1FUl9WSVJUVUFMKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvdHJhcC5jIGIvYXJjaC91bS9vcy1MaW51eC90cmFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmNmIyNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdW0vb3MtTGludXgvdHJhcC5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlICJrZXJuX3V0aWwuaCIKKyNpbmNsdWRlICJ1c2VyX3V0aWwuaCIKKyNpbmNsdWRlICJvcy5oIgorI2luY2x1ZGUgIm1vZGUuaCIKKyNpbmNsdWRlICJsb25nam1wLmgiCisKK3ZvaWQgdXNyMl9oYW5kbGVyKGludCBzaWcsIHVuaW9uIHVtbF9wdF9yZWdzICpyZWdzKQoreworCUNIT09TRV9NT0RFKHN5c2NhbGxfaGFuZGxlcl90dChzaWcsIHJlZ3MpLCAodm9pZCkgMCk7Cit9CisKK3ZvaWQgKCpzaWdfaW5mb1tOU0lHXSkoaW50LCB1bmlvbiB1bWxfcHRfcmVncyAqKTsKKwordm9pZCBvc19maWxsX2hhbmRsaW5mbyhzdHJ1Y3Qga2Vybl9oYW5kbGVycyBoKQoreworCXNpZ19pbmZvW1NJR1RSQVBdID0gaC5yZWxheV9zaWduYWw7CisJc2lnX2luZm9bU0lHRlBFXSA9IGgucmVsYXlfc2lnbmFsOworCXNpZ19pbmZvW1NJR0lMTF0gPSBoLnJlbGF5X3NpZ25hbDsKKwlzaWdfaW5mb1tTSUdXSU5DSF0gPSBoLndpbmNoOworCXNpZ19pbmZvW1NJR0JVU10gPSBoLmJ1c19oYW5kbGVyOworCXNpZ19pbmZvW1NJR1NFR1ZdID0gaC5wYWdlX2ZhdWx0OworCXNpZ19pbmZvW1NJR0lPXSA9IGguc2lnaW9faGFuZGxlcjsKKwlzaWdfaW5mb1tTSUdWVEFMUk1dID0gaC50aW1lcl9oYW5kbGVyOworCXNpZ19pbmZvW1NJR0FMUk1dID0gaC50aW1lcl9oYW5kbGVyOworCXNpZ19pbmZvW1NJR1VTUjJdID0gdXNyMl9oYW5kbGVyOworfQorCit2b2lkIGRvX2xvbmdqbXAodm9pZCAqYiwgaW50IHZhbCkKK3sKKwlzaWdqbXBfYnVmICpidWYgPSBiOworCisJVU1MX1NJR0xPTkdKTVAoYnVmLCB2YWwpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC90dC5jIGIvYXJjaC91bS9vcy1MaW51eC90dC5jCmluZGV4IGE2ZGI4ODcuLjkxOWQxOWYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvdHQuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3R0LmMKQEAgLTIzLDEyICsyMywxMCBAQAogI2luY2x1ZGUgImtlcm5fdXRpbC5oIgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJzaWduYWxfa2Vybi5oIgotI2luY2x1ZGUgInNpZ25hbF91c2VyLmgiCiAjaW5jbHVkZSAic3lzZGVwL3B0cmFjZS5oIgogI2luY2x1ZGUgInN5c2RlcC9zaWdjb250ZXh0LmgiCiAjaW5jbHVkZSAiaXJxX3VzZXIuaCIKICNpbmNsdWRlICJwdHJhY2VfdXNlci5oIgotI2luY2x1ZGUgInRpbWVfdXNlci5oIgogI2luY2x1ZGUgImluaXQuaCIKICNpbmNsdWRlICJvcy5oIgogI2luY2x1ZGUgInVtbC1jb25maWcuaCIKQEAgLTUwLDYgKzQ4LDY4IEBACiAJcmV0dXJuKDApOwogfQogCit2b2lkIGtpbGxfY2hpbGRfZGVhZChpbnQgcGlkKQoreworCWtpbGwocGlkLCBTSUdLSUxMKTsKKwlraWxsKHBpZCwgU0lHQ09OVCk7CisJZG8geworCQlpbnQgbjsKKwkJQ0FUQ0hfRUlOVFIobiA9IHdhaXRwaWQocGlkLCBOVUxMLCAwKSk7CisJCWlmIChuID4gMCkKKwkJCWtpbGwocGlkLCBTSUdDT05UKTsKKwkJZWxzZQorCQkJYnJlYWs7CisJfSB3aGlsZSgxKTsKK30KKwordm9pZCBzdG9wKHZvaWQpCit7CisJd2hpbGUoMSkgc2xlZXAoMTAwMDAwMCk7Cit9CisKK2ludCB3YWl0X2Zvcl9zdG9wKGludCBwaWQsIGludCBzaWcsIGludCBjb250X3R5cGUsIHZvaWQgKnJlbGF5KQoreworCXNpZ3NldF90ICpyZWxheV9zaWduYWxzID0gcmVsYXk7CisJaW50IHN0YXR1cywgcmV0OworCisJd2hpbGUoMSl7CisJCUNBVENIX0VJTlRSKHJldCA9IHdhaXRwaWQocGlkLCAmc3RhdHVzLCBXVU5UUkFDRUQpKTsKKwkJaWYoKHJldCA8IDApIHx8CisJCSAgICFXSUZTVE9QUEVEKHN0YXR1cykgfHwgKFdTVE9QU0lHKHN0YXR1cykgIT0gc2lnKSl7CisJCQlpZihyZXQgPCAwKXsKKwkJCQlwcmludGsoIndhaXQgZmFpbGVkLCBlcnJubyA9ICVkXG4iLAorCQkJCSAgICAgICBlcnJubyk7CisJCQl9CisJCQllbHNlIGlmKFdJRkVYSVRFRChzdGF0dXMpKQorCQkJCXByaW50aygicHJvY2VzcyAlZCBleGl0ZWQgd2l0aCBzdGF0dXMgJWRcbiIsCisJCQkJICAgICAgIHBpZCwgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CisJCQllbHNlIGlmKFdJRlNJR05BTEVEKHN0YXR1cykpCisJCQkJcHJpbnRrKCJwcm9jZXNzICVkIGV4aXRlZCB3aXRoIHNpZ25hbCAlZFxuIiwKKwkJCQkgICAgICAgcGlkLCBXVEVSTVNJRyhzdGF0dXMpKTsKKwkJCWVsc2UgaWYoKFdTVE9QU0lHKHN0YXR1cykgPT0gU0lHVlRBTFJNKSB8fAorCQkJCShXU1RPUFNJRyhzdGF0dXMpID09IFNJR0FMUk0pIHx8CisJCQkJKFdTVE9QU0lHKHN0YXR1cykgPT0gU0lHSU8pIHx8CisJCQkJKFdTVE9QU0lHKHN0YXR1cykgPT0gU0lHUFJPRikgfHwKKwkJCQkoV1NUT1BTSUcoc3RhdHVzKSA9PSBTSUdDSExEKSB8fAorCQkJCShXU1RPUFNJRyhzdGF0dXMpID09IFNJR1dJTkNIKSB8fAorCQkJCShXU1RPUFNJRyhzdGF0dXMpID09IFNJR0lOVCkpeworCQkJCXB0cmFjZShjb250X3R5cGUsIHBpZCwgMCwgV1NUT1BTSUcoc3RhdHVzKSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQllbHNlIGlmKChyZWxheV9zaWduYWxzICE9IE5VTEwpICYmCisJCQkJc2lnaXNtZW1iZXIocmVsYXlfc2lnbmFscywgV1NUT1BTSUcoc3RhdHVzKSkpeworCQkJCXB0cmFjZShjb250X3R5cGUsIHBpZCwgMCwgV1NUT1BTSUcoc3RhdHVzKSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQllbHNlIHByaW50aygicHJvY2VzcyAlZCBzdG9wcGVkIHdpdGggc2lnbmFsICVkXG4iLAorCQkJCSAgICBwaWQsIFdTVE9QU0lHKHN0YXR1cykpOworCQkJcGFuaWMoIndhaXRfZm9yX3N0b3AgZmFpbGVkIHRvIHdhaXQgZm9yICVkIHRvIHN0b3AgIgorCQkJICAgICAgIndpdGggJWRcbiIsIHBpZCwgc2lnKTsKKwkJfQorCQlyZXR1cm4oc3RhdHVzKTsKKwl9Cit9CisKIC8qCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIG9ubHkgZm9yIHR0IG1vZGUgKHdpbGwgYmUgZGVsZXRlZCBpbiBmdXR1cmUuLi4pCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3VhY2Nlc3MuYyBiL2FyY2gvdW0vb3MtTGludXgvdWFjY2Vzcy5jCmluZGV4IDM4ZDcxMDEuLjE2NmZiNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvdWFjY2Vzcy5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvdWFjY2Vzcy5jCkBAIC02LDYgKzYsNyBAQAogCiAjaW5jbHVkZSA8c2V0am1wLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAibG9uZ2ptcC5oIgogCiB1bnNpZ25lZCBsb25nIF9fZG9fdXNlcl9jb3B5KHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbiwKIAkJCSAgICAgdm9pZCAqKmZhdWx0X2FkZHIsIHZvaWQgKipmYXVsdF9jYXRjaGVyLApAQCAtMTMsMTAgKzE0LDExIEBACiAJCQkJCWludCBuKSwgaW50ICpmYXVsdGVkX291dCkKIHsKIAl1bnNpZ25lZCBsb25nICpmYWRkcnAgPSAodW5zaWduZWQgbG9uZyAqKSBmYXVsdF9hZGRyLCByZXQ7CisJaW50IGVuYWJsZTsKIAogCXNpZ2ptcF9idWYgamJ1ZjsKIAkqZmF1bHRfY2F0Y2hlciA9ICZqYnVmOwotCWlmKHNpZ3NldGptcChqYnVmLCAxKSA9PSAwKXsKKwlpZihVTUxfU0lHU0VUSk1QKCZqYnVmLCBlbmFibGUpID09IDApewogCQkoKm9wKSh0bywgZnJvbSwgbik7CiAJCXJldCA9IDA7CiAJCSpmYXVsdGVkX291dCA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3V0aWwuYyBiL2FyY2gvdW0vb3MtTGludXgvdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjA2NWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL29zLUxpbnV4L3V0aWwuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlICJhc20vdHlwZXMuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHdhaXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInVzZXJfdXRpbC5oIgorI2luY2x1ZGUgImtlcm5fdXRpbC5oIgorI2luY2x1ZGUgInVzZXIuaCIKKyNpbmNsdWRlICJtZW1fdXNlci5oIgorI2luY2x1ZGUgImluaXQuaCIKKyNpbmNsdWRlICJwdHJhY2VfdXNlci5oIgorI2luY2x1ZGUgInVtbC1jb25maWcuaCIKKyNpbmNsdWRlICJvcy5oIgorI2luY2x1ZGUgImxvbmdqbXAuaCIKKwordm9pZCBzdGFja19wcm90ZWN0aW9ucyh1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJaW50IHByb3QgPSBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFIHwgUFJPVF9FWEVDOworCisJaWYobXByb3RlY3QoKHZvaWQgKikgYWRkcmVzcywgcGFnZV9zaXplKCksIHByb3QpIDwgMCkKKwkJcGFuaWMoInByb3RlY3Rpbmcgc3RhY2sgZmFpbGVkLCBlcnJubyA9ICVkIiwgZXJybm8pOworfQorCit2b2lkIHRhc2tfcHJvdGVjdGlvbnModW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXVuc2lnbmVkIGxvbmcgZ3VhcmQgPSBhZGRyZXNzICsgcGFnZV9zaXplKCk7CisJdW5zaWduZWQgbG9uZyBzdGFjayA9IGd1YXJkICsgcGFnZV9zaXplKCk7CisJaW50IHByb3QgPSAwLCBwYWdlczsKKworI2lmZGVmIG5vdGRlZgorCWlmKG1wcm90ZWN0KCh2b2lkICopIHN0YWNrLCBwYWdlX3NpemUoKSwgcHJvdCkgPCAwKQorCQlwYW5pYygicHJvdGVjdGluZyBndWFyZCBwYWdlIGZhaWxlZCwgZXJybm8gPSAlZCIsIGVycm5vKTsKKyNlbmRpZgorCXBhZ2VzID0gKDEgPDwgVU1MX0NPTkZJR19LRVJORUxfU1RBQ0tfT1JERVIpIC0gMjsKKwlwcm90ID0gUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQzsKKwlpZihtcHJvdGVjdCgodm9pZCAqKSBzdGFjaywgcGFnZXMgKiBwYWdlX3NpemUoKSwgcHJvdCkgPCAwKQorCQlwYW5pYygicHJvdGVjdGluZyBzdGFjayBmYWlsZWQsIGVycm5vID0gJWQiLCBlcnJubyk7Cit9CisKK2ludCByYXcoaW50IGZkKQoreworCXN0cnVjdCB0ZXJtaW9zIHR0OworCWludCBlcnI7CisKKwlDQVRDSF9FSU5UUihlcnIgPSB0Y2dldGF0dHIoZmQsICZ0dCkpOworCWlmKGVyciA8IDApCisJCXJldHVybiAtZXJybm87CisKKwljZm1ha2VyYXcoJnR0KTsKKworCUNBVENIX0VJTlRSKGVyciA9IHRjc2V0YXR0cihmZCwgVENTQURSQUlOLCAmdHQpKTsKKwlpZihlcnIgPCAwKQorCQlyZXR1cm4gLWVycm5vOworCisJLyogWFhYIHRjc2V0YXR0ciBjb3VsZCBoYXZlIGFwcGxpZWQgb25seSBzb21lIGNoYW5nZXMKKwkgKiAoYW5kIGNmbWFrZXJhdygpIGlzIGEgc2V0IG9mIGNoYW5nZXMpICovCisJcmV0dXJuKDApOworfQorCit2b2lkIHNldHVwX21hY2hpbmVuYW1lKGNoYXIgKm1hY2hpbmVfb3V0KQoreworCXN0cnVjdCB1dHNuYW1lIGhvc3Q7CisKKwl1bmFtZSgmaG9zdCk7CisjaWYgZGVmaW5lZChVTUxfQ09ORklHX1VNTF9YODYpICYmICFkZWZpbmVkKFVNTF9DT05GSUdfNjRCSVQpCisJaWYgKCFzdHJjbXAoaG9zdC5tYWNoaW5lLCAieDg2XzY0IikpIHsKKwkJc3RyY3B5KG1hY2hpbmVfb3V0LCAiaTY4NiIpOworCQlyZXR1cm47CisJfQorI2VuZGlmCisJc3RyY3B5KG1hY2hpbmVfb3V0LCBob3N0Lm1hY2hpbmUpOworfQorCitjaGFyIGhvc3RfaW5mb1soX1VUU05BTUVfTEVOR1RIICsgMSkgKiA0ICsgX1VUU05BTUVfTk9ERU5BTUVfTEVOR1RIICsgMV07CisKK3ZvaWQgc2V0dXBfaG9zdGluZm8odm9pZCkKK3sKKwlzdHJ1Y3QgdXRzbmFtZSBob3N0OworCisJdW5hbWUoJmhvc3QpOworCXNwcmludGYoaG9zdF9pbmZvLCAiJXMgJXMgJXMgJXMgJXMiLCBob3N0LnN5c25hbWUsIGhvc3Qubm9kZW5hbWUsCisJCWhvc3QucmVsZWFzZSwgaG9zdC52ZXJzaW9uLCBob3N0Lm1hY2hpbmUpOworfQorCitpbnQgc2V0am1wX3dyYXBwZXIodm9pZCAoKnByb2MpKHZvaWQgKiwgdm9pZCAqKSwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlzaWdqbXBfYnVmIGJ1ZjsKKwlpbnQgbjsKKworCW4gPSBzaWdzZXRqbXAoYnVmLCAxKTsKKwlpZihuID09IDApeworCQl2YV9zdGFydChhcmdzLCBwcm9jKTsKKwkJKCpwcm9jKSgmYnVmLCAmYXJncyk7CisJfQorCXZhX2VuZChhcmdzKTsKKwlyZXR1cm4obik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L2tlcm5lbC1vZmZzZXRzLmMgYi9hcmNoL3VtL3N5cy1pMzg2L2tlcm5lbC1vZmZzZXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZGI4NTAuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9rZXJuZWwtb2Zmc2V0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0KLSNkZWZpbmUgREVGSU5FKHN5bSwgdmFsKSBcCi0gICAgICAgIGFzbSB2b2xhdGlsZSgiXG4tPiIgI3N5bSAiICUwICIgI3ZhbCA6IDogImkiICh2YWwpKQotCi0jZGVmaW5lIFNUUih4KSAjeAotI2RlZmluZSBERUZJTkVfU1RSKHN5bSwgdmFsKSBhc20gdm9sYXRpbGUoIlxuLT4iICNzeW0gIiAiIFNUUih2YWwpICIgIiAjdmFsOiA6ICkKLQotI2RlZmluZSBCTEFOSygpIGFzbSB2b2xhdGlsZSgiXG4tPiIgOiA6ICkKLQotI2RlZmluZSBPRkZTRVQoc3ltLCBzdHIsIG1lbSkgXAotCURFRklORShzeW0sIG9mZnNldG9mKHN0cnVjdCBzdHIsIG1lbSkpOwotCi12b2lkIGZvbyh2b2lkKQotewotCU9GRlNFVChIT1NUX1RBU0tfREVCVUdSRUdTLCB0YXNrX3N0cnVjdCwgdGhyZWFkLmFyY2guZGVidWdyZWdzKTsKLSNpZmRlZiBDT05GSUdfTU9ERV9UVAotCU9GRlNFVChIT1NUX1RBU0tfRVhURVJOX1BJRCwgdGFza19zdHJ1Y3QsIHRocmVhZC5tb2RlLnR0LmV4dGVybl9waWQpOwotI2VuZGlmCi0jaW5jbHVkZSA8Y29tbW9uLW9mZnNldHMuaD4KLX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvbGR0LmMgYi9hcmNoL3VtL3N5cy1pMzg2L2xkdC5jCmluZGV4IDE3NzQ2YjQuLjBjZGZkNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vc3lzLWkzODYvbGR0LmMKKysrIGIvYXJjaC91bS9zeXMtaTM4Ni9sZHQuYwpAQCAtMTYsNiArMTYsOCBAQAogI2luY2x1ZGUgImNob29zZS1tb2RlLmgiCiAjaW5jbHVkZSAia2Vybi5oIgogI2luY2x1ZGUgIm1vZGVfa2Vybi5oIgorI2luY2x1ZGUgInByb2NfbW0uaCIKKyNpbmNsdWRlICJvcy5oIgogCiBleHRlcm4gaW50IG1vZGlmeV9sZHQoaW50IGZ1bmMsIHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyBieXRlY291bnQpOwogCkBAIC00NTYsMTMgKzQ1OCwxNCBAQAogCWludCBpOwogCWxvbmcgcGFnZSwgZXJyPTA7CiAJdm9pZCAqYWRkciA9IE5VTEw7CisJc3RydWN0IHByb2NfbW1fb3AgY29weTsKIAotCW1lbXNldCgmZGVzYywgMCwgc2l6ZW9mKGRlc2MpKTsKIAogCWlmKCFwdHJhY2VfbGR0KQogCQlpbml0X01VVEVYKCZuZXdfbW0tPmxkdC5zZW1hcGhvcmUpOwogCiAJaWYoIWZyb21fbW0peworCQltZW1zZXQoJmRlc2MsIDAsIHNpemVvZihkZXNjKSk7CiAJCS8qCiAJCSAqIFdlIGhhdmUgdG8gaW5pdGlhbGl6ZSBhIGNsZWFuIGxkdC4KIAkJICovCkBAIC00OTQsOCArNDk3LDI2IEBACiAJCQl9CiAJCX0KIAkJbmV3X21tLT5sZHQuZW50cnlfY291bnQgPSAwOworCisJCWdvdG8gb3V0OwogCX0KLQllbHNlIGlmICghcHRyYWNlX2xkdCkgeworCisJaWYocHJvY19tbSl7CisJCS8qIFdlIGhhdmUgYSB2YWxpZCBmcm9tX21tLCBzbyB3ZSBub3cgaGF2ZSB0byBjb3B5IHRoZSBMRFQgb2YKKwkJICogZnJvbV9tbSB0byBuZXdfbW0sIGJlY2F1c2UgdXNpbmcgcHJvY19tbSBhbiBuZXcgbW0gd2l0aAorCQkgKiBhbiBlbXB0eS9kZWZhdWx0IExEVCB3YXMgY3JlYXRlZCBpbiBuZXdfbW0oKQorCQkgKi8KKwkJY29weSA9ICgoc3RydWN0IHByb2NfbW1fb3ApIHsgLm9wIAk9IE1NX0NPUFlfU0VHTUVOVFMsCisJCQkJCSAgICAgIC51IAk9CisJCQkJCSAgICAgIHsgLmNvcHlfc2VnbWVudHMgPQorCQkJCQkJCWZyb21fbW0tPmlkLnUubW1fZmQgfSB9ICk7CisJCWkgPSBvc193cml0ZV9maWxlKG5ld19tbS0+aWQudS5tbV9mZCwgJmNvcHksIHNpemVvZihjb3B5KSk7CisJCWlmKGkgIT0gc2l6ZW9mKGNvcHkpKQorCQkJcHJpbnRrKCJuZXdfbW0gOiAvcHJvYy9tbSBjb3B5X3NlZ21lbnRzIGZhaWxlZCwgIgorCQkJICAgICAgICJlcnIgPSAlZFxuIiwgLWkpOworCX0KKworCWlmKCFwdHJhY2VfbGR0KSB7CiAJCS8qIE91ciBsb2NhbCBMRFQgaXMgdXNlZCB0byBzdXBwbHkgdGhlIGRhdGEgZm9yCiAJCSAqIG1vZGlmeV9sZHQoUkVBRExEVCksIGlmIFBUUkFDRV9MRFQgaXNuJ3QgYXZhaWxhYmxlLAogCQkgKiBpLmUuLCB3ZSBoYXZlIHRvIHVzZSB0aGUgc3R1YiBmb3IgbW9kaWZ5X2xkdCwgd2hpY2gKQEAgLTUyNCw2ICs1NDUsNyBAQAogCQl1cCgmZnJvbV9tbS0+bGR0LnNlbWFwaG9yZSk7CiAJfQogCisgICAgb3V0OgogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvc2lnbmFsLmMgYi9hcmNoL3VtL3N5cy1pMzg2L3NpZ25hbC5jCmluZGV4IDE2YmMxOTkyLi43Y2QxYTgyIDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L3NpZ25hbC5jCisrKyBiL2FyY2gvdW0vc3lzLWkzODYvc2lnbmFsLmMKQEAgLTEwLDcgKzEwLDYgQEAKICNpbmNsdWRlICJhc20vdWFjY2Vzcy5oIgogI2luY2x1ZGUgImFzbS91bmlzdGQuaCIKICNpbmNsdWRlICJmcmFtZV9rZXJuLmgiCi0jaW5jbHVkZSAic2lnbmFsX3VzZXIuaCIKICNpbmNsdWRlICJzaWdjb250ZXh0LmgiCiAjaW5jbHVkZSAicmVnaXN0ZXJzLmgiCiAjaW5jbHVkZSAibW9kZS5oIgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L2tlcm5lbC1vZmZzZXRzLmMgYi9hcmNoL3VtL3N5cy14ODZfNjQva2VybmVsLW9mZnNldHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjYjEwNC4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQva2VybmVsLW9mZnNldHMuYworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9lbGYuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotCi0jZGVmaW5lIERFRklORShzeW0sIHZhbCkgXAotICAgICAgICBhc20gdm9sYXRpbGUoIlxuLT4iICNzeW0gIiAlMCAiICN2YWwgOiA6ICJpIiAodmFsKSkKLQotI2RlZmluZSBERUZJTkVfU1RSMSh4KSAjeAotI2RlZmluZSBERUZJTkVfU1RSKHN5bSwgdmFsKSBhc20gdm9sYXRpbGUoIlxuLT4iICNzeW0gIiAiIERFRklORV9TVFIxKHZhbCkgIiAiICN2YWw6IDogKQotCi0jZGVmaW5lIEJMQU5LKCkgYXNtIHZvbGF0aWxlKCJcbi0+IiA6IDogKQotCi0jZGVmaW5lIE9GRlNFVChzeW0sIHN0ciwgbWVtKSBcCi0JREVGSU5FKHN5bSwgb2Zmc2V0b2Yoc3RydWN0IHN0ciwgbWVtKSk7Ci0KLXZvaWQgZm9vKHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX01PREVfVFQKLQlPRkZTRVQoSE9TVF9UQVNLX0VYVEVSTl9QSUQsIHRhc2tfc3RydWN0LCB0aHJlYWQubW9kZS50dC5leHRlcm5fcGlkKTsKLSNlbmRpZgotI2luY2x1ZGUgPGNvbW1vbi1vZmZzZXRzLmg+Ci19CmRpZmYgLS1naXQgYS9hcmNoL3Y4NTAvS2NvbmZpZyBiL2FyY2gvdjg1MC9LY29uZmlnCmluZGV4IDMxMDg2NTkuLjA0NDk0NjMgMTAwNjQ0Ci0tLSBhL2FyY2gvdjg1MC9LY29uZmlnCisrKyBiL2FyY2gvdjg1MC9LY29uZmlnCkBAIC0xMCw5ICsxMCw2IEBACiBjb25maWcgTU1VCiAgICAgICAgCWJvb2wKIAlkZWZhdWx0IG4KLWNvbmZpZyBVSUQxNgotCWJvb2wKLQlkZWZhdWx0IG4KIGNvbmZpZyBSV1NFTV9HRU5FUklDX1NQSU5MT0NLCiAJYm9vbAogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC92ODUwL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3Y4NTAva2VybmVsL3Byb2Nlc3MuYwppbmRleCAzOWNmMjQ3Li5lYjkwOTkzIDEwMDY0NAotLS0gYS9hcmNoL3Y4NTAva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3Y4NTAva2VybmVsL3Byb2Nlc3MuYwpAQCAtMTE0LDcgKzExNCw3IEBACiAJCSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCS8qIFN0YXJ0IHB1c2hpbmcgc3R1ZmYgZnJvbSB0aGUgdG9wIG9mIHRoZSBjaGlsZCdzIGtlcm5lbCBzdGFjay4gICovCi0JdW5zaWduZWQgbG9uZyBvcmlnX2tzcCA9ICh1bnNpZ25lZCBsb25nKXAtPnRocmVhZF9pbmZvICsgVEhSRUFEX1NJWkU7CisJdW5zaWduZWQgbG9uZyBvcmlnX2tzcCA9IHRhc2tfdG9zKHApOwogCXVuc2lnbmVkIGxvbmcga3NwID0gb3JpZ19rc3A7CiAJLyogV2UgcHVzaCB0d28gYHN0YXRlIHNhdmUnIHN0YWNrIGZhbWVzIChzZWUgZW50cnkuUykgb24gdGhlIG5ldwogCSAgIGtlcm5lbCBzdGFjazoKQEAgLTE2NCwzMCArMTY0LDYgQEAKIH0KIAogLyoKLSAqIGZpbGwgaW4gdGhlIHVzZXIgc3RydWN0dXJlIGZvciBhIGNvcmUgZHVtcC4uCi0gKi8KLXZvaWQgZHVtcF90aHJlYWQgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3QgdXNlciAqZHVtcCkKLXsKLSNpZiAwICAvKiBMYXRlci4gIFhYWCAqLwotCWR1bXAtPm1hZ2ljID0gQ01BR0lDOwotCWR1bXAtPnN0YXJ0X2NvZGUgPSAwOwotCWR1bXAtPnN0YXJ0X3N0YWNrID0gcmVncy0+Z3ByW0dQUl9TUF07Ci0JZHVtcC0+dV90c2l6ZSA9ICgodW5zaWduZWQgbG9uZykgY3VycmVudC0+bW0tPmVuZF9jb2RlKSA+PiBQQUdFX1NISUZUOwotCWR1bXAtPnVfZHNpemUgPSAoKHVuc2lnbmVkIGxvbmcpIChjdXJyZW50LT5tbS0+YnJrICsKLQkJCQkJICAoUEFHRV9TSVpFLTEpKSkgPj4gUEFHRV9TSElGVDsKLQlkdW1wLT51X2RzaXplIC09IGR1bXAtPnVfdHNpemU7Ci0JZHVtcC0+dV9zc2l6ZSA9IDA7Ci0KLQlpZiAoZHVtcC0+c3RhcnRfc3RhY2sgPCBUQVNLX1NJWkUpCi0JCWR1bXAtPnVfc3NpemUgPSAoKHVuc2lnbmVkIGxvbmcpIChUQVNLX1NJWkUgLSBkdW1wLT5zdGFydF9zdGFjaykpID4+IFBBR0VfU0hJRlQ7Ci0KLQlkdW1wLT51X2FyMCA9IChzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCAqKSgoaW50KSZkdW1wLT5yZWdzIC0gKGludClkdW1wKTsKLQlkdW1wLT5yZWdzID0gKnJlZ3M7Ci0JZHVtcC0+dV9mcHZhbGlkID0gMDsKLSNlbmRpZgotfQotCi0vKgogICogc3lzX2V4ZWN2ZSgpIGV4ZWN1dGVzIGEgbmV3IHByb2dyYW0uCiAgKi8KIGludCBzeXNfZXhlY3ZlIChjaGFyICpuYW1lLCBjaGFyICoqYXJndiwgY2hhciAqKmVudnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQpkaWZmIC0tZ2l0IGEvYXJjaC92ODUwL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvdjg1MC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggMTg0OTJkMC4uNjdlMDU3NSAxMDA2NDQKLS0tIGEvYXJjaC92ODUwL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3Y4NTAva2VybmVsL3B0cmFjZS5jCkBAIC01OCw3ICs1OCw3IEBACiAJCXJlZ3MgPSB0aHJlYWRfc2F2ZWRfcmVncyAodCk7CiAJZWxzZQogCQkvKiBSZWdpc3RlciBzYXZlZCBkdXJpbmcga2VybmVsIGVudHJ5IChvciBub3QgYXZhaWxhYmxlKS4gICovCi0JCXJlZ3MgPSB0YXNrX3JlZ3MgKHQpOworCQlyZWdzID0gdGFza19wdF9yZWdzICh0KTsKIAogCXJldHVybiAodjg1MF9yZWdfdCAqKSgoY2hhciAqKXJlZ3MgKyByZWdfb2Zmcyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Y4NTAva2VybmVsL3Y4NTBfa3N5bXMuYyBiL2FyY2gvdjg1MC9rZXJuZWwvdjg1MF9rc3ltcy5jCmluZGV4IDBjYTY0OTAuLjhmZmMyOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvdjg1MC9rZXJuZWwvdjg1MF9rc3ltcy5jCisrKyBiL2FyY2gvdjg1MC9rZXJuZWwvdjg1MF9rc3ltcy5jCkBAIC0yMSw4ICsyMSw2IEBACiBFWFBPUlRfU1lNQk9MICh0cmFwX3RhYmxlKTsKIAogLyogcGxhdGZvcm0gZGVwZW5kZW50IHN1cHBvcnQgKi8KLWV4dGVybiB2b2lkIGR1bXBfdGhyZWFkIChzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgdXNlciAqKTsKLUVYUE9SVF9TWU1CT0wgKGR1bXBfdGhyZWFkKTsKIEVYUE9SVF9TWU1CT0wgKGtlcm5lbF90aHJlYWQpOwogRVhQT1JUX1NZTUJPTCAoZW5hYmxlX2lycSk7CiBFWFBPUlRfU1lNQk9MIChkaXNhYmxlX2lycSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9LY29uZmlnIGIvYXJjaC94ODZfNjQvS2NvbmZpZwppbmRleCA2ZWNlNjQ1Li4yZjlkZWNhIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9LY29uZmlnCisrKyBiL2FyY2gveDg2XzY0L0tjb25maWcKQEAgLTY5LDEyICs2OSwzNCBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIERNSQorCWJvb2wKKwlkZWZhdWx0IHkKKwogc291cmNlICJpbml0L0tjb25maWciCiAKIAogbWVudSAiUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIgogCiBjaG9pY2UKKwlwcm9tcHQgIlN1YmFyY2hpdGVjdHVyZSBUeXBlIgorCWRlZmF1bHQgWDg2X1BDCisKK2NvbmZpZyBYODZfUEMKKwlib29sICJQQy1jb21wYXRpYmxlIgorCWhlbHAKKwkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3VyIGNvbXB1dGVyIGlzIGEgc3RhbmRhcmQgUEMgb3IgY29tcGF0aWJsZS4KKworY29uZmlnIFg4Nl9WU01QCisJYm9vbCAiU3VwcG9ydCBmb3IgU2NhbGVNUCB2U01QIgorCSBoZWxwCisJICBTdXBwb3J0IGZvciBTY2FsZU1QIHZTTVAgc3lzdGVtcy4gIFNheSAnWScgaGVyZSBpZiB0aGlzIGtlcm5lbCBpcworCSAgc3VwcG9zZWQgdG8gcnVuIG9uIHRoZXNlIEVNNjRULWJhc2VkIG1hY2hpbmVzLiAgT25seSBjaG9vc2UgdGhpcyBvcHRpb24KKwkgIGlmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZSBtYWNoaW5lcy4KKworZW5kY2hvaWNlCisKK2Nob2ljZQogCXByb21wdCAiUHJvY2Vzc29yIGZhbWlseSIKIAlkZWZhdWx0IE1LOAogCkBAIC0yODMsNyArMzA1LDExIEBACiAKIGNvbmZpZyBBUkNIX1NQQVJTRU1FTV9FTkFCTEUKIAlkZWZfYm9vbCB5Ci0JZGVwZW5kcyBvbiBOVU1BCisJZGVwZW5kcyBvbiAoTlVNQSB8fCBFWFBFUklNRU5UQUwpCisKK2NvbmZpZyBBUkNIX01FTU9SWV9QUk9CRQorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIE1FTU9SWV9IT1RQTFVHCiAKIGNvbmZpZyBBUkNIX0ZMQVRNRU1fRU5BQkxFCiAJZGVmX2Jvb2wgeQpAQCAtMjkzLDYgKzMxOSw3IEBACiAKIGNvbmZpZyBIQVZFX0FSQ0hfRUFSTFlfUEZOX1RPX05JRAogCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIE5VTUEKIAogY29uZmlnIE5SX0NQVVMKIAlpbnQgIk1heGltdW0gbnVtYmVyIG9mIENQVXMgKDItMjU2KSIKQEAgLTMyOCw3ICszNTUsNyBAQAogCSAgPGh0dHA6Ly93d3cuaW50ZWwuY29tL2hhcmR3YXJlZGVzaWduL2hwZXRzcGVjLmh0bT4uCiAKIGNvbmZpZyBYODZfUE1fVElNRVIKLQlib29sICJQTSB0aW1lciIKKwlib29sICJQTSB0aW1lciIgaWYgRU1CRURERUQKIAlkZXBlbmRzIG9uIEFDUEkKIAlkZWZhdWx0IHkKIAloZWxwCkBAIC0zNDcsMzIgKzM3NCwyNCBAQAogCWRlcGVuZHMgb24gSFBFVF9USU1FUiAmJiBSVEM9eQogCiBjb25maWcgR0FSVF9JT01NVQotCWJvb2wgIklPTU1VIHN1cHBvcnQiCisJYm9vbCAiSzggR0FSVCBJT01NVSBzdXBwb3J0IgogCWRlZmF1bHQgeQorCXNlbGVjdCBTV0lPVExCCiAJZGVwZW5kcyBvbiBQQ0kKIAloZWxwCiAJICBTdXBwb3J0IHRoZSBJT01NVS4gTmVlZGVkIHRvIHJ1biBzeXN0ZW1zIHdpdGggbW9yZSB0aGFuIDNHQiBvZiBtZW1vcnkKIAkgIHByb3Blcmx5IHdpdGggMzItYml0IFBDSSBkZXZpY2VzIHRoYXQgZG8gbm90IHN1cHBvcnQgREFDIChEb3VibGUgQWRkcmVzcwogCSAgQ3ljbGUpLiBUaGUgSU9NTVUgY2FuIGJlIHR1cm5lZCBvZmYgYXQgcnVudGltZSB3aXRoIHRoZSBpb21tdT1vZmYgcGFyYW1ldGVyLgogCSAgTm9ybWFsbHkgdGhlIGtlcm5lbCB3aWxsIHRha2UgdGhlIHJpZ2h0IGNob2ljZSBieSBpdHNlbGYuCi0JICBUaGlzIG9wdGlvbiBpbmNsdWRlcyBhIGRyaXZlciBmb3IgdGhlIEFNRCBPcHRlcm9uL0F0aGxvbjY0IElPTU1VCi0JICBhbmQgYSBzb2Z0d2FyZSBlbXVsYXRpb24gdXNlZCBvbiBzb21lIG90aGVyIHN5c3RlbXMuCisJICBUaGlzIG9wdGlvbiBpbmNsdWRlcyBhIGRyaXZlciBmb3IgdGhlIEFNRCBPcHRlcm9uL0F0aGxvbjY0IG5vcnRoYnJpZGdlIElPTU1VCisJICBhbmQgYSBzb2Z0d2FyZSBlbXVsYXRpb24gdXNlZCBvbiBvdGhlciBzeXN0ZW1zLgogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAogIyBuZWVkIHRoaXMgYWx3YXlzIGVuYWJsZWQgd2l0aCBHQVJUX0lPTU1VIGZvciB0aGUgVklBIHdvcmthcm91bmQKIGNvbmZpZyBTV0lPVExCCi0gICAgICAgYm9vbAotICAgICAgIGRlcGVuZHMgb24gR0FSVF9JT01NVQotICAgICAgIGRlZmF1bHQgeQotCi1jb25maWcgRFVNTVlfSU9NTVUKIAlib29sCi0JZGVwZW5kcyBvbiAhR0FSVF9JT01NVSAmJiAhU1dJT1RMQgogCWRlZmF1bHQgeQotCWhlbHAKLQkgIERvbid0IHVzZSBJT01NVSBjb2RlLiBUaGlzIHdpbGwgY2F1c2UgcHJvYmxlbXMgd2hlbiB5b3UgaGF2ZSBtb3JlIHRoYW4gNEdCCi0JICBvZiBtZW1vcnkgYW5kIGFueSAzMi1iaXQgZGV2aWNlcy4gRG9uJ3QgdHVybiBvbiB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UKLQkgIGFyZSBkb2luZy4KKwlkZXBlbmRzIG9uIEdBUlRfSU9NTVUKIAogY29uZmlnIFg4Nl9NQ0UKIAlib29sICJNYWNoaW5lIGNoZWNrIHN1cHBvcnQiIGlmIEVNQkVEREVECkBAIC0zOTksMTcgKzQxOCw2IEBACiAJICAgQWRkaXRpb25hbCBzdXBwb3J0IGZvciBBTUQgc3BlY2lmaWMgTUNFIGZlYXR1cmVzIHN1Y2ggYXMKIAkgICB0aGUgRFJBTSBFcnJvciBUaHJlc2hvbGQuCiAKLWNvbmZpZyBQSFlTSUNBTF9TVEFSVAotCWhleCAiUGh5c2ljYWwgYWRkcmVzcyB3aGVyZSB0aGUga2VybmVsIGlzIGxvYWRlZCIgaWYgRU1CRURERUQKLQlkZWZhdWx0ICIweDEwMDAwMCIKLQloZWxwCi0JICBUaGlzIGdpdmVzIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHdoZXJlIHRoZSBrZXJuZWwgaXMgbG9hZGVkLgotCSAgUHJpbWFyaWx5IHVzZWQgaW4gdGhlIGNhc2Ugb2Yga2V4ZWMgb24gcGFuaWMgd2hlcmUgdGhlCi0JICBmYWlsIHNhZmUga2VybmVsIG5lZWRzIHRvIHJ1biBhdCBhIGRpZmZlcmVudCBhZGRyZXNzIHRoYW4KLQkgIHRoZSBwYW5pYy1lZCBrZXJuZWwuCi0KLQkgIERvbid0IGNoYW5nZSB0aGlzIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCi0KIGNvbmZpZyBLRVhFQwogCWJvb2wgImtleGVjIHN5c3RlbSBjYWxsIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCkBAIC00MjcsNiArNDM1LDMxIEBACiAJICBzdXBwb3J0LiAgQXMgb2YgdGhpcyB3cml0aW5nIHRoZSBleGFjdCBoYXJkd2FyZSBpbnRlcmZhY2UgaXMKIAkgIHN0cm9uZ2x5IGluIGZsdXgsIHNvIG5vIGdvb2QgcmVjb21tZW5kYXRpb24gY2FuIGJlIG1hZGUuCiAKK2NvbmZpZyBDUkFTSF9EVU1QCisJYm9vbCAia2VybmVsIGNyYXNoIGR1bXBzIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJaGVscAorCQlHZW5lcmF0ZSBjcmFzaCBkdW1wIGFmdGVyIGJlaW5nIHN0YXJ0ZWQgYnkga2V4ZWMuCisKK2NvbmZpZyBQSFlTSUNBTF9TVEFSVAorCWhleCAiUGh5c2ljYWwgYWRkcmVzcyB3aGVyZSB0aGUga2VybmVsIGlzIGxvYWRlZCIgaWYgKEVNQkVEREVEIHx8IENSQVNIX0RVTVApCisJZGVmYXVsdCAiMHgxMDAwMDAwIiBpZiBDUkFTSF9EVU1QCisJZGVmYXVsdCAiMHgxMDAwMDAiCisJaGVscAorCSAgVGhpcyBnaXZlcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyB3aGVyZSB0aGUga2VybmVsIGlzIGxvYWRlZC4gTm9ybWFsbHkKKwkgIGZvciByZWd1bGFyIGtlcm5lbHMgdGhpcyB2YWx1ZSBpcyAweDEwMDAwMCAoMU1CKS4gQnV0IGluIHRoZSBjYXNlCisJICBvZiBrZXhlYyBvbiBwYW5pYyB0aGUgZmFpbCBzYWZlIGtlcm5lbCBuZWVkcyB0byBydW4gYXQgYSBkaWZmZXJlbnQKKwkgIGFkZHJlc3MgdGhhbiB0aGUgcGFuaWMtZWQga2VybmVsLiBUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgbG9hZAorCSAgYWRkcmVzcyBmb3Iga2VybmVscyB1c2VkIHRvIGNhcHR1cmUgY3Jhc2ggZHVtcCBvbiBiZWluZyBrZXhlYydlZAorCSAgYWZ0ZXIgcGFuaWMuIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBjcmFzaCBkdW1wIGtlcm5lbHMgaXMKKwkgIDB4MTAwMDAwMCAoMTZNQikuIFRoaXMgY2FuIGFsc28gYmUgc2V0IGJhc2VkIG9uIHRoZSAiWCIgdmFsdWUgYXMKKwkgIHNwZWNpZmllZCBpbiB0aGUgImNyYXNoa2VybmVsPVlNQFhNIiBjb21tYW5kIGxpbmUgYm9vdCBwYXJhbWV0ZXIKKwkgIHBhc3NlZCB0byB0aGUgcGFuaWMtZWQga2VybmVsLiBUeXBpY2FsbHkgdGhpcyBwYXJhbWV0ZXIgaXMgc2V0IGFzCisJICBjcmFzaGtlcm5lbD02NE1AMTZNLiBQbGVhc2UgdGFrZSBhIGxvb2sgYXQKKwkgIERvY3VtZW50YXRpb24va2R1bXAva2R1bXAudHh0IGZvciBtb3JlIGRldGFpbHMgYWJvdXQgY3Jhc2ggZHVtcHMuCisKKwkgIERvbid0IGNoYW5nZSB0aGlzIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCisKIGNvbmZpZyBTRUNDT01QCiAJYm9vbCAiRW5hYmxlIHNlY2NvbXAgdG8gc2FmZWx5IGNvbXB1dGUgdW50cnVzdGVkIGJ5dGVjb2RlIgogCWRlcGVuZHMgb24gUFJPQ19GUwpAQCAtNTQyLDExICs1NzUsNiBAQAogCWRlcGVuZHMgb24gQ09NUEFUICYmIFNZU1ZJUEMKIAlkZWZhdWx0IHkKIAotY29uZmlnIFVJRDE2Ci0JYm9vbAotCWRlcGVuZHMgb24gSUEzMl9FTVVMQVRJT04KLQlkZWZhdWx0IHkKLQogZW5kbWVudQogCiBzb3VyY2UgIm5ldC9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvTWFrZWZpbGUgYi9hcmNoL3g4Nl82NC9NYWtlZmlsZQppbmRleCBhOWNkNDJlLi5kN2ZkNDY0IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9NYWtlZmlsZQorKysgYi9hcmNoL3g4Nl82NC9NYWtlZmlsZQpAQCAtMzEsNiArMzEsNyBAQAogY2ZsYWdzLSQoQ09ORklHX01QU0MpICs9ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPW5vY29uYSkKIENGTEFHUyArPSAkKGNmbGFncy15KQogCitDRkxBR1MgKz0gLW02NAogQ0ZMQUdTICs9IC1tbm8tcmVkLXpvbmUKIENGTEFHUyArPSAtbWNtb2RlbD1rZXJuZWwKIENGTEFHUyArPSAtcGlwZQpAQCAtMzgsOCArMzksMTAgQEAKICMgYWN0dWFsbHkgaXQgbWFrZXMgdGhlIGtlcm5lbCBzbWFsbGVyIHRvby4KIENGTEFHUyArPSAtZm5vLXJlb3JkZXItYmxvY2tzCQogQ0ZMQUdTICs9IC1Xbm8tc2lnbi1jb21wYXJlCi1pZm5lcSAoJChDT05GSUdfREVCVUdfSU5GTykseSkKK2lmbmVxICgkKENPTkZJR19VTldJTkRfSU5GTykseSkKIENGTEFHUyArPSAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzCitlbmRpZgoraWZuZXEgKCQoQ09ORklHX0RFQlVHX0lORk8pLHkpCiAjIC1md2ViIHNocmlua3MgdGhlIGtlcm5lbCBhIGJpdCwgYnV0IHRoZSBkaWZmZXJlbmNlIGlzIHZlcnkgc21hbGwKICMgaXQgYWxzbyBtZXNzZXMgdXAgZGVidWdnaW5nLCBzbyBkb24ndCB1c2UgaXQgZm9yIG5vdy4KICNDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtZndlYikKQEAgLTUwLDYgKzUzLDggQEAKICMgcHJldmVudCBnY2MgZnJvbSBnZW5lcmF0aW5nIGFueSBGUCBjb2RlIGJ5IG1pc3Rha2UKIENGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tbm8tc3NlIC1tbm8tbW14IC1tbm8tc3NlMiAtbW5vLTNkbm93LCkKIAorQUZMQUdTICs9IC1tNjQKKwogaGVhZC15IDo9IGFyY2gveDg2XzY0L2tlcm5lbC9oZWFkLm8gYXJjaC94ODZfNjQva2VybmVsL2hlYWQ2NC5vIGFyY2gveDg2XzY0L2tlcm5lbC9pbml0X3Rhc2subwogCiBsaWJzLXkgCQkJCQkrPSBhcmNoL3g4Nl82NC9saWIvCkBAIC04MCw5ICs4NSwxMiBAQAogYnpkaXNrOiB2bWxpbnV4CiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSBCT09USU1BR0U9JChCT09USU1BR0UpIHpkaXNrCiAKLWluc3RhbGwgZmRpbWFnZSBmZGltYWdlMTQ0IGZkaW1hZ2UyODg6IHZtbGludXgKK2ZkaW1hZ2UgZmRpbWFnZTE0NCBmZGltYWdlMjg4OiB2bWxpbnV4CiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSBCT09USU1BR0U9JChCT09USU1BR0UpICRACiAKK2luc3RhbGw6CisJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSBCT09USU1BR0U9JChCT09USU1BR0UpICRAIAorCiBhcmNoY2xlYW46CiAJJChRKSQoTUFLRSkgJChjbGVhbik9JChib290KQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9ib290L01ha2VmaWxlIGIvYXJjaC94ODZfNjQvYm9vdC9NYWtlZmlsZQppbmRleCAxOGM2ZTkxLi4yOWY4Mzk2IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9ib290L01ha2VmaWxlCisrKyBiL2FyY2gveDg2XzY0L2Jvb3QvTWFrZWZpbGUKQEAgLTk4LDUgKzk4LDUgQEAKIAljcCBTeXN0ZW0ubWFwICQoSU5TVEFMTF9QQVRIKS8KIAlpZiBbIC14IC9zYmluL2xpbG8gXTsgdGhlbiAvc2Jpbi9saWxvOyBlbHNlIC9ldGMvbGlsby9pbnN0YWxsOyBmaQogCi1pbnN0YWxsOiAkKEJPT1RJTUFHRSkKK2luc3RhbGw6CiAJc2ggJChzcmN0cmVlKS8kKHNyYykvaW5zdGFsbC5zaCAkKEtFUk5FTFJFTEVBU0UpICQoQk9PVElNQUdFKSBTeXN0ZW0ubWFwICIkKElOU1RBTExfUEFUSCkiCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9ib290L2NvbXByZXNzZWQvbWlzYy5jIGIvYXJjaC94ODZfNjQvYm9vdC9jb21wcmVzc2VkL21pc2MuYwppbmRleCAwZTEwZmQ4Li5jZjRiODhjIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9ib290L2NvbXByZXNzZWQvbWlzYy5jCisrKyBiL2FyY2gveDg2XzY0L2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKQEAgLTksNyArOSw3IEBACiAgKiBIaWdoIGxvYWRlZCBzdHVmZiBieSBIYW5zIExlcm1lbiAmIFdlcm5lciBBbG1lc2JlcmdlciwgRmViLiAxOTk2CiAgKi8KIAotI2luY2x1ZGUgIm1pc2NzZXR1cC5oIgorI2luY2x1ZGUgPGxpbnV4L3NjcmVlbl9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvYm9vdC9jb21wcmVzc2VkL21pc2NzZXR1cC5oIGIvYXJjaC94ODZfNjQvYm9vdC9jb21wcmVzc2VkL21pc2NzZXR1cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjE2MjA1Li4wMDAwMDAwCi0tLSBhL2FyY2gveDg2XzY0L2Jvb3QvY29tcHJlc3NlZC9taXNjc2V0dXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSNkZWZpbmUgTlVMTCAwCi0vL3R5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsgCi0KLQotc3RydWN0IHNjcmVlbl9pbmZvIHsKLQl1bnNpZ25lZCBjaGFyICBvcmlnX3g7CQkJLyogMHgwMCAqLwotCXVuc2lnbmVkIGNoYXIgIG9yaWdfeTsJCQkvKiAweDAxICovCi0JdW5zaWduZWQgc2hvcnQgZG9udHVzZTE7CQkvKiAweDAyIC0tIEVYVF9NRU1fSyBzaXRzIGhlcmUgKi8KLQl1bnNpZ25lZCBzaG9ydCBvcmlnX3ZpZGVvX3BhZ2U7CQkvKiAweDA0ICovCi0JdW5zaWduZWQgY2hhciAgb3JpZ192aWRlb19tb2RlOwkJLyogMHgwNiAqLwotCXVuc2lnbmVkIGNoYXIgIG9yaWdfdmlkZW9fY29sczsJCS8qIDB4MDcgKi8KLQl1bnNpZ25lZCBzaG9ydCB1bnVzZWQyOwkJCS8qIDB4MDggKi8KLQl1bnNpZ25lZCBzaG9ydCBvcmlnX3ZpZGVvX2VnYV9ieDsJLyogMHgwYSAqLwotCXVuc2lnbmVkIHNob3J0IHVudXNlZDM7CQkJLyogMHgwYyAqLwotCXVuc2lnbmVkIGNoYXIgIG9yaWdfdmlkZW9fbGluZXM7CS8qIDB4MGUgKi8KLQl1bnNpZ25lZCBjaGFyICBvcmlnX3ZpZGVvX2lzVkdBOwkvKiAweDBmICovCi0JdW5zaWduZWQgc2hvcnQgb3JpZ192aWRlb19wb2ludHM7CS8qIDB4MTAgKi8KLQotCS8qIFZFU0EgZ3JhcGhpYyBtb2RlIC0tIGxpbmVhciBmcmFtZSBidWZmZXIgKi8KLQl1bnNpZ25lZCBzaG9ydCBsZmJfd2lkdGg7CQkvKiAweDEyICovCi0JdW5zaWduZWQgc2hvcnQgbGZiX2hlaWdodDsJCS8qIDB4MTQgKi8KLQl1bnNpZ25lZCBzaG9ydCBsZmJfZGVwdGg7CQkvKiAweDE2ICovCi0JdW5zaWduZWQgbG9uZyAgbGZiX2Jhc2U7CQkvKiAweDE4ICovCi0JdW5zaWduZWQgbG9uZyAgbGZiX3NpemU7CQkvKiAweDFjICovCi0JdW5zaWduZWQgc2hvcnQgZG9udHVzZTIsIGRvbnR1c2UzOwkvKiAweDIwIC0tIENMX01BR0lDIGFuZCBDTF9PRkZTRVQgaGVyZSAqLwotCXVuc2lnbmVkIHNob3J0IGxmYl9saW5lbGVuZ3RoOwkJLyogMHgyNCAqLwotCXVuc2lnbmVkIGNoYXIgIHJlZF9zaXplOwkJLyogMHgyNiAqLwotCXVuc2lnbmVkIGNoYXIgIHJlZF9wb3M7CQkJLyogMHgyNyAqLwotCXVuc2lnbmVkIGNoYXIgIGdyZWVuX3NpemU7CQkvKiAweDI4ICovCi0JdW5zaWduZWQgY2hhciAgZ3JlZW5fcG9zOwkJLyogMHgyOSAqLwotCXVuc2lnbmVkIGNoYXIgIGJsdWVfc2l6ZTsJCS8qIDB4MmEgKi8KLQl1bnNpZ25lZCBjaGFyICBibHVlX3BvczsJCS8qIDB4MmIgKi8KLQl1bnNpZ25lZCBjaGFyICByc3ZkX3NpemU7CQkvKiAweDJjICovCi0JdW5zaWduZWQgY2hhciAgcnN2ZF9wb3M7CQkvKiAweDJkICovCi0JdW5zaWduZWQgc2hvcnQgdmVzYXBtX3NlZzsJCS8qIDB4MmUgKi8KLQl1bnNpZ25lZCBzaG9ydCB2ZXNhcG1fb2ZmOwkJLyogMHgzMCAqLwotCXVuc2lnbmVkIHNob3J0IHBhZ2VzOwkJCS8qIDB4MzIgKi8KLQkJCQkJCS8qIDB4MzQgLS0gMHgzZiByZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLwotfTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2Jvb3QvaW5zdGFsbC5zaCBiL2FyY2gveDg2XzY0L2Jvb3QvaW5zdGFsbC5zaAppbmRleCAxOThhZjE1Li5iYWFhMjM2IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9ib290L2luc3RhbGwuc2gKKysrIGIvYXJjaC94ODZfNjQvYm9vdC9pbnN0YWxsLnNoCkBAIC0xLDQwICsxLDIgQEAKICMhL2Jpbi9zaAotIwotIyBhcmNoL3g4Nl82NC9ib290L2luc3RhbGwuc2gKLSMKLSMgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotIyBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBDb3B5cmlnaHQgKEMpIDE5OTUgYnkgTGludXMgVG9ydmFsZHMKLSMKLSMgQWRhcHRlZCBmcm9tIGNvZGUgaW4gYXJjaC9pMzg2L2Jvb3QvTWFrZWZpbGUgYnkgSC4gUGV0ZXIgQW52aW4KLSMKLSMgIm1ha2UgaW5zdGFsbCIgc2NyaXB0IGZvciBpMzg2IGFyY2hpdGVjdHVyZQotIwotIyBBcmd1bWVudHM6Ci0jICAgJDEgLSBrZXJuZWwgdmVyc2lvbgotIyAgICQyIC0ga2VybmVsIGltYWdlIGZpbGUKLSMgICAkMyAtIGtlcm5lbCBtYXAgZmlsZQotIyAgICQ0IC0gZGVmYXVsdCBpbnN0YWxsIHBhdGggKGJsYW5rIGlmIHJvb3QgZGlyZWN0b3J5KQotIwotCi0jIFVzZXIgbWF5IGhhdmUgYSBjdXN0b20gaW5zdGFsbCBzY3JpcHQKLQotaWYgWyAteCB+L2Jpbi8ke0NST1NTX0NPTVBJTEV9aW5zdGFsbGtlcm5lbCBdOyB0aGVuIGV4ZWMgfi9iaW4vJHtDUk9TU19DT01QSUxFfWluc3RhbGxrZXJuZWwgIiRAIjsgZmkKLWlmIFsgLXggL3NiaW4vJHtDUk9TU19DT01QSUxFfWluc3RhbGxrZXJuZWwgXTsgdGhlbiBleGVjIC9zYmluLyR7Q1JPU1NfQ09NUElMRX1pbnN0YWxsa2VybmVsICIkQCI7IGZpCi0KLSMgRGVmYXVsdCBpbnN0YWxsIC0gc2FtZSBhcyBtYWtlIHpsaWxvCi0KLWlmIFsgLWYgJDQvdm1saW51eiBdOyB0aGVuCi0JbXYgJDQvdm1saW51eiAkNC92bWxpbnV6Lm9sZAotZmkKLQotaWYgWyAtZiAkNC9TeXN0ZW0ubWFwIF07IHRoZW4KLQltdiAkNC9TeXN0ZW0ubWFwICQ0L1N5c3RlbS5vbGQKLWZpCi0KLWNhdCAkMiA+ICQ0L3ZtbGludXoKLWNwICQzICQ0L1N5c3RlbS5tYXAKLQotaWYgWyAteCAvc2Jpbi9saWxvIF07IHRoZW4gL3NiaW4vbGlsbzsgZWxzZSAvZXRjL2xpbG8vaW5zdGFsbDsgZmkKKy4gJHNyY3RyZWUvYXJjaC9pMzg2L2Jvb3QvaW5zdGFsbC5zaApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvY3J5cHRvL2Flcy5jIGIvYXJjaC94ODZfNjQvY3J5cHRvL2Flcy5jCmluZGV4IGFjZmRhYTIuLmZiMWI5NjEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2NyeXB0by9hZXMuYworKysgYi9hcmNoL3g4Nl82NC9jcnlwdG8vYWVzLmMKQEAgLTc0LDggKzc0LDYgQEAKIAlyZXR1cm4geCA+PiAobiA8PCAzKTsKIH0KIAotI2RlZmluZSB1MzJfaW4oeCkgbGUzMl90b19jcHUoKihjb25zdCBfX2xlMzIgKikoeCkpCi0KIHN0cnVjdCBhZXNfY3R4CiB7CiAJdTMyIGtleV9sZW5ndGg7CkBAIC0yMzQsNiArMjMyLDcgQEAKIAkJICAgICAgIHUzMiAqZmxhZ3MpCiB7CiAJc3RydWN0IGFlc19jdHggKmN0eCA9IGN0eF9hcmc7CisJY29uc3QgX19sZTMyICprZXkgPSAoY29uc3QgX19sZTMyICopaW5fa2V5OwogCXUzMiBpLCBqLCB0LCB1LCB2LCB3OwogCiAJaWYgKGtleV9sZW4gIT0gMTYgJiYga2V5X2xlbiAhPSAyNCAmJiBrZXlfbGVuICE9IDMyKSB7CkBAIC0yNDMsMTAgKzI0MiwxMCBAQAogCiAJY3R4LT5rZXlfbGVuZ3RoID0ga2V5X2xlbjsKIAotCURfS0VZW2tleV9sZW4gKyAyNF0gPSBFX0tFWVswXSA9IHUzMl9pbihpbl9rZXkpOwotCURfS0VZW2tleV9sZW4gKyAyNV0gPSBFX0tFWVsxXSA9IHUzMl9pbihpbl9rZXkgKyA0KTsKLQlEX0tFWVtrZXlfbGVuICsgMjZdID0gRV9LRVlbMl0gPSB1MzJfaW4oaW5fa2V5ICsgOCk7Ci0JRF9LRVlba2V5X2xlbiArIDI3XSA9IEVfS0VZWzNdID0gdTMyX2luKGluX2tleSArIDEyKTsKKwlEX0tFWVtrZXlfbGVuICsgMjRdID0gRV9LRVlbMF0gPSBsZTMyX3RvX2NwdShrZXlbMF0pOworCURfS0VZW2tleV9sZW4gKyAyNV0gPSBFX0tFWVsxXSA9IGxlMzJfdG9fY3B1KGtleVsxXSk7CisJRF9LRVlba2V5X2xlbiArIDI2XSA9IEVfS0VZWzJdID0gbGUzMl90b19jcHUoa2V5WzJdKTsKKwlEX0tFWVtrZXlfbGVuICsgMjddID0gRV9LRVlbM10gPSBsZTMyX3RvX2NwdShrZXlbM10pOwogCiAJc3dpdGNoIChrZXlfbGVuKSB7CiAJY2FzZSAxNjoKQEAgLTI1NiwxNyArMjU1LDE3IEBACiAJCWJyZWFrOwogCiAJY2FzZSAyNDoKLQkJRV9LRVlbNF0gPSB1MzJfaW4oaW5fa2V5ICsgMTYpOwotCQl0ID0gRV9LRVlbNV0gPSB1MzJfaW4oaW5fa2V5ICsgMjApOworCQlFX0tFWVs0XSA9IGxlMzJfdG9fY3B1KGtleVs0XSk7CisJCXQgPSBFX0tFWVs1XSA9IGxlMzJfdG9fY3B1KGtleVs1XSk7CiAJCWZvciAoaSA9IDA7IGkgPCA4OyArK2kpCiAJCQlsb29wNiAoaSk7CiAJCWJyZWFrOwogCiAJY2FzZSAzMjoKLQkJRV9LRVlbNF0gPSB1MzJfaW4oaW5fa2V5ICsgMTYpOwotCQlFX0tFWVs1XSA9IHUzMl9pbihpbl9rZXkgKyAyMCk7Ci0JCUVfS0VZWzZdID0gdTMyX2luKGluX2tleSArIDI0KTsKLQkJdCA9IEVfS0VZWzddID0gdTMyX2luKGluX2tleSArIDI4KTsKKwkJRV9LRVlbNF0gPSBsZTMyX3RvX2NwdShrZXlbNF0pOworCQlFX0tFWVs1XSA9IGxlMzJfdG9fY3B1KGtleVs1XSk7CisJCUVfS0VZWzZdID0gbGUzMl90b19jcHUoa2V5WzZdKTsKKwkJdCA9IEVfS0VZWzddID0gbGUzMl90b19jcHUoa2V5WzddKTsKIAkJZm9yIChpID0gMDsgaSA8IDc7ICsraSkKIAkJCWxvb3A4KGkpOwogCQlicmVhazsKQEAgLTI5MCw2ICsyODksOCBAQAogCiBzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgYWVzX2FsZyA9IHsKIAkuY3JhX25hbWUJCT0JImFlcyIsCisJLmNyYV9kcml2ZXJfbmFtZQk9CSJhZXMteDg2XzY0IiwKKwkuY3JhX3ByaW9yaXR5CQk9CTIwMCwKIAkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIsCiAJLmNyYV9ibG9ja3NpemUJCT0JQUVTX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgYWVzX2N0eCksCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9kZWZjb25maWcgYi9hcmNoL3g4Nl82NC9kZWZjb25maWcKaW5kZXggNWQ1NjU0Mi4uMDlhM2ViNyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvZGVmY29uZmlnCisrKyBiL2FyY2gveDg2XzY0L2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xNC1naXQ3Ci0jIFNhdCBOb3YgIDUgMTU6NTU6NTAgMjAwNQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE1LWdpdDEyCisjIE1vbiBKYW4gMTYgMTM6MDk6MDggMjAwNgogIwogQ09ORklHX1g4Nl82ND15CiBDT05GSUdfNjRCSVQ9eQpAQCAtMTUsNiArMTUsNyBAQAogQ09ORklHX0dFTkVSSUNfSVNBX0RNQT15CiBDT05GSUdfR0VORVJJQ19JT01BUD15CiBDT05GSUdfQVJDSF9NQVlfSEFWRV9QQ19GREM9eQorQ09ORklHX0RNST15CiAKICMKICMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCkBAIC0zNSwxOCArMzYsMjEgQEAKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAogQ09ORklHX1NZU0NUTD15CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0Ci1DT05GSUdfSE9UUExVRz15Ci1DT05GSUdfS09CSkVDVF9VRVZFTlQ9eQogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKICMgQ09ORklHX0NQVVNFVFMgaXMgbm90IHNldAogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19VSUQxNj15CitDT05GSUdfVk04Nj15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAogQ09ORklHX0tBTExTWU1TPXkKIENPTkZJR19LQUxMU1lNU19BTEw9eQogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKIENPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19FUE9MTD15CkBAIC01NSw4ICs1OSwxMCBAQAogQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCiBDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAogQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKK0NPTkZJR19TTEFCPXkKICMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAogQ09ORklHX0JBU0VfU01BTEw9MAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAKICMKICMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKQEAgLTcxLDggKzc3LDI4IEBACiBDT05GSUdfU1RPUF9NQUNISU5FPXkKIAogIworIyBCbG9jayBsYXllcgorIworQ09ORklHX0xCRD15CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19ERUZBVUxUX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfQ0ZRPXkKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJjZnEiCisKKyMKICMgUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzCiAjCitDT05GSUdfWDg2X1BDPXkKKyMgQ09ORklHX1g4Nl9WU01QIGlzIG5vdCBzZXQKICMgQ09ORklHX01LOCBpcyBub3Qgc2V0CiAjIENPTkZJR19NUFNDIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX0NQVT15CkBAIC04OSwxNCArMTE1LDE0IEBACiBDT05GSUdfTVRSUj15CiBDT05GSUdfU01QPXkKIENPTkZJR19TQ0hFRF9TTVQ9eQotQ09ORklHX1BSRUVNUFRfTk9ORT15Ci0jIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAorQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPXkKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAogQ09ORklHX1BSRUVNUFRfQktMPXkKIENPTkZJR19OVU1BPXkKIENPTkZJR19LOF9OVU1BPXkKIENPTkZJR19YODZfNjRfQUNQSV9OVU1BPXkKLSMgQ09ORklHX05VTUFfRU1VIGlzIG5vdCBzZXQKK0NPTkZJR19OVU1BX0VNVT15CiBDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFPXkKIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9ERUZBVUxUPXkKIENPTkZJR19BUkNIX1NQQVJTRU1FTV9FTkFCTEU9eQpAQCAtMTA5LDYgKzEzNSw3IEBACiBDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUz15CiAjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CitDT05GSUdfTUlHUkFUSU9OPXkKIENPTkZJR19IQVZFX0FSQ0hfRUFSTFlfUEZOX1RPX05JRD15CiBDT05GSUdfTlJfQ1BVUz0zMgogQ09ORklHX0hPVFBMVUdfQ1BVPXkKQEAgLTEyMCw4ICsxNDcsOSBAQAogQ09ORklHX1g4Nl9NQ0U9eQogQ09ORklHX1g4Nl9NQ0VfSU5URUw9eQogQ09ORklHX1g4Nl9NQ0VfQU1EPXkKLUNPTkZJR19QSFlTSUNBTF9TVEFSVD0weDEwMDAwMAogIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBU0hfRFVNUCBpcyBub3Qgc2V0CitDT05GSUdfUEhZU0lDQUxfU1RBUlQ9MHgxMDAwMDAKIENPTkZJR19TRUNDT01QPXkKICMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CiBDT05GSUdfSFpfMjUwPXkKQEAgLTEzNiw2ICsxNjQsNyBAQAogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKICMKIENPTkZJR19QTT15CisjIENPTkZJR19QTV9MRUdBQ1kgaXMgbm90IHNldAogIyBDT05GSUdfUE1fREVCVUcgaXMgbm90IHNldAogQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQ9eQogQ09ORklHX1BNX1NURF9QQVJUSVRJT049IiIKQEAgLTE1Miw3ICsxODEsNyBAQAogQ09ORklHX0FDUElfQkFUVEVSWT15CiBDT05GSUdfQUNQSV9CVVRUT049eQogIyBDT05GSUdfQUNQSV9WSURFTyBpcyBub3Qgc2V0Ci1DT05GSUdfQUNQSV9IT1RLRVk9bQorIyBDT05GSUdfQUNQSV9IT1RLRVkgaXMgbm90IHNldAogQ09ORklHX0FDUElfRkFOPXkKIENPTkZJR19BQ1BJX1BST0NFU1NPUj15CiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVT15CkBAIC0yMDUsNyArMjM0LDcgQEAKIENPTkZJR19QQ0lfRElSRUNUPXkKIENPTkZJR19QQ0lfTU1DT05GSUc9eQogQ09ORklHX1VOT1JERVJFRF9JTz15Ci0jIENPTkZJR19QQ0lFUE9SVEJVUyBpcyBub3Qgc2V0CitDT05GSUdfUENJRVBPUlRCVVM9eQogQ09ORklHX1BDSV9NU0k9eQogIyBDT05GSUdfUENJX0xFR0FDWV9QUk9DIGlzIG5vdCBzZXQKICMgQ09ORklHX1BDSV9ERUJVRyBpcyBub3Qgc2V0CkBAIC0yMjksNyArMjU4LDYgQEAKIENPTkZJR19JQTMyX0FPVVQ9eQogQ09ORklHX0NPTVBBVD15CiBDT05GSUdfU1lTVklQQ19DT01QQVQ9eQotQ09ORklHX1VJRDE2PXkKIAogIwogIyBOZXR3b3JraW5nCkBAIC0yOTEsMTEgKzMxOSwxOSBAQAogIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAogIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKICMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorCisjCisjIFRJUEMgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKICMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKICMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKIAogIwogIyBOZXR3b3JrIHRlc3RpbmcKQEAgLTMxNSw3ICszNTEsNyBAQAogIwogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKK0NPTkZJR19GV19MT0FERVI9eQogIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKIAogIwpAQCAtMzU2LDIxICszOTIsNyBAQAogQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotQ09ORklHX0xCRD15CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKLQotIwotIyBJTyBTY2hlZHVsZXJzCi0jCi1DT05GSUdfSU9TQ0hFRF9OT09QPXkKLSMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAotQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQotQ09ORklHX0lPU0NIRURfQ0ZRPXkKLSMgQ09ORklHX0RFRkFVTFRfQVMgaXMgbm90IHNldAotQ09ORklHX0RFRkFVTFRfREVBRExJTkU9eQotIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAotIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKLUNPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImNmcSIKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CiAKICMKQEAgLTQxMCw3ICs0MzIsNyBAQAogIyBDT05GSUdfQkxLX0RFVl9BRUM2MlhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQUxJMTVYMyBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9BTUQ3NFhYPXkKLSMgQ09ORklHX0JMS19ERVZfQVRJSVhQIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0FUSUlYUD15CiAjIENPTkZJR19CTEtfREVWX0NNRDY0WCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1RSSUZMRVggaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9DWTgyQzY5MyBpcyBub3Qgc2V0CkBAIC00NTgsMjAgKzQ4MCwyMSBAQAogIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKICMKICMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0NPTlNUQU5UUz15CiAjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAogCiAjCiAjIFNDU0kgVHJhbnNwb3J0IEF0dHJpYnV0ZXMKICMKIENPTkZJR19TQ1NJX1NQSV9BVFRSUz15Ci0jIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0ZDX0FUVFJTPXkKICMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAogCiAjCiAjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKICMKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0CkBAIC00ODUsMTEgKzUwOCwxMyBAQAogIyBDT05GSUdfQUlDNzlYWF9ERUJVR19FTkFCTEUgaXMgbm90IHNldAogQ09ORklHX0FJQzc5WFhfREVCVUdfTUFTSz0wCiAjIENPTkZJR19BSUM3OVhYX1JFR19QUkVUVFlfUFJJTlQgaXMgbm90IHNldAotIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBzZXQKK0NPTkZJR19NRUdBUkFJRF9ORVdHRU49eQorQ09ORklHX01FR0FSQUlEX01NPXkKK0NPTkZJR19NRUdBUkFJRF9NQUlMQk9YPXkKICMgQ09ORklHX01FR0FSQUlEX0xFR0FDWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRUdBUkFJRF9TQVMgaXMgbm90IHNldAorQ09ORklHX01FR0FSQUlEX1NBUz15CiBDT05GSUdfU0NTSV9TQVRBPXkKLSMgQ09ORklHX1NDU0lfU0FUQV9BSENJIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1NBVEFfQUhDST15CiAjIENPTkZJR19TQ1NJX1NBVEFfU1ZXIGlzIG5vdCBzZXQKIENPTkZJR19TQ1NJX0FUQV9QSUlYPXkKICMgQ09ORklHX1NDU0lfU0FUQV9NViBpcyBub3Qgc2V0CkBAIC00OTgsNyArNTIzLDcgQEAKICMgQ09ORklHX1NDU0lfU0FUQV9RU1RPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NBVEFfUFJPTUlTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NBVEFfU1g0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0FUQV9TSUwgaXMgbm90IHNldAorQ09ORklHX1NDU0lfU0FUQV9TSUw9eQogIyBDT05GSUdfU0NTSV9TQVRBX1NJTDI0IGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU0FUQV9TSVMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TQVRBX1VMSSBpcyBub3Qgc2V0CkBAIC01MTcsMTMgKzU0Miw3IEBACiAjIENPTkZJR19TQ1NJX0lQUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1FMT0dJQ19GQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX1FMQTJYWFg9eQotIyBDT05GSUdfU0NTSV9RTEEyMVhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfUUxBMjJYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1FMQTIzMDAgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9RTEEyMzIyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfUUxBNjMxMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1FMQTI0WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKQEAgLTYyNywxMiArNjQ2LDE0IEBACiAjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKIENPTkZJR19FMTAwMD15CiAjIENPTkZJR19FMTAwMF9OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwX0RJU0FCTEVfUEFDS0VUX1NQTElUIGlzIG5vdCBzZXQKICMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAogIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAogIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NLR0UgaXMgbm90IHNldAorIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CiBDT05GSUdfVElHT04zPXkKQEAgLTY0NSw3ICs2NjYsNiBAQAogIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CiBDT05GSUdfUzJJTz1tCiAjIENPTkZJR19TMklPX05BUEkgaXMgbm90IHNldAotIyBDT05GSUdfMkJVRkZfTU9ERSBpcyBub3Qgc2V0CiAKICMKICMgVG9rZW4gUmluZyBkZXZpY2VzCkBAIC03NDQsNiArNzY0LDcgQEAKIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKICMgQ09ORklHX1NFUklBTF84MjUwX0FDUEkgaXMgbm90IHNldAogQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKK0NPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTQKICMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKIAogIwpAQCAtNzUxLDcgKzc3Miw2IEBACiAjCiBDT05GSUdfU0VSSUFMX0NPUkU9eQogQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQotIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWDk4X1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgpAQCAtNzkwLDYgKzgxMCw3IEBACiAjIENPTkZJR19XODM4NzdGX1dEVCBpcyBub3Qgc2V0CiAjIENPTkZJR19XODM5NzdGX1dEVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIWl9XRFQgaXMgbm90IHNldAorIyBDT05GSUdfU0JDX0VQWF9DM19XQVRDSERPRyBpcyBub3Qgc2V0CiAKICMKICMgUENJLWJhc2VkIFdhdGNoZG9nIENhcmRzCkBAIC04MTcsMTAgKzgzOCwxMCBAQAogIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKICMgQ09ORklHX01XQVZFIGlzIG5vdCBzZXQKIENPTkZJR19SQVdfRFJJVkVSPXkKK0NPTkZJR19NQVhfUkFXX0RFVlM9MjU2CiBDT05GSUdfSFBFVD15CiAjIENPTkZJR19IUEVUX1JUQ19JUlEgaXMgbm90IHNldAogQ09ORklHX0hQRVRfTU1BUD15Ci1DT05GSUdfTUFYX1JBV19ERVZTPTI1NgogIyBDT05GSUdfSEFOR0NIRUNLX1RJTUVSIGlzIG5vdCBzZXQKIAogIwpAQCAtODM1LDYgKzg1NiwxMiBAQAogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKIAogIworIyBTUEkgc3VwcG9ydAorIworIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSV9NQVNURVIgaXMgbm90IHNldAorCisjCiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKQEAgLTg5Miw2ICs5MTksNyBAQAogIyBPcGVuIFNvdW5kIFN5c3RlbQogIwogQ09ORklHX1NPVU5EX1BSSU1FPXkKK0NPTkZJR19PQlNPTEVURV9PU1NfRFJJVkVSPXkKICMgQ09ORklHX1NPVU5EX0JUODc4IGlzIG5vdCBzZXQKICMgQ09ORklHX1NPVU5EX0NNUENJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NPVU5EX0VNVTEwSzEgaXMgbm90IHNldApAQCAtOTY4LDEzICs5OTYsMTUgQEAKICMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFIwOSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSNTUgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfT05FVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfQUxBVURBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MSUJVU1VBTCBpcyBub3Qgc2V0CiAKICMKICMgVVNCIElucHV0IERldmljZXMKICMKIENPTkZJR19VU0JfSElEPXkKIENPTkZJR19VU0JfSElESU5QVVQ9eQorIyBDT05GSUdfVVNCX0hJRElOUFVUX1BPV0VSQk9PSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfRkYgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0hJRERFViBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQUlQVEVLIGlzIG5vdCBzZXQKQEAgLTk4OCw2ICsxMDE4LDcgQEAKICMgQ09ORklHX1VTQl9ZRUFMSU5LIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9YUEFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BVElfUkVNT1RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVElfUkVNT1RFMiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0FQUExFVE9VQ0ggaXMgbm90IHNldAogCkBAIC0xMDk3LDYgKzExMjgsNyBAQAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GU19QT1NJWF9BQ0w9eQogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19JTk9USUZZPXkKQEAgLTExMzUsNiArMTE2Nyw3IEBACiBDT05GSUdfSFVHRVRMQl9QQUdFPXkKIENPTkZJR19SQU1GUz15CiBDT05GSUdfUkVMQVlGU19GUz15CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CiAKICMKICMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcwpAQCAtMTIzMiwyMSArMTI2NSwyMyBAQAogQ09ORklHX05MU19VVEY4PXkKIAogIwotIyBQcm9maWxpbmcgc3VwcG9ydAorIyBJbnN0cnVtZW50YXRpb24gU3VwcG9ydAogIwogQ09ORklHX1BST0ZJTElORz15CiBDT05GSUdfT1BST0ZJTEU9eQorQ09ORklHX0tQUk9CRVM9eQogCiAjCiAjIEtlcm5lbCBoYWNraW5nCiAjCiAjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfS0VSTkVMPXkKIENPTkZJR19NQUdJQ19TWVNSUT15CitDT05GSUdfREVCVUdfS0VSTkVMPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE4CiBDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQogIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CkBAIC0xMjU0LDEwICsxMjg5LDExIEBACiBDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAogIyBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURfSU5MSU5JTkcgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiBDT05GSUdfSU5JVF9ERUJVRz15CisjIENPTkZJR19ERUJVR19ST0RBVEEgaXMgbm90IHNldAogIyBDT05GSUdfSU9NTVVfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0tQUk9CRVM9eQogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2lhMzIvTWFrZWZpbGUgYi9hcmNoL3g4Nl82NC9pYTMyL01ha2VmaWxlCmluZGV4IGY3NjIxN2QuLjkyOWU2YjAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2lhMzIvTWFrZWZpbGUKKysrIGIvYXJjaC94ODZfNjQvaWEzMi9NYWtlZmlsZQpAQCAtMiw5ICsyLDkgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBpYTMyIGtlcm5lbCBlbXVsYXRpb24gc3Vic3lzdGVtLgogIwogCi1vYmotJChDT05GSUdfSUEzMl9FTVVMQVRJT04pIDo9IGlhMzJlbnRyeS5vIHN5c19pYTMyLm8gaWEzMl9pb2N0bC5vIFwKLQlpYTMyX3NpZ25hbC5vIHRsczMyLm8gXAotCWlhMzJfYmluZm10Lm8gZnB1MzIubyBwdHJhY2UzMi5vIHN5c2NhbGwzMi5vIHN5c2NhbGwzMl9zeXNjYWxsLm8KK29iai0kKENPTkZJR19JQTMyX0VNVUxBVElPTikgOj0gaWEzMmVudHJ5Lm8gc3lzX2lhMzIubyBpYTMyX3NpZ25hbC5vIHRsczMyLm8gXAorCWlhMzJfYmluZm10Lm8gZnB1MzIubyBwdHJhY2UzMi5vIHN5c2NhbGwzMi5vIHN5c2NhbGwzMl9zeXNjYWxsLm8gXAorCW1tYXAzMi5vCiAKIHN5c3YtJChDT05GSUdfU1lTVklQQykgOj0gaXBjMzIubwogb2JqLSQoQ09ORklHX0lBMzJfRU1VTEFUSU9OKSArPSAkKHN5c3YteSkKQEAgLTI5LDQgKzI5LDMgQEAKIAogQUZMQUdTX3ZzeXNjYWxsLXN5c2VudGVyLm8gPSAtbTMyCiBBRkxBR1NfdnN5c2NhbGwtc3lzY2FsbC5vID0gLW0zMgotQ0ZMQUdTX2lhMzJfaW9jdGwubyArPSAtSWZzLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvaWEzMi9pYTMyX2JpbmZtdC5jIGIvYXJjaC94ODZfNjQvaWEzMi9pYTMyX2JpbmZtdC5jCmluZGV4IDJiNzYwZDAuLjU3MmIzYjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2lhMzIvaWEzMl9iaW5mbXQuYworKysgYi9hcmNoL3g4Nl82NC9pYTMyL2lhMzJfYmluZm10LmMKQEAgLTE5Nyw4ICsxOTcsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBlbGZfY29yZV9jb3B5X3Rhc2tfcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsIGVsZl9ncmVnc2V0X3QqIGVsZnJlZ3MpCiB7CQotCXN0cnVjdCBwdF9yZWdzICpwcCA9IChzdHJ1Y3QgcHRfcmVncyAqKSh0LT50aHJlYWQucnNwMCk7Ci0JLS1wcDsKKwlzdHJ1Y3QgcHRfcmVncyAqcHAgPSB0YXNrX3B0X3JlZ3ModCk7CiAJRUxGX0NPUkVfQ09QWV9SRUdTKCgqZWxmcmVncyksIHBwKTsKIAkvKiBmaXggd3Jvbmcgc2VnbWVudHMgKi8gCiAJKCplbGZyZWdzKVs3XSA9IHQtPnRocmVhZC5kczsgCkBAIC0yMTcsNyArMjE2LDcgQEAKIAlpZiAoIXRza191c2VkX21hdGgodHNrKSkKIAkJcmV0dXJuIDA7CiAJaWYgKCFyZWdzKQotCQlyZWdzID0gKChzdHJ1Y3QgcHRfcmVncyAqKXRzay0+dGhyZWFkLnJzcDApIC0gMTsKKwkJcmVncyA9IHRhc2tfcHRfcmVncyh0c2spOwogCWlmICh0c2sgPT0gY3VycmVudCkKIAkJdW5sYXp5X2ZwdSh0c2spOwogCXNldF9mcyhLRVJORUxfRFMpOyAKQEAgLTIzMyw3ICsyMzIsNyBAQAogc3RhdGljIGlubGluZSBpbnQgCiBlbGZfY29yZV9jb3B5X3Rhc2tfeGZwcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsIGVsZl9mcHhyZWdzZXRfdCAqeGZwdSkKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9ICgoc3RydWN0IHB0X3JlZ3MgKikodC0+dGhyZWFkLnJzcDApKS0xOyAKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyh0KTsKIAlpZiAoIXRza191c2VkX21hdGgodCkpCiAJCXJldHVybiAwOwogCWlmICh0ID09IGN1cnJlbnQpCkBAIC0yOTQsOCArMjkzLDYgQEAKIH0gd2hpbGUoMCkgCiAKIAotI2RlZmluZSBlbGZfbWFwIGVsZjMyX21hcAotCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIE1PRFVMRV9ERVNDUklQVElPTigiQmluYXJ5IGZvcm1hdCBsb2FkZXIgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBJQTMyIEVMRiBiaW5hcmllcy4iKTsgCkBAIC0zOTEsMjEgKzM4OCw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGlhMzJfc2V0dXBfYXJnX3BhZ2VzKTsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWVsZjMyX21hcCAoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBlbGZfcGhkciAqZXBwbnQsIGludCBwcm90LCBpbnQgdHlwZSkKLXsKLQl1bnNpZ25lZCBsb25nIG1hcF9hZGRyOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqbWUgPSBjdXJyZW50OyAKLQotCWRvd25fd3JpdGUoJm1lLT5tbS0+bW1hcF9zZW0pOwotCW1hcF9hZGRyID0gZG9fbW1hcChmaWxlcCwgRUxGX1BBR0VTVEFSVChhZGRyKSwKLQkJCSAgIGVwcG50LT5wX2ZpbGVzeiArIEVMRl9QQUdFT0ZGU0VUKGVwcG50LT5wX3ZhZGRyKSwgcHJvdCwgCi0JCQkgICB0eXBlLAotCQkJICAgZXBwbnQtPnBfb2Zmc2V0IC0gRUxGX1BBR0VPRkZTRVQoZXBwbnQtPnBfdmFkZHIpKTsKLQl1cF93cml0ZSgmbWUtPm1tLT5tbWFwX3NlbSk7Ci0JcmV0dXJuKG1hcF9hZGRyKTsKLX0KLQogI2lmZGVmIENPTkZJR19TWVNDVEwKIC8qIFJlZ2lzdGVyIHZzeXNjYWxsMzIgaW50byB0aGUgQUJJIHRhYmxlICovCiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJfaW9jdGwuYyBiL2FyY2gveDg2XzY0L2lhMzIvaWEzMl9pb2N0bC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzM1YmQwLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2XzY0L2lhMzIvaWEzMl9pb2N0bC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyogJElkOiBpYTMyX2lvY3RsLmMsdiAxLjI1IDIwMDIvMTAvMTEgMDc6MTc6MDYgYWsgRXhwICQKLSAqIGlvY3RsMzIuYzogQ29udmVyc2lvbiBiZXR3ZWVuIDMyYml0IGFuZCA2NGJpdCBuYXRpdmUgaW9jdGxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwICBKYWt1YiBKZWxpbmVrICAoamFrdWJAcmVkaGF0LmNvbSkKLSAqIENvcHlyaWdodCAoQykgMTk5OCAgRWRkaWUgQy4gRG9zdCAgKGVjZEBza3luZXQuYmUpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiAgQW5kaSBLbGVlbiwgU3VTRSBMYWJzIAotICoKLSAqIFRoZXNlIHJvdXRpbmVzIG1haW50YWluIGFyZ3VtZW50IHNpemUgY29udmVyc2lvbiBiZXR3ZWVuIDMyYml0IGFuZCA2NGJpdAotICogaW9jdGxzLgotICovCi0KLSNkZWZpbmUgSU5DTFVERVMKLSNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgotI2luY2x1ZGUgImNvbXBhdF9pb2N0bC5jIgotI2luY2x1ZGUgPGFzbS9pYTMyLmg+Ci0KLSNkZWZpbmUgQ09ERQotI2luY2x1ZGUgImNvbXBhdF9pb2N0bC5jIgotICAKLSNkZWZpbmUgUlRDX0lSUVBfUkVBRDMyCV9JT1IoJ3AnLCAweDBiLCB1bnNpZ25lZCBpbnQpCSAvKiBSZWFkIElSUSByYXRlICAgKi8KLSNkZWZpbmUgUlRDX0lSUVBfU0VUMzIJX0lPVygncCcsIDB4MGMsIHVuc2lnbmVkIGludCkJIC8qIFNldCBJUlEgcmF0ZSAgICAqLwotI2RlZmluZSBSVENfRVBPQ0hfUkVBRDMyCV9JT1IoJ3AnLCAweDBkLCB1bnNpZ25lZCkJIC8qIFJlYWQgZXBvY2ggICAgICAqLwotI2RlZmluZSBSVENfRVBPQ0hfU0VUMzIJCV9JT1coJ3AnLCAweDBlLCB1bnNpZ25lZCkJIC8qIFNldCBlcG9jaCAgICAgICAqLwotCi1zdGF0aWMgaW50IHJ0YzMyX2lvY3RsKHVuc2lnbmVkIGZkLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKSAKLXsgCi0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JbW1fc2VnbWVudF90IG9sZGZzID0gZ2V0X2ZzKCk7IAotCWludCByZXQ7IAotCQotCXN3aXRjaCAoY21kKSB7IAotCWNhc2UgUlRDX0lSUVBfUkVBRDMyOiAKLQkJc2V0X2ZzKEtFUk5FTF9EUyk7IAotCQlyZXQgPSBzeXNfaW9jdGwoZmQsIFJUQ19JUlFQX1JFQUQsICh1bnNpZ25lZCBsb25nKSZ2YWwpOyAKLQkJc2V0X2ZzKG9sZGZzKTsgCi0JCWlmICghcmV0KQotCQkJcmV0ID0gcHV0X3VzZXIodmFsLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSBhcmcpOyAKLQkJcmV0dXJuIHJldDsgCi0KLQljYXNlIFJUQ19JUlFQX1NFVDMyOiAKLQkJY21kID0gUlRDX0lSUVBfU0VUOyAKLQkJYnJlYWs7IAotCi0JY2FzZSBSVENfRVBPQ0hfUkVBRDMyOgotCQlzZXRfZnMoS0VSTkVMX0RTKTsgCi0JCXJldCA9IHN5c19pb2N0bChmZCwgUlRDX0VQT0NIX1JFQUQsICh1bnNpZ25lZCBsb25nKSAmdmFsKTsgCi0JCXNldF9mcyhvbGRmcyk7IAotCQlpZiAoIXJldCkKLQkJCXJldCA9IHB1dF91c2VyKHZhbCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKikgYXJnKTsgCi0JCXJldHVybiByZXQ7IAotCi0JY2FzZSBSVENfRVBPQ0hfU0VUMzI6Ci0JCWNtZCA9IFJUQ19FUE9DSF9TRVQ7IAotCQlicmVhazsgCi0JfSAKLQlyZXR1cm4gc3lzX2lvY3RsKGZkLGNtZCxhcmcpOyAKLX0gCi0KLQotI2RlZmluZSBIQU5ETEVfSU9DVEwoY21kLGhhbmRsZXIpIHsgKGNtZCksIChpb2N0bF90cmFuc19oYW5kbGVyX3QpKGhhbmRsZXIpIH0sIAotI2RlZmluZSBDT01QQVRJQkxFX0lPQ1RMKGNtZCkgSEFORExFX0lPQ1RMKGNtZCxzeXNfaW9jdGwpCi0KLXN0cnVjdCBpb2N0bF90cmFucyBpb2N0bF9zdGFydFtdID0geyAKLSNpbmNsdWRlIDxsaW51eC9jb21wYXRfaW9jdGwuaD4KLSNkZWZpbmUgREVDTEFSRVMKLSNpbmNsdWRlICJjb21wYXRfaW9jdGwuYyIKLQotLyogQW5kIHRoZXNlIGlvY3RscyBuZWVkIHRyYW5zbGF0aW9uICovCi0vKiByZWFsdGltZSBkZXZpY2UgKi8KLUhBTkRMRV9JT0NUTChSVENfSVJRUF9SRUFELCAgcnRjMzJfaW9jdGwpCi1IQU5ETEVfSU9DVEwoUlRDX0lSUVBfUkVBRDMyLHJ0YzMyX2lvY3RsKQotSEFORExFX0lPQ1RMKFJUQ19JUlFQX1NFVDMyLCBydGMzMl9pb2N0bCkKLUhBTkRMRV9JT0NUTChSVENfRVBPQ0hfUkVBRDMyLCBydGMzMl9pb2N0bCkKLUhBTkRMRV9JT0NUTChSVENfRVBPQ0hfU0VUMzIsIHJ0YzMyX2lvY3RsKQotLyogdGFrZSBjYXJlIG9mIHNpemVvZihzaXplb2YoKSkgYnJlYWthZ2UgKi8KLX07IAotCi1pbnQgaW9jdGxfdGFibGVfc2l6ZSA9IEFSUkFZX1NJWkUoaW9jdGxfc3RhcnQpOwotCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJfc2lnbmFsLmMgYi9hcmNoL3g4Nl82NC9pYTMyL2lhMzJfc2lnbmFsLmMKaW5kZXggMDkwM2NjMS4uZTBhOTI0MyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvaWEzMi9pYTMyX3NpZ25hbC5jCisrKyBiL2FyY2gveDg2XzY0L2lhMzIvaWEzMl9zaWduYWwuYwpAQCAtMzUzLDcgKzM1Myw2IEBACiAJCSBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgaW50IG1hc2spCiB7CiAJaW50IHRtcCwgZXJyID0gMDsKLQl1MzIgZWZsYWdzOwogCiAJdG1wID0gMDsKIAlfX2FzbV9fKCJtb3ZsICUlZ3MsJTAiIDogIj1yIih0bXApOiAiMCIodG1wKSk7CkBAIC0zNzgsMTAgKzM3Nyw3IEBACiAJZXJyIHw9IF9fcHV0X3VzZXIoY3VycmVudC0+dGhyZWFkLnRyYXBfbm8sICZzYy0+dHJhcG5vKTsKIAllcnIgfD0gX19wdXRfdXNlcihjdXJyZW50LT50aHJlYWQuZXJyb3JfY29kZSwgJnNjLT5lcnIpOwogCWVyciB8PSBfX3B1dF91c2VyKCh1MzIpcmVncy0+cmlwLCAmc2MtPmVpcCk7Ci0JZWZsYWdzID0gcmVncy0+ZWZsYWdzOwotCWlmIChjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKQotCQllZmxhZ3MgJj0gflRGX01BU0s7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoKHUzMillZmxhZ3MsICZzYy0+ZWZsYWdzKTsKKwllcnIgfD0gX19wdXRfdXNlcigodTMyKXJlZ3MtPmVmbGFncywgJnNjLT5lZmxhZ3MpOwogCWVyciB8PSBfX3B1dF91c2VyKCh1MzIpcmVncy0+cnNwLCAmc2MtPmVzcF9hdF9zaWduYWwpOwogCiAJdG1wID0gc2F2ZV9pMzg3X2lhMzIoY3VycmVudCwgZnBzdGF0ZSwgcmVncywgMCk7CkBAIC01MDUsMTMgKzUwMSw5IEBACiAJcmVncy0+c3MgPSBfX1VTRVIzMl9EUzsgCiAKIAlzZXRfZnMoVVNFUl9EUyk7Ci0JaWYgKHJlZ3MtPmVmbGFncyAmIFRGX01BU0spIHsKLQkJaWYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpIHsKLQkJCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZWdzLT5lZmxhZ3MgJj0gflRGX01BU0s7Ci0JCX0KLQl9CisgICAgcmVncy0+ZWZsYWdzICY9IH5URl9NQVNLOworICAgIGlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSkKKyAgICAgICAgcHRyYWNlX25vdGlmeShTSUdUUkFQKTsKIAogI2lmIERFQlVHX1NJRwogCXByaW50aygiU0lHIGRlbGl2ZXIgKCVzOiVkKTogc3A9JXAgcGM9JXAgcmE9JXBcbiIsCkBAIC02MDUsMTMgKzU5Nyw5IEBACiAJcmVncy0+c3MgPSBfX1VTRVIzMl9EUzsgCiAKIAlzZXRfZnMoVVNFUl9EUyk7Ci0JaWYgKHJlZ3MtPmVmbGFncyAmIFRGX01BU0spIHsKLQkJaWYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpIHsKLQkJCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZWdzLT5lZmxhZ3MgJj0gflRGX01BU0s7Ci0JCX0KLQl9CisgICAgcmVncy0+ZWZsYWdzICY9IH5URl9NQVNLOworICAgIGlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSkKKyAgICAgICAgcHRyYWNlX25vdGlmeShTSUdUUkFQKTsKIAogI2lmIERFQlVHX1NJRwogCXByaW50aygiU0lHIGRlbGl2ZXIgKCVzOiVkKTogc3A9JXAgcGM9JXAgcmE9JXBcbiIsCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJlbnRyeS5TIGIvYXJjaC94ODZfNjQvaWEzMi9pYTMyZW50cnkuUwppbmRleCBkZjA3NzNjLi5mMDVjMmE4IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJlbnRyeS5TCisrKyBiL2FyY2gveDg2XzY0L2lhMzIvaWEzMmVudHJ5LlMKQEAgLTM1LDYgKzM1LDE4IEBACiAJbW92cQklcmF4LFI4KCVyc3ApCiAJLmVuZG0KIAorCS5tYWNybyBDRklfU1RBUlRQUk9DMzIgc2ltcGxlCisJQ0ZJX1NUQVJUUFJPQwlcc2ltcGxlCisJQ0ZJX1VOREVGSU5FRAlyOAorCUNGSV9VTkRFRklORUQJcjkKKwlDRklfVU5ERUZJTkVECXIxMAorCUNGSV9VTkRFRklORUQJcjExCisJQ0ZJX1VOREVGSU5FRAlyMTIKKwlDRklfVU5ERUZJTkVECXIxMworCUNGSV9VTkRFRklORUQJcjE0CisJQ0ZJX1VOREVGSU5FRAlyMTUKKwkuZW5kbQorCiAvKgogICogMzJiaXQgU1lTRU5URVIgaW5zdHJ1Y3Rpb24gZW50cnkuCiAgKgpAQCAtNTUsNyArNjcsNyBAQAogICogd2l0aCB0aGUgaW50IDB4ODAgcGF0aC4KICAqLyAJCiBFTlRSWShpYTMyX3N5c2VudGVyX3RhcmdldCkKLQlDRklfU1RBUlRQUk9DCXNpbXBsZQorCUNGSV9TVEFSVFBST0MzMglzaW1wbGUKIAlDRklfREVGX0NGQQlyc3AsMAogCUNGSV9SRUdJU1RFUglyc3AscmJwCiAJc3dhcGdzCkBAIC05Miw2ICsxMDQsNyBAQAogIAkucXVhZCAxYixpYTMyX2JhZGFyZwogIAkucHJldmlvdXMJCiAJR0VUX1RIUkVBRF9JTkZPKCVyMTApCisJb3JsICAgICRUU19DT01QQVQsdGhyZWFkaW5mb19zdGF0dXMoJXIxMCkKIAl0ZXN0bCAgJChfVElGX1NZU0NBTExfVFJBQ0V8X1RJRl9TWVNDQUxMX0FVRElUfF9USUZfU0VDQ09NUCksdGhyZWFkaW5mb19mbGFncyglcjEwKQogCUNGSV9SRU1FTUJFUl9TVEFURQogCWpueiAgc3lzZW50ZXJfdHJhY2VzeXMKQEAgLTEwNSw2ICsxMTgsNyBAQAogCWNsaQogCXRlc3RsCSRfVElGX0FMTFdPUktfTUFTSyx0aHJlYWRpbmZvX2ZsYWdzKCVyMTApCiAJam56CWludF9yZXRfZnJvbV9zeXNfY2FsbAorCWFuZGwgICAgJH5UU19DT01QQVQsdGhyZWFkaW5mb19zdGF0dXMoJXIxMCkKIAkvKiBjbGVhciBJRiwgdGhhdCBwb3BmcSBkb2Vzbid0IGVuYWJsZSBpbnRlcnJ1cHRzIGVhcmx5ICovCiAJYW5kbCAgJH4weDIwMCxFRkxBR1MtUjExKCVyc3ApIAogCVJFU1RPUkVfQVJHUyAxLDI0LDEsMSwxLDEKQEAgLTE2MSw3ICsxNzUsNyBAQAogICogd2l0aCB0aGUgaW50IDB4ODAgcGF0aC4JCiAgKi8gCQogRU5UUlkoaWEzMl9jc3Rhcl90YXJnZXQpCi0JQ0ZJX1NUQVJUUFJPQwlzaW1wbGUKKwlDRklfU1RBUlRQUk9DMzIJc2ltcGxlCiAJQ0ZJX0RFRl9DRkEJcnNwLDAKIAlDRklfUkVHSVNURVIJcmlwLHJjeAogCS8qQ0ZJX1JFR0lTVEVSCXJmbGFncyxyMTEqLwpAQCAtMTkxLDYgKzIwNSw3IEBACiAJLnF1YWQgMWIsaWEzMl9iYWRhcmcKIAkucHJldmlvdXMJCiAJR0VUX1RIUkVBRF9JTkZPKCVyMTApCisJb3JsICAgJFRTX0NPTVBBVCx0aHJlYWRpbmZvX3N0YXR1cyglcjEwKQogCXRlc3RsICQoX1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU1lTQ0FMTF9BVURJVHxfVElGX1NFQ0NPTVApLHRocmVhZGluZm9fZmxhZ3MoJXIxMCkKIAlDRklfUkVNRU1CRVJfU1RBVEUKIAlqbnogICBjc3Rhcl90cmFjZXN5cwpAQCAtMjA0LDYgKzIxOSw3IEBACiAJY2xpCiAJdGVzdGwgJF9USUZfQUxMV09SS19NQVNLLHRocmVhZGluZm9fZmxhZ3MoJXIxMCkKIAlqbnogIGludF9yZXRfZnJvbV9zeXNfY2FsbAorCWFuZGwgJH5UU19DT01QQVQsdGhyZWFkaW5mb19zdGF0dXMoJXIxMCkKIAlSRVNUT1JFX0FSR1MgMSwtQVJHX1NLSVAsMSwxLDEKIAltb3ZsIFJJUC1BUkdPRkZTRVQoJXJzcCksJWVjeAogCUNGSV9SRUdJU1RFUiByaXAscmN4CkBAIC0yNzYsNiArMjkyLDcgQEAKIAkgICB0aGlzIGNvdWxkIGJlIGEgcHJvYmxlbS4gKi8KIAlTQVZFX0FSR1MgMCwwLDEKIAlHRVRfVEhSRUFEX0lORk8oJXIxMCkKKwlvcmwgICAkVFNfQ09NUEFULHRocmVhZGluZm9fc3RhdHVzKCVyMTApCiAJdGVzdGwgJChfVElGX1NZU0NBTExfVFJBQ0V8X1RJRl9TWVNDQUxMX0FVRElUfF9USUZfU0VDQ09NUCksdGhyZWFkaW5mb19mbGFncyglcjEwKQogCWpueiBpYTMyX3RyYWNlc3lzCiBpYTMyX2RvX3N5c2NhbGw6CQpAQCAtMzE4LDcgKzMzNSw3IEBACiAJam1wICBpYTMyX3B0cmVnc19jb21tb24JCiAJLmVuZG0KIAotCUNGSV9TVEFSVFBST0MKKwlDRklfU1RBUlRQUk9DMzIKIAogCVBUUkVHU0NBTEwgc3R1YjMyX3J0X3NpZ3JldHVybiwgc3lzMzJfcnRfc2lncmV0dXJuLCAlcmRpCiAJUFRSRUdTQ0FMTCBzdHViMzJfc2lncmV0dXJuLCBzeXMzMl9zaWdyZXR1cm4sICVyZGkKQEAgLTMzMyw4ICszNTAsMTkgQEAKIAogRU5UUlkoaWEzMl9wdHJlZ3NfY29tbW9uKQogCXBvcHEgJXIxMQotCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtOAotCUNGSV9SRUdJU1RFUiByaXAsIHIxMQorCUNGSV9FTkRQUk9DCisJQ0ZJX1NUQVJUUFJPQzMyCXNpbXBsZQorCUNGSV9ERUZfQ0ZBCXJzcCxTUys4LUFSR09GRlNFVAorCUNGSV9SRUxfT0ZGU0VUCXJheCxSQVgtQVJHT0ZGU0VUCisJQ0ZJX1JFTF9PRkZTRVQJcmN4LFJDWC1BUkdPRkZTRVQKKwlDRklfUkVMX09GRlNFVAlyZHgsUkRYLUFSR09GRlNFVAorCUNGSV9SRUxfT0ZGU0VUCXJzaSxSU0ktQVJHT0ZGU0VUCisJQ0ZJX1JFTF9PRkZTRVQJcmRpLFJESS1BUkdPRkZTRVQKKwlDRklfUkVMX09GRlNFVAlyaXAsUklQLUFSR09GRlNFVAorLyoJQ0ZJX1JFTF9PRkZTRVQJY3MsQ1MtQVJHT0ZGU0VUKi8KKy8qCUNGSV9SRUxfT0ZGU0VUCXJmbGFncyxFRkxBR1MtQVJHT0ZGU0VUKi8KKwlDRklfUkVMX09GRlNFVAlyc3AsUlNQLUFSR09GRlNFVAorLyoJQ0ZJX1JFTF9PRkZTRVQJc3MsU1MtQVJHT0ZGU0VUKi8KIAlTQVZFX1JFU1QKIAljYWxsIColcmF4CiAJUkVTVE9SRV9SRVNUCkBAIC02MDgsNyArNjM2LDcgQEAKIAkucXVhZCBzeXNfZXBvbGxfd2FpdAogCS5xdWFkIHN5c19yZW1hcF9maWxlX3BhZ2VzCiAJLnF1YWQgc3lzX3NldF90aWRfYWRkcmVzcwotCS5xdWFkIHN5czMyX3RpbWVyX2NyZWF0ZQorCS5xdWFkIGNvbXBhdF9zeXNfdGltZXJfY3JlYXRlCiAJLnF1YWQgY29tcGF0X3N5c190aW1lcl9zZXR0aW1lCS8qIDI2MCAqLwogCS5xdWFkIGNvbXBhdF9zeXNfdGltZXJfZ2V0dGltZQogCS5xdWFkIHN5c190aW1lcl9nZXRvdmVycnVuCkBAIC02NDMsNiArNjcxLDIwIEBACiAJLnF1YWQgc3lzX2lub3RpZnlfaW5pdAogCS5xdWFkIHN5c19pbm90aWZ5X2FkZF93YXRjaAogCS5xdWFkIHN5c19pbm90aWZ5X3JtX3dhdGNoCisJLnF1YWQgc3lzX21pZ3JhdGVfcGFnZXMKKwkucXVhZCBjb21wYXRfc3lzX29wZW5hdAkJLyogMjk1ICovCisJLnF1YWQgc3lzX21rZGlyYXQKKwkucXVhZCBzeXNfbWtub2RhdAorCS5xdWFkIHN5c19mY2hvd25hdAorCS5xdWFkIHN5c19mdXRpbWVzYXQKKwkucXVhZCBjb21wYXRfc3lzX25ld2ZzdGF0YXQJLyogMzAwICovCisJLnF1YWQgc3lzX3VubGlua2F0CisJLnF1YWQgc3lzX3JlbmFtZWF0CisJLnF1YWQgc3lzX2xpbmthdAorCS5xdWFkIHN5c19zeW1saW5rYXQKKwkucXVhZCBzeXNfcmVhZGxpbmthdAkJLyogMzA1ICovCisJLnF1YWQgc3lzX2ZjaG1vZGF0CisJLnF1YWQgc3lzX2ZhY2Nlc3NhdAogaWEzMl9zeXNjYWxsX2VuZDoJCQogCS5yZXB0IElBMzJfTlJfc3lzY2FsbHMtKGlhMzJfc3lzY2FsbF9lbmQtaWEzMl9zeXNfY2FsbF90YWJsZSkvOAogCQkucXVhZCBuaV9zeXNjYWxsCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL21tYXAzMi5jIGIvYXJjaC94ODZfNjQvaWEzMi9tbWFwMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzlmNDEzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODZfNjQvaWEzMi9tbWFwMzIuYwpAQCAtMCwwICsxLDc4IEBACisvKgorICogIGxpbnV4L2FyY2gveDg2XzY0L2lhMzIvbW0vbW1hcC5jCisgKgorICogIGZsZXhpYmxlIG1tYXAgbGF5b3V0IHN1cHBvcnQKKyAqCisgKiBCYXNlZCBvbiB0aGUgaTM4NiB2ZXJzaW9uIHdoaWNoIHdhcworICoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDQgUmVkIEhhdCBJbmMuLCBEdXJoYW0sIE5vcnRoIENhcm9saW5hLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICoKKyAqIFN0YXJ0ZWQgYnkgSW5nbyBNb2xuYXIgPG1pbmdvQGVsdGUuaHU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKworLyoKKyAqIFRvcCBvZiBtbWFwIGFyZWEgKGp1c3QgYmVsb3cgdGhlIHByb2Nlc3Mgc3RhY2spLgorICoKKyAqIExlYXZlIGFuIGF0IGxlYXN0IH4xMjggTUIgaG9sZS4KKyAqLworI2RlZmluZSBNSU5fR0FQICgxMjgqMTAyNCoxMDI0KQorI2RlZmluZSBNQVhfR0FQIChUQVNLX1NJWkUvNio1KQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbW1hcF9iYXNlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXVuc2lnbmVkIGxvbmcgZ2FwID0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9TVEFDS10ucmxpbV9jdXI7CisJdW5zaWduZWQgbG9uZyByYW5kb21fZmFjdG9yID0gMDsKKworCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX1JBTkRPTUlaRSkKKwkJcmFuZG9tX2ZhY3RvciA9IGdldF9yYW5kb21faW50KCkgJSAoMTAyNCoxMDI0KTsKKworCWlmIChnYXAgPCBNSU5fR0FQKQorCQlnYXAgPSBNSU5fR0FQOworCWVsc2UgaWYgKGdhcCA+IE1BWF9HQVApCisJCWdhcCA9IE1BWF9HQVA7CisKKwlyZXR1cm4gUEFHRV9BTElHTihUQVNLX1NJWkUgLSBnYXAgLSByYW5kb21fZmFjdG9yKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24sIGNhbGxlZCB2ZXJ5IGVhcmx5IGR1cmluZyB0aGUgY3JlYXRpb24gb2YgYSBuZXcKKyAqIHByb2Nlc3MgVk0gaW1hZ2UsIHNldHMgdXAgd2hpY2ggVk0gbGF5b3V0IGZ1bmN0aW9uIHRvIHVzZToKKyAqLwordm9pZCBpYTMyX3BpY2tfbW1hcF9sYXlvdXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJLyoKKwkgKiBGYWxsIGJhY2sgdG8gdGhlIHN0YW5kYXJkIGxheW91dCBpZiB0aGUgcGVyc29uYWxpdHkKKwkgKiBiaXQgaXMgc2V0LCBvciBpZiB0aGUgZXhwZWN0ZWQgc3RhY2sgZ3Jvd3RoIGlzIHVubGltaXRlZDoKKwkgKi8KKwlpZiAoc3lzY3RsX2xlZ2FjeV92YV9sYXlvdXQgfHwKKwkJCShjdXJyZW50LT5wZXJzb25hbGl0eSAmIEFERFJfQ09NUEFUX0xBWU9VVCkgfHwKKwkJCWN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfU1RBQ0tdLnJsaW1fY3VyID09IFJMSU1fSU5GSU5JVFkpIHsKKwkJbW0tPm1tYXBfYmFzZSA9IFRBU0tfVU5NQVBQRURfQkFTRTsKKwkJbW0tPmdldF91bm1hcHBlZF9hcmVhID0gYXJjaF9nZXRfdW5tYXBwZWRfYXJlYTsKKwkJbW0tPnVubWFwX2FyZWEgPSBhcmNoX3VubWFwX2FyZWE7CisJfSBlbHNlIHsKKwkJbW0tPm1tYXBfYmFzZSA9IG1tYXBfYmFzZShtbSk7CisJCW1tLT5nZXRfdW5tYXBwZWRfYXJlYSA9IGFyY2hfZ2V0X3VubWFwcGVkX2FyZWFfdG9wZG93bjsKKwkJbW0tPnVubWFwX2FyZWEgPSBhcmNoX3VubWFwX2FyZWFfdG9wZG93bjsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL3B0cmFjZTMyLmMgYi9hcmNoL3g4Nl82NC9pYTMyL3B0cmFjZTMyLmMKaW5kZXggMmE5MjVlMi4uMjNhNDUxNSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvaWEzMi9wdHJhY2UzMi5jCisrKyBiL2FyY2gveDg2XzY0L2lhMzIvcHRyYWNlMzIuYwpAQCAtMjgsOSArMjgsMTIgQEAKICNpbmNsdWRlIDxhc20vaTM4Ny5oPgogI2luY2x1ZGUgPGFzbS9mcHUzMi5oPgogCi0vKiBkZXRlcm1pbmVzIHdoaWNoIGZsYWdzIHRoZSB1c2VyIGhhcyBhY2Nlc3MgdG8uICovCi0vKiAxID0gYWNjZXNzIDAgPSBubyBhY2Nlc3MgKi8KLSNkZWZpbmUgRkxBR19NQVNLIDB4NDRkZDVVTAorLyoKKyAqIERldGVybWluZXMgd2hpY2ggZmxhZ3MgdGhlIHVzZXIgaGFzIGFjY2VzcyB0byBbMSA9IGFjY2VzcywgMCA9IG5vIGFjY2Vzc10uCisgKiBQcm9oaWJpdHMgY2hhbmdpbmcgSUQoMjEpLCBWSVAoMjApLCBWSUYoMTkpLCBWTSgxNyksIElPUEwoMTItMTMpLCBJRig5KS4KKyAqIEFsc28gbWFza3MgcmVzZXJ2ZWQgYml0cyAoMzEtMjIsIDE1LCA1LCAzLCAxKS4KKyAqLworI2RlZmluZSBGTEFHX01BU0sgMHg1NGRkNVVMCiAKICNkZWZpbmUgUjMyKGwscSkgXAogCWNhc2Ugb2Zmc2V0b2Yoc3RydWN0IHVzZXIzMiwgcmVncy5sKTogc3RhY2tbb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHEpLzhdID0gdmFsOyBicmVhawpAQCAtMzgsNyArNDEsNyBAQAogc3RhdGljIGludCBwdXRyZWczMihzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCB1bnNpZ25lZCByZWdubywgdTMyIHZhbCkKIHsKIAlpbnQgaTsKLQlfX3U2NCAqc3RhY2sgPSAoX191NjQgKikoY2hpbGQtPnRocmVhZC5yc3AwIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7IAorCV9fdTY0ICpzdGFjayA9IChfX3U2NCAqKXRhc2tfcHRfcmVncyhjaGlsZCk7CiAKIAlzd2l0Y2ggKHJlZ25vKSB7CiAJY2FzZSBvZmZzZXRvZihzdHJ1Y3QgdXNlcjMyLCByZWdzLmZzKToKQEAgLTEzNCw3ICsxMzcsNyBAQAogCiBzdGF0aWMgaW50IGdldHJlZzMyKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIHVuc2lnbmVkIHJlZ25vLCB1MzIgKnZhbCkKIHsKLQlfX3U2NCAqc3RhY2sgPSAoX191NjQgKikoY2hpbGQtPnRocmVhZC5yc3AwIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7IAorCV9fdTY0ICpzdGFjayA9IChfX3U2NCAqKXRhc2tfcHRfcmVncyhjaGlsZCk7CiAKIAlzd2l0Y2ggKHJlZ25vKSB7CiAJY2FzZSBvZmZzZXRvZihzdHJ1Y3QgdXNlcjMyLCByZWdzLmZzKToKQEAgLTE5NiwzNiArMTk5LDYgQEAKIAogI3VuZGVmIFIzMgogCi1zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpmaW5kX3RhcmdldChpbnQgcmVxdWVzdCwgaW50IHBpZCwgaW50ICplcnIpCi17IAotCXN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQ7Ci0KLQkqZXJyID0gLUVQRVJNOyAKLQlpZiAocGlkID09IDEpCi0JCXJldHVybiBOVUxMOyAKLQotCSplcnIgPSAtRVNSQ0g7Ci0JcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQljaGlsZCA9IGZpbmRfdGFza19ieV9waWQocGlkKTsKLQlpZiAoY2hpbGQpCi0JCWdldF90YXNrX3N0cnVjdChjaGlsZCk7Ci0JcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotCWlmIChjaGlsZCkgeyAKLQkJKmVyciA9IC1FUEVSTTsKLQkJaWYgKGNoaWxkLT5waWQgPT0gMSkgCi0JCQlnb3RvIG91dDsKLQkJKmVyciA9IHB0cmFjZV9jaGVja19hdHRhY2goY2hpbGQsIHJlcXVlc3QgPT0gUFRSQUNFX0tJTEwpOyAKLQkJaWYgKCplcnIgPCAwKSAKLQkJCWdvdG8gb3V0OwotCQlyZXR1cm4gY2hpbGQ7IAotCX0gCi0gb3V0OgotCWlmIChjaGlsZCkKLQlwdXRfdGFza19zdHJ1Y3QoY2hpbGQpOwotCXJldHVybiBOVUxMOyAKLQkKLX0gCi0KIGFzbWxpbmthZ2UgbG9uZyBzeXMzMl9wdHJhY2UobG9uZyByZXF1ZXN0LCB1MzIgcGlkLCB1MzIgYWRkciwgdTMyIGRhdGEpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZDsKQEAgLTI1NCwxMSArMjI3LDE4IEBACiAJCWJyZWFrOwogCX0gCiAKLQljaGlsZCA9IGZpbmRfdGFyZ2V0KHJlcXVlc3QsIHBpZCwgJnJldCk7Ci0JaWYgKCFjaGlsZCkKLQkJcmV0dXJuIHJldDsKKwlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfVFJBQ0VNRSkKKwkJcmV0dXJuIHB0cmFjZV90cmFjZW1lKCk7CiAKLQljaGlsZHJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikoY2hpbGQtPnRocmVhZC5yc3AwIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7IAorCWNoaWxkID0gcHRyYWNlX2dldF90YXNrX3N0cnVjdChwaWQpOworCWlmIChJU19FUlIoY2hpbGQpKQorCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisKKwlyZXQgPSBwdHJhY2VfY2hlY2tfYXR0YWNoKGNoaWxkLCByZXF1ZXN0ID09IFBUUkFDRV9LSUxMKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwljaGlsZHJlZ3MgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwogCiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6CkBAIC0zNzMsNiArMzUzLDcgQEAKIAkJYnJlYWs7CiAJfQogCisgb3V0OgogCXB1dF90YXNrX3N0cnVjdChjaGlsZCk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2lhMzIvc3lzX2lhMzIuYyBiL2FyY2gveDg2XzY0L2lhMzIvc3lzX2lhMzIuYwppbmRleCA1Mzg5ZGY2Li41NDQ4MWFmIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9pYTMyL3N5c19pYTMyLmMKKysrIGIvYXJjaC94ODZfNjQvaWEzMi9zeXNfaWEzMi5jCkBAIC05NjksMjUgKzk2OSw2IEBACiAJcmV0dXJuIHN5c19raWxsKHBpZCwgc2lnKTsKIH0KICAKLWV4dGVybiBhc21saW5rYWdlIGxvbmcKLXN5c190aW1lcl9jcmVhdGUoY2xvY2tpZF90IHdoaWNoX2Nsb2NrLAotCQkgc3RydWN0IHNpZ2V2ZW50IF9fdXNlciAqdGltZXJfZXZlbnRfc3BlYywKLQkJIHRpbWVyX3QgX191c2VyICogY3JlYXRlZF90aW1lcl9pZCk7Ci0KLWxvbmcKLXN5czMyX3RpbWVyX2NyZWF0ZSh1MzIgY2xvY2ssIHN0cnVjdCBjb21wYXRfc2lnZXZlbnQgX191c2VyICpzZTMyLCB0aW1lcl90IF9fdXNlciAqdGltZXJfaWQpCi17Ci0Jc3RydWN0IHNpZ2V2ZW50IF9fdXNlciAqcCA9IE5VTEw7Ci0JaWYgKHNlMzIpIHsgCi0JCXN0cnVjdCBzaWdldmVudCBzZTsKLQkJcCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZihzdHJ1Y3Qgc2lnZXZlbnQpKTsKLQkJaWYgKGdldF9jb21wYXRfc2lnZXZlbnQoJnNlLCBzZTMyKSB8fAotCQkgICAgY29weV90b191c2VyKHAsICZzZSwgc2l6ZW9mKHNlKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9IAotCXJldHVybiBzeXNfdGltZXJfY3JlYXRlKGNsb2NrLCBwLCB0aW1lcl9pZCk7Ci19IAotCiBsb25nIHN5czMyX2ZhZHZpc2U2NF82NChpbnQgZmQsIF9fdTMyIG9mZnNldF9sb3csIF9fdTMyIG9mZnNldF9oaWdoLCAKIAkJCV9fdTMyIGxlbl9sb3csIF9fdTMyIGxlbl9oaWdoLCBpbnQgYWR2aWNlKQogeyAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2lhMzIvdnN5c2NhbGwtc2lncmV0dXJuLlMgYi9hcmNoL3g4Nl82NC9pYTMyL3ZzeXNjYWxsLXNpZ3JldHVybi5TCmluZGV4IDhiNWE0YjAuLmQ5MDMyMWYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2lhMzIvdnN5c2NhbGwtc2lncmV0dXJuLlMKKysrIGIvYXJjaC94ODZfNjQvaWEzMi92c3lzY2FsbC1zaWdyZXR1cm4uUwpAQCAtNyw2ICs3LDcgQEAKICAqIGJ5IGRvaW5nICIuYmFsaWduIDMyIiBtdXN0IG1hdGNoIGluIGJvdGggdmVyc2lvbnMgb2YgdGhlIHBhZ2UuCiAgKi8KIAorCS5jb2RlMzIKIAkuc2VjdGlvbiAudGV4dC5zaWdyZXR1cm4sImF4IgogCS5iYWxpZ24gMzIKIAkuZ2xvYmwgX19rZXJuZWxfc2lncmV0dXJuCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL3ZzeXNjYWxsLXN5c2NhbGwuUyBiL2FyY2gveDg2XzY0L2lhMzIvdnN5c2NhbGwtc3lzY2FsbC5TCmluZGV4IGIwMjQ5NjViLi5jZjllZjY3IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9pYTMyL3ZzeXNjYWxsLXN5c2NhbGwuUworKysgYi9hcmNoL3g4Nl82NC9pYTMyL3ZzeXNjYWxsLXN5c2NhbGwuUwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgogCisJLmNvZGUzMgogCS50ZXh0CiAJLnNlY3Rpb24gLnRleHQudnN5c2NhbGwsImF4IgogCS5nbG9ibCBfX2tlcm5lbF92c3lzY2FsbApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvaWEzMi92c3lzY2FsbC1zeXNlbnRlci5TIGIvYXJjaC94ODZfNjQvaWEzMi92c3lzY2FsbC1zeXNlbnRlci5TCmluZGV4IDcxZjNkZTUuLmFlMDU2ZTUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2lhMzIvdnN5c2NhbGwtc3lzZW50ZXIuUworKysgYi9hcmNoL3g4Nl82NC9pYTMyL3ZzeXNjYWxsLXN5c2VudGVyLlMKQEAgLTUsNiArNSw3IEBACiAjaW5jbHVkZSA8YXNtL2lhMzJfdW5pc3RkLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKKwkuY29kZTMyCiAJLnRleHQKIAkuc2VjdGlvbiAudGV4dC52c3lzY2FsbCwiYXgiCiAJLmdsb2JsIF9fa2VybmVsX3ZzeXNjYWxsCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3g4Nl82NC9rZXJuZWwvTWFrZWZpbGUKaW5kZXggZmU0Y2JkMS4uNzJmZTYwYyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9NYWtlZmlsZQpAQCAtNyw3ICs3LDggQEAKIG9iai15CTo9IHByb2Nlc3MubyBzaWduYWwubyBlbnRyeS5vIHRyYXBzLm8gaXJxLm8gXAogCQlwdHJhY2UubyB0aW1lLm8gaW9wb3J0Lm8gbGR0Lm8gc2V0dXAubyBpODI1OS5vIHN5c194ODZfNjQubyBcCiAJCXg4NjY0X2tzeW1zLm8gaTM4Ny5vIHN5c2NhbGwubyB2c3lzY2FsbC5vIFwKLQkJc2V0dXA2NC5vIGJvb3RmbGFnLm8gZTgyMC5vIHJlYm9vdC5vIHF1aXJrcy5vIGk4MjM3Lm8KKwkJc2V0dXA2NC5vIGJvb3RmbGFnLm8gZTgyMC5vIHJlYm9vdC5vIHF1aXJrcy5vIGk4MjM3Lm8gXAorCQlkbWlfc2Nhbi5vIHBjaS1kbWEubyBwY2ktbm9tbXUubwogCiBvYmotJChDT05GSUdfWDg2X01DRSkgICAgICAgICArPSBtY2Uubwogb2JqLSQoQ09ORklHX1g4Nl9NQ0VfSU5URUwpCSs9IG1jZV9pbnRlbC5vCkBAIC0yMiwxNCArMjMsMTYgQEAKIG9iai0kKENPTkZJR19YODZfSU9fQVBJQykJKz0gaW9fYXBpYy5vIG1wcGFyc2UubyBcCiAJCWdlbmFwaWMubyBnZW5hcGljX2NsdXN0ZXIubyBnZW5hcGljX2ZsYXQubwogb2JqLSQoQ09ORklHX0tFWEVDKQkJKz0gbWFjaGluZV9rZXhlYy5vIHJlbG9jYXRlX2tlcm5lbC5vIGNyYXNoLm8KK29iai0kKENPTkZJR19DUkFTSF9EVU1QKQkrPSBjcmFzaF9kdW1wLm8KIG9iai0kKENPTkZJR19QTSkJCSs9IHN1c3BlbmQubwogb2JqLSQoQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQpCSs9IHN1c3BlbmRfYXNtLm8KIG9iai0kKENPTkZJR19DUFVfRlJFUSkJCSs9IGNwdWZyZXEvCiBvYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKQkrPSBlYXJseV9wcmludGsubwogb2JqLSQoQ09ORklHX0dBUlRfSU9NTVUpCSs9IHBjaS1nYXJ0Lm8gYXBlcnR1cmUubwotb2JqLSQoQ09ORklHX0RVTU1ZX0lPTU1VKQkrPSBwY2ktbm9tbXUubyBwY2ktZG1hLm8KK29iai0kKENPTkZJR19TV0lPVExCKQkJKz0gcGNpLXN3aW90bGIubwogb2JqLSQoQ09ORklHX0tQUk9CRVMpCQkrPSBrcHJvYmVzLm8KIG9iai0kKENPTkZJR19YODZfUE1fVElNRVIpCSs9IHBtdGltZXIubworb2JqLSQoQ09ORklHX1g4Nl9WU01QKQkJKz0gdnNtcC5vCiAKIG9iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gbW9kdWxlLm8KIApAQCAtNDYsMyArNDksNSBAQAogcXVpcmtzLXkJCQkrPSAuLi8uLi9pMzg2L2tlcm5lbC9xdWlya3MubwogaTgyMzcteQkJCQkrPSAuLi8uLi9pMzg2L2tlcm5lbC9pODIzNy5vCiBtc3ItJChzdWJzdCBtLHksJChDT05GSUdfWDg2X01TUikpICArPSAuLi8uLi9pMzg2L2tlcm5lbC9tc3IubworZG1pX3NjYW4teQkJCSs9IC4uLy4uL2kzODYva2VybmVsL2RtaV9zY2FuLm8KKwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2FjcGkvTWFrZWZpbGUgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS9NYWtlZmlsZQppbmRleCA3ZGE5YWNlLi40ZmU5NzA3IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS9NYWtlZmlsZQpAQCAtMSwzICsxLDggQEAKIG9iai15CQkJOj0gYm9vdC5vCiBib290LXkJCQk6PSAuLi8uLi8uLi9pMzg2L2tlcm5lbC9hY3BpL2Jvb3Qubwogb2JqLSQoQ09ORklHX0FDUElfU0xFRVApCSs9IHNsZWVwLm8gd2FrZXVwLm8KKworaWZuZXEgKCQoQ09ORklHX0FDUElfUFJPQ0VTU09SKSwpCitvYmoteQkJCSs9IHByb2Nlc3Nvci5vCitlbmRpZgorCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS9wcm9jZXNzb3IuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9hY3BpL3Byb2Nlc3Nvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZGMyYmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS9wcm9jZXNzb3IuYwpAQCAtMCwwICsxLDcyIEBACisvKgorICogYXJjaC94ODZfNjQva2VybmVsL2FjcGkvcHJvY2Vzc29yLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24KKyAqIAlWZW5rYXRlc2ggUGFsbGlwYWRpIDx2ZW5rYXRlc2gucGFsbGlwYWRpQGludGVsLmNvbT4KKyAqIAktIEFkZGVkIF9QREMgZm9yIHBsYXRmb3JtcyB3aXRoIEludGVsIENQVXMKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKworI2luY2x1ZGUgPGFjcGkvcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2FjcGkuaD4KKworc3RhdGljIHZvaWQgaW5pdF9pbnRlbF9wZGMoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwgc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpvYmpfbGlzdDsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCXUzMiAqYnVmOworCisJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcGRjLiBJdCB3aWxsIGJlIHVzZWQgbGF0ZXIuICovCisJb2JqX2xpc3QgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCksIEdGUF9LRVJORUwpOworCWlmICghb2JqX2xpc3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNZW1vcnkgYWxsb2NhdGlvbiBlcnJvclxuIik7CisJCXJldHVybjsKKwl9CisKKwlvYmogPSBrbWFsbG9jKHNpemVvZih1bmlvbiBhY3BpX29iamVjdCksIEdGUF9LRVJORUwpOworCWlmICghb2JqKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTWVtb3J5IGFsbG9jYXRpb24gZXJyb3JcbiIpOworCQlrZnJlZShvYmpfbGlzdCk7CisJCXJldHVybjsKKwl9CisKKwlidWYgPSBrbWFsbG9jKDEyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlwcmludGsoS0VSTl9FUlIgIk1lbW9yeSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKwkJa2ZyZWUob2JqKTsKKwkJa2ZyZWUob2JqX2xpc3QpOworCQlyZXR1cm47CisJfQorCisJYnVmWzBdID0gQUNQSV9QRENfUkVWSVNJT05fSUQ7CisJYnVmWzFdID0gMTsKKwlidWZbMl0gPSBBQ1BJX1BEQ19FU1RfQ0FQQUJJTElUWV9TTVA7CisKKwlvYmotPnR5cGUgPSBBQ1BJX1RZUEVfQlVGRkVSOworCW9iai0+YnVmZmVyLmxlbmd0aCA9IDEyOworCW9iai0+YnVmZmVyLnBvaW50ZXIgPSAodTggKikgYnVmOworCW9ial9saXN0LT5jb3VudCA9IDE7CisJb2JqX2xpc3QtPnBvaW50ZXIgPSBvYmo7CisJcHItPnBkYyA9IG9ial9saXN0OworCisJcmV0dXJuOworfQorCisvKiBJbml0aWFsaXplIF9QREMgZGF0YSBiYXNlZCBvbiB0aGUgQ1BVIHZlbmRvciAqLwordm9pZCBhcmNoX2FjcGlfcHJvY2Vzc29yX2luaXRfcGRjKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCit7CisJdW5zaWduZWQgaW50IGNwdSA9IHByLT5pZDsKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YSArIGNwdTsKKworCXByLT5wZGMgPSBOVUxMOworCWlmIChjLT54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwgJiYgY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9FU1QpKQorCQlpbml0X2ludGVsX3BkYyhwciwgYyk7CisKKwlyZXR1cm47Cit9CisKK0VYUE9SVF9TWU1CT0woYXJjaF9hY3BpX3Byb2Nlc3Nvcl9pbml0X3BkYyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvYXBlcnR1cmUuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9hcGVydHVyZS5jCmluZGV4IGM3ZjRmZGQuLmU0ZTJiN2QgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9hcGVydHVyZS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9hcGVydHVyZS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3Byb3RvLmg+CiAjaW5jbHVkZSA8YXNtL3BjaS1kaXJlY3QuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CiAKIGludCBpb21tdV9hcGVydHVyZTsKIGludCBpb21tdV9hcGVydHVyZV9kaXNhYmxlZCBfX2luaXRkYXRhID0gMDsKQEAgLTI0Nyw3ICsyNDgsNyBAQAogCQkvKiBHb3QgdGhlIGFwZXJ0dXJlIGZyb20gdGhlIEFHUCBicmlkZ2UgKi8KIAl9IGVsc2UgaWYgKHN3aW90bGIgJiYgIXZhbGlkX2FncCkgewogCQkvKiBEbyBub3RoaW5nICovCi0JfSBlbHNlIGlmICgoIW5vX2lvbW11ICYmIGVuZF9wZm4gPj0gMHhmZmZmZmZmZj4+UEFHRV9TSElGVCkgfHwKKwl9IGVsc2UgaWYgKCghbm9faW9tbXUgJiYgZW5kX3BmbiA+PSBNQVhfRE1BMzJfUEZOKSB8fAogCQkgICBmb3JjZV9pb21tdSB8fAogCQkgICB2YWxpZF9hZ3AgfHwKIAkJICAgZmFsbGJhY2tfYXBlcl9mb3JjZSkgeyAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9hcGljLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYXBpYy5jCmluZGV4IDE4NjkxY2UuLjVkM2M1YjAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9hcGljLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2FwaWMuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vc21wLmg+CkBAIC0zMywzNiArMzQsMzYgQEAKICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoX2FwaWMuaD4KICNpbmNsdWRlIDxhc20vbm1pLmg+CisjaW5jbHVkZSA8YXNtL2lkbGUuaD4KIAogaW50IGFwaWNfdmVyYm9zaXR5OwogCiBpbnQgZGlzYWJsZV9hcGljX3RpbWVyIF9faW5pdGRhdGE7CiAKKy8qCisgKiBjcHVfbWFzayB0aGF0IGRlbm90ZXMgdGhlIENQVXMgdGhhdCBuZWVkcyB0aW1lciBpbnRlcnJ1cHQgY29taW5nIGluIGFzCisgKiBJUElzIGluIHBsYWNlIG9mIGxvY2FsIEFQSUMgdGltZXJzCisgKi8KK3N0YXRpYyBjcHVtYXNrX3QgdGltZXJfaW50ZXJydXB0X2Jyb2FkY2FzdF9pcGlfbWFzazsKKwogLyogVXNpbmcgQVBJQyB0byBnZW5lcmF0ZSBzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0PyAqLwogaW50IHVzaW5nX2FwaWNfdGltZXIgPSAwOwogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBwcm9mX211bHRpcGxpZXIpID0gMTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIHByb2Zfb2xkX211bHRpcGxpZXIpID0gMTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIHByb2ZfY291bnRlcikgPSAxOwotCiBzdGF0aWMgdm9pZCBhcGljX3BtX2FjdGl2YXRlKHZvaWQpOwogCiB2b2lkIGVuYWJsZV9OTUlfdGhyb3VnaF9MVlQwICh2b2lkICogZHVtbXkpCiB7Ci0JdW5zaWduZWQgaW50IHYsIHZlcjsKKwl1bnNpZ25lZCBpbnQgdjsKIAkKLQl2ZXIgPSBhcGljX3JlYWQoQVBJQ19MVlIpOwotCXZlciA9IEdFVF9BUElDX1ZFUlNJT04odmVyKTsKIAl2ID0gQVBJQ19ETV9OTUk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5tYXNrIGFuZCBzZXQgdG8gTk1JICovCi0JYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCB2KTsKKwlhcGljX3dyaXRlKEFQSUNfTFZUMCwgdik7CiB9CiAKIGludCBnZXRfbWF4bHZ0KHZvaWQpCiB7Ci0JdW5zaWduZWQgaW50IHYsIHZlciwgbWF4bHZ0OworCXVuc2lnbmVkIGludCB2LCBtYXhsdnQ7CiAKIAl2ID0gYXBpY19yZWFkKEFQSUNfTFZSKTsKLQl2ZXIgPSBHRVRfQVBJQ19WRVJTSU9OKHYpOwogCW1heGx2dCA9IEdFVF9BUElDX01BWExWVCh2KTsKIAlyZXR1cm4gbWF4bHZ0OwogfQpAQCAtODAsMzMgKzgxLDMzIEBACiAJICovCiAJaWYgKG1heGx2dCA+PSAzKSB7CiAJCXYgPSBFUlJPUl9BUElDX1ZFQ1RPUjsgLyogYW55IG5vbi16ZXJvIHZlY3RvciB3aWxsIGRvICovCi0JCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZURVJSLCB2IHwgQVBJQ19MVlRfTUFTS0VEKTsKKwkJYXBpY193cml0ZShBUElDX0xWVEVSUiwgdiB8IEFQSUNfTFZUX01BU0tFRCk7CiAJfQogCS8qCiAJICogQ2FyZWZ1bDogd2UgaGF2ZSB0byBzZXQgbWFza3Mgb25seSBmaXJzdCB0byBkZWFzc2VydAogCSAqIGFueSBsZXZlbC10cmlnZ2VyZWQgc291cmNlcy4KIAkgKi8KIAl2ID0gYXBpY19yZWFkKEFQSUNfTFZUVCk7Ci0JYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRULCB2IHwgQVBJQ19MVlRfTUFTS0VEKTsKKwlhcGljX3dyaXRlKEFQSUNfTFZUVCwgdiB8IEFQSUNfTFZUX01BU0tFRCk7CiAJdiA9IGFwaWNfcmVhZChBUElDX0xWVDApOwotCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgdiB8IEFQSUNfTFZUX01BU0tFRCk7CisJYXBpY193cml0ZShBUElDX0xWVDAsIHYgfCBBUElDX0xWVF9NQVNLRUQpOwogCXYgPSBhcGljX3JlYWQoQVBJQ19MVlQxKTsKLQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDEsIHYgfCBBUElDX0xWVF9NQVNLRUQpOworCWFwaWNfd3JpdGUoQVBJQ19MVlQxLCB2IHwgQVBJQ19MVlRfTUFTS0VEKTsKIAlpZiAobWF4bHZ0ID49IDQpIHsKIAkJdiA9IGFwaWNfcmVhZChBUElDX0xWVFBDKTsKLQkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRQQywgdiB8IEFQSUNfTFZUX01BU0tFRCk7CisJCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgdiB8IEFQSUNfTFZUX01BU0tFRCk7CiAJfQogCiAJLyoKIAkgKiBDbGVhbiBBUElDIHN0YXRlIGZvciBvdGhlciBPU3M6CiAJICovCi0JYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRULCBBUElDX0xWVF9NQVNLRUQpOwotCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgQVBJQ19MVlRfTUFTS0VEKTsKLQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDEsIEFQSUNfTFZUX01BU0tFRCk7CisJYXBpY193cml0ZShBUElDX0xWVFQsIEFQSUNfTFZUX01BU0tFRCk7CisJYXBpY193cml0ZShBUElDX0xWVDAsIEFQSUNfTFZUX01BU0tFRCk7CisJYXBpY193cml0ZShBUElDX0xWVDEsIEFQSUNfTFZUX01BU0tFRCk7CiAJaWYgKG1heGx2dCA+PSAzKQotCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVEVSUiwgQVBJQ19MVlRfTUFTS0VEKTsKKwkJYXBpY193cml0ZShBUElDX0xWVEVSUiwgQVBJQ19MVlRfTUFTS0VEKTsKIAlpZiAobWF4bHZ0ID49IDQpCi0JCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUUEMsIEFQSUNfTFZUX01BU0tFRCk7CisJCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19MVlRfTUFTS0VEKTsKIAl2ID0gR0VUX0FQSUNfVkVSU0lPTihhcGljX3JlYWQoQVBJQ19MVlIpKTsKIAlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKIAlhcGljX3JlYWQoQVBJQ19FU1IpOwpAQCAtMTUxLDcgKzE1Miw3IEBACiAJCXZhbHVlICY9IH5BUElDX1ZFQ1RPUl9NQVNLOwogCQl2YWx1ZSB8PSBBUElDX1NQSVZfQVBJQ19FTkFCTEVEOwogCQl2YWx1ZSB8PSAweGY7Ci0JCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfU1BJViwgdmFsdWUpOworCQlhcGljX3dyaXRlKEFQSUNfU1BJViwgdmFsdWUpOwogCiAJCWlmICghdmlydF93aXJlX3NldHVwKSB7CiAJCQkvKiBGb3IgTFZUMCBtYWtlIGl0IGVkZ2UgdHJpZ2dlcmVkLCBhY3RpdmUgaGlnaCwgZXh0ZXJuYWwgYW5kIGVuYWJsZWQgKi8KQEAgLTE2MSwxMSArMTYyLDExIEBACiAJCQkJQVBJQ19MVlRfTEVWRUxfVFJJR0dFUiB8IEFQSUNfTFZUX01BU0tFRCApOwogCQkJdmFsdWUgfD0gQVBJQ19MVlRfUkVNT1RFX0lSUiB8IEFQSUNfU0VORF9QRU5ESU5HOwogCQkJdmFsdWUgPSBTRVRfQVBJQ19ERUxJVkVSWV9NT0RFKHZhbHVlLCBBUElDX01PREVfRVhUSU5UKTsKLQkJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgdmFsdWUpOworCQkJYXBpY193cml0ZShBUElDX0xWVDAsIHZhbHVlKTsKIAkJfQogCQllbHNlIHsKIAkJCS8qIERpc2FibGUgTFZUMCAqLwotCQkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCBBUElDX0xWVF9NQVNLRUQpOworCQkJYXBpY193cml0ZShBUElDX0xWVDAsIEFQSUNfTFZUX01BU0tFRCk7CiAJCX0KIAogCQkvKiBGb3IgTFZUMSBtYWtlIGl0IGVkZ2UgdHJpZ2dlcmVkLCBhY3RpdmUgaGlnaCwgbm1pIGFuZCBlbmFibGVkICovCkBAIC0xNzYsNyArMTc3LDcgQEAKIAkJCUFQSUNfTFZUX0xFVkVMX1RSSUdHRVIgfCBBUElDX0xWVF9NQVNLRUQpOwogCQl2YWx1ZSB8PSBBUElDX0xWVF9SRU1PVEVfSVJSIHwgQVBJQ19TRU5EX1BFTkRJTkc7CiAJCXZhbHVlID0gU0VUX0FQSUNfREVMSVZFUllfTU9ERSh2YWx1ZSwgQVBJQ19NT0RFX05NSSk7Ci0JCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMSwgdmFsdWUpOworCQlhcGljX3dyaXRlKEFQSUNfTFZUMSwgdmFsdWUpOwogCX0KIH0KIApAQCAtMTkyLDcgKzE5Myw3IEBACiAJICovCiAJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19TUElWKTsKIAl2YWx1ZSAmPSB+QVBJQ19TUElWX0FQSUNfRU5BQkxFRDsKLQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX1NQSVYsIHZhbHVlKTsKKwlhcGljX3dyaXRlKEFQSUNfU1BJViwgdmFsdWUpOwogfQogCiAvKgpAQCAtMjY5LDcgKzI3MCw3IEBACiAJYXBpY193YWl0X2ljcl9pZGxlKCk7CiAKIAlhcGljX3ByaW50ayhBUElDX0RFQlVHLCAiU3luY2hyb25pemluZyBBcmIgSURzLlxuIik7Ci0JYXBpY193cml0ZV9hcm91bmQoQVBJQ19JQ1IsIEFQSUNfREVTVF9BTExJTkMgfCBBUElDX0lOVF9MRVZFTFRSSUcKKwlhcGljX3dyaXRlKEFQSUNfSUNSLCBBUElDX0RFU1RfQUxMSU5DIHwgQVBJQ19JTlRfTEVWRUxUUklHCiAJCQkJfCBBUElDX0RNX0lOSVQpOwogfQogCkBAIC0yODAsNyArMjgxLDcgQEAKICAqLwogdm9pZCBfX2luaXQgaW5pdF9ic3BfQVBJQyh2b2lkKQogewotCXVuc2lnbmVkIGludCB2YWx1ZSwgdmVyOworCXVuc2lnbmVkIGludCB2YWx1ZTsKIAogCS8qCiAJICogRG9uJ3QgZG8gdGhlIHNldHVwIG5vdyBpZiB3ZSBoYXZlIGEgU01QIEJJT1MgYXMgdGhlCkBAIC0yOTAsNyArMjkxLDYgQEAKIAkJcmV0dXJuOwogCiAJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19MVlIpOwotCXZlciA9IEdFVF9BUElDX1ZFUlNJT04odmFsdWUpOwogCiAJLyoKIAkgKiBEbyBub3QgdHJ1c3QgdGhlIGxvY2FsIEFQSUMgYmVpbmcgZW1wdHkgYXQgYm9vdHVwLgpAQCAtMzA1LDIyICszMDUsMjEgQEAKIAl2YWx1ZSB8PSBBUElDX1NQSVZfQVBJQ19FTkFCTEVEOwogCXZhbHVlIHw9IEFQSUNfU1BJVl9GT0NVU19ESVNBQkxFRDsKIAl2YWx1ZSB8PSBTUFVSSU9VU19BUElDX1ZFQ1RPUjsKLQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX1NQSVYsIHZhbHVlKTsKKwlhcGljX3dyaXRlKEFQSUNfU1BJViwgdmFsdWUpOwogCiAJLyoKIAkgKiBTZXQgdXAgdGhlIHZpcnR1YWwgd2lyZSBtb2RlLgogCSAqLwotCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgQVBJQ19ETV9FWFRJTlQpOworCWFwaWNfd3JpdGUoQVBJQ19MVlQwLCBBUElDX0RNX0VYVElOVCk7CiAJdmFsdWUgPSBBUElDX0RNX05NSTsKLQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDEsIHZhbHVlKTsKKwlhcGljX3dyaXRlKEFQSUNfTFZUMSwgdmFsdWUpOwogfQogCiB2b2lkIF9fY3B1aW5pdCBzZXR1cF9sb2NhbF9BUElDICh2b2lkKQogewotCXVuc2lnbmVkIGludCB2YWx1ZSwgdmVyLCBtYXhsdnQ7CisJdW5zaWduZWQgaW50IHZhbHVlLCBtYXhsdnQ7CiAKIAl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX0xWUik7Ci0JdmVyID0gR0VUX0FQSUNfVkVSU0lPTih2YWx1ZSk7CiAKIAlpZiAoKFNQVVJJT1VTX0FQSUNfVkVDVE9SICYgMHgwZikgIT0gMHgwZikKIAkJX19lcnJvcl9pbl9hcGljX2MoKTsKQEAgLTM0NSw3ICszNDQsNyBAQAogCSAqLwogCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfVEFTS1BSSSk7CiAJdmFsdWUgJj0gfkFQSUNfVFBSSV9NQVNLOwotCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfVEFTS1BSSSwgdmFsdWUpOworCWFwaWNfd3JpdGUoQVBJQ19UQVNLUFJJLCB2YWx1ZSk7CiAKIAkvKgogCSAqIE5vdyB0aGF0IHdlIGFyZSBhbGwgc2V0IHVwLCBlbmFibGUgdGhlIEFQSUMKQEAgLTM4Nyw3ICszODYsNyBAQAogCSAqIFNldCBzcHVyaW91cyBJUlEgdmVjdG9yCiAJICovCiAJdmFsdWUgfD0gU1BVUklPVVNfQVBJQ19WRUNUT1I7Ci0JYXBpY193cml0ZV9hcm91bmQoQVBJQ19TUElWLCB2YWx1ZSk7CisJYXBpY193cml0ZShBUElDX1NQSVYsIHZhbHVlKTsKIAogCS8qCiAJICogU2V0IHVwIExWVDAsIExWVDE6CkBAIC00MDcsNyArNDA2LDcgQEAKIAkJdmFsdWUgPSBBUElDX0RNX0VYVElOVCB8IEFQSUNfTFZUX01BU0tFRDsKIAkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAibWFza2VkIEV4dElOVCBvbiBDUFUjJWRcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJfQotCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgdmFsdWUpOworCWFwaWNfd3JpdGUoQVBJQ19MVlQwLCB2YWx1ZSk7CiAKIAkvKgogCSAqIG9ubHkgdGhlIEJQIHNob3VsZCBzZWUgdGhlIExJTlQxIE5NSSBzaWduYWwsIG9idmlvdXNseS4KQEAgLTQxNiwxNCArNDE1LDE0IEBACiAJCXZhbHVlID0gQVBJQ19ETV9OTUk7CiAJZWxzZQogCQl2YWx1ZSA9IEFQSUNfRE1fTk1JIHwgQVBJQ19MVlRfTUFTS0VEOwotCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMSwgdmFsdWUpOworCWFwaWNfd3JpdGUoQVBJQ19MVlQxLCB2YWx1ZSk7CiAKIAl7CiAJCXVuc2lnbmVkIG9sZHZhbHVlOwogCQltYXhsdnQgPSBnZXRfbWF4bHZ0KCk7CiAJCW9sZHZhbHVlID0gYXBpY19yZWFkKEFQSUNfRVNSKTsKIAkJdmFsdWUgPSBFUlJPUl9BUElDX1ZFQ1RPUjsgICAgICAvLyBlbmFibGVzIHNlbmRpbmcgZXJyb3JzCi0JCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZURVJSLCB2YWx1ZSk7CisJCWFwaWNfd3JpdGUoQVBJQ19MVlRFUlIsIHZhbHVlKTsKIAkJLyoKIAkJICogc3BlYyBzYXlzIGNsZWFyIGVycm9ycyBhZnRlciBlbmFibGluZyB2ZWN0b3IuCiAJCSAqLwpAQCAtNTAwLDEzICs0OTksMTAgQEAKIAlpZiAoIWFwaWNfcG1fc3RhdGUuYWN0aXZlKQogCQlyZXR1cm4gMDsKIAotCS8qIFhYWDogUGF2ZWwgbmVlZHMgdGhpcyBmb3IgUzMgcmVzdW1lLCBidXQgY2FuJ3QgZXhwbGFpbiB3aHkgKi8KLQlzZXRfZml4bWFwX25vY2FjaGUoRklYX0FQSUNfQkFTRSwgQVBJQ19ERUZBVUxUX1BIWVNfQkFTRSk7Ci0KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJcmRtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOwogCWwgJj0gfk1TUl9JQTMyX0FQSUNCQVNFX0JBU0U7Ci0JbCB8PSBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUgfCBBUElDX0RFRkFVTFRfUEhZU19CQVNFOworCWwgfD0gTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFIHwgbXBfbGFwaWNfYWRkcjsKIAl3cm1zcihNU1JfSUEzMl9BUElDQkFTRSwgbCwgaCk7CiAJYXBpY193cml0ZShBUElDX0xWVEVSUiwgRVJST1JfQVBJQ19WRUNUT1IgfCBBUElDX0xWVF9NQVNLRUQpOwogCWFwaWNfd3JpdGUoQVBJQ19JRCwgYXBpY19wbV9zdGF0ZS5hcGljX2lkKTsKQEAgLTY2MCwyMCArNjU2LDI1IEBACiBzdGF0aWMgdm9pZCBfX3NldHVwX0FQSUNfTFZUVCh1bnNpZ25lZCBpbnQgY2xvY2tzKQogewogCXVuc2lnbmVkIGludCBsdnR0X3ZhbHVlLCB0bXBfdmFsdWUsIHZlcjsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCiAJdmVyID0gR0VUX0FQSUNfVkVSU0lPTihhcGljX3JlYWQoQVBJQ19MVlIpKTsKIAlsdnR0X3ZhbHVlID0gQVBJQ19MVlRfVElNRVJfUEVSSU9ESUMgfCBMT0NBTF9USU1FUl9WRUNUT1I7Ci0JYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRULCBsdnR0X3ZhbHVlKTsKKworCWlmIChjcHVfaXNzZXQoY3B1LCB0aW1lcl9pbnRlcnJ1cHRfYnJvYWRjYXN0X2lwaV9tYXNrKSkKKwkJbHZ0dF92YWx1ZSB8PSBBUElDX0xWVF9NQVNLRUQ7CisKKwlhcGljX3dyaXRlKEFQSUNfTFZUVCwgbHZ0dF92YWx1ZSk7CiAKIAkvKgogCSAqIERpdmlkZSBQSUNMSyBieSAxNgogCSAqLwogCXRtcF92YWx1ZSA9IGFwaWNfcmVhZChBUElDX1REQ1IpOwotCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfVERDUiwgKHRtcF92YWx1ZQorCWFwaWNfd3JpdGUoQVBJQ19URENSLCAodG1wX3ZhbHVlCiAJCQkJJiB+KEFQSUNfVERSX0RJVl8xIHwgQVBJQ19URFJfRElWX1RNQkFTRSkpCiAJCQkJfCBBUElDX1REUl9ESVZfMTYpOwogCi0JYXBpY193cml0ZV9hcm91bmQoQVBJQ19UTUlDVCwgY2xvY2tzL0FQSUNfRElWSVNPUik7CisJYXBpY193cml0ZShBUElDX1RNSUNULCBjbG9ja3MvQVBJQ19ESVZJU09SKTsKIH0KIAogc3RhdGljIHZvaWQgc2V0dXBfQVBJQ190aW1lcih1bnNpZ25lZCBpbnQgY2xvY2tzKQpAQCAtNjgyLDEyICs2ODMsNiBAQAogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCi0JLyogRm9yIHNvbWUgcmVhc29ucyB0aGlzIGRvZXNuJ3Qgd29yayBvbiBTaW1pY3MsIHNvIGZha2UgaXQgZm9yIG5vdyAqLyAKLQlpZiAoIXN0cnN0cihib290X2NwdV9kYXRhLng4Nl9tb2RlbF9pZCwgIlNjcmV3ZHJpdmVyIikpIHsgCi0JX19zZXR1cF9BUElDX0xWVFQoY2xvY2tzKTsKLQkJcmV0dXJuOwotCX0gCi0KIAkvKiB3YWl0IGZvciBpcnEgc2xpY2UgKi8KICAJaWYgKHZ4dGltZS5ocGV0X2FkZHJlc3MpIHsKICAJCWludCB0cmlnZ2VyID0gaHBldF9yZWFkbChIUEVUX1QwX0NNUCk7CkBAIC03MDAsNyArNjk1LDcgQEAKIAkJb3V0Yl9wKDB4MDAsIDB4NDMpOwogCQljMiA9IGluYl9wKDB4NDApOwogCQljMiB8PSBpbmJfcCgweDQwKSA8PCA4OwotCWRvIHsKKwkJZG8gewogCQkJYzEgPSBjMjsKIAkJCW91dGJfcCgweDAwLCAweDQzKTsKIAkJCWMyID0gaW5iX3AoMHg0MCk7CkBAIC03ODUsNTIgKzc4MCw2OCBAQAogCWxvY2FsX2lycV9lbmFibGUoKTsKIH0KIAotdm9pZCBfX2NwdWluaXQgZGlzYWJsZV9BUElDX3RpbWVyKHZvaWQpCit2b2lkIGRpc2FibGVfQVBJQ190aW1lcih2b2lkKQogewogCWlmICh1c2luZ19hcGljX3RpbWVyKSB7CiAJCXVuc2lnbmVkIGxvbmcgdjsKIAogCQl2ID0gYXBpY19yZWFkKEFQSUNfTFZUVCk7Ci0JCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUVCwgdiB8IEFQSUNfTFZUX01BU0tFRCk7CisJCWFwaWNfd3JpdGUoQVBJQ19MVlRULCB2IHwgQVBJQ19MVlRfTUFTS0VEKTsKIAl9CiB9CiAKIHZvaWQgZW5hYmxlX0FQSUNfdGltZXIodm9pZCkKIHsKLQlpZiAodXNpbmdfYXBpY190aW1lcikgeworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlpZiAodXNpbmdfYXBpY190aW1lciAmJgorCSAgICAhY3B1X2lzc2V0KGNwdSwgdGltZXJfaW50ZXJydXB0X2Jyb2FkY2FzdF9pcGlfbWFzaykpIHsKIAkJdW5zaWduZWQgbG9uZyB2OwogCiAJCXYgPSBhcGljX3JlYWQoQVBJQ19MVlRUKTsKLQkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRULCB2ICYgfkFQSUNfTFZUX01BU0tFRCk7CisJCWFwaWNfd3JpdGUoQVBJQ19MVlRULCB2ICYgfkFQSUNfTFZUX01BU0tFRCk7CiAJfQogfQogCi0vKgotICogdGhlIGZyZXF1ZW5jeSBvZiB0aGUgcHJvZmlsaW5nIHRpbWVyIGNhbiBiZSBjaGFuZ2VkCi0gKiBieSB3cml0aW5nIGEgbXVsdGlwbGllciB2YWx1ZSBpbnRvIC9wcm9jL3Byb2ZpbGUuCi0gKi8KK3ZvaWQgc3dpdGNoX0FQSUNfdGltZXJfdG9faXBpKHZvaWQgKmNwdW1hc2spCit7CisJY3B1bWFza190IG1hc2sgPSAqKGNwdW1hc2tfdCAqKWNwdW1hc2s7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCWlmIChjcHVfaXNzZXQoY3B1LCBtYXNrKSAmJgorCSAgICAhY3B1X2lzc2V0KGNwdSwgdGltZXJfaW50ZXJydXB0X2Jyb2FkY2FzdF9pcGlfbWFzaykpIHsKKwkJZGlzYWJsZV9BUElDX3RpbWVyKCk7CisJCWNwdV9zZXQoY3B1LCB0aW1lcl9pbnRlcnJ1cHRfYnJvYWRjYXN0X2lwaV9tYXNrKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHN3aXRjaF9BUElDX3RpbWVyX3RvX2lwaSk7CisKK3ZvaWQgc21wX3NlbmRfdGltZXJfYnJvYWRjYXN0X2lwaSh2b2lkKQoreworCWNwdW1hc2tfdCBtYXNrOworCisJY3B1c19hbmQobWFzaywgY3B1X29ubGluZV9tYXAsIHRpbWVyX2ludGVycnVwdF9icm9hZGNhc3RfaXBpX21hc2spOworCWlmICghY3B1c19lbXB0eShtYXNrKSkgeworCQlzZW5kX0lQSV9tYXNrKG1hc2ssIExPQ0FMX1RJTUVSX1ZFQ1RPUik7CisJfQorfQorCit2b2lkIHN3aXRjaF9pcGlfdG9fQVBJQ190aW1lcih2b2lkICpjcHVtYXNrKQoreworCWNwdW1hc2tfdCBtYXNrID0gKihjcHVtYXNrX3QgKiljcHVtYXNrOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlpZiAoY3B1X2lzc2V0KGNwdSwgbWFzaykgJiYKKwkgICAgY3B1X2lzc2V0KGNwdSwgdGltZXJfaW50ZXJydXB0X2Jyb2FkY2FzdF9pcGlfbWFzaykpIHsKKwkJY3B1X2NsZWFyKGNwdSwgdGltZXJfaW50ZXJydXB0X2Jyb2FkY2FzdF9pcGlfbWFzayk7CisJCWVuYWJsZV9BUElDX3RpbWVyKCk7CisJfQorfQorRVhQT1JUX1NZTUJPTChzd2l0Y2hfaXBpX3RvX0FQSUNfdGltZXIpOworCiBpbnQgc2V0dXBfcHJvZmlsaW5nX3RpbWVyKHVuc2lnbmVkIGludCBtdWx0aXBsaWVyKQogewotCWludCBpOwotCi0JLyoKLQkgKiBTYW5pdHkgY2hlY2suIFthdCBsZWFzdCA1MDAgQVBJQyBjeWNsZXMgc2hvdWxkIGJlCi0JICogYmV0d2VlbiBBUElDIGludGVycnVwdHMgYXMgYSBydWxlIG9mIHRodW1iLCB0byBhdm9pZAotCSAqIGlycXMgZmxvb2RpbmcgdXNdCi0JICovCi0JaWYgKCAoIW11bHRpcGxpZXIpIHx8IChjYWxpYnJhdGlvbl9yZXN1bHQvbXVsdGlwbGllciA8IDUwMCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogCi0JICogU2V0IHRoZSBuZXcgbXVsdGlwbGllciBmb3IgZWFjaCBDUFUuIENQVXMgZG9uJ3Qgc3RhcnQgdXNpbmcgdGhlCi0JICogbmV3IHZhbHVlcyB1bnRpbCB0aGUgbmV4dCB0aW1lciBpbnRlcnJ1cHQgaW4gd2hpY2ggdGhleSBkbyBwcm9jZXNzCi0JICogYWNjb3VudGluZy4gQXQgdGhhdCB0aW1lIHRoZXkgYWxzbyBhZGp1c3QgdGhlaXIgQVBJQyB0aW1lcnMKLQkgKiBhY2NvcmRpbmdseS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgKytpKQotCQlwZXJfY3B1KHByb2ZfbXVsdGlwbGllciwgaSkgPSBtdWx0aXBsaWVyOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKICNpZmRlZiBDT05GSUdfWDg2X01DRV9BTUQKQEAgLTg1NywzMiArODY4LDEwIEBACiAKIHZvaWQgc21wX2xvY2FsX3RpbWVyX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCiAJcHJvZmlsZV90aWNrKENQVV9QUk9GSUxJTkcsIHJlZ3MpOwotCWlmICgtLXBlcl9jcHUocHJvZl9jb3VudGVyLCBjcHUpIDw9IDApIHsKLQkJLyoKLQkJICogVGhlIG11bHRpcGxpZXIgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIGdvdAotCQkgKiB0byB0aGlzIHBvaW50IGFzIGEgcmVzdWx0IG9mIHRoZSB1c2VyIHdyaXRpbmcgdG8KLQkJICogL3Byb2MvcHJvZmlsZS4gSW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBBUElDCi0JCSAqIHRpbWVyIGFjY29yZGluZ2x5LgotCQkgKgotCQkgKiBJbnRlcnJ1cHRzIGFyZSBhbHJlYWR5IG1hc2tlZCBvZmYgYXQgdGhpcyBwb2ludC4KLQkJICovCi0JCXBlcl9jcHUocHJvZl9jb3VudGVyLCBjcHUpID0gcGVyX2NwdShwcm9mX211bHRpcGxpZXIsIGNwdSk7Ci0JCWlmIChwZXJfY3B1KHByb2ZfY291bnRlciwgY3B1KSAhPSAKLQkJICAgIHBlcl9jcHUocHJvZl9vbGRfbXVsdGlwbGllciwgY3B1KSkgewotCQkJX19zZXR1cF9BUElDX0xWVFQoY2FsaWJyYXRpb25fcmVzdWx0LwotCQkJCQlwZXJfY3B1KHByb2ZfY291bnRlciwgY3B1KSk7Ci0JCQlwZXJfY3B1KHByb2Zfb2xkX211bHRpcGxpZXIsIGNwdSkgPQotCQkJCXBlcl9jcHUocHJvZl9jb3VudGVyLCBjcHUpOwotCQl9Ci0KICNpZmRlZiBDT05GSUdfU01QCi0JCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShyZWdzKSk7CisJdXBkYXRlX3Byb2Nlc3NfdGltZXModXNlcl9tb2RlKHJlZ3MpKTsKICNlbmRpZgotCX0KLQogCS8qCiAJICogV2UgdGFrZSB0aGUgJ2xvbmcnIHJldHVybiBwYXRoLCBhbmQgdGhlcmUgZXZlcnkgc3Vic3lzdGVtCiAJICogZ3JhYnMgdGhlIGFwcHJvcHJpYXRlIGxvY2tzIChrZXJuZWwgbG9jay8gaXJxIGxvY2spLgpAQCAtOTIwLDYgKzkwOSw3IEBACiAJICogQmVzaWRlcywgaWYgd2UgZG9uJ3QgdGltZXIgaW50ZXJydXB0cyBpZ25vcmUgdGhlIGdsb2JhbAogCSAqIGludGVycnVwdCBsb2NrLCB3aGljaCBpcyB0aGUgV3JvbmdUaGluZyAodG0pIHRvIGRvLgogCSAqLworCWV4aXRfaWRsZSgpOwogCWlycV9lbnRlcigpOwogCXNtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQocmVncyk7CiAJaXJxX2V4aXQoKTsKQEAgLTk3OSw2ICs5NjksNyBAQAogYXNtbGlua2FnZSB2b2lkIHNtcF9zcHVyaW91c19pbnRlcnJ1cHQodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgdjsKKwlleGl0X2lkbGUoKTsKIAlpcnFfZW50ZXIoKTsKIAkvKgogCSAqIENoZWNrIGlmIHRoaXMgcmVhbGx5IGlzIGEgc3B1cmlvdXMgaW50ZXJydXB0IGFuZCBBQ0sgaXQKQEAgLTEwMTQsNiArMTAwNSw3IEBACiB7CiAJdW5zaWduZWQgaW50IHYsIHYxOwogCisJZXhpdF9pZGxlKCk7CiAJaXJxX2VudGVyKCk7CiAJLyogRmlyc3QgdGlja2xlIHRoZSBoYXJkd2FyZSwgb25seSB0aGVuIHJlcG9ydCB3aGF0IHdlbnQgb24uIC0tIFJFVyAqLwogCXYgPSBhcGljX3JlYWQoQVBJQ19FU1IpOwpAQCAtMTA2MCw3ICsxMDUyLDcgQEAKIAljb25uZWN0X2JzcF9BUElDKCk7CiAKIAlwaHlzX2NwdV9wcmVzZW50X21hcCA9IHBoeXNpZF9tYXNrX29mX3BoeXNpZChib290X2NwdV9pZCk7Ci0JYXBpY193cml0ZV9hcm91bmQoQVBJQ19JRCwgYm9vdF9jcHVfaWQpOworCWFwaWNfd3JpdGUoQVBJQ19JRCwgU0VUX0FQSUNfSUQoYm9vdF9jcHVfaWQpKTsKIAogCXNldHVwX2xvY2FsX0FQSUMoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCBhYWE2ZDM4Li4zODgzNGJiIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMzMsNiArMzMsNyBAQAogCUVOVFJZKGZsYWdzKTsKIAlFTlRSWShhZGRyX2xpbWl0KTsKIAlFTlRSWShwcmVlbXB0X2NvdW50KTsKKwlFTlRSWShzdGF0dXMpOwogCUJMQU5LKCk7CiAjdW5kZWYgRU5UUlkKICNkZWZpbmUgRU5UUlkoZW50cnkpIERFRklORShwZGFfICMjIGVudHJ5LCBvZmZzZXRvZihzdHJ1Y3QgeDg2NjRfcGRhLCBlbnRyeSkpCkBAIC00Miw2ICs0Myw3IEBACiAJRU5UUlkoaXJxY291bnQpOwogCUVOVFJZKGNwdW51bWJlcik7CiAJRU5UUlkoaXJxc3RhY2twdHIpOworCUVOVFJZKGRhdGFfb2Zmc2V0KTsKIAlCTEFOSygpOwogI3VuZGVmIEVOVFJZCiAjaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCkBAIC02NCw1ICs2Niw3IEBACiAJREVGSU5FKHBiZV9hZGRyZXNzLCBvZmZzZXRvZihzdHJ1Y3QgcGJlLCBhZGRyZXNzKSk7CiAJREVGSU5FKHBiZV9vcmlnX2FkZHJlc3MsIG9mZnNldG9mKHN0cnVjdCBwYmUsIG9yaWdfYWRkcmVzcykpOwogCURFRklORShwYmVfbmV4dCwgb2Zmc2V0b2Yoc3RydWN0IHBiZSwgbmV4dCkpOworCUJMQU5LKCk7CisJREVGSU5FKFRTU19pc3QsIG9mZnNldG9mKHN0cnVjdCB0c3Nfc3RydWN0LCBpc3QpKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9jcmFzaC5jIGIvYXJjaC94ODZfNjQva2VybmVsL2NyYXNoLmMKaW5kZXggNTM1ZTA0NDY2Li40ZTZjM2I3IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvY3Jhc2guYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvY3Jhc2guYwpAQCAtMTEsMTkgKzExLDE1NiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZmNvcmUuaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vaGFyZGlycS5oPgogI2luY2x1ZGUgPGFzbS9ubWkuaD4KICNpbmNsdWRlIDxhc20vaHdfaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2hfYXBpYy5oPgogCi1ub3RlX2J1Zl90IGNyYXNoX25vdGVzW05SX0NQVVNdOworLyogVGhpcyBrZWVwcyBhIHRyYWNrIG9mIHdoaWNoIG9uZSBpcyBjcmFzaGluZyBjcHUuICovCitzdGF0aWMgaW50IGNyYXNoaW5nX2NwdTsKKworc3RhdGljIHUzMiAqYXBwZW5kX2VsZl9ub3RlKHUzMiAqYnVmLCBjaGFyICpuYW1lLCB1bnNpZ25lZCB0eXBlLAorCQkJCQkJdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuKQoreworCXN0cnVjdCBlbGZfbm90ZSBub3RlOworCisJbm90ZS5uX25hbWVzeiA9IHN0cmxlbihuYW1lKSArIDE7CisJbm90ZS5uX2Rlc2NzeiA9IGRhdGFfbGVuOworCW5vdGUubl90eXBlICAgPSB0eXBlOworCW1lbWNweShidWYsICZub3RlLCBzaXplb2Yobm90ZSkpOworCWJ1ZiArPSAoc2l6ZW9mKG5vdGUpICszKS80OworCW1lbWNweShidWYsIG5hbWUsIG5vdGUubl9uYW1lc3opOworCWJ1ZiArPSAobm90ZS5uX25hbWVzeiArIDMpLzQ7CisJbWVtY3B5KGJ1ZiwgZGF0YSwgbm90ZS5uX2Rlc2Nzeik7CisJYnVmICs9IChub3RlLm5fZGVzY3N6ICsgMykvNDsKKworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmFsX25vdGUodTMyICpidWYpCit7CisJc3RydWN0IGVsZl9ub3RlIG5vdGU7CisKKwlub3RlLm5fbmFtZXN6ID0gMDsKKwlub3RlLm5fZGVzY3N6ID0gMDsKKwlub3RlLm5fdHlwZSAgID0gMDsKKwltZW1jcHkoYnVmLCAmbm90ZSwgc2l6ZW9mKG5vdGUpKTsKK30KKworc3RhdGljIHZvaWQgY3Jhc2hfc2F2ZV90aGlzX2NwdShzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgZWxmX3Byc3RhdHVzIHByc3RhdHVzOworCXUzMiAqYnVmOworCisJaWYgKChjcHUgPCAwKSB8fCAoY3B1ID49IE5SX0NQVVMpKQorCQlyZXR1cm47CisKKwkvKiBVc2luZyBFTEYgbm90ZXMgaGVyZSBpcyBvcHBvcnR1bmlzdGljLgorCSAqIEkgbmVlZCBhIHdlbGwgZGVmaW5lZCBzdHJ1Y3R1cmUgZm9ybWF0CisJICogZm9yIHRoZSBkYXRhIEkgcGFzcywgYW5kIEkgbmVlZCB0YWdzCisJICogb24gdGhlIGRhdGEgdG8gaW5kaWNhdGUgd2hhdCBpbmZvcm1hdGlvbiBJIGhhdmUKKwkgKiBzcXVpcnJlbGxlZCBhd2F5LiAgRUxGIG5vdGVzIGhhcHBlbiB0byBwcm92aWRlCisJICogYWxsIG9mIHRoYXQgdGhhdCBubyBuZWVkIHRvIGludmVudCBzb21ldGhpbmcgbmV3LgorCSAqLworCisJYnVmID0gKHUzMiopcGVyX2NwdV9wdHIoY3Jhc2hfbm90ZXMsIGNwdSk7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCisJbWVtc2V0KCZwcnN0YXR1cywgMCwgc2l6ZW9mKHByc3RhdHVzKSk7CisJcHJzdGF0dXMucHJfcGlkID0gY3VycmVudC0+cGlkOworCWVsZl9jb3JlX2NvcHlfcmVncygmcHJzdGF0dXMucHJfcmVnLCByZWdzKTsKKwlidWYgPSBhcHBlbmRfZWxmX25vdGUoYnVmLCAiQ09SRSIsIE5UX1BSU1RBVFVTLCAmcHJzdGF0dXMsCisJCQkJCXNpemVvZihwcnN0YXR1cykpOworCWZpbmFsX25vdGUoYnVmKTsKK30KKworc3RhdGljIHZvaWQgY3Jhc2hfc2F2ZV9zZWxmKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBjcHU7CisKKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJY3Jhc2hfc2F2ZV90aGlzX2NwdShyZWdzLCBjcHUpOworfQorCisjaWZkZWYgQ09ORklHX1NNUAorc3RhdGljIGF0b21pY190IHdhaXRpbmdfZm9yX2NyYXNoX2lwaTsKKworc3RhdGljIGludCBjcmFzaF9ubWlfY2FsbGJhY2soc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBjcHUpCit7CisJLyoKKwkgKiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGlzIGhhbmRsZXIgaXMgaW52b2tlZCBvbiBjcmFzaGluZyBjcHUuCisJICogT3RoZXJ3aXNlLCBzeXN0ZW0gd2lsbCBjb21wbGV0ZWx5IGhhbmcuIENyYXNoaW5nIGNwdSBjYW4gZ2V0CisJICogYW4gTk1JIGlmIHN5c3RlbSB3YXMgaW5pdGlhbGx5IGJvb3RlZCB3aXRoIG5taV93YXRjaGRvZyBwYXJhbWV0ZXIuCisJICovCisJaWYgKGNwdSA9PSBjcmFzaGluZ19jcHUpCisJCXJldHVybiAxOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwljcmFzaF9zYXZlX3RoaXNfY3B1KHJlZ3MsIGNwdSk7CisJZGlzYWJsZV9sb2NhbF9BUElDKCk7CisJYXRvbWljX2RlYygmd2FpdGluZ19mb3JfY3Jhc2hfaXBpKTsKKwkvKiBBc3N1bWUgaGx0IHdvcmtzICovCisJZm9yKDs7KQorCQlhc20oImhsdCIpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHNtcF9zZW5kX25taV9hbGxidXRzZWxmKHZvaWQpCit7CisJc2VuZF9JUElfYWxsYnV0c2VsZihBUElDX0RNX05NSSk7Cit9CisKKy8qCisgKiBUaGlzIGNvZGUgaXMgYSBiZXN0IGVmZm9ydCBoZXVyaXN0aWMgdG8gZ2V0IHRoZQorICogb3RoZXIgY3B1cyB0byBzdG9wIGV4ZWN1dGluZy4gU28gcmFjZXMgd2l0aAorICogY3B1IGhvdHBsdWcgc2hvdWxkbid0IG1hdHRlci4KKyAqLworCitzdGF0aWMgdm9pZCBubWlfc2hvb3Rkb3duX2NwdXModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIG1zZWNzOworCisJYXRvbWljX3NldCgmd2FpdGluZ19mb3JfY3Jhc2hfaXBpLCBudW1fb25saW5lX2NwdXMoKSAtIDEpOworCXNldF9ubWlfY2FsbGJhY2soY3Jhc2hfbm1pX2NhbGxiYWNrKTsKKworCS8qCisJICogRW5zdXJlIHRoZSBuZXcgY2FsbGJhY2sgZnVuY3Rpb24gaXMgc2V0IGJlZm9yZSBzZW5kaW5nCisJICogb3V0IHRoZSBOTUkKKwkgKi8KKwl3bWIoKTsKKworCXNtcF9zZW5kX25taV9hbGxidXRzZWxmKCk7CisKKwltc2VjcyA9IDEwMDA7IC8qIFdhaXQgYXQgbW9zdCBhIHNlY29uZCBmb3IgdGhlIG90aGVyIGNwdXMgdG8gc3RvcCAqLworCXdoaWxlICgoYXRvbWljX3JlYWQoJndhaXRpbmdfZm9yX2NyYXNoX2lwaSkgPiAwKSAmJiBtc2VjcykgeworCQltZGVsYXkoMSk7CisJCW1zZWNzLS07CisJfQorCS8qIExlYXZlIHRoZSBubWkgY2FsbGJhY2sgc2V0ICovCisJZGlzYWJsZV9sb2NhbF9BUElDKCk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgbm1pX3Nob290ZG93bl9jcHVzKHZvaWQpCit7CisJLyogVGhlcmUgYXJlIG5vIGNwdXMgdG8gc2hvb3Rkb3duICovCit9CisjZW5kaWYKIAogdm9pZCBtYWNoaW5lX2NyYXNoX3NodXRkb3duKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCS8qIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgYWZ0ZXIgdGhlIHN5c3RlbQorCS8qCisJICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBhZnRlciB0aGUgc3lzdGVtCiAJICogaGFzIHBhbmljZWQgb3IgaXMgb3RoZXJ3aXNlIGluIGEgY3JpdGljYWwgc3RhdGUuCiAJICogVGhlIG1pbmltdW0gYW1vdW50IG9mIGNvZGUgdG8gYWxsb3cgYSBrZXhlYydkIGtlcm5lbAogCSAqIHRvIHJ1biBzdWNjZXNzZnVsbHkgbmVlZHMgdG8gaGFwcGVuIGhlcmUuCkBAIC0zMSw0ICsxNjgsMTkgQEAKIAkgKiBJbiBwcmFjdGljZSB0aGlzIG1lYW5zIHNob290aW5nIGRvd24gdGhlIG90aGVyIGNwdXMgaW4KIAkgKiBhbiBTTVAgc3lzdGVtLgogCSAqLworCS8qIFRoZSBrZXJuZWwgaXMgYnJva2VuIHNvIGRpc2FibGUgaW50ZXJydXB0cyAqLworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwkvKiBNYWtlIGEgbm90ZSBvZiBjcmFzaGluZyBjcHUuIFdpbGwgYmUgdXNlZCBpbiBOTUkgY2FsbGJhY2suKi8KKwljcmFzaGluZ19jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJbm1pX3Nob290ZG93bl9jcHVzKCk7CisKKwlpZihjcHVfaGFzX2FwaWMpCisJCSBkaXNhYmxlX2xvY2FsX0FQSUMoKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9JT19BUElDKQorCWRpc2FibGVfSU9fQVBJQygpOworI2VuZGlmCisKKwljcmFzaF9zYXZlX3NlbGYocmVncyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvY3Jhc2hfZHVtcC5jIGIvYXJjaC94ODZfNjQva2VybmVsL2NyYXNoX2R1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDJkZWFjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2NyYXNoX2R1bXAuYwpAQCAtMCwwICsxLDQ3IEBACisvKgorICoJa2VybmVsL2NyYXNoX2R1bXAuYyAtIE1lbW9yeSBwcmVzZXJ2aW5nIHJlYm9vdCByZWxhdGVkIGNvZGUuCisgKgorICoJQ3JlYXRlZCBieTogSGFyaXByYXNhZCBOZWxsaXRoZWVydGhhIChoYXJpQGluLmlibS5jb20pCisgKglDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNC4gQWxsIHJpZ2h0cyByZXNlcnZlZAorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYXNoX2R1bXAuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qKgorICogY29weV9vbGRtZW1fcGFnZSAtIGNvcHkgb25lIHBhZ2UgZnJvbSAib2xkbWVtIgorICogQHBmbjogcGFnZSBmcmFtZSBudW1iZXIgdG8gYmUgY29waWVkCisgKiBAYnVmOiB0YXJnZXQgbWVtb3J5IGFkZHJlc3MgZm9yIHRoZSBjb3B5OyB0aGlzIGNhbiBiZSBpbiBrZXJuZWwgYWRkcmVzcworICoJc3BhY2Ugb3IgdXNlciBhZGRyZXNzIHNwYWNlIChzZWUgQHVzZXJidWYpCisgKiBAY3NpemU6IG51bWJlciBvZiBieXRlcyB0byBjb3B5CisgKiBAb2Zmc2V0OiBvZmZzZXQgaW4gYnl0ZXMgaW50byB0aGUgcGFnZSAoYmFzZWQgb24gcGZuKSB0byBiZWdpbiB0aGUgY29weQorICogQHVzZXJidWY6IGlmIHNldCwgQGJ1ZiBpcyBpbiB1c2VyIGFkZHJlc3Mgc3BhY2UsIHVzZSBjb3B5X3RvX3VzZXIoKSwKKyAqCW90aGVyd2lzZSBAYnVmIGlzIGluIGtlcm5lbCBhZGRyZXNzIHNwYWNlLCB1c2UgbWVtY3B5KCkuCisgKgorICogQ29weSBhIHBhZ2UgZnJvbSAib2xkbWVtIi4gRm9yIHRoaXMgcGFnZSwgdGhlcmUgaXMgbm8gcHRlIG1hcHBlZAorICogaW4gdGhlIGN1cnJlbnQga2VybmVsLiBXZSBzdGl0Y2ggdXAgYSBwdGUsIHNpbWlsYXIgdG8ga21hcF9hdG9taWMuCisgKi8KK3NzaXplX3QgY29weV9vbGRtZW1fcGFnZSh1bnNpZ25lZCBsb25nIHBmbiwgY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjc2l6ZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCB1c2VyYnVmKQoreworCXZvaWQgICp2YWRkcjsKKworCWlmICghY3NpemUpCisJCXJldHVybiAwOworCisJdmFkZHIgPSBpb3JlbWFwKHBmbiA8PCBQQUdFX1NISUZULCBQQUdFX1NJWkUpOworCisJaWYgKHVzZXJidWYpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsICh2YWRkciArIG9mZnNldCksIGNzaXplKSkgeworCQkJaW91bm1hcCh2YWRkcik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0gZWxzZQorCW1lbWNweShidWYsICh2YWRkciArIG9mZnNldCksIGNzaXplKTsKKworCWlvdW5tYXAodmFkZHIpOworCXJldHVybiBjc2l6ZTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9lODIwLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvZTgyMC5jCmluZGV4IDE3NTc5YTEuLjI5M2NkNzEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9lODIwLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2U4MjAuYwpAQCAtNTU5LDYgKzU1OSwyNyBAQAogCWVuZF91c2VyX3BmbiA+Pj0gUEFHRV9TSElGVDsJCiB9IAogCit2b2lkIF9faW5pdCBwYXJzZV9tZW1tYXBvcHQoY2hhciAqcCwgY2hhciAqKmZyb20pCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0X2F0LCBtZW1fc2l6ZTsKKworCW1lbV9zaXplID0gbWVtcGFyc2UocCwgZnJvbSk7CisJcCA9ICpmcm9tOworCWlmICgqcCA9PSAnQCcpIHsKKwkJc3RhcnRfYXQgPSBtZW1wYXJzZShwKzEsIGZyb20pOworCQlhZGRfbWVtb3J5X3JlZ2lvbihzdGFydF9hdCwgbWVtX3NpemUsIEU4MjBfUkFNKTsKKwl9IGVsc2UgaWYgKCpwID09ICcjJykgeworCQlzdGFydF9hdCA9IG1lbXBhcnNlKHArMSwgZnJvbSk7CisJCWFkZF9tZW1vcnlfcmVnaW9uKHN0YXJ0X2F0LCBtZW1fc2l6ZSwgRTgyMF9BQ1BJKTsKKwl9IGVsc2UgaWYgKCpwID09ICckJykgeworCQlzdGFydF9hdCA9IG1lbXBhcnNlKHArMSwgZnJvbSk7CisJCWFkZF9tZW1vcnlfcmVnaW9uKHN0YXJ0X2F0LCBtZW1fc2l6ZSwgRTgyMF9SRVNFUlZFRCk7CisJfSBlbHNlIHsKKwkJZW5kX3VzZXJfcGZuID0gKG1lbV9zaXplID4+IFBBR0VfU0hJRlQpOworCX0KKwlwID0gKmZyb207Cit9CisKIHVuc2lnbmVkIGxvbmcgcGNpX21lbV9zdGFydCA9IDB4YWVlZGJhYmU7CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvZWFybHlfcHJpbnRrLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvZWFybHlfcHJpbnRrLmMKaW5kZXggOWNkOTY4ZC4uNmRmZmI0OSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2Vhcmx5X3ByaW50ay5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9lYXJseV9wcmludGsuYwpAQCAtMjE2LDcgKzIxNiw3IEBACiAJdmFfZW5kKGFwKTsgCiB9IAogCi1zdGF0aWMgaW50IGtlZXBfZWFybHk7IAorc3RhdGljIGludCBfX2luaXRkYXRhIGtlZXBfZWFybHk7CiAKIGludCBfX2luaXQgc2V0dXBfZWFybHlfcHJpbnRrKGNoYXIgKm9wdCkgCiB7ICAKQEAgLTIyNiw4ICsyMjYsNiBAQAogCWlmIChlYXJseV9jb25zb2xlX2luaXRpYWxpemVkKQogCQlyZXR1cm4gLTE7CiAKLQlvcHQgPSBzdHJjaHIob3B0LCAnPScpICsgMTsKLQogCXN0cmxjcHkoYnVmLG9wdCxzaXplb2YoYnVmKSk7IAogCXNwYWNlID0gc3RyY2hyKGJ1ZiwgJyAnKTsgCiAJaWYgKHNwYWNlKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2VudHJ5LlMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvZW50cnkuUwppbmRleCA5ZmY0MjA0Li5kYmRiYTU2IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvZW50cnkuUwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vaHdfaXJxLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIAogCS5jb2RlNjQKIApAQCAtMzEzLDYgKzMxNCw3IEBACiAJbW92bCB0aHJlYWRpbmZvX2ZsYWdzKCVyY3gpLCVlZHgKIAlhbmRsICVlZGksJWVkeAogCWpueiAgIGludF9jYXJlZnVsCisJYW5kbCAgICAkflRTX0NPTVBBVCx0aHJlYWRpbmZvX3N0YXR1cyglcmN4KQogCWptcCAgIHJldGludF9zd2FwZ3MKIAogCS8qIEVpdGhlciByZXNjaGVkdWxlIG9yIHNpZ25hbCBvciBzeXNjYWxsIGV4aXQgdHJhY2tpbmcgbmVlZGVkLiAqLwpAQCAtNjczLDcgKzY3NSw3IEBACiAKIAkvKiBlcnJvciBjb2RlIGlzIG9uIHRoZSBzdGFjayBhbHJlYWR5ICovCiAJLyogaGFuZGxlIE5NSSBsaWtlIGV4Y2VwdGlvbnMgdGhhdCBjYW4gaGFwcGVuIGV2ZXJ5d2hlcmUgKi8KLQkubWFjcm8gcGFyYW5vaWRlbnRyeSBzeW0KKwkubWFjcm8gcGFyYW5vaWRlbnRyeSBzeW0sIGlzdD0wCiAJU0FWRV9BTEwKIAljbGQKIAltb3ZsICQxLCVlYngKQEAgLTY4MywxMCArNjg1LDIwIEBACiAJanMgICAgMWYKIAlzd2FwZ3MKIAl4b3JsICAlZWJ4LCVlYngKLTE6CW1vdnEgJXJzcCwlcmRpCisxOgorCS5pZiBcaXN0CisJbW92cQklZ3M6cGRhX2RhdGFfb2Zmc2V0LCAlcmJwCisJLmVuZGlmCisJbW92cSAlcnNwLCVyZGkKIAltb3ZxIE9SSUdfUkFYKCVyc3ApLCVyc2kKIAltb3ZxICQtMSxPUklHX1JBWCglcnNwKQorCS5pZiBcaXN0CisJc3VicQkkRVhDRVBUSU9OX1NUS1NaLCBwZXJfY3B1X19pbml0X3RzcyArIFRTU19pc3QgKyAoXGlzdCAtIDEpICogOCglcmJwKQorCS5lbmRpZgogCWNhbGwgXHN5bQorCS5pZiBcaXN0CisJYWRkcQkkRVhDRVBUSU9OX1NUS1NaLCBwZXJfY3B1X19pbml0X3RzcyArIFRTU19pc3QgKyAoXGlzdCAtIDEpICogOCglcmJwKQorCS5lbmRpZgogCWNsaQogCS5lbmRtCiAJCkBAIC03NTQsNyArNzY2LDcgQEAKIAlqbnogIHJldGludF9jYXJlZnVsCiAJc3dhcGdzIAogCVJFU1RPUkVfQVJHUyAwLDgsMAkJCQkJCQotCWlyZXRxCisJam1wIGlyZXRfbGFiZWwKIAlDRklfRU5EUFJPQwogCiBlcnJvcl9rZXJuZWxzcGFjZToKQEAgLTkwNCw3ICs5MTYsNyBAQAogIAlJTlRSX0ZSQU1FCiAJcHVzaHEgJDAKIAlDRklfQURKVVNUX0NGQV9PRkZTRVQgOAkJCi0JcGFyYW5vaWRlbnRyeSBkb19kZWJ1ZworCXBhcmFub2lkZW50cnkgZG9fZGVidWcsIERFQlVHX1NUQUNLCiAJam1wIHBhcmFub2lkX2V4aXQKIAlDRklfRU5EUFJPQwogCS5wcmV2aW91cyAudGV4dApAQCAtOTU5LDcgKzk3MSwxMiBAQAogCUNGSV9FTkRQUk9DCiAKIEtQUk9CRV9FTlRSWShpbnQzKQotCXplcm9lbnRyeSBkb19pbnQzCQorIAlJTlRSX0ZSQU1FCisgCXB1c2hxICQwCisgCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA4CisgCXBhcmFub2lkZW50cnkgZG9faW50MywgREVCVUdfU1RBQ0sKKyAJam1wIHBhcmFub2lkX2V4aXQKKyAJQ0ZJX0VORFBST0MKIAkucHJldmlvdXMgLnRleHQKIAogRU5UUlkob3ZlcmZsb3cpCkBAIC0xMDIxLDIzICsxMDM4LDE4IEBACiAJQ0ZJX0VORFBST0MKICNlbmRpZgogCi1FTlRSWShjYWxsX2RlYnVnKQotICAgICAgIHplcm9lbnRyeSBkb19jYWxsX2RlYnVnCi0KIEVOVFJZKGNhbGxfc29mdGlycSkKIAlDRklfU1RBUlRQUk9DCiAJbW92cSAlZ3M6cGRhX2lycXN0YWNrcHRyLCVyYXgKLQlwdXNocSAlcjE1Ci0JQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDgKLQltb3ZxICVyc3AsJXIxNQotCUNGSV9ERUZfQ0ZBX1JFR0lTVEVSCXIxNQorCW1vdnEgJXJzcCwlcmR4CisJQ0ZJX0RFRl9DRkFfUkVHSVNURVIJcmR4CiAJaW5jbCAlZ3M6cGRhX2lycWNvdW50CiAJY21vdmUgJXJheCwlcnNwCisJcHVzaHEgJXJkeAorCS8qdG9kbyBDRklfREVGX0NGQV9FWFBSRVNTSU9OIC4uLiovCiAJY2FsbCBfX2RvX3NvZnRpcnEKLQltb3ZxICVyMTUsJXJzcAorCXBvcHEgJXJzcAogCUNGSV9ERUZfQ0ZBX1JFR0lTVEVSCXJzcAogCWRlY2wgJWdzOnBkYV9pcnFjb3VudAotCXBvcHEgJXIxNQotCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtOAogCXJldAogCUNGSV9FTkRQUk9DCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpY19jbHVzdGVyLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpY19jbHVzdGVyLmMKaW5kZXggYTQ3MmQ2Mi4uNDNmY2Y2MiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2dlbmFwaWNfY2x1c3Rlci5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9nZW5hcGljX2NsdXN0ZXIuYwpAQCAtNzIsMTQgKzcyLDExIEBACiBzdGF0aWMgdm9pZCBjbHVzdGVyX3NlbmRfSVBJX2FsbGJ1dHNlbGYoaW50IHZlY3RvcikKIHsKIAljcHVtYXNrX3QgbWFzayA9IGNwdV9vbmxpbmVfbWFwOwotCWludCBtZSA9IGdldF9jcHUoKTsgLyogRW5zdXJlIHdlIGFyZSBub3QgcHJlZW1wdGVkIHdoZW4gd2UgY2xlYXIgKi8KIAotCWNwdV9jbGVhcihtZSwgbWFzayk7CisJY3B1X2NsZWFyKHNtcF9wcm9jZXNzb3JfaWQoKSwgbWFzayk7CiAKIAlpZiAoIWNwdXNfZW1wdHkobWFzaykpCiAJCWNsdXN0ZXJfc2VuZF9JUElfbWFzayhtYXNrLCB2ZWN0b3IpOwotCi0JcHV0X2NwdSgpOwogfQogCiBzdGF0aWMgdm9pZCBjbHVzdGVyX3NlbmRfSVBJX2FsbChpbnQgdmVjdG9yKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2dlbmFwaWNfZmxhdC5jIGIvYXJjaC94ODZfNjQva2VybmVsL2dlbmFwaWNfZmxhdC5jCmluZGV4IDlkYTNlZGIuLjFhMmFiODIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9nZW5hcGljX2ZsYXQuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpY19mbGF0LmMKQEAgLTgzLDEyICs4MywxMSBAQAogCQlfX3NlbmRfSVBJX3Nob3J0Y3V0KEFQSUNfREVTVF9BTExCVVQsIHZlY3RvcixBUElDX0RFU1RfTE9HSUNBTCk7CiAjZWxzZQogCWNwdW1hc2tfdCBhbGxidXRtZSA9IGNwdV9vbmxpbmVfbWFwOwotCWludCBtZSA9IGdldF9jcHUoKTsgLyogRW5zdXJlIHdlIGFyZSBub3QgcHJlZW1wdGVkIHdoZW4gd2UgY2xlYXIgKi8KLQljcHVfY2xlYXIobWUsIGFsbGJ1dG1lKTsKKworCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIGFsbGJ1dG1lKTsKIAogCWlmICghY3B1c19lbXB0eShhbGxidXRtZSkpCiAJCWZsYXRfc2VuZF9JUElfbWFzayhhbGxidXRtZSwgdmVjdG9yKTsKLQlwdXRfY3B1KCk7CiAjZW5kaWYKIH0KIApAQCAtMTQ5LDEwICsxNDgsOSBAQAogc3RhdGljIHZvaWQgcGh5c2ZsYXRfc2VuZF9JUElfYWxsYnV0c2VsZihpbnQgdmVjdG9yKQogewogCWNwdW1hc2tfdCBhbGxidXRtZSA9IGNwdV9vbmxpbmVfbWFwOwotCWludCBtZSA9IGdldF9jcHUoKTsKLQljcHVfY2xlYXIobWUsIGFsbGJ1dG1lKTsKKworCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIGFsbGJ1dG1lKTsKIAlwaHlzZmxhdF9zZW5kX0lQSV9tYXNrKGFsbGJ1dG1lLCB2ZWN0b3IpOwotCXB1dF9jcHUoKTsKIH0KIAogc3RhdGljIHZvaWQgcGh5c2ZsYXRfc2VuZF9JUElfYWxsKGludCB2ZWN0b3IpCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvaGVhZC5TIGIvYXJjaC94ODZfNjQva2VybmVsL2hlYWQuUwppbmRleCAxNTI5MDk2Li42OTJjNzM3IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9oZWFkLlMKQEAgLTI0MSwxMDQgKzI0MSw3MCBAQAogRU5UUlkoc3RleHQpCiBFTlRSWShfc3RleHQpCiAKLS5vcmcgMHgxMDAwCi1FTlRSWShpbml0X2xldmVsNF9wZ3QpCisJJHBhZ2UgPSAwCisjZGVmaW5lIE5FWFRfUEFHRShuYW1lKSBcCisJJHBhZ2UgPSAkcGFnZSArIDE7IFwKKwkub3JnICRwYWdlICogMHgxMDAwOyBcCisJcGh5c18vKiovbmFtZSA9ICRwYWdlICogMHgxMDAwICsgX19QSFlTSUNBTF9TVEFSVDsgXAorRU5UUlkobmFtZSkKKworTkVYVF9QQUdFKGluaXRfbGV2ZWw0X3BndCkKIAkvKiBUaGlzIGdldHMgaW5pdGlhbGl6ZWQgaW4geDg2XzY0X3N0YXJ0X2tlcm5lbCAqLwogCS5maWxsCTUxMiw4LDAKIAotLm9yZyAweDIwMDAKLUVOVFJZKGxldmVsM19pZGVudF9wZ3QpCi0JLnF1YWQJMHgwMDAwMDAwMDAwMDA0MDA3ICsgX19QSFlTSUNBTF9TVEFSVAorTkVYVF9QQUdFKGxldmVsM19pZGVudF9wZ3QpCisJLnF1YWQJcGh5c19sZXZlbDJfaWRlbnRfcGd0IHwgMHgwMDcKIAkuZmlsbAk1MTEsOCwwCiAKLS5vcmcgMHgzMDAwCi1FTlRSWShsZXZlbDNfa2VybmVsX3BndCkKK05FWFRfUEFHRShsZXZlbDNfa2VybmVsX3BndCkKIAkuZmlsbAk1MTAsOCwwCiAJLyogKDJeNDgtKDIqMTAyNCoxMDI0KjEwMjQpLSgoMl4zOSkqNTExKSkvKDJeMzApID0gNTEwICovCi0JLnF1YWQJMHgwMDAwMDAwMDAwMDA1MDA3ICsgX19QSFlTSUNBTF9TVEFSVAkvKiAtPiBsZXZlbDJfa2VybmVsX3BndCAqLworCS5xdWFkCXBoeXNfbGV2ZWwyX2tlcm5lbF9wZ3QgfCAweDAwNwogCS5maWxsCTEsOCwwCiAKLS5vcmcgMHg0MDAwCi1FTlRSWShsZXZlbDJfaWRlbnRfcGd0KQorTkVYVF9QQUdFKGxldmVsMl9pZGVudF9wZ3QpCiAJLyogNDBNQiBmb3IgYm9vdHVwLiAJKi8KLQkucXVhZAkweDAwMDAwMDAwMDAwMDAwODMKLQkucXVhZAkweDAwMDAwMDAwMDAyMDAwODMKLQkucXVhZAkweDAwMDAwMDAwMDA0MDAwODMKLQkucXVhZAkweDAwMDAwMDAwMDA2MDAwODMKLQkucXVhZAkweDAwMDAwMDAwMDA4MDAwODMKLQkucXVhZAkweDAwMDAwMDAwMDBBMDAwODMKLQkucXVhZAkweDAwMDAwMDAwMDBDMDAwODMKLQkucXVhZAkweDAwMDAwMDAwMDBFMDAwODMKLQkucXVhZAkweDAwMDAwMDAwMDEwMDAwODMKLQkucXVhZAkweDAwMDAwMDAwMDEyMDAwODMKLQkucXVhZAkweDAwMDAwMDAwMDE0MDAwODMKLQkucXVhZAkweDAwMDAwMDAwMDE2MDAwODMKLQkucXVhZAkweDAwMDAwMDAwMDE4MDAwODMKLQkucXVhZAkweDAwMDAwMDAwMDFBMDAwODMKLQkucXVhZAkweDAwMDAwMDAwMDFDMDAwODMKLQkucXVhZAkweDAwMDAwMDAwMDFFMDAwODMKLQkucXVhZAkweDAwMDAwMDAwMDIwMDAwODMKLQkucXVhZAkweDAwMDAwMDAwMDIyMDAwODMKLQkucXVhZAkweDAwMDAwMDAwMDI0MDAwODMKLQkucXVhZAkweDAwMDAwMDAwMDI2MDAwODMKKwlpID0gMAorCS5yZXB0IDIwCisJLnF1YWQJaSA8PCAyMSB8IDB4MDgzCisJaSA9IGkgKyAxCisJLmVuZHIKIAkvKiBUZW1wb3JhcnkgbWFwcGluZ3MgZm9yIHRoZSBzdXBlciBlYXJseSBhbGxvY2F0b3IgaW4gYXJjaC94ODZfNjQvbW0vaW5pdC5jICovCiAJLmdsb2JsIHRlbXBfYm9vdF9wbWRzCiB0ZW1wX2Jvb3RfcG1kczoKIAkuZmlsbAk0OTIsOCwwCiAJCi0ub3JnIDB4NTAwMAotRU5UUlkobGV2ZWwyX2tlcm5lbF9wZ3QpCitORVhUX1BBR0UobGV2ZWwyX2tlcm5lbF9wZ3QpCiAJLyogNDBNQiBrZXJuZWwgbWFwcGluZy4gVGhlIGtlcm5lbCBjb2RlIGNhbm5vdCBiZSBiaWdnZXIgdGhhbiB0aGF0LgogCSAgIFdoZW4geW91IGNoYW5nZSB0aGlzIGNoYW5nZSBLRVJORUxfVEVYVF9TSVpFIGluIHBhZ2UuaCB0b28uICovCiAJLyogKDJeNDgtKDIqMTAyNCoxMDI0KjEwMjQpLSgoMl4zOSkqNTExKS0oKDJeMzApKjUxMCkpID0gMCAqLwotCS5xdWFkCTB4MDAwMDAwMDAwMDAwMDE4MwotCS5xdWFkCTB4MDAwMDAwMDAwMDIwMDE4MwotCS5xdWFkCTB4MDAwMDAwMDAwMDQwMDE4MwotCS5xdWFkCTB4MDAwMDAwMDAwMDYwMDE4MwotCS5xdWFkCTB4MDAwMDAwMDAwMDgwMDE4MwotCS5xdWFkCTB4MDAwMDAwMDAwMEEwMDE4MwotCS5xdWFkCTB4MDAwMDAwMDAwMEMwMDE4MwotCS5xdWFkCTB4MDAwMDAwMDAwMEUwMDE4MwotCS5xdWFkCTB4MDAwMDAwMDAwMTAwMDE4MwotCS5xdWFkCTB4MDAwMDAwMDAwMTIwMDE4MwotCS5xdWFkCTB4MDAwMDAwMDAwMTQwMDE4MwotCS5xdWFkCTB4MDAwMDAwMDAwMTYwMDE4MwotCS5xdWFkCTB4MDAwMDAwMDAwMTgwMDE4MwotCS5xdWFkCTB4MDAwMDAwMDAwMUEwMDE4MwotCS5xdWFkCTB4MDAwMDAwMDAwMUMwMDE4MwotCS5xdWFkCTB4MDAwMDAwMDAwMUUwMDE4MwotCS5xdWFkCTB4MDAwMDAwMDAwMjAwMDE4MwotCS5xdWFkCTB4MDAwMDAwMDAwMjIwMDE4MwotCS5xdWFkCTB4MDAwMDAwMDAwMjQwMDE4MwotCS5xdWFkCTB4MDAwMDAwMDAwMjYwMDE4MworCWkgPSAwCisJLnJlcHQgMjAKKwkucXVhZAlpIDw8IDIxIHwgMHgxODMKKwlpID0gaSArIDEKKwkuZW5kcgogCS8qIE1vZHVsZSBtYXBwaW5nIHN0YXJ0cyBoZXJlICovCiAJLmZpbGwJNDkyLDgsMAogCi0ub3JnIDB4NjAwMAotRU5UUlkoZW1wdHlfemVyb19wYWdlKQorTkVYVF9QQUdFKGVtcHR5X3plcm9fcGFnZSkKIAotLm9yZyAweDcwMDAKLUVOVFJZKGVtcHR5X2JhZF9wYWdlKQorTkVYVF9QQUdFKGxldmVsM19waHlzbWVtX3BndCkKKwkucXVhZAlwaHlzX2xldmVsMl9rZXJuZWxfcGd0IHwgMHgwMDcJLyogc28gdGhhdCBfX3ZhIHdvcmtzIGV2ZW4gYmVmb3JlIHBhZ2V0YWJsZV9pbml0ICovCisJLmZpbGwJNTExLDgsMAogCi0ub3JnIDB4ODAwMAotRU5UUlkoZW1wdHlfYmFkX3B0ZV90YWJsZSkKKyN1bmRlZiBORVhUX1BBR0UKIAotLm9yZyAweDkwMDAKLUVOVFJZKGVtcHR5X2JhZF9wbWRfdGFibGUpCisJLmRhdGEKIAotLm9yZyAweGEwMDAKLUVOVFJZKGxldmVsM19waHlzbWVtX3BndCkKLQkucXVhZAkweDAwMDAwMDAwMDAwMDUwMDcgKyBfX1BIWVNJQ0FMX1NUQVJUCS8qIC0+IGxldmVsMl9rZXJuZWxfcGd0IChzbyB0aGF0IF9fdmEgd29ya3MgZXZlbiBiZWZvcmUgcGFnZXRhYmxlX2luaXQpICovCi0KLQkub3JnIDB4YjAwMAogI2lmZGVmIENPTkZJR19BQ1BJX1NMRUVQCisJLmFsaWduIFBBR0VfU0laRQogRU5UUlkod2FrZXVwX2xldmVsNF9wZ3QpCi0JLnF1YWQJMHgwMDAwMDAwMDAwMDAyMDA3ICsgX19QSFlTSUNBTF9TVEFSVAkvKiAtPiBsZXZlbDNfaWRlbnRfcGd0ICovCisJLnF1YWQJcGh5c19sZXZlbDNfaWRlbnRfcGd0IHwgMHgwMDcKIAkuZmlsbAkyNTUsOCwwCi0JLnF1YWQJMHgwMDAwMDAwMDAwMDBhMDA3ICsgX19QSFlTSUNBTF9TVEFSVAorCS5xdWFkCXBoeXNfbGV2ZWwzX3BoeXNtZW1fcGd0IHwgMHgwMDcKIAkuZmlsbAkyNTQsOCwwCiAJLyogKDJeNDgtKDIqMTAyNCoxMDI0KjEwMjQpKS8oMl4zOSkgPSA1MTEgKi8KLQkucXVhZAkweDAwMDAwMDAwMDAwMDMwMDcgKyBfX1BIWVNJQ0FMX1NUQVJUCS8qIC0+IGxldmVsM19rZXJuZWxfcGd0ICovCisJLnF1YWQJcGh5c19sZXZlbDNfa2VybmVsX3BndCB8IDB4MDA3CiAjZW5kaWYKIAogI2lmbmRlZiBDT05GSUdfSE9UUExVR19DUFUKQEAgLTM1MiwxMiArMzE4LDEyIEBACiAJICovCiAJLmFsaWduIFBBR0VfU0laRQogRU5UUlkoYm9vdF9sZXZlbDRfcGd0KQotCS5xdWFkCTB4MDAwMDAwMDAwMDAwMjAwNyArIF9fUEhZU0lDQUxfU1RBUlQJLyogLT4gbGV2ZWwzX2lkZW50X3BndCAqLworCS5xdWFkCXBoeXNfbGV2ZWwzX2lkZW50X3BndCB8IDB4MDA3CiAJLmZpbGwJMjU1LDgsMAotCS5xdWFkCTB4MDAwMDAwMDAwMDAwYTAwNyArIF9fUEhZU0lDQUxfU1RBUlQKKwkucXVhZAlwaHlzX2xldmVsM19waHlzbWVtX3BndCB8IDB4MDA3CiAJLmZpbGwJMjU0LDgsMAogCS8qICgyXjQ4LSgyKjEwMjQqMTAyNCoxMDI0KSkvKDJeMzkpID0gNTExICovCi0JLnF1YWQJMHgwMDAwMDAwMDAwMDAzMDA3ICsgX19QSFlTSUNBTF9TVEFSVAkvKiAtPiBsZXZlbDNfa2VybmVsX3BndCAqLworCS5xdWFkCXBoeXNfbGV2ZWwzX2tlcm5lbF9wZ3QgfCAweDAwNwogCiAJLmRhdGEKIApAQCAtMzc5LDE0ICszNDUsMTQgQEAKICAqIEFsc28gc3lzcmV0IG1hbmRhdGVzIGEgc3BlY2lhbCBHRFQgbGF5b3V0IAogICovCiAJCSAJCQotLmFsaWduIEwxX0NBQ0hFX0JZVEVTCisuYWxpZ24gUEFHRV9TSVpFCiAKIC8qIFRoZSBUTFMgZGVzY3JpcHRvcnMgYXJlIGN1cnJlbnRseSBhdCBhIGRpZmZlcmVudCBwbGFjZSBjb21wYXJlZCB0byBpMzg2LgogICAgSG9wZWZ1bGx5IG5vYm9keSBleHBlY3RzIHRoZW0gYXQgYSBmaXhlZCBwbGFjZSAoV2luZT8pICovCiAJCiBFTlRSWShjcHVfZ2R0X3RhYmxlKQogCS5xdWFkCTB4MDAwMDAwMDAwMDAwMDAwMAkvKiBOVUxMIGRlc2NyaXB0b3IgKi8KLQkucXVhZAkweDAwOGY5YTAwMDAwMGZmZmYJLyogX19LRVJORUxfQ09NUEFUMzJfQ1MgKi8JCisJLnF1YWQJMHgwCQkJLyogdW51c2VkICovCiAJLnF1YWQJMHgwMGFmOWEwMDAwMDBmZmZmCS8qIF9fS0VSTkVMX0NTICovCiAJLnF1YWQJMHgwMGNmOTIwMDAwMDBmZmZmCS8qIF9fS0VSTkVMX0RTICovCiAJLnF1YWQJMHgwMGNmZmEwMDAwMDBmZmZmCS8qIF9fVVNFUjMyX0NTICovCkBAIC0zOTYsMTUgKzM2MiwxNSBAQAogCS5xdWFkCTAsMAkJCS8qIFRTUyAqLwogCS5xdWFkCTAsMAkJCS8qIExEVCAqLwogCS5xdWFkICAgMCwwLDAJCQkvKiB0aHJlZSBUTFMgZGVzY3JpcHRvcnMgKi8gCi0JLnF1YWQJMHgwMDAwOWEwMDAwMDBmZmZmCS8qIF9fS0VSTkVMMTZfQ1MgLSAxNmJpdCBQTSBmb3IgUzMgd2FrZXVwLiAqLwotCQkJCQkvKiBiYXNlIG11c3QgYmUgcGF0Y2hlZCBmb3IgcmVhbCBiYXNlIGFkZHJlc3MuICovCisJLnF1YWQJMAkJCS8qIHVudXNlZCAqLwogZ2R0X2VuZDoJCiAJLyogYXNtL3NlZ21lbnQuaDpHRFRfRU5UUklFUyBtdXN0IG1hdGNoIHRoaXMgKi8JCiAJLyogVGhpcyBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiB0aGUgY2FjaGUgbGluZSBzaXplICovCi0JLyogR0RUcyBvZiBvdGhlciBDUFVzOiAqLwkKLQkuZmlsbCAoR0RUX1NJWkUgKiBOUl9DUFVTKSAtIChnZHRfZW5kIC0gY3B1X2dkdF90YWJsZSkKKwkvKiBHRFRzIG9mIG90aGVyIENQVXMgYXJlIG5vdyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgKi8KIAotCS5hbGlnbiAgTDFfQ0FDSEVfQllURVMKKwkvKiB6ZXJvIHRoZSByZW1haW5pbmcgcGFnZSAqLworCS5maWxsIFBBR0VfU0laRSAvIDggLSBHRFRfRU5UUklFUyw4LDAKKwogRU5UUlkoaWR0X3RhYmxlKQkKIAkucmVwdCAgIDI1NgogCS5xdWFkICAgMApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2hlYWQ2NC5jIGIvYXJjaC94ODZfNjQva2VybmVsL2hlYWQ2NC5jCmluZGV4IGI2NzVjNWEuLmNlYTIwYTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9oZWFkNjQuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaGVhZDY0LmMKQEAgLTkyLDYgKzkyLDkgQEAKIAltZW1jcHkoaW5pdF9sZXZlbDRfcGd0LCBib290X2xldmVsNF9wZ3QsIFBUUlNfUEVSX1BHRCpzaXplb2YocGdkX3QpKTsKIAlhc20gdm9sYXRpbGUoIm1vdnEgJTAsJSVjcjMiIDo6ICJyIiAoX19wYV9zeW1ib2woJmluaXRfbGV2ZWw0X3BndCkpKTsKIAorIAlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKQorIAkJY3B1X3BkYShpKSA9ICZib290X2NwdV9wZGFbaV07CisKIAlwZGFfaW5pdCgwKTsKIAljb3B5X2Jvb3RkYXRhKHJlYWxfbW9kZV9kYXRhKTsKICNpZmRlZiBDT05GSUdfU01QCkBAIC05OSw3ICsxMDIsNyBAQAogI2VuZGlmCiAJcyA9IHN0cnN0cihzYXZlZF9jb21tYW5kX2xpbmUsICJlYXJseXByaW50az0iKTsKIAlpZiAocyAhPSBOVUxMKQotCQlzZXR1cF9lYXJseV9wcmludGsocyk7CisJCXNldHVwX2Vhcmx5X3ByaW50ayhzdHJjaHIocywgJz0nKSArIDEpOwogI2lmZGVmIENPTkZJR19OVU1BCiAJcyA9IHN0cnN0cihzYXZlZF9jb21tYW5kX2xpbmUsICJudW1hPSIpOwogCWlmIChzICE9IE5VTEwpCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvaTM4Ny5jIGIvYXJjaC94ODZfNjQva2VybmVsL2kzODcuYwppbmRleCBkOWIyMmI2Li5hNWQ3ZTE2IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaTM4Ny5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9pMzg3LmMKQEAgLTk1LDcgKzk1LDcgQEAKIAlpZiAoIXVzZWRfbWF0aCgpKQogCQlyZXR1cm4gMDsKIAljbGVhcl91c2VkX21hdGgoKTsgLyogdHJpZ2dlciBmaW5pdCAqLwotCWlmICh0c2stPnRocmVhZF9pbmZvLT5zdGF0dXMgJiBUU19VU0VERlBVKSB7CisJaWYgKHRhc2tfdGhyZWFkX2luZm8odHNrKS0+c3RhdHVzICYgVFNfVVNFREZQVSkgewogCQllcnIgPSBzYXZlX2kzODdfY2hlY2tpbmcoKHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QgX191c2VyICopYnVmKTsKIAkJaWYgKGVycikgcmV0dXJuIGVycjsKIAkJc3R0cygpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2k4MjU5LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaTgyNTkuYwppbmRleCA2ZTUxMDFhLi41ZWNkMzRhIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaTgyNTkuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaTgyNTkuYwpAQCAtMTMzLDcgKzEzMyw3IEBACiB7CiAJaWYgKGlycSA+IDI1NikgeyAKIAkJY2hhciB2YXI7Ci0JCXByaW50aygicmV0dXJuICVwIHN0YWNrICVwIHRpICVwXG4iLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCksICZ2YXIsIGN1cnJlbnQtPnRocmVhZF9pbmZvKTsgCisJCXByaW50aygicmV0dXJuICVwIHN0YWNrICVwIHRpICVwXG4iLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCksICZ2YXIsIHRhc2tfdGhyZWFkX2luZm8oY3VycmVudCkpOwogCiAJCUJVRygpOyAKIAl9CkBAIC01NDksMTAgKzU0OSw5IEBACiAJCWludCB2ZWN0b3IgPSBGSVJTVF9FWFRFUk5BTF9WRUNUT1IgKyBpOwogCQlpZiAoaSA+PSBOUl9JUlFTKQogCQkJYnJlYWs7Ci0JCWlmICh2ZWN0b3IgIT0gSUEzMl9TWVNDQUxMX1ZFQ1RPUiAmJiB2ZWN0b3IgIT0gS0RCX1ZFQ1RPUikgeyAKKwkJaWYgKHZlY3RvciAhPSBJQTMyX1NZU0NBTExfVkVDVE9SKQogCQkJc2V0X2ludHJfZ2F0ZSh2ZWN0b3IsIGludGVycnVwdFtpXSk7CiAJfQotCX0KIAogI2lmZGVmIENPTkZJR19TTVAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2luaXRfdGFzay5jIGIvYXJjaC94ODZfNjQva2VybmVsL2luaXRfdGFzay5jCmluZGV4IGUwYmE1YzEuLmNlMzFkOTAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9pbml0X3Rhc2suYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaW5pdF90YXNrLmMKQEAgLTQ0LDYgKzQ0LDYgQEAKICAqIHNlY3Rpb24uIFNpbmNlIFRTUydzIGFyZSBjb21wbGV0ZWx5IENQVS1sb2NhbCwgd2Ugd2FudCB0aGVtCiAgKiBvbiBleGFjdCBjYWNoZWxpbmUgYm91bmRhcmllcywgdG8gZWxpbWluYXRlIGNhY2hlbGluZSBwaW5nLXBvbmcuCiAgKi8gCi1ERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdHNzX3N0cnVjdCwgaW5pdF90c3MpIF9fX19jYWNoZWxpbmVfbWF4YWxpZ25lZF9pbl9zbXAgPSBJTklUX1RTUzsKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCB0c3Nfc3RydWN0LCBpbml0X3RzcykgX19fX2NhY2hlbGluZV9pbnRlcm5vZGVhbGlnbmVkX2luX3NtcCA9IElOSVRfVFNTOwogCiAjZGVmaW5lIEFMSUdOX1RPXzRLIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIi5kYXRhLmluaXRfdGFzayIpKSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaW9fYXBpYy5jCmluZGV4IDk3MTU0YWIuLjFhNTA2MGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2lvX2FwaWMuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGFzbS9wcm90by5oPgogI2luY2x1ZGUgPGFzbS9tYWNoX2FwaWMuaD4KICNpbmNsdWRlIDxhc20vYWNwaS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KIAogI2RlZmluZSBfX2FwaWNkZWJ1Z2luaXQgIF9faW5pdAogCkBAIC00Niw2ICs0Nyw5IEBACiAKIGludCBkaXNhYmxlX3RpbWVyX3Bpbl8xIF9faW5pdGRhdGE7CiAKKy8qIFdoZXJlIGlmIGFueXdoZXJlIGlzIHRoZSBpODI1OSBjb25uZWN0IGluIGV4dGVybmFsIGludCBtb2RlICovCitzdGF0aWMgc3RydWN0IHsgaW50IHBpbiwgYXBpYzsgfSBpb2FwaWNfaTgyNTkgPSB7IC0xLCAtMSB9OworCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlvYXBpY19sb2NrKTsKIAogLyoKQEAgLTI2MCw5ICsyNjQsNiBAQAogdm9pZCBfX2luaXQgY2hlY2tfaW9hcGljKHZvaWQpIAogeyAKIAlpbnQgbnVtLHNsb3QsZnVuYzsgCi0JaWYgKGlvYXBpY19mb3JjZSkgCi0JCXJldHVybjsgCi0KIAkvKiBQb29yIG1hbidzIFBDSSBkaXNjb3ZlcnkgKi8KIAlmb3IgKG51bSA9IDA7IG51bSA8IDMyOyBudW0rKykgeyAKIAkJZm9yIChzbG90ID0gMDsgc2xvdCA8IDMyOyBzbG90KyspIHsgCkBAIC0yODQsNyArMjg1LDcgQEAKIAkJCQlzd2l0Y2ggKHZlbmRvcikgeyAKIAkJCQljYXNlIFBDSV9WRU5ET1JfSURfVklBOgogI2lmZGVmIENPTkZJR19HQVJUX0lPTU1VCi0JCQkJCWlmICgoZW5kX3BmbiA+PSAoMHhmZmZmZmZmZj4+UEFHRV9TSElGVCkgfHwKKwkJCQkJaWYgKChlbmRfcGZuID4gTUFYX0RNQTMyX1BGTiB8fAogCQkJCQkgICAgIGZvcmNlX2lvbW11KSAmJgogCQkJCQkgICAgIWlvbW11X2FwZXJ0dXJlX2FsbG93ZWQpIHsKIAkJCQkJCXByaW50ayhLRVJOX0lORk8KQEAgLTM2Myw3ICszNjQsNyBAQAogLyoKICAqIEZpbmQgdGhlIHBpbiB0byB3aGljaCBJUlFbaXJxXSAoSVNBKSBpcyBjb25uZWN0ZWQKICAqLwotc3RhdGljIGludCBmaW5kX2lzYV9pcnFfcGluKGludCBpcnEsIGludCB0eXBlKQorc3RhdGljIGludCBfX2luaXQgZmluZF9pc2FfaXJxX3BpbihpbnQgaXJxLCBpbnQgdHlwZSkKIHsKIAlpbnQgaTsKIApAQCAtMzgxLDYgKzM4MiwzMSBAQAogCXJldHVybiAtMTsKIH0KIAorc3RhdGljIGludCBfX2luaXQgZmluZF9pc2FfaXJxX2FwaWMoaW50IGlycSwgaW50IHR5cGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXBfaXJxX2VudHJpZXM7IGkrKykgeworCQlpbnQgbGJ1cyA9IG1wX2lycXNbaV0ubXBjX3NyY2J1czsKKworCQlpZiAoKG1wX2J1c19pZF90b190eXBlW2xidXNdID09IE1QX0JVU19JU0EgfHwKKwkJICAgICBtcF9idXNfaWRfdG9fdHlwZVtsYnVzXSA9PSBNUF9CVVNfRUlTQSB8fAorCQkgICAgIG1wX2J1c19pZF90b190eXBlW2xidXNdID09IE1QX0JVU19NQ0EpICYmCisJCSAgICAobXBfaXJxc1tpXS5tcGNfaXJxdHlwZSA9PSB0eXBlKSAmJgorCQkgICAgKG1wX2lycXNbaV0ubXBjX3NyY2J1c2lycSA9PSBpcnEpKQorCQkJYnJlYWs7CisJfQorCWlmIChpIDwgbXBfaXJxX2VudHJpZXMpIHsKKwkJaW50IGFwaWM7CisJCWZvcihhcGljID0gMDsgYXBpYyA8IG5yX2lvYXBpY3M7IGFwaWMrKykgeworCQkJaWYgKG1wX2lvYXBpY3NbYXBpY10ubXBjX2FwaWNpZCA9PSBtcF9pcnFzW2ldLm1wY19kc3RhcGljKQorCQkJCXJldHVybiBhcGljOworCQl9CisJfQorCisJcmV0dXJuIC0xOworfQorCiAvKgogICogRmluZCBhIHNwZWNpZmljIFBDSSBJUlEgZW50cnkuCiAgKiBOb3QgYW4gX19pbml0LCBwb3NzaWJseSBuZWVkZWQgYnkgbW9kdWxlcwpAQCAtODc0LDcgKzkwMCw3IEBACiAgKiBTZXQgdXAgdGhlIDgyNTlBLW1hc3RlciBvdXRwdXQgcGluIGFzIGJyb2FkY2FzdCB0byBhbGwKICAqIENQVXMuCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9FeHRJTlRfSVJRMF9waW4odW5zaWduZWQgaW50IHBpbiwgaW50IHZlY3RvcikKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9FeHRJTlRfSVJRMF9waW4odW5zaWduZWQgaW50IGFwaWMsIHVuc2lnbmVkIGludCBwaW4sIGludCB2ZWN0b3IpCiB7CiAJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTg4NCw3ICs5MTAsNyBAQAogCWRpc2FibGVfODI1OUFfaXJxKDApOwogCiAJLyogbWFzayBMVlQwICovCi0JYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCBBUElDX0xWVF9NQVNLRUQgfCBBUElDX0RNX0VYVElOVCk7CisJYXBpY193cml0ZShBUElDX0xWVDAsIEFQSUNfTFZUX01BU0tFRCB8IEFQSUNfRE1fRVhUSU5UKTsKIAogCS8qCiAJICogV2UgdXNlIGxvZ2ljYWwgZGVsaXZlcnkgdG8gZ2V0IHRoZSB0aW1lciBJUlEKQEAgLTkwOCw4ICs5MzQsOCBAQAogCSAqIEFkZCBpdCB0byB0aGUgSU8tQVBJQyBpcnEtcm91dGluZyB0YWJsZToKIAkgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKLQlpb19hcGljX3dyaXRlKDAsIDB4MTErMipwaW4sICooKChpbnQgKikmZW50cnkpKzEpKTsKLQlpb19hcGljX3dyaXRlKDAsIDB4MTArMipwaW4sICooKChpbnQgKikmZW50cnkpKzApKTsKKwlpb19hcGljX3dyaXRlKGFwaWMsIDB4MTErMipwaW4sICooKChpbnQgKikmZW50cnkpKzEpKTsKKwlpb19hcGljX3dyaXRlKGFwaWMsIDB4MTArMipwaW4sICooKChpbnQgKikmZW50cnkpKzApKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwogCiAJZW5hYmxlXzgyNTlBX2lycSgwKTsKQEAgLTExODgsNyArMTIxNCw4IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgZW5hYmxlX0lPX0FQSUModm9pZCkKIHsKIAl1bmlvbiBJT19BUElDX3JlZ18wMSByZWdfMDE7Ci0JaW50IGk7CisJaW50IGk4MjU5X2FwaWMsIGk4MjU5X3BpbjsKKwlpbnQgaSwgYXBpYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZm9yIChpID0gMDsgaSA8IFBJTl9NQVBfU0laRTsgaSsrKSB7CkBAIC0xMjAyLDExICsxMjI5LDQ4IEBACiAJLyoKIAkgKiBUaGUgbnVtYmVyIG9mIElPLUFQSUMgSVJRIHJlZ2lzdGVycyAoPT0gI3BpbnMpOgogCSAqLwotCWZvciAoaSA9IDA7IGkgPCBucl9pb2FwaWNzOyBpKyspIHsKKwlmb3IgKGFwaWMgPSAwOyBhcGljIDwgbnJfaW9hcGljczsgYXBpYysrKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotCQlyZWdfMDEucmF3ID0gaW9fYXBpY19yZWFkKGksIDEpOworCQlyZWdfMDEucmF3ID0gaW9fYXBpY19yZWFkKGFwaWMsIDEpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotCQlucl9pb2FwaWNfcmVnaXN0ZXJzW2ldID0gcmVnXzAxLmJpdHMuZW50cmllcysxOworCQlucl9pb2FwaWNfcmVnaXN0ZXJzW2FwaWNdID0gcmVnXzAxLmJpdHMuZW50cmllcysxOworCX0KKwlmb3IoYXBpYyA9IDA7IGFwaWMgPCBucl9pb2FwaWNzOyBhcGljKyspIHsKKwkJaW50IHBpbjsKKwkJLyogU2VlIGlmIGFueSBvZiB0aGUgcGlucyBpcyBpbiBFeHRJTlQgbW9kZSAqLworCQlmb3IgKHBpbiA9IDA7IHBpbiA8IG5yX2lvYXBpY19yZWdpc3RlcnNbYXBpY107IHBpbisrKSB7CisJCQlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSBlbnRyeTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCQkJKigoKGludCAqKSZlbnRyeSkgKyAwKSA9IGlvX2FwaWNfcmVhZChhcGljLCAweDEwICsgMiAqIHBpbik7CisJCQkqKCgoaW50ICopJmVudHJ5KSArIDEpID0gaW9fYXBpY19yZWFkKGFwaWMsIDB4MTEgKyAyICogcGluKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisKKworCQkJLyogSWYgdGhlIGludGVycnVwdCBsaW5lIGlzIGVuYWJsZWQgYW5kIGluIEV4dEludCBtb2RlCisJCQkgKiBJIGhhdmUgZm91bmQgdGhlIHBpbiB3aGVyZSB0aGUgaTgyNTkgaXMgY29ubmVjdGVkLgorCQkJICovCisJCQlpZiAoKGVudHJ5Lm1hc2sgPT0gMCkgJiYgKGVudHJ5LmRlbGl2ZXJ5X21vZGUgPT0gZGVzdF9FeHRJTlQpKSB7CisJCQkJaW9hcGljX2k4MjU5LmFwaWMgPSBhcGljOworCQkJCWlvYXBpY19pODI1OS5waW4gID0gcGluOworCQkJCWdvdG8gZm91bmRfaTgyNTk7CisJCQl9CisJCX0KKwl9CisgZm91bmRfaTgyNTk6CisJLyogTG9vayB0byBzZWUgd2hhdCBpZiB0aGUgTVAgdGFibGUgaGFzIHJlcG9ydGVkIHRoZSBFeHRJTlQgKi8KKwlpODI1OV9waW4gID0gZmluZF9pc2FfaXJxX3BpbigwLCBtcF9FeHRJTlQpOworCWk4MjU5X2FwaWMgPSBmaW5kX2lzYV9pcnFfYXBpYygwLCBtcF9FeHRJTlQpOworCS8qIFRydXN0IHRoZSBNUCB0YWJsZSBpZiBub3RoaW5nIGlzIHNldHVwIGluIHRoZSBoYXJkd2FyZSAqLworCWlmICgoaW9hcGljX2k4MjU5LnBpbiA9PSAtMSkgJiYgKGk4MjU5X3BpbiA+PSAwKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJFeHRJTlQgbm90IHNldHVwIGluIGhhcmR3YXJlIGJ1dCByZXBvcnRlZCBieSBNUCB0YWJsZVxuIik7CisJCWlvYXBpY19pODI1OS5waW4gID0gaTgyNTlfcGluOworCQlpb2FwaWNfaTgyNTkuYXBpYyA9IGk4MjU5X2FwaWM7CisJfQorCS8qIENvbXBsYWluIGlmIHRoZSBNUCB0YWJsZSBhbmQgdGhlIGhhcmR3YXJlIGRpc2FncmVlICovCisJaWYgKCgoaW9hcGljX2k4MjU5LmFwaWMgIT0gaTgyNTlfYXBpYykgfHwgKGlvYXBpY19pODI1OS5waW4gIT0gaTgyNTlfcGluKSkgJiYKKwkJKGk4MjU5X3BpbiA+PSAwKSAmJiAoaW9hcGljX2k4MjU5LnBpbiA+PSAwKSkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkV4dElOVCBpbiBoYXJkd2FyZSBhbmQgTVAgdGFibGUgZGlmZmVyXG4iKTsKIAl9CiAKIAkvKgpAQCAtMTIyMCw3ICsxMjg0LDYgQEAKICAqLwogdm9pZCBkaXNhYmxlX0lPX0FQSUModm9pZCkKIHsKLQlpbnQgcGluOwogCS8qCiAJICogQ2xlYXIgdGhlIElPLUFQSUMgYmVmb3JlIHJlYm9vdGluZzoKIAkgKi8KQEAgLTEyMzEsOCArMTI5NCw3IEBACiAJICogUHV0IHRoYXQgSU9BUElDIGluIHZpcnR1YWwgd2lyZSBtb2RlCiAJICogc28gbGVnYWN5IGludGVycnVwdHMgY2FuIGJlIGRlbGl2ZXJlZC4KIAkgKi8KLQlwaW4gPSBmaW5kX2lzYV9pcnFfcGluKDAsIG1wX0V4dElOVCk7Ci0JaWYgKHBpbiAhPSAtMSkgeworCWlmIChpb2FwaWNfaTgyNTkucGluICE9IC0xKSB7CiAJCXN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5IGVudHJ5OwogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xMjQzLDIxICsxMzA1LDIzIEBACiAJCWVudHJ5LnBvbGFyaXR5ICAgICAgICA9IDA7IC8qIEhpZ2ggKi8KIAkJZW50cnkuZGVsaXZlcnlfc3RhdHVzID0gMDsKIAkJZW50cnkuZGVzdF9tb2RlICAgICAgID0gMDsgLyogUGh5c2ljYWwgKi8KLQkJZW50cnkuZGVsaXZlcnlfbW9kZSAgID0gNzsgLyogRXh0SW50ICovCisJCWVudHJ5LmRlbGl2ZXJ5X21vZGUgICA9IGRlc3RfRXh0SU5UOyAvKiBFeHRJbnQgKi8KIAkJZW50cnkudmVjdG9yICAgICAgICAgID0gMDsKLQkJZW50cnkuZGVzdC5waHlzaWNhbC5waHlzaWNhbF9kZXN0ID0gMDsKLQorCQllbnRyeS5kZXN0LnBoeXNpY2FsLnBoeXNpY2FsX2Rlc3QgPQorCQkJCQlHRVRfQVBJQ19JRChhcGljX3JlYWQoQVBJQ19JRCkpOwogCiAJCS8qCiAJCSAqIEFkZCBpdCB0byB0aGUgSU8tQVBJQyBpcnEtcm91dGluZyB0YWJsZToKIAkJICovCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotCQlpb19hcGljX3dyaXRlKDAsIDB4MTErMipwaW4sICooKChpbnQgKikmZW50cnkpKzEpKTsKLQkJaW9fYXBpY193cml0ZSgwLCAweDEwKzIqcGluLCAqKCgoaW50ICopJmVudHJ5KSswKSk7CisJCWlvX2FwaWNfd3JpdGUoaW9hcGljX2k4MjU5LmFwaWMsIDB4MTErMippb2FwaWNfaTgyNTkucGluLAorCQkJKigoKGludCAqKSZlbnRyeSkrMSkpOworCQlpb19hcGljX3dyaXRlKGlvYXBpY19pODI1OS5hcGljLCAweDEwKzIqaW9hcGljX2k4MjU5LnBpbiwKKwkJCSooKChpbnQgKikmZW50cnkpKzApKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKIAl9CiAKLQlkaXNjb25uZWN0X2JzcF9BUElDKHBpbiAhPSAtMSk7CisJZGlzY29ubmVjdF9ic3BfQVBJQyhpb2FwaWNfaTgyNTkucGluICE9IC0xKTsKIH0KIAogLyoKQEAgLTE1NzEsNyArMTYzNSw3IEBACiAJdW5zaWduZWQgbG9uZyB2OwogCiAJdiA9IGFwaWNfcmVhZChBUElDX0xWVDApOwotCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgdiAmIH5BUElDX0xWVF9NQVNLRUQpOworCWFwaWNfd3JpdGUoQVBJQ19MVlQwLCB2ICYgfkFQSUNfTFZUX01BU0tFRCk7CiB9CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfbGFwaWNfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQpAQCAtMTU3OSw3ICsxNjQzLDcgQEAKIAl1bnNpZ25lZCBsb25nIHY7CiAKIAl2ID0gYXBpY19yZWFkKEFQSUNfTFZUMCk7Ci0JYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCB2IHwgQVBJQ19MVlRfTUFTS0VEKTsKKwlhcGljX3dyaXRlKEFQSUNfTFZUMCwgdiB8IEFQSUNfTFZUX01BU0tFRCk7CiB9CiAKIHN0YXRpYyB2b2lkIGFja19sYXBpY19pcnEgKHVuc2lnbmVkIGludCBpcnEpCkBAIC0xNjI2LDIwICsxNjkwLDIxIEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCB1bmxvY2tfRXh0SU5UX2xvZ2ljKHZvaWQpCiB7Ci0JaW50IHBpbiwgaTsKKwlpbnQgYXBpYywgcGluLCBpOwogCXN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5IGVudHJ5MCwgZW50cnkxOwogCXVuc2lnbmVkIGNoYXIgc2F2ZV9jb250cm9sLCBzYXZlX2ZyZXFfc2VsZWN0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlwaW4gPSBmaW5kX2lzYV9pcnFfcGluKDgsIG1wX0lOVCk7CisJcGluICA9IGZpbmRfaXNhX2lycV9waW4oOCwgbXBfSU5UKTsKKwlhcGljID0gZmluZF9pc2FfaXJxX2FwaWMoOCwgbXBfSU5UKTsKIAlpZiAocGluID09IC0xKQogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKLQkqKCgoaW50ICopJmVudHJ5MCkgKyAxKSA9IGlvX2FwaWNfcmVhZCgwLCAweDExICsgMiAqIHBpbik7Ci0JKigoKGludCAqKSZlbnRyeTApICsgMCkgPSBpb19hcGljX3JlYWQoMCwgMHgxMCArIDIgKiBwaW4pOworCSooKChpbnQgKikmZW50cnkwKSArIDEpID0gaW9fYXBpY19yZWFkKGFwaWMsIDB4MTEgKyAyICogcGluKTsKKwkqKCgoaW50ICopJmVudHJ5MCkgKyAwKSA9IGlvX2FwaWNfcmVhZChhcGljLCAweDEwICsgMiAqIHBpbik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKLQljbGVhcl9JT19BUElDX3BpbigwLCBwaW4pOworCWNsZWFyX0lPX0FQSUNfcGluKGFwaWMsIHBpbik7CiAKIAltZW1zZXQoJmVudHJ5MSwgMCwgc2l6ZW9mKGVudHJ5MSkpOwogCkBAIC0xNjUyLDggKzE3MTcsOCBAQAogCWVudHJ5MS52ZWN0b3IgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Ci0JaW9fYXBpY193cml0ZSgwLCAweDExICsgMiAqIHBpbiwgKigoKGludCAqKSZlbnRyeTEpICsgMSkpOwotCWlvX2FwaWNfd3JpdGUoMCwgMHgxMCArIDIgKiBwaW4sICooKChpbnQgKikmZW50cnkxKSArIDApKTsKKwlpb19hcGljX3dyaXRlKGFwaWMsIDB4MTEgKyAyICogcGluLCAqKCgoaW50ICopJmVudHJ5MSkgKyAxKSk7CisJaW9fYXBpY193cml0ZShhcGljLCAweDEwICsgMiAqIHBpbiwgKigoKGludCAqKSZlbnRyeTEpICsgMCkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CiAKIAlzYXZlX2NvbnRyb2wgPSBDTU9TX1JFQUQoUlRDX0NPTlRST0wpOwpAQCAtMTY3MSwxMSArMTczNiwxMSBAQAogCiAJQ01PU19XUklURShzYXZlX2NvbnRyb2wsIFJUQ19DT05UUk9MKTsKIAlDTU9TX1dSSVRFKHNhdmVfZnJlcV9zZWxlY3QsIFJUQ19GUkVRX1NFTEVDVCk7Ci0JY2xlYXJfSU9fQVBJQ19waW4oMCwgcGluKTsKKwljbGVhcl9JT19BUElDX3BpbihhcGljLCBwaW4pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Ci0JaW9fYXBpY193cml0ZSgwLCAweDExICsgMiAqIHBpbiwgKigoKGludCAqKSZlbnRyeTApICsgMSkpOwotCWlvX2FwaWNfd3JpdGUoMCwgMHgxMCArIDIgKiBwaW4sICooKChpbnQgKikmZW50cnkwKSArIDApKTsKKwlpb19hcGljX3dyaXRlKGFwaWMsIDB4MTEgKyAyICogcGluLCAqKCgoaW50ICopJmVudHJ5MCkgKyAxKSk7CisJaW9fYXBpY193cml0ZShhcGljLCAweDEwICsgMiAqIHBpbiwgKigoKGludCAqKSZlbnRyeTApICsgMCkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTE2ODcsNyArMTc1Miw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBjaGVja190aW1lcih2b2lkKQogewotCWludCBwaW4xLCBwaW4yOworCWludCBhcGljMSwgcGluMSwgYXBpYzIsIHBpbjI7CiAJaW50IHZlY3RvcjsKIAogCS8qCkBAIC0xNzA0LDE0ICsxNzY5LDE3IEBACiAJICogdGhlIDgyNTlBIHdoaWNoIGltcGxpZXMgdGhlIHZpcnR1YWwgd2lyZSBoYXMgdG8gYmUKIAkgKiBkaXNhYmxlZCBpbiB0aGUgbG9jYWwgQVBJQy4KIAkgKi8KLQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDAsIEFQSUNfTFZUX01BU0tFRCB8IEFQSUNfRE1fRVhUSU5UKTsKKwlhcGljX3dyaXRlKEFQSUNfTFZUMCwgQVBJQ19MVlRfTUFTS0VEIHwgQVBJQ19ETV9FWFRJTlQpOwogCWluaXRfODI1OUEoMSk7CiAJZW5hYmxlXzgyNTlBX2lycSgwKTsKIAotCXBpbjEgPSBmaW5kX2lzYV9pcnFfcGluKDAsIG1wX0lOVCk7Ci0JcGluMiA9IGZpbmRfaXNhX2lycV9waW4oMCwgbXBfRXh0SU5UKTsKKwlwaW4xICA9IGZpbmRfaXNhX2lycV9waW4oMCwgbXBfSU5UKTsKKwlhcGljMSA9IGZpbmRfaXNhX2lycV9hcGljKDAsIG1wX0lOVCk7CisJcGluMiAgPSBpb2FwaWNfaTgyNTkucGluOworCWFwaWMyID0gaW9hcGljX2k4MjU5LmFwaWM7CiAKLQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsS0VSTl9JTkZPICIuLlRJTUVSOiB2ZWN0b3I9MHglMDJYIHBpbjE9JWQgcGluMj0lZFxuIiwgdmVjdG9yLCBwaW4xLCBwaW4yKTsKKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsS0VSTl9JTkZPICIuLlRJTUVSOiB2ZWN0b3I9MHglMDJYIGFwaWMxPSVkIHBpbjE9JWQgYXBpYzI9JWQgcGluMj0lZFxuIiwKKwkJdmVjdG9yLCBhcGljMSwgcGluMSwgYXBpYzIsIHBpbjIpOwogCiAJaWYgKHBpbjEgIT0gLTEpIHsKIAkJLyoKQEAgLTE3MjksMTcgKzE3OTcsMjAgQEAKIAkJCQljbGVhcl9JT19BUElDX3BpbigwLCBwaW4xKTsKIAkJCXJldHVybjsKIAkJfQotCQljbGVhcl9JT19BUElDX3BpbigwLCBwaW4xKTsKLQkJYXBpY19wcmludGsoQVBJQ19RVUlFVCxLRVJOX0VSUiAiLi5NUC1CSU9TIGJ1ZzogODI1NCB0aW1lciBub3QgY29ubmVjdGVkIHRvIElPLUFQSUNcbiIpOworCQljbGVhcl9JT19BUElDX3BpbihhcGljMSwgcGluMSk7CisJCWFwaWNfcHJpbnRrKEFQSUNfUVVJRVQsS0VSTl9FUlIgIi4uTVAtQklPUyBidWc6IDgyNTQgdGltZXIgbm90ICIKKwkJCQkiY29ubmVjdGVkIHRvIElPLUFQSUNcbiIpOwogCX0KIAotCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSxLRVJOX0lORk8gIi4uLnRyeWluZyB0byBzZXQgdXAgdGltZXIgKElSUTApIHRocm91Z2ggdGhlIDgyNTlBIC4uLiAiKTsKKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsS0VSTl9JTkZPICIuLi50cnlpbmcgdG8gc2V0IHVwIHRpbWVyIChJUlEwKSAiCisJCQkJInRocm91Z2ggdGhlIDgyNTlBIC4uLiAiKTsKIAlpZiAocGluMiAhPSAtMSkgewotCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsIlxuLi4uLi4gKGZvdW5kIHBpbiAlZCkgLi4uIiwgcGluMik7CisJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwiXG4uLi4uLiAoZm91bmQgYXBpYyAlZCBwaW4gJWQpIC4uLiIsCisJCQlhcGljMiwgcGluMik7CiAJCS8qCiAJCSAqIGxlZ2FjeSBkZXZpY2VzIHNob3VsZCBiZSBjb25uZWN0ZWQgdG8gSU8gQVBJQyAjMAogCQkgKi8KLQkJc2V0dXBfRXh0SU5UX0lSUTBfcGluKHBpbjIsIHZlY3Rvcik7CisJCXNldHVwX0V4dElOVF9JUlEwX3BpbihhcGljMiwgcGluMiwgdmVjdG9yKTsKIAkJaWYgKHRpbWVyX2lycV93b3JrcygpKSB7CiAJCQlwcmludGsoIndvcmtzLlxuIik7CiAJCQlubWlfd2F0Y2hkb2dfZGVmYXVsdCgpOwpAQCAtMTc1MSw3ICsxODIyLDcgQEAKIAkJLyoKIAkJICogQ2xlYW51cCwganVzdCBpbiBjYXNlIC4uLgogCQkgKi8KLQkJY2xlYXJfSU9fQVBJQ19waW4oMCwgcGluMik7CisJCWNsZWFyX0lPX0FQSUNfcGluKGFwaWMyLCBwaW4yKTsKIAl9CiAJcHJpbnRrKCIgZmFpbGVkLlxuIik7CiAKQEAgLTE3NjQsMjEgKzE4MzUsMjEgQEAKIAogCWRpc2FibGVfODI1OUFfaXJxKDApOwogCWlycV9kZXNjWzBdLmhhbmRsZXIgPSAmbGFwaWNfaXJxX3R5cGU7Ci0JYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCBBUElDX0RNX0ZJWEVEIHwgdmVjdG9yKTsJLyogRml4ZWQgbW9kZSAqLworCWFwaWNfd3JpdGUoQVBJQ19MVlQwLCBBUElDX0RNX0ZJWEVEIHwgdmVjdG9yKTsJLyogRml4ZWQgbW9kZSAqLwogCWVuYWJsZV84MjU5QV9pcnEoMCk7CiAKIAlpZiAodGltZXJfaXJxX3dvcmtzKCkpIHsKIAkJYXBpY19wcmludGsoQVBJQ19RVUlFVCwgIiB3b3Jrcy5cbiIpOwogCQlyZXR1cm47CiAJfQotCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgQVBJQ19MVlRfTUFTS0VEIHwgQVBJQ19ETV9GSVhFRCB8IHZlY3Rvcik7CisJYXBpY193cml0ZShBUElDX0xWVDAsIEFQSUNfTFZUX01BU0tFRCB8IEFQSUNfRE1fRklYRUQgfCB2ZWN0b3IpOwogCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwiIGZhaWxlZC5cbiIpOwogCiAJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCBLRVJOX0lORk8gIi4uLnRyeWluZyB0byBzZXQgdXAgdGltZXIgYXMgRXh0SU5UIElSUS4uLiIpOwogCiAJaW5pdF84MjU5QSgwKTsKIAltYWtlXzgyNTlBX2lycSgwKTsKLQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDAsIEFQSUNfRE1fRVhUSU5UKTsKKwlhcGljX3dyaXRlKEFQSUNfTFZUMCwgQVBJQ19ETV9FWFRJTlQpOwogCiAJdW5sb2NrX0V4dElOVF9sb2dpYygpOwogCkBAIC0xOTU2LDcgKzIwMjcsNyBAQAogfQogCiAKLWludCBpb19hcGljX3NldF9wY2lfcm91dGluZyAoaW50IGlvYXBpYywgaW50IHBpbiwgaW50IGlycSwgaW50IGVkZ2VfbGV2ZWwsIGludCBhY3RpdmVfaGlnaF9sb3cpCitpbnQgaW9fYXBpY19zZXRfcGNpX3JvdXRpbmcgKGludCBpb2FwaWMsIGludCBwaW4sIGludCBpcnEsIGludCB0cmlnZ2VyaW5nLCBpbnQgcG9sYXJpdHkpCiB7CiAJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE5NzgsOCArMjA0OSw4IEBACiAJZW50cnkuZGVsaXZlcnlfbW9kZSA9IElOVF9ERUxJVkVSWV9NT0RFOwogCWVudHJ5LmRlc3RfbW9kZSA9IElOVF9ERVNUX01PREU7CiAJZW50cnkuZGVzdC5sb2dpY2FsLmxvZ2ljYWxfZGVzdCA9IGNwdV9tYXNrX3RvX2FwaWNpZChUQVJHRVRfQ1BVUyk7Ci0JZW50cnkudHJpZ2dlciA9IGVkZ2VfbGV2ZWw7Ci0JZW50cnkucG9sYXJpdHkgPSBhY3RpdmVfaGlnaF9sb3c7CisJZW50cnkudHJpZ2dlciA9IHRyaWdnZXJpbmc7CisJZW50cnkucG9sYXJpdHkgPSBwb2xhcml0eTsKIAllbnRyeS5tYXNrID0gMTsJCQkJCSAvKiBEaXNhYmxlZCAobWFza2VkKSAqLwogCiAJaXJxID0gZ3NpX2lycV9zaGFyaW5nKGlycSk7CkBAIC0xOTk0LDkgKzIwNjUsOSBAQAogCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSxLRVJOX0RFQlVHICJJT0FQSUNbJWRdOiBTZXQgUENJIHJvdXRpbmcgZW50cnkgKCVkLSVkIC0+IDB4JXggLT4gIgogCQkiSVJRICVkIE1vZGU6JWkgQWN0aXZlOiVpKVxuIiwgaW9hcGljLCAKIAkgICAgICAgbXBfaW9hcGljc1tpb2FwaWNdLm1wY19hcGljaWQsIHBpbiwgZW50cnkudmVjdG9yLCBpcnEsCi0JICAgICAgIGVkZ2VfbGV2ZWwsIGFjdGl2ZV9oaWdoX2xvdyk7CisJICAgICAgIHRyaWdnZXJpbmcsIHBvbGFyaXR5KTsKIAotCWlvYXBpY19yZWdpc3Rlcl9pbnRyKGlycSwgZW50cnkudmVjdG9yLCBlZGdlX2xldmVsKTsKKwlpb2FwaWNfcmVnaXN0ZXJfaW50cihpcnEsIGVudHJ5LnZlY3RvciwgdHJpZ2dlcmluZyk7CiAKIAlpZiAoIWlvYXBpYyAmJiAoaXJxIDwgMTYpKQogCQlkaXNhYmxlXzgyNTlBX2lycShpcnEpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2lvcG9ydC5jIGIvYXJjaC94ODZfNjQva2VybmVsL2lvcG9ydC5jCmluZGV4IGNkZTBlODYuLmI4MTYxNDkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9pb3BvcnQuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaW9wb3J0LmMKQEAgLTcsNiArNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvaXJxLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaXJxLmMKaW5kZXggZDZhMDRhOC4uMzBkMmExZSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2lycS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9pcnEuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW9fYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9pZGxlLmg+CiAKIGF0b21pY190IGlycV9lcnJfY291bnQ7CiAjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCkBAIC02OSwxMyArNzAsMTMgQEAKIAkJc2VxX3ByaW50ZihwLCAiTk1JOiAiKTsKIAkJZm9yIChqID0gMDsgaiA8IE5SX0NQVVM7IGorKykKIAkJCWlmIChjcHVfb25saW5lKGopKQotCQkJCXNlcV9wcmludGYocCwgIiUxMHUgIiwgY3B1X3BkYVtqXS5fX25taV9jb3VudCk7CisJCQkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBjcHVfcGRhKGopLT5fX25taV9jb3VudCk7CiAJCXNlcV9wdXRjKHAsICdcbicpOwogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwogCQlzZXFfcHJpbnRmKHAsICJMT0M6ICIpOwogCQlmb3IgKGogPSAwOyBqIDwgTlJfQ1BVUzsgaisrKQogCQkJaWYgKGNwdV9vbmxpbmUoaikpCi0JCQkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBjcHVfcGRhW2pdLmFwaWNfdGltZXJfaXJxcyk7CisJCQkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBjcHVfcGRhKGopLT5hcGljX3RpbWVyX2lycXMpOwogCQlzZXFfcHV0YyhwLCAnXG4nKTsKICNlbmRpZgogCQlzZXFfcHJpbnRmKHAsICJFUlI6ICUxMHVcbiIsIGF0b21pY19yZWFkKCZpcnFfZXJyX2NvdW50KSk7CkBAIC05OCw2ICs5OSw3IEBACiAJLyogaGlnaCBiaXRzIHVzZWQgaW4gcmV0X2Zyb21fIGNvZGUgICovCiAJdW5zaWduZWQgaXJxID0gcmVncy0+b3JpZ19yYXggJiAweGZmOwogCisJZXhpdF9pZGxlKCk7CiAJaXJxX2VudGVyKCk7CiAKIAlfX2RvX0lSUShpcnEsIHJlZ3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2twcm9iZXMuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggYWZlMTFmNC4uOGI4NjZhOCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwva3Byb2Jlcy5jCkBAIC00Miw4ICs0Miw4IEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20va2RlYnVnLmg+CiAKLXN0YXRpYyBERUNMQVJFX01VVEVYKGtwcm9iZV9tdXRleCk7CiB2b2lkIGpwcm9iZV9yZXR1cm5fZW5kKHZvaWQpOworc3RhdGljIHZvaWQgX19rcHJvYmVzIGFyY2hfY29weV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCk7CiAKIERFRklORV9QRVJfQ1BVKHN0cnVjdCBrcHJvYmUgKiwgY3VycmVudF9rcHJvYmUpID0gTlVMTDsKIERFRklORV9QRVJfQ1BVKHN0cnVjdCBrcHJvYmVfY3RsYmxrLCBrcHJvYmVfY3RsYmxrKTsKQEAgLTY5LDEyICs2OSwxMSBAQAogaW50IF9fa3Byb2JlcyBhcmNoX3ByZXBhcmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJLyogaW5zbjogbXVzdCBiZSBvbiBzcGVjaWFsIGV4ZWN1dGFibGUgcGFnZSBvbiB4ODZfNjQuICovCi0JZG93bigma3Byb2JlX211dGV4KTsKIAlwLT5haW5zbi5pbnNuID0gZ2V0X2luc25fc2xvdCgpOwotCXVwKCZrcHJvYmVfbXV0ZXgpOwogCWlmICghcC0+YWluc24uaW5zbikgewogCQlyZXR1cm4gLUVOT01FTTsKIAl9CisJYXJjaF9jb3B5X2twcm9iZShwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTgxLDcgKzE4MCw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgX19rcHJvYmVzIGFyY2hfY29weV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcyBhcmNoX2NvcHlfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJczMyICpyaXBkaXNwOwogCW1lbWNweShwLT5haW5zbi5pbnNuLCBwLT5hZGRyLCBNQVhfSU5TTl9TSVpFKTsKQEAgLTMzNSw2ICszMzQsMTUgQEAKIAkJCQlyZXR1cm4gMTsKIAkJCX0KIAkJfSBlbHNlIHsKKwkJCWlmICgqYWRkciAhPSBCUkVBS1BPSU5UX0lOU1RSVUNUSU9OKSB7CisJCQkvKiBUaGUgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiB3YXMgcmVtb3ZlZCBieQorCQkJICogYW5vdGhlciBjcHUgcmlnaHQgYWZ0ZXIgd2UgaGl0LCBubyBmdXJ0aGVyCisJCQkgKiBoYW5kbGluZyBvZiB0aGlzIGludGVycnVwdCBpcyBhcHByb3ByaWF0ZQorCQkJICovCisJCQkJcmVncy0+cmlwID0gKHVuc2lnbmVkIGxvbmcpYWRkcjsKKwkJCQlyZXQgPSAxOworCQkJCWdvdG8gbm9fa3Byb2JlOworCQkJfQogCQkJcCA9IF9fZ2V0X2NwdV92YXIoY3VycmVudF9rcHJvYmUpOwogCQkJaWYgKHAtPmJyZWFrX2hhbmRsZXIgJiYgcC0+YnJlYWtfaGFuZGxlcihwLCByZWdzKSkgewogCQkJCWdvdG8gc3NfcHJvYmU7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvbWNlLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvbWNlLmMKaW5kZXggMTgzZGM2MS4uMTNhMmVhZCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL21jZS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9tY2UuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgpAQCAtMjMsOSArMjQsMTAgQEAKICNpbmNsdWRlIDxhc20vbWNlLmg+CiAjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgogCiAjZGVmaW5lIE1JU0NfTUNFTE9HX01JTk9SIDIyNwotI2RlZmluZSBOUl9CQU5LUyA1CisjZGVmaW5lIE5SX0JBTktTIDYKIAogc3RhdGljIGludCBtY2VfZG9udF9pbml0OwogCkBAIC05MSw2ICs5Myw3IEBACiBzdGF0aWMgdm9pZCBwcmludF9tY2Uoc3RydWN0IG1jZSAqbSkKIHsKIAlwcmludGsoS0VSTl9FTUVSRyAiXG4iCisJICAgICAgIEtFUk5fRU1FUkcgIkhBUkRXQVJFIEVSUk9SXG4iCiAJICAgICAgIEtFUk5fRU1FUkcKIAkgICAgICAgIkNQVSAlZDogTWFjaGluZSBDaGVjayBFeGNlcHRpb246ICUxNkx4IEJhbmsgJWQ6ICUwMTZMeFxuIiwKIAkgICAgICAgbS0+Y3B1LCBtLT5tY2dzdGF0dXMsIG0tPmJhbmssIG0tPnN0YXR1cyk7CkBAIC0xMDksNiArMTEyLDkgQEAKIAlpZiAobS0+bWlzYykKIAkJcHJpbnRrKCJNSVNDICVMeCAiLCBtLT5taXNjKTsgCQogCXByaW50aygiXG4iKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiVGhpcyBpcyBub3QgYSBzb2Z0d2FyZSBwcm9ibGVtIVxuIik7CisgICAgICAgIHByaW50ayhLRVJOX0VNRVJHCisgICAgIlJ1biB0aHJvdWdoIG1jZWxvZyAtLWFzY2lpIHRvIGRlY29kZSBhbmQgY29udGFjdCB5b3VyIGhhcmR3YXJlIHZlbmRvclxuIik7CiB9CiAKIHN0YXRpYyB2b2lkIG1jZV9wYW5pYyhjaGFyICptc2csIHN0cnVjdCBtY2UgKmJhY2t1cCwgdW5zaWduZWQgbG9uZyBzdGFydCkKQEAgLTE2OCwxMiArMTc0LDEyIEBACiAJaW50IHBhbmljbV9mb3VuZCA9IDA7CiAKIAlpZiAocmVncykKLQkJbm90aWZ5X2RpZShESUVfTk1JLCAibWFjaGluZSBjaGVjayIsIHJlZ3MsIGVycm9yX2NvZGUsIDI1NSwgU0lHS0lMTCk7CisJCW5vdGlmeV9kaWUoRElFX05NSSwgIm1hY2hpbmUgY2hlY2siLCByZWdzLCBlcnJvcl9jb2RlLCAxOCwgU0lHS0lMTCk7CiAJaWYgKCFiYW5rcykKIAkJcmV0dXJuOwogCiAJbWVtc2V0KCZtLCAwLCBzaXplb2Yoc3RydWN0IG1jZSkpOwotCW0uY3B1ID0gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7CisJbS5jcHUgPSBzYWZlX3NtcF9wcm9jZXNzb3JfaWQoKTsKIAlyZG1zcmwoTVNSX0lBMzJfTUNHX1NUQVRVUywgbS5tY2dzdGF0dXMpOwogCWlmICghKG0ubWNnc3RhdHVzICYgTUNHX1NUQVRVU19SSVBWKSkKIAkJa2lsbF9pdCA9IDE7CkBAIC01NzMsNiArNTc5LDEwIEBACiBBQ0NFU1NPUihiYW5rMmN0bCxiYW5rWzJdLG1jZV9yZXN0YXJ0KCkpCiBBQ0NFU1NPUihiYW5rM2N0bCxiYW5rWzNdLG1jZV9yZXN0YXJ0KCkpCiBBQ0NFU1NPUihiYW5rNGN0bCxiYW5rWzRdLG1jZV9yZXN0YXJ0KCkpCitBQ0NFU1NPUihiYW5rNWN0bCxiYW5rWzVdLG1jZV9yZXN0YXJ0KCkpCitzdGF0aWMgc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKiBiYW5rX2F0dHJpYnV0ZXNbTlJfQkFOS1NdID0geworCSZhdHRyX2JhbmswY3RsLCAmYXR0cl9iYW5rMWN0bCwgJmF0dHJfYmFuazJjdGwsCisJJmF0dHJfYmFuazNjdGwsICZhdHRyX2Jhbms0Y3RsLCAmYXR0cl9iYW5rNWN0bH07CiBBQ0NFU1NPUih0b2xlcmFudCx0b2xlcmFudCwpCiBBQ0NFU1NPUihjaGVja19pbnRlcnZhbCxjaGVja19pbnRlcnZhbCxtY2VfcmVzdGFydCgpKQogCkBAIC01ODAsNiArNTkwLDcgQEAKIHN0YXRpYyBfX2NwdWluaXQgaW50IG1jZV9jcmVhdGVfZGV2aWNlKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJaW50IGVycjsKKwlpbnQgaTsKIAlpZiAoIW1jZV9hdmFpbGFibGUoJmNwdV9kYXRhW2NwdV0pKQogCQlyZXR1cm4gLUVJTzsKIApAQCAtNTg5LDExICs2MDAsOSBAQAogCWVyciA9IHN5c2Rldl9yZWdpc3RlcigmcGVyX2NwdShkZXZpY2VfbWNlLGNwdSkpOwogCiAJaWYgKCFlcnIpIHsKLQkJc3lzZGV2X2NyZWF0ZV9maWxlKCZwZXJfY3B1KGRldmljZV9tY2UsY3B1KSwgJmF0dHJfYmFuazBjdGwpOwotCQlzeXNkZXZfY3JlYXRlX2ZpbGUoJnBlcl9jcHUoZGV2aWNlX21jZSxjcHUpLCAmYXR0cl9iYW5rMWN0bCk7Ci0JCXN5c2Rldl9jcmVhdGVfZmlsZSgmcGVyX2NwdShkZXZpY2VfbWNlLGNwdSksICZhdHRyX2JhbmsyY3RsKTsKLQkJc3lzZGV2X2NyZWF0ZV9maWxlKCZwZXJfY3B1KGRldmljZV9tY2UsY3B1KSwgJmF0dHJfYmFuazNjdGwpOwotCQlzeXNkZXZfY3JlYXRlX2ZpbGUoJnBlcl9jcHUoZGV2aWNlX21jZSxjcHUpLCAmYXR0cl9iYW5rNGN0bCk7CisJCWZvciAoaSA9IDA7IGkgPCBiYW5rczsgaSsrKQorCQkJc3lzZGV2X2NyZWF0ZV9maWxlKCZwZXJfY3B1KGRldmljZV9tY2UsY3B1KSwKKwkJCQliYW5rX2F0dHJpYnV0ZXNbaV0pOwogCQlzeXNkZXZfY3JlYXRlX2ZpbGUoJnBlcl9jcHUoZGV2aWNlX21jZSxjcHUpLCAmYXR0cl90b2xlcmFudCk7CiAJCXN5c2Rldl9jcmVhdGVfZmlsZSgmcGVyX2NwdShkZXZpY2VfbWNlLGNwdSksICZhdHRyX2NoZWNrX2ludGVydmFsKTsKIAl9CkBAIC02MDMsMTEgKzYxMiwxMSBAQAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogc3RhdGljIF9fY3B1aW5pdCB2b2lkIG1jZV9yZW1vdmVfZGV2aWNlKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0Jc3lzZGV2X3JlbW92ZV9maWxlKCZwZXJfY3B1KGRldmljZV9tY2UsY3B1KSwgJmF0dHJfYmFuazBjdGwpOwotCXN5c2Rldl9yZW1vdmVfZmlsZSgmcGVyX2NwdShkZXZpY2VfbWNlLGNwdSksICZhdHRyX2JhbmsxY3RsKTsKLQlzeXNkZXZfcmVtb3ZlX2ZpbGUoJnBlcl9jcHUoZGV2aWNlX21jZSxjcHUpLCAmYXR0cl9iYW5rMmN0bCk7Ci0Jc3lzZGV2X3JlbW92ZV9maWxlKCZwZXJfY3B1KGRldmljZV9tY2UsY3B1KSwgJmF0dHJfYmFuazNjdGwpOwotCXN5c2Rldl9yZW1vdmVfZmlsZSgmcGVyX2NwdShkZXZpY2VfbWNlLGNwdSksICZhdHRyX2Jhbms0Y3RsKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBiYW5rczsgaSsrKQorCQlzeXNkZXZfcmVtb3ZlX2ZpbGUoJnBlcl9jcHUoZGV2aWNlX21jZSxjcHUpLAorCQkJYmFua19hdHRyaWJ1dGVzW2ldKTsKIAlzeXNkZXZfcmVtb3ZlX2ZpbGUoJnBlcl9jcHUoZGV2aWNlX21jZSxjcHUpLCAmYXR0cl90b2xlcmFudCk7CiAJc3lzZGV2X3JlbW92ZV9maWxlKCZwZXJfY3B1KGRldmljZV9tY2UsY3B1KSwgJmF0dHJfY2hlY2tfaW50ZXJ2YWwpOwogCXN5c2Rldl91bnJlZ2lzdGVyKCZwZXJfY3B1KGRldmljZV9tY2UsY3B1KSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvbWNlX2FtZC5jIGIvYXJjaC94ODZfNjQva2VybmVsL21jZV9hbWQuYwppbmRleCAxZjc2MTc1Li5kM2FkN2Q4IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvbWNlX2FtZC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9tY2VfYW1kLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxhc20vbWNlLmg+CiAjaW5jbHVkZSA8YXNtL21zci5oPgogI2luY2x1ZGUgPGFzbS9wZXJjcHUuaD4KKyNpbmNsdWRlIDxhc20vaWRsZS5oPgogCiAjZGVmaW5lIFBGWCAibWNlX3RocmVzaG9sZDogIgogI2RlZmluZSBWRVJTSU9OICJ2ZXJzaW9uIDEuMDAuOSIKQEAgLTE0MCw2ICsxNDEsNyBAQAogCXN0cnVjdCBtY2UgbTsKIAogCWFja19BUElDX2lycSgpOworCWV4aXRfaWRsZSgpOwogCWlycV9lbnRlcigpOwogCiAJbWVtc2V0KCZtLCAwLCBzaXplb2YobSkpOwpAQCAtMzE4LDcgKzMyMCw3IEBACiBzdGF0aWMgX19jcHVpbml0IGludCB0aHJlc2hvbGRfY3JlYXRlX2JhbmsodW5zaWduZWQgaW50IGNwdSwgaW50IGJhbmspCiB7CiAJaW50IGVyciA9IDA7Ci0Jc3RydWN0IHRocmVzaG9sZF9iYW5rICpiID0gMDsKKwlzdHJ1Y3QgdGhyZXNob2xkX2JhbmsgKmIgPSBOVUxMOwogCiAjaWZkZWYgQ09ORklHX1NNUAogCWlmIChjcHVfY29yZV9pZFtjcHVdICYmIHNoYXJlZF9iYW5rW2JhbmtdKSB7CS8qIHN5bWxpbmsgKi8KQEAgLTQwNyw3ICs0MDksNyBAQAogCWlmIChzaGFyZWRfYmFua1tiYW5rXSAmJiBhdG9taWNfcmVhZCgmYi0+a29iai5rcmVmLnJlZmNvdW50KSA+IDIpIHsKIAkJc3ByaW50ZihuYW1lLCAiYmFuayVpIiwgYmFuayk7CiAJCXN5c2ZzX3JlbW92ZV9saW5rKCZwZXJfY3B1KGRldmljZV90aHJlc2hvbGQsIGNwdSkua29iaiwgbmFtZSk7Ci0JCXBlcl9jcHUodGhyZXNob2xkX2JhbmtzLCBjcHUpW2JhbmtdID0gMDsKKwkJcGVyX2NwdSh0aHJlc2hvbGRfYmFua3MsIGNwdSlbYmFua10gPSBOVUxMOwogCX0gZWxzZSB7CiAJCWtvYmplY3RfdW5yZWdpc3RlcigmYi0+a29iaik7CiAJCWtmcmVlKHBlcl9jcHUodGhyZXNob2xkX2JhbmtzLCBjcHUpW2JhbmtdKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9tY2VfaW50ZWwuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9tY2VfaW50ZWwuYwppbmRleCAwYmUwYTc5Li44ZjUzM2QyIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvbWNlX2ludGVsLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL21jZV9pbnRlbC5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8YXNtL21zci5oPgogI2luY2x1ZGUgPGFzbS9tY2UuaD4KICNpbmNsdWRlIDxhc20vaHdfaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lkbGUuaD4KIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIG5leHRfY2hlY2spOwogCkBAIC0xOSw2ICsyMCw3IEBACiAKIAlhY2tfQVBJQ19pcnEoKTsKIAorCWV4aXRfaWRsZSgpOwogCWlycV9lbnRlcigpOwogCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBfX2dldF9jcHVfdmFyKG5leHRfY2hlY2spKSkKIAkJZ290byBkb25lOwpAQCAtNzgsNyArODAsNyBAQAogCiAJaCA9IFRIRVJNQUxfQVBJQ19WRUNUT1I7CiAJaCB8PSAoQVBJQ19ETV9GSVhFRCB8IEFQSUNfTFZUX01BU0tFRCk7Ci0JYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRUSE1SLCBoKTsKKwlhcGljX3dyaXRlKEFQSUNfTFZUVEhNUiwgaCk7CiAKIAlyZG1zcihNU1JfSUEzMl9USEVSTV9JTlRFUlJVUFQsIGwsIGgpOwogCXdybXNyKE1TUl9JQTMyX1RIRVJNX0lOVEVSUlVQVCwgbCB8IDB4MDMsIGgpOwpAQCAtODcsNyArODksNyBAQAogCXdybXNyKE1TUl9JQTMyX01JU0NfRU5BQkxFLCBsIHwgKDEgPDwgMyksIGgpOwogCiAJbCA9IGFwaWNfcmVhZChBUElDX0xWVFRITVIpOwotCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUVEhNUiwgbCAmIH5BUElDX0xWVF9NQVNLRUQpOworCWFwaWNfd3JpdGUoQVBJQ19MVlRUSE1SLCBsICYgfkFQSUNfTFZUX01BU0tFRCk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVJWQ6IFRoZXJtYWwgbW9uaXRvcmluZyBlbmFibGVkICglcylcbiIsCiAJCWNwdSwgdG0yID8gIlRNMiIgOiAiVE0xIik7CiAJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL21wcGFyc2UuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9tcHBhcnNlLmMKaW5kZXggMTEwNTI1MC4uZGM0OWJmYiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL21wcGFyc2UuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvbXBwYXJzZS5jCkBAIC05MTUsNyArOTE1LDcgQEAKIAogI2RlZmluZSBNQVhfR1NJX05VTQk0MDk2CiAKLWludCBtcF9yZWdpc3Rlcl9nc2kodTMyIGdzaSwgaW50IGVkZ2VfbGV2ZWwsIGludCBhY3RpdmVfaGlnaF9sb3cpCitpbnQgbXBfcmVnaXN0ZXJfZ3NpKHUzMiBnc2ksIGludCB0cmlnZ2VyaW5nLCBpbnQgcG9sYXJpdHkpCiB7CiAJaW50CQkJaW9hcGljID0gLTE7CiAJaW50CQkJaW9hcGljX3BpbiA9IDA7CkBAIC05NjQsNyArOTY0LDcgQEAKIAogCW1wX2lvYXBpY19yb3V0aW5nW2lvYXBpY10ucGluX3Byb2dyYW1tZWRbaWR4XSB8PSAoMTw8Yml0KTsKIAotCWlmIChlZGdlX2xldmVsKSB7CisJaWYgKHRyaWdnZXJpbmcgPT0gQUNQSV9MRVZFTF9TRU5TSVRJVkUpIHsKIAkJLyoKIAkJICogRm9yIFBDSSBkZXZpY2VzIGFzc2lnbiBJUlFzIGluIG9yZGVyLCBhdm9pZGluZyBnYXBzCiAJCSAqIGR1ZSB0byB1bnVzZWQgSS9PIEFQSUMgcGlucy4KQEAgLTk4Niw4ICs5ODYsOCBAQAogCX0KIAogCWlvX2FwaWNfc2V0X3BjaV9yb3V0aW5nKGlvYXBpYywgaW9hcGljX3BpbiwgZ3NpLAotCQllZGdlX2xldmVsID09IEFDUElfRURHRV9TRU5TSVRJVkUgPyAwIDogMSwKLQkJYWN0aXZlX2hpZ2hfbG93ID09IEFDUElfQUNUSVZFX0hJR0ggPyAwIDogMSk7CisJCXRyaWdnZXJpbmcgPT0gQUNQSV9FREdFX1NFTlNJVElWRSA/IDAgOiAxLAorCQlwb2xhcml0eSA9PSBBQ1BJX0FDVElWRV9ISUdIID8gMCA6IDEpOwogCXJldHVybiBnc2k7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9ubWkuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9ubWkuYwppbmRleCAzOWQ0NDVlLi41ZmFlNmYwIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvbm1pLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL25taS5jCkBAIC0xNTEsMjMgKzE1MSwyNSBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyAidGVzdGluZyBOTUkgd2F0Y2hkb2cgLi4uICIpOwogCisjaWZkZWYgQ09ORklHX1NNUAogCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0xPQ0FMX0FQSUMpCiAJCXNtcF9jYWxsX2Z1bmN0aW9uKG5taV9jcHVfYnVzeSwgKHZvaWQgKikmZW5kZmxhZywgMCwgMCk7CisjZW5kaWYKIAogCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgY3B1KyspCi0JCWNvdW50c1tjcHVdID0gY3B1X3BkYVtjcHVdLl9fbm1pX2NvdW50OyAKKwkJY291bnRzW2NwdV0gPSBjcHVfcGRhKGNwdSktPl9fbm1pX2NvdW50OwogCWxvY2FsX2lycV9lbmFibGUoKTsKIAltZGVsYXkoKDEwKjEwMDApL25taV9oeik7IC8vIHdhaXQgMTAgdGlja3MKIAogCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgY3B1KyspIHsKIAkJaWYgKCFjcHVfb25saW5lKGNwdSkpCiAJCQljb250aW51ZTsKLQkJaWYgKGNwdV9wZGFbY3B1XS5fX25taV9jb3VudCAtIGNvdW50c1tjcHVdIDw9IDUpIHsKKwkJaWYgKGNwdV9wZGEoY3B1KS0+X19ubWlfY291bnQgLSBjb3VudHNbY3B1XSA8PSA1KSB7CiAJCQllbmRmbGFnID0gMTsKIAkJCXByaW50aygiQ1BVIyVkOiBOTUkgYXBwZWFycyB0byBiZSBzdHVjayAoJWQtPiVkKSFcbiIsCiAJCQkgICAgICAgY3B1LAogCQkJICAgICAgIGNvdW50c1tjcHVdLAotCQkJICAgICAgIGNwdV9wZGFbY3B1XS5fX25taV9jb3VudCk7CisJCQkgICAgICAgY3B1X3BkYShjcHUpLT5fX25taV9jb3VudCk7CiAJCQlubWlfYWN0aXZlID0gMDsKIAkJCWxhcGljX25taV9vd25lciAmPSB+TEFQSUNfTk1JX1dBVENIRE9HOwogCQkJbm1pX3BlcmZjdHJfbXNyID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktZG1hLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLWRtYS5jCmluZGV4IGNhYjQ3MWMuLjJmNWQ4MzIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktZG1hLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3BjaS1kbWEuYwpAQCAtOCw1MyArOCwyNTkgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvdG8uaD4KIAotLyogTWFwIGEgc2V0IG9mIGJ1ZmZlcnMgZGVzY3JpYmVkIGJ5IHNjYXR0ZXJsaXN0IGluIHN0cmVhbWluZwotICogbW9kZSBmb3IgRE1BLiAgVGhpcyBpcyB0aGUgc2NhdHRlci1nYXRoZXIgdmVyc2lvbiBvZiB0aGUKLSAqIGFib3ZlIHBjaV9tYXBfc2luZ2xlIGludGVyZmFjZS4gIEhlcmUgdGhlIHNjYXR0ZXIgZ2F0aGVyIGxpc3QKLSAqIGVsZW1lbnRzIGFyZSBlYWNoIHRhZ2dlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBkbWEgYWRkcmVzcwotICogYW5kIGxlbmd0aC4gIFRoZXkgYXJlIG9idGFpbmVkIHZpYSBzZ19kbWFfe2FkZHJlc3MsbGVuZ3RofShTRykuCi0gKgotICogTk9URTogQW4gaW1wbGVtZW50YXRpb24gbWF5IGJlIGFibGUgdG8gdXNlIGEgc21hbGxlciBudW1iZXIgb2YKLSAqICAgICAgIERNQSBhZGRyZXNzL2xlbmd0aCBwYWlycyB0aGFuIHRoZXJlIGFyZSBTRyB0YWJsZSBlbGVtZW50cy4KLSAqICAgICAgIChmb3IgZXhhbXBsZSB2aWEgdmlydHVhbCBtYXBwaW5nIGNhcGFiaWxpdGllcykKLSAqICAgICAgIFRoZSByb3V0aW5lIHJldHVybnMgdGhlIG51bWJlciBvZiBhZGRyL2xlbmd0aCBwYWlycyBhY3R1YWxseQotICogICAgICAgdXNlZCwgYXQgbW9zdCBuZW50cy4KLSAqCi0gKiBEZXZpY2Ugb3duZXJzaGlwIGlzc3VlcyBhcyBtZW50aW9uZWQgYWJvdmUgZm9yIHBjaV9tYXBfc2luZ2xlIGFyZQotICogdGhlIHNhbWUgaGVyZS4KLSAqLwotaW50IGRtYV9tYXBfc2coc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JICAgICAgIGludCBuZW50cywgaW50IGRpcmVjdGlvbikKK2ludCBpb21tdV9tZXJnZSBfX3JlYWRfbW9zdGx5ID0gMDsKK0VYUE9SVF9TWU1CT0woaW9tbXVfbWVyZ2UpOworCitkbWFfYWRkcl90IGJhZF9kbWFfYWRkcmVzcyBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTChiYWRfZG1hX2FkZHJlc3MpOworCisvKiBUaGlzIHRlbGxzIHRoZSBCSU8gYmxvY2sgbGF5ZXIgdG8gYXNzdW1lIG1lcmdpbmcuIERlZmF1bHQgdG8gb2ZmCisgICBiZWNhdXNlIHdlIGNhbm5vdCBndWFyYW50ZWUgbWVyZ2luZyBsYXRlci4gKi8KK2ludCBpb21tdV9iaW9fbWVyZ2UgX19yZWFkX21vc3RseSA9IDA7CitFWFBPUlRfU1lNQk9MKGlvbW11X2Jpb19tZXJnZSk7CisKK2ludCBpb21tdV9zYWNfZm9yY2UgX19yZWFkX21vc3RseSA9IDA7CitFWFBPUlRfU1lNQk9MKGlvbW11X3NhY19mb3JjZSk7CisKK2ludCBub19pb21tdSBfX3JlYWRfbW9zdGx5OworI2lmZGVmIENPTkZJR19JT01NVV9ERUJVRworaW50IHBhbmljX29uX292ZXJmbG93IF9fcmVhZF9tb3N0bHkgPSAxOworaW50IGZvcmNlX2lvbW11IF9fcmVhZF9tb3N0bHkgPSAxOworI2Vsc2UKK2ludCBwYW5pY19vbl9vdmVyZmxvdyBfX3JlYWRfbW9zdGx5ID0gMDsKK2ludCBmb3JjZV9pb21tdSBfX3JlYWRfbW9zdGx5PSAwOworI2VuZGlmCisKKy8qIER1bW15IGRldmljZSB1c2VkIGZvciBOVUxMIGFyZ3VtZW50cyAobm9ybWFsbHkgSVNBKS4gQmV0dGVyIHdvdWxkCisgICBiZSBwcm9iYWJseSBhIHNtYWxsZXIgRE1BIG1hc2ssIGJ1dCB0aGlzIGlzIGJ1Zy10by1idWcgY29tcGF0aWJsZQorICAgdG8gaTM4Ni4gKi8KK3N0cnVjdCBkZXZpY2UgZmFsbGJhY2tfZGV2ID0geworCS5idXNfaWQgPSAiZmFsbGJhY2sgZGV2aWNlIiwKKwkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmLAorCS5kbWFfbWFzayA9ICZmYWxsYmFja19kZXYuY29oZXJlbnRfZG1hX21hc2ssCit9OworCisvKiBBbGxvY2F0ZSBETUEgbWVtb3J5IG9uIG5vZGUgbmVhciBkZXZpY2UgKi8KK25vaW5saW5lIHN0YXRpYyB2b2lkICoKK2RtYV9hbGxvY19wYWdlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGdmcF90IGdmcCwgdW5zaWduZWQgb3JkZXIpCiB7Ci0JaW50IGk7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IG5vZGU7CisJaWYgKGRldi0+YnVzID09ICZwY2lfYnVzX3R5cGUpCisJCW5vZGUgPSBwY2lidXNfdG9fbm9kZSh0b19wY2lfZGV2KGRldiktPmJ1cyk7CisJZWxzZQorCQlub2RlID0gbnVtYV9ub2RlX2lkKCk7CisJcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUobm9kZSwgZ2ZwLCBvcmRlcik7CisJcmV0dXJuIHBhZ2UgPyBwYWdlX2FkZHJlc3MocGFnZSkgOiBOVUxMOworfQogCi0JQlVHX09OKGRpcmVjdGlvbiA9PSBETUFfTk9ORSk7Ci0gCWZvciAoaSA9IDA7IGkgPCBuZW50czsgaSsrICkgewotCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnMgPSAmc2dbaV07Ci0JCUJVR19PTighcy0+cGFnZSk7IAotCQlzLT5kbWFfYWRkcmVzcyA9IHZpcnRfdG9fYnVzKHBhZ2VfYWRkcmVzcyhzLT5wYWdlKSArcy0+b2Zmc2V0KTsKLQkJcy0+ZG1hX2xlbmd0aCA9IHMtPmxlbmd0aDsKKy8qCisgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgY29oZXJlbnQgbWFwcGluZy4KKyAqLwordm9pZCAqCitkbWFfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwKKwkJICAgZ2ZwX3QgZ2ZwKQoreworCXZvaWQgKm1lbW9yeTsKKwl1bnNpZ25lZCBsb25nIGRtYV9tYXNrID0gMDsKKwl1NjQgYnVzOworCisJaWYgKCFkZXYpCisJCWRldiA9ICZmYWxsYmFja19kZXY7CisJZG1hX21hc2sgPSBkZXYtPmNvaGVyZW50X2RtYV9tYXNrOworCWlmIChkbWFfbWFzayA9PSAwKQorCQlkbWFfbWFzayA9IDB4ZmZmZmZmZmY7CisKKwkvKiBLbHVkZ2UgdG8gbWFrZSBpdCBidWctdG8tYnVnIGNvbXBhdGlibGUgd2l0aCBpMzg2LiBpMzg2CisJICAgdXNlcyB0aGUgbm9ybWFsIGRtYV9tYXNrIGZvciBhbGxvY19jb2hlcmVudC4gKi8KKwlkbWFfbWFzayAmPSAqZGV2LT5kbWFfbWFzazsKKworCS8qIFdoeSA8PT8gRXZlbiB3aGVuIHRoZSBtYXNrIGlzIHNtYWxsZXIgdGhhbiA0R0IgaXQgaXMgb2Z0ZW4KKwkgICBsYXJnZXIgdGhhbiAxNk1CIGFuZCBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSBhIGNoYW5jZSBvZgorCSAgIGZpbmRpbmcgZml0dGluZyBtZW1vcnkgaW4gdGhlIG5leHQgaGlnaGVyIHpvbmUgZmlyc3QuIElmCisJICAgbm90IHJldHJ5IHdpdGggdHJ1ZSBHRlBfRE1BLiAtQUsgKi8KKwlpZiAoZG1hX21hc2sgPD0gMHhmZmZmZmZmZikKKwkJZ2ZwIHw9IEdGUF9ETUEzMjsKKworIGFnYWluOgorCW1lbW9yeSA9IGRtYV9hbGxvY19wYWdlcyhkZXYsIGdmcCwgZ2V0X29yZGVyKHNpemUpKTsKKwlpZiAobWVtb3J5ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJeworCQlpbnQgaGlnaCwgbW11OworCQlidXMgPSB2aXJ0X3RvX2J1cyhtZW1vcnkpOworCSAgICAgICAgaGlnaCA9IChidXMgKyBzaXplKSA+PSBkbWFfbWFzazsKKwkJbW11ID0gaGlnaDsKKwkJaWYgKGZvcmNlX2lvbW11ICYmICEoZ2ZwICYgR0ZQX0RNQSkpCisJCQltbXUgPSAxOworCQllbHNlIGlmIChoaWdoKSB7CisJCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKW1lbW9yeSwKKwkJCQkgICBnZXRfb3JkZXIoc2l6ZSkpOworCisJCQkvKiBEb24ndCB1c2UgdGhlIDE2TUIgWk9ORV9ETUEgdW5sZXNzIGFic29sdXRlbHkKKwkJCSAgIG5lZWRlZC4gSXQncyBiZXR0ZXIgdG8gdXNlIHJlbWFwcGluZyBmaXJzdC4gKi8KKwkJCWlmIChkbWFfbWFzayA8IDB4ZmZmZmZmZmYgJiYgIShnZnAgJiBHRlBfRE1BKSkgeworCQkJCWdmcCA9IChnZnAgJiB+R0ZQX0RNQTMyKSB8IEdGUF9ETUE7CisJCQkJZ290byBhZ2FpbjsKKwkJCX0KKworCQkJaWYgKGRtYV9vcHMtPmFsbG9jX2NvaGVyZW50KQorCQkJCXJldHVybiBkbWFfb3BzLT5hbGxvY19jb2hlcmVudChkZXYsIHNpemUsCisJCQkJCQkJICAgZG1hX2hhbmRsZSwgZ2ZwKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVtc2V0KG1lbW9yeSwgMCwgc2l6ZSk7CisJCWlmICghbW11KSB7CisJCQkqZG1hX2hhbmRsZSA9IHZpcnRfdG9fYnVzKG1lbW9yeSk7CisJCQlyZXR1cm4gbWVtb3J5OworCQl9CiAJfQotCXJldHVybiBuZW50czsKKworCWlmIChkbWFfb3BzLT5hbGxvY19jb2hlcmVudCkgeworCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKW1lbW9yeSwgZ2V0X29yZGVyKHNpemUpKTsKKwkJZ2ZwICY9IH4oR0ZQX0RNQXxHRlBfRE1BMzIpOworCQlyZXR1cm4gZG1hX29wcy0+YWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLCBkbWFfaGFuZGxlLCBnZnApOworCX0KKworCWlmIChkbWFfb3BzLT5tYXBfc2ltcGxlKSB7CisJCSpkbWFfaGFuZGxlID0gZG1hX29wcy0+bWFwX3NpbXBsZShkZXYsIG1lbW9yeSwKKwkJCQkJICAgICAgc2l6ZSwKKwkJCQkJICAgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwkJaWYgKCpkbWFfaGFuZGxlICE9IGJhZF9kbWFfYWRkcmVzcykKKwkJCXJldHVybiBtZW1vcnk7CisJfQorCisJaWYgKHBhbmljX29uX292ZXJmbG93KQorCQlwYW5pYygiZG1hX2FsbG9jX2NvaGVyZW50OiBJT01NVSBvdmVyZmxvdyBieSAlbHUgYnl0ZXNcbiIsc2l6ZSk7CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyltZW1vcnksIGdldF9vcmRlcihzaXplKSk7CisJcmV0dXJuIE5VTEw7CiB9CitFWFBPUlRfU1lNQk9MKGRtYV9hbGxvY19jb2hlcmVudCk7CiAKLUVYUE9SVF9TWU1CT0woZG1hX21hcF9zZyk7Ci0KLS8qIFVubWFwIGEgc2V0IG9mIHN0cmVhbWluZyBtb2RlIERNQSB0cmFuc2xhdGlvbnMuCi0gKiBBZ2FpbiwgY3B1IHJlYWQgcnVsZXMgY29uY2VybmluZyBjYWxscyBoZXJlIGFyZSB0aGUgc2FtZSBhcyBmb3IKLSAqIHBjaV91bm1hcF9zaW5nbGUoKSBhYm92ZS4KKy8qCisgKiBVbm1hcCBjb2hlcmVudCBtZW1vcnkuCisgKiBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgdGhlIGRldmljZSBoYXMgZmluaXNoZWQgYWNjZXNzaW5nIHRoZSBtYXBwaW5nLgogICovCi12b2lkIGRtYV91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JCSAgaW50IG5lbnRzLCBpbnQgZGlyKQordm9pZCBkbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGJ1cykKIHsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgbmVudHM7IGkrKykgeyAKLQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzID0gJnNnW2ldOwotCQlCVUdfT04ocy0+cGFnZSA9PSBOVUxMKTsgCi0JCUJVR19PTihzLT5kbWFfYWRkcmVzcyA9PSAwKTsgCi0JCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBzLT5kbWFfYWRkcmVzcywgcy0+ZG1hX2xlbmd0aCwgZGlyKTsKLQl9IAorCWlmIChkbWFfb3BzLT51bm1hcF9zaW5nbGUpCisJCWRtYV9vcHMtPnVubWFwX3NpbmdsZShkZXYsIGJ1cywgc2l6ZSwgMCk7CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl2YWRkciwgZ2V0X29yZGVyKHNpemUpKTsKIH0KK0VYUE9SVF9TWU1CT0woZG1hX2ZyZWVfY29oZXJlbnQpOwogCi1FWFBPUlRfU1lNQk9MKGRtYV91bm1hcF9zZyk7CitpbnQgZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQoreworCWlmIChkbWFfb3BzLT5kbWFfc3VwcG9ydGVkKQorCQlyZXR1cm4gZG1hX29wcy0+ZG1hX3N1cHBvcnRlZChkZXYsIG1hc2spOworCisJLyogQ29waWVkIGZyb20gaTM4Ni4gRG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UsIGJlY2F1c2UgaXQgd2lsbAorCSAgIG9ubHkgd29yayBmb3IgcGNpX2FsbG9jX2NvaGVyZW50LgorCSAgIFRoZSBjYWxsZXIganVzdCBoYXMgdG8gdXNlIEdGUF9ETUEgaW4gdGhpcyBjYXNlLiAqLworICAgICAgICBpZiAobWFzayA8IDB4MDBmZmZmZmYpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKwkvKiBUZWxsIHRoZSBkZXZpY2UgdG8gdXNlIFNBQyB3aGVuIElPTU1VIGZvcmNlIGlzIG9uLiAgVGhpcworCSAgIGFsbG93cyB0aGUgZHJpdmVyIHRvIHVzZSBjaGVhcGVyIGFjY2Vzc2VzIGluIHNvbWUgY2FzZXMuCisKKwkgICBQcm9ibGVtIHdpdGggdGhpcyBpcyB0aGF0IGlmIHdlIG92ZXJmbG93IHRoZSBJT01NVSBhcmVhIGFuZAorCSAgIHJldHVybiBEQUMgYXMgZmFsbGJhY2sgYWRkcmVzcyB0aGUgZGV2aWNlIG1heSBub3QgaGFuZGxlIGl0CisJICAgY29ycmVjdGx5LgorCisJICAgQXMgYSBzcGVjaWFsIGNhc2Ugc29tZSBjb250cm9sbGVycyBoYXZlIGEgMzliaXQgYWRkcmVzcworCSAgIG1vZGUgdGhhdCBpcyBhcyBlZmZpY2llbnQgYXMgMzJiaXQgKGFpYzc5eHgpLiBEb24ndCBmb3JjZQorCSAgIFNBQyBmb3IgdGhlc2UuICBBc3N1bWUgYWxsIG1hc2tzIDw9IDQwIGJpdHMgYXJlIG9mIHRoaXMKKwkgICB0eXBlLiBOb3JtYWxseSB0aGlzIGRvZXNuJ3QgbWFrZSBhbnkgZGlmZmVyZW5jZSwgYnV0IGdpdmVzCisJICAgbW9yZSBnZW50bGUgaGFuZGxpbmcgb2YgSU9NTVUgb3ZlcmZsb3cuICovCisJaWYgKGlvbW11X3NhY19mb3JjZSAmJiAobWFzayA+PSAweGZmZmZmZmZmZmZVTEwpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGb3JjZSBTQUMgd2l0aCBtYXNrICVMeFxuIiwgZGV2LT5idXNfaWQsbWFzayk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTChkbWFfc3VwcG9ydGVkKTsKKworaW50IGRtYV9zZXRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQoreworCWlmICghZGV2LT5kbWFfbWFzayB8fCAhZG1hX3N1cHBvcnRlZChkZXYsIG1hc2spKQorCQlyZXR1cm4gLUVJTzsKKwkqZGV2LT5kbWFfbWFzayA9IG1hc2s7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9zZXRfbWFzayk7CisKKy8qIGlvbW11PVtzaXplXVssbm9hZ3BdWyxvZmZdWyxmb3JjZV1bLG5vZm9yY2VdWyxsZWFrXVssbWVtYXBlcls9b3JkZXJdXVssbWVyZ2VdCisgICAgICAgICBbLGZvcmNlc2FjXVssZnVsbGZsdXNoXVssbm9tZXJnZV1bLGJpb21lcmdlXQorICAgc2l6ZSAgc2V0IHNpemUgb2YgaW9tbXUgKGluIGJ5dGVzKQorICAgbm9hZ3AgZG9uJ3QgaW5pdGlhbGl6ZSB0aGUgQUdQIGRyaXZlciBhbmQgdXNlIGZ1bGwgYXBlcnR1cmUuCisgICBvZmYgICBkb24ndCB1c2UgdGhlIElPTU1VCisgICBsZWFrICB0dXJuIG9uIHNpbXBsZSBpb21tdSBsZWFrIHRyYWNpbmcgKG9ubHkgd2hlbiBDT05GSUdfSU9NTVVfTEVBSyBpcyBvbikKKyAgIG1lbWFwZXJbPW9yZGVyXSBhbGxvY2F0ZSBhbiBvd24gYXBlcnR1cmUgb3ZlciBSQU0gd2l0aCBzaXplIDMyTUJeb3JkZXIuCisgICBub2ZvcmNlIGRvbid0IGZvcmNlIElPTU1VIHVzYWdlLiBEZWZhdWx0LgorICAgZm9yY2UgIEZvcmNlIElPTU1VLgorICAgbWVyZ2UgIERvIGxhenkgbWVyZ2luZy4gVGhpcyBtYXkgaW1wcm92ZSBwZXJmb3JtYW5jZSBvbiBzb21lIGJsb2NrIGRldmljZXMuCisgICAgICAgICAgSW1wbGllcyBmb3JjZSAoZXhwZXJpbWVudGFsKQorICAgYmlvbWVyZ2UgRG8gbWVyZ2luZyBhdCB0aGUgQklPIGxheWVyLiBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gbWVyZ2UsCisgICAgICAgICAgICBidXQgc2hvdWxkIGJlIG9ubHkgZG9uZSB3aXRoIHZlcnkgYmlnIElPTU1Vcy4gSW1wbGllcyBtZXJnZSxmb3JjZS4KKyAgIG5vbWVyZ2UgRG9uJ3QgZG8gU0cgbWVyZ2luZy4KKyAgIGZvcmNlc2FjIEZvciBTQUMgbW9kZSBmb3IgbWFza3MgPDQwYml0cyAgKGV4cGVyaW1lbnRhbCkKKyAgIGZ1bGxmbHVzaCBGbHVzaCBJT01NVSBvbiBlYWNoIGFsbG9jYXRpb24gKGRlZmF1bHQpCisgICBub2Z1bGxmbHVzaCBEb24ndCB1c2UgSU9NTVUgZnVsbGZsdXNoCisgICBhbGxvd2VkICBvdmVyd3JpdGUgaW9tbXUgb2ZmIHdvcmthcm91bmRzIGZvciBzcGVjaWZpYyBjaGlwc2V0cy4KKyAgIHNvZnQJIFVzZSBzb2Z0d2FyZSBib3VuY2UgYnVmZmVyaW5nIChkZWZhdWx0IGZvciBJbnRlbCBtYWNoaW5lcykKKyAgIG5vYXBlcnR1cmUgRG9uJ3QgdG91Y2ggdGhlIGFwZXJ0dXJlIGZvciBBR1AuCisqLworX19pbml0IGludCBpb21tdV9zZXR1cChjaGFyICpwKQoreworICAgIGlvbW11X21lcmdlID0gMTsKKworICAgIHdoaWxlICgqcCkgeworCSAgICBpZiAoIXN0cm5jbXAocCwib2ZmIiwzKSkKKwkJICAgIG5vX2lvbW11ID0gMTsKKwkgICAgLyogZ2FydF9wYXJzZV9vcHRpb25zIGhhcyBtb3JlIGZvcmNlIHN1cHBvcnQgKi8KKwkgICAgaWYgKCFzdHJuY21wKHAsImZvcmNlIiw1KSkKKwkJICAgIGZvcmNlX2lvbW11ID0gMTsKKwkgICAgaWYgKCFzdHJuY21wKHAsIm5vZm9yY2UiLDcpKSB7CisJCSAgICBpb21tdV9tZXJnZSA9IDA7CisJCSAgICBmb3JjZV9pb21tdSA9IDA7CisJICAgIH0KKworCSAgICBpZiAoIXN0cm5jbXAocCwgImJpb21lcmdlIiw4KSkgeworCQkgICAgaW9tbXVfYmlvX21lcmdlID0gNDA5NjsKKwkJICAgIGlvbW11X21lcmdlID0gMTsKKwkJICAgIGZvcmNlX2lvbW11ID0gMTsKKwkgICAgfQorCSAgICBpZiAoIXN0cm5jbXAocCwgInBhbmljIiw1KSkKKwkJICAgIHBhbmljX29uX292ZXJmbG93ID0gMTsKKwkgICAgaWYgKCFzdHJuY21wKHAsICJub3BhbmljIiw3KSkKKwkJICAgIHBhbmljX29uX292ZXJmbG93ID0gMDsKKwkgICAgaWYgKCFzdHJuY21wKHAsICJtZXJnZSIsNSkpIHsKKwkJICAgIGlvbW11X21lcmdlID0gMTsKKwkJICAgIGZvcmNlX2lvbW11ID0gMTsKKwkgICAgfQorCSAgICBpZiAoIXN0cm5jbXAocCwgIm5vbWVyZ2UiLDcpKQorCQkgICAgaW9tbXVfbWVyZ2UgPSAwOworCSAgICBpZiAoIXN0cm5jbXAocCwgImZvcmNlc2FjIiw4KSkKKwkJICAgIGlvbW11X3NhY19mb3JjZSA9IDE7CisKKyNpZmRlZiBDT05GSUdfU1dJT1RMQgorCSAgICBpZiAoIXN0cm5jbXAocCwgInNvZnQiLDQpKQorCQkgICAgc3dpb3RsYiA9IDE7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19HQVJUX0lPTU1VCisJICAgIGdhcnRfcGFyc2Vfb3B0aW9ucyhwKTsKKyNlbmRpZgorCisJICAgIHAgKz0gc3RyY3NwbihwLCAiLCIpOworCSAgICBpZiAoKnAgPT0gJywnKQorCQkgICAgKytwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktZ2FydC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3BjaS1nYXJ0LmMKaW5kZXggMmUyOGU4NS4uYzM3ZmM3NyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3BjaS1nYXJ0LmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3BjaS1nYXJ0LmMKQEAgLTMwLDggKzMwLDggQEAKICNpbmNsdWRlIDxhc20vcHJvdG8uaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KLQotZG1hX2FkZHJfdCBiYWRfZG1hX2FkZHJlc3M7CisjaW5jbHVkZSA8YXNtL3N3aW90bGIuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CiAKIHVuc2lnbmVkIGxvbmcgaW9tbXVfYnVzX2Jhc2U7CS8qIEdBUlQgcmVtYXBwaW5nIGFyZWEgKHBoeXNpY2FsKSAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaW9tbXVfc2l6ZTsgCS8qIHNpemUgb2YgcmVtYXBwaW5nIGFyZWEgYnl0ZXMgKi8KQEAgLTM5LDE4ICszOSw2IEBACiAKIHUzMiAqaW9tbXVfZ2F0dF9iYXNlOyAJCS8qIFJlbWFwcGluZyB0YWJsZSAqLwogCi1pbnQgbm9faW9tbXU7IAotc3RhdGljIGludCBub19hZ3A7IAotI2lmZGVmIENPTkZJR19JT01NVV9ERUJVRwotaW50IHBhbmljX29uX292ZXJmbG93ID0gMTsgCi1pbnQgZm9yY2VfaW9tbXUgPSAxOwotI2Vsc2UKLWludCBwYW5pY19vbl9vdmVyZmxvdyA9IDA7Ci1pbnQgZm9yY2VfaW9tbXUgPSAwOwotI2VuZGlmCi1pbnQgaW9tbXVfbWVyZ2UgPSAxOwotaW50IGlvbW11X3NhY19mb3JjZSA9IDA7IAotCiAvKiBJZiB0aGlzIGlzIGRpc2FibGVkIHRoZSBJT01NVSB3aWxsIHVzZSBhbiBvcHRpbWl6ZWQgZmx1c2hpbmcgc3RyYXRlZ3kKICAgIG9mIG9ubHkgZmx1c2hpbmcgd2hlbiBhbiBtYXBwaW5nIGlzIHJldXNlZC4gV2l0aCBpdCB0cnVlIHRoZSBHQVJUIGlzIGZsdXNoZWQgCiAgICBmb3IgZXZlcnkgbWFwcGluZy4gUHJvYmxlbSBpcyB0aGF0IGRvaW5nIHRoZSBsYXp5IGZsdXNoIHNlZW1zIHRvIHRyaWdnZXIKQEAgLTU4LDEwICs0Niw2IEBACiAgICBhbHNvIHNlZW4gd2l0aCBRbG9naWMgYXQgbGVhc3QpLiAqLwogaW50IGlvbW11X2Z1bGxmbHVzaCA9IDE7CiAKLS8qIFRoaXMgdGVsbHMgdGhlIEJJTyBibG9jayBsYXllciB0byBhc3N1bWUgbWVyZ2luZy4gRGVmYXVsdCB0byBvZmYKLSAgIGJlY2F1c2Ugd2UgY2Fubm90IGd1YXJhbnRlZSBtZXJnaW5nIGxhdGVyLiAqLwotaW50IGlvbW11X2Jpb19tZXJnZSA9IDA7Ci0KICNkZWZpbmUgTUFYX05CIDgKIAogLyogQWxsb2NhdGlvbiBiaXRtYXAgZm9yIHRoZSByZW1hcHBpbmcgYXJlYSAqLyAKQEAgLTEwMiwxNiArODYsNiBAQAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBuZXh0X2JpdDsgIC8qIHByb3RlY3RlZCBieSBpb21tdV9iaXRtYXBfbG9jayAqLwogc3RhdGljIGludCBuZWVkX2ZsdXNoOyAJCS8qIGdsb2JhbCBmbHVzaCBzdGF0ZS4gc2V0IGZvciBlYWNoIGdhcnQgd3JhcCAqLwotc3RhdGljIGRtYV9hZGRyX3QgZG1hX21hcF9hcmVhKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaHlzX21lbSwKLQkJCSAgICAgICBzaXplX3Qgc2l6ZSwgaW50IGRpciwgaW50IGRvX3BhbmljKTsKLQotLyogRHVtbXkgZGV2aWNlIHVzZWQgZm9yIE5VTEwgYXJndW1lbnRzIChub3JtYWxseSBJU0EpLiBCZXR0ZXIgd291bGQKLSAgIGJlIHByb2JhYmx5IGEgc21hbGxlciBETUEgbWFzaywgYnV0IHRoaXMgaXMgYnVnLXRvLWJ1ZyBjb21wYXRpYmxlIHRvIGkzODYuICovCi1zdGF0aWMgc3RydWN0IGRldmljZSBmYWxsYmFja19kZXYgPSB7Ci0JLmJ1c19pZCA9ICJmYWxsYmFjayBkZXZpY2UiLAotCS5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmYsCi0JLmRtYV9tYXNrID0gJmZhbGxiYWNrX2Rldi5jb2hlcmVudF9kbWFfbWFzaywKLX07CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGFsbG9jX2lvbW11KGludCBzaXplKSAKIHsgCQpAQCAtMTg1LDExNCArMTU5LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdV9iaXRtYXBfbG9jaywgZmxhZ3MpOwogfSAKIAotLyogQWxsb2NhdGUgRE1BIG1lbW9yeSBvbiBub2RlIG5lYXIgZGV2aWNlICovCi1ub2lubGluZQotc3RhdGljIHZvaWQgKmRtYV9hbGxvY19wYWdlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGdmcF90IGdmcCwgdW5zaWduZWQgb3JkZXIpCi17Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JaW50IG5vZGU7Ci0JaWYgKGRldi0+YnVzID09ICZwY2lfYnVzX3R5cGUpCi0JCW5vZGUgPSBwY2lidXNfdG9fbm9kZSh0b19wY2lfZGV2KGRldiktPmJ1cyk7Ci0JZWxzZQotCQlub2RlID0gbnVtYV9ub2RlX2lkKCk7Ci0JcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUobm9kZSwgZ2ZwLCBvcmRlcik7Ci0JcmV0dXJuIHBhZ2UgPyBwYWdlX2FkZHJlc3MocGFnZSkgOiBOVUxMOwotfQogCi0vKiAKLSAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgYSBjb2hlcmVudCBtYXBwaW5nLgotICovCi12b2lkICoKLWRtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLAotCQkgICBnZnBfdCBnZnApCi17Ci0Jdm9pZCAqbWVtb3J5OwotCXVuc2lnbmVkIGxvbmcgZG1hX21hc2sgPSAwOwotCXU2NCBidXM7Ci0KLQlpZiAoIWRldikKLQkJZGV2ID0gJmZhbGxiYWNrX2RldjsKLQlkbWFfbWFzayA9IGRldi0+Y29oZXJlbnRfZG1hX21hc2s7Ci0JaWYgKGRtYV9tYXNrID09IDApIAotCQlkbWFfbWFzayA9IDB4ZmZmZmZmZmY7IAotCi0JLyogS2x1ZGdlIHRvIG1ha2UgaXQgYnVnLXRvLWJ1ZyBjb21wYXRpYmxlIHdpdGggaTM4Ni4gaTM4NgotCSAgIHVzZXMgdGhlIG5vcm1hbCBkbWFfbWFzayBmb3IgYWxsb2NfY29oZXJlbnQuICovCi0JZG1hX21hc2sgJj0gKmRldi0+ZG1hX21hc2s7Ci0KLQkvKiBXaHkgPD0/IEV2ZW4gd2hlbiB0aGUgbWFzayBpcyBzbWFsbGVyIHRoYW4gNEdCIGl0IGlzIG9mdGVuIGxhcmdlciAKLQkgICB0aGFuIDE2TUIgYW5kIGluIHRoaXMgY2FzZSB3ZSBoYXZlIGEgY2hhbmNlIG9mIGZpbmRpbmcgZml0dGluZyBtZW1vcnkgCi0JICAgaW4gdGhlIG5leHQgaGlnaGVyIHpvbmUgZmlyc3QuIElmIG5vdCByZXRyeSB3aXRoIHRydWUgR0ZQX0RNQS4gLUFLICovCi0JaWYgKGRtYV9tYXNrIDw9IDB4ZmZmZmZmZmYpCi0JCWdmcCB8PSBHRlBfRE1BMzI7Ci0KLSBhZ2FpbjoKLQltZW1vcnkgPSBkbWFfYWxsb2NfcGFnZXMoZGV2LCBnZnAsIGdldF9vcmRlcihzaXplKSk7Ci0JaWYgKG1lbW9yeSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCXsKLQkJaW50IGhpZ2gsIG1tdTsKLQkJYnVzID0gdmlydF90b19idXMobWVtb3J5KTsKLQkgICAgICAgIGhpZ2ggPSAoYnVzICsgc2l6ZSkgPj0gZG1hX21hc2s7Ci0JCW1tdSA9IGhpZ2g7Ci0JCWlmIChmb3JjZV9pb21tdSAmJiAhKGdmcCAmIEdGUF9ETUEpKSAKLQkJCW1tdSA9IDE7Ci0JCWlmIChub19pb21tdSB8fCBkbWFfbWFzayA8IDB4ZmZmZmZmZmZVTCkgeyAKLQkJCWlmIChoaWdoKSB7Ci0JCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyltZW1vcnksCi0JCQkJCSAgIGdldF9vcmRlcihzaXplKSk7Ci0KLQkJCQlpZiAoc3dpb3RsYikgewotCQkJCQlyZXR1cm4KLQkJCQkJc3dpb3RsYl9hbGxvY19jb2hlcmVudChkZXYsIHNpemUsCi0JCQkJCQkJICAgICAgIGRtYV9oYW5kbGUsCi0JCQkJCQkJICAgICAgIGdmcCk7Ci0JCQkJfQotCi0JCQkJaWYgKCEoZ2ZwICYgR0ZQX0RNQSkpIHsgCi0JCQkJCWdmcCA9IChnZnAgJiB+R0ZQX0RNQTMyKSB8IEdGUF9ETUE7Ci0JCQkJCWdvdG8gYWdhaW47Ci0JCQkJfQotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJbW11ID0gMDsgCi0JCX0gCQotCQltZW1zZXQobWVtb3J5LCAwLCBzaXplKTsgCi0JCWlmICghbW11KSB7IAotCQkJKmRtYV9oYW5kbGUgPSB2aXJ0X3RvX2J1cyhtZW1vcnkpOwotCQkJcmV0dXJuIG1lbW9yeTsKLQkJfQotCX0gCi0KLQkqZG1hX2hhbmRsZSA9IGRtYV9tYXBfYXJlYShkZXYsIGJ1cywgc2l6ZSwgUENJX0RNQV9CSURJUkVDVElPTkFMLCAwKTsKLQlpZiAoKmRtYV9oYW5kbGUgPT0gYmFkX2RtYV9hZGRyZXNzKQotCQlnb3RvIGVycm9yOyAKLQlmbHVzaF9nYXJ0KGRldik7Ci0JcmV0dXJuIG1lbW9yeTsgCi0JCi1lcnJvcjoKLQlpZiAocGFuaWNfb25fb3ZlcmZsb3cpCi0JCXBhbmljKCJkbWFfYWxsb2NfY29oZXJlbnQ6IElPTU1VIG92ZXJmbG93IGJ5ICVsdSBieXRlc1xuIiwgc2l6ZSk7Ci0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyltZW1vcnksIGdldF9vcmRlcihzaXplKSk7IAotCXJldHVybiBOVUxMOyAKLX0KLQotLyogCi0gKiBVbm1hcCBjb2hlcmVudCBtZW1vcnkuCi0gKiBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgdGhlIGRldmljZSBoYXMgZmluaXNoZWQgYWNjZXNzaW5nIHRoZSBtYXBwaW5nLgotICovCi12b2lkIGRtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCi0JCQkgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgYnVzKQotewotCWlmIChzd2lvdGxiKSB7Ci0JCXN3aW90bGJfZnJlZV9jb2hlcmVudChkZXYsIHNpemUsIHZhZGRyLCBidXMpOwotCQlyZXR1cm47Ci0JfQotCi0JZG1hX3VubWFwX3NpbmdsZShkZXYsIGJ1cywgc2l6ZSwgMCk7Ci0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl2YWRkciwgZ2V0X29yZGVyKHNpemUpKTsgCQkKLX0KIAogI2lmZGVmIENPTkZJR19JT01NVV9MRUFLCiAKQEAgLTMyNiw3ICsxOTMsNyBAQAogI2RlZmluZSBDTEVBUl9MRUFLKHgpCiAjZW5kaWYKIAotc3RhdGljIHZvaWQgaW9tbXVfZnVsbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCBpbnQgZGlyLCBpbnQgZG9fcGFuaWMpCitzdGF0aWMgdm9pZCBpb21tdV9mdWxsKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIGludCBkaXIpCiB7CiAJLyogCiAJICogUmFuIG91dCBvZiBJT01NVSBzcGFjZSBmb3IgdGhpcyBvcGVyYXRpb24uIFRoaXMgaXMgdmVyeSBiYWQuCkBAIC0zNDIsMTEgKzIwOSwxMSBAQAogICAiUENJLURNQTogT3V0IG9mIElPTU1VIHNwYWNlIGZvciAlbHUgYnl0ZXMgYXQgZGV2aWNlICVzXG4iLAogCSAgICAgICBzaXplLCBkZXYtPmJ1c19pZCk7CiAKLQlpZiAoc2l6ZSA+IFBBR0VfU0laRSpFTUVSR0VOQ1lfUEFHRVMgJiYgZG9fcGFuaWMpIHsKKwlpZiAoc2l6ZSA+IFBBR0VfU0laRSpFTUVSR0VOQ1lfUEFHRVMpIHsKIAkJaWYgKGRpciA9PSBQQ0lfRE1BX0ZST01ERVZJQ0UgfHwgZGlyID09IFBDSV9ETUFfQklESVJFQ1RJT05BTCkKIAkJCXBhbmljKCJQQ0ktRE1BOiBNZW1vcnkgd291bGQgYmUgY29ycnVwdGVkXG4iKTsKIAkJaWYgKGRpciA9PSBQQ0lfRE1BX1RPREVWSUNFIHx8IGRpciA9PSBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpIAotCQkJcGFuaWMoIlBDSS1ETUE6IFJhbmRvbSBtZW1vcnkgd291bGQgYmUgRE1BZWRcbiIpOworCQkJcGFuaWMoS0VSTl9FUlIgIlBDSS1ETUE6IFJhbmRvbSBtZW1vcnkgd291bGQgYmUgRE1BZWRcbiIpOwogCX0gCiAKICNpZmRlZiBDT05GSUdfSU9NTVVfTEVBSwpAQCAtMzg1LDggKzI1Miw4IEBACiAvKiBNYXAgYSBzaW5nbGUgY29udGludW91cyBwaHlzaWNhbCBhcmVhIGludG8gdGhlIElPTU1VLgogICogQ2FsbGVyIG5lZWRzIHRvIGNoZWNrIGlmIHRoZSBpb21tdSBpcyBuZWVkZWQgYW5kIGZsdXNoLgogICovCi1zdGF0aWMgZG1hX2FkZHJfdCBkbWFfbWFwX2FyZWEoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBoeXNfbWVtLAotCQkJCXNpemVfdCBzaXplLCBpbnQgZGlyLCBpbnQgZG9fcGFuaWMpCitzdGF0aWMgZG1hX2FkZHJfdCBkbWFfbWFwX2FyZWEoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IHBoeXNfbWVtLAorCQkJCXNpemVfdCBzaXplLCBpbnQgZGlyKQogeyAKIAl1bnNpZ25lZCBsb25nIG5wYWdlcyA9IHRvX3BhZ2VzKHBoeXNfbWVtLCBzaXplKTsKIAl1bnNpZ25lZCBsb25nIGlvbW11X3BhZ2UgPSBhbGxvY19pb21tdShucGFnZXMpOwpAQCAtMzk2LDcgKzI2Myw3IEBACiAJCQlyZXR1cm4gcGh5c19tZW07IAogCQlpZiAocGFuaWNfb25fb3ZlcmZsb3cpCiAJCQlwYW5pYygiZG1hX21hcF9hcmVhIG92ZXJmbG93ICVsdSBieXRlc1xuIiwgc2l6ZSk7Ci0JCWlvbW11X2Z1bGwoZGV2LCBzaXplLCBkaXIsIGRvX3BhbmljKTsKKwkJaW9tbXVfZnVsbChkZXYsIHNpemUsIGRpcik7CiAJCXJldHVybiBiYWRfZG1hX2FkZHJlc3M7CiAJfQogCkBAIC00MDgsMTUgKzI3NSwyMSBAQAogCXJldHVybiBpb21tdV9idXNfYmFzZSArIGlvbW11X3BhZ2UqUEFHRV9TSVpFICsgKHBoeXNfbWVtICYgflBBR0VfTUFTSyk7CiB9CiAKK3N0YXRpYyBkbWFfYWRkcl90IGdhcnRfbWFwX3NpbXBsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwKKwkJCQkgc2l6ZV90IHNpemUsIGludCBkaXIpCit7CisJZG1hX2FkZHJfdCBtYXAgPSBkbWFfbWFwX2FyZWEoZGV2LCB2aXJ0X3RvX2J1cyhidWYpLCBzaXplLCBkaXIpOworCWZsdXNoX2dhcnQoZGV2KTsKKwlyZXR1cm4gbWFwOworfQorCiAvKiBNYXAgYSBzaW5nbGUgYXJlYSBpbnRvIHRoZSBJT01NVSAqLwotZG1hX2FkZHJfdCBkbWFfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLCBpbnQgZGlyKQorZG1hX2FkZHJfdCBnYXJ0X21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGRpcikKIHsKIAl1bnNpZ25lZCBsb25nIHBoeXNfbWVtLCBidXM7CiAKIAlCVUdfT04oZGlyID09IERNQV9OT05FKTsKIAotCWlmIChzd2lvdGxiKQotCQlyZXR1cm4gc3dpb3RsYl9tYXBfc2luZ2xlKGRldixhZGRyLHNpemUsZGlyKTsKIAlpZiAoIWRldikKIAkJZGV2ID0gJmZhbGxiYWNrX2RldjsKIApAQCAtNDI0LDEwICsyOTcsMjQgQEAKIAlpZiAoIW5lZWRfaW9tbXUoZGV2LCBwaHlzX21lbSwgc2l6ZSkpCiAJCXJldHVybiBwaHlzX21lbTsgCiAKLQlidXMgPSBkbWFfbWFwX2FyZWEoZGV2LCBwaHlzX21lbSwgc2l6ZSwgZGlyLCAxKTsKLQlmbHVzaF9nYXJ0KGRldik7IAorCWJ1cyA9IGdhcnRfbWFwX3NpbXBsZShkZXYsIGFkZHIsIHNpemUsIGRpcik7CiAJcmV0dXJuIGJ1czsgCi19IAorfQorCisvKgorICogV3JhcHBlciBmb3IgcGNpX3VubWFwX3NpbmdsZSB3b3JraW5nIHdpdGggc2NhdHRlcmxpc3RzLgorICovCit2b2lkIGdhcnRfdW5tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsIGludCBkaXIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmVudHM7IGkrKykgeworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnMgPSAmc2dbaV07CisJCWlmICghcy0+ZG1hX2xlbmd0aCB8fCAhcy0+bGVuZ3RoKQorCQkJYnJlYWs7CisJCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBzLT5kbWFfYWRkcmVzcywgcy0+ZG1hX2xlbmd0aCwgZGlyKTsKKwl9Cit9CiAKIC8qIEZhbGxiYWNrIGZvciBkbWFfbWFwX3NnIGluIGNhc2Ugb2Ygb3ZlcmZsb3cgKi8KIHN0YXRpYyBpbnQgZG1hX21hcF9zZ19ub25mb3JjZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCkBAIC00NDMsMTAgKzMzMCwxMCBAQAogCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnMgPSAmc2dbaV07CiAJCXVuc2lnbmVkIGxvbmcgYWRkciA9IHBhZ2VfdG9fcGh5cyhzLT5wYWdlKSArIHMtPm9mZnNldDsgCiAJCWlmIChub25mb3JjZWRfaW9tbXUoZGV2LCBhZGRyLCBzLT5sZW5ndGgpKSB7IAotCQkJYWRkciA9IGRtYV9tYXBfYXJlYShkZXYsIGFkZHIsIHMtPmxlbmd0aCwgZGlyLCAwKTsKKwkJCWFkZHIgPSBkbWFfbWFwX2FyZWEoZGV2LCBhZGRyLCBzLT5sZW5ndGgsIGRpcik7CiAJCQlpZiAoYWRkciA9PSBiYWRfZG1hX2FkZHJlc3MpIHsgCiAJCQkJaWYgKGkgPiAwKSAKLQkJCQkJZG1hX3VubWFwX3NnKGRldiwgc2csIGksIGRpcik7CisJCQkJCWdhcnRfdW5tYXBfc2coZGV2LCBzZywgaSwgZGlyKTsKIAkJCQluZW50cyA9IDA7IAogCQkJCXNnWzBdLmRtYV9sZW5ndGggPSAwOwogCQkJCWJyZWFrOwpAQCAtNTE1LDcgKzQwMiw3IEBACiAgKiBETUEgbWFwIGFsbCBlbnRyaWVzIGluIGEgc2NhdHRlcmxpc3QuCiAgKiBNZXJnZSBjaHVua3MgdGhhdCBoYXZlIHBhZ2UgYWxpZ25lZCBzaXplcyBpbnRvIGEgY29udGludW91cyBtYXBwaW5nLiAKICAqLwotaW50IGRtYV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsIGludCBkaXIpCitpbnQgZ2FydF9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsIGludCBkaXIpCiB7CiAJaW50IGk7CiAJaW50IG91dDsKQEAgLTUyNyw4ICs0MTQsNiBAQAogCWlmIChuZW50cyA9PSAwKSAKIAkJcmV0dXJuIDA7CiAKLQlpZiAoc3dpb3RsYikKLQkJcmV0dXJuIHN3aW90bGJfbWFwX3NnKGRldixzZyxuZW50cyxkaXIpOwogCWlmICghZGV2KQogCQlkZXYgPSAmZmFsbGJhY2tfZGV2OwogCkBAIC01NzEsMTMgKzQ1NiwxMyBAQAogCiBlcnJvcjoKIAlmbHVzaF9nYXJ0KE5VTEwpOwotCWRtYV91bm1hcF9zZyhkZXYsIHNnLCBuZW50cywgZGlyKTsKKwlnYXJ0X3VubWFwX3NnKGRldiwgc2csIG5lbnRzLCBkaXIpOwogCS8qIFdoZW4gaXQgd2FzIGZvcmNlZCB0cnkgYWdhaW4gdW5mb3JjZWQgKi8KIAlpZiAoZm9yY2VfaW9tbXUpIAogCQlyZXR1cm4gZG1hX21hcF9zZ19ub25mb3JjZShkZXYsIHNnLCBuZW50cywgZGlyKTsKIAlpZiAocGFuaWNfb25fb3ZlcmZsb3cpCiAJCXBhbmljKCJkbWFfbWFwX3NnOiBvdmVyZmxvdyBvbiAlbHUgcGFnZXNcbiIsIHBhZ2VzKTsKLQlpb21tdV9mdWxsKGRldiwgcGFnZXMgPDwgUEFHRV9TSElGVCwgZGlyLCAwKTsKKwlpb21tdV9mdWxsKGRldiwgcGFnZXMgPDwgUEFHRV9TSElGVCwgZGlyKTsKIAlmb3IgKGkgPSAwOyBpIDwgbmVudHM7IGkrKykKIAkJc2dbaV0uZG1hX2FkZHJlc3MgPSBiYWRfZG1hX2FkZHJlc3M7CiAJcmV0dXJuIDA7CkBAIC01ODYsMTggKzQ3MSwxMyBAQAogLyoKICAqIEZyZWUgYSBETUEgbWFwcGluZy4KICAqLyAKLXZvaWQgZG1hX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCit2b2lkIGdhcnRfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwKIAkJICAgICAgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCiB7CiAJdW5zaWduZWQgbG9uZyBpb21tdV9wYWdlOyAKIAlpbnQgbnBhZ2VzOwogCWludCBpOwogCi0JaWYgKHN3aW90bGIpIHsKLQkJc3dpb3RsYl91bm1hcF9zaW5nbGUoZGV2LGRtYV9hZGRyLHNpemUsZGlyZWN0aW9uKTsKLQkJcmV0dXJuOwotCX0KLQogCWlmIChkbWFfYWRkciA8IGlvbW11X2J1c19iYXNlICsgRU1FUkdFTkNZX1BBR0VTKlBBR0VfU0laRSB8fCAKIAkgICAgZG1hX2FkZHIgPj0gaW9tbXVfYnVzX2Jhc2UgKyBpb21tdV9zaXplKQogCQlyZXR1cm47CkBAIC02MTAsNjggKzQ5MCw3IEBACiAJZnJlZV9pb21tdShpb21tdV9wYWdlLCBucGFnZXMpOwogfQogCi0vKiAKLSAqIFdyYXBwZXIgZm9yIHBjaV91bm1hcF9zaW5nbGUgd29ya2luZyB3aXRoIHNjYXR0ZXJsaXN0cy4KLSAqLyAKLXZvaWQgZG1hX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLCBpbnQgZGlyKQotewotCWludCBpOwotCWlmIChzd2lvdGxiKSB7Ci0JCXN3aW90bGJfdW5tYXBfc2coZGV2LHNnLG5lbnRzLGRpcik7Ci0JCXJldHVybjsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IG5lbnRzOyBpKyspIHsgCi0JCXN0cnVjdCBzY2F0dGVybGlzdCAqcyA9ICZzZ1tpXTsKLQkJaWYgKCFzLT5kbWFfbGVuZ3RoIHx8ICFzLT5sZW5ndGgpIAotCQkJYnJlYWs7Ci0JCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBzLT5kbWFfYWRkcmVzcywgcy0+ZG1hX2xlbmd0aCwgZGlyKTsKLQl9Ci19Ci0KLWludCBkbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCi17Ci0JLyogQ29waWVkIGZyb20gaTM4Ni4gRG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UsIGJlY2F1c2UgaXQgd2lsbCAKLQkgICBvbmx5IHdvcmsgZm9yIHBjaV9hbGxvY19jb2hlcmVudC4KLQkgICBUaGUgY2FsbGVyIGp1c3QgaGFzIHRvIHVzZSBHRlBfRE1BIGluIHRoaXMgY2FzZS4gKi8KLSAgICAgICAgaWYgKG1hc2sgPCAweDAwZmZmZmZmKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0JLyogVGVsbCB0aGUgZGV2aWNlIHRvIHVzZSBTQUMgd2hlbiBJT01NVSBmb3JjZSBpcyBvbi4gCi0JICAgVGhpcyBhbGxvd3MgdGhlIGRyaXZlciB0byB1c2UgY2hlYXBlciBhY2Nlc3NlcyBpbiBzb21lIGNhc2VzLgotCi0JICAgUHJvYmxlbSB3aXRoIHRoaXMgaXMgdGhhdCBpZiB3ZSBvdmVyZmxvdyB0aGUgSU9NTVUgYXJlYQotCSAgIGFuZCByZXR1cm4gREFDIGFzIGZhbGxiYWNrIGFkZHJlc3MgdGhlIGRldmljZSBtYXkgbm90IGhhbmRsZSBpdCBjb3JyZWN0bHkuCi0JICAgCi0JICAgQXMgYSBzcGVjaWFsIGNhc2Ugc29tZSBjb250cm9sbGVycyBoYXZlIGEgMzliaXQgYWRkcmVzcyBtb2RlIAotCSAgIHRoYXQgaXMgYXMgZWZmaWNpZW50IGFzIDMyYml0IChhaWM3OXh4KS4gRG9uJ3QgZm9yY2UgU0FDIGZvciB0aGVzZS4KLQkgICBBc3N1bWUgYWxsIG1hc2tzIDw9IDQwIGJpdHMgYXJlIG9mIHRoaXMgdHlwZS4gTm9ybWFsbHkgdGhpcyBkb2Vzbid0Ci0JICAgbWFrZSBhbnkgZGlmZmVyZW5jZSwgYnV0IGdpdmVzIG1vcmUgZ2VudGxlIGhhbmRsaW5nIG9mIElPTU1VIG92ZXJmbG93LiAqLwotCWlmIChpb21tdV9zYWNfZm9yY2UgJiYgKG1hc2sgPj0gMHhmZmZmZmZmZmZmVUxMKSkgeyAKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZvcmNlIFNBQyB3aXRoIG1hc2sgJUx4XG4iLCBkZXYtPmJ1c19pZCxtYXNrKTsKLQkJcmV0dXJuIDA7IAotCX0KLQotCXJldHVybiAxOwotfSAKLQotaW50IGRtYV9nZXRfY2FjaGVfYWxpZ25tZW50KHZvaWQpCi17Ci0JcmV0dXJuIGJvb3RfY3B1X2RhdGEueDg2X2NsZmx1c2hfc2l6ZTsKLX0KLQotRVhQT1JUX1NZTUJPTChkbWFfdW5tYXBfc2cpOwotRVhQT1JUX1NZTUJPTChkbWFfbWFwX3NnKTsKLUVYUE9SVF9TWU1CT0woZG1hX21hcF9zaW5nbGUpOwotRVhQT1JUX1NZTUJPTChkbWFfdW5tYXBfc2luZ2xlKTsKLUVYUE9SVF9TWU1CT0woZG1hX3N1cHBvcnRlZCk7Ci1FWFBPUlRfU1lNQk9MKG5vX2lvbW11KTsKLUVYUE9SVF9TWU1CT0woZm9yY2VfaW9tbXUpOyAKLUVYUE9SVF9TWU1CT0woYmFkX2RtYV9hZGRyZXNzKTsKLUVYUE9SVF9TWU1CT0woaW9tbXVfYmlvX21lcmdlKTsKLUVYUE9SVF9TWU1CT0woaW9tbXVfc2FjX2ZvcmNlKTsKLUVYUE9SVF9TWU1CT0woZG1hX2dldF9jYWNoZV9hbGlnbm1lbnQpOwotRVhQT1JUX1NZTUJPTChkbWFfYWxsb2NfY29oZXJlbnQpOwotRVhQT1JUX1NZTUJPTChkbWFfZnJlZV9jb2hlcmVudCk7CitzdGF0aWMgaW50IG5vX2FncDsKIAogc3RhdGljIF9faW5pdCB1bnNpZ25lZCBsb25nIGNoZWNrX2lvbW11X3NpemUodW5zaWduZWQgbG9uZyBhcGVyLCB1NjQgYXBlcl9zaXplKQogeyAKQEAgLTc3MiwxMiArNTkxLDI3IEBACiAgbm9tbXU6CiAgCS8qIFNob3VsZCBub3QgaGFwcGVuIGFueW1vcmUgKi8KIAlwcmludGsoS0VSTl9FUlIgIlBDSS1ETUE6IE1vcmUgdGhhbiA0R0Igb2YgUkFNIGFuZCBubyBJT01NVVxuIgotCSAgICAgICBLRVJOX0VSUiAiUENJLURNQTogMzJiaXQgUENJIElPIG1heSBtYWxmdW5jdGlvbi4iKTsgCisJICAgICAgIEtFUk5fRVJSICJQQ0ktRE1BOiAzMmJpdCBQQ0kgSU8gbWF5IG1hbGZ1bmN0aW9uLlxuIik7CiAJcmV0dXJuIC0xOyAKIH0gCiAKIGV4dGVybiBpbnQgYWdwX2FtZDY0X2luaXQodm9pZCk7CiAKK3N0YXRpYyBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIGdhcnRfZG1hX29wcyA9IHsKKwkubWFwcGluZ19lcnJvciA9IE5VTEwsCisJLm1hcF9zaW5nbGUgPSBnYXJ0X21hcF9zaW5nbGUsCisJLm1hcF9zaW1wbGUgPSBnYXJ0X21hcF9zaW1wbGUsCisJLnVubWFwX3NpbmdsZSA9IGdhcnRfdW5tYXBfc2luZ2xlLAorCS5zeW5jX3NpbmdsZV9mb3JfY3B1ID0gTlVMTCwKKwkuc3luY19zaW5nbGVfZm9yX2RldmljZSA9IE5VTEwsCisJLnN5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUgPSBOVUxMLAorCS5zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlID0gTlVMTCwKKwkuc3luY19zZ19mb3JfY3B1ID0gTlVMTCwKKwkuc3luY19zZ19mb3JfZGV2aWNlID0gTlVMTCwKKwkubWFwX3NnID0gZ2FydF9tYXBfc2csCisJLnVubWFwX3NnID0gZ2FydF91bm1hcF9zZywKK307CisKIHN0YXRpYyBpbnQgX19pbml0IHBjaV9pb21tdV9pbml0KHZvaWQpCiB7IAogCXN0cnVjdCBhZ3Bfa2Vybl9pbmZvIGluZm87CkBAIC03OTksMTYgKzYzMywxNSBAQAogCiAJaWYgKHN3aW90bGIpIHsgCiAJCW5vX2lvbW11ID0gMTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJLURNQTogVXNpbmcgc29mdHdhcmUgYm91bmNlIGJ1ZmZlcmluZyBmb3IgSU8gKFNXSU9UTEIpXG4iKTsKIAkJcmV0dXJuIC0xOyAKIAl9IAogCQogCWlmIChub19pb21tdSB8fAotCSAgICAoIWZvcmNlX2lvbW11ICYmIGVuZF9wZm4gPCAweGZmZmZmZmZmPj5QQUdFX1NISUZUKSB8fAorCSAgICAoIWZvcmNlX2lvbW11ICYmIGVuZF9wZm4gPD0gTUFYX0RNQTMyX1BGTikgfHwKIAkgICAgIWlvbW11X2FwZXJ0dXJlIHx8CiAJICAgIChub19hZ3AgJiYgaW5pdF9rOF9nYXR0KCZpbmZvKSA8IDApKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlBDSS1ETUE6IERpc2FibGluZyBJT01NVS5cbiIpOyAKIAkJbm9faW9tbXUgPSAxOworCQlub19pb21tdV9pbml0KCk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTg4NSwxMDAgKzcxOCw1MCBAQAogCQkgICAgIAogCWZsdXNoX2dhcnQoTlVMTCk7CiAKKwlwcmludGsoS0VSTl9JTkZPICJQQ0ktRE1BOiB1c2luZyBHQVJUIElPTU1VLlxuIik7CisJZG1hX29wcyA9ICZnYXJ0X2RtYV9vcHM7CisKIAlyZXR1cm4gMDsKIH0gCiAKIC8qIE11c3QgZXhlY3V0ZSBhZnRlciBQQ0kgc3Vic3lzdGVtICovCiBmc19pbml0Y2FsbChwY2lfaW9tbXVfaW5pdCk7CiAKLS8qIGlvbW11PVtzaXplXVssbm9hZ3BdWyxvZmZdWyxmb3JjZV1bLG5vZm9yY2VdWyxsZWFrXVssbWVtYXBlcls9b3JkZXJdXVssbWVyZ2VdCi0gICAgICAgICBbLGZvcmNlc2FjXVssZnVsbGZsdXNoXVssbm9tZXJnZV1bLGJpb21lcmdlXQotICAgc2l6ZSAgc2V0IHNpemUgb2YgaW9tbXUgKGluIGJ5dGVzKSAKLSAgIG5vYWdwIGRvbid0IGluaXRpYWxpemUgdGhlIEFHUCBkcml2ZXIgYW5kIHVzZSBmdWxsIGFwZXJ0dXJlLgotICAgb2ZmICAgZG9uJ3QgdXNlIHRoZSBJT01NVQotICAgbGVhayAgdHVybiBvbiBzaW1wbGUgaW9tbXUgbGVhayB0cmFjaW5nIChvbmx5IHdoZW4gQ09ORklHX0lPTU1VX0xFQUsgaXMgb24pCi0gICBtZW1hcGVyWz1vcmRlcl0gYWxsb2NhdGUgYW4gb3duIGFwZXJ0dXJlIG92ZXIgUkFNIHdpdGggc2l6ZSAzMk1CXm9yZGVyLiAgCi0gICBub2ZvcmNlIGRvbid0IGZvcmNlIElPTU1VIHVzYWdlLiBEZWZhdWx0LgotICAgZm9yY2UgIEZvcmNlIElPTU1VLgotICAgbWVyZ2UgIERvIGxhenkgbWVyZ2luZy4gVGhpcyBtYXkgaW1wcm92ZSBwZXJmb3JtYW5jZSBvbiBzb21lIGJsb2NrIGRldmljZXMuCi0gICAgICAgICAgSW1wbGllcyBmb3JjZSAoZXhwZXJpbWVudGFsKQotICAgYmlvbWVyZ2UgRG8gbWVyZ2luZyBhdCB0aGUgQklPIGxheWVyLiBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gbWVyZ2UsCi0gICAgICAgICAgICBidXQgc2hvdWxkIGJlIG9ubHkgZG9uZSB3aXRoIHZlcnkgYmlnIElPTU1Vcy4gSW1wbGllcyBtZXJnZSxmb3JjZS4KLSAgIG5vbWVyZ2UgRG9uJ3QgZG8gU0cgbWVyZ2luZy4KLSAgIGZvcmNlc2FjIEZvciBTQUMgbW9kZSBmb3IgbWFza3MgPDQwYml0cyAgKGV4cGVyaW1lbnRhbCkKLSAgIGZ1bGxmbHVzaCBGbHVzaCBJT01NVSBvbiBlYWNoIGFsbG9jYXRpb24gKGRlZmF1bHQpIAotICAgbm9mdWxsZmx1c2ggRG9uJ3QgdXNlIElPTU1VIGZ1bGxmbHVzaAotICAgYWxsb3dlZCAgb3ZlcndyaXRlIGlvbW11IG9mZiB3b3JrYXJvdW5kcyBmb3Igc3BlY2lmaWMgY2hpcHNldHMuCi0gICBzb2Z0CSBVc2Ugc29mdHdhcmUgYm91bmNlIGJ1ZmZlcmluZyAoZGVmYXVsdCBmb3IgSW50ZWwgbWFjaGluZXMpCi0gICBub2FwZXJ0dXJlIERvbid0IHRvdWNoIHRoZSBhcGVydHVyZSBmb3IgQUdQLgotKi8KLV9faW5pdCBpbnQgaW9tbXVfc2V0dXAoY2hhciAqcCkKLXsgCi0gICAgaW50IGFyZzsKK3ZvaWQgZ2FydF9wYXJzZV9vcHRpb25zKGNoYXIgKnApCit7CisJaW50IGFyZzsKIAotICAgIHdoaWxlICgqcCkgewotCSAgICBpZiAoIXN0cm5jbXAocCwibm9hZ3AiLDUpKQotCQkgICAgbm9fYWdwID0gMTsKLQkgICAgaWYgKCFzdHJuY21wKHAsIm9mZiIsMykpCi0JCSAgICBub19pb21tdSA9IDE7Ci0JICAgIGlmICghc3RybmNtcChwLCJmb3JjZSIsNSkpIHsKLQkJICAgIGZvcmNlX2lvbW11ID0gMTsKLQkJICAgIGlvbW11X2FwZXJ0dXJlX2FsbG93ZWQgPSAxOwotCSAgICB9Ci0JICAgIGlmICghc3RybmNtcChwLCJhbGxvd2VkIiw3KSkKLQkJICAgIGlvbW11X2FwZXJ0dXJlX2FsbG93ZWQgPSAxOwotCSAgICBpZiAoIXN0cm5jbXAocCwibm9mb3JjZSIsNykpIHsKLQkJICAgIGlvbW11X21lcmdlID0gMDsKLQkJICAgIGZvcmNlX2lvbW11ID0gMDsKLQkgICAgfQotCSAgICBpZiAoIXN0cm5jbXAocCwgIm1lbWFwZXIiLCA3KSkgewotCQkgICAgZmFsbGJhY2tfYXBlcl9mb3JjZSA9IDE7IAotCQkgICAgcCArPSA3OyAKLQkJICAgIGlmICgqcCA9PSAnPScpIHsKLQkJCSAgICArK3A7Ci0JCQkgICAgaWYgKGdldF9vcHRpb24oJnAsICZhcmcpKQotCQkJCSAgICBmYWxsYmFja19hcGVyX29yZGVyID0gYXJnOwotCQkgICAgfQotCSAgICB9IAotCSAgICBpZiAoIXN0cm5jbXAocCwgImJpb21lcmdlIiw4KSkgewotCQkgICAgaW9tbXVfYmlvX21lcmdlID0gNDA5NjsKLQkJICAgIGlvbW11X21lcmdlID0gMTsKLQkJICAgIGZvcmNlX2lvbW11ID0gMTsKLQkgICAgfQotCSAgICBpZiAoIXN0cm5jbXAocCwgInBhbmljIiw1KSkKLQkJICAgIHBhbmljX29uX292ZXJmbG93ID0gMTsKLQkgICAgaWYgKCFzdHJuY21wKHAsICJub3BhbmljIiw3KSkKLQkJICAgIHBhbmljX29uX292ZXJmbG93ID0gMDsJICAgIAotCSAgICBpZiAoIXN0cm5jbXAocCwgIm1lcmdlIiw1KSkgewotCQkgICAgaW9tbXVfbWVyZ2UgPSAxOwotCQkgICAgZm9yY2VfaW9tbXUgPSAxOyAKLQkgICAgfQotCSAgICBpZiAoIXN0cm5jbXAocCwgIm5vbWVyZ2UiLDcpKQotCQkgICAgaW9tbXVfbWVyZ2UgPSAwOwotCSAgICBpZiAoIXN0cm5jbXAocCwgImZvcmNlc2FjIiw4KSkKLQkJICAgIGlvbW11X3NhY19mb3JjZSA9IDE7Ci0JICAgIGlmICghc3RybmNtcChwLCAiZnVsbGZsdXNoIiw4KSkKLQkJICAgIGlvbW11X2Z1bGxmbHVzaCA9IDE7Ci0JICAgIGlmICghc3RybmNtcChwLCAibm9mdWxsZmx1c2giLDExKSkKLQkJICAgIGlvbW11X2Z1bGxmbHVzaCA9IDA7Ci0JICAgIGlmICghc3RybmNtcChwLCAic29mdCIsNCkpCi0JCSAgICBzd2lvdGxiID0gMTsKLQkgICAgaWYgKCFzdHJuY21wKHAsICJub2FwZXJ0dXJlIiwxMCkpCi0JCSAgICBmaXhfYXBlcnR1cmUgPSAwOwogI2lmZGVmIENPTkZJR19JT01NVV9MRUFLCi0JICAgIGlmICghc3RybmNtcChwLCJsZWFrIiw0KSkgewotCQkgICAgbGVha190cmFjZSA9IDE7Ci0JCSAgICBwICs9IDQ7IAotCQkgICAgaWYgKCpwID09ICc9JykgKytwOwotCQkgICAgaWYgKGlzZGlnaXQoKnApICYmIGdldF9vcHRpb24oJnAsICZhcmcpKQotCQkJICAgIGlvbW11X2xlYWtfcGFnZXMgPSBhcmc7Ci0JICAgIH0gZWxzZQorCWlmICghc3RybmNtcChwLCJsZWFrIiw0KSkgeworCQlsZWFrX3RyYWNlID0gMTsKKwkJcCArPSA0OworCQlpZiAoKnAgPT0gJz0nKSArK3A7CisJCWlmIChpc2RpZ2l0KCpwKSAmJiBnZXRfb3B0aW9uKCZwLCAmYXJnKSkKKwkJCWlvbW11X2xlYWtfcGFnZXMgPSBhcmc7CisJfQogI2VuZGlmCi0JICAgIGlmIChpc2RpZ2l0KCpwKSAmJiBnZXRfb3B0aW9uKCZwLCAmYXJnKSkgCi0JCSAgICBpb21tdV9zaXplID0gYXJnOwotCSAgICBwICs9IHN0cmNzcG4ocCwgIiwiKTsKLQkgICAgaWYgKCpwID09ICcsJykKLQkJICAgICsrcDsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19IAorCWlmIChpc2RpZ2l0KCpwKSAmJiBnZXRfb3B0aW9uKCZwLCAmYXJnKSkKKwkJaW9tbXVfc2l6ZSA9IGFyZzsKKwlpZiAoIXN0cm5jbXAocCwgImZ1bGxmbHVzaCIsOCkpCisJCWlvbW11X2Z1bGxmbHVzaCA9IDE7CisJaWYgKCFzdHJuY21wKHAsICJub2Z1bGxmbHVzaCIsMTEpKQorCQlpb21tdV9mdWxsZmx1c2ggPSAwOworCWlmICghc3RybmNtcChwLCJub2FncCIsNSkpCisJCW5vX2FncCA9IDE7CisJaWYgKCFzdHJuY21wKHAsICJub2FwZXJ0dXJlIiwxMCkpCisJCWZpeF9hcGVydHVyZSA9IDA7CisJLyogZHVwbGljYXRlZCBmcm9tIHBjaS1kbWEuYyAqLworCWlmICghc3RybmNtcChwLCJmb3JjZSIsNSkpCisJCWlvbW11X2FwZXJ0dXJlX2FsbG93ZWQgPSAxOworCWlmICghc3RybmNtcChwLCJhbGxvd2VkIiw3KSkKKwkJaW9tbXVfYXBlcnR1cmVfYWxsb3dlZCA9IDE7CisJaWYgKCFzdHJuY21wKHAsICJtZW1hcGVyIiwgNykpIHsKKwkJZmFsbGJhY2tfYXBlcl9mb3JjZSA9IDE7CisJCXAgKz0gNzsKKwkJaWYgKCpwID09ICc9JykgeworCQkJKytwOworCQkJaWYgKGdldF9vcHRpb24oJnAsICZhcmcpKQorCQkJCWZhbGxiYWNrX2FwZXJfb3JkZXIgPSBhcmc7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLW5vbW11LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLW5vbW11LmMKaW5kZXggNWE5ODFkYy4uZTQxNTY0OSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3BjaS1ub21tdS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktbm9tbXUuYwpAQCAtNiw4OSArNiw5NCBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGFzbS9wcm90by5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CiAKLWludCBpb21tdV9tZXJnZSA9IDA7Ci1FWFBPUlRfU1lNQk9MKGlvbW11X21lcmdlKTsKLQotZG1hX2FkZHJfdCBiYWRfZG1hX2FkZHJlc3M7Ci1FWFBPUlRfU1lNQk9MKGJhZF9kbWFfYWRkcmVzcyk7Ci0KLWludCBpb21tdV9iaW9fbWVyZ2UgPSAwOwotRVhQT1JUX1NZTUJPTChpb21tdV9iaW9fbWVyZ2UpOwotCi1pbnQgaW9tbXVfc2FjX2ZvcmNlID0gMDsKLUVYUE9SVF9TWU1CT0woaW9tbXVfc2FjX2ZvcmNlKTsKLQotLyogCi0gKiBEdW1teSBJTyBNTVUgZnVuY3Rpb25zCi0gKi8KLQotdm9pZCAqZG1hX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzaXplX3Qgc2l6ZSwKLQkJCSBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBnZnApCitzdGF0aWMgaW50CitjaGVja19hZGRyKGNoYXIgKm5hbWUsIHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGJ1cywgc2l6ZV90IHNpemUpCiB7Ci0Jdm9pZCAqcmV0OwotCXU2NCBtYXNrOwotCWludCBvcmRlciA9IGdldF9vcmRlcihzaXplKTsKLQotCWlmIChod2RldikKLQkJbWFzayA9IGh3ZGV2LT5jb2hlcmVudF9kbWFfbWFzayAmICpod2Rldi0+ZG1hX21hc2s7Ci0JZWxzZQotCQltYXNrID0gMHhmZmZmZmZmZjsKLQlmb3IgKDs7KSB7Ci0JCXJldCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhnZnAsIG9yZGVyKTsKLQkJaWYgKHJldCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCSpkbWFfaGFuZGxlID0gdmlydF90b19idXMocmV0KTsKLQkJaWYgKCgqZG1hX2hhbmRsZSAmIH5tYXNrKSA9PSAwKQotCQkJYnJlYWs7Ci0JCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcmV0LCBvcmRlcik7Ci0JCWlmIChnZnAgJiBHRlBfRE1BKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWdmcCB8PSBHRlBfRE1BOworICAgICAgICBpZiAoaHdkZXYgJiYgYnVzICsgc2l6ZSA+ICpod2Rldi0+ZG1hX21hc2spIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAibm9tbXVfJXM6IG92ZXJmbG93ICVMeCslbHUgb2YgZGV2aWNlIG1hc2sgJUx4XG4iLAorCSAgICAgICBuYW1lLCAobG9uZyBsb25nKWJ1cywgc2l6ZSwgKGxvbmcgbG9uZykqaHdkZXYtPmRtYV9tYXNrKTsKKwkJcmV0dXJuIDA7CiAJfQotCi0JbWVtc2V0KHJldCwgMCwgc2l6ZSk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woZG1hX2FsbG9jX2NvaGVyZW50KTsKLQotdm9pZCBkbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsCi0JCQkgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKLXsKLQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXZhZGRyLCBnZXRfb3JkZXIoc2l6ZSkpOwotfQotRVhQT1JUX1NZTUJPTChkbWFfZnJlZV9jb2hlcmVudCk7Ci0KLWludCBkbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB1NjQgbWFzaykKLXsKLSAgICAgICAgLyoKLSAgICAgICAgICogd2UgZmFsbCBiYWNrIHRvIEdGUF9ETUEgd2hlbiB0aGUgbWFzayBpc24ndCBhbGwgMXMsCi0gICAgICAgICAqIHNvIHdlIGNhbid0IGd1YXJhbnRlZSBhbGxvY2F0aW9ucyB0aGF0IG11c3QgYmUKLSAgICAgICAgICogd2l0aGluIGEgdGlnaHRlciByYW5nZSB0aGFuIEdGUF9ETUEuLgotCSAqIFJFRC1QRU4gdGhpcyB3b24ndCB3b3JrIGZvciBwY2lfbWFwX3NpbmdsZS4gQ2FsbGVyIGhhcyB0bwotCSAqIHVzZSBHRlBfRE1BIGluIHRoZSBmaXJzdCBwbGFjZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChtYXNrIDwgMHgwMGZmZmZmZikKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQogCXJldHVybiAxOwotfSAKLUVYUE9SVF9TWU1CT0woZG1hX3N1cHBvcnRlZCk7Ci0KLWludCBkbWFfZ2V0X2NhY2hlX2FsaWdubWVudCh2b2lkKQotewotCXJldHVybiBib290X2NwdV9kYXRhLng4Nl9jbGZsdXNoX3NpemU7CiB9Ci1FWFBPUlRfU1lNQk9MKGRtYV9nZXRfY2FjaGVfYWxpZ25tZW50KTsKIAotc3RhdGljIGludCBfX2luaXQgY2hlY2tfcmFtKHZvaWQpIAoteyAKLQlpZiAoZW5kX3BmbiA+PSAweGZmZmZmZmZmPj5QQUdFX1NISUZUKSB7IAotCQlwcmludGsoCi0JCUtFUk5fRVJSICJXQVJOSU5HIG1vcmUgdGhhbiA0R0Igb2YgbWVtb3J5IGJ1dCBJT01NVSBub3QgY29tcGlsZWQgaW4uXG4iCi0JCUtFUk5fRVJSICJXQVJOSU5HIDMyYml0IFBDSSBtYXkgbWFsZnVuY3Rpb24uXG4iKTsKLQl9IAotCXJldHVybiAwOwotfSAKLV9faW5pdGNhbGwoY2hlY2tfcmFtKTsKK3N0YXRpYyBkbWFfYWRkcl90Citub21tdV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB2b2lkICpwdHIsIHNpemVfdCBzaXplLAorCSAgICAgICBpbnQgZGlyZWN0aW9uKQoreworCWRtYV9hZGRyX3QgYnVzID0gdmlydF90b19idXMocHRyKTsKKwlpZiAoIWNoZWNrX2FkZHIoIm1hcF9zaW5nbGUiLCBod2RldiwgYnVzLCBzaXplKSkKKwkJCQlyZXR1cm4gYmFkX2RtYV9hZGRyZXNzOworCXJldHVybiBidXM7Cit9CiAKK3ZvaWQgbm9tbXVfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBhZGRyLHNpemVfdCBzaXplLAorCQkJaW50IGRpcmVjdGlvbikKK3sKK30KKworLyogTWFwIGEgc2V0IG9mIGJ1ZmZlcnMgZGVzY3JpYmVkIGJ5IHNjYXR0ZXJsaXN0IGluIHN0cmVhbWluZworICogbW9kZSBmb3IgRE1BLiAgVGhpcyBpcyB0aGUgc2NhdHRlci1nYXRoZXIgdmVyc2lvbiBvZiB0aGUKKyAqIGFib3ZlIHBjaV9tYXBfc2luZ2xlIGludGVyZmFjZS4gIEhlcmUgdGhlIHNjYXR0ZXIgZ2F0aGVyIGxpc3QKKyAqIGVsZW1lbnRzIGFyZSBlYWNoIHRhZ2dlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBkbWEgYWRkcmVzcworICogYW5kIGxlbmd0aC4gIFRoZXkgYXJlIG9idGFpbmVkIHZpYSBzZ19kbWFfe2FkZHJlc3MsbGVuZ3RofShTRykuCisgKgorICogTk9URTogQW4gaW1wbGVtZW50YXRpb24gbWF5IGJlIGFibGUgdG8gdXNlIGEgc21hbGxlciBudW1iZXIgb2YKKyAqICAgICAgIERNQSBhZGRyZXNzL2xlbmd0aCBwYWlycyB0aGFuIHRoZXJlIGFyZSBTRyB0YWJsZSBlbGVtZW50cy4KKyAqICAgICAgIChmb3IgZXhhbXBsZSB2aWEgdmlydHVhbCBtYXBwaW5nIGNhcGFiaWxpdGllcykKKyAqICAgICAgIFRoZSByb3V0aW5lIHJldHVybnMgdGhlIG51bWJlciBvZiBhZGRyL2xlbmd0aCBwYWlycyBhY3R1YWxseQorICogICAgICAgdXNlZCwgYXQgbW9zdCBuZW50cy4KKyAqCisgKiBEZXZpY2Ugb3duZXJzaGlwIGlzc3VlcyBhcyBtZW50aW9uZWQgYWJvdmUgZm9yIHBjaV9tYXBfc2luZ2xlIGFyZQorICogdGhlIHNhbWUgaGVyZS4KKyAqLworaW50IG5vbW11X21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkgICAgICAgaW50IG5lbnRzLCBpbnQgZGlyZWN0aW9uKQoreworCWludCBpOworCisJQlVHX09OKGRpcmVjdGlvbiA9PSBETUFfTk9ORSk7CisgCWZvciAoaSA9IDA7IGkgPCBuZW50czsgaSsrICkgeworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnMgPSAmc2dbaV07CisJCUJVR19PTighcy0+cGFnZSk7CisJCXMtPmRtYV9hZGRyZXNzID0gdmlydF90b19idXMocGFnZV9hZGRyZXNzKHMtPnBhZ2UpICtzLT5vZmZzZXQpOworCQlpZiAoIWNoZWNrX2FkZHIoIm1hcF9zZyIsIGh3ZGV2LCBzLT5kbWFfYWRkcmVzcywgcy0+bGVuZ3RoKSkKKwkJCXJldHVybiAwOworCQlzLT5kbWFfbGVuZ3RoID0gcy0+bGVuZ3RoOworCX0KKwlyZXR1cm4gbmVudHM7Cit9CisKKy8qIFVubWFwIGEgc2V0IG9mIHN0cmVhbWluZyBtb2RlIERNQSB0cmFuc2xhdGlvbnMuCisgKiBBZ2FpbiwgY3B1IHJlYWQgcnVsZXMgY29uY2VybmluZyBjYWxscyBoZXJlIGFyZSB0aGUgc2FtZSBhcyBmb3IKKyAqIHBjaV91bm1hcF9zaW5nbGUoKSBhYm92ZS4KKyAqLwordm9pZCBub21tdV91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCSAgaW50IG5lbnRzLCBpbnQgZGlyKQoreworfQorCitzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIG5vbW11X2RtYV9vcHMgPSB7CisJLm1hcF9zaW5nbGUgPSBub21tdV9tYXBfc2luZ2xlLAorCS51bm1hcF9zaW5nbGUgPSBub21tdV91bm1hcF9zaW5nbGUsCisJLm1hcF9zZyA9IG5vbW11X21hcF9zZywKKwkudW5tYXBfc2cgPSBub21tdV91bm1hcF9zZywKKwkuaXNfcGh5cyA9IDEsCit9OworCit2b2lkIF9faW5pdCBub19pb21tdV9pbml0KHZvaWQpCit7CisJaWYgKGRtYV9vcHMpCisJCXJldHVybjsKKwlwcmludGsoS0VSTl9JTkZPICJQQ0ktRE1BOiBEaXNhYmxpbmcgSU9NTVUuXG4iKTsKKwlkbWFfb3BzID0gJm5vbW11X2RtYV9vcHM7CisJaWYgKGVuZF9wZm4gPiBNQVhfRE1BMzJfUEZOKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIldBUk5JTkcgbW9yZSB0aGFuIDRHQiBvZiBtZW1vcnkgYnV0IElPTU1VIG5vdCBjb21waWxlZCBpbi5cbiIKKwkJICAgICAgIEtFUk5fRVJSICJXQVJOSU5HIDMyYml0IFBDSSBtYXkgbWFsZnVuY3Rpb24uXG4iCisJCSAgICAgICBLRVJOX0VSUiAiWW91IG1pZ2h0IHdhbnQgdG8gZW5hYmxlIENPTkZJR19HQVJUX0lPTU1VXG4iKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLXN3aW90bGIuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktc3dpb3RsYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NjlhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLXN3aW90bGIuYwpAQCAtMCwwICsxLDQyIEBACisvKiBHbHVlIGNvZGUgdG8gbGliL3N3aW90bGIuYyAqLworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxhc20vcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vc3dpb3RsYi5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworaW50IHN3aW90bGIgX19yZWFkX21vc3RseTsKK0VYUE9SVF9TWU1CT0woc3dpb3RsYik7CisKK3N0cnVjdCBkbWFfbWFwcGluZ19vcHMgc3dpb3RsYl9kbWFfb3BzID0geworCS5tYXBwaW5nX2Vycm9yID0gc3dpb3RsYl9kbWFfbWFwcGluZ19lcnJvciwKKwkuYWxsb2NfY29oZXJlbnQgPSBzd2lvdGxiX2FsbG9jX2NvaGVyZW50LAorCS5mcmVlX2NvaGVyZW50ID0gc3dpb3RsYl9mcmVlX2NvaGVyZW50LAorCS5tYXBfc2luZ2xlID0gc3dpb3RsYl9tYXBfc2luZ2xlLAorCS51bm1hcF9zaW5nbGUgPSBzd2lvdGxiX3VubWFwX3NpbmdsZSwKKwkuc3luY19zaW5nbGVfZm9yX2NwdSA9IHN3aW90bGJfc3luY19zaW5nbGVfZm9yX2NwdSwKKwkuc3luY19zaW5nbGVfZm9yX2RldmljZSA9IHN3aW90bGJfc3luY19zaW5nbGVfZm9yX2RldmljZSwKKwkuc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdSA9IHN3aW90bGJfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdSwKKwkuc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZSA9IHN3aW90bGJfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZSwKKwkuc3luY19zZ19mb3JfY3B1ID0gc3dpb3RsYl9zeW5jX3NnX2Zvcl9jcHUsCisJLnN5bmNfc2dfZm9yX2RldmljZSA9IHN3aW90bGJfc3luY19zZ19mb3JfZGV2aWNlLAorCS5tYXBfc2cgPSBzd2lvdGxiX21hcF9zZywKKwkudW5tYXBfc2cgPSBzd2lvdGxiX3VubWFwX3NnLAorCS5kbWFfc3VwcG9ydGVkID0gTlVMTCwKK307CisKK3ZvaWQgcGNpX3N3aW90bGJfaW5pdCh2b2lkKQoreworCS8qIGRvbid0IGluaXRpYWxpemUgc3dpb3RsYiBpZiBpb21tdT1vZmYgKG5vX2lvbW11PTEpICovCisJaWYgKCFpb21tdV9hcGVydHVyZSAmJiAhbm9faW9tbXUgJiYKKwkgICAgKGVuZF9wZm4gPiBNQVhfRE1BMzJfUEZOIHx8IGZvcmNlX2lvbW11KSkKKwkgICAgICAgc3dpb3RsYiA9IDE7CisJaWYgKHN3aW90bGIpIHsKKwkJc3dpb3RsYl9pbml0KCk7CisJCXByaW50ayhLRVJOX0lORk8gIlBDSS1ETUE6IFVzaW5nIHNvZnR3YXJlIGJvdW5jZSBidWZmZXJpbmcgZm9yIElPIChTV0lPVExCKVxuIik7CisJCWRtYV9vcHMgPSAmc3dpb3RsYl9kbWFfb3BzOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDMwNjBlZDkuLjhkZWQ0MDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3Byb2Nlc3MuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTUwLDEzICs1MSwxMiBAQAogI2luY2x1ZGUgPGFzbS9kZXNjLmg+CiAjaW5jbHVkZSA8YXNtL3Byb3RvLmg+CiAjaW5jbHVkZSA8YXNtL2lhMzIuaD4KKyNpbmNsdWRlIDxhc20vaWRsZS5oPgogCiBhc21saW5rYWdlIGV4dGVybiB2b2lkIHJldF9mcm9tX2Zvcmsodm9pZCk7CiAKIHVuc2lnbmVkIGxvbmcga2VybmVsX3RocmVhZF9mbGFncyA9IENMT05FX1ZNIHwgQ0xPTkVfVU5UUkFDRUQ7CiAKLXN0YXRpYyBhdG9taWNfdCBobHRfY291bnRlciA9IEFUT01JQ19JTklUKDApOwotCiB1bnNpZ25lZCBsb25nIGJvb3Rfb3B0aW9uX2lkbGVfb3ZlcnJpZGUgPSAwOwogRVhQT1JUX1NZTUJPTChib290X29wdGlvbl9pZGxlX292ZXJyaWRlKTsKIApAQCAtNjYsMTkgKzY2LDQ5IEBACiB2b2lkICgqcG1faWRsZSkodm9pZCk7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgaW50LCBjcHVfaWRsZV9zdGF0ZSk7CiAKLXZvaWQgZGlzYWJsZV9obHQodm9pZCkKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKmlkbGVfbm90aWZpZXI7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlkbGVfbm90aWZpZXJfbG9jayk7CisKK3ZvaWQgaWRsZV9ub3RpZmllcl9yZWdpc3RlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm4pCiB7Ci0JYXRvbWljX2luYygmaGx0X2NvdW50ZXIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkbGVfbm90aWZpZXJfbG9jaywgZmxhZ3MpOworCW5vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZpZGxlX25vdGlmaWVyLCBuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGxlX25vdGlmaWVyX2xvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlkbGVfbm90aWZpZXJfcmVnaXN0ZXIpOworCit2b2lkIGlkbGVfbm90aWZpZXJfdW5yZWdpc3RlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm4pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWRsZV9ub3RpZmllcl9sb2NrLCBmbGFncyk7CisJbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmaWRsZV9ub3RpZmllciwgbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRsZV9ub3RpZmllcl9sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGlkbGVfbm90aWZpZXJfdW5yZWdpc3Rlcik7CisKK2VudW0gaWRsZV9zdGF0ZSB7IENQVV9JRExFLCBDUFVfTk9UX0lETEUgfTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShlbnVtIGlkbGVfc3RhdGUsIGlkbGVfc3RhdGUpID0gQ1BVX05PVF9JRExFOworCit2b2lkIGVudGVyX2lkbGUodm9pZCkKK3sKKwlfX2dldF9jcHVfdmFyKGlkbGVfc3RhdGUpID0gQ1BVX0lETEU7CisJbm90aWZpZXJfY2FsbF9jaGFpbigmaWRsZV9ub3RpZmllciwgSURMRV9TVEFSVCwgTlVMTCk7CiB9CiAKLUVYUE9SVF9TWU1CT0woZGlzYWJsZV9obHQpOwotCi12b2lkIGVuYWJsZV9obHQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdF9pZGxlKHZvaWQpCiB7Ci0JYXRvbWljX2RlYygmaGx0X2NvdW50ZXIpOworCV9fZ2V0X2NwdV92YXIoaWRsZV9zdGF0ZSkgPSBDUFVfTk9UX0lETEU7CisJbm90aWZpZXJfY2FsbF9jaGFpbigmaWRsZV9ub3RpZmllciwgSURMRV9FTkQsIE5VTEwpOwogfQogCi1FWFBPUlRfU1lNQk9MKGVuYWJsZV9obHQpOworLyogQ2FsbGVkIGZyb20gaW50ZXJydXB0cyB0byBzaWduaWZ5IGlkbGUgZW5kICovCit2b2lkIGV4aXRfaWRsZSh2b2lkKQoreworCWlmIChjdXJyZW50LT5waWQgfCByZWFkX3BkYShpcnFjb3VudCkpCisJCXJldHVybjsKKwlfX2V4aXRfaWRsZSgpOworfQogCiAvKgogICogV2UgdXNlIHRoaXMgaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgYmV0dGVyCkBAIC04OCwyMSArMTE4LDE2IEBACiB7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCi0JaWYgKCFhdG9taWNfcmVhZCgmaGx0X2NvdW50ZXIpKSB7Ci0JCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7Ci0JCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7Ci0JCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpIHsKLQkJCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQotCQkJCXNhZmVfaGFsdCgpOwotCQkJZWxzZQotCQkJCWxvY2FsX2lycV9lbmFibGUoKTsKLQkJfQotCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKLQl9IGVsc2UgewotCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQotCQkJY3B1X3JlbGF4KCk7CisJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKKwlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOworCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpIHsKKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJaWYgKCFuZWVkX3Jlc2NoZWQoKSkKKwkJCXNhZmVfaGFsdCgpOworCQllbHNlCisJCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJfQorCXNldF90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOwogfQogCiAvKgpAQCAtMjAxLDcgKzIyNiw5IEBACiAJCQkJaWRsZSA9IGRlZmF1bHRfaWRsZTsKIAkJCWlmIChjcHVfaXNfb2ZmbGluZShzbXBfcHJvY2Vzc29yX2lkKCkpKQogCQkJCXBsYXlfZGVhZCgpOworCQkJZW50ZXJfaWRsZSgpOwogCQkJaWRsZSgpOworCQkJX19leGl0X2lkbGUoKTsKIAkJfQogCiAJCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKQEAgLTQyNCw3ICs0NTEsNyBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqbWUgPSBjdXJyZW50OwogCiAJY2hpbGRyZWdzID0gKChzdHJ1Y3QgcHRfcmVncyAqKQotCQkJKFRIUkVBRF9TSVpFICsgKHVuc2lnbmVkIGxvbmcpIHAtPnRocmVhZF9pbmZvKSkgLSAxOworCQkJKFRIUkVBRF9TSVpFICsgdGFza19zdGFja19wYWdlKHApKSkgLSAxOwogCSpjaGlsZHJlZ3MgPSAqcmVnczsKIAogCWNoaWxkcmVncy0+cmF4ID0gMDsKQEAgLTQzNiw3ICs0NjMsNyBAQAogCXAtPnRocmVhZC5yc3AwID0gKHVuc2lnbmVkIGxvbmcpIChjaGlsZHJlZ3MrMSk7CiAJcC0+dGhyZWFkLnVzZXJyc3AgPSBtZS0+dGhyZWFkLnVzZXJyc3A7IAogCi0Jc2V0X3RpX3RocmVhZF9mbGFnKHAtPnRocmVhZF9pbmZvLCBUSUZfRk9SSyk7CisJc2V0X3Rza190aHJlYWRfZmxhZyhwLCBUSUZfRk9SSyk7CiAKIAlwLT50aHJlYWQuZnMgPSBtZS0+dGhyZWFkLmZzOwogCXAtPnRocmVhZC5ncyA9IG1lLT50aHJlYWQuZ3M7CkBAIC01NjMsNyArNTkwLDcgQEAKIAl3cml0ZV9wZGEob2xkcnNwLCBuZXh0LT51c2VycnNwKTsgCiAJd3JpdGVfcGRhKHBjdXJyZW50LCBuZXh0X3ApOyAKIAl3cml0ZV9wZGEoa2VybmVsc3RhY2ssCi0JICAgICh1bnNpZ25lZCBsb25nKW5leHRfcC0+dGhyZWFkX2luZm8gKyBUSFJFQURfU0laRSAtIFBEQV9TVEFDS09GRlNFVCk7CisJCSAgdGFza19zdGFja19wYWdlKG5leHRfcCkgKyBUSFJFQURfU0laRSAtIFBEQV9TVEFDS09GRlNFVCk7CiAKIAkvKgogCSAqIE5vdyBtYXliZSByZWxvYWQgdGhlIGRlYnVnIHJlZ2lzdGVycwpAQCAtNjc3LDcgKzcwNCw3IEBACiAKIAlpZiAoIXAgfHwgcCA9PSBjdXJyZW50IHx8IHAtPnN0YXRlPT1UQVNLX1JVTk5JTkcpCiAJCXJldHVybiAwOyAKLQlzdGFjayA9ICh1bnNpZ25lZCBsb25nKXAtPnRocmVhZF9pbmZvOyAKKwlzdGFjayA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShwKTsKIAlpZiAocC0+dGhyZWFkLnJzcCA8IHN0YWNrIHx8IHAtPnRocmVhZC5yc3AgPiBzdGFjaytUSFJFQURfU0laRSkKIAkJcmV0dXJuIDA7CiAJZnAgPSAqKHU2NCAqKShwLT50aHJlYWQucnNwKTsKQEAgLTc5NSw4ICs4MjIsNyBAQAogewogCXN0cnVjdCBwdF9yZWdzICpwcCwgcHRyZWdzOwogCi0JcHAgPSAoc3RydWN0IHB0X3JlZ3MgKikodHNrLT50aHJlYWQucnNwMCk7Ci0JLS1wcDsgCisJcHAgPSB0YXNrX3B0X3JlZ3ModHNrKTsKIAogCXB0cmVncyA9ICpwcDsgCiAJcHRyZWdzLmNzICY9IDB4ZmZmZjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wdHJhY2UuYwppbmRleCBhODdiNmNlLi41MzIwNTYyIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3B0cmFjZS5jCkBAIC0zNiw5ICszNiwxMiBAQAogICogaW4gZXhpdC5jIG9yIGluIHNpZ25hbC5jLgogICovCiAKLS8qIGRldGVybWluZXMgd2hpY2ggZmxhZ3MgdGhlIHVzZXIgaGFzIGFjY2VzcyB0by4gKi8KLS8qIDEgPSBhY2Nlc3MgMCA9IG5vIGFjY2VzcyAqLwotI2RlZmluZSBGTEFHX01BU0sgMHg0NGRkNVVMCisvKgorICogRGV0ZXJtaW5lcyB3aGljaCBmbGFncyB0aGUgdXNlciBoYXMgYWNjZXNzIHRvIFsxID0gYWNjZXNzLCAwID0gbm8gYWNjZXNzXS4KKyAqIFByb2hpYml0cyBjaGFuZ2luZyBJRCgyMSksIFZJUCgyMCksIFZJRigxOSksIFZNKDE3KSwgSU9QTCgxMi0xMyksIElGKDkpLgorICogQWxzbyBtYXNrcyByZXNlcnZlZCBiaXRzICg2My0yMiwgMTUsIDUsIDMsIDEpLgorICovCisjZGVmaW5lIEZMQUdfTUFTSyAweDU0ZGQ1VUwKIAogLyogc2V0J3MgdGhlIHRyYXAgZmxhZy4gKi8KICNkZWZpbmUgVFJBUF9GTEFHIDB4MTAwVUwKQEAgLTY0LDEyICs2Nyw2IEBACiAJcmV0dXJuICgqKCh1bnNpZ25lZCBsb25nICopc3RhY2spKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcHRfcmVncyAqZ2V0X2NoaWxkX3JlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQotewotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gKHZvaWQgKil0YXNrLT50aHJlYWQucnNwMDsKLQlyZXR1cm4gcmVncyAtIDE7Ci19Ci0KIC8qCiAgKiB0aGlzIHJvdXRpbmUgd2lsbCBwdXQgYSB3b3JkIG9uIHRoZSBwcm9jZXNzZXMgcHJpdmlsZWdlZCBzdGFjay4gCiAgKiB0aGUgb2Zmc2V0IGlzIGhvdyBmYXIgZnJvbSB0aGUgYmFzZSBhZGRyIGFzIHN0b3JlZCBpbiB0aGUgVFNTLiAgCkBAIC0xNjcsNyArMTY0LDcgQEAKIAogc3RhdGljIHZvaWQgc2V0X3NpbmdsZXN0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF9jaGlsZF9yZWdzKGNoaWxkKTsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CiAKIAkvKgogCSAqIEFsd2F5cyBzZXQgVElGX1NJTkdMRVNURVAgLSB0aGlzIGd1YXJhbnRlZXMgdGhhdApAQCAtMjA1LDcgKzIwMiw3IEBACiAKIAkvKiBCdXQgdG91Y2ggVEYgb25seSBpZiBpdCB3YXMgc2V0IGJ5IHVzLi4gKi8KIAlpZiAoY2hpbGQtPnB0cmFjZSAmIFBUX0RUUkFDRSkgewotCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF9jaGlsZF9yZWdzKGNoaWxkKTsKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwogCQlyZWdzLT5lZmxhZ3MgJj0gflRSQVBfRkxBRzsKIAkJY2hpbGQtPnB0cmFjZSAmPSB+UFRfRFRSQUNFOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9yZWJvb3QuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9yZWJvb3QuYwppbmRleCA3NTIzNWVkLi41NzExN2I4IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvcmVib290LmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3JlYm9vdC5jCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20va2RlYnVnLmg+CiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CkBAIC0xNTQsMTAgKzE1NSwxMSBAQAogCiB2b2lkIG1hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpCiB7Ci0JaWYgKCFyZWJvb3RfZm9yY2UpIHsKLQkJbWFjaGluZV9zaHV0ZG93bigpOwotCX0KLQlpZiAocG1fcG93ZXJfb2ZmKQorCWlmIChwbV9wb3dlcl9vZmYpIHsKKwkJaWYgKCFyZWJvb3RfZm9yY2UpIHsKKwkJCW1hY2hpbmVfc2h1dGRvd24oKTsKKwkJfQogCQlwbV9wb3dlcl9vZmYoKTsKKwl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3NldHVwLmMKaW5kZXggNjRjNDUzNC4uMjg4OTVjMCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3NldHVwLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvY3Jhc2hfZHVtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgpAQCAtNDMsNiArNDQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlIDxhc20vbXRyci5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC02MSw3ICs2NCw5IEBACiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hfYXBpYy5oPgogI2luY2x1ZGUgPGFzbS9udW1hLmg+CisjaW5jbHVkZSA8YXNtL3N3aW90bGIuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKyNpbmNsdWRlIDxhc20vZ2FydC1tYXBwaW5nLmg+CiAKIC8qCiAgKiBNYWNoaW5lIHNldHVwLi4KQEAgLTg2LDExICs5MSw2IEBACiAKIHVuc2lnbmVkIGxvbmcgc2F2ZWRfdmlkZW9fbW9kZTsKIAotI2lmZGVmIENPTkZJR19TV0lPVExCCi1pbnQgc3dpb3RsYjsKLUVYUE9SVF9TWU1CT0woc3dpb3RsYik7Ci0jZW5kaWYKLQogLyoKICAqIFNldHVwIG9wdGlvbnMKICAqLwpAQCAtMjc1LDEwICsyNzUsNyBAQAogewogCWNoYXIgYyA9ICcgJywgKnRvID0gY29tbWFuZF9saW5lLCAqZnJvbSA9IENPTU1BTkRfTElORTsKIAlpbnQgbGVuID0gMDsKLQotCS8qIFNhdmUgdW5wYXJzZWQgY29tbWFuZCBsaW5lIGNvcHkgZm9yIC9wcm9jL2NtZGxpbmUgKi8KLQltZW1jcHkoc2F2ZWRfY29tbWFuZF9saW5lLCBDT01NQU5EX0xJTkUsIENPTU1BTkRfTElORV9TSVpFKTsKLQlzYXZlZF9jb21tYW5kX2xpbmVbQ09NTUFORF9MSU5FX1NJWkUtMV0gPSAnXDAnOworCWludCB1c2VyZGVmID0gMDsKIAogCWZvciAoOzspIHsKIAkJaWYgKGMgIT0gJyAnKSAKQEAgLTM0NiwxMCArMzQzLDE0IEBACiAJCSAgICAhbWVtY21wKGZyb20sICJkaXNhYmxlYXBpYyIsIDExKSkKIAkJCWRpc2FibGVfYXBpYyA9IDE7CiAKLQkJaWYgKCFtZW1jbXAoZnJvbSwgIm5vYXBpYyIsIDYpKSAKKwkJLyogRG9uJ3QgY29uZnVzZSB3aXRoIG5vYXBpY3RpbWVyICovCisJCWlmICghbWVtY21wKGZyb20sICJub2FwaWMiLCA2KSAmJgorCQkJKGZyb21bNl0gPT0gJyAnIHx8IGZyb21bNl0gPT0gMCkpCiAJCQlza2lwX2lvYXBpY19zZXR1cCA9IDE7CiAKLQkJaWYgKCFtZW1jbXAoZnJvbSwgImFwaWMiLCA0KSkgeyAKKwkJLyogTWFrZSBzdXJlIHRvIG5vdCBjb25mdXNlIHdpdGggYXBpYz0gKi8KKwkJaWYgKCFtZW1jbXAoZnJvbSwgImFwaWMiLCA0KSAmJgorCQkJKGZyb21bNF0gPT0gJyAnIHx8IGZyb21bNF0gPT0gMCkpIHsKIAkJCXNraXBfaW9hcGljX3NldHVwID0gMDsKIAkJCWlvYXBpY19mb3JjZSA9IDE7CiAJCX0KQEAgLTM1NywxNiArMzU4LDM2IEBACiAJCWlmICghbWVtY21wKGZyb20sICJtZW09IiwgNCkpCiAJCQlwYXJzZV9tZW1vcHQoZnJvbSs0LCAmZnJvbSk7IAogCisJCWlmICghbWVtY21wKGZyb20sICJtZW1tYXA9IiwgNykpIHsKKwkJCS8qIGV4YWN0bWFwIG9wdGlvbiBpcyBmb3IgdXNlZCBkZWZpbmVkIG1lbW9yeSAqLworCQkJaWYgKCFtZW1jbXAoZnJvbSs3LCAiZXhhY3RtYXAiLCA4KSkgeworI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCisJCQkJLyogSWYgd2UgYXJlIGRvaW5nIGEgY3Jhc2ggZHVtcCwgd2UKKwkJCQkgKiBzdGlsbCBuZWVkIHRvIGtub3cgdGhlIHJlYWwgbWVtCisJCQkJICogc2l6ZSBiZWZvcmUgb3JpZ2luYWwgbWVtb3J5IG1hcCBpcworCQkJCSAqIHJlc2V0LgorCQkJCSAqLworCQkJCXNhdmVkX21heF9wZm4gPSBlODIwX2VuZF9vZl9yYW0oKTsKKyNlbmRpZgorCQkJCWZyb20gKz0gOCs3OworCQkJCWVuZF9wZm5fbWFwID0gMDsKKwkJCQllODIwLm5yX21hcCA9IDA7CisJCQkJdXNlcmRlZiA9IDE7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwYXJzZV9tZW1tYXBvcHQoZnJvbSs3LCAmZnJvbSk7CisJCQkJdXNlcmRlZiA9IDE7CisJCQl9CisJCX0KKwogI2lmZGVmIENPTkZJR19OVU1BCiAJCWlmICghbWVtY21wKGZyb20sICJudW1hPSIsIDUpKQogCQkJbnVtYV9zZXR1cChmcm9tKzUpOyAKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0dBUlRfSU9NTVUgCiAJCWlmICghbWVtY21wKGZyb20sImlvbW11PSIsNikpIHsgCiAJCQlpb21tdV9zZXR1cChmcm9tKzYpOyAKIAkJfQotI2VuZGlmCiAKIAkJaWYgKCFtZW1jbXAoZnJvbSwib29wcz1wYW5pYyIsIDEwKSkKIAkJCXBhbmljX29uX29vcHMgPSAxOwpAQCAtMzk1LDYgKzQxNiwxNCBAQAogCQl9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19QUk9DX1ZNQ09SRQorCQkvKiBlbGZjb3JlaGRyPSBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIGVsZiBjb3JlIGhlYWRlcgorCQkgKiBzdG9yZWQgYnkgdGhlIGNyYXNoZWQga2VybmVsLiBUaGlzIG9wdGlvbiB3aWxsIGJlIHBhc3NlZAorCQkgKiBieSBrZXhlYyBsb2FkZXIgdG8gdGhlIGNhcHR1cmUga2VybmVsLgorCQkgKi8KKwkJZWxzZSBpZighbWVtY21wKGZyb20sICJlbGZjb3JlaGRyPSIsIDExKSkKKwkJCWVsZmNvcmVoZHJfYWRkciA9IG1lbXBhcnNlKGZyb20rMTEsICZmcm9tKTsKKyNlbmRpZgogCW5leHRfY2hhcjoKIAkJYyA9ICooZnJvbSsrKTsKIAkJaWYgKCFjKQpAQCAtNDAzLDYgKzQzMiwxMCBAQAogCQkJYnJlYWs7CiAJCSoodG8rKykgPSBjOwogCX0KKwlpZiAodXNlcmRlZikgeworCQlwcmludGsoS0VSTl9JTkZPICJ1c2VyLWRlZmluZWQgcGh5c2ljYWwgUkFNIG1hcDpcbiIpOworCQllODIwX3ByaW50X21hcCgidXNlciIpOworCX0KIAkqdG8gPSAnXDAnOwogCSpjbWRsaW5lX3AgPSBjb21tYW5kX2xpbmU7CiB9CkBAIC00NDMsNiArNDc2LDggQEAKICAgICAgazhub3BzICsgMSArIDIgKyAzICsgNCArIDUgKyA2ICsgNywKIH07IAogCitleHRlcm4gY2hhciBfX3ZzeXNjYWxsXzA7CisKIC8qIFJlcGxhY2UgaW5zdHJ1Y3Rpb25zIHdpdGggYmV0dGVyIGFsdGVybmF0aXZlcyBmb3IgdGhpcyBDUFUgdHlwZS4KIAogICAgVGhpcyBydW5zIGJlZm9yZSBTTVAgaXMgaW5pdGlhbGl6ZWQgdG8gYXZvaWQgU01QIHByb2JsZW1zIHdpdGgKQEAgLTQ1NCwxMSArNDg5LDE3IEBACiAJc3RydWN0IGFsdF9pbnN0ciAqYTsgCiAJaW50IGRpZmYsIGksIGs7CiAJZm9yIChhID0gc3RhcnQ7ICh2b2lkICopYSA8IGVuZDsgYSsrKSB7IAorCQl1OCAqaW5zdHI7CisKIAkJaWYgKCFib290X2NwdV9oYXMoYS0+Y3B1aWQpKQogCQkJY29udGludWU7CiAKIAkJQlVHX09OKGEtPnJlcGxhY2VtZW50bGVuID4gYS0+aW5zdHJsZW4pOyAKLQkJX19pbmxpbmVfbWVtY3B5KGEtPmluc3RyLCBhLT5yZXBsYWNlbWVudCwgYS0+cmVwbGFjZW1lbnRsZW4pOyAKKwkJaW5zdHIgPSBhLT5pbnN0cjsKKwkJLyogdnN5c2NhbGwgY29kZSBpcyBub3QgbWFwcGVkIHlldC4gcmVzb2x2ZSBpdCBtYW51YWxseS4gKi8KKwkJaWYgKGluc3RyID49ICh1OCAqKVZTWVNDQUxMX1NUQVJUICYmIGluc3RyIDwgKHU4KilWU1lTQ0FMTF9FTkQpCisJCQlpbnN0ciA9IF9fdmEoaW5zdHIgLSAodTgqKVZTWVNDQUxMX1NUQVJUICsgKHU4KilfX3BhX3N5bWJvbCgmX192c3lzY2FsbF8wKSk7CisJCV9faW5saW5lX21lbWNweShpbnN0ciwgYS0+cmVwbGFjZW1lbnQsIGEtPnJlcGxhY2VtZW50bGVuKTsKIAkJZGlmZiA9IGEtPmluc3RybGVuIC0gYS0+cmVwbGFjZW1lbnRsZW47IAogCiAJCS8qIFBhZCB0aGUgcmVzdCB3aXRoIG5vcHMgKi8KQEAgLTQ2Niw3ICs1MDcsNyBAQAogCQkJayA9IGRpZmY7CiAJCQlpZiAoayA+IEFTTV9OT1BfTUFYKQogCQkJCWsgPSBBU01fTk9QX01BWDsKLQkJCV9faW5saW5lX21lbWNweShhLT5pbnN0ciArIGksIGs4X25vcHNba10sIGspOyAKKwkJCV9faW5saW5lX21lbWNweShpbnN0ciArIGksIGs4X25vcHNba10sIGspOwogCQl9IAogCX0KIH0gCkBAIC02NzAsNiArNzExLDggQEAKIAlhY3BpX2Jvb3RfaW5pdCgpOwogI2VuZGlmCiAKKwlpbml0X2NwdV90b19ub2RlKCk7CisKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIAkvKgogCSAqIGdldCBib290LXRpbWUgU01QIGNvbmZpZ3VyYXRpb246CkBAIC04MzQsNyArODc3LDYgQEAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfYW1kKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKIAlpbnQgcjsKLQlpbnQgbGV2ZWw7CiAKICNpZmRlZiBDT05GSUdfU01QCiAJdW5zaWduZWQgbG9uZyB2YWx1ZTsKQEAgLTg1NywxMSArODk5LDYgQEAKIAkgICAzRE5vdyBpcyBJRGQgYnkgYml0IDMxIGluIGV4dGVuZGVkIENQVUlEICgxKjMyKzMxKSBhbnl3YXkgKi8KIAljbGVhcl9iaXQoMCozMiszMSwgJmMtPng4Nl9jYXBhYmlsaXR5KTsKIAkKLQkvKiBDLXN0ZXBwaW5nIEs4PyAqLwotCWxldmVsID0gY3B1aWRfZWF4KDEpOwotCWlmICgobGV2ZWwgPj0gMHgwZjQ4ICYmIGxldmVsIDwgMHgwZjUwKSB8fCBsZXZlbCA+PSAweDBmNTgpCi0JCXNldF9iaXQoWDg2X0ZFQVRVUkVfSzhfQywgJmMtPng4Nl9jYXBhYmlsaXR5KTsKLQogCXIgPSBnZXRfbW9kZWxfbmFtZShjKTsKIAlpZiAoIXIpIHsgCiAJCXN3aXRjaCAoYy0+eDg2KSB7IApAQCAtODc0LDYgKzkxMSwxMCBAQAogCX0gCiAJZGlzcGxheV9jYWNoZWluZm8oYyk7CiAKKwkvKiBjLT54ODZfcG93ZXIgaXMgODAwMF8wMDA3IGVkeC4gQml0IDggaXMgY29uc3RhbnQgVFNDICovCisJaWYgKGMtPng4Nl9wb3dlciAmICgxPDw4KSkKKwkJc2V0X2JpdChYODZfRkVBVFVSRV9DT05TVEFOVF9UU0MsICZjLT54ODZfY2FwYWJpbGl0eSk7CisKIAlpZiAoYy0+ZXh0ZW5kZWRfY3B1aWRfbGV2ZWwgPj0gMHg4MDAwMDAwOCkgewogCQljLT54ODZfbWF4X2NvcmVzID0gKGNwdWlkX2VjeCgweDgwMDAwMDA4KSAmIDB4ZmYpICsgMTsKIAkJaWYgKGMtPng4Nl9tYXhfY29yZXMgJiAoYy0+eDg2X21heF9jb3JlcyAtIDEpKQpAQCAtOTkyLDggKzEwMzMsMTAgQEAKIAogCWlmIChjLT54ODYgPT0gMTUpCiAJCWMtPng4Nl9jYWNoZV9hbGlnbm1lbnQgPSBjLT54ODZfY2xmbHVzaF9zaXplICogMjsKLQlpZiAoYy0+eDg2ID49IDE1KQorCWlmICgoYy0+eDg2ID09IDB4ZiAmJiBjLT54ODZfbW9kZWwgPj0gMHgwMykgfHwKKwkgICAgKGMtPng4NiA9PSAweDYgJiYgYy0+eDg2X21vZGVsID49IDB4MGUpKQogCQlzZXRfYml0KFg4Nl9GRUFUVVJFX0NPTlNUQU5UX1RTQywgJmMtPng4Nl9jYXBhYmlsaXR5KTsKKwlzZXRfYml0KFg4Nl9GRUFUVVJFX1NZTkNfUkRUU0MsICZjLT54ODZfY2FwYWJpbGl0eSk7CiAgCWMtPng4Nl9tYXhfY29yZXMgPSBpbnRlbF9udW1fY3B1X2NvcmVzKGMpOwogCiAJc3JhdF9kZXRlY3Rfbm9kZSgpOwpAQCAtMTE5Miw3ICsxMjM1LDcgQEAKIAkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKIAkJTlVMTCwgTlVMTCwgTlVMTCwgInN5c2NhbGwiLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAibngiLCBOVUxMLCAibW14ZXh0IiwgTlVMTCwKLQkJTlVMTCwgImZ4c3Jfb3B0IiwgTlVMTCwgTlVMTCwgTlVMTCwgImxtIiwgIjNkbm93ZXh0IiwgIjNkbm93IiwKKwkJTlVMTCwgImZ4c3Jfb3B0IiwgInJkdHNjcCIsIE5VTEwsIE5VTEwsICJsbSIsICIzZG5vd2V4dCIsICIzZG5vdyIsCiAKIAkJLyogVHJhbnNtZXRhLWRlZmluZWQgKi8KIAkJInJlY292ZXJ5IiwgImxvbmdydW4iLCBOVUxMLCAibHJ0aSIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCkBAIC0xMjIwLDcgKzEyNjMsNyBAQAogCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogCiAJCS8qIEFNRC1kZWZpbmVkICgjMikgKi8KLQkJImxhaGZfbG0iLCAiY21wX2xlZ2FjeSIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJsYWhmX2xtIiwgImNtcF9sZWdhY3kiLCAic3ZtIiwgTlVMTCwgImNyOF9sZWdhY3kiLCBOVUxMLCBOVUxMLCBOVUxMLAogCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLApAQCAtMTIzMSw3ICsxMjc0LDkgQEAKIAkJInZpZCIsICAvKiB2b2x0YWdlIGlkIGNvbnRyb2wgKi8KIAkJInR0cCIsICAvKiB0aGVybWFsIHRyaXAgKi8KIAkJInRtIiwKLQkJInN0YyIKKwkJInN0YyIsCisJCU5VTEwsCisJCS8qIG5vdGhpbmcgKi8JLyogY29uc3RhbnRfdHNjIC0gbW92ZWQgdG8gZmxhZ3MgKi8KIAl9OwogCiAKQEAgLTEzMTEsOCArMTM1NiwxMSBAQAogCQl1bnNpZ25lZCBpOwogCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgCiAJCQlpZiAoYy0+eDg2X3Bvd2VyICYgKDEgPDwgaSkpIHsKLQkJCQlpZiAoaSA8IEFSUkFZX1NJWkUoeDg2X3Bvd2VyX2ZsYWdzKSkKLQkJCQkJc2VxX3ByaW50ZihtLCAiICVzIiwgeDg2X3Bvd2VyX2ZsYWdzW2ldKTsKKwkJCQlpZiAoaSA8IEFSUkFZX1NJWkUoeDg2X3Bvd2VyX2ZsYWdzKSAmJgorCQkJCQl4ODZfcG93ZXJfZmxhZ3NbaV0pCisJCQkJCXNlcV9wcmludGYobSwgIiVzJXMiLAorCQkJCQkJeDg2X3Bvd2VyX2ZsYWdzW2ldWzBdPyIgIjoiIiwKKwkJCQkJCXg4Nl9wb3dlcl9mbGFnc1tpXSk7CiAJCQkJZWxzZQogCQkJCQlzZXFfcHJpbnRmKG0sICIgWyVkXSIsIGkpOwogCQkJfQpAQCAtMTM0NCwzICsxMzkyLDExIEBACiAJLnN0b3AgPQljX3N0b3AsCiAJLnNob3cgPQlzaG93X2NwdWluZm8sCiB9OworCitzdGF0aWMgaW50IF9faW5pdCBydW5fZG1pX3NjYW4odm9pZCkKK3sKKwlkbWlfc2Nhbl9tYWNoaW5lKCk7CisJcmV0dXJuIDA7Cit9Citjb3JlX2luaXRjYWxsKHJ1bl9kbWlfc2Nhbik7CisKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cDY0LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXA2NC5jCmluZGV4IDA2ZGMzNTQuLjcwZjFiYjggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cDY0LmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3NldHVwNjQuYwpAQCAtMzAsMTQgKzMwLDE1IEBACiAKIGNwdW1hc2tfdCBjcHVfaW5pdGlhbGl6ZWQgX19jcHVpbml0ZGF0YSA9IENQVV9NQVNLX05PTkU7CiAKLXN0cnVjdCB4ODY2NF9wZGEgY3B1X3BkYVtOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOyAKK3N0cnVjdCB4ODY2NF9wZGEgKl9jcHVfcGRhW05SX0NQVVNdIF9fcmVhZF9tb3N0bHk7CitzdHJ1Y3QgeDg2NjRfcGRhIGJvb3RfY3B1X3BkYVtOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOwogCiBzdHJ1Y3QgZGVzY19wdHIgaWR0X2Rlc2NyID0geyAyNTYgKiAxNiwgKHVuc2lnbmVkIGxvbmcpIGlkdF90YWJsZSB9OyAKIAogY2hhciBib290X2NwdV9zdGFja1tJUlFTVEFDS1NJWkVdIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIi5ic3MucGFnZV9hbGlnbmVkIikpKTsKIAogdW5zaWduZWQgbG9uZyBfX3N1cHBvcnRlZF9wdGVfbWFzayBfX3JlYWRfbW9zdGx5ID0gfjBVTDsKLXN0YXRpYyBpbnQgZG9fbm90X254IF9faW5pdGRhdGEgPSAwOworc3RhdGljIGludCBkb19ub3RfbnggX19jcHVpbml0ZGF0YSA9IDA7CiAKIC8qIG5vZXhlYz1vbnxvZmYKIENvbnRyb2wgbm9uIGV4ZWN1dGFibGUgbWFwcGluZ3MgZm9yIDY0Yml0IHByb2Nlc3Nlcy4KQEAgLTExMCwxOCArMTExLDE4IEBACiAJCX0KIAkJaWYgKCFwdHIpCiAJCQlwYW5pYygiQ2Fubm90IGFsbG9jYXRlIGNwdSBkYXRhIGZvciBDUFUgJWRcbiIsIGkpOwotCQljcHVfcGRhW2ldLmRhdGFfb2Zmc2V0ID0gcHRyIC0gX19wZXJfY3B1X3N0YXJ0OworCQljcHVfcGRhKGkpLT5kYXRhX29mZnNldCA9IHB0ciAtIF9fcGVyX2NwdV9zdGFydDsKIAkJbWVtY3B5KHB0ciwgX19wZXJfY3B1X3N0YXJ0LCBfX3Blcl9jcHVfZW5kIC0gX19wZXJfY3B1X3N0YXJ0KTsKIAl9CiB9IAogCiB2b2lkIHBkYV9pbml0KGludCBjcHUpCiB7IAotCXN0cnVjdCB4ODY2NF9wZGEgKnBkYSA9ICZjcHVfcGRhW2NwdV07CisJc3RydWN0IHg4NjY0X3BkYSAqcGRhID0gY3B1X3BkYShjcHUpOwogCiAJLyogU2V0dXAgdXAgZGF0YSB0aGF0IG1heSBiZSBuZWVkZWQgaW4gX19nZXRfZnJlZV9wYWdlcyBlYXJseSAqLwogCWFzbSB2b2xhdGlsZSgibW92bCAlMCwlJWZzIDsgbW92bCAlMCwlJWdzIiA6OiAiciIgKDApKTsgCi0Jd3Jtc3JsKE1TUl9HU19CQVNFLCBjcHVfcGRhICsgY3B1KTsKKwl3cm1zcmwoTVNSX0dTX0JBU0UsIHBkYSk7CiAKIAlwZGEtPmNwdW51bWJlciA9IGNwdTsgCiAJcGRhLT5pcnFjb3VudCA9IC0xOwpAQCAtMTQ1LDcgKzE0Niw3IEBACiAJcGRhLT5pcnFzdGFja3B0ciArPSBJUlFTVEFDS1NJWkUtNjQ7CiB9IAogCi1jaGFyIGJvb3RfZXhjZXB0aW9uX3N0YWNrc1tOX0VYQ0VQVElPTl9TVEFDS1MgKiBFWENFUFRJT05fU1RLU1pdIAorY2hhciBib290X2V4Y2VwdGlvbl9zdGFja3NbKE5fRVhDRVBUSU9OX1NUQUNLUyAtIDEpICogRVhDRVBUSU9OX1NUS1NaICsgREVCVUdfU1RLU1pdCiBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCIuYnNzLnBhZ2VfYWxpZ25lZCIpKSk7CiAKIC8qIE1heSBub3QgYmUgbWFya2VkIF9faW5pdDogdXNlZCBieSBzb2Z0d2FyZSBzdXNwZW5kICovCkBAIC0yMTMsMjMgKzIxNCwxNCBAQAogCSAqIEluaXRpYWxpemUgdGhlIHBlci1DUFUgR0RUIHdpdGggdGhlIGJvb3QgR0RULAogCSAqIGFuZCBzZXQgdXAgdGhlIEdEVCBkZXNjcmlwdG9yOgogCSAqLwotCWlmIChjcHUpIHsKLQkJbWVtY3B5KGNwdV9nZHRfdGFibGVbY3B1XSwgY3B1X2dkdF90YWJsZVswXSwgR0RUX1NJWkUpOwotCX0JCisJaWYgKGNwdSkKKyAJCW1lbWNweShjcHVfZ2R0KGNwdSksIGNwdV9nZHRfdGFibGUsIEdEVF9TSVpFKTsKIAogCWNwdV9nZHRfZGVzY3JbY3B1XS5zaXplID0gR0RUX1NJWkU7Ci0JY3B1X2dkdF9kZXNjcltjcHVdLmFkZHJlc3MgPSAodW5zaWduZWQgbG9uZyljcHVfZ2R0X3RhYmxlW2NwdV07CiAJYXNtIHZvbGF0aWxlKCJsZ2R0ICUwIiA6OiAibSIgKGNwdV9nZHRfZGVzY3JbY3B1XSkpOwogCWFzbSB2b2xhdGlsZSgibGlkdCAlMCIgOjogIm0iIChpZHRfZGVzY3IpKTsKIAotCW1lbWNweShtZS0+dGhyZWFkLnRsc19hcnJheSwgY3B1X2dkdF90YWJsZVtjcHVdLCBHRFRfRU5UUllfVExTX0VOVFJJRVMgKiA4KTsKLQotCS8qCi0JICogRGVsZXRlIE5UCi0JICovCi0KLQlhc20gdm9sYXRpbGUoInB1c2hmcSA7IHBvcHEgJSVyYXggOyBidHIgJDE0LCUlcmF4IDsgcHVzaHEgJSVyYXggOyBwb3BmcSIgOjo6ICJlYXgiKTsKLQorCW1lbXNldChtZS0+dGhyZWFkLnRsc19hcnJheSwgMCwgR0RUX0VOVFJZX1RMU19FTlRSSUVTICogOCk7CiAJc3lzY2FsbF9pbml0KCk7CiAKIAl3cm1zcmwoTVNSX0ZTX0JBU0UsIDApOwpAQCAtMjQzLDEzICsyMzUsMjcgQEAKIAkgKi8KIAlmb3IgKHYgPSAwOyB2IDwgTl9FWENFUFRJT05fU1RBQ0tTOyB2KyspIHsKIAkJaWYgKGNwdSkgewotCQkJZXN0YWNrcyA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlDLCAKLQkJCQkJCSAgIEVYQ0VQVElPTl9TVEFDS19PUkRFUik7CisJCQlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG9yZGVyW05fRVhDRVBUSU9OX1NUQUNLU10gPSB7CisJCQkJWzAgLi4uIE5fRVhDRVBUSU9OX1NUQUNLUyAtIDFdID0gRVhDRVBUSU9OX1NUQUNLX09SREVSLAorCQkJCVtERUJVR19TVEFDSyAtIDFdID0gREVCVUdfU1RBQ0tfT1JERVIKKwkJCX07CisKKwkJCWVzdGFja3MgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0FUT01JQywgb3JkZXJbdl0pOwogCQkJaWYgKCFlc3RhY2tzKQogCQkJCXBhbmljKCJDYW5ub3QgYWxsb2NhdGUgZXhjZXB0aW9uIHN0YWNrICVsZCAlZFxuIiwKIAkJCQkgICAgICB2LCBjcHUpOyAKIAkJfQotCQllc3RhY2tzICs9IEVYQ0VQVElPTl9TVEtTWjsKKwkJc3dpdGNoICh2ICsgMSkgeworI2lmIERFQlVHX1NUS1NaID4gRVhDRVBUSU9OX1NUS1NaCisJCWNhc2UgREVCVUdfU1RBQ0s6CisJCQljcHVfcGRhW2NwdV0uZGVidWdzdGFjayA9ICh1bnNpZ25lZCBsb25nKWVzdGFja3M7CisJCQllc3RhY2tzICs9IERFQlVHX1NUS1NaOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCWVzdGFja3MgKz0gRVhDRVBUSU9OX1NUS1NaOworCQkJYnJlYWs7CisJCX0KIAkJdC0+aXN0W3ZdID0gKHVuc2lnbmVkIGxvbmcpZXN0YWNrczsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9zbXAuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zbXAuYwppbmRleCBjZmMzZDlkLi4xOWVmMDEyIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3NtcC5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL3Byb3RvLmg+CiAjaW5jbHVkZSA8YXNtL2FwaWNkZWYuaD4KKyNpbmNsdWRlIDxhc20vaWRsZS5oPgogCiAvKgogICoJU21hcnRlciBTTVAgZmx1c2hpbmcgbWFjcm9zLiAKQEAgLTI4MCwxMSArMjgxLDYgQEAKIAlvbl9lYWNoX2NwdShkb19mbHVzaF90bGJfYWxsLCBOVUxMLCAxLCAxKTsKIH0KIAotdm9pZCBzbXBfa2RiX3N0b3Aodm9pZCkKLXsKLQlzZW5kX0lQSV9hbGxidXRzZWxmKEtEQl9WRUNUT1IpOwotfQotCiAvKgogICogdGhpcyBmdW5jdGlvbiBzZW5kcyBhICdyZXNjaGVkdWxlJyBJUEkgdG8gYW5vdGhlciBDUFUuCiAgKiBpdCBnb2VzIHN0cmFpZ2h0IHRocm91Z2ggYW5kIHdhc3RlcyBubyB0aW1lIHNlcmlhbGl6aW5nCkBAIC01MTIsNiArNTA4LDcgQEAKIAkvKgogCSAqIEF0IHRoaXMgcG9pbnQgdGhlIGluZm8gc3RydWN0dXJlIG1heSBiZSBvdXQgb2Ygc2NvcGUgdW5sZXNzIHdhaXQ9PTEKIAkgKi8KKwlleGl0X2lkbGUoKTsKIAlpcnFfZW50ZXIoKTsKIAkoKmZ1bmMpKGluZm8pOwogCWlycV9leGl0KCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3NtcGJvb3QuYwppbmRleCBlY2JkN2I4Li5hMjg3NTZlIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zbXBib290LmMKQEAgLTMzNSw3ICszMzUsMTMgQEAKIAogc3RhdGljIHZvaWQgX19jcHVpbml0IHRzY19zeW5jX3dhaXQodm9pZCkKIHsKLQlpZiAobm90c2NzeW5jIHx8ICFjcHVfaGFzX3RzYykKKwkvKgorCSAqIFdoZW4gdGhlIENQVSBoYXMgc3luY2hyb25pemVkIFRTQ3MgYXNzdW1lIHRoZSBCSU9TCisgIAkgKiBvciB0aGUgaGFyZHdhcmUgYWxyZWFkeSBzeW5jZWQuICBPdGhlcndpc2Ugd2UgY291bGQKKwkgKiBtZXNzIHVwIGEgcG9zc2libGUgcGVyZmVjdCBzeW5jaHJvbml6YXRpb24gd2l0aCBhCisJICogbm90LXF1aXRlLXBlcmZlY3QgYWxnb3JpdGhtLgorCSAqLworCWlmIChub3RzY3N5bmMgfHwgIWNwdV9oYXNfdHNjIHx8ICF1bnN5bmNocm9uaXplZF90c2MoKSkKIAkJcmV0dXJuOwogCXN5bmNfdHNjKDApOwogfQpAQCAtNjQ2LDYgKzY1Miw3IEBACiAJCXNlbmRfc3RhdHVzID0gYXBpY19yZWFkKEFQSUNfSUNSKSAmIEFQSUNfSUNSX0JVU1k7CiAJfSB3aGlsZSAoc2VuZF9zdGF0dXMgJiYgKHRpbWVvdXQrKyA8IDEwMDApKTsKIAorCW1iKCk7CiAJYXRvbWljX3NldCgmaW5pdF9kZWFzc2VydGVkLCAxKTsKIAogCW51bV9zdGFydHMgPSAyOwpAQCAtNjU5LDcgKzY2Niw2IEBACiAKIAlmb3IgKGogPSAxOyBqIDw9IG51bV9zdGFydHM7IGorKykgewogCQlEcHJpbnRrKCJTZW5kaW5nIFNUQVJUVVAgIyVkLlxuIixqKTsKLQkJYXBpY19yZWFkX2Fyb3VuZChBUElDX1NQSVYpOwogCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKIAkJYXBpY19yZWFkKEFQSUNfRVNSKTsKIAkJRHByaW50aygiQWZ0ZXIgYXBpY193cml0ZS5cbiIpOwpAQCAtNjk4LDcgKzcwNCw2IEBACiAJCSAqIER1ZSB0byB0aGUgUGVudGl1bSBlcnJhdHVtIDNBUC4KIAkJICovCiAJCWlmIChtYXhsdnQgPiAzKSB7Ci0JCQlhcGljX3JlYWRfYXJvdW5kKEFQSUNfU1BJVik7CiAJCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKIAkJfQogCQlhY2NlcHRfc3RhdHVzID0gKGFwaWNfcmVhZChBUElDX0VTUikgJiAweEVGKTsKQEAgLTc0MywxMSArNzQ4LDM1IEBACiAJfTsKIAlERUNMQVJFX1dPUksod29yaywgZG9fZm9ya19pZGxlLCAmY19pZGxlKTsKIAorCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2R0cyBvZiBzZWNvbmRhcnkgY3B1cy4gSG90cGx1ZyBpcyBjb25zaWRlcmVkICovCisJaWYgKCFjcHVfZ2R0X2Rlc2NyW2NwdV0uYWRkcmVzcyAmJgorCQkhKGNwdV9nZHRfZGVzY3JbY3B1XS5hZGRyZXNzID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBhbGxvY2F0ZSBHRFQgZm9yIENQVSAlZFxuIiwgY3B1KTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIEFsbG9jYXRlIG5vZGUgbG9jYWwgbWVtb3J5IGZvciBBUCBwZGFzICovCisJaWYgKGNwdV9wZGEoY3B1KSA9PSAmYm9vdF9jcHVfcGRhW2NwdV0pIHsKKwkJc3RydWN0IHg4NjY0X3BkYSAqbmV3cGRhLCAqcGRhOworCQlpbnQgbm9kZSA9IGNwdV90b19ub2RlKGNwdSk7CisJCXBkYSA9IGNwdV9wZGEoY3B1KTsKKwkJbmV3cGRhID0ga21hbGxvY19ub2RlKHNpemVvZiAoc3RydWN0IHg4NjY0X3BkYSksIEdGUF9BVE9NSUMsCisJCQkJICAgICAgbm9kZSk7CisJCWlmIChuZXdwZGEpIHsKKwkJCW1lbWNweShuZXdwZGEsIHBkYSwgc2l6ZW9mIChzdHJ1Y3QgeDg2NjRfcGRhKSk7CisJCQljcHVfcGRhKGNwdSkgPSBuZXdwZGE7CisJCX0gZWxzZQorCQkJcHJpbnRrKEtFUk5fRVJSCisJCSJDb3VsZCBub3QgYWxsb2NhdGUgbm9kZSBsb2NhbCBQREEgZm9yIENQVSAlZCBvbiBub2RlICVkXG4iLAorCQkJCWNwdSwgbm9kZSk7CisJfQorCisKIAljX2lkbGUuaWRsZSA9IGdldF9pZGxlX2Zvcl9jcHUoY3B1KTsKIAogCWlmIChjX2lkbGUuaWRsZSkgewogCQljX2lkbGUuaWRsZS0+dGhyZWFkLnJzcCA9ICh1bnNpZ25lZCBsb25nKSAoKChzdHJ1Y3QgcHRfcmVncyAqKQotCQkJKFRIUkVBRF9TSVpFICsgKHVuc2lnbmVkIGxvbmcpIGNfaWRsZS5pZGxlLT50aHJlYWRfaW5mbykpIC0gMSk7CisJCQkoVEhSRUFEX1NJWkUgKyAgdGFza19zdGFja19wYWdlKGNfaWRsZS5pZGxlKSkpIC0gMSk7CiAJCWluaXRfaWRsZShjX2lkbGUuaWRsZSwgY3B1KTsKIAkJZ290byBkb19yZXN0OwogCX0KQEAgLTc3OCwxNCArODA3LDE0IEBACiAKIGRvX3Jlc3Q6CiAKLQljcHVfcGRhW2NwdV0ucGN1cnJlbnQgPSBjX2lkbGUuaWRsZTsKKwljcHVfcGRhKGNwdSktPnBjdXJyZW50ID0gY19pZGxlLmlkbGU7CiAKIAlzdGFydF9yaXAgPSBzZXR1cF90cmFtcG9saW5lKCk7CiAKIAlpbml0X3JzcCA9IGNfaWRsZS5pZGxlLT50aHJlYWQucnNwOwogCXBlcl9jcHUoaW5pdF90c3MsY3B1KS5yc3AwID0gaW5pdF9yc3A7CiAJaW5pdGlhbF9jb2RlID0gc3RhcnRfc2Vjb25kYXJ5OwotCWNsZWFyX3RpX3RocmVhZF9mbGFnKGNfaWRsZS5pZGxlLT50aHJlYWRfaW5mbywgVElGX0ZPUkspOworCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjX2lkbGUuaWRsZSwgVElGX0ZPUkspOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiQm9vdGluZyBwcm9jZXNzb3IgJWQvJWQgQVBJQyAweCV4XG4iLCBjcHUsCiAJCWNwdXNfd2VpZ2h0KGNwdV9wcmVzZW50X21hcCksCkBAIC04MTEsMTEgKzg0MCw4IEBACiAJLyoKIAkgKiBCZSBwYXJhbm9pZCBhYm91dCBjbGVhcmluZyBBUElDIGVycm9ycy4KIAkgKi8KLQlpZiAoQVBJQ19JTlRFR1JBVEVEKGFwaWNfdmVyc2lvblthcGljaWRdKSkgewotCQlhcGljX3JlYWRfYXJvdW5kKEFQSUNfU1BJVik7Ci0JCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOwotCQlhcGljX3JlYWQoQVBJQ19FU1IpOwotCX0KKwlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKKwlhcGljX3JlYWQoQVBJQ19FU1IpOwogCiAJLyoKIAkgKiBTdGF0dXMgaXMgbm93IGNsZWFuCkBAIC05MjcsOCArOTUzLDggQEAKICAqCiAgKiBUaHJlZSB3YXlzIHRvIGZpbmQgb3V0IHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBob3RwbHVnIENQVXM6CiAgKiAtIElmIHRoZSBCSU9TIHNwZWNpZmllZCBkaXNhYmxlZCBDUFVzIGluIEFDUEkvbXB0YWJsZXMgdXNlIHRoYXQuCi0gKiAtIG90aGVyd2lzZSB1c2UgaGFsZiBvZiB0aGUgYXZhaWxhYmxlIENQVXMgb3IgMiwgd2hhdGV2ZXIgaXMgbW9yZS4KICAqIC0gVGhlIHVzZXIgY2FuIG92ZXJ3cml0ZSBpdCB3aXRoIGFkZGl0aW9uYWxfY3B1cz1OVU0KKyAqIC0gT3RoZXJ3aXNlIGRvbid0IHJlc2VydmUgYWRkaXRpb25hbCBDUFVzLgogICogV2UgZG8gdGhpcyBiZWNhdXNlIGFkZGl0aW9uYWwgQ1BVcyB3YXN0ZSBhIGxvdCBvZiBtZW1vcnkuCiAgKiAtQUsKICAqLwpAQCAtOTM4LDEzICs5NjQsMTAgQEAKIAlpbnQgcG9zc2libGU7CiAKICAJaWYgKGFkZGl0aW9uYWxfY3B1cyA9PSAtMSkgewotIAkJaWYgKGRpc2FibGVkX2NwdXMgPiAwKSB7CisgCQlpZiAoZGlzYWJsZWRfY3B1cyA+IDApCiAgCQkJYWRkaXRpb25hbF9jcHVzID0gZGlzYWJsZWRfY3B1czsKLSAJCX0gZWxzZSB7Ci0gCQkJYWRkaXRpb25hbF9jcHVzID0gbnVtX3Byb2Nlc3NvcnMgLyAyOwotIAkJCWlmIChhZGRpdGlvbmFsX2NwdXMgPT0gMCkKLSAJCQkJYWRkaXRpb25hbF9jcHVzID0gMjsKLSAJCX0KKyAJCWVsc2UKKwkJCWFkZGl0aW9uYWxfY3B1cyA9IDA7CiAgCX0KIAlwb3NzaWJsZSA9IG51bV9wcm9jZXNzb3JzICsgYWRkaXRpb25hbF9jcHVzOwogCWlmIChwb3NzaWJsZSA+IE5SX0NQVVMpIApAQCAtOTk2LDcgKzEwMTksNyBAQAogCS8qCiAJICogSWYgd2UgY291bGRuJ3QgZmluZCBhIGxvY2FsIEFQSUMsIHRoZW4gZ2V0IG91dCBvZiBoZXJlIG5vdyEKIAkgKi8KLQlpZiAoQVBJQ19JTlRFR1JBVEVEKGFwaWNfdmVyc2lvbltib290X2NwdV9pZF0pICYmICFjcHVfaGFzX2FwaWMpIHsKKwlpZiAoIWNwdV9oYXNfYXBpYykgewogCQlwcmludGsoS0VSTl9FUlIgIkJJT1MgYnVnLCBsb2NhbCBBUElDICMlZCBub3QgZGV0ZWN0ZWQhLi4uXG4iLAogCQkJYm9vdF9jcHVfaWQpOwogCQlwcmludGsoS0VSTl9FUlIgIi4uLiBmb3JjaW5nIHVzZSBvZiBkdW1teSBBUElDIGVtdWxhdGlvbi4gKHRlbGwgeW91ciBodyB2ZW5kb3IpXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9zdXNwZW5kLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc3VzcGVuZC5jCmluZGV4IGZkMmJlZjcuLmVjYmQzNGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9zdXNwZW5kLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3N1c3BlbmQuYwpAQCAtMTIwLDcgKzEyMCw3IEBACiAKIAlzZXRfdHNzX2Rlc2MoY3B1LHQpOwkvKiBUaGlzIGp1c3QgbW9kaWZpZXMgbWVtb3J5OyBzaG91bGQgbm90IGJlIG5lY2Nlc3NhcnkuIEJ1dC4uLiBUaGlzIGlzIG5lY2Nlc3NhcnksIGJlY2F1c2UgMzg2IGhhcmR3YXJlIGhhcyBjb25jZXB0IG9mIGJ1c3kgVFNTIG9yIHNvbWUgc2ltaWxhciBzdHVwaWRpdHkuICovCiAKLQljcHVfZ2R0X3RhYmxlW2NwdV1bR0RUX0VOVFJZX1RTU10udHlwZSA9IDk7CisJY3B1X2dkdChjcHUpW0dEVF9FTlRSWV9UU1NdLnR5cGUgPSA5OwogCiAJc3lzY2FsbF9pbml0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgc2V0cyBNU1JfKlNUQVIgYW5kIHJlbGF0ZWQgKi8KIAlsb2FkX1RSX2Rlc2MoKTsJCQkJLyogVGhpcyBkb2VzIGx0ciAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3RpbWUuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC90aW1lLmMKaW5kZXggNzQxMDI3OS4uZjhjNDdjNiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdGltZS5jCkBAIC03MSwxNCArNzEsNiBAQAogc3RydWN0IHRpbWVzcGVjIF9feHRpbWUgX19zZWN0aW9uX3h0aW1lOwogc3RydWN0IHRpbWV6b25lIF9fc3lzX3R6IF9fc2VjdGlvbl9zeXNfdHo7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByZHRzY2xsX3N5bmModW5zaWduZWQgbG9uZyAqdHNjKQotewotI2lmZGVmIENPTkZJR19TTVAKLQlzeW5jX2NvcmUoKTsKLSNlbmRpZgotCXJkdHNjbGwoKnRzYyk7Ci19Ci0KIC8qCiAgKiBkb19nZXR0aW1lb2Zmc2V0KCkgcmV0dXJucyBtaWNyb3NlY29uZHMgc2luY2UgbGFzdCB0aW1lciBpbnRlcnJ1cHQgd2FzCiAgKiB0cmlnZ2VyZWQgYnkgaGFyZHdhcmUuIEEgbWVtb3J5IHJlYWQgb2YgSFBFVCBpcyBzbG93ZXIgdGhhbiBhIHJlZ2lzdGVyIHJlYWQKQEAgLTkzLDcgKzg1LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHQ7CiAJdW5zaWduZWQgbG9uZyB4OwotCXJkdHNjbGxfc3luYygmdCk7CisJdCA9IGdldF9jeWNsZXNfc3luYygpOwogCWlmICh0IDwgdnh0aW1lLmxhc3RfdHNjKSB0ID0gdnh0aW1lLmxhc3RfdHNjOyAvKiBoYWNrICovCiAJeCA9ICgodCAtIHZ4dGltZS5sYXN0X3RzYykgKiB2eHRpbWUudHNjX3F1b3QpID4+IDMyOwogCXJldHVybiB4OwpAQCAtMjU5LDggKzI1MSw4IEBACiAjZW5kaWYKIAogCXsKLQkJCUJJTl9UT19CQ0QocmVhbF9zZWNvbmRzKTsKLQkJCUJJTl9UT19CQ0QocmVhbF9taW51dGVzKTsKKwkJQklOX1RPX0JDRChyZWFsX3NlY29uZHMpOworCQlCSU5fVE9fQkNEKHJlYWxfbWludXRlcyk7CiAJCUNNT1NfV1JJVEUocmVhbF9zZWNvbmRzLCBSVENfU0VDT05EUyk7CiAJCUNNT1NfV1JJVEUocmVhbF9taW51dGVzLCBSVENfTUlOVVRFUyk7CiAJfQpAQCAtMjk3LDI1ICsyODksMjEgQEAKIAkJCWxhc3Rfb2Zmc2V0ID0gdnh0aW1lLmxhc3Q7CiAJCQliYXNlID0gbW9ub3RvbmljX2Jhc2U7CiAJCQl0aGlzX29mZnNldCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKLQogCQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZ4dGltZV9sb2NrLCBzZXEpKTsKIAkJb2Zmc2V0ID0gKHRoaXNfb2Zmc2V0IC0gbGFzdF9vZmZzZXQpOwogCQlvZmZzZXQgKj0oTlNFQ19QRVJfU0VDL0haKS9ocGV0X3RpY2s7CiAJCXJldHVybiBiYXNlICsgb2Zmc2V0OwotCX1lbHNleworCX0gZWxzZSB7CiAJCWRvIHsKIAkJCXNlcSA9IHJlYWRfc2VxYmVnaW4oJnh0aW1lX2xvY2spOwogCiAJCQlsYXN0X29mZnNldCA9IHZ4dGltZS5sYXN0X3RzYzsKIAkJCWJhc2UgPSBtb25vdG9uaWNfYmFzZTsKIAkJfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmeHRpbWVfbG9jaywgc2VxKSk7Ci0JCXN5bmNfY29yZSgpOwotCQlyZHRzY2xsKHRoaXNfb2Zmc2V0KTsKKwkJdGhpc19vZmZzZXQgPSBnZXRfY3ljbGVzX3N5bmMoKTsKIAkJb2Zmc2V0ID0gKHRoaXNfb2Zmc2V0IC0gbGFzdF9vZmZzZXQpKjEwMDAvY3B1X2toejsgCiAJCXJldHVybiBiYXNlICsgb2Zmc2V0OwogCX0KLQotCiB9CiBFWFBPUlRfU1lNQk9MKG1vbm90b25pY19jbG9jayk7CiAKQEAgLTM5MSw3ICszNzksNyBAQAogCQlkZWxheSA9IExBVENIIC0gMSAtIGRlbGF5OwogCX0KIAotCXJkdHNjbGxfc3luYygmdHNjKTsKKwl0c2MgPSBnZXRfY3ljbGVzX3N5bmMoKTsKIAogCWlmICh2eHRpbWUubW9kZSA9PSBWWFRJTUVfSFBFVCkgewogCQlpZiAob2Zmc2V0IC0gdnh0aW1lLmxhc3QgPiBocGV0X3RpY2spIHsKQEAgLTQ3MSw2ICs0NTksMTEgQEAKICAKIAl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOwogCisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisJaWYgKHVzaW5nX2FwaWNfdGltZXIpCisJCXNtcF9zZW5kX3RpbWVyX2Jyb2FkY2FzdF9pcGkoKTsKKyNlbmRpZgorCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC01MDksMTAgKzUwMiwxMCBAQAogCXJldHVybiBjeWNsZXNfMl9ucyhhKTsKIH0KIAotdW5zaWduZWQgbG9uZyBnZXRfY21vc190aW1lKHZvaWQpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfY21vc190aW1lKHZvaWQpCiB7Ci0JdW5zaWduZWQgaW50IHRpbWVvdXQsIHllYXIsIG1vbiwgZGF5LCBob3VyLCBtaW4sIHNlYzsKLQl1bnNpZ25lZCBjaGFyIGxhc3QsIHRoaXM7CisJdW5zaWduZWQgaW50IHRpbWVvdXQgPSAxMDAwMDAwLCB5ZWFyLCBtb24sIGRheSwgaG91ciwgbWluLCBzZWM7CisJdW5zaWduZWQgY2hhciB1aXAgPSAwLCB0aGlzID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAvKgpAQCAtNTI1LDQ1ICs1MTgsNDEgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOwogCi0JdGltZW91dCA9IDEwMDAwMDA7Ci0JbGFzdCA9IHRoaXMgPSAwOwotCi0Jd2hpbGUgKHRpbWVvdXQgJiYgbGFzdCAmJiAhdGhpcykgewotCQlsYXN0ID0gdGhpczsKKwl3aGlsZSAodGltZW91dCAmJiAoIXVpcCB8fCB0aGlzKSkgeworCQl1aXAgfD0gdGhpczsKIAkJdGhpcyA9IENNT1NfUkVBRChSVENfRlJFUV9TRUxFQ1QpICYgUlRDX1VJUDsKIAkJdGltZW91dC0tOwogCX0KIAotLyoKLSAqIEhlcmUgd2UgYXJlIHNhZmUgdG8gYXNzdW1lIHRoZSByZWdpc3RlcnMgd29uJ3QgY2hhbmdlIGZvciBhIHdob2xlIHNlY29uZCwgc28KLSAqIHdlIGp1c3QgZ28gYWhlYWQgYW5kIHJlYWQgdGhlbS4KLQkgKi8KLQotCQlzZWMgPSBDTU9TX1JFQUQoUlRDX1NFQ09ORFMpOwotCQltaW4gPSBDTU9TX1JFQUQoUlRDX01JTlVURVMpOwotCQlob3VyID0gQ01PU19SRUFEKFJUQ19IT1VSUyk7Ci0JCWRheSA9IENNT1NfUkVBRChSVENfREFZX09GX01PTlRIKTsKLQkJbW9uID0gQ01PU19SRUFEKFJUQ19NT05USCk7Ci0JCXllYXIgPSBDTU9TX1JFQUQoUlRDX1lFQVIpOworCS8qCisJICogSGVyZSB3ZSBhcmUgc2FmZSB0byBhc3N1bWUgdGhlIHJlZ2lzdGVycyB3b24ndCBjaGFuZ2UgZm9yIGEgd2hvbGUKKwkgKiBzZWNvbmQsIHNvIHdlIGp1c3QgZ28gYWhlYWQgYW5kIHJlYWQgdGhlbS4KKyAJICovCisJc2VjID0gQ01PU19SRUFEKFJUQ19TRUNPTkRTKTsKKwltaW4gPSBDTU9TX1JFQUQoUlRDX01JTlVURVMpOworCWhvdXIgPSBDTU9TX1JFQUQoUlRDX0hPVVJTKTsKKwlkYXkgPSBDTU9TX1JFQUQoUlRDX0RBWV9PRl9NT05USCk7CisJbW9uID0gQ01PU19SRUFEKFJUQ19NT05USCk7CisJeWVhciA9IENNT1NfUkVBRChSVENfWUVBUik7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOwogCi0vKgotICogV2Uga25vdyB0aGF0IHg4Ni02NCBhbHdheXMgdXNlcyBCQ0QgZm9ybWF0LCBubyBuZWVkIHRvIGNoZWNrIHRoZSBjb25maWcKLSAqIHJlZ2lzdGVyLgotICovCisJLyoKKwkgKiBXZSBrbm93IHRoYXQgeDg2LTY0IGFsd2F5cyB1c2VzIEJDRCBmb3JtYXQsIG5vIG5lZWQgdG8gY2hlY2sgdGhlCisJICogY29uZmlnIHJlZ2lzdGVyLgorIAkqLwogCi0JICAgIEJDRF9UT19CSU4oc2VjKTsKLQkgICAgQkNEX1RPX0JJTihtaW4pOwotCSAgICBCQ0RfVE9fQklOKGhvdXIpOwotCSAgICBCQ0RfVE9fQklOKGRheSk7Ci0JICAgIEJDRF9UT19CSU4obW9uKTsKLQkgICAgQkNEX1RPX0JJTih5ZWFyKTsKKwlCQ0RfVE9fQklOKHNlYyk7CisJQkNEX1RPX0JJTihtaW4pOworCUJDRF9UT19CSU4oaG91cik7CisJQkNEX1RPX0JJTihkYXkpOworCUJDRF9UT19CSU4obW9uKTsKKwlCQ0RfVE9fQklOKHllYXIpOwogCi0vKgotICogeDg2LTY0IHN5c3RlbXMgb25seSBleGlzdHMgc2luY2UgMjAwMi4KLSAqIFRoaXMgd2lsbCB3b3JrIHVwIHRvIERlYyAzMSwgMjEwMAotICovCisJLyoKKwkgKiB4ODYtNjQgc3lzdGVtcyBvbmx5IGV4aXN0cyBzaW5jZSAyMDAyLgorCSAqIFRoaXMgd2lsbCB3b3JrIHVwIHRvIERlYyAzMSwgMjEwMAorCSAqLwogCXllYXIgKz0gMjAwMDsKIAogCXJldHVybiBta3RpbWUoeWVhciwgbW9uLCBkYXksIGhvdXIsIG1pbiwgc2VjKTsKQEAgLTY5NSw4ICs2ODQsNyBAQAogCWRvIHsKIAkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAkJaHBldF9ub3cgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7Ci0JCXN5bmNfY29yZSgpOwotCQlyZHRzY2wodHNjX25vdyk7CisJCXRzY19ub3cgPSBnZXRfY3ljbGVzX3N5bmMoKTsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0gd2hpbGUgKCh0c2Nfbm93IC0gdHNjX3N0YXJ0KSA8IFRJQ0tfQ09VTlQgJiYKIAkJIChocGV0X25vdyAtIGhwZXRfc3RhcnQpIDwgVElDS19DT1VOVCk7CkBAIC03MjYsMTEgKzcxNCw5IEBACiAJb3V0YigweGIwLCAweDQzKTsKIAlvdXRiKChQSVRfVElDS19SQVRFIC8gKDEwMDAgLyA1MCkpICYgMHhmZiwgMHg0Mik7CiAJb3V0YigoUElUX1RJQ0tfUkFURSAvICgxMDAwIC8gNTApKSA+PiA4LCAweDQyKTsKLQlyZHRzY2xsKHN0YXJ0KTsKLQlzeW5jX2NvcmUoKTsKKwlzdGFydCA9IGdldF9jeWNsZXNfc3luYygpOwogCXdoaWxlICgoaW5iKDB4NjEpICYgMHgyMCkgPT0gMCk7Ci0Jc3luY19jb3JlKCk7Ci0JcmR0c2NsbChlbmQpOworCWVuZCA9IGdldF9jeWNsZXNfc3luYygpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTNfbG9jaywgZmxhZ3MpOwogCQpAQCAtNzQ0LDcgKzczMCw3IEBACiAJdW5zaWduZWQgaW50IAkJbnRpbWVyOwogCiAJaWYgKCF2eHRpbWUuaHBldF9hZGRyZXNzKQotICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgCXJldHVybiAtMTsKIAogCW1lbXNldCgmaGQsIDAsIHNpemVvZiAoaGQpKTsKIApAQCAtODc4LDggKzg2NCw2IEBACiAJdGltZXJfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsIENQVV9NQVNLX05PTkUsICJ0aW1lciIsIE5VTEwsIE5VTEwKIH07CiAKLWV4dGVybiB2b2lkIF9faW5pdCBjb25maWdfYWNwaV90YWJsZXModm9pZCk7Ci0KIHZvaWQgX19pbml0IHRpbWVfaW5pdCh2b2lkKQogewogCWNoYXIgKnRpbWVuYW1lOwpAQCAtOTM0LDcgKzkxOCw3IEBACiAJdnh0aW1lLm1vZGUgPSBWWFRJTUVfVFNDOwogCXZ4dGltZS5xdW90ID0gKDEwMDAwMDBMIDw8IDMyKSAvIHZ4dGltZV9oejsKIAl2eHRpbWUudHNjX3F1b3QgPSAoMTAwMEwgPDwgMzIpIC8gY3B1X2toejsKLQlyZHRzY2xsX3N5bmMoJnZ4dGltZS5sYXN0X3RzYyk7CisJdnh0aW1lLmxhc3RfdHNjID0gZ2V0X2N5Y2xlc19zeW5jKCk7CiAJc2V0dXBfaXJxKDAsICZpcnEwKTsKIAogCXNldF9jeWMybnNfc2NhbGUoY3B1X2toeik7CkBAIC05NDgsNyArOTMyLDcgQEAKICAqIE1ha2UgYW4gZWR1Y2F0ZWQgZ3Vlc3MgaWYgdGhlIFRTQyBpcyB0cnVzdHdvcnRoeSBhbmQgc3luY2hyb25pemVkCiAgKiBvdmVyIGFsbCBDUFVzLgogICovCi1zdGF0aWMgX19pbml0IGludCB1bnN5bmNocm9uaXplZF90c2Modm9pZCkKK19faW5pdCBpbnQgdW5zeW5jaHJvbml6ZWRfdHNjKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX1NNUAogCWlmIChvZW1fZm9yY2VfaHBldF90aW1lcigpKQpAQCAtOTU5LDcgKzk0Myw3IEBACiAgCQlyZXR1cm4gMDsKICNlbmRpZgogIAkvKiBBc3N1bWUgbXVsdGkgc29ja2V0IHN5c3RlbXMgYXJlIG5vdCBzeW5jaHJvbml6ZWQgKi8KLSAJcmV0dXJuIG51bV9vbmxpbmVfY3B1cygpID4gMTsKKyAJcmV0dXJuIG51bV9wcmVzZW50X2NwdXMoKSA+IDE7CiB9CiAKIC8qCkBAIC05OTksNiArOTgzLDEwIEBACiBzdGF0aWMgbG9uZyBjbG9ja19jbW9zX2RpZmY7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzbGVlcF9zdGFydDsKIAorLyoKKyAqIHN5c2ZzIHN1cHBvcnQgZm9yIHRoZSB0aW1lci4KKyAqLworCiBzdGF0aWMgaW50IHRpbWVyX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCS8qCkBAIC0xMDQxLDcgKzEwMjksNiBAQAogCXNldF9rc2V0X25hbWUoInRpbWVyIiksCiB9OwogCi0KIC8qIFhYWCB0aGlzIGRyaXZlcmZzIHN0dWZmIHNob3VsZCBwcm9iYWJseSBnbyBlbHNld2hlcmUgbGF0ZXIgLWpvaG4gKi8KIHN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBkZXZpY2VfdGltZXIgPSB7CiAJLmlkCT0gMCwKQEAgLTEwNzUsOCArMTA2Miw2IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KIAotZXh0ZXJuIGlycXJldHVybl90IHJ0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci0KICNkZWZpbmUgREVGQVVMVF9SVENfSU5UX0ZSRVEgCTY0CiAjZGVmaW5lIFJUQ19OVU1fSU5UUyAJCTEKIApAQCAtMTI4NSw4ICsxMjcwLDYgQEAKIH0KICNlbmRpZgogCi0KLQogc3RhdGljIGludCBfX2luaXQgbm9ocGV0X3NldHVwKGNoYXIgKnMpIAogeyAKIAlub2hwZXQgPSAxOwpAQCAtMTMwMyw1ICsxMjg2LDMgQEAKIH0KIAogX19zZXR1cCgibm90c2MiLCBub3RzY19zZXR1cCk7Ci0KLQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3RyYW1wb2xpbmUuUyBiL2FyY2gveDg2XzY0L2tlcm5lbC90cmFtcG9saW5lLlMKaW5kZXggNmQ5YzlhOC4uMjNhMDNlYjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC90cmFtcG9saW5lLlMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3RyYW1wb2xpbmUuUwpAQCAtNDIsOCArNDIsMTUgQEAKIAltb3ZsCSQweEE1QTVBNUE1LCB0cmFtcG9saW5lX2RhdGEgLSByX2Jhc2UKIAkJCQkjIHdyaXRlIG1hcmtlciBmb3IgbWFzdGVyIGtub3dzIHdlJ3JlIHJ1bm5pbmcKIAotCWxpZHQJaWR0XzQ4IC0gcl9iYXNlCSMgbG9hZCBpZHQgd2l0aCAwLCAwCi0JbGdkdAlnZHRfNDggLSByX2Jhc2UJIyBsb2FkIGdkdCB3aXRoIHdoYXRldmVyIGlzIGFwcHJvcHJpYXRlCisJLyoKKwkgKiBHRFQgdGFibGVzIGluIG5vbiBkZWZhdWx0IGxvY2F0aW9uIGtlcm5lbCBjYW4gYmUgYmV5b25kIDE2TUIgYW5kCisJICogbGdkdCB3aWxsIG5vdCBiZSBhYmxlIHRvIGxvYWQgdGhlIGFkZHJlc3MgYXMgaW4gcmVhbCBtb2RlIGRlZmF1bHQKKwkgKiBvcGVyYW5kIHNpemUgaXMgMTZiaXQuIFVzZSBsZ2R0bCBpbnN0ZWFkIHRvIGZvcmNlIG9wZXJhbmQgc2l6ZQorCSAqIHRvIDMyIGJpdC4KKwkgKi8KKworCWxpZHRsCWlkdF80OCAtIHJfYmFzZQkjIGxvYWQgaWR0IHdpdGggMCwgMAorCWxnZHRsCWdkdF80OCAtIHJfYmFzZQkjIGxvYWQgZ2R0IHdpdGggd2hhdGV2ZXIgaXMgYXBwcm9wcmlhdGUKIAogCXhvcgklYXgsICVheAogCWluYwklYXgJCSMgcHJvdGVjdGVkIG1vZGUgKFBFKSBiaXQKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jIGIvYXJjaC94ODZfNjQva2VybmVsL3RyYXBzLmMKaW5kZXggYmYzMzdmNC4uOGJiMGFlZCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3RyYXBzLmMKQEAgLTcwLDcgKzcwLDYgQEAKIGFzbWxpbmthZ2Ugdm9pZCBhbGlnbm1lbnRfY2hlY2sodm9pZCk7CiBhc21saW5rYWdlIHZvaWQgbWFjaGluZV9jaGVjayh2b2lkKTsKIGFzbWxpbmthZ2Ugdm9pZCBzcHVyaW91c19pbnRlcnJ1cHRfYnVnKHZvaWQpOwotYXNtbGlua2FnZSB2b2lkIGNhbGxfZGVidWcodm9pZCk7CiAKIHN0cnVjdCBub3RpZmllcl9ibG9jayAqZGllX2NoYWluOwogc3RhdGljIERFRklORV9TUElOTE9DSyhkaWVfbm90aWZpZXJfbG9jayk7CkBAIC0xMjEsMTkgKzEyMCwzMSBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgKmluX2V4Y2VwdGlvbl9zdGFjayh1bnNpZ25lZCBjcHUsIHVuc2lnbmVkIGxvbmcgc3RhY2ssCiAJCQkJCXVuc2lnbmVkICp1c2VkcCwgY29uc3QgY2hhciAqKmlkcCkKIHsKLQlzdGF0aWMgY29uc3QgY2hhciBpZHNbTl9FWENFUFRJT05fU1RBQ0tTXVs4XSA9IHsKKwlzdGF0aWMgY2hhciBpZHNbXVs4XSA9IHsKIAkJW0RFQlVHX1NUQUNLIC0gMV0gPSAiI0RCIiwKIAkJW05NSV9TVEFDSyAtIDFdID0gIk5NSSIsCiAJCVtET1VCTEVGQVVMVF9TVEFDSyAtIDFdID0gIiNERiIsCiAJCVtTVEFDS0ZBVUxUX1NUQUNLIC0gMV0gPSAiI1NTIiwKIAkJW01DRV9TVEFDSyAtIDFdID0gIiNNQyIsCisjaWYgREVCVUdfU1RLU1ogPiBFWENFUFRJT05fU1RLU1oKKwkJW05fRVhDRVBUSU9OX1NUQUNLUyAuLi4gTl9FWENFUFRJT05fU1RBQ0tTICsgREVCVUdfU1RLU1ogLyBFWENFUFRJT05fU1RLU1ogLSAyXSA9ICIjREJbP10iCisjZW5kaWYKIAl9OwogCXVuc2lnbmVkIGs7CiAKIAlmb3IgKGsgPSAwOyBrIDwgTl9FWENFUFRJT05fU1RBQ0tTOyBrKyspIHsKIAkJdW5zaWduZWQgbG9uZyBlbmQ7CiAKLQkJZW5kID0gcGVyX2NwdShpbml0X3RzcywgY3B1KS5pc3Rba107CisJCXN3aXRjaCAoayArIDEpIHsKKyNpZiBERUJVR19TVEtTWiA+IEVYQ0VQVElPTl9TVEtTWgorCQljYXNlIERFQlVHX1NUQUNLOgorCQkJZW5kID0gY3B1X3BkYShjcHUpLT5kZWJ1Z3N0YWNrICsgREVCVUdfU1RLU1o7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJZW5kID0gcGVyX2NwdShpbml0X3RzcywgY3B1KS5pc3Rba107CisJCQlicmVhazsKKwkJfQogCQlpZiAoc3RhY2sgPj0gZW5kKQogCQkJY29udGludWU7CiAJCWlmIChzdGFjayA+PSBlbmQgLSBFWENFUFRJT05fU1RLU1opIHsKQEAgLTE0Myw2ICsxNTQsMjIgQEAKIAkJCSppZHAgPSBpZHNba107CiAJCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcgKillbmQ7CiAJCX0KKyNpZiBERUJVR19TVEtTWiA+IEVYQ0VQVElPTl9TVEtTWgorCQlpZiAoayA9PSBERUJVR19TVEFDSyAtIDEgJiYgc3RhY2sgPj0gZW5kIC0gREVCVUdfU1RLU1opIHsKKwkJCXVuc2lnbmVkIGogPSBOX0VYQ0VQVElPTl9TVEFDS1MgLSAxOworCisJCQlkbyB7CisJCQkJKytqOworCQkJCWVuZCAtPSBFWENFUFRJT05fU1RLU1o7CisJCQkJaWRzW2pdWzRdID0gJzEnICsgKGogLSBOX0VYQ0VQVElPTl9TVEFDS1MpOworCQkJfSB3aGlsZSAoc3RhY2sgPCBlbmQgLSBFWENFUFRJT05fU1RLU1opOworCQkJaWYgKCp1c2VkcCAmICgxVSA8PCBqKSkKKwkJCQlicmVhazsKKwkJCSp1c2VkcCB8PSAxVSA8PCBqOworCQkJKmlkcCA9IGlkc1tqXTsKKwkJCXJldHVybiAodW5zaWduZWQgbG9uZyAqKWVuZDsKKwkJfQorI2VuZGlmCiAJfQogCXJldHVybiBOVUxMOwogfQpAQCAtMTU2LDkgKzE4Myw4IEBACiAKIHZvaWQgc2hvd190cmFjZSh1bnNpZ25lZCBsb25nICpzdGFjaykKIHsKLQl1bnNpZ25lZCBsb25nIGFkZHI7CiAJY29uc3QgdW5zaWduZWQgY3B1ID0gc2FmZV9zbXBfcHJvY2Vzc29yX2lkKCk7Ci0JdW5zaWduZWQgbG9uZyAqaXJxc3RhY2tfZW5kID0gKHVuc2lnbmVkIGxvbmcgKiljcHVfcGRhW2NwdV0uaXJxc3RhY2twdHI7CisJdW5zaWduZWQgbG9uZyAqaXJxc3RhY2tfZW5kID0gKHVuc2lnbmVkIGxvbmcgKiljcHVfcGRhKGNwdSktPmlycXN0YWNrcHRyOwogCWludCBpOwogCXVuc2lnbmVkIHVzZWQgPSAwOwogCkBAIC0xNjYsOCArMTkyLDE0IEBACiAKICNkZWZpbmUgSEFORExFX1NUQUNLKGNvbmQpIFwKIAlkbyB3aGlsZSAoY29uZCkgeyBcCi0JCWFkZHIgPSAqc3RhY2srKzsgXAorCQl1bnNpZ25lZCBsb25nIGFkZHIgPSAqc3RhY2srKzsgXAogCQlpZiAoa2VybmVsX3RleHRfYWRkcmVzcyhhZGRyKSkgeyBcCisJCQlpZiAoaSA+IDUwKSB7IFwKKwkJCQlwcmludGsoIlxuICAgICAgICIpOyBcCisJCQkJaSA9IDA7IFwKKwkJCX0gXAorCQkJZWxzZSBcCisJCQkJaSArPSBwcmludGsoIiAiKTsgXAogCQkJLyogXAogCQkJICogSWYgdGhlIGFkZHJlc3MgaXMgZWl0aGVyIGluIHRoZSB0ZXh0IHNlZ21lbnQgb2YgdGhlIFwKIAkJCSAqIGtlcm5lbCwgb3IgaW4gdGhlIHJlZ2lvbiB3aGljaCBjb250YWlucyB2bWFsbG9jJ2VkIFwKQEAgLTE3NywyNSArMjA5LDE5IEBACiAJCQkgKiBvdXQgdGhlIGNhbGwgcGF0aCB0aGF0IHdhcyB0YWtlbi4gXAogCQkJICovIFwKIAkJCWkgKz0gcHJpbnRrX2FkZHJlc3MoYWRkcik7IFwKLQkJCWlmIChpID4gNTApIHsgXAotCQkJCXByaW50aygiXG4gICAgICAgIik7IFwKLQkJCQlpID0gMDsgXAotCQkJfSBcCi0JCQllbHNlIFwKLQkJCQlpICs9IHByaW50aygiICIpOyBcCiAJCX0gXAogCX0gd2hpbGUgKDApCiAKLQlmb3IoaSA9IDA7IDsgKSB7CisJZm9yKGkgPSAxMTsgOyApIHsKIAkJY29uc3QgY2hhciAqaWQ7CiAJCXVuc2lnbmVkIGxvbmcgKmVzdGFja19lbmQ7CiAJCWVzdGFja19lbmQgPSBpbl9leGNlcHRpb25fc3RhY2soY3B1LCAodW5zaWduZWQgbG9uZylzdGFjaywKIAkJCQkJCSZ1c2VkLCAmaWQpOwogCiAJCWlmIChlc3RhY2tfZW5kKSB7Ci0JCQlpICs9IHByaW50aygiIDwlcz4gIiwgaWQpOworCQkJaSArPSBwcmludGsoIiA8JXM+IiwgaWQpOwogCQkJSEFORExFX1NUQUNLIChzdGFjayA8IGVzdGFja19lbmQpOwotCQkJaSArPSBwcmludGsoIiA8RU9FPiAiKTsKKwkJCWkgKz0gcHJpbnRrKCIgPEVPRT4iKTsKIAkJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKikgZXN0YWNrX2VuZFstMl07CiAJCQljb250aW51ZTsKIAkJfQpAQCAtMjA1LDExICsyMzEsMTEgQEAKIAkJCQkoSVJRU1RBQ0tTSVpFIC0gNjQpIC8gc2l6ZW9mKCppcnFzdGFjayk7CiAKIAkJCWlmIChzdGFjayA+PSBpcnFzdGFjayAmJiBzdGFjayA8IGlycXN0YWNrX2VuZCkgewotCQkJCWkgKz0gcHJpbnRrKCIgPElSUT4gIik7CisJCQkJaSArPSBwcmludGsoIiA8SVJRPiIpOwogCQkJCUhBTkRMRV9TVEFDSyAoc3RhY2sgPCBpcnFzdGFja19lbmQpOwogCQkJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKikgKGlycXN0YWNrX2VuZFstMV0pOwogCQkJCWlycXN0YWNrX2VuZCA9IE5VTEw7Ci0JCQkJaSArPSBwcmludGsoIiA8RU9JPiAiKTsKKwkJCQlpICs9IHByaW50aygiIDxFT0k+Iik7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCX0KQEAgLTIyNiw4ICsyNTIsOCBAQAogCXVuc2lnbmVkIGxvbmcgKnN0YWNrOwogCWludCBpOwogCWNvbnN0IGludCBjcHUgPSBzYWZlX3NtcF9wcm9jZXNzb3JfaWQoKTsKLQl1bnNpZ25lZCBsb25nICppcnFzdGFja19lbmQgPSAodW5zaWduZWQgbG9uZyAqKSAoY3B1X3BkYVtjcHVdLmlycXN0YWNrcHRyKTsKLQl1bnNpZ25lZCBsb25nICppcnFzdGFjayA9ICh1bnNpZ25lZCBsb25nICopIChjcHVfcGRhW2NwdV0uaXJxc3RhY2twdHIgLSBJUlFTVEFDS1NJWkUpOyAgICAKKwl1bnNpZ25lZCBsb25nICppcnFzdGFja19lbmQgPSAodW5zaWduZWQgbG9uZyAqKSAoY3B1X3BkYShjcHUpLT5pcnFzdGFja3B0cik7CisJdW5zaWduZWQgbG9uZyAqaXJxc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKSAoY3B1X3BkYShjcHUpLT5pcnFzdGFja3B0ciAtIElSUVNUQUNLU0laRSk7CiAKIAkvLyBkZWJ1Z2dpbmcgYWlkOiAic2hvd19zdGFjayhOVUxMLCBOVUxMKTsiIHByaW50cyB0aGUKIAkvLyBiYWNrIHRyYWNlIGZvciB0aGlzIGNwdS4KQEAgLTI3NSwxNCArMzAxLDE0IEBACiAJaW50IGluX2tlcm5lbCA9ICF1c2VyX21vZGUocmVncyk7CiAJdW5zaWduZWQgbG9uZyByc3A7CiAJY29uc3QgaW50IGNwdSA9IHNhZmVfc21wX3Byb2Nlc3Nvcl9pZCgpOyAKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1ciA9IGNwdV9wZGFbY3B1XS5wY3VycmVudDsgCisJc3RydWN0IHRhc2tfc3RydWN0ICpjdXIgPSBjcHVfcGRhKGNwdSktPnBjdXJyZW50OwogCiAJCXJzcCA9IHJlZ3MtPnJzcDsKIAogCXByaW50aygiQ1BVICVkICIsIGNwdSk7CiAJX19zaG93X3JlZ3MocmVncyk7CiAJcHJpbnRrKCJQcm9jZXNzICVzIChwaWQ6ICVkLCB0aHJlYWRpbmZvICVwLCB0YXNrICVwKVxuIiwKLQkJY3VyLT5jb21tLCBjdXItPnBpZCwgY3VyLT50aHJlYWRfaW5mbywgY3VyKTsKKwkJY3VyLT5jb21tLCBjdXItPnBpZCwgdGFza190aHJlYWRfaW5mbyhjdXIpLCBjdXIpOwogCiAJLyoKIAkgKiBXaGVuIGluLWtlcm5lbCwgd2UgYWxzbyBwcmludCBvdXQgdGhlIHN0YWNrIGFuZCBjb2RlIGF0IHRoZQpAQCAtMzE0LDIwICszNDAsMjYgQEAKIHZvaWQgaGFuZGxlX0JVRyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsgCiAJc3RydWN0IGJ1Z19mcmFtZSBmOwotCWNoYXIgdG1wOworCWxvbmcgbGVuOworCWNvbnN0IGNoYXIgKnByZWZpeCA9ICIiOwogCiAJaWYgKHVzZXJfbW9kZShyZWdzKSkKIAkJcmV0dXJuOyAKLQlpZiAoX19jb3B5X2Zyb21fdXNlcigmZiwgKHN0cnVjdCBidWdfZnJhbWUgKikgcmVncy0+cmlwLCAKKwlpZiAoX19jb3B5X2Zyb21fdXNlcigmZiwgKGNvbnN0IHZvaWQgX191c2VyICopIHJlZ3MtPnJpcCwKIAkJCSAgICAgc2l6ZW9mKHN0cnVjdCBidWdfZnJhbWUpKSkKIAkJcmV0dXJuOyAKIAlpZiAoZi5maWxlbmFtZSA+PSAwIHx8CiAJICAgIGYudWQyWzBdICE9IDB4MGYgfHwgZi51ZDJbMV0gIT0gMHgwYikgCiAJCXJldHVybjsKLQlpZiAoX19nZXRfdXNlcih0bXAsIChjaGFyICopKGxvbmcpZi5maWxlbmFtZSkpCisJbGVuID0gX19zdHJubGVuX3VzZXIoKGNoYXIgKikobG9uZylmLmZpbGVuYW1lLCBQQVRIX01BWCkgLSAxOworCWlmIChsZW4gPCAwIHx8IGxlbiA+PSBQQVRIX01BWCkKIAkJZi5maWxlbmFtZSA9IChpbnQpKGxvbmcpInVubWFwcGVkIGZpbGVuYW1lIjsKKwllbHNlIGlmIChsZW4gPiA1MCkgeworCQlmLmZpbGVuYW1lICs9IGxlbiAtIDUwOworCQlwcmVmaXggPSAiLi4uIjsKKwl9CiAJcHJpbnRrKCItLS0tLS0tLS0tLSBbY3V0IGhlcmUgXSAtLS0tLS0tLS0gW3BsZWFzZSBiaXRlIGhlcmUgXSAtLS0tLS0tLS1cbiIpOwotCXByaW50ayhLRVJOX0FMRVJUICJLZXJuZWwgQlVHIGF0ICUuNTBzOiVkXG4iLCAoY2hhciAqKShsb25nKWYuZmlsZW5hbWUsIGYubGluZSk7CisJcHJpbnRrKEtFUk5fQUxFUlQgIktlcm5lbCBCVUcgYXQgJXMlLjUwczolZFxuIiwgcHJlZml4LCAoY2hhciAqKShsb25nKWYuZmlsZW5hbWUsIGYubGluZSk7CiB9IAogCiAjaWZkZWYgQ09ORklHX0JVRwpAQCAtMzgyLDcgKzQxNCw3IEBACiAJcHJpbnRrKCJERUJVR19QQUdFQUxMT0MiKTsKICNlbmRpZgogCXByaW50aygiXG4iKTsKLQlub3RpZnlfZGllKERJRV9PT1BTLCAoY2hhciAqKXN0ciwgcmVncywgZXJyLCAyNTUsIFNJR1NFR1YpOworCW5vdGlmeV9kaWUoRElFX09PUFMsIHN0ciwgcmVncywgZXJyLCBjdXJyZW50LT50aHJlYWQudHJhcF9ubywgU0lHU0VHVik7CiAJc2hvd19yZWdpc3RlcnMocmVncyk7CiAJLyogRXhlY3V0aXZlIHN1bW1hcnkgaW4gY2FzZSB0aGUgb29wcyBzY3JvbGxlZCBhd2F5ICovCiAJcHJpbnRrKEtFUk5fQUxFUlQgIlJJUCAiKTsKQEAgLTM5OSwxMSArNDMxLDYgQEAKIAlvb3BzX2VuZChmbGFncyk7CiAJZG9fZXhpdChTSUdTRUdWKTsgCiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgZGllX2lmX2tlcm5lbChjb25zdCBjaGFyICogc3RyLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyKQotewotCWlmICghKHJlZ3MtPmVmbGFncyAmIFZNX01BU0spICYmIChyZWdzLT5jcyA9PSBfX0tFUk5FTF9DUykpCi0JCWRpZShzdHIsIHJlZ3MsIGVycik7Ci19CiAKIHZvaWQgZGllX25taShjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewpAQCAtNDI2LDE5ICs0NTMsMjAgQEAKIAkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlLAogCQkJICAgICAgc2lnaW5mb190ICppbmZvKQogeworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKwogCWNvbmRpdGlvbmFsX3N0aShyZWdzKTsKIAotCWlmICh1c2VyX21vZGUocmVncykpIHsKLQkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOworCXRzay0+dGhyZWFkLnRyYXBfbm8gPSB0cmFwbnI7CiAKKwlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CiAJCWlmIChleGNlcHRpb25fdHJhY2UgJiYgdW5oYW5kbGVkX3NpZ25hbCh0c2ssIHNpZ25yKSkKIAkJCXByaW50ayhLRVJOX0lORk8KIAkJCSAgICAgICAiJXNbJWRdIHRyYXAgJXMgcmlwOiVseCByc3A6JWx4IGVycm9yOiVseFxuIiwKIAkJCSAgICAgICB0c2stPmNvbW0sIHRzay0+cGlkLCBzdHIsCiAJCQkgICAgICAgcmVncy0+cmlwLHJlZ3MtPnJzcCxlcnJvcl9jb2RlKTsgCiAKLQkJdHNrLT50aHJlYWQuZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7Ci0JCXRzay0+dGhyZWFkLnRyYXBfbm8gPSB0cmFwbnI7CiAJCWlmIChpbmZvKQogCQkJZm9yY2Vfc2lnX2luZm8oc2lnbnIsIGluZm8sIHRzayk7CiAJCWVsc2UKQEAgLTQ4NSw3ICs1MTMsNyBAQAogRE9fRVJST1JfSU5GTyggMCwgU0lHRlBFLCAgImRpdmlkZSBlcnJvciIsIGRpdmlkZV9lcnJvciwgRlBFX0lOVERJViwgcmVncy0+cmlwKQogRE9fRVJST1IoIDQsIFNJR1NFR1YsICJvdmVyZmxvdyIsIG92ZXJmbG93KQogRE9fRVJST1IoIDUsIFNJR1NFR1YsICJib3VuZHMiLCBib3VuZHMpCi1ET19FUlJPUl9JTkZPKCA2LCBTSUdJTEwsICAiaW52YWxpZCBvcGVyYW5kIiwgaW52YWxpZF9vcCwgSUxMX0lMTE9QTiwgcmVncy0+cmlwKQorRE9fRVJST1JfSU5GTyggNiwgU0lHSUxMLCAgImludmFsaWQgb3Bjb2RlIiwgaW52YWxpZF9vcCwgSUxMX0lMTE9QTiwgcmVncy0+cmlwKQogRE9fRVJST1IoIDcsIFNJR1NFR1YsICJkZXZpY2Ugbm90IGF2YWlsYWJsZSIsIGRldmljZV9ub3RfYXZhaWxhYmxlKQogRE9fRVJST1IoIDksIFNJR0ZQRSwgICJjb3Byb2Nlc3NvciBzZWdtZW50IG92ZXJydW4iLCBjb3Byb2Nlc3Nvcl9zZWdtZW50X292ZXJydW4pCiBET19FUlJPUigxMCwgU0lHU0VHViwgImludmFsaWQgVFNTIiwgaW52YWxpZF9UU1MpCkBAIC00OTMsMjQgKzUyMSw0MSBAQAogRE9fRVJST1JfSU5GTygxNywgU0lHQlVTLCAiYWxpZ25tZW50IGNoZWNrIiwgYWxpZ25tZW50X2NoZWNrLCBCVVNfQURSQUxOLCAwKQogRE9fRVJST1IoMTgsIFNJR1NFR1YsICJyZXNlcnZlZCIsIHJlc2VydmVkKQogRE9fRVJST1IoMTIsIFNJR0JVUywgICJzdGFjayBzZWdtZW50Iiwgc3RhY2tfc2VnbWVudCkKLURPX0VSUk9SKCA4LCBTSUdTRUdWLCAiZG91YmxlIGZhdWx0IiwgZG91YmxlX2ZhdWx0KQorCithc21saW5rYWdlIHZvaWQgZG9fZG91YmxlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQoreworCXN0YXRpYyBjb25zdCBjaGFyIHN0cltdID0gImRvdWJsZSBmYXVsdCI7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCisJLyogUmV0dXJuIG5vdCBjaGVja2VkIGJlY2F1c2UgZG91YmxlIGNoZWNrIGNhbm5vdCBiZSBpZ25vcmVkICovCisJbm90aWZ5X2RpZShESUVfVFJBUCwgc3RyLCByZWdzLCBlcnJvcl9jb2RlLCA4LCBTSUdTRUdWKTsKKworCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOworCXRzay0+dGhyZWFkLnRyYXBfbm8gPSA4OworCisJLyogVGhpcyBpcyBhbHdheXMgYSBrZXJuZWwgdHJhcCBhbmQgbmV2ZXIgZml4YWJsZSAoYW5kIHRodXMgbXVzdAorCSAgIG5ldmVyIHJldHVybikuICovCisJZm9yICg7OykKKwkJZGllKHN0ciwgcmVncywgZXJyb3JfY29kZSk7Cit9CiAKIGFzbWxpbmthZ2Ugdm9pZCBfX2twcm9iZXMgZG9fZ2VuZXJhbF9wcm90ZWN0aW9uKHN0cnVjdCBwdF9yZWdzICogcmVncywKIAkJCQkJCWxvbmcgZXJyb3JfY29kZSkKIHsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisKIAljb25kaXRpb25hbF9zdGkocmVncyk7CiAKLQlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7Ci0JCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKwl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gZXJyb3JfY29kZTsKKwl0c2stPnRocmVhZC50cmFwX25vID0gMTM7CiAKKwlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CiAJCWlmIChleGNlcHRpb25fdHJhY2UgJiYgdW5oYW5kbGVkX3NpZ25hbCh0c2ssIFNJR1NFR1YpKQogCQkJcHJpbnRrKEtFUk5fSU5GTwogCQkgICAgICAgIiVzWyVkXSBnZW5lcmFsIHByb3RlY3Rpb24gcmlwOiVseCByc3A6JWx4IGVycm9yOiVseFxuIiwKIAkJCSAgICAgICB0c2stPmNvbW0sIHRzay0+cGlkLAogCQkJICAgICAgIHJlZ3MtPnJpcCxyZWdzLT5yc3AsZXJyb3JfY29kZSk7IAogCi0JCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOwotCQl0c2stPnRocmVhZC50cmFwX25vID0gMTM7CiAJCWZvcmNlX3NpZyhTSUdTRUdWLCB0c2spOwogCQlyZXR1cm47CiAJfSAKQEAgLTU3Myw3ICs2MTgsNyBAQAogCQlyZWFzb24gPSBnZXRfbm1pX3JlYXNvbigpOwogCiAJaWYgKCEocmVhc29uICYgMHhjMCkpIHsKLQkJaWYgKG5vdGlmeV9kaWUoRElFX05NSV9JUEksICJubWlfaXBpIiwgcmVncywgcmVhc29uLCAwLCBTSUdJTlQpCisJCWlmIChub3RpZnlfZGllKERJRV9OTUlfSVBJLCAibm1pX2lwaSIsIHJlZ3MsIHJlYXNvbiwgMiwgU0lHSU5UKQogCQkJCQkJCQk9PSBOT1RJRllfU1RPUCkKIAkJCXJldHVybjsKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKQEAgLTU4OSw3ICs2MzQsNyBAQAogCQl1bmtub3duX25taV9lcnJvcihyZWFzb24sIHJlZ3MpOwogCQlyZXR1cm47CiAJfQotCWlmIChub3RpZnlfZGllKERJRV9OTUksICJubWkiLCByZWdzLCByZWFzb24sIDAsIFNJR0lOVCkgPT0gTk9USUZZX1NUT1ApCisJaWYgKG5vdGlmeV9kaWUoRElFX05NSSwgIm5taSIsIHJlZ3MsIHJlYXNvbiwgMiwgU0lHSU5UKSA9PSBOT1RJRllfU1RPUCkKIAkJcmV0dXJuOyAKIAogCS8qIEFLOiBmb2xsb3dpbmcgY2hlY2tzIHNlZW0gdG8gYmUgYnJva2VuIG9uIG1vZGVybiBjaGlwc2V0cy4gRklYTUUgKi8KQEAgLTYwMCw2ICs2NDUsNyBAQAogCQlpb19jaGVja19lcnJvcihyZWFzb24sIHJlZ3MpOwogfQogCisvKiBydW5zIG9uIElTVCBzdGFjay4gKi8KIGFzbWxpbmthZ2Ugdm9pZCBfX2twcm9iZXMgZG9faW50MyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKIHsKIAlpZiAobm90aWZ5X2RpZShESUVfSU5UMywgImludDMiLCByZWdzLCBlcnJvcl9jb2RlLCAzLCBTSUdUUkFQKSA9PSBOT1RJRllfU1RPUCkgewpAQCAtNjIwLDcgKzY2Niw3IEBACiAJCTsKIAkvKiBFeGNlcHRpb24gZnJvbSB1c2VyIHNwYWNlICovCiAJZWxzZSBpZiAodXNlcl9tb2RlKGVyZWdzKSkKLQkJcmVncyA9ICgoc3RydWN0IHB0X3JlZ3MgKiljdXJyZW50LT50aHJlYWQucnNwMCkgLSAxOworCQlyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOwogCS8qIEV4Y2VwdGlvbiBmcm9tIGtlcm5lbCBhbmQgaW50ZXJydXB0cyBhcmUgZW5hYmxlZC4gTW92ZSB0bwogIAkgICBrZXJuZWwgcHJvY2VzcyBzdGFjay4gKi8KIAllbHNlIGlmIChlcmVncy0+ZWZsYWdzICYgWDg2X0VGTEFHU19JRikKQEAgLTY4NCwxMSArNzMwLDkgQEAKIAlpbmZvLnNpX3NpZ25vID0gU0lHVFJBUDsKIAlpbmZvLnNpX2Vycm5vID0gMDsKIAlpbmZvLnNpX2NvZGUgPSBUUkFQX0JSS1BUOwotCWlmICghdXNlcl9tb2RlKHJlZ3MpKQotCQlnb3RvIGNsZWFyX2RyNzsgCisJaW5mby5zaV9hZGRyID0gdXNlcl9tb2RlKHJlZ3MpID8gKHZvaWQgX191c2VyICopcmVncy0+cmlwIDogTlVMTDsKKwlmb3JjZV9zaWdfaW5mbyhTSUdUUkFQLCAmaW5mbywgdHNrKTsKIAotCWluZm8uc2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKXJlZ3MtPnJpcDsKLQlmb3JjZV9zaWdfaW5mbyhTSUdUUkFQLCAmaW5mbywgdHNrKTsJCiBjbGVhcl9kcjc6CiAJc2V0X2RlYnVncmVnKDBVTCwgNyk7CiAJcmV0dXJuOwpAQCAtNjk4LDcgKzc0Miw3IEBACiAJcmVncy0+ZWZsYWdzICY9IH5URl9NQVNLOwogfQogCi1zdGF0aWMgaW50IGtlcm5lbF9tYXRoX2Vycm9yKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBjaGFyICpzdHIpCitzdGF0aWMgaW50IGtlcm5lbF9tYXRoX2Vycm9yKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBjb25zdCBjaGFyICpzdHIsIGludCB0cmFwbnIpCiB7CiAJY29uc3Qgc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqZml4dXA7CiAJZml4dXAgPSBzZWFyY2hfZXhjZXB0aW9uX3RhYmxlcyhyZWdzLT5yaXApOwpAQCAtNzA2LDggKzc1MCw5IEBACiAJCXJlZ3MtPnJpcCA9IGZpeHVwLT5maXh1cDsKIAkJcmV0dXJuIDE7CiAJfQotCW5vdGlmeV9kaWUoRElFX0dQRiwgc3RyLCByZWdzLCAwLCAxNiwgU0lHRlBFKTsKKwlub3RpZnlfZGllKERJRV9HUEYsIHN0ciwgcmVncywgMCwgdHJhcG5yLCBTSUdGUEUpOwogCS8qIElsbGVnYWwgZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9uIGluIHRoZSBrZXJuZWwgKi8KKwljdXJyZW50LT50aHJlYWQudHJhcF9ubyA9IHRyYXBucjsKIAlkaWUoc3RyLCByZWdzLCAwKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTcyNiw3ICs3NzEsNyBAQAogCiAJY29uZGl0aW9uYWxfc3RpKHJlZ3MpOwogCWlmICghdXNlcl9tb2RlKHJlZ3MpICYmCi0JICAgIGtlcm5lbF9tYXRoX2Vycm9yKHJlZ3MsICJrZXJuZWwgeDg3IG1hdGggZXJyb3IiKSkKKwkgICAga2VybmVsX21hdGhfZXJyb3IocmVncywgImtlcm5lbCB4ODcgbWF0aCBlcnJvciIsIDE2KSkKIAkJcmV0dXJuOwogCiAJLyoKQEAgLTc5NSw3ICs4NDAsNyBAQAogCiAJY29uZGl0aW9uYWxfc3RpKHJlZ3MpOwogCWlmICghdXNlcl9tb2RlKHJlZ3MpICYmCi0gICAgICAgIAlrZXJuZWxfbWF0aF9lcnJvcihyZWdzLCAia2VybmVsIHNpbWQgbWF0aCBlcnJvciIpKQorICAgICAgICAJa2VybmVsX21hdGhfZXJyb3IocmVncywgImtlcm5lbCBzaW1kIG1hdGggZXJyb3IiLCAxOSkpCiAJCXJldHVybjsKIAogCS8qCkBAIC04NjcsMTIgKzkxMiw3IEBACiAJaWYgKCF1c2VkX21hdGgoKSkKIAkJaW5pdF9mcHUobWUpOwogCXJlc3RvcmVfZnB1X2NoZWNraW5nKCZtZS0+dGhyZWFkLmkzODcuZnhzYXZlKTsKLQltZS0+dGhyZWFkX2luZm8tPnN0YXR1cyB8PSBUU19VU0VERlBVOwotfQotCi12b2lkIGRvX2NhbGxfZGVidWcoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpIAoteyAKLQlub3RpZnlfZGllKERJRV9DQUxMLCAiZGVidWcgY2FsbCIsIHJlZ3MsIDAsIDI1NSwgU0lHSU5UKTsgCisJdGFza190aHJlYWRfaW5mbyhtZSktPnN0YXR1cyB8PSBUU19VU0VERlBVOwogfQogCiB2b2lkIF9faW5pdCB0cmFwX2luaXQodm9pZCkKQEAgLTg4MCw5ICs5MjAsOSBAQAogCXNldF9pbnRyX2dhdGUoMCwmZGl2aWRlX2Vycm9yKTsKIAlzZXRfaW50cl9nYXRlX2lzdCgxLCZkZWJ1ZyxERUJVR19TVEFDSyk7CiAJc2V0X2ludHJfZ2F0ZV9pc3QoMiwmbm1pLE5NSV9TVEFDSyk7Ci0Jc2V0X3N5c3RlbV9nYXRlKDMsJmludDMpOwotCXNldF9zeXN0ZW1fZ2F0ZSg0LCZvdmVyZmxvdyk7CS8qIGludDQtNSBjYW4gYmUgY2FsbGVkIGZyb20gYWxsICovCi0Jc2V0X3N5c3RlbV9nYXRlKDUsJmJvdW5kcyk7CisgCXNldF9zeXN0ZW1fZ2F0ZV9pc3QoMywmaW50MyxERUJVR19TVEFDSyk7IC8qIGludDMgY2FuIGJlIGNhbGxlZCBmcm9tIGFsbCAqLworCXNldF9zeXN0ZW1fZ2F0ZSg0LCZvdmVyZmxvdyk7CS8qIGludDQgY2FuIGJlIGNhbGxlZCBmcm9tIGFsbCAqLworCXNldF9pbnRyX2dhdGUoNSwmYm91bmRzKTsKIAlzZXRfaW50cl9nYXRlKDYsJmludmFsaWRfb3ApOwogCXNldF9pbnRyX2dhdGUoNywmZGV2aWNlX25vdF9hdmFpbGFibGUpOwogCXNldF9pbnRyX2dhdGVfaXN0KDgsJmRvdWJsZV9mYXVsdCwgRE9VQkxFRkFVTFRfU1RBQ0spOwpAQCAtOTA0LDggKzk0NCw2IEBACiAJc2V0X3N5c3RlbV9nYXRlKElBMzJfU1lTQ0FMTF9WRUNUT1IsIGlhMzJfc3lzY2FsbCk7CiAjZW5kaWYKICAgICAgICAKLQlzZXRfaW50cl9nYXRlKEtEQl9WRUNUT1IsIGNhbGxfZGVidWcpOwotICAgICAgIAogCS8qCiAJICogU2hvdWxkIGJlIGEgYmFycmllciBmb3IgYW55IGV4dGVybmFsIENQVSBzdGF0ZS4KIAkgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC94ODZfNjQva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggNThiMTkyMS4uYjBlZWQxZiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTgsNiArOCw4IEBACiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIAorI3VuZGVmIGkzODYJLyogaW4gY2FzZSB0aGUgcHJlcHJvY2Vzc29yIGlzIGEgMzJiaXQgb25lICovCisKIE9VVFBVVF9GT1JNQVQoImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiLCAiZWxmNjQteDg2LTY0IikKIE9VVFBVVF9BUkNIKGkzODY6eDg2LTY0KQogRU5UUlkocGh5c19zdGFydHVwXzY0KQpAQCAtMTg5LDcgKzE5MSw3IEBACiAgIC8qIFNlY3Rpb25zIHRvIGJlIGRpc2NhcmRlZCAqLwogICAvRElTQ0FSRC8gOiB7CiAJKiguZXhpdGNhbGwuZXhpdCkKLSNpZm5kZWYgQ09ORklHX0RFQlVHX0lORk8KKyNpZm5kZWYgQ09ORklHX1VOV0lORF9JTkZPCiAJKiguZWhfZnJhbWUpCiAjZW5kaWYKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdnNtcC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3ZzbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmY3MGM3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3ZzbXAuYwpAQCAtMCwwICsxLDQ1IEBACisvKgorICogdlNNUG93ZXJlZCh0bSkgc3lzdGVtcyBzcGVjaWZpYyBpbml0aWFsaXphdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA1IFNjYWxlTVAgSW5jLgorICoKKyAqIFVzZSBvZiB0aGlzIGNvZGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisgKiBHTlUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSB2ZXJzaW9uIDIuIFNlZSAiQ09QWUlORyIgb3IKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbAorICoKKyAqIFJhdmlraXJhbiBUaGlydW1hbGFpIDxraXJhbkBzY2FsZW1wLmNvbT4sCisgKiBTaGFpIEZ1bHRoZWltIDxzaGFpQHNjYWxlbXAuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9yZWdzLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1kaXJlY3QuaD4KKworc3RhdGljIGludCBfX2luaXQgdnNtcF9pbml0KHZvaWQpCit7CisJdm9pZCAqYWRkcmVzczsKKwl1bnNpZ25lZCBpbnQgY2FwLCBjdGw7CisKKwkvKiBDaGVjayBpZiB3ZSBhcmUgcnVubmluZyBvbiBhIFNjYWxlTVAgdlNNUCBib3ggKi8KKwlpZiAoKHJlYWRfcGNpX2NvbmZpZ18xNigwLCAweDFmLCAwLCBQQ0lfVkVORE9SX0lEKSAhPSBQQ0lfVkVORE9SX0lEX1NDQUxFTVApIHx8CisJICAgIChyZWFkX3BjaV9jb25maWdfMTYoMCwgMHgxZiwgMCwgUENJX0RFVklDRV9JRCkgIT0gUENJX0RFVklDRV9JRF9TQ0FMRU1QX1ZTTVBfQ1RMKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBzZXQgdlNNUCBtYWdpYyBiaXRzIHRvIGluZGljYXRlIHZTTVAgY2FwYWJsZSBrZXJuZWwgKi8KKwlhZGRyZXNzID0gaW9yZW1hcChyZWFkX3BjaV9jb25maWcoMCwgMHgxZiwgMCwgUENJX0JBU0VfQUREUkVTU18wKSwgOCk7CisJY2FwID0gcmVhZGwoYWRkcmVzcyk7CisJY3RsID0gcmVhZGwoYWRkcmVzcyArIDQpOworCXByaW50aygidlNNUCBDVEw6IGNhcGFiaWxpdGllczoweCUwOHggIGNvbnRyb2w6MHglMDh4XG4iLCBjYXAsIGN0bCk7CisJaWYgKGNhcCAmIGN0bCAmICgxIDw8IDQpKSB7CisJCS8qIFR1cm4gb24gdlNNUCBJUlEgZmFzdHBhdGggaGFuZGxpbmcgKHNlZSBzeXN0ZW0uaCkgKi8KKwkJY3RsICY9IH4oMSA8PCA0KTsKKwkJd3JpdGVsKGN0bCwgYWRkcmVzcyArIDQpOworCQljdGwgPSByZWFkbChhZGRyZXNzICsgNCk7CisJCXByaW50aygidlNNUCBDVEw6IGNvbnRyb2wgc2V0IHRvOjB4JTA4eFxuIiwgY3RsKTsKKwl9CisKKwlpb3VubWFwKGFkZHJlc3MpOworCXJldHVybiAwOworfQorCitjb3JlX2luaXRjYWxsKHZzbXBfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdnN5c2NhbGwuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC92c3lzY2FsbC5jCmluZGV4IDcwYTBiZDEuLjk0NjhmYjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC92c3lzY2FsbC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC92c3lzY2FsbC5jCkBAIC0zNSwxNCArMzUsMTMgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2RlZmluZSBfX3ZzeXNjYWxsKG5yKSBfX2F0dHJpYnV0ZV9fICgodW51c2VkLF9fc2VjdGlvbl9fKCIudnN5c2NhbGxfIiAjbnIpKSkKLSNkZWZpbmUgZm9yY2VfaW5saW5lIF9fYXR0cmlidXRlX18oKGFsd2F5c19pbmxpbmUpKSBpbmxpbmUKIAogaW50IF9fc3lzY3RsX3ZzeXNjYWxsIF9fc2VjdGlvbl9zeXNjdGxfdnN5c2NhbGwgPSAxOwogc2VxbG9ja190IF9feHRpbWVfbG9jayBfX3NlY3Rpb25feHRpbWVfbG9jayA9IFNFUUxPQ0tfVU5MT0NLRUQ7CiAKICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAKLXN0YXRpYyBmb3JjZV9pbmxpbmUgdm9pZCB0aW1ldmFsX25vcm1hbGl6ZShzdHJ1Y3QgdGltZXZhbCAqIHR2KQorc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIHRpbWV2YWxfbm9ybWFsaXplKHN0cnVjdCB0aW1ldmFsICogdHYpCiB7CiAJdGltZV90IF9fc2VjOwogCkBAIC01Myw3ICs1Miw3IEBACiAJfQogfQogCi1zdGF0aWMgZm9yY2VfaW5saW5lIHZvaWQgZG9fdmdldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqIHR2KQorc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIGRvX3ZnZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKiB0dikKIHsKIAlsb25nIHNlcXVlbmNlLCB0OwogCXVuc2lnbmVkIGxvbmcgc2VjLCB1c2VjOwpAQCAtNjYsOCArNjUsNyBAQAogCQkJKF9famlmZmllcyAtIF9fd2FsbF9qaWZmaWVzKSAqICgxMDAwMDAwIC8gSFopOwogCiAJCWlmIChfX3Z4dGltZS5tb2RlICE9IFZYVElNRV9IUEVUKSB7Ci0JCQlzeW5jX2NvcmUoKTsKLQkJCXJkdHNjbGwodCk7CisJCQl0ID0gZ2V0X2N5Y2xlc19zeW5jKCk7CiAJCQlpZiAodCA8IF9fdnh0aW1lLmxhc3RfdHNjKQogCQkJCXQgPSBfX3Z4dGltZS5sYXN0X3RzYzsKIAkJCXVzZWMgKz0gKCh0IC0gX192eHRpbWUubGFzdF90c2MpICoKQEAgLTg0LDEyICs4MiwxMiBAQAogfQogCiAvKiBSRUQtUEVOIG1heSB3YW50IHRvIHJlYWRkIHNlcSBsb2NraW5nLCBidXQgdGhlbiB0aGUgdmFyaWFibGUgc2hvdWxkIGJlIHdyaXRlLW9uY2UuICovCi1zdGF0aWMgZm9yY2VfaW5saW5lIHZvaWQgZG9fZ2V0X3R6KHN0cnVjdCB0aW1lem9uZSAqIHR6KQorc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIGRvX2dldF90eihzdHJ1Y3QgdGltZXpvbmUgKiB0eikKIHsKIAkqdHogPSBfX3N5c190ejsKIH0KIAotc3RhdGljIGZvcmNlX2lubGluZSBpbnQgZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0diwgc3RydWN0IHRpbWV6b25lICp0eikKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IGdldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqdHYsIHN0cnVjdCB0aW1lem9uZSAqdHopCiB7CiAJaW50IHJldDsKIAlhc20gdm9sYXRpbGUoInZzeXNjMjogc3lzY2FsbCIKQEAgLTk4LDcgKzk2LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgZm9yY2VfaW5saW5lIGxvbmcgdGltZV9zeXNjYWxsKGxvbmcgKnQpCitzdGF0aWMgX19hbHdheXNfaW5saW5lIGxvbmcgdGltZV9zeXNjYWxsKGxvbmcgKnQpCiB7CiAJbG9uZyBzZWNzOwogCWFzbSB2b2xhdGlsZSgidnN5c2MxOiBzeXNjYWxsIgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3g4NjY0X2tzeW1zLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwveDg2NjRfa3N5bXMuYwppbmRleCA0YTU0MjIxLi5iNjE0ZDU0IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwveDg2NjRfa3N5bXMuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwveDg2NjRfa3N5bXMuYwpAQCAtMTMsNyArMTMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW9jdGwzMi5oPgogCiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTQ1LDIyICs0NCwxNSBAQAogRVhQT1JUX1NZTUJPTChkcml2ZV9pbmZvKTsKICNlbmRpZgogCi1leHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfY21vc190aW1lKHZvaWQpOwotCiAvKiBwbGF0Zm9ybSBkZXBlbmRlbnQgc3VwcG9ydCAqLwogRVhQT1JUX1NZTUJPTChib290X2NwdV9kYXRhKTsKIC8vRVhQT1JUX1NZTUJPTChkdW1wX2ZwdSk7CiBFWFBPUlRfU1lNQk9MKF9faW9yZW1hcCk7CiBFWFBPUlRfU1lNQk9MKGlvcmVtYXBfbm9jYWNoZSk7CiBFWFBPUlRfU1lNQk9MKGlvdW5tYXApOwotRVhQT1JUX1NZTUJPTChlbmFibGVfaXJxKTsKLUVYUE9SVF9TWU1CT0woZGlzYWJsZV9pcnEpOwotRVhQT1JUX1NZTUJPTChkaXNhYmxlX2lycV9ub3N5bmMpOwotRVhQT1JUX1NZTUJPTChwcm9iZV9pcnFfbWFzayk7CiBFWFBPUlRfU1lNQk9MKGtlcm5lbF90aHJlYWQpOwogRVhQT1JUX1NZTUJPTChwbV9pZGxlKTsKIEVYUE9SVF9TWU1CT0wocG1fcG93ZXJfb2ZmKTsKLUVYUE9SVF9TWU1CT0woZ2V0X2Ntb3NfdGltZSk7CiAKIEVYUE9SVF9TWU1CT0woX19kb3duX2ZhaWxlZCk7CiBFWFBPUlRfU1lNQk9MKF9fZG93bl9mYWlsZWRfaW50ZXJydXB0aWJsZSk7CkBAIC04NCw5ICs3Niw2IEBACiBFWFBPUlRfU1lNQk9MKF9fcHV0X3VzZXJfNCk7CiBFWFBPUlRfU1lNQk9MKF9fcHV0X3VzZXJfOCk7CiAKLUVYUE9SVF9TWU1CT0woc3RycGJyayk7Ci1FWFBPUlRfU1lNQk9MKHN0cnN0cik7Ci0KIEVYUE9SVF9TWU1CT0woc3RybmNweV9mcm9tX3VzZXIpOwogRVhQT1JUX1NZTUJPTChfX3N0cm5jcHlfZnJvbV91c2VyKTsKIEVYUE9SVF9TWU1CT0woY2xlYXJfdXNlcik7CkBAIC05OCwyNSArODcsMTggQEAKIEVYUE9SVF9TWU1CT0woc3Rybmxlbl91c2VyKTsKIAogI2lmZGVmIENPTkZJR19QQ0kKLUVYUE9SVF9TWU1CT0wocGNpX2FsbG9jX2NvbnNpc3RlbnQpOwotRVhQT1JUX1NZTUJPTChwY2lfZnJlZV9jb25zaXN0ZW50KTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1BDSQogRVhQT1JUX1NZTUJPTChwY2lfbWVtX3N0YXJ0KTsKICNlbmRpZgogCiBFWFBPUlRfU1lNQk9MKGNvcHlfcGFnZSk7CiBFWFBPUlRfU1lNQk9MKGNsZWFyX3BhZ2UpOwogCi1FWFBPUlRfU1lNQk9MKGNwdV9wZGEpOworRVhQT1JUX1NZTUJPTChfY3B1X3BkYSk7CiAjaWZkZWYgQ09ORklHX1NNUAogRVhQT1JUX1NZTUJPTChjcHVfZGF0YSk7Ci1FWFBPUlRfU1lNQk9MKGNwdV9vbmxpbmVfbWFwKTsKIEVYUE9SVF9TWU1CT0woX193cml0ZV9sb2NrX2ZhaWxlZCk7CiBFWFBPUlRfU1lNQk9MKF9fcmVhZF9sb2NrX2ZhaWxlZCk7CiAKLUVYUE9SVF9TWU1CT0woc3luY2hyb25pemVfaXJxKTsKIEVYUE9SVF9TWU1CT0woc21wX2NhbGxfZnVuY3Rpb24pOwogRVhQT1JUX1NZTUJPTChjcHVfY2FsbG91dF9tYXApOwogI2VuZGlmCkBAIC0xMzcsMzAgKzExOSwxNyBAQAogI3VuZGVmIG1lbWNweQogI3VuZGVmIG1lbXNldAogI3VuZGVmIG1lbW1vdmUKLSN1bmRlZiBtZW1jaHIKICN1bmRlZiBzdHJsZW4KLSN1bmRlZiBzdHJuY21wCi0jdW5kZWYgc3RybmNweQotI3VuZGVmIHN0cmNocgkKIAogZXh0ZXJuIHZvaWQgKiBtZW1zZXQodm9pZCAqLGludCxfX2tlcm5lbF9zaXplX3QpOwogZXh0ZXJuIHNpemVfdCBzdHJsZW4oY29uc3QgY2hhciAqKTsKIGV4dGVybiB2b2lkICogbWVtbW92ZSh2b2lkICogZGVzdCxjb25zdCB2b2lkICpzcmMsc2l6ZV90IGNvdW50KTsKLWV4dGVybiB2b2lkICptZW1jaHIoY29uc3Qgdm9pZCAqcywgaW50IGMsIHNpemVfdCBuKTsKIGV4dGVybiB2b2lkICogbWVtY3B5KHZvaWQgKixjb25zdCB2b2lkICosX19rZXJuZWxfc2l6ZV90KTsKIGV4dGVybiB2b2lkICogX19tZW1jcHkodm9pZCAqLGNvbnN0IHZvaWQgKixfX2tlcm5lbF9zaXplX3QpOwogCiBFWFBPUlRfU1lNQk9MKG1lbXNldCk7CiBFWFBPUlRfU1lNQk9MKHN0cmxlbik7CiBFWFBPUlRfU1lNQk9MKG1lbW1vdmUpOwotRVhQT1JUX1NZTUJPTChzdHJuY21wKTsKLUVYUE9SVF9TWU1CT0woc3RybmNweSk7Ci1FWFBPUlRfU1lNQk9MKHN0cmNocik7Ci1FWFBPUlRfU1lNQk9MKHN0cm5jYXQpOwotRVhQT1JUX1NZTUJPTChtZW1jaHIpOwotRVhQT1JUX1NZTUJPTChzdHJyY2hyKTsKLUVYUE9SVF9TWU1CT0woc3Rybmxlbik7Ci1FWFBPUlRfU1lNQk9MKG1lbXNjYW4pOwogRVhQT1JUX1NZTUJPTChtZW1jcHkpOwogRVhQT1JUX1NZTUJPTChfX21lbWNweSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2xpYi9jb3B5X3VzZXIuUyBiL2FyY2gveDg2XzY0L2xpYi9jb3B5X3VzZXIuUwppbmRleCBkZmEzNThiLi43OTQyMmI2IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9saWIvY29weV91c2VyLlMKKysrIGIvYXJjaC94ODZfNjQvbGliL2NvcHlfdXNlci5TCkBAIC00LDEyICs0LDkgQEAKICAqIEZ1bmN0aW9ucyB0byBjb3B5IGZyb20gYW5kIHRvIHVzZXIgc3BhY2UuCQkKICAqLwkJIAogCi0jZGVmaW5lIEZJWF9BTElHTk1FTlQgMQotCQkKIAkjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KIAkjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAJI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgotCSNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgogCiAvKiBTdGFuZGFyZCBjb3B5X3RvX3VzZXIgd2l0aCBzZWdtZW50IGxpbWl0IGNoZWNraW5nICovCQkKIAkuZ2xvYmwgY29weV90b191c2VyCkBAIC0yMSwyMyArMTgsNyBAQAogCWpjICBiYWRfdG9fdXNlcgogCWNtcHEgdGhyZWFkaW5mb19hZGRyX2xpbWl0KCVyYXgpLCVyY3gKIAlqYWUgYmFkX3RvX3VzZXIKLTI6CQotCS5ieXRlIDB4ZTkJLyogMzJiaXQganVtcCAqLwotCS5sb25nIC5MY3VnLTFmCi0xOgotCi0JLnNlY3Rpb24gLmFsdGluc3RyX3JlcGxhY2VtZW50LCJheCIKLTM6CS5ieXRlIDB4ZTkJCQkvKiByZXBsYWNlbWVudCBqbXAgd2l0aCA4IGJpdCBpbW1lZGlhdGUgKi8KLQkubG9uZyBjb3B5X3VzZXJfZ2VuZXJpY19jLTFiCS8qIG9mZnNldCAqLwotCS5wcmV2aW91cwotCS5zZWN0aW9uIC5hbHRpbnN0cnVjdGlvbnMsImEiCi0JLmFsaWduIDgKLQkucXVhZCAgMmIKLQkucXVhZCAgM2IKLQkuYnl0ZSAgWDg2X0ZFQVRVUkVfSzhfQwotCS5ieXRlICA1Ci0JLmJ5dGUgIDUKLQkucHJldmlvdXMKKwlqbXAgY29weV91c2VyX2dlbmVyaWMKIAogLyogU3RhbmRhcmQgY29weV9mcm9tX3VzZXIgd2l0aCBzZWdtZW50IGxpbWl0IGNoZWNraW5nICovCQogCS5nbG9ibCBjb3B5X2Zyb21fdXNlcgpAQCAtNzIsMjIzICs1Myw0NCBAQAogICogcnNpIHNvdXJjZQogICogcmR4IGNvdW50CiAgKgorICogT25seSA0R0Igb2YgY29weSBpcyBzdXBwb3J0ZWQuIFRoaXMgc2hvdWxkbid0IGJlIGEgcHJvYmxlbQorICogYmVjYXVzZSB0aGUga2VybmVsIG5vcm1hbGx5IG9ubHkgd3JpdGVzIGZyb20vdG8gcGFnZSBzaXplZCBjaHVua3MKKyAqIGV2ZW4gaWYgdXNlciBzcGFjZSBwYXNzZWQgYSBsb25nZXIgYnVmZmVyLgorICogQW5kIG1vcmUgd291bGQgYmUgZGFuZ2Vyb3VzIGJlY2F1c2UgYm90aCBJbnRlbCBhbmQgQU1EIGhhdmUKKyAqIGVycmF0YSB3aXRoIHJlcCBtb3ZzcSA+IDRHQi4gSWYgc29tZW9uZSBmZWVscyB0aGUgbmVlZCB0byBmaXgKKyAqIHRoaXMgcGxlYXNlIGNvbnNpZGVyIHRoaXMuCisgKgogICogT3V0cHV0OgkJCiAgKiBlYXggdW5jb3BpZWQgYnl0ZXMgb3IgMCBpZiBzdWNjZXNzZnVsLgogICovCi0JLmdsb2JsIGNvcHlfdXNlcl9nZW5lcmljCQotCS5wMmFsaWduIDQKLWNvcHlfdXNlcl9nZW5lcmljOgkKLQkuYnl0ZSAweDY2LDB4NjYsMHg5MAkvKiA1IGJ5dGUgbm9wIGZvciByZXBsYWNlbWVudCBqdW1wICovCQotCS5ieXRlIDB4NjYsMHg5MAotMToJCQotCS5zZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCwiYXgiCi0yOgkuYnl0ZSAweGU5CSAgICAgICAgICAgICAvKiBuZWFyIGp1bXAgd2l0aCAzMmJpdCBpbW1lZGlhdGUgKi8KLQkubG9uZyBjb3B5X3VzZXJfZ2VuZXJpY19jLTFiIC8qIG9mZnNldCAqLwotCS5wcmV2aW91cwotCS5zZWN0aW9uIC5hbHRpbnN0cnVjdGlvbnMsImEiCi0JLmFsaWduIDgKLQkucXVhZCAgY29weV91c2VyX2dlbmVyaWMKLQkucXVhZCAgMmIKLQkuYnl0ZSAgWDg2X0ZFQVRVUkVfSzhfQwotCS5ieXRlICA1Ci0JLmJ5dGUgIDUKLQkucHJldmlvdXMKLS5MY3VnOgkKLQlwdXNocSAlcmJ4Ci0JeG9ybCAlZWF4LCVlYXgJCS8qemVybyBmb3IgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyICovCiAKLSNpZmRlZiBGSVhfQUxJR05NRU5UCi0JLyogY2hlY2sgZm9yIGJhZCBhbGlnbm1lbnQgb2YgZGVzdGluYXRpb24gKi8KLQltb3ZsICVlZGksJWVjeAotCWFuZGwgJDcsJWVjeAotCWpueiAgLkxiYWRfYWxpZ25tZW50Ci0uTGFmdGVyX2JhZF9hbGlnbm1lbnQ6Ci0jZW5kaWYKLQotCW1vdnEgJXJkeCwlcmN4Ci0KLQltb3ZsICQ2NCwlZWJ4CQotCXNocnEgJDYsJXJkeAotCWRlY3EgJXJkeAotCWpzICAgLkxoYW5kbGVfdGFpbAotCQotCS5wMmFsaWduIDQKLS5MbG9vcDoKLS5MczE6CW1vdnEgKCVyc2kpLCVyMTEKLS5MczI6CW1vdnEgMSo4KCVyc2kpLCVyOAotLkxzMzoJbW92cSAyKjgoJXJzaSksJXI5Ci0uTHM0Ogltb3ZxIDMqOCglcnNpKSwlcjEwCi0uTGQxOgltb3ZxICVyMTEsKCVyZGkpCi0uTGQyOgltb3ZxICVyOCwxKjgoJXJkaSkKLS5MZDM6CW1vdnEgJXI5LDIqOCglcmRpKQotLkxkNDoJbW92cSAlcjEwLDMqOCglcmRpKQotCQkKLS5MczU6CW1vdnEgNCo4KCVyc2kpLCVyMTEKLS5MczY6CW1vdnEgNSo4KCVyc2kpLCVyOAotLkxzNzoJbW92cSA2KjgoJXJzaSksJXI5Ci0uTHM4Ogltb3ZxIDcqOCglcnNpKSwlcjEwCi0uTGQ1Ogltb3ZxICVyMTEsNCo4KCVyZGkpCi0uTGQ2Ogltb3ZxICVyOCw1KjgoJXJkaSkKLS5MZDc6CW1vdnEgJXI5LDYqOCglcmRpKQotLkxkODoJbW92cSAlcjEwLDcqOCglcmRpKQotCQotCWRlY3EgJXJkeAotCi0JbGVhcSA2NCglcnNpKSwlcnNpCi0JbGVhcSA2NCglcmRpKSwlcmRpCi0JCi0Jam5zICAuTGxvb3AKLQotCS5wMmFsaWduIDQKLS5MaGFuZGxlX3RhaWw6Ci0JbW92bCAlZWN4LCVlZHgKLQlhbmRsICQ2MywlZWN4Ci0Jc2hybCAkMywlZWN4Ci0JanogICAuTGhhbmRsZV83Ci0JbW92bCAkOCwlZWJ4Ci0JLnAyYWxpZ24gNAotLkxsb29wXzg6Ci0uTHM5Ogltb3ZxICglcnNpKSwlcjgKLS5MZDk6CW1vdnEgJXI4LCglcmRpKQotCWRlY2wgJWVjeAotCWxlYXEgOCglcmRpKSwlcmRpCi0JbGVhcSA4KCVyc2kpLCVyc2kKLQlqbnogLkxsb29wXzgKLQkKLS5MaGFuZGxlXzc6CQkKLQltb3ZsICVlZHgsJWVjeAkKLQlhbmRsICQ3LCVlY3gKLQlqeiAgIC5MZW5kZQotCS5wMmFsaWduIDQKLS5MbG9vcF8xOgotLkxzMTA6CW1vdmIgKCVyc2kpLCVibAotLkxkMTA6CW1vdmIgJWJsLCglcmRpKQotCWluY3EgJXJkaQotCWluY3EgJXJzaQotCWRlY2wgJWVjeAotCWpueiAuTGxvb3BfMQotCQkJCi0uTGVuZGU6Ci0JcG9wcSAlcmJ4Ci0JcmV0CQotCi0jaWZkZWYgRklYX0FMSUdOTUVOVAkJICAJCQotCS8qIGFsaWduIGRlc3RpbmF0aW9uICovCi0JLnAyYWxpZ24gNAotLkxiYWRfYWxpZ25tZW50OgotCW1vdmwgJDgsJXI5ZAotCXN1YmwgJWVjeCwlcjlkCi0JbW92bCAlcjlkLCVlY3gKLQljbXBxICVyOSwlcmR4Ci0JanogICAuTGhhbmRsZV83Ci0JanMgICAuTGhhbmRsZV83Ci0uTGFsaWduXzE6CQkKLS5MczExOgltb3ZiICglcnNpKSwlYmwKLS5MZDExOgltb3ZiICVibCwoJXJkaSkKLQlpbmNxICVyc2kKLQlpbmNxICVyZGkKLQlkZWNsICVlY3gKLQlqbnogLkxhbGlnbl8xCi0Jc3VicSAlcjksJXJkeAotCWptcCAuTGFmdGVyX2JhZF9hbGlnbm1lbnQKLSNlbmRpZgotCQotCS8qIHRhYmxlIHNvcnRlZCBieSBleGNlcHRpb24gYWRkcmVzcyAqLwkKLQkuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgotCS5hbGlnbiA4Ci0JLnF1YWQgLkxzMSwuTHMxZQotCS5xdWFkIC5MczIsLkxzMmUKLQkucXVhZCAuTHMzLC5MczNlCi0JLnF1YWQgLkxzNCwuTHM0ZQkKLQkucXVhZCAuTGQxLC5MczFlCi0JLnF1YWQgLkxkMiwuTHMyZQotCS5xdWFkIC5MZDMsLkxzM2UKLQkucXVhZCAuTGQ0LC5MczRlCi0JLnF1YWQgLkxzNSwuTHM1ZQotCS5xdWFkIC5MczYsLkxzNmUKLQkucXVhZCAuTHM3LC5MczdlCi0JLnF1YWQgLkxzOCwuTHM4ZQkKLQkucXVhZCAuTGQ1LC5MczVlCi0JLnF1YWQgLkxkNiwuTHM2ZQotCS5xdWFkIC5MZDcsLkxzN2UKLQkucXVhZCAuTGQ4LC5MczhlCi0JLnF1YWQgLkxzOSwuTGVfcXVhZAotCS5xdWFkIC5MZDksLkxlX3F1YWQKLQkucXVhZCAuTHMxMCwuTGVfYnl0ZQotCS5xdWFkIC5MZDEwLC5MZV9ieXRlCi0jaWZkZWYgRklYX0FMSUdOTUVOVAkKLQkucXVhZCAuTHMxMSwuTHplcm9fcmVzdAotCS5xdWFkIC5MZDExLC5MemVyb19yZXN0Ci0jZW5kaWYKLQkucXVhZCAuTGU1LC5MZV96ZXJvCi0JLnByZXZpb3VzCi0KLQkvKiBjb21wdXRlIDY0LW9mZnNldCBmb3IgbWFpbiBsb29wLiA4IGJ5dGVzIGFjY3VyYWN5IHdpdGggZXJyb3Igb24gdGhlIAotCSAgIHBlc3NpbWlzdGljIHNpZGUuIHRoaXMgaXMgZ3Jvc3MuIGl0IHdvdWxkIGJlIGJldHRlciB0byBmaXggdGhlIAotCSAgIGludGVyZmFjZS4gKi8JCi0JLyogZWF4OiB6ZXJvLCBlYng6IDY0ICovCi0uTHMxZTogCWFkZGwgJDgsJWVheAotLkxzMmU6IAlhZGRsICQ4LCVlYXgKLS5MczNlOiAJYWRkbCAkOCwlZWF4Ci0uTHM0ZTogCWFkZGwgJDgsJWVheAotLkxzNWU6IAlhZGRsICQ4LCVlYXgKLS5MczZlOiAJYWRkbCAkOCwlZWF4Ci0uTHM3ZTogCWFkZGwgJDgsJWVheAotLkxzOGU6IAlhZGRsICQ4LCVlYXgKLQlhZGRxICVyYngsJXJkaQkvKiArNjQgKi8KLQlzdWJxICVyYXgsJXJkaSAgLyogY29ycmVjdCBkZXN0aW5hdGlvbiB3aXRoIGNvbXB1dGVkIG9mZnNldCAqLwotCi0Jc2hscSAkNiwlcmR4CS8qIGxvb3AgY291bnRlciAqIDY0IChzdHJpZGUgbGVuZ3RoKSAqLwotCWFkZHEgJXJheCwlcmR4CS8qIGFkZCBvZmZzZXQgdG8gbG9vcGNudCAqLwotCWFuZGwgJDYzLCVlY3gJLyogcmVtYWluaW5nIGJ5dGVzICovCi0JYWRkcSAlcmN4LCVyZHgJLyogYWRkIHRoZW0gKi8KLQlqbXAgLkx6ZXJvX3Jlc3QKLQotCS8qIGV4Y2VwdGlvbiBvbiBxdWFkIHdvcmQgbG9vcCBpbiB0YWlsIGhhbmRsaW5nICovCi0JLyogZWN4Oglsb29wY250LzgsICVlZHg6IGxlbmd0aCwgcmRpOiBjb3JyZWN0ICovCi0uTGVfcXVhZDoKLQlzaGxsICQzLCVlY3gKLQlhbmRsICQ3LCVlZHgKLQlhZGRsICVlY3gsJWVkeAotCS8qIGVkeDogYnl0ZXMgdG8gemVybywgcmRpOiBkZXN0LCBlYXg6emVybyAqLwotLkx6ZXJvX3Jlc3Q6Ci0JbW92cSAlcmR4LCVyY3gKLS5MZV9ieXRlOgotCXhvcmwgJWVheCwlZWF4Ci0uTGU1OglyZXAgCi0Jc3Rvc2IKLQkvKiB3aGVuIHRoZXJlIGlzIGFub3RoZXIgZXhjZXB0aW9uIHdoaWxlIHplcm9pbmcgdGhlIHJlc3QganVzdCByZXR1cm4gKi8KLS5MZV96ZXJvOgkJCi0JbW92cSAlcmR4LCVyYXgKLQlqbXAgLkxlbmRlCi0KLQkvKiBDIHN0ZXBwaW5nIEs4IHJ1biBmYXN0ZXIgdXNpbmcgdGhlIHN0cmluZyBjb3B5IGluc3RydWN0aW9ucy4KLQkgICBUaGlzIGlzIGFsc28gYSBsb3Qgc2ltcGxlci4gVXNlIHRoZW0gd2hlbiBwb3NzaWJsZS4KLQkgICBQYXRjaCBpbiBqbXBzIHRvIHRoaXMgY29kZSBpbnN0ZWFkIG9mIGNvcHlpbmcgaXQgZnVsbHkKLQkgICB0byBhdm9pZCB1bndhbnRlZCBhbGlhc2luZyBpbiB0aGUgZXhjZXB0aW9uIHRhYmxlcy4gKi8KLQkJCi0gLyogcmRpCWRlc3RpbmF0aW9uCi0gICogcnNpIHNvdXJjZQotICAqIHJkeCBjb3VudAotICAqCi0gICogT3V0cHV0OgkJCi0gICogZWF4IHVuY29waWVkIGJ5dGVzIG9yIDAgaWYgc3VjY2Vzc2Z1bGwuCi0gICovCQkJCi1jb3B5X3VzZXJfZ2VuZXJpY19jOgorCS5nbG9ibCBjb3B5X3VzZXJfZ2VuZXJpYworY29weV91c2VyX2dlbmVyaWM6CiAJbW92bCAlZWR4LCVlY3gKIAlzaHJsICQzLCVlY3gKIAlhbmRsICQ3LCVlZHgJCisJanogICA1ZgogMToJcmVwIAogCW1vdnNxIAogCW1vdmwgJWVkeCwlZWN4CisJeG9yICVlYXgsJWVheAogMjoJcmVwCiAJbW92c2IKLTQ6CW1vdmwgJWVjeCwlZWF4CiAJcmV0CisJLyogYWxpZ24gaGVyZT8gKi8KKzU6IAl4b3JsICVlYXgsJWVheAorNjoJcmVwIG1vdnNxCisJcmV0CisKKwkuc2VjdGlvbiAuZml4dXAsImF4IgogMzoJbGVhICglcmR4LCVyY3gsOCksJXJheAogCXJldAotCQorNDoJbW92bCAlZWN4LCVlYXgKKwlyZXQKKwkucHJldmlvdXMKKwogCS5zZWN0aW9uIF9fZXhfdGFibGUsImEiCiAJLnF1YWQgMWIsM2IKIAkucXVhZCAyYiw0YgorCS5xdWFkIDZiLDRiCiAJLnByZXZpb3VzCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9saWIvZGVsYXkuYyBiL2FyY2gveDg2XzY0L2xpYi9kZWxheS5jCmluZGV4IDg0MWJkNzMuLjAzYzQ2MGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2xpYi9kZWxheS5jCisrKyBiL2FyY2gveDg2XzY0L2xpYi9kZWxheS5jCkBAIC0zOSw3ICszOSw3IEBACiAKIGlubGluZSB2b2lkIF9fY29uc3RfdWRlbGF5KHVuc2lnbmVkIGxvbmcgeGxvb3BzKQogewotCV9fZGVsYXkoKCh4bG9vcHMgKiBjcHVfZGF0YVtyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXS5sb29wc19wZXJfamlmZnkpID4+IDMyKSAqIEhaKTsKKwlfX2RlbGF5KCh4bG9vcHMgKiBIWiAqIGNwdV9kYXRhW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldLmxvb3BzX3Blcl9qaWZmeSkgPj4gMzIpOwogfQogCiB2b2lkIF9fdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9saWIvdXNlcmNvcHkuYyBiL2FyY2gveDg2XzY0L2xpYi91c2VyY29weS5jCmluZGV4IGRiOGFiYmEuLjliYzJjMjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2xpYi91c2VyY29weS5jCisrKyBiL2FyY2gveDg2XzY0L2xpYi91c2VyY29weS5jCkBAIC0xMDksMTQgKzEwOSwxMSBAQAogICogUmV0dXJuIDAgb24gZXhjZXB0aW9uLCBhIHZhbHVlIGdyZWF0ZXIgdGhhbiBOIGlmIHRvbyBsb25nCiAgKi8KIAotbG9uZyBzdHJubGVuX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnMsIGxvbmcgbikKK2xvbmcgX19zdHJubGVuX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnMsIGxvbmcgbikKIHsKIAlsb25nIHJlcyA9IDA7CiAJY2hhciBjOwogCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHMsIG4pKQotCQlyZXR1cm4gMDsKLQogCXdoaWxlICgxKSB7CiAJCWlmIChyZXM+bikKIAkJCXJldHVybiBuKzE7CkBAIC0xMjksNiArMTI2LDEzIEBACiAJfQogfQogCitsb25nIHN0cm5sZW5fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqcywgbG9uZyBuKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBzLCBuKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIF9fc3Rybmxlbl91c2VyKHMsIG4pOworfQorCiBsb25nIHN0cmxlbl91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzKQogewogCWxvbmcgcmVzID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L21tL01ha2VmaWxlIGIvYXJjaC94ODZfNjQvbW0vTWFrZWZpbGUKaW5kZXggMWQyMzJhOC4uZDI1YWM4NiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbW0vTWFrZWZpbGUKKysrIGIvYXJjaC94ODZfNjQvbW0vTWFrZWZpbGUKQEAgLTIsNyArMiw3IEBACiAjIE1ha2VmaWxlIGZvciB0aGUgbGludXggeDg2XzY0LXNwZWNpZmljIHBhcnRzIG9mIHRoZSBtZW1vcnkgbWFuYWdlci4KICMKIAotb2JqLXkJIDo9IGluaXQubyBmYXVsdC5vIGlvcmVtYXAubyBleHRhYmxlLm8gcGFnZWF0dHIubworb2JqLXkJIDo9IGluaXQubyBmYXVsdC5vIGlvcmVtYXAubyBleHRhYmxlLm8gcGFnZWF0dHIubyBtbWFwLm8KIG9iai0kKENPTkZJR19IVUdFVExCX1BBR0UpICs9IGh1Z2V0bGJwYWdlLm8KIG9iai0kKENPTkZJR19OVU1BKSArPSBudW1hLm8KIG9iai0kKENPTkZJR19LOF9OVU1BKSArPSBrOHRvcG9sb2d5Lm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L21tL2ZhdWx0LmMgYi9hcmNoL3g4Nl82NC9tbS9mYXVsdC5jCmluZGV4IDNhNjM3MDcuLjI2ZWFjMTkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L21tL2ZhdWx0LmMKKysrIGIvYXJjaC94ODZfNjQvbW0vZmF1bHQuYwpAQCAtMzUsNiArMzUsMTMgQEAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KIAorLyogUGFnZSBmYXVsdCBlcnJvciBjb2RlIGJpdHMgKi8KKyNkZWZpbmUgUEZfUFJPVAkoMTw8MCkJCS8qIG9yIG5vIHBhZ2UgZm91bmQgKi8KKyNkZWZpbmUgUEZfV1JJVEUJKDE8PDEpCisjZGVmaW5lIFBGX1VTRVIJKDE8PDIpCisjZGVmaW5lIFBGX1JTVkQJKDE8PDMpCisjZGVmaW5lIFBGX0lOU1RSCSgxPDw0KQorCiB2b2lkIGJ1c3Rfc3BpbmxvY2tzKGludCB5ZXMpCiB7CiAJaW50IGxvZ2xldmVsX3NhdmUgPSBjb25zb2xlX2xvZ2xldmVsOwpAQCAtNjgsNyArNzUsNyBAQAogCXVuc2lnbmVkIGNoYXIgKm1heF9pbnN0cjsKIAogCS8qIElmIGl0IHdhcyBhIGV4ZWMgZmF1bHQgaWdub3JlICovCi0JaWYgKGVycm9yX2NvZGUgJiAoMTw8NCkpCisJaWYgKGVycm9yX2NvZGUgJiBQRl9JTlNUUikKIAkJcmV0dXJuIDA7CiAJCiAJaW5zdHIgPSAodW5zaWduZWQgY2hhciAqKWNvbnZlcnRfcmlwX3RvX2xpbmVhcihjdXJyZW50LCByZWdzKTsKQEAgLTIyMiwxNyArMjI5LDIyIEBACiAJCQkJIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gb29wc19iZWdpbigpOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCiAJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBDb3JydXB0ZWQgcGFnZSB0YWJsZSBhdCBhZGRyZXNzICVseFxuIiwKIAkgICAgICAgY3VycmVudC0+Y29tbSwgYWRkcmVzcyk7CiAJZHVtcF9wYWdldGFibGUoYWRkcmVzcyk7CisJdHNrID0gY3VycmVudDsKKwl0c2stPnRocmVhZC5jcjIgPSBhZGRyZXNzOworCXRzay0+dGhyZWFkLnRyYXBfbm8gPSAxNDsKKwl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gZXJyb3JfY29kZTsKIAlfX2RpZSgiQmFkIHBhZ2V0YWJsZSIsIHJlZ3MsIGVycm9yX2NvZGUpOwogCW9vcHNfZW5kKGZsYWdzKTsKIAlkb19leGl0KFNJR0tJTEwpOwogfQogCiAvKgotICogSGFuZGxlIGEgZmF1bHQgb24gdGhlIHZtYWxsb2Mgb3IgbW9kdWxlIG1hcHBpbmcgYXJlYQorICogSGFuZGxlIGEgZmF1bHQgb24gdGhlIHZtYWxsb2MgYXJlYQogICoKICAqIFRoaXMgYXNzdW1lcyBubyBsYXJnZSBwYWdlcyBpbiB0aGVyZS4KICAqLwpAQCAtMjc4LDcgKzI5MCw2IEBACiAJICAgdGhhdC4gKi8KIAlpZiAoIXB0ZV9wcmVzZW50KCpwdGUpIHx8IHB0ZV9wZm4oKnB0ZSkgIT0gcHRlX3BmbigqcHRlX3JlZikpCiAJCUJVRygpOwotCV9fZmx1c2hfdGxiX2FsbCgpOwogCXJldHVybiAwOwogfQogCkBAIC0yODksMTIgKzMwMCw2IEBACiAgKiBUaGlzIHJvdXRpbmUgaGFuZGxlcyBwYWdlIGZhdWx0cy4gIEl0IGRldGVybWluZXMgdGhlIGFkZHJlc3MsCiAgKiBhbmQgdGhlIHByb2JsZW0sIGFuZCB0aGVuIHBhc3NlcyBpdCBvZmYgdG8gb25lIG9mIHRoZSBhcHByb3ByaWF0ZQogICogcm91dGluZXMuCi0gKgotICogZXJyb3JfY29kZToKLSAqCWJpdCAwID09IDAgbWVhbnMgbm8gcGFnZSBmb3VuZCwgMSBtZWFucyBwcm90ZWN0aW9uIGZhdWx0Ci0gKgliaXQgMSA9PSAwIG1lYW5zIHJlYWQsIDEgbWVhbnMgd3JpdGUKLSAqCWJpdCAyID09IDAgbWVhbnMga2VybmVsLCAxIG1lYW5zIHVzZXItbW9kZQotICogICAgICBiaXQgMyA9PSAxIG1lYW5zIGZhdWx0IHdhcyBhbiBpbnN0cnVjdGlvbiBmZXRjaAogICovCiBhc21saW5rYWdlIHZvaWQgX19rcHJvYmVzIGRvX3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCiAJCQkJCXVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSkKQEAgLTMzNywxMiArMzQyLDE2IEBACiAJICoKIAkgKiBUaGlzIHZlcmlmaWVzIHRoYXQgdGhlIGZhdWx0IGhhcHBlbnMgaW4ga2VybmVsIHNwYWNlCiAJICogKGVycm9yX2NvZGUgJiA0KSA9PSAwLCBhbmQgdGhhdCB0aGUgZmF1bHQgd2FzIG5vdCBhCi0JICogcHJvdGVjdGlvbiBlcnJvciAoZXJyb3JfY29kZSAmIDEpID09IDAuCisJICogcHJvdGVjdGlvbiBlcnJvciAoZXJyb3JfY29kZSAmIDkpID09IDAuCiAJICovCiAJaWYgKHVubGlrZWx5KGFkZHJlc3MgPj0gVEFTS19TSVpFNjQpKSB7Ci0JCWlmICghKGVycm9yX2NvZGUgJiA1KSAmJgotCQkgICAgICAoKGFkZHJlc3MgPj0gVk1BTExPQ19TVEFSVCAmJiBhZGRyZXNzIDwgVk1BTExPQ19FTkQpIHx8Ci0JCSAgICAgICAoYWRkcmVzcyA+PSBNT0RVTEVTX1ZBRERSICYmIGFkZHJlc3MgPCBNT0RVTEVTX0VORCkpKSB7CisJCS8qCisJCSAqIERvbid0IGNoZWNrIGZvciB0aGUgbW9kdWxlIHJhbmdlIGhlcmU6IGl0cyBQTUw0CisJCSAqIGlzIGFsd2F5cyBpbml0aWFsaXplZCBiZWNhdXNlIGl0J3Mgc2hhcmVkIHdpdGggdGhlIG1haW4KKwkJICoga2VybmVsIHRleHQuIE9ubHkgdm1hbGxvYyBtYXkgbmVlZCBQTUw0IHN5bmN1cHMuCisJCSAqLworCQlpZiAoIShlcnJvcl9jb2RlICYgKFBGX1JTVkR8UEZfVVNFUnxQRl9QUk9UKSkgJiYKKwkJICAgICAgKChhZGRyZXNzID49IFZNQUxMT0NfU1RBUlQgJiYgYWRkcmVzcyA8IFZNQUxMT0NfRU5EKSkpIHsKIAkJCWlmICh2bWFsbG9jX2ZhdWx0KGFkZHJlc3MpIDwgMCkKIAkJCQlnb3RvIGJhZF9hcmVhX25vc2VtYXBob3JlOwogCQkJcmV0dXJuOwpAQCAtMzU0LDcgKzM2Myw3IEBACiAJCWdvdG8gYmFkX2FyZWFfbm9zZW1hcGhvcmU7CiAJfQogCi0JaWYgKHVubGlrZWx5KGVycm9yX2NvZGUgJiAoMSA8PCAzKSkpCisJaWYgKHVubGlrZWx5KGVycm9yX2NvZGUgJiBQRl9SU1ZEKSkKIAkJcGd0YWJsZV9iYWQoYWRkcmVzcywgcmVncywgZXJyb3JfY29kZSk7CiAKIAkvKgpAQCAtMzgxLDcgKzM5MCw3IEBACiAJICogdGh1cyBhdm9pZGluZyB0aGUgZGVhZGxvY2suCiAJICovCiAJaWYgKCFkb3duX3JlYWRfdHJ5bG9jaygmbW0tPm1tYXBfc2VtKSkgewotCQlpZiAoKGVycm9yX2NvZGUgJiA0KSA9PSAwICYmCisJCWlmICgoZXJyb3JfY29kZSAmIFBGX1VTRVIpID09IDAgJiYKIAkJICAgICFzZWFyY2hfZXhjZXB0aW9uX3RhYmxlcyhyZWdzLT5yaXApKQogCQkJZ290byBiYWRfYXJlYV9ub3NlbWFwaG9yZTsKIAkJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwpAQCAtNDA4LDE3ICs0MTcsMTcgQEAKIGdvb2RfYXJlYToKIAlpbmZvLnNpX2NvZGUgPSBTRUdWX0FDQ0VSUjsKIAl3cml0ZSA9IDA7Ci0Jc3dpdGNoIChlcnJvcl9jb2RlICYgMykgeworCXN3aXRjaCAoZXJyb3JfY29kZSAmIChQRl9QUk9UfFBGX1dSSVRFKSkgewogCQlkZWZhdWx0OgkvKiAzOiB3cml0ZSwgcHJlc2VudCAqLwogCQkJLyogZmFsbCB0aHJvdWdoICovCi0JCWNhc2UgMjoJCS8qIHdyaXRlLCBub3QgcHJlc2VudCAqLworCQljYXNlIFBGX1dSSVRFOgkJLyogd3JpdGUsIG5vdCBwcmVzZW50ICovCiAJCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKQogCQkJCWdvdG8gYmFkX2FyZWE7CiAJCQl3cml0ZSsrOwogCQkJYnJlYWs7Ci0JCWNhc2UgMToJCS8qIHJlYWQsIHByZXNlbnQgKi8KKwkJY2FzZSBQRl9QUk9UOgkJLyogcmVhZCwgcHJlc2VudCAqLwogCQkJZ290byBiYWRfYXJlYTsKLQkJY2FzZSAwOgkJLyogcmVhZCwgbm90IHByZXNlbnQgKi8KKwkJY2FzZSAwOgkJCS8qIHJlYWQsIG5vdCBwcmVzZW50ICovCiAJCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgKFZNX1JFQUQgfCBWTV9FWEVDKSkpCiAJCQkJZ290byBiYWRfYXJlYTsKIAl9CkBAIC00NTMsNyArNDYyLDcgQEAKIAogYmFkX2FyZWFfbm9zZW1hcGhvcmU6CiAJLyogVXNlciBtb2RlIGFjY2Vzc2VzIGp1c3QgY2F1c2UgYSBTSUdTRUdWICovCi0JaWYgKGVycm9yX2NvZGUgJiA0KSB7CisJaWYgKGVycm9yX2NvZGUgJiBQRl9VU0VSKSB7CiAJCWlmIChpc19wcmVmZXRjaChyZWdzLCBhZGRyZXNzLCBlcnJvcl9jb2RlKSkKIAkJCXJldHVybjsKIApAQCAtNTIxLDYgKzUzMCw5IEBACiAJcHJpbnRrX2FkZHJlc3MocmVncy0+cmlwKTsKIAlwcmludGsoIlxuIik7CiAJZHVtcF9wYWdldGFibGUoYWRkcmVzcyk7CisJdHNrLT50aHJlYWQuY3IyID0gYWRkcmVzczsKKwl0c2stPnRocmVhZC50cmFwX25vID0gMTQ7CisJdHNrLT50aHJlYWQuZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7CiAJX19kaWUoIk9vcHMiLCByZWdzLCBlcnJvcl9jb2RlKTsKIAkvKiBFeGVjdXRpdmUgc3VtbWFyeSBpbiBjYXNlIHRoZSBib2R5IG9mIHRoZSBvb3BzIHNjcm9sbGVkIGF3YXkgKi8KIAlwcmludGsoS0VSTl9FTUVSRyAiQ1IyOiAlMDE2bHhcbiIsIGFkZHJlc3MpOwpAQCAtNTQ2LDcgKzU1OCw3IEBACiAJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKIAogCS8qIEtlcm5lbCBtb2RlPyBIYW5kbGUgZXhjZXB0aW9ucyBvciBkaWUgKi8KLQlpZiAoIShlcnJvcl9jb2RlICYgNCkpCisJaWYgKCEoZXJyb3JfY29kZSAmIFBGX1VTRVIpKQogCQlnb3RvIG5vX2NvbnRleHQ7CiAKIAl0c2stPnRocmVhZC5jcjIgPSBhZGRyZXNzOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvbW0vaW5pdC5jIGIvYXJjaC94ODZfNjQvbW0vaW5pdC5jCmluZGV4IDFmYWFlNWYuLjdhZjE3NDIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L21tL2luaXQuYworKysgYi9hcmNoL3g4Nl82NC9tbS9pbml0LmMKQEAgLTIzLDYgKzIzLDkgQEAKICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWVtb3J5X2hvdHBsdWcuaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CkBAIC0zOCwxMSArNDEsMTYgQEAKICNpbmNsdWRlIDxhc20vcHJvdG8uaD4KICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisjaW5jbHVkZSA8YXNtL2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8YXNtL3N3aW90bGIuaD4KIAogI2lmbmRlZiBEcHJpbnRrCiAjZGVmaW5lIERwcmludGsoeC4uLikKICNlbmRpZgogCitzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzKiBkbWFfb3BzOworRVhQT1JUX1NZTUJPTChkbWFfb3BzKTsKKwogc3RhdGljIHVuc2lnbmVkIGxvbmcgZG1hX3Jlc2VydmUgX19pbml0ZGF0YTsKIAogREVGSU5FX1BFUl9DUFUoc3RydWN0IG1tdV9nYXRoZXIsIG1tdV9nYXRoZXJzKTsKQEAgLTE3NCwxMyArMTgyLDE5IEBACiAJe30KIH07IAogCi1zdGF0aWMgX19pbml0IHZvaWQgKmFsbG9jX2xvd19wYWdlKGludCAqaW5kZXgsIHVuc2lnbmVkIGxvbmcgKnBoeXMpIAorc3RhdGljIF9fbWVtaW5pdCB2b2lkICphbGxvY19sb3dfcGFnZShpbnQgKmluZGV4LCB1bnNpZ25lZCBsb25nICpwaHlzKQogeyAKIAlzdHJ1Y3QgdGVtcF9tYXAgKnRpOwogCWludCBpOyAKIAl1bnNpZ25lZCBsb25nIHBmbiA9IHRhYmxlX2VuZCsrLCBwYWRkcjsgCiAJdm9pZCAqYWRyOwogCisJaWYgKGFmdGVyX2Jvb3RtZW0pIHsKKwkJYWRyID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0FUT01JQyk7CisJCSpwaHlzID0gX19wYShhZHIpOworCQlyZXR1cm4gYWRyOworCX0KKwogCWlmIChwZm4gPj0gZW5kX3BmbikgCiAJCXBhbmljKCJhbGxvY19sb3dfcGFnZTogcmFuIG91dCBvZiBtZW1vcnkiKTsgCiAJZm9yIChpID0gMDsgdGVtcF9tYXBwaW5nc1tpXS5hbGxvY2F0ZWQ7IGkrKykgewpAQCAtMTkzLDU1ICsyMDcsODYgQEAKIAl0aS0+YWxsb2NhdGVkID0gMTsgCiAJX19mbHVzaF90bGIoKTsgCSAgICAgICAKIAlhZHIgPSB0aS0+YWRkcmVzcyArICgocGZuIDw8IFBBR0VfU0hJRlQpICYgflBNRF9NQVNLKTsgCisJbWVtc2V0KGFkciwgMCwgUEFHRV9TSVpFKTsKIAkqaW5kZXggPSBpOyAKIAkqcGh5cyAgPSBwZm4gKiBQQUdFX1NJWkU7ICAKIAlyZXR1cm4gYWRyOyAKIH0gCiAKLXN0YXRpYyBfX2luaXQgdm9pZCB1bm1hcF9sb3dfcGFnZShpbnQgaSkKK3N0YXRpYyBfX21lbWluaXQgdm9pZCB1bm1hcF9sb3dfcGFnZShpbnQgaSkKIHsgCi0Jc3RydWN0IHRlbXBfbWFwICp0aSA9ICZ0ZW1wX21hcHBpbmdzW2ldOworCXN0cnVjdCB0ZW1wX21hcCAqdGk7CisKKwlpZiAoYWZ0ZXJfYm9vdG1lbSkKKwkJcmV0dXJuOworCisJdGkgPSAmdGVtcF9tYXBwaW5nc1tpXTsKIAlzZXRfcG1kKHRpLT5wbWQsIF9fcG1kKDApKTsKIAl0aS0+YWxsb2NhdGVkID0gMDsgCiB9IAogCi1zdGF0aWMgdm9pZCBfX2luaXQgcGh5c19wdWRfaW5pdChwdWRfdCAqcHVkLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kKQoteyAKLQlsb25nIGksIGo7IAorc3RhdGljIHZvaWQgX19tZW1pbml0CitwaHlzX3BtZF9pbml0KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJaW50IGk7CiAKLQlpID0gcHVkX2luZGV4KGFkZHJlc3MpOworCWZvciAoaSA9IDA7IGkgPCBQVFJTX1BFUl9QTUQ7IHBtZCsrLCBpKyssIGFkZHJlc3MgKz0gUE1EX1NJWkUpIHsKKwkJdW5zaWduZWQgbG9uZyBlbnRyeTsKKworCQlpZiAoYWRkcmVzcyA+IGVuZCkgeworCQkJZm9yICg7IGkgPCBQVFJTX1BFUl9QTUQ7IGkrKywgcG1kKyspCisJCQkJc2V0X3BtZChwbWQsIF9fcG1kKDApKTsKKwkJCWJyZWFrOworCQl9CisJCWVudHJ5ID0gX1BBR0VfTlh8X1BBR0VfUFNFfF9LRVJOUEdfVEFCTEV8X1BBR0VfR0xPQkFMfGFkZHJlc3M7CisJCWVudHJ5ICY9IF9fc3VwcG9ydGVkX3B0ZV9tYXNrOworCQlzZXRfcG1kKHBtZCwgX19wbWQoZW50cnkpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fbWVtaW5pdAorcGh5c19wbWRfdXBkYXRlKHB1ZF90ICpwdWQsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJcG1kX3QgKnBtZCA9IHBtZF9vZmZzZXQocHVkLCAodW5zaWduZWQgbG9uZylfX3ZhKGFkZHJlc3MpKTsKKworCWlmIChwbWRfbm9uZSgqcG1kKSkgeworCQlzcGluX2xvY2soJmluaXRfbW0ucGFnZV90YWJsZV9sb2NrKTsKKwkJcGh5c19wbWRfaW5pdChwbWQsIGFkZHJlc3MsIGVuZCk7CisJCXNwaW5fdW5sb2NrKCZpbml0X21tLnBhZ2VfdGFibGVfbG9jayk7CisJCV9fZmx1c2hfdGxiX2FsbCgpOworCX0KK30KKworc3RhdGljIHZvaWQgX19tZW1pbml0IHBoeXNfcHVkX2luaXQocHVkX3QgKnB1ZCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCkKK3sgCisJbG9uZyBpID0gcHVkX2luZGV4KGFkZHJlc3MpOworCiAJcHVkID0gcHVkICsgaTsKKworCWlmIChhZnRlcl9ib290bWVtICYmIHB1ZF92YWwoKnB1ZCkpIHsKKwkJcGh5c19wbWRfdXBkYXRlKHB1ZCwgYWRkcmVzcywgZW5kKTsKKwkJcmV0dXJuOworCX0KKwogCWZvciAoOyBpIDwgUFRSU19QRVJfUFVEOyBwdWQrKywgaSsrKSB7CiAJCWludCBtYXA7IAogCQl1bnNpZ25lZCBsb25nIHBhZGRyLCBwbWRfcGh5czsKIAkJcG1kX3QgKnBtZDsKIAotCQlwYWRkciA9IGFkZHJlc3MgKyBpKlBVRF9TSVpFOwotCQlpZiAocGFkZHIgPj0gZW5kKSB7IAotCQkJZm9yICg7IGkgPCBQVFJTX1BFUl9QVUQ7IGkrKywgcHVkKyspIAotCQkJCXNldF9wdWQocHVkLCBfX3B1ZCgwKSk7IAorCQlwYWRkciA9IChhZGRyZXNzICYgUEdESVJfTUFTSykgKyBpKlBVRF9TSVpFOworCQlpZiAocGFkZHIgPj0gZW5kKQogCQkJYnJlYWs7Ci0JCX0gCiAKLQkJaWYgKCFlODIwX21hcHBlZChwYWRkciwgcGFkZHIrUFVEX1NJWkUsIDApKSB7IAorCQlpZiAoIWFmdGVyX2Jvb3RtZW0gJiYgIWU4MjBfbWFwcGVkKHBhZGRyLCBwYWRkcitQVURfU0laRSwgMCkpIHsKIAkJCXNldF9wdWQocHVkLCBfX3B1ZCgwKSk7IAogCQkJY29udGludWU7CiAJCX0gCiAKIAkJcG1kID0gYWxsb2NfbG93X3BhZ2UoJm1hcCwgJnBtZF9waHlzKTsKKwkJc3Bpbl9sb2NrKCZpbml0X21tLnBhZ2VfdGFibGVfbG9jayk7CiAJCXNldF9wdWQocHVkLCBfX3B1ZChwbWRfcGh5cyB8IF9LRVJOUEdfVEFCTEUpKTsKLQkJZm9yIChqID0gMDsgaiA8IFBUUlNfUEVSX1BNRDsgcG1kKyssIGorKywgcGFkZHIgKz0gUE1EX1NJWkUpIHsKLQkJCXVuc2lnbmVkIGxvbmcgcGU7Ci0KLQkJCWlmIChwYWRkciA+PSBlbmQpIHsgCi0JCQkJZm9yICg7IGogPCBQVFJTX1BFUl9QTUQ7IGorKywgcG1kKyspCi0JCQkJCXNldF9wbWQocG1kLCAgX19wbWQoMCkpOyAKLQkJCQlicmVhazsKLQkJfQotCQkJcGUgPSBfUEFHRV9OWHxfUEFHRV9QU0UgfCBfS0VSTlBHX1RBQkxFIHwgX1BBR0VfR0xPQkFMIHwgcGFkZHI7Ci0JCQlwZSAmPSBfX3N1cHBvcnRlZF9wdGVfbWFzazsKLQkJCXNldF9wbWQocG1kLCBfX3BtZChwZSkpOwotCQl9CisJCXBoeXNfcG1kX2luaXQocG1kLCBwYWRkciwgZW5kKTsKKwkJc3Bpbl91bmxvY2soJmluaXRfbW0ucGFnZV90YWJsZV9sb2NrKTsKIAkJdW5tYXBfbG93X3BhZ2UobWFwKTsKIAl9CiAJX19mbHVzaF90bGIoKTsKQEAgLTI0OSwyNSArMjk0LDMyIEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBmaW5kX2Vhcmx5X3RhYmxlX3NwYWNlKHVuc2lnbmVkIGxvbmcgZW5kKQogewotCXVuc2lnbmVkIGxvbmcgcHVkcywgcG1kcywgdGFibGVzOworCXVuc2lnbmVkIGxvbmcgcHVkcywgcG1kcywgdGFibGVzLCBzdGFydDsKIAogCXB1ZHMgPSAoZW5kICsgUFVEX1NJWkUgLSAxKSA+PiBQVURfU0hJRlQ7CiAJcG1kcyA9IChlbmQgKyBQTURfU0laRSAtIDEpID4+IFBNRF9TSElGVDsKIAl0YWJsZXMgPSByb3VuZF91cChwdWRzICogc2l6ZW9mKHB1ZF90KSwgUEFHRV9TSVpFKSArCiAJCSByb3VuZF91cChwbWRzICogc2l6ZW9mKHBtZF90KSwgUEFHRV9TSVpFKTsKIAotCXRhYmxlX3N0YXJ0ID0gZmluZF9lODIwX2FyZWEoMHg4MDAwLCBfX3BhX3N5bWJvbCgmX3RleHQpLCB0YWJsZXMpOworIAkvKiBSRUQtUEVOIHB1dHRpbmcgcGFnZSB0YWJsZXMgb25seSBvbiBub2RlIDAgY291bGQKKyAJICAgY2F1c2UgYSBob3RzcG90IGFuZCBmaWxsIHVwIFpPTkVfRE1BLiBUaGUgcGFnZSB0YWJsZXMKKyAJICAgbmVlZCByb3VnaGx5IDAuNUtCIHBlciBHQi4gKi8KKyAJc3RhcnQgPSAweDgwMDA7CisgCXRhYmxlX3N0YXJ0ID0gZmluZF9lODIwX2FyZWEoc3RhcnQsIGVuZCwgdGFibGVzKTsKIAlpZiAodGFibGVfc3RhcnQgPT0gLTFVTCkKIAkJcGFuaWMoIkNhbm5vdCBmaW5kIHNwYWNlIGZvciB0aGUga2VybmVsIHBhZ2UgdGFibGVzIik7CiAKIAl0YWJsZV9zdGFydCA+Pj0gUEFHRV9TSElGVDsKIAl0YWJsZV9lbmQgPSB0YWJsZV9zdGFydDsKKworCWVhcmx5X3ByaW50aygia2VybmVsIGRpcmVjdCBtYXBwaW5nIHRhYmxlcyB1cCB0byAlbHggQCAlbHgtJWx4XG4iLAorCQllbmQsIHRhYmxlX3N0YXJ0IDw8IFBBR0VfU0hJRlQsIHRhYmxlX2VuZCA8PCBQQUdFX1NISUZUKTsKIH0KIAogLyogU2V0dXAgdGhlIGRpcmVjdCBtYXBwaW5nIG9mIHRoZSBwaHlzaWNhbCBtZW1vcnkgYXQgUEFHRV9PRkZTRVQuCiAgICBUaGlzIHJ1bnMgYmVmb3JlIGJvb3RtZW0gaXMgaW5pdGlhbGl6ZWQgYW5kIGdldHMgcGFnZXMgZGlyZWN0bHkgZnJvbSB0aGUgCiAgICBwaHlzaWNhbCBtZW1vcnkuIFRvIGFjY2VzcyB0aGVtIHRoZXkgYXJlIHRlbXBvcmFyaWx5IG1hcHBlZC4gKi8KLXZvaWQgX19pbml0IGluaXRfbWVtb3J5X21hcHBpbmcodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit2b2lkIF9fbWVtaW5pdCBpbml0X21lbW9yeV9tYXBwaW5nKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogeyAKIAl1bnNpZ25lZCBsb25nIG5leHQ7IAogCkBAIC0yNzksNyArMzMxLDggQEAKIAkgKiBtYXBwZWQuICBVbmZvcnR1bmF0ZWx5IHRoaXMgaXMgZG9uZSBjdXJyZW50bHkgYmVmb3JlIHRoZSBub2RlcyBhcmUgCiAJICogZGlzY292ZXJlZC4KIAkgKi8KLQlmaW5kX2Vhcmx5X3RhYmxlX3NwYWNlKGVuZCk7CisJaWYgKCFhZnRlcl9ib290bWVtKQorCQlmaW5kX2Vhcmx5X3RhYmxlX3NwYWNlKGVuZCk7CiAKIAlzdGFydCA9ICh1bnNpZ25lZCBsb25nKV9fdmEoc3RhcnQpOwogCWVuZCA9ICh1bnNpZ25lZCBsb25nKV9fdmEoZW5kKTsKQEAgLTI4NywyMCArMzQwLDI2IEBACiAJZm9yICg7IHN0YXJ0IDwgZW5kOyBzdGFydCA9IG5leHQpIHsKIAkJaW50IG1hcDsKIAkJdW5zaWduZWQgbG9uZyBwdWRfcGh5czsgCi0JCXB1ZF90ICpwdWQgPSBhbGxvY19sb3dfcGFnZSgmbWFwLCAmcHVkX3BoeXMpOworCQlwZ2RfdCAqcGdkID0gcGdkX29mZnNldF9rKHN0YXJ0KTsKKwkJcHVkX3QgKnB1ZDsKKworCQlpZiAoYWZ0ZXJfYm9vdG1lbSkKKwkJCXB1ZCA9IHB1ZF9vZmZzZXRfayhwZ2QsIF9fUEFHRV9PRkZTRVQpOworCQllbHNlCisJCQlwdWQgPSBhbGxvY19sb3dfcGFnZSgmbWFwLCAmcHVkX3BoeXMpOworCiAJCW5leHQgPSBzdGFydCArIFBHRElSX1NJWkU7CiAJCWlmIChuZXh0ID4gZW5kKSAKIAkJCW5leHQgPSBlbmQ7IAogCQlwaHlzX3B1ZF9pbml0KHB1ZCwgX19wYShzdGFydCksIF9fcGEobmV4dCkpOwotCQlzZXRfcGdkKHBnZF9vZmZzZXRfayhzdGFydCksIG1rX2tlcm5lbF9wZ2QocHVkX3BoeXMpKTsKKwkJaWYgKCFhZnRlcl9ib290bWVtKQorCQkJc2V0X3BnZChwZ2Rfb2Zmc2V0X2soc3RhcnQpLCBta19rZXJuZWxfcGdkKHB1ZF9waHlzKSk7CiAJCXVubWFwX2xvd19wYWdlKG1hcCk7ICAgCiAJfSAKIAotCWFzbSB2b2xhdGlsZSgibW92cSAlJWNyNCwlMCIgOiAiPXIiIChtbXVfY3I0X2ZlYXR1cmVzKSk7CisJaWYgKCFhZnRlcl9ib290bWVtKQorCQlhc20gdm9sYXRpbGUoIm1vdnEgJSVjcjQsJTAiIDogIj1yIiAobW11X2NyNF9mZWF0dXJlcykpOwogCV9fZmx1c2hfdGxiX2FsbCgpOwotCWVhcmx5X3ByaW50aygia2VybmVsIGRpcmVjdCBtYXBwaW5nIHRhYmxlcyB1cHRvICVseCBAICVseC0lbHhcbiIsIGVuZCwgCi0JICAgICAgIHRhYmxlX3N0YXJ0PDxQQUdFX1NISUZULCAKLQkgICAgICAgdGFibGVfZW5kPDxQQUdFX1NISUZUKTsKIH0KIAogdm9pZCBfX2NwdWluaXQgemFwX2xvd19tYXBwaW5ncyhpbnQgY3B1KQpAQCAtMzc1LDYgKzQzNCw5IEBACiB2b2lkIF9faW5pdCBwYWdpbmdfaW5pdCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgem9uZXNbTUFYX05SX1pPTkVTXSwgaG9sZXNbTUFYX05SX1pPTkVTXTsKKworCW1lbW9yeV9wcmVzZW50KDAsIDAsIGVuZF9wZm4pOworCXNwYXJzZV9pbml0KCk7CiAJc2l6ZV96b25lcyh6b25lcywgaG9sZXMsIDAsIGVuZF9wZm4pOwogCWZyZWVfYXJlYV9pbml0X25vZGUoMCwgTk9ERV9EQVRBKDApLCB6b25lcywKIAkJCSAgICBfX3BhKFBBR0VfT0ZGU0VUKSA+PiBQQUdFX1NISUZULCBob2xlcyk7CkBAIC00MTUsNiArNDc3LDUwIEBACiAJX19mbHVzaF90bGJfYWxsKCk7CiB9IAogCisvKgorICogTWVtb3J5IGhvdHBsdWcgc3BlY2lmaWMgZnVuY3Rpb25zCisgKiBUaGVzZSBhcmUgb25seSBmb3Igbm9uLU5VTUEgbWFjaGluZXMgcmlnaHQgbm93LgorICovCisjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RQTFVHCisKK3ZvaWQgb25saW5lX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7CisJc2V0X3BhZ2VfY291bnQocGFnZSwgMSk7CisJX19mcmVlX3BhZ2UocGFnZSk7CisJdG90YWxyYW1fcGFnZXMrKzsKKwludW1fcGh5c3BhZ2VzKys7Cit9CisKK2ludCBhZGRfbWVtb3J5KHU2NCBzdGFydCwgdTY0IHNpemUpCit7CisJc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCA9IE5PREVfREFUQSgwKTsKKwlzdHJ1Y3Qgem9uZSAqem9uZSA9IHBnZGF0LT5ub2RlX3pvbmVzICsgTUFYX05SX1pPTkVTLTI7CisJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4gPSBzdGFydCA+PiBQQUdFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBzaXplID4+IFBBR0VfU0hJRlQ7CisJaW50IHJldDsKKworCXJldCA9IF9fYWRkX3BhZ2VzKHpvbmUsIHN0YXJ0X3BmbiwgbnJfcGFnZXMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlpbml0X21lbW9yeV9tYXBwaW5nKHN0YXJ0LCAoc3RhcnQgKyBzaXplIC0xKSk7CisKKwlyZXR1cm4gcmV0OworZXJyb3I6CisJcHJpbnRrKCIlczogUHJvYmxlbSBlbmNvdW50ZXJlZCBpbiBfX2FkZF9wYWdlcyFcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWRkX21lbW9yeSk7CisKK2ludCByZW1vdmVfbWVtb3J5KHU2NCBzdGFydCwgdTY0IHNpemUpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyZW1vdmVfbWVtb3J5KTsKKworI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3Qga2NvcmVfbGlzdCBrY29yZV9tZW0sIGtjb3JlX3ZtYWxsb2MsIGtjb3JlX2tlcm5lbCwga2NvcmVfbW9kdWxlcywKIAkJCSBrY29yZV92c3lzY2FsbDsKIApAQCAtNDIzLDEyICs1MjksOSBAQAogCWxvbmcgY29kZXNpemUsIHJlc2VydmVkcGFnZXMsIGRhdGFzaXplLCBpbml0c2l6ZTsKIAogI2lmZGVmIENPTkZJR19TV0lPVExCCi0JaWYgKCFpb21tdV9hcGVydHVyZSAmJgotCSAgICAoZW5kX3BmbiA+PSAweGZmZmZmZmZmPj5QQUdFX1NISUZUIHx8IGZvcmNlX2lvbW11KSkKLQkgICAgICAgc3dpb3RsYiA9IDE7Ci0JaWYgKHN3aW90bGIpCi0JCXN3aW90bGJfaW5pdCgpOwkKKwlwY2lfc3dpb3RsYl9pbml0KCk7CiAjZW5kaWYKKwlub19pb21tdV9pbml0KCk7CiAKIAkvKiBIb3cgbWFueSBlbmQtb2YtbWVtb3J5IHZhcmlhYmxlcyB5b3UgaGF2ZSwgZ3JhbmRtYSEgKi8KIAltYXhfbG93X3BmbiA9IGVuZF9wZm47CkBAIC01MjQsNyArNjI3LDcgQEAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIHZvaWQgZnJlZV9pbml0cmRfbWVtKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewotCWlmIChzdGFydCA8ICh1bnNpZ25lZCBsb25nKSZfZW5kKQorCWlmIChzdGFydCA+PSBlbmQpCiAJCXJldHVybjsKIAlwcmludGsgKCJGcmVlaW5nIGluaXRyZCBtZW1vcnk6ICVsZGsgZnJlZWRcbiIsIChlbmQgLSBzdGFydCkgPj4gMTApOwogCWZvciAoOyBzdGFydCA8IGVuZDsgc3RhcnQgKz0gUEFHRV9TSVpFKSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9tbS9tbWFwLmMgYi9hcmNoL3g4Nl82NC9tbS9tbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNlOWI5OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2XzY0L21tL21tYXAuYwpAQCAtMCwwICsxLDMwIEBACisvKiBDb3B5cmlnaHQgMjAwNSBBbmRpIEtsZWVuLCBTdVNFIExhYnMuCisgKiBMaWNlbnNlZCB1bmRlciBHUEwsIHYuMgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGFzbS9pYTMyLmg+CisKKy8qIE5vdGVib29rOiBtb3ZlIHRoZSBtbWFwIGNvZGUgZnJvbSBzeXNfeDg2XzY0LmMgb3ZlciBoZXJlLiAqLworCit2b2lkIGFyY2hfcGlja19tbWFwX2xheW91dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKyNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KKwlpZiAoY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncyAmIF9USUZfSUEzMikKKwkJcmV0dXJuIGlhMzJfcGlja19tbWFwX2xheW91dChtbSk7CisjZW5kaWYKKwltbS0+bW1hcF9iYXNlID0gVEFTS19VTk1BUFBFRF9CQVNFOworCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX1JBTkRPTUlaRSkgeworCQkvKiBBZGQgMjhiaXQgcmFuZG9tbmVzcyB3aGljaCBpcyBhYm91dCA0MGJpdHMgb2YgYWRkcmVzcyBzcGFjZQorCQkgICBiZWNhdXNlIG1tYXAgYmFzZSBoYXMgdG8gYmUgcGFnZSBhbGlnbmVkLgorIAkJICAgb3IgfjEvMTI4IG9mIHRoZSB0b3RhbCB1c2VyIFZNCisJICAgCSAgICh0b3RhbCB1c2VyIGFkZHJlc3Mgc3BhY2UgaXMgNDdiaXRzKSAqLworCQl1bnNpZ25lZCBybmQgPSBnZXRfcmFuZG9tX2ludCgpICYgMHhmZmZmZmZmOworCQltbS0+bW1hcF9iYXNlICs9ICgodW5zaWduZWQgbG9uZylybmQpIDw8IFBBR0VfU0hJRlQ7CisJfQorCW1tLT5nZXRfdW5tYXBwZWRfYXJlYSA9IGFyY2hfZ2V0X3VubWFwcGVkX2FyZWE7CisJbW0tPnVubWFwX2FyZWEgPSBhcmNoX3VubWFwX2FyZWE7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L21tL251bWEuYyBiL2FyY2gveDg2XzY0L21tL251bWEuYwppbmRleCAxNWI2N2QyLi42ZWY5ZjlhIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9tbS9udW1hLmMKKysrIGIvYXJjaC94ODZfNjQvbW0vbnVtYS5jCkBAIC00Niw4ICs0Niw4IEBACiAgKiAwIGlmIG1lbW5vZG1hcFtdIHRvbyBzbWFsbCAob2Ygc2hpZnQgdG9vIHNtYWxsKQogICogLTEgaWYgbm9kZSBvdmVybGFwIG9yIGxvc3QgcmFtIChzaGlmdCB0b28gYmlnKQogICovCi1zdGF0aWMgaW50IF9faW5pdCBwb3B1bGF0ZV9tZW1ub2RlbWFwKAotCWNvbnN0IHN0cnVjdCBub2RlICpub2RlcywgaW50IG51bW5vZGVzLCBpbnQgc2hpZnQpCitzdGF0aWMgaW50IF9faW5pdAorcG9wdWxhdGVfbWVtbm9kZW1hcChjb25zdCBzdHJ1Y3Qgbm9kZSAqbm9kZXMsIGludCBudW1ub2RlcywgaW50IHNoaWZ0KQogewogCWludCBpOyAKIAlpbnQgcmVzID0gLTE7CkBAIC04MSw3ICs4MSw3IEBACiAJd2hpbGUgKHBvcHVsYXRlX21lbW5vZGVtYXAobm9kZXMsIG51bW5vZGVzLCBzaGlmdCArIDEpID49IDApCiAJCXNoaWZ0Kys7CiAKLQlwcmludGsoS0VSTl9ERUJVRyAiVXNpbmcgJWQgZm9yIHRoZSBoYXNoIHNoaWZ0LlxuIiwKKwlwcmludGsoS0VSTl9ERUJVRyAiTlVNQTogVXNpbmcgJWQgZm9yIHRoZSBoYXNoIHNoaWZ0LlxuIiwKIAkJc2hpZnQpOwogCiAJaWYgKHBvcHVsYXRlX21lbW5vZGVtYXAobm9kZXMsIG51bW5vZGVzLCBzaGlmdCkgIT0gMSkgewpAQCAtMTEwLDcgKzExMCw3IEBACiAKIAlzdGFydCA9IHJvdW5kX3VwKHN0YXJ0LCBaT05FX0FMSUdOKTsgCiAKLQlwcmludGsoIkJvb3RtZW0gc2V0dXAgbm9kZSAlZCAlMDE2bHgtJTAxNmx4XG4iLCBub2RlaWQsIHN0YXJ0LCBlbmQpOworCXByaW50ayhLRVJOX0lORk8gIkJvb3RtZW0gc2V0dXAgbm9kZSAlZCAlMDE2bHgtJTAxNmx4XG4iLCBub2RlaWQsIHN0YXJ0LCBlbmQpOwogCiAJc3RhcnRfcGZuID0gc3RhcnQgPj4gUEFHRV9TSElGVDsKIAllbmRfcGZuID0gZW5kID4+IFBBR0VfU0hJRlQ7CkBAIC0xNTYsNyArMTU2LDcgQEAKICAJc3RhcnRfcGZuID0gbm9kZV9zdGFydF9wZm4obm9kZWlkKTsKICAJZW5kX3BmbiA9IG5vZGVfZW5kX3Bmbihub2RlaWQpOwogCi0JRHByaW50ayhLRVJOX0lORk8gInNldHRpbmcgdXAgbm9kZSAlZCAlbHgtJWx4XG4iLAorCURwcmludGsoS0VSTl9JTkZPICJTZXR0aW5nIHVwIG5vZGUgJWQgJWx4LSVseFxuIiwKIAkJbm9kZWlkLCBzdGFydF9wZm4sIGVuZF9wZm4pOwogCiAJc2l6ZV96b25lcyh6b25lcywgaG9sZXMsIHN0YXJ0X3BmbiwgZW5kX3Bmbik7CkBAIC0yMDAsNyArMjAwLDcgQEAKICAJCXdoaWxlICgoeCA8PCAxKSA8IHN6KQogIAkJCXggPDw9IDE7CiAgCQlpZiAoeCA8IHN6LzIpCi0gCQkJcHJpbnRrKCJOdW1hIGVtdWxhdGlvbiB1bmJhbGFuY2VkLiBDb21wbGFpbiB0byBtYWludGFpbmVyXG4iKTsKKyAJCQlwcmludGsoS0VSTl9FUlIgIk51bWEgZW11bGF0aW9uIHVuYmFsYW5jZWQuIENvbXBsYWluIHRvIG1haW50YWluZXJcbiIpOwogIAkJc3ogPSB4OwogIAl9CiAKQEAgLTI3Miw3ICsyNzIsNyBAQAogCiB2b2lkIF9fY3B1aW5pdCBudW1hX3NldF9ub2RlKGludCBjcHUsIGludCBub2RlKQogewotCWNwdV9wZGFbY3B1XS5ub2RlbnVtYmVyID0gbm9kZTsKKwljcHVfcGRhKGNwdSktPm5vZGVudW1iZXIgPSBub2RlOwogCWNwdV90b19ub2RlW2NwdV0gPSBub2RlOwogfQogCkBAIC0zMzAsOCArMzMwLDY5IEBACiAJcmV0dXJuIDE7CiB9IAogCisvKgorICogU2V0dXAgZWFybHkgY3B1X3RvX25vZGUuCisgKgorICogUG9wdWxhdGUgY3B1X3RvX25vZGVbXSBvbmx5IGlmIHg4Nl9jcHVfdG9fYXBpY2lkW10sCisgKiBhbmQgYXBpY2lkX3RvX25vZGVbXSB0YWJsZXMgaGF2ZSB2YWxpZCBlbnRyaWVzIGZvciBhIENQVS4KKyAqIFRoaXMgbWVhbnMgd2Ugc2tpcCBjcHVfdG9fbm9kZVtdIGluaXRpYWxpc2F0aW9uIGZvciBOVU1BCisgKiBlbXVsYXRpb24gYW5kIGZha2luZyBub2RlIGNhc2UgKHdoZW4gcnVubmluZyBhIGtlcm5lbCBjb21waWxlZAorICogZm9yIE5VTUEgb24gYSBub24gTlVNQSBib3gpLCB3aGljaCBpcyBPSyBhcyBjcHVfdG9fbm9kZVtdCisgKiBpcyBhbHJlYWR5IGluaXRpYWxpemVkIGluIGEgcm91bmQgcm9iaW4gbWFubmVyIGF0IG51bWFfaW5pdF9hcnJheSwKKyAqIHByaW9yIHRvIHRoaXMgY2FsbCwgYW5kIHRoaXMgaW5pdGlhbGl6YXRpb24gaXMgZ29vZCBlbm91Z2gKKyAqIGZvciB0aGUgZmFrZSBOVU1BIGNhc2VzLgorICovCit2b2lkIF9faW5pdCBpbml0X2NwdV90b19ub2RlKHZvaWQpCit7CisJaW50IGk7CisgCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKKwkJdTggYXBpY2lkID0geDg2X2NwdV90b19hcGljaWRbaV07CisJCWlmIChhcGljaWQgPT0gQkFEX0FQSUNJRCkKKwkJCWNvbnRpbnVlOworCQlpZiAoYXBpY2lkX3RvX25vZGVbYXBpY2lkXSA9PSBOVU1BX05PX05PREUpCisJCQljb250aW51ZTsKKyAJCWNwdV90b19ub2RlW2ldID0gYXBpY2lkX3RvX25vZGVbYXBpY2lkXTsKKwl9Cit9CisKIEVYUE9SVF9TWU1CT0woY3B1X3RvX25vZGUpOwogRVhQT1JUX1NZTUJPTChub2RlX3RvX2NwdW1hc2spOwogRVhQT1JUX1NZTUJPTChtZW1ub2RlX3NoaWZ0KTsKIEVYUE9SVF9TWU1CT0wobWVtbm9kZW1hcCk7CiBFWFBPUlRfU1lNQk9MKG5vZGVfZGF0YSk7CisKKyNpZmRlZiBDT05GSUdfRElTQ09OVElHTUVNCisvKgorICogRnVuY3Rpb25zIHRvIGNvbnZlcnQgUEZOcyBmcm9tL3RvIHBlciBub2RlIHBhZ2UgYWRkcmVzc2VzLgorICogVGhlc2UgYXJlIG91dCBvZiBsaW5lIGJlY2F1c2UgdGhleSBhcmUgcXVpdGUgYmlnLgorICogVGhleSBjb3VsZCBiZSBhbGwgdHVuZWQgYnkgcHJlIGNhY2hpbmcgbW9yZSBzdGF0ZS4KKyAqIFNob3VsZCBkbyB0aGF0LgorICovCisKKy8qIFJlcXVpcmVzIHBmbl92YWxpZChwZm4pIHRvIGJlIHRydWUgKi8KK3N0cnVjdCBwYWdlICpwZm5fdG9fcGFnZSh1bnNpZ25lZCBsb25nIHBmbikKK3sKKwlpbnQgbmlkID0gcGh5c190b19uaWQoKCh1bnNpZ25lZCBsb25nKShwZm4pKSA8PCBQQUdFX1NISUZUKTsKKwlyZXR1cm4gKHBmbiAtIG5vZGVfc3RhcnRfcGZuKG5pZCkpICsgTk9ERV9EQVRBKG5pZCktPm5vZGVfbWVtX21hcDsKK30KK0VYUE9SVF9TWU1CT0wocGZuX3RvX3BhZ2UpOworCit1bnNpZ25lZCBsb25nIHBhZ2VfdG9fcGZuKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiAobG9uZykoKChwYWdlKSAtIHBhZ2Vfem9uZShwYWdlKS0+em9uZV9tZW1fbWFwKSArCisJCSAgICAgIHBhZ2Vfem9uZShwYWdlKS0+em9uZV9zdGFydF9wZm4pOworfQorRVhQT1JUX1NZTUJPTChwYWdlX3RvX3Bmbik7CisKK2ludCBwZm5fdmFsaWQodW5zaWduZWQgbG9uZyBwZm4pCit7CisJdW5zaWduZWQgbmlkOworCWlmIChwZm4gPj0gbnVtX3BoeXNwYWdlcykKKwkJcmV0dXJuIDA7CisJbmlkID0gcGZuX3RvX25pZChwZm4pOworCWlmIChuaWQgPT0gMHhmZikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHBmbiA+PSBub2RlX3N0YXJ0X3BmbihuaWQpICYmIChwZm4pIDwgbm9kZV9lbmRfcGZuKG5pZCk7Cit9CitFWFBPUlRfU1lNQk9MKHBmbl92YWxpZCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L21tL3NyYXQuYyBiL2FyY2gveDg2XzY0L21tL3NyYXQuYwppbmRleCAzMzM0MGJkLi44YjdmODU2IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9tbS9zcmF0LmMKKysrIGIvYXJjaC94ODZfNjQvbW0vc3JhdC5jCkBAIC0xNywyMSArMTcsMjMgQEAKICNpbmNsdWRlIDxsaW51eC90b3BvbG9neS5oPgogI2luY2x1ZGUgPGFzbS9wcm90by5oPgogI2luY2x1ZGUgPGFzbS9udW1hLmg+CisjaW5jbHVkZSA8YXNtL2U4MjAuaD4KIAogc3RhdGljIHN0cnVjdCBhY3BpX3RhYmxlX3NsaXQgKmFjcGlfc2xpdDsKIAogc3RhdGljIG5vZGVtYXNrX3Qgbm9kZXNfcGFyc2VkIF9faW5pdGRhdGE7CiBzdGF0aWMgbm9kZW1hc2tfdCBub2Rlc19mb3VuZCBfX2luaXRkYXRhOwogc3RhdGljIHN0cnVjdCBub2RlIG5vZGVzW01BWF9OVU1OT0RFU10gX19pbml0ZGF0YTsKLXN0YXRpYyBfX3U4ICBweG0ybm9kZVsyNTZdID0geyBbMCAuLi4gMjU1XSA9IDB4ZmYgfTsKK3N0YXRpYyB1OCBweG0ybm9kZVsyNTZdID0geyBbMCAuLi4gMjU1XSA9IDB4ZmYgfTsKIAogc3RhdGljIGludCBub2RlX3RvX3B4bShpbnQgbik7CiAKIGludCBweG1fdG9fbm9kZShpbnQgcHhtKQogewogCWlmICgodW5zaWduZWQpcHhtID49IDI1NikKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHB4bTJub2RlW3B4bV07CisJCXJldHVybiAtMTsKKwkvKiBFeHRlbmQgMHhmZiB0byAoaW50KS0xICovCisJcmV0dXJuIChzaWduZWQgY2hhcilweG0ybm9kZVtweG1dOwogfQogCiBzdGF0aWMgX19pbml0IGludCBzZXR1cF9ub2RlKGludCBweG0pCkBAIC05MSw5ICs5MywzNiBAQAogCXJldHVybiBudW1hX29mZiB8fCBhY3BpX251bWEgPCAwOwogfQogCisvKgorICogQSBsb3Qgb2YgQklPUyBmaWxsIGluIDEwICg9IG5vIGRpc3RhbmNlKSBldmVyeXdoZXJlLiBUaGlzIG1lc3NlcworICogdXAgdGhlIE5VTUEgaGV1cmlzdGljcyB3aGljaCB3YW50cyB0aGUgbG9jYWwgbm9kZSB0byBoYXZlIGEgc21hbGxlcgorICogZGlzdGFuY2UgdGhhbiB0aGUgb3RoZXJzLgorICogRG8gc29tZSBxdWljayBjaGVja3MgaGVyZSBhbmQgb25seSB1c2UgdGhlIFNMSVQgaWYgaXQgcGFzc2VzLgorICovCitzdGF0aWMgX19pbml0IGludCBzbGl0X3ZhbGlkKHN0cnVjdCBhY3BpX3RhYmxlX3NsaXQgKnNsaXQpCit7CisJaW50IGksIGo7CisJaW50IGQgPSBzbGl0LT5sb2NhbGl0aWVzOworCWZvciAoaSA9IDA7IGkgPCBkOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IGQ7IGorKykgIHsKKwkJCXU4IHZhbCA9IHNsaXQtPmVudHJ5W2QqaSArIGpdOworCQkJaWYgKGkgPT0gaikgeworCQkJCWlmICh2YWwgIT0gMTApCisJCQkJCXJldHVybiAwOworCQkJfSBlbHNlIGlmICh2YWwgPD0gMTApCisJCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKIC8qIENhbGxiYWNrIGZvciBTTElUIHBhcnNpbmcgKi8KIHZvaWQgX19pbml0IGFjcGlfbnVtYV9zbGl0X2luaXQoc3RydWN0IGFjcGlfdGFibGVfc2xpdCAqc2xpdCkKIHsKKwlpZiAoIXNsaXRfdmFsaWQoc2xpdCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQUNQSTogU0xJVCB0YWJsZSBsb29rcyBpbnZhbGlkLiBOb3QgdXNlZC5cbiIpOworCQlyZXR1cm47CisJfQogCWFjcGlfc2xpdCA9IHNsaXQ7CiB9CiAKQEAgLTE2OCwxMiArMTk3LDM5IEBACiAJICAgICAgIG5kLT5zdGFydCwgbmQtPmVuZCk7CiB9CiAKKy8qIFNhbml0eSBjaGVjayB0byBjYXRjaCBtb3JlIGJhZCBTUkFUcyAodGhleSBhcmUgYW1hemluZ2x5IGNvbW1vbikuCisgICBNYWtlIHN1cmUgdGhlIFBYTXMgY292ZXIgYWxsIG1lbW9yeS4gKi8KK3N0YXRpYyBpbnQgbm9kZXNfY292ZXJfbWVtb3J5KHZvaWQpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBweG1yYW0sIGU4MjByYW07CisKKwlweG1yYW0gPSAwOworCWZvcl9lYWNoX25vZGVfbWFzayhpLCBub2Rlc19wYXJzZWQpIHsKKwkJdW5zaWduZWQgbG9uZyBzID0gbm9kZXNbaV0uc3RhcnQgPj4gUEFHRV9TSElGVDsKKwkJdW5zaWduZWQgbG9uZyBlID0gbm9kZXNbaV0uZW5kID4+IFBBR0VfU0hJRlQ7CisJCXB4bXJhbSArPSBlIC0gczsKKwkJcHhtcmFtIC09IGU4MjBfaG9sZV9zaXplKHMsIGUpOworCX0KKworCWU4MjByYW0gPSBlbmRfcGZuIC0gZTgyMF9ob2xlX3NpemUoMCwgZW5kX3Bmbik7CisJaWYgKHB4bXJhbSA8IGU4MjByYW0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJIlNSQVQ6IFBYTXMgb25seSBjb3ZlciAlbHVNQiBvZiB5b3VyICVsdU1CIGU4MjAgUkFNLiBOb3QgdXNlZC5cbiIsCisJCQkocHhtcmFtIDw8IFBBR0VfU0hJRlQpID4+IDIwLAorCQkJKGU4MjByYW0gPDwgUEFHRV9TSElGVCkgPj4gMjApOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKIHZvaWQgX19pbml0IGFjcGlfbnVtYV9hcmNoX2ZpeHVwKHZvaWQpIHt9CiAKIC8qIFVzZSB0aGUgaW5mb3JtYXRpb24gZGlzY292ZXJlZCBhYm92ZSB0byBhY3R1YWxseSBzZXQgdXAgdGhlIG5vZGVzLiAqLwogaW50IF9faW5pdCBhY3BpX3NjYW5fbm9kZXModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCiB7CiAJaW50IGk7CisKIAlpZiAoYWNwaV9udW1hIDw9IDApCiAJCXJldHVybiAtMTsKIApAQCAtMTg0LDYgKzI0MCwxMSBAQAogCQkJbm9kZV9jbGVhcihpLCBub2Rlc19wYXJzZWQpOwogCX0KIAorCWlmICghbm9kZXNfY292ZXJfbWVtb3J5KCkpIHsKKwkJYmFkX3NyYXQoKTsKKwkJcmV0dXJuIC0xOworCX0KKwogCW1lbW5vZGVfc2hpZnQgPSBjb21wdXRlX2hhc2hfc2hpZnQobm9kZXMsIG5vZGVzX3dlaWdodChub2Rlc19wYXJzZWQpKTsKIAlpZiAobWVtbm9kZV9zaGlmdCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9wY2kvTWFrZWZpbGUtQlVTIGIvYXJjaC94ODZfNjQvcGNpL01ha2VmaWxlLUJVUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYwYzA1YS4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Nl82NC9wY2kvTWFrZWZpbGUtQlVTCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgWDg2XzY0IHNwZWNpZmljIFBDSSByb3V0aW5lcwotIwotIyBSZXVzZSB0aGUgaTM4NiBQQ0kgc3Vic3lzdGVtCi0jCi1DRkxBR1MgKz0gLUkgYXJjaC9pMzg2L3BjaQotCi1vYmoteQkJOj0gaTM4Ni5vCi1vYmotJChDT05GSUdfUENJX0RJUkVDVCkrPSBkaXJlY3Qubwotb2JqLXkJCSs9IGZpeHVwLm8KLW9iai0kKENPTkZJR19BQ1BJKQkrPSBhY3BpLm8KLW9iai15CQkJKz0gbGVnYWN5Lm8gaXJxLm8gY29tbW9uLm8KLSMgbW1jb25maWcgaGFzIGEgNjRiaXQgc3BlY2lhbAotb2JqLSQoQ09ORklHX1BDSV9NTUNPTkZJRykgKz0gbW1jb25maWcubwotCi1kaXJlY3QteSArPSAuLi8uLi9pMzg2L3BjaS9kaXJlY3QubwotYWNwaS15ICAgKz0gLi4vLi4vaTM4Ni9wY2kvYWNwaS5vCi1sZWdhY3kteSArPSAuLi8uLi9pMzg2L3BjaS9sZWdhY3kubwotaXJxLXkgICAgKz0gLi4vLi4vaTM4Ni9wY2kvaXJxLm8KLWNvbW1vbi15ICs9IC4uLy4uL2kzODYvcGNpL2NvbW1vbi5vCi1maXh1cC15ICArPSAuLi8uLi9pMzg2L3BjaS9maXh1cC5vCi1pMzg2LXkgICs9IC4uLy4uL2kzODYvcGNpL2kzODYubwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvS2NvbmZpZyBiL2FyY2gveHRlbnNhL0tjb25maWcKaW5kZXggN2U4NDFhYS4uN2VlNGExNCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvS2NvbmZpZworKysgYi9hcmNoL3h0ZW5zYS9LY29uZmlnCkBAIC0xOCwxMCArMTgsNiBAQAogCSAgd2l0aCByZWFzb25hYmxlIG1pbmltdW0gcmVxdWlyZW1lbnRzLiAgVGhlIFh0ZW5zYSBMaW51eCBwcm9qZWN0IGhhcwogCSAgYSBob21lIHBhZ2UgYXQgPGh0dHA6Ly94dGVuc2Euc291cmNlZm9yZ2UubmV0Lz4uCiAKLWNvbmZpZyBVSUQxNgotCWJvb2wKLQlkZWZhdWx0IG4KLQogY29uZmlnIFJXU0VNX1hDSEdBRERfQUxHT1JJVEhNCiAJYm9vbAogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNmE0NGI1NC4uZjFmNTk2NiAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xNDUsNyArMTQ1LDcgQEAKIAlpbnQgdXNlcl9tb2RlID0gdXNlcl9tb2RlKHJlZ3MpOwogCiAJLyogU2V0IHVwIG5ldyBUU1MuICovCi0JdG9zID0gKHVuc2lnbmVkIGxvbmcpcC0+dGhyZWFkX2luZm8gKyBUSFJFQURfU0laRTsKKwl0b3MgPSAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UocCkgKyBUSFJFQURfU0laRTsKIAlpZiAodXNlcl9tb2RlKQogCQljaGlsZHJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MqKSh0b3MgLSBQVF9VU0VSX1NJWkUpOwogCWVsc2UKQEAgLTIxNyw3ICsyMTcsNyBAQAogdW5zaWduZWQgbG9uZyBnZXRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCXVuc2lnbmVkIGxvbmcgc3AsIHBjOwotCXVuc2lnbmVkIGxvbmcgc3RhY2tfcGFnZSA9ICh1bnNpZ25lZCBsb25nKSBwLT50aHJlYWRfaW5mbzsKKwl1bnNpZ25lZCBsb25nIHN0YWNrX3BhZ2UgPSAodW5zaWduZWQgbG9uZykgdGFza19zdGFja19wYWdlKHApOwogCWludCBjb3VudCA9IDA7CiAKIAlpZiAoIXAgfHwgcCA9PSBjdXJyZW50IHx8IHAtPnN0YXRlID09IFRBU0tfUlVOTklORykKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9wdHJhY2UuYwppbmRleCBhYjVjNGM2Li40Y2M4NTI4IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3B0cmFjZS5jCkBAIC03Miw3ICs3Miw3IEBACiAJCXN0cnVjdCBwdF9yZWdzICpyZWdzOwogCQl1bnNpZ25lZCBsb25nIHRtcDsKIAotCQlyZWdzID0geHRlbnNhX3B0X3JlZ3MoY2hpbGQpOworCQlyZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAkJdG1wID0gMDsgIC8qIERlZmF1bHQgcmV0dXJuIHZhbHVlLiAqLwogCiAJCXN3aXRjaChhZGRyKSB7CkBAIC0xNDksNyArMTQ5LDcgQEAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOgogCQl7CiAJCXN0cnVjdCBwdF9yZWdzICpyZWdzOwotCQlyZWdzID0geHRlbnNhX3B0X3JlZ3MoY2hpbGQpOworCQlyZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAogCQlzd2l0Y2ggKGFkZHIpIHsKIAkJY2FzZSBSRUdfQVJfQkFTRSAuLi4gUkVHX0FSX0JBU0UgKyBYQ0hBTF9OVU1fQVJFR1MgLSAxOgpAQCAtMjQwLDcgKzI0MCw3IEBACiAJCSAqIGVsZl9ncmVnc2V0X3QgZm9ybWF0LiAqLwogCiAJCXh0ZW5zYV9ncmVnc2V0X3QgZm9ybWF0OwotCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHh0ZW5zYV9wdF9yZWdzKGNoaWxkKTsKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwogCiAJCWRvX2NvcHlfcmVncyAoJmZvcm1hdCwgcmVncywgY2hpbGQpOwogCkBAIC0yNTcsNyArMjU3LDcgQEAKIAkJICogdmFsdWVzIGluIHRoZSBlbGZfZ3JlZ3NldF90IGZvcm1hdC4gKi8KIAogCQl4dGVuc2FfZ3JlZ3NldF90IGZvcm1hdDsKLQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB4dGVuc2FfcHRfcmVncyhjaGlsZCk7CisJCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAogCQlpZiAoY29weV9mcm9tX3VzZXIoJmZvcm1hdCwodm9pZCAqKWRhdGEsc2l6ZW9mKGVsZl9ncmVnc2V0X3QpKSl7CiAJCQlyZXQgPSAtRUZBVUxUOwpAQCAtMjgxLDcgKzI4MSw3IEBACiAJCSAqIGVsZl9mcHJlZ3NldF90IGZvcm1hdC4gKi8KIAogCQllbGZfZnByZWdzZXRfdCBmcHJlZ3M7Ci0JCXN0cnVjdCBwdF9yZWdzICpyZWdzID0geHRlbnNhX3B0X3JlZ3MoY2hpbGQpOworCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CiAKIAkJZG9fc2F2ZV9mcHJlZ3MgKCZmcHJlZ3MsIHJlZ3MsIGNoaWxkKTsKIApAQCAtMjk5LDcgKzI5OSw3IEBACiAJCSAqIHZhbHVlcyBpbiB0aGUgZWxmX2ZwcmVnc2V0X3QgZm9ybWF0LgogCQkgKi8KIAkJZWxmX2ZwcmVnc2V0X3QgZnByZWdzOwotCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHh0ZW5zYV9wdF9yZWdzKGNoaWxkKTsKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwogCiAJCXJldCA9IDA7CiAJCWlmIChjb3B5X2Zyb21fdXNlcigmZnByZWdzLCAodm9pZCAqKWRhdGEsIHNpemVvZihlbGZfZnByZWdzZXRfdCkpKSB7CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvdGltZS5jIGIvYXJjaC94dGVuc2Eva2VybmVsL3RpbWUuYwppbmRleCBjYjZlMzhlLi45MzdkODFmIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC90aW1lLmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogCWlmICgoc2lnbmVkIGxvbmcpKGdldF9jY291bnQoKSAtIG5leHQpID4gMCkKIAkJZ290byBhZ2FpbjsKIAotCS8qIEFsbG93IHBsYXRmb3JtIHRvIGRvIHNvbWV0aGluZyB1c2VmdWxsIChXZG9nKS4gKi8KKwkvKiBBbGxvdyBwbGF0Zm9ybSB0byBkbyBzb21ldGhpbmcgdXNlZnVsIChXZG9nKS4gKi8KIAogCXBsYXRmb3JtX2hlYXJ0YmVhdCgpOwogCmRpZmYgLS1naXQgYS9ibG9jay9lbGV2YXRvci5jIGIvYmxvY2svZWxldmF0b3IuYwppbmRleCAzOWRjY2NjLi5jOWY0MjRkIDEwMDY0NAotLS0gYS9ibG9jay9lbGV2YXRvci5jCisrKyBiL2Jsb2NrL2VsZXZhdG9yLmMKQEAgLTY0LDcgKzY0LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woZWx2X3JxX21lcmdlX29rKTsKIAotaW5saW5lIGludCBlbHZfdHJ5X21lcmdlKHN0cnVjdCByZXF1ZXN0ICpfX3JxLCBzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgaW5saW5lIGludCBlbHZfdHJ5X21lcmdlKHN0cnVjdCByZXF1ZXN0ICpfX3JxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJaW50IHJldCA9IEVMRVZBVE9SX05PX01FUkdFOwogCkBAIC04MCw3ICs4MCw2IEBACiAKIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTChlbHZfdHJ5X21lcmdlKTsKIAogc3RhdGljIHN0cnVjdCBlbGV2YXRvcl90eXBlICplbGV2YXRvcl9maW5kKGNvbnN0IGNoYXIgKm5hbWUpCiB7CkBAIC0xNTAsMTMgKzE0OSwyMCBAQAogCWlmICghY2hvc2VuX2VsZXZhdG9yWzBdKQogCQlzdHJjcHkoY2hvc2VuX2VsZXZhdG9yLCBDT05GSUdfREVGQVVMVF9JT1NDSEVEKTsKIAorCS8qCisJICogQmUgYmFja3dhcmRzLWNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyBrZXJuZWxzLCBzbyB1c2VycworCSAqIHdvbid0IGdldCB0aGUgd3JvbmcgZWxldmF0b3IuCisJICovCisJaWYgKCFzdHJjbXAoY2hvc2VuX2VsZXZhdG9yLCAiYXMiKSkKKwkJc3RyY3B5KGNob3Nlbl9lbGV2YXRvciwgImFudGljaXBhdG9yeSIpOworCiAgCS8qCi0gCSAqIElmIHRoZSBnaXZlbiBzY2hlZHVsZXIgaXMgbm90IGF2YWlsYWJsZSwgZmFsbCBiYWNrIHRvIG5vLW9wLgorIAkgKiBJZiB0aGUgZ2l2ZW4gc2NoZWR1bGVyIGlzIG5vdCBhdmFpbGFibGUsIGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdAogIAkgKi8KICAJaWYgKChlID0gZWxldmF0b3JfZmluZChjaG9zZW5fZWxldmF0b3IpKSkKIAkJZWxldmF0b3JfcHV0KGUpOwogCWVsc2UKLSAJCXN0cmNweShjaG9zZW5fZWxldmF0b3IsICJub29wIik7CisgCQlzdHJjcHkoY2hvc2VuX2VsZXZhdG9yLCBDT05GSUdfREVGQVVMVF9JT1NDSEVEKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgZWxldmF0b3Jfc2V0dXAoY2hhciAqc3RyKQpAQCAtNjExLDIzICs2MTcsMjMgQEAKIAkgKiByZXF1ZXN0IGlzIHJlbGVhc2VkIGZyb20gdGhlIGRyaXZlciwgaW8gbXVzdCBiZSBkb25lCiAJICovCiAJaWYgKGJsa19hY2NvdW50X3JxKHJxKSkgewotCQlzdHJ1Y3QgcmVxdWVzdCAqZmlyc3RfcnEgPSBsaXN0X2VudHJ5X3JxKHEtPnF1ZXVlX2hlYWQubmV4dCk7Ci0KIAkJcS0+aW5fZmxpZ2h0LS07CisJCWlmIChibGtfc29ydGVkX3JxKHJxKSAmJiBlLT5vcHMtPmVsZXZhdG9yX2NvbXBsZXRlZF9yZXFfZm4pCisJCQllLT5vcHMtPmVsZXZhdG9yX2NvbXBsZXRlZF9yZXFfZm4ocSwgcnEpOworCX0KIAotCQkvKgotCQkgKiBDaGVjayBpZiB0aGUgcXVldWUgaXMgd2FpdGluZyBmb3IgZnMgcmVxdWVzdHMgdG8gYmUKLQkJICogZHJhaW5lZCBmb3IgZmx1c2ggc2VxdWVuY2UuCi0JCSAqLwotCQlpZiAocS0+b3Jkc2VxICYmIHEtPmluX2ZsaWdodCA9PSAwICYmCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgcXVldWUgaXMgd2FpdGluZyBmb3IgZnMgcmVxdWVzdHMgdG8gYmUKKwkgKiBkcmFpbmVkIGZvciBmbHVzaCBzZXF1ZW5jZS4KKwkgKi8KKwlpZiAodW5saWtlbHkocS0+b3Jkc2VxKSkgeworCQlzdHJ1Y3QgcmVxdWVzdCAqZmlyc3RfcnEgPSBsaXN0X2VudHJ5X3JxKHEtPnF1ZXVlX2hlYWQubmV4dCk7CisJCWlmIChxLT5pbl9mbGlnaHQgPT0gMCAmJgogCQkgICAgYmxrX29yZGVyZWRfY3VyX3NlcShxKSA9PSBRVUVVRV9PUkRTRVFfRFJBSU4gJiYKIAkJICAgIGJsa19vcmRlcmVkX3JlcV9zZXEoZmlyc3RfcnEpID4gUVVFVUVfT1JEU0VRX0RSQUlOKSB7CiAJCQlibGtfb3JkZXJlZF9jb21wbGV0ZV9zZXEocSwgUVVFVUVfT1JEU0VRX0RSQUlOLCAwKTsKIAkJCXEtPnJlcXVlc3RfZm4ocSk7CiAJCX0KLQotCQlpZiAoYmxrX3NvcnRlZF9ycShycSkgJiYgZS0+b3BzLT5lbGV2YXRvcl9jb21wbGV0ZWRfcmVxX2ZuKQotCQkJZS0+b3BzLT5lbGV2YXRvcl9jb21wbGV0ZWRfcmVxX2ZuKHEsIHJxKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2Jsb2NrL2dlbmhkLmMgYi9ibG9jay9nZW5oZC5jCmluZGV4IGYxZWQ4M2YuLmRiNTc1NDYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2dlbmhkLmMKKysrIGIvYmxvY2svZ2VuaGQuYwpAQCAtMzgsMzQgKzM4LDEwMCBAQAogCXJldHVybiBtYWpvciAlIE1BWF9QUk9CRV9IQVNIOwogfQogCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLS8qIGdldCBibG9jayBkZXZpY2UgbmFtZXMgaW4gc29tZXdoYXQgcmFuZG9tIG9yZGVyICovCi1pbnQgZ2V0X2Jsa2Rldl9saXN0KGNoYXIgKnAsIGludCB1c2VkKQorc3RydWN0IGJsa2Rldl9pbmZvIHsKKyAgICAgICAgaW50IGluZGV4OworICAgICAgICBzdHJ1Y3QgYmxrX21ham9yX25hbWUgKmJkOworfTsKKworLyoKKyAqIGl0ZXJhdGUgb3ZlciBhIGxpc3Qgb2YgYmxrZGV2X2luZm8gc3RydWN0dXJlcy4gIGFsbG93cworICogdGhlIG1ham9yX25hbWVzIGFycmF5IHRvIGJlIGl0ZXJhdGVkIG92ZXIgZnJvbSBvdXRzaWRlIHRoaXMgZmlsZQorICogbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgYmxvY2tfc3Vic3lzX3NlbSBoZWxkCisgKi8KK3ZvaWQgKmdldF9uZXh0X2Jsa2Rldih2b2lkICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBibGtkZXZfaW5mbyAqaW5mbzsKKworICAgICAgICBpZiAoZGV2ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgICAgICAgICBpZiAoIWluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICBpbmZvLT5pbmRleD0wOworICAgICAgICAgICAgICAgIGluZm8tPmJkID0gbWFqb3JfbmFtZXNbaW5mby0+aW5kZXhdOworICAgICAgICAgICAgICAgIGlmIChpbmZvLT5iZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluZm8gPSBkZXY7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoaW5mby0+aW5kZXggPCBBUlJBWV9TSVpFKG1ham9yX25hbWVzKSkgeworICAgICAgICAgICAgICAgIGlmIChpbmZvLT5iZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJkID0gaW5mby0+YmQtPm5leHQ7CisgICAgICAgICAgICAgICAgaWYgKGluZm8tPmJkKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBObyBkZXZpY2VzIG9uIHRoaXMgY2hhaW4sIG1vdmUgdG8gdGhlIG5leHQKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpbmZvLT5pbmRleCsrOworICAgICAgICAgICAgICAgIGluZm8tPmJkID0gKGluZm8tPmluZGV4IDwgQVJSQVlfU0laRShtYWpvcl9uYW1lcykpID8KKwkJCW1ham9yX25hbWVzW2luZm8tPmluZGV4XSA6IE5VTEw7CisgICAgICAgICAgICAgICAgaWYgKGluZm8tPmJkKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworb3V0OgorICAgICAgICByZXR1cm4gaW5mbzsKK30KKwordm9pZCAqYWNxdWlyZV9ibGtkZXZfbGlzdCh2b2lkKQoreworICAgICAgICBkb3duKCZibG9ja19zdWJzeXNfc2VtKTsKKyAgICAgICAgcmV0dXJuIGdldF9uZXh0X2Jsa2RldihOVUxMKTsKK30KKwordm9pZCByZWxlYXNlX2Jsa2Rldl9saXN0KHZvaWQgKmRldikKK3sKKyAgICAgICAgdXAoJmJsb2NrX3N1YnN5c19zZW0pOworICAgICAgICBrZnJlZShkZXYpOworfQorCisKKy8qCisgKiBDb3VudCB0aGUgbnVtYmVyIG9mIHJlY29yZHMgaW4gdGhlIGJsa2Rldl9saXN0LgorICogbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgYmxvY2tfc3Vic3lzX3NlbSBoZWxkCisgKi8KK2ludCBjb3VudF9ibGtkZXZfbGlzdCh2b2lkKQogewogCXN0cnVjdCBibGtfbWFqb3JfbmFtZSAqbjsKLQlpbnQgaSwgbGVuOworCWludCBpLCBjb3VudDsKIAotCWxlbiA9IHNucHJpbnRmKHAsIChQQUdFX1NJWkUtdXNlZCksICJcbkJsb2NrIGRldmljZXM6XG4iKTsKKwljb3VudCA9IDA7CiAKLQlkb3duKCZibG9ja19zdWJzeXNfc2VtKTsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtYWpvcl9uYW1lcyk7IGkrKykgewotCQlmb3IgKG4gPSBtYWpvcl9uYW1lc1tpXTsgbjsgbiA9IG4tPm5leHQpIHsKLQkJCS8qCi0JCQkgKiBJZiB0aGUgY3VyZW50IHN0cmluZyBwbHVzIHRoZSA1IGV4dHJhIGNoYXJhY3RlcnMKLQkJCSAqIGluIHRoZSBsaW5lIHdvdWxkIHJ1biB1cyBvZmYgdGhlIHBhZ2UsIHRoZW4gd2UncmUgZG9uZQotCQkJICovCi0JCQlpZiAoKGxlbiArIHVzZWQgKyBzdHJsZW4obi0+bmFtZSkgKyA1KSA+PSBQQUdFX1NJWkUpCi0JCQkJZ290byBwYWdlX2Z1bGw7Ci0JCQlsZW4gKz0gc3ByaW50ZihwK2xlbiwgIiUzZCAlc1xuIiwKLQkJCQkgICAgICAgbi0+bWFqb3IsIG4tPm5hbWUpOwotCQl9CisJCWZvciAobiA9IG1ham9yX25hbWVzW2ldOyBuOyBuID0gbi0+bmV4dCkKKwkJCQljb3VudCsrOwogCX0KLXBhZ2VfZnVsbDoKLQl1cCgmYmxvY2tfc3Vic3lzX3NlbSk7CiAKLQlyZXR1cm4gbGVuOworCXJldHVybiBjb3VudDsKIH0KLSNlbmRpZgorCisvKgorICogZXh0cmFjdCB0aGUgbWFqb3IgYW5kIG5hbWUgdmFsdWVzIGZyb20gYSBibGtkZXZfaW5mbyBzdHJ1Y3QKKyAqIHBhc3NlZCBpbiBhcyBhIHZvaWQgdG8gKmRldi4gIE11c3QgYmUgY2FsbGVkIHdpdGgKKyAqIGJsb2NrX3N1YnN5c19zZW0gaGVsZAorICovCitpbnQgZ2V0X2Jsa2Rldl9pbmZvKHZvaWQgKmRldiwgaW50ICptYWpvciwgY2hhciAqKm5hbWUpCit7CisgICAgICAgIHN0cnVjdCBibGtkZXZfaW5mbyAqaW5mbyA9IGRldjsKKworICAgICAgICBpZiAoaW5mby0+YmQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAqbWFqb3IgPSBpbmZvLT5iZC0+bWFqb3I7CisgICAgICAgICpuYW1lID0gaW5mby0+YmQtPm5hbWU7CisgICAgICAgIHJldHVybiAwOworfQorCiAKIGludCByZWdpc3Rlcl9ibGtkZXYodW5zaWduZWQgaW50IG1ham9yLCBjb25zdCBjaGFyICpuYW1lKQogewpkaWZmIC0tZ2l0IGEvYmxvY2svaW9jdGwuYyBiL2Jsb2NrL2lvY3RsLmMKaW5kZXggNmUyNzg0Ny4uZTExMDk0OSAxMDA2NDQKLS0tIGEvYmxvY2svaW9jdGwuYworKysgYi9ibG9jay9pb2N0bC5jCkBAIC0xLDYgKzEsNyBAQAotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CQkvKiBmb3IgY2FwYWJsZSgpICovCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa3BnLmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KQEAgLTI0NSw2ICsyNDYsMjcgQEAKIAkJc2V0X2RldmljZV9ybyhiZGV2LCBuKTsKIAkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gMDsKKwljYXNlIEhESU9fR0VUR0VPOiB7CisJCXN0cnVjdCBoZF9nZW9tZXRyeSBnZW87CisKKwkJaWYgKCFhcmcpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFkaXNrLT5mb3BzLT5nZXRnZW8pCisJCQlyZXR1cm4gLUVOT1RUWTsKKworCQkvKgorCQkgKiBXZSBuZWVkIHRvIHNldCB0aGUgc3RhcnRzZWN0IGZpcnN0LCB0aGUgZHJpdmVyIG1heQorCQkgKiB3YW50IHRvIG92ZXJyaWRlIGl0LgorCQkgKi8KKwkJZ2VvLnN0YXJ0ID0gZ2V0X3N0YXJ0X3NlY3QoYmRldik7CisJCXJldCA9IGRpc2stPmZvcHMtPmdldGdlbyhiZGV2LCAmZ2VvKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCBoZF9nZW9tZXRyeSBfX3VzZXIgKilhcmcsICZnZW8sCisJCQkJCXNpemVvZihnZW8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CiAJfQogCiAJbG9ja19rZXJuZWwoKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2xsX3J3X2Jsay5jIGIvYmxvY2svbGxfcndfYmxrLmMKaW5kZXggOTFkM2I0OC4uOGUyN2QwYSAxMDA2NDQKLS0tIGEvYmxvY2svbGxfcndfYmxrLmMKKysrIGIvYmxvY2svbGxfcndfYmxrLmMKQEAgLTI2LDcgKzI2LDggQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgotI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogCiAvKgogICogZm9yIG1heCBzZW5zZSBzaXplCkBAIC02MiwxMyArNjMsMTUgQEAKIC8qCiAgKiBDb250cm9sbGluZyBzdHJ1Y3R1cmUgdG8ga2Jsb2NrZAogICovCi1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmtibG9ja2Rfd29ya3F1ZXVlOyAKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqa2Jsb2NrZF93b3JrcXVldWU7CiAKIHVuc2lnbmVkIGxvbmcgYmxrX21heF9sb3dfcGZuLCBibGtfbWF4X3BmbjsKIAogRVhQT1JUX1NZTUJPTChibGtfbWF4X2xvd19wZm4pOwogRVhQT1JUX1NZTUJPTChibGtfbWF4X3Bmbik7CiAKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbGlzdF9oZWFkLCBibGtfY3B1X2RvbmUpOworCiAvKiBBbW91bnQgb2YgdGltZSBpbiB3aGljaCBhIHByb2Nlc3MgbWF5IGJhdGNoIHJlcXVlc3RzICovCiAjZGVmaW5lIEJMS19CQVRDSF9USU1FCShIWi81MFVMKQogCkBAIC0yMDcsNiArMjEwLDEzIEBACiAKIEVYUE9SVF9TWU1CT0woYmxrX3F1ZXVlX21lcmdlX2J2ZWMpOwogCit2b2lkIGJsa19xdWV1ZV9zb2Z0aXJxX2RvbmUocmVxdWVzdF9xdWV1ZV90ICpxLCBzb2Z0aXJxX2RvbmVfZm4gKmZuKQoreworCXEtPnNvZnRpcnFfZG9uZV9mbiA9IGZuOworfQorCitFWFBPUlRfU1lNQk9MKGJsa19xdWV1ZV9zb2Z0aXJxX2RvbmUpOworCiAvKioKICAqIGJsa19xdWV1ZV9tYWtlX3JlcXVlc3QgLSBkZWZpbmUgYW4gYWx0ZXJuYXRlIG1ha2VfcmVxdWVzdCBmdW5jdGlvbiBmb3IgYSBkZXZpY2UKICAqIEBxOiAgdGhlIHJlcXVlc3QgcXVldWUgZm9yIHRoZSBkZXZpY2UgdG8gYmUgYWZmZWN0ZWQKQEAgLTI3MCw2ICsyODAsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIHJxX2luaXQocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJSU5JVF9MSVNUX0hFQUQoJnJxLT5xdWV1ZWxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZycS0+ZG9uZWxpc3QpOwogCiAJcnEtPmVycm9ycyA9IDA7CiAJcnEtPnJxX3N0YXR1cyA9IFJRX0FDVElWRTsKQEAgLTI4Niw2ICsyOTcsNyBAQAogCXJxLT5zZW5zZSA9IE5VTEw7CiAJcnEtPmVuZF9pbyA9IE5VTEw7CiAJcnEtPmVuZF9pb19kYXRhID0gTlVMTDsKKwlycS0+Y29tcGxldGlvbl9kYXRhID0gTlVMTDsKIH0KIAogLyoqCkBAIC0yNzM1LDMwICsyNzQ3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoqCi0gKiBibGtfYXR0ZW1wdF9yZW1lcmdlICAtIGF0dGVtcHQgdG8gcmVtZXJnZSBhY3RpdmUgaGVhZCB3aXRoIG5leHQgcmVxdWVzdAotICogQHE6ICAgIFRoZSAmcmVxdWVzdF9xdWV1ZV90IGJlbG9uZ2luZyB0byB0aGUgZGV2aWNlCi0gKiBAcnE6ICAgVGhlIGhlYWQgcmVxdWVzdCAodXN1YWxseSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgIEZvciBoZWFkLWFjdGl2ZSBkZXZpY2VzLCB0aGUgcXVldWUgY2FuIGVhc2lseSBiZSB1bnBsdWdnZWQgc28gcXVpY2tseQotICogICAgdGhhdCBwcm9wZXIgbWVyZ2luZyBpcyBub3QgZG9uZSBvbiB0aGUgZnJvbnQgcmVxdWVzdC4gVGhpcyBtYXkgaHVydAotICogICAgcGVyZm9ybWFuY2UgZ3JlYXRseSBmb3Igc29tZSBkZXZpY2VzLiBUaGUgYmxvY2sgbGF5ZXIgY2Fubm90IHNhZmVseQotICogICAgZG8gbWVyZ2luZyBvbiB0aGF0IGZpcnN0IHJlcXVlc3QgZm9yIHRoZXNlIHF1ZXVlcywgYnV0IHRoZSBkcml2ZXIgY2FuCi0gKiAgICBjYWxsIHRoaXMgZnVuY3Rpb24gYW5kIG1ha2UgaXQgaGFwcGVuIGFueSB3YXkuIE9ubHkgdGhlIGRyaXZlciBrbm93cwotICogICAgd2hlbiBpdCBpcyBzYWZlIHRvIGRvIHNvLgotICoqLwotdm9pZCBibGtfYXR0ZW1wdF9yZW1lcmdlKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JYXR0ZW1wdF9iYWNrX21lcmdlKHEsIHJxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKLX0KLQotRVhQT1JUX1NZTUJPTChibGtfYXR0ZW1wdF9yZW1lcmdlKTsKLQogc3RhdGljIHZvaWQgaW5pdF9yZXF1ZXN0X2Zyb21fYmlvKHN0cnVjdCByZXF1ZXN0ICpyZXEsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlyZXEtPmZsYWdzIHw9IFJFUV9DTUQ7CkBAIC0zMjg3LDYgKzMyNzUsODcgQEAKIEVYUE9SVF9TWU1CT0woZW5kX3RoYXRfcmVxdWVzdF9jaHVuayk7CiAKIC8qCisgKiBzcGxpY2UgdGhlIGNvbXBsZXRpb24gZGF0YSB0byBhIGxvY2FsIHN0cnVjdHVyZSBhbmQgaGFuZCBvZmYgdG8KKyAqIHByb2Nlc3NfY29tcGxldGlvbl9xdWV1ZSgpIHRvIGNvbXBsZXRlIHRoZSByZXF1ZXN0cworICovCitzdGF0aWMgdm9pZCBibGtfZG9uZV9zb2Z0aXJxKHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiAqaCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpjcHVfbGlzdDsKKwlMSVNUX0hFQUQobG9jYWxfbGlzdCk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWNwdV9saXN0ID0gJl9fZ2V0X2NwdV92YXIoYmxrX2NwdV9kb25lKTsKKwlsaXN0X3NwbGljZV9pbml0KGNwdV9saXN0LCAmbG9jYWxfbGlzdCk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZsb2NhbF9saXN0KSkgeworCQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBsaXN0X2VudHJ5KGxvY2FsX2xpc3QubmV4dCwgc3RydWN0IHJlcXVlc3QsIGRvbmVsaXN0KTsKKworCQlsaXN0X2RlbF9pbml0KCZycS0+ZG9uZWxpc3QpOworCQlycS0+cS0+c29mdGlycV9kb25lX2ZuKHJxKTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKworc3RhdGljIGludCBibGtfY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAorCQkJICB2b2lkICpoY3B1KQoreworCS8qCisJICogSWYgYSBDUFUgZ29lcyBhd2F5LCBzcGxpY2UgaXRzIGVudHJpZXMgdG8gdGhlIGN1cnJlbnQgQ1BVCisJICogYW5kIHRyaWdnZXIgYSBydW4gb2YgdGhlIHNvZnRpcnEKKwkgKi8KKwlpZiAoYWN0aW9uID09IENQVV9ERUFEKSB7CisJCWludCBjcHUgPSAodW5zaWduZWQgbG9uZykgaGNwdTsKKworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQlsaXN0X3NwbGljZV9pbml0KCZwZXJfY3B1KGJsa19jcHVfZG9uZSwgY3B1KSwKKwkJCQkgJl9fZ2V0X2NwdV92YXIoYmxrX2NwdV9kb25lKSk7CisJCXJhaXNlX3NvZnRpcnFfaXJxb2ZmKEJMT0NLX1NPRlRJUlEpOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJfQorCisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIF9fZGV2aW5pdGRhdGEgYmxrX2NwdV9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbAk9IGJsa19jcHVfbm90aWZ5LAorfTsKKworI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLworCisvKioKKyAqIGJsa19jb21wbGV0ZV9yZXF1ZXN0IC0gZW5kIEkvTyBvbiBhIHJlcXVlc3QKKyAqIEByZXE6ICAgICAgdGhlIHJlcXVlc3QgYmVpbmcgcHJvY2Vzc2VkCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgRW5kcyBhbGwgSS9PIG9uIGEgcmVxdWVzdC4gSXQgZG9lcyBub3QgaGFuZGxlIHBhcnRpYWwgY29tcGxldGlvbnMsCisgKiAgICAgdW5sZXNzIHRoZSBkcml2ZXIgYWN0dWFsbHkgaW1wbGVtZW50cyB0aGlzIGluIGl0cyBjb21wbGV0aW9uYyBjYWxsYmFjaworICogICAgIHRocm91Z2ggcmVxdWV1ZWluZy4gVGhlaCBhY3R1YWwgY29tcGxldGlvbiBoYXBwZW5zIG91dC1vZi1vcmRlciwKKyAqICAgICB0aHJvdWdoIGEgc29mdGlycSBoYW5kbGVyLiBUaGUgdXNlciBtdXN0IGhhdmUgcmVnaXN0ZXJlZCBhIGNvbXBsZXRpb24KKyAqICAgICBjYWxsYmFjayB0aHJvdWdoIGJsa19xdWV1ZV9zb2Z0aXJxX2RvbmUoKS4KKyAqKi8KKwordm9pZCBibGtfY29tcGxldGVfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmNwdV9saXN0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlCVUdfT04oIXJlcS0+cS0+c29mdGlycV9kb25lX2ZuKTsKKwkJCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJY3B1X2xpc3QgPSAmX19nZXRfY3B1X3ZhcihibGtfY3B1X2RvbmUpOworCWxpc3RfYWRkX3RhaWwoJnJlcS0+ZG9uZWxpc3QsIGNwdV9saXN0KTsKKwlyYWlzZV9zb2Z0aXJxX2lycW9mZihCTE9DS19TT0ZUSVJRKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworRVhQT1JUX1NZTUJPTChibGtfY29tcGxldGVfcmVxdWVzdCk7CisJCisvKgogICogcXVldWUgbG9jayBtdXN0IGJlIGhlbGQKICAqLwogdm9pZCBlbmRfdGhhdF9yZXF1ZXN0X2xhc3Qoc3RydWN0IHJlcXVlc3QgKnJlcSwgaW50IHVwdG9kYXRlKQpAQCAtMzM2NCw2ICszNDMzLDggQEAKIAogaW50IF9faW5pdCBibGtfZGV2X2luaXQodm9pZCkKIHsKKwlpbnQgaTsKKwogCWtibG9ja2Rfd29ya3F1ZXVlID0gY3JlYXRlX3dvcmtxdWV1ZSgia2Jsb2NrZCIpOwogCWlmICgha2Jsb2NrZF93b3JrcXVldWUpCiAJCXBhbmljKCJGYWlsZWQgdG8gY3JlYXRlIGtibG9ja2RcbiIpOwpAQCAtMzM3Nyw2ICszNDQ4LDE0IEBACiAJaW9jb250ZXh0X2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJibGtkZXZfaW9jIiwKIAkJCXNpemVvZihzdHJ1Y3QgaW9fY29udGV4dCksIDAsIFNMQUJfUEFOSUMsIE5VTEwsIE5VTEwpOwogCisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykKKwkJSU5JVF9MSVNUX0hFQUQoJnBlcl9jcHUoYmxrX2NwdV9kb25lLCBpKSk7CisKKwlvcGVuX3NvZnRpcnEoQkxPQ0tfU09GVElSUSwgYmxrX2RvbmVfc29mdGlycSwgTlVMTCk7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZibGtfY3B1X25vdGlmaWVyKTsKKyNlbmRpZgorCiAJYmxrX21heF9sb3dfcGZuID0gbWF4X2xvd19wZm47CiAJYmxrX21heF9wZm4gPSBtYXhfcGZuOwogCmRpZmYgLS1naXQgYS9ibG9jay9zY3NpX2lvY3RsLmMgYi9ibG9jay9zY3NpX2lvY3RsLmMKaW5kZXggYzJhYzM2ZC4uY2M3MjIxMCAxMDA2NDQKLS0tIGEvYmxvY2svc2NzaV9pb2N0bC5jCisrKyBiL2Jsb2NrL3Njc2lfaW9jdGwuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xOTAsMTYgKzE5MSwyMSBAQAogCQlzYWZlX2Zvcl93cml0ZShHUENNRF9TRVRfU1RSRUFNSU5HKSwKIAl9OwogCXVuc2lnbmVkIGNoYXIgdHlwZSA9IGNtZF90eXBlW2NtZFswXV07CisJaW50IGhhc193cml0ZV9wZXJtID0gMDsKIAogCS8qIEFueWJvZHkgd2hvIGNhbiBvcGVuIHRoZSBkZXZpY2UgY2FuIGRvIGEgcmVhZC1zYWZlIGNvbW1hbmQgKi8KIAlpZiAodHlwZSAmIENNRF9SRUFEX1NBRkUpCiAJCXJldHVybiAwOwogCisJLyoKKwkgKiBmaWxlIGNhbiBiZSBOVUxMIGZyb20gaW9jdGxfYnlfYmRldigpLi4uCisJICovCisJaWYgKGZpbGUpCisJCWhhc193cml0ZV9wZXJtID0gZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEU7CisKIAkvKiBXcml0ZS1zYWZlIGNvbW1hbmRzIGp1c3QgcmVxdWlyZSBhIHdyaXRhYmxlIG9wZW4uLiAqLwotCWlmICh0eXBlICYgQ01EX1dSSVRFX1NBRkUpIHsKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQkJcmV0dXJuIDA7Ci0JfQorCWlmICgodHlwZSAmIENNRF9XUklURV9TQUZFKSAmJiBoYXNfd3JpdGVfcGVybSkKKwkJcmV0dXJuIDA7CiAKIAkvKiBBbmQgcm9vdCBjYW4gZG8gYW55IGNvbW1hbmQuLiAqLwogCWlmIChjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL0tjb25maWcgYi9jcnlwdG8vS2NvbmZpZwppbmRleCA1MmUxZDQxLi5jNDQyZjJlIDEwMDY0NAotLS0gYS9jcnlwdG8vS2NvbmZpZworKysgYi9jcnlwdG8vS2NvbmZpZwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAKIGNvbmZpZyBDUllQVE9fQUVTCiAJdHJpc3RhdGUgIkFFUyBjaXBoZXIgYWxnb3JpdGhtcyIKLQlkZXBlbmRzIG9uIENSWVBUTyAmJiAhKFg4NiB8fCBVTUxfWDg2KQorCWRlcGVuZHMgb24gQ1JZUFRPCiAJaGVscAogCSAgQUVTIGNpcGhlciBhbGdvcml0aG1zIChGSVBTLTE5NykuIEFFUyB1c2VzIHRoZSBSaWpuZGFlbCAKIAkgIGFsZ29yaXRobS4KZGlmZiAtLWdpdCBhL2NyeXB0by9hZXMuYyBiL2NyeXB0by9hZXMuYwppbmRleCA1ZGY5Mjg4Li4wYTZhNWMxIDEwMDY0NAotLS0gYS9jcnlwdG8vYWVzLmMKKysrIGIvY3J5cHRvL2Flcy5jCkBAIC03Myw5ICs3Myw2IEBACiAJcmV0dXJuIHggPj4gKG4gPDwgMyk7CiB9CiAKLSNkZWZpbmUgdTMyX2luKHgpIGxlMzJfdG9fY3B1KCooY29uc3QgdTMyICopKHgpKQotI2RlZmluZSB1MzJfb3V0KHRvLCBmcm9tKSAoKih1MzIgKikodG8pID0gY3B1X3RvX2xlMzIoZnJvbSkpCi0KIHN0cnVjdCBhZXNfY3R4IHsKIAlpbnQga2V5X2xlbmd0aDsKIAl1MzIgRVs2MF07CkBAIC0yNTYsNiArMjUzLDcgQEAKIGFlc19zZXRfa2V5KHZvaWQgKmN0eF9hcmcsIGNvbnN0IHU4ICppbl9rZXksIHVuc2lnbmVkIGludCBrZXlfbGVuLCB1MzIgKmZsYWdzKQogewogCXN0cnVjdCBhZXNfY3R4ICpjdHggPSBjdHhfYXJnOworCWNvbnN0IF9fbGUzMiAqa2V5ID0gKGNvbnN0IF9fbGUzMiAqKWluX2tleTsKIAl1MzIgaSwgdCwgdSwgdiwgdzsKIAogCWlmIChrZXlfbGVuICE9IDE2ICYmIGtleV9sZW4gIT0gMjQgJiYga2V5X2xlbiAhPSAzMikgewpAQCAtMjY1LDEwICsyNjMsMTAgQEAKIAogCWN0eC0+a2V5X2xlbmd0aCA9IGtleV9sZW47CiAKLQlFX0tFWVswXSA9IHUzMl9pbiAoaW5fa2V5KTsKLQlFX0tFWVsxXSA9IHUzMl9pbiAoaW5fa2V5ICsgNCk7Ci0JRV9LRVlbMl0gPSB1MzJfaW4gKGluX2tleSArIDgpOwotCUVfS0VZWzNdID0gdTMyX2luIChpbl9rZXkgKyAxMik7CisJRV9LRVlbMF0gPSBsZTMyX3RvX2NwdShrZXlbMF0pOworCUVfS0VZWzFdID0gbGUzMl90b19jcHUoa2V5WzFdKTsKKwlFX0tFWVsyXSA9IGxlMzJfdG9fY3B1KGtleVsyXSk7CisJRV9LRVlbM10gPSBsZTMyX3RvX2NwdShrZXlbM10pOwogCiAJc3dpdGNoIChrZXlfbGVuKSB7CiAJY2FzZSAxNjoKQEAgLTI3OCwxNyArMjc2LDE3IEBACiAJCWJyZWFrOwogCiAJY2FzZSAyNDoKLQkJRV9LRVlbNF0gPSB1MzJfaW4gKGluX2tleSArIDE2KTsKLQkJdCA9IEVfS0VZWzVdID0gdTMyX2luIChpbl9rZXkgKyAyMCk7CisJCUVfS0VZWzRdID0gbGUzMl90b19jcHUoa2V5WzRdKTsKKwkJdCA9IEVfS0VZWzVdID0gbGUzMl90b19jcHUoa2V5WzVdKTsKIAkJZm9yIChpID0gMDsgaSA8IDg7ICsraSkKIAkJCWxvb3A2IChpKTsKIAkJYnJlYWs7CiAKIAljYXNlIDMyOgotCQlFX0tFWVs0XSA9IHUzMl9pbiAoaW5fa2V5ICsgMTYpOwotCQlFX0tFWVs1XSA9IHUzMl9pbiAoaW5fa2V5ICsgMjApOwotCQlFX0tFWVs2XSA9IHUzMl9pbiAoaW5fa2V5ICsgMjQpOwotCQl0ID0gRV9LRVlbN10gPSB1MzJfaW4gKGluX2tleSArIDI4KTsKKwkJRV9LRVlbNF0gPSBsZTMyX3RvX2NwdShrZXlbNF0pOworCQlFX0tFWVs1XSA9IGxlMzJfdG9fY3B1KGtleVs1XSk7CisJCUVfS0VZWzZdID0gbGUzMl90b19jcHUoa2V5WzZdKTsKKwkJdCA9IEVfS0VZWzddID0gbGUzMl90b19jcHUoa2V5WzddKTsKIAkJZm9yIChpID0gMDsgaSA8IDc7ICsraSkKIAkJCWxvb3A4IChpKTsKIAkJYnJlYWs7CkBAIC0zMjQsMTMgKzMyMiwxNSBAQAogc3RhdGljIHZvaWQgYWVzX2VuY3J5cHQodm9pZCAqY3R4X2FyZywgdTggKm91dCwgY29uc3QgdTggKmluKQogewogCWNvbnN0IHN0cnVjdCBhZXNfY3R4ICpjdHggPSBjdHhfYXJnOworCWNvbnN0IF9fbGUzMiAqc3JjID0gKGNvbnN0IF9fbGUzMiAqKWluOworCV9fbGUzMiAqZHN0ID0gKF9fbGUzMiAqKW91dDsKIAl1MzIgYjBbNF0sIGIxWzRdOwogCWNvbnN0IHUzMiAqa3AgPSBFX0tFWSArIDQ7CiAKLQliMFswXSA9IHUzMl9pbiAoaW4pIF4gRV9LRVlbMF07Ci0JYjBbMV0gPSB1MzJfaW4gKGluICsgNCkgXiBFX0tFWVsxXTsKLQliMFsyXSA9IHUzMl9pbiAoaW4gKyA4KSBeIEVfS0VZWzJdOwotCWIwWzNdID0gdTMyX2luIChpbiArIDEyKSBeIEVfS0VZWzNdOworCWIwWzBdID0gbGUzMl90b19jcHUoc3JjWzBdKSBeIEVfS0VZWzBdOworCWIwWzFdID0gbGUzMl90b19jcHUoc3JjWzFdKSBeIEVfS0VZWzFdOworCWIwWzJdID0gbGUzMl90b19jcHUoc3JjWzJdKSBeIEVfS0VZWzJdOworCWIwWzNdID0gbGUzMl90b19jcHUoc3JjWzNdKSBeIEVfS0VZWzNdOwogCiAJaWYgKGN0eC0+a2V5X2xlbmd0aCA+IDI0KSB7CiAJCWZfbnJvdW5kIChiMSwgYjAsIGtwKTsKQEAgLTM1MywxMCArMzUzLDEwIEBACiAJZl9ucm91bmQgKGIxLCBiMCwga3ApOwogCWZfbHJvdW5kIChiMCwgYjEsIGtwKTsKIAotCXUzMl9vdXQgKG91dCwgYjBbMF0pOwotCXUzMl9vdXQgKG91dCArIDQsIGIwWzFdKTsKLQl1MzJfb3V0IChvdXQgKyA4LCBiMFsyXSk7Ci0JdTMyX291dCAob3V0ICsgMTIsIGIwWzNdKTsKKwlkc3RbMF0gPSBjcHVfdG9fbGUzMihiMFswXSk7CisJZHN0WzFdID0gY3B1X3RvX2xlMzIoYjBbMV0pOworCWRzdFsyXSA9IGNwdV90b19sZTMyKGIwWzJdKTsKKwlkc3RbM10gPSBjcHVfdG9fbGUzMihiMFszXSk7CiB9CiAKIC8qIGRlY3J5cHQgYSBibG9jayBvZiB0ZXh0ICovCkBAIC0zNzcsMTQgKzM3NywxNiBAQAogc3RhdGljIHZvaWQgYWVzX2RlY3J5cHQodm9pZCAqY3R4X2FyZywgdTggKm91dCwgY29uc3QgdTggKmluKQogewogCWNvbnN0IHN0cnVjdCBhZXNfY3R4ICpjdHggPSBjdHhfYXJnOworCWNvbnN0IF9fbGUzMiAqc3JjID0gKGNvbnN0IF9fbGUzMiAqKWluOworCV9fbGUzMiAqZHN0ID0gKF9fbGUzMiAqKW91dDsKIAl1MzIgYjBbNF0sIGIxWzRdOwogCWNvbnN0IGludCBrZXlfbGVuID0gY3R4LT5rZXlfbGVuZ3RoOwogCWNvbnN0IHUzMiAqa3AgPSBEX0tFWSArIGtleV9sZW4gKyAyMDsKIAotCWIwWzBdID0gdTMyX2luIChpbikgXiBFX0tFWVtrZXlfbGVuICsgMjRdOwotCWIwWzFdID0gdTMyX2luIChpbiArIDQpIF4gRV9LRVlba2V5X2xlbiArIDI1XTsKLQliMFsyXSA9IHUzMl9pbiAoaW4gKyA4KSBeIEVfS0VZW2tleV9sZW4gKyAyNl07Ci0JYjBbM10gPSB1MzJfaW4gKGluICsgMTIpIF4gRV9LRVlba2V5X2xlbiArIDI3XTsKKwliMFswXSA9IGxlMzJfdG9fY3B1KHNyY1swXSkgXiBFX0tFWVtrZXlfbGVuICsgMjRdOworCWIwWzFdID0gbGUzMl90b19jcHUoc3JjWzFdKSBeIEVfS0VZW2tleV9sZW4gKyAyNV07CisJYjBbMl0gPSBsZTMyX3RvX2NwdShzcmNbMl0pIF4gRV9LRVlba2V5X2xlbiArIDI2XTsKKwliMFszXSA9IGxlMzJfdG9fY3B1KHNyY1szXSkgXiBFX0tFWVtrZXlfbGVuICsgMjddOwogCiAJaWYgKGtleV9sZW4gPiAyNCkgewogCQlpX25yb3VuZCAoYjEsIGIwLCBrcCk7CkBAIC00MDcsMTggKzQwOSwyMSBAQAogCWlfbnJvdW5kIChiMSwgYjAsIGtwKTsKIAlpX2xyb3VuZCAoYjAsIGIxLCBrcCk7CiAKLQl1MzJfb3V0IChvdXQsIGIwWzBdKTsKLQl1MzJfb3V0IChvdXQgKyA0LCBiMFsxXSk7Ci0JdTMyX291dCAob3V0ICsgOCwgYjBbMl0pOwotCXUzMl9vdXQgKG91dCArIDEyLCBiMFszXSk7CisJZHN0WzBdID0gY3B1X3RvX2xlMzIoYjBbMF0pOworCWRzdFsxXSA9IGNwdV90b19sZTMyKGIwWzFdKTsKKwlkc3RbMl0gPSBjcHVfdG9fbGUzMihiMFsyXSk7CisJZHN0WzNdID0gY3B1X3RvX2xlMzIoYjBbM10pOwogfQogCiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBhZXNfYWxnID0gewogCS5jcmFfbmFtZQkJPQkiYWVzIiwKKwkuY3JhX2RyaXZlcl9uYW1lCT0JImFlcy1nZW5lcmljIiwKKwkuY3JhX3ByaW9yaXR5CQk9CTEwMCwKIAkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIsCiAJLmNyYV9ibG9ja3NpemUJCT0JQUVTX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgYWVzX2N0eCksCisJLmNyYV9hbGlnbm1hc2sJCT0JMywKIAkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKIAkuY3JhX2xpc3QJCT0JTElTVF9IRUFEX0lOSVQoYWVzX2FsZy5jcmFfbGlzdCksCiAJLmNyYV91CQkJPQl7CmRpZmYgLS1naXQgYS9jcnlwdG8vYW51YmlzLmMgYi9jcnlwdG8vYW51YmlzLmMKaW5kZXggMzkyNWViMC4uMmM3OTZiZCAxMDA2NDQKLS0tIGEvY3J5cHRvL2FudWJpcy5jCisrKyBiL2NyeXB0by9hbnViaXMuYwpAQCAtMzIsOCArMzIsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2RlZmluZSBBTlVCSVNfTUlOX0tFWV9TSVpFCTE2CiAjZGVmaW5lIEFOVUJJU19NQVhfS0VZX1NJWkUJNDAKQEAgLTQ2MSw4ICs0NjMsOCBAQAogc3RhdGljIGludCBhbnViaXNfc2V0a2V5KHZvaWQgKmN0eF9hcmcsIGNvbnN0IHU4ICppbl9rZXksCiAJCQkgdW5zaWduZWQgaW50IGtleV9sZW4sIHUzMiAqZmxhZ3MpCiB7Ci0KLQlpbnQgTiwgUiwgaSwgcG9zLCByOworCWNvbnN0IF9fYmUzMiAqa2V5ID0gKGNvbnN0IF9fYmUzMiAqKWluX2tleTsKKwlpbnQgTiwgUiwgaSwgcjsKIAl1MzIga2FwcGFbQU5VQklTX01BWF9OXTsKIAl1MzIgaW50ZXJbQU5VQklTX01BWF9OXTsKIApAQCAtNDgzLDEzICs0ODUsOCBAQAogCWN0eC0+UiA9IFIgPSA4ICsgTjsKIAogCS8qICogbWFwIGNpcGhlciBrZXkgdG8gaW5pdGlhbCBrZXkgc3RhdGUgKG11KTogKi8KLQkJZm9yIChpID0gMCwgcG9zID0gMDsgaSA8IE47IGkrKywgcG9zICs9IDQpIHsKLQkJa2FwcGFbaV0gPQotCQkJKGluX2tleVtwb3MgICAgXSA8PCAyNCkgXgotCQkJKGluX2tleVtwb3MgKyAxXSA8PCAxNikgXgotCQkJKGluX2tleVtwb3MgKyAyXSA8PCAgOCkgXgotCQkJKGluX2tleVtwb3MgKyAzXSAgICAgICk7Ci0JfQorCWZvciAoaSA9IDA7IGkgPCBOOyBpKyspCisJCWthcHBhW2ldID0gYmUzMl90b19jcHUoa2V5W2ldKTsKIAogCS8qCiAJICogZ2VuZXJhdGUgUiArIDEgcm91bmQga2V5czoKQEAgLTU3OCw3ICs1NzUsOSBAQAogc3RhdGljIHZvaWQgYW51YmlzX2NyeXB0KHUzMiByb3VuZEtleVtBTlVCSVNfTUFYX1JPVU5EUyArIDFdWzRdLAogCQl1OCAqY2lwaGVydGV4dCwgY29uc3QgdTggKnBsYWludGV4dCwgY29uc3QgaW50IFIpCiB7Ci0JaW50IGksIHBvcywgcjsKKwljb25zdCBfX2JlMzIgKnNyYyA9IChjb25zdCBfX2JlMzIgKilwbGFpbnRleHQ7CisJX19iZTMyICpkc3QgPSAoX19iZTMyICopY2lwaGVydGV4dDsKKwlpbnQgaSwgcjsKIAl1MzIgc3RhdGVbNF07CiAJdTMyIGludGVyWzRdOwogCkBAIC01ODYsMTQgKzU4NSw4IEBACiAJICogbWFwIHBsYWludGV4dCBibG9jayB0byBjaXBoZXIgc3RhdGUgKG11KQogCSAqIGFuZCBhZGQgaW5pdGlhbCByb3VuZCBrZXkgKHNpZ21hW0teMF0pOgogCSAqLwotCWZvciAoaSA9IDAsIHBvcyA9IDA7IGkgPCA0OyBpKyssIHBvcyArPSA0KSB7Ci0JCXN0YXRlW2ldID0KLQkJCShwbGFpbnRleHRbcG9zICAgIF0gPDwgMjQpIF4KLQkJCShwbGFpbnRleHRbcG9zICsgMV0gPDwgMTYpIF4KLQkJCShwbGFpbnRleHRbcG9zICsgMl0gPDwgIDgpIF4KLQkJCShwbGFpbnRleHRbcG9zICsgM10gICAgICApIF4KLQkJCXJvdW5kS2V5WzBdW2ldOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQlzdGF0ZVtpXSA9IGJlMzJfdG9fY3B1KHNyY1tpXSkgXiByb3VuZEtleVswXVtpXTsKIAogCS8qCiAJICogUiAtIDEgZnVsbCByb3VuZHM6CkBAIC02NjMsMTMgKzY1Niw4IEBACiAJICogbWFwIGNpcGhlciBzdGF0ZSB0byBjaXBoZXJ0ZXh0IGJsb2NrIChtdV57LTF9KToKIAkgKi8KIAotCWZvciAoaSA9IDAsIHBvcyA9IDA7IGkgPCA0OyBpKyssIHBvcyArPSA0KSB7Ci0JCXUzMiB3ID0gaW50ZXJbaV07Ci0JCWNpcGhlcnRleHRbcG9zICAgIF0gPSAodTgpKHcgPj4gMjQpOwotCQljaXBoZXJ0ZXh0W3BvcyArIDFdID0gKHU4KSh3ID4+IDE2KTsKLQkJY2lwaGVydGV4dFtwb3MgKyAyXSA9ICh1OCkodyA+PiAgOCk7Ci0JCWNpcGhlcnRleHRbcG9zICsgM10gPSAodTgpKHcgICAgICApOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQlkc3RbaV0gPSBjcHVfdG9fYmUzMihpbnRlcltpXSk7CiB9CiAKIHN0YXRpYyB2b2lkIGFudWJpc19lbmNyeXB0KHZvaWQgKmN0eF9hcmcsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCkBAIC02ODksNiArNjc3LDcgQEAKIAkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIsCiAJLmNyYV9ibG9ja3NpemUJCT0JQU5VQklTX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9CXNpemVvZiAoc3RydWN0IGFudWJpc19jdHgpLAorCS5jcmFfYWxpZ25tYXNrCQk9CTMsCiAJLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCiAJLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKGFudWJpc19hbGcuY3JhX2xpc3QpLAogCS5jcmFfdQkJCT0JeyAuY2lwaGVyID0gewpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FwaS5jIGIvY3J5cHRvL2FwaS5jCmluZGV4IDQwYWU0MmUuLmUyNjE1NmYgMTAwNjQ0Ci0tLSBhL2NyeXB0by9hcGkuYworKysgYi9jcnlwdG8vYXBpLmMKQEAgLTMsNiArMyw3IEBACiAgKgogICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgogICogQ29weXJpZ2h0IChjKSAyMDAyIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqIENvcHlyaWdodCAoYykgMjAwNSBIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+CiAgKgogICogUG9ydGlvbnMgZGVyaXZlZCBmcm9tIENyeXB0b2FwaSwgYnkgQWxleGFuZGVyIEtqZWxkYWFzIDxhc3RvckBmYXN0Lm5vPgogICogYW5kIE5ldHRsZSwgYnkgTmllbHMgTfZsbGVyLgpAQCAtMTgsOSArMTksMTEgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogTElTVF9IRUFEKGNyeXB0b19hbGdfbGlzdCk7CkBAIC0zOSw2ICs0Miw3IEBACiBzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IGNyeXB0b19hbGcgKnEsICphbGcgPSBOVUxMOworCWludCBiZXN0ID0gLTE7CiAKIAlpZiAoIW5hbWUpCiAJCXJldHVybiBOVUxMOwpAQCAtNDYsMTEgKzUwLDIzIEBACiAJZG93bl9yZWFkKCZjcnlwdG9fYWxnX3NlbSk7CiAJCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShxLCAmY3J5cHRvX2FsZ19saXN0LCBjcmFfbGlzdCkgewotCQlpZiAoIShzdHJjbXAocS0+Y3JhX25hbWUsIG5hbWUpKSkgewotCQkJaWYgKGNyeXB0b19hbGdfZ2V0KHEpKQotCQkJCWFsZyA9IHE7CisJCWludCBleGFjdCwgZnV6enk7CisKKwkJZXhhY3QgPSAhc3RyY21wKHEtPmNyYV9kcml2ZXJfbmFtZSwgbmFtZSk7CisJCWZ1enp5ID0gIXN0cmNtcChxLT5jcmFfbmFtZSwgbmFtZSk7CisJCWlmICghZXhhY3QgJiYgIShmdXp6eSAmJiBxLT5jcmFfcHJpb3JpdHkgPiBiZXN0KSkKKwkJCWNvbnRpbnVlOworCisJCWlmICh1bmxpa2VseSghY3J5cHRvX2FsZ19nZXQocSkpKQorCQkJY29udGludWU7CisKKwkJYmVzdCA9IHEtPmNyYV9wcmlvcml0eTsKKwkJaWYgKGFsZykKKwkJCWNyeXB0b19hbGdfcHV0KGFsZyk7CisJCWFsZyA9IHE7CisKKwkJaWYgKGV4YWN0KQogCQkJYnJlYWs7Ci0JCX0KIAl9CiAJCiAJdXBfcmVhZCgmY3J5cHRvX2FsZ19zZW0pOwpAQCAtMjA3LDkgKzIyMywyNiBAQAogCWtmcmVlKHRmbSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19zZXRfZHJpdmVyX25hbWUoc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBzdWZmaXhbXSA9ICItZ2VuZXJpYyI7CisJY2hhciAqZHJpdmVyX25hbWUgPSAoY2hhciAqKWFsZy0+Y3JhX2RyaXZlcl9uYW1lOworCWludCBsZW47CisKKwlpZiAoKmRyaXZlcl9uYW1lKQorCQlyZXR1cm4gMDsKKworCWxlbiA9IHN0cmxjcHkoZHJpdmVyX25hbWUsIGFsZy0+Y3JhX25hbWUsIENSWVBUT19NQVhfQUxHX05BTUUpOworCWlmIChsZW4gKyBzaXplb2Yoc3VmZml4KSA+IENSWVBUT19NQVhfQUxHX05BTUUpCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJbWVtY3B5KGRyaXZlcl9uYW1lICsgbGVuLCBzdWZmaXgsIHNpemVvZihzdWZmaXgpKTsKKwlyZXR1cm4gMDsKK30KKwogaW50IGNyeXB0b19yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZykKIHsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0OwogCXN0cnVjdCBjcnlwdG9fYWxnICpxOwogCiAJaWYgKGFsZy0+Y3JhX2FsaWdubWFzayAmIChhbGctPmNyYV9hbGlnbm1hc2sgKyAxKSkKQEAgLTIxOCwxMyArMjUxLDIwIEBACiAJaWYgKGFsZy0+Y3JhX2FsaWdubWFzayAmIGFsZy0+Y3JhX2Jsb2Nrc2l6ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoYWxnLT5jcmFfYmxvY2tzaXplID4gUEFHRV9TSVpFKQorCWlmIChhbGctPmNyYV9ibG9ja3NpemUgPiBQQUdFX1NJWkUgLyA4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChhbGctPmNyYV9wcmlvcml0eSA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCQorCXJldCA9IGNyeXB0b19zZXRfZHJpdmVyX25hbWUoYWxnKTsKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJcmV0dXJuIHJldDsKKwogCWRvd25fd3JpdGUoJmNyeXB0b19hbGdfc2VtKTsKIAkKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHEsICZjcnlwdG9fYWxnX2xpc3QsIGNyYV9saXN0KSB7Ci0JCWlmICghKHN0cmNtcChxLT5jcmFfbmFtZSwgYWxnLT5jcmFfbmFtZSkpKSB7CisJCWlmICghc3RyY21wKHEtPmNyYV9kcml2ZXJfbmFtZSwgYWxnLT5jcmFfZHJpdmVyX25hbWUpKSB7CiAJCQlyZXQgPSAtRUVYSVNUOwogCQkJZ290byBvdXQ7CiAJCX0KZGlmZiAtLWdpdCBhL2NyeXB0by9ibG93ZmlzaC5jIGIvY3J5cHRvL2Jsb3dmaXNoLmMKaW5kZXggYThiMjlkNS4uN2Y3MTBiMiAxMDA2NDQKLS0tIGEvY3J5cHRvL2Jsb3dmaXNoLmMKKysrIGIvY3J5cHRvL2Jsb3dmaXNoLmMKQEAgLTE5LDggKzE5LDEwIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNkZWZpbmUgQkZfQkxPQ0tfU0laRSA4CiAjZGVmaW5lIEJGX01JTl9LRVlfU0laRSA0CkBAIC00NTEsNiArNDUzLDcgQEAKIAkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIsCiAJLmNyYV9ibG9ja3NpemUJCT0JQkZfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBiZl9jdHgpLAorCS5jcmFfYWxpZ25tYXNrCQk9CTMsCiAJLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCiAJLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKGFsZy5jcmFfbGlzdCksCiAJLmNyYV91CQkJPQl7IC5jaXBoZXIgPSB7CmRpZmYgLS1naXQgYS9jcnlwdG8vY2FzdDUuYyBiL2NyeXB0by9jYXN0NS5jCmluZGV4IGJjNDJmNDIuLjg4MzRjODUgMTAwNjQ0Ci0tLSBhL2NyeXB0by9jYXN0NS5jCisrKyBiL2NyeXB0by9jYXN0NS5jCkBAIC0yMSwxMSArMjEsMTMgQEAKICovCiAKIAorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAjZGVmaW5lIENBU1Q1X0JMT0NLX1NJWkUgOAogI2RlZmluZSBDQVNUNV9NSU5fS0VZX1NJWkUgNQpAQCAtNTc4LDYgKzU4MCw4IEBACiBzdGF0aWMgdm9pZCBjYXN0NV9lbmNyeXB0KHZvaWQgKmN0eCwgdTggKiBvdXRidWYsIGNvbnN0IHU4ICogaW5idWYpCiB7CiAJc3RydWN0IGNhc3Q1X2N0eCAqYyA9IChzdHJ1Y3QgY2FzdDVfY3R4ICopIGN0eDsKKwljb25zdCBfX2JlMzIgKnNyYyA9IChjb25zdCBfX2JlMzIgKilpbmJ1ZjsKKwlfX2JlMzIgKmRzdCA9IChfX2JlMzIgKilvdXRidWY7CiAJdTMyIGwsIHIsIHQ7CiAJdTMyIEk7CQkJLyogdXNlZCBieSB0aGUgRnggbWFjcm9zICovCiAJdTMyICpLbTsKQEAgLTU4OSw4ICs1OTMsOCBAQAogCS8qIChMMCxSMCkgPC0tIChtMS4uLm02NCkuICAoU3BsaXQgdGhlIHBsYWludGV4dCBpbnRvIGxlZnQgYW5kCiAJICogcmlnaHQgMzItYml0IGhhbHZlcyBMMCA9IG0xLi4ubTMyIGFuZCBSMCA9IG0zMy4uLm02NC4pCiAJICovCi0JbCA9IGluYnVmWzBdIDw8IDI0IHwgaW5idWZbMV0gPDwgMTYgfCBpbmJ1ZlsyXSA8PCA4IHwgaW5idWZbM107Ci0JciA9IGluYnVmWzRdIDw8IDI0IHwgaW5idWZbNV0gPDwgMTYgfCBpbmJ1Zls2XSA8PCA4IHwgaW5idWZbN107CisJbCA9IGJlMzJfdG9fY3B1KHNyY1swXSk7CisJciA9IGJlMzJfdG9fY3B1KHNyY1sxXSk7CiAKIAkvKiAoMTYgcm91bmRzKSBmb3IgaSBmcm9tIDEgdG8gMTYsIGNvbXB1dGUgTGkgYW5kIFJpIGFzIGZvbGxvd3M6CiAJICogIExpID0gUmktMTsKQEAgLTYzNCwxOSArNjM4LDE1IEBACiAKIAkvKiBjMS4uLmM2NCA8LS0gKFIxNixMMTYpLiAgKEV4Y2hhbmdlIGZpbmFsIGJsb2NrcyBMMTYsIFIxNiBhbmQKIAkgKiAgY29uY2F0ZW5hdGUgdG8gZm9ybSB0aGUgY2lwaGVydGV4dC4pICovCi0Jb3V0YnVmWzBdID0gKHIgPj4gMjQpICYgMHhmZjsKLQlvdXRidWZbMV0gPSAociA+PiAxNikgJiAweGZmOwotCW91dGJ1ZlsyXSA9IChyID4+IDgpICYgMHhmZjsKLQlvdXRidWZbM10gPSByICYgMHhmZjsKLQlvdXRidWZbNF0gPSAobCA+PiAyNCkgJiAweGZmOwotCW91dGJ1Zls1XSA9IChsID4+IDE2KSAmIDB4ZmY7Ci0Jb3V0YnVmWzZdID0gKGwgPj4gOCkgJiAweGZmOwotCW91dGJ1Zls3XSA9IGwgJiAweGZmOworCWRzdFswXSA9IGNwdV90b19iZTMyKHIpOworCWRzdFsxXSA9IGNwdV90b19iZTMyKGwpOwogfQogCiBzdGF0aWMgdm9pZCBjYXN0NV9kZWNyeXB0KHZvaWQgKmN0eCwgdTggKiBvdXRidWYsIGNvbnN0IHU4ICogaW5idWYpCiB7CiAJc3RydWN0IGNhc3Q1X2N0eCAqYyA9IChzdHJ1Y3QgY2FzdDVfY3R4ICopIGN0eDsKKwljb25zdCBfX2JlMzIgKnNyYyA9IChjb25zdCBfX2JlMzIgKilpbmJ1ZjsKKwlfX2JlMzIgKmRzdCA9IChfX2JlMzIgKilvdXRidWY7CiAJdTMyIGwsIHIsIHQ7CiAJdTMyIEk7CiAJdTMyICpLbTsKQEAgLTY1NSw4ICs2NTUsOCBAQAogCUttID0gYy0+S207CiAJS3IgPSBjLT5LcjsKIAotCWwgPSBpbmJ1ZlswXSA8PCAyNCB8IGluYnVmWzFdIDw8IDE2IHwgaW5idWZbMl0gPDwgOCB8IGluYnVmWzNdOwotCXIgPSBpbmJ1Zls0XSA8PCAyNCB8IGluYnVmWzVdIDw8IDE2IHwgaW5idWZbNl0gPDwgOCB8IGluYnVmWzddOworCWwgPSBiZTMyX3RvX2NwdShzcmNbMF0pOworCXIgPSBiZTMyX3RvX2NwdShzcmNbMV0pOwogCiAJaWYgKCEoYy0+cnIpKSB7CiAJCXQgPSBsOyBsID0gcjsgciA9IHQgXiBGMShyLCBLbVsxNV0sIEtyWzE1XSk7CkBAIC02OTAsMTQgKzY5MCw4IEBACiAJCXQgPSBsOyBsID0gcjsgciA9IHQgXiBGMShyLCBLbVswXSwgS3JbMF0pOwogCX0KIAotCW91dGJ1ZlswXSA9IChyID4+IDI0KSAmIDB4ZmY7Ci0Jb3V0YnVmWzFdID0gKHIgPj4gMTYpICYgMHhmZjsKLQlvdXRidWZbMl0gPSAociA+PiA4KSAmIDB4ZmY7Ci0Jb3V0YnVmWzNdID0gciAmIDB4ZmY7Ci0Jb3V0YnVmWzRdID0gKGwgPj4gMjQpICYgMHhmZjsKLQlvdXRidWZbNV0gPSAobCA+PiAxNikgJiAweGZmOwotCW91dGJ1Zls2XSA9IChsID4+IDgpICYgMHhmZjsKLQlvdXRidWZbN10gPSBsICYgMHhmZjsKKwlkc3RbMF0gPSBjcHVfdG9fYmUzMihyKTsKKwlkc3RbMV0gPSBjcHVfdG9fYmUzMihsKTsKIH0KIAogc3RhdGljIHZvaWQga2V5X3NjaGVkdWxlKHUzMiAqIHgsIHUzMiAqIHosIHUzMiAqIGspCkBAIC03ODIsNyArNzc2LDcgQEAKIAl1MzIgeFs0XTsKIAl1MzIgels0XTsKIAl1MzIga1sxNl07Ci0JdTggcF9rZXlbMTZdOworCV9fYmUzMiBwX2tleVs0XTsKIAlzdHJ1Y3QgY2FzdDVfY3R4ICpjID0gKHN0cnVjdCBjYXN0NV9jdHggKikgY3R4OwogCQogCWlmIChrZXlfbGVuIDwgNSB8fCBrZXlfbGVuID4gMTYpIHsKQEAgLTc5NiwxMiArNzkwLDEwIEBACiAJbWVtY3B5KHBfa2V5LCBrZXksIGtleV9sZW4pOwogCiAKLQl4WzBdID0gcF9rZXlbMF0gPDwgMjQgfCBwX2tleVsxXSA8PCAxNiB8IHBfa2V5WzJdIDw8IDggfCBwX2tleVszXTsKLQl4WzFdID0gcF9rZXlbNF0gPDwgMjQgfCBwX2tleVs1XSA8PCAxNiB8IHBfa2V5WzZdIDw8IDggfCBwX2tleVs3XTsKLQl4WzJdID0KLQkgICAgcF9rZXlbOF0gPDwgMjQgfCBwX2tleVs5XSA8PCAxNiB8IHBfa2V5WzEwXSA8PCA4IHwgcF9rZXlbMTFdOwotCXhbM10gPQotCSAgICBwX2tleVsxMl0gPDwgMjQgfCBwX2tleVsxM10gPDwgMTYgfCBwX2tleVsxNF0gPDwgOCB8IHBfa2V5WzE1XTsKKwl4WzBdID0gYmUzMl90b19jcHUocF9rZXlbMF0pOworCXhbMV0gPSBiZTMyX3RvX2NwdShwX2tleVsxXSk7CisJeFsyXSA9IGJlMzJfdG9fY3B1KHBfa2V5WzJdKTsKKwl4WzNdID0gYmUzMl90b19jcHUocF9rZXlbM10pOwogCiAJa2V5X3NjaGVkdWxlKHgsIHosIGspOwogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQpAQCAtODE3LDYgKzgwOSw3IEBACiAJLmNyYV9mbGFncyAJPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAogCS5jcmFfYmxvY2tzaXplIAk9IENBU1Q1X0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplIAk9IHNpemVvZihzdHJ1Y3QgY2FzdDVfY3R4KSwKKwkuY3JhX2FsaWdubWFzawk9IDMsCiAJLmNyYV9tb2R1bGUgCT0gVEhJU19NT0RVTEUsCiAJLmNyYV9saXN0IAk9IExJU1RfSEVBRF9JTklUKGFsZy5jcmFfbGlzdCksCiAJLmNyYV91IAkJPSB7CmRpZmYgLS1naXQgYS9jcnlwdG8vY2FzdDYuYyBiL2NyeXB0by9jYXN0Ni5jCmluZGV4IDNlYjA4MTAuLjllMjg3NDAgMTAwNjQ0Ci0tLSBhL2NyeXB0by9jYXN0Ni5jCisrKyBiL2NyeXB0by9jYXN0Ni5jCkBAIC0xOCwxMSArMTgsMTMgQEAKICAqLwogCiAKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2RlZmluZSBDQVNUNl9CTE9DS19TSVpFIDE2CiAjZGVmaW5lIENBU1Q2X01JTl9LRVlfU0laRSAxNgpAQCAtMzg0LDcgKzM4Niw3IEBACiB7CiAJaW50IGk7CiAJdTMyIGtleVs4XTsKLQl1OCBwX2tleVszMl07IC8qIHBhZGRlZCBrZXkgKi8KKwlfX2JlMzIgcF9rZXlbOF07IC8qIHBhZGRlZCBrZXkgKi8KIAlzdHJ1Y3QgY2FzdDZfY3R4ICpjID0gKHN0cnVjdCBjYXN0Nl9jdHggKikgY3R4OwogCiAJaWYgKGtleV9sZW4gPCAxNiB8fCBrZXlfbGVuID4gMzIgfHwga2V5X2xlbiAlIDQgIT0gMCkgewpAQCAtMzk1LDE0ICszOTcsMTQgQEAKIAltZW1zZXQgKHBfa2V5LCAwLCAzMik7CiAJbWVtY3B5IChwX2tleSwgaW5fa2V5LCBrZXlfbGVuKTsKIAkKLQlrZXlbMF0gPSBwX2tleVswXSA8PCAyNCB8IHBfa2V5WzFdIDw8IDE2IHwgcF9rZXlbMl0gPDwgOCB8IHBfa2V5WzNdOwkJLyogQSAqLwotCWtleVsxXSA9IHBfa2V5WzRdIDw8IDI0IHwgcF9rZXlbNV0gPDwgMTYgfCBwX2tleVs2XSA8PCA4IHwgcF9rZXlbN107CQkvKiBCICovCi0Ja2V5WzJdID0gcF9rZXlbOF0gPDwgMjQgfCBwX2tleVs5XSA8PCAxNiB8IHBfa2V5WzEwXSA8PCA4IHwgcF9rZXlbMTFdOwkJLyogQyAqLwotCWtleVszXSA9IHBfa2V5WzEyXSA8PCAyNCB8IHBfa2V5WzEzXSA8PCAxNiB8IHBfa2V5WzE0XSA8PCA4IHwgcF9rZXlbMTVdOwkvKiBEICovCi0Ja2V5WzRdID0gcF9rZXlbMTZdIDw8IDI0IHwgcF9rZXlbMTddIDw8IDE2IHwgcF9rZXlbMThdIDw8IDggfCBwX2tleVsxOV07CS8qIEUgKi8KLQlrZXlbNV0gPSBwX2tleVsyMF0gPDwgMjQgfCBwX2tleVsyMV0gPDwgMTYgfCBwX2tleVsyMl0gPDwgOCB8IHBfa2V5WzIzXTsJLyogRiAqLwotCWtleVs2XSA9IHBfa2V5WzI0XSA8PCAyNCB8IHBfa2V5WzI1XSA8PCAxNiB8IHBfa2V5WzI2XSA8PCA4IHwgcF9rZXlbMjddOwkvKiBHICovCi0Ja2V5WzddID0gcF9rZXlbMjhdIDw8IDI0IHwgcF9rZXlbMjldIDw8IDE2IHwgcF9rZXlbMzBdIDw8IDggfCBwX2tleVszMV07CS8qIEggKi8KKwlrZXlbMF0gPSBiZTMyX3RvX2NwdShwX2tleVswXSk7CQkvKiBBICovCisJa2V5WzFdID0gYmUzMl90b19jcHUocF9rZXlbMV0pOwkJLyogQiAqLworCWtleVsyXSA9IGJlMzJfdG9fY3B1KHBfa2V5WzJdKTsJCS8qIEMgKi8KKwlrZXlbM10gPSBiZTMyX3RvX2NwdShwX2tleVszXSk7CQkvKiBEICovCisJa2V5WzRdID0gYmUzMl90b19jcHUocF9rZXlbNF0pOwkJLyogRSAqLworCWtleVs1XSA9IGJlMzJfdG9fY3B1KHBfa2V5WzVdKTsJCS8qIEYgKi8KKwlrZXlbNl0gPSBiZTMyX3RvX2NwdShwX2tleVs2XSk7CQkvKiBHICovCisJa2V5WzddID0gYmUzMl90b19jcHUocF9rZXlbN10pOwkJLyogSCAqLwogCQogCiAKQEAgLTQ0NCwxNCArNDQ2LDE2IEBACiAKIHN0YXRpYyB2b2lkIGNhc3Q2X2VuY3J5cHQgKHZvaWQgKiBjdHgsIHU4ICogb3V0YnVmLCBjb25zdCB1OCAqIGluYnVmKSB7CiAJc3RydWN0IGNhc3Q2X2N0eCAqIGMgPSAoc3RydWN0IGNhc3Q2X2N0eCAqKWN0eDsKKwljb25zdCBfX2JlMzIgKnNyYyA9IChjb25zdCBfX2JlMzIgKilpbmJ1ZjsKKwlfX2JlMzIgKmRzdCA9IChfX2JlMzIgKilvdXRidWY7CiAJdTMyIGJsb2NrWzRdOwogCXUzMiAqIEttOyAKIAl1OCAqIEtyOwogCi0JYmxvY2tbMF0gPSBpbmJ1ZlswXSA8PCAyNCB8IGluYnVmWzFdIDw8IDE2IHwgaW5idWZbMl0gPDwgOCB8IGluYnVmWzNdOwotCWJsb2NrWzFdID0gaW5idWZbNF0gPDwgMjQgfCBpbmJ1Zls1XSA8PCAxNiB8IGluYnVmWzZdIDw8IDggfCBpbmJ1Zls3XTsKLQlibG9ja1syXSA9IGluYnVmWzhdIDw8IDI0IHwgaW5idWZbOV0gPDwgMTYgfCBpbmJ1ZlsxMF0gPDwgOCB8IGluYnVmWzExXTsKLQlibG9ja1szXSA9IGluYnVmWzEyXSA8PCAyNCB8IGluYnVmWzEzXSA8PCAxNiB8IGluYnVmWzE0XSA8PCA4IHwgaW5idWZbMTVdOworCWJsb2NrWzBdID0gYmUzMl90b19jcHUoc3JjWzBdKTsKKwlibG9ja1sxXSA9IGJlMzJfdG9fY3B1KHNyY1sxXSk7CisJYmxvY2tbMl0gPSBiZTMyX3RvX2NwdShzcmNbMl0pOworCWJsb2NrWzNdID0gYmUzMl90b19jcHUoc3JjWzNdKTsKIAogCUttID0gYy0+S21bMF07IEtyID0gYy0+S3JbMF07IFEgKGJsb2NrLCBLciwgS20pOwogCUttID0gYy0+S21bMV07IEtyID0gYy0+S3JbMV07IFEgKGJsb2NrLCBLciwgS20pOwpAQCAtNDY1LDM1ICs0NjksMjUgQEAKIAlLbSA9IGMtPkttWzldOyBLciA9IGMtPktyWzldOyBRQkFSIChibG9jaywgS3IsIEttKTsKIAlLbSA9IGMtPkttWzEwXTsgS3IgPSBjLT5LclsxMF07IFFCQVIgKGJsb2NrLCBLciwgS20pOwogCUttID0gYy0+S21bMTFdOyBLciA9IGMtPktyWzExXTsgUUJBUiAoYmxvY2ssIEtyLCBLbSk7Ci0JCi0Jb3V0YnVmWzBdID0gKGJsb2NrWzBdID4+IDI0KSAmIDB4ZmY7Ci0Jb3V0YnVmWzFdID0gKGJsb2NrWzBdID4+IDE2KSAmIDB4ZmY7Ci0Jb3V0YnVmWzJdID0gKGJsb2NrWzBdID4+IDgpICYgMHhmZjsKLQlvdXRidWZbM10gPSBibG9ja1swXSAmIDB4ZmY7Ci0Jb3V0YnVmWzRdID0gKGJsb2NrWzFdID4+IDI0KSAmIDB4ZmY7Ci0Jb3V0YnVmWzVdID0gKGJsb2NrWzFdID4+IDE2KSAmIDB4ZmY7Ci0Jb3V0YnVmWzZdID0gKGJsb2NrWzFdID4+IDgpICYgMHhmZjsKLQlvdXRidWZbN10gPSBibG9ja1sxXSAmIDB4ZmY7Ci0Jb3V0YnVmWzhdID0gKGJsb2NrWzJdID4+IDI0KSAmIDB4ZmY7Ci0Jb3V0YnVmWzldID0gKGJsb2NrWzJdID4+IDE2KSAmIDB4ZmY7Ci0Jb3V0YnVmWzEwXSA9IChibG9ja1syXSA+PiA4KSAmIDB4ZmY7Ci0Jb3V0YnVmWzExXSA9IGJsb2NrWzJdICYgMHhmZjsKLQlvdXRidWZbMTJdID0gKGJsb2NrWzNdID4+IDI0KSAmIDB4ZmY7Ci0Jb3V0YnVmWzEzXSA9IChibG9ja1szXSA+PiAxNikgJiAweGZmOwotCW91dGJ1ZlsxNF0gPSAoYmxvY2tbM10gPj4gOCkgJiAweGZmOwotCW91dGJ1ZlsxNV0gPSBibG9ja1szXSAmIDB4ZmY7CQorCisJZHN0WzBdID0gY3B1X3RvX2JlMzIoYmxvY2tbMF0pOworCWRzdFsxXSA9IGNwdV90b19iZTMyKGJsb2NrWzFdKTsKKwlkc3RbMl0gPSBjcHVfdG9fYmUzMihibG9ja1syXSk7CisJZHN0WzNdID0gY3B1X3RvX2JlMzIoYmxvY2tbM10pOwogfQkKIAogc3RhdGljIHZvaWQgY2FzdDZfZGVjcnlwdCAodm9pZCAqIGN0eCwgdTggKiBvdXRidWYsIGNvbnN0IHU4ICogaW5idWYpIHsKIAlzdHJ1Y3QgY2FzdDZfY3R4ICogYyA9IChzdHJ1Y3QgY2FzdDZfY3R4ICopY3R4OworCWNvbnN0IF9fYmUzMiAqc3JjID0gKGNvbnN0IF9fYmUzMiAqKWluYnVmOworCV9fYmUzMiAqZHN0ID0gKF9fYmUzMiAqKW91dGJ1ZjsKIAl1MzIgYmxvY2tbNF07CiAJdTMyICogS207IAogCXU4ICogS3I7CiAKLQlibG9ja1swXSA9IGluYnVmWzBdIDw8IDI0IHwgaW5idWZbMV0gPDwgMTYgfCBpbmJ1ZlsyXSA8PCA4IHwgaW5idWZbM107Ci0JYmxvY2tbMV0gPSBpbmJ1Zls0XSA8PCAyNCB8IGluYnVmWzVdIDw8IDE2IHwgaW5idWZbNl0gPDwgOCB8IGluYnVmWzddOwotCWJsb2NrWzJdID0gaW5idWZbOF0gPDwgMjQgfCBpbmJ1Zls5XSA8PCAxNiB8IGluYnVmWzEwXSA8PCA4IHwgaW5idWZbMTFdOwotCWJsb2NrWzNdID0gaW5idWZbMTJdIDw8IDI0IHwgaW5idWZbMTNdIDw8IDE2IHwgaW5idWZbMTRdIDw8IDggfCBpbmJ1ZlsxNV07CisJYmxvY2tbMF0gPSBiZTMyX3RvX2NwdShzcmNbMF0pOworCWJsb2NrWzFdID0gYmUzMl90b19jcHUoc3JjWzFdKTsKKwlibG9ja1syXSA9IGJlMzJfdG9fY3B1KHNyY1syXSk7CisJYmxvY2tbM10gPSBiZTMyX3RvX2NwdShzcmNbM10pOwogCiAJS20gPSBjLT5LbVsxMV07IEtyID0gYy0+S3JbMTFdOyBRIChibG9jaywgS3IsIEttKTsKIAlLbSA9IGMtPkttWzEwXTsgS3IgPSBjLT5LclsxMF07IFEgKGJsb2NrLCBLciwgS20pOwpAQCAtNTA4LDIyICs1MDIsMTAgQEAKIAlLbSA9IGMtPkttWzFdOyBLciA9IGMtPktyWzFdOyBRQkFSIChibG9jaywgS3IsIEttKTsKIAlLbSA9IGMtPkttWzBdOyBLciA9IGMtPktyWzBdOyBRQkFSIChibG9jaywgS3IsIEttKTsKIAkKLQlvdXRidWZbMF0gPSAoYmxvY2tbMF0gPj4gMjQpICYgMHhmZjsKLQlvdXRidWZbMV0gPSAoYmxvY2tbMF0gPj4gMTYpICYgMHhmZjsKLQlvdXRidWZbMl0gPSAoYmxvY2tbMF0gPj4gOCkgJiAweGZmOwotCW91dGJ1ZlszXSA9IGJsb2NrWzBdICYgMHhmZjsKLQlvdXRidWZbNF0gPSAoYmxvY2tbMV0gPj4gMjQpICYgMHhmZjsKLQlvdXRidWZbNV0gPSAoYmxvY2tbMV0gPj4gMTYpICYgMHhmZjsKLQlvdXRidWZbNl0gPSAoYmxvY2tbMV0gPj4gOCkgJiAweGZmOwotCW91dGJ1Zls3XSA9IGJsb2NrWzFdICYgMHhmZjsKLQlvdXRidWZbOF0gPSAoYmxvY2tbMl0gPj4gMjQpICYgMHhmZjsKLQlvdXRidWZbOV0gPSAoYmxvY2tbMl0gPj4gMTYpICYgMHhmZjsKLQlvdXRidWZbMTBdID0gKGJsb2NrWzJdID4+IDgpICYgMHhmZjsKLQlvdXRidWZbMTFdID0gYmxvY2tbMl0gJiAweGZmOwotCW91dGJ1ZlsxMl0gPSAoYmxvY2tbM10gPj4gMjQpICYgMHhmZjsKLQlvdXRidWZbMTNdID0gKGJsb2NrWzNdID4+IDE2KSAmIDB4ZmY7Ci0Jb3V0YnVmWzE0XSA9IChibG9ja1szXSA+PiA4KSAmIDB4ZmY7Ci0Jb3V0YnVmWzE1XSA9IGJsb2NrWzNdICYgMHhmZjsJCisJZHN0WzBdID0gY3B1X3RvX2JlMzIoYmxvY2tbMF0pOworCWRzdFsxXSA9IGNwdV90b19iZTMyKGJsb2NrWzFdKTsKKwlkc3RbMl0gPSBjcHVfdG9fYmUzMihibG9ja1syXSk7CisJZHN0WzNdID0gY3B1X3RvX2JlMzIoYmxvY2tbM10pOwogfQkKIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGFsZyA9IHsKQEAgLTUzMSw2ICs1MTMsNyBAQAogCS5jcmFfZmxhZ3MgPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAogCS5jcmFfYmxvY2tzaXplID0gQ0FTVDZfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUgPSBzaXplb2Yoc3RydWN0IGNhc3Q2X2N0eCksCisJLmNyYV9hbGlnbm1hc2sgPSAzLAogCS5jcmFfbW9kdWxlID0gVEhJU19NT0RVTEUsCiAJLmNyYV9saXN0ID0gTElTVF9IRUFEX0lOSVQoYWxnLmNyYV9saXN0KSwKIAkuY3JhX3UgPSB7CmRpZmYgLS1naXQgYS9jcnlwdG8vY2lwaGVyLmMgYi9jcnlwdG8vY2lwaGVyLmMKaW5kZXggZGZkNGJjZi4uNjViY2VhMCAxMDA2NDQKLS0tIGEvY3J5cHRvL2NpcGhlci5jCisrKyBiL2NyeXB0by9jaXBoZXIuYwpAQCAtMjEyLDkgKzIxMiwxMCBAQAogCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBkZXNjLT50Zm07CiAJdm9pZCAoKnhvcikodTggKiwgY29uc3QgdTggKikgPSB0Zm0tPmNydF91LmNpcGhlci5jaXRfeG9yX2Jsb2NrOwogCWludCBic2l6ZSA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pOworCXVuc2lnbmVkIGxvbmcgYWxpZ25tYXNrID0gY3J5cHRvX3RmbV9hbGdfYWxpZ25tYXNrKGRlc2MtPnRmbSk7CiAKLQl1OCBzdGFja1tzcmMgPT0gZHN0ID8gYnNpemUgOiAwXTsKLQl1OCAqYnVmID0gc3RhY2s7CisJdTggc3RhY2tbc3JjID09IGRzdCA/IGJzaXplICsgYWxpZ25tYXNrIDogMF07CisJdTggKmJ1ZiA9ICh1OCAqKUFMSUdOKCh1bnNpZ25lZCBsb25nKXN0YWNrLCBhbGlnbm1hc2sgKyAxKTsKIAl1OCAqKmRzdF9wID0gc3JjID09IGRzdCA/ICZidWYgOiAmZHN0OwogCiAJdm9pZCAoKmZuKSh2b2lkICosIHU4ICosIGNvbnN0IHU4ICopID0gZGVzYy0+Y3JmbjsKZGlmZiAtLWdpdCBhL2NyeXB0by9jcmMzMmMuYyBiL2NyeXB0by9jcmMzMmMuYwppbmRleCAyNTY5NTZjLi45NTMzNjI0IDEwMDY0NAotLS0gYS9jcnlwdG8vY3JjMzJjLmMKKysrIGIvY3J5cHRvL2NyYzMyYy5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzJjLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKICNkZWZpbmUgQ0hLU1VNX0JMT0NLX1NJWkUJMzIKZGlmZiAtLWdpdCBhL2NyeXB0by9kZXMuYyBiL2NyeXB0by9kZXMuYwppbmRleCBhM2M4NjNkLi43YmI1NDg2IDEwMDY0NAotLS0gYS9jcnlwdG8vZGVzLmMKKysrIGIvY3J5cHRvL2Rlcy5jCkBAIC0xMiwxMSArMTIsMTMgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAjZGVmaW5lIERFU19LRVlfU0laRQkJOAogI2RlZmluZSBERVNfRVhQS0VZX1dPUkRTCTMyCkBAIC05NDcsNiArOTQ5LDcgQEAKIAkuY3JhX2Jsb2Nrc2l6ZQkJPQlERVNfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBkZXNfY3R4KSwKIAkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKKwkuY3JhX2FsaWdubWFzawkJPQkzLAogCS5jcmFfbGlzdAkJPQlMSVNUX0hFQURfSU5JVChkZXNfYWxnLmNyYV9saXN0KSwKIAkuY3JhX3UJCQk9CXsgLmNpcGhlciA9IHsKIAkuY2lhX21pbl9rZXlzaXplCT0JREVTX0tFWV9TSVpFLApkaWZmIC0tZ2l0IGEvY3J5cHRvL2ludGVybmFsLmggYi9jcnlwdG8vaW50ZXJuYWwuaAppbmRleCAzN2FhNjUyLi45NTllNjAyIDEwMDY0NAotLS0gYS9jcnlwdG8vaW50ZXJuYWwuaAorKysgYi9jcnlwdG8vaW50ZXJuYWwuaApAQCAtMiw2ICsyLDcgQEAKICAqIENyeXB0b2dyYXBoaWMgQVBJLgogICoKICAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCkBAIC0xNiwxMCArMTcsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhc20va21hcF90eXBlcy5oPgogCitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBjcnlwdG9fYWxnX2xpc3Q7CitleHRlcm4gc3RydWN0IHJ3X3NlbWFwaG9yZSBjcnlwdG9fYWxnX3NlbTsKKwogZXh0ZXJuIGVudW0ga21fdHlwZSBjcnlwdG9fa21fdHlwZXNbXTsKIAogc3RhdGljIGlubGluZSBlbnVtIGttX3R5cGUgY3J5cHRvX2ttYXBfdHlwZShpbnQgb3V0KQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2toYXphZC5jIGIvY3J5cHRvL2toYXphZC5jCmluZGV4IDczOGNiMGQuLjgwN2YyYmYgMTAwNjQ0Ci0tLSBhL2NyeXB0by9raGF6YWQuYworKysgYi9jcnlwdG8va2hhemFkLmMKQEAgLTIyLDggKzIyLDEwIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNkZWZpbmUgS0hBWkFEX0tFWV9TSVpFCQkxNgogI2RlZmluZSBLSEFaQURfQkxPQ0tfU0laRQk4CkBAIC03NTUsOCArNzU3LDggQEAKIHN0YXRpYyBpbnQga2hhemFkX3NldGtleSh2b2lkICpjdHhfYXJnLCBjb25zdCB1OCAqaW5fa2V5LAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQga2V5X2xlbiwgdTMyICpmbGFncykKIHsKLQogCXN0cnVjdCBraGF6YWRfY3R4ICpjdHggPSBjdHhfYXJnOworCWNvbnN0IF9fYmU2NCAqa2V5ID0gKGNvbnN0IF9fYmU2NCAqKWluX2tleTsKIAlpbnQgcjsKIAljb25zdCB1NjQgKlMgPSBUNzsKIAl1NjQgSzIsIEsxOwpAQCAtNzY3LDIyICs3NjksOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlLMiA9ICgodTY0KWluX2tleVsgMF0gPDwgNTYpIF4KLQkgICAgICgodTY0KWluX2tleVsgMV0gPDwgNDgpIF4KLQkgICAgICgodTY0KWluX2tleVsgMl0gPDwgNDApIF4KLQkgICAgICgodTY0KWluX2tleVsgM10gPDwgMzIpIF4KLQkgICAgICgodTY0KWluX2tleVsgNF0gPDwgMjQpIF4KLQkgICAgICgodTY0KWluX2tleVsgNV0gPDwgMTYpIF4KLQkgICAgICgodTY0KWluX2tleVsgNl0gPDwgIDgpIF4KLQkgICAgICgodTY0KWluX2tleVsgN10gICAgICApOwotCUsxID0gKCh1NjQpaW5fa2V5WyA4XSA8PCA1NikgXgotCSAgICAgKCh1NjQpaW5fa2V5WyA5XSA8PCA0OCkgXgotCSAgICAgKCh1NjQpaW5fa2V5WzEwXSA8PCA0MCkgXgotCSAgICAgKCh1NjQpaW5fa2V5WzExXSA8PCAzMikgXgotCSAgICAgKCh1NjQpaW5fa2V5WzEyXSA8PCAyNCkgXgotCSAgICAgKCh1NjQpaW5fa2V5WzEzXSA8PCAxNikgXgotCSAgICAgKCh1NjQpaW5fa2V5WzE0XSA8PCAgOCkgXgotCSAgICAgKCh1NjQpaW5fa2V5WzE1XSAgICAgICk7CisJSzIgPSBiZTY0X3RvX2NwdShrZXlbMF0pOworCUsxID0gYmU2NF90b19jcHUoa2V5WzFdKTsKIAogCS8qIHNldHVwIHRoZSBlbmNyeXB0IGtleSAqLwogCWZvciAociA9IDA7IHIgPD0gS0hBWkFEX1JPVU5EUzsgcisrKSB7CkBAIC04MjAsMTkgKzgwOCwxMiBAQAogc3RhdGljIHZvaWQga2hhemFkX2NyeXB0KGNvbnN0IHU2NCByb3VuZEtleVtLSEFaQURfUk9VTkRTICsgMV0sCiAJCXU4ICpjaXBoZXJ0ZXh0LCBjb25zdCB1OCAqcGxhaW50ZXh0KQogewotCisJY29uc3QgX19iZTY0ICpzcmMgPSAoY29uc3QgX19iZTY0ICopcGxhaW50ZXh0OworCV9fYmU2NCAqZHN0ID0gKF9fYmU2NCAqKWNpcGhlcnRleHQ7CiAJaW50IHI7CiAJdTY0IHN0YXRlOwogCi0Jc3RhdGUgPSAoKHU2NClwbGFpbnRleHRbMF0gPDwgNTYpIF4KLQkJKCh1NjQpcGxhaW50ZXh0WzFdIDw8IDQ4KSBeCi0JCSgodTY0KXBsYWludGV4dFsyXSA8PCA0MCkgXgotCQkoKHU2NClwbGFpbnRleHRbM10gPDwgMzIpIF4KLQkJKCh1NjQpcGxhaW50ZXh0WzRdIDw8IDI0KSBeCi0JCSgodTY0KXBsYWludGV4dFs1XSA8PCAxNikgXgotCQkoKHU2NClwbGFpbnRleHRbNl0gPDwgIDgpIF4KLQkJKCh1NjQpcGxhaW50ZXh0WzddICAgICAgKSBeCi0JCXJvdW5kS2V5WzBdOworCXN0YXRlID0gYmU2NF90b19jcHUoKnNyYykgXiByb3VuZEtleVswXTsKIAogCWZvciAociA9IDE7IHIgPCBLSEFaQURfUk9VTkRTOyByKyspIHsKIAkJc3RhdGUgPSBUMFsoaW50KShzdGF0ZSA+PiA1NikgICAgICAgXSBeCkBAIC04NTYsMTUgKzgzNyw3IEBACiAJCShUN1soaW50KShzdGF0ZSAgICAgICkgJiAweGZmXSAmIDB4MDAwMDAwMDAwMDAwMDBmZlVMTCkgXgogCQlyb3VuZEtleVtLSEFaQURfUk9VTkRTXTsKIAotCWNpcGhlcnRleHRbMF0gPSAodTgpKHN0YXRlID4+IDU2KTsKLQljaXBoZXJ0ZXh0WzFdID0gKHU4KShzdGF0ZSA+PiA0OCk7Ci0JY2lwaGVydGV4dFsyXSA9ICh1OCkoc3RhdGUgPj4gNDApOwotCWNpcGhlcnRleHRbM10gPSAodTgpKHN0YXRlID4+IDMyKTsKLQljaXBoZXJ0ZXh0WzRdID0gKHU4KShzdGF0ZSA+PiAyNCk7Ci0JY2lwaGVydGV4dFs1XSA9ICh1OCkoc3RhdGUgPj4gMTYpOwotCWNpcGhlcnRleHRbNl0gPSAodTgpKHN0YXRlID4+ICA4KTsKLQljaXBoZXJ0ZXh0WzddID0gKHU4KShzdGF0ZSAgICAgICk7Ci0KKwkqZHN0ID0gY3B1X3RvX2JlNjQoc3RhdGUpOwogfQogCiBzdGF0aWMgdm9pZCBraGF6YWRfZW5jcnlwdCh2b2lkICpjdHhfYXJnLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQpAQCAtODg0LDYgKzg1Nyw3IEBACiAJLmNyYV9mbGFncwkJPQlDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAogCS5jcmFfYmxvY2tzaXplCQk9CUtIQVpBRF9CTE9DS19TSVpFLAogCS5jcmFfY3R4c2l6ZQkJPQlzaXplb2YgKHN0cnVjdCBraGF6YWRfY3R4KSwKKwkuY3JhX2FsaWdubWFzawkJPQk3LAogCS5jcmFfbW9kdWxlCQk9CVRISVNfTU9EVUxFLAogCS5jcmFfbGlzdAkJPQlMSVNUX0hFQURfSU5JVChraGF6YWRfYWxnLmNyYV9saXN0KSwKIAkuY3JhX3UJCQk9CXsgLmNpcGhlciA9IHsKZGlmZiAtLWdpdCBhL2NyeXB0by9tZDQuYyBiL2NyeXB0by9tZDQuYwppbmRleCBiZWY2YTllLi5hMmQ2ZGY1IDEwMDY0NAotLS0gYS9jcnlwdG8vbWQ0LmMKKysrIGIvY3J5cHRvL21kNC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKICNkZWZpbmUgTUQ0X0RJR0VTVF9TSVpFCQkxNgpkaWZmIC0tZ2l0IGEvY3J5cHRvL21kNS5jIGIvY3J5cHRvL21kNS5jCmluZGV4IDFlZDQ1ZjkuLjdmMDQxYWUgMTAwNjQ0Ci0tLSBhL2NyeXB0by9tZDUuYworKysgYi9jcnlwdG8vbWQ1LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAogI2RlZmluZSBNRDVfRElHRVNUX1NJWkUJCTE2CmRpZmYgLS1naXQgYS9jcnlwdG8vbWljaGFlbF9taWMuYyBiL2NyeXB0by9taWNoYWVsX21pYy5jCmluZGV4IGE0NzBiY2IuLjRmNmFiMjMgMTAwNjQ0Ci0tLSBhL2NyeXB0by9taWNoYWVsX21pYy5jCisrKyBiL2NyeXB0by9taWNoYWVsX21pYy5jCkBAIC0xMCwxMCArMTAsMTIgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIAogc3RydWN0IG1pY2hhZWxfbWljX2N0eCB7CkBAIC00MywyMSArNDUsNiBAQAogfSB3aGlsZSAoMCkKIAogCi1zdGF0aWMgaW5saW5lIHUzMiBnZXRfbGUzMihjb25zdCB1OCAqcCkKLXsKLQlyZXR1cm4gcFswXSB8IChwWzFdIDw8IDgpIHwgKHBbMl0gPDwgMTYpIHwgKHBbM10gPDwgMjQpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfbGUzMih1OCAqcCwgdTMyIHYpCi17Ci0JcFswXSA9IHY7Ci0JcFsxXSA9IHYgPj4gODsKLQlwWzJdID0gdiA+PiAxNjsKLQlwWzNdID0gdiA+PiAyNDsKLX0KLQotCiBzdGF0aWMgdm9pZCBtaWNoYWVsX2luaXQodm9pZCAqY3R4KQogewogCXN0cnVjdCBtaWNoYWVsX21pY19jdHggKm1jdHggPSBjdHg7CkBAIC02OCw2ICs1NSw3IEBACiBzdGF0aWMgdm9pZCBtaWNoYWVsX3VwZGF0ZSh2b2lkICpjdHgsIGNvbnN0IHU4ICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCXN0cnVjdCBtaWNoYWVsX21pY19jdHggKm1jdHggPSBjdHg7CisJY29uc3QgX19sZTMyICpzcmM7CiAKIAlpZiAobWN0eC0+cGVuZGluZ19sZW4pIHsKIAkJaW50IGZsZW4gPSA0IC0gbWN0eC0+cGVuZGluZ19sZW47CkBAIC04MSwyMSArNjksMjMgQEAKIAkJaWYgKG1jdHgtPnBlbmRpbmdfbGVuIDwgNCkKIAkJCXJldHVybjsKIAotCQltY3R4LT5sIF49IGdldF9sZTMyKG1jdHgtPnBlbmRpbmcpOworCQlzcmMgPSAoY29uc3QgX19sZTMyICopbWN0eC0+cGVuZGluZzsKKwkJbWN0eC0+bCBePSBsZTMyX3RvX2NwdXAoc3JjKTsKIAkJbWljaGFlbF9ibG9jayhtY3R4LT5sLCBtY3R4LT5yKTsKIAkJbWN0eC0+cGVuZGluZ19sZW4gPSAwOwogCX0KIAorCXNyYyA9IChjb25zdCBfX2xlMzIgKilkYXRhOworCiAJd2hpbGUgKGxlbiA+PSA0KSB7Ci0JCW1jdHgtPmwgXj0gZ2V0X2xlMzIoZGF0YSk7CisJCW1jdHgtPmwgXj0gbGUzMl90b19jcHVwKHNyYysrKTsKIAkJbWljaGFlbF9ibG9jayhtY3R4LT5sLCBtY3R4LT5yKTsKLQkJZGF0YSArPSA0OwogCQlsZW4gLT0gNDsKIAl9CiAKIAlpZiAobGVuID4gMCkgewogCQltY3R4LT5wZW5kaW5nX2xlbiA9IGxlbjsKLQkJbWVtY3B5KG1jdHgtPnBlbmRpbmcsIGRhdGEsIGxlbik7CisJCW1lbWNweShtY3R4LT5wZW5kaW5nLCBzcmMsIGxlbik7CiAJfQogfQogCkBAIC0xMDQsNiArOTQsNyBAQAogewogCXN0cnVjdCBtaWNoYWVsX21pY19jdHggKm1jdHggPSBjdHg7CiAJdTggKmRhdGEgPSBtY3R4LT5wZW5kaW5nOworCV9fbGUzMiAqZHN0ID0gKF9fbGUzMiAqKW91dDsKIAogCS8qIExhc3QgYmxvY2sgYW5kIHBhZGRpbmcgKDB4NWEsIDQuLjcgeCAwKSAqLwogCXN3aXRjaCAobWN0eC0+cGVuZGluZ19sZW4pIHsKQEAgLTEyNSw4ICsxMTYsOCBAQAogCS8qIGwgXj0gMDsgKi8KIAltaWNoYWVsX2Jsb2NrKG1jdHgtPmwsIG1jdHgtPnIpOwogCi0JcHV0X2xlMzIob3V0LCBtY3R4LT5sKTsKLQlwdXRfbGUzMihvdXQgKyA0LCBtY3R4LT5yKTsKKwlkc3RbMF0gPSBjcHVfdG9fbGUzMihtY3R4LT5sKTsKKwlkc3RbMV0gPSBjcHVfdG9fbGUzMihtY3R4LT5yKTsKIH0KIAogCkBAIC0xMzQsMTMgKzEyNSwxNiBAQAogCQkJICB1MzIgKmZsYWdzKQogewogCXN0cnVjdCBtaWNoYWVsX21pY19jdHggKm1jdHggPSBjdHg7CisJY29uc3QgX19sZTMyICpkYXRhID0gKGNvbnN0IF9fbGUzMiAqKWtleTsKKwogCWlmIChrZXlsZW4gIT0gOCkgewogCQlpZiAoZmxhZ3MpCiAJCQkqZmxhZ3MgPSBDUllQVE9fVEZNX1JFU19CQURfS0VZX0xFTjsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCW1jdHgtPmwgPSBnZXRfbGUzMihrZXkpOwotCW1jdHgtPnIgPSBnZXRfbGUzMihrZXkgKyA0KTsKKworCW1jdHgtPmwgPSBsZTMyX3RvX2NwdShkYXRhWzBdKTsKKwltY3R4LT5yID0gbGUzMl90b19jcHUoZGF0YVsxXSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2NyeXB0by9wcm9jLmMgYi9jcnlwdG8vcHJvYy5jCmluZGV4IDYzMGJhOTEuLmMwYTVkZDcgMTAwNjQ0Ci0tLSBhL2NyeXB0by9wcm9jLmMKKysrIGIvY3J5cHRvL3Byb2MuYwpAQCAtNCw2ICs0LDcgQEAKICAqIFByb2NmcyBpbmZvcm1hdGlvbi4KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQpAQCAtMTgsOSArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgY3J5cHRvX2FsZ19saXN0OwotZXh0ZXJuIHN0cnVjdCByd19zZW1hcGhvcmUgY3J5cHRvX2FsZ19zZW07Ci0KIHN0YXRpYyB2b2lkICpjX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqdjsKQEAgLTUzLDcgKzUxLDkgQEAKIAlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnID0gKHN0cnVjdCBjcnlwdG9fYWxnICopcDsKIAkKIAlzZXFfcHJpbnRmKG0sICJuYW1lICAgICAgICAgOiAlc1xuIiwgYWxnLT5jcmFfbmFtZSk7CisJc2VxX3ByaW50ZihtLCAiZHJpdmVyICAgICAgIDogJXNcbiIsIGFsZy0+Y3JhX2RyaXZlcl9uYW1lKTsKIAlzZXFfcHJpbnRmKG0sICJtb2R1bGUgICAgICAgOiAlc1xuIiwgbW9kdWxlX25hbWUoYWxnLT5jcmFfbW9kdWxlKSk7CisJc2VxX3ByaW50ZihtLCAicHJpb3JpdHkgICAgIDogJWRcbiIsIGFsZy0+Y3JhX3ByaW9yaXR5KTsKIAkKIAlzd2l0Y2ggKGFsZy0+Y3JhX2ZsYWdzICYgQ1JZUFRPX0FMR19UWVBFX01BU0spIHsKIAljYXNlIENSWVBUT19BTEdfVFlQRV9DSVBIRVI6CmRpZmYgLS1naXQgYS9jcnlwdG8vc2VycGVudC5jIGIvY3J5cHRvL3NlcnBlbnQuYwppbmRleCAzY2YyYzUwLi41MmFkMWE0IDEwMDY0NAotLS0gYS9jcnlwdG8vc2VycGVudC5jCisrKyBiL2NyeXB0by9zZXJwZW50LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAvKiBLZXkgaXMgcGFkZGVkIHRvIHRoZSBtYXhpbXVtIG9mIDI1NiBiaXRzIGJlZm9yZSByb3VuZCBrZXkgZ2VuZXJhdGlvbi4KICAqIEFueSBrZXkgbGVuZ3RoIDw9IDI1NiBiaXRzICgzMiBieXRlcykgaXMgYWxsb3dlZCBieSB0aGUgYWxnb3JpdGhtLgpAQCAtNTUyLDYgKzU1Myw3IEBACiAJLmNyYV9mbGFncwkJPQlDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAogCS5jcmFfYmxvY2tzaXplCQk9CVNFUlBFTlRfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBzZXJwZW50X2N0eCksCisJLmNyYV9hbGlnbm1hc2sJCT0JMywKIAkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKIAkuY3JhX2xpc3QJCT0JTElTVF9IRUFEX0lOSVQoc2VycGVudF9hbGcuY3JhX2xpc3QpLAogCS5jcmFfdQkJCT0JeyAuY2lwaGVyID0gewpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NoYTEuYyBiL2NyeXB0by9zaGExLmMKaW5kZXggNDAxNmYzYi4uMjE1NzFlZDMgMTAwNjQ0Ci0tLSBhL2NyeXB0by9zaGExLmMKKysrIGIvY3J5cHRvL3NoYTEuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCkBAIC00OCwyMyArNDksMzMgQEAKIHN0YXRpYyB2b2lkIHNoYTFfdXBkYXRlKHZvaWQgKmN0eCwgY29uc3QgdTggKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJc3RydWN0IHNoYTFfY3R4ICpzY3R4ID0gY3R4OwotCXVuc2lnbmVkIGludCBpLCBqOwotCXUzMiB0ZW1wW1NIQV9XT1JLU1BBQ0VfV09SRFNdOworCXVuc2lnbmVkIGludCBwYXJ0aWFsLCBkb25lOworCWNvbnN0IHU4ICpzcmM7CiAKLQlqID0gKHNjdHgtPmNvdW50ID4+IDMpICYgMHgzZjsKLQlzY3R4LT5jb3VudCArPSBsZW4gPDwgMzsKKwlwYXJ0aWFsID0gc2N0eC0+Y291bnQgJiAweDNmOworCXNjdHgtPmNvdW50ICs9IGxlbjsKKwlkb25lID0gMDsKKwlzcmMgPSBkYXRhOwogCi0JaWYgKChqICsgbGVuKSA+IDYzKSB7Ci0JCW1lbWNweSgmc2N0eC0+YnVmZmVyW2pdLCBkYXRhLCAoaSA9IDY0LWopKTsKLQkJc2hhX3RyYW5zZm9ybShzY3R4LT5zdGF0ZSwgc2N0eC0+YnVmZmVyLCB0ZW1wKTsKLQkJZm9yICggOyBpICsgNjMgPCBsZW47IGkgKz0gNjQpIHsKLQkJCXNoYV90cmFuc2Zvcm0oc2N0eC0+c3RhdGUsICZkYXRhW2ldLCB0ZW1wKTsKKwlpZiAoKHBhcnRpYWwgKyBsZW4pID4gNjMpIHsKKwkJdTMyIHRlbXBbU0hBX1dPUktTUEFDRV9XT1JEU107CisKKwkJaWYgKHBhcnRpYWwpIHsKKwkJCWRvbmUgPSAtcGFydGlhbDsKKwkJCW1lbWNweShzY3R4LT5idWZmZXIgKyBwYXJ0aWFsLCBkYXRhLCBkb25lICsgNjQpOworCQkJc3JjID0gc2N0eC0+YnVmZmVyOwogCQl9Ci0JCWogPSAwOworCisJCWRvIHsKKwkJCXNoYV90cmFuc2Zvcm0oc2N0eC0+c3RhdGUsIHNyYywgdGVtcCk7CisJCQlkb25lICs9IDY0OworCQkJc3JjID0gZGF0YSArIGRvbmU7CisJCX0gd2hpbGUgKGRvbmUgKyA2MyA8IGxlbik7CisKKwkJbWVtc2V0KHRlbXAsIDAsIHNpemVvZih0ZW1wKSk7CisJCXBhcnRpYWwgPSAwOwogCX0KLQllbHNlIGkgPSAwOwotCW1lbXNldCh0ZW1wLCAwLCBzaXplb2YodGVtcCkpOwotCW1lbWNweSgmc2N0eC0+YnVmZmVyW2pdLCAmZGF0YVtpXSwgbGVuIC0gaSk7CisJbWVtY3B5KHNjdHgtPmJ1ZmZlciArIHBhcnRpYWwsIHNyYywgbGVuIC0gZG9uZSk7CiB9CiAKIApAQCAtNzIsMzcgKzgzLDI0IEBACiBzdGF0aWMgdm9pZCBzaGExX2ZpbmFsKHZvaWQqIGN0eCwgdTggKm91dCkKIHsKIAlzdHJ1Y3Qgc2hhMV9jdHggKnNjdHggPSBjdHg7Ci0JdTMyIGksIGosIGluZGV4LCBwYWRsZW47Ci0JdTY0IHQ7Ci0JdTggYml0c1s4XSA9IHsgMCwgfTsKKwlfX2JlMzIgKmRzdCA9IChfX2JlMzIgKilvdXQ7CisJdTMyIGksIGluZGV4LCBwYWRsZW47CisJX19iZTY0IGJpdHM7CiAJc3RhdGljIGNvbnN0IHU4IHBhZGRpbmdbNjRdID0geyAweDgwLCB9OwogCi0JdCA9IHNjdHgtPmNvdW50OwotCWJpdHNbN10gPSAweGZmICYgdDsgdD4+PTg7Ci0JYml0c1s2XSA9IDB4ZmYgJiB0OyB0Pj49ODsKLQliaXRzWzVdID0gMHhmZiAmIHQ7IHQ+Pj04OwotCWJpdHNbNF0gPSAweGZmICYgdDsgdD4+PTg7Ci0JYml0c1szXSA9IDB4ZmYgJiB0OyB0Pj49ODsKLQliaXRzWzJdID0gMHhmZiAmIHQ7IHQ+Pj04OwotCWJpdHNbMV0gPSAweGZmICYgdDsgdD4+PTg7Ci0JYml0c1swXSA9IDB4ZmYgJiB0OworCWJpdHMgPSBjcHVfdG9fYmU2NChzY3R4LT5jb3VudCA8PCAzKTsKIAogCS8qIFBhZCBvdXQgdG8gNTYgbW9kIDY0ICovCi0JaW5kZXggPSAoc2N0eC0+Y291bnQgPj4gMykgJiAweDNmOworCWluZGV4ID0gc2N0eC0+Y291bnQgJiAweDNmOwogCXBhZGxlbiA9IChpbmRleCA8IDU2KSA/ICg1NiAtIGluZGV4KSA6ICgoNjQrNTYpIC0gaW5kZXgpOwogCXNoYTFfdXBkYXRlKHNjdHgsIHBhZGRpbmcsIHBhZGxlbik7CiAKIAkvKiBBcHBlbmQgbGVuZ3RoICovCi0Jc2hhMV91cGRhdGUoc2N0eCwgYml0cywgc2l6ZW9mIGJpdHMpOyAKKwlzaGExX3VwZGF0ZShzY3R4LCAoY29uc3QgdTggKikmYml0cywgc2l6ZW9mKGJpdHMpKTsKIAogCS8qIFN0b3JlIHN0YXRlIGluIGRpZ2VzdCAqLwotCWZvciAoaSA9IGogPSAwOyBpIDwgNTsgaSsrLCBqICs9IDQpIHsKLQkJdTMyIHQyID0gc2N0eC0+c3RhdGVbaV07Ci0JCW91dFtqKzNdID0gdDIgJiAweGZmOyB0Mj4+PTg7Ci0JCW91dFtqKzJdID0gdDIgJiAweGZmOyB0Mj4+PTg7Ci0JCW91dFtqKzFdID0gdDIgJiAweGZmOyB0Mj4+PTg7Ci0JCW91dFtqICBdID0gdDIgJiAweGZmOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlkc3RbaV0gPSBjcHVfdG9fYmUzMihzY3R4LT5zdGF0ZVtpXSk7CiAKIAkvKiBXaXBlIGNvbnRleHQgKi8KIAltZW1zZXQoc2N0eCwgMCwgc2l6ZW9mICpzY3R4KTsKZGlmZiAtLWdpdCBhL2NyeXB0by9zaGEyNTYuYyBiL2NyeXB0by9zaGEyNTYuYwppbmRleCBjNzhkYTUwLi45ZDVlZjY3IDEwMDY0NAotLS0gYS9jcnlwdG8vc2hhMjU2LmMKKysrIGIvY3J5cHRvL3NoYTI1Ni5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIApAQCAtMjc5LDIyICsyODAsMTUgQEAKIHN0YXRpYyB2b2lkIHNoYTI1Nl9maW5hbCh2b2lkKiBjdHgsIHU4ICpvdXQpCiB7CiAJc3RydWN0IHNoYTI1Nl9jdHggKnNjdHggPSBjdHg7Ci0JdTggYml0c1s4XTsKLQl1bnNpZ25lZCBpbnQgaW5kZXgsIHBhZF9sZW4sIHQ7Ci0JaW50IGksIGo7CisJX19iZTMyICpkc3QgPSAoX19iZTMyICopb3V0OworCV9fYmUzMiBiaXRzWzJdOworCXVuc2lnbmVkIGludCBpbmRleCwgcGFkX2xlbjsKKwlpbnQgaTsKIAlzdGF0aWMgY29uc3QgdTggcGFkZGluZ1s2NF0gPSB7IDB4ODAsIH07CiAKIAkvKiBTYXZlIG51bWJlciBvZiBiaXRzICovCi0JdCA9IHNjdHgtPmNvdW50WzBdOwotCWJpdHNbN10gPSB0OyB0ID4+PSA4OwotCWJpdHNbNl0gPSB0OyB0ID4+PSA4OwotCWJpdHNbNV0gPSB0OyB0ID4+PSA4OwotCWJpdHNbNF0gPSB0OwotCXQgPSBzY3R4LT5jb3VudFsxXTsKLQliaXRzWzNdID0gdDsgdCA+Pj0gODsKLQliaXRzWzJdID0gdDsgdCA+Pj0gODsKLQliaXRzWzFdID0gdDsgdCA+Pj0gODsKLQliaXRzWzBdID0gdDsKKwliaXRzWzFdID0gY3B1X3RvX2JlMzIoc2N0eC0+Y291bnRbMF0pOworCWJpdHNbMF0gPSBjcHVfdG9fYmUzMihzY3R4LT5jb3VudFsxXSk7CiAKIAkvKiBQYWQgb3V0IHRvIDU2IG1vZCA2NC4gKi8KIAlpbmRleCA9IChzY3R4LT5jb3VudFswXSA+PiAzKSAmIDB4M2Y7CkBAIC0zMDIsMTYgKzI5NiwxMSBAQAogCXNoYTI1Nl91cGRhdGUoc2N0eCwgcGFkZGluZywgcGFkX2xlbik7CiAKIAkvKiBBcHBlbmQgbGVuZ3RoIChiZWZvcmUgcGFkZGluZykgKi8KLQlzaGEyNTZfdXBkYXRlKHNjdHgsIGJpdHMsIDgpOworCXNoYTI1Nl91cGRhdGUoc2N0eCwgKGNvbnN0IHU4ICopYml0cywgc2l6ZW9mKGJpdHMpKTsKIAogCS8qIFN0b3JlIHN0YXRlIGluIGRpZ2VzdCAqLwotCWZvciAoaSA9IGogPSAwOyBpIDwgODsgaSsrLCBqICs9IDQpIHsKLQkJdCA9IHNjdHgtPnN0YXRlW2ldOwotCQlvdXRbaiszXSA9IHQ7IHQgPj49IDg7Ci0JCW91dFtqKzJdID0gdDsgdCA+Pj0gODsKLQkJb3V0W2orMV0gPSB0OyB0ID4+PSA4OwotCQlvdXRbaiAgXSA9IHQ7Ci0JfQorCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWRzdFtpXSA9IGNwdV90b19iZTMyKHNjdHgtPnN0YXRlW2ldKTsKIAogCS8qIFplcm9pemUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiAqLwogCW1lbXNldChzY3R4LCAwLCBzaXplb2YoKnNjdHgpKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9zaGE1MTIuYyBiL2NyeXB0by9zaGE1MTIuYwppbmRleCBjNjYzNDM4Li4zZTZlOTM5IDEwMDY0NAotLS0gYS9jcnlwdG8vc2hhNTEyLmMKKysrIGIvY3J5cHRvL3NoYTUxMi5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KQEAgLTIzNSwzOSArMjM2LDE3IEBACiBzaGE1MTJfZmluYWwodm9pZCAqY3R4LCB1OCAqaGFzaCkKIHsKICAgICAgICAgc3RydWN0IHNoYTUxMl9jdHggKnNjdHggPSBjdHg7Ci0JCiAgICAgICAgIHN0YXRpYyB1OCBwYWRkaW5nWzEyOF0gPSB7IDB4ODAsIH07Ci0KLSAgICAgICAgdTMyIHQ7Ci0JdTY0IHQyOwotICAgICAgICB1OCBiaXRzWzEyOF07CisJX19iZTY0ICpkc3QgPSAoX19iZTY0ICopaGFzaDsKKwlfX2JlMzIgYml0c1s0XTsKIAl1bnNpZ25lZCBpbnQgaW5kZXgsIHBhZF9sZW47Ci0JaW50IGksIGo7Ci0KLSAgICAgICAgaW5kZXggPSBwYWRfbGVuID0gdCA9IGkgPSBqID0gMDsKLSAgICAgICAgdDIgPSAwOworCWludCBpOwogCiAJLyogU2F2ZSBudW1iZXIgb2YgYml0cyAqLwotCXQgPSBzY3R4LT5jb3VudFswXTsKLQliaXRzWzE1XSA9IHQ7IHQ+Pj04OwotCWJpdHNbMTRdID0gdDsgdD4+PTg7Ci0JYml0c1sxM10gPSB0OyB0Pj49ODsKLQliaXRzWzEyXSA9IHQ7IAotCXQgPSBzY3R4LT5jb3VudFsxXTsKLQliaXRzWzExXSA9IHQ7IHQ+Pj04OwotCWJpdHNbMTBdID0gdDsgdD4+PTg7Ci0JYml0c1s5IF0gPSB0OyB0Pj49ODsKLQliaXRzWzggXSA9IHQ7IAotCXQgPSBzY3R4LT5jb3VudFsyXTsKLQliaXRzWzcgXSA9IHQ7IHQ+Pj04OwotCWJpdHNbNiBdID0gdDsgdD4+PTg7Ci0JYml0c1s1IF0gPSB0OyB0Pj49ODsKLQliaXRzWzQgXSA9IHQ7IAotCXQgPSBzY3R4LT5jb3VudFszXTsKLQliaXRzWzMgXSA9IHQ7IHQ+Pj04OwotCWJpdHNbMiBdID0gdDsgdD4+PTg7Ci0JYml0c1sxIF0gPSB0OyB0Pj49ODsKLQliaXRzWzAgXSA9IHQ7IAorCWJpdHNbM10gPSBjcHVfdG9fYmUzMihzY3R4LT5jb3VudFswXSk7CisJYml0c1syXSA9IGNwdV90b19iZTMyKHNjdHgtPmNvdW50WzFdKTsKKwliaXRzWzFdID0gY3B1X3RvX2JlMzIoc2N0eC0+Y291bnRbMl0pOworCWJpdHNbMF0gPSBjcHVfdG9fYmUzMihzY3R4LT5jb3VudFszXSk7CiAKIAkvKiBQYWQgb3V0IHRvIDExMiBtb2QgMTI4LiAqLwogCWluZGV4ID0gKHNjdHgtPmNvdW50WzBdID4+IDMpICYgMHg3ZjsKQEAgLTI3NSwyMSArMjU0LDEyIEBACiAJc2hhNTEyX3VwZGF0ZShzY3R4LCBwYWRkaW5nLCBwYWRfbGVuKTsKIAogCS8qIEFwcGVuZCBsZW5ndGggKGJlZm9yZSBwYWRkaW5nKSAqLwotCXNoYTUxMl91cGRhdGUoc2N0eCwgYml0cywgMTYpOworCXNoYTUxMl91cGRhdGUoc2N0eCwgKGNvbnN0IHU4ICopYml0cywgc2l6ZW9mKGJpdHMpKTsKIAogCS8qIFN0b3JlIHN0YXRlIGluIGRpZ2VzdCAqLwotCWZvciAoaSA9IGogPSAwOyBpIDwgODsgaSsrLCBqICs9IDgpIHsKLQkJdDIgPSBzY3R4LT5zdGF0ZVtpXTsKLQkJaGFzaFtqKzddID0gKGNoYXIpdDIgJiAweGZmOyB0Mj4+PTg7Ci0JCWhhc2hbais2XSA9IChjaGFyKXQyICYgMHhmZjsgdDI+Pj04OwotCQloYXNoW2orNV0gPSAoY2hhcil0MiAmIDB4ZmY7IHQyPj49ODsKLQkJaGFzaFtqKzRdID0gKGNoYXIpdDIgJiAweGZmOyB0Mj4+PTg7Ci0JCWhhc2hbaiszXSA9IChjaGFyKXQyICYgMHhmZjsgdDI+Pj04OwotCQloYXNoW2orMl0gPSAoY2hhcil0MiAmIDB4ZmY7IHQyPj49ODsKLQkJaGFzaFtqKzFdID0gKGNoYXIpdDIgJiAweGZmOyB0Mj4+PTg7Ci0JCWhhc2hbaiAgXSA9IChjaGFyKXQyICYgMHhmZjsKLQl9Ci0JCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJZHN0W2ldID0gY3B1X3RvX2JlNjQoc2N0eC0+c3RhdGVbaV0pOworCiAJLyogWmVyb2l6ZSBzZW5zaXRpdmUgaW5mb3JtYXRpb24uICovCiAJbWVtc2V0KHNjdHgsIDAsIHNpemVvZihzdHJ1Y3Qgc2hhNTEyX2N0eCkpOwogfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3RlYS5jIGIvY3J5cHRvL3RlYS5jCmluZGV4IDU5MjRlZmQuLmE2YTAyYjMgMTAwNjQ0Ci0tLSBhL2NyeXB0by90ZWEuYworKysgYi9jcnlwdG8vdGVhLmMKQEAgLTIyLDggKzIyLDEwIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNkZWZpbmUgVEVBX0tFWV9TSVpFCQkxNgogI2RlZmluZSBURUFfQkxPQ0tfU0laRQkJOApAQCAtMzUsOSArMzcsNiBAQAogI2RlZmluZSBYVEVBX1JPVU5EUwkJMzIKICNkZWZpbmUgWFRFQV9ERUxUQQkJMHg5ZTM3NzliOQogCi0jZGVmaW5lIHUzMl9pbih4KSBsZTMyX3RvX2NwdSgqKGNvbnN0IF9fbGUzMiAqKSh4KSkKLSNkZWZpbmUgdTMyX291dCh0bywgZnJvbSkgKCooX19sZTMyICopKHRvKSA9IGNwdV90b19sZTMyKGZyb20pKQotCiBzdHJ1Y3QgdGVhX2N0eCB7CiAJdTMyIEtFWVs0XTsKIH07CkBAIC00OSw4ICs0OCw4IEBACiBzdGF0aWMgaW50IHRlYV9zZXRrZXkodm9pZCAqY3R4X2FyZywgY29uc3QgdTggKmluX2tleSwKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleV9sZW4sIHUzMiAqZmxhZ3MpCiB7IAotCiAJc3RydWN0IHRlYV9jdHggKmN0eCA9IGN0eF9hcmc7CisJY29uc3QgX19sZTMyICprZXkgPSAoY29uc3QgX19sZTMyICopaW5fa2V5OwogCQogCWlmIChrZXlfbGVuICE9IDE2KQogCXsKQEAgLTU4LDEwICs1NywxMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQljdHgtPktFWVswXSA9IHUzMl9pbiAoaW5fa2V5KTsKLQljdHgtPktFWVsxXSA9IHUzMl9pbiAoaW5fa2V5ICsgNCk7Ci0JY3R4LT5LRVlbMl0gPSB1MzJfaW4gKGluX2tleSArIDgpOwotCWN0eC0+S0VZWzNdID0gdTMyX2luIChpbl9rZXkgKyAxMik7CisJY3R4LT5LRVlbMF0gPSBsZTMyX3RvX2NwdShrZXlbMF0pOworCWN0eC0+S0VZWzFdID0gbGUzMl90b19jcHUoa2V5WzFdKTsKKwljdHgtPktFWVsyXSA9IGxlMzJfdG9fY3B1KGtleVsyXSk7CisJY3R4LT5LRVlbM10gPSBsZTMyX3RvX2NwdShrZXlbM10pOwogCiAJcmV0dXJuIDA7IAogCkBAIC03Myw5ICs3MiwxMSBAQAogCXUzMiBrMCwgazEsIGsyLCBrMzsKIAogCXN0cnVjdCB0ZWFfY3R4ICpjdHggPSBjdHhfYXJnOworCWNvbnN0IF9fbGUzMiAqaW4gPSAoY29uc3QgX19sZTMyICopc3JjOworCV9fbGUzMiAqb3V0ID0gKF9fbGUzMiAqKWRzdDsKIAotCXkgPSB1MzJfaW4gKHNyYyk7Ci0JeiA9IHUzMl9pbiAoc3JjICsgNCk7CisJeSA9IGxlMzJfdG9fY3B1KGluWzBdKTsKKwl6ID0gbGUzMl90b19jcHUoaW5bMV0pOwogCiAJazAgPSBjdHgtPktFWVswXTsKIAlrMSA9IGN0eC0+S0VZWzFdOwpAQCAtOTAsMTkgKzkxLDIwIEBACiAJCXogKz0gKCh5IDw8IDQpICsgazIpIF4gKHkgKyBzdW0pIF4gKCh5ID4+IDUpICsgazMpOwogCX0KIAkKLQl1MzJfb3V0IChkc3QsIHkpOwotCXUzMl9vdXQgKGRzdCArIDQsIHopOworCW91dFswXSA9IGNwdV90b19sZTMyKHkpOworCW91dFsxXSA9IGNwdV90b19sZTMyKHopOwogfQogCiBzdGF0aWMgdm9pZCB0ZWFfZGVjcnlwdCh2b2lkICpjdHhfYXJnLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQogeyAKIAl1MzIgeSwgeiwgbiwgc3VtOwogCXUzMiBrMCwgazEsIGsyLCBrMzsKLQogCXN0cnVjdCB0ZWFfY3R4ICpjdHggPSBjdHhfYXJnOworCWNvbnN0IF9fbGUzMiAqaW4gPSAoY29uc3QgX19sZTMyICopc3JjOworCV9fbGUzMiAqb3V0ID0gKF9fbGUzMiAqKWRzdDsKIAotCXkgPSB1MzJfaW4gKHNyYyk7Ci0JeiA9IHUzMl9pbiAoc3JjICsgNCk7CisJeSA9IGxlMzJfdG9fY3B1KGluWzBdKTsKKwl6ID0gbGUzMl90b19jcHUoaW5bMV0pOwogCiAJazAgPSBjdHgtPktFWVswXTsKIAlrMSA9IGN0eC0+S0VZWzFdOwpAQCAtMTE5LDE2ICsxMjEsMTUgQEAKIAkJc3VtIC09IFRFQV9ERUxUQTsKIAl9CiAJCi0JdTMyX291dCAoZHN0LCB5KTsKLQl1MzJfb3V0IChkc3QgKyA0LCB6KTsKLQorCW91dFswXSA9IGNwdV90b19sZTMyKHkpOworCW91dFsxXSA9IGNwdV90b19sZTMyKHopOwogfQogCiBzdGF0aWMgaW50IHh0ZWFfc2V0a2V5KHZvaWQgKmN0eF9hcmcsIGNvbnN0IHU4ICppbl9rZXksCiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXlfbGVuLCB1MzIgKmZsYWdzKQogeyAKLQogCXN0cnVjdCB4dGVhX2N0eCAqY3R4ID0gY3R4X2FyZzsKKwljb25zdCBfX2xlMzIgKmtleSA9IChjb25zdCBfX2xlMzIgKilpbl9rZXk7CiAJCiAJaWYgKGtleV9sZW4gIT0gMTYpCiAJewpAQCAtMTM2LDEwICsxMzcsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JY3R4LT5LRVlbMF0gPSB1MzJfaW4gKGluX2tleSk7Ci0JY3R4LT5LRVlbMV0gPSB1MzJfaW4gKGluX2tleSArIDQpOwotCWN0eC0+S0VZWzJdID0gdTMyX2luIChpbl9rZXkgKyA4KTsKLQljdHgtPktFWVszXSA9IHUzMl9pbiAoaW5fa2V5ICsgMTIpOworCWN0eC0+S0VZWzBdID0gbGUzMl90b19jcHUoa2V5WzBdKTsKKwljdHgtPktFWVsxXSA9IGxlMzJfdG9fY3B1KGtleVsxXSk7CisJY3R4LT5LRVlbMl0gPSBsZTMyX3RvX2NwdShrZXlbMl0pOworCWN0eC0+S0VZWzNdID0gbGUzMl90b19jcHUoa2V5WzNdKTsKIAogCXJldHVybiAwOyAKIApAQCAtMTQ3LDE0ICsxNDgsMTUgQEAKIAogc3RhdGljIHZvaWQgeHRlYV9lbmNyeXB0KHZvaWQgKmN0eF9hcmcsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCiB7IAotCiAJdTMyIHksIHosIHN1bSA9IDA7CiAJdTMyIGxpbWl0ID0gWFRFQV9ERUxUQSAqIFhURUFfUk9VTkRTOwogCiAJc3RydWN0IHh0ZWFfY3R4ICpjdHggPSBjdHhfYXJnOworCWNvbnN0IF9fbGUzMiAqaW4gPSAoY29uc3QgX19sZTMyICopc3JjOworCV9fbGUzMiAqb3V0ID0gKF9fbGUzMiAqKWRzdDsKIAotCXkgPSB1MzJfaW4gKHNyYyk7Ci0JeiA9IHUzMl9pbiAoc3JjICsgNCk7CisJeSA9IGxlMzJfdG9fY3B1KGluWzBdKTsKKwl6ID0gbGUzMl90b19jcHUoaW5bMV0pOwogCiAJd2hpbGUgKHN1bSAhPSBsaW1pdCkgewogCQl5ICs9ICgoeiA8PCA0IF4geiA+PiA1KSArIHopIF4gKHN1bSArIGN0eC0+S0VZW3N1bSYzXSk7IApAQCAtMTYyLDE5ICsxNjQsMTkgQEAKIAkJeiArPSAoKHkgPDwgNCBeIHkgPj4gNSkgKyB5KSBeIChzdW0gKyBjdHgtPktFWVtzdW0+PjExICYzXSk7IAogCX0KIAkKLQl1MzJfb3V0IChkc3QsIHkpOwotCXUzMl9vdXQgKGRzdCArIDQsIHopOwotCisJb3V0WzBdID0gY3B1X3RvX2xlMzIoeSk7CisJb3V0WzFdID0gY3B1X3RvX2xlMzIoeik7CiB9CiAKIHN0YXRpYyB2b2lkIHh0ZWFfZGVjcnlwdCh2b2lkICpjdHhfYXJnLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQogeyAKLQogCXUzMiB5LCB6LCBzdW07CiAJc3RydWN0IHRlYV9jdHggKmN0eCA9IGN0eF9hcmc7CisJY29uc3QgX19sZTMyICppbiA9IChjb25zdCBfX2xlMzIgKilzcmM7CisJX19sZTMyICpvdXQgPSAoX19sZTMyICopZHN0OwogCi0JeSA9IHUzMl9pbiAoc3JjKTsKLQl6ID0gdTMyX2luIChzcmMgKyA0KTsKKwl5ID0gbGUzMl90b19jcHUoaW5bMF0pOworCXogPSBsZTMyX3RvX2NwdShpblsxXSk7CiAKIAlzdW0gPSBYVEVBX0RFTFRBICogWFRFQV9ST1VORFM7CiAKQEAgLTE4NCwyMiArMTg2LDIyIEBACiAJCXkgLT0gKCh6IDw8IDQgXiB6ID4+IDUpICsgeikgXiAoc3VtICsgY3R4LT5LRVlbc3VtICYgM10pOwogCX0KIAkKLQl1MzJfb3V0IChkc3QsIHkpOwotCXUzMl9vdXQgKGRzdCArIDQsIHopOwotCisJb3V0WzBdID0gY3B1X3RvX2xlMzIoeSk7CisJb3V0WzFdID0gY3B1X3RvX2xlMzIoeik7CiB9CiAKIAogc3RhdGljIHZvaWQgeGV0YV9lbmNyeXB0KHZvaWQgKmN0eF9hcmcsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCiB7IAotCiAJdTMyIHksIHosIHN1bSA9IDA7CiAJdTMyIGxpbWl0ID0gWFRFQV9ERUxUQSAqIFhURUFfUk9VTkRTOwogCiAJc3RydWN0IHh0ZWFfY3R4ICpjdHggPSBjdHhfYXJnOworCWNvbnN0IF9fbGUzMiAqaW4gPSAoY29uc3QgX19sZTMyICopc3JjOworCV9fbGUzMiAqb3V0ID0gKF9fbGUzMiAqKWRzdDsKIAotCXkgPSB1MzJfaW4gKHNyYyk7Ci0JeiA9IHUzMl9pbiAoc3JjICsgNCk7CisJeSA9IGxlMzJfdG9fY3B1KGluWzBdKTsKKwl6ID0gbGUzMl90b19jcHUoaW5bMV0pOwogCiAJd2hpbGUgKHN1bSAhPSBsaW1pdCkgewogCQl5ICs9ICh6IDw8IDQgXiB6ID4+IDUpICsgKHogXiBzdW0pICsgY3R4LT5LRVlbc3VtJjNdOwpAQCAtMjA3LDE5ICsyMDksMTkgQEAKIAkJeiArPSAoeSA8PCA0IF4geSA+PiA1KSArICh5IF4gc3VtKSArIGN0eC0+S0VZW3N1bT4+MTEgJjNdOwogCX0KIAkKLQl1MzJfb3V0IChkc3QsIHkpOwotCXUzMl9vdXQgKGRzdCArIDQsIHopOwotCisJb3V0WzBdID0gY3B1X3RvX2xlMzIoeSk7CisJb3V0WzFdID0gY3B1X3RvX2xlMzIoeik7CiB9CiAKIHN0YXRpYyB2b2lkIHhldGFfZGVjcnlwdCh2b2lkICpjdHhfYXJnLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQogeyAKLQogCXUzMiB5LCB6LCBzdW07CiAJc3RydWN0IHRlYV9jdHggKmN0eCA9IGN0eF9hcmc7CisJY29uc3QgX19sZTMyICppbiA9IChjb25zdCBfX2xlMzIgKilzcmM7CisJX19sZTMyICpvdXQgPSAoX19sZTMyICopZHN0OwogCi0JeSA9IHUzMl9pbiAoc3JjKTsKLQl6ID0gdTMyX2luIChzcmMgKyA0KTsKKwl5ID0gbGUzMl90b19jcHUoaW5bMF0pOworCXogPSBsZTMyX3RvX2NwdShpblsxXSk7CiAKIAlzdW0gPSBYVEVBX0RFTFRBICogWFRFQV9ST1VORFM7CiAKQEAgLTIyOSw5ICsyMzEsOCBAQAogCQl5IC09ICh6IDw8IDQgXiB6ID4+IDUpICsgKHogXiBzdW0pICsgY3R4LT5LRVlbc3VtICYgM107CiAJfQogCQotCXUzMl9vdXQgKGRzdCwgeSk7Ci0JdTMyX291dCAoZHN0ICsgNCwgeik7Ci0KKwlvdXRbMF0gPSBjcHVfdG9fbGUzMih5KTsKKwlvdXRbMV0gPSBjcHVfdG9fbGUzMih6KTsKIH0KIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIHRlYV9hbGcgPSB7CkBAIC0yMzksNiArMjQwLDcgQEAKIAkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIsCiAJLmNyYV9ibG9ja3NpemUJCT0JVEVBX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9CXNpemVvZiAoc3RydWN0IHRlYV9jdHgpLAorCS5jcmFfYWxpZ25tYXNrCQk9CTMsCiAJLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCiAJLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKHRlYV9hbGcuY3JhX2xpc3QpLAogCS5jcmFfdQkJCT0JeyAuY2lwaGVyID0gewpAQCAtMjU0LDYgKzI1Niw3IEBACiAJLmNyYV9mbGFncwkJPQlDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAogCS5jcmFfYmxvY2tzaXplCQk9CVhURUFfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mIChzdHJ1Y3QgeHRlYV9jdHgpLAorCS5jcmFfYWxpZ25tYXNrCQk9CTMsCiAJLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCiAJLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKHh0ZWFfYWxnLmNyYV9saXN0KSwKIAkuY3JhX3UJCQk9CXsgLmNpcGhlciA9IHsKQEAgLTI2OSw2ICsyNzIsNyBAQAogCS5jcmFfZmxhZ3MJCT0JQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKIAkuY3JhX2Jsb2Nrc2l6ZQkJPQlYVEVBX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9CXNpemVvZiAoc3RydWN0IHh0ZWFfY3R4KSwKKwkuY3JhX2FsaWdubWFzawkJPQkzLAogCS5jcmFfbW9kdWxlCQk9CVRISVNfTU9EVUxFLAogCS5jcmFfbGlzdAkJPQlMSVNUX0hFQURfSU5JVCh4dGVhX2FsZy5jcmFfbGlzdCksCiAJLmNyYV91CQkJPQl7IC5jaXBoZXIgPSB7CmRpZmYgLS1naXQgYS9jcnlwdG8vdGdyMTkyLmMgYi9jcnlwdG8vdGdyMTkyLmMKaW5kZXggZjBhNDVjZi4uMmQ4ZTQ0ZiAxMDA2NDQKLS0tIGEvY3J5cHRvL3RncjE5Mi5jCisrKyBiL2NyeXB0by90Z3IxOTIuYwpAQCAtMjQsOCArMjQsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2RlZmluZSBUR1IxOTJfRElHRVNUX1NJWkUgMjQKICNkZWZpbmUgVEdSMTYwX0RJR0VTVF9TSVpFIDIwCkBAIC00NjcsMTggKzQ2OSwxMCBAQAogCXU2NCBhLCBiLCBjLCBhYSwgYmIsIGNjOwogCXU2NCB4WzhdOwogCWludCBpOwotCWNvbnN0IHU4ICpwdHIgPSBkYXRhOworCWNvbnN0IF9fbGU2NCAqcHRyID0gKGNvbnN0IF9fbGU2NCAqKWRhdGE7CiAKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCBwdHIgKz0gOCkgewotCQl4W2ldID0gKCgodTY0KXB0cls3XSApIDw8IDU2KSBeCi0JCSgoKHU2NClwdHJbNl0gJiAweGZmTCkgPDwgNDgpIF4KLQkJKCgodTY0KXB0cls1XSAmIDB4ZmZMKSA8PCA0MCkgXgotCQkoKCh1NjQpcHRyWzRdICYgMHhmZkwpIDw8IDMyKSBeCi0JCSgoKHU2NClwdHJbM10gJiAweGZmTCkgPDwgMjQpIF4KLQkJKCgodTY0KXB0clsyXSAmIDB4ZmZMKSA8PCAxNikgXgotCQkoKCh1NjQpcHRyWzFdICYgMHhmZkwpIDw8ICA4KSBeCi0JCSgoKHU2NClwdHJbMF0gJiAweGZmTCkgICAgICApOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQl4W2ldID0gbGU2NF90b19jcHUocHRyW2ldKTsKIAogCS8qIHNhdmUgKi8KIAlhID0gYWEgPSB0Y3R4LT5hOwpAQCAtNTU4LDkgKzU1MiwxMCBAQAogc3RhdGljIHZvaWQgdGdyMTkyX2ZpbmFsKHZvaWQgKmN0eCwgdTggKiBvdXQpCiB7CiAJc3RydWN0IHRncjE5Ml9jdHggKnRjdHggPSBjdHg7CisJX19iZTY0ICpkc3QgPSAoX19iZTY0ICopb3V0OworCV9fYmU2NCAqYmU2NHA7CisJX19sZTMyICpsZTMycDsKIAl1MzIgdCwgbXNiLCBsc2I7Ci0JdTggKnA7Ci0JaW50IGksIGo7CiAKIAl0Z3IxOTJfdXBkYXRlKHRjdHgsIE5VTEwsIDApOyAvKiBmbHVzaCAqLyA7CiAKQEAgLTU5NCw0MSArNTg5LDE2IEBACiAJCW1lbXNldCh0Y3R4LT5oYXNoLCAwLCA1Nik7ICAgIC8qIGZpbGwgbmV4dCBibG9jayB3aXRoIHplcm9lcyAqLwogCX0KIAkvKiBhcHBlbmQgdGhlIDY0IGJpdCBjb3VudCAqLwotCXRjdHgtPmhhc2hbNTZdID0gbHNiOwotCXRjdHgtPmhhc2hbNTddID0gbHNiID4+IDg7Ci0JdGN0eC0+aGFzaFs1OF0gPSBsc2IgPj4gMTY7Ci0JdGN0eC0+aGFzaFs1OV0gPSBsc2IgPj4gMjQ7Ci0JdGN0eC0+aGFzaFs2MF0gPSBtc2I7Ci0JdGN0eC0+aGFzaFs2MV0gPSBtc2IgPj4gODsKLQl0Y3R4LT5oYXNoWzYyXSA9IG1zYiA+PiAxNjsKLQl0Y3R4LT5oYXNoWzYzXSA9IG1zYiA+PiAyNDsKKwlsZTMycCA9IChfX2xlMzIgKikmdGN0eC0+aGFzaFs1Nl07CisJbGUzMnBbMF0gPSBjcHVfdG9fbGUzMihsc2IpOworCWxlMzJwWzFdID0gY3B1X3RvX2xlMzIobXNiKTsKKwogCXRncjE5Ml90cmFuc2Zvcm0odGN0eCwgdGN0eC0+aGFzaCk7CiAKLQlwID0gdGN0eC0+aGFzaDsKLQkqcCsrID0gdGN0eC0+YSA+PiA1NjsgKnArKyA9IHRjdHgtPmEgPj4gNDg7ICpwKysgPSB0Y3R4LT5hID4+IDQwOwotCSpwKysgPSB0Y3R4LT5hID4+IDMyOyAqcCsrID0gdGN0eC0+YSA+PiAyNDsgKnArKyA9IHRjdHgtPmEgPj4gMTY7Ci0JKnArKyA9IHRjdHgtPmEgPj4gIDg7ICpwKysgPSB0Y3R4LT5hO1wKLQkqcCsrID0gdGN0eC0+YiA+PiA1NjsgKnArKyA9IHRjdHgtPmIgPj4gNDg7ICpwKysgPSB0Y3R4LT5iID4+IDQwOwotCSpwKysgPSB0Y3R4LT5iID4+IDMyOyAqcCsrID0gdGN0eC0+YiA+PiAyNDsgKnArKyA9IHRjdHgtPmIgPj4gMTY7Ci0JKnArKyA9IHRjdHgtPmIgPj4gIDg7ICpwKysgPSB0Y3R4LT5iOwotCSpwKysgPSB0Y3R4LT5jID4+IDU2OyAqcCsrID0gdGN0eC0+YyA+PiA0ODsgKnArKyA9IHRjdHgtPmMgPj4gNDA7Ci0JKnArKyA9IHRjdHgtPmMgPj4gMzI7ICpwKysgPSB0Y3R4LT5jID4+IDI0OyAqcCsrID0gdGN0eC0+YyA+PiAxNjsKLQkqcCsrID0gdGN0eC0+YyA+PiAgODsgKnArKyA9IHRjdHgtPmM7Ci0KLQotCS8qIHVucGFjayB0aGUgaGFzaCAqLwotCWogPSA3OwotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJb3V0W2otLV0gPSAodGN0eC0+YSA+PiA4ICogaSkgJiAweGZmOwotCX0KLQlqID0gMTU7Ci0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQlvdXRbai0tXSA9ICh0Y3R4LT5iID4+IDggKiBpKSAmIDB4ZmY7Ci0JfQotCWogPSAyMzsKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCW91dFtqLS1dID0gKHRjdHgtPmMgPj4gOCAqIGkpICYgMHhmZjsKLQl9CisJYmU2NHAgPSAoX19iZTY0ICopdGN0eC0+aGFzaDsKKwlkc3RbMF0gPSBiZTY0cFswXSA9IGNwdV90b19iZTY0KHRjdHgtPmEpOworCWRzdFsxXSA9IGJlNjRwWzFdID0gY3B1X3RvX2JlNjQodGN0eC0+Yik7CisJZHN0WzJdID0gYmU2NHBbMl0gPSBjcHVfdG9fYmU2NCh0Y3R4LT5jKTsKIH0KIAogc3RhdGljIHZvaWQgdGdyMTYwX2ZpbmFsKHZvaWQgKmN0eCwgdTggKiBvdXQpCmRpZmYgLS1naXQgYS9jcnlwdG8vdHdvZmlzaC5jIGIvY3J5cHRvL3R3b2Zpc2guYwppbmRleCA0ZWZmZjhjLi5hMjZkODg1IDEwMDY0NAotLS0gYS9jcnlwdG8vdHdvZmlzaC5jCisrKyBiL2NyeXB0by90d29maXNoLmMKQEAgLTM3LDYgKzM3LDggQEAKICAqIEFic3RyYWN0IEFsZ2VicmFfIGJ5IEpvc2VwaCBBLiBHYWxsaWFuLCBlc3BlY2lhbGx5IGNoYXB0ZXIgMjIgaW4gdGhlCiAgKiBUaGlyZCBFZGl0aW9uLgogICovCisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC02MjEsMTMgKzYyMywxMSBAQAogICogd2hpdGVuaW5nIHN1YmtleSBudW1iZXIgbS4gKi8KIAogI2RlZmluZSBJTlBBQ0sobiwgeCwgbSkgXAotICAgeCA9IGluWzQgKiAobildIF4gKGluWzQgKiAobikgKyAxXSA8PCA4KSBcCi0gICAgIF4gKGluWzQgKiAobikgKyAyXSA8PCAxNikgXiAoaW5bNCAqIChuKSArIDNdIDw8IDI0KSBeIGN0eC0+d1ttXQorICAgeCA9IGxlMzJfdG9fY3B1KHNyY1tuXSkgXiBjdHgtPndbbV0KIAogI2RlZmluZSBPVVRVTlBBQ0sobiwgeCwgbSkgXAogICAgeCBePSBjdHgtPndbbV07IFwKLSAgIG91dFs0ICogKG4pXSA9IHg7IG91dFs0ICogKG4pICsgMV0gPSB4ID4+IDg7IFwKLSAgIG91dFs0ICogKG4pICsgMl0gPSB4ID4+IDE2OyBvdXRbNCAqIChuKSArIDNdID0geCA+PiAyNAorICAgZHN0W25dID0gY3B1X3RvX2xlMzIoeCkKIAogI2RlZmluZSBURl9NSU5fS0VZX1NJWkUgMTYKICNkZWZpbmUgVEZfTUFYX0tFWV9TSVpFIDMyCkBAIC04MDQsNiArODA0LDggQEAKIHN0YXRpYyB2b2lkIHR3b2Zpc2hfZW5jcnlwdCh2b2lkICpjeCwgdTggKm91dCwgY29uc3QgdTggKmluKQogewogCXN0cnVjdCB0d29maXNoX2N0eCAqY3R4ID0gY3g7CisJY29uc3QgX19sZTMyICpzcmMgPSAoY29uc3QgX19sZTMyICopaW47CisJX19sZTMyICpkc3QgPSAoX19sZTMyICopb3V0OwogCiAJLyogVGhlIGZvdXIgMzItYml0IGNodW5rcyBvZiB0aGUgdGV4dC4gKi8KIAl1MzIgYSwgYiwgYywgZDsKQEAgLTgzOSw2ICs4NDEsOCBAQAogc3RhdGljIHZvaWQgdHdvZmlzaF9kZWNyeXB0KHZvaWQgKmN4LCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCiB7CiAJc3RydWN0IHR3b2Zpc2hfY3R4ICpjdHggPSBjeDsKKwljb25zdCBfX2xlMzIgKnNyYyA9IChjb25zdCBfX2xlMzIgKilpbjsKKwlfX2xlMzIgKmRzdCA9IChfX2xlMzIgKilvdXQ7CiAgIAogCS8qIFRoZSBmb3VyIDMyLWJpdCBjaHVua3Mgb2YgdGhlIHRleHQuICovCiAJdTMyIGEsIGIsIGMsIGQ7CkBAIC04NzUsNiArODc5LDcgQEAKIAkuY3JhX2ZsYWdzICAgICAgICAgID0gICBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAogCS5jcmFfYmxvY2tzaXplICAgICAgPSAgIFRGX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplICAgICAgICA9ICAgc2l6ZW9mKHN0cnVjdCB0d29maXNoX2N0eCksCisJLmNyYV9hbGlnbm1hc2sgICAgICA9CTMsCiAJLmNyYV9tb2R1bGUgICAgICAgICA9ICAgVEhJU19NT0RVTEUsCiAJLmNyYV9saXN0ICAgICAgICAgICA9ICAgTElTVF9IRUFEX0lOSVQoYWxnLmNyYV9saXN0KSwKIAkuY3JhX3UgICAgICAgICAgICAgID0gICB7IC5jaXBoZXIgPSB7CmRpZmYgLS1naXQgYS9jcnlwdG8vd3A1MTIuYyBiL2NyeXB0by93cDUxMi5jCmluZGV4IGZkNmUyMGUuLmIyMjZhMTIgMTAwNjQ0Ci0tLSBhL2NyeXB0by93cDUxMi5jCisrKyBiL2NyeXB0by93cDUxMi5jCkBAIC0yMiw4ICsyMiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAjZGVmaW5lIFdQNTEyX0RJR0VTVF9TSVpFIDY0CiAjZGVmaW5lIFdQMzg0X0RJR0VTVF9TSVpFIDQ4CkBAIC03NzgsMTkgKzc4MCwxMCBAQAogCXU2NCBibG9ja1s4XTsgICAgLyogbXUoYnVmZmVyKSAqLwogCXU2NCBzdGF0ZVs4XTsgICAgLyogdGhlIGNpcGhlciBzdGF0ZSAqLwogCXU2NCBMWzhdOwotCXU4ICpidWZmZXIgPSB3Y3R4LT5idWZmZXI7CisJY29uc3QgX19iZTY0ICpidWZmZXIgPSAoY29uc3QgX19iZTY0ICopd2N0eC0+YnVmZmVyOwogCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKywgYnVmZmVyICs9IDgpIHsKLQkJYmxvY2tbaV0gPQotCQkoKCh1NjQpYnVmZmVyWzBdICAgICAgICApIDw8IDU2KSBeCi0JCSgoKHU2NClidWZmZXJbMV0gJiAweGZmTCkgPDwgNDgpIF4KLQkJKCgodTY0KWJ1ZmZlclsyXSAmIDB4ZmZMKSA8PCA0MCkgXgotCQkoKCh1NjQpYnVmZmVyWzNdICYgMHhmZkwpIDw8IDMyKSBeCi0JCSgoKHU2NClidWZmZXJbNF0gJiAweGZmTCkgPDwgMjQpIF4KLQkJKCgodTY0KWJ1ZmZlcls1XSAmIDB4ZmZMKSA8PCAxNikgXgotCQkoKCh1NjQpYnVmZmVyWzZdICYgMHhmZkwpIDw8ICA4KSBeCi0JCSgoKHU2NClidWZmZXJbN10gJiAweGZmTCkgICAgICApOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlibG9ja1tpXSA9IGJlNjRfdG9fY3B1KGJ1ZmZlcltpXSk7CiAKIAlzdGF0ZVswXSA9IGJsb2NrWzBdIF4gKEtbMF0gPSB3Y3R4LT5oYXNoWzBdKTsKIAlzdGF0ZVsxXSA9IGJsb2NrWzFdIF4gKEtbMV0gPSB3Y3R4LT5oYXNoWzFdKTsKQEAgLTEwNjksNyArMTA2Miw3IEBACiAgICAJdTggKmJpdExlbmd0aCAgID0gd2N0eC0+Yml0TGVuZ3RoOwogICAgCWludCBidWZmZXJCaXRzICA9IHdjdHgtPmJ1ZmZlckJpdHM7CiAgICAJaW50IGJ1ZmZlclBvcyAgID0gd2N0eC0+YnVmZmVyUG9zOwotICAgCXU4ICpkaWdlc3QgICAgICA9IG91dDsKKwlfX2JlNjQgKmRpZ2VzdCAgPSAoX19iZTY0ICopb3V0OwogCiAgICAJYnVmZmVyW2J1ZmZlclBvc10gfD0gMHg4MFUgPj4gKGJ1ZmZlckJpdHMgJiA3KTsKICAgIAlidWZmZXJQb3MrKzsKQEAgLTEwODgsMTcgKzEwODEsOCBAQAogICAgCW1lbWNweSgmYnVmZmVyW1dQNTEyX0JMT0NLX1NJWkUgLSBXUDUxMl9MRU5HVEhCWVRFU10sCiAJCSAgIGJpdExlbmd0aCwgV1A1MTJfTEVOR1RIQllURVMpOwogICAgCXdwNTEyX3Byb2Nlc3NfYnVmZmVyKHdjdHgpOwotICAgCWZvciAoaSA9IDA7IGkgPCBXUDUxMl9ESUdFU1RfU0laRS84OyBpKyspIHsKLQkJZGlnZXN0WzBdID0gKHU4KSh3Y3R4LT5oYXNoW2ldID4+IDU2KTsKLQkJZGlnZXN0WzFdID0gKHU4KSh3Y3R4LT5oYXNoW2ldID4+IDQ4KTsKLQkJZGlnZXN0WzJdID0gKHU4KSh3Y3R4LT5oYXNoW2ldID4+IDQwKTsKLQkJZGlnZXN0WzNdID0gKHU4KSh3Y3R4LT5oYXNoW2ldID4+IDMyKTsKLQkJZGlnZXN0WzRdID0gKHU4KSh3Y3R4LT5oYXNoW2ldID4+IDI0KTsKLQkJZGlnZXN0WzVdID0gKHU4KSh3Y3R4LT5oYXNoW2ldID4+IDE2KTsKLQkJZGlnZXN0WzZdID0gKHU4KSh3Y3R4LT5oYXNoW2ldID4+ICA4KTsKLQkJZGlnZXN0WzddID0gKHU4KSh3Y3R4LT5oYXNoW2ldICAgICAgKTsKLQkJZGlnZXN0ICs9IDg7Ci0gICAJfQorCWZvciAoaSA9IDA7IGkgPCBXUDUxMl9ESUdFU1RfU0laRS84OyBpKyspCisJCWRpZ2VzdFtpXSA9IGNwdV90b19iZTY0KHdjdHgtPmhhc2hbaV0pOwogICAgCXdjdHgtPmJ1ZmZlckJpdHMgICA9IGJ1ZmZlckJpdHM7CiAgICAJd2N0eC0+YnVmZmVyUG9zICAgID0gYnVmZmVyUG9zOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9LY29uZmlnIGIvZHJpdmVycy9LY29uZmlnCmluZGV4IDQ4ZjQ0NmQuLmJkZGY0MzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvS2NvbmZpZworKysgYi9kcml2ZXJzL0tjb25maWcKQEAgLTQ0LDYgKzQ0LDggQEAKIAogc291cmNlICJkcml2ZXJzL2kyYy9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc3BpL0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy93MS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvaHdtb24vS2NvbmZpZyIKQEAgLTY2LDQgKzY4LDYgQEAKIAogc291cmNlICJkcml2ZXJzL3NuL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9lZGFjL0tjb25maWciCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvTWFrZWZpbGUgYi9kcml2ZXJzL01ha2VmaWxlCmluZGV4IGVhNDEwYjYuLjYxOWRkOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9NYWtlZmlsZQpAQCAtMTMsNiArMTMsNyBAQAogIyBQblAgbXVzdCBjb21lIGFmdGVyIEFDUEkgc2luY2UgaXQgd2lsbCBldmVudHVhbGx5IG5lZWQgdG8gY2hlY2sgaWYgYWNwaQogIyB3YXMgdXNlZCBhbmQgZG8gbm90aGluZyBpZiBzbwogb2JqLSQoQ09ORklHX1BOUCkJCSs9IHBucC8KK29iai0kKENPTkZJR19BUk1fQU1CQSkJCSs9IGFtYmEvCiAKICMgY2hhci8gY29tZXMgYmVmb3JlIHNlcmlhbC8gZXRjIHNvIHRoYXQgdGhlIFZUIGNvbnNvbGUgaXMgdGhlIGJvb3QtdGltZQogIyBkZWZhdWx0LgpAQCAtNDAsNiArNDEsNyBAQAogb2JqLSQoQ09ORklHX0lFRUUxMzk0KQkJKz0gaWVlZTEzOTQvCiBvYmoteQkJCQkrPSBjZHJvbS8KIG9iai0kKENPTkZJR19NVEQpCQkrPSBtdGQvCitvYmotJChDT05GSUdfU1BJKQkJKz0gc3BpLwogb2JqLSQoQ09ORklHX1BDQ0FSRCkJCSs9IHBjbWNpYS8KIG9iai0kKENPTkZJR19ESU8pCQkrPSBkaW8vCiBvYmotJChDT05GSUdfU0JVUykJCSs9IHNidXMvCkBAIC02MSw2ICs2Myw3IEBACiBvYmotJChDT05GSUdfTUQpCQkrPSBtZC8KIG9iai0kKENPTkZJR19CVCkJCSs9IGJsdWV0b290aC8KIG9iai0kKENPTkZJR19JU0ROKQkJKz0gaXNkbi8KK29iai0kKENPTkZJR19FREFDKQkJKz0gZWRhYy8KIG9iai0kKENPTkZJR19NQ0EpCQkrPSBtY2EvCiBvYmotJChDT05GSUdfRUlTQSkJCSs9IGVpc2EvCiBvYmotJChDT05GSUdfQ1BVX0ZSRVEpCQkrPSBjcHVmcmVxLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY29ybi9ibG9jay9tZm1oZC5jIGIvZHJpdmVycy9hY29ybi9ibG9jay9tZm1oZC5jCmluZGV4IDRiNjVmNzQuLmNlMDc0ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNvcm4vYmxvY2svbWZtaGQuYworKysgYi9kcml2ZXJzL2Fjb3JuL2Jsb2NrL21mbWhkLmMKQEAgLTEyOSwxOSArMTI5LDYgQEAKICNkZWZpbmUgTUFKT1JfTlIJTUZNX0FDT1JOX01BSk9SCiAjZGVmaW5lIFFVRVVFIChtZm1fcXVldWUpCiAjZGVmaW5lIENVUlJFTlQgZWx2X25leHRfcmVxdWVzdChtZm1fcXVldWUpCi0vKgotICogVGhpcyBzb3J0IG9mIHN0dWZmIHNob3VsZCBiZSBpbiBhIGhlYWRlciBmaWxlIHNoYXJlZCB3aXRoIGlkZS5jLCBoZC5jLCB4ZC5jIGV0YwotICovCi0jaWZuZGVmIEhESU9fR0VUR0VPCi0jZGVmaW5lIEhESU9fR0VUR0VPIDB4MzAxCi1zdHJ1Y3QgaGRfZ2VvbWV0cnkgewotCXVuc2lnbmVkIGNoYXIgaGVhZHM7Ci0JdW5zaWduZWQgY2hhciBzZWN0b3JzOwotCXVuc2lnbmVkIHNob3J0IGN5bGluZGVyczsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0OwotfTsKLSNlbmRpZgotCiAKIC8qCiAgKiBDb25maWd1cmF0aW9uIHNlY3Rpb24KQEAgLTExNTMsMjIgKzExNDAsMTMgQEAKICAqIFRoZSAnZnJvbnQnIGVuZCBvZiB0aGUgbWZtIGRyaXZlciBmb2xsb3dzLi4uCiAgKi8KIAotc3RhdGljIGludCBtZm1faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVfaW50IGNtZCwgdV9sb25nIGFyZykKK3N0YXRpYyBpbnQgbWZtX2dldGdlbyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbykKIHsKLQlzdHJ1Y3QgbWZtX2luZm8gKnAgPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8gPSAoc3RydWN0IGhkX2dlb21ldHJ5ICopIGFyZzsKLQlpZiAoY21kICE9IEhESU9fR0VUR0VPKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoIWFyZykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHB1dF91c2VyIChwLT5oZWFkcywgJmdlby0+aGVhZHMpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAocHV0X3VzZXIgKHAtPnNlY3RvcnMsICZnZW8tPnNlY3RvcnMpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAocHV0X3VzZXIgKHAtPmN5bGluZGVycywgJmdlby0+Y3lsaW5kZXJzKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKHB1dF91c2VyIChnZXRfc3RhcnRfc2VjdChpbm9kZS0+aV9iZGV2KSwgJmdlby0+c3RhcnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKKwlzdHJ1Y3QgbWZtX2luZm8gKnAgPSBiZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisKKwlnZW8tPmhlYWRzID0gcC0+aGVhZHM7CisJZ2VvLT5zZWN0b3JzID0gcC0+c2VjdG9yczsKKwlnZW8tPmN5bGluZGVycyA9IHAtPmN5bGluZGVyczsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTIxOSw3ICsxMTk3LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgbWZtX2ZvcHMgPQogewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkuaW9jdGwJCT0gbWZtX2lvY3RsLAorCS5nZXRnZW8JCT0gbWZtX2dldGdlbywKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Fjb3JuL2NoYXIvaTJjLmMgYi9kcml2ZXJzL2Fjb3JuL2NoYXIvaTJjLmMKaW5kZXggYzIyYmI5ZC4uYzI2YzA4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY29ybi9jaGFyL2kyYy5jCisrKyBiL2RyaXZlcnMvYWNvcm4vY2hhci9pMmMuYwpAQCAtMTIsNiArMTIsNyBAQAogICogIE9uIEFjb3JuIG1hY2hpbmVzLCB0aGUgZm9sbG93aW5nIGkyYyBkZXZpY2VzIGFyZSBvbiB0aGUgYnVzOgogICoJLSBQQ0Y4NTgzIHJlYWwgdGltZSBjbG9jayAmIHN0YXRpYyBSQU0KICAqLworI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvS2NvbmZpZyBiL2RyaXZlcnMvYWNwaS9LY29uZmlnCmluZGV4IGZjZTIxYzIuLjBjY2UyOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYWNwaS9LY29uZmlnCkBAIC0xNjgsNyArMTY4LDYgQEAKIGNvbmZpZyBBQ1BJX0FTVVMKICAgICAgICAgdHJpc3RhdGUgIkFTVVMvTWVkaW9uIExhcHRvcCBFeHRyYXMiCiAJZGVwZW5kcyBvbiBYODYKLQlkZWZhdWx0IHkKICAgICAgICAgLS0taGVscC0tLQogICAgICAgICAgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGV4dHJhIGZlYXR1cmVzIG9mIEFDUEktY29tcGF0aWJsZQogICAgICAgICAgIEFTVVMgbGFwdG9wcy4gQXMgc29tZSBvZiBNZWRpb24gbGFwdG9wcyBhcmUgbWFkZSBieSBBU1VTLCBpdCBtYXkgYWxzbwpAQCAtMjA5LDcgKzIwOCw2IEBACiBjb25maWcgQUNQSV9UT1NISUJBCiAJdHJpc3RhdGUgIlRvc2hpYmEgTGFwdG9wIEV4dHJhcyIKIAlkZXBlbmRzIG9uIFg4NgotCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgYWNjZXNzIHRvIGNlcnRhaW4gc3lzdGVtIHNldHRpbmdzCiAJICBvbiAibGVnYWN5IGZyZWUiIFRvc2hpYmEgbGFwdG9wcy4gIFRoZXNlIGxhcHRvcHMgY2FuIGJlIHJlY29nbml6ZWQgYnkKQEAgLTI2OSw3ICsyNjcsNiBAQAogCiBjb25maWcgQUNQSV9FQwogCWJvb2wKLQlkZXBlbmRzIG9uIFg4NgogCWRlZmF1bHQgeQogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIGlzIHJlcXVpcmVkIG9uIHNvbWUgc3lzdGVtcyBmb3IgdGhlIHByb3BlciBvcGVyYXRpb24gb2YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpX21lbWhvdHBsdWcuYyBiL2RyaXZlcnMvYWNwaS9hY3BpX21lbWhvdHBsdWcuYwppbmRleCAyMTQzNjA5Li5kODgyYmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaV9tZW1ob3RwbHVnLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGlfbWVtaG90cGx1Zy5jCkBAIC03MSw4ICs3MSw4IEBACiBzdHJ1Y3QgYWNwaV9tZW1vcnlfZGV2aWNlIHsKIAlhY3BpX2hhbmRsZSBoYW5kbGU7CiAJdW5zaWduZWQgaW50IHN0YXRlOwkvKiBTdGF0ZSBvZiB0aGUgbWVtb3J5IGRldmljZSAqLwotCXVuc2lnbmVkIHNob3J0IGNhY2hlX2F0dHJpYnV0ZTsJLyogbWVtb3J5IGNhY2hlIGF0dHJpYnV0ZSAqLwotCXVuc2lnbmVkIHNob3J0IHJlYWRfd3JpdGVfYXR0cmlidXRlOwkvKiBtZW1vcnkgcmVhZC93cml0ZSBhdHRyaWJ1dGUgKi8KKwl1bnNpZ25lZCBzaG9ydCBjYWNoaW5nOwkvKiBtZW1vcnkgY2FjaGUgYXR0cmlidXRlICovCisJdW5zaWduZWQgc2hvcnQgd3JpdGVfcHJvdGVjdDsJLyogbWVtb3J5IHJlYWQvd3JpdGUgYXR0cmlidXRlICovCiAJdTY0IHN0YXJ0X2FkZHI7CQkvKiBNZW1vcnkgUmFuZ2Ugc3RhcnQgcGh5c2ljYWwgYWRkciAqLwogCXU2NCBlbmRfYWRkcjsJCS8qIE1lbW9yeSBSYW5nZSBlbmQgcGh5c2ljYWwgYWRkciAqLwogfTsKQEAgLTk3LDEyICs5NywxMiBAQAogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQlpZiAoYWRkcmVzczY0LnJlc291cmNlX3R5cGUgPT0gQUNQSV9NRU1PUllfUkFOR0UpIHsKIAkJCS8qIFBvcHVsYXRlIHRoZSBzdHJ1Y3R1cmUgKi8KLQkJCW1lbV9kZXZpY2UtPmNhY2hlX2F0dHJpYnV0ZSA9Ci0JCQkgICAgYWRkcmVzczY0LmF0dHJpYnV0ZS5tZW1vcnkuY2FjaGVfYXR0cmlidXRlOwotCQkJbWVtX2RldmljZS0+cmVhZF93cml0ZV9hdHRyaWJ1dGUgPQotCQkJICAgIGFkZHJlc3M2NC5hdHRyaWJ1dGUubWVtb3J5LnJlYWRfd3JpdGVfYXR0cmlidXRlOwotCQkJbWVtX2RldmljZS0+c3RhcnRfYWRkciA9IGFkZHJlc3M2NC5taW5fYWRkcmVzc19yYW5nZTsKLQkJCW1lbV9kZXZpY2UtPmVuZF9hZGRyID0gYWRkcmVzczY0Lm1heF9hZGRyZXNzX3JhbmdlOworCQkJbWVtX2RldmljZS0+Y2FjaGluZyA9CisJCQkgICAgYWRkcmVzczY0LmluZm8ubWVtLmNhY2hpbmc7CisJCQltZW1fZGV2aWNlLT53cml0ZV9wcm90ZWN0ID0KKwkJCSAgICBhZGRyZXNzNjQuaW5mby5tZW0ud3JpdGVfcHJvdGVjdDsKKwkJCW1lbV9kZXZpY2UtPnN0YXJ0X2FkZHIgPSBhZGRyZXNzNjQubWluaW11bTsKKwkJCW1lbV9kZXZpY2UtPmVuZF9hZGRyID0gYWRkcmVzczY0Lm1heGltdW07CiAJCX0KIAl9CiAKQEAgLTI1MCw3ICsyNTAsNiBAQAogCWludCByZXN1bHQ7CiAJdTY0IHN0YXJ0ID0gbWVtX2RldmljZS0+c3RhcnRfYWRkcjsKIAl1NjQgbGVuID0gbWVtX2RldmljZS0+ZW5kX2FkZHIgLSBzdGFydCArIDE7Ci0JdW5zaWduZWQgbG9uZyBhdHRyID0gbWVtX2RldmljZS0+cmVhZF93cml0ZV9hdHRyaWJ1dGU7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX21lbW9yeV9kaXNhYmxlX2RldmljZSIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXN1c19hY3BpLmMgYi9kcml2ZXJzL2FjcGkvYXN1c19hY3BpLmMKaW5kZXggZmVjODk1YS4uZjRjODc3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FzdXNfYWNwaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hc3VzX2FjcGkuYwpAQCAtNzgsOSArNzgsOSBAQAogc3RhdGljIHVpZF90IGFzdXNfdWlkOwogc3RhdGljIGdpZF90IGFzdXNfZ2lkOwogbW9kdWxlX3BhcmFtKGFzdXNfdWlkLCB1aW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0ModWlkLCAiVUlEIGZvciBlbnRyaWVzIGluIC9wcm9jL2FjcGkvYXN1cy5cbiIpOworTU9EVUxFX1BBUk1fREVTQyhhc3VzX3VpZCwgIlVJRCBmb3IgZW50cmllcyBpbiAvcHJvYy9hY3BpL2FzdXMuXG4iKTsKIG1vZHVsZV9wYXJhbShhc3VzX2dpZCwgdWludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGdpZCwgIkdJRCBmb3IgZW50cmllcyBpbiAvcHJvYy9hY3BpL2FzdXMuXG4iKTsKK01PRFVMRV9QQVJNX0RFU0MoYXN1c19naWQsICJHSUQgZm9yIGVudHJpZXMgaW4gL3Byb2MvYWNwaS9hc3VzLlxuIik7CiAKIC8qIEZvciBlYWNoIG1vZGVsLCBhbGwgZmVhdHVyZXMgaW1wbGVtZW50ZWQsIAogICogdGhvc2UgbWFya2VkIHdpdGggUiBhcmUgcmVsYXRpdmUgdG8gSE9USywgQSBmb3IgYWJzb2x1dGUgKi8KQEAgLTMwMiw3ICszMDIsNyBAQAogCSAuYnJpZ2h0bmVzc19zZXQgPSAiU1BMViIsCiAJIC5icmlnaHRuZXNzX2dldCA9ICJHUExWIiwKIAkgLmRpc3BsYXlfc2V0ID0gIlNEU1AiLAotCSAuZGlzcGxheV9nZXQgPSAiXFxTU1RFIn0sCisJIC5kaXNwbGF5X2dldCA9ICJcXF9TQi5QQ0kwLlAwUDEuVkdBLkdFVEQifSwKIAl7CiAJIC5uYW1lID0gIk02UiIsCiAJIC5tdF9tbGVkID0gIk1MRUQiLApAQCAtODUxLDYgKzg1MSw4IEBACiAJCW1vZGUgPSBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVR087CiAJfSBlbHNlIHsKIAkJbW9kZSA9IFNfSUZSRUcgfCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVdVU1IgfCBTX0lXR1JQOworCQlwcmludGsoS0VSTl9XQVJOSU5HICIgIGFzdXNfdWlkIGFuZCBhc3VzX2dpZCBwYXJhbWV0ZXJzIGFyZSAiCisJCSAgICAgICAiZGVwcmVjYXRlZCwgdXNlIGNob3duIGFuZCBjaG1vZCBpbnN0ZWFkIVxuIik7CiAJfQogCiAJYWNwaV9kZXZpY2VfZGlyKGRldmljZSkgPSBhc3VzX3Byb2NfZGlyOwpAQCAtOTg3LDkgKzk4OSwyMSBAQAogCQlwcmludGsoS0VSTl9OT1RJQ0UgIiAgQlNUUyBjYWxsZWQsIDB4JTAyeCByZXR1cm5lZFxuIiwKIAkJICAgICAgIGJzdHNfcmVzdWx0KTsKIAotCS8qIFNhbXN1bmcgUDMwIGhhcyBhIGRldmljZSB3aXRoIGEgdmFsaWQgX0hJRCB3aG9zZSBJTklUIGRvZXMgbm90IAotCSAqIHJldHVybiBhbnl0aGluZy4gQ2F0Y2ggdGhpcyBvbmUgYW5kIGFueSBzaW1pbGFyIGhlcmUgKi8KLQlpZiAoYnVmZmVyLnBvaW50ZXIgPT0gTlVMTCkgeworCS8qIFRoaXMgaXMgdW5saWtlbHkgd2l0aCBpbXBsaWNpdCByZXR1cm4gKi8KKwlpZiAoYnVmZmVyLnBvaW50ZXIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltb2RlbCA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSBidWZmZXIucG9pbnRlcjsKKwkvKgorCSAqIFNhbXN1bmcgUDMwIGhhcyBhIGRldmljZSB3aXRoIGEgdmFsaWQgX0hJRCB3aG9zZSBJTklUIGRvZXMgbm90IAorCSAqIHJldHVybiBhbnl0aGluZy4gSXQgdXNlZCB0byBiZSBwb3NzaWJsZSB0byBjYXRjaCB0aGlzIGV4Y2VwdGlvbiwKKwkgKiBidXQgdGhlIGltcGxpY2l0IHJldHVybiBjb2RlIHdpbGwgbm93IGhhcHBpbHkgY29uZnVzZSB0aGUgCisJICogZHJpdmVyLiBXZSBhc3N1bWUgdGhhdCBldmVyeSBBQ1BJX1RZUEVfU1RSSU5HIGlzIGEgdmFsaWQgbW9kZWwKKwkgKiBpZGVudGlmaWVyIGJ1dCBpdCdzIHN0aWxsIHBvc3NpYmxlIHRvIGdldCBjb21wbGV0ZWx5IGJvZ3VzIGRhdGEuCisJICovCisJaWYgKG1vZGVsLT50eXBlID09IEFDUElfVFlQRV9TVFJJTkcpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIgICVzIG1vZGVsIGRldGVjdGVkLCAiLCBtb2RlbC0+c3RyaW5nLnBvaW50ZXIpOworCX0gZWxzZSB7CiAJCWlmIChhc3VzX2luZm8gJiYJLyogU2Ftc3VuZyBQMzAgKi8KIAkJICAgIHN0cm5jbXAoYXN1c19pbmZvLT5vZW1fdGFibGVfaWQsICJPREVNIiwgNCkgPT0gMCkgewogCQkJaG90ay0+bW9kZWwgPSBQMzA7CkBAIC0xMDAyLDEzICsxMDE2LDEwIEBACiAJCQkgICAgICAgInRoZSBkZXZlbG9wZXJzIHdpdGggeW91ciBEU0RUXG4iKTsKIAkJfQogCQlob3RrLT5tZXRob2RzID0gJm1vZGVsX2NvbmZbaG90ay0+bW9kZWxdOwotCQlyZXR1cm4gQUVfT0s7Ci0JfQorCQkKKwkJYWNwaV9vc19mcmVlKG1vZGVsKTsKIAotCW1vZGVsID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopYnVmZmVyLnBvaW50ZXI7Ci0JaWYgKG1vZGVsLT50eXBlID09IEFDUElfVFlQRV9TVFJJTkcpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICIgICVzIG1vZGVsIGRldGVjdGVkLCAiLAotCQkgICAgICAgbW9kZWwtPnN0cmluZy5wb2ludGVyKTsKKwkJcmV0dXJuIEFFX09LOwogCX0KIAogCWhvdGstPm1vZGVsID0gRU5EX01PREVMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNmaWVsZC5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNmaWVsZC5jCmluZGV4IDIwMjJhZWEuLmYzYTAwOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzZmllbGQuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc2ZpZWxkLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0yOTMsNyArMjkzLDcgQEAKIAkJCSAgICArIChhY3BpX2ludGVnZXIpIGFyZy0+Y29tbW9uLnZhbHVlLnNpemU7CiAKIAkJCWlmIChwb3NpdGlvbiA+IEFDUElfVUlOVDMyX01BWCkgewotCQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiRmllbGQgWyU0LjRzXSBiaXQgb2Zmc2V0IHRvbyBsYXJnZSAoPiAweEZGRkZGRkZGKVxuIiwgKGNoYXIgKikmaW5mby0+ZmllbGRfbm9kZS0+bmFtZSkpOworCQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiRmllbGQgWyU0LjRzXSBiaXQgb2Zmc2V0IHRvbyBsYXJnZSAoPiAweEZGRkZGRkZGKVxuIiwgQUNQSV9DQVNUX1BUUihjaGFyLCAmaW5mby0+ZmllbGRfbm9kZS0+bmFtZSkpKTsKIAkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfU1VQUE9SVCk7CiAJCQl9CiAKQEAgLTMwMiw5ICszMDIsOCBAQAogCiAJCWRlZmF1bHQ6CiAKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgIkludmFsaWQgb3Bjb2RlIGluIGZpZWxkIGxpc3Q6ICVYXG4iLAotCQkJCQkgIGFyZy0+Y29tbW9uLmFtbF9vcGNvZGUpKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiSW52YWxpZCBvcGNvZGUgaW4gZmllbGQgbGlzdDogJVhcbiIsCisJCQkJCSAgIGFyZy0+Y29tbW9uLmFtbF9vcGNvZGUpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfQkFEX09QQ09ERSk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNpbml0LmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc2luaXQuYwppbmRleCA4NjkzYzcwLi4yNThmYmRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc2luaXQuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc2luaXQuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTg0LDcgKzg0LDcgQEAKIAlhY3BpX29iamVjdF90eXBlIHR5cGU7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9OQU1FKCJkc19pbml0X29uZV9vYmplY3QiKTsKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAkvKgogCSAqIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gTlMgbm9kZXMgb3duZWQgYnkgdGhlIHRhYmxlIHRoYXQKQEAgLTEwNSwxMSArMTA1LDcgQEAKIAogCQlzdGF0dXMgPSBhY3BpX2RzX2luaXRpYWxpemVfcmVnaW9uKG9ial9oYW5kbGUpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgIlJlZ2lvbiAlcCBbJTQuNHNdIC0gSW5pdCBmYWlsdXJlLCAlc1xuIiwKLQkJCQkJICBvYmpfaGFuZGxlLAotCQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfaGFuZGxlKSwKLQkJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJSZWdpb24gJXAgWyU0LjRzXSAtIEluaXQgZmFpbHVyZSwgJXNcbiIsIG9ial9oYW5kbGUsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfaGFuZGxlKSwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAkJfQogCiAJCWluZm8tPm9wX3JlZ2lvbl9jb3VudCsrOwpAQCAtMTE4LDE0ICsxMTQsNiBAQAogCWNhc2UgQUNQSV9UWVBFX01FVEhPRDoKIAogCQkvKgotCQkgKiBQcmludCBhIGRvdCBmb3IgZWFjaCBtZXRob2QgdW5sZXNzIHdlIGFyZSBnb2luZyB0byBwcmludAotCQkgKiB0aGUgZW50aXJlIHBhdGhuYW1lCi0JCSAqLwotCQlpZiAoIShhY3BpX2RiZ19sZXZlbCAmIEFDUElfTFZfSU5JVF9OQU1FUykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0lOSVQsICIuIikpOwotCQl9Ci0KLQkJLyoKIAkJICogU2V0IHRoZSBleGVjdXRpb24gZGF0YSB3aWR0aCAoMzIgb3IgNjQpIGJhc2VkIHVwb24gdGhlCiAJCSAqIHJldmlzaW9uIG51bWJlciBvZiB0aGUgcGFyZW50IEFDUEkgdGFibGUuCiAJCSAqIFRCRDogVGhpcyBpcyByZWFsbHkgZm9yIHBvc3NpYmxlIGZ1dHVyZSBzdXBwb3J0IG9mIGludGVnZXIgd2lkdGgKQEAgLTEzNCw2ICsxMjIsMjEgQEAKIAkJaWYgKGluZm8tPnRhYmxlX2Rlc2MtPnBvaW50ZXItPnJldmlzaW9uID09IDEpIHsKIAkJCW5vZGUtPmZsYWdzIHw9IEFOT0JKX0RBVEFfV0lEVEhfMzI7CiAJCX0KKyNpZmRlZiBBQ1BJX0lOSVRfUEFSU0VfTUVUSE9EUworCQkvKgorCQkgKiBOb3RlIDExLzIwMDU6IFJlbW92ZWQgdGhpcyBjb2RlIHRvIHBhcnNlIGFsbCBtZXRob2RzIGR1cmluZyB0YWJsZQorCQkgKiBsb2FkIGJlY2F1c2UgaXQgY2F1c2VzIHByb2JsZW1zIGlmIHRoZXJlIGFyZSBhbnkgZXJyb3JzIGR1cmluZyB0aGUKKwkJICogcGFyc2UuIEFsc28sIGl0IHNlZW1zIGxpa2Ugb3ZlcmtpbGwgYW5kIHdlIHByb2JhYmx5IGRvbid0IHdhbnQgdG8KKwkJICogYWJvcnQgYSB0YWJsZSBsb2FkIGJlY2F1c2Ugb2YgYW4gaXNzdWUgd2l0aCBhIHNpbmdsZSBtZXRob2QuCisJCSAqLworCisJCS8qCisJCSAqIFByaW50IGEgZG90IGZvciBlYWNoIG1ldGhvZCB1bmxlc3Mgd2UgYXJlIGdvaW5nIHRvIHByaW50CisJCSAqIHRoZSBlbnRpcmUgcGF0aG5hbWUKKwkJICovCisJCWlmICghKGFjcGlfZGJnX2xldmVsICYgQUNQSV9MVl9JTklUX05BTUVTKSkgeworCQkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfSU5JVCwgIi4iKSk7CisJCX0KIAogCQkvKgogCQkgKiBBbHdheXMgcGFyc2UgbWV0aG9kcyB0byBkZXRlY3QgZXJyb3JzLCB3ZSB3aWxsIGRlbGV0ZQpAQCAtMTQxLDE1ICsxNDQsMTEgQEAKIAkJICovCiAJCXN0YXR1cyA9IGFjcGlfZHNfcGFyc2VfbWV0aG9kKG9ial9oYW5kbGUpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgIlxuK01ldGhvZCAlcCBbJTQuNHNdIC0gcGFyc2UgZmFpbHVyZSwgJXNcbiIsCi0JCQkJCSAgb2JqX2hhbmRsZSwKLQkJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2hhbmRsZSksCi0JCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiXG4rTWV0aG9kICVwIFslNC40c10gLSBwYXJzZSBmYWlsdXJlLCAlc1xuIiwgb2JqX2hhbmRsZSwgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG9ial9oYW5kbGUpLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCiAJCQkvKiBUaGlzIHBhcnNlIGZhaWxlZCwgYnV0IHdlIHdpbGwgY29udGludWUgcGFyc2luZyBtb3JlIG1ldGhvZHMgKi8KIAkJfQotCisjZW5kaWYKIAkJaW5mby0+bWV0aG9kX2NvdW50Kys7CiAJCWJyZWFrOwogCkBAIC0yMDcsOCArMjA2LDggQEAKIAlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9BTlksIHN0YXJ0X25vZGUsIEFDUElfVUlOVDMyX01BWCwKIAkJCQkgICAgIGFjcGlfZHNfaW5pdF9vbmVfb2JqZWN0LCAmaW5mbywgTlVMTCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJ3YWxrX25hbWVzcGFjZSBmYWlsZWQsICVzXG4iLAotCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJ3YWxrX25hbWVzcGFjZSBmYWlsZWQsICVzXG4iLAorCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJfQogCiAJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfSU5JVCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbWV0aG9kLmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc21ldGhvZC5jCmluZGV4IDM2YzFjYTAuLmQ4NjFhZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbWV0aG9kLmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtZXRob2QuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTQ3LDEzNSArNDcsNjYgQEAKICNpbmNsdWRlIDxhY3BpL2FjZGlzcGF0Lmg+CiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KKyNpbmNsdWRlIDxhY3BpL2FjZGlzYXNtLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0RJU1BBVENIRVIKIEFDUElfTU9EVUxFX05BTUUoImRzbWV0aG9kIikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19wYXJzZV9tZXRob2QKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX21ldGhvZF9lcnJvcgogICoKLSAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAtIE1ldGhvZCBub2RlCisgKiBQQVJBTUVURVJTOiAgU3RhdHVzICAgICAgICAgIC0gRXhlY3V0aW9uIHN0YXR1cworICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IFBhcnNlIHRoZSBBTUwgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIG1ldGhvZC4KKyAqIERFU0NSSVBUSU9OOiBDYWxsZWQgb24gbWV0aG9kIGVycm9yLiBJbnZva2UgdGhlIGdsb2JhbCBleGNlcHRpb24gaGFuZGxlciBpZgorICogICAgICAgICAgICAgIHByZXNlbnQsIGR1bXAgdGhlIG1ldGhvZCBkYXRhIGlmIHRoZSBkaXNhc3NlbWJsZXIgaXMgY29uZmlndXJlZAogICoKLSAqIE1VVEVYOiAgICAgICBBc3N1bWVzIHBhcnNlciBpcyBsb2NrZWQKKyAqICAgICAgICAgICAgICBOb3RlOiBBbGxvd3MgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIHRvIGNoYW5nZSB0aGUgc3RhdHVzIGNvZGUKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgYWNwaV9kc19wYXJzZV9tZXRob2Qoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpCithY3BpX3N0YXR1cworYWNwaV9kc19tZXRob2RfZXJyb3IoYWNwaV9zdGF0dXMgc3RhdHVzLCBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7Ci0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZTsKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfcGFyc2VfbWV0aG9kIiwgbm9kZSk7CisJLyogSWdub3JlIEFFX09LIGFuZCBjb250cm9sIGV4Y2VwdGlvbiBjb2RlcyAqLwogCi0JLyogUGFyYW1ldGVyIFZhbGlkYXRpb24gKi8KLQotCWlmICghbm9kZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTlVMTF9FTlRSWSk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpIHx8IChzdGF0dXMgJiBBRV9DT0RFX0NPTlRST0wpKSB7CisJCXJldHVybiAoc3RhdHVzKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAotCQkJICAiKioqKiBQYXJzaW5nIFslNC40c10gKioqKiBuYW1lZF9vYmo9JXBcbiIsCi0JCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwgbm9kZSkpOworCS8qIEludm9rZSB0aGUgZ2xvYmFsIGV4Y2VwdGlvbiBoYW5kbGVyICovCiAKLQkvKiBFeHRyYWN0IHRoZSBtZXRob2Qgb2JqZWN0IGZyb20gdGhlIG1ldGhvZCBOb2RlICovCisJaWYgKGFjcGlfZ2JsX2V4Y2VwdGlvbl9oYW5kbGVyKSB7CisJCS8qIEV4aXQgdGhlIGludGVycHJldGVyLCBhbGxvdyBoYW5kbGVyIHRvIGV4ZWN1dGUgbWV0aG9kcyAqLwogCi0Jb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7Ci0JaWYgKCFvYmpfZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTlVMTF9PQkpFQ1QpOworCQlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKKworCQkvKgorCQkgKiBIYW5kbGVyIGNhbiBtYXAgdGhlIGV4Y2VwdGlvbiBjb2RlIHRvIGFueXRoaW5nIGl0IHdhbnRzLCBpbmNsdWRpbmcKKwkJICogQUVfT0ssIGluIHdoaWNoIGNhc2UgdGhlIGV4ZWN1dGluZyBtZXRob2Qgd2lsbCBub3QgYmUgYWJvcnRlZC4KKwkJICovCisJCXN0YXR1cyA9IGFjcGlfZ2JsX2V4Y2VwdGlvbl9oYW5kbGVyKHN0YXR1cywKKwkJCQkJCSAgICB3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSA/CisJCQkJCQkgICAgd2Fsa19zdGF0ZS0+bWV0aG9kX25vZGUtPgorCQkJCQkJICAgIG5hbWUuaW50ZWdlciA6IDAsCisJCQkJCQkgICAgd2Fsa19zdGF0ZS0+b3Bjb2RlLAorCQkJCQkJICAgIHdhbGtfc3RhdGUtPmFtbF9vZmZzZXQsCisJCQkJCQkgICAgTlVMTCk7CisJCSh2b2lkKWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKIAl9Ci0KLQkvKiBDcmVhdGUgYSBtdXRleCBmb3IgdGhlIG1ldGhvZCBpZiB0aGVyZSBpcyBhIGNvbmN1cnJlbmN5IGxpbWl0ICovCi0KLQlpZiAoKG9ial9kZXNjLT5tZXRob2QuY29uY3VycmVuY3kgIT0gQUNQSV9JTkZJTklURV9DT05DVVJSRU5DWSkgJiYKLQkgICAgKCFvYmpfZGVzYy0+bWV0aG9kLnNlbWFwaG9yZSkpIHsKLQkJc3RhdHVzID0gYWNwaV9vc19jcmVhdGVfc2VtYXBob3JlKG9ial9kZXNjLT5tZXRob2QuY29uY3VycmVuY3ksCi0JCQkJCQkgIG9ial9kZXNjLT5tZXRob2QuY29uY3VycmVuY3ksCi0JCQkJCQkgICZvYmpfZGVzYy0+bWV0aG9kLnNlbWFwaG9yZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEFsbG9jYXRlIGEgbmV3IHBhcnNlciBvcCB0byBiZSB0aGUgcm9vdCBvZiB0aGUgcGFyc2VkCi0JICogbWV0aG9kIHRyZWUKLQkgKi8KLQlvcCA9IGFjcGlfcHNfYWxsb2Nfb3AoQU1MX01FVEhPRF9PUCk7Ci0JaWYgKCFvcCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQl9Ci0KLQkvKiBJbml0IG5ldyBvcCB3aXRoIHRoZSBtZXRob2QgbmFtZSBhbmQgcG9pbnRlciBiYWNrIHRvIHRoZSBOb2RlICovCi0KLQlhY3BpX3BzX3NldF9uYW1lKG9wLCBub2RlLT5uYW1lLmludGVnZXIpOwotCW9wLT5jb21tb24ubm9kZSA9IG5vZGU7Ci0KLQkvKgotCSAqIEdldCBhIG5ldyBvd25lcl9pZCBmb3Igb2JqZWN0cyBjcmVhdGVkIGJ5IHRoaXMgbWV0aG9kLiBOYW1lc3BhY2UKLQkgKiBvYmplY3RzIChzdWNoIGFzIE9wZXJhdGlvbiBSZWdpb25zKSBjYW4gYmUgY3JlYXRlZCBkdXJpbmcgdGhlCi0JICogZmlyc3QgcGFzcyBwYXJzZS4KLQkgKi8KLQlzdGF0dXMgPSBhY3BpX3V0X2FsbG9jYXRlX293bmVyX2lkKCZvYmpfZGVzYy0+bWV0aG9kLm93bmVyX2lkKTsKKyNpZmRlZiBBQ1BJX0RJU0FTU0VNQkxFUgogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIGNsZWFudXA7CisJCS8qIERpc3BsYXkgbWV0aG9kIGxvY2Fscy9hcmdzIGlmIGRpc2Fzc2VtYmxlciBpcyBwcmVzZW50ICovCisKKwkJYWNwaV9kbV9kdW1wX21ldGhvZF9pbmZvKHN0YXR1cywgd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+b3ApOwogCX0KKyNlbmRpZgogCi0JLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHdhbGsgc3RhdGUgKi8KLQotCXdhbGtfc3RhdGUgPQotCSAgICBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlKG9ial9kZXNjLT5tZXRob2Qub3duZXJfaWQsIE5VTEwsIE5VTEwsCi0JCQkJICAgICAgTlVMTCk7Ci0JaWYgKCF3YWxrX3N0YXRlKSB7Ci0JCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKLQkJZ290byBjbGVhbnVwMjsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsod2Fsa19zdGF0ZSwgb3AsIG5vZGUsCi0JCQkJICAgICAgIG9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0LAotCQkJCSAgICAgICBvYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgsIE5VTEwsIDEpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlKHdhbGtfc3RhdGUpOwotCQlnb3RvIGNsZWFudXAyOwotCX0KLQotCS8qCi0JICogUGFyc2UgdGhlIG1ldGhvZCwgZmlyc3QgcGFzcwotCSAqCi0JICogVGhlIGZpcnN0IHBhc3MgbG9hZCBpcyB3aGVyZSBuZXdseSBkZWNsYXJlZCBuYW1lZCBvYmplY3RzIGFyZSBhZGRlZCBpbnRvCi0JICogdGhlIG5hbWVzcGFjZS4gIEFjdHVhbCBldmFsdWF0aW9uIG9mIHRoZSBuYW1lZCBvYmplY3RzICh3aGF0IHdvdWxkIGJlCi0JICogY2FsbGVkIGEgInNlY29uZCBwYXNzIikgaGFwcGVucyBkdXJpbmcgdGhlIGFjdHVhbCBleGVjdXRpb24gb2YgdGhlCi0JICogbWV0aG9kIHNvIHRoYXQgb3BlcmFuZHMgdG8gdGhlIG5hbWVkIG9iamVjdHMgY2FuIHRha2Ugb24gZHluYW1pYwotCSAqIHJ1bi10aW1lIHZhbHVlcy4KLQkgKi8KLQlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2FtbCh3YWxrX3N0YXRlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZ290byBjbGVhbnVwMjsKLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAotCQkJICAiKioqKiBbJTQuNHNdIFBhcnNlZCAqKioqIG5hbWVkX29iaj0lcCBPcD0lcFxuIiwKLQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpLCBub2RlLCBvcCkpOwotCi0JLyoKLQkgKiBEZWxldGUgdGhlIHBhcnNlIHRyZWUuIFdlIHNpbXBseSByZS1wYXJzZSB0aGUgbWV0aG9kIGZvciBldmVyeQotCSAqIGV4ZWN1dGlvbiBzaW5jZSB0aGVyZSBpc24ndCBtdWNoIG92ZXJoZWFkIChjb21wYXJlZCB0byBrZWVwaW5nIGxvdHMKLQkgKiBvZiBwYXJzZSB0cmVlcyBhcm91bmQpCi0JICovCi0JYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUobm9kZSk7Ci0JYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyKG9ial9kZXNjLT5tZXRob2Qub3duZXJfaWQpOwotCi0gICAgICBjbGVhbnVwMjoKLQlhY3BpX3V0X3JlbGVhc2Vfb3duZXJfaWQoJm9ial9kZXNjLT5tZXRob2Qub3duZXJfaWQpOwotCi0gICAgICBjbGVhbnVwOgotCWFjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUob3ApOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCXJldHVybiAoc3RhdHVzKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE5NSw5ICsxMjYsOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfYmVnaW5fbWV0aG9kX2V4ZWN1dGlvbihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX25vZGUsCi0JCQkgICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCi0JCQkgICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmNhbGxpbmdfbWV0aG9kX25vZGUpCithY3BpX2RzX2JlZ2luX21ldGhvZF9leGVjdXRpb24oc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiBtZXRob2Rfbm9kZSwKKwkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICogb2JqX2Rlc2MsCisJCQkgICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiBjYWxsaW5nX21ldGhvZF9ub2RlKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCkBAIC01NDUsMTYgKzQ3Niw1NCBAQAogCQl9CiAJfQogCisJLyoKKwkgKiBUaGVyZSBhcmUgbm8gbW9yZSB0aHJlYWRzIGV4ZWN1dGluZyB0aGlzIG1ldGhvZC4gIFBlcmZvcm0KKwkgKiBhZGRpdGlvbmFsIGNsZWFudXAuCisJICoKKwkgKiBUaGUgbWV0aG9kIE5vZGUgaXMgc3RvcmVkIGluIHRoZSB3YWxrIHN0YXRlCisJICovCisJbWV0aG9kX25vZGUgPSB3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZTsKKworCS8qIExvY2sgbmFtZXNwYWNlIGZvciBwb3NzaWJsZSB1cGRhdGUgKi8KKworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlnb3RvIGV4aXQ7CisJfQorCisJLyoKKwkgKiBEZWxldGUgYW55IG5hbWVzcGFjZSBlbnRyaWVzIGNyZWF0ZWQgaW1tZWRpYXRlbHkgdW5kZXJuZWF0aAorCSAqIHRoZSBtZXRob2QKKwkgKi8KKwlpZiAobWV0aG9kX25vZGUtPmNoaWxkKSB7CisJCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9zdWJ0cmVlKG1ldGhvZF9ub2RlKTsKKwl9CisKKwkvKgorCSAqIERlbGV0ZSBhbnkgbmFtZXNwYWNlIGVudHJpZXMgY3JlYXRlZCBhbnl3aGVyZSBlbHNlIHdpdGhpbgorCSAqIHRoZSBuYW1lc3BhY2UgYnkgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIG1ldGhvZAorCSAqLworCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcih3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLgorCQkJCQkgIG93bmVyX2lkKTsKKwlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKworCS8qIEFyZSB0aGVyZSBhbnkgb3RoZXIgdGhyZWFkcyBjdXJyZW50bHkgZXhlY3V0aW5nIHRoaXMgbWV0aG9kPyAqLworCiAJaWYgKHdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2QudGhyZWFkX2NvdW50KSB7CisJCS8qCisJCSAqIEFkZGl0aW9uYWwgdGhyZWFkcy4gRG8gbm90IHJlbGVhc2UgdGhlIG93bmVyX2lkIGluIHRoaXMgY2FzZSwKKwkJICogd2UgaW1tZWRpYXRlbHkgcmV1c2UgaXQgZm9yIHRoZSBuZXh0IHRocmVhZCBleGVjdXRpbmcgdGhpcyBtZXRob2QKKwkJICovCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkJICAiKioqIE5vdCBkZWxldGluZyBtZXRob2QgbmFtZXNwYWNlLCB0aGVyZSBhcmUgc3RpbGwgJWQgdGhyZWFkc1xuIiwKKwkJCQkgICIqKiogQ29tcGxldGVkIGV4ZWN1dGlvbiBvZiBvbmUgdGhyZWFkLCAlZCB0aHJlYWRzIHJlbWFpbmluZ1xuIiwKIAkJCQkgIHdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2QuCiAJCQkJICB0aHJlYWRfY291bnQpKTsKLQl9IGVsc2UgewkJLyogVGhpcyBpcyB0aGUgbGFzdCBleGVjdXRpbmcgdGhyZWFkICovCisJfSBlbHNlIHsKKwkJLyogVGhpcyBpcyB0aGUgb25seSBleGVjdXRpbmcgdGhyZWFkIGZvciB0aGlzIG1ldGhvZCAqLwogCiAJCS8qCiAJCSAqIFN1cHBvcnQgdG8gZHluYW1pY2FsbHkgY2hhbmdlIGEgbWV0aG9kIGZyb20gbm90X3NlcmlhbGl6ZWQgdG8KLQkJICogU2VyaWFsaXplZCBpZiBpdCBhcHBlYXJzIHRoYXQgdGhlIG1ldGhvZCBpcyB3cml0dGVuIGZvb2xpc2hseSBhbmQKKwkJICogU2VyaWFsaXplZCBpZiBpdCBhcHBlYXJzIHRoYXQgdGhlIG1ldGhvZCBpcyBpbmNvcnJlY3RseSB3cml0dGVuIGFuZAogCQkgKiBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIHRocmVhZCBleGVjdXRpb24uICBUaGUgYmVzdCBleGFtcGxlIG9mIHRoaXMKIAkJICogaXMgaWYgc3VjaCBhIG1ldGhvZCBjcmVhdGVzIG5hbWVzcGFjZSBvYmplY3RzIGFuZCBibG9ja3MuICBBIHNlY29uZAogCQkgKiB0aHJlYWQgd2lsbCBmYWlsIHdpdGggYW4gQUVfQUxSRUFEWV9FWElTVFMgZXhjZXB0aW9uCkBAIC01NzAsMzQgKzUzOSw4IEBACiAJCQkJCQkJICBzZW1hcGhvcmUpOwogCQl9CiAKLQkJLyoKLQkJICogVGhlcmUgYXJlIG5vIG1vcmUgdGhyZWFkcyBleGVjdXRpbmcgdGhpcyBtZXRob2QuICBQZXJmb3JtCi0JCSAqIGFkZGl0aW9uYWwgY2xlYW51cC4KLQkJICoKLQkJICogVGhlIG1ldGhvZCBOb2RlIGlzIHN0b3JlZCBpbiB0aGUgd2FsayBzdGF0ZQotCQkgKi8KLQkJbWV0aG9kX25vZGUgPSB3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZTsKKwkJLyogTm8gbW9yZSB0aHJlYWRzLCB3ZSBjYW4gZnJlZSB0aGUgb3duZXJfaWQgKi8KIAotCQkvKgotCQkgKiBEZWxldGUgYW55IG5hbWVzcGFjZSBlbnRyaWVzIGNyZWF0ZWQgaW1tZWRpYXRlbHkgdW5kZXJuZWF0aAotCQkgKiB0aGUgbWV0aG9kCi0JCSAqLwotCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQlpZiAobWV0aG9kX25vZGUtPmNoaWxkKSB7Ci0JCQlhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2Vfc3VidHJlZShtZXRob2Rfbm9kZSk7Ci0JCX0KLQotCQkvKgotCQkgKiBEZWxldGUgYW55IG5hbWVzcGFjZSBlbnRyaWVzIGNyZWF0ZWQgYW55d2hlcmUgZWxzZSB3aXRoaW4KLQkJICogdGhlIG5hbWVzcGFjZQotCQkgKi8KLQkJYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyKHdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT4KLQkJCQkJCSAgbWV0aG9kLm93bmVyX2lkKTsKLQkJc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CiAJCWFjcGlfdXRfcmVsZWFzZV9vd25lcl9pZCgmd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC4KIAkJCQkJIG93bmVyX2lkKTsKIAl9CkBAIC02MDYsMyArNTQ5LDE0MCBAQAogCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9QQVJTRVIpOwogCXJldHVybl9WT0lEOwogfQorCisjaWZkZWYgQUNQSV9JTklUX1BBUlNFX01FVEhPRFMKKwkvKgorCSAqIE5vdGUgMTEvMjAwNTogUmVtb3ZlZCB0aGlzIGNvZGUgdG8gcGFyc2UgYWxsIG1ldGhvZHMgZHVyaW5nIHRhYmxlCisJICogbG9hZCBiZWNhdXNlIGl0IGNhdXNlcyBwcm9ibGVtcyBpZiB0aGVyZSBhcmUgYW55IGVycm9ycyBkdXJpbmcgdGhlCisJICogcGFyc2UuIEFsc28sIGl0IHNlZW1zIGxpa2Ugb3ZlcmtpbGwgYW5kIHdlIHByb2JhYmx5IGRvbid0IHdhbnQgdG8KKwkgKiBhYm9ydCBhIHRhYmxlIGxvYWQgYmVjYXVzZSBvZiBhbiBpc3N1ZSB3aXRoIGEgc2luZ2xlIG1ldGhvZC4KKwkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19wYXJzZV9tZXRob2QKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgLSBNZXRob2Qgbm9kZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUGFyc2UgdGhlIEFNTCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWV0aG9kLgorICoKKyAqIE1VVEVYOiAgICAgICBBc3N1bWVzIHBhcnNlciBpcyBsb2NrZWQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX2RzX3BhcnNlX21ldGhvZChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOworCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfcGFyc2VfbWV0aG9kIiwgbm9kZSk7CisKKwkvKiBQYXJhbWV0ZXIgVmFsaWRhdGlvbiAqLworCisJaWYgKCFub2RlKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OVUxMX0VOVFJZKTsKKwl9CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAorCQkJICAiKioqKiBQYXJzaW5nIFslNC40c10gKioqKiBuYW1lZF9vYmo9JXBcbiIsCisJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwgbm9kZSkpOworCisJLyogRXh0cmFjdCB0aGUgbWV0aG9kIG9iamVjdCBmcm9tIHRoZSBtZXRob2QgTm9kZSAqLworCisJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CisJaWYgKCFvYmpfZGVzYykgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTlVMTF9PQkpFQ1QpOworCX0KKworCS8qIENyZWF0ZSBhIG11dGV4IGZvciB0aGUgbWV0aG9kIGlmIHRoZXJlIGlzIGEgY29uY3VycmVuY3kgbGltaXQgKi8KKworCWlmICgob2JqX2Rlc2MtPm1ldGhvZC5jb25jdXJyZW5jeSAhPSBBQ1BJX0lORklOSVRFX0NPTkNVUlJFTkNZKSAmJgorCSAgICAoIW9ial9kZXNjLT5tZXRob2Quc2VtYXBob3JlKSkgeworCQlzdGF0dXMgPSBhY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUob2JqX2Rlc2MtPm1ldGhvZC5jb25jdXJyZW5jeSwKKwkJCQkJCSAgb2JqX2Rlc2MtPm1ldGhvZC5jb25jdXJyZW5jeSwKKwkJCQkJCSAgJm9ial9kZXNjLT5tZXRob2Quc2VtYXBob3JlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCX0KKworCS8qCisJICogQWxsb2NhdGUgYSBuZXcgcGFyc2VyIG9wIHRvIGJlIHRoZSByb290IG9mIHRoZSBwYXJzZWQKKwkgKiBtZXRob2QgdHJlZQorCSAqLworCW9wID0gYWNwaV9wc19hbGxvY19vcChBTUxfTUVUSE9EX09QKTsKKwlpZiAoIW9wKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCX0KKworCS8qIEluaXQgbmV3IG9wIHdpdGggdGhlIG1ldGhvZCBuYW1lIGFuZCBwb2ludGVyIGJhY2sgdG8gdGhlIE5vZGUgKi8KKworCWFjcGlfcHNfc2V0X25hbWUob3AsIG5vZGUtPm5hbWUuaW50ZWdlcik7CisJb3AtPmNvbW1vbi5ub2RlID0gbm9kZTsKKworCS8qCisJICogR2V0IGEgbmV3IG93bmVyX2lkIGZvciBvYmplY3RzIGNyZWF0ZWQgYnkgdGhpcyBtZXRob2QuIE5hbWVzcGFjZQorCSAqIG9iamVjdHMgKHN1Y2ggYXMgT3BlcmF0aW9uIFJlZ2lvbnMpIGNhbiBiZSBjcmVhdGVkIGR1cmluZyB0aGUKKwkgKiBmaXJzdCBwYXNzIHBhcnNlLgorCSAqLworCXN0YXR1cyA9IGFjcGlfdXRfYWxsb2NhdGVfb3duZXJfaWQoJm9ial9kZXNjLT5tZXRob2Qub3duZXJfaWQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHdhbGsgc3RhdGUgKi8KKworCXdhbGtfc3RhdGUgPQorCSAgICBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlKG9ial9kZXNjLT5tZXRob2Qub3duZXJfaWQsIE5VTEwsIE5VTEwsCisJCQkJICAgICAgTlVMTCk7CisJaWYgKCF3YWxrX3N0YXRlKSB7CisJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJZ290byBjbGVhbnVwMjsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsod2Fsa19zdGF0ZSwgb3AsIG5vZGUsCisJCQkJICAgICAgIG9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0LAorCQkJCSAgICAgICBvYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgsIE5VTEwsIDEpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlKHdhbGtfc3RhdGUpOworCQlnb3RvIGNsZWFudXAyOworCX0KKworCS8qCisJICogUGFyc2UgdGhlIG1ldGhvZCwgZmlyc3QgcGFzcworCSAqCisJICogVGhlIGZpcnN0IHBhc3MgbG9hZCBpcyB3aGVyZSBuZXdseSBkZWNsYXJlZCBuYW1lZCBvYmplY3RzIGFyZSBhZGRlZCBpbnRvCisJICogdGhlIG5hbWVzcGFjZS4gIEFjdHVhbCBldmFsdWF0aW9uIG9mIHRoZSBuYW1lZCBvYmplY3RzICh3aGF0IHdvdWxkIGJlCisJICogY2FsbGVkIGEgInNlY29uZCBwYXNzIikgaGFwcGVucyBkdXJpbmcgdGhlIGFjdHVhbCBleGVjdXRpb24gb2YgdGhlCisJICogbWV0aG9kIHNvIHRoYXQgb3BlcmFuZHMgdG8gdGhlIG5hbWVkIG9iamVjdHMgY2FuIHRha2Ugb24gZHluYW1pYworCSAqIHJ1bi10aW1lIHZhbHVlcy4KKwkgKi8KKwlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2FtbCh3YWxrX3N0YXRlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byBjbGVhbnVwMjsKKwl9CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAorCQkJICAiKioqKiBbJTQuNHNdIFBhcnNlZCAqKioqIG5hbWVkX29iaj0lcCBPcD0lcFxuIiwKKwkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpLCBub2RlLCBvcCkpOworCisJLyoKKwkgKiBEZWxldGUgdGhlIHBhcnNlIHRyZWUuIFdlIHNpbXBseSByZS1wYXJzZSB0aGUgbWV0aG9kIGZvciBldmVyeQorCSAqIGV4ZWN1dGlvbiBzaW5jZSB0aGVyZSBpc24ndCBtdWNoIG92ZXJoZWFkIChjb21wYXJlZCB0byBrZWVwaW5nIGxvdHMKKwkgKiBvZiBwYXJzZSB0cmVlcyBhcm91bmQpCisJICovCisJYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUobm9kZSk7CisJYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyKG9ial9kZXNjLT5tZXRob2Qub3duZXJfaWQpOworCisgICAgICBjbGVhbnVwMjoKKwlhY3BpX3V0X3JlbGVhc2Vfb3duZXJfaWQoJm9ial9kZXNjLT5tZXRob2Qub3duZXJfaWQpOworCisgICAgICBjbGVhbnVwOgorCWFjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUob3ApOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc210aGRhdC5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtdGhkYXQuYwppbmRleCA0MDk1Y2U3Li5jZTMzYzM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc210aGRhdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbXRoZGF0LmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMjYwLDkgKzI2MCw3IEBACiAJY2FzZSBBTUxfTE9DQUxfT1A6CiAKIAkJaWYgKGluZGV4ID4gQUNQSV9NRVRIT0RfTUFYX0xPQ0FMKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJMb2NhbCBpbmRleCAlZCBpcyBpbnZhbGlkIChtYXggJWQpXG4iLAotCQkJCQkgIGluZGV4LCBBQ1BJX01FVEhPRF9NQVhfTE9DQUwpKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiTG9jYWwgaW5kZXggJWQgaXMgaW52YWxpZCAobWF4ICVkKVxuIiwgaW5kZXgsIEFDUElfTUVUSE9EX01BWF9MT0NBTCkpOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlZBTElEX0lOREVYKTsKIAkJfQogCkBAIC0yNzQsOSArMjcyLDggQEAKIAljYXNlIEFNTF9BUkdfT1A6CiAKIAkJaWYgKGluZGV4ID4gQUNQSV9NRVRIT0RfTUFYX0FSRykgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAiQXJnIGluZGV4ICVkIGlzIGludmFsaWQgKG1heCAlZClcbiIsCi0JCQkJCSAgaW5kZXgsIEFDUElfTUVUSE9EX01BWF9BUkcpKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiQXJnIGluZGV4ICVkIGlzIGludmFsaWQgKG1heCAlZClcbiIsCisJCQkJCSAgIGluZGV4LCBBQ1BJX01FVEhPRF9NQVhfQVJHKSk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVkFMSURfSU5ERVgpOwogCQl9CiAKQEAgLTI4Niw4ICsyODMsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJPcGNvZGUgJWQgaXMgaW52YWxpZFxuIiwKLQkJCQkgIG9wY29kZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk9wY29kZSAlZCBpcyBpbnZhbGlkXG4iLCBvcGNvZGUpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9CQURfT1BDT0RFKTsKIAl9CiAKQEAgLTM3OCw4ICszNzQsNyBAQAogCS8qIFZhbGlkYXRlIHRoZSBvYmplY3QgZGVzY3JpcHRvciAqLwogCiAJaWYgKCFkZXN0X2Rlc2MpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJOdWxsIG9iamVjdCBkZXNjcmlwdG9yIHBvaW50ZXJcbiIpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJOdWxsIG9iamVjdCBkZXNjcmlwdG9yIHBvaW50ZXJcbiIpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIApAQCAtNDI0LDIzICs0MTksMTggQEAKIAkJCXN3aXRjaCAob3Bjb2RlKSB7CiAJCQljYXNlIEFNTF9BUkdfT1A6CiAKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJICAiVW5pbml0aWFsaXplZCBBcmdbJWRdIGF0IG5vZGUgJXBcbiIsCi0JCQkJCQkgIGluZGV4LCBub2RlKSk7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJVbmluaXRpYWxpemVkIEFyZ1slZF0gYXQgbm9kZSAlcFxuIiwgaW5kZXgsIG5vZGUpKTsKIAogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfVU5JTklUSUFMSVpFRF9BUkcpOwogCiAJCQljYXNlIEFNTF9MT0NBTF9PUDoKIAotCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCQkgICJVbmluaXRpYWxpemVkIExvY2FsWyVkXSBhdCBub2RlICVwXG4iLAotCQkJCQkJICBpbmRleCwgbm9kZSkpOworCQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiVW5pbml0aWFsaXplZCBMb2NhbFslZF0gYXQgbm9kZSAlcFxuIiwgaW5kZXgsIG5vZGUpKTsKIAogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfVU5JTklUSUFMSVpFRF9MT0NBTCk7CiAKIAkJCWRlZmF1bHQ6Ci0JCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJOb3QgQXJnL0xvY2FsIG9wY29kZTogJVhcbiIsCi0JCQkJCQkgICBvcGNvZGUpKTsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk5vdCBhIEFyZy9Mb2NhbCBvcGNvZGU6ICVYXG4iLCBvcGNvZGUpKTsKIAkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVEVSTkFMKTsKIAkJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29iamVjdC5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvYmplY3QuYwppbmRleCA4YWMwY2Q5Li5kYzExNmQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29iamVjdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb2JqZWN0LmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC01MSw2ICs1MSw3IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9ESVNQQVRDSEVSCiBBQ1BJX01PRFVMRV9OQU1FKCJkc29iamVjdCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KIHN0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9kc19idWlsZF9pbnRlcm5hbF9vYmplY3Qoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKIAkJCSAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKQEAgLTg1LDcgKzg2LDcgQEAKIAkqb2JqX2Rlc2NfcHRyID0gTlVMTDsKIAlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9JTlRfTkFNRVBBVEhfT1ApIHsKIAkJLyoKLQkJICogVGhpcyBpcyBhbiBuYW1lZCBvYmplY3QgcmVmZXJlbmNlLiAgSWYgdGhpcyBuYW1lIHdhcworCQkgKiBUaGlzIGlzIGEgbmFtZWQgb2JqZWN0IHJlZmVyZW5jZS4gSWYgdGhpcyBuYW1lIHdhcwogCQkgKiBwcmV2aW91c2x5IGxvb2tlZCB1cCBpbiB0aGUgbmFtZXNwYWNlLCBpdCB3YXMgc3RvcmVkIGluIHRoaXMgb3AuCiAJCSAqIE90aGVyd2lzZSwgZ28gYWhlYWQgYW5kIGxvb2sgaXQgdXAgbm93CiAJCSAqLwpAQCAtOTYsMTggKzk3LDQ4IEBACiAJCQkJCQlBQ1BJX0lNT0RFX0VYRUNVVEUsCiAJCQkJCQlBQ1BJX05TX1NFQVJDSF9QQVJFTlQgfAogCQkJCQkJQUNQSV9OU19ET05UX09QRU5fU0NPUEUsIE5VTEwsCi0JCQkJCQkoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiopCi0JCQkJCQkmKG9wLT5jb21tb24ubm9kZSkpOwotCisJCQkJCQlBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSKHN0cnVjdAorCQkJCQkJCQkgICAgICAgYWNwaV9uYW1lc3BhY2Vfbm9kZSwKKwkJCQkJCQkJICAgICAgICYob3AtPgorCQkJCQkJCQkJIGNvbW1vbi4KKwkJCQkJCQkJCSBub2RlKSkpOwogCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJQUNQSV9SRVBPUlRfTlNFUlJPUihvcC0+Y29tbW9uLnZhbHVlLnN0cmluZywKLQkJCQkJCSAgICBzdGF0dXMpOworCQkJCS8qIENoZWNrIGlmIHdlIGFyZSByZXNvbHZpbmcgYSBuYW1lZCByZWZlcmVuY2Ugd2l0aGluIGEgcGFja2FnZSAqLworCisJCQkJaWYgKChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKQorCQkJCSAgICAmJiAoYWNwaV9nYmxfZW5hYmxlX2ludGVycHJldGVyX3NsYWNrKQorCQkJCSAgICAmJgorCQkJCSAgICAoKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PQorCQkJCSAgICAgIEFNTF9QQUNLQUdFX09QKQorCQkJCSAgICAgfHwgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PQorCQkJCQkgQU1MX1ZBUl9QQUNLQUdFX09QKSkpIHsKKwkJCQkJLyoKKwkJCQkJICogV2UgZGlkbid0IGZpbmQgdGhlIHRhcmdldCBhbmQgd2UgYXJlIHBvcHVsYXRpbmcgZWxlbWVudHMKKwkJCQkJICogb2YgYSBwYWNrYWdlIC0gaWdub3JlIGlmIHNsYWNrIGVuYWJsZWQuIFNvbWUgQVNMIGNvZGUKKwkJCQkJICogY29udGFpbnMgZGFuZ2xpbmcgaW52YWxpZCByZWZlcmVuY2VzIGluIHBhY2thZ2VzIGFuZAorCQkJCQkgKiBleHBlY3RzIHRoYXQgbm8gZXhjZXB0aW9uIHdpbGwgYmUgaXNzdWVkLiBMZWF2ZSB0aGUKKwkJCQkJICogZWxlbWVudCBhcyBhIG51bGwgZWxlbWVudC4gSXQgY2Fubm90IGJlIHVzZWQsIGJ1dCBpdAorCQkJCQkgKiBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgc3Vic2VxdWVudCBBU0wgY29kZSAtIHRoaXMgaXMKKwkJCQkJICogdHlwaWNhbGx5IHRoZSBjYXNlLgorCQkJCQkgKi8KKwkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCQkJCSAgIklnbm9yaW5nIHVucmVzb2x2ZWQgcmVmZXJlbmNlIGluIHBhY2thZ2UgWyU0LjRzXVxuIiwKKwkJCQkJCQkgIHdhbGtfc3RhdGUtPgorCQkJCQkJCSAgc2NvcGVfaW5mby0+c2NvcGUuCisJCQkJCQkJICBub2RlLT5uYW1lLmFzY2lpKSk7CisKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwkJCQl9IGVsc2UgeworCQkJCQlBQ1BJX1JFUE9SVF9OU0VSUk9SKG9wLT5jb21tb24udmFsdWUuCisJCQkJCQkJICAgIHN0cmluZywgc3RhdHVzKTsKKwkJCQl9CisKIAkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCX0KIAkJfQogCX0KIAotCS8qIENyZWF0ZSBhbmQgaW5pdCB0aGUgaW50ZXJuYWwgQUNQSSBvYmplY3QgKi8KKwkvKiBDcmVhdGUgYW5kIGluaXQgYSBuZXcgaW50ZXJuYWwgQUNQSSBvYmplY3QgKi8KIAogCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KChhY3BpX3BzX2dldF9vcGNvZGVfaW5mbwogCQkJCQkJICAgKG9wLT5jb21tb24uYW1sX29wY29kZSkpLT4KQEAgLTE1NywxMyArMTg4LDEzIEBACiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19idWlsZF9pbnRlcm5hbF9idWZmZXJfb2JqIik7CiAKKwkvKgorCSAqIElmIHdlIGFyZSBldmFsdWF0aW5nIGEgTmFtZWQgYnVmZmVyIG9iamVjdCAiTmFtZSAoeHh4eCwgQnVmZmVyKSIuCisJICogVGhlIGJ1ZmZlciBvYmplY3QgYWxyZWFkeSBleGlzdHMgKGZyb20gdGhlIE5TIG5vZGUpLCBvdGhlcndpc2UgaXQgbXVzdAorCSAqIGJlIGNyZWF0ZWQuCisJICovCiAJb2JqX2Rlc2MgPSAqb2JqX2Rlc2NfcHRyOwotCWlmIChvYmpfZGVzYykgewotCQkvKgotCQkgKiBXZSBhcmUgZXZhbHVhdGluZyBhIE5hbWVkIGJ1ZmZlciBvYmplY3QgIk5hbWUgKHh4eHgsIEJ1ZmZlcikiLgotCQkgKiBUaGUgYnVmZmVyIG9iamVjdCBhbHJlYWR5IGV4aXN0cyAoZnJvbSB0aGUgTlMgbm9kZSkKLQkJICovCi0JfSBlbHNlIHsKKwlpZiAoIW9ial9kZXNjKSB7CiAJCS8qIENyZWF0ZSBhIG5ldyBidWZmZXIgb2JqZWN0ICovCiAKIAkJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0JVRkZFUik7CkBAIC0xODMsMTAgKzIxNCw3IEBACiAJYnl0ZV9saXN0ID0gYXJnLT5uYW1lZC5uZXh0OwogCWlmIChieXRlX2xpc3QpIHsKIAkJaWYgKGJ5dGVfbGlzdC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0gQU1MX0lOVF9CWVRFTElTVF9PUCkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAiRXhwZWN0aW5nIGJ5dGVsaXN0LCBnb3QgQU1MIG9wY29kZSAlWCBpbiBvcCAlcFxuIiwKLQkJCQkJICBieXRlX2xpc3QtPmNvbW1vbi5hbWxfb3Bjb2RlLAotCQkJCQkgIGJ5dGVfbGlzdCkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJFeHBlY3RpbmcgYnl0ZWxpc3QsIGdvdCBBTUwgb3Bjb2RlICVYIGluIG9wICVwXG4iLCBieXRlX2xpc3QtPmNvbW1vbi5hbWxfb3Bjb2RlLCBieXRlX2xpc3QpKTsKIAogCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKIAkJCXJldHVybiAoQUVfVFlQRSk7CkBAIC0yNTksNyArMjg3LDcgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyA9IE5VTEw7CiAJdTMyIHBhY2thZ2VfbGlzdF9sZW5ndGg7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdTMyIGk7CisJYWNwaV9uYXRpdmVfdWludCBpOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiZHNfYnVpbGRfaW50ZXJuYWxfcGFja2FnZV9vYmoiKTsKIApAQCAtMjcxLDEzICsyOTksMTIgQEAKIAkJcGFyZW50ID0gcGFyZW50LT5jb21tb24ucGFyZW50OwogCX0KIAorCS8qCisJICogSWYgd2UgYXJlIGV2YWx1YXRpbmcgYSBOYW1lZCBwYWNrYWdlIG9iamVjdCAiTmFtZSAoeHh4eCwgUGFja2FnZSkiLAorCSAqIHRoZSBwYWNrYWdlIG9iamVjdCBhbHJlYWR5IGV4aXN0cywgb3RoZXJ3aXNlIGl0IG11c3QgYmUgY3JlYXRlZC4KKwkgKi8KIAlvYmpfZGVzYyA9ICpvYmpfZGVzY19wdHI7Ci0JaWYgKG9ial9kZXNjKSB7Ci0JCS8qCi0JCSAqIFdlIGFyZSBldmFsdWF0aW5nIGEgTmFtZWQgcGFja2FnZSBvYmplY3QgIk5hbWUgKHh4eHgsIFBhY2thZ2UpIi4KLQkJICogR2V0IHRoZSBleGlzdGluZyBwYWNrYWdlIG9iamVjdCBmcm9tIHRoZSBOUyBub2RlCi0JCSAqLwotCX0gZWxzZSB7CisJaWYgKCFvYmpfZGVzYykgewogCQlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfUEFDS0FHRSk7CiAJCSpvYmpfZGVzY19wdHIgPSBvYmpfZGVzYzsKIAkJaWYgKCFvYmpfZGVzYykgewpAQCAtMjkxLDExICszMTgsOSBAQAogCiAJLyogQ291bnQgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgcGFja2FnZSBsaXN0ICovCiAKLQlwYWNrYWdlX2xpc3RfbGVuZ3RoID0gMDsKIAlhcmcgPSBvcC0+Y29tbW9uLnZhbHVlLmFyZzsKIAlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OwotCXdoaWxlIChhcmcpIHsKLQkJcGFja2FnZV9saXN0X2xlbmd0aCsrOworCWZvciAocGFja2FnZV9saXN0X2xlbmd0aCA9IDA7IGFyZzsgcGFja2FnZV9saXN0X2xlbmd0aCsrKSB7CiAJCWFyZyA9IGFyZy0+Y29tbW9uLm5leHQ7CiAJfQogCkBAIC0zMjIsMTIgKzM0NywxMSBAQAogCX0KIAogCS8qCi0JICogTm93IGluaXQgdGhlIGVsZW1lbnRzIG9mIHRoZSBwYWNrYWdlCisJICogSW5pdGlhbGl6ZSBhbGwgZWxlbWVudHMgb2YgdGhlIHBhY2thZ2UKIAkgKi8KLQlpID0gMDsKIAlhcmcgPSBvcC0+Y29tbW9uLnZhbHVlLmFyZzsKIAlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OwotCXdoaWxlIChhcmcpIHsKKwlmb3IgKGkgPSAwOyBhcmc7IGkrKykgewogCQlpZiAoYXJnLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfSU5UX1JFVFVSTl9WQUxVRV9PUCkgewogCQkJLyogT2JqZWN0IChwYWNrYWdlIG9yIGJ1ZmZlcikgaXMgYWxyZWFkeSBidWlsdCAqLwogCkBAIC0zNDAsOCArMzY0LDYgQEAKIAkJCQkJCQkgICAgICAgcGFja2FnZS4KIAkJCQkJCQkgICAgICAgZWxlbWVudHNbaV0pOwogCQl9Ci0KLQkJaSsrOwogCQlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OwogCX0KIApAQCAtNTE4LDkgKzU0MCw3IEBACiAKIAkJCWRlZmF1bHQ6CiAKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJICAiVW5rbm93biBjb25zdGFudCBvcGNvZGUgJVhcbiIsCi0JCQkJCQkgIG9wY29kZSkpOworCQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiVW5rbm93biBjb25zdGFudCBvcGNvZGUgJVhcbiIsIG9wY29kZSkpOwogCQkJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC01MzUsOSArNTU1LDggQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJVbmtub3duIEludGVnZXIgdHlwZSAlWFxuIiwKLQkJCQkJICBvcF9pbmZvLT50eXBlKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVua25vd24gSW50ZWdlciB0eXBlICVYXG4iLAorCQkJCQkgICBvcF9pbmZvLT50eXBlKSk7CiAJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwogCQkJYnJlYWs7CiAJCX0KQEAgLTYxNSw5ICs2MzQsOCBAQAogCiAJZGVmYXVsdDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIlVuaW1wbGVtZW50ZWQgZGF0YSB0eXBlOiAlWFxuIiwKLQkJCQkgIEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVuaW1wbGVtZW50ZWQgZGF0YSB0eXBlOiAlWFxuIiwKKwkJCQkgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpKTsKIAogCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb3Bjb2RlLmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29wY29kZS5jCmluZGV4IDkzOWQxNjcuLjYwNDE0ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb3Bjb2RlLmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvcGNvZGUuYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTQxMyw5ICs0MTMsNyBAQAogCS8qIEhvc3Qgb2JqZWN0IG11c3QgYmUgYSBCdWZmZXIgKi8KIAogCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShidWZmZXJfZGVzYykgIT0gQUNQSV9UWVBFX0JVRkZFUikgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIlRhcmdldCBvZiBDcmVhdGUgRmllbGQgaXMgbm90IGEgQnVmZmVyIG9iamVjdCAtICVzXG4iLAotCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShidWZmZXJfZGVzYykpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJUYXJnZXQgb2YgQ3JlYXRlIEZpZWxkIGlzIG5vdCBhIEJ1ZmZlciBvYmplY3QgLSAlc1xuIiwgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShidWZmZXJfZGVzYykpKTsKIAogCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwogCQlnb3RvIGNsZWFudXA7CkBAIC00MjcsMTAgKzQyNSw5IEBACiAJICogYWZ0ZXIgcmVzb2x1dGlvbiBpbiBhY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMoKS4KIAkgKi8KIAlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKHJlc3VsdF9kZXNjKSAhPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIiglcykgZGVzdGluYXRpb24gbm90IGEgTlMgTm9kZSBbJXNdXG4iLAotCQkJCSAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUoYW1sX29wY29kZSksCi0JCQkJICBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUocmVzdWx0X2Rlc2MpKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiKCVzKSBkZXN0aW5hdGlvbiBub3QgYSBOUyBOb2RlIFslc11cbiIsCisJCQkJICAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUoYW1sX29wY29kZSksCisJCQkJICAgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lKHJlc3VsdF9kZXNjKSkpOwogCiAJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CiAJCWdvdG8gY2xlYW51cDsKQEAgLTQ1Myw4ICs0NTAsNyBAQAogCQkvKiBNdXN0IGhhdmUgYSB2YWxpZCAoPjApIGJpdCBjb3VudCAqLwogCiAJCWlmIChiaXRfY291bnQgPT0gMCkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAiQXR0ZW1wdCB0byBjcmVhdGVfZmllbGQgb2YgbGVuZ3RoIDBcbiIpKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiQXR0ZW1wdCB0byBjcmVhdGVfZmllbGQgb2YgbGVuZ3RoIDBcbiIpKTsKIAkJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1ZBTFVFOwogCQkJZ290byBjbGVhbnVwOwogCQl9CkBAIC01MDcsOSArNTAzLDggQEAKIAogCWRlZmF1bHQ6CiAKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJVbmtub3duIGZpZWxkIGNyZWF0aW9uIG9wY29kZSAlMDJ4XG4iLAotCQkJCSAgYW1sX29wY29kZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVua25vd24gZmllbGQgY3JlYXRpb24gb3Bjb2RlICUwMnhcbiIsCisJCQkJICAgYW1sX29wY29kZSkpOwogCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKIAkJZ290byBjbGVhbnVwOwogCX0KQEAgLTUxNywxMyArNTEyLDcgQEAKIAkvKiBFbnRpcmUgZmllbGQgbXVzdCBmaXQgd2l0aGluIHRoZSBjdXJyZW50IGxlbmd0aCBvZiB0aGUgYnVmZmVyICovCiAKIAlpZiAoKGJpdF9vZmZzZXQgKyBiaXRfY291bnQpID4gKDggKiAodTMyKSBidWZmZXJfZGVzYy0+YnVmZmVyLmxlbmd0aCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJGaWVsZCBbJTQuNHNdIHNpemUgJWQgZXhjZWVkcyBCdWZmZXIgWyU0LjRzXSBzaXplICVkIChiaXRzKVxuIiwKLQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShyZXN1bHRfZGVzYyksCi0JCQkJICBiaXRfb2Zmc2V0ICsgYml0X2NvdW50LAotCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKGJ1ZmZlcl9kZXNjLT5idWZmZXIuCi0JCQkJCQkJbm9kZSksCi0JCQkJICA4ICogKHUzMikgYnVmZmVyX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJGaWVsZCBbJTQuNHNdIHNpemUgJWQgZXhjZWVkcyBCdWZmZXIgWyU0LjRzXSBzaXplICVkIChiaXRzKVxuIiwgYWNwaV91dF9nZXRfbm9kZV9uYW1lKHJlc3VsdF9kZXNjKSwgYml0X29mZnNldCArIGJpdF9jb3VudCwgYWNwaV91dF9nZXRfbm9kZV9uYW1lKGJ1ZmZlcl9kZXNjLT5idWZmZXIubm9kZSksIDggKiAodTMyKSBidWZmZXJfZGVzYy0+YnVmZmVyLmxlbmd0aCkpOwogCQlzdGF0dXMgPSBBRV9BTUxfQlVGRkVSX0xJTUlUOwogCQlnb3RvIGNsZWFudXA7CiAJfQpAQCAtNjI5LDkgKzYxOCwxMCBAQAogCQkJICAgImFmdGVyIGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyIpOwogCiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICIoJXMpIGJhZCBvcGVyYW5kKHMpICglWClcbiIsCi0JCQkJICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvcC0+Y29tbW9uLgotCQkJCQkJCSAgYW1sX29wY29kZSksIHN0YXR1cykpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIiglcykgYmFkIG9wZXJhbmQocykgKCVYKVxuIiwKKwkJCQkgICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvcC0+Y29tbW9uLgorCQkJCQkJCSAgIGFtbF9vcGNvZGUpLAorCQkJCSAgIHN0YXR1cykpOwogCiAJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KQEAgLTExNTUsOSArMTE0NSw4IEBACiAKIAlkZWZhdWx0OgogCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiVW5rbm93biBjb250cm9sIG9wY29kZT0lWCBPcD0lcFxuIiwKLQkJCQkgIG9wLT5jb21tb24uYW1sX29wY29kZSwgb3ApKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJVbmtub3duIGNvbnRyb2wgb3Bjb2RlPSVYIE9wPSVwXG4iLAorCQkJCSAgIG9wLT5jb21tb24uYW1sX29wY29kZSwgb3ApKTsKIAogCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3V0aWxzLmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3V0aWxzLmMKaW5kZXggODNhZTFjMS4uY2Q5YWE3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzdXRpbHMuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0xNzYsOCArMTc2LDggQEAKIAkvKiBNdXN0IGhhdmUgYm90aCBhbiBPcCBhbmQgYSBSZXN1bHQgT2JqZWN0ICovCiAKIAlpZiAoIW9wKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJOdWxsIE9wXG4iKSk7Ci0JCXJldHVybl9WQUxVRShUUlVFKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJOdWxsIE9wXG4iKSk7CisJCXJldHVybl9VSU5UOChUUlVFKTsKIAl9CiAKIAkvKgpAQCAtMjA4LDcgKzIwOCw3IEBACiAJCQkJICAiQXQgTWV0aG9kIGxldmVsLCByZXN1bHQgb2YgWyVzXSBub3QgdXNlZFxuIiwKIAkJCQkgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKG9wLT5jb21tb24uCiAJCQkJCQkJICBhbWxfb3Bjb2RlKSkpOwotCQlyZXR1cm5fVkFMVUUoRkFMU0UpOworCQlyZXR1cm5fVUlOVDgoRkFMU0UpOwogCX0KIAogCS8qIEdldCBpbmZvIG9uIHRoZSBwYXJlbnQuIFRoZSByb290X29wIGlzIEFNTF9TQ09QRSAqLwpAQCAtMjE2LDkgKzIxNiw4IEBACiAJcGFyZW50X2luZm8gPQogCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUpOwogCWlmIChwYXJlbnRfaW5mby0+Y2xhc3MgPT0gQU1MX0NMQVNTX1VOS05PV04pIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJVbmtub3duIHBhcmVudCBvcGNvZGUuIE9wPSVwXG4iLCBvcCkpOwotCQlyZXR1cm5fVkFMVUUoRkFMU0UpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVua25vd24gcGFyZW50IG9wY29kZSBPcD0lcFxuIiwgb3ApKTsKKwkJcmV0dXJuX1VJTlQ4KEZBTFNFKTsKIAl9CiAKIAkvKgpAQCAtMzA0LDcgKzMwMyw3IEBACiAJCQkgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uCiAJCQkJCQkgIGFtbF9vcGNvZGUpLCBvcCkpOwogCi0JcmV0dXJuX1ZBTFVFKFRSVUUpOworCXJldHVybl9VSU5UOChUUlVFKTsKIAogICAgICAgcmVzdWx0X25vdF91c2VkOgogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCkBAIC0zMTMsNyArMzEyLDcgQEAKIAkJCSAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi4KIAkJCQkJCSAgYW1sX29wY29kZSksIG9wKSk7CiAKLQlyZXR1cm5fVkFMVUUoRkFMU0UpOworCXJldHVybl9VSU5UOChGQUxTRSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zNDQsNyArMzQzLDcgQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfZGVsZXRlX3Jlc3VsdF9pZl9ub3RfdXNlZCIsIHJlc3VsdF9vYmopOwogCiAJaWYgKCFvcCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiTnVsbCBPcFxuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk51bGwgT3BcbiIpKTsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCkBAIC02MTYsNyArNjE1LDcgQEAKIAogCQlpZiAob3BfaW5mby0+ZmxhZ3MgJiBBTUxfSEFTX1JFVFZBTCkgewogCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCQkJICAiQXJndW1lbnQgcHJldmlvdXNseSBjcmVhdGVkLCBhbHJlYWR5IHN0YWNrZWQgXG4iKSk7CisJCQkJCSAgIkFyZ3VtZW50IHByZXZpb3VzbHkgY3JlYXRlZCwgYWxyZWFkeSBzdGFja2VkXG4iKSk7CiAKIAkJCUFDUElfREVCVUdHRVJfRVhFQyhhY3BpX2RiX2Rpc3BsYXlfYXJndW1lbnRfb2JqZWN0CiAJCQkJCSAgICh3YWxrX3N0YXRlLT4KQEAgLTYzNSwxMCArNjM0LDcgQEAKIAkJCQkgKiBPbmx5IGVycm9yIGlzIHVuZGVyZmxvdywgYW5kIHRoaXMgaW5kaWNhdGVzCiAJCQkJICogYSBtaXNzaW5nIG9yIG51bGwgb3BlcmFuZCEKIAkJCQkgKi8KLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJICAiTWlzc2luZyBvciBudWxsIG9wZXJhbmQsICVzXG4iLAotCQkJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24KLQkJCQkJCSAgKHN0YXR1cykpKTsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk1pc3Npbmcgb3IgbnVsbCBvcGVyYW5kLCAlc1xuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTczMCw3ICs3MjYsNyBAQAogCSAqLwogCSh2b2lkKWFjcGlfZHNfb2JqX3N0YWNrX3BvcF9hbmRfZGVsZXRlKGFyZ19jb3VudCwgd2Fsa19zdGF0ZSk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiV2hpbGUgY3JlYXRpbmcgQXJnICVkIC0gJXNcbiIsCi0JCQkgIChhcmdfY291bnQgKyAxKSwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKKwlBQ1BJX1JFUE9SVF9FUlJPUigoIldoaWxlIGNyZWF0aW5nIEFyZyAlZCAtICVzXG4iLAorCQkJICAgKGFyZ19jb3VudCArIDEpLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3ZXhlYy5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3ZXhlYy5jCmluZGV4IGU1MjI3NjMuLjVhOWI5MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2V4ZWMuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dleGVjLmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0xMDAsOSArMTAwLDcgQEAKIAlpZiAocmVzdWx0X29iaikgewogCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9wb3AoJm9ial9kZXNjLCB3YWxrX3N0YXRlKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJDb3VsZCBub3QgZ2V0IHJlc3VsdCBmcm9tIHByZWRpY2F0ZSBldmFsdWF0aW9uLCAlc1xuIiwKLQkJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgZ2V0IHJlc3VsdCBmcm9tIHByZWRpY2F0ZSBldmFsdWF0aW9uLCAlc1xuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAogCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KQEAgLTEyMyw5ICsxMjEsOCBAQAogCX0KIAogCWlmICghb2JqX2Rlc2MpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJObyBwcmVkaWNhdGUgb2JqX2Rlc2M9JXAgU3RhdGU9JXBcbiIsCi0JCQkJICBvYmpfZGVzYywgd2Fsa19zdGF0ZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk5vIHByZWRpY2F0ZSBvYmpfZGVzYz0lcCBTdGF0ZT0lcFxuIiwKKwkJCQkgICBvYmpfZGVzYywgd2Fsa19zdGF0ZSkpOwogCiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9fT1BFUkFORCk7CiAJfQpAQCAtMTQwLDEwICsxMzcsNyBAQAogCX0KIAogCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShsb2NhbF9vYmpfZGVzYykgIT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJCYWQgcHJlZGljYXRlIChub3QgYW4gaW50ZWdlcikgb2JqX2Rlc2M9JXAgU3RhdGU9JXAgVHlwZT0lWFxuIiwKLQkJCQkgIG9ial9kZXNjLCB3YWxrX3N0YXRlLAotCQkJCSAgQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQmFkIHByZWRpY2F0ZSAobm90IGFuIGludGVnZXIpIG9ial9kZXNjPSVwIFN0YXRlPSVwIFR5cGU9JVhcbiIsIG9ial9kZXNjLCB3YWxrX3N0YXRlLCBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpKTsKIAogCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwogCQlnb3RvIGNsZWFudXA7CkBAIC0zMTQsMTIgKzMwOCwxMyBAQAogCiAJY2FzZSBBTUxfQ0xBU1NfRVhFQ1VURToKIAljYXNlIEFNTF9DTEFTU19DUkVBVEU6Ci0KIAkJLyoKIAkJICogTW9zdCBvcGVyYXRvcnMgd2l0aCBhcmd1bWVudHMuCiAJCSAqIFN0YXJ0IGEgbmV3IHJlc3VsdC9vcGVyYW5kIHN0YXRlCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9zdGFja19wdXNoKHdhbGtfc3RhdGUpOworCQlpZiAod2Fsa19zdGF0ZS0+b3Bjb2RlICE9IEFNTF9DUkVBVEVfRklFTERfT1ApIHsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3N0YWNrX3B1c2god2Fsa19zdGF0ZSk7CisJCX0KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMzYxLDggKzM1Niw4IEBACiAJb3BfY2xhc3MgPSB3YWxrX3N0YXRlLT5vcF9pbmZvLT5jbGFzczsKIAogCWlmIChvcF9jbGFzcyA9PSBBTUxfQ0xBU1NfVU5LTk9XTikgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiVW5rbm93biBvcGNvZGUgJVhcbiIsCi0JCQkJICBvcC0+Y29tbW9uLmFtbF9vcGNvZGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJVbmtub3duIG9wY29kZSAlWFxuIiwKKwkJCQkgICBvcC0+Y29tbW9uLmFtbF9vcGNvZGUpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9JTVBMRU1FTlRFRCk7CiAJfQogCkBAIC00NTIsMTIgKzQ0Nyw3IEBACiAJCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMV0tPnJlZmVyZW5jZS5vZmZzZXQpKSB7CiAJCQkJc3RhdHVzID0gQUVfT0s7CiAJCQl9IGVsc2UgewotCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCQkgICJbJXNdOiBDb3VsZCBub3QgcmVzb2x2ZSBvcGVyYW5kcywgJXNcbiIsCi0JCQkJCQkgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lCi0JCQkJCQkgICh3YWxrX3N0YXRlLT5vcGNvZGUpLAotCQkJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24KLQkJCQkJCSAgKHN0YXR1cykpKTsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlslc106IENvdWxkIG5vdCByZXNvbHZlIG9wZXJhbmRzLCAlc1xuIiwgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+b3Bjb2RlKSwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAkJCX0KIAkJfQogCkBAIC02NzYsOCArNjY2LDggQEAKIAogCQljYXNlIEFNTF9UWVBFX1VOREVGSU5FRDoKIAotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAiVW5kZWZpbmVkIG9wY29kZSB0eXBlIE9wPSVwXG4iLCBvcCkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJVbmRlZmluZWQgb3Bjb2RlIHR5cGUgT3A9JXBcbiIsCisJCQkJCSAgIG9wKSk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0lNUExFTUVOVEVEKTsKIAogCQljYXNlIEFNTF9UWVBFX0JPR1VTOgpAQCAtNjg5LDEwICs2NzksNyBAQAogCiAJCWRlZmF1bHQ6CiAKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgIlVuaW1wbGVtZW50ZWQgb3Bjb2RlLCBjbGFzcz0lWCB0eXBlPSVYIE9wY29kZT0lWCBPcD0lcFxuIiwKLQkJCQkJICBvcF9jbGFzcywgb3BfdHlwZSwKLQkJCQkJICBvcC0+Y29tbW9uLmFtbF9vcGNvZGUsIG9wKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVuaW1wbGVtZW50ZWQgb3Bjb2RlLCBjbGFzcz0lWCB0eXBlPSVYIE9wY29kZT0lWCBPcD0lcFxuIiwgb3BfY2xhc3MsIG9wX3R5cGUsIG9wLT5jb21tb24uYW1sX29wY29kZSwgb3ApKTsKIAogCQkJc3RhdHVzID0gQUVfTk9UX0lNUExFTUVOVEVEOwogCQkJYnJlYWs7CkBAIC03MjMsMjAgKzcxMCw2IEBACiAKICAgICAgIGNsZWFudXA6CiAKLQkvKiBJbnZva2UgZXhjZXB0aW9uIGhhbmRsZXIgb24gZXJyb3IgKi8KLQotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSAmJgotCSAgICBhY3BpX2dibF9leGNlcHRpb25faGFuZGxlciAmJiAhKHN0YXR1cyAmIEFFX0NPREVfQ09OVFJPTCkpIHsKLQkJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7Ci0JCXN0YXR1cyA9IGFjcGlfZ2JsX2V4Y2VwdGlvbl9oYW5kbGVyKHN0YXR1cywKLQkJCQkJCSAgICB3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZS0+Ci0JCQkJCQkgICAgbmFtZS5pbnRlZ2VyLAotCQkJCQkJICAgIHdhbGtfc3RhdGUtPm9wY29kZSwKLQkJCQkJCSAgICB3YWxrX3N0YXRlLT5hbWxfb2Zmc2V0LAotCQkJCQkJICAgIE5VTEwpOwotCQkodm9pZClhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7Ci0JfQotCiAJaWYgKHdhbGtfc3RhdGUtPnJlc3VsdF9vYmopIHsKIAkJLyogQnJlYWsgdG8gZGVidWdnZXIgdG8gZGlzcGxheSByZXN1bHQgKi8KIApAQCAtNzU4LDE4ICs3MzEsMTQgQEAKIAl9CiAjZW5kaWYKIAorCS8qIEludm9rZSBleGNlcHRpb24gaGFuZGxlciBvbiBlcnJvciAqLworCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2Vycm9yKHN0YXR1cywgd2Fsa19zdGF0ZSk7CisJfQorCiAJLyogQWx3YXlzIGNsZWFyIHRoZSBvYmplY3Qgc3RhY2sgKi8KIAogCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9IDA7Ci0KLSNpZmRlZiBBQ1BJX0RJU0FTU0VNQkxFUgotCi0JLyogT24gZXJyb3IsIGRpc3BsYXkgbWV0aG9kIGxvY2Fscy9hcmdzICovCi0KLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJYWNwaV9kbV9kdW1wX21ldGhvZF9pbmZvKHN0YXR1cywgd2Fsa19zdGF0ZSwgb3ApOwotCX0KLSNlbmRpZgotCiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dsb2FkLmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dsb2FkLmMKaW5kZXggNDExNzMxMi4uNGNhZDZhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3bG9hZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2xvYWQuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTEyNyw3ICsxMjcsNyBAQAogCWNoYXIgKnBhdGg7CiAJdTMyIGZsYWdzOwogCi0JQUNQSV9GVU5DVElPTl9OQU1FKCJkc19sb2FkMV9iZWdpbl9vcCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX2xvYWQxX2JlZ2luX29wIik7CiAKIAlvcCA9IHdhbGtfc3RhdGUtPm9wOwogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsICJPcD0lcCBTdGF0ZT0lcFxuIiwgb3AsCkBAIC0xMzgsMTQgKzEzOCwxNCBAQAogCWlmIChvcCkgewogCQlpZiAoISh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9OQU1FRCkpIHsKIAkJCSpvdXRfb3AgPSBvcDsKLQkJCXJldHVybiAoQUVfT0spOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAkJfQogCiAJCS8qIENoZWNrIGlmIHRoaXMgb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gaW5zdGFsbGVkIGluIHRoZSBuYW1lc3BhY2UgKi8KIAogCQlpZiAob3AtPmNvbW1vbi5ub2RlKSB7CiAJCQkqb3V0X29wID0gb3A7Ci0JCQlyZXR1cm4gKEFFX09LKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJCX0KIAl9CiAKQEAgLTE4OCw3ICsxODgsNyBAQAogI2VuZGlmCiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJQUNQSV9SRVBPUlRfTlNFUlJPUihwYXRoLCBzdGF0dXMpOwotCQkJcmV0dXJuIChzdGF0dXMpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAogCQkvKgpAQCAtMjM1LDcgKzIzNSw3IEBACiAKIAkJCUFDUElfUkVQT1JUX0VSUk9SKCgiSW52YWxpZCB0eXBlICglcykgZm9yIHRhcmdldCBvZiBTY29wZSBvcGVyYXRvciBbJTQuNHNdIChDYW5ub3Qgb3ZlcnJpZGUpXG4iLCBhY3BpX3V0X2dldF90eXBlX25hbWUobm9kZS0+dHlwZSksIHBhdGgpKTsKIAotCQkJcmV0dXJuIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJfQogCQlicmVhazsKIApAQCAtMjU3LDYgKzI1Nyw3IEBACiAJCSAqICAgICAgIGJ1ZmZlcl9maWVsZCwgb3IgUGFja2FnZSksIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgaXMgYWxyZWFkeQogCQkgKiAgICAgICBpbiB0aGUgbmFtZXNwYWNlLgogCQkgKi8KKwogCQlpZiAod2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZSkgewogCQkJLyogVGhpcyBuYW1lIGlzIGFscmVhZHkgaW4gdGhlIG5hbWVzcGFjZSwgZ2V0IHRoZSBub2RlICovCiAKQEAgLTI2NSw2ICsyNjYsMTYgQEAKIAkJCWJyZWFrOwogCQl9CiAKKwkJLyoKKwkJICogSWYgd2UgYXJlIGV4ZWN1dGluZyBhIG1ldGhvZCwgZG8gbm90IGNyZWF0ZSBhbnkgbmFtZXNwYWNlIG9iamVjdHMKKwkJICogZHVyaW5nIHRoZSBsb2FkIHBoYXNlLCBvbmx5IGR1cmluZyBleGVjdXRpb24uCisJCSAqLworCQlpZiAod2Fsa19zdGF0ZS0+bWV0aG9kX25vZGUpIHsKKwkJCW5vZGUgPSBOVUxMOworCQkJc3RhdHVzID0gQUVfT0s7CisJCQlicmVhazsKKwkJfQorCiAJCWZsYWdzID0gQUNQSV9OU19OT19VUFNFQVJDSDsKIAkJaWYgKCh3YWxrX3N0YXRlLT5vcGNvZGUgIT0gQU1MX1NDT1BFX09QKSAmJgogCQkgICAgKCEod2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgJiBBQ1BJX1BBUlNFX0RFRkVSUkVEX09QKSkpIHsKQEAgLTI5MCw3ICszMDEsNyBAQAogCQkJCSAgICYobm9kZSkpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCUFDUElfUkVQT1JUX05TRVJST1IocGF0aCwgc3RhdHVzKTsKLQkJCXJldHVybiAoc3RhdHVzKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJCWJyZWFrOwogCX0KQEAgLTMwMiwyOCArMzEzLDI5IEBACiAKIAkJb3AgPSBhY3BpX3BzX2FsbG9jX29wKHdhbGtfc3RhdGUtPm9wY29kZSk7CiAJCWlmICghb3ApIHsKLQkJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQl9CiAJfQogCi0JLyogSW5pdGlhbGl6ZSAqLwotCi0Jb3AtPm5hbWVkLm5hbWUgPSBub2RlLT5uYW1lLmludGVnZXI7CisJLyogSW5pdGlhbGl6ZSB0aGUgb3AgKi8KIAogI2lmIChkZWZpbmVkIChBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04pIHx8IGRlZmluZWQgKEFDUElfQ09OU1RBTlRfRVZBTF9PTkxZKSkKLQlvcC0+bmFtZWQucGF0aCA9ICh1OCAqKSBwYXRoOworCW9wLT5uYW1lZC5wYXRoID0gQUNQSV9DQVNUX1BUUih1OCwgcGF0aCk7CiAjZW5kaWYKIAotCS8qCi0JICogUHV0IHRoZSBOb2RlIGluIHRoZSAib3AiIG9iamVjdCB0aGF0IHRoZSBwYXJzZXIgdXNlcywgc28gd2UKLQkgKiBjYW4gZ2V0IGl0IGFnYWluIHF1aWNrbHkgd2hlbiB0aGlzIHNjb3BlIGlzIGNsb3NlZAotCSAqLwotCW9wLT5jb21tb24ubm9kZSA9IG5vZGU7CisJaWYgKG5vZGUpIHsKKwkJLyoKKwkJICogUHV0IHRoZSBOb2RlIGluIHRoZSAib3AiIG9iamVjdCB0aGF0IHRoZSBwYXJzZXIgdXNlcywgc28gd2UKKwkJICogY2FuIGdldCBpdCBhZ2FpbiBxdWlja2x5IHdoZW4gdGhpcyBzY29wZSBpcyBjbG9zZWQKKwkJICovCisJCW9wLT5jb21tb24ubm9kZSA9IG5vZGU7CisJCW9wLT5uYW1lZC5uYW1lID0gbm9kZS0+bmFtZS5pbnRlZ2VyOworCX0KKwogCWFjcGlfcHNfYXBwZW5kX2FyZyhhY3BpX3BzX2dldF9wYXJlbnRfc2NvcGUoJndhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSksCiAJCQkgICBvcCk7Ci0KIAkqb3V0X29wID0gb3A7Ci0JcmV0dXJuIChzdGF0dXMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzM5LDEzICszNTEsMTMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cyBhY3BpX2RzX2xvYWQxX2VuZF9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSkKK2FjcGlfc3RhdHVzIGFjcGlfZHNfbG9hZDFfZW5kX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7CiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOwogCWFjcGlfb2JqZWN0X3R5cGUgb2JqZWN0X3R5cGU7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoImRzX2xvYWQxX2VuZF9vcCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX2xvYWQxX2VuZF9vcCIpOwogCiAJb3AgPSB3YWxrX3N0YXRlLT5vcDsKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILCAiT3A9JXAgU3RhdGU9JXBcbiIsIG9wLApAQCAtMzU0LDcgKzM2Niw3IEBACiAJLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBvcGNvZGVzIHRoYXQgaGF2ZSBhbiBhc3NvY2lhdGVkIG5hbWUgKi8KIAogCWlmICghKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgKEFNTF9OQU1FRCB8IEFNTF9GSUVMRCkpKSB7Ci0JCXJldHVybiAoQUVfT0spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qIEdldCB0aGUgb2JqZWN0IHR5cGUgdG8gZGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBwb3AgdGhlIHNjb3BlICovCkBAIC0zNjMsMjEgKzM3NSwzNyBAQAogCiAjaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgogCWlmICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9GSUVMRCkgewotCQlpZiAod2Fsa19zdGF0ZS0+b3Bjb2RlID09IEFNTF9GSUVMRF9PUCB8fAotCQkgICAgd2Fsa19zdGF0ZS0+b3Bjb2RlID09IEFNTF9CQU5LX0ZJRUxEX09QIHx8Ci0JCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUgPT0gQU1MX0lOREVYX0ZJRUxEX09QKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX2RzX2luaXRfZmllbGRfb2JqZWN0cyhvcCwgd2Fsa19zdGF0ZSk7CisJCS8qCisJCSAqIElmIHdlIGFyZSBleGVjdXRpbmcgYSBtZXRob2QsIGRvIG5vdCBjcmVhdGUgYW55IG5hbWVzcGFjZSBvYmplY3RzCisJCSAqIGR1cmluZyB0aGUgbG9hZCBwaGFzZSwgb25seSBkdXJpbmcgZXhlY3V0aW9uLgorCQkgKi8KKwkJaWYgKCF3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSkgeworCQkJaWYgKHdhbGtfc3RhdGUtPm9wY29kZSA9PSBBTUxfRklFTERfT1AgfHwKKwkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUgPT0gQU1MX0JBTktfRklFTERfT1AgfHwKKwkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUgPT0gQU1MX0lOREVYX0ZJRUxEX09QKSB7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9kc19pbml0X2ZpZWxkX29iamVjdHMob3AsIHdhbGtfc3RhdGUpOworCQkJfQogCQl9Ci0JCXJldHVybiAoc3RhdHVzKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUkVHSU9OX09QKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX3JlZ2lvbihvcC0+bmFtZWQuZGF0YSwgb3AtPm5hbWVkLmxlbmd0aCwKLQkJCQkJICAgICAgIChhY3BpX2Fkcl9zcGFjZV90eXBlKQotCQkJCQkgICAgICAgKChvcC0+Y29tbW9uLnZhbHVlLmFyZyktPmNvbW1vbi4KLQkJCQkJCXZhbHVlLmludGVnZXIpLCB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm4gKHN0YXR1cyk7CisJLyoKKwkgKiBJZiB3ZSBhcmUgZXhlY3V0aW5nIGEgbWV0aG9kLCBkbyBub3QgY3JlYXRlIGFueSBuYW1lc3BhY2Ugb2JqZWN0cworCSAqIGR1cmluZyB0aGUgbG9hZCBwaGFzZSwgb25seSBkdXJpbmcgZXhlY3V0aW9uLgorCSAqLworCWlmICghd2Fsa19zdGF0ZS0+bWV0aG9kX25vZGUpIHsKKwkJaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUkVHSU9OX09QKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXhfY3JlYXRlX3JlZ2lvbihvcC0+bmFtZWQuZGF0YSwKKwkJCQkJCSAgb3AtPm5hbWVkLmxlbmd0aCwKKwkJCQkJCSAgKGFjcGlfYWRyX3NwYWNlX3R5cGUpCisJCQkJCQkgICgob3AtPmNvbW1vbi52YWx1ZS5hcmcpLT4KKwkJCQkJCSAgIGNvbW1vbi52YWx1ZS5pbnRlZ2VyKSwKKwkJCQkJCSAgd2Fsa19zdGF0ZSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCX0KIAkJfQogCX0KICNlbmRpZgpAQCAtMzkxLDQ3ICs0MTksNjMgQEAKIAkJCQkJCQkgICAgICAgY29tbW9uLgogCQkJCQkJCSAgICAgICBhbWxfb3Bjb2RlKSktPgogCQkJICAgIG9iamVjdF90eXBlOwotCQkJb3AtPmNvbW1vbi5ub2RlLT50eXBlID0gKHU4KSBvYmplY3RfdHlwZTsKLQkJfQotCX0KIAotCWlmIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX01FVEhPRF9PUCkgewotCQkvKgotCQkgKiBtZXRob2Rfb3AgcGtnX2xlbmd0aCBuYW1lX3N0cmluZyBtZXRob2RfZmxhZ3MgdGVybV9saXN0Ci0JCSAqCi0JCSAqIE5vdGU6IFdlIG11c3QgY3JlYXRlIHRoZSBtZXRob2Qgbm9kZS9vYmplY3QgcGFpciBhcyBzb29uIGFzIHdlCi0JCSAqIHNlZSB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uLiAgVGhpcyBhbGxvd3MgbGF0ZXIgcGFzczEgcGFyc2luZwotCQkgKiBvZiBpbnZvY2F0aW9ucyBvZiB0aGUgbWV0aG9kIChuZWVkIHRvIGtub3cgdGhlIG51bWJlciBvZgotCQkgKiBhcmd1bWVudHMuKQotCQkgKi8KLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCQkgICJMT0FESU5HLU1ldGhvZDogU3RhdGU9JXAgT3A9JXAgbmFtZWRfb2JqPSVwXG4iLAotCQkJCSAgd2Fsa19zdGF0ZSwgb3AsIG9wLT5uYW1lZC5ub2RlKSk7CisJCQkvKiBTZXQgbm9kZSB0eXBlIGlmIHdlIGhhdmUgYSBuYW1lc3BhY2Ugbm9kZSAqLwogCi0JCWlmICghYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG9wLT5uYW1lZC5ub2RlKSkgewotCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPSAodm9pZCAqKW9wLT5uYW1lZC5ub2RlOwotCQkJd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID0gMTsKLQotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kcyh3YWxrX3N0YXRlLAotCQkJCQkJICAgIG9wLT5jb21tb24udmFsdWUuYXJnKTsKLQkJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQkJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX21ldGhvZChvcC0+bmFtZWQuZGF0YSwKLQkJCQkJCQkgICAgICAgb3AtPm5hbWVkLmxlbmd0aCwKLQkJCQkJCQkgICAgICAgd2Fsa19zdGF0ZSk7Ci0JCQl9Ci0JCQl3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSA9IE5VTEw7Ci0JCQl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPSAwOwotCi0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlyZXR1cm4gKHN0YXR1cyk7CisJCQlpZiAob3AtPmNvbW1vbi5ub2RlKSB7CisJCQkJb3AtPmNvbW1vbi5ub2RlLT50eXBlID0gKHU4KSBvYmplY3RfdHlwZTsKIAkJCX0KIAkJfQogCX0KIAotCS8qIFBvcCB0aGUgc2NvcGUgc3RhY2sgKi8KKwkvKgorCSAqIElmIHdlIGFyZSBleGVjdXRpbmcgYSBtZXRob2QsIGRvIG5vdCBjcmVhdGUgYW55IG5hbWVzcGFjZSBvYmplY3RzCisJICogZHVyaW5nIHRoZSBsb2FkIHBoYXNlLCBvbmx5IGR1cmluZyBleGVjdXRpb24uCisJICovCisJaWYgKCF3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSkgeworCQlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9NRVRIT0RfT1ApIHsKKwkJCS8qCisJCQkgKiBtZXRob2Rfb3AgcGtnX2xlbmd0aCBuYW1lX3N0cmluZyBtZXRob2RfZmxhZ3MgdGVybV9saXN0CisJCQkgKgorCQkJICogTm90ZTogV2UgbXVzdCBjcmVhdGUgdGhlIG1ldGhvZCBub2RlL29iamVjdCBwYWlyIGFzIHNvb24gYXMgd2UKKwkJCSAqIHNlZSB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uLiAgVGhpcyBhbGxvd3MgbGF0ZXIgcGFzczEgcGFyc2luZworCQkJICogb2YgaW52b2NhdGlvbnMgb2YgdGhlIG1ldGhvZCAobmVlZCB0byBrbm93IHRoZSBudW1iZXIgb2YKKwkJCSAqIGFyZ3VtZW50cy4pCisJCQkgKi8KKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJCSAgIkxPQURJTkctTWV0aG9kOiBTdGF0ZT0lcCBPcD0lcCBuYW1lZF9vYmo9JXBcbiIsCisJCQkJCSAgd2Fsa19zdGF0ZSwgb3AsIG9wLT5uYW1lZC5ub2RlKSk7CiAKLQlpZiAoYWNwaV9uc19vcGVuc19zY29wZShvYmplY3RfdHlwZSkpIHsKKwkJCWlmICghYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG9wLT5uYW1lZC5ub2RlKSkgeworCQkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdID0KKwkJCQkgICAgQUNQSV9DQVNUX1BUUih2b2lkLCBvcC0+bmFtZWQubm9kZSk7CisJCQkJd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID0gMTsKKworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfZHNfY3JlYXRlX29wZXJhbmRzKHdhbGtfc3RhdGUsCisJCQkJCQkJICAgIG9wLT5jb21tb24udmFsdWUuCisJCQkJCQkJICAgIGFyZyk7CisJCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJCXN0YXR1cyA9CisJCQkJCSAgICBhY3BpX2V4X2NyZWF0ZV9tZXRob2Qob3AtPm5hbWVkLgorCQkJCQkJCQkgIGRhdGEsCisJCQkJCQkJCSAgb3AtPm5hbWVkLgorCQkJCQkJCQkgIGxlbmd0aCwKKwkJCQkJCQkJICB3YWxrX3N0YXRlKTsKKwkJCQl9CisJCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPSBOVUxMOworCQkJCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9IDA7CisKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyogUG9wIHRoZSBzY29wZSBzdGFjayAob25seSBpZiBsb2FkaW5nIGEgdGFibGUpICovCisKKwlpZiAoIXdhbGtfc3RhdGUtPm1ldGhvZF9ub2RlICYmIGFjcGlfbnNfb3BlbnNfc2NvcGUob2JqZWN0X3R5cGUpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCiAJCQkJICAiKCVzKTogUG9wcGluZyBzY29wZSBmb3IgT3AgJXBcbiIsCiAJCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUob2JqZWN0X3R5cGUpLCBvcCkpOwpAQCAtNDM5LDcgKzQ4Myw3IEBACiAJCXN0YXR1cyA9IGFjcGlfZHNfc2NvcGVfc3RhY2tfcG9wKHdhbGtfc3RhdGUpOwogCX0KIAotCXJldHVybiAoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQ1Niw4ICs1MDAsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfbG9hZDJfYmVnaW5fb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUsCi0JCSAgICAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqKiBvdXRfb3ApCithY3BpX2RzX2xvYWQyX2JlZ2luX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqKm91dF9vcCkKIHsKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7CiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CkBAIC04NDAsNiArODg0LDEzIEBACiAKIAljYXNlIEFNTF9UWVBFX05BTUVEX0ZJRUxEOgogCisJCS8qCisJCSAqIElmIHdlIGFyZSBleGVjdXRpbmcgYSBtZXRob2QsIGluaXRpYWxpemUgdGhlIGZpZWxkCisJCSAqLworCQlpZiAod2Fsa19zdGF0ZS0+bWV0aG9kX25vZGUpIHsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9maWVsZF9vYmplY3RzKG9wLCB3YWxrX3N0YXRlKTsKKwkJfQorCiAJCXN3aXRjaCAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSB7CiAJCWNhc2UgQU1MX0lOREVYX0ZJRUxEX09QOgogCkBAIC05MjksNiArOTgwLDI0IEBACiAJCXN3aXRjaCAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSB7CiAjaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgogCQljYXNlIEFNTF9SRUdJT05fT1A6CisKKwkJCS8qCisJCQkgKiBJZiB3ZSBhcmUgZXhlY3V0aW5nIGEgbWV0aG9kLCBpbml0aWFsaXplIHRoZSByZWdpb24KKwkJCSAqLworCQkJaWYgKHdhbGtfc3RhdGUtPm1ldGhvZF9ub2RlKSB7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9leF9jcmVhdGVfcmVnaW9uKG9wLT5uYW1lZC5kYXRhLAorCQkJCQkJCSAgb3AtPm5hbWVkLmxlbmd0aCwKKwkJCQkJCQkgIChhY3BpX2Fkcl9zcGFjZV90eXBlKQorCQkJCQkJCSAgKChvcC0+Y29tbW9uLnZhbHVlLgorCQkJCQkJCSAgICBhcmcpLT5jb21tb24udmFsdWUuCisJCQkJCQkJICAgaW50ZWdlciksCisJCQkJCQkJICB3YWxrX3N0YXRlKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJcmV0dXJuIChzdGF0dXMpOworCQkJCX0KKwkJCX0KKwogCQkJLyoKIAkJCSAqIFRoZSBvcF9yZWdpb24gaXMgbm90IGZ1bGx5IHBhcnNlZCBhdCB0aGlzIHRpbWUuIE9ubHkgdmFsaWQKIAkJCSAqIGFyZ3VtZW50IGlzIHRoZSBzcGFjZV9pZC4gKFdlIG11c3Qgc2F2ZSB0aGUgYWRkcmVzcyBvZiB0aGUKQEAgLTk1NywxMSArMTAyNiw1MCBAQAogCiAJCQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9ub2RlKHdhbGtfc3RhdGUsIG5vZGUsIG9wKTsKIAkJCWJyZWFrOworCisJCWNhc2UgQU1MX01FVEhPRF9PUDoKKwkJCS8qCisJCQkgKiBtZXRob2Rfb3AgcGtnX2xlbmd0aCBuYW1lX3N0cmluZyBtZXRob2RfZmxhZ3MgdGVybV9saXN0CisJCQkgKgorCQkJICogTm90ZTogV2UgbXVzdCBjcmVhdGUgdGhlIG1ldGhvZCBub2RlL29iamVjdCBwYWlyIGFzIHNvb24gYXMgd2UKKwkJCSAqIHNlZSB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uLiAgVGhpcyBhbGxvd3MgbGF0ZXIgcGFzczEgcGFyc2luZworCQkJICogb2YgaW52b2NhdGlvbnMgb2YgdGhlIG1ldGhvZCAobmVlZCB0byBrbm93IHRoZSBudW1iZXIgb2YKKwkJCSAqIGFyZ3VtZW50cy4pCisJCQkgKi8KKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJCSAgIkxPQURJTkctTWV0aG9kOiBTdGF0ZT0lcCBPcD0lcCBuYW1lZF9vYmo9JXBcbiIsCisJCQkJCSAgd2Fsa19zdGF0ZSwgb3AsIG9wLT5uYW1lZC5ub2RlKSk7CisKKwkJCWlmICghYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG9wLT5uYW1lZC5ub2RlKSkgeworCQkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdID0KKwkJCQkgICAgQUNQSV9DQVNUX1BUUih2b2lkLCBvcC0+bmFtZWQubm9kZSk7CisJCQkJd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID0gMTsKKworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfZHNfY3JlYXRlX29wZXJhbmRzKHdhbGtfc3RhdGUsCisJCQkJCQkJICAgIG9wLT5jb21tb24udmFsdWUuCisJCQkJCQkJICAgIGFyZyk7CisJCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJCXN0YXR1cyA9CisJCQkJCSAgICBhY3BpX2V4X2NyZWF0ZV9tZXRob2Qob3AtPm5hbWVkLgorCQkJCQkJCQkgIGRhdGEsCisJCQkJCQkJCSAgb3AtPm5hbWVkLgorCQkJCQkJCQkgIGxlbmd0aCwKKwkJCQkJCQkJICB3YWxrX3N0YXRlKTsKKwkJCQl9CisJCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPSBOVUxMOworCQkJCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9IDA7CisKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKICNlbmRpZgkJCQkvKiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04gKi8KIAogCQlkZWZhdWx0OgogCQkJLyogQWxsIE5BTUVEX0NPTVBMRVggb3Bjb2RlcyBtdXN0IGJlIGhhbmRsZWQgYWJvdmUgKi8KLQkJCS8qIE5vdGU6IE1ldGhvZCBvYmplY3RzIHdlcmUgYWxyZWFkeSBjcmVhdGVkIGluIFBhc3MgMSAqLwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzY29wZS5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c2NvcGUuYwppbmRleCBkZWZlOTU2Li5lN2ZjODhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzY29wZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd3Njb3BlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0xMDcsMTQgKzEwNywxNCBAQAogCWlmICghbm9kZSkgewogCQkvKiBJbnZhbGlkIHNjb3BlICAgKi8KIAotCQlBQ1BJX1JFUE9SVF9FUlJPUigoImRzX3Njb3BlX3N0YWNrX3B1c2g6IG51bGwgc2NvcGUgcGFzc2VkXG4iKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTnVsbCBzY29wZSBwYXJhbWV0ZXJcbiIpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCS8qIE1ha2Ugc3VyZSBvYmplY3QgdHlwZSBpcyB2YWxpZCAqLwogCiAJaWYgKCFhY3BpX3V0X3ZhbGlkX29iamVjdF90eXBlKHR5cGUpKSB7Ci0JCUFDUElfUkVQT1JUX1dBUk5JTkcoKCJkc19zY29wZV9zdGFja19wdXNoOiBJbnZhbGlkIG9iamVjdCB0eXBlOiAweCVYXG4iLCB0eXBlKSk7CisJCUFDUElfUkVQT1JUX1dBUk5JTkcoKCJJbnZhbGlkIG9iamVjdCB0eXBlOiAweCVYXG4iLCB0eXBlKSk7CiAJfQogCiAJLyogQWxsb2NhdGUgYSBuZXcgc2NvcGUgb2JqZWN0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzdGF0ZS5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c3RhdGUuYwppbmRleCA3ZDY4YTVhLi42MWFhZTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzdGF0ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd3N0YXRlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC05MiwyNiArOTIsMjMgQEAKIAogCXN0YXRlID0gd2Fsa19zdGF0ZS0+cmVzdWx0czsKIAlpZiAoIXN0YXRlKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiTm8gcmVzdWx0IG9iamVjdCBwdXNoZWQhIFN0YXRlPSVwXG4iLAotCQkJCSAgd2Fsa19zdGF0ZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk5vIHJlc3VsdCBvYmplY3QgcHVzaGVkISBTdGF0ZT0lcFxuIiwKKwkJCQkgICB3YWxrX3N0YXRlKSk7CiAJCXJldHVybiAoQUVfTk9UX0VYSVNUKTsKIAl9CiAKIAlpZiAoaW5kZXggPj0gQUNQSV9PQkpfTUFYX09QRVJBTkQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJJbmRleCBvdXQgb2YgcmFuZ2U6ICVYIFN0YXRlPSVwIE51bT0lWFxuIiwKLQkJCQkgIGluZGV4LCB3YWxrX3N0YXRlLAotCQkJCSAgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJJbmRleCBvdXQgb2YgcmFuZ2U6ICVYIFN0YXRlPSVwIE51bT0lWFxuIiwKKwkJCQkgICBpbmRleCwgd2Fsa19zdGF0ZSwKKwkJCQkgICBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cykpOwogCX0KIAogCS8qIENoZWNrIGZvciBhIHZhbGlkIHJlc3VsdCBvYmplY3QgKi8KIAogCWlmICghc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2NbaW5kZXhdKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiTnVsbCBvcGVyYW5kISBTdGF0ZT0lcCAjT3BzPSVYLCBJbmRleD0lWFxuIiwKLQkJCQkgIHdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzLAotCQkJCSAgaW5kZXgpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJOdWxsIG9wZXJhbmQhIFN0YXRlPSVwICNPcHM9JVgsIEluZGV4PSVYXG4iLAorCQkJCSAgIHdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzLAorCQkJCSAgIGluZGV4KSk7CiAJCXJldHVybiAoQUVfQU1MX05PX1JFVFVSTl9WQUxVRSk7CiAJfQogCkBAIC0xNjMsOSArMTYwLDggQEAKIAl9CiAKIAlpZiAoIXN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiUmVzdWx0IHN0YWNrIGlzIGVtcHR5ISBTdGF0ZT0lcFxuIiwKLQkJCQkgIHdhbGtfc3RhdGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJSZXN1bHQgc3RhY2sgaXMgZW1wdHkhIFN0YXRlPSVwXG4iLAorCQkJCSAgIHdhbGtfc3RhdGUpKTsKIAkJcmV0dXJuIChBRV9BTUxfTk9fUkVUVVJOX1ZBTFVFKTsKIAl9CiAKQEAgLTE5Miw4ICsxODgsNyBAQAogCQl9CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCSAgIk5vIHJlc3VsdCBvYmplY3RzISBTdGF0ZT0lcFxuIiwgd2Fsa19zdGF0ZSkpOworCUFDUElfUkVQT1JUX0VSUk9SKCgiTm8gcmVzdWx0IG9iamVjdHMhIFN0YXRlPSVwXG4iLCB3YWxrX3N0YXRlKSk7CiAJcmV0dXJuIChBRV9BTUxfTk9fUkVUVVJOX1ZBTFVFKTsKIH0KIApAQCAtMjIyLDE1ICsyMTcsMTQgQEAKIAogCXN0YXRlID0gd2Fsa19zdGF0ZS0+cmVzdWx0czsKIAlpZiAoIXN0YXRlKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiV2FybmluZzogTm8gcmVzdWx0IG9iamVjdCBwdXNoZWQhIFN0YXRlPSVwXG4iLAotCQkJCSAgd2Fsa19zdGF0ZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk5vIHJlc3VsdCBvYmplY3QgcHVzaGVkISBTdGF0ZT0lcFxuIiwKKwkJCQkgICB3YWxrX3N0YXRlKSk7CiAJCXJldHVybiAoQUVfTk9UX0VYSVNUKTsKIAl9CiAKIAlpZiAoIXN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiTm8gcmVzdWx0IG9iamVjdHMhIFN0YXRlPSVwXG4iLCB3YWxrX3N0YXRlKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTm8gcmVzdWx0IG9iamVjdHMhIFN0YXRlPSVwXG4iLAorCQkJCSAgIHdhbGtfc3RhdGUpKTsKIAkJcmV0dXJuIChBRV9BTUxfTk9fUkVUVVJOX1ZBTFVFKTsKIAl9CiAKQEAgLTI1MCwxMCArMjQ0LDkgQEAKIAkvKiBDaGVjayBmb3IgYSB2YWxpZCByZXN1bHQgb2JqZWN0ICovCiAKIAlpZiAoISpvYmplY3QpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJOdWxsIG9wZXJhbmQhIFN0YXRlPSVwICNPcHM9JVggSW5kZXg9JVhcbiIsCi0JCQkJICB3YWxrX3N0YXRlLCBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cywKLQkJCQkgICh1MzIpIGluZGV4KSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTnVsbCBvcGVyYW5kISBTdGF0ZT0lcCAjT3BzPSVYIEluZGV4PSVYXG4iLAorCQkJCSAgIHdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzLAorCQkJCSAgICh1MzIpIGluZGV4KSk7CiAJCXJldHVybiAoQUVfQU1MX05PX1JFVFVSTl9WQUxVRSk7CiAJfQogCkBAIC0yOTMsMTggKzI4NiwxNCBAQAogCX0KIAogCWlmIChzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cyA9PSBBQ1BJX09CSl9OVU1fT1BFUkFORFMpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJSZXN1bHQgc3RhY2sgb3ZlcmZsb3c6IE9iaj0lcCBTdGF0ZT0lcCBOdW09JVhcbiIsCi0JCQkJICBvYmplY3QsIHdhbGtfc3RhdGUsCi0JCQkJICBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cykpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlJlc3VsdCBzdGFjayBvdmVyZmxvdzogT2JqPSVwIFN0YXRlPSVwIE51bT0lWFxuIiwgb2JqZWN0LCB3YWxrX3N0YXRlLCBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cykpOwogCQlyZXR1cm4gKEFFX1NUQUNLX09WRVJGTE9XKTsKIAl9CiAKIAlpZiAoIW9iamVjdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIk51bGwgT2JqZWN0ISBPYmo9JXAgU3RhdGU9JXAgTnVtPSVYXG4iLAotCQkJCSAgb2JqZWN0LCB3YWxrX3N0YXRlLAotCQkJCSAgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJOdWxsIE9iamVjdCEgT2JqPSVwIFN0YXRlPSVwIE51bT0lWFxuIiwKKwkJCQkgICBvYmplY3QsIHdhbGtfc3RhdGUsCisJCQkJICAgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKQEAgLTQxMywxMCArNDAyLDcgQEAKIAkvKiBDaGVjayBmb3Igc3RhY2sgb3ZlcmZsb3cgKi8KIAogCWlmICh3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPj0gQUNQSV9PQkpfTlVNX09QRVJBTkRTKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAib3ZlcmZsb3chIE9iaj0lcCBTdGF0ZT0lcCAjT3BzPSVYXG4iLAotCQkJCSAgb2JqZWN0LCB3YWxrX3N0YXRlLAotCQkJCSAgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiT2JqZWN0IHN0YWNrIG92ZXJmbG93ISBPYmo9JXAgU3RhdGU9JXAgI09wcz0lWFxuIiwgb2JqZWN0LCB3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMpKTsKIAkJcmV0dXJuIChBRV9TVEFDS19PVkVSRkxPVyk7CiAJfQogCkBAIC00NjAsMTAgKzQ0Niw3IEBACiAJCS8qIENoZWNrIGZvciBzdGFjayB1bmRlcmZsb3cgKi8KIAogCQlpZiAod2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID09IDApIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgIlVuZGVyZmxvdyEgQ291bnQ9JVggU3RhdGU9JXAgI09wcz0lWFxuIiwKLQkJCQkJICBwb3BfY291bnQsIHdhbGtfc3RhdGUsCi0JCQkJCSAgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk9iamVjdCBzdGFjayB1bmRlcmZsb3chIENvdW50PSVYIFN0YXRlPSVwICNPcHM9JVhcbiIsIHBvcF9jb3VudCwgd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7CiAJCQlyZXR1cm4gKEFFX1NUQUNLX1VOREVSRkxPVyk7CiAJCX0KIApAQCAtNTA2LDEwICs0ODksNyBAQAogCQkvKiBDaGVjayBmb3Igc3RhY2sgdW5kZXJmbG93ICovCiAKIAkJaWYgKHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9PSAwKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJVbmRlcmZsb3chIENvdW50PSVYIFN0YXRlPSVwICNPcHM9JVhcbiIsCi0JCQkJCSAgcG9wX2NvdW50LCB3YWxrX3N0YXRlLAotCQkJCQkgIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJPYmplY3Qgc3RhY2sgdW5kZXJmbG93ISBDb3VudD0lWCBTdGF0ZT0lcCAjT3BzPSVYXG4iLCBwb3BfY291bnQsIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOwogCQkJcmV0dXJuIChBRV9TVEFDS19VTkRFUkZMT1cpOwogCQl9CiAKQEAgLTgyNiwxNiArODA2LDE0IEBACiAJfQogCiAJaWYgKHdhbGtfc3RhdGUtPmRhdGFfdHlwZSAhPSBBQ1BJX0RFU0NfVFlQRV9XQUxLKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiJXAgaXMgbm90IGEgdmFsaWQgd2FsayBzdGF0ZVxuIiwKLQkJCQkgIHdhbGtfc3RhdGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCIlcCBpcyBub3QgYSB2YWxpZCB3YWxrIHN0YXRlXG4iLAorCQkJCSAgIHdhbGtfc3RhdGUpKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmICh3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuc2NvcGUpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICIlcCB3YWxrIHN0aWxsIGhhcyBhIHNjb3BlIGxpc3RcbiIsCi0JCQkJICB3YWxrX3N0YXRlKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiJXAgd2FsayBzdGlsbCBoYXMgYSBzY29wZSBsaXN0XG4iLAorCQkJCSAgIHdhbGtfc3RhdGUpKTsKIAl9CiAKIAkvKiBBbHdheXMgbXVzdCBmcmVlIGFueSBsaW5rZWQgY29udHJvbCBzdGF0ZXMgKi8KQEAgLTg5NCwyNSArODcyLDE4IEBACiAKIAlzdGF0ZSA9IHdhbGtfc3RhdGUtPnJlc3VsdHM7CiAJaWYgKCFzdGF0ZSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIk5vIHJlc3VsdCBvYmplY3QgcHVzaGVkISBTdGF0ZT0lcFxuIiwKLQkJCQkgIHdhbGtfc3RhdGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJObyByZXN1bHQgb2JqZWN0IHB1c2hlZCEgU3RhdGU9JXBcbiIsCisJCQkJICAgd2Fsa19zdGF0ZSkpOwogCQlyZXR1cm4gKEFFX05PVF9FWElTVCk7CiAJfQogCiAJaWYgKGluZGV4ID49IEFDUElfT0JKX05VTV9PUEVSQU5EUykgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIkluZGV4IG91dCBvZiByYW5nZTogJVggT2JqPSVwIFN0YXRlPSVwIE51bT0lWFxuIiwKLQkJCQkgIGluZGV4LCBvYmplY3QsIHdhbGtfc3RhdGUsCi0JCQkJICBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cykpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkluZGV4IG91dCBvZiByYW5nZTogJVggT2JqPSVwIFN0YXRlPSVwIE51bT0lWFxuIiwgaW5kZXgsIG9iamVjdCwgd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAlpZiAoIW9iamVjdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIk51bGwgT2JqZWN0ISBJbmRleD0lWCBPYmo9JXAgU3RhdGU9JXAgTnVtPSVYXG4iLAotCQkJCSAgaW5kZXgsIG9iamVjdCwgd2Fsa19zdGF0ZSwKLQkJCQkgIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTnVsbCBPYmplY3QhIEluZGV4PSVYIE9iaj0lcCBTdGF0ZT0lcCBOdW09JVhcbiIsIGluZGV4LCBvYmplY3QsIHdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSk7CiAJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCkBAIC05ODYsOSArOTU3LDcgQEAKIAkvKiBDaGVjayBmb3Igc3RhY2sgdW5kZXJmbG93ICovCiAKIAlpZiAod2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID09IDApIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJNaXNzaW5nIG9wZXJhbmQvc3RhY2sgZW1wdHkhIFN0YXRlPSVwICNPcHM9JVhcbiIsCi0JCQkJICB3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJNaXNzaW5nIG9wZXJhbmQvc3RhY2sgZW1wdHkhIFN0YXRlPSVwICNPcHM9JVhcbiIsIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOwogCQkqb2JqZWN0ID0gTlVMTDsKIAkJcmV0dXJuIChBRV9BTUxfTk9fT1BFUkFORCk7CiAJfQpAQCAtMTAwMCw5ICs5NjksOCBAQAogCS8qIENoZWNrIGZvciBhIHZhbGlkIG9wZXJhbmQgKi8KIAogCWlmICghd2Fsa19zdGF0ZS0+b3BlcmFuZHNbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIk51bGwgb3BlcmFuZCEgU3RhdGU9JXAgI09wcz0lWFxuIiwKLQkJCQkgIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk51bGwgb3BlcmFuZCEgU3RhdGU9JXAgI09wcz0lWFxuIiwKKwkJCQkgICB3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMpKTsKIAkJKm9iamVjdCA9IE5VTEw7CiAJCXJldHVybiAoQUVfQU1MX05PX09QRVJBTkQpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9lYy5jIGIvZHJpdmVycy9hY3BpL2VjLmMKaW5kZXggN2UxYTQ0NS4uNzliMDlkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2VjLmMKKysrIGIvZHJpdmVycy9hY3BpL2VjLmMKQEAgLTYwLDIwICs2MCwyMCBAQAogI2RlZmluZSBBQ1BJX0VDX0JVUlNUX0VOQUJMRQkweDgyCiAjZGVmaW5lIEFDUElfRUNfQlVSU1RfRElTQUJMRQkweDgzCiAjZGVmaW5lIEFDUElfRUNfQ09NTUFORF9RVUVSWQkweDg0Ci0jZGVmaW5lIEVDX1BPTExJTkcJCTB4RkYKLSNkZWZpbmUgRUNfQlVSU1QJCTB4MDAKKyNkZWZpbmUgRUNfUE9MTAkJCTB4RkYKKyNkZWZpbmUgRUNfSU5UUgkJCTB4MDAKIHN0YXRpYyBpbnQgYWNwaV9lY19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKIHN0YXRpYyBpbnQgYWNwaV9lY19zdGFydChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgaW50IGFjcGlfZWNfc3RvcChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwotc3RhdGljIGludCBhY3BpX2VjX2J1cnN0X2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci1zdGF0aWMgaW50IGFjcGlfZWNfcG9sbGluZ19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOworc3RhdGljIGludCBhY3BpX2VjX2ludHJfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbnQgYWNwaV9lY19wb2xsX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9lY19kcml2ZXIgPSB7CiAJLm5hbWUgPSBBQ1BJX0VDX0RSSVZFUl9OQU1FLAogCS5jbGFzcyA9IEFDUElfRUNfQ0xBU1MsCiAJLmlkcyA9IEFDUElfRUNfSElELAogCS5vcHMgPSB7Ci0JCS5hZGQgPSBhY3BpX2VjX3BvbGxpbmdfYWRkLAorCQkuYWRkID0gYWNwaV9lY19pbnRyX2FkZCwKIAkJLnJlbW92ZSA9IGFjcGlfZWNfcmVtb3ZlLAogCQkuc3RhcnQgPSBhY3BpX2VjX3N0YXJ0LAogCQkuc3RvcCA9IGFjcGlfZWNfc3RvcCwKQEAgLTEwNSw3ICsxMDUsNyBAQAogCQlhdG9taWNfdCBwZW5kaW5nX2dwZTsKIAkJc3RydWN0IHNlbWFwaG9yZSBzZW07CiAJCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0JfSBidXJzdDsKKwl9IGludHI7CiAKIAlzdHJ1Y3QgewogCQl1MzIgbW9kZTsKQEAgLTExNyw0MyArMTE3LDQzIEBACiAJCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBkYXRhX2FkZHI7CiAJCXVuc2lnbmVkIGxvbmcgZ2xvYmFsX2xvY2s7CiAJCXNwaW5sb2NrX3QgbG9jazsKLQl9IHBvbGxpbmc7CisJfSBwb2xsOwogfTsKIAotc3RhdGljIGludCBhY3BpX2VjX3BvbGxpbmdfd2FpdCh1bmlvbiBhY3BpX2VjICplYywgdTggZXZlbnQpOwotc3RhdGljIGludCBhY3BpX2VjX2J1cnN0X3dhaXQodW5pb24gYWNwaV9lYyAqZWMsIHVuc2lnbmVkIGludCBldmVudCk7Ci1zdGF0aWMgaW50IGFjcGlfZWNfcG9sbGluZ19yZWFkKHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1MzIgKiBkYXRhKTsKLXN0YXRpYyBpbnQgYWNwaV9lY19idXJzdF9yZWFkKHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1MzIgKiBkYXRhKTsKLXN0YXRpYyBpbnQgYWNwaV9lY19wb2xsaW5nX3dyaXRlKHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1OCBkYXRhKTsKLXN0YXRpYyBpbnQgYWNwaV9lY19idXJzdF93cml0ZSh1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTggZGF0YSk7Ci1zdGF0aWMgaW50IGFjcGlfZWNfcG9sbGluZ19xdWVyeSh1bmlvbiBhY3BpX2VjICplYywgdTMyICogZGF0YSk7Ci1zdGF0aWMgaW50IGFjcGlfZWNfYnVyc3RfcXVlcnkodW5pb24gYWNwaV9lYyAqZWMsIHUzMiAqIGRhdGEpOwotc3RhdGljIHZvaWQgYWNwaV9lY19ncGVfcG9sbGluZ19xdWVyeSh2b2lkICplY19jeHQpOwotc3RhdGljIHZvaWQgYWNwaV9lY19ncGVfYnVyc3RfcXVlcnkodm9pZCAqZWNfY3h0KTsKLXN0YXRpYyB1MzIgYWNwaV9lY19ncGVfcG9sbGluZ19oYW5kbGVyKHZvaWQgKmRhdGEpOwotc3RhdGljIHUzMiBhY3BpX2VjX2dwZV9idXJzdF9oYW5kbGVyKHZvaWQgKmRhdGEpOworc3RhdGljIGludCBhY3BpX2VjX3BvbGxfd2FpdCh1bmlvbiBhY3BpX2VjICplYywgdTggZXZlbnQpOworc3RhdGljIGludCBhY3BpX2VjX2ludHJfd2FpdCh1bmlvbiBhY3BpX2VjICplYywgdW5zaWduZWQgaW50IGV2ZW50KTsKK3N0YXRpYyBpbnQgYWNwaV9lY19wb2xsX3JlYWQodW5pb24gYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHUzMiAqIGRhdGEpOworc3RhdGljIGludCBhY3BpX2VjX2ludHJfcmVhZCh1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTMyICogZGF0YSk7CitzdGF0aWMgaW50IGFjcGlfZWNfcG9sbF93cml0ZSh1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTggZGF0YSk7CitzdGF0aWMgaW50IGFjcGlfZWNfaW50cl93cml0ZSh1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTggZGF0YSk7CitzdGF0aWMgaW50IGFjcGlfZWNfcG9sbF9xdWVyeSh1bmlvbiBhY3BpX2VjICplYywgdTMyICogZGF0YSk7CitzdGF0aWMgaW50IGFjcGlfZWNfaW50cl9xdWVyeSh1bmlvbiBhY3BpX2VjICplYywgdTMyICogZGF0YSk7CitzdGF0aWMgdm9pZCBhY3BpX2VjX2dwZV9wb2xsX3F1ZXJ5KHZvaWQgKmVjX2N4dCk7CitzdGF0aWMgdm9pZCBhY3BpX2VjX2dwZV9pbnRyX3F1ZXJ5KHZvaWQgKmVjX2N4dCk7CitzdGF0aWMgdTMyIGFjcGlfZWNfZ3BlX3BvbGxfaGFuZGxlcih2b2lkICpkYXRhKTsKK3N0YXRpYyB1MzIgYWNwaV9lY19ncGVfaW50cl9oYW5kbGVyKHZvaWQgKmRhdGEpOwogc3RhdGljIGFjcGlfc3RhdHVzIF9faW5pdAotYWNwaV9mYWtlX2VjZHRfcG9sbGluZ19jYWxsYmFjayhhY3BpX2hhbmRsZSBoYW5kbGUsCithY3BpX2Zha2VfZWNkdF9wb2xsX2NhbGxiYWNrKGFjcGlfaGFuZGxlIGhhbmRsZSwKIAkJCQl1MzIgTGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR2YWwpOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMgX19pbml0Ci1hY3BpX2Zha2VfZWNkdF9idXJzdF9jYWxsYmFjayhhY3BpX2hhbmRsZSBoYW5kbGUsCithY3BpX2Zha2VfZWNkdF9pbnRyX2NhbGxiYWNrKGFjcGlfaGFuZGxlIGhhbmRsZSwKIAkJCSAgICAgIHUzMiBMZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHZhbCk7CiAKLXN0YXRpYyBpbnQgX19pbml0IGFjcGlfZWNfcG9sbGluZ19nZXRfcmVhbF9lY2R0KHZvaWQpOwotc3RhdGljIGludCBfX2luaXQgYWNwaV9lY19idXJzdF9nZXRfcmVhbF9lY2R0KHZvaWQpOworc3RhdGljIGludCBfX2luaXQgYWNwaV9lY19wb2xsX2dldF9yZWFsX2VjZHQodm9pZCk7CitzdGF0aWMgaW50IF9faW5pdCBhY3BpX2VjX2ludHJfZ2V0X3JlYWxfZWNkdCh2b2lkKTsKIC8qIElmIHdlIGZpbmQgYW4gRUMgdmlhIHRoZSBFQ0RULCB3ZSBuZWVkIHRvIGtlZXAgYSBwdHIgdG8gaXRzIGNvbnRleHQgKi8KIHN0YXRpYyB1bmlvbiBhY3BpX2VjICplY19lY2R0OwogCiAvKiBFeHRlcm5hbCBpbnRlcmZhY2VzIHVzZSBmaXJzdCBFQyBvbmx5LCBzbyByZW1lbWJlciAqLwogc3RhdGljIHN0cnVjdCBhY3BpX2RldmljZSAqZmlyc3RfZWM7Ci1zdGF0aWMgaW50IGFjcGlfZWNfcG9sbGluZ19tb2RlID0gRUNfUE9MTElORzsKK3N0YXRpYyBpbnQgYWNwaV9lY19wb2xsX21vZGUgPSBFQ19JTlRSOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbiBNYW5hZ2VtZW50CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW5saW5lIHUzMiBhY3BpX2VjX3JlYWRfc3RhdHVzKHVuaW9uIGFjcGlfZWMgKmVjKQorc3RhdGljIHUzMiBhY3BpX2VjX3JlYWRfc3RhdHVzKHVuaW9uIGFjcGlfZWMgKmVjKQogewogCXUzMiBzdGF0dXMgPSAwOwogCkBAIC0xNjMsMTMgKzE2MywxMyBAQAogCiBzdGF0aWMgaW50IGFjcGlfZWNfd2FpdCh1bmlvbiBhY3BpX2VjICplYywgdTggZXZlbnQpCiB7Ci0JaWYgKGFjcGlfZWNfcG9sbGluZ19tb2RlKQotCQlyZXR1cm4gYWNwaV9lY19wb2xsaW5nX3dhaXQoZWMsIGV2ZW50KTsKKwlpZiAoYWNwaV9lY19wb2xsX21vZGUpCisJCXJldHVybiBhY3BpX2VjX3BvbGxfd2FpdChlYywgZXZlbnQpOwogCWVsc2UKLQkJcmV0dXJuIGFjcGlfZWNfYnVyc3Rfd2FpdChlYywgZXZlbnQpOworCQlyZXR1cm4gYWNwaV9lY19pbnRyX3dhaXQoZWMsIGV2ZW50KTsKIH0KIAotc3RhdGljIGludCBhY3BpX2VjX3BvbGxpbmdfd2FpdCh1bmlvbiBhY3BpX2VjICplYywgdTggZXZlbnQpCitzdGF0aWMgaW50IGFjcGlfZWNfcG9sbF93YWl0KHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBldmVudCkKIHsKIAl1MzIgYWNwaV9lY19zdGF0dXMgPSAwOwogCXUzMiBpID0gQUNQSV9FQ19VREVMQVlfQ09VTlQ7CkBAIC0yMDMsMzYgKzIwMywzMSBAQAogCiAJcmV0dXJuIC1FVElNRTsKIH0KLXN0YXRpYyBpbnQgYWNwaV9lY19idXJzdF93YWl0KHVuaW9uIGFjcGlfZWMgKmVjLCB1bnNpZ25lZCBpbnQgZXZlbnQpCitzdGF0aWMgaW50IGFjcGlfZWNfaW50cl93YWl0KHVuaW9uIGFjcGlfZWMgKmVjLCB1bnNpZ25lZCBpbnQgZXZlbnQpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX3dhaXQiKTsKIAotCWVjLT5idXJzdC5leHBlY3RfZXZlbnQgPSBldmVudDsKKwllYy0+aW50ci5leHBlY3RfZXZlbnQgPSBldmVudDsKIAlzbXBfbWIoKTsKIAogCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIEFDUElfRUNfRVZFTlRfT0JGOgotCQlpZiAoYWNwaV9lY19yZWFkX3N0YXR1cyhlYykgJiBldmVudCkgewotCQkJZWMtPmJ1cnN0LmV4cGVjdF9ldmVudCA9IDA7CisJY2FzZSBBQ1BJX0VDX0VWRU5UX0lCRToKKwkJaWYgKH5hY3BpX2VjX3JlYWRfc3RhdHVzKGVjKSAmIGV2ZW50KSB7CisJCQllYy0+aW50ci5leHBlY3RfZXZlbnQgPSAwOwogCQkJcmV0dXJuX1ZBTFVFKDApOwogCQl9CiAJCWJyZWFrOwotCi0JY2FzZSBBQ1BJX0VDX0VWRU5UX0lCRToKLQkJaWYgKH5hY3BpX2VjX3JlYWRfc3RhdHVzKGVjKSAmIGV2ZW50KSB7Ci0JCQllYy0+YnVyc3QuZXhwZWN0X2V2ZW50ID0gMDsKLQkJCXJldHVybl9WQUxVRSgwKTsKLQkJfQorCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KIAotCXJlc3VsdCA9IHdhaXRfZXZlbnRfdGltZW91dChlYy0+YnVyc3Qud2FpdCwKLQkJCQkgICAgIWVjLT5idXJzdC5leHBlY3RfZXZlbnQsCisJcmVzdWx0ID0gd2FpdF9ldmVudF90aW1lb3V0KGVjLT5pbnRyLndhaXQsCisJCQkJICAgICFlYy0+aW50ci5leHBlY3RfZXZlbnQsCiAJCQkJICAgIG1zZWNzX3RvX2ppZmZpZXMoQUNQSV9FQ19ERUxBWSkpOwogCi0JZWMtPmJ1cnN0LmV4cGVjdF9ldmVudCA9IDA7CisJZWMtPmludHIuZXhwZWN0X2V2ZW50ID0gMDsKIAlzbXBfbWIoKTsKIAogCS8qCkBAIC0yNTUsNyArMjUwLDEyIEBACiAJcmV0dXJuX1ZBTFVFKC1FVElNRSk7CiB9CiAKLXN0YXRpYyBpbnQgYWNwaV9lY19lbnRlcl9idXJzdF9tb2RlKHVuaW9uIGFjcGlfZWMgKmVjKQorI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisvKgorICogTm90ZTogc2Ftc3VuZyBudjUwMDAgZG9lc24ndCB3b3JrIHdpdGggZWMgYnVyc3QgbW9kZS4KKyAqIGh0dHA6Ly9idWd6aWxsYS5rZXJuZWwub3JnL3Nob3dfYnVnLmNnaT9pZD00OTgwCisgKi8KK2ludCBhY3BpX2VjX2VudGVyX2J1cnN0X21vZGUodW5pb24gYWNwaV9lYyAqZWMpCiB7CiAJdTMyIHRtcCA9IDA7CiAJaW50IHN0YXR1cyA9IDA7CkBAIC0yNzAsNDUgKzI3MCw1NiBAQAogCQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0JVUlNUX0VOQUJMRSwKIAkJCQkJJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKIAkJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX09CRik7Ci0JCWlmIChzdGF0dXMpCi0JCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAJCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJnRtcCwgJmVjLT5jb21tb24uZGF0YV9hZGRyKTsKIAkJaWYgKHRtcCAhPSAweDkwKSB7CS8qIEJ1cnN0IEFDSyBieXRlICovCiAJCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAJCX0KIAl9CiAKLQlhdG9taWNfc2V0KCZlYy0+YnVyc3QubGVhdmluZ19idXJzdCwgMCk7CisJYXRvbWljX3NldCgmZWMtPmludHIubGVhdmluZ19idXJzdCwgMCk7CiAJcmV0dXJuX1ZBTFVFKDApOwogICAgICAgZW5kOgotCXByaW50aygiRXJyb3IgaW4gYWNwaV9lY193YWl0XG4iKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiRXJyb3IgaW4gYWNwaV9lY193YWl0XG4iKTsKIAlyZXR1cm5fVkFMVUUoLTEpOwogfQogCi1zdGF0aWMgaW50IGFjcGlfZWNfbGVhdmVfYnVyc3RfbW9kZSh1bmlvbiBhY3BpX2VjICplYykKK2ludCBhY3BpX2VjX2xlYXZlX2J1cnN0X21vZGUodW5pb24gYWNwaV9lYyAqZWMpCiB7CisJaW50IHN0YXR1cyA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX2xlYXZlX2J1cnN0X21vZGUiKTsKIAotCWF0b21pY19zZXQoJmVjLT5idXJzdC5sZWF2aW5nX2J1cnN0LCAxKTsKKwlzdGF0dXMgPSBhY3BpX2VjX3JlYWRfc3RhdHVzKGVjKTsKKwlpZiAoc3RhdHVzICE9IC1FSU5WQUwgJiYgKHN0YXR1cyAmIEFDUElfRUNfRkxBR19CVVJTVCkpeworCQlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRkxBR19JQkYpOworCQlpZihzdGF0dXMpCisJCQlnb3RvIGVuZDsKKwkJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19CVVJTVF9ESVNBQkxFLCAmZWMtPmNvbW1vbi5jb21tYW5kX2FkZHIpOworCQlhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRkxBR19JQkYpOworCX0gCisJYXRvbWljX3NldCgmZWMtPmludHIubGVhdmluZ19idXJzdCwgMSk7CiAJcmV0dXJuX1ZBTFVFKDApOworZW5kOgorCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJsZWF2ZSBidXJzdF9tb2RlOmVycm9yXG4iKTsKKwlyZXR1cm5fVkFMVUUoLTEpOwogfQorI2VuZGlmIC8qIEFDUElfRlVUVVJFX1VTQUdFICovCiAKIHN0YXRpYyBpbnQgYWNwaV9lY19yZWFkKHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1MzIgKiBkYXRhKQogewotCWlmIChhY3BpX2VjX3BvbGxpbmdfbW9kZSkKLQkJcmV0dXJuIGFjcGlfZWNfcG9sbGluZ19yZWFkKGVjLCBhZGRyZXNzLCBkYXRhKTsKKwlpZiAoYWNwaV9lY19wb2xsX21vZGUpCisJCXJldHVybiBhY3BpX2VjX3BvbGxfcmVhZChlYywgYWRkcmVzcywgZGF0YSk7CiAJZWxzZQotCQlyZXR1cm4gYWNwaV9lY19idXJzdF9yZWFkKGVjLCBhZGRyZXNzLCBkYXRhKTsKKwkJcmV0dXJuIGFjcGlfZWNfaW50cl9yZWFkKGVjLCBhZGRyZXNzLCBkYXRhKTsKIH0KIHN0YXRpYyBpbnQgYWNwaV9lY193cml0ZSh1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTggZGF0YSkKIHsKLQlpZiAoYWNwaV9lY19wb2xsaW5nX21vZGUpCi0JCXJldHVybiBhY3BpX2VjX3BvbGxpbmdfd3JpdGUoZWMsIGFkZHJlc3MsIGRhdGEpOworCWlmIChhY3BpX2VjX3BvbGxfbW9kZSkKKwkJcmV0dXJuIGFjcGlfZWNfcG9sbF93cml0ZShlYywgYWRkcmVzcywgZGF0YSk7CiAJZWxzZQotCQlyZXR1cm4gYWNwaV9lY19idXJzdF93cml0ZShlYywgYWRkcmVzcywgZGF0YSk7CisJCXJldHVybiBhY3BpX2VjX2ludHJfd3JpdGUoZWMsIGFkZHJlc3MsIGRhdGEpOwogfQotc3RhdGljIGludCBhY3BpX2VjX3BvbGxpbmdfcmVhZCh1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTMyICogZGF0YSkKK3N0YXRpYyBpbnQgYWNwaV9lY19wb2xsX3JlYWQodW5pb24gYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHUzMiAqIGRhdGEpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAJaW50IHJlc3VsdCA9IDA7CkBAIC0zMjgsNyArMzM5LDcgQEAKIAkJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZWMtPnBvbGxpbmcubG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZlYy0+cG9sbC5sb2NrLCBmbGFncyk7CiAKIAlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0NPTU1BTkRfUkVBRCwKIAkJCQkmZWMtPmNvbW1vbi5jb21tYW5kX2FkZHIpOwpAQCAtMzQ3LDcgKzM1OCw3IEBACiAJCQkgICpkYXRhLCBhZGRyZXNzKSk7CiAKICAgICAgIGVuZDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlYy0+cG9sbGluZy5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWMtPnBvbGwubG9jaywgZmxhZ3MpOwogCiAJaWYgKGVjLT5jb21tb24uZ2xvYmFsX2xvY2spCiAJCWFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayhnbGspOwpAQCAtMzU1LDcgKzM2Niw3IEBACiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLXN0YXRpYyBpbnQgYWNwaV9lY19wb2xsaW5nX3dyaXRlKHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1OCBkYXRhKQorc3RhdGljIGludCBhY3BpX2VjX3BvbGxfd3JpdGUodW5pb24gYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHU4IGRhdGEpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CkBAIC0zNzMsNyArMzg0LDcgQEAKIAkJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZWMtPnBvbGxpbmcubG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZlYy0+cG9sbC5sb2NrLCBmbGFncyk7CiAKIAlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0NPTU1BTkRfV1JJVEUsCiAJCQkJJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKQEAgLTM5NSw3ICs0MDYsNyBAQAogCQkJICBkYXRhLCBhZGRyZXNzKSk7CiAKICAgICAgIGVuZDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlYy0+cG9sbGluZy5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWMtPnBvbGwubG9jaywgZmxhZ3MpOwogCiAJaWYgKGVjLT5jb21tb24uZ2xvYmFsX2xvY2spCiAJCWFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayhnbGspOwpAQCAtNDAzLDcgKzQxNCw3IEBACiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLXN0YXRpYyBpbnQgYWNwaV9lY19idXJzdF9yZWFkKHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1MzIgKiBkYXRhKQorc3RhdGljIGludCBhY3BpX2VjX2ludHJfcmVhZCh1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTMyICogZGF0YSkKIHsKIAlpbnQgc3RhdHVzID0gMDsKIAl1MzIgZ2xrOwpAQCAtNDIyLDI1ICs0MzMsMjQgQEAKIAl9CiAKIAlXQVJOX09OKGluX2ludGVycnVwdCgpKTsKLQlkb3duKCZlYy0+YnVyc3Quc2VtKTsKKwlkb3duKCZlYy0+aW50ci5zZW0pOwogCi0JYWNwaV9lY19lbnRlcl9idXJzdF9tb2RlKGVjKTsKIAlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKIAlpZiAoc3RhdHVzKSB7Ci0JCXByaW50aygicmVhZCBFQywgSUIgbm90IGVtcHR5XG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgUFJFRklYICJyZWFkIEVDLCBJQiBub3QgZW1wdHlcbiIpOwogCQlnb3RvIGVuZDsKIAl9CiAJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19DT01NQU5EX1JFQUQsCiAJCQkJJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKIAlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKIAlpZiAoc3RhdHVzKSB7Ci0JCXByaW50aygicmVhZCBFQywgSUIgbm90IGVtcHR5XG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgUFJFRklYICJyZWFkIEVDLCBJQiBub3QgZW1wdHlcbiIpOwogCX0KIAogCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIGFkZHJlc3MsICZlYy0+Y29tbW9uLmRhdGFfYWRkcik7CiAJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX09CRik7CiAJaWYgKHN0YXR1cykgewotCQlwcmludGsoInJlYWQgRUMsIE9CIG5vdCBmdWxsXG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgUFJFRklYICJyZWFkIEVDLCBPQiBub3QgZnVsbFxuIik7CiAJCWdvdG8gZW5kOwogCX0KIAlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsIGRhdGEsICZlYy0+Y29tbW9uLmRhdGFfYWRkcik7CkBAIC00NDgsOCArNDU4LDcgQEAKIAkJCSAgKmRhdGEsIGFkZHJlc3MpKTsKIAogICAgICAgZW5kOgotCWFjcGlfZWNfbGVhdmVfYnVyc3RfbW9kZShlYyk7Ci0JdXAoJmVjLT5idXJzdC5zZW0pOworCXVwKCZlYy0+aW50ci5zZW0pOwogCiAJaWYgKGVjLT5jb21tb24uZ2xvYmFsX2xvY2spCiAJCWFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayhnbGspOwpAQCAtNDU3LDcgKzQ2Niw3IEBACiAJcmV0dXJuX1ZBTFVFKHN0YXR1cyk7CiB9CiAKLXN0YXRpYyBpbnQgYWNwaV9lY19idXJzdF93cml0ZSh1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTggZGF0YSkKK3N0YXRpYyBpbnQgYWNwaV9lY19pbnRyX3dyaXRlKHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1OCBkYXRhKQogewogCWludCBzdGF0dXMgPSAwOwogCXUzMiBnbGs7CkBAIC00NzQsMjUgKzQ4MywyMyBAQAogCX0KIAogCVdBUk5fT04oaW5faW50ZXJydXB0KCkpOwotCWRvd24oJmVjLT5idXJzdC5zZW0pOwotCi0JYWNwaV9lY19lbnRlcl9idXJzdF9tb2RlKGVjKTsKKwlkb3duKCZlYy0+aW50ci5zZW0pOwogCiAJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7CiAJaWYgKHN0YXR1cykgewotCQlwcmludGsoIndyaXRlIEVDLCBJQiBub3QgZW1wdHlcbiIpOworCQlwcmludGsoS0VSTl9ERUJVRyBQUkVGSVggIndyaXRlIEVDLCBJQiBub3QgZW1wdHlcbiIpOwogCX0KIAlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0NPTU1BTkRfV1JJVEUsCiAJCQkJJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKIAlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKIAlpZiAoc3RhdHVzKSB7Ci0JCXByaW50aygid3JpdGUgRUMsIElCIG5vdCBlbXB0eVxuIik7CisJCXByaW50ayhLRVJOX0RFQlVHIFBSRUZJWCAid3JpdGUgRUMsIElCIG5vdCBlbXB0eVxuIik7CiAJfQogCiAJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgYWRkcmVzcywgJmVjLT5jb21tb24uZGF0YV9hZGRyKTsKIAlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKIAlpZiAoc3RhdHVzKSB7Ci0JCXByaW50aygid3JpdGUgRUMsIElCIG5vdCBlbXB0eVxuIik7CisJCXByaW50ayhLRVJOX0RFQlVHIFBSRUZJWCAid3JpdGUgRUMsIElCIG5vdCBlbXB0eVxuIik7CiAJfQogCiAJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgZGF0YSwgJmVjLT5jb21tb24uZGF0YV9hZGRyKTsKQEAgLTUwMCw4ICs1MDcsNyBAQAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIldyb3RlIFslMDJ4XSB0byBhZGRyZXNzIFslMDJ4XVxuIiwKIAkJCSAgZGF0YSwgYWRkcmVzcykpOwogCi0JYWNwaV9lY19sZWF2ZV9idXJzdF9tb2RlKGVjKTsKLQl1cCgmZWMtPmJ1cnN0LnNlbSk7CisJdXAoJmVjLT5pbnRyLnNlbSk7CiAKIAlpZiAoZWMtPmNvbW1vbi5nbG9iYWxfbG9jaykKIAkJYWNwaV9yZWxlYXNlX2dsb2JhbF9sb2NrKGdsayk7CkBAIC01NTMsMTIgKzU1OSwxMiBAQAogCiBzdGF0aWMgaW50IGFjcGlfZWNfcXVlcnkodW5pb24gYWNwaV9lYyAqZWMsIHUzMiAqIGRhdGEpCiB7Ci0JaWYgKGFjcGlfZWNfcG9sbGluZ19tb2RlKQotCQlyZXR1cm4gYWNwaV9lY19wb2xsaW5nX3F1ZXJ5KGVjLCBkYXRhKTsKKwlpZiAoYWNwaV9lY19wb2xsX21vZGUpCisJCXJldHVybiBhY3BpX2VjX3BvbGxfcXVlcnkoZWMsIGRhdGEpOwogCWVsc2UKLQkJcmV0dXJuIGFjcGlfZWNfYnVyc3RfcXVlcnkoZWMsIGRhdGEpOworCQlyZXR1cm4gYWNwaV9lY19pbnRyX3F1ZXJ5KGVjLCBkYXRhKTsKIH0KLXN0YXRpYyBpbnQgYWNwaV9lY19wb2xsaW5nX3F1ZXJ5KHVuaW9uIGFjcGlfZWMgKmVjLCB1MzIgKiBkYXRhKQorc3RhdGljIGludCBhY3BpX2VjX3BvbGxfcXVlcnkodW5pb24gYWNwaV9lYyAqZWMsIHUzMiAqIGRhdGEpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CkBAIC01ODMsNyArNTg5LDcgQEAKIAkgKiBOb3RlIHRoYXQgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoZSBxdWVyeSBjYXVzZXMgdGhlIEFDUElfRUNfU0NJCiAJICogYml0IHRvIGJlIGNsZWFyZWQgKGFuZCB0aHVzIGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgc291cmNlKS4KIAkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZWMtPnBvbGxpbmcubG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZlYy0+cG9sbC5sb2NrLCBmbGFncyk7CiAKIAlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0NPTU1BTkRfUVVFUlksCiAJCQkJJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKQEAgLTU5NiwxNCArNjAyLDE0IEBACiAJCXJlc3VsdCA9IC1FTk9EQVRBOwogCiAgICAgICBlbmQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWMtPnBvbGxpbmcubG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVjLT5wb2xsLmxvY2ssIGZsYWdzKTsKIAogCWlmIChlYy0+Y29tbW9uLmdsb2JhbF9sb2NrKQogCQlhY3BpX3JlbGVhc2VfZ2xvYmFsX2xvY2soZ2xrKTsKIAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQotc3RhdGljIGludCBhY3BpX2VjX2J1cnN0X3F1ZXJ5KHVuaW9uIGFjcGlfZWMgKmVjLCB1MzIgKiBkYXRhKQorc3RhdGljIGludCBhY3BpX2VjX2ludHJfcXVlcnkodW5pb24gYWNwaV9lYyAqZWMsIHUzMiAqIGRhdGEpCiB7CiAJaW50IHN0YXR1cyA9IDA7CiAJdTMyIGdsazsKQEAgLTYyMCwxMSArNjI2LDExIEBACiAJCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCi0JZG93bigmZWMtPmJ1cnN0LnNlbSk7CisJZG93bigmZWMtPmludHIuc2VtKTsKIAogCXN0YXR1cyA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkUpOwogCWlmIChzdGF0dXMpIHsKLQkJcHJpbnRrKCJxdWVyeSBFQywgSUIgbm90IGVtcHR5XG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgUFJFRklYICJxdWVyeSBFQywgSUIgbm90IGVtcHR5XG4iKTsKIAkJZ290byBlbmQ7CiAJfQogCS8qCkBAIC02MzYsNyArNjQyLDcgQEAKIAkJCQkmZWMtPmNvbW1vbi5jb21tYW5kX2FkZHIpOwogCXN0YXR1cyA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9PQkYpOwogCWlmIChzdGF0dXMpIHsKLQkJcHJpbnRrKCJxdWVyeSBFQywgT0Igbm90IGZ1bGxcbiIpOworCQlwcmludGsoS0VSTl9ERUJVRyBQUkVGSVggInF1ZXJ5IEVDLCBPQiBub3QgZnVsbFxuIik7CiAJCWdvdG8gZW5kOwogCX0KIApAQCAtNjQ1LDcgKzY1MSw3IEBACiAJCXN0YXR1cyA9IC1FTk9EQVRBOwogCiAgICAgICBlbmQ6Ci0JdXAoJmVjLT5idXJzdC5zZW0pOworCXVwKCZlYy0+aW50ci5zZW0pOwogCiAJaWYgKGVjLT5jb21tb24uZ2xvYmFsX2xvY2spCiAJCWFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayhnbGspOwpAQCAtNjY0LDEzICs2NzAsMTMgQEAKIAogc3RhdGljIHZvaWQgYWNwaV9lY19ncGVfcXVlcnkodm9pZCAqZWNfY3h0KQogewotCWlmIChhY3BpX2VjX3BvbGxpbmdfbW9kZSkKLQkJYWNwaV9lY19ncGVfcG9sbGluZ19xdWVyeShlY19jeHQpOworCWlmIChhY3BpX2VjX3BvbGxfbW9kZSkKKwkJYWNwaV9lY19ncGVfcG9sbF9xdWVyeShlY19jeHQpOwogCWVsc2UKLQkJYWNwaV9lY19ncGVfYnVyc3RfcXVlcnkoZWNfY3h0KTsKKwkJYWNwaV9lY19ncGVfaW50cl9xdWVyeShlY19jeHQpOwogfQogCi1zdGF0aWMgdm9pZCBhY3BpX2VjX2dwZV9wb2xsaW5nX3F1ZXJ5KHZvaWQgKmVjX2N4dCkKK3N0YXRpYyB2b2lkIGFjcGlfZWNfZ3BlX3BvbGxfcXVlcnkodm9pZCAqZWNfY3h0KQogewogCXVuaW9uIGFjcGlfZWMgKmVjID0gKHVuaW9uIGFjcGlfZWMgKillY19jeHQ7CiAJdTMyIHZhbHVlID0gMDsKQEAgLTY4NSw5ICs2OTEsOSBAQAogCWlmICghZWNfY3h0KQogCQlnb3RvIGVuZDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZlYy0+cG9sbGluZy5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmVjLT5wb2xsLmxvY2ssIGZsYWdzKTsKIAlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsICZ2YWx1ZSwgJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlYy0+cG9sbGluZy5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWMtPnBvbGwubG9jaywgZmxhZ3MpOwogCiAJLyogVEJEOiBJbXBsZW1lbnQgYXN5bmNoIGV2ZW50cyEKIAkgKiBOT1RFOiBBbGwgd2UgY2FyZSBhYm91dCBhcmUgRUMtU0NJJ3MuICBPdGhlciBFQyBldmVudHMgYXJlCkBAIC03MTEsNyArNzE3LDcgQEAKICAgICAgIGVuZDoKIAlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOwogfQotc3RhdGljIHZvaWQgYWNwaV9lY19ncGVfYnVyc3RfcXVlcnkodm9pZCAqZWNfY3h0KQorc3RhdGljIHZvaWQgYWNwaV9lY19ncGVfaW50cl9xdWVyeSh2b2lkICplY19jeHQpCiB7CiAJdW5pb24gYWNwaV9lYyAqZWMgPSAodW5pb24gYWNwaV9lYyAqKWVjX2N4dDsKIAl1MzIgdmFsdWU7CkBAIC03MzYsMTggKzc0MiwxOCBAQAogCiAJYWNwaV9ldmFsdWF0ZV9vYmplY3QoZWMtPmNvbW1vbi5oYW5kbGUsIG9iamVjdF9uYW1lLCBOVUxMLCBOVUxMKTsKICAgICAgIGVuZDoKLQlhdG9taWNfZGVjKCZlYy0+YnVyc3QucGVuZGluZ19ncGUpOworCWF0b21pY19kZWMoJmVjLT5pbnRyLnBlbmRpbmdfZ3BlKTsKIAlyZXR1cm47CiB9CiAKIHN0YXRpYyB1MzIgYWNwaV9lY19ncGVfaGFuZGxlcih2b2lkICpkYXRhKQogewotCWlmIChhY3BpX2VjX3BvbGxpbmdfbW9kZSkKLQkJcmV0dXJuIGFjcGlfZWNfZ3BlX3BvbGxpbmdfaGFuZGxlcihkYXRhKTsKKwlpZiAoYWNwaV9lY19wb2xsX21vZGUpCisJCXJldHVybiBhY3BpX2VjX2dwZV9wb2xsX2hhbmRsZXIoZGF0YSk7CiAJZWxzZQotCQlyZXR1cm4gYWNwaV9lY19ncGVfYnVyc3RfaGFuZGxlcihkYXRhKTsKKwkJcmV0dXJuIGFjcGlfZWNfZ3BlX2ludHJfaGFuZGxlcihkYXRhKTsKIH0KLXN0YXRpYyB1MzIgYWNwaV9lY19ncGVfcG9sbGluZ19oYW5kbGVyKHZvaWQgKmRhdGEpCitzdGF0aWMgdTMyIGFjcGlfZWNfZ3BlX3BvbGxfaGFuZGxlcih2b2lkICpkYXRhKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCXVuaW9uIGFjcGlfZWMgKmVjID0gKHVuaW9uIGFjcGlfZWMgKilkYXRhOwpAQCAtNzY1LDcgKzc3MSw3IEBACiAJZWxzZQogCQlyZXR1cm4gQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7CiB9Ci1zdGF0aWMgdTMyIGFjcGlfZWNfZ3BlX2J1cnN0X2hhbmRsZXIodm9pZCAqZGF0YSkKK3N0YXRpYyB1MzIgYWNwaV9lY19ncGVfaW50cl9oYW5kbGVyKHZvaWQgKmRhdGEpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAJdTMyIHZhbHVlOwpAQCAtNzc3LDIyICs3ODMsMjIgQEAKIAlhY3BpX2NsZWFyX2dwZShOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfSVNSKTsKIAl2YWx1ZSA9IGFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpOwogCi0Jc3dpdGNoIChlYy0+YnVyc3QuZXhwZWN0X2V2ZW50KSB7CisJc3dpdGNoIChlYy0+aW50ci5leHBlY3RfZXZlbnQpIHsKIAljYXNlIEFDUElfRUNfRVZFTlRfT0JGOgogCQlpZiAoISh2YWx1ZSAmIEFDUElfRUNfRkxBR19PQkYpKQogCQkJYnJlYWs7CiAJY2FzZSBBQ1BJX0VDX0VWRU5UX0lCRToKIAkJaWYgKCh2YWx1ZSAmIEFDUElfRUNfRkxBR19JQkYpKQogCQkJYnJlYWs7Ci0JCWVjLT5idXJzdC5leHBlY3RfZXZlbnQgPSAwOwotCQl3YWtlX3VwKCZlYy0+YnVyc3Qud2FpdCk7CisJCWVjLT5pbnRyLmV4cGVjdF9ldmVudCA9IDA7CisJCXdha2VfdXAoJmVjLT5pbnRyLndhaXQpOwogCQlyZXR1cm4gQUNQSV9JTlRFUlJVUFRfSEFORExFRDsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CiAKIAlpZiAodmFsdWUgJiBBQ1BJX0VDX0ZMQUdfU0NJKSB7Ci0JCWF0b21pY19hZGQoMSwgJmVjLT5idXJzdC5wZW5kaW5nX2dwZSk7CisJCWF0b21pY19hZGQoMSwgJmVjLT5pbnRyLnBlbmRpbmdfZ3BlKTsKIAkJc3RhdHVzID0gYWNwaV9vc19xdWV1ZV9mb3JfZXhlY3V0aW9uKE9TRF9QUklPUklUWV9HUEUsCiAJCQkJCQkgICAgIGFjcGlfZWNfZ3BlX3F1ZXJ5LCBlYyk7CiAJCXJldHVybiBzdGF0dXMgPT0gQUVfT0sgPwpAQCAtOTgwLDcgKzk4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmVyIEludGVyZmFjZQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCBhY3BpX2VjX3BvbGxpbmdfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBhY3BpX2VjX3BvbGxfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCWludCByZXN1bHQgPSAwOwogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwpAQCAtOTk5LDcgKzEwMDUsNyBAQAogCiAJZWMtPmNvbW1vbi5oYW5kbGUgPSBkZXZpY2UtPmhhbmRsZTsKIAllYy0+Y29tbW9uLnVpZCA9IC0xOwotCXNwaW5fbG9ja19pbml0KCZlYy0+cG9sbGluZy5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZWMtPnBvbGwubG9jayk7CiAJc3RyY3B5KGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgQUNQSV9FQ19ERVZJQ0VfTkFNRSk7CiAJc3RyY3B5KGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksIEFDUElfRUNfQ0xBU1MpOwogCWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSA9IGVjOwpAQCAtMTAzOCw3ICsxMDQ0LDcgQEAKIAlpZiAocmVzdWx0KQogCQlnb3RvIGVuZDsKIAotCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIlcyBbJXNdIChncGUgJWQpXG4iLAorCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIlcyBbJXNdIChncGUgJWQpIHBvbGxpbmcgbW9kZS5cbiIsCiAJICAgICAgIGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCiAJICAgICAgICh1MzIpIGVjLT5jb21tb24uZ3BlX2JpdCk7CiAKQEAgLTEwNTEsNyArMTA1Nyw3IEBACiAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KLXN0YXRpYyBpbnQgYWNwaV9lY19idXJzdF9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfZWNfaW50cl9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CkBAIC0xMDcwLDEwICsxMDc2LDEwIEBACiAKIAllYy0+Y29tbW9uLmhhbmRsZSA9IGRldmljZS0+aGFuZGxlOwogCWVjLT5jb21tb24udWlkID0gLTE7Ci0JYXRvbWljX3NldCgmZWMtPmJ1cnN0LnBlbmRpbmdfZ3BlLCAwKTsKLQlhdG9taWNfc2V0KCZlYy0+YnVyc3QubGVhdmluZ19idXJzdCwgMSk7Ci0JaW5pdF9NVVRFWCgmZWMtPmJ1cnN0LnNlbSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmZWMtPmJ1cnN0LndhaXQpOworCWF0b21pY19zZXQoJmVjLT5pbnRyLnBlbmRpbmdfZ3BlLCAwKTsKKwlhdG9taWNfc2V0KCZlYy0+aW50ci5sZWF2aW5nX2J1cnN0LCAxKTsKKwlpbml0X01VVEVYKCZlYy0+aW50ci5zZW0pOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVjLT5pbnRyLndhaXQpOwogCXN0cmNweShhY3BpX2RldmljZV9uYW1lKGRldmljZSksIEFDUElfRUNfREVWSUNFX05BTUUpOwogCXN0cmNweShhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCBBQ1BJX0VDX0NMQVNTKTsKIAlhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkgPSBlYzsKQEAgLTExMTIsOCArMTExOCw3IEBACiAJaWYgKHJlc3VsdCkKIAkJZ290byBlbmQ7CiAKLQlwcmludGsoImJ1cnN0LW1vZGUtZWMtMTAtQXVnXG4iKTsKLQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgWyVzXSAoZ3BlICVkKVxuIiwKKwlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgWyVzXSAoZ3BlICVkKSBpbnRlcnJ1cHQgbW9kZS5cbiIsCiAJICAgICAgIGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCiAJICAgICAgICh1MzIpIGVjLT5jb21tb24uZ3BlX2JpdCk7CiAKQEAgLTExNTEsNyArMTE1Niw3IEBACiAJdW5pb24gYWNwaV9lYyAqZWMgPSAodW5pb24gYWNwaV9lYyAqKWNvbnRleHQ7CiAJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICphZGRyOwogCi0JaWYgKHJlc291cmNlLT5pZCAhPSBBQ1BJX1JTVFlQRV9JTykgeworCWlmIChyZXNvdXJjZS0+dHlwZSAhPSBBQ1BJX1JFU09VUkNFX1RZUEVfSU8pIHsKIAkJcmV0dXJuIEFFX09LOwogCX0KIApAQCAtMTE3MSw3ICsxMTc2LDcgQEAKIAlhZGRyLT5hZGRyZXNzX3NwYWNlX2lkID0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPOwogCWFkZHItPnJlZ2lzdGVyX2JpdF93aWR0aCA9IDg7CiAJYWRkci0+cmVnaXN0ZXJfYml0X29mZnNldCA9IDA7Ci0JYWRkci0+YWRkcmVzcyA9IHJlc291cmNlLT5kYXRhLmlvLm1pbl9iYXNlX2FkZHJlc3M7CisJYWRkci0+YWRkcmVzcyA9IHJlc291cmNlLT5kYXRhLmlvLm1pbmltdW07CiAKIAlyZXR1cm4gQUVfT0s7CiB9CkBAIC0xMjY3LDE2ICsxMjcyLDE2IEBACiAJCQl1MzIgTGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR2YWwpCiB7CiAKLQlpZiAoYWNwaV9lY19wb2xsaW5nX21vZGUpCi0JCXJldHVybiBhY3BpX2Zha2VfZWNkdF9wb2xsaW5nX2NhbGxiYWNrKGhhbmRsZSwKKwlpZiAoYWNwaV9lY19wb2xsX21vZGUpCisJCXJldHVybiBhY3BpX2Zha2VfZWNkdF9wb2xsX2NhbGxiYWNrKGhhbmRsZSwKIAkJCQkJCSAgICAgICBMZXZlbCwgY29udGV4dCwgcmV0dmFsKTsKIAllbHNlCi0JCXJldHVybiBhY3BpX2Zha2VfZWNkdF9idXJzdF9jYWxsYmFjayhoYW5kbGUsCisJCXJldHVybiBhY3BpX2Zha2VfZWNkdF9pbnRyX2NhbGxiYWNrKGhhbmRsZSwKIAkJCQkJCSAgICAgTGV2ZWwsIGNvbnRleHQsIHJldHZhbCk7CiB9CiAKIHN0YXRpYyBhY3BpX3N0YXR1cyBfX2luaXQKLWFjcGlfZmFrZV9lY2R0X3BvbGxpbmdfY2FsbGJhY2soYWNwaV9oYW5kbGUgaGFuZGxlLAorYWNwaV9mYWtlX2VjZHRfcG9sbF9jYWxsYmFjayhhY3BpX2hhbmRsZSBoYW5kbGUsCiAJCQkJdTMyIExldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dmFsKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKQEAgLTEyOTUsNyArMTMwMCw3IEBACiAJCQkJICAmZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIHN0YXR1czsKLQlzcGluX2xvY2tfaW5pdCgmZWNfZWNkdC0+cG9sbGluZy5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZWNfZWNkdC0+cG9sbC5sb2NrKTsKIAllY19lY2R0LT5jb21tb24uZ2xvYmFsX2xvY2sgPSBUUlVFOwogCWVjX2VjZHQtPmNvbW1vbi5oYW5kbGUgPSBoYW5kbGU7CiAKQEAgLTEzMDgsMTMgKzEzMTMsMTMgQEAKIH0KIAogc3RhdGljIGFjcGlfc3RhdHVzIF9faW5pdAotYWNwaV9mYWtlX2VjZHRfYnVyc3RfY2FsbGJhY2soYWNwaV9oYW5kbGUgaGFuZGxlLAorYWNwaV9mYWtlX2VjZHRfaW50cl9jYWxsYmFjayhhY3BpX2hhbmRsZSBoYW5kbGUsCiAJCQkgICAgICB1MzIgTGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR2YWwpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JaW5pdF9NVVRFWCgmZWNfZWNkdC0+YnVyc3Quc2VtKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlY19lY2R0LT5idXJzdC53YWl0KTsKKwlpbml0X01VVEVYKCZlY19lY2R0LT5pbnRyLnNlbSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZWNfZWNkdC0+aW50ci53YWl0KTsKIAlzdGF0dXMgPSBhY3BpX3dhbGtfcmVzb3VyY2VzKGhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKIAkJCQkgICAgIGFjcGlfZWNfaW9fcG9ydHMsIGVjX2VjZHQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKQEAgLTEzODAsMTMgKzEzODUsMTMgQEAKIAogc3RhdGljIGludCBfX2luaXQgYWNwaV9lY19nZXRfcmVhbF9lY2R0KHZvaWQpCiB7Ci0JaWYgKGFjcGlfZWNfcG9sbGluZ19tb2RlKQotCQlyZXR1cm4gYWNwaV9lY19wb2xsaW5nX2dldF9yZWFsX2VjZHQoKTsKKwlpZiAoYWNwaV9lY19wb2xsX21vZGUpCisJCXJldHVybiBhY3BpX2VjX3BvbGxfZ2V0X3JlYWxfZWNkdCgpOwogCWVsc2UKLQkJcmV0dXJuIGFjcGlfZWNfYnVyc3RfZ2V0X3JlYWxfZWNkdCgpOworCQlyZXR1cm4gYWNwaV9lY19pbnRyX2dldF9yZWFsX2VjZHQoKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgYWNwaV9lY19wb2xsaW5nX2dldF9yZWFsX2VjZHQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfZWNfcG9sbF9nZXRfcmVhbF9lY2R0KHZvaWQpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBhY3BpX3RhYmxlX2VjZHQgKmVjZHRfcHRyOwpAQCAtMTQxMSw3ICsxNDE2LDcgQEAKIAllY19lY2R0LT5jb21tb24uc3RhdHVzX2FkZHIgPSBlY2R0X3B0ci0+ZWNfY29udHJvbDsKIAllY19lY2R0LT5jb21tb24uZGF0YV9hZGRyID0gZWNkdF9wdHItPmVjX2RhdGE7CiAJZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQgPSBlY2R0X3B0ci0+Z3BlX2JpdDsKLQlzcGluX2xvY2tfaW5pdCgmZWNfZWNkdC0+cG9sbGluZy5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZWNfZWNkdC0+cG9sbC5sb2NrKTsKIAkvKiB1c2UgdGhlIEdMIGp1c3QgdG8gYmUgc2FmZSAqLwogCWVjX2VjZHQtPmNvbW1vbi5nbG9iYWxfbG9jayA9IFRSVUU7CiAJZWNfZWNkdC0+Y29tbW9uLnVpZCA9IGVjZHRfcHRyLT51aWQ7CkBAIC0xNDMxLDcgKzE0MzYsNyBAQAogCXJldHVybiAtRU5PREVWOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBhY3BpX2VjX2J1cnN0X2dldF9yZWFsX2VjZHQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfZWNfaW50cl9nZXRfcmVhbF9lY2R0KHZvaWQpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBhY3BpX3RhYmxlX2VjZHQgKmVjZHRfcHRyOwpAQCAtMTQ1Miw4ICsxNDU3LDggQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJbWVtc2V0KGVjX2VjZHQsIDAsIHNpemVvZih1bmlvbiBhY3BpX2VjKSk7CiAKLQlpbml0X01VVEVYKCZlY19lY2R0LT5idXJzdC5zZW0pOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVjX2VjZHQtPmJ1cnN0LndhaXQpOworCWluaXRfTVVURVgoJmVjX2VjZHQtPmludHIuc2VtKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlY19lY2R0LT5pbnRyLndhaXQpOwogCWVjX2VjZHQtPmNvbW1vbi5jb21tYW5kX2FkZHIgPSBlY2R0X3B0ci0+ZWNfY29udHJvbDsKIAllY19lY2R0LT5jb21tb24uc3RhdHVzX2FkZHIgPSBlY2R0X3B0ci0+ZWNfY29udHJvbDsKIAllY19lY2R0LT5jb21tb24uZGF0YV9hZGRyID0gZWNkdF9wdHItPmVjX2RhdGE7CkBAIC0xNTcxLDIyICsxNTc2LDIyIEBACiB9CiAKIF9fc2V0dXAoImFjcGlfZmFrZV9lY2R0IiwgYWNwaV9mYWtlX2VjZHRfc2V0dXApOwotc3RhdGljIGludCBfX2luaXQgYWNwaV9lY19zZXRfcG9sbGluZ19tb2RlKGNoYXIgKnN0cikKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfZWNfc2V0X2ludHJfbW9kZShjaGFyICpzdHIpCiB7Ci0JaW50IGJ1cnN0OworCWludCBpbnRyOwogCi0JaWYgKCFnZXRfb3B0aW9uKCZzdHIsICZidXJzdCkpCisJaWYgKCFnZXRfb3B0aW9uKCZzdHIsICZpbnRyKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoYnVyc3QpIHsKLQkJYWNwaV9lY19wb2xsaW5nX21vZGUgPSBFQ19CVVJTVDsKLQkJYWNwaV9lY19kcml2ZXIub3BzLmFkZCA9IGFjcGlfZWNfYnVyc3RfYWRkOworCWlmIChpbnRyKSB7CisJCWFjcGlfZWNfcG9sbF9tb2RlID0gRUNfSU5UUjsKKwkJYWNwaV9lY19kcml2ZXIub3BzLmFkZCA9IGFjcGlfZWNfaW50cl9hZGQ7CiAJfSBlbHNlIHsKLQkJYWNwaV9lY19wb2xsaW5nX21vZGUgPSBFQ19QT0xMSU5HOwotCQlhY3BpX2VjX2RyaXZlci5vcHMuYWRkID0gYWNwaV9lY19wb2xsaW5nX2FkZDsKKwkJYWNwaV9lY19wb2xsX21vZGUgPSBFQ19QT0xMOworCQlhY3BpX2VjX2RyaXZlci5vcHMuYWRkID0gYWNwaV9lY19wb2xsX2FkZDsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkVDICVzIG1vZGUuXG4iLCBidXJzdCA/ICJidXJzdCIgOiAicG9sbGluZyIpOworCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJFQyAlcyBtb2RlLlxuIiwgaW50ciA/ICJpbnRlcnJ1cHQiIDogInBvbGxpbmciKTsKIAlyZXR1cm4gMDsKIH0KIAotX19zZXR1cCgiZWNfYnVyc3Q9IiwgYWNwaV9lY19zZXRfcG9sbGluZ19tb2RlKTsKK19fc2V0dXAoImVjX2ludHI9IiwgYWNwaV9lY19zZXRfaW50cl9tb2RlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZldmVudC5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmV2ZW50LmMKaW5kZXggODQyZDFlMy4uYjM4MGFlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmV2ZW50LmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmV2ZW50LmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC03Myw3ICs3Myw3IEBACiAJLyogTWFrZSBzdXJlIHdlIGhhdmUgQUNQSSB0YWJsZXMgKi8KIAogCWlmICghYWNwaV9nYmxfRFNEVCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICJObyBBQ1BJIHRhYmxlcyBwcmVzZW50IVxuIikpOworCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgiTm8gQUNQSSB0YWJsZXMgcHJlc2VudCFcbiIpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX0FDUElfVEFCTEVTKTsKIAl9CiAKQEAgLTEwMCw2ICsxMDAsNDggQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9pbnN0YWxsX2ZhZHRfZ3BlcworICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDb21wbGV0ZXMgaW5pdGlhbGl6YXRpb24gb2YgdGhlIEZBRFQtZGVmaW5lZCBHUEUgYmxvY2tzCisgKiAgICAgICAgICAgICAgKDAgYW5kIDEpLiBUaGlzIGNhdXNlcyB0aGUgX1BSVyBtZXRob2RzIHRvIGJlIHJ1biwgc28gdGhlIEhXCisgKiAgICAgICAgICAgICAgbXVzdCBiZSBmdWxseSBpbml0aWFsaXplZCBhdCB0aGlzIHBvaW50LCBpbmNsdWRpbmcgZ2xvYmFsIGxvY2sKKyAqICAgICAgICAgICAgICBzdXBwb3J0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfZXZfaW5zdGFsbF9mYWR0X2dwZXModm9pZCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9pbnN0YWxsX2ZhZHRfZ3BlcyIpOworCisJLyogTmFtZXNwYWNlIG11c3QgYmUgbG9ja2VkICovCisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCS8qIEZBRFQgR1BFIEJsb2NrIDAgKi8KKworCSh2b2lkKWFjcGlfZXZfaW5pdGlhbGl6ZV9ncGVfYmxvY2soYWNwaV9nYmxfZmFkdF9ncGVfZGV2aWNlLAorCQkJCQkgICBhY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbMF0pOworCisJLyogRkFEVCBHUEUgQmxvY2sgMSAqLworCisJKHZvaWQpYWNwaV9ldl9pbml0aWFsaXplX2dwZV9ibG9jayhhY3BpX2dibF9mYWR0X2dwZV9kZXZpY2UsCisJCQkJCSAgIGFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2Nrc1sxXSk7CisKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2luc3RhbGxfeHJ1cHRfaGFuZGxlcnMKICAqCiAgKiBQQVJBTUVURVJTOiAgTm9uZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZS5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZS5jCmluZGV4IGIyZjIzMmQuLjM1M2I5MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGUuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zNzIsMTQgKzM3MiwxNCBAQAogCiB1MzIgYWNwaV9ldl9ncGVfZGV0ZWN0KHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICogZ3BlX3hydXB0X2xpc3QpCiB7Ci0JdTMyIGludF9zdGF0dXMgPSBBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRDsKLQl1OCBlbmFibGVkX3N0YXR1c19ieXRlOwotCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICpncGVfcmVnaXN0ZXJfaW5mbzsKLQl1MzIgc3RhdHVzX3JlZzsKLQl1MzIgZW5hYmxlX3JlZzsKLQl1MzIgZmxhZ3M7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2s7CisJc3RydWN0IGFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8gKmdwZV9yZWdpc3Rlcl9pbmZvOworCXUzMiBpbnRfc3RhdHVzID0gQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7CisJdTggZW5hYmxlZF9zdGF0dXNfYnl0ZTsKKwl1MzIgc3RhdHVzX3JlZzsKKwl1MzIgZW5hYmxlX3JlZzsKKwlhY3BpX25hdGl2ZV91aW50IGZsYWdzOwogCWFjcGlfbmF0aXZlX3VpbnQgaTsKIAlhY3BpX25hdGl2ZV91aW50IGo7CiAKQEAgLTU5OSw4ICs1OTksMTAgQEAKIAkgICAgQUNQSV9HUEVfRURHRV9UUklHR0VSRUQpIHsKIAkJc3RhdHVzID0gYWNwaV9od19jbGVhcl9ncGUoZ3BlX2V2ZW50X2luZm8pOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9ldl9ncGVfZGlzcGF0Y2g6ICVzLCBVbmFibGUgdG8gY2xlYXIgR1BFWyUyWF1cbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLCBncGVfbnVtYmVyKSk7Ci0JCQlyZXR1cm5fVkFMVUUoQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCIlcywgVW5hYmxlIHRvIGNsZWFyIEdQRVslMlhdXG4iLAorCQkJCQkgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSwKKwkJCQkJICAgZ3BlX251bWJlcikpOworCQkJcmV0dXJuX1VJTlQzMihBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRCk7CiAJCX0KIAl9CiAKQEAgLTYzNyw4ICs2MzksOCBAQAogCQkgICAgQUNQSV9HUEVfTEVWRUxfVFJJR0dFUkVEKSB7CiAJCQlzdGF0dXMgPSBhY3BpX2h3X2NsZWFyX2dwZShncGVfZXZlbnRfaW5mbyk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfZXZfZ3BlX2Rpc3BhdGNoOiAlcywgVW5hYmxlIHRvIGNsZWFyIEdQRVslMlhdXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSwgZ3BlX251bWJlcikpOwotCQkJCXJldHVybl9WQUxVRShBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRCk7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCIlcywgVW5hYmxlIHRvIGNsZWFyIEdQRVslMlhdXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSwgZ3BlX251bWJlcikpOworCQkJCXJldHVybl9VSU5UMzIoQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQpOwogCQkJfQogCQl9CiAJCWJyZWFrOwpAQCAtNjUxLDggKzY1MywxMCBAQAogCQkgKi8KIAkJc3RhdHVzID0gYWNwaV9ldl9kaXNhYmxlX2dwZShncGVfZXZlbnRfaW5mbyk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V2X2dwZV9kaXNwYXRjaDogJXMsIFVuYWJsZSB0byBkaXNhYmxlIEdQRVslMlhdXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSwgZ3BlX251bWJlcikpOwotCQkJcmV0dXJuX1ZBTFVFKEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiJXMsIFVuYWJsZSB0byBkaXNhYmxlIEdQRVslMlhdXG4iLAorCQkJCQkgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSwKKwkJCQkJICAgZ3BlX251bWJlcikpOworCQkJcmV0dXJuX1VJTlQzMihBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRCk7CiAJCX0KIAogCQkvKgpAQCAtNjYzLDcgKzY2Nyw3IEBACiAJCQkJCQkgICAgIGFjcGlfZXZfYXN5bmNoX2V4ZWN1dGVfZ3BlX21ldGhvZCwKIAkJCQkJCSAgICAgZ3BlX2V2ZW50X2luZm8pOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9ldl9ncGVfZGlzcGF0Y2g6ICVzLCBVbmFibGUgdG8gcXVldWUgaGFuZGxlciBmb3IgR1BFWyUyWF0gLSBldmVudCBkaXNhYmxlZFxuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cyksIGdwZV9udW1iZXIpKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiJXMsIFVuYWJsZSB0byBxdWV1ZSBoYW5kbGVyIGZvciBHUEVbJTJYXSAtIGV2ZW50IGRpc2FibGVkXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSwgZ3BlX251bWJlcikpOwogCQl9CiAJCWJyZWFrOwogCkBAIC02NzEsNyArNjc1LDcgQEAKIAogCQkvKiBObyBoYW5kbGVyIG9yIG1ldGhvZCB0byBydW4hICovCiAKLQkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V2X2dwZV9kaXNwYXRjaDogTm8gaGFuZGxlciBvciBtZXRob2QgZm9yIEdQRVslMlhdLCBkaXNhYmxpbmcgZXZlbnRcbiIsIGdwZV9udW1iZXIpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJObyBoYW5kbGVyIG9yIG1ldGhvZCBmb3IgR1BFWyUyWF0sIGRpc2FibGluZyBldmVudFxuIiwgZ3BlX251bWJlcikpOwogCiAJCS8qCiAJCSAqIERpc2FibGUgdGhlIEdQRS4gIFRoZSBHUEUgd2lsbCByZW1haW4gZGlzYWJsZWQgdW50aWwgdGhlIEFDUEkKQEAgLTY3OSwxMyArNjgzLDE1IEBACiAJCSAqLwogCQlzdGF0dXMgPSBhY3BpX2V2X2Rpc2FibGVfZ3BlKGdwZV9ldmVudF9pbmZvKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfZXZfZ3BlX2Rpc3BhdGNoOiAlcywgVW5hYmxlIHRvIGRpc2FibGUgR1BFWyUyWF1cbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLCBncGVfbnVtYmVyKSk7Ci0JCQlyZXR1cm5fVkFMVUUoQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCIlcywgVW5hYmxlIHRvIGRpc2FibGUgR1BFWyUyWF1cbiIsCisJCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLAorCQkJCQkgICBncGVfbnVtYmVyKSk7CisJCQlyZXR1cm5fVUlOVDMyKEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEKTsKIAkJfQogCQlicmVhazsKIAl9CiAKLQlyZXR1cm5fVkFMVUUoQUNQSV9JTlRFUlJVUFRfSEFORExFRCk7CisJcmV0dXJuX1VJTlQzMihBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEKTsKIH0KIAogI2lmZGVmIEFDUElfR1BFX05PVElGWV9DSEVDSwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZWJsay5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZWJsay5jCmluZGV4IGIzMTJlYjMuLjNiOWJiZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGVibGsuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlYmxrLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC03OCw3ICs3OCw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIFRSVUUgaWYgdGhlIGdwZV9ldmVudCBpcyB2YWxpZAogICoKLSAqIERFU0NSSVBUSU9OOiBWYWxpZGF0ZSBhIEdQRSBldmVudC4gIERPIE5PVCBDQUxMIEZST00gSU5URVJSVVBUIExFVkVMLgorICogREVTQ1JJUFRJT046IFZhbGlkYXRlIGEgR1BFIGV2ZW50LiBETyBOT1QgQ0FMTCBGUk9NIElOVEVSUlVQVCBMRVZFTC4KICAqICAgICAgICAgICAgICBTaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiB0aGUgR1BFIGxpc3RzIGFyZSBzZW1hcGhvcmUgbG9ja2VkCiAgKiAgICAgICAgICAgICAgYW5kIG5vdCBzdWJqZWN0IHRvIGNoYW5nZS4KICAqCkBAIC0xMzYsNyArMTM2LDcgQEAKIAlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOwogCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfaW5mbzsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQl1MzIgZmxhZ3M7CisJYWNwaV9uYXRpdmVfdWludCBmbGFnczsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X3dhbGtfZ3BlX2xpc3QiKTsKIApAQCAtMjY0LDcgKzI2NCw3IEBACiAJICogMikgRWRnZS9MZXZlbCBkZXRlcm1pbmF0aW9uIGlzIGJhc2VkIG9uIHRoZSAybmQgY2hhcmFjdGVyCiAJICogICAgb2YgdGhlIG1ldGhvZCBuYW1lCiAJICoKLQkgKiBOT1RFOiBEZWZhdWx0IEdQRSB0eXBlIGlzIFJVTlRJTUUuICBNYXkgYmUgY2hhbmdlZCBsYXRlciB0byBXQUtFCisJICogTk9URTogRGVmYXVsdCBHUEUgdHlwZSBpcyBSVU5USU1FLiBNYXkgYmUgY2hhbmdlZCBsYXRlciB0byBXQUtFCiAJICogaWYgYSBfUFJXIG9iamVjdCBpcyBmb3VuZCB0aGF0IHBvaW50cyB0byB0aGlzIEdQRS4KIAkgKi8KIAlzd2l0Y2ggKG5hbWVbMV0pIHsKQEAgLTI3OSw5ICsyNzksNyBAQAogCWRlZmF1bHQ6CiAJCS8qIFVua25vd24gbWV0aG9kIHR5cGUsIGp1c3QgaWdub3JlIGl0ISAqLwogCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiVW5rbm93biBHUEUgbWV0aG9kIHR5cGU6ICVzIChuYW1lIG5vdCBvZiBmb3JtIF9MeHggb3IgX0V4eClcbiIsCi0JCQkJICBuYW1lKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiVW5rbm93biBHUEUgbWV0aG9kIHR5cGU6ICVzIChuYW1lIG5vdCBvZiBmb3JtIF9MeHggb3IgX0V4eClcbiIsIG5hbWUpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKQEAgLTI5MSw5ICsyODksNyBAQAogCWlmIChncGVfbnVtYmVyID09IEFDUElfVUlOVDMyX01BWCkgewogCQkvKiBDb252ZXJzaW9uIGZhaWxlZDsgaW52YWxpZCBtZXRob2QsIGp1c3QgaWdub3JlIGl0ICovCiAKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJDb3VsZCBub3QgZXh0cmFjdCBHUEUgbnVtYmVyIGZyb20gbmFtZTogJXMgKG5hbWUgaXMgbm90IG9mIGZvcm0gX0x4eCBvciBfRXh4KVxuIiwKLQkJCQkgIG5hbWUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgZXh0cmFjdCBHUEUgbnVtYmVyIGZyb20gbmFtZTogJXMgKG5hbWUgaXMgbm90IG9mIGZvcm0gX0x4eCBvciBfRXh4KVxuIiwgbmFtZSkpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIApAQCAtMzEzLDE0ICszMDksMTQgQEAKIAogCS8qCiAJICogTm93IHdlIGNhbiBhZGQgdGhpcyBpbmZvcm1hdGlvbiB0byB0aGUgZ3BlX2V2ZW50X2luZm8gYmxvY2sKLQkgKiBmb3IgdXNlIGR1cmluZyBkaXNwYXRjaCBvZiB0aGlzIEdQRS4gIERlZmF1bHQgdHlwZSBpcyBSVU5USU1FLCBhbHRob3VnaAorCSAqIGZvciB1c2UgZHVyaW5nIGRpc3BhdGNoIG9mIHRoaXMgR1BFLiBEZWZhdWx0IHR5cGUgaXMgUlVOVElNRSwgYWx0aG91Z2gKIAkgKiB0aGlzIG1heSBjaGFuZ2Ugd2hlbiB0aGUgX1BSVyBtZXRob2RzIGFyZSBleGVjdXRlZCBsYXRlci4KIAkgKi8KIAlncGVfZXZlbnRfaW5mbyA9CiAJICAgICZncGVfYmxvY2stPmV2ZW50X2luZm9bZ3BlX251bWJlciAtIGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXJdOwogCi0JZ3BlX2V2ZW50X2luZm8tPmZsYWdzID0gKHU4KSAodHlwZSB8IEFDUElfR1BFX0RJU1BBVENIX01FVEhPRCB8Ci0JCQkJICAgICAgQUNQSV9HUEVfVFlQRV9SVU5USU1FKTsKKwlncGVfZXZlbnRfaW5mby0+ZmxhZ3MgPSAodTgpCisJICAgICh0eXBlIHwgQUNQSV9HUEVfRElTUEFUQ0hfTUVUSE9EIHwgQUNQSV9HUEVfVFlQRV9SVU5USU1FKTsKIAogCWdwZV9ldmVudF9pbmZvLT5kaXNwYXRjaC5tZXRob2Rfbm9kZSA9CiAJICAgIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9ial9oYW5kbGU7CkBAIC0zNDEsMTEgKzMzNywxMSBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBDYWxsYmFjayBmcm9tIHdhbGtfbmFtZXNwYWNlCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cy4gIE5PVEU6IFdlIGlnbm9yZSBlcnJvcnMgc28gdGhhdCB0aGUgX1BSVyB3YWxrIGlzCisgKiBSRVRVUk46ICAgICAgU3RhdHVzLiBOT1RFOiBXZSBpZ25vcmUgZXJyb3JzIHNvIHRoYXQgdGhlIF9QUlcgd2FsayBpcwogICogICAgICAgICAgICAgIG5vdCBhYm9ydGVkIG9uIGEgc2luZ2xlIF9QUlcgZmFpbHVyZS4KICAqCiAgKiBERVNDUklQVElPTjogQ2FsbGVkIGZyb20gYWNwaV93YWxrX25hbWVzcGFjZS4gRXhwZWN0cyBlYWNoIG9iamVjdCB0byBiZSBhCi0gKiAgICAgICAgICAgICAgRGV2aWNlLiAgUnVuIHRoZSBfUFJXIG1ldGhvZC4gIElmIHByZXNlbnQsIGV4dHJhY3QgdGhlIEdQRQorICogICAgICAgICAgICAgIERldmljZS4gUnVuIHRoZSBfUFJXIG1ldGhvZC4gSWYgcHJlc2VudCwgZXh0cmFjdCB0aGUgR1BFCiAgKiAgICAgICAgICAgICAgbnVtYmVyIGFuZCBtYXJrIHRoZSBHUEUgYXMgYSBXQUtFIEdQRS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDQzLDYgKzQzOSw3IEBACiAKIAkJZ3BlX2V2ZW50X2luZm8tPmZsYWdzICY9CiAJCSAgICB+KEFDUElfR1BFX1dBS0VfRU5BQkxFRCB8IEFDUElfR1BFX1JVTl9FTkFCTEVEKTsKKwogCQlzdGF0dXMgPQogCQkgICAgYWNwaV9ldl9zZXRfZ3BlX3R5cGUoZ3BlX2V2ZW50X2luZm8sIEFDUElfR1BFX1RZUEVfV0FLRSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewpAQCAtNDY2LDcgKzQ2Myw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIEEgR1BFIGludGVycnVwdCBibG9jawogICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgb3IgQ3JlYXRlIGEgR1BFIGludGVycnVwdCBibG9jay4gIFRoZXJlIGlzIG9uZSBpbnRlcnJ1cHQKKyAqIERFU0NSSVBUSU9OOiBHZXQgb3IgQ3JlYXRlIGEgR1BFIGludGVycnVwdCBibG9jay4gVGhlcmUgaXMgb25lIGludGVycnVwdAogICogICAgICAgICAgICAgIGJsb2NrIHBlciB1bmlxdWUgaW50ZXJydXB0IGxldmVsIHVzZWQgZm9yIEdQRXMuCiAgKiAgICAgICAgICAgICAgU2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gdGhlIEdQRSBsaXN0cyBhcmUgc2VtYXBob3JlIGxvY2tlZAogICogICAgICAgICAgICAgIGFuZCBub3Qgc3ViamVjdCB0byBjaGFuZ2UuCkBAIC00NzksNyArNDc2LDcgQEAKIAlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqbmV4dF9ncGVfeHJ1cHQ7CiAJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdDsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTMyIGZsYWdzOworCWFjcGlfbmF0aXZlX3VpbnQgZmxhZ3M7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9nZXRfZ3BlX3hydXB0X2Jsb2NrIik7CiAKQEAgLTUyNiw5ICs1MjMsNyBAQAogCQkJCQkJCSAgIGFjcGlfZXZfZ3BlX3hydXB0X2hhbmRsZXIsCiAJCQkJCQkJICAgZ3BlX3hydXB0KTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJDb3VsZCBub3QgaW5zdGFsbCBHUEUgaW50ZXJydXB0IGhhbmRsZXIgYXQgbGV2ZWwgMHglWFxuIiwKLQkJCQkJICBpbnRlcnJ1cHRfbnVtYmVyKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBpbnN0YWxsIEdQRSBpbnRlcnJ1cHQgaGFuZGxlciBhdCBsZXZlbCAweCVYXG4iLCBpbnRlcnJ1cHRfbnVtYmVyKSk7CiAJCQlyZXR1cm5fUFRSKE5VTEwpOwogCQl9CiAJfQpAQCAtNTUzLDcgKzU0OCw3IEBACiBhY3BpX2V2X2RlbGV0ZV9ncGVfeHJ1cHQoc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdCkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTMyIGZsYWdzOworCWFjcGlfbmF0aXZlX3VpbnQgZmxhZ3M7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9kZWxldGVfZ3BlX3hydXB0Iik7CiAKQEAgLTU2Niw4ICs1NjEsOSBAQAogCiAJLyogRGlzYWJsZSB0aGlzIGludGVycnVwdCAqLwogCi0Jc3RhdHVzID0gYWNwaV9vc19yZW1vdmVfaW50ZXJydXB0X2hhbmRsZXIoZ3BlX3hydXB0LT5pbnRlcnJ1cHRfbnVtYmVyLAotCQkJCQkJICBhY3BpX2V2X2dwZV94cnVwdF9oYW5kbGVyKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX29zX3JlbW92ZV9pbnRlcnJ1cHRfaGFuZGxlcihncGVfeHJ1cHQtPmludGVycnVwdF9udW1iZXIsCisJCQkJCSAgICAgYWNwaV9ldl9ncGVfeHJ1cHRfaGFuZGxlcik7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KQEAgLTYxMCw3ICs2MDYsNyBAQAogCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpuZXh0X2dwZV9ibG9jazsKIAlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2Jsb2NrOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1MzIgZmxhZ3M7CisJYWNwaV9uYXRpdmVfdWludCBmbGFnczsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2luc3RhbGxfZ3BlX2Jsb2NrIik7CiAKQEAgLTY2Myw3ICs2NTksNyBAQAogYWNwaV9zdGF0dXMgYWNwaV9ldl9kZWxldGVfZ3BlX2Jsb2NrKHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2spCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwotCXUzMiBmbGFnczsKKwlhY3BpX25hdGl2ZV91aW50IGZsYWdzOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfaW5zdGFsbF9ncGVfYmxvY2siKTsKIApAQCAtNzQzLDIyICs3MzksMjAgQEAKIAkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QKIAkJCQkJCSAgICAgIGFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8pKTsKIAlpZiAoIWdwZV9yZWdpc3Rlcl9pbmZvKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiQ291bGQgbm90IGFsbG9jYXRlIHRoZSBncGVfcmVnaXN0ZXJfaW5mbyB0YWJsZVxuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBhbGxvY2F0ZSB0aGUgZ3BlX3JlZ2lzdGVyX2luZm8gdGFibGVcbiIpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCiAJLyoKIAkgKiBBbGxvY2F0ZSB0aGUgR1BFIGV2ZW50X2luZm8gYmxvY2suIFRoZXJlIGFyZSBlaWdodCBkaXN0aW5jdCBHUEVzCi0JICogcGVyIHJlZ2lzdGVyLiAgSW5pdGlhbGl6YXRpb24gdG8gemVyb3MgaXMgc3VmZmljaWVudC4KKwkgKiBwZXIgcmVnaXN0ZXIuIEluaXRpYWxpemF0aW9uIHRvIHplcm9zIGlzIHN1ZmZpY2llbnQuCiAJICovCiAJZ3BlX2V2ZW50X2luZm8gPSBBQ1BJX01FTV9DQUxMT0NBVEUoKChhY3BpX3NpemUpIGdwZV9ibG9jay0+CiAJCQkJCSAgICAgcmVnaXN0ZXJfY291bnQgKgogCQkJCQkgICAgIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSAqCiAJCQkJCSAgICBzaXplb2Yoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8pKTsKIAlpZiAoIWdwZV9ldmVudF9pbmZvKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiQ291bGQgbm90IGFsbG9jYXRlIHRoZSBncGVfZXZlbnRfaW5mbyB0YWJsZVxuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBhbGxvY2F0ZSB0aGUgZ3BlX2V2ZW50X2luZm8gdGFibGVcbiIpKTsKIAkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQlnb3RvIGVycm9yX2V4aXQ7CiAJfQpAQCAtNzY5LDkgKzc2Myw5IEBACiAJZ3BlX2Jsb2NrLT5ldmVudF9pbmZvID0gZ3BlX2V2ZW50X2luZm87CiAKIAkvKgotCSAqIEluaXRpYWxpemUgdGhlIEdQRSBSZWdpc3RlciBhbmQgRXZlbnQgc3RydWN0dXJlcy4gIEEgZ29hbCBvZiB0aGVzZQorCSAqIEluaXRpYWxpemUgdGhlIEdQRSBSZWdpc3RlciBhbmQgRXZlbnQgc3RydWN0dXJlcy4gQSBnb2FsIG9mIHRoZXNlCiAJICogdGFibGVzIGlzIHRvIGhpZGUgdGhlIGZhY3QgdGhhdCB0aGVyZSBhcmUgdHdvIHNlcGFyYXRlIEdQRSByZWdpc3RlciBzZXRzCi0JICogaW4gYSBnaXZlbiBncGUgaGFyZHdhcmUgYmxvY2ssIHRoZSBzdGF0dXMgcmVnaXN0ZXJzIG9jY3VweSB0aGUgZmlyc3QgaGFsZiwKKwkgKiBpbiBhIGdpdmVuIEdQRSBoYXJkd2FyZSBibG9jaywgdGhlIHN0YXR1cyByZWdpc3RlcnMgb2NjdXB5IHRoZSBmaXJzdCBoYWxmLAogCSAqIGFuZCB0aGUgZW5hYmxlIHJlZ2lzdGVycyBvY2N1cHkgdGhlIHNlY29uZCBoYWxmLgogCSAqLwogCXRoaXNfcmVnaXN0ZXIgPSBncGVfcmVnaXN0ZXJfaW5mbzsKQEAgLTgxMiwxMSArODA2LDggQEAKIAkJCXRoaXNfZXZlbnQrKzsKIAkJfQogCi0JCS8qCi0JCSAqIENsZWFyIHRoZSBzdGF0dXMvZW5hYmxlIHJlZ2lzdGVycy4gIE5vdGUgdGhhdCBzdGF0dXMgcmVnaXN0ZXJzCi0JCSAqIGFyZSBjbGVhcmVkIGJ5IHdyaXRpbmcgYSAnMScsIHdoaWxlIGVuYWJsZSByZWdpc3RlcnMgYXJlIGNsZWFyZWQKLQkJICogYnkgd3JpdGluZyBhICcwJy4KLQkJICovCisJCS8qIERpc2FibGUgYWxsIEdQRXMgd2l0aGluIHRoaXMgcmVnaXN0ZXIgKi8KKwogCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZShBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCwgMHgwMCwKIAkJCQkJCSAmdGhpc19yZWdpc3Rlci0+CiAJCQkJCQkgZW5hYmxlX2FkZHJlc3MpOwpAQCAtODI0LDYgKzgxNSw4IEBACiAJCQlnb3RvIGVycm9yX2V4aXQ7CiAJCX0KIAorCQkvKiBDbGVhciBhbnkgcGVuZGluZyBHUEUgZXZlbnRzIHdpdGhpbiB0aGlzIHJlZ2lzdGVyICovCisKIAkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgsIDB4RkYsCiAJCQkJCQkgJnRoaXNfcmVnaXN0ZXItPgogCQkJCQkJIHN0YXR1c19hZGRyZXNzKTsKQEAgLTg2MCw3ICs4NTMsOSBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogQ3JlYXRlIGFuZCBJbnN0YWxsIGEgYmxvY2sgb2YgR1BFIHJlZ2lzdGVycworICogREVTQ1JJUFRJT046IENyZWF0ZSBhbmQgSW5zdGFsbCBhIGJsb2NrIG9mIEdQRSByZWdpc3RlcnMuIEFsbCBHUEVzIHdpdGhpbgorICogICAgICAgICAgICAgIHRoZSBibG9jayBhcmUgZGlzYWJsZWQgYXQgZXhpdC4KKyAqICAgICAgICAgICAgICBOb3RlOiBBc3N1bWVzIG5hbWVzcGFjZSBpcyBsb2NrZWQuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtODcyLDE0ICs4NjcsOCBAQAogCQkJIHUzMiBpbnRlcnJ1cHRfbnVtYmVyLAogCQkJIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICoqcmV0dXJuX2dwZV9ibG9jaykKIHsKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOwotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKLQlhY3BpX25hdGl2ZV91aW50IGk7Ci0JYWNwaV9uYXRpdmVfdWludCBqOwotCXUzMiB3YWtlX2dwZV9jb3VudDsKLQl1MzIgZ3BlX2VuYWJsZWRfY291bnQ7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2dwZV93YWxrX2luZm8gZ3BlX2luZm87CisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jazsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2NyZWF0ZV9ncGVfYmxvY2siKTsKIApAQCAtODk2LDIyICs4ODUsMjQgQEAKIAogCS8qIEluaXRpYWxpemUgdGhlIG5ldyBHUEUgYmxvY2sgKi8KIAorCWdwZV9ibG9jay0+bm9kZSA9IGdwZV9kZXZpY2U7CiAJZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCA9IHJlZ2lzdGVyX2NvdW50OwogCWdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgPSBncGVfYmxvY2tfYmFzZV9udW1iZXI7Ci0JZ3BlX2Jsb2NrLT5ub2RlID0gZ3BlX2RldmljZTsKIAogCUFDUElfTUVNQ1BZKCZncGVfYmxvY2stPmJsb2NrX2FkZHJlc3MsIGdwZV9ibG9ja19hZGRyZXNzLAogCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcykpOwogCi0JLyogQ3JlYXRlIHRoZSByZWdpc3Rlcl9pbmZvIGFuZCBldmVudF9pbmZvIHN1Yi1zdHJ1Y3R1cmVzICovCi0KKwkvKgorCSAqIENyZWF0ZSB0aGUgcmVnaXN0ZXJfaW5mbyBhbmQgZXZlbnRfaW5mbyBzdWItc3RydWN0dXJlcworCSAqIE5vdGU6IGRpc2FibGVzIGFuZCBjbGVhcnMgYWxsIEdQRXMgaW4gdGhlIGJsb2NrCisJICovCiAJc3RhdHVzID0gYWNwaV9ldl9jcmVhdGVfZ3BlX2luZm9fYmxvY2tzKGdwZV9ibG9jayk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfTUVNX0ZSRUUoZ3BlX2Jsb2NrKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JLyogSW5zdGFsbCB0aGUgbmV3IGJsb2NrIGluIHRoZSBnbG9iYWwgbGlzdChzKSAqLworCS8qIEluc3RhbGwgdGhlIG5ldyBibG9jayBpbiB0aGUgZ2xvYmFsIGxpc3RzICovCiAKIAlzdGF0dXMgPSBhY3BpX2V2X2luc3RhbGxfZ3BlX2Jsb2NrKGdwZV9ibG9jaywgaW50ZXJydXB0X251bWJlcik7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CkBAIC05MjYsMTYgKzkxNyw3MCBAQAogCQkJCQlhY3BpX2V2X3NhdmVfbWV0aG9kX2luZm8sIGdwZV9ibG9jaywKIAkJCQkJTlVMTCk7CiAKKwkvKiBSZXR1cm4gdGhlIG5ldyBibG9jayAqLworCisJaWYgKHJldHVybl9ncGVfYmxvY2spIHsKKwkJKCpyZXR1cm5fZ3BlX2Jsb2NrKSA9IGdwZV9ibG9jazsKKwl9CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOSVQsCisJCQkgICJHUEUgJTAyWCB0byAlMDJYIFslNC40c10gJXUgcmVncyBvbiBpbnQgMHglWFxuIiwKKwkJCSAgKHUzMikgZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlciwKKwkJCSAgKHUzMikgKGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgKworCQkJCSAoKGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgKgorCQkJCSAgIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSAtIDEpKSwKKwkJCSAgZ3BlX2RldmljZS0+bmFtZS5hc2NpaSwgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCwKKwkJCSAgaW50ZXJydXB0X251bWJlcikpOworCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9pbml0aWFsaXplX2dwZV9ibG9jaworICoKKyAqIFBBUkFNRVRFUlM6ICBncGVfZGV2aWNlICAgICAgICAgIC0gSGFuZGxlIHRvIHRoZSBwYXJlbnQgR1BFIGJsb2NrCisgKiAgICAgICAgICAgICAgZ3BlX2Jsb2NrICAgICAgICAgICAtIEdwZSBCbG9jayBpbmZvCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIGFuZCBlbmFibGUgYSBHUEUgYmxvY2suIEZpcnN0IGZpbmQgYW5kIHJ1biBhbnkKKyAqICAgICAgICAgICAgICBfUFJUIG1ldGhvZHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBibG9jaywgdGhlbiBlbmFibGUgdGhlCisgKiAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgR1BFcy4KKyAqICAgICAgICAgICAgICBOb3RlOiBBc3N1bWVzIG5hbWVzcGFjZSBpcyBsb2NrZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXZfaW5pdGlhbGl6ZV9ncGVfYmxvY2soc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmdwZV9kZXZpY2UsCisJCQkgICAgIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2spCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKKwlzdHJ1Y3QgYWNwaV9ncGVfd2Fsa19pbmZvIGdwZV9pbmZvOworCXUzMiB3YWtlX2dwZV9jb3VudDsKKwl1MzIgZ3BlX2VuYWJsZWRfY291bnQ7CisJYWNwaV9uYXRpdmVfdWludCBpOworCWFjcGlfbmF0aXZlX3VpbnQgajsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2luaXRpYWxpemVfZ3BlX2Jsb2NrIik7CisKKwkvKiBJZ25vcmUgYSBudWxsIEdQRSBibG9jayAoZS5nLiwgaWYgbm8gR1BFIGJsb2NrIDEgZXhpc3RzKSAqLworCisJaWYgKCFncGVfYmxvY2spIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisKIAkvKgotCSAqIFJ1bnRpbWUgb3B0aW9uOiBTaG91bGQgV2FrZSBHUEVzIGJlIGVuYWJsZWQgYXQgcnVudGltZT8gIFRoZSBkZWZhdWx0Ci0JICogaXMgTm8sIHRoZXkgc2hvdWxkIG9ubHkgYmUgZW5hYmxlZCBqdXN0IGFzIHRoZSBtYWNoaW5lIGdvZXMgdG8gc2xlZXAuCisJICogUnVudGltZSBvcHRpb246IFNob3VsZCB3YWtlIEdQRXMgYmUgZW5hYmxlZCBhdCBydW50aW1lPyAgVGhlIGRlZmF1bHQKKwkgKiBpcyBubywgdGhleSBzaG91bGQgb25seSBiZSBlbmFibGVkIGp1c3QgYXMgdGhlIG1hY2hpbmUgZ29lcyB0byBzbGVlcC4KIAkgKi8KIAlpZiAoYWNwaV9nYmxfbGVhdmVfd2FrZV9ncGVzX2Rpc2FibGVkKSB7CiAJCS8qCi0JCSAqIERpZmZlcmVudGlhdGUgUlVOVElNRSB2cyBXQUtFIEdQRXMsIHZpYSB0aGUgX1BSVyBjb250cm9sIG1ldGhvZHMuCi0JCSAqIChFYWNoIEdQRSB0aGF0IGhhcyBvbmUgb3IgbW9yZSBfUFJXcyB0aGF0IHJlZmVyZW5jZSBpdCBpcyBieQotCQkgKiBkZWZpbml0aW9uIGEgV0FLRSBHUEUgYW5kIHdpbGwgbm90IGJlIGVuYWJsZWQgd2hpbGUgdGhlIG1hY2hpbmUKLQkJICogaXMgcnVubmluZy4pCisJCSAqIERpZmZlcmVudGlhdGUgcnVudGltZSB2cyB3YWtlIEdQRXMsIHZpYSB0aGUgX1BSVyBjb250cm9sIG1ldGhvZHMuCisJCSAqIEVhY2ggR1BFIHRoYXQgaGFzIG9uZSBvciBtb3JlIF9QUldzIHRoYXQgcmVmZXJlbmNlIGl0IGlzIGJ5CisJCSAqIGRlZmluaXRpb24gYSB3YWtlIEdQRSBhbmQgd2lsbCBub3QgYmUgZW5hYmxlZCB3aGlsZSB0aGUgbWFjaGluZQorCQkgKiBpcyBydW5uaW5nLgogCQkgKi8KIAkJZ3BlX2luZm8uZ3BlX2Jsb2NrID0gZ3BlX2Jsb2NrOwogCQlncGVfaW5mby5ncGVfZGV2aWNlID0gZ3BlX2RldmljZTsKQEAgLTk0OCw5ICs5OTMsMTIgQEAKIAl9CiAKIAkvKgotCSAqIEVuYWJsZSBhbGwgR1BFcyBpbiB0aGlzIGJsb2NrIHRoYXQgYXJlIDEpICJydW50aW1lIiBvciAicnVuL3dha2UiIEdQRXMsCi0JICogYW5kIDIpIGhhdmUgYSBjb3JyZXNwb25kaW5nIF9MeHggb3IgX0V4eCBtZXRob2QuICBBbGwgb3RoZXIgR1BFcyBtdXN0Ci0JICogYmUgZW5hYmxlZCB2aWEgdGhlIGFjcGlfZW5hYmxlX2dwZSgpIGV4dGVybmFsIGludGVyZmFjZS4KKwkgKiBFbmFibGUgYWxsIEdQRXMgaW4gdGhpcyBibG9jayB0aGF0IGhhdmUgdGhlc2UgYXR0cmlidXRlczoKKwkgKiAxKSBhcmUgInJ1bnRpbWUiIG9yICJydW4vd2FrZSIgR1BFcywgYW5kCisJICogMikgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgX0x4eCBvciBfRXh4IG1ldGhvZAorCSAqCisJICogQW55IG90aGVyIEdQRXMgd2l0aGluIHRoaXMgYmxvY2sgbXVzdCBiZSBlbmFibGVkIHZpYSB0aGUgYWNwaV9lbmFibGVfZ3BlKCkKKwkgKiBleHRlcm5hbCBpbnRlcmZhY2UuCiAJICovCiAJd2FrZV9ncGVfY291bnQgPSAwOwogCWdwZV9lbmFibGVkX2NvdW50ID0gMDsKQEAgLTk3NiwzMiArMTAyNCwxOSBAQAogCQl9CiAJfQogCi0JLyogRHVtcCBpbmZvIGFib3V0IHRoaXMgR1BFIGJsb2NrICovCi0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOSVQsCi0JCQkgICJHUEUgJTAyWCB0byAlMDJYIFslNC40c10gJXUgcmVncyBvbiBpbnQgMHglWFxuIiwKLQkJCSAgKHUzMikgZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlciwKLQkJCSAgKHUzMikgKGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgKwotCQkJCSAoKGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgKgotCQkJCSAgIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSAtIDEpKSwKLQkJCSAgZ3BlX2RldmljZS0+bmFtZS5hc2NpaSwgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCwKLQkJCSAgaW50ZXJydXB0X251bWJlcikpOwotCi0JLyogRW5hYmxlIGFsbCB2YWxpZCBHUEVzIGZvdW5kIGFib3ZlICovCi0KLQlzdGF0dXMgPSBhY3BpX2h3X2VuYWJsZV9ydW50aW1lX2dwZV9ibG9jayhOVUxMLCBncGVfYmxvY2spOwotCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTklULAogCQkJICAiRm91bmQgJXUgV2FrZSwgRW5hYmxlZCAldSBSdW50aW1lIEdQRXMgaW4gdGhpcyBibG9ja1xuIiwKIAkJCSAgd2FrZV9ncGVfY291bnQsIGdwZV9lbmFibGVkX2NvdW50KSk7CiAKLQkvKiBSZXR1cm4gdGhlIG5ldyBibG9jayAqLworCS8qIEVuYWJsZSBhbGwgdmFsaWQgcnVudGltZSBHUEVzIGZvdW5kIGFib3ZlICovCiAKLQlpZiAocmV0dXJuX2dwZV9ibG9jaykgewotCQkoKnJldHVybl9ncGVfYmxvY2spID0gZ3BlX2Jsb2NrOworCXN0YXR1cyA9IGFjcGlfaHdfZW5hYmxlX3J1bnRpbWVfZ3BlX2Jsb2NrKE5VTEwsIGdwZV9ibG9jayk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IGVuYWJsZSBHUEVzIGluIGdwZV9ibG9jayAlcFxuIiwKKwkJCQkgICBncGVfYmxvY2spKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldm1pc2MuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZtaXNjLmMKaW5kZXggN2U1N2I4NC4uNzg4ODMyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldm1pc2MuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2bWlzYy5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNTQyLDkgKzU0Miw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCBBQ1BJX05VTV9GSVhFRF9FVkVOVFM7IGkrKykgewogCQkJc3RhdHVzID0gYWNwaV9kaXNhYmxlX2V2ZW50KCh1MzIpIGksIDApOwogCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCSAgIkNvdWxkIG5vdCBkaXNhYmxlIGZpeGVkIGV2ZW50ICVkXG4iLAotCQkJCQkJICAodTMyKSBpKSk7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgZGlzYWJsZSBmaXhlZCBldmVudCAlZFxuIiwgKHUzMikgaSkpOwogCQkJfQogCQl9CiAKQEAgLTU1Niw4ICs1NTQsNyBAQAogCiAJCXN0YXR1cyA9IGFjcGlfZXZfcmVtb3ZlX3NjaV9oYW5kbGVyKCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAiQ291bGQgbm90IHJlbW92ZSBTQ0kgaGFuZGxlclxuIikpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgcmVtb3ZlIFNDSSBoYW5kbGVyXG4iKSk7CiAJCX0KIAl9CiAKQEAgLTU3MCw4ICs1NjcsNyBAQAogCWlmIChhY3BpX2dibF9vcmlnaW5hbF9tb2RlID09IEFDUElfU1lTX01PREVfTEVHQUNZKSB7CiAJCXN0YXR1cyA9IGFjcGlfZGlzYWJsZSgpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKLQkJCQkJICAiYWNwaV9kaXNhYmxlIGZhaWxlZFxuIikpOworCQkJQUNQSV9SRVBPUlRfV0FSTklORygoImFjcGlfZGlzYWJsZSBmYWlsZWRcbiIpKTsKIAkJfQogCX0KIAlyZXR1cm5fVk9JRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZWdpb24uYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZWdpb24uYwppbmRleCA4NGZhZDA4Li45MDBlNWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmVnaW9uLmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJlZ2lvbi5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMjk1LDEyICsyOTUsMTEgQEAKIAogCWhhbmRsZXJfZGVzYyA9IHJlZ2lvbl9vYmotPnJlZ2lvbi5oYW5kbGVyOwogCWlmICghaGFuZGxlcl9kZXNjKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiTm8gaGFuZGxlciBmb3IgUmVnaW9uIFslNC40c10gKCVwKSBbJXNdXG4iLAotCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKHJlZ2lvbl9vYmotPnJlZ2lvbi4KLQkJCQkJCQlub2RlKSwgcmVnaW9uX29iaiwKLQkJCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHJlZ2lvbl9vYmotPnJlZ2lvbi4KLQkJCQkJCQkgIHNwYWNlX2lkKSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk5vIGhhbmRsZXIgZm9yIFJlZ2lvbiBbJTQuNHNdICglcCkgWyVzXVxuIiwKKwkJCQkgICBhY3BpX3V0X2dldF9ub2RlX25hbWUocmVnaW9uX29iai0+cmVnaW9uLgorCQkJCQkJCSBub2RlKSwgcmVnaW9uX29iaiwKKwkJCQkgICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShyZWdpb25fb2JqLT5yZWdpb24uCisJCQkJCQkJICAgc3BhY2VfaWQpKSk7CiAKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7CiAJfQpAQCAtMzE3LDEyICszMTYsNyBAQAogCQlpZiAoIXJlZ2lvbl9zZXR1cCkgewogCQkJLyogTm8gaW5pdGlhbGl6YXRpb24gcm91dGluZSwgZXhpdCB3aXRoIGVycm9yICovCiAKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgIk5vIGluaXQgcm91dGluZSBmb3IgcmVnaW9uKCVwKSBbJXNdXG4iLAotCQkJCQkgIHJlZ2lvbl9vYmosCi0JCQkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmVnaW9uX29iai0+Ci0JCQkJCQkJCSAgcmVnaW9uLgotCQkJCQkJCQkgIHNwYWNlX2lkKSkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJObyBpbml0IHJvdXRpbmUgZm9yIHJlZ2lvbiglcCkgWyVzXVxuIiwgcmVnaW9uX29iaiwgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmVnaW9uX29iai0+cmVnaW9uLnNwYWNlX2lkKSkpOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7CiAJCX0KIApAQCAtMzQ3LDEyICszNDEsMTEgQEAKIAkJLyogQ2hlY2sgZm9yIGZhaWx1cmUgb2YgdGhlIFJlZ2lvbiBTZXR1cCAqLwogCiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAiUmVnaW9uIEluaXQ6ICVzIFslc11cbiIsCi0JCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cyksCi0JCQkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmVnaW9uX29iai0+Ci0JCQkJCQkJCSAgcmVnaW9uLgotCQkJCQkJCQkgIHNwYWNlX2lkKSkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJSZWdpb24gSW5pdGlhbGl6YXRpb246ICVzIFslc11cbiIsCisJCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLAorCQkJCQkgICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShyZWdpb25fb2JqLT4KKwkJCQkJCQkJICAgcmVnaW9uLgorCQkJCQkJCQkgICBzcGFjZV9pZCkpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKQEAgLTUwMSwxMiArNDk0LDcgQEAKIAogCQkJc3RhdHVzID0gYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2QocmVnaW9uX29iaiwgMCk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJICAiJXMgZnJvbSByZWdpb24gX1JFRywgWyVzXVxuIiwKLQkJCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cyksCi0JCQkJCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lCi0JCQkJCQkgIChyZWdpb25fb2JqLT5yZWdpb24uCi0JCQkJCQkgICBzcGFjZV9pZCkpKTsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIiVzIGZyb20gcmVnaW9uIF9SRUcsIFslc11cbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLCBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShyZWdpb25fb2JqLT5yZWdpb24uc3BhY2VfaWQpKSk7CiAJCQl9CiAKIAkJCWlmIChhY3BpX25zX2lzX2xvY2tlZCkgewpAQCAtNTI4LDEyICs1MTYsNyBAQAogCQkJLyogSW5pdCByb3V0aW5lIG1heSBmYWlsLCBKdXN0IGlnbm9yZSBlcnJvcnMgKi8KIAogCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCSAgIiVzIGZyb20gcmVnaW9uIGluaXQsIFslc11cbiIsCi0JCQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLAotCQkJCQkJICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZQotCQkJCQkJICAocmVnaW9uX29iai0+cmVnaW9uLgotCQkJCQkJICAgc3BhY2VfaWQpKSk7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCIlcyBmcm9tIHJlZ2lvbiBpbml0LCBbJXNdXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSwgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmVnaW9uX29iai0+cmVnaW9uLnNwYWNlX2lkKSkpOwogCQkJfQogCiAJCQlyZWdpb25fb2JqLT5yZWdpb24uZmxhZ3MgJj0gfihBT1BPQkpfU0VUVVBfQ09NUExFVEUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJnbmluaS5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJnbmluaS5jCmluZGV4IGExYmQyZGEuLmRlMWEzOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZ25pbmkuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmduaW5pLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2c2NpLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2c2NpLmMKaW5kZXggMTQxODM1OS4uOWE2MjIxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnNjaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZzY2kuYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC04OCw3ICs4OCw3IEBACiAJICovCiAJaW50ZXJydXB0X2hhbmRsZWQgfD0gYWNwaV9ldl9ncGVfZGV0ZWN0KGdwZV94cnVwdF9saXN0KTsKIAotCXJldHVybl9WQUxVRShpbnRlcnJ1cHRfaGFuZGxlZCk7CisJcmV0dXJuX1VJTlQzMihpbnRlcnJ1cHRfaGFuZGxlZCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMjEsNyArMTIxLDcgQEAKIAkgKi8KIAlpbnRlcnJ1cHRfaGFuZGxlZCB8PSBhY3BpX2V2X2dwZV9kZXRlY3QoZ3BlX3hydXB0X2xpc3QpOwogCi0JcmV0dXJuX1ZBTFVFKGludGVycnVwdF9oYW5kbGVkKTsKKwlyZXR1cm5fVUlOVDMyKGludGVycnVwdF9oYW5kbGVkKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmYWNlLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZhY2UuYwppbmRleCA0M2IzM2QxLi5iMmY2OWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZhY2UuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZhY2UuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTE0Myw4ICsxNDMsOCBAQAogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKIAkJc3RhdHVzID0gYWNwaV9lbmFibGVfZXZlbnQoZXZlbnQsIDApOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sCi0JCQkJICAiQ291bGQgbm90IGVuYWJsZSBmaXhlZCBldmVudC5cbiIpKTsKKwkJQUNQSV9SRVBPUlRfV0FSTklORygoIkNvdWxkIG5vdCBlbmFibGUgZml4ZWQgZXZlbnQgJVhcbiIsCisJCQkJICAgICBldmVudCkpOwogCiAJCS8qIFJlbW92ZSB0aGUgaGFuZGxlciAqLwogCkBAIC0yMDQsMTAgKzIwNCw5IEBACiAJYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbZXZlbnRdLmNvbnRleHQgPSBOVUxMOwogCiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKLQkJCQkgICJDb3VsZCBub3Qgd3JpdGUgdG8gZml4ZWQgZXZlbnQgZW5hYmxlIHJlZ2lzdGVyLlxuIikpOworCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgiQ291bGQgbm90IHdyaXRlIHRvIGZpeGVkIGV2ZW50IGVuYWJsZSByZWdpc3RlciAlWFxuIiwgZXZlbnQpKTsKIAl9IGVsc2UgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJEaXNhYmxlZCBmaXhlZCBldmVudCAlWC5cbiIsCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkRpc2FibGVkIGZpeGVkIGV2ZW50ICVYXG4iLAogCQkJCSAgZXZlbnQpKTsKIAl9CiAKQEAgLTQzNCw3ICs0MzMsNyBAQAogCiAJaWYgKGRldmljZSA9PSBBQ1BJX1JPT1RfT0JKRUNUKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCQkgICJSZW1vdmluZyBub3RpZnkgaGFuZGxlciBmb3IgUk9PVCBvYmplY3QuXG4iKSk7CisJCQkJICAiUmVtb3Zpbmcgbm90aWZ5IGhhbmRsZXIgZm9yIG5hbWVzcGFjZSByb290IG9iamVjdFxuIikpOwogCiAJCWlmICgoKGhhbmRsZXJfdHlwZSAmIEFDUElfU1lTVEVNX05PVElGWSkgJiYKIAkJICAgICAhYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5oYW5kbGVyKSB8fApAQCAtNTYyLDcgKzU2MSw3IEBACiAJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvOwogCXN0cnVjdCBhY3BpX2hhbmRsZXJfaW5mbyAqaGFuZGxlcjsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTMyIGZsYWdzOworCWFjcGlfbmF0aXZlX3VpbnQgZmxhZ3M7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2luc3RhbGxfZ3BlX2hhbmRsZXIiKTsKIApAQCAtNjUzLDcgKzY1Miw3IEBACiAJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvOwogCXN0cnVjdCBhY3BpX2hhbmRsZXJfaW5mbyAqaGFuZGxlcjsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTMyIGZsYWdzOworCWFjcGlfbmF0aXZlX3VpbnQgZmxhZ3M7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3JlbW92ZV9ncGVfaGFuZGxlciIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZldm50LmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZldm50LmMKaW5kZXggODg3ZmY5Zi4uOTBlYjc5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmZXZudC5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmV2bnQuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTcwLDggKzcwLDcgQEAKIAkvKiBNYWtlIHN1cmUgd2UgaGF2ZSB0aGUgRkFEVCAqLwogCiAJaWYgKCFhY3BpX2dibF9GQURUKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKLQkJCQkgICJObyBGQURUIGluZm9ybWF0aW9uIHByZXNlbnQhXG4iKSk7CisJCUFDUElfUkVQT1JUX1dBUk5JTkcoKCJObyBGQURUIGluZm9ybWF0aW9uIHByZXNlbnQhXG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19BQ1BJX1RBQkxFUyk7CiAJfQogCkBAIC04Myw3ICs4Miw3IEBACiAKIAkJc3RhdHVzID0gYWNwaV9od19zZXRfbW9kZShBQ1BJX1NZU19NT0RFX0FDUEkpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IHRyYW5zaXRpb24gdG8gQUNQSSBtb2RlLlxuIikpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgdHJhbnNpdGlvbiB0byBBQ1BJIG1vZGVcbiIpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKQEAgLTExMyw4ICsxMTIsNyBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZGlzYWJsZSIpOwogCiAJaWYgKCFhY3BpX2dibF9GQURUKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKLQkJCQkgICJObyBGQURUIGluZm9ybWF0aW9uIHByZXNlbnQhXG4iKSk7CisJCUFDUElfUkVQT1JUX1dBUk5JTkcoKCJObyBGQURUIGluZm9ybWF0aW9uIHByZXNlbnQhXG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19BQ1BJX1RBQkxFUyk7CiAJfQogCkBAIC0xMjcsOCArMTI1LDcgQEAKIAkJc3RhdHVzID0gYWNwaV9od19zZXRfbW9kZShBQ1BJX1NZU19NT0RFX0xFR0FDWSk7CiAKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJDb3VsZCBub3QgZXhpdCBBQ1BJIG1vZGUgdG8gbGVnYWN5IG1vZGUiKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBleGl0IEFDUEkgbW9kZSB0byBsZWdhY3kgbW9kZSIpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKQEAgLTE4NSw5ICsxODIsOCBAQAogCX0KIAogCWlmICh2YWx1ZSAhPSAxKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiQ291bGQgbm90IGVuYWJsZSAlcyBldmVudFxuIiwKLQkJCQkgIGFjcGlfdXRfZ2V0X2V2ZW50X25hbWUoZXZlbnQpKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IGVuYWJsZSAlcyBldmVudFxuIiwKKwkJCQkgICBhY3BpX3V0X2dldF9ldmVudF9uYW1lKGV2ZW50KSkpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fSEFSRFdBUkVfUkVTUE9OU0UpOwogCX0KIApAQCAtMzg0LDkgKzM4MCw4IEBACiAJfQogCiAJaWYgKHZhbHVlICE9IDApIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJDb3VsZCBub3QgZGlzYWJsZSAlcyBldmVudHNcbiIsCi0JCQkJICBhY3BpX3V0X2dldF9ldmVudF9uYW1lKGV2ZW50KSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBkaXNhYmxlICVzIGV2ZW50c1xuIiwKKwkJCQkgICBhY3BpX3V0X2dldF9ldmVudF9uYW1lKGV2ZW50KSkpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fSEFSRFdBUkVfUkVTUE9OU0UpOwogCX0KIApAQCAtNjI2LDYgKzYyMSwxMyBAQAogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CiAKKwkvKiBSdW4gdGhlIF9QUlcgbWV0aG9kcyBhbmQgZW5hYmxlIHRoZSBHUEVzICovCisKKwlzdGF0dXMgPSBhY3BpX2V2X2luaXRpYWxpemVfZ3BlX2Jsb2NrKG5vZGUsIGdwZV9ibG9jayk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKwogCS8qIEdldCB0aGUgZGV2aWNlX29iamVjdCBhdHRhY2hlZCB0byB0aGUgbm9kZSAqLwogCiAJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZyZWduLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZyZWduLmMKaW5kZXggNmYyOGVhMi4uYWJmNWNhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmcmVnbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZnJlZ24uYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNvbmZpZy5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29uZmlnLmMKaW5kZXggMWNlMzY1ZC4uMTA5ZDAyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29uZmlnLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29uZmlnLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC00MTMsOSArNDEzLDcgQEAKIAkgICAgKCFBQ1BJX1NUUk5DTVAodGFibGVfcHRyLT5zaWduYXR1cmUsCiAJCQkgICBhY3BpX2dibF90YWJsZV9kYXRhW0FDUElfVEFCTEVfU1NEVF0uc2lnbmF0dXJlLAogCQkJICAgYWNwaV9nYmxfdGFibGVfZGF0YVtBQ1BJX1RBQkxFX1NTRFRdLnNpZ19sZW5ndGgpKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIlRhYmxlIGhhcyBpbnZhbGlkIHNpZ25hdHVyZSBbJTQuNHNdLCBtdXN0IGJlIFNTRFQgb3IgUFNEVFxuIiwKLQkJCQkgIHRhYmxlX3B0ci0+c2lnbmF0dXJlKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiVGFibGUgaGFzIGludmFsaWQgc2lnbmF0dXJlIFslNC40c10sIG11c3QgYmUgU1NEVCBvciBQU0RUXG4iLCB0YWJsZV9wdHItPnNpZ25hdHVyZSkpOwogCQlzdGF0dXMgPSBBRV9CQURfU0lHTkFUVVJFOwogCQlnb3RvIGNsZWFudXA7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29udnJ0LmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb252cnQuYwppbmRleCAwNGU1MTk0Li5lNmY1NWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb252cnQuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb252cnQuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTUwNCwxOCArNTA0LDEyIEBACiAJCX0KIAogCQkvKgotCQkgKiBQZXJmb3JtIHRoZSBjb252ZXJzaW9uLgorCQkgKiBDcmVhdGUgYSBuZXcgc3RyaW5nIG9iamVjdCBhbmQgc3RyaW5nIGJ1ZmZlcgogCQkgKiAoLTEgYmVjYXVzZSBvZiBleHRyYSBzZXBhcmF0b3IgaW5jbHVkZWQgaW4gc3RyaW5nX2xlbmd0aCBmcm9tIGFib3ZlKQogCQkgKi8KLQkJc3RyaW5nX2xlbmd0aC0tOwotCQlpZiAoc3RyaW5nX2xlbmd0aCA+IEFDUElfTUFYX1NUUklOR19DT05WRVJTSU9OKSB7CS8qIEFDUEkgbGltaXQgKi8KLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfU1RSSU5HX0xJTUlUKTsKLQkJfQotCi0JCS8qIENyZWF0ZSBhIG5ldyBzdHJpbmcgb2JqZWN0IGFuZCBzdHJpbmcgYnVmZmVyICovCi0KIAkJcmV0dXJuX2Rlc2MgPQotCQkgICAgYWNwaV91dF9jcmVhdGVfc3RyaW5nX29iamVjdCgoYWNwaV9zaXplKSBzdHJpbmdfbGVuZ3RoKTsKKwkJICAgIGFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QoKGFjcGlfc2l6ZSkKKwkJCQkJCSAoc3RyaW5nX2xlbmd0aCAtIDEpKTsKIAkJaWYgKCFyZXR1cm5fZGVzYykgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJCX0KQEAgLTY2MCwxNyArNjU0LDggQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIlVua25vd24gVGFyZ2V0IHR5cGUgSUQgMHglWCBPcCAlcyBkZXN0X3R5cGUgJXNcbiIsCi0JCQkJICBHRVRfQ1VSUkVOVF9BUkdfVFlQRSh3YWxrX3N0YXRlLT5vcF9pbmZvLT4KLQkJCQkJCSAgICAgICBydW50aW1lX2FyZ3MpLAotCQkJCSAgd2Fsa19zdGF0ZS0+b3BfaW5mby0+bmFtZSwKLQkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShkZXN0aW5hdGlvbl90eXBlKSkpOwotCi0JCUFDUElfUkVQT1JUX0VSUk9SKCgiQmFkIFRhcmdldCBUeXBlIChBUkdJKTogJVhcbiIsCi0JCQkJICAgR0VUX0NVUlJFTlRfQVJHX1RZUEUod2Fsa19zdGF0ZS0+b3BfaW5mby0+Ci0JCQkJCQkJcnVudGltZV9hcmdzKSkpCi0JCSAgICBzdGF0dXMgPSBBRV9BTUxfSU5URVJOQUw7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiVW5rbm93biBUYXJnZXQgdHlwZSBJRCAweCVYIGFtbF9vcGNvZGUgJVggZGVzdF90eXBlICVzXG4iLCBHRVRfQ1VSUkVOVF9BUkdfVFlQRSh3YWxrX3N0YXRlLT5vcF9pbmZvLT5ydW50aW1lX2FyZ3MpLCB3YWxrX3N0YXRlLT5vcGNvZGUsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShkZXN0aW5hdGlvbl90eXBlKSkpOworCQlzdGF0dXMgPSBBRV9BTUxfSU5URVJOQUw7CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNyZWF0ZS5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y3JlYXRlLmMKaW5kZXggOTFjNDkxOC4uZGEzMTNkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y3JlYXRlLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y3JlYXRlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhkdW1wLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhkdW1wLmMKaW5kZXggYmMyZmE5OS4uYTdjY2E4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZHVtcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGR1bXAuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTU1LDIwICs1NSwzODYgQEAKICAqLwogI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogc3RhdGljIHZvaWQgYWNwaV9leF9vdXRfc3RyaW5nKGNoYXIgKnRpdGxlLCBjaGFyICp2YWx1ZSk7CiAKIHN0YXRpYyB2b2lkIGFjcGlfZXhfb3V0X3BvaW50ZXIoY2hhciAqdGl0bGUsIHZvaWQgKnZhbHVlKTsKIAotc3RhdGljIHZvaWQgYWNwaV9leF9vdXRfaW50ZWdlcihjaGFyICp0aXRsZSwgdTMyIHZhbHVlKTsKLQogc3RhdGljIHZvaWQgYWNwaV9leF9vdXRfYWRkcmVzcyhjaGFyICp0aXRsZSwgYWNwaV9waHlzaWNhbF9hZGRyZXNzIHZhbHVlKTsKIAotc3RhdGljIHZvaWQgYWNwaV9leF9kdW1wX3JlZmVyZW5jZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyk7CitzdGF0aWMgdm9pZCBhY3BpX2V4X2R1bXBfcmVmZXJlbmNlX29iaih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyk7CiAKIHN0YXRpYyB2b2lkCi1hY3BpX2V4X2R1bXBfcGFja2FnZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywgdTMyIGxldmVsLCB1MzIgaW5kZXgpOwotI2VuZGlmCQkJCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCithY3BpX2V4X2R1bXBfcGFja2FnZV9vYmoodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgdTMyIGxldmVsLCB1MzIgaW5kZXgpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE9iamVjdCBEZXNjcmlwdG9yIGluZm8gdGFibGVzCisgKgorICogTm90ZTogVGhlIGZpcnN0IHRhYmxlIGVudHJ5IG11c3QgYmUgYW4gSU5JVCBvcGNvZGUgYW5kIG11c3QgY29udGFpbgorICogdGhlIHRhYmxlIGxlbmd0aCAobnVtYmVyIG9mIHRhYmxlIGVudHJpZXMpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9pbnRlZ2VyWzJdID0geworCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9pbnRlZ2VyKSwgTlVMTH0sCisJe0FDUElfRVhEX1VJTlQ2NCwgQUNQSV9FWERfT0ZGU0VUKGludGVnZXIudmFsdWUpLCAiVmFsdWUifQorfTsKKworc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9zdHJpbmdbNF0gPSB7CisJe0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX3N0cmluZyksIE5VTEx9LAorCXtBQ1BJX0VYRF9VSU5UMzIsIEFDUElfRVhEX09GRlNFVChzdHJpbmcubGVuZ3RoKSwgIkxlbmd0aCJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQoc3RyaW5nLnBvaW50ZXIpLCAiUG9pbnRlciJ9LAorCXtBQ1BJX0VYRF9TVFJJTkcsIDAsIE5VTEx9Cit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX2J1ZmZlcls0XSA9IHsKKwl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfYnVmZmVyKSwgTlVMTH0sCisJe0FDUElfRVhEX1VJTlQzMiwgQUNQSV9FWERfT0ZGU0VUKGJ1ZmZlci5sZW5ndGgpLCAiTGVuZ3RoIn0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChidWZmZXIucG9pbnRlciksICJQb2ludGVyIn0sCisJe0FDUElfRVhEX0JVRkZFUiwgMCwgTlVMTH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfcGFja2FnZVs1XSA9IHsKKwl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfcGFja2FnZSksIE5VTEx9LAorCXtBQ1BJX0VYRF9VSU5UOCwgQUNQSV9FWERfT0ZGU0VUKHBhY2thZ2UuZmxhZ3MpLCAiRmxhZ3MifSwKKwl7QUNQSV9FWERfVUlOVDMyLCBBQ1BJX0VYRF9PRkZTRVQocGFja2FnZS5jb3VudCksICJFbGVtZW50cyJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQocGFja2FnZS5lbGVtZW50cyksICJFbGVtZW50IExpc3QifSwKKwl7QUNQSV9FWERfUEFDS0FHRSwgMCwgTlVMTH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfZGV2aWNlWzRdID0geworCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9kZXZpY2UpLCBOVUxMfSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKGRldmljZS5oYW5kbGVyKSwgIkhhbmRsZXIifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKGRldmljZS5zeXN0ZW1fbm90aWZ5KSwKKwkgIlN5c3RlbSBOb3RpZnkifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKGRldmljZS5kZXZpY2Vfbm90aWZ5KSwKKwkgIkRldmljZSBOb3RpZnkifQorfTsKKworc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9ldmVudFsyXSA9IHsKKwl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfZXZlbnQpLCBOVUxMfSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKGV2ZW50LnNlbWFwaG9yZSksICJTZW1hcGhvcmUifQorfTsKKworc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9tZXRob2RbOF0gPSB7CisJe0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX21ldGhvZCksIE5VTEx9LAorCXtBQ1BJX0VYRF9VSU5UOCwgQUNQSV9FWERfT0ZGU0VUKG1ldGhvZC5wYXJhbV9jb3VudCksICJwYXJhbV9jb3VudCJ9LAorCXtBQ1BJX0VYRF9VSU5UOCwgQUNQSV9FWERfT0ZGU0VUKG1ldGhvZC5jb25jdXJyZW5jeSksICJDb25jdXJyZW5jeSJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQobWV0aG9kLnNlbWFwaG9yZSksICJTZW1hcGhvcmUifSwKKwl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChtZXRob2Qub3duZXJfaWQpLCAiT3duZXIgSWQifSwKKwl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChtZXRob2QudGhyZWFkX2NvdW50KSwgIlRocmVhZCBDb3VudCJ9LAorCXtBQ1BJX0VYRF9VSU5UMzIsIEFDUElfRVhEX09GRlNFVChtZXRob2QuYW1sX2xlbmd0aCksICJBbWwgTGVuZ3RoIn0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChtZXRob2QuYW1sX3N0YXJ0KSwgIkFtbCBTdGFydCJ9Cit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX211dGV4WzVdID0geworCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9tdXRleCksIE5VTEx9LAorCXtBQ1BJX0VYRF9VSU5UOCwgQUNQSV9FWERfT0ZGU0VUKG11dGV4LnN5bmNfbGV2ZWwpLCAiU3luYyBMZXZlbCJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQobXV0ZXgub3duZXJfdGhyZWFkKSwgIk93bmVyIFRocmVhZCJ9LAorCXtBQ1BJX0VYRF9VSU5UMTYsIEFDUElfRVhEX09GRlNFVChtdXRleC5hY3F1aXNpdGlvbl9kZXB0aCksCisJICJBY3F1aXJlIERlcHRoIn0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChtdXRleC5zZW1hcGhvcmUpLCAiU2VtYXBob3JlIn0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfcmVnaW9uWzddID0geworCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9yZWdpb24pLCBOVUxMfSwKKwl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChyZWdpb24uc3BhY2VfaWQpLCAiU3BhY2UgSWQifSwKKwl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChyZWdpb24uZmxhZ3MpLCAiRmxhZ3MifSwKKwl7QUNQSV9FWERfQUREUkVTUywgQUNQSV9FWERfT0ZGU0VUKHJlZ2lvbi5hZGRyZXNzKSwgIkFkZHJlc3MifSwKKwl7QUNQSV9FWERfVUlOVDMyLCBBQ1BJX0VYRF9PRkZTRVQocmVnaW9uLmxlbmd0aCksICJMZW5ndGgifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHJlZ2lvbi5oYW5kbGVyKSwgIkhhbmRsZXIifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHJlZ2lvbi5uZXh0KSwgIk5leHQifQorfTsKKworc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9wb3dlcls1XSA9IHsKKwl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfcG93ZXIpLCBOVUxMfSwKKwl7QUNQSV9FWERfVUlOVDMyLCBBQ1BJX0VYRF9PRkZTRVQocG93ZXJfcmVzb3VyY2Uuc3lzdGVtX2xldmVsKSwKKwkgIlN5c3RlbSBMZXZlbCJ9LAorCXtBQ1BJX0VYRF9VSU5UMzIsIEFDUElfRVhEX09GRlNFVChwb3dlcl9yZXNvdXJjZS5yZXNvdXJjZV9vcmRlciksCisJICJSZXNvdXJjZSBPcmRlciJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQocG93ZXJfcmVzb3VyY2Uuc3lzdGVtX25vdGlmeSksCisJICJTeXN0ZW0gTm90aWZ5In0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChwb3dlcl9yZXNvdXJjZS5kZXZpY2Vfbm90aWZ5KSwKKwkgIkRldmljZSBOb3RpZnkifQorfTsKKworc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9wcm9jZXNzb3JbN10gPSB7CisJe0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX3Byb2Nlc3NvciksIE5VTEx9LAorCXtBQ1BJX0VYRF9VSU5UMzIsIEFDUElfRVhEX09GRlNFVChwcm9jZXNzb3IucHJvY19pZCksICJQcm9jZXNzb3IgSUQifSwKKwl7QUNQSV9FWERfVUlOVDMyLCBBQ1BJX0VYRF9PRkZTRVQocHJvY2Vzc29yLmxlbmd0aCksICJMZW5ndGgifSwKKwl7QUNQSV9FWERfQUREUkVTUywgQUNQSV9FWERfT0ZGU0VUKHByb2Nlc3Nvci5hZGRyZXNzKSwgIkFkZHJlc3MifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHByb2Nlc3Nvci5zeXN0ZW1fbm90aWZ5KSwKKwkgIlN5c3RlbSBOb3RpZnkifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHByb2Nlc3Nvci5kZXZpY2Vfbm90aWZ5KSwKKwkgIkRldmljZSBOb3RpZnkifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHByb2Nlc3Nvci5oYW5kbGVyKSwgIkhhbmRsZXIifQorfTsKKworc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF90aGVybWFsWzRdID0geworCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF90aGVybWFsKSwgTlVMTH0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVCh0aGVybWFsX3pvbmUuc3lzdGVtX25vdGlmeSksCisJICJTeXN0ZW0gTm90aWZ5In0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVCh0aGVybWFsX3pvbmUuZGV2aWNlX25vdGlmeSksCisJICJEZXZpY2UgTm90aWZ5In0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVCh0aGVybWFsX3pvbmUuaGFuZGxlciksICJIYW5kbGVyIn0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfYnVmZmVyX2ZpZWxkWzNdID0geworCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9idWZmZXJfZmllbGQpLCBOVUxMfSwKKwl7QUNQSV9FWERfRklFTEQsIDAsIE5VTEx9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQoYnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmopLAorCSAiQnVmZmVyIE9iamVjdCJ9Cit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX3JlZ2lvbl9maWVsZFszXSA9IHsKKwl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfcmVnaW9uX2ZpZWxkKSwgTlVMTH0sCisJe0FDUElfRVhEX0ZJRUxELCAwLCBOVUxMfSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKGZpZWxkLnJlZ2lvbl9vYmopLCAiUmVnaW9uIE9iamVjdCJ9Cit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX2JhbmtfZmllbGRbNV0gPSB7CisJe0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX2JhbmtfZmllbGQpLCBOVUxMfSwKKwl7QUNQSV9FWERfRklFTEQsIDAsIE5VTEx9LAorCXtBQ1BJX0VYRF9VSU5UMzIsIEFDUElfRVhEX09GRlNFVChiYW5rX2ZpZWxkLnZhbHVlKSwgIlZhbHVlIn0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChiYW5rX2ZpZWxkLnJlZ2lvbl9vYmopLAorCSAiUmVnaW9uIE9iamVjdCJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQoYmFua19maWVsZC5iYW5rX29iaiksICJCYW5rIE9iamVjdCJ9Cit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX2luZGV4X2ZpZWxkWzVdID0geworCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9iYW5rX2ZpZWxkKSwgTlVMTH0sCisJe0FDUElfRVhEX0ZJRUxELCAwLCBOVUxMfSwKKwl7QUNQSV9FWERfVUlOVDMyLCBBQ1BJX0VYRF9PRkZTRVQoaW5kZXhfZmllbGQudmFsdWUpLCAiVmFsdWUifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKGluZGV4X2ZpZWxkLmluZGV4X29iaiksCisJICJJbmRleCBPYmplY3QifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKGluZGV4X2ZpZWxkLmRhdGFfb2JqKSwgIkRhdGEgT2JqZWN0In0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfcmVmZXJlbmNlWzddID0geworCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9yZWZlcmVuY2UpLCBOVUxMfSwKKwl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChyZWZlcmVuY2UudGFyZ2V0X3R5cGUpLCAiVGFyZ2V0IFR5cGUifSwKKwl7QUNQSV9FWERfVUlOVDMyLCBBQ1BJX0VYRF9PRkZTRVQocmVmZXJlbmNlLm9mZnNldCksICJPZmZzZXQifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHJlZmVyZW5jZS5vYmplY3QpLCAiT2JqZWN0IERlc2MifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHJlZmVyZW5jZS5ub2RlKSwgIk5vZGUifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHJlZmVyZW5jZS53aGVyZSksICJXaGVyZSJ9LAorCXtBQ1BJX0VYRF9SRUZFUkVOQ0UsIDAsIE5VTEx9Cit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX2FkZHJlc3NfaGFuZGxlcls2XSA9IHsKKwl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfYWRkcmVzc19oYW5kbGVyKSwKKwkgTlVMTH0sCisJe0FDUElfRVhEX1VJTlQ4LCBBQ1BJX0VYRF9PRkZTRVQoYWRkcmVzc19zcGFjZS5zcGFjZV9pZCksICJTcGFjZSBJZCJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQoYWRkcmVzc19zcGFjZS5uZXh0KSwgIk5leHQifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKGFkZHJlc3Nfc3BhY2UucmVnaW9uX2xpc3QpLAorCSAiUmVnaW9uIExpc3QifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKGFkZHJlc3Nfc3BhY2Uubm9kZSksICJOb2RlIn0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChhZGRyZXNzX3NwYWNlLmNvbnRleHQpLCAiQ29udGV4dCJ9Cit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX25vdGlmeVszXSA9IHsKKwl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfbm90aWZ5KSwgTlVMTH0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChub3RpZnkubm9kZSksICJOb2RlIn0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChub3RpZnkuY29udGV4dCksICJDb250ZXh0In0KK307CisKKy8qIE1pc2NlbGxhbmVvdXMgdGFibGVzICovCisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfY29tbW9uWzRdID0geworCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9jb21tb24pLCBOVUxMfSwKKwl7QUNQSV9FWERfVFlQRSwgMCwgTlVMTH0sCisJe0FDUElfRVhEX1VJTlQxNiwgQUNQSV9FWERfT0ZGU0VUKGNvbW1vbi5yZWZlcmVuY2VfY291bnQpLAorCSAiUmVmZXJlbmNlIENvdW50In0sCisJe0FDUElfRVhEX1VJTlQ4LCBBQ1BJX0VYRF9PRkZTRVQoY29tbW9uLmZsYWdzKSwgIkZsYWdzIn0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfZmllbGRfY29tbW9uWzddID0geworCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9maWVsZF9jb21tb24pLCBOVUxMfSwKKwl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChjb21tb25fZmllbGQuZmllbGRfZmxhZ3MpLAorCSAiRmllbGQgRmxhZ3MifSwKKwl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChjb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpLAorCSAiQWNjZXNzIEJ5dGUgV2lkdGgifSwKKwl7QUNQSV9FWERfVUlOVDMyLCBBQ1BJX0VYRF9PRkZTRVQoY29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgpLAorCSAiQml0IExlbmd0aCJ9LAorCXtBQ1BJX0VYRF9VSU5UOCwgQUNQSV9FWERfT0ZGU0VUKGNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KSwKKwkgIkZpZWxkIEJpdCBPZmZzZXQifSwKKwl7QUNQSV9FWERfVUlOVDMyLCBBQ1BJX0VYRF9PRkZTRVQoY29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQpLAorCSAiQmFzZSBCeXRlIE9mZnNldCJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQoY29tbW9uX2ZpZWxkLm5vZGUpLCAiUGFyZW50IE5vZGUifQorfTsKKworc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9ub2RlWzZdID0geworCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9ub2RlKSwgTlVMTH0sCisJe0FDUElfRVhEX1VJTlQ4LCBBQ1BJX0VYRF9OU09GRlNFVChmbGFncyksICJGbGFncyJ9LAorCXtBQ1BJX0VYRF9VSU5UOCwgQUNQSV9FWERfTlNPRkZTRVQob3duZXJfaWQpLCAiT3duZXIgSWQifSwKKwl7QUNQSV9FWERfVUlOVDE2LCBBQ1BJX0VYRF9OU09GRlNFVChyZWZlcmVuY2VfY291bnQpLAorCSAiUmVmZXJlbmNlIENvdW50In0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX05TT0ZGU0VUKGNoaWxkKSwgIkNoaWxkIExpc3QifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfTlNPRkZTRVQocGVlciksICJOZXh0IFBlZXIifQorfTsKKworLyogRGlzcGF0Y2ggdGFibGUsIGluZGV4ZWQgYnkgb2JqZWN0IHR5cGUgKi8KKworc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvICphY3BpX2V4X2R1bXBfaW5mb1tdID0geworCU5VTEwsCisJYWNwaV9leF9kdW1wX2ludGVnZXIsCisJYWNwaV9leF9kdW1wX3N0cmluZywKKwlhY3BpX2V4X2R1bXBfYnVmZmVyLAorCWFjcGlfZXhfZHVtcF9wYWNrYWdlLAorCU5VTEwsCisJYWNwaV9leF9kdW1wX2RldmljZSwKKwlhY3BpX2V4X2R1bXBfZXZlbnQsCisJYWNwaV9leF9kdW1wX21ldGhvZCwKKwlhY3BpX2V4X2R1bXBfbXV0ZXgsCisJYWNwaV9leF9kdW1wX3JlZ2lvbiwKKwlhY3BpX2V4X2R1bXBfcG93ZXIsCisJYWNwaV9leF9kdW1wX3Byb2Nlc3NvciwKKwlhY3BpX2V4X2R1bXBfdGhlcm1hbCwKKwlhY3BpX2V4X2R1bXBfYnVmZmVyX2ZpZWxkLAorCU5VTEwsCisJTlVMTCwKKwlhY3BpX2V4X2R1bXBfcmVnaW9uX2ZpZWxkLAorCWFjcGlfZXhfZHVtcF9iYW5rX2ZpZWxkLAorCWFjcGlfZXhfZHVtcF9pbmRleF9maWVsZCwKKwlhY3BpX2V4X2R1bXBfcmVmZXJlbmNlLAorCU5VTEwsCisJTlVMTCwKKwlhY3BpX2V4X2R1bXBfbm90aWZ5LAorCWFjcGlfZXhfZHVtcF9hZGRyZXNzX2hhbmRsZXIsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZHVtcF9vYmplY3QKKyAqCisgKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgICAgICAtIERlc2NyaXB0b3IgdG8gZHVtcAorICogICAgICAgICAgICAgIEluZm8gICAgICAgICAgICAgICAgLSBJbmZvIHRhYmxlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBvYmplY3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZQorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IFdhbGsgdGhlIGluZm8gdGFibGUgZm9yIHRoaXMgb2JqZWN0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2FjcGlfZXhfZHVtcF9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCSAgICBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyAqaW5mbykKK3sKKwl1OCAqdGFyZ2V0OworCWNoYXIgKm5hbWU7CisJdTggY291bnQ7CisKKwlpZiAoIWluZm8pIHsKKwkJYWNwaV9vc19wcmludGYKKwkJICAgICgiZXhfZHVtcF9vYmplY3Q6IERpc3BsYXkgbm90IGltcGxlbWVudGVkIGZvciBvYmplY3QgdHlwZSAlc1xuIiwKKwkJICAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBGaXJzdCB0YWJsZSBlbnRyeSBtdXN0IGNvbnRhaW4gdGhlIHRhYmxlIGxlbmd0aCAoIyBvZiB0YWJsZSBlbnRyaWVzKSAqLworCisJY291bnQgPSBpbmZvLT5vZmZzZXQ7CisKKwl3aGlsZSAoY291bnQpIHsKKwkJdGFyZ2V0ID0gQUNQSV9BRERfUFRSKHU4LCBvYmpfZGVzYywgaW5mby0+b2Zmc2V0KTsKKwkJbmFtZSA9IGluZm8tPm5hbWU7CisKKwkJc3dpdGNoIChpbmZvLT5vcGNvZGUpIHsKKwkJY2FzZSBBQ1BJX0VYRF9JTklUOgorCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX0VYRF9UWVBFOgorCQkJYWNwaV9leF9vdXRfc3RyaW5nKCJUeXBlIiwKKwkJCQkJICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkgICAob2JqX2Rlc2MpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9FWERfVUlOVDg6CisKKwkJCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJTIuMlhcbiIsIG5hbWUsICp0YXJnZXQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX0VYRF9VSU5UMTY6CisKKwkJCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJTQuNFhcbiIsIG5hbWUsCisJCQkJICAgICAgIEFDUElfR0VUMTYodGFyZ2V0KSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfRVhEX1VJTlQzMjoKKworCQkJYWNwaV9vc19wcmludGYoIiUyMHMgOiAlOC44WFxuIiwgbmFtZSwKKwkJCQkgICAgICAgQUNQSV9HRVQzMih0YXJnZXQpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9FWERfVUlOVDY0OgorCisJCQlhY3BpX29zX3ByaW50ZigiJTIwcyA6ICU4LjhYJTguOFhcbiIsICJWYWx1ZSIsCisJCQkJICAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChBQ1BJX0dFVDY0KHRhcmdldCkpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9FWERfUE9JTlRFUjoKKworCQkJYWNwaV9leF9vdXRfcG9pbnRlcihuYW1lLAorCQkJCQkgICAgKkFDUElfQ0FTVF9QVFIodm9pZCAqLCB0YXJnZXQpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9FWERfQUREUkVTUzoKKworCQkJYWNwaV9leF9vdXRfYWRkcmVzcyhuYW1lLAorCQkJCQkgICAgKkFDUElfQ0FTVF9QVFIKKwkJCQkJICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MsIHRhcmdldCkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX0VYRF9TVFJJTkc6CisKKwkJCWFjcGlfdXRfcHJpbnRfc3RyaW5nKG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwKKwkJCQkJICAgICBBQ1BJX1VJTlQ4X01BWCk7CisJCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9FWERfQlVGRkVSOgorCisJCQlBQ1BJX0RVTVBfQlVGRkVSKG9ial9kZXNjLT5idWZmZXIucG9pbnRlciwKKwkJCQkJIG9ial9kZXNjLT5idWZmZXIubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9FWERfUEFDS0FHRToKKworCQkJLyogRHVtcCB0aGUgcGFja2FnZSBjb250ZW50cyAqLworCisJCQlhY3BpX29zX3ByaW50ZigiXG5QYWNrYWdlIENvbnRlbnRzOlxuIik7CisJCQlhY3BpX2V4X2R1bXBfcGFja2FnZV9vYmoob2JqX2Rlc2MsIDAsIDApOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX0VYRF9GSUVMRDoKKworCQkJYWNwaV9leF9kdW1wX29iamVjdChvYmpfZGVzYywKKwkJCQkJICAgIGFjcGlfZXhfZHVtcF9maWVsZF9jb21tb24pOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX0VYRF9SRUZFUkVOQ0U6CisKKwkJCWFjcGlfZXhfb3V0X3N0cmluZygiT3Bjb2RlIiwKKwkJCQkJICAgKGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvCisJCQkJCSAgICAob2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKS0+CisJCQkJCSAgIG5hbWUpOworCQkJYWNwaV9leF9kdW1wX3JlZmVyZW5jZV9vYmoob2JqX2Rlc2MpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWFjcGlfb3NfcHJpbnRmKCIqKioqIEludmFsaWQgdGFibGUgb3Bjb2RlIFslWF0gKioqKlxuIiwKKwkJCQkgICAgICAgaW5mby0+b3Bjb2RlKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWluZm8rKzsKKwkJY291bnQtLTsKKwl9Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjE0LDcgKzU4MCw3IEBACiAKIAljYXNlIEFDUElfVFlQRV9CVUZGRVI6CiAKLQkJYWNwaV9vc19wcmludGYoIkJ1ZmZlciBsZW4gJVggQCAlcCBcbiIsCisJCWFjcGlfb3NfcHJpbnRmKCJCdWZmZXIgbGVuICVYIEAgJXBcbiIsCiAJCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgsCiAJCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKTsKIApAQCAtMzIwLDE3ICs2ODYsMTcgQEAKIAogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKIAotCQlhY3BpX29zX3ByaW50ZigiYnVmZmVyX2ZpZWxkOiAlWCBiaXRzIGF0IGJ5dGUgJVggYml0ICVYIG9mIFxuIiwKKwkJYWNwaV9vc19wcmludGYoImJ1ZmZlcl9maWVsZDogJVggYml0cyBhdCBieXRlICVYIGJpdCAlWCBvZlxuIiwKIAkJCSAgICAgICBvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJpdF9sZW5ndGgsCiAJCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAogCQkJICAgICAgIG9ial9kZXNjLT5idWZmZXJfZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCk7CiAKIAkJaWYgKCFvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmopIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIipOVUxMKiBcbiIpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIipOVUxMKlxuIikpOwogCQl9IGVsc2UKIAkJICAgIGlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmopCiAJCQkhPSBBQ1BJX1RZUEVfQlVGRkVSKSB7Ci0JCQlhY3BpX29zX3ByaW50ZigiKm5vdCBhIEJ1ZmZlciogXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCIqbm90IGEgQnVmZmVyKlxuIik7CiAJCX0gZWxzZSB7CiAJCQlhY3BpX2V4X2R1bXBfb3BlcmFuZChvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmosCiAJCQkJCSAgICAgZGVwdGggKyAxKTsKQEAgLTQ0MSw3ICs4MDcsNiBAQAogCXJldHVybjsKIH0KIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X291dCogZnVuY3Rpb25zCkBAIC00NjUsMTEgKzgzMCw2IEBACiAJYWNwaV9vc19wcmludGYoIiUyMHMgOiAlcFxuIiwgdGl0bGUsIHZhbHVlKTsKIH0KIAotc3RhdGljIHZvaWQgYWNwaV9leF9vdXRfaW50ZWdlcihjaGFyICp0aXRsZSwgdTMyIHZhbHVlKQotewotCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJS4yWFxuIiwgdGl0bGUsIHZhbHVlKTsKLX0KLQogc3RhdGljIHZvaWQgYWNwaV9leF9vdXRfYWRkcmVzcyhjaGFyICp0aXRsZSwgYWNwaV9waHlzaWNhbF9hZGRyZXNzIHZhbHVlKQogewogCkBAIC00ODIsMTYgKzg0MiwxNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2R1bXBfbm9kZQorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZHVtcF9uYW1lc3BhY2Vfbm9kZQogICoKLSAqIFBBUkFNRVRFUlM6ICAqTm9kZSAgICAgICAgICAgICAgIC0gRGVzY3JpcHRvciB0byBkdW1wCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgICAgICAtIERlc2NyaXB0b3IgdG8gZHVtcAogICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAgICAgLSBGb3JjZSBkaXNwbGF5IGlmIFRSVUUKICAqCiAgKiBERVNDUklQVElPTjogRHVtcHMgdGhlIG1lbWJlcnMgb2YgdGhlIGdpdmVuLk5vZGUKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIGFjcGlfZXhfZHVtcF9ub2RlKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLCB1MzIgZmxhZ3MpCit2b2lkIGFjcGlfZXhfZHVtcF9uYW1lc3BhY2Vfbm9kZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwgdTMyIGZsYWdzKQogewogCiAJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwpAQCAtNTA2LDE5ICs4NjYsMTcgQEAKIAogCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJTQuNHNcbiIsICJOYW1lIiwgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpKTsKIAlhY3BpX2V4X291dF9zdHJpbmcoIlR5cGUiLCBhY3BpX3V0X2dldF90eXBlX25hbWUobm9kZS0+dHlwZSkpOwotCWFjcGlfZXhfb3V0X2ludGVnZXIoIkZsYWdzIiwgbm9kZS0+ZmxhZ3MpOwotCWFjcGlfZXhfb3V0X2ludGVnZXIoIk93bmVyIElkIiwgbm9kZS0+b3duZXJfaWQpOwotCWFjcGlfZXhfb3V0X2ludGVnZXIoIlJlZmVyZW5jZSBDb3VudCIsIG5vZGUtPnJlZmVyZW5jZV9jb3VudCk7CiAJYWNwaV9leF9vdXRfcG9pbnRlcigiQXR0YWNoZWQgT2JqZWN0IiwKIAkJCSAgICBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSkpOwotCWFjcGlfZXhfb3V0X3BvaW50ZXIoImNoaWxkX2xpc3QiLCBub2RlLT5jaGlsZCk7Ci0JYWNwaV9leF9vdXRfcG9pbnRlcigibmV4dF9wZWVyIiwgbm9kZS0+cGVlcik7CiAJYWNwaV9leF9vdXRfcG9pbnRlcigiUGFyZW50IiwgYWNwaV9uc19nZXRfcGFyZW50X25vZGUobm9kZSkpOworCisJYWNwaV9leF9kdW1wX29iamVjdChBQ1BJX0NBU1RfUFRSKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsIG5vZGUpLAorCQkJICAgIGFjcGlfZXhfZHVtcF9ub2RlKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9kdW1wX3JlZmVyZW5jZQorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZHVtcF9yZWZlcmVuY2Vfb2JqCiAgKgogICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAgICAgLSBEZXNjcmlwdG9yIHRvIGR1bXAKICAqCkBAIC01MjYsMTQgKzg4NCwxNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIGFjcGlfZXhfZHVtcF9yZWZlcmVuY2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpCitzdGF0aWMgdm9pZCBhY3BpX2V4X2R1bXBfcmVmZXJlbmNlX29iaih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYykKIHsKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgcmV0X2J1ZjsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlyZXRfYnVmLmxlbmd0aCA9IEFDUElfQUxMT0NBVEVfTE9DQUxfQlVGRkVSOworCiAJaWYgKG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlID09IEFNTF9JTlRfTkFNRVBBVEhfT1ApIHsKIAkJYWNwaV9vc19wcmludGYoIk5hbWVkIE9iamVjdCAlcCAiLCBvYmpfZGVzYy0+cmVmZXJlbmNlLm5vZGUpOwotCQlyZXRfYnVmLmxlbmd0aCA9IEFDUElfQUxMT0NBVEVfTE9DQUxfQlVGRkVSOworCiAJCXN0YXR1cyA9CiAJCSAgICBhY3BpX25zX2hhbmRsZV90b19wYXRobmFtZShvYmpfZGVzYy0+cmVmZXJlbmNlLm5vZGUsCiAJCQkJCSAgICAgICAmcmV0X2J1Zik7CkBAIC01NTEsOSArOTExLDkgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9kdW1wX3BhY2thZ2UKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2R1bXBfcGFja2FnZV9vYmoKICAqCi0gKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgICAgICAtIERlc2NyaXB0b3IgdG8gZHVtcAorICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAgICAgLSBEZXNjcmlwdG9yIHRvIGR1bXAKICAqICAgICAgICAgICAgICBMZXZlbCAgICAgICAgICAgICAgIC0gSW5kZW50YXRpb24gTGV2ZWwKICAqICAgICAgICAgICAgICBJbmRleCAgICAgICAgICAgICAgIC0gUGFja2FnZSBpbmRleCBmb3IgdGhpcyBvYmplY3QKICAqCkBAIC01NjIsNyArOTIyLDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1hY3BpX2V4X2R1bXBfcGFja2FnZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywgdTMyIGxldmVsLCB1MzIgaW5kZXgpCithY3BpX2V4X2R1bXBfcGFja2FnZV9vYmoodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgdTMyIGxldmVsLCB1MzIgaW5kZXgpCiB7CiAJdTMyIGk7CiAKQEAgLTYwOCw3ICs5NjksOCBAQAogCQlhY3BpX29zX3ByaW50ZigiW0J1ZmZlcl0gTGVuZ3RoICUuMlggPSAiLAogCQkJICAgICAgIG9ial9kZXNjLT5idWZmZXIubGVuZ3RoKTsKIAkJaWYgKG9ial9kZXNjLT5idWZmZXIubGVuZ3RoKSB7Ci0JCQlhY3BpX3V0X2R1bXBfYnVmZmVyKCh1OCAqKSBvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIsCisJCQlhY3BpX3V0X2R1bXBfYnVmZmVyKEFDUElfQ0FTVF9QVFIKKwkJCQkJICAgICh1OCwgb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKSwKIAkJCQkJICAgIG9ial9kZXNjLT5idWZmZXIubGVuZ3RoLAogCQkJCQkgICAgREJfRFdPUkRfRElTUExBWSwgX0NPTVBPTkVOVCk7CiAJCX0gZWxzZSB7CkBAIC02MTgsMTkgKzk4MCwxOSBAQAogCiAJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKIAotCQlhY3BpX29zX3ByaW50ZigiW1BhY2thZ2VdIENvbnRhaW5zICVkIEVsZW1lbnRzOiBcbiIsCisJCWFjcGlfb3NfcHJpbnRmKCJbUGFja2FnZV0gQ29udGFpbnMgJWQgRWxlbWVudHM6XG4iLAogCQkJICAgICAgIG9ial9kZXNjLT5wYWNrYWdlLmNvdW50KTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgb2JqX2Rlc2MtPnBhY2thZ2UuY291bnQ7IGkrKykgewotCQkJYWNwaV9leF9kdW1wX3BhY2thZ2Uob2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHNbaV0sCi0JCQkJCSAgICAgbGV2ZWwgKyAxLCBpKTsKKwkJCWFjcGlfZXhfZHVtcF9wYWNrYWdlX29iaihvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1tpXSwKKwkJCQkJCSBsZXZlbCArIDEsIGkpOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgogCiAJCWFjcGlfb3NfcHJpbnRmKCJbT2JqZWN0IFJlZmVyZW5jZV0gIik7Ci0JCWFjcGlfZXhfZHVtcF9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCQlhY3BpX2V4X2R1bXBfcmVmZXJlbmNlX29iaihvYmpfZGVzYyk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTY0NSw3ICsxMDA3LDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9kdW1wX29iamVjdF9kZXNjcmlwdG9yCiAgKgotICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAgICAgLSBEZXNjcmlwdG9yIHRvIGR1bXAKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gRGVzY3JpcHRvciB0byBkdW1wCiAgKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAtIEZvcmNlIGRpc3BsYXkgaWYgVFJVRQogICoKICAqIERFU0NSSVBUSU9OOiBEdW1wcyB0aGUgbWVtYmVycyBvZiB0aGUgb2JqZWN0IGRlc2NyaXB0b3IgZ2l2ZW4uCkBAIC02NzAsMTEgKzEwMzIsMTMgQEAKIAl9CiAKIAlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQlhY3BpX2V4X2R1bXBfbm9kZSgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmpfZGVzYywKLQkJCQkgIGZsYWdzKTsKKwkJYWNwaV9leF9kdW1wX25hbWVzcGFjZV9ub2RlKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKQorCQkJCQkgICAgb2JqX2Rlc2MsIGZsYWdzKTsKKwogCQlhY3BpX29zX3ByaW50ZigiXG5BdHRhY2hlZCBPYmplY3QgKCVwKTpcbiIsCiAJCQkgICAgICAgKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9ial9kZXNjKS0+CiAJCQkgICAgICAgb2JqZWN0KTsKKwogCQlhY3BpX2V4X2R1bXBfb2JqZWN0X2Rlc2NyaXB0b3IoKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKQogCQkJCQkJb2JqX2Rlc2MpLT5vYmplY3QsIGZsYWdzKTsKIAkJcmV0dXJuX1ZPSUQ7CkBAIC02ODcsMjMzICsxMDUxLDE4IEBACiAJCXJldHVybl9WT0lEOwogCX0KIAotCS8qIENvbW1vbiBGaWVsZHMgKi8KLQotCWFjcGlfZXhfb3V0X3N0cmluZygiVHlwZSIsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUob2JqX2Rlc2MpKTsKLQlhY3BpX2V4X291dF9pbnRlZ2VyKCJSZWZlcmVuY2UgQ291bnQiLAotCQkJICAgIG9ial9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50KTsKLQlhY3BpX2V4X291dF9pbnRlZ2VyKCJGbGFncyIsIG9ial9kZXNjLT5jb21tb24uZmxhZ3MpOwotCi0JLyogT2JqZWN0LXNwZWNpZmljIEZpZWxkcyAqLwotCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKLQljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgotCi0JCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJTguOFglOC44WFxuIiwgIlZhbHVlIiwKLQkJCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQob2JqX2Rlc2MtPmludGVnZXIudmFsdWUpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0KLQkJYWNwaV9leF9vdXRfaW50ZWdlcigiTGVuZ3RoIiwgb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGgpOwotCi0JCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJXAgIiwgIlBvaW50ZXIiLAotCQkJICAgICAgIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlcik7Ci0JCWFjcGlfdXRfcHJpbnRfc3RyaW5nKG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwgQUNQSV9VSU5UOF9NQVgpOwotCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9CVUZGRVI6Ci0KLQkJYWNwaV9leF9vdXRfaW50ZWdlcigiTGVuZ3RoIiwgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOwotCQlhY3BpX2V4X291dF9wb2ludGVyKCJQb2ludGVyIiwgb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKTsKLQkJQUNQSV9EVU1QX0JVRkZFUihvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIsCi0JCQkJIG9ial9kZXNjLT5idWZmZXIubGVuZ3RoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgotCi0JCWFjcGlfZXhfb3V0X2ludGVnZXIoIkZsYWdzIiwgb2JqX2Rlc2MtPnBhY2thZ2UuZmxhZ3MpOwotCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJFbGVtZW50cyIsIG9ial9kZXNjLT5wYWNrYWdlLmNvdW50KTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlcigiRWxlbWVudCBMaXN0Iiwgb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHMpOwotCi0JCS8qIER1bXAgdGhlIHBhY2thZ2UgY29udGVudHMgKi8KLQotCQlhY3BpX29zX3ByaW50ZigiXG5QYWNrYWdlIENvbnRlbnRzOlxuIik7Ci0JCWFjcGlfZXhfZHVtcF9wYWNrYWdlKG9ial9kZXNjLCAwLCAwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9ERVZJQ0U6Ci0KLQkJYWNwaV9leF9vdXRfcG9pbnRlcigiSGFuZGxlciIsIG9ial9kZXNjLT5kZXZpY2UuaGFuZGxlcik7Ci0JCWFjcGlfZXhfb3V0X3BvaW50ZXIoInN5c3RlbV9ub3RpZnkiLAotCQkJCSAgICBvYmpfZGVzYy0+ZGV2aWNlLnN5c3RlbV9ub3RpZnkpOwotCQlhY3BpX2V4X291dF9wb2ludGVyKCJkZXZpY2Vfbm90aWZ5IiwKLQkJCQkgICAgb2JqX2Rlc2MtPmRldmljZS5kZXZpY2Vfbm90aWZ5KTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9FVkVOVDoKLQotCQlhY3BpX2V4X291dF9wb2ludGVyKCJTZW1hcGhvcmUiLCBvYmpfZGVzYy0+ZXZlbnQuc2VtYXBob3JlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9NRVRIT0Q6Ci0KLQkJYWNwaV9leF9vdXRfaW50ZWdlcigicGFyYW1fY291bnQiLAotCQkJCSAgICBvYmpfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50KTsKLQkJYWNwaV9leF9vdXRfaW50ZWdlcigiQ29uY3VycmVuY3kiLAotCQkJCSAgICBvYmpfZGVzYy0+bWV0aG9kLmNvbmN1cnJlbmN5KTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlcigiU2VtYXBob3JlIiwgb2JqX2Rlc2MtPm1ldGhvZC5zZW1hcGhvcmUpOwotCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJvd25lcl9pZCIsIG9ial9kZXNjLT5tZXRob2Qub3duZXJfaWQpOwotCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJhbWxfbGVuZ3RoIiwgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfbGVuZ3RoKTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlcigiYW1sX3N0YXJ0Iiwgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX01VVEVYOgotCi0JCWFjcGlfZXhfb3V0X2ludGVnZXIoInN5bmNfbGV2ZWwiLCBvYmpfZGVzYy0+bXV0ZXguc3luY19sZXZlbCk7Ci0JCWFjcGlfZXhfb3V0X3BvaW50ZXIoIm93bmVyX3RocmVhZCIsCi0JCQkJICAgIG9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQpOwotCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJhY3F1aXJlX2RlcHRoIiwKLQkJCQkgICAgb2JqX2Rlc2MtPm11dGV4LmFjcXVpc2l0aW9uX2RlcHRoKTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlcigiU2VtYXBob3JlIiwgb2JqX2Rlc2MtPm11dGV4LnNlbWFwaG9yZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfUkVHSU9OOgotCi0JCWFjcGlfZXhfb3V0X2ludGVnZXIoInNwYWNlX2lkIiwgb2JqX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCk7Ci0JCWFjcGlfZXhfb3V0X2ludGVnZXIoIkZsYWdzIiwgb2JqX2Rlc2MtPnJlZ2lvbi5mbGFncyk7Ci0JCWFjcGlfZXhfb3V0X2FkZHJlc3MoIkFkZHJlc3MiLCBvYmpfZGVzYy0+cmVnaW9uLmFkZHJlc3MpOwotCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJMZW5ndGgiLCBvYmpfZGVzYy0+cmVnaW9uLmxlbmd0aCk7Ci0JCWFjcGlfZXhfb3V0X3BvaW50ZXIoIkhhbmRsZXIiLCBvYmpfZGVzYy0+cmVnaW9uLmhhbmRsZXIpOwotCQlhY3BpX2V4X291dF9wb2ludGVyKCJOZXh0Iiwgb2JqX2Rlc2MtPnJlZ2lvbi5uZXh0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9QT1dFUjoKLQotCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJzeXN0ZW1fbGV2ZWwiLAotCQkJCSAgICBvYmpfZGVzYy0+cG93ZXJfcmVzb3VyY2Uuc3lzdGVtX2xldmVsKTsKLQkJYWNwaV9leF9vdXRfaW50ZWdlcigicmVzb3VyY2Vfb3JkZXIiLAotCQkJCSAgICBvYmpfZGVzYy0+cG93ZXJfcmVzb3VyY2UucmVzb3VyY2Vfb3JkZXIpOwotCQlhY3BpX2V4X291dF9wb2ludGVyKCJzeXN0ZW1fbm90aWZ5IiwKLQkJCQkgICAgb2JqX2Rlc2MtPnBvd2VyX3Jlc291cmNlLnN5c3RlbV9ub3RpZnkpOwotCQlhY3BpX2V4X291dF9wb2ludGVyKCJkZXZpY2Vfbm90aWZ5IiwKLQkJCQkgICAgb2JqX2Rlc2MtPnBvd2VyX3Jlc291cmNlLmRldmljZV9ub3RpZnkpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX1BST0NFU1NPUjoKLQotCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJQcm9jZXNzb3IgSUQiLAotCQkJCSAgICBvYmpfZGVzYy0+cHJvY2Vzc29yLnByb2NfaWQpOwotCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJMZW5ndGgiLCBvYmpfZGVzYy0+cHJvY2Vzc29yLmxlbmd0aCk7Ci0JCWFjcGlfZXhfb3V0X2FkZHJlc3MoIkFkZHJlc3MiLAotCQkJCSAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBvYmpfZGVzYy0+cHJvY2Vzc29yLgotCQkJCSAgICBhZGRyZXNzKTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlcigic3lzdGVtX25vdGlmeSIsCi0JCQkJICAgIG9ial9kZXNjLT5wcm9jZXNzb3Iuc3lzdGVtX25vdGlmeSk7Ci0JCWFjcGlfZXhfb3V0X3BvaW50ZXIoImRldmljZV9ub3RpZnkiLAotCQkJCSAgICBvYmpfZGVzYy0+cHJvY2Vzc29yLmRldmljZV9ub3RpZnkpOwotCQlhY3BpX2V4X291dF9wb2ludGVyKCJIYW5kbGVyIiwgb2JqX2Rlc2MtPnByb2Nlc3Nvci5oYW5kbGVyKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9USEVSTUFMOgotCi0JCWFjcGlfZXhfb3V0X3BvaW50ZXIoInN5c3RlbV9ub3RpZnkiLAotCQkJCSAgICBvYmpfZGVzYy0+dGhlcm1hbF96b25lLnN5c3RlbV9ub3RpZnkpOwotCQlhY3BpX2V4X291dF9wb2ludGVyKCJkZXZpY2Vfbm90aWZ5IiwKLQkJCQkgICAgb2JqX2Rlc2MtPnRoZXJtYWxfem9uZS5kZXZpY2Vfbm90aWZ5KTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlcigiSGFuZGxlciIsIG9ial9kZXNjLT50aGVybWFsX3pvbmUuaGFuZGxlcik7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgotCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDoKLQljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgotCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgotCi0JCWFjcGlfZXhfb3V0X2ludGVnZXIoImZpZWxkX2ZsYWdzIiwKLQkJCQkgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5maWVsZF9mbGFncyk7Ci0JCWFjcGlfZXhfb3V0X2ludGVnZXIoImFjY2Vzc19ieXRlX3dpZHRoIiwKLQkJCQkgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCk7Ci0JCWFjcGlfZXhfb3V0X2ludGVnZXIoImJpdF9sZW5ndGgiLAotCQkJCSAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgpOwotCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJmbGRfYml0X29mZnNldCIsCi0JCQkJICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuCi0JCQkJICAgIHN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQpOwotCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJiYXNlX2J5dGVfb2Zmc2V0IiwKLQkJCQkgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0KTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlcigicGFyZW50X25vZGUiLCBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLm5vZGUpOwotCi0JCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7Ci0JCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKLQkJCWFjcGlfZXhfb3V0X3BvaW50ZXIoImJ1ZmZlcl9vYmoiLAotCQkJCQkgICAgb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDoKLQkJCWFjcGlfZXhfb3V0X3BvaW50ZXIoInJlZ2lvbl9vYmoiLAotCQkJCQkgICAgb2JqX2Rlc2MtPmZpZWxkLnJlZ2lvbl9vYmopOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKLQkJCWFjcGlfZXhfb3V0X2ludGVnZXIoIlZhbHVlIiwKLQkJCQkJICAgIG9ial9kZXNjLT5iYW5rX2ZpZWxkLnZhbHVlKTsKLQkJCWFjcGlfZXhfb3V0X3BvaW50ZXIoInJlZ2lvbl9vYmoiLAotCQkJCQkgICAgb2JqX2Rlc2MtPmJhbmtfZmllbGQucmVnaW9uX29iaik7Ci0JCQlhY3BpX2V4X291dF9wb2ludGVyKCJiYW5rX29iaiIsCi0JCQkJCSAgICBvYmpfZGVzYy0+YmFua19maWVsZC5iYW5rX29iaik7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKLQkJCWFjcGlfZXhfb3V0X2ludGVnZXIoIlZhbHVlIiwKLQkJCQkJICAgIG9ial9kZXNjLT5pbmRleF9maWVsZC52YWx1ZSk7Ci0JCQlhY3BpX2V4X291dF9wb2ludGVyKCJJbmRleCIsCi0JCQkJCSAgICBvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqKTsKLQkJCWFjcGlfZXhfb3V0X3BvaW50ZXIoIkRhdGEiLAotCQkJCQkgICAgb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmRhdGFfb2JqKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQkvKiBBbGwgb2JqZWN0IHR5cGVzIGNvdmVyZWQgYWJvdmUgKi8KLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgotCi0JCWFjcGlfZXhfb3V0X2ludGVnZXIoInRhcmdldF90eXBlIiwKLQkJCQkgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS50YXJnZXRfdHlwZSk7Ci0JCWFjcGlfZXhfb3V0X3N0cmluZygiT3Bjb2RlIiwKLQkJCQkgICAoYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8KLQkJCQkgICAgKG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSktPm5hbWUpOwotCQlhY3BpX2V4X291dF9pbnRlZ2VyKCJPZmZzZXQiLCBvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCk7Ci0JCWFjcGlfZXhfb3V0X3BvaW50ZXIoIm9ial9kZXNjIiwgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpOwotCQlhY3BpX2V4X291dF9wb2ludGVyKCJOb2RlIiwgb2JqX2Rlc2MtPnJlZmVyZW5jZS5ub2RlKTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlcigiV2hlcmUiLCBvYmpfZGVzYy0+cmVmZXJlbmNlLndoZXJlKTsKLQotCQlhY3BpX2V4X2R1bXBfcmVmZXJlbmNlKG9ial9kZXNjKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9MT0NBTF9BRERSRVNTX0hBTkRMRVI6Ci0KLQkJYWNwaV9leF9vdXRfaW50ZWdlcigic3BhY2VfaWQiLAotCQkJCSAgICBvYmpfZGVzYy0+YWRkcmVzc19zcGFjZS5zcGFjZV9pZCk7Ci0JCWFjcGlfZXhfb3V0X3BvaW50ZXIoIk5leHQiLCBvYmpfZGVzYy0+YWRkcmVzc19zcGFjZS5uZXh0KTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlcigicmVnaW9uX2xpc3QiLAotCQkJCSAgICBvYmpfZGVzYy0+YWRkcmVzc19zcGFjZS5yZWdpb25fbGlzdCk7Ci0JCWFjcGlfZXhfb3V0X3BvaW50ZXIoIk5vZGUiLCBvYmpfZGVzYy0+YWRkcmVzc19zcGFjZS5ub2RlKTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlcigiQ29udGV4dCIsIG9ial9kZXNjLT5hZGRyZXNzX3NwYWNlLmNvbnRleHQpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX05PVElGWToKLQotCQlhY3BpX2V4X291dF9wb2ludGVyKCJOb2RlIiwgb2JqX2Rlc2MtPm5vdGlmeS5ub2RlKTsKLQkJYWNwaV9leF9vdXRfcG9pbnRlcigiQ29udGV4dCIsIG9ial9kZXNjLT5ub3RpZnkuY29udGV4dCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQUxJQVM6Ci0JY2FzZSBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTOgotCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0VYVFJBOgotCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0RBVEE6Ci0JZGVmYXVsdDoKLQotCQlhY3BpX29zX3ByaW50ZgotCQkgICAgKCJleF9kdW1wX29iamVjdF9kZXNjcmlwdG9yOiBEaXNwbGF5IG5vdCBpbXBsZW1lbnRlZCBmb3Igb2JqZWN0IHR5cGUgJXNcbiIsCi0JCSAgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShvYmpfZGVzYykpOwotCQlicmVhazsKKwlpZiAob2JqX2Rlc2MtPmNvbW1vbi50eXBlID4gQUNQSV9UWVBFX05TX05PREVfTUFYKSB7CisJCXJldHVybl9WT0lEOwogCX0KIAorCS8qIENvbW1vbiBGaWVsZHMgKi8KKworCWFjcGlfZXhfZHVtcF9vYmplY3Qob2JqX2Rlc2MsIGFjcGlfZXhfZHVtcF9jb21tb24pOworCisJLyogT2JqZWN0LXNwZWNpZmljIGZpZWxkcyAqLworCisJYWNwaV9leF9kdW1wX29iamVjdChvYmpfZGVzYywgYWNwaV9leF9kdW1wX2luZm9bb2JqX2Rlc2MtPmNvbW1vbi50eXBlXSk7CiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLSNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZpZWxkLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhmaWVsZC5jCmluZGV4IGFiMWJhMzkuLjc4YTc2ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZpZWxkLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmllbGQuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZsZGlvLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhmbGRpby5jCmluZGV4IGJhNmUwODguLjlmZTI3ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZsZGlvLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmxkaW8uYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTk0LDEwICs5NCw5IEBACiAJLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgcmVnaW9uICovCiAKIAlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUocmduX2Rlc2MpICE9IEFDUElfVFlQRV9SRUdJT04pIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJOZWVkZWQgUmVnaW9uLCBmb3VuZCB0eXBlICVYICglcylcbiIsCi0JCQkJICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShyZ25fZGVzYyksCi0JCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKHJnbl9kZXNjKSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk5lZWRlZCBSZWdpb24sIGZvdW5kIHR5cGUgJVggKCVzKVxuIiwKKwkJCQkgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShyZ25fZGVzYyksCisJCQkJICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShyZ25fZGVzYykpKTsKIAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJfQpAQCAtMTYyLDMxICsxNjEsMTQgQEAKIAkJCSAqIHRoYW4gdGhlIHJlZ2lvbiBpdHNlbGYuICBGb3IgZXhhbXBsZSwgYSByZWdpb24gb2YgbGVuZ3RoIG9uZQogCQkJICogYnl0ZSwgYW5kIGEgZmllbGQgd2l0aCBEd29yZCBhY2Nlc3Mgc3BlY2lmaWVkLgogCQkJICovCi0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJGaWVsZCBbJTQuNHNdIGFjY2VzcyB3aWR0aCAoJWQgYnl0ZXMpIHRvbyBsYXJnZSBmb3IgcmVnaW9uIFslNC40c10gKGxlbmd0aCAlWClcbiIsCi0JCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG9ial9kZXNjLT4KLQkJCQkJCQkJY29tbW9uX2ZpZWxkLgotCQkJCQkJCQlub2RlKSwKLQkJCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgotCQkJCQkgIGFjY2Vzc19ieXRlX3dpZHRoLAotCQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShyZ25fZGVzYy0+Ci0JCQkJCQkJCXJlZ2lvbi5ub2RlKSwKLQkJCQkJICByZ25fZGVzYy0+cmVnaW9uLmxlbmd0aCkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJGaWVsZCBbJTQuNHNdIGFjY2VzcyB3aWR0aCAoJWQgYnl0ZXMpIHRvbyBsYXJnZSBmb3IgcmVnaW9uIFslNC40c10gKGxlbmd0aCAlWClcbiIsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLm5vZGUpLCBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLCBhY3BpX3V0X2dldF9ub2RlX25hbWUocmduX2Rlc2MtPnJlZ2lvbi5ub2RlKSwgcmduX2Rlc2MtPnJlZ2lvbi5sZW5ndGgpKTsKIAkJfQogCiAJCS8qCiAJCSAqIE9mZnNldCByb3VuZGVkIHVwIHRvIG5leHQgbXVsdGlwbGUgb2YgZmllbGQgd2lkdGgKIAkJICogZXhjZWVkcyByZWdpb24gbGVuZ3RoLCBpbmRpY2F0ZSBhbiBlcnJvcgogCQkgKi8KLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJGaWVsZCBbJTQuNHNdIEJhc2UrT2Zmc2V0K1dpZHRoICVYKyVYKyVYIGlzIGJleW9uZCBlbmQgb2YgcmVnaW9uIFslNC40c10gKGxlbmd0aCAlWClcbiIsCi0JCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KLQkJCQkJCQlub2RlKSwKLQkJCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCwKLQkJCQkgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAotCQkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKLQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShyZ25fZGVzYy0+cmVnaW9uLm5vZGUpLAotCQkJCSAgcmduX2Rlc2MtPnJlZ2lvbi5sZW5ndGgpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJGaWVsZCBbJTQuNHNdIEJhc2UrT2Zmc2V0K1dpZHRoICVYKyVYKyVYIGlzIGJleW9uZCBlbmQgb2YgcmVnaW9uIFslNC40c10gKGxlbmd0aCAlWClcbiIsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLm5vZGUpLCBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQsIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LCBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLCBhY3BpX3V0X2dldF9ub2RlX25hbWUocmduX2Rlc2MtPnJlZ2lvbi5ub2RlKSwgcmduX2Rlc2MtPnJlZ2lvbi5sZW5ndGgpKTsKIAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX1JFR0lPTl9MSU1JVCk7CiAJfQpAQCAtMjcwLDEyICsyNTIsMTEgQEAKIAogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlpZiAoc3RhdHVzID09IEFFX05PVF9JTVBMRU1FTlRFRCkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAiUmVnaW9uICVzKCVYKSBub3QgaW1wbGVtZW50ZWRcbiIsCi0JCQkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmduX2Rlc2MtPgotCQkJCQkJCQkgIHJlZ2lvbi4KLQkJCQkJCQkJICBzcGFjZV9pZCksCi0JCQkJCSAgcmduX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJSZWdpb24gJXMoJVgpIG5vdCBpbXBsZW1lbnRlZFxuIiwKKwkJCQkJICAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmduX2Rlc2MtPgorCQkJCQkJCQkgICByZWdpb24uCisJCQkJCQkJCSAgIHNwYWNlX2lkKSwKKwkJCQkJICAgcmduX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCkpOwogCQl9IGVsc2UgaWYgKHN0YXR1cyA9PSBBRV9OT1RfRVhJU1QpIHsKIAkJCUFDUElfUkVQT1JUX0VSUk9SKCgiUmVnaW9uICVzKCVYKSBoYXMgbm8gaGFuZGxlclxuIiwKIAkJCQkJICAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmduX2Rlc2MtPgpAQCAtNjE4LDExICs1OTksMTAgQEAKIAogCQlkZWZhdWx0OgogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJ3cml0ZV93aXRoX3VwZGF0ZV9ydWxlOiBVbmtub3duIHVwZGF0ZV9ydWxlIHNldHRpbmc6ICVYXG4iLAotCQkJCQkgIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgotCQkJCQkgICBmaWVsZF9mbGFncyAmCi0JCQkJCSAgIEFNTF9GSUVMRF9VUERBVEVfUlVMRV9NQVNLKSkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJVbmtub3duIHVwZGF0ZV9ydWxlIHZhbHVlOiAlWFxuIiwKKwkJCQkJICAgKG9ial9kZXNjLT5jb21tb25fZmllbGQuCisJCQkJCSAgICBmaWVsZF9mbGFncyAmCisJCQkJCSAgICBBTUxfRklFTERfVVBEQVRFX1JVTEVfTUFTSykpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9WQUxVRSk7CiAJCX0KIAl9CkBAIC02NzcsMTAgKzY1Nyw3IEBACiAKIAlpZiAoYnVmZmVyX2xlbmd0aCA8CiAJICAgIEFDUElfUk9VTkRfQklUU19VUF9UT19CWVRFUyhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiRmllbGQgc2l6ZSAlWCAoYml0cykgaXMgdG9vIGxhcmdlIGZvciBidWZmZXIgKCVYKVxuIiwKLQkJCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCwKLQkJCQkgIGJ1ZmZlcl9sZW5ndGgpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJGaWVsZCBzaXplICVYIChiaXRzKSBpcyB0b28gbGFyZ2UgZm9yIGJ1ZmZlciAoJVgpXG4iLCBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgsIGJ1ZmZlcl9sZW5ndGgpKTsKIAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQlVGRkVSX09WRVJGTE9XKTsKIAl9CkBAIC03OTIsMTAgKzc2OSw3IEBACiAKIAlpZiAoYnVmZmVyX2xlbmd0aCA8CiAJICAgIEFDUElfUk9VTkRfQklUU19VUF9UT19CWVRFUyhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiRmllbGQgc2l6ZSAlWCAoYml0cykgaXMgdG9vIGxhcmdlIGZvciBidWZmZXIgKCVYKVxuIiwKLQkJCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCwKLQkJCQkgIGJ1ZmZlcl9sZW5ndGgpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJGaWVsZCBzaXplICVYIChiaXRzKSBpcyB0b28gbGFyZ2UgZm9yIGJ1ZmZlciAoJVgpXG4iLCBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgsIGJ1ZmZlcl9sZW5ndGgpKTsKIAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQlVGRkVSX09WRVJGTE9XKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtaXNjLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtaXNjLmMKaW5kZXggYTNmNGQ3Mi4uNWFkMzQ1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bWlzYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG1pc2MuYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CisjaW5jbHVkZSA8YWNwaS9hbWxyZXNyYy5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgogQUNQSV9NT0RVTEVfTkFNRSgiZXhtaXNjIikKQEAgLTk3LDcgKzk4LDggQEAKIAogCQlkZWZhdWx0OgogCi0JCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVua25vd24gUmVmZXJlbmNlIG9wY29kZSBpbiBnZXRfcmVmZXJlbmNlICVYXG4iLCBvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJVbmtub3duIFJlZmVyZW5jZSBvcGNvZGUgJVhcbiIsCisJCQkJCSAgIG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVEVSTkFMKTsKIAkJfQogCQlicmVhazsKQEAgLTExMiw3ICsxMTQsOCBAQAogCiAJZGVmYXVsdDoKIAotCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkludmFsaWQgZGVzY3JpcHRvciB0eXBlIGluIGdldF9yZWZlcmVuY2U6ICVYXG4iLCBBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqX2Rlc2MpKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiSW52YWxpZCBkZXNjcmlwdG9yIHR5cGUgJVhcbiIsCisJCQkJICAgQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSkpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7CiAJfQogCkBAIC0xNTcsNDggKzE2MCw1OCBAQAogCQkJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmFjdHVhbF9yZXR1cm5fZGVzYywKIAkJCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjOwogCXU4ICpuZXdfYnVmOwotCXU4ICplbmRfdGFnMTsKLQl1OCAqZW5kX3RhZzI7CisJdTggKmVuZF90YWc7CisJYWNwaV9zaXplIGxlbmd0aDA7CiAJYWNwaV9zaXplIGxlbmd0aDE7Ci0JYWNwaV9zaXplIGxlbmd0aDI7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9jb25jYXRfdGVtcGxhdGUiKTsKIAotCS8qIEZpbmQgdGhlIGVuZF90YWdzIGluIGVhY2ggcmVzb3VyY2UgdGVtcGxhdGUgKi8KLQotCWVuZF90YWcxID0gYWNwaV91dF9nZXRfcmVzb3VyY2VfZW5kX3RhZyhvcGVyYW5kMCk7Ci0JZW5kX3RhZzIgPSBhY3BpX3V0X2dldF9yZXNvdXJjZV9lbmRfdGFnKG9wZXJhbmQxKTsKLQlpZiAoIWVuZF90YWcxIHx8ICFlbmRfdGFnMikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJLyoKKwkgKiBGaW5kIHRoZSBlbmRfdGFnIGRlc2NyaXB0b3IgaW4gZWFjaCByZXNvdXJjZSB0ZW1wbGF0ZS4KKwkgKiBOb3RlOiByZXR1cm5lZCBwb2ludGVycyBwb2ludCBUTyB0aGUgZW5kX3RhZywgbm90IHBhc3QgaXQuCisJICoKKwkgKiBDb21wdXRlIHRoZSBsZW5ndGggb2YgZWFjaCByZXNvdXJjZSB0ZW1wbGF0ZQorCSAqLworCXN0YXR1cyA9IGFjcGlfdXRfZ2V0X3Jlc291cmNlX2VuZF90YWcob3BlcmFuZDAsICZlbmRfdGFnKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JLyogQ29tcHV0ZSB0aGUgbGVuZ3RoIG9mIGVhY2ggcGFydCAqLworCWxlbmd0aDAgPSBBQ1BJX1BUUl9ESUZGKGVuZF90YWcsIG9wZXJhbmQwLT5idWZmZXIucG9pbnRlcik7CiAKLQlsZW5ndGgxID0gQUNQSV9QVFJfRElGRihlbmRfdGFnMSwgb3BlcmFuZDAtPmJ1ZmZlci5wb2ludGVyKTsKLQlsZW5ndGgyID0gQUNQSV9QVFJfRElGRihlbmRfdGFnMiwgb3BlcmFuZDEtPmJ1ZmZlci5wb2ludGVyKSArIDI7CS8qIFNpemUgb2YgRU5EX1RBRyAqLworCXN0YXR1cyA9IGFjcGlfdXRfZ2V0X3Jlc291cmNlX2VuZF90YWcob3BlcmFuZDEsICZlbmRfdGFnKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogSW5jbHVkZSB0aGUgZW5kX3RhZyBpbiB0aGUgc2Vjb25kIHRlbXBsYXRlIGxlbmd0aCAqLworCisJbGVuZ3RoMSA9IEFDUElfUFRSX0RJRkYoZW5kX3RhZywgb3BlcmFuZDEtPmJ1ZmZlci5wb2ludGVyKSArCisJICAgIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2VuZF90YWcpOwogCiAJLyogQ3JlYXRlIGEgbmV3IGJ1ZmZlciBvYmplY3QgZm9yIHRoZSByZXN1bHQgKi8KIAotCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdChsZW5ndGgxICsgbGVuZ3RoMik7CisJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0KGxlbmd0aDAgKyBsZW5ndGgxKTsKIAlpZiAoIXJldHVybl9kZXNjKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAotCS8qIENvcHkgdGhlIHRlbXBsYXRlcyB0byB0aGUgbmV3IGRlc2NyaXB0b3IgKi8KLQorCS8qCisJICogQ29weSB0aGUgdGVtcGxhdGVzIHRvIHRoZSBuZXcgYnVmZmVyLCAwIGZpcnN0LCB0aGVuIDEgZm9sbG93cy4gT25lCisJICogZW5kX3RhZyBkZXNjcmlwdG9yIGlzIGNvcGllZCBmcm9tIE9wZXJhbmQxLgorCSAqLwogCW5ld19idWYgPSByZXR1cm5fZGVzYy0+YnVmZmVyLnBvaW50ZXI7Ci0JQUNQSV9NRU1DUFkobmV3X2J1Ziwgb3BlcmFuZDAtPmJ1ZmZlci5wb2ludGVyLCBsZW5ndGgxKTsKLQlBQ1BJX01FTUNQWShuZXdfYnVmICsgbGVuZ3RoMSwgb3BlcmFuZDEtPmJ1ZmZlci5wb2ludGVyLCBsZW5ndGgyKTsKKwlBQ1BJX01FTUNQWShuZXdfYnVmLCBvcGVyYW5kMC0+YnVmZmVyLnBvaW50ZXIsIGxlbmd0aDApOworCUFDUElfTUVNQ1BZKG5ld19idWYgKyBsZW5ndGgwLCBvcGVyYW5kMS0+YnVmZmVyLnBvaW50ZXIsIGxlbmd0aDEpOwogCi0JLyogQ29tcHV0ZSB0aGUgbmV3IGNoZWNrc3VtICovCisJLyogU2V0IHRoZSBlbmRfdGFnIGNoZWNrc3VtIHRvIHplcm8sIG1lYW5zICJpZ25vcmUgY2hlY2tzdW0iICovCiAKLQluZXdfYnVmW3JldHVybl9kZXNjLT5idWZmZXIubGVuZ3RoIC0gMV0gPQotCSAgICBhY3BpX3V0X2dlbmVyYXRlX2NoZWNrc3VtKHJldHVybl9kZXNjLT5idWZmZXIucG9pbnRlciwKLQkJCQkgICAgICAocmV0dXJuX2Rlc2MtPmJ1ZmZlci5sZW5ndGggLSAxKSk7CisJbmV3X2J1ZltyZXR1cm5fZGVzYy0+YnVmZmVyLmxlbmd0aCAtIDFdID0gMDsKIAotCS8qIFJldHVybiB0aGUgY29tcGxldGVkIHRlbXBsYXRlIGRlc2NyaXB0b3IgKi8KKwkvKiBSZXR1cm4gdGhlIGNvbXBsZXRlZCByZXNvdXJjZSB0ZW1wbGF0ZSAqLwogCiAJKmFjdHVhbF9yZXR1cm5fZGVzYyA9IHJldHVybl9kZXNjOwogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CkBAIC0yMjksNyArMjQyLDYgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYzsKIAljaGFyICpuZXdfYnVmOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlhY3BpX3NpemUgbmV3X2xlbmd0aDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2RvX2NvbmNhdGVuYXRlIik7CiAKQEAgLTI1Niw3ICsyNjgsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCUFDUElfUkVQT1JUX0VSUk9SKCgiQ29uY2F0IC0gaW52YWxpZCBvYmogdHlwZTogJVhcbiIsCisJCUFDUElfUkVQT1JUX0VSUk9SKCgiSW52YWxpZCBvYmplY3QgdHlwZTogJVhcbiIsCiAJCQkJICAgQUNQSV9HRVRfT0JKRUNUX1RZUEUob3BlcmFuZDApKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9JTlRFUk5BTDsKIAl9CkBAIC0yOTYsOCArMzA4LDcgQEAKIAogCQkvKiBDb3B5IHRoZSBmaXJzdCBpbnRlZ2VyLCBMU0IgZmlyc3QgKi8KIAotCQlBQ1BJX01FTUNQWShuZXdfYnVmLAotCQkJICAgICZvcGVyYW5kMC0+aW50ZWdlci52YWx1ZSwKKwkJQUNQSV9NRU1DUFkobmV3X2J1ZiwgJm9wZXJhbmQwLT5pbnRlZ2VyLnZhbHVlLAogCQkJICAgIGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCk7CiAKIAkJLyogQ29weSB0aGUgc2Vjb25kIGludGVnZXIgKExTQiBmaXJzdCkgYWZ0ZXIgdGhlIGZpcnN0ICovCkBAIC0zMTEsMTQgKzMyMiwxMSBAQAogCiAJCS8qIFJlc3VsdCBvZiB0d28gU3RyaW5ncyBpcyBhIFN0cmluZyAqLwogCi0JCW5ld19sZW5ndGggPSAoYWNwaV9zaXplKSBvcGVyYW5kMC0+c3RyaW5nLmxlbmd0aCArCi0JCSAgICAoYWNwaV9zaXplKSBsb2NhbF9vcGVyYW5kMS0+c3RyaW5nLmxlbmd0aDsKLQkJaWYgKG5ld19sZW5ndGggPiBBQ1BJX01BWF9TVFJJTkdfQ09OVkVSU0lPTikgewotCQkJc3RhdHVzID0gQUVfQU1MX1NUUklOR19MSU1JVDsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfc3RyaW5nX29iamVjdChuZXdfbGVuZ3RoKTsKKwkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9zdHJpbmdfb2JqZWN0KChhY3BpX3NpemUpCisJCQkJCQkJICAgKG9wZXJhbmQwLT5zdHJpbmcuCisJCQkJCQkJICAgIGxlbmd0aCArCisJCQkJCQkJICAgIGxvY2FsX29wZXJhbmQxLT4KKwkJCQkJCQkgICAgc3RyaW5nLmxlbmd0aCkpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIGNsZWFudXA7CkBAIC0zMzgsMTEgKzM0NiwxMCBAQAogCQkvKiBSZXN1bHQgb2YgdHdvIEJ1ZmZlcnMgaXMgYSBCdWZmZXIgKi8KIAogCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QoKGFjcGlfc2l6ZSkKLQkJCQkJCQkgICBvcGVyYW5kMC0+YnVmZmVyLgotCQkJCQkJCSAgIGxlbmd0aCArCi0JCQkJCQkJICAgKGFjcGlfc2l6ZSkKLQkJCQkJCQkgICBsb2NhbF9vcGVyYW5kMS0+Ci0JCQkJCQkJICAgYnVmZmVyLmxlbmd0aCk7CisJCQkJCQkJICAgKG9wZXJhbmQwLT5idWZmZXIuCisJCQkJCQkJICAgIGxlbmd0aCArCisJCQkJCQkJICAgIGxvY2FsX29wZXJhbmQxLT4KKwkJCQkJCQkgICAgYnVmZmVyLmxlbmd0aCkpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIGNsZWFudXA7CkBAIC0zNTIsOCArMzU5LDggQEAKIAogCQkvKiBDb25jYXRlbmF0ZSB0aGUgYnVmZmVycyAqLwogCi0JCUFDUElfTUVNQ1BZKG5ld19idWYsCi0JCQkgICAgb3BlcmFuZDAtPmJ1ZmZlci5wb2ludGVyLCBvcGVyYW5kMC0+YnVmZmVyLmxlbmd0aCk7CisJCUFDUElfTUVNQ1BZKG5ld19idWYsIG9wZXJhbmQwLT5idWZmZXIucG9pbnRlciwKKwkJCSAgICBvcGVyYW5kMC0+YnVmZmVyLmxlbmd0aCk7CiAJCUFDUElfTUVNQ1BZKG5ld19idWYgKyBvcGVyYW5kMC0+YnVmZmVyLmxlbmd0aCwKIAkJCSAgICBsb2NhbF9vcGVyYW5kMS0+YnVmZmVyLnBvaW50ZXIsCiAJCQkgICAgbG9jYWxfb3BlcmFuZDEtPmJ1ZmZlci5sZW5ndGgpOwpAQCAtMzYzLDcgKzM3MCw3IEBACiAKIAkJLyogSW52YWxpZCBvYmplY3QgdHlwZSwgc2hvdWxkIG5vdCBoYXBwZW4gaGVyZSAqLwogCi0JCUFDUElfUkVQT1JUX0VSUk9SKCgiQ29uY2F0ZW5hdGUgLSBJbnZhbGlkIG9iamVjdCB0eXBlOiAlWFxuIiwKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJJbnZhbGlkIG9iamVjdCB0eXBlOiAlWFxuIiwKIAkJCQkgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvcGVyYW5kMCkpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOwogCQlnb3RvIGNsZWFudXA7CkBAIC02MjUsOSArNjMyLDggQEAKIAogCQkvKiBMZXhpY29ncmFwaGljIGNvbXBhcmU6IGNvbXBhcmUgdGhlIGRhdGEgYnl0ZXMgKi8KIAotCQljb21wYXJlID0gQUNQSV9NRU1DTVAoKGNvbnN0IGNoYXIgKilvcGVyYW5kMC0+YnVmZmVyLnBvaW50ZXIsCi0JCQkJICAgICAgKGNvbnN0IGNoYXIgKilsb2NhbF9vcGVyYW5kMS0+YnVmZmVyLgotCQkJCSAgICAgIHBvaW50ZXIsCisJCWNvbXBhcmUgPSBBQ1BJX01FTUNNUChvcGVyYW5kMC0+YnVmZmVyLnBvaW50ZXIsCisJCQkJICAgICAgbG9jYWxfb3BlcmFuZDEtPmJ1ZmZlci5wb2ludGVyLAogCQkJCSAgICAgIChsZW5ndGgwID4gbGVuZ3RoMSkgPyBsZW5ndGgxIDogbGVuZ3RoMCk7CiAKIAkJc3dpdGNoIChvcGNvZGUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG11dGV4LmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtdXRleC5jCmluZGV4IGFiNDdmNmQuLjg5YjhhYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG11dGV4LmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bXV0ZXguYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG5hbWVzLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhuYW1lcy5jCmluZGV4IDIzOWQ4NDcuLmRlMzIxNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG5hbWVzLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bmFtZXMuYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTk5LDcgKzk5LDggQEAKIAkgKi8KIAluYW1lX3N0cmluZyA9IEFDUElfTUVNX0FMTE9DQVRFKHNpemVfbmVlZGVkKTsKIAlpZiAoIW5hbWVfc3RyaW5nKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SKCgiZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmc6IENvdWxkIG5vdCBhbGxvY2F0ZSBzaXplICVkXG4iLCBzaXplX25lZWRlZCkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBhbGxvY2F0ZSBzaXplICVkXG4iLAorCQkJCSAgIHNpemVfbmVlZGVkKSk7CiAJCXJldHVybl9QVFIoTlVMTCk7CiAJfQogCkBAIC0xNjcsOCArMTY4LDcgQEAKIAljaGFyX2J1ZlswXSA9ICphbWxfYWRkcmVzczsKIAogCWlmICgnMCcgPD0gY2hhcl9idWZbMF0gJiYgY2hhcl9idWZbMF0gPD0gJzknKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJsZWFkaW5nIGRpZ2l0OiAlY1xuIiwKLQkJCQkgIGNoYXJfYnVmWzBdKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiSW52YWxpZCBsZWFkaW5nIGRpZ2l0OiAlY1xuIiwgY2hhcl9idWZbMF0pKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0NUUkxfUEVORElORyk7CiAJfQogCkBAIC0xOTEsMTAgKzE5MSwxMCBAQAogCQlpZiAobmFtZV9zdHJpbmcpIHsKIAkJCUFDUElfU1RSQ0FUKG5hbWVfc3RyaW5nLCBjaGFyX2J1Zik7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAotCQkJCQkgICJBcHBlbmRlZCB0byAtICVzIFxuIiwgbmFtZV9zdHJpbmcpKTsKKwkJCQkJICAiQXBwZW5kZWQgdG8gLSAlc1xuIiwgbmFtZV9zdHJpbmcpKTsKIAkJfSBlbHNlIHsKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCi0JCQkJCSAgIk5vIE5hbWUgc3RyaW5nIC0gJXMgXG4iLCBjaGFyX2J1ZikpOworCQkJCQkgICJObyBOYW1lIHN0cmluZyAtICVzXG4iLCBjaGFyX2J1ZikpOwogCQl9CiAJfSBlbHNlIGlmIChpbmRleCA9PSAwKSB7CiAJCS8qCkBAIC0yMTEsMTIgKzIxMSwxMSBAQAogCQkgKiB0aGUgcmVxdWlyZWQgNAogCQkgKi8KIAkJc3RhdHVzID0gQUVfQU1MX0JBRF9OQU1FOwotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIkJhZCBjaGFyYWN0ZXIgJTAyeCBpbiBuYW1lLCBhdCAlcFxuIiwKLQkJCQkgICphbWxfYWRkcmVzcywgYW1sX2FkZHJlc3MpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJCYWQgY2hhcmFjdGVyICUwMnggaW4gbmFtZSwgYXQgJXBcbiIsCisJCQkJICAgKmFtbF9hZGRyZXNzLCBhbWxfYWRkcmVzcykpOwogCX0KIAotCSppbl9hbWxfYWRkcmVzcyA9ICh1OCAqKSBhbWxfYWRkcmVzczsKKwkqaW5fYW1sX2FkZHJlc3MgPSBBQ1BJX0NBU1RfUFRSKHU4LCBhbWxfYWRkcmVzcyk7CiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKQEAgLTQxMiw4ICs0MTEsNyBAQAogCWlmIChBRV9DVFJMX1BFTkRJTkcgPT0gc3RhdHVzICYmIGhhc19wcmVmaXgpIHsKIAkJLyogUmFuIG91dCBvZiBzZWdtZW50cyBhZnRlciBwcm9jZXNzaW5nIGEgcHJlZml4ICovCiAKLQkJQUNQSV9SRVBPUlRfRVJST1IoKCJleF9kb19uYW1lOiBNYWxmb3JtZWQgTmFtZSBhdCAlcFxuIiwKLQkJCQkgICBuYW1lX3N0cmluZykpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk1hbGZvcm1lZCBOYW1lIGF0ICVwXG4iLCBuYW1lX3N0cmluZykpOwogCQlzdGF0dXMgPSBBRV9BTUxfQkFEX05BTUU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzEuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMS5jCmluZGV4IDk3ZTM0NTQuLmJjODgzN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMS5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMS5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMTExLDcgKzExMSw4IEBACiAKIAlkZWZhdWx0OgkJLyogIFVua25vd24gb3Bjb2RlICAqLwogCi0JCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9leF9vcGNvZGVfMEFfMFRfMVI6IFVua25vd24gb3Bjb2RlICVYXG4iLCB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJVbmtub3duIEFNTCBvcGNvZGUgJVhcbiIsCisJCQkJICAgd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOwogCQlicmVhazsKIAl9CkBAIC0xODgsNyArMTg5LDggQEAKIAogCWRlZmF1bHQ6CQkvKiAgVW5rbm93biBvcGNvZGUgICovCiAKLQkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V4X29wY29kZV8xQV8wVF8wUjogVW5rbm93biBvcGNvZGUgJVhcbiIsIHdhbGtfc3RhdGUtPm9wY29kZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVua25vd24gQU1MIG9wY29kZSAlWFxuIiwKKwkJCQkgICB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CiAJCWJyZWFrOwogCX0KQEAgLTIyNyw3ICsyMjksOCBAQAogCiAJZGVmYXVsdDoJCS8qIFVua25vd24gb3Bjb2RlICovCiAKLQkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V4X29wY29kZV8xQV8xVF8wUjogVW5rbm93biBvcGNvZGUgJVhcbiIsIHdhbGtfc3RhdGUtPm9wY29kZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVua25vd24gQU1MIG9wY29kZSAlWFxuIiwKKwkJCQkgICB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CiAJCWdvdG8gY2xlYW51cDsKIAl9CkBAIC0zNDYsOSArMzQ5LDcgQEAKIAkJCQkvKiBDaGVjayB0aGUgcmFuZ2Ugb2YgdGhlIGRpZ2l0ICovCiAKIAkJCQlpZiAodGVtcDMyID4gOSkgewotCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJCSAgIkJDRCBkaWdpdCB0b28gbGFyZ2UgKG5vdCBkZWNpbWFsKTogMHglWFxuIiwKLQkJCQkJCQkgIHRlbXAzMikpOworCQkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkJDRCBkaWdpdCB0b28gbGFyZ2UgKG5vdCBkZWNpbWFsKTogMHglWFxuIiwgdGVtcDMyKSk7CiAKIAkJCQkJc3RhdHVzID0gQUVfQU1MX05VTUVSSUNfT1ZFUkZMT1c7CiAJCQkJCWdvdG8gY2xlYW51cDsKQEAgLTM5MywxMiArMzk0LDcgQEAKIAkJCS8qIE92ZXJmbG93IGlmIHRoZXJlIGlzIGFueSBkYXRhIGxlZnQgaW4gRGlnaXQgKi8KIAogCQkJaWYgKGRpZ2l0ID4gMCkgewotCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCQkgICJJbnRlZ2VyIHRvbyBsYXJnZSB0byBjb252ZXJ0IHRvIEJDRDogJTguOFglOC44WFxuIiwKLQkJCQkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KG9wZXJhbmQKLQkJCQkJCQkJICAgICBbMF0tPgotCQkJCQkJCQkgICAgIGludGVnZXIuCi0JCQkJCQkJCSAgICAgdmFsdWUpKSk7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJJbnRlZ2VyIHRvbyBsYXJnZSB0byBjb252ZXJ0IHRvIEJDRDogJTguOFglOC44WFxuIiwgQUNQSV9GT1JNQVRfVUlOVDY0KG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWUpKSk7CiAJCQkJc3RhdHVzID0gQUVfQU1MX05VTUVSSUNfT1ZFUkZMT1c7CiAJCQkJZ290byBjbGVhbnVwOwogCQkJfQpAQCAtNTI1LDE1ICs1MjEsMTYgQEAKIAogCQkvKiBUaGVzZSBhcmUgdHdvIG9ic29sZXRlIG9wY29kZXMgKi8KIAotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIiVzIGlzIG9ic29sZXRlIGFuZCBub3QgaW1wbGVtZW50ZWRcbiIsCi0JCQkJICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiJXMgaXMgb2Jzb2xldGUgYW5kIG5vdCBpbXBsZW1lbnRlZFxuIiwKKwkJCQkgICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT4KKwkJCQkJCQkgICBvcGNvZGUpKSk7CiAJCXN0YXR1cyA9IEFFX1NVUFBPUlQ7CiAJCWdvdG8gY2xlYW51cDsKIAogCWRlZmF1bHQ6CQkvKiBVbmtub3duIG9wY29kZSAqLwogCi0JCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9leF9vcGNvZGVfMUFfMVRfMVI6IFVua25vd24gb3Bjb2RlICVYXG4iLCB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJVbmtub3duIEFNTCBvcGNvZGUgJVhcbiIsCisJCQkJICAgd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOwogCQlnb3RvIGNsZWFudXA7CiAJfQpAQCAtNjM5LDExICs2MzYsMTAgQEAKIAkJICAgIGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyhBTUxfTE5PVF9PUCwgJnRlbXBfZGVzYywKIAkJCQkJICAgICB3YWxrX3N0YXRlKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICIlczogYmFkIG9wZXJhbmQocykgJXNcbiIsCi0JCQkJCSAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+Ci0JCQkJCQkJCSAgb3Bjb2RlKSwKLQkJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCIlczogYmFkIG9wZXJhbmQocykgJXNcbiIsCisJCQkJCSAgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPgorCQkJCQkJCQkgICBvcGNvZGUpLAorCQkJCQkgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KQEAgLTc0Miw5ICs3MzgsNyBAQAogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgInNpemVfb2YgLSBPcGVyYW5kIGlzIG5vdCBCdWYvSW50L1N0ci9Qa2cgLSBmb3VuZCB0eXBlICVzXG4iLAotCQkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0eXBlKSkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJPcGVyYW5kIGlzIG5vdCBCdWYvSW50L1N0ci9Qa2cgLSBmb3VuZCB0eXBlICVzXG4iLCBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSkpKTsKIAkJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KQEAgLTk0MSwxMSArOTM1LDcgQEAKIAogCQkJCWRlZmF1bHQ6CiAKLQkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCQkgICJVbmtub3duIEluZGV4IHRhcmdldF90eXBlICVYIGluIG9iaiAlcFxuIiwKLQkJCQkJCQkgIG9wZXJhbmRbMF0tPnJlZmVyZW5jZS4KLQkJCQkJCQkgIHRhcmdldF90eXBlLAotCQkJCQkJCSAgb3BlcmFuZFswXSkpOworCQkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVua25vd24gSW5kZXggdGFyZ2V0X3R5cGUgJVggaW4gb2JqICVwXG4iLCBvcGVyYW5kWzBdLT5yZWZlcmVuY2UudGFyZ2V0X3R5cGUsIG9wZXJhbmRbMF0pKTsKIAkJCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKIAkJCQkJZ290byBjbGVhbnVwOwogCQkJCX0KQEAgLTk3MSwxMSArOTYxLDcgQEAKIAkJCQlicmVhazsKIAogCQkJZGVmYXVsdDoKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJICAiVW5rbm93biBvcGNvZGUgaW4gcmVmKCVwKSAtICVYXG4iLAotCQkJCQkJICBvcGVyYW5kWzBdLAotCQkJCQkJICBvcGVyYW5kWzBdLT5yZWZlcmVuY2UuCi0JCQkJCQkgIG9wY29kZSkpOworCQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiVW5rbm93biBvcGNvZGUgaW4gcmVmKCVwKSAtICVYXG4iLCBvcGVyYW5kWzBdLCBvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub3Bjb2RlKSk7CiAKIAkJCQlzdGF0dXMgPSBBRV9UWVBFOwogCQkJCWdvdG8gY2xlYW51cDsKQEAgLTk4NSw3ICs5NzEsOCBAQAogCiAJZGVmYXVsdDoKIAotCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfZXhfb3Bjb2RlXzFBXzBUXzFSOiBVbmtub3duIG9wY29kZSAlWFxuIiwgd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiVW5rbm93biBBTUwgb3Bjb2RlICVYXG4iLAorCQkJCSAgIHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKIAkJZ290byBjbGVhbnVwOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcyLmMKaW5kZXggOGQ3MGM2Yi4uN2M1OWRkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcyLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcyLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0xMTEsOSArMTExLDcgQEAKIAkJLyogQXJlIG5vdGlmaWVzIGFsbG93ZWQgb24gdGhpcyBvYmplY3Q/ICovCiAKIAkJaWYgKCFhY3BpX2V2X2lzX25vdGlmeV9vYmplY3Qobm9kZSkpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgIlVuZXhwZWN0ZWQgbm90aWZ5IG9iamVjdCB0eXBlIFslc11cbiIsCi0JCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG5vZGUtPnR5cGUpKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVuZXhwZWN0ZWQgbm90aWZ5IG9iamVjdCB0eXBlIFslc11cbiIsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShub2RlLT50eXBlKSkpOwogCiAJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwogCQkJYnJlYWs7CkBAIC0xNTcsNyArMTU1LDggQEAKIAogCWRlZmF1bHQ6CiAKLQkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V4X29wY29kZV8yQV8wVF8wUjogVW5rbm93biBvcGNvZGUgJVhcbiIsIHdhbGtfc3RhdGUtPm9wY29kZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVua25vd24gQU1MIG9wY29kZSAlWFxuIiwKKwkJCQkgICB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CiAJfQogCkBAIC0yMjEsNyArMjIwLDggQEAKIAogCWRlZmF1bHQ6CiAKLQkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V4X29wY29kZV8yQV8yVF8xUjogVW5rbm93biBvcGNvZGUgJVhcbiIsIHdhbGtfc3RhdGUtPm9wY29kZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVua25vd24gQU1MIG9wY29kZSAlWFxuIiwKKwkJCQkgICB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CiAJCWdvdG8gY2xlYW51cDsKIAl9CkBAIC0zNDQsMTAgKzM0NCw2IEBACiAJCSAgICAgICAobGVuZ3RoIDwgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZSkgJiYKIAkJICAgICAgIChvcGVyYW5kWzBdLT5idWZmZXIucG9pbnRlcltsZW5ndGhdKSkgewogCQkJbGVuZ3RoKys7Ci0JCQlpZiAobGVuZ3RoID4gQUNQSV9NQVhfU1RSSU5HX0NPTlZFUlNJT04pIHsKLQkJCQlzdGF0dXMgPSBBRV9BTUxfU1RSSU5HX0xJTUlUOwotCQkJCWdvdG8gY2xlYW51cDsKLQkJCX0KIAkJfQogCiAJCS8qIEFsbG9jYXRlIGEgbmV3IHN0cmluZyBvYmplY3QgKi8KQEAgLTM1OCw4ICszNTQsMTAgQEAKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCi0JCS8qIENvcHkgdGhlIHJhdyBidWZmZXIgZGF0YSB3aXRoIG5vIHRyYW5zZm9ybS4gTlVMTCB0ZXJtaW5hdGVkIGFscmVhZHkgKi8KLQorCQkvKgorCQkgKiBDb3B5IHRoZSByYXcgYnVmZmVyIGRhdGEgd2l0aCBubyB0cmFuc2Zvcm0uCisJCSAqIChOVUxMIHRlcm1pbmF0ZWQgYWxyZWFkeSkKKwkJICovCiAJCUFDUElfTUVNQ1BZKHJldHVybl9kZXNjLT5zdHJpbmcucG9pbnRlciwKIAkJCSAgICBvcGVyYW5kWzBdLT5idWZmZXIucG9pbnRlciwgbGVuZ3RoKTsKIAkJYnJlYWs7CkBAIC0zOTEsMTAgKzM4OSw3IEBACiAJCQkvKiBPYmplY3QgdG8gYmUgaW5kZXhlZCBpcyBhIFBhY2thZ2UgKi8KIAogCQkJaWYgKGluZGV4ID49IG9wZXJhbmRbMF0tPnBhY2thZ2UuY291bnQpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJICAiSW5kZXggdmFsdWUgKCVYJTguOFgpIGJleW9uZCBwYWNrYWdlIGVuZCAoJVgpXG4iLAotCQkJCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoaW5kZXgpLAotCQkJCQkJICBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50KSk7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJJbmRleCB2YWx1ZSAoJVglOC44WCkgYmV5b25kIHBhY2thZ2UgZW5kICglWClcbiIsIEFDUElfRk9STUFUX1VJTlQ2NChpbmRleCksIG9wZXJhbmRbMF0tPnBhY2thZ2UuY291bnQpKTsKIAkJCQlzdGF0dXMgPSBBRV9BTUxfUEFDS0FHRV9MSU1JVDsKIAkJCQlnb3RvIGNsZWFudXA7CiAJCQl9CkBAIC00MDcsMTAgKzQwMiw3IEBACiAJCQkvKiBPYmplY3QgdG8gYmUgaW5kZXhlZCBpcyBhIEJ1ZmZlci9TdHJpbmcgKi8KIAogCQkJaWYgKGluZGV4ID49IG9wZXJhbmRbMF0tPmJ1ZmZlci5sZW5ndGgpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJICAiSW5kZXggdmFsdWUgKCVYJTguOFgpIGJleW9uZCBlbmQgb2YgYnVmZmVyICglWClcbiIsCi0JCQkJCQkgIEFDUElfRk9STUFUX1VJTlQ2NChpbmRleCksCi0JCQkJCQkgIG9wZXJhbmRbMF0tPmJ1ZmZlci5sZW5ndGgpKTsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkluZGV4IHZhbHVlICglWCU4LjhYKSBiZXlvbmQgZW5kIG9mIGJ1ZmZlciAoJVgpXG4iLCBBQ1BJX0ZPUk1BVF9VSU5UNjQoaW5kZXgpLCBvcGVyYW5kWzBdLT5idWZmZXIubGVuZ3RoKSk7CiAJCQkJc3RhdHVzID0gQUVfQU1MX0JVRkZFUl9MSU1JVDsKIAkJCQlnb3RvIGNsZWFudXA7CiAJCQl9CkBAIC00NDIsNyArNDM0LDggQEAKIAogCWRlZmF1bHQ6CiAKLQkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V4X29wY29kZV8yQV8xVF8xUjogVW5rbm93biBvcGNvZGUgJVhcbiIsIHdhbGtfc3RhdGUtPm9wY29kZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVua25vd24gQU1MIG9wY29kZSAlWFxuIiwKKwkJCQkgICB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CiAJCWJyZWFrOwogCX0KQEAgLTU0Niw3ICs1MzksOCBAQAogCiAJZGVmYXVsdDoKIAotCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfZXhfb3Bjb2RlXzJBXzBUXzFSOiBVbmtub3duIG9wY29kZSAlWFxuIiwgd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiVW5rbm93biBBTUwgb3Bjb2RlICVYXG4iLAorCQkJCSAgIHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKIAkJZ290byBjbGVhbnVwOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMy5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmczLmMKaW5kZXggNDgzMzY1Ny4uYTk3OWIzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmczLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmczLmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0xMTksNyArMTE5LDggQEAKIAogCWRlZmF1bHQ6CiAKLQkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V4X29wY29kZV8zQV8wVF8wUjogVW5rbm93biBvcGNvZGUgJVhcbiIsIHdhbGtfc3RhdGUtPm9wY29kZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVua25vd24gQU1MIG9wY29kZSAlWFxuIiwKKwkJCQkgICB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CiAJCWdvdG8gY2xlYW51cDsKIAl9CkBAIC0yMjMsOCArMjI0LDggQEAKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCi0JCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkvKiBDb3B5IHRoZSBwb3J0aW9uIHJlcXVlc3RlZCAqLworCQlpZiAoYnVmZmVyKSB7CisJCQkvKiBXZSBoYXZlIGEgYnVmZmVyLCBjb3B5IHRoZSBwb3J0aW9uIHJlcXVlc3RlZCAqLwogCiAJCQlBQ1BJX01FTUNQWShidWZmZXIsIG9wZXJhbmRbMF0tPnN0cmluZy5wb2ludGVyICsgaW5kZXgsCiAJCQkJICAgIGxlbmd0aCk7CkBAIC0yNDIsNyArMjQzLDggQEAKIAogCWRlZmF1bHQ6CiAKLQkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2V4X29wY29kZV8zQV8wVF8wUjogVW5rbm93biBvcGNvZGUgJVhcbiIsIHdhbGtfc3RhdGUtPm9wY29kZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVua25vd24gQU1MIG9wY29kZSAlWFxuIiwKKwkJCQkgICB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CiAJCWdvdG8gY2xlYW51cDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzYuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnNi5jCmluZGV4IDVkZWU3NzEuLjA1ZTdmOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnNi5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnNi5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMjM0LDggKzIzNCw3IEBACiAKIAkJaWYgKChvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlID4gTUFYX01BVENIX09QRVJBVE9SKSB8fAogCQkgICAgKG9wZXJhbmRbM10tPmludGVnZXIudmFsdWUgPiBNQVhfTUFUQ0hfT1BFUkFUT1IpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJNYXRjaCBvcGVyYXRvciBvdXQgb2YgcmFuZ2VcbiIpKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiTWF0Y2ggb3BlcmF0b3Igb3V0IG9mIHJhbmdlXG4iKSk7CiAJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9WQUxVRTsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQpAQCAtMjQ0LDEwICsyNDMsNyBAQAogCiAJCWluZGV4ID0gb3BlcmFuZFs1XS0+aW50ZWdlci52YWx1ZTsKIAkJaWYgKGluZGV4ID49IG9wZXJhbmRbMF0tPnBhY2thZ2UuY291bnQpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgIkluZGV4ICglWCU4LjhYKSBiZXlvbmQgcGFja2FnZSBlbmQgKCVYKVxuIiwKLQkJCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoaW5kZXgpLAotCQkJCQkgIG9wZXJhbmRbMF0tPnBhY2thZ2UuY291bnQpKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiSW5kZXggKCVYJTguOFgpIGJleW9uZCBwYWNrYWdlIGVuZCAoJVgpXG4iLCBBQ1BJX0ZPUk1BVF9VSU5UNjQoaW5kZXgpLCBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50KSk7CiAJCQlzdGF0dXMgPSBBRV9BTUxfUEFDS0FHRV9MSU1JVDsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQpAQCAtMzE2LDcgKzMxMiw4IEBACiAKIAlkZWZhdWx0OgogCi0JCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9leF9vcGNvZGVfNkFfMFRfMVI6IFVua25vd24gb3Bjb2RlICVYXG4iLCB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJVbmtub3duIEFNTCBvcGNvZGUgJVhcbiIsCisJCQkJICAgd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOwogCQlnb3RvIGNsZWFudXA7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cHJlcC5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cHJlcC5jCmluZGV4IDc0NzZjMzYuLjNiZGU3ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHByZXAuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhwcmVwLmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0yNzQsOSArMjc0LDggQEAKIAlkZWZhdWx0OgogCQkvKiBJbnZhbGlkIGZpZWxkIGFjY2VzcyB0eXBlICovCiAKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJVbmtub3duIGZpZWxkIGFjY2VzcyB0eXBlICVYXG4iLCBhY2Nlc3MpKTsKLQkJcmV0dXJuX1ZBTFVFKDApOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVua25vd24gZmllbGQgYWNjZXNzIHR5cGUgJVhcbiIsIGFjY2VzcykpOworCQlyZXR1cm5fVUlOVDMyKDApOwogCX0KIAogCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCkgewpAQCAtMjg5LDcgKzI4OCw3IEBACiAJfQogCiAJKnJldHVybl9ieXRlX2FsaWdubWVudCA9IGJ5dGVfYWxpZ25tZW50OwotCXJldHVybl9WQUxVRShiaXRfbGVuZ3RoKTsKKwlyZXR1cm5fVUlOVDMyKGJpdF9sZW5ndGgpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDIyLDE1ICs0MjEsMTMgQEAKIAogCWlmIChpbmZvLT5maWVsZF90eXBlICE9IEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRCkgewogCQlpZiAoIWluZm8tPnJlZ2lvbl9ub2RlKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiTnVsbCByZWdpb25fbm9kZVxuIikpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJOdWxsIHJlZ2lvbl9ub2RlXG4iKSk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX09QRVJBTkQpOwogCQl9CiAKIAkJdHlwZSA9IGFjcGlfbnNfZ2V0X3R5cGUoaW5mby0+cmVnaW9uX25vZGUpOwogCQlpZiAodHlwZSAhPSBBQ1BJX1RZUEVfUkVHSU9OKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJOZWVkZWQgUmVnaW9uLCBmb3VuZCB0eXBlICVYICglcylcbiIsCi0JCQkJCSAgdHlwZSwgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHR5cGUpKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk5lZWRlZCBSZWdpb24sIGZvdW5kIHR5cGUgJVggKCVzKVxuIiwgdHlwZSwgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHR5cGUpKSk7CiAKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVnaW9uLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZWdpb24uYwppbmRleCA5YTJmNWJlLi44Mjk4MzU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZWdpb24uYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZWdpb24uYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTc3LDcgKzc3LDcgQEAKIAlzdHJ1Y3QgYWNwaV9tZW1fc3BhY2VfY29udGV4dCAqbWVtX2luZm8gPSByZWdpb25fY29udGV4dDsKIAl1MzIgbGVuZ3RoOwogCWFjcGlfc2l6ZSB3aW5kb3dfc2l6ZTsKLSNpZm5kZWYgQUNQSV9NSVNBTElHTkVEX1RSQU5TRkVSUworI2lmZGVmIEFDUElfTUlTQUxJR05NRU5UX05PVF9TVVBQT1JURUQKIAl1MzIgcmVtYWluZGVyOwogI2VuZGlmCiAKQEAgLTEwMywxMyArMTAzLDEyIEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJJbnZhbGlkIHN5c3RlbV9tZW1vcnkgd2lkdGggJWRcbiIsCi0JCQkJICBiaXRfd2lkdGgpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJJbnZhbGlkIHN5c3RlbV9tZW1vcnkgd2lkdGggJWRcbiIsCisJCQkJICAgYml0X3dpZHRoKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9WQUxVRSk7CiAJfQogCi0jaWZuZGVmIEFDUElfTUlTQUxJR05FRF9UUkFOU0ZFUlMKKyNpZmRlZiBBQ1BJX01JU0FMSUdOTUVOVF9OT1RfU1VQUE9SVEVECiAJLyoKIAkgKiBIYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IG5vbi1hbGlnbmVkIGRhdGEgdHJhbnNmZXJzLCB3ZSBtdXN0IHZlcmlmeQogCSAqIHRoZSByZXF1ZXN0LgpAQCAtMTU5LDEwICsxNTgsNyBAQAogCQkJCQkgICAgKHZvaWQgKiopJm1lbV9pbmZvLT4KIAkJCQkJICAgIG1hcHBlZF9sb2dpY2FsX2FkZHJlc3MpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYJTguOFgsIHNpemUgJVhcbiIsCi0JCQkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3MpLAotCQkJCQkgICh1MzIpIHdpbmRvd19zaXplKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYJTguOFgsIHNpemUgJVhcbiIsIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzKSwgKHUzMikgd2luZG93X3NpemUpKTsKIAkJCW1lbV9pbmZvLT5tYXBwZWRfbGVuZ3RoID0gMDsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CkBAIC0xOTksMjAgKzE5NSwyMCBAQAogCQkqdmFsdWUgPSAwOwogCQlzd2l0Y2ggKGJpdF93aWR0aCkgewogCQljYXNlIDg6Ci0JCQkqdmFsdWUgPSAoYWNwaV9pbnRlZ2VyKSAqICgodTggKikgbG9naWNhbF9hZGRyX3B0cik7CisJCQkqdmFsdWUgPSAoYWNwaV9pbnRlZ2VyKSBBQ1BJX0dFVDgobG9naWNhbF9hZGRyX3B0cik7CiAJCQlicmVhazsKIAogCQljYXNlIDE2OgotCQkJKnZhbHVlID0gKGFjcGlfaW50ZWdlcikgKiAoKHUxNiAqKSBsb2dpY2FsX2FkZHJfcHRyKTsKKwkJCSp2YWx1ZSA9IChhY3BpX2ludGVnZXIpIEFDUElfR0VUMTYobG9naWNhbF9hZGRyX3B0cik7CiAJCQlicmVhazsKIAogCQljYXNlIDMyOgotCQkJKnZhbHVlID0gKGFjcGlfaW50ZWdlcikgKiAoKHUzMiAqKSBsb2dpY2FsX2FkZHJfcHRyKTsKKwkJCSp2YWx1ZSA9IChhY3BpX2ludGVnZXIpIEFDUElfR0VUMzIobG9naWNhbF9hZGRyX3B0cik7CiAJCQlicmVhazsKIAogI2lmIEFDUElfTUFDSElORV9XSURUSCAhPSAxNgogCQljYXNlIDY0OgotCQkJKnZhbHVlID0gKGFjcGlfaW50ZWdlcikgKiAoKHU2NCAqKSBsb2dpY2FsX2FkZHJfcHRyKTsKKwkJCSp2YWx1ZSA9IChhY3BpX2ludGVnZXIpIEFDUElfR0VUNjQobG9naWNhbF9hZGRyX3B0cik7CiAJCQlicmVhazsKICNlbmRpZgogCQlkZWZhdWx0OgpAQCAtMjI1LDIwICsyMjEsMjAgQEAKIAogCQlzd2l0Y2ggKGJpdF93aWR0aCkgewogCQljYXNlIDg6Ci0JCQkqKHU4ICopIGxvZ2ljYWxfYWRkcl9wdHIgPSAodTgpICogdmFsdWU7CisJCQlBQ1BJX1NFVDgobG9naWNhbF9hZGRyX3B0cikgPSAodTgpICogdmFsdWU7CiAJCQlicmVhazsKIAogCQljYXNlIDE2OgotCQkJKih1MTYgKikgbG9naWNhbF9hZGRyX3B0ciA9ICh1MTYpICogdmFsdWU7CisJCQlBQ1BJX1NFVDE2KGxvZ2ljYWxfYWRkcl9wdHIpID0gKHUxNikgKiB2YWx1ZTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgMzI6Ci0JCQkqKHUzMiAqKSBsb2dpY2FsX2FkZHJfcHRyID0gKHUzMikgKiB2YWx1ZTsKKwkJCUFDUElfU0VUMzIobG9naWNhbF9hZGRyX3B0cikgPSAodTMyKSAqIHZhbHVlOwogCQkJYnJlYWs7CiAKICNpZiBBQ1BJX01BQ0hJTkVfV0lEVEggIT0gMTYKIAkJY2FzZSA2NDoKLQkJCSoodTY0ICopIGxvZ2ljYWxfYWRkcl9wdHIgPSAodTY0KSAqIHZhbHVlOworCQkJQUNQSV9TRVQ2NChsb2dpY2FsX2FkZHJfcHRyKSA9ICh1NjQpICogdmFsdWU7CiAJCQlicmVhazsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNudGUuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc250ZS5jCmluZGV4IGZmNWQ4ZjkuLmE1Y2NhN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc250ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc250ZS5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMTIyLDggKzEyMiw3IEBACiAJfQogCiAJaWYgKCFzb3VyY2VfZGVzYykgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIk5vIG9iamVjdCBhdHRhY2hlZCB0byBub2RlICVwXG4iLCBub2RlKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTm8gb2JqZWN0IGF0dGFjaGVkIHRvIG5vZGUgJXBcbiIsIG5vZGUpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19PUEVSQU5EKTsKIAl9CiAKQEAgLTEzNSwxMCArMTM0LDkgQEAKIAljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgogCiAJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgIk9iamVjdCBub3QgYSBQYWNrYWdlLCB0eXBlICVzXG4iLAotCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKLQkJCQkJICAoc291cmNlX2Rlc2MpKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk9iamVjdCBub3QgYSBQYWNrYWdlLCB0eXBlICVzXG4iLAorCQkJCQkgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCSAgIChzb3VyY2VfZGVzYykpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJfQogCkBAIC0xNTQsMTAgKzE1Miw5IEBACiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgogCiAJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX0JVRkZFUikgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAiT2JqZWN0IG5vdCBhIEJ1ZmZlciwgdHlwZSAlc1xuIiwKLQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCi0JCQkJCSAgKHNvdXJjZV9kZXNjKSkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJPYmplY3Qgbm90IGEgQnVmZmVyLCB0eXBlICVzXG4iLAorCQkJCQkgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCSAgIChzb3VyY2VfZGVzYykpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJfQogCkBAIC0xNzMsMTAgKzE3MCw5IEBACiAJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCiAJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX1NUUklORykgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAiT2JqZWN0IG5vdCBhIFN0cmluZywgdHlwZSAlc1xuIiwKLQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCi0JCQkJCSAgKHNvdXJjZV9kZXNjKSkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJPYmplY3Qgbm90IGEgU3RyaW5nLCB0eXBlICVzXG4iLAorCQkJCQkgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCSAgIChzb3VyY2VfZGVzYykpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJfQogCkBAIC0xODksMTAgKzE4NSw5IEBACiAJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAogCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpICE9IEFDUElfVFlQRV9JTlRFR0VSKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJPYmplY3Qgbm90IGEgSW50ZWdlciwgdHlwZSAlc1xuIiwKLQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCi0JCQkJCSAgKHNvdXJjZV9kZXNjKSkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJPYmplY3Qgbm90IGEgSW50ZWdlciwgdHlwZSAlc1xuIiwKKwkJCQkJICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkgICAoc291cmNlX2Rlc2MpKSk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCX0KIApAQCAtMjM2LDkgKzIzMSw4IEBACiAKIAljYXNlIEFDUElfVFlQRV9BTlk6CiAKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJVbnR5cGVkIGVudHJ5ICVwLCBubyBhdHRhY2hlZCBvYmplY3QhXG4iLAotCQkJCSAgbm9kZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVudHlwZWQgZW50cnkgJXAsIG5vIGF0dGFjaGVkIG9iamVjdCFcbiIsCisJCQkJICAgbm9kZSkpOwogCiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsJLyogQ2Fubm90IGJlIEFFX1RZUEUgKi8KIApAQCAtMjU3LDEyICsyNTEsNyBAQAogCQlkZWZhdWx0OgogCQkJLyogTm8gbmFtZWQgcmVmZXJlbmNlcyBhcmUgYWxsb3dlZCBoZXJlICovCiAKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgIlVuc3VwcG9ydGVkIFJlZmVyZW5jZSBvcGNvZGUgJVggKCVzKVxuIiwKLQkJCQkJICBzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSwKLQkJCQkJICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShzb3VyY2VfZGVzYy0+Ci0JCQkJCQkJCSAgcmVmZXJlbmNlLgotCQkJCQkJCQkgIG9wY29kZSkpKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiVW5zdXBwb3J0ZWQgUmVmZXJlbmNlIG9wY29kZSAlWCAoJXMpXG4iLCBzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSwgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKSk7CiAKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJfQpAQCAtMjcyLDkgKzI2MSw4IEBACiAKIAkJLyogRGVmYXVsdCBjYXNlIGlzIGZvciB1bmtub3duIHR5cGVzICovCiAKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJOb2RlICVwIC0gVW5rbm93biBvYmplY3QgdHlwZSAlWFxuIiwKLQkJCQkgIG5vZGUsIGVudHJ5X3R5cGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJOb2RlICVwIC0gVW5rbm93biBvYmplY3QgdHlwZSAlWFxuIiwKKwkJCQkgICBub2RlLCBlbnRyeV90eXBlKSk7CiAKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvbHYuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29sdi5jCmluZGV4IDk3ZWVjYmQuLmFlMmQyZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29sdi5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29sdi5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtODEsNyArODEsNyBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9yZXNvbHZlX3RvX3ZhbHVlIiwgc3RhY2tfcHRyKTsKIAogCWlmICghc3RhY2tfcHRyIHx8ICEqc3RhY2tfcHRyKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnRlcm5hbCAtIG51bGwgcG9pbnRlclxuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkludGVybmFsIC0gbnVsbCBwb2ludGVyXG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9fT1BFUkFORCk7CiAJfQogCkBAIC05Nyw4ICs5Nyw3IEBACiAJCX0KIAogCQlpZiAoISpzdGFja19wdHIpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgIkludGVybmFsIC0gbnVsbCBwb2ludGVyXG4iKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkludGVybmFsIC0gbnVsbCBwb2ludGVyXG4iKSk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX09QRVJBTkQpOwogCQl9CiAJfQpAQCAtMjI4LDkgKzIyNyw3IEBACiAJCQkJCSAqIEEgTlVMTCBvYmplY3QgZGVzY3JpcHRvciBtZWFucyBhbiB1bml0aWFsaXplZCBlbGVtZW50IG9mCiAJCQkJCSAqIHRoZSBwYWNrYWdlLCBjYW4ndCBkZXJlZmVyZW5jZSBpdAogCQkJCQkgKi8KLQkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCQkgICJBdHRlbXB0IHRvIGRlcmVmIGFuIEluZGV4IHRvIE5VTEwgcGtnIGVsZW1lbnQgSWR4PSVwXG4iLAotCQkJCQkJCSAgc3RhY2tfZGVzYykpOworCQkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkF0dGVtcHQgdG8gZGVyZWYgYW4gSW5kZXggdG8gTlVMTCBwa2cgZWxlbWVudCBJZHg9JXBcbiIsIHN0YWNrX2Rlc2MpKTsKIAkJCQkJc3RhdHVzID0gQUVfQU1MX1VOSU5JVElBTElaRURfRUxFTUVOVDsKIAkJCQl9CiAJCQkJYnJlYWs7CkBAIC0yMzksNyArMjM2LDcgQEAKIAogCQkJCS8qIEludmFsaWQgcmVmZXJlbmNlIG9iamVjdCAqLwogCi0JCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJEdXJpbmcgcmVzb2x2ZSwgVW5rbm93biB0YXJnZXRfdHlwZSAlWCBpbiBJbmRleC9SZWZlcmVuY2Ugb2JqICVwXG4iLCBzdGFja19kZXNjLT5yZWZlcmVuY2UudGFyZ2V0X3R5cGUsIHN0YWNrX2Rlc2MpKTsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVua25vd24gdGFyZ2V0X3R5cGUgJVggaW4gSW5kZXgvUmVmZXJlbmNlIG9iaiAlcFxuIiwgc3RhY2tfZGVzYy0+cmVmZXJlbmNlLnRhcmdldF90eXBlLCBzdGFja19kZXNjKSk7CiAJCQkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMjY0LDcgKzI2MSw3IEBACiAKIAkJZGVmYXVsdDoKIAotCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJEdXJpbmcgcmVzb2x2ZSwgVW5rbm93biBSZWZlcmVuY2Ugb3Bjb2RlICVYICglcykgaW4gJXBcbiIsIG9wY29kZSwgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUob3Bjb2RlKSwgc3RhY2tfZGVzYykpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJVbmtub3duIFJlZmVyZW5jZSBvcGNvZGUgJVggKCVzKSBpbiAlcFxuIiwgb3Bjb2RlLCBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvcGNvZGUpLCBzdGFja19kZXNjKSk7CiAJCQlzdGF0dXMgPSBBRV9BTUxfSU5URVJOQUw7CiAJCQlicmVhazsKIAkJfQpAQCAtMzg2LDcgKzM4MywxMCBAQAogCiAJCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG5vZGUpICE9CiAJCQkgICAgQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZTogTm90IGEgTlMgbm9kZSAlcCBbJXNdXG4iLCBub2RlLCBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUobm9kZSkpKTsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk5vdCBhIE5TIG5vZGUgJXAgWyVzXVxuIiwKKwkJCQkJCSAgIG5vZGUsCisJCQkJCQkgICBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUKKwkJCQkJCSAgIChub2RlKSkpOwogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOwogCQkJfQogCkBAIC00NDIsNyArNDQyLDEwIEBACiAKIAkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUobm9kZSkgIT0KIAkJCSAgICBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9leF9yZXNvbHZlX211bHRpcGxlOiBOb3QgYSBOUyBub2RlICVwIFslc11cbiIsIG5vZGUsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZShub2RlKSkpOworCQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiTm90IGEgTlMgbm9kZSAlcCBbJXNdXG4iLAorCQkJCQkJICAgbm9kZSwKKwkJCQkJCSAgIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZQorCQkJCQkJICAgKG5vZGUpKSk7CiAJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CiAJCQl9CiAKQEAgLTUxMSw3ICs1MTQsOCBAQAogCiAJCWRlZmF1bHQ6CiAKLQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9leF9yZXNvbHZlX211bHRpcGxlOiBVbmtub3duIFJlZmVyZW5jZSBzdWJ0eXBlICVYXG4iLCBvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJVbmtub3duIFJlZmVyZW5jZSBzdWJ0eXBlICVYXG4iLAorCQkJCQkgICBvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSkpOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvcC5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb3AuYwppbmRleCBmZjA2NGU3Li44MDRmYWViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29wLmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC03Myw3ICs3Myw3IEBACiBhY3BpX2V4X2NoZWNrX29iamVjdF90eXBlKGFjcGlfb2JqZWN0X3R5cGUgdHlwZV9uZWVkZWQsCiAJCQkgIGFjcGlfb2JqZWN0X3R5cGUgdGhpc190eXBlLCB2b2lkICpvYmplY3QpCiB7Ci0JQUNQSV9GVU5DVElPTl9OQU1FKCJleF9jaGVja19vYmplY3RfdHlwZSIpOworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCWlmICh0eXBlX25lZWRlZCA9PSBBQ1BJX1RZUEVfQU5ZKSB7CiAJCS8qIEFsbCB0eXBlcyBPSywgc28gd2UgZG9uJ3QgcGVyZm9ybSBhbnkgdHlwZWNoZWNrcyAqLwpAQCAtOTUsMTAgKzk1LDkgQEAKIAl9CiAKIAlpZiAodHlwZV9uZWVkZWQgIT0gdGhpc190eXBlKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiTmVlZGVkIFslc10sIGZvdW5kIFslc10gJXBcbiIsCi0JCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZV9uZWVkZWQpLAotCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHRoaXNfdHlwZSksIG9iamVjdCkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk5lZWRlZCB0eXBlIFslc10sIGZvdW5kIFslc10gJXBcbiIsCisJCQkJICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHR5cGVfbmVlZGVkKSwKKwkJCQkgICBhY3BpX3V0X2dldF90eXBlX25hbWUodGhpc190eXBlKSwgb2JqZWN0KSk7CiAKIAkJcmV0dXJuIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAl9CkBAIC0xNTEsMTMgKzE1MCwxMyBAQAogCiAJYXJnX3R5cGVzID0gb3BfaW5mby0+cnVudGltZV9hcmdzOwogCWlmIChhcmdfdHlwZXMgPT0gQVJHSV9JTlZBTElEX09QQ09ERSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUigoInJlc29sdmVfb3BlcmFuZHM6ICVYIGlzIG5vdCBhIHZhbGlkIEFNTCBvcGNvZGVcbiIsIG9wY29kZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVua25vd24gQU1MIG9wY29kZSAlWFxuIiwgb3Bjb2RlKSk7CiAKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CiAJfQogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJICAiT3Bjb2RlICVYIFslc10gcmVxdWlyZWRfb3BlcmFuZF90eXBlcz0lOC44WCBcbiIsCisJCQkgICJPcGNvZGUgJVggWyVzXSByZXF1aXJlZF9vcGVyYW5kX3R5cGVzPSU4LjhYXG4iLAogCQkJICBvcGNvZGUsIG9wX2luZm8tPm5hbWUsIGFyZ190eXBlcykpOwogCiAJLyoKQEAgLTE2OSw3ICsxNjgsOCBAQAogCSAqLwogCXdoaWxlIChHRVRfQ1VSUkVOVF9BUkdfVFlQRShhcmdfdHlwZXMpKSB7CiAJCWlmICghc3RhY2tfcHRyIHx8ICEqc3RhY2tfcHRyKSB7Ci0JCQlBQ1BJX1JFUE9SVF9FUlJPUigoInJlc29sdmVfb3BlcmFuZHM6IE51bGwgc3RhY2sgZW50cnkgYXQgJXBcbiIsIHN0YWNrX3B0cikpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJOdWxsIHN0YWNrIGVudHJ5IGF0ICVwXG4iLAorCQkJCQkgICBzdGFja19wdHIpKTsKIAogCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CiAJCX0KQEAgLTE5OCw5ICsxOTgsNyBAQAogCQkJLyogQ2hlY2sgZm9yIGJhZCBhY3BpX29iamVjdF90eXBlICovCiAKIAkJCWlmICghYWNwaV91dF92YWxpZF9vYmplY3RfdHlwZShvYmplY3RfdHlwZSkpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJICAiQmFkIG9wZXJhbmQgb2JqZWN0IHR5cGUgWyVYXVxuIiwKLQkJCQkJCSAgb2JqZWN0X3R5cGUpKTsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkJhZCBvcGVyYW5kIG9iamVjdCB0eXBlIFslWF1cbiIsIG9iamVjdF90eXBlKSk7CiAKIAkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CiAJCQl9CkBAIC0yMzgsMTMgKzIzNiw3IEBACiAJCQkJCWJyZWFrOwogCiAJCQkJZGVmYXVsdDoKLQkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCQkgICJPcGVyYW5kIGlzIGEgUmVmZXJlbmNlLCBVbmtub3duIFJlZmVyZW5jZSBPcGNvZGUgJVggWyVzXVxuIiwKLQkJCQkJCQkgIG9ial9kZXNjLT5yZWZlcmVuY2UuCi0JCQkJCQkJICBvcGNvZGUsCi0JCQkJCQkJICAoYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8KLQkJCQkJCQkgICAob2JqX2Rlc2MtPnJlZmVyZW5jZS4KLQkJCQkJCQkgICAgb3Bjb2RlKSktPm5hbWUpKTsKKwkJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJPcGVyYW5kIGlzIGEgUmVmZXJlbmNlLCBVbmtub3duIFJlZmVyZW5jZSBPcGNvZGU6ICVYXG4iLCBvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSkpOwogCiAJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJCQl9CkBAIC0yNTUsMTEgKzI0NywxMCBAQAogCiAJCQkvKiBJbnZhbGlkIGRlc2NyaXB0b3IgKi8KIAotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAiSW52YWxpZCBkZXNjcmlwdG9yICVwIFslc11cbiIsCi0JCQkJCSAgb2JqX2Rlc2MsCi0JCQkJCSAgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lCi0JCQkJCSAgKG9ial9kZXNjKSkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJJbnZhbGlkIGRlc2NyaXB0b3IgJXAgWyVzXVxuIiwKKwkJCQkJICAgb2JqX2Rlc2MsCisJCQkJCSAgIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZQorCQkJCQkgICAob2JqX2Rlc2MpKSk7CiAKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJfQpAQCAtNDE3LDExICs0MDgsNyBAQAogCQkJICAgIGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyKG9ial9kZXNjLCBzdGFja19wdHIsIDE2KTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCWlmIChzdGF0dXMgPT0gQUVfVFlQRSkgewotCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJCSAgIk5lZWRlZCBbSW50ZWdlci9TdHJpbmcvQnVmZmVyXSwgZm91bmQgWyVzXSAlcFxuIiwKLQkJCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKLQkJCQkJCQkgIChvYmpfZGVzYyksCi0JCQkJCQkJICBvYmpfZGVzYykpOworCQkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk5lZWRlZCBbSW50ZWdlci9TdHJpbmcvQnVmZmVyXSwgZm91bmQgWyVzXSAlcFxuIiwgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShvYmpfZGVzYyksIG9ial9kZXNjKSk7CiAKIAkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQkJCX0KQEAgLTQ0NCwxMSArNDMxLDcgQEAKIAkJCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19idWZmZXIob2JqX2Rlc2MsIHN0YWNrX3B0cik7CiAJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQlpZiAoc3RhdHVzID09IEFFX1RZUEUpIHsKLQkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCQkgICJOZWVkZWQgW0ludGVnZXIvU3RyaW5nL0J1ZmZlcl0sIGZvdW5kIFslc10gJXBcbiIsCi0JCQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCi0JCQkJCQkJICAob2JqX2Rlc2MpLAotCQkJCQkJCSAgb2JqX2Rlc2MpKTsKKwkJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJOZWVkZWQgW0ludGVnZXIvU3RyaW5nL0J1ZmZlcl0sIGZvdW5kIFslc10gJXBcbiIsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUob2JqX2Rlc2MpLCBvYmpfZGVzYykpOwogCiAJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJCQl9CkBAIC00NzIsMTEgKzQ1NSw3IEBACiAJCQkJCQkJICAgQUNQSV9JTVBMSUNJVF9DT05WRVJUX0hFWCk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQlpZiAoc3RhdHVzID09IEFFX1RZUEUpIHsKLQkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCQkgICJOZWVkZWQgW0ludGVnZXIvU3RyaW5nL0J1ZmZlcl0sIGZvdW5kIFslc10gJXBcbiIsCi0JCQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCi0JCQkJCQkJICAob2JqX2Rlc2MpLAotCQkJCQkJCSAgb2JqX2Rlc2MpKTsKKwkJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJOZWVkZWQgW0ludGVnZXIvU3RyaW5nL0J1ZmZlcl0sIGZvdW5kIFslc10gJXBcbiIsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUob2JqX2Rlc2MpLCBvYmpfZGVzYykpOwogCiAJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJCQl9CkBAIC01MDIsMTAgKzQ4MSw3IEBACiAJCQkJYnJlYWs7CiAKIAkJCWRlZmF1bHQ6Ci0JCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCSAgIk5lZWRlZCBbSW50ZWdlci9TdHJpbmcvQnVmZmVyXSwgZm91bmQgWyVzXSAlcFxuIiwKLQkJCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQotCQkJCQkJICAob2JqX2Rlc2MpLCBvYmpfZGVzYykpOworCQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiTmVlZGVkIFtJbnRlZ2VyL1N0cmluZy9CdWZmZXJdLCBmb3VuZCBbJXNdICVwXG4iLCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKIAogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJCX0KQEAgLTUzOSwxMCArNTE1LDcgQEAKIAkJCQlicmVhazsKIAogCQkJZGVmYXVsdDoKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJICAiTmVlZGVkIFtJbnRlZ2VyL1N0cmluZy9CdWZmZXJdLCBmb3VuZCBbJXNdICVwXG4iLAotCQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCi0JCQkJCQkgIChvYmpfZGVzYyksIG9ial9kZXNjKSk7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJOZWVkZWQgW0ludGVnZXIvU3RyaW5nL0J1ZmZlcl0sIGZvdW5kIFslc10gJXBcbiIsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUob2JqX2Rlc2MpLCBvYmpfZGVzYykpOwogCiAJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQkJfQpAQCAtNTY2LDEwICs1MzksNyBAQAogCQkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgotCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCQkgICJOZWVkZWQgW0J1ZmZlci9TdHJpbmcvUGFja2FnZS9SZWZlcmVuY2VdLCBmb3VuZCBbJXNdICVwXG4iLAotCQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCi0JCQkJCQkgIChvYmpfZGVzYyksIG9ial9kZXNjKSk7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJOZWVkZWQgW0J1ZmZlci9TdHJpbmcvUGFja2FnZS9SZWZlcmVuY2VdLCBmb3VuZCBbJXNdICVwXG4iLCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKIAogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJCX0KQEAgLTU4OCwxMCArNTU4LDcgQEAKIAkJCQlicmVhazsKIAogCQkJZGVmYXVsdDoKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJICAiTmVlZGVkIFtCdWZmZXIvU3RyaW5nL1BhY2thZ2VdLCBmb3VuZCBbJXNdICVwXG4iLAotCQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCi0JCQkJCQkgIChvYmpfZGVzYyksIG9ial9kZXNjKSk7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJOZWVkZWQgW0J1ZmZlci9TdHJpbmcvUGFja2FnZV0sIGZvdW5kIFslc10gJXBcbiIsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUob2JqX2Rlc2MpLCBvYmpfZGVzYykpOwogCiAJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQkJfQpAQCAtNjExLDEwICs1NzgsNyBAQAogCQkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgotCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCQkgICJOZWVkZWQgW1JlZ2lvbi9yZWdpb25fZmllbGRdLCBmb3VuZCBbJXNdICVwXG4iLAotCQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCi0JCQkJCQkgIChvYmpfZGVzYyksIG9ial9kZXNjKSk7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJOZWVkZWQgW1JlZ2lvbi9yZWdpb25fZmllbGRdLCBmb3VuZCBbJXNdICVwXG4iLCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKIAogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJCX0KQEAgLTY1NiwxMCArNjIwLDcgQEAKIAkJCQkJYnJlYWs7CiAJCQkJfQogCi0JCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCSAgIk5lZWRlZCBJbnRlZ2VyL0J1ZmZlci9TdHJpbmcvUGFja2FnZS9SZWYvRGRiXSwgZm91bmQgWyVzXSAlcFxuIiwKLQkJCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQotCQkJCQkJICAob2JqX2Rlc2MpLCBvYmpfZGVzYykpOworCQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiTmVlZGVkIEludGVnZXIvQnVmZmVyL1N0cmluZy9QYWNrYWdlL1JlZi9EZGJdLCBmb3VuZCBbJXNdICVwXG4iLCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKIAogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJCX0KQEAgLTY2OSw5ICs2MzAsNyBAQAogCiAJCQkvKiBVbmtub3duIHR5cGUgKi8KIAotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAiSW50ZXJuYWwgLSBVbmtub3duIEFSR0kgKHJlcXVpcmVkIG9wZXJhbmQpIHR5cGUgJVhcbiIsCi0JCQkJCSAgdGhpc19hcmdfdHlwZSkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJJbnRlcm5hbCAtIFVua25vd24gQVJHSSAocmVxdWlyZWQgb3BlcmFuZCkgdHlwZSAlWFxuIiwgdGhpc19hcmdfdHlwZSkpOwogCiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JlLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZS5jCmluZGV4IGE3ZDhlZWEuLjIwMmViZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JlLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmUuYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTI1MCw3ICsyNTAsNyBAQAogCS8qIFZhbGlkYXRlIHBhcmFtZXRlcnMgKi8KIAogCWlmICghc291cmNlX2Rlc2MgfHwgIWRlc3RfZGVzYykgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiTnVsbCBwYXJhbWV0ZXJcbiIpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJOdWxsIHBhcmFtZXRlclxuIikpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX09QRVJBTkQpOwogCX0KIApAQCAtMjkwLDEwICsyOTAsNyBAQAogCiAJCS8qIERlc3RpbmF0aW9uIGlzIG5vdCBhIFJlZmVyZW5jZSBvYmplY3QgKi8KIAotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIlRhcmdldCBpcyBub3QgYSBSZWZlcmVuY2Ugb3IgQ29uc3RhbnQgb2JqZWN0IC0gJXMgWyVwXVxuIiwKLQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoZGVzdF9kZXNjKSwKLQkJCQkgIGRlc3RfZGVzYykpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlRhcmdldCBpcyBub3QgYSBSZWZlcmVuY2Ugb3IgQ29uc3RhbnQgb2JqZWN0IC0gJXMgWyVwXVxuIiwgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShkZXN0X2Rlc2MpLCBkZXN0X2Rlc2MpKTsKIAogCQlBQ1BJX0RVTVBfU1RBQ0tfRU5UUlkoc291cmNlX2Rlc2MpOwogCQlBQ1BJX0RVTVBfU1RBQ0tfRU5UUlkoZGVzdF9kZXNjKTsKQEAgLTM2MCw3ICszNTcsNyBAQAogCiAJZGVmYXVsdDoKIAotCQlBQ1BJX1JFUE9SVF9FUlJPUigoImV4X3N0b3JlOiBVbmtub3duIFJlZmVyZW5jZSBvcGNvZGUgJVhcbiIsCisJCUFDUElfUkVQT1JUX0VSUk9SKCgiVW5rbm93biBSZWZlcmVuY2Ugb3Bjb2RlICVYXG4iLAogCQkJCSAgIHJlZl9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSk7CiAJCUFDUElfRFVNUF9FTlRSWShyZWZfZGVzYywgQUNQSV9MVl9FUlJPUik7CiAKQEAgLTQ5MCwxMCArNDg3LDcgQEAKIAogCQkJLyogQWxsIG90aGVyIHR5cGVzIGFyZSBpbnZhbGlkICovCiAKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgIlNvdXJjZSBtdXN0IGJlIEludGVnZXIvQnVmZmVyL1N0cmluZyB0eXBlLCBub3QgJXNcbiIsCi0JCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQotCQkJCQkgIChzb3VyY2VfZGVzYykpKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiU291cmNlIG11c3QgYmUgSW50ZWdlci9CdWZmZXIvU3RyaW5nIHR5cGUsIG5vdCAlc1xuIiwgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShzb3VyY2VfZGVzYykpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJfQogCkBAIC01MDMsOCArNDk3LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIlRhcmdldCBpcyBub3QgYSBQYWNrYWdlIG9yIGJ1ZmZlcl9maWVsZFxuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlRhcmdldCBpcyBub3QgYSBQYWNrYWdlIG9yIGJ1ZmZlcl9maWVsZFxuIikpOwogCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZW4uYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3Jlbi5jCmluZGV4IDM4MmY2M2MuLjI1YmJjMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3Jlbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3Jlbi5jCkBAIC03LDcgKzcsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMTIzLDExICsxMjMsNyBAQAogCQkgICAgICAmJiAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUgPT0gQU1MX0xPQURfT1ApKSkgewogCQkJLyogQ29udmVyc2lvbiBzdWNjZXNzZnVsIGJ1dCBzdGlsbCBub3QgYSB2YWxpZCB0eXBlICovCiAKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgIkNhbm5vdCBhc3NpZ24gdHlwZSAlcyB0byAlcyAobXVzdCBiZSB0eXBlIEludC9TdHIvQnVmKVxuIiwKLQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCi0JCQkJCSAgKHNvdXJjZV9kZXNjKSwKLQkJCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUodGFyZ2V0X3R5cGUpKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNhbm5vdCBhc3NpZ24gdHlwZSAlcyB0byAlcyAobXVzdCBiZSB0eXBlIEludC9TdHIvQnVmKVxuIiwgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShzb3VyY2VfZGVzYyksIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0YXJnZXRfdHlwZSkpKTsKIAkJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CiAJCX0KIAkJYnJlYWs7CkBAIC0yODAsOSArMjc2LDggQEAKIAkJLyoKIAkJICogQWxsIG90aGVyIHR5cGVzIGNvbWUgaGVyZS4KIAkJICovCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKLQkJCQkgICJTdG9yZSBpbnRvIHR5cGUgJXMgbm90IGltcGxlbWVudGVkXG4iLAotCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShkZXN0X2Rlc2MpKSk7CisJCUFDUElfUkVQT1JUX1dBUk5JTkcoKCJTdG9yZSBpbnRvIHR5cGUgJXMgbm90IGltcGxlbWVudGVkXG4iLAorCQkJCSAgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShkZXN0X2Rlc2MpKSk7CiAKIAkJc3RhdHVzID0gQUVfTk9UX0lNUExFTUVOVEVEOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JvYi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3Rvcm9iLmMKaW5kZXggYzRmZjY1NC4uNmFiNzA3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3Rvcm9iLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3Rvcm9iLmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC03MSw3ICs3MSw3IEBACiAKIAkvKiBXZSBrbm93IHRoYXQgc291cmNlX2Rlc2MgaXMgYSBidWZmZXIgYnkgbm93ICovCiAKLQlidWZmZXIgPSAodTggKikgc291cmNlX2Rlc2MtPmJ1ZmZlci5wb2ludGVyOworCWJ1ZmZlciA9IEFDUElfQ0FTVF9QVFIodTgsIHNvdXJjZV9kZXNjLT5idWZmZXIucG9pbnRlcik7CiAJbGVuZ3RoID0gc291cmNlX2Rlc2MtPmJ1ZmZlci5sZW5ndGg7CiAKIAkvKgpAQCAtMTYwLDcgKzE2MCw3IEBACiAKIAkvKiBXZSBrbm93IHRoYXQgc291cmNlX2Rlc2MgaXMgYSBzdHJpbmcgYnkgbm93ICovCiAKLQlidWZmZXIgPSAodTggKikgc291cmNlX2Rlc2MtPnN0cmluZy5wb2ludGVyOworCWJ1ZmZlciA9IEFDUElfQ0FTVF9QVFIodTgsIHNvdXJjZV9kZXNjLT5zdHJpbmcucG9pbnRlcik7CiAJbGVuZ3RoID0gc291cmNlX2Rlc2MtPnN0cmluZy5sZW5ndGg7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3lzdGVtLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzeXN0ZW0uYwppbmRleCA4YTg4Yjg0Li45YTM2ODRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzeXN0ZW0uYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzeXN0ZW0uYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTEyOSw3ICsxMjksNyBAQAogCQkgKiAoQUNQSSBzcGVjaWZpZXMgMTAwIHVzZWMgYXMgbWF4LCBidXQgdGhpcyBnaXZlcyBzb21lIHNsYWNrIGluCiAJCSAqIG9yZGVyIHRvIHN1cHBvcnQgZXhpc3RpbmcgQklPU3MpCiAJCSAqLwotCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlN0YWxsOiBUaW1lIHBhcmFtZXRlciBpcyB0b28gbGFyZ2UgKCVkKVxuIiwKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJUaW1lIHBhcmFtZXRlciBpcyB0b28gbGFyZ2UgKCVkKVxuIiwKIAkJCQkgICBob3dfbG9uZykpOwogCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9WQUxVRTsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4dXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHV0aWxzLmMKaW5kZXggMWVlNzlkOC4uOTkwYzQwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4dXRpbHMuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXh1dGlscy5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMjAwLDEzICsyMDAsMTEgQEAKIAkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCQlsb2NrZWQgPSBUUlVFOwogCQl9IGVsc2UgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAiQ291bGQgbm90IGFjcXVpcmUgR2xvYmFsIExvY2ssICVzXG4iLAotCQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBhY3F1aXJlIEdsb2JhbCBMb2NrLCAlc1xuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAkJfQogCX0KIAotCXJldHVybl9WQUxVRShsb2NrZWQpOworCXJldHVybl9VSU5UOChsb2NrZWQpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjY4LDcgKzI2Niw3IEBACiAJLyogYWNwaV9pbnRlZ2VyIGlzIHVuc2lnbmVkLCBzbyB3ZSBkb24ndCB3b3JyeSBhYm91dCBhICctJyBwcmVmaXggKi8KIAogCWlmICh2YWx1ZSA9PSAwKSB7Ci0JCXJldHVybl9WQUxVRSgxKTsKKwkJcmV0dXJuX1VJTlQzMigxKTsKIAl9CiAKIAljdXJyZW50X3ZhbHVlID0gdmFsdWU7CkBAIC0yODIsNyArMjgwLDcgQEAKIAkJbnVtX2RpZ2l0cysrOwogCX0KIAotCXJldHVybl9WQUxVRShudW1fZGlnaXRzKTsKKwlyZXR1cm5fVUlOVDMyKG51bV9kaWdpdHMpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2dsdWUuYyBiL2RyaXZlcnMvYWNwaS9nbHVlLmMKaW5kZXggYWE5OTM3MS4uOGRhZWY1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2dsdWUuYworKysgYi9kcml2ZXJzL2FjcGkvZ2x1ZS5jCkBAIC05OSwxNSArOTksMTUgQEAKIAl1bnNpZ25lZCBsb25nICpidXNuciA9ICh1bnNpZ25lZCBsb25nICopZGF0YTsKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQgYWRkcmVzczsKIAotCWlmIChyZXNvdXJjZS0+aWQgIT0gQUNQSV9SU1RZUEVfQUREUkVTUzE2ICYmCi0JICAgIHJlc291cmNlLT5pZCAhPSBBQ1BJX1JTVFlQRV9BRERSRVNTMzIgJiYKLQkgICAgcmVzb3VyY2UtPmlkICE9IEFDUElfUlNUWVBFX0FERFJFU1M2NCkKKwlpZiAocmVzb3VyY2UtPnR5cGUgIT0gQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MxNiAmJgorCSAgICByZXNvdXJjZS0+dHlwZSAhPSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzMyICYmCisJICAgIHJlc291cmNlLT50eXBlICE9IEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTNjQpCiAJCXJldHVybiBBRV9PSzsKIAogCWFjcGlfcmVzb3VyY2VfdG9fYWRkcmVzczY0KHJlc291cmNlLCAmYWRkcmVzcyk7CiAJaWYgKChhZGRyZXNzLmFkZHJlc3NfbGVuZ3RoID4gMCkgJiYKIAkgICAgKGFkZHJlc3MucmVzb3VyY2VfdHlwZSA9PSBBQ1BJX0JVU19OVU1CRVJfUkFOR0UpKQotCQkqYnVzbnIgPSBhZGRyZXNzLm1pbl9hZGRyZXNzX3JhbmdlOworCQkqYnVzbnIgPSBhZGRyZXNzLm1pbmltdW07CiAKIAlyZXR1cm4gQUVfT0s7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdhY3BpLmMgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdhY3BpLmMKaW5kZXggMWJiMzQ2My4uNWMwNjhjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3YWNwaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2FjcGkuYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTY4LDggKzY4LDcgQEAKIAkvKiBXZSBtdXN0IGhhdmUgdGhlIEFDUEkgdGFibGVzIGJ5IHRoZSB0aW1lIHdlIGdldCBoZXJlICovCiAKIAlpZiAoIWFjcGlfZ2JsX0ZBRFQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIk5vIEZBRFQgaXMgcHJlc2VudFxuIikpOwotCisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTm8gRkFEVCBpcyBwcmVzZW50XG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19BQ1BJX1RBQkxFUyk7CiAJfQogCkBAIC0xMDgsNyArMTA3LDcgQEAKIAkgKiBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBtb2RlIHRyYW5zaXRpb24uCiAJICovCiAJaWYgKCFhY3BpX2dibF9GQURULT5zbWlfY21kKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SKCgiTm8gU01JX0NNRCBpbiBGQURULCBtb2RlIHRyYW5zaXRpb24gZmFpbGVkLlxuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIk5vIFNNSV9DTUQgaW4gRkFEVCwgbW9kZSB0cmFuc2l0aW9uIGZhaWxlZFxuIikpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fSEFSRFdBUkVfUkVTUE9OU0UpOwogCX0KIApAQCAtMjA0LDE4ICsyMDMsMTggQEAKIAkgKiBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBtb2RlIHRyYW5zaXRpb24uCiAJICovCiAJaWYgKCFhY3BpX2dibF9GQURULT5zbWlfY21kKSB7Ci0JCXJldHVybl9WQUxVRShBQ1BJX1NZU19NT0RFX0FDUEkpOworCQlyZXR1cm5fVUlOVDMyKEFDUElfU1lTX01PREVfQUNQSSk7CiAJfQogCiAJc3RhdHVzID0KIAkgICAgYWNwaV9nZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfU0NJX0VOQUJMRSwgJnZhbHVlLCBBQ1BJX01UWF9MT0NLKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX1ZBTFVFKEFDUElfU1lTX01PREVfTEVHQUNZKTsKKwkJcmV0dXJuX1VJTlQzMihBQ1BJX1NZU19NT0RFX0xFR0FDWSk7CiAJfQogCiAJaWYgKHZhbHVlKSB7Ci0JCXJldHVybl9WQUxVRShBQ1BJX1NZU19NT0RFX0FDUEkpOworCQlyZXR1cm5fVUlOVDMyKEFDUElfU1lTX01PREVfQUNQSSk7CiAJfSBlbHNlIHsKLQkJcmV0dXJuX1ZBTFVFKEFDUElfU1lTX01PREVfTEVHQUNZKTsKKwkJcmV0dXJuX1VJTlQzMihBQ1BJX1NZU19NT0RFX0xFR0FDWSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3Z3BlLmMgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdncGUuYwppbmRleCA1YzhlNWRmLi5kODQ5NDJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdncGUuYworKysgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdncGUuYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3JlZ3MuYyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3JlZ3MuYwppbmRleCA1MzZhN2FlLi5iNGI1MGEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdyZWdzLmMKKysrIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3cmVncy5jCkBAIC03LDcgKzcsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTE0NCw3ICsxNDQsOCBAQAogCiAJaW5mby5wYXJhbWV0ZXJzID0gTlVMTDsKIAlpbmZvLnJldHVybl9vYmplY3QgPSBOVUxMOwotCXNsZWVwX3N0YXRlX25hbWUgPSAoY2hhciAqKWFjcGlfZ2JsX3NsZWVwX3N0YXRlX25hbWVzW3NsZWVwX3N0YXRlXTsKKwlzbGVlcF9zdGF0ZV9uYW1lID0KKwkgICAgQUNQSV9DQVNUX1BUUihjaGFyLCBhY3BpX2dibF9zbGVlcF9zdGF0ZV9uYW1lc1tzbGVlcF9zdGF0ZV0pOwogCiAJc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9ieV9uYW1lKHNsZWVwX3N0YXRlX25hbWUsICZpbmZvKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKQEAgLTIwMSwxMiArMjAyLDcgQEAKIAl9CiAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICIlcyBXaGlsZSBldmFsdWF0aW5nIHNsZWVwX3N0YXRlIFslc10sIGJhZCBTbGVlcCBvYmplY3QgJXAgdHlwZSAlc1xuIiwKLQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLAotCQkJCSAgc2xlZXBfc3RhdGVfbmFtZSwgaW5mby5yZXR1cm5fb2JqZWN0LAotCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShpbmZvLgotCQkJCQkJCSAgICAgICByZXR1cm5fb2JqZWN0KSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIiVzIFdoaWxlIGV2YWx1YXRpbmcgc2xlZXBfc3RhdGUgWyVzXSwgYmFkIFNsZWVwIG9iamVjdCAlcCB0eXBlICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSwgc2xlZXBfc3RhdGVfbmFtZSwgaW5mby5yZXR1cm5fb2JqZWN0LCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKGluZm8ucmV0dXJuX29iamVjdCkpKTsKIAl9CiAKIAlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoaW5mby5yZXR1cm5fb2JqZWN0KTsKQEAgLTIyOSwxMiArMjI1LDExIEBACiAKIHN0cnVjdCBhY3BpX2JpdF9yZWdpc3Rlcl9pbmZvICphY3BpX2h3X2dldF9iaXRfcmVnaXN0ZXJfaW5mbyh1MzIgcmVnaXN0ZXJfaWQpCiB7Ci0JQUNQSV9GVU5DVElPTl9OQU1FKCJod19nZXRfYml0X3JlZ2lzdGVyX2luZm8iKTsKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAlpZiAocmVnaXN0ZXJfaWQgPiBBQ1BJX0JJVFJFR19NQVgpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJJbnZhbGlkIGJpdF9yZWdpc3RlciBJRDogJVhcbiIsCi0JCQkJICByZWdpc3Rlcl9pZCkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkludmFsaWQgYml0X3JlZ2lzdGVyIElEOiAlWFxuIiwKKwkJCQkgICByZWdpc3Rlcl9pZCkpOwogCQlyZXR1cm4gKE5VTEwpOwogCX0KIApAQCAtNTY5LDggKzU2NCw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIlVua25vd24gUmVnaXN0ZXIgSUQ6ICVYXG4iLAotCQkJCSAgcmVnaXN0ZXJfaWQpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJVbmtub3duIFJlZ2lzdGVyIElEOiAlWFxuIiwgcmVnaXN0ZXJfaWQpKTsKIAkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAkJYnJlYWs7CiAJfQpAQCAtNzY1LDkgKzc1OSw4IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJVbnN1cHBvcnRlZCBhZGRyZXNzIHNwYWNlOiAlWFxuIiwKLQkJCQkgIHJlZy0+YWRkcmVzc19zcGFjZV9pZCkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVuc3VwcG9ydGVkIGFkZHJlc3Mgc3BhY2U6ICVYXG4iLAorCQkJCSAgIHJlZy0+YWRkcmVzc19zcGFjZV9pZCkpOwogCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIApAQCAtODM2LDkgKzgyOSw4IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJVbnN1cHBvcnRlZCBhZGRyZXNzIHNwYWNlOiAlWFxuIiwKLQkJCQkgIHJlZy0+YWRkcmVzc19zcGFjZV9pZCkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVuc3VwcG9ydGVkIGFkZHJlc3Mgc3BhY2U6ICVYXG4iLAorCQkJCSAgIHJlZy0+YWRkcmVzc19zcGFjZV9pZCkpOwogCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3c2xlZXAuYyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3NsZWVwLmMKaW5kZXggMzQ1MTkwNi4uOTkyMTI4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3c2xlZXAuYworKysgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdzbGVlcC5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3dGltZXIuYyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3RpbWVyLmMKaW5kZXggYWZmNmRjMS4uZmMxMGI3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3dGltZXIuYworKysgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHd0aW1lci5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL21vdGhlcmJvYXJkLmMgYi9kcml2ZXJzL2FjcGkvbW90aGVyYm9hcmQuYwppbmRleCBlOTI4ZThjLi40NjgyNDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbW90aGVyYm9hcmQuYworKysgYi9kcml2ZXJzL2FjcGkvbW90aGVyYm9hcmQuYwpAQCAtNTQsMzYgKzU0LDM2IEBACiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Jlc2VydmVfaW9fcmFuZ2VzIik7CiAKLQlpZiAocmVzLT5pZCA9PSBBQ1BJX1JTVFlQRV9JTykgeworCWlmIChyZXMtPnR5cGUgPT0gQUNQSV9SRVNPVVJDRV9UWVBFX0lPKSB7CiAJCXN0cnVjdCBhY3BpX3Jlc291cmNlX2lvICppb19yZXMgPSAmcmVzLT5kYXRhLmlvOwogCi0JCWlmIChpb19yZXMtPm1pbl9iYXNlX2FkZHJlc3MgIT0gaW9fcmVzLT5tYXhfYmFzZV9hZGRyZXNzKQorCQlpZiAoaW9fcmVzLT5taW5pbXVtICE9IGlvX3Jlcy0+bWF4aW11bSkKIAkJCXJldHVybl9WQUxVRShBRV9PSyk7CiAJCWlmIChJU19SRVNFUlZFRF9BRERSCi0JCSAgICAoaW9fcmVzLT5taW5fYmFzZV9hZGRyZXNzLCBpb19yZXMtPnJhbmdlX2xlbmd0aCkpIHsKKwkJICAgIChpb19yZXMtPm1pbmltdW0sIGlvX3Jlcy0+YWRkcmVzc19sZW5ndGgpKSB7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCiAJCQkJCSAgIk1vdGhlcmJvYXJkIHJlc291cmNlcyAweCUwOHggLSAweCUwOHhcbiIsCi0JCQkJCSAgaW9fcmVzLT5taW5fYmFzZV9hZGRyZXNzLAotCQkJCQkgIGlvX3Jlcy0+bWluX2Jhc2VfYWRkcmVzcyArCi0JCQkJCSAgaW9fcmVzLT5yYW5nZV9sZW5ndGgpKTsKKwkJCQkJICBpb19yZXMtPm1pbmltdW0sCisJCQkJCSAgaW9fcmVzLT5taW5pbXVtICsKKwkJCQkJICBpb19yZXMtPmFkZHJlc3NfbGVuZ3RoKSk7CiAJCQlyZXF1ZXN0ZWRfcmVzID0KLQkJCSAgICByZXF1ZXN0X3JlZ2lvbihpb19yZXMtPm1pbl9iYXNlX2FkZHJlc3MsCi0JCQkJCSAgIGlvX3Jlcy0+cmFuZ2VfbGVuZ3RoLCAibW90aGVyYm9hcmQiKTsKKwkJCSAgICByZXF1ZXN0X3JlZ2lvbihpb19yZXMtPm1pbmltdW0sCisJCQkJCSAgIGlvX3Jlcy0+YWRkcmVzc19sZW5ndGgsICJtb3RoZXJib2FyZCIpOwogCQl9Ci0JfSBlbHNlIGlmIChyZXMtPmlkID09IEFDUElfUlNUWVBFX0ZJWEVEX0lPKSB7CisJfSBlbHNlIGlmIChyZXMtPnR5cGUgPT0gQUNQSV9SRVNPVVJDRV9UWVBFX0ZJWEVEX0lPKSB7CiAJCXN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvICpmaXhlZF9pb19yZXMgPQogCQkgICAgJnJlcy0+ZGF0YS5maXhlZF9pbzsKIAogCQlpZiAoSVNfUkVTRVJWRURfQUREUgotCQkgICAgKGZpeGVkX2lvX3Jlcy0+YmFzZV9hZGRyZXNzLCBmaXhlZF9pb19yZXMtPnJhbmdlX2xlbmd0aCkpIHsKKwkJICAgIChmaXhlZF9pb19yZXMtPmFkZHJlc3MsIGZpeGVkX2lvX3Jlcy0+YWRkcmVzc19sZW5ndGgpKSB7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCiAJCQkJCSAgIk1vdGhlcmJvYXJkIHJlc291cmNlcyAweCUwOHggLSAweCUwOHhcbiIsCi0JCQkJCSAgZml4ZWRfaW9fcmVzLT5iYXNlX2FkZHJlc3MsCi0JCQkJCSAgZml4ZWRfaW9fcmVzLT5iYXNlX2FkZHJlc3MgKwotCQkJCQkgIGZpeGVkX2lvX3Jlcy0+cmFuZ2VfbGVuZ3RoKSk7CisJCQkJCSAgZml4ZWRfaW9fcmVzLT5hZGRyZXNzLAorCQkJCQkgIGZpeGVkX2lvX3Jlcy0+YWRkcmVzcyArCisJCQkJCSAgZml4ZWRfaW9fcmVzLT5hZGRyZXNzX2xlbmd0aCkpOwogCQkJcmVxdWVzdGVkX3JlcyA9Ci0JCQkgICAgcmVxdWVzdF9yZWdpb24oZml4ZWRfaW9fcmVzLT5iYXNlX2FkZHJlc3MsCi0JCQkJCSAgIGZpeGVkX2lvX3Jlcy0+cmFuZ2VfbGVuZ3RoLAorCQkJICAgIHJlcXVlc3RfcmVnaW9uKGZpeGVkX2lvX3Jlcy0+YWRkcmVzcywKKwkJCQkJICAgZml4ZWRfaW9fcmVzLT5hZGRyZXNzX2xlbmd0aCwKIAkJCQkJICAgIm1vdGhlcmJvYXJkIik7CiAJCX0KIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2FjY2Vzcy5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2FjY2Vzcy5jCmluZGV4IGVkZmJlMzQuLmMyZGI5M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhY2Nlc3MuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zYWNjZXNzLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMTEwLDEwICsxMTAsNyBAQAogCQkJCQlBQ1BJX05TX05PX1VQU0VBUkNILCBOVUxMLCAmbmV3X25vZGUpOwogCiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCAoIW5ld19ub2RlKSkgewkvKiBNdXN0IGJlIG9uIHNhbWUgbGluZSBmb3IgY29kZSBjb252ZXJ0ZXIgKi8KLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgIkNvdWxkIG5vdCBjcmVhdGUgcHJlZGVmaW5lZCBuYW1lICVzLCAlc1xuIiwKLQkJCQkJICBpbml0X3ZhbC0+bmFtZSwKLQkJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgY3JlYXRlIHByZWRlZmluZWQgbmFtZSAlcywgJXNcbiIsIGluaXRfdmFsLT5uYW1lLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCQl9CiAKIAkJLyoKQEAgLTEyNCw5ICsxMjEsNyBAQAogCQlpZiAoaW5pdF92YWwtPnZhbCkgewogCQkJc3RhdHVzID0gYWNwaV9vc19wcmVkZWZpbmVkX292ZXJyaWRlKGluaXRfdmFsLCAmdmFsKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCQkgICJDb3VsZCBub3Qgb3ZlcnJpZGUgcHJlZGVmaW5lZCAlc1xuIiwKLQkJCQkJCSAgaW5pdF92YWwtPm5hbWUpKTsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBvdmVycmlkZSBwcmVkZWZpbmVkICVzXG4iLCBpbml0X3ZhbC0+bmFtZSkpOwogCQkJfQogCiAJCQlpZiAoIXZhbCkgewpAQCAtMzM5LDcgKzMzNCwxMCBAQAogCQlwcmVmaXhfbm9kZSA9IHNjb3BlX2luZm8tPnNjb3BlLm5vZGU7CiAJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUocHJlZml4X25vZGUpICE9CiAJCSAgICBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJuc19sb29rdXA6ICVwIGlzIG5vdCBhIG5hbWVzcGFjZSBub2RlIFslc11cbiIsIHByZWZpeF9ub2RlLCBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUocHJlZml4X25vZGUpKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIiVwIGlzIG5vdCBhIG5hbWVzcGFjZSBub2RlIFslc11cbiIsCisJCQkJCSAgIHByZWZpeF9ub2RlLAorCQkJCQkgICBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUKKwkJCQkJICAgKHByZWZpeF9ub2RlKSkpOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CiAJCX0KIApAQCAtNDk4LDcgKzQ5Niw3IEBACiAJCQlwYXRoKys7CiAKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCi0JCQkJCSAgIk11bHRpIFBhdGhuYW1lICglZCBTZWdtZW50cywgRmxhZ3M9JVgpIFxuIiwKKwkJCQkJICAiTXVsdGkgUGF0aG5hbWUgKCVkIFNlZ21lbnRzLCBGbGFncz0lWClcbiIsCiAJCQkJCSAgbnVtX3NlZ21lbnRzLCBmbGFncykpOwogCQkJYnJlYWs7CiAKQEAgLTYwMCw3ICs1OTgsNyBAQAogCQkgICAgKHRoaXNfbm9kZS0+dHlwZSAhPSB0eXBlX3RvX2NoZWNrX2ZvcikpIHsKIAkJCS8qIENvbXBsYWluIGFib3V0IGEgdHlwZSBtaXNtYXRjaCAqLwogCi0JCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgibnNfbG9va3VwOiBUeXBlIG1pc21hdGNoIG9uICU0LjRzICglcyksIHNlYXJjaGluZyBmb3IgKCVzKVxuIiwgKGNoYXIgKikmc2ltcGxlX25hbWUsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0aGlzX25vZGUtPnR5cGUpLCBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZV90b19jaGVja19mb3IpKSk7CisJCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgibnNfbG9va3VwOiBUeXBlIG1pc21hdGNoIG9uICU0LjRzICglcyksIHNlYXJjaGluZyBmb3IgKCVzKVxuIiwgQUNQSV9DQVNUX1BUUihjaGFyLCAmc2ltcGxlX25hbWUpLCBhY3BpX3V0X2dldF90eXBlX25hbWUodGhpc19ub2RlLT50eXBlKSwgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHR5cGVfdG9fY2hlY2tfZm9yKSkpOwogCQl9CiAKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhbGxvYy5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2FsbG9jLmMKaW5kZXggY2M3YTg1Zi4uM2RiOTUwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2FsbG9jLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2FsbG9jLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMjcyLDkgKzI3Miw4IEBACiAJCS8qIEdyYW5kY2hpbGRyZW4gc2hvdWxkIGhhdmUgYWxsIGJlZW4gZGVsZXRlZCBhbHJlYWR5ICovCiAKIAkJaWYgKGNoaWxkX25vZGUtPmNoaWxkKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJGb3VuZCBhIGdyYW5kY2hpbGQhIFA9JXAgQz0lcFxuIiwKLQkJCQkJICBwYXJlbnRfbm9kZSwgY2hpbGRfbm9kZSkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJGb3VuZCBhIGdyYW5kY2hpbGQhIFA9JXAgQz0lcFxuIiwKKwkJCQkJICAgcGFyZW50X25vZGUsIGNoaWxkX25vZGUpKTsKIAkJfQogCiAJCS8qIE5vdyB3ZSBjYW4gZnJlZSB0aGlzIGNoaWxkIG9iamVjdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXAuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wLmMKaW5kZXggOWZhZjFkNS4uMmYwYjcwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXAuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZHVtcC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMTk4LDcgKzE5OCw4IEBACiAJCS8qIENoZWNrIHRoZSBub2RlIHR5cGUgYW5kIG5hbWUgKi8KIAogCQlpZiAodHlwZSA+IEFDUElfVFlQRV9MT0NBTF9NQVgpIHsKLQkJCUFDUElfUkVQT1JUX1dBUk5JTkcoKCJJbnZhbGlkIEFDUEkgVHlwZSAlMDhYXG4iLCB0eXBlKSk7CisJCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgiSW52YWxpZCBBQ1BJIE9iamVjdCBUeXBlICUwOFhcbiIsCisJCQkJCSAgICAgdHlwZSkpOwogCQl9CiAKIAkJaWYgKCFhY3BpX3V0X3ZhbGlkX2FjcGlfbmFtZSh0aGlzX25vZGUtPm5hbWUuaW50ZWdlcikpIHsKQEAgLTIxMiw3ICsyMTMsOSBAQAogCS8qCiAJICogTm93IHdlIGNhbiBwcmludCBvdXQgdGhlIHBlcnRpbmVudCBpbmZvcm1hdGlvbgogCSAqLwotCWFjcGlfb3NfcHJpbnRmKCIgJS0xMnMgJXAgIiwgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHR5cGUpLCB0aGlzX25vZGUpOworCWFjcGlfb3NfcHJpbnRmKCIgJS0xMnMgJXAgJTIuMlggIiwKKwkJICAgICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0eXBlKSwgdGhpc19ub2RlLAorCQkgICAgICAgdGhpc19ub2RlLT5vd25lcl9pZCk7CiAKIAlkYmdfbGV2ZWwgPSBhY3BpX2RiZ19sZXZlbDsKIAlhY3BpX2RiZ19sZXZlbCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZHVtcGR2LmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZHVtcGR2LmMKaW5kZXggNTVkZTg4My4uYWZmODk5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXBkdi5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wZHYuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNldmFsLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZXZhbC5jCmluZGV4IDAxOTFjN2QuLmUzYzY2NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNldmFsLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2V2YWwuYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zNzMsOCArMzczLDcgQEAKIAogCWluZm8tPm9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KGluZm8tPm5vZGUpOwogCWlmICghaW5mby0+b2JqX2Rlc2MpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJObyBhdHRhY2hlZCBtZXRob2Qgb2JqZWN0XG4iKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTm8gYXR0YWNoZWQgbWV0aG9kIG9iamVjdFxuIikpOwogCiAJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTlVMTF9PQkpFQ1QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2luaXQuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNpbml0LmMKaW5kZXggMGEwOGQyZi4uNmMxMTc4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2luaXQuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zaW5pdC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtOTMsOCArOTMsOCBAQAogCQkJCSAgICAgQUNQSV9VSU5UMzJfTUFYLCBhY3BpX25zX2luaXRfb25lX29iamVjdCwKIAkJCQkgICAgICZpbmZvLCBOVUxMKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIndhbGtfbmFtZXNwYWNlIGZhaWxlZCEgJXNcbiIsCi0JCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIndhbGtfbmFtZXNwYWNlIGZhaWxlZCEgJXNcbiIsCisJCQkJICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAl9CiAKIAlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9JTklULApAQCAtMTU5LDggKzE1OSw4IEBACiAJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CiAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIndhbGtfbmFtZXNwYWNlIGZhaWxlZCEgJXNcbiIsCi0JCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIndhbGtfbmFtZXNwYWNlIGZhaWxlZCEgJXNcbiIsCisJCQkJICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAl9CiAKIAlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9JTklULApAQCAtMjg5LDEyICsyODksNyBAQAogCX0KIAogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9FUlJPUiwgIlxuIikpOwotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIkNvdWxkIG5vdCBleGVjdXRlIGFyZ3VtZW50cyBmb3IgWyU0LjRzXSAoJXMpLCAlc1xuIiwKLQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwKLQkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0eXBlKSwKLQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiXG5Db3VsZCBub3QgZXhlY3V0ZSBhcmd1bWVudHMgZm9yIFslNC40c10gKCVzKSwgJXNcbiIsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHR5cGUpLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCX0KIAogCS8qCkBAIC0zMzYsMjMgKzMzMSwyMiBAQAogCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvIHBpbmZvOwogCXUzMiBmbGFnczsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmluaV9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkZXZpY2Vfbm9kZTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2luaXRfb25lX2RldmljZSIpOwogCi0JcGluZm8ucGFyYW1ldGVycyA9IE5VTEw7Ci0JcGluZm8ucGFyYW1ldGVyX3R5cGUgPSBBQ1BJX1BBUkFNX0FSR1M7Ci0KLQlwaW5mby5ub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUob2JqX2hhbmRsZSk7Ci0JaWYgKCFwaW5mby5ub2RlKSB7CisJZGV2aWNlX25vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShvYmpfaGFuZGxlKTsKKwlpZiAoIWRldmljZV9ub2RlKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKgogCSAqIFdlIHdpbGwgcnVuIF9TVEEvX0lOSSBvbiBEZXZpY2VzLCBQcm9jZXNzb3JzIGFuZCB0aGVybWFsX3pvbmVzIG9ubHkKIAkgKi8KLQlpZiAoKHBpbmZvLm5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX0RFVklDRSkgJiYKLQkgICAgKHBpbmZvLm5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX1BST0NFU1NPUikgJiYKLQkgICAgKHBpbmZvLm5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX1RIRVJNQUwpKSB7CisJaWYgKChkZXZpY2Vfbm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfREVWSUNFKSAmJgorCSAgICAoZGV2aWNlX25vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX1BST0NFU1NPUikgJiYKKwkgICAgKGRldmljZV9ub2RlLT50eXBlICE9IEFDUElfVFlQRV9USEVSTUFMKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIApAQCAtMzY0LDU3ICszNTgsNzAgQEAKIAlpbmZvLT5kZXZpY2VfY291bnQrKzsKIAogCS8qCi0JICogUnVuIF9TVEEgdG8gZGV0ZXJtaW5lIGlmIHdlIGNhbiBydW4gX0lOSSBvbiB0aGUgZGV2aWNlLgorCSAqIENoZWNrIGlmIHRoZSBfSU5JIG1ldGhvZCBleGlzdHMgZm9yIHRoaXMgZGV2aWNlIC0KKwkgKiBpZiBfSU5JIGRvZXMgbm90IGV4aXN0LCB0aGVyZSBpcyBubyBuZWVkIHRvIHJ1biBfU1RBCisJICogTm8gX0lOSSBtZWFucyBkZXZpY2UgcmVxdWlyZXMgbm8gaW5pdGlhbGl6YXRpb24KIAkgKi8KLQlBQ1BJX0RFQlVHX0VYRUMoYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUoQUNQSV9UWVBFX01FVEhPRCwKLQkJCQkJCSAgICAgIHBpbmZvLm5vZGUsCi0JCQkJCQkgICAgICBNRVRIT0RfTkFNRV9fU1RBKSk7Ci0Jc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX1NUQShwaW5mby5ub2RlLCAmZmxhZ3MpOwotCisJc3RhdHVzID0gYWNwaV9uc19zZWFyY2hfbm9kZSgqQUNQSV9DQVNUX1BUUih1MzIsIE1FVEhPRF9OQU1FX19JTkkpLAorCQkJCSAgICAgZGV2aWNlX25vZGUsIEFDUElfVFlQRV9NRVRIT0QsICZpbmlfbm9kZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWlmIChwaW5mby5ub2RlLT50eXBlID09IEFDUElfVFlQRV9ERVZJQ0UpIHsKLQkJCS8qIElnbm9yZSBlcnJvciBhbmQgbW92ZSBvbiB0byBuZXh0IGRldmljZSAqLworCQkvKiBObyBfSU5JIG1ldGhvZCBmb3VuZCAtIG1vdmUgb24gdG8gbmV4dCBkZXZpY2UgKi8KIAotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQkJfQotCi0JCS8qIF9TVEEgaXMgbm90IHJlcXVpcmVkIGZvciBQcm9jZXNzb3Igb3IgdGhlcm1hbF96b25lIG9iamVjdHMgKi8KLQl9IGVsc2UgewotCQlpbmZvLT5udW1fU1RBKys7Ci0KLQkJaWYgKCEoZmxhZ3MgJiAweDAxKSkgewotCQkJLyogRG9uJ3QgbG9vayBhdCBjaGlsZHJlbiBvZiBhIG5vdCBwcmVzZW50IGRldmljZSAqLwotCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQ1RSTF9ERVBUSCk7Ci0JCX0KKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKgotCSAqIFRoZSBkZXZpY2UgaXMgcHJlc2VudC4gUnVuIF9JTkkuCisJICogUnVuIF9TVEEgdG8gZGV0ZXJtaW5lIGlmIHdlIGNhbiBydW4gX0lOSSBvbiB0aGUgZGV2aWNlIC0KKwkgKiB0aGUgZGV2aWNlIG11c3QgYmUgcHJlc2VudCBiZWZvcmUgX0lOSSBjYW4gYmUgcnVuLgorCSAqIEhvd2V2ZXIsIF9TVEEgaXMgbm90IHJlcXVpcmVkIC0gYXNzdW1lIGRldmljZSBwcmVzZW50IGlmIG5vIF9TVEEKKwkgKi8KKwlBQ1BJX0RFQlVHX0VYRUMoYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUoQUNQSV9UWVBFX01FVEhPRCwKKwkJCQkJCSAgICAgIGRldmljZV9ub2RlLAorCQkJCQkJICAgICAgTUVUSE9EX05BTUVfX1NUQSkpOworCisJcGluZm8ubm9kZSA9IGRldmljZV9ub2RlOworCXBpbmZvLnBhcmFtZXRlcnMgPSBOVUxMOworCXBpbmZvLnBhcmFtZXRlcl90eXBlID0gQUNQSV9QQVJBTV9BUkdTOworCisJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX1NUQShwaW5mby5ub2RlLCAmZmxhZ3MpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkvKiBJZ25vcmUgZXJyb3IgYW5kIG1vdmUgb24gdG8gbmV4dCBkZXZpY2UgKi8KKworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCX0KKworCWlmIChmbGFncyAhPSBBQ1BJX1VJTlQzMl9NQVgpIHsKKwkJaW5mby0+bnVtX1NUQSsrOworCX0KKworCWlmICghKGZsYWdzICYgQUNQSV9TVEFfREVWSUNFX1BSRVNFTlQpKSB7CisJCS8qIERvbid0IGxvb2sgYXQgY2hpbGRyZW4gb2YgYSBub3QgcHJlc2VudCBkZXZpY2UgKi8KKworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQ1RSTF9ERVBUSCk7CisJfQorCisJLyoKKwkgKiBUaGUgZGV2aWNlIGlzIHByZXNlbnQgYW5kIF9JTkkgZXhpc3RzLiBSdW4gdGhlIF9JTkkgbWV0aG9kLgorCSAqIChXZSBhbHJlYWR5IGhhdmUgdGhlIF9JTkkgbm9kZSBmcm9tIGFib3ZlKQogCSAqLwogCUFDUElfREVCVUdfRVhFQyhhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZShBQ1BJX1RZUEVfTUVUSE9ELAogCQkJCQkJICAgICAgcGluZm8ubm9kZSwKIAkJCQkJCSAgICAgIE1FVEhPRF9OQU1FX19JTkkpKTsKLQlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX3JlbGF0aXZlKE1FVEhPRF9OQU1FX19JTkksICZwaW5mbyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCS8qIE5vIF9JTkkgKEFFX05PVF9GT1VORCkgbWVhbnMgZGV2aWNlIHJlcXVpcmVzIG5vIGluaXRpYWxpemF0aW9uICovCiAKLQkJaWYgKHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKLQkJCS8qIElnbm9yZSBlcnJvciBhbmQgbW92ZSBvbiB0byBuZXh0IGRldmljZSAqLworCXBpbmZvLm5vZGUgPSBpbmlfbm9kZTsKKwlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX2J5X2hhbmRsZSgmcGluZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkvKiBJZ25vcmUgZXJyb3IgYW5kIG1vdmUgb24gdG8gbmV4dCBkZXZpY2UgKi8KIAogI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCi0JCQljaGFyICpzY29wZV9uYW1lID0KLQkJCSAgICBhY3BpX25zX2dldF9leHRlcm5hbF9wYXRobmFtZShwaW5mby5ub2RlKTsKKwkJY2hhciAqc2NvcGVfbmFtZSA9IGFjcGlfbnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lKGluaV9ub2RlKTsKIAotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLCAiJXMuX0lOSSBmYWlsZWQ6ICVzXG4iLAotCQkJCQkgIHNjb3BlX25hbWUsCi0JCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKKwkJQUNQSV9SRVBPUlRfV0FSTklORygoIiVzLl9JTkkgZmFpbGVkOiAlc1xuIiwKKwkJCQkgICAgIHNjb3BlX25hbWUsCisJCQkJICAgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCi0JCQlBQ1BJX01FTV9GUkVFKHNjb3BlX25hbWUpOworCQlBQ1BJX01FTV9GUkVFKHNjb3BlX25hbWUpOwogI2VuZGlmCi0JCX0KLQotCQlzdGF0dXMgPSBBRV9PSzsKIAl9IGVsc2UgewogCQkvKiBEZWxldGUgYW55IHJldHVybiBvYmplY3QgKGVzcGVjaWFsbHkgaWYgaW1wbGljaXRfcmV0dXJuIGlzIGVuYWJsZWQpICovCiAKQEAgLTQzNCw1ICs0NDEsNSBAQAogCQkgICAgYWNwaV9nYmxfaW5pdF9oYW5kbGVyKHBpbmZvLm5vZGUsIEFDUElfSU5JVF9ERVZJQ0VfSU5JKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2xvYWQuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNsb2FkLmMKaW5kZXggYzI4ODQ5ZC4uMGI0YTg2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2xvYWQuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zbG9hZC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtOTIsNyArOTIsNyBAQAogCS8qIENoZWNrIHZhbGlkaXR5IG9mIHRoZSBBTUwgc3RhcnQgYW5kIGxlbmd0aCAqLwogCiAJaWYgKCF0YWJsZV9kZXNjLT5hbWxfc3RhcnQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIk51bGwgQU1MIHBvaW50ZXJcbiIpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJOdWxsIEFNTCBwb2ludGVyXG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKQEAgLTI2Myw3ICsyNjMsNyBAQAogCS8qIFRoZXJlIG11c3QgYmUgYXQgbGVhc3QgYSBEU0RUIGluc3RhbGxlZCAqLwogCiAJaWYgKGFjcGlfZ2JsX0RTRFQgPT0gTlVMTCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiRFNEVCBpcyBub3QgaW4gbWVtb3J5XG4iKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiRFNEVCBpcyBub3QgaW4gbWVtb3J5XG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19BQ1BJX1RBQkxFUyk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zbmFtZXMuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNuYW1lcy5jCmluZGV4IGQ1ZThkZWEuLjQxMWUxZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNuYW1lcy5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNuYW1lcy5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTc1LDcgKzc1LDcgQEAKIAlhY3BpX3NpemUgaW5kZXg7CiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlOwogCi0JQUNQSV9GVU5DVElPTl9OQU1FKCJuc19idWlsZF9leHRlcm5hbF9wYXRoIik7CisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJLyogU3BlY2lhbCBjYXNlIGZvciByb290ICovCiAKQEAgLTExMCw5ICsxMTAsNyBAQAogCW5hbWVfYnVmZmVyW2luZGV4XSA9IEFNTF9ST09UX1BSRUZJWDsKIAogCWlmIChpbmRleCAhPSAwKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiQ291bGQgbm90IGNvbnN0cnVjdCBwYXRobmFtZTsgaW5kZXg9JVgsIHNpemU9JVgsIFBhdGg9JXNcbiIsCi0JCQkJICAodTMyKSBpbmRleCwgKHUzMikgc2l6ZSwgJm5hbWVfYnVmZmVyW3NpemVdKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IGNvbnN0cnVjdCBwYXRobmFtZTsgaW5kZXg9JVgsIHNpemU9JVgsIFBhdGg9JXNcbiIsICh1MzIpIGluZGV4LCAodTMyKSBzaXplLCAmbmFtZV9idWZmZXJbc2l6ZV0pKTsKIAl9CiAKIAlyZXR1cm47CkBAIC0xNDgsNyArMTQ2LDcgQEAKIAogCW5hbWVfYnVmZmVyID0gQUNQSV9NRU1fQ0FMTE9DQVRFKHNpemUpOwogCWlmICghbmFtZV9idWZmZXIpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IoKCJuc19nZXRfdGFibGVfcGF0aG5hbWU6IGFsbG9jYXRpb24gZmFpbHVyZVxuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkFsbG9jYXRpb24gZmFpbHVyZVxuIikpOwogCQlyZXR1cm5fUFRSKE5VTEwpOwogCX0KIApAQCAtMjQxLDcgKzIzOSw3IEBACiAKIAlhY3BpX25zX2J1aWxkX2V4dGVybmFsX3BhdGgobm9kZSwgcmVxdWlyZWRfc2l6ZSwgYnVmZmVyLT5wb2ludGVyKTsKIAotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIiVzIFslWF0gXG4iLAorCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIiVzIFslWF1cbiIsCiAJCQkgIChjaGFyICopYnVmZmVyLT5wb2ludGVyLCAodTMyKSByZXF1aXJlZF9zaXplKSk7CiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNvYmplY3QuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNvYmplY3QuYwppbmRleCBmYzliZTk0Li44NjExMzA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zb2JqZWN0LmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc29iamVjdC5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTg0LDIxICs4NCwyMSBAQAogCWlmICghbm9kZSkgewogCQkvKiBJbnZhbGlkIGhhbmRsZSAqLwogCi0JCUFDUElfUkVQT1JUX0VSUk9SKCgibnNfYXR0YWNoX29iamVjdDogTnVsbCBuYW1lZF9vYmogaGFuZGxlXG4iKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTnVsbCBuYW1lZF9vYmogaGFuZGxlXG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAlpZiAoIW9iamVjdCAmJiAoQUNQSV9UWVBFX0FOWSAhPSB0eXBlKSkgewogCQkvKiBOdWxsIG9iamVjdCAqLwogCi0JCUFDUElfUkVQT1JUX0VSUk9SKCgibnNfYXR0YWNoX29iamVjdDogTnVsbCBvYmplY3QsIGJ1dCB0eXBlIG5vdCBBQ1BJX1RZUEVfQU5ZXG4iKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTnVsbCBvYmplY3QsIGJ1dCB0eXBlIG5vdCBBQ1BJX1RZUEVfQU5ZXG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG5vZGUpICE9IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CiAJCS8qIE5vdCBhIG5hbWUgaGFuZGxlICovCiAKLQkJQUNQSV9SRVBPUlRfRVJST1IoKCJuc19hdHRhY2hfb2JqZWN0OiBJbnZhbGlkIGhhbmRsZSAlcCBbJXNdXG4iLAorCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkludmFsaWQgaGFuZGxlICVwIFslc11cbiIsCiAJCQkJICAgbm9kZSwgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lKG5vZGUpKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CkBAIC0yNTQsNyArMjU0LDcgQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigibnNfZ2V0X2F0dGFjaGVkX29iamVjdCIsIG5vZGUpOwogCiAJaWYgKCFub2RlKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgIk51bGwgTm9kZSBwdHJcbiIpKTsKKwkJQUNQSV9SRVBPUlRfV0FSTklORygoIk51bGwgTm9kZSBwdHJcbiIpKTsKIAkJcmV0dXJuX1BUUihOVUxMKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNwYXJzZS5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3BhcnNlLmMKaW5kZXggNDMzNDQyYS4uMjMyYmU0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3BhcnNlLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3BhcnNlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zc2VhcmNoLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zc2VhcmNoLmMKaW5kZXggNTBhM2NhNS4uZjA5NGEyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3NlYXJjaC5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNzZWFyY2guYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC05OSw4ICs5OSw4IEBACiAJCWlmIChzY29wZV9uYW1lKSB7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAogCQkJCQkgICJTZWFyY2hpbmcgJXMgKCVwKSBGb3IgWyU0LjRzXSAoJXMpXG4iLAotCQkJCQkgIHNjb3BlX25hbWUsIG5vZGUsCi0JCQkJCSAgKGNoYXIgKikmdGFyZ2V0X25hbWUsCisJCQkJCSAgc2NvcGVfbmFtZSwgbm9kZSwgQUNQSV9DQVNUX1BUUihjaGFyLAorCQkJCQkJCQkJICAmdGFyZ2V0X25hbWUpLAogCQkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0eXBlKSkpOwogCiAJCQlBQ1BJX01FTV9GUkVFKHNjb3BlX25hbWUpOwpAQCAtMTMxLDcgKzEzMSw3IEBACiAJCQkgKi8KIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCiAJCQkJCSAgIk5hbWUgWyU0LjRzXSAoJXMpICVwIGZvdW5kIGluIHNjb3BlIFslNC40c10gJXBcbiIsCi0JCQkJCSAgKGNoYXIgKikmdGFyZ2V0X25hbWUsCisJCQkJCSAgQUNQSV9DQVNUX1BUUihjaGFyLCAmdGFyZ2V0X25hbWUpLAogCQkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShuZXh0X25vZGUtPgogCQkJCQkJCQl0eXBlKSwKIAkJCQkJICBuZXh0X25vZGUsCkBAIC0xNjAsNyArMTYwLDggQEAKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCiAJCQkgICJOYW1lIFslNC40c10gKCVzKSBub3QgZm91bmQgaW4gc2VhcmNoIGluIHNjb3BlIFslNC40c10gJXAgZmlyc3QgY2hpbGQgJXBcbiIsCi0JCQkgIChjaGFyICopJnRhcmdldF9uYW1lLCBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSksCisJCQkgIEFDUElfQ0FTVF9QVFIoY2hhciwgJnRhcmdldF9uYW1lKSwKKwkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHR5cGUpLAogCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUobm9kZSksIG5vZGUsIG5vZGUtPmNoaWxkKSk7CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0ZPVU5EKTsKQEAgLTIxMCwxNCArMjExLDE0IEBACiAJICovCiAJaWYgKCFwYXJlbnRfbm9kZSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLCAiWyU0LjRzXSBoYXMgbm8gcGFyZW50XG4iLAotCQkJCSAgKGNoYXIgKikmdGFyZ2V0X25hbWUpKTsKKwkJCQkgIEFDUElfQ0FTVF9QVFIoY2hhciwgJnRhcmdldF9uYW1lKSkpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0ZPVU5EKTsKIAl9CiAKIAlpZiAoYWNwaV9uc19sb2NhbCh0eXBlKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAogCQkJCSAgIlslNC40c10gdHlwZSBbJXNdIG11c3QgYmUgbG9jYWwgdG8gdGhpcyBzY29wZSAobm8gcGFyZW50IHNlYXJjaClcbiIsCi0JCQkJICAoY2hhciAqKSZ0YXJnZXRfbmFtZSwKKwkJCQkgIEFDUElfQ0FTVF9QVFIoY2hhciwgJnRhcmdldF9uYW1lKSwKIAkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0eXBlKSkpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0ZPVU5EKTsKIAl9CkBAIC0yMjcsNyArMjI4LDcgQEAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAogCQkJICAiU2VhcmNoaW5nIHBhcmVudCBbJTQuNHNdIGZvciBbJTQuNHNdXG4iLAogCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUocGFyZW50X25vZGUpLAotCQkJICAoY2hhciAqKSZ0YXJnZXRfbmFtZSkpOworCQkJICBBQ1BJX0NBU1RfUFRSKGNoYXIsICZ0YXJnZXRfbmFtZSkpKTsKIAogCS8qCiAJICogU2VhcmNoIHBhcmVudHMgdW50aWwgdGFyZ2V0IGlzIGZvdW5kIG9yIHdlIGhhdmUgYmFja2VkIHVwIHRvIHRoZSByb290CkBAIC0yOTcsMTggKzI5OCwxNSBAQAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKIAlpZiAoIW5vZGUgfHwgIXRhcmdldF9uYW1lIHx8ICFyZXR1cm5fbm9kZSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIk51bGwgcGFyYW06IE5vZGUgJXAgTmFtZSAlWCByZXR1cm5fbm9kZSAlcFxuIiwKLQkJCQkgIG5vZGUsIHRhcmdldF9uYW1lLCByZXR1cm5fbm9kZSkpOwotCi0JCUFDUElfUkVQT1JUX0VSUk9SKCgibnNfc2VhcmNoX2FuZF9lbnRlcjogTnVsbCBwYXJhbWV0ZXJcbiIpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJOdWxsIHBhcmFtOiBOb2RlICVwIE5hbWUgJVggcmV0dXJuX25vZGUgJXBcbiIsIG5vZGUsIHRhcmdldF9uYW1lLCByZXR1cm5fbm9kZSkpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCiAJLyogTmFtZSBtdXN0IGNvbnNpc3Qgb2YgcHJpbnRhYmxlIGNoYXJhY3RlcnMgKi8KIAogCWlmICghYWNwaV91dF92YWxpZF9hY3BpX25hbWUodGFyZ2V0X25hbWUpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SKCgibnNfc2VhcmNoX2FuZF9lbnRlcjogQmFkIGNoYXJhY3RlciBpbiBBQ1BJIE5hbWU6ICVYXG4iLCB0YXJnZXRfbmFtZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkJhZCBjaGFyYWN0ZXIgaW4gQUNQSSBOYW1lOiAlWFxuIiwKKwkJCQkgICB0YXJnZXRfbmFtZSkpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0NIQVJBQ1RFUik7CiAJfQogCkBAIC0zNjAsNyArMzU4LDcgQEAKIAlpZiAoaW50ZXJwcmV0ZXJfbW9kZSA9PSBBQ1BJX0lNT0RFX0VYRUNVVEUpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKIAkJCQkgICIlNC40cyBOb3QgZm91bmQgaW4gJXAgW05vdCBhZGRpbmddXG4iLAotCQkJCSAgKGNoYXIgKikmdGFyZ2V0X25hbWUsIG5vZGUpKTsKKwkJCQkgIEFDUElfQ0FTVF9QVFIoY2hhciwgJnRhcmdldF9uYW1lKSwgbm9kZSkpOwogCiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRk9VTkQpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN1dGlscy5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3V0aWxzLmMKaW5kZXggZWJlYzAzNi4uYmM3NzlmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3V0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3V0aWxzLmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC02Myw3ICs2Myw2IEBACiAgKgogICogUEFSQU1FVEVSUzogIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZSAoZm9yIGVycm9yIG91dHB1dCkKICAqICAgICAgICAgICAgICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIgKGZvciBlcnJvciBvdXRwdXQpCi0gKiAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRCAoZm9yIGVycm9yIG91dHB1dCkKICAqICAgICAgICAgICAgICBpbnRlcm5hbF9uYW1lICAgICAgIC0gTmFtZSBvciBwYXRoIG9mIHRoZSBuYW1lc3BhY2Ugbm9kZQogICogICAgICAgICAgICAgIGxvb2t1cF9zdGF0dXMgICAgICAgLSBFeGNlcHRpb24gY29kZSBmcm9tIE5TIGxvb2t1cAogICoKQEAgLTc2LDE0ICs3NSwxMiBAQAogdm9pZAogYWNwaV9uc19yZXBvcnRfZXJyb3IoY2hhciAqbW9kdWxlX25hbWUsCiAJCSAgICAgdTMyIGxpbmVfbnVtYmVyLAotCQkgICAgIHUzMiBjb21wb25lbnRfaWQsCiAJCSAgICAgY2hhciAqaW50ZXJuYWxfbmFtZSwgYWNwaV9zdGF0dXMgbG9va3VwX3N0YXR1cykKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJY2hhciAqbmFtZSA9IE5VTEw7CiAKLQlhY3BpX29zX3ByaW50ZigiJThzLSUwNGQ6ICoqKiBFcnJvcjogTG9va2luZyB1cCAiLAotCQkgICAgICAgbW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyKTsKKwlhY3BpX3V0X3JlcG9ydF9lcnJvcihtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOwogCiAJaWYgKGxvb2t1cF9zdGF0dXMgPT0gQUVfQkFEX0NIQVJBQ1RFUikgewogCQkvKiBUaGVyZSBpcyBhIG5vbi1hc2NpaSBjaGFyYWN0ZXIgaW4gdGhlIG5hbWUgKi8KQEAgLTEwOSw3ICsxMDYsNyBAQAogCQl9CiAJfQogCi0JYWNwaV9vc19wcmludGYoIiBpbiBuYW1lc3BhY2UsICVzXG4iLAorCWFjcGlfb3NfcHJpbnRmKCJOYW1lc3BhY2UgbG9va3VwIGZhaWx1cmUsICVzXG4iLAogCQkgICAgICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKGxvb2t1cF9zdGF0dXMpKTsKIH0KIApAQCAtMTE5LDEwICsxMTYsOSBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUgKGZvciBlcnJvciBvdXRwdXQpCiAgKiAgICAgICAgICAgICAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyIChmb3IgZXJyb3Igb3V0cHV0KQotICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQgKGZvciBlcnJvciBvdXRwdXQpCiAgKiAgICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgICAgICAtIEVycm9yIG1lc3NhZ2UgdG8gdXNlIG9uIGZhaWx1cmUKICAqICAgICAgICAgICAgICBwcmVmaXhfbm9kZSAgICAgICAgIC0gUHJlZml4IHJlbGF0aXZlIHRvIHRoZSBwYXRoCi0gKiAgICAgICAgICAgICAgUGF0aCAgICAgICAgICAgICAgICAtIFBhdGggdG8gdGhlIG5vZGUKKyAqICAgICAgICAgICAgICBQYXRoICAgICAgICAgICAgICAgIC0gUGF0aCB0byB0aGUgbm9kZSAob3B0aW9uYWwpCiAgKiAgICAgICAgICAgICAgbWV0aG9kX3N0YXR1cyAgICAgICAtIEV4ZWN1dGlvbiBzdGF0dXMKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQpAQCAtMTM0LDcgKzEzMCw2IEBACiB2b2lkCiBhY3BpX25zX3JlcG9ydF9tZXRob2RfZXJyb3IoY2hhciAqbW9kdWxlX25hbWUsCiAJCQkgICAgdTMyIGxpbmVfbnVtYmVyLAotCQkJICAgIHUzMiBjb21wb25lbnRfaWQsCiAJCQkgICAgY2hhciAqbWVzc2FnZSwKIAkJCSAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcHJlZml4X25vZGUsCiAJCQkgICAgY2hhciAqcGF0aCwgYWNwaV9zdGF0dXMgbWV0aG9kX3N0YXR1cykKQEAgLTE0MiwxNyArMTM3LDE2IEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlID0gcHJlZml4X25vZGU7CiAKKwlhY3BpX3V0X3JlcG9ydF9lcnJvcihtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOworCiAJaWYgKHBhdGgpIHsKIAkJc3RhdHVzID0gYWNwaV9uc19nZXRfbm9kZV9ieV9wYXRoKHBhdGgsIHByZWZpeF9ub2RlLAogCQkJCQkJICBBQ1BJX05TX05PX1VQU0VBUkNILCAmbm9kZSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJYWNwaV9vc19wcmludGYKLQkJCSAgICAoInJlcG9ydF9tZXRob2RfZXJyb3I6IENvdWxkIG5vdCBnZXQgbm9kZVxuIik7Ci0JCQlyZXR1cm47CisJCQlhY3BpX29zX3ByaW50ZigiW0NvdWxkIG5vdCBnZXQgbm9kZSBieSBwYXRobmFtZV0iKTsKIAkJfQogCX0KIAotCWFjcGlfb3NfcHJpbnRmKCIlOHMtJTA0ZDogKioqIEVycm9yOiAiLCBtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOwogCWFjcGlfbnNfcHJpbnRfbm9kZV9wYXRobmFtZShub2RlLCBtZXNzYWdlKTsKIAlhY3BpX29zX3ByaW50ZigiLCAlc1xuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKG1ldGhvZF9zdGF0dXMpKTsKIH0KQEAgLTI0OCwxMSArMjQyLDExIEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfZ2V0X3R5cGUiKTsKIAogCWlmICghbm9kZSkgewotCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgibnNfZ2V0X3R5cGU6IE51bGwgTm9kZSBpbnB1dCBwb2ludGVyXG4iKSk7Ci0JCXJldHVybl9WQUxVRShBQ1BJX1RZUEVfQU5ZKTsKKwkJQUNQSV9SRVBPUlRfV0FSTklORygoIk51bGwgTm9kZSBwYXJhbWV0ZXJcbiIpKTsKKwkJcmV0dXJuX1VJTlQzMihBQ1BJX1RZUEVfQU5ZKTsKIAl9CiAKLQlyZXR1cm5fVkFMVUUoKGFjcGlfb2JqZWN0X3R5cGUpIG5vZGUtPnR5cGUpOworCXJldHVybl9VSU5UMzIoKGFjcGlfb2JqZWN0X3R5cGUpIG5vZGUtPnR5cGUpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjc1LDExICsyNjksMTEgQEAKIAlpZiAoIWFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUodHlwZSkpIHsKIAkJLyogVHlwZSBjb2RlIG91dCBvZiByYW5nZSAgKi8KIAotCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgibnNfbG9jYWw6IEludmFsaWQgT2JqZWN0IFR5cGVcbiIpKTsKLQkJcmV0dXJuX1ZBTFVFKEFDUElfTlNfTk9STUFMKTsKKwkJQUNQSV9SRVBPUlRfV0FSTklORygoIkludmFsaWQgT2JqZWN0IFR5cGUgJVhcbiIsIHR5cGUpKTsKKwkJcmV0dXJuX1VJTlQzMihBQ1BJX05TX05PUk1BTCk7CiAJfQogCi0JcmV0dXJuX1ZBTFVFKCh1MzIpIGFjcGlfZ2JsX25zX3Byb3BlcnRpZXNbdHlwZV0gJiBBQ1BJX05TX0xPQ0FMKTsKKwlyZXR1cm5fVUlOVDMyKCh1MzIpIGFjcGlfZ2JsX25zX3Byb3BlcnRpZXNbdHlwZV0gJiBBQ1BJX05TX0xPQ0FMKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTYyNyw3ICs2MjEsNyBAQAogCSAqIHdpdGggaW50ZXJuYWxfbmFtZSAoaW52YWxpZCBmb3JtYXQpLgogCSAqLwogCWlmIChyZXF1aXJlZF9sZW5ndGggPiBpbnRlcm5hbF9uYW1lX2xlbmd0aCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUigoIm5zX2V4dGVybmFsaXplX25hbWU6IEludmFsaWQgaW50ZXJuYWwgbmFtZVxuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkludmFsaWQgaW50ZXJuYWwgbmFtZVxuIikpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBVEhOQU1FKTsKIAl9CiAKQEAgLTgwMywxMiArNzk3LDExIEBACiAJaWYgKCFhY3BpX3V0X3ZhbGlkX29iamVjdF90eXBlKHR5cGUpKSB7CiAJCS8qIHR5cGUgY29kZSBvdXQgb2YgcmFuZ2UgICovCiAKLQkJQUNQSV9SRVBPUlRfV0FSTklORygoIm5zX29wZW5zX3Njb3BlOiBJbnZhbGlkIE9iamVjdCBUeXBlICVYXG4iLAotCQkJCSAgICAgdHlwZSkpOwotCQlyZXR1cm5fVkFMVUUoQUNQSV9OU19OT1JNQUwpOworCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgiSW52YWxpZCBPYmplY3QgVHlwZSAlWFxuIiwgdHlwZSkpOworCQlyZXR1cm5fVUlOVDMyKEFDUElfTlNfTk9STUFMKTsKIAl9CiAKLQlyZXR1cm5fVkFMVUUoKCh1MzIpIGFjcGlfZ2JsX25zX3Byb3BlcnRpZXNbdHlwZV0pICYgQUNQSV9OU19ORVdTQ09QRSk7CisJcmV0dXJuX1VJTlQzMigoKHUzMikgYWNwaV9nYmxfbnNfcHJvcGVydGllc1t0eXBlXSkgJiBBQ1BJX05TX05FV1NDT1BFKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN3YWxrLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zd2Fsay5jCmluZGV4IDVmMTY0YzAuLmZjYWIxZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN3YWxrLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3dhbGsuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4ZmV2YWwuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4ZmV2YWwuYwppbmRleCBjMDdiMDQ2Li5kZTEzYWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZldmFsLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmZXZhbC5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTExMiw4ICsxMTIsNyBAQAogCWlmIChyZXR1cm5fYnVmZmVyLT5sZW5ndGggPT0gMCkgewogCQkvKiBFcnJvciBiZWNhdXNlIGNhbGxlciBzcGVjaWZpY2FsbHkgYXNrZWQgZm9yIGEgcmV0dXJuIHZhbHVlICovCiAKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIk5vIHJldHVybiB2YWx1ZVxuIikpOwotCisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTm8gcmV0dXJuIHZhbHVlXG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OVUxMX09CSkVDVCk7CiAJfQogCkBAIC0xMjUsMTEgKzEyNCwxMSBAQAogCiAJLyogUmV0dXJuIG9iamVjdCB0eXBlIGRvZXMgbm90IG1hdGNoIHJlcXVlc3RlZCB0eXBlICovCiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJICAiSW5jb3JyZWN0IHJldHVybiB0eXBlIFslc10gcmVxdWVzdGVkIFslc11cbiIsCi0JCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSgoKHVuaW9uIGFjcGlfb2JqZWN0ICopCi0JCQkJCQkgcmV0dXJuX2J1ZmZlci0+cG9pbnRlciktPnR5cGUpLAotCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUocmV0dXJuX3R5cGUpKSk7CisJQUNQSV9SRVBPUlRfRVJST1IoKCJJbmNvcnJlY3QgcmV0dXJuIHR5cGUgWyVzXSByZXF1ZXN0ZWQgWyVzXVxuIiwKKwkJCSAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSgoKHVuaW9uIGFjcGlfb2JqZWN0ICopCisJCQkJCQkgIHJldHVybl9idWZmZXItPnBvaW50ZXIpLT4KKwkJCQkJCSB0eXBlKSwKKwkJCSAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShyZXR1cm5fdHlwZSkpKTsKIAogCWlmIChtdXN0X2ZyZWUpIHsKIAkJLyogQ2FsbGVyIHVzZWQgQUNQSV9BTExPQ0FURV9CVUZGRVIsIGZyZWUgdGhlIHJldHVybiBidWZmZXIgKi8KQEAgLTIzNiwxMSArMjM1LDkgQEAKIAkJICogcXVhbGlmaWVkIG5hbWVzIGFib3ZlLCB0aGlzIGlzIGFuIGVycm9yCiAJCSAqLwogCQlpZiAoIXBhdGhuYW1lKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJCb3RoIEhhbmRsZSBhbmQgUGF0aG5hbWUgYXJlIE5VTExcbiIpKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiQm90aCBIYW5kbGUgYW5kIFBhdGhuYW1lIGFyZSBOVUxMXG4iKSk7CiAJCX0gZWxzZSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJIYW5kbGUgaXMgTlVMTCBhbmQgUGF0aG5hbWUgaXMgcmVsYXRpdmVcbiIpKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiSGFuZGxlIGlzIE5VTEwgYW5kIFBhdGhuYW1lIGlzIHJlbGF0aXZlXG4iKSk7CiAJCX0KIAogCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwpAQCAtMzk5LDcgKzM5Niw3IEBACiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCi0JaWYgKCh0eXBlID4gQUNQSV9UWVBFX0VYVEVSTkFMX01BWCkgfHwgKCFtYXhfZGVwdGgpIHx8ICghdXNlcl9mdW5jdGlvbikpIHsKKwlpZiAoKHR5cGUgPiBBQ1BJX1RZUEVfTE9DQUxfTUFYKSB8fCAoIW1heF9kZXB0aCkgfHwgKCF1c2VyX2Z1bmN0aW9uKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCkBAIC00NzMsOCArNDcwLDggQEAKIAkJcmV0dXJuIChBRV9DVFJMX0RFUFRIKTsKIAl9CiAKLQlpZiAoIShmbGFncyAmIDB4MDEpKSB7Ci0JCS8qIERvbid0IHJldHVybiBhdCB0aGUgZGV2aWNlIG9yIGNoaWxkcmVuIG9mIHRoZSBkZXZpY2UgaWYgbm90IHRoZXJlICovCisJaWYgKCEoZmxhZ3MgJiBBQ1BJX1NUQV9ERVZJQ0VfUFJFU0VOVCkpIHsKKwkJLyogRG9uJ3QgZXhhbWluZSBjaGlsZHJlbiBvZiB0aGUgZGV2aWNlIGlmIG5vdCBwcmVzZW50ICovCiAKIAkJcmV0dXJuIChBRV9DVFJMX0RFUFRIKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZuYW1lLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZuYW1lLmMKaW5kZXggNmI1ZjhkNC4uODUzZTZkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmbmFtZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm5hbWUuYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm9iai5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmb2JqLmMKaW5kZXggMDg1NmQ0Mi4uYTAzMzI1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmb2JqLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmb2JqLmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL29zbC5jIGIvZHJpdmVycy9hY3BpL29zbC5jCmluZGV4IGUzY2QwYjEuLmNjNGE0OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9vc2wuYworKysgYi9kcml2ZXJzL2FjcGkvb3NsLmMKQEAgLTIwNCwxMSArMjA0LDEzIEBACiAKIAlyZXR1cm4gQUVfT0s7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhY3BpX29zX21hcF9tZW1vcnkpOwogCiB2b2lkIGFjcGlfb3NfdW5tYXBfbWVtb3J5KHZvaWQgX19pb21lbSAqIHZpcnQsIGFjcGlfc2l6ZSBzaXplKQogewogCWlvdW5tYXAodmlydCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhY3BpX29zX3VubWFwX21lbW9yeSk7CiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKQEAgLTgzNiw3ICs4MzgsNyBAQAogCQkJc3RhdGljIGNvbnN0IGludCBxdWFudHVtX21zID0gMTAwMCAvIEhaOwogCiAJCQlyZXQgPSBkb3duX3RyeWxvY2soc2VtKTsKLQkJCWZvciAoaSA9IHRpbWVvdXQ7IChpID4gMCAmJiByZXQgPCAwKTsgaSAtPSBxdWFudHVtX21zKSB7CisJCQlmb3IgKGkgPSB0aW1lb3V0OyAoaSA+IDAgJiYgcmV0ICE9IDApOyBpIC09IHF1YW50dW1fbXMpIHsKIAkJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoMSk7CiAJCQkJcmV0ID0gZG93bl90cnlsb2NrKHNlbSk7CiAJCQl9CkBAIC0xMDU4LDExICsxMDYwLDkgQEAKICAqIEFjcXVpcmUgYSBzcGlubG9jay4KICAqCiAgKiBoYW5kbGUgaXMgYSBwb2ludGVyIHRvIHRoZSBzcGlubG9ja190LgotICogZmxhZ3MgaXMgKm5vdCogdGhlIHJlc3VsdCBvZiBzYXZlX2ZsYWdzIC0gaXQgaXMgYW4gQUNQSS1zcGVjaWZpYyBmbGFnIHZhcmlhYmxlCi0gKiAgIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgd2UgYXJlIGF0IGludGVycnVwdCBsZXZlbC4KICAqLwogCi11bnNpZ25lZCBsb25nIGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfaGFuZGxlIGhhbmRsZSkKK2FjcGlfbmF0aXZlX3VpbnQgYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9oYW5kbGUgaGFuZGxlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3Bpbl9sb2NrX2lycXNhdmUoKHNwaW5sb2NrX3QgKikgaGFuZGxlLCBmbGFncyk7CkBAIC0xMDczLDkgKzEwNzMsOSBAQAogICogUmVsZWFzZSBhIHNwaW5sb2NrLiBTZWUgYWJvdmUuCiAgKi8KIAotdm9pZCBhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2hhbmRsZSBoYW5kbGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit2b2lkIGFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfaGFuZGxlIGhhbmRsZSwgYWNwaV9uYXRpdmVfdWludCBmbGFncykKIHsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKChzcGlubG9ja190ICopIGhhbmRsZSwgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKHNwaW5sb2NrX3QgKikgaGFuZGxlLCAodW5zaWduZWQgbG9uZykgZmxhZ3MpOwogfQogCiAjaWZuZGVmIEFDUElfVVNFX0xPQ0FMX0NBQ0hFCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzYXJncy5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc2FyZ3MuYwppbmRleCA1ODU4MTg4Li4zYzM3Y2QwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzYXJncy5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNhcmdzLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KKyNpbmNsdWRlIDxhY3BpL2FjZGlzcGF0Lmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1BBUlNFUgogQUNQSV9NT0RVTEVfTkFNRSgicHNhcmdzIikKQEAgLTYyLDYxICs2Myw1MSBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBwYXJzZXJfc3RhdGUgICAgICAgIC0gQ3VycmVudCBwYXJzZXIgc3RhdGUgb2JqZWN0CiAgKgotICogUkVUVVJOOiAgICAgIERlY29kZWQgcGFja2FnZSBsZW5ndGguICBPbiBjb21wbGV0aW9uLCB0aGUgQU1MIHBvaW50ZXIgcG9pbnRzCisgKiBSRVRVUk46ICAgICAgRGVjb2RlZCBwYWNrYWdlIGxlbmd0aC4gT24gY29tcGxldGlvbiwgdGhlIEFNTCBwb2ludGVyIHBvaW50cwogICogICAgICAgICAgICAgIHBhc3QgdGhlIGxlbmd0aCBieXRlIG9yIGJ5dGVzLgogICoKLSAqIERFU0NSSVBUSU9OOiBEZWNvZGUgYW5kIHJldHVybiBhIHBhY2thZ2UgbGVuZ3RoIGZpZWxkCisgKiBERVNDUklQVElPTjogRGVjb2RlIGFuZCByZXR1cm4gYSBwYWNrYWdlIGxlbmd0aCBmaWVsZC4KKyAqICAgICAgICAgICAgICBOb3RlOiBMYXJnZXN0IHBhY2thZ2UgbGVuZ3RoIGlzIDI4IGJpdHMsIGZyb20gQUNQSSBzcGVjaWZpY2F0aW9uCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHUzMgogYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2xlbmd0aChzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlKQogewotCXUzMiBlbmNvZGVkX2xlbmd0aDsKLQl1MzIgbGVuZ3RoID0gMDsKKwl1OCAqYW1sID0gcGFyc2VyX3N0YXRlLT5hbWw7CisJdTMyIHBhY2thZ2VfbGVuZ3RoID0gMDsKKwlhY3BpX25hdGl2ZV91aW50IGJ5dGVfY291bnQ7CisJdTggYnl0ZV96ZXJvX21hc2sgPSAweDNGOwkvKiBEZWZhdWx0IFswOjVdICovCiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJwc19nZXRfbmV4dF9wYWNrYWdlX2xlbmd0aCIpOwogCi0JZW5jb2RlZF9sZW5ndGggPSAodTMyKSBBQ1BJX0dFVDgocGFyc2VyX3N0YXRlLT5hbWwpOwotCXBhcnNlcl9zdGF0ZS0+YW1sKys7CisJLyoKKwkgKiBCeXRlIDAgYml0cyBbNjo3XSBjb250YWluIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBieXRlcworCSAqIHVzZWQgdG8gZW5jb2RlIHRoZSBwYWNrYWdlIGxlbmd0aCwgZWl0aGVyIDAsMSwyLCBvciAzCisJICovCisJYnl0ZV9jb3VudCA9IChhbWxbMF0gPj4gNik7CisJcGFyc2VyX3N0YXRlLT5hbWwgKz0gKGJ5dGVfY291bnQgKyAxKTsKIAotCXN3aXRjaCAoZW5jb2RlZF9sZW5ndGggPj4gNikgewkvKiBiaXRzIDYtNyBjb250YWluIGVuY29kaW5nIHNjaGVtZSAqLwotCWNhc2UgMDoJCS8qIDEtYnl0ZSBlbmNvZGluZyAoYml0cyAwLTUpICovCisJLyogR2V0IGJ5dGVzIDMsIDIsIDEgYXMgbmVlZGVkICovCiAKLQkJbGVuZ3RoID0gKGVuY29kZWRfbGVuZ3RoICYgMHgzRik7Ci0JCWJyZWFrOworCXdoaWxlIChieXRlX2NvdW50KSB7CisJCS8qCisJCSAqIEZpbmFsIGJpdCBwb3NpdGlvbnMgZm9yIHRoZSBwYWNrYWdlIGxlbmd0aCBieXRlczoKKwkJICogICAgICBCeXRlMy0+WzIwOjI3XQorCQkgKiAgICAgIEJ5dGUyLT5bMTI6MTldCisJCSAqICAgICAgQnl0ZTEtPlswNDoxMV0KKwkJICogICAgICBCeXRlMC0+WzAwOjAzXQorCQkgKi8KKwkJcGFja2FnZV9sZW5ndGggfD0gKGFtbFtieXRlX2NvdW50XSA8PCAoKGJ5dGVfY291bnQgPDwgMykgLSA0KSk7CiAKLQljYXNlIDE6CQkvKiAyLWJ5dGUgZW5jb2RpbmcgKG5leHQgYnl0ZSArIGJpdHMgMC0zKSAqLwotCi0JCWxlbmd0aCA9ICgoQUNQSV9HRVQ4KHBhcnNlcl9zdGF0ZS0+YW1sKSA8PCAwNCkgfAotCQkJICAoZW5jb2RlZF9sZW5ndGggJiAweDBGKSk7Ci0JCXBhcnNlcl9zdGF0ZS0+YW1sKys7Ci0JCWJyZWFrOwotCi0JY2FzZSAyOgkJLyogMy1ieXRlIGVuY29kaW5nIChuZXh0IDIgYnl0ZXMgKyBiaXRzIDAtMykgKi8KLQotCQlsZW5ndGggPSAoKEFDUElfR0VUOChwYXJzZXJfc3RhdGUtPmFtbCArIDEpIDw8IDEyKSB8Ci0JCQkgIChBQ1BJX0dFVDgocGFyc2VyX3N0YXRlLT5hbWwpIDw8IDA0KSB8Ci0JCQkgIChlbmNvZGVkX2xlbmd0aCAmIDB4MEYpKTsKLQkJcGFyc2VyX3N0YXRlLT5hbWwgKz0gMjsKLQkJYnJlYWs7Ci0KLQljYXNlIDM6CQkvKiA0LWJ5dGUgZW5jb2RpbmcgKG5leHQgMyBieXRlcyArIGJpdHMgMC0zKSAqLwotCi0JCWxlbmd0aCA9ICgoQUNQSV9HRVQ4KHBhcnNlcl9zdGF0ZS0+YW1sICsgMikgPDwgMjApIHwKLQkJCSAgKEFDUElfR0VUOChwYXJzZXJfc3RhdGUtPmFtbCArIDEpIDw8IDEyKSB8Ci0JCQkgIChBQ1BJX0dFVDgocGFyc2VyX3N0YXRlLT5hbWwpIDw8IDA0KSB8Ci0JCQkgIChlbmNvZGVkX2xlbmd0aCAmIDB4MEYpKTsKLQkJcGFyc2VyX3N0YXRlLT5hbWwgKz0gMzsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCi0JCS8qIENhbid0IGdldCBoZXJlLCBvbmx5IDIgYml0cyAvIDQgY2FzZXMgKi8KLQkJYnJlYWs7CisJCWJ5dGVfemVyb19tYXNrID0gMHgwRjsJLyogVXNlIGJpdHMgWzA6M10gb2YgYnl0ZSAwICovCisJCWJ5dGVfY291bnQtLTsKIAl9CiAKLQlyZXR1cm5fVkFMVUUobGVuZ3RoKTsKKwkvKiBCeXRlIDAgaXMgYSBzcGVjaWFsIGNhc2UsIGVpdGhlciBiaXRzIFswOjNdIG9yIFswOjVdIGFyZSB1c2VkICovCisKKwlwYWNrYWdlX2xlbmd0aCB8PSAoYW1sWzBdICYgYnl0ZV96ZXJvX21hc2spOworCXJldHVybl9VSU5UMzIocGFja2FnZV9sZW5ndGgpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTM1LDE2ICsxMjYsMTUgQEAKIHU4ICphY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfZW5kKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUpCiB7CiAJdTggKnN0YXJ0ID0gcGFyc2VyX3N0YXRlLT5hbWw7Ci0JYWNwaV9uYXRpdmVfdWludCBsZW5ndGg7CisJdTMyIHBhY2thZ2VfbGVuZ3RoOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgicHNfZ2V0X25leHRfcGFja2FnZV9lbmQiKTsKIAotCS8qIEZ1bmN0aW9uIGJlbG93IGNoYW5nZXMgcGFyc2VyX3N0YXRlLT5BbWwgKi8KKwkvKiBGdW5jdGlvbiBiZWxvdyB1cGRhdGVzIHBhcnNlcl9zdGF0ZS0+QW1sICovCiAKLQlsZW5ndGggPQotCSAgICAoYWNwaV9uYXRpdmVfdWludCkgYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2xlbmd0aChwYXJzZXJfc3RhdGUpOworCXBhY2thZ2VfbGVuZ3RoID0gYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2xlbmd0aChwYXJzZXJfc3RhdGUpOwogCi0JcmV0dXJuX1BUUihzdGFydCArIGxlbmd0aCk7CS8qIGVuZCBvZiBwYWNrYWdlICovCisJcmV0dXJuX1BUUihzdGFydCArIHBhY2thZ2VfbGVuZ3RoKTsJLyogZW5kIG9mIHBhY2thZ2UgKi8KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE2OSwxNyArMTU5LDE1IEBACiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJwc19nZXRfbmV4dF9uYW1lc3RyaW5nIik7CiAKLQkvKiBIYW5kbGUgbXVsdGlwbGUgcHJlZml4IGNoYXJhY3RlcnMgKi8KKwkvKiBQb2ludCBwYXN0IGFueSBuYW1lc3RyaW5nIHByZWZpeCBjaGFyYWN0ZXJzIChiYWNrc2xhc2ggb3IgY2FyYXQpICovCiAKLQl3aGlsZSAoYWNwaV9wc19pc19wcmVmaXhfY2hhcihBQ1BJX0dFVDgoZW5kKSkpIHsKLQkJLyogSW5jbHVkZSBwcmVmaXggJ1xcJyBvciAnXicgKi8KLQorCXdoaWxlIChhY3BpX3BzX2lzX3ByZWZpeF9jaGFyKCplbmQpKSB7CiAJCWVuZCsrOwogCX0KIAotCS8qIERlY29kZSB0aGUgcGF0aCAqLworCS8qIERlY29kZSB0aGUgcGF0aCBwcmVmaXggY2hhcmFjdGVyICovCiAKLQlzd2l0Y2ggKEFDUElfR0VUOChlbmQpKSB7CisJc3dpdGNoICgqZW5kKSB7CiAJY2FzZSAwOgogCiAJCS8qIG51bGxfbmFtZSAqLwpAQCAtMTk5LDkgKzE4Nyw5IEBACiAKIAljYXNlIEFNTF9NVUxUSV9OQU1FX1BSRUZJWF9PUDoKIAotCQkvKiBNdWx0aXBsZSBuYW1lIHNlZ21lbnRzLCA0IGNoYXJzIGVhY2ggKi8KKwkJLyogTXVsdGlwbGUgbmFtZSBzZWdtZW50cywgNCBjaGFycyBlYWNoLCBjb3VudCBpbiBuZXh0IGJ5dGUgKi8KIAotCQllbmQgKz0gMiArICgoYWNwaV9zaXplKSBBQ1BJX0dFVDgoZW5kICsgMSkgKiBBQ1BJX05BTUVfU0laRSk7CisJCWVuZCArPSAyICsgKCooZW5kICsgMSkgKiBBQ1BJX05BTUVfU0laRSk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTIxMiw3ICsyMDAsNyBAQAogCQlicmVhazsKIAl9CiAKLQlwYXJzZXJfc3RhdGUtPmFtbCA9ICh1OCAqKSBlbmQ7CisJcGFyc2VyX3N0YXRlLT5hbWwgPSBlbmQ7CiAJcmV0dXJuX1BUUigoY2hhciAqKXN0YXJ0KTsKIH0KIApAQCAtMjI0LDcgKzIxMiw3IEBACiAgKiAgICAgICAgICAgICAgQXJnICAgICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBuYW1lcGF0aCB3aWxsIGJlIHN0b3JlZAogICogICAgICAgICAgICAgIGFyZ19jb3VudCAgICAgICAgICAgLSBJZiB0aGUgbmFtZXBhdGggcG9pbnRzIHRvIGEgY29udHJvbCBtZXRob2QKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1ldGhvZCdzIGFyZ3VtZW50IGlzIHJldHVybmVkIGhlcmUuCi0gKiAgICAgICAgICAgICAgbWV0aG9kX2NhbGwgICAgICAgICAtIFdoZXRoZXIgdGhlIG5hbWVwYXRoIGNhbiBwb3NzaWJseSBiZSB0aGUKKyAqICAgICAgICAgICAgICBwb3NzaWJsZV9tZXRob2RfY2FsbCAtIFdoZXRoZXIgdGhlIG5hbWVwYXRoIGNhbiBwb3NzaWJseSBiZSB0aGUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgb2YgYSBtZXRob2QgY2FsbAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKQEAgLTI0MCwxMSArMjI4LDExIEBACiBhY3BpX3N0YXR1cwogYWNwaV9wc19nZXRfbmV4dF9uYW1lcGF0aChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAogCQkJICBzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlLAotCQkJICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnLCB1OCBtZXRob2RfY2FsbCkKKwkJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZywgdTggcG9zc2libGVfbWV0aG9kX2NhbGwpCiB7CiAJY2hhciAqcGF0aDsKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqbmFtZV9vcDsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbWV0aG9kX2Rlc2M7CiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CiAJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlIHNjb3BlX2luZm87CkBAIC0yNTIsMTE1ICsyNDAsMTI3IEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSgicHNfZ2V0X25leHRfbmFtZXBhdGgiKTsKIAogCXBhdGggPSBhY3BpX3BzX2dldF9uZXh0X25hbWVzdHJpbmcocGFyc2VyX3N0YXRlKTsKKwlhY3BpX3BzX2luaXRfb3AoYXJnLCBBTUxfSU5UX05BTUVQQVRIX09QKTsKIAotCS8qIE51bGwgcGF0aCBjYXNlIGlzIGFsbG93ZWQgKi8KKwkvKiBOdWxsIHBhdGggY2FzZSBpcyBhbGxvd2VkLCBqdXN0IGV4aXQgKi8KIAotCWlmIChwYXRoKSB7Ci0JCS8qCi0JCSAqIExvb2t1cCB0aGUgbmFtZSBpbiB0aGUgaW50ZXJuYWwgbmFtZXNwYWNlCi0JCSAqLwotCQlzY29wZV9pbmZvLnNjb3BlLm5vZGUgPSBOVUxMOwotCQlub2RlID0gcGFyc2VyX3N0YXRlLT5zdGFydF9ub2RlOwotCQlpZiAobm9kZSkgewotCQkJc2NvcGVfaW5mby5zY29wZS5ub2RlID0gbm9kZTsKLQkJfQorCWlmICghcGF0aCkgeworCQlhcmctPmNvbW1vbi52YWx1ZS5uYW1lID0gcGF0aDsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CiAKLQkJLyoKLQkJICogTG9va3VwIG9iamVjdC4gIFdlIGRvbid0IHdhbnQgdG8gYWRkIGFueXRoaW5nIG5ldyB0byB0aGUgbmFtZXNwYWNlCi0JCSAqIGhlcmUsIGhvd2V2ZXIuICBTbyB3ZSB1c2UgTU9ERV9FWEVDVVRFLiAgQWxsb3cgc2VhcmNoaW5nIG9mIHRoZQotCQkgKiBwYXJlbnQgdHJlZSwgYnV0IGRvbid0IG9wZW4gYSBuZXcgc2NvcGUgLS0gd2UganVzdCB3YW50IHRvIGxvb2t1cCB0aGUKLQkJICogb2JqZWN0ICAoTVVTVCBCRSBtb2RlIEVYRUNVVEUgdG8gcGVyZm9ybSB1cHNlYXJjaCkKLQkJICovCi0JCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwKCZzY29wZV9pbmZvLCBwYXRoLCBBQ1BJX1RZUEVfQU5ZLAotCQkJCQlBQ1BJX0lNT0RFX0VYRUNVVEUsCi0JCQkJCUFDUElfTlNfU0VBUkNIX1BBUkVOVCB8Ci0JCQkJCUFDUElfTlNfRE9OVF9PUEVOX1NDT1BFLCBOVUxMLCAmbm9kZSk7Ci0JCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAmJiBtZXRob2RfY2FsbCkgewotCQkJaWYgKG5vZGUtPnR5cGUgPT0gQUNQSV9UWVBFX01FVEhPRCkgewotCQkJCS8qIFRoaXMgbmFtZSBpcyBhY3R1YWxseSBhIGNvbnRyb2wgbWV0aG9kIGludm9jYXRpb24gKi8KKwkvKiBTZXR1cCBzZWFyY2ggc2NvcGUgaW5mbyAqLwogCi0JCQkJbWV0aG9kX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKLQkJCQkJCSAgIkNvbnRyb2wgTWV0aG9kIC0gJXAgRGVzYyAlcCBQYXRoPSVwXG4iLAotCQkJCQkJICBub2RlLCBtZXRob2RfZGVzYywgcGF0aCkpOwotCi0JCQkJbmFtZV9vcCA9IGFjcGlfcHNfYWxsb2Nfb3AoQU1MX0lOVF9OQU1FUEFUSF9PUCk7Ci0JCQkJaWYgKCFuYW1lX29wKSB7Ci0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCQkJCX0KLQotCQkJCS8qIENoYW5nZSBhcmcgaW50byBhIE1FVEhPRCBDQUxMIGFuZCBhdHRhY2ggbmFtZSB0byBpdCAqLwotCi0JCQkJYWNwaV9wc19pbml0X29wKGFyZywgQU1MX0lOVF9NRVRIT0RDQUxMX09QKTsKLQkJCQluYW1lX29wLT5jb21tb24udmFsdWUubmFtZSA9IHBhdGg7Ci0KLQkJCQkvKiBQb2ludCBNRVRIT0RDQUxML05BTUUgdG8gdGhlIE1FVEhPRCBOb2RlICovCi0KLQkJCQluYW1lX29wLT5jb21tb24ubm9kZSA9IG5vZGU7Ci0JCQkJYWNwaV9wc19hcHBlbmRfYXJnKGFyZywgbmFtZV9vcCk7Ci0KLQkJCQlpZiAoIW1ldGhvZF9kZXNjKSB7Ci0JCQkJCUFDUElfUkVQT1JUX0VSUk9SKCgicHNfZ2V0X25leHRfbmFtZXBhdGg6IENvbnRyb2wgTWV0aG9kICVwIGhhcyBubyBhdHRhY2hlZCBvYmplY3RcbiIsIG5vZGUpKTsKLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7Ci0JCQkJfQotCi0JCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKLQkJCQkJCSAgIkNvbnRyb2wgTWV0aG9kIC0gJXAgQXJncyAlWFxuIiwKLQkJCQkJCSAgbm9kZSwKLQkJCQkJCSAgbWV0aG9kX2Rlc2MtPm1ldGhvZC4KLQkJCQkJCSAgcGFyYW1fY291bnQpKTsKLQotCQkJCS8qIEdldCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBleHBlY3QgKi8KLQotCQkJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9Ci0JCQkJICAgIG1ldGhvZF9kZXNjLT5tZXRob2QucGFyYW1fY291bnQ7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIEVsc2UgdGhpcyBpcyBub3JtYWwgbmFtZWQgb2JqZWN0IHJlZmVyZW5jZS4KLQkJCSAqIEp1c3QgaW5pdCB0aGUgTkFNRVBBVEggb2JqZWN0IHdpdGggdGhlIHBhdGhuYW1lLgotCQkJICogKFNlZSBjb2RlIGJlbG93KQotCQkJICovCi0JCX0KLQotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCS8qCi0JCQkgKiAxKSBBbnkgZXJyb3Igb3RoZXIgdGhhbiBOT1RfRk9VTkQgaXMgYWx3YXlzIHNldmVyZQotCQkJICogMikgTk9UX0ZPVU5EIGlzIG9ubHkgaW1wb3J0YW50IGlmIHdlIGFyZSBleGVjdXRpbmcgYSBtZXRob2QuCi0JCQkgKiAzKSBJZiBleGVjdXRpbmcgYSBjb25kX3JlZl9vZiBvcGNvZGUsIE5PVF9GT1VORCBpcyBvay4KLQkJCSAqLwotCQkJaWYgKCgoKHdhbGtfc3RhdGUtPgotCQkJICAgICAgIHBhcnNlX2ZsYWdzICYgQUNQSV9QQVJTRV9NT0RFX01BU0spID09Ci0JCQkgICAgICBBQ1BJX1BBUlNFX0VYRUNVVEUpICYmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKQotCQkJICAgICAmJiAod2Fsa19zdGF0ZS0+b3AtPmNvbW1vbi5hbWxfb3Bjb2RlICE9Ci0JCQkJIEFNTF9DT05EX1JFRl9PRl9PUCkpCi0JCQkgICAgfHwgKHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpKSB7Ci0JCQkJQUNQSV9SRVBPUlRfTlNFUlJPUihwYXRoLCBzdGF0dXMpOwotCi0JCQkJYWNwaV9vc19wcmludGYKLQkJCQkgICAgKCJzZWFyY2hfbm9kZSAlcCBzdGFydF9ub2RlICVwIHJldHVybl9ub2RlICVwXG4iLAotCQkJCSAgICAgc2NvcGVfaW5mby5zY29wZS5ub2RlLAotCQkJCSAgICAgcGFyc2VyX3N0YXRlLT5zdGFydF9ub2RlLCBub2RlKTsKLQotCQkJfSBlbHNlIHsKLQkJCQkvKgotCQkJCSAqIFdlIGdvdCBhIE5PVF9GT1VORCBkdXJpbmcgdGFibGUgbG9hZCBvciB3ZSBlbmNvdW50ZXJlZAotCQkJCSAqIGEgY29uZF9yZWZfb2YoeCkgd2hlcmUgdGhlIHRhcmdldCBkb2VzIG5vdCBleGlzdC4KLQkJCQkgKiBFaXRoZXIgY2FzZSBpcyBvawotCQkJCSAqLwotCQkJCXN0YXR1cyA9IEFFX09LOwotCQkJfQotCQl9CisJc2NvcGVfaW5mby5zY29wZS5ub2RlID0gTlVMTDsKKwlub2RlID0gcGFyc2VyX3N0YXRlLT5zdGFydF9ub2RlOworCWlmIChub2RlKSB7CisJCXNjb3BlX2luZm8uc2NvcGUubm9kZSA9IG5vZGU7CiAJfQogCiAJLyoKLQkgKiBSZWdhcmRsZXNzIG9mIHN1Y2Nlc3MvZmFpbHVyZSBhYm92ZSwKLQkgKiBKdXN0IGluaXRpYWxpemUgdGhlIE9wIHdpdGggdGhlIHBhdGhuYW1lLgorCSAqIExvb2t1cCB0aGUgbmFtZSBpbiB0aGUgaW50ZXJuYWwgbmFtZXNwYWNlLiBXZSBkb24ndCB3YW50IHRvIGFkZAorCSAqIGFueXRoaW5nIG5ldyB0byB0aGUgbmFtZXNwYWNlIGhlcmUsIGhvd2V2ZXIsIHNvIHdlIHVzZSBNT0RFX0VYRUNVVEUuCisJICogQWxsb3cgc2VhcmNoaW5nIG9mIHRoZSBwYXJlbnQgdHJlZSwgYnV0IGRvbid0IG9wZW4gYSBuZXcgc2NvcGUgLQorCSAqIHdlIGp1c3Qgd2FudCB0byBsb29rdXAgdGhlIG9iamVjdCAobXVzdCBiZSBtb2RlIEVYRUNVVEUgdG8gcGVyZm9ybQorCSAqIHRoZSB1cHNlYXJjaCkKIAkgKi8KLQlhY3BpX3BzX2luaXRfb3AoYXJnLCBBTUxfSU5UX05BTUVQQVRIX09QKTsKLQlhcmctPmNvbW1vbi52YWx1ZS5uYW1lID0gcGF0aDsKKwlzdGF0dXMgPQorCSAgICBhY3BpX25zX2xvb2t1cCgmc2NvcGVfaW5mbywgcGF0aCwgQUNQSV9UWVBFX0FOWSwgQUNQSV9JTU9ERV9FWEVDVVRFLAorCQkJICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5UIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUsCisJCQkgICBOVUxMLCAmbm9kZSk7CiAKKwkvKgorCSAqIElmIHRoaXMgbmFtZSBpcyBhIGNvbnRyb2wgbWV0aG9kIGludm9jYXRpb24sIHdlIG11c3QKKwkgKiBzZXR1cCB0aGUgbWV0aG9kIGNhbGwKKwkgKi8KKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykgJiYKKwkgICAgcG9zc2libGVfbWV0aG9kX2NhbGwgJiYgKG5vZGUtPnR5cGUgPT0gQUNQSV9UWVBFX01FVEhPRCkpIHsKKwkJLyogVGhpcyBuYW1lIGlzIGFjdHVhbGx5IGEgY29udHJvbCBtZXRob2QgaW52b2NhdGlvbiAqLworCisJCW1ldGhvZF9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAorCQkJCSAgIkNvbnRyb2wgTWV0aG9kIC0gJXAgRGVzYyAlcCBQYXRoPSVwXG4iLCBub2RlLAorCQkJCSAgbWV0aG9kX2Rlc2MsIHBhdGgpKTsKKworCQluYW1lX29wID0gYWNwaV9wc19hbGxvY19vcChBTUxfSU5UX05BTUVQQVRIX09QKTsKKwkJaWYgKCFuYW1lX29wKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwkJfQorCisJCS8qIENoYW5nZSBBcmcgaW50byBhIE1FVEhPRCBDQUxMIGFuZCBhdHRhY2ggbmFtZSB0byBpdCAqLworCisJCWFjcGlfcHNfaW5pdF9vcChhcmcsIEFNTF9JTlRfTUVUSE9EQ0FMTF9PUCk7CisJCW5hbWVfb3AtPmNvbW1vbi52YWx1ZS5uYW1lID0gcGF0aDsKKworCQkvKiBQb2ludCBNRVRIT0RDQUxML05BTUUgdG8gdGhlIE1FVEhPRCBOb2RlICovCisKKwkJbmFtZV9vcC0+Y29tbW9uLm5vZGUgPSBub2RlOworCQlhY3BpX3BzX2FwcGVuZF9hcmcoYXJnLCBuYW1lX29wKTsKKworCQlpZiAoIW1ldGhvZF9kZXNjKSB7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvbnRyb2wgTWV0aG9kICVwIGhhcyBubyBhdHRhY2hlZCBvYmplY3RcbiIsIG5vZGUpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOworCQl9CisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKKwkJCQkgICJDb250cm9sIE1ldGhvZCAtICVwIEFyZ3MgJVhcbiIsCisJCQkJICBub2RlLCBtZXRob2RfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50KSk7CisKKwkJLyogR2V0IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGV4cGVjdCAqLworCisJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IG1ldGhvZF9kZXNjLT5tZXRob2QucGFyYW1fY291bnQ7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyoKKwkgKiBTcGVjaWFsIGhhbmRsaW5nIGlmIHRoZSBuYW1lIHdhcyBub3QgZm91bmQgZHVyaW5nIHRoZSBsb29rdXAgLQorCSAqIHNvbWUgbm90X2ZvdW5kIGNhc2VzIGFyZSBhbGxvd2VkCisJICovCisJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpIHsKKwkJLyogMSkgbm90X2ZvdW5kIGlzIG9rIGR1cmluZyBsb2FkIHBhc3MgMS8yIChhbGxvdyBmb3J3YXJkIHJlZmVyZW5jZXMpICovCisKKwkJaWYgKCh3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyAmIEFDUElfUEFSU0VfTU9ERV9NQVNLKSAhPQorCQkgICAgQUNQSV9QQVJTRV9FWEVDVVRFKSB7CisJCQlzdGF0dXMgPSBBRV9PSzsKKwkJfQorCisJCS8qIDIpIG5vdF9mb3VuZCBkdXJpbmcgYSBjb25kX3JlZl9vZih4KSBpcyBvayBieSBkZWZpbml0aW9uICovCisKKwkJZWxzZSBpZiAod2Fsa19zdGF0ZS0+b3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09CisJCQkgQU1MX0NPTkRfUkVGX09GX09QKSB7CisJCQlzdGF0dXMgPSBBRV9PSzsKKwkJfQorCisJCS8qCisJCSAqIDMpIG5vdF9mb3VuZCB3aGlsZSBidWlsZGluZyBhIFBhY2thZ2UgaXMgb2sgYXQgdGhpcyBwb2ludCwgd2UKKwkJICogbWF5IGZsYWcgYXMgYW4gZXJyb3IgbGF0ZXIgaWYgc2xhY2sgbW9kZSBpcyBub3QgZW5hYmxlZC4KKwkJICogKFNvbWUgQVNMIGNvZGUgZGVwZW5kcyBvbiBhbGxvd2luZyB0aGlzIGJlaGF2aW9yKQorCQkgKi8KKwkJZWxzZSBpZiAoKGFyZy0+Y29tbW9uLnBhcmVudCkgJiYKKwkJCSAoKGFyZy0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KKwkJCSAgIEFNTF9QQUNLQUdFX09QKQorCQkJICB8fCAoYXJnLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PQorCQkJICAgICAgQU1MX1ZBUl9QQUNLQUdFX09QKSkpIHsKKwkJCXN0YXR1cyA9IEFFX09LOworCQl9CisJfQorCisJLyogRmluYWwgZXhjZXB0aW9uIGNoZWNrIChtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgZnJvbSBjb2RlIGFib3ZlKSAqLworCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfUkVQT1JUX05TRVJST1IocGF0aCwgc3RhdHVzKTsKKworCQlpZiAoKHdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICYgQUNQSV9QQVJTRV9NT0RFX01BU0spID09CisJCSAgICBBQ1BJX1BBUlNFX0VYRUNVVEUpIHsKKwkJCS8qIFJlcG9ydCBhIGNvbnRyb2wgbWV0aG9kIGV4ZWN1dGlvbiBlcnJvciAqLworCisJCQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9lcnJvcihzdGF0dXMsIHdhbGtfc3RhdGUpOworCQl9CisJfQorCisJLyogU2F2ZSB0aGUgbmFtZXBhdGggKi8KKworCWFyZy0+Y29tbW9uLnZhbHVlLm5hbWUgPSBwYXRoOwogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCkBAIC0zODIsNTkgKzM4Miw2MyBAQAogYWNwaV9wc19nZXRfbmV4dF9zaW1wbGVfYXJnKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUsCiAJCQkgICAgdTMyIGFyZ190eXBlLCB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnKQogeworCXUzMiBsZW5ndGg7CisJdTE2IG9wY29kZTsKKwl1OCAqYW1sID0gcGFyc2VyX3N0YXRlLT5hbWw7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMigicHNfZ2V0X25leHRfc2ltcGxlX2FyZyIsIGFyZ190eXBlKTsKIAogCXN3aXRjaCAoYXJnX3R5cGUpIHsKIAljYXNlIEFSR1BfQllURURBVEE6CiAKLQkJYWNwaV9wc19pbml0X29wKGFyZywgQU1MX0JZVEVfT1ApOwotCQlhcmctPmNvbW1vbi52YWx1ZS5pbnRlZ2VyID0gKHUzMikgQUNQSV9HRVQ4KHBhcnNlcl9zdGF0ZS0+YW1sKTsKLQkJcGFyc2VyX3N0YXRlLT5hbWwrKzsKKwkJLyogR2V0IDEgYnl0ZSBmcm9tIHRoZSBBTUwgc3RyZWFtICovCisKKwkJb3Bjb2RlID0gQU1MX0JZVEVfT1A7CisJCWFyZy0+Y29tbW9uLnZhbHVlLmludGVnZXIgPSAoYWNwaV9pbnRlZ2VyKSAqIGFtbDsKKwkJbGVuZ3RoID0gMTsKIAkJYnJlYWs7CiAKIAljYXNlIEFSR1BfV09SRERBVEE6CiAKLQkJYWNwaV9wc19pbml0X29wKGFyZywgQU1MX1dPUkRfT1ApOwotCiAJCS8qIEdldCAyIGJ5dGVzIGZyb20gdGhlIEFNTCBzdHJlYW0gKi8KIAotCQlBQ1BJX01PVkVfMTZfVE9fMzIoJmFyZy0+Y29tbW9uLnZhbHVlLmludGVnZXIsCi0JCQkJICAgcGFyc2VyX3N0YXRlLT5hbWwpOwotCQlwYXJzZXJfc3RhdGUtPmFtbCArPSAyOworCQlvcGNvZGUgPSBBTUxfV09SRF9PUDsKKwkJQUNQSV9NT1ZFXzE2X1RPXzY0KCZhcmctPmNvbW1vbi52YWx1ZS5pbnRlZ2VyLCBhbWwpOworCQlsZW5ndGggPSAyOwogCQlicmVhazsKIAogCWNhc2UgQVJHUF9EV09SRERBVEE6CiAKLQkJYWNwaV9wc19pbml0X29wKGFyZywgQU1MX0RXT1JEX09QKTsKLQogCQkvKiBHZXQgNCBieXRlcyBmcm9tIHRoZSBBTUwgc3RyZWFtICovCiAKLQkJQUNQSV9NT1ZFXzMyX1RPXzMyKCZhcmctPmNvbW1vbi52YWx1ZS5pbnRlZ2VyLAotCQkJCSAgIHBhcnNlcl9zdGF0ZS0+YW1sKTsKLQkJcGFyc2VyX3N0YXRlLT5hbWwgKz0gNDsKKwkJb3Bjb2RlID0gQU1MX0RXT1JEX09QOworCQlBQ1BJX01PVkVfMzJfVE9fNjQoJmFyZy0+Y29tbW9uLnZhbHVlLmludGVnZXIsIGFtbCk7CisJCWxlbmd0aCA9IDQ7CiAJCWJyZWFrOwogCiAJY2FzZSBBUkdQX1FXT1JEREFUQToKIAotCQlhY3BpX3BzX2luaXRfb3AoYXJnLCBBTUxfUVdPUkRfT1ApOwotCiAJCS8qIEdldCA4IGJ5dGVzIGZyb20gdGhlIEFNTCBzdHJlYW0gKi8KIAotCQlBQ1BJX01PVkVfNjRfVE9fNjQoJmFyZy0+Y29tbW9uLnZhbHVlLmludGVnZXIsCi0JCQkJICAgcGFyc2VyX3N0YXRlLT5hbWwpOwotCQlwYXJzZXJfc3RhdGUtPmFtbCArPSA4OworCQlvcGNvZGUgPSBBTUxfUVdPUkRfT1A7CisJCUFDUElfTU9WRV82NF9UT182NCgmYXJnLT5jb21tb24udmFsdWUuaW50ZWdlciwgYW1sKTsKKwkJbGVuZ3RoID0gODsKIAkJYnJlYWs7CiAKIAljYXNlIEFSR1BfQ0hBUkxJU1Q6CiAKLQkJYWNwaV9wc19pbml0X29wKGFyZywgQU1MX1NUUklOR19PUCk7Ci0JCWFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZyA9IChjaGFyICopcGFyc2VyX3N0YXRlLT5hbWw7CisJCS8qIEdldCBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZywgcG9pbnQgcGFzdCB0aGUgc3RyaW5nICovCiAKLQkJd2hpbGUgKEFDUElfR0VUOChwYXJzZXJfc3RhdGUtPmFtbCkgIT0gJ1wwJykgewotCQkJcGFyc2VyX3N0YXRlLT5hbWwrKzsKKwkJb3Bjb2RlID0gQU1MX1NUUklOR19PUDsKKwkJYXJnLT5jb21tb24udmFsdWUuc3RyaW5nID0gQUNQSV9DQVNUX1BUUihjaGFyLCBhbWwpOworCisJCS8qIEZpbmQgdGhlIG51bGwgdGVybWluYXRvciAqLworCisJCWxlbmd0aCA9IDA7CisJCXdoaWxlIChhbWxbbGVuZ3RoXSkgeworCQkJbGVuZ3RoKys7CiAJCX0KLQkJcGFyc2VyX3N0YXRlLT5hbWwrKzsKKwkJbGVuZ3RoKys7CiAJCWJyZWFrOwogCiAJY2FzZSBBUkdQX05BTUU6CkBAIC00NDMsMTQgKzQ0NywxNiBAQAogCQlhY3BpX3BzX2luaXRfb3AoYXJnLCBBTUxfSU5UX05BTUVQQVRIX09QKTsKIAkJYXJnLT5jb21tb24udmFsdWUubmFtZSA9CiAJCSAgICBhY3BpX3BzX2dldF9uZXh0X25hbWVzdHJpbmcocGFyc2VyX3N0YXRlKTsKLQkJYnJlYWs7CisJCXJldHVybl9WT0lEOwogCiAJZGVmYXVsdDoKIAogCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkludmFsaWQgYXJnX3R5cGUgJVhcbiIsIGFyZ190eXBlKSk7Ci0JCWJyZWFrOworCQlyZXR1cm5fVk9JRDsKIAl9CiAKKwlhY3BpX3BzX2luaXRfb3AoYXJnLCBvcGNvZGUpOworCXBhcnNlcl9zdGF0ZS0+YW1sICs9IGxlbmd0aDsKIAlyZXR1cm5fVk9JRDsKIH0KIApAQCAtNTQwLDcgKzU0Niw3IEBACiAJCSAqIGFjY2Vzc190eXBlIGlzIGZpcnN0IG9wZXJhbmQsIGFjY2Vzc19hdHRyaWJ1dGUgaXMgc2Vjb25kCiAJCSAqLwogCQlmaWVsZC0+Y29tbW9uLnZhbHVlLmludGVnZXIgPQotCQkgICAgKEFDUElfR0VUOChwYXJzZXJfc3RhdGUtPmFtbCkgPDwgOCk7CisJCSAgICAoKCh1MzIpIEFDUElfR0VUOChwYXJzZXJfc3RhdGUtPmFtbCkgPDwgOCkpOwogCQlwYXJzZXJfc3RhdGUtPmFtbCsrOwogCQlmaWVsZC0+Y29tbW9uLnZhbHVlLmludGVnZXIgfD0gQUNQSV9HRVQ4KHBhcnNlcl9zdGF0ZS0+YW1sKTsKIAkJcGFyc2VyX3N0YXRlLT5hbWwrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNsb29wLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzbG9vcC5jCmluZGV4IDA4OGQzMzkuLmM2NjAyOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNsb29wLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc2xvb3AuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTEyMywxNiArMTIzLDEwIEBACiAJCQkJICAgICYmICgoc3RhdHVzICYgQUVfQ09ERV9NQVNLKSAhPQogCQkJCQlBRV9DT0RFX0NPTlRST0wpKSB7CiAJCQkJCWlmIChzdGF0dXMgPT0gQUVfQU1MX05PX1JFVFVSTl9WQUxVRSkgewotCQkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCQkJICAiSW52b2tlZCBtZXRob2QgZGlkIG5vdCByZXR1cm4gYSB2YWx1ZSwgJXNcbiIsCi0JCQkJCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uCi0JCQkJCQkJCSAgKHN0YXR1cykpKTsKKwkJCQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiSW52b2tlZCBtZXRob2QgZGlkIG5vdCByZXR1cm4gYSB2YWx1ZSwgJXNcbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAKIAkJCQkJfQotCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJCSAgImdldF9wcmVkaWNhdGUgRmFpbGVkLCAlc1xuIiwKLQkJCQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbgotCQkJCQkJCSAgKHN0YXR1cykpKTsKKwkJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJnZXRfcHJlZGljYXRlIEZhaWxlZCwgJXNcbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJCX0KIApAQCAtMTkwLDExICsxODQsNyBAQAogCiAJCQkJLyogVGhlIG9wY29kZSBpcyB1bnJlY29nbml6ZWQuICBKdXN0IHNraXAgdW5rbm93biBvcGNvZGVzICovCiAKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJICAiRm91bmQgdW5rbm93biBvcGNvZGUgJVggYXQgQU1MIGFkZHJlc3MgJXAgb2Zmc2V0ICVYLCBpZ25vcmluZ1xuIiwKLQkJCQkJCSAgd2Fsa19zdGF0ZS0+b3Bjb2RlLAotCQkJCQkJICBwYXJzZXJfc3RhdGUtPmFtbCwKLQkJCQkJCSAgd2Fsa19zdGF0ZS0+YW1sX29mZnNldCkpOworCQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiRm91bmQgdW5rbm93biBvcGNvZGUgJVggYXQgQU1MIGFkZHJlc3MgJXAgb2Zmc2V0ICVYLCBpZ25vcmluZ1xuIiwgd2Fsa19zdGF0ZS0+b3Bjb2RlLCBwYXJzZXJfc3RhdGUtPmFtbCwgd2Fsa19zdGF0ZS0+YW1sX29mZnNldCkpOwogCiAJCQkJQUNQSV9EVU1QX0JVRkZFUihwYXJzZXJfc3RhdGUtPmFtbCwgMTI4KTsKIApAQCAtMjgxLDEwICsyNzEsNyBAQAogCQkJCSAgICB3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrKHdhbGtfc3RhdGUsCiAJCQkJCQkJCSAgICAmb3ApOwogCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJCSAgIkR1cmluZyBuYW1lIGxvb2t1cC9jYXRhbG9nLCAlc1xuIiwKLQkJCQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbgotCQkJCQkJCSAgKHN0YXR1cykpKTsKKwkJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJEdXJpbmcgbmFtZSBsb29rdXAvY2F0YWxvZywgJXNcbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKIAkJCQl9CiAKQEAgLTcwNCw2ICs2OTEsMTUgQEAKIAkJCQlhY3BpX3BzX3BvcF9zY29wZShwYXJzZXJfc3RhdGUsICZvcCwKIAkJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ190eXBlcywKIAkJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7CisKKwkJCQlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlICE9IEFNTF9XSElMRV9PUCkgeworCQkJCQlzdGF0dXMyID0KKwkJCQkJICAgIGFjcGlfZHNfcmVzdWx0X3N0YWNrX3BvcAorCQkJCQkgICAgKHdhbGtfc3RhdGUpOworCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1czIpKSB7CisJCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzMik7CisJCQkJCX0KKwkJCQl9CiAJCQl9CiAKIAkJCS8qIENsb3NlIHRoaXMgaXRlcmF0aW9uIG9mIHRoZSBXaGlsZSBsb29wICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzb3Bjb2RlLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzb3Bjb2RlLmMKaW5kZXggMjI5YWU4Ni4uMTFkNjM1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc29wY29kZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNvcGNvZGUuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTc0Nyw3ICs3NDcsNyBAQAogCiAJLyogVW5rbm93biBBTUwgb3Bjb2RlICovCiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKIAkJCSAgIlVua25vd24gQU1MIG9wY29kZSBbJTQuNFhdXG4iLCBvcGNvZGUpKTsKIAogCXJldHVybiAoJmFjcGlfZ2JsX2FtbF9vcF9pbmZvW19VTktdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNwYXJzZS5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3BhcnNlLmMKaW5kZXggNzZkNGQ2NC4uM2I1NDBmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3BhcnNlLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3BhcnNlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zMzMsNyArMzMzLDYgQEAKIAogCXN3aXRjaCAoY2FsbGJhY2tfc3RhdHVzKSB7CiAJY2FzZSBBRV9DVFJMX1RFUk1JTkFURToKLQogCQkvKgogCQkgKiBBIGNvbnRyb2wgbWV0aG9kIHdhcyB0ZXJtaW5hdGVkIHZpYSBhIFJFVFVSTiBzdGF0ZW1lbnQuCiAJCSAqIFRoZSB3YWxrIG9mIHRoaXMgbWV0aG9kIGlzIGNvbXBsZXRlLgpAQCAtMzQ2LDEzICszNDUsMTkgQEAKIAogCQlwYXJzZXJfc3RhdGUtPmFtbCA9IHdhbGtfc3RhdGUtPmFtbF9sYXN0X3doaWxlOwogCQl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24udmFsdWUgPSBGQUxTRTsKLQkJc3RhdHVzID0gQUVfQ1RSTF9CUkVBSzsKKwkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfc3RhY2tfcG9wKHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9IEFFX0NUUkxfQlJFQUs7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFFX0NUUkxfQ09OVElOVUU6CiAKIAkJcGFyc2VyX3N0YXRlLT5hbWwgPSB3YWxrX3N0YXRlLT5hbWxfbGFzdF93aGlsZTsKLQkJc3RhdHVzID0gQUVfQ1RSTF9DT05USU5VRTsKKwkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfc3RhY2tfcG9wKHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9IEFFX0NUUkxfQ09OVElOVUU7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFFX0NUUkxfUEVORElORzoKQEAgLTM2OSwxNiArMzc0LDE4IEBACiAjZW5kaWYKIAogCWNhc2UgQUVfQ1RSTF9UUlVFOgotCiAJCS8qCiAJCSAqIFByZWRpY2F0ZSBvZiBhbiBJRiB3YXMgdHJ1ZSwgYW5kIHdlIGFyZSBhdCB0aGUgbWF0Y2hpbmcgRUxTRS4KIAkJICogSnVzdCBjbG9zZSBvdXQgdGhpcyBwYWNrYWdlCiAJCSAqLwogCQlwYXJzZXJfc3RhdGUtPmFtbCA9IGFjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9lbmQocGFyc2VyX3N0YXRlKTsKKwkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfc3RhY2tfcG9wKHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXN0YXR1cyA9IEFFX0NUUkxfUEVORElORzsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgQUVfQ1RSTF9GQUxTRToKLQogCQkvKgogCQkgKiBFaXRoZXIgYW4gSUYvV0hJTEUgUHJlZGljYXRlIHdhcyBmYWxzZSBvciB3ZSBlbmNvdW50ZXJlZCBhIEJSRUFLCiAJCSAqIG9wY29kZS4gIEluIGJvdGggY2FzZXMsIHdlIGRvIG5vdCBleGVjdXRlIHRoZSByZXN0IG9mIHRoZQpAQCAtNTAzLDIyICs1MTAsMjMgQEAKIAkJfSBlbHNlIGlmIChzdGF0dXMgPT0gQUVfQ1RSTF9URVJNSU5BVEUpIHsKIAkJCXN0YXR1cyA9IEFFX09LOwogCQl9IGVsc2UgaWYgKChzdGF0dXMgIT0gQUVfT0spICYmICh3YWxrX3N0YXRlLT5tZXRob2RfZGVzYykpIHsKLQkJCUFDUElfUkVQT1JUX01FVEhPRF9FUlJPUigiTWV0aG9kIGV4ZWN1dGlvbiBmYWlsZWQiLAotCQkJCQkJIHdhbGtfc3RhdGUtPm1ldGhvZF9ub2RlLCBOVUxMLAotCQkJCQkJIHN0YXR1cyk7CisJCQkvKiBFaXRoZXIgdGhlIG1ldGhvZCBwYXJzZSBvciBhY3R1YWwgZXhlY3V0aW9uIGZhaWxlZCAqLwogCi0JCQkvKiBFbnN1cmUgcHJvcGVyIGNsZWFudXAgKi8KLQotCQkJd2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgfD0gQUNQSV9QQVJTRV9FWEVDVVRFOworCQkJQUNQSV9SRVBPUlRfTVRFUlJPUigiTWV0aG9kIHBhcnNlL2V4ZWN1dGlvbiBmYWlsZWQiLAorCQkJCQkgICAgd2Fsa19zdGF0ZS0+bWV0aG9kX25vZGUsIE5VTEwsCisJCQkJCSAgICBzdGF0dXMpOwogCiAJCQkvKiBDaGVjayBmb3IgcG9zc2libGUgbXVsdGktdGhyZWFkIHJlZW50cmFuY3kgcHJvYmxlbSAqLwogCiAJCQlpZiAoKHN0YXR1cyA9PSBBRV9BTFJFQURZX0VYSVNUUykgJiYKIAkJCSAgICAoIXdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2Quc2VtYXBob3JlKSkgewogCQkJCS8qCi0JCQkJICogVGhpcyBtZXRob2QgaXMgbWFya2VkIG5vdF9zZXJpYWxpemVkLCBidXQgaXQgdHJpZWQgdG8gY3JlYXRlCisJCQkJICogTWV0aG9kIHRyaWVkIHRvIGNyZWF0ZSBhbiBvYmplY3QgdHdpY2UuIFRoZSBwcm9iYWJsZSBjYXVzZSBpcworCQkJCSAqIHRoYXQgdGhlIG1ldGhvZCBjYW5ub3QgaGFuZGxlIHJlZW50cmFuY3kuCisJCQkJICoKKwkJCQkgKiBUaGUgbWV0aG9kIGlzIG1hcmtlZCBub3Rfc2VyaWFsaXplZCwgYnV0IGl0IHRyaWVkIHRvIGNyZWF0ZQogCQkJCSAqIGEgbmFtZWQgb2JqZWN0LCBjYXVzaW5nIHRoZSBzZWNvbmQgdGhyZWFkIGVudHJhbmNlIHRvIGZhaWwuCi0JCQkJICogV2Ugd2lsbCB3b3JrYXJvdW5kIHRoaXMgYnkgbWFya2luZyB0aGUgbWV0aG9kIHBlcm1hbmVudGx5CisJCQkJICogV29ya2Fyb3VuZCB0aGlzIHByb2JsZW0gYnkgbWFya2luZyB0aGUgbWV0aG9kIHBlcm1hbmVudGx5CiAJCQkJICogYXMgU2VyaWFsaXplZC4KIAkJCQkgKi8KIAkJCQl3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLm1ldGhvZF9mbGFncyB8PQpAQCAtNTM2LDE1ICs1NDQsMjIgQEAKIAkJYWNwaV9kc19zY29wZV9zdGFja19jbGVhcih3YWxrX3N0YXRlKTsKIAogCQkvKgotCQkgKiBJZiB3ZSBqdXN0IHJldHVybmVkIGZyb20gdGhlIGV4ZWN1dGlvbiBvZiBhIGNvbnRyb2wgbWV0aG9kLAotCQkgKiB0aGVyZSdzIGxvdHMgb2YgY2xlYW51cCB0byBkbworCQkgKiBJZiB3ZSBqdXN0IHJldHVybmVkIGZyb20gdGhlIGV4ZWN1dGlvbiBvZiBhIGNvbnRyb2wgbWV0aG9kIG9yIGlmIHdlCisJCSAqIGVuY291bnRlcmVkIGFuIGVycm9yIGR1cmluZyB0aGUgbWV0aG9kIHBhcnNlIHBoYXNlLCB0aGVyZSdzIGxvdHMgb2YKKwkJICogY2xlYW51cCB0byBkbwogCQkgKi8KLQkJaWYgKCh3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyAmIEFDUElfUEFSU0VfTU9ERV9NQVNLKSA9PQotCQkgICAgQUNQSV9QQVJTRV9FWEVDVVRFKSB7CisJCWlmICgoKHdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICYgQUNQSV9QQVJTRV9NT0RFX01BU0spID09CisJCSAgICAgQUNQSV9QQVJTRV9FWEVDVVRFKSB8fCAoQUNQSV9GQUlMVVJFKHN0YXR1cykpKSB7CiAJCQlpZiAod2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MpIHsKIAkJCQkvKiBEZWNyZW1lbnQgdGhlIHRocmVhZCBjb3VudCBvbiB0aGUgbWV0aG9kIHBhcnNlIHRyZWUgKi8KIAotCQkJCXdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2QudGhyZWFkX2NvdW50LS07CisJCQkJaWYgKHdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2QuCisJCQkJICAgIHRocmVhZF9jb3VudCkgeworCQkJCQl3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLgorCQkJCQkgICAgdGhyZWFkX2NvdW50LS07CisJCQkJfSBlbHNlIHsKKwkJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJJbnZhbGlkIHplcm8gdGhyZWFkIGNvdW50IGluIG1ldGhvZFxuIikpOworCQkJCX0KIAkJCX0KIAogCQkJYWNwaV9kc190ZXJtaW5hdGVfY29udHJvbF9tZXRob2Qod2Fsa19zdGF0ZSk7CkBAIC01NTMsNyArNTY4LDYgQEAKIAkJLyogRGVsZXRlIHRoaXMgd2FsayBzdGF0ZSBhbmQgYWxsIGxpbmtlZCBjb250cm9sIHN0YXRlcyAqLwogCiAJCWFjcGlfcHNfY2xlYW51cF9zY29wZSgmd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKTsKLQogCQlwcmV2aW91c193YWxrX3N0YXRlID0gd2Fsa19zdGF0ZTsKIAogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3Njb3BlLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzc2NvcGUuYwppbmRleCAxYzk1M2I2Li5iYzYwNDdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzc2NvcGUuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzc2NvcGUuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN0cmVlLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzdHJlZS5jCmluZGV4IGYwZTc1NTguLmQzODdlMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN0cmVlLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3RyZWUuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTEzMiw3ICsxMzIsOCBAQAogCWlmIChvcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfVU5LTk9XTikgewogCQkvKiBJbnZhbGlkIG9wY29kZSAqLwogCi0JCUFDUElfUkVQT1JUX0VSUk9SKCgicHNfYXBwZW5kX2FyZzogSW52YWxpZCBBTUwgT3Bjb2RlOiAweCUyLjJYXG4iLCBvcC0+Y29tbW9uLmFtbF9vcGNvZGUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJJbnZhbGlkIEFNTCBPcGNvZGU6IDB4JTIuMlhcbiIsCisJCQkJICAgb3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSk7CiAJCXJldHVybjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN1dGlscy5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3V0aWxzLmMKaW5kZXggMjA3NWVmYi4uM2UwN2NiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3V0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3V0aWxzLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzd2Fsay5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3dhbGsuYwppbmRleCAwOGYyMzIxLi4wNmYwNWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzd2Fsay5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN3YWxrLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzeGZhY2UuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN4ZmFjZS5jCmluZGV4IDRkY2JkNDQuLjJkZDQ4Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN4ZmFjZS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNTAsNiArNTAsMTAgQEAKIEFDUElfTU9EVUxFX05BTUUoInBzeGZhY2UiKQogCiAvKiBMb2NhbCBQcm90b3R5cGVzICovCitzdGF0aWMgdm9pZCBhY3BpX3BzX3N0YXJ0X3RyYWNlKHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvKTsKKworc3RhdGljIHZvaWQgYWNwaV9wc19zdG9wX3RyYWNlKHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvKTsKKwogc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfcHNfZXhlY3V0ZV9wYXNzKHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvKTsKIAogc3RhdGljIHZvaWQKQEAgLTU3LDYgKzYxLDEzNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RlYnVnX3RyYWNlCisgKgorICogUEFSQU1FVEVSUzogIG1ldGhvZF9uYW1lICAgICAtIFZhbGlkIEFDUEkgbmFtZSBzdHJpbmcKKyAqICAgICAgICAgICAgICBkZWJ1Z19sZXZlbCAgICAgLSBPcHRpb25hbCBsZXZlbCBtYXNrLiAwIHRvIHVzZSBkZWZhdWx0CisgKiAgICAgICAgICAgICAgZGVidWdfbGF5ZXIgICAgIC0gT3B0aW9uYWwgbGF5ZXIgbWFzay4gMCB0byB1c2UgZGVmYXVsdAorICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAtIGJpdCAxOiBvbmUgc2hvdCgxKSBvciBwZXJzaXN0ZW50KDApCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBFeHRlcm5hbCBpbnRlcmZhY2UgdG8gZW5hYmxlIGRlYnVnIHRyYWNpbmcgZHVyaW5nIGNvbnRyb2wKKyAqICAgICAgICAgICAgICBtZXRob2QgZXhlY3V0aW9uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZGVidWdfdHJhY2UoY2hhciAqbmFtZSwgdTMyIGRlYnVnX2xldmVsLCB1MzIgZGVidWdfbGF5ZXIsIHUzMiBmbGFncykKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCS8qIFRCRHM6IFZhbGlkYXRlIG5hbWUsIGFsbG93IGZ1bGwgcGF0aCBvciBqdXN0IG5hbWVzZWcgKi8KKworCWFjcGlfZ2JsX3RyYWNlX21ldGhvZF9uYW1lID0gKkFDUElfQ0FTVF9QVFIodTMyLCBuYW1lKTsKKwlhY3BpX2dibF90cmFjZV9mbGFncyA9IGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsKSB7CisJCWFjcGlfZ2JsX3RyYWNlX2RiZ19sZXZlbCA9IGRlYnVnX2xldmVsOworCX0KKwlpZiAoZGVidWdfbGF5ZXIpIHsKKwkJYWNwaV9nYmxfdHJhY2VfZGJnX2xheWVyID0gZGVidWdfbGF5ZXI7CisJfQorCisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJcmV0dXJuIChBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfc3RhcnRfdHJhY2UKKyAqCisgKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgLSBNZXRob2QgaW5mbyBzdHJ1Y3QKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBTdGFydCBjb250cm9sIG1ldGhvZCBleGVjdXRpb24gdHJhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBhY3BpX3BzX3N0YXJ0X3RyYWNlKHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm47CisJfQorCisJaWYgKCghYWNwaV9nYmxfdHJhY2VfbWV0aG9kX25hbWUpIHx8CisJICAgIChhY3BpX2dibF90cmFjZV9tZXRob2RfbmFtZSAhPSBpbmZvLT5ub2RlLT5uYW1lLmludGVnZXIpKSB7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlhY3BpX2dibF9vcmlnaW5hbF9kYmdfbGV2ZWwgPSBhY3BpX2RiZ19sZXZlbDsKKwlhY3BpX2dibF9vcmlnaW5hbF9kYmdfbGF5ZXIgPSBhY3BpX2RiZ19sYXllcjsKKworCWFjcGlfZGJnX2xldmVsID0gMHgwMEZGRkZGRjsKKwlhY3BpX2RiZ19sYXllciA9IEFDUElfVUlOVDMyX01BWDsKKworCWlmIChhY3BpX2dibF90cmFjZV9kYmdfbGV2ZWwpIHsKKwkJYWNwaV9kYmdfbGV2ZWwgPSBhY3BpX2dibF90cmFjZV9kYmdfbGV2ZWw7CisJfQorCWlmIChhY3BpX2dibF90cmFjZV9kYmdfbGF5ZXIpIHsKKwkJYWNwaV9kYmdfbGF5ZXIgPSBhY3BpX2dibF90cmFjZV9kYmdfbGF5ZXI7CisJfQorCisgICAgICBleGl0OgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX3N0b3BfdHJhY2UKKyAqCisgKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgLSBNZXRob2QgaW5mbyBzdHJ1Y3QKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBTdG9wIGNvbnRyb2wgbWV0aG9kIGV4ZWN1dGlvbiB0cmFjZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGFjcGlfcHNfc3RvcF90cmFjZShzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbykKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuOworCX0KKworCWlmICgoIWFjcGlfZ2JsX3RyYWNlX21ldGhvZF9uYW1lKSB8fAorCSAgICAoYWNwaV9nYmxfdHJhY2VfbWV0aG9kX25hbWUgIT0gaW5mby0+bm9kZS0+bmFtZS5pbnRlZ2VyKSkgeworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogRGlzYWJsZSBmdXJ0aGVyIHRyYWNpbmcgaWYgdHlwZSBpcyBvbmUtc2hvdCAqLworCisJaWYgKGFjcGlfZ2JsX3RyYWNlX2ZsYWdzICYgMSkgeworCQlhY3BpX2dibF90cmFjZV9tZXRob2RfbmFtZSA9IDA7CisJCWFjcGlfZ2JsX3RyYWNlX2RiZ19sZXZlbCA9IDA7CisJCWFjcGlfZ2JsX3RyYWNlX2RiZ19sYXllciA9IDA7CisJfQorCisJYWNwaV9kYmdfbGV2ZWwgPSBhY3BpX2dibF9vcmlnaW5hbF9kYmdfbGV2ZWw7CisJYWNwaV9kYmdfbGF5ZXIgPSBhY3BpX2dibF9vcmlnaW5hbF9kYmdfbGF5ZXI7CisKKyAgICAgIGV4aXQ6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZXhlY3V0ZV9tZXRob2QKICAqCiAgKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gTWV0aG9kIGluZm8gYmxvY2ssIGNvbnRhaW5zOgpAQCAtMTA0LDYgKzIzOCwxMCBAQAogCSAqLwogCWFjcGlfcHNfdXBkYXRlX3BhcmFtZXRlcl9saXN0KGluZm8sIFJFRl9JTkNSRU1FTlQpOwogCisJLyogQmVnaW4gdHJhY2luZyBpZiByZXF1ZXN0ZWQgKi8KKworCWFjcGlfcHNfc3RhcnRfdHJhY2UoaW5mbyk7CisKIAkvKgogCSAqIDEpIFBlcmZvcm0gdGhlIGZpcnN0IHBhc3MgcGFyc2Ugb2YgdGhlIG1ldGhvZCB0byBlbnRlciBhbnkKIAkgKiAgICBuYW1lZCBvYmplY3RzIHRoYXQgaXQgY3JlYXRlcyBpbnRvIHRoZSBuYW1lc3BhY2UKQEAgLTEyOSw2ICsyNjcsMTAgQEAKIAlzdGF0dXMgPSBhY3BpX3BzX2V4ZWN1dGVfcGFzcyhpbmZvKTsKIAogICAgICAgY2xlYW51cDoKKwkvKiBFbmQgb3B0aW9uYWwgdHJhY2luZyAqLworCisJYWNwaV9wc19zdG9wX3RyYWNlKGluZm8pOworCiAJLyogVGFrZSBhd2F5IHRoZSBleHRyYSByZWZlcmVuY2UgdGhhdCB3ZSBnYXZlIHRoZSBwYXJhbWV0ZXJzIGFib3ZlICovCiAKIAlhY3BpX3BzX3VwZGF0ZV9wYXJhbWV0ZXJfbGlzdChpbmZvLCBSRUZfREVDUkVNRU5UKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMgYi9kcml2ZXJzL2FjcGkvcGNpX2lycS5jCmluZGV4IDA5NTY3YzIuLjY1YWVlNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9pcnEuYwpAQCAtMjU4LDcgKzI1OCw3IEBACiAKIHN0YXRpYyBpbnQKIGFjcGlfcGNpX2FsbG9jYXRlX2lycShzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKmVudHJ5LAotCQkgICAgICBpbnQgKmVkZ2VfbGV2ZWwsIGludCAqYWN0aXZlX2hpZ2hfbG93LCBjaGFyICoqbGluaykKKwkJICAgICAgaW50ICp0cmlnZ2VyaW5nLCBpbnQgKnBvbGFyaXR5LCBjaGFyICoqbGluaykKIHsKIAlpbnQgaXJxOwogCkBAIC0yNjYsOCArMjY2LDggQEAKIAogCWlmIChlbnRyeS0+bGluay5oYW5kbGUpIHsKIAkJaXJxID0gYWNwaV9wY2lfbGlua19hbGxvY2F0ZV9pcnEoZW50cnktPmxpbmsuaGFuZGxlLAotCQkJCQkJIGVudHJ5LT5saW5rLmluZGV4LCBlZGdlX2xldmVsLAotCQkJCQkJIGFjdGl2ZV9oaWdoX2xvdywgbGluayk7CisJCQkJCQkgZW50cnktPmxpbmsuaW5kZXgsIHRyaWdnZXJpbmcsCisJCQkJCQkgcG9sYXJpdHksIGxpbmspOwogCQlpZiAoaXJxIDwgMCkgewogCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAogCQkJCQkgICJJbnZhbGlkIElSUSBsaW5rIHJvdXRpbmcgZW50cnlcbiIpKTsKQEAgLTI3NSw4ICsyNzUsOCBAQAogCQl9CiAJfSBlbHNlIHsKIAkJaXJxID0gZW50cnktPmxpbmsuaW5kZXg7Ci0JCSplZGdlX2xldmVsID0gQUNQSV9MRVZFTF9TRU5TSVRJVkU7Ci0JCSphY3RpdmVfaGlnaF9sb3cgPSBBQ1BJX0FDVElWRV9MT1c7CisJCSp0cmlnZ2VyaW5nID0gQUNQSV9MRVZFTF9TRU5TSVRJVkU7CisJCSpwb2xhcml0eSA9IEFDUElfQUNUSVZFX0xPVzsKIAl9CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJGb3VuZCBJUlEgJWRcbiIsIGlycSkpOwpAQCAtMjg1LDcgKzI4NSw3IEBACiAKIHN0YXRpYyBpbnQKIGFjcGlfcGNpX2ZyZWVfaXJxKHN0cnVjdCBhY3BpX3BydF9lbnRyeSAqZW50cnksCi0JCSAgaW50ICplZGdlX2xldmVsLCBpbnQgKmFjdGl2ZV9oaWdoX2xvdywgY2hhciAqKmxpbmspCisJCSAgaW50ICp0cmlnZ2VyaW5nLCBpbnQgKnBvbGFyaXR5LCBjaGFyICoqbGluaykKIHsKIAlpbnQgaXJxOwogCkBAIC0zMDcsOCArMzA3LDggQEAKIGFjcGlfcGNpX2lycV9sb29rdXAoc3RydWN0IHBjaV9idXMgKmJ1cywKIAkJICAgIGludCBkZXZpY2UsCiAJCSAgICBpbnQgcGluLAotCQkgICAgaW50ICplZGdlX2xldmVsLAotCQkgICAgaW50ICphY3RpdmVfaGlnaF9sb3csIGNoYXIgKipsaW5rLCBpcnFfbG9va3VwX2Z1bmMgZnVuYykKKwkJICAgIGludCAqdHJpZ2dlcmluZywKKwkJICAgIGludCAqcG9sYXJpdHksIGNoYXIgKipsaW5rLCBpcnFfbG9va3VwX2Z1bmMgZnVuYykKIHsKIAlzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKmVudHJ5ID0gTlVMTDsKIAlpbnQgc2VnbWVudCA9IHBjaV9kb21haW5fbnIoYnVzKTsKQEAgLTMyNyw3ICszMjcsNyBAQAogCQlyZXR1cm5fVkFMVUUoLTEpOwogCX0KIAotCXJldCA9IGZ1bmMoZW50cnksIGVkZ2VfbGV2ZWwsIGFjdGl2ZV9oaWdoX2xvdywgbGluayk7CisJcmV0ID0gZnVuYyhlbnRyeSwgdHJpZ2dlcmluZywgcG9sYXJpdHksIGxpbmspOwogCXJldHVybl9WQUxVRShyZXQpOwogfQogCkBAIC0zMzksOCArMzM5LDggQEAKIHN0YXRpYyBpbnQKIGFjcGlfcGNpX2lycV9kZXJpdmUoc3RydWN0IHBjaV9kZXYgKmRldiwKIAkJICAgIGludCBwaW4sCi0JCSAgICBpbnQgKmVkZ2VfbGV2ZWwsCi0JCSAgICBpbnQgKmFjdGl2ZV9oaWdoX2xvdywgY2hhciAqKmxpbmssIGlycV9sb29rdXBfZnVuYyBmdW5jKQorCQkgICAgaW50ICp0cmlnZ2VyaW5nLAorCQkgICAgaW50ICpwb2xhcml0eSwgY2hhciAqKmxpbmssIGlycV9sb29rdXBfZnVuYyBmdW5jKQogewogCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2UgPSBkZXY7CiAJaW50IGlycSA9IC0xOwpAQCAtMzYxLDggKzM2MSw3IEBACiAKIAkJaWYgKChicmlkZ2UtPmNsYXNzID4+IDgpID09IFBDSV9DTEFTU19CUklER0VfQ0FSREJVUykgewogCQkJLyogUEMgY2FyZCBoYXMgdGhlIHNhbWUgSVJRIGFzIGl0cyBjYXJkYnJpZGdlICovCi0JCQlwY2lfcmVhZF9jb25maWdfYnl0ZShicmlkZ2UsIFBDSV9JTlRFUlJVUFRfUElOLAotCQkJCQkgICAgICZicmlkZ2VfcGluKTsKKwkJCWJyaWRnZV9waW4gPSBicmlkZ2UtPnBpbjsKIAkJCWlmICghYnJpZGdlX3BpbikgewogCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKIAkJCQkJCSAgIk5vIGludGVycnVwdCBwaW4gY29uZmlndXJlZCBmb3IgZGV2aWNlICVzXG4iLApAQCAtMzc1LDcgKzM3NCw3IEBACiAJCX0KIAogCQlpcnEgPSBhY3BpX3BjaV9pcnFfbG9va3VwKGJyaWRnZS0+YnVzLCBQQ0lfU0xPVChicmlkZ2UtPmRldmZuKSwKLQkJCQkJICBwaW4sIGVkZ2VfbGV2ZWwsIGFjdGl2ZV9oaWdoX2xvdywKKwkJCQkJICBwaW4sIHRyaWdnZXJpbmcsIHBvbGFyaXR5LAogCQkJCQkgIGxpbmssIGZ1bmMpOwogCX0KIApAQCAtNDAyLDggKzQwMSw4IEBACiB7CiAJaW50IGlycSA9IDA7CiAJdTggcGluID0gMDsKLQlpbnQgZWRnZV9sZXZlbCA9IEFDUElfTEVWRUxfU0VOU0lUSVZFOwotCWludCBhY3RpdmVfaGlnaF9sb3cgPSBBQ1BJX0FDVElWRV9MT1c7CisJaW50IHRyaWdnZXJpbmcgPSBBQ1BJX0xFVkVMX1NFTlNJVElWRTsKKwlpbnQgcG9sYXJpdHkgPSBBQ1BJX0FDVElWRV9MT1c7CiAJY2hhciAqbGluayA9IE5VTEw7CiAJaW50IHJjOwogCkBAIC00MTIsNyArNDExLDcgQEAKIAlpZiAoIWRldikKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7CisJcGluID0gZGV2LT5waW47CiAJaWYgKCFwaW4pIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAogCQkJCSAgIk5vIGludGVycnVwdCBwaW4gY29uZmlndXJlZCBmb3IgZGV2aWNlICVzXG4iLApAQCAtNDMyLDcgKzQzMSw3IEBACiAJICogdmFsdWVzIG92ZXJyaWRlIGFueSBCSU9TLWFzc2lnbmVkIElSUXMgc2V0IGR1cmluZyBib290LgogCSAqLwogCWlycSA9IGFjcGlfcGNpX2lycV9sb29rdXAoZGV2LT5idXMsIFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCBwaW4sCi0JCQkJICAmZWRnZV9sZXZlbCwgJmFjdGl2ZV9oaWdoX2xvdywgJmxpbmssCisJCQkJICAmdHJpZ2dlcmluZywgJnBvbGFyaXR5LCAmbGluaywKIAkJCQkgIGFjcGlfcGNpX2FsbG9jYXRlX2lycSk7CiAKIAkvKgpAQCAtNDQwLDggKzQzOSw4IEBACiAJICogZGV2aWNlJ3MgcGFyZW50IGJyaWRnZS4KIAkgKi8KIAlpZiAoaXJxIDwgMCkKLQkJaXJxID0gYWNwaV9wY2lfaXJxX2Rlcml2ZShkZXYsIHBpbiwgJmVkZ2VfbGV2ZWwsCi0JCQkJCSAgJmFjdGl2ZV9oaWdoX2xvdywgJmxpbmssCisJCWlycSA9IGFjcGlfcGNpX2lycV9kZXJpdmUoZGV2LCBwaW4sICZ0cmlnZ2VyaW5nLAorCQkJCQkgICZwb2xhcml0eSwgJmxpbmssCiAJCQkJCSAgYWNwaV9wY2lfYWxsb2NhdGVfaXJxKTsKIAogCS8qCkBAIC00NjMsNyArNDYyLDcgQEAKIAkJfQogCX0KIAotCXJjID0gYWNwaV9yZWdpc3Rlcl9nc2koaXJxLCBlZGdlX2xldmVsLCBhY3RpdmVfaGlnaF9sb3cpOworCXJjID0gYWNwaV9yZWdpc3Rlcl9nc2koaXJxLCB0cmlnZ2VyaW5nLCBwb2xhcml0eSk7CiAJaWYgKHJjIDwgMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiUENJIEludGVycnVwdCAlc1slY106IGZhaWxlZCAiCiAJCSAgICAgICAidG8gcmVnaXN0ZXIgR1NJXG4iLCBwY2lfbmFtZShkZXYpLCAoJ0EnICsgcGluKSk7CkBAIC00NzgsOCArNDc3LDggQEAKIAkJcHJpbnRrKCJMaW5rIFslc10gLT4gIiwgbGluayk7CiAKIAlwcmludGsoIkdTSSAldSAoJXMsICVzKSAtPiBJUlEgJWRcbiIsIGlycSwKLQkgICAgICAgKGVkZ2VfbGV2ZWwgPT0gQUNQSV9MRVZFTF9TRU5TSVRJVkUpID8gImxldmVsIiA6ICJlZGdlIiwKLQkgICAgICAgKGFjdGl2ZV9oaWdoX2xvdyA9PSBBQ1BJX0FDVElWRV9MT1cpID8gImxvdyIgOiAiaGlnaCIsIGRldi0+aXJxKTsKKwkgICAgICAgKHRyaWdnZXJpbmcgPT0gQUNQSV9MRVZFTF9TRU5TSVRJVkUpID8gImxldmVsIiA6ICJlZGdlIiwKKwkgICAgICAgKHBvbGFyaXR5ID09IEFDUElfQUNUSVZFX0xPVykgPyAibG93IiA6ICJoaWdoIiwgZGV2LT5pcnEpOwogCiAJcmV0dXJuX1ZBTFVFKDApOwogfQpAQCAtNDk1LDE1ICs0OTQsMTUgQEAKIHsKIAlpbnQgZ3NpID0gMDsKIAl1OCBwaW4gPSAwOwotCWludCBlZGdlX2xldmVsID0gQUNQSV9MRVZFTF9TRU5TSVRJVkU7Ci0JaW50IGFjdGl2ZV9oaWdoX2xvdyA9IEFDUElfQUNUSVZFX0xPVzsKKwlpbnQgdHJpZ2dlcmluZyA9IEFDUElfTEVWRUxfU0VOU0lUSVZFOworCWludCBwb2xhcml0eSA9IEFDUElfQUNUSVZFX0xPVzsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX2lycV9kaXNhYmxlIik7CiAKIAlpZiAoIWRldiB8fCAhZGV2LT5idXMpCiAJCXJldHVybl9WT0lEOwogCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7CisJcGluID0gZGV2LT5waW47CiAJaWYgKCFwaW4pCiAJCXJldHVybl9WT0lEOwogCXBpbi0tOwpAQCAtNTEyLDcgKzUxMSw3IEBACiAJICogRmlyc3Qgd2UgY2hlY2sgdGhlIFBDSSBJUlEgcm91dGluZyB0YWJsZSAoUFJUKSBmb3IgYW4gSVJRLgogCSAqLwogCWdzaSA9IGFjcGlfcGNpX2lycV9sb29rdXAoZGV2LT5idXMsIFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCBwaW4sCi0JCQkJICAmZWRnZV9sZXZlbCwgJmFjdGl2ZV9oaWdoX2xvdywgTlVMTCwKKwkJCQkgICZ0cmlnZ2VyaW5nLCAmcG9sYXJpdHksIE5VTEwsCiAJCQkJICBhY3BpX3BjaV9mcmVlX2lycSk7CiAJLyoKIAkgKiBJZiBubyBQUlQgZW50cnkgd2FzIGZvdW5kLCB3ZSdsbCB0cnkgdG8gZGVyaXZlIGFuIElSUSBmcm9tIHRoZQpAQCAtNTIwLDcgKzUxOSw3IEBACiAJICovCiAJaWYgKGdzaSA8IDApCiAJCWdzaSA9IGFjcGlfcGNpX2lycV9kZXJpdmUoZGV2LCBwaW4sCi0JCQkJCSAgJmVkZ2VfbGV2ZWwsICZhY3RpdmVfaGlnaF9sb3csIE5VTEwsCisJCQkJCSAgJnRyaWdnZXJpbmcsICZwb2xhcml0eSwgTlVMTCwKIAkJCQkJICBhY3BpX3BjaV9mcmVlX2lycSk7CiAJaWYgKGdzaSA8IDApCiAJCXJldHVybl9WT0lEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9saW5rLmMgYi9kcml2ZXJzL2FjcGkvcGNpX2xpbmsuYwppbmRleCA3ODkyN2MwLi4xZmZjNzcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGNpX2xpbmsuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX2xpbmsuYwpAQCAtNzAsOCArNzAsOCBAQAogICovCiBzdHJ1Y3QgYWNwaV9wY2lfbGlua19pcnEgewogCXU4IGFjdGl2ZTsJCS8qIEN1cnJlbnQgSVJRICovCi0JdTggZWRnZV9sZXZlbDsJCS8qIEFsbCBJUlFzICovCi0JdTggYWN0aXZlX2hpZ2hfbG93OwkvKiBBbGwgSVJRcyAqLworCXU4IHRyaWdnZXJpbmc7CQkvKiBBbGwgSVJRcyAqLworCXU4IHBvbGFyaXR5OwkvKiBBbGwgSVJRcyAqLwogCXU4IHJlc291cmNlX3R5cGU7CiAJdTggcG9zc2libGVfY291bnQ7CiAJdTggcG9zc2libGVbQUNQSV9QQ0lfTElOS19NQVhfUE9TU0lCTEVdOwpAQCAtMTA4LDE5ICsxMDgsMTkgQEAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX2xpbmtfY2hlY2tfcG9zc2libGUiKTsKIAotCXN3aXRjaCAocmVzb3VyY2UtPmlkKSB7Ci0JY2FzZSBBQ1BJX1JTVFlQRV9TVEFSVF9EUEY6CisJc3dpdGNoIChyZXNvdXJjZS0+dHlwZSkgeworCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX1NUQVJUX0RFUEVOREVOVDoKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQljYXNlIEFDUElfUlNUWVBFX0lSUToKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9JUlE6CiAJCXsKIAkJCXN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSAqcCA9ICZyZXNvdXJjZS0+ZGF0YS5pcnE7Ci0JCQlpZiAoIXAgfHwgIXAtPm51bWJlcl9vZl9pbnRlcnJ1cHRzKSB7CisJCQlpZiAoIXAgfHwgIXAtPmludGVycnVwdF9jb3VudCkgewogCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwKIAkJCQkJCSAgIkJsYW5rIElSUSByZXNvdXJjZVxuIikpOwogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJCQl9CiAJCQlmb3IgKGkgPSAwOwotCQkJICAgICAoaSA8IHAtPm51bWJlcl9vZl9pbnRlcnJ1cHRzCisJCQkgICAgIChpIDwgcC0+aW50ZXJydXB0X2NvdW50CiAJCQkgICAgICAmJiBpIDwgQUNQSV9QQ0lfTElOS19NQVhfUE9TU0lCTEUpOyBpKyspIHsKIAkJCQlpZiAoIXAtPmludGVycnVwdHNbaV0pIHsKIAkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLApAQCAtMTMxLDIyICsxMzEsMjIgQEAKIAkJCQlsaW5rLT5pcnEucG9zc2libGVbaV0gPSBwLT5pbnRlcnJ1cHRzW2ldOwogCQkJCWxpbmstPmlycS5wb3NzaWJsZV9jb3VudCsrOwogCQkJfQotCQkJbGluay0+aXJxLmVkZ2VfbGV2ZWwgPSBwLT5lZGdlX2xldmVsOwotCQkJbGluay0+aXJxLmFjdGl2ZV9oaWdoX2xvdyA9IHAtPmFjdGl2ZV9oaWdoX2xvdzsKLQkJCWxpbmstPmlycS5yZXNvdXJjZV90eXBlID0gQUNQSV9SU1RZUEVfSVJROworCQkJbGluay0+aXJxLnRyaWdnZXJpbmcgPSBwLT50cmlnZ2VyaW5nOworCQkJbGluay0+aXJxLnBvbGFyaXR5ID0gcC0+cG9sYXJpdHk7CisJCQlsaW5rLT5pcnEucmVzb3VyY2VfdHlwZSA9IEFDUElfUkVTT1VSQ0VfVFlQRV9JUlE7CiAJCQlicmVhazsKIAkJfQotCWNhc2UgQUNQSV9SU1RZUEVfRVhUX0lSUToKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FWFRFTkRFRF9JUlE6CiAJCXsKLQkJCXN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dF9pcnEgKnAgPQorCQkJc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0ZW5kZWRfaXJxICpwID0KIAkJCSAgICAmcmVzb3VyY2UtPmRhdGEuZXh0ZW5kZWRfaXJxOwotCQkJaWYgKCFwIHx8ICFwLT5udW1iZXJfb2ZfaW50ZXJydXB0cykgeworCQkJaWYgKCFwIHx8ICFwLT5pbnRlcnJ1cHRfY291bnQpIHsKIAkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sCiAJCQkJCQkgICJCbGFuayBFWFQgSVJRIHJlc291cmNlXG4iKSk7CiAJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAkJCX0KIAkJCWZvciAoaSA9IDA7Ci0JCQkgICAgIChpIDwgcC0+bnVtYmVyX29mX2ludGVycnVwdHMKKwkJCSAgICAgKGkgPCBwLT5pbnRlcnJ1cHRfY291bnQKIAkJCSAgICAgICYmIGkgPCBBQ1BJX1BDSV9MSU5LX01BWF9QT1NTSUJMRSk7IGkrKykgewogCQkJCWlmICghcC0+aW50ZXJydXB0c1tpXSkgewogCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sCkBAIC0xNTcsOSArMTU3LDkgQEAKIAkJCQlsaW5rLT5pcnEucG9zc2libGVbaV0gPSBwLT5pbnRlcnJ1cHRzW2ldOwogCQkJCWxpbmstPmlycS5wb3NzaWJsZV9jb3VudCsrOwogCQkJfQotCQkJbGluay0+aXJxLmVkZ2VfbGV2ZWwgPSBwLT5lZGdlX2xldmVsOwotCQkJbGluay0+aXJxLmFjdGl2ZV9oaWdoX2xvdyA9IHAtPmFjdGl2ZV9oaWdoX2xvdzsKLQkJCWxpbmstPmlycS5yZXNvdXJjZV90eXBlID0gQUNQSV9SU1RZUEVfRVhUX0lSUTsKKwkJCWxpbmstPmlycS50cmlnZ2VyaW5nID0gcC0+dHJpZ2dlcmluZzsKKwkJCWxpbmstPmlycS5wb2xhcml0eSA9IHAtPnBvbGFyaXR5OworCQkJbGluay0+aXJxLnJlc291cmNlX3R5cGUgPSBBQ1BJX1JFU09VUkNFX1RZUEVfRVhURU5ERURfSVJROwogCQkJYnJlYWs7CiAJCX0KIAlkZWZhdWx0OgpAQCAtMjAxLDExICsyMDEsMTEgQEAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX2xpbmtfY2hlY2tfY3VycmVudCIpOwogCi0Jc3dpdGNoIChyZXNvdXJjZS0+aWQpIHsKLQljYXNlIEFDUElfUlNUWVBFX0lSUToKKwlzd2l0Y2ggKHJlc291cmNlLT50eXBlKSB7CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfSVJROgogCQl7CiAJCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEgKnAgPSAmcmVzb3VyY2UtPmRhdGEuaXJxOwotCQkJaWYgKCFwIHx8ICFwLT5udW1iZXJfb2ZfaW50ZXJydXB0cykgeworCQkJaWYgKCFwIHx8ICFwLT5pbnRlcnJ1cHRfY291bnQpIHsKIAkJCQkvKgogCQkJCSAqIElSUSBkZXNjcmlwdG9ycyBtYXkgaGF2ZSBubyBJUlEjIGJpdHMgc2V0LAogCQkJCSAqIHBhcnRpY3VsYXJseSB0aG9zZSB0aG9zZSB3LyBfU1RBIGRpc2FibGVkCkBAIC0yMTcsMTEgKzIxNywxMSBAQAogCQkJKmlycSA9IHAtPmludGVycnVwdHNbMF07CiAJCQlicmVhazsKIAkJfQotCWNhc2UgQUNQSV9SU1RZUEVfRVhUX0lSUToKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FWFRFTkRFRF9JUlE6CiAJCXsKLQkJCXN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dF9pcnEgKnAgPQorCQkJc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0ZW5kZWRfaXJxICpwID0KIAkJCSAgICAmcmVzb3VyY2UtPmRhdGEuZXh0ZW5kZWRfaXJxOwotCQkJaWYgKCFwIHx8ICFwLT5udW1iZXJfb2ZfaW50ZXJydXB0cykgeworCQkJaWYgKCFwIHx8ICFwLT5pbnRlcnJ1cHRfY291bnQpIHsKIAkJCQkvKgogCQkJCSAqIGV4dGVuZGVkIElSUSBkZXNjcmlwdG9ycyBtdXN0CiAJCQkJICogcmV0dXJuIGF0IGxlYXN0IDEgSVJRCkBAIC0zMjUsMzYgKzMyNSwzNiBAQAogCWJ1ZmZlci5wb2ludGVyID0gcmVzb3VyY2U7CiAKIAlzd2l0Y2ggKGxpbmstPmlycS5yZXNvdXJjZV90eXBlKSB7Ci0JY2FzZSBBQ1BJX1JTVFlQRV9JUlE6Ci0JCXJlc291cmNlLT5yZXMuaWQgPSBBQ1BJX1JTVFlQRV9JUlE7CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfSVJROgorCQlyZXNvdXJjZS0+cmVzLnR5cGUgPSBBQ1BJX1JFU09VUkNFX1RZUEVfSVJROwogCQlyZXNvdXJjZS0+cmVzLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSk7Ci0JCXJlc291cmNlLT5yZXMuZGF0YS5pcnEuZWRnZV9sZXZlbCA9IGxpbmstPmlycS5lZGdlX2xldmVsOwotCQlyZXNvdXJjZS0+cmVzLmRhdGEuaXJxLmFjdGl2ZV9oaWdoX2xvdyA9Ci0JCSAgICBsaW5rLT5pcnEuYWN0aXZlX2hpZ2hfbG93OwotCQlpZiAobGluay0+aXJxLmVkZ2VfbGV2ZWwgPT0gQUNQSV9FREdFX1NFTlNJVElWRSkKLQkJCXJlc291cmNlLT5yZXMuZGF0YS5pcnEuc2hhcmVkX2V4Y2x1c2l2ZSA9CisJCXJlc291cmNlLT5yZXMuZGF0YS5pcnEudHJpZ2dlcmluZyA9IGxpbmstPmlycS50cmlnZ2VyaW5nOworCQlyZXNvdXJjZS0+cmVzLmRhdGEuaXJxLnBvbGFyaXR5ID0KKwkJICAgIGxpbmstPmlycS5wb2xhcml0eTsKKwkJaWYgKGxpbmstPmlycS50cmlnZ2VyaW5nID09IEFDUElfRURHRV9TRU5TSVRJVkUpCisJCQlyZXNvdXJjZS0+cmVzLmRhdGEuaXJxLnNoYXJhYmxlID0KIAkJCSAgICBBQ1BJX0VYQ0xVU0lWRTsKIAkJZWxzZQotCQkJcmVzb3VyY2UtPnJlcy5kYXRhLmlycS5zaGFyZWRfZXhjbHVzaXZlID0gQUNQSV9TSEFSRUQ7Ci0JCXJlc291cmNlLT5yZXMuZGF0YS5pcnEubnVtYmVyX29mX2ludGVycnVwdHMgPSAxOworCQkJcmVzb3VyY2UtPnJlcy5kYXRhLmlycS5zaGFyYWJsZSA9IEFDUElfU0hBUkVEOworCQlyZXNvdXJjZS0+cmVzLmRhdGEuaXJxLmludGVycnVwdF9jb3VudCA9IDE7CiAJCXJlc291cmNlLT5yZXMuZGF0YS5pcnEuaW50ZXJydXB0c1swXSA9IGlycTsKIAkJYnJlYWs7CiAKLQljYXNlIEFDUElfUlNUWVBFX0VYVF9JUlE6Ci0JCXJlc291cmNlLT5yZXMuaWQgPSBBQ1BJX1JTVFlQRV9FWFRfSVJROworCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0lSUToKKwkJcmVzb3VyY2UtPnJlcy50eXBlID0gQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0lSUTsKIAkJcmVzb3VyY2UtPnJlcy5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGFjcGlfcmVzb3VyY2UpOwogCQlyZXNvdXJjZS0+cmVzLmRhdGEuZXh0ZW5kZWRfaXJxLnByb2R1Y2VyX2NvbnN1bWVyID0KIAkJICAgIEFDUElfQ09OU1VNRVI7Ci0JCXJlc291cmNlLT5yZXMuZGF0YS5leHRlbmRlZF9pcnEuZWRnZV9sZXZlbCA9Ci0JCSAgICBsaW5rLT5pcnEuZWRnZV9sZXZlbDsKLQkJcmVzb3VyY2UtPnJlcy5kYXRhLmV4dGVuZGVkX2lycS5hY3RpdmVfaGlnaF9sb3cgPQotCQkgICAgbGluay0+aXJxLmFjdGl2ZV9oaWdoX2xvdzsKLQkJaWYgKGxpbmstPmlycS5lZGdlX2xldmVsID09IEFDUElfRURHRV9TRU5TSVRJVkUpCi0JCQlyZXNvdXJjZS0+cmVzLmRhdGEuaXJxLnNoYXJlZF9leGNsdXNpdmUgPQorCQlyZXNvdXJjZS0+cmVzLmRhdGEuZXh0ZW5kZWRfaXJxLnRyaWdnZXJpbmcgPQorCQkgICAgbGluay0+aXJxLnRyaWdnZXJpbmc7CisJCXJlc291cmNlLT5yZXMuZGF0YS5leHRlbmRlZF9pcnEucG9sYXJpdHkgPQorCQkgICAgbGluay0+aXJxLnBvbGFyaXR5OworCQlpZiAobGluay0+aXJxLnRyaWdnZXJpbmcgPT0gQUNQSV9FREdFX1NFTlNJVElWRSkKKwkJCXJlc291cmNlLT5yZXMuZGF0YS5pcnEuc2hhcmFibGUgPQogCQkJICAgIEFDUElfRVhDTFVTSVZFOwogCQllbHNlCi0JCQlyZXNvdXJjZS0+cmVzLmRhdGEuaXJxLnNoYXJlZF9leGNsdXNpdmUgPSBBQ1BJX1NIQVJFRDsKLQkJcmVzb3VyY2UtPnJlcy5kYXRhLmV4dGVuZGVkX2lycS5udW1iZXJfb2ZfaW50ZXJydXB0cyA9IDE7CisJCQlyZXNvdXJjZS0+cmVzLmRhdGEuaXJxLnNoYXJhYmxlID0gQUNQSV9TSEFSRUQ7CisJCXJlc291cmNlLT5yZXMuZGF0YS5leHRlbmRlZF9pcnEuaW50ZXJydXB0X2NvdW50ID0gMTsKIAkJcmVzb3VyY2UtPnJlcy5kYXRhLmV4dGVuZGVkX2lycS5pbnRlcnJ1cHRzWzBdID0gaXJxOwogCQkvKiBpZ25vcmUgcmVzb3VyY2Vfc291cmNlLCBpdCdzIG9wdGlvbmFsICovCiAJCWJyZWFrOwpAQCAtMzY0LDcgKzM2NCw3IEBACiAJCWdvdG8gZW5kOwogCiAJfQotCXJlc291cmNlLT5lbmQuaWQgPSBBQ1BJX1JTVFlQRV9FTkRfVEFHOworCXJlc291cmNlLT5lbmQudHlwZSA9IEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfVEFHOwogCiAJLyogQXR0ZW1wdCB0byBzZXQgdGhlIHJlc291cmNlICovCiAJc3RhdHVzID0gYWNwaV9zZXRfY3VycmVudF9yZXNvdXJjZXMobGluay0+aGFuZGxlLCAmYnVmZmVyKTsKQEAgLTYxMyw3ICs2MTMsNyBAQAogaW50CiBhY3BpX3BjaV9saW5rX2FsbG9jYXRlX2lycShhY3BpX2hhbmRsZSBoYW5kbGUsCiAJCQkgICBpbnQgaW5kZXgsCi0JCQkgICBpbnQgKmVkZ2VfbGV2ZWwsIGludCAqYWN0aXZlX2hpZ2hfbG93LCBjaGFyICoqbmFtZSkKKwkJCSAgIGludCAqdHJpZ2dlcmluZywgaW50ICpwb2xhcml0eSwgY2hhciAqKm5hbWUpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOwpAQCAtNjUzLDEwICs2NTMsMTAgQEAKIAlsaW5rLT5yZWZjbnQrKzsKIAl1cCgmYWNwaV9saW5rX2xvY2spOwogCi0JaWYgKGVkZ2VfbGV2ZWwpCi0JCSplZGdlX2xldmVsID0gbGluay0+aXJxLmVkZ2VfbGV2ZWw7Ci0JaWYgKGFjdGl2ZV9oaWdoX2xvdykKLQkJKmFjdGl2ZV9oaWdoX2xvdyA9IGxpbmstPmlycS5hY3RpdmVfaGlnaF9sb3c7CisJaWYgKHRyaWdnZXJpbmcpCisJCSp0cmlnZ2VyaW5nID0gbGluay0+aXJxLnRyaWdnZXJpbmc7CisJaWYgKHBvbGFyaXR5KQorCQkqcG9sYXJpdHkgPSBsaW5rLT5pcnEucG9sYXJpdHk7CiAJaWYgKG5hbWUpCiAJCSpuYW1lID0gYWNwaV9kZXZpY2VfYmlkKGxpbmstPmRldmljZSk7CiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9yb290LmMgYi9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYwppbmRleCAwZmQ5OTg4Li40YzMxM2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYwpAQCAtMTIyLDE1ICsxMjIsMTUgQEAKIAlpbnQgKmJ1c25yID0gKGludCAqKWRhdGE7CiAJc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0IGFkZHJlc3M7CiAKLQlpZiAocmVzb3VyY2UtPmlkICE9IEFDUElfUlNUWVBFX0FERFJFU1MxNiAmJgotCSAgICByZXNvdXJjZS0+aWQgIT0gQUNQSV9SU1RZUEVfQUREUkVTUzMyICYmCi0JICAgIHJlc291cmNlLT5pZCAhPSBBQ1BJX1JTVFlQRV9BRERSRVNTNjQpCisJaWYgKHJlc291cmNlLT50eXBlICE9IEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMTYgJiYKKwkgICAgcmVzb3VyY2UtPnR5cGUgIT0gQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MzMiAmJgorCSAgICByZXNvdXJjZS0+dHlwZSAhPSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzY0KQogCQlyZXR1cm4gQUVfT0s7CiAKIAlhY3BpX3Jlc291cmNlX3RvX2FkZHJlc3M2NChyZXNvdXJjZSwgJmFkZHJlc3MpOwogCWlmICgoYWRkcmVzcy5hZGRyZXNzX2xlbmd0aCA+IDApICYmCiAJICAgIChhZGRyZXNzLnJlc291cmNlX3R5cGUgPT0gQUNQSV9CVVNfTlVNQkVSX1JBTkdFKSkKLQkJKmJ1c25yID0gYWRkcmVzcy5taW5fYWRkcmVzc19yYW5nZTsKKwkJKmJ1c25yID0gYWRkcmVzcy5taW5pbXVtOwogCiAJcmV0dXJuIEFFX09LOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwppbmRleCAxMjc4YWNhLi45OWEzYTI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwpAQCAtMjUzLDMxICsyNTMsMjEgQEAKICAqIF9QREMgaXMgcmVxdWlyZWQgZm9yIGEgQklPUy1PUyBoYW5kc2hha2UgZm9yIG1vc3Qgb2YgdGhlIG5ld2VyCiAgKiBBQ1BJIHByb2Nlc3NvciBmZWF0dXJlcy4KICAqLwotCi1pbnQgYWNwaV9wcm9jZXNzb3Jfc2V0X3BkYyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAotCQkJICAgc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKnBkY19pbikKK3N0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3Jfc2V0X3BkYyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogeworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpwZGNfaW4gPSBwci0+cGRjOwogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXUzMiBhcmcwX2J1ZlszXTsKLQl1bmlvbiBhY3BpX29iamVjdCBhcmcwID0geyBBQ1BJX1RZUEVfQlVGRkVSIH07Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3Qgbm9fb2JqZWN0ID0geyAxLCAmYXJnMCB9OwotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpwZGM7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9zZXRfcGRjIik7CiAKLQlhcmcwLmJ1ZmZlci5sZW5ndGggPSAxMjsKLQlhcmcwLmJ1ZmZlci5wb2ludGVyID0gKHU4ICopIGFyZzBfYnVmOwotCWFyZzBfYnVmWzBdID0gQUNQSV9QRENfUkVWSVNJT05fSUQ7Ci0JYXJnMF9idWZbMV0gPSAwOwotCWFyZzBfYnVmWzJdID0gMDsKKwlpZiAoIXBkY19pbikKKwkJcmV0dXJuX1ZBTFVFKHN0YXR1cyk7CiAKLQlwZGMgPSAocGRjX2luKSA/IHBkY19pbiA6ICZub19vYmplY3Q7CisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QocHItPmhhbmRsZSwgIl9QREMiLCBwZGNfaW4sIE5VTEwpOwogCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QocHItPmhhbmRsZSwgIl9QREMiLCBwZGMsIE5VTEwpOwotCi0JaWYgKChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgJiYgKHBkY19pbikpCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkJICAiRXJyb3IgZXZhbHVhdGluZyBfUERDLCB1c2luZyBsZWdhY3kgcGVyZi4gY29udHJvbC4uLlxuIikpOworCQkgICAgIkNvdWxkIG5vdCBldmFsdWF0ZSBfUERDLCB1c2luZyBsZWdhY3kgcGVyZi4gY29udHJvbC4uLlxuIikpOwogCiAJcmV0dXJuX1ZBTFVFKHN0YXR1cyk7CiB9CkBAIC0zNTcsNyArMzQ3LDYgQEAKIAkJCQkgIEFDUElfUFJPQ0VTU09SX0ZJTEVfVEhST1RUTElORykpOwogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfcHJvY2Vzc29yX3Rocm90dGxpbmdfZm9wczsKLQkJZW50cnktPnByb2NfZm9wcy0+d3JpdGUgPSBhY3BpX3Byb2Nlc3Nvcl93cml0ZV90aHJvdHRsaW5nOwogCQllbnRyeS0+ZGF0YSA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAkJZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CiAJfQpAQCAtMzcyLDcgKzM2MSw2IEBACiAJCQkJICBBQ1BJX1BST0NFU1NPUl9GSUxFX0xJTUlUKSk7CiAJZWxzZSB7CiAJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV9wcm9jZXNzb3JfbGltaXRfZm9wczsKLQkJZW50cnktPnByb2NfZm9wcy0+d3JpdGUgPSBhY3BpX3Byb2Nlc3Nvcl93cml0ZV9saW1pdDsKIAkJZW50cnktPmRhdGEgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAJCWVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOwogCX0KQEAgLTU4OSw2ICs1NzcsMTAgQEAKIAkJCQkgICJFcnJvciBpbnN0YWxsaW5nIGRldmljZSBub3RpZnkgaGFuZGxlclxuIikpOwogCX0KIAorCS8qIF9QREMgY2FsbCBzaG91bGQgYmUgZG9uZSBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZSAoaWYgcmVxZC4pLiAqLworCWFyY2hfYWNwaV9wcm9jZXNzb3JfaW5pdF9wZGMocHIpOworCWFjcGlfcHJvY2Vzc29yX3NldF9wZGMocHIpOworCiAJYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdChwciwgZGV2aWNlKTsKIAogCWlmIChwci0+ZmxhZ3MudGhyb3R0bGluZykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYwppbmRleCA1NTI0MjBlLi5iZTJkYWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYwpAQCAtNTg1LDE4ICs1ODUsMTAgQEAKIAlpZiAoIXByLT5wYmxrKQogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAKLQltZW1zZXQocHItPnBvd2VyLnN0YXRlcywgMCwgc2l6ZW9mKHByLT5wb3dlci5zdGF0ZXMpKTsKLQogCS8qIGlmIGluZm8gaXMgb2J0YWluZWQgZnJvbSBwYmxrL2ZhZHQsIHR5cGUgZXF1YWxzIHN0YXRlICovCi0JcHItPnBvd2VyLnN0YXRlc1tBQ1BJX1NUQVRFX0MxXS50eXBlID0gQUNQSV9TVEFURV9DMTsKIAlwci0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfQzJdLnR5cGUgPSBBQ1BJX1NUQVRFX0MyOwogCXByLT5wb3dlci5zdGF0ZXNbQUNQSV9TVEFURV9DM10udHlwZSA9IEFDUElfU1RBVEVfQzM7CiAKLQkvKiB0aGUgQzAgc3RhdGUgb25seSBleGlzdHMgYXMgYSBmaWxsZXIgaW4gb3VyIGFycmF5LAotCSAqIGFuZCBhbGwgcHJvY2Vzc29ycyBuZWVkIHRvIHN1cHBvcnQgQzEgKi8KLQlwci0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfQzBdLnZhbGlkID0gMTsKLQlwci0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfQzFdLnZhbGlkID0gMTsKLQogI2lmbmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAkvKgogCSAqIENoZWNrIGZvciBQX0xWTDJfVVAgZmxhZyBiZWZvcmUgZW50ZXJpbmcgQzIgYW5kIGFib3ZlIG9uCkBAIC02MjYsMTIgKzYxOCwxMSBAQAogewogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvX2RlZmF1bHRfYzEiKTsKIAorCS8qIFplcm8gaW5pdGlhbGl6ZSBhbGwgdGhlIEMtc3RhdGVzIGluZm8uICovCiAJbWVtc2V0KHByLT5wb3dlci5zdGF0ZXMsIDAsIHNpemVvZihwci0+cG93ZXIuc3RhdGVzKSk7CiAKLQkvKiBpZiBpbmZvIGlzIG9idGFpbmVkIGZyb20gcGJsay9mYWR0LCB0eXBlIGVxdWFscyBzdGF0ZSAqLworCS8qIHNldCB0aGUgZmlyc3QgQy1TdGF0ZSB0byBDMSAqLwogCXByLT5wb3dlci5zdGF0ZXNbQUNQSV9TVEFURV9DMV0udHlwZSA9IEFDUElfU1RBVEVfQzE7Ci0JcHItPnBvd2VyLnN0YXRlc1tBQ1BJX1NUQVRFX0MyXS50eXBlID0gQUNQSV9TVEFURV9DMjsKLQlwci0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfQzNdLnR5cGUgPSBBQ1BJX1NUQVRFX0MzOwogCiAJLyogdGhlIEMwIHN0YXRlIG9ubHkgZXhpc3RzIGFzIGEgZmlsbGVyIGluIG91ciBhcnJheSwKIAkgKiBhbmQgYWxsIHByb2Nlc3NvcnMgbmVlZCB0byBzdXBwb3J0IEMxICovCkBAIC02NDUsNiArNjM2LDcgQEAKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOwogCWFjcGlfaW50ZWdlciBjb3VudDsKKwlpbnQgY3VycmVudF9jb3VudDsKIAlpbnQgaTsKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OwogCXVuaW9uIGFjcGlfb2JqZWN0ICpjc3Q7CkBAIC02NTQsMTAgKzY0NiwxMiBAQAogCWlmIChub2NzdCkKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCi0JcHItPnBvd2VyLmNvdW50ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSOyBpKyspCi0JCW1lbXNldCgmKHByLT5wb3dlci5zdGF0ZXNbaV0pLCAwLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCkpOworCWN1cnJlbnRfY291bnQgPSAxOworCisJLyogWmVybyBpbml0aWFsaXplIEMyIG9ud2FyZHMgYW5kIHByZXBhcmUgZm9yIGZyZXNoIENTVCBsb29rdXAgKi8KKwlmb3IgKGkgPSAyOyBpIDwgQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSOyBpKyspCisJCW1lbXNldCgmKHByLT5wb3dlci5zdGF0ZXNbaV0pLCAwLCAKKwkJCQlzaXplb2Yoc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4KSk7CiAKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChwci0+aGFuZGxlLCAiX0NTVCIsIE5VTEwsICZidWZmZXIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewpAQCAtNjg1LDE2ICs2NzksNiBAQAogCQlnb3RvIGVuZDsKIAl9CiAKLQkvKiBXZSBzdXBwb3J0IHVwIHRvIEFDUElfUFJPQ0VTU09SX01BWF9QT1dFUi4gKi8KLQlpZiAoY291bnQgPiBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVIpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgIkxpbWl0aW5nIG51bWJlciBvZiBwb3dlciBzdGF0ZXMgdG8gbWF4ICglZClcbiIsCi0JCSAgICAgICBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVIpOwotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiUGxlYXNlIGluY3JlYXNlIEFDUElfUFJPQ0VTU09SX01BWF9QT1dFUiBpZiBuZWVkZWQuXG4iKTsKLQkJY291bnQgPSBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVI7Ci0JfQotCiAJLyogVGVsbCBkcml2ZXIgdGhhdCBhdCBsZWFzdCBfQ1NUIGlzIHN1cHBvcnRlZC4gKi8KIAlwci0+ZmxhZ3MuaGFzX2NzdCA9IDE7CiAKQEAgLTczOCw3ICs3MjIsNyBAQAogCQkgICAgKHJlZy0+c3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPKSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmICgoY3gudHlwZSA8IEFDUElfU1RBVEVfQzEpIHx8IChjeC50eXBlID4gQUNQSV9TVEFURV9DMykpCisJCWlmICgoY3gudHlwZSA8IEFDUElfU1RBVEVfQzIpIHx8IChjeC50eXBlID4gQUNQSV9TVEFURV9DMykpCiAJCQljb250aW51ZTsKIAogCQlvYmogPSAodW5pb24gYWNwaV9vYmplY3QgKikmKGVsZW1lbnQtPnBhY2thZ2UuZWxlbWVudHNbMl0pOwpAQCAtNzUzLDE1ICs3MzcsMjggQEAKIAogCQljeC5wb3dlciA9IG9iai0+aW50ZWdlci52YWx1ZTsKIAotCQkocHItPnBvd2VyLmNvdW50KSsrOwotCQltZW1jcHkoJihwci0+cG93ZXIuc3RhdGVzW3ByLT5wb3dlci5jb3VudF0pLCAmY3gsIHNpemVvZihjeCkpOworCQljdXJyZW50X2NvdW50Kys7CisJCW1lbWNweSgmKHByLT5wb3dlci5zdGF0ZXNbY3VycmVudF9jb3VudF0pLCAmY3gsIHNpemVvZihjeCkpOworCisJCS8qCisJCSAqIFdlIHN1cHBvcnQgdG90YWwgQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSIC0gMQorCQkgKiAoRnJvbSAxIHRocm91Z2ggQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSIC0gMSkKKwkJICovCisJCWlmIChjdXJyZW50X2NvdW50ID49IChBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVIgLSAxKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJMaW1pdGluZyBudW1iZXIgb2YgcG93ZXIgc3RhdGVzIHRvIG1heCAoJWQpXG4iLAorCQkJICAgICAgIEFDUElfUFJPQ0VTU09SX01BWF9QT1dFUik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIlBsZWFzZSBpbmNyZWFzZSBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVIgaWYgbmVlZGVkLlxuIik7CisJCQlicmVhazsKKwkJfQogCX0KIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkZvdW5kICVkIHBvd2VyIHN0YXRlc1xuIiwKLQkJCSAgcHItPnBvd2VyLmNvdW50KSk7CisJCQkgIGN1cnJlbnRfY291bnQpKTsKIAogCS8qIFZhbGlkYXRlIG51bWJlciBvZiBwb3dlciBzdGF0ZXMgZGlzY292ZXJlZCAqLwotCWlmIChwci0+cG93ZXIuY291bnQgPCAyKQorCWlmIChjdXJyZW50X2NvdW50IDwgMikKIAkJc3RhdHVzID0gLUVGQVVMVDsKIAogICAgICAgZW5kOgpAQCAtODc4LDYgKzg3NSwxNSBAQAogCXVuc2lnbmVkIGludCBpOwogCXVuc2lnbmVkIGludCB3b3JraW5nID0gMDsKIAorI2lmZGVmIEFSQ0hfQVBJQ1RJTUVSX1NUT1BTX09OX0MzCisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGEgKyBwci0+aWQ7CisJY3B1bWFza190IG1hc2sgPSBjcHVtYXNrX29mX2NwdShwci0+aWQpOworCisJaWYgKGMtPng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkgeworCQlvbl9lYWNoX2NwdShzd2l0Y2hfaXBpX3RvX0FQSUNfdGltZXIsICZtYXNrLCAxLCAxKTsKKwl9CisjZW5kaWYKKwogCWZvciAoaSA9IDE7IGkgPCBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVI7IGkrKykgewogCQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4ID0gJnByLT5wb3dlci5zdGF0ZXNbaV07CiAKQEAgLTg5Miw2ICs4OTgsMTIgQEAKIAogCQljYXNlIEFDUElfU1RBVEVfQzM6CiAJCQlhY3BpX3Byb2Nlc3Nvcl9wb3dlcl92ZXJpZnlfYzMocHIsIGN4KTsKKyNpZmRlZiBBUkNIX0FQSUNUSU1FUl9TVE9QU19PTl9DMworCQkJaWYgKGMtPng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkgeworCQkJCW9uX2VhY2hfY3B1KHN3aXRjaF9BUElDX3RpbWVyX3RvX2lwaSwKKwkJCQkJCSZtYXNrLCAxLCAxKTsKKwkJCX0KKyNlbmRpZgogCQkJYnJlYWs7CiAJCX0KIApAQCAtOTEyLDEyICs5MjQsMTMgQEAKIAkvKiBOT1RFOiB0aGUgaWRsZSB0aHJlYWQgbWF5IG5vdCBiZSBydW5uaW5nIHdoaWxlIGNhbGxpbmcKIAkgKiB0aGlzIGZ1bmN0aW9uICovCiAKKwkvKiBBZGRpbmcgQzEgc3RhdGUgKi8KKwlhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mb19kZWZhdWx0X2MxKHByKTsKIAlyZXN1bHQgPSBhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mb19jc3QocHIpOwogCWlmIChyZXN1bHQgPT0gLUVOT0RFVikKLQkJcmVzdWx0ID0gYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX2luZm9fZmFkdChwcik7CisJCWFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvX2ZhZHQocHIpOwogCi0JaWYgKChyZXN1bHQpIHx8IChhY3BpX3Byb2Nlc3Nvcl9wb3dlcl92ZXJpZnkocHIpIDwgMikpCi0JCXJlc3VsdCA9IGFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvX2RlZmF1bHRfYzEocHIpOworCXByLT5wb3dlci5jb3VudCA9IGFjcGlfcHJvY2Vzc29yX3Bvd2VyX3ZlcmlmeShwcik7CiAKIAkvKgogCSAqIFNldCBEZWZhdWx0IFBvbGljeQpAQCAtMTA4Niw4ICsxMDk5LDYgQEAKIAkJfQogCX0KIAotCWFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfcGRjKCYocHItPnBvd2VyKSwgcHItPmlkKTsKLQlhY3BpX3Byb2Nlc3Nvcl9zZXRfcGRjKHByLCBwci0+cG93ZXIucGRjKTsKIAlhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mbyhwcik7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYwppbmRleCAyMmM3YmI2Li5hYmJkYjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYwpAQCAtMzE1LDggKzMxNSw2IEBACiAJaWYgKCFwciB8fCAhcHItPnBlcmZvcm1hbmNlIHx8ICFwci0+aGFuZGxlKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKLQlhY3BpX3Byb2Nlc3Nvcl9zZXRfcGRjKHByLCBwci0+cGVyZm9ybWFuY2UtPnBkYyk7Ci0KIAlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUocHItPmhhbmRsZSwgIl9QQ1QiLCAmaGFuZGxlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLApAQCAtNTIwLDggKzUxOCw4IEBACiAJCQkJICAiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAogCQkJCSAgQUNQSV9QUk9DRVNTT1JfRklMRV9QRVJGT1JNQU5DRSkpOwogCWVsc2UgeworCQlhY3BpX3Byb2Nlc3Nvcl9wZXJmX2ZvcHMud3JpdGUgPSBhY3BpX3Byb2Nlc3Nvcl93cml0ZV9wZXJmb3JtYW5jZTsKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3Byb2Nlc3Nvcl9wZXJmX2ZvcHM7Ci0JCWVudHJ5LT5wcm9jX2ZvcHMtPndyaXRlID0gYWNwaV9wcm9jZXNzb3Jfd3JpdGVfcGVyZm9ybWFuY2U7CiAJCWVudHJ5LT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCQllbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3RoZXJtYWwuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhlcm1hbC5jCmluZGV4IGRjOTgxN2MuLmY5OWFkMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhlcm1hbC5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhlcm1hbC5jCkBAIC0zNDgsOSArMzQ4LDkgQEAKIAkJCSAgIFBERShpbm9kZSktPmRhdGEpOwogfQogCi1zc2l6ZV90IGFjcGlfcHJvY2Vzc29yX3dyaXRlX2xpbWl0KHN0cnVjdCBmaWxlICogZmlsZSwKLQkJCQkgICBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKLQkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIGRhdGEpCitzdGF0aWMgc3NpemVfdCBhY3BpX3Byb2Nlc3Nvcl93cml0ZV9saW1pdChzdHJ1Y3QgZmlsZSAqIGZpbGUsCisJCQkJCSAgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBkYXRhKQogewogCWludCByZXN1bHQgPSAwOwogCXN0cnVjdCBzZXFfZmlsZSAqbSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CkBAIC0zOTQsNiArMzk0LDcgQEAKIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9wcm9jZXNzb3JfbGltaXRfZm9wcyA9IHsKIAkub3BlbiA9IGFjcGlfcHJvY2Vzc29yX2xpbWl0X29wZW5fZnMsCiAJLnJlYWQgPSBzZXFfcmVhZCwKKwkud3JpdGUgPSBhY3BpX3Byb2Nlc3Nvcl93cml0ZV9saW1pdCwKIAkubGxzZWVrID0gc2VxX2xzZWVrLAogCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl90aHJvdHRsaW5nLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYwppbmRleCA3NGE1MmQ0Li5iOTY2NTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYwpAQCAtMzA2LDkgKzMwNiw5IEBACiAJCQkgICBQREUoaW5vZGUpLT5kYXRhKTsKIH0KIAotc3NpemVfdCBhY3BpX3Byb2Nlc3Nvcl93cml0ZV90aHJvdHRsaW5nKHN0cnVjdCBmaWxlICogZmlsZSwKLQkJCQkJY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCi0JCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICogZGF0YSkKK3N0YXRpYyBzc2l6ZV90IGFjcGlfcHJvY2Vzc29yX3dyaXRlX3Rocm90dGxpbmcoc3RydWN0IGZpbGUgKiBmaWxlLAorCQkJCQkgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIGRhdGEpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IHNlcV9maWxlICptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKQEAgLTMzNyw2ICszMzcsNyBAQAogc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nX2ZvcHMgPSB7CiAJLm9wZW4gPSBhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nX29wZW5fZnMsCiAJLnJlYWQgPSBzZXFfcmVhZCwKKwkud3JpdGUgPSBhY3BpX3Byb2Nlc3Nvcl93cml0ZV90aHJvdHRsaW5nLAogCS5sbHNlZWsgPSBzZXFfbHNlZWssCiAJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL01ha2VmaWxlIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9NYWtlZmlsZQppbmRleCAyMTMwYjc0Li44ZGU0ZjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvTWFrZWZpbGUKQEAgLTIsNyArMiw3IEBACiAjIE1ha2VmaWxlIGZvciBhbGwgTGludXggQUNQSSBpbnRlcnByZXRlciBzdWJkaXJlY3RvcmllcwogIwogCi1vYmoteSA6PSByc2FkZHIubyAgcnNjcmVhdGUubyAgcnNpby5vICAgcnNsaXN0Lm8gICAgcnNtaXNjLm8gICByc3hmYWNlLm8gXAorb2JqLXkgOj0gcnNhZGRyLm8gcnNjcmVhdGUubyByc2luZm8ubyByc2lvLm8gcnNsaXN0Lm8gcnNtaXNjLm8gcnN4ZmFjZS5vIFwKIAkgcnNjYWxjLm8gIHJzaXJxLm8gIHJzbWVtb3J5Lm8gIHJzdXRpbHMubwogCiBvYmotJChBQ1BJX0ZVVFVSRV9VU0FHRSkgKz0gcnNkdW1wLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNhZGRyLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzYWRkci5jCmluZGV4IDIzYjU0YmEuLjhmYTMyMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNhZGRyLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2FkZHIuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC00NywxMDcyICs0NywzMzQgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1JFU09VUkNFUwogQUNQSV9NT0RVTEVfTkFNRSgicnNhZGRyIikKIAotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIHZvaWQKLWFjcGlfcnNfZGVjb2RlX2dlbmVyYWxfZmxhZ3ModW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpyZXNvdXJjZSwgdTggZmxhZ3MpOwotCi1zdGF0aWMgdTggYWNwaV9yc19lbmNvZGVfZ2VuZXJhbF9mbGFncyh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKnJlc291cmNlKTsKLQotc3RhdGljIHZvaWQKLWFjcGlfcnNfZGVjb2RlX3NwZWNpZmljX2ZsYWdzKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqcmVzb3VyY2UsIHU4IGZsYWdzKTsKLQotc3RhdGljIHU4IGFjcGlfcnNfZW5jb2RlX3NwZWNpZmljX2ZsYWdzKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqcmVzb3VyY2UpOwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2RlY29kZV9nZW5lcmFsX2ZsYWdzCi0gKgotICogUEFSQU1FVEVSUzogIFJlc291cmNlICAgICAgICAgICAgLSBBZGRyZXNzIHJlc291cmNlIGRhdGEgc3RydWN0Ci0gKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAtIEFjdHVhbCBmbGFnIGJ5dGUKLSAqCi0gKiBSRVRVUk46ICAgICAgRGVjb2RlZCBmbGFnIGJpdHMgaW4gcmVzb3VyY2Ugc3RydWN0Ci0gKgotICogREVTQ1JJUFRJT046IERlY29kZSBhIGdlbmVyYWwgZmxhZyBieXRlIHRvIGFuIGFkZHJlc3MgcmVzb3VyY2Ugc3RydWN0CisgKiBhY3BpX3JzX2NvbnZlcnRfYWRkcmVzczE2IC0gQWxsIFdPUkQgKDE2LWJpdCkgYWRkcmVzcyByZXNvdXJjZXMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19jb252ZXJ0X2FkZHJlc3MxNls1XSA9IHsKKwl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MxNiwKKwkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNiksCisJIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19jb252ZXJ0X2FkZHJlc3MxNil9LAogCi1zdGF0aWMgdm9pZAotYWNwaV9yc19kZWNvZGVfZ2VuZXJhbF9mbGFncyh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKnJlc291cmNlLCB1OCBmbGFncykKLXsKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisJe0FDUElfUlNDX0lOSVRTRVQsIEFDUElfUkVTT1VSQ0VfTkFNRV9BRERSRVNTMTYsCisJIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2FkZHJlc3MxNiksCisJIDB9LAogCi0JLyogUHJvZHVjZXIgLyBDb25zdW1lciAtIGZsYWcgYml0WzBdICovCisJLyogUmVzb3VyY2UgVHlwZSwgR2VuZXJhbCBGbGFncywgYW5kIFR5cGUtU3BlY2lmaWMgRmxhZ3MgKi8KIAotCXJlc291cmNlLT5hZGRyZXNzLnByb2R1Y2VyX2NvbnN1bWVyID0gKHUzMikgKGZsYWdzICYgMHgwMSk7Ci0KLQkvKiBEZWNvZGUgKF9ERUMpIC0gZmxhZyBiaXRbMV0gKi8KLQotCXJlc291cmNlLT5hZGRyZXNzLmRlY29kZSA9ICh1MzIpICgoZmxhZ3MgPj4gMSkgJiAweDAxKTsKLQotCS8qIE1pbiBBZGRyZXNzIEZpeGVkIChfTUlGKSAtIGZsYWcgYml0WzJdICovCi0KLQlyZXNvdXJjZS0+YWRkcmVzcy5taW5fYWRkcmVzc19maXhlZCA9ICh1MzIpICgoZmxhZ3MgPj4gMikgJiAweDAxKTsKLQotCS8qIE1heCBBZGRyZXNzIEZpeGVkIChfTUFGKSAtIGZsYWcgYml0WzNdICovCi0KLQlyZXNvdXJjZS0+YWRkcmVzcy5tYXhfYWRkcmVzc19maXhlZCA9ICh1MzIpICgoZmxhZ3MgPj4gMykgJiAweDAxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19lbmNvZGVfZ2VuZXJhbF9mbGFncwotICoKLSAqIFBBUkFNRVRFUlM6ICBSZXNvdXJjZSAgICAgICAgICAgIC0gQWRkcmVzcyByZXNvdXJjZSBkYXRhIHN0cnVjdAotICoKLSAqIFJFVFVSTjogICAgICBFbmNvZGVkIGdlbmVyYWwgZmxhZyBieXRlCi0gKgotICogREVTQ1JJUFRJT046IENvbnN0cnVjdCBhIGdlbmVyYWwgZmxhZyBieXRlIGZyb20gYW4gYWRkcmVzcyByZXNvdXJjZSBzdHJ1Y3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdTggYWNwaV9yc19lbmNvZGVfZ2VuZXJhbF9mbGFncyh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKnJlc291cmNlKQotewotCXU4IGZsYWdzOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JLyogUHJvZHVjZXIgLyBDb25zdW1lciAtIGZsYWcgYml0WzBdICovCi0KLQlmbGFncyA9ICh1OCkgKHJlc291cmNlLT5hZGRyZXNzLnByb2R1Y2VyX2NvbnN1bWVyICYgMHgwMSk7Ci0KLQkvKiBEZWNvZGUgKF9ERUMpIC0gZmxhZyBiaXRbMV0gKi8KLQotCWZsYWdzIHw9ICh1OCkgKChyZXNvdXJjZS0+YWRkcmVzcy5kZWNvZGUgJiAweDAxKSA8PCAxKTsKLQotCS8qIE1pbiBBZGRyZXNzIEZpeGVkIChfTUlGKSAtIGZsYWcgYml0WzJdICovCi0KLQlmbGFncyB8PSAodTgpICgocmVzb3VyY2UtPmFkZHJlc3MubWluX2FkZHJlc3NfZml4ZWQgJiAweDAxKSA8PCAyKTsKLQotCS8qIE1heCBBZGRyZXNzIEZpeGVkIChfTUFGKSAtIGZsYWcgYml0WzNdICovCi0KLQlmbGFncyB8PSAodTgpICgocmVzb3VyY2UtPmFkZHJlc3MubWF4X2FkZHJlc3NfZml4ZWQgJiAweDAxKSA8PCAzKTsKLQotCXJldHVybiAoZmxhZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2RlY29kZV9zcGVjaWZpY19mbGFncwotICoKLSAqIFBBUkFNRVRFUlM6ICBSZXNvdXJjZSAgICAgICAgICAgIC0gQWRkcmVzcyByZXNvdXJjZSBkYXRhIHN0cnVjdAotICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAgICAgLSBBY3R1YWwgZmxhZyBieXRlCi0gKgotICogUkVUVVJOOiAgICAgIERlY29kZWQgZmxhZyBiaXRzIGluIGF0dHJpYnV0ZSBzdHJ1Y3QKLSAqCi0gKiBERVNDUklQVElPTjogRGVjb2RlIGEgdHlwZS1zcGVjaWZpYyBmbGFnIGJ5dGUgdG8gYW4gYXR0cmlidXRlIHN0cnVjdC4KLSAqICAgICAgICAgICAgICBUeXBlLXNwZWNpZmljIGZsYWdzIGFyZSBvbmx5IGRlZmluZWQgZm9yIHRoZSBNZW1vcnkgYW5kIElPCi0gKiAgICAgICAgICAgICAgcmVzb3VyY2UgdHlwZXMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWFjcGlfcnNfZGVjb2RlX3NwZWNpZmljX2ZsYWdzKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqcmVzb3VyY2UsIHU4IGZsYWdzKQotewotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCWlmIChyZXNvdXJjZS0+YWRkcmVzcy5yZXNvdXJjZV90eXBlID09IEFDUElfTUVNT1JZX1JBTkdFKSB7Ci0JCS8qIFdyaXRlIFN0YXR1cyAoX1JXKSAtIGZsYWcgYml0WzBdICovCi0KLQkJcmVzb3VyY2UtPmFkZHJlc3MuYXR0cmlidXRlLm1lbW9yeS5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA9Ci0JCSAgICAodTE2KSAoZmxhZ3MgJiAweDAxKTsKLQotCQkvKiBNZW1vcnkgQXR0cmlidXRlcyAoX01FTSkgLSBmbGFnIGJpdHNbMjoxXSAqLwotCi0JCXJlc291cmNlLT5hZGRyZXNzLmF0dHJpYnV0ZS5tZW1vcnkuY2FjaGVfYXR0cmlidXRlID0KLQkJICAgICh1MTYpICgoZmxhZ3MgPj4gMSkgJiAweDAzKTsKLQl9IGVsc2UgaWYgKHJlc291cmNlLT5hZGRyZXNzLnJlc291cmNlX3R5cGUgPT0gQUNQSV9JT19SQU5HRSkgewotCQkvKiBSYW5nZXMgKF9STkcpIC0gZmxhZyBiaXRzWzE6MF0gKi8KLQotCQlyZXNvdXJjZS0+YWRkcmVzcy5hdHRyaWJ1dGUuaW8ucmFuZ2VfYXR0cmlidXRlID0KLQkJICAgICh1MTYpIChmbGFncyAmIDB4MDMpOwotCi0JCS8qIFRyYW5zbGF0aW9ucyAoX1RUUCBhbmQgX1RSUykgLSBmbGFnIGJpdHNbNTo0XSAqLwotCi0JCXJlc291cmNlLT5hZGRyZXNzLmF0dHJpYnV0ZS5pby50cmFuc2xhdGlvbl9hdHRyaWJ1dGUgPQotCQkgICAgKHUxNikgKChmbGFncyA+PiA0KSAmIDB4MDMpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19lbmNvZGVfc3BlY2lmaWNfZmxhZ3MKLSAqCi0gKiBQQVJBTUVURVJTOiAgUmVzb3VyY2UgICAgICAgICAgICAtIEFkZHJlc3MgcmVzb3VyY2UgZGF0YSBzdHJ1Y3QKLSAqCi0gKiBSRVRVUk46ICAgICAgRW5jb2RlZCB0eXBlLXNwZWNpZmljIGZsYWcgYnl0ZQotICoKLSAqIERFU0NSSVBUSU9OOiBDb25zdHJ1Y3QgYSB0eXBlLXNwZWNpZmljIGZsYWcgYnl0ZSBmcm9tIGFuIGF0dHJpYnV0ZSBzdHJ1Y3QuCi0gKiAgICAgICAgICAgICAgVHlwZS1zcGVjaWZpYyBmbGFncyBhcmUgb25seSBkZWZpbmVkIGZvciB0aGUgTWVtb3J5IGFuZCBJTwotICogICAgICAgICAgICAgIHJlc291cmNlIHR5cGVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB1OCBhY3BpX3JzX2VuY29kZV9zcGVjaWZpY19mbGFncyh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKnJlc291cmNlKQotewotCXU4IGZsYWdzID0gMDsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCWlmIChyZXNvdXJjZS0+YWRkcmVzcy5yZXNvdXJjZV90eXBlID09IEFDUElfTUVNT1JZX1JBTkdFKSB7Ci0JCS8qIFdyaXRlIFN0YXR1cyAoX1JXKSAtIGZsYWcgYml0WzBdICovCi0KLQkJZmxhZ3MgPSAodTgpCi0JCSAgICAocmVzb3VyY2UtPmFkZHJlc3MuYXR0cmlidXRlLm1lbW9yeS4KLQkJICAgICByZWFkX3dyaXRlX2F0dHJpYnV0ZSAmIDB4MDEpOwotCi0JCS8qIE1lbW9yeSBBdHRyaWJ1dGVzIChfTUVNKSAtIGZsYWcgYml0c1syOjFdICovCi0KLQkJZmxhZ3MgfD0gKHU4KQotCQkgICAgKChyZXNvdXJjZS0+YWRkcmVzcy5hdHRyaWJ1dGUubWVtb3J5LgotCQkgICAgICBjYWNoZV9hdHRyaWJ1dGUgJiAweDAzKSA8PCAxKTsKLQl9IGVsc2UgaWYgKHJlc291cmNlLT5hZGRyZXNzLnJlc291cmNlX3R5cGUgPT0gQUNQSV9JT19SQU5HRSkgewotCQkvKiBSYW5nZXMgKF9STkcpIC0gZmxhZyBiaXRzWzE6MF0gKi8KLQotCQlmbGFncyA9ICh1OCkKLQkJICAgIChyZXNvdXJjZS0+YWRkcmVzcy5hdHRyaWJ1dGUuaW8ucmFuZ2VfYXR0cmlidXRlICYgMHgwMyk7Ci0KLQkJLyogVHJhbnNsYXRpb25zIChfVFRQIGFuZCBfVFJTKSAtIGZsYWcgYml0c1s1OjRdICovCi0KLQkJZmxhZ3MgfD0gKHU4KQotCQkgICAgKChyZXNvdXJjZS0+YWRkcmVzcy5hdHRyaWJ1dGUuaW8uCi0JCSAgICAgIHRyYW5zbGF0aW9uX2F0dHJpYnV0ZSAmIDB4MDMpIDw8IDQpOwotCX0KLQotCXJldHVybiAoZmxhZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2FkZHJlc3MxNl9yZXNvdXJjZQotICoKLSAqIFBBUkFNRVRFUlM6ICBieXRlX3N0cmVhbV9idWZmZXIgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGlucHV0IGJ5dGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbQotICogICAgICAgICAgICAgIGJ5dGVzX2NvbnN1bWVkICAgICAgICAgIC0gUG9pbnRlciB0byB3aGVyZSB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lZCB0aGUgYnl0ZV9zdHJlYW1fYnVmZmVyIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZAotICogICAgICAgICAgICAgIG91dHB1dF9idWZmZXIgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmV0dXJuIGRhdGEgYnVmZmVyCi0gKiAgICAgICAgICAgICAgc3RydWN0dXJlX3NpemUgICAgICAgICAgLSBQb2ludGVyIHRvIHdoZXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByZXR1cm4gZGF0YSBzdHJ1Y3QgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRha2UgdGhlIHJlc291cmNlIGJ5dGUgc3RyZWFtIGFuZCBmaWxsIG91dCB0aGUgYXBwcm9wcmlhdGUKLSAqICAgICAgICAgICAgICBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSB0aGUgb3V0cHV0X2J1ZmZlci4gUmV0dXJuIHRoZQotICogICAgICAgICAgICAgIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBmcm9tIHRoZSBieXRlIHN0cmVhbS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9yc19hZGRyZXNzMTZfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkgICBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKLQkJCSAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKQotewotCXUzMiBpbmRleDsKLQl1MTYgdGVtcDE2OwotCXU4IHRlbXA4OwotCXU4ICp0ZW1wX3B0cjsKLQl1OCAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikqb3V0cHV0X2J1ZmZlcjsKLQlhY3BpX3NpemUgc3RydWN0X3NpemUgPQotCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMTYpOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfYWRkcmVzczE2X3Jlc291cmNlIik7Ci0KLQkvKiBHZXQgdGhlIERlc2NyaXB0b3IgTGVuZ3RoIGZpZWxkICovCi0KLQlidWZmZXIgKz0gMTsKLQlBQ1BJX01PVkVfMTZfVE9fMTYoJnRlbXAxNiwgYnVmZmVyKTsKLQotCS8qIFZhbGlkYXRlIG1pbmltdW0gZGVzY3JpcHRvciBsZW5ndGggKi8KLQotCWlmICh0ZW1wMTYgPCAxMykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0JBRF9SRVNPVVJDRV9MRU5HVEgpOwotCX0KLQotCSpieXRlc19jb25zdW1lZCA9IHRlbXAxNiArIDM7Ci0Jb3V0cHV0X3N0cnVjdC0+aWQgPSBBQ1BJX1JTVFlQRV9BRERSRVNTMTY7Ci0KLQkvKiBHZXQgdGhlIFJlc291cmNlIFR5cGUgKEJ5dGUzKSAqLwotCi0JYnVmZmVyICs9IDI7Ci0JdGVtcDggPSAqYnVmZmVyOwotCi0JLyogVmFsdWVzIDAtMiBhbmQgMHhDMC0weEZGIGFyZSB2YWxpZCAqLwotCi0JaWYgKCh0ZW1wOCA+IDIpICYmICh0ZW1wOCA8IDB4QzApKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5WQUxJRF9SRVNPVVJDRV9UWVBFKTsKLQl9Ci0KLQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV90eXBlID0gdGVtcDg7Ci0KLQkvKiBHZXQgdGhlIEdlbmVyYWwgRmxhZ3MgKEJ5dGU0KSAqLwotCi0JYnVmZmVyICs9IDE7Ci0JYWNwaV9yc19kZWNvZGVfZ2VuZXJhbF9mbGFncygmb3V0cHV0X3N0cnVjdC0+ZGF0YSwgKmJ1ZmZlcik7Ci0KLQkvKiBHZXQgdGhlIFR5cGUgU3BlY2lmaWMgRmxhZ3MgKEJ5dGU1KSAqLwotCi0JYnVmZmVyICs9IDE7Ci0JYWNwaV9yc19kZWNvZGVfc3BlY2lmaWNfZmxhZ3MoJm91dHB1dF9zdHJ1Y3QtPmRhdGEsICpidWZmZXIpOwotCi0JLyogR2V0IEdyYW51bGFyaXR5IChCeXRlcyA2LTcpICovCi0KLQlidWZmZXIgKz0gMTsKLQlBQ1BJX01PVkVfMTZfVE9fMzIoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LmdyYW51bGFyaXR5LCBidWZmZXIpOwotCi0JLyogR2V0IG1pbl9hZGRyZXNzX3JhbmdlIChCeXRlcyA4LTkpICovCi0KLQlidWZmZXIgKz0gMjsKLQlBQ1BJX01PVkVfMTZfVE9fMzIoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2Lm1pbl9hZGRyZXNzX3JhbmdlLAotCQkJICAgYnVmZmVyKTsKLQotCS8qIEdldCBtYXhfYWRkcmVzc19yYW5nZSAoQnl0ZXMgMTAtMTEpICovCi0KLQlidWZmZXIgKz0gMjsKLQlBQ1BJX01PVkVfMTZfVE9fMzIoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2Lm1heF9hZGRyZXNzX3JhbmdlLAotCQkJICAgYnVmZmVyKTsKLQotCS8qIEdldCBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCAoQnl0ZXMgMTItMTMpICovCi0KLQlidWZmZXIgKz0gMjsKLQlBQ1BJX01PVkVfMTZfVE9fMzIoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LgotCQkJICAgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQsIGJ1ZmZlcik7Ci0KLQkvKiBHZXQgYWRkcmVzc19sZW5ndGggKEJ5dGVzIDE0LTE1KSAqLwotCi0JYnVmZmVyICs9IDI7Ci0JQUNQSV9NT1ZFXzE2X1RPXzMyKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5hZGRyZXNzX2xlbmd0aCwKLQkJCSAgIGJ1ZmZlcik7Ci0KLQkvKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggKGlmIHByZXNlbnQpICovCi0KLQlidWZmZXIgKz0gMjsKKwl7QUNQSV9SU0NfQUREUkVTUywgMCwgMCwgMH0sCiAKIAkvKgotCSAqIFRoaXMgd2lsbCBsZWF2ZSB1cyBwb2ludGluZyB0byB0aGUgUmVzb3VyY2UgU291cmNlIEluZGV4Ci0JICogSWYgaXQgaXMgcHJlc2VudCwgdGhlbiBzYXZlIGl0IG9mZiBhbmQgY2FsY3VsYXRlIHRoZQotCSAqIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG51bGwgdGVybWluYXRlZCBzdHJpbmcgZ29lczoKLQkgKiBFYWNoIEludGVycnVwdCB0YWtlcyAzMi1iaXRzICsgdGhlIDUgYnl0ZXMgb2YgdGhlCi0JICogc3RyZWFtIHRoYXQgYXJlIGRlZmF1bHQuCi0JICoKLQkgKiBOb3RlOiBTb21lIHJlc291cmNlIGRlc2NyaXB0b3JzIHdpbGwgaGF2ZSBhbiBhZGRpdGlvbmFsIG51bGwsIHNvCi0JICogd2UgYWRkIDEgdG8gdGhlIGxlbmd0aC4KKwkgKiBUaGVzZSBmaWVsZHMgYXJlIGNvbnRpZ3VvdXMgaW4gYm90aCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbjoKKwkgKiBBZGRyZXNzIEdyYW51bGFyaXR5CisJICogQWRkcmVzcyBSYW5nZSBNaW5pbXVtCisJICogQWRkcmVzcyBSYW5nZSBNYXhpbXVtCisJICogQWRkcmVzcyBUcmFuc2xhdGlvbiBPZmZzZXQKKwkgKiBBZGRyZXNzIExlbmd0aAogCSAqLwotCWlmICgqYnl0ZXNfY29uc3VtZWQgPiAoMTYgKyAxKSkgewotCQkvKiBEZXJlZmVyZW5jZSB0aGUgSW5kZXggKi8KKwl7QUNQSV9SU0NfTU9WRTE2LCBBQ1BJX1JTX09GRlNFVChkYXRhLmFkZHJlc3MxNi5ncmFudWxhcml0eSksCisJIEFNTF9PRkZTRVQoYWRkcmVzczE2LmdyYW51bGFyaXR5KSwKKwkgNX0sCiAKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLmluZGV4ID0KLQkJICAgICh1MzIpICogYnVmZmVyOworCS8qIE9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSAoSW5kZXggYW5kIFN0cmluZykgKi8KIAotCQkvKiBQb2ludCB0byB0aGUgU3RyaW5nICovCisJe0FDUElfUlNDX1NPVVJDRSwgQUNQSV9SU19PRkZTRVQoZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlKSwKKwkgMCwKKwkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfYWRkcmVzczE2KX0KK307CiAKLQkJYnVmZmVyICs9IDE7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGFjcGlfcnNfY29udmVydF9hZGRyZXNzMzIgLSBBbGwgRFdPUkQgKDMyLWJpdCkgYWRkcmVzcyByZXNvdXJjZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0JCS8qIFBvaW50IHRoZSBTdHJpbmcgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoaXMgc3RydWN0dXJlICovCitzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfYWRkcmVzczMyWzVdID0geworCXtBQ1BJX1JTQ19JTklUR0VULCBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzMyLAorCSBBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyKSwKKwkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX2NvbnZlcnRfYWRkcmVzczMyKX0sCiAKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIgPQotCQkgICAgKGNoYXIgKikoKHU4ICopIG91dHB1dF9zdHJ1Y3QgKyBzdHJ1Y3Rfc2l6ZSk7CisJe0FDUElfUlNDX0lOSVRTRVQsIEFDUElfUkVTT1VSQ0VfTkFNRV9BRERSRVNTMzIsCisJIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2FkZHJlc3MzMiksCisJIDB9LAogCi0JCXRlbXBfcHRyID0gKHU4ICopCi0JCSAgICBvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cjsKKwkvKiBSZXNvdXJjZSBUeXBlLCBHZW5lcmFsIEZsYWdzLCBhbmQgVHlwZS1TcGVjaWZpYyBGbGFncyAqLwogCi0JCS8qIENvcHkgdGhlIHJlc291cmNlX3NvdXJjZSBzdHJpbmcgaW50byB0aGUgYnVmZmVyICovCisJe0FDUElfUlNDX0FERFJFU1MsIDAsIDAsIDB9LAogCi0JCWluZGV4ID0gMDsKLQkJd2hpbGUgKCpidWZmZXIpIHsKLQkJCSp0ZW1wX3B0ciA9ICpidWZmZXI7CisJLyoKKwkgKiBUaGVzZSBmaWVsZHMgYXJlIGNvbnRpZ3VvdXMgaW4gYm90aCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbjoKKwkgKiBBZGRyZXNzIEdyYW51bGFyaXR5CisJICogQWRkcmVzcyBSYW5nZSBNaW5pbXVtCisJICogQWRkcmVzcyBSYW5nZSBNYXhpbXVtCisJICogQWRkcmVzcyBUcmFuc2xhdGlvbiBPZmZzZXQKKwkgKiBBZGRyZXNzIExlbmd0aAorCSAqLworCXtBQ1BJX1JTQ19NT1ZFMzIsIEFDUElfUlNfT0ZGU0VUKGRhdGEuYWRkcmVzczMyLmdyYW51bGFyaXR5KSwKKwkgQU1MX09GRlNFVChhZGRyZXNzMzIuZ3JhbnVsYXJpdHkpLAorCSA1fSwKIAotCQkJdGVtcF9wdHIrKzsKLQkJCWJ1ZmZlcisrOwotCQkJaW5kZXgrKzsKLQkJfQorCS8qIE9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSAoSW5kZXggYW5kIFN0cmluZykgKi8KIAotCQkvKiBBZGQgdGhlIHRlcm1pbmF0aW5nIG51bGwgYW5kIHNldCB0aGUgc3RyaW5nIGxlbmd0aCAqLworCXtBQ1BJX1JTQ19TT1VSQ0UsIEFDUElfUlNfT0ZGU0VUKGRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZSksCisJIDAsCisJIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2FkZHJlc3MzMil9Cit9OwogCi0JCSp0ZW1wX3B0ciA9IDA7Ci0JCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoID0KLQkJICAgIGluZGV4ICsgMTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogYWNwaV9yc19jb252ZXJ0X2FkZHJlc3M2NCAtIEFsbCBRV09SRCAoNjQtYml0KSBhZGRyZXNzIHJlc291cmNlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQkJLyoKLQkJICogSW4gb3JkZXIgZm9yIHRoZSBzdHJ1Y3Rfc2l6ZSB0byBmYWxsIG9uIGEgMzItYml0IGJvdW5kYXJ5LAotCQkgKiBjYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGFuZCBleHBhbmQgdGhlCi0JCSAqIHN0cnVjdF9zaXplIHRvIHRoZSBuZXh0IDMyLWJpdCBib3VuZGFyeS4KLQkJICovCi0JCXRlbXA4ID0gKHU4KSAoaW5kZXggKyAxKTsKLQkJc3RydWN0X3NpemUgKz0gQUNQSV9ST1VORF9VUF90b18zMl9iSVRTKHRlbXA4KTsKK3N0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfY29udmVydF9hZGRyZXNzNjRbNV0gPSB7CisJe0FDUElfUlNDX0lOSVRHRVQsIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTNjQsCisJIEFDUElfUlNfU0laRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQpLAorCSBBQ1BJX1JTQ19UQUJMRV9TSVpFKGFjcGlfcnNfY29udmVydF9hZGRyZXNzNjQpfSwKKworCXtBQ1BJX1JTQ19JTklUU0VULCBBQ1BJX1JFU09VUkNFX05BTUVfQUREUkVTUzY0LAorCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9hZGRyZXNzNjQpLAorCSAwfSwKKworCS8qIFJlc291cmNlIFR5cGUsIEdlbmVyYWwgRmxhZ3MsIGFuZCBUeXBlLVNwZWNpZmljIEZsYWdzICovCisKKwl7QUNQSV9SU0NfQUREUkVTUywgMCwgMCwgMH0sCisKKwkvKgorCSAqIFRoZXNlIGZpZWxkcyBhcmUgY29udGlndW91cyBpbiBib3RoIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uOgorCSAqIEFkZHJlc3MgR3JhbnVsYXJpdHkKKwkgKiBBZGRyZXNzIFJhbmdlIE1pbmltdW0KKwkgKiBBZGRyZXNzIFJhbmdlIE1heGltdW0KKwkgKiBBZGRyZXNzIFRyYW5zbGF0aW9uIE9mZnNldAorCSAqIEFkZHJlc3MgTGVuZ3RoCisJICovCisJe0FDUElfUlNDX01PVkU2NCwgQUNQSV9SU19PRkZTRVQoZGF0YS5hZGRyZXNzNjQuZ3JhbnVsYXJpdHkpLAorCSBBTUxfT0ZGU0VUKGFkZHJlc3M2NC5ncmFudWxhcml0eSksCisJIDV9LAorCisJLyogT3B0aW9uYWwgcmVzb3VyY2Vfc291cmNlIChJbmRleCBhbmQgU3RyaW5nKSAqLworCisJe0FDUElfUlNDX1NPVVJDRSwgQUNQSV9SU19PRkZTRVQoZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlKSwKKwkgMCwKKwkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfYWRkcmVzczY0KX0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogYWNwaV9yc19jb252ZXJ0X2V4dF9hZGRyZXNzNjQgLSBBbGwgRXh0ZW5kZWQgKDY0LWJpdCkgYWRkcmVzcyByZXNvdXJjZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfZXh0X2FkZHJlc3M2NFs1XSA9IHsKKwl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0FERFJFU1M2NCwKKwkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dGVuZGVkX2FkZHJlc3M2NCksCisJIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19jb252ZXJ0X2V4dF9hZGRyZXNzNjQpfSwKKworCXtBQ1BJX1JTQ19JTklUU0VULCBBQ1BJX1JFU09VUkNFX05BTUVfRVhURU5ERURfQUREUkVTUzY0LAorCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9leHRlbmRlZF9hZGRyZXNzNjQpLAorCSAwfSwKKworCS8qIFJlc291cmNlIFR5cGUsIEdlbmVyYWwgRmxhZ3MsIGFuZCBUeXBlLVNwZWNpZmljIEZsYWdzICovCisKKwl7QUNQSV9SU0NfQUREUkVTUywgMCwgMCwgMH0sCisKKwkvKiBSZXZpc2lvbiBJRCAqLworCisJe0FDUElfUlNDX01PVkU4LCBBQ1BJX1JTX09GRlNFVChkYXRhLmV4dF9hZGRyZXNzNjQucmV2aXNpb25faUQpLAorCSBBTUxfT0ZGU0VUKGV4dF9hZGRyZXNzNjQucmV2aXNpb25faUQpLAorCSAxfSwKKwkvKgorCSAqIFRoZXNlIGZpZWxkcyBhcmUgY29udGlndW91cyBpbiBib3RoIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uOgorCSAqIEFkZHJlc3MgR3JhbnVsYXJpdHkKKwkgKiBBZGRyZXNzIFJhbmdlIE1pbmltdW0KKwkgKiBBZGRyZXNzIFJhbmdlIE1heGltdW0KKwkgKiBBZGRyZXNzIFRyYW5zbGF0aW9uIE9mZnNldAorCSAqIEFkZHJlc3MgTGVuZ3RoCisJICogVHlwZS1TcGVjaWZpYyBBdHRyaWJ1dGUKKwkgKi8KKwl7QUNQSV9SU0NfTU9WRTY0LCBBQ1BJX1JTX09GRlNFVChkYXRhLmV4dF9hZGRyZXNzNjQuZ3JhbnVsYXJpdHkpLAorCSBBTUxfT0ZGU0VUKGV4dF9hZGRyZXNzNjQuZ3JhbnVsYXJpdHkpLAorCSA2fQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhY3BpX3JzX2NvbnZlcnRfZ2VuZXJhbF9mbGFncyAtIEZsYWdzIGNvbW1vbiB0byBhbGwgYWRkcmVzcyBkZXNjcmlwdG9ycworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfZ2VuZXJhbF9mbGFnc1s2XSA9IHsKKwl7QUNQSV9SU0NfRkxBR0lOSVQsIDAsIEFNTF9PRkZTRVQoYWRkcmVzcy5mbGFncyksCisJIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19jb252ZXJ0X2dlbmVyYWxfZmxhZ3MpfSwKKworCS8qIFJlc291cmNlIFR5cGUgKE1lbW9yeSwgSW8sIGJ1c19udW1iZXIsIGV0Yy4pICovCisKKwl7QUNQSV9SU0NfTU9WRTgsIEFDUElfUlNfT0ZGU0VUKGRhdGEuYWRkcmVzcy5yZXNvdXJjZV90eXBlKSwKKwkgQU1MX09GRlNFVChhZGRyZXNzLnJlc291cmNlX3R5cGUpLAorCSAxfSwKKworCS8qIEdlbmVyYWwgRmxhZ3MgLSBDb25zdW1lLCBEZWNvZGUsIG1pbl9maXhlZCwgbWF4X2ZpeGVkICovCisKKwl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuYWRkcmVzcy5wcm9kdWNlcl9jb25zdW1lciksCisJIEFNTF9PRkZTRVQoYWRkcmVzcy5mbGFncyksCisJIDB9LAorCisJe0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmFkZHJlc3MuZGVjb2RlKSwKKwkgQU1MX09GRlNFVChhZGRyZXNzLmZsYWdzKSwKKwkgMX0sCisKKwl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuYWRkcmVzcy5taW5fYWRkcmVzc19maXhlZCksCisJIEFNTF9PRkZTRVQoYWRkcmVzcy5mbGFncyksCisJIDJ9LAorCisJe0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmFkZHJlc3MubWF4X2FkZHJlc3NfZml4ZWQpLAorCSBBTUxfT0ZGU0VUKGFkZHJlc3MuZmxhZ3MpLAorCSAzfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhY3BpX3JzX2NvbnZlcnRfbWVtX2ZsYWdzIC0gRmxhZ3MgY29tbW9uIHRvIE1lbW9yeSBhZGRyZXNzIGRlc2NyaXB0b3JzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfY29udmVydF9tZW1fZmxhZ3NbNV0gPSB7CisJe0FDUElfUlNDX0ZMQUdJTklULCAwLCBBTUxfT0ZGU0VUKGFkZHJlc3Muc3BlY2lmaWNfZmxhZ3MpLAorCSBBQ1BJX1JTQ19UQUJMRV9TSVpFKGFjcGlfcnNfY29udmVydF9tZW1fZmxhZ3MpfSwKKworCS8qIE1lbW9yeS1zcGVjaWZpYyBmbGFncyAqLworCisJe0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmFkZHJlc3MuaW5mby5tZW0ud3JpdGVfcHJvdGVjdCksCisJIEFNTF9PRkZTRVQoYWRkcmVzcy5zcGVjaWZpY19mbGFncyksCisJIDB9LAorCisJe0FDUElfUlNDXzJCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmFkZHJlc3MuaW5mby5tZW0uY2FjaGluZyksCisJIEFNTF9PRkZTRVQoYWRkcmVzcy5zcGVjaWZpY19mbGFncyksCisJIDF9LAorCisJe0FDUElfUlNDXzJCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmFkZHJlc3MuaW5mby5tZW0ucmFuZ2VfdHlwZSksCisJIEFNTF9PRkZTRVQoYWRkcmVzcy5zcGVjaWZpY19mbGFncyksCisJIDN9LAorCisJe0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmFkZHJlc3MuaW5mby5tZW0udHJhbnNsYXRpb24pLAorCSBBTUxfT0ZGU0VUKGFkZHJlc3Muc3BlY2lmaWNfZmxhZ3MpLAorCSA1fQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhY3BpX3JzX2NvbnZlcnRfaW9fZmxhZ3MgLSBGbGFncyBjb21tb24gdG8gSS9PIGFkZHJlc3MgZGVzY3JpcHRvcnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19jb252ZXJ0X2lvX2ZsYWdzWzRdID0geworCXtBQ1BJX1JTQ19GTEFHSU5JVCwgMCwgQU1MX09GRlNFVChhZGRyZXNzLnNwZWNpZmljX2ZsYWdzKSwKKwkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX2NvbnZlcnRfaW9fZmxhZ3MpfSwKKworCS8qIEkvTy1zcGVjaWZpYyBmbGFncyAqLworCisJe0FDUElfUlNDXzJCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmFkZHJlc3MuaW5mby5pby5yYW5nZV90eXBlKSwKKwkgQU1MX09GRlNFVChhZGRyZXNzLnNwZWNpZmljX2ZsYWdzKSwKKwkgMH0sCisKKwl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuYWRkcmVzcy5pbmZvLmlvLnRyYW5zbGF0aW9uKSwKKwkgQU1MX09GRlNFVChhZGRyZXNzLnNwZWNpZmljX2ZsYWdzKSwKKwkgNH0sCisKKwl7QUNQSV9SU0NfMUJJVEZMQUcsCisJIEFDUElfUlNfT0ZGU0VUKGRhdGEuYWRkcmVzcy5pbmZvLmlvLnRyYW5zbGF0aW9uX3R5cGUpLAorCSBBTUxfT0ZGU0VUKGFkZHJlc3Muc3BlY2lmaWNfZmxhZ3MpLAorCSA1fQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yc19nZXRfYWRkcmVzc19jb21tb24KKyAqCisgKiBQQVJBTUVURVJTOiAgUmVzb3VyY2UgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIGludGVybmFsIHJlc291cmNlIHN0cnVjdAorICogICAgICAgICAgICAgIEFtbCAgICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBBTUwgcmVzb3VyY2UgZGVzY3JpcHRvcgorICoKKyAqIFJFVFVSTjogICAgICBUUlVFIGlmIHRoZSByZXNvdXJjZV90eXBlIGZpZWxkIGlzIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAqCisgKiBERVNDUklQVElPTjogQ29udmVydCBjb21tb24gZmxhZyBmaWVsZHMgZnJvbSBhIHJhdyBBTUwgcmVzb3VyY2UgZGVzY3JpcHRvcgorICogICAgICAgICAgICAgIHRvIGFuIGludGVybmFsIHJlc291cmNlIGRlc2NyaXB0b3IKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1OAorYWNwaV9yc19nZXRfYWRkcmVzc19jb21tb24oc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLAorCQkJICAgdW5pb24gYW1sX3Jlc291cmNlICphbWwpCit7CisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJLyogVmFsaWRhdGUgdGhlIFJlc291cmNlIFR5cGUgKi8KKworCWlmICgoYW1sLT5hZGRyZXNzLnJlc291cmNlX3R5cGUgPiAyKQorCSAgICAmJiAoYW1sLT5hZGRyZXNzLnJlc291cmNlX3R5cGUgPCAweEMwKSkgeworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisKKwkvKiBHZXQgdGhlIFJlc291cmNlIFR5cGUgYW5kIEdlbmVyYWwgRmxhZ3MgKi8KKworCSh2b2lkKWFjcGlfcnNfY29udmVydF9hbWxfdG9fcmVzb3VyY2UocmVzb3VyY2UsIGFtbCwKKwkJCQkJICAgICAgYWNwaV9yc19jb252ZXJ0X2dlbmVyYWxfZmxhZ3MpOworCisJLyogR2V0IHRoZSBUeXBlLVNwZWNpZmljIEZsYWdzIChNZW1vcnkgYW5kIEkvTyBkZXNjcmlwdG9ycyBvbmx5KSAqLworCisJaWYgKHJlc291cmNlLT5kYXRhLmFkZHJlc3MucmVzb3VyY2VfdHlwZSA9PSBBQ1BJX01FTU9SWV9SQU5HRSkgeworCQkodm9pZClhY3BpX3JzX2NvbnZlcnRfYW1sX3RvX3Jlc291cmNlKHJlc291cmNlLCBhbWwsCisJCQkJCQkgICAgICBhY3BpX3JzX2NvbnZlcnRfbWVtX2ZsYWdzKTsKKwl9IGVsc2UgaWYgKHJlc291cmNlLT5kYXRhLmFkZHJlc3MucmVzb3VyY2VfdHlwZSA9PSBBQ1BJX0lPX1JBTkdFKSB7CisJCSh2b2lkKWFjcGlfcnNfY29udmVydF9hbWxfdG9fcmVzb3VyY2UocmVzb3VyY2UsIGFtbCwKKwkJCQkJCSAgICAgIGFjcGlfcnNfY29udmVydF9pb19mbGFncyk7CiAJfSBlbHNlIHsKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLmluZGV4ID0gMDsKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGggPSAwOwotCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0ciA9IE5VTEw7CisJCS8qIEdlbmVyaWMgcmVzb3VyY2UgdHlwZSwganVzdCBncmFiIHRoZSB0eXBlX3NwZWNpZmljIGJ5dGUgKi8KKworCQlyZXNvdXJjZS0+ZGF0YS5hZGRyZXNzLmluZm8udHlwZV9zcGVjaWZpYyA9CisJCSAgICBhbWwtPmFkZHJlc3Muc3BlY2lmaWNfZmxhZ3M7CiAJfQogCi0JLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCi0KLQlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKLQotCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCi0KLQkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCXJldHVybiAoVFJVRSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfYWRkcmVzczE2X3N0cmVhbQorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfc2V0X2FkZHJlc3NfY29tbW9uCiAgKgotICogUEFSQU1FVEVSUzogIGxpbmtlZF9saXN0ICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmVzb3VyY2UgbGlua2VkIGxpc3QKLSAqICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHVzZXIncyByZXR1cm4gYnVmZmVyCi0gKiAgICAgICAgICAgICAgYnl0ZXNfY29uc3VtZWQgICAgICAgICAgLSBQb2ludGVyIHRvIHdoZXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gdGhlIG91dHB1dF9idWZmZXIgaXMgcmV0dXJuZWQKKyAqIFBBUkFNRVRFUlM6ICBBbWwgICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IKKyAqICAgICAgICAgICAgICBSZXNvdXJjZSAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgaW50ZXJuYWwgcmVzb3VyY2Ugc3RydWN0CiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cworICogUkVUVVJOOiAgICAgIE5vbmUKICAqCi0gKiBERVNDUklQVElPTjogVGFrZSB0aGUgbGlua2VkIGxpc3QgcmVzb3VyY2Ugc3RydWN0dXJlIGFuZCBmaWxscyBpbiB0aGUKLSAqICAgICAgICAgICAgICB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gYSBieXRlIHN0cmVhbQorICogREVTQ1JJUFRJT046IENvbnZlcnQgY29tbW9uIGZsYWcgZmllbGRzIGZyb20gYSByZXNvdXJjZSBkZXNjcmlwdG9yIHRvIGFuCisgKiAgICAgICAgICAgICAgQU1MIGRlc2NyaXB0b3IKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9yc19hZGRyZXNzMTZfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKLQkJCSB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCkKK3ZvaWQKK2FjcGlfcnNfc2V0X2FkZHJlc3NfY29tbW9uKHVuaW9uIGFtbF9yZXNvdXJjZSAqYW1sLAorCQkJICAgc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlKQogewotCXU4ICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKLQl1OCAqbGVuZ3RoX2ZpZWxkOwotCWFjcGlfc2l6ZSBhY3R1YWxfYnl0ZXM7CisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfYWRkcmVzczE2X3N0cmVhbSIpOworCS8qIFNldCB0aGUgUmVzb3VyY2UgVHlwZSBhbmQgR2VuZXJhbCBGbGFncyAqLwogCi0JLyogU2V0IHRoZSBEZXNjcmlwdG9yIFR5cGUgZmllbGQgKi8KKwkodm9pZClhY3BpX3JzX2NvbnZlcnRfcmVzb3VyY2VfdG9fYW1sKHJlc291cmNlLCBhbWwsCisJCQkJCSAgICAgIGFjcGlfcnNfY29udmVydF9nZW5lcmFsX2ZsYWdzKTsKIAotCSpidWZmZXIgPSBBQ1BJX1JERVNDX1RZUEVfV09SRF9BRERSRVNTX1NQQUNFOwotCWJ1ZmZlciArPSAxOworCS8qIFNldCB0aGUgVHlwZS1TcGVjaWZpYyBGbGFncyAoTWVtb3J5IGFuZCBJL08gZGVzY3JpcHRvcnMgb25seSkgKi8KIAotCS8qIFNhdmUgYSBwb2ludGVyIHRvIHRoZSBMZW5ndGggZmllbGQgLSB0byBiZSBmaWxsZWQgaW4gbGF0ZXIgKi8KLQotCWxlbmd0aF9maWVsZCA9IGJ1ZmZlcjsKLQlidWZmZXIgKz0gMjsKLQotCS8qIFNldCB0aGUgUmVzb3VyY2UgVHlwZSAoTWVtb3J5LCBJbywgYnVzX251bWJlcikgKi8KLQotCSpidWZmZXIgPSAodTgpIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2VfdHlwZSAmIDB4MDMpOwotCWJ1ZmZlciArPSAxOwotCi0JLyogU2V0IHRoZSBnZW5lcmFsIGZsYWdzICovCi0KLQkqYnVmZmVyID0gYWNwaV9yc19lbmNvZGVfZ2VuZXJhbF9mbGFncygmbGlua2VkX2xpc3QtPmRhdGEpOwotCWJ1ZmZlciArPSAxOwotCi0JLyogU2V0IHRoZSB0eXBlIHNwZWNpZmljIGZsYWdzICovCi0KLQkqYnVmZmVyID0gYWNwaV9yc19lbmNvZGVfc3BlY2lmaWNfZmxhZ3MoJmxpbmtlZF9saXN0LT5kYXRhKTsKLQlidWZmZXIgKz0gMTsKLQotCS8qIFNldCB0aGUgYWRkcmVzcyBzcGFjZSBncmFudWxhcml0eSAqLwotCi0JQUNQSV9NT1ZFXzMyX1RPXzE2KGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5ncmFudWxhcml0eSk7Ci0JYnVmZmVyICs9IDI7Ci0KLQkvKiBTZXQgdGhlIGFkZHJlc3MgcmFuZ2UgbWluaW11bSAqLwotCi0JQUNQSV9NT1ZFXzMyX1RPXzE2KGJ1ZmZlciwKLQkJCSAgICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYubWluX2FkZHJlc3NfcmFuZ2UpOwotCWJ1ZmZlciArPSAyOwotCi0JLyogU2V0IHRoZSBhZGRyZXNzIHJhbmdlIG1heGltdW0gKi8KLQotCUFDUElfTU9WRV8zMl9UT18xNihidWZmZXIsCi0JCQkgICAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2Lm1heF9hZGRyZXNzX3JhbmdlKTsKLQlidWZmZXIgKz0gMjsKLQotCS8qIFNldCB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiBvZmZzZXQgKi8KLQotCUFDUElfTU9WRV8zMl9UT18xNihidWZmZXIsCi0JCQkgICAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LgotCQkJICAgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOwotCWJ1ZmZlciArPSAyOwotCi0JLyogU2V0IHRoZSBhZGRyZXNzIGxlbmd0aCAqLwotCi0JQUNQSV9NT1ZFXzMyX1RPXzE2KGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5hZGRyZXNzX2xlbmd0aCk7Ci0JYnVmZmVyICs9IDI7Ci0KLQkvKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggYW5kIFJlc291cmNlIFNvdXJjZSBhcmUgb3B0aW9uYWwgKi8KLQotCWlmIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGgpIHsKLQkJKmJ1ZmZlciA9Ci0JCSAgICAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2UuaW5kZXg7Ci0JCWJ1ZmZlciArPSAxOwotCi0JCS8qIENvcHkgdGhlIHJlc291cmNlX3NvdXJjZSBzdHJpbmcgKi8KLQotCQlBQ1BJX1NUUkNQWSgoY2hhciAqKWJ1ZmZlciwKLQkJCSAgICBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLgotCQkJICAgIHN0cmluZ19wdHIpOwotCi0JCS8qCi0JCSAqIEJ1ZmZlciBuZWVkcyB0byBiZSBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nICsgb25lIGZvciB0aGUKLQkJICogdGVybWluYXRpbmcgbnVsbAotCQkgKi8KLQkJYnVmZmVyICs9Ci0JCSAgICAoYWNwaV9zaXplKSAoQUNQSV9TVFJMRU4KLQkJCQkgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2UuCi0JCQkJICBzdHJpbmdfcHRyKSArIDEpOwotCX0KLQotCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCi0KLQlhY3R1YWxfYnl0ZXMgPSBBQ1BJX1BUUl9ESUZGKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwotCSpieXRlc19jb25zdW1lZCA9IGFjdHVhbF9ieXRlczsKLQotCS8qCi0JICogU2V0IHRoZSBsZW5ndGggZmllbGQgdG8gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZAotCSAqIG1pbnVzIHRoZSBoZWFkZXIgc2l6ZSAoMyBieXRlcykKLQkgKi8KLQlhY3R1YWxfYnl0ZXMgLT0gMzsKLQlBQ1BJX01PVkVfU0laRV9UT18xNihsZW5ndGhfZmllbGQsICZhY3R1YWxfYnl0ZXMpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfYWRkcmVzczMyX3Jlc291cmNlCi0gKgotICogUEFSQU1FVEVSUzogIGJ5dGVfc3RyZWFtX2J1ZmZlciAgICAgIC0gUG9pbnRlciB0byB0aGUgcmVzb3VyY2UgaW5wdXQgYnl0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtCi0gKiAgICAgICAgICAgICAgYnl0ZXNfY29uc3VtZWQgICAgICAgICAgLSBQb2ludGVyIHRvIHdoZXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVkIHRoZSBieXRlX3N0cmVhbV9idWZmZXIgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgb3V0cHV0X2J1ZmZlciAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXR1cm4gZGF0YSBidWZmZXIKLSAqICAgICAgICAgICAgICBzdHJ1Y3R1cmVfc2l6ZSAgICAgICAgICAtIFBvaW50ZXIgdG8gd2hlcmUgdGhlIG51bWJlciBvZiBieXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJldHVybiBkYXRhIHN0cnVjdCBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGFrZSB0aGUgcmVzb3VyY2UgYnl0ZSBzdHJlYW0gYW5kIGZpbGwgb3V0IHRoZSBhcHByb3ByaWF0ZQotICogICAgICAgICAgICAgIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IHRoZSBvdXRwdXRfYnVmZmVyLiBSZXR1cm4gdGhlCi0gKiAgICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGZyb20gdGhlIGJ5dGUgc3RyZWFtLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3JzX2FkZHJlc3MzMl9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCSAgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAotCQkJICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpCi17Ci0JdTE2IHRlbXAxNjsKLQl1OCB0ZW1wODsKLQl1OCAqdGVtcF9wdHI7Ci0JdTMyIGluZGV4OwotCXU4ICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSpvdXRwdXRfYnVmZmVyOwotCWFjcGlfc2l6ZSBzdHJ1Y3Rfc2l6ZSA9Ci0JICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMik7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19hZGRyZXNzMzJfcmVzb3VyY2UiKTsKLQotCS8qIEdldCB0aGUgRGVzY3JpcHRvciBMZW5ndGggZmllbGQgKi8KLQotCWJ1ZmZlciArPSAxOwotCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwotCi0JLyogVmFsaWRhdGUgbWluaW11bSBkZXNjcmlwdG9yIGxlbmd0aCAqLwotCi0JaWYgKHRlbXAxNiA8IDIzKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfQkFEX1JFU09VUkNFX0xFTkdUSCk7Ci0JfQotCi0JKmJ5dGVzX2NvbnN1bWVkID0gdGVtcDE2ICsgMzsKLQlvdXRwdXRfc3RydWN0LT5pZCA9IEFDUElfUlNUWVBFX0FERFJFU1MzMjsKLQotCS8qIEdldCB0aGUgUmVzb3VyY2UgVHlwZSAoQnl0ZTMpICovCi0KLQlidWZmZXIgKz0gMjsKLQl0ZW1wOCA9ICpidWZmZXI7Ci0KLQkvKiBWYWx1ZXMgMC0yIGFuZCAweEMwLTB4RkYgYXJlIHZhbGlkICovCi0KLQlpZiAoKHRlbXA4ID4gMikgJiYgKHRlbXA4IDwgMHhDMCkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlZBTElEX1JFU09VUkNFX1RZUEUpOwotCX0KLQotCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3R5cGUgPSB0ZW1wODsKLQotCS8qIEdldCB0aGUgR2VuZXJhbCBGbGFncyAoQnl0ZTQpICovCi0KLQlidWZmZXIgKz0gMTsKLQlhY3BpX3JzX2RlY29kZV9nZW5lcmFsX2ZsYWdzKCZvdXRwdXRfc3RydWN0LT5kYXRhLCAqYnVmZmVyKTsKLQotCS8qIEdldCB0aGUgVHlwZSBTcGVjaWZpYyBGbGFncyAoQnl0ZTUpICovCi0KLQlidWZmZXIgKz0gMTsKLQlhY3BpX3JzX2RlY29kZV9zcGVjaWZpY19mbGFncygmb3V0cHV0X3N0cnVjdC0+ZGF0YSwgKmJ1ZmZlcik7Ci0KLQkvKiBHZXQgR3JhbnVsYXJpdHkgKEJ5dGVzIDYtOSkgKi8KLQotCWJ1ZmZlciArPSAxOwotCUFDUElfTU9WRV8zMl9UT18zMigmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIuZ3JhbnVsYXJpdHksIGJ1ZmZlcik7Ci0KLQkvKiBHZXQgbWluX2FkZHJlc3NfcmFuZ2UgKEJ5dGVzIDEwLTEzKSAqLwotCi0JYnVmZmVyICs9IDQ7Ci0JQUNQSV9NT1ZFXzMyX1RPXzMyKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5taW5fYWRkcmVzc19yYW5nZSwKLQkJCSAgIGJ1ZmZlcik7Ci0KLQkvKiBHZXQgbWF4X2FkZHJlc3NfcmFuZ2UgKEJ5dGVzIDE0LTE3KSAqLwotCi0JYnVmZmVyICs9IDQ7Ci0JQUNQSV9NT1ZFXzMyX1RPXzMyKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5tYXhfYWRkcmVzc19yYW5nZSwKLQkJCSAgIGJ1ZmZlcik7Ci0KLQkvKiBHZXQgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQgKEJ5dGVzIDE4LTIxKSAqLwotCi0JYnVmZmVyICs9IDQ7Ci0JQUNQSV9NT1ZFXzMyX1RPXzMyKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi4KLQkJCSAgIGFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0LCBidWZmZXIpOwotCi0JLyogR2V0IGFkZHJlc3NfbGVuZ3RoIChCeXRlcyAyMi0yNSkgKi8KLQotCWJ1ZmZlciArPSA0OwotCUFDUElfTU9WRV8zMl9UT18zMigmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIuYWRkcmVzc19sZW5ndGgsCi0JCQkgICBidWZmZXIpOwotCi0JLyogUmVzb3VyY2UgU291cmNlIEluZGV4IChpZiBwcmVzZW50KSAqLwotCi0JYnVmZmVyICs9IDQ7Ci0KLQkvKgotCSAqIFRoaXMgd2lsbCBsZWF2ZSB1cyBwb2ludGluZyB0byB0aGUgUmVzb3VyY2UgU291cmNlIEluZGV4Ci0JICogSWYgaXQgaXMgcHJlc2VudCwgdGhlbiBzYXZlIGl0IG9mZiBhbmQgY2FsY3VsYXRlIHRoZQotCSAqIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG51bGwgdGVybWluYXRlZCBzdHJpbmcgZ29lczoKLQkgKgotCSAqIE5vdGU6IFNvbWUgcmVzb3VyY2UgZGVzY3JpcHRvcnMgd2lsbCBoYXZlIGFuIGFkZGl0aW9uYWwgbnVsbCwgc28KLQkgKiB3ZSBhZGQgMSB0byB0aGUgbGVuZ3RoLgotCSAqLwotCWlmICgqYnl0ZXNfY29uc3VtZWQgPiAoMjYgKyAxKSkgewotCQkvKiBEZXJlZmVyZW5jZSB0aGUgSW5kZXggKi8KLQotCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2UuaW5kZXggPQotCQkgICAgKHUzMikgKiBidWZmZXI7Ci0KLQkJLyogUG9pbnQgdG8gdGhlIFN0cmluZyAqLwotCi0JCWJ1ZmZlciArPSAxOwotCi0JCS8qIFBvaW50IHRoZSBTdHJpbmcgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoaXMgc3RydWN0dXJlICovCi0KLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIgPQotCQkgICAgKGNoYXIgKikoKHU4ICopIG91dHB1dF9zdHJ1Y3QgKyBzdHJ1Y3Rfc2l6ZSk7Ci0KLQkJdGVtcF9wdHIgPSAodTggKikKLQkJICAgIG91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyOwotCi0JCS8qIENvcHkgdGhlIHJlc291cmNlX3NvdXJjZSBzdHJpbmcgaW50byB0aGUgYnVmZmVyICovCi0KLQkJaW5kZXggPSAwOwotCQl3aGlsZSAoKmJ1ZmZlcikgewotCQkJKnRlbXBfcHRyID0gKmJ1ZmZlcjsKLQotCQkJdGVtcF9wdHIrKzsKLQkJCWJ1ZmZlcisrOwotCQkJaW5kZXgrKzsKLQkJfQotCi0JCS8qIEFkZCB0aGUgdGVybWluYXRpbmcgbnVsbCBhbmQgc2V0IHRoZSBzdHJpbmcgbGVuZ3RoICovCi0KLQkJKnRlbXBfcHRyID0gMDsKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGggPQotCQkgICAgaW5kZXggKyAxOwotCi0JCS8qCi0JCSAqIEluIG9yZGVyIGZvciB0aGUgc3RydWN0X3NpemUgdG8gZmFsbCBvbiBhIDMyLWJpdCBib3VuZGFyeSwKLQkJICogY2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBhbmQgZXhwYW5kIHRoZQotCQkgKiBzdHJ1Y3Rfc2l6ZSB0byB0aGUgbmV4dCAzMi1iaXQgYm91bmRhcnkuCi0JCSAqLwotCQl0ZW1wOCA9ICh1OCkgKGluZGV4ICsgMSk7Ci0JCXN0cnVjdF9zaXplICs9IEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyh0ZW1wOCk7CisJaWYgKHJlc291cmNlLT5kYXRhLmFkZHJlc3MucmVzb3VyY2VfdHlwZSA9PSBBQ1BJX01FTU9SWV9SQU5HRSkgeworCQkodm9pZClhY3BpX3JzX2NvbnZlcnRfcmVzb3VyY2VfdG9fYW1sKHJlc291cmNlLCBhbWwsCisJCQkJCQkgICAgICBhY3BpX3JzX2NvbnZlcnRfbWVtX2ZsYWdzKTsKKwl9IGVsc2UgaWYgKHJlc291cmNlLT5kYXRhLmFkZHJlc3MucmVzb3VyY2VfdHlwZSA9PSBBQ1BJX0lPX1JBTkdFKSB7CisJCSh2b2lkKWFjcGlfcnNfY29udmVydF9yZXNvdXJjZV90b19hbWwocmVzb3VyY2UsIGFtbCwKKwkJCQkJCSAgICAgIGFjcGlfcnNfY29udmVydF9pb19mbGFncyk7CiAJfSBlbHNlIHsKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLmluZGV4ID0gMDsKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGggPSAwOwotCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0ciA9IE5VTEw7CisJCS8qIEdlbmVyaWMgcmVzb3VyY2UgdHlwZSwganVzdCBjb3B5IHRoZSB0eXBlX3NwZWNpZmljIGJ5dGUgKi8KKworCQlhbWwtPmFkZHJlc3Muc3BlY2lmaWNfZmxhZ3MgPQorCQkgICAgcmVzb3VyY2UtPmRhdGEuYWRkcmVzcy5pbmZvLnR5cGVfc3BlY2lmaWM7CiAJfQotCi0JLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCi0KLQlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKLQotCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCi0KLQkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2FkZHJlc3MzMl9zdHJlYW0KLSAqCi0gKiBQQVJBTUVURVJTOiAgbGlua2VkX2xpc3QgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXNvdXJjZSBsaW5rZWQgbGlzdAotICogICAgICAgICAgICAgIG91dHB1dF9idWZmZXIgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgdXNlcidzIHJldHVybiBidWZmZXIKLSAqICAgICAgICAgICAgICBieXRlc19jb25zdW1lZCAgICAgICAgICAtIFBvaW50ZXIgdG8gd2hlcmUgdGhlIG51bWJlciBvZiBieXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgb3V0cHV0X2J1ZmZlciBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGFrZSB0aGUgbGlua2VkIGxpc3QgcmVzb3VyY2Ugc3RydWN0dXJlIGFuZCBmaWxscyBpbiB0aGUKLSAqICAgICAgICAgICAgICB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gYSBieXRlIHN0cmVhbQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3JzX2FkZHJlc3MzMl9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAotCQkJIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKQotewotCXU4ICpidWZmZXI7Ci0JdTE2ICpsZW5ndGhfZmllbGQ7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19hZGRyZXNzMzJfc3RyZWFtIik7Ci0KLQlidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKLQotCS8qIFNldCB0aGUgRGVzY3JpcHRvciBUeXBlIGZpZWxkICovCi0KLQkqYnVmZmVyID0gQUNQSV9SREVTQ19UWVBFX0RXT1JEX0FERFJFU1NfU1BBQ0U7Ci0JYnVmZmVyICs9IDE7Ci0KLQkvKiBTYXZlIGEgcG9pbnRlciB0byB0aGUgTGVuZ3RoIGZpZWxkIC0gdG8gYmUgZmlsbGVkIGluIGxhdGVyICovCi0KLQlsZW5ndGhfZmllbGQgPSBBQ1BJX0NBU1RfUFRSKHUxNiwgYnVmZmVyKTsKLQlidWZmZXIgKz0gMjsKLQotCS8qIFNldCB0aGUgUmVzb3VyY2UgVHlwZSAoTWVtb3J5LCBJbywgYnVzX251bWJlcikgKi8KLQotCSpidWZmZXIgPSAodTgpIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2VfdHlwZSAmIDB4MDMpOwotCWJ1ZmZlciArPSAxOwotCi0JLyogU2V0IHRoZSBnZW5lcmFsIGZsYWdzICovCi0KLQkqYnVmZmVyID0gYWNwaV9yc19lbmNvZGVfZ2VuZXJhbF9mbGFncygmbGlua2VkX2xpc3QtPmRhdGEpOwotCWJ1ZmZlciArPSAxOwotCi0JLyogU2V0IHRoZSB0eXBlIHNwZWNpZmljIGZsYWdzICovCi0KLQkqYnVmZmVyID0gYWNwaV9yc19lbmNvZGVfc3BlY2lmaWNfZmxhZ3MoJmxpbmtlZF9saXN0LT5kYXRhKTsKLQlidWZmZXIgKz0gMTsKLQotCS8qIFNldCB0aGUgYWRkcmVzcyBzcGFjZSBncmFudWxhcml0eSAqLwotCi0JQUNQSV9NT1ZFXzMyX1RPXzMyKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5ncmFudWxhcml0eSk7Ci0JYnVmZmVyICs9IDQ7Ci0KLQkvKiBTZXQgdGhlIGFkZHJlc3MgcmFuZ2UgbWluaW11bSAqLwotCi0JQUNQSV9NT1ZFXzMyX1RPXzMyKGJ1ZmZlciwKLQkJCSAgICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIubWluX2FkZHJlc3NfcmFuZ2UpOwotCWJ1ZmZlciArPSA0OwotCi0JLyogU2V0IHRoZSBhZGRyZXNzIHJhbmdlIG1heGltdW0gKi8KLQotCUFDUElfTU9WRV8zMl9UT18zMihidWZmZXIsCi0JCQkgICAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLm1heF9hZGRyZXNzX3JhbmdlKTsKLQlidWZmZXIgKz0gNDsKLQotCS8qIFNldCB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiBvZmZzZXQgKi8KLQotCUFDUElfTU9WRV8zMl9UT18zMihidWZmZXIsCi0JCQkgICAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLgotCQkJICAgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOwotCWJ1ZmZlciArPSA0OwotCi0JLyogU2V0IHRoZSBhZGRyZXNzIGxlbmd0aCAqLwotCi0JQUNQSV9NT1ZFXzMyX1RPXzMyKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5hZGRyZXNzX2xlbmd0aCk7Ci0JYnVmZmVyICs9IDQ7Ci0KLQkvKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggYW5kIFJlc291cmNlIFNvdXJjZSBhcmUgb3B0aW9uYWwgKi8KLQotCWlmIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGgpIHsKLQkJKmJ1ZmZlciA9Ci0JCSAgICAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2UuaW5kZXg7Ci0JCWJ1ZmZlciArPSAxOwotCi0JCS8qIENvcHkgdGhlIHJlc291cmNlX3NvdXJjZSBzdHJpbmcgKi8KLQotCQlBQ1BJX1NUUkNQWSgoY2hhciAqKWJ1ZmZlciwKLQkJCSAgICBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLgotCQkJICAgIHN0cmluZ19wdHIpOwotCi0JCS8qCi0JCSAqIEJ1ZmZlciBuZWVkcyB0byBiZSBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nICsgb25lIGZvciB0aGUKLQkJICogIHRlcm1pbmF0aW5nIG51bGwKLQkJICovCi0JCWJ1ZmZlciArPQotCQkgICAgKGFjcGlfc2l6ZSkgKEFDUElfU1RSTEVOCi0JCQkJIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLgotCQkJCSAgc3RyaW5nX3B0cikgKyAxKTsKLQl9Ci0KLQkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLwotCi0JKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRihidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKLQotCS8qCi0JICogU2V0IHRoZSBsZW5ndGggZmllbGQgdG8gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZAotCSAqIG1pbnVzIHRoZSBoZWFkZXIgc2l6ZSAoMyBieXRlcykKLQkgKi8KLQkqbGVuZ3RoX2ZpZWxkID0gKHUxNikgKCpieXRlc19jb25zdW1lZCAtIDMpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfYWRkcmVzczY0X3Jlc291cmNlCi0gKgotICogUEFSQU1FVEVSUzogIGJ5dGVfc3RyZWFtX2J1ZmZlciAgICAgIC0gUG9pbnRlciB0byB0aGUgcmVzb3VyY2UgaW5wdXQgYnl0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtCi0gKiAgICAgICAgICAgICAgYnl0ZXNfY29uc3VtZWQgICAgICAgICAgLSBQb2ludGVyIHRvIHdoZXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVkIHRoZSBieXRlX3N0cmVhbV9idWZmZXIgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgb3V0cHV0X2J1ZmZlciAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXR1cm4gZGF0YSBidWZmZXIKLSAqICAgICAgICAgICAgICBzdHJ1Y3R1cmVfc2l6ZSAgICAgICAgICAtIFBvaW50ZXIgdG8gd2hlcmUgdGhlIG51bWJlciBvZiBieXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJldHVybiBkYXRhIHN0cnVjdCBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGFrZSB0aGUgcmVzb3VyY2UgYnl0ZSBzdHJlYW0gYW5kIGZpbGwgb3V0IHRoZSBhcHByb3ByaWF0ZQotICogICAgICAgICAgICAgIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IHRoZSBvdXRwdXRfYnVmZmVyLiBSZXR1cm4gdGhlCi0gKiAgICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGZyb20gdGhlIGJ5dGUgc3RyZWFtLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3JzX2FkZHJlc3M2NF9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCSAgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAotCQkJICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpCi17Ci0JdTE2IHRlbXAxNjsKLQl1OCB0ZW1wODsKLQl1OCByZXNvdXJjZV90eXBlOwotCXU4ICp0ZW1wX3B0cjsKLQl1MzIgaW5kZXg7Ci0JdTggKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopKm91dHB1dF9idWZmZXI7Ci0JYWNwaV9zaXplIHN0cnVjdF9zaXplID0KLQkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0KTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2FkZHJlc3M2NF9yZXNvdXJjZSIpOwotCi0JLyogR2V0IHRoZSBEZXNjcmlwdG9yIFR5cGUgKi8KLQotCXJlc291cmNlX3R5cGUgPSAqYnVmZmVyOwotCi0JLyogR2V0IHRoZSBEZXNjcmlwdG9yIExlbmd0aCBmaWVsZCAqLwotCi0JYnVmZmVyICs9IDE7Ci0JQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7Ci0KLQkvKiBWYWxpZGF0ZSBtaW5pbXVtIGRlc2NyaXB0b3IgbGVuZ3RoICovCi0KLQlpZiAodGVtcDE2IDwgNDMpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9CQURfUkVTT1VSQ0VfTEVOR1RIKTsKLQl9Ci0KLQkqYnl0ZXNfY29uc3VtZWQgPSB0ZW1wMTYgKyAzOwotCW91dHB1dF9zdHJ1Y3QtPmlkID0gQUNQSV9SU1RZUEVfQUREUkVTUzY0OwotCi0JLyogR2V0IHRoZSBSZXNvdXJjZSBUeXBlIChCeXRlMykgKi8KLQotCWJ1ZmZlciArPSAyOwotCXRlbXA4ID0gKmJ1ZmZlcjsKLQotCS8qIFZhbHVlcyAwLTIgYW5kIDB4QzAtMHhGRiBhcmUgdmFsaWQgKi8KLQotCWlmICgodGVtcDggPiAyKSAmJiAodGVtcDggPCAweEMwKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRSk7Ci0JfQotCi0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2VfdHlwZSA9IHRlbXA4OwotCi0JLyogR2V0IHRoZSBHZW5lcmFsIEZsYWdzIChCeXRlNCkgKi8KLQotCWJ1ZmZlciArPSAxOwotCWFjcGlfcnNfZGVjb2RlX2dlbmVyYWxfZmxhZ3MoJm91dHB1dF9zdHJ1Y3QtPmRhdGEsICpidWZmZXIpOwotCi0JLyogR2V0IHRoZSBUeXBlIFNwZWNpZmljIEZsYWdzIChCeXRlNSkgKi8KLQotCWJ1ZmZlciArPSAxOwotCWFjcGlfcnNfZGVjb2RlX3NwZWNpZmljX2ZsYWdzKCZvdXRwdXRfc3RydWN0LT5kYXRhLCAqYnVmZmVyKTsKLQotCWlmIChyZXNvdXJjZV90eXBlID09IEFDUElfUkRFU0NfVFlQRV9FWFRFTkRFRF9BRERSRVNTX1NQQUNFKSB7Ci0JCS8qIE1vdmUgcGFzdCByZXZpc2lvbl9pZCBhbmQgUmVzZXJ2ZWQgYnl0ZSAqLwotCi0JCWJ1ZmZlciArPSAyOwotCX0KLQotCS8qIEdldCBHcmFudWxhcml0eSAoQnl0ZXMgNi0xMykgb3IgKEJ5dGVzIDgtMTUpICovCi0KLQlidWZmZXIgKz0gMTsKLQlBQ1BJX01PVkVfNjRfVE9fNjQoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LmdyYW51bGFyaXR5LCBidWZmZXIpOwotCi0JLyogR2V0IG1pbl9hZGRyZXNzX3JhbmdlIChCeXRlcyAxNC0yMSkgb3IgKEJ5dGVzIDE2LTIzKSAqLwotCi0JYnVmZmVyICs9IDg7Ci0JQUNQSV9NT1ZFXzY0X1RPXzY0KCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5taW5fYWRkcmVzc19yYW5nZSwKLQkJCSAgIGJ1ZmZlcik7Ci0KLQkvKiBHZXQgbWF4X2FkZHJlc3NfcmFuZ2UgKEJ5dGVzIDIyLTI5KSBvciAoQnl0ZXMgMjQtMzEpICovCi0KLQlidWZmZXIgKz0gODsKLQlBQ1BJX01PVkVfNjRfVE9fNjQoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0Lm1heF9hZGRyZXNzX3JhbmdlLAotCQkJICAgYnVmZmVyKTsKLQotCS8qIEdldCBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCAoQnl0ZXMgMzAtMzcpIG9yIChCeXRlcyAzMi0zOSkgKi8KLQotCWJ1ZmZlciArPSA4OwotCUFDUElfTU9WRV82NF9UT182NCgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQuCi0JCQkgICBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCwgYnVmZmVyKTsKLQotCS8qIEdldCBhZGRyZXNzX2xlbmd0aCAoQnl0ZXMgMzgtNDUpIG9yIChCeXRlcyA0MC00NykgKi8KLQotCWJ1ZmZlciArPSA4OwotCUFDUElfTU9WRV82NF9UT182NCgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQuYWRkcmVzc19sZW5ndGgsCi0JCQkgICBidWZmZXIpOwotCi0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLmluZGV4ID0gMDsKLQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCA9IDA7Ci0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIgPSBOVUxMOwotCi0JaWYgKHJlc291cmNlX3R5cGUgPT0gQUNQSV9SREVTQ19UWVBFX0VYVEVOREVEX0FERFJFU1NfU1BBQ0UpIHsKLQkJLyogR2V0IHR5cGVfc3BlY2lmaWNfYXR0cmlidXRlIChCeXRlcyA0OC01NSkgKi8KLQotCQlidWZmZXIgKz0gODsKLQkJQUNQSV9NT1ZFXzY0X1RPXzY0KCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC4KLQkJCQkgICB0eXBlX3NwZWNpZmljX2F0dHJpYnV0ZXMsIGJ1ZmZlcik7Ci0JfSBlbHNlIHsKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQudHlwZV9zcGVjaWZpY19hdHRyaWJ1dGVzID0gMDsKLQotCQkvKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggKGlmIHByZXNlbnQpICovCi0KLQkJYnVmZmVyICs9IDg7Ci0KLQkJLyoKLQkJICogVGhpcyB3aWxsIGxlYXZlIHVzIHBvaW50aW5nIHRvIHRoZSBSZXNvdXJjZSBTb3VyY2UgSW5kZXgKLQkJICogSWYgaXQgaXMgcHJlc2VudCwgdGhlbiBzYXZlIGl0IG9mZiBhbmQgY2FsY3VsYXRlIHRoZQotCQkgKiBwb2ludGVyIHRvIHdoZXJlIHRoZSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIGdvZXM6Ci0JCSAqIEVhY2ggSW50ZXJydXB0IHRha2VzIDMyLWJpdHMgKyB0aGUgNSBieXRlcyBvZiB0aGUKLQkJICogc3RyZWFtIHRoYXQgYXJlIGRlZmF1bHQuCi0JCSAqCi0JCSAqIE5vdGU6IFNvbWUgcmVzb3VyY2UgZGVzY3JpcHRvcnMgd2lsbCBoYXZlIGFuIGFkZGl0aW9uYWwgbnVsbCwgc28KLQkJICogd2UgYWRkIDEgdG8gdGhlIGxlbmd0aC4KLQkJICovCi0JCWlmICgqYnl0ZXNfY29uc3VtZWQgPiAoNDYgKyAxKSkgewotCQkJLyogRGVyZWZlcmVuY2UgdGhlIEluZGV4ICovCi0KLQkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5pbmRleCA9Ci0JCQkgICAgKHUzMikgKiBidWZmZXI7Ci0KLQkJCS8qIFBvaW50IHRvIHRoZSBTdHJpbmcgKi8KLQotCQkJYnVmZmVyICs9IDE7Ci0KLQkJCS8qIFBvaW50IHRoZSBTdHJpbmcgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoaXMgc3RydWN0dXJlICovCi0KLQkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS4KLQkJCSAgICBzdHJpbmdfcHRyID0KLQkJCSAgICAoY2hhciAqKSgodTggKikgb3V0cHV0X3N0cnVjdCArIHN0cnVjdF9zaXplKTsKLQotCQkJdGVtcF9wdHIgPSAodTggKikKLQkJCSAgICBvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2UuCi0JCQkgICAgc3RyaW5nX3B0cjsKLQotCQkJLyogQ29weSB0aGUgcmVzb3VyY2Vfc291cmNlIHN0cmluZyBpbnRvIHRoZSBidWZmZXIgKi8KLQotCQkJaW5kZXggPSAwOwotCQkJd2hpbGUgKCpidWZmZXIpIHsKLQkJCQkqdGVtcF9wdHIgPSAqYnVmZmVyOwotCi0JCQkJdGVtcF9wdHIrKzsKLQkJCQlidWZmZXIrKzsKLQkJCQlpbmRleCsrOwotCQkJfQotCi0JCQkvKgotCQkJICogQWRkIHRoZSB0ZXJtaW5hdGluZyBudWxsIGFuZCBzZXQgdGhlIHN0cmluZyBsZW5ndGgKLQkJCSAqLwotCQkJKnRlbXBfcHRyID0gMDsKLQkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS4KLQkJCSAgICBzdHJpbmdfbGVuZ3RoID0gaW5kZXggKyAxOwotCi0JCQkvKgotCQkJICogSW4gb3JkZXIgZm9yIHRoZSBzdHJ1Y3Rfc2l6ZSB0byBmYWxsIG9uIGEgMzItYml0IGJvdW5kYXJ5LAotCQkJICogY2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBhbmQgZXhwYW5kIHRoZQotCQkJICogc3RydWN0X3NpemUgdG8gdGhlIG5leHQgMzItYml0IGJvdW5kYXJ5LgotCQkJICovCi0JCQl0ZW1wOCA9ICh1OCkgKGluZGV4ICsgMSk7Ci0JCQlzdHJ1Y3Rfc2l6ZSArPSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFModGVtcDgpOwotCQl9Ci0JfQotCi0JLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCi0KLQlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKLQotCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCi0KLQkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2FkZHJlc3M2NF9zdHJlYW0KLSAqCi0gKiBQQVJBTUVURVJTOiAgbGlua2VkX2xpc3QgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXNvdXJjZSBsaW5rZWQgbGlzdAotICogICAgICAgICAgICAgIG91dHB1dF9idWZmZXIgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgdXNlcidzIHJldHVybiBidWZmZXIKLSAqICAgICAgICAgICAgICBieXRlc19jb25zdW1lZCAgICAgICAgICAtIFBvaW50ZXIgdG8gd2hlcmUgdGhlIG51bWJlciBvZiBieXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgb3V0cHV0X2J1ZmZlciBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGFrZSB0aGUgbGlua2VkIGxpc3QgcmVzb3VyY2Ugc3RydWN0dXJlIGFuZCBmaWxscyBpbiB0aGUKLSAqICAgICAgICAgICAgICB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gYSBieXRlIHN0cmVhbQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3JzX2FkZHJlc3M2NF9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAotCQkJIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKQotewotCXU4ICpidWZmZXI7Ci0JdTE2ICpsZW5ndGhfZmllbGQ7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19hZGRyZXNzNjRfc3RyZWFtIik7Ci0KLQlidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKLQotCS8qIFNldCB0aGUgRGVzY3JpcHRvciBUeXBlIGZpZWxkICovCi0KLQkqYnVmZmVyID0gQUNQSV9SREVTQ19UWVBFX1FXT1JEX0FERFJFU1NfU1BBQ0U7Ci0JYnVmZmVyICs9IDE7Ci0KLQkvKiBTYXZlIGEgcG9pbnRlciB0byB0aGUgTGVuZ3RoIGZpZWxkIC0gdG8gYmUgZmlsbGVkIGluIGxhdGVyICovCi0KLQlsZW5ndGhfZmllbGQgPSBBQ1BJX0NBU1RfUFRSKHUxNiwgYnVmZmVyKTsKLQlidWZmZXIgKz0gMjsKLQotCS8qIFNldCB0aGUgUmVzb3VyY2UgVHlwZSAoTWVtb3J5LCBJbywgYnVzX251bWJlcikgKi8KLQotCSpidWZmZXIgPSAodTgpIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2VfdHlwZSAmIDB4MDMpOwotCWJ1ZmZlciArPSAxOwotCi0JLyogU2V0IHRoZSBnZW5lcmFsIGZsYWdzICovCi0KLQkqYnVmZmVyID0gYWNwaV9yc19lbmNvZGVfZ2VuZXJhbF9mbGFncygmbGlua2VkX2xpc3QtPmRhdGEpOwotCWJ1ZmZlciArPSAxOwotCi0JLyogU2V0IHRoZSB0eXBlIHNwZWNpZmljIGZsYWdzICovCi0KLQkqYnVmZmVyID0gYWNwaV9yc19lbmNvZGVfc3BlY2lmaWNfZmxhZ3MoJmxpbmtlZF9saXN0LT5kYXRhKTsKLQlidWZmZXIgKz0gMTsKLQotCS8qIFNldCB0aGUgYWRkcmVzcyBzcGFjZSBncmFudWxhcml0eSAqLwotCi0JQUNQSV9NT1ZFXzY0X1RPXzY0KGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5ncmFudWxhcml0eSk7Ci0JYnVmZmVyICs9IDg7Ci0KLQkvKiBTZXQgdGhlIGFkZHJlc3MgcmFuZ2UgbWluaW11bSAqLwotCi0JQUNQSV9NT1ZFXzY0X1RPXzY0KGJ1ZmZlciwKLQkJCSAgICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQubWluX2FkZHJlc3NfcmFuZ2UpOwotCWJ1ZmZlciArPSA4OwotCi0JLyogU2V0IHRoZSBhZGRyZXNzIHJhbmdlIG1heGltdW0gKi8KLQotCUFDUElfTU9WRV82NF9UT182NChidWZmZXIsCi0JCQkgICAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0Lm1heF9hZGRyZXNzX3JhbmdlKTsKLQlidWZmZXIgKz0gODsKLQotCS8qIFNldCB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiBvZmZzZXQgKi8KLQotCUFDUElfTU9WRV82NF9UT182NChidWZmZXIsCi0JCQkgICAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LgotCQkJICAgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOwotCWJ1ZmZlciArPSA4OwotCi0JLyogU2V0IHRoZSBhZGRyZXNzIGxlbmd0aCAqLwotCi0JQUNQSV9NT1ZFXzY0X1RPXzY0KGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5hZGRyZXNzX2xlbmd0aCk7Ci0JYnVmZmVyICs9IDg7Ci0KLQkvKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggYW5kIFJlc291cmNlIFNvdXJjZSBhcmUgb3B0aW9uYWwgKi8KLQotCWlmIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGgpIHsKLQkJKmJ1ZmZlciA9Ci0JCSAgICAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2UuaW5kZXg7Ci0JCWJ1ZmZlciArPSAxOwotCi0JCS8qIENvcHkgdGhlIHJlc291cmNlX3NvdXJjZSBzdHJpbmcgKi8KLQotCQlBQ1BJX1NUUkNQWSgoY2hhciAqKWJ1ZmZlciwKLQkJCSAgICBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLgotCQkJICAgIHN0cmluZ19wdHIpOwotCi0JCS8qCi0JCSAqIEJ1ZmZlciBuZWVkcyB0byBiZSBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nICsgb25lIGZvciB0aGUKLQkJICogdGVybWluYXRpbmcgbnVsbAotCQkgKi8KLQkJYnVmZmVyICs9Ci0JCSAgICAoYWNwaV9zaXplKSAoQUNQSV9TVFJMRU4KLQkJCQkgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2UuCi0JCQkJICBzdHJpbmdfcHRyKSArIDEpOwotCX0KLQotCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCi0KLQkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwotCi0JLyoKLQkgKiBTZXQgdGhlIGxlbmd0aCBmaWVsZCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkCi0JICogbWludXMgdGhlIGhlYWRlciBzaXplICgzIGJ5dGVzKQotCSAqLwotCSpsZW5ndGhfZmllbGQgPSAodTE2KSAoKmJ5dGVzX2NvbnN1bWVkIC0gMyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjYWxjLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY2FsYy5jCmluZGV4IDM3OGY1ODMuLjFkZmE2OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjYWxjLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NhbGMuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC00OSw2NTIgKzQ5LDQzMyBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUkVTT1VSQ0VTCiBBQ1BJX01PRFVMRV9OQU1FKCJyc2NhbGMiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgdTggYWNwaV9yc19jb3VudF9zZXRfYml0cyh1MTYgYml0X2ZpZWxkKTsKKworc3RhdGljIGFjcGlfcnNfbGVuZ3RoCithY3BpX3JzX3N0cnVjdF9vcHRpb25fbGVuZ3RoKHN0cnVjdCBhY3BpX3Jlc291cmNlX3NvdXJjZSAqcmVzb3VyY2Vfc291cmNlKTsKKworc3RhdGljIHUzMgorYWNwaV9yc19zdHJlYW1fb3B0aW9uX2xlbmd0aCh1MzIgcmVzb3VyY2VfbGVuZ3RoLCB1MzIgbWluaW11bV90b3RhbF9sZW5ndGgpOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2dldF9ieXRlX3N0cmVhbV9sZW5ndGgKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2NvdW50X3NldF9iaXRzCiAgKgotICogUEFSQU1FVEVSUzogIGxpbmtlZF9saXN0ICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXNvdXJjZSBsaW5rZWQgbGlzdAotICogICAgICAgICAgICAgIHNpemVfbmVlZGVkICAgICAgICAgLSB1MzIgcG9pbnRlciBvZiB0aGUgc2l6ZSBidWZmZXIgbmVlZGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHByb3Blcmx5IHJldHVybiB0aGUgcGFyc2VkIGRhdGEKKyAqIFBBUkFNRVRFUlM6ICBiaXRfZmllbGQgICAgICAgLSBGaWVsZCBpbiB3aGljaCB0byBjb3VudCBiaXRzCisgKgorICogUkVUVVJOOiAgICAgIE51bWJlciBvZiBiaXRzIHNldCB3aXRoaW4gdGhlIGZpZWxkCisgKgorICogREVTQ1JJUFRJT046IENvdW50IHRoZSBudW1iZXIgb2YgYml0cyBzZXQgaW4gYSByZXNvdXJjZSBmaWVsZC4gVXNlZCBmb3IKKyAqICAgICAgICAgICAgICAoU2hvcnQgZGVzY3JpcHRvcikgaW50ZXJydXB0IGFuZCBETUEgbGlzdHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHU4IGFjcGlfcnNfY291bnRfc2V0X2JpdHModTE2IGJpdF9maWVsZCkKK3sKKwl1OCBiaXRzX3NldDsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCWZvciAoYml0c19zZXQgPSAwOyBiaXRfZmllbGQ7IGJpdHNfc2V0KyspIHsKKwkJLyogWmVybyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRoYXQgaXMgc2V0ICovCisKKwkJYml0X2ZpZWxkICY9IChiaXRfZmllbGQgLSAxKTsKKwl9CisKKwlyZXR1cm4gKGJpdHNfc2V0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yc19zdHJ1Y3Rfb3B0aW9uX2xlbmd0aAorICoKKyAqIFBBUkFNRVRFUlM6ICByZXNvdXJjZV9zb3VyY2UgICAgIC0gUG9pbnRlciB0byBvcHRpb25hbCBkZXNjcmlwdG9yIGZpZWxkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBUYWtlcyB0aGUgcmVzb3VyY2UgYnl0ZSBzdHJlYW0gYW5kIHBhcnNlcyBpdCBvbmNlLCBjYWxjdWxhdGluZwotICogICAgICAgICAgICAgIHRoZSBzaXplIGJ1ZmZlciBuZWVkZWQgdG8gaG9sZCB0aGUgbGlua2VkIGxpc3QgdGhhdCBjb252ZXlzCi0gKiAgICAgICAgICAgICAgdGhlIHJlc291cmNlIGRhdGEuCisgKiBERVNDUklQVElPTjogQ29tbW9uIGNvZGUgdG8gaGFuZGxlIG9wdGlvbmFsIHJlc291cmNlX3NvdXJjZV9pbmRleCBhbmQKKyAqICAgICAgICAgICAgICByZXNvdXJjZV9zb3VyY2UgZmllbGRzIGluIHNvbWUgTGFyZ2UgZGVzY3JpcHRvcnMuIFVzZWQgZHVyaW5nCisgKiAgICAgICAgICAgICAgbGlzdC10by1zdHJlYW0gY29udmVyc2lvbgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV9yc19nZXRfYnl0ZV9zdHJlYW1fbGVuZ3RoKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKLQkJCSAgICAgICBhY3BpX3NpemUgKiBzaXplX25lZWRlZCkKKworc3RhdGljIGFjcGlfcnNfbGVuZ3RoCithY3BpX3JzX3N0cnVjdF9vcHRpb25fbGVuZ3RoKHN0cnVjdCBhY3BpX3Jlc291cmNlX3NvdXJjZSAqcmVzb3VyY2Vfc291cmNlKQogewotCWFjcGlfc2l6ZSBieXRlX3N0cmVhbV9zaXplX25lZWRlZCA9IDA7Ci0JYWNwaV9zaXplIHNlZ21lbnRfc2l6ZTsKLQl1OCBkb25lID0gRkFMU0U7CisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZ2V0X2J5dGVfc3RyZWFtX2xlbmd0aCIpOworCS8qCisJICogSWYgdGhlIHJlc291cmNlX3NvdXJjZSBzdHJpbmcgaXMgdmFsaWQsIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nCisJICogKHN0cmluZ19sZW5ndGggaW5jbHVkZXMgdGhlIE5VTEwgdGVybWluYXRvcikgcGx1cyB0aGUgc2l6ZSBvZiB0aGUKKwkgKiByZXNvdXJjZV9zb3VyY2VfaW5kZXggKDEpLgorCSAqLworCWlmIChyZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19wdHIpIHsKKwkJcmV0dXJuICgoYWNwaV9yc19sZW5ndGgpIChyZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19sZW5ndGggKyAxKSk7CisJfQogCi0Jd2hpbGUgKCFkb25lKSB7Ci0JCS8qIEluaXQgdGhlIHZhcmlhYmxlIHRoYXQgd2lsbCBob2xkIHRoZSBzaXplIHRvIGFkZCB0byB0aGUgdG90YWwuICovCisJcmV0dXJuICgwKTsKK30KIAotCQlzZWdtZW50X3NpemUgPSAwOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yc19zdHJlYW1fb3B0aW9uX2xlbmd0aAorICoKKyAqIFBBUkFNRVRFUlM6ICByZXNvdXJjZV9sZW5ndGggICAgIC0gTGVuZ3RoIGZyb20gdGhlIHJlc291cmNlIGhlYWRlcgorICogICAgICAgICAgICAgIG1pbmltdW1fdG90YWxfbGVuZ3RoIC0gTWluaW11bSBsZW5ndGggb2YgdGhpcyByZXNvdXJjZSwgYmVmb3JlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSBvcHRpb25hbCBmaWVsZHMuIEluY2x1ZGVzIGhlYWRlciBzaXplCisgKgorICogUkVUVVJOOiAgICAgIExlbmd0aCBvZiBvcHRpb25hbCBzdHJpbmcgKDAgaWYgbm8gc3RyaW5nIHByZXNlbnQpCisgKgorICogREVTQ1JJUFRJT046IENvbW1vbiBjb2RlIHRvIGhhbmRsZSBvcHRpb25hbCByZXNvdXJjZV9zb3VyY2VfaW5kZXggYW5kCisgKiAgICAgICAgICAgICAgcmVzb3VyY2Vfc291cmNlIGZpZWxkcyBpbiBzb21lIExhcmdlIGRlc2NyaXB0b3JzLiBVc2VkIGR1cmluZworICogICAgICAgICAgICAgIHN0cmVhbS10by1saXN0IGNvbnZlcnNpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0JCXN3aXRjaCAobGlua2VkX2xpc3QtPmlkKSB7Ci0JCWNhc2UgQUNQSV9SU1RZUEVfSVJROgorc3RhdGljIHUzMgorYWNwaV9yc19zdHJlYW1fb3B0aW9uX2xlbmd0aCh1MzIgcmVzb3VyY2VfbGVuZ3RoLAorCQkJICAgICB1MzIgbWluaW11bV9hbWxfcmVzb3VyY2VfbGVuZ3RoKQoreworCXUzMiBzdHJpbmdfbGVuZ3RoID0gMDsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCS8qCisJICogVGhlIHJlc291cmNlX3NvdXJjZV9pbmRleCBhbmQgcmVzb3VyY2Vfc291cmNlIGFyZSBvcHRpb25hbCBlbGVtZW50cyBvZiBzb21lCisJICogTGFyZ2UtdHlwZSByZXNvdXJjZSBkZXNjcmlwdG9ycy4KKwkgKi8KKworCS8qCisJICogSWYgdGhlIGxlbmd0aCBvZiB0aGUgYWN0dWFsIHJlc291cmNlIGRlc2NyaXB0b3IgaXMgZ3JlYXRlciB0aGFuIHRoZSBBQ1BJCisJICogc3BlYy1kZWZpbmVkIG1pbmltdW0gbGVuZ3RoLCBpdCBtZWFucyB0aGF0IGEgcmVzb3VyY2Vfc291cmNlX2luZGV4IGV4aXN0cworCSAqIGFuZCBpcyBmb2xsb3dlZCBieSBhIChyZXF1aXJlZCkgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZy4gVGhlIHN0cmluZyBsZW5ndGgKKwkgKiAoaW5jbHVkaW5nIHRoZSBudWxsIHRlcm1pbmF0b3IpIGlzIHRoZSByZXNvdXJjZSBsZW5ndGggbWludXMgdGhlIG1pbmltdW0KKwkgKiBsZW5ndGgsIG1pbnVzIG9uZSBieXRlIGZvciB0aGUgcmVzb3VyY2Vfc291cmNlX2luZGV4IGl0c2VsZi4KKwkgKi8KKwlpZiAocmVzb3VyY2VfbGVuZ3RoID4gbWluaW11bV9hbWxfcmVzb3VyY2VfbGVuZ3RoKSB7CisJCS8qIENvbXB1dGUgdGhlIGxlbmd0aCBvZiB0aGUgb3B0aW9uYWwgc3RyaW5nICovCisKKwkJc3RyaW5nX2xlbmd0aCA9CisJCSAgICByZXNvdXJjZV9sZW5ndGggLSBtaW5pbXVtX2FtbF9yZXNvdXJjZV9sZW5ndGggLSAxOworCX0KKworCS8qIFJvdW5kIHVwIGxlbmd0aCB0byAzMiBiaXRzIGZvciBpbnRlcm5hbCBzdHJ1Y3R1cmUgYWxpZ25tZW50ICovCisKKwlyZXR1cm4gKEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyhzdHJpbmdfbGVuZ3RoKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZ2V0X2FtbF9sZW5ndGgKKyAqCisgKiBQQVJBTUVURVJTOiAgUmVzb3VyY2UgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGxpbmtlZCBsaXN0CisgKiAgICAgICAgICAgICAgc2l6ZV9uZWVkZWQgICAgICAgICAtIFdoZXJlIHRoZSByZXF1aXJlZCBzaXplIGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBUYWtlcyBhIGxpbmtlZCBsaXN0IG9mIGludGVybmFsIHJlc291cmNlIGRlc2NyaXB0b3JzIGFuZAorICogICAgICAgICAgICAgIGNhbGN1bGF0ZXMgdGhlIHNpemUgYnVmZmVyIG5lZWRlZCB0byBob2xkIHRoZSBjb3JyZXNwb25kaW5nCisgKiAgICAgICAgICAgICAgZXh0ZXJuYWwgcmVzb3VyY2UgYnl0ZSBzdHJlYW0uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfcnNfZ2V0X2FtbF9sZW5ndGgoc3RydWN0IGFjcGlfcmVzb3VyY2UgKiByZXNvdXJjZSwgYWNwaV9zaXplICogc2l6ZV9uZWVkZWQpCit7CisJYWNwaV9zaXplIGFtbF9zaXplX25lZWRlZCA9IDA7CisJYWNwaV9yc19sZW5ndGggdG90YWxfc2l6ZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2dldF9hbWxfbGVuZ3RoIik7CisKKwkvKiBUcmF2ZXJzZSBlbnRpcmUgbGlzdCBvZiBpbnRlcm5hbCByZXNvdXJjZSBkZXNjcmlwdG9ycyAqLworCisJd2hpbGUgKHJlc291cmNlKSB7CisJCS8qIFZhbGlkYXRlIHRoZSBkZXNjcmlwdG9yIHR5cGUgKi8KKworCQlpZiAocmVzb3VyY2UtPnR5cGUgPiBBQ1BJX1JFU09VUkNFX1RZUEVfTUFYKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRSk7CisJCX0KKworCQkvKiBHZXQgdGhlIGJhc2Ugc2l6ZSBvZiB0aGUgKGV4dGVybmFsIHN0cmVhbSkgcmVzb3VyY2UgZGVzY3JpcHRvciAqLworCisJCXRvdGFsX3NpemUgPSBhY3BpX2dibF9hbWxfcmVzb3VyY2Vfc2l6ZXNbcmVzb3VyY2UtPnR5cGVdOworCisJCS8qCisJCSAqIEF1Z21lbnQgdGhlIGJhc2Ugc2l6ZSBmb3IgZGVzY3JpcHRvcnMgd2l0aCBvcHRpb25hbCBhbmQvb3IKKwkJICogdmFyaWFibGUtbGVuZ3RoIGZpZWxkcworCQkgKi8KKwkJc3dpdGNoIChyZXNvdXJjZS0+dHlwZSkgeworCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9WRU5ET1I6CiAJCQkvKgotCQkJICogSVJRIFJlc291cmNlCi0JCQkgKiBGb3IgYW4gSVJRIFJlc291cmNlLCBCeXRlIDMsIGFsdGhvdWdoIG9wdGlvbmFsLCB3aWxsIGFsd2F5cyBiZQotCQkJICogY3JlYXRlZCAtIGl0IGhvbGRzIElSUSBpbmZvcm1hdGlvbi4KLQkJCSAqLwotCQkJc2VnbWVudF9zaXplID0gNDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SU1RZUEVfRE1BOgotCQkJLyoKLQkJCSAqIERNQSBSZXNvdXJjZQotCQkJICogRm9yIHRoaXMgcmVzb3VyY2UgdGhlIHNpemUgaXMgc3RhdGljCi0JCQkgKi8KLQkJCXNlZ21lbnRfc2l6ZSA9IDM7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUlNUWVBFX1NUQVJUX0RQRjoKLQkJCS8qCi0JCQkgKiBTdGFydCBEZXBlbmRlbnQgRnVuY3Rpb25zIFJlc291cmNlCi0JCQkgKiBGb3IgYSBzdGFydF9kZXBlbmRlbnRfZnVuY3Rpb25zIFJlc291cmNlLCBCeXRlIDEsIGFsdGhvdWdoCi0JCQkgKiBvcHRpb25hbCwgd2lsbCBhbHdheXMgYmUgY3JlYXRlZC4KLQkJCSAqLwotCQkJc2VnbWVudF9zaXplID0gMjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SU1RZUEVfRU5EX0RQRjoKLQkJCS8qCi0JCQkgKiBFbmQgRGVwZW5kZW50IEZ1bmN0aW9ucyBSZXNvdXJjZQotCQkJICogRm9yIHRoaXMgcmVzb3VyY2UgdGhlIHNpemUgaXMgc3RhdGljCi0JCQkgKi8KLQkJCXNlZ21lbnRfc2l6ZSA9IDE7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUlNUWVBFX0lPOgotCQkJLyoKLQkJCSAqIElPIFBvcnQgUmVzb3VyY2UKLQkJCSAqIEZvciB0aGlzIHJlc291cmNlIHRoZSBzaXplIGlzIHN0YXRpYwotCQkJICovCi0JCQlzZWdtZW50X3NpemUgPSA4OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTVFlQRV9GSVhFRF9JTzoKLQkJCS8qCi0JCQkgKiBGaXhlZCBJTyBQb3J0IFJlc291cmNlCi0JCQkgKiBGb3IgdGhpcyByZXNvdXJjZSB0aGUgc2l6ZSBpcyBzdGF0aWMKLQkJCSAqLwotCQkJc2VnbWVudF9zaXplID0gNDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SU1RZUEVfVkVORE9SOgotCQkJLyoKLQkJCSAqIFZlbmRvciBEZWZpbmVkIFJlc291cmNlCisJCQkgKiBWZW5kb3IgRGVmaW5lZCBSZXNvdXJjZToKIAkJCSAqIEZvciBhIFZlbmRvciBTcGVjaWZpYyByZXNvdXJjZSwgaWYgdGhlIExlbmd0aCBpcyBiZXR3ZWVuIDEgYW5kIDcKIAkJCSAqIGl0IHdpbGwgYmUgY3JlYXRlZCBhcyBhIFNtYWxsIFJlc291cmNlIGRhdGEgdHlwZSwgb3RoZXJ3aXNlIGl0CiAJCQkgKiBpcyBhIExhcmdlIFJlc291cmNlIGRhdGEgdHlwZS4KIAkJCSAqLwotCQkJaWYgKGxpbmtlZF9saXN0LT5kYXRhLnZlbmRvcl9zcGVjaWZpYy5sZW5ndGggPiA3KSB7Ci0JCQkJc2VnbWVudF9zaXplID0gMzsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VnbWVudF9zaXplID0gMTsKKwkJCWlmIChyZXNvdXJjZS0+ZGF0YS52ZW5kb3IuYnl0ZV9sZW5ndGggPiA3KSB7CisJCQkJLyogQmFzZSBzaXplIG9mIGEgTGFyZ2UgcmVzb3VyY2UgZGVzY3JpcHRvciAqLworCisJCQkJdG90YWxfc2l6ZSA9CisJCQkJICAgIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2xhcmdlX2hlYWRlcik7CiAJCQl9Ci0JCQlzZWdtZW50X3NpemUgKz0KLQkJCSAgICBsaW5rZWRfbGlzdC0+ZGF0YS52ZW5kb3Jfc3BlY2lmaWMubGVuZ3RoOworCisJCQkvKiBBZGQgdGhlIHNpemUgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBkYXRhICovCisKKwkJCXRvdGFsX3NpemUgPSAoYWNwaV9yc19sZW5ndGgpCisJCQkgICAgKHRvdGFsX3NpemUgKyByZXNvdXJjZS0+ZGF0YS52ZW5kb3IuYnl0ZV9sZW5ndGgpOwogCQkJYnJlYWs7CiAKLQkJY2FzZSBBQ1BJX1JTVFlQRV9FTkRfVEFHOgorCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfVEFHOgogCQkJLyoKLQkJCSAqIEVuZCBUYWcKLQkJCSAqIEZvciB0aGlzIHJlc291cmNlIHRoZSBzaXplIGlzIHN0YXRpYworCQkJICogRW5kIFRhZzoKKwkJCSAqIFdlIGFyZSBkb25lIC0tIHJldHVybiB0aGUgYWNjdW11bGF0ZWQgdG90YWwgc2l6ZS4KIAkJCSAqLwotCQkJc2VnbWVudF9zaXplID0gMjsKLQkJCWRvbmUgPSBUUlVFOworCQkJKnNpemVfbmVlZGVkID0gYW1sX3NpemVfbmVlZGVkICsgdG90YWxfc2l6ZTsKKworCQkJLyogTm9ybWFsIGV4aXQgKi8KKworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKworCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMTY6CisJCQkvKgorCQkJICogMTYtQml0IEFkZHJlc3MgUmVzb3VyY2U6CisJCQkgKiBBZGQgdGhlIHNpemUgb2YgdGhlIG9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSBpbmZvCisJCQkgKi8KKwkJCXRvdGFsX3NpemUgPSAoYWNwaV9yc19sZW5ndGgpCisJCQkgICAgKHRvdGFsX3NpemUgKworCQkJICAgICBhY3BpX3JzX3N0cnVjdF9vcHRpb25fbGVuZ3RoKCZyZXNvdXJjZS0+ZGF0YS4KKwkJCQkJCQkgIGFkZHJlc3MxNi4KKwkJCQkJCQkgIHJlc291cmNlX3NvdXJjZSkpOwogCQkJYnJlYWs7CiAKLQkJY2FzZSBBQ1BJX1JTVFlQRV9NRU0yNDoKKwkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzMyOgogCQkJLyoKLQkJCSAqIDI0LUJpdCBNZW1vcnkgUmVzb3VyY2UKLQkJCSAqIEZvciB0aGlzIHJlc291cmNlIHRoZSBzaXplIGlzIHN0YXRpYworCQkJICogMzItQml0IEFkZHJlc3MgUmVzb3VyY2U6CisJCQkgKiBBZGQgdGhlIHNpemUgb2YgdGhlIG9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSBpbmZvCiAJCQkgKi8KLQkJCXNlZ21lbnRfc2l6ZSA9IDEyOworCQkJdG90YWxfc2l6ZSA9IChhY3BpX3JzX2xlbmd0aCkKKwkJCSAgICAodG90YWxfc2l6ZSArCisJCQkgICAgIGFjcGlfcnNfc3RydWN0X29wdGlvbl9sZW5ndGgoJnJlc291cmNlLT5kYXRhLgorCQkJCQkJCSAgYWRkcmVzczMyLgorCQkJCQkJCSAgcmVzb3VyY2Vfc291cmNlKSk7CiAJCQlicmVhazsKIAotCQljYXNlIEFDUElfUlNUWVBFX01FTTMyOgorCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTNjQ6CiAJCQkvKgotCQkJICogMzItQml0IE1lbW9yeSBSYW5nZSBSZXNvdXJjZQotCQkJICogRm9yIHRoaXMgcmVzb3VyY2UgdGhlIHNpemUgaXMgc3RhdGljCisJCQkgKiA2NC1CaXQgQWRkcmVzcyBSZXNvdXJjZToKKwkJCSAqIEFkZCB0aGUgc2l6ZSBvZiB0aGUgb3B0aW9uYWwgcmVzb3VyY2Vfc291cmNlIGluZm8KIAkJCSAqLwotCQkJc2VnbWVudF9zaXplID0gMjA7CisJCQl0b3RhbF9zaXplID0gKGFjcGlfcnNfbGVuZ3RoKQorCQkJICAgICh0b3RhbF9zaXplICsKKwkJCSAgICAgYWNwaV9yc19zdHJ1Y3Rfb3B0aW9uX2xlbmd0aCgmcmVzb3VyY2UtPmRhdGEuCisJCQkJCQkJICBhZGRyZXNzNjQuCisJCQkJCQkJICByZXNvdXJjZV9zb3VyY2UpKTsKIAkJCWJyZWFrOwogCi0JCWNhc2UgQUNQSV9SU1RZUEVfRklYRURfTUVNMzI6CisJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0lSUToKIAkJCS8qCi0JCQkgKiAzMi1CaXQgRml4ZWQgTWVtb3J5IFJlc291cmNlCi0JCQkgKiBGb3IgdGhpcyByZXNvdXJjZSB0aGUgc2l6ZSBpcyBzdGF0aWMKKwkJCSAqIEV4dGVuZGVkIElSUSBSZXNvdXJjZToKKwkJCSAqIEFkZCB0aGUgc2l6ZSBvZiBlYWNoIGFkZGl0aW9uYWwgb3B0aW9uYWwgaW50ZXJydXB0IGJleW9uZCB0aGUKKwkJCSAqIHJlcXVpcmVkIDEgKDQgYnl0ZXMgZm9yIGVhY2ggdTMyIGludGVycnVwdCBudW1iZXIpCiAJCQkgKi8KLQkJCXNlZ21lbnRfc2l6ZSA9IDEyOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTVFlQRV9BRERSRVNTMTY6Ci0JCQkvKgotCQkJICogMTYtQml0IEFkZHJlc3MgUmVzb3VyY2UKLQkJCSAqIFRoZSBiYXNlIHNpemUgb2YgdGhpcyBieXRlIHN0cmVhbSBpcyAxNi4gSWYgYSBSZXNvdXJjZSBTb3VyY2UKLQkJCSAqIHN0cmluZyBpcyBub3QgTlVMTCwgYWRkIDEgZm9yIHRoZSBJbmRleCArIHRoZSBsZW5ndGggb2YgdGhlIG51bGwKLQkJCSAqIHRlcm1pbmF0ZWQgc3RyaW5nIFJlc291cmNlIFNvdXJjZSArIDEgZm9yIHRoZSBudWxsLgotCQkJICovCi0JCQlzZWdtZW50X3NpemUgPSAxNjsKLQotCQkJaWYgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2UuCi0JCQkgICAgc3RyaW5nX3B0cikgewotCQkJCXNlZ21lbnRfc2l6ZSArPQotCQkJCSAgICBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLgotCQkJCSAgICBzdHJpbmdfbGVuZ3RoOwotCQkJCXNlZ21lbnRfc2l6ZSsrOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTVFlQRV9BRERSRVNTMzI6Ci0JCQkvKgotCQkJICogMzItQml0IEFkZHJlc3MgUmVzb3VyY2UKLQkJCSAqIFRoZSBiYXNlIHNpemUgb2YgdGhpcyBieXRlIHN0cmVhbSBpcyAyNi4gSWYgYSBSZXNvdXJjZQotCQkJICogU291cmNlIHN0cmluZyBpcyBub3QgTlVMTCwgYWRkIDEgZm9yIHRoZSBJbmRleCArIHRoZQotCQkJICogbGVuZ3RoIG9mIHRoZSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIFJlc291cmNlIFNvdXJjZSArCi0JCQkgKiAxIGZvciB0aGUgbnVsbC4KLQkJCSAqLwotCQkJc2VnbWVudF9zaXplID0gMjY7Ci0KLQkJCWlmIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLgotCQkJICAgIHN0cmluZ19wdHIpIHsKLQkJCQlzZWdtZW50X3NpemUgKz0KLQkJCQkgICAgbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS4KLQkJCQkgICAgc3RyaW5nX2xlbmd0aDsKLQkJCQlzZWdtZW50X3NpemUrKzsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SU1RZUEVfQUREUkVTUzY0OgotCQkJLyoKLQkJCSAqIDY0LUJpdCBBZGRyZXNzIFJlc291cmNlCi0JCQkgKiBUaGUgYmFzZSBzaXplIG9mIHRoaXMgYnl0ZSBzdHJlYW0gaXMgNDYuIElmIGEgcmVzb3VyY2Vfc291cmNlCi0JCQkgKiBzdHJpbmcgaXMgbm90IE5VTEwsIGFkZCAxIGZvciB0aGUgSW5kZXggKyB0aGUgbGVuZ3RoIG9mIHRoZSBudWxsCi0JCQkgKiB0ZXJtaW5hdGVkIHN0cmluZyBSZXNvdXJjZSBTb3VyY2UgKyAxIGZvciB0aGUgbnVsbC4KLQkJCSAqLwotCQkJc2VnbWVudF9zaXplID0gNDY7Ci0KLQkJCWlmIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLgotCQkJICAgIHN0cmluZ19wdHIpIHsKLQkJCQlzZWdtZW50X3NpemUgKz0KLQkJCQkgICAgbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS4KLQkJCQkgICAgc3RyaW5nX2xlbmd0aDsKLQkJCQlzZWdtZW50X3NpemUrKzsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SU1RZUEVfRVhUX0lSUToKLQkJCS8qCi0JCQkgKiBFeHRlbmRlZCBJUlEgUmVzb3VyY2UKLQkJCSAqIFRoZSBiYXNlIHNpemUgb2YgdGhpcyBieXRlIHN0cmVhbSBpcyA5LiBUaGlzIGlzIGZvciBhbiBJbnRlcnJ1cHQKLQkJCSAqIHRhYmxlIGxlbmd0aCBvZiAxLiAgRm9yIGVhY2ggYWRkaXRpb25hbCBpbnRlcnJ1cHQsIGFkZCA0LgotCQkJICogSWYgYSBSZXNvdXJjZSBTb3VyY2Ugc3RyaW5nIGlzIG5vdCBOVUxMLCBhZGQgMSBmb3IgdGhlCi0JCQkgKiBJbmRleCArIHRoZSBsZW5ndGggb2YgdGhlIG51bGwgdGVybWluYXRlZCBzdHJpbmcKLQkJCSAqIFJlc291cmNlIFNvdXJjZSArIDEgZm9yIHRoZSBudWxsLgotCQkJICovCi0JCQlzZWdtZW50X3NpemUgPSA5ICsgKCgoYWNwaV9zaXplKQotCQkJCQkgICAgIGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS4KLQkJCQkJICAgICBudW1iZXJfb2ZfaW50ZXJydXB0cyAtIDEpICogNCk7Ci0KLQkJCWlmIChsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLgotCQkJICAgIHN0cmluZ19wdHIpIHsKLQkJCQlzZWdtZW50X3NpemUgKz0KLQkJCQkgICAgbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLgotCQkJCSAgICByZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aDsKLQkJCQlzZWdtZW50X3NpemUrKzsKLQkJCX0KKwkJCXRvdGFsX3NpemUgPSAoYWNwaV9yc19sZW5ndGgpCisJCQkgICAgKHRvdGFsX3NpemUgKworCQkJICAgICAoKHJlc291cmNlLT5kYXRhLmV4dGVuZGVkX2lycS5pbnRlcnJ1cHRfY291bnQgLQorCQkJICAgICAgIDEpICogNCkgKworCQkJICAgICAvKiBBZGQgdGhlIHNpemUgb2YgdGhlIG9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSBpbmZvICovCisJCQkgICAgIGFjcGlfcnNfc3RydWN0X29wdGlvbl9sZW5ndGgoJnJlc291cmNlLT5kYXRhLgorCQkJCQkJCSAgZXh0ZW5kZWRfaXJxLgorCQkJCQkJCSAgcmVzb3VyY2Vfc291cmNlKSk7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCi0JCQkvKiBJZiB3ZSBnZXQgaGVyZSwgZXZlcnl0aGluZyBpcyBvdXQgb2Ygc3luYywgZXhpdCB3aXRoIGVycm9yICovCi0KLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5WQUxJRF9SRVNPVVJDRV9UWVBFKTsKLQotCQl9CQkvKiBzd2l0Y2ggKGxpbmtlZF9saXN0LT5JZCkgKi8KKwkJCWJyZWFrOworCQl9CiAKIAkJLyogVXBkYXRlIHRoZSB0b3RhbCAqLwogCi0JCWJ5dGVfc3RyZWFtX3NpemVfbmVlZGVkICs9IHNlZ21lbnRfc2l6ZTsKKwkJYW1sX3NpemVfbmVlZGVkICs9IHRvdGFsX3NpemU7CiAKIAkJLyogUG9pbnQgdG8gdGhlIG5leHQgb2JqZWN0ICovCiAKLQkJbGlua2VkX2xpc3QgPSBBQ1BJX1BUUl9BREQoc3RydWN0IGFjcGlfcmVzb3VyY2UsCi0JCQkJCSAgIGxpbmtlZF9saXN0LCBsaW5rZWRfbGlzdC0+bGVuZ3RoKTsKKwkJcmVzb3VyY2UgPQorCQkgICAgQUNQSV9BRERfUFRSKHN0cnVjdCBhY3BpX3Jlc291cmNlLCByZXNvdXJjZSwKKwkJCQkgcmVzb3VyY2UtPmxlbmd0aCk7CiAJfQogCi0JLyogVGhpcyBpcyB0aGUgZGF0YSB0aGUgY2FsbGVyIG5lZWRzICovCisJLyogRGlkIG5vdCBmaW5kIGFuIGVuZF90YWcgcmVzb3VyY2UgZGVzY3JpcHRvciAqLwogCi0JKnNpemVfbmVlZGVkID0gYnl0ZV9zdHJlYW1fc2l6ZV9uZWVkZWQ7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX1JFU09VUkNFX0VORF9UQUcpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2dldF9saXN0X2xlbmd0aAogICoKLSAqIFBBUkFNRVRFUlM6ICBieXRlX3N0cmVhbV9idWZmZXIgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGJ5dGUgc3RyZWFtCi0gKiAgICAgICAgICAgICAgYnl0ZV9zdHJlYW1fYnVmZmVyX2xlbmd0aCAtIFNpemUgb2YgYnl0ZV9zdHJlYW1fYnVmZmVyCi0gKiAgICAgICAgICAgICAgc2l6ZV9uZWVkZWQgICAgICAgICAgICAgLSB1MzIgcG9pbnRlciBvZiB0aGUgc2l6ZSBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCB0byBwcm9wZXJseSByZXR1cm4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgZGF0YQorICogUEFSQU1FVEVSUzogIGFtbF9idWZmZXIgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXNvdXJjZSBieXRlIHN0cmVhbQorICogICAgICAgICAgICAgIGFtbF9idWZmZXJfbGVuZ3RoICAgLSBTaXplIG9mIGFtbF9idWZmZXIKKyAqICAgICAgICAgICAgICBzaXplX25lZWRlZCAgICAgICAgIC0gV2hlcmUgdGhlIHNpemUgbmVlZGVkIGlzIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBUYWtlcyB0aGUgcmVzb3VyY2UgYnl0ZSBzdHJlYW0gYW5kIHBhcnNlcyBpdCBvbmNlLCBjYWxjdWxhdGluZwotICogICAgICAgICAgICAgIHRoZSBzaXplIGJ1ZmZlciBuZWVkZWQgdG8gaG9sZCB0aGUgbGlua2VkIGxpc3QgdGhhdCBjb252ZXlzCi0gKiAgICAgICAgICAgICAgdGhlIHJlc291cmNlIGRhdGEuCisgKiBERVNDUklQVElPTjogVGFrZXMgYW4gZXh0ZXJuYWwgcmVzb3VyY2UgYnl0ZSBzdHJlYW0gYW5kIGNhbGN1bGF0ZXMgdGhlIHNpemUKKyAqICAgICAgICAgICAgICBidWZmZXIgbmVlZGVkIHRvIGhvbGQgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJuYWwgcmVzb3VyY2UKKyAqICAgICAgICAgICAgICBkZXNjcmlwdG9yIGxpbmtlZCBsaXN0LgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2dldF9saXN0X2xlbmd0aCh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCXUzMiBieXRlX3N0cmVhbV9idWZmZXJfbGVuZ3RoLCBhY3BpX3NpemUgKiBzaXplX25lZWRlZCkKK2FjcGlfcnNfZ2V0X2xpc3RfbGVuZ3RoKHU4ICogYW1sX2J1ZmZlciwKKwkJCXUzMiBhbWxfYnVmZmVyX2xlbmd0aCwgYWNwaV9zaXplICogc2l6ZV9uZWVkZWQpCiB7Ci0JdTMyIGJ1ZmZlcl9zaXplID0gMDsKLQl1MzIgYnl0ZXNfcGFyc2VkID0gMDsKLQl1OCBudW1iZXJfb2ZfaW50ZXJydXB0cyA9IDA7Ci0JdTggbnVtYmVyX29mX2NoYW5uZWxzID0gMDsKLQl1OCByZXNvdXJjZV90eXBlOwotCXUzMiBzdHJ1Y3R1cmVfc2l6ZTsKLQl1MzIgYnl0ZXNfY29uc3VtZWQ7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXU4ICplbmRfYW1sOwogCXU4ICpidWZmZXI7Ci0JdTggdGVtcDg7CisJdTMyIGJ1ZmZlcl9zaXplID0gMDsKIAl1MTYgdGVtcDE2OwotCXU4IGluZGV4OwotCXU4IGFkZGl0aW9uYWxfYnl0ZXM7CisJdTE2IHJlc291cmNlX2xlbmd0aDsKKwl1MzIgZXh0cmFfc3RydWN0X2J5dGVzOworCXU4IHJlc291cmNlX2luZGV4OworCXU4IG1pbmltdW1fYW1sX3Jlc291cmNlX2xlbmd0aDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2dldF9saXN0X2xlbmd0aCIpOwogCi0Jd2hpbGUgKGJ5dGVzX3BhcnNlZCA8IGJ5dGVfc3RyZWFtX2J1ZmZlcl9sZW5ndGgpIHsKLQkJLyogVGhlIG5leHQgYnl0ZSBpbiB0aGUgc3RyZWFtIGlzIHRoZSByZXNvdXJjZSB0eXBlICovCisJZW5kX2FtbCA9IGFtbF9idWZmZXIgKyBhbWxfYnVmZmVyX2xlbmd0aDsKIAotCQlyZXNvdXJjZV90eXBlID0gYWNwaV9yc19nZXRfcmVzb3VyY2VfdHlwZSgqYnl0ZV9zdHJlYW1fYnVmZmVyKTsKKwkvKiBXYWxrIHRoZSBsaXN0IG9mIEFNTCByZXNvdXJjZSBkZXNjcmlwdG9ycyAqLwogCi0JCXN3aXRjaCAocmVzb3VyY2VfdHlwZSkgewotCQljYXNlIEFDUElfUkRFU0NfVFlQRV9NRU1PUllfMjQ6CisJd2hpbGUgKGFtbF9idWZmZXIgPCBlbmRfYW1sKSB7CisJCS8qIFZhbGlkYXRlIHRoZSBSZXNvdXJjZSBUeXBlIGFuZCBSZXNvdXJjZSBMZW5ndGggKi8KKworCQlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX3Jlc291cmNlKGFtbF9idWZmZXIsICZyZXNvdXJjZV9pbmRleCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKworCQkvKiBHZXQgdGhlIHJlc291cmNlIGxlbmd0aCBhbmQgYmFzZSAobWluaW11bSkgQU1MIHNpemUgKi8KKworCQlyZXNvdXJjZV9sZW5ndGggPSBhY3BpX3V0X2dldF9yZXNvdXJjZV9sZW5ndGgoYW1sX2J1ZmZlcik7CisJCW1pbmltdW1fYW1sX3Jlc291cmNlX2xlbmd0aCA9CisJCSAgICBhY3BpX2dibF9yZXNvdXJjZV9hbWxfc2l6ZXNbcmVzb3VyY2VfaW5kZXhdOworCisJCS8qCisJCSAqIEF1Z21lbnQgdGhlIHNpemUgZm9yIGRlc2NyaXB0b3JzIHdpdGggb3B0aW9uYWwKKwkJICogYW5kL29yIHZhcmlhYmxlIGxlbmd0aCBmaWVsZHMKKwkJICovCisJCWV4dHJhX3N0cnVjdF9ieXRlcyA9IDA7CisJCWJ1ZmZlciA9CisJCSAgICBhbWxfYnVmZmVyICsgYWNwaV91dF9nZXRfcmVzb3VyY2VfaGVhZGVyX2xlbmd0aChhbWxfYnVmZmVyKTsKKworCQlzd2l0Y2ggKGFjcGlfdXRfZ2V0X3Jlc291cmNlX3R5cGUoYW1sX2J1ZmZlcikpIHsKKwkJY2FzZSBBQ1BJX1JFU09VUkNFX05BTUVfSVJROgogCQkJLyoKLQkJCSAqIDI0LUJpdCBNZW1vcnkgUmVzb3VyY2UKKwkJCSAqIElSUSBSZXNvdXJjZToKKwkJCSAqIEdldCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluIHRoZSAxNi1iaXQgSVJRIG1hc2sKIAkJCSAqLwotCQkJYnl0ZXNfY29uc3VtZWQgPSAxMjsKLQotCQkJc3RydWN0dXJlX3NpemUgPQotCQkJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX21lbTI0KTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SREVTQ19UWVBFX0xBUkdFX1ZFTkRPUjoKLQkJCS8qCi0JCQkgKiBWZW5kb3IgRGVmaW5lZCBSZXNvdXJjZQotCQkJICovCi0JCQlidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7Ci0JCQkrK2J1ZmZlcjsKLQogCQkJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7Ci0JCQlieXRlc19jb25zdW1lZCA9IHRlbXAxNiArIDM7Ci0KLQkJCS8qIEVuc3VyZSBhIDMyLWJpdCBib3VuZGFyeSBmb3IgdGhlIHN0cnVjdHVyZSAqLwotCi0JCQl0ZW1wMTYgPSAodTE2KSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFModGVtcDE2KTsKLQotCQkJc3RydWN0dXJlX3NpemUgPQotCQkJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvcikgKwotCQkJICAgICh0ZW1wMTYgKiBzaXplb2YodTgpKTsKKwkJCWV4dHJhX3N0cnVjdF9ieXRlcyA9IGFjcGlfcnNfY291bnRfc2V0X2JpdHModGVtcDE2KTsKIAkJCWJyZWFrOwogCi0JCWNhc2UgQUNQSV9SREVTQ19UWVBFX01FTU9SWV8zMjoKKwkJY2FzZSBBQ1BJX1JFU09VUkNFX05BTUVfRE1BOgogCQkJLyoKLQkJCSAqIDMyLUJpdCBNZW1vcnkgUmFuZ2UgUmVzb3VyY2UKKwkJCSAqIERNQSBSZXNvdXJjZToKKwkJCSAqIEdldCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluIHRoZSA4LWJpdCBETUEgbWFzawogCQkJICovCi0JCQlieXRlc19jb25zdW1lZCA9IDIwOwotCi0JCQlzdHJ1Y3R1cmVfc2l6ZSA9Ci0JCQkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMzIpOworCQkJZXh0cmFfc3RydWN0X2J5dGVzID0gYWNwaV9yc19jb3VudF9zZXRfYml0cygqYnVmZmVyKTsKIAkJCWJyZWFrOwogCi0JCWNhc2UgQUNQSV9SREVTQ19UWVBFX0ZJWEVEX01FTU9SWV8zMjoKKwkJY2FzZSBBQ1BJX1JFU09VUkNFX05BTUVfVkVORE9SX1NNQUxMOgogCQkJLyoKLQkJCSAqIDMyLUJpdCBGaXhlZCBNZW1vcnkgUmVzb3VyY2UKKwkJCSAqIFZlbmRvciBSZXNvdXJjZToKKwkJCSAqIEVuc3VyZSBhIDMyLWJpdCBib3VuZGFyeSBmb3IgdGhlIHN0cnVjdHVyZQogCQkJICovCi0JCQlieXRlc19jb25zdW1lZCA9IDEyOwotCi0JCQlzdHJ1Y3R1cmVfc2l6ZSA9Ci0JCQkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0Ci0JCQkJCQkgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW0zMik7CisJCQlleHRyYV9zdHJ1Y3RfYnl0ZXMgPQorCQkJICAgIEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyhyZXNvdXJjZV9sZW5ndGgpIC0KKwkJCSAgICByZXNvdXJjZV9sZW5ndGg7CiAJCQlicmVhazsKIAotCQljYXNlIEFDUElfUkRFU0NfVFlQRV9FWFRFTkRFRF9BRERSRVNTX1NQQUNFOgorCQljYXNlIEFDUElfUkVTT1VSQ0VfTkFNRV9FTkRfVEFHOgogCQkJLyoKLQkJCSAqIDY0LUJpdCBBZGRyZXNzIFJlc291cmNlCisJCQkgKiBFbmQgVGFnOiBUaGlzIGlzIHRoZSBub3JtYWwgZXhpdCwgYWRkIHNpemUgb2YgZW5kX3RhZwogCQkJICovCi0JCQlidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7CisJCQkqc2l6ZV9uZWVkZWQgPSBidWZmZXJfc2l6ZSArIEFDUElfUlNfU0laRV9NSU47CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCi0JCQkrK2J1ZmZlcjsKLQkJCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwotCi0JCQlieXRlc19jb25zdW1lZCA9IHRlbXAxNiArIDM7Ci0JCQlzdHJ1Y3R1cmVfc2l6ZSA9Ci0JCQkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0Ci0JCQkJCQkgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQpOworCQljYXNlIEFDUElfUkVTT1VSQ0VfTkFNRV9WRU5ET1JfTEFSR0U6CisJCQkvKgorCQkJICogVmVuZG9yIFJlc291cmNlOgorCQkJICogQWRkIHZlbmRvciBkYXRhIGFuZCBlbnN1cmUgYSAzMi1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUKKwkJCSAqLworCQkJZXh0cmFfc3RydWN0X2J5dGVzID0KKwkJCSAgICBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFMocmVzb3VyY2VfbGVuZ3RoKSAtCisJCQkgICAgcmVzb3VyY2VfbGVuZ3RoOwogCQkJYnJlYWs7CiAKLQkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfUVdPUkRfQUREUkVTU19TUEFDRToKKwkJY2FzZSBBQ1BJX1JFU09VUkNFX05BTUVfQUREUkVTUzMyOgorCQljYXNlIEFDUElfUkVTT1VSQ0VfTkFNRV9BRERSRVNTMTY6CiAJCQkvKgotCQkJICogNjQtQml0IEFkZHJlc3MgUmVzb3VyY2UKKwkJCSAqIDMyLUJpdCBvciAxNi1iaXQgQWRkcmVzcyBSZXNvdXJjZToKKwkJCSAqIEFkZCB0aGUgc2l6ZSBvZiBhbnkgb3B0aW9uYWwgZGF0YSAocmVzb3VyY2Vfc291cmNlKQogCQkJICovCi0JCQlidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7Ci0KLQkJCSsrYnVmZmVyOwotCQkJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7Ci0KLQkJCWJ5dGVzX2NvbnN1bWVkID0gdGVtcDE2ICsgMzsKLQotCQkJLyoKLQkJCSAqIFJlc291cmNlIFNvdXJjZSBJbmRleCBhbmQgUmVzb3VyY2UgU291cmNlIGFyZSBvcHRpb25hbCBlbGVtZW50cy4KLQkJCSAqIENoZWNrIHRoZSBsZW5ndGggb2YgdGhlIEJ5dGVzdHJlYW0uICBJZiBpdCBpcyBncmVhdGVyIHRoYW4gNDMsCi0JCQkgKiB0aGF0IG1lYW5zIHRoYXQgYW4gSW5kZXggZXhpc3RzIGFuZCBpcyBmb2xsb3dlZCBieSBhIG51bGwKLQkJCSAqIHRlcm1pbmF0ZWQgc3RyaW5nLiAgVGhlcmVmb3JlLCBzZXQgdGhlIHRlbXAgdmFyaWFibGUgdG8gdGhlCi0JCQkgKiBsZW5ndGggbWludXMgdGhlIG1pbmltdW0gYnl0ZSBzdHJlYW0gbGVuZ3RoIHBsdXMgdGhlIGJ5dGUgZm9yCi0JCQkgKiB0aGUgSW5kZXggdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nLgotCQkJICovCi0JCQlpZiAoNDMgPCB0ZW1wMTYpIHsKLQkJCQl0ZW1wOCA9ICh1OCkgKHRlbXAxNiAtIDQ0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGVtcDggPSAwOwotCQkJfQotCi0JCQkvKiBFbnN1cmUgYSA2NC1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUgKi8KLQotCQkJdGVtcDggPSAodTgpIEFDUElfUk9VTkRfVVBfdG9fNjRfYklUUyh0ZW1wOCk7Ci0KLQkJCXN0cnVjdHVyZV9zaXplID0KLQkJCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQpCi0JCQkgICAgKyAodGVtcDggKiBzaXplb2YodTgpKTsKKwkJCWV4dHJhX3N0cnVjdF9ieXRlcyA9CisJCQkgICAgYWNwaV9yc19zdHJlYW1fb3B0aW9uX2xlbmd0aChyZXNvdXJjZV9sZW5ndGgsCisJCQkJCQkJIG1pbmltdW1fYW1sX3Jlc291cmNlX2xlbmd0aCk7CiAJCQlicmVhazsKIAotCQljYXNlIEFDUElfUkRFU0NfVFlQRV9EV09SRF9BRERSRVNTX1NQQUNFOgorCQljYXNlIEFDUElfUkVTT1VSQ0VfTkFNRV9FWFRFTkRFRF9JUlE6CiAJCQkvKgotCQkJICogMzItQml0IEFkZHJlc3MgUmVzb3VyY2UKKwkJCSAqIEV4dGVuZGVkIElSUToKKwkJCSAqIFBvaW50IHBhc3QgdGhlIGludGVycnVwdF92ZWN0b3JfZmxhZ3MgdG8gZ2V0IHRoZQorCQkJICogaW50ZXJydXB0X3RhYmxlX2xlbmd0aC4KIAkJCSAqLwotCQkJYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOworCQkJYnVmZmVyKys7CiAKLQkJCSsrYnVmZmVyOwotCQkJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7Ci0KLQkJCWJ5dGVzX2NvbnN1bWVkID0gdGVtcDE2ICsgMzsKLQotCQkJLyoKLQkJCSAqIFJlc291cmNlIFNvdXJjZSBJbmRleCBhbmQgUmVzb3VyY2UgU291cmNlIGFyZSBvcHRpb25hbCBlbGVtZW50cy4KLQkJCSAqIENoZWNrIHRoZSBsZW5ndGggb2YgdGhlIEJ5dGVzdHJlYW0uICBJZiBpdCBpcyBncmVhdGVyIHRoYW4gMjMsCi0JCQkgKiB0aGF0IG1lYW5zIHRoYXQgYW4gSW5kZXggZXhpc3RzIGFuZCBpcyBmb2xsb3dlZCBieSBhIG51bGwKLQkJCSAqIHRlcm1pbmF0ZWQgc3RyaW5nLiAgVGhlcmVmb3JlLCBzZXQgdGhlIHRlbXAgdmFyaWFibGUgdG8gdGhlCi0JCQkgKiBsZW5ndGggbWludXMgdGhlIG1pbmltdW0gYnl0ZSBzdHJlYW0gbGVuZ3RoIHBsdXMgdGhlIGJ5dGUgZm9yCi0JCQkgKiB0aGUgSW5kZXggdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nLgotCQkJICovCi0JCQlpZiAoMjMgPCB0ZW1wMTYpIHsKLQkJCQl0ZW1wOCA9ICh1OCkgKHRlbXAxNiAtIDI0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGVtcDggPSAwOwotCQkJfQotCi0JCQkvKiBFbnN1cmUgYSAzMi1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUgKi8KLQotCQkJdGVtcDggPSAodTgpIEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyh0ZW1wOCk7Ci0KLQkJCXN0cnVjdHVyZV9zaXplID0KLQkJCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMzIpCi0JCQkgICAgKyAodGVtcDggKiBzaXplb2YodTgpKTsKKwkJCWV4dHJhX3N0cnVjdF9ieXRlcyA9CisJCQkgICAgLyoKKwkJCSAgICAgKiBBZGQgNCBieXRlcyBmb3IgZWFjaCBhZGRpdGlvbmFsIGludGVycnVwdC4gTm90ZTogYXQKKwkJCSAgICAgKiBsZWFzdCBvbmUgaW50ZXJydXB0IGlzIHJlcXVpcmVkIGFuZCBpcyBpbmNsdWRlZCBpbgorCQkJICAgICAqIHRoZSBtaW5pbXVtIGRlc2NyaXB0b3Igc2l6ZQorCQkJICAgICAqLworCQkJICAgICgoKmJ1ZmZlciAtIDEpICogc2l6ZW9mKHUzMikpICsKKwkJCSAgICAvKiBBZGQgdGhlIHNpemUgb2YgYW55IG9wdGlvbmFsIGRhdGEgKHJlc291cmNlX3NvdXJjZSkgKi8KKwkJCSAgICBhY3BpX3JzX3N0cmVhbV9vcHRpb25fbGVuZ3RoKHJlc291cmNlX2xlbmd0aCAtCisJCQkJCQkJIGV4dHJhX3N0cnVjdF9ieXRlcywKKwkJCQkJCQkgbWluaW11bV9hbWxfcmVzb3VyY2VfbGVuZ3RoKTsKIAkJCWJyZWFrOwogCi0JCWNhc2UgQUNQSV9SREVTQ19UWVBFX1dPUkRfQUREUkVTU19TUEFDRToKKwkJY2FzZSBBQ1BJX1JFU09VUkNFX05BTUVfQUREUkVTUzY0OgogCQkJLyoKLQkJCSAqIDE2LUJpdCBBZGRyZXNzIFJlc291cmNlCisJCQkgKiA2NC1CaXQgQWRkcmVzcyBSZXNvdXJjZToKKwkJCSAqIEFkZCB0aGUgc2l6ZSBvZiBhbnkgb3B0aW9uYWwgZGF0YSAocmVzb3VyY2Vfc291cmNlKQorCQkJICogRW5zdXJlIGEgNjQtYml0IGJvdW5kYXJ5IGZvciB0aGUgc3RydWN0dXJlCiAJCQkgKi8KLQkJCWJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKLQotCQkJKytidWZmZXI7Ci0JCQlBQ1BJX01PVkVfMTZfVE9fMTYoJnRlbXAxNiwgYnVmZmVyKTsKLQotCQkJYnl0ZXNfY29uc3VtZWQgPSB0ZW1wMTYgKyAzOwotCi0JCQkvKgotCQkJICogUmVzb3VyY2UgU291cmNlIEluZGV4IGFuZCBSZXNvdXJjZSBTb3VyY2UgYXJlIG9wdGlvbmFsIGVsZW1lbnRzLgotCQkJICogQ2hlY2sgdGhlIGxlbmd0aCBvZiB0aGUgQnl0ZXN0cmVhbS4gIElmIGl0IGlzIGdyZWF0ZXIgdGhhbiAxMywKLQkJCSAqIHRoYXQgbWVhbnMgdGhhdCBhbiBJbmRleCBleGlzdHMgYW5kIGlzIGZvbGxvd2VkIGJ5IGEgbnVsbAotCQkJICogdGVybWluYXRlZCBzdHJpbmcuICBUaGVyZWZvcmUsIHNldCB0aGUgdGVtcCB2YXJpYWJsZSB0byB0aGUKLQkJCSAqIGxlbmd0aCBtaW51cyB0aGUgbWluaW11bSBieXRlIHN0cmVhbSBsZW5ndGggcGx1cyB0aGUgYnl0ZSBmb3IKLQkJCSAqIHRoZSBJbmRleCB0byBkZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIE5VTEwgdGVybWluYXRlZCBzdHJpbmcuCi0JCQkgKi8KLQkJCWlmICgxMyA8IHRlbXAxNikgewotCQkJCXRlbXA4ID0gKHU4KSAodGVtcDE2IC0gMTQpOwotCQkJfSBlbHNlIHsKLQkJCQl0ZW1wOCA9IDA7Ci0JCQl9Ci0KLQkJCS8qIEVuc3VyZSBhIDMyLWJpdCBib3VuZGFyeSBmb3IgdGhlIHN0cnVjdHVyZSAqLwotCi0JCQl0ZW1wOCA9ICh1OCkgQUNQSV9ST1VORF9VUF90b18zMl9iSVRTKHRlbXA4KTsKLQotCQkJc3RydWN0dXJlX3NpemUgPQotCQkJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNikKLQkJCSAgICArICh0ZW1wOCAqIHNpemVvZih1OCkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfRVhURU5ERURfWFJVUFQ6Ci0JCQkvKgotCQkJICogRXh0ZW5kZWQgSVJRCi0JCQkgKi8KLQkJCWJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKLQotCQkJKytidWZmZXI7Ci0JCQlBQ1BJX01PVkVfMTZfVE9fMTYoJnRlbXAxNiwgYnVmZmVyKTsKLQotCQkJYnl0ZXNfY29uc3VtZWQgPSB0ZW1wMTYgKyAzOwotCi0JCQkvKgotCQkJICogUG9pbnQgcGFzdCB0aGUgbGVuZ3RoIGZpZWxkIGFuZCB0aGUgSW50ZXJydXB0IHZlY3RvciBmbGFncyB0bwotCQkJICogc2F2ZSBvZmYgdGhlIEludGVycnVwdCB0YWJsZSBsZW5ndGggdG8gdGhlIFRlbXA4IHZhcmlhYmxlLgotCQkJICovCi0JCQlidWZmZXIgKz0gMzsKLQkJCXRlbXA4ID0gKmJ1ZmZlcjsKLQotCQkJLyoKLQkJCSAqIFRvIGNvbXBlbnNhdGUgZm9yIG11bHRpcGxlIGludGVycnVwdCBudW1iZXJzLCBhZGQgNCBieXRlcyBmb3IKLQkJCSAqIGVhY2ggYWRkaXRpb25hbCBpbnRlcnJ1cHRzIGdyZWF0ZXIgdGhhbiAxCi0JCQkgKi8KLQkJCWFkZGl0aW9uYWxfYnl0ZXMgPSAodTgpICgodGVtcDggLSAxKSAqIDQpOwotCi0JCQkvKgotCQkJICogUmVzb3VyY2UgU291cmNlIEluZGV4IGFuZCBSZXNvdXJjZSBTb3VyY2UgYXJlIG9wdGlvbmFsIGVsZW1lbnRzLgotCQkJICogQ2hlY2sgdGhlIGxlbmd0aCBvZiB0aGUgQnl0ZXN0cmVhbS4gIElmIGl0IGlzIGdyZWF0ZXIgdGhhbiA5LAotCQkJICogdGhhdCBtZWFucyB0aGF0IGFuIEluZGV4IGV4aXN0cyBhbmQgaXMgZm9sbG93ZWQgYnkgYSBudWxsCi0JCQkgKiB0ZXJtaW5hdGVkIHN0cmluZy4gIFRoZXJlZm9yZSwgc2V0IHRoZSB0ZW1wIHZhcmlhYmxlIHRvIHRoZQotCQkJICogbGVuZ3RoIG1pbnVzIHRoZSBtaW5pbXVtIGJ5dGUgc3RyZWFtIGxlbmd0aCBwbHVzIHRoZSBieXRlIGZvcgotCQkJICogdGhlIEluZGV4IHRvIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgTlVMTCB0ZXJtaW5hdGVkIHN0cmluZy4KLQkJCSAqLwotCQkJaWYgKDkgKyBhZGRpdGlvbmFsX2J5dGVzIDwgdGVtcDE2KSB7Ci0JCQkJdGVtcDggPSAodTgpICh0ZW1wMTYgLSAoOSArIGFkZGl0aW9uYWxfYnl0ZXMpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGVtcDggPSAwOwotCQkJfQotCi0JCQkvKiBFbnN1cmUgYSAzMi1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUgKi8KLQotCQkJdGVtcDggPSAodTgpIEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyh0ZW1wOCk7Ci0KLQkJCXN0cnVjdHVyZV9zaXplID0KLQkJCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRfaXJxKSArCi0JCQkgICAgKGFkZGl0aW9uYWxfYnl0ZXMgKiBzaXplb2YodTgpKSArCi0JCQkgICAgKHRlbXA4ICogc2l6ZW9mKHU4KSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkRFU0NfVFlQRV9JUlFfRk9STUFUOgotCQkJLyoKLQkJCSAqIElSUSBSZXNvdXJjZS4KLQkJCSAqIERldGVybWluZSBpZiBpdCB0aGVyZSBhcmUgdHdvIG9yIHRocmVlIHRyYWlsaW5nIGJ5dGVzCi0JCQkgKi8KLQkJCWJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKLQkJCXRlbXA4ID0gKmJ1ZmZlcjsKLQotCQkJaWYgKHRlbXA4ICYgMHgwMSkgewotCQkJCWJ5dGVzX2NvbnN1bWVkID0gNDsKLQkJCX0gZWxzZSB7Ci0JCQkJYnl0ZXNfY29uc3VtZWQgPSAzOwotCQkJfQotCi0JCQkvKiBQb2ludCBwYXN0IHRoZSBkZXNjcmlwdG9yICovCi0KLQkJCSsrYnVmZmVyOwotCi0JCQkvKiBMb29rIGF0IHRoZSBudW1iZXIgb2YgYml0cyBzZXQgKi8KLQotCQkJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7Ci0KLQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IDE2OyBpbmRleCsrKSB7Ci0JCQkJaWYgKHRlbXAxNiAmIDB4MSkgewotCQkJCQkrK251bWJlcl9vZl9pbnRlcnJ1cHRzOwotCQkJCX0KLQotCQkJCXRlbXAxNiA+Pj0gMTsKLQkJCX0KLQotCQkJc3RydWN0dXJlX3NpemUgPQotCQkJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2lvKSArCi0JCQkgICAgKG51bWJlcl9vZl9pbnRlcnJ1cHRzICogc2l6ZW9mKHUzMikpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfRE1BX0ZPUk1BVDoKLQkJCS8qCi0JCQkgKiBETUEgUmVzb3VyY2UKLQkJCSAqLwotCQkJYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwotCQkJYnl0ZXNfY29uc3VtZWQgPSAzOwotCi0JCQkvKiBQb2ludCBwYXN0IHRoZSBkZXNjcmlwdG9yICovCi0KLQkJCSsrYnVmZmVyOwotCi0JCQkvKiBMb29rIGF0IHRoZSBudW1iZXIgb2YgYml0cyBzZXQgKi8KLQotCQkJdGVtcDggPSAqYnVmZmVyOwotCi0JCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA4OyBpbmRleCsrKSB7Ci0JCQkJaWYgKHRlbXA4ICYgMHgxKSB7Ci0JCQkJCSsrbnVtYmVyX29mX2NoYW5uZWxzOwotCQkJCX0KLQotCQkJCXRlbXA4ID4+PSAxOwotCQkJfQotCi0JCQlzdHJ1Y3R1cmVfc2l6ZSA9Ci0JCQkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfZG1hKSArCi0JCQkgICAgKG51bWJlcl9vZl9jaGFubmVscyAqIHNpemVvZih1MzIpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SREVTQ19UWVBFX1NUQVJUX0RFUEVOREVOVDoKLQkJCS8qCi0JCQkgKiBTdGFydCBEZXBlbmRlbnQgRnVuY3Rpb25zIFJlc291cmNlCi0JCQkgKiBEZXRlcm1pbmUgaWYgaXQgdGhlcmUgYXJlIHR3byBvciB0aHJlZSB0cmFpbGluZyBieXRlcwotCQkJICovCi0JCQlidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7Ci0JCQl0ZW1wOCA9ICpidWZmZXI7Ci0KLQkJCWlmICh0ZW1wOCAmIDB4MDEpIHsKLQkJCQlieXRlc19jb25zdW1lZCA9IDI7Ci0JCQl9IGVsc2UgewotCQkJCWJ5dGVzX2NvbnN1bWVkID0gMTsKLQkJCX0KLQotCQkJc3RydWN0dXJlX3NpemUgPQotCQkJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdAotCQkJCQkJIGFjcGlfcmVzb3VyY2Vfc3RhcnRfZHBmKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SREVTQ19UWVBFX0VORF9ERVBFTkRFTlQ6Ci0JCQkvKgotCQkJICogRW5kIERlcGVuZGVudCBGdW5jdGlvbnMgUmVzb3VyY2UKLQkJCSAqLwotCQkJYnl0ZXNfY29uc3VtZWQgPSAxOwotCQkJc3RydWN0dXJlX3NpemUgPSBBQ1BJX1JFU09VUkNFX0xFTkdUSDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SREVTQ19UWVBFX0lPX1BPUlQ6Ci0JCQkvKgotCQkJICogSU8gUG9ydCBSZXNvdXJjZQotCQkJICovCi0JCQlieXRlc19jb25zdW1lZCA9IDg7Ci0JCQlzdHJ1Y3R1cmVfc2l6ZSA9Ci0JCQkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfRklYRURfSU9fUE9SVDoKLQkJCS8qCi0JCQkgKiBGaXhlZCBJTyBQb3J0IFJlc291cmNlCi0JCQkgKi8KLQkJCWJ5dGVzX2NvbnN1bWVkID0gNDsKLQkJCXN0cnVjdHVyZV9zaXplID0KLQkJCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9pbyk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkRFU0NfVFlQRV9TTUFMTF9WRU5ET1I6Ci0JCQkvKgotCQkJICogVmVuZG9yIFNwZWNpZmljIFJlc291cmNlCi0JCQkgKi8KLQkJCWJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKLQotCQkJdGVtcDggPSAqYnVmZmVyOwotCQkJdGVtcDggPSAodTgpICh0ZW1wOCAmIDB4Nyk7Ci0JCQlieXRlc19jb25zdW1lZCA9IHRlbXA4ICsgMTsKLQotCQkJLyogRW5zdXJlIGEgMzItYml0IGJvdW5kYXJ5IGZvciB0aGUgc3RydWN0dXJlICovCi0KLQkJCXRlbXA4ID0gKHU4KSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFModGVtcDgpOwotCQkJc3RydWN0dXJlX3NpemUgPQotCQkJICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvcikgKwotCQkJICAgICh0ZW1wOCAqIHNpemVvZih1OCkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfRU5EX1RBRzoKLQkJCS8qCi0JCQkgKiBFbmQgVGFnCi0JCQkgKi8KLQkJCWJ5dGVzX2NvbnN1bWVkID0gMjsKLQkJCXN0cnVjdHVyZV9zaXplID0gQUNQSV9SRVNPVVJDRV9MRU5HVEg7Ci0JCQlieXRlX3N0cmVhbV9idWZmZXJfbGVuZ3RoID0gYnl0ZXNfcGFyc2VkOworCQkJZXh0cmFfc3RydWN0X2J5dGVzID0KKwkJCSAgICBBQ1BJX1JPVU5EX1VQX3RvXzY0X2JJVFMKKwkJCSAgICAoYWNwaV9yc19zdHJlYW1fb3B0aW9uX2xlbmd0aAorCQkJICAgICAocmVzb3VyY2VfbGVuZ3RoLCBtaW5pbXVtX2FtbF9yZXNvdXJjZV9sZW5ndGgpKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQkvKgotCQkJICogSWYgd2UgZ2V0IGhlcmUsIGV2ZXJ5dGhpbmcgaXMgb3V0IG9mIHN5bmMsCi0JCQkgKiBleGl0IHdpdGggYW4gZXJyb3IKLQkJCSAqLwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlZBTElEX1JFU09VUkNFX1RZUEUpOworCQkJYnJlYWs7CiAJCX0KIAotCQkvKiBVcGRhdGUgdGhlIHJldHVybiB2YWx1ZSBhbmQgY291bnRlciAqLworCQkvKiBVcGRhdGUgdGhlIHJlcXVpcmVkIGJ1ZmZlciBzaXplIGZvciB0aGUgaW50ZXJuYWwgZGVzY3JpcHRvciBzdHJ1Y3RzICovCiAKLQkJYnVmZmVyX3NpemUgKz0gKHUzMikgQUNQSV9BTElHTl9SRVNPVVJDRV9TSVpFKHN0cnVjdHVyZV9zaXplKTsKLQkJYnl0ZXNfcGFyc2VkICs9IGJ5dGVzX2NvbnN1bWVkOworCQl0ZW1wMTYgPSAodTE2KSAoYWNwaV9nYmxfcmVzb3VyY2Vfc3RydWN0X3NpemVzW3Jlc291cmNlX2luZGV4XSArCisJCQkJZXh0cmFfc3RydWN0X2J5dGVzKTsKKwkJYnVmZmVyX3NpemUgKz0gKHUzMikgQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCh0ZW1wMTYpOwogCi0JCS8qIFNldCB0aGUgYnl0ZSBzdHJlYW0gdG8gcG9pbnQgdG8gdGhlIG5leHQgcmVzb3VyY2UgKi8KLQotCQlieXRlX3N0cmVhbV9idWZmZXIgKz0gYnl0ZXNfY29uc3VtZWQ7CisJCS8qCisJCSAqIFBvaW50IHRvIHRoZSBuZXh0IHJlc291cmNlIHdpdGhpbiB0aGUgc3RyZWFtCisJCSAqIHVzaW5nIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgcGx1cyB0aGUgbGVuZ3RoIGNvbnRhaW5lZCBpbiB0aGUgaGVhZGVyCisJCSAqLworCQlhbWxfYnVmZmVyICs9IGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbGVuZ3RoKGFtbF9idWZmZXIpOwogCX0KIAotCS8qIFRoaXMgaXMgdGhlIGRhdGEgdGhlIGNhbGxlciBuZWVkcyAqLworCS8qIERpZCBub3QgZmluZCBhbiBlbmRfdGFnIHJlc291cmNlIGRlc2NyaXB0b3IgKi8KIAotCSpzaXplX25lZWRlZCA9IGJ1ZmZlcl9zaXplOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19SRVNPVVJDRV9FTkRfVEFHKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjcmVhdGUuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjcmVhdGUuYwppbmRleCAwOTExNTI2Li43ZjQ2Y2EwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY3JlYXRlLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NyZWF0ZS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTUzLDEwICs1MywxMCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2NyZWF0ZV9yZXNvdXJjZV9saXN0CiAgKgotICogUEFSQU1FVEVSUzogIGJ5dGVfc3RyZWFtX2J1ZmZlciAgICAgIC0gUG9pbnRlciB0byB0aGUgcmVzb3VyY2UgYnl0ZSBzdHJlYW0KLSAqICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHVzZXIncyBidWZmZXIKKyAqIFBBUkFNRVRFUlM6ICBhbWxfYnVmZmVyICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmVzb3VyY2UgYnl0ZSBzdHJlYW0KKyAqICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyICAgICAgIC0gUG9pbnRlciB0byB0aGUgdXNlcidzIGJ1ZmZlcgogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMgIC0gQUVfT0sgaWYgb2theSwgZWxzZSBhIHZhbGlkIGFjcGlfc3RhdHVzIGNvZGUKKyAqIFJFVFVSTjogICAgICBTdGF0dXM6IEFFX09LIGlmIG9rYXksIGVsc2UgYSB2YWxpZCBhY3BpX3N0YXR1cyBjb2RlCiAgKiAgICAgICAgICAgICAgSWYgb3V0cHV0X2J1ZmZlciBpcyBub3QgbGFyZ2UgZW5vdWdoLCBvdXRwdXRfYnVmZmVyX2xlbmd0aAogICogICAgICAgICAgICAgIGluZGljYXRlcyBob3cgbGFyZ2Ugb3V0cHV0X2J1ZmZlciBzaG91bGQgYmUsIGVsc2UgaXQKICAqICAgICAgICAgICAgICBpbmRpY2F0ZXMgaG93IG1heSB1OCBlbGVtZW50cyBvZiBvdXRwdXRfYnVmZmVyIGFyZSB2YWxpZC4KQEAgLTY3LDMzICs2NywzMCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBhY3BpX3N0YXR1cwotYWNwaV9yc19jcmVhdGVfcmVzb3VyY2VfbGlzdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpieXRlX3N0cmVhbV9idWZmZXIsCithY3BpX3JzX2NyZWF0ZV9yZXNvdXJjZV9saXN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFtbF9idWZmZXIsCiAJCQkgICAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqb3V0cHV0X2J1ZmZlcikKIHsKIAogCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1OCAqYnl0ZV9zdHJlYW1fc3RhcnQ7CisJdTggKmFtbF9zdGFydDsKIAlhY3BpX3NpemUgbGlzdF9zaXplX25lZWRlZCA9IDA7Ci0JdTMyIGJ5dGVfc3RyZWFtX2J1ZmZlcl9sZW5ndGg7CisJdTMyIGFtbF9idWZmZXJfbGVuZ3RoOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfY3JlYXRlX3Jlc291cmNlX2xpc3QiKTsKIAotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgImJ5dGVfc3RyZWFtX2J1ZmZlciA9ICVwXG4iLAotCQkJICBieXRlX3N0cmVhbV9idWZmZXIpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJhbWxfYnVmZmVyID0gJXBcbiIsIGFtbF9idWZmZXIpKTsKIAogCS8qIFBhcmFtcyBhbHJlYWR5IHZhbGlkYXRlZCwgc28gd2UgZG9uJ3QgcmUtdmFsaWRhdGUgaGVyZSAqLwogCi0JYnl0ZV9zdHJlYW1fYnVmZmVyX2xlbmd0aCA9IGJ5dGVfc3RyZWFtX2J1ZmZlci0+YnVmZmVyLmxlbmd0aDsKLQlieXRlX3N0cmVhbV9zdGFydCA9IGJ5dGVfc3RyZWFtX2J1ZmZlci0+YnVmZmVyLnBvaW50ZXI7CisJYW1sX2J1ZmZlcl9sZW5ndGggPSBhbWxfYnVmZmVyLT5idWZmZXIubGVuZ3RoOworCWFtbF9zdGFydCA9IGFtbF9idWZmZXItPmJ1ZmZlci5wb2ludGVyOwogCiAJLyoKLQkgKiBQYXNzIHRoZSBieXRlX3N0cmVhbV9idWZmZXIgaW50byBhIG1vZHVsZSB0aGF0IGNhbiBjYWxjdWxhdGUKKwkgKiBQYXNzIHRoZSBhbWxfYnVmZmVyIGludG8gYSBtb2R1bGUgdGhhdCBjYW4gY2FsY3VsYXRlCiAJICogdGhlIGJ1ZmZlciBzaXplIG5lZWRlZCBmb3IgdGhlIGxpbmtlZCBsaXN0CiAJICovCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9yc19nZXRfbGlzdF9sZW5ndGgoYnl0ZV9zdHJlYW1fc3RhcnQsCi0JCQkJICAgIGJ5dGVfc3RyZWFtX2J1ZmZlcl9sZW5ndGgsCi0JCQkJICAgICZsaXN0X3NpemVfbmVlZGVkKTsKKwlzdGF0dXMgPSBhY3BpX3JzX2dldF9saXN0X2xlbmd0aChhbWxfc3RhcnQsIGFtbF9idWZmZXJfbGVuZ3RoLAorCQkJCQkgJmxpc3Rfc2l6ZV9uZWVkZWQpOwogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiU3RhdHVzPSVYIGxpc3Rfc2l6ZV9uZWVkZWQ9JVhcbiIsCiAJCQkgIHN0YXR1cywgKHUzMikgbGlzdF9zaXplX25lZWRlZCkpOwpAQCAtMTEwLDEwICsxMDcsOCBAQAogCiAJLyogRG8gdGhlIGNvbnZlcnNpb24gKi8KIAotCXN0YXR1cyA9Ci0JICAgIGFjcGlfcnNfYnl0ZV9zdHJlYW1fdG9fbGlzdChieXRlX3N0cmVhbV9zdGFydCwKLQkJCQkJYnl0ZV9zdHJlYW1fYnVmZmVyX2xlbmd0aCwKLQkJCQkJb3V0cHV0X2J1ZmZlci0+cG9pbnRlcik7CisJc3RhdHVzID0gYWNwaV9yc19jb252ZXJ0X2FtbF90b19yZXNvdXJjZXMoYW1sX3N0YXJ0LCBhbWxfYnVmZmVyX2xlbmd0aCwKKwkJCQkJCSAgb3V0cHV0X2J1ZmZlci0+cG9pbnRlcik7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KQEAgLTIxMiwyMSArMjA3LDE0IEBACiAJCS8qIEVhY2ggZWxlbWVudCBvZiB0aGUgdG9wLWxldmVsIHBhY2thZ2UgbXVzdCBhbHNvIGJlIGEgcGFja2FnZSAqLwogCiAJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSgqdG9wX29iamVjdF9saXN0KSAhPSBBQ1BJX1RZUEVfUEFDS0FHRSkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAiKFBSVFslWF0pIE5lZWQgc3ViLXBhY2thZ2UsIGZvdW5kICVzXG4iLAotCQkJCQkgIGluZGV4LAotCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKLQkJCQkJICAoKnRvcF9vYmplY3RfbGlzdCkpKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiKFBSVFslWF0pIE5lZWQgc3ViLXBhY2thZ2UsIGZvdW5kICVzXG4iLCBpbmRleCwgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSgqdG9wX29iamVjdF9saXN0KSkpOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQl9CiAKIAkJLyogRWFjaCBzdWItcGFja2FnZSBtdXN0IGJlIG9mIGxlbmd0aCA0ICovCiAKIAkJaWYgKCgqdG9wX29iamVjdF9saXN0KS0+cGFja2FnZS5jb3VudCAhPSA0KSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICIoUFJUWyVYXSkgTmVlZCBwYWNrYWdlIG9mIGxlbmd0aCA0LCBmb3VuZCBsZW5ndGggJWRcbiIsCi0JCQkJCSAgaW5kZXgsCi0JCQkJCSAgKCp0b3Bfb2JqZWN0X2xpc3QpLT5wYWNrYWdlLmNvdW50KSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIihQUlRbJVhdKSBOZWVkIHBhY2thZ2Ugb2YgbGVuZ3RoIDQsIGZvdW5kIGxlbmd0aCAlZFxuIiwgaW5kZXgsICgqdG9wX29iamVjdF9saXN0KS0+cGFja2FnZS5jb3VudCkpOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9QQUNLQUdFX0xJTUlUKTsKIAkJfQogCkBAIC0yNDMsMTEgKzIzMSw3IEBACiAJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKIAkJCXVzZXJfcHJ0LT5hZGRyZXNzID0gb2JqX2Rlc2MtPmludGVnZXIudmFsdWU7CiAJCX0gZWxzZSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICIoUFJUWyVYXS5BZGRyZXNzKSBOZWVkIEludGVnZXIsIGZvdW5kICVzXG4iLAotCQkJCQkgIGluZGV4LAotCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKLQkJCQkJICAob2JqX2Rlc2MpKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIihQUlRbJVhdLkFkZHJlc3MpIE5lZWQgSW50ZWdlciwgZm91bmQgJXNcbiIsIGluZGV4LCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSkpOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9EQVRBKTsKIAkJfQogCkBAIC0yNTcsMTEgKzI0MSw3IEBACiAJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKIAkJCXVzZXJfcHJ0LT5waW4gPSAodTMyKSBvYmpfZGVzYy0+aW50ZWdlci52YWx1ZTsKIAkJfSBlbHNlIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgIihQUlRbJVhdLlBpbikgTmVlZCBJbnRlZ2VyLCBmb3VuZCAlc1xuIiwKLQkJCQkJICBpbmRleCwKLQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCi0JCQkJCSAgKG9ial9kZXNjKSkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCIoUFJUWyVYXS5QaW4pIE5lZWQgSW50ZWdlciwgZm91bmQgJXNcbiIsIGluZGV4LCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSkpOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9EQVRBKTsKIAkJfQogCkBAIC0yNzIsMTAgKzI1Miw3IEBACiAJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKIAogCQkJaWYgKG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlICE9IEFNTF9JTlRfTkFNRVBBVEhfT1ApIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJICAiKFBSVFslWF0uU291cmNlKSBOZWVkIG5hbWUsIGZvdW5kIHJlZmVyZW5jZSBvcCAlWFxuIiwKLQkJCQkJCSAgaW5kZXgsCi0JCQkJCQkgIG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSk7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCIoUFJUWyVYXS5Tb3VyY2UpIE5lZWQgbmFtZSwgZm91bmQgcmVmZXJlbmNlIG9wICVYXG4iLCBpbmRleCwgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKTsKIAkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOwogCQkJfQogCkBAIC0zMjEsMTEgKzI5OCw3IEBACiAKIAkJZGVmYXVsdDoKIAotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAiKFBSVFslWF0uU291cmNlKSBOZWVkIFJlZi9TdHJpbmcvSW50ZWdlciwgZm91bmQgJXNcbiIsCi0JCQkJCSAgaW5kZXgsCi0JCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQotCQkJCQkgIChvYmpfZGVzYykpKTsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiKFBSVFslWF0uU291cmNlKSBOZWVkIFJlZi9TdHJpbmcvSW50ZWdlciwgZm91bmQgJXNcbiIsIGluZGV4LCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSkpOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9EQVRBKTsKIAkJfQogCkBAIC0zNDAsMTEgKzMxMyw3IEBACiAJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKIAkJCXVzZXJfcHJ0LT5zb3VyY2VfaW5kZXggPSAodTMyKSBvYmpfZGVzYy0+aW50ZWdlci52YWx1ZTsKIAkJfSBlbHNlIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgIihQUlRbJVhdLnNvdXJjZV9pbmRleCkgTmVlZCBJbnRlZ2VyLCBmb3VuZCAlc1xuIiwKLQkJCQkJICBpbmRleCwKLQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCi0JCQkJCSAgKG9ial9kZXNjKSkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCIoUFJUWyVYXS5zb3VyY2VfaW5kZXgpIE5lZWQgSW50ZWdlciwgZm91bmQgJXNcbiIsIGluZGV4LCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSkpOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9EQVRBKTsKIAkJfQogCkBAIC0zNjAsNyArMzI5LDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19jcmVhdGVfYnl0ZV9zdHJlYW0KKyAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2NyZWF0ZV9hbWxfcmVzb3VyY2VzCiAgKgogICogUEFSQU1FVEVSUzogIGxpbmtlZF9saXN0X2J1ZmZlciAgICAgIC0gUG9pbnRlciB0byB0aGUgcmVzb3VyY2UgbGlua2VkIGxpc3QKICAqICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHVzZXIncyBidWZmZXIKQEAgLTM3NywxMyArMzQ2LDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19jcmVhdGVfYnl0ZV9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0X2J1ZmZlciwKLQkJCSAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqb3V0cHV0X2J1ZmZlcikKK2FjcGlfcnNfY3JlYXRlX2FtbF9yZXNvdXJjZXMoc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0X2J1ZmZlciwKKwkJCSAgICAgc3RydWN0IGFjcGlfYnVmZmVyICpvdXRwdXRfYnVmZmVyKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlhY3BpX3NpemUgYnl0ZV9zdHJlYW1fc2l6ZV9uZWVkZWQgPSAwOworCWFjcGlfc2l6ZSBhbWxfc2l6ZV9uZWVkZWQgPSAwOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfY3JlYXRlX2J5dGVfc3RyZWFtIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfY3JlYXRlX2FtbF9yZXNvdXJjZXMiKTsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgImxpbmtlZF9saXN0X2J1ZmZlciA9ICVwXG4iLAogCQkJICBsaW5rZWRfbGlzdF9idWZmZXIpKTsKQEAgLTM5NCwxMSArMzYzLDEwIEBACiAJICogUGFzcyB0aGUgbGlua2VkX2xpc3RfYnVmZmVyIGludG8gYSBtb2R1bGUgdGhhdCBjYWxjdWxhdGVzCiAJICogdGhlIGJ1ZmZlciBzaXplIG5lZWRlZCBmb3IgdGhlIGJ5dGUgc3RyZWFtLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfcnNfZ2V0X2J5dGVfc3RyZWFtX2xlbmd0aChsaW5rZWRfbGlzdF9idWZmZXIsCi0JCQkJCQkmYnl0ZV9zdHJlYW1fc2l6ZV9uZWVkZWQpOworCXN0YXR1cyA9IGFjcGlfcnNfZ2V0X2FtbF9sZW5ndGgobGlua2VkX2xpc3RfYnVmZmVyLCAmYW1sX3NpemVfbmVlZGVkKTsKIAotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgImJ5dGVfc3RyZWFtX3NpemVfbmVlZGVkPSVYLCAlc1xuIiwKLQkJCSAgKHUzMikgYnl0ZV9zdHJlYW1fc2l6ZV9uZWVkZWQsCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiYW1sX3NpemVfbmVlZGVkPSVYLCAlc1xuIiwKKwkJCSAgKHUzMikgYW1sX3NpemVfbmVlZGVkLAogCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKQEAgLTQwNiw4ICszNzQsNyBAQAogCiAJLyogVmFsaWRhdGUvQWxsb2NhdGUvQ2xlYXIgY2FsbGVyIGJ1ZmZlciAqLwogCi0Jc3RhdHVzID0KLQkgICAgYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlcihvdXRwdXRfYnVmZmVyLCBieXRlX3N0cmVhbV9zaXplX25lZWRlZCk7CisJc3RhdHVzID0gYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlcihvdXRwdXRfYnVmZmVyLCBhbWxfc2l6ZV9uZWVkZWQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CkBAIC00MTUsOSArMzgyLDkgQEAKIAkvKiBEbyB0aGUgY29udmVyc2lvbiAqLwogCiAJc3RhdHVzID0KLQkgICAgYWNwaV9yc19saXN0X3RvX2J5dGVfc3RyZWFtKGxpbmtlZF9saXN0X2J1ZmZlciwKLQkJCQkJYnl0ZV9zdHJlYW1fc2l6ZV9uZWVkZWQsCi0JCQkJCW91dHB1dF9idWZmZXItPnBvaW50ZXIpOworCSAgICBhY3BpX3JzX2NvbnZlcnRfcmVzb3VyY2VzX3RvX2FtbChsaW5rZWRfbGlzdF9idWZmZXIsCisJCQkJCSAgICAgYW1sX3NpemVfbmVlZGVkLAorCQkJCQkgICAgIG91dHB1dF9idWZmZXItPnBvaW50ZXIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzZHVtcC5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2R1bXAuYwppbmRleCA3NWJkMzRkLi45ODM1NmUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzZHVtcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNkdW1wLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNDksOTE0ICs0OSw1NDQgQEAKIAogI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9pcnEodW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKTsKK3N0YXRpYyB2b2lkIGFjcGlfcnNfb3V0X3N0cmluZyhjaGFyICp0aXRsZSwgY2hhciAqdmFsdWUpOwogCi1zdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfYWRkcmVzczE2KHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSk7CitzdGF0aWMgdm9pZCBhY3BpX3JzX291dF9pbnRlZ2VyOChjaGFyICp0aXRsZSwgdTggdmFsdWUpOwogCi1zdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfYWRkcmVzczMyKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSk7CitzdGF0aWMgdm9pZCBhY3BpX3JzX291dF9pbnRlZ2VyMTYoY2hhciAqdGl0bGUsIHUxNiB2YWx1ZSk7CiAKLXN0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9hZGRyZXNzNjQodW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKTsKK3N0YXRpYyB2b2lkIGFjcGlfcnNfb3V0X2ludGVnZXIzMihjaGFyICp0aXRsZSwgdTMyIHZhbHVlKTsKIAotc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2RtYSh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpOworc3RhdGljIHZvaWQgYWNwaV9yc19vdXRfaW50ZWdlcjY0KGNoYXIgKnRpdGxlLCB1NjQgdmFsdWUpOwogCi1zdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfaW8odW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKTsKK3N0YXRpYyB2b2lkIGFjcGlfcnNfb3V0X3RpdGxlKGNoYXIgKnRpdGxlKTsKIAotc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2V4dGVuZGVkX2lycSh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpOworc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2J5dGVfbGlzdCh1MTYgbGVuZ3RoLCB1OCAqIGRhdGEpOwogCi1zdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfZml4ZWRfaW8odW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKTsKK3N0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9kd29yZF9saXN0KHU4IGxlbmd0aCwgdTMyICogZGF0YSk7CiAKLXN0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9maXhlZF9tZW1vcnkzMih1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpOworc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX3Nob3J0X2J5dGVfbGlzdCh1OCBsZW5ndGgsIHU4ICogZGF0YSk7CiAKLXN0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9tZW1vcnkyNCh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpOworc3RhdGljIHZvaWQKK2FjcGlfcnNfZHVtcF9yZXNvdXJjZV9zb3VyY2Uoc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlICpyZXNvdXJjZV9zb3VyY2UpOwogCi1zdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfbWVtb3J5MzIodW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKTsKK3N0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9hZGRyZXNzX2NvbW1vbih1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKnJlc291cmNlKTsKIAotc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX3N0YXJ0X2RlcGVuZF9mbnModW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKTsKK3N0YXRpYyB2b2lkCithY3BpX3JzX2R1bXBfZGVzY3JpcHRvcih2b2lkICpyZXNvdXJjZSwgc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gKnRhYmxlKTsKIAotc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX3ZlbmRvcl9zcGVjaWZpYyh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpOworI2RlZmluZSBBQ1BJX1JTRF9PRkZTRVQoZikgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAodW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhLGYpCisjZGVmaW5lIEFDUElfUFJUX09GRlNFVChmKSAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSxmKQorI2RlZmluZSBBQ1BJX1JTRF9UQUJMRV9TSVpFKG5hbWUpICAgKHNpemVvZihuYW1lKSAvIHNpemVvZiAoc3RydWN0IGFjcGlfcnNkdW1wX2luZm8pKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2R1bXBfaXJxCisgKiBSZXNvdXJjZSBEZXNjcmlwdG9yIGluZm8gdGFibGVzCiAgKgotICogUEFSQU1FVEVSUzogIERhdGEgICAgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHJlc291cmNlIHN0cnVjdHVyZSB0byBkdW1wLgorICogTm90ZTogVGhlIGZpcnN0IHRhYmxlIGVudHJ5IG11c3QgYmUgYSBUaXRsZSBvciBMaXRlcmFsIGFuZCBtdXN0IGNvbnRhaW4KKyAqIHRoZSB0YWJsZSBsZW5ndGggKG51bWJlciBvZiB0YWJsZSBlbnRyaWVzKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9pcnFbNl0gPSB7CisJe0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9pcnEpLCAiSVJRIiwgTlVMTH0sCisJe0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoaXJxLnRyaWdnZXJpbmcpLCAiVHJpZ2dlcmluZyIsCisJIGFjcGlfZ2JsX0hFZGVjb2RlfSwKKwl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChpcnEucG9sYXJpdHkpLCAiUG9sYXJpdHkiLAorCSBhY3BpX2dibF9MTGRlY29kZX0sCisJe0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoaXJxLnNoYXJhYmxlKSwgIlNoYXJpbmciLAorCSBhY3BpX2dibF9TSFJkZWNvZGV9LAorCXtBQ1BJX1JTRF9VSU5UOCwgQUNQSV9SU0RfT0ZGU0VUKGlycS5pbnRlcnJ1cHRfY291bnQpLAorCSAiSW50ZXJydXB0IENvdW50IiwgTlVMTH0sCisJe0FDUElfUlNEX1NIT1JUTElTVCwgQUNQSV9SU0RfT0ZGU0VUKGlycS5pbnRlcnJ1cHRzWzBdKSwKKwkgIkludGVycnVwdCBMaXN0IiwgTlVMTH0KK307CisKK3N0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9kbWFbNl0gPSB7CisJe0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9kbWEpLCAiRE1BIiwgTlVMTH0sCisJe0FDUElfUlNEXzJCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoZG1hLnR5cGUpLCAiU3BlZWQiLAorCSBhY3BpX2dibF9UWVBkZWNvZGV9LAorCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGRtYS5idXNfbWFzdGVyKSwgIk1hc3RlcmluZyIsCisJIGFjcGlfZ2JsX0JNZGVjb2RlfSwKKwl7QUNQSV9SU0RfMkJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChkbWEudHJhbnNmZXIpLCAiVHJhbnNmZXIgVHlwZSIsCisJIGFjcGlfZ2JsX1NJWmRlY29kZX0sCisJe0FDUElfUlNEX1VJTlQ4LCBBQ1BJX1JTRF9PRkZTRVQoZG1hLmNoYW5uZWxfY291bnQpLCAiQ2hhbm5lbCBDb3VudCIsCisJIE5VTEx9LAorCXtBQ1BJX1JTRF9TSE9SVExJU1QsIEFDUElfUlNEX09GRlNFVChkbWEuY2hhbm5lbHNbMF0pLCAiQ2hhbm5lbCBMaXN0IiwKKwkgTlVMTH0KK307CisKK3N0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9zdGFydF9kcGZbM10gPSB7CisJe0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9zdGFydF9kcGYpLAorCSAiU3RhcnQtRGVwZW5kZW50LUZ1bmN0aW9ucyIsIE5VTEx9LAorCXtBQ1BJX1JTRF8yQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKHN0YXJ0X2RwZi5jb21wYXRpYmlsaXR5X3ByaW9yaXR5KSwKKwkgIkNvbXBhdGliaWxpdHkgUHJpb3JpdHkiLCBhY3BpX2dibF9jb25maWdfZGVjb2RlfSwKKwl7QUNQSV9SU0RfMkJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChzdGFydF9kcGYucGVyZm9ybWFuY2Vfcm9idXN0bmVzcyksCisJICJQZXJmb3JtYW5jZS9Sb2J1c3RuZXNzIiwgYWNwaV9nYmxfY29uZmlnX2RlY29kZX0KK307CisKK3N0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9lbmRfZHBmWzFdID0geworCXtBQ1BJX1JTRF9USVRMRSwgQUNQSV9SU0RfVEFCTEVfU0laRShhY3BpX3JzX2R1bXBfZW5kX2RwZiksCisJICJFbmQtRGVwZW5kZW50LUZ1bmN0aW9ucyIsIE5VTEx9Cit9OworCitzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfaW9bNl0gPSB7CisJe0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9pbyksICJJL08iLCBOVUxMfSwKKwl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChpby5pb19kZWNvZGUpLCAiQWRkcmVzcyBEZWNvZGluZyIsCisJIGFjcGlfZ2JsX2lvX2RlY29kZX0sCisJe0FDUElfUlNEX1VJTlQxNiwgQUNQSV9SU0RfT0ZGU0VUKGlvLm1pbmltdW0pLCAiQWRkcmVzcyBNaW5pbXVtIiwgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQxNiwgQUNQSV9SU0RfT0ZGU0VUKGlvLm1heGltdW0pLCAiQWRkcmVzcyBNYXhpbXVtIiwgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQ4LCBBQ1BJX1JTRF9PRkZTRVQoaW8uYWxpZ25tZW50KSwgIkFsaWdubWVudCIsIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UOCwgQUNQSV9SU0RfT0ZGU0VUKGlvLmFkZHJlc3NfbGVuZ3RoKSwgIkFkZHJlc3MgTGVuZ3RoIiwKKwkgTlVMTH0KK307CisKK3N0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9maXhlZF9pb1szXSA9IHsKKwl7QUNQSV9SU0RfVElUTEUsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX2ZpeGVkX2lvKSwKKwkgIkZpeGVkIEkvTyIsIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UMTYsIEFDUElfUlNEX09GRlNFVChmaXhlZF9pby5hZGRyZXNzKSwgIkFkZHJlc3MiLCBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDgsIEFDUElfUlNEX09GRlNFVChmaXhlZF9pby5hZGRyZXNzX2xlbmd0aCksCisJICJBZGRyZXNzIExlbmd0aCIsIE5VTEx9Cit9OworCitzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfdmVuZG9yWzNdID0geworCXtBQ1BJX1JTRF9USVRMRSwgQUNQSV9SU0RfVEFCTEVfU0laRShhY3BpX3JzX2R1bXBfdmVuZG9yKSwKKwkgIlZlbmRvciBTcGVjaWZpYyIsIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UMTYsIEFDUElfUlNEX09GRlNFVCh2ZW5kb3IuYnl0ZV9sZW5ndGgpLCAiTGVuZ3RoIiwgTlVMTH0sCisJe0FDUElfUlNEX0xPTkdMSVNULCBBQ1BJX1JTRF9PRkZTRVQodmVuZG9yLmJ5dGVfZGF0YVswXSksICJWZW5kb3IgRGF0YSIsCisJIE5VTEx9Cit9OworCitzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfZW5kX3RhZ1sxXSA9IHsKKwl7QUNQSV9SU0RfVElUTEUsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX2VuZF90YWcpLCAiZW5kX3RhZyIsCisJIE5VTEx9Cit9OworCitzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfbWVtb3J5MjRbNl0gPSB7CisJe0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9tZW1vcnkyNCksCisJICIyNC1CaXQgTWVtb3J5IFJhbmdlIiwgTlVMTH0sCisJe0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQobWVtb3J5MjQud3JpdGVfcHJvdGVjdCksCisJICJXcml0ZSBQcm90ZWN0IiwgYWNwaV9nYmxfUldkZWNvZGV9LAorCXtBQ1BJX1JTRF9VSU5UMTYsIEFDUElfUlNEX09GRlNFVChtZW1vcnkyNC5taW5pbXVtKSwgIkFkZHJlc3MgTWluaW11bSIsCisJIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UMTYsIEFDUElfUlNEX09GRlNFVChtZW1vcnkyNC5tYXhpbXVtKSwgIkFkZHJlc3MgTWF4aW11bSIsCisJIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UMTYsIEFDUElfUlNEX09GRlNFVChtZW1vcnkyNC5hbGlnbm1lbnQpLCAiQWxpZ25tZW50IiwKKwkgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQxNiwgQUNQSV9SU0RfT0ZGU0VUKG1lbW9yeTI0LmFkZHJlc3NfbGVuZ3RoKSwKKwkgIkFkZHJlc3MgTGVuZ3RoIiwgTlVMTH0KK307CisKK3N0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9tZW1vcnkzMls2XSA9IHsKKwl7QUNQSV9SU0RfVElUTEUsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX21lbW9yeTMyKSwKKwkgIjMyLUJpdCBNZW1vcnkgUmFuZ2UiLCBOVUxMfSwKKwl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChtZW1vcnkzMi53cml0ZV9wcm90ZWN0KSwKKwkgIldyaXRlIFByb3RlY3QiLCBhY3BpX2dibF9SV2RlY29kZX0sCisJe0FDUElfUlNEX1VJTlQzMiwgQUNQSV9SU0RfT0ZGU0VUKG1lbW9yeTMyLm1pbmltdW0pLCAiQWRkcmVzcyBNaW5pbXVtIiwKKwkgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQzMiwgQUNQSV9SU0RfT0ZGU0VUKG1lbW9yeTMyLm1heGltdW0pLCAiQWRkcmVzcyBNYXhpbXVtIiwKKwkgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQzMiwgQUNQSV9SU0RfT0ZGU0VUKG1lbW9yeTMyLmFsaWdubWVudCksICJBbGlnbm1lbnQiLAorCSBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDMyLCBBQ1BJX1JTRF9PRkZTRVQobWVtb3J5MzIuYWRkcmVzc19sZW5ndGgpLAorCSAiQWRkcmVzcyBMZW5ndGgiLCBOVUxMfQorfTsKKworc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gYWNwaV9yc19kdW1wX2ZpeGVkX21lbW9yeTMyWzRdID0geworCXtBQ1BJX1JTRF9USVRMRSwgQUNQSV9SU0RfVEFCTEVfU0laRShhY3BpX3JzX2R1bXBfZml4ZWRfbWVtb3J5MzIpLAorCSAiMzItQml0IEZpeGVkIE1lbW9yeSBSYW5nZSIsIE5VTEx9LAorCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGZpeGVkX21lbW9yeTMyLndyaXRlX3Byb3RlY3QpLAorCSAiV3JpdGUgUHJvdGVjdCIsIGFjcGlfZ2JsX1JXZGVjb2RlfSwKKwl7QUNQSV9SU0RfVUlOVDMyLCBBQ1BJX1JTRF9PRkZTRVQoZml4ZWRfbWVtb3J5MzIuYWRkcmVzcyksICJBZGRyZXNzIiwKKwkgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQzMiwgQUNQSV9SU0RfT0ZGU0VUKGZpeGVkX21lbW9yeTMyLmFkZHJlc3NfbGVuZ3RoKSwKKwkgIkFkZHJlc3MgTGVuZ3RoIiwgTlVMTH0KK307CisKK3N0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9hZGRyZXNzMTZbOF0gPSB7CisJe0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9hZGRyZXNzMTYpLAorCSAiMTYtQml0IFdPUkQgQWRkcmVzcyBTcGFjZSIsIE5VTEx9LAorCXtBQ1BJX1JTRF9BRERSRVNTLCAwLCBOVUxMLCBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDE2LCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzczE2LmdyYW51bGFyaXR5KSwgIkdyYW51bGFyaXR5IiwKKwkgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQxNiwgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MxNi5taW5pbXVtKSwgIkFkZHJlc3MgTWluaW11bSIsCisJIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UMTYsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzMTYubWF4aW11bSksICJBZGRyZXNzIE1heGltdW0iLAorCSBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDE2LCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzczE2LnRyYW5zbGF0aW9uX29mZnNldCksCisJICJUcmFuc2xhdGlvbiBPZmZzZXQiLCBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDE2LCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzczE2LmFkZHJlc3NfbGVuZ3RoKSwKKwkgIkFkZHJlc3MgTGVuZ3RoIiwgTlVMTH0sCisJe0FDUElfUlNEX1NPVVJDRSwgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2UpLCBOVUxMLCBOVUxMfQorfTsKKworc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gYWNwaV9yc19kdW1wX2FkZHJlc3MzMls4XSA9IHsKKwl7QUNQSV9SU0RfVElUTEUsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX2FkZHJlc3MzMiksCisJICIzMi1CaXQgRFdPUkQgQWRkcmVzcyBTcGFjZSIsIE5VTEx9LAorCXtBQ1BJX1JTRF9BRERSRVNTLCAwLCBOVUxMLCBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDMyLCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzczMyLmdyYW51bGFyaXR5KSwgIkdyYW51bGFyaXR5IiwKKwkgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQzMiwgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MzMi5taW5pbXVtKSwgIkFkZHJlc3MgTWluaW11bSIsCisJIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UMzIsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzMzIubWF4aW11bSksICJBZGRyZXNzIE1heGltdW0iLAorCSBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDMyLCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzczMyLnRyYW5zbGF0aW9uX29mZnNldCksCisJICJUcmFuc2xhdGlvbiBPZmZzZXQiLCBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDMyLCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzczMyLmFkZHJlc3NfbGVuZ3RoKSwKKwkgIkFkZHJlc3MgTGVuZ3RoIiwgTlVMTH0sCisJe0FDUElfUlNEX1NPVVJDRSwgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2UpLCBOVUxMLCBOVUxMfQorfTsKKworc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gYWNwaV9yc19kdW1wX2FkZHJlc3M2NFs4XSA9IHsKKwl7QUNQSV9SU0RfVElUTEUsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX2FkZHJlc3M2NCksCisJICI2NC1CaXQgUVdPUkQgQWRkcmVzcyBTcGFjZSIsIE5VTEx9LAorCXtBQ1BJX1JTRF9BRERSRVNTLCAwLCBOVUxMLCBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDY0LCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzczY0LmdyYW51bGFyaXR5KSwgIkdyYW51bGFyaXR5IiwKKwkgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQ2NCwgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3M2NC5taW5pbXVtKSwgIkFkZHJlc3MgTWluaW11bSIsCisJIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UNjQsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzNjQubWF4aW11bSksICJBZGRyZXNzIE1heGltdW0iLAorCSBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDY0LCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzczY0LnRyYW5zbGF0aW9uX29mZnNldCksCisJICJUcmFuc2xhdGlvbiBPZmZzZXQiLCBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDY0LCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzczY0LmFkZHJlc3NfbGVuZ3RoKSwKKwkgIkFkZHJlc3MgTGVuZ3RoIiwgTlVMTH0sCisJe0FDUElfUlNEX1NPVVJDRSwgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2UpLCBOVUxMLCBOVUxMfQorfTsKKworc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gYWNwaV9yc19kdW1wX2V4dF9hZGRyZXNzNjRbOF0gPSB7CisJe0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9leHRfYWRkcmVzczY0KSwKKwkgIjY0LUJpdCBFeHRlbmRlZCBBZGRyZXNzIFNwYWNlIiwgTlVMTH0sCisJe0FDUElfUlNEX0FERFJFU1MsIDAsIE5VTEwsIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UNjQsIEFDUElfUlNEX09GRlNFVChleHRfYWRkcmVzczY0LmdyYW51bGFyaXR5KSwKKwkgIkdyYW51bGFyaXR5IiwgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQ2NCwgQUNQSV9SU0RfT0ZGU0VUKGV4dF9hZGRyZXNzNjQubWluaW11bSksCisJICJBZGRyZXNzIE1pbmltdW0iLCBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDY0LCBBQ1BJX1JTRF9PRkZTRVQoZXh0X2FkZHJlc3M2NC5tYXhpbXVtKSwKKwkgIkFkZHJlc3MgTWF4aW11bSIsIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UNjQsIEFDUElfUlNEX09GRlNFVChleHRfYWRkcmVzczY0LnRyYW5zbGF0aW9uX29mZnNldCksCisJICJUcmFuc2xhdGlvbiBPZmZzZXQiLCBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDY0LCBBQ1BJX1JTRF9PRkZTRVQoZXh0X2FkZHJlc3M2NC5hZGRyZXNzX2xlbmd0aCksCisJICJBZGRyZXNzIExlbmd0aCIsIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UNjQsIEFDUElfUlNEX09GRlNFVChleHRfYWRkcmVzczY0LnR5cGVfc3BlY2lmaWMpLAorCSAiVHlwZS1TcGVjaWZpYyBBdHRyaWJ1dGUiLCBOVUxMfQorfTsKKworc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gYWNwaV9yc19kdW1wX2V4dF9pcnFbOF0gPSB7CisJe0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9leHRfaXJxKSwKKwkgIkV4dGVuZGVkIElSUSIsIE5VTEx9LAorCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGV4dGVuZGVkX2lycS5wcm9kdWNlcl9jb25zdW1lciksCisJICJUeXBlIiwgYWNwaV9nYmxfY29uc3VtZV9kZWNvZGV9LAorCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGV4dGVuZGVkX2lycS50cmlnZ2VyaW5nKSwKKwkgIlRyaWdnZXJpbmciLCBhY3BpX2dibF9IRWRlY29kZX0sCisJe0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoZXh0ZW5kZWRfaXJxLnBvbGFyaXR5KSwgIlBvbGFyaXR5IiwKKwkgYWNwaV9nYmxfTExkZWNvZGV9LAorCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGV4dGVuZGVkX2lycS5zaGFyYWJsZSksICJTaGFyaW5nIiwKKwkgYWNwaV9nYmxfU0hSZGVjb2RlfSwKKwl7QUNQSV9SU0RfU09VUkNFLCBBQ1BJX1JTRF9PRkZTRVQoZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZSksIE5VTEwsCisJIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UOCwgQUNQSV9SU0RfT0ZGU0VUKGV4dGVuZGVkX2lycS5pbnRlcnJ1cHRfY291bnQpLAorCSAiSW50ZXJydXB0IENvdW50IiwgTlVMTH0sCisJe0FDUElfUlNEX0RXT1JETElTVCwgQUNQSV9SU0RfT0ZGU0VUKGV4dGVuZGVkX2lycS5pbnRlcnJ1cHRzWzBdKSwKKwkgIkludGVycnVwdCBMaXN0IiwgTlVMTH0KK307CisKK3N0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9nZW5lcmljX3JlZ1s2XSA9IHsKKwl7QUNQSV9SU0RfVElUTEUsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX2dlbmVyaWNfcmVnKSwKKwkgIkdlbmVyaWMgUmVnaXN0ZXIiLCBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDgsIEFDUElfUlNEX09GRlNFVChnZW5lcmljX3JlZy5zcGFjZV9pZCksICJTcGFjZSBJRCIsCisJIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UOCwgQUNQSV9SU0RfT0ZGU0VUKGdlbmVyaWNfcmVnLmJpdF93aWR0aCksICJCaXQgV2lkdGgiLAorCSBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDgsIEFDUElfUlNEX09GRlNFVChnZW5lcmljX3JlZy5iaXRfb2Zmc2V0KSwgIkJpdCBPZmZzZXQiLAorCSBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDgsIEFDUElfUlNEX09GRlNFVChnZW5lcmljX3JlZy5hY2Nlc3Nfc2l6ZSksCisJICJBY2Nlc3MgU2l6ZSIsIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UNjQsIEFDUElfUlNEX09GRlNFVChnZW5lcmljX3JlZy5hZGRyZXNzKSwgIkFkZHJlc3MiLCBOVUxMfQorfTsKKworLyoKKyAqIFRhYmxlcyB1c2VkIGZvciBjb21tb24gYWRkcmVzcyBkZXNjcmlwdG9yIGZsYWcgZmllbGRzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfZ2VuZXJhbF9mbGFnc1s1XSA9IHsKKwl7QUNQSV9SU0RfVElUTEUsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX2dlbmVyYWxfZmxhZ3MpLCBOVUxMLAorCSBOVUxMfSwKKwl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzLnByb2R1Y2VyX2NvbnN1bWVyKSwKKwkgIkNvbnN1bWVyL1Byb2R1Y2VyIiwgYWNwaV9nYmxfY29uc3VtZV9kZWNvZGV9LAorCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MuZGVjb2RlKSwgIkFkZHJlc3MgRGVjb2RlIiwKKwkgYWNwaV9nYmxfREVDZGVjb2RlfSwKKwl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzLm1pbl9hZGRyZXNzX2ZpeGVkKSwKKwkgIk1pbiBSZWxvY2F0YWJpbGl0eSIsIGFjcGlfZ2JsX21pbl9kZWNvZGV9LAorCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MubWF4X2FkZHJlc3NfZml4ZWQpLAorCSAiTWF4IFJlbG9jYXRhYmlsaXR5IiwgYWNwaV9nYmxfbWF4X2RlY29kZX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfbWVtb3J5X2ZsYWdzWzVdID0geworCXtBQ1BJX1JTRF9MSVRFUkFMLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9tZW1vcnlfZmxhZ3MpLAorCSAiUmVzb3VyY2UgVHlwZSIsICh2b2lkICopIk1lbW9yeSBSYW5nZSJ9LAorCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MuaW5mby5tZW0ud3JpdGVfcHJvdGVjdCksCisJICJXcml0ZSBQcm90ZWN0IiwgYWNwaV9nYmxfUldkZWNvZGV9LAorCXtBQ1BJX1JTRF8yQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MuaW5mby5tZW0uY2FjaGluZyksCisJICJDYWNoaW5nIiwgYWNwaV9nYmxfTUVNZGVjb2RlfSwKKwl7QUNQSV9SU0RfMkJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzLmluZm8ubWVtLnJhbmdlX3R5cGUpLAorCSAiUmFuZ2UgVHlwZSIsIGFjcGlfZ2JsX01UUGRlY29kZX0sCisJe0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzcy5pbmZvLm1lbS50cmFuc2xhdGlvbiksCisJICJUcmFuc2xhdGlvbiIsIGFjcGlfZ2JsX1RUUGRlY29kZX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfaW9fZmxhZ3NbNF0gPSB7CisJe0FDUElfUlNEX0xJVEVSQUwsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX2lvX2ZsYWdzKSwKKwkgIlJlc291cmNlIFR5cGUiLCAodm9pZCAqKSJJL08gUmFuZ2UifSwKKwl7QUNQSV9SU0RfMkJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzLmluZm8uaW8ucmFuZ2VfdHlwZSksCisJICJSYW5nZSBUeXBlIiwgYWNwaV9nYmxfUk5HZGVjb2RlfSwKKwl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzLmluZm8uaW8udHJhbnNsYXRpb24pLAorCSAiVHJhbnNsYXRpb24iLCBhY3BpX2dibF9UVFBkZWNvZGV9LAorCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MuaW5mby5pby50cmFuc2xhdGlvbl90eXBlKSwKKwkgIlRyYW5zbGF0aW9uIFR5cGUiLCBhY3BpX2dibF9UUlNkZWNvZGV9Cit9OworCisvKgorICogVGFibGUgdXNlZCB0byBkdW1wIF9QUlQgY29udGVudHMKKyAqLworc3RhdGljIHN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9wcnRbNV0gPSB7CisJe0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9wcnQpLCBOVUxMLCBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDY0LCBBQ1BJX1BSVF9PRkZTRVQoYWRkcmVzcyksICJBZGRyZXNzIiwgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQzMiwgQUNQSV9QUlRfT0ZGU0VUKHBpbiksICJQaW4iLCBOVUxMfSwKKwl7QUNQSV9SU0RfU1RSSU5HLCBBQ1BJX1BSVF9PRkZTRVQoc291cmNlWzBdKSwgIlNvdXJjZSIsIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UMzIsIEFDUElfUFJUX09GRlNFVChzb3VyY2VfaW5kZXgpLCAiU291cmNlIEluZGV4IiwgTlVMTH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9kZXNjcmlwdG9yCisgKgorICogUEFSQU1FVEVSUzogIFJlc291cmNlCiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKICAqCi0gKiBERVNDUklQVElPTjogUHJpbnRzIG91dCB0aGUgdmFyaW91cyBtZW1iZXJzIG9mIHRoZSBEYXRhIHN0cnVjdHVyZSB0eXBlLgorICogREVTQ1JJUFRJT046CiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2lycSh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpCitzdGF0aWMgdm9pZAorYWNwaV9yc19kdW1wX2Rlc2NyaXB0b3Iodm9pZCAqcmVzb3VyY2UsIHN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvICp0YWJsZSkKIHsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEgKmlycV9kYXRhID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSAqKWRhdGE7Ci0JdTggaW5kZXggPSAwOworCXU4ICp0YXJnZXQgPSBOVUxMOworCXU4ICpwcmV2aW91c190YXJnZXQ7CisJY2hhciAqbmFtZTsKKwl1OCBjb3VudDsKIAotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKwkvKiBGaXJzdCB0YWJsZSBlbnRyeSBtdXN0IGNvbnRhaW4gdGhlIHRhYmxlIGxlbmd0aCAoIyBvZiB0YWJsZSBlbnRyaWVzKSAqLwogCi0JYWNwaV9vc19wcmludGYoIklSUSBSZXNvdXJjZVxuIik7CisJY291bnQgPSB0YWJsZS0+b2Zmc2V0OwogCi0JYWNwaV9vc19wcmludGYoIiAgJXMgVHJpZ2dlcmVkXG4iLAotCQkgICAgICAgQUNQSV9MRVZFTF9TRU5TSVRJVkUgPT0KLQkJICAgICAgIGlycV9kYXRhLT5lZGdlX2xldmVsID8gIkxldmVsIiA6ICJFZGdlIik7CisJd2hpbGUgKGNvdW50KSB7CisJCXByZXZpb3VzX3RhcmdldCA9IHRhcmdldDsKKwkJdGFyZ2V0ID0gQUNQSV9BRERfUFRSKHU4LCByZXNvdXJjZSwgdGFibGUtPm9mZnNldCk7CisJCW5hbWUgPSB0YWJsZS0+bmFtZTsKIAotCWFjcGlfb3NfcHJpbnRmKCIgIEFjdGl2ZSAlc1xuIiwKLQkJICAgICAgIEFDUElfQUNUSVZFX0xPVyA9PQotCQkgICAgICAgaXJxX2RhdGEtPmFjdGl2ZV9oaWdoX2xvdyA/ICJMb3ciIDogIkhpZ2giKTsKLQotCWFjcGlfb3NfcHJpbnRmKCIgICVzXG4iLAotCQkgICAgICAgQUNQSV9TSEFSRUQgPT0KLQkJICAgICAgIGlycV9kYXRhLT5zaGFyZWRfZXhjbHVzaXZlID8gIlNoYXJlZCIgOiAiRXhjbHVzaXZlIik7Ci0KLQlhY3BpX29zX3ByaW50ZigiICAlWCBJbnRlcnJ1cHRzICggIiwgaXJxX2RhdGEtPm51bWJlcl9vZl9pbnRlcnJ1cHRzKTsKLQotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGlycV9kYXRhLT5udW1iZXJfb2ZfaW50ZXJydXB0czsgaW5kZXgrKykgewotCQlhY3BpX29zX3ByaW50ZigiJVggIiwgaXJxX2RhdGEtPmludGVycnVwdHNbaW5kZXhdKTsKLQl9Ci0KLQlhY3BpX29zX3ByaW50ZigiKVxuIik7Ci0JcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2R1bXBfZG1hCi0gKgotICogUEFSQU1FVEVSUzogIERhdGEgICAgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHJlc291cmNlIHN0cnVjdHVyZSB0byBkdW1wLgotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFByaW50cyBvdXQgdGhlIHZhcmlvdXMgbWVtYmVycyBvZiB0aGUgRGF0YSBzdHJ1Y3R1cmUgdHlwZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfZG1hKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSkKLXsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9kbWEgKmRtYV9kYXRhID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlX2RtYSAqKWRhdGE7Ci0JdTggaW5kZXggPSAwOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JYWNwaV9vc19wcmludGYoIkRNQSBSZXNvdXJjZVxuIik7Ci0KLQlzd2l0Y2ggKGRtYV9kYXRhLT50eXBlKSB7Ci0JY2FzZSBBQ1BJX0NPTVBBVElCSUxJVFk6Ci0JCWFjcGlfb3NfcHJpbnRmKCIgIENvbXBhdGliaWxpdHkgbW9kZVxuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfQToKLQkJYWNwaV9vc19wcmludGYoIiAgVHlwZSBBXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9COgotCQlhY3BpX29zX3ByaW50ZigiICBUeXBlIEJcbiIpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0Y6Ci0JCWFjcGlfb3NfcHJpbnRmKCIgIFR5cGUgRlxuIik7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYWNwaV9vc19wcmludGYoIiAgSW52YWxpZCBETUEgdHlwZVxuIik7Ci0JCWJyZWFrOwotCX0KLQotCWFjcGlfb3NfcHJpbnRmKCIgICVzQnVzIE1hc3RlclxuIiwKLQkJICAgICAgIEFDUElfQlVTX01BU1RFUiA9PSBkbWFfZGF0YS0+YnVzX21hc3RlciA/ICIiIDogIk5vdCBhICIpOwotCi0Jc3dpdGNoIChkbWFfZGF0YS0+dHJhbnNmZXIpIHsKLQljYXNlIEFDUElfVFJBTlNGRVJfODoKLQkJYWNwaV9vc19wcmludGYoIiAgOC1iaXQgb25seSB0cmFuc2ZlclxuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RSQU5TRkVSXzhfMTY6Ci0JCWFjcGlfb3NfcHJpbnRmKCIgIDggYW5kIDE2LWJpdCB0cmFuc2ZlclxuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RSQU5TRkVSXzE2OgotCQlhY3BpX29zX3ByaW50ZigiICAxNiBiaXQgb25seSB0cmFuc2ZlclxuIik7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYWNwaV9vc19wcmludGYoIiAgSW52YWxpZCB0cmFuc2ZlciBwcmVmZXJlbmNlXG4iKTsKLQkJYnJlYWs7Ci0JfQotCi0JYWNwaV9vc19wcmludGYoIiAgTnVtYmVyIG9mIENoYW5uZWxzOiAlWCAoICIsCi0JCSAgICAgICBkbWFfZGF0YS0+bnVtYmVyX29mX2NoYW5uZWxzKTsKLQotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGRtYV9kYXRhLT5udW1iZXJfb2ZfY2hhbm5lbHM7IGluZGV4KyspIHsKLQkJYWNwaV9vc19wcmludGYoIiVYICIsIGRtYV9kYXRhLT5jaGFubmVsc1tpbmRleF0pOwotCX0KLQotCWFjcGlfb3NfcHJpbnRmKCIpXG4iKTsKLQlyZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9zdGFydF9kZXBlbmRfZm5zCi0gKgotICogUEFSQU1FVEVSUzogIERhdGEgICAgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHJlc291cmNlIHN0cnVjdHVyZSB0byBkdW1wLgotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFByaW50cyBvdXQgdGhlIHZhcmlvdXMgbWVtYmVycyBvZiB0aGUgRGF0YSBzdHJ1Y3R1cmUgdHlwZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfc3RhcnRfZGVwZW5kX2Zucyh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpCi17Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2Vfc3RhcnRfZHBmICpzZGZfZGF0YSA9Ci0JICAgIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zdGFydF9kcGYgKilkYXRhOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JYWNwaV9vc19wcmludGYoIlN0YXJ0IERlcGVuZGVudCBGdW5jdGlvbnMgUmVzb3VyY2VcbiIpOwotCi0Jc3dpdGNoIChzZGZfZGF0YS0+Y29tcGF0aWJpbGl0eV9wcmlvcml0eSkgewotCWNhc2UgQUNQSV9HT09EX0NPTkZJR1VSQVRJT046Ci0JCWFjcGlfb3NfcHJpbnRmKCIgIEdvb2QgY29uZmlndXJhdGlvblxuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTjoKLQkJYWNwaV9vc19wcmludGYoIiAgQWNjZXB0YWJsZSBjb25maWd1cmF0aW9uXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfU1VCX09QVElNQUxfQ09ORklHVVJBVElPTjoKLQkJYWNwaV9vc19wcmludGYoIiAgU3ViLW9wdGltYWwgY29uZmlndXJhdGlvblxuIik7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYWNwaV9vc19wcmludGYoIiAgSW52YWxpZCBjb21wYXRpYmlsaXR5IHByaW9yaXR5XG4iKTsKLQkJYnJlYWs7Ci0JfQotCi0Jc3dpdGNoIChzZGZfZGF0YS0+cGVyZm9ybWFuY2Vfcm9idXN0bmVzcykgewotCWNhc2UgQUNQSV9HT09EX0NPTkZJR1VSQVRJT046Ci0JCWFjcGlfb3NfcHJpbnRmKCIgIEdvb2QgY29uZmlndXJhdGlvblxuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTjoKLQkJYWNwaV9vc19wcmludGYoIiAgQWNjZXB0YWJsZSBjb25maWd1cmF0aW9uXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfU1VCX09QVElNQUxfQ09ORklHVVJBVElPTjoKLQkJYWNwaV9vc19wcmludGYoIiAgU3ViLW9wdGltYWwgY29uZmlndXJhdGlvblxuIik7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYWNwaV9vc19wcmludGYoIiAgSW52YWxpZCBwZXJmb3JtYW5jZSByb2J1c3RuZXNzIHByZWZlcmVuY2VcbiIpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9pbwotICoKLSAqIFBBUkFNRVRFUlM6ICBEYXRhICAgICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByZXNvdXJjZSBzdHJ1Y3R1cmUgdG8gZHVtcC4KLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBQcmludHMgb3V0IHRoZSB2YXJpb3VzIG1lbWJlcnMgb2YgdGhlIERhdGEgc3RydWN0dXJlIHR5cGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2lvKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSkKLXsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbyAqaW9fZGF0YSA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbyAqKWRhdGE7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQlhY3BpX29zX3ByaW50ZigiSW8gUmVzb3VyY2VcbiIpOwotCi0JYWNwaV9vc19wcmludGYoIiAgJWQgYml0IGRlY29kZVxuIiwKLQkJICAgICAgIEFDUElfREVDT0RFXzE2ID09IGlvX2RhdGEtPmlvX2RlY29kZSA/IDE2IDogMTApOwotCi0JYWNwaV9vc19wcmludGYoIiAgUmFuZ2UgbWluaW11bSBiYXNlOiAlMDhYXG4iLAotCQkgICAgICAgaW9fZGF0YS0+bWluX2Jhc2VfYWRkcmVzcyk7Ci0KLQlhY3BpX29zX3ByaW50ZigiICBSYW5nZSBtYXhpbXVtIGJhc2U6ICUwOFhcbiIsCi0JCSAgICAgICBpb19kYXRhLT5tYXhfYmFzZV9hZGRyZXNzKTsKLQotCWFjcGlfb3NfcHJpbnRmKCIgIEFsaWdubWVudDogJTA4WFxuIiwgaW9fZGF0YS0+YWxpZ25tZW50KTsKLQotCWFjcGlfb3NfcHJpbnRmKCIgIFJhbmdlIExlbmd0aDogJTA4WFxuIiwgaW9fZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKLQotCXJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX2ZpeGVkX2lvCi0gKgotICogUEFSQU1FVEVSUzogIERhdGEgICAgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHJlc291cmNlIHN0cnVjdHVyZSB0byBkdW1wLgotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFByaW50cyBvdXQgdGhlIHZhcmlvdXMgbWVtYmVycyBvZiB0aGUgRGF0YSBzdHJ1Y3R1cmUgdHlwZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfZml4ZWRfaW8odW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpkYXRhKQotewotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvICpmaXhlZF9pb19kYXRhID0KLQkgICAgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvICopZGF0YTsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCWFjcGlfb3NfcHJpbnRmKCJGaXhlZCBJbyBSZXNvdXJjZVxuIik7Ci0JYWNwaV9vc19wcmludGYoIiAgUmFuZ2UgYmFzZSBhZGRyZXNzOiAlMDhYIiwKLQkJICAgICAgIGZpeGVkX2lvX2RhdGEtPmJhc2VfYWRkcmVzcyk7Ci0KLQlhY3BpX29zX3ByaW50ZigiICBSYW5nZSBsZW5ndGg6ICUwOFgiLCBmaXhlZF9pb19kYXRhLT5yYW5nZV9sZW5ndGgpOwotCi0JcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2R1bXBfdmVuZG9yX3NwZWNpZmljCi0gKgotICogUEFSQU1FVEVSUzogIERhdGEgICAgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHJlc291cmNlIHN0cnVjdHVyZSB0byBkdW1wLgotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFByaW50cyBvdXQgdGhlIHZhcmlvdXMgbWVtYmVycyBvZiB0aGUgRGF0YSBzdHJ1Y3R1cmUgdHlwZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfdmVuZG9yX3NwZWNpZmljKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSkKLXsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IgKnZlbmRvcl9kYXRhID0KLQkgICAgKHN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvciAqKWRhdGE7Ci0JdTE2IGluZGV4ID0gMDsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCWFjcGlfb3NfcHJpbnRmKCJWZW5kb3IgU3BlY2lmaWMgUmVzb3VyY2VcbiIpOwotCi0JYWNwaV9vc19wcmludGYoIiAgTGVuZ3RoOiAlMDhYXG4iLCB2ZW5kb3JfZGF0YS0+bGVuZ3RoKTsKLQotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHZlbmRvcl9kYXRhLT5sZW5ndGg7IGluZGV4KyspIHsKLQkJYWNwaV9vc19wcmludGYoIiAgQnl0ZSAlWDogJTA4WFxuIiwKLQkJCSAgICAgICBpbmRleCwgdmVuZG9yX2RhdGEtPnJlc2VydmVkW2luZGV4XSk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2R1bXBfbWVtb3J5MjQKLSAqCi0gKiBQQVJBTUVURVJTOiAgRGF0YSAgICAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgcmVzb3VyY2Ugc3RydWN0dXJlIHRvIGR1bXAuCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogUHJpbnRzIG91dCB0aGUgdmFyaW91cyBtZW1iZXJzIG9mIHRoZSBEYXRhIHN0cnVjdHVyZSB0eXBlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9tZW1vcnkyNCh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpCi17Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMjQgKm1lbW9yeTI0X2RhdGEgPQotCSAgICAoc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMjQgKilkYXRhOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JYWNwaV9vc19wcmludGYoIjI0LUJpdCBNZW1vcnkgUmFuZ2UgUmVzb3VyY2VcbiIpOwotCi0JYWNwaV9vc19wcmludGYoIiAgUmVhZCVzXG4iLAotCQkgICAgICAgQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PQotCQkgICAgICAgbWVtb3J5MjRfZGF0YS0+cmVhZF93cml0ZV9hdHRyaWJ1dGUgPwotCQkgICAgICAgIi9Xcml0ZSIgOiAiIG9ubHkiKTsKLQotCWFjcGlfb3NfcHJpbnRmKCIgIFJhbmdlIG1pbmltdW0gYmFzZTogJTA4WFxuIiwKLQkJICAgICAgIG1lbW9yeTI0X2RhdGEtPm1pbl9iYXNlX2FkZHJlc3MpOwotCi0JYWNwaV9vc19wcmludGYoIiAgUmFuZ2UgbWF4aW11bSBiYXNlOiAlMDhYXG4iLAotCQkgICAgICAgbWVtb3J5MjRfZGF0YS0+bWF4X2Jhc2VfYWRkcmVzcyk7Ci0KLQlhY3BpX29zX3ByaW50ZigiICBBbGlnbm1lbnQ6ICUwOFhcbiIsIG1lbW9yeTI0X2RhdGEtPmFsaWdubWVudCk7Ci0KLQlhY3BpX29zX3ByaW50ZigiICBSYW5nZSBsZW5ndGg6ICUwOFhcbiIsIG1lbW9yeTI0X2RhdGEtPnJhbmdlX2xlbmd0aCk7Ci0KLQlyZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9tZW1vcnkzMgotICoKLSAqIFBBUkFNRVRFUlM6ICBEYXRhICAgICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByZXNvdXJjZSBzdHJ1Y3R1cmUgdG8gZHVtcC4KLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBQcmludHMgb3V0IHRoZSB2YXJpb3VzIG1lbWJlcnMgb2YgdGhlIERhdGEgc3RydWN0dXJlIHR5cGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX21lbW9yeTMyKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqZGF0YSkKLXsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0zMiAqbWVtb3J5MzJfZGF0YSA9Ci0JICAgIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0zMiAqKWRhdGE7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQlhY3BpX29zX3ByaW50ZigiMzItQml0IE1lbW9yeSBSYW5nZSBSZXNvdXJjZVxuIik7Ci0KLQlhY3BpX29zX3ByaW50ZigiICBSZWFkJXNcbiIsCi0JCSAgICAgICBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09Ci0JCSAgICAgICBtZW1vcnkzMl9kYXRhLT5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA/Ci0JCSAgICAgICAiL1dyaXRlIiA6ICIgb25seSIpOwotCi0JYWNwaV9vc19wcmludGYoIiAgUmFuZ2UgbWluaW11bSBiYXNlOiAlMDhYXG4iLAotCQkgICAgICAgbWVtb3J5MzJfZGF0YS0+bWluX2Jhc2VfYWRkcmVzcyk7Ci0KLQlhY3BpX29zX3ByaW50ZigiICBSYW5nZSBtYXhpbXVtIGJhc2U6ICUwOFhcbiIsCi0JCSAgICAgICBtZW1vcnkzMl9kYXRhLT5tYXhfYmFzZV9hZGRyZXNzKTsKLQotCWFjcGlfb3NfcHJpbnRmKCIgIEFsaWdubWVudDogJTA4WFxuIiwgbWVtb3J5MzJfZGF0YS0+YWxpZ25tZW50KTsKLQotCWFjcGlfb3NfcHJpbnRmKCIgIFJhbmdlIGxlbmd0aDogJTA4WFxuIiwgbWVtb3J5MzJfZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKLQotCXJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX2ZpeGVkX21lbW9yeTMyCi0gKgotICogUEFSQU1FVEVSUzogIERhdGEgICAgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHJlc291cmNlIHN0cnVjdHVyZSB0byBkdW1wLgotICoKLSAqIFJFVFVSTjoKLSAqCi0gKiBERVNDUklQVElPTjogUHJpbnRzIG91dCB0aGUgdmFyaW91cyBtZW1iZXJzIG9mIHRoZSBEYXRhIHN0cnVjdHVyZSB0eXBlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9maXhlZF9tZW1vcnkzMih1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpCi17Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtMzIgKmZpeGVkX21lbW9yeTMyX2RhdGEgPQotCSAgICAoc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtMzIgKilkYXRhOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JYWNwaV9vc19wcmludGYoIjMyLUJpdCBGaXhlZCBMb2NhdGlvbiBNZW1vcnkgUmFuZ2UgUmVzb3VyY2VcbiIpOwotCi0JYWNwaV9vc19wcmludGYoIiAgUmVhZCVzXG4iLAotCQkgICAgICAgQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PQotCQkgICAgICAgZml4ZWRfbWVtb3J5MzJfZGF0YS0+Ci0JCSAgICAgICByZWFkX3dyaXRlX2F0dHJpYnV0ZSA/ICIvV3JpdGUiIDogIiBPbmx5Iik7Ci0KLQlhY3BpX29zX3ByaW50ZigiICBSYW5nZSBiYXNlIGFkZHJlc3M6ICUwOFhcbiIsCi0JCSAgICAgICBmaXhlZF9tZW1vcnkzMl9kYXRhLT5yYW5nZV9iYXNlX2FkZHJlc3MpOwotCi0JYWNwaV9vc19wcmludGYoIiAgUmFuZ2UgbGVuZ3RoOiAlMDhYXG4iLAotCQkgICAgICAgZml4ZWRfbWVtb3J5MzJfZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKLQotCXJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX2FkZHJlc3MxNgotICoKLSAqIFBBUkFNRVRFUlM6ICBEYXRhICAgICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByZXNvdXJjZSBzdHJ1Y3R1cmUgdG8gZHVtcC4KLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBQcmludHMgb3V0IHRoZSB2YXJpb3VzIG1lbWJlcnMgb2YgdGhlIERhdGEgc3RydWN0dXJlIHR5cGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2FkZHJlc3MxNih1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpCi17Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2ICphZGRyZXNzMTZfZGF0YSA9Ci0JICAgIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMTYgKilkYXRhOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JYWNwaV9vc19wcmludGYoIjE2LUJpdCBBZGRyZXNzIFNwYWNlIFJlc291cmNlXG4iKTsKLQlhY3BpX29zX3ByaW50ZigiICBSZXNvdXJjZSBUeXBlOiAiKTsKLQotCXN3aXRjaCAoYWRkcmVzczE2X2RhdGEtPnJlc291cmNlX3R5cGUpIHsKLQljYXNlIEFDUElfTUVNT1JZX1JBTkdFOgotCi0JCWFjcGlfb3NfcHJpbnRmKCJNZW1vcnkgUmFuZ2VcbiIpOwotCi0JCXN3aXRjaCAoYWRkcmVzczE2X2RhdGEtPmF0dHJpYnV0ZS5tZW1vcnkuY2FjaGVfYXR0cmlidXRlKSB7Ci0JCWNhc2UgQUNQSV9OT05fQ0FDSEVBQkxFX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmCi0JCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IE5vbmNhY2hlYWJsZSBtZW1vcnlcbiIpOworCQlzd2l0Y2ggKHRhYmxlLT5vcGNvZGUpIHsKKwkJY2FzZSBBQ1BJX1JTRF9USVRMRToKKwkJCS8qCisJCQkgKiBPcHRpb25hbCByZXNvdXJjZSB0aXRsZQorCQkJICovCisJCQlpZiAodGFibGUtPm5hbWUpIHsKKwkJCQlhY3BpX29zX3ByaW50ZigiJXMgUmVzb3VyY2VcbiIsIG5hbWUpOworCQkJfQogCQkJYnJlYWs7CiAKLQkJY2FzZSBBQ1BJX0NBQ0hBQkxFX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmKCIgIFR5cGUgU3BlY2lmaWM6IENhY2hlYWJsZSBtZW1vcnlcbiIpOworCQkJLyogU3RyaW5ncyAqLworCisJCWNhc2UgQUNQSV9SU0RfTElURVJBTDoKKwkJCWFjcGlfcnNfb3V0X3N0cmluZyhuYW1lLAorCQkJCQkgICBBQ1BJX0NBU1RfUFRSKGNoYXIsIHRhYmxlLT5wb2ludGVyKSk7CiAJCQlicmVhazsKIAotCQljYXNlIEFDUElfV1JJVEVfQ09NQklOSU5HX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmCi0JCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IFdyaXRlLWNvbWJpbmluZyBtZW1vcnlcbiIpOworCQljYXNlIEFDUElfUlNEX1NUUklORzoKKwkJCWFjcGlfcnNfb3V0X3N0cmluZyhuYW1lLCBBQ1BJX0NBU1RfUFRSKGNoYXIsIHRhcmdldCkpOwogCQkJYnJlYWs7CiAKLQkJY2FzZSBBQ1BJX1BSRUZFVENIQUJMRV9NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZgotCQkJICAgICgiICBUeXBlIFNwZWNpZmljOiBQcmVmZXRjaGFibGUgbWVtb3J5XG4iKTsKKwkJCS8qIERhdGEgaXRlbXMsIDgvMTYvMzIvNjQgYml0ICovCisKKwkJY2FzZSBBQ1BJX1JTRF9VSU5UODoKKwkJCWFjcGlfcnNfb3V0X2ludGVnZXI4KG5hbWUsIEFDUElfR0VUOCh0YXJnZXQpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SU0RfVUlOVDE2OgorCQkJYWNwaV9yc19vdXRfaW50ZWdlcjE2KG5hbWUsIEFDUElfR0VUMTYodGFyZ2V0KSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNEX1VJTlQzMjoKKwkJCWFjcGlfcnNfb3V0X2ludGVnZXIzMihuYW1lLCBBQ1BJX0dFVDMyKHRhcmdldCkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JTRF9VSU5UNjQ6CisJCQlhY3BpX3JzX291dF9pbnRlZ2VyNjQobmFtZSwgQUNQSV9HRVQ2NCh0YXJnZXQpKTsKKwkJCWJyZWFrOworCisJCQkvKiBGbGFnczogMS1iaXQgYW5kIDItYml0IGZsYWdzIHN1cHBvcnRlZCAqLworCisJCWNhc2UgQUNQSV9SU0RfMUJJVEZMQUc6CisJCQlhY3BpX3JzX291dF9zdHJpbmcobmFtZSwgQUNQSV9DQVNUX1BUUihjaGFyLAorCQkJCQkJCSAgICAgICB0YWJsZS0+CisJCQkJCQkJICAgICAgIHBvaW50ZXJbKnRhcmdldCAmCisJCQkJCQkJCSAgICAgICAweDAxXSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JTRF8yQklURkxBRzoKKwkJCWFjcGlfcnNfb3V0X3N0cmluZyhuYW1lLCBBQ1BJX0NBU1RfUFRSKGNoYXIsCisJCQkJCQkJICAgICAgIHRhYmxlLT4KKwkJCQkJCQkgICAgICAgcG9pbnRlclsqdGFyZ2V0ICYKKwkJCQkJCQkJICAgICAgIDB4MDNdKSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNEX1NIT1JUTElTVDoKKwkJCS8qCisJCQkgKiBTaG9ydCBieXRlIGxpc3QgKHNpbmdsZSBsaW5lIG91dHB1dCkgZm9yIERNQSBhbmQgSVJRIHJlc291cmNlcworCQkJICogTm90ZTogVGhlIGxpc3QgbGVuZ3RoIGlzIG9idGFpbmVkIGZyb20gdGhlIHByZXZpb3VzIHRhYmxlIGVudHJ5CisJCQkgKi8KKwkJCWlmIChwcmV2aW91c190YXJnZXQpIHsKKwkJCQlhY3BpX3JzX291dF90aXRsZShuYW1lKTsKKwkJCQlhY3BpX3JzX2R1bXBfc2hvcnRfYnl0ZV9saXN0KCpwcmV2aW91c190YXJnZXQsCisJCQkJCQkJICAgICB0YXJnZXQpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JTRF9MT05HTElTVDoKKwkJCS8qCisJCQkgKiBMb25nIGJ5dGUgbGlzdCBmb3IgVmVuZG9yIHJlc291cmNlIGRhdGEKKwkJCSAqIE5vdGU6IFRoZSBsaXN0IGxlbmd0aCBpcyBvYnRhaW5lZCBmcm9tIHRoZSBwcmV2aW91cyB0YWJsZSBlbnRyeQorCQkJICovCisJCQlpZiAocHJldmlvdXNfdGFyZ2V0KSB7CisJCQkJYWNwaV9yc19kdW1wX2J5dGVfbGlzdChBQ1BJX0dFVDE2CisJCQkJCQkgICAgICAgKHByZXZpb3VzX3RhcmdldCksCisJCQkJCQkgICAgICAgdGFyZ2V0KTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SU0RfRFdPUkRMSVNUOgorCQkJLyoKKwkJCSAqIER3b3JkIGxpc3QgZm9yIEV4dGVuZGVkIEludGVycnVwdCByZXNvdXJjZXMKKwkJCSAqIE5vdGU6IFRoZSBsaXN0IGxlbmd0aCBpcyBvYnRhaW5lZCBmcm9tIHRoZSBwcmV2aW91cyB0YWJsZSBlbnRyeQorCQkJICovCisJCQlpZiAocHJldmlvdXNfdGFyZ2V0KSB7CisJCQkJYWNwaV9yc19kdW1wX2R3b3JkX2xpc3QoKnByZXZpb3VzX3RhcmdldCwKKwkJCQkJCQlBQ1BJX0NBU1RfUFRSKHUzMiwKKwkJCQkJCQkJICAgICAgdGFyZ2V0KSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNEX0FERFJFU1M6CisJCQkvKgorCQkJICogQ29tbW9uIGZsYWdzIGZvciBhbGwgQWRkcmVzcyByZXNvdXJjZXMKKwkJCSAqLworCQkJYWNwaV9yc19kdW1wX2FkZHJlc3NfY29tbW9uKEFDUElfQ0FTVF9QVFIKKwkJCQkJCSAgICAodW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhLAorCQkJCQkJICAgICB0YXJnZXQpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SU0RfU09VUkNFOgorCQkJLyoKKwkJCSAqIE9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSBmb3IgQWRkcmVzcyByZXNvdXJjZXMKKwkJCSAqLworCQkJYWNwaV9yc19kdW1wX3Jlc291cmNlX3NvdXJjZShBQ1BJX0NBU1RfUFRSCisJCQkJCQkgICAgIChzdHJ1Y3QKKwkJCQkJCSAgICAgIGFjcGlfcmVzb3VyY2Vfc291cmNlLAorCQkJCQkJICAgICAgdGFyZ2V0KSk7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJYWNwaV9vc19wcmludGYKLQkJCSAgICAoIiAgVHlwZSBTcGVjaWZpYzogSW52YWxpZCBjYWNoZSBhdHRyaWJ1dGVcbiIpOwotCQkJYnJlYWs7CisJCQlhY3BpX29zX3ByaW50ZigiKioqKiBJbnZhbGlkIHRhYmxlIG9wY29kZSBbJVhdICoqKipcbiIsCisJCQkJICAgICAgIHRhYmxlLT5vcGNvZGUpOworCQkJcmV0dXJuOwogCQl9CiAKLQkJYWNwaV9vc19wcmludGYoIiAgVHlwZSBTcGVjaWZpYzogUmVhZCVzXG4iLAotCQkJICAgICAgIEFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0KLQkJCSAgICAgICBhZGRyZXNzMTZfZGF0YS0+YXR0cmlidXRlLm1lbW9yeS4KLQkJCSAgICAgICByZWFkX3dyaXRlX2F0dHJpYnV0ZSA/ICIvV3JpdGUiIDogIiBPbmx5Iik7CisJCXRhYmxlKys7CisJCWNvdW50LS07CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2R1bXBfcmVzb3VyY2Vfc291cmNlCisgKgorICogUEFSQU1FVEVSUzogIHJlc291cmNlX3NvdXJjZSAgICAgLSBQb2ludGVyIHRvIGEgUmVzb3VyY2UgU291cmNlIHN0cnVjdAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IENvbW1vbiByb3V0aW5lIGZvciBkdW1waW5nIHRoZSBvcHRpb25hbCByZXNvdXJjZV9zb3VyY2UgYW5kIHRoZQorICogICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2Vfc291cmNlX2luZGV4LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCithY3BpX3JzX2R1bXBfcmVzb3VyY2Vfc291cmNlKHN0cnVjdCBhY3BpX3Jlc291cmNlX3NvdXJjZSAqcmVzb3VyY2Vfc291cmNlKQoreworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCWlmIChyZXNvdXJjZV9zb3VyY2UtPmluZGV4ID09IDB4RkYpIHsKKwkJcmV0dXJuOworCX0KKworCWFjcGlfcnNfb3V0X2ludGVnZXI4KCJSZXNvdXJjZSBTb3VyY2UgSW5kZXgiLCByZXNvdXJjZV9zb3VyY2UtPmluZGV4KTsKKworCWFjcGlfcnNfb3V0X3N0cmluZygiUmVzb3VyY2UgU291cmNlIiwKKwkJCSAgIHJlc291cmNlX3NvdXJjZS0+c3RyaW5nX3B0ciA/CisJCQkgICByZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19wdHIgOiAiW05vdCBTcGVjaWZpZWRdIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9hZGRyZXNzX2NvbW1vbgorICoKKyAqIFBBUkFNRVRFUlM6ICBSZXNvdXJjZSAgICAgICAgLSBQb2ludGVyIHRvIGFuIGludGVybmFsIHJlc291cmNlIGRlc2NyaXB0b3IKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBEdW1wIHRoZSBmaWVsZHMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBBZGRyZXNzIHJlc291cmNlCisgKiAgICAgICAgICAgICAgZGVzY3JpcHRvcnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfYWRkcmVzc19jb21tb24odW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpyZXNvdXJjZSkKK3sKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwkvKiBEZWNvZGUgdGhlIHR5cGUtc3BlY2lmaWMgZmxhZ3MgKi8KKworCXN3aXRjaCAocmVzb3VyY2UtPmFkZHJlc3MucmVzb3VyY2VfdHlwZSkgeworCWNhc2UgQUNQSV9NRU1PUllfUkFOR0U6CisKKwkJYWNwaV9yc19kdW1wX2Rlc2NyaXB0b3IocmVzb3VyY2UsIGFjcGlfcnNfZHVtcF9tZW1vcnlfZmxhZ3MpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9JT19SQU5HRToKIAotCQlhY3BpX29zX3ByaW50ZigiSS9PIFJhbmdlXG4iKTsKLQotCQlzd2l0Y2ggKGFkZHJlc3MxNl9kYXRhLT5hdHRyaWJ1dGUuaW8ucmFuZ2VfYXR0cmlidXRlKSB7Ci0JCWNhc2UgQUNQSV9OT05fSVNBX09OTFlfUkFOR0VTOgotCQkJYWNwaV9vc19wcmludGYKLQkJCSAgICAoIiAgVHlwZSBTcGVjaWZpYzogTm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX0lTQV9PTkxZX1JBTkdFUzoKLQkJCWFjcGlfb3NfcHJpbnRmKCIgIFR5cGUgU3BlY2lmaWM6IElTQSBJbyBBZGRyZXNzZXNcbiIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX0VOVElSRV9SQU5HRToKLQkJCWFjcGlfb3NfcHJpbnRmCi0JCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IElTQSBhbmQgbm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWFjcGlfb3NfcHJpbnRmCi0JCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IEludmFsaWQgcmFuZ2UgYXR0cmlidXRlXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJYWNwaV9vc19wcmludGYoIiAgVHlwZSBTcGVjaWZpYzogJXMgVHJhbnNsYXRpb25cbiIsCi0JCQkgICAgICAgQUNQSV9TUEFSU0VfVFJBTlNMQVRJT04gPT0KLQkJCSAgICAgICBhZGRyZXNzMTZfZGF0YS0+YXR0cmlidXRlLmlvLgotCQkJICAgICAgIHRyYW5zbGF0aW9uX2F0dHJpYnV0ZSA/ICJTcGFyc2UiIDogIkRlbnNlIik7CisJCWFjcGlfcnNfZHVtcF9kZXNjcmlwdG9yKHJlc291cmNlLCBhY3BpX3JzX2R1bXBfaW9fZmxhZ3MpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9CVVNfTlVNQkVSX1JBTkdFOgogCi0JCWFjcGlfb3NfcHJpbnRmKCJCdXMgTnVtYmVyIFJhbmdlXG4iKTsKKwkJYWNwaV9yc19vdXRfc3RyaW5nKCJSZXNvdXJjZSBUeXBlIiwgIkJ1cyBOdW1iZXIgUmFuZ2UiKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCi0JCWFjcGlfb3NfcHJpbnRmKCIweCUyLjJYXG4iLCBhZGRyZXNzMTZfZGF0YS0+cmVzb3VyY2VfdHlwZSk7CisJCWFjcGlfcnNfb3V0X2ludGVnZXI4KCJSZXNvdXJjZSBUeXBlIiwKKwkJCQkgICAgICh1OCkgcmVzb3VyY2UtPmFkZHJlc3MucmVzb3VyY2VfdHlwZSk7CiAJCWJyZWFrOwogCX0KIAotCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlICVzXG4iLAotCQkgICAgICAgQUNQSV9DT05TVU1FUiA9PSBhZGRyZXNzMTZfZGF0YS0+cHJvZHVjZXJfY29uc3VtZXIgPwotCQkgICAgICAgIkNvbnN1bWVyIiA6ICJQcm9kdWNlciIpOworCS8qIERlY29kZSB0aGUgZ2VuZXJhbCBmbGFncyAqLwogCi0JYWNwaV9vc19wcmludGYoIiAgJXMgZGVjb2RlXG4iLAotCQkgICAgICAgQUNQSV9TVUJfREVDT0RFID09IGFkZHJlc3MxNl9kYXRhLT5kZWNvZGUgPwotCQkgICAgICAgIlN1YnRyYWN0aXZlIiA6ICJQb3NpdGl2ZSIpOwotCi0JYWNwaV9vc19wcmludGYoIiAgTWluIGFkZHJlc3MgaXMgJXMgZml4ZWRcbiIsCi0JCSAgICAgICBBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczE2X2RhdGEtPm1pbl9hZGRyZXNzX2ZpeGVkID8KLQkJICAgICAgICIiIDogIm5vdCIpOwotCi0JYWNwaV9vc19wcmludGYoIiAgTWF4IGFkZHJlc3MgaXMgJXMgZml4ZWRcbiIsCi0JCSAgICAgICBBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczE2X2RhdGEtPm1heF9hZGRyZXNzX2ZpeGVkID8KLQkJICAgICAgICIiIDogIm5vdCIpOwotCi0JYWNwaV9vc19wcmludGYoIiAgR3JhbnVsYXJpdHk6ICUwOFhcbiIsIGFkZHJlc3MxNl9kYXRhLT5ncmFudWxhcml0eSk7Ci0KLQlhY3BpX29zX3ByaW50ZigiICBBZGRyZXNzIHJhbmdlIG1pbjogJTA4WFxuIiwKLQkJICAgICAgIGFkZHJlc3MxNl9kYXRhLT5taW5fYWRkcmVzc19yYW5nZSk7Ci0KLQlhY3BpX29zX3ByaW50ZigiICBBZGRyZXNzIHJhbmdlIG1heDogJTA4WFxuIiwKLQkJICAgICAgIGFkZHJlc3MxNl9kYXRhLT5tYXhfYWRkcmVzc19yYW5nZSk7Ci0KLQlhY3BpX29zX3ByaW50ZigiICBBZGRyZXNzIHRyYW5zbGF0aW9uIG9mZnNldDogJTA4WFxuIiwKLQkJICAgICAgIGFkZHJlc3MxNl9kYXRhLT5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCk7Ci0KLQlhY3BpX29zX3ByaW50ZigiICBBZGRyZXNzIExlbmd0aDogJTA4WFxuIiwKLQkJICAgICAgIGFkZHJlc3MxNl9kYXRhLT5hZGRyZXNzX2xlbmd0aCk7Ci0KLQlpZiAoMHhGRiAhPSBhZGRyZXNzMTZfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KSB7Ci0JCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlIFNvdXJjZSBJbmRleDogJVhcbiIsCi0JCQkgICAgICAgYWRkcmVzczE2X2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCk7Ci0KLQkJYWNwaV9vc19wcmludGYoIiAgUmVzb3VyY2UgU291cmNlOiAlc1xuIiwKLQkJCSAgICAgICBhZGRyZXNzMTZfZGF0YS0+cmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOwotCX0KLQotCXJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX2FkZHJlc3MzMgotICoKLSAqIFBBUkFNRVRFUlM6ICBEYXRhICAgICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByZXNvdXJjZSBzdHJ1Y3R1cmUgdG8gZHVtcC4KLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBQcmludHMgb3V0IHRoZSB2YXJpb3VzIG1lbWJlcnMgb2YgdGhlIERhdGEgc3RydWN0dXJlIHR5cGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2FkZHJlc3MzMih1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpCi17Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyICphZGRyZXNzMzJfZGF0YSA9Ci0JICAgIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMzIgKilkYXRhOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JYWNwaV9vc19wcmludGYoIjMyLUJpdCBBZGRyZXNzIFNwYWNlIFJlc291cmNlXG4iKTsKLQotCXN3aXRjaCAoYWRkcmVzczMyX2RhdGEtPnJlc291cmNlX3R5cGUpIHsKLQljYXNlIEFDUElfTUVNT1JZX1JBTkdFOgotCi0JCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlIFR5cGU6IE1lbW9yeSBSYW5nZVxuIik7Ci0KLQkJc3dpdGNoIChhZGRyZXNzMzJfZGF0YS0+YXR0cmlidXRlLm1lbW9yeS5jYWNoZV9hdHRyaWJ1dGUpIHsKLQkJY2FzZSBBQ1BJX05PTl9DQUNIRUFCTEVfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYKLQkJCSAgICAoIiAgVHlwZSBTcGVjaWZpYzogTm9uY2FjaGVhYmxlIG1lbW9yeVxuIik7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfQ0FDSEFCTEVfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYoIiAgVHlwZSBTcGVjaWZpYzogQ2FjaGVhYmxlIG1lbW9yeVxuIik7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfV1JJVEVfQ09NQklOSU5HX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmCi0JCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IFdyaXRlLWNvbWJpbmluZyBtZW1vcnlcbiIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1BSRUZFVENIQUJMRV9NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZgotCQkJICAgICgiICBUeXBlIFNwZWNpZmljOiBQcmVmZXRjaGFibGUgbWVtb3J5XG4iKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlhY3BpX29zX3ByaW50ZgotCQkJICAgICgiICBUeXBlIFNwZWNpZmljOiBJbnZhbGlkIGNhY2hlIGF0dHJpYnV0ZVxuIik7Ci0JCQlicmVhazsKLQkJfQotCi0JCWFjcGlfb3NfcHJpbnRmKCIgIFR5cGUgU3BlY2lmaWM6IFJlYWQlc1xuIiwKLQkJCSAgICAgICBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09Ci0JCQkgICAgICAgYWRkcmVzczMyX2RhdGEtPmF0dHJpYnV0ZS5tZW1vcnkuCi0JCQkgICAgICAgcmVhZF93cml0ZV9hdHRyaWJ1dGUgPyAiL1dyaXRlIiA6ICIgT25seSIpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9JT19SQU5HRToKLQotCQlhY3BpX29zX3ByaW50ZigiICBSZXNvdXJjZSBUeXBlOiBJbyBSYW5nZVxuIik7Ci0KLQkJc3dpdGNoIChhZGRyZXNzMzJfZGF0YS0+YXR0cmlidXRlLmlvLnJhbmdlX2F0dHJpYnV0ZSkgewotCQljYXNlIEFDUElfTk9OX0lTQV9PTkxZX1JBTkdFUzoKLQkJCWFjcGlfb3NfcHJpbnRmCi0JCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IE5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9JU0FfT05MWV9SQU5HRVM6Ci0JCQlhY3BpX29zX3ByaW50ZigiICBUeXBlIFNwZWNpZmljOiBJU0EgSW8gQWRkcmVzc2VzXG4iKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9FTlRJUkVfUkFOR0U6Ci0JCQlhY3BpX29zX3ByaW50ZgotCQkJICAgICgiICBUeXBlIFNwZWNpZmljOiBJU0EgYW5kIG5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlhY3BpX29zX3ByaW50ZgotCQkJICAgICgiICBUeXBlIFNwZWNpZmljOiBJbnZhbGlkIFJhbmdlIGF0dHJpYnV0ZSIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlhY3BpX29zX3ByaW50ZigiICBUeXBlIFNwZWNpZmljOiAlcyBUcmFuc2xhdGlvblxuIiwKLQkJCSAgICAgICBBQ1BJX1NQQVJTRV9UUkFOU0xBVElPTiA9PQotCQkJICAgICAgIGFkZHJlc3MzMl9kYXRhLT5hdHRyaWJ1dGUuaW8uCi0JCQkgICAgICAgdHJhbnNsYXRpb25fYXR0cmlidXRlID8gIlNwYXJzZSIgOiAiRGVuc2UiKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfQlVTX05VTUJFUl9SQU5HRToKLQotCQlhY3BpX29zX3ByaW50ZigiICBSZXNvdXJjZSBUeXBlOiBCdXMgTnVtYmVyIFJhbmdlXG4iKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCi0JCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlIFR5cGU6IDB4JTIuMlhcbiIsCi0JCQkgICAgICAgYWRkcmVzczMyX2RhdGEtPnJlc291cmNlX3R5cGUpOwotCQlicmVhazsKLQl9Ci0KLQlhY3BpX29zX3ByaW50ZigiICBSZXNvdXJjZSAlc1xuIiwKLQkJICAgICAgIEFDUElfQ09OU1VNRVIgPT0gYWRkcmVzczMyX2RhdGEtPnByb2R1Y2VyX2NvbnN1bWVyID8KLQkJICAgICAgICJDb25zdW1lciIgOiAiUHJvZHVjZXIiKTsKLQotCWFjcGlfb3NfcHJpbnRmKCIgICVzIGRlY29kZVxuIiwKLQkJICAgICAgIEFDUElfU1VCX0RFQ09ERSA9PSBhZGRyZXNzMzJfZGF0YS0+ZGVjb2RlID8KLQkJICAgICAgICJTdWJ0cmFjdGl2ZSIgOiAiUG9zaXRpdmUiKTsKLQotCWFjcGlfb3NfcHJpbnRmKCIgIE1pbiBhZGRyZXNzIGlzICVzIGZpeGVkXG4iLAotCQkgICAgICAgQUNQSV9BRERSRVNTX0ZJWEVEID09IGFkZHJlc3MzMl9kYXRhLT5taW5fYWRkcmVzc19maXhlZCA/Ci0JCSAgICAgICAiIiA6ICJub3QgIik7Ci0KLQlhY3BpX29zX3ByaW50ZigiICBNYXggYWRkcmVzcyBpcyAlcyBmaXhlZFxuIiwKLQkJICAgICAgIEFDUElfQUREUkVTU19GSVhFRCA9PSBhZGRyZXNzMzJfZGF0YS0+bWF4X2FkZHJlc3NfZml4ZWQgPwotCQkgICAgICAgIiIgOiAibm90ICIpOwotCi0JYWNwaV9vc19wcmludGYoIiAgR3JhbnVsYXJpdHk6ICUwOFhcbiIsIGFkZHJlc3MzMl9kYXRhLT5ncmFudWxhcml0eSk7Ci0KLQlhY3BpX29zX3ByaW50ZigiICBBZGRyZXNzIHJhbmdlIG1pbjogJTA4WFxuIiwKLQkJICAgICAgIGFkZHJlc3MzMl9kYXRhLT5taW5fYWRkcmVzc19yYW5nZSk7Ci0KLQlhY3BpX29zX3ByaW50ZigiICBBZGRyZXNzIHJhbmdlIG1heDogJTA4WFxuIiwKLQkJICAgICAgIGFkZHJlc3MzMl9kYXRhLT5tYXhfYWRkcmVzc19yYW5nZSk7Ci0KLQlhY3BpX29zX3ByaW50ZigiICBBZGRyZXNzIHRyYW5zbGF0aW9uIG9mZnNldDogJTA4WFxuIiwKLQkJICAgICAgIGFkZHJlc3MzMl9kYXRhLT5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCk7Ci0KLQlhY3BpX29zX3ByaW50ZigiICBBZGRyZXNzIExlbmd0aDogJTA4WFxuIiwKLQkJICAgICAgIGFkZHJlc3MzMl9kYXRhLT5hZGRyZXNzX2xlbmd0aCk7Ci0KLQlpZiAoMHhGRiAhPSBhZGRyZXNzMzJfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KSB7Ci0JCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlIFNvdXJjZSBJbmRleDogJVhcbiIsCi0JCQkgICAgICAgYWRkcmVzczMyX2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCk7Ci0KLQkJYWNwaV9vc19wcmludGYoIiAgUmVzb3VyY2UgU291cmNlOiAlc1xuIiwKLQkJCSAgICAgICBhZGRyZXNzMzJfZGF0YS0+cmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOwotCX0KLQotCXJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX2FkZHJlc3M2NAotICoKLSAqIFBBUkFNRVRFUlM6ICBEYXRhICAgICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByZXNvdXJjZSBzdHJ1Y3R1cmUgdG8gZHVtcC4KLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBQcmludHMgb3V0IHRoZSB2YXJpb3VzIG1lbWJlcnMgb2YgdGhlIERhdGEgc3RydWN0dXJlIHR5cGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2FkZHJlc3M2NCh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpCi17Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0ICphZGRyZXNzNjRfZGF0YSA9Ci0JICAgIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQgKilkYXRhOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JYWNwaV9vc19wcmludGYoIjY0LUJpdCBBZGRyZXNzIFNwYWNlIFJlc291cmNlXG4iKTsKLQotCXN3aXRjaCAoYWRkcmVzczY0X2RhdGEtPnJlc291cmNlX3R5cGUpIHsKLQljYXNlIEFDUElfTUVNT1JZX1JBTkdFOgotCi0JCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlIFR5cGU6IE1lbW9yeSBSYW5nZVxuIik7Ci0KLQkJc3dpdGNoIChhZGRyZXNzNjRfZGF0YS0+YXR0cmlidXRlLm1lbW9yeS5jYWNoZV9hdHRyaWJ1dGUpIHsKLQkJY2FzZSBBQ1BJX05PTl9DQUNIRUFCTEVfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYKLQkJCSAgICAoIiAgVHlwZSBTcGVjaWZpYzogTm9uY2FjaGVhYmxlIG1lbW9yeVxuIik7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfQ0FDSEFCTEVfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYoIiAgVHlwZSBTcGVjaWZpYzogQ2FjaGVhYmxlIG1lbW9yeVxuIik7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfV1JJVEVfQ09NQklOSU5HX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmCi0JCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IFdyaXRlLWNvbWJpbmluZyBtZW1vcnlcbiIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1BSRUZFVENIQUJMRV9NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZgotCQkJICAgICgiICBUeXBlIFNwZWNpZmljOiBQcmVmZXRjaGFibGUgbWVtb3J5XG4iKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlhY3BpX29zX3ByaW50ZgotCQkJICAgICgiICBUeXBlIFNwZWNpZmljOiBJbnZhbGlkIGNhY2hlIGF0dHJpYnV0ZVxuIik7Ci0JCQlicmVhazsKLQkJfQotCi0JCWFjcGlfb3NfcHJpbnRmKCIgIFR5cGUgU3BlY2lmaWM6IFJlYWQlc1xuIiwKLQkJCSAgICAgICBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09Ci0JCQkgICAgICAgYWRkcmVzczY0X2RhdGEtPmF0dHJpYnV0ZS5tZW1vcnkuCi0JCQkgICAgICAgcmVhZF93cml0ZV9hdHRyaWJ1dGUgPyAiL1dyaXRlIiA6ICIgT25seSIpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9JT19SQU5HRToKLQotCQlhY3BpX29zX3ByaW50ZigiICBSZXNvdXJjZSBUeXBlOiBJbyBSYW5nZVxuIik7Ci0KLQkJc3dpdGNoIChhZGRyZXNzNjRfZGF0YS0+YXR0cmlidXRlLmlvLnJhbmdlX2F0dHJpYnV0ZSkgewotCQljYXNlIEFDUElfTk9OX0lTQV9PTkxZX1JBTkdFUzoKLQkJCWFjcGlfb3NfcHJpbnRmCi0JCQkgICAgKCIgIFR5cGUgU3BlY2lmaWM6IE5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9JU0FfT05MWV9SQU5HRVM6Ci0JCQlhY3BpX29zX3ByaW50ZigiICBUeXBlIFNwZWNpZmljOiBJU0EgSW8gQWRkcmVzc2VzXG4iKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9FTlRJUkVfUkFOR0U6Ci0JCQlhY3BpX29zX3ByaW50ZgotCQkJICAgICgiICBUeXBlIFNwZWNpZmljOiBJU0EgYW5kIG5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlhY3BpX29zX3ByaW50ZgotCQkJICAgICgiICBUeXBlIFNwZWNpZmljOiBJbnZhbGlkIFJhbmdlIGF0dHJpYnV0ZSIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlhY3BpX29zX3ByaW50ZigiICBUeXBlIFNwZWNpZmljOiAlcyBUcmFuc2xhdGlvblxuIiwKLQkJCSAgICAgICBBQ1BJX1NQQVJTRV9UUkFOU0xBVElPTiA9PQotCQkJICAgICAgIGFkZHJlc3M2NF9kYXRhLT5hdHRyaWJ1dGUuaW8uCi0JCQkgICAgICAgdHJhbnNsYXRpb25fYXR0cmlidXRlID8gIlNwYXJzZSIgOiAiRGVuc2UiKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfQlVTX05VTUJFUl9SQU5HRToKLQotCQlhY3BpX29zX3ByaW50ZigiICBSZXNvdXJjZSBUeXBlOiBCdXMgTnVtYmVyIFJhbmdlXG4iKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCi0JCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlIFR5cGU6IDB4JTIuMlhcbiIsCi0JCQkgICAgICAgYWRkcmVzczY0X2RhdGEtPnJlc291cmNlX3R5cGUpOwotCQlicmVhazsKLQl9Ci0KLQlhY3BpX29zX3ByaW50ZigiICBSZXNvdXJjZSAlc1xuIiwKLQkJICAgICAgIEFDUElfQ09OU1VNRVIgPT0gYWRkcmVzczY0X2RhdGEtPnByb2R1Y2VyX2NvbnN1bWVyID8KLQkJICAgICAgICJDb25zdW1lciIgOiAiUHJvZHVjZXIiKTsKLQotCWFjcGlfb3NfcHJpbnRmKCIgICVzIGRlY29kZVxuIiwKLQkJICAgICAgIEFDUElfU1VCX0RFQ09ERSA9PSBhZGRyZXNzNjRfZGF0YS0+ZGVjb2RlID8KLQkJICAgICAgICJTdWJ0cmFjdGl2ZSIgOiAiUG9zaXRpdmUiKTsKLQotCWFjcGlfb3NfcHJpbnRmKCIgIE1pbiBhZGRyZXNzIGlzICVzIGZpeGVkXG4iLAotCQkgICAgICAgQUNQSV9BRERSRVNTX0ZJWEVEID09IGFkZHJlc3M2NF9kYXRhLT5taW5fYWRkcmVzc19maXhlZCA/Ci0JCSAgICAgICAiIiA6ICJub3QgIik7Ci0KLQlhY3BpX29zX3ByaW50ZigiICBNYXggYWRkcmVzcyBpcyAlcyBmaXhlZFxuIiwKLQkJICAgICAgIEFDUElfQUREUkVTU19GSVhFRCA9PSBhZGRyZXNzNjRfZGF0YS0+bWF4X2FkZHJlc3NfZml4ZWQgPwotCQkgICAgICAgIiIgOiAibm90ICIpOwotCi0JYWNwaV9vc19wcmludGYoIiAgR3JhbnVsYXJpdHk6ICU4LjhYJTguOFhcbiIsCi0JCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzczY0X2RhdGEtPmdyYW51bGFyaXR5KSk7Ci0KLQlhY3BpX29zX3ByaW50ZigiICBBZGRyZXNzIHJhbmdlIG1pbjogJTguOFglOC44WFxuIiwKLQkJICAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzNjRfZGF0YS0+bWluX2FkZHJlc3NfcmFuZ2UpKTsKLQotCWFjcGlfb3NfcHJpbnRmKCIgIEFkZHJlc3MgcmFuZ2UgbWF4OiAlOC44WCU4LjhYXG4iLAotCQkgICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3M2NF9kYXRhLT5tYXhfYWRkcmVzc19yYW5nZSkpOwotCi0JYWNwaV9vc19wcmludGYoIiAgQWRkcmVzcyB0cmFuc2xhdGlvbiBvZmZzZXQ6ICU4LjhYJTguOFhcbiIsCi0JCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzczY0X2RhdGEtPgotCQkJCQkgIGFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0KSk7Ci0KLQlhY3BpX29zX3ByaW50ZigiICBBZGRyZXNzIExlbmd0aDogJTguOFglOC44WFxuIiwKLQkJICAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzNjRfZGF0YS0+YWRkcmVzc19sZW5ndGgpKTsKLQotCWFjcGlfb3NfcHJpbnRmKCIgIFR5cGUgU3BlY2lmaWMgQXR0cmlidXRlczogJTguOFglOC44WFxuIiwKLQkJICAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzNjRfZGF0YS0+Ci0JCQkJCSAgdHlwZV9zcGVjaWZpY19hdHRyaWJ1dGVzKSk7Ci0KLQlpZiAoMHhGRiAhPSBhZGRyZXNzNjRfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KSB7Ci0JCWFjcGlfb3NfcHJpbnRmKCIgIFJlc291cmNlIFNvdXJjZSBJbmRleDogJVhcbiIsCi0JCQkgICAgICAgYWRkcmVzczY0X2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCk7Ci0KLQkJYWNwaV9vc19wcmludGYoIiAgUmVzb3VyY2UgU291cmNlOiAlc1xuIiwKLQkJCSAgICAgICBhZGRyZXNzNjRfZGF0YS0+cmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOwotCX0KLQotCXJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX2V4dGVuZGVkX2lycQotICoKLSAqIFBBUkFNRVRFUlM6ICBEYXRhICAgICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByZXNvdXJjZSBzdHJ1Y3R1cmUgdG8gZHVtcC4KLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBQcmludHMgb3V0IHRoZSB2YXJpb3VzIG1lbWJlcnMgb2YgdGhlIERhdGEgc3RydWN0dXJlIHR5cGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2V4dGVuZGVkX2lycSh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKmRhdGEpCi17Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0X2lycSAqZXh0X2lycV9kYXRhID0KLQkgICAgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dF9pcnEgKilkYXRhOwotCXU4IGluZGV4ID0gMDsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCWFjcGlfb3NfcHJpbnRmKCJFeHRlbmRlZCBJUlEgUmVzb3VyY2VcbiIpOwotCi0JYWNwaV9vc19wcmludGYoIiAgUmVzb3VyY2UgJXNcbiIsCi0JCSAgICAgICBBQ1BJX0NPTlNVTUVSID09IGV4dF9pcnFfZGF0YS0+cHJvZHVjZXJfY29uc3VtZXIgPwotCQkgICAgICAgIkNvbnN1bWVyIiA6ICJQcm9kdWNlciIpOwotCi0JYWNwaV9vc19wcmludGYoIiAgJXNcbiIsCi0JCSAgICAgICBBQ1BJX0xFVkVMX1NFTlNJVElWRSA9PSBleHRfaXJxX2RhdGEtPmVkZ2VfbGV2ZWwgPwotCQkgICAgICAgIkxldmVsIiA6ICJFZGdlIik7Ci0KLQlhY3BpX29zX3ByaW50ZigiICBBY3RpdmUgJXNcbiIsCi0JCSAgICAgICBBQ1BJX0FDVElWRV9MT1cgPT0gZXh0X2lycV9kYXRhLT5hY3RpdmVfaGlnaF9sb3cgPwotCQkgICAgICAgImxvdyIgOiAiaGlnaCIpOwotCi0JYWNwaV9vc19wcmludGYoIiAgJXNcbiIsCi0JCSAgICAgICBBQ1BJX1NIQVJFRCA9PSBleHRfaXJxX2RhdGEtPnNoYXJlZF9leGNsdXNpdmUgPwotCQkgICAgICAgIlNoYXJlZCIgOiAiRXhjbHVzaXZlIik7Ci0KLQlhY3BpX29zX3ByaW50ZigiICBJbnRlcnJ1cHRzIDogJVggKCAiLAotCQkgICAgICAgZXh0X2lycV9kYXRhLT5udW1iZXJfb2ZfaW50ZXJydXB0cyk7Ci0KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBleHRfaXJxX2RhdGEtPm51bWJlcl9vZl9pbnRlcnJ1cHRzOyBpbmRleCsrKSB7Ci0JCWFjcGlfb3NfcHJpbnRmKCIlWCAiLCBleHRfaXJxX2RhdGEtPmludGVycnVwdHNbaW5kZXhdKTsKLQl9Ci0KLQlhY3BpX29zX3ByaW50ZigiKVxuIik7Ci0KLQlpZiAoMHhGRiAhPSBleHRfaXJxX2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCkgewotCQlhY3BpX29zX3ByaW50ZigiICBSZXNvdXJjZSBTb3VyY2UgSW5kZXg6ICVYIiwKLQkJCSAgICAgICBleHRfaXJxX2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCk7Ci0KLQkJYWNwaV9vc19wcmludGYoIiAgUmVzb3VyY2UgU291cmNlOiAlcyIsCi0JCQkgICAgICAgZXh0X2lycV9kYXRhLT5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7Ci0JfQotCi0JcmV0dXJuOworCWFjcGlfcnNfZHVtcF9kZXNjcmlwdG9yKHJlc291cmNlLCBhY3BpX3JzX2R1bXBfZ2VuZXJhbF9mbGFncyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9yZXNvdXJjZV9saXN0CiAgKgotICogUEFSQU1FVEVSUzogIFJlc291cmNlICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHJlc291cmNlIHN0cnVjdHVyZSB0byBkdW1wLgorICogUEFSQU1FVEVSUzogIHJlc291cmNlX2xpc3QgICAgICAgLSBQb2ludGVyIHRvIGEgcmVzb3VyY2UgZGVzY3JpcHRvciBsaXN0CiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKICAqCkBAIC05NjQsMTQ4ICs1OTQsMTcxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBhY3BpX3JzX2R1bXBfcmVzb3VyY2VfbGlzdChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UpCit2b2lkIGFjcGlfcnNfZHVtcF9yZXNvdXJjZV9saXN0KHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZV9saXN0KQogewotCXU4IGNvdW50ID0gMDsKLQl1OCBkb25lID0gRkFMU0U7CisJdTMyIGNvdW50ID0gMDsKKwl1MzIgdHlwZTsKIAogCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAotCWlmIChhY3BpX2RiZ19sZXZlbCAmIEFDUElfTFZfUkVTT1VSQ0VTICYmIF9DT01QT05FTlQgJiBhY3BpX2RiZ19sYXllcikgewotCQl3aGlsZSAoIWRvbmUpIHsKLQkJCWFjcGlfb3NfcHJpbnRmKCJSZXNvdXJjZSBzdHJ1Y3R1cmUgJVguXG4iLCBjb3VudCsrKTsKLQotCQkJc3dpdGNoIChyZXNvdXJjZS0+aWQpIHsKLQkJCWNhc2UgQUNQSV9SU1RZUEVfSVJROgotCQkJCWFjcGlfcnNfZHVtcF9pcnEoJnJlc291cmNlLT5kYXRhKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBQ1BJX1JTVFlQRV9ETUE6Ci0JCQkJYWNwaV9yc19kdW1wX2RtYSgmcmVzb3VyY2UtPmRhdGEpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFDUElfUlNUWVBFX1NUQVJUX0RQRjoKLQkJCQlhY3BpX3JzX2R1bXBfc3RhcnRfZGVwZW5kX2ZucygmcmVzb3VyY2UtPmRhdGEpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFDUElfUlNUWVBFX0VORF9EUEY6Ci0JCQkJYWNwaV9vc19wcmludGYKLQkJCQkgICAgKCJlbmRfZGVwZW5kZW50X2Z1bmN0aW9ucyBSZXNvdXJjZVxuIik7Ci0JCQkJLyogYWNwaV9yc19kdW1wX2VuZF9kZXBlbmRlbnRfZnVuY3Rpb25zIChSZXNvdXJjZS0+RGF0YSk7ICovCi0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQUNQSV9SU1RZUEVfSU86Ci0JCQkJYWNwaV9yc19kdW1wX2lvKCZyZXNvdXJjZS0+ZGF0YSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQUNQSV9SU1RZUEVfRklYRURfSU86Ci0JCQkJYWNwaV9yc19kdW1wX2ZpeGVkX2lvKCZyZXNvdXJjZS0+ZGF0YSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQUNQSV9SU1RZUEVfVkVORE9SOgotCQkJCWFjcGlfcnNfZHVtcF92ZW5kb3Jfc3BlY2lmaWMoJnJlc291cmNlLT5kYXRhKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBQ1BJX1JTVFlQRV9FTkRfVEFHOgotCQkJCS8qcnNfZHVtcF9lbmRfdGFnIChSZXNvdXJjZS0+RGF0YSk7ICovCi0JCQkJYWNwaV9vc19wcmludGYoImVuZF90YWcgUmVzb3VyY2VcbiIpOwotCQkJCWRvbmUgPSBUUlVFOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFDUElfUlNUWVBFX01FTTI0OgotCQkJCWFjcGlfcnNfZHVtcF9tZW1vcnkyNCgmcmVzb3VyY2UtPmRhdGEpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFDUElfUlNUWVBFX01FTTMyOgotCQkJCWFjcGlfcnNfZHVtcF9tZW1vcnkzMigmcmVzb3VyY2UtPmRhdGEpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFDUElfUlNUWVBFX0ZJWEVEX01FTTMyOgotCQkJCWFjcGlfcnNfZHVtcF9maXhlZF9tZW1vcnkzMigmcmVzb3VyY2UtPmRhdGEpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFDUElfUlNUWVBFX0FERFJFU1MxNjoKLQkJCQlhY3BpX3JzX2R1bXBfYWRkcmVzczE2KCZyZXNvdXJjZS0+ZGF0YSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQUNQSV9SU1RZUEVfQUREUkVTUzMyOgotCQkJCWFjcGlfcnNfZHVtcF9hZGRyZXNzMzIoJnJlc291cmNlLT5kYXRhKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBQ1BJX1JTVFlQRV9BRERSRVNTNjQ6Ci0JCQkJYWNwaV9yc19kdW1wX2FkZHJlc3M2NCgmcmVzb3VyY2UtPmRhdGEpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFDUElfUlNUWVBFX0VYVF9JUlE6Ci0JCQkJYWNwaV9yc19kdW1wX2V4dGVuZGVkX2lycSgmcmVzb3VyY2UtPmRhdGEpOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCWFjcGlfb3NfcHJpbnRmKCJJbnZhbGlkIHJlc291cmNlIHR5cGVcbiIpOwotCQkJCWJyZWFrOwotCi0JCQl9Ci0KLQkJCXJlc291cmNlID0KLQkJCSAgICBBQ1BJX1BUUl9BREQoc3RydWN0IGFjcGlfcmVzb3VyY2UsIHJlc291cmNlLAotCQkJCQkgcmVzb3VyY2UtPmxlbmd0aCk7Ci0JCX0KKwlpZiAoIShhY3BpX2RiZ19sZXZlbCAmIEFDUElfTFZfUkVTT1VSQ0VTKQorCSAgICB8fCAhKF9DT01QT05FTlQgJiBhY3BpX2RiZ19sYXllcikpIHsKKwkJcmV0dXJuOwogCX0KIAotCXJldHVybjsKKwkvKiBXYWxrIGxpc3QgYW5kIGR1bXAgYWxsIHJlc291cmNlIGRlc2NyaXB0b3JzIChFTkRfVEFHIHRlcm1pbmF0ZXMpICovCisKKwlkbyB7CisJCWFjcGlfb3NfcHJpbnRmKCJcblslMDJYXSAiLCBjb3VudCk7CisJCWNvdW50Kys7CisKKwkJLyogVmFsaWRhdGUgVHlwZSBiZWZvcmUgZGlzcGF0Y2ggKi8KKworCQl0eXBlID0gcmVzb3VyY2VfbGlzdC0+dHlwZTsKKwkJaWYgKHR5cGUgPiBBQ1BJX1JFU09VUkNFX1RZUEVfTUFYKSB7CisJCQlhY3BpX29zX3ByaW50ZgorCQkJICAgICgiSW52YWxpZCBkZXNjcmlwdG9yIHR5cGUgKCVYKSBpbiByZXNvdXJjZSBsaXN0XG4iLAorCQkJICAgICByZXNvdXJjZV9saXN0LT50eXBlKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIER1bXAgdGhlIHJlc291cmNlIGRlc2NyaXB0b3IgKi8KKworCQlhY3BpX3JzX2R1bXBfZGVzY3JpcHRvcigmcmVzb3VyY2VfbGlzdC0+ZGF0YSwKKwkJCQkJYWNwaV9nYmxfZHVtcF9yZXNvdXJjZV9kaXNwYXRjaFt0eXBlXSk7CisKKwkJLyogUG9pbnQgdG8gdGhlIG5leHQgcmVzb3VyY2Ugc3RydWN0dXJlICovCisKKwkJcmVzb3VyY2VfbGlzdCA9CisJCSAgICBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlfcmVzb3VyY2UsIHJlc291cmNlX2xpc3QsCisJCQkJIHJlc291cmNlX2xpc3QtPmxlbmd0aCk7CisKKwkJLyogRXhpdCB3aGVuIEVORF9UQUcgZGVzY3JpcHRvciBpcyByZWFjaGVkICovCisKKwl9IHdoaWxlICh0eXBlICE9IEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfVEFHKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX2lycV9saXN0CiAgKgotICogUEFSQU1FVEVSUzogIHJvdXRlX3RhYmxlICAgICAtIHBvaW50ZXIgdG8gdGhlIHJvdXRpbmcgdGFibGUgdG8gZHVtcC4KKyAqIFBBUkFNRVRFUlM6ICByb3V0ZV90YWJsZSAgICAgLSBQb2ludGVyIHRvIHRoZSByb3V0aW5nIHRhYmxlIHRvIGR1bXAuCiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKICAqCi0gKiBERVNDUklQVElPTjogRGlzcGF0Y2hlcyB0aGUgc3RydWN0dXJlcyB0byB0aGUgY29ycmVjdCBkdW1wIHJvdXRpbmUuCisgKiBERVNDUklQVElPTjogUHJpbnQgSVJRIHJvdXRpbmcgdGFibGUKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkIGFjcGlfcnNfZHVtcF9pcnFfbGlzdCh1OCAqIHJvdXRlX3RhYmxlKQogewotCXU4ICpidWZmZXIgPSByb3V0ZV90YWJsZTsKLQl1OCBjb3VudCA9IDA7Ci0JdTggZG9uZSA9IEZBTFNFOwogCXN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlICpwcnRfZWxlbWVudDsKKwl1OCBjb3VudDsKIAogCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAotCWlmIChhY3BpX2RiZ19sZXZlbCAmIEFDUElfTFZfUkVTT1VSQ0VTICYmIF9DT01QT05FTlQgJiBhY3BpX2RiZ19sYXllcikgewotCQlwcnRfZWxlbWVudCA9Ci0JCSAgICBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlLCBidWZmZXIpOwotCi0JCXdoaWxlICghZG9uZSkgewotCQkJYWNwaV9vc19wcmludGYoIlBDSSBJUlEgUm91dGluZyBUYWJsZSBzdHJ1Y3R1cmUgJVguXG4iLAotCQkJCSAgICAgICBjb3VudCsrKTsKLQotCQkJYWNwaV9vc19wcmludGYoIiAgQWRkcmVzczogJTguOFglOC44WFxuIiwKLQkJCQkgICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KHBydF9lbGVtZW50LT4KLQkJCQkJCQkgIGFkZHJlc3MpKTsKLQotCQkJYWNwaV9vc19wcmludGYoIiAgUGluOiAlWFxuIiwgcHJ0X2VsZW1lbnQtPnBpbik7Ci0KLQkJCWFjcGlfb3NfcHJpbnRmKCIgIFNvdXJjZTogJXNcbiIsIHBydF9lbGVtZW50LT5zb3VyY2UpOwotCi0JCQlhY3BpX29zX3ByaW50ZigiICBzb3VyY2VfaW5kZXg6ICVYXG4iLAotCQkJCSAgICAgICBwcnRfZWxlbWVudC0+c291cmNlX2luZGV4KTsKLQotCQkJYnVmZmVyICs9IHBydF9lbGVtZW50LT5sZW5ndGg7Ci0JCQlwcnRfZWxlbWVudCA9Ci0JCQkgICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSwKLQkJCQkJICBidWZmZXIpOwotCQkJaWYgKDAgPT0gcHJ0X2VsZW1lbnQtPmxlbmd0aCkgewotCQkJCWRvbmUgPSBUUlVFOwotCQkJfQotCQl9CisJaWYgKCEoYWNwaV9kYmdfbGV2ZWwgJiBBQ1BJX0xWX1JFU09VUkNFUykKKwkgICAgfHwgIShfQ09NUE9ORU5UICYgYWNwaV9kYmdfbGF5ZXIpKSB7CisJCXJldHVybjsKIAl9CiAKLQlyZXR1cm47CisJcHJ0X2VsZW1lbnQgPSBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlLCByb3V0ZV90YWJsZSk7CisKKwkvKiBEdW1wIGFsbCB0YWJsZSBlbGVtZW50cywgRXhpdCBvbiB6ZXJvIGxlbmd0aCBlbGVtZW50ICovCisKKwlmb3IgKGNvdW50ID0gMDsgcHJ0X2VsZW1lbnQtPmxlbmd0aDsgY291bnQrKykgeworCQlhY3BpX29zX3ByaW50ZigiXG5bJTAyWF0gUENJIElSUSBSb3V0aW5nIFRhYmxlIFBhY2thZ2VcbiIsCisJCQkgICAgICAgY291bnQpOworCQlhY3BpX3JzX2R1bXBfZGVzY3JpcHRvcihwcnRfZWxlbWVudCwgYWNwaV9yc19kdW1wX3BydCk7CisKKwkJcHJ0X2VsZW1lbnQgPSBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUsCisJCQkJCSAgIHBydF9lbGVtZW50LCBwcnRfZWxlbWVudC0+bGVuZ3RoKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfb3V0KgorICoKKyAqIFBBUkFNRVRFUlM6ICBUaXRsZSAgICAgICAtIE5hbWUgb2YgdGhlIHJlc291cmNlIGZpZWxkCisgKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgLSBWYWx1ZSBvZiB0aGUgcmVzb3VyY2UgZmllbGQKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBNaXNjZWxsYW5lb3VzIGhlbHBlciBmdW5jdGlvbnMgdG8gY29uc2lzdGVudGx5IGZvcm1hdCB0aGUKKyAqICAgICAgICAgICAgICBvdXRwdXQgb2YgdGhlIHJlc291cmNlIGR1bXAgcm91dGluZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBhY3BpX3JzX291dF9zdHJpbmcoY2hhciAqdGl0bGUsIGNoYXIgKnZhbHVlKQoreworCWFjcGlfb3NfcHJpbnRmKCIlMjdzIDogJXNcbiIsIHRpdGxlLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfcnNfb3V0X2ludGVnZXI4KGNoYXIgKnRpdGxlLCB1OCB2YWx1ZSkKK3sKKwlhY3BpX29zX3ByaW50ZigiJTI3cyA6ICUyLjJYXG4iLCB0aXRsZSwgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBhY3BpX3JzX291dF9pbnRlZ2VyMTYoY2hhciAqdGl0bGUsIHUxNiB2YWx1ZSkKK3sKKwlhY3BpX29zX3ByaW50ZigiJTI3cyA6ICU0LjRYXG4iLCB0aXRsZSwgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBhY3BpX3JzX291dF9pbnRlZ2VyMzIoY2hhciAqdGl0bGUsIHUzMiB2YWx1ZSkKK3sKKwlhY3BpX29zX3ByaW50ZigiJTI3cyA6ICU4LjhYXG4iLCB0aXRsZSwgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBhY3BpX3JzX291dF9pbnRlZ2VyNjQoY2hhciAqdGl0bGUsIHU2NCB2YWx1ZSkKK3sKKwlhY3BpX29zX3ByaW50ZigiJTI3cyA6ICU4LjhYJTguOFhcbiIsIHRpdGxlLCBBQ1BJX0ZPUk1BVF9VSU5UNjQodmFsdWUpKTsKK30KKworc3RhdGljIHZvaWQgYWNwaV9yc19vdXRfdGl0bGUoY2hhciAqdGl0bGUpCit7CisJYWNwaV9vc19wcmludGYoIiUyN3MgOiAiLCB0aXRsZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcCpMaXN0CisgKgorICogUEFSQU1FVEVSUzogIExlbmd0aCAgICAgIC0gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0CisgKiAgICAgICAgICAgICAgRGF0YSAgICAgICAgLSBTdGFydCBvZiB0aGUgbGlzdAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zIHRvIGR1bXAgbGlzdHMgb2YgcmF3IGRhdGEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfYnl0ZV9saXN0KHUxNiBsZW5ndGgsIHU4ICogZGF0YSkKK3sKKwl1OCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWFjcGlfb3NfcHJpbnRmKCIlMjVzJTIuMlggOiAlMi4yWFxuIiwgIkJ5dGUiLCBpLCBkYXRhW2ldKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9zaG9ydF9ieXRlX2xpc3QodTggbGVuZ3RoLCB1OCAqIGRhdGEpCit7CisJdTggaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlhY3BpX29zX3ByaW50ZigiJVggIiwgZGF0YVtpXSk7CisJfQorCWFjcGlfb3NfcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfZHdvcmRfbGlzdCh1OCBsZW5ndGgsIHUzMiAqIGRhdGEpCit7CisJdTggaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlhY3BpX29zX3ByaW50ZigiJTI1cyUyLjJYIDogJTguOFhcbiIsICJEd29yZCIsIGksIGRhdGFbaV0pOworCX0KIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzaW5mby5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWFlNjRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2luZm8uYwpAQCAtMCwwICsxLDIwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogcnNpbmZvIC0gRGlzcGF0Y2ggYW5kIEluZm8gdGFibGVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgPGFjcGkvYWNyZXNyYy5oPgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9SRVNPVVJDRVMKK0FDUElfTU9EVUxFX05BTUUoInJzaW5mbyIpCisKKy8qCisgKiBSZXNvdXJjZSBkaXNwYXRjaCBhbmQgaW5mb3JtYXRpb24gdGFibGVzLiBBbnkgbmV3IHJlc291cmNlIHR5cGVzIChlaXRoZXIKKyAqIExhcmdlIG9yIFNtYWxsKSBtdXN0IGJlIHJlZmxlY3RlZCBpbiBlYWNoIG9mIHRoZXNlIHRhYmxlcywgc28gdGhleSBhcmUgaGVyZQorICogaW4gb25lIHBsYWNlLgorICoKKyAqIFRoZSB0YWJsZXMgZm9yIExhcmdlIGRlc2NyaXB0b3JzIGFyZSBpbmRleGVkIGJ5IGJpdHMgNjowIG9mIHRoZSBBTUwKKyAqIGRlc2NyaXB0b3IgdHlwZSBieXRlLiBUaGUgdGFibGVzIGZvciBTbWFsbCBkZXNjcmlwdG9ycyBhcmUgaW5kZXhlZCBieQorICogYml0cyA2OjMgb2YgdGhlIGRlc2NyaXB0b3IgYnl0ZS4gVGhlIHRhYmxlcyBmb3IgaW50ZXJuYWwgcmVzb3VyY2UKKyAqIGRlc2NyaXB0b3JzIGFyZSBpbmRleGVkIGJ5IHRoZSBhY3BpX3Jlc291cmNlX3R5cGUgZmllbGQuCisgKi8KKy8qIERpc3BhdGNoIHRhYmxlIGZvciByZXNvdXJjZS10by1BTUwgKFNldCBSZXNvdXJjZSkgY29udmVyc2lvbiBmdW5jdGlvbnMgKi8KK3N0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvICphY3BpX2dibF9zZXRfcmVzb3VyY2VfZGlzcGF0Y2hbXSA9IHsKKwlhY3BpX3JzX3NldF9pcnEsCS8qIDB4MDAsIEFDUElfUkVTT1VSQ0VfVFlQRV9JUlEgKi8KKwlhY3BpX3JzX2NvbnZlcnRfZG1hLAkvKiAweDAxLCBBQ1BJX1JFU09VUkNFX1RZUEVfRE1BICovCisJYWNwaV9yc19zZXRfc3RhcnRfZHBmLAkvKiAweDAyLCBBQ1BJX1JFU09VUkNFX1RZUEVfU1RBUlRfREVQRU5ERU5UICovCisJYWNwaV9yc19jb252ZXJ0X2VuZF9kcGYsCS8qIDB4MDMsIEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfREVQRU5ERU5UICovCisJYWNwaV9yc19jb252ZXJ0X2lvLAkvKiAweDA0LCBBQ1BJX1JFU09VUkNFX1RZUEVfSU8gKi8KKwlhY3BpX3JzX2NvbnZlcnRfZml4ZWRfaW8sCS8qIDB4MDUsIEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9JTyAqLworCWFjcGlfcnNfc2V0X3ZlbmRvciwJLyogMHgwNiwgQUNQSV9SRVNPVVJDRV9UWVBFX1ZFTkRPUiAqLworCWFjcGlfcnNfY29udmVydF9lbmRfdGFnLAkvKiAweDA3LCBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX1RBRyAqLworCWFjcGlfcnNfY29udmVydF9tZW1vcnkyNCwJLyogMHgwOCwgQUNQSV9SRVNPVVJDRV9UWVBFX01FTU9SWTI0ICovCisJYWNwaV9yc19jb252ZXJ0X21lbW9yeTMyLAkvKiAweDA5LCBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMzIgKi8KKwlhY3BpX3JzX2NvbnZlcnRfZml4ZWRfbWVtb3J5MzIsCS8qIDB4MEEsIEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9NRU1PUlkzMiAqLworCWFjcGlfcnNfY29udmVydF9hZGRyZXNzMTYsCS8qIDB4MEIsIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMTYgKi8KKwlhY3BpX3JzX2NvbnZlcnRfYWRkcmVzczMyLAkvKiAweDBDLCBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzMyICovCisJYWNwaV9yc19jb252ZXJ0X2FkZHJlc3M2NCwJLyogMHgwRCwgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1M2NCAqLworCWFjcGlfcnNfY29udmVydF9leHRfYWRkcmVzczY0LAkvKiAweDBFLCBBQ1BJX1JFU09VUkNFX1RZUEVfRVhURU5ERURfQUREUkVTUzY0ICovCisJYWNwaV9yc19jb252ZXJ0X2V4dF9pcnEsCS8qIDB4MEYsIEFDUElfUkVTT1VSQ0VfVFlQRV9FWFRFTkRFRF9JUlEgKi8KKwlhY3BpX3JzX2NvbnZlcnRfZ2VuZXJpY19yZWcJLyogMHgxMCwgQUNQSV9SRVNPVVJDRV9UWVBFX0dFTkVSSUNfUkVHSVNURVIgKi8KK307CisKKy8qIERpc3BhdGNoIHRhYmxlcyBmb3IgQU1MLXRvLXJlc291cmNlIChHZXQgUmVzb3VyY2UpIGNvbnZlcnNpb24gZnVuY3Rpb25zICovCisKK3N0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvICphY3BpX2dibF9nZXRfcmVzb3VyY2VfZGlzcGF0Y2hbXSA9IHsKKwkvKiBTbWFsbCBkZXNjcmlwdG9ycyAqLworCisJTlVMTCwJCQkvKiAweDAwLCBSZXNlcnZlZCAqLworCU5VTEwsCQkJLyogMHgwMSwgUmVzZXJ2ZWQgKi8KKwlOVUxMLAkJCS8qIDB4MDIsIFJlc2VydmVkICovCisJTlVMTCwJCQkvKiAweDAzLCBSZXNlcnZlZCAqLworCWFjcGlfcnNfZ2V0X2lycSwJLyogMHgwNCwgQUNQSV9SRVNPVVJDRV9OQU1FX0lSUSAqLworCWFjcGlfcnNfY29udmVydF9kbWEsCS8qIDB4MDUsIEFDUElfUkVTT1VSQ0VfTkFNRV9ETUEgKi8KKwlhY3BpX3JzX2dldF9zdGFydF9kcGYsCS8qIDB4MDYsIEFDUElfUkVTT1VSQ0VfTkFNRV9TVEFSVF9ERVBFTkRFTlQgKi8KKwlhY3BpX3JzX2NvbnZlcnRfZW5kX2RwZiwJLyogMHgwNywgQUNQSV9SRVNPVVJDRV9OQU1FX0VORF9ERVBFTkRFTlQgKi8KKwlhY3BpX3JzX2NvbnZlcnRfaW8sCS8qIDB4MDgsIEFDUElfUkVTT1VSQ0VfTkFNRV9JTyAqLworCWFjcGlfcnNfY29udmVydF9maXhlZF9pbywJLyogMHgwOSwgQUNQSV9SRVNPVVJDRV9OQU1FX0ZJWEVEX0lPICovCisJTlVMTCwJCQkvKiAweDBBLCBSZXNlcnZlZCAqLworCU5VTEwsCQkJLyogMHgwQiwgUmVzZXJ2ZWQgKi8KKwlOVUxMLAkJCS8qIDB4MEMsIFJlc2VydmVkICovCisJTlVMTCwJCQkvKiAweDBELCBSZXNlcnZlZCAqLworCWFjcGlfcnNfZ2V0X3ZlbmRvcl9zbWFsbCwJLyogMHgwRSwgQUNQSV9SRVNPVVJDRV9OQU1FX1ZFTkRPUl9TTUFMTCAqLworCWFjcGlfcnNfY29udmVydF9lbmRfdGFnLAkvKiAweDBGLCBBQ1BJX1JFU09VUkNFX05BTUVfRU5EX1RBRyAqLworCisJLyogTGFyZ2UgZGVzY3JpcHRvcnMgKi8KKworCU5VTEwsCQkJLyogMHgwMCwgUmVzZXJ2ZWQgKi8KKwlhY3BpX3JzX2NvbnZlcnRfbWVtb3J5MjQsCS8qIDB4MDEsIEFDUElfUkVTT1VSQ0VfTkFNRV9NRU1PUlkyNCAqLworCWFjcGlfcnNfY29udmVydF9nZW5lcmljX3JlZywJLyogMHgwMiwgQUNQSV9SRVNPVVJDRV9OQU1FX0dFTkVSSUNfUkVHSVNURVIgKi8KKwlOVUxMLAkJCS8qIDB4MDMsIFJlc2VydmVkICovCisJYWNwaV9yc19nZXRfdmVuZG9yX2xhcmdlLAkvKiAweDA0LCBBQ1BJX1JFU09VUkNFX05BTUVfVkVORE9SX0xBUkdFICovCisJYWNwaV9yc19jb252ZXJ0X21lbW9yeTMyLAkvKiAweDA1LCBBQ1BJX1JFU09VUkNFX05BTUVfTUVNT1JZMzIgKi8KKwlhY3BpX3JzX2NvbnZlcnRfZml4ZWRfbWVtb3J5MzIsCS8qIDB4MDYsIEFDUElfUkVTT1VSQ0VfTkFNRV9GSVhFRF9NRU1PUlkzMiAqLworCWFjcGlfcnNfY29udmVydF9hZGRyZXNzMzIsCS8qIDB4MDcsIEFDUElfUkVTT1VSQ0VfTkFNRV9BRERSRVNTMzIgKi8KKwlhY3BpX3JzX2NvbnZlcnRfYWRkcmVzczE2LAkvKiAweDA4LCBBQ1BJX1JFU09VUkNFX05BTUVfQUREUkVTUzE2ICovCisJYWNwaV9yc19jb252ZXJ0X2V4dF9pcnEsCS8qIDB4MDksIEFDUElfUkVTT1VSQ0VfTkFNRV9FWFRFTkRFRF9JUlEgKi8KKwlhY3BpX3JzX2NvbnZlcnRfYWRkcmVzczY0LAkvKiAweDBBLCBBQ1BJX1JFU09VUkNFX05BTUVfQUREUkVTUzY0ICovCisJYWNwaV9yc19jb252ZXJ0X2V4dF9hZGRyZXNzNjQJLyogMHgwQiwgQUNQSV9SRVNPVVJDRV9OQU1FX0VYVEVOREVEX0FERFJFU1M2NCAqLworfTsKKworI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisjaWYgZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKQorCisvKiBEaXNwYXRjaCB0YWJsZSBmb3IgcmVzb3VyY2UgZHVtcCBmdW5jdGlvbnMgKi8KKworc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gKmFjcGlfZ2JsX2R1bXBfcmVzb3VyY2VfZGlzcGF0Y2hbXSA9IHsKKwlhY3BpX3JzX2R1bXBfaXJxLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfSVJRICovCisJYWNwaV9yc19kdW1wX2RtYSwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0RNQSAqLworCWFjcGlfcnNfZHVtcF9zdGFydF9kcGYsCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9TVEFSVF9ERVBFTkRFTlQgKi8KKwlhY3BpX3JzX2R1bXBfZW5kX2RwZiwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0VORF9ERVBFTkRFTlQgKi8KKwlhY3BpX3JzX2R1bXBfaW8sCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9JTyAqLworCWFjcGlfcnNfZHVtcF9maXhlZF9pbywJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0ZJWEVEX0lPICovCisJYWNwaV9yc19kdW1wX3ZlbmRvciwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX1ZFTkRPUiAqLworCWFjcGlfcnNfZHVtcF9lbmRfdGFnLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX1RBRyAqLworCWFjcGlfcnNfZHVtcF9tZW1vcnkyNCwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX01FTU9SWTI0ICovCisJYWNwaV9yc19kdW1wX21lbW9yeTMyLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMzIgKi8KKwlhY3BpX3JzX2R1bXBfZml4ZWRfbWVtb3J5MzIsCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9NRU1PUlkzMiAqLworCWFjcGlfcnNfZHVtcF9hZGRyZXNzMTYsCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMTYgKi8KKwlhY3BpX3JzX2R1bXBfYWRkcmVzczMyLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzMyICovCisJYWNwaV9yc19kdW1wX2FkZHJlc3M2NCwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1M2NCAqLworCWFjcGlfcnNfZHVtcF9leHRfYWRkcmVzczY0LAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfRVhURU5ERURfQUREUkVTUzY0ICovCisJYWNwaV9yc19kdW1wX2V4dF9pcnEsCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9FWFRFTkRFRF9JUlEgKi8KKwlhY3BpX3JzX2R1bXBfZ2VuZXJpY19yZWcsCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9HRU5FUklDX1JFR0lTVEVSICovCit9OworI2VuZGlmCisjZW5kaWYJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KKy8qCisgKiBCYXNlIHNpemVzIGZvciBleHRlcm5hbCBBTUwgcmVzb3VyY2UgZGVzY3JpcHRvcnMsIGluZGV4ZWQgYnkgaW50ZXJuYWwgdHlwZS4KKyAqIEluY2x1ZGVzIHNpemUgb2YgdGhlIGRlc2NyaXB0b3IgaGVhZGVyICgxIGJ5dGUgZm9yIHNtYWxsIGRlc2NyaXB0b3JzLAorICogMyBieXRlcyBmb3IgbGFyZ2UgZGVzY3JpcHRvcnMpCisgKi8KK2NvbnN0IHU4IGFjcGlfZ2JsX2FtbF9yZXNvdXJjZV9zaXplc1tdID0geworCXNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2lycSksCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9JUlEgKG9wdGlvbmFsIEJ5dGUgMyBhbHdheXMgY3JlYXRlZCkgKi8KKwlzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9kbWEpLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfRE1BICovCisJc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2Vfc3RhcnRfZGVwZW5kZW50KSwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX1NUQVJUX0RFUEVOREVOVCAob3B0aW9uYWwgQnl0ZSAxIGFsd2F5cyBjcmVhdGVkKSAqLworCXNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2VuZF9kZXBlbmRlbnQpLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX0RFUEVOREVOVCAqLworCXNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2lvKSwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0lPICovCisJc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfZml4ZWRfaW8pLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfRklYRURfSU8gKi8KKwlzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV92ZW5kb3Jfc21hbGwpLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfVkVORE9SICovCisJc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfZW5kX3RhZyksCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfVEFHICovCisJc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfbWVtb3J5MjQpLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMjQgKi8KKwlzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9tZW1vcnkzMiksCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkzMiAqLworCXNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2ZpeGVkX21lbW9yeTMyKSwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0ZJWEVEX01FTU9SWTMyICovCisJc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfYWRkcmVzczE2KSwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MxNiAqLworCXNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2FkZHJlc3MzMiksCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMzIgKi8KKwlzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9hZGRyZXNzNjQpLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzY0ICovCisJc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfZXh0ZW5kZWRfYWRkcmVzczY0KSwJLypBQ1BJX1JFU09VUkNFX1RZUEVfRVhURU5ERURfQUREUkVTUzY0ICovCisJc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfZXh0ZW5kZWRfaXJxKSwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0lSUSAqLworCXNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2dlbmVyaWNfcmVnaXN0ZXIpCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9HRU5FUklDX1JFR0lTVEVSICovCit9OworCitjb25zdCB1OCBhY3BpX2dibF9yZXNvdXJjZV9zdHJ1Y3Rfc2l6ZXNbXSA9IHsKKwkvKiBTbWFsbCBkZXNjcmlwdG9ycyAqLworCisJMCwKKwkwLAorCTAsCisJMCwKKwlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxKSwKKwlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfZG1hKSwKKwlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2Vfc3RhcnRfZGVwZW5kZW50KSwKKwlBQ1BJX1JTX1NJWkVfTUlOLAorCUFDUElfUlNfU0laRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbyksCisJQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvKSwKKwkwLAorCTAsCisJMCwKKwkwLAorCUFDUElfUlNfU0laRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IpLAorCUFDUElfUlNfU0laRV9NSU4sCisKKwkvKiBMYXJnZSBkZXNjcmlwdG9ycyAqLworCisJMCwKKwlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtb3J5MjQpLAorCUFDUElfUlNfU0laRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9nZW5lcmljX3JlZ2lzdGVyKSwKKwkwLAorCUFDUElfUlNfU0laRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IpLAorCUFDUElfUlNfU0laRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW1vcnkzMiksCisJQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX21lbW9yeTMyKSwKKwlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyKSwKKwlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2KSwKKwlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0ZW5kZWRfaXJxKSwKKwlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0KSwKKwlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0ZW5kZWRfYWRkcmVzczY0KQorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpby5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lvLmMKaW5kZXggZDUzYmJlOC4uZWE1NjcxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lvLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lvLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNDksNDI4ICs0OSwyMDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19pb19yZXNvdXJjZQotICoKLSAqIFBBUkFNRVRFUlM6ICBieXRlX3N0cmVhbV9idWZmZXIgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGlucHV0IGJ5dGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbQotICogICAgICAgICAgICAgIGJ5dGVzX2NvbnN1bWVkICAgICAgICAgIC0gUG9pbnRlciB0byB3aGVyZSB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lZCB0aGUgYnl0ZV9zdHJlYW1fYnVmZmVyIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZAotICogICAgICAgICAgICAgIG91dHB1dF9idWZmZXIgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmV0dXJuIGRhdGEgYnVmZmVyCi0gKiAgICAgICAgICAgICAgc3RydWN0dXJlX3NpemUgICAgICAgICAgLSBQb2ludGVyIHRvIHdoZXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByZXR1cm4gZGF0YSBzdHJ1Y3QgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRha2UgdGhlIHJlc291cmNlIGJ5dGUgc3RyZWFtIGFuZCBmaWxsIG91dCB0aGUgYXBwcm9wcmlhdGUKLSAqICAgICAgICAgICAgICBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSB0aGUgb3V0cHV0X2J1ZmZlci4gUmV0dXJuIHRoZQotICogICAgICAgICAgICAgIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBmcm9tIHRoZSBieXRlIHN0cmVhbS4KKyAqIGFjcGlfcnNfY29udmVydF9pbwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV9yc19pb19yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJICAgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAotCQkgICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpCi17Ci0JdTggKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopKm91dHB1dF9idWZmZXI7Ci0JdTE2IHRlbXAxNiA9IDA7Ci0JdTggdGVtcDggPSAwOwotCWFjcGlfc2l6ZSBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2lvKTsKK3N0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfY29udmVydF9pb1s1XSA9IHsKKwl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX0lPLAorCSBBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8pLAorCSBBQ1BJX1JTQ19UQUJMRV9TSVpFKGFjcGlfcnNfY29udmVydF9pbyl9LAogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfaW9fcmVzb3VyY2UiKTsKKwl7QUNQSV9SU0NfSU5JVFNFVCwgQUNQSV9SRVNPVVJDRV9OQU1FX0lPLAorCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9pbyksCisJIDB9LAogCi0JLyogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBhcmUgQ29uc3RhbnQgKi8KKwkvKiBEZWNvZGUgZmxhZyAqLwogCi0JKmJ5dGVzX2NvbnN1bWVkID0gODsKKwl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuaW8uaW9fZGVjb2RlKSwKKwkgQU1MX09GRlNFVChpby5mbGFncyksCisJIDB9LAorCS8qCisJICogVGhlc2UgZmllbGRzIGFyZSBjb250aWd1b3VzIGluIGJvdGggdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb246CisJICogQWRkcmVzcyBBbGlnbm1lbnQKKwkgKiBMZW5ndGgKKwkgKiBNaW5pbXVtIEJhc2UgQWRkcmVzcworCSAqIE1heGltdW0gQmFzZSBBZGRyZXNzCisJICovCisJe0FDUElfUlNDX01PVkU4LCBBQ1BJX1JTX09GRlNFVChkYXRhLmlvLmFsaWdubWVudCksCisJIEFNTF9PRkZTRVQoaW8uYWxpZ25tZW50KSwKKwkgMn0sCiAKLQlvdXRwdXRfc3RydWN0LT5pZCA9IEFDUElfUlNUWVBFX0lPOwotCi0JLyogQ2hlY2sgRGVjb2RlICovCi0KLQlidWZmZXIgKz0gMTsKLQl0ZW1wOCA9ICpidWZmZXI7Ci0KLQlvdXRwdXRfc3RydWN0LT5kYXRhLmlvLmlvX2RlY29kZSA9IHRlbXA4ICYgMHgwMTsKLQotCS8qIENoZWNrIG1pbl9iYXNlIEFkZHJlc3MgKi8KLQotCWJ1ZmZlciArPSAxOwotCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwotCi0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5pby5taW5fYmFzZV9hZGRyZXNzID0gdGVtcDE2OwotCi0JLyogQ2hlY2sgbWF4X2Jhc2UgQWRkcmVzcyAqLwotCi0JYnVmZmVyICs9IDI7Ci0JQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7Ci0KLQlvdXRwdXRfc3RydWN0LT5kYXRhLmlvLm1heF9iYXNlX2FkZHJlc3MgPSB0ZW1wMTY7Ci0KLQkvKiBDaGVjayBCYXNlIGFsaWdubWVudCAqLwotCi0JYnVmZmVyICs9IDI7Ci0JdGVtcDggPSAqYnVmZmVyOwotCi0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5pby5hbGlnbm1lbnQgPSB0ZW1wODsKLQotCS8qIENoZWNrIHJhbmdlX2xlbmd0aCAqLwotCi0JYnVmZmVyICs9IDE7Ci0JdGVtcDggPSAqYnVmZmVyOwotCi0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5pby5yYW5nZV9sZW5ndGggPSB0ZW1wODsKLQotCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLwotCi0Jb3V0cHV0X3N0cnVjdC0+bGVuZ3RoID0gKHUzMikgc3RydWN0X3NpemU7Ci0KLQkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLwotCi0JKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KKwl7QUNQSV9SU0NfTU9WRTE2LCBBQ1BJX1JTX09GRlNFVChkYXRhLmlvLm1pbmltdW0pLAorCSBBTUxfT0ZGU0VUKGlvLm1pbmltdW0pLAorCSAyfQorfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19maXhlZF9pb19yZXNvdXJjZQotICoKLSAqIFBBUkFNRVRFUlM6ICBieXRlX3N0cmVhbV9idWZmZXIgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGlucHV0IGJ5dGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbQotICogICAgICAgICAgICAgIGJ5dGVzX2NvbnN1bWVkICAgICAgICAgIC0gUG9pbnRlciB0byB3aGVyZSB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lZCB0aGUgYnl0ZV9zdHJlYW1fYnVmZmVyIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZAotICogICAgICAgICAgICAgIG91dHB1dF9idWZmZXIgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmV0dXJuIGRhdGEgYnVmZmVyCi0gKiAgICAgICAgICAgICAgc3RydWN0dXJlX3NpemUgICAgICAgICAgLSBQb2ludGVyIHRvIHdoZXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByZXR1cm4gZGF0YSBzdHJ1Y3QgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRha2UgdGhlIHJlc291cmNlIGJ5dGUgc3RyZWFtIGFuZCBmaWxsIG91dCB0aGUgYXBwcm9wcmlhdGUKLSAqICAgICAgICAgICAgICBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSB0aGUgb3V0cHV0X2J1ZmZlci4gUmV0dXJuIHRoZQotICogICAgICAgICAgICAgIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBmcm9tIHRoZSBieXRlIHN0cmVhbS4KKyAqIGFjcGlfcnNfY29udmVydF9maXhlZF9pbwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX3JzX2ZpeGVkX2lvX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkJICBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKLQkJCSAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpCi17Ci0JdTggKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopKm91dHB1dF9idWZmZXI7Ci0JdTE2IHRlbXAxNiA9IDA7Ci0JdTggdGVtcDggPSAwOwotCWFjcGlfc2l6ZSBzdHJ1Y3Rfc2l6ZSA9Ci0JICAgIEFDUElfU0laRU9GX1JFU09VUkNFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvKTsKK3N0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfY29udmVydF9maXhlZF9pb1s0XSA9IHsKKwl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX0ZJWEVEX0lPLAorCSBBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfaW8pLAorCSBBQ1BJX1JTQ19UQUJMRV9TSVpFKGFjcGlfcnNfY29udmVydF9maXhlZF9pbyl9LAogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZml4ZWRfaW9fcmVzb3VyY2UiKTsKKwl7QUNQSV9SU0NfSU5JVFNFVCwgQUNQSV9SRVNPVVJDRV9OQU1FX0ZJWEVEX0lPLAorCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9maXhlZF9pbyksCisJIDB9LAorCS8qCisJICogVGhlc2UgZmllbGRzIGFyZSBjb250aWd1b3VzIGluIGJvdGggdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb246CisJICogQmFzZSBBZGRyZXNzCisJICogTGVuZ3RoCisJICovCisJe0FDUElfUlNDX01PVkU4LCBBQ1BJX1JTX09GRlNFVChkYXRhLmZpeGVkX2lvLmFkZHJlc3NfbGVuZ3RoKSwKKwkgQU1MX09GRlNFVChmaXhlZF9pby5hZGRyZXNzX2xlbmd0aCksCisJIDF9LAogCi0JLyogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBhcmUgQ29uc3RhbnQgKi8KLQotCSpieXRlc19jb25zdW1lZCA9IDQ7Ci0KLQlvdXRwdXRfc3RydWN0LT5pZCA9IEFDUElfUlNUWVBFX0ZJWEVEX0lPOwotCi0JLyogQ2hlY2sgUmFuZ2UgQmFzZSBBZGRyZXNzICovCi0KLQlidWZmZXIgKz0gMTsKLQlBQ1BJX01PVkVfMTZfVE9fMTYoJnRlbXAxNiwgYnVmZmVyKTsKLQotCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZml4ZWRfaW8uYmFzZV9hZGRyZXNzID0gdGVtcDE2OwotCi0JLyogQ2hlY2sgcmFuZ2VfbGVuZ3RoICovCi0KLQlidWZmZXIgKz0gMjsKLQl0ZW1wOCA9ICpidWZmZXI7Ci0KLQlvdXRwdXRfc3RydWN0LT5kYXRhLmZpeGVkX2lvLnJhbmdlX2xlbmd0aCA9IHRlbXA4OwotCi0JLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCi0KLQlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKLQotCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCi0KLQkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQorCXtBQ1BJX1JTQ19NT1ZFMTYsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZml4ZWRfaW8uYWRkcmVzcyksCisJIEFNTF9PRkZTRVQoZml4ZWRfaW8uYWRkcmVzcyksCisJIDF9Cit9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2lvX3N0cmVhbQotICoKLSAqIFBBUkFNRVRFUlM6ICBsaW5rZWRfbGlzdCAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGxpbmtlZCBsaXN0Ci0gKiAgICAgICAgICAgICAgb3V0cHV0X2J1ZmZlciAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSB1c2VyJ3MgcmV0dXJuIGJ1ZmZlcgotICogICAgICAgICAgICAgIGJ5dGVzX2NvbnN1bWVkICAgICAgICAgIC0gUG9pbnRlciB0byB3aGVyZSB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHRoZSBvdXRwdXRfYnVmZmVyIGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBUYWtlIHRoZSBsaW5rZWQgbGlzdCByZXNvdXJjZSBzdHJ1Y3R1cmUgYW5kIGZpbGxzIGluIHRoZQotICogICAgICAgICAgICAgIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiBhIGJ5dGUgc3RyZWFtCisgKiBhY3BpX3JzX2NvbnZlcnRfZ2VuZXJpY19yZWcKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9yc19pb19zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAotCQkgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKQotewotCXU4ICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKLQl1MTYgdGVtcDE2ID0gMDsKLQl1OCB0ZW1wOCA9IDA7CitzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfZ2VuZXJpY19yZWdbNF0gPSB7CisJe0FDUElfUlNDX0lOSVRHRVQsIEFDUElfUkVTT1VSQ0VfVFlQRV9HRU5FUklDX1JFR0lTVEVSLAorCSBBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfZ2VuZXJpY19yZWdpc3RlciksCisJIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19jb252ZXJ0X2dlbmVyaWNfcmVnKX0sCiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19pb19zdHJlYW0iKTsKKwl7QUNQSV9SU0NfSU5JVFNFVCwgQUNQSV9SRVNPVVJDRV9OQU1FX0dFTkVSSUNfUkVHSVNURVIsCisJIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2dlbmVyaWNfcmVnaXN0ZXIpLAorCSAwfSwKKwkvKgorCSAqIFRoZXNlIGZpZWxkcyBhcmUgY29udGlndW91cyBpbiBib3RoIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uOgorCSAqIEFkZHJlc3MgU3BhY2UgSUQKKwkgKiBSZWdpc3RlciBCaXQgV2lkdGgKKwkgKiBSZWdpc3RlciBCaXQgT2Zmc2V0CisJICogQWNjZXNzIFNpemUKKwkgKi8KKwl7QUNQSV9SU0NfTU9WRTgsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZ2VuZXJpY19yZWcuc3BhY2VfaWQpLAorCSBBTUxfT0ZGU0VUKGdlbmVyaWNfcmVnLmFkZHJlc3Nfc3BhY2VfaWQpLAorCSA0fSwKIAotCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLworCS8qIEdldCB0aGUgUmVnaXN0ZXIgQWRkcmVzcyAqLwogCi0JKmJ1ZmZlciA9IDB4NDc7Ci0JYnVmZmVyICs9IDE7Ci0KLQkvKiBJbyBJbmZvcm1hdGlvbiBCeXRlICovCi0KLQl0ZW1wOCA9ICh1OCkgKGxpbmtlZF9saXN0LT5kYXRhLmlvLmlvX2RlY29kZSAmIDB4MDEpOwotCi0JKmJ1ZmZlciA9IHRlbXA4OwotCWJ1ZmZlciArPSAxOwotCi0JLyogU2V0IHRoZSBSYW5nZSBtaW5pbXVtIGJhc2UgYWRkcmVzcyAqLwotCi0JdGVtcDE2ID0gKHUxNikgbGlua2VkX2xpc3QtPmRhdGEuaW8ubWluX2Jhc2VfYWRkcmVzczsKLQotCUFDUElfTU9WRV8xNl9UT18xNihidWZmZXIsICZ0ZW1wMTYpOwotCWJ1ZmZlciArPSAyOwotCi0JLyogU2V0IHRoZSBSYW5nZSBtYXhpbXVtIGJhc2UgYWRkcmVzcyAqLwotCi0JdGVtcDE2ID0gKHUxNikgbGlua2VkX2xpc3QtPmRhdGEuaW8ubWF4X2Jhc2VfYWRkcmVzczsKLQotCUFDUElfTU9WRV8xNl9UT18xNihidWZmZXIsICZ0ZW1wMTYpOwotCWJ1ZmZlciArPSAyOwotCi0JLyogU2V0IHRoZSBiYXNlIGFsaWdubWVudCAqLwotCi0JdGVtcDggPSAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmlvLmFsaWdubWVudDsKLQotCSpidWZmZXIgPSB0ZW1wODsKLQlidWZmZXIgKz0gMTsKLQotCS8qIFNldCB0aGUgcmFuZ2UgbGVuZ3RoICovCi0KLQl0ZW1wOCA9ICh1OCkgbGlua2VkX2xpc3QtPmRhdGEuaW8ucmFuZ2VfbGVuZ3RoOwotCi0JKmJ1ZmZlciA9IHRlbXA4OwotCWJ1ZmZlciArPSAxOwotCi0JLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KLQotCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KKwl7QUNQSV9SU0NfTU9WRTY0LCBBQ1BJX1JTX09GRlNFVChkYXRhLmdlbmVyaWNfcmVnLmFkZHJlc3MpLAorCSBBTUxfT0ZGU0VUKGdlbmVyaWNfcmVnLmFkZHJlc3MpLAorCSAxfQorfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19maXhlZF9pb19zdHJlYW0KLSAqCi0gKiBQQVJBTUVURVJTOiAgbGlua2VkX2xpc3QgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXNvdXJjZSBsaW5rZWQgbGlzdAotICogICAgICAgICAgICAgIG91dHB1dF9idWZmZXIgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgdXNlcidzIHJldHVybiBidWZmZXIKLSAqICAgICAgICAgICAgICBieXRlc19jb25zdW1lZCAgICAgICAgICAtIFBvaW50ZXIgdG8gd2hlcmUgdGhlIG51bWJlciBvZiBieXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgb3V0cHV0X2J1ZmZlciBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGFrZSB0aGUgbGlua2VkIGxpc3QgcmVzb3VyY2Ugc3RydWN0dXJlIGFuZCBmaWxscyBpbiB0aGUKLSAqICAgICAgICAgICAgICB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gYSBieXRlIHN0cmVhbQorICogYWNwaV9yc19jb252ZXJ0X2VuZF9kcGYKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9yc19maXhlZF9pb19zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAotCQkJdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpCi17Ci0JdTggKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOwotCXUxNiB0ZW1wMTYgPSAwOwotCXU4IHRlbXA4ID0gMDsKK3N0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfY29udmVydF9lbmRfZHBmWzJdID0geworCXtBQ1BJX1JTQ19JTklUR0VULCBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX0RFUEVOREVOVCwKKwkgQUNQSV9SU19TSVpFX01JTiwKKwkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX2NvbnZlcnRfZW5kX2RwZil9LAogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZml4ZWRfaW9fc3RyZWFtIik7Ci0KLQkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KLQotCSpidWZmZXIgPSAweDRCOwotCi0JYnVmZmVyICs9IDE7Ci0KLQkvKiBTZXQgdGhlIFJhbmdlIGJhc2UgYWRkcmVzcyAqLwotCi0JdGVtcDE2ID0gKHUxNikgbGlua2VkX2xpc3QtPmRhdGEuZml4ZWRfaW8uYmFzZV9hZGRyZXNzOwotCi0JQUNQSV9NT1ZFXzE2X1RPXzE2KGJ1ZmZlciwgJnRlbXAxNik7Ci0JYnVmZmVyICs9IDI7Ci0KLQkvKiBTZXQgdGhlIHJhbmdlIGxlbmd0aCAqLwotCi0JdGVtcDggPSAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmZpeGVkX2lvLnJhbmdlX2xlbmd0aDsKLQotCSpidWZmZXIgPSB0ZW1wODsKLQlidWZmZXIgKz0gMTsKLQotCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCi0KLQkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19CisJe0FDUElfUlNDX0lOSVRTRVQsIEFDUElfUkVTT1VSQ0VfTkFNRV9FTkRfREVQRU5ERU5ULAorCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9lbmRfZGVwZW5kZW50KSwKKwkgMH0KK307CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZG1hX3Jlc291cmNlCi0gKgotICogUEFSQU1FVEVSUzogIGJ5dGVfc3RyZWFtX2J1ZmZlciAgICAgIC0gUG9pbnRlciB0byB0aGUgcmVzb3VyY2UgaW5wdXQgYnl0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtCi0gKiAgICAgICAgICAgICAgYnl0ZXNfY29uc3VtZWQgICAgICAgICAgLSBQb2ludGVyIHRvIHdoZXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVkIHRoZSBieXRlX3N0cmVhbV9idWZmZXIgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgb3V0cHV0X2J1ZmZlciAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXR1cm4gZGF0YSBidWZmZXIKLSAqICAgICAgICAgICAgICBzdHJ1Y3R1cmVfc2l6ZSAgICAgICAgICAtIFBvaW50ZXIgdG8gd2hlcmUgdGhlIG51bWJlciBvZiBieXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJldHVybiBkYXRhIHN0cnVjdCBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGFrZSB0aGUgcmVzb3VyY2UgYnl0ZSBzdHJlYW0gYW5kIGZpbGwgb3V0IHRoZSBhcHByb3ByaWF0ZQotICogICAgICAgICAgICAgIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IHRoZSBvdXRwdXRfYnVmZmVyLiBSZXR1cm4gdGhlCi0gKiAgICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGZyb20gdGhlIGJ5dGUgc3RyZWFtLgorICogYWNwaV9yc19jb252ZXJ0X2VuZF90YWcKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9yc19kbWFfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCi0JCSAgICAgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCi0JCSAgICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpCi17Ci0JdTggKmJ1ZmZlciA9IGJ5dGVfc3RyZWFtX2J1ZmZlcjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopKm91dHB1dF9idWZmZXI7Ci0JdTggdGVtcDggPSAwOwotCXU4IGluZGV4OwotCXU4IGk7Ci0JYWNwaV9zaXplIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfZG1hKTsKK3N0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfY29udmVydF9lbmRfdGFnWzJdID0geworCXtBQ1BJX1JTQ19JTklUR0VULCBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX1RBRywKKwkgQUNQSV9SU19TSVpFX01JTiwKKwkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX2NvbnZlcnRfZW5kX3RhZyl9LAogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZG1hX3Jlc291cmNlIik7Ci0KLQkvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGFyZSBDb25zdGFudCAqLwotCi0JKmJ5dGVzX2NvbnN1bWVkID0gMzsKLQlvdXRwdXRfc3RydWN0LT5pZCA9IEFDUElfUlNUWVBFX0RNQTsKLQotCS8qIFBvaW50IHRvIHRoZSA4LWJpdHMgb2YgQnl0ZSAxICovCi0KLQlidWZmZXIgKz0gMTsKLQl0ZW1wOCA9ICpidWZmZXI7Ci0KLQkvKiBEZWNvZGUgdGhlIERNQSBjaGFubmVsIGJpdHMgKi8KLQotCWZvciAoaSA9IDAsIGluZGV4ID0gMDsgaW5kZXggPCA4OyBpbmRleCsrKSB7Ci0JCWlmICgodGVtcDggPj4gaW5kZXgpICYgMHgwMSkgewotCQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5kbWEuY2hhbm5lbHNbaV0gPSBpbmRleDsKLQkJCWkrKzsKLQkJfQotCX0KLQotCS8qIFplcm8gRE1BIGNoYW5uZWxzIGlzIHZhbGlkICovCi0KLQlvdXRwdXRfc3RydWN0LT5kYXRhLmRtYS5udW1iZXJfb2ZfY2hhbm5lbHMgPSBpOwotCWlmIChpID4gMCkgewotCQkvKiBDYWxjdWxhdGUgdGhlIHN0cnVjdHVyZSBzaXplIGJhc2VkIHVwb24gdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzICovCi0KLQkJc3RydWN0X3NpemUgKz0gKChhY3BpX3NpemUpIGkgLSAxKSAqIDQ7Ci0JfQotCi0JLyogUG9pbnQgdG8gQnl0ZSAyICovCi0KLQlidWZmZXIgKz0gMTsKLQl0ZW1wOCA9ICpidWZmZXI7Ci0KLQkvKiBDaGVjayBmb3IgdHJhbnNmZXIgcHJlZmVyZW5jZSAoQml0c1sxOjBdKSAqLwotCi0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5kbWEudHJhbnNmZXIgPSB0ZW1wOCAmIDB4MDM7Ci0KLQlpZiAoMHgwMyA9PSBvdXRwdXRfc3RydWN0LT5kYXRhLmRtYS50cmFuc2ZlcikgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIkludmFsaWQgRE1BLlRyYW5zZmVyIHByZWZlcmVuY2UgKDMpXG4iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfREFUQSk7Ci0JfQotCi0JLyogR2V0IGJ1cyBtYXN0ZXIgcHJlZmVyZW5jZSAoQml0WzJdKSAqLwotCi0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5kbWEuYnVzX21hc3RlciA9ICh0ZW1wOCA+PiAyKSAmIDB4MDE7Ci0KLQkvKiBHZXQgY2hhbm5lbCBzcGVlZCBzdXBwb3J0IChCaXRzWzY6NV0pICovCi0KLQlvdXRwdXRfc3RydWN0LT5kYXRhLmRtYS50eXBlID0gKHRlbXA4ID4+IDUpICYgMHgwMzsKLQotCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLwotCi0Jb3V0cHV0X3N0cnVjdC0+bGVuZ3RoID0gKHUzMikgc3RydWN0X3NpemU7Ci0KLQkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLwotCi0JKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KKwkvKgorCSAqIE5vdGU6IFRoZSBjaGVja3N1bSBmaWVsZCBpcyBzZXQgdG8gemVybywgbWVhbmluZyB0aGF0IHRoZSByZXNvdXJjZQorCSAqIGRhdGEgaXMgdHJlYXRlZCBhcyBpZiB0aGUgY2hlY2tzdW0gb3BlcmF0aW9uIHN1Y2NlZWRlZC4KKwkgKiAoQUNQSSBTcGVjIDEuMGIgU2VjdGlvbiA2LjQuMi44KQorCSAqLworCXtBQ1BJX1JTQ19JTklUU0VULCBBQ1BJX1JFU09VUkNFX05BTUVfRU5EX1RBRywKKwkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfZW5kX3RhZyksCisJIDB9Cit9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2RtYV9zdHJlYW0KLSAqCi0gKiBQQVJBTUVURVJTOiAgbGlua2VkX2xpc3QgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXNvdXJjZSBsaW5rZWQgbGlzdAotICogICAgICAgICAgICAgIG91dHB1dF9idWZmZXIgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgdXNlcidzIHJldHVybiBidWZmZXIKLSAqICAgICAgICAgICAgICBieXRlc19jb25zdW1lZCAgICAgICAgICAtIFBvaW50ZXIgdG8gd2hlcmUgdGhlIG51bWJlciBvZiBieXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgb3V0cHV0X2J1ZmZlciBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGFrZSB0aGUgbGlua2VkIGxpc3QgcmVzb3VyY2Ugc3RydWN0dXJlIGFuZCBmaWxscyBpbiB0aGUKLSAqICAgICAgICAgICAgICB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gYSBieXRlIHN0cmVhbQorICogYWNwaV9yc19nZXRfc3RhcnRfZHBmCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfcnNfZG1hX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCi0JCSAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKQotewotCXU4ICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKLQl1MTYgdGVtcDE2ID0gMDsKLQl1OCB0ZW1wOCA9IDA7Ci0JdTggaW5kZXg7CitzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2dldF9zdGFydF9kcGZbNV0gPSB7CisJe0FDUElfUlNDX0lOSVRHRVQsIEFDUElfUkVTT1VSQ0VfVFlQRV9TVEFSVF9ERVBFTkRFTlQsCisJIEFDUElfUlNfU0laRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zdGFydF9kZXBlbmRlbnQpLAorCSBBQ1BJX1JTQ19UQUJMRV9TSVpFKGFjcGlfcnNfZ2V0X3N0YXJ0X2RwZil9LAogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZG1hX3N0cmVhbSIpOworCS8qIERlZmF1bHRzIGZvciBDb21wYXRpYmlsaXR5IGFuZCBQZXJmb3JtYW5jZSBwcmlvcml0aWVzICovCiAKLQkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KKwl7QUNQSV9SU0NfU0VUOCwgQUNQSV9SU19PRkZTRVQoZGF0YS5zdGFydF9kcGYuY29tcGF0aWJpbGl0eV9wcmlvcml0eSksCisJIEFDUElfQUNDRVBUQUJMRV9DT05GSUdVUkFUSU9OLAorCSAyfSwKIAotCSpidWZmZXIgPSAweDJBOwotCWJ1ZmZlciArPSAxOwotCXRlbXA4ID0gMDsKKwkvKiBBbGwgZG9uZSBpZiB0aGVyZSBpcyBubyBmbGFnIGJ5dGUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvciAqLwogCi0JLyogTG9vcCB0aHJvdWdoIGFsbCBvZiB0aGUgQ2hhbm5lbHMgYW5kIHNldCB0aGUgbWFzayBiaXRzICovCisJe0FDUElfUlNDX0VYSVRfTkUsIEFDUElfUlNDX0NPTVBBUkVfQU1MX0xFTkdUSCwgMCwgMX0sCiAKLQlmb3IgKGluZGV4ID0gMDsKLQkgICAgIGluZGV4IDwgbGlua2VkX2xpc3QtPmRhdGEuZG1hLm51bWJlcl9vZl9jaGFubmVsczsgaW5kZXgrKykgewotCQl0ZW1wMTYgPSAodTE2KSBsaW5rZWRfbGlzdC0+ZGF0YS5kbWEuY2hhbm5lbHNbaW5kZXhdOwotCQl0ZW1wOCB8PSAweDEgPDwgdGVtcDE2OwotCX0KKwkvKiBGbGFnIGJ5dGUgaXMgcHJlc2VudCwgZ2V0IHRoZSBmbGFncyAqLwogCi0JKmJ1ZmZlciA9IHRlbXA4OwotCWJ1ZmZlciArPSAxOworCXtBQ1BJX1JTQ18yQklURkxBRywKKwkgQUNQSV9SU19PRkZTRVQoZGF0YS5zdGFydF9kcGYuY29tcGF0aWJpbGl0eV9wcmlvcml0eSksCisJIEFNTF9PRkZTRVQoc3RhcnRfZHBmLmZsYWdzKSwKKwkgMH0sCiAKLQkvKiBTZXQgdGhlIERNQSBJbmZvICovCisJe0FDUElfUlNDXzJCSVRGTEFHLAorCSBBQ1BJX1JTX09GRlNFVChkYXRhLnN0YXJ0X2RwZi5wZXJmb3JtYW5jZV9yb2J1c3RuZXNzKSwKKwkgQU1MX09GRlNFVChzdGFydF9kcGYuZmxhZ3MpLAorCSAyfQorfTsKIAotCXRlbXA4ID0gKHU4KSAoKGxpbmtlZF9saXN0LT5kYXRhLmRtYS50eXBlICYgMHgwMykgPDwgNSk7Ci0JdGVtcDggfD0gKChsaW5rZWRfbGlzdC0+ZGF0YS5kbWEuYnVzX21hc3RlciAmIDB4MDEpIDw8IDIpOwotCXRlbXA4IHw9IChsaW5rZWRfbGlzdC0+ZGF0YS5kbWEudHJhbnNmZXIgJiAweDAzKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogYWNwaV9yc19zZXRfc3RhcnRfZHBmCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCSpidWZmZXIgPSB0ZW1wODsKLQlidWZmZXIgKz0gMTsKK3N0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfc2V0X3N0YXJ0X2RwZls2XSA9IHsKKwl7QUNQSV9SU0NfSU5JVFNFVCwgQUNQSV9SRVNPVVJDRV9OQU1FX1NUQVJUX0RFUEVOREVOVCwKKwkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2Vfc3RhcnRfZGVwZW5kZW50KSwKKwkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX3NldF9zdGFydF9kcGYpfSwKIAotCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCisJLyogU2V0IHRoZSBkZWZhdWx0IGZsYWcgdmFsdWVzICovCiAKLQkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19CisJe0FDUElfUlNDXzJCSVRGTEFHLAorCSBBQ1BJX1JTX09GRlNFVChkYXRhLnN0YXJ0X2RwZi5jb21wYXRpYmlsaXR5X3ByaW9yaXR5KSwKKwkgQU1MX09GRlNFVChzdGFydF9kcGYuZmxhZ3MpLAorCSAwfSwKKworCXtBQ1BJX1JTQ18yQklURkxBRywKKwkgQUNQSV9SU19PRkZTRVQoZGF0YS5zdGFydF9kcGYucGVyZm9ybWFuY2Vfcm9idXN0bmVzcyksCisJIEFNTF9PRkZTRVQoc3RhcnRfZHBmLmZsYWdzKSwKKwkgMn0sCisJLyoKKwkgKiBBbGwgZG9uZSBpZiBmbGFncyBieXRlIGlzIG5lY2Vzc2FyeSAtLSBpZiBlaXRoZXIgcHJpb3JpdHkgdmFsdWUKKwkgKiBpcyBub3QgQUNQSV9BQ0NFUFRBQkxFX0NPTkZJR1VSQVRJT04KKwkgKi8KKwl7QUNQSV9SU0NfRVhJVF9ORSwgQUNQSV9SU0NfQ09NUEFSRV9WQUxVRSwKKwkgQUNQSV9SU19PRkZTRVQoZGF0YS5zdGFydF9kcGYuY29tcGF0aWJpbGl0eV9wcmlvcml0eSksCisJIEFDUElfQUNDRVBUQUJMRV9DT05GSUdVUkFUSU9OfSwKKworCXtBQ1BJX1JTQ19FWElUX05FLCBBQ1BJX1JTQ19DT01QQVJFX1ZBTFVFLAorCSBBQ1BJX1JTX09GRlNFVChkYXRhLnN0YXJ0X2RwZi5wZXJmb3JtYW5jZV9yb2J1c3RuZXNzKSwKKwkgQUNQSV9BQ0NFUFRBQkxFX0NPTkZJR1VSQVRJT059LAorCisJLyogRmxhZyBieXRlIGlzIG5vdCBuZWNlc3NhcnkgKi8KKworCXtBQ1BJX1JTQ19MRU5HVEgsIDAsIDAsCisJIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX3N0YXJ0X2RlcGVuZGVudF9ub3ByaW8pfQorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpcnEuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpcnEuYwppbmRleCA1NjA0M2ZlLi4xZmE2M2JjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzaXJxLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lycS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTQ5LDUwNCArNDksMTgyIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfaXJxX3Jlc291cmNlCi0gKgotICogUEFSQU1FVEVSUzogIGJ5dGVfc3RyZWFtX2J1ZmZlciAgICAgIC0gUG9pbnRlciB0byB0aGUgcmVzb3VyY2UgaW5wdXQgYnl0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtCi0gKiAgICAgICAgICAgICAgYnl0ZXNfY29uc3VtZWQgICAgICAgICAgLSBQb2ludGVyIHRvIHdoZXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVkIHRoZSBieXRlX3N0cmVhbV9idWZmZXIgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgb3V0cHV0X2J1ZmZlciAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXR1cm4gZGF0YSBidWZmZXIKLSAqICAgICAgICAgICAgICBzdHJ1Y3R1cmVfc2l6ZSAgICAgICAgICAtIFBvaW50ZXIgdG8gd2hlcmUgdGhlIG51bWJlciBvZiBieXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJldHVybiBkYXRhIHN0cnVjdCBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGFrZSB0aGUgcmVzb3VyY2UgYnl0ZSBzdHJlYW0gYW5kIGZpbGwgb3V0IHRoZSBhcHByb3ByaWF0ZQotICogICAgICAgICAgICAgIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IHRoZSBvdXRwdXRfYnVmZmVyLiBSZXR1cm4gdGhlCi0gKiAgICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGZyb20gdGhlIGJ5dGUgc3RyZWFtLgorICogYWNwaV9yc19nZXRfaXJxCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzCi1hY3BpX3JzX2lycV9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJICAgICBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKLQkJICAgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSkKLXsKLQl1OCAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikqb3V0cHV0X2J1ZmZlcjsKLQl1MTYgdGVtcDE2ID0gMDsKLQl1OCB0ZW1wOCA9IDA7Ci0JdTggaW5kZXg7Ci0JdTggaTsKLQlhY3BpX3NpemUgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEpOworc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19nZXRfaXJxWzddID0geworCXtBQ1BJX1JTQ19JTklUR0VULCBBQ1BJX1JFU09VUkNFX1RZUEVfSVJRLAorCSBBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxKSwKKwkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX2dldF9pcnEpfSwKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2lycV9yZXNvdXJjZSIpOworCS8qIEdldCB0aGUgSVJRIG1hc2sgKGJ5dGVzIDE6MikgKi8KIAotCS8qCi0JICogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBhcmUgY29udGFpbmVkIGluIHRoZSBkZXNjcmlwdG9yCi0JICogKEJpdHM6MC0xKQotCSAqLwotCXRlbXA4ID0gKmJ1ZmZlcjsKLQkqYnl0ZXNfY29uc3VtZWQgPSAodGVtcDggJiAweDAzKSArIDE7Ci0Jb3V0cHV0X3N0cnVjdC0+aWQgPSBBQ1BJX1JTVFlQRV9JUlE7CisJe0FDUElfUlNDX0JJVE1BU0sxNiwgQUNQSV9SU19PRkZTRVQoZGF0YS5pcnEuaW50ZXJydXB0c1swXSksCisJIEFNTF9PRkZTRVQoaXJxLmlycV9tYXNrKSwKKwkgQUNQSV9SU19PRkZTRVQoZGF0YS5pcnEuaW50ZXJydXB0X2NvdW50KX0sCiAKLQkvKiBQb2ludCB0byB0aGUgMTYtYml0cyBvZiBCeXRlcyAxIGFuZCAyICovCisJLyogU2V0IGRlZmF1bHQgZmxhZ3MgKG90aGVycyBhcmUgemVybykgKi8KIAotCWJ1ZmZlciArPSAxOwotCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOworCXtBQ1BJX1JTQ19TRVQ4LCBBQ1BJX1JTX09GRlNFVChkYXRhLmlycS50cmlnZ2VyaW5nKSwKKwkgQUNQSV9FREdFX1NFTlNJVElWRSwKKwkgMX0sCiAKLQlvdXRwdXRfc3RydWN0LT5kYXRhLmlycS5udW1iZXJfb2ZfaW50ZXJydXB0cyA9IDA7CisJLyogQWxsIGRvbmUgaWYgbm8gZmxhZyBieXRlIHByZXNlbnQgaW4gZGVzY3JpcHRvciAqLwogCi0JLyogRGVjb2RlIHRoZSBJUlEgYml0cyAqLworCXtBQ1BJX1JTQ19FWElUX05FLCBBQ1BJX1JTQ19DT01QQVJFX0FNTF9MRU5HVEgsIDAsIDN9LAogCi0JZm9yIChpID0gMCwgaW5kZXggPSAwOyBpbmRleCA8IDE2OyBpbmRleCsrKSB7Ci0JCWlmICgodGVtcDE2ID4+IGluZGV4KSAmIDB4MDEpIHsKLQkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaXJxLmludGVycnVwdHNbaV0gPSBpbmRleDsKLQkJCWkrKzsKLQkJfQotCX0KKwkvKiBHZXQgZmxhZ3M6IFRyaWdnZXJpbmdbMF0sIFBvbGFyaXR5WzNdLCBTaGFyaW5nWzRdICovCiAKLQkvKiBaZXJvIGludGVycnVwdHMgaXMgdmFsaWQgKi8KKwl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuaXJxLnRyaWdnZXJpbmcpLAorCSBBTUxfT0ZGU0VUKGlycS5mbGFncyksCisJIDB9LAogCi0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5pcnEubnVtYmVyX29mX2ludGVycnVwdHMgPSBpOwotCWlmIChpID4gMCkgewotCQkvKiBDYWxjdWxhdGUgdGhlIHN0cnVjdHVyZSBzaXplIGJhc2VkIHVwb24gdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzICovCisJe0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmlycS5wb2xhcml0eSksCisJIEFNTF9PRkZTRVQoaXJxLmZsYWdzKSwKKwkgM30sCiAKLQkJc3RydWN0X3NpemUgKz0gKChhY3BpX3NpemUpIGkgLSAxKSAqIDQ7Ci0JfQotCi0JLyogUG9pbnQgdG8gQnl0ZSAzIGlmIGl0IGlzIHVzZWQgKi8KLQotCWlmICg0ID09ICpieXRlc19jb25zdW1lZCkgewotCQlidWZmZXIgKz0gMjsKLQkJdGVtcDggPSAqYnVmZmVyOwotCi0JCS8qIENoZWNrIGZvciBIRSwgTEwgaW50ZXJydXB0cyAqLwotCi0JCXN3aXRjaCAodGVtcDggJiAweDA5KSB7Ci0JCWNhc2UgMHgwMToJLyogSEUgKi8KLQkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaXJxLmVkZ2VfbGV2ZWwgPQotCQkJICAgIEFDUElfRURHRV9TRU5TSVRJVkU7Ci0JCQlvdXRwdXRfc3RydWN0LT5kYXRhLmlycS5hY3RpdmVfaGlnaF9sb3cgPQotCQkJICAgIEFDUElfQUNUSVZFX0hJR0g7Ci0JCQlicmVhazsKLQotCQljYXNlIDB4MDg6CS8qIExMICovCi0JCQlvdXRwdXRfc3RydWN0LT5kYXRhLmlycS5lZGdlX2xldmVsID0KLQkJCSAgICBBQ1BJX0xFVkVMX1NFTlNJVElWRTsKLQkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaXJxLmFjdGl2ZV9oaWdoX2xvdyA9Ci0JCQkgICAgQUNQSV9BQ1RJVkVfTE9XOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCS8qCi0JCQkgKiBPbmx5IF9MTCBhbmQgX0hFIHBvbGFyaXR5L3RyaWdnZXIgaW50ZXJydXB0cwotCQkJICogYXJlIGFsbG93ZWQgKEFDUEkgc3BlYywgc2VjdGlvbiAiSVJRIEZvcm1hdCIpCi0JCQkgKiBzbyAweDAwIGFuZCAweDA5IGFyZSBpbGxlZ2FsLgotCQkJICovCi0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJJbnZhbGlkIGludGVycnVwdCBwb2xhcml0eS90cmlnZ2VyIGluIHJlc291cmNlIGxpc3QsICVYXG4iLAotCQkJCQkgIHRlbXA4KSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOwotCQl9Ci0KLQkJLyogQ2hlY2sgZm9yIHNoYXJhYmxlICovCi0KLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5pcnEuc2hhcmVkX2V4Y2x1c2l2ZSA9ICh0ZW1wOCA+PiAzKSAmIDB4MDE7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogQXNzdW1lIEVkZ2UgU2Vuc2l0aXZlLCBBY3RpdmUgSGlnaCwgTm9uLVNoYXJhYmxlCi0JCSAqIHBlciBBQ1BJIFNwZWNpZmljYXRpb24KLQkJICovCi0JCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaXJxLmVkZ2VfbGV2ZWwgPSBBQ1BJX0VER0VfU0VOU0lUSVZFOwotCQlvdXRwdXRfc3RydWN0LT5kYXRhLmlycS5hY3RpdmVfaGlnaF9sb3cgPSBBQ1BJX0FDVElWRV9ISUdIOwotCQlvdXRwdXRfc3RydWN0LT5kYXRhLmlycS5zaGFyZWRfZXhjbHVzaXZlID0gQUNQSV9FWENMVVNJVkU7Ci0JfQotCi0JLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCi0KLQlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKLQotCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCi0KLQkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQorCXtBQ1BJX1JTQ18xQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5pcnEuc2hhcmFibGUpLAorCSBBTUxfT0ZGU0VUKGlycS5mbGFncyksCisJIDR9Cit9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2lycV9zdHJlYW0KLSAqCi0gKiBQQVJBTUVURVJTOiAgbGlua2VkX2xpc3QgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXNvdXJjZSBsaW5rZWQgbGlzdAotICogICAgICAgICAgICAgIG91dHB1dF9idWZmZXIgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgdXNlcidzIHJldHVybiBidWZmZXIKLSAqICAgICAgICAgICAgICBieXRlc19jb25zdW1lZCAgICAgICAgICAtIFBvaW50ZXIgdG8gd2hlcmUgdGhlIG51bWJlciBvZiBieXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgb3V0cHV0X2J1ZmZlciBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGFrZSB0aGUgbGlua2VkIGxpc3QgcmVzb3VyY2Ugc3RydWN0dXJlIGFuZCBmaWxscyBpbiB0aGUKLSAqICAgICAgICAgICAgICB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gYSBieXRlIHN0cmVhbQorICogYWNwaV9yc19zZXRfaXJxCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfcnNfaXJxX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCi0JCSAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKQotewotCXU4ICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKLQl1MTYgdGVtcDE2ID0gMDsKLQl1OCB0ZW1wOCA9IDA7Ci0JdTggaW5kZXg7Ci0JdTggSVJxaW5mb19ieXRlX25lZWRlZDsKK3N0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfc2V0X2lycVs5XSA9IHsKKwl7QUNQSV9SU0NfSU5JVFNFVCwgQUNQSV9SRVNPVVJDRV9OQU1FX0lSUSwKKwkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfaXJxKSwKKwkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX3NldF9pcnEpfSwKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2lycV9zdHJlYW0iKTsKKwkvKiBDb252ZXJ0IGludGVycnVwdCBsaXN0IHRvIDE2LWJpdCBJUlEgYml0bWFzayAqLwogCisJe0FDUElfUlNDX0JJVE1BU0sxNiwgQUNQSV9SU19PRkZTRVQoZGF0YS5pcnEuaW50ZXJydXB0c1swXSksCisJIEFNTF9PRkZTRVQoaXJxLmlycV9tYXNrKSwKKwkgQUNQSV9SU19PRkZTRVQoZGF0YS5pcnEuaW50ZXJydXB0X2NvdW50KX0sCisKKwkvKiBTZXQgdGhlIGZsYWdzIGJ5dGUgYnkgZGVmYXVsdCAqLworCisJe0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmlycS50cmlnZ2VyaW5nKSwKKwkgQU1MX09GRlNFVChpcnEuZmxhZ3MpLAorCSAwfSwKKworCXtBQ1BJX1JTQ18xQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5pcnEucG9sYXJpdHkpLAorCSBBTUxfT0ZGU0VUKGlycS5mbGFncyksCisJIDN9LAorCisJe0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmlycS5zaGFyYWJsZSksCisJIEFNTF9PRkZTRVQoaXJxLmZsYWdzKSwKKwkgNH0sCiAJLyoKLQkgKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzZXQgYmFzZWQgdXBvbiB3aGV0aGVyIGEgdGhpcmQgYnl0ZSBpcwotCSAqIG5lZWRlZCB0byBjb250YWluIHRoZSBJUlEgSW5mb3JtYXRpb24uCisJICogQ2hlY2sgaWYgdGhlIGZsYWdzIGJ5dGUgaXMgbmVjZXNzYXJ5LiBOb3QgbmVlZGVkIGlmIHRoZSBmbGFncyBhcmU6CisJICogQUNQSV9FREdFX1NFTlNJVElWRSwgQUNQSV9BQ1RJVkVfSElHSCwgQUNQSV9FWENMVVNJVkUKIAkgKi8KLQlpZiAoQUNQSV9FREdFX1NFTlNJVElWRSA9PSBsaW5rZWRfbGlzdC0+ZGF0YS5pcnEuZWRnZV9sZXZlbCAmJgotCSAgICBBQ1BJX0FDVElWRV9ISUdIID09IGxpbmtlZF9saXN0LT5kYXRhLmlycS5hY3RpdmVfaGlnaF9sb3cgJiYKLQkgICAgQUNQSV9FWENMVVNJVkUgPT0gbGlua2VkX2xpc3QtPmRhdGEuaXJxLnNoYXJlZF9leGNsdXNpdmUpIHsKLQkJKmJ1ZmZlciA9IDB4MjI7Ci0JCUlScWluZm9fYnl0ZV9uZWVkZWQgPSBGQUxTRTsKLQl9IGVsc2UgewotCQkqYnVmZmVyID0gMHgyMzsKLQkJSVJxaW5mb19ieXRlX25lZWRlZCA9IFRSVUU7Ci0JfQorCXtBQ1BJX1JTQ19FWElUX05FLCBBQ1BJX1JTQ19DT01QQVJFX1ZBTFVFLAorCSBBQ1BJX1JTX09GRlNFVChkYXRhLmlycS50cmlnZ2VyaW5nKSwKKwkgQUNQSV9FREdFX1NFTlNJVElWRX0sCiAKLQlidWZmZXIgKz0gMTsKLQl0ZW1wMTYgPSAwOworCXtBQ1BJX1JTQ19FWElUX05FLCBBQ1BJX1JTQ19DT01QQVJFX1ZBTFVFLAorCSBBQ1BJX1JTX09GRlNFVChkYXRhLmlycS5wb2xhcml0eSksCisJIEFDUElfQUNUSVZFX0hJR0h9LAogCi0JLyogTG9vcCB0aHJvdWdoIGFsbCBvZiB0aGUgaW50ZXJydXB0cyBhbmQgc2V0IHRoZSBtYXNrIGJpdHMgKi8KKwl7QUNQSV9SU0NfRVhJVF9ORSwgQUNQSV9SU0NfQ09NUEFSRV9WQUxVRSwKKwkgQUNQSV9SU19PRkZTRVQoZGF0YS5pcnEuc2hhcmFibGUpLAorCSBBQ1BJX0VYQ0xVU0lWRX0sCiAKLQlmb3IgKGluZGV4ID0gMDsKLQkgICAgIGluZGV4IDwgbGlua2VkX2xpc3QtPmRhdGEuaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzOyBpbmRleCsrKSB7Ci0JCXRlbXA4ID0gKHU4KSBsaW5rZWRfbGlzdC0+ZGF0YS5pcnEuaW50ZXJydXB0c1tpbmRleF07Ci0JCXRlbXAxNiB8PSAweDEgPDwgdGVtcDg7Ci0JfQorCS8qIGlycV9ub19mbGFncygpIGRlc2NyaXB0b3IgY2FuIGJlIHVzZWQgKi8KIAotCUFDUElfTU9WRV8xNl9UT18xNihidWZmZXIsICZ0ZW1wMTYpOwotCWJ1ZmZlciArPSAyOwotCi0JLyogU2V0IHRoZSBJUlEgSW5mbyBieXRlIGlmIG5lZWRlZC4gKi8KLQotCWlmIChJUnFpbmZvX2J5dGVfbmVlZGVkKSB7Ci0JCXRlbXA4ID0gMDsKLQkJdGVtcDggPSAodTgpICgobGlua2VkX2xpc3QtPmRhdGEuaXJxLnNoYXJlZF9leGNsdXNpdmUgJgotCQkJICAgICAgIDB4MDEpIDw8IDQpOwotCi0JCWlmIChBQ1BJX0xFVkVMX1NFTlNJVElWRSA9PSBsaW5rZWRfbGlzdC0+ZGF0YS5pcnEuZWRnZV9sZXZlbCAmJgotCQkgICAgQUNQSV9BQ1RJVkVfTE9XID09IGxpbmtlZF9saXN0LT5kYXRhLmlycS5hY3RpdmVfaGlnaF9sb3cpIHsKLQkJCXRlbXA4IHw9IDB4MDg7Ci0JCX0gZWxzZSB7Ci0JCQl0ZW1wOCB8PSAweDAxOwotCQl9Ci0KLQkJKmJ1ZmZlciA9IHRlbXA4OwotCQlidWZmZXIgKz0gMTsKLQl9Ci0KLQkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLwotCi0JKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRihidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQorCXtBQ1BJX1JTQ19MRU5HVEgsIDAsIDAsIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2lycV9ub2ZsYWdzKX0KK307CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZXh0ZW5kZWRfaXJxX3Jlc291cmNlCi0gKgotICogUEFSQU1FVEVSUzogIGJ5dGVfc3RyZWFtX2J1ZmZlciAgICAgIC0gUG9pbnRlciB0byB0aGUgcmVzb3VyY2UgaW5wdXQgYnl0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtCi0gKiAgICAgICAgICAgICAgYnl0ZXNfY29uc3VtZWQgICAgICAgICAgLSBQb2ludGVyIHRvIHdoZXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVkIHRoZSBieXRlX3N0cmVhbV9idWZmZXIgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgb3V0cHV0X2J1ZmZlciAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXR1cm4gZGF0YSBidWZmZXIKLSAqICAgICAgICAgICAgICBzdHJ1Y3R1cmVfc2l6ZSAgICAgICAgICAtIFBvaW50ZXIgdG8gd2hlcmUgdGhlIG51bWJlciBvZiBieXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJldHVybiBkYXRhIHN0cnVjdCBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGFrZSB0aGUgcmVzb3VyY2UgYnl0ZSBzdHJlYW0gYW5kIGZpbGwgb3V0IHRoZSBhcHByb3ByaWF0ZQotICogICAgICAgICAgICAgIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IHRoZSBvdXRwdXRfYnVmZmVyLiBSZXR1cm4gdGhlCi0gKiAgICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGZyb20gdGhlIGJ5dGUgc3RyZWFtLgorICogYWNwaV9yc19jb252ZXJ0X2V4dF9pcnEKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9yc19leHRlbmRlZF9pcnFfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkgICAgICBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKLQkJCSAgICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKQotewotCXU4ICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSpvdXRwdXRfYnVmZmVyOwotCXUxNiB0ZW1wMTYgPSAwOwotCXU4IHRlbXA4ID0gMDsKLQl1OCAqdGVtcF9wdHI7Ci0JdTggaW5kZXg7Ci0JYWNwaV9zaXplIHN0cnVjdF9zaXplID0KLQkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0X2lycSk7CitzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfZXh0X2lycVs5XSA9IHsKKwl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0lSUSwKKwkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dGVuZGVkX2lycSksCisJIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19jb252ZXJ0X2V4dF9pcnEpfSwKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2V4dGVuZGVkX2lycV9yZXNvdXJjZSIpOworCXtBQ1BJX1JTQ19JTklUU0VULCBBQ1BJX1JFU09VUkNFX05BTUVfRVhURU5ERURfSVJRLAorCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9leHRlbmRlZF9pcnEpLAorCSAwfSwKIAotCS8qIEdldCB0aGUgRGVzY3JpcHRvciBMZW5ndGggZmllbGQgKi8KKwkvKiBGbGFnIGJpdHMgKi8KIAotCWJ1ZmZlciArPSAxOwotCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOworCXtBQ1BJX1JTQ18xQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5leHRlbmRlZF9pcnEucHJvZHVjZXJfY29uc3VtZXIpLAorCSBBTUxfT0ZGU0VUKGV4dGVuZGVkX2lycS5mbGFncyksCisJIDB9LAogCi0JLyogVmFsaWRhdGUgbWluaW11bSBkZXNjcmlwdG9yIGxlbmd0aCAqLworCXtBQ1BJX1JTQ18xQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5leHRlbmRlZF9pcnEudHJpZ2dlcmluZyksCisJIEFNTF9PRkZTRVQoZXh0ZW5kZWRfaXJxLmZsYWdzKSwKKwkgMX0sCiAKLQlpZiAodGVtcDE2IDwgNikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0JBRF9SRVNPVVJDRV9MRU5HVEgpOwotCX0KKwl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZXh0ZW5kZWRfaXJxLnBvbGFyaXR5KSwKKwkgQU1MX09GRlNFVChleHRlbmRlZF9pcnEuZmxhZ3MpLAorCSAyfSwKIAotCSpieXRlc19jb25zdW1lZCA9IHRlbXAxNiArIDM7Ci0Jb3V0cHV0X3N0cnVjdC0+aWQgPSBBQ1BJX1JTVFlQRV9FWFRfSVJROworCXtBQ1BJX1JTQ18xQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5leHRlbmRlZF9pcnEuc2hhcmFibGUpLAorCSBBTUxfT0ZGU0VUKGV4dGVuZGVkX2lycS5mbGFncyksCisJIDN9LAogCi0JLyogUG9pbnQgdG8gdGhlIEJ5dGUzICovCisJLyogSVJRIFRhYmxlIGxlbmd0aCAoQnl0ZTQpICovCiAKLQlidWZmZXIgKz0gMjsKLQl0ZW1wOCA9ICpidWZmZXI7CisJe0FDUElfUlNDX0NPVU5ULCBBQ1BJX1JTX09GRlNFVChkYXRhLmV4dGVuZGVkX2lycS5pbnRlcnJ1cHRfY291bnQpLAorCSBBTUxfT0ZGU0VUKGV4dGVuZGVkX2lycS5pbnRlcnJ1cHRfY291bnQpLAorCSBzaXplb2YodTMyKX0KKwksCiAKLQlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5wcm9kdWNlcl9jb25zdW1lciA9IHRlbXA4ICYgMHgwMTsKKwkvKiBDb3B5IGV2ZXJ5IElSUSBpbiB0aGUgdGFibGUsIGVhY2ggaXMgMzIgYml0cyAqLwogCi0JLyoKLQkgKiBDaGVjayBmb3IgSW50ZXJydXB0IE1vZGUKLQkgKgotCSAqIFRoZSBkZWZpbml0aW9uIG9mIGFuIEV4dGVuZGVkIElSUSBjaGFuZ2VkIGJldHdlZW4gQUNQSSBzcGVjIHYxLjBiCi0JICogYW5kIEFDUEkgc3BlYyAyLjAgKHNlY3Rpb24gNi40LjMuNiBpbiBib3RoKS4KLQkgKgotCSAqIC0gRWRnZS9MZXZlbCBhcmUgZGVmaW5lZCBvcHBvc2l0ZSBpbiB0aGUgdGFibGUgdnMgdGhlIGhlYWRlcnMKLQkgKi8KLQlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5lZGdlX2xldmVsID0KLQkgICAgKHRlbXA4ICYgMHgyKSA/IEFDUElfRURHRV9TRU5TSVRJVkUgOiBBQ1BJX0xFVkVMX1NFTlNJVElWRTsKKwl7QUNQSV9SU0NfTU9WRTMyLCBBQ1BJX1JTX09GRlNFVChkYXRhLmV4dGVuZGVkX2lycS5pbnRlcnJ1cHRzWzBdKSwKKwkgQU1MX09GRlNFVChleHRlbmRlZF9pcnEuaW50ZXJydXB0c1swXSksCisJIDB9CisJLAogCi0JLyogQ2hlY2sgSW50ZXJydXB0IFBvbGFyaXR5ICovCisJLyogT3B0aW9uYWwgcmVzb3VyY2Vfc291cmNlIChJbmRleCBhbmQgU3RyaW5nKSAqLwogCi0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEuYWN0aXZlX2hpZ2hfbG93ID0gKHRlbXA4ID4+IDIpICYgMHgxOwotCi0JLyogQ2hlY2sgZm9yIHNoYXJhYmxlICovCi0KLQlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5zaGFyZWRfZXhjbHVzaXZlID0gKHRlbXA4ID4+IDMpICYgMHgwMTsKLQotCS8qIFBvaW50IHRvIEJ5dGU0IChJUlEgVGFibGUgbGVuZ3RoKSAqLwotCi0JYnVmZmVyICs9IDE7Ci0JdGVtcDggPSAqYnVmZmVyOwotCi0JLyogTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBJUlEgKi8KLQotCWlmICh0ZW1wOCA8IDEpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9CQURfUkVTT1VSQ0VfTEVOR1RIKTsKLQl9Ci0KLQlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5udW1iZXJfb2ZfaW50ZXJydXB0cyA9IHRlbXA4OwotCi0JLyoKLQkgKiBBZGQgYW55IGFkZGl0aW9uYWwgc3RydWN0dXJlIHNpemUgdG8gcHJvcGVybHkgY2FsY3VsYXRlCi0JICogdGhlIG5leHQgcG9pbnRlciBhdCB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24KLQkgKi8KLQlzdHJ1Y3Rfc2l6ZSArPSAodGVtcDggLSAxKSAqIDQ7Ci0KLQkvKiBQb2ludCB0byBCeXRlNSAoRmlyc3QgSVJRIE51bWJlcikgKi8KLQotCWJ1ZmZlciArPSAxOwotCi0JLyogQ3ljbGUgdGhyb3VnaCBldmVyeSBJUlEgaW4gdGhlIHRhYmxlICovCi0KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB0ZW1wODsgaW5kZXgrKykgewotCQlBQ1BJX01PVkVfMzJfVE9fMzIoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLgotCQkJCSAgIGludGVycnVwdHNbaW5kZXhdLCBidWZmZXIpOwotCi0JCS8qIFBvaW50IHRvIHRoZSBuZXh0IElSUSAqLwotCi0JCWJ1ZmZlciArPSA0OwotCX0KLQotCS8qCi0JICogVGhpcyB3aWxsIGxlYXZlIHVzIHBvaW50aW5nIHRvIHRoZSBSZXNvdXJjZSBTb3VyY2UgSW5kZXgKLQkgKiBJZiBpdCBpcyBwcmVzZW50LCB0aGVuIHNhdmUgaXQgb2ZmIGFuZCBjYWxjdWxhdGUgdGhlCi0JICogcG9pbnRlciB0byB3aGVyZSB0aGUgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBnb2VzOgotCSAqIEVhY2ggSW50ZXJydXB0IHRha2VzIDMyLWJpdHMgKyB0aGUgNSBieXRlcyBvZiB0aGUKLQkgKiBzdHJlYW0gdGhhdCBhcmUgZGVmYXVsdC4KLQkgKgotCSAqIE5vdGU6IFNvbWUgcmVzb3VyY2UgZGVzY3JpcHRvcnMgd2lsbCBoYXZlIGFuIGFkZGl0aW9uYWwgbnVsbCwgc28KLQkgKiB3ZSBhZGQgMSB0byB0aGUgbGVuZ3RoLgotCSAqLwotCWlmICgqYnl0ZXNfY29uc3VtZWQgPgotCSAgICAoKGFjcGlfc2l6ZSkgb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEubnVtYmVyX29mX2ludGVycnVwdHMgKgotCSAgICAgNCkgKyAoNSArIDEpKSB7Ci0JCS8qIERlcmVmZXJlbmNlIHRoZSBJbmRleCAqLwotCi0JCXRlbXA4ID0gKmJ1ZmZlcjsKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLmluZGV4ID0KLQkJICAgICh1MzIpIHRlbXA4OwotCi0JCS8qIFBvaW50IHRvIHRoZSBTdHJpbmcgKi8KLQotCQlidWZmZXIgKz0gMTsKLQotCQkvKiBQb2ludCB0aGUgU3RyaW5nIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGlzIHN0cnVjdHVyZS4gKi8KLQotCQlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0ciA9Ci0JCSAgICAoY2hhciAqKSgoY2hhciAqKW91dHB1dF9zdHJ1Y3QgKyBzdHJ1Y3Rfc2l6ZSk7Ci0KLQkJdGVtcF9wdHIgPSAodTggKikKLQkJICAgIG91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyOwotCi0JCS8qIENvcHkgdGhlIHN0cmluZyBpbnRvIHRoZSBidWZmZXIgKi8KLQotCQlpbmRleCA9IDA7Ci0JCXdoaWxlICgqYnVmZmVyKSB7Ci0JCQkqdGVtcF9wdHIgPSAqYnVmZmVyOwotCi0JCQl0ZW1wX3B0ciArPSAxOwotCQkJYnVmZmVyICs9IDE7Ci0JCQlpbmRleCArPSAxOwotCQl9Ci0KLQkJLyogQWRkIHRoZSB0ZXJtaW5hdGluZyBudWxsICovCi0KLQkJKnRlbXBfcHRyID0gMDsKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGggPQotCQkgICAgaW5kZXggKyAxOwotCi0JCS8qCi0JCSAqIEluIG9yZGVyIGZvciB0aGUgc3RydWN0X3NpemUgdG8gZmFsbCBvbiBhIDMyLWJpdCBib3VuZGFyeSwKLQkJICogY2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBhbmQgZXhwYW5kIHRoZQotCQkgKiBzdHJ1Y3Rfc2l6ZSB0byB0aGUgbmV4dCAzMi1iaXQgYm91bmRhcnkuCi0JCSAqLwotCQl0ZW1wOCA9ICh1OCkgKGluZGV4ICsgMSk7Ci0JCXN0cnVjdF9zaXplICs9IEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyh0ZW1wOCk7Ci0JfSBlbHNlIHsKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLmluZGV4ID0gMDsKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGggPQotCQkgICAgMDsKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIgPQotCQkgICAgTlVMTDsKLQl9Ci0KLQkvKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIgKi8KLQotCW91dHB1dF9zdHJ1Y3QtPmxlbmd0aCA9ICh1MzIpIHN0cnVjdF9zaXplOwotCi0JLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KLQotCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19CisJe0FDUElfUlNDX1NPVVJDRVgsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZSksCisJIEFDUElfUlNfT0ZGU0VUKGRhdGEuZXh0ZW5kZWRfaXJxLmludGVycnVwdHNbMF0pLAorCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9leHRlbmRlZF9pcnEpfQorfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19leHRlbmRlZF9pcnFfc3RyZWFtCi0gKgotICogUEFSQU1FVEVSUzogIGxpbmtlZF9saXN0ICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmVzb3VyY2UgbGlua2VkIGxpc3QKLSAqICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHVzZXIncyByZXR1cm4gYnVmZmVyCi0gKiAgICAgICAgICAgICAgYnl0ZXNfY29uc3VtZWQgICAgICAgICAgLSBQb2ludGVyIHRvIHdoZXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gdGhlIG91dHB1dF9idWZmZXIgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRha2UgdGhlIGxpbmtlZCBsaXN0IHJlc291cmNlIHN0cnVjdHVyZSBhbmQgZmlsbHMgaW4gdGhlCi0gKiAgICAgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluIGEgYnl0ZSBzdHJlYW0KKyAqIGFjcGlfcnNfY29udmVydF9kbWEKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9yc19leHRlbmRlZF9pcnFfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKLQkJCSAgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCkKLXsKLQl1OCAqYnVmZmVyID0gKm91dHB1dF9idWZmZXI7Ci0JdTE2ICpsZW5ndGhfZmllbGQ7Ci0JdTggdGVtcDggPSAwOwotCXU4IGluZGV4Oworc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19jb252ZXJ0X2RtYVs2XSA9IHsKKwl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX0RNQSwKKwkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2RtYSksCisJIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19jb252ZXJ0X2RtYSl9LAogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZXh0ZW5kZWRfaXJxX3N0cmVhbSIpOworCXtBQ1BJX1JTQ19JTklUU0VULCBBQ1BJX1JFU09VUkNFX05BTUVfRE1BLAorCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9kbWEpLAorCSAwfSwKIAotCS8qIFNldCB0aGUgRGVzY3JpcHRvciBUeXBlIGZpZWxkICovCisJLyogRmxhZ3M6IHRyYW5zZmVyIHByZWZlcmVuY2UsIGJ1cyBtYXN0ZXJpbmcsIGNoYW5uZWwgc3BlZWQgKi8KIAotCSpidWZmZXIgPSBBQ1BJX1JERVNDX1RZUEVfRVhURU5ERURfWFJVUFQ7Ci0JYnVmZmVyICs9IDE7CisJe0FDUElfUlNDXzJCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmRtYS50cmFuc2ZlciksCisJIEFNTF9PRkZTRVQoZG1hLmZsYWdzKSwKKwkgMH0sCiAKLQkvKiBTYXZlIGEgcG9pbnRlciB0byB0aGUgTGVuZ3RoIGZpZWxkIC0gdG8gYmUgZmlsbGVkIGluIGxhdGVyICovCisJe0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmRtYS5idXNfbWFzdGVyKSwKKwkgQU1MX09GRlNFVChkbWEuZmxhZ3MpLAorCSAyfSwKIAotCWxlbmd0aF9maWVsZCA9IEFDUElfQ0FTVF9QVFIodTE2LCBidWZmZXIpOwotCWJ1ZmZlciArPSAyOworCXtBQ1BJX1JTQ18yQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5kbWEudHlwZSksCisJIEFNTF9PRkZTRVQoZG1hLmZsYWdzKSwKKwkgNX0sCiAKLQkvKiBTZXQgdGhlIEludGVycnVwdCB2ZWN0b3IgZmxhZ3MgKi8KKwkvKiBETUEgY2hhbm5lbCBtYXNrIGJpdHMgKi8KIAotCXRlbXA4ID0gKHU4KSAobGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnByb2R1Y2VyX2NvbnN1bWVyICYgMHgwMSk7Ci0JdGVtcDggfD0KLQkgICAgKChsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEuc2hhcmVkX2V4Y2x1c2l2ZSAmIDB4MDEpIDw8IDMpOwotCi0JLyoKLQkgKiBTZXQgdGhlIEludGVycnVwdCBNb2RlCi0JICoKLQkgKiBUaGUgZGVmaW5pdGlvbiBvZiBhbiBFeHRlbmRlZCBJUlEgY2hhbmdlZCBiZXR3ZWVuIEFDUEkgc3BlYyB2MS4wYgotCSAqIGFuZCBBQ1BJIHNwZWMgMi4wIChzZWN0aW9uIDYuNC4zLjYgaW4gYm90aCkuICBUaGlzIGNvZGUgZG9lcyBub3QKLQkgKiBpbXBsZW1lbnQgdGhlIG1vcmUgcmVzdHJpY3RpdmUgZGVmaW5pdGlvbiBvZiAxLjBiCi0JICoKLQkgKiAtIEVkZ2UvTGV2ZWwgYXJlIGRlZmluZWQgb3Bwb3NpdGUgaW4gdGhlIHRhYmxlIHZzIHRoZSBoZWFkZXJzCi0JICovCi0JaWYgKEFDUElfRURHRV9TRU5TSVRJVkUgPT0gbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLmVkZ2VfbGV2ZWwpIHsKLQkJdGVtcDggfD0gMHgyOwotCX0KLQotCS8qIFNldCB0aGUgSW50ZXJydXB0IFBvbGFyaXR5ICovCi0KLQl0ZW1wOCB8PSAoKGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5hY3RpdmVfaGlnaF9sb3cgJiAweDEpIDw8IDIpOwotCi0JKmJ1ZmZlciA9IHRlbXA4OwotCWJ1ZmZlciArPSAxOwotCi0JLyogU2V0IHRoZSBJbnRlcnJ1cHQgdGFibGUgbGVuZ3RoICovCi0KLQl0ZW1wOCA9ICh1OCkgbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzOwotCi0JKmJ1ZmZlciA9IHRlbXA4OwotCWJ1ZmZlciArPSAxOwotCi0JZm9yIChpbmRleCA9IDA7Ci0JICAgICBpbmRleCA8IGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5udW1iZXJfb2ZfaW50ZXJydXB0czsKLQkgICAgIGluZGV4KyspIHsKLQkJQUNQSV9NT1ZFXzMyX1RPXzMyKGJ1ZmZlciwKLQkJCQkgICAmbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLgotCQkJCSAgIGludGVycnVwdHNbaW5kZXhdKTsKLQkJYnVmZmVyICs9IDQ7Ci0JfQotCi0JLyogUmVzb3VyY2UgU291cmNlIEluZGV4IGFuZCBSZXNvdXJjZSBTb3VyY2UgYXJlIG9wdGlvbmFsICovCi0KLQlpZiAoMCAhPSBsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGgpIHsKLQkJKmJ1ZmZlciA9Ci0JCSAgICAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2UuaW5kZXg7Ci0JCWJ1ZmZlciArPSAxOwotCi0JCS8qIENvcHkgdGhlIHN0cmluZyAqLwotCi0JCUFDUElfU1RSQ1BZKChjaGFyICopYnVmZmVyLAotCQkJICAgIGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2UuCi0JCQkgICAgc3RyaW5nX3B0cik7Ci0KLQkJLyoKLQkJICogQnVmZmVyIG5lZWRzIHRvIGJlIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKyBvbmUgZm9yIHRoZQotCQkgKiB0ZXJtaW5hdGluZyBudWxsCi0JCSAqLwotCQlidWZmZXIgKz0KLQkJICAgIChhY3BpX3NpemUpIChBQ1BJX1NUUkxFTgotCQkJCSAobGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLgotCQkJCSAgcmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpICsgMSk7Ci0JfQotCi0JLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KLQotCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7Ci0KLQkvKgotCSAqIFNldCB0aGUgbGVuZ3RoIGZpZWxkIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQKLQkgKiBtaW51cyB0aGUgaGVhZGVyIHNpemUgKDMgYnl0ZXMpCi0JICovCi0JKmxlbmd0aF9maWVsZCA9ICh1MTYpICgqYnl0ZXNfY29uc3VtZWQgLSAzKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQorCXtBQ1BJX1JTQ19CSVRNQVNLLCBBQ1BJX1JTX09GRlNFVChkYXRhLmRtYS5jaGFubmVsc1swXSksCisJIEFNTF9PRkZTRVQoZG1hLmRtYV9jaGFubmVsX21hc2spLAorCSBBQ1BJX1JTX09GRlNFVChkYXRhLmRtYS5jaGFubmVsX2NvdW50KX0KK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbGlzdC5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2xpc3QuYwppbmRleCAxMDNlYjMxLi5lNDc3OGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbGlzdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNsaXN0LmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNDksNTIgKzQ5LDEyIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZ2V0X3Jlc291cmNlX3R5cGUKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2NvbnZlcnRfYW1sX3RvX3Jlc291cmNlcwogICoKLSAqIFBBUkFNRVRFUlM6ICByZXNvdXJjZV9zdGFydF9ieXRlICAgICAtIEJ5dGUgMCBvZiBhIHJlc291cmNlIGRlc2NyaXB0b3IKLSAqCi0gKiBSRVRVUk46ICAgICAgVGhlIFJlc291cmNlIFR5cGUgd2l0aCBubyBleHRyYW5lb3VzIGJpdHMKLSAqCi0gKiBERVNDUklQVElPTjogRXh0cmFjdCB0aGUgUmVzb3VyY2UgVHlwZS9OYW1lIGZyb20gdGhlIGZpcnN0IGJ5dGUgb2YKLSAqICAgICAgICAgICAgICBhIHJlc291cmNlIGRlc2NyaXB0b3IuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IGFjcGlfcnNfZ2V0X3Jlc291cmNlX3R5cGUodTggcmVzb3VyY2Vfc3RhcnRfYnl0ZSkKLXsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCS8qIERldGVybWluZSBpZiB0aGlzIGlzIGEgc21hbGwgb3IgbGFyZ2UgcmVzb3VyY2UgKi8KLQotCXN3aXRjaCAocmVzb3VyY2Vfc3RhcnRfYnl0ZSAmIEFDUElfUkRFU0NfVFlQRV9NQVNLKSB7Ci0JY2FzZSBBQ1BJX1JERVNDX1RZUEVfU01BTEw6Ci0KLQkJLyogU21hbGwgUmVzb3VyY2UgVHlwZSAtLSBPbmx5IGJpdHMgNjozIGFyZSB2YWxpZCAqLwotCi0JCXJldHVybiAoKHU4KSAocmVzb3VyY2Vfc3RhcnRfYnl0ZSAmIEFDUElfUkRFU0NfU01BTExfTUFTSykpOwotCi0JY2FzZSBBQ1BJX1JERVNDX1RZUEVfTEFSR0U6Ci0KLQkJLyogTGFyZ2UgUmVzb3VyY2UgVHlwZSAtLSBBbGwgYml0cyBhcmUgdmFsaWQgKi8KLQotCQlyZXR1cm4gKHJlc291cmNlX3N0YXJ0X2J5dGUpOwotCi0JZGVmYXVsdDoKLQkJLyogSW52YWxpZCB0eXBlICovCi0JCWJyZWFrOwotCX0KLQotCXJldHVybiAoMHhGRik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfYnl0ZV9zdHJlYW1fdG9fbGlzdAotICoKLSAqIFBBUkFNRVRFUlM6ICBieXRlX3N0cmVhbV9idWZmZXIgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGJ5dGUgc3RyZWFtCi0gKiAgICAgICAgICAgICAgYnl0ZV9zdHJlYW1fYnVmZmVyX2xlbmd0aCAtIExlbmd0aCBvZiBieXRlX3N0cmVhbV9idWZmZXIKLSAqICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0IHdpbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW4gdGhlIG91dHB1dCBzdHJ1Y3R1cmVzCisgKiBQQVJBTUVURVJTOiAgQW1sICAgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGJ5dGUgc3RyZWFtCisgKiAgICAgICAgICAgICAgYW1sX2xlbmd0aCAgICAgICAgICAtIExlbmd0aCBvZiBBbWwKKyAqICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyICAgICAgIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgd2lsbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluIHRoZSBvdXRwdXQgc3RydWN0dXJlcwogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0xMDIsMjQxICs2Miw3NiBAQAogICogICAgICAgICAgICAgIGxpbmtlZCBsaXN0IG9mIHJlc291cmNlcyBpbiB0aGUgY2FsbGVyJ3Mgb3V0cHV0IGJ1ZmZlcgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2J5dGVfc3RyZWFtX3RvX2xpc3QodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkgICAgdTMyIGJ5dGVfc3RyZWFtX2J1ZmZlcl9sZW5ndGgsIHU4ICogb3V0cHV0X2J1ZmZlcikKK2FjcGlfcnNfY29udmVydF9hbWxfdG9fcmVzb3VyY2VzKHU4ICogYW1sLCB1MzIgYW1sX2xlbmd0aCwgdTggKiBvdXRwdXRfYnVmZmVyKQogeworCXN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSA9ICh2b2lkICopb3V0cHV0X2J1ZmZlcjsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JYWNwaV9zaXplIGJ5dGVzX3BhcnNlZCA9IDA7Ci0JdTggcmVzb3VyY2VfdHlwZSA9IDA7Ci0JYWNwaV9zaXplIGJ5dGVzX2NvbnN1bWVkID0gMDsKLQl1OCAqYnVmZmVyID0gb3V0cHV0X2J1ZmZlcjsKLQlhY3BpX3NpemUgc3RydWN0dXJlX3NpemUgPSAwOwotCXU4IGVuZF90YWdfcHJvY2Vzc2VkID0gRkFMU0U7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlOworCXU4IHJlc291cmNlX2luZGV4OworCXU4ICplbmRfYW1sOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfYnl0ZV9zdHJlYW1fdG9fbGlzdCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2NvbnZlcnRfYW1sX3RvX3Jlc291cmNlcyIpOwogCi0Jd2hpbGUgKGJ5dGVzX3BhcnNlZCA8IGJ5dGVfc3RyZWFtX2J1ZmZlcl9sZW5ndGggJiYgIWVuZF90YWdfcHJvY2Vzc2VkKSB7Ci0JCS8qIFRoZSBuZXh0IGJ5dGUgaW4gdGhlIHN0cmVhbSBpcyB0aGUgcmVzb3VyY2UgdHlwZSAqLworCWVuZF9hbWwgPSBhbWwgKyBhbWxfbGVuZ3RoOwogCi0JCXJlc291cmNlX3R5cGUgPSBhY3BpX3JzX2dldF9yZXNvdXJjZV90eXBlKCpieXRlX3N0cmVhbV9idWZmZXIpOworCS8qIExvb3AgdW50aWwgZW5kLW9mLWJ1ZmZlciBvciBhbiBlbmRfdGFnIGlzIGZvdW5kICovCiAKLQkJc3dpdGNoIChyZXNvdXJjZV90eXBlKSB7Ci0JCWNhc2UgQUNQSV9SREVTQ19UWVBFX01FTU9SWV8yNDoKLQkJCS8qCi0JCQkgKiAyNC1CaXQgTWVtb3J5IFJlc291cmNlCi0JCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfbWVtb3J5MjRfcmVzb3VyY2UoYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkJCQkJCSAgICZieXRlc19jb25zdW1lZCwKLQkJCQkJCQkgICAmYnVmZmVyLAotCQkJCQkJCSAgICZzdHJ1Y3R1cmVfc2l6ZSk7Ci0JCQlicmVhazsKKwl3aGlsZSAoYW1sIDwgZW5kX2FtbCkgeworCQkvKiBWYWxpZGF0ZSB0aGUgUmVzb3VyY2UgVHlwZSBhbmQgUmVzb3VyY2UgTGVuZ3RoICovCiAKLQkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfTEFSR0VfVkVORE9SOgotCQkJLyoKLQkJCSAqIFZlbmRvciBEZWZpbmVkIFJlc291cmNlCi0JCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfdmVuZG9yX3Jlc291cmNlKGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCQkJCQkgJmJ5dGVzX2NvbnN1bWVkLAotCQkJCQkJCSAmYnVmZmVyLAotCQkJCQkJCSAmc3RydWN0dXJlX3NpemUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfTUVNT1JZXzMyOgotCQkJLyoKLQkJCSAqIDMyLUJpdCBNZW1vcnkgUmFuZ2UgUmVzb3VyY2UKLQkJCSAqLwotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX3JzX21lbW9yeTMyX3JhbmdlX3Jlc291cmNlKGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCQkJCQkgICAgJmJ5dGVzX2NvbnN1bWVkLAotCQkJCQkJCSAgICAmYnVmZmVyLAotCQkJCQkJCSAgICAmc3RydWN0dXJlX3NpemUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfRklYRURfTUVNT1JZXzMyOgotCQkJLyoKLQkJCSAqIDMyLUJpdCBGaXhlZCBNZW1vcnkgUmVzb3VyY2UKLQkJCSAqLwotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX3JzX2ZpeGVkX21lbW9yeTMyX3Jlc291cmNlKGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCQkJCQkgICAgJmJ5dGVzX2NvbnN1bWVkLAotCQkJCQkJCSAgICAmYnVmZmVyLAotCQkJCQkJCSAgICAmc3RydWN0dXJlX3NpemUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfUVdPUkRfQUREUkVTU19TUEFDRToKLQkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfRVhURU5ERURfQUREUkVTU19TUEFDRToKLQkJCS8qCi0JCQkgKiA2NC1CaXQgQWRkcmVzcyBSZXNvdXJjZQotCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX2FkZHJlc3M2NF9yZXNvdXJjZShieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkJCQkJICAgICZieXRlc19jb25zdW1lZCwKLQkJCQkJCQkgICAgJmJ1ZmZlciwKLQkJCQkJCQkgICAgJnN0cnVjdHVyZV9zaXplKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SREVTQ19UWVBFX0RXT1JEX0FERFJFU1NfU1BBQ0U6Ci0JCQkvKgotCQkJICogMzItQml0IEFkZHJlc3MgUmVzb3VyY2UKLQkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19hZGRyZXNzMzJfcmVzb3VyY2UoYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkJCQkJCSAgICAmYnl0ZXNfY29uc3VtZWQsCi0JCQkJCQkJICAgICZidWZmZXIsCi0JCQkJCQkJICAgICZzdHJ1Y3R1cmVfc2l6ZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkRFU0NfVFlQRV9XT1JEX0FERFJFU1NfU1BBQ0U6Ci0JCQkvKgotCQkJICogMTYtQml0IEFkZHJlc3MgUmVzb3VyY2UKLQkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9yc19hZGRyZXNzMTZfcmVzb3VyY2UoYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkJCQkJCSAgICAmYnl0ZXNfY29uc3VtZWQsCi0JCQkJCQkJICAgICZidWZmZXIsCi0JCQkJCQkJICAgICZzdHJ1Y3R1cmVfc2l6ZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkRFU0NfVFlQRV9FWFRFTkRFRF9YUlVQVDoKLQkJCS8qCi0JCQkgKiBFeHRlbmRlZCBJUlEKLQkJCSAqLwotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX3JzX2V4dGVuZGVkX2lycV9yZXNvdXJjZShieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkJCQkJICAmYnl0ZXNfY29uc3VtZWQsCi0JCQkJCQkJICAmYnVmZmVyLAotCQkJCQkJCSAgJnN0cnVjdHVyZV9zaXplKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SREVTQ19UWVBFX0lSUV9GT1JNQVQ6Ci0JCQkvKgotCQkJICogSVJRIFJlc291cmNlCi0JCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfaXJxX3Jlc291cmNlKGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCQkJCSAgICAgICZieXRlc19jb25zdW1lZCwgJmJ1ZmZlciwKLQkJCQkJCSAgICAgICZzdHJ1Y3R1cmVfc2l6ZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkRFU0NfVFlQRV9ETUFfRk9STUFUOgotCQkJLyoKLQkJCSAqIERNQSBSZXNvdXJjZQotCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX2RtYV9yZXNvdXJjZShieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkJCQkgICAgICAmYnl0ZXNfY29uc3VtZWQsICZidWZmZXIsCi0JCQkJCQkgICAgICAmc3RydWN0dXJlX3NpemUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfU1RBUlRfREVQRU5ERU5UOgotCQkJLyoKLQkJCSAqIFN0YXJ0IERlcGVuZGVudCBGdW5jdGlvbnMgUmVzb3VyY2UKLQkJCSAqLwotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX3JzX3N0YXJ0X2RlcGVuZF9mbnNfcmVzb3VyY2UKLQkJCSAgICAoYnl0ZV9zdHJlYW1fYnVmZmVyLCAmYnl0ZXNfY29uc3VtZWQsICZidWZmZXIsCi0JCQkgICAgICZzdHJ1Y3R1cmVfc2l6ZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkRFU0NfVFlQRV9FTkRfREVQRU5ERU5UOgotCQkJLyoKLQkJCSAqIEVuZCBEZXBlbmRlbnQgRnVuY3Rpb25zIFJlc291cmNlCi0JCQkgKi8KLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9yc19lbmRfZGVwZW5kX2Zuc19yZXNvdXJjZShieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkJCQkJICAgICZieXRlc19jb25zdW1lZCwKLQkJCQkJCQkgICAgJmJ1ZmZlciwKLQkJCQkJCQkgICAgJnN0cnVjdHVyZV9zaXplKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SREVTQ19UWVBFX0lPX1BPUlQ6Ci0JCQkvKgotCQkJICogSU8gUG9ydCBSZXNvdXJjZQotCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX2lvX3Jlc291cmNlKGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCQkJCSAgICAgJmJ5dGVzX2NvbnN1bWVkLCAmYnVmZmVyLAotCQkJCQkJICAgICAmc3RydWN0dXJlX3NpemUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfRklYRURfSU9fUE9SVDoKLQkJCS8qCi0JCQkgKiBGaXhlZCBJTyBQb3J0IFJlc291cmNlCi0JCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfZml4ZWRfaW9fcmVzb3VyY2UoYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkJCQkJCSAgICZieXRlc19jb25zdW1lZCwKLQkJCQkJCQkgICAmYnVmZmVyLAotCQkJCQkJCSAgICZzdHJ1Y3R1cmVfc2l6ZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkRFU0NfVFlQRV9TTUFMTF9WRU5ET1I6Ci0JCQkvKgotCQkJICogVmVuZG9yIFNwZWNpZmljIFJlc291cmNlCi0JCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfdmVuZG9yX3Jlc291cmNlKGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCQkJCQkgJmJ5dGVzX2NvbnN1bWVkLAotCQkJCQkJCSAmYnVmZmVyLAotCQkJCQkJCSAmc3RydWN0dXJlX3NpemUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JERVNDX1RZUEVfRU5EX1RBRzoKLQkJCS8qCi0JCQkgKiBFbmQgVGFnCi0JCQkgKi8KLQkJCWVuZF90YWdfcHJvY2Vzc2VkID0gVFJVRTsKLQkJCXN0YXR1cyA9IGFjcGlfcnNfZW5kX3RhZ19yZXNvdXJjZShieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkJCQkJICAmYnl0ZXNfY29uc3VtZWQsCi0JCQkJCQkJICAmYnVmZmVyLAotCQkJCQkJCSAgJnN0cnVjdHVyZV9zaXplKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQkvKgotCQkJICogSW52YWxpZC9Vbmtub3duIHJlc291cmNlIHR5cGUKLQkJCSAqLwotCQkJc3RhdHVzID0gQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRTsKLQkJCWJyZWFrOwotCQl9Ci0KKwkJc3RhdHVzID0gYWNwaV91dF92YWxpZGF0ZV9yZXNvdXJjZShhbWwsICZyZXNvdXJjZV9pbmRleCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KIAotCQkvKiBVcGRhdGUgdGhlIHJldHVybiB2YWx1ZSBhbmQgY291bnRlciAqLworCQkvKiBDb252ZXJ0IHRoZSBBTUwgYnl0ZSBzdHJlYW0gcmVzb3VyY2UgdG8gYSBsb2NhbCByZXNvdXJjZSBzdHJ1Y3QgKi8KIAotCQlieXRlc19wYXJzZWQgKz0gYnl0ZXNfY29uc3VtZWQ7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3JzX2NvbnZlcnRfYW1sX3RvX3Jlc291cmNlKHJlc291cmNlLAorCQkJCQkJICAgIEFDUElfQ0FTVF9QVFIodW5pb24KKwkJCQkJCQkJICBhbWxfcmVzb3VyY2UsCisJCQkJCQkJCSAgYW1sKSwKKwkJCQkJCSAgICBhY3BpX2dibF9nZXRfcmVzb3VyY2VfZGlzcGF0Y2gKKwkJCQkJCSAgICBbcmVzb3VyY2VfaW5kZXhdKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBjb252ZXJ0IEFNTCByZXNvdXJjZSAoVHlwZSAlWCkgdG8gcmVzb3VyY2UsICVzXG4iLCAqYW1sLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KIAotCQkvKiBTZXQgdGhlIGJ5dGUgc3RyZWFtIHRvIHBvaW50IHRvIHRoZSBuZXh0IHJlc291cmNlICovCisJCS8qIE5vcm1hbCBleGl0IG9uIGNvbXBsZXRpb24gb2YgYW4gZW5kX3RhZyByZXNvdXJjZSBkZXNjcmlwdG9yICovCiAKLQkJYnl0ZV9zdHJlYW1fYnVmZmVyICs9IGJ5dGVzX2NvbnN1bWVkOworCQlpZiAoYWNwaV91dF9nZXRfcmVzb3VyY2VfdHlwZShhbWwpID09CisJCSAgICBBQ1BJX1JFU09VUkNFX05BTUVfRU5EX1RBRykgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwkJfQogCi0JCS8qIFNldCB0aGUgQnVmZmVyIHRvIHRoZSBuZXh0IHN0cnVjdHVyZSAqLworCQkvKiBQb2ludCB0byB0aGUgbmV4dCBpbnB1dCBBTUwgcmVzb3VyY2UgKi8KIAotCQlyZXNvdXJjZSA9IEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfcmVzb3VyY2UsIGJ1ZmZlcik7Ci0JCXJlc291cmNlLT5sZW5ndGggPQotCQkgICAgKHUzMikgQUNQSV9BTElHTl9SRVNPVVJDRV9TSVpFKHJlc291cmNlLT5sZW5ndGgpOwotCQlidWZmZXIgKz0gQUNQSV9BTElHTl9SRVNPVVJDRV9TSVpFKHN0cnVjdHVyZV9zaXplKTsKKwkJYW1sICs9IGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbGVuZ3RoKGFtbCk7CisKKwkJLyogUG9pbnQgdG8gdGhlIG5leHQgc3RydWN0dXJlIGluIHRoZSBvdXRwdXQgYnVmZmVyICovCisKKwkJcmVzb3VyY2UgPQorCQkgICAgQUNQSV9BRERfUFRSKHN0cnVjdCBhY3BpX3Jlc291cmNlLCByZXNvdXJjZSwKKwkJCQkgcmVzb3VyY2UtPmxlbmd0aCk7CiAJfQogCi0JLyogQ2hlY2sgdGhlIHJlYXNvbiBmb3IgZXhpdGluZyB0aGUgd2hpbGUgbG9vcCAqLworCS8qIERpZCBub3QgZmluZCBhbiBlbmRfdGFnIHJlc291cmNlIGRlc2NyaXB0b3IgKi8KIAotCWlmICghZW5kX3RhZ19wcm9jZXNzZWQpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19SRVNPVVJDRV9FTkRfVEFHKTsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9fUkVTT1VSQ0VfRU5EX1RBRyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfbGlzdF90b19ieXRlX3N0cmVhbQorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfY29udmVydF9yZXNvdXJjZXNfdG9fYW1sCiAgKgotICogUEFSQU1FVEVSUzogIGxpbmtlZF9saXN0ICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmVzb3VyY2UgbGlua2VkIGxpc3QKLSAqICAgICAgICAgICAgICBieXRlX3N0ZWFtX3NpemVfbmVlZGVkICAtIENhbGN1bGF0ZWQgc2l6ZSBvZiB0aGUgYnl0ZSBzdHJlYW0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBmcm9tIGNhbGxpbmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfcnNfZ2V0X2J5dGVfc3RyZWFtX2xlbmd0aCgpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgc2l6ZSBvZiB0aGUgb3V0cHV0X2J1ZmZlciBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VhcmFudGVlZCB0byBiZSA+PQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9zdHJlYW1fc2l6ZV9uZWVkZWQKLSAqICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0IHdpbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW4gdGhlIGJ5dGUgc3RyZWFtCisgKiBQQVJBTUVURVJTOiAgUmVzb3VyY2UgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGxpbmtlZCBsaXN0CisgKiAgICAgICAgICAgICAgYW1sX3NpemVfbmVlZGVkICAgICAtIENhbGN1bGF0ZWQgc2l6ZSBvZiB0aGUgYnl0ZSBzdHJlYW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIGZyb20gY2FsbGluZyBhY3BpX3JzX2dldF9hbWxfbGVuZ3RoKCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNpemUgb2YgdGhlIG91dHB1dF9idWZmZXIgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VhcmFudGVlZCB0byBiZSA+PSBhbWxfc2l6ZV9uZWVkZWQKKyAqICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyICAgICAgIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgd2lsbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluIHRoZSBieXRlIHN0cmVhbQogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0zNDYsMTgwICsxNDEsNjkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2xpc3RfdG9fYnl0ZV9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAotCQkJICAgIGFjcGlfc2l6ZSBieXRlX3N0cmVhbV9zaXplX25lZWRlZCwKLQkJCSAgICB1OCAqIG91dHB1dF9idWZmZXIpCithY3BpX3JzX2NvbnZlcnRfcmVzb3VyY2VzX3RvX2FtbChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsCisJCQkJIGFjcGlfc2l6ZSBhbWxfc2l6ZV9uZWVkZWQsIHU4ICogb3V0cHV0X2J1ZmZlcikKIHsKKwl1OCAqYW1sID0gb3V0cHV0X2J1ZmZlcjsKKwl1OCAqZW5kX2FtbCA9IG91dHB1dF9idWZmZXIgKyBhbWxfc2l6ZV9uZWVkZWQ7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwotCXU4ICpidWZmZXIgPSBvdXRwdXRfYnVmZmVyOwotCWFjcGlfc2l6ZSBieXRlc19jb25zdW1lZCA9IDA7Ci0JdTggZG9uZSA9IEZBTFNFOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfbGlzdF90b19ieXRlX3N0cmVhbSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2NvbnZlcnRfcmVzb3VyY2VzX3RvX2FtbCIpOwogCi0Jd2hpbGUgKCFkb25lKSB7Ci0JCXN3aXRjaCAobGlua2VkX2xpc3QtPmlkKSB7Ci0JCWNhc2UgQUNQSV9SU1RZUEVfSVJROgotCQkJLyoKLQkJCSAqIElSUSBSZXNvdXJjZQotCQkJICovCi0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfcnNfaXJxX3N0cmVhbShsaW5rZWRfbGlzdCwgJmJ1ZmZlciwKLQkJCQkJICAgICAgICZieXRlc19jb25zdW1lZCk7Ci0JCQlicmVhazsKKwkvKiBXYWxrIHRoZSByZXNvdXJjZSBkZXNjcmlwdG9yIGxpc3QsIGNvbnZlcnQgZWFjaCBkZXNjcmlwdG9yICovCiAKLQkJY2FzZSBBQ1BJX1JTVFlQRV9ETUE6Ci0JCQkvKgotCQkJICogRE1BIFJlc291cmNlCi0JCQkgKi8KLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9yc19kbWFfc3RyZWFtKGxpbmtlZF9saXN0LCAmYnVmZmVyLAotCQkJCQkgICAgICAgJmJ5dGVzX2NvbnN1bWVkKTsKLQkJCWJyZWFrOworCXdoaWxlIChhbWwgPCBlbmRfYW1sKSB7CisJCS8qIFZhbGlkYXRlIHRoZSAoaW50ZXJuYWwpIFJlc291cmNlIFR5cGUgKi8KIAotCQljYXNlIEFDUElfUlNUWVBFX1NUQVJUX0RQRjoKLQkJCS8qCi0JCQkgKiBTdGFydCBEZXBlbmRlbnQgRnVuY3Rpb25zIFJlc291cmNlCi0JCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfcnNfc3RhcnRfZGVwZW5kX2Zuc19zdHJlYW0obGlua2VkX2xpc3QsCi0JCQkJCQkJCSAmYnVmZmVyLAotCQkJCQkJCQkgJmJ5dGVzX2NvbnN1bWVkKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SU1RZUEVfRU5EX0RQRjoKLQkJCS8qCi0JCQkgKiBFbmQgRGVwZW5kZW50IEZ1bmN0aW9ucyBSZXNvdXJjZQotCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX2VuZF9kZXBlbmRfZm5zX3N0cmVhbShsaW5rZWRfbGlzdCwKLQkJCQkJCQkgICAgICAgJmJ1ZmZlciwKLQkJCQkJCQkgICAgICAgJmJ5dGVzX2NvbnN1bWVkKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SU1RZUEVfSU86Ci0JCQkvKgotCQkJICogSU8gUG9ydCBSZXNvdXJjZQotCQkJICovCi0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfcnNfaW9fc3RyZWFtKGxpbmtlZF9saXN0LCAmYnVmZmVyLAotCQkJCQkgICAgICAmYnl0ZXNfY29uc3VtZWQpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTVFlQRV9GSVhFRF9JTzoKLQkJCS8qCi0JCQkgKiBGaXhlZCBJTyBQb3J0IFJlc291cmNlCi0JCQkgKi8KLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9yc19maXhlZF9pb19zdHJlYW0obGlua2VkX2xpc3QsICZidWZmZXIsCi0JCQkJCQkgICAgJmJ5dGVzX2NvbnN1bWVkKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SU1RZUEVfVkVORE9SOgotCQkJLyoKLQkJCSAqIFZlbmRvciBEZWZpbmVkIFJlc291cmNlCi0JCQkgKi8KLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9yc192ZW5kb3Jfc3RyZWFtKGxpbmtlZF9saXN0LCAmYnVmZmVyLAotCQkJCQkJICAmYnl0ZXNfY29uc3VtZWQpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTVFlQRV9FTkRfVEFHOgotCQkJLyoKLQkJCSAqIEVuZCBUYWcKLQkJCSAqLwotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX3JzX2VuZF90YWdfc3RyZWFtKGxpbmtlZF9saXN0LCAmYnVmZmVyLAotCQkJCQkJICAgJmJ5dGVzX2NvbnN1bWVkKTsKLQotCQkJLyogQW4gRW5kIFRhZyBpbmRpY2F0ZXMgdGhlIGVuZCBvZiB0aGUgUmVzb3VyY2UgVGVtcGxhdGUgKi8KLQotCQkJZG9uZSA9IFRSVUU7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUlNUWVBFX01FTTI0OgotCQkJLyoKLQkJCSAqIDI0LUJpdCBNZW1vcnkgUmVzb3VyY2UKLQkJCSAqLwotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX3JzX21lbW9yeTI0X3N0cmVhbShsaW5rZWRfbGlzdCwgJmJ1ZmZlciwKLQkJCQkJCSAgICAmYnl0ZXNfY29uc3VtZWQpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTVFlQRV9NRU0zMjoKLQkJCS8qCi0JCQkgKiAzMi1CaXQgTWVtb3J5IFJhbmdlIFJlc291cmNlCi0JCQkgKi8KLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9yc19tZW1vcnkzMl9yYW5nZV9zdHJlYW0obGlua2VkX2xpc3QsICZidWZmZXIsCi0JCQkJCQkJICAmYnl0ZXNfY29uc3VtZWQpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTVFlQRV9GSVhFRF9NRU0zMjoKLQkJCS8qCi0JCQkgKiAzMi1CaXQgRml4ZWQgTWVtb3J5IFJlc291cmNlCi0JCQkgKi8KLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9yc19maXhlZF9tZW1vcnkzMl9zdHJlYW0obGlua2VkX2xpc3QsICZidWZmZXIsCi0JCQkJCQkJICAmYnl0ZXNfY29uc3VtZWQpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTVFlQRV9BRERSRVNTMTY6Ci0JCQkvKgotCQkJICogMTYtQml0IEFkZHJlc3MgRGVzY3JpcHRvciBSZXNvdXJjZQotCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX2FkZHJlc3MxNl9zdHJlYW0obGlua2VkX2xpc3QsICZidWZmZXIsCi0JCQkJCQkJICAmYnl0ZXNfY29uc3VtZWQpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTVFlQRV9BRERSRVNTMzI6Ci0JCQkvKgotCQkJICogMzItQml0IEFkZHJlc3MgRGVzY3JpcHRvciBSZXNvdXJjZQotCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX2FkZHJlc3MzMl9zdHJlYW0obGlua2VkX2xpc3QsICZidWZmZXIsCi0JCQkJCQkJICAmYnl0ZXNfY29uc3VtZWQpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTVFlQRV9BRERSRVNTNjQ6Ci0JCQkvKgotCQkJICogNjQtQml0IEFkZHJlc3MgRGVzY3JpcHRvciBSZXNvdXJjZQotCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX3JzX2FkZHJlc3M2NF9zdHJlYW0obGlua2VkX2xpc3QsICZidWZmZXIsCi0JCQkJCQkJICAmYnl0ZXNfY29uc3VtZWQpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTVFlQRV9FWFRfSVJROgotCQkJLyoKLQkJCSAqIEV4dGVuZGVkIElSUSBSZXNvdXJjZQotCQkJICovCi0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfcnNfZXh0ZW5kZWRfaXJxX3N0cmVhbShsaW5rZWRfbGlzdCwgJmJ1ZmZlciwKLQkJCQkJCQkmYnl0ZXNfY29uc3VtZWQpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCS8qCi0JCQkgKiBJZiB3ZSBnZXQgaGVyZSwgZXZlcnl0aGluZyBpcyBvdXQgb2Ygc3luYywKLQkJCSAqIHNvIGV4aXQgd2l0aCBhbiBlcnJvcgotCQkJICovCi0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJJbnZhbGlkIGRlc2NyaXB0b3IgdHlwZSAoJVgpIGluIHJlc291cmNlIGxpc3RcbiIsCi0JCQkJCSAgbGlua2VkX2xpc3QtPmlkKSk7Ci0JCQlzdGF0dXMgPSBBRV9CQURfREFUQTsKLQkJCWJyZWFrOworCQlpZiAocmVzb3VyY2UtPnR5cGUgPiBBQ1BJX1JFU09VUkNFX1RZUEVfTUFYKSB7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkludmFsaWQgZGVzY3JpcHRvciB0eXBlICglWCkgaW4gcmVzb3VyY2UgbGlzdFxuIiwgcmVzb3VyY2UtPnR5cGUpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfREFUQSk7CiAJCX0KIAorCQkvKiBQZXJmb3JtIHRoZSBjb252ZXJzaW9uICovCisKKwkJc3RhdHVzID0gYWNwaV9yc19jb252ZXJ0X3Jlc291cmNlX3RvX2FtbChyZXNvdXJjZSwKKwkJCQkJCQkgQUNQSV9DQVNUX1BUUih1bmlvbgorCQkJCQkJCQkgICAgICAgYW1sX3Jlc291cmNlLAorCQkJCQkJCQkgICAgICAgYW1sKSwKKwkJCQkJCQkgYWNwaV9nYmxfc2V0X3Jlc291cmNlX2Rpc3BhdGNoCisJCQkJCQkJIFtyZXNvdXJjZS0+dHlwZV0pOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IGNvbnZlcnQgcmVzb3VyY2UgKHR5cGUgJVgpIHRvIEFNTCwgJXNcbiIsIHJlc291cmNlLT50eXBlLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKworCQkvKiBQZXJmb3JtIGZpbmFsIHNhbml0eSBjaGVjayBvbiB0aGUgbmV3IEFNTCByZXNvdXJjZSBkZXNjcmlwdG9yICovCisKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfdXRfdmFsaWRhdGVfcmVzb3VyY2UoQUNQSV9DQVNUX1BUUgorCQkJCQkgICAgICAodW5pb24gYW1sX3Jlc291cmNlLCBhbWwpLCBOVUxMKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCi0JCS8qIFNldCB0aGUgQnVmZmVyIHRvIHBvaW50IHRvIHRoZSBvcGVuIGJ5dGUgKi8KKwkJLyogQ2hlY2sgZm9yIGVuZC1vZi1saXN0LCBub3JtYWwgZXhpdCAqLwogCi0JCWJ1ZmZlciArPSBieXRlc19jb25zdW1lZDsKKwkJaWYgKHJlc291cmNlLT50eXBlID09IEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfVEFHKSB7CisJCQkvKiBBbiBFbmQgVGFnIGluZGljYXRlcyB0aGUgZW5kIG9mIHRoZSBpbnB1dCBSZXNvdXJjZSBUZW1wbGF0ZSAqLwogCi0JCS8qIFBvaW50IHRvIHRoZSBuZXh0IG9iamVjdCAqLworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwkJfQogCi0JCWxpbmtlZF9saXN0ID0gQUNQSV9QVFJfQUREKHN0cnVjdCBhY3BpX3Jlc291cmNlLAotCQkJCQkgICBsaW5rZWRfbGlzdCwgbGlua2VkX2xpc3QtPmxlbmd0aCk7CisJCS8qCisJCSAqIEV4dHJhY3QgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgbmV3IGRlc2NyaXB0b3IgYW5kIHNldCB0aGUKKwkJICogQW1sIHRvIHBvaW50IHRvIHRoZSBuZXh0IChvdXRwdXQpIHJlc291cmNlIGRlc2NyaXB0b3IKKwkJICovCisJCWFtbCArPSBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX2xlbmd0aChhbWwpOworCisJCS8qIFBvaW50IHRvIHRoZSBuZXh0IGlucHV0IHJlc291cmNlIGRlc2NyaXB0b3IgKi8KKworCQlyZXNvdXJjZSA9CisJCSAgICBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlfcmVzb3VyY2UsIHJlc291cmNlLAorCQkJCSByZXNvdXJjZS0+bGVuZ3RoKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCS8qIENvbXBsZXRlZCBidWZmZXIsIGJ1dCBkaWQgbm90IGZpbmQgYW4gZW5kX3RhZyByZXNvdXJjZSBkZXNjcmlwdG9yICovCisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX1JFU09VUkNFX0VORF9UQUcpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21lbW9yeS5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21lbW9yeS5jCmluZGV4IGRhYmExYTEuLmE1MTMxOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtZW1vcnkuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbWVtb3J5LmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNDksNDU0ICs0OSwxODcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19tZW1vcnkyNF9yZXNvdXJjZQotICoKLSAqIFBBUkFNRVRFUlM6ICBieXRlX3N0cmVhbV9idWZmZXIgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGlucHV0IGJ5dGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbQotICogICAgICAgICAgICAgIGJ5dGVzX2NvbnN1bWVkICAgICAgICAgIC0gUG9pbnRlciB0byB3aGVyZSB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lZCB0aGUgYnl0ZV9zdHJlYW1fYnVmZmVyIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZAotICogICAgICAgICAgICAgIG91dHB1dF9idWZmZXIgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmV0dXJuIGRhdGEgYnVmZmVyCi0gKiAgICAgICAgICAgICAgc3RydWN0dXJlX3NpemUgICAgICAgICAgLSBQb2ludGVyIHRvIHdoZXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByZXR1cm4gZGF0YSBzdHJ1Y3QgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRha2UgdGhlIHJlc291cmNlIGJ5dGUgc3RyZWFtIGFuZCBmaWxsIG91dCB0aGUgYXBwcm9wcmlhdGUKLSAqICAgICAgICAgICAgICBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSB0aGUgb3V0cHV0X2J1ZmZlci4gUmV0dXJuIHRoZQotICogICAgICAgICAgICAgIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBmcm9tIHRoZSBieXRlIHN0cmVhbS4KKyAqIGFjcGlfcnNfY29udmVydF9tZW1vcnkyNAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV9yc19tZW1vcnkyNF9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCSAgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCi0JCQkgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKQotewotCXU4ICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSpvdXRwdXRfYnVmZmVyOwotCXUxNiB0ZW1wMTYgPSAwOwotCXU4IHRlbXA4ID0gMDsKLQlhY3BpX3NpemUgc3RydWN0X3NpemUgPQotCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0yNCk7CitzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfbWVtb3J5MjRbNF0gPSB7CisJe0FDUElfUlNDX0lOSVRHRVQsIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkyNCwKKwkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX21lbW9yeTI0KSwKKwkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX2NvbnZlcnRfbWVtb3J5MjQpfSwKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX21lbW9yeTI0X3Jlc291cmNlIik7CisJe0FDUElfUlNDX0lOSVRTRVQsIEFDUElfUkVTT1VSQ0VfTkFNRV9NRU1PUlkyNCwKKwkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfbWVtb3J5MjQpLAorCSAwfSwKIAotCS8qIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgKi8KKwkvKiBSZWFkL1dyaXRlIGJpdCAqLwogCi0JYnVmZmVyICs9IDE7Ci0KLQlBQ1BJX01PVkVfMTZfVE9fMTYoJnRlbXAxNiwgYnVmZmVyKTsKLQlidWZmZXIgKz0gMjsKLQkqYnl0ZXNfY29uc3VtZWQgPSAoYWNwaV9zaXplKSB0ZW1wMTYgKyAzOwotCW91dHB1dF9zdHJ1Y3QtPmlkID0gQUNQSV9SU1RZUEVfTUVNMjQ7Ci0KLQkvKiBDaGVjayBCeXRlIDMgdGhlIFJlYWQvV3JpdGUgYml0ICovCi0KLQl0ZW1wOCA9ICpidWZmZXI7Ci0JYnVmZmVyICs9IDE7Ci0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkyNC5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA9IHRlbXA4ICYgMHgwMTsKLQotCS8qIEdldCBtaW5fYmFzZV9hZGRyZXNzIChCeXRlcyA0LTUpICovCi0KLQlBQ1BJX01PVkVfMTZfVE9fMTYoJnRlbXAxNiwgYnVmZmVyKTsKLQlidWZmZXIgKz0gMjsKLQlvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTI0Lm1pbl9iYXNlX2FkZHJlc3MgPSB0ZW1wMTY7Ci0KLQkvKiBHZXQgbWF4X2Jhc2VfYWRkcmVzcyAoQnl0ZXMgNi03KSAqLwotCi0JQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7Ci0JYnVmZmVyICs9IDI7Ci0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkyNC5tYXhfYmFzZV9hZGRyZXNzID0gdGVtcDE2OwotCi0JLyogR2V0IEFsaWdubWVudCAoQnl0ZXMgOC05KSAqLwotCi0JQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7Ci0JYnVmZmVyICs9IDI7Ci0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkyNC5hbGlnbm1lbnQgPSB0ZW1wMTY7Ci0KLQkvKiBHZXQgcmFuZ2VfbGVuZ3RoIChCeXRlcyAxMC0xMSkgKi8KLQotCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwotCW91dHB1dF9zdHJ1Y3QtPmRhdGEubWVtb3J5MjQucmFuZ2VfbGVuZ3RoID0gdGVtcDE2OwotCi0JLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCi0KLQlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKLQotCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCi0KLQkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQorCXtBQ1BJX1JTQ18xQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5tZW1vcnkyNC53cml0ZV9wcm90ZWN0KSwKKwkgQU1MX09GRlNFVChtZW1vcnkyNC5mbGFncyksCisJIDB9LAorCS8qCisJICogVGhlc2UgZmllbGRzIGFyZSBjb250aWd1b3VzIGluIGJvdGggdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb246CisJICogTWluaW11bSBCYXNlIEFkZHJlc3MKKwkgKiBNYXhpbXVtIEJhc2UgQWRkcmVzcworCSAqIEFkZHJlc3MgQmFzZSBBbGlnbm1lbnQKKwkgKiBSYW5nZSBMZW5ndGgKKwkgKi8KKwl7QUNQSV9SU0NfTU9WRTE2LCBBQ1BJX1JTX09GRlNFVChkYXRhLm1lbW9yeTI0Lm1pbmltdW0pLAorCSBBTUxfT0ZGU0VUKG1lbW9yeTI0Lm1pbmltdW0pLAorCSA0fQorfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19tZW1vcnkyNF9zdHJlYW0KLSAqCi0gKiBQQVJBTUVURVJTOiAgbGlua2VkX2xpc3QgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXNvdXJjZSBsaW5rZWQgbGlzdAotICogICAgICAgICAgICAgIG91dHB1dF9idWZmZXIgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgdXNlcidzIHJldHVybiBidWZmZXIKLSAqICAgICAgICAgICAgICBieXRlc19jb25zdW1lZCAgICAgICAgICAtIFBvaW50ZXIgdG8gd2hlcmUgdGhlIG51bWJlciBvZiBieXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgb3V0cHV0X2J1ZmZlciBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGFrZSB0aGUgbGlua2VkIGxpc3QgcmVzb3VyY2Ugc3RydWN0dXJlIGFuZCBmaWxscyBpbiB0aGUKLSAqICAgICAgICAgICAgICB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gYSBieXRlIHN0cmVhbQorICogYWNwaV9yc19jb252ZXJ0X21lbW9yeTMyCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfcnNfbWVtb3J5MjRfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKLQkJCXU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKQotewotCXU4ICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKLQl1MTYgdGVtcDE2ID0gMDsKLQl1OCB0ZW1wOCA9IDA7CitzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfbWVtb3J5MzJbNF0gPSB7CisJe0FDUElfUlNDX0lOSVRHRVQsIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkzMiwKKwkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX21lbW9yeTMyKSwKKwkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX2NvbnZlcnRfbWVtb3J5MzIpfSwKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX21lbW9yeTI0X3N0cmVhbSIpOworCXtBQ1BJX1JTQ19JTklUU0VULCBBQ1BJX1JFU09VUkNFX05BTUVfTUVNT1JZMzIsCisJIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX21lbW9yeTMyKSwKKwkgMH0sCiAKLQkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KKwkvKiBSZWFkL1dyaXRlIGJpdCAqLwogCi0JKmJ1ZmZlciA9IDB4ODE7Ci0JYnVmZmVyICs9IDE7Ci0KLQkvKiBUaGUgbGVuZ3RoIGZpZWxkIGlzIHN0YXRpYyAqLwotCi0JdGVtcDE2ID0gMHgwOTsKLQlBQ1BJX01PVkVfMTZfVE9fMTYoYnVmZmVyLCAmdGVtcDE2KTsKLQlidWZmZXIgKz0gMjsKLQotCS8qIFNldCB0aGUgSW5mb3JtYXRpb24gQnl0ZSAqLwotCi0JdGVtcDggPSAodTgpIChsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkyNC5yZWFkX3dyaXRlX2F0dHJpYnV0ZSAmIDB4MDEpOwotCSpidWZmZXIgPSB0ZW1wODsKLQlidWZmZXIgKz0gMTsKLQotCS8qIFNldCB0aGUgUmFuZ2UgbWluaW11bSBiYXNlIGFkZHJlc3MgKi8KLQotCUFDUElfTU9WRV8zMl9UT18xNihidWZmZXIsCi0JCQkgICAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MjQubWluX2Jhc2VfYWRkcmVzcyk7Ci0JYnVmZmVyICs9IDI7Ci0KLQkvKiBTZXQgdGhlIFJhbmdlIG1heGltdW0gYmFzZSBhZGRyZXNzICovCi0KLQlBQ1BJX01PVkVfMzJfVE9fMTYoYnVmZmVyLAotCQkJICAgJmxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTI0Lm1heF9iYXNlX2FkZHJlc3MpOwotCWJ1ZmZlciArPSAyOwotCi0JLyogU2V0IHRoZSBiYXNlIGFsaWdubWVudCAqLwotCi0JQUNQSV9NT1ZFXzMyX1RPXzE2KGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTI0LmFsaWdubWVudCk7Ci0JYnVmZmVyICs9IDI7Ci0KLQkvKiBTZXQgdGhlIHJhbmdlIGxlbmd0aCAqLwotCi0JQUNQSV9NT1ZFXzMyX1RPXzE2KGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTI0LnJhbmdlX2xlbmd0aCk7Ci0JYnVmZmVyICs9IDI7Ci0KLQkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLwotCi0JKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRihidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQorCXtBQ1BJX1JTQ18xQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5tZW1vcnkzMi53cml0ZV9wcm90ZWN0KSwKKwkgQU1MX09GRlNFVChtZW1vcnkzMi5mbGFncyksCisJIDB9LAorCS8qCisJICogVGhlc2UgZmllbGRzIGFyZSBjb250aWd1b3VzIGluIGJvdGggdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb246CisJICogTWluaW11bSBCYXNlIEFkZHJlc3MKKwkgKiBNYXhpbXVtIEJhc2UgQWRkcmVzcworCSAqIEFkZHJlc3MgQmFzZSBBbGlnbm1lbnQKKwkgKiBSYW5nZSBMZW5ndGgKKwkgKi8KKwl7QUNQSV9SU0NfTU9WRTMyLCBBQ1BJX1JTX09GRlNFVChkYXRhLm1lbW9yeTMyLm1pbmltdW0pLAorCSBBTUxfT0ZGU0VUKG1lbW9yeTMyLm1pbmltdW0pLAorCSA0fQorfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19tZW1vcnkzMl9yYW5nZV9yZXNvdXJjZQotICoKLSAqIFBBUkFNRVRFUlM6ICBieXRlX3N0cmVhbV9idWZmZXIgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGlucHV0IGJ5dGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbQotICogICAgICAgICAgICAgIGJ5dGVzX2NvbnN1bWVkICAgICAgICAgIC0gUG9pbnRlciB0byB3aGVyZSB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lZCB0aGUgYnl0ZV9zdHJlYW1fYnVmZmVyIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZAotICogICAgICAgICAgICAgIG91dHB1dF9idWZmZXIgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmV0dXJuIGRhdGEgYnVmZmVyCi0gKiAgICAgICAgICAgICAgc3RydWN0dXJlX3NpemUgICAgICAgICAgLSBQb2ludGVyIHRvIHdoZXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByZXR1cm4gZGF0YSBzdHJ1Y3QgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRha2UgdGhlIHJlc291cmNlIGJ5dGUgc3RyZWFtIGFuZCBmaWxsIG91dCB0aGUgYXBwcm9wcmlhdGUKLSAqICAgICAgICAgICAgICBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSB0aGUgb3V0cHV0X2J1ZmZlci4gUmV0dXJuIHRoZQotICogICAgICAgICAgICAgIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBmcm9tIHRoZSBieXRlIHN0cmVhbS4KKyAqIGFjcGlfcnNfY29udmVydF9maXhlZF9tZW1vcnkzMgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX3JzX21lbW9yeTMyX3JhbmdlX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkJCWFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAotCQkJCXU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKQotewotCXU4ICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSpvdXRwdXRfYnVmZmVyOwotCXUxNiB0ZW1wMTYgPSAwOwotCXU4IHRlbXA4ID0gMDsKLQlhY3BpX3NpemUgc3RydWN0X3NpemUgPQotCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0zMik7CitzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfZml4ZWRfbWVtb3J5MzJbNF0gPSB7CisJe0FDUElfUlNDX0lOSVRHRVQsIEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9NRU1PUlkzMiwKKwkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX21lbW9yeTMyKSwKKwkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX2NvbnZlcnRfZml4ZWRfbWVtb3J5MzIpfSwKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX21lbW9yeTMyX3JhbmdlX3Jlc291cmNlIik7CisJe0FDUElfUlNDX0lOSVRTRVQsIEFDUElfUkVTT1VSQ0VfTkFNRV9GSVhFRF9NRU1PUlkzMiwKKwkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfZml4ZWRfbWVtb3J5MzIpLAorCSAwfSwKIAotCS8qIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgKi8KKwkvKiBSZWFkL1dyaXRlIGJpdCAqLwogCi0JYnVmZmVyICs9IDE7CisJe0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmZpeGVkX21lbW9yeTMyLndyaXRlX3Byb3RlY3QpLAorCSBBTUxfT0ZGU0VUKGZpeGVkX21lbW9yeTMyLmZsYWdzKSwKKwkgMH0sCisJLyoKKwkgKiBUaGVzZSBmaWVsZHMgYXJlIGNvbnRpZ3VvdXMgaW4gYm90aCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbjoKKwkgKiBCYXNlIEFkZHJlc3MKKwkgKiBSYW5nZSBMZW5ndGgKKwkgKi8KKwl7QUNQSV9SU0NfTU9WRTMyLCBBQ1BJX1JTX09GRlNFVChkYXRhLmZpeGVkX21lbW9yeTMyLmFkZHJlc3MpLAorCSBBTUxfT0ZGU0VUKGZpeGVkX21lbW9yeTMyLmFkZHJlc3MpLAorCSAyfQorfTsKIAotCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOwotCWJ1ZmZlciArPSAyOwotCSpieXRlc19jb25zdW1lZCA9IChhY3BpX3NpemUpIHRlbXAxNiArIDM7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGFjcGlfcnNfZ2V0X3ZlbmRvcl9zbWFsbAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQlvdXRwdXRfc3RydWN0LT5pZCA9IEFDUElfUlNUWVBFX01FTTMyOworc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19nZXRfdmVuZG9yX3NtYWxsWzNdID0geworCXtBQ1BJX1JTQ19JTklUR0VULCBBQ1BJX1JFU09VUkNFX1RZUEVfVkVORE9SLAorCSBBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yKSwKKwkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX2dldF92ZW5kb3Jfc21hbGwpfSwKKworCS8qIExlbmd0aCBvZiB0aGUgdmVuZG9yIGRhdGEgKGJ5dGUgY291bnQpICovCisKKwl7QUNQSV9SU0NfQ09VTlQxNiwgQUNQSV9SU19PRkZTRVQoZGF0YS52ZW5kb3IuYnl0ZV9sZW5ndGgpLAorCSAwLAorCSBzaXplb2YodTgpfQorCSwKKworCS8qIFZlbmRvciBkYXRhICovCisKKwl7QUNQSV9SU0NfTU9WRTgsIEFDUElfUlNfT0ZGU0VUKGRhdGEudmVuZG9yLmJ5dGVfZGF0YVswXSksCisJIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX3NtYWxsX2hlYWRlciksCisJIDB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGFjcGlfcnNfZ2V0X3ZlbmRvcl9sYXJnZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfZ2V0X3ZlbmRvcl9sYXJnZVszXSA9IHsKKwl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX1ZFTkRPUiwKKwkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvciksCisJIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19nZXRfdmVuZG9yX2xhcmdlKX0sCisKKwkvKiBMZW5ndGggb2YgdGhlIHZlbmRvciBkYXRhIChieXRlIGNvdW50KSAqLworCisJe0FDUElfUlNDX0NPVU5UMTYsIEFDUElfUlNfT0ZGU0VUKGRhdGEudmVuZG9yLmJ5dGVfbGVuZ3RoKSwKKwkgMCwKKwkgc2l6ZW9mKHU4KX0KKwksCisKKwkvKiBWZW5kb3IgZGF0YSAqLworCisJe0FDUElfUlNDX01PVkU4LCBBQ1BJX1JTX09GRlNFVChkYXRhLnZlbmRvci5ieXRlX2RhdGFbMF0pLAorCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9sYXJnZV9oZWFkZXIpLAorCSAwfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhY3BpX3JzX3NldF92ZW5kb3IKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX3NldF92ZW5kb3JbN10gPSB7CisJLyogRGVmYXVsdCBpcyBhIHNtYWxsIHZlbmRvciBkZXNjcmlwdG9yICovCisKKwl7QUNQSV9SU0NfSU5JVFNFVCwgQUNQSV9SRVNPVVJDRV9OQU1FX1ZFTkRPUl9TTUFMTCwKKwkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2Vfc21hbGxfaGVhZGVyKSwKKwkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX3NldF92ZW5kb3IpfSwKKworCS8qIEdldCB0aGUgbGVuZ3RoIGFuZCBjb3B5IHRoZSBkYXRhICovCisKKwl7QUNQSV9SU0NfQ09VTlQxNiwgQUNQSV9SU19PRkZTRVQoZGF0YS52ZW5kb3IuYnl0ZV9sZW5ndGgpLAorCSAwLAorCSAwfSwKKworCXtBQ1BJX1JTQ19NT1ZFOCwgQUNQSV9SU19PRkZTRVQoZGF0YS52ZW5kb3IuYnl0ZV9kYXRhWzBdKSwKKwkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2Vfc21hbGxfaGVhZGVyKSwKKwkgMH0sCiAKIAkvKgotCSAqICBQb2ludCB0byB0aGUgcGxhY2UgaW4gdGhlIG91dHB1dCBidWZmZXIgd2hlcmUgdGhlIGRhdGEgcG9ydGlvbiB3aWxsCi0JICogIGJlZ2luLgotCSAqICAxLiBTZXQgdGhlIFJFU09VUkNFX0RBVEEgKiBEYXRhIHRvIHBvaW50IHRvIGl0cyBvd24gYWRkcmVzcywgdGhlbgotCSAqICAyLiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIG5leHQgYWRkcmVzcy4KLQkgKgotCSAqICBOT1RFOiBvdXRwdXRfc3RydWN0LT5EYXRhIGlzIGNhc3QgdG8gdTgsIG90aGVyd2lzZSwgdGhpcyBhZGRpdGlvbiBhZGRzCi0JICogIDQgKiBzaXplb2YoUkVTT1VSQ0VfREFUQSkgaW5zdGVhZCBvZiA0ICogc2l6ZW9mKHU4KQorCSAqIEFsbCBkb25lIGlmIHRoZSBWZW5kb3IgYnl0ZSBsZW5ndGggaXMgNyBvciBsZXNzLCBtZWFuaW5nIHRoYXQgaXQgd2lsbAorCSAqIGZpdCB3aXRoaW4gYSBzbWFsbCBkZXNjcmlwdG9yCiAJICovCisJe0FDUElfUlNDX0VYSVRfTEUsIDAsIDAsIDd9LAogCi0JLyogQ2hlY2sgQnl0ZSAzIHRoZSBSZWFkL1dyaXRlIGJpdCAqLworCS8qIE11c3QgY3JlYXRlIGEgbGFyZ2UgdmVuZG9yIGRlc2NyaXB0b3IgKi8KIAotCXRlbXA4ID0gKmJ1ZmZlcjsKLQlidWZmZXIgKz0gMTsKKwl7QUNQSV9SU0NfSU5JVFNFVCwgQUNQSV9SRVNPVVJDRV9OQU1FX1ZFTkRPUl9MQVJHRSwKKwkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfbGFyZ2VfaGVhZGVyKSwKKwkgMH0sCiAKLQlvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTMyLnJlYWRfd3JpdGVfYXR0cmlidXRlID0gdGVtcDggJiAweDAxOworCXtBQ1BJX1JTQ19DT1VOVDE2LCBBQ1BJX1JTX09GRlNFVChkYXRhLnZlbmRvci5ieXRlX2xlbmd0aCksCisJIDAsCisJIDB9LAogCi0JLyogR2V0IG1pbl9iYXNlX2FkZHJlc3MgKEJ5dGVzIDQtNykgKi8KLQotCUFDUElfTU9WRV8zMl9UT18zMigmb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkzMi5taW5fYmFzZV9hZGRyZXNzLAotCQkJICAgYnVmZmVyKTsKLQlidWZmZXIgKz0gNDsKLQotCS8qIEdldCBtYXhfYmFzZV9hZGRyZXNzIChCeXRlcyA4LTExKSAqLwotCi0JQUNQSV9NT1ZFXzMyX1RPXzMyKCZvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTMyLm1heF9iYXNlX2FkZHJlc3MsCi0JCQkgICBidWZmZXIpOwotCWJ1ZmZlciArPSA0OwotCi0JLyogR2V0IEFsaWdubWVudCAoQnl0ZXMgMTItMTUpICovCi0KLQlBQ1BJX01PVkVfMzJfVE9fMzIoJm91dHB1dF9zdHJ1Y3QtPmRhdGEubWVtb3J5MzIuYWxpZ25tZW50LCBidWZmZXIpOwotCWJ1ZmZlciArPSA0OwotCi0JLyogR2V0IHJhbmdlX2xlbmd0aCAoQnl0ZXMgMTYtMTkpICovCi0KLQlBQ1BJX01PVkVfMzJfVE9fMzIoJm91dHB1dF9zdHJ1Y3QtPmRhdGEubWVtb3J5MzIucmFuZ2VfbGVuZ3RoLCBidWZmZXIpOwotCi0JLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCi0KLQlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKLQotCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCi0KLQkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2ZpeGVkX21lbW9yeTMyX3Jlc291cmNlCi0gKgotICogUEFSQU1FVEVSUzogIGJ5dGVfc3RyZWFtX2J1ZmZlciAgICAgIC0gUG9pbnRlciB0byB0aGUgcmVzb3VyY2UgaW5wdXQgYnl0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtCi0gKiAgICAgICAgICAgICAgYnl0ZXNfY29uc3VtZWQgICAgICAgICAgLSBQb2ludGVyIHRvIHdoZXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVkIHRoZSBieXRlX3N0cmVhbV9idWZmZXIgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgb3V0cHV0X2J1ZmZlciAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXR1cm4gZGF0YSBidWZmZXIKLSAqICAgICAgICAgICAgICBzdHJ1Y3R1cmVfc2l6ZSAgICAgICAgICAtIFBvaW50ZXIgdG8gd2hlcmUgdGhlIG51bWJlciBvZiBieXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJldHVybiBkYXRhIHN0cnVjdCBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGFrZSB0aGUgcmVzb3VyY2UgYnl0ZSBzdHJlYW0gYW5kIGZpbGwgb3V0IHRoZSBhcHByb3ByaWF0ZQotICogICAgICAgICAgICAgIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IHRoZSBvdXRwdXRfYnVmZmVyLiBSZXR1cm4gdGhlCi0gKiAgICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGZyb20gdGhlIGJ5dGUgc3RyZWFtLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3JzX2ZpeGVkX21lbW9yeTMyX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkJCWFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAotCQkJCXU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKQotewotCXU4ICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSpvdXRwdXRfYnVmZmVyOwotCXUxNiB0ZW1wMTYgPSAwOwotCXU4IHRlbXA4ID0gMDsKLQlhY3BpX3NpemUgc3RydWN0X3NpemUgPQotCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW0zMik7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19maXhlZF9tZW1vcnkzMl9yZXNvdXJjZSIpOwotCi0JLyogUG9pbnQgcGFzdCB0aGUgRGVzY3JpcHRvciB0byBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCAqLwotCi0JYnVmZmVyICs9IDE7Ci0JQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7Ci0KLQlidWZmZXIgKz0gMjsKLQkqYnl0ZXNfY29uc3VtZWQgPSAoYWNwaV9zaXplKSB0ZW1wMTYgKyAzOwotCi0Jb3V0cHV0X3N0cnVjdC0+aWQgPSBBQ1BJX1JTVFlQRV9GSVhFRF9NRU0zMjsKLQotCS8qIENoZWNrIEJ5dGUgMyB0aGUgUmVhZC9Xcml0ZSBiaXQgKi8KLQotCXRlbXA4ID0gKmJ1ZmZlcjsKLQlidWZmZXIgKz0gMTsKLQlvdXRwdXRfc3RydWN0LT5kYXRhLmZpeGVkX21lbW9yeTMyLnJlYWRfd3JpdGVfYXR0cmlidXRlID0gdGVtcDggJiAweDAxOwotCi0JLyogR2V0IHJhbmdlX2Jhc2VfYWRkcmVzcyAoQnl0ZXMgNC03KSAqLwotCi0JQUNQSV9NT1ZFXzMyX1RPXzMyKCZvdXRwdXRfc3RydWN0LT5kYXRhLmZpeGVkX21lbW9yeTMyLgotCQkJICAgcmFuZ2VfYmFzZV9hZGRyZXNzLCBidWZmZXIpOwotCWJ1ZmZlciArPSA0OwotCi0JLyogR2V0IHJhbmdlX2xlbmd0aCAoQnl0ZXMgOC0xMSkgKi8KLQotCUFDUElfTU9WRV8zMl9UT18zMigmb3V0cHV0X3N0cnVjdC0+ZGF0YS5maXhlZF9tZW1vcnkzMi5yYW5nZV9sZW5ndGgsCi0JCQkgICBidWZmZXIpOwotCi0JLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCi0KLQlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKLQotCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCi0KLQkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX21lbW9yeTMyX3JhbmdlX3N0cmVhbQotICoKLSAqIFBBUkFNRVRFUlM6ICBsaW5rZWRfbGlzdCAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGxpbmtlZCBsaXN0Ci0gKiAgICAgICAgICAgICAgb3V0cHV0X2J1ZmZlciAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSB1c2VyJ3MgcmV0dXJuIGJ1ZmZlcgotICogICAgICAgICAgICAgIGJ5dGVzX2NvbnN1bWVkICAgICAgICAgIC0gUG9pbnRlciB0byB3aGVyZSB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHRoZSBvdXRwdXRfYnVmZmVyIGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBUYWtlIHRoZSBsaW5rZWQgbGlzdCByZXNvdXJjZSBzdHJ1Y3R1cmUgYW5kIGZpbGxzIGluIHRoZQotICogICAgICAgICAgICAgIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiBhIGJ5dGUgc3RyZWFtCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfcnNfbWVtb3J5MzJfcmFuZ2Vfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKLQkJCSAgICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKQotewotCXU4ICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKLQl1MTYgdGVtcDE2ID0gMDsKLQl1OCB0ZW1wOCA9IDA7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19tZW1vcnkzMl9yYW5nZV9zdHJlYW0iKTsKLQotCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLwotCi0JKmJ1ZmZlciA9IDB4ODU7Ci0JYnVmZmVyICs9IDE7Ci0KLQkvKiBUaGUgbGVuZ3RoIGZpZWxkIGlzIHN0YXRpYyAqLwotCi0JdGVtcDE2ID0gMHgxMTsKLQotCUFDUElfTU9WRV8xNl9UT18xNihidWZmZXIsICZ0ZW1wMTYpOwotCWJ1ZmZlciArPSAyOwotCi0JLyogU2V0IHRoZSBJbmZvcm1hdGlvbiBCeXRlICovCi0KLQl0ZW1wOCA9ICh1OCkgKGxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTMyLnJlYWRfd3JpdGVfYXR0cmlidXRlICYgMHgwMSk7Ci0JKmJ1ZmZlciA9IHRlbXA4OwotCWJ1ZmZlciArPSAxOwotCi0JLyogU2V0IHRoZSBSYW5nZSBtaW5pbXVtIGJhc2UgYWRkcmVzcyAqLwotCi0JQUNQSV9NT1ZFXzMyX1RPXzMyKGJ1ZmZlciwKLQkJCSAgICZsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkzMi5taW5fYmFzZV9hZGRyZXNzKTsKLQlidWZmZXIgKz0gNDsKLQotCS8qIFNldCB0aGUgUmFuZ2UgbWF4aW11bSBiYXNlIGFkZHJlc3MgKi8KLQotCUFDUElfTU9WRV8zMl9UT18zMihidWZmZXIsCi0JCQkgICAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MzIubWF4X2Jhc2VfYWRkcmVzcyk7Ci0JYnVmZmVyICs9IDQ7Ci0KLQkvKiBTZXQgdGhlIGJhc2UgYWxpZ25tZW50ICovCi0KLQlBQ1BJX01PVkVfMzJfVE9fMzIoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MzIuYWxpZ25tZW50KTsKLQlidWZmZXIgKz0gNDsKLQotCS8qIFNldCB0aGUgcmFuZ2UgbGVuZ3RoICovCi0KLQlBQ1BJX01PVkVfMzJfVE9fMzIoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MzIucmFuZ2VfbGVuZ3RoKTsKLQlidWZmZXIgKz0gNDsKLQotCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCi0KLQkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZml4ZWRfbWVtb3J5MzJfc3RyZWFtCi0gKgotICogUEFSQU1FVEVSUzogIGxpbmtlZF9saXN0ICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmVzb3VyY2UgbGlua2VkIGxpc3QKLSAqICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHVzZXIncyByZXR1cm4gYnVmZmVyCi0gKiAgICAgICAgICAgICAgYnl0ZXNfY29uc3VtZWQgICAgICAgICAgLSBQb2ludGVyIHRvIHdoZXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gdGhlIG91dHB1dF9idWZmZXIgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRha2UgdGhlIGxpbmtlZCBsaXN0IHJlc291cmNlIHN0cnVjdHVyZSBhbmQgZmlsbHMgaW4gdGhlCi0gKiAgICAgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluIGEgYnl0ZSBzdHJlYW0KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9yc19maXhlZF9tZW1vcnkzMl9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAotCQkJICAgICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpCi17Ci0JdTggKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOwotCXUxNiB0ZW1wMTYgPSAwOwotCXU4IHRlbXA4ID0gMDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2ZpeGVkX21lbW9yeTMyX3N0cmVhbSIpOwotCi0JLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCi0KLQkqYnVmZmVyID0gMHg4NjsKLQlidWZmZXIgKz0gMTsKLQotCS8qIFRoZSBsZW5ndGggZmllbGQgaXMgc3RhdGljICovCi0KLQl0ZW1wMTYgPSAweDA5OwotCi0JQUNQSV9NT1ZFXzE2X1RPXzE2KGJ1ZmZlciwgJnRlbXAxNik7Ci0JYnVmZmVyICs9IDI7Ci0KLQkvKiBTZXQgdGhlIEluZm9ybWF0aW9uIEJ5dGUgKi8KLQotCXRlbXA4ID0KLQkgICAgKHU4KSAobGlua2VkX2xpc3QtPmRhdGEuZml4ZWRfbWVtb3J5MzIucmVhZF93cml0ZV9hdHRyaWJ1dGUgJiAweDAxKTsKLQkqYnVmZmVyID0gdGVtcDg7Ci0JYnVmZmVyICs9IDE7Ci0KLQkvKiBTZXQgdGhlIFJhbmdlIGJhc2UgYWRkcmVzcyAqLwotCi0JQUNQSV9NT1ZFXzMyX1RPXzMyKGJ1ZmZlciwKLQkJCSAgICZsaW5rZWRfbGlzdC0+ZGF0YS5maXhlZF9tZW1vcnkzMi4KLQkJCSAgIHJhbmdlX2Jhc2VfYWRkcmVzcyk7Ci0JYnVmZmVyICs9IDQ7Ci0KLQkvKiBTZXQgdGhlIHJhbmdlIGxlbmd0aCAqLwotCi0JQUNQSV9NT1ZFXzMyX1RPXzMyKGJ1ZmZlciwKLQkJCSAgICZsaW5rZWRfbGlzdC0+ZGF0YS5maXhlZF9tZW1vcnkzMi5yYW5nZV9sZW5ndGgpOwotCWJ1ZmZlciArPSA0OwotCi0JLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KLQotCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KKwl7QUNQSV9SU0NfTU9WRTgsIEFDUElfUlNfT0ZGU0VUKGRhdGEudmVuZG9yLmJ5dGVfZGF0YVswXSksCisJIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2xhcmdlX2hlYWRlciksCisJIDB9Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21pc2MuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtaXNjLmMKaW5kZXggN2E4YTM0ZS4uODNiZmUwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21pc2MuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbWlzYy5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTQ3LDQ4MSArNDcsNDk1IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9SRVNPVVJDRVMKIEFDUElfTU9EVUxFX05BTUUoInJzbWlzYyIpCiAKKyNkZWZpbmUgSU5JVF9SRVNPVVJDRV9UWVBFKGkpICAgICAgIGktPnJlc291cmNlX29mZnNldAorI2RlZmluZSBJTklUX1JFU09VUkNFX0xFTkdUSChpKSAgICAgaS0+YW1sX29mZnNldAorI2RlZmluZSBJTklUX1RBQkxFX0xFTkdUSChpKSAgICAgICAgaS0+dmFsdWUKKyNkZWZpbmUgQ09NUEFSRV9PUENPREUoaSkgICAgICAgICAgIGktPnJlc291cmNlX29mZnNldAorI2RlZmluZSBDT01QQVJFX1RBUkdFVChpKSAgICAgICAgICAgaS0+YW1sX29mZnNldAorI2RlZmluZSBDT01QQVJFX1ZBTFVFKGkpICAgICAgICAgICAgaS0+dmFsdWUKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZW5kX3RhZ19yZXNvdXJjZQorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfY29udmVydF9hbWxfdG9fcmVzb3VyY2UKICAqCi0gKiBQQVJBTUVURVJTOiAgYnl0ZV9zdHJlYW1fYnVmZmVyICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXNvdXJjZSBpbnB1dCBieXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0KLSAqICAgICAgICAgICAgICBieXRlc19jb25zdW1lZCAgICAgICAgICAtIFBvaW50ZXIgdG8gd2hlcmUgdGhlIG51bWJlciBvZiBieXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZWQgdGhlIGJ5dGVfc3RyZWFtX2J1ZmZlciBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJldHVybiBkYXRhIGJ1ZmZlcgotICogICAgICAgICAgICAgIHN0cnVjdHVyZV9zaXplICAgICAgICAgIC0gUG9pbnRlciB0byB3aGVyZSB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmV0dXJuIGRhdGEgc3RydWN0IGlzIHJldHVybmVkCisgKiBQQVJBTUVURVJTOiAgUmVzb3VyY2UgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGRlc2NyaXB0b3IKKyAqICAgICAgICAgICAgICBBbWwgICAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIEFNTCBkZXNjcmlwdG9yIGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgSW5mbyAgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gYXBwcm9wcmlhdGUgY29udmVyc2lvbiB0YWJsZQogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogVGFrZSB0aGUgcmVzb3VyY2UgYnl0ZSBzdHJlYW0gYW5kIGZpbGwgb3V0IHRoZSBhcHByb3ByaWF0ZQotICogICAgICAgICAgICAgIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IHRoZSBvdXRwdXRfYnVmZmVyLiBSZXR1cm4gdGhlCi0gKiAgICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGZyb20gdGhlIGJ5dGUgc3RyZWFtLgorICogREVTQ1JJUFRJT046IENvbnZlcnQgYW4gZXh0ZXJuYWwgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IgdG8gdGhlIGNvcnJlc3BvbmRpbmcKKyAqICAgICAgICAgICAgICBpbnRlcm5hbCByZXNvdXJjZSBkZXNjcmlwdG9yCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2VuZF90YWdfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCi0JCQkgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpCithY3BpX3JzX2NvbnZlcnRfYW1sX3RvX3Jlc291cmNlKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwKKwkJCQl1bmlvbiBhbWxfcmVzb3VyY2UgKmFtbCwKKwkJCQlzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopKm91dHB1dF9idWZmZXI7Ci0JYWNwaV9zaXplIHN0cnVjdF9zaXplID0gQUNQSV9SRVNPVVJDRV9MRU5HVEg7CisJYWNwaV9yc19sZW5ndGggYW1sX3Jlc291cmNlX2xlbmd0aDsKKwl2b2lkICpzb3VyY2U7CisJdm9pZCAqZGVzdGluYXRpb247CisJY2hhciAqdGFyZ2V0OworCXU4IGNvdW50OworCXU4IGZsYWdzX21vZGUgPSBGQUxTRTsKKwl1MTYgaXRlbV9jb3VudCA9IDA7CisJdTE2IHRlbXAxNiA9IDA7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19lbmRfdGFnX3Jlc291cmNlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZ2V0X3Jlc291cmNlIik7CiAKLQkvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGlzIHN0YXRpYyAqLworCWlmICgoKGFjcGlfbmF0aXZlX3VpbnQpIHJlc291cmNlKSAmIDB4MykgeworCQlhY3BpX29zX3ByaW50ZgorCQkgICAgKCIqKioqIEdFVDogTWlzYWxpZ25lZCByZXNvdXJjZSBwb2ludGVyOiAlcCBUeXBlICUyLjJYIExlbiAlWFxuIiwKKwkJICAgICByZXNvdXJjZSwgcmVzb3VyY2UtPnR5cGUsIHJlc291cmNlLT5sZW5ndGgpOworCX0KIAotCSpieXRlc19jb25zdW1lZCA9IDI7CisJLyogRXh0cmFjdCB0aGUgcmVzb3VyY2UgTGVuZ3RoIGZpZWxkIChkb2VzIG5vdCBpbmNsdWRlIGhlYWRlciBsZW5ndGgpICovCiAKLQkvKiAgRmlsbCBvdXQgdGhlIHN0cnVjdHVyZSAqLwotCi0Jb3V0cHV0X3N0cnVjdC0+aWQgPSBBQ1BJX1JTVFlQRV9FTkRfVEFHOwotCi0JLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCi0KLQlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAwOwotCi0JLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KLQotCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZW5kX3RhZ19zdHJlYW0KLSAqCi0gKiBQQVJBTUVURVJTOiAgbGlua2VkX2xpc3QgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXNvdXJjZSBsaW5rZWQgbGlzdAotICogICAgICAgICAgICAgIG91dHB1dF9idWZmZXIgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgdXNlcidzIHJldHVybiBidWZmZXIKLSAqICAgICAgICAgICAgICBieXRlc19jb25zdW1lZCAgICAgICAgICAtIFBvaW50ZXIgdG8gd2hlcmUgdGhlIG51bWJlciBvZiBieXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgb3V0cHV0X2J1ZmZlciBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGFrZSB0aGUgbGlua2VkIGxpc3QgcmVzb3VyY2Ugc3RydWN0dXJlIGFuZCBmaWxscyBpbiB0aGUKLSAqICAgICAgICAgICAgICB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gYSBieXRlIHN0cmVhbQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3JzX2VuZF90YWdfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKLQkJICAgICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKQotewotCXU4ICpidWZmZXIgPSAqb3V0cHV0X2J1ZmZlcjsKLQl1OCB0ZW1wOCA9IDA7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19lbmRfdGFnX3N0cmVhbSIpOwotCi0JLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCi0KLQkqYnVmZmVyID0gMHg3OTsKLQlidWZmZXIgKz0gMTsKKwlhbWxfcmVzb3VyY2VfbGVuZ3RoID0gYWNwaV91dF9nZXRfcmVzb3VyY2VfbGVuZ3RoKGFtbCk7CiAKIAkvKgotCSAqIFNldCB0aGUgQ2hlY2tzdW0gLSB6ZXJvIG1lYW5zIHRoYXQgdGhlIHJlc291cmNlIGRhdGEgaXMgdHJlYXRlZCBhcyBpZgotCSAqIHRoZSBjaGVja3N1bSBvcGVyYXRpb24gc3VjY2VlZGVkIChBQ1BJIFNwZWMgMS4wYiBTZWN0aW9uIDYuNC4yLjgpCisJICogRmlyc3QgdGFibGUgZW50cnkgbXVzdCBiZSBBQ1BJX1JTQ19JTklUeHh4IGFuZCBtdXN0IGNvbnRhaW4gdGhlCisJICogdGFibGUgbGVuZ3RoICgjIG9mIHRhYmxlIGVudHJpZXMpCiAJICovCi0JdGVtcDggPSAwOworCWNvdW50ID0gSU5JVF9UQUJMRV9MRU5HVEgoaW5mbyk7CiAKLQkqYnVmZmVyID0gdGVtcDg7Ci0JYnVmZmVyICs9IDE7CisJd2hpbGUgKGNvdW50KSB7CisJCS8qCisJCSAqIFNvdXJjZSBpcyB0aGUgZXh0ZXJuYWwgQU1MIGJ5dGUgc3RyZWFtIGJ1ZmZlciwKKwkJICogZGVzdGluYXRpb24gaXMgdGhlIGludGVybmFsIHJlc291cmNlIGRlc2NyaXB0b3IKKwkJICovCisJCXNvdXJjZSA9IEFDUElfQUREX1BUUih2b2lkLCBhbWwsIGluZm8tPmFtbF9vZmZzZXQpOworCQlkZXN0aW5hdGlvbiA9CisJCSAgICBBQ1BJX0FERF9QVFIodm9pZCwgcmVzb3VyY2UsIGluZm8tPnJlc291cmNlX29mZnNldCk7CiAKLQkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLworCQlzd2l0Y2ggKGluZm8tPm9wY29kZSkgeworCQljYXNlIEFDUElfUlNDX0lOSVRHRVQ6CisJCQkvKgorCQkJICogR2V0IHRoZSByZXNvdXJjZSB0eXBlIGFuZCB0aGUgaW5pdGlhbCAobWluaW11bSkgbGVuZ3RoCisJCQkgKi8KKwkJCUFDUElfTUVNU0VUKHJlc291cmNlLCAwLCBJTklUX1JFU09VUkNFX0xFTkdUSChpbmZvKSk7CisJCQlyZXNvdXJjZS0+dHlwZSA9IElOSVRfUkVTT1VSQ0VfVFlQRShpbmZvKTsKKwkJCXJlc291cmNlLT5sZW5ndGggPSBJTklUX1JFU09VUkNFX0xFTkdUSChpbmZvKTsKKwkJCWJyZWFrOwogCi0JKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRihidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQorCQljYXNlIEFDUElfUlNDX0lOSVRTRVQ6CisJCQlicmVhazsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc192ZW5kb3JfcmVzb3VyY2UKLSAqCi0gKiBQQVJBTUVURVJTOiAgYnl0ZV9zdHJlYW1fYnVmZmVyICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXNvdXJjZSBpbnB1dCBieXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0KLSAqICAgICAgICAgICAgICBieXRlc19jb25zdW1lZCAgICAgICAgICAtIFBvaW50ZXIgdG8gd2hlcmUgdGhlIG51bWJlciBvZiBieXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZWQgdGhlIGJ5dGVfc3RyZWFtX2J1ZmZlciBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJldHVybiBkYXRhIGJ1ZmZlcgotICogICAgICAgICAgICAgIHN0cnVjdHVyZV9zaXplICAgICAgICAgIC0gUG9pbnRlciB0byB3aGVyZSB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmV0dXJuIGRhdGEgc3RydWN0IGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBUYWtlIHRoZSByZXNvdXJjZSBieXRlIHN0cmVhbSBhbmQgZmlsbCBvdXQgdGhlIGFwcHJvcHJpYXRlCi0gKiAgICAgICAgICAgICAgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgdGhlIG91dHB1dF9idWZmZXIuIFJldHVybiB0aGUKLSAqICAgICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgZnJvbSB0aGUgYnl0ZSBzdHJlYW0uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkJY2FzZSBBQ1BJX1JTQ19GTEFHSU5JVDoKIAotYWNwaV9zdGF0dXMKLWFjcGlfcnNfdmVuZG9yX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkJYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCi0JCQl1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSkKLXsKLQl1OCAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikqb3V0cHV0X2J1ZmZlcjsKLQl1MTYgdGVtcDE2ID0gMDsKLQl1OCB0ZW1wOCA9IDA7Ci0JdTggaW5kZXg7Ci0JYWNwaV9zaXplIHN0cnVjdF9zaXplID0KLQkgICAgQUNQSV9TSVpFT0ZfUkVTT1VSQ0Uoc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yKTsKKwkJCWZsYWdzX21vZGUgPSBUUlVFOworCQkJYnJlYWs7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc192ZW5kb3JfcmVzb3VyY2UiKTsKKwkJY2FzZSBBQ1BJX1JTQ18xQklURkxBRzoKKwkJCS8qCisJCQkgKiBNYXNrIGFuZCBzaGlmdCB0aGUgZmxhZyBiaXQKKwkJCSAqLworCQkJQUNQSV9TRVQ4KGRlc3RpbmF0aW9uKSA9ICh1OCkKKwkJCSAgICAoKEFDUElfR0VUOChzb3VyY2UpID4+IGluZm8tPnZhbHVlKSAmIDB4MDEpOworCQkJYnJlYWs7CiAKLQkvKiBEZXJlZmVyZW5jZSB0aGUgRGVzY3JpcHRvciB0byBmaW5kIGlmIHRoaXMgaXMgYSBsYXJnZSBvciBzbWFsbCBpdGVtLiAqLworCQljYXNlIEFDUElfUlNDXzJCSVRGTEFHOgorCQkJLyoKKwkJCSAqIE1hc2sgYW5kIHNoaWZ0IHRoZSBmbGFnIGJpdHMKKwkJCSAqLworCQkJQUNQSV9TRVQ4KGRlc3RpbmF0aW9uKSA9ICh1OCkKKwkJCSAgICAoKEFDUElfR0VUOChzb3VyY2UpID4+IGluZm8tPnZhbHVlKSAmIDB4MDMpOworCQkJYnJlYWs7CiAKLQl0ZW1wOCA9ICpidWZmZXI7CisJCWNhc2UgQUNQSV9SU0NfQ09VTlQ6CiAKLQlpZiAodGVtcDggJiAweDgwKSB7Ci0JCS8qIExhcmdlIEl0ZW0sIHBvaW50IHRvIHRoZSBsZW5ndGggZmllbGQgKi8KKwkJCWl0ZW1fY291bnQgPSBBQ1BJX0dFVDgoc291cmNlKTsKKwkJCUFDUElfU0VUOChkZXN0aW5hdGlvbikgPSAodTgpIGl0ZW1fY291bnQ7CiAKLQkJYnVmZmVyICs9IDE7CisJCQlyZXNvdXJjZS0+bGVuZ3RoID0gcmVzb3VyY2UtPmxlbmd0aCArCisJCQkgICAgKGluZm8tPnZhbHVlICogKGl0ZW1fY291bnQgLSAxKSk7CisJCQlicmVhazsKIAotCQkvKiBEZXJlZmVyZW5jZSAqLworCQljYXNlIEFDUElfUlNDX0NPVU5UMTY6CiAKLQkJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7CisJCQlpdGVtX2NvdW50ID0gYW1sX3Jlc291cmNlX2xlbmd0aDsKKwkJCUFDUElfU0VUMTYoZGVzdGluYXRpb24pID0gaXRlbV9jb3VudDsKIAotCQkvKiBDYWxjdWxhdGUgYnl0ZXMgY29uc3VtZWQgKi8KKwkJCXJlc291cmNlLT5sZW5ndGggPSByZXNvdXJjZS0+bGVuZ3RoICsKKwkJCSAgICAoaW5mby0+dmFsdWUgKiAoaXRlbV9jb3VudCAtIDEpKTsKKwkJCWJyZWFrOwogCi0JCSpieXRlc19jb25zdW1lZCA9IChhY3BpX3NpemUpIHRlbXAxNiArIDM7CisJCWNhc2UgQUNQSV9SU0NfTEVOR1RIOgogCi0JCS8qIFBvaW50IHRvIHRoZSBmaXJzdCB2ZW5kb3IgYnl0ZSAqLworCQkJcmVzb3VyY2UtPmxlbmd0aCA9IHJlc291cmNlLT5sZW5ndGggKyBpbmZvLT52YWx1ZTsKKwkJCWJyZWFrOwogCi0JCWJ1ZmZlciArPSAyOwotCX0gZWxzZSB7Ci0JCS8qIFNtYWxsIEl0ZW0sIGRlcmVmZXJlbmNlIHRoZSBzaXplICovCisJCWNhc2UgQUNQSV9SU0NfTU9WRTg6CisJCWNhc2UgQUNQSV9SU0NfTU9WRTE2OgorCQljYXNlIEFDUElfUlNDX01PVkUzMjoKKwkJY2FzZSBBQ1BJX1JTQ19NT1ZFNjQ6CisJCQkvKgorCQkJICogUmF3IGRhdGEgbW92ZS4gVXNlIHRoZSBJbmZvIHZhbHVlIGZpZWxkIHVubGVzcyBpdGVtX2NvdW50IGhhcworCQkJICogYmVlbiBwcmV2aW91c2x5IGluaXRpYWxpemVkIHZpYSBhIENPVU5UIG9wY29kZQorCQkJICovCisJCQlpZiAoaW5mby0+dmFsdWUpIHsKKwkJCQlpdGVtX2NvdW50ID0gaW5mby0+dmFsdWU7CisJCQl9CisJCQlhY3BpX3JzX21vdmVfZGF0YShkZXN0aW5hdGlvbiwgc291cmNlLCBpdGVtX2NvdW50LAorCQkJCQkgIGluZm8tPm9wY29kZSk7CisJCQlicmVhazsKIAotCQl0ZW1wMTYgPSAodTgpICgqYnVmZmVyICYgMHgwNyk7CisJCWNhc2UgQUNQSV9SU0NfU0VUODoKIAotCQkvKiBDYWxjdWxhdGUgYnl0ZXMgY29uc3VtZWQgKi8KKwkJCUFDUElfTUVNU0VUKGRlc3RpbmF0aW9uLCBpbmZvLT5hbWxfb2Zmc2V0LCBpbmZvLT52YWx1ZSk7CisJCQlicmVhazsKIAotCQkqYnl0ZXNfY29uc3VtZWQgPSAoYWNwaV9zaXplKSB0ZW1wMTYgKyAxOworCQljYXNlIEFDUElfUlNDX0RBVEE4OgogCi0JCS8qIFBvaW50IHRvIHRoZSBmaXJzdCB2ZW5kb3IgYnl0ZSAqLworCQkJdGFyZ2V0ID0gQUNQSV9BRERfUFRSKGNoYXIsIHJlc291cmNlLCBpbmZvLT52YWx1ZSk7CisJCQlBQ1BJX01FTUNQWShkZXN0aW5hdGlvbiwgc291cmNlLCBBQ1BJX0dFVDE2KHRhcmdldCkpOworCQkJYnJlYWs7CiAKLQkJYnVmZmVyICs9IDE7Ci0JfQorCQljYXNlIEFDUElfUlNDX0FERFJFU1M6CisJCQkvKgorCQkJICogQ29tbW9uIGhhbmRsZXIgZm9yIGFkZHJlc3MgZGVzY3JpcHRvciBmbGFncworCQkJICovCisJCQlpZiAoIWFjcGlfcnNfZ2V0X2FkZHJlc3NfY29tbW9uKHJlc291cmNlLCBhbWwpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTCisJCQkJICAgIChBRV9BTUxfSU5WQUxJRF9SRVNPVVJDRV9UWVBFKTsKKwkJCX0KKwkJCWJyZWFrOwogCi0Jb3V0cHV0X3N0cnVjdC0+aWQgPSBBQ1BJX1JTVFlQRV9WRU5ET1I7Ci0Jb3V0cHV0X3N0cnVjdC0+ZGF0YS52ZW5kb3Jfc3BlY2lmaWMubGVuZ3RoID0gdGVtcDE2OworCQljYXNlIEFDUElfUlNDX1NPVVJDRToKKwkJCS8qCisJCQkgKiBPcHRpb25hbCByZXNvdXJjZV9zb3VyY2UgKEluZGV4IGFuZCBTdHJpbmcpCisJCQkgKi8KKwkJCXJlc291cmNlLT5sZW5ndGggKz0KKwkJCSAgICBhY3BpX3JzX2dldF9yZXNvdXJjZV9zb3VyY2UoYW1sX3Jlc291cmNlX2xlbmd0aCwKKwkJCQkJCQlpbmZvLT52YWx1ZSwKKwkJCQkJCQlkZXN0aW5hdGlvbiwgYW1sLCBOVUxMKTsKKwkJCWJyZWFrOwogCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdGVtcDE2OyBpbmRleCsrKSB7Ci0JCW91dHB1dF9zdHJ1Y3QtPmRhdGEudmVuZG9yX3NwZWNpZmljLnJlc2VydmVkW2luZGV4XSA9ICpidWZmZXI7Ci0JCWJ1ZmZlciArPSAxOwotCX0KKwkJY2FzZSBBQ1BJX1JTQ19TT1VSQ0VYOgorCQkJLyoKKwkJCSAqIE9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSAoSW5kZXggYW5kIFN0cmluZykuIFRoaXMgaXMgdGhlIG1vcmUKKwkJCSAqIGNvbXBsaWNhdGVkIGNhc2UgdXNlZCBieSB0aGUgSW50ZXJydXB0KCkgbWFjcm8KKwkJCSAqLworCQkJdGFyZ2V0ID0KKwkJCSAgICBBQ1BJX0FERF9QVFIoY2hhciwgcmVzb3VyY2UsCisJCQkJCSBpbmZvLT5hbWxfb2Zmc2V0ICsgKGl0ZW1fY291bnQgKiA0KSk7CiAKLQkvKgotCSAqIEluIG9yZGVyIGZvciB0aGUgc3RydWN0X3NpemUgdG8gZmFsbCBvbiBhIDMyLWJpdCBib3VuZGFyeSwKLQkgKiBjYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgdmVuZG9yIHN0cmluZyBhbmQgZXhwYW5kIHRoZQotCSAqIHN0cnVjdF9zaXplIHRvIHRoZSBuZXh0IDMyLWJpdCBib3VuZGFyeS4KLQkgKi8KLQlzdHJ1Y3Rfc2l6ZSArPSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFModGVtcDE2KTsKKwkJCXJlc291cmNlLT5sZW5ndGggKz0KKwkJCSAgICBhY3BpX3JzX2dldF9yZXNvdXJjZV9zb3VyY2UoYW1sX3Jlc291cmNlX2xlbmd0aCwKKwkJCQkJCQkoYWNwaV9yc19sZW5ndGgpICgoKGl0ZW1fY291bnQgLSAxKSAqIHNpemVvZih1MzIpKSArIGluZm8tPnZhbHVlKSwgZGVzdGluYXRpb24sIGFtbCwgdGFyZ2V0KTsKKwkJCWJyZWFrOwogCi0JLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCisJCWNhc2UgQUNQSV9SU0NfQklUTUFTSzoKKwkJCS8qCisJCQkgKiA4LWJpdCBlbmNvZGVkIGJpdG1hc2sgKERNQSBtYWNybykKKwkJCSAqLworCQkJaXRlbV9jb3VudCA9CisJCQkgICAgYWNwaV9yc19kZWNvZGVfYml0bWFzayhBQ1BJX0dFVDgoc291cmNlKSwKKwkJCQkJCSAgIGRlc3RpbmF0aW9uKTsKKwkJCWlmIChpdGVtX2NvdW50KSB7CisJCQkJcmVzb3VyY2UtPmxlbmd0aCArPSAoaXRlbV9jb3VudCAtIDEpOworCQkJfQogCi0Jb3V0cHV0X3N0cnVjdC0+bGVuZ3RoID0gKHUzMikgc3RydWN0X3NpemU7CisJCQl0YXJnZXQgPSBBQ1BJX0FERF9QVFIoY2hhciwgcmVzb3VyY2UsIGluZm8tPnZhbHVlKTsKKwkJCUFDUElfU0VUOCh0YXJnZXQpID0gKHU4KSBpdGVtX2NvdW50OworCQkJYnJlYWs7CiAKLQkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLworCQljYXNlIEFDUElfUlNDX0JJVE1BU0sxNjoKKwkJCS8qCisJCQkgKiAxNi1iaXQgZW5jb2RlZCBiaXRtYXNrIChJUlEgbWFjcm8pCisJCQkgKi8KKwkJCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBzb3VyY2UpOwogCi0JKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KKwkJCWl0ZW1fY291bnQgPQorCQkJICAgIGFjcGlfcnNfZGVjb2RlX2JpdG1hc2sodGVtcDE2LCBkZXN0aW5hdGlvbik7CisJCQlpZiAoaXRlbV9jb3VudCkgeworCQkJCXJlc291cmNlLT5sZW5ndGggKz0gKGl0ZW1fY291bnQgLSAxKTsKKwkJCX0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc192ZW5kb3Jfc3RyZWFtCi0gKgotICogUEFSQU1FVEVSUzogIGxpbmtlZF9saXN0ICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmVzb3VyY2UgbGlua2VkIGxpc3QKLSAqICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHVzZXIncyByZXR1cm4gYnVmZmVyCi0gKiAgICAgICAgICAgICAgYnl0ZXNfY29uc3VtZWQgICAgICAgICAgLSBQb2ludGVyIHRvIHdoZXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gdGhlIG91dHB1dF9idWZmZXIgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRha2UgdGhlIGxpbmtlZCBsaXN0IHJlc291cmNlIHN0cnVjdHVyZSBhbmQgZmlsbHMgaW4gdGhlCi0gKiAgICAgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluIGEgYnl0ZSBzdHJlYW0KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQkJdGFyZ2V0ID0gQUNQSV9BRERfUFRSKGNoYXIsIHJlc291cmNlLCBpbmZvLT52YWx1ZSk7CisJCQlBQ1BJX1NFVDgodGFyZ2V0KSA9ICh1OCkgaXRlbV9jb3VudDsKKwkJCWJyZWFrOwogCi1hY3BpX3N0YXR1cwotYWNwaV9yc192ZW5kb3Jfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKLQkJICAgICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpCi17Ci0JdTggKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOwotCXUxNiB0ZW1wMTYgPSAwOwotCXU4IHRlbXA4ID0gMDsKLQl1OCBpbmRleDsKKwkJY2FzZSBBQ1BJX1JTQ19FWElUX05FOgorCQkJLyoKKwkJCSAqIENvbnRyb2wgLSBFeGl0IGNvbnZlcnNpb24gaWYgbm90IGVxdWFsCisJCQkgKi8KKwkJCXN3aXRjaCAoaW5mby0+cmVzb3VyY2Vfb2Zmc2V0KSB7CisJCQljYXNlIEFDUElfUlNDX0NPTVBBUkVfQU1MX0xFTkdUSDoKKwkJCQlpZiAoYW1sX3Jlc291cmNlX2xlbmd0aCAhPSBpbmZvLT52YWx1ZSkgeworCQkJCQlnb3RvIGV4aXQ7CisJCQkJfQorCQkJCWJyZWFrOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfdmVuZG9yX3N0cmVhbSIpOworCQkJY2FzZSBBQ1BJX1JTQ19DT01QQVJFX1ZBTFVFOgorCQkJCWlmIChBQ1BJX0dFVDgoc291cmNlKSAhPSBpbmZvLT52YWx1ZSkgeworCQkJCQlnb3RvIGV4aXQ7CisJCQkJfQorCQkJCWJyZWFrOwogCi0JLyogRGVyZWZlcmVuY2UgdGhlIGxlbmd0aCB0byBmaW5kIGlmIHRoaXMgaXMgYSBsYXJnZSBvciBzbWFsbCBpdGVtLiAqLworCQkJZGVmYXVsdDoKKwkJCQlhY3BpX29zX3ByaW50ZgorCQkJCSAgICAoIioqKiBJbnZhbGlkIGNvbnZlcnNpb24gc3ViLW9wY29kZVxuIik7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCQkJfQorCQkJYnJlYWs7CiAKLQlpZiAobGlua2VkX2xpc3QtPmRhdGEudmVuZG9yX3NwZWNpZmljLmxlbmd0aCA+IDcpIHsKLQkJLyogTGFyZ2UgSXRlbSwgU2V0IHRoZSBkZXNjcmlwdG9yIGZpZWxkIGFuZCBsZW5ndGggYnl0ZXMgKi8KKwkJZGVmYXVsdDoKIAotCQkqYnVmZmVyID0gMHg4NDsKLQkJYnVmZmVyICs9IDE7Ci0KLQkJdGVtcDE2ID0gKHUxNikgbGlua2VkX2xpc3QtPmRhdGEudmVuZG9yX3NwZWNpZmljLmxlbmd0aDsKLQotCQlBQ1BJX01PVkVfMTZfVE9fMTYoYnVmZmVyLCAmdGVtcDE2KTsKLQkJYnVmZmVyICs9IDI7Ci0JfSBlbHNlIHsKLQkJLyogU21hbGwgSXRlbSwgU2V0IHRoZSBkZXNjcmlwdG9yIGZpZWxkICovCi0KLQkJdGVtcDggPSAweDcwOwotCQl0ZW1wOCB8PSAodTgpIGxpbmtlZF9saXN0LT5kYXRhLnZlbmRvcl9zcGVjaWZpYy5sZW5ndGg7Ci0KLQkJKmJ1ZmZlciA9IHRlbXA4OwotCQlidWZmZXIgKz0gMTsKLQl9Ci0KLQkvKiBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBWZW5kb3IgU3BlY2lmaWMgZmllbGRzICovCi0KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBsaW5rZWRfbGlzdC0+ZGF0YS52ZW5kb3Jfc3BlY2lmaWMubGVuZ3RoOwotCSAgICAgaW5kZXgrKykgewotCQl0ZW1wOCA9IGxpbmtlZF9saXN0LT5kYXRhLnZlbmRvcl9zcGVjaWZpYy5yZXNlcnZlZFtpbmRleF07Ci0KLQkJKmJ1ZmZlciA9IHRlbXA4OwotCQlidWZmZXIgKz0gMTsKLQl9Ci0KLQkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLwotCi0JKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRihidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX3N0YXJ0X2RlcGVuZF9mbnNfcmVzb3VyY2UKLSAqCi0gKiBQQVJBTUVURVJTOiAgYnl0ZV9zdHJlYW1fYnVmZmVyICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXNvdXJjZSBpbnB1dCBieXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0KLSAqICAgICAgICAgICAgICBieXRlc19jb25zdW1lZCAgICAgICAgICAtIFBvaW50ZXIgdG8gd2hlcmUgdGhlIG51bWJlciBvZiBieXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZWQgdGhlIGJ5dGVfc3RyZWFtX2J1ZmZlciBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJldHVybiBkYXRhIGJ1ZmZlcgotICogICAgICAgICAgICAgIHN0cnVjdHVyZV9zaXplICAgICAgICAgIC0gUG9pbnRlciB0byB3aGVyZSB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmV0dXJuIGRhdGEgc3RydWN0IGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBUYWtlIHRoZSByZXNvdXJjZSBieXRlIHN0cmVhbSBhbmQgZmlsbCBvdXQgdGhlIGFwcHJvcHJpYXRlCi0gKiAgICAgICAgICAgICAgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgdGhlIG91dHB1dF9idWZmZXIuIFJldHVybiB0aGUKLSAqICAgICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgZnJvbSB0aGUgYnl0ZSBzdHJlYW0uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfcnNfc3RhcnRfZGVwZW5kX2Zuc19yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCQkgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAotCQkJCSAgdTggKiogb3V0cHV0X2J1ZmZlciwKLQkJCQkgIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKQotewotCXU4ICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSpvdXRwdXRfYnVmZmVyOwotCXU4IHRlbXA4ID0gMDsKLQlhY3BpX3NpemUgc3RydWN0X3NpemUgPQotCSAgICBBQ1BJX1NJWkVPRl9SRVNPVVJDRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zdGFydF9kcGYpOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfc3RhcnRfZGVwZW5kX2Zuc19yZXNvdXJjZSIpOwotCi0JLyogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBhcmUgZm91bmQgaW4gdGhlIGRlc2NyaXB0b3IgKEJpdHM6MC0xKSAqLwotCi0JdGVtcDggPSAqYnVmZmVyOwotCi0JKmJ5dGVzX2NvbnN1bWVkID0gKHRlbXA4ICYgMHgwMSkgKyAxOwotCi0Jb3V0cHV0X3N0cnVjdC0+aWQgPSBBQ1BJX1JTVFlQRV9TVEFSVF9EUEY7Ci0KLQkvKiBQb2ludCB0byBCeXRlIDEgaWYgaXQgaXMgdXNlZCAqLwotCi0JaWYgKDIgPT0gKmJ5dGVzX2NvbnN1bWVkKSB7Ci0JCWJ1ZmZlciArPSAxOwotCQl0ZW1wOCA9ICpidWZmZXI7Ci0KLQkJLyogQ2hlY2sgQ29tcGF0aWJpbGl0eSBwcmlvcml0eSAqLwotCi0JCW91dHB1dF9zdHJ1Y3QtPmRhdGEuc3RhcnRfZHBmLmNvbXBhdGliaWxpdHlfcHJpb3JpdHkgPQotCQkgICAgdGVtcDggJiAweDAzOwotCi0JCWlmICgzID09IG91dHB1dF9zdHJ1Y3QtPmRhdGEuc3RhcnRfZHBmLmNvbXBhdGliaWxpdHlfcHJpb3JpdHkpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfQkFEX1JFU09VUkNFX1ZBTFVFKTsKKwkJCWFjcGlfb3NfcHJpbnRmKCIqKiogSW52YWxpZCBjb252ZXJzaW9uIG9wY29kZVxuIik7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJCX0KIAotCQkvKiBDaGVjayBQZXJmb3JtYW5jZS9Sb2J1c3RuZXNzIHByZWZlcmVuY2UgKi8KLQotCQlvdXRwdXRfc3RydWN0LT5kYXRhLnN0YXJ0X2RwZi5wZXJmb3JtYW5jZV9yb2J1c3RuZXNzID0KLQkJICAgICh0ZW1wOCA+PiAyKSAmIDB4MDM7Ci0KLQkJaWYgKDMgPT0gb3V0cHV0X3N0cnVjdC0+ZGF0YS5zdGFydF9kcGYucGVyZm9ybWFuY2Vfcm9idXN0bmVzcykgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9CQURfUkVTT1VSQ0VfVkFMVUUpOwotCQl9Ci0JfSBlbHNlIHsKLQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5zdGFydF9kcGYuY29tcGF0aWJpbGl0eV9wcmlvcml0eSA9Ci0JCSAgICBBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTjsKLQotCQlvdXRwdXRfc3RydWN0LT5kYXRhLnN0YXJ0X2RwZi5wZXJmb3JtYW5jZV9yb2J1c3RuZXNzID0KLQkJICAgIEFDUElfQUNDRVBUQUJMRV9DT05GSUdVUkFUSU9OOworCQljb3VudC0tOworCQlpbmZvKys7CiAJfQogCi0JLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCisgICAgICBleGl0OgorCWlmICghZmxhZ3NfbW9kZSkgeworCQkvKiBSb3VuZCB0aGUgcmVzb3VyY2Ugc3RydWN0IGxlbmd0aCB1cCB0byB0aGUgbmV4dCAzMi1iaXQgYm91bmRhcnkgKi8KIAotCW91dHB1dF9zdHJ1Y3QtPmxlbmd0aCA9ICh1MzIpIHN0cnVjdF9zaXplOwotCi0JLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KLQotCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOworCQlyZXNvdXJjZS0+bGVuZ3RoID0gQUNQSV9ST1VORF9VUF90b18zMl9iSVRTKHJlc291cmNlLT5sZW5ndGgpOworCX0KIAlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2VuZF9kZXBlbmRfZm5zX3Jlc291cmNlCisgKiBGVU5DVElPTjogICAgYWNwaV9yc19jb252ZXJ0X3Jlc291cmNlX3RvX2FtbAogICoKLSAqIFBBUkFNRVRFUlM6ICBieXRlX3N0cmVhbV9idWZmZXIgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGlucHV0IGJ5dGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbQotICogICAgICAgICAgICAgIGJ5dGVzX2NvbnN1bWVkICAgICAgICAgIC0gUG9pbnRlciB0byB3aGVyZSB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lZCB0aGUgYnl0ZV9zdHJlYW1fYnVmZmVyIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZAotICogICAgICAgICAgICAgIG91dHB1dF9idWZmZXIgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmV0dXJuIGRhdGEgYnVmZmVyCi0gKiAgICAgICAgICAgICAgc3RydWN0dXJlX3NpemUgICAgICAgICAgLSBQb2ludGVyIHRvIHdoZXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByZXR1cm4gZGF0YSBzdHJ1Y3QgaXMgcmV0dXJuZWQKKyAqIFBBUkFNRVRFUlM6ICBSZXNvdXJjZSAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmVzb3VyY2UgZGVzY3JpcHRvcgorICogICAgICAgICAgICAgIEFtbCAgICAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgQU1MIGRlc2NyaXB0b3IgaXMgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICBJbmZvICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byBhcHByb3ByaWF0ZSBjb252ZXJzaW9uIHRhYmxlCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBUYWtlIHRoZSByZXNvdXJjZSBieXRlIHN0cmVhbSBhbmQgZmlsbCBvdXQgdGhlIGFwcHJvcHJpYXRlCi0gKiAgICAgICAgICAgICAgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgdGhlIG91dHB1dF9idWZmZXIuIFJldHVybiB0aGUKLSAqICAgICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgZnJvbSB0aGUgYnl0ZSBzdHJlYW0uCisgKiBERVNDUklQVElPTjogQ29udmVydCBhbiBpbnRlcm5hbCByZXNvdXJjZSBkZXNjcmlwdG9yIHRvIHRoZSBjb3JyZXNwb25kaW5nCisgKiAgICAgICAgICAgICAgZXh0ZXJuYWwgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZW5kX2RlcGVuZF9mbnNfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkJYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCi0JCQkJdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpCithY3BpX3JzX2NvbnZlcnRfcmVzb3VyY2VfdG9fYW1sKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwKKwkJCQl1bmlvbiBhbWxfcmVzb3VyY2UgKmFtbCwKKwkJCQlzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopKm91dHB1dF9idWZmZXI7Ci0JYWNwaV9zaXplIHN0cnVjdF9zaXplID0gQUNQSV9SRVNPVVJDRV9MRU5HVEg7CisJdm9pZCAqc291cmNlID0gTlVMTDsKKwl2b2lkICpkZXN0aW5hdGlvbjsKKwlhY3BpX3JzZGVzY19zaXplIGFtbF9sZW5ndGggPSAwOworCXU4IGNvdW50OworCXUxNiB0ZW1wMTYgPSAwOworCXUxNiBpdGVtX2NvdW50ID0gMDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2VuZF9kZXBlbmRfZm5zX3Jlc291cmNlIik7Ci0KLQkvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGlzIHN0YXRpYyAqLwotCi0JKmJ5dGVzX2NvbnN1bWVkID0gMTsKLQotCS8qICBGaWxsIG91dCB0aGUgc3RydWN0dXJlICovCi0KLQlvdXRwdXRfc3RydWN0LT5pZCA9IEFDUElfUlNUWVBFX0VORF9EUEY7Ci0KLQkvKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIgKi8KLQotCW91dHB1dF9zdHJ1Y3QtPmxlbmd0aCA9ICh1MzIpIHN0cnVjdF9zaXplOwotCi0JLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KLQotCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfc3RhcnRfZGVwZW5kX2Zuc19zdHJlYW0KLSAqCi0gKiBQQVJBTUVURVJTOiAgbGlua2VkX2xpc3QgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXNvdXJjZSBsaW5rZWQgbGlzdAotICogICAgICAgICAgICAgIG91dHB1dF9idWZmZXIgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgdXNlcidzIHJldHVybiBidWZmZXIKLSAqICAgICAgICAgICAgICBieXRlc19jb25zdW1lZCAgICAgICAgICAtIHUzMiBwb2ludGVyIHRoYXQgaXMgZmlsbGVkIHdpdGgKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyIHVzZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRha2UgdGhlIGxpbmtlZCBsaXN0IHJlc291cmNlIHN0cnVjdHVyZSBhbmQgZmlsbHMgaW4gdGhlCi0gKiAgICAgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluIGEgYnl0ZSBzdHJlYW0KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9yc19zdGFydF9kZXBlbmRfZm5zX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCi0JCQkJdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpCi17Ci0JdTggKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOwotCXU4IHRlbXA4ID0gMDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX3N0YXJ0X2RlcGVuZF9mbnNfc3RyZWFtIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfY29udmVydF9yZXNvdXJjZV90b19hbWwiKTsKIAogCS8qCi0JICogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc2V0IGJhc2VkIHVwb24gd2hldGhlciBhIGJ5dGUgaXMgbmVlZGVkCi0JICogdG8gY29udGFpbiBQcmlvcml0eSBkYXRhLgorCSAqIEZpcnN0IHRhYmxlIGVudHJ5IG11c3QgYmUgQUNQSV9SU0NfSU5JVHh4eCBhbmQgbXVzdCBjb250YWluIHRoZQorCSAqIHRhYmxlIGxlbmd0aCAoIyBvZiB0YWJsZSBlbnRyaWVzKQogCSAqLwotCWlmIChBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTiA9PQotCSAgICBsaW5rZWRfbGlzdC0+ZGF0YS5zdGFydF9kcGYuY29tcGF0aWJpbGl0eV9wcmlvcml0eSAmJgotCSAgICBBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTiA9PQotCSAgICBsaW5rZWRfbGlzdC0+ZGF0YS5zdGFydF9kcGYucGVyZm9ybWFuY2Vfcm9idXN0bmVzcykgewotCQkqYnVmZmVyID0gMHgzMDsKLQl9IGVsc2UgewotCQkqYnVmZmVyID0gMHgzMTsKLQkJYnVmZmVyICs9IDE7CisJY291bnQgPSBJTklUX1RBQkxFX0xFTkdUSChpbmZvKTsKIAotCQkvKiBTZXQgdGhlIFByaW9yaXR5IEJ5dGUgRGVmaW5pdGlvbiAqLworCXdoaWxlIChjb3VudCkgeworCQkvKgorCQkgKiBTb3VyY2UgaXMgdGhlIGludGVybmFsIHJlc291cmNlIGRlc2NyaXB0b3IsCisJCSAqIGRlc3RpbmF0aW9uIGlzIHRoZSBleHRlcm5hbCBBTUwgYnl0ZSBzdHJlYW0gYnVmZmVyCisJCSAqLworCQlzb3VyY2UgPSBBQ1BJX0FERF9QVFIodm9pZCwgcmVzb3VyY2UsIGluZm8tPnJlc291cmNlX29mZnNldCk7CisJCWRlc3RpbmF0aW9uID0gQUNQSV9BRERfUFRSKHZvaWQsIGFtbCwgaW5mby0+YW1sX29mZnNldCk7CiAKLQkJdGVtcDggPSAwOwotCQl0ZW1wOCA9Ci0JCSAgICAodTgpICgobGlua2VkX2xpc3QtPmRhdGEuc3RhcnRfZHBmLgotCQkJICAgcGVyZm9ybWFuY2Vfcm9idXN0bmVzcyAmIDB4MDMpIDw8IDIpOwotCQl0ZW1wOCB8PQotCQkgICAgKGxpbmtlZF9saXN0LT5kYXRhLnN0YXJ0X2RwZi5jb21wYXRpYmlsaXR5X3ByaW9yaXR5ICYgMHgwMyk7Ci0JCSpidWZmZXIgPSB0ZW1wODsKKwkJc3dpdGNoIChpbmZvLT5vcGNvZGUpIHsKKwkJY2FzZSBBQ1BJX1JTQ19JTklUU0VUOgorCisJCQlBQ1BJX01FTVNFVChhbWwsIDAsIElOSVRfUkVTT1VSQ0VfTEVOR1RIKGluZm8pKTsKKwkJCWFtbF9sZW5ndGggPSBJTklUX1JFU09VUkNFX0xFTkdUSChpbmZvKTsKKwkJCWFjcGlfcnNfc2V0X3Jlc291cmNlX2hlYWRlcihJTklUX1JFU09VUkNFX1RZUEUoaW5mbyksCisJCQkJCQkgICAgYW1sX2xlbmd0aCwgYW1sKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SU0NfSU5JVEdFVDoKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SU0NfRkxBR0lOSVQ6CisJCQkvKgorCQkJICogQ2xlYXIgdGhlIGZsYWcgYnl0ZQorCQkJICovCisJCQlBQ1BJX1NFVDgoZGVzdGluYXRpb24pID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SU0NfMUJJVEZMQUc6CisJCQkvKgorCQkJICogTWFzayBhbmQgc2hpZnQgdGhlIGZsYWcgYml0CisJCQkgKi8KKwkJCUFDUElfU0VUOChkZXN0aW5hdGlvbikgfD0gKHU4KQorCQkJICAgICgoQUNQSV9HRVQ4KHNvdXJjZSkgJiAweDAxKSA8PCBpbmZvLT52YWx1ZSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDXzJCSVRGTEFHOgorCQkJLyoKKwkJCSAqIE1hc2sgYW5kIHNoaWZ0IHRoZSBmbGFnIGJpdHMKKwkJCSAqLworCQkJQUNQSV9TRVQ4KGRlc3RpbmF0aW9uKSB8PSAodTgpCisJCQkgICAgKChBQ1BJX0dFVDgoc291cmNlKSAmIDB4MDMpIDw8IGluZm8tPnZhbHVlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SU0NfQ09VTlQ6CisKKwkJCWl0ZW1fY291bnQgPSBBQ1BJX0dFVDgoc291cmNlKTsKKwkJCUFDUElfU0VUOChkZXN0aW5hdGlvbikgPSAodTgpIGl0ZW1fY291bnQ7CisKKwkJCWFtbF9sZW5ndGggPQorCQkJICAgICh1MTYpIChhbWxfbGVuZ3RoICsKKwkJCQkgICAoaW5mby0+dmFsdWUgKiAoaXRlbV9jb3VudCAtIDEpKSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX0NPVU5UMTY6CisKKwkJCWl0ZW1fY291bnQgPSBBQ1BJX0dFVDE2KHNvdXJjZSk7CisJCQlhbWxfbGVuZ3RoID0gKHUxNikgKGFtbF9sZW5ndGggKyBpdGVtX2NvdW50KTsKKwkJCWFjcGlfcnNfc2V0X3Jlc291cmNlX2xlbmd0aChhbWxfbGVuZ3RoLCBhbWwpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JTQ19MRU5HVEg6CisKKwkJCWFjcGlfcnNfc2V0X3Jlc291cmNlX2xlbmd0aChpbmZvLT52YWx1ZSwgYW1sKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SU0NfTU9WRTg6CisJCWNhc2UgQUNQSV9SU0NfTU9WRTE2OgorCQljYXNlIEFDUElfUlNDX01PVkUzMjoKKwkJY2FzZSBBQ1BJX1JTQ19NT1ZFNjQ6CisKKwkJCWlmIChpbmZvLT52YWx1ZSkgeworCQkJCWl0ZW1fY291bnQgPSBpbmZvLT52YWx1ZTsKKwkJCX0KKwkJCWFjcGlfcnNfbW92ZV9kYXRhKGRlc3RpbmF0aW9uLCBzb3VyY2UsIGl0ZW1fY291bnQsCisJCQkJCSAgaW5mby0+b3Bjb2RlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SU0NfQUREUkVTUzoKKworCQkJLyogU2V0IHRoZSBSZXNvdXJjZSBUeXBlLCBHZW5lcmFsIEZsYWdzLCBhbmQgVHlwZS1TcGVjaWZpYyBGbGFncyAqLworCisJCQlhY3BpX3JzX3NldF9hZGRyZXNzX2NvbW1vbihhbWwsIHJlc291cmNlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SU0NfU09VUkNFWDoKKwkJCS8qCisJCQkgKiBPcHRpb25hbCByZXNvdXJjZV9zb3VyY2UgKEluZGV4IGFuZCBTdHJpbmcpCisJCQkgKi8KKwkJCWFtbF9sZW5ndGggPQorCQkJICAgIGFjcGlfcnNfc2V0X3Jlc291cmNlX3NvdXJjZShhbWwsCisJCQkJCQkJKGFjcGlfcnNfbGVuZ3RoKQorCQkJCQkJCWFtbF9sZW5ndGgsIHNvdXJjZSk7CisJCQlhY3BpX3JzX3NldF9yZXNvdXJjZV9sZW5ndGgoYW1sX2xlbmd0aCwgYW1sKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SU0NfU09VUkNFOgorCQkJLyoKKwkJCSAqIE9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSAoSW5kZXggYW5kIFN0cmluZykuIFRoaXMgaXMgdGhlIG1vcmUKKwkJCSAqIGNvbXBsaWNhdGVkIGNhc2UgdXNlZCBieSB0aGUgSW50ZXJydXB0KCkgbWFjcm8KKwkJCSAqLworCQkJYW1sX2xlbmd0aCA9CisJCQkgICAgYWNwaV9yc19zZXRfcmVzb3VyY2Vfc291cmNlKGFtbCwgaW5mby0+dmFsdWUsCisJCQkJCQkJc291cmNlKTsKKwkJCWFjcGlfcnNfc2V0X3Jlc291cmNlX2xlbmd0aChhbWxfbGVuZ3RoLCBhbWwpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JTQ19CSVRNQVNLOgorCQkJLyoKKwkJCSAqIDgtYml0IGVuY29kZWQgYml0bWFzayAoRE1BIG1hY3JvKQorCQkJICovCisJCQlBQ1BJX1NFVDgoZGVzdGluYXRpb24pID0gKHU4KQorCQkJICAgIGFjcGlfcnNfZW5jb2RlX2JpdG1hc2soc291cmNlLAorCQkJCQkJICAgKkFDUElfQUREX1BUUih1OCwgcmVzb3VyY2UsCisJCQkJCQkJCSBpbmZvLT52YWx1ZSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JTQ19CSVRNQVNLMTY6CisJCQkvKgorCQkJICogMTYtYml0IGVuY29kZWQgYml0bWFzayAoSVJRIG1hY3JvKQorCQkJICovCisJCQl0ZW1wMTYgPSBhY3BpX3JzX2VuY29kZV9iaXRtYXNrKHNvdXJjZSwKKwkJCQkJCQkqQUNQSV9BRERfUFRSKHU4LAorCQkJCQkJCQkgICAgICByZXNvdXJjZSwKKwkJCQkJCQkJICAgICAgaW5mby0+CisJCQkJCQkJCSAgICAgIHZhbHVlKSk7CisJCQlBQ1BJX01PVkVfMTZfVE9fMTYoZGVzdGluYXRpb24sICZ0ZW1wMTYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JTQ19FWElUX0xFOgorCQkJLyoKKwkJCSAqIENvbnRyb2wgLSBFeGl0IGNvbnZlcnNpb24gaWYgbGVzcyB0aGFuIG9yIGVxdWFsCisJCQkgKi8KKwkJCWlmIChpdGVtX2NvdW50IDw9IGluZm8tPnZhbHVlKSB7CisJCQkJZ290byBleGl0OworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JTQ19FWElUX05FOgorCQkJLyoKKwkJCSAqIENvbnRyb2wgLSBFeGl0IGNvbnZlcnNpb24gaWYgbm90IGVxdWFsCisJCQkgKi8KKwkJCXN3aXRjaCAoQ09NUEFSRV9PUENPREUoaW5mbykpIHsKKwkJCWNhc2UgQUNQSV9SU0NfQ09NUEFSRV9WQUxVRToKKworCQkJCWlmICgqQUNQSV9BRERfUFRSKHU4LCByZXNvdXJjZSwKKwkJCQkJCSAgQ09NUEFSRV9UQVJHRVQoaW5mbykpICE9CisJCQkJICAgIENPTVBBUkVfVkFMVUUoaW5mbykpIHsKKwkJCQkJZ290byBleGl0OworCQkJCX0KKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlhY3BpX29zX3ByaW50ZgorCQkJCSAgICAoIioqKiBJbnZhbGlkIGNvbnZlcnNpb24gc3ViLW9wY29kZVxuIik7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKworCQkJYWNwaV9vc19wcmludGYoIioqKiBJbnZhbGlkIGNvbnZlcnNpb24gb3Bjb2RlXG4iKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwkJfQorCisJCWNvdW50LS07CisJCWluZm8rKzsKIAl9CiAKLQlidWZmZXIgKz0gMTsKLQotCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCi0KLQkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOworICAgICAgZXhpdDoKIAlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2VuZF9kZXBlbmRfZm5zX3N0cmVhbQotICoKLSAqIFBBUkFNRVRFUlM6ICBsaW5rZWRfbGlzdCAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGxpbmtlZCBsaXN0Ci0gKiAgICAgICAgICAgICAgb3V0cHV0X2J1ZmZlciAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSB1c2VyJ3MgcmV0dXJuIGJ1ZmZlcgotICogICAgICAgICAgICAgIGJ5dGVzX2NvbnN1bWVkICAgICAgICAgIC0gUG9pbnRlciB0byB3aGVyZSB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHRoZSBvdXRwdXRfYnVmZmVyIGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBUYWtlIHRoZSBsaW5rZWQgbGlzdCByZXNvdXJjZSBzdHJ1Y3R1cmUgYW5kIGZpbGxzIGluIHRoZQotICogICAgICAgICAgICAgIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiBhIGJ5dGUgc3RyZWFtCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAwCisvKiBQcmV2aW91cyByZXNvdXJjZSB2YWxpZGF0aW9ucyAqLwogCi1hY3BpX3N0YXR1cwotYWNwaV9yc19lbmRfZGVwZW5kX2Zuc19zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAotCQkJICAgICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQpCi17Ci0JdTggKmJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZW5kX2RlcGVuZF9mbnNfc3RyZWFtIik7Ci0KLQkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KLQotCSpidWZmZXIgPSAweDM4OwotCWJ1ZmZlciArPSAxOwotCi0JLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KLQotCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK2lmIChhbWwtPmV4dF9hZGRyZXNzNjQucmV2aXNpb25faUQgIT0gQU1MX1JFU09VUkNFX0VYVEVOREVEX0FERFJFU1NfUkVWSVNJT04pIHsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfU1VQUE9SVCk7CiB9CisKK2lmIChyZXNvdXJjZS0+ZGF0YS5zdGFydF9kcGYucGVyZm9ybWFuY2Vfcm9idXN0bmVzcyA+PSAzKSB7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9CQURfUkVTT1VSQ0VfVkFMVUUpOworfQorCitpZiAoKChhbWwtPmlycS5mbGFncyAmIDB4MDkpID09IDB4MDApIHx8ICgoYW1sLT5pcnEuZmxhZ3MgJiAweDA5KSA9PSAweDA5KSkgeworCS8qCisJICogT25seSBbYWN0aXZlX2hpZ2gsIGVkZ2Vfc2Vuc2l0aXZlXSBvciBbYWN0aXZlX2xvdywgbGV2ZWxfc2Vuc2l0aXZlXQorCSAqIHBvbGFyaXR5L3RyaWdnZXIgaW50ZXJydXB0cyBhcmUgYWxsb3dlZCAoQUNQSSBzcGVjLCBzZWN0aW9uCisJICogIklSUSBGb3JtYXQiKSwgc28gMHgwMCBhbmQgMHgwOSBhcmUgaWxsZWdhbC4KKwkgKi8KKwlBQ1BJX1JFUE9SVF9FUlJPUigoIkludmFsaWQgaW50ZXJydXB0IHBvbGFyaXR5L3RyaWdnZXIgaW4gcmVzb3VyY2UgbGlzdCwgJVhcbiIsIGFtbC0+aXJxLmZsYWdzKSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9EQVRBKTsKK30KKworcmVzb3VyY2UtPmRhdGEuZXh0ZW5kZWRfaXJxLmludGVycnVwdF9jb3VudCA9IHRlbXA4OworaWYgKHRlbXA4IDwgMSkgeworCS8qIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgSVJRICovCisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0JBRF9SRVNPVVJDRV9MRU5HVEgpOworfQorCitpZiAocmVzb3VyY2UtPmRhdGEuZG1hLnRyYW5zZmVyID09IDB4MDMpIHsKKwlBQ1BJX1JFUE9SVF9FUlJPUigoIkludmFsaWQgRE1BLlRyYW5zZmVyIHByZWZlcmVuY2UgKDMpXG4iKSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9EQVRBKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3V0aWxzLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzdXRpbHMuYwppbmRleCA0NDQ2Nzc4Li4yNWI1YWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzdXRpbHMuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzdXRpbHMuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC01MCw2ICs1MCwzODkgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yc19kZWNvZGVfYml0bWFzaworICoKKyAqIFBBUkFNRVRFUlM6ICBNYXNrICAgICAgICAgICAgLSBCaXRtYXNrIHRvIGRlY29kZQorICogICAgICAgICAgICAgIExpc3QgICAgICAgICAgICAtIFdoZXJlIHRoZSBjb252ZXJ0ZWQgbGlzdCBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBDb3VudCBvZiBiaXRzIHNldCAobGVuZ3RoIG9mIGxpc3QpCisgKgorICogREVTQ1JJUFRJT046IENvbnZlcnQgYSBiaXQgbWFzayBpbnRvIGEgbGlzdCBvZiB2YWx1ZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggYWNwaV9yc19kZWNvZGVfYml0bWFzayh1MTYgbWFzaywgdTggKiBsaXN0KQoreworCWFjcGlfbmF0aXZlX3VpbnQgaTsKKwl1OCBiaXRfY291bnQ7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwkvKiBEZWNvZGUgdGhlIG1hc2sgYml0cyAqLworCisJZm9yIChpID0gMCwgYml0X2NvdW50ID0gMDsgbWFzazsgaSsrKSB7CisJCWlmIChtYXNrICYgMHgwMDAxKSB7CisJCQlsaXN0W2JpdF9jb3VudF0gPSAodTgpIGk7CisJCQliaXRfY291bnQrKzsKKwkJfQorCisJCW1hc2sgPj49IDE7CisJfQorCisJcmV0dXJuIChiaXRfY291bnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2VuY29kZV9iaXRtYXNrCisgKgorICogUEFSQU1FVEVSUzogIExpc3QgICAgICAgICAgICAtIExpc3Qgb2YgdmFsdWVzIHRvIGVuY29kZQorICogICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAtIExlbmd0aCBvZiBsaXN0CisgKgorICogUkVUVVJOOiAgICAgIEVuY29kZWQgYml0bWFzaworICoKKyAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGEgbGlzdCBvZiB2YWx1ZXMgdG8gYW4gZW5jb2RlZCBiaXRtYXNrCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTE2IGFjcGlfcnNfZW5jb2RlX2JpdG1hc2sodTggKiBsaXN0LCB1OCBjb3VudCkKK3sKKwlhY3BpX25hdGl2ZV91aW50IGk7CisJdTE2IG1hc2s7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwkvKiBFbmNvZGUgdGhlIGxpc3QgaW50byBhIHNpbmdsZSBiaXRtYXNrICovCisKKwlmb3IgKGkgPSAwLCBtYXNrID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJbWFzayB8PSAoMHgwMDAxIDw8IGxpc3RbaV0pOworCX0KKworCXJldHVybiAobWFzayk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfbW92ZV9kYXRhCisgKgorICogUEFSQU1FVEVSUzogIERlc3RpbmF0aW9uICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBkZXNjcmlwdG9yCisgKiAgICAgICAgICAgICAgU291cmNlICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSBkZXNjcmlwdG9yCisgKiAgICAgICAgICAgICAgaXRlbV9jb3VudCAgICAgICAgICAtIEhvdyBtYW55IGl0ZW1zIHRvIG1vdmUKKyAqICAgICAgICAgICAgICBtb3ZlX3R5cGUgICAgICAgICAgIC0gQnl0ZSB3aWR0aAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IE1vdmUgbXVsdGlwbGUgZGF0YSBpdGVtcyBmcm9tIG9uZSBkZXNjcmlwdG9yIHRvIGFub3RoZXIuIEhhbmRsZXMKKyAqICAgICAgICAgICAgICBhbGlnbm1lbnQgaXNzdWVzIGFuZCBlbmRpYW4gaXNzdWVzIGlmIG5lY2Vzc2FyeSwgYXMgY29uZmlndXJlZAorICogICAgICAgICAgICAgIHZpYSB0aGUgQUNQSV9NT1ZFXyogbWFjcm9zLiAoVGhpcyBpcyB3aHkgYSBtZW1jcHkgaXMgbm90IHVzZWQpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorYWNwaV9yc19tb3ZlX2RhdGEodm9pZCAqZGVzdGluYXRpb24sIHZvaWQgKnNvdXJjZSwgdTE2IGl0ZW1fY291bnQsIHU4IG1vdmVfdHlwZSkKK3sKKwlhY3BpX25hdGl2ZV91aW50IGk7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwkvKiBPbmUgbW92ZSBwZXIgaXRlbSAqLworCisJZm9yIChpID0gMDsgaSA8IGl0ZW1fY291bnQ7IGkrKykgeworCQlzd2l0Y2ggKG1vdmVfdHlwZSkgeworCQkJLyoKKwkJCSAqIEZvciB0aGUgOC1iaXQgY2FzZSwgd2UgY2FuIHBlcmZvcm0gdGhlIG1vdmUgYWxsIGF0IG9uY2UKKwkJCSAqIHNpbmNlIHRoZXJlIGFyZSBubyBhbGlnbm1lbnQgb3IgZW5kaWFuIGlzc3VlcworCQkJICovCisJCWNhc2UgQUNQSV9SU0NfTU9WRTg6CisJCQlBQ1BJX01FTUNQWShkZXN0aW5hdGlvbiwgc291cmNlLCBpdGVtX2NvdW50KTsKKwkJCXJldHVybjsKKworCQkJLyoKKwkJCSAqIDE2LSwgMzItLCBhbmQgNjQtYml0IGNhc2VzIG11c3QgdXNlIHRoZSBtb3ZlIG1hY3JvcyB0aGF0IHBlcmZvcm0KKwkJCSAqIGVuZGlhbiBjb252ZXJzaW9uIGFuZC9vciBhY2NvbW9kYXRlIGhhcmR3YXJlIHRoYXQgY2Fubm90IHBlcmZvcm0KKwkJCSAqIG1pc2FsaWduZWQgbWVtb3J5IHRyYW5zZmVycworCQkJICovCisJCWNhc2UgQUNQSV9SU0NfTU9WRTE2OgorCQkJQUNQSV9NT1ZFXzE2X1RPXzE2KCZBQ1BJX0NBU1RfUFRSKHUxNiwgZGVzdGluYXRpb24pW2ldLAorCQkJCQkgICAmQUNQSV9DQVNUX1BUUih1MTYsIHNvdXJjZSlbaV0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JTQ19NT1ZFMzI6CisJCQlBQ1BJX01PVkVfMzJfVE9fMzIoJkFDUElfQ0FTVF9QVFIodTMyLCBkZXN0aW5hdGlvbilbaV0sCisJCQkJCSAgICZBQ1BJX0NBU1RfUFRSKHUzMiwgc291cmNlKVtpXSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX01PVkU2NDoKKwkJCUFDUElfTU9WRV82NF9UT182NCgmQUNQSV9DQVNUX1BUUih1NjQsIGRlc3RpbmF0aW9uKVtpXSwKKwkJCQkJICAgJkFDUElfQ0FTVF9QVFIodTY0LCBzb3VyY2UpW2ldKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfc2V0X3Jlc291cmNlX2xlbmd0aAorICoKKyAqIFBBUkFNRVRFUlM6ICB0b3RhbF9sZW5ndGggICAgICAgIC0gTGVuZ3RoIG9mIHRoZSBBTUwgZGVzY3JpcHRvciwgaW5jbHVkaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBoZWFkZXIgYW5kIGxlbmd0aCBmaWVsZHMuCisgKiAgICAgICAgICAgICAgQW1sICAgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJhdyBBTUwgZGVzY3JpcHRvcgorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IFNldCB0aGUgcmVzb3VyY2VfbGVuZ3RoIGZpZWxkIG9mIGFuIEFNTAorICogICAgICAgICAgICAgIHJlc291cmNlIGRlc2NyaXB0b3IsIGJvdGggTGFyZ2UgYW5kIFNtYWxsIGRlc2NyaXB0b3JzIGFyZQorICogICAgICAgICAgICAgIHN1cHBvcnRlZCBhdXRvbWF0aWNhbGx5LiBOb3RlOiBEZXNjcmlwdG9yIFR5cGUgZmllbGQgbXVzdAorICogICAgICAgICAgICAgIGJlIHZhbGlkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK2FjcGlfcnNfc2V0X3Jlc291cmNlX2xlbmd0aChhY3BpX3JzZGVzY19zaXplIHRvdGFsX2xlbmd0aCwKKwkJCSAgICB1bmlvbiBhbWxfcmVzb3VyY2UgKmFtbCkKK3sKKwlhY3BpX3JzX2xlbmd0aCByZXNvdXJjZV9sZW5ndGg7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwkvKiBMZW5ndGggaXMgdGhlIHRvdGFsIGRlc2NyaXB0b3IgbGVuZ3RoIG1pbnVzIHRoZSBoZWFkZXIgbGVuZ3RoICovCisKKwlyZXNvdXJjZV9sZW5ndGggPSAoYWNwaV9yc19sZW5ndGgpCisJICAgICh0b3RhbF9sZW5ndGggLSBhY3BpX3V0X2dldF9yZXNvdXJjZV9oZWFkZXJfbGVuZ3RoKGFtbCkpOworCisJLyogTGVuZ3RoIGlzIHN0b3JlZCBkaWZmZXJlbnRseSBmb3IgbGFyZ2UgYW5kIHNtYWxsIGRlc2NyaXB0b3JzICovCisKKwlpZiAoYW1sLT5zbWFsbF9oZWFkZXIuZGVzY3JpcHRvcl90eXBlICYgQUNQSV9SRVNPVVJDRV9OQU1FX0xBUkdFKSB7CisJCS8qIExhcmdlIGRlc2NyaXB0b3IgLS0gYnl0ZXMgMS0yIGNvbnRhaW4gdGhlIDE2LWJpdCBsZW5ndGggKi8KKworCQlBQ1BJX01PVkVfMTZfVE9fMTYoJmFtbC0+bGFyZ2VfaGVhZGVyLnJlc291cmNlX2xlbmd0aCwKKwkJCQkgICAmcmVzb3VyY2VfbGVuZ3RoKTsKKwl9IGVsc2UgeworCQkvKiBTbWFsbCBkZXNjcmlwdG9yIC0tIGJpdHMgMjowIG9mIGJ5dGUgMCBjb250YWluIHRoZSBsZW5ndGggKi8KKworCQlhbWwtPnNtYWxsX2hlYWRlci5kZXNjcmlwdG9yX3R5cGUgPSAodTgpCisKKwkJICAgIC8qIENsZWFyIGFueSBleGlzdGluZyBsZW5ndGgsIHByZXNlcnZpbmcgZGVzY3JpcHRvciB0eXBlIGJpdHMgKi8KKwkJICAgICgoYW1sLT5zbWFsbF9oZWFkZXIuCisJCSAgICAgIGRlc2NyaXB0b3JfdHlwZSAmIH5BQ1BJX1JFU09VUkNFX05BTUVfU01BTExfTEVOR1RIX01BU0spCisKKwkJICAgICB8IHJlc291cmNlX2xlbmd0aCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX3NldF9yZXNvdXJjZV9oZWFkZXIKKyAqCisgKiBQQVJBTUVURVJTOiAgZGVzY3JpcHRvcl90eXBlICAgICAtIEJ5dGUgdG8gYmUgaW5zZXJ0ZWQgYXMgdGhlIHR5cGUKKyAqICAgICAgICAgICAgICB0b3RhbF9sZW5ndGggICAgICAgIC0gTGVuZ3RoIG9mIHRoZSBBTUwgZGVzY3JpcHRvciwgaW5jbHVkaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBoZWFkZXIgYW5kIGxlbmd0aCBmaWVsZHMuCisgKiAgICAgICAgICAgICAgQW1sICAgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJhdyBBTUwgZGVzY3JpcHRvcgorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IFNldCB0aGUgZGVzY3JpcHRvcl90eXBlIGFuZCByZXNvdXJjZV9sZW5ndGggZmllbGRzIG9mIGFuIEFNTAorICogICAgICAgICAgICAgIHJlc291cmNlIGRlc2NyaXB0b3IsIGJvdGggTGFyZ2UgYW5kIFNtYWxsIGRlc2NyaXB0b3JzIGFyZQorICogICAgICAgICAgICAgIHN1cHBvcnRlZCBhdXRvbWF0aWNhbGx5CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorYWNwaV9yc19zZXRfcmVzb3VyY2VfaGVhZGVyKHU4IGRlc2NyaXB0b3JfdHlwZSwKKwkJCSAgICBhY3BpX3JzZGVzY19zaXplIHRvdGFsX2xlbmd0aCwKKwkJCSAgICB1bmlvbiBhbWxfcmVzb3VyY2UgKmFtbCkKK3sKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwkvKiBTZXQgdGhlIFJlc291cmNlIFR5cGUgKi8KKworCWFtbC0+c21hbGxfaGVhZGVyLmRlc2NyaXB0b3JfdHlwZSA9IGRlc2NyaXB0b3JfdHlwZTsKKworCS8qIFNldCB0aGUgUmVzb3VyY2UgTGVuZ3RoICovCisKKwlhY3BpX3JzX3NldF9yZXNvdXJjZV9sZW5ndGgodG90YWxfbGVuZ3RoLCBhbWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX3N0cmNweQorICoKKyAqIFBBUkFNRVRFUlM6ICBEZXN0aW5hdGlvbiAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gc3RyaW5nCisgKiAgICAgICAgICAgICAgU291cmNlICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSBzdHJpbmcKKyAqCisgKiBSRVRVUk46ICAgICAgU3RyaW5nIGxlbmd0aCwgaW5jbHVkaW5nIE5VTEwgdGVybWluYXRvcgorICoKKyAqIERFU0NSSVBUSU9OOiBMb2NhbCBzdHJpbmcgY29weSB0aGF0IHJldHVybnMgdGhlIHN0cmluZyBsZW5ndGgsIHNhdmluZyBhCisgKiAgICAgICAgICAgICAgc3RyY3B5IGZvbGxvd2VkIGJ5IGEgc3RybGVuLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1MTYgYWNwaV9yc19zdHJjcHkoY2hhciAqZGVzdGluYXRpb24sIGNoYXIgKnNvdXJjZSkKK3sKKwl1MTYgaTsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCWZvciAoaSA9IDA7IHNvdXJjZVtpXTsgaSsrKSB7CisJCWRlc3RpbmF0aW9uW2ldID0gc291cmNlW2ldOworCX0KKworCWRlc3RpbmF0aW9uW2ldID0gMDsKKworCS8qIFJldHVybiBzdHJpbmcgbGVuZ3RoIGluY2x1ZGluZyB0aGUgTlVMTCB0ZXJtaW5hdG9yICovCisKKwlyZXR1cm4gKCh1MTYpIChpICsgMSkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2dldF9yZXNvdXJjZV9zb3VyY2UKKyAqCisgKiBQQVJBTUVURVJTOiAgcmVzb3VyY2VfbGVuZ3RoICAgICAtIExlbmd0aCBmaWVsZCBvZiB0aGUgZGVzY3JpcHRvcgorICogICAgICAgICAgICAgIG1pbmltdW1fbGVuZ3RoICAgICAgLSBNaW5pbXVtIGxlbmd0aCBvZiB0aGUgZGVzY3JpcHRvciAobWludXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55IG9wdGlvbmFsIGZpZWxkcykKKyAqICAgICAgICAgICAgICByZXNvdXJjZV9zb3VyY2UgICAgIC0gV2hlcmUgdGhlIHJlc291cmNlX3NvdXJjZSBpcyByZXR1cm5lZAorICogICAgICAgICAgICAgIEFtbCAgICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByYXcgQU1MIGRlc2NyaXB0b3IKKyAqICAgICAgICAgICAgICBzdHJpbmdfcHRyICAgICAgICAgIC0gKG9wdGlvbmFsKSB3aGVyZSB0byBzdG9yZSB0aGUgYWN0dWFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX3NvdXJjZSBzdHJpbmcKKyAqCisgKiBSRVRVUk46ICAgICAgTGVuZ3RoIG9mIHRoZSBzdHJpbmcgcGx1cyBOVUxMIHRlcm1pbmF0b3IsIHJvdW5kZWQgdXAgdG8gMzIgYml0CisgKgorICogREVTQ1JJUFRJT046IENvcHkgdGhlIG9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSBkYXRhIGZyb20gYSByYXcgQU1MIGRlc2NyaXB0b3IKKyAqICAgICAgICAgICAgICB0byBhbiBpbnRlcm5hbCByZXNvdXJjZSBkZXNjcmlwdG9yCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9yc19sZW5ndGgKK2FjcGlfcnNfZ2V0X3Jlc291cmNlX3NvdXJjZShhY3BpX3JzX2xlbmd0aCByZXNvdXJjZV9sZW5ndGgsCisJCQkgICAgYWNwaV9yc19sZW5ndGggbWluaW11bV9sZW5ndGgsCisJCQkgICAgc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlICogcmVzb3VyY2Vfc291cmNlLAorCQkJICAgIHVuaW9uIGFtbF9yZXNvdXJjZSAqIGFtbCwgY2hhciAqc3RyaW5nX3B0cikKK3sKKwlhY3BpX3JzZGVzY19zaXplIHRvdGFsX2xlbmd0aDsKKwl1OCAqYW1sX3Jlc291cmNlX3NvdXJjZTsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCXRvdGFsX2xlbmd0aCA9CisJICAgIHJlc291cmNlX2xlbmd0aCArIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2xhcmdlX2hlYWRlcik7CisJYW1sX3Jlc291cmNlX3NvdXJjZSA9IEFDUElfQUREX1BUUih1OCwgYW1sLCBtaW5pbXVtX2xlbmd0aCk7CisKKwkvKgorCSAqIHJlc291cmNlX3NvdXJjZSBpcyBwcmVzZW50IGlmIHRoZSBsZW5ndGggb2YgdGhlIGRlc2NyaXB0b3IgaXMgbG9uZ2VyIHRoYW4KKwkgKiB0aGUgbWluaW11bSBsZW5ndGguCisJICoKKwkgKiBOb3RlOiBTb21lIHJlc291cmNlIGRlc2NyaXB0b3JzIHdpbGwgaGF2ZSBhbiBhZGRpdGlvbmFsIG51bGwsIHNvCisJICogd2UgYWRkIDEgdG8gdGhlIG1pbmltdW0gbGVuZ3RoLgorCSAqLworCWlmICh0b3RhbF9sZW5ndGggPiAoYWNwaV9yc2Rlc2Nfc2l6ZSkgKG1pbmltdW1fbGVuZ3RoICsgMSkpIHsKKwkJLyogR2V0IHRoZSByZXNvdXJjZV9zb3VyY2VfaW5kZXggKi8KKworCQlyZXNvdXJjZV9zb3VyY2UtPmluZGV4ID0gYW1sX3Jlc291cmNlX3NvdXJjZVswXTsKKworCQlyZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19wdHIgPSBzdHJpbmdfcHRyOworCQlpZiAoIXN0cmluZ19wdHIpIHsKKwkJCS8qCisJCQkgKiBTdHJpbmcgZGVzdGluYXRpb24gcG9pbnRlciBpcyBub3Qgc3BlY2lmaWVkOyBTZXQgdGhlIFN0cmluZworCQkJICogcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJlc291cmNlX3NvdXJjZSBzdHJ1Y3R1cmUuCisJCQkgKi8KKwkJCXJlc291cmNlX3NvdXJjZS0+c3RyaW5nX3B0ciA9CisJCQkgICAgQUNQSV9BRERfUFRSKGNoYXIsIHJlc291cmNlX3NvdXJjZSwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zb3VyY2UpKTsKKwkJfQorCisJCS8qCisJCSAqIEluIG9yZGVyIGZvciB0aGUgc3RydWN0X3NpemUgdG8gZmFsbCBvbiBhIDMyLWJpdCBib3VuZGFyeSwgY2FsY3VsYXRlCisJCSAqIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAoKzEgZm9yIHRoZSBOVUxMIHRlcm1pbmF0b3IpIGFuZCBleHBhbmQgdGhlCisJCSAqIHN0cnVjdF9zaXplIHRvIHRoZSBuZXh0IDMyLWJpdCBib3VuZGFyeS4KKwkJICoKKwkJICogWmVybyB0aGUgZW50aXJlIGFyZWEgb2YgdGhlIGJ1ZmZlci4KKwkJICovCisJCXRvdGFsX2xlbmd0aCA9CisJCSAgICBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFMoQUNQSV9TVFJMRU4KKwkJCQkJICAgICAoKGNoYXIgKikmYW1sX3Jlc291cmNlX3NvdXJjZVsxXSkgKworCQkJCQkgICAgIDEpOworCQlBQ1BJX01FTVNFVChyZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19wdHIsIDAsIHRvdGFsX2xlbmd0aCk7CisKKwkJLyogQ29weSB0aGUgcmVzb3VyY2Vfc291cmNlIHN0cmluZyB0byB0aGUgZGVzdGluYXRpb24gKi8KKworCQlyZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19sZW5ndGggPQorCQkgICAgYWNwaV9yc19zdHJjcHkocmVzb3VyY2Vfc291cmNlLT5zdHJpbmdfcHRyLAorCQkJCSAgIChjaGFyICopJmFtbF9yZXNvdXJjZV9zb3VyY2VbMV0pOworCisJCXJldHVybiAoKGFjcGlfcnNfbGVuZ3RoKSB0b3RhbF9sZW5ndGgpOworCX0KKworCS8qIHJlc291cmNlX3NvdXJjZSBpcyBub3QgcHJlc2VudCAqLworCisJcmVzb3VyY2Vfc291cmNlLT5pbmRleCA9IDA7CisJcmVzb3VyY2Vfc291cmNlLT5zdHJpbmdfbGVuZ3RoID0gMDsKKwlyZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19wdHIgPSBOVUxMOworCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfc2V0X3Jlc291cmNlX3NvdXJjZQorICoKKyAqIFBBUkFNRVRFUlM6ICBBbWwgICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmF3IEFNTCBkZXNjcmlwdG9yCisgKiAgICAgICAgICAgICAgbWluaW11bV9sZW5ndGggICAgICAtIE1pbmltdW0gbGVuZ3RoIG9mIHRoZSBkZXNjcmlwdG9yIChtaW51cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkgb3B0aW9uYWwgZmllbGRzKQorICogICAgICAgICAgICAgIHJlc291cmNlX3NvdXJjZSAgICAgLSBJbnRlcm5hbCByZXNvdXJjZV9zb3VyY2UKKworICoKKyAqIFJFVFVSTjogICAgICBUb3RhbCBsZW5ndGggb2YgdGhlIEFNTCBkZXNjcmlwdG9yCisgKgorICogREVTQ1JJUFRJT046IENvbnZlcnQgYW4gb3B0aW9uYWwgcmVzb3VyY2Vfc291cmNlIGZyb20gaW50ZXJuYWwgZm9ybWF0IHRvIGEKKyAqICAgICAgICAgICAgICByYXcgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3JzZGVzY19zaXplCithY3BpX3JzX3NldF9yZXNvdXJjZV9zb3VyY2UodW5pb24gYW1sX3Jlc291cmNlICogYW1sLAorCQkJICAgIGFjcGlfcnNfbGVuZ3RoIG1pbmltdW1fbGVuZ3RoLAorCQkJICAgIHN0cnVjdCBhY3BpX3Jlc291cmNlX3NvdXJjZSAqIHJlc291cmNlX3NvdXJjZSkKK3sKKwl1OCAqYW1sX3Jlc291cmNlX3NvdXJjZTsKKwlhY3BpX3JzZGVzY19zaXplIGRlc2NyaXB0b3JfbGVuZ3RoOworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJZGVzY3JpcHRvcl9sZW5ndGggPSBtaW5pbXVtX2xlbmd0aDsKKworCS8qIE5vbi16ZXJvIHN0cmluZyBsZW5ndGggaW5kaWNhdGVzIHByZXNlbmNlIG9mIGEgcmVzb3VyY2Vfc291cmNlICovCisKKwlpZiAocmVzb3VyY2Vfc291cmNlLT5zdHJpbmdfbGVuZ3RoKSB7CisJCS8qIFBvaW50IHRvIHRoZSBlbmQgb2YgdGhlIEFNTCBkZXNjcmlwdG9yICovCisKKwkJYW1sX3Jlc291cmNlX3NvdXJjZSA9IEFDUElfQUREX1BUUih1OCwgYW1sLCBtaW5pbXVtX2xlbmd0aCk7CisKKwkJLyogQ29weSB0aGUgcmVzb3VyY2Vfc291cmNlX2luZGV4ICovCisKKwkJYW1sX3Jlc291cmNlX3NvdXJjZVswXSA9ICh1OCkgcmVzb3VyY2Vfc291cmNlLT5pbmRleDsKKworCQkvKiBDb3B5IHRoZSByZXNvdXJjZV9zb3VyY2Ugc3RyaW5nICovCisKKwkJQUNQSV9TVFJDUFkoKGNoYXIgKikmYW1sX3Jlc291cmNlX3NvdXJjZVsxXSwKKwkJCSAgICByZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19wdHIpOworCisJCS8qCisJCSAqIEFkZCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKCsgMSBmb3IgbnVsbCB0ZXJtaW5hdG9yKSB0byB0aGUKKwkJICogZmluYWwgZGVzY3JpcHRvciBsZW5ndGgKKwkJICovCisJCWRlc2NyaXB0b3JfbGVuZ3RoICs9CisJCSAgICAoKGFjcGlfcnNkZXNjX3NpemUpIHJlc291cmNlX3NvdXJjZS0+c3RyaW5nX2xlbmd0aCArIDEpOworCX0KKworCS8qIFJldHVybiB0aGUgbmV3IHRvdGFsIGxlbmd0aCBvZiB0aGUgQU1MIGRlc2NyaXB0b3IgKi8KKworCXJldHVybiAoZGVzY3JpcHRvcl9sZW5ndGgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2dldF9wcnRfbWV0aG9kX2RhdGEKICAqCiAgKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgIC0gYSBoYW5kbGUgdG8gdGhlIGNvbnRhaW5pbmcgb2JqZWN0CkBAIC02NSw4ICs0NDgsOSBAQAogICogICAgICAgICAgICAgIGFuZCB0aGUgY29udGVudHMgb2YgdGhlIGNhbGxlcnMgYnVmZmVyIGlzIHVuZGVmaW5lZC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBhY3BpX3N0YXR1cwotYWNwaV9yc19nZXRfcHJ0X21ldGhvZF9kYXRhKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKQorYWNwaV9yc19nZXRfcHJ0X21ldGhvZF9kYXRhKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IGFjcGlfYnVmZmVyICogcmV0X2J1ZmZlcikKIHsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CkBAIC0yODQsNyArNjY4LDcgQEAKIAkgKiBDb252ZXJ0IHRoZSBsaW5rZWQgbGlzdCBpbnRvIGEgYnl0ZSBzdHJlYW0KIAkgKi8KIAlidWZmZXIubGVuZ3RoID0gQUNQSV9BTExPQ0FURV9MT0NBTF9CVUZGRVI7Ci0Jc3RhdHVzID0gYWNwaV9yc19jcmVhdGVfYnl0ZV9zdHJlYW0oaW5fYnVmZmVyLT5wb2ludGVyLCAmYnVmZmVyKTsKKwlzdGF0dXMgPSBhY3BpX3JzX2NyZWF0ZV9hbWxfcmVzb3VyY2VzKGluX2J1ZmZlci0+cG9pbnRlciwgJmJ1ZmZlcik7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3hmYWNlLmMKaW5kZXggZWU1YTVjNS4uODhiNjcwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3hmYWNlLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3hmYWNlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNTcsMTMgKzU3LDE3IEBACiAJQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGRlY29kZSk7ICAgICAgICAgICAgICAgICAgICBcCiAJQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIG1pbl9hZGRyZXNzX2ZpeGVkKTsgICAgICAgICBcCiAJQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIG1heF9hZGRyZXNzX2ZpeGVkKTsgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGF0dHJpYnV0ZSk7ICAgICAgICAgICAgICAgICBcCisJQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGluZm8pOyAgICAgICAgICAgICAgICAgICAgICBcCiAJQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGdyYW51bGFyaXR5KTsgICAgICAgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIG1pbl9hZGRyZXNzX3JhbmdlKTsgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIG1heF9hZGRyZXNzX3JhbmdlKTsgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0KTsgXAorCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBtaW5pbXVtKTsgICAgICAgICAgICAgICAgICAgXAorCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBtYXhpbXVtKTsgICAgICAgICAgICAgICAgICAgXAorCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCB0cmFuc2xhdGlvbl9vZmZzZXQpOyAgICAgICAgXAogCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBhZGRyZXNzX2xlbmd0aCk7ICAgICAgICAgICAgXAogCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCByZXNvdXJjZV9zb3VyY2UpOworLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3JzX21hdGNoX3ZlbmRvcl9yZXNvdXJjZShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsIHZvaWQgKmNvbnRleHQpOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9pcnFfcm91dGluZ190YWJsZQpAQCAtODYsNiArOTAsNyBAQAogICogICAgICAgICAgICAgIHRoZSBvYmplY3QgaW5kaWNhdGVkIGJ5IHRoZSBwYXNzZWQgZGV2aWNlX2hhbmRsZS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBhY3BpX3N0YXR1cwogYWNwaV9nZXRfaXJxX3JvdXRpbmdfdGFibGUoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKIAkJCSAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcikKQEAgLTIyMiwxMiArMjI3LDEyIEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfd2Fsa19yZXNvdXJjZXMKICAqCi0gKiBQQVJBTUVURVJTOiAgZGV2aWNlX2hhbmRsZSAgIC0gYSBoYW5kbGUgdG8gdGhlIGRldmljZSBvYmplY3QgZm9yIHRoZQorICogUEFSQU1FVEVSUzogIGRldmljZV9oYW5kbGUgICAtIEhhbmRsZSB0byB0aGUgZGV2aWNlIG9iamVjdCBmb3IgdGhlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIHdlIGFyZSBxdWVyeWluZwotICogICAgICAgICAgICAgIFBhdGggICAgICAgICAgICAtIG1ldGhvZCBuYW1lIG9mIHRoZSByZXNvdXJjZXMgd2Ugd2FudAorICogICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAtIE1ldGhvZCBuYW1lIG9mIHRoZSByZXNvdXJjZXMgd2Ugd2FudAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNRVRIT0RfTkFNRV9fQ1JTIG9yIE1FVEhPRF9OQU1FX19QUlMpCi0gKiAgICAgICAgICAgICAgdXNlcl9mdW5jdGlvbiAgIC0gY2FsbGVkIGZvciBlYWNoIHJlc291cmNlCi0gKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgIC0gcGFzc2VkIHRvIHVzZXJfZnVuY3Rpb24KKyAqICAgICAgICAgICAgICB1c2VyX2Z1bmN0aW9uICAgLSBDYWxsZWQgZm9yIGVhY2ggcmVzb3VyY2UKKyAqICAgICAgICAgICAgICBDb250ZXh0ICAgICAgICAgLSBQYXNzZWQgdG8gdXNlcl9mdW5jdGlvbgogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0yMzksNzkgKzI0NCw3NCBAQAogCiBhY3BpX3N0YXR1cwogYWNwaV93YWxrX3Jlc291cmNlcyhhY3BpX2hhbmRsZSBkZXZpY2VfaGFuZGxlLAotCQkgICAgY2hhciAqcGF0aCwKKwkJICAgIGNoYXIgKm5hbWUsCiAJCSAgICBBQ1BJX1dBTEtfUkVTT1VSQ0VfQ0FMTEJBQ0sgdXNlcl9mdW5jdGlvbiwgdm9pZCAqY29udGV4dCkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyOwogCXN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZTsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqYnVmZmVyX2VuZDsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2VfZW5kOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV93YWxrX3Jlc291cmNlcyIpOwogCi0JaWYgKCFkZXZpY2VfaGFuZGxlIHx8Ci0JICAgIChBQ1BJX1NUUk5DTVAocGF0aCwgTUVUSE9EX05BTUVfX0NSUywgc2l6ZW9mKE1FVEhPRF9OQU1FX19DUlMpKSAmJgotCSAgICAgQUNQSV9TVFJOQ01QKHBhdGgsIE1FVEhPRF9OQU1FX19QUlMsIHNpemVvZihNRVRIT0RfTkFNRV9fUFJTKSkpKSB7CisJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KKworCWlmICghZGV2aWNlX2hhbmRsZSB8fCAhdXNlcl9mdW5jdGlvbiB8fCAhbmFtZSB8fAorCSAgICAoQUNQSV9TVFJOQ01QKG5hbWUsIE1FVEhPRF9OQU1FX19DUlMsIHNpemVvZihNRVRIT0RfTkFNRV9fQ1JTKSkgJiYKKwkgICAgIEFDUElfU1RSTkNNUChuYW1lLCBNRVRIT0RfTkFNRV9fUFJTLCBzaXplb2YoTUVUSE9EX05BTUVfX1BSUykpKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9yc19nZXRfbWV0aG9kX2RhdGEoZGV2aWNlX2hhbmRsZSwgcGF0aCwgJmJ1ZmZlcik7CisJLyogR2V0IHRoZSBfQ1JTIG9yIF9QUlMgcmVzb3VyY2UgbGlzdCAqLworCisJYnVmZmVyLmxlbmd0aCA9IEFDUElfQUxMT0NBVEVfTE9DQUxfQlVGRkVSOworCXN0YXR1cyA9IGFjcGlfcnNfZ2V0X21ldGhvZF9kYXRhKGRldmljZV9oYW5kbGUsIG5hbWUsICZidWZmZXIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQkvKiBTZXR1cCBwb2ludGVycyAqLworCS8qIEJ1ZmZlciBub3cgY29udGFpbnMgdGhlIHJlc291cmNlIGxpc3QgKi8KIAotCXJlc291cmNlID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlICopYnVmZmVyLnBvaW50ZXI7Ci0JYnVmZmVyX2VuZCA9IEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfcmVzb3VyY2UsCi0JCQkJICAgKCh1OCAqKSBidWZmZXIucG9pbnRlciArIGJ1ZmZlci5sZW5ndGgpKTsKKwlyZXNvdXJjZSA9IEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfcmVzb3VyY2UsIGJ1ZmZlci5wb2ludGVyKTsKKwlyZXNvdXJjZV9lbmQgPQorCSAgICBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlfcmVzb3VyY2UsIGJ1ZmZlci5wb2ludGVyLCBidWZmZXIubGVuZ3RoKTsKIAotCS8qIFdhbGsgdGhlIHJlc291cmNlIGxpc3QgKi8KKwkvKiBXYWxrIHRoZSByZXNvdXJjZSBsaXN0IHVudGlsIHRoZSBlbmRfdGFnIGlzIGZvdW5kIChvciBidWZmZXIgZW5kKSAqLwogCi0JZm9yICg7OykgewotCQlpZiAoIXJlc291cmNlIHx8IHJlc291cmNlLT5pZCA9PSBBQ1BJX1JTVFlQRV9FTkRfVEFHKSB7CisJd2hpbGUgKHJlc291cmNlIDwgcmVzb3VyY2VfZW5kKSB7CisJCS8qIFNhbml0eSBjaGVjayB0aGUgcmVzb3VyY2UgKi8KKworCQlpZiAocmVzb3VyY2UtPnR5cGUgPiBBQ1BJX1JFU09VUkNFX1RZUEVfTUFYKSB7CisJCQlzdGF0dXMgPSBBRV9BTUxfSU5WQUxJRF9SRVNPVVJDRV9UWVBFOwogCQkJYnJlYWs7CiAJCX0KIAorCQkvKiBJbnZva2UgdGhlIHVzZXIgZnVuY3Rpb24sIGFib3J0IG9uIGFueSBlcnJvciByZXR1cm5lZCAqLworCiAJCXN0YXR1cyA9IHVzZXJfZnVuY3Rpb24ocmVzb3VyY2UsIGNvbnRleHQpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWlmIChzdGF0dXMgPT0gQUVfQ1RSTF9URVJNSU5BVEUpIHsKKwkJCQkvKiBUaGlzIGlzIGFuIE9LIHRlcm1pbmF0aW9uIGJ5IHRoZSB1c2VyIGZ1bmN0aW9uICovCiAKLQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJY2FzZSBBRV9PSzoKLQkJY2FzZSBBRV9DVFJMX0RFUFRIOgotCi0JCQkvKiBKdXN0IGtlZXAgZ29pbmcgKi8KLQotCQkJc3RhdHVzID0gQUVfT0s7CisJCQkJc3RhdHVzID0gQUVfT0s7CisJCQl9CiAJCQlicmVhazsKKwkJfQogCi0JCWNhc2UgQUVfQ1RSTF9URVJNSU5BVEU6CisJCS8qIGVuZF90YWcgaW5kaWNhdGVzIGVuZC1vZi1saXN0ICovCiAKLQkJCS8qIEV4aXQgbm93LCB3aXRoIE9LIHN0YXRzICovCi0KLQkJCXN0YXR1cyA9IEFFX09LOwotCQkJZ290byBjbGVhbnVwOwotCi0JCWRlZmF1bHQ6Ci0KLQkJCS8qIEFsbCBvdGhlcnMgYXJlIHZhbGlkIGV4Y2VwdGlvbnMgKi8KLQotCQkJZ290byBjbGVhbnVwOworCQlpZiAocmVzb3VyY2UtPnR5cGUgPT0gQUNQSV9SRVNPVVJDRV9UWVBFX0VORF9UQUcpIHsKKwkJCWJyZWFrOwogCQl9CiAKIAkJLyogR2V0IHRoZSBuZXh0IHJlc291cmNlIGRlc2NyaXB0b3IgKi8KIAotCQlyZXNvdXJjZSA9IEFDUElfTkVYVF9SRVNPVVJDRShyZXNvdXJjZSk7Ci0KLQkJLyogQ2hlY2sgZm9yIGVuZC1vZi1idWZmZXIgKi8KLQotCQlpZiAocmVzb3VyY2UgPj0gYnVmZmVyX2VuZCkgewotCQkJZ290byBjbGVhbnVwOwotCQl9CisJCXJlc291cmNlID0KKwkJICAgIEFDUElfQUREX1BUUihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSwgcmVzb3VyY2UsCisJCQkJIHJlc291cmNlLT5sZW5ndGgpOwogCX0KIAotICAgICAgY2xlYW51cDoKLQotCWFjcGlfb3NfZnJlZShidWZmZXIucG9pbnRlcik7CisJQUNQSV9NRU1fRlJFRShidWZmZXIucG9pbnRlcik7CiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKQEAgLTM2MCw4ICszNjAsOCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3Jlc291cmNlX3RvX2FkZHJlc3M2NAogICoKLSAqIFBBUkFNRVRFUlM6ICByZXNvdXJjZSAgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gYSByZXNvdXJjZQotICogICAgICAgICAgICAgIG91dCAgICAgICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgdXNlcnMncyByZXR1cm4KKyAqIFBBUkFNRVRFUlM6ICBSZXNvdXJjZSAgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gYSByZXNvdXJjZQorICogICAgICAgICAgICAgIE91dCAgICAgICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgdXNlcnMncyByZXR1cm4KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciAoYSBzdHJ1Y3QKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCkKICAqCkBAIC0zODEsMjAgKzM4MSwyNiBAQAogCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNiAqYWRkcmVzczE2OwogCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMiAqYWRkcmVzczMyOwogCi0Jc3dpdGNoIChyZXNvdXJjZS0+aWQpIHsKLQljYXNlIEFDUElfUlNUWVBFX0FERFJFU1MxNjoKKwlpZiAoIXJlc291cmNlIHx8ICFvdXQpIHsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKiBDb252ZXJ0IDE2IG9yIDMyIGFkZHJlc3MgZGVzY3JpcHRvciB0byA2NCAqLworCisJc3dpdGNoIChyZXNvdXJjZS0+dHlwZSkgeworCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MxNjoKIAogCQlhZGRyZXNzMTYgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2ICopJnJlc291cmNlLT5kYXRhOwogCQlBQ1BJX0NPUFlfQUREUkVTUyhvdXQsIGFkZHJlc3MxNik7CiAJCWJyZWFrOwogCi0JY2FzZSBBQ1BJX1JTVFlQRV9BRERSRVNTMzI6CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzMyOgogCiAJCWFkZHJlc3MzMiA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMzIgKikmcmVzb3VyY2UtPmRhdGE7CiAJCUFDUElfQ09QWV9BRERSRVNTKG91dCwgYWRkcmVzczMyKTsKIAkJYnJlYWs7CiAKLQljYXNlIEFDUElfUlNUWVBFX0FERFJFU1M2NDoKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTNjQ6CiAKIAkJLyogU2ltcGxlIGNvcHkgZm9yIDY0IGJpdCBzb3VyY2UgKi8KIApAQCAtNDEwLDMgKzQxNiwxMTMgQEAKIH0KIAogRVhQT1JUX1NZTUJPTChhY3BpX3Jlc291cmNlX3RvX2FkZHJlc3M2NCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3ZlbmRvcl9yZXNvdXJjZQorICoKKyAqIFBBUkFNRVRFUlM6ICBkZXZpY2VfaGFuZGxlICAgICAgIC0gSGFuZGxlIGZvciB0aGUgcGFyZW50IGRldmljZSBvYmplY3QKKyAqICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgIC0gTWV0aG9kIG5hbWUgZm9yIHRoZSBwYXJlbnQgcmVzb3VyY2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1FVEhPRF9OQU1FX19DUlMgb3IgTUVUSE9EX05BTUVfX1BSUykKKyAqICAgICAgICAgICAgICBVdWlkICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgVVVJRCB0byBiZSBtYXRjaGVkLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyBib3RoIHN1YnR5cGUgYW5kIDE2LWJ5dGUgVVVJRAorICogICAgICAgICAgICAgIHJldF9idWZmZXIgICAgICAgICAgLSBXaGVyZSB0aGUgdmVuZG9yIHJlc291cmNlIGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBXYWxrIGEgcmVzb3VyY2UgdGVtcGxhdGUgZm9yIHRoZSBzcGVjaWZpZWQgZXZpY2UgdG8gZmluZCBhCisgKiAgICAgICAgICAgICAgdmVuZG9yLWRlZmluZWQgcmVzb3VyY2UgdGhhdCBtYXRjaGVzIHRoZSBzdXBwbGllZCBVVUlEIGFuZAorICogICAgICAgICAgICAgIFVVSUQgc3VidHlwZS4gUmV0dXJucyBhIHN0cnVjdCBhY3BpX3Jlc291cmNlIG9mIHR5cGUgVmVuZG9yLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2dldF92ZW5kb3JfcmVzb3VyY2UoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKKwkJCSBjaGFyICpuYW1lLAorCQkJIHN0cnVjdCBhY3BpX3ZlbmRvcl91dWlkICogdXVpZCwKKwkJCSBzdHJ1Y3QgYWNwaV9idWZmZXIgKiByZXRfYnVmZmVyKQoreworCXN0cnVjdCBhY3BpX3ZlbmRvcl93YWxrX2luZm8gaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwkvKiBPdGhlciBwYXJhbWV0ZXJzIGFyZSB2YWxpZGF0ZWQgYnkgYWNwaV93YWxrX3Jlc291cmNlcyAqLworCisJaWYgKCF1dWlkIHx8ICFyZXRfYnVmZmVyKSB7CisJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJaW5mby51dWlkID0gdXVpZDsKKwlpbmZvLmJ1ZmZlciA9IHJldF9idWZmZXI7CisJaW5mby5zdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CisKKwkvKiBXYWxrIHRoZSBfQ1JTIG9yIF9QUlMgcmVzb3VyY2UgbGlzdCBmb3IgdGhpcyBkZXZpY2UgKi8KKworCXN0YXR1cyA9CisJICAgIGFjcGlfd2Fsa19yZXNvdXJjZXMoZGV2aWNlX2hhbmRsZSwgbmFtZSwKKwkJCQlhY3BpX3JzX21hdGNoX3ZlbmRvcl9yZXNvdXJjZSwgJmluZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQorCisJcmV0dXJuIChpbmZvLnN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfbWF0Y2hfdmVuZG9yX3Jlc291cmNlCisgKgorICogUEFSQU1FVEVSUzogIEFDUElfV0FMS19SRVNPVVJDRV9DQUxMQkFDSworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogTWF0Y2ggYSB2ZW5kb3IgcmVzb3VyY2UgdmlhIHRoZSBBQ1BJIDMuMCBVVUlECisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3JzX21hdGNoX3ZlbmRvcl9yZXNvdXJjZShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGFjcGlfdmVuZG9yX3dhbGtfaW5mbyAqaW5mbyA9IGNvbnRleHQ7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yX3R5cGVkICp2ZW5kb3I7CisJc3RydWN0IGFjcGlfYnVmZmVyICpidWZmZXI7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJLyogSWdub3JlIGFsbCBkZXNjcmlwdG9ycyBleGNlcHQgVmVuZG9yICovCisKKwlpZiAocmVzb3VyY2UtPnR5cGUgIT0gQUNQSV9SRVNPVVJDRV9UWVBFX1ZFTkRPUikgeworCQlyZXR1cm4gKEFFX09LKTsKKwl9CisKKwl2ZW5kb3IgPSAmcmVzb3VyY2UtPmRhdGEudmVuZG9yX3R5cGVkOworCisJLyoKKwkgKiBGb3IgYSB2YWxpZCBtYXRjaCwgdGhlc2UgY29uZGl0aW9ucyBtdXN0IGhvbGQ6CisJICoKKwkgKiAxKSBMZW5ndGggb2YgZGVzY3JpcHRvciBkYXRhIG11c3QgYmUgYXQgbGVhc3QgYXMgbG9uZyBhcyBhIFVVSUQgc3RydWN0CisJICogMikgVGhlIFVVSUQgc3VidHlwZXMgbXVzdCBtYXRjaAorCSAqIDMpIFRoZSBVVUlEIGRhdGEgbXVzdCBtYXRjaAorCSAqLworCWlmICgodmVuZG9yLT5ieXRlX2xlbmd0aCA8IChBQ1BJX1VVSURfTEVOR1RIICsgMSkpIHx8CisJICAgICh2ZW5kb3ItPnV1aWRfc3VidHlwZSAhPSBpbmZvLT51dWlkLT5zdWJ0eXBlKSB8fAorCSAgICAoQUNQSV9NRU1DTVAodmVuZG9yLT51dWlkLCBpbmZvLT51dWlkLT5kYXRhLCBBQ1BJX1VVSURfTEVOR1RIKSkpIHsKKwkJcmV0dXJuIChBRV9PSyk7CisJfQorCisJLyogVmFsaWRhdGUvQWxsb2NhdGUvQ2xlYXIgY2FsbGVyIGJ1ZmZlciAqLworCisJYnVmZmVyID0gaW5mby0+YnVmZmVyOworCXN0YXR1cyA9IGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIoYnVmZmVyLCByZXNvdXJjZS0+bGVuZ3RoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCS8qIEZvdW5kIHRoZSBjb3JyZWN0IHJlc291cmNlLCBjb3B5IGFuZCByZXR1cm4gaXQgKi8KKworCUFDUElfTUVNQ1BZKGJ1ZmZlci0+cG9pbnRlciwgcmVzb3VyY2UsIHJlc291cmNlLT5sZW5ndGgpOworCWJ1ZmZlci0+bGVuZ3RoID0gcmVzb3VyY2UtPmxlbmd0aDsKKworCS8qIEZvdW5kIHRoZSBkZXNpcmVkIGRlc2NyaXB0b3IsIHRlcm1pbmF0ZSByZXNvdXJjZSB3YWxrICovCisKKwlpbmZvLT5zdGF0dXMgPSBBRV9PSzsKKwlyZXR1cm4gKEFFX0NUUkxfVEVSTUlOQVRFKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zY2FuLmMgYi9kcml2ZXJzL2FjcGkvc2Nhbi5jCmluZGV4IDA3NDVkMjAuLjkyNzFlNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zY2FuLmMKKysrIGIvZHJpdmVycy9hY3BpL3NjYW4uYwpAQCAtNDc1LDggKzQ3NSwxMCBAQAogc3RhdGljIERFQ0xBUkVfTVVURVgoYWNwaV9idXNfZHJpdmVyc19sb2NrKTsKIAogLyoqCi0gKiBhY3BpX2J1c19tYXRjaCAKLSAqIC0tLS0tLS0tLS0tLS0tCisgKiBhY3BpX2J1c19tYXRjaCAtIG1hdGNoIGRldmljZSBJRHMgdG8gZHJpdmVyJ3Mgc3VwcG9ydGVkIElEcworICogQGRldmljZTogdGhlIGRldmljZSB0aGF0IHdlIGFyZSB0cnlpbmcgdG8gbWF0Y2ggdG8gYSBkcml2ZXIKKyAqIEBkcml2ZXI6IGRyaXZlciB3aG9zZSBkZXZpY2UgaWQgdGFibGUgaXMgYmVpbmcgY2hlY2tlZAorICoKICAqIENoZWNrcyB0aGUgZGV2aWNlJ3MgaGFyZHdhcmUgKF9ISUQpIG9yIGNvbXBhdGlibGUgKF9DSUQpIGlkcyB0byBzZWUgaWYgaXQKICAqIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBkcml2ZXIncyBjcml0ZXJpYS4KICAqLwpAQCAtNDg5LDggKzQ5MSwxMCBAQAogfQogCiAvKioKLSAqIGFjcGlfYnVzX2RyaXZlcl9pbml0IAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGFjcGlfYnVzX2RyaXZlcl9pbml0IC0gYWRkIGEgZGV2aWNlIHRvIGEgZHJpdmVyCisgKiBAZGV2aWNlOiB0aGUgZGV2aWNlIHRvIGFkZCBhbmQgaW5pdGlhbGl6ZQorICogQGRyaXZlcjogZHJpdmVyIGZvciB0aGUgZGV2aWNlCisgKgogICogVXNlZCB0byBpbml0aWFsaXplIGEgZGV2aWNlIHZpYSBpdHMgZGV2aWNlIGRyaXZlci4gIENhbGxlZCB3aGVuZXZlciBhIAogICogZHJpdmVyIGlzIGJvdW5kIHRvIGEgZGV2aWNlLiAgSW52b2tlcyB0aGUgZHJpdmVyJ3MgYWRkKCkgYW5kIHN0YXJ0KCkgb3BzLgogICovCkBAIC02MDMsOCArNjA3LDkgQEAKIH0KIAogLyoqCi0gKiBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIgCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIgLSByZWdpc3RlciBhIGRyaXZlciB3aXRoIHRoZSBBQ1BJIGJ1cworICogQGRyaXZlcjogZHJpdmVyIGJlaW5nIHJlZ2lzdGVyZWQKKyAqCiAgKiBSZWdpc3RlcnMgYSBkcml2ZXIgd2l0aCB0aGUgQUNQSSBidXMuICBTZWFyY2hlcyB0aGUgbmFtZXNwYWNlIGZvciBhbGwKICAqIGRldmljZXMgdGhhdCBtYXRjaCB0aGUgZHJpdmVyJ3MgY3JpdGVyaWEgYW5kIGJpbmRzLiAgUmV0dXJucyB0aGUKICAqIG51bWJlciBvZiBkZXZpY2VzIHRoYXQgd2VyZSBjbGFpbWVkIGJ5IHRoZSBkcml2ZXIsIG9yIGEgbmVnYXRpdmUKQEAgLTYzMyw4ICs2MzgsOSBAQAogRVhQT1JUX1NZTUJPTChhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIpOwogCiAvKioKLSAqIGFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyIAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyIC0gdW5yZWdpc3RlcnMgYSBkcml2ZXIgd2l0aCB0aGUgQVBJQyBidXMKKyAqIEBkcml2ZXI6IGRyaXZlciB0byB1bnJlZ2lzdGVyCisgKgogICogVW5yZWdpc3RlcnMgYSBkcml2ZXIgd2l0aCB0aGUgQUNQSSBidXMuICBTZWFyY2hlcyB0aGUgbmFtZXNwYWNlIGZvciBhbGwKICAqIGRldmljZXMgdGhhdCBtYXRjaCB0aGUgZHJpdmVyJ3MgY3JpdGVyaWEgYW5kIHVuYmluZHMuCiAgKi8KQEAgLTY2MCw4ICs2NjYsOSBAQAogRVhQT1JUX1NZTUJPTChhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcik7CiAKIC8qKgotICogYWNwaV9idXNfZmluZF9kcml2ZXIgCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICogYWNwaV9idXNfZmluZF9kcml2ZXIgLSBjaGVjayBpZiB0aGVyZSBpcyBhIGRyaXZlciBpbnN0YWxsZWQgZm9yIHRoZSBkZXZpY2UKKyAqIEBkZXZpY2U6IGRldmljZSB0aGF0IHdlIGFyZSB0cnlpbmcgdG8gZmluZCBhIHN1cHBvcnRpbmcgZHJpdmVyIGZvcgorICoKICAqIFBhcnNlcyB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIGRyaXZlcnMgbG9va2luZyBmb3IgYSBkcml2ZXIgYXBwbGljYWJsZSBmb3IKICAqIHRoZSBzcGVjaWZpZWQgZGV2aWNlLgogICovCkBAIC04NDQsNyArODUxLDcgQEAKIAkgKiAtLS0tCiAJICogRml4IGZvciB0aGUgc3lzdGVtIHJvb3QgYnVzIGRldmljZSAtLSB0aGUgb25seSByb290LWxldmVsIGRldmljZS4KIAkgKi8KLQlpZiAoKHBhcmVudCA9PSBBQ1BJX1JPT1RfT0JKRUNUKSAmJiAodHlwZSA9PSBBQ1BJX0JVU19UWVBFX0RFVklDRSkpIHsKKwlpZiAoKChhY3BpX2hhbmRsZSlwYXJlbnQgPT0gQUNQSV9ST09UX09CSkVDVCkgJiYgKHR5cGUgPT0gQUNQSV9CVVNfVFlQRV9ERVZJQ0UpKSB7CiAJCWhpZCA9IEFDUElfQlVTX0hJRDsKIAkJc3RyY3B5KGRldmljZS0+cG5wLmRldmljZV9uYW1lLCBBQ1BJX0JVU19ERVZJQ0VfTkFNRSk7CiAJCXN0cmNweShkZXZpY2UtPnBucC5kZXZpY2VfY2xhc3MsIEFDUElfQlVTX0NMQVNTKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zbGVlcC9wb3dlcm9mZi5jIGIvZHJpdmVycy9hY3BpL3NsZWVwL3Bvd2Vyb2ZmLmMKaW5kZXggYWY3OTM1YS4uNDdmYjRiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwL3Bvd2Vyb2ZmLmMKKysrIGIvZHJpdmVycy9hY3BpL3NsZWVwL3Bvd2Vyb2ZmLmMKQEAgLTMzLDkgKzMzLDcgQEAKIAlBQ1BJX0ZMVVNIX0NQVV9DQUNIRSgpOwogCWFjcGlfZW5hYmxlX3dha2V1cF9kZXZpY2VfcHJlcChhY3BpX3N0YXRlKTsKICNlbmRpZgotCWlmIChhY3BpX3N0YXRlID09IEFDUElfU1RBVEVfUzUpIHsKLQkJYWNwaV93YWtldXBfZ3BlX3Bvd2Vyb2ZmX3ByZXBhcmUoKTsKLQl9CisJYWNwaV9ncGVfc2xlZXBfcHJlcGFyZShhY3BpX3N0YXRlKTsKIAlhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3ByZXAoYWNwaV9zdGF0ZSk7CiAJcmV0dXJuIDA7CiB9CkBAIC01MywxMSArNTEsMTYgQEAKIAogc3RhdGljIGludCBhY3BpX3NodXRkb3duKHN0cnVjdCBzeXNfZGV2aWNlICp4KQogewotCWlmIChzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1BPV0VSX09GRikgewotCQkvKiBQcmVwYXJlIGlmIHdlIGFyZSBnb2luZyB0byBwb3dlciBvZmYgdGhlIHN5c3RlbSAqLworCXN3aXRjaCAoc3lzdGVtX3N0YXRlKSB7CisJY2FzZSBTWVNURU1fUE9XRVJfT0ZGOgorCQkvKiBQcmVwYXJlIHRvIHBvd2VyIG9mZiB0aGUgc3lzdGVtICovCiAJCXJldHVybiBhY3BpX3NsZWVwX3ByZXBhcmUoQUNQSV9TVEFURV9TNSk7CisJY2FzZSBTWVNURU1fU1VTUEVORF9ESVNLOgorCQkvKiBQcmVwYXJlIHRvIHN1c3BlbmQgdGhlIHN5c3RlbSB0byBkaXNrICovCisJCXJldHVybiBhY3BpX3NsZWVwX3ByZXBhcmUoQUNQSV9TVEFURV9TNCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CiAJfQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBhY3BpX3N5c2NsYXNzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NsZWVwL3NsZWVwLmggYi9kcml2ZXJzL2FjcGkvc2xlZXAvc2xlZXAuaAppbmRleCBlZmQwMDAxLi5mM2U3MDM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2xlZXAvc2xlZXAuaAorKysgYi9kcml2ZXJzL2FjcGkvc2xlZXAvc2xlZXAuaApAQCAtNSw0ICs1LDQgQEAKIGV4dGVybiB2b2lkIGFjcGlfZW5hYmxlX3dha2V1cF9kZXZpY2VfcHJlcCh1OCBzbGVlcF9zdGF0ZSk7CiBleHRlcm4gdm9pZCBhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlKHU4IHNsZWVwX3N0YXRlKTsKIGV4dGVybiB2b2lkIGFjcGlfZGlzYWJsZV93YWtldXBfZGV2aWNlKHU4IHNsZWVwX3N0YXRlKTsKLWV4dGVybiB2b2lkIGFjcGlfd2FrZXVwX2dwZV9wb3dlcm9mZl9wcmVwYXJlKHZvaWQpOworZXh0ZXJuIHZvaWQgYWNwaV9ncGVfc2xlZXBfcHJlcGFyZSh1MzIgc2xlZXBfc3RhdGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NsZWVwL3dha2V1cC5jIGIvZHJpdmVycy9hY3BpL3NsZWVwL3dha2V1cC5jCmluZGV4IDQxMzRlZDQuLjg1ZGYwY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zbGVlcC93YWtldXAuYworKysgYi9kcml2ZXJzL2FjcGkvc2xlZXAvd2FrZXVwLmMKQEAgLTE5Miw3ICsxOTIsNyBAQAogICogUlVOVElNRSBHUEVzLCB3ZSBzaW1wbHkgbWFyayBhbGwgR1BFUyB0aGF0CiAgKiBhcmUgbm90IGVuYWJsZWQgZm9yIHdha2V1cCBmcm9tIFM1IGFzIFJVTlRJTUUuCiAgKi8KLXZvaWQgYWNwaV93YWtldXBfZ3BlX3Bvd2Vyb2ZmX3ByZXBhcmUodm9pZCkKK3ZvaWQgYWNwaV9ncGVfc2xlZXBfcHJlcGFyZSh1MzIgc2xlZXBfc3RhdGUpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7CiAKQEAgLTIwMSw4ICsyMDEsOCBAQAogCQkJCQkJICAgICAgIHN0cnVjdCBhY3BpX2RldmljZSwKIAkJCQkJCSAgICAgICB3YWtldXBfbGlzdCk7CiAKLQkJLyogVGhlIEdQRSBjYW4gd2FrZXVwIHN5c3RlbSBmcm9tIFM1LCBkb24ndCB0b3VjaCBpdCAqLwotCQlpZiAoKHUzMikgZGV2LT53YWtldXAuc2xlZXBfc3RhdGUgPT0gQUNQSV9TVEFURV9TNSkKKwkJLyogVGhlIEdQRSBjYW4gd2FrZXVwIHN5c3RlbSBmcm9tIHRoaXMgc3RhdGUsIGRvbid0IHRvdWNoIGl0ICovCisJCWlmICgodTMyKSBkZXYtPndha2V1cC5zbGVlcF9zdGF0ZSA+PSBzbGVlcF9zdGF0ZSkKIAkJCWNvbnRpbnVlOwogCQkvKiBhY3BpX3NldF9ncGVfdHlwZSB3aWxsIGF1dG9tYXRpY2FsbHkgZGlzYWJsZSBHUEUgKi8KIAkJYWNwaV9zZXRfZ3BlX3R5cGUoZGV2LT53YWtldXAuZ3BlX2RldmljZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMuYwppbmRleCBhMmJmMjViLi4zMWQ0ZjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzLmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy5jCkBAIC0zNyw3ICszNyw3IEBACiAKICNkZWZpbmUgUFJFRklYCQkJIkFDUEk6ICIKIAotI2RlZmluZSBBQ1BJX01BWF9UQUJMRVMJCTI1NgorI2RlZmluZSBBQ1BJX01BWF9UQUJMRVMJCTEyOAogCiBzdGF0aWMgY2hhciAqYWNwaV90YWJsZV9zaWduYXR1cmVzW0FDUElfVEFCTEVfQ09VTlRdID0gewogCVtBQ1BJX1RBQkxFX1VOS05PV05dID0gIj8/Pz8iLApAQCAtNzQsNyArNzQsNyBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgc2R0X3BhOwkvKiBQaHlzaWNhbCBBZGRyZXNzICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzZHRfY291bnQ7CS8qIFRhYmxlIGNvdW50ICovCiAKLXN0YXRpYyBzdHJ1Y3QgYWNwaV90YWJsZV9zZHQgc2R0X2VudHJ5W0FDUElfTUFYX1RBQkxFU107CitzdGF0aWMgc3RydWN0IGFjcGlfdGFibGVfc2R0IHNkdF9lbnRyeVtBQ1BJX01BWF9UQUJMRVNdIF9faW5pdGRhdGE7CiAKIHZvaWQgYWNwaV90YWJsZV9wcmludChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlciwgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiY29udnJ0LmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiY29udnJ0LmMKaW5kZXggYTAzOTM5My4uNDgyOTBiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YmNvbnZydC5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJjb252cnQuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTU1NCw3ICs1NTQsOSBAQAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfVEFCTEVTLAogCQkJICAiSGV4IGR1bXAgb2YgY29tbW9uIGludGVybmFsIEZBRFQsIHNpemUgJWQgKCVYKVxuIiwKIAkJCSAgYWNwaV9nYmxfRkFEVC0+bGVuZ3RoLCBhY3BpX2dibF9GQURULT5sZW5ndGgpKTsKLQlBQ1BJX0RVTVBfQlVGRkVSKCh1OCAqKSAoYWNwaV9nYmxfRkFEVCksIGFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCk7CisKKwlBQ1BJX0RVTVBfQlVGRkVSKEFDUElfQ0FTVF9QVFIodTgsIGFjcGlfZ2JsX0ZBRFQpLAorCQkJIGFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCk7CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldC5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldC5jCmluZGV4IDZhY2Q1YWUuLjBmZWRmNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJnZXQuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0LmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zNjIsOCArMzYyLDggQEAKIAogCWRlZmF1bHQ6CiAKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgYWRkcmVzcyBmbGFncyAlWFxuIiwKLQkJCQkgIGFkZHJlc3MtPnBvaW50ZXJfdHlwZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkludmFsaWQgYWRkcmVzcyBmbGFncyAlWFxuIiwKKwkJCQkgICBhZGRyZXNzLT5wb2ludGVyX3R5cGUpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldGFsbC5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldGFsbC5jCmluZGV4IDhkNzIzNDMuLjQ5NmYzMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJnZXRhbGwuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0YWxsLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0yOTIsNyArMjkyLDkgQEAKIAkJCSAgIkhleCBkdW1wIG9mIGVudGlyZSBEU0RULCBzaXplICVkICgweCVYKSwgSW50ZWdlciB3aWR0aCA9ICVkXG4iLAogCQkJICBhY3BpX2dibF9EU0RULT5sZW5ndGgsIGFjcGlfZ2JsX0RTRFQtPmxlbmd0aCwKIAkJCSAgYWNwaV9nYmxfaW50ZWdlcl9iaXRfd2lkdGgpKTsKLQlBQ1BJX0RVTVBfQlVGRkVSKCh1OCAqKSBhY3BpX2dibF9EU0RULCBhY3BpX2dibF9EU0RULT5sZW5ndGgpOworCisJQUNQSV9EVU1QX0JVRkZFUihBQ1BJX0NBU1RfUFRSKHU4LCBhY3BpX2dibF9EU0RUKSwKKwkJCSBhY3BpX2dibF9EU0RULT5sZW5ndGgpOwogCiAJLyogQWx3YXlzIGRlbGV0ZSB0aGUgUlNEUCBtYXBwaW5nLCB3ZSBhcmUgZG9uZSB3aXRoIGl0ICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJpbnN0YWwuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJpbnN0YWwuYwppbmRleCAxMGRiODQ4Li5lMWM5ZmFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiaW5zdGFsLmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90Ymluc3RhbC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YnJzZHQuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJyc2R0LmMKaW5kZXggYWQwMjUyYy4uMTc4MzA5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YnJzZHQuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RicnNkdC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMTc2LDcgKzE3Niw3IEBACiB7CiAJaW50IG5vX21hdGNoOwogCi0JQUNQSV9GVU5DVElPTl9OQU1FKCJ0Yl92YWxpZGF0ZV9yc2R0Iik7CisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJLyoKIAkgKiBTZWFyY2ggZm9yIGFwcHJvcHJpYXRlIHNpZ25hdHVyZSwgUlNEVCBvciBYU0RUCkBAIC0xOTIsMTUgKzE5MiwxMSBAQAogCWlmIChub19tYXRjaCkgewogCQkvKiBJbnZhbGlkIFJTRFQgb3IgWFNEVCBzaWduYXR1cmUgKi8KIAotCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkludmFsaWQgc2lnbmF0dXJlIHdoZXJlIFJTRFAgaW5kaWNhdGVzIFJTRFQvWFNEVCBzaG91bGQgYmUgbG9jYXRlZFxuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkludmFsaWQgc2lnbmF0dXJlIHdoZXJlIFJTRFAgaW5kaWNhdGVzIFJTRFQvWFNEVCBzaG91bGQgYmUgbG9jYXRlZC4gUlNEUDpcbiIpKTsKIAogCQlBQ1BJX0RVTVBfQlVGRkVSKGFjcGlfZ2JsX1JTRFAsIDIwKTsKIAotCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICAgICAiUlNEVC9YU0RUIHNpZ25hdHVyZSBhdCAlWCAoJXApIGlzIGludmFsaWRcbiIsCi0JCQkJICAgICAgYWNwaV9nYmxfUlNEUC0+cnNkdF9waHlzaWNhbF9hZGRyZXNzLAotCQkJCSAgICAgICh2b2lkICopKGFjcGlfbmF0aXZlX3VpbnQpIGFjcGlfZ2JsX1JTRFAtPgotCQkJCSAgICAgIHJzZHRfcGh5c2ljYWxfYWRkcmVzcykpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlJTRFQvWFNEVCBzaWduYXR1cmUgYXQgJVggKCVwKSBpcyBpbnZhbGlkXG4iLCBhY3BpX2dibF9SU0RQLT5yc2R0X3BoeXNpY2FsX2FkZHJlc3MsICh2b2lkICopKGFjcGlfbmF0aXZlX3VpbnQpIGFjcGlfZ2JsX1JTRFAtPnJzZHRfcGh5c2ljYWxfYWRkcmVzcykpOwogCiAJCWlmIChhY3BpX2dibF9yb290X3RhYmxlX3R5cGUgPT0gQUNQSV9UQUJMRV9UWVBFX1JTRFQpIHsKIAkJCUFDUElfUkVQT1JUX0VSUk9SKCgiTG9va2luZyBmb3IgUlNEVFxuIikpCkBAIC0yMDksNyArMjA1LDYgQEAKIAkJfQogCiAJCUFDUElfRFVNUF9CVUZGRVIoKGNoYXIgKil0YWJsZV9wdHIsIDQ4KTsKLQogCQlyZXR1cm4gKEFFX0JBRF9TSUdOQVRVUkUpOwogCX0KIApAQCAtMjQzLDE1ICsyMzgsMTQgQEAKIAl0YWJsZV9pbmZvLnR5cGUgPSBBQ1BJX1RBQkxFX1hTRFQ7CiAJc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGUoJmFkZHJlc3MsICZ0YWJsZV9pbmZvKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJDb3VsZCBub3QgZ2V0IHRoZSBSU0RUL1hTRFQsICVzXG4iLAotCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgZ2V0IHRoZSBSU0RUL1hTRFQsICVzXG4iLAorCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAKIAkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJICAiUlNEUCBsb2NhdGVkIGF0ICVwLCBwb2ludHMgdG8gUlNEVCBwaHlzaWNhbD0lOC44WCU4LjhYIFxuIiwKKwkJCSAgIlJTRFAgbG9jYXRlZCBhdCAlcCwgcG9pbnRzIHRvIFJTRFQgcGh5c2ljYWw9JTguOFglOC44WFxuIiwKIAkJCSAgYWNwaV9nYmxfUlNEUCwKIAkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3MucG9pbnRlci52YWx1ZSkpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YnV0aWxzLmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RidXRpbHMuYwppbmRleCA0YjJmYmI1Li4zOGM2NzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RidXRpbHMuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RidXRpbHMuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTk0LDkgKzk0LDggQEAKIAkJICAgICBuZXdfdGFibGVfZGVzYy0+cG9pbnRlci0+bGVuZ3RoKQogCQkgICAgJiYKIAkJICAgICghQUNQSV9NRU1DTVAKLQkJICAgICAoKGNvbnN0IGNoYXIgKil0YWJsZV9kZXNjLT5wb2ludGVyLAotCQkgICAgICAoY29uc3QgY2hhciAqKW5ld190YWJsZV9kZXNjLT5wb2ludGVyLAotCQkgICAgICAoYWNwaV9zaXplKSBuZXdfdGFibGVfZGVzYy0+cG9pbnRlci0+bGVuZ3RoKSkpIHsKKwkJICAgICAodGFibGVfZGVzYy0+cG9pbnRlciwgbmV3X3RhYmxlX2Rlc2MtPnBvaW50ZXIsCisJCSAgICAgIG5ld190YWJsZV9kZXNjLT5wb2ludGVyLT5sZW5ndGgpKSkgewogCQkJLyogTWF0Y2g6IHRoaXMgdGFibGUgaXMgYWxyZWFkeSBpbnN0YWxsZWQgKi8KIAogCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9UQUJMRVMsCkBAIC0xNDUsMTQgKzE0NCwxMyBAQAogewogCWFjcGlfbmFtZSBzaWduYXR1cmU7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoInRiX3ZhbGlkYXRlX3RhYmxlX2hlYWRlciIpOworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCS8qIFZlcmlmeSB0aGF0IHRoaXMgaXMgYSB2YWxpZCBhZGRyZXNzICovCiAKIAlpZiAoIWFjcGlfb3NfcmVhZGFibGUodGFibGVfaGVhZGVyLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJDYW5ub3QgcmVhZCB0YWJsZSBoZWFkZXIgYXQgJXBcbiIsCi0JCQkJICB0YWJsZV9oZWFkZXIpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJDYW5ub3QgcmVhZCB0YWJsZSBoZWFkZXIgYXQgJXBcbiIsCisJCQkJICAgdGFibGVfaGVhZGVyKSk7CiAKIAkJcmV0dXJuIChBRV9CQURfQUREUkVTUyk7CiAJfQpAQCAtMTYxLDEyICsxNTksMTAgQEAKIAogCUFDUElfTU9WRV8zMl9UT18zMigmc2lnbmF0dXJlLCB0YWJsZV9oZWFkZXItPnNpZ25hdHVyZSk7CiAJaWYgKCFhY3BpX3V0X3ZhbGlkX2FjcGlfbmFtZShzaWduYXR1cmUpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiVGFibGUgc2lnbmF0dXJlIGF0ICVwIFslcF0gaGFzIGludmFsaWQgY2hhcmFjdGVyc1xuIiwKLQkJCQkgIHRhYmxlX2hlYWRlciwgJnNpZ25hdHVyZSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlRhYmxlIHNpZ25hdHVyZSBhdCAlcCBbJXBdIGhhcyBpbnZhbGlkIGNoYXJhY3RlcnNcbiIsIHRhYmxlX2hlYWRlciwgJnNpZ25hdHVyZSkpOwogCiAJCUFDUElfUkVQT1JUX1dBUk5JTkcoKCJJbnZhbGlkIHRhYmxlIHNpZ25hdHVyZSBmb3VuZDogWyU0LjRzXVxuIiwKLQkJCQkgICAgIChjaGFyICopJnNpZ25hdHVyZSkpOworCQkJCSAgICAgQUNQSV9DQVNUX1BUUihjaGFyLCAmc2lnbmF0dXJlKSkpOwogCiAJCUFDUElfRFVNUF9CVUZGRVIodGFibGVfaGVhZGVyLAogCQkJCSBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CkBAIC0xNzYsOSArMTcyLDcgQEAKIAkvKiBWYWxpZGF0ZSB0aGUgdGFibGUgbGVuZ3RoICovCiAKIAlpZiAodGFibGVfaGVhZGVyLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIkludmFsaWQgbGVuZ3RoIGluIHRhYmxlIGhlYWRlciAlcCBuYW1lICU0LjRzXG4iLAotCQkJCSAgdGFibGVfaGVhZGVyLCAoY2hhciAqKSZzaWduYXR1cmUpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJJbnZhbGlkIGxlbmd0aCBpbiB0YWJsZSBoZWFkZXIgJXAgbmFtZSAlNC40c1xuIiwgdGFibGVfaGVhZGVyLCAoY2hhciAqKSZzaWduYXR1cmUpKTsKIAogCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgiSW52YWxpZCB0YWJsZSBoZWFkZXIgbGVuZ3RoICgweCVYKSBmb3VuZFxuIiwgKHUzMikgdGFibGVfaGVhZGVyLT5sZW5ndGgpKTsKIApAQCAtMjQxLDE2ICsyMzUsMTYgQEAKIAogdTggYWNwaV90Yl9nZW5lcmF0ZV9jaGVja3N1bSh2b2lkICpidWZmZXIsIHUzMiBsZW5ndGgpCiB7Ci0JY29uc3QgdTggKmxpbWl0OwotCWNvbnN0IHU4ICpyb3ZlcjsKKwl1OCAqZW5kX2J1ZmZlcjsKKwl1OCAqcm92ZXI7CiAJdTggc3VtID0gMDsKIAogCWlmIChidWZmZXIgJiYgbGVuZ3RoKSB7CiAJCS8qICBCdWZmZXIgYW5kIExlbmd0aCBhcmUgdmFsaWQgICAqLwogCi0JCWxpbWl0ID0gKHU4ICopIGJ1ZmZlciArIGxlbmd0aDsKKwkJZW5kX2J1ZmZlciA9IEFDUElfQUREX1BUUih1OCwgYnVmZmVyLCBsZW5ndGgpOwogCi0JCWZvciAocm92ZXIgPSBidWZmZXI7IHJvdmVyIDwgbGltaXQ7IHJvdmVyKyspIHsKKwkJZm9yIChyb3ZlciA9IGJ1ZmZlcjsgcm92ZXIgPCBlbmRfYnVmZmVyOyByb3ZlcisrKSB7CiAJCQlzdW0gPSAodTgpIChzdW0gKyAqcm92ZXIpOwogCQl9CiAJfQpAQCAtMjkyLDggKzI4Niw3IEBACiAJCX0KIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAidGFibGVfaWQ9JVggZG9lcyBub3QgZXhpc3RcbiIsCi0JCQkgIHRhYmxlX2lkKSk7CisJQUNQSV9SRVBPUlRfRVJST1IoKCJ0YWJsZV9pZD0lWCBkb2VzIG5vdCBleGlzdFxuIiwgdGFibGVfaWQpKTsKIAlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZhY2UuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZmFjZS5jCmluZGV4IDNmOTZhNDkuLjgzYTljYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZmFjZS5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNzUsNyArNzUsNyBAQAogCXN0YXR1cyA9IGFjcGlfb3NfZ2V0X3Jvb3RfcG9pbnRlcihBQ1BJX0xPR0lDQUxfQUREUkVTU0lORywKIAkJCQkJICAmcnNkcF9hZGRyZXNzKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IoKCJhY3BpX2xvYWRfdGFibGVzOiBDb3VsZCBub3QgZ2V0IFJTRFAsICVzXG4iLAorCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBnZXQgUlNEUCwgJXNcbiIsCiAJCQkJICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAkJZ290byBlcnJvcl9leGl0OwogCX0KQEAgLTg2LDcgKzg2LDggQEAKIAogCXN0YXR1cyA9IGFjcGlfdGJfdmVyaWZ5X3JzZHAoJnJzZHBfYWRkcmVzcyk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9sb2FkX3RhYmxlczogUlNEUCBGYWlsZWQgdmFsaWRhdGlvbjogJXNcbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiUlNEUCBGYWlsZWQgdmFsaWRhdGlvbjogJXNcbiIsCisJCQkJICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAkJZ290byBlcnJvcl9leGl0OwogCX0KIApAQCAtOTQsNyArOTUsOCBAQAogCiAJc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfcnNkdCgpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfbG9hZF90YWJsZXM6IENvdWxkIG5vdCBsb2FkIFJTRFQ6ICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBsb2FkIFJTRFQ6ICVzXG4iLAorCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJCWdvdG8gZXJyb3JfZXhpdDsKIAl9CiAKQEAgLTEwMiw3ICsxMDQsNyBAQAogCiAJc3RhdHVzID0gYWNwaV90Yl9nZXRfcmVxdWlyZWRfdGFibGVzKCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SKCgiYWNwaV9sb2FkX3RhYmxlczogRXJyb3IgZ2V0dGluZyByZXF1aXJlZCB0YWJsZXMgKERTRFQvRkFEVC9GQUNTKTogJXNcbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IGdldCBhbGwgcmVxdWlyZWQgdGFibGVzIChEU0RUL0ZBRFQvRkFDUyk6ICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCQlnb3RvIGVycm9yX2V4aXQ7CiAJfQogCkBAIC0xMTIsMTQgKzExNCwxNSBAQAogCiAJc3RhdHVzID0gYWNwaV9uc19sb2FkX25hbWVzcGFjZSgpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfbG9hZF90YWJsZXM6IENvdWxkIG5vdCBsb2FkIG5hbWVzcGFjZTogJXNcbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IGxvYWQgbmFtZXNwYWNlOiAlc1xuIiwKKwkJCQkgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCQlnb3RvIGVycm9yX2V4aXQ7CiAJfQogCiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAogICAgICAgZXJyb3JfZXhpdDoKLQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfbG9hZF90YWJsZXM6IENvdWxkIG5vdCBsb2FkIHRhYmxlczogJXNcbiIsCisJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgbG9hZCB0YWJsZXM6ICVzXG4iLAogCQkJICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90Ynhmcm9vdC5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90Ynhmcm9vdC5jCmluZGV4IDNiOGE3ZTAuLjY1MzhlZDgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZyb290LmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90Ynhmcm9vdC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMjUxLDcgKzI1MSw3IEBACiAKIAlhY3BpX3RiX2dldF9yc2R0X2FkZHJlc3MoJmFkZHJlc3MpOwogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSAgIlJTRFAgbG9jYXRlZCBhdCAlcCwgUlNEVCBwaHlzaWNhbD0lOC44WCU4LjhYIFxuIiwKKwkJCSAgIlJTRFAgbG9jYXRlZCBhdCAlcCwgUlNEVCBwaHlzaWNhbD0lOC44WCU4LjhYXG4iLAogCQkJICBhY3BpX2dibF9SU0RQLAogCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcy5wb2ludGVyLnZhbHVlKSkpOwogCkBAIC0zOTYsOSArMzk2LDggQEAKIAogCXN0YXR1cyA9IGFjcGlfdGJfZmluZF9yc2RwKCZ0YWJsZV9pbmZvLCBmbGFncyk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiUlNEUCBzdHJ1Y3R1cmUgbm90IGZvdW5kLCAlcyBGbGFncz0lWFxuIiwKLQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLCBmbGFncykpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlJTRFAgc3RydWN0dXJlIG5vdCBmb3VuZCwgJXMgRmxhZ3M9JVhcbiIsCisJCQkJICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cyksIGZsYWdzKSk7CiAKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX0FDUElfVEFCTEVTKTsKIAl9CkBAIC01MDMsMTAgKzUwMiw3IEBACiAJCQkJCSAgICBBQ1BJX0VCREFfUFRSX0xFTkdUSCwKIAkJCQkJICAgICh2b2lkICopJnRhYmxlX3B0cik7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFggZm9yIGxlbmd0aCAlWFxuIiwKLQkJCQkJICBBQ1BJX0VCREFfUFRSX0xPQ0FUSU9OLAotCQkJCQkgIEFDUElfRUJEQV9QVFJfTEVOR1RIKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYIGZvciBsZW5ndGggJVhcbiIsIEFDUElfRUJEQV9QVFJfTE9DQVRJT04sIEFDUElfRUJEQV9QVFJfTEVOR1RIKSk7CiAKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CkBAIC01MzAsMTAgKzUyNiw3IEBACiAJCQkJCQkgICAgQUNQSV9FQkRBX1dJTkRPV19TSVpFLAogCQkJCQkJICAgICh2b2lkICopJnRhYmxlX3B0cik7CiAJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJICAiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFggZm9yIGxlbmd0aCAlWFxuIiwKLQkJCQkJCSAgcGh5c2ljYWxfYWRkcmVzcywKLQkJCQkJCSAgQUNQSV9FQkRBX1dJTkRPV19TSVpFKSk7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgbWFwIG1lbW9yeSBhdCAlOC44WCBmb3IgbGVuZ3RoICVYXG4iLCBwaHlzaWNhbF9hZGRyZXNzLCBBQ1BJX0VCREFfV0lORE9XX1NJWkUpKTsKIAogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJfQpAQCAtNTYzLDEwICs1NTYsNyBAQAogCQkJCQkgICAgKHZvaWQgKikmdGFibGVfcHRyKTsKIAogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYIGZvciBsZW5ndGggJVhcbiIsCi0JCQkJCSAgQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFLAotCQkJCQkgIEFDUElfSElfUlNEUF9XSU5ET1dfU0laRSkpOworCQkJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgbWFwIG1lbW9yeSBhdCAlOC44WCBmb3IgbGVuZ3RoICVYXG4iLCBBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UsIEFDUElfSElfUlNEUF9XSU5ET1dfU0laRSkpOwogCiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy9NYWtlZmlsZSBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvTWFrZWZpbGUKaW5kZXggZTg3MTA4Yi4uODhlZmYxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL01ha2VmaWxlCkBAIC0yLDcgKzIsOCBAQAogIyBNYWtlZmlsZSBmb3IgYWxsIExpbnV4IEFDUEkgaW50ZXJwcmV0ZXIgc3ViZGlyZWN0b3JpZXMKICMKIAotb2JqLXkgOj0gdXRhbGxvYy5vICB1dGRlYnVnLm8gICB1dGV2YWwubyAgICB1dGluaXQubyAgdXRtaXNjLm8gICAgdXR4ZmFjZS5vIFwKLQkgdXRjb3B5Lm8gICB1dGRlbGV0ZS5vICB1dGdsb2JhbC5vICB1dG1hdGgubyAgdXRvYmplY3QubyB1dHN0YXRlLm8gdXRtdXRleC5vIHV0b2JqZWN0Lm8gdXRjYWNoZS5vCitvYmoteSA6PSB1dGFsbG9jLm8gdXRkZWJ1Zy5vIHV0ZXZhbC5vIHV0aW5pdC5vIHV0bWlzYy5vIHV0eGZhY2UubyBcCisJCXV0Y29weS5vIHV0ZGVsZXRlLm8gdXRnbG9iYWwubyB1dG1hdGgubyB1dG9iamVjdC5vIFwKKwkJdXRzdGF0ZS5vIHV0bXV0ZXgubyB1dG9iamVjdC5vIHV0Y2FjaGUubyB1dHJlc3JjLm8KIAogRVhUUkFfQ0ZMQUdTICs9ICQoQUNQSV9DRkxBR1MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0YWxsb2MuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRhbGxvYy5jCmluZGV4IDA2ODQ1MGIuLjBlZmNiZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRhbGxvYy5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRhbGxvYy5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNDcsNyArNDcsNyBAQAogQUNQSV9NT0RVTEVfTkFNRSgidXRhbGxvYyIpCiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KLSNpZmRlZglBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUworI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCiBzdGF0aWMgc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICphY3BpX3V0X2ZpbmRfYWxsb2NhdGlvbih2b2lkICphbGxvY2F0aW9uKTsKIAogc3RhdGljIGFjcGlfc3RhdHVzCkBAIC01OCw5ICs1OCw3IEBACiBzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfdXRfcmVtb3ZlX2FsbG9jYXRpb24oc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICphZGRyZXNzLAogCQkJICB1MzIgY29tcG9uZW50LCBjaGFyICptb2R1bGUsIHUzMiBsaW5lKTsKLSNlbmRpZgkJCQkvKiBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUyAqLwogCi0jaWZkZWYgQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMKIHN0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV91dF9jcmVhdGVfbGlzdChjaGFyICpsaXN0X25hbWUsCiAJCSAgICB1MTYgb2JqZWN0X3NpemUsIHN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICoqcmV0dXJuX2NhY2hlKTsKQEAgLTMwMyw4ICszMDEsOCBAQAogCS8qIENoZWNrIGZvciBhbiBpbmFkdmVydGVudCBzaXplIG9mIHplcm8gYnl0ZXMgKi8KIAogCWlmICghc2l6ZSkgewotCQlfQUNQSV9SRVBPUlRfRVJST1IobW9kdWxlLCBsaW5lLCBjb21wb25lbnQsCi0JCQkJICAgKCJ1dF9hbGxvY2F0ZTogQXR0ZW1wdCB0byBhbGxvY2F0ZSB6ZXJvIGJ5dGVzXG4iKSk7CisJCV9BQ1BJX1JFUE9SVF9FUlJPUihtb2R1bGUsIGxpbmUsCisJCQkJICAgKCJ1dF9hbGxvY2F0ZTogQXR0ZW1wdCB0byBhbGxvY2F0ZSB6ZXJvIGJ5dGVzLCBhbGxvY2F0aW5nIDEgYnl0ZVxuIikpOwogCQlzaXplID0gMTsKIAl9CiAKQEAgLTMxMiw3ICszMTAsNyBAQAogCWlmICghYWxsb2NhdGlvbikgewogCQkvKiBSZXBvcnQgYWxsb2NhdGlvbiBlcnJvciAqLwogCi0JCV9BQ1BJX1JFUE9SVF9FUlJPUihtb2R1bGUsIGxpbmUsIGNvbXBvbmVudCwKKwkJX0FDUElfUkVQT1JUX0VSUk9SKG1vZHVsZSwgbGluZSwKIAkJCQkgICAoInV0X2FsbG9jYXRlOiBDb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlWFxuIiwKIAkJCQkgICAgKHUzMikgc2l6ZSkpOwogCkBAIC0zNDYsMTYgKzM0NCwxNiBAQAogCS8qIENoZWNrIGZvciBhbiBpbmFkdmVydGVudCBzaXplIG9mIHplcm8gYnl0ZXMgKi8KIAogCWlmICghc2l6ZSkgewotCQlfQUNQSV9SRVBPUlRfRVJST1IobW9kdWxlLCBsaW5lLCBjb21wb25lbnQsCi0JCQkJICAgKCJ1dF9jYWxsb2NhdGU6IEF0dGVtcHQgdG8gYWxsb2NhdGUgemVybyBieXRlc1xuIikpOwotCQlyZXR1cm5fUFRSKE5VTEwpOworCQlfQUNQSV9SRVBPUlRfRVJST1IobW9kdWxlLCBsaW5lLAorCQkJCSAgICgidXRfY2FsbG9jYXRlOiBBdHRlbXB0IHRvIGFsbG9jYXRlIHplcm8gYnl0ZXMsIGFsbG9jYXRpbmcgMSBieXRlXG4iKSk7CisJCXNpemUgPSAxOwogCX0KIAogCWFsbG9jYXRpb24gPSBhY3BpX29zX2FsbG9jYXRlKHNpemUpOwogCWlmICghYWxsb2NhdGlvbikgewogCQkvKiBSZXBvcnQgYWxsb2NhdGlvbiBlcnJvciAqLwogCi0JCV9BQ1BJX1JFUE9SVF9FUlJPUihtb2R1bGUsIGxpbmUsIGNvbXBvbmVudCwKKwkJX0FDUElfUkVQT1JUX0VSUk9SKG1vZHVsZSwgbGluZSwKIAkJCQkgICAoInV0X2NhbGxvY2F0ZTogQ291bGQgbm90IGFsbG9jYXRlIHNpemUgJVhcbiIsCiAJCQkJICAgICh1MzIpIHNpemUpKTsKIAkJcmV0dXJuX1BUUihOVUxMKTsKQEAgLTQ4Miw3ICs0ODAsNyBAQAogCWlmICghYWxsb2NhdGlvbikgewogCQkvKiBSZXBvcnQgYWxsb2NhdGlvbiBlcnJvciAqLwogCi0JCV9BQ1BJX1JFUE9SVF9FUlJPUihtb2R1bGUsIGxpbmUsIGNvbXBvbmVudCwKKwkJX0FDUElfUkVQT1JUX0VSUk9SKG1vZHVsZSwgbGluZSwKIAkJCQkgICAoInV0X2NhbGxvY2F0ZTogQ291bGQgbm90IGFsbG9jYXRlIHNpemUgJVhcbiIsCiAJCQkJICAgICh1MzIpIHNpemUpKTsKIAkJcmV0dXJuIChOVUxMKTsKQEAgLTUyNiw3ICs1MjQsNyBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJ1dF9mcmVlIiwgYWxsb2NhdGlvbik7CiAKIAlpZiAoTlVMTCA9PSBhbGxvY2F0aW9uKSB7Ci0JCV9BQ1BJX1JFUE9SVF9FUlJPUihtb2R1bGUsIGxpbmUsIGNvbXBvbmVudCwKKwkJX0FDUElfUkVQT1JUX0VSUk9SKG1vZHVsZSwgbGluZSwKIAkJCQkgICAoImFjcGlfdXRfZnJlZTogQXR0ZW1wdCB0byBkZWxldGUgYSBOVUxMIGFkZHJlc3NcbiIpKTsKIAogCQlyZXR1cm5fVk9JRDsKQEAgLTU0Miw4ICs1NDAsOCBAQAogCXN0YXR1cyA9IGFjcGlfdXRfcmVtb3ZlX2FsbG9jYXRpb24oZGVidWdfYmxvY2ssCiAJCQkJCSAgIGNvbXBvbmVudCwgbW9kdWxlLCBsaW5lKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkNvdWxkIG5vdCBmcmVlIG1lbW9yeSwgJXNcbiIsCi0JCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBmcmVlIG1lbW9yeSwgJXNcbiIsCisJCQkJICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAl9CiAKIAlhY3BpX29zX2ZyZWUoZGVidWdfYmxvY2spOwpAQCAtNjI4LDggKzYyNiw4IEBACiAJaWYgKGVsZW1lbnQpIHsKIAkJQUNQSV9SRVBPUlRfRVJST1IoKCJ1dF90cmFja19hbGxvY2F0aW9uOiBBbGxvY2F0aW9uIGFscmVhZHkgcHJlc2VudCBpbiBsaXN0ISAoJXApXG4iLCBhbGxvY2F0aW9uKSk7CiAKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkVsZW1lbnQgJXAgQWRkcmVzcyAlcFxuIiwKLQkJCQkgIGVsZW1lbnQsIGFsbG9jYXRpb24pKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJFbGVtZW50ICVwIEFkZHJlc3MgJXBcbiIsCisJCQkJICAgZWxlbWVudCwgYWxsb2NhdGlvbikpOwogCiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KQEAgLTY4OSw3ICs2ODcsNyBAQAogCWlmIChOVUxMID09IG1lbV9saXN0LT5saXN0X2hlYWQpIHsKIAkJLyogTm8gYWxsb2NhdGlvbnMhICovCiAKLQkJX0FDUElfUkVQT1JUX0VSUk9SKG1vZHVsZSwgbGluZSwgY29tcG9uZW50LAorCQlfQUNQSV9SRVBPUlRfRVJST1IobW9kdWxlLCBsaW5lLAogCQkJCSAgICgidXRfcmVtb3ZlX2FsbG9jYXRpb246IEVtcHR5IGFsbG9jYXRpb24gbGlzdCwgbm90aGluZyB0byBmcmVlIVxuIikpOwogCiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CkBAIC04NjUsMTIgKzg2MywxMCBAQAogCS8qIFByaW50IHN1bW1hcnkgKi8KIAogCWlmICghbnVtX291dHN0YW5kaW5nKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiTm8gb3V0c3RhbmRpbmcgYWxsb2NhdGlvbnMuXG4iKSk7CisJCUFDUElfUkVQT1JUX0lORk8oKCJObyBvdXRzdGFuZGluZyBhbGxvY2F0aW9uc1xuIikpOwogCX0gZWxzZSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiJWQoJVgpIE91dHN0YW5kaW5nIGFsbG9jYXRpb25zXG4iLAotCQkJCSAgbnVtX291dHN0YW5kaW5nLCBudW1fb3V0c3RhbmRpbmcpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCIlZCglWCkgT3V0c3RhbmRpbmcgYWxsb2NhdGlvbnNcbiIsCisJCQkJICAgbnVtX291dHN0YW5kaW5nLCBudW1fb3V0c3RhbmRpbmcpKTsKIAl9CiAKIAlyZXR1cm5fVk9JRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRjYWNoZS5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNhY2hlLmMKaW5kZXggOTNkNDg2OC4uMjE3N2NiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNhY2hlLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNhY2hlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Y29weS5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNvcHkuYwppbmRleCA1NDQyYjMyLi4xYTRkYTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Y29weS5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRjb3B5LmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zOTgsMTQgKzM5OCwxNyBAQAogCQkgKiBCdWlsZCBhIHNpbXBsZSBvYmplY3QgKG5vIG5lc3RlZCBvYmplY3RzKQogCQkgKi8KIAkJc3RhdHVzID0gYWNwaV91dF9jb3B5X2lzaW1wbGVfdG9fZXNpbXBsZShpbnRlcm5hbF9vYmplY3QsCi0JCQkJCQkJICh1bmlvbiBhY3BpX29iamVjdCAqKQotCQkJCQkJCSByZXRfYnVmZmVyLT5wb2ludGVyLAotCQkJCQkJCSAoKHU4ICopIHJldF9idWZmZXItPgotCQkJCQkJCSAgcG9pbnRlciArCi0JCQkJCQkJICBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JECi0JCQkJCQkJICAoc2l6ZW9mCi0JCQkJCQkJICAgKHVuaW9uCi0JCQkJCQkJICAgIGFjcGlfb2JqZWN0KSkpLAorCQkJCQkJCSBBQ1BJX0NBU1RfUFRSKHVuaW9uCisJCQkJCQkJCSAgICAgICBhY3BpX29iamVjdCwKKwkJCQkJCQkJICAgICAgIHJldF9idWZmZXItPgorCQkJCQkJCQkgICAgICAgcG9pbnRlciksCisJCQkJCQkJIEFDUElfQUREX1BUUih1OCwKKwkJCQkJCQkJICAgICAgcmV0X2J1ZmZlci0+CisJCQkJCQkJCSAgICAgIHBvaW50ZXIsCisJCQkJCQkJCSAgICAgIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQKKwkJCQkJCQkJICAgICAgKHNpemVvZgorCQkJCQkJCQkgICAgICAgKHVuaW9uCisJCQkJCQkJCQlhY3BpX29iamVjdCkpKSwKIAkJCQkJCQkgJnJldF9idWZmZXItPmxlbmd0aCk7CiAJCS8qCiAJCSAqIGJ1aWxkIHNpbXBsZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBvYmplY3Qgc2l6ZSBpbiB0aGUgbGVuZ3RoCkBAIC02MDMsOCArNjA2LDcgQEAKIAkJLyoKIAkJICogUGFja2FnZXMgYXMgZXh0ZXJuYWwgaW5wdXQgdG8gY29udHJvbCBtZXRob2RzIGFyZSBub3Qgc3VwcG9ydGVkLAogCQkgKi8KLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJQYWNrYWdlcyBhcyBwYXJhbWV0ZXJzIG5vdCBpbXBsZW1lbnRlZCFcbiIpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJQYWNrYWdlcyBhcyBwYXJhbWV0ZXJzIG5vdCBpbXBsZW1lbnRlZCFcbiIpKTsKIAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0lNUExFTUVOVEVEKTsKIAl9CkBAIC04NjcsNyArODY5LDcgQEAKIAkJCQkJCQkgY291bnQgKwogCQkJCQkJCSAxKSAqIHNpemVvZih2b2lkICopKTsKIAlpZiAoIWRlc3Rfb2JqLT5wYWNrYWdlLmVsZW1lbnRzKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SKCgiYW1sX2J1aWxkX2NvcHlfaW50ZXJuYWxfcGFja2FnZV9vYmplY3Q6IFBhY2thZ2UgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiUGFja2FnZSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVidWcuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRkZWJ1Zy5jCmluZGV4IGQ4MGU5MjYuLjM1ZjNkNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRkZWJ1Zy5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRkZWJ1Zy5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlbGV0ZS5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlbGV0ZS5jCmluZGV4IDJiYzg3OGYuLjEwNzlhMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRkZWxldGUuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVsZXRlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMzYzLDggKzM2Myw3IEBACiAKIAlkZWZhdWx0OgogCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJVbmtub3duIGFjdGlvbiAoJVgpXG4iLAotCQkJCSAgYWN0aW9uKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiVW5rbm93biBhY3Rpb24gKCVYKVxuIiwgYWN0aW9uKSk7CiAJCWJyZWFrOwogCX0KIApAQCAtMzc0LDkgKzM3Myw3IEBACiAJICovCiAJaWYgKGNvdW50ID4gQUNQSV9NQVhfUkVGRVJFTkNFX0NPVU5UKSB7CiAKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAotCQkJCSAgIioqKiogV2FybmluZyAqKioqIExhcmdlIFJlZmVyZW5jZSBDb3VudCAoJVgpIGluIG9iamVjdCAlcFxuXG4iLAotCQkJCSAgY291bnQsIG9iamVjdCkpOworCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgiTGFyZ2UgUmVmZXJlbmNlIENvdW50ICglWCkgaW4gb2JqZWN0ICVwXG5cbiIsIGNvdW50LCBvYmplY3QpKTsKIAl9CiAKIAlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZXZhbC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGV2YWwuYwppbmRleCA3YjgxZDVlLi5mNGRjMzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZXZhbC5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRldmFsLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC05NSw3ICs5NSw5IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgQUNQSV9OVU1fT1NJX1NUUklOR1M7IGkrKykgewogCQlpZiAoIUFDUElfU1RSQ01QKHN0cmluZ19kZXNjLT5zdHJpbmcucG9pbnRlciwKLQkJCQkgKGNoYXIgKilhY3BpX2dibF92YWxpZF9vc2lfc3RyaW5nc1tpXSkpIHsKKwkJCQkgQUNQSV9DQVNUX1BUUihjaGFyLAorCQkJCQkgICAgICAgYWNwaV9nYmxfdmFsaWRfb3NpX3N0cmluZ3NbaV0pKSkKKwkJewogCQkJLyogVGhpcyBzdHJpbmcgaXMgc3VwcG9ydGVkICovCiAKIAkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gMHhGRkZGRkZGRjsKQEAgLTE1Miw4ICsxNTQsOCBAQAogCQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShwcmVmaXhfbm9kZSksCiAJCQkJCSAgcGF0aCkpOwogCQl9IGVsc2UgewotCQkJQUNQSV9SRVBPUlRfTUVUSE9EX0VSUk9SKCJNZXRob2QgZXhlY3V0aW9uIGZhaWxlZCIsCi0JCQkJCQkgcHJlZml4X25vZGUsIHBhdGgsIHN0YXR1cyk7CisJCQlBQ1BJX1JFUE9SVF9NVEVSUk9SKCJNZXRob2QgZXhlY3V0aW9uIGZhaWxlZCIsCisJCQkJCSAgICBwcmVmaXhfbm9kZSwgcGF0aCwgc3RhdHVzKTsKIAkJfQogCiAJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwpAQCAtMTYzLDkgKzE2NSw4IEBACiAKIAlpZiAoIWluZm8ucmV0dXJuX29iamVjdCkgewogCQlpZiAoZXhwZWN0ZWRfcmV0dXJuX2J0eXBlcykgewotCQkJQUNQSV9SRVBPUlRfTUVUSE9EX0VSUk9SKCJObyBvYmplY3Qgd2FzIHJldHVybmVkIGZyb20iLAotCQkJCQkJIHByZWZpeF9ub2RlLCBwYXRoLAotCQkJCQkJIEFFX05PVF9FWElTVCk7CisJCQlBQ1BJX1JFUE9SVF9NVEVSUk9SKCJObyBvYmplY3Qgd2FzIHJldHVybmVkIGZyb20iLAorCQkJCQkgICAgcHJlZml4X25vZGUsIHBhdGgsIEFFX05PVF9FWElTVCk7CiAKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwogCQl9CkBAIC0yMTAsMTUgKzIxMSwxMCBAQAogCS8qIElzIHRoZSByZXR1cm4gb2JqZWN0IG9uZSBvZiB0aGUgZXhwZWN0ZWQgdHlwZXM/ICovCiAKIAlpZiAoIShleHBlY3RlZF9yZXR1cm5fYnR5cGVzICYgcmV0dXJuX2J0eXBlKSkgewotCQlBQ1BJX1JFUE9SVF9NRVRIT0RfRVJST1IoIlJldHVybiBvYmplY3QgdHlwZSBpcyBpbmNvcnJlY3QiLAotCQkJCQkgcHJlZml4X25vZGUsIHBhdGgsIEFFX1RZUEUpOworCQlBQ1BJX1JFUE9SVF9NVEVSUk9SKCJSZXR1cm4gb2JqZWN0IHR5cGUgaXMgaW5jb3JyZWN0IiwKKwkJCQkgICAgcHJlZml4X25vZGUsIHBhdGgsIEFFX1RZUEUpOwogCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiVHlwZSByZXR1cm5lZCBmcm9tICVzIHdhcyBpbmNvcnJlY3Q6ICVzLCBleHBlY3RlZCBCdHlwZXM6ICVYXG4iLAotCQkJCSAgcGF0aCwKLQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoaW5mby4KLQkJCQkJCQkgICAgICAgcmV0dXJuX29iamVjdCksCi0JCQkJICBleHBlY3RlZF9yZXR1cm5fYnR5cGVzKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiVHlwZSByZXR1cm5lZCBmcm9tICVzIHdhcyBpbmNvcnJlY3Q6ICVzLCBleHBlY3RlZCBCdHlwZXM6ICVYXG4iLCBwYXRoLCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKGluZm8ucmV0dXJuX29iamVjdCksIGV4cGVjdGVkX3JldHVybl9idHlwZXMpKTsKIAogCQkvKiBPbiBlcnJvciBleGl0LCB3ZSBtdXN0IGRlbGV0ZSB0aGUgcmV0dXJuIG9iamVjdCAqLwogCkBAIC01OTIsNyArNTg4LDcgQEAKIAkJCQkJICAiX1NUQSBvbiAlNC40cyB3YXMgbm90IGZvdW5kLCBhc3N1bWluZyBkZXZpY2UgaXMgcHJlc2VudFxuIiwKIAkJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUoZGV2aWNlX25vZGUpKSk7CiAKLQkJCSpmbGFncyA9IDB4MEY7CisJCQkqZmxhZ3MgPSBBQ1BJX1VJTlQzMl9NQVg7CiAJCQlzdGF0dXMgPSBBRV9PSzsKIAkJfQogCkBAIC02MzcsMTcgKzYzMywxNyBAQAogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKIAkJaGlnaGVzdFtpXSA9IDB4RkY7CiAJCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0KGRldmljZV9ub2RlLAotCQkJCQkJIChjaGFyICopCi0JCQkJCQkgYWNwaV9nYmxfaGlnaGVzdF9kc3RhdGVfbmFtZXMKLQkJCQkJCSBbaV0sIEFDUElfQlRZUEVfSU5URUdFUiwKLQkJCQkJCSAmb2JqX2Rlc2MpOworCQkJCQkJIEFDUElfQ0FTVF9QVFIoY2hhciwKKwkJCQkJCQkgICAgICAgYWNwaV9nYmxfaGlnaGVzdF9kc3RhdGVfbmFtZXMKKwkJCQkJCQkgICAgICAgW2ldKSwKKwkJCQkJCSBBQ1BJX0JUWVBFX0lOVEVHRVIsICZvYmpfZGVzYyk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJaWYgKHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKIAkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCiAJCQkJCQkgICIlcyBvbiBEZXZpY2UgJTQuNHMsICVzXG4iLAotCQkJCQkJICAoY2hhciAqKQotCQkJCQkJICBhY3BpX2dibF9oaWdoZXN0X2RzdGF0ZV9uYW1lcwotCQkJCQkJICBbaV0sCisJCQkJCQkgIEFDUElfQ0FTVF9QVFIoY2hhciwKKwkJCQkJCQkJYWNwaV9nYmxfaGlnaGVzdF9kc3RhdGVfbmFtZXMKKwkJCQkJCQkJW2ldKSwKIAkJCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lCiAJCQkJCQkgIChkZXZpY2Vfbm9kZSksCiAJCQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGdsb2JhbC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGdsb2JhbC5jCmluZGV4IDM5OWU2NGIuLjg3Y2E5YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRnbG9iYWwuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Z2xvYmFsLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC02Nyw4ICs2NywxMSBAQAogCWFjcGlfc3RhdHVzIHN1Yl9zdGF0dXM7CiAJY29uc3QgY2hhciAqZXhjZXB0aW9uID0gTlVMTDsKIAotCUFDUElfRlVOQ1RJT05fTkFNRSgiZm9ybWF0X2V4Y2VwdGlvbiIpOworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAorCS8qCisJICogU3RhdHVzIGlzIGNvbXBvc2VkIG9mIHR3byBwYXJ0cywgYSAidHlwZSIgYW5kIGFuIGFjdHVhbCBjb2RlCisJICovCiAJc3ViX3N0YXR1cyA9IChzdGF0dXMgJiB+QUVfQ09ERV9NQVNLKTsKIAogCXN3aXRjaCAoc3RhdHVzICYgQUVfQ09ERV9NQVNLKSB7CkBAIC0xMTgsMTMgKzEyMSwxMyBAQAogCWlmICghZXhjZXB0aW9uKSB7CiAJCS8qIEV4Y2VwdGlvbiBjb2RlIHdhcyBub3QgcmVjb2duaXplZCAqLwogCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiVW5rbm93biBleGNlcHRpb24gY29kZTogMHglOC44WFxuIiwgc3RhdHVzKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiVW5rbm93biBleGNlcHRpb24gY29kZTogMHglOC44WFxuIiwKKwkJCQkgICBzdGF0dXMpKTsKIAotCQlyZXR1cm4gKChjb25zdCBjaGFyICopIlVOS05PV05fU1RBVFVTX0NPREUiKTsKKwkJZXhjZXB0aW9uID0gIlVOS05PV05fU1RBVFVTX0NPREUiOwogCX0KIAotCXJldHVybiAoKGNvbnN0IGNoYXIgKilleGNlcHRpb24pOworCXJldHVybiAoQUNQSV9DQVNUX1BUUihjb25zdCBjaGFyLCBleGNlcHRpb24pKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIxNywyMyArMjIwLDIzIEBACiAgKiAyKSBfVFpfIGlzIGRlZmluZWQgdG8gYmUgYSB0aGVybWFsIHpvbmUgaW4gb3JkZXIgdG8gYWxsb3cgQVNMIGNvZGUgdG8KICAqICAgIHBlcmZvcm0gYSBOb3RpZnkoKSBvcGVyYXRpb24gb24gaXQuCiAgKi8KLWNvbnN0IHN0cnVjdCBhY3BpX3ByZWRlZmluZWRfbmFtZXMgYWNwaV9nYmxfcHJlX2RlZmluZWRfbmFtZXNbXSA9Ci0gICAgeyB7Il9HUEUiLCBBQ1BJX1RZUEVfTE9DQUxfU0NPUEUsIE5VTEx9LAoteyJfUFJfIiwgQUNQSV9UWVBFX0xPQ0FMX1NDT1BFLCBOVUxMfSwKLXsiX1NCXyIsIEFDUElfVFlQRV9ERVZJQ0UsIE5VTEx9LAoteyJfU0lfIiwgQUNQSV9UWVBFX0xPQ0FMX1NDT1BFLCBOVUxMfSwKLXsiX1RaXyIsIEFDUElfVFlQRV9USEVSTUFMLCBOVUxMfSwKLXsiX1JFViIsIEFDUElfVFlQRV9JTlRFR0VSLCAoY2hhciAqKUFDUElfQ0FfU1VQUE9SVF9MRVZFTH0sCi17Il9PU18iLCBBQ1BJX1RZUEVfU1RSSU5HLCBBQ1BJX09TX05BTUV9LAoteyJfR0xfIiwgQUNQSV9UWVBFX01VVEVYLCAoY2hhciAqKTF9LAorY29uc3Qgc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9uYW1lcyBhY3BpX2dibF9wcmVfZGVmaW5lZF9uYW1lc1tdID0geworCXsiX0dQRSIsIEFDUElfVFlQRV9MT0NBTF9TQ09QRSwgTlVMTH0sCisJeyJfUFJfIiwgQUNQSV9UWVBFX0xPQ0FMX1NDT1BFLCBOVUxMfSwKKwl7Il9TQl8iLCBBQ1BJX1RZUEVfREVWSUNFLCBOVUxMfSwKKwl7Il9TSV8iLCBBQ1BJX1RZUEVfTE9DQUxfU0NPUEUsIE5VTEx9LAorCXsiX1RaXyIsIEFDUElfVFlQRV9USEVSTUFMLCBOVUxMfSwKKwl7Il9SRVYiLCBBQ1BJX1RZUEVfSU5URUdFUiwgKGNoYXIgKilBQ1BJX0NBX1NVUFBPUlRfTEVWRUx9LAorCXsiX09TXyIsIEFDUElfVFlQRV9TVFJJTkcsIEFDUElfT1NfTkFNRX0sCisJeyJfR0xfIiwgQUNQSV9UWVBFX01VVEVYLCAoY2hhciAqKTF9LAogCiAjaWYgIWRlZmluZWQgKEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTikgfHwgZGVmaW5lZCAoQUNQSV9DT05TVEFOVF9FVkFMX09OTFkpCi17Il9PU0kiLCBBQ1BJX1RZUEVfTUVUSE9ELCAoY2hhciAqKTF9LAorCXsiX09TSSIsIEFDUElfVFlQRV9NRVRIT0QsIChjaGFyICopMX0sCiAjZW5kaWYKIAogCS8qIFRhYmxlIHRlcm1pbmF0b3IgKi8KIAote05VTEwsIEFDUElfVFlQRV9BTlksIE5VTEx9CisJe05VTEwsIEFDUElfVFlQRV9BTlksIE5VTEx9CiB9OwogCiAvKgpAQCAtNDg1LDcgKzQ4OCw3IEBACiAJCXJldHVybiAoImludmFsaWRfc3BhY2VfaWQiKTsKIAl9CiAKLQlyZXR1cm4gKChjaGFyICopYWNwaV9nYmxfcmVnaW9uX3R5cGVzW3NwYWNlX2lkXSk7CisJcmV0dXJuIChBQ1BJX0NBU1RfUFRSKGNoYXIsIGFjcGlfZ2JsX3JlZ2lvbl90eXBlc1tzcGFjZV9pZF0pKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTUwMywxMSArNTA2LDEzIEBACiAvKiBFdmVudCB0eXBlIGRlY29kaW5nICovCiAKIHN0YXRpYyBjb25zdCBjaGFyICphY3BpX2dibF9ldmVudF90eXBlc1tBQ1BJX05VTV9GSVhFRF9FVkVOVFNdID0geworLyohIFtCZWdpbl0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gKGtlZXAgdGhlc2Ugc3RyaW5ncyBhcy1pcykgKi8KIAkiUE1fVGltZXIiLAotCSJnbG9iYWxfbG9jayIsCi0JInBvd2VyX2J1dHRvbiIsCi0JInNsZWVwX2J1dHRvbiIsCi0JInJlYWxfdGltZV9jbG9jayIsCisJIkdsb2JhbExvY2siLAorCSJQb3dlckJ1dHRvbiIsCisJIlNsZWVwQnV0dG9uIiwKKwkiUmVhbFRpbWVDbG9jayIsCisvKiEgW0VuZF0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gISovCiB9OwogCiBjaGFyICphY3BpX3V0X2dldF9ldmVudF9uYW1lKHUzMiBldmVudF9pZCkKQEAgLTUxNyw3ICs1MjIsNyBAQAogCQlyZXR1cm4gKCJpbnZhbGlkX2V2ZW50X2lEIik7CiAJfQogCi0JcmV0dXJuICgoY2hhciAqKWFjcGlfZ2JsX2V2ZW50X3R5cGVzW2V2ZW50X2lkXSk7CisJcmV0dXJuIChBQ1BJX0NBU1RfUFRSKGNoYXIsIGFjcGlfZ2JsX2V2ZW50X3R5cGVzW2V2ZW50X2lkXSkpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTQ1LDEyICs1NTAsMTMgQEAKIC8qIFByaW50YWJsZSBuYW1lcyBvZiB0aGUgQUNQSSBvYmplY3QgdHlwZXMgKi8KIAogc3RhdGljIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX25zX3R5cGVfbmFtZXNbXSA9IHsKKy8qISBbQmVnaW5dIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uIChrZWVwIHRoZXNlIHN0cmluZ3MgYXMtaXMpICovCiAJLyogMDAgKi8gIlVudHlwZWQiLAogCS8qIDAxICovICJJbnRlZ2VyIiwKIAkvKiAwMiAqLyAiU3RyaW5nIiwKIAkvKiAwMyAqLyAiQnVmZmVyIiwKIAkvKiAwNCAqLyAiUGFja2FnZSIsCi0JLyogMDUgKi8gImZpZWxkX3VuaXQiLAorCS8qIDA1ICovICJGaWVsZFVuaXQiLAogCS8qIDA2ICovICJEZXZpY2UiLAogCS8qIDA3ICovICJFdmVudCIsCiAJLyogMDggKi8gIk1ldGhvZCIsCkBAIC01NTksMzMgKzU2NSwzNCBAQAogCS8qIDExICovICJQb3dlciIsCiAJLyogMTIgKi8gIlByb2Nlc3NvciIsCiAJLyogMTMgKi8gIlRoZXJtYWwiLAotCS8qIDE0ICovICJidWZmZXJfZmllbGQiLAotCS8qIDE1ICovICJkZGJfaGFuZGxlIiwKLQkvKiAxNiAqLyAiZGVidWdfb2JqZWN0IiwKLQkvKiAxNyAqLyAicmVnaW9uX2ZpZWxkIiwKLQkvKiAxOCAqLyAiYmFua19maWVsZCIsCi0JLyogMTkgKi8gImluZGV4X2ZpZWxkIiwKKwkvKiAxNCAqLyAiQnVmZmVyRmllbGQiLAorCS8qIDE1ICovICJEZGJIYW5kbGUiLAorCS8qIDE2ICovICJEZWJ1Z09iamVjdCIsCisJLyogMTcgKi8gIlJlZ2lvbkZpZWxkIiwKKwkvKiAxOCAqLyAiQmFua0ZpZWxkIiwKKwkvKiAxOSAqLyAiSW5kZXhGaWVsZCIsCiAJLyogMjAgKi8gIlJlZmVyZW5jZSIsCiAJLyogMjEgKi8gIkFsaWFzIiwKLQkvKiAyMiAqLyAibWV0aG9kX2FsaWFzIiwKKwkvKiAyMiAqLyAiTWV0aG9kQWxpYXMiLAogCS8qIDIzICovICJOb3RpZnkiLAotCS8qIDI0ICovICJhZGRyX2hhbmRsZXIiLAotCS8qIDI1ICovICJyZXNvdXJjZV9kZXNjIiwKLQkvKiAyNiAqLyAicmVzb3VyY2VfZmxkIiwKKwkvKiAyNCAqLyAiQWRkckhhbmRsZXIiLAorCS8qIDI1ICovICJSZXNvdXJjZURlc2MiLAorCS8qIDI2ICovICJSZXNvdXJjZUZsZCIsCiAJLyogMjcgKi8gIlNjb3BlIiwKIAkvKiAyOCAqLyAiRXh0cmEiLAogCS8qIDI5ICovICJEYXRhIiwKIAkvKiAzMCAqLyAiSW52YWxpZCIKKy8qISBbRW5kXSBubyBzb3VyY2UgY29kZSB0cmFuc2xhdGlvbiAhKi8KIH07CiAKIGNoYXIgKmFjcGlfdXRfZ2V0X3R5cGVfbmFtZShhY3BpX29iamVjdF90eXBlIHR5cGUpCiB7CiAKIAlpZiAodHlwZSA+IEFDUElfVFlQRV9JTlZBTElEKSB7Ci0JCXJldHVybiAoKGNoYXIgKilhY3BpX2dibF9iYWRfdHlwZSk7CisJCXJldHVybiAoQUNQSV9DQVNUX1BUUihjaGFyLCBhY3BpX2dibF9iYWRfdHlwZSkpOwogCX0KIAotCXJldHVybiAoKGNoYXIgKilhY3BpX2dibF9uc190eXBlX25hbWVzW3R5cGVdKTsKKwlyZXR1cm4gKEFDUElfQ0FTVF9QVFIoY2hhciwgYWNwaV9nYmxfbnNfdHlwZV9uYW1lc1t0eXBlXSkpOwogfQogCiBjaGFyICphY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQpAQCAtNjM0LDcgKzY0MSw3IEBACiAKIAkvKiBOYW1lIG11c3QgYmUgYSB2YWxpZCBBQ1BJIG5hbWUgKi8KIAotCWlmICghYWNwaV91dF92YWxpZF9hY3BpX25hbWUoKih1MzIgKikgbm9kZS0+bmFtZS5hc2NpaSkpIHsKKwlpZiAoIWFjcGlfdXRfdmFsaWRfYWNwaV9uYW1lKG5vZGUtPm5hbWUuaW50ZWdlcikpIHsKIAkJcmV0dXJuICgiPz8/PyIpOwogCX0KIApAQCAtNjU4LDE1ICs2NjUsMTYgQEAKIC8qIFByaW50YWJsZSBuYW1lcyBvZiBvYmplY3QgZGVzY3JpcHRvciB0eXBlcyAqLwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWNwaV9nYmxfZGVzY190eXBlX25hbWVzW10gPSB7CisvKiEgW0JlZ2luXSBubyBzb3VyY2UgY29kZSB0cmFuc2xhdGlvbiAoa2VlcCB0aGVzZSBBU0wgS2V5d29yZHMgYXMtaXMpICovCiAJLyogMDAgKi8gIkludmFsaWQiLAogCS8qIDAxICovICJDYWNoZWQiLAogCS8qIDAyICovICJTdGF0ZS1HZW5lcmljIiwKIAkvKiAwMyAqLyAiU3RhdGUtVXBkYXRlIiwKIAkvKiAwNCAqLyAiU3RhdGUtUGFja2FnZSIsCiAJLyogMDUgKi8gIlN0YXRlLUNvbnRyb2wiLAotCS8qIDA2ICovICJTdGF0ZS1yb290X3BhcnNlX3Njb3BlIiwKLQkvKiAwNyAqLyAiU3RhdGUtcGFyc2Vfc2NvcGUiLAotCS8qIDA4ICovICJTdGF0ZS13YWxrX3Njb3BlIiwKKwkvKiAwNiAqLyAiU3RhdGUtUm9vdFBhcnNlU2NvcGUiLAorCS8qIDA3ICovICJTdGF0ZS1QYXJzZVNjb3BlIiwKKwkvKiAwOCAqLyAiU3RhdGUtV2Fsa1Njb3BlIiwKIAkvKiAwOSAqLyAiU3RhdGUtUmVzdWx0IiwKIAkvKiAxMCAqLyAiU3RhdGUtTm90aWZ5IiwKIAkvKiAxMSAqLyAiU3RhdGUtVGhyZWFkIiwKQEAgLTY3NCw2ICs2ODIsNyBAQAogCS8qIDEzICovICJQYXJzZXIiLAogCS8qIDE0ICovICJPcGVyYW5kIiwKIAkvKiAxNSAqLyAiTm9kZSIKKy8qISBbRW5kXSBubyBzb3VyY2UgY29kZSB0cmFuc2xhdGlvbiAhKi8KIH07CiAKIGNoYXIgKmFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSh2b2lkICpvYmplY3QpCkBAIC02ODQsMTEgKzY5MywxMiBAQAogCX0KIAogCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqZWN0KSA+IEFDUElfREVTQ19UWVBFX01BWCkgewotCQlyZXR1cm4gKChjaGFyICopYWNwaV9nYmxfYmFkX3R5cGUpOworCQlyZXR1cm4gKEFDUElfQ0FTVF9QVFIoY2hhciwgYWNwaV9nYmxfYmFkX3R5cGUpKTsKIAl9CiAKLQlyZXR1cm4gKChjaGFyICopCi0JCWFjcGlfZ2JsX2Rlc2NfdHlwZV9uYW1lc1tBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqZWN0KV0pOworCXJldHVybiAoQUNQSV9DQVNUX1BUUihjaGFyLAorCQkJICAgICAgYWNwaV9nYmxfZGVzY190eXBlX25hbWVzW0FDUElfR0VUX0RFU0NSSVBUT1JfVFlQRQorCQkJCQkJICAgICAgIChvYmplY3QpXSkpOwogCiB9CiAKQEAgLTc4Nyw2ICs3OTcsMTEgQEAKIAkJYWNwaV9nYmxfbXV0ZXhfaW5mb1tpXS51c2VfY291bnQgPSAwOwogCX0KIAorCWZvciAoaSA9IDA7IGkgPCBBQ1BJX05VTV9PV05FUklEX01BU0tTOyBpKyspIHsKKwkJYWNwaV9nYmxfb3duZXJfaWRfbWFza1tpXSA9IDA7CisJfQorCWFjcGlfZ2JsX293bmVyX2lkX21hc2tbQUNQSV9OVU1fT1dORVJJRF9NQVNLUyAtIDFdID0gMHg4MDAwMDAwMDsJLyogTGFzdCBJRCBpcyBuZXZlciB2YWxpZCAqLworCiAJLyogR1BFIHN1cHBvcnQgKi8KIAogCWFjcGlfZ2JsX2dwZV94cnVwdF9saXN0X2hlYWQgPSBOVUxMOwpAQCAtODI0LDcgKzgzOSwxMSBAQAogCWFjcGlfZ2JsX25zX2xvb2t1cF9jb3VudCA9IDA7CiAJYWNwaV9nYmxfcHNfZmluZF9jb3VudCA9IDA7CiAJYWNwaV9nYmxfYWNwaV9oYXJkd2FyZV9wcmVzZW50ID0gVFJVRTsKLQlhY3BpX2dibF9vd25lcl9pZF9tYXNrID0gMDsKKwlhY3BpX2dibF9sYXN0X293bmVyX2lkX2luZGV4ID0gMDsKKwlhY3BpX2dibF9uZXh0X293bmVyX2lkX29mZnNldCA9IDA7CisJYWNwaV9nYmxfdHJhY2VfbWV0aG9kX25hbWUgPSAwOworCWFjcGlfZ2JsX3RyYWNlX2RiZ19sZXZlbCA9IDA7CisJYWNwaV9nYmxfdHJhY2VfZGJnX2xheWVyID0gMDsKIAlhY3BpX2dibF9kZWJ1Z2dlcl9jb25maWd1cmF0aW9uID0gREVCVUdHRVJfVEhSRUFESU5HOwogCWFjcGlfZ2JsX2RiX291dHB1dF9mbGFncyA9IEFDUElfREJfQ09OU09MRV9PVVRQVVQ7CiAKQEAgLTgzNiw3ICs4NTUsNiBAQAogCS8qIE5hbWVzcGFjZSAqLwogCiAJYWNwaV9nYmxfcm9vdF9ub2RlID0gTlVMTDsKLQogCWFjcGlfZ2JsX3Jvb3Rfbm9kZV9zdHJ1Y3QubmFtZS5pbnRlZ2VyID0gQUNQSV9ST09UX05BTUU7CiAJYWNwaV9nYmxfcm9vdF9ub2RlX3N0cnVjdC5kZXNjcmlwdG9yID0gQUNQSV9ERVNDX1RZUEVfTkFNRUQ7CiAJYWNwaV9nYmxfcm9vdF9ub2RlX3N0cnVjdC50eXBlID0gQUNQSV9UWVBFX0RFVklDRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRpbml0LmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0aW5pdC5jCmluZGV4IDlkZGU4MmIuLjc1NjViYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRpbml0LmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGluaXQuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTIyMSwxNSArMjIxLDE0IEBACiAJLyogSnVzdCBleGl0IGlmIHN1YnN5c3RlbSBpcyBhbHJlYWR5IHNodXRkb3duICovCiAKIAlpZiAoYWNwaV9nYmxfc2h1dGRvd24pIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJBQ1BJIFN1YnN5c3RlbSBpcyBhbHJlYWR5IHRlcm1pbmF0ZWRcbiIpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJBQ1BJIFN1YnN5c3RlbSBpcyBhbHJlYWR5IHRlcm1pbmF0ZWRcbiIpKTsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCiAJLyogU3Vic3lzdGVtIGFwcGVhcnMgYWN0aXZlLCBnbyBhaGVhZCBhbmQgc2h1dCBpdCBkb3duICovCiAKIAlhY3BpX2dibF9zaHV0ZG93biA9IFRSVUU7Ci0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiU2h1dHRpbmcgZG93biBBQ1BJIFN1YnN5c3RlbS4uLlxuIikpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlNodXR0aW5nIGRvd24gQUNQSSBTdWJzeXN0ZW1cbiIpKTsKIAogCS8qIENsb3NlIHRoZSBhY3BpX2V2ZW50IEhhbmRsaW5nICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtYXRoLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWF0aC5jCmluZGV4IDY4YTBhNmYuLjA2MjE0MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtYXRoLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1hdGguYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC04Miw3ICs4Miw3IEBACiAJLyogQWx3YXlzIGNoZWNrIGZvciBhIHplcm8gZGl2aXNvciAqLwogCiAJaWYgKGRpdmlzb3IgPT0gMCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfdXRfc2hvcnRfZGl2aWRlOiBEaXZpZGUgYnkgemVyb1xuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkRpdmlkZSBieSB6ZXJvXG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfRElWSURFX0JZX1pFUk8pOwogCX0KIApAQCAtMTQ0LDcgKzE0NCw3IEBACiAJLyogQWx3YXlzIGNoZWNrIGZvciBhIHplcm8gZGl2aXNvciAqLwogCiAJaWYgKGluX2Rpdmlzb3IgPT0gMCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfdXRfZGl2aWRlOiBEaXZpZGUgYnkgemVyb1xuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkRpdmlkZSBieSB6ZXJvXG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfRElWSURFX0JZX1pFUk8pOwogCX0KIApAQCAtMjY2LDcgKzI2Niw3IEBACiAJLyogQWx3YXlzIGNoZWNrIGZvciBhIHplcm8gZGl2aXNvciAqLwogCiAJaWYgKGRpdmlzb3IgPT0gMCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfdXRfc2hvcnRfZGl2aWRlOiBEaXZpZGUgYnkgemVyb1xuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkRpdmlkZSBieSB6ZXJvXG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfRElWSURFX0JZX1pFUk8pOwogCX0KIApAQCAtMjkyLDcgKzI5Miw3IEBACiAJLyogQWx3YXlzIGNoZWNrIGZvciBhIHplcm8gZGl2aXNvciAqLwogCiAJaWYgKGluX2Rpdmlzb3IgPT0gMCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUigoImFjcGlfdXRfZGl2aWRlOiBEaXZpZGUgYnkgemVyb1xuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkRpdmlkZSBieSB6ZXJvXG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfRElWSURFX0JZX1pFUk8pOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1pc2MuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtaXNjLmMKaW5kZXggMmNlODcyZC4uYTc3ZmZjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1pc2MuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWlzYy5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTYzLDYgKzYzLDggQEAKIGFjcGlfc3RhdHVzIGFjcGlfdXRfYWxsb2NhdGVfb3duZXJfaWQoYWNwaV9vd25lcl9pZCAqIG93bmVyX2lkKQogewogCWFjcGlfbmF0aXZlX3VpbnQgaTsKKwlhY3BpX25hdGl2ZV91aW50IGo7CisJYWNwaV9uYXRpdmVfdWludCBrOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X2FsbG9jYXRlX293bmVyX2lkIik7CkBAIC04MiwzMSArODQsNjYgQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JLyogRmluZCBhIGZyZWUgb3duZXIgSUQgKi8KLQotCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7Ci0JCWlmICghKGFjcGlfZ2JsX293bmVyX2lkX21hc2sgJiAoMVVMTCA8PCBpKSkpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfVkFMVUVTLAotCQkJCQkgICJDdXJyZW50IG93bmVyX2lkIG1hc2s6ICUxNi4xNkxYIE5ldyBJRDogJTIuMlhcbiIsCi0JCQkJCSAgYWNwaV9nYmxfb3duZXJfaWRfbWFzaywKLQkJCQkJICAodW5zaWduZWQgaW50KShpICsgMSkpKTsKLQotCQkJYWNwaV9nYmxfb3duZXJfaWRfbWFzayB8PSAoMVVMTCA8PCBpKTsKLQkJCSpvd25lcl9pZCA9IChhY3BpX293bmVyX2lkKSAoaSArIDEpOwotCQkJZ290byBleGl0OworCS8qCisJICogRmluZCBhIGZyZWUgb3duZXIgSUQsIGN5Y2xlIHRocm91Z2ggYWxsIHBvc3NpYmxlIElEcyBvbiByZXBlYXRlZAorCSAqIGFsbG9jYXRpb25zLiAoQUNQSV9OVU1fT1dORVJJRF9NQVNLUyArIDEpIGJlY2F1c2UgZmlyc3QgaW5kZXggbWF5IGhhdmUKKwkgKiB0byBiZSBzY2FubmVkIHR3aWNlLgorCSAqLworCWZvciAoaSA9IDAsIGogPSBhY3BpX2dibF9sYXN0X293bmVyX2lkX2luZGV4OworCSAgICAgaSA8IChBQ1BJX05VTV9PV05FUklEX01BU0tTICsgMSk7IGkrKywgaisrKSB7CisJCWlmIChqID49IEFDUElfTlVNX09XTkVSSURfTUFTS1MpIHsKKwkJCWogPSAwOwkvKiBXcmFwYXJvdW5kIHRvIHN0YXJ0IG9mIG1hc2sgYXJyYXkgKi8KIAkJfQorCisJCWZvciAoayA9IGFjcGlfZ2JsX25leHRfb3duZXJfaWRfb2Zmc2V0OyBrIDwgMzI7IGsrKykgeworCQkJaWYgKGFjcGlfZ2JsX293bmVyX2lkX21hc2tbal0gPT0gQUNQSV9VSU5UMzJfTUFYKSB7CisJCQkJLyogVGhlcmUgYXJlIG5vIGZyZWUgSURzIGluIHRoaXMgbWFzayAqLworCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICghKGFjcGlfZ2JsX293bmVyX2lkX21hc2tbal0gJiAoMSA8PCBrKSkpIHsKKwkJCQkvKgorCQkJCSAqIEZvdW5kIGEgZnJlZSBJRC4gVGhlIGFjdHVhbCBJRCBpcyB0aGUgYml0IGluZGV4IHBsdXMgb25lLAorCQkJCSAqIG1ha2luZyB6ZXJvIGFuIGludmFsaWQgT3duZXIgSUQuIFNhdmUgdGhpcyBhcyB0aGUgbGFzdCBJRAorCQkJCSAqIGFsbG9jYXRlZCBhbmQgdXBkYXRlIHRoZSBnbG9iYWwgSUQgbWFzay4KKwkJCQkgKi8KKwkJCQlhY3BpX2dibF9vd25lcl9pZF9tYXNrW2pdIHw9ICgxIDw8IGspOworCisJCQkJYWNwaV9nYmxfbGFzdF9vd25lcl9pZF9pbmRleCA9ICh1OCkgajsKKwkJCQlhY3BpX2dibF9uZXh0X293bmVyX2lkX29mZnNldCA9ICh1OCkgKGsgKyAxKTsKKworCQkJCS8qCisJCQkJICogQ29uc3RydWN0IGVuY29kZWQgSUQgZnJvbSB0aGUgaW5kZXggYW5kIGJpdCBwb3NpdGlvbgorCQkJCSAqCisJCQkJICogTm90ZTogTGFzdCBbal0uayAoYml0IDI1NSkgaXMgbmV2ZXIgdXNlZCBhbmQgaXMgbWFya2VkCisJCQkJICogcGVybWFuZW50bHkgYWxsb2NhdGVkIChwcmV2ZW50cyArMSBvdmVyZmxvdykKKwkJCQkgKi8KKwkJCQkqb3duZXJfaWQgPQorCQkJCSAgICAoYWNwaV9vd25lcl9pZCkgKChrICsgMSkgKyBBQ1BJX01VTF8zMihqKSk7CisKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1ZBTFVFUywKKwkJCQkJCSAgIkFsbG9jYXRlZCBvd25lcl9pZDogJTIuMlhcbiIsCisJCQkJCQkgICh1bnNpZ25lZCBpbnQpKm93bmVyX2lkKSk7CisJCQkJZ290byBleGl0OworCQkJfQorCQl9CisKKwkJYWNwaV9nYmxfbmV4dF9vd25lcl9pZF9vZmZzZXQgPSAwOwogCX0KIAogCS8qCi0JICogSWYgd2UgYXJlIGhlcmUsIGFsbCBvd25lcl9pZHMgaGF2ZSBiZWVuIGFsbG9jYXRlZC4gVGhpcyBwcm9iYWJseSBzaG91bGQKKwkgKiBBbGwgb3duZXJfaWRzIGhhdmUgYmVlbiBhbGxvY2F0ZWQuIFRoaXMgdHlwaWNhbGx5IHNob3VsZAogCSAqIG5vdCBoYXBwZW4gc2luY2UgdGhlIElEcyBhcmUgcmV1c2VkIGFmdGVyIGRlYWxsb2NhdGlvbi4gVGhlIElEcyBhcmUKIAkgKiBhbGxvY2F0ZWQgdXBvbiB0YWJsZSBsb2FkIChvbmUgcGVyIHRhYmxlKSBhbmQgbWV0aG9kIGV4ZWN1dGlvbiwgYW5kCiAJICogdGhleSBhcmUgcmVsZWFzZWQgd2hlbiBhIHRhYmxlIGlzIHVubG9hZGVkIG9yIGEgbWV0aG9kIGNvbXBsZXRlcwogCSAqIGV4ZWN1dGlvbi4KKwkgKgorCSAqIElmIHRoaXMgZXJyb3IgaGFwcGVucywgdGhlcmUgbWF5IGJlIHZlcnkgZGVlcCBuZXN0aW5nIG9mIGludm9rZWQgY29udHJvbAorCSAqIG1ldGhvZHMsIG9yIHRoZXJlIG1heSBiZSBhIGJ1ZyB3aGVyZSB0aGUgSURzIGFyZSBub3QgcmVsZWFzZWQuCiAJICovCi0JKm93bmVyX2lkID0gMDsKIAlzdGF0dXMgPSBBRV9PV05FUl9JRF9MSU1JVDsKLQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBhbGxvY2F0ZSBuZXcgb3duZXJfaWQgKDY0IG1heCksIEFFX09XTkVSX0lEX0xJTUlUXG4iKSk7CisJQUNQSV9SRVBPUlRfRVJST1IoKCJDb3VsZCBub3QgYWxsb2NhdGUgbmV3IG93bmVyX2lkICgyNTUgbWF4KSwgQUVfT1dORVJfSURfTElNSVRcbiIpKTsKIAogICAgICAgZXhpdDoKIAkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfQ0FDSEVTKTsKQEAgLTEyMyw3ICsxNjAsNyBAQAogICogICAgICAgICAgICAgIGNvbnRyb2wgbWV0aG9kIG9yIHVubG9hZGluZyBhIHRhYmxlLiBFaXRoZXIgd2F5LCB3ZSB3b3VsZAogICogICAgICAgICAgICAgIGlnbm9yZSBhbnkgZXJyb3IgYW55d2F5LgogICoKLSAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIGEgdGFibGUgb3IgbWV0aG9kIG93bmVyIElELiAgVmFsaWQgSURzIGFyZSAxIC0gNjQKKyAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIGEgdGFibGUgb3IgbWV0aG9kIG93bmVyIElELiAgVmFsaWQgSURzIGFyZSAxIC0gMjU1CiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMTMxLDYgKzE2OCw4IEBACiB7CiAJYWNwaV9vd25lcl9pZCBvd25lcl9pZCA9ICpvd25lcl9pZF9wdHI7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfbmF0aXZlX3VpbnQgaW5kZXg7CisJdTMyIGJpdDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKCJ1dF9yZWxlYXNlX293bmVyX2lkIiwgb3duZXJfaWQpOwogCkBAIC0xNDAsNyArMTc5LDcgQEAKIAogCS8qIFplcm8gaXMgbm90IGEgdmFsaWQgb3duZXJfaUQgKi8KIAotCWlmICgob3duZXJfaWQgPT0gMCkgfHwgKG93bmVyX2lkID4gNjQpKSB7CisJaWYgKG93bmVyX2lkID09IDApIHsKIAkJQUNQSV9SRVBPUlRfRVJST1IoKCJJbnZhbGlkIG93bmVyX2lkOiAlMi4yWFxuIiwgb3duZXJfaWQpKTsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQpAQCAtMTU2LDEwICsxOTUsMTggQEAKIAogCW93bmVyX2lkLS07CiAKKwkvKiBEZWNvZGUgSUQgdG8gaW5kZXgvb2Zmc2V0IHBhaXIgKi8KKworCWluZGV4ID0gQUNQSV9ESVZfMzIob3duZXJfaWQpOworCWJpdCA9IDEgPDwgQUNQSV9NT0RfMzIob3duZXJfaWQpOworCiAJLyogRnJlZSB0aGUgb3duZXIgSUQgb25seSBpZiBpdCBpcyB2YWxpZCAqLwogCi0JaWYgKGFjcGlfZ2JsX293bmVyX2lkX21hc2sgJiAoMVVMTCA8PCBvd25lcl9pZCkpIHsKLQkJYWNwaV9nYmxfb3duZXJfaWRfbWFzayBePSAoMVVMTCA8PCBvd25lcl9pZCk7CisJaWYgKGFjcGlfZ2JsX293bmVyX2lkX21hc2tbaW5kZXhdICYgYml0KSB7CisJCWFjcGlfZ2JsX293bmVyX2lkX21hc2tbaW5kZXhdIF49IGJpdDsKKwl9IGVsc2UgeworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlJlbGVhc2Ugb2Ygbm9uLWFsbG9jYXRlZCBvd25lcl9pZDogJTIuMlhcbiIsCisJCQkJICAgb3duZXJfaWQgKyAxKSk7CiAJfQogCiAJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0NBQ0hFUyk7CkBAIC03OTAsNTkgKzgzNywxMCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9yZXNvdXJjZV9lbmRfdGFnCi0gKgotICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAtIFRoZSByZXNvdXJjZSB0ZW1wbGF0ZSBidWZmZXIgb2JqZWN0Ci0gKgotICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gdGhlIGVuZCB0YWcKLSAqCi0gKiBERVNDUklQVElPTjogRmluZCB0aGUgRU5EX1RBRyByZXNvdXJjZSBkZXNjcmlwdG9yIGluIGEgcmVzb3VyY2UgdGVtcGxhdGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11OCAqYWNwaV91dF9nZXRfcmVzb3VyY2VfZW5kX3RhZyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICogb2JqX2Rlc2MpCi17Ci0JdTggYnVmZmVyX2J5dGU7Ci0JdTggKmJ1ZmZlcjsKLQl1OCAqZW5kX2J1ZmZlcjsKLQotCWJ1ZmZlciA9IG9ial9kZXNjLT5idWZmZXIucG9pbnRlcjsKLQllbmRfYnVmZmVyID0gYnVmZmVyICsgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGg7Ci0KLQl3aGlsZSAoYnVmZmVyIDwgZW5kX2J1ZmZlcikgewotCQlidWZmZXJfYnl0ZSA9ICpidWZmZXI7Ci0JCWlmIChidWZmZXJfYnl0ZSAmIEFDUElfUkRFU0NfVFlQRV9NQVNLKSB7Ci0JCQkvKiBMYXJnZSBEZXNjcmlwdG9yIC0gTGVuZ3RoIGlzIG5leHQgMiBieXRlcyAqLwotCi0JCQlidWZmZXIgKz0gKCgqKGJ1ZmZlciArIDEpIHwgKCooYnVmZmVyICsgMikgPDwgOCkpICsgMyk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBTbWFsbCBEZXNjcmlwdG9yLiAgRW5kIFRhZyB3aWxsIGJlIGZvdW5kIGhlcmUgKi8KLQotCQkJaWYgKChidWZmZXJfYnl0ZSAmIEFDUElfUkRFU0NfU01BTExfTUFTSykgPT0KLQkJCSAgICBBQ1BJX1JERVNDX1RZUEVfRU5EX1RBRykgewotCQkJCS8qIEZvdW5kIHRoZSBlbmQgdGFnIGRlc2NyaXB0b3IsIGFsbCBkb25lLiAqLwotCi0JCQkJcmV0dXJuIChidWZmZXIpOwotCQkJfQotCi0JCQkvKiBMZW5ndGggaXMgaW4gdGhlIGhlYWRlciAqLwotCi0JCQlidWZmZXIgKz0gKChidWZmZXJfYnl0ZSAmIDB4MDcpICsgMSk7Ci0JCX0KLQl9Ci0KLQkvKiBFbmQgdGFnIG5vdCBmb3VuZCAqLwotCi0JcmV0dXJuIChOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9yZXBvcnRfZXJyb3IKICAqCiAgKiBQQVJBTUVURVJTOiAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lIChmb3IgZXJyb3Igb3V0cHV0KQogICogICAgICAgICAgICAgIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlciAoZm9yIGVycm9yIG91dHB1dCkKLSAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElEIChmb3IgZXJyb3Igb3V0cHV0KQogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgpAQCAtODUwLDEwICs4NDgsMTAgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIGFjcGlfdXRfcmVwb3J0X2Vycm9yKGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgbGluZV9udW1iZXIsIHUzMiBjb21wb25lbnRfaWQpCit2b2lkIGFjcGlfdXRfcmVwb3J0X2Vycm9yKGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgbGluZV9udW1iZXIpCiB7CiAKLQlhY3BpX29zX3ByaW50ZigiJThzLSUwNGQ6ICoqKiBFcnJvcjogIiwgbW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyKTsKKwlhY3BpX29zX3ByaW50ZigiQUNQSSBFcnJvciAoJXMtJTA0ZCk6ICIsIG1vZHVsZV9uYW1lLCBsaW5lX251bWJlcik7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC04NjIsNyArODYwLDYgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lIChmb3IgZXJyb3Igb3V0cHV0KQogICogICAgICAgICAgICAgIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlciAoZm9yIGVycm9yIG91dHB1dCkKLSAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElEIChmb3IgZXJyb3Igb3V0cHV0KQogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgpAQCAtODcwLDExICs4NjcsMTAgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX3V0X3JlcG9ydF93YXJuaW5nKGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgbGluZV9udW1iZXIsIHUzMiBjb21wb25lbnRfaWQpCit2b2lkIGFjcGlfdXRfcmVwb3J0X3dhcm5pbmcoY2hhciAqbW9kdWxlX25hbWUsIHUzMiBsaW5lX251bWJlcikKIHsKIAotCWFjcGlfb3NfcHJpbnRmKCIlOHMtJTA0ZDogKioqIFdhcm5pbmc6ICIsIG1vZHVsZV9uYW1lLCBsaW5lX251bWJlcik7CisJYWNwaV9vc19wcmludGYoIkFDUEkgV2FybmluZyAoJXMtJTA0ZCk6ICIsIG1vZHVsZV9uYW1lLCBsaW5lX251bWJlcik7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC04ODMsNyArODc5LDYgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lIChmb3IgZXJyb3Igb3V0cHV0KQogICogICAgICAgICAgICAgIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlciAoZm9yIGVycm9yIG91dHB1dCkKLSAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElEIChmb3IgZXJyb3Igb3V0cHV0KQogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgpAQCAtODkxLDggKzg4Niw4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBhY3BpX3V0X3JlcG9ydF9pbmZvKGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgbGluZV9udW1iZXIsIHUzMiBjb21wb25lbnRfaWQpCit2b2lkIGFjcGlfdXRfcmVwb3J0X2luZm8oY2hhciAqbW9kdWxlX25hbWUsIHUzMiBsaW5lX251bWJlcikKIHsKIAotCWFjcGlfb3NfcHJpbnRmKCIlOHMtJTA0ZDogKioqIEluZm86ICIsIG1vZHVsZV9uYW1lLCBsaW5lX251bWJlcik7CisJYWNwaV9vc19wcmludGYoIkFDUEkgKCVzLSUwNGQpOiAiLCBtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG11dGV4LmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bXV0ZXguYwppbmRleCA5MDEzNGM1Li5mZmFmZjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bXV0ZXguYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bXV0ZXguYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0yMTQsMjMgKzIxNCwxNCBAQAogCQkgKiB0aGUgQUNQSSBzdWJzeXN0ZW0gY29kZS4KIAkJICovCiAJCWZvciAoaSA9IG11dGV4X2lkOyBpIDwgTUFYX01VVEVYOyBpKyspIHsKLQkJCWlmIChhY3BpX2dibF9tdXRleF9pbmZvW2ldLm93bmVyX2lkID09IHRoaXNfdGhyZWFkX2lkKSB7CisJCQlpZiAoYWNwaV9nYmxfbXV0ZXhfaW5mb1tpXS50aHJlYWRfaWQgPT0gdGhpc190aHJlYWRfaWQpIHsKIAkJCQlpZiAoaSA9PSBtdXRleF9pZCkgewotCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJCSAgIk11dGV4IFslc10gYWxyZWFkeSBhY3F1aXJlZCBieSB0aGlzIHRocmVhZCBbJVhdXG4iLAotCQkJCQkJCSAgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZQotCQkJCQkJCSAgKG11dGV4X2lkKSwKLQkJCQkJCQkgIHRoaXNfdGhyZWFkX2lkKSk7CisJCQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiTXV0ZXggWyVzXSBhbHJlYWR5IGFjcXVpcmVkIGJ5IHRoaXMgdGhyZWFkIFslWF1cbiIsIGFjcGlfdXRfZ2V0X211dGV4X25hbWUobXV0ZXhfaWQpLCB0aGlzX3RocmVhZF9pZCkpOwogCiAJCQkJCXJldHVybiAoQUVfQUxSRUFEWV9BQ1FVSVJFRCk7CiAJCQkJfQogCi0JCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCSAgIkludmFsaWQgYWNxdWlyZSBvcmRlcjogVGhyZWFkICVYIG93bnMgWyVzXSwgd2FudHMgWyVzXVxuIiwKLQkJCQkJCSAgdGhpc190aHJlYWRfaWQsCi0JCQkJCQkgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUoaSksCi0JCQkJCQkgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUKLQkJCQkJCSAgKG11dGV4X2lkKSkpOworCQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiSW52YWxpZCBhY3F1aXJlIG9yZGVyOiBUaHJlYWQgJVggb3ducyBbJXNdLCB3YW50cyBbJXNdXG4iLCB0aGlzX3RocmVhZF9pZCwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZShpKSwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZShtdXRleF9pZCkpKTsKIAogCQkJCXJldHVybiAoQUVfQUNRVUlSRV9ERUFETE9DSyk7CiAJCQl9CkBAIC0yNTMsMTEgKzI0NCw3IEBACiAJCWFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLnVzZV9jb3VudCsrOwogCQlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS50aHJlYWRfaWQgPSB0aGlzX3RocmVhZF9pZDsKIAl9IGVsc2UgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIlRocmVhZCAlWCBjb3VsZCBub3QgYWNxdWlyZSBNdXRleCBbJXNdICVzXG4iLAotCQkJCSAgdGhpc190aHJlYWRfaWQsCi0JCQkJICBhY3BpX3V0X2dldF9tdXRleF9uYW1lKG11dGV4X2lkKSwKLQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiVGhyZWFkICVYIGNvdWxkIG5vdCBhY3F1aXJlIE11dGV4IFslWF0gJXNcbiIsIHRoaXNfdGhyZWFkX2lkLCBtdXRleF9pZCwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKIAl9CiAKIAlyZXR1cm4gKHN0YXR1cyk7CkBAIC0yOTUsOSArMjgyLDcgQEAKIAkgKiBNdXRleCBtdXN0IGJlIGFjcXVpcmVkIGluIG9yZGVyIHRvIHJlbGVhc2UgaXQhCiAJICovCiAJaWYgKGFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLnRocmVhZF9pZCA9PSBBQ1BJX01VVEVYX05PVF9BQ1FVSVJFRCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIk11dGV4IFslc10gaXMgbm90IGFjcXVpcmVkLCBjYW5ub3QgcmVsZWFzZVxuIiwKLQkJCQkgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUobXV0ZXhfaWQpKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiTXV0ZXggWyVYXSBpcyBub3QgYWNxdWlyZWQsIGNhbm5vdCByZWxlYXNlXG4iLCBtdXRleF9pZCkpOwogCiAJCXJldHVybiAoQUVfTk9UX0FDUVVJUkVEKTsKIAl9CkBAIC0zMTMsMTYgKzI5OCwxMiBAQAogCQkgKiB0aGUgQUNQSSBzdWJzeXN0ZW0gY29kZS4KIAkJICovCiAJCWZvciAoaSA9IG11dGV4X2lkOyBpIDwgTUFYX01VVEVYOyBpKyspIHsKLQkJCWlmIChhY3BpX2dibF9tdXRleF9pbmZvW2ldLm93bmVyX2lkID09IHRoaXNfdGhyZWFkX2lkKSB7CisJCQlpZiAoYWNwaV9nYmxfbXV0ZXhfaW5mb1tpXS50aHJlYWRfaWQgPT0gdGhpc190aHJlYWRfaWQpIHsKIAkJCQlpZiAoaSA9PSBtdXRleF9pZCkgewogCQkJCQljb250aW51ZTsKIAkJCQl9CiAKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJICAiSW52YWxpZCByZWxlYXNlIG9yZGVyOiBvd25zIFslc10sIHJlbGVhc2luZyBbJXNdXG4iLAotCQkJCQkJICBhY3BpX3V0X2dldF9tdXRleF9uYW1lKGkpLAotCQkJCQkJICBhY3BpX3V0X2dldF9tdXRleF9uYW1lCi0JCQkJCQkgIChtdXRleF9pZCkpKTsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkludmFsaWQgcmVsZWFzZSBvcmRlcjogb3ducyBbJXNdLCByZWxlYXNpbmcgWyVzXVxuIiwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZShpKSwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZShtdXRleF9pZCkpKTsKIAogCQkJCXJldHVybiAoQUVfUkVMRUFTRV9ERUFETE9DSyk7CiAJCQl9CkBAIC0zMzgsMTEgKzMxOSw3IEBACiAJICAgIGFjcGlfb3Nfc2lnbmFsX3NlbWFwaG9yZShhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5tdXRleCwgMSk7CiAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJUaHJlYWQgJVggY291bGQgbm90IHJlbGVhc2UgTXV0ZXggWyVzXSAlc1xuIiwKLQkJCQkgIHRoaXNfdGhyZWFkX2lkLAotCQkJCSAgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZShtdXRleF9pZCksCi0JCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlRocmVhZCAlWCBjb3VsZCBub3QgcmVsZWFzZSBNdXRleCBbJVhdICVzXG4iLCB0aGlzX3RocmVhZF9pZCwgbXV0ZXhfaWQsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJfSBlbHNlIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9NVVRFWCwKIAkJCQkgICJUaHJlYWQgJVggcmVsZWFzZWQgTXV0ZXggWyVzXVxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRvYmplY3QuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRvYmplY3QuYwppbmRleCAzMDE1ZTE1Li4xYjZiMjE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0b2JqZWN0LmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG9iamVjdC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMTc3LDcgKzE3Nyw4IEBACiAKIAkJYnVmZmVyID0gQUNQSV9NRU1fQ0FMTE9DQVRFKGJ1ZmZlcl9zaXplKTsKIAkJaWYgKCFidWZmZXIpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SKCgiY3JlYXRlX2J1ZmZlcjogY291bGQgbm90IGFsbG9jYXRlIHNpemUgJVhcbiIsICh1MzIpIGJ1ZmZlcl9zaXplKSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIkNvdWxkIG5vdCBhbGxvY2F0ZSBzaXplICVYXG4iLAorCQkJCQkgICAodTMyKSBidWZmZXJfc2l6ZSkpOwogCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGJ1ZmZlcl9kZXNjKTsKIAkJCXJldHVybl9QVFIoTlVMTCk7CiAJCX0KQEAgLTIyOCw3ICsyMjksOCBAQAogCSAqLwogCXN0cmluZyA9IEFDUElfTUVNX0NBTExPQ0FURShzdHJpbmdfc2l6ZSArIDEpOwogCWlmICghc3RyaW5nKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SKCgiY3JlYXRlX3N0cmluZzogY291bGQgbm90IGFsbG9jYXRlIHNpemUgJVhcbiIsICh1MzIpIHN0cmluZ19zaXplKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiQ291bGQgbm90IGFsbG9jYXRlIHNpemUgJVhcbiIsCisJCQkJICAgKHUzMikgc3RyaW5nX3NpemUpKTsKIAkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHN0cmluZ19kZXNjKTsKIAkJcmV0dXJuX1BUUihOVUxMKTsKIAl9CkBAIC0zMTAsNyArMzEyLDcgQEAKIAogCW9iamVjdCA9IGFjcGlfb3NfYWNxdWlyZV9vYmplY3QoYWNwaV9nYmxfb3BlcmFuZF9jYWNoZSk7CiAJaWYgKCFvYmplY3QpIHsKLQkJX0FDUElfUkVQT1JUX0VSUk9SKG1vZHVsZV9uYW1lLCBsaW5lX251bWJlciwgY29tcG9uZW50X2lkLAorCQlfQUNQSV9SRVBPUlRfRVJST1IobW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyLAogCQkJCSAgICgiQ291bGQgbm90IGFsbG9jYXRlIGFuIG9iamVjdCBkZXNjcmlwdG9yXG4iKSk7CiAKIAkJcmV0dXJuX1BUUihOVUxMKTsKQEAgLTM0NSw5ICszNDcsOSBAQAogCS8qIE9iamVjdCBtdXN0IGJlIGFuIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgKi8KIAogCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqZWN0KSAhPSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiJXAgaXMgbm90IGFuIEFDUEkgT3BlcmFuZCBvYmplY3QgWyVzXVxuIiwKLQkJCQkgIG9iamVjdCwgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lKG9iamVjdCkpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCIlcCBpcyBub3QgYW4gQUNQSSBPcGVyYW5kIG9iamVjdCBbJXNdXG4iLAorCQkJCSAgIG9iamVjdCwKKwkJCQkgICBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUob2JqZWN0KSkpOwogCQlyZXR1cm5fVk9JRDsKIAl9CiAKQEAgLTQ0OSwxMCArNDUxLDcgQEAKIAkJCSAqIE5vdGFibHksIExvY2FscyBhbmQgQXJncyBhcmUgbm90IHN1cHBvcnRlZCwgYnV0IHRoaXMgbWF5IGJlCiAJCQkgKiByZXF1aXJlZCBldmVudHVhbGx5LgogCQkJICovCi0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJVbnN1cHBvcnRlZCBSZWZlcmVuY2Ugb3Bjb2RlPSVYIGluIG9iamVjdCAlcFxuIiwKLQkJCQkJICBpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5vcGNvZGUsCi0JCQkJCSAgaW50ZXJuYWxfb2JqZWN0KSk7CisJCQlBQ1BJX1JFUE9SVF9FUlJPUigoIlVuc3VwcG9ydGVkIFJlZmVyZW5jZSBvcGNvZGU9JVggaW4gb2JqZWN0ICVwXG4iLCBpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5vcGNvZGUsIGludGVybmFsX29iamVjdCkpOwogCQkJc3RhdHVzID0gQUVfVFlQRTsKIAkJCWJyZWFrOwogCQl9CkBAIC00NjAsMTAgKzQ1OSw5IEBACiAKIAlkZWZhdWx0OgogCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiVW5zdXBwb3J0ZWQgdHlwZT0lWCBpbiBvYmplY3QgJXBcbiIsCi0JCQkJICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShpbnRlcm5hbF9vYmplY3QpLAotCQkJCSAgaW50ZXJuYWxfb2JqZWN0KSk7CisJCUFDUElfUkVQT1JUX0VSUk9SKCgiVW5zdXBwb3J0ZWQgdHlwZT0lWCBpbiBvYmplY3QgJXBcbiIsCisJCQkJICAgQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW50ZXJuYWxfb2JqZWN0KSwKKwkJCQkgICBpbnRlcm5hbF9vYmplY3QpKTsKIAkJc3RhdHVzID0gQUVfVFlQRTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHJlc3JjLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0cmVzcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmJmOWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHJlc3JjLmMKQEAgLTAsMCArMSw1MzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IHV0cmVzcmMgLSBSZXNvdXJjZSBtYW5hZ21lbnQgdXRpbGl0aWVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgPGFjcGkvYW1scmVzcmMuaD4KKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCitBQ1BJX01PRFVMRV9OQU1FKCJ1dG1pc2MiKQorCisjaWYgZGVmaW5lZChBQ1BJX0RJU0FTU0VNQkxFUikgfHwgZGVmaW5lZCAoQUNQSV9ERUJVR0dFUikKKy8qCisgKiBTdHJpbmdzIHVzZWQgdG8gZGVjb2RlIHJlc291cmNlIGRlc2NyaXB0b3JzLgorICogVXNlZCBieSBib3RoIHRoZSBkaXNhc3NzZW1ibGVyIGFuZCB0aGUgZGVidWdnZXIgcmVzb3VyY2UgZHVtcCByb3V0aW5lcworICovCitjb25zdCBjaGFyICphY3BpX2dibF9CTWRlY29kZVsyXSA9IHsKKwkibm90X2J1c19tYXN0ZXIiLAorCSJidXNfbWFzdGVyIgorfTsKKworY29uc3QgY2hhciAqYWNwaV9nYmxfY29uZmlnX2RlY29kZVs0XSA9IHsKKwkiMCAtIEdvb2QgQ29uZmlndXJhdGlvbiIsCisJIjEgLSBBY2NlcHRhYmxlIENvbmZpZ3VyYXRpb24iLAorCSIyIC0gU3Vib3B0aW1hbCBDb25maWd1cmF0aW9uIiwKKwkiMyAtICoqKkludmFsaWQgQ29uZmlndXJhdGlvbioqKiIsCit9OworCitjb25zdCBjaGFyICphY3BpX2dibF9jb25zdW1lX2RlY29kZVsyXSA9IHsKKwkicmVzb3VyY2VfcHJvZHVjZXIiLAorCSJyZXNvdXJjZV9jb25zdW1lciIKK307CisKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX0RFQ2RlY29kZVsyXSA9IHsKKwkicG9zX2RlY29kZSIsCisJInN1Yl9kZWNvZGUiCit9OworCitjb25zdCBjaGFyICphY3BpX2dibF9IRWRlY29kZVsyXSA9IHsKKwkiTGV2ZWwiLAorCSJFZGdlIgorfTsKKworY29uc3QgY2hhciAqYWNwaV9nYmxfaW9fZGVjb2RlWzJdID0geworCSJEZWNvZGUxMCIsCisJIkRlY29kZTE2IgorfTsKKworY29uc3QgY2hhciAqYWNwaV9nYmxfTExkZWNvZGVbMl0gPSB7CisJImFjdGl2ZV9oaWdoIiwKKwkiYWN0aXZlX2xvdyIKK307CisKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX21heF9kZWNvZGVbMl0gPSB7CisJIm1heF9ub3RfZml4ZWQiLAorCSJtYXhfZml4ZWQiCit9OworCitjb25zdCBjaGFyICphY3BpX2dibF9NRU1kZWNvZGVbNF0gPSB7CisJIm5vbl9jYWNoZWFibGUiLAorCSJDYWNoZWFibGUiLAorCSJ3cml0ZV9jb21iaW5pbmciLAorCSJQcmVmZXRjaGFibGUiCit9OworCitjb25zdCBjaGFyICphY3BpX2dibF9taW5fZGVjb2RlWzJdID0geworCSJtaW5fbm90X2ZpeGVkIiwKKwkibWluX2ZpeGVkIgorfTsKKworY29uc3QgY2hhciAqYWNwaV9nYmxfTVRQZGVjb2RlWzRdID0geworCSJhZGRyZXNzX3JhbmdlX21lbW9yeSIsCisJImFkZHJlc3NfcmFuZ2VfcmVzZXJ2ZWQiLAorCSJhZGRyZXNzX3JhbmdlX2FDUEkiLAorCSJhZGRyZXNzX3JhbmdlX25WUyIKK307CisKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX1JOR2RlY29kZVs0XSA9IHsKKwkiaW52YWxpZF9yYW5nZXMiLAorCSJub25faVNBb25seV9yYW5nZXMiLAorCSJJU0Fvbmx5X3JhbmdlcyIsCisJImVudGlyZV9yYW5nZSIKK307CisKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX1JXZGVjb2RlWzJdID0geworCSJyZWFkX29ubHkiLAorCSJyZWFkX3dyaXRlIgorfTsKKworY29uc3QgY2hhciAqYWNwaV9nYmxfU0hSZGVjb2RlWzJdID0geworCSJFeGNsdXNpdmUiLAorCSJTaGFyZWQiCit9OworCitjb25zdCBjaGFyICphY3BpX2dibF9TSVpkZWNvZGVbNF0gPSB7CisJIlRyYW5zZmVyOCIsCisJIlRyYW5zZmVyOF8xNiIsCisJIlRyYW5zZmVyMTYiLAorCSJpbnZhbGlkX3NpemUiCit9OworCitjb25zdCBjaGFyICphY3BpX2dibF9UUlNkZWNvZGVbMl0gPSB7CisJImRlbnNlX3RyYW5zbGF0aW9uIiwKKwkic3BhcnNlX3RyYW5zbGF0aW9uIgorfTsKKworY29uc3QgY2hhciAqYWNwaV9nYmxfVFRQZGVjb2RlWzJdID0geworCSJ0eXBlX3N0YXRpYyIsCisJInR5cGVfdHJhbnNsYXRpb24iCit9OworCitjb25zdCBjaGFyICphY3BpX2dibF9UWVBkZWNvZGVbNF0gPSB7CisJIkNvbXBhdGliaWxpdHkiLAorCSJ0eXBlX2EiLAorCSJ0eXBlX2IiLAorCSJ0eXBlX2YiCit9OworCisjZW5kaWYKKworLyoKKyAqIEJhc2Ugc2l6ZXMgb2YgdGhlIHJhdyBBTUwgcmVzb3VyY2UgZGVzY3JpcHRvcnMsIGluZGV4ZWQgYnkgcmVzb3VyY2UgdHlwZS4KKyAqIFplcm8gaW5kaWNhdGVzIGEgcmVzZXJ2ZWQgKGFuZCB0aGVyZWZvcmUgaW52YWxpZCkgcmVzb3VyY2UgdHlwZS4KKyAqLworY29uc3QgdTggYWNwaV9nYmxfcmVzb3VyY2VfYW1sX3NpemVzW10gPSB7CisJLyogU21hbGwgZGVzY3JpcHRvcnMgKi8KKworCTAsCisJMCwKKwkwLAorCTAsCisJQUNQSV9BTUxfU0laRV9TTUFMTChzdHJ1Y3QgYW1sX3Jlc291cmNlX2lycSksCisJQUNQSV9BTUxfU0laRV9TTUFMTChzdHJ1Y3QgYW1sX3Jlc291cmNlX2RtYSksCisJQUNQSV9BTUxfU0laRV9TTUFMTChzdHJ1Y3QgYW1sX3Jlc291cmNlX3N0YXJ0X2RlcGVuZGVudCksCisJQUNQSV9BTUxfU0laRV9TTUFMTChzdHJ1Y3QgYW1sX3Jlc291cmNlX2VuZF9kZXBlbmRlbnQpLAorCUFDUElfQU1MX1NJWkVfU01BTEwoc3RydWN0IGFtbF9yZXNvdXJjZV9pbyksCisJQUNQSV9BTUxfU0laRV9TTUFMTChzdHJ1Y3QgYW1sX3Jlc291cmNlX2ZpeGVkX2lvKSwKKwkwLAorCTAsCisJMCwKKwkwLAorCUFDUElfQU1MX1NJWkVfU01BTEwoc3RydWN0IGFtbF9yZXNvdXJjZV92ZW5kb3Jfc21hbGwpLAorCUFDUElfQU1MX1NJWkVfU01BTEwoc3RydWN0IGFtbF9yZXNvdXJjZV9lbmRfdGFnKSwKKworCS8qIExhcmdlIGRlc2NyaXB0b3JzICovCisKKwkwLAorCUFDUElfQU1MX1NJWkVfTEFSR0Uoc3RydWN0IGFtbF9yZXNvdXJjZV9tZW1vcnkyNCksCisJQUNQSV9BTUxfU0laRV9MQVJHRShzdHJ1Y3QgYW1sX3Jlc291cmNlX2dlbmVyaWNfcmVnaXN0ZXIpLAorCTAsCisJQUNQSV9BTUxfU0laRV9MQVJHRShzdHJ1Y3QgYW1sX3Jlc291cmNlX3ZlbmRvcl9sYXJnZSksCisJQUNQSV9BTUxfU0laRV9MQVJHRShzdHJ1Y3QgYW1sX3Jlc291cmNlX21lbW9yeTMyKSwKKwlBQ1BJX0FNTF9TSVpFX0xBUkdFKHN0cnVjdCBhbWxfcmVzb3VyY2VfZml4ZWRfbWVtb3J5MzIpLAorCUFDUElfQU1MX1NJWkVfTEFSR0Uoc3RydWN0IGFtbF9yZXNvdXJjZV9hZGRyZXNzMzIpLAorCUFDUElfQU1MX1NJWkVfTEFSR0Uoc3RydWN0IGFtbF9yZXNvdXJjZV9hZGRyZXNzMTYpLAorCUFDUElfQU1MX1NJWkVfTEFSR0Uoc3RydWN0IGFtbF9yZXNvdXJjZV9leHRlbmRlZF9pcnEpLAorCUFDUElfQU1MX1NJWkVfTEFSR0Uoc3RydWN0IGFtbF9yZXNvdXJjZV9hZGRyZXNzNjQpLAorCUFDUElfQU1MX1NJWkVfTEFSR0Uoc3RydWN0IGFtbF9yZXNvdXJjZV9leHRlbmRlZF9hZGRyZXNzNjQpCit9OworCisvKgorICogUmVzb3VyY2UgdHlwZXMsIHVzZWQgdG8gdmFsaWRhdGUgdGhlIHJlc291cmNlIGxlbmd0aCBmaWVsZC4KKyAqIFRoZSBsZW5ndGggb2YgZml4ZWQtbGVuZ3RoIHR5cGVzIG11c3QgbWF0Y2ggZXhhY3RseSwgdmFyaWFibGUKKyAqIGxlbmd0aHMgbXVzdCBtZWV0IHRoZSBtaW5pbXVtIHJlcXVpcmVkIGxlbmd0aCwgZXRjLgorICogWmVybyBpbmRpY2F0ZXMgYSByZXNlcnZlZCAoYW5kIHRoZXJlZm9yZSBpbnZhbGlkKSByZXNvdXJjZSB0eXBlLgorICovCitzdGF0aWMgY29uc3QgdTggYWNwaV9nYmxfcmVzb3VyY2VfdHlwZXNbXSA9IHsKKwkvKiBTbWFsbCBkZXNjcmlwdG9ycyAqLworCisJMCwKKwkwLAorCTAsCisJMCwKKwlBQ1BJX1NNQUxMX1ZBUklBQkxFX0xFTkdUSCwKKwlBQ1BJX0ZJWEVEX0xFTkdUSCwKKwlBQ1BJX1NNQUxMX1ZBUklBQkxFX0xFTkdUSCwKKwlBQ1BJX0ZJWEVEX0xFTkdUSCwKKwlBQ1BJX0ZJWEVEX0xFTkdUSCwKKwlBQ1BJX0ZJWEVEX0xFTkdUSCwKKwkwLAorCTAsCisJMCwKKwkwLAorCUFDUElfVkFSSUFCTEVfTEVOR1RILAorCUFDUElfRklYRURfTEVOR1RILAorCisJLyogTGFyZ2UgZGVzY3JpcHRvcnMgKi8KKworCTAsCisJQUNQSV9GSVhFRF9MRU5HVEgsCisJQUNQSV9GSVhFRF9MRU5HVEgsCisJMCwKKwlBQ1BJX1ZBUklBQkxFX0xFTkdUSCwKKwlBQ1BJX0ZJWEVEX0xFTkdUSCwKKwlBQ1BJX0ZJWEVEX0xFTkdUSCwKKwlBQ1BJX1ZBUklBQkxFX0xFTkdUSCwKKwlBQ1BJX1ZBUklBQkxFX0xFTkdUSCwKKwlBQ1BJX1ZBUklBQkxFX0xFTkdUSCwKKwlBQ1BJX1ZBUklBQkxFX0xFTkdUSCwKKwlBQ1BJX0ZJWEVEX0xFTkdUSAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF92YWxpZGF0ZV9yZXNvdXJjZQorICoKKyAqIFBBUkFNRVRFUlM6ICBBbWwgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByYXcgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IKKyAqICAgICAgICAgICAgICByZXR1cm5faW5kZXggICAgLSBXaGVyZSB0aGUgcmVzb3VyY2UgaW5kZXggaXMgcmV0dXJuZWQuIE5VTEwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgaW5kZXggaXMgbm90IHJlcXVpcmVkLgorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMsIGFuZCBvcHRpb25hbGx5IHRoZSBJbmRleCBpbnRvIHRoZSBnbG9iYWwgcmVzb3VyY2UgdGFibGVzCisgKgorICogREVTQ1JJUFRJT046IFZhbGlkYXRlIGFuIEFNTCByZXNvdXJjZSBkZXNjcmlwdG9yIGJ5IGNoZWNraW5nIHRoZSBSZXNvdXJjZQorICogICAgICAgICAgICAgIFR5cGUgYW5kIFJlc291cmNlIExlbmd0aC4gUmV0dXJucyBhbiBpbmRleCBpbnRvIHRoZSBnbG9iYWwKKyAqICAgICAgICAgICAgICByZXNvdXJjZSBpbmZvcm1hdGlvbi9kaXNwYXRjaCB0YWJsZXMgZm9yIGxhdGVyIHVzZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX3V0X3ZhbGlkYXRlX3Jlc291cmNlKHZvaWQgKmFtbCwgdTggKiByZXR1cm5faW5kZXgpCit7CisJdTggcmVzb3VyY2VfdHlwZTsKKwl1OCByZXNvdXJjZV9pbmRleDsKKwlhY3BpX3JzX2xlbmd0aCByZXNvdXJjZV9sZW5ndGg7CisJYWNwaV9yc19sZW5ndGggbWluaW11bV9yZXNvdXJjZV9sZW5ndGg7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwkvKgorCSAqIDEpIFZhbGlkYXRlIHRoZSByZXNvdXJjZV90eXBlIGZpZWxkIChCeXRlIDApCisJICovCisJcmVzb3VyY2VfdHlwZSA9IEFDUElfR0VUOChhbWwpOworCisJLyoKKwkgKiBCeXRlIDAgY29udGFpbnMgdGhlIGRlc2NyaXB0b3IgbmFtZSAoUmVzb3VyY2UgVHlwZSkKKwkgKiBFeGFtaW5lIHRoZSBsYXJnZS9zbWFsbCBiaXQgaW4gdGhlIHJlc291cmNlIGhlYWRlcgorCSAqLworCWlmIChyZXNvdXJjZV90eXBlICYgQUNQSV9SRVNPVVJDRV9OQU1FX0xBUkdFKSB7CisJCS8qIFZlcmlmeSB0aGUgbGFyZ2UgcmVzb3VyY2UgdHlwZSAobmFtZSkgYWdhaW5zdCB0aGUgbWF4ICovCisKKwkJaWYgKHJlc291cmNlX3R5cGUgPiBBQ1BJX1JFU09VUkNFX05BTUVfTEFSR0VfTUFYKSB7CisJCQlyZXR1cm4gKEFFX0FNTF9JTlZBTElEX1JFU09VUkNFX1RZUEUpOworCQl9CisKKwkJLyoKKwkJICogTGFyZ2UgUmVzb3VyY2UgVHlwZSAtLSBiaXRzIDY6MCBjb250YWluIHRoZSBuYW1lCisJCSAqIFRyYW5zbGF0ZSByYW5nZSAweDgwLTB4OEIgdG8gaW5kZXggcmFuZ2UgMHgxMC0weDFCCisJCSAqLworCQlyZXNvdXJjZV9pbmRleCA9ICh1OCkgKHJlc291cmNlX3R5cGUgLSAweDcwKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTbWFsbCBSZXNvdXJjZSBUeXBlIC0tIGJpdHMgNjozIGNvbnRhaW4gdGhlIG5hbWUKKwkJICogU2hpZnQgcmFuZ2UgdG8gaW5kZXggcmFuZ2UgMHgwMC0weDBGCisJCSAqLworCQlyZXNvdXJjZV9pbmRleCA9ICh1OCkKKwkJICAgICgocmVzb3VyY2VfdHlwZSAmIEFDUElfUkVTT1VSQ0VfTkFNRV9TTUFMTF9NQVNLKSA+PiAzKTsKKwl9CisKKwkvKiBDaGVjayB2YWxpZGl0eSBvZiB0aGUgcmVzb3VyY2UgdHlwZSwgemVybyBpbmRpY2F0ZXMgbmFtZSBpcyBpbnZhbGlkICovCisKKwlpZiAoIWFjcGlfZ2JsX3Jlc291cmNlX3R5cGVzW3Jlc291cmNlX2luZGV4XSkgeworCQlyZXR1cm4gKEFFX0FNTF9JTlZBTElEX1JFU09VUkNFX1RZUEUpOworCX0KKworCS8qCisJICogMikgVmFsaWRhdGUgdGhlIHJlc291cmNlX2xlbmd0aCBmaWVsZC4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGxlbmd0aAorCSAqICAgIGlzIGF0IGxlYXN0IHJlYXNvbmFibGUsIGFuZCBndWFyYW50ZWVzIHRoYXQgaXQgaXMgbm9uLXplcm8uCisJICovCisJcmVzb3VyY2VfbGVuZ3RoID0gYWNwaV91dF9nZXRfcmVzb3VyY2VfbGVuZ3RoKGFtbCk7CisJbWluaW11bV9yZXNvdXJjZV9sZW5ndGggPSBhY3BpX2dibF9yZXNvdXJjZV9hbWxfc2l6ZXNbcmVzb3VyY2VfaW5kZXhdOworCisJLyogVmFsaWRhdGUgYmFzZWQgdXBvbiB0aGUgdHlwZSBvZiByZXNvdXJjZSAtIGZpeGVkIGxlbmd0aCBvciB2YXJpYWJsZSAqLworCisJc3dpdGNoIChhY3BpX2dibF9yZXNvdXJjZV90eXBlc1tyZXNvdXJjZV9pbmRleF0pIHsKKwljYXNlIEFDUElfRklYRURfTEVOR1RIOgorCisJCS8qIEZpeGVkIGxlbmd0aCByZXNvdXJjZSwgbGVuZ3RoIG11c3QgbWF0Y2ggZXhhY3RseSAqLworCisJCWlmIChyZXNvdXJjZV9sZW5ndGggIT0gbWluaW11bV9yZXNvdXJjZV9sZW5ndGgpIHsKKwkJCXJldHVybiAoQUVfQU1MX0JBRF9SRVNPVVJDRV9MRU5HVEgpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1ZBUklBQkxFX0xFTkdUSDoKKworCQkvKiBWYXJpYWJsZSBsZW5ndGggcmVzb3VyY2UsIGxlbmd0aCBtdXN0IGJlIGF0IGxlYXN0IHRoZSBtaW5pbXVtICovCisKKwkJaWYgKHJlc291cmNlX2xlbmd0aCA8IG1pbmltdW1fcmVzb3VyY2VfbGVuZ3RoKSB7CisJCQlyZXR1cm4gKEFFX0FNTF9CQURfUkVTT1VSQ0VfTEVOR1RIKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9TTUFMTF9WQVJJQUJMRV9MRU5HVEg6CisKKwkJLyogU21hbGwgdmFyaWFibGUgbGVuZ3RoIHJlc291cmNlLCBsZW5ndGggY2FuIGJlIChNaW4pIG9yIChNaW4tMSkgKi8KKworCQlpZiAoKHJlc291cmNlX2xlbmd0aCA+IG1pbmltdW1fcmVzb3VyY2VfbGVuZ3RoKSB8fAorCQkgICAgKHJlc291cmNlX2xlbmd0aCA8IChtaW5pbXVtX3Jlc291cmNlX2xlbmd0aCAtIDEpKSkgeworCQkJcmV0dXJuIChBRV9BTUxfQkFEX1JFU09VUkNFX0xFTkdUSCk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCisJCS8qIFNob3VsZG4ndCBoYXBwZW4gKGJlY2F1c2Ugb2YgdmFsaWRhdGlvbiBlYXJsaWVyKSwgYnV0IGJlIHN1cmUgKi8KKworCQlyZXR1cm4gKEFFX0FNTF9JTlZBTElEX1JFU09VUkNFX1RZUEUpOworCX0KKworCS8qIE9wdGlvbmFsbHkgcmV0dXJuIHRoZSByZXNvdXJjZSB0YWJsZSBpbmRleCAqLworCisJaWYgKHJldHVybl9pbmRleCkgeworCQkqcmV0dXJuX2luZGV4ID0gcmVzb3VyY2VfaW5kZXg7CisJfQorCisJcmV0dXJuIChBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X3Jlc291cmNlX3R5cGUKKyAqCisgKiBQQVJBTUVURVJTOiAgQW1sICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmF3IEFNTCByZXNvdXJjZSBkZXNjcmlwdG9yCisgKgorICogUkVUVVJOOiAgICAgIFRoZSBSZXNvdXJjZSBUeXBlIHdpdGggbm8gZXh0cmFuZW91cyBiaXRzIChleGNlcHQgdGhlCisgKiAgICAgICAgICAgICAgTGFyZ2UvU21hbGwgZGVzY3JpcHRvciBiaXQgLS0gdGhpcyBpcyBsZWZ0IGFsb25lKQorICoKKyAqIERFU0NSSVBUSU9OOiBFeHRyYWN0IHRoZSBSZXNvdXJjZSBUeXBlL05hbWUgZnJvbSB0aGUgZmlyc3QgYnl0ZSBvZgorICogICAgICAgICAgICAgIGEgcmVzb3VyY2UgZGVzY3JpcHRvci4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1OCBhY3BpX3V0X2dldF9yZXNvdXJjZV90eXBlKHZvaWQgKmFtbCkKK3sKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwkvKgorCSAqIEJ5dGUgMCBjb250YWlucyB0aGUgZGVzY3JpcHRvciBuYW1lIChSZXNvdXJjZSBUeXBlKQorCSAqIEV4YW1pbmUgdGhlIGxhcmdlL3NtYWxsIGJpdCBpbiB0aGUgcmVzb3VyY2UgaGVhZGVyCisJICovCisJaWYgKEFDUElfR0VUOChhbWwpICYgQUNQSV9SRVNPVVJDRV9OQU1FX0xBUkdFKSB7CisJCS8qIExhcmdlIFJlc291cmNlIFR5cGUgLS0gYml0cyA2OjAgY29udGFpbiB0aGUgbmFtZSAqLworCisJCXJldHVybiAoQUNQSV9HRVQ4KGFtbCkpOworCX0gZWxzZSB7CisJCS8qIFNtYWxsIFJlc291cmNlIFR5cGUgLS0gYml0cyA2OjMgY29udGFpbiB0aGUgbmFtZSAqLworCisJCXJldHVybiAoKHU4KSAoQUNQSV9HRVQ4KGFtbCkgJiBBQ1BJX1JFU09VUkNFX05BTUVfU01BTExfTUFTSykpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfcmVzb3VyY2VfbGVuZ3RoCisgKgorICogUEFSQU1FVEVSUzogIEFtbCAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJhdyBBTUwgcmVzb3VyY2UgZGVzY3JpcHRvcgorICoKKyAqIFJFVFVSTjogICAgICBCeXRlIExlbmd0aAorICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgdGhlICJSZXNvdXJjZSBMZW5ndGgiIG9mIGEgcmF3IEFNTCBkZXNjcmlwdG9yLiBCeQorICogICAgICAgICAgICAgIGRlZmluaXRpb24sIHRoaXMgZG9lcyBub3QgaW5jbHVkZSB0aGUgc2l6ZSBvZiB0aGUgZGVzY3JpcHRvcgorICogICAgICAgICAgICAgIGhlYWRlciBvciB0aGUgbGVuZ3RoIGZpZWxkIGl0c2VsZi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1MTYgYWNwaV91dF9nZXRfcmVzb3VyY2VfbGVuZ3RoKHZvaWQgKmFtbCkKK3sKKwlhY3BpX3JzX2xlbmd0aCByZXNvdXJjZV9sZW5ndGg7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwkvKgorCSAqIEJ5dGUgMCBjb250YWlucyB0aGUgZGVzY3JpcHRvciBuYW1lIChSZXNvdXJjZSBUeXBlKQorCSAqIEV4YW1pbmUgdGhlIGxhcmdlL3NtYWxsIGJpdCBpbiB0aGUgcmVzb3VyY2UgaGVhZGVyCisJICovCisJaWYgKEFDUElfR0VUOChhbWwpICYgQUNQSV9SRVNPVVJDRV9OQU1FX0xBUkdFKSB7CisJCS8qIExhcmdlIFJlc291cmNlIHR5cGUgLS0gYnl0ZXMgMS0yIGNvbnRhaW4gdGhlIDE2LWJpdCBsZW5ndGggKi8KKworCQlBQ1BJX01PVkVfMTZfVE9fMTYoJnJlc291cmNlX2xlbmd0aCwgQUNQSV9BRERfUFRSKHU4LCBhbWwsIDEpKTsKKworCX0gZWxzZSB7CisJCS8qIFNtYWxsIFJlc291cmNlIHR5cGUgLS0gYml0cyAyOjAgb2YgYnl0ZSAwIGNvbnRhaW4gdGhlIGxlbmd0aCAqLworCisJCXJlc291cmNlX2xlbmd0aCA9ICh1MTYpIChBQ1BJX0dFVDgoYW1sKSAmCisJCQkJCSBBQ1BJX1JFU09VUkNFX05BTUVfU01BTExfTEVOR1RIX01BU0spOworCX0KKworCXJldHVybiAocmVzb3VyY2VfbGVuZ3RoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfcmVzb3VyY2VfaGVhZGVyX2xlbmd0aAorICoKKyAqIFBBUkFNRVRFUlM6ICBBbWwgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByYXcgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IKKyAqCisgKiBSRVRVUk46ICAgICAgTGVuZ3RoIG9mIHRoZSBBTUwgaGVhZGVyIChkZXBlbmRzIG9uIGxhcmdlL3NtYWxsIGRlc2NyaXB0b3IpCisgKgorICogREVTQ1JJUFRJT046IEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBoZWFkZXIgZm9yIHRoaXMgcmVzb3VyY2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTggYWNwaV91dF9nZXRfcmVzb3VyY2VfaGVhZGVyX2xlbmd0aCh2b2lkICphbWwpCit7CisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJLyogRXhhbWluZSB0aGUgbGFyZ2Uvc21hbGwgYml0IGluIHRoZSByZXNvdXJjZSBoZWFkZXIgKi8KKworCWlmIChBQ1BJX0dFVDgoYW1sKSAmIEFDUElfUkVTT1VSQ0VfTkFNRV9MQVJHRSkgeworCQlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2xhcmdlX2hlYWRlcikpOworCX0gZWxzZSB7CisJCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2Vfc21hbGxfaGVhZGVyKSk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX2xlbmd0aAorICoKKyAqIFBBUkFNRVRFUlM6ICBBbWwgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByYXcgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IKKyAqCisgKiBSRVRVUk46ICAgICAgQnl0ZSBsZW5ndGgKKyAqCisgKiBERVNDUklQVElPTjogR2V0IHRoZSB0b3RhbCBieXRlIGxlbmd0aCBvZiBhIHJhdyBBTUwgZGVzY3JpcHRvciwgaW5jbHVkaW5nIHRoZQorICogICAgICAgICAgICAgIGxlbmd0aCBvZiB0aGUgZGVzY3JpcHRvciBoZWFkZXIgYW5kIHRoZSBsZW5ndGggZmllbGQgaXRzZWxmLgorICogICAgICAgICAgICAgIFVzZWQgdG8gd2FsayBkZXNjcmlwdG9yIGxpc3RzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3UzMiBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX2xlbmd0aCh2b2lkICphbWwpCit7CisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJLyoKKwkgKiBHZXQgdGhlIFJlc291cmNlIExlbmd0aCAoZG9lcyBub3QgaW5jbHVkZSBoZWFkZXIgbGVuZ3RoKSBhbmQgYWRkCisJICogdGhlIGhlYWRlciBsZW5ndGggKGRlcGVuZHMgb24gaWYgdGhpcyBpcyBhIHNtYWxsIG9yIGxhcmdlIHJlc291cmNlKQorCSAqLworCXJldHVybiAoYWNwaV91dF9nZXRfcmVzb3VyY2VfbGVuZ3RoKGFtbCkgKworCQlhY3BpX3V0X2dldF9yZXNvdXJjZV9oZWFkZXJfbGVuZ3RoKGFtbCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9yZXNvdXJjZV9lbmRfdGFnCisgKgorICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAtIFRoZSByZXNvdXJjZSB0ZW1wbGF0ZSBidWZmZXIgb2JqZWN0CisgKiAgICAgICAgICAgICAgZW5kX3RhZyAgICAgICAgIC0gV2hlcmUgdGhlIHBvaW50ZXIgdG8gdGhlIGVuZF90YWcgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzLCBwb2ludGVyIHRvIHRoZSBlbmQgdGFnCisgKgorICogREVTQ1JJUFRJT046IEZpbmQgdGhlIGVuZF90YWcgcmVzb3VyY2UgZGVzY3JpcHRvciBpbiBhbiBBTUwgcmVzb3VyY2UgdGVtcGxhdGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV91dF9nZXRfcmVzb3VyY2VfZW5kX3RhZyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICogb2JqX2Rlc2MsCisJCQkgICAgIHU4ICoqIGVuZF90YWcpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXU4ICphbWw7CisJdTggKmVuZF9hbWw7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9nZXRfcmVzb3VyY2VfZW5kX3RhZyIpOworCisJLyogR2V0IHN0YXJ0IGFuZCBlbmQgcG9pbnRlcnMgKi8KKworCWFtbCA9IG9ial9kZXNjLT5idWZmZXIucG9pbnRlcjsKKwllbmRfYW1sID0gYW1sICsgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGg7CisKKwkvKiBXYWxrIHRoZSByZXNvdXJjZSB0ZW1wbGF0ZSwgb25lIGRlc2NyaXB0b3IgcGVyIGl0ZXJhdGlvbiAqLworCisJd2hpbGUgKGFtbCA8IGVuZF9hbWwpIHsKKwkJLyogVmFsaWRhdGUgdGhlIFJlc291cmNlIFR5cGUgYW5kIFJlc291cmNlIExlbmd0aCAqLworCisJCXN0YXR1cyA9IGFjcGlfdXRfdmFsaWRhdGVfcmVzb3VyY2UoYW1sLCBOVUxMKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCisJCS8qIGVuZF90YWcgcmVzb3VyY2UgaW5kaWNhdGVzIHRoZSBlbmQgb2YgdGhlIHJlc291cmNlIHRlbXBsYXRlICovCisKKwkJaWYgKGFjcGlfdXRfZ2V0X3Jlc291cmNlX3R5cGUoYW1sKSA9PQorCQkgICAgQUNQSV9SRVNPVVJDRV9OQU1FX0VORF9UQUcpIHsKKwkJCS8qIFJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgZW5kX3RhZyAqLworCisJCQkqZW5kX3RhZyA9IGFtbDsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJCX0KKworCQkvKgorCQkgKiBQb2ludCB0byB0aGUgbmV4dCByZXNvdXJjZSBkZXNjcmlwdG9yIGluIHRoZSBBTUwgYnVmZmVyLiBUaGUKKwkJICogZGVzY3JpcHRvciBsZW5ndGggaXMgZ3VhcmFudGVlZCB0byBiZSBub24temVybyBieSByZXNvdXJjZQorCQkgKiB2YWxpZGF0aW9uIGFib3ZlLgorCQkgKi8KKwkJYW1sICs9IGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbGVuZ3RoKGFtbCk7CisJfQorCisJLyogRGlkIG5vdCBmaW5kIGFuIGVuZF90YWcgcmVzb3VyY2UgZGVzY3JpcHRvciAqLworCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19SRVNPVVJDRV9FTkRfVEFHKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRzdGF0ZS5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHN0YXRlLmMKaW5kZXggYzFjYjI3NS4uNGIxMzRhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHN0YXRlLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHN0YXRlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNjMsNyArNjMsNyBAQAogYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlX2FuZF9wdXNoKHZvaWQgKmludGVybmFsX29iamVjdCwKIAkJCQkgIHZvaWQgKmV4dGVybmFsX29iamVjdCwKIAkJCQkgIHUxNiBpbmRleCwKLQkJCQkgIHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqKiBzdGF0ZV9saXN0KQorCQkJCSAgdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoqc3RhdGVfbGlzdCkKIHsKIAl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0eGZhY2UuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXR4ZmFjZS5jCmluZGV4IGYwNmJkNWUuLmI0YmM5NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXR4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXR4ZmFjZS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNzUsNyArNzUsNyBAQAogCiAJc3RhdHVzID0gYWNwaV9vc19pbml0aWFsaXplKCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SKCgiT1NEIGZhaWxlZCB0byBpbml0aWFsaXplLCAlc1xuIiwKKwkJQUNQSV9SRVBPUlRfRVJST1IoKCJPU0wgZmFpbGVkIHRvIGluaXRpYWxpemUsICVzXG4iLAogCQkJCSAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KQEAgLTE1NCw4ICsxNTQsNyBAQAogCiAJCXN0YXR1cyA9IGFjcGlfZW5hYmxlKCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAotCQkJCQkgICJhY3BpX2VuYWJsZSBmYWlsZWQuXG4iKSk7CisJCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgiYWNwaV9lbmFibGUgZmFpbGVkXG4iKSk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQogCX0KQEAgLTE3OCwxMCArMTc3LDE0IEBACiAJLyoKIAkgKiBJbml0aWFsaXplIEFDUEkgRXZlbnQgaGFuZGxpbmcgKEZpeGVkIGFuZCBHZW5lcmFsIFB1cnBvc2UpCiAJICoKLQkgKiBOT1RFOiBXZSBtdXN0IGhhdmUgdGhlIGhhcmR3YXJlIEFORCBldmVudHMgaW5pdGlhbGl6ZWQgYmVmb3JlIHdlIGNhbgotCSAqIGV4ZWN1dGUgQU5ZIGNvbnRyb2wgbWV0aG9kcyBTQUZFTFkuICBBbnkgY29udHJvbCBtZXRob2QgY2FuIHJlcXVpcmUKLQkgKiBBQ1BJIGhhcmR3YXJlIHN1cHBvcnQsIHNvIHRoZSBoYXJkd2FyZSBNVVNUIGJlIGluaXRpYWxpemVkIGJlZm9yZQotCSAqIGV4ZWN1dGlvbiEKKwkgKiBOb3RlMTogV2UgbXVzdCBoYXZlIHRoZSBoYXJkd2FyZSBhbmQgZXZlbnRzIGluaXRpYWxpemVkIGJlZm9yZSB3ZSBjYW4KKwkgKiBleGVjdXRlIGFueSBjb250cm9sIG1ldGhvZHMgc2FmZWx5LiBBbnkgY29udHJvbCBtZXRob2QgY2FuIHJlcXVpcmUKKwkgKiBBQ1BJIGhhcmR3YXJlIHN1cHBvcnQsIHNvIHRoZSBoYXJkd2FyZSBtdXN0IGJlIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZQorCSAqIGFueSBtZXRob2QgZXhlY3V0aW9uIQorCSAqCisJICogTm90ZTI6IEZpeGVkIGV2ZW50cyBhcmUgaW5pdGlhbGl6ZWQgYW5kIGVuYWJsZWQgaGVyZS4gR1BFcyBhcmUKKwkgKiBpbml0aWFsaXplZCwgYnV0IGNhbm5vdCBiZSBlbmFibGVkIHVudGlsIGFmdGVyIHRoZSBoYXJkd2FyZSBpcworCSAqIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgKFNDSSBhbmQgZ2xvYmFsX2xvY2sgYWN0aXZhdGVkKQogCSAqLwogCWlmICghKGZsYWdzICYgQUNQSV9OT19FVkVOVF9JTklUKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCkBAIC0xOTMsOCArMTk2LDEwIEBACiAJCX0KIAl9CiAKLQkvKiBJbnN0YWxsIHRoZSBTQ0kgaGFuZGxlciBhbmQgR2xvYmFsIExvY2sgaGFuZGxlciAqLwotCisJLyoKKwkgKiBJbnN0YWxsIHRoZSBTQ0kgaGFuZGxlciBhbmQgR2xvYmFsIExvY2sgaGFuZGxlci4gVGhpcyBjb21wbGV0ZXMgdGhlCisJICogaGFyZHdhcmUgaW5pdGlhbGl6YXRpb24uCisJICovCiAJaWYgKCEoZmxhZ3MgJiBBQ1BJX05PX0hBTkRMRVJfSU5JVCkpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAogCQkJCSAgIltJbml0XSBJbnN0YWxsaW5nIFNDSS9HTCBoYW5kbGVyc1xuIikpOwpAQCAtMjA1LDYgKzIxMCwyNCBAQAogCQl9CiAJfQogCisJLyoKKwkgKiBDb21wbGV0ZSB0aGUgR1BFIGluaXRpYWxpemF0aW9uIGZvciB0aGUgR1BFIGJsb2NrcyBkZWZpbmVkIGluIHRoZSBGQURUCisJICogKEdQRSBibG9jayAwIGFuZCAxKS4KKwkgKgorCSAqIE5vdGUxOiBUaGlzIGlzIHdoZXJlIHRoZSBfUFJXIG1ldGhvZHMgYXJlIGV4ZWN1dGVkIGZvciB0aGUgR1BFcy4gVGhlc2UKKwkgKiBtZXRob2RzIGNhbiBvbmx5IGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBTQ0kgYW5kIEdsb2JhbCBMb2NrIGhhbmRsZXJzIGFyZQorCSAqIGluc3RhbGxlZCBhbmQgaW5pdGlhbGl6ZWQuCisJICoKKwkgKiBOb3RlMjogQ3VycmVudGx5LCB0aGVyZSBzZWVtcyB0byBiZSBubyBuZWVkIHRvIHJ1biB0aGUgX1JFRyBtZXRob2RzCisJICogYmVmb3JlIGV4ZWN1dGlvbiBvZiB0aGUgX1BSVyBtZXRob2RzIGFuZCBlbmFibGluZyBvZiB0aGUgR1BFcy4KKwkgKi8KKwlpZiAoIShmbGFncyAmIEFDUElfTk9fRVZFTlRfSU5JVCkpIHsKKwkJc3RhdHVzID0gYWNwaV9ldl9pbnN0YWxsX2ZhZHRfZ3BlcygpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybiAoc3RhdHVzKTsKKwkJfQorCX0KKwogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCkBAIC0yMzAsOSArMjUzLDkgQEAKIAkvKgogCSAqIFJ1biBhbGwgX1JFRyBtZXRob2RzCiAJICoKLQkgKiBOT1RFOiBBbnkgb2JqZWN0cyBhY2Nlc3NlZAotCSAqIGJ5IHRoZSBfUkVHIG1ldGhvZHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkLCBldmVuIGlmIHRoZXkKLQkgKiBjb250YWluIGV4ZWN1dGFibGUgQU1MIChzZWUgY2FsbCB0byBhY3BpX25zX2luaXRpYWxpemVfb2JqZWN0cyBiZWxvdykuCisJICogTm90ZTogQW55IG9iamVjdHMgYWNjZXNzZWQgYnkgdGhlIF9SRUcgbWV0aG9kcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKKwkgKiBpbml0aWFsaXplZCwgZXZlbiBpZiB0aGV5IGNvbnRhaW4gZXhlY3V0YWJsZSBBTUwgKHNlZSB0aGUgY2FsbCB0bworCSAqIGFjcGlfbnNfaW5pdGlhbGl6ZV9vYmplY3RzIGJlbG93KS4KIAkgKi8KIAlpZiAoIShmbGFncyAmIEFDUElfTk9fQUREUkVTU19TUEFDRV9JTklUKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCkBAIC0yNDUsOSArMjY4LDkgQEAKIAl9CiAKIAkvKgotCSAqIEluaXRpYWxpemUgdGhlIG9iamVjdHMgdGhhdCByZW1haW4gdW5pbml0aWFsaXplZC4gIFRoaXMKLQkgKiBydW5zIHRoZSBleGVjdXRhYmxlIEFNTCB0aGF0IG1heSBiZSBwYXJ0IG9mIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGVzZQotCSAqIG9iamVjdHM6IG9wZXJhdGlvbl9yZWdpb25zLCBidWZmZXJfZmllbGRzLCBCdWZmZXJzLCBhbmQgUGFja2FnZXMuCisJICogSW5pdGlhbGl6ZSB0aGUgb2JqZWN0cyB0aGF0IHJlbWFpbiB1bmluaXRpYWxpemVkLiBUaGlzIHJ1bnMgdGhlCisJICogZXhlY3V0YWJsZSBBTUwgdGhhdCBtYXkgYmUgcGFydCBvZiB0aGUgZGVjbGFyYXRpb24gb2YgdGhlc2Ugb2JqZWN0czoKKwkgKiBvcGVyYXRpb25fcmVnaW9ucywgYnVmZmVyX2ZpZWxkcywgQnVmZmVycywgYW5kIFBhY2thZ2VzLgogCSAqLwogCWlmICghKGZsYWdzICYgQUNQSV9OT19PQkpFQ1RfSU5JVCkpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLApAQCAtMjYwLDggKzI4Myw4IEBACiAJfQogCiAJLyoKLQkgKiBJbml0aWFsaXplIGFsbCBkZXZpY2Ugb2JqZWN0cyBpbiB0aGUgbmFtZXNwYWNlCi0JICogVGhpcyBydW5zIHRoZSBfU1RBIGFuZCBfSU5JIG1ldGhvZHMuCisJICogSW5pdGlhbGl6ZSBhbGwgZGV2aWNlIG9iamVjdHMgaW4gdGhlIG5hbWVzcGFjZS4gVGhpcyBydW5zIHRoZSBkZXZpY2UKKwkgKiBfU1RBIGFuZCBfSU5JIG1ldGhvZHMuCiAJICovCiAJaWYgKCEoZmxhZ3MgJiBBQ1BJX05PX0RFVklDRV9JTklUKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdmlkZW8uYyBiL2RyaXZlcnMvYWNwaS92aWRlby5jCmluZGV4IGQxMDY2OGYuLmJkNDg4NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS92aWRlby5jCisrKyBiL2RyaXZlcnMvYWNwaS92aWRlby5jCkBAIC05MjAsOCArOTIwLDggQEAKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKIAkJCQkgICJVbmFibGUgdG8gY3JlYXRlICdzdGF0ZScgZnMgZW50cnlcbiIpKTsKIAllbHNlIHsKKwkJYWNwaV92aWRlb19kZXZpY2Vfc3RhdGVfZm9wcy53cml0ZSA9IGFjcGlfdmlkZW9fZGV2aWNlX3dyaXRlX3N0YXRlOwogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfdmlkZW9fZGV2aWNlX3N0YXRlX2ZvcHM7Ci0JCWVudHJ5LT5wcm9jX2ZvcHMtPndyaXRlID0gYWNwaV92aWRlb19kZXZpY2Vfd3JpdGVfc3RhdGU7CiAJCWVudHJ5LT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCQllbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKIAl9CkBAIC05MzQsOCArOTM0LDggQEAKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKIAkJCQkgICJVbmFibGUgdG8gY3JlYXRlICdicmlnaHRuZXNzJyBmcyBlbnRyeVxuIikpOwogCWVsc2UgeworCQlhY3BpX3ZpZGVvX2RldmljZV9icmlnaHRuZXNzX2ZvcHMud3JpdGUgPSBhY3BpX3ZpZGVvX2RldmljZV93cml0ZV9icmlnaHRuZXNzOwogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3NfZm9wczsKLQkJZW50cnktPnByb2NfZm9wcy0+d3JpdGUgPSBhY3BpX3ZpZGVvX2RldmljZV93cml0ZV9icmlnaHRuZXNzOwogCQllbnRyeS0+ZGF0YSA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAkJZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CiAJfQpAQCAtMTIzOSw4ICsxMjM5LDggQEAKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKIAkJCQkgICJVbmFibGUgdG8gY3JlYXRlICdQT1NUJyBmcyBlbnRyeVxuIikpOwogCWVsc2UgeworCQlhY3BpX3ZpZGVvX2J1c19QT1NUX2ZvcHMud3JpdGUgPSBhY3BpX3ZpZGVvX2J1c193cml0ZV9QT1NUOwogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfdmlkZW9fYnVzX1BPU1RfZm9wczsKLQkJZW50cnktPnByb2NfZm9wcy0+d3JpdGUgPSBhY3BpX3ZpZGVvX2J1c193cml0ZV9QT1NUOwogCQllbnRyeS0+ZGF0YSA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAkJZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CiAJfQpAQCAtMTI1Myw4ICsxMjUzLDggQEAKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKIAkJCQkgICJVbmFibGUgdG8gY3JlYXRlICdET1MnIGZzIGVudHJ5XG4iKSk7CiAJZWxzZSB7CisJCWFjcGlfdmlkZW9fYnVzX0RPU19mb3BzLndyaXRlID0gYWNwaV92aWRlb19idXNfd3JpdGVfRE9TOwogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfdmlkZW9fYnVzX0RPU19mb3BzOwotCQllbnRyeS0+cHJvY19mb3BzLT53cml0ZSA9IGFjcGlfdmlkZW9fYnVzX3dyaXRlX0RPUzsKIAkJZW50cnktPmRhdGEgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAJCWVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW1iYS9NYWtlZmlsZSBiL2RyaXZlcnMvYW1iYS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGZlNzQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hbWJhL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLXkJCSs9IGJ1cy5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW1iYS9idXMuYyBiL2RyaXZlcnMvYW1iYS9idXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODk4NTVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hbWJhL2J1cy5jCkBAIC0wLDAgKzEsMzU4IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL2NvbW1vbi9hbWJhLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KKworI2RlZmluZSB0b19hbWJhX2RldmljZShkKQljb250YWluZXJfb2YoZCwgc3RydWN0IGFtYmFfZGV2aWNlLCBkZXYpCisjZGVmaW5lIHRvX2FtYmFfZHJpdmVyKGQpCWNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgYW1iYV9kcml2ZXIsIGRydikKKworc3RhdGljIHN0cnVjdCBhbWJhX2lkICoKK2FtYmFfbG9va3VwKHN0cnVjdCBhbWJhX2lkICp0YWJsZSwgc3RydWN0IGFtYmFfZGV2aWNlICpkZXYpCit7CisJaW50IHJldCA9IDA7CisKKwl3aGlsZSAodGFibGUtPm1hc2spIHsKKwkJcmV0ID0gKGRldi0+cGVyaXBoaWQgJiB0YWJsZS0+bWFzaykgPT0gdGFibGUtPmlkOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCXRhYmxlKys7CisJfQorCisJcmV0dXJuIHJldCA/IHRhYmxlIDogTlVMTDsKK30KKworc3RhdGljIGludCBhbWJhX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwlzdHJ1Y3QgYW1iYV9kZXZpY2UgKnBjZGV2ID0gdG9fYW1iYV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgYW1iYV9kcml2ZXIgKnBjZHJ2ID0gdG9fYW1iYV9kcml2ZXIoZHJ2KTsKKworCXJldHVybiBhbWJhX2xvb2t1cChwY2Rydi0+aWRfdGFibGUsIHBjZGV2KSAhPSBOVUxMOworfQorCisjaWZkZWYgQ09ORklHX0hPVFBMVUcKK3N0YXRpYyBpbnQgYW1iYV91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICoqZW52cCwgaW50IG5yX2VudiwgY2hhciAqYnVmLCBpbnQgYnVmc3opCit7CisJc3RydWN0IGFtYmFfZGV2aWNlICpwY2RldiA9IHRvX2FtYmFfZGV2aWNlKGRldik7CisKKwlpZiAobnJfZW52IDwgMikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzbnByaW50ZihidWYsIGJ1ZnN6LCAiQU1CQV9JRD0lMDh4IiwgcGNkZXYtPnBlcmlwaGlkKTsKKwkqZW52cCsrID0gYnVmOworCSplbnZwKysgPSBOVUxMOworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgYW1iYV91ZXZlbnQgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgYW1iYV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBhbWJhX2RyaXZlciAqZHJ2ID0gdG9fYW1iYV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCWludCByZXQgPSAwOworCisJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+c3VzcGVuZCkKKwkJcmV0ID0gZHJ2LT5zdXNwZW5kKHRvX2FtYmFfZGV2aWNlKGRldiksIHN0YXRlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFtYmFfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYW1iYV9kcml2ZXIgKmRydiA9IHRvX2FtYmFfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkZXYtPmRyaXZlciAmJiBkcnYtPnJlc3VtZSkKKwkJcmV0ID0gZHJ2LT5yZXN1bWUodG9fYW1iYV9kZXZpY2UoZGV2KSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFByaW1lY2VsbHMgYXJlIHBhcnQgb2YgdGhlIEFkdmFuY2VkIE1pY3JvY29udHJvbGxlciBCdXMgQXJjaGl0ZWN0dXJlLAorICogc28gd2UgY2FsbCB0aGUgYnVzICJhbWJhIi4KKyAqLworc3RhdGljIHN0cnVjdCBidXNfdHlwZSBhbWJhX2J1c3R5cGUgPSB7CisJLm5hbWUJCT0gImFtYmEiLAorCS5tYXRjaAkJPSBhbWJhX21hdGNoLAorCS51ZXZlbnQJCT0gYW1iYV91ZXZlbnQsCisJLnN1c3BlbmQJPSBhbWJhX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhbWJhX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFtYmFfaW5pdCh2b2lkKQoreworCXJldHVybiBidXNfcmVnaXN0ZXIoJmFtYmFfYnVzdHlwZSk7Cit9CisKK3Bvc3Rjb3JlX2luaXRjYWxsKGFtYmFfaW5pdCk7CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGRldmljZSBtb2RlbCBjb252ZXJzaW9uIHZlbmVlcnM7IHRoZXkgY29udmVydCB0aGUKKyAqIGRldmljZSBtb2RlbCBzdHJ1Y3R1cmVzIHRvIG91ciBtb3JlIHNwZWNpZmljIHN0cnVjdHVyZXMuCisgKi8KK3N0YXRpYyBpbnQgYW1iYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFtYmFfZGV2aWNlICpwY2RldiA9IHRvX2FtYmFfZGV2aWNlKGRldik7CisJc3RydWN0IGFtYmFfZHJpdmVyICpwY2RydiA9IHRvX2FtYmFfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlzdHJ1Y3QgYW1iYV9pZCAqaWQ7CisKKwlpZCA9IGFtYmFfbG9va3VwKHBjZHJ2LT5pZF90YWJsZSwgcGNkZXYpOworCisJcmV0dXJuIHBjZHJ2LT5wcm9iZShwY2RldiwgaWQpOworfQorCitzdGF0aWMgaW50IGFtYmFfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYW1iYV9kcml2ZXIgKmRydiA9IHRvX2FtYmFfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlyZXR1cm4gZHJ2LT5yZW1vdmUodG9fYW1iYV9kZXZpY2UoZGV2KSk7Cit9CisKK3N0YXRpYyB2b2lkIGFtYmFfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhbWJhX2RyaXZlciAqZHJ2ID0gdG9fYW1iYV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCWRydi0+c2h1dGRvd24odG9fYW1iYV9kZXZpY2UoZGV2KSk7Cit9CisKKy8qKgorICoJYW1iYV9kcml2ZXJfcmVnaXN0ZXIgLSByZWdpc3RlciBhbiBBTUJBIGRldmljZSBkcml2ZXIKKyAqCUBkcnY6IGFtYmEgZGV2aWNlIGRyaXZlciBzdHJ1Y3R1cmUKKyAqCisgKglSZWdpc3RlciBhbiBBTUJBIGRldmljZSBkcml2ZXIgd2l0aCB0aGUgTGludXggZGV2aWNlIG1vZGVsCisgKgljb3JlLiAgSWYgZGV2aWNlcyBwcmUtZXhpc3QsIHRoZSBkcml2ZXJzIHByb2JlIGZ1bmN0aW9uIHdpbGwKKyAqCWJlIGNhbGxlZC4KKyAqLworaW50IGFtYmFfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBhbWJhX2RyaXZlciAqZHJ2KQoreworCWRydi0+ZHJ2LmJ1cyA9ICZhbWJhX2J1c3R5cGU7CisKKyNkZWZpbmUgU0VURk4oZm4pCWlmIChkcnYtPmZuKSBkcnYtPmRydi5mbiA9IGFtYmFfIyNmbgorCVNFVEZOKHByb2JlKTsKKwlTRVRGTihyZW1vdmUpOworCVNFVEZOKHNodXRkb3duKTsKKworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJ2KTsKK30KKworLyoqCisgKglhbWJhX2RyaXZlcl91bnJlZ2lzdGVyIC0gcmVtb3ZlIGFuIEFNQkEgZGV2aWNlIGRyaXZlcgorICoJQGRydjogQU1CQSBkZXZpY2UgZHJpdmVyIHN0cnVjdHVyZSB0byByZW1vdmUKKyAqCisgKglVbnJlZ2lzdGVyIGFuIEFNQkEgZGV2aWNlIGRyaXZlciBmcm9tIHRoZSBMaW51eCBkZXZpY2UKKyAqCW1vZGVsLiAgVGhlIGRldmljZSBtb2RlbCB3aWxsIGNhbGwgdGhlIGRyaXZlcnMgcmVtb3ZlIGZ1bmN0aW9uCisgKglmb3IgZWFjaCBkZXZpY2UgdGhlIGRldmljZSBkcml2ZXIgaXMgY3VycmVudGx5IGhhbmRsaW5nLgorICovCit2b2lkIGFtYmFfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IGFtYmFfZHJpdmVyICpkcnYpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+ZHJ2KTsKK30KKworCitzdGF0aWMgdm9pZCBhbWJhX2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYW1iYV9kZXZpY2UgKmQgPSB0b19hbWJhX2RldmljZShkZXYpOworCisJaWYgKGQtPnJlcy5wYXJlbnQpCisJCXJlbGVhc2VfcmVzb3VyY2UoJmQtPnJlcyk7CisJa2ZyZWUoZCk7Cit9CisKKyNkZWZpbmUgYW1iYV9hdHRyKG5hbWUsZm10LGFyZy4uLikJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI25hbWUoc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJXAorCXN0cnVjdCBhbWJhX2RldmljZSAqZGV2ID0gdG9fYW1iYV9kZXZpY2UoX2Rldik7CQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCBmbXQsIGFyZyk7CQkJCVwKK30JCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93XyMjbmFtZSwgTlVMTCkKKworYW1iYV9hdHRyKGlkLCAiJTA4eFxuIiwgZGV2LT5wZXJpcGhpZCk7CithbWJhX2F0dHIoaXJxMCwgIiV1XG4iLCBkZXYtPmlycVswXSk7CithbWJhX2F0dHIoaXJxMSwgIiV1XG4iLCBkZXYtPmlycVsxXSk7CithbWJhX2F0dHIocmVzb3VyY2UsICJcdCUwOGx4XHQlMDhseFx0JTA4bHhcbiIsCisJICBkZXYtPnJlcy5zdGFydCwgZGV2LT5yZXMuZW5kLCBkZXYtPnJlcy5mbGFncyk7CisKKy8qKgorICoJYW1iYV9kZXZpY2VfcmVnaXN0ZXIgLSByZWdpc3RlciBhbiBBTUJBIGRldmljZQorICoJQGRldjogQU1CQSBkZXZpY2UgdG8gcmVnaXN0ZXIKKyAqCUBwYXJlbnQ6IHBhcmVudCBtZW1vcnkgcmVzb3VyY2UKKyAqCisgKglTZXR1cCB0aGUgQU1CQSBkZXZpY2UsIHJlYWRpbmcgdGhlIGNlbGwgSUQgaWYgcHJlc2VudC4KKyAqCUNsYWltIHRoZSByZXNvdXJjZSwgYW5kIHJlZ2lzdGVyIHRoZSBBTUJBIGRldmljZSB3aXRoCisgKgl0aGUgTGludXggZGV2aWNlIG1hbmFnZXIuCisgKi8KK2ludCBhbWJhX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgYW1iYV9kZXZpY2UgKmRldiwgc3RydWN0IHJlc291cmNlICpwYXJlbnQpCit7CisJdTMyIHBpZCwgY2lkOworCXZvaWQgX19pb21lbSAqdG1wOworCWludCBpLCByZXQ7CisKKwlkZXYtPmRldi5yZWxlYXNlID0gYW1iYV9kZXZpY2VfcmVsZWFzZTsKKwlkZXYtPmRldi5idXMgPSAmYW1iYV9idXN0eXBlOworCWRldi0+ZGV2LmRtYV9tYXNrID0gJmRldi0+ZG1hX21hc2s7CisJZGV2LT5yZXMubmFtZSA9IGRldi0+ZGV2LmJ1c19pZDsKKworCWlmICghZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2sgJiYgZGV2LT5kbWFfbWFzaykKKwkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiY29oZXJlbnQgZG1hIG1hc2sgaXMgdW5zZXRcbiIpOworCisJcmV0ID0gcmVxdWVzdF9yZXNvdXJjZShwYXJlbnQsICZkZXYtPnJlcyk7CisJaWYgKHJldCA9PSAwKSB7CisJCXRtcCA9IGlvcmVtYXAoZGV2LT5yZXMuc3RhcnQsIFNaXzRLKTsKKwkJaWYgKCF0bXApIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWZvciAocGlkID0gMCwgaSA9IDA7IGkgPCA0OyBpKyspCisJCQlwaWQgfD0gKHJlYWRsKHRtcCArIDB4ZmUwICsgNCAqIGkpICYgMjU1KSA8PCAoaSAqIDgpOworCQlmb3IgKGNpZCA9IDAsIGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJY2lkIHw9IChyZWFkbCh0bXAgKyAweGZmMCArIDQgKiBpKSAmIDI1NSkgPDwgKGkgKiA4KTsKKworCQlpb3VubWFwKHRtcCk7CisKKwkJaWYgKGNpZCA9PSAweGIxMDVmMDBkKQorCQkJZGV2LT5wZXJpcGhpZCA9IHBpZDsKKworCQlpZiAoZGV2LT5wZXJpcGhpZCkKKwkJCXJldCA9IGRldmljZV9yZWdpc3RlcigmZGV2LT5kZXYpOworCQllbHNlCisJCQlyZXQgPSAtRU5PREVWOworCisJCWlmIChyZXQgPT0gMCkgeworCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2lkKTsKKwkJCWlmIChkZXYtPmlycVswXSAhPSBOT19JUlEpCisJCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2lycTApOworCQkJaWYgKGRldi0+aXJxWzFdICE9IE5PX0lSUSkKKwkJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfaXJxMSk7CisJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfcmVzb3VyY2UpOworCQl9IGVsc2UgeworIG91dDoKKwkJCXJlbGVhc2VfcmVzb3VyY2UoJmRldi0+cmVzKTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqCWFtYmFfZGV2aWNlX3VucmVnaXN0ZXIgLSB1bnJlZ2lzdGVyIGFuIEFNQkEgZGV2aWNlCisgKglAZGV2OiBBTUJBIGRldmljZSB0byByZW1vdmUKKyAqCisgKglSZW1vdmUgdGhlIHNwZWNpZmllZCBBTUJBIGRldmljZSBmcm9tIHRoZSBMaW51eCBkZXZpY2UKKyAqCW1hbmFnZXIuICBBbGwgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0IHdpbGwgYmUKKyAqCWRlc3Ryb3llZCwgYW5kIGRldmljZSBkcml2ZXJzIG5vdGlmaWVkIHRoYXQgdGhlIGRldmljZSBoYXMKKyAqCWJlZW4gcmVtb3ZlZC4gIFRoZSBBTUJBIGRldmljZSdzIHJlc291cmNlcyBpbmNsdWRpbmcKKyAqCXRoZSBhbWJhX2RldmljZSBzdHJ1Y3R1cmUgd2lsbCBiZSBmcmVlZCBvbmNlIGFsbAorICoJcmVmZXJlbmNlcyB0byBpdCBoYXZlIGJlZW4gZHJvcHBlZC4KKyAqLwordm9pZCBhbWJhX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBhbWJhX2RldmljZSAqZGV2KQoreworCWRldmljZV91bnJlZ2lzdGVyKCZkZXYtPmRldik7Cit9CisKKworc3RydWN0IGZpbmRfZGF0YSB7CisJc3RydWN0IGFtYmFfZGV2aWNlICpkZXY7CisJc3RydWN0IGRldmljZSAqcGFyZW50OworCWNvbnN0IGNoYXIgKmJ1c2lkOworCXVuc2lnbmVkIGludCBpZDsKKwl1bnNpZ25lZCBpbnQgbWFzazsKK307CisKK3N0YXRpYyBpbnQgYW1iYV9maW5kX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZmluZF9kYXRhICpkID0gZGF0YTsKKwlzdHJ1Y3QgYW1iYV9kZXZpY2UgKnBjZGV2ID0gdG9fYW1iYV9kZXZpY2UoZGV2KTsKKwlpbnQgcjsKKworCXIgPSAocGNkZXYtPnBlcmlwaGlkICYgZC0+bWFzaykgPT0gZC0+aWQ7CisJaWYgKGQtPnBhcmVudCkKKwkJciAmPSBkLT5wYXJlbnQgPT0gZGV2LT5wYXJlbnQ7CisJaWYgKGQtPmJ1c2lkKQorCQlyICY9IHN0cmNtcChkZXYtPmJ1c19pZCwgZC0+YnVzaWQpID09IDA7CisKKwlpZiAocikgeworCQlnZXRfZGV2aWNlKGRldik7CisJCWQtPmRldiA9IHBjZGV2OworCX0KKworCXJldHVybiByOworfQorCisvKioKKyAqCWFtYmFfZmluZF9kZXZpY2UgLSBsb2NhdGUgYW4gQU1CQSBkZXZpY2UgZ2l2ZW4gYSBidXMgaWQKKyAqCUBidXNpZDogYnVzIGlkIGZvciBkZXZpY2UgKG9yIE5VTEwpCisgKglAcGFyZW50OiBwYXJlbnQgZGV2aWNlIChvciBOVUxMKQorICoJQGlkOiBwZXJpcGhlcmFsIElEIChvciAwKQorICoJQG1hc2s6IHBlcmlwaGVyYWwgSUQgbWFzayAob3IgMCkKKyAqCisgKglSZXR1cm4gdGhlIEFNQkEgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN1cHBsaWVkIHBhcmFtZXRlcnMuCisgKglJZiBubyBkZXZpY2UgbWF0Y2hlcywgcmV0dXJucyBOVUxMLgorICoKKyAqCU5PVEU6IFdoZW4gYSB2YWxpZCBkZXZpY2UgaXMgZm91bmQsIGl0cyByZWZjb3VudCBpcworICoJaW5jcmVtZW50ZWQsIGFuZCBtdXN0IGJlIGRlY3JlbWVudGVkIGJlZm9yZSB0aGUgcmV0dXJuZWQKKyAqCXJlZmVyZW5jZS4KKyAqLworc3RydWN0IGFtYmFfZGV2aWNlICoKK2FtYmFfZmluZF9kZXZpY2UoY29uc3QgY2hhciAqYnVzaWQsIHN0cnVjdCBkZXZpY2UgKnBhcmVudCwgdW5zaWduZWQgaW50IGlkLAorCQkgdW5zaWduZWQgaW50IG1hc2spCit7CisJc3RydWN0IGZpbmRfZGF0YSBkYXRhOworCisJZGF0YS5kZXYgPSBOVUxMOworCWRhdGEucGFyZW50ID0gcGFyZW50OworCWRhdGEuYnVzaWQgPSBidXNpZDsKKwlkYXRhLmlkID0gaWQ7CisJZGF0YS5tYXNrID0gbWFzazsKKworCWJ1c19mb3JfZWFjaF9kZXYoJmFtYmFfYnVzdHlwZSwgTlVMTCwgJmRhdGEsIGFtYmFfZmluZF9tYXRjaCk7CisKKwlyZXR1cm4gZGF0YS5kZXY7Cit9CisKKy8qKgorICoJYW1iYV9yZXF1ZXN0X3JlZ2lvbnMgLSByZXF1ZXN0IGFsbCBtZW0gcmVnaW9ucyBhc3NvY2lhdGVkIHdpdGggZGV2aWNlCisgKglAZGV2OiBhbWJhX2RldmljZSBzdHJ1Y3R1cmUgZm9yIGRldmljZQorICoJQG5hbWU6IG5hbWUsIG9yIE5VTEwgdG8gdXNlIGRyaXZlciBuYW1lCisgKi8KK2ludCBhbWJhX3JlcXVlc3RfcmVnaW9ucyhzdHJ1Y3QgYW1iYV9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghbmFtZSkKKwkJbmFtZSA9IGRldi0+ZGV2LmRyaXZlci0+bmFtZTsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGRldi0+cmVzLnN0YXJ0LCBTWl80SywgbmFtZSkpCisJCXJldCA9IC1FQlVTWTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICoJYW1iYV9yZWxlYXNlX3JlZ2lvbnMgLSByZWxlYXNlIG1lbSByZWdpb25zIGFzc29pY2F0ZWQgd2l0aCBkZXZpY2UKKyAqCUBkZXY6IGFtYmFfZGV2aWNlIHN0cnVjdHVyZSBmb3IgZGV2aWNlCisgKgorICoJUmVsZWFzZSByZWdpb25zIGNsYWltZWQgYnkgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYW1iYV9yZXF1ZXN0X3JlZ2lvbnMuCisgKi8KK3ZvaWQgYW1iYV9yZWxlYXNlX3JlZ2lvbnMoc3RydWN0IGFtYmFfZGV2aWNlICpkZXYpCit7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGRldi0+cmVzLnN0YXJ0LCBTWl80Syk7Cit9CisKK0VYUE9SVF9TWU1CT0woYW1iYV9kcml2ZXJfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChhbWJhX2RyaXZlcl91bnJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woYW1iYV9kZXZpY2VfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChhbWJhX2RldmljZV91bnJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woYW1iYV9maW5kX2RldmljZSk7CitFWFBPUlRfU1lNQk9MKGFtYmFfcmVxdWVzdF9yZWdpb25zKTsKK0VYUE9SVF9TWU1CT0woYW1iYV9yZWxlYXNlX3JlZ2lvbnMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vbmljc3Rhci5jIGIvZHJpdmVycy9hdG0vbmljc3Rhci5jCmluZGV4IGM1N2UyMGRjYi4uMDc0YWJjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vbmljc3Rhci5jCisrKyBiL2RyaXZlcnMvYXRtL25pY3N0YXIuYwpAQCAtMjEyNiw4ICsyMTI2LDcgQEAKIAogICAgaWYgKCFuc19yc3FlX3ZhbGlkKGNhcmQtPnJzcS5uZXh0KSkKICAgICAgIHJldHVybjsKLSAgIHdoaWxlIChuc19yc3FlX3ZhbGlkKGNhcmQtPnJzcS5uZXh0KSkKLSAgIHsKKyAgIGRvIHsKICAgICAgIGRlcXVldWVfcngoY2FyZCwgY2FyZC0+cnNxLm5leHQpOwogICAgICAgbnNfcnNxZV9pbml0KGNhcmQtPnJzcS5uZXh0KTsKICAgICAgIHByZXZpb3VzID0gY2FyZC0+cnNxLm5leHQ7CkBAIC0yMTM1LDcgKzIxMzQsNyBAQAogICAgICAgICAgY2FyZC0+cnNxLm5leHQgPSBjYXJkLT5yc3EuYmFzZTsKICAgICAgIGVsc2UKICAgICAgICAgIGNhcmQtPnJzcS5uZXh0Kys7Ci0gICB9CisgICB9IHdoaWxlIChuc19yc3FlX3ZhbGlkKGNhcmQtPnJzcS5uZXh0KSk7CiAgICB3cml0ZWwoKCgodTMyKSBwcmV2aW91cykgLSAoKHUzMikgY2FyZC0+cnNxLmJhc2UpKSwKICAgICAgICAgICBjYXJkLT5tZW1iYXNlICsgUlNRSCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS96YXRtLmMgYi9kcml2ZXJzL2F0bS96YXRtLmMKaW5kZXggNTU5NTllNC4uZjQ4NDc0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vemF0bS5jCisrKyBiL2RyaXZlcnMvYXRtL3phdG0uYwpAQCAtNjY5LDExICs2NjksMTMgQEAKIAkJdTMyICpwdXQ7CiAJCWludCBpOwogCi0JCWRzYyA9ICh1MzIgKikga21hbGxvYyh1UEQ5ODQwMV9UWFBEX1NJWkUqMisKLQkJICAgIHVQRDk4NDAxX1RYQkRfU0laRSpBVE1fU0tCKHNrYiktPmlvdmNudCxHRlBfQVRPTUlDKTsKKwkJZHNjID0ga21hbGxvYyh1UEQ5ODQwMV9UWFBEX1NJWkUgKiAyICsKKwkJCXVQRDk4NDAxX1RYQkRfU0laRSAqIEFUTV9TS0Ioc2tiKS0+aW92Y250LCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFkc2MpIHsKLQkJCWlmICh2Y2MtPnBvcCkgdmNjLT5wb3AodmNjLHNrYik7Ci0JCQllbHNlIGRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQlpZiAodmNjLT5wb3ApCisJCQkJdmNjLT5wb3AodmNjLCBza2IpOworCQkJZWxzZQorCQkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CiAJCQlyZXR1cm4gLUVBR0FJTjsKIAkJfQogCQkvKiBAQEAgc2hvdWxkIGNoZWNrIGFsaWdubWVudCAqLwpAQCAtNjgzLDcgKzY4NSw3IEBACiAJCSAgICAoQVRNX1NLQihza2IpLT5hdG1fb3B0aW9ucyAmIEFUTV9BVE1PUFRfQ0xQID8KIAkJICAgIHVQRDk4NDAxX0NMUE1fMSA6IHVQRDk4NDAxX0NMUE1fMCkpOwogCQlkc2NbMV0gPSAwOwotCQlkc2NbMl0gPSBBVE1fU0tCKHNrYiktPmlvdmNudCp1UEQ5ODQwMV9UWEJEX1NJWkU7CisJCWRzY1syXSA9IEFUTV9TS0Ioc2tiKS0+aW92Y250ICogdVBEOTg0MDFfVFhCRF9TSVpFOwogCQlkc2NbM10gPSB2aXJ0X3RvX2J1cyhwdXQpOwogCQlmb3IgKGkgPSAwOyBpIDwgQVRNX1NLQihza2IpLT5pb3ZjbnQ7IGkrKykgewogCQkJKnB1dCsrID0gKChzdHJ1Y3QgaW92ZWMgKikgc2tiLT5kYXRhKVtpXS5pb3ZfbGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NvcmUuYyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKaW5kZXggZmQ4MDU5OS4uNmIzNTViZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2NvcmUuYworKysgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCkBAIC0xNjEsOCArMTYxLDggQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLS8qKgotICoJZGV2aWNlX3N1YnN5cyAtIHN0cnVjdHVyZSB0byBiZSByZWdpc3RlcmVkIHdpdGgga29iamVjdCBjb3JlLgorLyoKKyAqCWRldmljZXNfc3Vic3lzIC0gc3RydWN0dXJlIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBrb2JqZWN0IGNvcmUuCiAgKi8KIAogZGVjbF9zdWJzeXMoZGV2aWNlcywgJmt0eXBlX2RldmljZSwgJmRldmljZV91ZXZlbnRfb3BzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9jcHUuYyBiL2RyaXZlcnMvYmFzZS9jcHUuYwppbmRleCAyODFkMjY3Li4wN2E3Zjk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY3B1LmMKKysrIGIvZHJpdmVycy9iYXNlL2NwdS5jCkBAIC04Myw2ICs4MywzMSBAQAogfQogI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwogCisjaWZkZWYgQ09ORklHX0tFWEVDCisjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KKworc3RhdGljIHNzaXplX3Qgc2hvd19jcmFzaF9ub3RlcyhzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGNwdSAqY3B1ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNwdSwgc3lzZGV2KTsKKwlzc2l6ZV90IHJjOworCXVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyOworCWludCBjcHVudW07CisKKwljcHVudW0gPSBjcHUtPnN5c2Rldi5pZDsKKworCS8qCisJICogTWlnaHQgYmUgcmVhZGluZyBvdGhlciBjcHUncyBkYXRhIGJhc2VkIG9uIHdoaWNoIGNwdSByZWFkIHRocmVhZAorCSAqIGhhcyBiZWVuIHNjaGVkdWxlZC4gQnV0IGNwdSBkYXRhIChtZW1vcnkpIGlzIGFsbG9jYXRlZCBvbmNlIGR1cmluZworCSAqIGJvb3QgdXAgYW5kIHRoaXMgZGF0YSBkb2VzIG5vdCBjaGFuZ2UgdGhlcmUgYWZ0ZXIuIEhlbmNlIHRoaXMKKwkgKiBvcGVyYXRpb24gc2hvdWxkIGJlIHNhZmUuIE5vIGxvY2tpbmcgcmVxdWlyZWQuCisJICovCisJYWRkciA9IF9fcGEocGVyX2NwdV9wdHIoY3Jhc2hfbm90ZXMsIGNwdW51bSkpOworCXJjID0gc3ByaW50ZihidWYsICIlTHhcbiIsIGFkZHIpOworCXJldHVybiByYzsKK30KK3N0YXRpYyBTWVNERVZfQVRUUihjcmFzaF9ub3RlcywgMDQwMCwgc2hvd19jcmFzaF9ub3RlcywgTlVMTCk7CisjZW5kaWYKKwogLyoKICAqIHJlZ2lzdGVyX2NwdSAtIFNldHVwIGEgZHJpdmVyZnMgZGV2aWNlIGZvciBhIENQVS4KICAqIEBjcHUgLSBDYWxsZXJzIGNhbiBzZXQgdGhlIGNwdS0+bm9fY29udHJvbCBmaWVsZCB0byAxLCB0byBpbmRpY2F0ZSBub3QgdG8KQEAgLTEwOCw2ICsxMzMsMTEgQEAKIAkJcmVnaXN0ZXJfY3B1X2NvbnRyb2woY3B1KTsKIAlpZiAoIWVycm9yKQogCQljcHVfc3lzX2RldmljZXNbbnVtXSA9ICZjcHUtPnN5c2RldjsKKworI2lmZGVmIENPTkZJR19LRVhFQworCWlmICghZXJyb3IpCisJCWVycm9yID0gc3lzZGV2X2NyZWF0ZV9maWxlKCZjcHUtPnN5c2RldiwgJmF0dHJfY3Jhc2hfbm90ZXMpOworI2VuZGlmCiAJcmV0dXJuIGVycm9yOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZGQuYyBiL2RyaXZlcnMvYmFzZS9kZC5jCmluZGV4IDJiOTA1MDEuLjczMGE5Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kZC5jCisrKyBiL2RyaXZlcnMvYmFzZS9kZC5jCkBAIC03OCw3ICs3OCwxMyBAQAogCXByX2RlYnVnKCIlczogTWF0Y2hlZCBEZXZpY2UgJXMgd2l0aCBEcml2ZXIgJXNcbiIsCiAJCSBkcnYtPmJ1cy0+bmFtZSwgZGV2LT5idXNfaWQsIGRydi0+bmFtZSk7CiAJZGV2LT5kcml2ZXIgPSBkcnY7Ci0JaWYgKGRydi0+cHJvYmUpIHsKKwlpZiAoZGV2LT5idXMtPnByb2JlKSB7CisJCXJldCA9IGRldi0+YnVzLT5wcm9iZShkZXYpOworCQlpZiAocmV0KSB7CisJCQlkZXYtPmRyaXZlciA9IE5VTEw7CisJCQlnb3RvIFByb2JlRmFpbGVkOworCQl9CisJfSBlbHNlIGlmIChkcnYtPnByb2JlKSB7CiAJCXJldCA9IGRydi0+cHJvYmUoZGV2KTsKIAkJaWYgKHJldCkgewogCQkJZGV2LT5kcml2ZXIgPSBOVUxMOwpAQCAtMjAzLDcgKzIwOSw5IEBACiAJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmtvYmosICJkcml2ZXIiKTsKIAkJa2xpc3RfcmVtb3ZlKCZkZXYtPmtub2RlX2RyaXZlcik7CiAKLQkJaWYgKGRydi0+cmVtb3ZlKQorCQlpZiAoZGV2LT5idXMtPnJlbW92ZSkKKwkJCWRldi0+YnVzLT5yZW1vdmUoZGV2KTsKKwkJZWxzZSBpZiAoZHJ2LT5yZW1vdmUpCiAJCQlkcnYtPnJlbW92ZShkZXYpOwogCQlkZXYtPmRyaXZlciA9IE5VTEw7CiAJCXB1dF9kcml2ZXIoZHJ2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kcml2ZXIuYyBiL2RyaXZlcnMvYmFzZS9kcml2ZXIuYwppbmRleCAxNjFmM2EzLi5iNDAwMzE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMKKysrIGIvZHJpdmVycy9iYXNlL2RyaXZlci5jCkBAIC0xNzEsNiArMTcxLDExIEBACiAgKi8KIGludCBkcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGRldmljZV9kcml2ZXIgKiBkcnYpCiB7CisJaWYgKChkcnYtPmJ1cy0+cHJvYmUgJiYgZHJ2LT5wcm9iZSkgfHwKKwkgICAgKGRydi0+YnVzLT5yZW1vdmUgJiYgZHJ2LT5yZW1vdmUpIHx8CisJICAgIChkcnYtPmJ1cy0+c2h1dGRvd24gJiYgZHJ2LT5zaHV0ZG93bikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRHJpdmVyICclcycgbmVlZHMgdXBkYXRpbmcgLSBwbGVhc2UgdXNlIGJ1c190eXBlIG1ldGhvZHNcbiIsIGRydi0+bmFtZSk7CisJfQogCWtsaXN0X2luaXQoJmRydi0+a2xpc3RfZGV2aWNlcywga2xpc3RfZGV2aWNlc19nZXQsIGtsaXN0X2RldmljZXNfcHV0KTsKIAlpbml0X2NvbXBsZXRpb24oJmRydi0+dW5sb2FkZWQpOwogCXJldHVybiBidXNfYWRkX2RyaXZlcihkcnYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMgYi9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYwppbmRleCA1YjNkNWU5Li5lOTdlOTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYworKysgYi9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYwpAQCAtNyw2ICs3LDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC00Nyw3ICs0OCw3IEBACiAJc3RydWN0IHRpbWVyX2xpc3QgdGltZW91dDsKIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAorc3RhdGljIHZvaWQKIGZ3X2xvYWRfYWJvcnQoc3RydWN0IGZpcm13YXJlX3ByaXYgKmZ3X3ByaXYpCiB7CiAJc2V0X2JpdChGV19TVEFUVVNfQUJPUlQsICZmd19wcml2LT5zdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL21lbW9yeS5jIGIvZHJpdmVycy9iYXNlL21lbW9yeS5jCmluZGV4IDU4ODAxZDcuLmQxYTA1MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9tZW1vcnkuYworKysgYi9kcml2ZXJzL2Jhc2UvbWVtb3J5LmMKQEAgLTEzLDggKzEzLDggQEAKICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JLyogY2FwYWJsZSgpICovCiAjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtb3J5Lmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMgYi9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYwppbmRleCAwZjgxNzMxLi40NjE1NTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYwpAQCAtMzI3LDcgKzMyNyw3IEBACiAgKglAcGRldjoJcGxhdGZvcm0gZGV2aWNlIHdlJ3JlIHVucmVnaXN0ZXJpbmcKICAqCiAgKglVbnJlZ2lzdHJhdGlvbiBpcyBkb25lIGluIDIgc3RlcHMuIEZpc3J0IHdlIHJlbGVhc2UgYWxsIHJlc291cmNlcwotICoJYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBzeWJzeXN0ZW0sIHRoZW4gd2UgZHJvcCByZWZlcmVuY2UgY291bnQgYnkKKyAqCWFuZCByZW1vdmUgaXQgZnJvbSB0aGUgc3Vic3lzdGVtLCB0aGVuIHdlIGRyb3AgcmVmZXJlbmNlIGNvdW50IGJ5CiAgKgljYWxsaW5nIHBsYXRmb3JtX2RldmljZV9wdXQoKS4KICAqLwogdm9pZCBwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICogcGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9zaHV0ZG93bi5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3NodXRkb3duLmMKaW5kZXggZjUwYTA4Yi4uYzI0NzVmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL3NodXRkb3duLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3NodXRkb3duLmMKQEAgLTM1LDEyICszNSwxNSBAQAogICovCiB2b2lkIGRldmljZV9zaHV0ZG93bih2b2lkKQogewotCXN0cnVjdCBkZXZpY2UgKiBkZXY7CisJc3RydWN0IGRldmljZSAqIGRldiwgKmRldm47CiAKIAlkb3duX3dyaXRlKCZkZXZpY2VzX3N1YnN5cy5yd3NlbSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGRldiwgJmRldmljZXNfc3Vic3lzLmtzZXQubGlzdCwKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfcmV2ZXJzZShkZXYsIGRldm4sICZkZXZpY2VzX3N1YnN5cy5rc2V0Lmxpc3QsCiAJCQkJa29iai5lbnRyeSkgewotCQlpZiAoZGV2LT5kcml2ZXIgJiYgZGV2LT5kcml2ZXItPnNodXRkb3duKSB7CisJCWlmIChkZXYtPmJ1cyAmJiBkZXYtPmJ1cy0+c2h1dGRvd24pIHsKKwkJCWRldl9kYmcoZGV2LCAic2h1dGRvd25cbiIpOworCQkJZGV2LT5idXMtPnNodXRkb3duKGRldik7CisJCX0gZWxzZSBpZiAoZGV2LT5kcml2ZXIgJiYgZGV2LT5kcml2ZXItPnNodXRkb3duKSB7CiAJCQlkZXZfZGJnKGRldiwgInNodXRkb3duXG4iKTsKIAkJCWRldi0+ZHJpdmVyLT5zaHV0ZG93bihkZXYpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL0RBQzk2MC5jIGIvZHJpdmVycy9ibG9jay9EQUM5NjAuYwppbmRleCAyMTA5N2EzLi42ZWRlMWYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL0RBQzk2MC5jCisrKyBiL2RyaXZlcnMvYmxvY2svREFDOTYwLmMKQEAgLTkyLDM0ICs5MiwyOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IERBQzk2MF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBEQUM5NjBfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKQogewotCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzazsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGJkZXYtPmJkX2Rpc2s7CiAJREFDOTYwX0NvbnRyb2xsZXJfVCAqcCA9IGRpc2stPnF1ZXVlLT5xdWV1ZWRhdGE7CiAJaW50IGRyaXZlX25yID0gKGxvbmcpZGlzay0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBoZF9nZW9tZXRyeSBnOwotCXN0cnVjdCBoZF9nZW9tZXRyeSBfX3VzZXIgKmxvYyA9IChzdHJ1Y3QgaGRfZ2VvbWV0cnkgX191c2VyICopYXJnOwotCi0JaWYgKGNtZCAhPSBIRElPX0dFVEdFTyB8fCAhbG9jKQotCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChwLT5GaXJtd2FyZVR5cGUgPT0gREFDOTYwX1YxX0NvbnRyb2xsZXIpIHsKLQkJZy5oZWFkcyA9IHAtPlYxLkdlb21ldHJ5VHJhbnNsYXRpb25IZWFkczsKLQkJZy5zZWN0b3JzID0gcC0+VjEuR2VvbWV0cnlUcmFuc2xhdGlvblNlY3RvcnM7Ci0JCWcuY3lsaW5kZXJzID0gcC0+VjEuTG9naWNhbERyaXZlSW5mb3JtYXRpb25bZHJpdmVfbnJdLgotCQkJTG9naWNhbERyaXZlU2l6ZSAvIChnLmhlYWRzICogZy5zZWN0b3JzKTsKKwkJZ2VvLT5oZWFkcyA9IHAtPlYxLkdlb21ldHJ5VHJhbnNsYXRpb25IZWFkczsKKwkJZ2VvLT5zZWN0b3JzID0gcC0+VjEuR2VvbWV0cnlUcmFuc2xhdGlvblNlY3RvcnM7CisJCWdlby0+Y3lsaW5kZXJzID0gcC0+VjEuTG9naWNhbERyaXZlSW5mb3JtYXRpb25bZHJpdmVfbnJdLgorCQkJTG9naWNhbERyaXZlU2l6ZSAvIChnZW8tPmhlYWRzICogZ2VvLT5zZWN0b3JzKTsKIAl9IGVsc2UgewogCQlEQUM5NjBfVjJfTG9naWNhbERldmljZUluZm9fVCAqaSA9CiAJCQlwLT5WMi5Mb2dpY2FsRGV2aWNlSW5mb3JtYXRpb25bZHJpdmVfbnJdOwogCQlzd2l0Y2ggKGktPkRyaXZlR2VvbWV0cnkpIHsKIAkJY2FzZSBEQUM5NjBfVjJfR2VvbWV0cnlfMTI4XzMyOgotCQkJZy5oZWFkcyA9IDEyODsKLQkJCWcuc2VjdG9ycyA9IDMyOworCQkJZ2VvLT5oZWFkcyA9IDEyODsKKwkJCWdlby0+c2VjdG9ycyA9IDMyOwogCQkJYnJlYWs7CiAJCWNhc2UgREFDOTYwX1YyX0dlb21ldHJ5XzI1NV82MzoKLQkJCWcuaGVhZHMgPSAyNTU7Ci0JCQlnLnNlY3RvcnMgPSA2MzsKKwkJCWdlby0+aGVhZHMgPSAyNTU7CisJCQlnZW8tPnNlY3RvcnMgPSA2MzsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJREFDOTYwX0Vycm9yKCJJbGxlZ2FsIExvZ2ljYWwgRGV2aWNlIEdlb21ldHJ5ICVkXG4iLApAQCAtMTI3LDEyICsxMjEsMTEgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJZy5jeWxpbmRlcnMgPSBpLT5Db25maWd1cmFibGVEZXZpY2VTaXplIC8gKGcuaGVhZHMgKiBnLnNlY3RvcnMpOworCQlnZW8tPmN5bGluZGVycyA9IGktPkNvbmZpZ3VyYWJsZURldmljZVNpemUgLworCQkJKGdlby0+aGVhZHMgKiBnZW8tPnNlY3RvcnMpOwogCX0KIAkKLQlnLnN0YXJ0ID0gZ2V0X3N0YXJ0X3NlY3QoaW5vZGUtPmlfYmRldik7Ci0KLQlyZXR1cm4gY29weV90b191c2VyKGxvYywgJmcsIHNpemVvZiBnKSA/IC1FRkFVTFQgOiAwOyAKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBEQUM5NjBfbWVkaWFfY2hhbmdlZChzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKQEAgLTE1Nyw3ICsxNTAsNyBAQAogc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyBEQUM5NjBfQmxvY2tEZXZpY2VPcGVyYXRpb25zID0gewogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4JCQk9IERBQzk2MF9vcGVuLAotCS5pb2N0bAkJCT0gREFDOTYwX2lvY3RsLAorCS5nZXRnZW8JCQk9IERBQzk2MF9nZXRnZW8sCiAJLm1lZGlhX2NoYW5nZWQJCT0gREFDOTYwX21lZGlhX2NoYW5nZWQsCiAJLnJldmFsaWRhdGVfZGlzawk9IERBQzk2MF9yZXZhbGlkYXRlX2Rpc2ssCiB9OwpAQCAtMzc2Nyw3ICszNzYwLDcgQEAKIAkgICAgICBpZiAoU2Vuc2VLZXkgPT0gREFDOTYwX1NlbnNlS2V5X1ZlbmRvclNwZWNpZmljICYmCiAJCSAgQWRkaXRpb25hbFNlbnNlQ29kZSA9PSAweDgwICYmCiAJCSAgQWRkaXRpb25hbFNlbnNlQ29kZVF1YWxpZmllciA8Ci0JCSAgc2l6ZW9mKERBQzk2MF9FdmVudE1lc3NhZ2VzKSAvIHNpemVvZihjaGFyICopKQorCQkgIEFSUkFZX1NJWkUoREFDOTYwX0V2ZW50TWVzc2FnZXMpKQogCQlEQUM5NjBfQ3JpdGljYWwoIlBoeXNpY2FsIERldmljZSAlZDolZCAlc1xuIiwgQ29udHJvbGxlciwKIAkJCQlFdmVudExvZ0VudHJ5LT5DaGFubmVsLAogCQkJCUV2ZW50TG9nRW50cnktPlRhcmdldElELApAQCAtNzE4Niw3ICs3MTc5LDcgQEAKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gIHBjaV9tb2R1bGVfaW5pdCgmREFDOTYwX3BjaV9kcml2ZXIpOworCXJldCA9ICBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZEQUM5NjBfcGNpX2RyaXZlcik7CiAjaWZkZWYgREFDOTYwX0dBTV9NSU5PUgogCWlmICghcmV0KQogCQlEQUM5NjBfZ2FtX2luaXQoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYWNzaS5jIGIvZHJpdmVycy9ibG9jay9hY3NpLmMKaW5kZXggNWQyZDY0OS4uMTk2YzBlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hY3NpLmMKKysrIGIvZHJpdmVycy9ibG9jay9hY3NpLmMKQEAgLTEwNzksNiArMTA3OSwxOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorc3RhdGljIGludCBhY3NpX2dldGdlbyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbykKK3sKKwlzdHJ1Y3QgYWNzaV9pbmZvX3N0cnVjdCAqYWlwID0gYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOworCisJLyoKKwkgKiBKdXN0IGZha2Ugc29tZSBnZW9tZXRyeSBoZXJlLCBpdCdzIG5vbnNlbnNlIGFueXdheQorCSAqIFRvIG1ha2UgaXQgZWFzeSwgdXNlIEFkYXB0ZWMncyB1c3VhbCA2NC8zMiBtYXBwaW5nCisJICovCisJZ2VvLT5oZWFkcyA9IDY0OworCWdlby0+c2VjdG9ycyA9IDMyOworCWdlby0+Y3lsaW5kZXJzID0gYWlwLT5zaXplID4+IDExOworCXJldHVybiAwOworfQogCiBzdGF0aWMgaW50IGFjc2lfaW9jdGwoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCkBAIC0xMDg2LDE4ICsxMDk5LDYgQEAKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2s7CiAJc3RydWN0IGFjc2lfaW5mb19zdHJ1Y3QgKmFpcCA9IGRpc2stPnByaXZhdGVfZGF0YTsKIAlzd2l0Y2ggKGNtZCkgewotCSAgY2FzZSBIRElPX0dFVEdFTzoKLQkJLyogSERJT19HRVRHRU8gaXMgc3VwcG9ydGVkIG1vcmUgZm9yIGdldHRpbmcgdGhlIHBhcnRpdGlvbidzCi0JCSAqIHN0YXJ0IHNlY3Rvci4uLiAqLwotCSAgeyBzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbyA9IChzdHJ1Y3QgaGRfZ2VvbWV0cnkgKilhcmc7Ci0JICAgIC8qIGp1c3QgZmFrZSBzb21lIGdlb21ldHJ5IGhlcmUsIGl0J3Mgbm9uc2Vuc2UgYW55d2F5OyB0byBtYWtlIGl0Ci0JCSAqIGVhc3ksIHVzZSBBZGFwdGVjJ3MgdXN1YWwgNjQvMzIgbWFwcGluZyAqLwotCSAgICBwdXRfdXNlciggNjQsICZnZW8tPmhlYWRzICk7Ci0JICAgIHB1dF91c2VyKCAzMiwgJmdlby0+c2VjdG9ycyApOwotCSAgICBwdXRfdXNlciggYWlwLT5zaXplID4+IDExLCAmZ2VvLT5jeWxpbmRlcnMgKTsKLQkJcHV0X3VzZXIoZ2V0X3N0YXJ0X3NlY3QoaW5vZGUtPmlfYmRldiksICZnZW8tPnN0YXJ0KTsKLQkJcmV0dXJuIDA7Ci0JICB9CiAJICBjYXNlIFNDU0lfSU9DVExfR0VUX0lETFVOOgogCQkvKiBTQ1NJIGNvbXBhdGlibGUgR0VUX0lETFVOIGNhbGwgdG8gZ2V0IHRhcmdldCdzIElEIGFuZCBMVU4gbnVtYmVyICovCiAJCXB1dF91c2VyKCBhaXAtPnRhcmdldCB8IChhaXAtPmx1biA8PCA4KSwKQEAgLTE1OTIsNiArMTU5Myw3IEBACiAJLm9wZW4JCT0gYWNzaV9vcGVuLAogCS5yZWxlYXNlCT0gYWNzaV9yZWxlYXNlLAogCS5pb2N0bAkJPSBhY3NpX2lvY3RsLAorCS5nZXRnZW8JCT0gYWNzaV9nZXRnZW8sCiAJLm1lZGlhX2NoYW5nZWQJPSBhY3NpX21lZGlhX2NoYW5nZSwKIAkucmV2YWxpZGF0ZV9kaXNrPSBhY3NpX3JldmFsaWRhdGUsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hbWlmbG9wLmMgYi9kcml2ZXJzL2Jsb2NrL2FtaWZsb3AuYwppbmRleCAwYWNiZmZmLi5iNmUyOTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2FtaWZsb3AuYworKysgYi9kcml2ZXJzL2Jsb2NrL2FtaWZsb3AuYwpAQCAtMTMxLDcgKzEzMSw3IEBACiB7IEZEX0REXzUsCSJERCA1LjI1IiwgNDAsIDIsIDE0NzE2LCAxMzYzMCwgMSwgNDAsIDgxLCA2LCAzMCwgMn0sCiB7IEZEX05PRFJJVkUsICJObyBEcml2ZSIsIDAsIDAsICAgICAwLCAgICAgMCwgMCwgIDAsICAwLCAgMCwgIDAsIDB9CiB9Owotc3RhdGljIGludCBudW1fZHJfdHlwZXMgPSBzaXplb2YoZHJpdmVfdHlwZXMpIC8gc2l6ZW9mKGRyaXZlX3R5cGVzWzBdKTsKK3N0YXRpYyBpbnQgbnVtX2RyX3R5cGVzID0gQVJSQVlfU0laRShkcml2ZV90eXBlcyk7CiAKIHN0YXRpYyBpbnQgYW1pZ2FfcmVhZChpbnQpLCBkb3NfcmVhZChpbnQpOwogc3RhdGljIHZvaWQgYW1pZ2Ffd3JpdGUoaW50KSwgZG9zX3dyaXRlKGludCk7CkBAIC0xOTQsNiArMTk0LDggQEAKICAqLwogI2RlZmluZSBNQVhfRVJST1JTIDEyCiAKKyNkZWZpbmUgY3VzdG9tIGFtaWdhX2N1c3RvbQorCiAvKiBQcmV2ZW50ICJhbGlhc2VkIiBhY2Nlc3Nlcy4gKi8KIHN0YXRpYyBpbnQgZmRfcmVmWzRdID0geyAwLDAsMCwwIH07CiBzdGF0aWMgaW50IGZkX2RldmljZVs0XSA9IHsgMCwgMCwgMCwgMCB9OwpAQCAtMTQyNCwyNSArMTQyNiwyNCBAQAogCXJlZG9fZmRfcmVxdWVzdCgpOwogfQogCitzdGF0aWMgaW50IGZkX2dldGdlbyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbykKK3sKKwlpbnQgZHJpdmUgPSBNSU5PUihiZGV2LT5iZF9kZXYpICYgMzsKKworCWdlby0+aGVhZHMgPSB1bml0W2RyaXZlXS50eXBlLT5oZWFkczsKKwlnZW8tPnNlY3RvcnMgPSB1bml0W2RyaXZlXS5kdHlwZS0+c2VjdHMgKiB1bml0W2RyaXZlXS50eXBlLT5zZWN0X211bHQ7CisJZ2VvLT5jeWxpbmRlcnMgPSB1bml0W2RyaXZlXS50eXBlLT50cmFja3M7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZmRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIHBhcmFtKQogewogCWludCBkcml2ZSA9IGltaW5vcihpbm9kZSkgJiAzOwogCXN0YXRpYyBzdHJ1Y3QgZmxvcHB5X3N0cnVjdCBnZXRwcm07CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilwYXJhbTsKIAogCXN3aXRjaChjbWQpewotCWNhc2UgSERJT19HRVRHRU86Ci0JewotCQlzdHJ1Y3QgaGRfZ2VvbWV0cnkgbG9jOwotCQlsb2MuaGVhZHMgPSB1bml0W2RyaXZlXS50eXBlLT5oZWFkczsKLQkJbG9jLnNlY3RvcnMgPSB1bml0W2RyaXZlXS5kdHlwZS0+c2VjdHMgKiB1bml0W2RyaXZlXS50eXBlLT5zZWN0X211bHQ7Ci0JCWxvYy5jeWxpbmRlcnMgPSB1bml0W2RyaXZlXS50eXBlLT50cmFja3M7Ci0JCWxvYy5zdGFydCA9IDA7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilwYXJhbSwgKHZvaWQgKikmbG9jLAotCQkJCSBzaXplb2Yoc3RydWN0IGhkX2dlb21ldHJ5KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JfQogCWNhc2UgRkRGTVRCRUc6CiAJCWdldF9mZGMoZHJpdmUpOwogCQlpZiAoZmRfcmVmW2RyaXZlXSA+IDEpIHsKQEAgLTE0ODYsOSArMTQ4Nyw3IEBACiAJCWdldHBybS5oZWFkPXVuaXRbZHJpdmVdLnR5cGUtPmhlYWRzOwogCQlnZXRwcm0uc2VjdD11bml0W2RyaXZlXS5kdHlwZS0+c2VjdHMgKiB1bml0W2RyaXZlXS50eXBlLT5zZWN0X211bHQ7CiAJCWdldHBybS5zaXplPXVuaXRbZHJpdmVdLmJsb2NrczsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKXBhcmFtLAotCQkJCSAodm9pZCAqKSZnZXRwcm0sCi0JCQkJIHNpemVvZihzdHJ1Y3QgZmxvcHB5X3N0cnVjdCkpKQorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZnZXRwcm0sIHNpemVvZihzdHJ1Y3QgZmxvcHB5X3N0cnVjdCkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWJyZWFrOwogCWNhc2UgRkRTRVRQUk06CkBAIC0xNTAwLDggKzE0OTksNyBAQAogCQlicmVhazsKICNpZmRlZiBSQVdfSU9DVEwKIAljYXNlIElPQ1RMX1JBV19UUkFDSzoKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKXBhcmFtLCByYXdfYnVmLAotCQkJCSB1bml0W2RyaXZlXS50eXBlLT5yZWFkX3NpemUpKQorCQlpZiAoY29weV90b191c2VyKGFyZ3AsIHJhd19idWYsIHVuaXRbZHJpdmVdLnR5cGUtPnJlYWRfc2l6ZSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJZWxzZQogCQkJcmV0dXJuIHVuaXRbZHJpdmVdLnR5cGUtPnJlYWRfc2l6ZTsKQEAgLTE2NTIsMTUgKzE2NTAsMTAgQEAKIAkub3BlbgkJPSBmbG9wcHlfb3BlbiwKIAkucmVsZWFzZQk9IGZsb3BweV9yZWxlYXNlLAogCS5pb2N0bAkJPSBmZF9pb2N0bCwKKwkuZ2V0Z2VvCQk9IGZkX2dldGdlbywKIAkubWVkaWFfY2hhbmdlZAk9IGFtaWdhX2Zsb3BweV9jaGFuZ2UsCiB9OwogCi12b2lkIF9faW5pdCBhbWlnYV9mbG9wcHlfc2V0dXAgKGNoYXIgKnN0ciwgaW50ICppbnRzKQotewotCXByaW50ayAoS0VSTl9JTkZPICJhbWlmbG9wOiBTZXR0aW5nIGRlZmF1bHQgZGYwIHRvICV4XG4iLCBpbnRzWzFdKTsKLQlmZF9kZWZfZGYwID0gaW50c1sxXTsKLX0KLQogc3RhdGljIGludCBfX2luaXQgZmRfcHJvYmVfZHJpdmVzKHZvaWQpCiB7CiAJaW50IGRyaXZlLGRyaXZlcyxub21lbTsKQEAgLTE4NDYsNCArMTgzOSwxOCBAQAogCXVucmVnaXN0ZXJfYmxrZGV2KEZMT1BQWV9NQUpPUiwgImZkIik7CiB9CiAjZW5kaWYKKworI2Vsc2UKK3N0YXRpYyBpbnQgX19pbml0IGFtaWdhX2Zsb3BweV9zZXR1cCAoY2hhciAqc3RyKQoreworCWludCBuOworCWlmICghTUFDSF9JU19BTUlHQSkKKwkJcmV0dXJuIDA7CisJaWYgKCFnZXRfb3B0aW9uKCZzdHIsICZuKSkKKwkJcmV0dXJuIDA7CisJcHJpbnRrIChLRVJOX0lORk8gImFtaWZsb3A6IFNldHRpbmcgZGVmYXVsdCBkZjAgdG8gJXhcbiIsIG4pOworCWZkX2RlZl9kZjAgPSBuOworfQorCitfX3NldHVwKCJmbG9wcHk9IiwgYW1pZ2FfZmxvcHB5X3NldHVwKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hb2UvYW9lYmxrLmMgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VibGsuYwppbmRleCAwZTk3ZmNiLi5jMDVlZThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VibGsuYworKysgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VibGsuYwpAQCAtMTY5LDM4ICsxNjksMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogVGhpcyBpb2N0bCBpbXBsZW1lbnRhdGlvbiBleHBlY3RzIHVzZXJsYW5kIHRvIGhhdmUgdGhlIGRldmljZSBub2RlCi0gKiBwZXJtaXNzaW9ucyBzZXQgc28gdGhhdCBvbmx5IHByaXZpbGVkZ2VkIHVzZXJzIGNhbiBvcGVuIGFuIGFvZQotICogYmxvY2sgZGV2aWNlIGRpcmVjdGx5LgotICovCiBzdGF0aWMgaW50Ci1hb2VibGtfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVpbnQgY21kLCB1bG9uZyBhcmcpCithb2VibGtfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKQogewotCXN0cnVjdCBhb2VkZXYgKmQ7CisJc3RydWN0IGFvZWRldiAqZCA9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKIAotCWlmICghYXJnKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWQgPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CiAJaWYgKChkLT5mbGFncyAmIERFVkZMX1VQKSA9PSAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiYW9lOiBhb2VibGtfaW9jdGw6IGRpc2sgbm90IHVwXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKGNtZCA9PSBIRElPX0dFVEdFTykgewotCQlkLT5nZW8uc3RhcnQgPSBnZXRfc3RhcnRfc2VjdChpbm9kZS0+aV9iZGV2KTsKLQkJaWYgKCFjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopIGFyZywgJmQtPmdlbywgc2l6ZW9mIGQtPmdlbykpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCXByaW50ayhLRVJOX0lORk8gImFvZTogYW9lYmxrX2lvY3RsOiB1bmtub3duIGlvY3RsICVkXG4iLCBjbWQpOwotCXJldHVybiAtRUlOVkFMOworCWdlby0+Y3lsaW5kZXJzID0gZC0+Z2VvLmN5bGluZGVyczsKKwlnZW8tPmhlYWRzID0gZC0+Z2VvLmhlYWRzOworCWdlby0+c2VjdG9ycyA9IGQtPmdlby5zZWN0b3JzOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIGFvZV9iZG9wcyA9IHsKIAkub3BlbiA9IGFvZWJsa19vcGVuLAogCS5yZWxlYXNlID0gYW9lYmxrX3JlbGVhc2UsCi0JLmlvY3RsID0gYW9lYmxrX2lvY3RsLAorCS5nZXRnZW8gPSBhb2VibGtfZ2V0Z2VvLAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hdGFmbG9wLmMgYi9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYwppbmRleCAyMmJkYTA1Li5mOGNlMjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYworKysgYi9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYwpAQCAtMTgxLDcgKzE4MSw3IEBACiAJeyAgNiwgVFlQRV9IRCB9LAkvKiAzMTogSDE2NDAgICAgPC0gd2FzIEgxNjAwID09IGgxNjAwIGZvciBQQyAqLwogfTsKIAotI2RlZmluZSBOVU1fRElTS19NSU5PUlMgKHNpemVvZihtaW5vcjJkaXNrdHlwZSkvc2l6ZW9mKCptaW5vcjJkaXNrdHlwZSkpCisjZGVmaW5lIE5VTV9ESVNLX01JTk9SUyBBUlJBWV9TSVpFKG1pbm9yMmRpc2t0eXBlKQogCiAvKgogICogTWF4aW11bSBkaXNrIHNpemUgKGluIGtpbG9ieXRlcykuIFRoaXMgZGVmYXVsdCBpcyB1c2VkIHdoZW5ldmVyIHRoZQpAQCAtMTM2MSw3ICsxMzYxLDcgQEAKIAkJICAgZm9ybWF0cywgZm9yICdwZXJtYW5lbnQgdXNlci1kZWZpbmVkJyBwYXJhbWV0ZXI6CiAJCSAgIHJlc3RvcmUgZGVmYXVsdF9wYXJhbXNbXSBoZXJlIGlmIGZsYWdnZWQgdmFsaWQhICovCiAJCWlmIChkZWZhdWx0X3BhcmFtc1tkcml2ZV0uYmxvY2tzID09IDApCi0JCQlVRFQgPSAwOworCQkJVURUID0gTlVMTDsKIAkJZWxzZQogCQkJVURUID0gJmRlZmF1bHRfcGFyYW1zW2RyaXZlXTsKIAl9CkBAIC0xNDk1LDYgKzE0OTUsNyBAQAogCXN0cnVjdCBmbG9wcHlfc3RydWN0IGdldHBybTsKIAlpbnQgc2V0dHlwZTsKIAlzdHJ1Y3QgZmxvcHB5X3N0cnVjdCBzZXRwcm07CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilwYXJhbTsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBGREdFVFBSTToKQEAgLTE1MjEsNyArMTUyMiw3IEBACiAJCWdldHBybS5oZWFkID0gMjsKIAkJZ2V0cHJtLnRyYWNrID0gZHRwLT5ibG9ja3MvZHRwLT5zcHQvMjsKIAkJZ2V0cHJtLnN0cmV0Y2ggPSBkdHAtPnN0cmV0Y2g7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilwYXJhbSwgJmdldHBybSwgc2l6ZW9mKGdldHBybSkpKQorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZnZXRwcm0sIHNpemVvZihnZXRwcm0pKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xNTQwLDcgKzE1NDEsNyBAQAogCQkvKiBnZXQgdGhlIHBhcmFtZXRlcnMgZnJvbSB1c2VyIHNwYWNlICovCiAJCWlmIChmbG9wcHktPnJlZiAhPSAxICYmIGZsb3BweS0+cmVmICE9IC0xKQogCQkJcmV0dXJuIC1FQlVTWTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzZXRwcm0sICh2b2lkICopIHBhcmFtLCBzaXplb2Yoc2V0cHJtKSkpCisJCWlmIChjb3B5X2Zyb21fdXNlcigmc2V0cHJtLCBhcmdwLCBzaXplb2Yoc2V0cHJtKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJLyogCiAJCSAqIGZpcnN0IG9mIGFsbDogY2hlY2sgZm9yIGZsb3BweSBjaGFuZ2UgYW5kIHJldmFsaWRhdGUsIApAQCAtMTY0Nyw3ICsxNjQ4LDcgQEAKIAljYXNlIEZERk1UVFJLOgogCQlpZiAoZmxvcHB5LT5yZWYgIT0gMSAmJiBmbG9wcHktPnJlZiAhPSAtMSkKIAkJCXJldHVybiAtRUJVU1k7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmZm10X2Rlc2MsICh2b2lkICopIHBhcmFtLCBzaXplb2YoZm10X2Rlc2MpKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZmbXRfZGVzYywgYXJncCwgc2l6ZW9mKGZtdF9kZXNjKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJcmV0dXJuIGRvX2Zvcm1hdChkcml2ZSwgdHlwZSwgJmZtdF9kZXNjKTsKIAljYXNlIEZEQ0xSUFJNOgpAQCAtMTk1MCwxNCArMTk1MSwyMCBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCi0KLXZvaWQgX19pbml0IGF0YXJpX2Zsb3BweV9zZXR1cCggY2hhciAqc3RyLCBpbnQgKmludHMgKQorI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IGF0YXJpX2Zsb3BweV9zZXR1cChjaGFyICpzdHIpCiB7CisJaW50IGludHNbMyArIEZEX01BWF9VTklUU107CiAJaW50IGk7CisKKwlpZiAoIU1BQ0hfSVNfQVRBUkkpCisJCXJldHVybiAwOworCisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCAzICsgRkRfTUFYX1VOSVRTLCBpbnRzKTsKIAkKIAlpZiAoaW50c1swXSA8IDEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJhdGFmbG9wX3NldHVwOiBubyBhcmd1bWVudHMhXG4iICk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAJfQogCWVsc2UgaWYgKGludHNbMF0gPiAyK0ZEX01BWF9VTklUUykgewogCQlwcmludGsoS0VSTl9FUlIgImF0YWZsb3Bfc2V0dXA6IHRvbyBtYW55IGFyZ3VtZW50c1xuIiApOwpAQCAtMTk3Nyw5ICsxOTg0LDEzIEBACiAJCWVsc2UKIAkJCVVzZXJTdGVwcmF0ZVtpLTNdID0gaW50c1tpXTsKIAl9CisJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB2b2lkIGF0YXJpX2Zsb3BweV9leGl0KHZvaWQpCitfX3NldHVwKCJmbG9wcHk9IiwgYXRhcmlfZmxvcHB5X3NldHVwKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXRhcmlfZmxvcHB5X2V4aXQodm9pZCkKIHsKIAlpbnQgaTsKIAlibGtfdW5yZWdpc3Rlcl9yZWdpb24oTUtERVYoRkxPUFBZX01BSk9SLCAwKSwgMjU2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svY2Npc3MuYyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwppbmRleCBkMjgxNWI3Li4xMmQ3YjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKKysrIGIvZHJpdmVycy9ibG9jay9jY2lzcy5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqICAgIERpc2sgQXJyYXkgZHJpdmVyIGZvciBIUCBTQSA1eHh4IGFuZCA2eHh4IENvbnRyb2xsZXJzCi0gKiAgICBDb3B5cmlnaHQgMjAwMCwgMjAwNSBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLgorICogICAgQ29weXJpZ2h0IDIwMDAsIDIwMDYgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4KICAqCiAgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTQ3LDEyICs0NywxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KIAogI2RlZmluZSBDQ0lTU19EUklWRVJfVkVSU0lPTihtYWosbWluLHN1Ym1pbikgKChtYWo8PDE2KXwobWluPDw4KXwoc3VibWluKSkKLSNkZWZpbmUgRFJJVkVSX05BTUUgIkhQIENJU1MgRHJpdmVyICh2IDIuNi44KSIKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gQ0NJU1NfRFJJVkVSX1ZFUlNJT04oMiw2LDgpCisjZGVmaW5lIERSSVZFUl9OQU1FICJIUCBDSVNTIERyaXZlciAodiAyLjYuMTApIgorI2RlZmluZSBEUklWRVJfVkVSU0lPTiBDQ0lTU19EUklWRVJfVkVSU0lPTigyLDYsMTApCiAKIC8qIEVtYmVkZGVkIG1vZHVsZSBkb2N1bWVudGF0aW9uIG1hY3JvcyAtIHNlZSBtb2R1bGVzLmggKi8KIE1PRFVMRV9BVVRIT1IoIkhld2xldHQtUGFja2FyZCBDb21wYW55Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgSFAgQ29udHJvbGxlciBTQTV4eHggU0E2eHh4IHZlcnNpb24gMi42LjgiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBIUCBDb250cm9sbGVyIFNBNXh4eCBTQTZ4eHggdmVyc2lvbiAyLjYuMTAiKTsKIE1PRFVMRV9TVVBQT1JURURfREVWSUNFKCJIUCBTQTVpIFNBNWkrIFNBNTMyIFNBNTMwMCBTQTUzMTIgU0E2NDEgU0E2NDIgU0E2NDAwIgogCQkJIiBTQTZpIFA2MDAgUDgwMCBQNDAwIFA0MDBpIEUyMDAgRTIwMGkiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTEwMyw3ICsxMDMsNyBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjY2lzc19wY2lfZGV2aWNlX2lkKTsKIAotI2RlZmluZSBOUl9QUk9EVUNUUyAoc2l6ZW9mKHByb2R1Y3RzKS9zaXplb2Yoc3RydWN0IGJvYXJkX3R5cGUpKQorI2RlZmluZSBOUl9QUk9EVUNUUyBBUlJBWV9TSVpFKHByb2R1Y3RzKQogCiAvKiAgYm9hcmRfaWQgPSBTdWJzeXN0ZW0gRGV2aWNlIElEICYgVmVuZG9yIElECiAgKiAgcHJvZHVjdCA9IE1hcmtldGluZyBOYW1lIGZvciB0aGUgYm9hcmQKQEAgLTE1Myw2ICsxNTMsNyBAQAogc3RhdGljIGludCBjY2lzc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlcCk7CiBzdGF0aWMgaW50IGNjaXNzX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlcCwgCiAJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgY2Npc3NfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKTsKIAogc3RhdGljIGludCByZXZhbGlkYXRlX2FsbHZvbChjdGxyX2luZm9fdCAqaG9zdCk7CiBzdGF0aWMgaW50IGNjaXNzX3JldmFsaWRhdGUoc3RydWN0IGdlbmRpc2sgKmRpc2spOwpAQCAtMTY2LDcgKzE2Nyw3IEBACiAJCQl1bnNpZ25lZCBpbnQgYmxvY2tfc2l6ZSwgSW5xdWlyeURhdGFfc3RydWN0ICppbnFfYnVmZiwKIAkJCWRyaXZlX2luZm9fc3RydWN0ICpkcnYpOwogc3RhdGljIHZvaWQgY2Npc3NfZ2V0Z2VvbWV0cnkoaW50IGNudGxfbnVtKTsKLQorc3RhdGljIHZvaWQgX19kZXZpbml0IGNjaXNzX2ludGVycnVwdF9tb2RlKGN0bHJfaW5mb190ICosIHN0cnVjdCBwY2lfZGV2ICosIF9fdTMyKTsKIHN0YXRpYyB2b2lkIHN0YXJ0X2lvKCBjdGxyX2luZm9fdCAqaCk7CiBzdGF0aWMgaW50IHNlbmRjbWQoIF9fdTggY21kLCBpbnQgY3Rsciwgdm9pZCAqYnVmZiwgc2l6ZV90IHNpemUsCiAJdW5zaWduZWQgaW50IHVzZV91bml0X251bSwgdW5zaWduZWQgaW50IGxvZ191bml0LCBfX3U4IHBhZ2VfY29kZSwKQEAgLTE5NCw2ICsxOTUsNyBAQAogCS5vcGVuCQk9IGNjaXNzX29wZW4sIAogCS5yZWxlYXNlICAgICAgIAk9IGNjaXNzX3JlbGVhc2UsCiAgICAgICAgIC5pb2N0bAkJPSBjY2lzc19pb2N0bCwKKyAgICAgICAgLmdldGdlbwkJPSBjY2lzc19nZXRnZW8sCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfaW9jdGwgICA9IGNjaXNzX2NvbXBhdF9pb2N0bCwKICNlbmRpZgpAQCAtMjgyLDcgKzI4NCw3IEBACiAgICAgICAgICAgICAgICAgaC0+cHJvZHVjdF9uYW1lLAogICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWgtPmJvYXJkX2lkLAogCQloLT5maXJtX3ZlclswXSwgaC0+ZmlybV92ZXJbMV0sIGgtPmZpcm1fdmVyWzJdLCBoLT5maXJtX3ZlclszXSwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWgtPmludHIsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCloLT5pbnRyW1NJTVBMRV9NT0RFX0lOVF0sCiAgICAgICAgICAgICAgICAgaC0+bnVtX2x1bnMsIAogCQloLT5RZGVwdGgsIGgtPmNvbW1hbmRzX291dHN0YW5kaW5nLAogCQloLT5tYXhRc2luY2Vpbml0LCBoLT5tYXhfb3V0c3RhbmRpbmcsIGgtPm1heFNHKTsKQEAgLTYzMyw2ICs2MzUsMjAgQEAKIAlyZXR1cm4gZXJyOwogfQogI2VuZGlmCisKK3N0YXRpYyBpbnQgY2Npc3NfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKQoreworCWRyaXZlX2luZm9fc3RydWN0ICpkcnYgPSBnZXRfZHJ2KGJkZXYtPmJkX2Rpc2spOworCisJaWYgKCFkcnYtPmN5bGluZGVycykKKwkJcmV0dXJuIC1FTlhJTzsKKworCWdlby0+aGVhZHMgPSBkcnYtPmhlYWRzOworCWdlby0+c2VjdG9ycyA9IGRydi0+c2VjdG9yczsKKwlnZW8tPmN5bGluZGVycyA9IGRydi0+Y3lsaW5kZXJzOworCXJldHVybiAwOworfQorCiAvKgogICogaW9jdGwgCiAgKi8KQEAgLTY1MSwyMSArNjY3LDYgQEAKICNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLyAKIAkKIAlzd2l0Y2goY21kKSB7Ci0JY2FzZSBIRElPX0dFVEdFTzoKLQl7Ci0gICAgICAgICAgICAgICAgc3RydWN0IGhkX2dlb21ldHJ5IGRyaXZlcl9nZW87Ci0gICAgICAgICAgICAgICAgaWYgKGRydi0+Y3lsaW5kZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXJfZ2VvLmhlYWRzID0gZHJ2LT5oZWFkczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlcl9nZW8uc2VjdG9ycyA9IGRydi0+c2VjdG9yczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlcl9nZW8uY3lsaW5kZXJzID0gZHJ2LT5jeWxpbmRlcnM7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0JCQlyZXR1cm4gLUVOWElPOwotICAgICAgICAgICAgICAgIGRyaXZlcl9nZW8uc3RhcnQ9IGdldF9zdGFydF9zZWN0KGlub2RlLT5pX2JkZXYpOwotICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmRyaXZlcl9nZW8sIHNpemVvZihzdHJ1Y3QgaGRfZ2VvbWV0cnkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgLUVGQVVMVDsKLSAgICAgICAgICAgICAgICByZXR1cm4oMCk7Ci0JfQotCiAJY2FzZSBDQ0lTU19HRVRQQ0lJTkZPOgogCXsKIAkJY2Npc3NfcGNpX2luZm9fc3RydWN0IHBjaWluZm87CkBAIC0yMTc3LDE2ICsyMTc4LDQ4IEBACiAKIAlzdGFydF9pbyhoKTsKIH0KKworc3RhdGljIHZvaWQgY2Npc3Nfc29mdGlycV9kb25lKHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlDb21tYW5kTGlzdF9zdHJ1Y3QgKmNtZCA9IHJxLT5jb21wbGV0aW9uX2RhdGE7CisJY3Rscl9pbmZvX3QgKmggPSBoYmFbY21kLT5jdGxyXTsKKwl1NjRiaXQgdGVtcDY0OworCWludCBpLCBkZGlyOworCisJaWYgKGNtZC0+UmVxdWVzdC5UeXBlLkRpcmVjdGlvbiA9PSBYRkVSX1JFQUQpCisJCWRkaXIgPSBQQ0lfRE1BX0ZST01ERVZJQ0U7CisJZWxzZQorCQlkZGlyID0gUENJX0RNQV9UT0RFVklDRTsKKworCS8qIGNvbW1hbmQgZGlkIG5vdCBuZWVkIHRvIGJlIHJldHJpZWQgKi8KKwkvKiB1bm1hcCB0aGUgRE1BIG1hcHBpbmcgZm9yIGFsbCB0aGUgc2NhdHRlciBnYXRoZXIgZWxlbWVudHMgKi8KKwlmb3IoaT0wOyBpPGNtZC0+SGVhZGVyLlNHTGlzdDsgaSsrKSB7CisJCXRlbXA2NC52YWwzMi5sb3dlciA9IGNtZC0+U0dbaV0uQWRkci5sb3dlcjsKKwkJdGVtcDY0LnZhbDMyLnVwcGVyID0gY21kLT5TR1tpXS5BZGRyLnVwcGVyOworCQlwY2lfdW5tYXBfcGFnZShoLT5wZGV2LCB0ZW1wNjQudmFsLCBjbWQtPlNHW2ldLkxlbiwgZGRpcik7CisJfQorCisJY29tcGxldGVfYnVmZmVycyhycS0+YmlvLCBycS0+ZXJyb3JzKTsKKworI2lmZGVmIENDSVNTX0RFQlVHCisJcHJpbnRrKCJEb25lIHdpdGggJXBcbiIsIHJxKTsKKyNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLyAKKworCXNwaW5fbG9ja19pcnEoJmgtPmxvY2spOworCWVuZF90aGF0X3JlcXVlc3RfbGFzdChycSwgcnEtPmVycm9ycyk7CisJY21kX2ZyZWUoaCwgY21kLDEpOworCXNwaW5fdW5sb2NrX2lycSgmaC0+bG9jayk7Cit9CisKIC8qIGNoZWNrcyB0aGUgc3RhdHVzIG9mIHRoZSBqb2IgYW5kIGNhbGxzIGNvbXBsZXRlIGJ1ZmZlcnMgdG8gbWFyayBhbGwgCi0gKiBidWZmZXJzIGZvciB0aGUgY29tcGxldGVkIGpvYi4gCisgKiBidWZmZXJzIGZvciB0aGUgY29tcGxldGVkIGpvYi4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgbmVlZAorICogdG8gaG9sZCB0aGUgaGJhL3F1ZXVlIGxvY2suCiAgKi8gCiBzdGF0aWMgaW5saW5lIHZvaWQgY29tcGxldGVfY29tbWFuZCggY3Rscl9pbmZvX3QgKmgsIENvbW1hbmRMaXN0X3N0cnVjdCAqY21kLAogCQlpbnQgdGltZW91dCkKIHsKIAlpbnQgc3RhdHVzID0gMTsKLQlpbnQgaTsKIAlpbnQgcmV0cnlfY21kID0gMDsKLQl1NjRiaXQgdGVtcDY0OwogCQkKIAlpZiAodGltZW91dCkKIAkJc3RhdHVzID0gMDsgCkBAIC0yMjk0LDI0ICsyMzI3LDEwIEBACiAJCXJlc2VuZF9jY2lzc19jbWQoaCxjbWQpOwogCQlyZXR1cm47CiAJfQkKLQkvKiBjb21tYW5kIGRpZCBub3QgbmVlZCB0byBiZSByZXRyaWVkICovCi0JLyogdW5tYXAgdGhlIERNQSBtYXBwaW5nIGZvciBhbGwgdGhlIHNjYXR0ZXIgZ2F0aGVyIGVsZW1lbnRzICovCi0JZm9yKGk9MDsgaTxjbWQtPkhlYWRlci5TR0xpc3Q7IGkrKykgewotCQl0ZW1wNjQudmFsMzIubG93ZXIgPSBjbWQtPlNHW2ldLkFkZHIubG93ZXI7Ci0JCXRlbXA2NC52YWwzMi51cHBlciA9IGNtZC0+U0dbaV0uQWRkci51cHBlcjsKLQkJcGNpX3VubWFwX3BhZ2UoaGJhW2NtZC0+Y3Rscl0tPnBkZXYsCi0JCQl0ZW1wNjQudmFsLCBjbWQtPlNHW2ldLkxlbiwKLQkJCShjbWQtPlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gPT0gWEZFUl9SRUFEKSA/Ci0JCQkJUENJX0RNQV9GUk9NREVWSUNFIDogUENJX0RNQV9UT0RFVklDRSk7Ci0JfQotCWNvbXBsZXRlX2J1ZmZlcnMoY21kLT5ycS0+YmlvLCBzdGF0dXMpOwogCi0jaWZkZWYgQ0NJU1NfREVCVUcKLQlwcmludGsoIkRvbmUgd2l0aCAlcFxuIiwgY21kLT5ycSk7Ci0jZW5kaWYgLyogQ0NJU1NfREVCVUcgKi8gCi0KLQllbmRfdGhhdF9yZXF1ZXN0X2xhc3QoY21kLT5ycSwgc3RhdHVzID8gMSA6IC1FSU8pOwotCWNtZF9mcmVlKGgsY21kLDEpOworCWNtZC0+cnEtPmNvbXBsZXRpb25fZGF0YSA9IGNtZDsKKwljbWQtPnJxLT5lcnJvcnMgPSBzdGF0dXM7CisJYmxrX2NvbXBsZXRlX3JlcXVlc3QoY21kLT5ycSk7CiB9CiAKIC8qIApAQCAtMjY2MSw2ICsyNjgwLDYwIEBACiAJcmV0dXJuIC0xOwogfQogCisvKiBJZiBNU0kvTVNJLVggaXMgc3VwcG9ydGVkIGJ5IHRoZSBrZXJuZWwgd2Ugd2lsbCB0cnkgdG8gZW5hYmxlIGl0IG9uCisgKiBjb250cm9sbGVycyB0aGF0IGFyZSBjYXBhYmxlLiBJZiBub3QsIHdlIHVzZSBJTy1BUElDIG1vZGUuCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGNjaXNzX2ludGVycnVwdF9tb2RlKGN0bHJfaW5mb190ICpjLCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgX191MzIgYm9hcmRfaWQpCit7CisjaWZkZWYgQ09ORklHX1BDSV9NU0kKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgc3RydWN0IG1zaXhfZW50cnkgY2Npc3NfbXNpeF9lbnRyaWVzWzRdID0ge3swLDB9LCB7MCwxfSwKKwkJCQkJCSAgIHswLDJ9LCB7MCwzfX07CisKKwkvKiBTb21lIGJvYXJkcyBhZHZlcnRpc2UgTVNJIGJ1dCBkb24ndCByZWFsbHkgc3VwcG9ydCBpdCAqLworCWlmICgoYm9hcmRfaWQgPT0gMHg0MDcwMEUxMSkgfHwKKwkJKGJvYXJkX2lkID09IDB4NDA4MDBFMTEpIHx8CisJCShib2FyZF9pZCA9PSAweDQwODIwRTExKSB8fAorCQkoYm9hcmRfaWQgPT0gMHg0MDgzMEUxMSkpCisJCWdvdG8gZGVmYXVsdF9pbnRfbW9kZTsKKworICAgICAgICBpZiAocGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX01TSVgpKSB7CisgICAgICAgICAgICAgICAgZXJyID0gcGNpX2VuYWJsZV9tc2l4KHBkZXYsIGNjaXNzX21zaXhfZW50cmllcywgNCk7CisgICAgICAgICAgICAgICAgaWYgKCFlcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMtPmludHJbMF0gPSBjY2lzc19tc2l4X2VudHJpZXNbMF0udmVjdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgYy0+aW50clsxXSA9IGNjaXNzX21zaXhfZW50cmllc1sxXS52ZWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICBjLT5pbnRyWzJdID0gY2Npc3NfbXNpeF9lbnRyaWVzWzJdLnZlY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMtPmludHJbM10gPSBjY2lzc19tc2l4X2VudHJpZXNbM10udmVjdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgYy0+bXNpeF92ZWN0b3IgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZXJyID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IG9ubHkgJWQgTVNJLVggdmVjdG9ycyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF2YWlsYWJsZVxuIiwgZXJyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IE1TSS1YIGluaXQgZmFpbGVkICVkXG4iLAorCQkJCQkJZXJyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9NU0kpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFwY2lfZW5hYmxlX21zaShwZGV2KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYy0+aW50cltTSU1QTEVfTU9ERV9JTlRdID0gcGRldi0+aXJxOworICAgICAgICAgICAgICAgICAgICAgICAgYy0+bXNpX3ZlY3RvciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBNU0kgaW5pdCBmYWlsZWRcbiIpOworICAgICAgICAJCWMtPmludHJbU0lNUExFX01PREVfSU5UXSA9IHBkZXYtPmlycTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBDT05GSUdfUENJX01TSSAqLworCS8qIGlmIHdlIGdldCBoZXJlIHdlJ3JlIGdvaW5nIHRvIHVzZSB0aGUgZGVmYXVsdCBpbnRlcnJ1cHQgbW9kZSAqLworZGVmYXVsdF9pbnRfbW9kZToKKyAgICAgICAgYy0+aW50cltTSU1QTEVfTU9ERV9JTlRdID0gcGRldi0+aXJxOworCXJldHVybjsKK30KKwogc3RhdGljIGludCBjY2lzc19wY2lfaW5pdChjdGxyX2luZm9fdCAqYywgc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJdXNob3J0IHN1YnN5c3RlbV92ZW5kb3JfaWQsIHN1YnN5c3RlbV9kZXZpY2VfaWQsIGNvbW1hbmQ7CkBAIC0yNzIxLDcgKzI3OTQsMTAgQEAKIAlwcmludGsoImJvYXJkX2lkID0gJXhcbiIsIGJvYXJkX2lkKTsKICNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLyAKIAotCWMtPmludHIgPSBwZGV2LT5pcnE7CisvKiBJZiB0aGUga2VybmVsIHN1cHBvcnRzIE1TSS9NU0ktWCB3ZSB3aWxsIHRyeSB0byBlbmFibGUgdGhhdCBmdW5jdGlvbmFsaXR5LAorICogZWxzZSB3ZSB1c2UgdGhlIElPLUFQSUMgaW50ZXJydXB0IGFzc2lnbmVkIHRvIHVzIGJ5IHN5c3RlbSBST00uCisgKi8KKwljY2lzc19pbnRlcnJ1cHRfbW9kZShjLCBwZGV2LCBib2FyZF9pZCk7CiAKIAkvKgogCSAqIE1lbW9yeSBiYXNlIGFkZHIgaXMgZmlyc3QgYWRkciAsIHRoZSBzZWNvbmQgcG9pbnRzIHRvIHRoZSBjb25maWcKQEAgLTI3NzUsNyArMjg1MSw3IEBACiAJYy0+Ym9hcmRfaWQgPSBib2FyZF9pZDsKIAogI2lmZGVmIENDSVNTX0RFQlVHCi0JcHJpbnRfY2ZnX3RhYmxlKGMtPmNmZ3RhYmxlKTsgCisJcHJpbnRfY2ZnX3RhYmxlKGMtPmNmZ3RhYmxlKTsKICNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLwogCiAJZm9yKGk9MDsgaTxOUl9QUk9EVUNUUzsgaSsrKSB7CkBAIC0zMDYwLDcgKzMxMzYsNyBAQAogCSAqIDggY29udHJvbGxlciBzdXBwb3J0LgogCSAqLwogCWlmIChpIDwgTUFYX0NUTFJfT1JJRykKLQkJaGJhW2ldLT5tYWpvciA9IE1BSk9SX05SICsgaTsKKwkJaGJhW2ldLT5tYWpvciA9IENPTVBBUV9DSVNTX01BSk9SICsgaTsKIAlyYyA9IHJlZ2lzdGVyX2Jsa2RldihoYmFbaV0tPm1ham9yLCBoYmFbaV0tPmRldm5hbWUpOwogCWlmKHJjID09IC1FQlVTWSB8fCByYyA9PSAtRUlOVkFMKSB7CiAJCXByaW50ayhLRVJOX0VSUgpAQCAtMzA3NSwxMSArMzE1MSwxMSBAQAogCiAJLyogbWFrZSBzdXJlIHRoZSBib2FyZCBpbnRlcnJ1cHRzIGFyZSBvZmYgKi8KIAloYmFbaV0tPmFjY2Vzcy5zZXRfaW50cl9tYXNrKGhiYVtpXSwgQ0NJU1NfSU5UUl9PRkYpOwotCWlmKCByZXF1ZXN0X2lycShoYmFbaV0tPmludHIsIGRvX2NjaXNzX2ludHIsIAorCWlmKCByZXF1ZXN0X2lycShoYmFbaV0tPmludHJbU0lNUExFX01PREVfSU5UXSwgZG9fY2Npc3NfaW50ciwKIAkJU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEgfCBTQV9TQU1QTEVfUkFORE9NLCAKIAkJCWhiYVtpXS0+ZGV2bmFtZSwgaGJhW2ldKSkgewogCQlwcmludGsoS0VSTl9FUlIgImNjaXNzOiBVbmFibGUgdG8gZ2V0IGlycSAlZCBmb3IgJXNcbiIsCi0JCQloYmFbaV0tPmludHIsIGhiYVtpXS0+ZGV2bmFtZSk7CisJCQloYmFbaV0tPmludHJbU0lNUExFX01PREVfSU5UXSwgaGJhW2ldLT5kZXZuYW1lKTsKIAkJZ290byBjbGVhbjI7CiAJfQogCWhiYVtpXS0+Y21kX3Bvb2xfYml0cyA9IGttYWxsb2MoKChOUl9DTURTK0JJVFNfUEVSX0xPTkctMSkvQklUU19QRVJfTE9ORykqc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCBHRlBfS0VSTkVMKTsKQEAgLTMxNDEsMTUgKzMyMTcsMTcgQEAKIAkJZHJ2LT5xdWV1ZSA9IHE7CiAKIAkJcS0+YmFja2luZ19kZXZfaW5mby5yYV9wYWdlcyA9IFJFQURfQUhFQUQ7Ci0JYmxrX3F1ZXVlX2JvdW5jZV9saW1pdChxLCBoYmFbaV0tPnBkZXYtPmRtYV9tYXNrKTsKKwkJYmxrX3F1ZXVlX2JvdW5jZV9saW1pdChxLCBoYmFbaV0tPnBkZXYtPmRtYV9tYXNrKTsKIAotCS8qIFRoaXMgaXMgYSBoYXJkd2FyZSBpbXBvc2VkIGxpbWl0LiAqLwotCWJsa19xdWV1ZV9tYXhfaHdfc2VnbWVudHMocSwgTUFYU0dFTlRSSUVTKTsKKwkJLyogVGhpcyBpcyBhIGhhcmR3YXJlIGltcG9zZWQgbGltaXQuICovCisJCWJsa19xdWV1ZV9tYXhfaHdfc2VnbWVudHMocSwgTUFYU0dFTlRSSUVTKTsKIAotCS8qIFRoaXMgaXMgYSBsaW1pdCBpbiB0aGUgZHJpdmVyIGFuZCBjb3VsZCBiZSBlbGltaW5hdGVkLiAqLwotCWJsa19xdWV1ZV9tYXhfcGh5c19zZWdtZW50cyhxLCBNQVhTR0VOVFJJRVMpOworCQkvKiBUaGlzIGlzIGEgbGltaXQgaW4gdGhlIGRyaXZlciBhbmQgY291bGQgYmUgZWxpbWluYXRlZC4gKi8KKwkJYmxrX3F1ZXVlX21heF9waHlzX3NlZ21lbnRzKHEsIE1BWFNHRU5UUklFUyk7CiAKLQlibGtfcXVldWVfbWF4X3NlY3RvcnMocSwgNTEyKTsKKwkJYmxrX3F1ZXVlX21heF9zZWN0b3JzKHEsIDUxMik7CisKKwkJYmxrX3F1ZXVlX3NvZnRpcnFfZG9uZShxLCBjY2lzc19zb2Z0aXJxX2RvbmUpOwogCiAJCXEtPnF1ZXVlZGF0YSA9IGhiYVtpXTsKIAkJc3ByaW50ZihkaXNrLT5kaXNrX25hbWUsICJjY2lzcy9jJWRkJWQiLCBpLCBqKTsKQEAgLTMxODUsNyArMzI2Myw3IEBACiAJCQlOUl9DTURTICogc2l6ZW9mKCBFcnJvckluZm9fc3RydWN0KSwKIAkJCWhiYVtpXS0+ZXJyaW5mb19wb29sLAogCQkJaGJhW2ldLT5lcnJpbmZvX3Bvb2xfZGhhbmRsZSk7Ci0JZnJlZV9pcnEoaGJhW2ldLT5pbnRyLCBoYmFbaV0pOworCWZyZWVfaXJxKGhiYVtpXS0+aW50cltTSU1QTEVfTU9ERV9JTlRdLCBoYmFbaV0pOwogY2xlYW4yOgogCXVucmVnaXN0ZXJfYmxrZGV2KGhiYVtpXS0+bWFqb3IsIGhiYVtpXS0+ZGV2bmFtZSk7CiBjbGVhbjE6CkBAIC0zMjI2LDcgKzMzMDQsMTUgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiRXJyb3IgRmx1c2hpbmcgY2FjaGUgb24gY29udHJvbGxlciAlZFxuIiwgCiAJCQlpKTsKIAl9Ci0JZnJlZV9pcnEoaGJhW2ldLT5pbnRyLCBoYmFbaV0pOworCWZyZWVfaXJxKGhiYVtpXS0+aW50clsyXSwgaGJhW2ldKTsKKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisgICAgICAgIGlmIChoYmFbaV0tPm1zaXhfdmVjdG9yKQorICAgICAgICAgICAgICAgIHBjaV9kaXNhYmxlX21zaXgoaGJhW2ldLT5wZGV2KTsKKyAgICAgICAgZWxzZSBpZiAoaGJhW2ldLT5tc2lfdmVjdG9yKQorICAgICAgICAgICAgICAgIHBjaV9kaXNhYmxlX21zaShoYmFbaV0tPnBkZXYpOworI2VuZGlmIC8qIENPTkZJR19QQ0lfTVNJICovCisKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJaW91bm1hcChoYmFbaV0tPnZhZGRyKTsKIAljY2lzc191bnJlZ2lzdGVyX3Njc2koaSk7ICAvKiB1bmhvb2sgZnJvbSBTQ1NJIHN1YnN5c3RlbSAqLwpAQCAtMzI3NCw3ICszMzYwLDcgQEAKIAlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICJcbiIpOwogCiAJLyogUmVnaXN0ZXIgZm9yIG91ciBQQ0kgZGV2aWNlcyAqLwotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmNjaXNzX3BjaV9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZjY2lzc19wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGNjaXNzX2NsZWFudXAodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svY2Npc3MuaCBiL2RyaXZlcnMvYmxvY2svY2Npc3MuaAppbmRleCAzYjA4NThjLi5iMjRmYzA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmgKKysrIGIvZHJpdmVycy9ibG9jay9jY2lzcy5oCkBAIC0xMyw4ICsxMyw2IEBACiAjZGVmaW5lIElPX09LCQkwCiAjZGVmaW5lIElPX0VSUk9SCTEKIAotI2RlZmluZSBNQUpPUl9OUiBDT01QQVFfQ0lTU19NQUpPUgotCiBzdHJ1Y3QgY3Rscl9pbmZvOwogdHlwZWRlZiBzdHJ1Y3QgY3Rscl9pbmZvIGN0bHJfaW5mb190OwogCkBAIC02NSw3ICs2Myw2IEBACiAJdW5zaWduZWQgbG9uZyBpb19tZW1fYWRkcjsKIAl1bnNpZ25lZCBsb25nIGlvX21lbV9sZW5ndGg7CiAJQ2ZnVGFibGVfc3RydWN0IF9faW9tZW0gKmNmZ3RhYmxlOwotCXVuc2lnbmVkIGludCBpbnRyOwogCWludAlpbnRlcnJ1cHRzX2VuYWJsZWQ7CiAJaW50CW1ham9yOwogCWludCAJbWF4X2NvbW1hbmRzOwpAQCAtNzQsNiArNzEsMTMgQEAKIAlpbnQJbnVtX2x1bnM7CiAJaW50IAloaWdoZXN0X2x1bjsKIAlpbnQJdXNhZ2VfY291bnQ7ICAvKiBudW1iZXIgb2Ygb3BlbnMgYWxsIGFsbCBtaW5vciBkZXZpY2VzICovCisjCWRlZmluZSBET09SQkVMTF9JTlQJMAorIwlkZWZpbmUgUEVSRl9NT0RFX0lOVAkxCisjCWRlZmluZSBTSU1QTEVfTU9ERV9JTlQJMgorIwlkZWZpbmUgTUVNUV9NT0RFX0lOVAkzCisJdW5zaWduZWQgaW50IGludHJbNF07CisJdW5zaWduZWQgaW50IG1zaXhfdmVjdG9yOworCXVuc2lnbmVkIGludCBtc2lfdmVjdG9yOwogCiAJLy8gaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBsb2dpY2FsIHZvbHVtZQogCWRyaXZlX2luZm9fc3RydWN0IGRydltDSVNTX01BWF9MVU5dOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9jY2lzc19zY3NpLmMgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzX3Njc2kuYwppbmRleCAyOTQyZDMyLi45ZTM1ZGUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2NjaXNzX3Njc2kuYworKysgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzX3Njc2kuYwpAQCAtNzE0LDcgKzcxNCw3IEBACiAJKChzdHJ1Y3QgY2Npc3Nfc2NzaV9hZGFwdGVyX2RhdGFfdCAqKSAKIAkJaGJhW2N0bHJdLT5zY3NpX2N0bHIpLT5zY3NpX2hvc3QgPSAodm9pZCAqKSBzaDsKIAlzaC0+aG9zdGRhdGFbMF0gPSAodW5zaWduZWQgbG9uZykgaGJhW2N0bHJdOwotCXNoLT5pcnEgPSBoYmFbY3Rscl0tPmludHI7CisJc2gtPmlycSA9IGhiYVtjdGxyXS0+aW50cltTSU1QTEVfTU9ERV9JTlRdOwogCXNoLT51bmlxdWVfaWQgPSBzaC0+aXJxOwogCWVycm9yID0gc2NzaV9hZGRfaG9zdChzaCwgJmhiYVtjdGxyXS0+cGRldi0+ZGV2KTsKIAlpZiAoZXJyb3IpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NwcWFycmF5LmMgYi9kcml2ZXJzL2Jsb2NrL2NwcWFycmF5LmMKaW5kZXggOWJkZGI2OC4uODYyYjlhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jcHFhcnJheS5jCisrKyBiL2RyaXZlcnMvYmxvY2svY3BxYXJyYXkuYwpAQCAtNzIsMTEgKzcyLDExIEBACiAKIHN0YXRpYyBpbnQgZWlzYVs4XTsKIAotI2RlZmluZSBOUl9QUk9EVUNUUyAoc2l6ZW9mKHByb2R1Y3RzKS9zaXplb2Yoc3RydWN0IGJvYXJkX3R5cGUpKQorI2RlZmluZSBOUl9QUk9EVUNUUyBBUlJBWV9TSVpFKHByb2R1Y3RzKQogCiAvKiAgYm9hcmRfaWQgPSBTdWJzeXN0ZW0gRGV2aWNlIElEICYgVmVuZG9yIElECiAgKiAgcHJvZHVjdCA9IE1hcmtldGluZyBOYW1lIGZvciB0aGUgYm9hcmQKLSAqICBhY2Nlc3MgPSBBZGRyZXNzIG9mIHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gcG9pbnRlcnMgCisgKiAgYWNjZXNzID0gQWRkcmVzcyBvZiB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIHBvaW50ZXJzCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgYm9hcmRfdHlwZSBwcm9kdWN0c1tdID0gewogCXsgMHgwMDQwMTEwRSwgIklEQSIsCQkJJnNtYXJ0MV9hY2Nlc3MgfSwKQEAgLTE2MCw2ICsxNjAsNyBAQAogc3RhdGljIGludCBpZGFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXApOwogc3RhdGljIGludCBpZGFfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXApOwogc3RhdGljIGludCBpZGFfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IGlkYV9nZXRnZW8oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8pOwogc3RhdGljIGludCBpZGFfY3Rscl9pb2N0bChjdGxyX2luZm9fdCAqaCwgaW50IGRzaywgaWRhX2lvY3RsX3QgKmlvKTsKIAogc3RhdGljIHZvaWQgZG9faWRhX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxKTsKQEAgLTE5OSw2ICsyMDAsNyBAQAogCS5vcGVuCQk9IGlkYV9vcGVuLAogCS5yZWxlYXNlCT0gaWRhX3JlbGVhc2UsCiAJLmlvY3RsCQk9IGlkYV9pb2N0bCwKKwkuZ2V0Z2VvCQk9IGlkYV9nZXRnZW8sCiAJLnJldmFsaWRhdGVfZGlzaz0gaWRhX3JldmFsaWRhdGUsCiB9OwogCkBAIC0xMTI0LDYgKzExMjYsMjMgQEAKIAloLT5taXNjX3RmbGFncyA9IDA7CiB9CiAKK3N0YXRpYyBpbnQgaWRhX2dldGdlbyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbykKK3sKKwlkcnZfaW5mb190ICpkcnYgPSBnZXRfZHJ2KGJkZXYtPmJkX2Rpc2spOworCisJaWYgKGRydi0+Y3lsaW5kZXJzKSB7CisJCWdlby0+aGVhZHMgPSBkcnYtPmhlYWRzOworCQlnZW8tPnNlY3RvcnMgPSBkcnYtPnNlY3RvcnM7CisJCWdlby0+Y3lsaW5kZXJzID0gZHJ2LT5jeWxpbmRlcnM7CisJfSBlbHNlIHsKKwkJZ2VvLT5oZWFkcyA9IDB4ZmY7CisJCWdlby0+c2VjdG9ycyA9IDB4M2Y7CisJCWdlby0+Y3lsaW5kZXJzID0gZHJ2LT5ucl9ibGtzIC8gKDB4ZmYqMHgzZik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiAgaWRhX2lvY3RsIGRvZXMgc29tZSBtaXNjZWxsYW5lb3VzIHN0dWZmIGxpa2UgcmVwb3J0aW5nIGRyaXZlIGdlb21ldHJ5LAogICogIHNldHRpbmcgcmVhZGFoZWFkIGFuZCBzdWJtaXR0aW5nIGNvbW1hbmRzIGZyb20gdXNlcnNwYWNlIHRvIHRoZSBjb250cm9sbGVyLgpAQCAtMTEzMywyNyArMTE1MiwxMCBAQAogCWRydl9pbmZvX3QgKmRydiA9IGdldF9kcnYoaW5vZGUtPmlfYmRldi0+YmRfZGlzayk7CiAJY3Rscl9pbmZvX3QgKmhvc3QgPSBnZXRfaG9zdChpbm9kZS0+aV9iZGV2LT5iZF9kaXNrKTsKIAlpbnQgZXJyb3I7Ci0JaW50IGRpc2tpbmZvWzRdOwotCXN0cnVjdCBoZF9nZW9tZXRyeSBfX3VzZXIgKmdlbyA9IChzdHJ1Y3QgaGRfZ2VvbWV0cnkgX191c2VyICopYXJnOwogCWlkYV9pb2N0bF90IF9fdXNlciAqaW8gPSAoaWRhX2lvY3RsX3QgX191c2VyICopYXJnOwogCWlkYV9pb2N0bF90ICpteV9pbzsKIAogCXN3aXRjaChjbWQpIHsKLQljYXNlIEhESU9fR0VUR0VPOgotCQlpZiAoZHJ2LT5jeWxpbmRlcnMpIHsKLQkJCWRpc2tpbmZvWzBdID0gZHJ2LT5oZWFkczsKLQkJCWRpc2tpbmZvWzFdID0gZHJ2LT5zZWN0b3JzOwotCQkJZGlza2luZm9bMl0gPSBkcnYtPmN5bGluZGVyczsKLQkJfSBlbHNlIHsKLQkJCWRpc2tpbmZvWzBdID0gMHhmZjsKLQkJCWRpc2tpbmZvWzFdID0gMHgzZjsKLQkJCWRpc2tpbmZvWzJdID0gZHJ2LT5ucl9ibGtzIC8gKDB4ZmYqMHgzZik7Ci0JCX0KLQkJcHV0X3VzZXIoZGlza2luZm9bMF0sICZnZW8tPmhlYWRzKTsKLQkJcHV0X3VzZXIoZGlza2luZm9bMV0sICZnZW8tPnNlY3RvcnMpOwotCQlwdXRfdXNlcihkaXNraW5mb1syXSwgJmdlby0+Y3lsaW5kZXJzKTsKLQkJcHV0X3VzZXIoZ2V0X3N0YXJ0X3NlY3QoaW5vZGUtPmlfYmRldiksICZnZW8tPnN0YXJ0KTsKLQkJcmV0dXJuIDA7CiAJY2FzZSBJREFHRVREUlZJTkZPOgogCQlpZiAoY29weV90b191c2VyKCZpby0+Yy5kcnYsIGRydiwgc2l6ZW9mKGRydl9pbmZvX3QpKSkKIAkJCXJldHVybiAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9mbG9wcHkuYyBiL2RyaXZlcnMvYmxvY2svZmxvcHB5LmMKaW5kZXggYTViODU3Yy4uZDIzYjU0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9mbG9wcHkuYworKysgYi9kcml2ZXJzL2Jsb2NrL2Zsb3BweS5jCkBAIC0yNDIsNyArMjQyLDYgQEAKIAogc3RhdGljIGludCBpcnFkbWFfYWxsb2NhdGVkOwogCi0jZGVmaW5lIExPQ0FMX0VORF9SRVFVRVNUCiAjZGVmaW5lIERFVklDRV9OQU1FICJmbG9wcHkiCiAKICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KQEAgLTQ3OSw3ICs0NzgsNiBAQAogCXsgMzIwMCwyMCwyLDgwLDAsMHgxQywweDAwLDB4Q0YsMHgyQywiSDE2MDAiIH0sIC8qIDMxIDEuNk1CIDMuNSIgICAgKi8KIH07CiAKLSNkZWZpbmUJTlVNQkVSKHgpCShzaXplb2YoeCkgLyBzaXplb2YoKih4KSkpCiAjZGVmaW5lIFNFQ1RTSVpFIChfRkRfU0VDVFNJWkUoKmZsb3BweSkpCiAKIC8qIEF1dG8tZGV0ZWN0aW9uOiBEaXNrIHR5cGUgdXNlZCB1bnRpbCB0aGUgbmV4dCBtZWRpYSBjaGFuZ2Ugb2NjdXJzLiAqLwpAQCAtMzQ0NSw2ICszNDQzLDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZmRfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKQoreworCWludCBkcml2ZSA9IChsb25nKWJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKKwlpbnQgdHlwZSA9IElUWVBFKGRyaXZlX3N0YXRlW2RyaXZlXS5mZF9kZXZpY2UpOworCXN0cnVjdCBmbG9wcHlfc3RydWN0ICpnOworCWludCByZXQ7CisKKwlyZXQgPSBnZXRfZmxvcHB5X2dlb21ldHJ5KGRyaXZlLCB0eXBlLCAmZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWdlby0+aGVhZHMgPSBnLT5oZWFkOworCWdlby0+c2VjdG9ycyA9IGctPnNlY3Q7CisJZ2VvLT5jeWxpbmRlcnMgPSBnLT50cmFjazsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBmZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJICAgIHVuc2lnbmVkIGxvbmcgcGFyYW0pCiB7CkBAIC0zNDc0LDIzICszNDg5LDYgQEAKIAkJY21kID0gRkRFSkVDVDsKIAl9CiAKLQkvKiBnZW5lcmljIGJsb2NrIGRldmljZSBpb2N0bHMgKi8KLQlzd2l0Y2ggKGNtZCkgewotCQkvKiB0aGUgZm9sbG93aW5nIGhhdmUgYmVlbiBpbnNwaXJlZCBieSB0aGUgY29ycmVzcG9uZGluZwotCQkgKiBjb2RlIGZvciBvdGhlciBibG9jayBkZXZpY2VzLiAqLwotCQlzdHJ1Y3QgZmxvcHB5X3N0cnVjdCAqZzsKLQljYXNlIEhESU9fR0VUR0VPOgotCQl7Ci0JCQlzdHJ1Y3QgaGRfZ2VvbWV0cnkgbG9jOwotCQkJRUNBTEwoZ2V0X2Zsb3BweV9nZW9tZXRyeShkcml2ZSwgdHlwZSwgJmcpKTsKLQkJCWxvYy5oZWFkcyA9IGctPmhlYWQ7Ci0JCQlsb2Muc2VjdG9ycyA9IGctPnNlY3Q7Ci0JCQlsb2MuY3lsaW5kZXJzID0gZy0+dHJhY2s7Ci0JCQlsb2Muc3RhcnQgPSAwOwotCQkJcmV0dXJuIF9DT1BZT1VUKGxvYyk7Ci0JCX0KLQl9Ci0KIAkvKiBjb252ZXJ0IHRoZSBvbGQgc3R5bGUgY29tbWFuZCBpbnRvIGEgbmV3IHN0eWxlIGNvbW1hbmQgKi8KIAlpZiAoKGNtZCAmIDB4ZmYwMCkgPT0gMHgwMjAwKSB7CiAJCUVDQUxMKG5vcm1hbGl6ZV9pb2N0bCgmY21kLCAmc2l6ZSkpOwpAQCAtMzY0NSw3ICszNjQzLDcgQEAKIAkJY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CiAJCXN0YXRpYyBjaGFyIHRlbXBhcmVhWzMyXTsKIAotCQlpZiAodHlwZSA8IE5VTUJFUihkZWZhdWx0X2RyaXZlX3BhcmFtcykpIHsKKwkJaWYgKHR5cGUgPCBBUlJBWV9TSVpFKGRlZmF1bHRfZHJpdmVfcGFyYW1zKSkgewogCQkJcGFyYW1zID0gJmRlZmF1bHRfZHJpdmVfcGFyYW1zW3R5cGVdLnBhcmFtczsKIAkJCWlmICh0eXBlKSB7CiAJCQkJbmFtZSA9IGRlZmF1bHRfZHJpdmVfcGFyYW1zW3R5cGVdLm5hbWU7CkBAIC0zOTM4LDYgKzM5MzYsNyBAQAogCS5vcGVuCQk9IGZsb3BweV9vcGVuLAogCS5yZWxlYXNlCT0gZmxvcHB5X3JlbGVhc2UsCiAJLmlvY3RsCQk9IGZkX2lvY3RsLAorCS5nZXRnZW8JCT0gZmRfZ2V0Z2VvLAogCS5tZWRpYV9jaGFuZ2VkCT0gY2hlY2tfZmxvcHB5X2NoYW5nZSwKIAkucmV2YWxpZGF0ZV9kaXNrID0gZmxvcHB5X3JldmFsaWRhdGUsCiB9OwpAQCAtMzk2MCw3ICszOTU5LDcgQEAKIHsKIAlpbnQgYmFzZV9taW5vciA9IChkcml2ZSA8IDQpID8gZHJpdmUgOiAoMTI0ICsgZHJpdmUpOwogCi0JaWYgKFVEUC0+Y21vcyA8IE5VTUJFUihkZWZhdWx0X2RyaXZlX3BhcmFtcykpIHsKKwlpZiAoVURQLT5jbW9zIDwgQVJSQVlfU0laRShkZWZhdWx0X2RyaXZlX3BhcmFtcykpIHsKIAkJaW50IGkgPSAwOwogCQlkbyB7CiAJCQlpbnQgbWlub3IgPSBiYXNlX21pbm9yICsgKHRhYmxlX3N1cFtVRFAtPmNtb3NdW2ldIDw8IDIpOwpAQCAtNDIxOCw3ICs0MjE3LDcgQEAKIAkgICAgIShhbGxvd2VkX2RyaXZlX21hc2sgJiAoMSA8PCBkcml2ZSkpIHx8CiAJICAgIGZkY19zdGF0ZVtGREMoZHJpdmUpXS52ZXJzaW9uID09IEZEQ19OT05FKQogCQlyZXR1cm4gTlVMTDsKLQlpZiAoKCgqcGFydCA+PiAyKSAmIDB4MWYpID49IE5VTUJFUihmbG9wcHlfdHlwZSkpCisJaWYgKCgoKnBhcnQgPj4gMikgJiAweDFmKSA+PSBBUlJBWV9TSVpFKGZsb3BweV90eXBlKSkKIAkJcmV0dXJuIE5VTEw7CiAJKnBhcnQgPSAwOwogCXJldHVybiBnZXRfZGlzayhkaXNrc1tkcml2ZV0pOwpAQCAtNDU3MCw3ICs0NTY5LDcgQEAKIHsKIAlpbnQgaTsKIAotCWlmIChVRFAtPmNtb3MgPCBOVU1CRVIoZGVmYXVsdF9kcml2ZV9wYXJhbXMpKSB7CisJaWYgKFVEUC0+Y21vcyA8IEFSUkFZX1NJWkUoZGVmYXVsdF9kcml2ZV9wYXJhbXMpKSB7CiAJCWkgPSAwOwogCQlkbyB7CiAJCQlkZXZmc19yZW1vdmUoImZsb3BweS8lZCVzIiwgZHJpdmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2xvb3AuYyBiL2RyaXZlcnMvYmxvY2svbG9vcC5jCmluZGV4IGE0NTJiMTMuLjVmNmQxYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbG9vcC5jCisrKyBiL2RyaXZlcnMvYmxvY2svbG9vcC5jCkBAIC0yMTUsNyArMjE1LDcgQEAKIAl1bnNpZ25lZCBvZmZzZXQsIGJ2X29mZnM7CiAJaW50IGxlbiwgcmV0OwogCi0JZG93bigmbWFwcGluZy0+aG9zdC0+aV9zZW0pOworCW11dGV4X2xvY2soJm1hcHBpbmctPmhvc3QtPmlfbXV0ZXgpOwogCWluZGV4ID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJb2Zmc2V0ID0gcG9zICYgKChwZ29mZl90KVBBR0VfQ0FDSEVfU0laRSAtIDEpOwogCWJ2X29mZnMgPSBidmVjLT5idl9vZmZzZXQ7CkBAIC0yNzgsNyArMjc4LDcgQEAKIAl9CiAJcmV0ID0gMDsKIG91dDoKLQl1cCgmbWFwcGluZy0+aG9zdC0+aV9zZW0pOworCW11dGV4X3VubG9jaygmbWFwcGluZy0+aG9zdC0+aV9tdXRleCk7CiAJcmV0dXJuIHJldDsKIHVubG9jazoKIAl1bmxvY2tfcGFnZShwYWdlKTsKQEAgLTI5NCw3ICsyOTQsNyBAQAogICogVGhpcyBoZWxwZXIganVzdCBmYWN0b3JzIG91dCBjb21tb24gY29kZSBiZXR3ZWVuIGRvX2xvX3NlbmRfZGlyZWN0X3dyaXRlKCkKICAqIGFuZCBkb19sb19zZW5kX3dyaXRlKCkuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fZG9fbG9fc2VuZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKK3N0YXRpYyBpbnQgX19kb19sb19zZW5kX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAogCQl1OCBfX3VzZXIgKmJ1ZiwgY29uc3QgaW50IGxlbiwgbG9mZl90IHBvcykKIHsKIAlzc2l6ZV90IGJ3OwpAQCAtNTI3LDEyICs1MjcsMTIgQEAKIAlsby0+bG9fcGVuZGluZysrOwogCWxvb3BfYWRkX2Jpbyhsbywgb2xkX2Jpbyk7CiAJc3Bpbl91bmxvY2tfaXJxKCZsby0+bG9fbG9jayk7Ci0JdXAoJmxvLT5sb19iaF9tdXRleCk7CisJY29tcGxldGUoJmxvLT5sb19iaF9kb25lKTsKIAlyZXR1cm4gMDsKIAogb3V0OgogCWlmIChsby0+bG9fcGVuZGluZyA9PSAwKQotCQl1cCgmbG8tPmxvX2JoX211dGV4KTsKKwkJY29tcGxldGUoJmxvLT5sb19iaF9kb25lKTsKIAlzcGluX3VubG9ja19pcnEoJmxvLT5sb19sb2NrKTsKIAliaW9faW9fZXJyb3Iob2xkX2Jpbywgb2xkX2Jpby0+Ymlfc2l6ZSk7CiAJcmV0dXJuIDA7CkBAIC01OTMsMjMgKzU5MywyMCBAQAogCWxvLT5sb19wZW5kaW5nID0gMTsKIAogCS8qCi0JICogdXAgc2VtLCB3ZSBhcmUgcnVubmluZworCSAqIGNvbXBsZXRlIGl0LCB3ZSBhcmUgcnVubmluZwogCSAqLwotCXVwKCZsby0+bG9fc2VtKTsKKwljb21wbGV0ZSgmbG8tPmxvX2RvbmUpOwogCiAJZm9yICg7OykgewogCQlpbnQgcGVuZGluZzsKIAotCQkvKgotCQkgKiBpbnRlcnJ1cHRpYmxlIGp1c3QgdG8gbm90IGNvbnRyaWJ1dGUgdG8gbG9hZCBhdmcKLQkJICovCi0JCWlmIChkb3duX2ludGVycnVwdGlibGUoJmxvLT5sb19iaF9tdXRleCkpCisJCWlmICh3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJmxvLT5sb19iaF9kb25lKSkKIAkJCWNvbnRpbnVlOwogCiAJCXNwaW5fbG9ja19pcnEoJmxvLT5sb19sb2NrKTsKIAogCQkvKgotCQkgKiBjb3VsZCBiZSB1cHBlZCBiZWNhdXNlIG9mIHRlYXItZG93biwgbm90IHBlbmRpbmcgd29yaworCQkgKiBjb3VsZCBiZSBjb21wbGV0ZWQgYmVjYXVzZSBvZiB0ZWFyLWRvd24sIG5vdCBwZW5kaW5nIHdvcmsKIAkJICovCiAJCWlmICh1bmxpa2VseSghbG8tPmxvX3BlbmRpbmcpKSB7CiAJCQlzcGluX3VubG9ja19pcnEoJmxvLT5sb19sb2NrKTsKQEAgLTYzMiw3ICs2MjksNyBAQAogCQkJYnJlYWs7CiAJfQogCi0JdXAoJmxvLT5sb19zZW0pOworCWNvbXBsZXRlKCZsby0+bG9fZG9uZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg0Myw3ICs4NDAsNyBAQAogCXNldF9ibG9ja3NpemUoYmRldiwgbG9fYmxvY2tzaXplKTsKIAogCWtlcm5lbF90aHJlYWQobG9vcF90aHJlYWQsIGxvLCBDTE9ORV9LRVJORUwpOwotCWRvd24oJmxvLT5sb19zZW0pOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmxvLT5sb19kb25lKTsKIAlyZXR1cm4gMDsKIAogIG91dF9wdXRmOgpAQCAtOTA5LDEwICs5MDYsMTAgQEAKIAlsby0+bG9fc3RhdGUgPSBMb19ydW5kb3duOwogCWxvLT5sb19wZW5kaW5nLS07CiAJaWYgKCFsby0+bG9fcGVuZGluZykKLQkJdXAoJmxvLT5sb19iaF9tdXRleCk7CisJCWNvbXBsZXRlKCZsby0+bG9fYmhfZG9uZSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZsby0+bG9fbG9jayk7CiAKLQlkb3duKCZsby0+bG9fc2VtKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZsby0+bG9fZG9uZSk7CiAKIAlsby0+bG9fYmFja2luZ19maWxlID0gTlVMTDsKIApAQCAtMTI4OSw4ICsxMjg2LDggQEAKIAkJaWYgKCFsby0+bG9fcXVldWUpCiAJCQlnb3RvIG91dF9tZW00OwogCQlpbml0X01VVEVYKCZsby0+bG9fY3RsX211dGV4KTsKLQkJaW5pdF9NVVRFWF9MT0NLRUQoJmxvLT5sb19zZW0pOwotCQlpbml0X01VVEVYX0xPQ0tFRCgmbG8tPmxvX2JoX211dGV4KTsKKwkJaW5pdF9jb21wbGV0aW9uKCZsby0+bG9fZG9uZSk7CisJCWluaXRfY29tcGxldGlvbigmbG8tPmxvX2JoX2RvbmUpOwogCQlsby0+bG9fbnVtYmVyID0gaTsKIAkJc3Bpbl9sb2NrX2luaXQoJmxvLT5sb19sb2NrKTsKIAkJZGlzay0+bWFqb3IgPSBMT09QX01BSk9SOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9uYmQuYyBiL2RyaXZlcnMvYmxvY2svbmJkLmMKaW5kZXggMzNkNmYyMy4uNjk5N2Q4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9uYmQuYworKysgYi9kcml2ZXJzL2Jsb2NrL25iZC5jCkBAIC0xNzQsNyArMTc0LDYgQEAKIAkJbXNnLm1zZ19uYW1lbGVuID0gMDsKIAkJbXNnLm1zZ19jb250cm9sID0gTlVMTDsKIAkJbXNnLm1zZ19jb250cm9sbGVuID0gMDsKLQkJbXNnLm1zZ19uYW1lbGVuID0gMDsKIAkJbXNnLm1zZ19mbGFncyA9IG1zZ19mbGFncyB8IE1TR19OT1NJR05BTDsKIAogCQlpZiAoc2VuZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BkLmMgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wZC5jCmluZGV4IGZhNDlkNjIuLjYyZDI0NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BkLmMKKysrIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvcGQuYwpAQCAtNzQ3LDMyICs3NDcsMzMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBwZF9nZXRnZW8oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8pCit7CisJc3RydWN0IHBkX3VuaXQgKmRpc2sgPSBiZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoZGlzay0+YWx0X2dlb20pIHsKKwkJZ2VvLT5oZWFkcyA9IFBEX0xPR19IRUFEUzsKKwkJZ2VvLT5zZWN0b3JzID0gUERfTE9HX1NFQ1RTOworCQlnZW8tPmN5bGluZGVycyA9IGRpc2stPmNhcGFjaXR5IC8gKGdlby0+aGVhZHMgKiBnZW8tPnNlY3RvcnMpOworCX0gZWxzZSB7CisJCWdlby0+aGVhZHMgPSBkaXNrLT5oZWFkczsKKwkJZ2VvLT5zZWN0b3JzID0gZGlzay0+c2VjdG9yczsKKwkJZ2VvLT5jeWxpbmRlcnMgPSBkaXNrLT5jeWxpbmRlcnM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgcGRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBwZF91bml0ICpkaXNrID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBoZF9nZW9tZXRyeSBfX3VzZXIgKmdlbyA9IChzdHJ1Y3QgaGRfZ2VvbWV0cnkgX191c2VyICopIGFyZzsKLQlzdHJ1Y3QgaGRfZ2VvbWV0cnkgZzsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBDRFJPTUVKRUNUOgogCQlpZiAoZGlzay0+YWNjZXNzID09IDEpCiAJCQlwZF9zcGVjaWFsX2NvbW1hbmQoZGlzaywgcGRfZWplY3QpOwogCQlyZXR1cm4gMDsKLQljYXNlIEhESU9fR0VUR0VPOgotCQlpZiAoZGlzay0+YWx0X2dlb20pIHsKLQkJCWcuaGVhZHMgPSBQRF9MT0dfSEVBRFM7Ci0JCQlnLnNlY3RvcnMgPSBQRF9MT0dfU0VDVFM7Ci0JCQlnLmN5bGluZGVycyA9IGRpc2stPmNhcGFjaXR5IC8gKGcuaGVhZHMgKiBnLnNlY3RvcnMpOwotCQl9IGVsc2UgewotCQkJZy5oZWFkcyA9IGRpc2stPmhlYWRzOwotCQkJZy5zZWN0b3JzID0gZGlzay0+c2VjdG9yczsKLQkJCWcuY3lsaW5kZXJzID0gZGlzay0+Y3lsaW5kZXJzOwotCQl9Ci0JCWcuc3RhcnQgPSBnZXRfc3RhcnRfc2VjdChpbm9kZS0+aV9iZGV2KTsKLQkJaWYgKGNvcHlfdG9fdXNlcihnZW8sICZnLCBzaXplb2Yoc3RydWN0IGhkX2dlb21ldHJ5KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtODE1LDYgKzgxNiw3IEBACiAJLm9wZW4JCT0gcGRfb3BlbiwKIAkucmVsZWFzZQk9IHBkX3JlbGVhc2UsCiAJLmlvY3RsCQk9IHBkX2lvY3RsLAorCS5nZXRnZW8JCT0gcGRfZ2V0Z2VvLAogCS5tZWRpYV9jaGFuZ2VkCT0gcGRfY2hlY2tfbWVkaWEsCiAJLnJldmFsaWRhdGVfZGlzaz0gcGRfcmV2YWxpZGF0ZQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BmLmMgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wZi5jCmluZGV4IGU5NzQ2YWYyLi44NTJiNTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wZi5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BmLmMKQEAgLTIwNSw2ICsyMDUsNyBAQAogc3RhdGljIHZvaWQgZG9fcGZfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKiBxKTsKIHN0YXRpYyBpbnQgcGZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IHBmX2dldGdlbyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbyk7CiAKIHN0YXRpYyBpbnQgcGZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiAKQEAgLTI2Niw2ICsyNjcsNyBAQAogCS5vcGVuCQk9IHBmX29wZW4sCiAJLnJlbGVhc2UJPSBwZl9yZWxlYXNlLAogCS5pb2N0bAkJPSBwZl9pb2N0bCwKKwkuZ2V0Z2VvCQk9IHBmX2dldGdlbywKIAkubWVkaWFfY2hhbmdlZAk9IHBmX2NoZWNrX21lZGlhLAogfTsKIApAQCAtMzEzLDM0ICszMTUsMzQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBwZl9nZXRnZW8oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8pCit7CisJc3RydWN0IHBmX3VuaXQgKnBmID0gYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOworCXNlY3Rvcl90IGNhcGFjaXR5ID0gZ2V0X2NhcGFjaXR5KHBmLT5kaXNrKTsKKworCWlmIChjYXBhY2l0eSA8IFBGX0ZEX01BWCkgeworCQlnZW8tPmN5bGluZGVycyA9IHNlY3Rvcl9kaXYoY2FwYWNpdHksIFBGX0ZEX0hEUyAqIFBGX0ZEX1NQVCk7CisJCWdlby0+aGVhZHMgPSBQRl9GRF9IRFM7CisJCWdlby0+c2VjdG9ycyA9IFBGX0ZEX1NQVDsKKwl9IGVsc2UgeworCQlnZW8tPmN5bGluZGVycyA9IHNlY3Rvcl9kaXYoY2FwYWNpdHksIFBGX0hEX0hEUyAqIFBGX0hEX1NQVCk7CisJCWdlby0+aGVhZHMgPSBQRl9IRF9IRFM7CisJCWdlby0+c2VjdG9ycyA9IFBGX0hEX1NQVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBwZl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IHBmX3VuaXQgKnBmID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBoZF9nZW9tZXRyeSBfX3VzZXIgKmdlbyA9IChzdHJ1Y3QgaGRfZ2VvbWV0cnkgX191c2VyICopIGFyZzsKLQlzdHJ1Y3QgaGRfZ2VvbWV0cnkgZzsKLQlzZWN0b3JfdCBjYXBhY2l0eTsKIAotCWlmIChjbWQgPT0gQ0RST01FSkVDVCkgewotCQlpZiAocGYtPmFjY2VzcyA9PSAxKSB7Ci0JCQlwZl9lamVjdChwZik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQlpZiAoY21kICE9IEhESU9fR0VUR0VPKQorCWlmIChjbWQgIT0gQ0RST01FSkVDVCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JY2FwYWNpdHkgPSBnZXRfY2FwYWNpdHkocGYtPmRpc2spOwotCWlmIChjYXBhY2l0eSA8IFBGX0ZEX01BWCkgewotCQlnLmN5bGluZGVycyA9IHNlY3Rvcl9kaXYoY2FwYWNpdHksIFBGX0ZEX0hEUyAqIFBGX0ZEX1NQVCk7Ci0JCWcuaGVhZHMgPSBQRl9GRF9IRFM7Ci0JCWcuc2VjdG9ycyA9IFBGX0ZEX1NQVDsKLQl9IGVsc2UgewotCQlnLmN5bGluZGVycyA9IHNlY3Rvcl9kaXYoY2FwYWNpdHksIFBGX0hEX0hEUyAqIFBGX0hEX1NQVCk7Ci0JCWcuaGVhZHMgPSBQRl9IRF9IRFM7Ci0JCWcuc2VjdG9ycyA9IFBGX0hEX1NQVDsKLQl9Ci0JaWYgKGNvcHlfdG9fdXNlcihnZW8sICZnLCBzaXplb2YoZykpKQotCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChwZi0+YWNjZXNzICE9IDEpCisJCXJldHVybiAtRUJVU1k7CisJcGZfZWplY3QocGYpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYyBiL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCmluZGV4IGMwMjMzZWYuLjkzYWZmZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCkBAIC0yNDcsNyArMjQ3LDcgQEAKIAlyZXR1cm4gcmJfZW50cnkobiwgc3RydWN0IHBrdF9yYl9ub2RlLCByYl9ub2RlKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBrdF9yYnRyZWVfZXJhc2Uoc3RydWN0IHBrdGNkdmRfZGV2aWNlICpwZCwgc3RydWN0IHBrdF9yYl9ub2RlICpub2RlKQorc3RhdGljIHZvaWQgcGt0X3JidHJlZV9lcmFzZShzdHJ1Y3QgcGt0Y2R2ZF9kZXZpY2UgKnBkLCBzdHJ1Y3QgcGt0X3JiX25vZGUgKm5vZGUpCiB7CiAJcmJfZXJhc2UoJm5vZGUtPnJiX25vZGUsICZwZC0+YmlvX3F1ZXVlKTsKIAltZW1wb29sX2ZyZWUobm9kZSwgcGQtPnJiX3Bvb2wpOwpAQCAtMzE1LDcgKzMxNSw3IEBACiAvKgogICogQWRkIGEgYmlvIHRvIGEgc2luZ2xlIGxpbmtlZCBsaXN0IGRlZmluZWQgYnkgaXRzIGhlYWQgYW5kIHRhaWwgcG9pbnRlcnMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBwa3RfYWRkX2xpc3RfbGFzdChzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBiaW8gKipsaXN0X2hlYWQsIHN0cnVjdCBiaW8gKipsaXN0X3RhaWwpCitzdGF0aWMgdm9pZCBwa3RfYWRkX2xpc3RfbGFzdChzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBiaW8gKipsaXN0X2hlYWQsIHN0cnVjdCBiaW8gKipsaXN0X3RhaWwpCiB7CiAJYmlvLT5iaV9uZXh0ID0gTlVMTDsKIAlpZiAoKmxpc3RfdGFpbCkgewpAQCAtMTk1NSw5ICsxOTU1LDEyIEBACiAJaWYgKChyZXQgPSBibGtkZXZfZ2V0KHBkLT5iZGV2LCBGTU9ERV9SRUFELCBPX1JET05MWSkpKQogCQlnb3RvIG91dDsKIAorCWlmICgocmV0ID0gYmRfY2xhaW0ocGQtPmJkZXYsIHBkKSkpCisJCWdvdG8gb3V0X3B1dGRldjsKKwogCWlmICgocmV0ID0gcGt0X2dldF9sYXN0X3dyaXR0ZW4ocGQsICZsYmEpKSkgewogCQlwcmludGsoInBrdGNkdmQ6IHBrdF9nZXRfbGFzdF93cml0dGVuIGZhaWxlZFxuIik7Ci0JCWdvdG8gb3V0X3B1dGRldjsKKwkJZ290byBvdXRfdW5jbGFpbTsKIAl9CiAKIAlzZXRfY2FwYWNpdHkocGQtPmRpc2ssIGxiYSA8PCAyKTsKQEAgLTE5NjcsNyArMTk3MCw3IEBACiAJcSA9IGJkZXZfZ2V0X3F1ZXVlKHBkLT5iZGV2KTsKIAlpZiAod3JpdGUpIHsKIAkJaWYgKChyZXQgPSBwa3Rfb3Blbl93cml0ZShwZCkpKQotCQkJZ290byBvdXRfcHV0ZGV2OworCQkJZ290byBvdXRfdW5jbGFpbTsKIAkJLyoKIAkJICogU29tZSBDRFJXIGRyaXZlcyBjYW4gbm90IGhhbmRsZSB3cml0ZXMgbGFyZ2VyIHRoYW4gb25lIHBhY2tldCwKIAkJICogZXZlbiBpZiB0aGUgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIHRoZSBwYWNrZXQgc2l6ZS4KQEAgLTE5ODIsMTMgKzE5ODUsMTUgQEAKIAl9CiAKIAlpZiAoKHJldCA9IHBrdF9zZXRfc2VnbWVudF9tZXJnaW5nKHBkLCBxKSkpCi0JCWdvdG8gb3V0X3B1dGRldjsKKwkJZ290byBvdXRfdW5jbGFpbTsKIAogCWlmICh3cml0ZSkKIAkJcHJpbnRrKCJwa3RjZHZkOiAlbHVrQiBhdmFpbGFibGUgb24gZGlzY1xuIiwgbGJhIDw8IDEpOwogCiAJcmV0dXJuIDA7CiAKK291dF91bmNsYWltOgorCWJkX3JlbGVhc2UocGQtPmJkZXYpOwogb3V0X3B1dGRldjoKIAlibGtkZXZfcHV0KHBkLT5iZGV2KTsKIG91dDoKQEAgLTIwMDcsNiArMjAxMiw3IEBACiAJcGt0X2xvY2tfZG9vcihwZCwgMCk7CiAKIAlwa3Rfc2V0X3NwZWVkKHBkLCBNQVhfU1BFRUQsIE1BWF9TUEVFRCk7CisJYmRfcmVsZWFzZShwZC0+YmRldik7CiAJYmxrZGV2X3B1dChwZC0+YmRldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcHMyZXNkaS5jIGIvZHJpdmVycy9ibG9jay9wczJlc2RpLmMKaW5kZXggMjlkMTUxOC4uYmVhNzVmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9wczJlc2RpLmMKKysrIGIvZHJpdmVycy9ibG9jay9wczJlc2RpLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTgxLDggKzgyLDcgQEAKIHN0YXRpYyB2b2lkIHBzMmVzZGlfbm9ybWFsX2ludGVycnVwdF9oYW5kbGVyKHVfaW50KTsKIHN0YXRpYyB2b2lkIHBzMmVzZGlfaW5pdGlhbF9yZXNldF9pbnRfaGFuZGxlcih1X2ludCk7CiBzdGF0aWMgdm9pZCBwczJlc2RpX2dlb21ldHJ5X2ludF9oYW5kbGVyKHVfaW50KTsKLXN0YXRpYyBpbnQgcHMyZXNkaV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSB1X2ludCBjbWQsIHVfbG9uZyBhcmcpOworc3RhdGljIGludCBwczJlc2RpX2dldGdlbyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbyk7CiAKIHN0YXRpYyBpbnQgcHMyZXNkaV9yZWFkX3N0YXR1c193b3JkcyhpbnQgbnVtX3dvcmRzLCBpbnQgbWF4X3dvcmRzLCB1X3Nob3J0ICogYnVmZmVyKTsKIApAQCAtMTMyLDcgKzEzMiw3IEBACiBzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIHBzMmVzZGlfZm9wcyA9CiB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5pb2N0bAkJPSBwczJlc2RpX2lvY3RsLAorCS5nZXRnZW8JCT0gcHMyZXNkaV9nZXRnZW8sCiB9OwogCiBzdGF0aWMgc3RydWN0IGdlbmRpc2sgKnBzMmVzZGlfZ2VuZGlza1syXTsKQEAgLTEwNTgsMjEgKzEwNTgsMTMgQEAKIAogfQogCi1zdGF0aWMgaW50IHBzMmVzZGlfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZSwgdV9pbnQgY21kLCB1X2xvbmcgYXJnKQorc3RhdGljIGludCBwczJlc2RpX2dldGdlbyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbykKIHsKLQlzdHJ1Y3QgcHMyZXNkaV9pX3N0cnVjdCAqcCA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgcHMyZXNkaV9nZW9tZXRyeSBnZW9tOworCXN0cnVjdCBwczJlc2RpX2lfc3RydWN0ICpwID0gYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwogCi0JaWYgKGNtZCAhPSBIRElPX0dFVEdFTykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JbWVtc2V0KCZnZW9tLCAwLCBzaXplb2YoZ2VvbSkpOwotCWdlb20uaGVhZHMgPSBwLT5oZWFkOwotCWdlb20uc2VjdG9ycyA9IHAtPnNlY3Q7Ci0JZ2VvbS5jeWxpbmRlcnMgPSBwLT5jeWw7Ci0JZ2VvbS5zdGFydCA9IGdldF9zdGFydF9zZWN0KGlub2RlLT5pX2JkZXYpOwotCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmZ2VvbSwgc2l6ZW9mKGdlb20pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJZ2VvLT5oZWFkcyA9IHAtPmhlYWQ7CisJZ2VvLT5zZWN0b3JzID0gcC0+c2VjdDsKKwlnZW8tPmN5bGluZGVycyA9IHAtPmN5bDsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9zd2ltMy5jIGIvZHJpdmVycy9ibG9jay9zd2ltMy5jCmluZGV4IGFmN2NiMmIuLjAxZjA0MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svc3dpbTMuYworKysgYi9kcml2ZXJzL2Jsb2NrL3N3aW0zLmMKQEAgLTEwODMsMjMgKzEwODMsMzMgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm1lZGlhYmF5OwogCXN0cnVjdCBmbG9wcHlfc3RhdGUgKmZzID0gJmZsb3BweV9zdGF0ZXNbZmxvcHB5X2NvdW50XTsKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzX3JlZywgcmVzX2RtYTsKIAotCWlmIChzd2ltLT5uX2FkZHJzIDwgMikKLQl7Ci0JCXByaW50ayhLRVJOX0lORk8gInN3aW0zOiBleHBlY3RpbmcgMiBhZGRycyAobl9hZGRyczolZCwgbl9pbnRyczolZClcbiIsCi0JCSAgICAgICBzd2ltLT5uX2FkZHJzLCBzd2ltLT5uX2ludHJzKTsKKwlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShzd2ltLCAwLCAmcmVzX3JlZykgfHwKKwkgICAgb2ZfYWRkcmVzc190b19yZXNvdXJjZShzd2ltLCAxLCAmcmVzX2RtYSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzd2ltMzogQ2FuJ3QgZ2V0IGFkZHJlc3Nlc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocmVxdWVzdF9tZW1fcmVnaW9uKHJlc19yZWcuc3RhcnQsIHJlc19yZWcuZW5kIC0gcmVzX3JlZy5zdGFydCArIDEsCisJCQkgICAgICAgIiAocmVnKSIpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzd2ltMzogQ2FuJ3QgcmVxdWVzdCByZWdpc3RlciBzcGFjZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocmVxdWVzdF9tZW1fcmVnaW9uKHJlc19kbWEuc3RhcnQsIHJlc19kbWEuZW5kIC0gcmVzX2RtYS5zdGFydCArIDEsCisJCQkgICAgICAgIiAoZG1hKSIpID09IE5VTEwpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHJlc19yZWcuc3RhcnQsCisJCQkJICAgcmVzX3JlZy5lbmQgLSByZXNfcmVnLnN0YXJ0ICsgMSk7CisJCXByaW50ayhLRVJOX0VSUiAic3dpbTM6IENhbid0IHJlcXVlc3QgRE1BIHNwYWNlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKHN3aW0tPm5faW50cnMgPCAyKQotCXsKLQkJcHJpbnRrKEtFUk5fSU5GTyAic3dpbTM6IGV4cGVjdGluZyAyIGludHJzIChuX2FkZHJzOiVkLCBuX2ludHJzOiVkKVxuIiwKLQkJICAgICAgIHN3aW0tPm5fYWRkcnMsIHN3aW0tPm5faW50cnMpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIXJlcXVlc3RfT0ZfcmVzb3VyY2Uoc3dpbSwgMCwgTlVMTCkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAic3dpbTM6IGNhbid0IHJlcXVlc3QgSU8gcmVzb3VyY2UgIVxuIik7CisJaWYgKHN3aW0tPm5faW50cnMgPCAyKSB7CisJCXByaW50ayhLRVJOX0lORk8gInN3aW0zOiBleHBlY3RpbmcgMiBpbnRycyAobl9pbnRyczolZClcbiIsCisJCSAgICAgICBzd2ltLT5uX2ludHJzKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHJlc19yZWcuc3RhcnQsCisJCQkJICAgcmVzX3JlZy5lbmQgLSByZXNfcmVnLnN0YXJ0ICsgMSk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXNfZG1hLnN0YXJ0LAorCQkJCSAgIHJlc19kbWEuZW5kIC0gcmVzX2RtYS5zdGFydCArIDEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTExMTAsMTAgKzExMjAsOCBAQAogCW1lbXNldChmcywgMCwgc2l6ZW9mKCpmcykpOwogCXNwaW5fbG9ja19pbml0KCZmcy0+bG9jayk7CiAJZnMtPnN0YXRlID0gaWRsZTsKLQlmcy0+c3dpbTMgPSAoc3RydWN0IHN3aW0zIF9faW9tZW0gKikKLQkJaW9yZW1hcChzd2ltLT5hZGRyc1swXS5hZGRyZXNzLCAweDIwMCk7Ci0JZnMtPmRtYSA9IChzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICopCi0JCWlvcmVtYXAoc3dpbS0+YWRkcnNbMV0uYWRkcmVzcywgMHgyMDApOworCWZzLT5zd2ltMyA9IChzdHJ1Y3Qgc3dpbTMgX19pb21lbSAqKWlvcmVtYXAocmVzX3JlZy5zdGFydCwgMHgyMDApOworCWZzLT5kbWEgPSAoc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqKWlvcmVtYXAocmVzX2RtYS5zdGFydCwgMHgyMDApOwogCWZzLT5zd2ltM19pbnRyID0gc3dpbS0+aW50cnNbMF0ubGluZTsKIAlmcy0+ZG1hX2ludHIgPSBzd2ltLT5pbnRyc1sxXS5saW5lOwogCWZzLT5jdXJfY3lsID0gLTE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3N4OC5jIGIvZHJpdmVycy9ibG9jay9zeDguYwppbmRleCA5MjUxZjQxLi4yYWUwOGIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3N4OC5jCisrKyBiL2RyaXZlcnMvYmxvY2svc3g4LmMKQEAgLTI3LDggKzI3LDggQEAKICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogI2lmIDAKQEAgLTMwMyw3ICszMDMsNyBAQAogCiAJc3RydWN0IHdvcmtfc3RydWN0CQlmc21fdGFzazsKIAotCXN0cnVjdCBzZW1hcGhvcmUJCXByb2JlX3NlbTsKKwlzdHJ1Y3QgY29tcGxldGlvbgkJcHJvYmVfY29tcDsKIH07CiAKIHN0cnVjdCBjYXJtX3Jlc3BvbnNlIHsKQEAgLTQwNyw4ICs0MDcsNyBAQAogCiBzdGF0aWMgaW50IGNhcm1faW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKIHN0YXRpYyB2b2lkIGNhcm1fcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwotc3RhdGljIGludCBjYXJtX2JkZXZfaW9jdGwoc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBmaWxlICpmaWwsCi0JCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IGNhcm1fYmRldl9nZXRnZW8oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8pOwogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY2FybV9wY2lfdGJsW10gPSB7CiAJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIDB4ODAwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgfSwKQEAgLTQyNiw3ICs0MjUsNyBAQAogCiBzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIGNhcm1fYmRfb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkuaW9jdGwJCT0gY2FybV9iZGV2X2lvY3RsLAorCS5nZXRnZW8JCT0gY2FybV9iZGV2X2dldGdlbywKIH07CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgY2FybV9ob3N0X2lkOwpAQCAtNDM0LDMyICs0MzMsMTQgQEAKIAogCiAKLXN0YXRpYyBpbnQgY2FybV9iZGV2X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgZmlsZSAqZmlsLAotCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgaW50IGNhcm1fYmRldl9nZXRnZW8oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8pCiB7Ci0Jdm9pZCBfX3VzZXIgKnVzZXJtZW0gPSAodm9pZCBfX3VzZXIgKikgYXJnOwotCXN0cnVjdCBjYXJtX3BvcnQgKnBvcnQgPSBpbm8tPmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBoZF9nZW9tZXRyeSBnZW9tOworCXN0cnVjdCBjYXJtX3BvcnQgKnBvcnQgPSBiZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CiAKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgSERJT19HRVRHRU86Ci0JCWlmICghdXNlcm1lbSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWdlb20uaGVhZHMgPSAodTgpIHBvcnQtPmRldl9nZW9tX2hlYWQ7Ci0JCWdlb20uc2VjdG9ycyA9ICh1OCkgcG9ydC0+ZGV2X2dlb21fc2VjdDsKLQkJZ2VvbS5jeWxpbmRlcnMgPSBwb3J0LT5kZXZfZ2VvbV9jeWw7Ci0JCWdlb20uc3RhcnQgPSBnZXRfc3RhcnRfc2VjdChpbm8tPmlfYmRldik7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcih1c2VybWVtLCAmZ2VvbSwgc2l6ZW9mKGdlb20pKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAtRU9QTk9UU1VQUDsKKwlnZW8tPmhlYWRzID0gKHU4KSBwb3J0LT5kZXZfZ2VvbV9oZWFkOworCWdlby0+c2VjdG9ycyA9ICh1OCkgcG9ydC0+ZGV2X2dlb21fc2VjdDsKKwlnZW8tPmN5bGluZGVycyA9IHBvcnQtPmRldl9nZW9tX2N5bDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGNvbnN0IHUzMiBtc2dfc2l6ZXNbXSA9IHsgMzIsIDY0LCAxMjgsIENBUk1fTVNHX1NJWkUgfTsKQEAgLTEzNjUsNyArMTM0Niw3IEBACiAJfQogCiAJY2FzZSBIU1RfUFJPQkVfRklOSVNIRUQ6Ci0JCXVwKCZob3N0LT5wcm9iZV9zZW0pOworCQljb21wbGV0ZSgmaG9zdC0+cHJvYmVfY29tcCk7CiAJCWJyZWFrOwogCiAJY2FzZSBIU1RfRVJST1I6CkBAIC0xNjQxLDcgKzE2MjIsNyBAQAogCWhvc3QtPmZsYWdzID0gcGNpX2RhYyA/IEZMX0RBQyA6IDA7CiAJc3Bpbl9sb2NrX2luaXQoJmhvc3QtPmxvY2spOwogCUlOSVRfV09SSygmaG9zdC0+ZnNtX3Rhc2ssIGNhcm1fZnNtX3Rhc2ssIGhvc3QpOwotCWluaXRfTVVURVhfTE9DS0VEKCZob3N0LT5wcm9iZV9zZW0pOworCWluaXRfY29tcGxldGlvbigmaG9zdC0+cHJvYmVfY29tcCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShob3N0LT5yZXEpOyBpKyspCiAJCWhvc3QtPnJlcVtpXS50YWcgPSBpOwpAQCAtMTcxMCw4ICsxNjkxLDggQEAKIAlpZiAocmMpCiAJCWdvdG8gZXJyX291dF9mcmVlX2lycTsKIAotCURQUklOVEsoIndhaXRpbmcgZm9yIHByb2JlX3NlbVxuIik7Ci0JZG93bigmaG9zdC0+cHJvYmVfc2VtKTsKKwlEUFJJTlRLKCJ3YWl0aW5nIGZvciBwcm9iZV9jb21wXG4iKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZob3N0LT5wcm9iZV9jb21wKTsKIAogCXByaW50ayhLRVJOX0lORk8gIiVzOiBwY2kgJXMsIHBvcnRzICVkLCBpbyAlbHgsIGlycSAldSwgbWFqb3IgJWRcbiIsCiAJICAgICAgIGhvc3QtPm5hbWUsIHBjaV9uYW1lKHBkZXYpLCAoaW50KSBDQVJNX01BWF9QT1JUUywKQEAgLTE3NzQsNyArMTc1NSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGNhcm1faW5pdCh2b2lkKQogewotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmNhcm1fZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY2FybV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY2FybV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3VtZW0uYyBiL2RyaXZlcnMvYmxvY2svdW1lbS5jCmluZGV4IDBmNDgzMDEuLmEzNjE0ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svdW1lbS5jCisrKyBiL2RyaXZlcnMvYmxvY2svdW1lbS5jCkBAIC04MDksMzQgKzgwOSwyMyBAQAogCXNldF9jYXBhY2l0eShkaXNrLCBjYXJkLT5tbV9zaXplIDw8IDEpOwogCXJldHVybiAwOwogfQotLyoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9pb2N0bAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi1zdGF0aWMgaW50IG1tX2lvY3RsKHN0cnVjdCBpbm9kZSAqaSwgc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorCitzdGF0aWMgaW50IG1tX2dldGdlbyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbykKIHsKLQlpZiAoY21kID09IEhESU9fR0VUR0VPKSB7Ci0JCXN0cnVjdCBjYXJkaW5mbyAqY2FyZCA9IGktPmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwotCQlpbnQgc2l6ZSA9IGNhcmQtPm1tX3NpemUgKiAoMTAyNCAvIE1NX0hBUkRTRUNUKTsKLQkJc3RydWN0IGhkX2dlb21ldHJ5IGdlbzsKLQkJLyoKLQkJICogZ2V0IGdlb21ldHJ5OiB3ZSBoYXZlIHRvIGZha2Ugb25lLi4uICB0cmltIHRoZSBzaXplIHRvIGEKLQkJICogbXVsdGlwbGUgb2YgMjA0OCAoMU0pOiB0ZWxsIHdlIGhhdmUgMzIgc2VjdG9ycywgNjQgaGVhZHMsCi0JCSAqIHdoYXRldmVyIGN5bGluZGVycy4KLQkJICovCi0JCWdlby5oZWFkcyAgICAgPSA2NDsKLQkJZ2VvLnNlY3RvcnMgICA9IDMyOwotCQlnZW8uc3RhcnQgICAgID0gZ2V0X3N0YXJ0X3NlY3QoaS0+aV9iZGV2KTsKLQkJZ2VvLmN5bGluZGVycyA9IHNpemUgLyAoZ2VvLmhlYWRzICogZ2VvLnNlY3RvcnMpOworCXN0cnVjdCBjYXJkaW5mbyAqY2FyZCA9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKKwlpbnQgc2l6ZSA9IGNhcmQtPm1tX3NpemUgKiAoMTAyNCAvIE1NX0hBUkRTRUNUKTsKIAotCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSBhcmcsICZnZW8sIHNpemVvZihnZW8pKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gLUVJTlZBTDsKKwkvKgorCSAqIGdldCBnZW9tZXRyeTogd2UgaGF2ZSB0byBmYWtlIG9uZS4uLiAgdHJpbSB0aGUgc2l6ZSB0byBhCisJICogbXVsdGlwbGUgb2YgMjA0OCAoMU0pOiB0ZWxsIHdlIGhhdmUgMzIgc2VjdG9ycywgNjQgaGVhZHMsCisJICogd2hhdGV2ZXIgY3lsaW5kZXJzLgorCSAqLworCWdlby0+aGVhZHMgICAgID0gNjQ7CisJZ2VvLT5zZWN0b3JzICAgPSAzMjsKKwlnZW8tPmN5bGluZGVycyA9IHNpemUgLyAoZ2VvLT5oZWFkcyAqIGdlby0+c2VjdG9ycyk7CisJcmV0dXJuIDA7CiB9CisKIC8qCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NoZWNrX2NoYW5nZQpAQCAtODU1LDcgKzg0NCw3IEBACiAqLwogc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyBtbV9mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkuaW9jdGwJCT0gbW1faW9jdGwsCisJLmdldGdlbwkJPSBtbV9nZXRnZW8sCiAJLnJldmFsaWRhdGVfZGlzaz0gbW1fcmV2YWxpZGF0ZSwKIAkubWVkaWFfY2hhbmdlZAk9IG1tX2NoZWNrX2NoYW5nZSwKIH07CkBAIC0xMTg1LDcgKzExNzQsNyBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfVkVSU0lPTiAiIDogIiBEUklWRVJfREVTQyAiXG4iKTsKIAotCXJldHZhbCA9IHBjaV9tb2R1bGVfaW5pdCgmbW1fcGNpX2RyaXZlcik7CisJcmV0dmFsID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmbW1fcGNpX2RyaXZlcik7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdmlvZGFzZC5jIGIvZHJpdmVycy9ibG9jay92aW9kYXNkLmMKaW5kZXggMDYzZjAzMC4uZjYzZTA3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay92aW9kYXNkLmMKKysrIGIvZHJpdmVycy9ibG9jay92aW9kYXNkLmMKQEAgLTI0Nyw0MyArMjQ3LDE3IEBACiAKIC8qIEV4dGVybmFsIGlvY3RsIGVudHJ5IHBvaW50LgogICovCi1zdGF0aWMgaW50IHZpb2Rhc2RfaW9jdGwoc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBmaWxlICpmaWwsCi0JCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgaW50IHZpb2Rhc2RfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKQogewotCXVuc2lnbmVkIGNoYXIgc2VjdG9yczsKLQl1bnNpZ25lZCBjaGFyIGhlYWRzOwotCXVuc2lnbmVkIHNob3J0IGN5bGluZGVyczsKLQlzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbzsKLQlzdHJ1Y3QgZ2VuZGlzayAqZ2VuZGlzazsKLQlzdHJ1Y3QgdmlvZGFzZF9kZXZpY2UgKmQ7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBiZGV2LT5iZF9kaXNrOworCXN0cnVjdCB2aW9kYXNkX2RldmljZSAqZCA9IGRpc2stPnByaXZhdGVfZGF0YTsKIAotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBIRElPX0dFVEdFTzoKLQkJZ2VvID0gKHN0cnVjdCBoZF9nZW9tZXRyeSAqKWFyZzsKLQkJaWYgKGdlbyA9PSBOVUxMKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZ2VvLCBzaXplb2YoKmdlbykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWdlbmRpc2sgPSBpbm8tPmlfYmRldi0+YmRfZGlzazsKLQkJZCA9IGdlbmRpc2stPnByaXZhdGVfZGF0YTsKLQkJc2VjdG9ycyA9IGQtPnNlY3RvcnM7Ci0JCWlmIChzZWN0b3JzID09IDApCi0JCQlzZWN0b3JzID0gMzI7Ci0JCWhlYWRzID0gZC0+dHJhY2tzOwotCQlpZiAoaGVhZHMgPT0gMCkKLQkJCWhlYWRzID0gNjQ7Ci0JCWN5bGluZGVycyA9IGQtPmN5bGluZGVyczsKLQkJaWYgKGN5bGluZGVycyA9PSAwKQotCQkJY3lsaW5kZXJzID0gZ2V0X2NhcGFjaXR5KGdlbmRpc2spIC8gKHNlY3RvcnMgKiBoZWFkcyk7Ci0JCWlmIChfX3B1dF91c2VyKHNlY3RvcnMsICZnZW8tPnNlY3RvcnMpIHx8Ci0JCSAgICBfX3B1dF91c2VyKGhlYWRzLCAmZ2VvLT5oZWFkcykgfHwKLQkJICAgIF9fcHV0X3VzZXIoY3lsaW5kZXJzLCAmZ2VvLT5jeWxpbmRlcnMpIHx8Ci0JCSAgICBfX3B1dF91c2VyKGdldF9zdGFydF9zZWN0KGluby0+aV9iZGV2KSwgJmdlby0+c3RhcnQpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOwotCX0KKwlnZW8tPnNlY3RvcnMgPSBkLT5zZWN0b3JzID8gZC0+c2VjdG9ycyA6IDA7CisJZ2VvLT5oZWFkcyA9IGQtPnRyYWNrcyA/IGQtPnRyYWNrcyAgOiA2NDsKKwlnZW8tPmN5bGluZGVycyA9IGQtPmN5bGluZGVycyA/IGQtPmN5bGluZGVycyA6CisJCWdldF9jYXBhY2l0eShkaXNrKSAvIChnZW8tPmN5bGluZGVycyAqIGdlby0+aGVhZHMpOwogCi0JcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0yOTMsNyArMjY3LDcgQEAKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkub3BlbiA9IHZpb2Rhc2Rfb3BlbiwKIAkucmVsZWFzZSA9IHZpb2Rhc2RfcmVsZWFzZSwKLQkuaW9jdGwgPSB2aW9kYXNkX2lvY3RsLAorCS5nZXRnZW8gPSB2aW9kYXNkX2dldGdlbywKIH07CiAKIC8qCkBAIC0zMTksNiArMjkzLDcgQEAKIAl1MTYgdmlvY21kOwogCUh2THBFdmVudF9SYyBodnJjOwogCXN0cnVjdCB2aW9ibG9ja2xwZXZlbnQgKmJldmVudDsKKwlzdHJ1Y3QgSHZMcEV2ZW50ICpoZXY7CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnW1ZJT01BWEJMT0NLRE1BXTsKIAlpbnQgc2dpbmRleDsKIAlpbnQgc3RhdGluZGV4OwpAQCAtMzczLDIyICszNDgsMTkgQEAKIAkJICogdG9rZW4gc28gd2UgY2FuIG1hdGNoIHRoZSByZXNwb25zZSB1cCBsYXRlcgogCQkgKi8KIAkJbWVtc2V0KGJldmVudCwgMCwgc2l6ZW9mKHN0cnVjdCB2aW9ibG9ja2xwZXZlbnQpKTsKLQkJYmV2ZW50LT5ldmVudC54RmxhZ3MueFZhbGlkID0gMTsKLQkJYmV2ZW50LT5ldmVudC54RmxhZ3MueEZ1bmN0aW9uID0gSHZMcEV2ZW50X0Z1bmN0aW9uX0ludDsKLQkJYmV2ZW50LT5ldmVudC54RmxhZ3MueEFja0luZCA9IEh2THBFdmVudF9BY2tJbmRfRG9BY2s7Ci0JCWJldmVudC0+ZXZlbnQueEZsYWdzLnhBY2tUeXBlID0gSHZMcEV2ZW50X0Fja1R5cGVfSW1tZWRpYXRlQWNrOwotCQliZXZlbnQtPmV2ZW50LnhUeXBlID0gSHZMcEV2ZW50X1R5cGVfVmlydHVhbElvOwotCQliZXZlbnQtPmV2ZW50LnhTdWJ0eXBlID0gdmlvY21kOwotCQliZXZlbnQtPmV2ZW50LnhTb3VyY2VMcCA9IEh2THBDb25maWdfZ2V0THBJbmRleCgpOwotCQliZXZlbnQtPmV2ZW50LnhUYXJnZXRMcCA9IHZpb3BhdGhfaG9zdExwOwotCQliZXZlbnQtPmV2ZW50LnhTaXplTWludXMxID0KKwkJaGV2ID0gJmJldmVudC0+ZXZlbnQ7CisJCWhldi0+ZmxhZ3MgPSBIVl9MUF9FVkVOVF9WQUxJRCB8IEhWX0xQX0VWRU5UX0RPX0FDSyB8CisJCQlIVl9MUF9FVkVOVF9JTlQ7CisJCWhldi0+eFR5cGUgPSBIdkxwRXZlbnRfVHlwZV9WaXJ0dWFsSW87CisJCWhldi0+eFN1YnR5cGUgPSB2aW9jbWQ7CisJCWhldi0+eFNvdXJjZUxwID0gSHZMcENvbmZpZ19nZXRMcEluZGV4KCk7CisJCWhldi0+eFRhcmdldExwID0gdmlvcGF0aF9ob3N0THA7CisJCWhldi0+eFNpemVNaW51czEgPQogCQkJb2Zmc2V0b2Yoc3RydWN0IHZpb2Jsb2NrbHBldmVudCwgdS5yd19kYXRhLmRtYV9pbmZvKSArCiAJCQkoc2l6ZW9mKGJldmVudC0+dS5yd19kYXRhLmRtYV9pbmZvWzBdKSAqIG5zZykgLSAxOwotCQliZXZlbnQtPmV2ZW50LnhTb3VyY2VJbnN0YW5jZUlkID0KLQkJCXZpb3BhdGhfc291cmNlaW5zdCh2aW9wYXRoX2hvc3RMcCk7Ci0JCWJldmVudC0+ZXZlbnQueFRhcmdldEluc3RhbmNlSWQgPQotCQkJdmlvcGF0aF90YXJnZXRpbnN0KHZpb3BhdGhfaG9zdExwKTsKLQkJYmV2ZW50LT5ldmVudC54Q29ycmVsYXRpb25Ub2tlbiA9ICh1NjQpcmVxOworCQloZXYtPnhTb3VyY2VJbnN0YW5jZUlkID0gdmlvcGF0aF9zb3VyY2VpbnN0KHZpb3BhdGhfaG9zdExwKTsKKwkJaGV2LT54VGFyZ2V0SW5zdGFuY2VJZCA9IHZpb3BhdGhfdGFyZ2V0aW5zdCh2aW9wYXRoX2hvc3RMcCk7CisJCWhldi0+eENvcnJlbGF0aW9uVG9rZW4gPSAodTY0KXJlcTsKIAkJYmV2ZW50LT52ZXJzaW9uID0gVklPVkVSU0lPTjsKIAkJYmV2ZW50LT5kaXNrID0gREVWSUNFX05PKGQpOwogCQliZXZlbnQtPnUucndfZGF0YS5vZmZzZXQgPSBzdGFydDsKQEAgLTY3NSwxMCArNjQ3LDEwIEBACiAJCS8qIE5vdGlmaWNhdGlvbiB0aGF0IGEgcGFydGl0aW9uIHdlbnQgYXdheSEgKi8KIAkJcmV0dXJuOwogCS8qIEZpcnN0LCB3ZSBzaG91bGQgTkVWRVIgZ2V0IGFuIGludCBoZXJlLi4ub25seSBhY2tzICovCi0JaWYgKGV2ZW50LT54RmxhZ3MueEZ1bmN0aW9uID09IEh2THBFdmVudF9GdW5jdGlvbl9JbnQpIHsKKwlpZiAoaHZscGV2ZW50X2lzX2ludChldmVudCkpIHsKIAkJcHJpbnRrKFZJT0RfS0VSTl9XQVJOSU5HCiAJCSAgICAgICAiWWlrZXMhIGdvdCBhbiBpbnQgaW4gdmlvZGFzZCBldmVudCBoYW5kbGVyIVxuIik7Ci0JCWlmIChldmVudC0+eEZsYWdzLnhBY2tJbmQgPT0gSHZMcEV2ZW50X0Fja0luZF9Eb0FjaykgeworCQlpZiAoaHZscGV2ZW50X25lZWRfYWNrKGV2ZW50KSkgewogCQkJZXZlbnQtPnhSYyA9IEh2THBFdmVudF9SY19JbnZhbGlkU3VidHlwZTsKIAkJCUh2Q2FsbEV2ZW50X2Fja0xwRXZlbnQoZXZlbnQpOwogCQl9CkBAIC03MjEsNyArNjkzLDcgQEAKIAogCWRlZmF1bHQ6CiAJCXByaW50ayhWSU9EX0tFUk5fV0FSTklORyAiaW52YWxpZCBzdWJ0eXBlISIpOwotCQlpZiAoZXZlbnQtPnhGbGFncy54QWNrSW5kID09IEh2THBFdmVudF9BY2tJbmRfRG9BY2spIHsKKwkJaWYgKGh2bHBldmVudF9uZWVkX2FjayhldmVudCkpIHsKIAkJCWV2ZW50LT54UmMgPSBIdkxwRXZlbnRfUmNfSW52YWxpZFN1YnR5cGU7CiAJCQlIdkNhbGxFdmVudF9hY2tMcEV2ZW50KGV2ZW50KTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay94ZC5jIGIvZHJpdmVycy9ibG9jay94ZC5jCmluZGV4IDY4YjZkN2IuLmNiY2U3YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveGQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hkLmMKQEAgLTEyOCw5ICsxMjgsMTIgQEAKIAogc3RhdGljIHN0cnVjdCBnZW5kaXNrICp4ZF9nZW5kaXNrWzJdOwogCitzdGF0aWMgaW50IHhkX2dldGdlbyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbyk7CisKIHN0YXRpYyBzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgeGRfZm9wcyA9IHsKIAkub3duZXIJPSBUSElTX01PRFVMRSwKIAkuaW9jdGwJPSB4ZF9pb2N0bCwKKwkuZ2V0Z2VvID0geGRfZ2V0Z2VvLAogfTsKIHN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh4ZF93YWl0X2ludCk7CiBzdGF0aWMgdV9jaGFyIHhkX2RyaXZlcywgeGRfaXJxID0gNSwgeGRfZG1hID0gMywgeGRfbWF4c2VjdG9yczsKQEAgLTI3NiwxMSArMjc5LDExIEBACiAJCXJldHVybigxKTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZih4ZF9iYXNlcykgLyBzaXplb2YoeGRfYmFzZXNbMF0pKTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoeGRfYmFzZXMpOyBpKyspIHsKIAkJdm9pZCBfX2lvbWVtICpwID0gaW9yZW1hcCh4ZF9iYXNlc1tpXSwgMHgyMDAwKTsKIAkJaWYgKCFwKQogCQkJY29udGludWU7Ci0JCWZvciAoaiA9IDE7IGogPCAoc2l6ZW9mKHhkX3NpZ3MpIC8gc2l6ZW9mKHhkX3NpZ3NbMF0pKTsgaisrKSB7CisJCWZvciAoaiA9IDE7IGogPCBBUlJBWV9TSVpFKHhkX3NpZ3MpOyBqKyspIHsKIAkJCWNvbnN0IGNoYXIgKnMgPSB4ZF9zaWdzW2pdLnN0cmluZzsKIAkJCWlmIChjaGVja19zaWduYXR1cmUocCArIHhkX3NpZ3Nbal0ub2Zmc2V0LCBzLCBzdHJsZW4ocykpKSB7CiAJCQkJKmNvbnRyb2xsZXIgPSBqOwpAQCAtMzMwLDIyICszMzMsMjAgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgeGRfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKQoreworCVhEX0lORk8gKnAgPSBiZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisKKwlnZW8tPmhlYWRzID0gcC0+aGVhZHM7CisJZ2VvLT5zZWN0b3JzID0gcC0+c2VjdG9yczsKKwlnZW8tPmN5bGluZGVycyA9IHAtPmN5bGluZGVyczsKKwlyZXR1cm4gMDsKK30KKwogLyogeGRfaW9jdGw6IGhhbmRsZSBkZXZpY2UgaW9jdGwncyAqLwogc3RhdGljIGludCB4ZF9pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSxzdHJ1Y3QgZmlsZSAqZmlsZSx1X2ludCBjbWQsdV9sb25nIGFyZykKIHsKLQlYRF9JTkZPICpwID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwotCiAJc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBIRElPX0dFVEdFTzoKLQkJewotCQkJc3RydWN0IGhkX2dlb21ldHJ5IGc7Ci0JCQlzdHJ1Y3QgaGRfZ2VvbWV0cnkgX191c2VyICpnZW9tPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JCQlnLmhlYWRzID0gcC0+aGVhZHM7Ci0JCQlnLnNlY3RvcnMgPSBwLT5zZWN0b3JzOwotCQkJZy5jeWxpbmRlcnMgPSBwLT5jeWxpbmRlcnM7Ci0JCQlnLnN0YXJ0ID0gZ2V0X3N0YXJ0X3NlY3QoaW5vZGUtPmlfYmRldik7Ci0JCQlyZXR1cm4gY29weV90b191c2VyKGdlb20sICZnLCBzaXplb2YoZykpID8gLUVGQVVMVCA6IDA7Ci0JCX0KIAkJY2FzZSBIRElPX1NFVF9ETUE6CiAJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHJldHVybiAtRUFDQ0VTOwogCQkJaWYgKHhkY19idXN5KSByZXR1cm4gLUVCVVNZOwpAQCAtMTAxNyw3ICsxMDE4LDcgQEAKIAkJY2FzZSAyOiBpZiAoKGludGVnZXJzWzJdID4gMCkgJiYgKGludGVnZXJzWzJdIDwgMTYpKQogCQkJCXhkX2lycSA9IGludGVnZXJzWzJdOwogCQljYXNlIDE6IHhkX292ZXJyaWRlID0gMTsKLQkJCWlmICgoaW50ZWdlcnNbMV0gPj0gMCkgJiYgKGludGVnZXJzWzFdIDwgKHNpemVvZih4ZF9zaWdzKSAvIHNpemVvZih4ZF9zaWdzWzBdKSkpKQorCQkJaWYgKChpbnRlZ2Vyc1sxXSA+PSAwKSAmJiAoaW50ZWdlcnNbMV0gPCBBUlJBWV9TSVpFKHhkX3NpZ3MpKSkKIAkJCQl4ZF90eXBlID0gaW50ZWdlcnNbMV07CiAJCWNhc2UgMDogYnJlYWs7CiAJCWRlZmF1bHQ6cHJpbnRrKCJ4ZDogdG9vIG1hbnkgcGFyYW1ldGVycyBmb3IgeGRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2Jjc3AuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9iY3NwLmMKaW5kZXggOGZkZGZkZi4uN2JkNGVmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2Jjc3AuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfYmNzcC5jCkBAIC00OTQsNyArNDk0LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBiY3NwX2NvbXBsZXRlX3J4X3BrdChzdHJ1Y3QgaGNpX3VhcnQgKmh1KQorc3RhdGljIHZvaWQgYmNzcF9jb21wbGV0ZV9yeF9wa3Qoc3RydWN0IGhjaV91YXJ0ICpodSkKIHsKIAlzdHJ1Y3QgYmNzcF9zdHJ1Y3QgKmJjc3AgPSBodS0+cHJpdjsKIAlpbnQgcGFzc191cDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9sZGlzYy5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMKaW5kZXggNTczZmY2Yy4uNjEzNjczYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMKQEAgLTI3OSw2ICsyNzksNyBAQAogCiAJdHR5LT5kaXNjX2RhdGEgPSBodTsKIAlodS0+dHR5ID0gdHR5OworCXR0eS0+cmVjZWl2ZV9yb29tID0gNjU1MzY7CiAKIAlzcGluX2xvY2tfaW5pdCgmaHUtPnJ4X2xvY2spOwogCkBAIC0zNDgsMjAgKzM0OSw2IEBACiAJCWhjaV91YXJ0X3R4X3dha2V1cChodSk7CiB9CiAKLS8qIGhjaV91YXJ0X3R0eV9yb29tKCkKLSAqIAotICogICAgQ2FsbGJhY2sgZnVuY3Rpb24gZnJvbSB0dHkgZHJpdmVyLiBSZXR1cm4gdGhlIGFtb3VudCBvZiAKLSAqICAgIHNwYWNlIGxlZnQgaW4gdGhlIHJlY2VpdmVyJ3MgYnVmZmVyIHRvIGRlY2lkZSBpZiByZW1vdGUKLSAqICAgIHRyYW5zbWl0dGVyIGlzIHRvIGJlIHRocm90dGxlZC4KLSAqCi0gKiBBcmd1bWVudHM6ICAgICAgICB0dHkgICAgcG9pbnRlciB0byBhc3NvY2lhdGVkIHR0eSBpbnN0YW5jZSBkYXRhCi0gKiBSZXR1cm4gVmFsdWU6ICAgIG51bWJlciBvZiBieXRlcyBsZWZ0IGluIHJlY2VpdmUgYnVmZmVyCi0gKi8KLXN0YXRpYyBpbnQgaGNpX3VhcnRfdHR5X3Jvb20gKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0JcmV0dXJuIDY1NTM2OwotfQotCiAvKiBoY2lfdWFydF90dHlfcmVjZWl2ZSgpCiAgKiAKICAqICAgICBDYWxsZWQgYnkgdHR5IGxvdyBsZXZlbCBkcml2ZXIgd2hlbiByZWNlaXZlIGRhdGEgaXMKQEAgLTU0NCw3ICs1MzEsNiBAQAogCWhjaV91YXJ0X2xkaXNjLndyaXRlCQk9IGhjaV91YXJ0X3R0eV93cml0ZTsKIAloY2lfdWFydF9sZGlzYy5pb2N0bAkJPSBoY2lfdWFydF90dHlfaW9jdGw7CiAJaGNpX3VhcnRfbGRpc2MucG9sbAkJPSBoY2lfdWFydF90dHlfcG9sbDsKLQloY2lfdWFydF9sZGlzYy5yZWNlaXZlX3Jvb20JPSBoY2lfdWFydF90dHlfcm9vbTsKIAloY2lfdWFydF9sZGlzYy5yZWNlaXZlX2J1Zgk9IGhjaV91YXJ0X3R0eV9yZWNlaXZlOwogCWhjaV91YXJ0X2xkaXNjLndyaXRlX3dha2V1cAk9IGhjaV91YXJ0X3R0eV93YWtldXA7CiAJaGNpX3VhcnRfbGRpc2Mub3duZXIJCT0gVEhJU19NT0RVTEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nkcm9tL2Nkcm9tLmMgYi9kcml2ZXJzL2Nkcm9tL2Nkcm9tLmMKaW5kZXggMTUzOTYwMy4uODc5YmJjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jZHJvbS9jZHJvbS5jCisrKyBiL2RyaXZlcnMvY2Ryb20vY2Ryb20uYwpAQCAtMTEzMSw3ICsxMTMxLDcgQEAKIAlUaGlzIGVuc3VyZXMgdGhhdCB0aGUgZHJpdmUgZ2V0cyB1bmxvY2tlZCBhZnRlciBhIG1vdW50IGZhaWxzLiAgVGhpcyAKIAlpcyBhIGdvdG8gdG8gYXZvaWQgYmxvYXRpbmcgdGhlIGRyaXZlciB3aXRoIHJlZHVuZGFudCBjb2RlLiAqLyAKIGNsZWFuX3VwX2FuZF9yZXR1cm46Ci0JY2RpbmZvKENEX1dBUk5JTkcsICJvcGVuIGZhaWxlZC5cbiIpOyAKKwljZGluZm8oQ0RfT1BFTiwgIm9wZW4gZmFpbGVkLlxuIik7IAogCWlmIChDRFJPTV9DQU4oQ0RDX0xPQ0spICYmIGNkaS0+b3B0aW9ucyAmIENET19MT0NLKSB7CiAJCQljZG8tPmxvY2tfZG9vcihjZGksIDApOwogCQkJY2RpbmZvKENEX09QRU4sICJkb29yIHVubG9ja2VkLlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nkcm9tL2NtMjA2LmMgYi9kcml2ZXJzL2Nkcm9tL2NtMjA2LmMKaW5kZXggMDFmMDM1MS4uY2UxMjdmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jZHJvbS9jbTIwNi5jCisrKyBiL2RyaXZlcnMvY2Ryb20vY20yMDYuYwpAQCAtMzIsNyArMzIsNyBAQAogIDE4IG1ydCAxOTk1OiAwLjI0IFdvcmtpbmcgYmFja2dyb3VuZCByZWFkLWFoZWFkLiAoc3RpbGwgcHJvYmxlbXMpCiAgMjYgbXJ0IDE5OTU6IDAuMjUgTXVsdGktc2Vzc2lvbiBpb2N0bCBhZGRlZCAoa2VybmVsIHYxLjIpLgogICAgICAgICAgICAgICBTdGF0aXN0aWNzIGltcGxlbWVudGVkLCB0aG91Z2ggc2VwYXJhdGUgc3RhdHMyMDYuaC4KLQkgICAgICBBY2Nlc3NpYmxlIHRyb3VnaCBpb2N0bCAweDEwMDAgKGp1c3QgYSBudW1iZXIpLgorCSAgICAgIEFjY2Vzc2libGUgdGhyb3VnaCBpb2N0bCAweDEwMDAgKGp1c3QgYSBudW1iZXIpLgogCSAgICAgIEhhcmQgdG8gY2hvb3NlIGJldHdlZW4gdjEuMiBkZXZlbG9wbWVudCBhbmQgMS4xLjc1LgogCSAgICAgIEJvdHRvbS1oYWxmIGRvZXNuJ3Qgd29yayB3aXRoIDEuMi4uLgogCSAgICAgIDAuMjVhOiBmaXhlZC4uLiB0eXBvLiBTdGlsbCBwcm9ibGVtcy4uLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZHJvbS92aW9jZC5jIGIvZHJpdmVycy9jZHJvbS92aW9jZC5jCmluZGV4IGI1MTkxNzguLjE5MzQ0NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2Ryb20vdmlvY2QuYworKysgYi9kcml2ZXJzL2Nkcm9tL3Zpb2NkLmMKQEAgLTU0MiwxMCArNTQyLDEwIEBACiAJCS8qIE5vdGlmaWNhdGlvbiB0aGF0IGEgcGFydGl0aW9uIHdlbnQgYXdheSEgKi8KIAkJcmV0dXJuOwogCS8qIEZpcnN0LCB3ZSBzaG91bGQgTkVWRVIgZ2V0IGFuIGludCBoZXJlLi4ub25seSBhY2tzICovCi0JaWYgKGV2ZW50LT54RmxhZ3MueEZ1bmN0aW9uID09IEh2THBFdmVudF9GdW5jdGlvbl9JbnQpIHsKKwlpZiAoaHZscGV2ZW50X2lzX2ludChldmVudCkpIHsKIAkJcHJpbnRrKFZJT0NEX0tFUk5fV0FSTklORwogCQkJCSJZaWtlcyEgZ290IGFuIGludCBpbiB2aW9jZCBldmVudCBoYW5kbGVyIVxuIik7Ci0JCWlmIChldmVudC0+eEZsYWdzLnhBY2tJbmQgPT0gSHZMcEV2ZW50X0Fja0luZF9Eb0FjaykgeworCQlpZiAoaHZscGV2ZW50X25lZWRfYWNrKGV2ZW50KSkgewogCQkJZXZlbnQtPnhSYyA9IEh2THBFdmVudF9SY19JbnZhbGlkU3VidHlwZTsKIAkJCUh2Q2FsbEV2ZW50X2Fja0xwRXZlbnQoZXZlbnQpOwogCQl9CkBAIC02MTYsNyArNjE2LDcgQEAKIAkJcHJpbnRrKFZJT0NEX0tFUk5fV0FSTklORwogCQkJCSJtZXNzYWdlIHdpdGggaW52YWxpZCBzdWJ0eXBlICUweDA0WCFcbiIsCiAJCQkJZXZlbnQtPnhTdWJ0eXBlICYgVklPTUlOT1JfU1VCVFlQRV9NQVNLKTsKLQkJaWYgKGV2ZW50LT54RmxhZ3MueEFja0luZCA9PSBIdkxwRXZlbnRfQWNrSW5kX0RvQWNrKSB7CisJCWlmIChodmxwZXZlbnRfbmVlZF9hY2soZXZlbnQpKSB7CiAJCQlldmVudC0+eFJjID0gSHZMcEV2ZW50X1JjX0ludmFsaWRTdWJ0eXBlOwogCQkJSHZDYWxsRXZlbnRfYWNrTHBFdmVudChldmVudCk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9LY29uZmlnIGIvZHJpdmVycy9jaGFyL0tjb25maWcKaW5kZXggNWViZDA2Yi4uNDEzNWQ4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL0tjb25maWcKQEAgLTgwLDcgKzgwLDcgQEAKIAogY29uZmlnIENPTVBVVE9ORQogCXRyaXN0YXRlICJDb21wdXRvbmUgSW50ZWxsaVBvcnQgUGx1cyBzZXJpYWwgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRCAmJiBCUk9LRU5fT05fU01QCisJZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQKIAktLS1oZWxwLS0tCiAJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgZW50aXJlIGZhbWlseSBvZiBJbnRlbGxpcG9ydCBJSS9QbHVzCiAJICBjb250cm9sbGVycyB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIE1pY3JvQ2hhbm5lbCBjb250cm9sbGVycyBhbmQKQEAgLTE1Myw3ICsxNTMsNyBAQAogCiBjb25maWcgRVNQU0VSSUFMCiAJdHJpc3RhdGUgIkhheWVzIEVTUCBzZXJpYWwgcG9ydCBzdXBwb3J0IgotCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJEICYmIElTQSAmJiBCUk9LRU5fT05fU01QICYmIElTQV9ETUFfQVBJCisJZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQgJiYgSVNBICYmIElTQV9ETUFfQVBJCiAJaGVscAogCSAgVGhpcyBpcyBhIGRyaXZlciB3aGljaCBzdXBwb3J0cyBIYXllcyBFU1Agc2VyaWFsIHBvcnRzLiAgQm90aCBzaW5nbGUKIAkgIHBvcnQgY2FyZHMgYW5kIG11bHRpcG9ydCBjYXJkcyBhcmUgc3VwcG9ydGVkLiAgTWFrZSBzdXJlIHRvIHJlYWQKQEAgLTE2Niw3ICsxNjYsNyBAQAogCiBjb25maWcgTU9YQV9JTlRFTExJTwogCXRyaXN0YXRlICJNb3hhIEludGVsbGlvIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQgJiYgQlJPS0VOX09OX1NNUAorCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJECiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIE1veGEgSW50ZWxsaW8gbXVsdGlwb3J0IHNlcmlhbCBjYXJkLgogCkBAIC0yMjAsNiArMjIwLDE0IEBACiAJICBUaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHN5bmNsaW5rbXAuICBJZiB5b3Ugd2FudCB0byBkbyB0aGF0LCBzYXkgTQogCSAgaGVyZS4KIAorY29uZmlnIFNZTkNMSU5LX0dUCisJdHJpc3RhdGUgIlN5bmNMaW5rIEdUL0FDIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQKKwloZWxwCisJICBTdXBwb3J0IGZvciBTeW5jTGluayBHVCBhbmQgU3luY0xpbmsgQUMgZmFtaWxpZXMgb2YKKwkgIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgc2VyaWFsIGFkYXB0ZXJzCisJICBtYW51ZmFjdHVyZWQgYnkgTWljcm9nYXRlIFN5c3RlbXMsIEx0ZC4gKHd3dy5taWNyb2dhdGUuY29tKQorCiBjb25maWcgTl9IRExDCiAJdHJpc3RhdGUgIkhETEMgbGluZSBkaXNjaXBsaW5lIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQKQEAgLTI4Miw3ICsyOTAsNyBAQAogCiBjb25maWcgUklPCiAJdHJpc3RhdGUgIlNwZWNpYWxpeCBSSU8gc3lzdGVtIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQgJiYgQlJPS0VOX09OX1NNUAorCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJEICYmIEJST0tFTl9PTl9TTVAgJiYgITY0QklUCiAJaGVscAogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFNwZWNpYWxpeCBSSU8sIGEgc21hcnQgc2VyaWFsIGNhcmQgd2hpY2gKIAkgIGRyaXZlcyBhbiBvdXRib2FyZCBib3ggdGhhdCBjYW4gc3VwcG9ydCB1cCB0byAxMjggcG9ydHMuICBQcm9kdWN0CkBAIC02ODcsNyArNjk1LDcgQEAKIAogY29uZmlnIFJUQwogCXRyaXN0YXRlICJFbmhhbmNlZCBSZWFsIFRpbWUgQ2xvY2sgU3VwcG9ydCIKLQlkZXBlbmRzIG9uICFQUEMzMiAmJiAhUEFSSVNDICYmICFJQTY0ICYmICFNNjhLICYmICghU1BBUkMgfHwgUENJKQorCWRlcGVuZHMgb24gIVBQQzMyICYmICFQQVJJU0MgJiYgIUlBNjQgJiYgIU02OEsgJiYgKCFTUEFSQyB8fCBQQ0kpICYmICFGUlYKIAktLS1oZWxwLS0tCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgY3JlYXRlIGEgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZSAvZGV2L3J0YyB3aXRoCiAJICBtYWpvciBudW1iZXIgMTAgYW5kIG1pbm9yIG51bWJlciAxMzUgdXNpbmcgbWtub2QgKCJtYW4gbWtub2QiKSwgeW91CkBAIC03MzUsNyArNzQzLDcgQEAKIAogY29uZmlnIEdFTl9SVEMKIAl0cmlzdGF0ZSAiR2VuZXJpYyAvZGV2L3J0YyBlbXVsYXRpb24iCi0JZGVwZW5kcyBvbiBSVEMhPXkgJiYgIUlBNjQgJiYgIUFSTSAmJiAhTTMyUiAmJiAhU1BBUkMKKwlkZXBlbmRzIG9uIFJUQyE9eSAmJiAhSUE2NCAmJiAhQVJNICYmICFNMzJSICYmICFTUEFSQyAmJiAhRlJWCiAJLS0taGVscC0tLQogCSAgSWYgeW91IHNheSBZIGhlcmUgYW5kIGNyZWF0ZSBhIGNoYXJhY3RlciBzcGVjaWFsIGZpbGUgL2Rldi9ydGMgd2l0aAogCSAgbWFqb3IgbnVtYmVyIDEwIGFuZCBtaW5vciBudW1iZXIgMTM1IHVzaW5nIG1rbm9kICgibWFuIG1rbm9kIiksIHlvdQpAQCAtODczLDE2ICs4ODEsNiBAQAogCSAgbW9kdWxlLiBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBmdGFwZS4KIAotCSAgTm90ZSB0aGF0IHRoZSBGdGFwZS1IT1dUTyBpcyBvdXQgb2YgZGF0ZSAoc29ycnkpIGFuZCBkb2N1bWVudHMgdGhlCi0JICBvbGRlciB2ZXJzaW9uIDIuMDggb2YgdGhpcyBzb2Z0d2FyZSBidXQgc3RpbGwgY29udGFpbnMgdXNlZnVsCi0JICBpbmZvcm1hdGlvbi4gIFRoZXJlIGlzIGEgd2ViIHBhZ2Ugd2l0aCBtb3JlIHJlY2VudCBkb2N1bWVudGF0aW9uIGF0Ci0JICA8aHR0cDovL3d3dy5pbnN0bWF0aC5yd3RoLWFhY2hlbi5kZS9+aGVpbmUvZnRhcGUvPi4gIFRoaXMgcGFnZQotCSAgYWx3YXlzIGNvbnRhaW5zIHRoZSBsYXRlc3QgcmVsZWFzZSBvZiB0aGUgZnRhcGUgZHJpdmVyIGFuZCB1c2VmdWwKLQkgIGluZm9ybWF0aW9uIChiYWNrdXAgc29mdHdhcmUsIGZ0YXBlIHJlbGF0ZWQgcGF0Y2hlcyBhbmQKLQkgIGRvY3VtZW50YXRpb24sIEZBUSkuICBOb3RlIHRoYXQgdGhlIGZpbGUgc3lzdGVtIGludGVyZmFjZSBoYXMKLQkgIGNoYW5nZWQgcXVpdGUgYSBiaXQgY29tcGFyZWQgdG8gcHJldmlvdXMgdmVyc2lvbnMgb2YgZnRhcGUuICBQbGVhc2UKLQkgIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9mdGFwZS50eHQ+LgotCiBzb3VyY2UgImRyaXZlcnMvY2hhci9mdGFwZS9LY29uZmlnIgogCiBlbmRtZW51CkBAIC05MjgsNiArOTI2LDE1IEBACiAKIAkgIElmIGNvbXBpbGVkIGFzIGEgbW9kdWxlLCBpdCB3aWxsIGJlIGNhbGxlZCBzY3gyMDBfZ3Bpby4KIAorY29uZmlnIENTNTUzNV9HUElPCisJdHJpc3RhdGUgIkFNRCBDUzU1MzUvQ1M1NTM2IEdQSU8gKEdlb2RlIENvbXBhbmlvbiBEZXZpY2UpIgorCWRlcGVuZHMgb24gWDg2XzMyCisJaGVscAorCSAgR2l2ZSB1c2Vyc3BhY2UgYWNjZXNzIHRvIHRoZSBHUElPIHBpbnMgb24gdGhlIEFNRCBDUzU1MzUgYW5kCisJICBDUzU1MzYgR2VvZGUgY29tcGFuaW9uIGRldmljZXMuCisKKwkgIElmIGNvbXBpbGVkIGFzIGEgbW9kdWxlLCBpdCB3aWxsIGJlIGNhbGxlZCBjczU1MzVfZ3Bpby4KKwogY29uZmlnIEdQSU9fVlI0MVhYCiAJdHJpc3RhdGUgIk5FQyBWUjQxMDAgc2VyaWVzIEdlbmVyYWwtcHVycG9zZSBJL08gVW5pdCBzdXBwb3J0IgogCWRlcGVuZHMgb24gQ1BVX1ZSNDFYWApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL01ha2VmaWxlCmluZGV4IDRhZWFlNjguLjUwM2RkOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKQEAgLTM2LDYgKzM2LDcgQEAKIG9iai0kKENPTkZJR19JU0kpCQkrPSBpc2ljb20ubwogb2JqLSQoQ09ORklHX1NZTkNMSU5LKQkJKz0gc3luY2xpbmsubwogb2JqLSQoQ09ORklHX1NZTkNMSU5LTVApCSs9IHN5bmNsaW5rbXAubworb2JqLSQoQ09ORklHX1NZTkNMSU5LX0dUKQkrPSBzeW5jbGlua19ndC5vCiBvYmotJChDT05GSUdfTl9IRExDKQkJKz0gbl9oZGxjLm8KIG9iai0kKENPTkZJR19BTUlHQV9CVUlMVElOX1NFUklBTCkgKz0gYW1pc2VyaWFsLm8KIG9iai0kKENPTkZJR19TWCkJCSs9IHN4Lm8gZ2VuZXJpY19zZXJpYWwubwpAQCAtODAsNiArODEsNyBAQAogb2JqLSQoQ09ORklHX05XQlVUVE9OKSArPSBud2J1dHRvbi5vCiBvYmotJChDT05GSUdfTldGTEFTSCkgKz0gbndmbGFzaC5vCiBvYmotJChDT05GSUdfU0N4MjAwX0dQSU8pICs9IHNjeDIwMF9ncGlvLm8KK29iai0kKENPTkZJR19DUzU1MzVfR1BJTykgKz0gY3M1NTM1X2dwaW8ubwogb2JqLSQoQ09ORklHX0dQSU9fVlI0MVhYKSArPSB2cjQxeHhfZ2l1Lm8KIG9iai0kKENPTkZJR19UQU5CQUNfVEIwMjE5KSArPSB0YjAyMTkubwogb2JqLSQoQ09ORklHX1RFTENMT0NLKSArPSB0bGNsay5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL3N3b3Jrcy1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3Avc3dvcmtzLWFncC5jCmluZGV4IDNmOGY3ZmEuLjI2OGY3OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3Avc3dvcmtzLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3Avc3dvcmtzLWFncC5jCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CiAjaW5jbHVkZSAiYWdwLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hbWlzZXJpYWwuYyBiL2RyaXZlcnMvY2hhci9hbWlzZXJpYWwuYwppbmRleCBhMTI0ZjhjLi43YWMzNjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYW1pc2VyaWFsLmMKKysrIGIvZHJpdmVycy9jaGFyL2FtaXNlcmlhbC5jCkBAIC05OSw2ICs5OSw3IEBACiAjZGVmaW5lIF9JTkxJTkVfIGlubGluZQogI2VuZGlmCiAKKyNkZWZpbmUgY3VzdG9tIGFtaWdhX2N1c3RvbQogc3RhdGljIGNoYXIgKnNlcmlhbF9uYW1lID0gIkFtaWdhLWJ1aWx0aW4gc2VyaWFsIGRyaXZlciI7CiAKIHN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqc2VyaWFsX2RyaXZlcjsKQEAgLTExNiw3ICsxMTcsNyBAQAogCiBzdGF0aWMgc3RydWN0IHNlcmlhbF9zdGF0ZSByc190YWJsZVsxXTsKIAotI2RlZmluZSBOUl9QT1JUUwkoc2l6ZW9mKHJzX3RhYmxlKS9zaXplb2Yoc3RydWN0IHNlcmlhbF9zdGF0ZSkpCisjZGVmaW5lIE5SX1BPUlRTIEFSUkFZX1NJWkUocnNfdGFibGUpCiAKIC8qCiAgKiB0bXBfYnVmIGlzIHVzZWQgYXMgYSB0ZW1wb3JhcnkgYnVmZmVyIGJ5IHNlcmlhbF93cml0ZS4gIFdlIG5lZWQgdG8KQEAgLTEyOCw3ICsxMjksNiBAQAogICogbWVtb3J5IGlmIGxhcmdlIG51bWJlcnMgb2Ygc2VyaWFsIHBvcnRzIGFyZSBvcGVuLgogICovCiBzdGF0aWMgdW5zaWduZWQgY2hhciAqdG1wX2J1ZjsKLXN0YXRpYyBERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTI2NSw4ICsyNjUsOSBAQAogICAgICAgICBpbnQgc3RhdHVzOwogCWludCBzZXJkYXRyOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7Ci0JdW5zaWduZWQgY2hhciBjaDsKKwl1bnNpZ25lZCBjaGFyIGNoLCBmbGFnOwogCXN0cnVjdAlhc3luY19pY291bnQgKmljb3VudDsKKwlpbnQgb2UgPSAwOwogCiAJaWNvdW50ID0gJmluZm8tPnN0YXRlLT5pY291bnQ7CiAKQEAgLTI4MiwxNSArMjgzLDEyIEBACiAJICAgIHN0YXR1cyB8PSBVQVJUX0xTUl9PRTsKIAogCWNoID0gc2VyZGF0ciAmIDB4ZmY7Ci0JaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKQotCSAgZ290byBpZ25vcmVfY2hhcjsKLQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciA9IGNoOwogCWljb3VudC0+cngrKzsKIAogI2lmZGVmIFNFUklBTF9ERUJVR19JTlRSCiAJcHJpbnRrKCJEUiUwMng6JTAyeC4uLiIsIGNoLCBzdGF0dXMpOwogI2VuZGlmCi0JKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSAwOworCWZsYWcgPSBUVFlfTk9STUFMOwogCiAJLyoKIAkgKiBXZSBkb24ndCBoYW5kbGUgcGFyaXR5IG9yIGZyYW1lIGVycm9ycyAtIGJ1dCBJIGhhdmUgbGVmdApAQCAtMzE5LDcgKzMxNyw3IEBACiAJICAgKiBzaG91bGQgYmUgaWdub3JlZC4KIAkgICAqLwogCSAgaWYgKHN0YXR1cyAmIGluZm8tPmlnbm9yZV9zdGF0dXNfbWFzaykKLQkgICAgZ290byBpZ25vcmVfY2hhcjsKKwkgICAgZ290byBvdXQ7CiAKIAkgIHN0YXR1cyAmPSBpbmZvLT5yZWFkX3N0YXR1c19tYXNrOwogCkBAIC0zMjcsMzMgKzMyNSwyOCBAQAogI2lmZGVmIFNFUklBTF9ERUJVR19JTlRSCiAJICAgIHByaW50aygiaGFuZGxpbmcgYnJlYWsuLi4uIik7CiAjZW5kaWYKLQkgICAgKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfQlJFQUs7CisJICAgIGZsYWcgPSBUVFlfQlJFQUs7CiAJICAgIGlmIChpbmZvLT5mbGFncyAmIEFTWU5DX1NBSykKIAkgICAgICBkb19TQUsodHR5KTsKIAkgIH0gZWxzZSBpZiAoc3RhdHVzICYgVUFSVF9MU1JfUEUpCi0JICAgICp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX1BBUklUWTsKKwkgICAgZmxhZyA9IFRUWV9QQVJJVFk7CiAJICBlbHNlIGlmIChzdGF0dXMgJiBVQVJUX0xTUl9GRSkKLQkgICAgKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfRlJBTUU7CisJICAgIGZsYWcgPSBUVFlfRlJBTUU7CiAJICBpZiAoc3RhdHVzICYgVUFSVF9MU1JfT0UpIHsKIAkgICAgLyoKIAkgICAgICogT3ZlcnJ1biBpcyBzcGVjaWFsLCBzaW5jZSBpdCdzCiAJICAgICAqIHJlcG9ydGVkIGltbWVkaWF0ZWx5LCBhbmQgZG9lc24ndAogCSAgICAgKiBhZmZlY3QgdGhlIGN1cnJlbnQgY2hhcmFjdGVyCiAJICAgICAqLwotCSAgICBpZiAodHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSkgewotCSAgICAgIHR0eS0+ZmxpcC5jb3VudCsrOwotCSAgICAgIHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKzsKLQkgICAgICB0dHktPmZsaXAuY2hhcl9idWZfcHRyKys7Ci0JICAgICAgKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfT1ZFUlJVTjsKLQkgICAgfQorCSAgICAgb2UgPSAxOwogCSAgfQogCX0KLQl0dHktPmZsaXAuZmxhZ19idWZfcHRyKys7Ci0JdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOwotCXR0eS0+ZmxpcC5jb3VudCsrOwotIGlnbm9yZV9jaGFyOgotCisJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgZmxhZyk7CisJaWYgKG9lID09IDEpCisJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pOwogCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CitvdXQ6CisJcmV0dXJuOwogfQogCiBzdGF0aWMgX0lOTElORV8gdm9pZCB0cmFuc21pdF9jaGFycyhzdHJ1Y3QgYXN5bmNfc3RydWN0ICppbmZvKQpAQCAtMTA5NSw3ICsxMDg4LDcgQEAKICAqLwogCiBzdGF0aWMgaW50IGdldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgYXN5bmNfc3RydWN0ICogaW5mbywKLQkJCSAgIHN0cnVjdCBzZXJpYWxfc3RydWN0ICogcmV0aW5mbykKKwkJCSAgIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqIHJldGluZm8pCiB7CiAJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdG1wOwogCXN0cnVjdCBzZXJpYWxfc3RhdGUgKnN0YXRlID0gaW5mby0+c3RhdGU7CkBAIC0xMTE5LDcgKzExMTIsNyBAQAogfQogCiBzdGF0aWMgaW50IHNldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgYXN5bmNfc3RydWN0ICogaW5mbywKLQkJCSAgIHN0cnVjdCBzZXJpYWxfc3RydWN0ICogbmV3X2luZm8pCisJCQkgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKiBuZXdfaW5mbykKIHsKIAlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBuZXdfc2VyaWFsOwogIAlzdHJ1Y3Qgc2VyaWFsX3N0YXRlIG9sZF9zdGF0ZSwgKnN0YXRlOwpAQCAtMTIwMCw3ICsxMTkzLDcgQEAKICAqIAkgICAgdHJhbnNtaXQgaG9sZGluZyByZWdpc3RlciBpcyBlbXB0eS4gIFRoaXMgZnVuY3Rpb25hbGl0eQogICogCSAgICBhbGxvd3MgYW4gUlM0ODUgZHJpdmVyIHRvIGJlIHdyaXR0ZW4gaW4gdXNlciBzcGFjZS4gCiAgKi8KLXN0YXRpYyBpbnQgZ2V0X2xzcl9pbmZvKHN0cnVjdCBhc3luY19zdHJ1Y3QgKiBpbmZvLCB1bnNpZ25lZCBpbnQgKnZhbHVlKQorc3RhdGljIGludCBnZXRfbHNyX2luZm8oc3RydWN0IGFzeW5jX3N0cnVjdCAqIGluZm8sIHVuc2lnbmVkIGludCBfX3VzZXIgKnZhbHVlKQogewogCXVuc2lnbmVkIGNoYXIgc3RhdHVzOwogCXVuc2lnbmVkIGludCByZXN1bHQ7CkBAIC0xMjkxLDYgKzEyODQsNyBAQAogCXN0cnVjdCBhc3luY19zdHJ1Y3QgKiBpbmZvID0gKHN0cnVjdCBhc3luY19zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOwogCXN0cnVjdCBhc3luY19pY291bnQgY3ByZXYsIGNub3c7CS8qIGtlcm5lbCBjb3VudGVyIHRlbXBzICovCiAJc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgaWNvdW50OworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX2lvY3RsIikpCkBAIC0xMzA1LDE5ICsxMjk5LDE3IEBACiAKIAlzd2l0Y2ggKGNtZCkgewogCQljYXNlIFRJT0NHU0VSSUFMOgotCQkJcmV0dXJuIGdldF9zZXJpYWxfaW5mbyhpbmZvLAotCQkJCQkgICAgICAgKHN0cnVjdCBzZXJpYWxfc3RydWN0ICopIGFyZyk7CisJCQlyZXR1cm4gZ2V0X3NlcmlhbF9pbmZvKGluZm8sIGFyZ3ApOwogCQljYXNlIFRJT0NTU0VSSUFMOgotCQkJcmV0dXJuIHNldF9zZXJpYWxfaW5mbyhpbmZvLAotCQkJCQkgICAgICAgKHN0cnVjdCBzZXJpYWxfc3RydWN0ICopIGFyZyk7CisJCQlyZXR1cm4gc2V0X3NlcmlhbF9pbmZvKGluZm8sIGFyZ3ApOwogCQljYXNlIFRJT0NTRVJDT05GSUc6CiAJCQlyZXR1cm4gMDsKIAogCQljYXNlIFRJT0NTRVJHRVRMU1I6IC8qIEdldCBsaW5lIHN0YXR1cyByZWdpc3RlciAqLwotCQkJcmV0dXJuIGdldF9sc3JfaW5mbyhpbmZvLCAodW5zaWduZWQgaW50ICopIGFyZyk7CisJCQlyZXR1cm4gZ2V0X2xzcl9pbmZvKGluZm8sIGFyZ3ApOwogCiAJCWNhc2UgVElPQ1NFUkdTVFJVQ1Q6Ci0JCQlpZiAoY29weV90b191c2VyKChzdHJ1Y3QgYXN5bmNfc3RydWN0ICopIGFyZywKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwKIAkJCQkJIGluZm8sIHNpemVvZihzdHJ1Y3QgYXN5bmNfc3RydWN0KSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQlyZXR1cm4gMDsKQEAgLTEzNzYsNyArMTM2OCw3IEBACiAJCQlpY291bnQuYnJrID0gY25vdy5icms7CiAJCQlpY291bnQuYnVmX292ZXJydW4gPSBjbm93LmJ1Zl9vdmVycnVuOwogCi0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmaWNvdW50LCBzaXplb2YoaWNvdW50KSkpCisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpY291bnQsIHNpemVvZihpY291bnQpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCXJldHVybiAwOwogCQljYXNlIFRJT0NTRVJHV0lMRDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9jczU1MzVfZ3Bpby5jIGIvZHJpdmVycy9jaGFyL2NzNTUzNV9ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ3MmY1MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9jczU1MzVfZ3Bpby5jCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICogQU1EIENTNTUzNS9DUzU1MzYgR1BJTyBkcml2ZXIuCisgKiBBbGxvd3MgYSB1c2VyIHNwYWNlIHByb2Nlc3MgdG8gcGxheSB3aXRoIHRoZSBHUElPIHBpbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IEJlbiBHYXJkbmVyIDxiZ2FyZG5lckB3YWJ0ZWMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgc21lbXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisKKyNkZWZpbmUgTkFNRQkJCSJjczU1MzVfZ3BpbyIKKworTU9EVUxFX0FVVEhPUigiQmVuIEdhcmRuZXIgPGJnYXJkbmVyQHdhYnRlYy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFNRCBDUzU1MzUvQ1M1NTM2IEdQSU8gUGluIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IG1ham9yOworbW9kdWxlX3BhcmFtKG1ham9yLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYWpvciwgIk1ham9yIGRldmljZSBudW1iZXIiKTsKKworc3RhdGljIHVsb25nIG1hc2s7Cittb2R1bGVfcGFyYW0obWFzaywgdWxvbmcsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXNrLCAiR1BJTyBjaGFubmVsIG1hc2siKTsKKworI2RlZmluZSBNU1JfTEJBUl9HUElPCQkweDUxNDAwMDBDCisKK3N0YXRpYyB1MzIgZ3Bpb19iYXNlOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZGl2aWxfcGNpW10gPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlMsICBQQ0lfREVWSUNFX0lEX05TX0NTNTUzNV9JU0EpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF9DUzU1MzZfSVNBKSB9LAorCXsgfSAvKiBOVUxMIGVudHJ5ICovCit9OworCitzdGF0aWMgc3RydWN0IGNkZXYgY3M1NTM1X2dwaW9fY2RldjsKKworLyogcmVzZXJ2ZSAzMiBlbnRyaWVzIGV2ZW4gdGhvdWdoIHNvbWUgYXJlbid0IHVzYWJsZSAqLworI2RlZmluZSBDUzU1MzVfR1BJT19DT1VOVAkzMgorCisvKiBJTyBibG9jayBzaXplICovCisjZGVmaW5lIENTNTUzNV9HUElPX1NJWkUJMjU2CisKK3N0cnVjdCBncGlvX3JlZ21hcCB7CisJdTMyCXJkX29mZnNldDsKKwl1MzIJd3Jfb2Zmc2V0OworCWNoYXIJb247CisJY2hhcglvZmY7Cit9Oworc3RhdGljIHN0cnVjdCBncGlvX3JlZ21hcCBybVtdID0KK3sKKwl7IDB4MzAsIDB4MDAsICcxJywgJzAnIH0sCS8qIEdQSU94X1JFQURfQkFDSyAvIEdQSU94X09VVF9WQUwgKi8KKwl7IDB4MjAsIDB4MjAsICdJJywgJ2knIH0sCS8qIEdQSU94X0lOX0VOICovCisJeyAweDA0LCAweDA0LCAnTycsICdvJyB9LAkvKiBHUElPeF9PVVRfRU4gKi8KKwl7IDB4MDgsIDB4MDgsICd0JywgJ1QnIH0sCS8qIEdQSU94X09VVF9PRF9FTiAqLworCXsgMHgxOCwgMHgxOCwgJ1AnLCAncCcgfSwJLyogR1BJT3hfT1VUX1BVX0VOICovCisJeyAweDFjLCAweDFjLCAnRCcsICdkJyB9LAkvKiBHUElPeF9PVVRfUERfRU4gKi8KK307CisKKworLyoqCisgKiBHZXRzIHRoZSByZWdpc3RlciBvZmZzZXQgZm9yIHRoZSBHUElPIGJhbmsuCisgKiBMb3cgKDAtMTUpIHN0YXJ0cyBhdCAweDAwLCBoaWdoICgxNi0zMSkgc3RhcnRzIGF0IDB4ODAKKyAqLworc3RhdGljIGlubGluZSB1MzIgY3M1NTM1X2xvd2hpZ2hfYmFzZShpbnQgcmVnKQoreworCXJldHVybiAocmVnICYgMHgxMCkgPDwgMzsKK30KKworc3RhdGljIHNzaXplX3QgY3M1NTM1X2dwaW9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLAorCQkJCSBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJdTMyCW0gPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWludAlpLCBqOworCXUzMgliYXNlID0gZ3Bpb19iYXNlICsgY3M1NTM1X2xvd2hpZ2hfYmFzZShtKTsKKwl1MzIJbTAsIG0xOworCWNoYXIJYzsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIG1hc2sgZm9yIGF0b21pYyBiaXQgcHJvZ3JhbW1pbmcuCisJICogVGhlIGhpZ2ggMTYgYml0cyBhbmQgdGhlIGxvdyAxNiBiaXRzIGFyZSB1c2VkIHRvIHNldCB0aGUgbWFzay4KKwkgKiBGb3IgZXhhbXBsZSwgR1BJTyAxNSBtYXBzIHRvIDMxLDE1OiAwLDEgPT4gT247IDEsMD0+IE9mZgorCSAqLworCW0xID0gMSA8PCAobSAmIDB4MEYpOworCW0wID0gbTEgPDwgMTY7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKwkJaWYgKGdldF91c2VyKGMsIGRhdGEraSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShybSk7IGorKykgeworCQkJaWYgKGMgPT0gcm1bal0ub24pIHsKKwkJCQlvdXRsKG0xLCBiYXNlICsgcm1bal0ud3Jfb2Zmc2V0KTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoYyA9PSBybVtqXS5vZmYpIHsKKwkJCQlvdXRsKG0wLCBiYXNlICsgcm1bal0ud3Jfb2Zmc2V0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwkqcHBvcyA9IDA7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgY3M1NTM1X2dwaW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQlzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJdTMyCW0gPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXUzMgliYXNlID0gZ3Bpb19iYXNlICsgY3M1NTM1X2xvd2hpZ2hfYmFzZShtKTsKKwlpbnQJcmRfYml0ID0gMSA8PCAobSAmIDB4MGYpOworCWludAlpOworCWNoYXIJY2g7CisJc3NpemVfdAljb3VudCA9IDA7CisKKwlpZiAoKnBwb3MgPj0gQVJSQVlfU0laRShybSkpCisJCXJldHVybiAwOworCisJZm9yIChpID0gKnBwb3M7IChpIDwgKCpwcG9zICsgbGVuKSkgJiYgKGkgPCBBUlJBWV9TSVpFKHJtKSk7IGkrKykgeworCQljaCA9IChpbmwoYmFzZSArIHJtW2ldLnJkX29mZnNldCkgJiByZF9iaXQpID8KKwkJICAgICBybVtpXS5vbiA6IHJtW2ldLm9mZjsKKworCQlpZiAocHV0X3VzZXIoY2gsIGJ1Zitjb3VudCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQljb3VudCsrOworCX0KKworCS8qIGFkZCBhIGxpbmUtZmVlZCBpZiB0aGVyZSBpcyByb29tICovCisJaWYgKChpID09IEFSUkFZX1NJWkUocm0pKSAmJiAoY291bnQgPCBsZW4pKSB7CisJCXB1dF91c2VyKCdcbicsIGJ1ZiArIGNvdW50KTsKKwkJY291bnQrKzsKKwl9CisKKwkqcHBvcyArPSBjb3VudDsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgY3M1NTM1X2dwaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1MzIgbSA9IGltaW5vcihpbm9kZSk7CisKKwkvKiB0aGUgbWFzayBzYXlzIHdoaWNoIHBpbnMgYXJlIHVzYWJsZSBieSB0aGlzIGRyaXZlciAqLworCWlmICgobWFzayAmICgxIDw8IG0pKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY3M1NTM1X2dwaW9fZm9wcyA9IHsKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkud3JpdGUJPSBjczU1MzVfZ3Bpb193cml0ZSwKKwkucmVhZAk9IGNzNTUzNV9ncGlvX3JlYWQsCisJLm9wZW4JPSBjczU1MzVfZ3Bpb19vcGVuCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjczU1MzVfZ3Bpb19pbml0KHZvaWQpCit7CisJZGV2X3QJZGV2X2lkOworCXUzMglsb3csIGhpOworCWludAlyZXR2YWw7CisKKwlpZiAocGNpX2Rldl9wcmVzZW50KGRpdmlsX3BjaSkgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIE5BTUUgIjogRElWSUwgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogR3JhYiB0aGUgR1BJTyBJL08gcmFuZ2UgKi8KKwlyZG1zcihNU1JfTEJBUl9HUElPLCBsb3csIGhpKTsKKworCS8qIENoZWNrIHRoZSBtYXNrIGFuZCB3aGV0aGVyIEdQSU8gaXMgZW5hYmxlZCAoc2FuaXR5IGNoZWNrKSAqLworCWlmIChoaSAhPSAweDAwMDBmMDAxKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgTkFNRSAiOiBHUElPIG5vdCBlbmFibGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogTWFzayBvZmYgdGhlIElPIGJhc2UgYWRkcmVzcyAqLworCWdwaW9fYmFzZSA9IGxvdyAmIDB4MDAwMGZmMDA7CisKKwkvKioKKwkgKiBTb21lIEdQSU8gcGlucworCSAqICAzMS0yOSwyMyA6IHJlc2VydmVkIChhbHdheXMgbWFzayBvdXQpCisJICogIDI4ICAgICAgIDogUG93ZXIgQnV0dG9uCisJICogIDI2ICAgICAgIDogUE1FIworCSAqICAyMi0xNiAgICA6IExQQworCSAqICAxNCwxNSAgICA6IFNNQnVzCisJICogIDksOCAgICAgIDogVUFSVDEKKwkgKiAgNyAgICAgICAgOiBQQ0kgSU5UQgorCSAqICAzLDQgICAgICA6IFVBUlQyL0REQworCSAqICAyICAgICAgICA6IElERV9JUlEwCisJICogIDAgICAgICAgIDogUENJIElOVEEKKwkgKgorCSAqIElmIGEgbWFzayB3YXMgbm90IHNwZWNpZmllZCwgYmUgY29uc2VydmF0aXZlIGFuZCBvbmx5IGFsbG93OgorCSAqICAxLDIsNSw2LDEwLTEzLDI0LDI1LDI3CisJICovCisJaWYgKG1hc2sgIT0gMCkKKwkJbWFzayAmPSAweDFmN2ZmZmZmOworCWVsc2UKKwkJbWFzayA9IDB4MGIwMDNjNjY7CisKKwlpZiAocmVxdWVzdF9yZWdpb24oZ3Bpb19iYXNlLCBDUzU1MzVfR1BJT19TSVpFLCBOQU1FKSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBOQU1FICI6IGNhbid0IGFsbG9jYXRlIEkvTyBmb3IgR1BJT1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChtYWpvcikgeworCQlkZXZfaWQgPSBNS0RFVihtYWpvciwgMCk7CisJCXJldHZhbCA9IHJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2X2lkLCBDUzU1MzVfR1BJT19DT1VOVCwKKwkJCQkJCU5BTUUpOworCX0gZWxzZSB7CisJCXJldHZhbCA9IGFsbG9jX2NocmRldl9yZWdpb24oJmRldl9pZCwgMCwgQ1M1NTM1X0dQSU9fQ09VTlQsCisJCQkJCSAgICAgTkFNRSk7CisJCW1ham9yID0gTUFKT1IoZGV2X2lkKTsKKwl9CisKKwlpZiAocmV0dmFsKSB7CisJCXJlbGVhc2VfcmVnaW9uKGdwaW9fYmFzZSwgQ1M1NTM1X0dQSU9fU0laRSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyBOQU1FICI6IGJhc2U9JSN4IG1hc2s9JSNseCBtYWpvcj0lZFxuIiwKKwkgICAgICAgZ3Bpb19iYXNlLCBtYXNrLCBtYWpvcik7CisKKwljZGV2X2luaXQoJmNzNTUzNV9ncGlvX2NkZXYsICZjczU1MzVfZ3Bpb19mb3BzKTsKKwljZGV2X2FkZCgmY3M1NTM1X2dwaW9fY2RldiwgZGV2X2lkLCBDUzU1MzVfR1BJT19DT1VOVCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNzNTUzNV9ncGlvX2NsZWFudXAodm9pZCkKK3sKKwlkZXZfdCBkZXZfaWQgPSBNS0RFVihtYWpvciwgMCk7CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGRldl9pZCwgQ1M1NTM1X0dQSU9fQ09VTlQpOworCWlmIChncGlvX2Jhc2UgIT0gMCkKKwkJcmVsZWFzZV9yZWdpb24oZ3Bpb19iYXNlLCBDUzU1MzVfR1BJT19TSVpFKTsKK30KKworbW9kdWxlX2luaXQoY3M1NTM1X2dwaW9faW5pdCk7Cittb2R1bGVfZXhpdChjczU1MzVfZ3Bpb19jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9jeWNsYWRlcy5jIGIvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMKaW5kZXggYzdmODE4Yy4uMzljNjFhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMKKysrIGIvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMKQEAgLTY0MSw2ICs2NDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgpAQCAtNzIzLDcgKzcyNCw3IEBACiAgICAgICAgIDB4REUwMDAsCiAgICAgICAgIDAsMCwwLDAsMCwwLDAsMAogfTsKLSNkZWZpbmUgTlJfSVNBX0FERFJTIChzaXplb2YoY3lfaXNhX2FkZHJlc3Nlcykvc2l6ZW9mKHVuc2lnbmVkIGNoYXIqKSkKKyNkZWZpbmUgTlJfSVNBX0FERFJTIEFSUkFZX1NJWkUoY3lfaXNhX2FkZHJlc3NlcykKIAogI2lmZGVmIE1PRFVMRQogc3RhdGljIGxvbmcgbWFkZHJbTlJfQ0FSRFNdID0geyAwLCB9OwpAQCAtMTA4Niw3ICsxMDg3LDcgQEAKICAgaW50IGhhZF93b3JrOwogICBpbnQgbWRtX2NoYW5nZTsKICAgaW50IG1kbV9zdGF0dXM7Ci0KKyAgaW50IGxlbjsKICAgICBpZigoY2luZm8gPSAoc3RydWN0IGN5Y2xhZGVzX2NhcmQgKilkZXZfaWQpID09IDApewogI2lmZGVmIENZX0RFQlVHX0lOVEVSUlVQVFMKIAlwcmludGsoImN5eV9pbnRlcnJ1cHQ6IHNwdXJpb3VzIGludGVycnVwdCAlZFxuXHIiLCBpcnEpOwpAQCAtMTE2Myw2MyArMTE2NCw0MyBAQAogCQkJCWluZm8tPmljb3VudC5yeCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR0eS0+ZmxpcC5jb3VudCA8IFRUWV9GTElQQlVGX1NJWkUpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dHktPmZsaXAuY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCAxKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSAmIGluZm8tPnJlYWRfc3RhdHVzX21hc2spewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YSAmIEN5QlJFQUspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPQotCSAgICAJCQkJCQkgICAgVFRZX0JSRUFLOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPQotCQkJCQkgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lSRFNSPDxpbmRleCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVJEU1I8PGluZGV4KSksIFRUWV9CUkVBSyk7CiAJCQkJCWluZm8tPmljb3VudC5yeCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT5mbGFncyAmIEFTWU5DX1NBSyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX1NBSyh0dHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGRhdGEgJiBDeUZSQU1FKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0KLQkJCQkJCQkgICAgVFRZX0ZSQU1FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPQotCQkJCQkgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lSRFNSPDxpbmRleCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVJEU1I8PGluZGV4KSksIFRUWV9GUkFNRSk7CiAJCQkJCWluZm8tPmljb3VudC5yeCsrOwogCQkJCQlpbmZvLT5pZGxlX3N0YXRzLmZyYW1lX2VycnMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGRhdGEgJiBDeVBBUklUWSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9Ci0JCQkJCQkJICAgIFRUWV9QQVJJVFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9Ci0JCQkJCSAgY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVJEU1I8PGluZGV4KSk7CisJCQkJCS8qIFBpZWNlcyBvZiBzZXZlbi4uLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVJEU1I8PGluZGV4KSksIFRUWV9QQVJJVFkpOwogCQkJCQlpbmZvLT5pY291bnQucngrKzsKIAkJCQkJaW5mby0+aWRsZV9zdGF0cy5wYXJpdHlfZXJycysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoZGF0YSAmIEN5T1ZFUlJVTil7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9Ci0JCQkJCQkJICAgIFRUWV9PVkVSUlVOOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pOwogCQkJCQlpbmZvLT5pY291bnQucngrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgZmxpcCBidWZmZXIgaXRzZWxmIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3dpbmcsIHdlIHN0aWxsIGxvc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbmV4dCBpbmNvbWluZyBjaGFyYWN0ZXIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHR5LT5mbGlwLmNvdW50Ci0JCQkJCSAgICAgICAgICAgPCBUVFlfRkxJUEJVRl9TSVpFKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHR5LT5mbGlwLmNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPQotCQkJCQkJCSAgICAgVFRZX05PUk1BTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0KLQkJCQkJICAgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lSRFNSPDxpbmRleCkpOwotCQkJCQkgICAgaW5mby0+aWNvdW50LnJ4Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVJEU1I8PGluZGV4KSksIFRUWV9GUkFNRSk7CisJCQkJICAgICAgICBpbmZvLT5pY291bnQucngrKzsKIAkJCQkJaW5mby0+aWRsZV9zdGF0cy5vdmVycnVucysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlc2UgdHdvIGNvbmRpdGlvbnMgbWF5IGltcGx5ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhIG5vcm1hbCByZWFkIHNob3VsZCBiZSBkb25lLiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogfWVsc2UgaWYoZGF0YSAmIEN5VElNRU9VVCl7ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB9ZWxzZSBpZihkYXRhICYgQ3lTUEVDSEFSKXsgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSAwOwotCQkJCQlpbmZvLT5pY291bnQucngrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIHsKKwkJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfTk9STUFMKTsKKwkJCQkgICAgICAgIGluZm8tPmljb3VudC5yeCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IDA7CisJCQkJICAgIHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX05PUk1BTCk7CiAJCQkJICAgIGluZm8tPmljb3VudC5yeCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CkBAIC0xMjQwLDE0ICsxMjIxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+bW9uLmNoYXJfbWF4ID0gY2hhcl9jb3VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5tb24uY2hhcl9sYXN0ID0gY2hhcl9jb3VudDsKICNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKGNoYXJfY291bnQtLSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHR5LT5mbGlwLmNvdW50Kys7CisJCQkgICAgbGVuID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBjaGFyX2NvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShsZW4tLSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5UkRTUjw8aW5kZXgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9OT1JNQUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSBkYXRhOworCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgZGF0YSwgVFRZX05PUk1BTCk7CiAJCQkJaW5mby0+aWRsZV9zdGF0cy5yZWN2X2J5dGVzKys7CiAJCQkJaW5mby0+aWNvdW50LnJ4Kys7CiAjaWZkZWYgQ1lfMTZZX0hBQ0sKQEAgLTEyNTYsNyArMTIzMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5pZGxlX3N0YXRzLnJlY3ZfaWRsZSA9IGppZmZpZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+ZmxpcC53b3JrLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5idWYud29yaywgMSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIHNlcnZpY2UgKi8KICAgICAgICAgICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lSSVI8PGluZGV4KSwgKHNhdmVfeGlyICYgMHgzZikpOwpAQCAtMTU1MSw2ICsxNTI4LDcgQEAKICAgc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvID0gJmN5X2NhcmRbaW5mby0+Y2FyZF07CiAgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7CiAgIHZvbGF0aWxlIGludCBjaGFyX2NvdW50OworICBpbnQgbGVuOwogI2lmZGVmIEJMT0NLTU9WRQogICBpbnQgc21hbGxfY291bnQ7CiAjZWxzZQpAQCAtMTYwNiwxOCArMTU4NCwxMSBAQAogCQl0dHktPmZsaXAuY291bnQgKz0gc21hbGxfY291bnQ7CiAJICAgIH0KICNlbHNlCi0JICAgIHdoaWxlKGNoYXJfY291bnQtLSl7Ci0JCWlmICh0dHktPmZsaXAuY291bnQgPj0gTl9UVFlfQlVGX1NJWkUgLSB0dHktPnJlYWRfY250KQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpCi0JCSAgICBicmVhazsKLQorCSAgICBsZW4gPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIGNoYXJfY291bnQpOworCSAgICB3aGlsZShsZW4tLSl7CiAJCWRhdGEgPSBjeV9yZWFkYihjaW5mby0+YmFzZV9hZGRyICsgcnhfYnVmYWRkciArIG5ld19yeF9nZXQpOwogCQluZXdfcnhfZ2V0ID0gKG5ld19yeF9nZXQgKyAxKSAmIChyeF9idWZzaXplIC0gMSk7Ci0JCXR0eS0+ZmxpcC5jb3VudCsrOwotCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX05PUk1BTDsKLQkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IGRhdGE7CisJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgZGF0YSwgVFRZX05PUk1BTCk7CiAJCWluZm8tPmlkbGVfc3RhdHMucmVjdl9ieXRlcysrOwogCQlpbmZvLT5pY291bnQucngrKzsKIAkgICAgfQpAQCAtMTYzNSw3ICsxNjA2LDcgQEAKIAkgICAgfQogI2VuZGlmCiAJICAgIGluZm8tPmlkbGVfc3RhdHMucmVjdl9pZGxlID0gamlmZmllczsKLQkgICAgc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yaywgMSk7CisJICAgIHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5idWYud29yaywgMSk7CiAJfQogCS8qIFVwZGF0ZSByeF9nZXQgKi8KIAljeV93cml0ZWwoJmJ1Zl9jdHJsLT5yeF9nZXQsIG5ld19yeF9nZXQpOwpAQCAtMTc2MywyMyArMTczNCwxNyBAQAogCiAJc3dpdGNoKGNtZCkgewogCSAgICBjYXNlIENfQ01fUFJfRVJST1I6Ci0JCXR0eS0+ZmxpcC5jb3VudCsrOwotCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX1BBUklUWTsKLQkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IDA7CisJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX1BBUklUWSk7CiAJCWluZm8tPmljb3VudC5yeCsrOwogCQlzcGVjaWFsX2NvdW50Kys7CiAJCWJyZWFrOwogCSAgICBjYXNlIENfQ01fRlJfRVJST1I6Ci0JCXR0eS0+ZmxpcC5jb3VudCsrOwotCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX0ZSQU1FOwotCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gMDsKKwkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfRlJBTUUpOwogCQlpbmZvLT5pY291bnQucngrKzsKIAkJc3BlY2lhbF9jb3VudCsrOwogCQlicmVhazsKIAkgICAgY2FzZSBDX0NNX1JYQlJLOgotCQl0dHktPmZsaXAuY291bnQrKzsKLQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9CUkVBSzsKLQkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IDA7CisJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX0JSRUFLKTsKIAkJaW5mby0+aWNvdW50LnJ4Kys7CiAJCXNwZWNpYWxfY291bnQrKzsKIAkJYnJlYWs7CkBAIC0xODQ0LDcgKzE4MDksNyBAQAogCWlmKGRlbHRhX2NvdW50KQogCSAgICBjeV9zY2hlZF9ldmVudChpbmZvLCBDeV9FVkVOVF9ERUxUQV9XQUtFVVApOwogCWlmKHNwZWNpYWxfY291bnQpCi0JICAgIHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmssIDEpOworCSAgICBzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+YnVmLndvcmssIDEpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9kcm0vTWFrZWZpbGUKaW5kZXggZTQxMDYwYy4uOWQxODBjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2NoYXIvZHJtL01ha2VmaWxlCkBAIC0zLDcgKzMsNyBAQAogIyBEaXJlY3QgUmVuZGVyaW5nIEluZnJhc3RydWN0dXJlIChEUkkpIGluIFhGcmVlODYgNC4xLjAgYW5kIGhpZ2hlci4KIAogZHJtLW9ianMgICAgOj0JZHJtX2F1dGgubyBkcm1fYnVmcy5vIGRybV9jb250ZXh0Lm8gZHJtX2RtYS5vIGRybV9kcmF3YWJsZS5vIFwKLQkJZHJtX2Rydi5vIGRybV9mb3BzLm8gZHJtX2luaXQubyBkcm1faW9jdGwubyBkcm1faXJxLm8gXAorCQlkcm1fZHJ2Lm8gZHJtX2ZvcHMubyBkcm1faW9jdGwubyBkcm1faXJxLm8gXAogCQlkcm1fbG9jay5vIGRybV9tZW1vcnkubyBkcm1fcHJvYy5vIGRybV9zdHViLm8gZHJtX3ZtLm8gXAogCQlkcm1fYWdwc3VwcG9ydC5vIGRybV9zY2F0dGVyLm8gYXRpX3BjaWdhcnQubyBkcm1fcGNpLm8gXAogCQlkcm1fc3lzZnMubwpAQCAtMTgsNyArMTgsNyBAQAogZmZiLW9ianMgICAgOj0gZmZiX2Rydi5vIGZmYl9jb250ZXh0Lm8KIHNpcy1vYmpzICAgIDo9IHNpc19kcnYubyBzaXNfZHMubyBzaXNfbW0ubwogc2F2YWdlLW9ianMgOj0gc2F2YWdlX2Rydi5vIHNhdmFnZV9iY2kubyBzYXZhZ2Vfc3RhdGUubwotdmlhLW9ianMgICAgOj0gdmlhX2lycS5vIHZpYV9kcnYubyB2aWFfZHMubyB2aWFfbWFwLm8gdmlhX21tLm8gdmlhX2RtYS5vIHZpYV92ZXJpZmllci5vIHZpYV92aWRlby5vCit2aWEtb2JqcyAgICA6PSB2aWFfaXJxLm8gdmlhX2Rydi5vIHZpYV9kcy5vIHZpYV9tYXAubyB2aWFfbW0ubyB2aWFfZG1hLm8gdmlhX3ZlcmlmaWVyLm8gdmlhX3ZpZGVvLm8gdmlhX2RtYWJsaXQubwogCiBpZmVxICgkKENPTkZJR19DT01QQVQpLHkpCiBkcm0tb2JqcyAgICArPSBkcm1faW9jMzIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9hdGlfcGNpZ2FydC5jIGIvZHJpdmVycy9jaGFyL2RybS9hdGlfcGNpZ2FydC5jCmluZGV4IGVmZmYwZWUuLjU0ODUzODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vYXRpX3BjaWdhcnQuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2F0aV9wY2lnYXJ0LmMKQEAgLTUyLDcgKzUyLDcgQEAKICMgZGVmaW5lIEFUSV9NQVhfUENJR0FSVF9QQUdFUwkJODE5MgkvKio8IDMyIE1CIGFwZXJ0dXJlLCA0SyBwYWdlcyAqLwogIyBkZWZpbmUgQVRJX1BDSUdBUlRfUEFHRV9TSVpFCQk0MDk2CS8qKjwgUENJIEdBUlQgcGFnZSBzaXplICovCiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRybV9hdGlfYWxsb2NfcGNpZ2FydF90YWJsZSh2b2lkKQorc3RhdGljIHZvaWQgKmRybV9hdGlfYWxsb2NfcGNpZ2FydF90YWJsZSh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKQEAgLTcyLDI3ICs3MiwyNiBAQAogCX0KIAogCURSTV9ERUJVRygiJXM6IHJldHVybmluZyAweCUwOGx4XG4iLCBfX0ZVTkNUSU9OX18sIGFkZHJlc3MpOwotCXJldHVybiBhZGRyZXNzOworCXJldHVybiAodm9pZCAqKWFkZHJlc3M7CiB9CiAKLXN0YXRpYyB2b2lkIGRybV9hdGlfZnJlZV9wY2lnYXJ0X3RhYmxlKHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3N0YXRpYyB2b2lkIGRybV9hdGlfZnJlZV9wY2lnYXJ0X3RhYmxlKHZvaWQgKmFkZHJlc3MpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJaW50IGk7CiAJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKIAotCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UoYWRkcmVzcyk7CisJcGFnZSA9IHZpcnRfdG9fcGFnZSgodW5zaWduZWQgbG9uZylhZGRyZXNzKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBVElfUENJR0FSVF9UQUJMRV9QQUdFUzsgaSsrLCBwYWdlKyspIHsKIAkJX19wdXRfcGFnZShwYWdlKTsKIAkJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7CiAJfQogCi0JZnJlZV9wYWdlcyhhZGRyZXNzLCBBVElfUENJR0FSVF9UQUJMRV9PUkRFUik7CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylhZGRyZXNzLCBBVElfUENJR0FSVF9UQUJMRV9PUkRFUik7CiB9CiAKLWludCBkcm1fYXRpX3BjaWdhcnRfY2xlYW51cChkcm1fZGV2aWNlX3QgKiBkZXYsCi0JCQkgICAgZHJtX2F0aV9wY2lnYXJ0X2luZm8gKiBnYXJ0X2luZm8pCitpbnQgZHJtX2F0aV9wY2lnYXJ0X2NsZWFudXAoZHJtX2RldmljZV90ICpkZXYsIGRybV9hdGlfcGNpZ2FydF9pbmZvICpnYXJ0X2luZm8pCiB7CiAJZHJtX3NnX21lbV90ICplbnRyeSA9IGRldi0+c2c7CiAJdW5zaWduZWQgbG9uZyBwYWdlczsKQEAgLTEzNiwxMCArMTM1LDEwIEBACiAKIEVYUE9SVF9TWU1CT0woZHJtX2F0aV9wY2lnYXJ0X2NsZWFudXApOwogCi1pbnQgZHJtX2F0aV9wY2lnYXJ0X2luaXQoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYXRpX3BjaWdhcnRfaW5mbyAqIGdhcnRfaW5mbykKK2ludCBkcm1fYXRpX3BjaWdhcnRfaW5pdChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2F0aV9wY2lnYXJ0X2luZm8gKmdhcnRfaW5mbykKIHsKIAlkcm1fc2dfbWVtX3QgKmVudHJ5ID0gZGV2LT5zZzsKLQl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAwOworCXZvaWQgKmFkZHJlc3MgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgcGFnZXM7CiAJdTMyICpwY2lfZ2FydCwgcGFnZV9iYXNlLCBidXNfYWRkcmVzcyA9IDA7CiAJaW50IGksIGosIHJldCA9IDA7CkBAIC0xNjMsNyArMTYyLDcgQEAKIAkJCWdvdG8gZG9uZTsKIAkJfQogCi0JCWJ1c19hZGRyZXNzID0gcGNpX21hcF9zaW5nbGUoZGV2LT5wZGV2LCAodm9pZCAqKWFkZHJlc3MsCisJCWJ1c19hZGRyZXNzID0gcGNpX21hcF9zaW5nbGUoZGV2LT5wZGV2LCBhZGRyZXNzLAogCQkJCQkgICAgIEFUSV9QQ0lHQVJUX1RBQkxFX1BBR0VTICoKIAkJCQkJICAgICBQQUdFX1NJWkUsIFBDSV9ETUFfVE9ERVZJQ0UpOwogCQlpZiAoYnVzX2FkZHJlc3MgPT0gMCkgewpAQCAtMTc2LDcgKzE3NSw3IEBACiAJCWFkZHJlc3MgPSBnYXJ0X2luZm8tPmFkZHI7CiAJCWJ1c19hZGRyZXNzID0gZ2FydF9pbmZvLT5idXNfYWRkcjsKIAkJRFJNX0RFQlVHKCJQQ0k6IEdhcnQgVGFibGU6IFZSQU0gJTA4WCBtYXBwZWQgYXQgJTA4bFhcbiIsCi0JCQkgIGJ1c19hZGRyZXNzLCBhZGRyZXNzKTsKKwkJCSAgYnVzX2FkZHJlc3MsICh1bnNpZ25lZCBsb25nKWFkZHJlc3MpOwogCX0KIAogCXBjaV9nYXJ0ID0gKHUzMiAqKSBhZGRyZXNzOwpAQCAtMTk1LDcgKzE5NCw3IEBACiAJCWlmIChlbnRyeS0+YnVzYWRkcltpXSA9PSAwKSB7CiAJCQlEUk1fRVJST1IoInVuYWJsZSB0byBtYXAgUENJR0FSVCBwYWdlcyFcbiIpOwogCQkJZHJtX2F0aV9wY2lnYXJ0X2NsZWFudXAoZGV2LCBnYXJ0X2luZm8pOwotCQkJYWRkcmVzcyA9IDA7CisJCQlhZGRyZXNzID0gTlVMTDsKIAkJCWJ1c19hZGRyZXNzID0gMDsKIAkJCWdvdG8gZG9uZTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vZHJtLmgKaW5kZXggNjRkNjIzNy4uOWRhMGRkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybS5oCkBAIC05MCw4ICs5MCw4IEBACiAjZGVmaW5lIERSTV9NQVhfT1JERVIJMjIJICAvKio8IFVwIHRvIDJeMjIgYnl0ZXMgPSA0TUIgKi8KICNkZWZpbmUgRFJNX1JBTV9QRVJDRU5UIDEwCSAgLyoqPCBIb3cgbXVjaCBzeXN0ZW0gcmFtIGNhbiB3ZSBsb2NrPyAqLwogCi0jZGVmaW5lIF9EUk1fTE9DS19IRUxECTB4ODAwMDAwMDAgLyoqPCBIYXJkd2FyZSBsb2NrIGlzIGhlbGQgKi8KLSNkZWZpbmUgX0RSTV9MT0NLX0NPTlQJMHg0MDAwMDAwMCAvKio8IEhhcmR3YXJlIGxvY2sgaXMgY29udGVuZGVkICovCisjZGVmaW5lIF9EUk1fTE9DS19IRUxECTB4ODAwMDAwMDBVIC8qKjwgSGFyZHdhcmUgbG9jayBpcyBoZWxkICovCisjZGVmaW5lIF9EUk1fTE9DS19DT05UCTB4NDAwMDAwMDBVIC8qKjwgSGFyZHdhcmUgbG9jayBpcyBjb250ZW5kZWQgKi8KICNkZWZpbmUgX0RSTV9MT0NLX0lTX0hFTEQobG9jaykJICAgKChsb2NrKSAmIF9EUk1fTE9DS19IRUxEKQogI2RlZmluZSBfRFJNX0xPQ0tfSVNfQ09OVChsb2NrKQkgICAoKGxvY2spICYgX0RSTV9MT0NLX0NPTlQpCiAjZGVmaW5lIF9EUk1fTE9DS0lOR19DT05URVhUKGxvY2spICgobG9jaykgJiB+KF9EUk1fTE9DS19IRUxEfF9EUk1fTE9DS19DT05UKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtUC5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1QLmgKaW5kZXggM2RjM2M5ZC4uNTRiNTYxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1QLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1QLmgKQEAgLTE0NCwyMCArMTQ0LDYgQEAKIC8qKiBcbmFtZSBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHNlY3Rpb24gKi8KIC8qQHsqLwogCi0jaWZuZGVmIE1PRFVMRV9MSUNFTlNFCi0jZGVmaW5lIE1PRFVMRV9MSUNFTlNFKHgpCi0jZW5kaWYKLQotI2lmbmRlZiBwcmVlbXB0X2Rpc2FibGUKLSNkZWZpbmUgcHJlZW1wdF9kaXNhYmxlKCkKLSNkZWZpbmUgcHJlZW1wdF9lbmFibGUoKQotI2VuZGlmCi0KLSNpZm5kZWYgcHRlX29mZnNldF9tYXAKLSNkZWZpbmUgcHRlX29mZnNldF9tYXAgcHRlX29mZnNldAotI2RlZmluZSBwdGVfdW5tYXAocHRlKQotI2VuZGlmCi0KICNkZWZpbmUgRFJNX1JQUl9BUkcodm1hKSB2bWEsCiAKICNkZWZpbmUgVk1fT0ZGU0VUKHZtYSkgKCh2bWEpLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUKQpAQCAtMjg2LDEwICsyNzIsMTMgQEAKIHR5cGVkZWYgaW50IGRybV9pb2N0bF9jb21wYXRfdChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZyk7CiAKKyNkZWZpbmUgRFJNX0FVVEgJMHgxCisjZGVmaW5lCURSTV9NQVNURVIJMHgyCisjZGVmaW5lIERSTV9ST09UX09OTFkJMHg0CisKIHR5cGVkZWYgc3RydWN0IGRybV9pb2N0bF9kZXNjIHsKIAlkcm1faW9jdGxfdCAqZnVuYzsKLQlpbnQgYXV0aF9uZWVkZWQ7Ci0JaW50IHJvb3Rfb25seTsKKwlpbnQgZmxhZ3M7CiB9IGRybV9pb2N0bF9kZXNjX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGRybV9kZXZzdGF0ZSB7CkBAIC0zODQsNiArMzczLDcgQEAKIC8qKiBGaWxlIHByaXZhdGUgZGF0YSAqLwogdHlwZWRlZiBzdHJ1Y3QgZHJtX2ZpbGUgewogCWludCBhdXRoZW50aWNhdGVkOworCWludCBtYXN0ZXI7CiAJaW50IG1pbm9yOwogCXBpZF90IHBpZDsKIAl1aWRfdCB1aWQ7CkBAIC01MzIsOCArNTIyLDkgQEAKIHR5cGVkZWYgc3RydWN0IGF0aV9wY2lnYXJ0X2luZm8gewogCWludCBnYXJ0X3RhYmxlX2xvY2F0aW9uOwogCWludCBpc19wY2llOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl2b2lkICphZGRyOwogCWRtYV9hZGRyX3QgYnVzX2FkZHI7CisJZHJtX2xvY2FsX21hcF90IG1hcHBpbmc7CiB9IGRybV9hdGlfcGNpZ2FydF9pbmZvOwogCiAvKioKQEAgLTU0NCwxNiArNTM1LDE0IEBACiBzdHJ1Y3QgZHJtX2RldmljZTsKIAogc3RydWN0IGRybV9kcml2ZXIgewotCWludCAoKnByZWluaXQpIChzdHJ1Y3QgZHJtX2RldmljZSAqLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLQl2b2lkICgqcHJlcmVsZWFzZSkgKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBmaWxlICogZmlscCk7Ci0Jdm9pZCAoKnByZXRha2Vkb3duKSAoc3RydWN0IGRybV9kZXZpY2UgKik7Ci0JaW50ICgqcG9zdGNsZWFudXApIChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKLQlpbnQgKCpwcmVzZXR1cCkgKHN0cnVjdCBkcm1fZGV2aWNlICopOwotCWludCAoKnBvc3RzZXR1cCkgKHN0cnVjdCBkcm1fZGV2aWNlICopOworCWludCAoKmxvYWQpIChzdHJ1Y3QgZHJtX2RldmljZSAqLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwlpbnQgKCpmaXJzdG9wZW4pIChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwlpbnQgKCpvcGVuKSAoc3RydWN0IGRybV9kZXZpY2UgKiwgZHJtX2ZpbGVfdCAqKTsKKwl2b2lkICgqcHJlY2xvc2UpIChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZmlsZSAqIGZpbHApOworCXZvaWQgKCpwb3N0Y2xvc2UpIChzdHJ1Y3QgZHJtX2RldmljZSAqLCBkcm1fZmlsZV90ICopOworCXZvaWQgKCpsYXN0Y2xvc2UpIChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwlpbnQgKCp1bmxvYWQpIChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIAlpbnQgKCpkbWFfaW9jdGwpIChEUk1fSU9DVExfQVJHUyk7Ci0JaW50ICgqb3Blbl9oZWxwZXIpIChzdHJ1Y3QgZHJtX2RldmljZSAqLCBkcm1fZmlsZV90ICopOwotCXZvaWQgKCpmcmVlX2ZpbHBfcHJpdikgKHN0cnVjdCBkcm1fZGV2aWNlICosIGRybV9maWxlX3QgKik7Ci0Jdm9pZCAoKnJlbGVhc2UpIChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZmlsZSAqIGZpbHApOwogCXZvaWQgKCpkbWFfcmVhZHkpIChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIAlpbnQgKCpkbWFfcXVpZXNjZW50KSAoc3RydWN0IGRybV9kZXZpY2UgKik7CiAJaW50ICgqY29udGV4dF9jdG9yKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBjb250ZXh0KTsKQEAgLTU2MSw4ICs1NTAsOSBAQAogCWludCAoKmtlcm5lbF9jb250ZXh0X3N3aXRjaCkgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgb2xkLAogCQkJCSAgICAgIGludCBuZXcpOwogCXZvaWQgKCprZXJuZWxfY29udGV4dF9zd2l0Y2hfdW5sb2NrKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCi0JCQkJCSAgICAgIGRybV9sb2NrX3QgKiBsb2NrKTsKKwkJCQkJICAgICAgZHJtX2xvY2tfdCAqbG9jayk7CiAJaW50ICgqdmJsYW5rX3dhaXQpIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CisJaW50ICgqZHJpX2xpYnJhcnlfbmFtZSkgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGNoYXIgKmJ1Zik7CiAKIAkvKioKIAkgKiBDYWxsZWQgYnkgXGMgZHJtX2RldmljZV9pc19hZ3AuICBUeXBpY2FsbHkgdXNlZCB0byBkZXRlcm1pbmUgaWYgYQpAQCAtNTc5LDE2ICs1NjksMjQgQEAKIAogCS8qIHRoZXNlIGhhdmUgdG8gYmUgZmlsbGVkIGluICovCiAKLQlpbnQgKCpwb3N0aW5pdCkgKHN0cnVjdCBkcm1fZGV2aWNlICosIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotCSBpcnFyZXR1cm5fdCgqaXJxX2hhbmRsZXIpIChEUk1fSVJRX0FSR1MpOworCWlycXJldHVybl90KCppcnFfaGFuZGxlcikgKERSTV9JUlFfQVJHUyk7CiAJdm9pZCAoKmlycV9wcmVpbnN0YWxsKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogCXZvaWQgKCppcnFfcG9zdGluc3RhbGwpIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiAJdm9pZCAoKmlycV91bmluc3RhbGwpIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiAJdm9pZCAoKnJlY2xhaW1fYnVmZmVycykgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZmlsZSAqIGZpbHApOworCXZvaWQgKCpyZWNsYWltX2J1ZmZlcnNfbG9ja2VkKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbHApOwogCXVuc2lnbmVkIGxvbmcgKCpnZXRfbWFwX29mcykgKGRybV9tYXBfdCAqIG1hcCk7CiAJdW5zaWduZWQgbG9uZyAoKmdldF9yZWdfb2ZzKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogCXZvaWQgKCpzZXRfdmVyc2lvbikgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fc2V0X3ZlcnNpb25fdCAqIHN2KTsKLQlpbnQgKCp2ZXJzaW9uKSAoZHJtX3ZlcnNpb25fdCAqIHZlcnNpb24pOworCisJaW50IG1ham9yOworCWludCBtaW5vcjsKKwlpbnQgcGF0Y2hsZXZlbDsKKwljaGFyICpuYW1lOworCWNoYXIgKmRlc2M7CisJY2hhciAqZGF0ZTsKKwogCXUzMiBkcml2ZXJfZmVhdHVyZXM7CiAJaW50IGRldl9wcml2X3NpemU7CiAJZHJtX2lvY3RsX2Rlc2NfdCAqaW9jdGxzOwpAQCAtNzUyLDE5ICs3NTAsNDMgQEAKIHsKIAlyZXR1cm4gZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9VU0VfTVRSUik7CiB9CisKKyNkZWZpbmUgRFJNX01UUlJfV0MJCU1UUlJfVFlQRV9XUkNPTUIKKworc3RhdGljIGlubGluZSBpbnQgZHJtX210cnJfYWRkKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXJldHVybiBtdHJyX2FkZChvZmZzZXQsIHNpemUsIGZsYWdzLCAxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZHJtX210cnJfZGVsKGludCBoYW5kbGUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXJldHVybiBtdHJyX2RlbChoYW5kbGUsIG9mZnNldCwgc2l6ZSk7Cit9CisKICNlbHNlCiAjZGVmaW5lIGRybV9jb3JlX2hhc19NVFJSKGRldikgKDApCisKKyNkZWZpbmUgRFJNX01UUlJfV0MJCTAKKworc3RhdGljIGlubGluZSBpbnQgZHJtX210cnJfYWRkKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkcm1fbXRycl9kZWwoaW50IGhhbmRsZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKiBcbmFtZSBJbnRlcm5hbCBmdW5jdGlvbiBkZWZpbml0aW9ucyAqLwogLypAeyovCiAKLQkJCQkvKiBNaXNjLiBzdXBwb3J0IChkcm1faW5pdC5oKSAqLwotZXh0ZXJuIGludCBkcm1fZmxhZ3M7Ci1leHRlcm4gdm9pZCBkcm1fcGFyc2Vfb3B0aW9ucyhjaGFyICpzKTsKLWV4dGVybiBpbnQgZHJtX2NwdV92YWxpZCh2b2lkKTsKLQogCQkJCS8qIERyaXZlciBzdXBwb3J0IChkcm1fZHJ2LmgpICovCiBleHRlcm4gaW50IGRybV9pbml0KHN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIpOwogZXh0ZXJuIHZvaWQgZHJtX2V4aXQoc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlcik7CkBAIC03NzIsMTIgKzc5NCwxMSBAQAogCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGV4dGVybiBsb25nIGRybV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgZHJtX3Rha2Vkb3duKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gaW50IGRybV9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICpkZXYpOwogCiAJCQkJLyogRGV2aWNlIHN1cHBvcnQgKGRybV9mb3BzLmgpICovCiBleHRlcm4gaW50IGRybV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKIGV4dGVybiBpbnQgZHJtX3N0dWJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1leHRlcm4gaW50IGRybV9mbHVzaChzdHJ1Y3QgZmlsZSAqZmlscCk7CiBleHRlcm4gaW50IGRybV9mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IG9uKTsKIGV4dGVybiBpbnQgZHJtX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOwogCkBAIC04MTksNiArODQwLDggQEAKIAkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGV4dGVybiBpbnQgZHJtX3NldHZlcnNpb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQgZHJtX25vb3Aoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiAKIAkJCQkvKiBDb250ZXh0IElPQ1RMIHN1cHBvcnQgKGRybV9jb250ZXh0LmgpICovCiBleHRlcm4gaW50IGRybV9yZXNjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCkBAIC04NTcsMTAgKzg4MCw2IEBACiBleHRlcm4gaW50IGRybV9hdXRobWFnaWMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogCi0JCQkJLyogUGxhY2Vob2xkZXIgZm9yIGlvY3RscyBwYXN0ICovCi1leHRlcm4gaW50IGRybV9ub29wKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotCiAJCQkJLyogTG9ja2luZyBJT0NUTCBzdXBwb3J0IChkcm1fbG9jay5oKSAqLwogZXh0ZXJuIGludCBkcm1fbG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKQEAgLTg3Myw2ICs4OTIsNyBAQAogCQkJCS8qIEJ1ZmZlciBtYW5hZ2VtZW50IHN1cHBvcnQgKGRybV9idWZzLmgpICovCiBleHRlcm4gaW50IGRybV9hZGRidWZzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfZGVzY190ICogcmVxdWVzdCk7CiBleHRlcm4gaW50IGRybV9hZGRidWZzX3BjaShkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfZGVzY190ICogcmVxdWVzdCk7CitleHRlcm4gaW50IGRybV9hZGRidWZzX2ZiKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYnVmX2Rlc2NfdCAqcmVxdWVzdCk7CiBleHRlcm4gaW50IGRybV9hZGRtYXAoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAogCQkgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgZHJtX21hcF90eXBlX3QgdHlwZSwKIAkJICAgICAgZHJtX21hcF9mbGFnc190IGZsYWdzLCBkcm1fbG9jYWxfbWFwX3QgKiogbWFwX3B0cik7CkBAIC05MDgsOCArOTI4LDggQEAKIAkJCQkvKiBJUlEgc3VwcG9ydCAoZHJtX2lycS5oKSAqLwogZXh0ZXJuIGludCBkcm1fY29udHJvbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgZHJtX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKIGV4dGVybiBpcnFyZXR1cm5fdCBkcm1faXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKK2V4dGVybiBpbnQgZHJtX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKIGV4dGVybiB2b2lkIGRybV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKIGV4dGVybiB2b2lkIGRybV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7CiBleHRlcm4gdm9pZCBkcm1fZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKQEAgLTkzMywxMyArOTUzLDE3IEBACiBleHRlcm4gaW50IGRybV9hZ3BfaW5mbyhkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9hZ3BfaW5mb190ICogaW5mbyk7CiBleHRlcm4gaW50IGRybV9hZ3BfaW5mb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgZHJtX2FncF9hbGxvYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK2V4dGVybiBpbnQgZHJtX2FncF9hbGxvYyhkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2FncF9idWZmZXJfdCAqcmVxdWVzdCk7CitleHRlcm4gaW50IGRybV9hZ3BfYWxsb2NfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBkcm1fYWdwX2ZyZWUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCitleHRlcm4gaW50IGRybV9hZ3BfZnJlZShkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2FncF9idWZmZXJfdCAqcmVxdWVzdCk7CitleHRlcm4gaW50IGRybV9hZ3BfZnJlZV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgZHJtX2FncF91bmJpbmQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCitleHRlcm4gaW50IGRybV9hZ3BfdW5iaW5kKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYWdwX2JpbmRpbmdfdCAqcmVxdWVzdCk7CitleHRlcm4gaW50IGRybV9hZ3BfdW5iaW5kX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50IGRybV9hZ3BfYmluZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK2V4dGVybiBpbnQgZHJtX2FncF9iaW5kKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYWdwX2JpbmRpbmdfdCAqcmVxdWVzdCk7CitleHRlcm4gaW50IGRybV9hZ3BfYmluZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGV4dGVybiBEUk1fQUdQX01FTSAqZHJtX2FncF9hbGxvY2F0ZV9tZW1vcnkoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLAogCQkJCQkgICAgc2l6ZV90IHBhZ2VzLCB1MzIgdHlwZSk7CkBAIC05OTEsMTAgKzEwMTUsOCBAQAogCQkJCQkJY2hhciAqbmFtZSk7CiBleHRlcm4gdm9pZCBkcm1fc3lzZnNfZGVzdHJveShzdHJ1Y3QgZHJtX3N5c2ZzX2NsYXNzICpjcyk7CiBleHRlcm4gc3RydWN0IGNsYXNzX2RldmljZSAqZHJtX3N5c2ZzX2RldmljZV9hZGQoc3RydWN0IGRybV9zeXNmc19jbGFzcyAqY3MsCi0JCQkJCQkgZGV2X3QgZGV2LAotCQkJCQkJIHN0cnVjdCBkZXZpY2UgKmRldmljZSwKLQkJCQkJCSBjb25zdCBjaGFyICpmbXQsIC4uLik7Ci1leHRlcm4gdm9pZCBkcm1fc3lzZnNfZGV2aWNlX3JlbW92ZShkZXZfdCBkZXYpOworCQkJCQkJIGRybV9oZWFkX3QgKmhlYWQpOworZXh0ZXJuIHZvaWQgZHJtX3N5c2ZzX2RldmljZV9yZW1vdmUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2KTsKIAogLyogSW5saW5lIHJlcGxhY2VtZW50cyBmb3IgRFJNX0lPUkVNQVAgbWFjcm9zICovCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGRybV9jb3JlX2lvcmVtYXAoc3RydWN0IGRybV9tYXAgKm1hcCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2FncHN1cHBvcnQuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2FncHN1cHBvcnQuYwppbmRleCAyYjY0NTNhLi5mYWJjOTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9hZ3BzdXBwb3J0LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYWdwc3VwcG9ydC5jCkBAIC0xLDUgKzEsNSBAQAogLyoqCi0gKiBcZmlsZSBkcm1fYWdwc3VwcG9ydC5oCisgKiBcZmlsZSBkcm1fYWdwc3VwcG9ydC5jCiAgKiBEUk0gc3VwcG9ydCBmb3IgQUdQL0dBUlQgYmFja2VuZAogICoKICAqIFxhdXRob3IgUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+CkBAIC05MSw3ICs5MSw3IEBACiAvKioKICAqIEFjcXVpcmUgdGhlIEFHUCBkZXZpY2UuCiAgKgotICogXHBhcmFtIGRldiBEUk0gZGV2aWNlIHRoYXQgaXMgdG8gYWNxdWlyZSBBR1AKKyAqIFxwYXJhbSBkZXYgRFJNIGRldmljZSB0aGF0IGlzIHRvIGFjcXVpcmUgQUdQLgogICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KICAqCiAgKiBWZXJpZmllcyB0aGUgQUdQIGRldmljZSBoYXNuJ3QgYmVlbiBhY3F1aXJlZCBiZWZvcmUgYW5kIGNhbGxzCkBAIC0xMzQsNyArMTM0LDcgQEAKIC8qKgogICogUmVsZWFzZSB0aGUgQUdQIGRldmljZS4KICAqCi0gKiBccGFyYW0gZGV2IERSTSBkZXZpY2UgdGhhdCBpcyB0byByZWxlYXNlIEFHUAorICogXHBhcmFtIGRldiBEUk0gZGV2aWNlIHRoYXQgaXMgdG8gcmVsZWFzZSBBR1AuCiAgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgogICoKICAqIFZlcmlmaWVzIHRoZSBBR1AgZGV2aWNlIGhhcyBiZWVuIGFjcXVpcmVkIGFuZCBjYWxscyBcYyBhZ3BfYmFja2VuZF9yZWxlYXNlLgpAQCAtMTQ3LDcgKzE0Nyw2IEBACiAJZGV2LT5hZ3AtPmFjcXVpcmVkID0gMDsKIAlyZXR1cm4gMDsKIH0KLQogRVhQT1JUX1NZTUJPTChkcm1fYWdwX3JlbGVhc2UpOwogCiBpbnQgZHJtX2FncF9yZWxlYXNlX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLApAQCAtMjA4LDMwICsyMDcsMjIgQEAKICAqIFZlcmlmaWVzIHRoZSBBR1AgZGV2aWNlIGlzIHByZXNlbnQgYW5kIGhhcyBiZWVuIGFjcXVpcmVkLCBhbGxvY2F0ZXMgdGhlCiAgKiBtZW1vcnkgdmlhIGFsbG9jX2FncCgpIGFuZCBjcmVhdGVzIGEgZHJtX2FncF9tZW0gZW50cnkgZm9yIGl0LgogICovCi1pbnQgZHJtX2FncF9hbGxvYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK2ludCBkcm1fYWdwX2FsbG9jKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYWdwX2J1ZmZlcl90ICpyZXF1ZXN0KQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2FncF9idWZmZXJfdCByZXF1ZXN0OwogCWRybV9hZ3BfbWVtX3QgKmVudHJ5OwogCURSTV9BR1BfTUVNICptZW1vcnk7CiAJdW5zaWduZWQgbG9uZyBwYWdlczsKIAl1MzIgdHlwZTsKLQlkcm1fYWdwX2J1ZmZlcl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAogCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCBhcmdwLCBzaXplb2YocmVxdWVzdCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKIAlpZiAoIShlbnRyeSA9IGRybV9hbGxvYyhzaXplb2YoKmVudHJ5KSwgRFJNX01FTV9BR1BMSVNUUykpKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCW1lbXNldChlbnRyeSwgMCwgc2l6ZW9mKCplbnRyeSkpOwogCi0JcGFnZXMgPSAocmVxdWVzdC5zaXplICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7Ci0JdHlwZSA9ICh1MzIpIHJlcXVlc3QudHlwZTsKLQorCXBhZ2VzID0gKHJlcXVlc3QtPnNpemUgKyBQQUdFX1NJWkUgLSAxKSAvIFBBR0VfU0laRTsKKwl0eXBlID0gKHUzMikgcmVxdWVzdC0+dHlwZTsKIAlpZiAoIShtZW1vcnkgPSBkcm1fYWxsb2NfYWdwKGRldiwgcGFnZXMsIHR5cGUpKSkgewogCQlkcm1fZnJlZShlbnRyeSwgc2l6ZW9mKCplbnRyeSksIERSTV9NRU1fQUdQTElTVFMpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTI0NywxNiArMjM4LDM5IEBACiAJCWRldi0+YWdwLT5tZW1vcnktPnByZXYgPSBlbnRyeTsKIAlkZXYtPmFncC0+bWVtb3J5ID0gZW50cnk7CiAKLQlyZXF1ZXN0LmhhbmRsZSA9IGVudHJ5LT5oYW5kbGU7Ci0JcmVxdWVzdC5waHlzaWNhbCA9IG1lbW9yeS0+cGh5c2ljYWw7CisJcmVxdWVzdC0+aGFuZGxlID0gZW50cnktPmhhbmRsZTsKKwlyZXF1ZXN0LT5waHlzaWNhbCA9IG1lbW9yeS0+cGh5c2ljYWw7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2FncF9hbGxvYyk7CisKK2ludCBkcm1fYWdwX2FsbG9jX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fYWdwX2J1ZmZlcl90IHJlcXVlc3Q7CisJZHJtX2FncF9idWZmZXJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IGVycjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxdWVzdCwgYXJncCwgc2l6ZW9mKHJlcXVlc3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBkcm1fYWdwX2FsbG9jKGRldiwgJnJlcXVlc3QpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlpZiAoY29weV90b191c2VyKGFyZ3AsICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCkpKSB7CisJCWRybV9hZ3BfbWVtX3QgKmVudHJ5ID0gZGV2LT5hZ3AtPm1lbW9yeTsKKwogCQlkZXYtPmFncC0+bWVtb3J5ID0gZW50cnktPm5leHQ7CiAJCWRldi0+YWdwLT5tZW1vcnktPnByZXYgPSBOVUxMOwotCQlkcm1fZnJlZV9hZ3AobWVtb3J5LCBwYWdlcyk7CisJCWRybV9mcmVlX2FncChlbnRyeS0+bWVtb3J5LCBlbnRyeS0+cGFnZXMpOwogCQlkcm1fZnJlZShlbnRyeSwgc2l6ZW9mKCplbnRyeSksIERSTV9NRU1fQUdQTElTVFMpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjkzLDIxICszMDcsMTQgQEAKICAqIFZlcmlmaWVzIHRoZSBBR1AgZGV2aWNlIGlzIHByZXNlbnQgYW5kIGFjcXVpcmVkLCBsb29rcy11cCB0aGUgQUdQIG1lbW9yeQogICogZW50cnkgYW5kIHBhc3NlcyBpdCB0byB0aGUgdW5iaW5kX2FncCgpIGZ1bmN0aW9uLgogICovCi1pbnQgZHJtX2FncF91bmJpbmQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoraW50IGRybV9hZ3BfdW5iaW5kKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYWdwX2JpbmRpbmdfdCAqcmVxdWVzdCkKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9hZ3BfYmluZGluZ190IHJlcXVlc3Q7CiAJZHJtX2FncF9tZW1fdCAqZW50cnk7CiAJaW50IHJldDsKIAogCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGNvcHlfZnJvbV91c2VyCi0JICAgICgmcmVxdWVzdCwgKGRybV9hZ3BfYmluZGluZ190IF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmICghKGVudHJ5ID0gZHJtX2FncF9sb29rdXBfZW50cnkoZGV2LCByZXF1ZXN0LmhhbmRsZSkpKQorCWlmICghKGVudHJ5ID0gZHJtX2FncF9sb29rdXBfZW50cnkoZGV2LCByZXF1ZXN0LT5oYW5kbGUpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCFlbnRyeS0+Ym91bmQpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzE2LDYgKzMyMywyMSBAQAogCQllbnRyeS0+Ym91bmQgPSAwOwogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MKGRybV9hZ3BfdW5iaW5kKTsKKworaW50IGRybV9hZ3BfdW5iaW5kX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2FncF9iaW5kaW5nX3QgcmVxdWVzdDsKKworCWlmIChjb3B5X2Zyb21fdXNlcgorCSAgICAoJnJlcXVlc3QsIChkcm1fYWdwX2JpbmRpbmdfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxdWVzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1fYWdwX3VuYmluZChkZXYsICZyZXF1ZXN0KTsKK30KIAogLyoqCiAgKiBCaW5kIEFHUCBtZW1vcnkgaW50byB0aGUgR0FUVCAoaW9jdGwpCkBAIC0zMzAsMjYgKzM1MiwxOSBAQAogICogaXMgY3VycmVudGx5IGJvdW5kIGludG8gdGhlIEdBVFQuIExvb2tzLXVwIHRoZSBBR1AgbWVtb3J5IGVudHJ5IGFuZCBwYXNzZXMKICAqIGl0IHRvIGJpbmRfYWdwKCkgZnVuY3Rpb24uCiAgKi8KLWludCBkcm1fYWdwX2JpbmQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK2ludCBkcm1fYWdwX2JpbmQoZHJtX2RldmljZV90ICpkZXYsIGRybV9hZ3BfYmluZGluZ190ICpyZXF1ZXN0KQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2FncF9iaW5kaW5nX3QgcmVxdWVzdDsKIAlkcm1fYWdwX21lbV90ICplbnRyeTsKIAlpbnQgcmV0Y29kZTsKIAlpbnQgcGFnZTsKIAogCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGNvcHlfZnJvbV91c2VyCi0JICAgICgmcmVxdWVzdCwgKGRybV9hZ3BfYmluZGluZ190IF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmICghKGVudHJ5ID0gZHJtX2FncF9sb29rdXBfZW50cnkoZGV2LCByZXF1ZXN0LmhhbmRsZSkpKQorCWlmICghKGVudHJ5ID0gZHJtX2FncF9sb29rdXBfZW50cnkoZGV2LCByZXF1ZXN0LT5oYW5kbGUpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGVudHJ5LT5ib3VuZCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JcGFnZSA9IChyZXF1ZXN0Lm9mZnNldCArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFOworCXBhZ2UgPSAocmVxdWVzdC0+b2Zmc2V0ICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CiAJaWYgKChyZXRjb2RlID0gZHJtX2JpbmRfYWdwKGVudHJ5LT5tZW1vcnksIHBhZ2UpKSkKIAkJcmV0dXJuIHJldGNvZGU7CiAJZW50cnktPmJvdW5kID0gZGV2LT5hZ3AtPmJhc2UgKyAocGFnZSA8PCBQQUdFX1NISUZUKTsKQEAgLTM1Nyw2ICszNzIsMjEgQEAKIAkJICBkZXYtPmFncC0+YmFzZSwgZW50cnktPmJvdW5kKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woZHJtX2FncF9iaW5kKTsKKworaW50IGRybV9hZ3BfYmluZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX2FncF9iaW5kaW5nX3QgcmVxdWVzdDsKKworCWlmIChjb3B5X2Zyb21fdXNlcgorCSAgICAoJnJlcXVlc3QsIChkcm1fYWdwX2JpbmRpbmdfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxdWVzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1fYWdwX2JpbmQoZGV2LCAmcmVxdWVzdCk7Cit9CiAKIC8qKgogICogRnJlZSBBR1AgbWVtb3J5IChpb2N0bCkuCkBAIC0zNzIsMjAgKzQwMiwxMyBAQAogICogdW5iaW5kX2FncCgpLiBGcmVlcyBpdCB2aWEgZnJlZV9hZ3AoKSBhcyB3ZWxsIGFzIHRoZSBlbnRyeSBpdHNlbGYKICAqIGFuZCB1bmxpbmtzIGZyb20gdGhlIGRvdWJseSBsaW5rZWQgbGlzdCBpdCdzIGluc2VydGVkIGluLgogICovCi1pbnQgZHJtX2FncF9mcmVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitpbnQgZHJtX2FncF9mcmVlKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYWdwX2J1ZmZlcl90ICpyZXF1ZXN0KQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2FncF9idWZmZXJfdCByZXF1ZXN0OwogCWRybV9hZ3BfbWVtX3QgKmVudHJ5OwogCiAJaWYgKCFkZXYtPmFncCB8fCAhZGV2LT5hZ3AtPmFjcXVpcmVkKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoY29weV9mcm9tX3VzZXIKLQkgICAgKCZyZXF1ZXN0LCAoZHJtX2FncF9idWZmZXJfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxdWVzdCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAoIShlbnRyeSA9IGRybV9hZ3BfbG9va3VwX2VudHJ5KGRldiwgcmVxdWVzdC5oYW5kbGUpKSkKKwlpZiAoIShlbnRyeSA9IGRybV9hZ3BfbG9va3VwX2VudHJ5KGRldiwgcmVxdWVzdC0+aGFuZGxlKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChlbnRyeS0+Ym91bmQpCiAJCWRybV91bmJpbmRfYWdwKGVudHJ5LT5tZW1vcnkpOwpAQCAtNDAyLDEyICs0MjUsMzAgQEAKIAlkcm1fZnJlZShlbnRyeSwgc2l6ZW9mKCplbnRyeSksIERSTV9NRU1fQUdQTElTVFMpOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChkcm1fYWdwX2ZyZWUpOworCitpbnQgZHJtX2FncF9mcmVlX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlkcm1fYWdwX2J1ZmZlcl90IHJlcXVlc3Q7CisKKwlpZiAoY29weV9mcm9tX3VzZXIKKwkgICAgKCZyZXF1ZXN0LCAoZHJtX2FncF9idWZmZXJfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxdWVzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1fYWdwX2ZyZWUoZGV2LCAmcmVxdWVzdCk7Cit9CiAKIC8qKgogICogSW5pdGlhbGl6ZSB0aGUgQUdQIHJlc291cmNlcy4KICAqCiAgKiBccmV0dXJuIHBvaW50ZXIgdG8gYSBkcm1fYWdwX2hlYWQgc3RydWN0dXJlLgogICoKKyAqIEdldHMgdGhlIGRybV9hZ3BfdCBzdHJ1Y3R1cmUgd2hpY2ggaXMgbWFkZSBhdmFpbGFibGUgYnkgdGhlIGFncGdhcnQgbW9kdWxlCisgKiB2aWEgdGhlIGludGVyX21vZHVsZV8qIGZ1bmN0aW9ucy4gQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBkcm1fYWdwX2hlYWQKKyAqIHN0cnVjdHVyZS4KICAqLwogZHJtX2FncF9oZWFkX3QgKmRybV9hZ3BfaW5pdChkcm1fZGV2aWNlX3QgKiBkZXYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMKaW5kZXggMzE5YmRlYS4uMWRiMTJkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fYnVmcy5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2J1ZnMuYwpAQCAtMzYsMjIgKzM2LDIxIEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgImRybVAuaCIKIAotdW5zaWduZWQgbG9uZyBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50IHJlc291cmNlKQordW5zaWduZWQgbG9uZyBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgcmVzb3VyY2UpCiB7CiAJcmV0dXJuIHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIHJlc291cmNlKTsKIH0KLQogRVhQT1JUX1NZTUJPTChkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KTsKIAotdW5zaWduZWQgbG9uZyBkcm1fZ2V0X3Jlc291cmNlX2xlbihkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCByZXNvdXJjZSkKK3Vuc2lnbmVkIGxvbmcgZHJtX2dldF9yZXNvdXJjZV9sZW4oZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCByZXNvdXJjZSkKIHsKIAlyZXR1cm4gcGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIHJlc291cmNlKTsKIH0KIAogRVhQT1JUX1NZTUJPTChkcm1fZ2V0X3Jlc291cmNlX2xlbik7CiAKLXN0YXRpYyBkcm1fbWFwX2xpc3RfdCAqZHJtX2ZpbmRfbWF0Y2hpbmdfbWFwKGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCQkJICAgICBkcm1fbG9jYWxfbWFwX3QgKiBtYXApCitzdGF0aWMgZHJtX21hcF9saXN0X3QgKmRybV9maW5kX21hdGNoaW5nX21hcChkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkJICAgICBkcm1fbG9jYWxfbWFwX3QgKm1hcCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogCkBAIC03NCw3ICs3Myw3IEBACiAKICNpZmRlZiBfTFA2NAogc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IEhhbmRsZUlEKHVuc2lnbmVkIGxvbmcgbGhhbmRsZSwKLQkJCQkJZHJtX2RldmljZV90ICogZGV2KQorCQkJCQlkcm1fZGV2aWNlX3QgKmRldikKIHsKIAlzdGF0aWMgdW5zaWduZWQgaW50IG1hcDMyX2hhbmRsZSA9IFNUQVJUX1JBTkdFOwogCXVuc2lnbmVkIGludCBoYXNoOwpAQCAtMTU1LDcgKzE1NCw3IEBACiAJY2FzZSBfRFJNX1JFR0lTVEVSUzoKIAljYXNlIF9EUk1fRlJBTUVfQlVGRkVSOgogI2lmICFkZWZpbmVkKF9fc3BhcmNfXykgJiYgIWRlZmluZWQoX19hbHBoYV9fKSAmJiAhZGVmaW5lZChfX2lhNjRfXykgJiYgIWRlZmluZWQoX19wb3dlcnBjNjRfXykgJiYgIWRlZmluZWQoX194ODZfNjRfXykKLQkJaWYgKG1hcC0+b2Zmc2V0ICsgbWFwLT5zaXplIDwgbWFwLT5vZmZzZXQgfHwKKwkJaWYgKG1hcC0+b2Zmc2V0ICsgKG1hcC0+c2l6ZS0xKSA8IG1hcC0+b2Zmc2V0IHx8CiAJCSAgICBtYXAtPm9mZnNldCA8IHZpcnRfdG9fcGh5cyhoaWdoX21lbW9yeSkpIHsKIAkJCWRybV9mcmVlKG1hcCwgc2l6ZW9mKCptYXApLCBEUk1fTUVNX01BUFMpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zMDEsNiArMzAwLDkgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCisJaWYgKCEoY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCBtYXAudHlwZSA9PSBfRFJNX0FHUCkpCisJCXJldHVybiAtRVBFUk07CisKIAllcnIgPSBkcm1fYWRkbWFwX2NvcmUoZGV2LCBtYXAub2Zmc2V0LCBtYXAuc2l6ZSwgbWFwLnR5cGUsIG1hcC5mbGFncywKIAkJCSAgICAgICZtYXBsaXN0KTsKIApAQCAtMzMyLDcgKzMzNCw3IEBACiAgKgogICogXHNhIGRybV9hZGRtYXAKICAqLwotaW50IGRybV9ybW1hcF9sb2NrZWQoZHJtX2RldmljZV90ICogZGV2LCBkcm1fbG9jYWxfbWFwX3QgKiBtYXApCitpbnQgZHJtX3JtbWFwX2xvY2tlZChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2xvY2FsX21hcF90ICptYXApCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAlkcm1fbWFwX2xpc3RfdCAqcl9saXN0ID0gTlVMTDsKQEAgLTM4NCwxMCArMzg2LDkgQEAKIAogCXJldHVybiAwOwogfQotCiBFWFBPUlRfU1lNQk9MKGRybV9ybW1hcF9sb2NrZWQpOwogCi1pbnQgZHJtX3JtbWFwKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2xvY2FsX21hcF90ICogbWFwKQoraW50IGRybV9ybW1hcChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2xvY2FsX21hcF90ICptYXApCiB7CiAJaW50IHJldDsKIApAQCAtMzk3LDcgKzM5OCw2IEBACiAKIAlyZXR1cm4gcmV0OwogfQotCiBFWFBPUlRfU1lNQk9MKGRybV9ybW1hcCk7CiAKIC8qIFRoZSBybW1hcCBpb2N0bCBhcHBlYXJzIHRvIGJlIHVubmVjZXNzYXJ5LiAgQWxsIG1hcHBpbmdzIGFyZSB0b3JuIGRvd24gb24KQEAgLTU0OCw3ICs1NDgsNyBAQAogCURSTV9ERUJVRygiY291bnQ6ICAgICAgJWRcbiIsIGNvdW50KTsKIAlEUk1fREVCVUcoIm9yZGVyOiAgICAgICVkXG4iLCBvcmRlcik7CiAJRFJNX0RFQlVHKCJzaXplOiAgICAgICAlZFxuIiwgc2l6ZSk7Ci0JRFJNX0RFQlVHKCJhZ3Bfb2Zmc2V0OiAlbHVcbiIsIGFncF9vZmZzZXQpOworCURSTV9ERUJVRygiYWdwX29mZnNldDogJWx4XG4iLCBhZ3Bfb2Zmc2V0KTsKIAlEUk1fREVCVUcoImFsaWdubWVudDogICVkXG4iLCBhbGlnbm1lbnQpOwogCURSTV9ERUJVRygicGFnZV9vcmRlcjogJWRcbiIsIHBhZ2Vfb3JkZXIpOwogCURSTV9ERUJVRygidG90YWw6ICAgICAgJWRcbiIsIHRvdGFsKTsKQEAgLTY0OSw2ICs2NDksOCBAQAogCX0KIAogCWRtYS0+YnVmX2NvdW50ICs9IGVudHJ5LT5idWZfY291bnQ7CisJZG1hLT5zZWdfY291bnQgKz0gZW50cnktPnNlZ19jb3VudDsKKwlkbWEtPnBhZ2VfY291bnQgKz0gYnl0ZV9jb3VudCA+PiBQQUdFX1NISUZUOwogCWRtYS0+Ynl0ZV9jb3VudCArPSBieXRlX2NvdW50OwogCiAJRFJNX0RFQlVHKCJkbWEtPmJ1Zl9jb3VudCA6ICVkXG4iLCBkbWEtPmJ1Zl9jb3VudCk7CkBAIC02NjQsNyArNjY2LDYgQEAKIAlhdG9taWNfZGVjKCZkZXYtPmJ1Zl9hbGxvYyk7CiAJcmV0dXJuIDA7CiB9Ci0KIEVYUE9SVF9TWU1CT0woZHJtX2FkZGJ1ZnNfYWdwKTsKICNlbmRpZgkJCQkvKiBfX09TX0hBU19BR1AgKi8KIApAQCAtNjg5LDkgKzY5MCwxMyBAQAogCiAJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX1BDSV9ETUEpKQogCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmICghZG1hKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwogCWNvdW50ID0gcmVxdWVzdC0+Y291bnQ7CiAJb3JkZXIgPSBkcm1fb3JkZXIocmVxdWVzdC0+c2l6ZSk7CiAJc2l6ZSA9IDEgPDwgb3JkZXI7CkBAIC04ODIsNyArODg3LDYgQEAKIAlyZXR1cm4gMDsKIAogfQotCiBFWFBPUlRfU1lNQk9MKGRybV9hZGRidWZzX3BjaSk7CiAKIHN0YXRpYyBpbnQgZHJtX2FkZGJ1ZnNfc2coZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX2Rlc2NfdCAqIHJlcXVlc3QpCkBAIC05MDgsNiArOTEyLDkgQEAKIAlpZiAoIWRtYSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKIAljb3VudCA9IHJlcXVlc3QtPmNvdW50OwogCW9yZGVyID0gZHJtX29yZGVyKHJlcXVlc3QtPnNpemUpOwogCXNpemUgPSAxIDw8IG9yZGVyOwpAQCAtMTAyNiw2ICsxMDMzLDggQEAKIAl9CiAKIAlkbWEtPmJ1Zl9jb3VudCArPSBlbnRyeS0+YnVmX2NvdW50OworCWRtYS0+c2VnX2NvdW50ICs9IGVudHJ5LT5zZWdfY291bnQ7CisJZG1hLT5wYWdlX2NvdW50ICs9IGJ5dGVfY291bnQgPj4gUEFHRV9TSElGVDsKIAlkbWEtPmJ5dGVfY291bnQgKz0gYnl0ZV9jb3VudDsKIAogCURSTV9ERUJVRygiZG1hLT5idWZfY291bnQgOiAlZFxuIiwgZG1hLT5idWZfY291bnQpOwpAQCAtMTA0Miw3ICsxMDUxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkcm1fYWRkYnVmc19mYihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfZGVzY190ICogcmVxdWVzdCkKK2ludCBkcm1fYWRkYnVmc19mYihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfZGVzY190ICogcmVxdWVzdCkKIHsKIAlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKIAlkcm1fYnVmX2VudHJ5X3QgKmVudHJ5OwpAQCAtMTA2NSw2ICsxMDc0LDkgQEAKIAlpZiAoIWRtYSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKIAljb3VudCA9IHJlcXVlc3QtPmNvdW50OwogCW9yZGVyID0gZHJtX29yZGVyKHJlcXVlc3QtPnNpemUpOwogCXNpemUgPSAxIDw8IG9yZGVyOwpAQCAtMTE4MSw2ICsxMTkzLDggQEAKIAl9CiAKIAlkbWEtPmJ1Zl9jb3VudCArPSBlbnRyeS0+YnVmX2NvdW50OworCWRtYS0+c2VnX2NvdW50ICs9IGVudHJ5LT5zZWdfY291bnQ7CisJZG1hLT5wYWdlX2NvdW50ICs9IGJ5dGVfY291bnQgPj4gUEFHRV9TSElGVDsKIAlkbWEtPmJ5dGVfY291bnQgKz0gYnl0ZV9jb3VudDsKIAogCURSTV9ERUJVRygiZG1hLT5idWZfY291bnQgOiAlZFxuIiwgZG1hLT5idWZfY291bnQpOwpAQCAtMTE5Niw2ICsxMjEwLDggQEAKIAlhdG9taWNfZGVjKCZkZXYtPmJ1Zl9hbGxvYyk7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGRybV9hZGRidWZzX2ZiKTsKKwogCiAvKioKICAqIEFkZCBidWZmZXJzIGZvciBETUEgdHJhbnNmZXJzIChpb2N0bCkuCkBAIC0xNTc3LDUgKzE1OTMsNiBAQAogCiAJcmV0dXJuIG9yZGVyOwogfQotCiBFWFBPUlRfU1lNQk9MKGRybV9vcmRlcik7CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fY29udGV4dC5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fY29udGV4dC5jCmluZGV4IGJkOTU4ZDYuLmY4NDI1NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvbnRleHQuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb250ZXh0LmMKQEAgLTQzMyw3ICs0MzMsNyBAQAogCWlmIChjdHguaGFuZGxlICE9IERSTV9LRVJORUxfQ09OVEVYVCkgewogCQlpZiAoZGV2LT5kcml2ZXItPmNvbnRleHRfY3RvcikKIAkJCWlmICghZGV2LT5kcml2ZXItPmNvbnRleHRfY3RvcihkZXYsIGN0eC5oYW5kbGUpKSB7Ci0JCQkJRFJNX0RFQlVHKCAiUnVubmluZyBvdXQgb2YgY3R4cyBvciBtZW1vcnkuXG4iKTsKKwkJCQlEUk1fREVCVUcoIlJ1bm5pbmcgb3V0IG9mIGN0eHMgb3IgbWVtb3J5LlxuIik7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fY29yZS5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fY29yZS5oCmluZGV4IGNjOTdiYjkuLmY0ZjlkYjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb3JlLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fY29yZS5oCkBAIC0yNCwxMSArMjQsMTEgQEAKIAogI2RlZmluZSBDT1JFX05BTUUJCSJkcm0iCiAjZGVmaW5lIENPUkVfREVTQwkJIkRSTSBzaGFyZWQgY29yZSByb3V0aW5lcyIKLSNkZWZpbmUgQ09SRV9EQVRFCQkiMjAwNDA5MjUiCisjZGVmaW5lIENPUkVfREFURQkJIjIwMDUxMTAyIgogCiAjZGVmaW5lIERSTV9JRl9NQUpPUgkxCiAjZGVmaW5lIERSTV9JRl9NSU5PUgkyCiAKICNkZWZpbmUgQ09SRV9NQUpPUgkxCiAjZGVmaW5lIENPUkVfTUlOT1IJMAotI2RlZmluZSBDT1JFX1BBVENITEVWRUwgMAorI2RlZmluZSBDT1JFX1BBVENITEVWRUwgMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcnYuYwppbmRleCA0ZGZmNzU1Li5jNGZhNWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcnYuYwpAQCAtNTYsNjYgKzU2LDY2IEBACiAKIC8qKiBJb2N0bCB0YWJsZSAqLwogc3RhdGljIGRybV9pb2N0bF9kZXNjX3QgZHJtX2lvY3Rsc1tdID0gewotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1ZFUlNJT04pXSA9IHtkcm1fdmVyc2lvbiwgMCwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX1VOSVFVRSldID0ge2RybV9nZXR1bmlxdWUsIDAsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9NQUdJQyldID0ge2RybV9nZXRtYWdpYywgMCwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfSVJRX0JVU0lEKV0gPSB7ZHJtX2lycV9ieV9idXNpZCwgMCwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX01BUCldID0ge2RybV9nZXRtYXAsIDAsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9DTElFTlQpXSA9IHtkcm1fZ2V0Y2xpZW50LCAwLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9HRVRfU1RBVFMpXSA9IHtkcm1fZ2V0c3RhdHMsIDAsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1NFVF9WRVJTSU9OKV0gPSB7ZHJtX3NldHZlcnNpb24sIDAsIDF9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1ZFUlNJT04pXSA9IHtkcm1fdmVyc2lvbiwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX1VOSVFVRSldID0ge2RybV9nZXR1bmlxdWUsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9NQUdJQyldID0ge2RybV9nZXRtYWdpYywgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfSVJRX0JVU0lEKV0gPSB7ZHJtX2lycV9ieV9idXNpZCwgRFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9HRVRfTUFQKV0gPSB7ZHJtX2dldG1hcCwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX0NMSUVOVCldID0ge2RybV9nZXRjbGllbnQsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9TVEFUUyldID0ge2RybV9nZXRzdGF0cywgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfU0VUX1ZFUlNJT04pXSA9IHtkcm1fc2V0dmVyc2lvbiwgRFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9TRVRfVU5JUVVFKV0gPSB7ZHJtX3NldHVuaXF1ZSwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9CTE9DSyldID0ge2RybV9ub29wLCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1VOQkxPQ0spXSA9IHtkcm1fbm9vcCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BVVRIX01BR0lDKV0gPSB7ZHJtX2F1dGhtYWdpYywgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKIAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1NFVF9VTklRVUUpXSA9IHtkcm1fc2V0dW5pcXVlLCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9CTE9DSyldID0ge2RybV9ub29wLCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9VTkJMT0NLKV0gPSB7ZHJtX25vb3AsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FVVEhfTUFHSUMpXSA9IHtkcm1fYXV0aG1hZ2ljLCAxLCAxfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BRERfTUFQKV0gPSB7ZHJtX2FkZG1hcF9pb2N0bCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9STV9NQVApXSA9IHtkcm1fcm1tYXBfaW9jdGwsIERSTV9BVVRIfSwKIAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FERF9NQVApXSA9IHtkcm1fYWRkbWFwX2lvY3RsLCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9STV9NQVApXSA9IHtkcm1fcm1tYXBfaW9jdGwsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1NFVF9TQVJFQV9DVFgpXSA9IHtkcm1fc2V0c2FyZWFjdHgsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX1NBUkVBX0NUWCldID0ge2RybV9nZXRzYXJlYWN0eCwgRFJNX0FVVEh9LAogCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfU0VUX1NBUkVBX0NUWCldID0ge2RybV9zZXRzYXJlYWN0eCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX1NBUkVBX0NUWCldID0ge2RybV9nZXRzYXJlYWN0eCwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUREX0NUWCldID0ge2RybV9hZGRjdHgsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfUk1fQ1RYKV0gPSB7ZHJtX3JtY3R4LCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX01PRF9DVFgpXSA9IHtkcm1fbW9kY3R4LCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9DVFgpXSA9IHtkcm1fZ2V0Y3R4LCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfU1dJVENIX0NUWCldID0ge2RybV9zd2l0Y2hjdHgsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfTkVXX0NUWCldID0ge2RybV9uZXdjdHgsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfUkVTX0NUWCldID0ge2RybV9yZXNjdHgsIERSTV9BVVRIfSwKIAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FERF9DVFgpXSA9IHtkcm1fYWRkY3R4LCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9STV9DVFgpXSA9IHtkcm1fcm1jdHgsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX01PRF9DVFgpXSA9IHtkcm1fbW9kY3R4LCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9HRVRfQ1RYKV0gPSB7ZHJtX2dldGN0eCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfU1dJVENIX0NUWCldID0ge2RybV9zd2l0Y2hjdHgsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX05FV19DVFgpXSA9IHtkcm1fbmV3Y3R4LCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9SRVNfQ1RYKV0gPSB7ZHJtX3Jlc2N0eCwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUREX0RSQVcpXSA9IHtkcm1fYWRkZHJhdywgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9STV9EUkFXKV0gPSB7ZHJtX3JtZHJhdywgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKIAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FERF9EUkFXKV0gPSB7ZHJtX2FkZGRyYXcsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1JNX0RSQVcpXSA9IHtkcm1fcm1kcmF3LCAxLCAxfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9MT0NLKV0gPSB7ZHJtX2xvY2ssIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9VTkxPQ0spXSA9IHtkcm1fdW5sb2NrLCBEUk1fQVVUSH0sCiAKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9MT0NLKV0gPSB7ZHJtX2xvY2ssIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1VOTE9DSyldID0ge2RybV91bmxvY2ssIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0ZJTklTSCldID0ge2RybV9ub29wLCBEUk1fQVVUSH0sCiAKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9GSU5JU0gpXSA9IHtkcm1fbm9vcCwgMSwgMH0sCi0KLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BRERfQlVGUyldID0ge2RybV9hZGRidWZzLCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9NQVJLX0JVRlMpXSA9IHtkcm1fbWFya2J1ZnMsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0lORk9fQlVGUyldID0ge2RybV9pbmZvYnVmcywgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfTUFQX0JVRlMpXSA9IHtkcm1fbWFwYnVmcywgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfRlJFRV9CVUZTKV0gPSB7ZHJtX2ZyZWVidWZzLCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BRERfQlVGUyldID0ge2RybV9hZGRidWZzLCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX01BUktfQlVGUyldID0ge2RybV9tYXJrYnVmcywgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9JTkZPX0JVRlMpXSA9IHtkcm1faW5mb2J1ZnMsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9NQVBfQlVGUyldID0ge2RybV9tYXBidWZzLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfRlJFRV9CVUZTKV0gPSB7ZHJtX2ZyZWVidWZzLCBEUk1fQVVUSH0sCiAJLyogVGhlIERSTV9JT0NUTF9ETUEgaW9jdGwgc2hvdWxkIGJlIGRlZmluZWQgYnkgdGhlIGRyaXZlci4gKi8KKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9ETUEpXSA9IHtOVUxMLCBEUk1fQVVUSH0sCiAKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9DT05UUk9MKV0gPSB7ZHJtX2NvbnRyb2wsIDEsIDF9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0NPTlRST0wpXSA9IHtkcm1fY29udHJvbCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKIAogI2lmIF9fT1NfSEFTX0FHUAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9BQ1FVSVJFKV0gPSB7ZHJtX2FncF9hY3F1aXJlX2lvY3RsLCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfUkVMRUFTRSldID0ge2RybV9hZ3BfcmVsZWFzZV9pb2N0bCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0VOQUJMRSldID0ge2RybV9hZ3BfZW5hYmxlX2lvY3RsLCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfSU5GTyldID0ge2RybV9hZ3BfaW5mb19pb2N0bCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0FMTE9DKV0gPSB7ZHJtX2FncF9hbGxvYywgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0ZSRUUpXSA9IHtkcm1fYWdwX2ZyZWUsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9CSU5EKV0gPSB7ZHJtX2FncF9iaW5kLCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfVU5CSU5EKV0gPSB7ZHJtX2FncF91bmJpbmQsIDEsIDF9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9BQ1FVSVJFKV0gPSB7ZHJtX2FncF9hY3F1aXJlX2lvY3RsLCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9SRUxFQVNFKV0gPSB7ZHJtX2FncF9yZWxlYXNlX2lvY3RsLCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9FTkFCTEUpXSA9IHtkcm1fYWdwX2VuYWJsZV9pb2N0bCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfSU5GTyldID0ge2RybV9hZ3BfaW5mb19pb2N0bCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9BTExPQyldID0ge2RybV9hZ3BfYWxsb2NfaW9jdGwsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0ZSRUUpXSA9IHtkcm1fYWdwX2ZyZWVfaW9jdGwsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX0JJTkQpXSA9IHtkcm1fYWdwX2JpbmRfaW9jdGwsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX1VOQklORCldID0ge2RybV9hZ3BfdW5iaW5kX2lvY3RsLCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAogI2VuZGlmCiAKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9TR19BTExPQyldID0ge2RybV9zZ19hbGxvYywgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfU0dfRlJFRSldID0ge2RybV9zZ19mcmVlLCAxLCAxfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9TR19BTExPQyldID0ge2RybV9zZ19hbGxvYywgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9TR19GUkVFKV0gPSB7ZHJtX3NnX2ZyZWUsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCiAKLQlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9XQUlUX1ZCTEFOSyldID0ge2RybV93YWl0X3ZibGFuaywgMCwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfV0FJVF9WQkxBTkspXSA9IHtkcm1fd2FpdF92YmxhbmssIDB9LAogfTsKIAogI2RlZmluZSBEUklWRVJfSU9DVExfQ09VTlQJRFJNX0FSUkFZX1NJWkUoIGRybV9pb2N0bHMgKQpAQCAtMTI5LDcgKzEyOSw3IEBACiAgKgogICogXHNhIGRybV9kZXZpY2UKICAqLwotaW50IGRybV90YWtlZG93bihkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgZHJtX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpCiB7CiAJZHJtX21hZ2ljX2VudHJ5X3QgKnB0LCAqbmV4dDsKIAlkcm1fbWFwX2xpc3RfdCAqcl9saXN0OwpAQCAtMTM4LDkgKzEzOCw5IEBACiAKIAlEUk1fREVCVUcoIlxuIik7CiAKLQlpZiAoZGV2LT5kcml2ZXItPnByZXRha2Vkb3duKQotCQlkZXYtPmRyaXZlci0+cHJldGFrZWRvd24oZGV2KTsKLQlEUk1fREVCVUcoImRyaXZlciBwcmV0YWtlZG93biBjb21wbGV0ZWRcbiIpOworCWlmIChkZXYtPmRyaXZlci0+bGFzdGNsb3NlKQorCQlkZXYtPmRyaXZlci0+bGFzdGNsb3NlKGRldik7CisJRFJNX0RFQlVHKCJkcml2ZXIgbGFzdGNsb3NlIGNvbXBsZXRlZFxuIik7CiAKIAlpZiAoZGV2LT51bmlxdWUpIHsKIAkJZHJtX2ZyZWUoZGV2LT51bmlxdWUsIHN0cmxlbihkZXYtPnVuaXF1ZSkgKyAxLCBEUk1fTUVNX0RSSVZFUik7CkBAIC0yMzMsNyArMjMzLDcgQEAKIAl9CiAJdXAoJmRldi0+c3RydWN0X3NlbSk7CiAKLQlEUk1fREVCVUcoInRha2Vkb3duIGNvbXBsZXRlZFxuIik7CisJRFJNX0RFQlVHKCJsYXN0Y2xvc2UgY29tcGxldGVkXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjgxLDcgKzI4MSw3IEBACiAvKioKICAqIENhbGxlZCB2aWEgY2xlYW51cF9tb2R1bGUoKSBhdCBtb2R1bGUgdW5sb2FkIHRpbWUuCiAgKgotICogQ2xlYW5zIHVwIGFsbCBEUk0gZGV2aWNlLCBjYWxsaW5nIHRha2Vkb3duKCkuCisgKiBDbGVhbnMgdXAgYWxsIERSTSBkZXZpY2UsIGNhbGxpbmcgZHJtX2xhc3RjbG9zZSgpLgogICoKICAqIFxzYSBkcm1faW5pdAogICovCkBAIC0yOTQsNyArMjk0LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWRybV90YWtlZG93bihkZXYpOworCWRybV9sYXN0Y2xvc2UoZGV2KTsKIAogCWlmIChkZXYtPm1hcGxpc3QpIHsKIAkJZHJtX2ZyZWUoZGV2LT5tYXBsaXN0LCBzaXplb2YoKmRldi0+bWFwbGlzdCksIERSTV9NRU1fTUFQUyk7CkBAIC0zMTcsOCArMzE3LDggQEAKIAkJZGV2LT5hZ3AgPSBOVUxMOwogCX0KIAotCWlmIChkZXYtPmRyaXZlci0+cG9zdGNsZWFudXApCi0JCWRldi0+ZHJpdmVyLT5wb3N0Y2xlYW51cChkZXYpOworCWlmIChkZXYtPmRyaXZlci0+dW5sb2FkKQorCQlkZXYtPmRyaXZlci0+dW5sb2FkKGRldik7CiAKIAlkcm1fcHV0X2hlYWQoJmRldi0+cHJpbWFyeSk7CiAJaWYgKGRybV9wdXRfZGV2KGRldikpCkBAIC0zNDIsMTIgKzM0MiwxMiBAQAogCQlpZiAoaGVhZC0+ZGV2LT5kcml2ZXIgIT0gZHJpdmVyKQogCQkJY29udGludWU7CiAJCWRldiA9IGhlYWQtPmRldjsKLQl9Ci0JaWYgKGRldikgewotCQkvKiByZWxlYXNlIHRoZSBwY2kgZHJpdmVyICovCi0JCWlmIChkZXYtPnBkZXYpCi0JCQlwY2lfZGV2X3B1dChkZXYtPnBkZXYpOwotCQlkcm1fY2xlYW51cChkZXYpOworCQlpZiAoZGV2KSB7CisJCQkvKiByZWxlYXNlIHRoZSBwY2kgZHJpdmVyICovCisJCQlpZiAoZGV2LT5wZGV2KQorCQkJCXBjaV9kZXZfcHV0KGRldi0+cGRldik7CisJCQlkcm1fY2xlYW51cChkZXYpOworCQl9CiAJfQogCURSTV9JTkZPKCJNb2R1bGUgdW5sb2FkZWRcbiIpOwogfQpAQCAtNDMyLDE0ICs0MzIsMTcgQEAKIAlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1fdmVyc2lvbl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlkcm1fdmVyc2lvbl90IHZlcnNpb247Ci0JaW50IHJldDsKKwlpbnQgbGVuOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZ2ZXJzaW9uLCBhcmdwLCBzaXplb2YodmVyc2lvbikpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCS8qIHZlcnNpb24gaXMgYSByZXF1aXJlZCBmdW5jdGlvbiB0byByZXR1cm4gdGhlIHBlcnNvbmFsaXR5IG1vZHVsZSB2ZXJzaW9uICovCi0JaWYgKChyZXQgPSBkZXYtPmRyaXZlci0+dmVyc2lvbigmdmVyc2lvbikpKQotCQlyZXR1cm4gcmV0OworCXZlcnNpb24udmVyc2lvbl9tYWpvciA9IGRldi0+ZHJpdmVyLT5tYWpvcjsKKwl2ZXJzaW9uLnZlcnNpb25fbWlub3IgPSBkZXYtPmRyaXZlci0+bWlub3I7CisJdmVyc2lvbi52ZXJzaW9uX3BhdGNobGV2ZWwgPSBkZXYtPmRyaXZlci0+cGF0Y2hsZXZlbDsKKwlEUk1fQ09QWSh2ZXJzaW9uLm5hbWUsIGRldi0+ZHJpdmVyLT5uYW1lKTsKKwlEUk1fQ09QWSh2ZXJzaW9uLmRhdGUsIGRldi0+ZHJpdmVyLT5kYXRlKTsKKwlEUk1fQ09QWSh2ZXJzaW9uLmRlc2MsIGRldi0+ZHJpdmVyLT5kZXNjKTsKIAogCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZlcnNpb24sIHNpemVvZih2ZXJzaW9uKSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtNDkzLDggKzQ5Niw5IEBACiAJaWYgKCFmdW5jKSB7CiAJCURSTV9ERUJVRygibm8gZnVuY3Rpb25cbiIpOwogCQlyZXRjb2RlID0gLUVJTlZBTDsKLQl9IGVsc2UgaWYgKChpb2N0bC0+cm9vdF9vbmx5ICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB8fAotCQkgICAoaW9jdGwtPmF1dGhfbmVlZGVkICYmICFwcml2LT5hdXRoZW50aWNhdGVkKSkgeworCX0gZWxzZSBpZiAoKChpb2N0bC0+ZmxhZ3MgJiBEUk1fUk9PVF9PTkxZKSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgfHwKKwkJICAgKChpb2N0bC0+ZmxhZ3MgJiBEUk1fQVVUSCkgJiYgIXByaXYtPmF1dGhlbnRpY2F0ZWQpIHx8CisJCSAgICgoaW9jdGwtPmZsYWdzICYgRFJNX01BU1RFUikgJiYgIXByaXYtPm1hc3RlcikpIHsKIAkJcmV0Y29kZSA9IC1FQUNDRVM7CiAJfSBlbHNlIHsKIAkJcmV0Y29kZSA9IGZ1bmMoaW5vZGUsIGZpbHAsIGNtZCwgYXJnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2ZvcHMuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2ZvcHMuYwppbmRleCBiZjBhNzQwLi40MDNmNDRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9mb3BzLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZm9wcy5jCkBAIC0zNSw2ICszNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm1fc2FyZWEuaCIKICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAKIHN0YXRpYyBpbnQgZHJtX29wZW5faGVscGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLApAQCAtNDIsMTUgKzQzLDIxIEBACiAKIHN0YXRpYyBpbnQgZHJtX3NldHVwKGRybV9kZXZpY2VfdCAqIGRldikKIHsKKwlkcm1fbG9jYWxfbWFwX3QgKm1hcDsKIAlpbnQgaTsKIAlpbnQgcmV0OwogCi0JaWYgKGRldi0+ZHJpdmVyLT5wcmVzZXR1cCkgewotCQlyZXQgPSBkZXYtPmRyaXZlci0+cHJlc2V0dXAoZGV2KTsKKwlpZiAoZGV2LT5kcml2ZXItPmZpcnN0b3BlbikgeworCQlyZXQgPSBkZXYtPmRyaXZlci0+Zmlyc3RvcGVuKGRldik7CiAJCWlmIChyZXQgIT0gMCkKIAkJCXJldHVybiByZXQ7CiAJfQogCisJLyogcHJlYnVpbGQgdGhlIFNBUkVBICovCisJaSA9IGRybV9hZGRtYXAoZGV2LCAwLCBTQVJFQV9NQVgsIF9EUk1fU0hNLCBfRFJNX0NPTlRBSU5TX0xPQ0ssICZtYXApOworCWlmIChpICE9IDApCisJCXJldHVybiBpOworCiAJYXRvbWljX3NldCgmZGV2LT5pb2N0bF9jb3VudCwgMCk7CiAJYXRvbWljX3NldCgmZGV2LT52bWFfY291bnQsIDApOwogCWRldi0+YnVmX3VzZSA9IDA7CkBAIC0xMDksOCArMTE2LDYgQEAKIAkgKiBkcm1fc2VsZWN0X3F1ZXVlIGZhaWxzIGJldHdlZW4gdGhlIHRpbWUgdGhlIGludGVycnVwdCBpcwogCSAqIGluaXRpYWxpemVkIGFuZCB0aGUgdGltZSB0aGUgcXVldWVzIGFyZSBpbml0aWFsaXplZC4KIAkgKi8KLQlpZiAoZGV2LT5kcml2ZXItPnBvc3RzZXR1cCkKLQkJZGV2LT5kcml2ZXItPnBvc3RzZXR1cChkZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNTQsMTAgKzE1OSwxNjggQEAKIAogCXJldHVybiByZXRjb2RlOwogfQotCiBFWFBPUlRfU1lNQk9MKGRybV9vcGVuKTsKIAogLyoqCisgKiBGaWxlIFxjIG9wZW4gb3BlcmF0aW9uLgorICoKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKgorICogUHV0cyB0aGUgZGV2LT5mb3BzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRldmljZSBtaW5vciBudW1iZXIgaW50bworICogXHAgZmlscCwgY2FsbCB0aGUgXGMgb3BlbiBtZXRob2QsIGFuZCByZXN0b3JlIHRoZSBmaWxlIG9wZXJhdGlvbnMuCisgKi8KK2ludCBkcm1fc3R1Yl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWRybV9kZXZpY2VfdCAqZGV2ID0gTlVMTDsKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCWludCBlcnIgPSAtRU5PREVWOworCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKm9sZF9mb3BzOworCisJRFJNX0RFQlVHKCJcbiIpOworCisJaWYgKCEoKG1pbm9yID49IDApICYmIChtaW5vciA8IGRybV9jYXJkc19saW1pdCkpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghZHJtX2hlYWRzW21pbm9yXSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIShkZXYgPSBkcm1faGVhZHNbbWlub3JdLT5kZXYpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW9sZF9mb3BzID0gZmlscC0+Zl9vcDsKKwlmaWxwLT5mX29wID0gZm9wc19nZXQoJmRldi0+ZHJpdmVyLT5mb3BzKTsKKwlpZiAoZmlscC0+Zl9vcC0+b3BlbiAmJiAoZXJyID0gZmlscC0+Zl9vcC0+b3Blbihpbm9kZSwgZmlscCkpKSB7CisJCWZvcHNfcHV0KGZpbHAtPmZfb3ApOworCQlmaWxwLT5mX29wID0gZm9wc19nZXQob2xkX2ZvcHMpOworCX0KKwlmb3BzX3B1dChvbGRfZm9wcyk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIENoZWNrIHdoZXRoZXIgRFJJIHdpbGwgcnVuIG9uIHRoaXMgQ1BVLgorICoKKyAqIFxyZXR1cm4gbm9uLXplcm8gaWYgdGhlIERSSSB3aWxsIHJ1biBvbiB0aGlzIENQVSwgb3IgemVybyBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgZHJtX2NwdV92YWxpZCh2b2lkKQoreworI2lmIGRlZmluZWQoX19pMzg2X18pCisJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDMpCisJCXJldHVybiAwOwkvKiBObyBjbXB4Y2hnIG9uIGEgMzg2ICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgIWRlZmluZWQoX19zcGFyY192OV9fKQorCXJldHVybiAwOwkJLyogTm8gY21weGNoZyBiZWZvcmUgdjkgc3BhcmMuICovCisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBDYWxsZWQgd2hlbmV2ZXIgYSBwcm9jZXNzIG9wZW5zIC9kZXYvZHJtLgorICoKKyAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gZGV2IGRldmljZS4KKyAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKgorICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBkcm1fZmlsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBmaWxlIHByaXZhdGUgZGF0YSBpbiBccAorICogZmlscCBhbmQgYWRkIGl0IGludG8gdGhlIGRvdWJsZSBsaW5rZWQgbGlzdCBpbiBccCBkZXYuCisgKi8KK3N0YXRpYyBpbnQgZHJtX29wZW5faGVscGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICAgZHJtX2RldmljZV90ICogZGV2KQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJZHJtX2ZpbGVfdCAqcHJpdjsKKwlpbnQgcmV0OworCisJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX0VYQ0wpCisJCXJldHVybiAtRUJVU1k7CS8qIE5vIGV4Y2x1c2l2ZSBvcGVucyAqLworCWlmICghZHJtX2NwdV92YWxpZCgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCURSTV9ERUJVRygicGlkID0gJWQsIG1pbm9yID0gJWRcbiIsIGN1cnJlbnQtPnBpZCwgbWlub3IpOworCisJcHJpdiA9IGRybV9hbGxvYyhzaXplb2YoKnByaXYpLCBEUk1fTUVNX0ZJTEVTKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KHByaXYsIDAsIHNpemVvZigqcHJpdikpOworCWZpbHAtPnByaXZhdGVfZGF0YSA9IHByaXY7CisJcHJpdi0+dWlkID0gY3VycmVudC0+ZXVpZDsKKwlwcml2LT5waWQgPSBjdXJyZW50LT5waWQ7CisJcHJpdi0+bWlub3IgPSBtaW5vcjsKKwlwcml2LT5oZWFkID0gZHJtX2hlYWRzW21pbm9yXTsKKwlwcml2LT5pb2N0bF9jb3VudCA9IDA7CisJLyogZm9yIGNvbXBhdGliaWxpdHkgcm9vdCBpcyBhbHdheXMgYXV0aGVudGljYXRlZCAqLworCXByaXYtPmF1dGhlbnRpY2F0ZWQgPSBjYXBhYmxlKENBUF9TWVNfQURNSU4pOworCXByaXYtPmxvY2tfY291bnQgPSAwOworCisJaWYgKGRldi0+ZHJpdmVyLT5vcGVuKSB7CisJCXJldCA9IGRldi0+ZHJpdmVyLT5vcGVuKGRldiwgcHJpdik7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlkb3duKCZkZXYtPnN0cnVjdF9zZW0pOworCWlmICghZGV2LT5maWxlX2xhc3QpIHsKKwkJcHJpdi0+bmV4dCA9IE5VTEw7CisJCXByaXYtPnByZXYgPSBOVUxMOworCQlkZXYtPmZpbGVfZmlyc3QgPSBwcml2OworCQlkZXYtPmZpbGVfbGFzdCA9IHByaXY7CisJCS8qIGZpcnN0IG9wZW5lciBhdXRvbWF0aWNhbGx5IGJlY29tZXMgbWFzdGVyICovCisJCXByaXYtPm1hc3RlciA9IDE7CisJfSBlbHNlIHsKKwkJcHJpdi0+bmV4dCA9IE5VTEw7CisJCXByaXYtPnByZXYgPSBkZXYtPmZpbGVfbGFzdDsKKwkJZGV2LT5maWxlX2xhc3QtPm5leHQgPSBwcml2OworCQlkZXYtPmZpbGVfbGFzdCA9IHByaXY7CisJfQorCXVwKCZkZXYtPnN0cnVjdF9zZW0pOworCisjaWZkZWYgX19hbHBoYV9fCisJLyoKKwkgKiBEZWZhdWx0IHRoZSBob3NlCisJICovCisJaWYgKCFkZXYtPmhvc2UpIHsKKwkJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisJCXBjaV9kZXYgPSBwY2lfZ2V0X2NsYXNzKFBDSV9DTEFTU19ESVNQTEFZX1ZHQSA8PCA4LCBOVUxMKTsKKwkJaWYgKHBjaV9kZXYpIHsKKwkJCWRldi0+aG9zZSA9IHBjaV9kZXYtPnN5c2RhdGE7CisJCQlwY2lfZGV2X3B1dChwY2lfZGV2KTsKKwkJfQorCQlpZiAoIWRldi0+aG9zZSkgeworCQkJc3RydWN0IHBjaV9idXMgKmIgPSBwY2lfYnVzX2IocGNpX3Jvb3RfYnVzZXMubmV4dCk7CisJCQlpZiAoYikKKwkJCQlkZXYtPmhvc2UgPSBiLT5zeXNkYXRhOworCQl9CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKKyAgICAgIG91dF9mcmVlOgorCWRybV9mcmVlKHByaXYsIHNpemVvZigqcHJpdiksIERSTV9NRU1fRklMRVMpOworCWZpbHAtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJcmV0dXJuIHJldDsKK30KKworLyoqIE5vLW9wLiAqLworaW50IGRybV9mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IG9uKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJaW50IHJldGNvZGU7CisKKwlEUk1fREVCVUcoImZkID0gJWQsIGRldmljZSA9IDB4JWx4XG4iLCBmZCwKKwkJICAobG9uZylvbGRfZW5jb2RlX2Rldihwcml2LT5oZWFkLT5kZXZpY2UpKTsKKwlyZXRjb2RlID0gZmFzeW5jX2hlbHBlcihmZCwgZmlscCwgb24sICZkZXYtPmJ1Zl9hc3luYyk7CisJaWYgKHJldGNvZGUgPCAwKQorCQlyZXR1cm4gcmV0Y29kZTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2Zhc3luYyk7CisKKy8qKgogICogUmVsZWFzZSBmaWxlLgogICoKICAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUKQEAgLTE2Nyw3ICszMzAsNyBAQAogICogSWYgdGhlIGhhcmR3YXJlIGxvY2sgaXMgaGVsZCB0aGVuIGZyZWUgaXQsIGFuZCB0YWtlIGl0IGFnYWluIGZvciB0aGUga2VybmVsCiAgKiBjb250ZXh0IHNpbmNlIGl0J3MgbmVjZXNzYXJ5IHRvIHJlY2xhaW0gYnVmZmVycy4gVW5saW5rIHRoZSBmaWxlIHByaXZhdGUKICAqIGRhdGEgZnJvbSBpdHMgbGlzdCBhbmQgZnJlZSBpdC4gRGVjcmVhc2VzIHRoZSBvcGVuIGNvdW50IGFuZCBpZiBpdCByZWFjaGVzCi0gKiB6ZXJvIGNhbGxzIHRha2Vkb3duKCkuCisgKiB6ZXJvIGNhbGxzIGRybV9sYXN0Y2xvc2UoKS4KICAqLwogaW50IGRybV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewpAQCAtMTgwLDggKzM0Myw4IEBACiAKIAlEUk1fREVCVUcoIm9wZW5fY291bnQgPSAlZFxuIiwgZGV2LT5vcGVuX2NvdW50KTsKIAotCWlmIChkZXYtPmRyaXZlci0+cHJlcmVsZWFzZSkKLQkJZGV2LT5kcml2ZXItPnByZXJlbGVhc2UoZGV2LCBmaWxwKTsKKwlpZiAoZGV2LT5kcml2ZXItPnByZWNsb3NlKQorCQlkZXYtPmRyaXZlci0+cHJlY2xvc2UoZGV2LCBmaWxwKTsKIAogCS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJICogQmVnaW4gaW5saW5lIGRybV9yZWxlYXNlCkBAIC0xOTcsOCArMzYwLDggQEAKIAkJRFJNX0RFQlVHKCJGaWxlICVwIHJlbGVhc2VkLCBmcmVlaW5nIGxvY2sgZm9yIGNvbnRleHQgJWRcbiIsCiAJCQkgIGZpbHAsIF9EUk1fTE9DS0lOR19DT05URVhUKGRldi0+bG9jay5od19sb2NrLT5sb2NrKSk7CiAKLQkJaWYgKGRldi0+ZHJpdmVyLT5yZWxlYXNlKQotCQkJZGV2LT5kcml2ZXItPnJlbGVhc2UoZGV2LCBmaWxwKTsKKwkJaWYgKGRldi0+ZHJpdmVyLT5yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKQorCQkJZGV2LT5kcml2ZXItPnJlY2xhaW1fYnVmZmVyc19sb2NrZWQoZGV2LCBmaWxwKTsKIAogCQlkcm1fbG9ja19mcmVlKGRldiwgJmRldi0+bG9jay5od19sb2NrLT5sb2NrLAogCQkJICAgICAgX0RSTV9MT0NLSU5HX0NPTlRFWFQoZGV2LT5sb2NrLmh3X2xvY2stPmxvY2spKTsKQEAgLTIwNyw3ICszNzAsNyBAQAogCQkgICBoYXJkd2FyZSBhdCB0aGlzIHBvaW50LCBwb3NzaWJseQogCQkgICBwcm9jZXNzZWQgdmlhIGEgY2FsbGJhY2sgdG8gdGhlIFgKIAkJICAgc2VydmVyLiAqLwotCX0gZWxzZSBpZiAoZGV2LT5kcml2ZXItPnJlbGVhc2UgJiYgcHJpdi0+bG9ja19jb3VudAorCX0gZWxzZSBpZiAoZGV2LT5kcml2ZXItPnJlY2xhaW1fYnVmZmVyc19sb2NrZWQgJiYgcHJpdi0+bG9ja19jb3VudAogCQkgICAmJiBkZXYtPmxvY2suaHdfbG9jaykgewogCQkvKiBUaGUgbG9jayBpcyByZXF1aXJlZCB0byByZWNsYWltIGJ1ZmZlcnMgKi8KIAkJREVDTEFSRV9XQUlUUVVFVUUoZW50cnksIGN1cnJlbnQpOwpAQCAtMjM3LDE1ICs0MDAsMTQgQEAKIAkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCQlyZW1vdmVfd2FpdF9xdWV1ZSgmZGV2LT5sb2NrLmxvY2tfcXVldWUsICZlbnRyeSk7CiAJCWlmICghcmV0Y29kZSkgewotCQkJaWYgKGRldi0+ZHJpdmVyLT5yZWxlYXNlKQotCQkJCWRldi0+ZHJpdmVyLT5yZWxlYXNlKGRldiwgZmlscCk7CisJCQlkZXYtPmRyaXZlci0+cmVjbGFpbV9idWZmZXJzX2xvY2tlZChkZXYsIGZpbHApOwogCQkJZHJtX2xvY2tfZnJlZShkZXYsICZkZXYtPmxvY2suaHdfbG9jay0+bG9jaywKIAkJCQkgICAgICBEUk1fS0VSTkVMX0NPTlRFWFQpOwogCQl9CiAJfQogCi0JaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9ETUEpCi0JICAgICYmICFkZXYtPmRyaXZlci0+cmVsZWFzZSkgeworCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfRE1BKSAmJgorCSAgICAhZGV2LT5kcml2ZXItPnJlY2xhaW1fYnVmZmVyc19sb2NrZWQpIHsKIAkJZGV2LT5kcml2ZXItPnJlY2xhaW1fYnVmZmVycyhkZXYsIGZpbHApOwogCX0KIApAQCAtMjkyLDkgKzQ1NCw4IEBACiAJfQogCXVwKCZkZXYtPnN0cnVjdF9zZW0pOwogCi0JaWYgKGRldi0+ZHJpdmVyLT5mcmVlX2ZpbHBfcHJpdikKLQkJZGV2LT5kcml2ZXItPmZyZWVfZmlscF9wcml2KGRldiwgcHJpdik7Ci0KKwlpZiAoZGV2LT5kcml2ZXItPnBvc3RjbG9zZSkKKwkJZGV2LT5kcml2ZXItPnBvc3RjbG9zZShkZXYsIHByaXYpOwogCWRybV9mcmVlKHByaXYsIHNpemVvZigqcHJpdiksIERSTV9NRU1fRklMRVMpOwogCiAJLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTMxMyw3ICs0NzQsNyBAQAogCQl9CiAJCXNwaW5fdW5sb2NrKCZkZXYtPmNvdW50X2xvY2spOwogCQl1bmxvY2tfa2VybmVsKCk7Ci0JCXJldHVybiBkcm1fdGFrZWRvd24oZGV2KTsKKwkJcmV0dXJuIGRybV9sYXN0Y2xvc2UoZGV2KTsKIAl9CiAJc3Bpbl91bmxvY2soJmRldi0+Y291bnRfbG9jayk7CiAKQEAgLTMyMSwxMjkgKzQ4MiwxMSBAQAogCiAJcmV0dXJuIHJldGNvZGU7CiB9Ci0KIEVYUE9SVF9TWU1CT0woZHJtX3JlbGVhc2UpOwogCi0vKioKLSAqIENhbGxlZCB3aGVuZXZlciBhIHByb2Nlc3Mgb3BlbnMgL2Rldi9kcm0uCi0gKgotICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KLSAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KLSAqIFxwYXJhbSBkZXYgZGV2aWNlLgotICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KLSAqCi0gKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIGRybV9maWxlIHN0cnVjdHVyZSBmb3IgdGhlIGZpbGUgcHJpdmF0ZSBkYXRhIGluIFxwCi0gKiBmaWxwIGFuZCBhZGQgaXQgaW50byB0aGUgZG91YmxlIGxpbmtlZCBsaXN0IGluIFxwIGRldi4KLSAqLwotc3RhdGljIGludCBkcm1fb3Blbl9oZWxwZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkgICBkcm1fZGV2aWNlX3QgKiBkZXYpCi17Ci0JaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKLQlkcm1fZmlsZV90ICpwcml2OwotCWludCByZXQ7Ci0KLQlpZiAoZmlscC0+Zl9mbGFncyAmIE9fRVhDTCkKLQkJcmV0dXJuIC1FQlVTWTsJLyogTm8gZXhjbHVzaXZlIG9wZW5zICovCi0JaWYgKCFkcm1fY3B1X3ZhbGlkKCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JRFJNX0RFQlVHKCJwaWQgPSAlZCwgbWlub3IgPSAlZFxuIiwgY3VycmVudC0+cGlkLCBtaW5vcik7Ci0KLQlwcml2ID0gZHJtX2FsbG9jKHNpemVvZigqcHJpdiksIERSTV9NRU1fRklMRVMpOwotCWlmICghcHJpdikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKCpwcml2KSk7Ci0JZmlscC0+cHJpdmF0ZV9kYXRhID0gcHJpdjsKLQlwcml2LT51aWQgPSBjdXJyZW50LT5ldWlkOwotCXByaXYtPnBpZCA9IGN1cnJlbnQtPnBpZDsKLQlwcml2LT5taW5vciA9IG1pbm9yOwotCXByaXYtPmhlYWQgPSBkcm1faGVhZHNbbWlub3JdOwotCXByaXYtPmlvY3RsX2NvdW50ID0gMDsKLQlwcml2LT5hdXRoZW50aWNhdGVkID0gY2FwYWJsZShDQVBfU1lTX0FETUlOKTsKLQlwcml2LT5sb2NrX2NvdW50ID0gMDsKLQotCWlmIChkZXYtPmRyaXZlci0+b3Blbl9oZWxwZXIpIHsKLQkJcmV0ID0gZGV2LT5kcml2ZXItPm9wZW5faGVscGVyKGRldiwgcHJpdik7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXRfZnJlZTsKLQl9Ci0KLQlkb3duKCZkZXYtPnN0cnVjdF9zZW0pOwotCWlmICghZGV2LT5maWxlX2xhc3QpIHsKLQkJcHJpdi0+bmV4dCA9IE5VTEw7Ci0JCXByaXYtPnByZXYgPSBOVUxMOwotCQlkZXYtPmZpbGVfZmlyc3QgPSBwcml2OwotCQlkZXYtPmZpbGVfbGFzdCA9IHByaXY7Ci0JfSBlbHNlIHsKLQkJcHJpdi0+bmV4dCA9IE5VTEw7Ci0JCXByaXYtPnByZXYgPSBkZXYtPmZpbGVfbGFzdDsKLQkJZGV2LT5maWxlX2xhc3QtPm5leHQgPSBwcml2OwotCQlkZXYtPmZpbGVfbGFzdCA9IHByaXY7Ci0JfQotCXVwKCZkZXYtPnN0cnVjdF9zZW0pOwotCi0jaWZkZWYgX19hbHBoYV9fCi0JLyoKLQkgKiBEZWZhdWx0IHRoZSBob3NlCi0JICovCi0JaWYgKCFkZXYtPmhvc2UpIHsKLQkJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7Ci0JCXBjaV9kZXYgPSBwY2lfZ2V0X2NsYXNzKFBDSV9DTEFTU19ESVNQTEFZX1ZHQSA8PCA4LCBOVUxMKTsKLQkJaWYgKHBjaV9kZXYpIHsKLQkJCWRldi0+aG9zZSA9IHBjaV9kZXYtPnN5c2RhdGE7Ci0JCQlwY2lfZGV2X3B1dChwY2lfZGV2KTsKLQkJfQotCQlpZiAoIWRldi0+aG9zZSkgewotCQkJc3RydWN0IHBjaV9idXMgKmIgPSBwY2lfYnVzX2IocGNpX3Jvb3RfYnVzZXMubmV4dCk7Ci0JCQlpZiAoYikKLQkJCQlkZXYtPmhvc2UgPSBiLT5zeXNkYXRhOwotCQl9Ci0JfQotI2VuZGlmCi0KLQlyZXR1cm4gMDsKLSAgICAgIG91dF9mcmVlOgotCWRybV9mcmVlKHByaXYsIHNpemVvZigqcHJpdiksIERSTV9NRU1fRklMRVMpOwotCWZpbHAtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqIE5vLW9wLiAqLwotaW50IGRybV9mbHVzaChzdHJ1Y3QgZmlsZSAqZmlscCkKLXsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCi0JRFJNX0RFQlVHKCJwaWQgPSAlZCwgZGV2aWNlID0gMHglbHgsIG9wZW5fY291bnQgPSAlZFxuIiwKLQkJICBjdXJyZW50LT5waWQsIChsb25nKW9sZF9lbmNvZGVfZGV2KHByaXYtPmhlYWQtPmRldmljZSksCi0JCSAgZGV2LT5vcGVuX2NvdW50KTsKLQlyZXR1cm4gMDsKLX0KLQotRVhQT1JUX1NZTUJPTChkcm1fZmx1c2gpOwotCi0vKiogTm8tb3AuICovCi1pbnQgZHJtX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pCi17Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlpbnQgcmV0Y29kZTsKLQotCURSTV9ERUJVRygiZmQgPSAlZCwgZGV2aWNlID0gMHglbHhcbiIsIGZkLAotCQkgIChsb25nKW9sZF9lbmNvZGVfZGV2KHByaXYtPmhlYWQtPmRldmljZSkpOwotCXJldGNvZGUgPSBmYXN5bmNfaGVscGVyKGZkLCBmaWxwLCBvbiwgJmRldi0+YnVmX2FzeW5jKTsKLQlpZiAocmV0Y29kZSA8IDApCi0JCXJldHVybiByZXRjb2RlOwotCXJldHVybiAwOwotfQotCi1FWFBPUlRfU1lNQk9MKGRybV9mYXN5bmMpOwotCiAvKiogTm8tb3AuICovCiB1bnNpZ25lZCBpbnQgZHJtX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKIHsKIAlyZXR1cm4gMDsKIH0KLQogRVhQT1JUX1NZTUJPTChkcm1fcG9sbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pbml0LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9pbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NGI5MzQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1faW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqCi0gKiBcZmlsZSBkcm1faW5pdC5jCi0gKiBTZXR1cC9DbGVhbnVwIGZvciBEUk0KLSAqCi0gKiBcYXV0aG9yIFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgotICogXGF1dGhvciBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+Ci0gKi8KLQotLyoKLSAqIENyZWF0ZWQ6IE1vbiBKYW4gIDQgMDg6NTg6MzEgMTk5OSBieSBmYWl0aEB2YWxpbnV4LmNvbQotICoKLSAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KLSAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0gKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLSAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQotICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0Ci0gKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCi0gKiBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKLSAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKLSAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAotICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCi0gKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgImRybVAuaCIKLQotLyoqCi0gKiBDaGVjayB3aGV0aGVyIERSSSB3aWxsIHJ1biBvbiB0aGlzIENQVS4KLSAqCi0gKiBccmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBEUkkgd2lsbCBydW4gb24gdGhpcyBDUFUsIG9yIHplcm8gb3RoZXJ3aXNlLgotICovCi1pbnQgZHJtX2NwdV92YWxpZCh2b2lkKQotewotI2lmIGRlZmluZWQoX19pMzg2X18pCi0JaWYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDMpCi0JCXJldHVybiAwOwkvKiBObyBjbXB4Y2hnIG9uIGEgMzg2ICovCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgIWRlZmluZWQoX19zcGFyY192OV9fKQotCXJldHVybiAwOwkJLyogTm8gY21weGNoZyBiZWZvcmUgdjkgc3BhcmMuICovCi0jZW5kaWYKLQlyZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvYzMyLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2MzMi5jCmluZGV4IGRkOTFmZjYuLmU5ZTJkYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvYzMyLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jMzIuYwpAQCAtMjgsNyArMjgsNiBAQAogICogSU4gVEhFIFNPRlRXQVJFLgogICovCiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW9jdGwzMi5oPgogCiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybV9jb3JlLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2N0bC5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jdGwuYwppbmRleCA5YjBmZWJhLi5iY2Q0ZTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2N0bC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvY3RsLmMKQEAgLTEzNywxNyArMTM3LDIyIEBACiAKIHN0YXRpYyBpbnQgZHJtX3NldF9idXNpZChkcm1fZGV2aWNlX3QgKiBkZXYpCiB7CisJaW50IGxlbjsKKwogCWlmIChkZXYtPnVuaXF1ZSAhPSBOVUxMKQogCQlyZXR1cm4gRUJVU1k7CiAKLQlkZXYtPnVuaXF1ZV9sZW4gPSAyMDsKKwlkZXYtPnVuaXF1ZV9sZW4gPSA0MDsKIAlkZXYtPnVuaXF1ZSA9IGRybV9hbGxvYyhkZXYtPnVuaXF1ZV9sZW4gKyAxLCBEUk1fTUVNX0RSSVZFUik7CiAJaWYgKGRldi0+dW5pcXVlID09IE5VTEwpCiAJCXJldHVybiBFTk9NRU07CiAKLQlzbnByaW50ZihkZXYtPnVuaXF1ZSwgZGV2LT51bmlxdWVfbGVuLCAicGNpOiUwNHg6JTAyeDolMDJ4LiVkIiwKKwlsZW4gPSBzbnByaW50ZihkZXYtPnVuaXF1ZSwgZGV2LT51bmlxdWVfbGVuLCAicGNpOiUwNHg6JTAyeDolMDJ4LiVkIiwKIAkJIGRldi0+cGNpX2RvbWFpbiwgZGV2LT5wY2lfYnVzLCBkZXYtPnBjaV9zbG90LCBkZXYtPnBjaV9mdW5jKTsKIAorCWlmIChsZW4gPiBkZXYtPnVuaXF1ZV9sZW4pCisJCURSTV9FUlJPUigiVW5pcXVlIGJ1ZmZlciBvdmVyZmxvd2VkXG4iKTsKKwogCWRldi0+ZGV2bmFtZSA9CiAJICAgIGRybV9hbGxvYyhzdHJsZW4oZGV2LT5kcml2ZXItPnBjaV9kcml2ZXIubmFtZSkgKyBkZXYtPnVuaXF1ZV9sZW4gKwogCQkgICAgICAyLCBEUk1fTUVNX0RSSVZFUik7CkBAIC0yMzksNyArMjQ0LDcgQEAKIHsKIAlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9jbGllbnRfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX2NsaWVudF90IF9fdXNlciAqYXJncCA9IChkcm1fY2xpZW50X3QgX191c2VyICopYXJnOwogCWRybV9jbGllbnRfdCBjbGllbnQ7CiAJZHJtX2ZpbGVfdCAqcHQ7CiAJaW50IGlkeDsKQEAgLTI2Miw3ICsyNjcsNyBAQAogCWNsaWVudC5pb2NzID0gcHQtPmlvY3RsX2NvdW50OwogCXVwKCZkZXYtPnN0cnVjdF9zZW0pOwogCi0JaWYgKGNvcHlfdG9fdXNlcigoZHJtX2NsaWVudF90IF9fdXNlciAqKSBhcmcsICZjbGllbnQsIHNpemVvZihjbGllbnQpKSkKKwlpZiAoY29weV90b191c2VyKGFyZ3AsICZjbGllbnQsIHNpemVvZihjbGllbnQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7CiB9CkBAIC0zMjUsMTcgKzMzMCwxMyBAQAogCWRybV9zZXRfdmVyc2lvbl90IHJldHY7CiAJaW50IGlmX3ZlcnNpb247CiAJZHJtX3NldF92ZXJzaW9uX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKLQlkcm1fdmVyc2lvbl90IHZlcnNpb247CiAKIAlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoc3YsIGFyZ3AsIHNpemVvZihzdikpOwogCi0JbWVtc2V0KCZ2ZXJzaW9uLCAwLCBzaXplb2YodmVyc2lvbikpOwotCi0JZGV2LT5kcml2ZXItPnZlcnNpb24oJnZlcnNpb24pOwogCXJldHYuZHJtX2RpX21ham9yID0gRFJNX0lGX01BSk9SOwogCXJldHYuZHJtX2RpX21pbm9yID0gRFJNX0lGX01JTk9SOwotCXJldHYuZHJtX2RkX21ham9yID0gdmVyc2lvbi52ZXJzaW9uX21ham9yOwotCXJldHYuZHJtX2RkX21pbm9yID0gdmVyc2lvbi52ZXJzaW9uX21pbm9yOworCXJldHYuZHJtX2RkX21ham9yID0gZGV2LT5kcml2ZXItPm1ham9yOworCXJldHYuZHJtX2RkX21pbm9yID0gZGV2LT5kcml2ZXItPm1pbm9yOwogCiAJRFJNX0NPUFlfVE9fVVNFUl9JT0NUTChhcmdwLCByZXR2LCBzaXplb2Yoc3YpKTsKIApAQCAtMzQzLDcgKzM0NCw3IEBACiAJCWlmIChzdi5kcm1fZGlfbWFqb3IgIT0gRFJNX0lGX01BSk9SIHx8CiAJCSAgICBzdi5kcm1fZGlfbWlub3IgPCAwIHx8IHN2LmRybV9kaV9taW5vciA+IERSTV9JRl9NSU5PUikKIAkJCXJldHVybiBFSU5WQUw7Ci0JCWlmX3ZlcnNpb24gPSBEUk1fSUZfVkVSU0lPTihzdi5kcm1fZGlfbWFqb3IsIHN2LmRybV9kZF9taW5vcik7CisJCWlmX3ZlcnNpb24gPSBEUk1fSUZfVkVSU0lPTihzdi5kcm1fZGlfbWFqb3IsIHN2LmRybV9kaV9taW5vcik7CiAJCWRldi0+aWZfdmVyc2lvbiA9IERSTV9NQVgoaWZfdmVyc2lvbiwgZGV2LT5pZl92ZXJzaW9uKTsKIAkJaWYgKHN2LmRybV9kaV9taW5vciA+PSAxKSB7CiAJCQkvKgpAQCAtMzU0LDkgKzM1NSw5IEBACiAJfQogCiAJaWYgKHN2LmRybV9kZF9tYWpvciAhPSAtMSkgewotCQlpZiAoc3YuZHJtX2RkX21ham9yICE9IHZlcnNpb24udmVyc2lvbl9tYWpvciB8fAorCQlpZiAoc3YuZHJtX2RkX21ham9yICE9IGRldi0+ZHJpdmVyLT5tYWpvciB8fAogCQkgICAgc3YuZHJtX2RkX21pbm9yIDwgMAotCQkgICAgfHwgc3YuZHJtX2RkX21pbm9yID4gdmVyc2lvbi52ZXJzaW9uX21pbm9yKQorCQkgICAgfHwgc3YuZHJtX2RkX21pbm9yID4gZGV2LT5kcml2ZXItPm1pbm9yKQogCQkJcmV0dXJuIEVJTlZBTDsKIAogCQlpZiAoZGV2LT5kcml2ZXItPnNldF92ZXJzaW9uKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbG9jay5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbG9jay5jCmluZGV4IGI0OGE1OTUuLmY5ZTQ1MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2xvY2suYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9sb2NrLmMKQEAgLTEzMCw3ICsxMzAsNiBAQAogCS8qIGRldi0+ZHJpdmVyLT5rZXJuZWxfY29udGV4dF9zd2l0Y2ggaXNuJ3QgdXNlZCBieSBhbnkgb2YgdGhlIHg4NgogCSAqICBkcml2ZXJzIGJ1dCBpcyB1c2VkIGJ5IHRoZSBTcGFyYyBkcml2ZXIuCiAJICovCi0KIAlpZiAoZGV2LT5kcml2ZXItPmtlcm5lbF9jb250ZXh0X3N3aXRjaCAmJgogCSAgICBkZXYtPmxhc3RfY29udGV4dCAhPSBsb2NrLmNvbnRleHQpIHsKIAkJZGV2LT5kcml2ZXItPmtlcm5lbF9jb250ZXh0X3N3aXRjaChkZXYsIGRldi0+bGFzdF9jb250ZXh0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYwppbmRleCBhYmVmMmFjLi44MDc0NzcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYwpAQCAtMTQ1LDMwICsxNDUsMjIgQEAKIAlyZXR1cm4gZHJtX2FncF9hbGxvY2F0ZV9tZW1vcnkoZGV2LT5hZ3AtPmJyaWRnZSwgcGFnZXMsIHR5cGUpOwogfQogCi1FWFBPUlRfU1lNQk9MKGRybV9hbGxvY19hZ3ApOwotCiAvKiogV3JhcHBlciBhcm91bmQgYWdwX2ZyZWVfbWVtb3J5KCkgKi8KIGludCBkcm1fZnJlZV9hZ3AoRFJNX0FHUF9NRU0gKiBoYW5kbGUsIGludCBwYWdlcykKIHsKIAlyZXR1cm4gZHJtX2FncF9mcmVlX21lbW9yeShoYW5kbGUpID8gMCA6IC1FSU5WQUw7CiB9CiAKLUVYUE9SVF9TWU1CT0woZHJtX2ZyZWVfYWdwKTsKLQogLyoqIFdyYXBwZXIgYXJvdW5kIGFncF9iaW5kX21lbW9yeSgpICovCiBpbnQgZHJtX2JpbmRfYWdwKERSTV9BR1BfTUVNICogaGFuZGxlLCB1bnNpZ25lZCBpbnQgc3RhcnQpCiB7CiAJcmV0dXJuIGRybV9hZ3BfYmluZF9tZW1vcnkoaGFuZGxlLCBzdGFydCk7CiB9CiAKLUVYUE9SVF9TWU1CT0woZHJtX2JpbmRfYWdwKTsKLQogLyoqIFdyYXBwZXIgYXJvdW5kIGFncF91bmJpbmRfbWVtb3J5KCkgKi8KIGludCBkcm1fdW5iaW5kX2FncChEUk1fQUdQX01FTSAqIGhhbmRsZSkKIHsKIAlyZXR1cm4gZHJtX2FncF91bmJpbmRfbWVtb3J5KGhhbmRsZSk7CiB9Ci0KLUVYUE9SVF9TWU1CT0woZHJtX3VuYmluZF9hZ3ApOwogI2VuZGlmCQkJCS8qIGFncCAqLwogI2VuZGlmCQkJCS8qIGRlYnVnX21lbW9yeSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5X2RlYnVnLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnlfZGVidWcuaAppbmRleCBiMzcwYWNhLi5lODQ2MDVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnlfZGVidWcuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnlfZGVidWcuaApAQCAtMSw1ICsxLDUgQEAKIC8qKgotICogXGZpbGUgZHJtX21lbW9yeS5oCisgKiBcZmlsZSBkcm1fbWVtb3J5X2RlYnVnLmgKICAqIE1lbW9yeSBtYW5hZ2VtZW50IHdyYXBwZXJzIGZvciBEUk0uCiAgKgogICogXGF1dGhvciBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KQEAgLTQzLDQyICs0Myw0MSBAQAogCXVuc2lnbmVkIGxvbmcgYnl0ZXNfZnJlZWQ7CiB9IGRybV9tZW1fc3RhdHNfdDsKIAotc3RhdGljIERFRklORV9TUElOTE9DSyhEUk0obWVtX2xvY2spKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIERSTShyYW1fYXZhaWxhYmxlKSA9IDA7CS8qIEluIHBhZ2VzICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBEUk0ocmFtX3VzZWQpID0gMDsKLXN0YXRpYyBkcm1fbWVtX3N0YXRzX3QgRFJNKG1lbV9zdGF0cylbXSA9CitzdGF0aWMgc3BpbmxvY2tfdCBkcm1fbWVtX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBkcm1fcmFtX2F2YWlsYWJsZSA9IDA7CS8qIEluIHBhZ2VzICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkcm1fcmFtX3VzZWQgPSAwOworc3RhdGljIGRybV9tZW1fc3RhdHNfdCBkcm1fbWVtX3N0YXRzW10gPQogewotCVtEUk1fTUVNX0RNQV0gPSB7Ci0JImRtYWJ1ZnMifSxbRFJNX01FTV9TQVJFQV0gPSB7Ci0JInNhcmVhcyJ9LFtEUk1fTUVNX0RSSVZFUl0gPSB7Ci0JImRyaXZlciJ9LFtEUk1fTUVNX01BR0lDXSA9IHsKLQkibWFnaWMifSxbRFJNX01FTV9JT0NUTFNdID0gewotCSJpb2N0bHRhYiJ9LFtEUk1fTUVNX01BUFNdID0gewotCSJtYXBsaXN0In0sW0RSTV9NRU1fVk1BU10gPSB7Ci0JInZtYWxpc3QifSxbRFJNX01FTV9CVUZTXSA9IHsKLQkiYnVmbGlzdCJ9LFtEUk1fTUVNX1NFR1NdID0gewotCSJzZWdsaXN0In0sW0RSTV9NRU1fUEFHRVNdID0gewotCSJwYWdlbGlzdCJ9LFtEUk1fTUVNX0ZJTEVTXSA9IHsKLQkiZmlsZXMifSxbRFJNX01FTV9RVUVVRVNdID0gewotCSJxdWV1ZXMifSxbRFJNX01FTV9DTURTXSA9IHsKLQkiY29tbWFuZHMifSxbRFJNX01FTV9NQVBQSU5HU10gPSB7Ci0JIm1hcHBpbmdzIn0sW0RSTV9NRU1fQlVGTElTVFNdID0gewotCSJidWZsaXN0cyJ9LFtEUk1fTUVNX0FHUExJU1RTXSA9IHsKLQkiYWdwbGlzdCJ9LFtEUk1fTUVNX1NHTElTVFNdID0gewotCSJzZ2xpc3QifSxbRFJNX01FTV9UT1RBTEFHUF0gPSB7Ci0JInRvdGFsYWdwIn0sW0RSTV9NRU1fQk9VTkRBR1BdID0gewotCSJib3VuZGFncCJ9LFtEUk1fTUVNX0NUWEJJVE1BUF0gPSB7Ci0JImN0eGJpdG1hcCJ9LFtEUk1fTUVNX0NUWExJU1RdID0gewotCSJjdHhsaXN0In0sW0RSTV9NRU1fU1RVQl0gPSB7Ci0JInN0dWIifSwgewotCU5VTEwsIDAsfQkJLyogTGFzdCBlbnRyeSBtdXN0IGJlIG51bGwgKi8KKwlbRFJNX01FTV9ETUFdID0geyJkbWFidWZzIn0sCisJW0RSTV9NRU1fU0FSRUFdID0geyJzYXJlYXMifSwKKwlbRFJNX01FTV9EUklWRVJdID0geyJkcml2ZXIifSwKKwlbRFJNX01FTV9NQUdJQ10gPSB7Im1hZ2ljIn0sCisJW0RSTV9NRU1fSU9DVExTXSA9IHsiaW9jdGx0YWIifSwKKwlbRFJNX01FTV9NQVBTXSA9IHsibWFwbGlzdCJ9LAorCVtEUk1fTUVNX1ZNQVNdID0geyJ2bWFsaXN0In0sCisJW0RSTV9NRU1fQlVGU10gPSB7ImJ1Zmxpc3QifSwKKwlbRFJNX01FTV9TRUdTXSA9IHsic2VnbGlzdCJ9LAorCVtEUk1fTUVNX1BBR0VTXSA9IHsicGFnZWxpc3QifSwKKwlbRFJNX01FTV9GSUxFU10gPSB7ImZpbGVzIn0sCisJW0RSTV9NRU1fUVVFVUVTXSA9IHsicXVldWVzIn0sCisJW0RSTV9NRU1fQ01EU10gPSB7ImNvbW1hbmRzIn0sCisJW0RSTV9NRU1fTUFQUElOR1NdID0geyJtYXBwaW5ncyJ9LAorCVtEUk1fTUVNX0JVRkxJU1RTXSA9IHsiYnVmbGlzdHMifSwKKwlbRFJNX01FTV9BR1BMSVNUU10gPSB7ImFncGxpc3QifSwKKwlbRFJNX01FTV9TR0xJU1RTXSA9IHsic2dsaXN0In0sCisJW0RSTV9NRU1fVE9UQUxBR1BdID0geyJ0b3RhbGFncCJ9LAorCVtEUk1fTUVNX0JPVU5EQUdQXSA9IHsiYm91bmRhZ3AifSwKKwlbRFJNX01FTV9DVFhCSVRNQVBdID0geyJjdHhiaXRtYXAifSwKKwlbRFJNX01FTV9DVFhMSVNUXSA9IHsiY3R4bGlzdCJ9LAorCVtEUk1fTUVNX1NUVUJdID0geyJzdHViIn0sCisJe05VTEwsIDAsfQkJLyogTGFzdCBlbnRyeSBtdXN0IGJlIG51bGwgKi8KIH07CiAKLXZvaWQgRFJNKG1lbV9pbml0KSAodm9pZCkgewordm9pZCBkcm1fbWVtX2luaXQgKHZvaWQpIHsKIAlkcm1fbWVtX3N0YXRzX3QgKm1lbTsKIAlzdHJ1Y3Qgc3lzaW5mbyBzaTsKIAotCWZvciAobWVtID0gRFJNKG1lbV9zdGF0cyk7IG1lbS0+bmFtZTsgKyttZW0pIHsKKwlmb3IgKG1lbSA9IGRybV9tZW1fc3RhdHM7IG1lbS0+bmFtZTsgKyttZW0pIHsKIAkJbWVtLT5zdWNjZWVkX2NvdW50ID0gMDsKIAkJbWVtLT5mcmVlX2NvdW50ID0gMDsKIAkJbWVtLT5mYWlsX2NvdW50ID0gMDsKQEAgLTg3LDEzICs4NiwxMyBAQAogCX0KIAogCXNpX21lbWluZm8oJnNpKTsKLQlEUk0ocmFtX2F2YWlsYWJsZSkgPSBzaS50b3RhbHJhbTsKLQlEUk0ocmFtX3VzZWQpID0gMDsKKwlkcm1fcmFtX2F2YWlsYWJsZSA9IHNpLnRvdGFscmFtOworCWRybV9yYW1fdXNlZCA9IDA7CiB9CiAKIC8qIGRybV9tZW1faW5mbyBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBwcm9jZXNzIHJlYWRzIC9kZXYvZHJtL21lbS4gKi8KIAotc3RhdGljIGludCBEUk0oX21lbV9pbmZvKSAoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKK3N0YXRpYyBpbnQgZHJtX19tZW1faW5mbyAoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKIAkJCSAgIGludCByZXF1ZXN0LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkgewogCWRybV9tZW1fc3RhdHNfdCAqcHQ7CiAJaW50IGxlbiA9IDA7CkBAIC0xMTIsMTEgKzExMSwxMSBAQAogCQkgICAgICAgIiB8IGFsbG9jcyAgICAgIGJ5dGVzXG5cbiIpOwogCURSTV9QUk9DX1BSSU5UKCIlLTkuOXMgJTVkICU1ZCAlNGQgJTEwbHUga0IgICAgICAgICB8XG4iLAogCQkgICAgICAgInN5c3RlbSIsIDAsIDAsIDAsCi0JCSAgICAgICBEUk0ocmFtX2F2YWlsYWJsZSkgPDwgKFBBR0VfU0hJRlQgLSAxMCkpOworCQkgICAgICAgZHJtX3JhbV9hdmFpbGFibGUgPDwgKFBBR0VfU0hJRlQgLSAxMCkpOwogCURSTV9QUk9DX1BSSU5UKCIlLTkuOXMgJTVkICU1ZCAlNGQgJTEwbHUga0IgICAgICAgICB8XG4iLAotCQkgICAgICAgImxvY2tlZCIsIDAsIDAsIDAsIERSTShyYW1fdXNlZCkgPj4gMTApOworCQkgICAgICAgImxvY2tlZCIsIDAsIDAsIDAsIGRybV9yYW1fdXNlZCA+PiAxMCk7CiAJRFJNX1BST0NfUFJJTlQoIlxuIik7Ci0JZm9yIChwdCA9IERSTShtZW1fc3RhdHMpOyBwdC0+bmFtZTsgcHQrKykgeworCWZvciAocHQgPSBkcm1fbWVtX3N0YXRzOyBwdC0+bmFtZTsgcHQrKykgewogCQlEUk1fUFJPQ19QUklOVCgiJS05LjlzICU1ZCAlNWQgJTRkICUxMGx1ICUxMGx1IHwgJTZkICUxMGxkXG4iLAogCQkJICAgICAgIHB0LT5uYW1lLAogCQkJICAgICAgIHB0LT5zdWNjZWVkX2NvdW50LApAQCAtMTM1LDE3ICsxMzQsMTcgQEAKIAlyZXR1cm4gbGVuIC0gb2Zmc2V0OwogfQogCi1pbnQgRFJNKG1lbV9pbmZvKSAoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKK2ludCBkcm1fbWVtX2luZm8gKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCiAJCSAgIGludCBsZW4sIGludCAqZW9mLCB2b2lkICpkYXRhKSB7CiAJaW50IHJldDsKIAotCXNwaW5fbG9jaygmRFJNKG1lbV9sb2NrKSk7Ci0JcmV0ID0gRFJNKF9tZW1faW5mbykgKGJ1Ziwgc3RhcnQsIG9mZnNldCwgbGVuLCBlb2YsIGRhdGEpOwotCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwlzcGluX2xvY2soJmRybV9tZW1fbG9jayk7CisJcmV0ID0gZHJtX19tZW1faW5mbyAoYnVmLCBzdGFydCwgb2Zmc2V0LCBsZW4sIGVvZiwgZGF0YSk7CisJc3Bpbl91bmxvY2soJmRybV9tZW1fbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCAqRFJNKGFsbG9jKSAoc2l6ZV90IHNpemUsIGludCBhcmVhKSB7Cit2b2lkICpkcm1fYWxsb2MgKHNpemVfdCBzaXplLCBpbnQgYXJlYSkgewogCXZvaWQgKnB0OwogCiAJaWYgKCFzaXplKSB7CkBAIC0xNTQsNDEgKzE1Myw0MSBAQAogCX0KIAogCWlmICghKHB0ID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKSkpIHsKLQkJc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKLQkJKytEUk0obWVtX3N0YXRzKVthcmVhXS5mYWlsX2NvdW50OwotCQlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJCXNwaW5fbG9jaygmZHJtX21lbV9sb2NrKTsKKwkJKytkcm1fbWVtX3N0YXRzW2FyZWFdLmZhaWxfY291bnQ7CisJCXNwaW5fdW5sb2NrKCZkcm1fbWVtX2xvY2spOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0Jc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKLQkrK0RSTShtZW1fc3RhdHMpW2FyZWFdLnN1Y2NlZWRfY291bnQ7Ci0JRFJNKG1lbV9zdGF0cylbYXJlYV0uYnl0ZXNfYWxsb2NhdGVkICs9IHNpemU7Ci0Jc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCXNwaW5fbG9jaygmZHJtX21lbV9sb2NrKTsKKwkrK2RybV9tZW1fc3RhdHNbYXJlYV0uc3VjY2VlZF9jb3VudDsKKwlkcm1fbWVtX3N0YXRzW2FyZWFdLmJ5dGVzX2FsbG9jYXRlZCArPSBzaXplOworCXNwaW5fdW5sb2NrKCZkcm1fbWVtX2xvY2spOwogCXJldHVybiBwdDsKIH0KIAotdm9pZCAqRFJNKGNhbGxvYykgKHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUsIGludCBhcmVhKSB7Cit2b2lkICpkcm1fY2FsbG9jIChzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplLCBpbnQgYXJlYSkgewogCXZvaWQgKmFkZHI7CiAKLQlhZGRyID0gRFJNKGFsbG9jKSAobm1lbWIgKiBzaXplLCBhcmVhKTsKKwlhZGRyID0gZHJtX2FsbG9jIChubWVtYiAqIHNpemUsIGFyZWEpOwogCWlmIChhZGRyICE9IE5VTEwpCiAJCW1lbXNldCgodm9pZCAqKWFkZHIsIDAsIHNpemUgKiBubWVtYik7CiAKIAlyZXR1cm4gYWRkcjsKIH0KIAotdm9pZCAqRFJNKHJlYWxsb2MpICh2b2lkICpvbGRwdCwgc2l6ZV90IG9sZHNpemUsIHNpemVfdCBzaXplLCBpbnQgYXJlYSkgewordm9pZCAqZHJtX3JlYWxsb2MgKHZvaWQgKm9sZHB0LCBzaXplX3Qgb2xkc2l6ZSwgc2l6ZV90IHNpemUsIGludCBhcmVhKSB7CiAJdm9pZCAqcHQ7CiAKLQlpZiAoIShwdCA9IERSTShhbGxvYykgKHNpemUsIGFyZWEpKSkKKwlpZiAoIShwdCA9IGRybV9hbGxvYyAoc2l6ZSwgYXJlYSkpKQogCQlyZXR1cm4gTlVMTDsKIAlpZiAob2xkcHQgJiYgb2xkc2l6ZSkgewogCQltZW1jcHkocHQsIG9sZHB0LCBvbGRzaXplKTsKLQkJRFJNKGZyZWUpIChvbGRwdCwgb2xkc2l6ZSwgYXJlYSk7CisJCWRybV9mcmVlIChvbGRwdCwgb2xkc2l6ZSwgYXJlYSk7CiAJfQogCXJldHVybiBwdDsKIH0KIAotdm9pZCBEUk0oZnJlZSkgKHZvaWQgKnB0LCBzaXplX3Qgc2l6ZSwgaW50IGFyZWEpIHsKK3ZvaWQgZHJtX2ZyZWUgKHZvaWQgKnB0LCBzaXplX3Qgc2l6ZSwgaW50IGFyZWEpIHsKIAlpbnQgYWxsb2NfY291bnQ7CiAJaW50IGZyZWVfY291bnQ7CiAKQEAgLTE5Niw0MyArMTk1LDQzIEBACiAJCURSTV9NRU1fRVJST1IoYXJlYSwgIkF0dGVtcHQgdG8gZnJlZSBOVUxMIHBvaW50ZXJcbiIpOwogCWVsc2UKIAkJa2ZyZWUocHQpOwotCXNwaW5fbG9jaygmRFJNKG1lbV9sb2NrKSk7Ci0JRFJNKG1lbV9zdGF0cylbYXJlYV0uYnl0ZXNfZnJlZWQgKz0gc2l6ZTsKLQlmcmVlX2NvdW50ID0gKytEUk0obWVtX3N0YXRzKVthcmVhXS5mcmVlX2NvdW50OwotCWFsbG9jX2NvdW50ID0gRFJNKG1lbV9zdGF0cylbYXJlYV0uc3VjY2VlZF9jb3VudDsKLQlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJc3Bpbl9sb2NrKCZkcm1fbWVtX2xvY2spOworCWRybV9tZW1fc3RhdHNbYXJlYV0uYnl0ZXNfZnJlZWQgKz0gc2l6ZTsKKwlmcmVlX2NvdW50ID0gKytkcm1fbWVtX3N0YXRzW2FyZWFdLmZyZWVfY291bnQ7CisJYWxsb2NfY291bnQgPSBkcm1fbWVtX3N0YXRzW2FyZWFdLnN1Y2NlZWRfY291bnQ7CisJc3Bpbl91bmxvY2soJmRybV9tZW1fbG9jayk7CiAJaWYgKGZyZWVfY291bnQgPiBhbGxvY19jb3VudCkgewogCQlEUk1fTUVNX0VSUk9SKGFyZWEsICJFeGNlc3MgZnJlZXM6ICVkIGZyZWVzLCAlZCBhbGxvY3NcbiIsCiAJCQkgICAgICBmcmVlX2NvdW50LCBhbGxvY19jb3VudCk7CiAJfQogfQogCi11bnNpZ25lZCBsb25nIERSTShhbGxvY19wYWdlcykgKGludCBvcmRlciwgaW50IGFyZWEpIHsKK3Vuc2lnbmVkIGxvbmcgZHJtX2FsbG9jX3BhZ2VzIChpbnQgb3JkZXIsIGludCBhcmVhKSB7CiAJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwogCXVuc2lnbmVkIGxvbmcgYnl0ZXMgPSBQQUdFX1NJWkUgPDwgb3JkZXI7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCXVuc2lnbmVkIGludCBzejsKIAotCXNwaW5fbG9jaygmRFJNKG1lbV9sb2NrKSk7Ci0JaWYgKChEUk0ocmFtX3VzZWQpID4+IFBBR0VfU0hJRlQpCi0JICAgID4gKERSTV9SQU1fUEVSQ0VOVCAqIERSTShyYW1fYXZhaWxhYmxlKSkgLyAxMDApIHsKLQkJc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCXNwaW5fbG9jaygmZHJtX21lbV9sb2NrKTsKKwlpZiAoKGRybV9yYW1fdXNlZCA+PiBQQUdFX1NISUZUKQorCSAgICA+IChEUk1fUkFNX1BFUkNFTlQgKiBkcm1fcmFtX2F2YWlsYWJsZSkgLyAxMDApIHsKKwkJc3Bpbl91bmxvY2soJmRybV9tZW1fbG9jayk7CiAJCXJldHVybiAwOwogCX0KLQlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJc3Bpbl91bmxvY2soJmRybV9tZW1fbG9jayk7CiAKIAlhZGRyZXNzID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMfF9fR0ZQX0NPTVAsIG9yZGVyKTsKIAlpZiAoIWFkZHJlc3MpIHsKLQkJc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKLQkJKytEUk0obWVtX3N0YXRzKVthcmVhXS5mYWlsX2NvdW50OwotCQlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJCXNwaW5fbG9jaygmZHJtX21lbV9sb2NrKTsKKwkJKytkcm1fbWVtX3N0YXRzW2FyZWFdLmZhaWxfY291bnQ7CisJCXNwaW5fdW5sb2NrKCZkcm1fbWVtX2xvY2spOwogCQlyZXR1cm4gMDsKIAl9Ci0Jc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKLQkrK0RSTShtZW1fc3RhdHMpW2FyZWFdLnN1Y2NlZWRfY291bnQ7Ci0JRFJNKG1lbV9zdGF0cylbYXJlYV0uYnl0ZXNfYWxsb2NhdGVkICs9IGJ5dGVzOwotCURSTShyYW1fdXNlZCkgKz0gYnl0ZXM7Ci0Jc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCXNwaW5fbG9jaygmZHJtX21lbV9sb2NrKTsKKwkrK2RybV9tZW1fc3RhdHNbYXJlYV0uc3VjY2VlZF9jb3VudDsKKwlkcm1fbWVtX3N0YXRzW2FyZWFdLmJ5dGVzX2FsbG9jYXRlZCArPSBieXRlczsKKwlkcm1fcmFtX3VzZWQgKz0gYnl0ZXM7CisJc3Bpbl91bmxvY2soJmRybV9tZW1fbG9jayk7CiAKIAkvKiBaZXJvIG91dHNpZGUgdGhlIGxvY2sgKi8KIAltZW1zZXQoKHZvaWQgKilhZGRyZXNzLCAwLCBieXRlcyk7CkBAIC0yNDYsNyArMjQ1LDcgQEAKIAlyZXR1cm4gYWRkcmVzczsKIH0KIAotdm9pZCBEUk0oZnJlZV9wYWdlcykgKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50IG9yZGVyLCBpbnQgYXJlYSkgewordm9pZCBkcm1fZnJlZV9wYWdlcyAodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgb3JkZXIsIGludCBhcmVhKSB7CiAJdW5zaWduZWQgbG9uZyBieXRlcyA9IFBBR0VfU0laRSA8PCBvcmRlcjsKIAlpbnQgYWxsb2NfY291bnQ7CiAJaW50IGZyZWVfY291bnQ7CkBAIC0yNjQsMTIgKzI2MywxMiBAQAogCQlmcmVlX3BhZ2VzKGFkZHJlc3MsIG9yZGVyKTsKIAl9CiAKLQlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOwotCWZyZWVfY291bnQgPSArK0RSTShtZW1fc3RhdHMpW2FyZWFdLmZyZWVfY291bnQ7Ci0JYWxsb2NfY291bnQgPSBEUk0obWVtX3N0YXRzKVthcmVhXS5zdWNjZWVkX2NvdW50OwotCURSTShtZW1fc3RhdHMpW2FyZWFdLmJ5dGVzX2ZyZWVkICs9IGJ5dGVzOwotCURSTShyYW1fdXNlZCkgLT0gYnl0ZXM7Ci0Jc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCXNwaW5fbG9jaygmZHJtX21lbV9sb2NrKTsKKwlmcmVlX2NvdW50ID0gKytkcm1fbWVtX3N0YXRzW2FyZWFdLmZyZWVfY291bnQ7CisJYWxsb2NfY291bnQgPSBkcm1fbWVtX3N0YXRzW2FyZWFdLnN1Y2NlZWRfY291bnQ7CisJZHJtX21lbV9zdGF0c1thcmVhXS5ieXRlc19mcmVlZCArPSBieXRlczsKKwlkcm1fcmFtX3VzZWQgLT0gYnl0ZXM7CisJc3Bpbl91bmxvY2soJmRybV9tZW1fbG9jayk7CiAJaWYgKGZyZWVfY291bnQgPiBhbGxvY19jb3VudCkgewogCQlEUk1fTUVNX0VSUk9SKGFyZWEsCiAJCQkgICAgICAiRXhjZXNzIGZyZWVzOiAlZCBmcmVlcywgJWQgYWxsb2NzXG4iLApAQCAtMjc3LDcgKzI3Niw3IEBACiAJfQogfQogCi12b2lkICpEUk0oaW9yZW1hcCkgKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsCit2b2lkICpkcm1faW9yZW1hcCAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJICAgIGRybV9kZXZpY2VfdCAqIGRldikgewogCXZvaWQgKnB0OwogCkBAIC0yODgsMTkgKzI4NywxOSBAQAogCX0KIAogCWlmICghKHB0ID0gZHJtX2lvcmVtYXAob2Zmc2V0LCBzaXplLCBkZXYpKSkgewotCQlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOwotCQkrK0RSTShtZW1fc3RhdHMpW0RSTV9NRU1fTUFQUElOR1NdLmZhaWxfY291bnQ7Ci0JCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwkJc3Bpbl9sb2NrKCZkcm1fbWVtX2xvY2spOworCQkrK2RybV9tZW1fc3RhdHNbRFJNX01FTV9NQVBQSU5HU10uZmFpbF9jb3VudDsKKwkJc3Bpbl91bmxvY2soJmRybV9tZW1fbG9jayk7CiAJCXJldHVybiBOVUxMOwogCX0KLQlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOwotCSsrRFJNKG1lbV9zdGF0cylbRFJNX01FTV9NQVBQSU5HU10uc3VjY2VlZF9jb3VudDsKLQlEUk0obWVtX3N0YXRzKVtEUk1fTUVNX01BUFBJTkdTXS5ieXRlc19hbGxvY2F0ZWQgKz0gc2l6ZTsKLQlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJc3Bpbl9sb2NrKCZkcm1fbWVtX2xvY2spOworCSsrZHJtX21lbV9zdGF0c1tEUk1fTUVNX01BUFBJTkdTXS5zdWNjZWVkX2NvdW50OworCWRybV9tZW1fc3RhdHNbRFJNX01FTV9NQVBQSU5HU10uYnl0ZXNfYWxsb2NhdGVkICs9IHNpemU7CisJc3Bpbl91bmxvY2soJmRybV9tZW1fbG9jayk7CiAJcmV0dXJuIHB0OwogfQogCi12b2lkICpEUk0oaW9yZW1hcF9ub2NhY2hlKSAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKK3ZvaWQgKmRybV9pb3JlbWFwX25vY2FjaGUgKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkgICAgZHJtX2RldmljZV90ICogZGV2KSB7CiAJdm9pZCAqcHQ7CiAKQEAgLTMxMSwxOSArMzEwLDE5IEBACiAJfQogCiAJaWYgKCEocHQgPSBkcm1faW9yZW1hcF9ub2NhY2hlKG9mZnNldCwgc2l6ZSwgZGV2KSkpIHsKLQkJc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKLQkJKytEUk0obWVtX3N0YXRzKVtEUk1fTUVNX01BUFBJTkdTXS5mYWlsX2NvdW50OwotCQlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJCXNwaW5fbG9jaygmZHJtX21lbV9sb2NrKTsKKwkJKytkcm1fbWVtX3N0YXRzW0RSTV9NRU1fTUFQUElOR1NdLmZhaWxfY291bnQ7CisJCXNwaW5fdW5sb2NrKCZkcm1fbWVtX2xvY2spOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0Jc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKLQkrK0RSTShtZW1fc3RhdHMpW0RSTV9NRU1fTUFQUElOR1NdLnN1Y2NlZWRfY291bnQ7Ci0JRFJNKG1lbV9zdGF0cylbRFJNX01FTV9NQVBQSU5HU10uYnl0ZXNfYWxsb2NhdGVkICs9IHNpemU7Ci0Jc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCXNwaW5fbG9jaygmZHJtX21lbV9sb2NrKTsKKwkrK2RybV9tZW1fc3RhdHNbRFJNX01FTV9NQVBQSU5HU10uc3VjY2VlZF9jb3VudDsKKwlkcm1fbWVtX3N0YXRzW0RSTV9NRU1fTUFQUElOR1NdLmJ5dGVzX2FsbG9jYXRlZCArPSBzaXplOworCXNwaW5fdW5sb2NrKCZkcm1fbWVtX2xvY2spOwogCXJldHVybiBwdDsKIH0KIAotdm9pZCBEUk0oaW9yZW1hcGZyZWUpICh2b2lkICpwdCwgdW5zaWduZWQgbG9uZyBzaXplLCBkcm1fZGV2aWNlX3QgKiBkZXYpIHsKK3ZvaWQgZHJtX2lvcmVtYXBmcmVlICh2b2lkICpwdCwgdW5zaWduZWQgbG9uZyBzaXplLCBkcm1fZGV2aWNlX3QgKiBkZXYpIHsKIAlpbnQgYWxsb2NfY291bnQ7CiAJaW50IGZyZWVfY291bnQ7CiAKQEAgLTMzMywxMSArMzMyLDExIEBACiAJZWxzZQogCQlkcm1faW9yZW1hcGZyZWUocHQsIHNpemUsIGRldik7CiAKLQlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOwotCURSTShtZW1fc3RhdHMpW0RSTV9NRU1fTUFQUElOR1NdLmJ5dGVzX2ZyZWVkICs9IHNpemU7Ci0JZnJlZV9jb3VudCA9ICsrRFJNKG1lbV9zdGF0cylbRFJNX01FTV9NQVBQSU5HU10uZnJlZV9jb3VudDsKLQlhbGxvY19jb3VudCA9IERSTShtZW1fc3RhdHMpW0RSTV9NRU1fTUFQUElOR1NdLnN1Y2NlZWRfY291bnQ7Ci0Jc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCXNwaW5fbG9jaygmZHJtX21lbV9sb2NrKTsKKwlkcm1fbWVtX3N0YXRzW0RSTV9NRU1fTUFQUElOR1NdLmJ5dGVzX2ZyZWVkICs9IHNpemU7CisJZnJlZV9jb3VudCA9ICsrZHJtX21lbV9zdGF0c1tEUk1fTUVNX01BUFBJTkdTXS5mcmVlX2NvdW50OworCWFsbG9jX2NvdW50ID0gZHJtX21lbV9zdGF0c1tEUk1fTUVNX01BUFBJTkdTXS5zdWNjZWVkX2NvdW50OworCXNwaW5fdW5sb2NrKCZkcm1fbWVtX2xvY2spOwogCWlmIChmcmVlX2NvdW50ID4gYWxsb2NfY291bnQpIHsKIAkJRFJNX01FTV9FUlJPUihEUk1fTUVNX01BUFBJTkdTLAogCQkJICAgICAgIkV4Y2VzcyBmcmVlczogJWQgZnJlZXMsICVkIGFsbG9jc1xuIiwKQEAgLTM0Nyw3ICszNDYsNyBAQAogCiAjaWYgX19PU19IQVNfQUdQCiAKLURSTV9BR1BfTUVNICpEUk0oYWxsb2NfYWdwKSAoaW50IHBhZ2VzLCB1MzIgdHlwZSkgeworRFJNX0FHUF9NRU0gKmRybV9hbGxvY19hZ3AgKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgcGFnZXMsIHUzMiB0eXBlKSB7CiAJRFJNX0FHUF9NRU0gKmhhbmRsZTsKIAogCWlmICghcGFnZXMpIHsKQEAgLTM1NSwyMSArMzU0LDIxIEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCWlmICgoaGFuZGxlID0gRFJNKGFncF9hbGxvY2F0ZV9tZW1vcnkpIChwYWdlcywgdHlwZSkpKSB7Ci0JCXNwaW5fbG9jaygmRFJNKG1lbV9sb2NrKSk7Ci0JCSsrRFJNKG1lbV9zdGF0cylbRFJNX01FTV9UT1RBTEFHUF0uc3VjY2VlZF9jb3VudDsKLQkJRFJNKG1lbV9zdGF0cylbRFJNX01FTV9UT1RBTEFHUF0uYnl0ZXNfYWxsb2NhdGVkCisJaWYgKChoYW5kbGUgPSBkcm1fYWdwX2FsbG9jYXRlX21lbW9yeSAocGFnZXMsIHR5cGUpKSkgeworCQlzcGluX2xvY2soJmRybV9tZW1fbG9jayk7CisJCSsrZHJtX21lbV9zdGF0c1tEUk1fTUVNX1RPVEFMQUdQXS5zdWNjZWVkX2NvdW50OworCQlkcm1fbWVtX3N0YXRzW0RSTV9NRU1fVE9UQUxBR1BdLmJ5dGVzX2FsbG9jYXRlZAogCQkgICAgKz0gcGFnZXMgPDwgUEFHRV9TSElGVDsKLQkJc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCQlzcGluX3VubG9jaygmZHJtX21lbV9sb2NrKTsKIAkJcmV0dXJuIGhhbmRsZTsKIAl9Ci0Jc3Bpbl9sb2NrKCZEUk0obWVtX2xvY2spKTsKLQkrK0RSTShtZW1fc3RhdHMpW0RSTV9NRU1fVE9UQUxBR1BdLmZhaWxfY291bnQ7Ci0Jc3Bpbl91bmxvY2soJkRSTShtZW1fbG9jaykpOworCXNwaW5fbG9jaygmZHJtX21lbV9sb2NrKTsKKwkrK2RybV9tZW1fc3RhdHNbRFJNX01FTV9UT1RBTEFHUF0uZmFpbF9jb3VudDsKKwlzcGluX3VubG9jaygmZHJtX21lbV9sb2NrKTsKIAlyZXR1cm4gTlVMTDsKIH0KIAotaW50IERSTShmcmVlX2FncCkgKERSTV9BR1BfTUVNICogaGFuZGxlLCBpbnQgcGFnZXMpIHsKK2ludCBkcm1fZnJlZV9hZ3AgKERSTV9BR1BfTUVNICogaGFuZGxlLCBpbnQgcGFnZXMpIHsKIAlpbnQgYWxsb2NfY291bnQ7CiAJaW50IGZyZWVfY291bnQ7CiAJaW50IHJldHZhbCA9IC1FSU5WQUw7CkBAIC0zODAsMTMgKzM3OSwxMyBAQAogCQlyZXR1cm4gcmV0dmFsOwogCX0KIAotCWlmIChEUk0oYWdwX2ZyZWVfbWVtb3J5KSAoaGFuZGxlKSkgewotCQlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOwotCQlmcmVlX2NvdW50ID0gKytEUk0obWVtX3N0YXRzKVtEUk1fTUVNX1RPVEFMQUdQXS5mcmVlX2NvdW50OwotCQlhbGxvY19jb3VudCA9IERSTShtZW1fc3RhdHMpW0RSTV9NRU1fVE9UQUxBR1BdLnN1Y2NlZWRfY291bnQ7Ci0JCURSTShtZW1fc3RhdHMpW0RSTV9NRU1fVE9UQUxBR1BdLmJ5dGVzX2ZyZWVkCisJaWYgKGRybV9hZ3BfZnJlZV9tZW1vcnkgKGhhbmRsZSkpIHsKKwkJc3Bpbl9sb2NrKCZkcm1fbWVtX2xvY2spOworCQlmcmVlX2NvdW50ID0gKytkcm1fbWVtX3N0YXRzW0RSTV9NRU1fVE9UQUxBR1BdLmZyZWVfY291bnQ7CisJCWFsbG9jX2NvdW50ID0gZHJtX21lbV9zdGF0c1tEUk1fTUVNX1RPVEFMQUdQXS5zdWNjZWVkX2NvdW50OworCQlkcm1fbWVtX3N0YXRzW0RSTV9NRU1fVE9UQUxBR1BdLmJ5dGVzX2ZyZWVkCiAJCSAgICArPSBwYWdlcyA8PCBQQUdFX1NISUZUOwotCQlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJCXNwaW5fdW5sb2NrKCZkcm1fbWVtX2xvY2spOwogCQlpZiAoZnJlZV9jb3VudCA+IGFsbG9jX2NvdW50KSB7CiAJCQlEUk1fTUVNX0VSUk9SKERSTV9NRU1fVE9UQUxBR1AsCiAJCQkJICAgICAgIkV4Y2VzcyBmcmVlczogJWQgZnJlZXMsICVkIGFsbG9jc1xuIiwKQEAgLTM5Nyw3ICszOTYsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLWludCBEUk0oYmluZF9hZ3ApIChEUk1fQUdQX01FTSAqIGhhbmRsZSwgdW5zaWduZWQgaW50IHN0YXJ0KSB7CitpbnQgZHJtX2JpbmRfYWdwIChEUk1fQUdQX01FTSAqIGhhbmRsZSwgdW5zaWduZWQgaW50IHN0YXJ0KSB7CiAJaW50IHJldGNvZGUgPSAtRUlOVkFMOwogCiAJaWYgKCFoYW5kbGUpIHsKQEAgLTQwNiwyMSArNDA1LDIxIEBACiAJCXJldHVybiByZXRjb2RlOwogCX0KIAotCWlmICghKHJldGNvZGUgPSBEUk0oYWdwX2JpbmRfbWVtb3J5KSAoaGFuZGxlLCBzdGFydCkpKSB7Ci0JCXNwaW5fbG9jaygmRFJNKG1lbV9sb2NrKSk7Ci0JCSsrRFJNKG1lbV9zdGF0cylbRFJNX01FTV9CT1VOREFHUF0uc3VjY2VlZF9jb3VudDsKLQkJRFJNKG1lbV9zdGF0cylbRFJNX01FTV9CT1VOREFHUF0uYnl0ZXNfYWxsb2NhdGVkCisJaWYgKCEocmV0Y29kZSA9IGRybV9hZ3BfYmluZF9tZW1vcnkgKGhhbmRsZSwgc3RhcnQpKSkgeworCQlzcGluX2xvY2soJmRybV9tZW1fbG9jayk7CisJCSsrZHJtX21lbV9zdGF0c1tEUk1fTUVNX0JPVU5EQUdQXS5zdWNjZWVkX2NvdW50OworCQlkcm1fbWVtX3N0YXRzW0RSTV9NRU1fQk9VTkRBR1BdLmJ5dGVzX2FsbG9jYXRlZAogCQkgICAgKz0gaGFuZGxlLT5wYWdlX2NvdW50IDw8IFBBR0VfU0hJRlQ7Ci0JCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwkJc3Bpbl91bmxvY2soJmRybV9tZW1fbG9jayk7CiAJCXJldHVybiByZXRjb2RlOwogCX0KLQlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOwotCSsrRFJNKG1lbV9zdGF0cylbRFJNX01FTV9CT1VOREFHUF0uZmFpbF9jb3VudDsKLQlzcGluX3VubG9jaygmRFJNKG1lbV9sb2NrKSk7CisJc3Bpbl9sb2NrKCZkcm1fbWVtX2xvY2spOworCSsrZHJtX21lbV9zdGF0c1tEUk1fTUVNX0JPVU5EQUdQXS5mYWlsX2NvdW50OworCXNwaW5fdW5sb2NrKCZkcm1fbWVtX2xvY2spOwogCXJldHVybiByZXRjb2RlOwogfQogCi1pbnQgRFJNKHVuYmluZF9hZ3ApIChEUk1fQUdQX01FTSAqIGhhbmRsZSkgeworaW50IGRybV91bmJpbmRfYWdwIChEUk1fQUdQX01FTSAqIGhhbmRsZSkgewogCWludCBhbGxvY19jb3VudDsKIAlpbnQgZnJlZV9jb3VudDsKIAlpbnQgcmV0Y29kZSA9IC1FSU5WQUw7CkBAIC00MzEsMTQgKzQzMCwxNCBAQAogCQlyZXR1cm4gcmV0Y29kZTsKIAl9CiAKLQlpZiAoKHJldGNvZGUgPSBEUk0oYWdwX3VuYmluZF9tZW1vcnkpIChoYW5kbGUpKSkKKwlpZiAoKHJldGNvZGUgPSBkcm1fYWdwX3VuYmluZF9tZW1vcnkgKGhhbmRsZSkpKQogCQlyZXR1cm4gcmV0Y29kZTsKLQlzcGluX2xvY2soJkRSTShtZW1fbG9jaykpOwotCWZyZWVfY291bnQgPSArK0RSTShtZW1fc3RhdHMpW0RSTV9NRU1fQk9VTkRBR1BdLmZyZWVfY291bnQ7Ci0JYWxsb2NfY291bnQgPSBEUk0obWVtX3N0YXRzKVtEUk1fTUVNX0JPVU5EQUdQXS5zdWNjZWVkX2NvdW50OwotCURSTShtZW1fc3RhdHMpW0RSTV9NRU1fQk9VTkRBR1BdLmJ5dGVzX2ZyZWVkCisJc3Bpbl9sb2NrKCZkcm1fbWVtX2xvY2spOworCWZyZWVfY291bnQgPSArK2RybV9tZW1fc3RhdHNbRFJNX01FTV9CT1VOREFHUF0uZnJlZV9jb3VudDsKKwlhbGxvY19jb3VudCA9IGRybV9tZW1fc3RhdHNbRFJNX01FTV9CT1VOREFHUF0uc3VjY2VlZF9jb3VudDsKKwlkcm1fbWVtX3N0YXRzW0RSTV9NRU1fQk9VTkRBR1BdLmJ5dGVzX2ZyZWVkCiAJICAgICs9IGhhbmRsZS0+cGFnZV9jb3VudCA8PCBQQUdFX1NISUZUOwotCXNwaW5fdW5sb2NrKCZEUk0obWVtX2xvY2spKTsKKwlzcGluX3VubG9jaygmZHJtX21lbV9sb2NrKTsKIAlpZiAoZnJlZV9jb3VudCA+IGFsbG9jX2NvdW50KSB7CiAJCURSTV9NRU1fRVJST1IoRFJNX01FTV9CT1VOREFHUCwKIAkJCSAgICAgICJFeGNlc3MgZnJlZXM6ICVkIGZyZWVzLCAlZCBhbGxvY3NcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9vc19saW51eC5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fb3NfbGludXguaAppbmRleCBkNTFhZWI0Li42OTUxMTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9vc19saW51eC5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX29zX2xpbnV4LmgKQEAgLTEzLDYgKzEzLDcgQEAKICNkZWZpbmUgRFJNX0VSUihkKQkJCS0oZCkKIC8qKiBDdXJyZW50IHByb2Nlc3MgSUQgKi8KICNkZWZpbmUgRFJNX0NVUlJFTlRQSUQJCQljdXJyZW50LT5waWQKKyNkZWZpbmUgRFJNX1NVU0VSKHApCQkJY2FwYWJsZShDQVBfU1lTX0FETUlOKQogI2RlZmluZSBEUk1fVURFTEFZKGQpCQkJdWRlbGF5KGQpCiAvKiogUmVhZCBhIGJ5dGUgZnJvbSBhIE1NSU8gcmVnaW9uICovCiAjZGVmaW5lIERSTV9SRUFEOChtYXAsIG9mZnNldCkJCXJlYWRiKCgodm9pZCBfX2lvbWVtICopKG1hcCktPmhhbmRsZSkgKyAob2Zmc2V0KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3BjaWlkcy5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpaWRzLmgKaW5kZXggZDY2ZGM1NS4uNWIxZDNhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpaWRzLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpaWRzLmgKQEAgLTQ2LDYgKzQ2LDcgQEAKIAl7MHgxMDAyLCAweDRFNTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYzNTB8Q0hJUF9JU19NT0JJTElUWX0sIFwKIAl7MHgxMDAyLCAweDRFNTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYzNTB8Q0hJUF9JU19NT0JJTElUWX0sIFwKIAl7MHgxMDAyLCAweDRFNTQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYzNTB8Q0hJUF9JU19NT0JJTElUWX0sIFwKKwl7MHgxMDAyLCAweDRFNTYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYzNTB8Q0hJUF9JU19NT0JJTElUWX0sIFwKIAl7MHgxMDAyLCAweDUxNDQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjEwMHxDSElQX1NJTkdMRV9DUlRDfSwgXAogCXsweDEwMDIsIDB4NTE0NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMTAwfENISVBfU0lOR0xFX0NSVEN9LCBcCiAJezB4MTAwMiwgMHg1MTQ2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IxMDB8Q0hJUF9TSU5HTEVfQ1JUQ30sIFwKQEAgLTY5LDYgKzcwLDcgQEAKIAl7MHgxMDAyLCAweDUxNkIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjIwMH0sIFwKIAl7MHgxMDAyLCAweDUxNkMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjIwMH0sIFwKIAl7MHgxMDAyLCAweDU0NjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYzNTB9LCBcCisJezB4MTAwMiwgMHg1NTRGLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1IzNTB9LCBcCiAJezB4MTAwMiwgMHg1ODM0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTMzAwfENISVBfSVNfSUdQfSwgXAogCXsweDEwMDIsIDB4NTgzNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SUzMwMHxDSElQX0lTX0lHUHxDSElQX0lTX01PQklMSVRZfSwgXAogCXsweDEwMDIsIDB4NTgzNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SUzMwMHxDSElQX0lTX0lHUH0sIFwKQEAgLTgyLDEwICs4NCwxMyBAQAogCXsweDEwMDIsIDB4NTk2OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjEwMH0sIFwKIAl7MHgxMDAyLCAweDU5NkEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYyODB9LCBcCiAJezB4MTAwMiwgMHg1OTZCLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMjgwfSwgXAorCXsweDEwMDIsIDB4NWI2MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjM1MH0sIFwKIAl7MHgxMDAyLCAweDVjNjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYyODB8Q0hJUF9JU19NT0JJTElUWX0sIFwKIAl7MHgxMDAyLCAweDVjNjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlYyODB9LCBcCiAJezB4MTAwMiwgMHg1YzYzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMjgwfENISVBfSVNfTU9CSUxJVFl9LCBcCiAJezB4MTAwMiwgMHg1YzY0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWMjgwfSwgXAorCXsweDEwMDIsIDB4NWQ0ZCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SMzUwfSwgXAorCXsweDEwMDIsIDB4NWU0YiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SNDIwfSwgXAogCXswLCAwLCAwfQogCiAjZGVmaW5lIHIxMjhfUENJX0lEUyBcCkBAIC0xNzYsNyArMTgxLDcgQEAKIAogI2RlZmluZSB2aWFkcnZfUENJX0lEUyBcCiAJezB4MTEwNiwgMHgzMDIyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAotCXsweDExMDYsIDB4MzExOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMTA2LCAweDMxMTgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFZJQV9QUk9fR1JPVVBfQX0sIFwKIAl7MHgxMTA2LCAweDMxMjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCiAJezB4MTEwNiwgMHg3MjA1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAogCXsweDExMDYsIDB4MzEwOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKQEAgLTE5Niw2ICsyMDEsMTAgQEAKIAl7MHg4MDg2LCAweDI1NzIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCiAJezAsIDAsIDB9CiAKKyNkZWZpbmUgZ2FtbWFfUENJX0lEUyBcCisJezB4M2QzZCwgMHgwMDA4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXswLCAwLCAwfQorCiAjZGVmaW5lIHNhdmFnZV9QQ0lfSURTIFwKIAl7MHg1MzMzLCAweDhhMjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFMzX1NBVkFHRTNEfSwgXAogCXsweDUzMzMsIDB4OGEyMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUzNfU0FWQUdFM0R9LCBcCkBAIC0yMzQsMyArMjQzLDQgQEAKIAl7MHg4MDg2LCAweDI1OTIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCiAJezB4ODA4NiwgMHgyNzcyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAogCXswLCAwLCAwfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9wcm9jLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9wcm9jLmMKaW5kZXggM2Y0NTJmNy4uNmY5NDNlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcHJvYy5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3Byb2MuYwpAQCAtNjEsMTYgKzYxLDE0IEBACiAJY29uc3QgY2hhciAqbmFtZTsJLyoqPCBmaWxlIG5hbWUgKi8KIAlpbnQgKCpmKSAoY2hhciAqLCBjaGFyICoqLCBvZmZfdCwgaW50LCBpbnQgKiwgdm9pZCAqKTsJCS8qKjwgcHJvYyBjYWxsYmFjayovCiB9IGRybV9wcm9jX2xpc3RbXSA9IHsKLQl7Ci0JIm5hbWUiLCBkcm1fbmFtZV9pbmZvfSwgewotCSJtZW0iLCBkcm1fbWVtX2luZm99LCB7Ci0JInZtIiwgZHJtX3ZtX2luZm99LCB7Ci0JImNsaWVudHMiLCBkcm1fY2xpZW50c19pbmZvfSwgewotCSJxdWV1ZXMiLCBkcm1fcXVldWVzX2luZm99LCB7Ci0JImJ1ZnMiLCBkcm1fYnVmc19pbmZvfSwKKwl7Im5hbWUiLCBkcm1fbmFtZV9pbmZvfSwKKwl7Im1lbSIsIGRybV9tZW1faW5mb30sCisJeyJ2bSIsIGRybV92bV9pbmZvfSwKKwl7ImNsaWVudHMiLCBkcm1fY2xpZW50c19pbmZvfSwKKwl7InF1ZXVlcyIsIGRybV9xdWV1ZXNfaW5mb30sCisJeyJidWZzIiwgZHJtX2J1ZnNfaW5mb30sCiAjaWYgRFJNX0RFQlVHX0NPREUKLQl7Ci0JInZtYSIsIGRybV92bWFfaW5mb30sCisJeyJ2bWEiLCBkcm1fdm1hX2luZm99LAogI2VuZGlmCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zdHViLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zdHViLmMKaW5kZXggNjBiNmY4ZS4uNDJkNzY2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc3R1Yi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N0dWIuYwpAQCAtOTMsOCArOTMsOCBAQAogCiAJZGV2LT5kcml2ZXIgPSBkcml2ZXI7CiAKLQlpZiAoZGV2LT5kcml2ZXItPnByZWluaXQpCi0JCWlmICgocmV0Y29kZSA9IGRldi0+ZHJpdmVyLT5wcmVpbml0KGRldiwgZW50LT5kcml2ZXJfZGF0YSkpKQorCWlmIChkZXYtPmRyaXZlci0+bG9hZCkKKwkJaWYgKChyZXRjb2RlID0gZGV2LT5kcml2ZXItPmxvYWQoZGV2LCBlbnQtPmRyaXZlcl9kYXRhKSkpCiAJCQlnb3RvIGVycm9yX291dF91bnJlZzsKIAogCWlmIChkcm1fY29yZV9oYXNfQUdQKGRldikpIHsKQEAgLTEyNCw0NyArMTI0LDEwIEBACiAJcmV0dXJuIDA7CiAKICAgICAgIGVycm9yX291dF91bnJlZzoKLQlkcm1fdGFrZWRvd24oZGV2KTsKKwlkcm1fbGFzdGNsb3NlKGRldik7CiAJcmV0dXJuIHJldGNvZGU7CiB9CiAKLS8qKgotICogRmlsZSBcYyBvcGVuIG9wZXJhdGlvbi4KLSAqCi0gKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgotICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgotICoKLSAqIFB1dHMgdGhlIGRldi0+Zm9wcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBkZXZpY2UgbWlub3IgbnVtYmVyIGludG8KLSAqIFxwIGZpbHAsIGNhbGwgdGhlIFxjIG9wZW4gbWV0aG9kLCBhbmQgcmVzdG9yZSB0aGUgZmlsZSBvcGVyYXRpb25zLgotICovCi1pbnQgZHJtX3N0dWJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKLXsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IE5VTEw7Ci0JaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKLQlpbnQgZXJyID0gLUVOT0RFVjsKLQlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpvbGRfZm9wczsKLQotCURSTV9ERUJVRygiXG4iKTsKLQotCWlmICghKChtaW5vciA+PSAwKSAmJiAobWlub3IgPCBkcm1fY2FyZHNfbGltaXQpKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAoIWRybV9oZWFkc1ttaW5vcl0pCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKCEoZGV2ID0gZHJtX2hlYWRzW21pbm9yXS0+ZGV2KSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlvbGRfZm9wcyA9IGZpbHAtPmZfb3A7Ci0JZmlscC0+Zl9vcCA9IGZvcHNfZ2V0KCZkZXYtPmRyaXZlci0+Zm9wcyk7Ci0JaWYgKGZpbHAtPmZfb3AtPm9wZW4gJiYgKGVyciA9IGZpbHAtPmZfb3AtPm9wZW4oaW5vZGUsIGZpbHApKSkgewotCQlmb3BzX3B1dChmaWxwLT5mX29wKTsKLQkJZmlscC0+Zl9vcCA9IGZvcHNfZ2V0KG9sZF9mb3BzKTsKLQl9Ci0JZm9wc19wdXQob2xkX2ZvcHMpOwotCi0JcmV0dXJuIGVycjsKLX0KIAogLyoqCiAgKiBHZXQgYSBzZWNvbmRhcnkgbWlub3IgbnVtYmVyLgpAQCAtMjAwLDExICsxNjMsNyBAQAogCQkJCWdvdG8gZXJyX2cxOwogCQkJfQogCi0JCQloZWFkLT5kZXZfY2xhc3MgPSBkcm1fc3lzZnNfZGV2aWNlX2FkZChkcm1fY2xhc3MsCi0JCQkJCQkJICAgICAgIE1LREVWKERSTV9NQUpPUiwKLQkJCQkJCQkJICAgICBtaW5vciksCi0JCQkJCQkJICAgICAgICZkZXYtPnBkZXYtPmRldiwKLQkJCQkJCQkgICAgICAgImNhcmQlZCIsIG1pbm9yKTsKKwkJCWhlYWQtPmRldl9jbGFzcyA9IGRybV9zeXNmc19kZXZpY2VfYWRkKGRybV9jbGFzcywgaGVhZCk7CiAJCQlpZiAoSVNfRVJSKGhlYWQtPmRldl9jbGFzcykpIHsKIAkJCQlwcmludGsoS0VSTl9FUlIKIAkJCQkgICAgICAgIkRSTTogRXJyb3Igc3lzZnNfZGV2aWNlX2FkZC5cbiIpOwpAQCAtMjU4LDExICsyMTcsMTAgQEAKIAl9CiAJaWYgKChyZXQgPSBkcm1fZ2V0X2hlYWQoZGV2LCAmZGV2LT5wcmltYXJ5KSkpCiAJCWdvdG8gZXJyX2cxOwotCi0JLyogcG9zdGluaXQgaXMgYSByZXF1aXJlZCBmdW5jdGlvbiB0byBkaXNwbGF5IHRoZSBzaWdub24gYmFubmVyICovCi0JLyogZHJpdmVycyBhZGQgc2Vjb25kYXJ5IGhlYWRzIGhlcmUgaWYgbmVlZGVkICovCi0JaWYgKChyZXQgPSBkZXYtPmRyaXZlci0+cG9zdGluaXQoZGV2LCBlbnQtPmRyaXZlcl9kYXRhKSkpCi0JCWdvdG8gZXJyX2cxOworCQorCURSTV9JTkZPKCJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBvbiBtaW5vciAlZFxuIiwKKwkJIGRyaXZlci0+bmFtZSwgZHJpdmVyLT5tYWpvciwgZHJpdmVyLT5taW5vciwgZHJpdmVyLT5wYXRjaGxldmVsLAorCQkgZHJpdmVyLT5kYXRlLCBkZXYtPnByaW1hcnkubWlub3IpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTMxOCwxMCArMjc2LDkgQEAKIAlEUk1fREVCVUcoInJlbGVhc2Ugc2Vjb25kYXJ5IG1pbm9yICVkXG4iLCBtaW5vcik7CiAKIAlkcm1fcHJvY19jbGVhbnVwKG1pbm9yLCBkcm1fcHJvY19yb290LCBoZWFkLT5kZXZfcm9vdCk7Ci0JZHJtX3N5c2ZzX2RldmljZV9yZW1vdmUoTUtERVYoRFJNX01BSk9SLCBoZWFkLT5taW5vcikpOworCWRybV9zeXNmc19kZXZpY2VfcmVtb3ZlKGhlYWQtPmRldl9jbGFzcyk7CiAKLQkqaGVhZCA9IChkcm1faGVhZF90KSB7Ci0JLmRldiA9IE5VTEx9OworCSpoZWFkID0gKGRybV9oZWFkX3QpIHsuZGV2ID0gTlVMTH07CiAKIAlkcm1faGVhZHNbbWlub3JdID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc3lzZnMuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N5c2ZzLmMKaW5kZXggNmQzNDQ5Ny4uNjhlNDNkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc3lzZnMuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zeXNmcy5jCkBAIC0xNSw4ICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogCiAjaW5jbHVkZSAiZHJtX2NvcmUuaCIKICNpbmNsdWRlICJkcm1QLmgiCkBAIC0yOCwxNSArMjYsMTEgQEAKICNkZWZpbmUgdG9fZHJtX3N5c2ZzX2NsYXNzKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgZHJtX3N5c2ZzX2NsYXNzLCBjbGFzcykKIAogc3RydWN0IHNpbXBsZV9kZXYgewotCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKIAlkZXZfdCBkZXY7CiAJc3RydWN0IGNsYXNzX2RldmljZSBjbGFzc19kZXY7CiB9OwogI2RlZmluZSB0b19zaW1wbGVfZGV2KGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3Qgc2ltcGxlX2RldiwgY2xhc3NfZGV2KQogCi1zdGF0aWMgTElTVF9IRUFEKHNpbXBsZV9kZXZfbGlzdCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNpbXBsZV9kZXZfbGlzdF9sb2NrKTsKLQogc3RhdGljIHZvaWQgcmVsZWFzZV9zaW1wbGVfZGV2KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldikKIHsKIAlzdHJ1Y3Qgc2ltcGxlX2RldiAqc19kZXYgPSB0b19zaW1wbGVfZGV2KGNsYXNzX2Rldik7CkBAIC0xMjQsNiArMTE4LDE4IEBACiAJY2xhc3NfdW5yZWdpc3RlcigmY3MtPmNsYXNzKTsKIH0KIAorc3RhdGljIHNzaXplX3Qgc2hvd19kcmkoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCit7CisJZHJtX2RldmljZV90ICogZGV2ID0gKChkcm1faGVhZF90ICopY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKSktPmRldjsKKwlpZiAoZGV2LT5kcml2ZXItPmRyaV9saWJyYXJ5X25hbWUpCisJCXJldHVybiBkZXYtPmRyaXZlci0+ZHJpX2xpYnJhcnlfbmFtZShkZXYsIGJ1Zik7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGRldi0+ZHJpdmVyLT5wY2lfZHJpdmVyLm5hbWUpOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgY2xhc3NfZGV2aWNlX2F0dHJzW10gPSB7CisJX19BVFRSKGRyaV9saWJyYXJ5X25hbWUsIFNfSVJVR08sIHNob3dfZHJpLCBOVUxMKSwKK307CisKIC8qKgogICogZHJtX3N5c2ZzX2RldmljZV9hZGQgLSBhZGRzIGEgY2xhc3MgZGV2aWNlIHRvIHN5c2ZzIGZvciBhIGNoYXJhY3RlciBkcml2ZXIKICAqIEBjczogcG9pbnRlciB0byB0aGUgc3RydWN0IGRybV9zeXNmc19jbGFzcyB0aGF0IHRoaXMgZGV2aWNlIHNob3VsZCBiZSByZWdpc3RlcmVkIHRvLgpAQCAtMTM4LDEzICsxNDQsMTEgQEAKICAqIE5vdGU6IHRoZSBzdHJ1Y3QgZHJtX3N5c2ZzX2NsYXNzIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgaGF2ZSBwcmV2aW91c2x5IGJlZW4KICAqIGNyZWF0ZWQgd2l0aCBhIGNhbGwgdG8gZHJtX3N5c2ZzX2NyZWF0ZSgpLgogICovCi1zdHJ1Y3QgY2xhc3NfZGV2aWNlICpkcm1fc3lzZnNfZGV2aWNlX2FkZChzdHJ1Y3QgZHJtX3N5c2ZzX2NsYXNzICpjcywgZGV2X3QgZGV2LAotCQkJCQkgIHN0cnVjdCBkZXZpY2UgKmRldmljZSwKLQkJCQkJICBjb25zdCBjaGFyICpmbXQsIC4uLikKK3N0cnVjdCBjbGFzc19kZXZpY2UgKmRybV9zeXNmc19kZXZpY2VfYWRkKHN0cnVjdCBkcm1fc3lzZnNfY2xhc3MgKmNzLAorCQkJCQkgIGRybV9oZWFkX3QgKmhlYWQpCiB7Ci0JdmFfbGlzdCBhcmdzOwogCXN0cnVjdCBzaW1wbGVfZGV2ICpzX2RldiA9IE5VTEw7Ci0JaW50IHJldHZhbDsKKwlpbnQgaSwgcmV0dmFsOwogCiAJaWYgKChjcyA9PSBOVUxMKSB8fCAoSVNfRVJSKGNzKSkpIHsKIAkJcmV0dmFsID0gLUVOT0RFVjsKQEAgLTE1OCwyNiArMTYyLDIzIEBACiAJfQogCW1lbXNldChzX2RldiwgMHgwMCwgc2l6ZW9mKCpzX2RldikpOwogCi0Jc19kZXYtPmRldiA9IGRldjsKLQlzX2Rldi0+Y2xhc3NfZGV2LmRldiA9IGRldmljZTsKKwlzX2Rldi0+ZGV2ID0gTUtERVYoRFJNX01BSk9SLCBoZWFkLT5taW5vcik7CisJc19kZXYtPmNsYXNzX2Rldi5kZXYgPSAmKGhlYWQtPmRldi0+cGRldiktPmRldjsKIAlzX2Rldi0+Y2xhc3NfZGV2LmNsYXNzID0gJmNzLT5jbGFzczsKIAotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JdnNucHJpbnRmKHNfZGV2LT5jbGFzc19kZXYuY2xhc3NfaWQsIEJVU19JRF9TSVpFLCBmbXQsIGFyZ3MpOwotCXZhX2VuZChhcmdzKTsKKwlzbnByaW50ZihzX2Rldi0+Y2xhc3NfZGV2LmNsYXNzX2lkLCBCVVNfSURfU0laRSwgImNhcmQlZCIsIGhlYWQtPm1pbm9yKTsKIAlyZXR2YWwgPSBjbGFzc19kZXZpY2VfcmVnaXN0ZXIoJnNfZGV2LT5jbGFzc19kZXYpOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gZXJyb3I7CiAKIAljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoJnNfZGV2LT5jbGFzc19kZXYsICZjcy0+YXR0cik7CisJY2xhc3Nfc2V0X2RldmRhdGEoJnNfZGV2LT5jbGFzc19kZXYsIGhlYWQpOwogCi0Jc3Bpbl9sb2NrKCZzaW1wbGVfZGV2X2xpc3RfbG9jayk7Ci0JbGlzdF9hZGQoJnNfZGV2LT5ub2RlLCAmc2ltcGxlX2Rldl9saXN0KTsKLQlzcGluX3VubG9jaygmc2ltcGxlX2Rldl9saXN0X2xvY2spOwotCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2xhc3NfZGV2aWNlX2F0dHJzKTsgaSsrKQorCQljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoJnNfZGV2LT5jbGFzc19kZXYsICZjbGFzc19kZXZpY2VfYXR0cnNbaV0pOwogCXJldHVybiAmc19kZXYtPmNsYXNzX2RldjsKIAotICAgICAgZXJyb3I6CitlcnJvcjoKIAlrZnJlZShzX2Rldik7CiAJcmV0dXJuIEVSUl9QVFIocmV0dmFsKTsKIH0KQEAgLTE4OSwyMyArMTkwLDEyIEBACiAgKiBUaGlzIGNhbGwgdW5yZWdpc3RlcnMgYW5kIGNsZWFucyB1cCBhIGNsYXNzIGRldmljZSB0aGF0IHdhcyBjcmVhdGVkIHdpdGggYQogICogY2FsbCB0byBkcm1fc3lzZnNfZGV2aWNlX2FkZCgpCiAgKi8KLXZvaWQgZHJtX3N5c2ZzX2RldmljZV9yZW1vdmUoZGV2X3QgZGV2KQordm9pZCBkcm1fc3lzZnNfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYpCiB7Ci0Jc3RydWN0IHNpbXBsZV9kZXYgKnNfZGV2ID0gTlVMTDsKLQlpbnQgZm91bmQgPSAwOworCXN0cnVjdCBzaW1wbGVfZGV2ICpzX2RldiA9IHRvX3NpbXBsZV9kZXYoY2xhc3NfZGV2KTsKKwlpbnQgaTsKIAotCXNwaW5fbG9jaygmc2ltcGxlX2Rldl9saXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoc19kZXYsICZzaW1wbGVfZGV2X2xpc3QsIG5vZGUpIHsKLQkJaWYgKHNfZGV2LT5kZXYgPT0gZGV2KSB7Ci0JCQlmb3VuZCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoZm91bmQpIHsKLQkJbGlzdF9kZWwoJnNfZGV2LT5ub2RlKTsKLQkJc3Bpbl91bmxvY2soJnNpbXBsZV9kZXZfbGlzdF9sb2NrKTsKLQkJY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoJnNfZGV2LT5jbGFzc19kZXYpOwotCX0gZWxzZSB7Ci0JCXNwaW5fdW5sb2NrKCZzaW1wbGVfZGV2X2xpc3RfbG9jayk7Ci0JfQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNsYXNzX2RldmljZV9hdHRycyk7IGkrKykKKwkJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKCZzX2Rldi0+Y2xhc3NfZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJzW2ldKTsKKwljbGFzc19kZXZpY2VfdW5yZWdpc3Rlcigmc19kZXYtPmNsYXNzX2Rldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZG1hLmMKaW5kZXggZGJhNTAyMy4uY2MxYjg5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2RtYS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kbWEuYwpAQCAtMTE0LDcgKzExNCw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGk4MTBfYnVmZmVyX2ZvcHMgPSB7CiAJLm9wZW4gPSBkcm1fb3BlbiwKLQkuZmx1c2ggPSBkcm1fZmx1c2gsCiAJLnJlbGVhc2UgPSBkcm1fcmVsZWFzZSwKIAkuaW9jdGwgPSBkcm1faW9jdGwsCiAJLm1tYXAgPSBpODEwX21tYXBfYnVmZmVycywKQEAgLTEzMTksMTIgKzEzMTgsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBpODEwX2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgaTgxMF9kcml2ZXJfbG9hZChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwkvKiBpODEwIGhhcyA0IG1vcmUgY291bnRlcnMgKi8KKwlkZXYtPmNvdW50ZXJzICs9IDQ7CisJZGV2LT50eXBlc1s2XSA9IF9EUk1fU1RBVF9JUlE7CisJZGV2LT50eXBlc1s3XSA9IF9EUk1fU1RBVF9QUklNQVJZOworCWRldi0+dHlwZXNbOF0gPSBfRFJNX1NUQVRfU0VDT05EQVJZOworCWRldi0+dHlwZXNbOV0gPSBfRFJNX1NUQVRfRE1BOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaTgxMF9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldikKIHsKIAlpODEwX2RtYV9jbGVhbnVwKGRldik7CiB9CiAKLXZvaWQgaTgxMF9kcml2ZXJfcHJlcmVsZWFzZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCkKK3ZvaWQgaTgxMF9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApCiB7CiAJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKIAkJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xMzM0LDcgKzEzNDUsNyBAQAogCX0KIH0KIAotdm9pZCBpODEwX2RyaXZlcl9yZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCit2b2lkIGk4MTBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoZHJtX2RldmljZV90ICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlpODEwX3JlY2xhaW1fYnVmZmVycyhkZXYsIGZpbHApOwogfQpAQCAtMTM0NiwyMSArMTM1NywyMSBAQAogfQogCiBkcm1faW9jdGxfZGVzY190IGk4MTBfaW9jdGxzW10gPSB7Ci0JW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9JTklUKV0gPSB7aTgxMF9kbWFfaW5pdCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9WRVJURVgpXSA9IHtpODEwX2RtYV92ZXJ0ZXgsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfQ0xFQVIpXSA9IHtpODEwX2NsZWFyX2J1ZnMsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfRkxVU0gpXSA9IHtpODEwX2ZsdXNoX2lvY3RsLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JODEwX0dFVEFHRSldID0ge2k4MTBfZ2V0YWdlLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JODEwX0dFVEJVRildID0ge2k4MTBfZ2V0YnVmLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JODEwX1NXQVApXSA9IHtpODEwX3N3YXBfYnVmcywgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9DT1BZKV0gPSB7aTgxMF9jb3B5YnVmLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JODEwX0RPQ09QWSldID0ge2k4MTBfZG9jb3B5LCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JODEwX09WMElORk8pXSA9IHtpODEwX292MF9pbmZvLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JODEwX0ZTVEFUVVMpXSA9IHtpODEwX2ZzdGF0dXMsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfT1YwRkxJUCldID0ge2k4MTBfb3YwX2ZsaXAsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfTUMpXSA9IHtpODEwX2RtYV9tYywgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9SU1RBVFVTKV0gPSB7aTgxMF9yc3RhdHVzLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JODEwX0ZMSVApXSA9IHtpODEwX2ZsaXBfYnVmcywgMSwgMH0KKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX0lOSVQpXSA9IHtpODEwX2RtYV9pbml0LCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfVkVSVEVYKV0gPSB7aTgxMF9kbWFfdmVydGV4LCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9DTEVBUildID0ge2k4MTBfY2xlYXJfYnVmcywgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfRkxVU0gpXSA9IHtpODEwX2ZsdXNoX2lvY3RsLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9HRVRBR0UpXSA9IHtpODEwX2dldGFnZSwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfR0VUQlVGKV0gPSB7aTgxMF9nZXRidWYsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX1NXQVApXSA9IHtpODEwX3N3YXBfYnVmcywgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfQ09QWSldID0ge2k4MTBfY29weWJ1ZiwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfRE9DT1BZKV0gPSB7aTgxMF9kb2NvcHksIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX09WMElORk8pXSA9IHtpODEwX292MF9pbmZvLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9GU1RBVFVTKV0gPSB7aTgxMF9mc3RhdHVzLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgxMF9PVjBGTElQKV0gPSB7aTgxMF9vdjBfZmxpcCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MTBfTUMpXSA9IHtpODEwX2RtYV9tYywgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX1JTVEFUVVMpXSA9IHtpODEwX3JzdGF0dXMsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODEwX0ZMSVApXSA9IHtpODEwX2ZsaXBfYnVmcywgRFJNX0FVVEh9CiB9OwogCiBpbnQgaTgxMF9tYXhfaW9jdGwgPSBEUk1fQVJSQVlfU0laRShpODEwX2lvY3Rscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmMKaW5kZXggMDcwY2VmNi4uZGZlNmFkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuYwpAQCAtMzgsMzggKzM4LDYgQEAKIAogI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKIAotc3RhdGljIGludCBwb3N0aW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCS8qIGk4MTAgaGFzIDQgbW9yZSBjb3VudGVycyAqLwotCWRldi0+Y291bnRlcnMgKz0gNDsKLQlkZXYtPnR5cGVzWzZdID0gX0RSTV9TVEFUX0lSUTsKLQlkZXYtPnR5cGVzWzddID0gX0RSTV9TVEFUX1BSSU1BUlk7Ci0JZGV2LT50eXBlc1s4XSA9IF9EUk1fU1RBVF9TRUNPTkRBUlk7Ci0JZGV2LT50eXBlc1s5XSA9IF9EUk1fU1RBVF9ETUE7Ci0KLQlEUk1fSU5GTygiSW5pdGlhbGl6ZWQgJXMgJWQuJWQuJWQgJXMgb24gbWlub3IgJWQ6ICVzXG4iLAotCQkgRFJJVkVSX05BTUUsCi0JCSBEUklWRVJfTUFKT1IsCi0JCSBEUklWRVJfTUlOT1IsCi0JCSBEUklWRVJfUEFUQ0hMRVZFTCwKLQkJIERSSVZFUl9EQVRFLCBkZXYtPnByaW1hcnkubWlub3IsIHBjaV9wcmV0dHlfbmFtZShkZXYtPnBkZXYpCi0JICAgICk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmVyc2lvbihkcm1fdmVyc2lvbl90ICogdmVyc2lvbikKLXsKLQlpbnQgbGVuOwotCi0JdmVyc2lvbi0+dmVyc2lvbl9tYWpvciA9IERSSVZFUl9NQUpPUjsKLQl2ZXJzaW9uLT52ZXJzaW9uX21pbm9yID0gRFJJVkVSX01JTk9SOwotCXZlcnNpb24tPnZlcnNpb25fcGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMOwotCURSTV9DT1BZKHZlcnNpb24tPm5hbWUsIERSSVZFUl9OQU1FKTsKLQlEUk1fQ09QWSh2ZXJzaW9uLT5kYXRlLCBEUklWRVJfREFURSk7Ci0JRFJNX0NPUFkodmVyc2lvbi0+ZGVzYywgRFJJVkVSX0RFU0MpOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpaWRsaXN0W10gPSB7CiAJaTgxMF9QQ0lfSURTCiB9OwpAQCAtNzksMTYgKzQ3LDE0IEBACiAJICAgIERSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1JFUVVJUkVfQUdQIHwgRFJJVkVSX1VTRV9NVFJSIHwKIAkgICAgRFJJVkVSX0hBVkVfRE1BIHwgRFJJVkVSX0RNQV9RVUVVRSwKIAkuZGV2X3ByaXZfc2l6ZSA9IHNpemVvZihkcm1faTgxMF9idWZfcHJpdl90KSwKLQkucHJldGFrZWRvd24gPSBpODEwX2RyaXZlcl9wcmV0YWtlZG93biwKLQkucHJlcmVsZWFzZSA9IGk4MTBfZHJpdmVyX3ByZXJlbGVhc2UsCisJLmxvYWQgPSBpODEwX2RyaXZlcl9sb2FkLAorCS5sYXN0Y2xvc2UgPSBpODEwX2RyaXZlcl9sYXN0Y2xvc2UsCisJLnByZWNsb3NlID0gaTgxMF9kcml2ZXJfcHJlY2xvc2UsCiAJLmRldmljZV9pc19hZ3AgPSBpODEwX2RyaXZlcl9kZXZpY2VfaXNfYWdwLAotCS5yZWxlYXNlID0gaTgxMF9kcml2ZXJfcmVsZWFzZSwKKwkucmVjbGFpbV9idWZmZXJzX2xvY2tlZCA9IGk4MTBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQsCiAJLmRtYV9xdWllc2NlbnQgPSBpODEwX2RyaXZlcl9kbWFfcXVpZXNjZW50LAotCS5yZWNsYWltX2J1ZmZlcnMgPSBpODEwX3JlY2xhaW1fYnVmZmVycywKIAkuZ2V0X21hcF9vZnMgPSBkcm1fY29yZV9nZXRfbWFwX29mcywKIAkuZ2V0X3JlZ19vZnMgPSBkcm1fY29yZV9nZXRfcmVnX29mcywKLQkucG9zdGluaXQgPSBwb3N0aW5pdCwKLQkudmVyc2lvbiA9IHZlcnNpb24sCiAJLmlvY3RscyA9IGk4MTBfaW9jdGxzLAogCS5mb3BzID0gewogCQkgLm93bmVyID0gVEhJU19NT0RVTEUsCkBAIC05OCwxMyArNjQsMTkgQEAKIAkJIC5tbWFwID0gZHJtX21tYXAsCiAJCSAucG9sbCA9IGRybV9wb2xsLAogCQkgLmZhc3luYyA9IGRybV9mYXN5bmMsCi0JCSB9Ci0JLAorCX0sCisKIAkucGNpX2RyaXZlciA9IHsKLQkJICAgICAgIC5uYW1lID0gRFJJVkVSX05BTUUsCi0JCSAgICAgICAuaWRfdGFibGUgPSBwY2lpZGxpc3QsCi0JCSAgICAgICB9Ci0JLAorCQkgLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkJIC5pZF90YWJsZSA9IHBjaWlkbGlzdCwKKwl9LAorCisJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkuZGVzYyA9IERSSVZFUl9ERVNDLAorCS5kYXRlID0gRFJJVkVSX0RBVEUsCisJLm1ham9yID0gRFJJVkVSX01BSk9SLAorCS5taW5vciA9IERSSVZFUl9NSU5PUiwKKwkucGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaTgxMF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmgKaW5kZXggYzc4ZjM2YS4uYTE4YjgwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuaApAQCAtMTE2LDkgKzExNiwxMyBAQAogZXh0ZXJuIHZvaWQgaTgxMF9yZWNsYWltX2J1ZmZlcnMoZHJtX2RldmljZV90ICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CiAKIGV4dGVybiBpbnQgaTgxMF9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcmVsZWFzZShkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKTsKLWV4dGVybiB2b2lkIGk4MTBfZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBpODEwX2RyaXZlcl9wcmVyZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKTsKK2V4dGVybiB2b2lkIGk4MTBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoZHJtX2RldmljZV90ICogZGV2LAorCQkJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbHApOworZXh0ZXJuIGludCBpODEwX2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICosIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCBpODEwX2RyaXZlcl9wcmVjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCk7CitleHRlcm4gdm9pZCBpODEwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKGRybV9kZXZpY2VfdCAqIGRldiwKKwkJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxwKTsKIGV4dGVybiBpbnQgaTgxMF9kcml2ZXJfZGV2aWNlX2lzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYpOwogCiBleHRlcm4gZHJtX2lvY3RsX2Rlc2NfdCBpODEwX2lvY3Rsc1tdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2RtYS5jCmluZGV4IGRjOTRmMTkuLjRmZWEzMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kbWEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZG1hLmMKQEAgLTExNiw3ICsxMTYsNiBAQAogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpODMwX2J1ZmZlcl9mb3BzID0gewogCS5vcGVuID0gZHJtX29wZW4sCi0JLmZsdXNoID0gZHJtX2ZsdXNoLAogCS5yZWxlYXNlID0gZHJtX3JlbGVhc2UsCiAJLmlvY3RsID0gZHJtX2lvY3RsLAogCS5tbWFwID0gaTgzMF9tbWFwX2J1ZmZlcnMsCkBAIC0xNTE3LDEyICsxNTE2LDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgaTgzMF9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICogZGV2KQoraW50IGk4MzBfZHJpdmVyX2xvYWQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJLyogaTgzMCBoYXMgNCBtb3JlIGNvdW50ZXJzICovCisJZGV2LT5jb3VudGVycyArPSA0OworCWRldi0+dHlwZXNbNl0gPSBfRFJNX1NUQVRfSVJROworCWRldi0+dHlwZXNbN10gPSBfRFJNX1NUQVRfUFJJTUFSWTsKKwlkZXYtPnR5cGVzWzhdID0gX0RSTV9TVEFUX1NFQ09OREFSWTsKKwlkZXYtPnR5cGVzWzldID0gX0RSTV9TVEFUX0RNQTsKKworCXJldHVybiAwOworfQorCit2b2lkIGk4MzBfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpCiB7CiAJaTgzMF9kbWFfY2xlYW51cChkZXYpOwogfQogCi12b2lkIGk4MzBfZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApCit2b2lkIGk4MzBfZHJpdmVyX3ByZWNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKQogewogCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CiAJCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTUzMiw3ICsxNTQzLDcgQEAKIAl9CiB9CiAKLXZvaWQgaTgzMF9kcml2ZXJfcmVsZWFzZShkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQordm9pZCBpODMwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKGRybV9kZXZpY2VfdCAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJaTgzMF9yZWNsYWltX2J1ZmZlcnMoZGV2LCBmaWxwKTsKIH0KQEAgLTE1NDQsMjAgKzE1NTUsMjAgQEAKIH0KIAogZHJtX2lvY3RsX2Rlc2NfdCBpODMwX2lvY3Rsc1tdID0gewotCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfSU5JVCldID0ge2k4MzBfZG1hX2luaXQsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfVkVSVEVYKV0gPSB7aTgzMF9kbWFfdmVydGV4LCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0NMRUFSKV0gPSB7aTgzMF9jbGVhcl9idWZzLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0ZMVVNIKV0gPSB7aTgzMF9mbHVzaF9pb2N0bCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9HRVRBR0UpXSA9IHtpODMwX2dldGFnZSwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9HRVRCVUYpXSA9IHtpODMwX2dldGJ1ZiwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9TV0FQKV0gPSB7aTgzMF9zd2FwX2J1ZnMsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfQ09QWSldID0ge2k4MzBfY29weWJ1ZiwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9ET0NPUFkpXSA9IHtpODMwX2RvY29weSwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9GTElQKV0gPSB7aTgzMF9mbGlwX2J1ZnMsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfSVJRX0VNSVQpXSA9IHtpODMwX2lycV9lbWl0LCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0lSUV9XQUlUKV0gPSB7aTgzMF9pcnFfd2FpdCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9HRVRQQVJBTSldID0ge2k4MzBfZ2V0cGFyYW0sIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfU0VUUEFSQU0pXSA9IHtpODMwX3NldHBhcmFtLCAxLCAwfQorCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfSU5JVCldID0ge2k4MzBfZG1hX2luaXQsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9WRVJURVgpXSA9IHtpODMwX2RtYV92ZXJ0ZXgsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0NMRUFSKV0gPSB7aTgzMF9jbGVhcl9idWZzLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9GTFVTSCldID0ge2k4MzBfZmx1c2hfaW9jdGwsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0dFVEFHRSldID0ge2k4MzBfZ2V0YWdlLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9HRVRCVUYpXSA9IHtpODMwX2dldGJ1ZiwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfU1dBUCldID0ge2k4MzBfc3dhcF9idWZzLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9DT1BZKV0gPSB7aTgzMF9jb3B5YnVmLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9ET0NPUFkpXSA9IHtpODMwX2RvY29weSwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfRkxJUCldID0ge2k4MzBfZmxpcF9idWZzLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9JUlFfRU1JVCldID0ge2k4MzBfaXJxX2VtaXQsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JODMwX0lSUV9XQUlUKV0gPSB7aTgzMF9pcnFfd2FpdCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k4MzBfR0VUUEFSQU0pXSA9IHtpODMwX2dldHBhcmFtLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTgzMF9TRVRQQVJBTSldID0ge2k4MzBfc2V0cGFyYW0sIERSTV9BVVRIfQogfTsKIAogaW50IGk4MzBfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUoaTgzMF9pb2N0bHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5jCmluZGV4IGFjZDgyMWU4Li43MjI2NTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5jCkBAIC00MCwzNyArNDAsNiBAQAogCiAjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgogCi1zdGF0aWMgaW50IHBvc3Rpbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JZGV2LT5jb3VudGVycyArPSA0OwotCWRldi0+dHlwZXNbNl0gPSBfRFJNX1NUQVRfSVJROwotCWRldi0+dHlwZXNbN10gPSBfRFJNX1NUQVRfUFJJTUFSWTsKLQlkZXYtPnR5cGVzWzhdID0gX0RSTV9TVEFUX1NFQ09OREFSWTsKLQlkZXYtPnR5cGVzWzldID0gX0RSTV9TVEFUX0RNQTsKLQotCURSTV9JTkZPKCJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBvbiBtaW5vciAlZDogJXNcbiIsCi0JCSBEUklWRVJfTkFNRSwKLQkJIERSSVZFUl9NQUpPUiwKLQkJIERSSVZFUl9NSU5PUiwKLQkJIERSSVZFUl9QQVRDSExFVkVMLAotCQkgRFJJVkVSX0RBVEUsIGRldi0+cHJpbWFyeS5taW5vciwgcGNpX3ByZXR0eV9uYW1lKGRldi0+cGRldikKLQkgICAgKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZXJzaW9uKGRybV92ZXJzaW9uX3QgKiB2ZXJzaW9uKQotewotCWludCBsZW47Ci0KLQl2ZXJzaW9uLT52ZXJzaW9uX21ham9yID0gRFJJVkVSX01BSk9SOwotCXZlcnNpb24tPnZlcnNpb25fbWlub3IgPSBEUklWRVJfTUlOT1I7Ci0JdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUw7Ci0JRFJNX0NPUFkodmVyc2lvbi0+bmFtZSwgRFJJVkVSX05BTUUpOwotCURSTV9DT1BZKHZlcnNpb24tPmRhdGUsIERSSVZFUl9EQVRFKTsKLQlEUk1fQ09QWSh2ZXJzaW9uLT5kZXNjLCBEUklWRVJfREVTQyk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lpZGxpc3RbXSA9IHsKIAlpODMwX1BDSV9JRFMKIH07CkBAIC04MywxMiArNTIsMTIgQEAKIAkuZHJpdmVyX2ZlYXR1cmVzIHw9IERSSVZFUl9IQVZFX0lSUSB8IERSSVZFUl9TSEFSRURfSVJRLAogI2VuZGlmCiAJLmRldl9wcml2X3NpemUgPSBzaXplb2YoZHJtX2k4MzBfYnVmX3ByaXZfdCksCi0JLnByZXRha2Vkb3duID0gaTgzMF9kcml2ZXJfcHJldGFrZWRvd24sCi0JLnByZXJlbGVhc2UgPSBpODMwX2RyaXZlcl9wcmVyZWxlYXNlLAorCS5sb2FkID0gaTgzMF9kcml2ZXJfbG9hZCwKKwkubGFzdGNsb3NlID0gaTgzMF9kcml2ZXJfbGFzdGNsb3NlLAorCS5wcmVjbG9zZSA9IGk4MzBfZHJpdmVyX3ByZWNsb3NlLAogCS5kZXZpY2VfaXNfYWdwID0gaTgzMF9kcml2ZXJfZGV2aWNlX2lzX2FncCwKLQkucmVsZWFzZSA9IGk4MzBfZHJpdmVyX3JlbGVhc2UsCisJLnJlY2xhaW1fYnVmZmVyc19sb2NrZWQgPSBpODMwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkLAogCS5kbWFfcXVpZXNjZW50ID0gaTgzMF9kcml2ZXJfZG1hX3F1aWVzY2VudCwKLQkucmVjbGFpbV9idWZmZXJzID0gaTgzMF9yZWNsYWltX2J1ZmZlcnMsCiAJLmdldF9tYXBfb2ZzID0gZHJtX2NvcmVfZ2V0X21hcF9vZnMsCiAJLmdldF9yZWdfb2ZzID0gZHJtX2NvcmVfZ2V0X3JlZ19vZnMsCiAjaWYgVVNFX0lSUVMKQEAgLTk3LDggKzY2LDYgQEAKIAkuaXJxX3VuaW5zdGFsbCA9IGk4MzBfZHJpdmVyX2lycV91bmluc3RhbGwsCiAJLmlycV9oYW5kbGVyID0gaTgzMF9kcml2ZXJfaXJxX2hhbmRsZXIsCiAjZW5kaWYKLQkucG9zdGluaXQgPSBwb3N0aW5pdCwKLQkudmVyc2lvbiA9IHZlcnNpb24sCiAJLmlvY3RscyA9IGk4MzBfaW9jdGxzLAogCS5mb3BzID0gewogCQkgLm93bmVyID0gVEhJU19NT0RVTEUsCkBAIC0xMDgsMTMgKzc1LDE5IEBACiAJCSAubW1hcCA9IGRybV9tbWFwLAogCQkgLnBvbGwgPSBkcm1fcG9sbCwKIAkJIC5mYXN5bmMgPSBkcm1fZmFzeW5jLAotCQkgfQotCSwKLQkucGNpX2RyaXZlciA9IHsKLQkJICAgICAgIC5uYW1lID0gRFJJVkVSX05BTUUsCi0JCSAgICAgICAuaWRfdGFibGUgPSBwY2lpZGxpc3QsCi0JCSAgICAgICB9CisJfSwKIAorCS5wY2lfZHJpdmVyID0geworCQkgLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkJIC5pZF90YWJsZSA9IHBjaWlkbGlzdCwKKwl9LAorCisJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkuZGVzYyA9IERSSVZFUl9ERVNDLAorCS5kYXRlID0gRFJJVkVSX0RBVEUsCisJLm1ham9yID0gRFJJVkVSX01BSk9SLAorCS5taW5vciA9IERSSVZFUl9NSU5PUiwKKwkucGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaTgzMF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmgKaW5kZXggYmM0YmQ0OS4uYmY5MDc1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuaApAQCAtMTM2LDEwICsxMzYsMTIgQEAKIGV4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7CiBleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKIGV4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGk4MzBfZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBpODMwX2RyaXZlcl9yZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApOworZXh0ZXJuIGludCBpODMwX2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICosIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApOworZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKGRybV9kZXZpY2VfdCAqIGRldiwKKwkJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxwKTsKIGV4dGVybiBpbnQgaTgzMF9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfcHJlcmVsZWFzZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCk7CiBleHRlcm4gaW50IGk4MzBfZHJpdmVyX2RldmljZV9pc19hZ3AoZHJtX2RldmljZV90ICogZGV2KTsKIAogI2RlZmluZSBJODMwX1JFQUQocmVnKSAgICAgICAgICBEUk1fUkVBRDMyKGRldl9wcml2LT5tbWlvX21hcCwgcmVnKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RtYS5jCmluZGV4IGYzYWEwYzMuLjkxNDA3MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMKQEAgLTEsNyArMSw2IEBACiAvKiBpOTE1X2RtYS5jIC0tIERNQSBzdXBwb3J0IGZvciB0aGUgSTkxNSAtKi0gbGludXgtYyAtKi0KICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgorLyoKICAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KICAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgpAQCAtMjUsNyArMjQsNyBAQAogICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKICAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqLwogCiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybS5oIgpAQCAtMTk2LDcgKzE5NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV9yZXN1bWUoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpOTE1X2RtYV9yZXN1bWUoZHJtX2RldmljZV90ICogZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTI1Myw3ICsyNTIsNyBAQAogCQlyZXRjb2RlID0gaTkxNV9kbWFfY2xlYW51cChkZXYpOwogCQlicmVhazsKIAljYXNlIEk5MTVfUkVTVU1FX0RNQToKLQkJcmV0Y29kZSA9IGk5MTVfcmVzdW1lKGRldik7CisJCXJldGNvZGUgPSBpOTE1X2RtYV9yZXN1bWUoZGV2KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0Y29kZSA9IC1FSU5WQUw7CkBAIC02NTQsNiArNjUzLDkgQEAKIAljYXNlIEk5MTVfUEFSQU1fQUxMT1dfQkFUQ0hCVUZGRVI6CiAJCXZhbHVlID0gZGV2X3ByaXYtPmFsbG93X2JhdGNoYnVmZmVyID8gMSA6IDA7CiAJCWJyZWFrOworCWNhc2UgSTkxNV9QQVJBTV9MQVNUX0RJU1BBVENIOgorCQl2YWx1ZSA9IFJFQURfQlJFQURDUlVNQihkZXZfcHJpdik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCURSTV9FUlJPUigiVW5rb3duIHBhcmFtZXRlciAlZFxuIiwgcGFyYW0ucGFyYW0pOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwpAQCAtNjk5LDcgKzcwMSwxOSBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGk5MTVfZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBpOTE1X2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCS8qIGk5MTUgaGFzIDQgbW9yZSBjb3VudGVycyAqLworCWRldi0+Y291bnRlcnMgKz0gNDsKKwlkZXYtPnR5cGVzWzZdID0gX0RSTV9TVEFUX0lSUTsKKwlkZXYtPnR5cGVzWzddID0gX0RSTV9TVEFUX1BSSU1BUlk7CisJZGV2LT50eXBlc1s4XSA9IF9EUk1fU1RBVF9TRUNPTkRBUlk7CisJZGV2LT50eXBlc1s5XSA9IF9EUk1fU1RBVF9ETUE7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpOTE1X2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KQogewogCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CiAJCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNzA4LDcgKzcyMiw3IEBACiAJaTkxNV9kbWFfY2xlYW51cChkZXYpOwogfQogCi12b2lkIGk5MTVfZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApCit2b2lkIGk5MTVfZHJpdmVyX3ByZWNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKQogewogCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CiAJCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNzE3LDE4ICs3MzEsMTggQEAKIH0KIAogZHJtX2lvY3RsX2Rlc2NfdCBpOTE1X2lvY3Rsc1tdID0gewotCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfSU5JVCldID0ge2k5MTVfZG1hX2luaXQsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfRkxVU0gpXSA9IHtpOTE1X2ZsdXNoX2lvY3RsLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0ZMSVApXSA9IHtpOTE1X2ZsaXBfYnVmcywgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9CQVRDSEJVRkZFUildID0ge2k5MTVfYmF0Y2hidWZmZXIsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfSVJRX0VNSVQpXSA9IHtpOTE1X2lycV9lbWl0LCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0lSUV9XQUlUKV0gPSB7aTkxNV9pcnFfd2FpdCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9HRVRQQVJBTSldID0ge2k5MTVfZ2V0cGFyYW0sIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfU0VUUEFSQU0pXSA9IHtpOTE1X3NldHBhcmFtLCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0FMTE9DKV0gPSB7aTkxNV9tZW1fYWxsb2MsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfRlJFRSldID0ge2k5MTVfbWVtX2ZyZWUsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfSU5JVF9IRUFQKV0gPSB7aTkxNV9tZW1faW5pdF9oZWFwLCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0NNREJVRkZFUildID0ge2k5MTVfY21kYnVmZmVyLCAxLCAwfQorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfSU5JVCldID0ge2k5MTVfZG1hX2luaXQsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9GTFVTSCldID0ge2k5MTVfZmx1c2hfaW9jdGwsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0ZMSVApXSA9IHtpOTE1X2ZsaXBfYnVmcywgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfQkFUQ0hCVUZGRVIpXSA9IHtpOTE1X2JhdGNoYnVmZmVyLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9JUlFfRU1JVCldID0ge2k5MTVfaXJxX2VtaXQsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0lSUV9XQUlUKV0gPSB7aTkxNV9pcnFfd2FpdCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfR0VUUEFSQU0pXSA9IHtpOTE1X2dldHBhcmFtLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9TRVRQQVJBTSldID0ge2k5MTVfc2V0cGFyYW0sIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9BTExPQyldID0ge2k5MTVfbWVtX2FsbG9jLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9GUkVFKV0gPSB7aTkxNV9tZW1fZnJlZSwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfSU5JVF9IRUFQKV0gPSB7aTkxNV9tZW1faW5pdF9oZWFwLCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfQ01EQlVGRkVSKV0gPSB7aTkxNV9jbWRidWZmZXIsIERSTV9BVVRIfQogfTsKIAogaW50IGk5MTVfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUoaTkxNV9pb2N0bHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RybS5oCmluZGV4IDIzZTAyN2QuLjc3NDEyZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJtLmgKQEAgLTEsNSArMSw0IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCisvKgogICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgogICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCkBAIC0yMyw3ICsyMiw3IEBACiAgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQogICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICovCiAKICNpZm5kZWYgX0k5MTVfRFJNX0hfCiAjZGVmaW5lIF9JOTE1X0RSTV9IXwpAQCAtMTUyLDYgKzE1MSw3IEBACiAgKi8KICNkZWZpbmUgSTkxNV9QQVJBTV9JUlFfQUNUSVZFICAgICAgICAgICAgMQogI2RlZmluZSBJOTE1X1BBUkFNX0FMTE9XX0JBVENIQlVGRkVSICAgICAyCisjZGVmaW5lIEk5MTVfUEFSQU1fTEFTVF9ESVNQQVRDSCAgICAgICAgIDMKIAogdHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfZ2V0cGFyYW0gewogCWludCBwYXJhbTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuYwppbmRleCAwNTA4MjQwLi44ZTJlNjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5jCkBAIC0xLDYgKzEsNiBAQAogLyogaTkxNV9kcnYuYyAtLSBpODMwLGk4NDUsaTg1NSxpODY1LGk5MTUgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQogICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qCiAgKgogICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgogICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KQEAgLTI1LDcgKzI1LDcgQEAKICAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCiAgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKi8KIAogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm0uaCIKQEAgLTM0LDQ4ICszNCwyMiBAQAogCiAjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgogCi1zdGF0aWMgaW50IHBvc3Rpbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JZGV2LT5jb3VudGVycyArPSA0OwotCWRldi0+dHlwZXNbNl0gPSBfRFJNX1NUQVRfSVJROwotCWRldi0+dHlwZXNbN10gPSBfRFJNX1NUQVRfUFJJTUFSWTsKLQlkZXYtPnR5cGVzWzhdID0gX0RSTV9TVEFUX1NFQ09OREFSWTsKLQlkZXYtPnR5cGVzWzldID0gX0RSTV9TVEFUX0RNQTsKLQotCURSTV9JTkZPKCJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBvbiBtaW5vciAlZDogJXNcbiIsCi0JCSBEUklWRVJfTkFNRSwKLQkJIERSSVZFUl9NQUpPUiwKLQkJIERSSVZFUl9NSU5PUiwKLQkJIERSSVZFUl9QQVRDSExFVkVMLAotCQkgRFJJVkVSX0RBVEUsIGRldi0+cHJpbWFyeS5taW5vciwgcGNpX3ByZXR0eV9uYW1lKGRldi0+cGRldikKLQkgICAgKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZXJzaW9uKGRybV92ZXJzaW9uX3QgKiB2ZXJzaW9uKQotewotCWludCBsZW47Ci0KLQl2ZXJzaW9uLT52ZXJzaW9uX21ham9yID0gRFJJVkVSX01BSk9SOwotCXZlcnNpb24tPnZlcnNpb25fbWlub3IgPSBEUklWRVJfTUlOT1I7Ci0JdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUw7Ci0JRFJNX0NPUFkodmVyc2lvbi0+bmFtZSwgRFJJVkVSX05BTUUpOwotCURSTV9DT1BZKHZlcnNpb24tPmRhdGUsIERSSVZFUl9EQVRFKTsKLQlEUk1fQ09QWSh2ZXJzaW9uLT5kZXNjLCBEUklWRVJfREVTQyk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lpZGxpc3RbXSA9IHsKIAlpOTE1X1BDSV9JRFMKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXIgPSB7CisJLyogZG9uJ3QgdXNlIG10cnIncyBoZXJlLCB0aGUgWHNlcnZlciBvciB1c2VyIHNwYWNlIGFwcCBzaG91bGQKKwkgKiBkZWFsIHdpdGggdGhlbSBmb3IgaW50ZWwgaGFyZHdhcmUuCisJICovCiAJLmRyaXZlcl9mZWF0dXJlcyA9Ci0JICAgIERSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1JFUVVJUkVfQUdQIHwgRFJJVkVSX1VTRV9NVFJSIHwKLQkgICAgRFJJVkVSX0hBVkVfSVJRIHwgRFJJVkVSX0lSUV9TSEFSRUQsCi0JLnByZXRha2Vkb3duID0gaTkxNV9kcml2ZXJfcHJldGFrZWRvd24sCi0JLnByZXJlbGVhc2UgPSBpOTE1X2RyaXZlcl9wcmVyZWxlYXNlLAorCSAgICBEUklWRVJfVVNFX0FHUCB8IERSSVZFUl9SRVFVSVJFX0FHUCB8IC8qIERSSVZFUl9VU0VfTVRSUiB8Ki8KKwkgICAgRFJJVkVSX0hBVkVfSVJRIHwgRFJJVkVSX0lSUV9TSEFSRUQgfCBEUklWRVJfSVJRX1ZCTCwKKwkubG9hZCA9IGk5MTVfZHJpdmVyX2xvYWQsCisJLmxhc3RjbG9zZSA9IGk5MTVfZHJpdmVyX2xhc3RjbG9zZSwKKwkucHJlY2xvc2UgPSBpOTE1X2RyaXZlcl9wcmVjbG9zZSwKIAkuZGV2aWNlX2lzX2FncCA9IGk5MTVfZHJpdmVyX2RldmljZV9pc19hZ3AsCisJLnZibGFua193YWl0ID0gaTkxNV9kcml2ZXJfdmJsYW5rX3dhaXQsCiAJLmlycV9wcmVpbnN0YWxsID0gaTkxNV9kcml2ZXJfaXJxX3ByZWluc3RhbGwsCiAJLmlycV9wb3N0aW5zdGFsbCA9IGk5MTVfZHJpdmVyX2lycV9wb3N0aW5zdGFsbCwKIAkuaXJxX3VuaW5zdGFsbCA9IGk5MTVfZHJpdmVyX2lycV91bmluc3RhbGwsCkBAIC04Myw4ICs1Nyw2IEBACiAJLnJlY2xhaW1fYnVmZmVycyA9IGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycywKIAkuZ2V0X21hcF9vZnMgPSBkcm1fY29yZV9nZXRfbWFwX29mcywKIAkuZ2V0X3JlZ19vZnMgPSBkcm1fY29yZV9nZXRfcmVnX29mcywKLQkucG9zdGluaXQgPSBwb3N0aW5pdCwKLQkudmVyc2lvbiA9IHZlcnNpb24sCiAJLmlvY3RscyA9IGk5MTVfaW9jdGxzLAogCS5mb3BzID0gewogCQkgLm93bmVyID0gVEhJU19NT0RVTEUsCkBAIC05NywxMSArNjksMTkgQEAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJCSAuY29tcGF0X2lvY3RsID0gaTkxNV9jb21wYXRfaW9jdGwsCiAjZW5kaWYKLQkJIH0sCisJfSwKKwogCS5wY2lfZHJpdmVyID0gewotCQkgICAgICAgLm5hbWUgPSBEUklWRVJfTkFNRSwKLQkJICAgICAgIC5pZF90YWJsZSA9IHBjaWlkbGlzdCwKLQkJICAgICAgIH0KKwkJIC5uYW1lID0gRFJJVkVSX05BTUUsCisJCSAuaWRfdGFibGUgPSBwY2lpZGxpc3QsCisJfSwKKwkKKwkubmFtZSA9IERSSVZFUl9OQU1FLAorCS5kZXNjID0gRFJJVkVSX0RFU0MsCisJLmRhdGUgPSBEUklWRVJfREFURSwKKwkubWFqb3IgPSBEUklWRVJfTUFKT1IsCisJLm1pbm9yID0gRFJJVkVSX01JTk9SLAorCS5wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUwsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpOTE1X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaAppbmRleCAxN2U0NTdjLi5jNmM3MWI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5oCkBAIC0xLDYgKzEsNiBAQAogLyogaTkxNV9kcnYuaCAtLSBQcml2YXRlIGhlYWRlciBmb3IgdGhlIEk5MTUgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQogICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qCiAgKgogICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgogICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KQEAgLTI1LDcgKzI1LDcgQEAKICAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCiAgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKi8KIAogI2lmbmRlZiBfSTkxNV9EUlZfSF8KICNkZWZpbmUgX0k5MTVfRFJWX0hfCkBAIC0zNywyMSArMzcsMTggQEAKIAogI2RlZmluZSBEUklWRVJfTkFNRQkJImk5MTUiCiAjZGVmaW5lIERSSVZFUl9ERVNDCQkiSW50ZWwgR3JhcGhpY3MiCi0jZGVmaW5lIERSSVZFUl9EQVRFCQkiMjAwNDA0MDUiCisjZGVmaW5lIERSSVZFUl9EQVRFCQkiMjAwNTEyMDkiCiAKIC8qIEludGVyZmFjZSBoaXN0b3J5OgogICoKICAqIDEuMTogT3JpZ2luYWwuCisgKiAxLjI6IEFkZCBQb3dlciBNYW5hZ2VtZW50CisgKiAxLjM6IEFkZCB2Ymxhbmsgc3VwcG9ydAogICovCiAjZGVmaW5lIERSSVZFUl9NQUpPUgkJMQotI2RlZmluZSBEUklWRVJfTUlOT1IJCTEKKyNkZWZpbmUgRFJJVkVSX01JTk9SCQkzCiAjZGVmaW5lIERSSVZFUl9QQVRDSExFVkVMCTAKIAotLyogV2UgdXNlIG91ciBvd24gZG1hIG1lY2hhbmlzbXMsIG5vdCB0aGUgZHJtIHRlbXBsYXRlIGNvZGUuICBIb3dldmVyLAotICogdGhlIHNoYXJlZCBJUlEgY29kZSBpcyB1c2VmdWwgdG8gdXM6Ci0gKi8KLSNkZWZpbmUgX19IQVZFX1BNCQkxCi0KIHR5cGVkZWYgc3RydWN0IF9kcm1faTkxNV9yaW5nX2J1ZmZlciB7CiAJaW50IHRhaWxfbWFzazsKIAl1bnNpZ25lZCBsb25nIFN0YXJ0OwpAQCAtOTcsNiArOTQsNyBAQAogCWludCB0ZXhfbHJ1X2xvZ19ncmFudWxhcml0eTsKIAlpbnQgYWxsb3dfYmF0Y2hidWZmZXI7CiAJc3RydWN0IG1lbV9ibG9jayAqYWdwX2hlYXA7CisJdW5zaWduZWQgaW50IHNyMDEsIGFkcGEsIHBwY3IsIGR2b2IsIGR2b2MsIGx2ZHM7CiB9IGRybV9pOTE1X3ByaXZhdGVfdDsKIAogZXh0ZXJuIGRybV9pb2N0bF9kZXNjX3QgaTkxNV9pb2N0bHNbXTsKQEAgLTEwNCwxNCArMTAyLDE4IEBACiAKIAkJCQkvKiBpOTE1X2RtYS5jICovCiBleHRlcm4gdm9pZCBpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGk5MTVfZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9wcmVyZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKTsKK2V4dGVybiBpbnQgaTkxNV9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2V4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApOwogZXh0ZXJuIGludCBpOTE1X2RyaXZlcl9kZXZpY2VfaXNfYWdwKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gbG9uZyBpOTE1X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAogLyogaTkxNV9pcnEuYyAqLwogZXh0ZXJuIGludCBpOTE1X2lycV9lbWl0KERSTV9JT0NUTF9BUkdTKTsKIGV4dGVybiBpbnQgaTkxNV9pcnFfd2FpdChEUk1fSU9DVExfQVJHUyk7CiAKK2V4dGVybiBpbnQgaTkxNV9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOwogZXh0ZXJuIGlycXJldHVybl90IGk5MTVfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUyk7CiBleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwogZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7CkBAIC0xMjUsMTMgKzEyNywxMCBAQAogZXh0ZXJuIHZvaWQgaTkxNV9tZW1fcmVsZWFzZShkcm1fZGV2aWNlX3QgKiBkZXYsCiAJCQkgICAgIERSTUZJTEUgZmlscCwgc3RydWN0IG1lbV9ibG9jayAqaGVhcCk7CiAKLWV4dGVybiBsb25nIGk5MTVfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpOwotCi0jZGVmaW5lIEk5MTVfUkVBRChyZWcpICAgICAgICAgIERSTV9SRUFEMzIoZGV2X3ByaXYtPm1taW9fbWFwLCByZWcpCi0jZGVmaW5lIEk5MTVfV1JJVEUocmVnLHZhbCkgICAgIERSTV9XUklURTMyKGRldl9wcml2LT5tbWlvX21hcCwgcmVnLCB2YWwpCi0jZGVmaW5lIEk5MTVfUkVBRDE2KHJlZykgCURSTV9SRUFEMTYoZGV2X3ByaXYtPm1taW9fbWFwLCByZWcpCi0jZGVmaW5lIEk5MTVfV1JJVEUxNihyZWcsdmFsKQlEUk1fV1JJVEUxNihkZXZfcHJpdi0+bW1pb19tYXAsIHJlZywgdmFsKQorI2RlZmluZSBJOTE1X1JFQUQocmVnKSAgICAgICAgICBEUk1fUkVBRDMyKGRldl9wcml2LT5tbWlvX21hcCwgKHJlZykpCisjZGVmaW5lIEk5MTVfV1JJVEUocmVnLHZhbCkgICAgIERSTV9XUklURTMyKGRldl9wcml2LT5tbWlvX21hcCwgKHJlZyksICh2YWwpKQorI2RlZmluZSBJOTE1X1JFQUQxNihyZWcpIAlEUk1fUkVBRDE2KGRldl9wcml2LT5tbWlvX21hcCwgKHJlZykpCisjZGVmaW5lIEk5MTVfV1JJVEUxNihyZWcsdmFsKQlEUk1fV1JJVEUxNihkZXZfcHJpdi0+bW1pb19tYXAsIChyZWcpLCAodmFsKSkKIAogI2RlZmluZSBJOTE1X1ZFUkJPU0UgMAogCkBAIC0xOTUsNiArMTk0LDEzIEBACiAjZGVmaW5lIFBQQ1IJCQkweDYxMjA0CiAjZGVmaW5lIFBQQ1JfT04JCQkoMTw8MCkKIAorI2RlZmluZSBEVk9CCQkJMHg2MTE0MAorI2RlZmluZSBEVk9CX09OCQkJKDE8PDMxKQorI2RlZmluZSBEVk9DCQkJMHg2MTE2MAorI2RlZmluZSBEVk9DX09OCQkJKDE8PDMxKQorI2RlZmluZSBMVkRTCQkJMHg2MTE4MAorI2RlZmluZSBMVkRTX09OCQkJKDE8PDMxKQorCiAjZGVmaW5lIEFEUEEJCQkweDYxMTAwCiAjZGVmaW5lIEFEUEFfRFBNU19NQVNLCQkofigzPDwxMCkpCiAjZGVmaW5lIEFEUEFfRFBNU19PTgkJKDA8PDEwKQpAQCAtMjU4LDQgKzI2NCw2IEBACiAKICNkZWZpbmUgQ01EX09QX0RFU1RCVUZGRVJfSU5GTwkgKCgweDM8PDI5KXwoMHgxZDw8MjQpfCgweDhlPDwxNil8MSkKIAorI2RlZmluZSBSRUFEX0JSRUFEQ1JVTUIoZGV2X3ByaXYpICgoKHUzMiAqKShkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UpKVs1XSkKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaW9jMzIuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pb2MzMi5jCmluZGV4IDIyMThhOTQuLjI5NjI0OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pb2MzMi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pb2MzMi5jCkBAIC0zMCw3ICszMCw2IEBACiAgKiBJTiBUSEUgU09GVFdBUkUuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CiAKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaXJxLmMKaW5kZXggNGZhNDQ4ZS4uYTEzODFjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lycS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pcnEuYwpAQCAtMSw3ICsxLDYgQEAKLS8qIGk5MTVfZG1hLmMgLS0gRE1BIHN1cHBvcnQgZm9yIHRoZSBJOTE1IC0qLSBsaW51eC1jIC0qLQorLyogaTkxNV9pcnEuYyAtLSBJUlEgc3VwcG9ydCBmb3IgdGhlIEk5MTUgLSotIGxpbnV4LWMgLSotCiAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKKy8qCiAgKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKQEAgLTI1LDE2ICsyNCwxOCBAQAogICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKICAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqLwogCiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybS5oIgogI2luY2x1ZGUgImk5MTVfZHJtLmgiCiAjaW5jbHVkZSAiaTkxNV9kcnYuaCIKIAotI2RlZmluZSBVU0VSX0lOVF9GTEFHIDB4MgorI2RlZmluZSBVU0VSX0lOVF9GTEFHICgxPDwxKQorI2RlZmluZSBWU1lOQ19QSVBFQl9GTEFHICgxPDw1KQorI2RlZmluZSBWU1lOQ19QSVBFQV9GTEFHICgxPDw3KQorCiAjZGVmaW5lIE1BWF9OT1BJRCAoKHUzMil+MCkKLSNkZWZpbmUgUkVBRF9CUkVBRENSVU1CKGRldl9wcml2KSAgKCgodTMyKikoZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlKSlbNV0pCiAKIGlycXJldHVybl90IGk5MTVfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUykKIHsKQEAgLTQzLDcgKzQ0LDcgQEAKIAl1MTYgdGVtcDsKIAogCXRlbXAgPSBJOTE1X1JFQUQxNihJOTE1UkVHX0lOVF9JREVOVElUWV9SKTsKLQl0ZW1wICY9IFVTRVJfSU5UX0ZMQUc7CisJdGVtcCAmPSAoVVNFUl9JTlRfRkxBRyB8IFZTWU5DX1BJUEVBX0ZMQUcpOwogCiAJRFJNX0RFQlVHKCIlcyBmbGFnPSUwOHhcbiIsIF9fRlVOQ1RJT05fXywgdGVtcCk7CiAKQEAgLTUxLDcgKzUyLDE1IEBACiAJCXJldHVybiBJUlFfTk9ORTsKIAogCUk5MTVfV1JJVEUxNihJOTE1UkVHX0lOVF9JREVOVElUWV9SLCB0ZW1wKTsKLQlEUk1fV0FLRVVQKCZkZXZfcHJpdi0+aXJxX3F1ZXVlKTsKKworCWlmICh0ZW1wICYgVVNFUl9JTlRfRkxBRykKKwkJRFJNX1dBS0VVUCgmZGV2X3ByaXYtPmlycV9xdWV1ZSk7CisKKwlpZiAodGVtcCAmIFZTWU5DX1BJUEVBX0ZMQUcpIHsKKwkJYXRvbWljX2luYygmZGV2LT52YmxfcmVjZWl2ZWQpOworCQlEUk1fV0FLRVVQKCZkZXYtPnZibF9xdWV1ZSk7CisJCWRybV92Ymxfc2VuZF9zaWduYWxzKGRldik7CisJfQogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtMTAyLDYgKzExMSwyNyBAQAogCXJldHVybiByZXQ7CiB9CiAKK2ludCBpOTE1X2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY3VyX3ZibGFuazsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghZGV2X3ByaXYpIHsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fV0FJVF9PTihyZXQsIGRldi0+dmJsX3F1ZXVlLCAzICogRFJNX0haLAorCQkgICAgKCgoY3VyX3ZibGFuayA9IGF0b21pY19yZWFkKCZkZXYtPnZibF9yZWNlaXZlZCkpCisJCQktICpzZXF1ZW5jZSkgPD0gKDE8PDIzKSkpOworCQorCSpzZXF1ZW5jZSA9IGN1cl92Ymxhbms7CisKKwlyZXR1cm4gcmV0OworfQorCisKIC8qIE5lZWRzIHRoZSBsb2NrIGFzIGl0IHRvdWNoZXMgdGhlIHJpbmcuCiAgKi8KIGludCBpOTE1X2lycV9lbWl0KERSTV9JT0NUTF9BUkdTKQpAQCAtMTY1LDcgKzE5NSw3IEBACiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAotCUk5MTVfV1JJVEUxNihJOTE1UkVHX0lOVF9FTkFCTEVfUiwgVVNFUl9JTlRfRkxBRyk7CisJSTkxNV9XUklURTE2KEk5MTVSRUdfSU5UX0VOQUJMRV9SLCBVU0VSX0lOVF9GTEFHIHwgVlNZTkNfUElQRUFfRkxBRyk7CiAJRFJNX0lOSVRfV0FJVFFVRVVFKCZkZXZfcHJpdi0+aXJxX3F1ZXVlKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X21lbS5jIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X21lbS5jCmluZGV4IDEzMTc2ZDEuLmJhODdmZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9tZW0uYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfbWVtLmMKQEAgLTEsNyArMSw2IEBACiAvKiBpOTE1X21lbS5jIC0tIFNpbXBsZSBhZ3AvZmIgbWVtb3J5IG1hbmFnZXIgZm9yIGk5MTUgLSotIGxpbnV4LWMgLSotCiAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKKy8qCiAgKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKQEAgLTI1LDcgKzI0LDcgQEAKICAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCiAgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKi8KIAogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm0uaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZG1hLmMKaW5kZXggNzBkYzdmNi4uYzJhNGJhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZG1hLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZG1hLmMKQEAgLTQ0LDcgKzQ0LDkgQEAKICNkZWZpbmUgTUdBX0RFRkFVTFRfVVNFQ19USU1FT1VUCTEwMDAwCiAjZGVmaW5lIE1HQV9GUkVFTElTVF9ERUJVRwkJMAogCi1zdGF0aWMgaW50IG1nYV9kb19jbGVhbnVwX2RtYShkcm1fZGV2aWNlX3QgKiBkZXYpOworI2RlZmluZSBNSU5JTUFMX0NMRUFOVVAgMAorI2RlZmluZSBGVUxMX0NMRUFOVVAgMQorc3RhdGljIGludCBtZ2FfZG9fY2xlYW51cF9kbWEoZHJtX2RldmljZV90ICpkZXYsIGludCBmdWxsX2NsZWFudXApOwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBFbmdpbmUgY29udHJvbApAQCAtMzkxLDcgKzM5Myw3IEBACiAgKiBETUEgaW5pdGlhbGl6YXRpb24sIGNsZWFudXAKICAqLwogCi1pbnQgbWdhX2RyaXZlcl9wcmVpbml0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKK2ludCBtZ2FfZHJpdmVyX2xvYWQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdjsKIApAQCAtNDA1LDYgKzQwNywxNCBAQAogCWRldl9wcml2LT51c2VjX3RpbWVvdXQgPSBNR0FfREVGQVVMVF9VU0VDX1RJTUVPVVQ7CiAJZGV2X3ByaXYtPmNoaXBzZXQgPSBmbGFnczsKIAorCWRldl9wcml2LT5tbWlvX2Jhc2UgPSBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KGRldiwgMSk7CisJZGV2X3ByaXYtPm1taW9fc2l6ZSA9IGRybV9nZXRfcmVzb3VyY2VfbGVuKGRldiwgMSk7CisKKwlkZXYtPmNvdW50ZXJzICs9IDM7CisJZGV2LT50eXBlc1s2XSA9IF9EUk1fU1RBVF9JUlE7CisJZGV2LT50eXBlc1s3XSA9IF9EUk1fU1RBVF9QUklNQVJZOworCWRldi0+dHlwZXNbOF0gPSBfRFJNX1NUQVRfU0VDT05EQVJZOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQzOCwxNyArNDQ4LDE5IEBACiAJZHJtX2J1Zl9kZXNjX3QgcmVxOwogCWRybV9hZ3BfbW9kZV90IG1vZGU7CiAJZHJtX2FncF9pbmZvX3QgaW5mbzsKKwlkcm1fYWdwX2J1ZmZlcl90IGFncF9yZXE7CisJZHJtX2FncF9iaW5kaW5nX3QgYmluZF9yZXE7CiAKIAkvKiBBY3F1aXJlIEFHUC4gKi8KIAllcnIgPSBkcm1fYWdwX2FjcXVpcmUoZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCURSTV9FUlJPUigiVW5hYmxlIHRvIGFjcXVpcmUgQUdQXG4iKTsKKwkJRFJNX0VSUk9SKCJVbmFibGUgdG8gYWNxdWlyZSBBR1A6ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAogCWVyciA9IGRybV9hZ3BfaW5mbyhkZXYsICZpbmZvKTsKIAlpZiAoZXJyKSB7Ci0JCURSTV9FUlJPUigiVW5hYmxlIHRvIGdldCBBR1AgaW5mb1xuIik7CisJCURSTV9FUlJPUigiVW5hYmxlIHRvIGdldCBBR1AgaW5mbzogJWRcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC00NzIsMTggKzQ4NCwyNCBAQAogCX0KIAogCS8qIEFsbG9jYXRlIGFuZCBiaW5kIEFHUCBtZW1vcnkuICovCi0JZGV2X3ByaXYtPmFncF9wYWdlcyA9IGFncF9zaXplIC8gUEFHRV9TSVpFOwotCWRldl9wcml2LT5hZ3BfbWVtID0gZHJtX2FsbG9jX2FncChkZXYsIGRldl9wcml2LT5hZ3BfcGFnZXMsIDApOwotCWlmIChkZXZfcHJpdi0+YWdwX21lbSA9PSBOVUxMKSB7Ci0JCWRldl9wcml2LT5hZ3BfcGFnZXMgPSAwOworCWFncF9yZXEuc2l6ZSA9IGFncF9zaXplOworCWFncF9yZXEudHlwZSA9IDA7CisJZXJyID0gZHJtX2FncF9hbGxvYyhkZXYsICZhZ3BfcmVxKTsKKwlpZiAoZXJyKSB7CisJCWRldl9wcml2LT5hZ3Bfc2l6ZSA9IDA7CiAJCURSTV9FUlJPUigiVW5hYmxlIHRvIGFsbG9jYXRlICV1TUIgQUdQIG1lbW9yeVxuIiwKIAkJCSAgZG1hX2JzLT5hZ3Bfc2l6ZSk7Ci0JCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJCXJldHVybiBlcnI7CiAJfQorCQorCWRldl9wcml2LT5hZ3Bfc2l6ZSA9IGFncF9zaXplOworCWRldl9wcml2LT5hZ3BfaGFuZGxlID0gYWdwX3JlcS5oYW5kbGU7CiAKLQllcnIgPSBkcm1fYmluZF9hZ3AoZGV2X3ByaXYtPmFncF9tZW0sIDApOworCWJpbmRfcmVxLmhhbmRsZSA9IGFncF9yZXEuaGFuZGxlOworCWJpbmRfcmVxLm9mZnNldCA9IDA7CisJZXJyID0gZHJtX2FncF9iaW5kKGRldiwgJmJpbmRfcmVxKTsKIAlpZiAoZXJyKSB7Ci0JCURSTV9FUlJPUigiVW5hYmxlIHRvIGJpbmQgQUdQIG1lbW9yeVxuIik7CisJCURSTV9FUlJPUigiVW5hYmxlIHRvIGJpbmQgQUdQIG1lbW9yeTogJWRcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC00OTcsNyArNTE1LDcgQEAKIAllcnIgPSBkcm1fYWRkbWFwKGRldiwgb2Zmc2V0LCB3YXJwX3NpemUsCiAJCQkgX0RSTV9BR1AsIF9EUk1fUkVBRF9PTkxZLCAmZGV2X3ByaXYtPndhcnApOwogCWlmIChlcnIpIHsKLQkJRFJNX0VSUk9SKCJVbmFibGUgdG8gbWFwIFdBUlAgbWljcm9jb2RlXG4iKTsKKwkJRFJNX0VSUk9SKCJVbmFibGUgdG8gbWFwIFdBUlAgbWljcm9jb2RlOiAlZFxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTUwNSw3ICs1MjMsNyBAQAogCWVyciA9IGRybV9hZGRtYXAoZGV2LCBvZmZzZXQsIGRtYV9icy0+cHJpbWFyeV9zaXplLAogCQkJIF9EUk1fQUdQLCBfRFJNX1JFQURfT05MWSwgJmRldl9wcml2LT5wcmltYXJ5KTsKIAlpZiAoZXJyKSB7Ci0JCURSTV9FUlJPUigiVW5hYmxlIHRvIG1hcCBwcmltYXJ5IERNQSByZWdpb25cbiIpOworCQlEUk1fRVJST1IoIlVuYWJsZSB0byBtYXAgcHJpbWFyeSBETUEgcmVnaW9uOiAlZFxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTUxMyw3ICs1MzEsNyBAQAogCWVyciA9IGRybV9hZGRtYXAoZGV2LCBvZmZzZXQsIHNlY29uZGFyeV9zaXplLAogCQkJIF9EUk1fQUdQLCAwLCAmZGV2LT5hZ3BfYnVmZmVyX21hcCk7CiAJaWYgKGVycikgewotCQlEUk1fRVJST1IoIlVuYWJsZSB0byBtYXAgc2Vjb25kYXJ5IERNQSByZWdpb25cbiIpOworCQlEUk1fRVJST1IoIlVuYWJsZSB0byBtYXAgc2Vjb25kYXJ5IERNQSByZWdpb246ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNTI1LDE1ICs1NDMsMjkgQEAKIAogCWVyciA9IGRybV9hZGRidWZzX2FncChkZXYsICZyZXEpOwogCWlmIChlcnIpIHsKLQkJRFJNX0VSUk9SKCJVbmFibGUgdG8gYWRkIHNlY29uZGFyeSBETUEgYnVmZmVyc1xuIik7CisJCURSTV9FUlJPUigiVW5hYmxlIHRvIGFkZCBzZWNvbmRhcnkgRE1BIGJ1ZmZlcnM6ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAorCXsKKwkJZHJtX21hcF9saXN0X3QgKl9lbnRyeTsKKwkJdW5zaWduZWQgbG9uZyBhZ3BfdG9rZW4gPSAwOworCQkKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShfZW50cnksICZkZXYtPm1hcGxpc3QtPmhlYWQsIGhlYWQpIHsKKwkJCWlmIChfZW50cnktPm1hcCA9PSBkZXYtPmFncF9idWZmZXJfbWFwKQorCQkJCWFncF90b2tlbiA9IF9lbnRyeS0+dXNlcl90b2tlbjsKKwkJfQorCQlpZiAoIWFncF90b2tlbikKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWRldi0+YWdwX2J1ZmZlcl90b2tlbiA9IGFncF90b2tlbjsKKwl9CisKIAlvZmZzZXQgKz0gc2Vjb25kYXJ5X3NpemU7CiAJZXJyID0gZHJtX2FkZG1hcChkZXYsIG9mZnNldCwgYWdwX3NpemUgLSBvZmZzZXQsCiAJCQkgX0RSTV9BR1AsIDAsICZkZXZfcHJpdi0+YWdwX3RleHR1cmVzKTsKIAlpZiAoZXJyKSB7Ci0JCURSTV9FUlJPUigiVW5hYmxlIHRvIG1hcCBBR1AgdGV4dHVyZSByZWdpb25cbiIpOworCQlEUk1fRVJST1IoIlVuYWJsZSB0byBtYXAgQUdQIHRleHR1cmUgcmVnaW9uICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNjAzLDcgKzYzNSw4IEBACiAJZXJyID0gZHJtX2FkZG1hcChkZXYsIDAsIHdhcnBfc2l6ZSwgX0RSTV9DT05TSVNURU5ULAogCQkJIF9EUk1fUkVBRF9PTkxZLCAmZGV2X3ByaXYtPndhcnApOwogCWlmIChlcnIgIT0gMCkgewotCQlEUk1fRVJST1IoIlVuYWJsZSB0byBjcmVhdGUgbWFwcGluZyBmb3IgV0FSUCBtaWNyb2NvZGVcbiIpOworCQlEUk1fRVJST1IoIlVuYWJsZSB0byBjcmVhdGUgbWFwcGluZyBmb3IgV0FSUCBtaWNyb2NvZGU6ICVkXG4iLAorCQkJICBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNjIyLDcgKzY1NSw3IEBACiAJfQogCiAJaWYgKGVyciAhPSAwKSB7Ci0JCURSTV9FUlJPUigiVW5hYmxlIHRvIGFsbG9jYXRlIHByaW1hcnkgRE1BIHJlZ2lvblxuIik7CisJCURSTV9FUlJPUigiVW5hYmxlIHRvIGFsbG9jYXRlIHByaW1hcnkgRE1BIHJlZ2lvbjogJWRcbiIsIGVycik7CiAJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CiAJfQogCkBAIC02NDYsNyArNjc5LDcgQEAKIAl9CiAKIAlpZiAoYmluX2NvdW50ID09IDApIHsKLQkJRFJNX0VSUk9SKCJVbmFibGUgdG8gYWRkIHNlY29uZGFyeSBETUEgYnVmZmVyc1xuIik7CisJCURSTV9FUlJPUigiVW5hYmxlIHRvIGFkZCBzZWNvbmRhcnkgRE1BIGJ1ZmZlcnM6ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNjgyLDcgKzcxNSw3IEBACiAJZXJyID0gZHJtX2FkZG1hcChkZXYsIGRldl9wcml2LT5tbWlvX2Jhc2UsIGRldl9wcml2LT5tbWlvX3NpemUsCiAJCQkgX0RSTV9SRUdJU1RFUlMsIF9EUk1fUkVBRF9PTkxZLCAmZGV2X3ByaXYtPm1taW8pOwogCWlmIChlcnIpIHsKLQkJRFJNX0VSUk9SKCJVbmFibGUgdG8gbWFwIE1NSU8gcmVnaW9uXG4iKTsKKwkJRFJNX0VSUk9SKCJVbmFibGUgdG8gbWFwIE1NSU8gcmVnaW9uOiAlZFxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTY5MCw3ICs3MjMsNyBAQAogCQkJIF9EUk1fUkVBRF9PTkxZIHwgX0RSTV9MT0NLRUQgfCBfRFJNX0tFUk5FTCwKIAkJCSAmZGV2X3ByaXYtPnN0YXR1cyk7CiAJaWYgKGVycikgewotCQlEUk1fRVJST1IoIlVuYWJsZSB0byBtYXAgc3RhdHVzIHJlZ2lvblxuIik7CisJCURSTV9FUlJPUigiVW5hYmxlIHRvIG1hcCBzdGF0dXMgcmVnaW9uOiAlZFxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTcwOCw3ICs3NDEsNyBAQAogCSAqLwogCiAJaWYgKGVycikgewotCQltZ2FfZG9fY2xlYW51cF9kbWEoZGV2KTsKKwkJbWdhX2RvX2NsZWFudXBfZG1hKGRldiwgTUlOSU1BTF9DTEVBTlVQKTsKIAl9CiAKIAkvKiBOb3Qgb25seSBkbyB3ZSB3YW50IHRvIHRyeSBhbmQgaW5pdGlhbGl6ZWQgUENJIGNhcmRzIGZvciBQQ0kgRE1BLApAQCAtNzMxLDM1ICs3NjQsMzIgQEAKIAlEUk1fREVWSUNFOwogCWRybV9tZ2FfZG1hX2Jvb3RzdHJhcF90IGJvb3RzdHJhcDsKIAlpbnQgZXJyOworCXN0YXRpYyBjb25zdCBpbnQgbW9kZXNbXSA9IHsgMCwgMSwgMiwgMiwgNCwgNCwgNCwgNCB9OworCWNvbnN0IGRybV9tZ2FfcHJpdmF0ZV90ICpjb25zdCBkZXZfcHJpdiA9CisJCShkcm1fbWdhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCiAJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGJvb3RzdHJhcCwKIAkJCQkgKGRybV9tZ2FfZG1hX2Jvb3RzdHJhcF90IF9fdXNlciAqKSBkYXRhLAogCQkJCSBzaXplb2YoYm9vdHN0cmFwKSk7CiAKIAllcnIgPSBtZ2FfZG9fZG1hX2Jvb3RzdHJhcChkZXYsICZib290c3RyYXApOwotCWlmICghZXJyKSB7Ci0JCXN0YXRpYyBjb25zdCBpbnQgbW9kZXNbXSA9IHsgMCwgMSwgMiwgMiwgNCwgNCwgNCwgNCB9OwotCQljb25zdCBkcm1fbWdhX3ByaXZhdGVfdCAqY29uc3QgZGV2X3ByaXYgPQotCQkgICAgKGRybV9tZ2FfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7Ci0KLQkJaWYgKGRldl9wcml2LT5hZ3BfdGV4dHVyZXMgIT0gTlVMTCkgewotCQkJYm9vdHN0cmFwLnRleHR1cmVfaGFuZGxlID0KLQkJCSAgICBkZXZfcHJpdi0+YWdwX3RleHR1cmVzLT5vZmZzZXQ7Ci0JCQlib290c3RyYXAudGV4dHVyZV9zaXplID0gZGV2X3ByaXYtPmFncF90ZXh0dXJlcy0+c2l6ZTsKLQkJfSBlbHNlIHsKLQkJCWJvb3RzdHJhcC50ZXh0dXJlX2hhbmRsZSA9IDA7Ci0JCQlib290c3RyYXAudGV4dHVyZV9zaXplID0gMDsKLQkJfQotCi0JCWJvb3RzdHJhcC5hZ3BfbW9kZSA9IG1vZGVzW2Jvb3RzdHJhcC5hZ3BfbW9kZSAmIDB4MDddOwotCQlpZiAoRFJNX0NPUFlfVE9fVVNFUigodm9pZCBfX3VzZXIgKilkYXRhLCAmYm9vdHN0cmFwLAotCQkJCSAgICAgc2l6ZW9mKGJvb3RzdHJhcCkpKSB7Ci0JCQllcnIgPSBEUk1fRVJSKEVGQVVMVCk7Ci0JCX0KLQl9IGVsc2UgewotCQltZ2FfZG9fY2xlYW51cF9kbWEoZGV2KTsKKwlpZiAoZXJyKSB7CisJCW1nYV9kb19jbGVhbnVwX2RtYShkZXYsIEZVTExfQ0xFQU5VUCk7CisJCXJldHVybiBlcnI7CiAJfQogCisJaWYgKGRldl9wcml2LT5hZ3BfdGV4dHVyZXMgIT0gTlVMTCkgeworCQlib290c3RyYXAudGV4dHVyZV9oYW5kbGUgPSBkZXZfcHJpdi0+YWdwX3RleHR1cmVzLT5vZmZzZXQ7CisJCWJvb3RzdHJhcC50ZXh0dXJlX3NpemUgPSBkZXZfcHJpdi0+YWdwX3RleHR1cmVzLT5zaXplOworCX0gZWxzZSB7CisJCWJvb3RzdHJhcC50ZXh0dXJlX2hhbmRsZSA9IDA7CisJCWJvb3RzdHJhcC50ZXh0dXJlX3NpemUgPSAwOworCX0KKworCWJvb3RzdHJhcC5hZ3BfbW9kZSA9IG1vZGVzW2Jvb3RzdHJhcC5hZ3BfbW9kZSAmIDB4MDddOworCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoKGRybV9tZ2FfZG1hX2Jvb3RzdHJhcF90IF9fdXNlciAqKWRhdGEsCisJCQkgICAgICAgYm9vdHN0cmFwLCBzaXplb2YoYm9vdHN0cmFwKSk7CisKIAlyZXR1cm4gZXJyOwogfQogCkBAIC04NTMsMTMgKzg4MywxMyBAQAogCiAJcmV0ID0gbWdhX3dhcnBfaW5zdGFsbF9taWNyb2NvZGUoZGV2X3ByaXYpOwogCWlmIChyZXQgPCAwKSB7Ci0JCURSTV9FUlJPUigiZmFpbGVkIHRvIGluc3RhbGwgV0FSUCB1Y29kZSFcbiIpOworCQlEUk1fRVJST1IoImZhaWxlZCB0byBpbnN0YWxsIFdBUlAgdWNvZGUhOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXQgPSBtZ2Ffd2FycF9pbml0KGRldl9wcml2KTsKIAlpZiAocmV0IDwgMCkgewotCQlEUk1fRVJST1IoImZhaWxlZCB0byBpbml0IFdBUlAgZW5naW5lIVxuIik7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGluaXQgV0FSUCBlbmdpbmUhOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTkwNCw3ICs5MzQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1nYV9kb19jbGVhbnVwX2RtYShkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IG1nYV9kb19jbGVhbnVwX2RtYShkcm1fZGV2aWNlX3QgKmRldiwgaW50IGZ1bGxfY2xlYW51cCkKIHsKIAlpbnQgZXJyID0gMDsKIAlEUk1fREVCVUcoIlxuIik7CkBAIC05MzIsMzEgKzk2MiwzOSBAQAogCiAJCWlmIChkZXZfcHJpdi0+dXNlZF9uZXdfZG1hX2luaXQpIHsKICNpZiBfX09TX0hBU19BR1AKLQkJCWlmIChkZXZfcHJpdi0+YWdwX21lbSAhPSBOVUxMKSB7Ci0JCQkJZGV2X3ByaXYtPmFncF90ZXh0dXJlcyA9IE5VTEw7Ci0JCQkJZHJtX3VuYmluZF9hZ3AoZGV2X3ByaXYtPmFncF9tZW0pOworCQkJaWYgKGRldl9wcml2LT5hZ3BfaGFuZGxlICE9IDApIHsKKwkJCQlkcm1fYWdwX2JpbmRpbmdfdCB1bmJpbmRfcmVxOworCQkJCWRybV9hZ3BfYnVmZmVyX3QgZnJlZV9yZXE7CiAKLQkJCQlkcm1fZnJlZV9hZ3AoZGV2X3ByaXYtPmFncF9tZW0sCi0JCQkJCSAgICAgZGV2X3ByaXYtPmFncF9wYWdlcyk7Ci0JCQkJZGV2X3ByaXYtPmFncF9wYWdlcyA9IDA7Ci0JCQkJZGV2X3ByaXYtPmFncF9tZW0gPSBOVUxMOworCQkJCXVuYmluZF9yZXEuaGFuZGxlID0gZGV2X3ByaXYtPmFncF9oYW5kbGU7CisJCQkJZHJtX2FncF91bmJpbmQoZGV2LCAmdW5iaW5kX3JlcSk7CisKKwkJCQlmcmVlX3JlcS5oYW5kbGUgPSBkZXZfcHJpdi0+YWdwX2hhbmRsZTsKKwkJCQlkcm1fYWdwX2ZyZWUoZGV2LCAmZnJlZV9yZXEpOworCQorCQkJCWRldl9wcml2LT5hZ3BfdGV4dHVyZXMgPSBOVUxMOworCQkJCWRldl9wcml2LT5hZ3Bfc2l6ZSA9IDA7CisJCQkJZGV2X3ByaXYtPmFncF9oYW5kbGUgPSAwOwogCQkJfQogCiAJCQlpZiAoKGRldi0+YWdwICE9IE5VTEwpICYmIGRldi0+YWdwLT5hY3F1aXJlZCkgewogCQkJCWVyciA9IGRybV9hZ3BfcmVsZWFzZShkZXYpOwogCQkJfQogI2VuZGlmCi0JCQlkZXZfcHJpdi0+dXNlZF9uZXdfZG1hX2luaXQgPSAwOwogCQl9CiAKIAkJZGV2X3ByaXYtPndhcnAgPSBOVUxMOwogCQlkZXZfcHJpdi0+cHJpbWFyeSA9IE5VTEw7Ci0JCWRldl9wcml2LT5tbWlvID0gTlVMTDsKLQkJZGV2X3ByaXYtPnN0YXR1cyA9IE5VTEw7CiAJCWRldl9wcml2LT5zYXJlYSA9IE5VTEw7CiAJCWRldl9wcml2LT5zYXJlYV9wcml2ID0gTlVMTDsKIAkJZGV2LT5hZ3BfYnVmZmVyX21hcCA9IE5VTEw7CiAKKwkJaWYgKGZ1bGxfY2xlYW51cCkgeworCQkJZGV2X3ByaXYtPm1taW8gPSBOVUxMOworCQkJZGV2X3ByaXYtPnN0YXR1cyA9IE5VTEw7CisJCQlkZXZfcHJpdi0+dXNlZF9uZXdfZG1hX2luaXQgPSAwOworCQl9CisKIAkJbWVtc2V0KCZkZXZfcHJpdi0+cHJpbSwgMCwgc2l6ZW9mKGRldl9wcml2LT5wcmltKSk7CiAJCWRldl9wcml2LT53YXJwX3BpcGUgPSAwOwogCQltZW1zZXQoZGV2X3ByaXYtPndhcnBfcGlwZV9waHlzLCAwLApAQCAtOTY3LDcgKzEwMDUsNyBAQAogCQl9CiAJfQogCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKIH0KIAogaW50IG1nYV9kbWFfaW5pdChEUk1fSU9DVExfQVJHUykKQEAgLTk4NSwxMSArMTAyMywxMSBAQAogCWNhc2UgTUdBX0lOSVRfRE1BOgogCQllcnIgPSBtZ2FfZG9faW5pdF9kbWEoZGV2LCAmaW5pdCk7CiAJCWlmIChlcnIpIHsKLQkJCSh2b2lkKW1nYV9kb19jbGVhbnVwX2RtYShkZXYpOworCQkJKHZvaWQpbWdhX2RvX2NsZWFudXBfZG1hKGRldiwgRlVMTF9DTEVBTlVQKTsKIAkJfQogCQlyZXR1cm4gZXJyOwogCWNhc2UgTUdBX0NMRUFOVVBfRE1BOgotCQlyZXR1cm4gbWdhX2RvX2NsZWFudXBfZG1hKGRldik7CisJCXJldHVybiBtZ2FfZG9fY2xlYW51cF9kbWEoZGV2LCBGVUxMX0NMRUFOVVApOwogCX0KIAogCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CkBAIC0xMTE4LDcgKzExNTYsNyBAQAogLyoqCiAgKiBDYWxsZWQganVzdCBiZWZvcmUgdGhlIG1vZHVsZSBpcyB1bmxvYWRlZC4KICAqLwotaW50IG1nYV9kcml2ZXJfcG9zdGNsZWFudXAoZHJtX2RldmljZV90ICogZGV2KQoraW50IG1nYV9kcml2ZXJfdW5sb2FkKGRybV9kZXZpY2VfdCAqIGRldikKIHsKIAlkcm1fZnJlZShkZXYtPmRldl9wcml2YXRlLCBzaXplb2YoZHJtX21nYV9wcml2YXRlX3QpLCBEUk1fTUVNX0RSSVZFUik7CiAJZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7CkBAIC0xMTI5LDkgKzExNjcsOSBAQAogLyoqCiAgKiBDYWxsZWQgd2hlbiB0aGUgbGFzdCBvcGVuZXIgb2YgdGhlIGRldmljZSBpcyBjbG9zZWQuCiAgKi8KLXZvaWQgbWdhX2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIG1nYV9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldikKIHsKLQltZ2FfZG9fY2xlYW51cF9kbWEoZGV2KTsKKwltZ2FfZG9fY2xlYW51cF9kbWEoZGV2LCBGVUxMX0NMRUFOVVApOwogfQogCiBpbnQgbWdhX2RyaXZlcl9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqIGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmMKaW5kZXggMTcxMzQ1MS4uOWY3ZWQwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmMKQEAgLTM4LDQxICszOCw2IEBACiAjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgogCiBzdGF0aWMgaW50IG1nYV9kcml2ZXJfZGV2aWNlX2lzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYpOwotc3RhdGljIGludCBwb3N0aW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCWRybV9tZ2FfcHJpdmF0ZV90ICpjb25zdCBkZXZfcHJpdiA9Ci0JICAgIChkcm1fbWdhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwotCi0JZGV2X3ByaXYtPm1taW9fYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDEpOwotCWRldl9wcml2LT5tbWlvX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMSk7Ci0KLQlkZXYtPmNvdW50ZXJzICs9IDM7Ci0JZGV2LT50eXBlc1s2XSA9IF9EUk1fU1RBVF9JUlE7Ci0JZGV2LT50eXBlc1s3XSA9IF9EUk1fU1RBVF9QUklNQVJZOwotCWRldi0+dHlwZXNbOF0gPSBfRFJNX1NUQVRfU0VDT05EQVJZOwotCi0JRFJNX0lORk8oIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkOiAlc1xuIiwKLQkJIERSSVZFUl9OQU1FLAotCQkgRFJJVkVSX01BSk9SLAotCQkgRFJJVkVSX01JTk9SLAotCQkgRFJJVkVSX1BBVENITEVWRUwsCi0JCSBEUklWRVJfREFURSwgZGV2LT5wcmltYXJ5Lm1pbm9yLCBwY2lfcHJldHR5X25hbWUoZGV2LT5wZGV2KQotCSAgICApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZlcnNpb24oZHJtX3ZlcnNpb25fdCAqIHZlcnNpb24pCi17Ci0JaW50IGxlbjsKLQotCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBEUklWRVJfTUFKT1I7Ci0JdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IERSSVZFUl9NSU5PUjsKLQl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTDsKLQlEUk1fQ09QWSh2ZXJzaW9uLT5uYW1lLCBEUklWRVJfTkFNRSk7Ci0JRFJNX0NPUFkodmVyc2lvbi0+ZGF0ZSwgRFJJVkVSX0RBVEUpOwotCURSTV9DT1BZKHZlcnNpb24tPmRlc2MsIERSSVZFUl9ERVNDKTsKLQlyZXR1cm4gMDsKLX0KIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0gewogCW1nYV9QQ0lfSURTCkBAIC04MCwxMiArNDUsMTIgQEAKIAogc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVyIGRyaXZlciA9IHsKIAkuZHJpdmVyX2ZlYXR1cmVzID0KLQkgICAgRFJJVkVSX1VTRV9BR1AgfCBEUklWRVJfUkVRVUlSRV9BR1AgfCBEUklWRVJfVVNFX01UUlIgfAorCSAgICBEUklWRVJfVVNFX0FHUCB8IERSSVZFUl9VU0VfTVRSUiB8IERSSVZFUl9QQ0lfRE1BIHwKIAkgICAgRFJJVkVSX0hBVkVfRE1BIHwgRFJJVkVSX0hBVkVfSVJRIHwgRFJJVkVSX0lSUV9TSEFSRUQgfAogCSAgICBEUklWRVJfSVJRX1ZCTCwKLQkucHJlaW5pdCA9IG1nYV9kcml2ZXJfcHJlaW5pdCwKLQkucG9zdGNsZWFudXAgPSBtZ2FfZHJpdmVyX3Bvc3RjbGVhbnVwLAotCS5wcmV0YWtlZG93biA9IG1nYV9kcml2ZXJfcHJldGFrZWRvd24sCisJLmxvYWQgPSBtZ2FfZHJpdmVyX2xvYWQsCisJLnVubG9hZCA9IG1nYV9kcml2ZXJfdW5sb2FkLAorCS5sYXN0Y2xvc2UgPSBtZ2FfZHJpdmVyX2xhc3RjbG9zZSwKIAkuZG1hX3F1aWVzY2VudCA9IG1nYV9kcml2ZXJfZG1hX3F1aWVzY2VudCwKIAkuZGV2aWNlX2lzX2FncCA9IG1nYV9kcml2ZXJfZGV2aWNlX2lzX2FncCwKIAkudmJsYW5rX3dhaXQgPSBtZ2FfZHJpdmVyX3ZibGFua193YWl0LApAQCAtOTYsOCArNjEsNiBAQAogCS5yZWNsYWltX2J1ZmZlcnMgPSBkcm1fY29yZV9yZWNsYWltX2J1ZmZlcnMsCiAJLmdldF9tYXBfb2ZzID0gZHJtX2NvcmVfZ2V0X21hcF9vZnMsCiAJLmdldF9yZWdfb2ZzID0gZHJtX2NvcmVfZ2V0X3JlZ19vZnMsCi0JLnBvc3Rpbml0ID0gcG9zdGluaXQsCi0JLnZlcnNpb24gPSB2ZXJzaW9uLAogCS5pb2N0bHMgPSBtZ2FfaW9jdGxzLAogCS5kbWFfaW9jdGwgPSBtZ2FfZG1hX2J1ZmZlcnMsCiAJLmZvcHMgPSB7CkBAIC0xMTMsOSArNzYsMTYgQEAKICNlbmRpZgogCQkgfSwKIAkucGNpX2RyaXZlciA9IHsKLQkJICAgICAgIC5uYW1lID0gRFJJVkVSX05BTUUsCi0JCSAgICAgICAuaWRfdGFibGUgPSBwY2lpZGxpc3QsCi0JCSAgICAgICB9CisJCSAubmFtZSA9IERSSVZFUl9OQU1FLAorCQkgLmlkX3RhYmxlID0gcGNpaWRsaXN0LAorCX0sCisKKwkubmFtZSA9IERSSVZFUl9OQU1FLAorCS5kZXNjID0gRFJJVkVSX0RFU0MsCisJLmRhdGUgPSBEUklWRVJfREFURSwKKwkubWFqb3IgPSBEUklWRVJfTUFKT1IsCisJLm1pbm9yID0gRFJJVkVSX01JTk9SLAorCS5wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUwsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBtZ2FfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuaAppbmRleCA0NjE3MjhlLi42YjBjNTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuaApAQCAtMzgsMTEgKzM4LDExIEBACiAKICNkZWZpbmUgRFJJVkVSX05BTUUJCSJtZ2EiCiAjZGVmaW5lIERSSVZFUl9ERVNDCQkiTWF0cm94IEcyMDAvRzQwMCIKLSNkZWZpbmUgRFJJVkVSX0RBVEUJCSIyMDA1MDYwNyIKKyNkZWZpbmUgRFJJVkVSX0RBVEUJCSIyMDA1MTEwMiIKIAogI2RlZmluZSBEUklWRVJfTUFKT1IJCTMKICNkZWZpbmUgRFJJVkVSX01JTk9SCQkyCi0jZGVmaW5lIERSSVZFUl9QQVRDSExFVkVMCTAKKyNkZWZpbmUgRFJJVkVSX1BBVENITEVWRUwJMQogCiB0eXBlZGVmIHN0cnVjdCBkcm1fbWdhX3ByaW1hcnlfYnVmZmVyIHsKIAl1OCAqc3RhcnQ7CkBAIC0xNDQsMjIgKzE0NCwyMiBAQAogCWRybV9sb2NhbF9tYXBfdCAqcHJpbWFyeTsKIAlkcm1fbG9jYWxfbWFwX3QgKmFncF90ZXh0dXJlczsKIAotCURSTV9BR1BfTUVNICphZ3BfbWVtOwotCXVuc2lnbmVkIGludCBhZ3BfcGFnZXM7CisJdW5zaWduZWQgbG9uZyBhZ3BfaGFuZGxlOworCXVuc2lnbmVkIGludCBhZ3Bfc2l6ZTsKIH0gZHJtX21nYV9wcml2YXRlX3Q7CiAKIGV4dGVybiBkcm1faW9jdGxfZGVzY190IG1nYV9pb2N0bHNbXTsKIGV4dGVybiBpbnQgbWdhX21heF9pb2N0bDsKIAogCQkJCS8qIG1nYV9kbWEuYyAqLwotZXh0ZXJuIGludCBtZ2FfZHJpdmVyX3ByZWluaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIGV4dGVybiBpbnQgbWdhX2RtYV9ib290c3RyYXAoRFJNX0lPQ1RMX0FSR1MpOwogZXh0ZXJuIGludCBtZ2FfZG1hX2luaXQoRFJNX0lPQ1RMX0FSR1MpOwogZXh0ZXJuIGludCBtZ2FfZG1hX2ZsdXNoKERSTV9JT0NUTF9BUkdTKTsKIGV4dGVybiBpbnQgbWdhX2RtYV9yZXNldChEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gaW50IG1nYV9kbWFfYnVmZmVycyhEUk1fSU9DVExfQVJHUyk7Ci1leHRlcm4gaW50IG1nYV9kcml2ZXJfcG9zdGNsZWFudXAoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIG1nYV9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBpbnQgbWdhX2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2V4dGVybiBpbnQgbWdhX2RyaXZlcl91bmxvYWQoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIG1nYV9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldik7CiBleHRlcm4gaW50IG1nYV9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpOwogCiBleHRlcm4gaW50IG1nYV9kb193YWl0X2Zvcl9pZGxlKGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfaW9jMzIuYyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2lvYzMyLmMKaW5kZXggMjRhOWQ0ZS4uNTRhMThlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfaW9jMzIuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9pb2MzMi5jCkBAIC0zMSw3ICszMSw2IEBACiAgKiBJTiBUSEUgU09GVFdBUkUuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CiAKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9zdGF0ZS5jIGIvZHJpdmVycy9jaGFyL2RybS9tZ2Ffc3RhdGUuYwppbmRleCA0N2Y1NGI1Li4yODM3ZTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9zdGF0ZS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX3N0YXRlLmMKQEAgLTExMjcsMTkgKzExMjcsMTkgQEAKIH0KIAogZHJtX2lvY3RsX2Rlc2NfdCBtZ2FfaW9jdGxzW10gPSB7Ci0JW0RSTV9JT0NUTF9OUihEUk1fTUdBX0lOSVQpXSA9IHttZ2FfZG1hX2luaXQsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX01HQV9GTFVTSCldID0ge21nYV9kbWFfZmx1c2gsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX01HQV9SRVNFVCldID0ge21nYV9kbWFfcmVzZXQsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX01HQV9TV0FQKV0gPSB7bWdhX2RtYV9zd2FwLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9NR0FfQ0xFQVIpXSA9IHttZ2FfZG1hX2NsZWFyLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9NR0FfVkVSVEVYKV0gPSB7bWdhX2RtYV92ZXJ0ZXgsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX01HQV9JTkRJQ0VTKV0gPSB7bWdhX2RtYV9pbmRpY2VzLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9NR0FfSUxPQUQpXSA9IHttZ2FfZG1hX2lsb2FkLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9NR0FfQkxJVCldID0ge21nYV9kbWFfYmxpdCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fTUdBX0dFVFBBUkFNKV0gPSB7bWdhX2dldHBhcmFtLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9NR0FfU0VUX0ZFTkNFKV0gPSB7bWdhX3NldF9mZW5jZSwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fTUdBX1dBSVRfRkVOQ0UpXSA9IHttZ2Ffd2FpdF9mZW5jZSwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fTUdBX0RNQV9CT09UU1RSQVApXSA9IHttZ2FfZG1hX2Jvb3RzdHJhcCwgMSwgMX0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0lOSVQpXSA9IHttZ2FfZG1hX2luaXQsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX0ZMVVNIKV0gPSB7bWdhX2RtYV9mbHVzaCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX01HQV9SRVNFVCldID0ge21nYV9kbWFfcmVzZXQsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9NR0FfU1dBUCldID0ge21nYV9kbWFfc3dhcCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX01HQV9DTEVBUildID0ge21nYV9kbWFfY2xlYXIsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9NR0FfVkVSVEVYKV0gPSB7bWdhX2RtYV92ZXJ0ZXgsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9NR0FfSU5ESUNFUyldID0ge21nYV9kbWFfaW5kaWNlcywgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX01HQV9JTE9BRCldID0ge21nYV9kbWFfaWxvYWQsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9NR0FfQkxJVCldID0ge21nYV9kbWFfYmxpdCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX01HQV9HRVRQQVJBTSldID0ge21nYV9nZXRwYXJhbSwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX01HQV9TRVRfRkVOQ0UpXSA9IHttZ2Ffc2V0X2ZlbmNlLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fTUdBX1dBSVRfRkVOQ0UpXSA9IHttZ2Ffd2FpdF9mZW5jZSwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX01HQV9ETUFfQk9PVFNUUkFQKV0gPSB7bWdhX2RtYV9ib290c3RyYXAsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCiB9OwogCiBpbnQgbWdhX21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKG1nYV9pb2N0bHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2NjZS5jIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2NjZS5jCmluZGV4IDc0NTI3NTMuLmRiNWE2MDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9jY2UuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfY2NlLmMKQEAgLTEsNiArMSw3IEBACi0vKiByMTI4X2NjZS5jIC0tIEFUSSBSYWdlIDEyOCBkcml2ZXIgLSotIGxpbnV4LWMgLSotCisvKiByMTI4X2NjZS5jIC0tIEFUSSBSYWdlIDEyOCBkcml2ZXIgLSotIGxpbnV4LWMgLSotIAogICogQ3JlYXRlZDogV2VkIEFwciAgNSAxOToyNDoxOSAyMDAwIGJ5IGtldmluQHByZWNpc2lvbmluc2lnaHQuY29tCi0gKgorICovCisvKgogICogQ29weXJpZ2h0IDIwMDAgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgogICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgogICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KQEAgLTU1OSw3ICs1NjAsOCBAQAogCWlmIChkZXZfcHJpdi0+aXNfcGNpKSB7CiAjZW5kaWYKIAkJZGV2X3ByaXYtPmdhcnRfaW5mby5nYXJ0X3RhYmxlX2xvY2F0aW9uID0gRFJNX0FUSV9HQVJUX01BSU47Ci0JCWRldl9wcml2LT5nYXJ0X2luZm8uYWRkciA9IGRldl9wcml2LT5nYXJ0X2luZm8uYnVzX2FkZHIgPSAwOworCQlkZXZfcHJpdi0+Z2FydF9pbmZvLmFkZHIgPSBOVUxMOworCQlkZXZfcHJpdi0+Z2FydF9pbmZvLmJ1c19hZGRyID0gMDsKIAkJZGV2X3ByaXYtPmdhcnRfaW5mby5pc19wY2llID0gMDsKIAkJaWYgKCFkcm1fYXRpX3BjaWdhcnRfaW5pdChkZXYsICZkZXZfcHJpdi0+Z2FydF9pbmZvKSkgewogCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gaW5pdCBQQ0kgR0FSVCFcbiIpOwpAQCAtNjAxLDE1ICs2MDMsMTYgQEAKIAkJCQlkcm1fY29yZV9pb3JlbWFwZnJlZShkZXZfcHJpdi0+Y2NlX3JpbmcsIGRldik7CiAJCQlpZiAoZGV2X3ByaXYtPnJpbmdfcnB0ciAhPSBOVUxMKQogCQkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKGRldl9wcml2LT5yaW5nX3JwdHIsIGRldik7Ci0JCQlpZiAoZGV2LT5hZ3BfYnVmZmVyX21hcCAhPSBOVUxMKQorCQkJaWYgKGRldi0+YWdwX2J1ZmZlcl9tYXAgIT0gTlVMTCkgewogCQkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKGRldi0+YWdwX2J1ZmZlcl9tYXAsIGRldik7CisJCQkJZGV2LT5hZ3BfYnVmZmVyX21hcCA9IE5VTEw7CisJCQl9CiAJCX0gZWxzZQogI2VuZGlmCiAJCXsKIAkJCWlmIChkZXZfcHJpdi0+Z2FydF9pbmZvLmJ1c19hZGRyKQogCQkJCWlmICghZHJtX2F0aV9wY2lnYXJ0X2NsZWFudXAoZGV2LAotCQkJCQkJCSAgICAgJmRldl9wcml2LT4KLQkJCQkJCQkgICAgIGdhcnRfaW5mbykpCisJCQkJCQkJJmRldl9wcml2LT5nYXJ0X2luZm8pKQogCQkJCQlEUk1fRVJST1IKIAkJCQkJICAgICgiZmFpbGVkIHRvIGNsZWFudXAgUENJIEdBUlQhXG4iKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2RybS5oCmluZGV4IDVkZGMwMzIuLjVkODM1YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJtLmgKQEAgLTEsNyArMSw3IEBACiAvKiByMTI4X2RybS5oIC0tIFB1YmxpYyBoZWFkZXIgZm9yIHRoZSByMTI4IGRyaXZlciAtKi0gbGludXgtYyAtKi0KICAqIENyZWF0ZWQ6IFdlZCBBcHIgIDUgMTk6MjQ6MTkgMjAwMCBieSBrZXZpbkBwcmVjaXNpb25pbnNpZ2h0LmNvbQotICoKLSAqIENvcHlyaWdodCAyMDAwIFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqLworLyogQ29weXJpZ2h0IDIwMDAgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgogICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmMKaW5kZXggMTY2MWU3My4uZTIwNDUwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuYwpAQCAtMzcsMzEgKzM3LDYgQEAKIAogI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKIAotc3RhdGljIGludCBwb3N0aW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCURSTV9JTkZPKCJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBvbiBtaW5vciAlZDogJXNcbiIsCi0JCSBEUklWRVJfTkFNRSwKLQkJIERSSVZFUl9NQUpPUiwKLQkJIERSSVZFUl9NSU5PUiwKLQkJIERSSVZFUl9QQVRDSExFVkVMLAotCQkgRFJJVkVSX0RBVEUsIGRldi0+cHJpbWFyeS5taW5vciwgcGNpX3ByZXR0eV9uYW1lKGRldi0+cGRldikKLQkgICAgKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZXJzaW9uKGRybV92ZXJzaW9uX3QgKiB2ZXJzaW9uKQotewotCWludCBsZW47Ci0KLQl2ZXJzaW9uLT52ZXJzaW9uX21ham9yID0gRFJJVkVSX01BSk9SOwotCXZlcnNpb24tPnZlcnNpb25fbWlub3IgPSBEUklWRVJfTUlOT1I7Ci0JdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUw7Ci0JRFJNX0NPUFkodmVyc2lvbi0+bmFtZSwgRFJJVkVSX05BTUUpOwotCURSTV9DT1BZKHZlcnNpb24tPmRhdGUsIERSSVZFUl9EQVRFKTsKLQlEUk1fQ09QWSh2ZXJzaW9uLT5kZXNjLCBEUklWRVJfREVTQyk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lpZGxpc3RbXSA9IHsKIAlyMTI4X1BDSV9JRFMKIH07CkBAIC03Miw4ICs0Nyw4IEBACiAJICAgIERSSVZFUl9IQVZFX0RNQSB8IERSSVZFUl9IQVZFX0lSUSB8IERSSVZFUl9JUlFfU0hBUkVEIHwKIAkgICAgRFJJVkVSX0lSUV9WQkwsCiAJLmRldl9wcml2X3NpemUgPSBzaXplb2YoZHJtX3IxMjhfYnVmX3ByaXZfdCksCi0JLnByZXJlbGVhc2UgPSByMTI4X2RyaXZlcl9wcmVyZWxlYXNlLAotCS5wcmV0YWtlZG93biA9IHIxMjhfZHJpdmVyX3ByZXRha2Vkb3duLAorCS5wcmVjbG9zZSA9IHIxMjhfZHJpdmVyX3ByZWNsb3NlLAorCS5sYXN0Y2xvc2UgPSByMTI4X2RyaXZlcl9sYXN0Y2xvc2UsCiAJLnZibGFua193YWl0ID0gcjEyOF9kcml2ZXJfdmJsYW5rX3dhaXQsCiAJLmlycV9wcmVpbnN0YWxsID0gcjEyOF9kcml2ZXJfaXJxX3ByZWluc3RhbGwsCiAJLmlycV9wb3N0aW5zdGFsbCA9IHIxMjhfZHJpdmVyX2lycV9wb3N0aW5zdGFsbCwKQEAgLTgyLDggKzU3LDYgQEAKIAkucmVjbGFpbV9idWZmZXJzID0gZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzLAogCS5nZXRfbWFwX29mcyA9IGRybV9jb3JlX2dldF9tYXBfb2ZzLAogCS5nZXRfcmVnX29mcyA9IGRybV9jb3JlX2dldF9yZWdfb2ZzLAotCS5wb3N0aW5pdCA9IHBvc3Rpbml0LAotCS52ZXJzaW9uID0gdmVyc2lvbiwKIAkuaW9jdGxzID0gcjEyOF9pb2N0bHMsCiAJLmRtYV9pb2N0bCA9IHIxMjhfY2NlX2J1ZmZlcnMsCiAJLmZvcHMgPSB7CkBAIC05NywxMiArNzAsMTkgQEAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJCSAuY29tcGF0X2lvY3RsID0gcjEyOF9jb21wYXRfaW9jdGwsCiAjZW5kaWYKLQkJIH0KLQksCisJfSwKKwogCS5wY2lfZHJpdmVyID0gewotCQkgICAgICAgLm5hbWUgPSBEUklWRVJfTkFNRSwKLQkJICAgICAgIC5pZF90YWJsZSA9IHBjaWlkbGlzdCwKLQkJICAgICAgIH0KKwkJIC5uYW1lID0gRFJJVkVSX05BTUUsCisJCSAuaWRfdGFibGUgPSBwY2lpZGxpc3QsCisJfSwKKworCS5uYW1lID0gRFJJVkVSX05BTUUsCisJLmRlc2MgPSBEUklWRVJfREVTQywKKwkuZGF0ZSA9IERSSVZFUl9EQVRFLAorCS5tYWpvciA9IERSSVZFUl9NQUpPUiwKKwkubWlub3IgPSBEUklWRVJfTUlOT1IsCisJLnBhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTCwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHIxMjhfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5oCmluZGV4IDVjNzllNDAuLjk0YWJmZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmgKQEAgLTEsNyArMSw3IEBACiAvKiByMTI4X2Rydi5oIC0tIFByaXZhdGUgaGVhZGVyIGZvciByMTI4IGRyaXZlciAtKi0gbGludXgtYyAtKi0KICAqIENyZWF0ZWQ6IE1vbiBEZWMgMTMgMDk6NTE6MTEgMTk5OSBieSBmYWl0aEBwcmVjaXNpb25pbnNpZ2h0LmNvbQotICoKLSAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KKyAqLworLyogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgogICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCkBAIC0xNTQsOCArMTU0LDggQEAKIGV4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7CiBleHRlcm4gdm9pZCByMTI4X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKIGV4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIHIxMjhfZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCByMTI4X2RyaXZlcl9wcmVyZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKTsKK2V4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApOwogCiBleHRlcm4gbG9uZyByMTI4X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9pb2MzMi5jIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2lvYzMyLmMKaW5kZXggMWUyZTM2Ny4uOWRkNmQ0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2lvYzMyLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2lvYzMyLmMKQEAgLTMwLDcgKzMwLDYgQEAKICAqIElOIFRIRSBTT0ZUV0FSRS4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvY3RsMzIuaD4KIAogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm0uaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9pcnEuYwppbmRleCAyN2ViMGUzLi44N2Y4Y2EyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfaXJxLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2lycS5jCkBAIC0xLDUgKzEsNSBAQAotLyogcjEyOF9pcnEuYyAtLSBJUlEgaGFuZGxpbmcgZm9yIHJhZGVvbiAtKi0gbGludXgtYyAtKi0KLSAqCisvKiByMTI4X2lycS5jIC0tIElSUSBoYW5kbGluZyBmb3IgcmFkZW9uIC0qLSBsaW51eC1jIC0qLSAqLworLyoKICAqIENvcHlyaWdodCAoQykgVGhlIFdlYXRoZXIgQ2hhbm5lbCwgSW5jLiAgMjAwMi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogVGhlIFdlYXRoZXIgQ2hhbm5lbCAoVE0pIGZ1bmRlZCBUdW5nc3RlbiBHcmFwaGljcyB0byBkZXZlbG9wIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYwppbmRleCAxNDQ3OWNjLi5hMDgwY2RkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYwpAQCAtMSw3ICsxLDcgQEAKIC8qIHIxMjhfc3RhdGUuYyAtLSBTdGF0ZSBzdXBwb3J0IGZvciByMTI4IC0qLSBsaW51eC1jIC0qLQogICogQ3JlYXRlZDogVGh1IEphbiAyNyAwMjo1Mzo0MyAyMDAwIGJ5IGdhcmV0aEB2YWxpbnV4LmNvbQotICoKLSAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KKyAqLworLyogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgogICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQpAQCAtMjIwLDcgKzIyMCw3IEBACiAJQURWQU5DRV9SSU5HKCk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgcjEyOF9lbWl0X3N0YXRlKGRybV9yMTI4X3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIHZvaWQgcjEyOF9lbWl0X3N0YXRlKGRybV9yMTI4X3ByaXZhdGVfdCAqIGRldl9wcml2KQogewogCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAl1bnNpZ25lZCBpbnQgZGlydHkgPSBzYXJlYV9wcml2LT5kaXJ0eTsKQEAgLTE2NzQsNyArMTY3NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgcjEyOF9kcml2ZXJfcHJlcmVsZWFzZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCkKK3ZvaWQgcjEyOF9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApCiB7CiAJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKIAkJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xNjg0LDI5ICsxNjg0LDI5IEBACiAJfQogfQogCi12b2lkIHIxMjhfZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgcjEyOF9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldikKIHsKIAlyMTI4X2RvX2NsZWFudXBfY2NlKGRldik7CiB9CiAKIGRybV9pb2N0bF9kZXNjX3QgcjEyOF9pb2N0bHNbXSA9IHsKLQlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X0lOSVQpXSA9IHtyMTI4X2NjZV9pbml0LCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X0NDRV9TVEFSVCldID0ge3IxMjhfY2NlX3N0YXJ0LCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X0NDRV9TVE9QKV0gPSB7cjEyOF9jY2Vfc3RvcCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9DQ0VfUkVTRVQpXSA9IHtyMTI4X2NjZV9yZXNldCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9DQ0VfSURMRSldID0ge3IxMjhfY2NlX2lkbGUsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfUkVTRVQpXSA9IHtyMTI4X2VuZ2luZV9yZXNldCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9GVUxMU0NSRUVOKV0gPSB7cjEyOF9mdWxsc2NyZWVuLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X1NXQVApXSA9IHtyMTI4X2NjZV9zd2FwLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X0ZMSVApXSA9IHtyMTI4X2NjZV9mbGlwLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X0NMRUFSKV0gPSB7cjEyOF9jY2VfY2xlYXIsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfVkVSVEVYKV0gPSB7cjEyOF9jY2VfdmVydGV4LCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X0lORElDRVMpXSA9IHtyMTI4X2NjZV9pbmRpY2VzLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X0JMSVQpXSA9IHtyMTI4X2NjZV9ibGl0LCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X0RFUFRIKV0gPSB7cjEyOF9jY2VfZGVwdGgsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfU1RJUFBMRSldID0ge3IxMjhfY2NlX3N0aXBwbGUsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfSU5ESVJFQ1QpXSA9IHtyMTI4X2NjZV9pbmRpcmVjdCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9HRVRQQVJBTSldID0ge3IxMjhfZ2V0cGFyYW0sIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfSU5JVCldID0ge3IxMjhfY2NlX2luaXQsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9DQ0VfU1RBUlQpXSA9IHtyMTI4X2NjZV9zdGFydCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X0NDRV9TVE9QKV0gPSB7cjEyOF9jY2Vfc3RvcCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X0NDRV9SRVNFVCldID0ge3IxMjhfY2NlX3Jlc2V0LCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfQ0NFX0lETEUpXSA9IHtyMTI4X2NjZV9pZGxlLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9SRVNFVCldID0ge3IxMjhfZW5naW5lX3Jlc2V0LCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9GVUxMU0NSRUVOKV0gPSB7cjEyOF9mdWxsc2NyZWVuLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9TV0FQKV0gPSB7cjEyOF9jY2Vfc3dhcCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfRkxJUCldID0ge3IxMjhfY2NlX2ZsaXAsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X0NMRUFSKV0gPSB7cjEyOF9jY2VfY2xlYXIsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X1ZFUlRFWCldID0ge3IxMjhfY2NlX3ZlcnRleCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfSU5ESUNFUyldID0ge3IxMjhfY2NlX2luZGljZXMsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X0JMSVQpXSA9IHtyMTI4X2NjZV9ibGl0LCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9ERVBUSCldID0ge3IxMjhfY2NlX2RlcHRoLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUjEyOF9TVElQUExFKV0gPSB7cjEyOF9jY2Vfc3RpcHBsZSwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1IxMjhfSU5ESVJFQ1QpXSA9IHtyMTI4X2NjZV9pbmRpcmVjdCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SMTI4X0dFVFBBUkFNKV0gPSB7cjEyOF9nZXRwYXJhbSwgRFJNX0FVVEh9LAogfTsKIAogaW50IHIxMjhfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUocjEyOF9pb2N0bHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMzAwX2NtZGJ1Zi5jIGIvZHJpdmVycy9jaGFyL2RybS9yMzAwX2NtZGJ1Zi5jCmluZGV4IDNhMWFjNWYuLjI5MWRiZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcjMwMF9jbWRidWYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfY21kYnVmLmMKQEAgLTUyLDggKzUyLDggQEAKICAqIEVtaXQgdXAgdG8gUjMwMF9TSU1VTFRBTkVPVVNfQ0xJUFJFQ1RTIGNsaXByZWN0cyBmcm9tIHRoZSBnaXZlbiBjb21tYW5kCiAgKiBidWZmZXIsIHN0YXJ0aW5nIHdpdGggaW5kZXggbi4KICAqLwotc3RhdGljIGludCByMzAwX2VtaXRfY2xpcHJlY3RzKGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkgICAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICogY21kYnVmLCBpbnQgbikKK3N0YXRpYyBpbnQgcjMwMF9lbWl0X2NsaXByZWN0cyhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkgICAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYsIGludCBuKQogewogCWRybV9jbGlwX3JlY3RfdCBib3g7CiAJaW50IG5yOwpAQCAtMjE2LDYgKzIxNiw3IEBACiAJQUREX1JBTkdFKFIzMDBfVFhfVU5LMV8wLCAxNik7CiAJQUREX1JBTkdFKFIzMDBfVFhfU0laRV8wLCAxNik7CiAJQUREX1JBTkdFKFIzMDBfVFhfRk9STUFUXzAsIDE2KTsKKwlBRERfUkFOR0UoUjMwMF9UWF9QSVRDSF8wLCAxNik7CiAJLyogVGV4dHVyZSBvZmZzZXQgaXMgZGFuZ2Vyb3VzIGFuZCBuZWVkcyBtb3JlIGNoZWNraW5nICovCiAJQUREX1JBTkdFX01BUksoUjMwMF9UWF9PRkZTRVRfMCwgMTYsIE1BUktfQ0hFQ0tfT0ZGU0VUKTsKIAlBRERfUkFOR0UoUjMwMF9UWF9VTks0XzAsIDE2KTsKQEAgLTI0Miw3ICsyNDMsNyBAQAogCiAgIC8qIHdlIGV4cGVjdCBvZmZzZXRzIHBhc3NlZCB0byB0aGUgZnJhbWVidWZmZXIgdG8gYmUgZWl0aGVyIHdpdGhpbiB2aWRlbyBtZW1vcnkgb3IKICAgICAgd2l0aGluIEFHUCBzcGFjZSAqLwotc3RhdGljIF9faW5saW5lX18gaW50IHIzMDBfY2hlY2tfb2Zmc2V0KGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcjMwMF9jaGVja19vZmZzZXQoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAogCQkJCQl1MzIgb2Zmc2V0KQogewogCS8qIHdlIHJlYWx5IHdhbnQgdG8gY2hlY2sgYWdhaW5zdCBlbmQgb2YgdmlkZW8gYXBlcnR1cmUKQEAgLTMxNyw4ICszMTgsOCBAQAogICoKICAqIE5vdGUgdGhhdCBjaGVja3MgYXJlIHBlcmZvcm1lZCBvbiBjb250ZW50cyBhbmQgYWRkcmVzc2VzIG9mIHRoZSByZWdpc3RlcnMKICAqLwotc3RhdGljIF9faW5saW5lX18gaW50IHIzMDBfZW1pdF9wYWNrZXQwKGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkJCWRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqIGNtZGJ1ZiwKK3N0YXRpYyBfX2lubGluZV9fIGludCByMzAwX2VtaXRfcGFja2V0MChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJCWRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqY21kYnVmLAogCQkJCQlkcm1fcjMwMF9jbWRfaGVhZGVyX3QgaGVhZGVyKQogewogCWludCByZWc7CkBAIC0zNjMsOCArMzY0LDggQEAKICAqIHRoZSBncmFwaGljcyBjYXJkLgogICogQ2FsbGVkIGJ5IHIzMDBfZG9fY3BfY21kYnVmLgogICovCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgcjMwMF9lbWl0X3ZwdShkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJCSAgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKiBjbWRidWYsCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcjMwMF9lbWl0X3ZwdShkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJICAgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqY21kYnVmLAogCQkJCSAgICBkcm1fcjMwMF9jbWRfaGVhZGVyX3QgaGVhZGVyKQogewogCWludCBzejsKQEAgLTQwMCw4ICs0MDEsOCBAQAogICogRW1pdCBhIGNsZWFyIHBhY2tldCBmcm9tIHVzZXJzcGFjZS4KICAqIENhbGxlZCBieSByMzAwX2VtaXRfcGFja2V0My4KICAqLwotc3RhdGljIF9faW5saW5lX18gaW50IHIzMDBfZW1pdF9jbGVhcihkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJCSAgICAgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqIGNtZGJ1ZikKK3N0YXRpYyBfX2lubGluZV9fIGludCByMzAwX2VtaXRfY2xlYXIoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJCSAgICAgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqY21kYnVmKQogewogCVJJTkdfTE9DQUxTOwogCkBAIC00MjEsOCArNDIyLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50IHIzMDBfZW1pdF8zZF9sb2FkX3ZicG50cihkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJCQkgICAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICogY21kYnVmLAorc3RhdGljIF9faW5saW5lX18gaW50IHIzMDBfZW1pdF8zZF9sb2FkX3ZicG50cihkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJCSAgICAgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKmNtZGJ1ZiwKIAkJCQkJICAgICAgIHUzMiBoZWFkZXIpCiB7CiAJaW50IGNvdW50LCBpLCBrOwpAQCAtNDg5LDggKzQ5MCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCByMzAwX2VtaXRfcmF3X3BhY2tldDMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCQkJICAgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqIGNtZGJ1ZikKK3N0YXRpYyBfX2lubGluZV9fIGludCByMzAwX2VtaXRfcmF3X3BhY2tldDMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJCQkgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYpCiB7CiAJdTMyIGhlYWRlcjsKIAlpbnQgY291bnQ7CkBAIC01NTQsOCArNTU1LDggQEAKICAqIEVtaXQgYSByZW5kZXJpbmcgcGFja2V0MyBmcm9tIHVzZXJzcGFjZS4KICAqIENhbGxlZCBieSByMzAwX2RvX2NwX2NtZGJ1Zi4KICAqLwotc3RhdGljIF9faW5saW5lX18gaW50IHIzMDBfZW1pdF9wYWNrZXQzKGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkJCWRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqIGNtZGJ1ZiwKK3N0YXRpYyBfX2lubGluZV9fIGludCByMzAwX2VtaXRfcGFja2V0Myhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJCWRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqY21kYnVmLAogCQkJCQlkcm1fcjMwMF9jbWRfaGVhZGVyX3QgaGVhZGVyKQogewogCWludCBuOwpAQCAtNjIzLDcgKzYyNCw3IEBACiAvKioKICAqIEVtaXQgdGhlIHNlcXVlbmNlIHRvIHBhY2lmeSBSMzAwLgogICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHIzMDBfcGFjaWZ5KGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHIzMDBfcGFjaWZ5KGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdikKIHsKIAlSSU5HX0xPQ0FMUzsKIApAQCAtNjU3LDkgKzY1OCwxMCBAQAogICogY29tbWFuZHMgb24gdGhlIERNQSByaW5nIGJ1ZmZlci4KICAqIENhbGxlZCBieSB0aGUgaW9jdGwgaGFuZGxlciBmdW5jdGlvbiByYWRlb25fY3BfY21kYnVmLgogICovCi1pbnQgcjMwMF9kb19jcF9jbWRidWYoZHJtX2RldmljZV90ICogZGV2LAoraW50IHIzMDBfZG9fY3BfY21kYnVmKGRybV9kZXZpY2VfdCAqZGV2LAogCQkgICAgICBEUk1GSUxFIGZpbHAsCi0JCSAgICAgIGRybV9maWxlX3QgKiBmaWxwX3ByaXYsIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqIGNtZGJ1ZikKKwkJICAgICAgZHJtX2ZpbGVfdCAqZmlscF9wcml2LAorCQkgICAgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKmNtZGJ1ZikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMzAwX3JlZy5oIGIvZHJpdmVycy9jaGFyL2RybS9yMzAwX3JlZy5oCmluZGV4IGU1YjczYzAuLmEwZWQyMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcjMwMF9yZWcuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfcmVnLmgKQEAgLTc5Nyw2ICs3OTcsNyBAQAogCiAjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9ZVVZfTU9ERQkJMHgwMDgwMDAwMAogCisjZGVmaW5lIFIzMDBfVFhfUElUQ0hfMAkJCSAgICAweDQ1MDAKICNkZWZpbmUgUjMwMF9UWF9PRkZTRVRfMCAgICAgICAgICAgICAgICAgICAgMHg0NTQwCiAvKiBCRUdJTjogR3Vlc3MgZnJvbSBSMjAwICovCiAjICAgICAgIGRlZmluZSBSMzAwX1RYT19FTkRJQU5fTk9fU1dBUCAgICAgICAgICAgKDAgPDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2NwLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9jcC5jCmluZGV4IDM0MjMwMmQuLjkxNTY2NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2NwLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fY3AuYwpAQCAtMSw1ICsxLDUgQEAKLS8qIHJhZGVvbl9jcC5jIC0tIENQIHN1cHBvcnQgZm9yIFJhZGVvbiAtKi0gbGludXgtYyAtKi0KLSAqCisvKiByYWRlb25fY3AuYyAtLSBDUCBzdXBwb3J0IGZvciBSYWRlb24gLSotIGxpbnV4LWMgLSotICovCisvKgogICogQ29weXJpZ2h0IDIwMDAgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgogICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgRnJlbW9udCwgQ2FsaWZvcm5pYS4KICAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCkBAIC04MjQsNyArODI0LDcgQEAKIAlyZXR1cm4gUkFERU9OX1JFQUQoUkFERU9OX0NMT0NLX0NOVExfREFUQSk7CiB9CiAKLXN0YXRpYyBpbnQgUkFERU9OX1JFQURfUENJRShkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LCBpbnQgYWRkcikKK3N0YXRpYyBpbnQgUkFERU9OX1JFQURfUENJRShkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsIGludCBhZGRyKQogewogCVJBREVPTl9XUklURTgoUkFERU9OX1BDSUVfSU5ERVgsIGFkZHIgJiAweGZmKTsKIAlyZXR1cm4gUkFERU9OX1JFQUQoUkFERU9OX1BDSUVfREFUQSk7CkBAIC0xMTI1LDcgKzExMjUsNyBAQAogCQkgICAgIHwgKGRldl9wcml2LT5mYl9sb2NhdGlvbiA+PiAxNikpOwogCiAjaWYgX19PU19IQVNfQUdQCi0JaWYgKCFkZXZfcHJpdi0+aXNfcGNpKSB7CisJaWYgKGRldl9wcml2LT5mbGFncyAmIENISVBfSVNfQUdQKSB7CiAJCVJBREVPTl9XUklURShSQURFT05fTUNfQUdQX0xPQ0FUSU9OLAogCQkJICAgICAoKChkZXZfcHJpdi0+Z2FydF92bV9zdGFydCAtIDEgKwogCQkJCWRldl9wcml2LT5nYXJ0X3NpemUpICYgMHhmZmZmMDAwMCkgfApAQCAtMTE1Miw3ICsxMTUyLDcgQEAKIAlkZXZfcHJpdi0+cmluZy50YWlsID0gY3VyX3JlYWRfcHRyOwogCiAjaWYgX19PU19IQVNfQUdQCi0JaWYgKCFkZXZfcHJpdi0+aXNfcGNpKSB7CisJaWYgKGRldl9wcml2LT5mbGFncyAmIENISVBfSVNfQUdQKSB7CiAJCS8qIHNldCBSQURFT05fQUdQX0JBU0UgaGVyZSBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gWCBmcm9tIHVzZXIgc3BhY2UgKi8KIAkJUkFERU9OX1dSSVRFKFJBREVPTl9BR1BfQkFTRSwgKHVuc2lnbmVkIGludClkZXYtPmFncC0+YmFzZSk7CiAJCVJBREVPTl9XUklURShSQURFT05fQ1BfUkJfUlBUUl9BRERSLApAQCAtMTI3OCwxMyArMTI3OCwxNSBAQAogLyogRW5hYmxlIG9yIGRpc2FibGUgUENJIEdBUlQgb24gdGhlIGNoaXAgKi8KIHN0YXRpYyB2b2lkIHJhZGVvbl9zZXRfcGNpZ2FydChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LCBpbnQgb24pCiB7Ci0JdTMyIHRtcCA9IFJBREVPTl9SRUFEKFJBREVPTl9BSUNfQ05UTCk7CisJdTMyIHRtcDsKIAogCWlmIChkZXZfcHJpdi0+ZmxhZ3MgJiBDSElQX0lTX1BDSUUpIHsKIAkJcmFkZW9uX3NldF9wY2llZ2FydChkZXZfcHJpdiwgb24pOwogCQlyZXR1cm47CiAJfQogCisgCXRtcCA9IFJBREVPTl9SRUFEKFJBREVPTl9BSUNfQ05UTCk7CisKIAlpZiAob24pIHsKIAkJUkFERU9OX1dSSVRFKFJBREVPTl9BSUNfQ05UTCwKIAkJCSAgICAgdG1wIHwgUkFERU9OX1BDSUdBUlRfVFJBTlNMQVRFX0VOKTsKQEAgLTEzMTIsMTMgKzEzMTQsMTcgQEAKIHN0YXRpYyBpbnQgcmFkZW9uX2RvX2luaXRfY3AoZHJtX2RldmljZV90ICogZGV2LCBkcm1fcmFkZW9uX2luaXRfdCAqIGluaXQpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwogCURSTV9ERUJVRygiXG4iKTsKIAotCWRldl9wcml2LT5pc19wY2kgPSBpbml0LT5pc19wY2k7CisJaWYgKGluaXQtPmlzX3BjaSAmJiAoZGV2X3ByaXYtPmZsYWdzICYgQ0hJUF9JU19BR1ApKQorCXsKKwkJRFJNX0RFQlVHKCJGb3JjaW5nIEFHUCBjYXJkIHRvIFBDSSBtb2RlXG4iKTsKKwkJZGV2X3ByaXYtPmZsYWdzICY9IH5DSElQX0lTX0FHUDsKKwl9CiAKLQlpZiAoZGV2X3ByaXYtPmlzX3BjaSAmJiAhZGV2LT5zZykgeworCWlmICgoIShkZXZfcHJpdi0+ZmxhZ3MgJiBDSElQX0lTX0FHUCkpICYmICFkZXYtPnNnKSB7CiAJCURSTV9FUlJPUigiUENJIEdBUlQgbWVtb3J5IG5vdCBhbGxvY2F0ZWQhXG4iKTsKLQkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CiAJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJfQpAQCAtMTMyNywxMiArMTMzMywxMSBAQAogCWlmIChkZXZfcHJpdi0+dXNlY190aW1lb3V0IDwgMSB8fAogCSAgICBkZXZfcHJpdi0+dXNlY190aW1lb3V0ID4gUkFERU9OX01BWF9VU0VDX1RJTUVPVVQpIHsKIAkJRFJNX0RFQlVHKCJUSU1FT1VUIHByb2JsZW0hXG4iKTsKLQkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CiAJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJfQogCi0Jc3dpdGNoIChpbml0LT5mdW5jKSB7CisJc3dpdGNoKGluaXQtPmZ1bmMpIHsKIAljYXNlIFJBREVPTl9JTklUX1IyMDBfQ1A6CiAJCWRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbiA9IFVDT0RFX1IyMDA7CiAJCWJyZWFrOwpAQCAtMTM1Myw3ICsxMzU4LDYgQEAKIAlpZiAoKGluaXQtPmNwX21vZGUgIT0gUkFERU9OX0NTUV9QUklCTV9JTkRESVMpICYmCiAJICAgIChpbml0LT5jcF9tb2RlICE9IFJBREVPTl9DU1FfUFJJQk1fSU5EQk0pKSB7CiAJCURSTV9ERUJVRygiQkFEIGNwX21vZGUgKCV4KSFcbiIsIGluaXQtPmNwX21vZGUpOwotCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKIAkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CkBAIC0xNDE2LDggKzE0MjAsNiBAQAogCiAJRFJNX0dFVFNBUkVBKCk7CiAKLQlkZXZfcHJpdi0+ZmJfb2Zmc2V0ID0gaW5pdC0+ZmJfb2Zmc2V0OwotCWRldl9wcml2LT5tbWlvX29mZnNldCA9IGluaXQtPm1taW9fb2Zmc2V0OwogCWRldl9wcml2LT5yaW5nX29mZnNldCA9IGluaXQtPnJpbmdfb2Zmc2V0OwogCWRldl9wcml2LT5yaW5nX3JwdHJfb2Zmc2V0ID0gaW5pdC0+cmluZ19ycHRyX29mZnNldDsKIAlkZXZfcHJpdi0+YnVmZmVyc19vZmZzZXQgPSBpbml0LT5idWZmZXJzX29mZnNldDsKQEAgLTE0MjUsMjkgKzE0MjcsMTkgQEAKIAogCWlmICghZGV2X3ByaXYtPnNhcmVhKSB7CiAJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgc2FyZWEhXG4iKTsKLQkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CiAJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJfQogCi0JZGV2X3ByaXYtPm1taW8gPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+bW1pb19vZmZzZXQpOwotCWlmICghZGV2X3ByaXYtPm1taW8pIHsKLQkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBtbWlvIHJlZ2lvbiFcbiIpOwotCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKLQkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKLQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKLQl9CiAJZGV2X3ByaXYtPmNwX3JpbmcgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+cmluZ19vZmZzZXQpOwogCWlmICghZGV2X3ByaXYtPmNwX3JpbmcpIHsKIAkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBjcCByaW5nIHJlZ2lvbiFcbiIpOwotCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKIAkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CiAJZGV2X3ByaXYtPnJpbmdfcnB0ciA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5yaW5nX3JwdHJfb2Zmc2V0KTsKIAlpZiAoIWRldl9wcml2LT5yaW5nX3JwdHIpIHsKIAkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCByaW5nIHJlYWQgcG9pbnRlciFcbiIpOwotCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKIAkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CkBAIC0xNDU1LDcgKzE0NDcsNiBAQAogCWRldi0+YWdwX2J1ZmZlcl9tYXAgPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+YnVmZmVyc19vZmZzZXQpOwogCWlmICghZGV2LT5hZ3BfYnVmZmVyX21hcCkgewogCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIGRtYSBidWZmZXIgcmVnaW9uIVxuIik7Ci0JCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OwogCQlyYWRlb25fZG9fY2xlYW51cF9jcChkZXYpOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KQEAgLTE0NjUsNyArMTQ1Niw2IEBACiAJCSAgICBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+Z2FydF90ZXh0dXJlc19vZmZzZXQpOwogCQlpZiAoIWRldl9wcml2LT5nYXJ0X3RleHR1cmVzKSB7CiAJCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIEdBUlQgdGV4dHVyZSByZWdpb24hXG4iKTsKLQkJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OwogCQkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKIAkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJCX0KQEAgLTE0NzYsNyArMTQ2Niw3IEBACiAJCQkJICAgIGluaXQtPnNhcmVhX3ByaXZfb2Zmc2V0KTsKIAogI2lmIF9fT1NfSEFTX0FHUAotCWlmICghZGV2X3ByaXYtPmlzX3BjaSkgeworCWlmIChkZXZfcHJpdi0+ZmxhZ3MgJiBDSElQX0lTX0FHUCkgewogCQlkcm1fY29yZV9pb3JlbWFwKGRldl9wcml2LT5jcF9yaW5nLCBkZXYpOwogCQlkcm1fY29yZV9pb3JlbWFwKGRldl9wcml2LT5yaW5nX3JwdHIsIGRldik7CiAJCWRybV9jb3JlX2lvcmVtYXAoZGV2LT5hZ3BfYnVmZmVyX21hcCwgZGV2KTsKQEAgLTE0ODQsNyArMTQ3NCw2IEBACiAJCSAgICAhZGV2X3ByaXYtPnJpbmdfcnB0ci0+aGFuZGxlIHx8CiAJCSAgICAhZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlKSB7CiAJCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIGlvcmVtYXAgYWdwIHJlZ2lvbnMhXG4iKTsKLQkJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OwogCQkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKIAkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJCX0KQEAgLTE1MjUsNyArMTUxNCw3IEBACiAJICAgICsgUkFERU9OX1JFQUQoUkFERU9OX0NPTkZJR19BUEVSX1NJWkUpOwogCiAjaWYgX19PU19IQVNfQUdQCi0JaWYgKCFkZXZfcHJpdi0+aXNfcGNpKQorCWlmIChkZXZfcHJpdi0+ZmxhZ3MgJiBDSElQX0lTX0FHUCkKIAkJZGV2X3ByaXYtPmdhcnRfYnVmZmVyc19vZmZzZXQgPSAoZGV2LT5hZ3BfYnVmZmVyX21hcC0+b2Zmc2V0CiAJCQkJCQkgLSBkZXYtPmFncC0+YmFzZQogCQkJCQkJICsgZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQpOwpAQCAtMTU1MSw3ICsxNTQwLDcgQEAKIAlkZXZfcHJpdi0+cmluZy5oaWdoX21hcmsgPSBSQURFT05fUklOR19ISUdIX01BUks7CiAKICNpZiBfX09TX0hBU19BR1AKLQlpZiAoIWRldl9wcml2LT5pc19wY2kpIHsKKwlpZiAoZGV2X3ByaXYtPmZsYWdzICYgQ0hJUF9JU19BR1ApIHsKIAkJLyogVHVybiBvZmYgUENJIEdBUlQgKi8KIAkJcmFkZW9uX3NldF9wY2lnYXJ0KGRldl9wcml2LCAwKTsKIAl9IGVsc2UKQEAgLTE1NjEsMjUgKzE1NTAsMjggQEAKIAkJaWYgKGRldl9wcml2LT5wY2lnYXJ0X29mZnNldCkgewogCQkJZGV2X3ByaXYtPmdhcnRfaW5mby5idXNfYWRkciA9CiAJCQkgICAgZGV2X3ByaXYtPnBjaWdhcnRfb2Zmc2V0ICsgZGV2X3ByaXYtPmZiX2xvY2F0aW9uOworCQkJZGV2X3ByaXYtPmdhcnRfaW5mby5tYXBwaW5nLm9mZnNldCA9CisJCQkgICAgZGV2X3ByaXYtPmdhcnRfaW5mby5idXNfYWRkcjsKKwkJCWRldl9wcml2LT5nYXJ0X2luZm8ubWFwcGluZy5zaXplID0KKwkJCSAgICBSQURFT05fUENJR0FSVF9UQUJMRV9TSVpFOworCisJCQlkcm1fY29yZV9pb3JlbWFwKCZkZXZfcHJpdi0+Z2FydF9pbmZvLm1hcHBpbmcsIGRldik7CiAJCQlkZXZfcHJpdi0+Z2FydF9pbmZvLmFkZHIgPQotCQkJICAgICh1bnNpZ25lZCBsb25nKWRybV9pb3JlbWFwKGRldl9wcml2LT5nYXJ0X2luZm8uCi0JCQkJCQkgICAgICAgYnVzX2FkZHIsCi0JCQkJCQkgICAgICAgUkFERU9OX1BDSUdBUlRfVEFCTEVfU0laRSwKLQkJCQkJCSAgICAgICBkZXYpOworCQkJICAgIGRldl9wcml2LT5nYXJ0X2luZm8ubWFwcGluZy5oYW5kbGU7CiAKIAkJCWRldl9wcml2LT5nYXJ0X2luZm8uaXNfcGNpZSA9CiAJCQkgICAgISEoZGV2X3ByaXYtPmZsYWdzICYgQ0hJUF9JU19QQ0lFKTsKIAkJCWRldl9wcml2LT5nYXJ0X2luZm8uZ2FydF90YWJsZV9sb2NhdGlvbiA9CiAJCQkgICAgRFJNX0FUSV9HQVJUX0ZCOwogCi0JCQlEUk1fREVCVUcoIlNldHRpbmcgcGh5c19wY2lfZ2FydCB0byAlMDhsWCAlMDhsWFxuIiwKKwkJCURSTV9ERUJVRygiU2V0dGluZyBwaHlzX3BjaV9nYXJ0IHRvICVwICUwOGxYXG4iLAogCQkJCSAgZGV2X3ByaXYtPmdhcnRfaW5mby5hZGRyLAogCQkJCSAgZGV2X3ByaXYtPnBjaWdhcnRfb2Zmc2V0KTsKIAkJfSBlbHNlIHsKIAkJCWRldl9wcml2LT5nYXJ0X2luZm8uZ2FydF90YWJsZV9sb2NhdGlvbiA9CiAJCQkgICAgRFJNX0FUSV9HQVJUX01BSU47Ci0JCQlkZXZfcHJpdi0+Z2FydF9pbmZvLmFkZHIgPQotCQkJICAgIGRldl9wcml2LT5nYXJ0X2luZm8uYnVzX2FkZHIgPSAwOworCQkJZGV2X3ByaXYtPmdhcnRfaW5mby5hZGRyID0gTlVMTDsKKwkJCWRldl9wcml2LT5nYXJ0X2luZm8uYnVzX2FkZHIgPSAwOwogCQkJaWYgKGRldl9wcml2LT5mbGFncyAmIENISVBfSVNfUENJRSkgewogCQkJCURSTV9FUlJPUgogCQkJCSAgICAoIkNhbm5vdCB1c2UgUENJIEV4cHJlc3Mgd2l0aG91dCBHQVJUIGluIEZCIG1lbW9yeVxuIik7CkBAIC0xNTkwLDcgKzE1ODIsNiBAQAogCiAJCWlmICghZHJtX2F0aV9wY2lnYXJ0X2luaXQoZGV2LCAmZGV2X3ByaXYtPmdhcnRfaW5mbykpIHsKIAkJCURSTV9FUlJPUigiZmFpbGVkIHRvIGluaXQgUENJIEdBUlQhXG4iKTsKLQkJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OwogCQkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKIAkJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CiAJCX0KQEAgLTE2MDQsOCArMTU5NSw2IEBACiAKIAlkZXZfcHJpdi0+bGFzdF9idWYgPSAwOwogCi0JZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7Ci0KIAlyYWRlb25fZG9fZW5naW5lX3Jlc2V0KGRldik7CiAKIAlyZXR1cm4gMDsKQEAgLTE2MjQsMTEgKzE2MTMsMTUgQEAKIAkJZHJtX2lycV91bmluc3RhbGwoZGV2KTsKIAogI2lmIF9fT1NfSEFTX0FHUAotCWlmICghZGV2X3ByaXYtPmlzX3BjaSkgewotCQlpZiAoZGV2X3ByaXYtPmNwX3JpbmcgIT0gTlVMTCkKKwlpZiAoZGV2X3ByaXYtPmZsYWdzICYgQ0hJUF9JU19BR1ApIHsKKwkJaWYgKGRldl9wcml2LT5jcF9yaW5nICE9IE5VTEwpIHsKIAkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKGRldl9wcml2LT5jcF9yaW5nLCBkZXYpOwotCQlpZiAoZGV2X3ByaXYtPnJpbmdfcnB0ciAhPSBOVUxMKQorCQkJZGV2X3ByaXYtPmNwX3JpbmcgPSBOVUxMOworCQl9CisJCWlmIChkZXZfcHJpdi0+cmluZ19ycHRyICE9IE5VTEwpIHsKIAkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKGRldl9wcml2LT5yaW5nX3JwdHIsIGRldik7CisJCQlkZXZfcHJpdi0+cmluZ19ycHRyID0gTlVMTDsKKwkJfQogCQlpZiAoZGV2LT5hZ3BfYnVmZmVyX21hcCAhPSBOVUxMKSB7CiAJCQlkcm1fY29yZV9pb3JlbWFwZnJlZShkZXYtPmFncF9idWZmZXJfbWFwLCBkZXYpOwogCQkJZGV2LT5hZ3BfYnVmZmVyX21hcCA9IE5VTEw7CkBAIC0xNjM2LDE3ICsxNjI5LDIwIEBACiAJfSBlbHNlCiAjZW5kaWYKIAl7Ci0JCWlmIChkZXZfcHJpdi0+Z2FydF9pbmZvLmJ1c19hZGRyKQorCisJCWlmIChkZXZfcHJpdi0+Z2FydF9pbmZvLmJ1c19hZGRyKSB7CisJCQkvKiBUdXJuIG9mZiBQQ0kgR0FSVCAqLworCQkJcmFkZW9uX3NldF9wY2lnYXJ0KGRldl9wcml2LCAwKTsKIAkJCWlmICghZHJtX2F0aV9wY2lnYXJ0X2NsZWFudXAoZGV2LCAmZGV2X3ByaXYtPmdhcnRfaW5mbykpCiAJCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gY2xlYW51cCBQQ0kgR0FSVCFcbiIpOworCQl9CiAKLQkJaWYgKGRldl9wcml2LT5nYXJ0X2luZm8uZ2FydF90YWJsZV9sb2NhdGlvbiA9PSBEUk1fQVRJX0dBUlRfRkIpIHsKLQkJCWRybV9pb3JlbWFwZnJlZSgodm9pZCAqKWRldl9wcml2LT5nYXJ0X2luZm8uYWRkciwKLQkJCQkJUkFERU9OX1BDSUdBUlRfVEFCTEVfU0laRSwgZGV2KTsKKwkJaWYgKGRldl9wcml2LT5nYXJ0X2luZm8uZ2FydF90YWJsZV9sb2NhdGlvbiA9PSBEUk1fQVRJX0dBUlRfRkIpCisJCXsKKwkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKCZkZXZfcHJpdi0+Z2FydF9pbmZvLm1hcHBpbmcsIGRldik7CiAJCQlkZXZfcHJpdi0+Z2FydF9pbmZvLmFkZHIgPSAwOwogCQl9CiAJfQotCiAJLyogb25seSBjbGVhciB0byB0aGUgc3RhcnQgb2YgZmxhZ3MgKi8KIAltZW1zZXQoZGV2X3ByaXYsIDAsIG9mZnNldG9mKGRybV9yYWRlb25fcHJpdmF0ZV90LCBmbGFncykpOwogCkBAIC0xNjcyLDcgKzE2NjgsNyBAQAogCURSTV9ERUJVRygiU3RhcnRpbmcgcmFkZW9uX2RvX3Jlc3VtZV9jcCgpXG4iKTsKIAogI2lmIF9fT1NfSEFTX0FHUAotCWlmICghZGV2X3ByaXYtPmlzX3BjaSkgeworCWlmIChkZXZfcHJpdi0+ZmxhZ3MgJiBDSElQX0lTX0FHUCkgewogCQkvKiBUdXJuIG9mZiBQQ0kgR0FSVCAqLwogCQlyYWRlb25fc2V0X3BjaWdhcnQoZGV2X3ByaXYsIDApOwogCX0gZWxzZQpAQCAtMjEwMyw3ICsyMDk5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgcmFkZW9uX2RyaXZlcl9wcmVpbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitpbnQgcmFkZW9uX2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2OwogCWludCByZXQgPSAwOwpAQCAtMjEzNiwxMSArMjEzMiwxNCBAQAogCQlkZXZfcHJpdi0+ZmxhZ3MgfD0gQ0hJUF9JU19QQ0lFOwogCiAJRFJNX0RFQlVHKCIlcyBjYXJkIGRldGVjdGVkXG4iLAotCQkgICgoZGV2X3ByaXYtPmZsYWdzICYgQ0hJUF9JU19BR1ApID8gIkFHUCIgOiAiUENJIikpOworCQkgICgoZGV2X3ByaXYtPmZsYWdzICYgQ0hJUF9JU19BR1ApID8gIkFHUCIgOiAoKChkZXZfcHJpdi0+ZmxhZ3MgJiBDSElQX0lTX1BDSUUpID8gIlBDSUUiIDogIlBDSSIpKSkpOwogCXJldHVybiByZXQ7CiB9CiAKLWludCByYWRlb25fcHJlc2V0dXAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKKy8qIENyZWF0ZSBtYXBwaW5ncyBmb3IgcmVnaXN0ZXJzIGFuZCBmcmFtZWJ1ZmZlciBzbyB1c2VybGFuZCBkb2Vzbid0IG5lY2Vzc2FyaWx5CisgKiBoYXZlIHRvIGZpbmQgdGhlbS4KKyAqLworaW50IHJhZGVvbl9kcml2ZXJfZmlyc3RvcGVuKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJaW50IHJldDsKIAlkcm1fbG9jYWxfbWFwX3QgKm1hcDsKQEAgLTIxNjEsMTIgKzIxNjAsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHJhZGVvbl9kcml2ZXJfcG9zdGNsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK2ludCByYWRlb25fZHJpdmVyX3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKIAlEUk1fREVCVUcoIlxuIik7Ci0KIAlkcm1fZnJlZShkZXZfcHJpdiwgc2l6ZW9mKCpkZXZfcHJpdiksIERSTV9NRU1fRFJJVkVSKTsKIAogCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcm0uaAppbmRleCAxY2Q4MWE2Li45YzE3N2E2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcm0uaApAQCAtNjI0LDYgKzYyNCwxMSBAQAogCWludCBkaXNjYXJkOwogfSBkcm1fcmFkZW9uX2luZGlyZWN0X3Q7CiAKKy8qIGVudW0gZm9yIGNhcmQgdHlwZSBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFJBREVPTl9DQVJEX1BDSSAwCisjZGVmaW5lIFJBREVPTl9DQVJEX0FHUCAxCisjZGVmaW5lIFJBREVPTl9DQVJEX1BDSUUgMgorCiAvKiAxLjM6IEFuIGlvY3RsIHRvIGdldCBwYXJhbWV0ZXJzIHRoYXQgYXJlbid0IGF2YWlsYWJsZSB0byB0aGUgM2QKICAqIGNsaWVudCBhbnkgb3RoZXIgd2F5LgogICovCkBAIC02NDAsNiArNjQ1LDcgQEAKICNkZWZpbmUgUkFERU9OX1BBUkFNX1NBUkVBX0hBTkRMRSAgICAgICAgICA5CiAjZGVmaW5lIFJBREVPTl9QQVJBTV9HQVJUX1RFWF9IQU5ETEUgICAgICAgMTAKICNkZWZpbmUgUkFERU9OX1BBUkFNX1NDUkFUQ0hfT0ZGU0VUICAgICAgICAxMQorI2RlZmluZSBSQURFT05fUEFSQU1fQ0FSRF9UWVBFICAgICAgICAgICAgIDEyCiAKIHR5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fZ2V0cGFyYW0gewogCWludCBwYXJhbTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmMKaW5kZXggZWU0OTY3MGQuLmIwNGVkMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5jCkBAIC00MiwyOSArNDIsMTUgQEAKIE1PRFVMRV9QQVJNX0RFU0Mobm9fd2IsICJEaXNhYmxlIEFHUCB3cml0ZWJhY2sgZm9yIHNjcmF0Y2ggcmVnaXN0ZXJzXG4iKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChub193YiwgcmFkZW9uX25vX3diLCBpbnQsIDA0NDQpOwogCi1zdGF0aWMgaW50IHBvc3Rpbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgaW50IGRyaV9saWJyYXJ5X25hbWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgY2hhciAqYnVmKQogewotCURSTV9JTkZPKCJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBvbiBtaW5vciAlZDogJXNcbiIsCi0JCSBEUklWRVJfTkFNRSwKLQkJIERSSVZFUl9NQUpPUiwKLQkJIERSSVZFUl9NSU5PUiwKLQkJIERSSVZFUl9QQVRDSExFVkVMLAotCQkgRFJJVkVSX0RBVEUsIGRldi0+cHJpbWFyeS5taW5vciwgcGNpX3ByZXR0eV9uYW1lKGRldi0+cGRldikKLQkgICAgKTsKLQlyZXR1cm4gMDsKLX0KKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBmYW1pbHkgPSBkZXZfcHJpdi0+ZmxhZ3MgJiBDSElQX0ZBTUlMWV9NQVNLOwogCi1zdGF0aWMgaW50IHZlcnNpb24oZHJtX3ZlcnNpb25fdCAqIHZlcnNpb24pCi17Ci0JaW50IGxlbjsKLQotCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBEUklWRVJfTUFKT1I7Ci0JdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IERSSVZFUl9NSU5PUjsKLQl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTDsKLQlEUk1fQ09QWSh2ZXJzaW9uLT5uYW1lLCBEUklWRVJfTkFNRSk7Ci0JRFJNX0NPUFkodmVyc2lvbi0+ZGF0ZSwgRFJJVkVSX0RBVEUpOwotCURSTV9DT1BZKHZlcnNpb24tPmRlc2MsIERSSVZFUl9ERVNDKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwKKwkJICAgICAgICAoZmFtaWx5IDwgQ0hJUF9SMjAwKSA/ICJyYWRlb24iIDoKKwkJICAgICAgICAoKGZhbWlseSA8IENISVBfUjMwMCkgPyAicjIwMCIgOgorCQkgICAgICAgICJyMzAwIikpOwogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpaWRsaXN0W10gPSB7CkBAIC03NywyMyArNjMsMjIgQEAKIAkgICAgRFJJVkVSX0hBVkVfSVJRIHwgRFJJVkVSX0hBVkVfRE1BIHwgRFJJVkVSX0lSUV9TSEFSRUQgfAogCSAgICBEUklWRVJfSVJRX1ZCTCwKIAkuZGV2X3ByaXZfc2l6ZSA9IHNpemVvZihkcm1fcmFkZW9uX2J1Zl9wcml2X3QpLAotCS5wcmVpbml0ID0gcmFkZW9uX2RyaXZlcl9wcmVpbml0LAotCS5wcmVzZXR1cCA9IHJhZGVvbl9wcmVzZXR1cCwKLQkucG9zdGNsZWFudXAgPSByYWRlb25fZHJpdmVyX3Bvc3RjbGVhbnVwLAotCS5wcmVyZWxlYXNlID0gcmFkZW9uX2RyaXZlcl9wcmVyZWxlYXNlLAotCS5wcmV0YWtlZG93biA9IHJhZGVvbl9kcml2ZXJfcHJldGFrZWRvd24sCi0JLm9wZW5faGVscGVyID0gcmFkZW9uX2RyaXZlcl9vcGVuX2hlbHBlciwKKwkubG9hZCA9IHJhZGVvbl9kcml2ZXJfbG9hZCwKKwkuZmlyc3RvcGVuID0gcmFkZW9uX2RyaXZlcl9maXJzdG9wZW4sCisJLm9wZW4gPSByYWRlb25fZHJpdmVyX29wZW4sCisJLnByZWNsb3NlID0gcmFkZW9uX2RyaXZlcl9wcmVjbG9zZSwKKwkucG9zdGNsb3NlID0gcmFkZW9uX2RyaXZlcl9wb3N0Y2xvc2UsCisJLmxhc3RjbG9zZSA9IHJhZGVvbl9kcml2ZXJfbGFzdGNsb3NlLAorCS51bmxvYWQgPSByYWRlb25fZHJpdmVyX3VubG9hZCwKIAkudmJsYW5rX3dhaXQgPSByYWRlb25fZHJpdmVyX3ZibGFua193YWl0LAorCS5kcmlfbGlicmFyeV9uYW1lID0gZHJpX2xpYnJhcnlfbmFtZSwKIAkuaXJxX3ByZWluc3RhbGwgPSByYWRlb25fZHJpdmVyX2lycV9wcmVpbnN0YWxsLAogCS5pcnFfcG9zdGluc3RhbGwgPSByYWRlb25fZHJpdmVyX2lycV9wb3N0aW5zdGFsbCwKIAkuaXJxX3VuaW5zdGFsbCA9IHJhZGVvbl9kcml2ZXJfaXJxX3VuaW5zdGFsbCwKIAkuaXJxX2hhbmRsZXIgPSByYWRlb25fZHJpdmVyX2lycV9oYW5kbGVyLAotCS5mcmVlX2ZpbHBfcHJpdiA9IHJhZGVvbl9kcml2ZXJfZnJlZV9maWxwX3ByaXYsCiAJLnJlY2xhaW1fYnVmZmVycyA9IGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycywKIAkuZ2V0X21hcF9vZnMgPSBkcm1fY29yZV9nZXRfbWFwX29mcywKIAkuZ2V0X3JlZ19vZnMgPSBkcm1fY29yZV9nZXRfcmVnX29mcywKLQkucG9zdGluaXQgPSBwb3N0aW5pdCwKLQkudmVyc2lvbiA9IHZlcnNpb24sCiAJLmlvY3RscyA9IHJhZGVvbl9pb2N0bHMsCiAJLmRtYV9pb2N0bCA9IHJhZGVvbl9jcF9idWZmZXJzLAogCS5mb3BzID0gewpAQCAtMTA3LDEyICs5MiwxOSBAQAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkJIC5jb21wYXRfaW9jdGwgPSByYWRlb25fY29tcGF0X2lvY3RsLAogI2VuZGlmCi0JCSB9Ci0JLAorCX0sCisKIAkucGNpX2RyaXZlciA9IHsKLQkJICAgICAgIC5uYW1lID0gRFJJVkVSX05BTUUsCi0JCSAgICAgICAuaWRfdGFibGUgPSBwY2lpZGxpc3QsCi0JCSAgICAgICB9CisJCSAubmFtZSA9IERSSVZFUl9OQU1FLAorCQkgLmlkX3RhYmxlID0gcGNpaWRsaXN0LAorCX0sCisKKwkubmFtZSA9IERSSVZFUl9OQU1FLAorCS5kZXNjID0gRFJJVkVSX0RFU0MsCisJLmRhdGUgPSBEUklWRVJfREFURSwKKwkubWFqb3IgPSBEUklWRVJfTUFKT1IsCisJLm1pbm9yID0gRFJJVkVSX01JTk9SLAorCS5wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUwsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCByYWRlb25faW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuaAppbmRleCBkOTJjY2VlLi40OThiMTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuaApAQCAtMzgsNyArMzgsNyBAQAogCiAjZGVmaW5lIERSSVZFUl9OQU1FCQkicmFkZW9uIgogI2RlZmluZSBEUklWRVJfREVTQwkJIkFUSSBSYWRlb24iCi0jZGVmaW5lIERSSVZFUl9EQVRFCQkiMjAwNTA5MTEiCisjZGVmaW5lIERSSVZFUl9EQVRFCQkiMjAwNTEyMjkiCiAKIC8qIEludGVyZmFjZSBoaXN0b3J5OgogICoKQEAgLTczLDcgKzczLDcgQEAKICAqIDEuMTEtIEFkZCBwYWNrZXQgUjIwMF9FTUlUX1JCM0RfQkxFTkRDT0xPUiB0byBzdXBwb3J0IEdMX0VYVF9ibGVuZF9jb2xvcgogICogICAgICAgYW5kIEdMX0VYVF9ibGVuZF9bZnVuY3xlcXVhdGlvbl1fc2VwYXJhdGUgb24gcjIwMAogICogMS4xMi0gQWRkIFIzMDAgQ1AgbWljcm9jb2RlIHN1cHBvcnQgLSB0aGlzIGp1c3QgbG9hZHMgdGhlIENQIG9uIHIzMDAKLSAqICAgICAgIChObyAzRCBzdXBwb3J0IHlldCAtIGp1c3QgbWljcm9jb2RlIGxvYWRpbmcpCisgKiAgICAgICAoTm8gM0Qgc3VwcG9ydCB5ZXQgLSBqdXN0IG1pY3JvY29kZSBsb2FkaW5nKS4KICAqIDEuMTMtIEFkZCBwYWNrZXQgUjIwMF9FTUlUX1RDTF9QT0lOVF9TUFJJVEVfQ05UTCBmb3IgQVJCX3BvaW50X3BhcmFtZXRlcnMKICAqICAgICAtIEFkZCBoeXBlcnogc3VwcG9ydCwgYWRkIGh5cGVyeiBmbGFncyB0byBjbGVhciBpb2N0bC4KICAqIDEuMTQtIEFkZCBzdXBwb3J0IGZvciBjb2xvciB0aWxpbmcKQEAgLTg4LDE0ICs4OCwxMyBAQAogICogICAgICAgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzAtNSwgMiBtb3JlIHJlZ3MpIGFuZCBSMjAwX0VNSVRfQVRGX1RGQUNUT1IKICAqICAgICAgIChyZXBsYWNlcyBSMjAwX0VNSVRfVEZBQ1RPUl8wICg4IGNvbnN0cyBpbnN0ZWFkIG9mIDYpCiAgKiAxLjE5LSBBZGQgc3VwcG9ydCBmb3IgZ2FydCB0YWJsZSBpbiBGQiBtZW1vcnkgYW5kIFBDSUUgcjMwMAorICogMS4yMC0gQWRkIHN1cHBvcnQgZm9yIHIzMDAgdGV4cmVjdAorICogMS4yMS0gQWRkIHN1cHBvcnQgZm9yIGNhcmQgdHlwZSBnZXRwYXJhbQogICovCiAjZGVmaW5lIERSSVZFUl9NQUpPUgkJMQotI2RlZmluZSBEUklWRVJfTUlOT1IJCTE5CisjZGVmaW5lIERSSVZFUl9NSU5PUgkJMjEKICNkZWZpbmUgRFJJVkVSX1BBVENITEVWRUwJMAogCi0jZGVmaW5lIEdFVF9SSU5HX0hFQUQoZGV2X3ByaXYpCQlEUk1fUkVBRDMyKCAgKGRldl9wcml2KS0+cmluZ19ycHRyLCAwICkKLSNkZWZpbmUgU0VUX1JJTkdfSEVBRChkZXZfcHJpdix2YWwpCURSTV9XUklURTMyKCAoZGV2X3ByaXYpLT5yaW5nX3JwdHIsIDAsICh2YWwpICkKLQogLyoKICAqIFJhZGVvbiBjaGlwIGZhbWlsaWVzCiAgKi8KQEAgLTEwMyw4ICsxMDIsOCBAQAogCUNISVBfUjEwMCwKIAlDSElQX1JTMTAwLAogCUNISVBfUlYxMDAsCi0JQ0hJUF9SMjAwLAogCUNISVBfUlYyMDAsCisJQ0hJUF9SMjAwLAogCUNISVBfUlMyMDAsCiAJQ0hJUF9SMjUwLAogCUNISVBfUlMyNTAsCkBAIC0xMzgsNiArMTM3LDkgQEAKIAlDSElQX0lTX1BDSUUgPSAweDAwMjAwMDAwVUwsCiB9OwogCisjZGVmaW5lIEdFVF9SSU5HX0hFQUQoZGV2X3ByaXYpCQlEUk1fUkVBRDMyKCAgKGRldl9wcml2KS0+cmluZ19ycHRyLCAwICkKKyNkZWZpbmUgU0VUX1JJTkdfSEVBRChkZXZfcHJpdix2YWwpCURSTV9XUklURTMyKCAoZGV2X3ByaXYpLT5yaW5nX3JwdHIsIDAsICh2YWwpICkKKwogdHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9mcmVlbGlzdCB7CiAJdW5zaWduZWQgaW50IGFnZTsKIAlkcm1fYnVmX3QgKmJ1ZjsKQEAgLTI0NSw4ICsyNDcsNiBAQAogCiAJZHJtX3JhZGVvbl9kZXB0aF9jbGVhcl90IGRlcHRoX2NsZWFyOwogCi0JdW5zaWduZWQgbG9uZyBmYl9vZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBtbWlvX29mZnNldDsKIAl1bnNpZ25lZCBsb25nIHJpbmdfb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgcmluZ19ycHRyX29mZnNldDsKIAl1bnNpZ25lZCBsb25nIGJ1ZmZlcnNfb2Zmc2V0OwpAQCAtMjczLDcgKzI3Myw2IEBACiAKIAkvKiBzdGFydGluZyBmcm9tIGhlcmUgb24sIGRhdGEgaXMgcHJlc2VydmVkIGFjY3Jvc3MgYW4gb3BlbiAqLwogCXVpbnQzMl90IGZsYWdzOwkJLyogc2VlIHJhZGVvbl9jaGlwX2ZsYWdzICovCi0JaW50IGlzX3BjaTsKIH0gZHJtX3JhZGVvbl9wcml2YXRlX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fYnVmX3ByaXYgewpAQCAtMzMwLDE3ICszMjksMTQgQEAKIGV4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKIGV4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7CiBleHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfcHJlcmVsZWFzZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCk7Ci1leHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX3ByZXRha2Vkb3duKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfb3Blbl9oZWxwZXIoZHJtX2RldmljZV90ICogZGV2LAotCQkJCSAgICAgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdik7Ci1leHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX2ZyZWVfZmlscF9wcml2KGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCQkJIGRybV9maWxlX3QgKiBmaWxwX3ByaXYpOwogCi1leHRlcm4gaW50IHJhZGVvbl9wcmVpbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotZXh0ZXJuIGludCByYWRlb25fcG9zdGluaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyk7Ci1leHRlcm4gaW50IHJhZGVvbl9wb3N0Y2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLQorZXh0ZXJuIGludCByYWRlb25fZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CitleHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfdW5sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCByYWRlb25fZHJpdmVyX2ZpcnN0b3BlbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApOworZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9wb3N0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBkcm1fZmlsZV90ICogZmlscCk7CitleHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIGludCByYWRlb25fZHJpdmVyX29wZW4oZHJtX2RldmljZV90ICogZGV2LCBkcm1fZmlsZV90ICogZmlscF9wcml2KTsKIGV4dGVybiBsb25nIHJhZGVvbl9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkJdW5zaWduZWQgbG9uZyBhcmcpOwogCkBAIC0zNjQsNiArMzYwLDggQEAKICAqLwogCiAjZGVmaW5lIFJBREVPTl9BR1BfQ09NTUFORAkJMHgwZjYwCisjZGVmaW5lIFJBREVPTl9BR1BfQ09NTUFORF9QQ0lfQ09ORklHICAgMHgwMDYwCS8qIG9mZnNldCBpbiBQQ0kgY29uZmlnICovCisjCWRlZmluZSBSQURFT05fQUdQX0VOQUJMRQkoMTw8OCkKICNkZWZpbmUgUkFERU9OX0FVWF9TQ0lTU09SX0NOVEwJCTB4MjZmMAogIwlkZWZpbmUgUkFERU9OX0VYQ0xVU0lWRV9TQ0lTU09SXzAJKDEgPDwgMjQpCiAjCWRlZmluZSBSQURFT05fRVhDTFVTSVZFX1NDSVNTT1JfMQkoMSA8PCAyNSkKQEAgLTY1MSw2ICs2NDksOCBAQAogCiAjZGVmaW5lIFJBREVPTl9XQUlUX1VOVElMCQkweDE3MjAKICMJZGVmaW5lIFJBREVPTl9XQUlUX0NSVENfUEZMSVAJCSgxIDw8IDApCisjCWRlZmluZSBSQURFT05fV0FJVF8yRF9JRExFCQkoMSA8PCAxNCkKKyMJZGVmaW5lIFJBREVPTl9XQUlUXzNEX0lETEUJCSgxIDw8IDE1KQogIwlkZWZpbmUgUkFERU9OX1dBSVRfMkRfSURMRUNMRUFOCQkoMSA8PCAxNikKICMJZGVmaW5lIFJBREVPTl9XQUlUXzNEX0lETEVDTEVBTgkJKDEgPDwgMTcpCiAjCWRlZmluZSBSQURFT05fV0FJVF9IT1NUX0lETEVDTEVBTgkoMSA8PCAxOCkKQEAgLTExMDUsNyArMTEwNSw2IEBACiAJCXdyaXRlID0gMDsJCQkJCVwKIAkJX3RhYiArPSBfaTsJCQkJCVwKIAl9CQkJCQkJCVwKLQkJCQkJCQkJXAogCXdoaWxlIChfc2l6ZSA+IDApIHsJCQkJCVwKIAkJKihyaW5nICsgd3JpdGUpID0gKl90YWIrKzsJCQlcCiAJCXdyaXRlKys7CQkJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9pb2MzMi5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25faW9jMzIuYwppbmRleCBmZWY0YTJiLi4wY2NmZDM2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25faW9jMzIuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9pb2MzMi5jCkBAIC0yOCw3ICsyOCw2IEBACiAgKiBJTiBUSEUgU09GVFdBUkUuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CiAKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9zdGF0ZS5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fc3RhdGUuYwppbmRleCAyMzFhYzE0Li43YmMyNzUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9zdGF0ZS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX3N0YXRlLmMKQEAgLTEsNSArMSw1IEBACi0vKiByYWRlb25fc3RhdGUuYyAtLSBTdGF0ZSBzdXBwb3J0IGZvciBSYWRlb24gLSotIGxpbnV4LWMgLSotCi0gKgorLyogcmFkZW9uX3N0YXRlLmMgLS0gU3RhdGUgc3VwcG9ydCBmb3IgUmFkZW9uIC0qLSBsaW51eC1jIC0qLSAqLworLyoKICAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIEZyZW1vbnQsIENhbGlmb3JuaWEuCiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKQEAgLTcyLDEwICs3Miw3IEBACiAKIAljYXNlIFJBREVPTl9FTUlUX1BQX01JU0M6CiAJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwgZmlscF9wcml2LAotCQkJCQkJICAmZGF0YVsoUkFERU9OX1JCM0RfREVQVEhPRkZTRVQKLQkJCQkJCQkgLQotCQkJCQkJCSBSQURFT05fUFBfTUlTQykgLwotCQkJCQkJCTRdKSkgeworCQkgICAgJmRhdGFbKFJBREVPTl9SQjNEX0RFUFRIT0ZGU0VUIC0gUkFERU9OX1BQX01JU0MpIC8gNF0pKSB7CiAJCQlEUk1fRVJST1IoIkludmFsaWQgZGVwdGggYnVmZmVyIG9mZnNldFxuIik7CiAJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCQl9CkBAIC04MywxMCArODAsNyBAQAogCiAJY2FzZSBSQURFT05fRU1JVF9QUF9DTlRMOgogCQlpZiAocmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoZGV2X3ByaXYsIGZpbHBfcHJpdiwKLQkJCQkJCSAgJmRhdGFbKFJBREVPTl9SQjNEX0NPTE9ST0ZGU0VUCi0JCQkJCQkJIC0KLQkJCQkJCQkgUkFERU9OX1BQX0NOVEwpIC8KLQkJCQkJCQk0XSkpIHsKKwkJICAgICZkYXRhWyhSQURFT05fUkIzRF9DT0xPUk9GRlNFVCAtIFJBREVPTl9QUF9DTlRMKSAvIDRdKSkgewogCQkJRFJNX0VSUk9SKCJJbnZhbGlkIGNvbG91ciBidWZmZXIgb2Zmc2V0XG4iKTsKIAkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJCX0KQEAgLTEwOSwxMCArMTAzLDcgQEAKIAljYXNlIFJBREVPTl9FTUlUX1BQX1RYRklMVEVSXzE6CiAJY2FzZSBSQURFT05fRU1JVF9QUF9UWEZJTFRFUl8yOgogCQlpZiAocmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoZGV2X3ByaXYsIGZpbHBfcHJpdiwKLQkJCQkJCSAgJmRhdGFbKFJBREVPTl9QUF9UWE9GRlNFVF8wCi0JCQkJCQkJIC0KLQkJCQkJCQkgUkFERU9OX1BQX1RYRklMVEVSXzApIC8KLQkJCQkJCQk0XSkpIHsKKwkJICAgICZkYXRhWyhSQURFT05fUFBfVFhPRkZTRVRfMCAtIFJBREVPTl9QUF9UWEZJTFRFUl8wKSAvIDRdKSkgewogCQkJRFJNX0VSUk9SKCJJbnZhbGlkIFIxMDAgdGV4dHVyZSBvZmZzZXRcbiIpOwogCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAkJfQpAQCAtMTI2LDggKzExNyw5IEBACiAJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU181OnsKIAkJCWludCBpOwogCQkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewotCQkJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldAotCQkJCSAgICAoZGV2X3ByaXYsIGZpbHBfcHJpdiwgJmRhdGFbaV0pKSB7CisJCQkJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KGRldl9wcml2LAorCQkJCQkJCQkgIGZpbHBfcHJpdiwKKwkJCQkJCQkJICAmZGF0YVtpXSkpIHsKIAkJCQkJRFJNX0VSUk9SCiAJCQkJCSAgICAoIkludmFsaWQgUjIwMCBjdWJpYyB0ZXh0dXJlIG9mZnNldFxuIik7CiAJCQkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CkBAIC0yMzksOCArMjMxLDkgQEAKIAogc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9jaGVja19hbmRfZml4dXBfcGFja2V0Myhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqCiAJCQkJCQkgICAgIGRldl9wcml2LAotCQkJCQkJICAgICBkcm1fZmlsZV90ICogZmlscF9wcml2LAotCQkJCQkJICAgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKmNtZGJ1ZiwKKwkJCQkJCSAgICAgZHJtX2ZpbGVfdCAqZmlscF9wcml2LAorCQkJCQkJICAgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKgorCQkJCQkJICAgICBjbWRidWYsCiAJCQkJCQkgICAgIHVuc2lnbmVkIGludCAqY21kc3opCiB7CiAJdTMyICpjbWQgPSAodTMyICopIGNtZGJ1Zi0+YnVmOwpAQCAtNTU1LDcgKzU0OCw4IEBACiAJe1IyMDBfUFBfVFhPRkZTRVRfNCwgMSwgIlIyMDBfUFBfVFhPRkZTRVRfNCJ9LAogCXtSMjAwX1BQX1RYT0ZGU0VUXzUsIDEsICJSMjAwX1BQX1RYT0ZGU0VUXzUifSwKIAl7UjIwMF9TRV9WVEVfQ05UTCwgMSwgIlIyMDBfU0VfVlRFX0NOVEwifSwKLQl7UjIwMF9TRV9UQ0xfT1VUUFVUX1ZUWF9DT01QX1NFTCwgMSwgIlIyMDBfU0VfVENMX09VVFBVVF9WVFhfQ09NUF9TRUwifSwKKwl7UjIwMF9TRV9UQ0xfT1VUUFVUX1ZUWF9DT01QX1NFTCwgMSwKKwkgIlIyMDBfU0VfVENMX09VVFBVVF9WVFhfQ09NUF9TRUwifSwKIAl7UjIwMF9QUF9UQU1fREVCVUczLCAxLCAiUjIwMF9QUF9UQU1fREVCVUczIn0sCiAJe1IyMDBfUFBfQ05UTF9YLCAxLCAiUjIwMF9QUF9DTlRMX1gifSwKIAl7UjIwMF9SQjNEX0RFUFRIWFlfT0ZGU0VULCAxLCAiUjIwMF9SQjNEX0RFUFRIWFlfT0ZGU0VUIn0sCkBAIC01NjksNyArNTYzLDcgQEAKIAl7UjIwMF9TRV9UQ0xfSU5QVVRfVlRYX1ZFQ1RPUl9BRERSXzAsIDQsCiAJCSAgICAiUjIwMF9TRV9UQ0xfSU5QVVRfVlRYX1ZFQ1RPUl9BRERSXzAifSwKIAl7UjIwMF9QUF9DVUJJQ19GQUNFU18wLCAxLCAiUjIwMF9QUF9DVUJJQ19GQUNFU18wIn0sCS8qIDYxICovCi0Je1IyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzAsIDUsICJSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8wIn0sCS8qIDYyICovCisJe1IyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzAsIDUsICJSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8wIn0sIC8qIDYyICovCiAJe1IyMDBfUFBfQ1VCSUNfRkFDRVNfMSwgMSwgIlIyMDBfUFBfQ1VCSUNfRkFDRVNfMSJ9LAogCXtSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8xLCA1LCAiUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMSJ9LAogCXtSMjAwX1BQX0NVQklDX0ZBQ0VTXzIsIDEsICJSMjAwX1BQX0NVQklDX0ZBQ0VTXzIifSwKQEAgLTU5Miw3ICs1ODYsNyBAQAogCXtSQURFT05fUFBfQ1VCSUNfRkFDRVNfMiwgMSwgIlJBREVPTl9QUF9DVUJJQ19GQUNFU18yIn0sCiAJe1JBREVPTl9QUF9DVUJJQ19PRkZTRVRfVDJfMCwgNSwgIlJBREVPTl9QUF9DVUJJQ19PRkZTRVRfVDJfMCJ9LAogCXtSMjAwX1BQX1RSSV9QRVJGLCAyLCAiUjIwMF9QUF9UUklfUEVSRiJ9LAotCXtSMjAwX1BQX0FGU18wLCAzMiwgIlIyMDBfUFBfQUZTXzAifSwJLyogODUgKi8KKwl7UjIwMF9QUF9BRlNfMCwgMzIsICJSMjAwX1BQX0FGU18wIn0sICAgICAvKiA4NSAqLwogCXtSMjAwX1BQX0FGU18xLCAzMiwgIlIyMDBfUFBfQUZTXzEifSwKIAl7UjIwMF9QUF9URkFDVE9SXzAsIDgsICJSMjAwX0FURl9URkFDVE9SIn0sCiAJe1IyMDBfUFBfVFhGSUxURVJfMCwgOCwgIlIyMDBfUFBfVFhDVExBTExfMCJ9LApAQCAtOTg1LDggKzk3OSw4IEBACiAJICogcmVuZGVyaW5nIGEgcXVhZCBpbnRvIGp1c3QgdGhvc2UgYnVmZmVycy4gIFRodXMsIHdlIGhhdmUgdG8KIAkgKiBtYWtlIHN1cmUgdGhlIDNEIGVuZ2luZSBpcyBjb25maWd1cmVkIGNvcnJlY3RseS4KIAkgKi8KLQlpZiAoKGRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbiA9PSBVQ09ERV9SMjAwKSAmJgotCSAgICAoZmxhZ3MgJiAoUkFERU9OX0RFUFRIIHwgUkFERU9OX1NURU5DSUwpKSkgeworCWVsc2UgaWYgKChkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb24gPT0gVUNPREVfUjIwMCkgJiYKKwkJKGZsYWdzICYgKFJBREVPTl9ERVBUSCB8IFJBREVPTl9TVEVOQ0lMKSkpIHsKIAogCQlpbnQgdGVtcFBQX0NOVEw7CiAJCWludCB0ZW1wUkVfQ05UTDsKQEAgLTE2MzcsNiArMTYzMSwxNCBAQAogCQkgICAgKHUzMiAqKSAoKGNoYXIgKilkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUgKyBidWYtPm9mZnNldCk7CiAJCWR3b3JkcyA9IHNpemUgLyA0OwogCisjZGVmaW5lIFJBREVPTl9DT1BZX01UKF9idWYsIF9kYXRhLCBfd2lkdGgpIFwKKwlkbyB7IFwKKwkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihfYnVmLCBfZGF0YSwgKF93aWR0aCkpKSB7XAorCQkJRFJNX0VSUk9SKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwgKF93aWR0aCkpOyBcCisJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOyBcCisJCX0gXAorCX0gd2hpbGUoMCkKKwogCQlpZiAobWljcm90aWxlKSB7CiAJCQkvKiB0ZXh0dXJlIG1pY3JvIHRpbGluZyBpbiB1c2UsIG1pbmltdW0gdGV4dHVyZSB3aWR0aCBpcyB0aHVzIDE2IGJ5dGVzLgogCQkJICAgaG93ZXZlciwgd2UgY2Fubm90IHVzZSBibGl0dGVyIGRpcmVjdGx5IGZvciB0ZXh0dXJlIHdpZHRoIDwgNjQgYnl0ZXMsCkBAIC0xNjQ4LDQ2ICsxNjUwLDE5IEBACiAJCQkgICBmcm9tIHVzZXIgc3BhY2UuICovCiAJCQlpZiAodGV4LT5oZWlnaHQgPT0gMSkgewogCQkJCWlmICh0ZXhfd2lkdGggPj0gNjQgfHwgdGV4X3dpZHRoIDw9IDE2KSB7Ci0JCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoYnVmZmVyLCBkYXRhLAotCQkJCQkJCSAgICAgICB0ZXhfd2lkdGggKgotCQkJCQkJCSAgICAgICBzaXplb2YodTMyKSkpIHsKLQkJCQkJCURSTV9FUlJPUgotCQkJCQkJICAgICgiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCi0JCQkJCQkgICAgIHRleF93aWR0aCk7Ci0JCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwotCQkJCQl9CisJCQkJCVJBREVPTl9DT1BZX01UKGJ1ZmZlciwgZGF0YSwKKwkJCQkJCShpbnQpKHRleF93aWR0aCAqIHNpemVvZih1MzIpKSk7CiAJCQkJfSBlbHNlIGlmICh0ZXhfd2lkdGggPT0gMzIpIHsKLQkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUgotCQkJCQkgICAgKGJ1ZmZlciwgZGF0YSwgMTYpKSB7Ci0JCQkJCQlEUk1fRVJST1IKLQkJCQkJCSAgICAoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAotCQkJCQkJICAgICB0ZXhfd2lkdGgpOwotCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKLQkJCQkJfQotCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSCi0JCQkJCSAgICAoYnVmZmVyICsgOCwgZGF0YSArIDE2LCAxNikpIHsKLQkJCQkJCURSTV9FUlJPUgotCQkJCQkJICAgICgiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCi0JCQkJCQkgICAgIHRleF93aWR0aCk7Ci0JCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwotCQkJCQl9CisJCQkJCVJBREVPTl9DT1BZX01UKGJ1ZmZlciwgZGF0YSwgMTYpOworCQkJCQlSQURFT05fQ09QWV9NVChidWZmZXIgKyA4LAorCQkJCQkJICAgICAgIGRhdGEgKyAxNiwgMTYpOwogCQkJCX0KIAkJCX0gZWxzZSBpZiAodGV4X3dpZHRoID49IDY0IHx8IHRleF93aWR0aCA9PSAxNikgewotCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoYnVmZmVyLCBkYXRhLAotCQkJCQkJICAgICAgIGR3b3JkcyAqIHNpemVvZih1MzIpKSkgewotCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBkYXRhLCAlZCBkd29yZHNcbiIsCi0JCQkJCQkgIGR3b3Jkcyk7Ci0JCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7Ci0JCQkJfQorCQkJCVJBREVPTl9DT1BZX01UKGJ1ZmZlciwgZGF0YSwKKwkJCQkJICAgICAgIChpbnQpKGR3b3JkcyAqIHNpemVvZih1MzIpKSk7CiAJCQl9IGVsc2UgaWYgKHRleF93aWR0aCA8IDE2KSB7CiAJCQkJZm9yIChpID0gMDsgaSA8IHRleC0+aGVpZ2h0OyBpKyspIHsKLQkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUgotCQkJCQkgICAgKGJ1ZmZlciwgZGF0YSwgdGV4X3dpZHRoKSkgewotCQkJCQkJRFJNX0VSUk9SCi0JCQkJCQkgICAgKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKLQkJCQkJCSAgICAgdGV4X3dpZHRoKTsKLQkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7Ci0JCQkJCX0KKwkJCQkJUkFERU9OX0NPUFlfTVQoYnVmZmVyLCBkYXRhLCB0ZXhfd2lkdGgpOwogCQkJCQlidWZmZXIgKz0gNDsKIAkJCQkJZGF0YSArPSB0ZXhfd2lkdGg7CiAJCQkJfQpAQCAtMTY5NSwzNyArMTY3MCwxMyBAQAogCQkJCS8qIFRPRE86IG1ha2Ugc3VyZSB0aGlzIHdvcmtzIHdoZW4gbm90IGZpdHRpbmcgaW4gb25lIGJ1ZmZlcgogCQkJCSAgIChpLmUuIDMyYnl0ZXMgeCAyMDQ4Li4uKSAqLwogCQkJCWZvciAoaSA9IDA7IGkgPCB0ZXgtPmhlaWdodDsgaSArPSAyKSB7Ci0JCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIKLQkJCQkJICAgIChidWZmZXIsIGRhdGEsIDE2KSkgewotCQkJCQkJRFJNX0VSUk9SCi0JCQkJCQkgICAgKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKLQkJCQkJCSAgICAgdGV4X3dpZHRoKTsKLQkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7Ci0JCQkJCX0KKwkJCQkJUkFERU9OX0NPUFlfTVQoYnVmZmVyLCBkYXRhLCAxNik7CiAJCQkJCWRhdGEgKz0gMTY7Ci0JCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIKLQkJCQkJICAgIChidWZmZXIgKyA4LCBkYXRhLCAxNikpIHsKLQkJCQkJCURSTV9FUlJPUgotCQkJCQkJICAgICgiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCi0JCQkJCQkgICAgIHRleF93aWR0aCk7Ci0JCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwotCQkJCQl9CisJCQkJCVJBREVPTl9DT1BZX01UKGJ1ZmZlciArIDgsIGRhdGEsIDE2KTsKIAkJCQkJZGF0YSArPSAxNjsKLQkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUgotCQkJCQkgICAgKGJ1ZmZlciArIDQsIGRhdGEsIDE2KSkgewotCQkJCQkJRFJNX0VSUk9SCi0JCQkJCQkgICAgKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKLQkJCQkJCSAgICAgdGV4X3dpZHRoKTsKLQkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7Ci0JCQkJCX0KKwkJCQkJUkFERU9OX0NPUFlfTVQoYnVmZmVyICsgNCwgZGF0YSwgMTYpOwogCQkJCQlkYXRhICs9IDE2OwotCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSCi0JCQkJCSAgICAoYnVmZmVyICsgMTIsIGRhdGEsIDE2KSkgewotCQkJCQkJRFJNX0VSUk9SCi0JCQkJCQkgICAgKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKLQkJCQkJCSAgICAgdGV4X3dpZHRoKTsKLQkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7Ci0JCQkJCX0KKwkJCQkJUkFERU9OX0NPUFlfTVQoYnVmZmVyICsgMTIsIGRhdGEsIDE2KTsKIAkJCQkJZGF0YSArPSAxNjsKIAkJCQkJYnVmZmVyICs9IDE2OwogCQkJCX0KQEAgLTE3MzUsMzEgKzE2ODYsMjIgQEAKIAkJCQkvKiBUZXh0dXJlIGltYWdlIHdpZHRoIGlzIGxhcmdlciB0aGFuIHRoZSBtaW5pbXVtLCBzbyB3ZQogCQkJCSAqIGNhbiB1cGxvYWQgaXQgZGlyZWN0bHkuCiAJCQkJICovCi0JCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihidWZmZXIsIGRhdGEsCi0JCQkJCQkgICAgICAgZHdvcmRzICogc2l6ZW9mKHUzMikpKSB7Ci0JCQkJCURSTV9FUlJPUigiRUZBVUxUIG9uIGRhdGEsICVkIGR3b3Jkc1xuIiwKLQkJCQkJCSAgZHdvcmRzKTsKLQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKLQkJCQl9CisJCQkJUkFERU9OX0NPUFlfTVQoYnVmZmVyLCBkYXRhLAorCQkJCQkgICAgICAgKGludCkoZHdvcmRzICogc2l6ZW9mKHUzMikpKTsKIAkJCX0gZWxzZSB7CiAJCQkJLyogVGV4dHVyZSBpbWFnZSB3aWR0aCBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW0sIHNvIHdlCiAJCQkJICogbmVlZCB0byBwYWQgb3V0IGVhY2ggaW1hZ2Ugc2NhbmxpbmUgdG8gdGhlIG1pbmltdW0KIAkJCQkgKiB3aWR0aC4KIAkJCQkgKi8KIAkJCQlmb3IgKGkgPSAwOyBpIDwgdGV4LT5oZWlnaHQ7IGkrKykgewotCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSCi0JCQkJCSAgICAoYnVmZmVyLCBkYXRhLCB0ZXhfd2lkdGgpKSB7Ci0JCQkJCQlEUk1fRVJST1IKLQkJCQkJCSAgICAoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAotCQkJCQkJICAgICB0ZXhfd2lkdGgpOwotCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKLQkJCQkJfQorCQkJCQlSQURFT05fQ09QWV9NVChidWZmZXIsIGRhdGEsIHRleF93aWR0aCk7CiAJCQkJCWJ1ZmZlciArPSA4OwogCQkJCQlkYXRhICs9IHRleF93aWR0aDsKIAkJCQl9CiAJCQl9CiAJCX0KIAorI3VuZGVmIFJBREVPTl9DT1BZX01UCiAJCWJ1Zi0+ZmlscCA9IGZpbHA7CiAJCWJ1Zi0+dXNlZCA9IHNpemU7CiAJCW9mZnNldCA9IGRldl9wcml2LT5nYXJ0X2J1ZmZlcnNfb2Zmc2V0ICsgYnVmLT5vZmZzZXQ7CkBAIC0xODIxLDcgKzE3NjMsNyBAQAogfQogCiBzdGF0aWMgdm9pZCByYWRlb25fYXBwbHlfc3VyZmFjZV9yZWdzKGludCBzdXJmX2luZGV4LAotCQkJCSAgICAgIGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYpCisJCQkJICAgICAgZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2KQogewogCWlmICghZGV2X3ByaXYtPm1taW8pCiAJCXJldHVybjsKQEAgLTE4NDcsOCArMTc4OSw4IEBACiAgKiBmcmVlZCwgd2Ugc3VkZGVubHkgbmVlZCB0d28gc3VyZmFjZXMgdG8gc3RvcmUgQSBhbmQgQywgd2hpY2ggbWlnaHQKICAqIG5vdCBhbHdheXMgYmUgYXZhaWxhYmxlLgogICovCi1zdGF0aWMgaW50IGFsbG9jX3N1cmZhY2UoZHJtX3JhZGVvbl9zdXJmYWNlX2FsbG9jX3QgKiBuZXcsCi0JCQkgZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwgRFJNRklMRSBmaWxwKQorc3RhdGljIGludCBhbGxvY19zdXJmYWNlKGRybV9yYWRlb25fc3VyZmFjZV9hbGxvY190ICpuZXcsCisJCQkgZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LCBEUk1GSUxFIGZpbHApCiB7CiAJc3RydWN0IHJhZGVvbl92aXJ0X3N1cmZhY2UgKnM7CiAJaW50IGk7CkBAIC0yMTU4LDYgKzIxMDAsMTEgQEAKIAogCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwogCisJaWYgKCFkZXZfcHJpdikgeworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwogCURSTV9HRVRfUFJJVl9XSVRIX1JFVFVSTihmaWxwX3ByaXYsIGZpbHApOwogCiAJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKHZlcnRleCwgKGRybV9yYWRlb25fdmVydGV4X3QgX191c2VyICopIGRhdGEsCkBAIC0yNTk2LDkgKzI1NDMsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2VtaXRfc2NhbGFycyhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAorc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9lbWl0X3NjYWxhcnMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAogCQkJCQkgIGRybV9yYWRlb25fY21kX2hlYWRlcl90IGhlYWRlciwKLQkJCQkJICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKiBjbWRidWYpCisJCQkJCSAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYpCiB7CiAJaW50IHN6ID0gaGVhZGVyLnNjYWxhcnMuY291bnQ7CiAJaW50IHN0YXJ0ID0gaGVhZGVyLnNjYWxhcnMub2Zmc2V0OwpAQCAtMjYxOCw5ICsyNTY1LDkgQEAKIAogLyogR29kIHRoaXMgaXMgdWdseQogICovCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2VtaXRfc2NhbGFyczIoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwKK3N0YXRpYyBfX2lubGluZV9fIGludCByYWRlb25fZW1pdF9zY2FsYXJzMihkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCiAJCQkJCSAgIGRybV9yYWRlb25fY21kX2hlYWRlcl90IGhlYWRlciwKLQkJCQkJICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICogY21kYnVmKQorCQkJCQkgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKmNtZGJ1ZikKIHsKIAlpbnQgc3ogPSBoZWFkZXIuc2NhbGFycy5jb3VudDsKIAlpbnQgc3RhcnQgPSAoKHVuc2lnbmVkIGludCloZWFkZXIuc2NhbGFycy5vZmZzZXQpICsgMHgxMDA7CkBAIC0yNjM4LDkgKzI1ODUsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2VtaXRfdmVjdG9ycyhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAorc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9lbWl0X3ZlY3RvcnMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAogCQkJCQkgIGRybV9yYWRlb25fY21kX2hlYWRlcl90IGhlYWRlciwKLQkJCQkJICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKiBjbWRidWYpCisJCQkJCSAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYpCiB7CiAJaW50IHN6ID0gaGVhZGVyLnZlY3RvcnMuY291bnQ7CiAJaW50IHN0YXJ0ID0gaGVhZGVyLnZlY3RvcnMub2Zmc2V0OwpAQCAtMjY4NSw4ICsyNjMyLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByYWRlb25fZW1pdF9wYWNrZXQzX2NsaXByZWN0KGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCQkJZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdiwKK3N0YXRpYyBpbnQgcmFkZW9uX2VtaXRfcGFja2V0M19jbGlwcmVjdChkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkJZHJtX2ZpbGVfdCAqZmlscF9wcml2LAogCQkJCQlkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKmNtZGJ1ZiwKIAkJCQkJaW50IG9yaWdfbmJveCkKIHsKQEAgLTI4MTgsNyArMjc2NSw4IEBACiAJCWtidWYgPSBkcm1fYWxsb2MoY21kYnVmLmJ1ZnN6LCBEUk1fTUVNX0RSSVZFUik7CiAJCWlmIChrYnVmID09IE5VTEwpCiAJCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOwotCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGtidWYsICh2b2lkIF9fdXNlciAqKWNtZGJ1Zi5idWYsIGNtZGJ1Zi5idWZzeikpIHsKKwkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihrYnVmLCAodm9pZCBfX3VzZXIgKiljbWRidWYuYnVmLAorCQkJCSAgICAgICBjbWRidWYuYnVmc3opKSB7CiAJCQlkcm1fZnJlZShrYnVmLCBvcmlnX2J1ZnN6LCBEUk1fTUVNX0RSSVZFUik7CiAJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwogCQl9CkBAIC0yOTgxLDcgKzI5MjksNyBAQAogCQl2YWx1ZSA9IGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0OwogCQlicmVhazsKIAljYXNlIFJBREVPTl9QQVJBTV9SRUdJU1RFUl9IQU5ETEU6Ci0JCXZhbHVlID0gZGV2X3ByaXYtPm1taW9fb2Zmc2V0OworCQl2YWx1ZSA9IGRldl9wcml2LT5tbWlvLT5vZmZzZXQ7CiAJCWJyZWFrOwogCWNhc2UgUkFERU9OX1BBUkFNX1NUQVRVU19IQU5ETEU6CiAJCXZhbHVlID0gZGV2X3ByaXYtPnJpbmdfcnB0cl9vZmZzZXQ7CkBAIC0zMDA0LDYgKzI5NTIsMTUgQEAKIAljYXNlIFJBREVPTl9QQVJBTV9HQVJUX1RFWF9IQU5ETEU6CiAJCXZhbHVlID0gZGV2X3ByaXYtPmdhcnRfdGV4dHVyZXNfb2Zmc2V0OwogCQlicmVhazsKKwkKKwljYXNlIFJBREVPTl9QQVJBTV9DQVJEX1RZUEU6CisJCWlmIChkZXZfcHJpdi0+ZmxhZ3MgJiBDSElQX0lTX1BDSUUpCisJCQl2YWx1ZSA9IFJBREVPTl9DQVJEX1BDSUU7CisJCWVsc2UgaWYgKGRldl9wcml2LT5mbGFncyAmIENISVBfSVNfQUdQKQorCQkJdmFsdWUgPSBSQURFT05fQ0FSRF9BR1A7CisJCWVsc2UKKwkJCXZhbHVlID0gUkFERU9OX0NBUkRfUENJOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KQEAgLTMwNjYsMTAgKzMwMjMsMTEgQEAKIC8qIFdoZW4gYSBjbGllbnQgZGllczoKICAqICAgIC0gQ2hlY2sgZm9yIGFuZCBjbGVhbiB1cCBmbGlwcGVkIHBhZ2Ugc3RhdGUKICAqICAgIC0gRnJlZSBhbnkgYWxsb2NlZCBHQVJUIG1lbW9yeS4KKyAqICAgIC0gRnJlZSBhbnkgYWxsb2NlZCByYWRlb24gc3VyZmFjZXMuCiAgKgogICogRFJNIGluZnJhc3RydWN0dXJlIHRha2VzIGNhcmUgb2YgcmVjbGFpbWluZyBkbWEgYnVmZmVycy4KICAqLwotdm9pZCByYWRlb25fZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApCit2b2lkIHJhZGVvbl9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApCiB7CiAJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKIAkJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTMwODIsMTYgKzMwNDAsMTcgQEAKIAl9CiB9CiAKLXZvaWQgcmFkZW9uX2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHJhZGVvbl9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldikKIHsKIAlyYWRlb25fZG9fcmVsZWFzZShkZXYpOwogfQogCi1pbnQgcmFkZW9uX2RyaXZlcl9vcGVuX2hlbHBlcihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9maWxlX3QgKiBmaWxwX3ByaXYpCitpbnQgcmFkZW9uX2RyaXZlcl9vcGVuKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqcmFkZW9uX3ByaXY7CiAKKwlEUk1fREVCVUcoIlxuIik7CiAJcmFkZW9uX3ByaXYgPQogCSAgICAoc3RydWN0IGRybV9yYWRlb25fZHJpdmVyX2ZpbGVfZmllbGRzICopCiAJICAgIGRybV9hbGxvYyhzaXplb2YoKnJhZGVvbl9wcml2KSwgRFJNX01FTV9GSUxFUyk7CkBAIC0zMTAwLDYgKzMwNTksNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWZpbHBfcHJpdi0+ZHJpdmVyX3ByaXYgPSByYWRlb25fcHJpdjsKKwogCWlmIChkZXZfcHJpdikKIAkJcmFkZW9uX3ByaXYtPnJhZGVvbl9mYl9kZWx0YSA9IGRldl9wcml2LT5mYl9sb2NhdGlvbjsKIAllbHNlCkBAIC0zMTA3LDcgKzMwNjcsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHJhZGVvbl9kcml2ZXJfZnJlZV9maWxwX3ByaXYoZHJtX2RldmljZV90ICogZGV2LCBkcm1fZmlsZV90ICogZmlscF9wcml2KQordm9pZCByYWRlb25fZHJpdmVyX3Bvc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9maWxlX3QgKiBmaWxwX3ByaXYpCiB7CiAJc3RydWN0IGRybV9yYWRlb25fZHJpdmVyX2ZpbGVfZmllbGRzICpyYWRlb25fcHJpdiA9CiAJICAgIGZpbHBfcHJpdi0+ZHJpdmVyX3ByaXY7CkBAIC0zMTE2LDMzICszMDc2LDMzIEBACiB9CiAKIGRybV9pb2N0bF9kZXNjX3QgcmFkZW9uX2lvY3Rsc1tdID0gewotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9JTklUKV0gPSB7cmFkZW9uX2NwX2luaXQsIDEsIDF9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9TVEFSVCldID0ge3JhZGVvbl9jcF9zdGFydCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX1NUT1ApXSA9IHtyYWRlb25fY3Bfc3RvcCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX1JFU0VUKV0gPSB7cmFkZW9uX2NwX3Jlc2V0LCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfSURMRSldID0ge3JhZGVvbl9jcF9pZGxlLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfUkVTVU1FKV0gPSB7cmFkZW9uX2NwX3Jlc3VtZSwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1JFU0VUKV0gPSB7cmFkZW9uX2VuZ2luZV9yZXNldCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0ZVTExTQ1JFRU4pXSA9IHtyYWRlb25fZnVsbHNjcmVlbiwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NXQVApXSA9IHtyYWRlb25fY3Bfc3dhcCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NMRUFSKV0gPSB7cmFkZW9uX2NwX2NsZWFyLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fVkVSVEVYKV0gPSB7cmFkZW9uX2NwX3ZlcnRleCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0lORElDRVMpXSA9IHtyYWRlb25fY3BfaW5kaWNlcywgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1RFWFRVUkUpXSA9IHtyYWRlb25fY3BfdGV4dHVyZSwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NUSVBQTEUpXSA9IHtyYWRlb25fY3Bfc3RpcHBsZSwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0lORElSRUNUKV0gPSB7cmFkZW9uX2NwX2luZGlyZWN0LCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fVkVSVEVYMildID0ge3JhZGVvbl9jcF92ZXJ0ZXgyLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ01EQlVGKV0gPSB7cmFkZW9uX2NwX2NtZGJ1ZiwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0dFVFBBUkFNKV0gPSB7cmFkZW9uX2NwX2dldHBhcmFtLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fRkxJUCldID0ge3JhZGVvbl9jcF9mbGlwLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQUxMT0MpXSA9IHtyYWRlb25fbWVtX2FsbG9jLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fRlJFRSldID0ge3JhZGVvbl9tZW1fZnJlZSwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0lOSVRfSEVBUCldID0ge3JhZGVvbl9tZW1faW5pdF9oZWFwLCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fSVJRX0VNSVQpXSA9IHtyYWRlb25faXJxX2VtaXQsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JUlFfV0FJVCldID0ge3JhZGVvbl9pcnFfd2FpdCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NFVFBBUkFNKV0gPSB7cmFkZW9uX2NwX3NldHBhcmFtLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fU1VSRl9BTExPQyldID0ge3JhZGVvbl9zdXJmYWNlX2FsbG9jLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fU1VSRl9GUkVFKV0gPSB7cmFkZW9uX3N1cmZhY2VfZnJlZSwgMSwgMH0KKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfSU5JVCldID0ge3JhZGVvbl9jcF9pbml0LCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9TVEFSVCldID0ge3JhZGVvbl9jcF9zdGFydCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfU1RPUCldID0ge3JhZGVvbl9jcF9zdG9wLCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9SRVNFVCldID0ge3JhZGVvbl9jcF9yZXNldCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfSURMRSldID0ge3JhZGVvbl9jcF9pZGxlLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX1JFU1VNRSldID0ge3JhZGVvbl9jcF9yZXN1bWUsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fUkVTRVQpXSA9IHtyYWRlb25fZW5naW5lX3Jlc2V0LCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0ZVTExTQ1JFRU4pXSA9IHtyYWRlb25fZnVsbHNjcmVlbiwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9TV0FQKV0gPSB7cmFkZW9uX2NwX3N3YXAsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ0xFQVIpXSA9IHtyYWRlb25fY3BfY2xlYXIsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fVkVSVEVYKV0gPSB7cmFkZW9uX2NwX3ZlcnRleCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JTkRJQ0VTKV0gPSB7cmFkZW9uX2NwX2luZGljZXMsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fVEVYVFVSRSldID0ge3JhZGVvbl9jcF90ZXh0dXJlLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NUSVBQTEUpXSA9IHtyYWRlb25fY3Bfc3RpcHBsZSwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JTkRJUkVDVCldID0ge3JhZGVvbl9jcF9pbmRpcmVjdCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fVkVSVEVYMildID0ge3JhZGVvbl9jcF92ZXJ0ZXgyLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NNREJVRildID0ge3JhZGVvbl9jcF9jbWRidWYsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fR0VUUEFSQU0pXSA9IHtyYWRlb25fY3BfZ2V0cGFyYW0sIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fRkxJUCldID0ge3JhZGVvbl9jcF9mbGlwLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0FMTE9DKV0gPSB7cmFkZW9uX21lbV9hbGxvYywgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9GUkVFKV0gPSB7cmFkZW9uX21lbV9mcmVlLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0lOSVRfSEVBUCldID0ge3JhZGVvbl9tZW1faW5pdF9oZWFwLCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JUlFfRU1JVCldID0ge3JhZGVvbl9pcnFfZW1pdCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JUlFfV0FJVCldID0ge3JhZGVvbl9pcnFfd2FpdCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9TRVRQQVJBTSldID0ge3JhZGVvbl9jcF9zZXRwYXJhbSwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9TVVJGX0FMTE9DKV0gPSB7cmFkZW9uX3N1cmZhY2VfYWxsb2MsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fU1VSRl9GUkVFKV0gPSB7cmFkZW9uX3N1cmZhY2VfZnJlZSwgRFJNX0FVVEh9CiB9OwogCiBpbnQgcmFkZW9uX21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKHJhZGVvbl9pb2N0bHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfYmNpLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9iY2kuYwppbmRleCA2ZDEwNTE1Li4wZDQyNmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9iY2kuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9iY2kuYwpAQCAtNTMzLDIzICs1MzMsOSBAQAogCWRldl9wcml2LT5maXJzdF9kbWFfcGFnZSA9IGRldl9wcml2LT5jdXJyZW50X2RtYV9wYWdlID0gMDsKIH0KIAotLyoKLSAqIEluaXRhbGl6ZSBtYXBwaW5ncy4gT24gU2F2YWdlNCBhbmQgU2F2YWdlSVggdGhlIGFsaWdubWVudAotICogYW5kIHNpemUgb2YgdGhlIGFwZXJ0dXJlIGlzIG5vdCBzdWl0YWJsZSBmb3IgYXV0b21hdGljIE1UUlIgc2V0dXAKLSAqIGluIGRybV9hZGRtYXAuIFRoZXJlZm9yZSB3ZSBkbyBpdCBtYW51YWxseSBiZWZvcmUgdGhlIG1hcHMgYXJlCi0gKiBpbml0aWFsaXplZC4gV2UgYWxzbyBuZWVkIHRvIHRha2UgY2FyZSBvZiBkZWxldGluZyB0aGUgTVRSUnMgaW4KLSAqIHBvc3RjbGVhbnVwLgotICovCi1pbnQgc2F2YWdlX3ByZWluaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBsb25nIGNoaXBzZXQpCitpbnQgc2F2YWdlX2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGNoaXBzZXQpCiB7CiAJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2OwotCXVuc2lnbmVkIGxvbmcgbW1pb19iYXNlLCBmYl9iYXNlLCBmYl9zaXplLCBhcGVydHVyZV9iYXNlOwotCS8qIGZiX3JzcmMgYW5kIGFwZXJfcnNyYyBhcmVuJ3QgcmVhbGx5IHVzZWQgY3VycmVudGx5LCBidXQgc3RpbGwgZXhpc3QKLQkgKiBpbiBjYXNlIHdlIGRlY2lkZSB3ZSBuZWVkIGluZm9ybWF0aW9uIG9uIHRoZSBCQVIgZm9yIEJTRCBpbiB0aGUKLQkgKiBmdXR1cmUuCi0JICovCi0JdW5zaWduZWQgaW50IGZiX3JzcmMsIGFwZXJfcnNyYzsKLQlpbnQgcmV0ID0gMDsKIAogCWRldl9wcml2ID0gZHJtX2FsbG9jKHNpemVvZihkcm1fc2F2YWdlX3ByaXZhdGVfdCksIERSTV9NRU1fRFJJVkVSKTsKIAlpZiAoZGV2X3ByaXYgPT0gTlVMTCkKQEAgLTU1Nyw4ICs1NDMsMzAgQEAKIAogCW1lbXNldChkZXZfcHJpdiwgMCwgc2l6ZW9mKGRybV9zYXZhZ2VfcHJpdmF0ZV90KSk7CiAJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisKIAlkZXZfcHJpdi0+Y2hpcHNldCA9IChlbnVtIHNhdmFnZV9mYW1pbHkpY2hpcHNldDsKIAorCXJldHVybiAwOworfQorCisKKy8qCisgKiBJbml0YWxpemUgbWFwcGluZ3MuIE9uIFNhdmFnZTQgYW5kIFNhdmFnZUlYIHRoZSBhbGlnbm1lbnQKKyAqIGFuZCBzaXplIG9mIHRoZSBhcGVydHVyZSBpcyBub3Qgc3VpdGFibGUgZm9yIGF1dG9tYXRpYyBNVFJSIHNldHVwCisgKiBpbiBkcm1fYWRkbWFwLiBUaGVyZWZvcmUgd2UgYWRkIHRoZW0gbWFudWFsbHkgYmVmb3JlIHRoZSBtYXBzIGFyZQorICogaW5pdGlhbGl6ZWQsIGFuZCB0ZWFyIHRoZW0gZG93biBvbiBsYXN0IGNsb3NlLgorICovCitpbnQgc2F2YWdlX2RyaXZlcl9maXJzdG9wZW4oZHJtX2RldmljZV90ICpkZXYpCit7CisJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1bnNpZ25lZCBsb25nIG1taW9fYmFzZSwgZmJfYmFzZSwgZmJfc2l6ZSwgYXBlcnR1cmVfYmFzZTsKKwkvKiBmYl9yc3JjIGFuZCBhcGVyX3JzcmMgYXJlbid0IHJlYWxseSB1c2VkIGN1cnJlbnRseSwgYnV0IHN0aWxsIGV4aXN0CisJICogaW4gY2FzZSB3ZSBkZWNpZGUgd2UgbmVlZCBpbmZvcm1hdGlvbiBvbiB0aGUgQkFSIGZvciBCU0QgaW4gdGhlCisJICogZnV0dXJlLgorCSAqLworCXVuc2lnbmVkIGludCBmYl9yc3JjLCBhcGVyX3JzcmM7CisJaW50IHJldCA9IDA7CisKIAlkZXZfcHJpdi0+bXRyclswXS5oYW5kbGUgPSAtMTsKIAlkZXZfcHJpdi0+bXRyclsxXS5oYW5kbGUgPSAtMTsKIAlkZXZfcHJpdi0+bXRyclsyXS5oYW5kbGUgPSAtMTsKQEAgLTU3NiwyNiArNTg0LDI0IEBACiAJCQlkZXZfcHJpdi0+bXRyclswXS5iYXNlID0gZmJfYmFzZTsKIAkJCWRldl9wcml2LT5tdHJyWzBdLnNpemUgPSAweDAxMDAwMDAwOwogCQkJZGV2X3ByaXYtPm10cnJbMF0uaGFuZGxlID0KLQkJCSAgICBtdHJyX2FkZChkZXZfcHJpdi0+bXRyclswXS5iYXNlLAotCQkJCSAgICAgZGV2X3ByaXYtPm10cnJbMF0uc2l6ZSwgTVRSUl9UWVBFX1dSQ09NQiwKLQkJCQkgICAgIDEpOworCQkJICAgIGRybV9tdHJyX2FkZChkZXZfcHJpdi0+bXRyclswXS5iYXNlLAorCQkJCSAgICAgICAgIGRldl9wcml2LT5tdHJyWzBdLnNpemUsIERSTV9NVFJSX1dDKTsKIAkJCWRldl9wcml2LT5tdHJyWzFdLmJhc2UgPSBmYl9iYXNlICsgMHgwMjAwMDAwMDsKIAkJCWRldl9wcml2LT5tdHJyWzFdLnNpemUgPSAweDAyMDAwMDAwOwogCQkJZGV2X3ByaXYtPm10cnJbMV0uaGFuZGxlID0KLQkJCSAgICBtdHJyX2FkZChkZXZfcHJpdi0+bXRyclsxXS5iYXNlLAotCQkJCSAgICAgZGV2X3ByaXYtPm10cnJbMV0uc2l6ZSwgTVRSUl9UWVBFX1dSQ09NQiwKLQkJCQkgICAgIDEpOworCQkJICAgIGRybV9tdHJyX2FkZChkZXZfcHJpdi0+bXRyclsxXS5iYXNlLAorCQkJCQkgZGV2X3ByaXYtPm10cnJbMV0uc2l6ZSwgRFJNX01UUlJfV0MpOwogCQkJZGV2X3ByaXYtPm10cnJbMl0uYmFzZSA9IGZiX2Jhc2UgKyAweDA0MDAwMDAwOwogCQkJZGV2X3ByaXYtPm10cnJbMl0uc2l6ZSA9IDB4MDQwMDAwMDA7CiAJCQlkZXZfcHJpdi0+bXRyclsyXS5oYW5kbGUgPQotCQkJICAgIG10cnJfYWRkKGRldl9wcml2LT5tdHJyWzJdLmJhc2UsCi0JCQkJICAgICBkZXZfcHJpdi0+bXRyclsyXS5zaXplLCBNVFJSX1RZUEVfV1JDT01CLAotCQkJCSAgICAgMSk7CisJCQkgICAgZHJtX210cnJfYWRkKGRldl9wcml2LT5tdHJyWzJdLmJhc2UsCisJCQkJCSBkZXZfcHJpdi0+bXRyclsyXS5zaXplLCBEUk1fTVRSUl9XQyk7CiAJCX0gZWxzZSB7CiAJCQlEUk1fRVJST1IoInN0cmFuZ2UgcGNpX3Jlc291cmNlX2xlbiAlMDhseFxuIiwKIAkJCQkgIGRybV9nZXRfcmVzb3VyY2VfbGVuKGRldiwgMCkpOwogCQl9Ci0JfSBlbHNlIGlmIChjaGlwc2V0ICE9IFMzX1NVUEVSU0FWQUdFICYmIGNoaXBzZXQgIT0gUzNfU0FWQUdFMjAwMCkgeworCX0gZWxzZSBpZiAoZGV2X3ByaXYtPmNoaXBzZXQgIT0gUzNfU1VQRVJTQVZBR0UgJiYKKwkJICAgZGV2X3ByaXYtPmNoaXBzZXQgIT0gUzNfU0FWQUdFMjAwMCkgewogCQltbWlvX2Jhc2UgPSBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KGRldiwgMCk7CiAJCWZiX3JzcmMgPSAxOwogCQlmYl9iYXNlID0gZHJtX2dldF9yZXNvdXJjZV9zdGFydChkZXYsIDEpOwpAQCAtNjA5LDkgKzYxNSw4IEBACiAJCQlkZXZfcHJpdi0+bXRyclswXS5iYXNlID0gZmJfYmFzZTsKIAkJCWRldl9wcml2LT5tdHJyWzBdLnNpemUgPSAweDA4MDAwMDAwOwogCQkJZGV2X3ByaXYtPm10cnJbMF0uaGFuZGxlID0KLQkJCSAgICBtdHJyX2FkZChkZXZfcHJpdi0+bXRyclswXS5iYXNlLAotCQkJCSAgICAgZGV2X3ByaXYtPm10cnJbMF0uc2l6ZSwgTVRSUl9UWVBFX1dSQ09NQiwKLQkJCQkgICAgIDEpOworCQkJICAgIGRybV9tdHJyX2FkZChkZXZfcHJpdi0+bXRyclswXS5iYXNlLAorCQkJCQkgZGV2X3ByaXYtPm10cnJbMF0uc2l6ZSwgRFJNX01UUlJfV0MpOwogCQl9IGVsc2UgewogCQkJRFJNX0VSUk9SKCJzdHJhbmdlIHBjaV9yZXNvdXJjZV9sZW4gJTA4bHhcbiIsCiAJCQkJICBkcm1fZ2V0X3Jlc291cmNlX2xlbihkZXYsIDEpKTsKQEAgLTY0OCwxNiArNjUzLDIxIEBACiAvKgogICogRGVsZXRlIE1UUlJzIGFuZCBmcmVlIGRldmljZS1wcml2YXRlIGRhdGEuCiAgKi8KLWludCBzYXZhZ2VfcG9zdGNsZWFudXAoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBzYXZhZ2VfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKmRldikKIHsKIAlkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IDM7ICsraSkKIAkJaWYgKGRldl9wcml2LT5tdHJyW2ldLmhhbmRsZSA+PSAwKQotCQkJbXRycl9kZWwoZGV2X3ByaXYtPm10cnJbaV0uaGFuZGxlLAorCQkJZHJtX210cnJfZGVsKGRldl9wcml2LT5tdHJyW2ldLmhhbmRsZSwKIAkJCQkgZGV2X3ByaXYtPm10cnJbaV0uYmFzZSwKLQkJCQkgZGV2X3ByaXYtPm10cnJbaV0uc2l6ZSk7CisJCQkJIGRldl9wcml2LT5tdHJyW2ldLnNpemUsIERSTV9NVFJSX1dDKTsKK30KKworaW50IHNhdmFnZV9kcml2ZXJfdW5sb2FkKGRybV9kZXZpY2VfdCAqZGV2KQoreworCWRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKIAlkcm1fZnJlZShkZXZfcHJpdiwgc2l6ZW9mKGRybV9zYXZhZ2VfcHJpdmF0ZV90KSwgRFJNX01FTV9EUklWRVIpOwogCkBAIC05OTQsOCArMTAwNCw3IEBACiAgKiBETUEgYnVmZmVyIG1hbmFnZW1lbnQKICAqLwogCi1zdGF0aWMgaW50IHNhdmFnZV9iY2lfZ2V0X2J1ZmZlcnMoRFJNRklMRSBmaWxwLCBkcm1fZGV2aWNlX3QgKiBkZXYsCi0JCQkJICBkcm1fZG1hX3QgKiBkKQorc3RhdGljIGludCBzYXZhZ2VfYmNpX2dldF9idWZmZXJzKERSTUZJTEUgZmlscCwgZHJtX2RldmljZV90ICpkZXYsIGRybV9kbWFfdCAqZCkKIHsKIAlkcm1fYnVmX3QgKmJ1ZjsKIAlpbnQgaTsKQEAgLTEwNTcsNyArMTA2Niw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCBzYXZhZ2VfcmVjbGFpbV9idWZmZXJzKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKQordm9pZCBzYXZhZ2VfcmVjbGFpbV9idWZmZXJzKGRybV9kZXZpY2VfdCAqZGV2LCBEUk1GSUxFIGZpbHApCiB7CiAJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CiAJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTEwOTAsMTAgKzEwOTksMTAgQEAKIH0KIAogZHJtX2lvY3RsX2Rlc2NfdCBzYXZhZ2VfaW9jdGxzW10gPSB7Ci0JW0RSTV9JT0NUTF9OUihEUk1fU0FWQUdFX0JDSV9JTklUKV0gPSB7c2F2YWdlX2JjaV9pbml0LCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9TQVZBR0VfQkNJX0NNREJVRildID0ge3NhdmFnZV9iY2lfY21kYnVmLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9TQVZBR0VfQkNJX0VWRU5UX0VNSVQpXSA9IHtzYXZhZ2VfYmNpX2V2ZW50X2VtaXQsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1NBVkFHRV9CQ0lfRVZFTlRfV0FJVCldID0ge3NhdmFnZV9iY2lfZXZlbnRfd2FpdCwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fU0FWQUdFX0JDSV9JTklUKV0gPSB7c2F2YWdlX2JjaV9pbml0LCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX1NBVkFHRV9CQ0lfQ01EQlVGKV0gPSB7c2F2YWdlX2JjaV9jbWRidWYsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9TQVZBR0VfQkNJX0VWRU5UX0VNSVQpXSA9IHtzYXZhZ2VfYmNpX2V2ZW50X2VtaXQsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9TQVZBR0VfQkNJX0VWRU5UX1dBSVQpXSA9IHtzYXZhZ2VfYmNpX2V2ZW50X3dhaXQsIERSTV9BVVRIfSwKIH07CiAKIGludCBzYXZhZ2VfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUoc2F2YWdlX2lvY3Rscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2Rydi5jCmluZGV4IDIyZDc5OWMuLmFhNmMwZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2Rydi5jCkBAIC0zMCwzMSArMzAsNiBAQAogCiAjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgogCi1zdGF0aWMgaW50IHBvc3Rpbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JRFJNX0lORk8oIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkOiAlc1xuIiwKLQkJIERSSVZFUl9OQU1FLAotCQkgRFJJVkVSX01BSk9SLAotCQkgRFJJVkVSX01JTk9SLAotCQkgRFJJVkVSX1BBVENITEVWRUwsCi0JCSBEUklWRVJfREFURSwgZGV2LT5wcmltYXJ5Lm1pbm9yLCBwY2lfcHJldHR5X25hbWUoZGV2LT5wZGV2KQotCSAgICApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZlcnNpb24oZHJtX3ZlcnNpb25fdCAqIHZlcnNpb24pCi17Ci0JaW50IGxlbjsKLQotCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBEUklWRVJfTUFKT1I7Ci0JdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IERSSVZFUl9NSU5PUjsKLQl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTDsKLQlEUk1fQ09QWSh2ZXJzaW9uLT5uYW1lLCBEUklWRVJfTkFNRSk7Ci0JRFJNX0NPUFkodmVyc2lvbi0+ZGF0ZSwgRFJJVkVSX0RBVEUpOwotCURSTV9DT1BZKHZlcnNpb24tPmRlc2MsIERSSVZFUl9ERVNDKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0gewogCXNhdmFnZV9QQ0lfSURTCiB9OwpAQCAtNjMsMTMgKzM4LDEzIEBACiAJLmRyaXZlcl9mZWF0dXJlcyA9CiAJICAgIERSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1VTRV9NVFJSIHwgRFJJVkVSX0hBVkVfRE1BIHwgRFJJVkVSX1BDSV9ETUEsCiAJLmRldl9wcml2X3NpemUgPSBzaXplb2YoZHJtX3NhdmFnZV9idWZfcHJpdl90KSwKLQkucHJlaW5pdCA9IHNhdmFnZV9wcmVpbml0LAotCS5wb3N0aW5pdCA9IHBvc3Rpbml0LAotCS5wb3N0Y2xlYW51cCA9IHNhdmFnZV9wb3N0Y2xlYW51cCwKKwkubG9hZCA9IHNhdmFnZV9kcml2ZXJfbG9hZCwKKwkuZmlyc3RvcGVuID0gc2F2YWdlX2RyaXZlcl9maXJzdG9wZW4sCisJLmxhc3RjbG9zZSA9IHNhdmFnZV9kcml2ZXJfbGFzdGNsb3NlLAorCS51bmxvYWQgPSBzYXZhZ2VfZHJpdmVyX3VubG9hZCwKIAkucmVjbGFpbV9idWZmZXJzID0gc2F2YWdlX3JlY2xhaW1fYnVmZmVycywKIAkuZ2V0X21hcF9vZnMgPSBkcm1fY29yZV9nZXRfbWFwX29mcywKIAkuZ2V0X3JlZ19vZnMgPSBkcm1fY29yZV9nZXRfcmVnX29mcywKLQkudmVyc2lvbiA9IHZlcnNpb24sCiAJLmlvY3RscyA9IHNhdmFnZV9pb2N0bHMsCiAJLmRtYV9pb2N0bCA9IHNhdmFnZV9iY2lfYnVmZmVycywKIAkuZm9wcyA9IHsKQEAgLTgwLDEyICs1NSwxOSBAQAogCQkgLm1tYXAgPSBkcm1fbW1hcCwKIAkJIC5wb2xsID0gZHJtX3BvbGwsCiAJCSAuZmFzeW5jID0gZHJtX2Zhc3luYywKLQkJIH0KLQksCisJfSwKKwogCS5wY2lfZHJpdmVyID0gewotCQkgICAgICAgLm5hbWUgPSBEUklWRVJfTkFNRSwKLQkJICAgICAgIC5pZF90YWJsZSA9IHBjaWlkbGlzdCwKLQkJICAgICAgIH0KKwkJIC5uYW1lID0gRFJJVkVSX05BTUUsCisJCSAuaWRfdGFibGUgPSBwY2lpZGxpc3QsCisJfSwKKworCS5uYW1lID0gRFJJVkVSX05BTUUsCisJLmRlc2MgPSBEUklWRVJfREVTQywKKwkuZGF0ZSA9IERSSVZFUl9EQVRFLAorCS5tYWpvciA9IERSSVZFUl9NQUpPUiwKKwkubWlub3IgPSBEUklWRVJfTUlOT1IsCisJLnBhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTCwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNhdmFnZV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2Rydi5oCmluZGV4IGE0YjBmYTkuLmRkNDZjYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2Rydi5oCkBAIC0xLDUgKzEsNSBAQAotLyogc2F2YWdlX2Rydi5oIC0tIFByaXZhdGUgaGVhZGVyIGZvciB0aGUgc2F2YWdlIGRyaXZlcgotICoKKy8qIHNhdmFnZV9kcnYuaCAtLSBQcml2YXRlIGhlYWRlciBmb3IgdGhlIHNhdmFnZSBkcml2ZXIgKi8KKy8qCiAgKiBDb3B5cmlnaHQgMjAwNCAgRmVsaXggS3VlaGxpbmcKICAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgpAQCAtMTkyLDcgKzE5Miw3IEBACiAJLyogRXJyLCB0aGVyZSBpcyBhIG1hY3JvIHdhaXRfZXZlbnQgaW4gaW5jbHVkZS9saW51eC93YWl0LmguCiAJICogQXZvaWQgdW53YW50ZWQgbWFjcm8gZXhwYW5zaW9uLiAqLwogCXZvaWQgKCplbWl0X2NsaXBfcmVjdCkgKHN0cnVjdCBkcm1fc2F2YWdlX3ByaXZhdGUgKiBkZXZfcHJpdiwKLQkJCQlkcm1fY2xpcF9yZWN0X3QgKiBwYm94KTsKKwkJCQljb25zdCBkcm1fY2xpcF9yZWN0X3QgKiBwYm94KTsKIAl2b2lkICgqZG1hX2ZsdXNoKSAoc3RydWN0IGRybV9zYXZhZ2VfcHJpdmF0ZSAqIGRldl9wcml2KTsKIH0gZHJtX3NhdmFnZV9wcml2YXRlX3Q7CiAKQEAgLTIwOCwxNiArMjA4LDE4IEBACiBleHRlcm4gdm9pZCBzYXZhZ2VfZG1hX3dhaXQoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwgdW5zaWduZWQgaW50IHBhZ2UpOwogZXh0ZXJuIHVpbnQzMl90ICpzYXZhZ2VfZG1hX2FsbG9jKGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCiAJCQkJICB1bnNpZ25lZCBpbnQgbik7Ci1leHRlcm4gaW50IHNhdmFnZV9wcmVpbml0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KTsKLWV4dGVybiBpbnQgc2F2YWdlX3Bvc3RjbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gaW50IHNhdmFnZV9kcml2ZXJfbG9hZChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KTsKK2V4dGVybiBpbnQgc2F2YWdlX2RyaXZlcl9maXJzdG9wZW4oZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIHZvaWQgc2F2YWdlX2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIGludCBzYXZhZ2VfZHJpdmVyX3VubG9hZChkcm1fZGV2aWNlX3QgKmRldik7CiBleHRlcm4gaW50IHNhdmFnZV9kb19jbGVhbnVwX2JjaShkcm1fZGV2aWNlX3QgKiBkZXYpOwogZXh0ZXJuIHZvaWQgc2F2YWdlX3JlY2xhaW1fYnVmZmVycyhkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCk7CiAKIC8qIHN0YXRlIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIHZvaWQgc2F2YWdlX2VtaXRfY2xpcF9yZWN0X3MzZChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJCSAgICAgIGRybV9jbGlwX3JlY3RfdCAqIHBib3gpOworCQkJCSAgICAgIGNvbnN0IGRybV9jbGlwX3JlY3RfdCAqIHBib3gpOwogZXh0ZXJuIHZvaWQgc2F2YWdlX2VtaXRfY2xpcF9yZWN0X3M0KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkJICAgICBkcm1fY2xpcF9yZWN0X3QgKiBwYm94KTsKKwkJCQkgICAgIGNvbnN0IGRybV9jbGlwX3JlY3RfdCAqIHBib3gpOwogCiAjZGVmaW5lIFNBVkFHRV9GQl9TSVpFX1MzCTB4MDEwMDAwMDAJLyogIDE2TUIgKi8KICNkZWZpbmUgU0FWQUdFX0ZCX1NJWkVfUzQJMHgwMjAwMDAwMAkvKiAgMzJNQiAqLwpAQCAtNTAwLDE1ICs1MDIsNiBAQAogCiAjZGVmaW5lIEJDSV9XUklURSggdmFsICkgKmJjaV9wdHIrKyA9ICh1aW50MzJfdCkodmFsKQogCi0jZGVmaW5lIEJDSV9DT1BZX0ZST01fVVNFUihzcmMsbikgZG8gewkJCQlcCi0gICAgdW5zaWduZWQgaW50IGk7CQkJCQkJXAotICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsJCQkJCVwKLQl1aW50MzJfdCB2YWw7CQkJCQkJXAotCURSTV9HRVRfVVNFUl9VTkNIRUNLRUQodmFsLCAmKCh1aW50MzJfdCopKHNyYykpW2ldKTsJXAotCUJDSV9XUklURSh2YWwpOwkJCQkJCVwKLSAgICB9CQkJCQkJCQlcCi19IHdoaWxlKDApCi0KIC8qCiAgKiBjb21tYW5kIERNQSBzdXBwb3J0CiAgKi8KQEAgLTUzNCw4ICs1MjcsOCBAQAogCiAjZGVmaW5lIERNQV9XUklURSggdmFsICkgKmRtYV9wdHIrKyA9ICh1aW50MzJfdCkodmFsKQogCi0jZGVmaW5lIERNQV9DT1BZX0ZST01fVVNFUihzcmMsbikgZG8gewkJCQlcCi0JRFJNX0NPUFlfRlJPTV9VU0VSX1VOQ0hFQ0tFRChkbWFfcHRyLCAoc3JjKSwgKG4pKjQpOwlcCisjZGVmaW5lIERNQV9DT1BZKHNyYywgbikgZG8gewkJCQkJXAorCW1lbWNweShkbWFfcHRyLCAoc3JjKSwgKG4pKjQpOwkJCQlcCiAJZG1hX3B0ciArPSBuOwkJCQkJCVwKIH0gd2hpbGUoMCkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2Vfc3RhdGUuYyBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX3N0YXRlLmMKaW5kZXggZTg3YTVkNS4uZWYyNTgxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2Vfc3RhdGUuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9zdGF0ZS5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSAic2F2YWdlX2Rydi5oIgogCiB2b2lkIHNhdmFnZV9lbWl0X2NsaXBfcmVjdF9zM2QoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCSAgICAgICBkcm1fY2xpcF9yZWN0X3QgKiBwYm94KQorCQkJICAgICAgIGNvbnN0IGRybV9jbGlwX3JlY3RfdCAqIHBib3gpCiB7CiAJdWludDMyX3Qgc2NzdGFydCA9IGRldl9wcml2LT5zdGF0ZS5zM2QubmV3X3Njc3RhcnQ7CiAJdWludDMyX3Qgc2NlbmQgPSBkZXZfcHJpdi0+c3RhdGUuczNkLm5ld19zY2VuZDsKQEAgLTUzLDcgKzUzLDcgQEAKIH0KIAogdm9pZCBzYXZhZ2VfZW1pdF9jbGlwX3JlY3RfczQoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCSAgICAgIGRybV9jbGlwX3JlY3RfdCAqIHBib3gpCisJCQkgICAgICBjb25zdCBkcm1fY2xpcF9yZWN0X3QgKiBwYm94KQogewogCXVpbnQzMl90IGRyYXdjdHJsMCA9IGRldl9wcml2LT5zdGF0ZS5zNC5uZXdfZHJhd2N0cmwwOwogCXVpbnQzMl90IGRyYXdjdHJsMSA9IGRldl9wcml2LT5zdGF0ZS5zNC5uZXdfZHJhd2N0cmwxOwpAQCAtMTE1LDE4ICsxMTUsMTkgQEAKIAogI2RlZmluZSBTQVZFX1NUQVRFKHJlZyx3aGVyZSkJCQlcCiAJaWYoc3RhcnQgPD0gcmVnICYmIHN0YXJ0K2NvdW50ID4gcmVnKQlcCi0JCURSTV9HRVRfVVNFUl9VTkNIRUNLRUQoZGV2X3ByaXYtPnN0YXRlLndoZXJlLCAmcmVnc1tyZWctc3RhcnRdKQorCQlkZXZfcHJpdi0+c3RhdGUud2hlcmUgPSByZWdzW3JlZyAtIHN0YXJ0XQogI2RlZmluZSBTQVZFX1NUQVRFX01BU0socmVnLHdoZXJlLG1hc2spIGRvIHsJCQlcCiAJaWYoc3RhcnQgPD0gcmVnICYmIHN0YXJ0K2NvdW50ID4gcmVnKSB7CQkJXAogCQl1aW50MzJfdCB0bXA7CQkJCQlcCi0JCURSTV9HRVRfVVNFUl9VTkNIRUNLRUQodG1wLCAmcmVnc1tyZWctc3RhcnRdKTsJXAorCQl0bXAgPSByZWdzW3JlZyAtIHN0YXJ0XTsJCQlcCiAJCWRldl9wcml2LT5zdGF0ZS53aGVyZSA9ICh0bXAgJiAobWFzaykpIHwJXAogCQkJKGRldl9wcml2LT5zdGF0ZS53aGVyZSAmIH4obWFzaykpOwlcCiAJfQkJCQkJCQlcCiB9IHdoaWxlICgwKQorCiBzdGF0aWMgaW50IHNhdmFnZV92ZXJpZnlfc3RhdGVfczNkKGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCiAJCQkJICAgdW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgY291bnQsCi0JCQkJICAgY29uc3QgdWludDMyX3QgX191c2VyICogcmVncykKKwkJCQkgICBjb25zdCB1aW50MzJfdCAqcmVncykKIHsKIAlpZiAoc3RhcnQgPCBTQVZBR0VfVEVYUEFMQUREUl9TM0QgfHwKIAkgICAgc3RhcnQgKyBjb3VudCAtIDEgPiBTQVZBR0VfREVTVFRFWFJXV0FURVJNQVJLX1MzRCkgewpAQCAtMTQ4LDggKzE0OSw3IEBACiAJCVNBVkVfU1RBVEUoU0FWQUdFX1RFWEFERFJfUzNELCBzM2QudGV4YWRkcik7CiAJCWlmIChkZXZfcHJpdi0+c3RhdGUuczNkLnRleGN0cmwgJiBTQVZBR0VfVEVYQ1RSTF9URVhFTl9NQVNLKQogCQkJcmV0dXJuIHNhdmFnZV92ZXJpZnlfdGV4YWRkcihkZXZfcHJpdiwgMCwKLQkJCQkJCSAgICAgZGV2X3ByaXYtPnN0YXRlLnMzZC4KLQkJCQkJCSAgICAgdGV4YWRkcik7CisJCQkJCQlkZXZfcHJpdi0+c3RhdGUuczNkLnRleGFkZHIpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAKIHN0YXRpYyBpbnQgc2F2YWdlX3ZlcmlmeV9zdGF0ZV9zNChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LAogCQkJCSAgdW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgY291bnQsCi0JCQkJICBjb25zdCB1aW50MzJfdCBfX3VzZXIgKiByZWdzKQorCQkJCSAgY29uc3QgdWludDMyX3QgKnJlZ3MpCiB7CiAJaW50IHJldCA9IDA7CiAKQEAgLTE3NCwxOSArMTc0LDE4IEBACiAJCQl+U0FWQUdFX1NDSVNTT1JfTUFTS19TNCk7CiAKIAkvKiBpZiBhbnkgdGV4dHVyZSByZWdzIHdlcmUgY2hhbmdlZCAuLi4gKi8KLQlpZiAoc3RhcnQgPD0gU0FWQUdFX1RFWERFU0NSX1M0ICYmIHN0YXJ0ICsgY291bnQgPiBTQVZBR0VfVEVYUEFMQUREUl9TNCkgeworCWlmIChzdGFydCA8PSBTQVZBR0VfVEVYREVTQ1JfUzQgJiYKKwkgICAgc3RhcnQgKyBjb3VudCA+IFNBVkFHRV9URVhQQUxBRERSX1M0KSB7CiAJCS8qIC4uLiBjaGVjayB0ZXh0dXJlIHN0YXRlICovCiAJCVNBVkVfU1RBVEUoU0FWQUdFX1RFWERFU0NSX1M0LCBzNC50ZXhkZXNjcik7CiAJCVNBVkVfU1RBVEUoU0FWQUdFX1RFWEFERFIwX1M0LCBzNC50ZXhhZGRyMCk7CiAJCVNBVkVfU1RBVEUoU0FWQUdFX1RFWEFERFIxX1M0LCBzNC50ZXhhZGRyMSk7CiAJCWlmIChkZXZfcHJpdi0+c3RhdGUuczQudGV4ZGVzY3IgJiBTQVZBR0VfVEVYREVTQ1JfVEVYMEVOX01BU0spCi0JCQlyZXQgfD0KLQkJCSAgICBzYXZhZ2VfdmVyaWZ5X3RleGFkZHIoZGV2X3ByaXYsIDAsCi0JCQkJCQkgIGRldl9wcml2LT5zdGF0ZS5zNC50ZXhhZGRyMCk7CisJCQlyZXQgfD0gc2F2YWdlX3ZlcmlmeV90ZXhhZGRyKGRldl9wcml2LCAwLAorCQkJCQkJZGV2X3ByaXYtPnN0YXRlLnM0LnRleGFkZHIwKTsKIAkJaWYgKGRldl9wcml2LT5zdGF0ZS5zNC50ZXhkZXNjciAmIFNBVkFHRV9URVhERVNDUl9URVgxRU5fTUFTSykKLQkJCXJldCB8PQotCQkJICAgIHNhdmFnZV92ZXJpZnlfdGV4YWRkcihkZXZfcHJpdiwgMSwKLQkJCQkJCSAgZGV2X3ByaXYtPnN0YXRlLnM0LnRleGFkZHIxKTsKKwkJCXJldCB8PSBzYXZhZ2VfdmVyaWZ5X3RleGFkZHIoZGV2X3ByaXYsIDEsCisJCQkJCQlkZXZfcHJpdi0+c3RhdGUuczQudGV4YWRkcjEpOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0xOTcsNyArMTk2LDcgQEAKIAogc3RhdGljIGludCBzYXZhZ2VfZGlzcGF0Y2hfc3RhdGUoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKIAkJCQkgY29uc3QgZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKiBjbWRfaGVhZGVyLAotCQkJCSBjb25zdCB1aW50MzJfdCBfX3VzZXIgKiByZWdzKQorCQkJCSBjb25zdCB1aW50MzJfdCAqcmVncykKIHsKIAl1bnNpZ25lZCBpbnQgY291bnQgPSBjbWRfaGVhZGVyLT5zdGF0ZS5jb3VudDsKIAl1bnNpZ25lZCBpbnQgc3RhcnQgPSBjbWRfaGVhZGVyLT5zdGF0ZS5zdGFydDsKQEAgLTIwOSw5ICsyMDgsNiBAQAogCWlmICghY291bnQpCiAJCXJldHVybiAwOwogCi0JaWYgKERSTV9WRVJJRllBUkVBX1JFQUQocmVncywgY291bnQgKiA0KSkKLQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKLQogCWlmIChTM19TQVZBR0UzRF9TRVJJRVMoZGV2X3ByaXYtPmNoaXBzZXQpKSB7CiAJCXJldCA9IHNhdmFnZV92ZXJpZnlfc3RhdGVfczNkKGRldl9wcml2LCBzdGFydCwgY291bnQsIHJlZ3MpOwogCQlpZiAocmV0ICE9IDApCkBAIC0yMzYsOCArMjMyLDggQEAKIAkJLyogc2Npc3NvciByZWdzIGFyZSBlbWl0dGVkIGluIHNhdmFnZV9kaXNwYXRjaF9kcmF3ICovCiAJCWlmIChzdGFydCA8IFNBVkFHRV9EUkFXQ1RSTDBfUzQpIHsKIAkJCWlmIChzdGFydCArIGNvdW50ID4gU0FWQUdFX0RSQVdDVFJMMV9TNCArIDEpCi0JCQkJY291bnQyID0KLQkJCQkgICAgY291bnQgLSAoU0FWQUdFX0RSQVdDVFJMMV9TNCArIDEgLSBzdGFydCk7CisJCQkJY291bnQyID0gY291bnQgLQorCQkJCQkgKFNBVkFHRV9EUkFXQ1RSTDFfUzQgKyAxIC0gc3RhcnQpOwogCQkJaWYgKHN0YXJ0ICsgY291bnQgPiBTQVZBR0VfRFJBV0NUUkwwX1M0KQogCQkJCWNvdW50ID0gU0FWQUdFX0RSQVdDVFJMMF9TNCAtIHN0YXJ0OwogCQl9IGVsc2UgaWYgKHN0YXJ0IDw9IFNBVkFHRV9EUkFXQ1RSTDFfUzQpIHsKQEAgLTI2Myw3ICsyNTksNyBAQAogCQl3aGlsZSAoY291bnQgPiAwKSB7CiAJCQl1bnNpZ25lZCBpbnQgbiA9IGNvdW50IDwgMjU1ID8gY291bnQgOiAyNTU7CiAJCQlETUFfU0VUX1JFR0lTVEVSUyhzdGFydCwgbik7Ci0JCQlETUFfQ09QWV9GUk9NX1VTRVIocmVncywgbik7CisJCQlETUFfQ09QWShyZWdzLCBuKTsKIAkJCWNvdW50IC09IG47CiAJCQlzdGFydCArPSBuOwogCQkJcmVncyArPSBuOwpAQCAtNDIxLDggKzQxNyw4IEBACiAKIHN0YXRpYyBpbnQgc2F2YWdlX2Rpc3BhdGNoX3ZiX3ByaW0oZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKIAkJCQkgICBjb25zdCBkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCAqIGNtZF9oZWFkZXIsCi0JCQkJICAgY29uc3QgdWludDMyX3QgX191c2VyICogdnR4YnVmLAotCQkJCSAgIHVuc2lnbmVkIGludCB2Yl9zaXplLCB1bnNpZ25lZCBpbnQgdmJfc3RyaWRlKQorCQkJCSAgIGNvbnN0IHVpbnQzMl90ICp2dHhidWYsIHVuc2lnbmVkIGludCB2Yl9zaXplLAorCQkJCSAgIHVuc2lnbmVkIGludCB2Yl9zdHJpZGUpCiB7CiAJdW5zaWduZWQgY2hhciByZW9yZGVyID0gMDsKIAl1bnNpZ25lZCBpbnQgcHJpbSA9IGNtZF9oZWFkZXItPnByaW0ucHJpbTsKQEAgLTUwNyw4ICs1MDMsNyBAQAogCiAJCQlmb3IgKGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgY291bnQ7ICsraSkgewogCQkJCXVuc2lnbmVkIGludCBqID0gaSArIHJlb3JkZXJbaSAlIDNdOwotCQkJCURNQV9DT1BZX0ZST01fVVNFUigmdnR4YnVmW3ZiX3N0cmlkZSAqIGpdLAotCQkJCQkJICAgdnR4X3NpemUpOworCQkJCURNQV9DT1BZKCZ2dHhidWZbdmJfc3RyaWRlICogal0sIHZ0eF9zaXplKTsKIAkJCX0KIAogCQkJRE1BX0NPTU1JVCgpOwpAQCAtNTE3LDEzICs1MTIsMTIgQEAKIAkJCURNQV9EUkFXX1BSSU1JVElWRShjb3VudCwgcHJpbSwgc2tpcCk7CiAKIAkJCWlmICh2Yl9zdHJpZGUgPT0gdnR4X3NpemUpIHsKLQkJCQlETUFfQ09QWV9GUk9NX1VTRVIoJnZ0eGJ1Zlt2Yl9zdHJpZGUgKiBzdGFydF0sCi0JCQkJCQkgICB2dHhfc2l6ZSAqIGNvdW50KTsKKwkJCQlETUFfQ09QWSgmdnR4YnVmW3ZiX3N0cmlkZSAqIHN0YXJ0XSwgCisJCQkJCSB2dHhfc2l6ZSAqIGNvdW50KTsKIAkJCX0gZWxzZSB7CiAJCQkJZm9yIChpID0gc3RhcnQ7IGkgPCBzdGFydCArIGNvdW50OyArK2kpIHsKLQkJCQkJRE1BX0NPUFlfRlJPTV9VU0VSKCZ2dHhidWYKLQkJCQkJCQkgICBbdmJfc3RyaWRlICogaV0sCi0JCQkJCQkJICAgdnR4X3NpemUpOworCQkJCQlETUFfQ09QWSgmdnR4YnVmIFt2Yl9zdHJpZGUgKiBpXSwKKwkJCQkJCSB2dHhfc2l6ZSk7CiAJCQkJfQogCQkJfQogCkBAIC01NDEsNyArNTM1LDcgQEAKIAogc3RhdGljIGludCBzYXZhZ2VfZGlzcGF0Y2hfZG1hX2lkeChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LAogCQkJCSAgIGNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICogY21kX2hlYWRlciwKLQkJCQkgICBjb25zdCB1aW50MTZfdCBfX3VzZXIgKiB1c3JfaWR4LAorCQkJCSAgIGNvbnN0IHVpbnQxNl90ICppZHgsCiAJCQkJICAgY29uc3QgZHJtX2J1Zl90ICogZG1hYnVmKQogewogCXVuc2lnbmVkIGNoYXIgcmVvcmRlciA9IDA7CkBAIC02MjgsMTEgKzYyMiw4IEBACiAJd2hpbGUgKG4gIT0gMCkgewogCQkvKiBDYW4gZW1pdCB1cCB0byAyNTUgaW5kaWNlcyAoODUgdHJpYW5nbGVzKSBhdCBvbmNlLiAqLwogCQl1bnNpZ25lZCBpbnQgY291bnQgPSBuID4gMjU1ID8gMjU1IDogbjsKLQkJLyogSXMgaXQgb2sgdG8gYWxsb2NhdGUgNTEwIGJ5dGVzIG9uIHRoZSBzdGFjayBpbiBhbiBpb2N0bD8gKi8KLQkJdWludDE2X3QgaWR4WzI1NV07CiAKLQkJLyogQ29weSBhbmQgY2hlY2sgaW5kaWNlcyAqLwotCQlEUk1fQ09QWV9GUk9NX1VTRVJfVU5DSEVDS0VEKGlkeCwgdXNyX2lkeCwgY291bnQgKiAyKTsKKwkJLyogY2hlY2sgaW5kaWNlcyAqLwogCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogCQkJaWYgKGlkeFtpXSA+IGRtYWJ1Zi0+dG90YWwgLyAzMikgewogCQkJCURSTV9FUlJPUigiaWR4WyV1XT0ldSBvdXQgb2YgcmFuZ2UgKDAtJXUpXG4iLApAQCAtNjUyLDggKzY0Myw4IEBACiAKIAkJCWZvciAoaSA9IDE7IGkgKyAxIDwgY291bnQ7IGkgKz0gMikKIAkJCQlCQ0lfV1JJVEUoaWR4W2kgKyByZW9yZGVyW2kgJSAzXV0gfAotCQkJCQkgIChpZHhbaSArIDEgKyByZW9yZGVyWyhpICsgMSkgJSAzXV0gPDwKLQkJCQkJICAgMTYpKTsKKwkJCQkJICAoaWR4W2kgKyAxICsKKwkJCQkJICAgcmVvcmRlclsoaSArIDEpICUgM11dIDw8IDE2KSk7CiAJCQlpZiAoaSA8IGNvdW50KQogCQkJCUJDSV9XUklURShpZHhbaSArIHJlb3JkZXJbaSAlIDNdXSk7CiAJCX0gZWxzZSBpZiAoUzNfU0FWQUdFM0RfU0VSSUVTKGRldl9wcml2LT5jaGlwc2V0KSkgewpAQCAtNjc0LDcgKzY2NSw3IEBACiAJCQkJQkNJX1dSSVRFKGlkeFtpXSk7CiAJCX0KIAotCQl1c3JfaWR4ICs9IGNvdW50OworCQlpZHggKz0gY291bnQ7CiAJCW4gLT0gY291bnQ7CiAKIAkJcHJpbSB8PSBCQ0lfQ01EX0RSQVdfQ09OVDsKQEAgLTY4NSw4ICs2NzYsOCBAQAogCiBzdGF0aWMgaW50IHNhdmFnZV9kaXNwYXRjaF92Yl9pZHgoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKIAkJCQkgIGNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICogY21kX2hlYWRlciwKLQkJCQkgIGNvbnN0IHVpbnQxNl90IF9fdXNlciAqIHVzcl9pZHgsCi0JCQkJICBjb25zdCB1aW50MzJfdCBfX3VzZXIgKiB2dHhidWYsCisJCQkJICBjb25zdCB1aW50MTZfdCAqaWR4LAorCQkJCSAgY29uc3QgdWludDMyX3QgKnZ0eGJ1ZiwKIAkJCQkgIHVuc2lnbmVkIGludCB2Yl9zaXplLCB1bnNpZ25lZCBpbnQgdmJfc3RyaWRlKQogewogCXVuc2lnbmVkIGNoYXIgcmVvcmRlciA9IDA7CkBAIC03NTEsMTEgKzc0Miw4IEBACiAJd2hpbGUgKG4gIT0gMCkgewogCQkvKiBDYW4gZW1pdCB1cCB0byAyNTUgdmVydGljZXMgKDg1IHRyaWFuZ2xlcykgYXQgb25jZS4gKi8KIAkJdW5zaWduZWQgaW50IGNvdW50ID0gbiA+IDI1NSA/IDI1NSA6IG47Ci0JCS8qIElzIGl0IG9rIHRvIGFsbG9jYXRlIDUxMCBieXRlcyBvbiB0aGUgc3RhY2sgaW4gYW4gaW9jdGw/ICovCi0JCXVpbnQxNl90IGlkeFsyNTVdOwotCi0JCS8qIENvcHkgYW5kIGNoZWNrIGluZGljZXMgKi8KLQkJRFJNX0NPUFlfRlJPTV9VU0VSX1VOQ0hFQ0tFRChpZHgsIHVzcl9pZHgsIGNvdW50ICogMik7CisJCQorCQkvKiBDaGVjayBpbmRpY2VzICovCiAJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAJCQlpZiAoaWR4W2ldID4gdmJfc2l6ZSAvICh2Yl9zdHJpZGUgKiA0KSkgewogCQkJCURSTV9FUlJPUigiaWR4WyV1XT0ldSBvdXQgb2YgcmFuZ2UgKDAtJXUpXG4iLApAQCAtNzc1LDggKzc2Myw3IEBACiAKIAkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAJCQkJdW5zaWduZWQgaW50IGogPSBpZHhbaSArIHJlb3JkZXJbaSAlIDNdXTsKLQkJCQlETUFfQ09QWV9GUk9NX1VTRVIoJnZ0eGJ1Zlt2Yl9zdHJpZGUgKiBqXSwKLQkJCQkJCSAgIHZ0eF9zaXplKTsKKwkJCQlETUFfQ09QWSgmdnR4YnVmW3ZiX3N0cmlkZSAqIGpdLCB2dHhfc2l6ZSk7CiAJCQl9CiAKIAkJCURNQV9DT01NSVQoKTsKQEAgLTc4NiwxNCArNzczLDEzIEBACiAKIAkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAJCQkJdW5zaWduZWQgaW50IGogPSBpZHhbaV07Ci0JCQkJRE1BX0NPUFlfRlJPTV9VU0VSKCZ2dHhidWZbdmJfc3RyaWRlICogal0sCi0JCQkJCQkgICB2dHhfc2l6ZSk7CisJCQkJRE1BX0NPUFkoJnZ0eGJ1Zlt2Yl9zdHJpZGUgKiBqXSwgdnR4X3NpemUpOwogCQkJfQogCiAJCQlETUFfQ09NTUlUKCk7CiAJCX0KIAotCQl1c3JfaWR4ICs9IGNvdW50OworCQlpZHggKz0gY291bnQ7CiAJCW4gLT0gY291bnQ7CiAKIAkJcHJpbSB8PSBCQ0lfQ01EX0RSQVdfQ09OVDsKQEAgLTgwNCwxMSArNzkwLDExIEBACiAKIHN0YXRpYyBpbnQgc2F2YWdlX2Rpc3BhdGNoX2NsZWFyKGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCiAJCQkJIGNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICogY21kX2hlYWRlciwKLQkJCQkgY29uc3QgZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgX191c2VyICogZGF0YSwKKwkJCQkgY29uc3QgZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKmRhdGEsCiAJCQkJIHVuc2lnbmVkIGludCBuYm94LAotCQkJCSBjb25zdCBkcm1fY2xpcF9yZWN0X3QgX191c2VyICogdXNyX2JveGVzKQorCQkJCSBjb25zdCBkcm1fY2xpcF9yZWN0X3QgKmJveGVzKQogewotCXVuc2lnbmVkIGludCBmbGFncyA9IGNtZF9oZWFkZXItPmNsZWFyMC5mbGFncywgbWFzaywgdmFsdWU7CisJdW5zaWduZWQgaW50IGZsYWdzID0gY21kX2hlYWRlci0+Y2xlYXIwLmZsYWdzOwogCXVuc2lnbmVkIGludCBjbGVhcl9jbWQ7CiAJdW5zaWduZWQgaW50IGksIG5idWZzOwogCURNQV9MT0NBTFM7CkBAIC04MTYsOSArODAyLDYgQEAKIAlpZiAobmJveCA9PSAwKQogCQlyZXR1cm4gMDsKIAotCURSTV9HRVRfVVNFUl9VTkNIRUNLRUQobWFzaywgJmRhdGEtPmNsZWFyMS5tYXNrKTsKLQlEUk1fR0VUX1VTRVJfVU5DSEVDS0VEKHZhbHVlLCAmZGF0YS0+Y2xlYXIxLnZhbHVlKTsKLQogCWNsZWFyX2NtZCA9IEJDSV9DTURfUkVDVCB8IEJDSV9DTURfUkVDVF9YUCB8IEJDSV9DTURfUkVDVF9ZUCB8CiAJICAgIEJDSV9DTURfU0VORF9DT0xPUiB8IEJDSV9DTURfREVTVF9QQkRfTkVXOwogCUJDSV9DTURfU0VUX1JPUChjbGVhcl9jbWQsIDB4Q0MpOwpAQCAtODI4LDIxICs4MTEsMTkgQEAKIAlpZiAobmJ1ZnMgPT0gMCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAobWFzayAhPSAweGZmZmZmZmZmKSB7CisJaWYgKGRhdGEtPmNsZWFyMS5tYXNrICE9IDB4ZmZmZmZmZmYpIHsKIAkJLyogc2V0IG1hc2sgKi8KIAkJQkVHSU5fRE1BKDIpOwogCQlETUFfU0VUX1JFR0lTVEVSUyhTQVZBR0VfQklUUExBTkVXVE1BU0ssIDEpOwotCQlETUFfV1JJVEUobWFzayk7CisJCURNQV9XUklURShkYXRhLT5jbGVhcjEubWFzayk7CiAJCURNQV9DT01NSVQoKTsKIAl9CiAJZm9yIChpID0gMDsgaSA8IG5ib3g7ICsraSkgewotCQlkcm1fY2xpcF9yZWN0X3QgYm94OwogCQl1bnNpZ25lZCBpbnQgeCwgeSwgdywgaDsKIAkJdW5zaWduZWQgaW50IGJ1ZjsKLQkJRFJNX0NPUFlfRlJPTV9VU0VSX1VOQ0hFQ0tFRCgmYm94LCAmdXNyX2JveGVzW2ldLCBzaXplb2YoYm94KSk7Ci0JCXggPSBib3gueDEsIHkgPSBib3gueTE7Ci0JCXcgPSBib3gueDIgLSBib3gueDE7Ci0JCWggPSBib3gueTIgLSBib3gueTE7CisJCXggPSBib3hlc1tpXS54MSwgeSA9IGJveGVzW2ldLnkxOworCQl3ID0gYm94ZXNbaV0ueDIgLSBib3hlc1tpXS54MTsKKwkJaCA9IGJveGVzW2ldLnkyIC0gYm94ZXNbaV0ueTE7CiAJCUJFR0lOX0RNQShuYnVmcyAqIDYpOwogCQlmb3IgKGJ1ZiA9IFNBVkFHRV9GUk9OVDsgYnVmIDw9IFNBVkFHRV9ERVBUSDsgYnVmIDw8PSAxKSB7CiAJCQlpZiAoIShmbGFncyAmIGJ1ZikpCkBAIC04NjIsMTMgKzg0MywxMyBAQAogCQkJCURNQV9XUklURShkZXZfcHJpdi0+ZGVwdGhfYmQpOwogCQkJCWJyZWFrOwogCQkJfQotCQkJRE1BX1dSSVRFKHZhbHVlKTsKKwkJCURNQV9XUklURShkYXRhLT5jbGVhcjEudmFsdWUpOwogCQkJRE1BX1dSSVRFKEJDSV9YX1koeCwgeSkpOwogCQkJRE1BX1dSSVRFKEJDSV9XX0godywgaCkpOwogCQl9CiAJCURNQV9DT01NSVQoKTsKIAl9Ci0JaWYgKG1hc2sgIT0gMHhmZmZmZmZmZikgeworCWlmIChkYXRhLT5jbGVhcjEubWFzayAhPSAweGZmZmZmZmZmKSB7CiAJCS8qIHJlc2V0IG1hc2sgKi8KIAkJQkVHSU5fRE1BKDIpOwogCQlETUFfU0VUX1JFR0lTVEVSUyhTQVZBR0VfQklUUExBTkVXVE1BU0ssIDEpOwpAQCAtODgwLDggKzg2MSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgc2F2YWdlX2Rpc3BhdGNoX3N3YXAoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCQl1bnNpZ25lZCBpbnQgbmJveCwKLQkJCQljb25zdCBkcm1fY2xpcF9yZWN0X3QgX191c2VyICogdXNyX2JveGVzKQorCQkJCXVuc2lnbmVkIGludCBuYm94LCBjb25zdCBkcm1fY2xpcF9yZWN0X3QgKmJveGVzKQogewogCXVuc2lnbmVkIGludCBzd2FwX2NtZDsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTg5NSwxNiArODc1LDE0IEBACiAJQkNJX0NNRF9TRVRfUk9QKHN3YXBfY21kLCAweENDKTsKIAogCWZvciAoaSA9IDA7IGkgPCBuYm94OyArK2kpIHsKLQkJZHJtX2NsaXBfcmVjdF90IGJveDsKLQkJRFJNX0NPUFlfRlJPTV9VU0VSX1VOQ0hFQ0tFRCgmYm94LCAmdXNyX2JveGVzW2ldLCBzaXplb2YoYm94KSk7Ci0KIAkJQkVHSU5fRE1BKDYpOwogCQlETUFfV1JJVEUoc3dhcF9jbWQpOwogCQlETUFfV1JJVEUoZGV2X3ByaXYtPmJhY2tfb2Zmc2V0KTsKIAkJRE1BX1dSSVRFKGRldl9wcml2LT5iYWNrX2JkKTsKLQkJRE1BX1dSSVRFKEJDSV9YX1koYm94LngxLCBib3gueTEpKTsKLQkJRE1BX1dSSVRFKEJDSV9YX1koYm94LngxLCBib3gueTEpKTsKLQkJRE1BX1dSSVRFKEJDSV9XX0goYm94LngyIC0gYm94LngxLCBib3gueTIgLSBib3gueTEpKTsKKwkJRE1BX1dSSVRFKEJDSV9YX1koYm94ZXNbaV0ueDEsIGJveGVzW2ldLnkxKSk7CisJCURNQV9XUklURShCQ0lfWF9ZKGJveGVzW2ldLngxLCBib3hlc1tpXS55MSkpOworCQlETUFfV1JJVEUoQkNJX1dfSChib3hlc1tpXS54MiAtIGJveGVzW2ldLngxLAorCQkJCSAgYm94ZXNbaV0ueTIgLSBib3hlc1tpXS55MSkpOwogCQlETUFfQ09NTUlUKCk7CiAJfQogCkBAIC05MTIsNjggKzg5MCw1MiBAQAogfQogCiBzdGF0aWMgaW50IHNhdmFnZV9kaXNwYXRjaF9kcmF3KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkJY29uc3QgZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgX191c2VyICogc3RhcnQsCi0JCQkJY29uc3QgZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgX191c2VyICogZW5kLAorCQkJCWNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICpzdGFydCwKKwkJCQljb25zdCBkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCAqZW5kLAogCQkJCWNvbnN0IGRybV9idWZfdCAqIGRtYWJ1ZiwKLQkJCQljb25zdCB1bnNpZ25lZCBpbnQgX191c2VyICogdXNyX3Z0eGJ1ZiwKKwkJCQljb25zdCB1bnNpZ25lZCBpbnQgKnZ0eGJ1ZiwKIAkJCQl1bnNpZ25lZCBpbnQgdmJfc2l6ZSwgdW5zaWduZWQgaW50IHZiX3N0cmlkZSwKIAkJCQl1bnNpZ25lZCBpbnQgbmJveCwKLQkJCQljb25zdCBkcm1fY2xpcF9yZWN0X3QgX191c2VyICogdXNyX2JveGVzKQorCQkJCWNvbnN0IGRybV9jbGlwX3JlY3RfdCAqYm94ZXMpCiB7CiAJdW5zaWduZWQgaW50IGksIGo7CiAJaW50IHJldDsKIAogCWZvciAoaSA9IDA7IGkgPCBuYm94OyArK2kpIHsKLQkJZHJtX2NsaXBfcmVjdF90IGJveDsKLQkJY29uc3QgZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgX191c2VyICp1c3JfY21kYnVmOwotCQlEUk1fQ09QWV9GUk9NX1VTRVJfVU5DSEVDS0VEKCZib3gsICZ1c3JfYm94ZXNbaV0sIHNpemVvZihib3gpKTsKLQkJZGV2X3ByaXYtPmVtaXRfY2xpcF9yZWN0KGRldl9wcml2LCAmYm94KTsKKwkJY29uc3QgZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKmNtZGJ1ZjsKKwkJZGV2X3ByaXYtPmVtaXRfY2xpcF9yZWN0KGRldl9wcml2LCAmYm94ZXNbaV0pOwogCi0JCXVzcl9jbWRidWYgPSBzdGFydDsKLQkJd2hpbGUgKHVzcl9jbWRidWYgPCBlbmQpIHsKKwkJY21kYnVmID0gc3RhcnQ7CisJCXdoaWxlIChjbWRidWYgPCBlbmQpIHsKIAkJCWRybV9zYXZhZ2VfY21kX2hlYWRlcl90IGNtZF9oZWFkZXI7Ci0JCQlEUk1fQ09QWV9GUk9NX1VTRVJfVU5DSEVDS0VEKCZjbWRfaGVhZGVyLCB1c3JfY21kYnVmLAotCQkJCQkJICAgICBzaXplb2YoY21kX2hlYWRlcikpOwotCQkJdXNyX2NtZGJ1ZisrOworCQkJY21kX2hlYWRlciA9ICpjbWRidWY7CisJCQljbWRidWYrKzsKIAkJCXN3aXRjaCAoY21kX2hlYWRlci5jbWQuY21kKSB7CiAJCQljYXNlIFNBVkFHRV9DTURfRE1BX1BSSU06Ci0JCQkJcmV0ID0KLQkJCQkgICAgc2F2YWdlX2Rpc3BhdGNoX2RtYV9wcmltKGRldl9wcml2LAotCQkJCQkJCSAgICAgJmNtZF9oZWFkZXIsCi0JCQkJCQkJICAgICBkbWFidWYpOworCQkJCXJldCA9IHNhdmFnZV9kaXNwYXRjaF9kbWFfcHJpbSgKKwkJCQkJZGV2X3ByaXYsICZjbWRfaGVhZGVyLCBkbWFidWYpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBTQVZBR0VfQ01EX1ZCX1BSSU06Ci0JCQkJcmV0ID0KLQkJCQkgICAgc2F2YWdlX2Rpc3BhdGNoX3ZiX3ByaW0oZGV2X3ByaXYsCi0JCQkJCQkJICAgICZjbWRfaGVhZGVyLAotCQkJCQkJCSAgICAoY29uc3QgdWludDMyX3QKLQkJCQkJCQkgICAgIF9fdXNlciAqKQotCQkJCQkJCSAgICB1c3JfdnR4YnVmLCB2Yl9zaXplLAotCQkJCQkJCSAgICB2Yl9zdHJpZGUpOworCQkJCXJldCA9IHNhdmFnZV9kaXNwYXRjaF92Yl9wcmltKAorCQkJCQlkZXZfcHJpdiwgJmNtZF9oZWFkZXIsCisJCQkJCXZ0eGJ1ZiwgdmJfc2l6ZSwgdmJfc3RyaWRlKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgU0FWQUdFX0NNRF9ETUFfSURYOgogCQkJCWogPSAoY21kX2hlYWRlci5pZHguY291bnQgKyAzKSAvIDQ7CiAJCQkJLyogaiB3YXMgY2hlY2sgaW4gc2F2YWdlX2JjaV9jbWRidWYgKi8KLQkJCQlyZXQgPQotCQkJCSAgICBzYXZhZ2VfZGlzcGF0Y2hfZG1hX2lkeChkZXZfcHJpdiwKLQkJCQkJCQkgICAgJmNtZF9oZWFkZXIsCi0JCQkJCQkJICAgIChjb25zdCB1aW50MTZfdAotCQkJCQkJCSAgICAgX191c2VyICopCi0JCQkJCQkJICAgIHVzcl9jbWRidWYsIGRtYWJ1Zik7Ci0JCQkJdXNyX2NtZGJ1ZiArPSBqOworCQkJCXJldCA9IHNhdmFnZV9kaXNwYXRjaF9kbWFfaWR4KGRldl9wcml2LAorCQkJCQkmY21kX2hlYWRlciwgKGNvbnN0IHVpbnQxNl90ICopY21kYnVmLAorCQkJCQlkbWFidWYpOworCQkJCWNtZGJ1ZiArPSBqOwogCQkJCWJyZWFrOwogCQkJY2FzZSBTQVZBR0VfQ01EX1ZCX0lEWDoKIAkJCQlqID0gKGNtZF9oZWFkZXIuaWR4LmNvdW50ICsgMykgLyA0OwogCQkJCS8qIGogd2FzIGNoZWNrIGluIHNhdmFnZV9iY2lfY21kYnVmICovCi0JCQkJcmV0ID0KLQkJCQkgICAgc2F2YWdlX2Rpc3BhdGNoX3ZiX2lkeChkZXZfcHJpdiwKLQkJCQkJCQkgICAmY21kX2hlYWRlciwKLQkJCQkJCQkgICAoY29uc3QgdWludDE2X3QKLQkJCQkJCQkgICAgX191c2VyICopdXNyX2NtZGJ1ZiwKLQkJCQkJCQkgICAoY29uc3QgdWludDMyX3QKLQkJCQkJCQkgICAgX191c2VyICopdXNyX3Z0eGJ1ZiwKLQkJCQkJCQkgICB2Yl9zaXplLCB2Yl9zdHJpZGUpOwotCQkJCXVzcl9jbWRidWYgKz0gajsKKwkJCQlyZXQgPSBzYXZhZ2VfZGlzcGF0Y2hfdmJfaWR4KGRldl9wcml2LAorCQkJCQkmY21kX2hlYWRlciwgKGNvbnN0IHVpbnQxNl90ICopY21kYnVmLAorCQkJCQkoY29uc3QgdWludDMyX3QgKil2dHhidWYsIHZiX3NpemUsIAorCQkJCQl2Yl9zdHJpZGUpOworCQkJCWNtZGJ1ZiArPSBqOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQkvKiBXaGF0J3MgdGhlIGJlc3QgcmV0dXJuIGNvZGU/IEVGQVVMVD8gKi8KQEAgLTk5OCwxMCArOTYwLDEwIEBACiAJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CiAJZHJtX2J1Zl90ICpkbWFidWY7CiAJZHJtX3NhdmFnZV9jbWRidWZfdCBjbWRidWY7Ci0JZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgX191c2VyICp1c3JfY21kYnVmOwotCWRybV9zYXZhZ2VfY21kX2hlYWRlcl90IF9fdXNlciAqZmlyc3RfZHJhd19jbWQ7Ci0JdW5zaWduZWQgaW50IF9fdXNlciAqdXNyX3Z0eGJ1ZjsKLQlkcm1fY2xpcF9yZWN0X3QgX191c2VyICp1c3JfYm94ZXM7CisJZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKmtjbWRfYWRkciA9IE5VTEw7CisJZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKmZpcnN0X2RyYXdfY21kOworCXVuc2lnbmVkIGludCAqa3ZiX2FkZHIgPSBOVUxMOworCWRybV9jbGlwX3JlY3RfdCAqa2JveF9hZGRyID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgaSwgajsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMTAyNCwxNSArOTg2LDUzIEBACiAJCWRtYWJ1ZiA9IE5VTEw7CiAJfQogCi0JdXNyX2NtZGJ1ZiA9IChkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCBfX3VzZXIgKikgY21kYnVmLmNtZF9hZGRyOwotCXVzcl92dHhidWYgPSAodW5zaWduZWQgaW50IF9fdXNlciAqKWNtZGJ1Zi52Yl9hZGRyOwotCXVzcl9ib3hlcyA9IChkcm1fY2xpcF9yZWN0X3QgX191c2VyICopIGNtZGJ1Zi5ib3hfYWRkcjsKLQlpZiAoKGNtZGJ1Zi5zaXplICYmIERSTV9WRVJJRllBUkVBX1JFQUQodXNyX2NtZGJ1ZiwgY21kYnVmLnNpemUgKiA4KSkgfHwKLQkgICAgKGNtZGJ1Zi52Yl9zaXplICYmIERSTV9WRVJJRllBUkVBX1JFQUQodXNyX3Z0eGJ1ZiwgY21kYnVmLnZiX3NpemUpKQotCSAgICB8fCAoY21kYnVmLm5ib3gKLQkJJiYgRFJNX1ZFUklGWUFSRUFfUkVBRCh1c3JfYm94ZXMsCi0JCQkJICAgICAgIGNtZGJ1Zi5uYm94ICogc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCkpKSkKLQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkvKiBDb3B5IHRoZSB1c2VyIGJ1ZmZlcnMgaW50byBrZXJuZWwgdGVtcG9yYXJ5IGFyZWFzLiAgVGhpcyBoYXNuJ3QgYmVlbgorCSAqIGEgcGVyZm9ybWFuY2UgbG9zcyBjb21wYXJlZCB0byBWRVJJRllBUkVBX1JFQUQvCisJICogQ09QWV9GUk9NX1VTRVJfVU5DSEVDS0VEIHdoZW4gZG9uZSBpbiBvdGhlciBkcml2ZXJzLCBhbmQgaXMgY29ycmVjdAorCSAqIGZvciBsb2NraW5nIG9uIEZyZWVCU0QuCisJICovCisJaWYgKGNtZGJ1Zi5zaXplKSB7CisJCWtjbWRfYWRkciA9IGRybV9hbGxvYyhjbWRidWYuc2l6ZSAqIDgsIERSTV9NRU1fRFJJVkVSKTsKKwkJaWYgKGtjbWRfYWRkciA9PSBOVUxMKQorCQkJcmV0dXJuIEVOT01FTTsKKworCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGtjbWRfYWRkciwgY21kYnVmLmNtZF9hZGRyLAorCQkJCSAgICAgICBjbWRidWYuc2l6ZSAqIDgpKQorCQl7CisJCQlkcm1fZnJlZShrY21kX2FkZHIsIGNtZGJ1Zi5zaXplICogOCwgRFJNX01FTV9EUklWRVIpOworCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJfQorCQljbWRidWYuY21kX2FkZHIgPSBrY21kX2FkZHI7CisJfQorCWlmIChjbWRidWYudmJfc2l6ZSkgeworCQlrdmJfYWRkciA9IGRybV9hbGxvYyhjbWRidWYudmJfc2l6ZSwgRFJNX01FTV9EUklWRVIpOworCQlpZiAoa3ZiX2FkZHIgPT0gTlVMTCkgeworCQkJcmV0ID0gRFJNX0VSUihFTk9NRU0pOworCQkJZ290byBkb25lOworCQl9CisKKwkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihrdmJfYWRkciwgY21kYnVmLnZiX2FkZHIsCisJCQkJICAgICAgIGNtZGJ1Zi52Yl9zaXplKSkgeworCQkJcmV0ID0gRFJNX0VSUihFRkFVTFQpOworCQkJZ290byBkb25lOworCQl9CisJCWNtZGJ1Zi52Yl9hZGRyID0ga3ZiX2FkZHI7CisJfQorCWlmIChjbWRidWYubmJveCkgeworCQlrYm94X2FkZHIgPSBkcm1fYWxsb2MoY21kYnVmLm5ib3ggKiBzaXplb2YoZHJtX2NsaXBfcmVjdF90KSwKKwkJCQkgICAgICAgRFJNX01FTV9EUklWRVIpOworCQlpZiAoa2JveF9hZGRyID09IE5VTEwpIHsKKwkJCXJldCA9IERSTV9FUlIoRU5PTUVNKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoa2JveF9hZGRyLCBjbWRidWYuYm94X2FkZHIsCisJCQkJICAgICAgIGNtZGJ1Zi5uYm94ICogc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCkpKSB7CisJCQlyZXQgPSBEUk1fRVJSKEVGQVVMVCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwljbWRidWYuYm94X2FkZHIgPSBrYm94X2FkZHI7CisJfQogCiAJLyogTWFrZSBzdXJlIHdyaXRlcyB0byBETUEgYnVmZmVycyBhcmUgZmluaXNoZWQgYmVmb3JlIHNlbmRpbmcKIAkgKiBETUEgY29tbWFuZHMgdG8gdGhlIGdyYXBoaWNzIGhhcmR3YXJlLiAqLwpAQCAtMTA0Niw5ICsxMDQ2LDggQEAKIAlmaXJzdF9kcmF3X2NtZCA9IE5VTEw7CiAJd2hpbGUgKGkgPCBjbWRidWYuc2l6ZSkgewogCQlkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCBjbWRfaGVhZGVyOwotCQlEUk1fQ09QWV9GUk9NX1VTRVJfVU5DSEVDS0VEKCZjbWRfaGVhZGVyLCB1c3JfY21kYnVmLAotCQkJCQkgICAgIHNpemVvZihjbWRfaGVhZGVyKSk7Ci0JCXVzcl9jbWRidWYrKzsKKwkJY21kX2hlYWRlciA9ICooZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKiljbWRidWYuY21kX2FkZHI7CisJCWNtZGJ1Zi5jbWRfYWRkcisrOwogCQlpKys7CiAKIAkJLyogR3JvdXAgZHJhd2luZyBjb21tYW5kcyB3aXRoIHNhbWUgc3RhdGUgdG8gbWluaW1pemUKQEAgLTEwNjgsMjEgKzEwNjcsMTggQEAKIAkJY2FzZSBTQVZBR0VfQ01EX0RNQV9QUklNOgogCQljYXNlIFNBVkFHRV9DTURfVkJfUFJJTToKIAkJCWlmICghZmlyc3RfZHJhd19jbWQpCi0JCQkJZmlyc3RfZHJhd19jbWQgPSB1c3JfY21kYnVmIC0gMTsKLQkJCXVzcl9jbWRidWYgKz0gajsKKwkJCQlmaXJzdF9kcmF3X2NtZCA9IGNtZGJ1Zi5jbWRfYWRkciAtIDE7CisJCQljbWRidWYuY21kX2FkZHIgKz0gajsKIAkJCWkgKz0gajsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJaWYgKGZpcnN0X2RyYXdfY21kKSB7Ci0JCQkJcmV0ID0KLQkJCQkgICAgc2F2YWdlX2Rpc3BhdGNoX2RyYXcoZGV2X3ByaXYsCi0JCQkJCQkJIGZpcnN0X2RyYXdfY21kLAotCQkJCQkJCSB1c3JfY21kYnVmIC0gMSwgZG1hYnVmLAotCQkJCQkJCSB1c3JfdnR4YnVmLAotCQkJCQkJCSBjbWRidWYudmJfc2l6ZSwKLQkJCQkJCQkgY21kYnVmLnZiX3N0cmlkZSwKLQkJCQkJCQkgY21kYnVmLm5ib3gsCi0JCQkJCQkJIHVzcl9ib3hlcyk7CisJCQkJcmV0ID0gc2F2YWdlX2Rpc3BhdGNoX2RyYXcoCisJCQkJICAgICAgZGV2X3ByaXYsIGZpcnN0X2RyYXdfY21kLAorCQkJCSAgICAgIGNtZGJ1Zi5jbWRfYWRkciAtIDEsCisJCQkJICAgICAgZG1hYnVmLCBjbWRidWYudmJfYWRkciwgY21kYnVmLnZiX3NpemUsCisJCQkJICAgICAgY21kYnVmLnZiX3N0cmlkZSwKKwkJCQkgICAgICBjbWRidWYubmJveCwgY21kYnVmLmJveF9hZGRyKTsKIAkJCQlpZiAocmV0ICE9IDApCiAJCQkJCXJldHVybiByZXQ7CiAJCQkJZmlyc3RfZHJhd19jbWQgPSBOVUxMOwpAQCAtMTA5OCwxMiArMTA5NCwxMiBAQAogCQkJCURSTV9FUlJPUigiY29tbWFuZCBTQVZBR0VfQ01EX1NUQVRFIGV4dGVuZHMgIgogCQkJCQkgICJiZXlvbmQgZW5kIG9mIGNvbW1hbmQgYnVmZmVyXG4iKTsKIAkJCQlETUFfRkxVU0goKTsKLQkJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQkJCXJldCA9IERSTV9FUlIoRUlOVkFMKTsKKwkJCQlnb3RvIGRvbmU7CiAJCQl9CiAJCQlyZXQgPSBzYXZhZ2VfZGlzcGF0Y2hfc3RhdGUoZGV2X3ByaXYsICZjbWRfaGVhZGVyLAotCQkJCQkJICAgICh1aW50MzJfdCBfX3VzZXIgKikKLQkJCQkJCSAgICB1c3JfY21kYnVmKTsKLQkJCXVzcl9jbWRidWYgKz0gajsKKwkJCQkoY29uc3QgdWludDMyX3QgKiljbWRidWYuY21kX2FkZHIpOworCQkJY21kYnVmLmNtZF9hZGRyICs9IGo7CiAJCQlpICs9IGo7CiAJCQlicmVhazsKIAkJY2FzZSBTQVZBR0VfQ01EX0NMRUFSOgpAQCAtMTExMSwzOSArMTEwNyw0MCBAQAogCQkJCURSTV9FUlJPUigiY29tbWFuZCBTQVZBR0VfQ01EX0NMRUFSIGV4dGVuZHMgIgogCQkJCQkgICJiZXlvbmQgZW5kIG9mIGNvbW1hbmQgYnVmZmVyXG4iKTsKIAkJCQlETUFfRkxVU0goKTsKLQkJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQkJCXJldCA9IERSTV9FUlIoRUlOVkFMKTsKKwkJCQlnb3RvIGRvbmU7CiAJCQl9CiAJCQlyZXQgPSBzYXZhZ2VfZGlzcGF0Y2hfY2xlYXIoZGV2X3ByaXYsICZjbWRfaGVhZGVyLAotCQkJCQkJICAgIHVzcl9jbWRidWYsCi0JCQkJCQkgICAgY21kYnVmLm5ib3gsIHVzcl9ib3hlcyk7Ci0JCQl1c3JfY21kYnVmKys7CisJCQkJCQkgICAgY21kYnVmLmNtZF9hZGRyLAorCQkJCQkJICAgIGNtZGJ1Zi5uYm94LCBjbWRidWYuYm94X2FkZHIpOworCQkJY21kYnVmLmNtZF9hZGRyKys7CiAJCQlpKys7CiAJCQlicmVhazsKIAkJY2FzZSBTQVZBR0VfQ01EX1NXQVA6Ci0JCQlyZXQgPSBzYXZhZ2VfZGlzcGF0Y2hfc3dhcChkZXZfcHJpdiwKLQkJCQkJCSAgIGNtZGJ1Zi5uYm94LCB1c3JfYm94ZXMpOworCQkJcmV0ID0gc2F2YWdlX2Rpc3BhdGNoX3N3YXAoZGV2X3ByaXYsIGNtZGJ1Zi5uYm94LAorCQkJCQkJICAgY21kYnVmLmJveF9hZGRyKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJRFJNX0VSUk9SKCJpbnZhbGlkIGNvbW1hbmQgMHgleFxuIiwgY21kX2hlYWRlci5jbWQuY21kKTsKIAkJCURNQV9GTFVTSCgpOwotCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJCXJldCA9IERSTV9FUlIoRUlOVkFMKTsKKwkJCWdvdG8gZG9uZTsKIAkJfQogCiAJCWlmIChyZXQgIT0gMCkgewogCQkJRE1BX0ZMVVNIKCk7Ci0JCQlyZXR1cm4gcmV0OworCQkJZ290byBkb25lOwogCQl9CiAJfQogCiAJaWYgKGZpcnN0X2RyYXdfY21kKSB7Ci0JCXJldCA9Ci0JCSAgICBzYXZhZ2VfZGlzcGF0Y2hfZHJhdyhkZXZfcHJpdiwgZmlyc3RfZHJhd19jbWQsIHVzcl9jbWRidWYsCi0JCQkJCSBkbWFidWYsIHVzcl92dHhidWYsIGNtZGJ1Zi52Yl9zaXplLAotCQkJCQkgY21kYnVmLnZiX3N0cmlkZSwgY21kYnVmLm5ib3gsCi0JCQkJCSB1c3JfYm94ZXMpOworCQlyZXQgPSBzYXZhZ2VfZGlzcGF0Y2hfZHJhdyAoCisJCQlkZXZfcHJpdiwgZmlyc3RfZHJhd19jbWQsIGNtZGJ1Zi5jbWRfYWRkciwgZG1hYnVmLAorCQkJY21kYnVmLnZiX2FkZHIsIGNtZGJ1Zi52Yl9zaXplLCBjbWRidWYudmJfc3RyaWRlLAorCQkJY21kYnVmLm5ib3gsIGNtZGJ1Zi5ib3hfYWRkcik7CiAJCWlmIChyZXQgIT0gMCkgewogCQkJRE1BX0ZMVVNIKCk7Ci0JCQlyZXR1cm4gcmV0OworCQkJZ290byBkb25lOwogCQl9CiAJfQogCkBAIC0xMTU3LDUgKzExNTQsMTIgQEAKIAkJc2F2YWdlX2ZyZWVsaXN0X3B1dChkZXYsIGRtYWJ1Zik7CiAJfQogCi0JcmV0dXJuIDA7Citkb25lOgorCS8qIElmIHdlIGRpZG4ndCBuZWVkIHRvIGFsbG9jYXRlIHRoZW0sIHRoZXNlJ2xsIGJlIE5VTEwgKi8KKwlkcm1fZnJlZShrY21kX2FkZHIsIGNtZGJ1Zi5zaXplICogOCwgRFJNX01FTV9EUklWRVIpOworCWRybV9mcmVlKGt2Yl9hZGRyLCBjbWRidWYudmJfc2l6ZSwgRFJNX01FTV9EUklWRVIpOworCWRybV9mcmVlKGtib3hfYWRkciwgY21kYnVmLm5ib3ggKiBzaXplb2YoZHJtX2NsaXBfcmVjdF90KSwKKwkJIERSTV9NRU1fRFJJVkVSKTsKKworCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX2RybS5oCmluZGV4IDhmMjczZGEuLjMwZjdiMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vc2lzX2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX2RybS5oCkBAIC0xLDMgKzEsMjggQEAKKy8qIHNpc19kcnYuaCAtLSBQcml2YXRlIGhlYWRlciBmb3Igc2lzIGRyaXZlciAtKi0gbGludXgtYyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgMjAwNSBFcmljIEFuaG9sdAorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICovCiAKICNpZm5kZWYgX19TSVNfRFJNX0hfXwogI2RlZmluZSBfX1NJU19EUk1fSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX2Rydi5jCmluZGV4IDNjZWYxMDYuLjZmNmQ3ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vc2lzX2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX2Rydi5jCkBAIC0zMiwzMSArMzIsNiBAQAogCiAjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgogCi1zdGF0aWMgaW50IHBvc3Rpbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JRFJNX0lORk8oIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkOiAlc1xuIiwKLQkJIERSSVZFUl9OQU1FLAotCQkgRFJJVkVSX01BSk9SLAotCQkgRFJJVkVSX01JTk9SLAotCQkgRFJJVkVSX1BBVENITEVWRUwsCi0JCSBEUklWRVJfREFURSwgZGV2LT5wcmltYXJ5Lm1pbm9yLCBwY2lfcHJldHR5X25hbWUoZGV2LT5wZGV2KQotCSAgICApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZlcnNpb24oZHJtX3ZlcnNpb25fdCAqIHZlcnNpb24pCi17Ci0JaW50IGxlbjsKLQotCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBEUklWRVJfTUFKT1I7Ci0JdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IERSSVZFUl9NSU5PUjsKLQl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTDsKLQlEUk1fQ09QWSh2ZXJzaW9uLT5uYW1lLCBEUklWRVJfTkFNRSk7Ci0JRFJNX0NPUFkodmVyc2lvbi0+ZGF0ZSwgRFJJVkVSX0RBVEUpOwotCURSTV9DT1BZKHZlcnNpb24tPmRlc2MsIERSSVZFUl9ERVNDKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0gewogCXNpc2Rydl9QQ0lfSURTCiB9OwpAQCAtNjgsOCArNDMsNiBAQAogCS5yZWNsYWltX2J1ZmZlcnMgPSBkcm1fY29yZV9yZWNsYWltX2J1ZmZlcnMsCiAJLmdldF9tYXBfb2ZzID0gZHJtX2NvcmVfZ2V0X21hcF9vZnMsCiAJLmdldF9yZWdfb2ZzID0gZHJtX2NvcmVfZ2V0X3JlZ19vZnMsCi0JLnBvc3Rpbml0ID0gcG9zdGluaXQsCi0JLnZlcnNpb24gPSB2ZXJzaW9uLAogCS5pb2N0bHMgPSBzaXNfaW9jdGxzLAogCS5mb3BzID0gewogCQkgLm93bmVyID0gVEhJU19NT0RVTEUsCkBAIC03OSwxMSArNTIsMTggQEAKIAkJIC5tbWFwID0gZHJtX21tYXAsCiAJCSAucG9sbCA9IGRybV9wb2xsLAogCQkgLmZhc3luYyA9IGRybV9mYXN5bmMsCi0JCSB9LAorCX0sCiAJLnBjaV9kcml2ZXIgPSB7Ci0JCSAgICAgICAubmFtZSA9IERSSVZFUl9OQU1FLAotCQkgICAgICAgLmlkX3RhYmxlID0gcGNpaWRsaXN0LAotCQkgICAgICAgfQorCQkgLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkJIC5pZF90YWJsZSA9IHBjaWlkbGlzdCwKKwl9LAorCisJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkuZGVzYyA9IERSSVZFUl9ERVNDLAorCS5kYXRlID0gRFJJVkVSX0RBVEUsCisJLm1ham9yID0gRFJJVkVSX01BSk9SLAorCS5taW5vciA9IERSSVZFUl9NSU5PUiwKKwkucGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgc2lzX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vc2lzX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJ2LmgKaW5kZXggYjFmZGRhZC4uZTIxOGU1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJ2LmgKQEAgLTEsNSArMSw1IEBACi0vKiBzaXNfZHJ2LmggLS0gUHJpdmF0ZSBoZWFkZXIgZm9yIHNpcyBkcml2ZXIgLSotIGxpbnV4LWMgLSotCi0gKgorLyogc2lzX2Rydi5oIC0tIFByaXZhdGUgaGVhZGVyIGZvciBzaXMgZHJpdmVyIC0qLSBsaW51eC1jIC0qLSAqLworLyoKICAqIENvcHlyaWdodCAxOTk5IFByZWNpc2lvbiBJbnNpZ2h0LCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KICAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIFN1bm55dmFsZSwgQ2FsaWZvcm5pYS4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcy5oIGIvZHJpdmVycy9jaGFyL2RybS9zaXNfZHMuaAppbmRleCBkYTg1MGI0Li45NGYyYjQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcy5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX2RzLmgKQEAgLTEsNiArMSw3IEBACi0vKiBzaXNfZHMuaCAtLSBQcml2YXRlIGhlYWRlciBmb3IgRGlyZWN0IFJlbmRlcmluZyBNYW5hZ2VyIC0qLSBsaW51eC1jIC0qLQorLyogc2lzX2RzLmggLS0gUHJpdmF0ZSBoZWFkZXIgZm9yIERpcmVjdCBSZW5kZXJpbmcgTWFuYWdlciAtKi0gbGludXgtYyAtKi0gCiAgKiBDcmVhdGVkOiBNb24gSmFuICA0IDEwOjA1OjA1IDE5OTkgYnkgc2NsaW5Ac2lzLmNvbS50dwotICoKKyAqLworLyoKICAqIENvcHlyaWdodCAyMDAwIFNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW1zIENvcnAsIEluYy4sIEhzaW5DaHUsIFRhaXdhbi4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpAQCAtMzUsNyArMzYsNyBAQAogCiAjZGVmaW5lIFNFVF9TSVpFIDUwMDAKIAotdHlwZWRlZiB1bnNpZ25lZCBpbnQgSVRFTV9UWVBFOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIElURU1fVFlQRTsKIAogdHlwZWRlZiBzdHJ1Y3QgewogCUlURU1fVFlQRSB2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19tbS5jIGIvZHJpdmVycy9jaGFyL2RybS9zaXNfbW0uYwppbmRleCBhODUyOTcyLi42Nzc0ZDJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19tbS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX21tLmMKQEAgLTg2LDcgKzg2LDcgQEAKIHsKIAlkcm1fc2lzX21lbV90IGZiOwogCXN0cnVjdCBzaXNfbWVtcmVxIHJlcTsKLQlkcm1fc2lzX21lbV90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7CisJZHJtX3Npc19tZW1fdCBfX3VzZXIgKmFyZ3AgPSAoZHJtX3Npc19tZW1fdCBfX3VzZXIgKilkYXRhOwogCWludCByZXR2YWwgPSAwOwogCiAJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGZiLCBhcmdwLCBzaXplb2YoZmIpKTsKQEAgLTExMCw3ICsxMTAsNyBAQAogCiAJRFJNX0NPUFlfVE9fVVNFUl9JT0NUTChhcmdwLCBmYiwgc2l6ZW9mKGZiKSk7CiAKLQlEUk1fREVCVUcoImFsbG9jIGZiLCBzaXplID0gJWQsIG9mZnNldCA9ICVkXG4iLCBmYi5zaXplLCByZXEub2Zmc2V0KTsKKwlEUk1fREVCVUcoImFsbG9jIGZiLCBzaXplID0gJWQsIG9mZnNldCA9ICVsZFxuIiwgZmIuc2l6ZSwgcmVxLm9mZnNldCk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtMTI3LDkgKzEyNyw5IEBACiAKIAlpZiAoIWRlbF9hbGxvY19zZXQoZmIuY29udGV4dCwgVklERU9fVFlQRSwgZmIuZnJlZSkpCiAJCXJldHZhbCA9IERSTV9FUlIoRUlOVkFMKTsKLQlzaXNfZnJlZSgodTMyKSBmYi5mcmVlKTsKKwlzaXNfZnJlZShmYi5mcmVlKTsKIAotCURSTV9ERUJVRygiZnJlZSBmYiwgb2Zmc2V0ID0gJWx1XG4iLCBmYi5mcmVlKTsKKwlEUk1fREVCVUcoImZyZWUgZmIsIG9mZnNldCA9IDB4JWx4XG4iLCBmYi5mcmVlKTsKIAogCXJldHVybiByZXR2YWw7CiB9CkBAIC0xNzYsNyArMTc2LDcgQEAKIHsKIAlEUk1fREVWSUNFOwogCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX3Npc19tZW1fdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOworCWRybV9zaXNfbWVtX3QgX191c2VyICphcmdwID0gKGRybV9zaXNfbWVtX3QgX191c2VyICopZGF0YTsKIAlkcm1fc2lzX21lbV90IGZiOwogCVBNZW1CbG9jayBibG9jazsKIAlpbnQgcmV0dmFsID0gMDsKQEAgLTI2Nyw3ICsyNjcsNyBAQAogewogCURSTV9ERVZJQ0U7CiAJZHJtX3Npc19wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fc2lzX21lbV90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7CisJZHJtX3Npc19tZW1fdCBfX3VzZXIgKmFyZ3AgPSAoZHJtX3Npc19tZW1fdCBfX3VzZXIgKilkYXRhOwogCWRybV9zaXNfbWVtX3QgYWdwOwogCVBNZW1CbG9jayBibG9jazsKIAlpbnQgcmV0dmFsID0gMDsKQEAgLTM2Nyw3ICszNjcsNyBAQAogCiAJaWYgKGkgPCBNQVhfQ09OVEVYVCkgewogCQlzZXRfdCAqc2V0OwotCQl1bnNpZ25lZCBpbnQgaXRlbTsKKwkJSVRFTV9UWVBFIGl0ZW07CiAJCWludCByZXR2YWw7CiAKIAkJRFJNX0RFQlVHKCJmaW5kIHNvY2tldCAlZCwgY29udGV4dCA9ICVkXG4iLCBpLCBjb250ZXh0KTsKQEAgLTM3Niw3ICszNzYsNyBAQAogCQlzZXQgPSBnbG9iYWxfcHByaXZbaV0uc2V0c1swXTsKIAkJcmV0dmFsID0gc2V0Rmlyc3Qoc2V0LCAmaXRlbSk7CiAJCXdoaWxlIChyZXR2YWwpIHsKLQkJCURSTV9ERUJVRygiZnJlZSB2aWRlbyBtZW1vcnkgMHgleFxuIiwgaXRlbSk7CisJCQlEUk1fREVCVUcoImZyZWUgdmlkZW8gbWVtb3J5IDB4JWx4XG4iLCBpdGVtKTsKICNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgZGVmaW5lZChDT05GSUdfRkJfU0lTKQogCQkJc2lzX2ZyZWUoaXRlbSk7CiAjZWxzZQpAQCAtMzkwLDcgKzM5MCw3IEBACiAJCXNldCA9IGdsb2JhbF9wcHJpdltpXS5zZXRzWzFdOwogCQlyZXR2YWwgPSBzZXRGaXJzdChzZXQsICZpdGVtKTsKIAkJd2hpbGUgKHJldHZhbCkgewotCQkJRFJNX0RFQlVHKCJmcmVlIGFncCBtZW1vcnkgMHgleFxuIiwgaXRlbSk7CisJCQlEUk1fREVCVUcoImZyZWUgYWdwIG1lbW9yeSAweCVseFxuIiwgaXRlbSk7CiAJCQltbUZyZWVNZW0oKFBNZW1CbG9jaykgaXRlbSk7CiAJCQlyZXR2YWwgPSBzZXROZXh0KHNldCwgJml0ZW0pOwogCQl9CkBAIC00MDMsMTIgKzQwMywxMiBAQAogfQogCiBkcm1faW9jdGxfZGVzY190IHNpc19pb2N0bHNbXSA9IHsKLQlbRFJNX0lPQ1RMX05SKERSTV9TSVNfRkJfQUxMT0MpXSA9IHtzaXNfZmJfYWxsb2MsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1NJU19GQl9GUkVFKV0gPSB7c2lzX2ZiX2ZyZWUsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1NJU19BR1BfSU5JVCldID0ge3Npc19pb2N0bF9hZ3BfaW5pdCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fU0lTX0FHUF9BTExPQyldID0ge3Npc19pb2N0bF9hZ3BfYWxsb2MsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1NJU19BR1BfRlJFRSldID0ge3Npc19pb2N0bF9hZ3BfZnJlZSwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fU0lTX0ZCX0lOSVQpXSA9IHtzaXNfZmJfaW5pdCwgMSwgMX0KKwlbRFJNX0lPQ1RMX05SKERSTV9TSVNfRkJfQUxMT0MpXSA9IHtzaXNfZmJfYWxsb2MsIERSTV9BVVRIfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9TSVNfRkJfRlJFRSldID0ge3Npc19mYl9mcmVlLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fU0lTX0FHUF9JTklUKV0gPSB7c2lzX2lvY3RsX2FncF9pbml0LCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAorCVtEUk1fSU9DVExfTlIoRFJNX1NJU19BR1BfQUxMT0MpXSA9IHtzaXNfaW9jdGxfYWdwX2FsbG9jLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fU0lTX0FHUF9GUkVFKV0gPSB7c2lzX2lvY3RsX2FncF9mcmVlLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fU0lTX0ZCX0lOSVQpXSA9IHtzaXNfZmJfaW5pdCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfQogfTsKIAogaW50IHNpc19tYXhfaW9jdGwgPSBEUk1fQVJSQVlfU0laRShzaXNfaW9jdGxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdGRmeF9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vdGRmeF9kcnYuYwppbmRleCBjMjc1Y2JiLi5iYWE0NDE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3RkZnhfZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS90ZGZ4X2Rydi5jCkBAIC0zNiwzMSArMzYsNiBAQAogCiAjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgogCi1zdGF0aWMgaW50IHBvc3Rpbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JRFJNX0lORk8oIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkOiAlc1xuIiwKLQkJIERSSVZFUl9OQU1FLAotCQkgRFJJVkVSX01BSk9SLAotCQkgRFJJVkVSX01JTk9SLAotCQkgRFJJVkVSX1BBVENITEVWRUwsCi0JCSBEUklWRVJfREFURSwgZGV2LT5wcmltYXJ5Lm1pbm9yLCBwY2lfcHJldHR5X25hbWUoZGV2LT5wZGV2KQotCSAgICApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZlcnNpb24oZHJtX3ZlcnNpb25fdCAqIHZlcnNpb24pCi17Ci0JaW50IGxlbjsKLQotCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBEUklWRVJfTUFKT1I7Ci0JdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IERSSVZFUl9NSU5PUjsKLQl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTDsKLQlEUk1fQ09QWSh2ZXJzaW9uLT5uYW1lLCBEUklWRVJfTkFNRSk7Ci0JRFJNX0NPUFkodmVyc2lvbi0+ZGF0ZSwgRFJJVkVSX0RBVEUpOwotCURSTV9DT1BZKHZlcnNpb24tPmRlc2MsIERSSVZFUl9ERVNDKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0gewogCXRkZnhfUENJX0lEUwogfTsKQEAgLTcwLDggKzQ1LDYgQEAKIAkucmVjbGFpbV9idWZmZXJzID0gZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzLAogCS5nZXRfbWFwX29mcyA9IGRybV9jb3JlX2dldF9tYXBfb2ZzLAogCS5nZXRfcmVnX29mcyA9IGRybV9jb3JlX2dldF9yZWdfb2ZzLAotCS5wb3N0aW5pdCA9IHBvc3Rpbml0LAotCS52ZXJzaW9uID0gdmVyc2lvbiwKIAkuZm9wcyA9IHsKIAkJIC5vd25lciA9IFRISVNfTU9EVUxFLAogCQkgLm9wZW4gPSBkcm1fb3BlbiwKQEAgLTgwLDExICs1MywxOCBAQAogCQkgLm1tYXAgPSBkcm1fbW1hcCwKIAkJIC5wb2xsID0gZHJtX3BvbGwsCiAJCSAuZmFzeW5jID0gZHJtX2Zhc3luYywKLQkJIH0sCisJfSwKIAkucGNpX2RyaXZlciA9IHsKLQkJICAgICAgIC5uYW1lID0gRFJJVkVSX05BTUUsCi0JCSAgICAgICAuaWRfdGFibGUgPSBwY2lpZGxpc3QsCi0JCSAgICAgICB9CisJCSAubmFtZSA9IERSSVZFUl9OQU1FLAorCQkgLmlkX3RhYmxlID0gcGNpaWRsaXN0LAorCX0sCisKKwkubmFtZSA9IERSSVZFUl9OQU1FLAorCS5kZXNjID0gRFJJVkVSX0RFU0MsCisJLmRhdGUgPSBEUklWRVJfREFURSwKKwkubWFqb3IgPSBEUklWRVJfTUFKT1IsCisJLm1pbm9yID0gRFJJVkVSX01JTk9SLAorCS5wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUwsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCB0ZGZ4X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdGRmeF9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vdGRmeF9kcnYuaAppbmRleCBhNTgyYTNkLi44NDIwNGVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3RkZnhfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS90ZGZ4X2Rydi5oCkBAIC0xLDYgKzEsNyBAQAogLyogdGRmeC5oIC0tIDNkZnggRFJNIHRlbXBsYXRlIGN1c3RvbWl6YXRpb24gLSotIGxpbnV4LWMgLSotCiAgKiBDcmVhdGVkOiBXZWQgRmViIDE0IDEyOjMyOjMyIDIwMDEgYnkgZ2FyZXRoQHZhbGludXguY29tCi0gKgorICovCisvKgogICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgogICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCkBAIC0zMCwxMCArMzEsNiBAQAogI2lmbmRlZiBfX1RERlhfSF9fCiAjZGVmaW5lIF9fVERGWF9IX18KIAotLyogVGhpcyByZW1haW5zIGNvbnN0YW50IGZvciBhbGwgRFJNIHRlbXBsYXRlIGZpbGVzLgotICovCi0jZGVmaW5lIERSTSh4KSB0ZGZ4XyMjeAotCiAvKiBHZW5lcmFsIGN1c3RvbWl6YXRpb246CiAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWEuYwppbmRleCBkNGIxNzY2Li41OTNjMGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWEuYwpAQCAtMjEzLDcgKzIxMyw5IEBACiAJZGV2X3ByaXYtPmRtYV93cmFwID0gaW5pdC0+c2l6ZTsKIAlkZXZfcHJpdi0+ZG1hX29mZnNldCA9IGluaXQtPm9mZnNldDsKIAlkZXZfcHJpdi0+bGFzdF9wYXVzZV9wdHIgPSBOVUxMOwotCWRldl9wcml2LT5od19hZGRyX3B0ciA9IGRldl9wcml2LT5tbWlvLT5oYW5kbGUgKyBpbml0LT5yZWdfcGF1c2VfYWRkcjsKKwlkZXZfcHJpdi0+aHdfYWRkcl9wdHIgPQorCQkodm9sYXRpbGUgdWludDMyX3QgKikoKGNoYXIgKilkZXZfcHJpdi0+bW1pby0+aGFuZGxlICsKKwkJaW5pdC0+cmVnX3BhdXNlX2FkZHIpOwogCiAJdmlhX2NtZGJ1Zl9zdGFydChkZXZfcHJpdik7CiAKQEAgLTIzMiwxMyArMjM0LDEzIEBACiAKIAlzd2l0Y2ggKGluaXQuZnVuYykgewogCWNhc2UgVklBX0lOSVRfRE1BOgotCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCWlmICghRFJNX1NVU0VSKERSTV9DVVJQUk9DKSkKIAkJCXJldGNvZGUgPSBEUk1fRVJSKEVQRVJNKTsKIAkJZWxzZQogCQkJcmV0Y29kZSA9IHZpYV9pbml0aWFsaXplKGRldiwgZGV2X3ByaXYsICZpbml0KTsKIAkJYnJlYWs7CiAJY2FzZSBWSUFfQ0xFQU5VUF9ETUE6Ci0JCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJaWYgKCFEUk1fU1VTRVIoRFJNX0NVUlBST0MpKQogCQkJcmV0Y29kZSA9IERSTV9FUlIoRVBFUk0pOwogCQllbHNlCiAJCQlyZXRjb2RlID0gdmlhX2RtYV9jbGVhbnVwKGRldik7CkBAIC0zNDksOSArMzUxLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotZXh0ZXJuIGludAotdmlhX3BhcnNlX2NvbW1hbmRfc3RyZWFtKGRybV9kZXZpY2VfdCAqIGRldiwgY29uc3QgdWludDMyX3QgKiBidWYsCi0JCQkgdW5zaWduZWQgaW50IHNpemUpOwogc3RhdGljIGludCB2aWFfZGlzcGF0Y2hfcGNpX2NtZGJ1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsCiAJCQkJICAgICAgZHJtX3ZpYV9jbWRidWZmZXJfdCAqIGNtZCkKIHsKQEAgLTQ1MCw5ICs0NDksOSBAQAogCWlmICgoY291bnQgPD0gOCkgJiYgKGNvdW50ID49IDApKSB7CiAJCXVpbnQzMl90IHJndHIsIHB0cjsKIAkJcmd0ciA9ICooZGV2X3ByaXYtPmh3X2FkZHJfcHRyKTsKLQkJcHRyID0gKChjaGFyICopZGV2X3ByaXYtPmxhc3RfcGF1c2VfcHRyIC0gZGV2X3ByaXYtPmRtYV9wdHIpICsKLQkJICAgIGRldl9wcml2LT5kbWFfb2Zmc2V0ICsgKHVpbnQzMl90KSBkZXZfcHJpdi0+YWdwQWRkciArIDQgLQotCQkgICAgQ01EQlVGX0FMSUdOTUVOVF9TSVpFOworCQlwdHIgPSAoKHZvbGF0aWxlIGNoYXIgKilkZXZfcHJpdi0+bGFzdF9wYXVzZV9wdHIgLQorCQkgICAgICBkZXZfcHJpdi0+ZG1hX3B0cikgKyBkZXZfcHJpdi0+ZG1hX29mZnNldCArCisJCSAgICAgICh1aW50MzJfdCkgZGV2X3ByaXYtPmFncEFkZHIgKyA0IC0gQ01EQlVGX0FMSUdOTUVOVF9TSVpFOwogCQlpZiAocmd0ciA8PSBwdHIpIHsKIAkJCURSTV9FUlJPUgogCQkJICAgICgiQ29tbWFuZCByZWd1bGF0b3JcbnBhdXNlZCBhdCBjb3VudCAlZCwgYWRkcmVzcyAleCwgIgpAQCAtNDcyLDcgKzQ3MSw3IEBACiAJCSAgICAgICAmJiBjb3VudC0tKSA7CiAKIAkJcmd0ciA9ICooZGV2X3ByaXYtPmh3X2FkZHJfcHRyKTsKLQkJcHRyID0gKChjaGFyICopcGF1c2VkX2F0IC0gZGV2X3ByaXYtPmRtYV9wdHIpICsKKwkJcHRyID0gKCh2b2xhdGlsZSBjaGFyICopcGF1c2VkX2F0IC0gZGV2X3ByaXYtPmRtYV9wdHIpICsKIAkJICAgIGRldl9wcml2LT5kbWFfb2Zmc2V0ICsgKHVpbnQzMl90KSBkZXZfcHJpdi0+YWdwQWRkciArIDQ7CiAKIAkJcHRyX2xvdyA9IChwdHIgPiAzICogQ01EQlVGX0FMSUdOTUVOVF9TSVpFKSA/CkBAIC03MjQsMyArNzIzLDIyIEBACiAJCQkgICAgICAgc2l6ZW9mKGRfc2l6KSk7CiAJcmV0dXJuIHJldDsKIH0KKworZHJtX2lvY3RsX2Rlc2NfdCB2aWFfaW9jdGxzW10gPSB7CisJW0RSTV9JT0NUTF9OUihEUk1fVklBX0FMTE9DTUVNKV0gPSB7dmlhX21lbV9hbGxvYywgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9GUkVFTUVNKV0gPSB7dmlhX21lbV9mcmVlLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX0FHUF9JTklUKV0gPSB7dmlhX2FncF9pbml0LCBEUk1fQVVUSHxEUk1fTUFTVEVSfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9WSUFfRkJfSU5JVCldID0ge3ZpYV9mYl9pbml0LCBEUk1fQVVUSHxEUk1fTUFTVEVSfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9WSUFfTUFQX0lOSVQpXSA9IHt2aWFfbWFwX2luaXQsIERSTV9BVVRIfERSTV9NQVNURVJ9LAorCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9ERUNfRlVURVgpXSA9IHt2aWFfZGVjb2Rlcl9mdXRleCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9ETUFfSU5JVCldID0ge3ZpYV9kbWFfaW5pdCwgRFJNX0FVVEh9LAorCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9DTURCVUZGRVIpXSA9IHt2aWFfY21kYnVmZmVyLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX0ZMVVNIKV0gPSB7dmlhX2ZsdXNoX2lvY3RsLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX1BDSUNNRCldID0ge3ZpYV9wY2lfY21kYnVmZmVyLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX0NNREJVRl9TSVpFKV0gPSB7dmlhX2NtZGJ1Zl9zaXplLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX1dBSVRfSVJRKV0gPSB7dmlhX3dhaXRfaXJxLCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX0RNQV9CTElUKV0gPSB7dmlhX2RtYV9ibGl0LCBEUk1fQVVUSH0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX0JMSVRfU1lOQyldID0ge3ZpYV9kbWFfYmxpdF9zeW5jLCBEUk1fQVVUSH0KK307CisKK2ludCB2aWFfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUodmlhX2lvY3Rscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWFibGl0LmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWFibGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1ZTAyNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYWJsaXQuYwpAQCAtMCwwICsxLDgwNSBAQAorLyogdmlhX2RtYWJsaXQuYyAtLSBQQ0kgRE1BIEJpdEJsdCBzdXBwb3J0IGZvciB0aGUgVklBIFVuaWNocm9tZS9Qcm8KKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDA1IFRob21hcyBIZWxsc3Ryb20sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIAorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSAKKyAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogCisgKiAgICBUaG9tYXMgSGVsbHN0cm9tLgorICogICAgUGFydGlhbGx5IGJhc2VkIG9uIGNvZGUgb2J0YWluZWQgZnJvbSBEaWdlbyBJbmMuCisgKi8KKworCisvKgorICogVW5tYXBzIHRoZSBETUEgbWFwcGluZ3MuIAorICogRklYTUU6IElzIHRoaXMgYSBOb09wIG9uIHg4Nj8gQWxzbyAKKyAqIEZJWE1FOiBXaGF0IGhhcHBlbnMgaWYgdGhpcyBvbmUgaXMgY2FsbGVkIGFuZCBhIHBlbmRpbmcgYmxpdCBoYXMgcHJldmlvdXNseSBkb25lIAorICogdGhlIHNhbWUgRE1BIG1hcHBpbmdzPyAKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgInZpYV9kcm0uaCIKKyNpbmNsdWRlICJ2aWFfZHJ2LmgiCisjaW5jbHVkZSAidmlhX2RtYWJsaXQuaCIKKworI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKworI2RlZmluZSBWSUFfUEdETih4KSAgICAgICAgICAgICAoKCh1bnNpZ25lZCBsb25nKSh4KSkgJiBQQUdFX01BU0spCisjZGVmaW5lIFZJQV9QR09GRih4KSAgICAgICAgICAgICgoKHVuc2lnbmVkIGxvbmcpKHgpKSAmIH5QQUdFX01BU0spCisjZGVmaW5lIFZJQV9QRk4oeCkgICAgICAgICAgICAgICgodW5zaWduZWQgbG9uZykoeCkgPj4gUEFHRV9TSElGVCkKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV92aWFfZGVzY3JpcHRvciB7CisJdWludDMyX3QgbWVtX2FkZHI7CisJdWludDMyX3QgZGV2X2FkZHI7CisJdWludDMyX3Qgc2l6ZTsKKwl1aW50MzJfdCBuZXh0OworfSBkcm1fdmlhX2Rlc2NyaXB0b3JfdDsKKworCisvKgorICogVW5tYXAgYSBETUEgbWFwcGluZy4KKyAqLworCisKKworc3RhdGljIHZvaWQKK3ZpYV91bm1hcF9ibGl0X2Zyb21fZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBkcm1fdmlhX3NnX2luZm9fdCAqdnNnKQoreworCWludCBudW1fZGVzYyA9IHZzZy0+bnVtX2Rlc2M7CisJdW5zaWduZWQgY3VyX2Rlc2NyaXB0b3JfcGFnZSA9IG51bV9kZXNjIC8gdnNnLT5kZXNjcmlwdG9yc19wZXJfcGFnZTsKKwl1bnNpZ25lZCBkZXNjcmlwdG9yX3RoaXNfcGFnZSA9IG51bV9kZXNjICUgdnNnLT5kZXNjcmlwdG9yc19wZXJfcGFnZTsKKwlkcm1fdmlhX2Rlc2NyaXB0b3JfdCAqZGVzY19wdHIgPSB2c2ctPmRlc2NfcGFnZXNbY3VyX2Rlc2NyaXB0b3JfcGFnZV0gKyAKKwkJZGVzY3JpcHRvcl90aGlzX3BhZ2U7CisJZG1hX2FkZHJfdCBuZXh0ID0gdnNnLT5jaGFpbl9zdGFydDsKKworCXdoaWxlKG51bV9kZXNjLS0pIHsKKwkJaWYgKGRlc2NyaXB0b3JfdGhpc19wYWdlLS0gPT0gMCkgeworCQkJY3VyX2Rlc2NyaXB0b3JfcGFnZS0tOworCQkJZGVzY3JpcHRvcl90aGlzX3BhZ2UgPSB2c2ctPmRlc2NyaXB0b3JzX3Blcl9wYWdlIC0gMTsKKwkJCWRlc2NfcHRyID0gdnNnLT5kZXNjX3BhZ2VzW2N1cl9kZXNjcmlwdG9yX3BhZ2VdICsgCisJCQkJZGVzY3JpcHRvcl90aGlzX3BhZ2U7CisJCX0KKwkJZG1hX3VubWFwX3NpbmdsZSgmcGRldi0+ZGV2LCBuZXh0LCBzaXplb2YoKmRlc2NfcHRyKSwgRE1BX1RPX0RFVklDRSk7CisJCWRtYV91bm1hcF9wYWdlKCZwZGV2LT5kZXYsIGRlc2NfcHRyLT5tZW1fYWRkciwgZGVzY19wdHItPnNpemUsIHZzZy0+ZGlyZWN0aW9uKTsKKwkJbmV4dCA9IChkbWFfYWRkcl90KSBkZXNjX3B0ci0+bmV4dDsKKwkJZGVzY19wdHItLTsKKwl9Cit9CisKKy8qCisgKiBJZiBtb2RlID0gMCwgY291bnQgaG93IG1hbnkgZGVzY3JpcHRvcnMgYXJlIG5lZWRlZC4KKyAqIElmIG1vZGUgPSAxLCBNYXAgdGhlIERNQSBwYWdlcyBmb3IgdGhlIGRldmljZSwgcHV0IHRvZ2V0aGVyIGFuZCBtYXAgYWxzbyB0aGUgZGVzY3JpcHRvcnMuCisgKiBEZXNjcmlwdG9ycyBhcmUgcnVuIGluIHJldmVyc2Ugb3JkZXIgYnkgdGhlIGhhcmR3YXJlIGJlY2F1c2Ugd2UgYXJlIG5vdCBhbGxvd2VkIHRvIHVwZGF0ZSB0aGUKKyAqICduZXh0JyBmaWVsZCB3aXRob3V0IHN5bmNpbmcgY2FsbHMgd2hlbiB0aGUgZGVzY3JpcHRvciBpcyBhbHJlYWR5IG1hcHBlZC4KKyAqLworCitzdGF0aWMgdm9pZAordmlhX21hcF9ibGl0X2Zvcl9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCSAgIGNvbnN0IGRybV92aWFfZG1hYmxpdF90ICp4ZmVyLAorCQkgICBkcm1fdmlhX3NnX2luZm9fdCAqdnNnLCAKKwkJICAgaW50IG1vZGUpCit7CisJdW5zaWduZWQgY3VyX2Rlc2NyaXB0b3JfcGFnZSA9IDA7CisJdW5zaWduZWQgbnVtX2Rlc2NyaXB0b3JzX3RoaXNfcGFnZSA9IDA7CisJdW5zaWduZWQgY2hhciAqbWVtX2FkZHIgPSB4ZmVyLT5tZW1fYWRkcjsKKwl1bnNpZ25lZCBjaGFyICpjdXJfbWVtOworCXVuc2lnbmVkIGNoYXIgKmZpcnN0X2FkZHIgPSAodW5zaWduZWQgY2hhciAqKVZJQV9QR0ROKG1lbV9hZGRyKTsKKwl1aW50MzJfdCBmYl9hZGRyID0geGZlci0+ZmJfYWRkcjsKKwl1aW50MzJfdCBjdXJfZmI7CisJdW5zaWduZWQgbG9uZyBsaW5lX2xlbjsKKwl1bnNpZ25lZCByZW1haW5pbmdfbGVuOworCWludCBudW1fZGVzYyA9IDA7CisJaW50IGN1cl9saW5lOworCWRtYV9hZGRyX3QgbmV4dCA9IDAgfCBWSUFfRE1BX0RQUl9FQzsKKwlkcm1fdmlhX2Rlc2NyaXB0b3JfdCAqZGVzY19wdHIgPSAwOworCisJaWYgKG1vZGUgPT0gMSkgCisJCWRlc2NfcHRyID0gdnNnLT5kZXNjX3BhZ2VzW2N1cl9kZXNjcmlwdG9yX3BhZ2VdOworCisJZm9yIChjdXJfbGluZSA9IDA7IGN1cl9saW5lIDwgeGZlci0+bnVtX2xpbmVzOyArK2N1cl9saW5lKSB7CisKKwkJbGluZV9sZW4gPSB4ZmVyLT5saW5lX2xlbmd0aDsKKwkJY3VyX2ZiID0gZmJfYWRkcjsKKwkJY3VyX21lbSA9IG1lbV9hZGRyOworCQkKKwkJd2hpbGUgKGxpbmVfbGVuID4gMCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdfbGVuID0gbWluKFBBR0VfU0laRS1WSUFfUEdPRkYoY3VyX21lbSksIGxpbmVfbGVuKTsKKwkJCWxpbmVfbGVuIC09IHJlbWFpbmluZ19sZW47CisKKwkJCWlmIChtb2RlID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY19wdHItPm1lbV9hZGRyID0gCisJCQkJCWRtYV9tYXBfcGFnZSgmcGRldi0+ZGV2LCAKKwkJCQkJCSAgICAgdnNnLT5wYWdlc1tWSUFfUEZOKGN1cl9tZW0pIC0gCisJCQkJCQkJCVZJQV9QRk4oZmlyc3RfYWRkcildLAorCQkJCQkJICAgICBWSUFfUEdPRkYoY3VyX21lbSksIHJlbWFpbmluZ19sZW4sIAorCQkJCQkJICAgICB2c2ctPmRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NfcHRyLT5kZXZfYWRkciA9IGN1cl9mYjsKKwkJCQkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY19wdHItPnNpemUgPSByZW1haW5pbmdfbGVuOworCQkJCWRlc2NfcHRyLT5uZXh0ID0gKHVpbnQzMl90KSBuZXh0OworCQkJCW5leHQgPSBkbWFfbWFwX3NpbmdsZSgmcGRldi0+ZGV2LCBkZXNjX3B0ciwgc2l6ZW9mKCpkZXNjX3B0ciksIAorCQkJCQkJICAgICAgRE1BX1RPX0RFVklDRSk7CisJCQkJZGVzY19wdHIrKzsKKwkJCQlpZiAoKytudW1fZGVzY3JpcHRvcnNfdGhpc19wYWdlID49IHZzZy0+ZGVzY3JpcHRvcnNfcGVyX3BhZ2UpIHsKKwkJCQkJbnVtX2Rlc2NyaXB0b3JzX3RoaXNfcGFnZSA9IDA7CisJCQkJCWRlc2NfcHRyID0gdnNnLT5kZXNjX3BhZ2VzWysrY3VyX2Rlc2NyaXB0b3JfcGFnZV07CisJCQkJfQorCQkJfQorCQkJCisJCQludW1fZGVzYysrOworCQkJY3VyX21lbSArPSByZW1haW5pbmdfbGVuOworCQkJY3VyX2ZiICs9IHJlbWFpbmluZ19sZW47CisJCX0KKwkJCisJCW1lbV9hZGRyICs9IHhmZXItPm1lbV9zdHJpZGU7CisJCWZiX2FkZHIgKz0geGZlci0+ZmJfc3RyaWRlOworCX0KKworCWlmIChtb2RlID09IDEpIHsKKwkJdnNnLT5jaGFpbl9zdGFydCA9IG5leHQ7CisJCXZzZy0+c3RhdGUgPSBkcl92aWFfZGV2aWNlX21hcHBlZDsKKwl9CisJdnNnLT5udW1fZGVzYyA9IG51bV9kZXNjOworfQorCisvKgorICogRnVuY3Rpb24gdGhhdCBmcmVlcyB1cCBhbGwgcmVzb3VyY2VzIGZvciBhIGJsaXQuIEl0IGlzIHVzYWJsZSBldmVuIGlmIHRoZSAKKyAqIGJsaXQgaW5mbyBoYXMgb25seSBiZSBwYXJ0aWFsbHkgYnVpbHQgYXMgbG9uZyBhcyB0aGUgc3RhdHVzIGVudW0gaXMgY29uc2lzdGVudAorICogd2l0aCB0aGUgYWN0dWFsIHN0YXR1cyBvZiB0aGUgdXNlZCByZXNvdXJjZXMuCisgKi8KKworCit2b2lkCit2aWFfZnJlZV9zZ19pbmZvKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBkcm1fdmlhX3NnX2luZm9fdCAqdnNnKSAKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgaTsKKworCXN3aXRjaCh2c2ctPnN0YXRlKSB7CisJY2FzZSBkcl92aWFfZGV2aWNlX21hcHBlZDoKKwkJdmlhX3VubWFwX2JsaXRfZnJvbV9kZXZpY2UocGRldiwgdnNnKTsKKwljYXNlIGRyX3ZpYV9kZXNjX3BhZ2VzX2FsbG9jOgorCQlmb3IgKGk9MDsgaTx2c2ctPm51bV9kZXNjX3BhZ2VzOyArK2kpIHsKKwkJCWlmICh2c2ctPmRlc2NfcGFnZXNbaV0gIT0gTlVMTCkKKwkJCSAgZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZzZy0+ZGVzY19wYWdlc1tpXSk7CisJCX0KKwkJa2ZyZWUodnNnLT5kZXNjX3BhZ2VzKTsKKwljYXNlIGRyX3ZpYV9wYWdlc19sb2NrZWQ6CisJCWZvciAoaT0wOyBpPHZzZy0+bnVtX3BhZ2VzOyArK2kpIHsKKwkJCWlmICggTlVMTCAhPSAocGFnZSA9IHZzZy0+cGFnZXNbaV0pKSB7CisJCQkJaWYgKCEgUGFnZVJlc2VydmVkKHBhZ2UpICYmIChETUFfRlJPTV9ERVZJQ0UgPT0gdnNnLT5kaXJlY3Rpb24pKSAKKwkJCQkJU2V0UGFnZURpcnR5KHBhZ2UpOworCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCX0KKwkJfQorCWNhc2UgZHJfdmlhX3BhZ2VzX2FsbG9jOgorCQl2ZnJlZSh2c2ctPnBhZ2VzKTsKKwlkZWZhdWx0OgorCQl2c2ctPnN0YXRlID0gZHJfdmlhX3NnX2luaXQ7CisJfQorCWlmICh2c2ctPmJvdW5jZV9idWZmZXIpIHsKKwkJdmZyZWUodnNnLT5ib3VuY2VfYnVmZmVyKTsKKwkJdnNnLT5ib3VuY2VfYnVmZmVyID0gTlVMTDsKKwl9CisJdnNnLT5mcmVlX29uX3NlcXVlbmNlID0gMDsKK30JCQorCisvKgorICogRmlyZSBhIGJsaXQgZW5naW5lLgorICovCisKK3N0YXRpYyB2b2lkCit2aWFfZmlyZV9kbWFibGl0KGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fdmlhX3NnX2luZm9fdCAqdnNnLCBpbnQgZW5naW5lKQoreworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CisKKwlWSUFfV1JJVEUoVklBX1BDSV9ETUFfTUFSMCArIGVuZ2luZSoweDEwLCAwKTsKKwlWSUFfV1JJVEUoVklBX1BDSV9ETUFfREFSMCArIGVuZ2luZSoweDEwLCAwKTsKKwlWSUFfV1JJVEUoVklBX1BDSV9ETUFfQ1NSMCArIGVuZ2luZSoweDA0LCBWSUFfRE1BX0NTUl9ERCB8IFZJQV9ETUFfQ1NSX1REIHwgCisJCSAgVklBX0RNQV9DU1JfREUpOworCVZJQV9XUklURShWSUFfUENJX0RNQV9NUjAgICsgZW5naW5lKjB4MDQsIFZJQV9ETUFfTVJfQ00gfCBWSUFfRE1BX01SX1RESUUpOworCVZJQV9XUklURShWSUFfUENJX0RNQV9CQ1IwICsgZW5naW5lKjB4MTAsIDApOworCVZJQV9XUklURShWSUFfUENJX0RNQV9EUFIwICsgZW5naW5lKjB4MTAsIHZzZy0+Y2hhaW5fc3RhcnQpOworCVZJQV9XUklURShWSUFfUENJX0RNQV9DU1IwICsgZW5naW5lKjB4MDQsIFZJQV9ETUFfQ1NSX0RFIHwgVklBX0RNQV9DU1JfVFMpOworfQorCisvKgorICogT2J0YWluIGEgcGFnZSBwb2ludGVyIGFycmF5IGFuZCBsb2NrIGFsbCBwYWdlcyBpbnRvIHN5c3RlbSBtZW1vcnkuIEEgc2VnbWVudGF0aW9uIHZpb2xhdGlvbiB3aWxsCisgKiBvY2N1ciBoZXJlIGlmIHRoZSBjYWxsaW5nIHVzZXIgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIHN1Ym1pdHRlZCBhZGRyZXNzLgorICovCisKK3N0YXRpYyBpbnQKK3ZpYV9sb2NrX2FsbF9kbWFfcGFnZXMoZHJtX3ZpYV9zZ19pbmZvX3QgKnZzZywgIGRybV92aWFfZG1hYmxpdF90ICp4ZmVyKQoreworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9wZm4gPSBWSUFfUEZOKHhmZXItPm1lbV9hZGRyKTsKKwl2c2ctPm51bV9wYWdlcyA9IFZJQV9QRk4oeGZlci0+bWVtX2FkZHIgKyAoeGZlci0+bnVtX2xpbmVzICogeGZlci0+bWVtX3N0cmlkZSAtMSkpIC0gCisJCWZpcnN0X3BmbiArIDE7CisJCisJaWYgKE5VTEwgPT0gKHZzZy0+cGFnZXMgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqIHZzZy0+bnVtX3BhZ2VzKSkpCisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJbWVtc2V0KHZzZy0+cGFnZXMsIDAsIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqIHZzZy0+bnVtX3BhZ2VzKTsKKwlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJcmV0ID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgY3VycmVudC0+bW0sICh1bnNpZ25lZCBsb25nKSB4ZmVyLT5tZW1fYWRkciwKKwkJCSAgICAgdnNnLT5udW1fcGFnZXMsIHZzZy0+ZGlyZWN0aW9uLCAwLCB2c2ctPnBhZ2VzLCBOVUxMKTsKKworCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJaWYgKHJldCAhPSB2c2ctPm51bV9wYWdlcykgeworCQlpZiAocmV0IDwgMCkgCisJCQlyZXR1cm4gcmV0OworCQl2c2ctPnN0YXRlID0gZHJfdmlhX3BhZ2VzX2xvY2tlZDsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJdnNnLT5zdGF0ZSA9IGRyX3ZpYV9wYWdlc19sb2NrZWQ7CisJRFJNX0RFQlVHKCJETUEgcGFnZXMgbG9ja2VkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFsbG9jYXRlIERNQSBjYXBhYmxlIG1lbW9yeSBmb3IgdGhlIGJsaXQgZGVzY3JpcHRvciBjaGFpbiwgYW5kIGFuIGFycmF5IHRoYXQga2VlcHMgdHJhY2sgb2YgdGhlCisgKiBwYWdlcyB3ZSBhbGxvY2F0ZS4gV2UgZG9uJ3Qgd2FudCB0byB1c2Uga21hbGxvYyBmb3IgdGhlIGRlc2NyaXB0b3IgY2hhaW4gYmVjYXVzZSBpdCBtYXkgYmUKKyAqIHF1aXRlIGxhcmdlIGZvciBzb21lIGJsaXRzLCBhbmQgcGFnZXMgZG9uJ3QgbmVlZCB0byBiZSBjb250aW5nb3VzLgorICovCisKK3N0YXRpYyBpbnQgCit2aWFfYWxsb2NfZGVzY19wYWdlcyhkcm1fdmlhX3NnX2luZm9fdCAqdnNnKQoreworCWludCBpOworCQorCXZzZy0+ZGVzY3JpcHRvcnNfcGVyX3BhZ2UgPSBQQUdFX1NJWkUgLyBzaXplb2YoIGRybV92aWFfZGVzY3JpcHRvcl90KTsKKwl2c2ctPm51bV9kZXNjX3BhZ2VzID0gKHZzZy0+bnVtX2Rlc2MgKyB2c2ctPmRlc2NyaXB0b3JzX3Blcl9wYWdlIC0gMSkgLyAKKwkJdnNnLT5kZXNjcmlwdG9yc19wZXJfcGFnZTsKKworCWlmIChOVUxMID09ICAodnNnLT5kZXNjX3BhZ2VzID0ga21hbGxvYyhzaXplb2Yodm9pZCAqKSAqIHZzZy0+bnVtX2Rlc2NfcGFnZXMsIEdGUF9LRVJORUwpKSkgCisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJCisJbWVtc2V0KHZzZy0+ZGVzY19wYWdlcywgMCwgc2l6ZW9mKHZvaWQgKikgKiB2c2ctPm51bV9kZXNjX3BhZ2VzKTsKKwl2c2ctPnN0YXRlID0gZHJfdmlhX2Rlc2NfcGFnZXNfYWxsb2M7CisJZm9yIChpPTA7IGk8dnNnLT5udW1fZGVzY19wYWdlczsgKytpKSB7CisJCWlmIChOVUxMID09ICh2c2ctPmRlc2NfcGFnZXNbaV0gPSAKKwkJCSAgICAgKGRybV92aWFfZGVzY3JpcHRvcl90ICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKSkpCisJCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0KKwlEUk1fREVCVUcoIkFsbG9jYXRlZCAlZCBwYWdlcyBmb3IgJWQgZGVzY3JpcHRvcnMuXG4iLCB2c2ctPm51bV9kZXNjX3BhZ2VzLAorCQkgIHZzZy0+bnVtX2Rlc2MpOworCXJldHVybiAwOworfQorCQkJCitzdGF0aWMgdm9pZAordmlhX2Fib3J0X2RtYWJsaXQoZHJtX2RldmljZV90ICpkZXYsIGludCBlbmdpbmUpCit7CisJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKworCVZJQV9XUklURShWSUFfUENJX0RNQV9DU1IwICsgZW5naW5lKjB4MDQsIFZJQV9ETUFfQ1NSX1RBKTsKK30KKworc3RhdGljIHZvaWQKK3ZpYV9kbWFibGl0X2VuZ2luZV9vZmYoZHJtX2RldmljZV90ICpkZXYsIGludCBlbmdpbmUpCit7CisJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKworCVZJQV9XUklURShWSUFfUENJX0RNQV9DU1IwICsgZW5naW5lKjB4MDQsIFZJQV9ETUFfQ1NSX1REIHwgVklBX0RNQV9DU1JfREQpOyAKK30KKworCisKKy8qCisgKiBUaGUgZG1hYmxpdCBwYXJ0IG9mIHRoZSBJUlEgaGFuZGxlci4gVHJ5aW5nIHRvIGRvIG9ubHkgcmVhc29uYWJseSBmYXN0IHRoaW5ncyBoZXJlLgorICogVGhlIHJlc3QsIGxpa2UgdW5tYXBwaW5nIGFuZCBmcmVlaW5nIG1lbW9yeSBmb3IgZG9uZSBibGl0cyBpcyBkb25lIGluIGEgc2VwYXJhdGUgd29ya3F1ZXVlCisgKiB0YXNrLiBCYXNpY2FsbHkgdGhlIHRhc2sgb2YgdGhlIGludGVycnVwdCBoYW5kbGVyIGlzIHRvIHN1Ym1pdCBhIG5ldyBibGl0IHRvIHRoZSBlbmdpbmUsIHdoaWxlCisgKiB0aGUgd29ya3F1ZXVlIHRhc2sgdGFrZXMgY2FyZSBvZiBwcm9jZXNzaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2xkIGJsaXQuCisgKi8KKwkJCit2b2lkCit2aWFfZG1hYmxpdF9oYW5kbGVyKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgZW5naW5lLCBpbnQgZnJvbV9pcnEpCit7CisJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fdmlhX2JsaXRxX3QgKmJsaXRxID0gZGV2X3ByaXYtPmJsaXRfcXVldWVzICsgZW5naW5lOworCWludCBjdXI7CisJaW50IGRvbmVfdHJhbnNmZXI7CisJdW5zaWduZWQgbG9uZyBpcnFzYXZlPTA7CisJdWludDMyX3Qgc3RhdHVzID0gMDsKKworCURSTV9ERUJVRygiRE1BIGJsaXQgaGFuZGxlciBjYWxsZWQuIGVuZ2luZSA9ICVkLCBmcm9tX2lycSA9ICVkLCBibGl0cSA9IDB4JWx4XG4iLAorCQkgIGVuZ2luZSwgZnJvbV9pcnEsICh1bnNpZ25lZCBsb25nKSBibGl0cSk7CisKKwlpZiAoZnJvbV9pcnEpIHsKKwkJc3Bpbl9sb2NrKCZibGl0cS0+YmxpdF9sb2NrKTsKKwl9IGVsc2UgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmxpdHEtPmJsaXRfbG9jaywgaXJxc2F2ZSk7CisJfQorCisJZG9uZV90cmFuc2ZlciA9IGJsaXRxLT5pc19hY3RpdmUgJiYgCisJICAoKCBzdGF0dXMgPSBWSUFfUkVBRChWSUFfUENJX0RNQV9DU1IwICsgZW5naW5lKjB4MDQpKSAmIFZJQV9ETUFfQ1NSX1REKTsKKwlkb25lX3RyYW5zZmVyID0gZG9uZV90cmFuc2ZlciB8fCAoIGJsaXRxLT5hYm9ydGluZyAmJiAhKHN0YXR1cyAmIFZJQV9ETUFfQ1NSX0RFKSk7IAorCisJY3VyID0gYmxpdHEtPmN1cjsKKwlpZiAoZG9uZV90cmFuc2ZlcikgeworCisJCWJsaXRxLT5ibGl0c1tjdXJdLT5hYm9ydGVkID0gYmxpdHEtPmFib3J0aW5nOworCQlibGl0cS0+ZG9uZV9ibGl0X2hhbmRsZSsrOworCQlEUk1fV0FLRVVQKGJsaXRxLT5ibGl0X3F1ZXVlICsgY3VyKTsJCQorCisJCWN1cisrOworCQlpZiAoY3VyID49IFZJQV9OVU1fQkxJVF9TTE9UUykgCisJCQljdXIgPSAwOworCQlibGl0cS0+Y3VyID0gY3VyOworCisJCS8qCisJCSAqIENsZWFyIHRyYW5zZmVyIGRvbmUgZmxhZy4KKwkJICovCisKKwkJVklBX1dSSVRFKFZJQV9QQ0lfRE1BX0NTUjAgKyBlbmdpbmUqMHgwNCwgIFZJQV9ETUFfQ1NSX1REKTsKKworCQlibGl0cS0+aXNfYWN0aXZlID0gMDsKKwkJYmxpdHEtPmFib3J0aW5nID0gMDsKKwkJc2NoZWR1bGVfd29yaygmYmxpdHEtPndxKTsJCisKKwl9IGVsc2UgaWYgKGJsaXRxLT5pc19hY3RpdmUgJiYgdGltZV9hZnRlcl9lcShqaWZmaWVzLCBibGl0cS0+ZW5kKSkgeworCisJCS8qCisJCSAqIEFib3J0IHRyYW5zZmVyIGFmdGVyIG9uZSBzZWNvbmQuCisJCSAqLworCisJCXZpYV9hYm9ydF9kbWFibGl0KGRldiwgZW5naW5lKTsKKwkJYmxpdHEtPmFib3J0aW5nID0gMTsKKwkJYmxpdHEtPmVuZCA9IGppZmZpZXMgKyBEUk1fSFo7CisJfQorCSAgCQkKKwlpZiAoIWJsaXRxLT5pc19hY3RpdmUpIHsKKwkJaWYgKGJsaXRxLT5udW1fb3V0c3RhbmRpbmcpIHsKKwkJCXZpYV9maXJlX2RtYWJsaXQoZGV2LCBibGl0cS0+YmxpdHNbY3VyXSwgZW5naW5lKTsKKwkJCWJsaXRxLT5pc19hY3RpdmUgPSAxOworCQkJYmxpdHEtPmN1ciA9IGN1cjsKKwkJCWJsaXRxLT5udW1fb3V0c3RhbmRpbmctLTsKKwkJCWJsaXRxLT5lbmQgPSBqaWZmaWVzICsgRFJNX0haOworCQkJaWYgKCF0aW1lcl9wZW5kaW5nKCZibGl0cS0+cG9sbF90aW1lcikpIHsKKwkJCQlibGl0cS0+cG9sbF90aW1lci5leHBpcmVzID0gamlmZmllcysxOworCQkJCWFkZF90aW1lcigmYmxpdHEtPnBvbGxfdGltZXIpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHRpbWVyX3BlbmRpbmcoJmJsaXRxLT5wb2xsX3RpbWVyKSkgeworCQkJCWRlbF90aW1lcigmYmxpdHEtPnBvbGxfdGltZXIpOworCQkJfQorCQkJdmlhX2RtYWJsaXRfZW5naW5lX29mZihkZXYsIGVuZ2luZSk7CisJCX0KKwl9CQkKKworCWlmIChmcm9tX2lycSkgeworCQlzcGluX3VubG9jaygmYmxpdHEtPmJsaXRfbG9jayk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxpdHEtPmJsaXRfbG9jaywgaXJxc2F2ZSk7CisJfQorfSAKKworCisKKy8qCisgKiBDaGVjayB3aGV0aGVyIHRoaXMgYmxpdCBpcyBzdGlsbCBhY3RpdmUsIHBlcmZvcm1pbmcgbmVjZXNzYXJ5IGxvY2tpbmcuCisgKi8KKworc3RhdGljIGludAordmlhX2RtYWJsaXRfYWN0aXZlKGRybV92aWFfYmxpdHFfdCAqYmxpdHEsIGludCBlbmdpbmUsIHVpbnQzMl90IGhhbmRsZSwgd2FpdF9xdWV1ZV9oZWFkX3QgKipxdWV1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGlycXNhdmU7CisJdWludDMyX3Qgc2xvdDsKKwlpbnQgYWN0aXZlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXRxLT5ibGl0X2xvY2ssIGlycXNhdmUpOworCisJLyoKKwkgKiBBbGxvdyBmb3IgaGFuZGxlIHdyYXBhcm91bmRzLgorCSAqLworCisJYWN0aXZlID0gKChibGl0cS0+ZG9uZV9ibGl0X2hhbmRsZSAtIGhhbmRsZSkgPiAoMSA8PCAyMykpICYmCisJCSgoYmxpdHEtPmN1cl9ibGl0X2hhbmRsZSAtIGhhbmRsZSkgPD0gKDEgPDwgMjMpKTsKKworCWlmIChxdWV1ZSAmJiBhY3RpdmUpIHsKKwkJc2xvdCA9IGhhbmRsZSAtIGJsaXRxLT5kb25lX2JsaXRfaGFuZGxlICsgYmxpdHEtPmN1ciAtMTsKKwkJaWYgKHNsb3QgPj0gVklBX05VTV9CTElUX1NMT1RTKSB7CisJCQlzbG90IC09IFZJQV9OVU1fQkxJVF9TTE9UUzsKKwkJfQorCQkqcXVldWUgPSBibGl0cS0+YmxpdF9xdWV1ZSArIHNsb3Q7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxpdHEtPmJsaXRfbG9jaywgaXJxc2F2ZSk7CisKKwlyZXR1cm4gYWN0aXZlOworfQorCQorLyoKKyAqIFN5bmMuIFdhaXQgZm9yIGF0IGxlYXN0IHRocmVlIHNlY29uZHMgZm9yIHRoZSBibGl0IHRvIGJlIHBlcmZvcm1lZC4KKyAqLworCitzdGF0aWMgaW50Cit2aWFfZG1hYmxpdF9zeW5jKGRybV9kZXZpY2VfdCAqZGV2LCB1aW50MzJfdCBoYW5kbGUsIGludCBlbmdpbmUpIAoreworCisJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fdmlhX2JsaXRxX3QgKmJsaXRxID0gZGV2X3ByaXYtPmJsaXRfcXVldWVzICsgZW5naW5lOworCXdhaXRfcXVldWVfaGVhZF90ICpxdWV1ZTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICh2aWFfZG1hYmxpdF9hY3RpdmUoYmxpdHEsIGVuZ2luZSwgaGFuZGxlLCAmcXVldWUpKSB7CisJCURSTV9XQUlUX09OKHJldCwgKnF1ZXVlLCAzICogRFJNX0haLCAKKwkJCSAgICAhdmlhX2RtYWJsaXRfYWN0aXZlKGJsaXRxLCBlbmdpbmUsIGhhbmRsZSwgTlVMTCkpOworCX0KKwlEUk1fREVCVUcoIkRNQSBibGl0IHN5bmMgaGFuZGxlIDB4JXggZW5naW5lICVkIHJldHVybmVkICVkXG4iLAorCQkgIGhhbmRsZSwgZW5naW5lLCByZXQpOworCQorCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIEEgdGltZXIgdGhhdCByZWd1bGFybHkgcG9sbHMgdGhlIGJsaXQgZW5naW5lIGluIGNhc2VzIHdoZXJlIHdlIGRvbid0IGhhdmUgaW50ZXJydXB0czoKKyAqIGEpIEJyb2tlbiBoYXJkd2FyZSAodHlwaWNhbGx5IHRob3NlIHRoYXQgZG9uJ3QgaGF2ZSBhbnkgdmlkZW8gY2FwdHVyZSBmYWNpbGl0eSkuCisgKiBiKSBCbGl0IGFib3J0LiBUaGUgaGFyZHdhcmUgZG9lc24ndCBzZW5kIGFuIGludGVycnVwdCB3aGVuIGEgYmxpdCBpcyBhYm9ydGVkLgorICogVGhlIHRpbWVyIGFuZCBoYXJkd2FyZSBJUlEncyBjYW4gYW5kIGRvIHdvcmsgaW4gcGFyYWxsZWwuIElmIHRoZSBoYXJkd2FyZSBoYXMKKyAqIGlycXMsIGl0IHdpbGwgc2hvcnRlbiB0aGUgbGF0ZW5jeSBzb21ld2hhdC4KKyAqLworCisKKworc3RhdGljIHZvaWQKK3ZpYV9kbWFibGl0X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlkcm1fdmlhX2JsaXRxX3QgKmJsaXRxID0gKGRybV92aWFfYmxpdHFfdCAqKSBkYXRhOworCWRybV9kZXZpY2VfdCAqZGV2ID0gYmxpdHEtPmRldjsKKwlpbnQgZW5naW5lID0gKGludCkKKwkJKGJsaXRxIC0gKChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGUpLT5ibGl0X3F1ZXVlcyk7CisJCQorCURSTV9ERUJVRygiUG9sbGluZyB0aW1lciBjYWxsZWQgZm9yIGVuZ2luZSAlZCwgamlmZmllcyAlbHVcbiIsIGVuZ2luZSwgCisJCSAgKHVuc2lnbmVkIGxvbmcpIGppZmZpZXMpOworCisJdmlhX2RtYWJsaXRfaGFuZGxlcihkZXYsIGVuZ2luZSwgMCk7CisJCisJaWYgKCF0aW1lcl9wZW5kaW5nKCZibGl0cS0+cG9sbF90aW1lcikpIHsKKwkJYmxpdHEtPnBvbGxfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMrMTsKKwkJYWRkX3RpbWVyKCZibGl0cS0+cG9sbF90aW1lcik7CisJfQorCXZpYV9kbWFibGl0X2hhbmRsZXIoZGV2LCBlbmdpbmUsIDApOworCit9CisKKworCisKKy8qCisgKiBXb3JrcXVldWUgdGFzayB0aGF0IGZyZWVzIGRhdGEgYW5kIG1hcHBpbmdzIGFzc29jaWF0ZWQgd2l0aCBhIGJsaXQuCisgKiBBbHNvIHdha2VzIHVwIHdhaXRpbmcgcHJvY2Vzc2VzLiBFYWNoIG9mIHRoZXNlIHRhc2tzIGhhbmRsZXMgb25lCisgKiBibGl0IGVuZ2luZSBvbmx5IGFuZCBtYXkgbm90IGJlIGNhbGxlZCBvbiBlYWNoIGludGVycnVwdC4KKyAqLworCisKK3N0YXRpYyB2b2lkIAordmlhX2RtYWJsaXRfd29ya3F1ZXVlKHZvaWQgKmRhdGEpCit7CisJZHJtX3ZpYV9ibGl0cV90ICpibGl0cSA9IChkcm1fdmlhX2JsaXRxX3QgKikgZGF0YTsKKwlkcm1fZGV2aWNlX3QgKmRldiA9IGJsaXRxLT5kZXY7CisJdW5zaWduZWQgbG9uZyBpcnFzYXZlOworCWRybV92aWFfc2dfaW5mb190ICpjdXJfc2c7CisJaW50IGN1cl9yZWxlYXNlZDsKKwkKKwkKKwlEUk1fREVCVUcoIldvcmtxdWV1ZSB0YXNrIGNhbGxlZCBmb3IgYmxpdCBlbmdpbmUgJWxkXG4iLCh1bnNpZ25lZCBsb25nKSAKKwkJICAoYmxpdHEgLSAoKGRybV92aWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZSktPmJsaXRfcXVldWVzKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmxpdHEtPmJsaXRfbG9jaywgaXJxc2F2ZSk7CisJCisJd2hpbGUoYmxpdHEtPnNlcnZpY2VkICE9IGJsaXRxLT5jdXIpIHsKKworCQljdXJfcmVsZWFzZWQgPSBibGl0cS0+c2VydmljZWQrKzsKKworCQlEUk1fREVCVUcoIlJlbGVhc2luZyBibGl0IHNsb3QgJWRcbiIsIGN1cl9yZWxlYXNlZCk7CisKKwkJaWYgKGJsaXRxLT5zZXJ2aWNlZCA+PSBWSUFfTlVNX0JMSVRfU0xPVFMpIAorCQkJYmxpdHEtPnNlcnZpY2VkID0gMDsKKwkJCisJCWN1cl9zZyA9IGJsaXRxLT5ibGl0c1tjdXJfcmVsZWFzZWRdOworCQlibGl0cS0+bnVtX2ZyZWUrKzsKKwkJCQkKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxpdHEtPmJsaXRfbG9jaywgaXJxc2F2ZSk7CisJCQorCQlEUk1fV0FLRVVQKCZibGl0cS0+YnVzeV9xdWV1ZSk7CisJCQorCQl2aWFfZnJlZV9zZ19pbmZvKGRldi0+cGRldiwgY3VyX3NnKTsKKwkJa2ZyZWUoY3VyX3NnKTsKKwkJCisJCXNwaW5fbG9ja19pcnFzYXZlKCZibGl0cS0+YmxpdF9sb2NrLCBpcnFzYXZlKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGl0cS0+YmxpdF9sb2NrLCBpcnFzYXZlKTsKK30KKwkKKworLyoKKyAqIEluaXQgYWxsIGJsaXQgZW5naW5lcy4gQ3VycmVudGx5IHdlIHVzZSB0d28sIGJ1dCBzb21lIGhhcmR3YXJlIGhhdmUgNC4KKyAqLworCisKK3ZvaWQKK3ZpYV9pbml0X2RtYWJsaXQoZHJtX2RldmljZV90ICpkZXYpCit7CisJaW50IGksajsKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCWRybV92aWFfYmxpdHFfdCAqYmxpdHE7CisKKwlwY2lfc2V0X21hc3RlcihkZXYtPnBkZXYpOwkKKwkKKwlmb3IgKGk9MDsgaTwgVklBX05VTV9CTElUX0VOR0lORVM7ICsraSkgeworCQlibGl0cSA9IGRldl9wcml2LT5ibGl0X3F1ZXVlcyArIGk7CisJCWJsaXRxLT5kZXYgPSBkZXY7CisJCWJsaXRxLT5jdXJfYmxpdF9oYW5kbGUgPSAwOworCQlibGl0cS0+ZG9uZV9ibGl0X2hhbmRsZSA9IDA7CisJCWJsaXRxLT5oZWFkID0gMDsKKwkJYmxpdHEtPmN1ciA9IDA7CisJCWJsaXRxLT5zZXJ2aWNlZCA9IDA7CisJCWJsaXRxLT5udW1fZnJlZSA9IFZJQV9OVU1fQkxJVF9TTE9UUzsKKwkJYmxpdHEtPm51bV9vdXRzdGFuZGluZyA9IDA7CisJCWJsaXRxLT5pc19hY3RpdmUgPSAwOworCQlibGl0cS0+YWJvcnRpbmcgPSAwOworCQlibGl0cS0+YmxpdF9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCQlmb3IgKGo9MDsgajxWSUFfTlVNX0JMSVRfU0xPVFM7ICsraikgeworCQkJRFJNX0lOSVRfV0FJVFFVRVVFKGJsaXRxLT5ibGl0X3F1ZXVlICsgaik7CisJCX0KKwkJRFJNX0lOSVRfV0FJVFFVRVVFKCZibGl0cS0+YnVzeV9xdWV1ZSk7CisJCUlOSVRfV09SSygmYmxpdHEtPndxLCB2aWFfZG1hYmxpdF93b3JrcXVldWUsIGJsaXRxKTsKKwkJaW5pdF90aW1lcigmYmxpdHEtPnBvbGxfdGltZXIpOworCQlibGl0cS0+cG9sbF90aW1lci5mdW5jdGlvbiA9ICZ2aWFfZG1hYmxpdF90aW1lcjsKKwkJYmxpdHEtPnBvbGxfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBibGl0cTsKKwl9CQorfQorCisvKgorICogQnVpbGQgYWxsIGluZm8gYW5kIGRvIGFsbCBtYXBwaW5ncyByZXF1aXJlZCBmb3IgYSBibGl0LgorICovCisJCQorCitzdGF0aWMgaW50Cit2aWFfYnVpbGRfc2dfaW5mbyhkcm1fZGV2aWNlX3QgKmRldiwgZHJtX3ZpYV9zZ19pbmZvX3QgKnZzZywgZHJtX3ZpYV9kbWFibGl0X3QgKnhmZXIpCit7CisJaW50IGRyYXcgPSB4ZmVyLT50b19mYjsKKwlpbnQgcmV0ID0gMDsKKwkKKwl2c2ctPmRpcmVjdGlvbiA9IChkcmF3KSA/IERNQV9UT19ERVZJQ0UgOiBETUFfRlJPTV9ERVZJQ0U7CisJdnNnLT5ib3VuY2VfYnVmZmVyID0gMDsKKworCXZzZy0+c3RhdGUgPSBkcl92aWFfc2dfaW5pdDsKKworCWlmICh4ZmVyLT5udW1fbGluZXMgPD0gMCB8fCB4ZmVyLT5saW5lX2xlbmd0aCA8PSAwKSB7CisJCURSTV9FUlJPUigiWmVybyBzaXplIGJpdGJsdC5cbiIpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCS8qCisJICogQmVsb3cgY2hlY2sgaXMgYSBkcml2ZXIgbGltaXRhdGlvbiwgbm90IGEgaGFyZHdhcmUgb25lLiBXZQorCSAqIGRvbid0IHdhbnQgdG8gbG9jayB1bnVzZWQgcGFnZXMsIGFuZCBkb24ndCB3YW50IHRvIGluY29wb3JhdGUgdGhlCisJICogZXh0cmEgbG9naWMgb2YgYXZvaWRpbmcgdGhlbS4gTWFrZSBzdXJlIHRoZXJlIGFyZSBuby4gCisJICogKE5vdCBhIGJpZyBsaW1pdGF0aW9uIGFueXdheS4pCisJICovCisKKwlpZiAoKCh4ZmVyLT5tZW1fc3RyaWRlIC0geGZlci0+bGluZV9sZW5ndGgpID49IFBBR0VfU0laRSkgfHwKKwkgICAgKHhmZXItPm1lbV9zdHJpZGUgPiAyMDQ4KjQpKSB7CisJCURSTV9FUlJPUigiVG9vIGxhcmdlIHN5c3RlbSBtZW1vcnkgc3RyaWRlLiBTdHJpZGU6ICVkLCAiCisJCQkgICJMZW5ndGg6ICVkXG4iLCB4ZmVyLT5tZW1fc3RyaWRlLCB4ZmVyLT5saW5lX2xlbmd0aCk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJaWYgKHhmZXItPm51bV9saW5lcyA+IDIwNDgpIHsKKwkJRFJNX0VSUk9SKCJUb28gbWFueSBQQ0kgRE1BIGJpdGJsdCBsaW5lcy5cbiIpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0JCQorCisJLyogCisJICogd2UgYWxsb3cgYSBuZWdhdGl2ZSBmYiBzdHJpZGUgdG8gYWxsb3cgZmxpcHBpbmcgb2YgaW1hZ2VzIGluCisJICogdHJhbnNmZXIuIAorCSAqLworCisJaWYgKHhmZXItPm1lbV9zdHJpZGUgPCB4ZmVyLT5saW5lX2xlbmd0aCB8fAorCQlhYnMoeGZlci0+ZmJfc3RyaWRlKSA8IHhmZXItPmxpbmVfbGVuZ3RoKSB7CisJCURSTV9FUlJPUigiSW52YWxpZCBmcmFtZS1idWZmZXIgLyBtZW1vcnkgc3RyaWRlLlxuIik7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJLyoKKwkgKiBBIGhhcmR3YXJlIGJ1ZyBzZWVtcyB0byBiZSB3b3JrZWQgYXJvdW5kIGlmIHN5c3RlbSBtZW1vcnkgYWRkcmVzc2VzIHN0YXJ0IG9uCisJICogMTYgYnl0ZSBib3VuZGFyaWVzLiBUaGlzIHNlZW1zIGEgYml0IHJlc3RyaWN0aXZlIGhvd2V2ZXIuIFZJQSBpcyBjb250YWN0ZWQKKwkgKiBhYm91dCB0aGlzLiBNZWFud2hpbGUsIGltcG9zZSB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKwkgKi8KKworI2lmZGVmIFZJQV9CVUdGUkVFCisJaWYgKCgoKHVuc2lnbmVkIGxvbmcpeGZlci0+bWVtX2FkZHIgJiAzKSAhPSAoKHVuc2lnbmVkIGxvbmcpeGZlci0+ZmJfYWRkciAmIDMpKSB8fAorCSAgICAoKHhmZXItPm1lbV9zdHJpZGUgJiAzKSAhPSAoeGZlci0+ZmJfc3RyaWRlICYgMykpKSB7CisJCURSTV9FUlJPUigiSW52YWxpZCBEUk0gYml0Ymx0IGFsaWdubWVudC5cbiIpOworCSAgICAgICAgcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisjZWxzZQorCWlmICgoKCh1bnNpZ25lZCBsb25nKXhmZXItPm1lbV9hZGRyICYgMTUpIHx8CisJICAgICgodW5zaWduZWQgbG9uZyl4ZmVyLT5mYl9hZGRyICYgMykpIHx8ICh4ZmVyLT5tZW1fc3RyaWRlICYgMTUpIHx8CisJICAgICh4ZmVyLT5mYl9zdHJpZGUgJiAzKSkgeworCQlEUk1fRVJST1IoIkludmFsaWQgRFJNIGJpdGJsdCBhbGlnbm1lbnQuXG4iKTsKKwkgICAgICAgIHJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQkKKyNlbmRpZgorCisJaWYgKDAgIT0gKHJldCA9IHZpYV9sb2NrX2FsbF9kbWFfcGFnZXModnNnLCB4ZmVyKSkpIHsKKwkJRFJNX0VSUk9SKCJDb3VsZCBub3QgbG9jayBETUEgcGFnZXMuXG4iKTsKKwkJdmlhX2ZyZWVfc2dfaW5mbyhkZXYtPnBkZXYsIHZzZyk7CisJCXJldHVybiByZXQ7CisJfQorCisJdmlhX21hcF9ibGl0X2Zvcl9kZXZpY2UoZGV2LT5wZGV2LCB4ZmVyLCB2c2csIDApOworCWlmICgwICE9IChyZXQgPSB2aWFfYWxsb2NfZGVzY19wYWdlcyh2c2cpKSkgeworCQlEUk1fRVJST1IoIkNvdWxkIG5vdCBhbGxvY2F0ZSBETUEgZGVzY3JpcHRvciBwYWdlcy5cbiIpOworCQl2aWFfZnJlZV9zZ19pbmZvKGRldi0+cGRldiwgdnNnKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJdmlhX21hcF9ibGl0X2Zvcl9kZXZpY2UoZGV2LT5wZGV2LCB4ZmVyLCB2c2csIDEpOworCQorCXJldHVybiAwOworfQorCQorCisvKgorICogUmVzZXJ2ZSBvbmUgZnJlZSBzbG90IGluIHRoZSBibGl0IHF1ZXVlLiBXaWxsIHdhaXQgZm9yIG9uZSBzZWNvbmQgZm9yIG9uZQorICogdG8gYmVjb21lIGF2YWlsYWJsZS4gT3RoZXJ3aXNlIC1FQlVTWSBpcyByZXR1cm5lZC4KKyAqLworCitzdGF0aWMgaW50IAordmlhX2RtYWJsaXRfZ3JhYl9zbG90KGRybV92aWFfYmxpdHFfdCAqYmxpdHEsIGludCBlbmdpbmUpCit7CisJaW50IHJldD0wOworCXVuc2lnbmVkIGxvbmcgaXJxc2F2ZTsKKworCURSTV9ERUJVRygiTnVtIGZyZWUgaXMgJWRcbiIsIGJsaXRxLT5udW1fZnJlZSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXRxLT5ibGl0X2xvY2ssIGlycXNhdmUpOworCXdoaWxlKGJsaXRxLT5udW1fZnJlZSA9PSAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsaXRxLT5ibGl0X2xvY2ssIGlycXNhdmUpOworCisJCURSTV9XQUlUX09OKHJldCwgYmxpdHEtPmJ1c3lfcXVldWUsIERSTV9IWiwgYmxpdHEtPm51bV9mcmVlID4gMCk7CisJCWlmIChyZXQpIHsKKwkJCXJldHVybiAoRFJNX0VSUihFSU5UUikgPT0gcmV0KSA/IERSTV9FUlIoRUFHQUlOKSA6IHJldDsKKwkJfQorCQkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXRxLT5ibGl0X2xvY2ssIGlycXNhdmUpOworCX0KKwkKKwlibGl0cS0+bnVtX2ZyZWUtLTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGl0cS0+YmxpdF9sb2NrLCBpcnFzYXZlKTsKKworCXJldHVybiAwOworfQorCisvKgorICogSGFuZCBiYWNrIGEgZnJlZSBzbG90IGlmIHdlIGNoYW5nZWQgb3VyIG1pbmQuCisgKi8KKworc3RhdGljIHZvaWQgCit2aWFfZG1hYmxpdF9yZWxlYXNlX3Nsb3QoZHJtX3ZpYV9ibGl0cV90ICpibGl0cSkKK3sKKwl1bnNpZ25lZCBsb25nIGlycXNhdmU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmxpdHEtPmJsaXRfbG9jaywgaXJxc2F2ZSk7CisJYmxpdHEtPm51bV9mcmVlKys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxpdHEtPmJsaXRfbG9jaywgaXJxc2F2ZSk7CisJRFJNX1dBS0VVUCggJmJsaXRxLT5idXN5X3F1ZXVlICk7Cit9CisKKy8qCisgKiBHcmFiIGEgZnJlZSBzbG90LiBCdWlsZCBibGl0IGluZm8gYW5kIHF1ZXVlIGEgYmxpdC4KKyAqLworCisKK3N0YXRpYyBpbnQgCit2aWFfZG1hYmxpdChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX3ZpYV9kbWFibGl0X3QgKnhmZXIpCSAKK3sKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOworCWRybV92aWFfc2dfaW5mb190ICp2c2c7CisJZHJtX3ZpYV9ibGl0cV90ICpibGl0cTsKKyAgICAgICAgaW50IHJldDsKKwlpbnQgZW5naW5lOworCXVuc2lnbmVkIGxvbmcgaXJxc2F2ZTsKKworCWlmIChkZXZfcHJpdiA9PSBOVUxMKSB7CisJCURSTV9FUlJPUigiQ2FsbGVkIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24uXG4iKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwllbmdpbmUgPSAoeGZlci0+dG9fZmIpID8gMCA6IDE7CisJYmxpdHEgPSBkZXZfcHJpdi0+YmxpdF9xdWV1ZXMgKyBlbmdpbmU7CisJaWYgKDAgIT0gKHJldCA9IHZpYV9kbWFibGl0X2dyYWJfc2xvdChibGl0cSwgZW5naW5lKSkpIHsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKE5VTEwgPT0gKHZzZyA9IGttYWxsb2Moc2l6ZW9mKCp2c2cpLCBHRlBfS0VSTkVMKSkpIHsKKwkJdmlhX2RtYWJsaXRfcmVsZWFzZV9zbG90KGJsaXRxKTsKKwkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwl9CisJaWYgKDAgIT0gKHJldCA9IHZpYV9idWlsZF9zZ19pbmZvKGRldiwgdnNnLCB4ZmVyKSkpIHsKKwkJdmlhX2RtYWJsaXRfcmVsZWFzZV9zbG90KGJsaXRxKTsKKwkJa2ZyZWUodnNnKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXRxLT5ibGl0X2xvY2ssIGlycXNhdmUpOworCisJYmxpdHEtPmJsaXRzW2JsaXRxLT5oZWFkKytdID0gdnNnOworCWlmIChibGl0cS0+aGVhZCA+PSBWSUFfTlVNX0JMSVRfU0xPVFMpIAorCQlibGl0cS0+aGVhZCA9IDA7CisJYmxpdHEtPm51bV9vdXRzdGFuZGluZysrOworCXhmZXItPnN5bmMuc3luY19oYW5kbGUgPSArK2JsaXRxLT5jdXJfYmxpdF9oYW5kbGU7IAorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxpdHEtPmJsaXRfbG9jaywgaXJxc2F2ZSk7CisJeGZlci0+c3luYy5lbmdpbmUgPSBlbmdpbmU7CisKKyAgICAgICAJdmlhX2RtYWJsaXRfaGFuZGxlcihkZXYsIGVuZ2luZSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFN5bmMgb24gYSBwcmV2aW91c2x5IHN1Ym1pdHRlZCBibGl0LiBOb3RlIHRoYXQgdGhlIFggc2VydmVyIHVzZSBzaWduYWxzIGV4dGVuc2l2ZWx5LCBhbmQKKyAqIHRoYXQgdGhlcmUgaXMgYSB2ZXJ5IGJpZyBwcm9hYmlsaXR5IHRoYXQgdGhpcyBJT0NUTCB3aWxsIGJlIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLiBJbiB0aGF0CisgKiBjYXNlIGl0IHJldHVybnMgd2l0aCAtRUFHQUlOIGZvciB0aGUgc2lnbmFsIHRvIGJlIGRlbGl2ZXJlZC4gCisgKiBUaGUgY2FsbGVyIHNob3VsZCB0aGVuIHJlaXNzdWUgdGhlIElPQ1RMLiBUaGlzIGlzIHNpbWlsYXIgdG8gd2hhdCBpcyBiZWluZyBkb25lIGZvciBkcm1HZXRMb2NrKCkuCisgKi8KKworaW50Cit2aWFfZG1hX2JsaXRfc3luYyggRFJNX0lPQ1RMX0FSR1MgKQoreworCWRybV92aWFfYmxpdHN5bmNfdCBzeW5jOworCWludCBlcnI7CisJRFJNX0RFVklDRTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChzeW5jLCAoZHJtX3ZpYV9ibGl0c3luY190ICopZGF0YSwgc2l6ZW9mKHN5bmMpKTsKKwkKKwlpZiAoc3luYy5lbmdpbmUgPj0gVklBX05VTV9CTElUX0VOR0lORVMpIAorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCisJZXJyID0gdmlhX2RtYWJsaXRfc3luYyhkZXYsIHN5bmMuc3luY19oYW5kbGUsIHN5bmMuZW5naW5lKTsKKworCWlmIChEUk1fRVJSKEVJTlRSKSA9PSBlcnIpCisJCWVyciA9IERSTV9FUlIoRUFHQUlOKTsKKworCXJldHVybiBlcnI7Cit9CisJCisKKy8qCisgKiBRdWV1ZSBhIGJsaXQgYW5kIGhhbmQgYmFjayBhIGhhbmRsZSB0byBiZSB1c2VkIGZvciBzeW5jLiBUaGlzIElPQ1RMIG1heSBiZSBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbAorICogd2hpbGUgd2FpdGluZyBmb3IgYSBmcmVlIHNsb3QgaW4gdGhlIGJsaXQgcXVldWUuIEluIHRoYXQgY2FzZSBpdCByZXR1cm5zIHdpdGggLUVBR0FJTiBhbmQgc2hvdWxkIAorICogYmUgcmVpc3N1ZWQuIFNlZSB0aGUgYWJvdmUgSU9DVEwgY29kZS4KKyAqLworCitpbnQgCit2aWFfZG1hX2JsaXQoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlkcm1fdmlhX2RtYWJsaXRfdCB4ZmVyOworCWludCBlcnI7CisJRFJNX0RFVklDRTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCh4ZmVyLCAoZHJtX3ZpYV9kbWFibGl0X3QgX191c2VyICopZGF0YSwgc2l6ZW9mKHhmZXIpKTsKKworCWVyciA9IHZpYV9kbWFibGl0KGRldiwgJnhmZXIpOworCisJRFJNX0NPUFlfVE9fVVNFUl9JT0NUTCgodm9pZCBfX3VzZXIgKilkYXRhLCB4ZmVyLCBzaXplb2YoeGZlcikpOworCisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYWJsaXQuaCBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYWJsaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDAzNmNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hYmxpdC5oCkBAIC0wLDAgKzEsMTQwIEBACisvKiB2aWFfZG1hYmxpdC5oIC0tIFBDSSBETUEgQml0Qmx0IHN1cHBvcnQgZm9yIHRoZSBWSUEgVW5pY2hyb21lL1BybworICogCisgKiBDb3B5cmlnaHQgMjAwNSBUaG9tYXMgSGVsbHN0cm9tLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIAorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiAKKyAqICAgIFRob21hcyBIZWxsc3Ryb20uCisgKiAgICBSZWdpc3RlciBpbmZvIGZyb20gRGlnZW8gSW5jLgorICovCisKKyNpZm5kZWYgX1ZJQV9ETUFCTElUX0gKKyNkZWZpbmUgX1ZJQV9ETUFCTElUX0gKKworI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNkZWZpbmUgVklBX05VTV9CTElUX0VOR0lORVMgMgorI2RlZmluZSBWSUFfTlVNX0JMSVRfU0xPVFMgOAorCitzdHJ1Y3QgX2RybV92aWFfZGVzY3JpcHRvcjsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV92aWFfc2dfaW5mbyB7CisJc3RydWN0IHBhZ2UgKipwYWdlczsKKwl1bnNpZ25lZCBsb25nIG51bV9wYWdlczsKKwlzdHJ1Y3QgX2RybV92aWFfZGVzY3JpcHRvciAqKmRlc2NfcGFnZXM7CisJaW50IG51bV9kZXNjX3BhZ2VzOworCWludCBudW1fZGVzYzsKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb247CisJdW5zaWduZWQgY2hhciAqYm91bmNlX2J1ZmZlcjsKKyAgICAgICAgZG1hX2FkZHJfdCBjaGFpbl9zdGFydDsKKwl1aW50MzJfdCBmcmVlX29uX3NlcXVlbmNlOworICAgICAgICB1bnNpZ25lZCBpbnQgZGVzY3JpcHRvcnNfcGVyX3BhZ2U7CisJaW50IGFib3J0ZWQ7CisJZW51bSB7CisJICAgICAgICBkcl92aWFfZGV2aWNlX21hcHBlZCwKKwkJZHJfdmlhX2Rlc2NfcGFnZXNfYWxsb2MsCisJCWRyX3ZpYV9wYWdlc19sb2NrZWQsCisJCWRyX3ZpYV9wYWdlc19hbGxvYywKKwkJZHJfdmlhX3NnX2luaXQKKwl9IHN0YXRlOworfSBkcm1fdmlhX3NnX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2RybV92aWFfYmxpdHEgeworCWRybV9kZXZpY2VfdCAqZGV2OworCXVpbnQzMl90IGN1cl9ibGl0X2hhbmRsZTsKKwl1aW50MzJfdCBkb25lX2JsaXRfaGFuZGxlOworCXVuc2lnbmVkIHNlcnZpY2VkOworCXVuc2lnbmVkIGhlYWQ7CisJdW5zaWduZWQgY3VyOworCXVuc2lnbmVkIG51bV9mcmVlOworCXVuc2lnbmVkIG51bV9vdXRzdGFuZGluZzsKKwl1bnNpZ25lZCBsb25nIGVuZDsgIAorICAgICAgICBpbnQgYWJvcnRpbmc7CisJaW50IGlzX2FjdGl2ZTsKKwlkcm1fdmlhX3NnX2luZm9fdCAqYmxpdHNbVklBX05VTV9CTElUX1NMT1RTXTsKKwlzcGlubG9ja190IGJsaXRfbG9jazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBibGl0X3F1ZXVlW1ZJQV9OVU1fQkxJVF9TTE9UU107CisJd2FpdF9xdWV1ZV9oZWFkX3QgYnVzeV9xdWV1ZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd3E7CisJc3RydWN0IHRpbWVyX2xpc3QgcG9sbF90aW1lcjsKK30gZHJtX3ZpYV9ibGl0cV90OworCQorCisvKiAKKyAqICBQQ0kgRE1BIFJlZ2lzdGVycworICogIENoYW5uZWxzIDIgJiAzIGRvbid0IHNlZW0gdG8gYmUgaW1wbGVtZW50ZWQgaW4gaGFyZHdhcmUuCisgKi8KKyAKKyNkZWZpbmUgVklBX1BDSV9ETUFfTUFSMCAgICAgICAgICAgIDB4RTQwICAgLyogTWVtb3J5IEFkZHJlc3MgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAwICovIAorI2RlZmluZSBWSUFfUENJX0RNQV9EQVIwICAgICAgICAgICAgMHhFNDQgICAvKiBEZXZpY2UgQWRkcmVzcyBSZWdpc3RlciBvZiBDaGFubmVsIDAgKi8gCisjZGVmaW5lIFZJQV9QQ0lfRE1BX0JDUjAgICAgICAgICAgICAweEU0OCAgIC8qIEJ5dGUgQ291bnQgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAwICovIAorI2RlZmluZSBWSUFfUENJX0RNQV9EUFIwICAgICAgICAgICAgMHhFNEMgICAvKiBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAwICovIAorCisjZGVmaW5lIFZJQV9QQ0lfRE1BX01BUjEgICAgICAgICAgICAweEU1MCAgIC8qIE1lbW9yeSBBZGRyZXNzIFJlZ2lzdGVyIG9mIENoYW5uZWwgMSAqLyAKKyNkZWZpbmUgVklBX1BDSV9ETUFfREFSMSAgICAgICAgICAgIDB4RTU0ICAgLyogRGV2aWNlIEFkZHJlc3MgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAxICovIAorI2RlZmluZSBWSUFfUENJX0RNQV9CQ1IxICAgICAgICAgICAgMHhFNTggICAvKiBCeXRlIENvdW50IFJlZ2lzdGVyIG9mIENoYW5uZWwgMSAqLyAKKyNkZWZpbmUgVklBX1BDSV9ETUFfRFBSMSAgICAgICAgICAgIDB4RTVDICAgLyogRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyIG9mIENoYW5uZWwgMSAqLyAKKworI2RlZmluZSBWSUFfUENJX0RNQV9NQVIyICAgICAgICAgICAgMHhFNjAgICAvKiBNZW1vcnkgQWRkcmVzcyBSZWdpc3RlciBvZiBDaGFubmVsIDIgKi8gCisjZGVmaW5lIFZJQV9QQ0lfRE1BX0RBUjIgICAgICAgICAgICAweEU2NCAgIC8qIERldmljZSBBZGRyZXNzIFJlZ2lzdGVyIG9mIENoYW5uZWwgMiAqLyAKKyNkZWZpbmUgVklBX1BDSV9ETUFfQkNSMiAgICAgICAgICAgIDB4RTY4ICAgLyogQnl0ZSBDb3VudCBSZWdpc3RlciBvZiBDaGFubmVsIDIgKi8gCisjZGVmaW5lIFZJQV9QQ0lfRE1BX0RQUjIgICAgICAgICAgICAweEU2QyAgIC8qIERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciBvZiBDaGFubmVsIDIgKi8gCisKKyNkZWZpbmUgVklBX1BDSV9ETUFfTUFSMyAgICAgICAgICAgIDB4RTcwICAgLyogTWVtb3J5IEFkZHJlc3MgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAzICovIAorI2RlZmluZSBWSUFfUENJX0RNQV9EQVIzICAgICAgICAgICAgMHhFNzQgICAvKiBEZXZpY2UgQWRkcmVzcyBSZWdpc3RlciBvZiBDaGFubmVsIDMgKi8gCisjZGVmaW5lIFZJQV9QQ0lfRE1BX0JDUjMgICAgICAgICAgICAweEU3OCAgIC8qIEJ5dGUgQ291bnQgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAzICovIAorI2RlZmluZSBWSUFfUENJX0RNQV9EUFIzICAgICAgICAgICAgMHhFN0MgICAvKiBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAzICovIAorCisjZGVmaW5lIFZJQV9QQ0lfRE1BX01SMCAgICAgICAgICAgICAweEU4MCAgIC8qIE1vZGUgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAwICovIAorI2RlZmluZSBWSUFfUENJX0RNQV9NUjEgICAgICAgICAgICAgMHhFODQgICAvKiBNb2RlIFJlZ2lzdGVyIG9mIENoYW5uZWwgMSAqLyAKKyNkZWZpbmUgVklBX1BDSV9ETUFfTVIyICAgICAgICAgICAgIDB4RTg4ICAgLyogTW9kZSBSZWdpc3RlciBvZiBDaGFubmVsIDIgKi8gCisjZGVmaW5lIFZJQV9QQ0lfRE1BX01SMyAgICAgICAgICAgICAweEU4QyAgIC8qIE1vZGUgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAzICovIAorCisjZGVmaW5lIFZJQV9QQ0lfRE1BX0NTUjAgICAgICAgICAgICAweEU5MCAgIC8qIENvbW1hbmQvU3RhdHVzIFJlZ2lzdGVyIG9mIENoYW5uZWwgMCAqLyAKKyNkZWZpbmUgVklBX1BDSV9ETUFfQ1NSMSAgICAgICAgICAgIDB4RTk0ICAgLyogQ29tbWFuZC9TdGF0dXMgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAxICovIAorI2RlZmluZSBWSUFfUENJX0RNQV9DU1IyICAgICAgICAgICAgMHhFOTggICAvKiBDb21tYW5kL1N0YXR1cyBSZWdpc3RlciBvZiBDaGFubmVsIDIgKi8gCisjZGVmaW5lIFZJQV9QQ0lfRE1BX0NTUjMgICAgICAgICAgICAweEU5QyAgIC8qIENvbW1hbmQvU3RhdHVzIFJlZ2lzdGVyIG9mIENoYW5uZWwgMyAqLyAKKworI2RlZmluZSBWSUFfUENJX0RNQV9QVFIgICAgICAgICAgICAgMHhFQTAgICAvKiBQcmlvcml0eSBUeXBlIFJlZ2lzdGVyICovIAorCisvKiBEZWZpbmUgZm9yIERNQSBlbmdpbmUgKi8gCisvKiBEUFIgKi8KKyNkZWZpbmUgVklBX0RNQV9EUFJfRUMJCSgxPDwxKQkvKiBlbmQgb2YgY2hhaW4gKi8KKyNkZWZpbmUgVklBX0RNQV9EUFJfRERJRQkoMTw8MikJLyogZGVzY3JpcHRvciBkb25lIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgVklBX0RNQV9EUFJfRFQJCSgxPDwzKQkvKiBkaXJlY3Rpb24gb2YgdHJhbnNmZXIgKFJPKSAqLworCisvKiBNUiAqLworI2RlZmluZSBWSUFfRE1BX01SX0NNCQkoMTw8MCkJLyogY2hhaW5pbmcgbW9kZSAqLworI2RlZmluZSBWSUFfRE1BX01SX1RESUUJCSgxPDwxKQkvKiB0cmFuc2ZlciBkb25lIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgVklBX0RNQV9NUl9IRU5ETUFDTUQJCSgxPDw3KSAvKiA/ICovCisKKy8qIENTUiAqLworI2RlZmluZSBWSUFfRE1BX0NTUl9ERQkJKDE8PDApCS8qIERNQSBlbmFibGUgKi8KKyNkZWZpbmUgVklBX0RNQV9DU1JfVFMJCSgxPDwxKQkvKiB0cmFuc2ZlciBzdGFydCAqLworI2RlZmluZSBWSUFfRE1BX0NTUl9UQQkJKDE8PDIpCS8qIHRyYW5zZmVyIGFib3J0ICovCisjZGVmaW5lIFZJQV9ETUFfQ1NSX1RECQkoMTw8MykJLyogdHJhbnNmZXIgZG9uZSAqLworI2RlZmluZSBWSUFfRE1BX0NTUl9ERAkJKDE8PDQpCS8qIGRlc2NyaXB0b3IgZG9uZSAqLworI2RlZmluZSBWSUFfRE1BX0RQUl9FQyAgICAgICAgICAoMTw8MSkgIC8qIGVuZCBvZiBjaGFpbiAqLworCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RybS5oCmluZGV4IGViZGU5MjAuLjQ3ZjBiNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RybS5oCkBAIC03NSw2ICs3NSw4IEBACiAjZGVmaW5lIERSTV9WSUFfQ01EQlVGX1NJWkUJMHgwYgogI2RlZmluZSBOT1RfVVNFRAogI2RlZmluZSBEUk1fVklBX1dBSVRfSVJRICAgICAgICAweDBkCisjZGVmaW5lIERSTV9WSUFfRE1BX0JMSVQgICAgICAgIDB4MGUKKyNkZWZpbmUgRFJNX1ZJQV9CTElUX1NZTkMgICAgICAgMHgwZgogCiAjZGVmaW5lIERSTV9JT0NUTF9WSUFfQUxMT0NNRU0JICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9BTExPQ01FTSwgZHJtX3ZpYV9tZW1fdCkKICNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9GUkVFTUVNCSAgRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfRlJFRU1FTSwgZHJtX3ZpYV9tZW1fdCkKQEAgLTg5LDYgKzkxLDggQEAKICNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9DTURCVUZfU0laRSBEUk1fSU9XUiggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfQ01EQlVGX1NJWkUsIFwKIAkJCQkJICAgIGRybV92aWFfY21kYnVmX3NpemVfdCkKICNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9XQUlUX0lSUSAgICBEUk1fSU9XUiggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfV0FJVF9JUlEsIGRybV92aWFfaXJxd2FpdF90KQorI2RlZmluZSBEUk1fSU9DVExfVklBX0RNQV9CTElUICAgIERSTV9JT1coRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfRE1BX0JMSVQsIGRybV92aWFfZG1hYmxpdF90KQorI2RlZmluZSBEUk1fSU9DVExfVklBX0JMSVRfU1lOQyAgIERSTV9JT1coRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfQkxJVF9TWU5DLCBkcm1fdmlhX2JsaXRzeW5jX3QpCiAKIC8qIEluZGljZXMgaW50byBidWYuU2V0dXAgd2hlcmUgdmFyaW91cyBiaXRzIG9mIHN0YXRlIGFyZSBtaXJyb3JlZCBwZXIKICAqIGNvbnRleHQgYW5kIHBlciBidWZmZXIuICBUaGVzZSBjYW4gYmUgZmlyZWQgYXQgdGhlIGNhcmQgYXMgYSB1bml0LApAQCAtMTAzLDggKzEwNywxMiBAQAogI2RlZmluZSBWSUFfQkFDSyAgICAweDIKICNkZWZpbmUgVklBX0RFUFRIICAgMHg0CiAjZGVmaW5lIFZJQV9TVEVOQ0lMIDB4OAotI2RlZmluZSBWSURFTyAwCi0jZGVmaW5lIEFHUCAxCisjZGVmaW5lIFZJQV9NRU1fVklERU8gICAwCS8qIG1hdGNoZXMgZHJtIGNvbnN0YW50ICovCisjZGVmaW5lIFZJQV9NRU1fQUdQICAgICAxCS8qIG1hdGNoZXMgZHJtIGNvbnN0YW50ICovCisjZGVmaW5lIFZJQV9NRU1fU1lTVEVNICAyCisjZGVmaW5lIFZJQV9NRU1fTUlYRUQgICAzCisjZGVmaW5lIFZJQV9NRU1fVU5LTk9XTiA0CisKIHR5cGVkZWYgc3RydWN0IHsKIAl1aW50MzJfdCBvZmZzZXQ7CiAJdWludDMyX3Qgc2l6ZTsKQEAgLTE5Miw2ICsyMDAsOSBAQAogCXVuc2lnbmVkIGludCBYdk1DU3ViUGljT25bVklBX05SX1hWTUNfUE9SVFNdOwogCXVuc2lnbmVkIGludCBYdk1DQ3R4Tm9HcmFiYmVkOwkvKiBMYXN0IGNvbnRleHQgdG8gaG9sZCBkZWNvZGVyICovCiAKKwkvKiBVc2VkIGJ5IHRoZSAzZCBkcml2ZXIgb25seSBhdCB0aGlzIHBvaW50LCBmb3IgcGFnZWZsaXBwaW5nOgorCSAqLworCXVuc2lnbmVkIGludCBwZkN1cnJlbnRPZmZzZXQ7CiB9IGRybV92aWFfc2FyZWFfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgX2RybV92aWFfY21kYnVmX3NpemUgewpAQCAtMjEyLDYgKzIyMywxNiBAQAogCiAjZGVmaW5lIFZJQV9JUlFfRkxBR1NfTUFTSyAweEYwMDAwMDAwCiAKK2VudW0gZHJtX3ZpYV9pcnFzIHsKKwlkcm1fdmlhX2lycV9ocXYwID0gMCwKKwlkcm1fdmlhX2lycV9ocXYxLAorCWRybV92aWFfaXJxX2RtYTBfZGQsCisJZHJtX3ZpYV9pcnFfZG1hMF90ZCwKKwlkcm1fdmlhX2lycV9kbWExX2RkLAorCWRybV92aWFfaXJxX2RtYTFfdGQsCisJZHJtX3ZpYV9pcnFfbnVtCit9OworCiBzdHJ1Y3QgZHJtX3ZpYV93YWl0X2lycV9yZXF1ZXN0IHsKIAl1bnNpZ25lZCBpcnE7CiAJdmlhX2lycV9zZXFfdHlwZV90IHR5cGU7CkBAIC0yMjQsMjAgKzI0NSwyNSBAQAogCXN0cnVjdCBkcm1fd2FpdF92YmxhbmtfcmVwbHkgcmVwbHk7CiB9IGRybV92aWFfaXJxd2FpdF90OwogCi0jaWZkZWYgX19LRVJORUxfXwordHlwZWRlZiBzdHJ1Y3QgZHJtX3ZpYV9ibGl0c3luYyB7CisJdWludDMyX3Qgc3luY19oYW5kbGU7CisJdW5zaWduZWQgZW5naW5lOworfSBkcm1fdmlhX2JsaXRzeW5jX3Q7CiAKLWludCB2aWFfZmJfaW5pdChEUk1fSU9DVExfQVJHUyk7Ci1pbnQgdmlhX21lbV9hbGxvYyhEUk1fSU9DVExfQVJHUyk7Ci1pbnQgdmlhX21lbV9mcmVlKERSTV9JT0NUTF9BUkdTKTsKLWludCB2aWFfYWdwX2luaXQoRFJNX0lPQ1RMX0FSR1MpOwotaW50IHZpYV9tYXBfaW5pdChEUk1fSU9DVExfQVJHUyk7Ci1pbnQgdmlhX2RlY29kZXJfZnV0ZXgoRFJNX0lPQ1RMX0FSR1MpOwotaW50IHZpYV9kbWFfaW5pdChEUk1fSU9DVExfQVJHUyk7Ci1pbnQgdmlhX2NtZGJ1ZmZlcihEUk1fSU9DVExfQVJHUyk7Ci1pbnQgdmlhX2ZsdXNoX2lvY3RsKERSTV9JT0NUTF9BUkdTKTsKLWludCB2aWFfcGNpX2NtZGJ1ZmZlcihEUk1fSU9DVExfQVJHUyk7Ci1pbnQgdmlhX2NtZGJ1Zl9zaXplKERSTV9JT0NUTF9BUkdTKTsKLWludCB2aWFfd2FpdF9pcnEoRFJNX0lPQ1RMX0FSR1MpOwordHlwZWRlZiBzdHJ1Y3QgZHJtX3ZpYV9kbWFibGl0IHsKKwl1aW50MzJfdCBudW1fbGluZXM7CisJdWludDMyX3QgbGluZV9sZW5ndGg7CisJCisJdWludDMyX3QgZmJfYWRkcjsKKwl1aW50MzJfdCBmYl9zdHJpZGU7CiAKLSNlbmRpZgorCXVuc2lnbmVkIGNoYXIgKm1lbV9hZGRyOworCXVpbnQzMl90IG1lbV9zdHJpZGU7CisKKwlpbnQgYm91bmNlX2J1ZmZlcjsKKwlpbnQgdG9fZmI7CisKKwlkcm1fdmlhX2JsaXRzeW5jX3Qgc3luYzsKK30gZHJtX3ZpYV9kbWFibGl0X3Q7CisKICNlbmRpZgkJCQkvKiBfVklBX0RSTV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcnYuYwppbmRleCAwMTY2NjVlLi4zZjAxMjI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcnYuYwpAQCAtMjksNTQgKzI5LDIxIEBACiAKICNpbmNsdWRlICJkcm1fcGNpaWRzLmgiCiAKLXN0YXRpYyBpbnQgcG9zdGluaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyBpbnQgZHJpX2xpYnJhcnlfbmFtZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBjaGFyICpidWYpCiB7Ci0JRFJNX0lORk8oIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzIG9uIG1pbm9yICVkOiAlc1xuIiwKLQkJIERSSVZFUl9OQU1FLAotCQkgRFJJVkVSX01BSk9SLAotCQkgRFJJVkVSX01JTk9SLAotCQkgRFJJVkVSX1BBVENITEVWRUwsCi0JCSBEUklWRVJfREFURSwgZGV2LT5wcmltYXJ5Lm1pbm9yLCBwY2lfcHJldHR5X25hbWUoZGV2LT5wZGV2KQotCSAgICApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZlcnNpb24oZHJtX3ZlcnNpb25fdCAqIHZlcnNpb24pCi17Ci0JaW50IGxlbjsKLQotCXZlcnNpb24tPnZlcnNpb25fbWFqb3IgPSBEUklWRVJfTUFKT1I7Ci0JdmVyc2lvbi0+dmVyc2lvbl9taW5vciA9IERSSVZFUl9NSU5PUjsKLQl2ZXJzaW9uLT52ZXJzaW9uX3BhdGNobGV2ZWwgPSBEUklWRVJfUEFUQ0hMRVZFTDsKLQlEUk1fQ09QWSh2ZXJzaW9uLT5uYW1lLCBEUklWRVJfTkFNRSk7Ci0JRFJNX0NPUFkodmVyc2lvbi0+ZGF0ZSwgRFJJVkVSX0RBVEUpOwotCURSTV9DT1BZKHZlcnNpb24tPmRlc2MsIERSSVZFUl9ERVNDKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJ1bmljaHJvbWUiKTsKIH0KIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0gewogCXZpYWRydl9QQ0lfSURTCiB9OwogCi1zdGF0aWMgZHJtX2lvY3RsX2Rlc2NfdCBpb2N0bHNbXSA9IHsKLQlbRFJNX0lPQ1RMX05SKERSTV9WSUFfQUxMT0NNRU0pXSA9IHt2aWFfbWVtX2FsbG9jLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9WSUFfRlJFRU1FTSldID0ge3ZpYV9tZW1fZnJlZSwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fVklBX0FHUF9JTklUKV0gPSB7dmlhX2FncF9pbml0LCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9WSUFfRkJfSU5JVCldID0ge3ZpYV9mYl9pbml0LCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9WSUFfTUFQX0lOSVQpXSA9IHt2aWFfbWFwX2luaXQsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9ERUNfRlVURVgpXSA9IHt2aWFfZGVjb2Rlcl9mdXRleCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fVklBX0RNQV9JTklUKV0gPSB7dmlhX2RtYV9pbml0LCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9WSUFfQ01EQlVGRkVSKV0gPSB7dmlhX2NtZGJ1ZmZlciwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fVklBX0ZMVVNIKV0gPSB7dmlhX2ZsdXNoX2lvY3RsLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9WSUFfUENJQ01EKV0gPSB7dmlhX3BjaV9jbWRidWZmZXIsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9DTURCVUZfU0laRSldID0ge3ZpYV9jbWRidWZfc2l6ZSwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fVklBX1dBSVRfSVJRKV0gPSB7dmlhX3dhaXRfaXJxLCAxLCAwfQotfTsKLQogc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVyIGRyaXZlciA9IHsKIAkuZHJpdmVyX2ZlYXR1cmVzID0KIAkgICAgRFJJVkVSX1VTRV9BR1AgfCBEUklWRVJfVVNFX01UUlIgfCBEUklWRVJfSEFWRV9JUlEgfAogCSAgICBEUklWRVJfSVJRX1NIQVJFRCB8IERSSVZFUl9JUlFfVkJMLAorCS5sb2FkID0gdmlhX2RyaXZlcl9sb2FkLAorCS51bmxvYWQgPSB2aWFfZHJpdmVyX3VubG9hZCwKIAkuY29udGV4dF9jdG9yID0gdmlhX2luaXRfY29udGV4dCwKIAkuY29udGV4dF9kdG9yID0gdmlhX2ZpbmFsX2NvbnRleHQsCiAJLnZibGFua193YWl0ID0gdmlhX2RyaXZlcl92Ymxhbmtfd2FpdCwKQEAgLTg1LDEzICs1MiwxMSBAQAogCS5pcnFfdW5pbnN0YWxsID0gdmlhX2RyaXZlcl9pcnFfdW5pbnN0YWxsLAogCS5pcnFfaGFuZGxlciA9IHZpYV9kcml2ZXJfaXJxX2hhbmRsZXIsCiAJLmRtYV9xdWllc2NlbnQgPSB2aWFfZHJpdmVyX2RtYV9xdWllc2NlbnQsCisJLmRyaV9saWJyYXJ5X25hbWUgPSBkcmlfbGlicmFyeV9uYW1lLAogCS5yZWNsYWltX2J1ZmZlcnMgPSBkcm1fY29yZV9yZWNsYWltX2J1ZmZlcnMsCiAJLmdldF9tYXBfb2ZzID0gZHJtX2NvcmVfZ2V0X21hcF9vZnMsCiAJLmdldF9yZWdfb2ZzID0gZHJtX2NvcmVfZ2V0X3JlZ19vZnMsCi0JLnBvc3Rpbml0ID0gcG9zdGluaXQsCi0JLnZlcnNpb24gPSB2ZXJzaW9uLAotCS5pb2N0bHMgPSBpb2N0bHMsCi0JLm51bV9pb2N0bHMgPSBEUk1fQVJSQVlfU0laRShpb2N0bHMpLAorCS5pb2N0bHMgPSB2aWFfaW9jdGxzLAogCS5mb3BzID0gewogCQkgLm93bmVyID0gVEhJU19NT0RVTEUsCiAJCSAub3BlbiA9IGRybV9vcGVuLApAQCAtMTAwLDE1ICs2NSwyMyBAQAogCQkgLm1tYXAgPSBkcm1fbW1hcCwKIAkJIC5wb2xsID0gZHJtX3BvbGwsCiAJCSAuZmFzeW5jID0gZHJtX2Zhc3luYywKLQkJIH0sCisJfSwKIAkucGNpX2RyaXZlciA9IHsKLQkJICAgICAgIC5uYW1lID0gRFJJVkVSX05BTUUsCi0JCSAgICAgICAuaWRfdGFibGUgPSBwY2lpZGxpc3QsCi0JCSAgICAgICB9CisJCSAubmFtZSA9IERSSVZFUl9OQU1FLAorCQkgLmlkX3RhYmxlID0gcGNpaWRsaXN0LAorCX0sCisJCisJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkuZGVzYyA9IERSSVZFUl9ERVNDLAorCS5kYXRlID0gRFJJVkVSX0RBVEUsCisJLm1ham9yID0gRFJJVkVSX01BSk9SLAorCS5taW5vciA9IERSSVZFUl9NSU5PUiwKKwkucGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgdmlhX2luaXQodm9pZCkKIHsKKwlkcml2ZXIubnVtX2lvY3RscyA9IHZpYV9tYXhfaW9jdGw7CiAJdmlhX2luaXRfY29tbWFuZF92ZXJpZmllcigpOwogCXJldHVybiBkcm1faW5pdCgmZHJpdmVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHJ2LmgKaW5kZXggN2Q1ZGFmNC4uYWFkNGY5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHJ2LmgKQEAgLTI0LDI0ICsyNCwyNiBAQAogI2lmbmRlZiBfVklBX0RSVl9IXwogI2RlZmluZSBfVklBX0RSVl9IXwogCi0jZGVmaW5lIERSSVZFUl9BVVRIT1IJIlZJQSIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUgkiVmFyaW91cyIKIAogI2RlZmluZSBEUklWRVJfTkFNRQkJInZpYSIKICNkZWZpbmUgRFJJVkVSX0RFU0MJCSJWSUEgVW5pY2hyb21lIC8gUHJvIgotI2RlZmluZSBEUklWRVJfREFURQkJIjIwMDUwNTIzIgorI2RlZmluZSBEUklWRVJfREFURQkJIjIwMDUxMTE2IgogCiAjZGVmaW5lIERSSVZFUl9NQUpPUgkJMgotI2RlZmluZSBEUklWRVJfTUlOT1IJCTYKLSNkZWZpbmUgRFJJVkVSX1BBVENITEVWRUwJMworI2RlZmluZSBEUklWRVJfTUlOT1IJCTcKKyNkZWZpbmUgRFJJVkVSX1BBVENITEVWRUwJNAogCiAjaW5jbHVkZSAidmlhX3ZlcmlmaWVyLmgiCiAKKyNpbmNsdWRlICJ2aWFfZG1hYmxpdC5oIgorCiAjZGVmaW5lIFZJQV9QQ0lfQlVGX1NJWkUgNjAwMDAKICNkZWZpbmUgVklBX0ZJUkVfQlVGX1NJWkUgIDEwMjQKLSNkZWZpbmUgVklBX05VTV9JUlFTIDIKKyNkZWZpbmUgVklBX05VTV9JUlFTIDQKIAogdHlwZWRlZiBzdHJ1Y3QgZHJtX3ZpYV9yaW5nX2J1ZmZlciB7Ci0JZHJtX21hcF90IG1hcDsKKwlkcm1fbG9jYWxfbWFwX3QgbWFwOwogCWNoYXIgKnZpcnR1YWxfc3RhcnQ7CiB9IGRybV92aWFfcmluZ19idWZmZXJfdDsKIApAQCAtNTYsOSArNTgsOSBAQAogCiB0eXBlZGVmIHN0cnVjdCBkcm1fdmlhX3ByaXZhdGUgewogCWRybV92aWFfc2FyZWFfdCAqc2FyZWFfcHJpdjsKLQlkcm1fbWFwX3QgKnNhcmVhOwotCWRybV9tYXBfdCAqZmI7Ci0JZHJtX21hcF90ICptbWlvOworCWRybV9sb2NhbF9tYXBfdCAqc2FyZWE7CisJZHJtX2xvY2FsX21hcF90ICpmYjsKKwlkcm1fbG9jYWxfbWFwX3QgKm1taW87CiAJdW5zaWduZWQgbG9uZyBhZ3BBZGRyOwogCXdhaXRfcXVldWVfaGVhZF90IGRlY29kZXJfcXVldWVbVklBX05SX1hWTUNfTE9DS1NdOwogCWNoYXIgKmRtYV9wdHI7CkBAIC04Miw4ICs4NCwxNSBAQAogCW1hc2thcnJheV90ICppcnFfbWFza3M7CiAJdWludDMyX3QgaXJxX2VuYWJsZV9tYXNrOwogCXVpbnQzMl90IGlycV9wZW5kaW5nX21hc2s7CisJaW50ICppcnFfbWFwOworCWRybV92aWFfYmxpdHFfdCBibGl0X3F1ZXVlc1tWSUFfTlVNX0JMSVRfRU5HSU5FU107CiB9IGRybV92aWFfcHJpdmF0ZV90OwogCitlbnVtIHZpYV9mYW1pbHkgeworCVZJQV9PVEhFUiA9IDAsCisJVklBX1BST19HUk9VUF9BLAorfTsKKwogLyogVklBIE1NSU8gcmVnaXN0ZXIgYWNjZXNzICovCiAjZGVmaW5lIFZJQV9CQVNFICgoZGV2X3ByaXYtPm1taW8pKQogCkBAIC05MiwxMiArMTAxLDMxIEBACiAjZGVmaW5lIFZJQV9SRUFEOChyZWcpCQlEUk1fUkVBRDgoVklBX0JBU0UsIHJlZykKICNkZWZpbmUgVklBX1dSSVRFOChyZWcsdmFsKQlEUk1fV1JJVEU4KFZJQV9CQVNFLCByZWcsIHZhbCkKIAorZXh0ZXJuIGRybV9pb2N0bF9kZXNjX3QgdmlhX2lvY3Rsc1tdOworZXh0ZXJuIGludCB2aWFfbWF4X2lvY3RsOworCitleHRlcm4gaW50IHZpYV9mYl9pbml0KERSTV9JT0NUTF9BUkdTKTsKK2V4dGVybiBpbnQgdmlhX21lbV9hbGxvYyhEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IHZpYV9tZW1fZnJlZShEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IHZpYV9hZ3BfaW5pdChEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IHZpYV9tYXBfaW5pdChEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IHZpYV9kZWNvZGVyX2Z1dGV4KERSTV9JT0NUTF9BUkdTKTsKK2V4dGVybiBpbnQgdmlhX2RtYV9pbml0KERSTV9JT0NUTF9BUkdTKTsKK2V4dGVybiBpbnQgdmlhX2NtZGJ1ZmZlcihEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IHZpYV9mbHVzaF9pb2N0bChEUk1fSU9DVExfQVJHUyk7CitleHRlcm4gaW50IHZpYV9wY2lfY21kYnVmZmVyKERSTV9JT0NUTF9BUkdTKTsKK2V4dGVybiBpbnQgdmlhX2NtZGJ1Zl9zaXplKERSTV9JT0NUTF9BUkdTKTsKK2V4dGVybiBpbnQgdmlhX3dhaXRfaXJxKERSTV9JT0NUTF9BUkdTKTsKK2V4dGVybiBpbnQgdmlhX2RtYV9ibGl0X3N5bmMoIERSTV9JT0NUTF9BUkdTICk7CitleHRlcm4gaW50IHZpYV9kbWFfYmxpdCggRFJNX0lPQ1RMX0FSR1MgKTsKKworZXh0ZXJuIGludCB2aWFfZHJpdmVyX2xvYWQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGxvbmcgY2hpcHNldCk7CitleHRlcm4gaW50IHZpYV9kcml2ZXJfdW5sb2FkKGRybV9kZXZpY2VfdCAqZGV2KTsKKwogZXh0ZXJuIGludCB2aWFfaW5pdF9jb250ZXh0KGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGNvbnRleHQpOwogZXh0ZXJuIGludCB2aWFfZmluYWxfY29udGV4dChkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBjb250ZXh0KTsKIAogZXh0ZXJuIGludCB2aWFfZG9fY2xlYW51cF9tYXAoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiBpbnQgdmlhX21hcF9pbml0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIGludCB2aWFfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CiAKIGV4dGVybiBpcnFyZXR1cm5fdCB2aWFfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUyk7CkBAIC0xMTEsOCArMTM5LDEwIEBACiBleHRlcm4gdm9pZCB2aWFfaW5pdF9mdXRleChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKIGV4dGVybiB2b2lkIHZpYV9jbGVhbnVwX2Z1dGV4KGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYpOwogZXh0ZXJuIHZvaWQgdmlhX3JlbGVhc2VfZnV0ZXgoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdiwgaW50IGNvbnRleHQpOworZXh0ZXJuIGludCB2aWFfZHJpdmVyX2lycV93YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50IGlycSwKKwkJCSAgICAgICBpbnQgZm9yY2Vfc2VxdWVuY2UsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOwogCi1leHRlcm4gaW50IHZpYV9wYXJzZV9jb21tYW5kX3N0cmVhbShkcm1fZGV2aWNlX3QgKiBkZXYsIGNvbnN0IHVpbnQzMl90ICogYnVmLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCB2aWFfZG1hYmxpdF9oYW5kbGVyKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgZW5naW5lLCBpbnQgZnJvbV9pcnEpOworZXh0ZXJuIHZvaWQgdmlhX2luaXRfZG1hYmxpdChkcm1fZGV2aWNlX3QgKmRldik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfZHMuYyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RzLmMKaW5kZXggNWM3MWUwOC4uOTQyOTczNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfZHMuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcy5jCkBAIC0yMiwxNCArMjIsNyBAQAogICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCiAgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlICJkcm1QLmgiCiAKICNpbmNsdWRlICJ2aWFfZHMuaCIKIGV4dGVybiB1bnNpZ25lZCBpbnQgVklBX0RFQlVHOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfaXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9pcnEuYwppbmRleCBkMDIzYWRkLi41NmQ3ZTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9pcnEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9pcnEuYwpAQCAtNTAsNiArNTAsMTUgQEAKICNkZWZpbmUgVklBX0lSUV9IUVYxX0VOQUJMRSAgICAgKDEgPDwgMjUpCiAjZGVmaW5lIFZJQV9JUlFfSFFWMF9QRU5ESU5HICAgICgxIDw8IDkpCiAjZGVmaW5lIFZJQV9JUlFfSFFWMV9QRU5ESU5HICAgICgxIDw8IDEwKQorI2RlZmluZSBWSUFfSVJRX0RNQTBfRERfRU5BQkxFICAoMSA8PCAyMCkKKyNkZWZpbmUgVklBX0lSUV9ETUEwX1REX0VOQUJMRSAgKDEgPDwgMjEpCisjZGVmaW5lIFZJQV9JUlFfRE1BMV9ERF9FTkFCTEUgICgxIDw8IDIyKQorI2RlZmluZSBWSUFfSVJRX0RNQTFfVERfRU5BQkxFICAoMSA8PCAyMykKKyNkZWZpbmUgVklBX0lSUV9ETUEwX0REX1BFTkRJTkcgKDEgPDwgNCkKKyNkZWZpbmUgVklBX0lSUV9ETUEwX1REX1BFTkRJTkcgKDEgPDwgNSkKKyNkZWZpbmUgVklBX0lSUV9ETUExX0REX1BFTkRJTkcgKDEgPDwgNikKKyNkZWZpbmUgVklBX0lSUV9ETUExX1REX1BFTkRJTkcgKDEgPDwgNykKKwogCiAvKgogICogRGV2aWNlLXNwZWNpZmljIElSUXMgZ28gaGVyZS4gVGhpcyB0eXBlIG1pZ2h0IG5lZWQgdG8gYmUgZXh0ZW5kZWQgd2l0aApAQCAtNjEsMTMgKzcwLDI0IEBACiAJe1ZJQV9JUlFfSFFWMF9FTkFCTEUsIFZJQV9JUlFfSFFWMF9QRU5ESU5HLCAweDAwMDAwM0QwLCAweDAwMDA4MDEwLAogCSAweDAwMDAwMDAwfSwKIAl7VklBX0lSUV9IUVYxX0VOQUJMRSwgVklBX0lSUV9IUVYxX1BFTkRJTkcsIDB4MDAwMDEzRDAsIDB4MDAwMDgwMTAsCi0JIDB4MDAwMDAwMDB9CisJIDB4MDAwMDAwMDB9LAorCXtWSUFfSVJRX0RNQTBfVERfRU5BQkxFLCBWSUFfSVJRX0RNQTBfVERfUEVORElORywgVklBX1BDSV9ETUFfQ1NSMCwKKwkgVklBX0RNQV9DU1JfVEEgfCBWSUFfRE1BX0NTUl9URCwgMHgwMDAwMDAwOH0sCisJe1ZJQV9JUlFfRE1BMV9URF9FTkFCTEUsIFZJQV9JUlFfRE1BMV9URF9QRU5ESU5HLCBWSUFfUENJX0RNQV9DU1IxLAorCSBWSUFfRE1BX0NTUl9UQSB8IFZJQV9ETUFfQ1NSX1RELCAweDAwMDAwMDA4fSwKIH07CiBzdGF0aWMgaW50IHZpYV9udW1fcHJvX2dyb3VwX2EgPQogICAgIHNpemVvZih2aWFfcHJvX2dyb3VwX2FfaXJxcykgLyBzaXplb2YobWFza2FycmF5X3QpOworc3RhdGljIGludCB2aWFfaXJxbWFwX3Byb19ncm91cF9hW10gPSB7MCwgMSwgLTEsIDIsIC0xLCAzfTsKIAotc3RhdGljIG1hc2thcnJheV90IHZpYV91bmljaHJvbWVfaXJxc1tdID0geyB9Oworc3RhdGljIG1hc2thcnJheV90IHZpYV91bmljaHJvbWVfaXJxc1tdID0geworCXtWSUFfSVJRX0RNQTBfVERfRU5BQkxFLCBWSUFfSVJRX0RNQTBfVERfUEVORElORywgVklBX1BDSV9ETUFfQ1NSMCwKKwkgVklBX0RNQV9DU1JfVEEgfCBWSUFfRE1BX0NTUl9URCwgMHgwMDAwMDAwOH0sCisJe1ZJQV9JUlFfRE1BMV9URF9FTkFCTEUsIFZJQV9JUlFfRE1BMV9URF9QRU5ESU5HLCBWSUFfUENJX0RNQV9DU1IxLAorCSBWSUFfRE1BX0NTUl9UQSB8IFZJQV9ETUFfQ1NSX1RELCAweDAwMDAwMDA4fQorfTsKIHN0YXRpYyBpbnQgdmlhX251bV91bmljaHJvbWUgPSBzaXplb2YodmlhX3VuaWNocm9tZV9pcnFzKSAvIHNpemVvZihtYXNrYXJyYXlfdCk7CitzdGF0aWMgaW50IHZpYV9pcnFtYXBfdW5pY2hyb21lW10gPSB7LTEsIC0xLCAtMSwgMCwgLTEsIDF9OwogCiBzdGF0aWMgdW5zaWduZWQgdGltZV9kaWZmKHN0cnVjdCB0aW1ldmFsICpub3csIHN0cnVjdCB0aW1ldmFsICp0aGVuKQogewpAQCAtMTEzLDYgKzEzMywxMSBAQAogCQkJYXRvbWljX2luYygmY3VyX2lycS0+aXJxX3JlY2VpdmVkKTsKIAkJCURSTV9XQUtFVVAoJmN1cl9pcnEtPmlycV9xdWV1ZSk7CiAJCQloYW5kbGVkID0gMTsKKwkJCWlmIChkZXZfcHJpdi0+aXJxX21hcFtkcm1fdmlhX2lycV9kbWEwX3RkXSA9PSBpKSB7CisJCQkJdmlhX2RtYWJsaXRfaGFuZGxlcihkZXYsIDAsIDEpOworCQkJfSBlbHNlIGlmIChkZXZfcHJpdi0+aXJxX21hcFtkcm1fdmlhX2lycV9kbWExX3RkXSA9PSBpKSB7CisJCQkJdmlhX2RtYWJsaXRfaGFuZGxlcihkZXYsIDEsIDEpOworCQkJfQogCQl9CiAJCWN1cl9pcnErKzsKIAl9CkBAIC0xNjUsNyArMTkwLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50CitpbnQKIHZpYV9kcml2ZXJfaXJxX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgaXJxLCBpbnQgZm9yY2Vfc2VxdWVuY2UsCiAJCSAgICB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQogewpAQCAtMTc0LDYgKzE5OSw3IEBACiAJZHJtX3ZpYV9pcnFfdCAqY3VyX2lycSA9IGRldl9wcml2LT52aWFfaXJxczsKIAlpbnQgcmV0ID0gMDsKIAltYXNrYXJyYXlfdCAqbWFza3MgPSBkZXZfcHJpdi0+aXJxX21hc2tzOworCWludCByZWFsX2lycTsKIAogCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTE4MiwxNSArMjA4LDIzIEBACiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJfQogCi0JaWYgKGlycSA+PSBkZXZfcHJpdi0+bnVtX2lycXMpIHsKKwlpZiAoaXJxID49IGRybV92aWFfaXJxX251bSkgewogCQlEUk1fRVJST1IoIiVzIFRyeWluZyB0byB3YWl0IG9uIHVua25vd24gaXJxICVkXG4iLCBfX0ZVTkNUSU9OX18sCiAJCQkgIGlycSk7CiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJfQogCi0JY3VyX2lycSArPSBpcnE7CisJcmVhbF9pcnEgPSBkZXZfcHJpdi0+aXJxX21hcFtpcnFdOwogCi0JaWYgKG1hc2tzW2lycV1bMl0gJiYgIWZvcmNlX3NlcXVlbmNlKSB7CisJaWYgKHJlYWxfaXJxIDwgMCkgeworCQlEUk1fRVJST1IoIiVzIFZpZGVvIElSUSAlZCBub3QgYXZhaWxhYmxlIG9uIHRoaXMgaGFyZHdhcmUuXG4iLAorCQkJICBfX0ZVTkNUSU9OX18sIGlycSk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCQorCWN1cl9pcnEgKz0gcmVhbF9pcnE7CisKKwlpZiAobWFza3NbcmVhbF9pcnFdWzJdICYmICFmb3JjZV9zZXF1ZW5jZSkgewogCQlEUk1fV0FJVF9PTihyZXQsIGN1cl9pcnEtPmlycV9xdWV1ZSwgMyAqIERSTV9IWiwKIAkJCSAgICAoKFZJQV9SRUFEKG1hc2tzW2lycV1bMl0pICYgbWFza3NbaXJxXVszXSkgPT0KIAkJCSAgICAgbWFza3NbaXJxXVs0XSkpOwpAQCAtMjI2LDYgKzI2MCw4IEBACiAJCSAgICB2aWFfcHJvX2dyb3VwX2FfaXJxcyA6IHZpYV91bmljaHJvbWVfaXJxczsKIAkJZGV2X3ByaXYtPm51bV9pcnFzID0gKGRldl9wcml2LT5wcm9fZ3JvdXBfYSkgPwogCQkgICAgdmlhX251bV9wcm9fZ3JvdXBfYSA6IHZpYV9udW1fdW5pY2hyb21lOworCQlkZXZfcHJpdi0+aXJxX21hcCA9IChkZXZfcHJpdi0+cHJvX2dyb3VwX2EpID8KKwkJCXZpYV9pcnFtYXBfcHJvX2dyb3VwX2EgOiB2aWFfaXJxbWFwX3VuaWNocm9tZTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPm51bV9pcnFzOyArK2kpIHsKIAkJCWF0b21pY19zZXQoJmN1cl9pcnEtPmlycV9yZWNlaXZlZCwgMCk7CkBAIC0yNDEsNyArMjc3LDcgQEAKIAogCQlkZXZfcHJpdi0+bGFzdF92YmxhbmtfdmFsaWQgPSAwOwogCi0JCS8vIENsZWFyIFZTeW5jIGludGVycnVwdCByZWdzCisJCS8qIENsZWFyIFZTeW5jIGludGVycnVwdCByZWdzICovCiAJCXN0YXR1cyA9IFZJQV9SRUFEKFZJQV9SRUdfSU5URVJSVVBUKTsKIAkJVklBX1dSSVRFKFZJQV9SRUdfSU5URVJSVVBULCBzdGF0dXMgJgogCQkJICB+KGRldl9wcml2LT5pcnFfZW5hYmxlX21hc2spKTsKQEAgLTI5MSw4ICszMjcsNyBAQAogCiBpbnQgdmlhX3dhaXRfaXJxKERSTV9JT0NUTF9BUkdTKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJRFJNX0RFVklDRTsKIAlkcm1fdmlhX2lycXdhaXRfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOwogCWRybV92aWFfaXJxd2FpdF90IGlycXdhaXQ7CiAJc3RydWN0IHRpbWV2YWwgbm93OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfbWFwLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tYXAuYwppbmRleCA2YmQ2YWM1Li5jNmEwOGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tYXAuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tYXAuYwpAQCAtMjcsMTYgKzI3LDEwIEBACiAKIHN0YXRpYyBpbnQgdmlhX2RvX2luaXRfbWFwKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX3ZpYV9pbml0X3QgKiBpbml0KQogewotCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdjsKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCiAJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKIAotCWRldl9wcml2ID0gZHJtX2FsbG9jKHNpemVvZihkcm1fdmlhX3ByaXZhdGVfdCksIERSTV9NRU1fRFJJVkVSKTsKLQlpZiAoZGV2X3ByaXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltZW1zZXQoZGV2X3ByaXYsIDAsIHNpemVvZihkcm1fdmlhX3ByaXZhdGVfdCkpOwotCiAJRFJNX0dFVFNBUkVBKCk7CiAJaWYgKCFkZXZfcHJpdi0+c2FyZWEpIHsKIAkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBzYXJlYSFcbiIpOwpAQCAtNjcsNyArNjEsOCBAQAogCWRldl9wcml2LT5hZ3BBZGRyID0gaW5pdC0+YWdwQWRkcjsKIAogCXZpYV9pbml0X2Z1dGV4KGRldl9wcml2KTsKLQlkZXZfcHJpdi0+cHJvX2dyb3VwX2EgPSAoZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHgzMTE4KTsKKworCXZpYV9pbml0X2RtYWJsaXQoZGV2KTsKIAogCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OwogCXJldHVybiAwOwpAQCAtNzUsMTUgKzcwLDcgQEAKIAogaW50IHZpYV9kb19jbGVhbnVwX21hcChkcm1fZGV2aWNlX3QgKiBkZXYpCiB7Ci0JaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKLQotCQlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCi0JCXZpYV9kbWFfY2xlYW51cChkZXYpOwotCi0JCWRybV9mcmVlKGRldl9wcml2LCBzaXplb2YoZHJtX3ZpYV9wcml2YXRlX3QpLCBEUk1fTUVNX0RSSVZFUik7Ci0JCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOwotCX0KKwl2aWFfZG1hX2NsZWFudXAoZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTA3LDMgKzk0LDI5IEBACiAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KKworaW50IHZpYV9kcml2ZXJfbG9hZChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KQoreworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdjsKKworCWRldl9wcml2ID0gZHJtX2NhbGxvYygxLCBzaXplb2YoZHJtX3ZpYV9wcml2YXRlX3QpLCBEUk1fTUVNX0RSSVZFUik7CisJaWYgKGRldl9wcml2ID09IE5VTEwpCisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisKKwlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKworCWlmIChjaGlwc2V0ID09IFZJQV9QUk9fR1JPVVBfQSkKKwkJZGV2X3ByaXYtPnByb19ncm91cF9hID0gMTsKKworCXJldHVybiAwOworfQorCitpbnQgdmlhX2RyaXZlcl91bmxvYWQoZHJtX2RldmljZV90ICpkZXYpCit7CisJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWRybV9mcmVlKGRldl9wcml2LCBzaXplb2YoZHJtX3ZpYV9wcml2YXRlX3QpLCBEUk1fTUVNX0RSSVZFUik7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfbW0uYyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX21tLmMKaW5kZXggM2JhZGRhYy4uMzNlMGNiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfbW0uYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tbS5jCkBAIC00Miw3ICs0Miw3IEBACiBzdGF0aWMgaW50IHZpYV9mYl9hbGxvYyhkcm1fdmlhX21lbV90ICogbWVtKTsKIHN0YXRpYyBpbnQgdmlhX2ZiX2ZyZWUoZHJtX3ZpYV9tZW1fdCAqIG1lbSk7CiAKLXN0YXRpYyBpbnQgYWRkX2FsbG9jX3NldChpbnQgY29udGV4dCwgaW50IHR5cGUsIHVuc2lnbmVkIGludCB2YWwpCitzdGF0aWMgaW50IGFkZF9hbGxvY19zZXQoaW50IGNvbnRleHQsIGludCB0eXBlLCB1bnNpZ25lZCBsb25nIHZhbCkKIHsKIAlpbnQgaSwgcmV0dmFsID0gMDsKIApAQCAtNTYsNyArNTYsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQgZGVsX2FsbG9jX3NldChpbnQgY29udGV4dCwgaW50IHR5cGUsIHVuc2lnbmVkIGludCB2YWwpCitzdGF0aWMgaW50IGRlbF9hbGxvY19zZXQoaW50IGNvbnRleHQsIGludCB0eXBlLCB1bnNpZ25lZCBsb25nIHZhbCkKIHsKIAlpbnQgaSwgcmV0dmFsID0gMDsKIApAQCAtMTk5LDEzICsxOTksMTMgQEAKIAkJCQkgc2l6ZW9mKG1lbSkpOwogCiAJc3dpdGNoIChtZW0udHlwZSkgewotCWNhc2UgVklERU86CisJY2FzZSBWSUFfTUVNX1ZJREVPOgogCQlpZiAodmlhX2ZiX2FsbG9jKCZtZW0pIDwgMCkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKChkcm1fdmlhX21lbV90IF9fdXNlciAqKSBkYXRhLCBtZW0sCiAJCQkJICAgICAgIHNpemVvZihtZW0pKTsKIAkJcmV0dXJuIDA7Ci0JY2FzZSBBR1A6CisJY2FzZSBWSUFfTUVNX0FHUDoKIAkJaWYgKHZpYV9hZ3BfYWxsb2MoJm1lbSkgPCAwKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoKGRybV92aWFfbWVtX3QgX191c2VyICopIGRhdGEsIG1lbSwKQEAgLTIzMiw3ICsyMzIsNyBAQAogCWlmIChibG9jaykgewogCQlmYi5vZmZzZXQgPSBibG9jay0+b2ZzOwogCQlmYi5mcmVlID0gKHVuc2lnbmVkIGxvbmcpYmxvY2s7Ci0JCWlmICghYWRkX2FsbG9jX3NldChmYi5jb250ZXh0LCBWSURFTywgZmIuZnJlZSkpIHsKKwkJaWYgKCFhZGRfYWxsb2Nfc2V0KGZiLmNvbnRleHQsIFZJQV9NRU1fVklERU8sIGZiLmZyZWUpKSB7CiAJCQlEUk1fREVCVUcoImFkZGluZyB0byBhbGxvY2F0aW9uIHNldCBmYWlsc1xuIik7CiAJCQl2aWFfbW1GcmVlTWVtKChQTWVtQmxvY2spIGZiLmZyZWUpOwogCQkJcmV0dmFsID0gLTE7CkBAIC0yNjksNyArMjY5LDcgQEAKIAlpZiAoYmxvY2spIHsKIAkJYWdwLm9mZnNldCA9IGJsb2NrLT5vZnM7CiAJCWFncC5mcmVlID0gKHVuc2lnbmVkIGxvbmcpYmxvY2s7Ci0JCWlmICghYWRkX2FsbG9jX3NldChhZ3AuY29udGV4dCwgQUdQLCBhZ3AuZnJlZSkpIHsKKwkJaWYgKCFhZGRfYWxsb2Nfc2V0KGFncC5jb250ZXh0LCBWSUFfTUVNX0FHUCwgYWdwLmZyZWUpKSB7CiAJCQlEUk1fREVCVUcoImFkZGluZyB0byBhbGxvY2F0aW9uIHNldCBmYWlsc1xuIik7CiAJCQl2aWFfbW1GcmVlTWVtKChQTWVtQmxvY2spIGFncC5mcmVlKTsKIAkJCXJldHZhbCA9IC0xOwpAQCAtMjk3LDExICsyOTcsMTEgQEAKIAogCXN3aXRjaCAobWVtLnR5cGUpIHsKIAotCWNhc2UgVklERU86CisJY2FzZSBWSUFfTUVNX1ZJREVPOgogCQlpZiAodmlhX2ZiX2ZyZWUoJm1lbSkgPT0gMCkKIAkJCXJldHVybiAwOwogCQlicmVhazsKLQljYXNlIEFHUDoKKwljYXNlIFZJQV9NRU1fQUdQOgogCQlpZiAodmlhX2FncF9mcmVlKCZtZW0pID09IDApCiAJCQlyZXR1cm4gMDsKIAkJYnJlYWs7CkBAIC0zMjksNyArMzI5LDcgQEAKIAogCXZpYV9tbUZyZWVNZW0oKFBNZW1CbG9jaykgZmIuZnJlZSk7CiAKLQlpZiAoIWRlbF9hbGxvY19zZXQoZmIuY29udGV4dCwgVklERU8sIGZiLmZyZWUpKSB7CisJaWYgKCFkZWxfYWxsb2Nfc2V0KGZiLmNvbnRleHQsIFZJQV9NRU1fVklERU8sIGZiLmZyZWUpKSB7CiAJCXJldHZhbCA9IC0xOwogCX0KIApAQCAtMzUyLDcgKzM1Miw3IEBACiAKIAl2aWFfbW1GcmVlTWVtKChQTWVtQmxvY2spIGFncC5mcmVlKTsKIAotCWlmICghZGVsX2FsbG9jX3NldChhZ3AuY29udGV4dCwgQUdQLCBhZ3AuZnJlZSkpIHsKKwlpZiAoIWRlbF9hbGxvY19zZXQoYWdwLmNvbnRleHQsIFZJQV9NRU1fQUdQLCBhZ3AuZnJlZSkpIHsKIAkJcmV0dmFsID0gLTE7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuYwppbmRleCA0YWM0OTVmLi43MGM4OTdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZlcmlmaWVyLmMKQEAgLTIzNyw3ICsyMzcsNyBAQAogc3RhdGljIF9faW5saW5lX18gaW50CiBlYXRfd29yZHMoY29uc3QgdWludDMyX3QgKiogYnVmLCBjb25zdCB1aW50MzJfdCAqIGJ1Zl9lbmQsIHVuc2lnbmVkIG51bV93b3JkcykKIHsKLQlpZiAoKCpidWYgLSBidWZfZW5kKSA+PSBudW1fd29yZHMpIHsKKwlpZiAoKGJ1Zl9lbmQgLSAqYnVmKSA+PSBudW1fd29yZHMpIHsKIAkJKmJ1ZiArPSBudW1fd29yZHM7CiAJCXJldHVybiAwOwogCX0KQEAgLTI0OSwxNCArMjQ5LDE0IEBACiAgKiBQYXJ0aWFsbHkgc3RvbGVuIGZyb20gZHJtX21lbW9yeS5oCiAgKi8KIAotc3RhdGljIF9faW5saW5lX18gZHJtX21hcF90ICp2aWFfZHJtX2xvb2t1cF9hZ3BfbWFwKGRybV92aWFfc3RhdGVfdCAqIHNlcSwKK3N0YXRpYyBfX2lubGluZV9fIGRybV9sb2NhbF9tYXBfdCAqdmlhX2RybV9sb29rdXBfYWdwX21hcChkcm1fdmlhX3N0YXRlX3QgKnNlcSwKIAkJCQkJCSAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKIAkJCQkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkJCQkgICAgZHJtX2RldmljZV90ICogZGV2KQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJZHJtX21hcF9saXN0X3QgKnJfbGlzdDsKLQlkcm1fbWFwX3QgKm1hcCA9IHNlcS0+bWFwX2NhY2hlOworCWRybV9sb2NhbF9tYXBfdCAqbWFwID0gc2VxLT5tYXBfY2FjaGU7CiAKIAlpZiAobWFwICYmIG1hcC0+b2Zmc2V0IDw9IG9mZnNldAogCSAgICAmJiAob2Zmc2V0ICsgc2l6ZSkgPD0gKG1hcC0+b2Zmc2V0ICsgbWFwLT5zaXplKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuaCBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZlcmlmaWVyLmgKaW5kZXggZWI0ZWRhMy4uMjU2NTkwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5oCkBAIC00Nyw3ICs0Nyw3IEBACiAJaW50IGFncF90ZXh0dXJlOwogCWludCBtdWx0aXRleDsKIAlkcm1fZGV2aWNlX3QgKmRldjsKLQlkcm1fbWFwX3QgKm1hcF9jYWNoZTsKKwlkcm1fbG9jYWxfbWFwX3QgKm1hcF9jYWNoZTsKIAl1aW50MzJfdCB2ZXJ0ZXhfY291bnQ7CiAJaW50IGFncDsKIAljb25zdCB1aW50MzJfdCAqYnVmX3N0YXJ0OwpAQCAtNTUsNSArNTUsNyBAQAogCiBleHRlcm4gaW50IHZpYV92ZXJpZnlfY29tbWFuZF9zdHJlYW0oY29uc3QgdWludDMyX3QgKiBidWYsIHVuc2lnbmVkIGludCBzaXplLAogCQkJCSAgICAgZHJtX2RldmljZV90ICogZGV2LCBpbnQgYWdwKTsKK2V4dGVybiBpbnQgdmlhX3BhcnNlX2NvbW1hbmRfc3RyZWFtKGRybV9kZXZpY2VfdCAqZGV2LCBjb25zdCB1aW50MzJfdCAqYnVmLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgc2l6ZSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfdmlkZW8uYyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZpZGVvLmMKaW5kZXggN2ZhYjlmYi4uMzAwYWM2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfdmlkZW8uYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92aWRlby5jCkBAIC01MCw4ICs1MCwxMSBAQAogCXVuc2lnbmVkIGludCBpOwogCXZvbGF0aWxlIGludCAqbG9jazsKIAorCWlmICghZGV2X3ByaXYtPnNhcmVhX3ByaXYpCisJCXJldHVybjsKKwogCWZvciAoaSA9IDA7IGkgPCBWSUFfTlJfWFZNQ19MT0NLUzsgKytpKSB7Ci0JCWxvY2sgPSAoaW50ICopWFZNQ0xPQ0tQVFIoZGV2X3ByaXYtPnNhcmVhX3ByaXYsIGkpOworCQlsb2NrID0gKHZvbGF0aWxlIGludCAqKVhWTUNMT0NLUFRSKGRldl9wcml2LT5zYXJlYV9wcml2LCBpKTsKIAkJaWYgKChfRFJNX0xPQ0tJTkdfQ09OVEVYVCgqbG9jaykgPT0gY29udGV4dCkpIHsKIAkJCWlmIChfRFJNX0xPQ0tfSVNfSEVMRCgqbG9jaykKIAkJCSAgICAmJiAoKmxvY2sgJiBfRFJNX0xPQ0tfQ09OVCkpIHsKQEAgLTc5LDcgKzgyLDcgQEAKIAlpZiAoZngubG9jayA+IFZJQV9OUl9YVk1DX0xPQ0tTKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWxvY2sgPSAoaW50ICopWFZNQ0xPQ0tQVFIoc0FQcml2LCBmeC5sb2NrKTsKKwlsb2NrID0gKHZvbGF0aWxlIGludCAqKVhWTUNMT0NLUFRSKHNBUHJpdiwgZngubG9jayk7CiAKIAlzd2l0Y2ggKGZ4LmZ1bmMpIHsKIAljYXNlIFZJQV9GVVRFWF9XQUlUOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RzcDU2ay5jIGIvZHJpdmVycy9jaGFyL2RzcDU2ay5jCmluZGV4IDg2OTM4MzUuLmUyMzNjZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kc3A1NmsuYworKysgYi9kcml2ZXJzL2NoYXIvZHNwNTZrLmMKQEAgLTE2NSw3ICsxNjUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRzcDU2a191cGxvYWQodV9jaGFyICpiaW4sIGludCBsZW4pCitzdGF0aWMgaW50IGRzcDU2a191cGxvYWQodV9jaGFyIF9fdXNlciAqYmluLCBpbnQgbGVuKQogewogCWludCBpOwogCXVfY2hhciAqcDsKQEAgLTE5OSw3ICsxOTksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3NpemVfdCBkc3A1NmtfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCitzdGF0aWMgc3NpemVfdCBkc3A1NmtfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAogCQkJICAgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKQEAgLTIyNSwxMCArMjI1LDEwIEBACiAJCX0KIAkJY2FzZSAyOiAgLyogMTYgYml0ICovCiAJCXsKLQkJCXNob3J0ICpkYXRhOworCQkJc2hvcnQgX191c2VyICpkYXRhOwogCiAJCQljb3VudCAvPSAyOwotCQkJZGF0YSA9IChzaG9ydCopIGJ1ZjsKKwkJCWRhdGEgPSAoc2hvcnQgX191c2VyICopIGJ1ZjsKIAkJCWhhbmRzaGFrZShjb3VudCwgZHNwNTZrLm1heGlvLCBkc3A1NmsudGltZW91dCwgRFNQNTZLX1JFQ0VJVkUsCiAJCQkJICBwdXRfdXNlcihkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS53WzFdLCBkYXRhK24rKykpOwogCQkJcmV0dXJuIDIqbjsKQEAgLTI0NCwxMCArMjQ0LDEwIEBACiAJCX0KIAkJY2FzZSA0OiAgLyogMzIgYml0ICovCiAJCXsKLQkJCWxvbmcgKmRhdGE7CisJCQlsb25nIF9fdXNlciAqZGF0YTsKIAogCQkJY291bnQgLz0gNDsKLQkJCWRhdGEgPSAobG9uZyopIGJ1ZjsKKwkJCWRhdGEgPSAobG9uZyBfX3VzZXIgKikgYnVmOwogCQkJaGFuZHNoYWtlKGNvdW50LCBkc3A1NmsubWF4aW8sIGRzcDU2ay50aW1lb3V0LCBEU1A1NktfUkVDRUlWRSwKIAkJCQkgIHB1dF91c2VyKGRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmwsIGRhdGErbisrKSk7CiAJCQlyZXR1cm4gNCpuOwpAQCAtMjYyLDcgKzI2Miw3IEBACiAJfQogfQogCi1zdGF0aWMgc3NpemVfdCBkc3A1Nmtfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorc3RhdGljIHNzaXplX3QgZHNwNTZrX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCiAJCQkgICAgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKQEAgLTI4NywxMCArMjg3LDEwIEBACiAJCX0KIAkJY2FzZSAyOiAgLyogMTYgYml0ICovCiAJCXsKLQkJCWNvbnN0IHNob3J0ICpkYXRhOworCQkJY29uc3Qgc2hvcnQgX191c2VyICpkYXRhOwogCiAJCQljb3VudCAvPSAyOwotCQkJZGF0YSA9IChjb25zdCBzaG9ydCAqKWJ1ZjsKKwkJCWRhdGEgPSAoY29uc3Qgc2hvcnQgX191c2VyICopYnVmOwogCQkJaGFuZHNoYWtlKGNvdW50LCBkc3A1NmsubWF4aW8sIGRzcDU2ay50aW1lb3V0LCBEU1A1NktfVFJBTlNNSVQsCiAJCQkJICBnZXRfdXNlcihkc3A1NmtfaG9zdF9pbnRlcmZhY2UuZGF0YS53WzFdLCBkYXRhK24rKykpOwogCQkJcmV0dXJuIDIqbjsKQEAgLTMwNiwxMCArMzA2LDEwIEBACiAJCX0KIAkJY2FzZSA0OiAgLyogMzIgYml0ICovCiAJCXsKLQkJCWNvbnN0IGxvbmcgKmRhdGE7CisJCQljb25zdCBsb25nIF9fdXNlciAqZGF0YTsKIAogCQkJY291bnQgLz0gNDsKLQkJCWRhdGEgPSAoY29uc3QgbG9uZyAqKWJ1ZjsKKwkJCWRhdGEgPSAoY29uc3QgbG9uZyBfX3VzZXIgKilidWY7CiAJCQloYW5kc2hha2UoY291bnQsIGRzcDU2ay5tYXhpbywgZHNwNTZrLnRpbWVvdXQsIERTUDU2S19UUkFOU01JVCwKIAkJCQkgIGdldF91c2VyKGRzcDU2a19ob3N0X2ludGVyZmFjZS5kYXRhLmwsIGRhdGErbisrKSk7CiAJCQlyZXR1cm4gNCpuOwpAQCAtMzI4LDYgKzMyOCw3IEBACiAJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlpbnQgZGV2ID0gaW1pbm9yKGlub2RlKSAmIDB4MGY7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAKIAlzd2l0Y2goZGV2KQogCXsKQEAgLTMzNiw5ICszMzcsOSBAQAogCQlzd2l0Y2goY21kKSB7CiAJCWNhc2UgRFNQNTZLX1VQTE9BRDoKIAkJewotCQkJY2hhciAqYmluOworCQkJY2hhciBfX3VzZXIgKmJpbjsKIAkJCWludCByLCBsZW47Ci0JCQlzdHJ1Y3QgZHNwNTZrX3VwbG9hZCAqYmluYXJ5ID0gKHN0cnVjdCBkc3A1NmtfdXBsb2FkICopIGFyZzsKKwkJCXN0cnVjdCBkc3A1NmtfdXBsb2FkIF9fdXNlciAqYmluYXJ5ID0gYXJncDsKICAgICAKIAkJCWlmKGdldF91c2VyKGxlbiwgJmJpbmFyeS0+bGVuKSA8IDApCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0zNzIsNyArMzczLDcgQEAKIAkJY2FzZSBEU1A1NktfSE9TVF9GTEFHUzoKIAkJewogCQkJaW50IGRpciwgb3V0LCBzdGF0dXM7Ci0JCQlzdHJ1Y3QgZHNwNTZrX2hvc3RfZmxhZ3MgKmhmID0gKHN0cnVjdCBkc3A1NmtfaG9zdF9mbGFncyopIGFyZzsKKwkJCXN0cnVjdCBkc3A1NmtfaG9zdF9mbGFncyBfX3VzZXIgKmhmID0gYXJncDsKICAgICAKIAkJCWlmKGdldF91c2VyKGRpciwgJmhmLT5kaXIpIDwgMCkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9lcGNhLmMgYi9kcml2ZXJzL2NoYXIvZXBjYS5jCmluZGV4IDQwNzcwOGEuLjc2NWM1YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9lcGNhLmMKKysrIGIvZHJpdmVycy9jaGFyL2VwY2EuYwpAQCAtMTc4Niw5ICsxNzg2LDcgQEAKIAkJaWYgKHR0eSkgIHsgLyogQmVnaW4gaWYgdmFsaWQgdHR5ICovCiAJCQlpZiAoZXZlbnQgJiBCUkVBS19JTkQpICB7IC8qIEJlZ2luIGlmIEJSRUFLX0lORCAqLwogCQkJCS8qIEEgYnJlYWsgaGFzIGJlZW4gaW5kaWNhdGVkICovCi0JCQkJdHR5LT5mbGlwLmNvdW50Kys7Ci0JCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9CUkVBSzsKLQkJCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gMDsKKwkJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9CUkVBSyk7CiAJCQkJdHR5X3NjaGVkdWxlX2ZsaXAodHR5KTsgCiAJCQl9IGVsc2UgaWYgKGV2ZW50ICYgTE9XVFhfSU5EKSAgeyAvKiBCZWdpbiBMT1dUWF9JTkQgKi8KIAkJCQlpZiAoY2gtPnN0YXR1c2ZsYWdzICYgTE9XV0FJVCkgCkBAIC0yMTI0LDcgKzIxMjIsNiBAQAogCWludCBkYXRhVG9SZWFkLCB3cmFwZ2FwLCBieXRlc0F2YWlsYWJsZTsKIAl1bnNpZ25lZCBpbnQgdGFpbCwgaGVhZDsKIAl1bnNpZ25lZCBpbnQgd3JhcG1hc2s7Ci0JaW50IHJjOwogCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgZG9pbnQgd2hlbiBhIHJlY2VpdmUgZGF0YSBldmVudCAKQEAgLTIxNjIsMTYgKzIxNTksMTUgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmICh0dHktPmZsaXAuY291bnQgPT0gVFRZX0ZMSVBCVUZfU0laRSkgCisJaWYgKHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgYnl0ZXNBdmFpbGFibGUgKyAxKSA9PSAwKQogCQlyZXR1cm47CiAKIAlpZiAocmVhZGIoJmJjLT5vcnVuKSkgewogCQl3cml0ZWIoMCwgJmJjLT5vcnVuKTsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiZXBjYTsgb3ZlcnJ1biEgRGlnaUJvYXJkIGRldmljZSAlc1xuIix0dHktPm5hbWUpOworCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9PVkVSUlVOKTsKIAl9CiAJcnh3aW5vbihjaCk7Ci0JcnB0ciA9IHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHI7Ci0JcmMgPSB0dHktPmZsaXAuY291bnQ7CiAJd2hpbGUgKGJ5dGVzQXZhaWxhYmxlID4gMCkgIHsgLyogQmVnaW4gd2hpbGUgdGhlcmUgaXMgZGF0YSBvbiB0aGUgY2FyZCAqLwogCQl3cmFwZ2FwID0gKGhlYWQgPj0gdGFpbCkgPyBoZWFkIC0gdGFpbCA6IGNoLT5yeGJ1ZnNpemUgLSB0YWlsOwogCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTIxODMsOCArMjE3OSw3IEBACiAJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCSAgIE1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVyZmxvdyB0aGUgYnVmZmVyCiAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0JCWlmICgocmMgKyBkYXRhVG9SZWFkKSA+IFRUWV9GTElQQlVGX1NJWkUpCi0JCQlkYXRhVG9SZWFkID0gVFRZX0ZMSVBCVUZfU0laRSAtIHJjOworCQlkYXRhVG9SZWFkID0gdHR5X3ByZXBhcmVfZmxpcF9zdHJpbmcodHR5LCAmcnB0ciwgZGF0YVRvUmVhZCk7CiAJCWlmIChkYXRhVG9SZWFkID09IDApCiAJCQlicmVhazsKIAkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yMTkyLDEzICsyMTg3LDkgQEAKIAkJCWZvciB0cmFuc2xhdGlvbiBpZiBuZWNlc3NhcnkuCiAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCQltZW1jcHlfZnJvbWlvKHJwdHIsIGNoLT5yeHB0ciArIHRhaWwsIGRhdGFUb1JlYWQpOwotCQlyYyAgICs9IGRhdGFUb1JlYWQ7Ci0JCXJwdHIgKz0gZGF0YVRvUmVhZDsKIAkJdGFpbCA9ICh0YWlsICsgZGF0YVRvUmVhZCkgJiB3cmFwbWFzazsKIAkJYnl0ZXNBdmFpbGFibGUgLT0gZGF0YVRvUmVhZDsKIAl9IC8qIEVuZCB3aGlsZSB0aGVyZSBpcyBkYXRhIG9uIHRoZSBjYXJkICovCi0JdHR5LT5mbGlwLmNvdW50ID0gcmM7Ci0JdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciA9IHJwdHI7CiAJZ2xvYmFsd2lub24oY2gpOwogCXdyaXRldyh0YWlsLCAmYmMtPnJvdXQpOwogCS8qIE11c3QgYmUgY2FsbGVkIHdpdGggZ2xvYmFsIGRhdGEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9lc3AuYyBiL2RyaXZlcnMvY2hhci9lc3AuYwppbmRleCA5ZjUzZDJmYy4uM2YzYWMwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2VzcC5jCisrKyBiL2RyaXZlcnMvY2hhci9lc3AuYwpAQCAtMTYwLDcgKzE2MCw2IEBACiAgKiBtZW1vcnkgaWYgbGFyZ2UgbnVtYmVycyBvZiBzZXJpYWwgcG9ydHMgYXJlIG9wZW4uCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBjaGFyICp0bXBfYnVmOwotc3RhdGljIERFQ0xBUkVfTVVURVgodG1wX2J1Zl9zZW0pOwogCiBzdGF0aWMgaW5saW5lIGludCBzZXJpYWxfcGFyYW5vaWFfY2hlY2soc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8sCiAJCQkJCWNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnJvdXRpbmUpCkBAIC0zNDUsMjYgKzM0NCwyMiBAQAogCiAJZm9yIChpID0gMDsgaSA8IG51bV9ieXRlczsgaSsrKSB7CiAJCWlmICghKGVycl9idWYtPmRhdGFbaV0gJiBzdGF0dXNfbWFzaykpIHsKLQkJCSoodHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrKSA9IHBpb19idWYtPmRhdGFbaV07CisJCQlpbnQgZmxhZyA9IDA7CiAKIAkJCWlmIChlcnJfYnVmLT5kYXRhW2ldICYgMHgwNCkgewotCQkJCSoodHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrKSA9IFRUWV9CUkVBSzsKLQorCQkJCWZsYWcgPSBUVFlfQlJFQUs7CiAJCQkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfU0FLKQogCQkJCQlkb19TQUsodHR5KTsKIAkJCX0KIAkJCWVsc2UgaWYgKGVycl9idWYtPmRhdGFbaV0gJiAweDAyKQotCQkJCSoodHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrKSA9IFRUWV9GUkFNRTsKKwkJCQlmbGFnID0gVFRZX0ZSQU1FOwogCQkJZWxzZSBpZiAoZXJyX2J1Zi0+ZGF0YVtpXSAmIDB4MDEpCi0JCQkJKih0dHktPmZsaXAuZmxhZ19idWZfcHRyKyspID0gVFRZX1BBUklUWTsKLQkJCWVsc2UKLQkJCQkqKHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKykgPSAwOwotCQkKLQkJCXR0eS0+ZmxpcC5jb3VudCsrOworCQkJCWZsYWcgPSBUVFlfUEFSSVRZOworCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBwaW9fYnVmLT5kYXRhW2ldLCBmbGFnKTsKIAkJfQogCX0KIAotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmssIDEpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5idWYud29yaywgMSk7CiAKIAlpbmZvLT5zdGF0X2ZsYWdzICY9IH5FU1BfU1RBVF9SWF9USU1FT1VUOwogCXJlbGVhc2VfcGlvX2J1ZmZlcihwaW9fYnVmKTsKQEAgLTM5Nyw3ICszOTIsNiBAQAogCWludCBudW1fYnl0ZXM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkKLQkKIAlmbGFncz1jbGFpbV9kbWFfbG9jaygpOwogCWRpc2FibGVfZG1hKGRtYSk7CiAJY2xlYXJfZG1hX2ZmKGRtYSk7CkBAIC00MDgsMzggKzQwMiwzMSBAQAogCQogCWluZm8tPmljb3VudC5yeCArPSBudW1fYnl0ZXM7CiAKLQltZW1jcHkodHR5LT5mbGlwLmNoYXJfYnVmX3B0ciwgZG1hX2J1ZmZlciwgbnVtX2J5dGVzKTsKLQl0dHktPmZsaXAuY2hhcl9idWZfcHRyICs9IG51bV9ieXRlczsKLQl0dHktPmZsaXAuY291bnQgKz0gbnVtX2J5dGVzOwotCW1lbXNldCh0dHktPmZsaXAuZmxhZ19idWZfcHRyLCAwLCBudW1fYnl0ZXMpOwotCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgKz0gbnVtX2J5dGVzOwotCiAJaWYgKG51bV9ieXRlcyA+IDApIHsKLQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ci0tOworCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwgZG1hX2J1ZmZlciwgbnVtX2J5dGVzIC0gMSk7CiAKIAkJc3RhdHVzICY9ICgweDFjICYgaW5mby0+cmVhZF9zdGF0dXNfbWFzayk7Ci0KLQkJaWYgKHN0YXR1cyAmIGluZm8tPmlnbm9yZV9zdGF0dXNfbWFzaykgewotCQkJdHR5LT5mbGlwLmNvdW50LS07Ci0JCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyLS07Ci0JCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyLS07Ci0JCX0gZWxzZSBpZiAoc3RhdHVzICYgMHgxMCkgewotCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfQlJFQUs7Ci0JCQkoaW5mby0+aWNvdW50LmJyaykrKzsKLQkJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX1NBSykKLQkJCQlkb19TQUsodHR5KTsKLQkJfSBlbHNlIGlmIChzdGF0dXMgJiAweDA4KSB7Ci0JCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9GUkFNRTsKLQkJCShpbmZvLT5pY291bnQuZnJhbWUpKys7Ci0JCX0KLQkJZWxzZSBpZiAoc3RhdHVzICYgMHgwNCkgewotCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfUEFSSVRZOwotCQkJKGluZm8tPmljb3VudC5wYXJpdHkpKys7Ci0JCX0KLQotCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyKys7CiAJCQotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+ZmxpcC53b3JrLCAxKTsKKwkJLyogSXMgdGhlIHN0YXR1cyBzaWduaWZpY2FudCBvciBkbyB3ZSB0aHJvdyB0aGUgbGFzdCBieXRlID8gKi8KKwkJaWYgKCEoc3RhdHVzICYgaW5mby0+aWdub3JlX3N0YXR1c19tYXNrKSkgeworCQkJaW50IHN0YXRmbGFnID0gMDsKKworCQkJaWYgKHN0YXR1cyAmIDB4MTApIHsKKwkJCQlzdGF0ZmxhZyA9IFRUWV9CUkVBSzsKKwkJCQkoaW5mby0+aWNvdW50LmJyaykrKzsKKwkJCQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TQUspCisJCQkJCWRvX1NBSyh0dHkpOworCQkJfSBlbHNlIGlmIChzdGF0dXMgJiAweDA4KSB7CisJCQkJc3RhdGZsYWcgPSBUVFlfRlJBTUU7CisJCQkJKGluZm8tPmljb3VudC5mcmFtZSkrKzsKKwkJCX0KKwkJCWVsc2UgaWYgKHN0YXR1cyAmIDB4MDQpIHsKKwkJCQlzdGF0ZmxhZyA9IFRUWV9QQVJJVFk7CisJCQkJKGluZm8tPmljb3VudC5wYXJpdHkpKys7CisJCQl9CisJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGRtYV9idWZmZXJbbnVtX2J5dGVzIC0gMV0sIHN0YXRmbGFnKTsKKwkJfQorCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+YnVmLndvcmssIDEpOwogCX0KIAogCWlmIChkbWFfYnl0ZXMgIT0gbnVtX2J5dGVzKSB7CkBAIC02OTMsOCArNjgwLDcgQEAKIAkJbnVtX2J5dGVzID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQxKSA8PCA4OwogCQludW1fYnl0ZXMgfD0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQyKTsKIAotCQlpZiAobnVtX2J5dGVzID4gKFRUWV9GTElQQlVGX1NJWkUgLSBpbmZvLT50dHktPmZsaXAuY291bnQpKQotCQkgIG51bV9ieXRlcyA9IFRUWV9GTElQQlVGX1NJWkUgLSBpbmZvLT50dHktPmZsaXAuY291bnQ7CisJCW51bV9ieXRlcyA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKGluZm8tPnR0eSwgbnVtX2J5dGVzKTsKIAogCQlpZiAobnVtX2J5dGVzKSB7CiAJCQlpZiAoZG1hX2J5dGVzIHx8CkBAIC0yNTA2LDYgKzI0OTIsNyBAQAogCX0KIAogCW1lbXNldCgodm9pZCAqKWluZm8sIDAsIHNpemVvZihzdHJ1Y3QgZXNwX3N0cnVjdCkpOworCXNwaW5fbG9ja19pbml0KCZpbmZvLT5sb2NrKTsKIAkvKiByeF90cmlnZ2VyLCB0eF90cmlnZ2VyIGFyZSBuZWVkZWQgYnkgYXV0b2NvbmZpZyAqLwogCWluZm8tPmNvbmZpZy5yeF90cmlnZ2VyID0gcnhfdHJpZ2dlcjsKIAlpbmZvLT5jb25maWcudHhfdHJpZ2dlciA9IHR4X3RyaWdnZXI7CkBAIC0yNTQyLDcgKzI1MjksNiBAQAogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5jbG9zZV93YWl0KTsKIAkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+ZGVsdGFfbXNyX3dhaXQpOwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5icmVha193YWl0KTsKLQkJc3Bpbl9sb2NrX2luaXQoJmluZm8tPmxvY2spOwogCQlwb3J0cyA9IGluZm87CiAJCXByaW50ayhLRVJOX0lORk8gInR0eVAlZCBhdCAweCUwNHggKGlycSA9ICVkKSBpcyBhbiBFU1AgIiwKIAkJCWluZm8tPmxpbmUsIGluZm8tPnBvcnQsIGluZm8tPmlycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9mdGFwZS9LY29uZmlnCmluZGV4IDdkM2VjYjUuLjBkNjUxODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci9mdGFwZS9LY29uZmlnCkBAIC0yNSwxNyArMjUsNyBAQAogCSAgc3VwcG9ydCIsIGFib3ZlKSB0aGVuIGB6ZnQtY29tcHJlc3Nvcicgd2lsbCBiZSBsb2FkZWQKIAkgIGF1dG9tYXRpY2FsbHkgYnkgemZ0YXBlIHdoZW4gbmVlZGVkLgogCi0JICBEZXNwaXRlIGl0cyBuYW1lLCB6ZnRhcGUgZG9lcyBOT1QgdXNlIGNvbXByZXNzaW9uIGJ5IGRlZmF1bHQuICBUaGUKLQkgIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9mdGFwZS50eHQ+IGNvbnRhaW5zIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YKLQkgIHRoZSBtb3N0IGltcG9ydGFudCBjaGFuZ2VzIGluIHRoZSBmaWxlIHN5c3RlbSBpbnRlcmZhY2UgY29tcGFyZWQgdG8KLQkgIHByZXZpb3VzIHZlcnNpb25zIG9mIGZ0YXBlLiAgVGhlIGZ0YXBlIGhvbWUgcGFnZQotCSAgPGh0dHA6Ly93d3cuaW5zdG1hdGgucnd0aC1hYWNoZW4uZGUvfmhlaW5lL2Z0YXBlLz4gY29udGFpbnMKLQkgIGZ1cnRoZXIgaW5mb3JtYXRpb24uCi0KLQkgIElNUE9SVEFOVCBOT1RFOiB6ZnRhcGUgY2FuIHJlYWQgYXJjaGl2ZXMgY3JlYXRlZCBieSBwcmV2aW91cwotCSAgdmVyc2lvbnMgb2YgZnRhcGUgYW5kIHByb3ZpZGUgZmlsZSBtYXJrIHN1cHBvcnQgKGkuZS4gZmFzdCBza2lwcGluZwotCSAgYmV0d2VlbiB0YXBlIGFyY2hpdmVzKSBidXQgcHJldmlvdXMgdmVyc2lvbiBvZiBmdGFwZSB3aWxsIGxhY2sgZmlsZQotCSAgbWFyayBzdXBwb3J0IHdoZW4gcmVhZGluZyBhcmNoaXZlcyBwcm9kdWNlZCBieSB6ZnRhcGUuCisJICBEZXNwaXRlIGl0cyBuYW1lLCB6ZnRhcGUgZG9lcyBOT1QgdXNlIGNvbXByZXNzaW9uIGJ5IGRlZmF1bHQuCiAKIGNvbmZpZyBaRlRfREZMVF9CTEtfU1oKIAlpbnQgIkRlZmF1bHQgYmxvY2sgc2l6ZSIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9nZW5lcmljX3NlcmlhbC5jIGIvZHJpdmVycy9jaGFyL2dlbmVyaWNfc2VyaWFsLmMKaW5kZXggMjA0YTczMC4uZTM4YTVmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2dlbmVyaWNfc2VyaWFsLmMKKysrIGIvZHJpdmVycy9jaGFyL2dlbmVyaWNfc2VyaWFsLmMKQEAgLTM0LDcgKzM0LDYgQEAKICNkZWZpbmUgREVCVUcgCiAKIHN0YXRpYyBjaGFyICogICAgICAgICAgICAgICAgICB0bXBfYnVmOyAKLXN0YXRpYyBERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKIAogc3RhdGljIGludCBnc19kZWJ1ZzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2hwZXQuYyBiL2RyaXZlcnMvY2hhci9ocGV0LmMKaW5kZXggMzgwOGQ5NS4uNjZhMmZlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2hwZXQuYworKysgYi9kcml2ZXJzL2NoYXIvaHBldC5jCkBAIC05MjcsOSArOTI3LDkgQEAKIAlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJdW5zaWduZWQgbG9uZyBzaXplOwogCi0JCXNpemUgPSBhZGRyLm1heF9hZGRyZXNzX3JhbmdlIC0gYWRkci5taW5fYWRkcmVzc19yYW5nZSArIDE7Ci0JCWhkcC0+aGRfcGh5c19hZGRyZXNzID0gYWRkci5taW5fYWRkcmVzc19yYW5nZTsKLQkJaGRwLT5oZF9hZGRyZXNzID0gaW9yZW1hcChhZGRyLm1pbl9hZGRyZXNzX3JhbmdlLCBzaXplKTsKKwkJc2l6ZSA9IGFkZHIubWF4aW11bSAtIGFkZHIubWluaW11bSArIDE7CisJCWhkcC0+aGRfcGh5c19hZGRyZXNzID0gYWRkci5taW5pbXVtOworCQloZHAtPmhkX2FkZHJlc3MgPSBpb3JlbWFwKGFkZHIubWluaW11bSwgc2l6ZSk7CiAKIAkJaWYgKGhwZXRfaXNfa25vd24oaGRwKSkgewogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAweCVseCBpcyBidXN5XG4iLApAQCAtOTM3LDE1ICs5MzcsMTUgQEAKIAkJCWlvdW5tYXAoaGRwLT5oZF9hZGRyZXNzKTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KLQl9IGVsc2UgaWYgKHJlcy0+aWQgPT0gQUNQSV9SU1RZUEVfRklYRURfTUVNMzIpIHsKLQkJc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtMzIgKmZpeG1lbTMyOworCX0gZWxzZSBpZiAocmVzLT50eXBlID09IEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9NRU1PUlkzMikgeworCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW1vcnkzMiAqZml4bWVtMzI7CiAKIAkJZml4bWVtMzIgPSAmcmVzLT5kYXRhLmZpeGVkX21lbW9yeTMyOwogCQlpZiAoIWZpeG1lbTMyKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJaGRwLT5oZF9waHlzX2FkZHJlc3MgPSBmaXhtZW0zMi0+cmFuZ2VfYmFzZV9hZGRyZXNzOwotCQloZHAtPmhkX2FkZHJlc3MgPSBpb3JlbWFwKGZpeG1lbTMyLT5yYW5nZV9iYXNlX2FkZHJlc3MsCisJCWhkcC0+aGRfcGh5c19hZGRyZXNzID0gZml4bWVtMzItPmFkZHJlc3M7CisJCWhkcC0+aGRfYWRkcmVzcyA9IGlvcmVtYXAoZml4bWVtMzItPmFkZHJlc3MsCiAJCQkJCQlIUEVUX1JBTkdFX1NJWkUpOwogCiAJCWlmIChocGV0X2lzX2tub3duKGhkcCkpIHsKQEAgLTk1NCwyMCArOTU0LDIwIEBACiAJCQlpb3VubWFwKGhkcC0+aGRfYWRkcmVzcyk7CiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9Ci0JfSBlbHNlIGlmIChyZXMtPmlkID09IEFDUElfUlNUWVBFX0VYVF9JUlEpIHsKLQkJc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0X2lycSAqaXJxcDsKKwl9IGVsc2UgaWYgKHJlcy0+dHlwZSA9PSBBQ1BJX1JFU09VUkNFX1RZUEVfRVhURU5ERURfSVJRKSB7CisJCXN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dGVuZGVkX2lycSAqaXJxcDsKIAkJaW50IGk7CiAKIAkJaXJxcCA9ICZyZXMtPmRhdGEuZXh0ZW5kZWRfaXJxOwogCi0JCWlmIChpcnFwLT5udW1iZXJfb2ZfaW50ZXJydXB0cyA+IDApIHsKLQkJCWhkcC0+aGRfbmlycXMgPSBpcnFwLT5udW1iZXJfb2ZfaW50ZXJydXB0czsKKwkJaWYgKGlycXAtPmludGVycnVwdF9jb3VudCA+IDApIHsKKwkJCWhkcC0+aGRfbmlycXMgPSBpcnFwLT5pbnRlcnJ1cHRfY291bnQ7CiAKIAkJCWZvciAoaSA9IDA7IGkgPCBoZHAtPmhkX25pcnFzOyBpKyspIHsKIAkJCQlpbnQgcmMgPQogCQkJCSAgICBhY3BpX3JlZ2lzdGVyX2dzaShpcnFwLT5pbnRlcnJ1cHRzW2ldLAotCQkJCQkJICAgICAgaXJxcC0+ZWRnZV9sZXZlbCwKLQkJCQkJCSAgICAgIGlycXAtPmFjdGl2ZV9oaWdoX2xvdyk7CisJCQkJCQkgICAgICBpcnFwLT50cmlnZ2VyaW5nLAorCQkJCQkJICAgICAgaXJxcC0+cG9sYXJpdHkpOwogCQkJCWlmIChyYyA8IDApCiAJCQkJCXJldHVybiBBRV9FUlJPUjsKIAkJCQloZHAtPmhkX2lycVtpXSA9IHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMgYi9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYwppbmRleCBmOTIxNzc2Li4xOTk0YTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYworKysgYi9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYwpAQCAtNTk3LDkgKzU5Nyw3IEBACiAKIAkvKiBSZWFkIGRhdGEgaWYgYW55ICovCiAJZm9yICg7OykgewotCQlpbnQgY291bnQgPSBOX0lOQlVGOwotCQlpZiAoY291bnQgPiAoVFRZX0ZMSVBCVUZfU0laRSAtIHR0eS0+ZmxpcC5jb3VudCkpCi0JCQljb3VudCA9IFRUWV9GTElQQlVGX1NJWkUgLSB0dHktPmZsaXAuY291bnQ7CisJCWludCBjb3VudCA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgTl9JTkJVRik7CiAKIAkJLyogSWYgZmxpcCBpcyBmdWxsLCBqdXN0IHJlc2NoZWR1bGUgYSBsYXRlciByZWFkICovCiAJCWlmIChjb3VudCA9PSAwKSB7CkBAIC02MzUsNyArNjMzLDcgQEAKIAkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgYnVmW2ldLCAwKTsKIAkJfQogCi0JCWlmICh0dHktPmZsaXAuY291bnQpCisJCWlmIChjb3VudCkKIAkJCXR0eV9zY2hlZHVsZV9mbGlwKHR0eSk7CiAKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odmNzLmMgYi9kcml2ZXJzL2NoYXIvaHZjcy5jCmluZGV4IDUzZGM3N2MuLjgzMWViNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9odmNzLmMKKysrIGIvZHJpdmVycy9jaGFyL2h2Y3MuYwpAQCAtNDU2LDEyICs0NTYsMTEgQEAKIAkvKiByZW1vdmUgdGhlIHJlYWQgbWFza3MgKi8KIAlodmNzZC0+dG9kb19tYXNrICY9IH4oSFZDU19SRUFEX01BU0spOwogCi0JaWYgKCh0dHktPmZsaXAuY291bnQgKyBIVkNTX0JVRkZfTEVOKSA8IFRUWV9GTElQQlVGX1NJWkUpIHsKKwlpZiAodHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBIVkNTX0JVRkZfTEVOKSA+PSBIVkNTX0JVRkZfTEVOKSB7CiAJCWdvdCA9IGh2Y19nZXRfY2hhcnModW5pdF9hZGRyZXNzLAogCQkJCSZidWZbMF0sCiAJCQkJSFZDU19CVUZGX0xFTik7Ci0JCWZvciAoaT0wO2dvdCAmJiBpPGdvdDtpKyspCi0JCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGJ1ZltpXSwgVFRZX05PUk1BTCk7CisJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBidWYsIGdvdCk7CiAJfQogCiAJLyogR2l2ZSB0aGUgVFRZIHRpbWUgdG8gcHJvY2VzcyB0aGUgZGF0YSB3ZSBqdXN0IHNlbnQuICovCkBAIC00NjksMTAgKzQ2OCw5IEBACiAJCWh2Y3NkLT50b2RvX21hc2sgfD0gSFZDU19RVUlDS19SRUFEOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKLQlpZiAodHR5LT5mbGlwLmNvdW50KSB7Ci0JCS8qIFRoaXMgaXMgc3luY2ggYmVjYXVzZSB0dHktPmxvd19sYXRlbmN5ID09IDEgKi8KKwkvKiBUaGlzIGlzIHN5bmNoIGJlY2F1c2UgdHR5LT5sb3dfbGF0ZW5jeSA9PSAxICovCisJaWYoZ290KQogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCX0KIAogCWlmICghZ290KSB7CiAJCS8qIERvIHRoaXMgX2FmdGVyXyB0aGUgZmxpcF9idWZmZXJfcHVzaCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h2c2kuYyBiL2RyaXZlcnMvY2hhci9odnNpLmMKaW5kZXggYTIyYWE5NC4uYTk1MjIxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h2c2kuYworKysgYi9kcml2ZXJzL2NoYXIvaHZzaS5jCkBAIC0xOTcsNyArMTk3LDcgQEAKIAl9OwogCWNvbnN0IGNoYXIgKm5hbWUgPSBzdGF0ZV9uYW1lc1tocC0+c3RhdGVdOwogCi0JaWYgKGhwLT5zdGF0ZSA+IChzaXplb2Yoc3RhdGVfbmFtZXMpL3NpemVvZihjaGFyKikpKQorCWlmIChocC0+c3RhdGUgPiBBUlJBWV9TSVpFKHN0YXRlX25hbWVzKSkKIAkJbmFtZSA9ICJVTktOT1dOIjsKIAogCXByX2RlYnVnKCJodnNpJWk6IHN0YXRlID0gJXNcbiIsIGhwLT5pbmRleCwgbmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tLmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tLmMKaW5kZXggNDk3NjlmNS4uYjNiYzJlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS5jCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20uYwpAQCAtMTY5LDYgKzE2OSw3IEBACiAKIAl7IDB4ODA4NiwgMHgyNDE4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBybmdfaHdfaW50ZWwgfSwKIAl7IDB4ODA4NiwgMHgyNDI4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBybmdfaHdfaW50ZWwgfSwKKwl7IDB4ODA4NiwgMHgyNDMwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBybmdfaHdfaW50ZWwgfSwKIAl7IDB4ODA4NiwgMHgyNDQ4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBybmdfaHdfaW50ZWwgfSwKIAl7IDB4ODA4NiwgMHgyNDRlLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBybmdfaHdfaW50ZWwgfSwKIAl7IDB4ODA4NiwgMHgyNDVlLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBybmdfaHdfaW50ZWwgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcDIvaTJsaWIuYyBiL2RyaXZlcnMvY2hhci9pcDIvaTJsaWIuYwppbmRleCBiYTg1ZWIxLi5mYzk0NGQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXAyL2kybGliLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwMi9pMmxpYi5jCkBAIC04NTQsNyArODU0LDcgQEAKIAkJY291bnQgKz0gSUJVRl9TSVpFOwogCX0KIAkvLyBEb24ndCBnaXZlIG1vcmUgdGhhbiBjYW4gYmUgdGFrZW4gYnkgdGhlIGxpbmUgZGlzY2lwbGluZQotCWFtb3VudFRvTW92ZSA9IHBDaC0+cFRUWS0+bGRpc2MucmVjZWl2ZV9yb29tKCBwQ2gtPnBUVFkgKTsKKwlhbW91bnRUb01vdmUgPSBwQ2gtPnBUVFktPnJlY2VpdmVfcm9vbTsKIAlpZiAoY291bnQgPiBhbW91bnRUb01vdmUpIHsKIAkJY291bnQgPSBhbW91bnRUb01vdmU7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMm1haW4uYyBiL2RyaXZlcnMvY2hhci9pcDJtYWluLmMKaW5kZXggZDgxNWQxOS4uNTZlOTNhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwMm1haW4uYworKysgYi9kcml2ZXJzL2NoYXIvaXAybWFpbi5jCkBAIC0xNzIsNyArMTcyLDcgQEAKIC8qIFByaXZhdGUgKHN0YXRpYykgZnVuY3Rpb25zICovCiBzdGF0aWMgaW50ICBpcDJfb3BlbihQVFRZLCBzdHJ1Y3QgZmlsZSAqKTsKIHN0YXRpYyB2b2lkIGlwMl9jbG9zZShQVFRZLCBzdHJ1Y3QgZmlsZSAqKTsKLXN0YXRpYyBpbnQgIGlwMl93cml0ZShQVFRZLCBpbnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgIGlwMl93cml0ZShQVFRZLCBjb25zdCB1bnNpZ25lZCBjaGFyICosIGludCk7CiBzdGF0aWMgdm9pZCBpcDJfcHV0Y2hhcihQVFRZLCB1bnNpZ25lZCBjaGFyKTsKIHN0YXRpYyB2b2lkIGlwMl9mbHVzaF9jaGFycyhQVFRZKTsKIHN0YXRpYyBpbnQgIGlwMl93cml0ZV9yb29tKFBUVFkpOwpAQCAtMTcxMyw3ICsxNzEzLDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIGludAotaXAyX3dyaXRlKCBQVFRZIHR0eSwgaW50IHVzZXIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBEYXRhLCBpbnQgY291bnQpCitpcDJfd3JpdGUoIFBUVFkgdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpwRGF0YSwgaW50IGNvdW50KQogewogCWkyQ2hhblN0clB0ciAgcENoID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpbnQgYnl0ZXNTZW50ID0gMDsKQEAgLTE3MjYsNyArMTcyNiw3IEBACiAKIAkvKiBUaGlzIGlzIHRoZSBhY3R1YWwgbW92ZSBiaXQuIE1ha2Ugc3VyZSBpdCBkb2VzIHdoYXQgd2UgbmVlZCEhISEhICovCiAJV1JJVEVfTE9DS19JUlFTQVZFKCZwQ2gtPlBidWZfc3BpbmxvY2ssZmxhZ3MpOwotCWJ5dGVzU2VudCA9IGkyT3V0cHV0KCBwQ2gsIHBEYXRhLCBjb3VudCwgdXNlciApOworCWJ5dGVzU2VudCA9IGkyT3V0cHV0KCBwQ2gsIHBEYXRhLCBjb3VudCwgMCApOwogCVdSSVRFX1VOTE9DS19JUlFSRVNUT1JFKCZwQ2gtPlBidWZfc3BpbmxvY2ssZmxhZ3MpOwogCiAJaXAydHJhY2UgKENIQU5OLCBJVFJDX1dSSVRFLCBJVFJDX1JFVFVSTiwgMSwgYnl0ZXNTZW50ICk7CkBAIC0yMDAxLDcgKzIwMDEsOSBAQAogc3RhdGljIGludCBpcDJfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJaTJDaGFuU3RyUHRyIHBDaCA9IERldlRhYmxlW3R0eS0+aW5kZXhdOworI2lmZGVmCUVOQUJMRV9EU1NOT1cKIAl3YWl0X3F1ZXVlX3Qgd2FpdDsKKyNlbmRpZgogCiAJaWYgKHBDaCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTIwODksMTUgKzIwOTEsMTcgQEAKIHsKIAl3YWl0X3F1ZXVlX3Qgd2FpdDsKIAlpMkNoYW5TdHJQdHIgcENoID0gRGV2VGFibGVbdHR5LT5pbmRleF07CisJaTJlQm9yZFN0clB0ciBwQjsKIAlzdHJ1Y3QgYXN5bmNfaWNvdW50IGNwcmV2LCBjbm93OwkvKiBrZXJuZWwgY291bnRlciB0ZW1wcyAqLwogCXN0cnVjdCBzZXJpYWxfaWNvdW50ZXJfc3RydWN0IF9fdXNlciAqcF9jdXNlcjsKIAlpbnQgcmMgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAKLQlpZiAoIHBDaCA9PSBOVUxMICkgeworCWlmICggcENoID09IE5VTEwgKQogCQlyZXR1cm4gLUVOT0RFVjsKLQl9CisKKwlwQiA9IHBDaC0+cE15Qm9yZDsKIAogCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19JT0NUTCwgSVRSQ19FTlRFUiwgMiwgY21kLCBhcmcgKTsKIApAQCAtMjIwNiw5ICsyMjEwLDkgQEAKIAkgKiBmb3IgbWFza2luZykuIENhbGxlciBzaG91bGQgdXNlIFRJT0NHSUNPVU5UIHRvIHNlZSB3aGljaCBvbmUgaXQgd2FzCiAJICovCiAJY2FzZSBUSU9DTUlXQUlUOgotCQlzYXZlX2ZsYWdzKGZsYWdzKTtjbGkoKTsKKwkJV1JJVEVfTE9DS19JUlFTQVZFKCZwQi0+cmVhZF9maWZvX3NwaW5sb2NrLCBmbGFncyk7CiAJCWNwcmV2ID0gcENoLT5pY291bnQ7CSAvKiBub3RlIHRoZSBjb3VudGVycyBvbiBlbnRyeSAqLwotCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUoJnBCLT5yZWFkX2ZpZm9fc3BpbmxvY2ssIGZsYWdzKTsKIAkJaTJRdWV1ZUNvbW1hbmRzKFBUWVBFX0JZUEFTUywgcENoLCAxMDAsIDQsIAogCQkJCQkJQ01EX0RDRF9SRVAsIENNRF9DVFNfUkVQLCBDTURfRFNSX1JFUCwgQ01EX1JJX1JFUCk7CiAJCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKQEAgLTIyMjgsOSArMjIzMiw5IEBACiAJCQkJcmMgPSAtRVJFU1RBUlRTWVM7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlzYXZlX2ZsYWdzKGZsYWdzKTtjbGkoKTsKKwkJCVdSSVRFX0xPQ0tfSVJRU0FWRSgmcEItPnJlYWRfZmlmb19zcGlubG9jaywgZmxhZ3MpOwogCQkJY25vdyA9IHBDaC0+aWNvdW50OyAvKiBhdG9taWMgY29weSAqLwotCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcEItPnJlYWRfZmlmb19zcGlubG9jaywgZmxhZ3MpOwogCQkJaWYgKGNub3cucm5nID09IGNwcmV2LnJuZyAmJiBjbm93LmRzciA9PSBjcHJldi5kc3IgJiYKIAkJCQljbm93LmRjZCA9PSBjcHJldi5kY2QgJiYgY25vdy5jdHMgPT0gY3ByZXYuY3RzKSB7CiAJCQkJcmMgPSAgLUVJTzsgLyogbm8gY2hhbmdlID0+IHJjICovCkBAIC0yMjY4LDkgKzIyNzIsOSBAQAogCWNhc2UgVElPQ0dJQ09VTlQ6CiAJCWlwMnRyYWNlIChDSEFOTiwgSVRSQ19JT0NUTCwgMTEsIDEsIHJjICk7CiAKLQkJc2F2ZV9mbGFncyhmbGFncyk7Y2xpKCk7CisJCVdSSVRFX0xPQ0tfSVJRU0FWRSgmcEItPnJlYWRfZmlmb19zcGlubG9jaywgZmxhZ3MpOwogCQljbm93ID0gcENoLT5pY291bnQ7Ci0JCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlXUklURV9VTkxPQ0tfSVJRUkVTVE9SRSgmcEItPnJlYWRfZmlmb19zcGlubG9jaywgZmxhZ3MpOwogCQlwX2N1c2VyID0gYXJncDsKIAkJcmMgPSBwdXRfdXNlcihjbm93LmN0cywgJnBfY3VzZXItPmN0cyk7CiAJCXJjID0gcHV0X3VzZXIoY25vdy5kc3IsICZwX2N1c2VyLT5kc3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9tc2doYW5kbGVyLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX21zZ2hhbmRsZXIuYwppbmRleCA1NjE0MzBlLi4wMDk3ZjA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX21zZ2hhbmRsZXIuYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX21zZ2hhbmRsZXIuYwpAQCAtNTcsNiArNTcsNyBAQAogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19pcG1pX3Jvb3QgPSBOVUxMOworRVhQT1JUX1NZTUJPTChwcm9jX2lwbWlfcm9vdCk7CiAjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KIAogI2RlZmluZSBNQVhfRVZFTlRTX0lOX1FVRVVFCTI1CkBAIC0zMjk1LDYgKzMyOTYsNSBAQAogRVhQT1JUX1NZTUJPTChpcG1pX3NldF9teV9MVU4pOwogRVhQT1JUX1NZTUJPTChpcG1pX2dldF9teV9MVU4pOwogRVhQT1JUX1NZTUJPTChpcG1pX3NtaV9hZGRfcHJvY19lbnRyeSk7Ci1FWFBPUlRfU1lNQk9MKHByb2NfaXBtaV9yb290KTsKIEVYUE9SVF9TWU1CT0woaXBtaV91c2VyX3NldF9ydW5fdG9fY29tcGxldGlvbik7CiBFWFBPUlRfU1lNQk9MKGlwbWlfZnJlZV9yZWN2X21zZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3Bvd2Vyb2ZmLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3Bvd2Vyb2ZmLmMKaW5kZXggZTA1M2VhZC4uNDljMDlhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9wb3dlcm9mZi5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfcG93ZXJvZmYuYwpAQCAtNjEyLDExICs2MTIsMTQgQEAKICNlbmRpZgogCiAJcnYgPSBpcG1pX3NtaV93YXRjaGVyX3JlZ2lzdGVyKCZzbWlfd2F0Y2hlcik7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwogCWlmIChydikgewogCQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShpcG1pX3RhYmxlX2hlYWRlcik7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byByZWdpc3RlciBTTUkgd2F0Y2hlcjogJWRcbiIsIHJ2KTsKIAkJZ290byBvdXRfZXJyOwogCX0KKyNlbmRpZgogCiAgb3V0X2VycjoKIAlyZXR1cm4gcnY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCmluZGV4IGJlZWE0NTAuLmM2N2VmM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCkBAIC0xMDU2LDcgKzEwNTYsNyBAQAogI2RlZmluZSBJUE1JX01FTV9BRERSX1NQQUNFIDEKICNkZWZpbmUgSVBNSV9JT19BRERSX1NQQUNFICAyCiAKLSNpZiBkZWZpbmVkKENPTkZJR19BQ1BJKSB8fCBkZWZpbmVkKENPTkZJR19YODYpIHx8IGRlZmluZWQoQ09ORklHX1BDSSkKKyNpZiBkZWZpbmVkKENPTkZJR19BQ1BJKSB8fCBkZWZpbmVkKENPTkZJR19ETUkpIHx8IGRlZmluZWQoQ09ORklHX1BDSSkKIHN0YXRpYyBpbnQgaXNfbmV3X2ludGVyZmFjZShpbnQgaW50ZiwgdTggYWRkcl9zcGFjZSwgdW5zaWduZWQgbG9uZyBiYXNlX2FkZHIpCiB7CiAJaW50IGk7CkBAIC0xNjY5LDcgKzE2NjksNyBAQAogfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfWDg2CisjaWZkZWYgQ09ORklHX0RNSQogdHlwZWRlZiBzdHJ1Y3QgZG1pX2lwbWlfZGF0YQogewogCXU4ICAgCQl0eXBlOwpAQCAtMTgyOSw3ICsxODI5LDcgQEAKIAkgICAgICAgaXBtaV9kYXRhLT5zbGF2ZV9hZGRyKTsKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZiAvKiBDT05GSUdfWDg2ICovCisjZW5kaWYgLyogQ09ORklHX0RNSSAqLwogCiAjaWZkZWYgQ09ORklHX1BDSQogCkBAIC0yMjIyLDcgKzIyMjIsNyBAQAogCWlmIChydiAmJiBzaV90cnlkZWZhdWx0cykKIAkJcnYgPSB0cnlfaW5pdF9hY3BpKGludGZfbnVtLCAmbmV3X3NtaSk7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfWDg2CisjaWZkZWYgQ09ORklHX0RNSQogCWlmIChydiAmJiBzaV90cnlkZWZhdWx0cykKIAkJcnYgPSB0cnlfaW5pdF9zbWJpb3MoaW50Zl9udW0sICZuZXdfc21pKTsKICNlbmRpZgpAQCAtMjQzMyw3ICsyNDMzLDcgQEAKIAogCXByaW50ayhLRVJOX0lORk8gIklQTUkgU3lzdGVtIEludGVyZmFjZSBkcml2ZXIuXG4iKTsKIAotI2lmZGVmIENPTkZJR19YODYKKyNpZmRlZiBDT05GSUdfRE1JCiAJZG1pX2ZpbmRfYm1jKCk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lzaWNvbS5jIGIvZHJpdmVycy9jaGFyL2lzaWNvbS5jCmluZGV4IDFiYmY1MDcuLmU5ZWJhYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pc2ljb20uYworKysgYi9kcml2ZXJzL2NoYXIvaXNpY29tLmMKQEAgLTIwLDcgKzIwLDcgQEAKICAqCTMvOS85OQlzYW1lZXIJCQlBZGRlZCBzdXBwb3J0IGZvciBJU0k0NjE2IGNhcmRzLgogICoKICAqCTE2LzkvOTkJc2FtZWVyCQkJV2UgZG8gbm90IGZvcmNlIFJUUyBsb3cgYW55bW9yZS4KLSAqCQkJCQlUaGlzIGlzIHRvIHByZXZlbnQgdGhlIGZpcm13YXJlIAorICoJCQkJCVRoaXMgaXMgdG8gcHJldmVudCB0aGUgZmlybXdhcmUKICAqCQkJCQlmcm9tIGdldHRpbmcgY29uZnVzZWQuCiAgKgogICoJMjYvMTAvOTkgc2FtZWVyCQkJQ29zbWV0aWMgY2hhbmdlczpUaGUgZHJpdmVyIG5vdwpAQCAtMzEsMjggKzMxLDI4IEBACiAgKgogICoJMTAvNS8wMCAgc2FtZWVyCQkJRml4ZWQgaXNpY29tX3NodXRkb3duX2JvYXJkKCkKICAqCQkJCQl0byBub3QgbG93ZXIgRFRSIG9uIGFsbCB0aGUgcG9ydHMKLSAqCQkJCQl3aGVuIHRoZSBsYXN0IHBvcnQgb24gdGhlIGNhcmQgaXMgCisgKgkJCQkJd2hlbiB0aGUgbGFzdCBwb3J0IG9uIHRoZSBjYXJkIGlzCiAgKgkJCQkJY2xvc2VkLgogICoKICAqCTEwLzUvMDAgIHNhbWVlcgkJCVNpZ25hbCBtYXNrIHNldHVwIGNvbW1hbmQgYWRkZWQKLSAqCQkJCQl0byAgaXNpY29tX3NldHVwX3BvcnQgYW5kIAorICoJCQkJCXRvICBpc2ljb21fc2V0dXBfcG9ydCBhbmQKICAqCQkJCQlpc2ljb21fc2h1dGRvd25fcG9ydC4KICAqCiAgKgkyNC81LzAwICBzYW1lZXIJCQlUaGUgZHJpdmVyIGlzIG5vdyBTTVAgYXdhcmUuCi0gKgkJCQkJCi0gKgkKKyAqCisgKgogICoJMjcvMTEvMDAgVmluYXlhayBQIFJpc2J1ZAlGaXhlZCB0aGUgRHJpdmVyIENyYXNoIFByb2JsZW0KLSAqCQotICoJCisgKgorICoKICAqCTAzLzAxLzAxICBhbmlsIC5zCQlBZGRlZCBzdXBwb3J0IGZvciByZXNldHRpbmcgdGhlCiAgKgkJCQkJaW50ZXJuYWwgbW9kZW1zIG9uIElTSSBjYXJkcy4KICAqCiAgKgkwOC8wMi8wMSAgYW5pbCAucwkJVXBncmFkZWQgdGhlIGRyaXZlciBmb3Iga2VybmVsCiAgKgkJCQkJMi40LngKICAqCi0gKiAgICAgIDExLzA0LzAxICBLZXZpbgkJCUZpeGVkIGZpcm13YXJlIGxvYWQgcHJvYmxlbSB3aXRoCisgKgkxMS8wNC8wMSAgS2V2aW4JCQlGaXhlZCBmaXJtd2FyZSBsb2FkIHByb2JsZW0gd2l0aAogICoJCQkJCUlTSUhQLTRYIGNhcmQKLSAqCQorICoKICAqCTMwLzA0LzAxICBhbmlsIC5zCQlGaXhlZCB0aGUgcmVtb3RlIGxvZ2luIHRocm91Z2gKICAqCQkJCQlJU0kgcG9ydCBwcm9ibGVtLiBOb3cgdGhlIGxpbmsKICAqCQkJCQlkb2VzIG5vdCBnbyBkb3duIGJlZm9yZSBwYXNzd29yZApAQCAtNjIsOSArNjIsOSBAQAogICoJCQkJCWFtb25nIElTSS1QQ0kgY2FyZHMuCiAgKgogICoJMDMvMDUvMDEgIGFuaWwgLnMJCUFkZGVkIHN1cHBvcnQgdG8gZGlzcGxheSB0aGUgdmVyc2lvbgotICoJCQkJCWluZm8gZHVyaW5nIGluc21vZCBhcyB3ZWxsIGFzIG1vZHVsZSAKKyAqCQkJCQlpbmZvIGR1cmluZyBpbnNtb2QgYXMgd2VsbCBhcyBtb2R1bGUKICAqCQkJCQlsaXN0aW5nIGJ5IGxzbW9kLgotICoJCisgKgogICoJMTAvMDUvMDEgIGFuaWwgLnMJCURvbmUgdGhlIG1vZGlmaWNhdGlvbnMgdG8gdGhlIHNvdXJjZQogICoJCQkJCWZpbGUgYW5kIEluc3RhbGwgc2NyaXB0IHNvIHRoYXQgdGhlCiAgKgkJCQkJc2FtZSBpbnN0YWxsYXRpb24gY2FuIGJlIHVzZWQgZm9yCkBAIC03MywxOSArNzMsMTkgQEAKICAqCTA2LzA2LzAxICBhbmlsIC5zCQlOb3cgd2UgZHJvcCBib3RoIGR0ciBhbmQgcnRzIGR1cmluZwogICoJCQkJCXNodXRkb3duX3BvcnQgYXMgd2VsbCBhcyByYWlzZSB0aGVtCiAgKgkJCQkJZHVyaW5nIGlzaWNvbV9jb25maWdfcG9ydC4KLSAqICAJCisgKgogICoJMDkvMDYvMDEgYWNtZUBjb25lY3RpdmEuY29tLmJyCXVzZSBjYXBhYmxlLCBub3Qgc3VzZXIsIGRvCiAgKgkJCQkJcmVzdG9yZV9mbGFncyBvbiBmYWlsdXJlIGluCiAgKgkJCQkJaXNpY29tX3NlbmRfYnJlYWssIHZlcmlmeSBwdXRfdXNlcgogICoJCQkJCXJlc3VsdAogICoKLSAqICAJMTEvMDIvMDMgIHJhbmplZXRoCQlBZGRlZCBzdXBwb3J0IGZvciAyMzAgS2JwcyBhbmQgNDYwIEticHMKLSAqICAJCQkJCUJhdWQgaW5kZXggZXh0ZW5kZWQgdG8gMjEKLSAqICAJCi0gKiAgCTIwLzAzLzAzICByYW5qZWV0aAkJTWFkZSB0byB3b3JrIGZvciBMaW51eCBBZHZhbmNlZCBzZXJ2ZXIuCi0gKiAgCQkJCQlUYWtlbiBjYXJlIG9mIGxpY2Vuc2Ugd2FybmluZy4JCi0gKiAgICAgIAotICoJMTAvMTIvMDMgIFJhdmluZHJhCQlNYWRlIHRvIHdvcmsgZm9yIEZlZG9yYSBDb3JlIDEgb2YgCisgKgkxMS8wMi8wMyAgcmFuamVldGgJCUFkZGVkIHN1cHBvcnQgZm9yIDIzMCBLYnBzIGFuZCA0NjAgS2JwcworICoJCQkJCUJhdWQgaW5kZXggZXh0ZW5kZWQgdG8gMjEKKyAqCisgKgkyMC8wMy8wMyAgcmFuamVldGgJCU1hZGUgdG8gd29yayBmb3IgTGludXggQWR2YW5jZWQgc2VydmVyLgorICoJCQkJCVRha2VuIGNhcmUgb2YgbGljZW5zZSB3YXJuaW5nLgorICoKKyAqCTEwLzEyLzAzICBSYXZpbmRyYQkJTWFkZSB0byB3b3JrIGZvciBGZWRvcmEgQ29yZSAxIG9mCiAgKgkJCQkJUmVkIEhhdCBEaXN0cmlidXRpb24KICAqCiAgKgkwNi8wMS8wNSAgQWxhbiBDb3ggCQlNZXJnZWQgdGhlIElTSSBhbmQgYmFzZSBrZXJuZWwgc3RyYW5kcwpAQCAtOTMsMTAgKzkzLDEwIEBACiAgKgogICoJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKglUbyB1c2UgdGhpcyBkcml2ZXIgeW91IGFsc28gbmVlZCB0aGUgc3VwcG9ydCBwYWNrYWdlLiBZb3UgCisgKglUbyB1c2UgdGhpcyBkcml2ZXIgeW91IGFsc28gbmVlZCB0aGUgc3VwcG9ydCBwYWNrYWdlLiBZb3UKICAqCWNhbiBmaW5kIHRoaXMgaW4gUlBNIGZvcm1hdCBvbgogICoJCWZ0cDovL2Z0cC5saW51eC5vcmcudWsvcHViL2xpbnV4L2FsYW4KLSAqIAkKKyAqCiAgKglZb3UgY2FuIGZpbmQgdGhlIG9yaWdpbmFsIHRvb2xzIGZvciB0aGlzIGRpcmVjdCBmcm9tIE11bHRpdGVjaAogICoJCWZ0cDovL2Z0cC5tdWx0aXRlY2guY29tL0lTSS1DYXJkcy8KICAqCkBAIC0xMDcsMjAgKzEwNywyMCBAQAogICoJT21pdCB0aG9zZSBlbnRyaWVzIGZvciBib2FyZHMgeW91IGRvbid0IGhhdmUgaW5zdGFsbGVkLgogICoKICAqCVRPRE8KLSAqCQlIb3RwbHVnCiAgKgkJTWVyZ2UgdGVzdGluZwogICoJCTY0LWJpdCB2ZXJpZmljYXRpb24KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgogI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtMTM0LDUwICsxMzQsNjIgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lzaWNvbS5oPgogCisjZGVmaW5lIEludGVycnVwdFRoZUNhcmQoYmFzZSkgb3V0dygwLCAoYmFzZSkgKyAweGMpCisjZGVmaW5lIENsZWFySW50ZXJydXB0KGJhc2UpIGludygoYmFzZSkgKyAweDBhKQorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgcHJfZGJnKHN0ci4uLikgcHJpbnRrKEtFUk5fREVCVUcgIklTSUNPTTogIiBzdHIpCisjZGVmaW5lIGlzaWNvbV9wYXJhbm9pYV9jaGVjayhhLCBiLCBjKSBfX2lzaWNvbV9wYXJhbm9pYV9jaGVjaygoYSksIChiKSwgKGMpKQorI2Vsc2UKKyNkZWZpbmUgcHJfZGJnKHN0ci4uLikgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBpc2ljb21fcGFyYW5vaWFfY2hlY2soYSwgYiwgYykgMAorI2VuZGlmCisKK3N0YXRpYyBpbnQgaXNpY29tX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICosIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICopOworc3RhdGljIHZvaWQgX19kZXZleGl0IGlzaWNvbV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKik7CisKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpc2ljb21fcGNpX3RibFtdID0gewotCXsgVkVORE9SX0lELCAweDIwMjgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKLQl7IFZFTkRPUl9JRCwgMHgyMDUxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCi0JeyBWRU5ET1JfSUQsIDB4MjA1MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAotCXsgVkVORE9SX0lELCAweDIwNTMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKLQl7IFZFTkRPUl9JRCwgMHgyMDU0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCi0JeyBWRU5ET1JfSUQsIDB4MjA1NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAotCXsgVkVORE9SX0lELCAweDIwNTYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKLQl7IFZFTkRPUl9JRCwgMHgyMDU3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCi0JeyBWRU5ET1JfSUQsIDB4MjA1OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgUENJX0RFVklDRShWRU5ET1JfSUQsIDB4MjAyOCkgfSwKKwl7IFBDSV9ERVZJQ0UoVkVORE9SX0lELCAweDIwNTEpIH0sCisJeyBQQ0lfREVWSUNFKFZFTkRPUl9JRCwgMHgyMDUyKSB9LAorCXsgUENJX0RFVklDRShWRU5ET1JfSUQsIDB4MjA1MykgfSwKKwl7IFBDSV9ERVZJQ0UoVkVORE9SX0lELCAweDIwNTQpIH0sCisJeyBQQ0lfREVWSUNFKFZFTkRPUl9JRCwgMHgyMDU1KSB9LAorCXsgUENJX0RFVklDRShWRU5ET1JfSUQsIDB4MjA1NikgfSwKKwl7IFBDSV9ERVZJQ0UoVkVORE9SX0lELCAweDIwNTcpIH0sCisJeyBQQ0lfREVWSUNFKFZFTkRPUl9JRCwgMHgyMDU4KSB9LAogCXsgMCB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlzaWNvbV9wY2lfdGJsKTsKIAorc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGlzaWNvbV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImlzaWNvbSIsCisJLmlkX3RhYmxlCT0gaXNpY29tX3BjaV90YmwsCisJLnByb2JlCQk9IGlzaWNvbV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGlzaWNvbV9yZW1vdmUpCit9OworCiBzdGF0aWMgaW50IHByZXZfY2FyZCA9IDM7CS8qCXN0YXJ0IHNlcnZpY2luZyBpc2lfY2FyZFswXQkqLwogc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICppc2ljb21fbm9ybWFsOwogCiBzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgdHg7CiBzdGF0aWMgY2hhciByZV9zY2hlZHVsZSA9IDE7Ci0jaWZkZWYgSVNJQ09NX0RFQlVHCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB0eF9jb3VudCA9IDA7Ci0jZW5kaWYKLQotc3RhdGljIGludCBJU0lMb2FkX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCAgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogCiBzdGF0aWMgdm9pZCBpc2ljb21fdHgodW5zaWduZWQgbG9uZyBfZGF0YSk7Ci1zdGF0aWMgdm9pZCBpc2ljb21fc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpOwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqIHRtcF9idWY7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWCh0bXBfYnVmX3NlbSk7CitzdGF0aWMgdm9pZCBpc2ljb21fc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiAKIC8qICAgYmF1ZCBpbmRleCBtYXBwaW5ncyBmcm9tIGxpbnV4IGRlZm5zIHRvIGlzaSAqLwogCiBzdGF0aWMgc2lnbmVkIGNoYXIgbGludXhiX3RvX2lzaWJbXSA9IHsKLQktMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTEsIDEzLCAxNSwgMTYsIDE3LCAgICAgCi0JMTgsIDE5CisJLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDExLCAxMywgMTUsIDE2LCAxNywgMTgsIDE5CiB9OwogCiBzdHJ1Y3QJaXNpX2JvYXJkIHsKLQl1bnNpZ25lZCBzaG9ydAkJYmFzZTsKKwl1bnNpZ25lZCBsb25nCQliYXNlOwogCXVuc2lnbmVkIGNoYXIJCWlycTsKIAl1bnNpZ25lZCBjaGFyCQlwb3J0X2NvdW50OwogCXVuc2lnbmVkIHNob3J0CQlzdGF0dXM7Ci0JdW5zaWduZWQgc2hvcnQJCXBvcnRfc3RhdHVzOyAvKiBlYWNoIGJpdCByZXByZXNlbnRzIGEgc2luZ2xlIHBvcnQgKi8KKwl1bnNpZ25lZCBzaG9ydAkJcG9ydF9zdGF0dXM7IC8qIGVhY2ggYml0IGZvciBlYWNoIHBvcnQgKi8KIAl1bnNpZ25lZCBzaG9ydAkJc2hpZnRfY291bnQ7CiAJc3RydWN0IGlzaV9wb3J0CQkqIHBvcnRzOwogCXNpZ25lZCBjaGFyCQljb3VudDsKQEAgLTE5Miw5ICsyMDQsOSBAQAogCWludAkJCWNvdW50OwogCWludAkJCWJsb2NrZWRfb3BlbjsKIAlpbnQJCQljbG9zZV9kZWxheTsKLQl1bnNpZ25lZCBzaG9ydAkJY2hhbm5lbDsKLQl1bnNpZ25lZCBzaG9ydAkJc3RhdHVzOwotCXVuc2lnbmVkIHNob3J0CQljbG9zaW5nX3dhaXQ7CisJdTE2CQkJY2hhbm5lbDsKKwl1MTYJCQlzdGF0dXM7CisJdTE2CQkJY2xvc2luZ193YWl0OwogCXN0cnVjdCBpc2lfYm9hcmQJKiBjYXJkOwogCXN0cnVjdCB0dHlfc3RydWN0IAkqIHR0eTsKIAl3YWl0X3F1ZXVlX2hlYWRfdAljbG9zZV93YWl0OwpAQCAtMjE1LDM1ICsyMjcsMzcgQEAKICAqCXRoZSBrZXJuZWwgbG9jayBmb3IgdGhlIGNhcmQgYW5kIGhhdmUgdGhlIGNhcmQgaW4gYSBwb3NpdGlvbiB0aGF0CiAgKglpdCB3YW50cyB0byB0YWxrLgogICovCi0gCisKIHN0YXRpYyBpbnQgbG9ja19jYXJkKHN0cnVjdCBpc2lfYm9hcmQgKmNhcmQpCiB7CiAJY2hhcgkJcmV0cmllczsKLQl1bnNpZ25lZCBzaG9ydCBiYXNlID0gY2FyZC0+YmFzZTsKKwl1bnNpZ25lZCBsb25nIGJhc2UgPSBjYXJkLT5iYXNlOwogCiAJZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IDEwMDsgcmV0cmllcysrKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGNhcmQtPmZsYWdzKTsKIAkJaWYgKGludyhiYXNlICsgMHhlKSAmIDB4MSkgewotCQkJcmV0dXJuIDE7IAorCQkJcmV0dXJuIDE7CiAJCX0gZWxzZSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGNhcmQtPmZsYWdzKTsKIAkJCXVkZWxheSgxMDAwKTsgICAvKiAxbXMgKi8KIAkJfQogCX0KLQlwcmludGsoS0VSTl9XQVJOSU5HICJJU0lDT006IEZhaWxlZCB0byBsb2NrIENhcmQgKDB4JXgpXG4iLCBjYXJkLT5iYXNlKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJJU0lDT006IEZhaWxlZCB0byBsb2NrIENhcmQgKDB4JWx4KVxuIiwKKwkJY2FyZC0+YmFzZSk7CisKIAlyZXR1cm4gMDsJLyogRmFpbGVkIHRvIGFxdWlyZSB0aGUgY2FyZCEgKi8KIH0KIAogc3RhdGljIGludCBsb2NrX2NhcmRfYXRfaW50ZXJydXB0KHN0cnVjdCBpc2lfYm9hcmQgKmNhcmQpCiB7CiAJdW5zaWduZWQgY2hhcgkJcmV0cmllczsKLQl1bnNpZ25lZCBzaG9ydCAJCWJhc2UgPSBjYXJkLT5iYXNlOworCXVuc2lnbmVkIGxvbmcgYmFzZSA9IGNhcmQtPmJhc2U7CiAKIAlmb3IgKHJldHJpZXMgPSAwOyByZXRyaWVzIDwgMjAwOyByZXRyaWVzKyspIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgY2FyZC0+ZmxhZ3MpOwogCiAJCWlmIChpbncoYmFzZSArIDB4ZSkgJiAweDEpCi0JCQlyZXR1cm4gMTsgCisJCQlyZXR1cm4gMTsKIAkJZWxzZQogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBjYXJkLT5mbGFncyk7CiAJfQpAQCAtMjU5LDM3MyArMjczLDE0MSBAQAogLyoKICAqICBJU0kgQ2FyZCBzcGVjaWZpYyBvcHMgLi4uCiAgKi8KLSAKLXN0YXRpYyB2b2lkIHJhaXNlX2R0cihzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0KQorCitzdGF0aWMgdm9pZCByYWlzZV9kdHIoc3RydWN0IGlzaV9wb3J0ICpwb3J0KQogewotCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKLQl1bnNpZ25lZCBzaG9ydCBiYXNlID0gY2FyZC0+YmFzZTsKLQl1bnNpZ25lZCBjaGFyIGNoYW5uZWwgPSBwb3J0LT5jaGFubmVsOworCXN0cnVjdCBpc2lfYm9hcmQgKmNhcmQgPSBwb3J0LT5jYXJkOworCXVuc2lnbmVkIGxvbmcgYmFzZSA9IGNhcmQtPmJhc2U7CisJdTE2IGNoYW5uZWwgPSBwb3J0LT5jaGFubmVsOwogCiAJaWYgKCFsb2NrX2NhcmQoY2FyZCkpCiAJCXJldHVybjsKIAotCW91dHcoMHg4MDAwIHwgKGNoYW5uZWwgPDwgY2FyZC0+c2hpZnRfY291bnQpIHwgMHgwMiAsIGJhc2UpOworCW91dHcoMHg4MDAwIHwgKGNoYW5uZWwgPDwgY2FyZC0+c2hpZnRfY291bnQpIHwgMHgwMiwgYmFzZSk7CiAJb3V0dygweDA1MDQsIGJhc2UpOwogCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CiAJcG9ydC0+c3RhdHVzIHw9IElTSV9EVFI7CiAJdW5sb2NrX2NhcmQoY2FyZCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkcm9wX2R0cihzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0KQotewkKLQlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7Ci0JdW5zaWduZWQgc2hvcnQgYmFzZSA9IGNhcmQtPmJhc2U7Ci0JdW5zaWduZWQgY2hhciBjaGFubmVsID0gcG9ydC0+Y2hhbm5lbDsKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcm9wX2R0cihzdHJ1Y3QgaXNpX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGlzaV9ib2FyZCAqY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gY2FyZC0+YmFzZTsKKwl1MTYgY2hhbm5lbCA9IHBvcnQtPmNoYW5uZWw7CiAKIAlpZiAoIWxvY2tfY2FyZChjYXJkKSkKIAkJcmV0dXJuOwogCi0Jb3V0dygweDgwMDAgfCAoY2hhbm5lbCA8PCBjYXJkLT5zaGlmdF9jb3VudCkgfCAweDAyICwgYmFzZSk7CisJb3V0dygweDgwMDAgfCAoY2hhbm5lbCA8PCBjYXJkLT5zaGlmdF9jb3VudCkgfCAweDAyLCBiYXNlKTsKIAlvdXR3KDB4MDQwNCwgYmFzZSk7Ci0JSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsJCisJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKIAlwb3J0LT5zdGF0dXMgJj0gfklTSV9EVFI7CiAJdW5sb2NrX2NhcmQoY2FyZCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByYWlzZV9ydHMoc3RydWN0IGlzaV9wb3J0ICogcG9ydCkKK3N0YXRpYyBpbmxpbmUgdm9pZCByYWlzZV9ydHMoc3RydWN0IGlzaV9wb3J0ICpwb3J0KQogewotCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKLQl1bnNpZ25lZCBzaG9ydCBiYXNlID0gY2FyZC0+YmFzZTsKLQl1bnNpZ25lZCBjaGFyIGNoYW5uZWwgPSBwb3J0LT5jaGFubmVsOworCXN0cnVjdCBpc2lfYm9hcmQgKmNhcmQgPSBwb3J0LT5jYXJkOworCXVuc2lnbmVkIGxvbmcgYmFzZSA9IGNhcmQtPmJhc2U7CisJdTE2IGNoYW5uZWwgPSBwb3J0LT5jaGFubmVsOwogCiAJaWYgKCFsb2NrX2NhcmQoY2FyZCkpCiAJCXJldHVybjsKIAotCW91dHcoMHg4MDAwIHwgKGNoYW5uZWwgPDwgY2FyZC0+c2hpZnRfY291bnQpIHwgMHgwMiAsIGJhc2UpOworCW91dHcoMHg4MDAwIHwgKGNoYW5uZWwgPDwgY2FyZC0+c2hpZnRfY291bnQpIHwgMHgwMiwgYmFzZSk7CiAJb3V0dygweDBhMDQsIGJhc2UpOwotCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CQorCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CiAJcG9ydC0+c3RhdHVzIHw9IElTSV9SVFM7CiAJdW5sb2NrX2NhcmQoY2FyZCk7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgZHJvcF9ydHMoc3RydWN0IGlzaV9wb3J0ICogcG9ydCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcm9wX3J0cyhzdHJ1Y3QgaXNpX3BvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOwotCXVuc2lnbmVkIHNob3J0IGJhc2UgPSBjYXJkLT5iYXNlOwotCXVuc2lnbmVkIGNoYXIgY2hhbm5lbCA9IHBvcnQtPmNoYW5uZWw7CisJc3RydWN0IGlzaV9ib2FyZCAqY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gY2FyZC0+YmFzZTsKKwl1MTYgY2hhbm5lbCA9IHBvcnQtPmNoYW5uZWw7CiAKIAlpZiAoIWxvY2tfY2FyZChjYXJkKSkKIAkJcmV0dXJuOwogCi0Jb3V0dygweDgwMDAgfCAoY2hhbm5lbCA8PCBjYXJkLT5zaGlmdF9jb3VudCkgfCAweDAyICwgYmFzZSk7CisJb3V0dygweDgwMDAgfCAoY2hhbm5lbCA8PCBjYXJkLT5zaGlmdF9jb3VudCkgfCAweDAyLCBiYXNlKTsKIAlvdXR3KDB4MDgwNCwgYmFzZSk7Ci0JSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsJCisJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKIAlwb3J0LT5zdGF0dXMgJj0gfklTSV9SVFM7CiAJdW5sb2NrX2NhcmQoY2FyZCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByYWlzZV9kdHJfcnRzKHN0cnVjdCBpc2lfcG9ydCAqIHBvcnQpCitzdGF0aWMgaW5saW5lIHZvaWQgcmFpc2VfZHRyX3J0cyhzdHJ1Y3QgaXNpX3BvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOwotCXVuc2lnbmVkIHNob3J0IGJhc2UgPSBjYXJkLT5iYXNlOwotCXVuc2lnbmVkIGNoYXIgY2hhbm5lbCA9IHBvcnQtPmNoYW5uZWw7CisJc3RydWN0IGlzaV9ib2FyZCAqY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gY2FyZC0+YmFzZTsKKwl1MTYgY2hhbm5lbCA9IHBvcnQtPmNoYW5uZWw7CiAKIAlpZiAoIWxvY2tfY2FyZChjYXJkKSkKIAkJcmV0dXJuOwogCi0Jb3V0dygweDgwMDAgfCAoY2hhbm5lbCA8PCBjYXJkLT5zaGlmdF9jb3VudCkgfCAweDAyICwgYmFzZSk7CisJb3V0dygweDgwMDAgfCAoY2hhbm5lbCA8PCBjYXJkLT5zaGlmdF9jb3VudCkgfCAweDAyLCBiYXNlKTsKIAlvdXR3KDB4MGYwNCwgYmFzZSk7CiAJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKIAlwb3J0LT5zdGF0dXMgfD0gKElTSV9EVFIgfCBJU0lfUlRTKTsKIAl1bmxvY2tfY2FyZChjYXJkKTsKIH0KIAotc3RhdGljIHZvaWQgZHJvcF9kdHJfcnRzKHN0cnVjdCBpc2lfcG9ydCAqIHBvcnQpCitzdGF0aWMgdm9pZCBkcm9wX2R0cl9ydHMoc3RydWN0IGlzaV9wb3J0ICpwb3J0KQogewotCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKLQl1bnNpZ25lZCBzaG9ydCBiYXNlID0gY2FyZC0+YmFzZTsKLQl1bnNpZ25lZCBjaGFyIGNoYW5uZWwgPSBwb3J0LT5jaGFubmVsOworCXN0cnVjdCBpc2lfYm9hcmQgKmNhcmQgPSBwb3J0LT5jYXJkOworCXVuc2lnbmVkIGxvbmcgYmFzZSA9IGNhcmQtPmJhc2U7CisJdTE2IGNoYW5uZWwgPSBwb3J0LT5jaGFubmVsOwogCiAJaWYgKCFsb2NrX2NhcmQoY2FyZCkpCiAJCXJldHVybjsKIAotCW91dHcoMHg4MDAwIHwgKGNoYW5uZWwgPDwgY2FyZC0+c2hpZnRfY291bnQpIHwgMHgwMiAsIGJhc2UpOworCW91dHcoMHg4MDAwIHwgKGNoYW5uZWwgPDwgY2FyZC0+c2hpZnRfY291bnQpIHwgMHgwMiwgYmFzZSk7CiAJb3V0dygweDBjMDQsIGJhc2UpOwotCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CQorCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CiAJcG9ydC0+c3RhdHVzICY9IH4oSVNJX1JUUyB8IElTSV9EVFIpOwogCXVubG9ja19jYXJkKGNhcmQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQga2lsbF9xdWV1ZShzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0LCBzaG9ydCBxdWV1ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBraWxsX3F1ZXVlKHN0cnVjdCBpc2lfcG9ydCAqcG9ydCwgc2hvcnQgcXVldWUpCiB7Ci0Jc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOwotCXVuc2lnbmVkIHNob3J0IGJhc2UgPSBjYXJkLT5iYXNlOwotCXVuc2lnbmVkIGNoYXIgY2hhbm5lbCA9IHBvcnQtPmNoYW5uZWw7CisJc3RydWN0IGlzaV9ib2FyZCAqY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gY2FyZC0+YmFzZTsKKwl1MTYgY2hhbm5lbCA9IHBvcnQtPmNoYW5uZWw7CiAKIAlpZiAoIWxvY2tfY2FyZChjYXJkKSkKIAkJcmV0dXJuOwogCi0Jb3V0dygweDgwMDAgfCAoY2hhbm5lbCA8PCBjYXJkLT5zaGlmdF9jb3VudCkgfCAweDAyICwgYmFzZSk7CisJb3V0dygweDgwMDAgfCAoY2hhbm5lbCA8PCBjYXJkLT5zaGlmdF9jb3VudCkgfCAweDAyLCBiYXNlKTsKIAlvdXR3KChxdWV1ZSA8PCA4KSB8IDB4MDYsIGJhc2UpOwotCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CQorCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CiAJdW5sb2NrX2NhcmQoY2FyZCk7CiB9CiAKLQotLyogCi0gKiAgRmlybXdhcmUgbG9hZGVyIGRyaXZlciBzcGVjaWZpYyByb3V0aW5lcy4gVGhpcyBuZWVkcyB0byBtb3N0bHkgZGllCi0gKiAgYW5kIGJlIHJlcGxhY2VkIHdpdGggcmVxdWVzdF9maXJtd2FyZS4KLSAqLwotCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBJU0lMb2FkX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5pb2N0bAkJPSBJU0lMb2FkX2lvY3RsLAotfTsKLQotc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGlzaWxvYWRlcl9kZXZpY2UgPSB7Ci0JSVNJTE9BRF9NSVNDX01JTk9SLCAiaXNpY3RsIiwgJklTSUxvYWRfZm9wcwotfTsKLQotIAotc3RhdGljIGlubGluZSBpbnQgV2FpdFRpbGxDYXJkSXNGcmVlKHVuc2lnbmVkIHNob3J0IGJhc2UpCi17Ci0JdW5zaWduZWQgbG9uZyBjb3VudD0wOwotCXdoaWxlKCAoIShpbncoYmFzZSsweGUpICYgMHgxKSkgJiYgKGNvdW50KysgPCA2MDAwMDAwKSk7Ci0JaWYgKGludyhiYXNlKzB4ZSkmMHgxKSAgCi0JCXJldHVybiAwOwotCWVsc2UKLQkJcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgSVNJTG9hZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JdW5zaWduZWQgaW50IGNhcmQsIGksIGosIHNpZ25hdHVyZSwgc3RhdHVzLCBwb3J0Y291bnQgPSAwOwotCXVuc2lnbmVkIGxvbmcgdDsKLQl1bnNpZ25lZCBzaG9ydCB3b3JkX2NvdW50LCBiYXNlOwotCWJpbl9mcmFtZSBmcmFtZTsKLQl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQkvKiBleGVjX3JlY29yZCBleGVjX3JlYzsgKi8KLQkKLQlpZihnZXRfdXNlcihjYXJkLCAoaW50IF9fdXNlciAqKWFyZ3ApKQotCQlyZXR1cm4gLUVGQVVMVDsKLQkJCi0JaWYoY2FyZCA8IDAgfHwgY2FyZCA+PSBCT0FSRF9DT1VOVCkKLQkJcmV0dXJuIC1FTlhJTzsKLQkJCi0JYmFzZT1pc2lfY2FyZFtjYXJkXS5iYXNlOwotCQotCWlmKGJhc2U9PTApCi0JCXJldHVybiAtRU5YSU87CS8qIGRpc2FibGVkIG9yIG5vdCB1c2VkICovCi0JCi0Jc3dpdGNoKGNtZCkgewotCQljYXNlIE1JT0NUTF9SRVNFVF9DQVJEOgotCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQotCQkJCXJldHVybiAtRVBFUk07Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJTG9hZDpSZXNldHRpbmcgQ2FyZCVkIGF0IDB4JXggIixjYXJkKzEsYmFzZSk7Ci0JCQkJCQkJCQotCQkJaW53KGJhc2UrMHg4KTsKLQkJCQotCQkJZm9yKHQ9amlmZmllcytIWi8xMDA7dGltZV9iZWZvcmUoamlmZmllcywgdCk7KTsKLQkJCQkKLQkJCW91dHcoMCxiYXNlKzB4OCk7IC8qIFJlc2V0ICovCi0JCQkKLQkJCWZvcihqPTE7ajw9MztqKyspIHsKLQkJCQlmb3IodD1qaWZmaWVzK0haO3RpbWVfYmVmb3JlKGppZmZpZXMsIHQpOyk7Ci0JCQkJcHJpbnRrKCIuIik7Ci0JCQl9CQotCQkJc2lnbmF0dXJlPShpbncoYmFzZSsweDQpKSAmIDB4ZmY7CQotCQkJaWYgKGlzaV9jYXJkW2NhcmRdLmlzYSkgewotCQkJCQkKLQkJCQlpZiAoIShpbncoYmFzZSsweGUpICYgMHgxKSB8fCAoaW53KGJhc2UrMHgyKSkpIHsKLSNpZmRlZiBJU0lDT01fREVCVUcJCQkJCi0JCQkJCXByaW50aygiXG5iYXNlKzB4Mj0weCV4ICwgYmFzZSsweGU9MHgleCIsaW53KGJhc2UrMHgyKSxpbncoYmFzZSsweGUpKTsKLSNlbmRpZgkJCQkKLQkJCQkJcHJpbnRrKCJcbklTSUxvYWQ6SVNBIENhcmQlZCByZXNldCBmYWlsdXJlIChQb3NzaWJsZSBiYWQgSS9PIFBvcnQgQWRkcmVzcyAweCV4KS5cbiIsY2FyZCsxLGJhc2UpOwotCQkJCQlyZXR1cm4gLUVJTzsJCQkJCQotCQkJCX0KLQkJCX0JCi0JCQllbHNlIHsKLQkJCQlwb3J0Y291bnQgPSBpbncoYmFzZSsweDIpOwotCQkJCWlmICghKGludyhiYXNlKzB4ZSkgJiAweDEpIHx8ICgocG9ydGNvdW50IT0wKSAmJiAocG9ydGNvdW50IT00KSAmJiAocG9ydGNvdW50IT04KSkpIHsJCi0jaWZkZWYgSVNJQ09NX0RFQlVHCi0JCQkJCXByaW50aygiXG5iYXNlKzB4Mj0weCV4ICwgYmFzZSsweGU9MHgleCIsaW53KGJhc2UrMHgyKSxpbncoYmFzZSsweGUpKTsKLSNlbmRpZgotCQkJCQlwcmludGsoIlxuSVNJTG9hZDpQQ0kgQ2FyZCVkIHJlc2V0IGZhaWx1cmUgKFBvc3NpYmxlIGJhZCBJL08gUG9ydCBBZGRyZXNzIDB4JXgpLlxuIixjYXJkKzEsYmFzZSk7Ci0JCQkJCXJldHVybiAtRUlPOwotCQkJCX0KLQkJCX0JCi0JCQlzd2l0Y2goc2lnbmF0dXJlKSB7Ci0JCQljYXNlCTB4YTU6Ci0JCQljYXNlCTB4YmI6Ci0JCQljYXNlCTB4ZGQ6CQotCQkJCQlpZiAoaXNpX2NhcmRbY2FyZF0uaXNhKSAKLQkJCQkJCWlzaV9jYXJkW2NhcmRdLnBvcnRfY291bnQgPSA4OwotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChwb3J0Y291bnQgPT0gNCkKLQkJCQkJCQlpc2lfY2FyZFtjYXJkXS5wb3J0X2NvdW50ID0gNDsKLQkJCQkJCWVsc2UKLQkJCQkJCQlpc2lfY2FyZFtjYXJkXS5wb3J0X2NvdW50ID0gODsKLQkJCQkJfQkKLQkJCQkgICAgIAlpc2lfY2FyZFtjYXJkXS5zaGlmdF9jb3VudCA9IDEyOwotCQkJCSAgICAgCWJyZWFrOwotCQkJCSAgICAgICAgCi0JCQljYXNlCTB4Y2M6CWlzaV9jYXJkW2NhcmRdLnBvcnRfY291bnQgPSAxNjsKLQkJCQkJaXNpX2NhcmRbY2FyZF0uc2hpZnRfY291bnQgPSAxMTsKLQkJCQkJYnJlYWs7ICAJCQkKLQkJCQkJCi0JCQlkZWZhdWx0OiBwcmludGsoIklTSUxvYWQ6Q2FyZCVkIHJlc2V0IGZhaWx1cmUgKFBvc3NpYmxlIGJhZCBJL08gUG9ydCBBZGRyZXNzIDB4JXgpLlxuIixjYXJkKzEsYmFzZSk7Ci0jaWZkZWYgSVNJQ09NX0RFQlVHCQkJCi0JCQkJIHByaW50aygiU2lnPTB4JXhcbiIsc2lnbmF0dXJlKTsKLSNlbmRpZgkJCQkgCi0JCQkJIHJldHVybiAtRUlPOwotCQkJfQotCQkJcHJpbnRrKCItRG9uZVxuIik7Ci0JCQlyZXR1cm4gcHV0X3VzZXIoc2lnbmF0dXJlLCh1bnNpZ25lZCBfX3VzZXIgKilhcmdwKTsKLQkJCQkJCQotCWNhc2UJTUlPQ1RMX0xPQURfRklSTVdBUkU6Ci0JCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCQkJcmV0dXJuIC1FUEVSTTsKLQkJCQkKLQkJCWlmKGNvcHlfZnJvbV91c2VyKCZmcmFtZSwgYXJncCwgc2l6ZW9mKGJpbl9mcmFtZSkpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCi0JCQlpZiAoV2FpdFRpbGxDYXJkSXNGcmVlKGJhc2UpKQotCQkJCXJldHVybiAtRUlPOwotCQkJCi0JCQlvdXR3KDB4ZjAsYmFzZSk7CS8qIHN0YXJ0IHVwbG9hZCBzZXF1ZW5jZSAqLyAKLQkJCW91dHcoMHgwMCxiYXNlKTsKLQkJCW91dHcoKGZyYW1lLmFkZHIpLCBiYXNlKTsvKiAgICAgIGxzYiBvZiBhZGRlcmVzcyAgICAqLwotCQkJCi0JCQl3b3JkX2NvdW50PShmcmFtZS5jb3VudCA+PiAxKSArIGZyYW1lLmNvdW50ICUgMjsKLQkJCW91dHcod29yZF9jb3VudCwgYmFzZSk7Ci0JCQlJbnRlcnJ1cHRUaGVDYXJkKGJhc2UpOwotCQkJCi0JCQlmb3IoaT0wO2k8PTB4MmY7aSsrKTsJLyogYSB3ZWUgYml0IG9mIGRlbGF5ICovCi0JCQkKLQkJCWlmIChXYWl0VGlsbENhcmRJc0ZyZWUoYmFzZSkpIAotCQkJCXJldHVybiAtRUlPOwotCQkJCQotCQkJaWYgKChzdGF0dXM9aW53KGJhc2UrMHg0KSkhPTApIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJJU0lMb2FkOkNhcmQlZCByZWplY3RlZCBsb2FkIGhlYWRlcjpcbkFkZHJlc3M6MHgleCBcbkNvdW50OjB4JXggXG5TdGF0dXM6MHgleCBcbiIsIAotCQkJCWNhcmQrMSwgZnJhbWUuYWRkciwgZnJhbWUuY291bnQsIHN0YXR1cyk7Ci0JCQkJcmV0dXJuIC1FSU87Ci0JCQl9Ci0JCQlvdXRzdyhiYXNlLCAodm9pZCAqKSBmcmFtZS5iaW5fZGF0YSwgd29yZF9jb3VudCk7Ci0JCQkKLQkJCUludGVycnVwdFRoZUNhcmQoYmFzZSk7Ci0JCQkKLQkJCWZvcihpPTA7aTw9MHgwZjtpKyspOwkvKiBhbm90aGVyIHdlZSBiaXQgb2YgZGVsYXkgKi8gCi0JCQkKLQkJCWlmIChXYWl0VGlsbENhcmRJc0ZyZWUoYmFzZSkpIAotCQkJCXJldHVybiAtRUlPOwotCQkJCQotCQkJaWYgKChzdGF0dXM9aW53KGJhc2UrMHg0KSkhPTApIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIklTSUxvYWQ6Q2FyZCVkIGdvdCBvdXQgb2Ygc3luYy5DYXJkIFN0YXR1czoweCV4XG4iLGNhcmQrMSwgc3RhdHVzKTsKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCX0JCi0JCQlyZXR1cm4gMDsKLQkJCQkJCQotCWNhc2UJTUlPQ1RMX1JFQURfRklSTVdBUkU6Ci0JCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCQkJcmV0dXJuIC1FUEVSTTsKLQkJCQkKLQkJCWlmKGNvcHlfZnJvbV91c2VyKCZmcmFtZSwgYXJncCwgc2l6ZW9mKGJpbl9oZWFkZXIpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQotCQkJaWYgKFdhaXRUaWxsQ2FyZElzRnJlZShiYXNlKSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCQotCQkJb3V0dygweGYxLGJhc2UpOwkvKiBzdGFydCBkb3dubG9hZCBzZXF1ZW5jZSAqLyAKLQkJCW91dHcoMHgwMCxiYXNlKTsKLQkJCW91dHcoKGZyYW1lLmFkZHIpLCBiYXNlKTsvKiAgICAgIGxzYiBvZiBhZGRlcmVzcyAgICAqLwotCQkJCi0JCQl3b3JkX2NvdW50PShmcmFtZS5jb3VudCA+PiAxKSArIGZyYW1lLmNvdW50ICUgMjsKLQkJCW91dHcod29yZF9jb3VudCsxLCBiYXNlKTsKLQkJCUludGVycnVwdFRoZUNhcmQoYmFzZSk7Ci0JCQkKLQkJCWZvcihpPTA7aTw9MHhmO2krKyk7CS8qIGEgd2VlIGJpdCBvZiBkZWxheSAqLwotCQkJCi0JCQlpZiAoV2FpdFRpbGxDYXJkSXNGcmVlKGJhc2UpKSAKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCQkKLQkJCWlmICgoc3RhdHVzPWludyhiYXNlKzB4NCkpIT0wKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSVNJTG9hZDpDYXJkJWQgcmVqZWN0ZWQgdmVyaWZ5IGhlYWRlcjpcbkFkZHJlc3M6MHgleCBcbkNvdW50OjB4JXggXG5TdGF0dXM6MHgleCBcbiIsIAotCQkJCWNhcmQrMSwgZnJhbWUuYWRkciwgZnJhbWUuY291bnQsIHN0YXR1cyk7Ci0JCQkJcmV0dXJuIC1FSU87Ci0JCQl9Ci0JCQkKLQkJCWludyhiYXNlKTsKLQkJCWluc3coYmFzZSwgZnJhbWUuYmluX2RhdGEsIHdvcmRfY291bnQpOwotCQkJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKLQkJCQotCQkJZm9yKGk9MDtpPD0weDBmO2krKyk7CS8qIGFub3RoZXIgd2VlIGJpdCBvZiBkZWxheSAqLyAKLQkJCQotCQkJaWYgKFdhaXRUaWxsQ2FyZElzRnJlZShiYXNlKSkgCi0JCQkJcmV0dXJuIC1FSU87Ci0JCQkJCi0JCQlpZiAoKHN0YXR1cz1pbncoYmFzZSsweDQpKSE9MCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiSVNJTG9hZDpDYXJkJWQgdmVyaWZ5IGdvdCBvdXQgb2Ygc3luYy5DYXJkIFN0YXR1czoweCV4XG4iLGNhcmQrMSwgc3RhdHVzKTsKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCX0JCi0JCQkKLQkJCWlmKGNvcHlfdG9fdXNlcihhcmdwLCAmZnJhbWUsIHNpemVvZihiaW5fZnJhbWUpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXJldHVybiAwOwotCQotCWNhc2UJTUlPQ1RMX1hGRVJfQ1RSTDoKLQkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJCQlyZXR1cm4gLUVQRVJNOwotCQkJaWYgKFdhaXRUaWxsQ2FyZElzRnJlZShiYXNlKSkgCi0JCQkJcmV0dXJuIC1FSU87Ci0JCQkJCQotCQkJb3V0dygweGYyLCBiYXNlKTsKLQkJCW91dHcoMHg4MDAsIGJhc2UpOwotCQkJb3V0dygweDAsIGJhc2UpOwotCQkJb3V0dygweDAsIGJhc2UpOwotCQkJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKLQkJCW91dHcoMHgwLCBiYXNlKzB4NCk7ICAgIC8qIGZvciBJU0k0NjA4IGNhcmRzICovCi0JCQkJCQkJCi0JCQlpc2lfY2FyZFtjYXJkXS5zdGF0dXMgfD0gRklSTVdBUkVfTE9BREVEOwotCQkJcmV0dXJuIDA7CQotCQkJCi0JZGVmYXVsdDoKLSNpZmRlZiBJU0lDT01fREVCVUcJCi0JCXByaW50ayhLRVJOX0RFQlVHICJJU0lMb2FkOiBSZWNlaXZlZCBJb2N0bCBjbWQgMHgleC5cbiIsIGNtZCk7IAotI2VuZGlmCi0JCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0JCi0JfQotCQotfQotCQkgICAgICAgIAkKLQogLyoKICAqCUlTSUNPTSBEcml2ZXIgc3BlY2lmaWMgcm91dGluZXMgLi4uCiAgKgogICovCi0gCi1zdGF0aWMgaW5saW5lIGludCBpc2ljb21fcGFyYW5vaWFfY2hlY2soc3RydWN0IGlzaV9wb3J0IGNvbnN0ICogcG9ydCwgY2hhciAqbmFtZSwgCi0JCQkJCWNvbnN0IGNoYXIgKiByb3V0aW5lKQorCitzdGF0aWMgaW5saW5lIGludCBfX2lzaWNvbV9wYXJhbm9pYV9jaGVjayhzdHJ1Y3QgaXNpX3BvcnQgY29uc3QgKnBvcnQsCisJY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcm91dGluZSkKIHsKLSNpZmRlZiBJU0lDT01fREVCVUcgCi0Jc3RhdGljIGNvbnN0IGNoYXIgKiBiYWRtYWdpYyA9IAotCQkJS0VSTl9XQVJOSU5HICJJU0lDT006IFdhcm5pbmc6IGJhZCBpc2ljb20gbWFnaWMgZm9yIGRldiAlcyBpbiAlcy5cbiI7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKiBiYWRwb3J0ID0gCi0JCQlLRVJOX1dBUk5JTkcgIklTSUNPTTogV2FybmluZzogTlVMTCBpc2ljb20gcG9ydCBmb3IgZGV2ICVzIGluICVzLlxuIjsJCQogCWlmICghcG9ydCkgewotCQlwcmludGsoYmFkcG9ydCwgbmFtZSwgcm91dGluZSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIklTSUNPTTogV2FybmluZzogYmFkIGlzaWNvbSBtYWdpYyBmb3IgIgorCQkJImRldiAlcyBpbiAlcy5cbiIsIG5hbWUsIHJvdXRpbmUpOwogCQlyZXR1cm4gMTsKIAl9CiAJaWYgKHBvcnQtPm1hZ2ljICE9IElTSUNPTV9NQUdJQykgewotCQlwcmludGsoYmFkbWFnaWMsIG5hbWUsIHJvdXRpbmUpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJJU0lDT006IFdhcm5pbmc6IE5VTEwgaXNpY29tIHBvcnQgZm9yICIKKwkJCSJkZXYgJXMgaW4gJXMuXG4iLCBuYW1lLCByb3V0aW5lKTsKIAkJcmV0dXJuIDE7Ci0JfQkKLSNlbmRpZgkKKwl9CisKIAlyZXR1cm4gMDsKIH0KLQkJCQorCiAvKgotICoJVHJhbnNtaXR0ZXIuIAorICoJVHJhbnNtaXR0ZXIuCiAgKgogICoJV2Ugc2hvdmVsIGRhdGEgaW50byB0aGUgY2FyZCBidWZmZXJzIG9uIGEgcmVndWxhciBiYXNpcy4gVGhlIGNhcmQKICAqCXdpbGwgZG8gdGhlIHJlc3Qgb2YgdGhlIHdvcmsgZm9yIHVzLgpAQCAtNjM1LDI1ICs0MTcsMjEgQEAKIHsKIAlzaG9ydCBjb3VudCA9IChCT0FSRF9DT1VOVC0xKSwgY2FyZCwgYmFzZTsKIAlzaG9ydCB0eGNvdW50LCB3cmQsIHJlc2lkdWUsIHdvcmRfY291bnQsIGNudDsKLQlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0OwotCXN0cnVjdCB0dHlfc3RydWN0ICogdHR5OwotCQotI2lmZGVmIElTSUNPTV9ERUJVRwotCSsrdHhfY291bnQ7Ci0jZW5kaWYJCi0JCisJc3RydWN0IGlzaV9wb3J0ICpwb3J0OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKIAkvKglmaW5kIG5leHQgYWN0aXZlIGJvYXJkCSovCiAJY2FyZCA9IChwcmV2X2NhcmQgKyAxKSAmIDB4MDAwMzsKIAl3aGlsZShjb3VudC0tID4gMCkgewotCQlpZiAoaXNpX2NhcmRbY2FyZF0uc3RhdHVzICYgQk9BUkRfQUNUSVZFKSAKKwkJaWYgKGlzaV9jYXJkW2NhcmRdLnN0YXR1cyAmIEJPQVJEX0FDVElWRSkKIAkJCWJyZWFrOwotCQljYXJkID0gKGNhcmQgKyAxKSAmIDB4MDAwMzsJCisJCWNhcmQgPSAoY2FyZCArIDEpICYgMHgwMDAzOwogCX0KIAlpZiAoIShpc2lfY2FyZFtjYXJkXS5zdGF0dXMgJiBCT0FSRF9BQ1RJVkUpKQogCQlnb3RvIHNjaGVkX2FnYWluOwotCQkKKwogCXByZXZfY2FyZCA9IGNhcmQ7Ci0JCisKIAljb3VudCA9IGlzaV9jYXJkW2NhcmRdLnBvcnRfY291bnQ7CiAJcG9ydCA9IGlzaV9jYXJkW2NhcmRdLnBvcnRzOwogCWJhc2UgPSBpc2lfY2FyZFtjYXJkXS5iYXNlOwpAQCAtNjYyLDE4ICs0NDAsMTggQEAKIAkJCWNvbnRpbnVlOwogCQkvKiBwb3J0IG5vdCBhY3RpdmUgb3IgdHggZGlzYWJsZWQgdG8gZm9yY2UgZmxvdyBjb250cm9sICovCiAJCWlmICghKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHx8Ci0JCSAJIShwb3J0LT5zdGF0dXMgJiBJU0lfVFhPSykpCisJCQkJIShwb3J0LT5zdGF0dXMgJiBJU0lfVFhPSykpCiAJCQl1bmxvY2tfY2FyZCgmaXNpX2NhcmRbY2FyZF0pOwogCQkJY29udGludWU7Ci0JCQorCiAJCXR0eSA9IHBvcnQtPnR0eTsKLQkJCi0JCQotCQlpZih0dHkgPT0gTlVMTCkgeworCisKKwkJaWYgKHR0eSA9PSBOVUxMKSB7CiAJCQl1bmxvY2tfY2FyZCgmaXNpX2NhcmRbY2FyZF0pOwogCQkJY29udGludWU7CiAJCX0KLQkJCisKIAkJdHhjb3VudCA9IG1pbl90KHNob3J0LCBUWF9TSVpFLCBwb3J0LT54bWl0X2NudCk7CiAJCWlmICh0eGNvdW50IDw9IDAgfHwgdHR5LT5zdG9wcGVkIHx8IHR0eS0+aHdfc3RvcHBlZCkgewogCQkJdW5sb2NrX2NhcmQoJmlzaV9jYXJkW2NhcmRdKTsKQEAgLTY4MSw0NCArNDU5LDQ1IEBACiAJCX0KIAkJaWYgKCEoaW53KGJhc2UgKyAweDAyKSAmICgxIDw8IHBvcnQtPmNoYW5uZWwpKSkgewogCQkJdW5sb2NrX2NhcmQoJmlzaV9jYXJkW2NhcmRdKTsKLQkJCWNvbnRpbnVlOwkJCisJCQljb250aW51ZTsKIAkJfQotI2lmZGVmIElTSUNPTV9ERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiB0eGluZyAlZCBieXRlcywgcG9ydCVkLlxuIiwgCi0JCQkJdHhjb3VudCwgcG9ydC0+Y2hhbm5lbCsxKTsgCi0jZW5kaWYJCi0JCW91dHcoKHBvcnQtPmNoYW5uZWwgPDwgaXNpX2NhcmRbY2FyZF0uc2hpZnRfY291bnQpIHwgdHhjb3VudAotCQkJCQksIGJhc2UpOworCQlwcl9kYmcoInR4aW5nICVkIGJ5dGVzLCBwb3J0JWQuXG4iLCB0eGNvdW50LAorCQkJcG9ydC0+Y2hhbm5lbCArIDEpOworCQlvdXR3KChwb3J0LT5jaGFubmVsIDw8IGlzaV9jYXJkW2NhcmRdLnNoaWZ0X2NvdW50KSB8IHR4Y291bnQsCisJCQliYXNlKTsKIAkJcmVzaWR1ZSA9IE5POwotCQl3cmQgPSAwOwkJCQorCQl3cmQgPSAwOwogCQl3aGlsZSAoMSkgewotCQkJY250ID0gbWluX3QoaW50LCB0eGNvdW50LCAoU0VSSUFMX1hNSVRfU0laRSAtIHBvcnQtPnhtaXRfdGFpbCkpOworCQkJY250ID0gbWluX3QoaW50LCB0eGNvdW50LCAoU0VSSUFMX1hNSVRfU0laRQorCQkJCQktIHBvcnQtPnhtaXRfdGFpbCkpOwogCQkJaWYgKHJlc2lkdWUgPT0gWUVTKSB7CiAJCQkJcmVzaWR1ZSA9IE5POwogCQkJCWlmIChjbnQgPiAwKSB7Ci0JCQkJCXdyZCB8PSAocG9ydC0+eG1pdF9idWZbcG9ydC0+eG1pdF90YWlsXSA8PCA4KTsKLQkJCQkJcG9ydC0+eG1pdF90YWlsID0gKHBvcnQtPnhtaXRfdGFpbCArIDEpICYgKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKKwkJCQkJd3JkIHw9IChwb3J0LT54bWl0X2J1Zltwb3J0LT54bWl0X3RhaWxdCisJCQkJCQkJCQk8PCA4KTsKKwkJCQkJcG9ydC0+eG1pdF90YWlsID0gKHBvcnQtPnhtaXRfdGFpbCArIDEpCisJCQkJCQkmIChTRVJJQUxfWE1JVF9TSVpFIC0gMSk7CiAJCQkJCXBvcnQtPnhtaXRfY250LS07CiAJCQkJCXR4Y291bnQtLTsKIAkJCQkJY250LS07Ci0JCQkJCW91dHcod3JkLCBiYXNlKTsJCQkKLQkJCQl9Ci0JCQkJZWxzZSB7CisJCQkJCW91dHcod3JkLCBiYXNlKTsKKwkJCQl9IGVsc2UgewogCQkJCQlvdXR3KHdyZCwgYmFzZSk7CiAJCQkJCWJyZWFrOwogCQkJCX0KLQkJCX0JCQorCQkJfQogCQkJaWYgKGNudCA8PSAwKSBicmVhazsKIAkJCXdvcmRfY291bnQgPSBjbnQgPj4gMTsKLQkJCW91dHN3KGJhc2UsIHBvcnQtPnhtaXRfYnVmK3BvcnQtPnhtaXRfdGFpbCwgd29yZF9jb3VudCk7Ci0JCQlwb3J0LT54bWl0X3RhaWwgPSAocG9ydC0+eG1pdF90YWlsICsgKHdvcmRfY291bnQgPDwgMSkpICYKLQkJCQkJCShTRVJJQUxfWE1JVF9TSVpFIC0gMSk7CisJCQlvdXRzdyhiYXNlLCBwb3J0LT54bWl0X2J1Zitwb3J0LT54bWl0X3RhaWwsd29yZF9jb3VudCk7CisJCQlwb3J0LT54bWl0X3RhaWwgPSAocG9ydC0+eG1pdF90YWlsCisJCQkJKyAod29yZF9jb3VudCA8PCAxKSkgJiAoU0VSSUFMX1hNSVRfU0laRSAtIDEpOwogCQkJdHhjb3VudCAtPSAod29yZF9jb3VudCA8PCAxKTsKIAkJCXBvcnQtPnhtaXRfY250IC09ICh3b3JkX2NvdW50IDw8IDEpOwogCQkJaWYgKGNudCAmIDB4MDAwMSkgewogCQkJCXJlc2lkdWUgPSBZRVM7CiAJCQkJd3JkID0gcG9ydC0+eG1pdF9idWZbcG9ydC0+eG1pdF90YWlsXTsKLQkJCQlwb3J0LT54bWl0X3RhaWwgPSAocG9ydC0+eG1pdF90YWlsICsgMSkgJiAoU0VSSUFMX1hNSVRfU0laRSAtIDEpOworCQkJCXBvcnQtPnhtaXRfdGFpbCA9IChwb3J0LT54bWl0X3RhaWwgKyAxKQorCQkJCQkmIChTRVJJQUxfWE1JVF9TSVpFIC0gMSk7CiAJCQkJcG9ydC0+eG1pdF9jbnQtLTsKIAkJCQl0eGNvdW50LS07CiAJCQl9CkBAIC03MzAsODEgKzUwOSw4MiBAQAogCQlpZiAocG9ydC0+eG1pdF9jbnQgPD0gV0FLRVVQX0NIQVJTKQogCQkJc2NoZWR1bGVfd29yaygmcG9ydC0+YmhfdHF1ZXVlKTsKIAkJdW5sb2NrX2NhcmQoJmlzaV9jYXJkW2NhcmRdKTsKLQl9CQorCX0KIAotCS8qCXNjaGVkdWxlIGFub3RoZXIgdHggZm9yIGhvcGVmdWxseSBpbiBhYm91dCAxMG1zCSovCQotc2NoZWRfYWdhaW46CQotCWlmICghcmVfc2NoZWR1bGUpCQotCQlyZXR1cm47CisJLyoJc2NoZWR1bGUgYW5vdGhlciB0eCBmb3IgaG9wZWZ1bGx5IGluIGFib3V0IDEwbXMJKi8KK3NjaGVkX2FnYWluOgorCWlmICghcmVfc2NoZWR1bGUpIHsKKwkJcmVfc2NoZWR1bGUgPSAyOworIAkJcmV0dXJuOworCX0KKwogCWluaXRfdGltZXIoJnR4KTsKIAl0eC5leHBpcmVzID0gamlmZmllcyArIEhaLzEwMDsKIAl0eC5kYXRhID0gMDsKIAl0eC5mdW5jdGlvbiA9IGlzaWNvbV90eDsKIAlhZGRfdGltZXIoJnR4KTsKLQkKLQlyZXR1cm47CQotfQkJCi0gCisKKwlyZXR1cm47Cit9CisKIC8qIAlJbnRlcnJ1cHQgaGFuZGxlcnMgCSovCiAKLSAKLXN0YXRpYyB2b2lkIGlzaWNvbV9ib3R0b21oYWxmKHZvaWQgKiBkYXRhKQorCitzdGF0aWMgdm9pZCBpc2ljb21fYm90dG9taGFsZih2b2lkICpkYXRhKQogewotCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIGRhdGE7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkgPSBwb3J0LT50dHk7Ci0JCisJc3RydWN0IGlzaV9wb3J0ICpwb3J0ID0gKHN0cnVjdCBpc2lfcG9ydCAqKSBkYXRhOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwb3J0LT50dHk7CisKIAlpZiAoIXR0eSkKIAkJcmV0dXJuOwogCi0JdHR5X3dha2V1cCh0dHkpOwkKKwl0dHlfd2FrZXVwKHR0eSk7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOwotfSAJCQotIAkJCit9CisKIC8qCi0gKglNYWluIGludGVycnVwdCBoYW5kbGVyIHJvdXRpbmUgCisgKglNYWluIGludGVycnVwdCBoYW5kbGVyIHJvdXRpbmUKICAqLwotIAotc3RhdGljIGlycXJldHVybl90IGlzaWNvbV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAotCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKKworc3RhdGljIGlycXJldHVybl90IGlzaWNvbV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZDsKLQlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0OwotCXN0cnVjdCB0dHlfc3RydWN0ICogdHR5OwotCXVuc2lnbmVkIHNob3J0IGJhc2UsIGhlYWRlciwgd29yZF9jb3VudCwgY291bnQ7Ci0JdW5zaWduZWQgY2hhciBjaGFubmVsOworCXN0cnVjdCBpc2lfYm9hcmQgKmNhcmQgPSBkZXZfaWQ7CisJc3RydWN0IGlzaV9wb3J0ICpwb3J0OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgbG9uZyBiYXNlOworCXUxNiBoZWFkZXIsIHdvcmRfY291bnQsIGNvdW50LCBjaGFubmVsOwogCXNob3J0IGJ5dGVfY291bnQ7Ci0JCi0JY2FyZCA9IChzdHJ1Y3QgaXNpX2JvYXJkICopIGRldl9pZDsKKwl1bnNpZ25lZCBjaGFyICpycDsKIAogCWlmICghY2FyZCB8fCAhKGNhcmQtPnN0YXR1cyAmIEZJUk1XQVJFX0xPQURFRCkpCiAJCXJldHVybiBJUlFfTk9ORTsKLQkKKwogCWJhc2UgPSBjYXJkLT5iYXNlOwogCXNwaW5fbG9jaygmY2FyZC0+Y2FyZF9sb2NrKTsKLQkKKwogCWlmIChjYXJkLT5pc2EgPT0gTk8pIHsKIAkJLyoKLQkJICogICAgICBkaXNhYmxlIGFueSBpbnRlcnJ1cHRzIGZyb20gdGhlIFBDSSBjYXJkIGFuZCBsb3dlciB0aGUKLQkJICogICAgICBpbnRlcnJ1cHQgbGluZQorCQkgKiBkaXNhYmxlIGFueSBpbnRlcnJ1cHRzIGZyb20gdGhlIFBDSSBjYXJkIGFuZCBsb3dlciB0aGUKKwkJICogaW50ZXJydXB0IGxpbmUKIAkJICovCiAJCW91dHcoMHg4MDAwLCBiYXNlKzB4MDQpOwogCQlDbGVhckludGVycnVwdChiYXNlKTsKIAl9Ci0JCisKIAlpbncoYmFzZSk7CQkvKiBnZXQgdGhlIGR1bW15IHdvcmQgb3V0ICovCiAJaGVhZGVyID0gaW53KGJhc2UpOwogCWNoYW5uZWwgPSAoaGVhZGVyICYgMHg3ODAwKSA+PiBjYXJkLT5zaGlmdF9jb3VudDsKIAlieXRlX2NvdW50ID0gaGVhZGVyICYgMHhmZjsKIAogCWlmIChjaGFubmVsICsgMSA+IGNhcmQtPnBvcnRfY291bnQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSVNJQ09NOiBpc2ljb21faW50ZXJydXB0KDB4JXgpOiAlZChjaGFubmVsKSA+IHBvcnRfY291bnQuXG4iLAotCQkJCWJhc2UsIGNoYW5uZWwrMSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIklTSUNPTTogaXNpY29tX2ludGVycnVwdCgweCVseCk6ICIKKwkJCSIlZChjaGFubmVsKSA+IHBvcnRfY291bnQuXG4iLCBiYXNlLCBjaGFubmVsKzEpOwogCQlpZiAoY2FyZC0+aXNhKQogCQkJQ2xlYXJJbnRlcnJ1cHQoYmFzZSk7CiAJCWVsc2UKLQkJCW91dHcoMHgwMDAwLCBiYXNlKzB4MDQpOyAvKiBlbmFibGUgaW50ZXJydXB0cyAqLwkJCisJCQlvdXR3KDB4MDAwMCwgYmFzZSsweDA0KTsgLyogZW5hYmxlIGludGVycnVwdHMgKi8KIAkJc3Bpbl91bmxvY2soJmNhcmQtPmNhcmRfbG9jayk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsJCQkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KIAlwb3J0ID0gY2FyZC0+cG9ydHMgKyBjaGFubmVsOwogCWlmICghKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7CkBAIC04MTMsOCArNTkzLDggQEAKIAkJZWxzZQogCQkJb3V0dygweDAwMDAsIGJhc2UrMHgwNCk7IC8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCiAJCXJldHVybiBJUlFfSEFORExFRDsKLQl9CQotCQkKKwl9CisKIAl0dHkgPSBwb3J0LT50dHk7CiAJaWYgKHR0eSA9PSBOVUxMKSB7CiAJCXdvcmRfY291bnQgPSBieXRlX2NvdW50ID4+IDE7CkBAIC04MzEsMjI0ICs2MTEsMjA0IEBACiAJCXNwaW5fdW5sb2NrKCZjYXJkLT5jYXJkX2xvY2spOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQotCQorCiAJaWYgKGhlYWRlciAmIDB4ODAwMCkgewkJLyogU3RhdHVzIFBhY2tldCAqLwogCQloZWFkZXIgPSBpbncoYmFzZSk7CiAJCXN3aXRjaChoZWFkZXIgJiAweGZmKSB7Ci0JCQljYXNlIDA6CS8qIENoYW5nZSBpbiBFSUEgc2lnbmFscyAqLwotCQkJCQotCQkJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKSB7Ci0JCQkJCWlmIChwb3J0LT5zdGF0dXMgJiBJU0lfRENEKSB7Ci0JCQkJCQlpZiAoIShoZWFkZXIgJiBJU0lfRENEKSkgewotCQkJCQkJLyogQ2FycmllciBoYXMgYmVlbiBsb3N0ICAqLwotI2lmZGVmIElTSUNPTV9ERUJVRwkJCQkJCQotCQkJCQkJCXByaW50ayhLRVJOX0RFQlVHICJJU0lDT006IGludGVycnVwdDogRENELT5sb3cuXG4iKTsKLSNlbmRpZgkJCQkJCQkKLQkJCQkJCQlwb3J0LT5zdGF0dXMgJj0gfklTSV9EQ0Q7Ci0JCQkJCQkJc2NoZWR1bGVfd29yaygmcG9ydC0+aGFuZ3VwX3RxKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChoZWFkZXIgJiBJU0lfRENEKSB7Ci0JCQkJCQkvKiBDYXJyaWVyIGhhcyBiZWVuIGRldGVjdGVkICovCi0jaWZkZWYgSVNJQ09NX0RFQlVHCi0JCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIklTSUNPTTogaW50ZXJydXB0OiBEQ0QtPmhpZ2guXG4iKTsKLSNlbmRpZgkJCQkJCQkKLQkJCQkJCQlwb3J0LT5zdGF0dXMgfD0gSVNJX0RDRDsKLQkJCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPm9wZW5fd2FpdCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChoZWFkZXIgJiBJU0lfRENEKSAKLQkJCQkJCXBvcnQtPnN0YXR1cyB8PSBJU0lfRENEOwotCQkJCQllbHNlCisJCWNhc2UgMDoJLyogQ2hhbmdlIGluIEVJQSBzaWduYWxzICovCisJCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkgeworCQkJCWlmIChwb3J0LT5zdGF0dXMgJiBJU0lfRENEKSB7CisJCQkJCWlmICghKGhlYWRlciAmIElTSV9EQ0QpKSB7CisJCQkJCS8qIENhcnJpZXIgaGFzIGJlZW4gbG9zdCAgKi8KKwkJCQkJCXByX2RiZygiaW50ZXJydXB0OiBEQ0QtPmxvdy5cbiIKKwkJCQkJCQkpOwogCQkJCQkJcG9ydC0+c3RhdHVzICY9IH5JU0lfRENEOwotCQkJCX0JCi0JCQkJCi0JCQkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfQ1RTX0ZMT1cpIHsKLQkJCQkJaWYgKHBvcnQtPnR0eS0+aHdfc3RvcHBlZCkgewotCQkJCQkJaWYgKGhlYWRlciAmIElTSV9DVFMpIHsKLQkJCQkJCQlwb3J0LT50dHktPmh3X3N0b3BwZWQgPSAwOwotCQkJCQkJCS8qIHN0YXJ0IHR4IGluZyAqLwotCQkJCQkJCXBvcnQtPnN0YXR1cyB8PSAoSVNJX1RYT0sgfCBJU0lfQ1RTKTsKLQkJCQkJCQlzY2hlZHVsZV93b3JrKCZwb3J0LT5iaF90cXVldWUpOwotCQkJCQkJfQorCQkJCQkJc2NoZWR1bGVfd29yaygmcG9ydC0+aGFuZ3VwX3RxKTsKIAkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmICghKGhlYWRlciAmIElTSV9DVFMpKSB7Ci0JCQkJCQkJcG9ydC0+dHR5LT5od19zdG9wcGVkID0gMTsKLQkJCQkJCQkvKiBzdG9wIHR4IGluZyAqLwotCQkJCQkJCXBvcnQtPnN0YXR1cyAmPSB+KElTSV9UWE9LIHwgSVNJX0NUUyk7Ci0JCQkJCQl9CisJCQkJfSBlbHNlIGlmIChoZWFkZXIgJiBJU0lfRENEKSB7CisJCQkJLyogQ2FycmllciBoYXMgYmVlbiBkZXRlY3RlZCAqLworCQkJCQlwcl9kYmcoImludGVycnVwdDogRENELT5oaWdoLlxuIik7CisJCQkJCXBvcnQtPnN0YXR1cyB8PSBJU0lfRENEOworCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPm9wZW5fd2FpdCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoaGVhZGVyICYgSVNJX0RDRCkKKwkJCQkJcG9ydC0+c3RhdHVzIHw9IElTSV9EQ0Q7CisJCQkJZWxzZQorCQkJCQlwb3J0LT5zdGF0dXMgJj0gfklTSV9EQ0Q7CisJCQl9CisKKwkJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0NUU19GTE9XKSB7CisJCQkJaWYgKHBvcnQtPnR0eS0+aHdfc3RvcHBlZCkgeworCQkJCQlpZiAoaGVhZGVyICYgSVNJX0NUUykgeworCQkJCQkJcG9ydC0+dHR5LT5od19zdG9wcGVkID0gMDsKKwkJCQkJCS8qIHN0YXJ0IHR4IGluZyAqLworCQkJCQkJcG9ydC0+c3RhdHVzIHw9IChJU0lfVFhPSworCQkJCQkJCXwgSVNJX0NUUyk7CisJCQkJCQlzY2hlZHVsZV93b3JrKCZwb3J0LT5iaF90cXVldWUpOwogCQkJCQl9CisJCQkJfSBlbHNlIGlmICghKGhlYWRlciAmIElTSV9DVFMpKSB7CisJCQkJCXBvcnQtPnR0eS0+aHdfc3RvcHBlZCA9IDE7CisJCQkJCS8qIHN0b3AgdHggaW5nICovCisJCQkJCXBvcnQtPnN0YXR1cyAmPSB+KElTSV9UWE9LIHwgSVNJX0NUUyk7CiAJCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoaGVhZGVyICYgSVNJX0NUUykgCi0JCQkJCQlwb3J0LT5zdGF0dXMgfD0gSVNJX0NUUzsKLQkJCQkJZWxzZQotCQkJCQkJcG9ydC0+c3RhdHVzICY9IH5JU0lfQ1RTOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoaGVhZGVyICYgSVNJX0RTUikgCi0JCQkJCXBvcnQtPnN0YXR1cyB8PSBJU0lfRFNSOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoaGVhZGVyICYgSVNJX0NUUykKKwkJCQkJcG9ydC0+c3RhdHVzIHw9IElTSV9DVFM7CiAJCQkJZWxzZQotCQkJCQlwb3J0LT5zdGF0dXMgJj0gfklTSV9EU1I7Ci0JCQkJCi0JCQkJaWYgKGhlYWRlciAmIElTSV9SSSkgCi0JCQkJCXBvcnQtPnN0YXR1cyB8PSBJU0lfUkk7Ci0JCQkJZWxzZQotCQkJCQlwb3J0LT5zdGF0dXMgJj0gfklTSV9SSTsJCQkJCQkKLQkJCQkKLQkJCQlicmVhazsKLQkJCQkKLQkJCWNhc2UgMToJLyogUmVjZWl2ZWQgQnJlYWsgISEhCSAqLwotCQkJCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkKLQkJCQkJYnJlYWs7Ci0JCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9CUkVBSzsKLQkJCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gMDsKLQkJCQl0dHktPmZsaXAuY291bnQrKzsKLQkJCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TQUspCi0JCQkJCWRvX1NBSyh0dHkpOwotCQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmssIDEpOwotCQkJCWJyZWFrOwotCQkJCQotCQkJY2FzZSAyOgkvKiBTdGF0aXN0aWNzCQkgKi8KLQkJCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBpc2ljb21faW50ZXJydXB0OiBzdGF0cyEhIS5cbiIpOwkJCQotCQkJCWJyZWFrOwotCQkJCQotCQkJZGVmYXVsdDoKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJJU0lDT006IEludHI6IFVua25vd24gY29kZSBpbiBzdGF0dXMgcGFja2V0LlxuIik7Ci0JCQkJYnJlYWs7Ci0JCX0JIAotCX0KLQllbHNlIHsJCQkJLyogRGF0YSAgIFBhY2tldCAqLwotCQljb3VudCA9IG1pbl90KHVuc2lnbmVkIHNob3J0LCBieXRlX2NvdW50LCAoVFRZX0ZMSVBCVUZfU0laRSAtIHR0eS0+ZmxpcC5jb3VudCkpOwotI2lmZGVmIElTSUNPTV9ERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBJbnRyOiBDYW4gcnggJWQgb2YgJWQgYnl0ZXMuXG4iLCAKLQkJCQkJY291bnQsIGJ5dGVfY291bnQpOwotI2VuZGlmCQkJCisJCQkJCXBvcnQtPnN0YXR1cyAmPSB+SVNJX0NUUzsKKwkJCX0KKworCQkJaWYgKGhlYWRlciAmIElTSV9EU1IpCisJCQkJcG9ydC0+c3RhdHVzIHw9IElTSV9EU1I7CisJCQllbHNlCisJCQkJcG9ydC0+c3RhdHVzICY9IH5JU0lfRFNSOworCisJCQlpZiAoaGVhZGVyICYgSVNJX1JJKQorCQkJCXBvcnQtPnN0YXR1cyB8PSBJU0lfUkk7CisJCQllbHNlCisJCQkJcG9ydC0+c3RhdHVzICY9IH5JU0lfUkk7CisKKwkJCWJyZWFrOworCisJCWNhc2UgMToJLyogUmVjZWl2ZWQgQnJlYWsgISEhICovCisJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9CUkVBSyk7CisJCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TQUspCisJCQkJZG9fU0FLKHR0eSk7CisJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCQkJYnJlYWs7CisKKwkJY2FzZSAyOgkvKiBTdGF0aXN0aWNzCQkgKi8KKwkJCXByX2RiZygiaXNpY29tX2ludGVycnVwdDogc3RhdHMhISEuXG4iKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcl9kYmcoIkludHI6IFVua25vd24gY29kZSBpbiBzdGF0dXMgcGFja2V0LlxuIik7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CQkJCS8qIERhdGEgICBQYWNrZXQgKi8KKworCQljb3VudCA9IHR0eV9wcmVwYXJlX2ZsaXBfc3RyaW5nKHR0eSwgJnJwLCBieXRlX2NvdW50ICYgfjEpOworCQlwcl9kYmcoIkludHI6IENhbiByeCAlZCBvZiAlZCBieXRlcy5cbiIsIGNvdW50LCBieXRlX2NvdW50KTsKIAkJd29yZF9jb3VudCA9IGNvdW50ID4+IDE7Ci0JCWluc3coYmFzZSwgdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciwgd29yZF9jb3VudCk7Ci0JCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgKz0gKHdvcmRfY291bnQgPDwgMSk7CQkKKwkJaW5zdyhiYXNlLCBycCwgd29yZF9jb3VudCk7CiAJCWJ5dGVfY291bnQgLT0gKHdvcmRfY291bnQgPDwgMSk7CiAJCWlmIChjb3VudCAmIDB4MDAwMSkgewotCQkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IChjaGFyKShpbncoYmFzZSkgJiAweGZmKTsKKwkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgIGludyhiYXNlKSAmIDB4ZmYsCisJCQkJVFRZX05PUk1BTCk7CiAJCQlieXRlX2NvdW50IC09IDI7Ci0JCX0JCi0JCW1lbXNldCh0dHktPmZsaXAuZmxhZ19idWZfcHRyLCAwLCBjb3VudCk7Ci0JCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgKz0gY291bnQ7Ci0JCXR0eS0+ZmxpcC5jb3VudCArPSBjb3VudDsKLQkJCisJCX0KIAkJaWYgKGJ5dGVfY291bnQgPiAwKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBJbnRyKDB4JXg6JWQpOiBGbGlwIGJ1ZmZlciBvdmVyZmxvdyEgZHJvcHBpbmcgYnl0ZXMuLi5cbiIsCi0JCQkJCWJhc2UsIGNoYW5uZWwrMSk7CisJCQlwcl9kYmcoIkludHIoMHglbHg6JWQpOiBGbGlwIGJ1ZmZlciBvdmVyZmxvdyEgZHJvcHBpbmcgIgorCQkJCSJieXRlcy4uLlxuIiwgYmFzZSwgY2hhbm5lbCArIDEpOwogCQkJd2hpbGUoYnl0ZV9jb3VudCA+IDApIHsgLyogZHJhaW4gb3V0IHVucmVhZCB4dHJhIGRhdGEgKi8KIAkJCQlpbncoYmFzZSk7CiAJCQkJYnl0ZV9jb3VudCAtPSAyOwogCQkJfQogCQl9Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmssIDEpOworCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCX0KIAlpZiAoY2FyZC0+aXNhID09IFlFUykKIAkJQ2xlYXJJbnRlcnJ1cHQoYmFzZSk7CiAJZWxzZQotCQlvdXR3KDB4MDAwMCwgYmFzZSsweDA0KTsgLyogZW5hYmxlIGludGVycnVwdHMgKi8JCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfSAKKwkJb3V0dygweDAwMDAsIGJhc2UrMHgwNCk7IC8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCiAKLXN0YXRpYyB2b2lkIGlzaWNvbV9jb25maWdfcG9ydChzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0KQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgaXNpY29tX2NvbmZpZ19wb3J0KHN0cnVjdCBpc2lfcG9ydCAqcG9ydCkKIHsKLQlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHk7CisJc3RydWN0IGlzaV9ib2FyZCAqY2FyZCA9IHBvcnQtPmNhcmQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAl1bnNpZ25lZCBsb25nIGJhdWQ7Ci0JdW5zaWduZWQgc2hvcnQgY2hhbm5lbF9zZXR1cCwgYmFzZSA9IGNhcmQtPmJhc2U7Ci0JdW5zaWduZWQgc2hvcnQgY2hhbm5lbCA9IHBvcnQtPmNoYW5uZWwsIHNoaWZ0X2NvdW50ID0gY2FyZC0+c2hpZnRfY291bnQ7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gY2FyZC0+YmFzZTsKKwl1MTYgY2hhbm5lbF9zZXR1cCwgY2hhbm5lbCA9IHBvcnQtPmNoYW5uZWwsCisJCXNoaWZ0X2NvdW50ID0gY2FyZC0+c2hpZnRfY291bnQ7CiAJdW5zaWduZWQgY2hhciBmbG93X2N0cmw7Ci0JCisKIAlpZiAoISh0dHkgPSBwb3J0LT50dHkpIHx8ICF0dHktPnRlcm1pb3MpCiAJCXJldHVybjsKIAliYXVkID0gQ19CQVVEKHR0eSk7CiAJaWYgKGJhdWQgJiBDQkFVREVYKSB7CiAJCWJhdWQgJj0gfkNCQVVERVg7Ci0JCQorCiAJCS8qICBpZiBDQkFVREVYIGJpdCBpcyBvbiBhbmQgdGhlIGJhdWQgaXMgc2V0IHRvIGVpdGhlciA1MCBvciA3NQogCQkgKiAgdGhlbiB0aGUgY2FyZCBpcyBwcm9ncmFtbWVkIGZvciA1Ny42S2JwcyBvciAxMTVLYnBzCiAJCSAqICByZXNwZWN0aXZlbHkuCi0JCSAqLyAgIAotCQkgCisJCSAqLworCiAJCWlmIChiYXVkIDwgMSB8fCBiYXVkID4gMikKIAkJCXBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmPSB+Q0JBVURFWDsKIAkJZWxzZQogCQkJYmF1ZCArPSAxNTsKLQl9CQorCX0KIAlpZiAoYmF1ZCA9PSAxNSkgewotCQotCQkvKiAgdGhlIEFTWU5DX1NQRF9ISSBhbmQgQVNZTkNfU1BEX1ZISSBvcHRpb25zIGFyZSBzZXQgCisKKwkJLyogIHRoZSBBU1lOQ19TUERfSEkgYW5kIEFTWU5DX1NQRF9WSEkgb3B0aW9ucyBhcmUgc2V0CiAJCSAqICBieSB0aGUgc2V0X3NlcmlhbF9pbmZvIGlvY3RsIC4uLiB0aGlzIGlzIGRvbmUgYnkKIAkJICogIHRoZSAnc2V0c2VyaWFsJyB1dGlsaXR5LgotCQkgKi8gIAotCQkJCisJCSAqLworCiAJCWlmICgocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQotCQkJYmF1ZCsrOyAgICAgLyogIDU3LjYgS2JwcyAqLworCQkJYmF1ZCsrOyAvKiAgNTcuNiBLYnBzICovCiAJCWlmICgocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1ZISSkKLQkJCWJhdWQgKz0yOyAgIC8qICAxMTUgIEticHMgKi8JIAorCQkJYmF1ZCArPTI7IC8qICAxMTUgIEticHMgKi8KIAl9CiAJaWYgKGxpbnV4Yl90b19pc2liW2JhdWRdID09IC0xKSB7CiAJCS8qIGhhbmcgdXAgKi8KLQkgCWRyb3BfZHRyKHBvcnQpOwotCSAJcmV0dXJuOwotCX0JCi0JZWxzZSAgCisJCWRyb3BfZHRyKHBvcnQpOworCQlyZXR1cm47CisJfQorCWVsc2UKIAkJcmFpc2VfZHRyKHBvcnQpOwotCQkKKwogCWlmIChsb2NrX2NhcmQoY2FyZCkpIHsKIAkJb3V0dygweDgwMDAgfCAoY2hhbm5lbCA8PCBzaGlmdF9jb3VudCkgfDB4MDMsIGJhc2UpOwogCQlvdXR3KGxpbnV4Yl90b19pc2liW2JhdWRdIDw8IDggfCAweDAzLCBiYXNlKTsKIAkJY2hhbm5lbF9zZXR1cCA9IDA7CiAJCXN3aXRjaChDX0NTSVpFKHR0eSkpIHsKLQkJCWNhc2UgQ1M1OgotCQkJCWNoYW5uZWxfc2V0dXAgfD0gSVNJQ09NX0NTNTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ1M2OgotCQkJCWNoYW5uZWxfc2V0dXAgfD0gSVNJQ09NX0NTNjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ1M3OgotCQkJCWNoYW5uZWxfc2V0dXAgfD0gSVNJQ09NX0NTNzsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ1M4OgotCQkJCWNoYW5uZWxfc2V0dXAgfD0gSVNJQ09NX0NTODsKLQkJCQlicmVhazsKKwkJY2FzZSBDUzU6CisJCQljaGFubmVsX3NldHVwIHw9IElTSUNPTV9DUzU7CisJCQlicmVhazsKKwkJY2FzZSBDUzY6CisJCQljaGFubmVsX3NldHVwIHw9IElTSUNPTV9DUzY7CisJCQlicmVhazsKKwkJY2FzZSBDUzc6CisJCQljaGFubmVsX3NldHVwIHw9IElTSUNPTV9DUzc7CisJCQlicmVhazsKKwkJY2FzZSBDUzg6CisJCQljaGFubmVsX3NldHVwIHw9IElTSUNPTV9DUzg7CisJCQlicmVhazsKIAkJfQotCQkJCisKIAkJaWYgKENfQ1NUT1BCKHR0eSkpCiAJCQljaGFubmVsX3NldHVwIHw9IElTSUNPTV8yU0I7CiAJCWlmIChDX1BBUkVOQih0dHkpKSB7CiAJCQljaGFubmVsX3NldHVwIHw9IElTSUNPTV9FVlBBUjsKIAkJCWlmIChDX1BBUk9ERCh0dHkpKQotCQkJCWNoYW5uZWxfc2V0dXAgfD0gSVNJQ09NX09EUEFSOwkKKwkJCQljaGFubmVsX3NldHVwIHw9IElTSUNPTV9PRFBBUjsKIAkJfQotCQlvdXR3KGNoYW5uZWxfc2V0dXAsIGJhc2UpOwkKKwkJb3V0dyhjaGFubmVsX3NldHVwLCBiYXNlKTsKIAkJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKLQkJdW5sb2NrX2NhcmQoY2FyZCk7CQotCX0JCisJCXVubG9ja19jYXJkKGNhcmQpOworCX0KIAlpZiAoQ19DTE9DQUwodHR5KSkKIAkJcG9ydC0+ZmxhZ3MgJj0gfkFTWU5DX0NIRUNLX0NEOwogCWVsc2UKLQkJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfQ0hFQ0tfQ0Q7CQotCQorCQlwb3J0LT5mbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKKwogCS8qIGZsb3cgY29udHJvbCBzZXR0aW5ncyAuLi4qLwogCWZsb3dfY3RybCA9IDA7CiAJcG9ydC0+ZmxhZ3MgJj0gfkFTWU5DX0NUU19GTE9XOwogCWlmIChDX0NSVFNDVFModHR5KSkgewogCQlwb3J0LT5mbGFncyB8PSBBU1lOQ19DVFNfRkxPVzsKIAkJZmxvd19jdHJsIHw9IElTSUNPTV9DVFNSVFM7Ci0JfQkKLQlpZiAoSV9JWE9OKHR0eSkpCQorCX0KKwlpZiAoSV9JWE9OKHR0eSkpCiAJCWZsb3dfY3RybCB8PSBJU0lDT01fUkVTUE9ORF9YT05YT0ZGOwogCWlmIChJX0lYT0ZGKHR0eSkpCi0JCWZsb3dfY3RybCB8PSBJU0lDT01fSU5JVElBVEVfWE9OWE9GRjsJCi0JCQorCQlmbG93X2N0cmwgfD0gSVNJQ09NX0lOSVRJQVRFX1hPTlhPRkY7CisKIAlpZiAobG9ja19jYXJkKGNhcmQpKSB7CiAJCW91dHcoMHg4MDAwIHwgKGNoYW5uZWwgPDwgc2hpZnRfY291bnQpIHwweDA0LCBiYXNlKTsKIAkJb3V0dyhmbG93X2N0cmwgPDwgOCB8IDB4MDUsIGJhc2UpOwpAQCAtMTA1NiwyMiArODE2LDIyIEBACiAJCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CiAJCXVubG9ja19jYXJkKGNhcmQpOwogCX0KLQkKKwogCS8qCXJ4IGVuYWJsZWQgLT4gZW5hYmxlIHBvcnQgZm9yIHJ4IG9uIHRoZSBjYXJkCSovCiAJaWYgKENfQ1JFQUQodHR5KSkgewogCQljYXJkLT5wb3J0X3N0YXR1cyB8PSAoMSA8PCBjaGFubmVsKTsKIAkJb3V0dyhjYXJkLT5wb3J0X3N0YXR1cywgYmFzZSArIDB4MDIpOwogCX0KIH0KLSAKLS8qIG9wZW4gZXQgYWxsICovIAogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXNpY29tX3NldHVwX2JvYXJkKHN0cnVjdCBpc2lfYm9hcmQgKiBicCkKKy8qIG9wZW4gZXQgYWxsICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc2ljb21fc2V0dXBfYm9hcmQoc3RydWN0IGlzaV9ib2FyZCAqYnApCiB7CiAJaW50IGNoYW5uZWw7Ci0Jc3RydWN0IGlzaV9wb3J0ICogcG9ydDsKKwlzdHJ1Y3QgaXNpX3BvcnQgKnBvcnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+Y2FyZF9sb2NrLCBmbGFncyk7CiAJaWYgKGJwLT5zdGF0dXMgJiBCT0FSRF9BQ1RJVkUpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmNhcmRfbG9jaywgZmxhZ3MpOwpAQCAtMTA4MCw1MyArODQwLDU0IEBACiAJcG9ydCA9IGJwLT5wb3J0czsKIAlicC0+c3RhdHVzIHw9IEJPQVJEX0FDVElWRTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+Y2FyZF9sb2NrLCBmbGFncyk7Ci0JZm9yKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgYnAtPnBvcnRfY291bnQ7IGNoYW5uZWwrKywgcG9ydCsrKQorCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBicC0+cG9ydF9jb3VudDsgY2hhbm5lbCsrLCBwb3J0KyspCiAJCWRyb3BfZHRyX3J0cyhwb3J0KTsKIAlyZXR1cm47CiB9Ci0gCi1zdGF0aWMgaW50IGlzaWNvbV9zZXR1cF9wb3J0KHN0cnVjdCBpc2lfcG9ydCAqIHBvcnQpCisKK3N0YXRpYyBpbnQgaXNpY29tX3NldHVwX3BvcnQoc3RydWN0IGlzaV9wb3J0ICpwb3J0KQogewotCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKKwlzdHJ1Y3QgaXNpX2JvYXJkICpjYXJkID0gcG9ydC0+Y2FyZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQorCiAJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKIAkJcmV0dXJuIDA7CiAJfQogCWlmICghcG9ydC0+eG1pdF9idWYpIHsKIAkJdW5zaWduZWQgbG9uZyBwYWdlOwotCQkKKwogCQlpZiAoIShwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpKSkKIAkJCXJldHVybiAtRU5PTUVNOwotCQkKKwogCQlpZiAocG9ydC0+eG1pdF9idWYpIHsKIAkJCWZyZWVfcGFnZShwYWdlKTsKIAkJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAJCX0KLQkJcG9ydC0+eG1pdF9idWYgPSAodW5zaWduZWQgY2hhciAqKSBwYWdlOwkKLQl9CQorCQlwb3J0LT54bWl0X2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHBhZ2U7CisJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOwogCWlmIChwb3J0LT50dHkpCiAJCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZwb3J0LT50dHktPmZsYWdzKTsKIAlpZiAocG9ydC0+Y291bnQgPT0gMSkKIAkJY2FyZC0+Y291bnQrKzsKLQkJCisKIAlwb3J0LT54bWl0X2NudCA9IHBvcnQtPnhtaXRfaGVhZCA9IHBvcnQtPnhtaXRfdGFpbCA9IDA7Ci0JCisKIAkvKglkaXNjYXJkIGFueSByZXNpZHVhbCBkYXRhCSovCiAJa2lsbF9xdWV1ZShwb3J0LCBJU0lDT01fS0lMTFRYIHwgSVNJQ09NX0tJTExSWCk7Ci0JCisKIAlpc2ljb21fY29uZmlnX3BvcnQocG9ydCk7CiAJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7Ci0JCi0JcmV0dXJuIDA7CQkKLX0gCi0gCi1zdGF0aWMgaW50IGJsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwLCBzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0KSAKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwlzdHJ1Y3QgaXNpX3BvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOworCXN0cnVjdCBpc2lfYm9hcmQgKmNhcmQgPSBwb3J0LT5jYXJkOwogCWludCBkb19jbG9jYWwgPSAwLCByZXR2YWw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKQEAgLTExMzQsMzAgKzg5NSwyNyBAQAogCS8qIGJsb2NrIGlmIHBvcnQgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgY2xvc2VkICovCiAKIAlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCBwb3J0LT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpIHsKLSNpZmRlZiBJU0lDT01fREVCVUcJCi0JCXByaW50ayhLRVJOX0RFQlVHICJJU0lDT006IGJsb2NrX3RpbF9yZWFkeTogY2xvc2UgaW4gcHJvZ3Jlc3MuXG4iKTsKLSNlbmRpZgkJCisJCXByX2RiZygiYmxvY2tfdGlsX3JlYWR5OiBjbG9zZSBpbiBwcm9ncmVzcy5cbiIpOwogCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZwb3J0LT5jbG9zZV93YWl0KTsKIAkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKIAkJCXJldHVybiAtRUFHQUlOOwogCQllbHNlCiAJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCX0KLQkKKwogCS8qIGlmIG5vbi1ibG9ja2luZyBtb2RlIGlzIHNldCAuLi4gKi8KLQkKLQlpZiAoKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fCAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpKSB7Ci0jaWZkZWYgSVNJQ09NX0RFQlVHCQotCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBibG9ja190aWxfcmVhZHk6IG5vbi1ibG9jayBtb2RlLlxuIik7Ci0jZW5kaWYJCQorCisJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgfHwKKwkJCSh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkpIHsKKwkJcHJfZGJnKCJibG9ja190aWxfcmVhZHk6IG5vbi1ibG9jayBtb2RlLlxuIik7CiAJCXBvcnQtPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7Ci0JCXJldHVybiAwOwkKLQl9CQotCQorCQlyZXR1cm4gMDsKKwl9CisKIAlpZiAoQ19DTE9DQUwodHR5KSkKIAkJZG9fY2xvY2FsID0gMTsKLQkKLQkvKiBibG9jayB3YWl0aW5nIGZvciBEQ0QgdG8gYmUgYXNzZXJ0ZWQsIGFuZCB3aGlsZSAKKworCS8qIGJsb2NrIHdhaXRpbmcgZm9yIERDRCB0byBiZSBhc3NlcnRlZCwgYW5kIHdoaWxlCiAJCQkJCQljYWxsb3V0IGRldiBpcyBidXN5ICovCiAJcmV0dmFsID0gMDsKIAlhZGRfd2FpdF9xdWV1ZSgmcG9ydC0+b3Blbl93YWl0LCAmd2FpdCk7CkBAIC0xMTY3LDI3ICs5MjUsMjcgQEAKIAkJcG9ydC0+Y291bnQtLTsKIAlwb3J0LT5ibG9ja2VkX29wZW4rKzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKLQkKKwogCXdoaWxlICgxKSB7CiAJCXJhaXNlX2R0cl9ydHMocG9ydCk7CiAKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgIShwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkgeyAJCisJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8ICEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKIAkJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCiAJCQkJcmV0dmFsID0gLUVBR0FJTjsKIAkJCWVsc2UKIAkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CiAJCQlicmVhazsKLQkJfQkKKwkJfQogCQlpZiAoIShwb3J0LT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpICYmCi0JCSAgICAoZG9fY2xvY2FsIHx8IChwb3J0LT5zdGF0dXMgJiBJU0lfRENEKSkpIHsKKwkJCQkoZG9fY2xvY2FsIHx8IChwb3J0LT5zdGF0dXMgJiBJU0lfRENEKSkpIHsKIAkJCWJyZWFrOwotCQl9CQorCQl9CiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewogCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOwogCQkJYnJlYWs7CiAJCX0KLQkJc2NoZWR1bGUoKTsJCQorCQlzY2hlZHVsZSgpOwogCX0KIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCXJlbW92ZV93YWl0X3F1ZXVlKCZwb3J0LT5vcGVuX3dhaXQsICZ3YWl0KTsKQEAgLTEyMDEsMTEgKzk1OSwxMSBAQAogCXBvcnQtPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CiAJcmV0dXJuIDA7CiB9Ci0gCi1zdGF0aWMgaW50IGlzaWNvbV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCisKK3N0YXRpYyBpbnQgaXNpY29tX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0Jc3RydWN0IGlzaV9wb3J0ICogcG9ydDsKLQlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZDsKKwlzdHJ1Y3QgaXNpX3BvcnQgKnBvcnQ7CisJc3RydWN0IGlzaV9ib2FyZCAqY2FyZDsKIAl1bnNpZ25lZCBpbnQgbGluZSwgYm9hcmQ7CiAJaW50IGVycm9yOwogCkBAIC0xMjE0LDIwICs5NzIsMjAgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJYm9hcmQgPSBCT0FSRChsaW5lKTsKIAljYXJkID0gJmlzaV9jYXJkW2JvYXJkXTsKLQkKKwogCWlmICghKGNhcmQtPnN0YXR1cyAmIEZJUk1XQVJFX0xPQURFRCkpCiAJCXJldHVybiAtRU5PREVWOwotCQorCiAJLyogIG9wZW4gb24gYSBwb3J0IGdyZWF0ZXIgdGhhbiB0aGUgcG9ydCBjb3VudCBmb3IgdGhlIGNhcmQgISEhICovCiAJaWYgKGxpbmUgPiAoKGJvYXJkICogMTYpICsgY2FyZC0+cG9ydF9jb3VudCAtIDEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXBvcnQgPSAmaXNpX3BvcnRzW2xpbmVdOwkKKwlwb3J0ID0gJmlzaV9wb3J0c1tsaW5lXTsKIAlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV9vcGVuIikpCiAJCXJldHVybiAtRU5PREVWOwotCQkKLQlpc2ljb21fc2V0dXBfYm9hcmQoY2FyZCk7CQkKLQkKKworCWlzaWNvbV9zZXR1cF9ib2FyZChjYXJkKTsKKwogCXBvcnQtPmNvdW50Kys7CiAJdHR5LT5kcml2ZXJfZGF0YSA9IHBvcnQ7CiAJcG9ydC0+dHR5ID0gdHR5OwpAQCAtMTIzNiwxMiArOTk0LDEyIEBACiAJaWYgKChlcnJvciA9IGJsb2NrX3RpbF9yZWFkeSh0dHksIGZpbHAsIHBvcnQpKSE9MCkKIAkJcmV0dXJuIGVycm9yOwogCi0JcmV0dXJuIDA7ICAgICAgCQkKKwlyZXR1cm4gMDsKIH0KLSAKKwogLyogY2xvc2UgZXQgYWxsICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpc2ljb21fc2h1dGRvd25fYm9hcmQoc3RydWN0IGlzaV9ib2FyZCAqIGJwKQorc3RhdGljIGlubGluZSB2b2lkIGlzaWNvbV9zaHV0ZG93bl9ib2FyZChzdHJ1Y3QgaXNpX2JvYXJkICpicCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xMjUyLDE1ICsxMDEwLDE1IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmNhcmRfbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBpc2ljb21fc2h1dGRvd25fcG9ydChzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0KQorc3RhdGljIHZvaWQgaXNpY29tX3NodXRkb3duX3BvcnQoc3RydWN0IGlzaV9wb3J0ICpwb3J0KQogewotCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eTsJCisJc3RydWN0IGlzaV9ib2FyZCAqY2FyZCA9IHBvcnQtPmNhcmQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQorCiAJdHR5ID0gcG9ydC0+dHR5OwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CiAJaWYgKCEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CiAJCXJldHVybjsKQEAgLTEyNjgsOTMgKzEwMjYsOTEgQEAKIAlpZiAocG9ydC0+eG1pdF9idWYpIHsKIAkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwb3J0LT54bWl0X2J1Zik7CiAJCXBvcnQtPnhtaXRfYnVmID0gTlVMTDsKLQl9CQorCX0KIAlwb3J0LT5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7CiAJLyogM3JkIE9jdG9iZXIgMjAwMCA6IFZpbmF5YWsgUCBSaXNidWQgKi8KIAlwb3J0LT50dHkgPSBOVUxMOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOwotCQorCiAJLypGaXggZG9uZSBieSBBbmlsIC5TIG9uIDMwLTA0LTIwMDEKIAlyZW1vdGUgbG9naW4gdGhyb3VnaCBpc2kgcG9ydCBoYXMgZHRyIHRvZ2dsZSBwcm9ibGVtCiAJZHVlIHRvIHdoaWNoIHRoZSBjYXJyaWVyIGRyb3BzIGJlZm9yZSB0aGUgcGFzc3dvcmQgcHJvbXB0Ci0JYXBwZWFycyBvbiB0aGUgcmVtb3RlIGVuZC4gTm93IHdlIGRyb3AgdGhlIGR0ciBvbmx5IGlmIHRoZSAKKwlhcHBlYXJzIG9uIHRoZSByZW1vdGUgZW5kLiBOb3cgd2UgZHJvcCB0aGUgZHRyIG9ubHkgaWYgdGhlCiAJSFVQQ0woSGFuZ3VwIG9uIGNsb3NlKSBmbGFnIGlzIHNldCBmb3IgdGhlIHR0eSovCi0JCi0JaWYgKENfSFVQQ0wodHR5KSkgCisKKwlpZiAoQ19IVVBDTCh0dHkpKQogCQkvKiBkcm9wIGR0ciBvbiB0aGlzIHBvcnQgKi8KIAkJZHJvcF9kdHIocG9ydCk7Ci0JCQotCS8qIGFueSBvdGhlciBwb3J0IHVuaW5pdHMgICovIAorCisJLyogYW55IG90aGVyIHBvcnQgdW5pbml0cyAgKi8KIAlpZiAodHR5KQogCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOwotCQorCiAJaWYgKC0tY2FyZC0+Y291bnQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJJU0lDT006IGlzaWNvbV9zaHV0ZG93bl9wb3J0OiBiYWQgYm9hcmQoMHgleCkgY291bnQgJWQuXG4iLAorCQlwcl9kYmcoImlzaWNvbV9zaHV0ZG93bl9wb3J0OiBiYWQgYm9hcmQoMHglbHgpIGNvdW50ICVkLlxuIiwKIAkJCWNhcmQtPmJhc2UsIGNhcmQtPmNvdW50KTsKLQkJY2FyZC0+Y291bnQgPSAwOwkKKwkJY2FyZC0+Y291bnQgPSAwOwogCX0KLQkKLQkvKiBsYXN0IHBvcnQgd2FzIGNsb3NlZCAsIHNodXRkb3duIHRoYXQgYm9hZCB0b28gKi8KLQlpZihDX0hVUENMKHR0eSkpIHsKKworCS8qIGxhc3QgcG9ydCB3YXMgY2xvc2VkLCBzaHV0ZG93biB0aGF0IGJvYWQgdG9vICovCisJaWYgKENfSFVQQ0wodHR5KSkgewogCQlpZiAoIWNhcmQtPmNvdW50KQogCQkJaXNpY29tX3NodXRkb3duX2JvYXJkKGNhcmQpOwogCX0KIH0KIAotc3RhdGljIHZvaWQgaXNpY29tX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCitzdGF0aWMgdm9pZCBpc2ljb21fY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0Jc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7CisJc3RydWN0IGlzaV9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgaXNpX2JvYXJkICpjYXJkID0gcG9ydC0+Y2FyZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQorCiAJaWYgKCFwb3J0KQogCQlyZXR1cm47CiAJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21fY2xvc2UiKSkKIAkJcmV0dXJuOwotCQotI2lmZGVmIElTSUNPTV9ERUJVRwkJCi0JcHJpbnRrKEtFUk5fREVCVUcgIklTSUNPTTogQ2xvc2Ugc3RhcnQhISEuXG4iKTsKLSNlbmRpZgkKLQkKKworCXByX2RiZygiQ2xvc2Ugc3RhcnQhISEuXG4iKTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKIAlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KLQkKKwogCWlmICh0dHktPmNvdW50ID09IDEgJiYgcG9ydC0+Y291bnQgIT0gMSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJJU0lDT006KDB4JXgpIGlzaWNvbV9jbG9zZTogYmFkIHBvcnQgY291bnQiCi0JCQkidHR5LT5jb3VudCA9IDEJcG9ydCBjb3VudCA9ICVkLlxuIiwKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSVNJQ09NOigweCVseCkgaXNpY29tX2Nsb3NlOiBiYWQgcG9ydCAiCisJCQkiY291bnQgdHR5LT5jb3VudCA9IDEgcG9ydCBjb3VudCA9ICVkLlxuIiwKIAkJCWNhcmQtPmJhc2UsIHBvcnQtPmNvdW50KTsKIAkJcG9ydC0+Y291bnQgPSAxOwogCX0KIAlpZiAoLS1wb3J0LT5jb3VudCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSVNJQ09NOigweCV4KSBpc2ljb21fY2xvc2U6IGJhZCBwb3J0IGNvdW50IGZvciIKLQkJCSJjaGFubmVsJWQgPSAlZCIsIGNhcmQtPmJhc2UsIHBvcnQtPmNoYW5uZWwsIAorCQlwcmludGsoS0VSTl9XQVJOSU5HICJJU0lDT006KDB4JWx4KSBpc2ljb21fY2xvc2U6IGJhZCBwb3J0ICIKKwkJCSJjb3VudCBmb3IgY2hhbm5lbCVkID0gJWQiLCBjYXJkLT5iYXNlLCBwb3J0LT5jaGFubmVsLAogCQkJcG9ydC0+Y291bnQpOwotCQlwb3J0LT5jb3VudCA9IDA7CQorCQlwb3J0LT5jb3VudCA9IDA7CiAJfQotCQorCiAJaWYgKHBvcnQtPmNvdW50KSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm47Ci0JfSAJCisJfQogCXBvcnQtPmZsYWdzIHw9IEFTWU5DX0NMT1NJTkc7CiAJdHR5LT5jbG9zaW5nID0gMTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKLQkKKwogCWlmIChwb3J0LT5jbG9zaW5nX3dhaXQgIT0gQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUpCiAJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBwb3J0LT5jbG9zaW5nX3dhaXQpOwotCS8qIGluZGljYXRlIHRvIHRoZSBjYXJkIHRoYXQgbm8gbW9yZSBkYXRhIGNhbiBiZSByZWNlaXZlZCAKKwkvKiBpbmRpY2F0ZSB0byB0aGUgY2FyZCB0aGF0IG5vIG1vcmUgZGF0YSBjYW4gYmUgcmVjZWl2ZWQKIAkgICBvbiB0aGlzIHBvcnQgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7Ci0JaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsgICAKKwlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgewogCQljYXJkLT5wb3J0X3N0YXR1cyAmPSB+KDEgPDwgcG9ydC0+Y2hhbm5lbCk7CiAJCW91dHcoY2FyZC0+cG9ydF9zdGF0dXMsIGNhcmQtPmJhc2UgKyAweDAyKTsKLQl9CQorCX0KIAlpc2ljb21fc2h1dGRvd25fcG9ydChwb3J0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKLQkKKwogCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQogCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CiAJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CkBAIC0xMzY1LDY1ICsxMTIxLDY1IEBACiAJaWYgKHBvcnQtPmJsb2NrZWRfb3BlbikgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKIAkJaWYgKHBvcnQtPmNsb3NlX2RlbGF5KSB7Ci0jaWZkZWYgSVNJQ09NX0RFQlVHCQkJCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBzY2hlZHVsaW5nIHVudGlsIHRpbWUgb3V0LlxuIik7Ci0jZW5kaWYJCQkKLQkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MocG9ydC0+Y2xvc2VfZGVsYXkpKTsKKwkJCXByX2RiZygic2NoZWR1bGluZyB1bnRpbCB0aW1lIG91dC5cbiIpOworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoCisJCQkJamlmZmllc190b19tc2Vjcyhwb3J0LT5jbG9zZV9kZWxheSkpOwogCQl9CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5vcGVuX3dhaXQpOwotCX0JCisJfQogCXBvcnQtPmZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRSB8IEFTWU5DX0NMT1NJTkcpOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+Y2xvc2Vfd2FpdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CiB9CiAKIC8qIHdyaXRlIGV0IGFsbCAqLwotc3RhdGljIGludCBpc2ljb21fd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksCi0JCQljb25zdCB1bnNpZ25lZCBjaGFyICogYnVmLCBpbnQgY291bnQpCitzdGF0aWMgaW50IGlzaWNvbV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJaW50IGNvdW50KQogewotCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOworCXN0cnVjdCBpc2lfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlzaV9ib2FyZCAqY2FyZCA9IHBvcnQtPmNhcmQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgY250LCB0b3RhbCA9IDA7CiAKIAlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV93cml0ZSIpKQogCQlyZXR1cm4gMDsKLQkKLQlpZiAoIXR0eSB8fCAhcG9ydC0+eG1pdF9idWYgfHwgIXRtcF9idWYpCisKKwlpZiAoIXR0eSB8fCAhcG9ydC0+eG1pdF9idWYpCiAJCXJldHVybiAwOwotCQkKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKLQkKLQl3aGlsZSgxKSB7CQotCQljbnQgPSBtaW5fdChpbnQsIGNvdW50LCBtaW4oU0VSSUFMX1hNSVRfU0laRSAtIHBvcnQtPnhtaXRfY250IC0gMSwKLQkJCQkJICAgIFNFUklBTF9YTUlUX1NJWkUgLSBwb3J0LT54bWl0X2hlYWQpKTsKLQkJaWYgKGNudCA8PSAwKSAKKworCXdoaWxlKDEpIHsKKwkJY250ID0gbWluX3QoaW50LCBjb3VudCwgbWluKFNFUklBTF9YTUlUX1NJWkUgLSBwb3J0LT54bWl0X2NudAorCQkJCS0gMSwgU0VSSUFMX1hNSVRfU0laRSAtIHBvcnQtPnhtaXRfaGVhZCkpOworCQlpZiAoY250IDw9IDApCiAJCQlicmVhazsKLQkJCisKIAkJbWVtY3B5KHBvcnQtPnhtaXRfYnVmICsgcG9ydC0+eG1pdF9oZWFkLCBidWYsIGNudCk7Ci0JCXBvcnQtPnhtaXRfaGVhZCA9IChwb3J0LT54bWl0X2hlYWQgKyBjbnQpICYgKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKKwkJcG9ydC0+eG1pdF9oZWFkID0gKHBvcnQtPnhtaXRfaGVhZCArIGNudCkgJiAoU0VSSUFMX1hNSVRfU0laRQorCQkJLSAxKTsKIAkJcG9ydC0+eG1pdF9jbnQgKz0gY250OwogCQlidWYgKz0gY250OwogCQljb3VudCAtPSBjbnQ7CiAJCXRvdGFsICs9IGNudDsKLQl9CQkKKwl9CiAJaWYgKHBvcnQtPnhtaXRfY250ICYmICF0dHktPnN0b3BwZWQgJiYgIXR0eS0+aHdfc3RvcHBlZCkKIAkJcG9ydC0+c3RhdHVzIHw9IElTSV9UWE9LOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOwotCXJldHVybiB0b3RhbDsJCisJcmV0dXJuIHRvdGFsOwogfQogCiAvKiBwdXRfY2hhciBldCBhbGwgKi8KLXN0YXRpYyB2b2lkIGlzaWNvbV9wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgdW5zaWduZWQgY2hhciBjaCkKK3N0YXRpYyB2b2lkIGlzaWNvbV9wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQogewotCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IGlzaV9ib2FyZCAqIGNhcmQgPSBwb3J0LT5jYXJkOworCXN0cnVjdCBpc2lfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlzaV9ib2FyZCAqY2FyZCA9IHBvcnQtPmNhcmQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkKKwogCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX3B1dF9jaGFyIikpCiAJCXJldHVybjsKLQkKKwogCWlmICghdHR5IHx8ICFwb3J0LT54bWl0X2J1ZikKIAkJcmV0dXJuOwogCkBAIC0xNDMyLDcgKzExODgsNyBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KLQkKKwogCXBvcnQtPnhtaXRfYnVmW3BvcnQtPnhtaXRfaGVhZCsrXSA9IGNoOwogCXBvcnQtPnhtaXRfaGVhZCAmPSAoU0VSSUFMX1hNSVRfU0laRSAtIDEpOwogCXBvcnQtPnhtaXRfY250Kys7CkBAIC0xNDQwLDMwICsxMTk2LDMxIEBACiB9CiAKIC8qIGZsdXNoX2NoYXJzIGV0IGFsbCAqLwotc3RhdGljIHZvaWQgaXNpY29tX2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQorc3RhdGljIHZvaWQgaXNpY29tX2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0Jc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKLQkKKwlzdHJ1Y3QgaXNpX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCiAJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21fZmx1c2hfY2hhcnMiKSkKIAkJcmV0dXJuOwotCQotCWlmIChwb3J0LT54bWl0X2NudCA8PSAwIHx8IHR0eS0+c3RvcHBlZCB8fCB0dHktPmh3X3N0b3BwZWQgfHwgIXBvcnQtPnhtaXRfYnVmKQorCisJaWYgKHBvcnQtPnhtaXRfY250IDw9IDAgfHwgdHR5LT5zdG9wcGVkIHx8IHR0eS0+aHdfc3RvcHBlZCB8fAorCQkJIXBvcnQtPnhtaXRfYnVmKQogCQlyZXR1cm47Ci0JCQorCiAJLyogdGhpcyB0ZWxscyB0aGUgdHJhbnNtaXR0ZXIgdG8gY29uc2lkZXIgdGhpcyBwb3J0IGZvcgogCSAgIGRhdGEgb3V0cHV0IHRvIHRoZSBjYXJkIC4uLiB0aGF0J3MgdGhlIGJlc3Qgd2UgY2FuIGRvLiAqLwotCXBvcnQtPnN0YXR1cyB8PSBJU0lfVFhPSzsJCisJcG9ydC0+c3RhdHVzIHw9IElTSV9UWE9LOwogfQogCiAvKiB3cml0ZV9yb29tIGV0IGFsbCAqLwotc3RhdGljIGludCBpc2ljb21fd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3N0YXRpYyBpbnQgaXNpY29tX3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0ID0gKHN0cnVjdCBpc2lfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBpc2lfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaW50IGZyZWU7CiAKIAlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV93cml0ZV9yb29tIikpCiAJCXJldHVybiAwOwotCQorCiAJZnJlZSA9IFNFUklBTF9YTUlUX1NJWkUgLSBwb3J0LT54bWl0X2NudCAtIDE7CiAJaWYgKGZyZWUgPCAwKQogCQlmcmVlID0gMDsKQEAgLTE0NzEsMjMgKzEyMjgsMjQgQEAKIH0KIAogLyogY2hhcnNfaW5fYnVmZmVyIGV0IGFsbCAqLwotc3RhdGljIGludCBpc2ljb21fY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQorc3RhdGljIGludCBpc2ljb21fY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0Jc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgaXNpX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX2NoYXJzX2luX2J1ZmZlciIpKQogCQlyZXR1cm4gMDsKIAlyZXR1cm4gcG9ydC0+eG1pdF9jbnQ7CiB9CiAKIC8qIGlvY3RsIGV0IGFsbCAqLwotc3RhdGljIGlubGluZSB2b2lkIGlzaWNvbV9zZW5kX2JyZWFrKHN0cnVjdCBpc2lfcG9ydCAqIHBvcnQsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKQorc3RhdGljIGlubGluZSB2b2lkIGlzaWNvbV9zZW5kX2JyZWFrKHN0cnVjdCBpc2lfcG9ydCAqcG9ydCwKKwl1bnNpZ25lZCBsb25nIGxlbmd0aCkKIHsKLQlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7Ci0JdW5zaWduZWQgc2hvcnQgYmFzZSA9IGNhcmQtPmJhc2U7CQotCQotCWlmKCFsb2NrX2NhcmQoY2FyZCkpCisJc3RydWN0IGlzaV9ib2FyZCAqY2FyZCA9IHBvcnQtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gY2FyZC0+YmFzZTsKKworCWlmICghbG9ja19jYXJkKGNhcmQpKQogCQlyZXR1cm47Ci0JCQorCiAJb3V0dygweDgwMDAgfCAoKHBvcnQtPmNoYW5uZWwpIDw8IChjYXJkLT5zaGlmdF9jb3VudCkpIHwgMHgzLCBiYXNlKTsKIAlvdXR3KChsZW5ndGggJiAweGZmKSA8PCA4IHwgMHgwMCwgYmFzZSk7CiAJb3V0dygobGVuZ3RoICYgMHhmZjAwKSwgYmFzZSk7CkBAIC0xNDk4LDEzICsxMjU2LDEzIEBACiAKIHN0YXRpYyBpbnQgaXNpY29tX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlzaV9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAkvKiBqdXN0IHNlbmQgdGhlIHBvcnQgc3RhdHVzICovCi0JdW5zaWduZWQgc2hvcnQgc3RhdHVzID0gcG9ydC0+c3RhdHVzOworCXUxNiBzdGF0dXMgPSBwb3J0LT5zdGF0dXM7CiAKIAlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV9pb2N0bCIpKQogCQlyZXR1cm4gLUVOT0RFVjsKLQkKKwogCXJldHVybiAgKChzdGF0dXMgJiBJU0lfUlRTKSA/IFRJT0NNX1JUUyA6IDApIHwKIAkJKChzdGF0dXMgJiBJU0lfRFRSKSA/IFRJT0NNX0RUUiA6IDApIHwKIAkJKChzdGF0dXMgJiBJU0lfRENEKSA/IFRJT0NNX0NBUiA6IDApIHwKQEAgLTE1MTQsMTMgKzEyNzIsMTMgQEAKIH0KIAogc3RhdGljIGludCBpc2ljb21fdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCisJdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQogewotCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7Ci0JCisJc3RydWN0IGlzaV9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwogCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX2lvY3RsIikpCiAJCXJldHVybiAtRU5PREVWOwotCQorCiAJaWYgKHNldCAmIFRJT0NNX1JUUykKIAkJcmFpc2VfcnRzKHBvcnQpOwogCWlmIChzZXQgJiBUSU9DTV9EVFIpCkBAIC0xNTMyLDQ2ICsxMjkwLDQ2IEBACiAJCWRyb3BfZHRyKHBvcnQpOwogCiAJcmV0dXJuIDA7Ci19CQkJCit9CiAKLXN0YXRpYyBpbnQgaXNpY29tX3NldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0LAotCQkJCQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKmluZm8pCitzdGF0aWMgaW50IGlzaWNvbV9zZXRfc2VyaWFsX2luZm8oc3RydWN0IGlzaV9wb3J0ICpwb3J0LAorCXN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqaW5mbykKIHsKIAlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBuZXdpbmZvOwogCWludCByZWNvbmZpZ19wb3J0OwogCi0JaWYoY29weV9mcm9tX3VzZXIoJm5ld2luZm8sIGluZm8sIHNpemVvZihuZXdpbmZvKSkpCisJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdpbmZvLCBpbmZvLCBzaXplb2YobmV3aW5mbykpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQkJCi0JcmVjb25maWdfcG9ydCA9ICgocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgIT0gCi0JCQkgKG5ld2luZm8uZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykpOwotCQorCisJcmVjb25maWdfcG9ydCA9ICgocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgIT0KKwkJKG5ld2luZm8uZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykpOworCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CiAJCWlmICgobmV3aW5mby5jbG9zZV9kZWxheSAhPSBwb3J0LT5jbG9zZV9kZWxheSkgfHwKLQkJICAgIChuZXdpbmZvLmNsb3Npbmdfd2FpdCAhPSBwb3J0LT5jbG9zaW5nX3dhaXQpIHx8Ci0JCSAgICAoKG5ld2luZm8uZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spICE9IAotCQkgICAgIChwb3J0LT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykpKQorCQkJCShuZXdpbmZvLmNsb3Npbmdfd2FpdCAhPSBwb3J0LT5jbG9zaW5nX3dhaXQpIHx8CisJCQkJKChuZXdpbmZvLmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSAhPQorCQkJCShwb3J0LT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykpKQogCQkJcmV0dXJuIC1FUEVSTTsKIAkJcG9ydC0+ZmxhZ3MgPSAoKHBvcnQtPmZsYWdzICYgfiBBU1lOQ19VU1JfTUFTSykgfAogCQkJCShuZXdpbmZvLmZsYWdzICYgQVNZTkNfVVNSX01BU0spKTsKLQl9CQorCX0KIAllbHNlIHsKIAkJcG9ydC0+Y2xvc2VfZGVsYXkgPSBuZXdpbmZvLmNsb3NlX2RlbGF5OwotCQlwb3J0LT5jbG9zaW5nX3dhaXQgPSBuZXdpbmZvLmNsb3Npbmdfd2FpdDsgCi0JCXBvcnQtPmZsYWdzID0gKChwb3J0LT5mbGFncyAmIH5BU1lOQ19GTEFHUykgfCAKKwkJcG9ydC0+Y2xvc2luZ193YWl0ID0gbmV3aW5mby5jbG9zaW5nX3dhaXQ7CisJCXBvcnQtPmZsYWdzID0gKChwb3J0LT5mbGFncyAmIH5BU1lOQ19GTEFHUykgfAogCQkJCShuZXdpbmZvLmZsYWdzICYgQVNZTkNfRkxBR1MpKTsKIAl9CiAJaWYgKHJlY29uZmlnX3BvcnQpIHsKIAkJaXNpY29tX2NvbmZpZ19wb3J0KHBvcnQpOwogCX0KLQlyZXR1cm4gMDsJCSAKLX0JCQorCXJldHVybiAwOworfQogCi1zdGF0aWMgaW50IGlzaWNvbV9nZXRfc2VyaWFsX2luZm8oc3RydWN0IGlzaV9wb3J0ICogcG9ydCwgCi0JCQkJCXN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqaW5mbykKK3N0YXRpYyBpbnQgaXNpY29tX2dldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgaXNpX3BvcnQgKnBvcnQsCisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICppbmZvKQogewogCXN0cnVjdCBzZXJpYWxfc3RydWN0IG91dF9pbmZvOwotCQorCiAJbWVtc2V0KCZvdXRfaW5mbywgMCwgc2l6ZW9mKG91dF9pbmZvKSk7CiAvKglvdXRfaW5mby50eXBlID0gPyAqLwogCW91dF9pbmZvLmxpbmUgPSBwb3J0IC0gaXNpX3BvcnRzOwpAQCAtMTU4MSwxNSArMTMzOSwxNSBAQAogLyoJb3V0X2luZm8uYmF1ZF9iYXNlID0gPyAqLwogCW91dF9pbmZvLmNsb3NlX2RlbGF5ID0gcG9ydC0+Y2xvc2VfZGVsYXk7CiAJb3V0X2luZm8uY2xvc2luZ193YWl0ID0gcG9ydC0+Y2xvc2luZ193YWl0OwotCWlmKGNvcHlfdG9fdXNlcihpbmZvLCAmb3V0X2luZm8sIHNpemVvZihvdXRfaW5mbykpKQorCWlmIChjb3B5X3RvX3VzZXIoaW5mbywgJm91dF9pbmZvLCBzaXplb2Yob3V0X2luZm8pKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7Ci19CQkJCQkKK30KIAotc3RhdGljIGludCBpc2ljb21faW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCwKLQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKSAKK3N0YXRpYyBpbnQgaXNpY29tX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwLAorCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlzaV9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlpbnQgcmV0dmFsOwogCkBAIC0xNTk3LDEzOSArMTM1NSwxNDEgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlzd2l0Y2goY21kKSB7Ci0JCWNhc2UgVENTQlJLOgotCQkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOwotCQkJaWYgKHJldHZhbCkKLQkJCQlyZXR1cm4gcmV0dmFsOwotCQkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOwotCQkJaWYgKCFhcmcpCi0JCQkJaXNpY29tX3NlbmRfYnJlYWsocG9ydCwgSFovNCk7Ci0JCQlyZXR1cm4gMDsKLQkJCQotCQljYXNlIFRDU0JSS1A6CQotCQkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOwotCQkJaWYgKHJldHZhbCkKLQkJCQlyZXR1cm4gcmV0dmFsOwotCQkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOwotCQkJaXNpY29tX3NlbmRfYnJlYWsocG9ydCwgYXJnID8gYXJnICogKEhaLzEwKSA6IEhaLzQpOwotCQkJcmV0dXJuIDA7Ci0JCQkKLQkJY2FzZSBUSU9DR1NPRlRDQVI6Ci0JCQlyZXR1cm4gcHV0X3VzZXIoQ19DTE9DQUwodHR5KSA/IDEgOiAwLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmdwKTsKLQkJCQotCQljYXNlIFRJT0NTU09GVENBUjoKLQkJCWlmKGdldF91c2VyKGFyZywgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZ3ApKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJdHR5LT50ZXJtaW9zLT5jX2NmbGFnID0KLQkJCQkoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIH5DTE9DQUwpIHwKLQkJCQkoYXJnID8gQ0xPQ0FMIDogMCkpOwotCQkJcmV0dXJuIDA7CQotCQkJCi0JCWNhc2UgVElPQ0dTRVJJQUw6Ci0JCQlyZXR1cm4gaXNpY29tX2dldF9zZXJpYWxfaW5mbyhwb3J0LCBhcmdwKTsKLQkJCi0JCWNhc2UgVElPQ1NTRVJJQUw6Ci0JCQlyZXR1cm4gaXNpY29tX3NldF9zZXJpYWxfaW5mbyhwb3J0LCBhcmdwKTsKLQkJCQkJCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwkJCQkJCQorCWNhc2UgVENTQlJLOgorCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCWlmICghYXJnKQorCQkJaXNpY29tX3NlbmRfYnJlYWsocG9ydCwgSFovNCk7CisJCXJldHVybiAwOworCisJY2FzZSBUQ1NCUktQOgorCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCWlzaWNvbV9zZW5kX2JyZWFrKHBvcnQsIGFyZyA/IGFyZyAqIChIWi8xMCkgOiBIWi80KTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFRJT0NHU09GVENBUjoKKwkJcmV0dXJuIHB1dF91c2VyKENfQ0xPQ0FMKHR0eSkgPyAxIDogMCwKKwkJCQkodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmdwKTsKKworCWNhc2UgVElPQ1NTT0ZUQ0FSOgorCQlpZiAoZ2V0X3VzZXIoYXJnLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJncCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJdHR5LT50ZXJtaW9zLT5jX2NmbGFnID0KKwkJCSgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgfkNMT0NBTCkgfAorCQkJKGFyZyA/IENMT0NBTCA6IDApKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFRJT0NHU0VSSUFMOgorCQlyZXR1cm4gaXNpY29tX2dldF9zZXJpYWxfaW5mbyhwb3J0LCBhcmdwKTsKKworCWNhc2UgVElPQ1NTRVJJQUw6CisJCXJldHVybiBpc2ljb21fc2V0X3NlcmlhbF9pbmZvKHBvcnQsIGFyZ3ApOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKIC8qIHNldF90ZXJtaW9zIGV0IGFsbCAqLwotc3RhdGljIHZvaWQgaXNpY29tX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgdGVybWlvcyAqIG9sZF90ZXJtaW9zKQorc3RhdGljIHZvaWQgaXNpY29tX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQogewotCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7Ci0JCisJc3RydWN0IGlzaV9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwogCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX3NldF90ZXJtaW9zIikpCiAJCXJldHVybjsKLQkKKwogCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiYKLQkgICAgdHR5LT50ZXJtaW9zLT5jX2lmbGFnID09IG9sZF90ZXJtaW9zLT5jX2lmbGFnKQorCQkJdHR5LT50ZXJtaW9zLT5jX2lmbGFnID09IG9sZF90ZXJtaW9zLT5jX2lmbGFnKQogCQlyZXR1cm47Ci0JCQorCiAJaXNpY29tX2NvbmZpZ19wb3J0KHBvcnQpOwotCQorCiAJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmCi0JICAgICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsJCisJCQkhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7CiAJCXR0eS0+aHdfc3RvcHBlZCA9IDA7Ci0JCWlzaWNvbV9zdGFydCh0dHkpOyAgIAotCX0gICAgCisJCWlzaWNvbV9zdGFydCh0dHkpOworCX0KIH0KIAogLyogdGhyb3R0bGUgZXQgYWxsICovCi1zdGF0aWMgdm9pZCBpc2ljb21fdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCitzdGF0aWMgdm9pZCBpc2ljb21fdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0ID0gKHN0cnVjdCBpc2lfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOwotCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKLQkKKwlzdHJ1Y3QgaXNpX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBpc2lfYm9hcmQgKmNhcmQgPSBwb3J0LT5jYXJkOworCiAJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21fdGhyb3R0bGUiKSkKIAkJcmV0dXJuOwotCQorCiAJLyogdGVsbCB0aGUgY2FyZCB0aGF0IHRoaXMgcG9ydCBjYW5ub3QgaGFuZGxlIGFueSBtb3JlIGRhdGEgZm9yIG5vdyAqLwogCWNhcmQtPnBvcnRfc3RhdHVzICY9IH4oMSA8PCBwb3J0LT5jaGFubmVsKTsKIAlvdXR3KGNhcmQtPnBvcnRfc3RhdHVzLCBjYXJkLT5iYXNlICsgMHgwMik7CiB9CiAKIC8qIHVudGhyb3R0bGUgZXQgYWxsICovCi1zdGF0aWMgdm9pZCBpc2ljb21fdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3N0YXRpYyB2b2lkIGlzaWNvbV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0Jc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3QgaXNpX2JvYXJkICogY2FyZCA9IHBvcnQtPmNhcmQ7Ci0JCisJc3RydWN0IGlzaV9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgaXNpX2JvYXJkICpjYXJkID0gcG9ydC0+Y2FyZDsKKwogCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX3VudGhyb3R0bGUiKSkKIAkJcmV0dXJuOwotCQorCiAJLyogdGVsbCB0aGUgY2FyZCB0aGF0IHRoaXMgcG9ydCBpcyByZWFkeSB0byBhY2NlcHQgbW9yZSBkYXRhICovCiAJY2FyZC0+cG9ydF9zdGF0dXMgfD0gKDEgPDwgcG9ydC0+Y2hhbm5lbCk7CiAJb3V0dyhjYXJkLT5wb3J0X3N0YXR1cywgY2FyZC0+YmFzZSArIDB4MDIpOwogfQogCiAvKiBzdG9wIGV0IGFsbCAqLwotc3RhdGljIHZvaWQgaXNpY29tX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCitzdGF0aWMgdm9pZCBpc2ljb21fc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlzaV9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAogCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX3N0b3AiKSkKIAkJcmV0dXJuOwotCQorCiAJLyogdGhpcyB0ZWxscyB0aGUgdHJhbnNtaXR0ZXIgbm90IHRvIGNvbnNpZGVyIHRoaXMgcG9ydCBmb3IKIAkgICBkYXRhIG91dHB1dCB0byB0aGUgY2FyZC4gKi8KIAlwb3J0LT5zdGF0dXMgJj0gfklTSV9UWE9LOwogfQogCiAvKiBzdGFydCBldCBhbGwgKi8KLXN0YXRpYyB2b2lkIGlzaWNvbV9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3N0YXRpYyB2b2lkIGlzaWNvbV9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7Ci0JCisJc3RydWN0IGlzaV9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwogCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX3N0YXJ0IikpCiAJCXJldHVybjsKLQkKKwogCS8qIHRoaXMgdGVsbHMgdGhlIHRyYW5zbWl0dGVyIHRvIGNvbnNpZGVyIHRoaXMgcG9ydCBmb3IKIAkgICBkYXRhIG91dHB1dCB0byB0aGUgY2FyZC4gKi8KIAlwb3J0LT5zdGF0dXMgfD0gSVNJX1RYT0s7CiB9CiAKIC8qIGhhbmd1cCBldCBhbGwgKi8KLXN0YXRpYyB2b2lkIGRvX2lzaWNvbV9oYW5ndXAodm9pZCAqIGRhdGEpCitzdGF0aWMgdm9pZCBkb19pc2ljb21faGFuZ3VwKHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGlzaV9wb3J0ICogcG9ydCA9IChzdHJ1Y3QgaXNpX3BvcnQgKikgZGF0YTsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eTsKLQkKKwlzdHJ1Y3QgaXNpX3BvcnQgKnBvcnQgPSBkYXRhOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKIAl0dHkgPSBwb3J0LT50dHk7CiAJaWYgKHR0eSkKIAkJdHR5X2hhbmd1cCh0dHkpOwogfQogCi1zdGF0aWMgdm9pZCBpc2ljb21faGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQorc3RhdGljIHZvaWQgaXNpY29tX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCBpc2lfcG9ydCAqIHBvcnQgPSAoc3RydWN0IGlzaV9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7Ci0JCisJc3RydWN0IGlzaV9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwogCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX2hhbmd1cCIpKQogCQlyZXR1cm47Ci0JCisKIAlpc2ljb21fc2h1dGRvd25fcG9ydChwb3J0KTsKIAlwb3J0LT5jb3VudCA9IDA7CiAJcG9ydC0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CkBAIC0xNzM4LDIyMCArMTQ5OCw1MzUgQEAKIH0KIAogLyogZmx1c2hfYnVmZmVyIGV0IGFsbCAqLwotc3RhdGljIHZvaWQgaXNpY29tX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3N0YXRpYyB2b2lkIGlzaWNvbV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0ID0gKHN0cnVjdCBpc2lfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOwotCXN0cnVjdCBpc2lfYm9hcmQgKiBjYXJkID0gcG9ydC0+Y2FyZDsKKwlzdHJ1Y3QgaXNpX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBpc2lfYm9hcmQgKmNhcmQgPSBwb3J0LT5jYXJkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCisKIAlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV9mbHVzaF9idWZmZXIiKSkKIAkJcmV0dXJuOwotCQorCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOwogCXBvcnQtPnhtaXRfY250ID0gcG9ydC0+eG1pdF9oZWFkID0gcG9ydC0+eG1pdF90YWlsID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKLQkKKwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKIAl0dHlfd2FrZXVwKHR0eSk7CiB9CiAKKy8qCisgKiBEcml2ZXIgaW5pdCBhbmQgZGVpbml0IGZ1bmN0aW9ucworICovCiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHJlZ2lzdGVyX2lvcmVnaW9uKHZvaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpc2ljb21fcmVnaXN0ZXJfaW9yZWdpb24oc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJY29uc3QgdW5zaWduZWQgaW50IGluZGV4KQogewotCWludCBjb3VudCwgZG9uZT0wOwotCWZvciAoY291bnQ9MDsgY291bnQgPCBCT0FSRF9DT1VOVDsgY291bnQrKyApIHsKLQkJaWYgKGlzaV9jYXJkW2NvdW50XS5iYXNlKQotCQkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpc2lfY2FyZFtjb3VudF0uYmFzZSwxNixJU0lDT01fTkFNRSkpIHsKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBJL08gUmVnaW9uIDB4JXgtMHgleCBpcyBidXN5LiBDYXJkJWQgd2lsbCBiZSBkaXNhYmxlZC5cbiIsCi0JCQkJCWlzaV9jYXJkW2NvdW50XS5iYXNlLGlzaV9jYXJkW2NvdW50XS5iYXNlKzE1LGNvdW50KzEpOwotCQkJCWlzaV9jYXJkW2NvdW50XS5iYXNlPTA7Ci0JCQkJZG9uZSsrOwotCQkJfQotCX0KLQlyZXR1cm4gZG9uZTsKKwlzdHJ1Y3QgaXNpX2JvYXJkICpib2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmICghYm9hcmQtPmJhc2UpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihib2FyZC0+YmFzZSwgMTYsIElTSUNPTV9OQU1FKSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJJL08gUmVnaW9uIDB4JWx4LTB4JWx4IGlzIGJ1c3kuIENhcmQlZCAiCisJCQkid2lsbCBiZSBkaXNhYmxlZC5cbiIsIGJvYXJkLT5iYXNlLCBib2FyZC0+YmFzZSArIDE1LAorCQkJaW5kZXggKyAxKTsKKwkJcmV0dXJuIC1FQlVTWTsKKyAJfQorCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHVucmVnaXN0ZXJfaW9yZWdpb24odm9pZCkKK3N0YXRpYyB2b2lkIGlzaWNvbV91bnJlZ2lzdGVyX2lvcmVnaW9uKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCWludCBjb3VudDsKLQlmb3IgKGNvdW50PTA7IGNvdW50IDwgQk9BUkRfQ09VTlQ7IGNvdW50KysgKSAKLQkJaWYgKGlzaV9jYXJkW2NvdW50XS5iYXNlKSB7Ci0JCQlyZWxlYXNlX3JlZ2lvbihpc2lfY2FyZFtjb3VudF0uYmFzZSwxNik7Ci0jaWZkZWYgSVNJQ09NX0RFQlVHCQkJCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBJL08gUmVnaW9uIDB4JXgtMHgleCByZWxlYXNlZCBmb3IgQ2FyZCVkLlxuIixpc2lfY2FyZFtjb3VudF0uYmFzZSxpc2lfY2FyZFtjb3VudF0uYmFzZSsxNSxjb3VudCsxKTsKLSNlbmRpZgkJCQotCQl9CisJc3RydWN0IGlzaV9ib2FyZCAqYm9hcmQgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoIWJvYXJkLT5iYXNlKQorCQlyZXR1cm47CisKKwlyZWxlYXNlX3JlZ2lvbihib2FyZC0+YmFzZSwgMTYpOworCWRldl9kYmcoJnBkZXYtPmRldiwgIkkvTyBSZWdpb24gMHglbHgtMHglbHggcmVsZWFzZWQuXG4iLAorCQlib2FyZC0+YmFzZSwgYm9hcmQtPmJhc2UgKyAxNSk7CisJYm9hcmQtPmJhc2UgPSAwOwogfQogCiBzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIGlzaWNvbV9vcHMgPSB7Ci0JLm9wZW4JPSBpc2ljb21fb3BlbiwKLQkuY2xvc2UJPSBpc2ljb21fY2xvc2UsCi0JLndyaXRlCT0gaXNpY29tX3dyaXRlLAotCS5wdXRfY2hhcgk9IGlzaWNvbV9wdXRfY2hhciwKLQkuZmx1c2hfY2hhcnMJPSBpc2ljb21fZmx1c2hfY2hhcnMsCi0JLndyaXRlX3Jvb20JPSBpc2ljb21fd3JpdGVfcm9vbSwKKwkub3BlbgkJCT0gaXNpY29tX29wZW4sCisJLmNsb3NlCQkJPSBpc2ljb21fY2xvc2UsCisJLndyaXRlCQkJPSBpc2ljb21fd3JpdGUsCisJLnB1dF9jaGFyCQk9IGlzaWNvbV9wdXRfY2hhciwKKwkuZmx1c2hfY2hhcnMJCT0gaXNpY29tX2ZsdXNoX2NoYXJzLAorCS53cml0ZV9yb29tCQk9IGlzaWNvbV93cml0ZV9yb29tLAogCS5jaGFyc19pbl9idWZmZXIJPSBpc2ljb21fY2hhcnNfaW5fYnVmZmVyLAotCS5pb2N0bAk9IGlzaWNvbV9pb2N0bCwKLQkuc2V0X3Rlcm1pb3MJPSBpc2ljb21fc2V0X3Rlcm1pb3MsCi0JLnRocm90dGxlCT0gaXNpY29tX3Rocm90dGxlLAotCS51bnRocm90dGxlCT0gaXNpY29tX3VudGhyb3R0bGUsCi0JLnN0b3AJPSBpc2ljb21fc3RvcCwKLQkuc3RhcnQJPSBpc2ljb21fc3RhcnQsCi0JLmhhbmd1cAk9IGlzaWNvbV9oYW5ndXAsCi0JLmZsdXNoX2J1ZmZlcgk9IGlzaWNvbV9mbHVzaF9idWZmZXIsCi0JLnRpb2NtZ2V0CT0gaXNpY29tX3Rpb2NtZ2V0LAotCS50aW9jbXNldAk9IGlzaWNvbV90aW9jbXNldCwKKwkuaW9jdGwJCQk9IGlzaWNvbV9pb2N0bCwKKwkuc2V0X3Rlcm1pb3MJCT0gaXNpY29tX3NldF90ZXJtaW9zLAorCS50aHJvdHRsZQkJPSBpc2ljb21fdGhyb3R0bGUsCisJLnVudGhyb3R0bGUJCT0gaXNpY29tX3VudGhyb3R0bGUsCisJLnN0b3AJCQk9IGlzaWNvbV9zdG9wLAorCS5zdGFydAkJCT0gaXNpY29tX3N0YXJ0LAorCS5oYW5ndXAJCQk9IGlzaWNvbV9oYW5ndXAsCisJLmZsdXNoX2J1ZmZlcgkJPSBpc2ljb21fZmx1c2hfYnVmZmVyLAorCS50aW9jbWdldAkJPSBpc2ljb21fdGlvY21nZXQsCisJLnRpb2Ntc2V0CQk9IGlzaWNvbV90aW9jbXNldCwKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHJlZ2lzdGVyX2RyaXZlcnModm9pZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGlzaWNvbV9yZWdpc3Rlcl90dHlfZHJpdmVyKHZvaWQpCiB7Ci0JaW50IGVycm9yOworCWludCBlcnJvciA9IC1FTk9NRU07CiAKIAkvKiB0dHkgZHJpdmVyIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbiAqLwogCWlzaWNvbV9ub3JtYWwgPSBhbGxvY190dHlfZHJpdmVyKFBPUlRfQ09VTlQpOwogCWlmICghaXNpY29tX25vcm1hbCkKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gZW5kOwogCi0JaXNpY29tX25vcm1hbC0+b3duZXIJPSBUSElTX01PRFVMRTsKLQlpc2ljb21fbm9ybWFsLT5uYW1lIAk9ICJ0dHlNIjsKLQlpc2ljb21fbm9ybWFsLT5kZXZmc19uYW1lID0gImlzaWNvbS8iOwotCWlzaWNvbV9ub3JtYWwtPm1ham9yCT0gSVNJQ09NX05NQUpPUjsKLQlpc2ljb21fbm9ybWFsLT5taW5vcl9zdGFydAk9IDA7Ci0JaXNpY29tX25vcm1hbC0+dHlwZQk9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7Ci0JaXNpY29tX25vcm1hbC0+c3VidHlwZQk9IFNFUklBTF9UWVBFX05PUk1BTDsKLQlpc2ljb21fbm9ybWFsLT5pbml0X3Rlcm1pb3MJPSB0dHlfc3RkX3Rlcm1pb3M7Ci0JaXNpY29tX25vcm1hbC0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcJPSAKLQkJCQlCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfENMT0NBTDsKLQlpc2ljb21fbm9ybWFsLT5mbGFncwk9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJaXNpY29tX25vcm1hbC0+b3duZXIJCQk9IFRISVNfTU9EVUxFOworCWlzaWNvbV9ub3JtYWwtPm5hbWUgCQkJPSAidHR5TSI7CisJaXNpY29tX25vcm1hbC0+ZGV2ZnNfbmFtZQkgCT0gImlzaWNvbS8iOworCWlzaWNvbV9ub3JtYWwtPm1ham9yCQkJPSBJU0lDT01fTk1BSk9SOworCWlzaWNvbV9ub3JtYWwtPm1pbm9yX3N0YXJ0CQk9IDA7CisJaXNpY29tX25vcm1hbC0+dHlwZQkJCT0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwlpc2ljb21fbm9ybWFsLT5zdWJ0eXBlCQkJPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisJaXNpY29tX25vcm1hbC0+aW5pdF90ZXJtaW9zCQk9IHR0eV9zdGRfdGVybWlvczsKKwlpc2ljb21fbm9ybWFsLT5pbml0X3Rlcm1pb3MuY19jZmxhZwk9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8CisJCUNMT0NBTDsKKwlpc2ljb21fbm9ybWFsLT5mbGFncwkJCT0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKIAl0dHlfc2V0X29wZXJhdGlvbnMoaXNpY29tX25vcm1hbCwgJmlzaWNvbV9vcHMpOwotCQotCWlmICgoZXJyb3I9dHR5X3JlZ2lzdGVyX2RyaXZlcihpc2ljb21fbm9ybWFsKSkhPTApIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIklTSUNPTTogQ291bGRuJ3QgcmVnaXN0ZXIgdGhlIGRpYWxpbiBkcml2ZXIsIGVycm9yPSVkXG4iLAorCisJaWYgKChlcnJvciA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoaXNpY29tX25vcm1hbCkpKSB7CisJCXByX2RiZygiQ291bGRuJ3QgcmVnaXN0ZXIgdGhlIGRpYWxpbiBkcml2ZXIsIGVycm9yPSVkXG4iLAogCQkJZXJyb3IpOwogCQlwdXRfdHR5X2RyaXZlcihpc2ljb21fbm9ybWFsKTsKLQkJcmV0dXJuIGVycm9yOwogCX0KLQlyZXR1cm4gMDsKK2VuZDoKKwlyZXR1cm4gZXJyb3I7CiB9CiAKLXN0YXRpYyB2b2lkIHVucmVnaXN0ZXJfZHJpdmVycyh2b2lkKQorc3RhdGljIHZvaWQgaXNpY29tX3VucmVnaXN0ZXJfdHR5X2RyaXZlcih2b2lkKQogewotCWludCBlcnJvciA9IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihpc2ljb21fbm9ybWFsKTsKLQlpZiAoZXJyb3IpCi0JCXByaW50ayhLRVJOX0RFQlVHICJJU0lDT006IGNvdWxkbid0IHVucmVnaXN0ZXIgbm9ybWFsIGRyaXZlciBlcnJvcj0lZC5cbiIsZXJyb3IpOworCWludCBlcnJvcjsKKworCWlmICgoZXJyb3IgPSB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoaXNpY29tX25vcm1hbCkpKQorCQlwcl9kYmcoImNvdWxkbid0IHVucmVnaXN0ZXIgbm9ybWFsIGRyaXZlciwgZXJyb3I9JWQuXG4iLCBlcnJvcik7CisKIAlwdXRfdHR5X2RyaXZlcihpc2ljb21fbm9ybWFsKTsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgcmVnaXN0ZXJfaXNyKHZvaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpc2ljb21fcmVnaXN0ZXJfaXNyKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCWNvbnN0IHVuc2lnbmVkIGludCBpbmRleCkKIHsKLQlpbnQgY291bnQsIGRvbmU9MDsKLQl1bnNpZ25lZCBsb25nIGlycWZsYWdzOworCXN0cnVjdCBpc2lfYm9hcmQgKmJvYXJkID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3MgPSBTQV9JTlRFUlJVUFQ7CisJaW50IHJldHZhbCA9IC1FSU5WQUw7CiAKLQlmb3IgKGNvdW50PTA7IGNvdW50IDwgQk9BUkRfQ09VTlQ7IGNvdW50KysgKSB7Ci0JCWlmIChpc2lfY2FyZFtjb3VudF0uYmFzZSkgewotCQkJaXJxZmxhZ3MgPSAoaXNpX2NhcmRbY291bnRdLmlzYSA9PSBZRVMpID8gCi0JCQkJCVNBX0lOVEVSUlVQVCA6IAotCQkJCQkoU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEpOworCWlmICghYm9hcmQtPmJhc2UpCisJCWdvdG8gZW5kOwogCi0JCQlpZiAocmVxdWVzdF9pcnEoaXNpX2NhcmRbY291bnRdLmlycSwgCi0JCQkJCWlzaWNvbV9pbnRlcnJ1cHQsIAotCQkJCQlpcnFmbGFncywgCi0JCQkJCUlTSUNPTV9OQU1FLCAmaXNpX2NhcmRbY291bnRdKSkgeworCWlmIChib2FyZC0+aXNhID09IE5PKQorCQlpcnFmbGFncyB8PSBTQV9TSElSUTsKIAotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIklTSUNPTTogQ291bGQgbm90IgotCQkJCQkiIGluc3RhbGwgaGFuZGxlciBhdCBJcnEgJWQuIgotCQkJCQkiIENhcmQlZCB3aWxsIGJlIGRpc2FibGVkLlxuIiwKLQkJCQkJaXNpX2NhcmRbY291bnRdLmlycSwgY291bnQrMSk7CisJcmV0dmFsID0gcmVxdWVzdF9pcnEoYm9hcmQtPmlycSwgaXNpY29tX2ludGVycnVwdCwgaXJxZmxhZ3MsCisJCUlTSUNPTV9OQU1FLCBib2FyZCk7CisJaWYgKHJldHZhbCA8IDApCisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJDb3VsZCBub3QgaW5zdGFsbCBoYW5kbGVyIGF0IElycSAlZC4gIgorCQkJIkNhcmQlZCB3aWxsIGJlIGRpc2FibGVkLlxuIiwgYm9hcmQtPmlycSwgaW5kZXggKyAxKTsKKyAJZWxzZQorCQlyZXR2YWwgPSAwOworZW5kOgorCXJldHVybiByZXR2YWw7Cit9CiAKLQkJCQlyZWxlYXNlX3JlZ2lvbihpc2lfY2FyZFtjb3VudF0uYmFzZSwxNik7Ci0JCQkJaXNpX2NhcmRbY291bnRdLmJhc2U9MDsKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJlc2V0X2NhcmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJY29uc3QgdW5zaWduZWQgaW50IGNhcmQsIHVuc2lnbmVkIGludCAqc2lnbmF0dXJlKQoreworCXN0cnVjdCBpc2lfYm9hcmQgKmJvYXJkID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgYmFzZSA9IGJvYXJkLT5iYXNlOworCXVuc2lnbmVkIGludCBwb3J0Y291bnQgPSAwOworCWludCByZXR2YWwgPSAwOworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiSVNJTG9hZDpSZXNldHRpbmcgQ2FyZCVkIGF0IDB4JWx4XG4iLCBjYXJkICsgMSwKKwkJYmFzZSk7CisKKwlpbncoYmFzZSArIDB4OCk7CisKKwltZGVsYXkoMTApOworCisJb3V0dygwLCBiYXNlICsgMHg4KTsgLyogUmVzZXQgKi8KKworCW1zbGVlcCgzMDAwKTsKKworCSpzaWduYXR1cmUgPSBpbncoYmFzZSArIDB4NCkgJiAweGZmOworCisJaWYgKGJvYXJkLT5pc2EgPT0gWUVTKSB7CisJCWlmICghKGludyhiYXNlICsgMHhlKSAmIDB4MSkgfHwgKGludyhiYXNlICsgMHgyKSkpIHsKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgImJhc2UrMHgyPTB4JWx4LCBiYXNlKzB4ZT0weCVseFxuIiwKKwkJCQlpbncoYmFzZSArIDB4MiksIGludyhiYXNlICsgMHhlKSk7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJU0lMb2FkOklTQSBDYXJkJWQgcmVzZXQgZmFpbHVyZSAiCisJCQkJIihQb3NzaWJsZSBiYWQgSS9PIFBvcnQgQWRkcmVzcyAweCVseCkuXG4iLAorCQkJCWNhcmQgKyAxLCBiYXNlKTsKKwkJCXJldHZhbCA9IC1FSU87CisJCQlnb3RvIGVuZDsKKwkJfQorCX0gZWxzZSB7CisJCXBvcnRjb3VudCA9IGludyhiYXNlICsgMHgyKTsKKwkJaWYgKCEoaW53KGJhc2UgKyAweGUpICYgMHgxKSB8fCAoKHBvcnRjb3VudCAhPSAwKSAmJgorCQkJCShwb3J0Y291bnQgIT0gNCkgJiYgKHBvcnRjb3VudCAhPSA4KSkpIHsKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgImJhc2UrMHgyPTB4JWx4LCBiYXNlKzB4ZT0weCVseFxuIiwKKwkJCQlpbncoYmFzZSArIDB4MiksIGludyhiYXNlICsgMHhlKSk7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJU0lMb2FkOlBDSSBDYXJkJWQgcmVzZXQgZmFpbHVyZSAiCisJCQkJIihQb3NzaWJsZSBiYWQgSS9PIFBvcnQgQWRkcmVzcyAweCVseCkuXG4iLAorCQkJCWNhcmQgKyAxLCBiYXNlKTsKKwkJCXJldHZhbCA9IC1FSU87CisJCQlnb3RvIGVuZDsKKwkJfQorCX0KKworCXN3aXRjaCAoKnNpZ25hdHVyZSkgeworCWNhc2UgMHhhNToKKwljYXNlIDB4YmI6CisJY2FzZSAweGRkOgorCQlib2FyZC0+cG9ydF9jb3VudCA9IChib2FyZC0+aXNhID09IE5PICYmIHBvcnRjb3VudCA9PSA0KSA/IDQgOgorCQkJODsKKwkJYm9hcmQtPnNoaWZ0X2NvdW50ID0gMTI7CisJCWJyZWFrOworCWNhc2UgMHhjYzoKKwkJYm9hcmQtPnBvcnRfY291bnQgPSAxNjsKKwkJYm9hcmQtPnNoaWZ0X2NvdW50ID0gMTE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJJU0lMb2FkOkNhcmQlZCByZXNldCBmYWlsdXJlIChQb3NzaWJsZSAiCisJCQkiYmFkIEkvTyBQb3J0IEFkZHJlc3MgMHglbHgpLlxuIiwgY2FyZCArIDEsIGJhc2UpOworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJTaWc9MHglbHhcbiIsIHNpZ25hdHVyZSk7CisJCXJldHZhbCA9IC1FSU87CisJfQorCWRldl9pbmZvKCZwZGV2LT5kZXYsICItRG9uZVxuIik7CisKK2VuZDoKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW5saW5lIGludCBXYWl0VGlsbENhcmRJc0ZyZWUodTE2IGJhc2UpCit7CisJdW5zaWduZWQgbG9uZyBjb3VudCA9IDA7CisKKwl3aGlsZSAoIShpbncoYmFzZSArIDB4ZSkgJiAweDEpICYmIGNvdW50KysgPCAxMDApCisJCW1zbGVlcCg1KTsKKworCXJldHVybiAhKGludyhiYXNlICsgMHhlKSAmIDB4MSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGxvYWRfZmlybXdhcmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJY29uc3QgdW5zaWduZWQgaW50IGluZGV4LCBjb25zdCB1bnNpZ25lZCBpbnQgc2lnbmF0dXJlKQoreworCXN0cnVjdCBpc2lfYm9hcmQgKmJvYXJkID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gYm9hcmQtPmJhc2U7CisJdW5zaWduZWQgaW50IGE7CisJdTE2IHdvcmRfY291bnQsIHN0YXR1czsKKwlpbnQgcmV0dmFsID0gLUVJTzsKKwljaGFyICpuYW1lOworCXU4ICpkYXRhOworCisJc3RydWN0IHN0ZnJhbWUgeworCQl1MTYJYWRkcjsKKwkJdTE2CWNvdW50OworCQl1OAlkYXRhWzBdOworCX0gKmZyYW1lOworCisJc3dpdGNoIChzaWduYXR1cmUpIHsKKwljYXNlIDB4YTU6CisJCW5hbWUgPSAiaXNpNjA4LmJpbiI7CisJCWJyZWFrOworCWNhc2UgMHhiYjoKKwkJbmFtZSA9ICJpc2k2MDhlbS5iaW4iOworCQlicmVhazsKKwljYXNlIDB4Y2M6CisJCW5hbWUgPSAiaXNpNjE2ZW0uYmluIjsKKwkJYnJlYWs7CisJY2FzZSAweGRkOgorCQluYW1lID0gImlzaTQ2MDguYmluIjsKKwkJYnJlYWs7CisJY2FzZSAweGVlOgorCQluYW1lID0gImlzaTQ2MTYuYmluIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5rbm93biBzaWduYXR1cmUuXG4iKTsKKwkJZ290byBlbmQ7CisgCX0KKworCXJldHZhbCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBuYW1lLCAmcGRldi0+ZGV2KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVuZDsKKworCWZvciAoZnJhbWUgPSAoc3RydWN0IHN0ZnJhbWUgKilmdy0+ZGF0YTsKKwkJCWZyYW1lIDwgKHN0cnVjdCBzdGZyYW1lICopKGZ3LT5kYXRhICsgZnctPnNpemUpOworCQkJZnJhbWUrKykgeworCQlpZiAoV2FpdFRpbGxDYXJkSXNGcmVlKGJhc2UpKQorCQkJZ290byBlcnJyZWxmdzsKKworCQlvdXR3KDB4ZjAsIGJhc2UpOwkvKiBzdGFydCB1cGxvYWQgc2VxdWVuY2UgKi8KKwkJb3V0dygweDAwLCBiYXNlKTsKKwkJb3V0dyhmcmFtZS0+YWRkciwgYmFzZSk7IC8qIGxzYiBvZiBhZGRyZXNzICovCisKKwkJd29yZF9jb3VudCA9IGZyYW1lLT5jb3VudCAvIDIgKyBmcmFtZS0+Y291bnQgJSAyOworCQlvdXR3KHdvcmRfY291bnQsIGJhc2UpOworCQlJbnRlcnJ1cHRUaGVDYXJkKGJhc2UpOworCisJCXVkZWxheSgxMDApOyAvKiAweDJmICovCisKKwkJaWYgKFdhaXRUaWxsQ2FyZElzRnJlZShiYXNlKSkKKwkJCWdvdG8gZXJycmVsZnc7CisKKwkJaWYgKChzdGF0dXMgPSBpbncoYmFzZSArIDB4NCkpICE9IDApIHsKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJDYXJkJWQgcmVqZWN0ZWQgbG9hZCBoZWFkZXI6XG4iCisJCQkJIkFkZHJlc3M6MHgleFxuQ291bnQ6MHgleFxuU3RhdHVzOjB4JXhcbiIsCisJCQkJaW5kZXggKyAxLCBmcmFtZS0+YWRkciwgZnJhbWUtPmNvdW50LCBzdGF0dXMpOworCQkJZ290byBlcnJyZWxmdzsKKwkJfQorCQlvdXRzdyhiYXNlLCBmcmFtZS0+ZGF0YSwgd29yZF9jb3VudCk7CisKKwkJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKKworCQl1ZGVsYXkoNTApOyAvKiAweDBmICovCisKKwkJaWYgKFdhaXRUaWxsQ2FyZElzRnJlZShiYXNlKSkKKwkJCWdvdG8gZXJycmVsZnc7CisKKwkJaWYgKChzdGF0dXMgPSBpbncoYmFzZSArIDB4NCkpICE9IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhcmQlZCBnb3Qgb3V0IG9mIHN5bmMuQ2FyZCAiCisJCQkJIlN0YXR1czoweCV4XG4iLCBpbmRleCArIDEsIHN0YXR1cyk7CisJCQlnb3RvIGVycnJlbGZ3OworCQl9CisgCX0KKworCXJldHZhbCA9IC1FSU87CisKKwlpZiAoV2FpdFRpbGxDYXJkSXNGcmVlKGJhc2UpKQorCQlnb3RvIGVycnJlbGZ3OworCisJb3V0dygweGYyLCBiYXNlKTsKKwlvdXR3KDB4ODAwLCBiYXNlKTsKKwlvdXR3KDB4MCwgYmFzZSk7CisJb3V0dygweDAsIGJhc2UpOworCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CisJb3V0dygweDAsIGJhc2UgKyAweDQpOyAvKiBmb3IgSVNJNDYwOCBjYXJkcyAqLworCisvKiBYWFg6IHNob3VsZCB3ZSB0ZXN0IGl0IGJ5IHJlYWRpbmcgaXQgYmFjayBhbmQgY29tcGFyaW5nIHdpdGggb3JpZ2luYWwgbGlrZQorICogaW4gbG9hZCBmaXJtd2FyZSBwYWNrYWdlPyAqLworCWZvciAoZnJhbWUgPSAoc3RydWN0IHN0ZnJhbWUqKWZ3LT5kYXRhOworCQkJZnJhbWUgPCAoc3RydWN0IHN0ZnJhbWUqKShmdy0+ZGF0YSArIGZ3LT5zaXplKTsKKwkJCWZyYW1lKyspIHsKKwkJaWYgKFdhaXRUaWxsQ2FyZElzRnJlZShiYXNlKSkKKwkJCWdvdG8gZXJycmVsZnc7CisKKwkJb3V0dygweGYxLCBiYXNlKTsgLyogc3RhcnQgZG93bmxvYWQgc2VxdWVuY2UgKi8KKwkJb3V0dygweDAwLCBiYXNlKTsKKwkJb3V0dyhmcmFtZS0+YWRkciwgYmFzZSk7IC8qIGxzYiBvZiBhZGRyZXNzICovCisKKwkJd29yZF9jb3VudCA9IChmcmFtZS0+Y291bnQgPj4gMSkgKyBmcmFtZS0+Y291bnQgJSAyOworCQlvdXR3KHdvcmRfY291bnQgKyAxLCBiYXNlKTsKKwkJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKKworCQl1ZGVsYXkoNTApOyAvKiAweGYgKi8KKworCQlpZiAoV2FpdFRpbGxDYXJkSXNGcmVlKGJhc2UpKQorCQkJZ290byBlcnJyZWxmdzsKKworCQlpZiAoKHN0YXR1cyA9IGludyhiYXNlICsgMHg0KSkgIT0gMCkgeworCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkNhcmQlZCByZWplY3RlZCB2ZXJpZnkgaGVhZGVyOlxuIgorCQkJCSJBZGRyZXNzOjB4JXhcbkNvdW50OjB4JXhcblN0YXR1czogMHgleFxuIiwKKwkJCQlpbmRleCArIDEsIGZyYW1lLT5hZGRyLCBmcmFtZS0+Y291bnQsIHN0YXR1cyk7CisJCQlnb3RvIGVycnJlbGZ3OworCQl9CisKKwkJZGF0YSA9IGttYWxsb2Mod29yZF9jb3VudCAqIDIsIEdGUF9LRVJORUwpOworCQlpbncoYmFzZSk7CisJCWluc3coYmFzZSwgZGF0YSwgd29yZF9jb3VudCk7CisJCUludGVycnVwdFRoZUNhcmQoYmFzZSk7CisKKwkJZm9yIChhID0gMDsgYSA8IGZyYW1lLT5jb3VudDsgYSsrKQorCQkJaWYgKGRhdGFbYV0gIT0gZnJhbWUtPmRhdGFbYV0pIHsKKwkJCQlrZnJlZShkYXRhKTsKKwkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYXJkJWQsIGZpcm13YXJlIHVwbG9hZCAiCisJCQkJCSJmYWlsZWRcbiIsIGluZGV4ICsgMSk7CisJCQkJZ290byBlcnJyZWxmdzsKIAkJCX0KLQkJCWVsc2UKLQkJCQlkb25lKys7Ci0JCX0JCi0JfQotCXJldHVybiBkb25lOwotfQorCQlrZnJlZShkYXRhKTsKIAotc3RhdGljIHZvaWQgX19leGl0IHVucmVnaXN0ZXJfaXNyKHZvaWQpCi17Ci0JaW50IGNvdW50OworCQl1ZGVsYXkoNTApOyAvKiAweGYgKi8KIAotCWZvciAoY291bnQ9MDsgY291bnQgPCBCT0FSRF9DT1VOVDsgY291bnQrKyApIHsKLQkJaWYgKGlzaV9jYXJkW2NvdW50XS5iYXNlKQotCQkJZnJlZV9pcnEoaXNpX2NhcmRbY291bnRdLmlycSwgJmlzaV9jYXJkW2NvdW50XSk7Ci0JfQotfQorCQlpZiAoV2FpdFRpbGxDYXJkSXNGcmVlKGJhc2UpKQorCQkJZ290byBlcnJyZWxmdzsKIAotc3RhdGljIGludCBfX2RldmluaXQgaXNpY29tX2luaXQodm9pZCkKLXsKLQlpbnQgY2FyZCwgY2hhbm5lbCwgYmFzZTsKLQlzdHJ1Y3QgaXNpX3BvcnQgKiBwb3J0OwotCXVuc2lnbmVkIGxvbmcgcGFnZTsKLQkKLQlpZiAoIXRtcF9idWYpIHsgCi0JCXBhZ2UgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JICAgICAgCWlmICghcGFnZSkgewotI2lmZGVmIElTSUNPTV9ERUJVRwkgICAgICAJCi0JICAgICAgCQlwcmludGsoS0VSTl9ERUJVRyAiSVNJQ09NOiBDb3VsZG4ndCBhbGxvY2F0ZSBwYWdlIGZvciB0bXBfYnVmLlxuIik7Ci0jZWxzZQotCQkJcHJpbnRrKEtFUk5fRVJSICJJU0lDT006IE5vdCBlbm91Z2ggbWVtb3J5Li4uXG4iKTsKLSNlbmRpZgkgICAgICAKLQkgICAgICAJCXJldHVybiAwOwotCSAgICAgIAl9CQotCSAgICAgIAl0bXBfYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgcGFnZTsKKwkJaWYgKChzdGF0dXMgPSBpbncoYmFzZSArIDB4NCkpICE9IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhcmQlZCB2ZXJpZnkgZ290IG91dCBvZiBzeW5jLiAiCisJCQkJIkNhcmQgU3RhdHVzOjB4JXhcbiIsIGluZGV4ICsgMSwgc3RhdHVzKTsKKwkJCWdvdG8gZXJycmVsZnc7CisJCX0KIAl9Ci0JCi0JaWYgKCFyZWdpc3Rlcl9pb3JlZ2lvbigpKSAKLQl7Ci0JCXByaW50ayhLRVJOX0VSUiAiSVNJQ09NOiBBbGwgcmVxdWlyZWQgSS9PIHNwYWNlIGZvdW5kIGJ1c3kuXG4iKTsKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXRtcF9idWYpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHJlZ2lzdGVyX2RyaXZlcnMoKSkgCi0JewotCQl1bnJlZ2lzdGVyX2lvcmVnaW9uKCk7Ci0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl0bXBfYnVmKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICghcmVnaXN0ZXJfaXNyKCkpIAotCXsKLQkJdW5yZWdpc3Rlcl9kcml2ZXJzKCk7Ci0JCS8qICBpb3BvcnRzIGFscmVhZHkgdXJlZ2lzdGVyZWQgaW4gcmVnaXN0ZXJfaXNyICovCi0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl0bXBfYnVmKTsKLQkJcmV0dXJuIDA7CQkKLQl9Ci0JCi0JbWVtc2V0KGlzaV9wb3J0cywgMCwgc2l6ZW9mKGlzaV9wb3J0cykpOwotCWZvciAoY2FyZCA9IDA7IGNhcmQgPCBCT0FSRF9DT1VOVDsgY2FyZCsrKSB7Ci0JCXBvcnQgPSAmaXNpX3BvcnRzW2NhcmQgKiAxNl07Ci0JCWlzaV9jYXJkW2NhcmRdLnBvcnRzID0gcG9ydDsKLQkJc3Bpbl9sb2NrX2luaXQoJmlzaV9jYXJkW2NhcmRdLmNhcmRfbG9jayk7Ci0JCWJhc2UgPSBpc2lfY2FyZFtjYXJkXS5iYXNlOwotCQlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgMTY7IGNoYW5uZWwrKywgcG9ydCsrKSB7Ci0JCQlwb3J0LT5tYWdpYyA9IElTSUNPTV9NQUdJQzsKLQkJCXBvcnQtPmNhcmQgPSAmaXNpX2NhcmRbY2FyZF07Ci0JCQlwb3J0LT5jaGFubmVsID0gY2hhbm5lbDsKLQkJIAlwb3J0LT5jbG9zZV9kZWxheSA9IDUwICogSFovMTAwOwotCQkgCXBvcnQtPmNsb3Npbmdfd2FpdCA9IDMwMDAgKiBIWi8xMDA7Ci0JCSAJSU5JVF9XT1JLKCZwb3J0LT5oYW5ndXBfdHEsIGRvX2lzaWNvbV9oYW5ndXAsIHBvcnQpOwotCQkgCUlOSVRfV09SSygmcG9ydC0+YmhfdHF1ZXVlLCBpc2ljb21fYm90dG9taGFsZiwgcG9ydCk7Ci0JCSAJcG9ydC0+c3RhdHVzID0gMDsKLQkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnQtPm9wZW5fd2FpdCk7CSAJCQkJCi0JCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0LT5jbG9zZV93YWl0KTsKLQkJCS8qICAuIC4gLiAgKi8KLSAJCX0KLQl9IAotCQotCXJldHVybiAxOwkKKworCWJvYXJkLT5zdGF0dXMgfD0gRklSTVdBUkVfTE9BREVEOworCXJldHZhbCA9IDA7CisKK2VycnJlbGZ3OgorCXJlbGVhc2VfZmlybXdhcmUoZncpOworZW5kOgorCXJldHVybiByZXR2YWw7CiB9CiAKIC8qCiAgKglJbnNtb2QgY2FuIHNldCBzdGF0aWMgc3ltYm9scyBzbyBrZWVwIHRoZXNlIHN0YXRpYwogICovCi0gCiBzdGF0aWMgaW50IGlvWzRdOwogc3RhdGljIGludCBpcnFbNF07CitzdGF0aWMgaW50IGNhcmQ7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGlzaWNvbV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXVuc2lnbmVkIGludCBpb2FkZHIsIHNpZ25hdHVyZSwgaW5kZXg7CisJaW50IHJldHZhbCA9IC1FUEVSTTsKKwl1OCBwY2lpcnE7CisJc3RydWN0IGlzaV9ib2FyZCAqYm9hcmQgPSBOVUxMOworCisJaWYgKGNhcmQgPj0gQk9BUkRfQ09VTlQpCisJCWdvdG8gZXJyOworCisJaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDMpOworCS8qIGkuZSBhdCBvZmZzZXQgMHgxYyBpbiB0aGUgUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgc3BhY2UuICovCisJcGNpaXJxID0gcGRldi0+aXJxOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJJU0kgUENJIENhcmQoRGV2aWNlIElEIDB4JXgpXG4iLCBlbnQtPmRldmljZSk7CisKKwkvKiBhbGxvdCB0aGUgZmlyc3QgZW1wdHkgc2xvdCBpbiB0aGUgYXJyYXkgKi8KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBCT0FSRF9DT1VOVDsgaW5kZXgrKykKKwkJaWYgKGlzaV9jYXJkW2luZGV4XS5iYXNlID09IDApIHsKKwkJCWJvYXJkID0gJmlzaV9jYXJkW2luZGV4XTsKKwkJCWJyZWFrOworCQl9CisKKwlib2FyZC0+YmFzZSA9IGlvYWRkcjsKKwlib2FyZC0+aXJxID0gcGNpaXJxOworCWJvYXJkLT5pc2EgPSBOTzsKKwljYXJkKys7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgYm9hcmQpOworCisJcmV0dmFsID0gaXNpY29tX3JlZ2lzdGVyX2lvcmVnaW9uKHBkZXYsIGluZGV4KTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBlcnI7CisKKwlyZXR2YWwgPSBpc2ljb21fcmVnaXN0ZXJfaXNyKHBkZXYsIGluZGV4KTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBlcnJ1bnJyOworCisJcmV0dmFsID0gcmVzZXRfY2FyZChwZGV2LCBpbmRleCwgJnNpZ25hdHVyZSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gZXJydW5yaTsKKworCXJldHZhbCA9IGxvYWRfZmlybXdhcmUocGRldiwgaW5kZXgsIHNpZ25hdHVyZSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gZXJydW5yaTsKKworCXJldHVybiAwOworCitlcnJ1bnJpOgorCWZyZWVfaXJxKGJvYXJkLT5pcnEsIGJvYXJkKTsKK2VycnVucnI6CisJaXNpY29tX3VucmVnaXN0ZXJfaW9yZWdpb24ocGRldik7CitlcnI6CisJYm9hcmQtPmJhc2UgPSAwOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpc2ljb21fcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBpc2lfYm9hcmQgKmJvYXJkID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJZnJlZV9pcnEoYm9hcmQtPmlycSwgYm9hcmQpOworCWlzaWNvbV91bnJlZ2lzdGVyX2lvcmVnaW9uKHBkZXYpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpc2ljb21fc2V0dXAodm9pZCkKK3sKKwlpbnQgcmV0dmFsLCBpZHgsIGNoYW5uZWw7CisJc3RydWN0IGlzaV9wb3J0ICpwb3J0OworCisJY2FyZCA9IDA7CisJbWVtc2V0KGlzaV9wb3J0cywgMCwgc2l6ZW9mKGlzaV9wb3J0cykpOworCisJZm9yKGlkeCA9IDA7IGlkeCA8IEJPQVJEX0NPVU5UOyBpZHgrKykgeworCQlwb3J0ID0gJmlzaV9wb3J0c1tpZHggKiAxNl07CisJCWlzaV9jYXJkW2lkeF0ucG9ydHMgPSBwb3J0OworCQlzcGluX2xvY2tfaW5pdCgmaXNpX2NhcmRbaWR4XS5jYXJkX2xvY2spOworCQlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgMTY7IGNoYW5uZWwrKywgcG9ydCsrKSB7CisJCQlwb3J0LT5tYWdpYyA9IElTSUNPTV9NQUdJQzsKKwkJCXBvcnQtPmNhcmQgPSAmaXNpX2NhcmRbaWR4XTsKKwkJCXBvcnQtPmNoYW5uZWwgPSBjaGFubmVsOworCQkJcG9ydC0+Y2xvc2VfZGVsYXkgPSA1MCAqIEhaLzEwMDsKKwkJCXBvcnQtPmNsb3Npbmdfd2FpdCA9IDMwMDAgKiBIWi8xMDA7CisJCQlJTklUX1dPUksoJnBvcnQtPmhhbmd1cF90cSwgZG9faXNpY29tX2hhbmd1cCwgcG9ydCk7CisJCQlJTklUX1dPUksoJnBvcnQtPmJoX3RxdWV1ZSwgaXNpY29tX2JvdHRvbWhhbGYsIHBvcnQpOworCQkJcG9ydC0+c3RhdHVzID0gMDsKKwkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnQtPm9wZW5fd2FpdCk7CisJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0LT5jbG9zZV93YWl0KTsKKwkJCS8qICAuIC4gLiAgKi8KKyAJCX0KKwkJaXNpX2NhcmRbaWR4XS5iYXNlID0gMDsKKwkJaXNpX2NhcmRbaWR4XS5pcnEgPSAwOworCisJCWlmICghaW9baWR4XSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChpcnFbaWR4XSA9PSAyIHx8IGlycVtpZHhdID09IDMgfHwgaXJxW2lkeF0gPT0gNAl8fAorCQkJCWlycVtpZHhdID09IDUJfHwgaXJxW2lkeF0gPT0gNwl8fAorCQkJCWlycVtpZHhdID09IDEwCXx8IGlycVtpZHhdID09IDExCXx8CisJCQkJaXJxW2lkeF0gPT0gMTIJfHwgaXJxW2lkeF0gPT0gMTUpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiSVNJQ09NOiBJU0Egbm90IHN1cHBvcnRlZCB5ZXQuXG4iKTsKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm9yOworCQl9IGVsc2UKKwkJCXByaW50ayhLRVJOX0VSUiAiSVNJQ09NOiBJcnEgJWQgdW5zdXBwb3J0ZWQuICIKKwkJCQkiRGlzYWJsaW5nIENhcmQlZC4uLlxuIiwgaXJxW2lkeF0sIGlkeCArIDEpOworCX0KKworCXJldHZhbCA9IGlzaWNvbV9yZWdpc3Rlcl90dHlfZHJpdmVyKCk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXR2YWwgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpc2ljb21fZHJpdmVyKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIklTSUNPTTogVW5hYmxlIHRvIHJlZ2lzdGVyIHBjaSBkcml2ZXIuXG4iKTsKKwkJZ290byBlcnJ0dHk7CisJfQorCisJaW5pdF90aW1lcigmdHgpOworCXR4LmV4cGlyZXMgPSBqaWZmaWVzICsgMTsKKwl0eC5kYXRhID0gMDsKKwl0eC5mdW5jdGlvbiA9IGlzaWNvbV90eDsKKwlyZV9zY2hlZHVsZSA9IDE7CisJYWRkX3RpbWVyKCZ0eCk7CisKKwlyZXR1cm4gMDsKK2VycnR0eToKKwlpc2ljb21fdW5yZWdpc3Rlcl90dHlfZHJpdmVyKCk7CitlcnJvcjoKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXNpY29tX2V4aXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaW5kZXggPSAwOworCisJcmVfc2NoZWR1bGUgPSAwOworCisJd2hpbGUgKHJlX3NjaGVkdWxlICE9IDIgJiYgaW5kZXgrKyA8IDEwMCkKKwkJbXNsZWVwKDEwKTsKKworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaXNpY29tX2RyaXZlcik7CisJaXNpY29tX3VucmVnaXN0ZXJfdHR5X2RyaXZlcigpOworfQorCittb2R1bGVfaW5pdChpc2ljb21fc2V0dXApOworbW9kdWxlX2V4aXQoaXNpY29tX2V4aXQpOwogCiBNT0RVTEVfQVVUSE9SKCJNdWx0aVRlY2giKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciB0aGUgSVNJIHNlcmllcyBvZiBjYXJkcyBieSBNdWx0aVRlY2giKTsKQEAgLTE5NjAsMTIwICsyMDM1LDMgQEAKIE1PRFVMRV9QQVJNX0RFU0MoaW8sICJJL08gcG9ydHMgZm9yIHRoZSBjYXJkcyIpOwogbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSW50ZXJydXB0cyBmb3IgdGhlIGNhcmRzIik7Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGlzaWNvbV9zZXR1cCh2b2lkKQotewotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOwotCWludCByZXR2YWwsIGNhcmQsIGlkeCwgY291bnQ7Ci0JdW5zaWduZWQgY2hhciBwY2lpcnE7Ci0JdW5zaWduZWQgaW50IGlvYWRkcjsKLQkgICAgICAgICAgICAgICAgCi0JY2FyZCA9IDA7Ci0JZm9yKGlkeD0wOyBpZHggPCBCT0FSRF9DT1VOVDsgaWR4KyspIHsJCi0JCWlmIChpb1tpZHhdKSB7Ci0JCQlpc2lfY2FyZFtpZHhdLmJhc2U9aW9baWR4XTsKLQkJCWlzaV9jYXJkW2lkeF0uaXJxPWlycVtpZHhdOwotCQkJaXNpX2NhcmRbaWR4XS5pc2E9WUVTOwotCQkJY2FyZCsrOwotCQl9Ci0JCWVsc2UgewotCQkJaXNpX2NhcmRbaWR4XS5iYXNlID0gMDsKLQkJCWlzaV9jYXJkW2lkeF0uaXJxID0gMDsKLQkJfQotCX0KLQkKLQlmb3IgKGlkeD0wIDtpZHggPCBjYXJkOyBpZHgrKykgewotCQlpZiAoISgoaXNpX2NhcmRbaWR4XS5pcnE9PTIpfHwoaXNpX2NhcmRbaWR4XS5pcnE9PTMpfHwKLQkJICAgIChpc2lfY2FyZFtpZHhdLmlycT09NCl8fChpc2lfY2FyZFtpZHhdLmlycT09NSl8fAotCQkgICAgKGlzaV9jYXJkW2lkeF0uaXJxPT03KXx8KGlzaV9jYXJkW2lkeF0uaXJxPT0xMCl8fAotCQkgICAgKGlzaV9jYXJkW2lkeF0uaXJxPT0xMSl8fChpc2lfY2FyZFtpZHhdLmlycT09MTIpfHwKLQkJICAgIChpc2lfY2FyZFtpZHhdLmlycT09MTUpKSkgewotCQkJCi0JCQlpZiAoaXNpX2NhcmRbaWR4XS5iYXNlKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJJU0lDT006IElycSAlZCB1bnN1cHBvcnRlZC4gRGlzYWJsaW5nIENhcmQlZC4uLlxuIiwKLQkJCQkJaXNpX2NhcmRbaWR4XS5pcnEsIGlkeCsxKTsKLQkJCQlpc2lfY2FyZFtpZHhdLmJhc2U9MDsKLQkJCQljYXJkLS07Ci0JCQl9CQotCQl9Ci0JfQkKLQkKLQlpZiAoY2FyZCA8IEJPQVJEX0NPVU5UKSB7Ci0JCWZvciAoaWR4PTA7IGlkeCA8IERFVklEX0NPVU5UOyBpZHgrKykgewotCQkJZGV2ID0gTlVMTDsKLQkJCWZvciAoOzspewotCQkJCWlmICghKGRldiA9IHBjaV9maW5kX2RldmljZShWRU5ET1JfSUQsIGlzaWNvbV9wY2lfdGJsW2lkeF0uZGV2aWNlLCBkZXYpKSkKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKGNhcmQgPj0gQk9BUkRfQ09VTlQpCi0JCQkJCWJyZWFrOwotCQkJCQkKLQkJCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2KSkKLQkJCQkJYnJlYWs7Ci0KLQkJCQkvKiBmb3VuZCBhIFBDSSBJU0kgY2FyZCEgKi8KLQkJCQlpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKGRldiwgMyk7IC8qIGkuZSBhdCBvZmZzZXQgMHgxYyBpbiB0aGUKLQkJCQkJCQkJICAgICAgICogUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKLQkJCQkJCQkJICAgICAgICogc3BhY2UuCi0JCQkJCQkJCSAgICAgICAqLwotCQkJCXBjaWlycSA9IGRldi0+aXJxOwotCQkJCXByaW50ayhLRVJOX0lORk8gIklTSSBQQ0kgQ2FyZChEZXZpY2UgSUQgMHgleClcbiIsIGlzaWNvbV9wY2lfdGJsW2lkeF0uZGV2aWNlKTsKLQkJCQkvKgotCQkJCSAqIGFsbG90IHRoZSBmaXJzdCBlbXB0eSBzbG90IGluIHRoZSBhcnJheQotCQkJCSAqLwkJCQkKLQkJCQlmb3IgKGNvdW50PTA7IGNvdW50IDwgQk9BUkRfQ09VTlQ7IGNvdW50KyspIHsJCQkJCi0JCQkJCWlmIChpc2lfY2FyZFtjb3VudF0uYmFzZSA9PSAwKSB7Ci0JCQkJCQlpc2lfY2FyZFtjb3VudF0uYmFzZSA9IGlvYWRkcjsKLQkJCQkJCWlzaV9jYXJkW2NvdW50XS5pcnEgPSBwY2lpcnE7Ci0JCQkJCQlpc2lfY2FyZFtjb3VudF0uaXNhID0gTk87Ci0JCQkJCQljYXJkKys7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0JCQkJCi0JCQlpZiAoY2FyZCA+PSBCT0FSRF9DT1VOVCkgYnJlYWs7Ci0JCX0KLQl9Ci0JCi0JaWYgKCEoaXNpX2NhcmRbMF0uYmFzZSB8fCBpc2lfY2FyZFsxXS5iYXNlIHx8IGlzaV9jYXJkWzJdLmJhc2UgfHwgaXNpX2NhcmRbM10uYmFzZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJU0lDT006IE5vIHZhbGlkIGNhcmQgY29uZmlndXJhdGlvbi4gRHJpdmVyIGNhbm5vdCBiZSBpbml0aWFsaXplZC4uLlxuIik7IAotCQlyZXR1cm4gLUVJTzsKLQl9CQotCi0JcmV0dmFsID0gbWlzY19yZWdpc3RlcigmaXNpbG9hZGVyX2RldmljZSk7Ci0JaWYgKHJldHZhbCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJU0lDT006IFVuYWJsZSB0byByZWdpc3RlciBmaXJtd2FyZSBsb2FkZXIgZHJpdmVyLlxuIik7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCQotCWlmICghaXNpY29tX2luaXQoKSkgewotCQlpZiAobWlzY19kZXJlZ2lzdGVyKCZpc2lsb2FkZXJfZGV2aWNlKSkgCi0JCQlwcmludGsoS0VSTl9FUlIgIklTSUNPTTogVW5hYmxlIHRvIHVucmVnaXN0ZXIgRmlybXdhcmUgTG9hZGVyIGRyaXZlclxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQkKLQlpbml0X3RpbWVyKCZ0eCk7Ci0JdHguZXhwaXJlcyA9IGppZmZpZXMgKyAxOwotCXR4LmRhdGEgPSAwOwotCXR4LmZ1bmN0aW9uID0gaXNpY29tX3R4OwotCXJlX3NjaGVkdWxlID0gMTsKLQlhZGRfdGltZXIoJnR4KTsKLQkKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGlzaWNvbV9leGl0KHZvaWQpCi17Ci0JcmVfc2NoZWR1bGUgPSAwOwotCS8qIEZJWE1FICovCi0JbXNsZWVwKDEwMDApOwotCXVucmVnaXN0ZXJfaXNyKCk7Ci0JdW5yZWdpc3Rlcl9kcml2ZXJzKCk7Ci0JdW5yZWdpc3Rlcl9pb3JlZ2lvbigpOwkKLQlpZih0bXBfYnVmKQotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdG1wX2J1Zik7Ci0JaWYgKG1pc2NfZGVyZWdpc3RlcigmaXNpbG9hZGVyX2RldmljZSkpCi0JCXByaW50ayhLRVJOX0VSUiAiSVNJQ09NOiBVbmFibGUgdG8gdW5yZWdpc3RlciBGaXJtd2FyZSBMb2FkZXIgZHJpdmVyXG4iKTsKLX0KLQotbW9kdWxlX2luaXQoaXNpY29tX3NldHVwKTsKLW1vZHVsZV9leGl0KGlzaWNvbV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pc3RhbGxpb24uYyBiL2RyaXZlcnMvY2hhci9pc3RhbGxpb24uYwppbmRleCBjZTNiYzBkLi4yOGM1YTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMKKysrIGIvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jCkBAIC0xMzUsNyArMTM1LDcgQEAKIAkvKnsgQlJEX0VDUCwgMHgyYTAsIDAsIDB4Y2MwMDAsIDAsIDAgfSwqLwogfTsKIAotc3RhdGljIGludAlzdGxpX25yYnJkcyA9IHNpemVvZihzdGxpX2JyZGNvbmYpIC8gc2l6ZW9mKHN0bGNvbmZfdCk7CitzdGF0aWMgaW50CXN0bGlfbnJicmRzID0gQVJSQVlfU0laRShzdGxpX2JyZGNvbmYpOwogCiAvKgogICoJVGhlcmUgaXMgc29tZSBleHBlcmltZW50YWwgRUlTQSBib2FyZCBkZXRlY3Rpb24gY29kZSBpbiB0aGlzIGRyaXZlci4KQEAgLTQwNiw3ICs0MDYsNyBAQAogCTB4ZmYwMDAwMDAsIDB4ZmYwMTAwMDAsIDB4ZmYwMjAwMDAsIDB4ZmYwMzAwMDAsCiB9OwogCi1zdGF0aWMgaW50CXN0bGlfZWlzYW1lbXBzaXplID0gc2l6ZW9mKHN0bGlfZWlzYW1lbXByb2JlYWRkcnMpIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIGludAlzdGxpX2Vpc2FtZW1wc2l6ZSA9IEFSUkFZX1NJWkUoc3RsaV9laXNhbWVtcHJvYmVhZGRycyk7CiAKIC8qCiAgKglEZWZpbmUgdGhlIFN0YWxsaW9uIFBDSSB2ZW5kb3IgYW5kIGRldmljZSBJRHMuCkBAIC04OTksMTUgKzg5OSwxMyBAQAogewogCXN0bGNvbmZfdAljb25mOwogCXN0bGlicmRfdAkqYnJkcDsKLQlpbnQJCW5yYXJncywgaTsKKwlpbnQJCWk7CiAKICNpZmRlZiBERUJVRwogCXByaW50aygic3RsaV9hcmdicmRzKClcbiIpOwogI2VuZGlmCiAKLQlucmFyZ3MgPSBzaXplb2Yoc3RsaV9icmRzcCkgLyBzaXplb2YoY2hhciAqKik7Ci0KLQlmb3IgKGkgPSBzdGxpX25yYnJkczsgKGkgPCBucmFyZ3MpOyBpKyspIHsKKwlmb3IgKGkgPSBzdGxpX25yYnJkczsgaSA8IEFSUkFZX1NJWkUoc3RsaV9icmRzcCk7IGkrKykgewogCQltZW1zZXQoJmNvbmYsIDAsIHNpemVvZihjb25mKSk7CiAJCWlmIChzdGxpX3BhcnNlYnJkKCZjb25mLCBzdGxpX2JyZHNwW2ldKSA9PSAwKQogCQkJY29udGludWU7CkBAIC05NjcsNyArOTY1LDcgQEAKIHN0YXRpYyBpbnQgc3RsaV9wYXJzZWJyZChzdGxjb25mX3QgKmNvbmZwLCBjaGFyICoqYXJncCkKIHsKIAljaGFyCSpzcDsKLQlpbnQJbnJicmRuYW1lcywgaTsKKwlpbnQJaTsKIAogI2lmZGVmIERFQlVHCiAJcHJpbnRrKCJzdGxpX3BhcnNlYnJkKGNvbmZwPSV4LGFyZ3A9JXgpXG4iLCAoaW50KSBjb25mcCwgKGludCkgYXJncCk7CkBAIC05NzksMTQgKzk3NywxMyBAQAogCWZvciAoc3AgPSBhcmdwWzBdLCBpID0gMDsgKCgqc3AgIT0gMCkgJiYgKGkgPCAyNSkpOyBzcCsrLCBpKyspCiAJCSpzcCA9IFRPTE9XRVIoKnNwKTsKIAotCW5yYnJkbmFtZXMgPSBzaXplb2Yoc3RsaV9icmRzdHIpIC8gc2l6ZW9mKHN0bGlicmR0eXBlX3QpOwotCWZvciAoaSA9IDA7IChpIDwgbnJicmRuYW1lcyk7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0bGlfYnJkc3RyKTsgaSsrKSB7CiAJCWlmIChzdHJjbXAoc3RsaV9icmRzdHJbaV0ubmFtZSwgYXJncFswXSkgPT0gMCkKIAkJCWJyZWFrOwogCX0KLQlpZiAoaSA+PSBucmJyZG5hbWVzKSB7CisJaWYgKGkgPT0gQVJSQVlfU0laRShzdGxpX2JyZHN0cikpIHsKIAkJcHJpbnRrKCJTVEFMTElPTjogdW5rbm93biBib2FyZCBuYW1lLCAlcz9cbiIsIGFyZ3BbMF0pOwotCQlyZXR1cm4oMCk7CisJCXJldHVybiAwOwogCX0KIAogCWNvbmZwLT5icmR0eXBlID0gc3RsaV9icmRzdHJbaV0udHlwZTsKQEAgLTI3MTQsMTcgKzI3MTEsMTMgQEAKIAkJc3RsZW4gPSBzaXplIC0gdGFpbDsKIAl9CiAKLQlsZW4gPSBNSU4obGVuLCAoVFRZX0ZMSVBCVUZfU0laRSAtIHR0eS0+ZmxpcC5jb3VudCkpOworCWxlbiA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgbGVuKTsKKwkvKiBGSVhNRSA6IGlvbWFwID8gKi8KIAlzaGJ1ZiA9ICh2b2xhdGlsZSBjaGFyICopIEVCUkRHRVRNRU1QVFIoYnJkcCwgcG9ydHAtPnJ4b2Zmc2V0KTsKIAogCXdoaWxlIChsZW4gPiAwKSB7CiAJCXN0bGVuID0gTUlOKGxlbiwgc3RsZW4pOwotCQltZW1jcHkodHR5LT5mbGlwLmNoYXJfYnVmX3B0ciwgKGNoYXIgKikgKHNoYnVmICsgdGFpbCksIHN0bGVuKTsKLQkJbWVtc2V0KHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIsIDAsIHN0bGVuKTsKLQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciArPSBzdGxlbjsKLQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciArPSBzdGxlbjsKLQkJdHR5LT5mbGlwLmNvdW50ICs9IHN0bGVuOwotCisJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCAoY2hhciAqKShzaGJ1ZiArIHRhaWwpLCBzdGxlbik7CiAJCWxlbiAtPSBzdGxlbjsKIAkJdGFpbCArPSBzdGxlbjsKIAkJaWYgKHRhaWwgPj0gc2l6ZSkgewpAQCAtMjkwOSwxNiArMjkwMiwxMiBAQAogCiAJCWlmICgobnQuZGF0YSAmIERUX1JYQlJFQUspICYmIChwb3J0cC0+cnhtYXJrbXNrICYgQlJLSU5UKSkgewogCQkJaWYgKHR0eSAhPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkgewotCQkJCWlmICh0dHktPmZsaXAuY291bnQgPCBUVFlfRkxJUEJVRl9TSVpFKSB7Ci0JCQkJCXR0eS0+ZmxpcC5jb3VudCsrOwotCQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX0JSRUFLOwotCQkJCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gMDsKLQkJCQkJaWYgKHBvcnRwLT5mbGFncyAmIEFTWU5DX1NBSykgewotCQkJCQkJZG9fU0FLKHR0eSk7Ci0JCQkJCQlFQlJERU5BQkxFKGJyZHApOwotCQkJCQl9Ci0JCQkJCXR0eV9zY2hlZHVsZV9mbGlwKHR0eSk7CisJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfQlJFQUspOworCQkJCWlmIChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19TQUspIHsKKwkJCQkJZG9fU0FLKHR0eSk7CisJCQkJCUVCUkRFTkFCTEUoYnJkcCk7CiAJCQkJfQorCQkJCXR0eV9zY2hlZHVsZV9mbGlwKHR0eSk7CiAJCQl9CiAJCX0KIApAQCAtNDk0Myw3ICs0OTMyLDcgQEAKIAlpZiAocG9ydHAtPnR0eSAhPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkgewogCQlpZiAocG9ydHAtPnR0eS0+ZHJpdmVyX2RhdGEgPT0gcG9ydHApIHsKIAkJCXN0bGlfY29tc3RhdHMudHR5c3RhdGUgPSBwb3J0cC0+dHR5LT5mbGFnczsKLQkJCXN0bGlfY29tc3RhdHMucnhidWZmZXJlZCA9IHBvcnRwLT50dHktPmZsaXAuY291bnQ7CisJCQlzdGxpX2NvbXN0YXRzLnJ4YnVmZmVyZWQgPSAtMSAvKnBvcnRwLT50dHktPmZsaXAuY291bnQqLzsKIAkJCWlmIChwb3J0cC0+dHR5LT50ZXJtaW9zICE9IChzdHJ1Y3QgdGVybWlvcyAqKSBOVUxMKSB7CiAJCQkJc3RsaV9jb21zdGF0cy5jZmxhZ3MgPSBwb3J0cC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOwogCQkJCXN0bGlfY29tc3RhdHMuaWZsYWdzID0gcG9ydHAtPnR0eS0+dGVybWlvcy0+Y19pZmxhZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tZW0uYyBiL2RyaXZlcnMvY2hhci9tZW0uYwppbmRleCA5MWRkNjY5Li4yOWM0MWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbWVtLmMKKysrIGIvZHJpdmVycy9jaGFyL21lbS5jCkBAIC0xMDEsNiArMTAxLDExIEBACiAKIAlyZXR1cm4gMTsKIH0KKworc3RhdGljIGlubGluZSBpbnQgdmFsaWRfbW1hcF9waHlzX2FkZHJfcmFuZ2UodW5zaWduZWQgbG9uZyBhZGRyLCBzaXplX3QgKnNpemUpCit7CisJcmV0dXJuIDE7Cit9CiAjZW5kaWYKIAogLyoKQEAgLTIyOCwyNiArMjMzLDM2IEBACiAJcmV0dXJuIHdyaXR0ZW47CiB9CiAKKyNpZm5kZWYgX19IQVZFX1BIWVNfTUVNX0FDQ0VTU19QUk9UCitzdGF0aWMgcGdwcm90X3QgcGh5c19tZW1fYWNjZXNzX3Byb3Qoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgcGZuLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLCBwZ3Byb3RfdCB2bWFfcHJvdCkKK3sKKyNpZmRlZiBwZ3Byb3Rfbm9uY2FjaGVkCisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBwZm4gPDwgUEFHRV9TSElGVDsKKworCWlmICh1bmNhY2hlZF9hY2Nlc3MoZmlsZSwgb2Zmc2V0KSkKKwkJcmV0dXJuIHBncHJvdF9ub25jYWNoZWQodm1hX3Byb3QpOworI2VuZGlmCisJcmV0dXJuIHZtYV9wcm90OworfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgbW1hcF9tZW0oc3RydWN0IGZpbGUgKiBmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEpCiB7Ci0jaWYgZGVmaW5lZChfX0hBVkVfUEhZU19NRU1fQUNDRVNTX1BST1QpCi0Jdm1hLT52bV9wYWdlX3Byb3QgPSBwaHlzX21lbV9hY2Nlc3NfcHJvdChmaWxlLCB2bWEtPnZtX3Bnb2ZmLAotCQkJCQkJIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKLQkJCQkJCSB2bWEtPnZtX3BhZ2VfcHJvdCk7Ci0jZWxpZiBkZWZpbmVkKHBncHJvdF9ub25jYWNoZWQpCi0JdW5zaWduZWQgbG9uZyBvZmZzZXQgPSB2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQ7Ci0JaW50IHVuY2FjaGVkOworCXNpemVfdCBzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OwogCi0JdW5jYWNoZWQgPSB1bmNhY2hlZF9hY2Nlc3MoZmlsZSwgb2Zmc2V0KTsKLQlpZiAodW5jYWNoZWQpCi0JCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7Ci0jZW5kaWYKKwlpZiAoIXZhbGlkX21tYXBfcGh5c19hZGRyX3JhbmdlKHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVCwgJnNpemUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZtYS0+dm1fcGFnZV9wcm90ID0gcGh5c19tZW1fYWNjZXNzX3Byb3QoZmlsZSwgdm1hLT52bV9wZ29mZiwKKwkJCQkJCSBzaXplLAorCQkJCQkJIHZtYS0+dm1fcGFnZV9wcm90KTsKIAogCS8qIFJlbWFwLXBmbi1yYW5nZSB3aWxsIG1hcmsgdGhlIHJhbmdlIFZNX0lPIGFuZCBWTV9SRVNFUlZFRCAqLwogCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLAogCQkJICAgIHZtYS0+dm1fc3RhcnQsCiAJCQkgICAgdm1hLT52bV9wZ29mZiwKLQkJCSAgICB2bWEtPnZtX2VuZC12bWEtPnZtX3N0YXJ0LAorCQkJICAgIHNpemUsCiAJCQkgICAgdm1hLT52bV9wYWdlX3Byb3QpKQogCQlyZXR1cm4gLUVBR0FJTjsKIAlyZXR1cm4gMDsKQEAgLTUxOSw3ICs1MzQsNyBAQAogIAlyZXR1cm4gdmlydHIgKyB3cm90ZTsKIH0KIAotI2lmIChkZWZpbmVkKENPTkZJR19JU0EpIHx8ICFkZWZpbmVkKF9fbWM2ODAwMF9fKSkgJiYgKCFkZWZpbmVkKENPTkZJR19QUENfSVNFUklFUykgfHwgZGVmaW5lZChDT05GSUdfUENJKSkKKyNpZiBkZWZpbmVkKENPTkZJR19JU0EpIHx8ICFkZWZpbmVkKF9fbWM2ODAwMF9fKQogc3RhdGljIHNzaXplX3QgcmVhZF9wb3J0KHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCiAJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CkBAIC03MjYsNyArNzQxLDcgQEAKIHsKIAlsb2ZmX3QgcmV0OwogCi0JZG93bigmZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJc3dpdGNoIChvcmlnKSB7CiAJCWNhc2UgMDoKIAkJCWZpbGUtPmZfcG9zID0gb2Zmc2V0OwpAQCAtNzQxLDcgKzc1Niw3IEBACiAJCWRlZmF1bHQ6CiAJCQlyZXQgPSAtRUlOVkFMOwogCX0KLQl1cCgmZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC03ODAsNyArNzk1LDcgQEAKIAkud3JpdGUJCT0gd3JpdGVfbnVsbCwKIH07CiAKLSNpZiAoZGVmaW5lZChDT05GSUdfSVNBKSB8fCAhZGVmaW5lZChfX21jNjgwMDBfXykpICYmICghZGVmaW5lZChDT05GSUdfUFBDX0lTRVJJRVMpIHx8IGRlZmluZWQoQ09ORklHX1BDSSkpCisjaWYgZGVmaW5lZChDT05GSUdfSVNBKSB8fCAhZGVmaW5lZChfX21jNjgwMDBfXykKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBvcnRfZm9wcyA9IHsKIAkubGxzZWVrCQk9IG1lbW9yeV9sc2VlaywKIAkucmVhZAkJPSByZWFkX3BvcnQsCkBAIC04MTcsNyArODMyLDcgQEAKIAkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJY2hhciAqdG1wOwotCWludCByZXQ7CisJc3NpemVfdCByZXQ7CiAKIAl0bXAgPSBrbWFsbG9jKGNvdW50ICsgMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHRtcCA9PSBOVUxMKQpAQCAtODI2LDYgKzg0MSw5IEBACiAJaWYgKCFjb3B5X2Zyb21fdXNlcih0bXAsIGJ1ZiwgY291bnQpKSB7CiAJCXRtcFtjb3VudF0gPSAwOwogCQlyZXQgPSBwcmludGsoIiVzIiwgdG1wKTsKKwkJaWYgKHJldCA+IGNvdW50KQorCQkJLyogcHJpbnRrIGNhbiBhZGQgYSBwcmVmaXggKi8KKwkJCXJldCA9IGNvdW50OwogCX0KIAlrZnJlZSh0bXApOwogCXJldHVybiByZXQ7CkBAIC04NDcsNyArODY1LDcgQEAKIAkJY2FzZSAzOgogCQkJZmlscC0+Zl9vcCA9ICZudWxsX2ZvcHM7CiAJCQlicmVhazsKLSNpZiAoZGVmaW5lZChDT05GSUdfSVNBKSB8fCAhZGVmaW5lZChfX21jNjgwMDBfXykpICYmICghZGVmaW5lZChDT05GSUdfUFBDX0lTRVJJRVMpIHx8IGRlZmluZWQoQ09ORklHX1BDSSkpCisjaWYgZGVmaW5lZChDT05GSUdfSVNBKSB8fCAhZGVmaW5lZChfX21jNjgwMDBfXykKIAkJY2FzZSA0OgogCQkJZmlscC0+Zl9vcCA9ICZwb3J0X2ZvcHM7CiAJCQlicmVhazsKQEAgLTg5NCw3ICs5MTIsNyBAQAogCXsxLCAibWVtIiwgICAgIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCwgJm1lbV9mb3BzfSwKIAl7MiwgImttZW0iLCAgICBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAsICZrbWVtX2ZvcHN9LAogCXszLCAibnVsbCIsICAgIFNfSVJVR08gfCBTX0lXVUdPLCAgICAgICAgICAgJm51bGxfZm9wc30sCi0jaWYgKGRlZmluZWQoQ09ORklHX0lTQSkgfHwgIWRlZmluZWQoX19tYzY4MDAwX18pKSAmJiAoIWRlZmluZWQoQ09ORklHX1BQQ19JU0VSSUVTKSB8fCBkZWZpbmVkKENPTkZJR19QQ0kpKQorI2lmIGRlZmluZWQoQ09ORklHX0lTQSkgfHwgIWRlZmluZWQoX19tYzY4MDAwX18pCiAJezQsICJwb3J0IiwgICAgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQLCAmcG9ydF9mb3BzfSwKICNlbmRpZgogCXs1LCAiemVybyIsICAgIFNfSVJVR08gfCBTX0lXVUdPLCAgICAgICAgICAgJnplcm9fZm9wc30sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbW94YS5jIGIvZHJpdmVycy9jaGFyL21veGEuYwppbmRleCA3OWU0OTBlLi5mNDNjMmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbW94YS5jCisrKyBiL2RyaXZlcnMvY2hhci9tb3hhLmMKQEAgLTI2OSw3ICsyNjksNyBAQAogc3RhdGljIGludCBNb3hhUG9ydERDRE9OKGludCk7CiBzdGF0aWMgdm9pZCBNb3hhUG9ydEZsdXNoRGF0YShpbnQsIGludCk7CiBzdGF0aWMgaW50IE1veGFQb3J0V3JpdGVEYXRhKGludCwgdW5zaWduZWQgY2hhciAqLCBpbnQpOwotc3RhdGljIGludCBNb3hhUG9ydFJlYWREYXRhKGludCwgdW5zaWduZWQgY2hhciAqLCBpbnQpOworc3RhdGljIGludCBNb3hhUG9ydFJlYWREYXRhKGludCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBzdGF0aWMgaW50IE1veGFQb3J0VHhRdWV1ZShpbnQpOwogc3RhdGljIGludCBNb3hhUG9ydFJ4UXVldWUoaW50KTsKIHN0YXRpYyBpbnQgTW94YVBvcnRUeEZyZWUoaW50KTsKQEAgLTMwMSw2ICszMDEsOCBAQAogCS50aW9jbXNldCA9IG1veGFfdGlvY21zZXQsCiB9OwogCitzdGF0aWMgc3BpbmxvY2tfdCBtb3hhX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CisKICNpZmRlZiBDT05GSUdfUENJCiBzdGF0aWMgaW50IG1veGFfZ2V0X1BDSV9jb25mKHN0cnVjdCBwY2lfZGV2ICpwLCBpbnQgYm9hcmRfdHlwZSwgbW94YV9ib2FyZF9jb25mICogYm9hcmQpCiB7CkBAIC00NDgsNyArNDUwLDcgQEAKICNpZmRlZiBDT05GSUdfUENJCiAJewogCQlzdHJ1Y3QgcGNpX2RldiAqcCA9IE5VTEw7Ci0JCWludCBuID0gKHNpemVvZihtb3hhX3BjaWJyZHMpIC8gc2l6ZW9mKG1veGFfcGNpYnJkc1swXSkpIC0gMTsKKwkJaW50IG4gPSBBUlJBWV9TSVpFKG1veGFfcGNpYnJkcykgLSAxOwogCQlpID0gMDsKIAkJd2hpbGUgKGkgPCBuKSB7CiAJCQl3aGlsZSAoKHAgPSBwY2lfZ2V0X2RldmljZShtb3hhX3BjaWJyZHNbaV0udmVuZG9yLCBtb3hhX3BjaWJyZHNbaV0uZGV2aWNlLCBwKSkhPU5VTEwpCkBAIC02NDUsMTAgKzY0NywxMCBAQAogCWlmIChjaCA9PSBOVUxMKQogCQlyZXR1cm4gKDApOwogCXBvcnQgPSBjaC0+cG9ydDsKLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtb3hhX2xvY2ssIGZsYWdzKTsKIAlsZW4gPSBNb3hhUG9ydFdyaXRlRGF0YShwb3J0LCAodW5zaWduZWQgY2hhciAqKSBidWYsIGNvdW50KTsKLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb3hhX2xvY2ssIGZsYWdzKTsKIAogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAlpZiAoICEoY2gtPnN0YXR1c2ZsYWdzICYgTE9XV0FJVCkgJiYKQEAgLTcyMywxMSArNzI1LDEwIEBACiAJaWYgKGNoID09IE5VTEwpCiAJCXJldHVybjsKIAlwb3J0ID0gY2gtPnBvcnQ7Ci0Jc2F2ZV9mbGFncyhmbGFncyk7Ci0JY2xpKCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm1veGFfbG9jaywgZmxhZ3MpOwogCW1veGFYbWl0QnVmZlswXSA9IGM7CiAJTW94YVBvcnRXcml0ZURhdGEocG9ydCwgbW94YVhtaXRCdWZmLCAxKTsKLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb3hhX2xvY2ssIGZsYWdzKTsKIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAJaWYgKCAhKGNoLT5zdGF0dXNmbGFncyAmIExPV1dBSVQpICYmIChNb3hhUG9ydFR4RnJlZShwb3J0KSA8PSAxMDApICkKIAkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTAzMCwxMiArMTAzMSwxMiBAQAogCXByaW50aygiYmxvY2tfdGlsX3JlYWR5IGJlZm9yZSBibG9jazogdHR5cyVkLCBjb3VudCA9ICVkXG4iLAogCSAgICAgICBjaC0+bGluZSwgY2gtPmNvdW50KTsKICNlbmRpZgotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZtb3hhX2xvY2ssIGZsYWdzKTsKIAlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCiAJCWNoLT5jb3VudC0tOwotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwogCWNoLT5ibG9ja2VkX29wZW4rKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb3hhX2xvY2ssIGZsYWdzKTsKKwogCXdoaWxlICgxKSB7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8CkBAIC0xMDYyLDE3ICsxMDYzLDIxIEBACiAJfQogCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJcmVtb3ZlX3dhaXRfcXVldWUoJmNoLT5vcGVuX3dhaXQsICZ3YWl0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtb3hhX2xvY2ssIGZsYWdzKTsKIAlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCiAJCWNoLT5jb3VudCsrOwogCWNoLT5ibG9ja2VkX29wZW4tLTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb3hhX2xvY2ssIGZsYWdzKTsKICNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgogCXByaW50aygiYmxvY2tfdGlsX3JlYWR5IGFmdGVyIGJsb2NraW5nOiB0dHlzJWQsIGNvdW50ID0gJWRcbiIsCiAJICAgICAgIGNoLT5saW5lLCBjaC0+Y291bnQpOwogI2VuZGlmCiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIChyZXR2YWwpOworCS8qIEZJWE1FOiByZXZpZXcgdG8gc2VlIGlmIHdlIG5lZWQgdG8gdXNlIHNldF9iaXQgb24gdGhlc2UgKi8KIAljaC0+YXN5bmNmbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOwotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHNldHVwX2VtcHR5X2V2ZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCkBAIC0xMDgwLDE1ICsxMDg1LDE0IEBACiAJc3RydWN0IG1veGFfc3RyICpjaCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZtb3hhX2xvY2ssIGZsYWdzKTsKIAljaC0+c3RhdHVzZmxhZ3MgfD0gRU1QVFlXQUlUOwogCW1veGFFbXB0eVRpbWVyX29uW2NoLT5wb3J0XSA9IDA7CiAJZGVsX3RpbWVyKCZtb3hhRW1wdHlUaW1lcltjaC0+cG9ydF0pOwogCW1veGFFbXB0eVRpbWVyW2NoLT5wb3J0XS5leHBpcmVzID0gamlmZmllcyArIEhaOwogCW1veGFFbXB0eVRpbWVyX29uW2NoLT5wb3J0XSA9IDE7CiAJYWRkX3RpbWVyKCZtb3hhRW1wdHlUaW1lcltjaC0+cG9ydF0pOwotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1veGFfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBjaGVja194bWl0X2VtcHR5KHVuc2lnbmVkIGxvbmcgZGF0YSkKQEAgLTExMzUsOCArMTEzOSw2IEBACiB7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnRwOwogCXN0cnVjdCB0ZXJtaW9zICp0czsKLQlpbnQgaSwgY291bnQsIHJjLCBzcGFjZTsKLQl1bnNpZ25lZCBjaGFyICpjaGFycHRyLCAqZmxhZ3B0cjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJdHMgPSBOVUxMOwpAQCAtMTE1MCwyNCArMTE1MiwxMCBAQAogCQlNb3hhUG9ydEZsdXNoRGF0YShjaC0+cG9ydCwgMCk7CiAJCXJldHVybjsKIAl9Ci0Jc3BhY2UgPSBUVFlfRkxJUEJVRl9TSVpFIC0gdHAtPmZsaXAuY291bnQ7Ci0JaWYgKHNwYWNlIDw9IDApCi0JCXJldHVybjsKLQljaGFycHRyID0gdHAtPmZsaXAuY2hhcl9idWZfcHRyOwotCWZsYWdwdHIgPSB0cC0+ZmxpcC5mbGFnX2J1Zl9wdHI7Ci0JcmMgPSB0cC0+ZmxpcC5jb3VudDsKLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKLQljb3VudCA9IE1veGFQb3J0UmVhZERhdGEoY2gtPnBvcnQsIGNoYXJwdHIsIHNwYWNlKTsKLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJKmZsYWdwdHIrKyA9IDA7Ci0JY2hhcnB0ciArPSBjb3VudDsKLQlyYyArPSBjb3VudDsKLQl0cC0+ZmxpcC5jb3VudCA9IHJjOwotCXRwLT5mbGlwLmNoYXJfYnVmX3B0ciA9IGNoYXJwdHI7Ci0JdHAtPmZsaXAuZmxhZ19idWZfcHRyID0gZmxhZ3B0cjsKLQl0dHlfc2NoZWR1bGVfZmxpcChjaC0+dHR5KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbW94YV9sb2NrLCBmbGFncyk7CisJTW94YVBvcnRSZWFkRGF0YShjaC0+cG9ydCwgdHApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1veGFfbG9jaywgZmxhZ3MpOworCXR0eV9zY2hlZHVsZV9mbGlwKHRwKTsKIH0KIAogI2RlZmluZSBNYWdpY19jb2RlCTB4NDA0CkBAIC0xNjYxLDYgKzE2NDksOCBAQAogCWNhc2UgTU9YQV9GSU5EX0JPQVJEOgogCWNhc2UgTU9YQV9MT0FEX0MzMjBCOgogCWNhc2UgTU9YQV9MT0FEX0NPREU6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCXJldHVybiAtRVBFUk07CiAJCWJyZWFrOwogCX0KIApAQCAtMTc3NCw3ICsxNzY0LDcgQEAKICAqCTE0LiBNb3hhUG9ydERDRE9OKGludCBwb3J0KTsJCQkJCSAgICAgKgogICoJMTUuIE1veGFQb3J0Rmx1c2hEYXRhKGludCBwb3J0LCBpbnQgbW9kZSk7CSAgICAgICAgICAgICAgICAgICAgICoKICAqCTE2LiBNb3hhUG9ydFdyaXRlRGF0YShpbnQgcG9ydCwgdW5zaWduZWQgY2hhciAqIGJ1ZmZlciwgaW50IGxlbmd0aCk7ICoKLSAqCTE3LiBNb3hhUG9ydFJlYWREYXRhKGludCBwb3J0LCB1bnNpZ25lZCBjaGFyICogYnVmZmVyLCBpbnQgbGVuZ3RoKTsgICoKKyAqCTE3LiBNb3hhUG9ydFJlYWREYXRhKGludCBwb3J0LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsgCSAgICAgKgogICoJMTguIE1veGFQb3J0VHhCdWZTaXplKGludCBwb3J0KTsJCQkJICAgICAqCiAgKgkxOS4gTW94YVBvcnRSeEJ1ZlNpemUoaW50IHBvcnQpOwkJCQkgICAgICoKICAqCTIwLiBNb3hhUG9ydFR4UXVldWUoaW50IHBvcnQpOwkJCQkJICAgICAqCkBAIC0yMDAzLDEwICsxOTkzLDkgQEAKICAqCiAgKiAgICAgIEZ1bmN0aW9uIDIxOiAgICBSZWFkIGRhdGEuCiAgKiAgICAgIFN5bnRheDoKLSAqICAgICAgaW50ICBNb3hhUG9ydFJlYWREYXRhKGludCBwb3J0LCB1bnNpZ25lZCBjaGFyICogYnVmZmVyLCBpbnQgbGVuZ3RoKTsKKyAqICAgICAgaW50ICBNb3hhUG9ydFJlYWREYXRhKGludCBwb3J0LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKICAqICAgICAgICAgICBpbnQgcG9ydCAgICAgICAgICAgOiBwb3J0IG51bWJlciAoMCAtIDEyNykKLSAqICAgICAgICAgICB1bnNpZ25lZCBjaGFyICogYnVmZmVyICAgICA6IHBvaW50ZXIgdG8gcmVhZCBkYXRhIGJ1ZmZlci4KLSAqICAgICAgICAgICBpbnQgbGVuZ3RoICAgICAgICAgOiByZWFkIGRhdGEgYnVmZmVyIGxlbmd0aAorICoJICAgICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5IDogdHR5IGZvciBkYXRhCiAgKgogICogICAgICAgICAgIHJldHVybjogICAgMCAtIGxlbmd0aCAgICAgIDogcmVhbCByZWFkIGRhdGEgbGVuZ3RoCiAgKgpAQCAtMjUwNCw3ICsyNDkzLDcgQEAKIAlyZXR1cm4gKHRvdGFsKTsKIH0KIAotaW50IE1veGFQb3J0UmVhZERhdGEoaW50IHBvcnQsIHVuc2lnbmVkIGNoYXIgKiBidWZmZXIsIGludCBzcGFjZSkKK2ludCBNb3hhUG9ydFJlYWREYXRhKGludCBwb3J0LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCXJlZ2lzdGVyIHVzaG9ydCBoZWFkLCBwYWdlb2ZzOwogCWludCBpLCBjb3VudCwgY250LCBsZW4sIHRvdGFsLCByZW1haW47CkBAIC0yNTIyLDkgKzI1MTEsOSBAQAogCWNvdW50ID0gKHRhaWwgPj0gaGVhZCkgPyAodGFpbCAtIGhlYWQpCiAJICAgIDogKHRhaWwgLSBoZWFkICsgcnhfbWFzayArIDEpOwogCWlmIChjb3VudCA9PSAwKQotCQlyZXR1cm4gKDApOworCQlyZXR1cm4gMDsKIAotCXRvdGFsID0gKHNwYWNlID4gY291bnQpID8gY291bnQgOiBzcGFjZTsKKwl0b3RhbCA9IGNvdW50OwogCXJlbWFpbiA9IGNvdW50IC0gdG90YWw7CiAJbW94YUxvZy5yeGNudFtwb3J0XSArPSB0b3RhbDsKIAljb3VudCA9IHRvdGFsOwpAQCAtMjUzOSw3ICsyNTI4LDcgQEAKIAkJCWxlbiA9IChjb3VudCA+IGxlbikgPyBsZW4gOiBjb3VudDsKIAkJCW9mcyA9IGJhc2VBZGRyICsgRHluUGFnZV9hZGRyICsgYnVmaGVhZCArIGhlYWQ7CiAJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCQkJKmJ1ZmZlcisrID0gcmVhZGIob2ZzICsgaSk7CisJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCByZWFkYihvZnMgKyBpKSwgVFRZX05PUk1BTCk7CiAJCQloZWFkID0gKGhlYWQgKyBsZW4pICYgcnhfbWFzazsKIAkJCWNvdW50IC09IGxlbjsKIAkJfQpAQCAtMjU1Niw3ICsyNTQ1LDcgQEAKIAkJCXdyaXRldyhwYWdlbm8sIGJhc2VBZGRyICsgQ29udHJvbF9yZWcpOwogCQkJb2ZzID0gYmFzZUFkZHIgKyBEeW5QYWdlX2FkZHIgKyBwYWdlb2ZzOwogCQkJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKQotCQkJCSpidWZmZXIrKyA9IHJlYWRiKG9mcyArIGkpOworCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgcmVhZGIob2ZzICsgaSksIFRUWV9OT1JNQUwpOwogCQkJaWYgKGNvdW50ID09IDApIHsKIAkJCQl3cml0ZXcoKGhlYWQgKyBsZW4pICYgcnhfbWFzaywgb2ZzQWRkciArIFJYcnB0cik7CiAJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXhzZXIuYyBiL2RyaXZlcnMvY2hhci9teHNlci5jCmluZGV4IDI2NDQ4ZjEuLmVhNzI1YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9teHNlci5jCisrKyBiL2RyaXZlcnMvY2hhci9teHNlci5jCkBAIC04MTMsNyArODEzLDcgQEAKIAogCS8qIHN0YXJ0IGZpbmRpbmcgUENJIGJvYXJkIGhlcmUgKi8KICNpZmRlZiBDT05GSUdfUENJCi0JbiA9IChzaXplb2YobXhzZXJfcGNpYnJkcykgLyBzaXplb2YobXhzZXJfcGNpYnJkc1swXSkpIC0gMTsKKwluID0gQVJSQVlfU0laRShteHNlcl9wY2licmRzKSAtIDE7CiAJaW5kZXggPSAwOwogCWIgPSAwOwogCXdoaWxlIChiIDwgbikgewpAQCAtMTk4Miw3ICsxOTgyLDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwogCi0JcmVjdl9yb29tID0gdHR5LT5sZGlzYy5yZWNlaXZlX3Jvb20odHR5KTsKKwlyZWN2X3Jvb20gPSB0dHktPnJlY2VpdmVfcm9vbTsKIAlpZiAoKHJlY3Zfcm9vbSA9PSAwKSAmJiAoIWluZm8tPmxkaXNjX3N0b3BfcngpKSB7CiAJCS8vbXhzZXJfdGhyb3R0bGUodHR5KTsKIAkJbXhzZXJfc3RvcHJ4KHR0eSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbl9oZGxjLmMgYi9kcml2ZXJzL2NoYXIvbl9oZGxjLmMKaW5kZXggYTEzM2E2Mi4uOWY1NDczMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL25faGRsYy5jCisrKyBiL2RyaXZlcnMvY2hhci9uX2hkbGMuYwpAQCAtMTkxLDcgKzE5MSw2IEBACiAJCQkJICAgIHBvbGxfdGFibGUgKndhaXQpOwogc3RhdGljIGludCBuX2hkbGNfdHR5X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBzdGF0aWMgdm9pZCBuX2hkbGNfdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIGludCBuX2hkbGNfdHR5X3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBzdGF0aWMgdm9pZCBuX2hkbGNfdHR5X3JlY2VpdmUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgX191OCAqY3AsCiAJCQkgICAgICAgY2hhciAqZnAsIGludCBjb3VudCk7CiBzdGF0aWMgdm9pZCBuX2hkbGNfdHR5X3dha2V1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKQEAgLTIxMiw3ICsyMTEsNiBAQAogCS5pb2N0bAkJPSBuX2hkbGNfdHR5X2lvY3RsLAogCS5wb2xsCQk9IG5faGRsY190dHlfcG9sbCwKIAkucmVjZWl2ZV9idWYJPSBuX2hkbGNfdHR5X3JlY2VpdmUsCi0JLnJlY2VpdmVfcm9vbQk9IG5faGRsY190dHlfcm9vbSwKIAkud3JpdGVfd2FrZXVwCT0gbl9oZGxjX3R0eV93YWtldXAsCiB9OwogCkBAIC0zMzcsNiArMzM1LDcgQEAKIAkJCiAJdHR5LT5kaXNjX2RhdGEgPSBuX2hkbGM7CiAJbl9oZGxjLT50dHkgICAgPSB0dHk7CisJdHR5LT5yZWNlaXZlX3Jvb20gPSA2NTUzNjsKIAkKICNpZiBkZWZpbmVkKFRUWV9OT19XUklURV9TUExJVCkKIAkvKiBjaGFuZ2UgdHR5X2lvIHdyaXRlKCkgdG8gbm90IHNwbGl0IGxhcmdlIHdyaXRlcyBpbnRvIDhLIGNodW5rcyAqLwpAQCAtNDc4LDIyICs0NzcsNiBAQAogfQkvKiBlbmQgb2Ygbl9oZGxjX3R0eV93YWtldXAoKSAqLwogCiAvKioKLSAqIG5faGRsY190dHlfcm9vbSAtIFJldHVybiB0aGUgYW1vdW50IG9mIHNwYWNlIGxlZnQgaW4gdGhlIHJlY2VpdmVyJ3MgYnVmZmVyCi0gKiBAdHR5CS0gcG9pbnRlciB0byBhc3NvY2lhdGVkIHR0eSBpbnN0YW5jZSBkYXRhCi0gKgotICogQ2FsbGJhY2sgZnVuY3Rpb24gZnJvbSB0dHkgZHJpdmVyLiBSZXR1cm4gdGhlIGFtb3VudCBvZiBzcGFjZSBsZWZ0IGluIHRoZQotICogcmVjZWl2ZXIncyBidWZmZXIgdG8gZGVjaWRlIGlmIHJlbW90ZSB0cmFuc21pdHRlciBpcyB0byBiZSB0aHJvdHRsZWQuCi0gKi8KLXN0YXRpYyBpbnQgbl9oZGxjX3R0eV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0JaWYgKGRlYnVnbGV2ZWwgPj0gREVCVUdfTEVWRUxfSU5GTykJCi0JCXByaW50aygiJXMoJWQpbl9oZGxjX3R0eV9yb29tKCkgY2FsbGVkXG4iLF9fRklMRV9fLF9fTElORV9fKTsKLQkvKiBhbHdheXMgcmV0dXJuIGEgbGFyZ2VyIG51bWJlciB0byBwcmV2ZW50ICovCi0JLyogdGhyb3R0bGluZyBvZiByZW1vdGUgdHJhbnNtaXR0ZXIuICovCi0JcmV0dXJuIDY1NTM2OwotfQkvKiBlbmQgb2Ygbl9oZGxjX3R0eV9yb290KCkgKi8KLQotLyoqCiAgKiBuX2hkbGNfdHR5X3JlY2VpdmUgLSBDYWxsZWQgYnkgdHR5IGRyaXZlciB3aGVuIHJlY2VpdmUgZGF0YSBpcyBhdmFpbGFibGUKICAqIEB0dHkJLSBwb2ludGVyIHRvIHR0eSBpbnN0YW5jZSBkYXRhCiAgKiBAZGF0YSAtIHBvaW50ZXIgdG8gcmVjZWl2ZWQgZGF0YQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL25fcjM5NjQuYyBiL2RyaXZlcnMvY2hhci9uX3IzOTY0LmMKaW5kZXggODUzYzk4Yy4uYzQ4ZGUwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL25fcjM5NjQuYworKysgYi9kcml2ZXJzL2NoYXIvbl9yMzk2NC5jCkBAIC0xNDcsNyArMTQ3LDYgQEAKIAkJICAgICAgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICAqd2FpdCk7CiBzdGF0aWMgdm9pZCByMzk2NF9yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZwLCBpbnQgY291bnQpOwotc3RhdGljIGludCAgcjM5NjRfcmVjZWl2ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwogCiBzdGF0aWMgc3RydWN0IHR0eV9sZGlzYyB0dHlfbGRpc2NfTl9SMzk2NCA9IHsKIAkub3duZXIJID0gVEhJU19NT0RVTEUsCkBAIC0xNjEsNyArMTYwLDYgQEAKIAkuc2V0X3Rlcm1pb3MgPSByMzk2NF9zZXRfdGVybWlvcywKIAkucG9sbAk9IHIzOTY0X3BvbGwsICAgICAgICAgICAgCiAJLnJlY2VpdmVfYnVmID0gcjM5NjRfcmVjZWl2ZV9idWYsCi0JLnJlY2VpdmVfcm9vbSA9IHIzOTY0X3JlY2VpdmVfcm9vbSwKIH07CiAKIApAQCAtMTExOSw2ICsxMTE3LDcgQEAKICAgIHBJbmZvLT5uUmV0cnkgPSAwOwogICAgCiAgICB0dHktPmRpc2NfZGF0YSA9IHBJbmZvOworICAgdHR5LT5yZWNlaXZlX3Jvb20gPSA2NTUzNjsKIAogICAgaW5pdF90aW1lcigmcEluZm8tPnRtcik7CiAgICBwSW5mby0+dG1yLmRhdGEgPSAodW5zaWduZWQgbG9uZylwSW5mbzsKQEAgLTE0MDUsMTIgKzE0MDQsNSBAQAogICAgIH0KIH0KIAotc3RhdGljIGludCByMzk2NF9yZWNlaXZlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLSAgIFRSQUNFX0woInJlY2VpdmVfcm9vbSIpOwotICAgcmV0dXJuIC0xOwotfQotCi0KIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BTElBU19MRElTQyhOX1IzOTY0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9uX3R0eS5jIGIvZHJpdmVycy9jaGFyL25fdHR5LmMKaW5kZXggYzU1NmY0ZC4uY2NhZDdhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL25fdHR5LmMKKysrIGIvZHJpdmVycy9jaGFyL25fdHR5LmMKQEAgLTc4LDcgKzc4LDMyIEBACiAJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgYnVmKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHB1dF90dHlfcXVldWVfbm9sb2NrKHVuc2lnbmVkIGNoYXIgYywgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKKy8qKgorICoJbl90dHlfc2V0X19yb29tCS0JcmVjZWl2ZSBzcGFjZQorICoJQHR0eTogdGVybWluYWwKKyAqCisgKglDYWxsZWQgYnkgdGhlIGRyaXZlciB0byBmaW5kIG91dCBob3cgbXVjaCBkYXRhIGl0IGlzCisgKglwZXJtaXR0ZWQgdG8gZmVlZCB0byB0aGUgbGluZSBkaXNjaXBsaW5lIHdpdGhvdXQgYW55IGJlaW5nIGxvc3QKKyAqCWFuZCB0aHVzIHRvIG1hbmFnZSBmbG93IGNvbnRyb2wuIE5vdCBzZXJpYWxpemVkLiBBbnN3ZXJzIGZvciB0aGUKKyAqCSJpbnN0YW50Ii4KKyAqLworCitzdGF0aWMgdm9pZCBuX3R0eV9zZXRfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWludAlsZWZ0ID0gTl9UVFlfQlVGX1NJWkUgLSB0dHktPnJlYWRfY250IC0gMTsKKworCS8qCisJICogSWYgd2UgYXJlIGRvaW5nIGlucHV0IGNhbm9uaWNhbGl6YXRpb24sIGFuZCB0aGVyZSBhcmUgbm8KKwkgKiBwZW5kaW5nIG5ld2xpbmVzLCBsZXQgY2hhcmFjdGVycyB0aHJvdWdoIHdpdGhvdXQgbGltaXQsIHNvCisJICogdGhhdCBlcmFzZSBjaGFyYWN0ZXJzIHdpbGwgYmUgaGFuZGxlZC4gIE90aGVyIGV4Y2VzcworCSAqIGNoYXJhY3RlcnMgd2lsbCBiZSBiZWVwZWQuCisJICovCisJaWYgKGxlZnQgPD0gMCkKKwkJbGVmdCA9IHR0eS0+aWNhbm9uICYmICF0dHktPmNhbm9uX2RhdGE7CisJdHR5LT5yZWNlaXZlX3Jvb20gPSBsZWZ0OworfQorCitzdGF0aWMgdm9pZCBwdXRfdHR5X3F1ZXVlX25vbG9jayh1bnNpZ25lZCBjaGFyIGMsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJaWYgKHR0eS0+cmVhZF9jbnQgPCBOX1RUWV9CVUZfU0laRSkgewogCQl0dHktPnJlYWRfYnVmW3R0eS0+cmVhZF9oZWFkXSA9IGM7CkBAIC04Nyw3ICsxMTIsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHB1dF90dHlfcXVldWUodW5zaWduZWQgY2hhciBjLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQorc3RhdGljIHZvaWQgcHV0X3R0eV9xdWV1ZSh1bnNpZ25lZCBjaGFyIGMsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkvKgpAQCAtMTM2LDYgKzE2MSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5yZWFkX2xvY2ssIGZsYWdzKTsKIAl0dHktPmNhbm9uX2hlYWQgPSB0dHktPmNhbm9uX2RhdGEgPSB0dHktPmVyYXNpbmcgPSAwOwogCW1lbXNldCgmdHR5LT5yZWFkX2ZsYWdzLCAwLCBzaXplb2YgdHR5LT5yZWFkX2ZsYWdzKTsKKwluX3R0eV9zZXRfcm9vbSh0dHkpOwogCWNoZWNrX3VudGhyb3R0bGUodHR5KTsKIH0KIApAQCAtODM4LDMwICs4NjQsNiBAQAogCXB1dF90dHlfcXVldWUoYywgdHR5KTsKIH0JCiAKLS8qKgotICoJbl90dHlfcmVjZWl2ZV9yb29tCS0JcmVjZWl2ZSBzcGFjZQotICoJQHR0eTogdGVybWluYWwKLSAqCi0gKglDYWxsZWQgYnkgdGhlIGRyaXZlciB0byBmaW5kIG91dCBob3cgbXVjaCBkYXRhIGl0IGlzCi0gKglwZXJtaXR0ZWQgdG8gZmVlZCB0byB0aGUgbGluZSBkaXNjaXBsaW5lIHdpdGhvdXQgYW55IGJlaW5nIGxvc3QKLSAqCWFuZCB0aHVzIHRvIG1hbmFnZSBmbG93IGNvbnRyb2wuIE5vdCBzZXJpYWxpemVkLiBBbnN3ZXJzIGZvciB0aGUKLSAqCSJpbnN0YW50Ii4KLSAqLwotIAotc3RhdGljIGludCBuX3R0eV9yZWNlaXZlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlpbnQJbGVmdCA9IE5fVFRZX0JVRl9TSVpFIC0gdHR5LT5yZWFkX2NudCAtIDE7Ci0KLQkvKgotCSAqIElmIHdlIGFyZSBkb2luZyBpbnB1dCBjYW5vbmljYWxpemF0aW9uLCBhbmQgdGhlcmUgYXJlIG5vCi0JICogcGVuZGluZyBuZXdsaW5lcywgbGV0IGNoYXJhY3RlcnMgdGhyb3VnaCB3aXRob3V0IGxpbWl0LCBzbwotCSAqIHRoYXQgZXJhc2UgY2hhcmFjdGVycyB3aWxsIGJlIGhhbmRsZWQuICBPdGhlciBleGNlc3MKLQkgKiBjaGFyYWN0ZXJzIHdpbGwgYmUgYmVlcGVkLgotCSAqLwotCWlmIChsZWZ0IDw9IDApCi0JCWxlZnQgPSB0dHktPmljYW5vbiAmJiAhdHR5LT5jYW5vbl9kYXRhOwotCXJldHVybiBsZWZ0OwotfQogCiAvKioKICAqCW5fdHR5X3dyaXRlX3dha2V1cAktCWFzeW5jaHJvbm91cyBJL08gbm90aWZpZXIKQEAgLTk1Myw2ICs5NTUsOCBAQAogCQkJdHR5LT5kcml2ZXItPmZsdXNoX2NoYXJzKHR0eSk7CiAJfQogCisJbl90dHlfc2V0X3Jvb20odHR5KTsKKwogCWlmICghdHR5LT5pY2Fub24gJiYgKHR0eS0+cmVhZF9jbnQgPj0gdHR5LT5taW5pbXVtX3RvX3dha2UpKSB7CiAJCWtpbGxfZmFzeW5jKCZ0dHktPmZhc3luYywgU0lHSU8sIFBPTExfSU4pOwogCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmdHR5LT5yZWFkX3dhaXQpKQpAQCAtOTY0LDcgKzk2OCw3IEBACiAJICogbW9kZS4gIFdlIGRvbid0IHdhbnQgdG8gdGhyb3R0bGUgdGhlIGRyaXZlciBpZiB3ZSdyZSBpbgogCSAqIGNhbm9uaWNhbCBtb2RlIGFuZCBkb24ndCBoYXZlIGEgbmV3bGluZSB5ZXQhCiAJICovCi0JaWYgKG5fdHR5X3JlY2VpdmVfcm9vbSh0dHkpIDwgVFRZX1RIUkVTSE9MRF9USFJPVFRMRSkgeworCWlmICh0dHktPnJlY2VpdmVfcm9vbSA8IFRUWV9USFJFU0hPTERfVEhST1RUTEUpIHsKIAkJLyogY2hlY2sgVFRZX1RIUk9UVExFRCBmaXJzdCBzbyBpdCBpbmRpY2F0ZXMgb3VyIHN0YXRlICovCiAJCWlmICghdGVzdF9hbmRfc2V0X2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncykgJiYKIAkJICAgIHR0eS0+ZHJpdmVyLT50aHJvdHRsZSkKQEAgLTk5OSw2ICsxMDAzLDcgQEAKIAlpZiAodGVzdF9iaXQoVFRZX0hXX0NPT0tfSU4sICZ0dHktPmZsYWdzKSkgewogCQl0dHktPnJhdyA9IDE7CiAJCXR0eS0+cmVhbF9yYXcgPSAxOworCQluX3R0eV9zZXRfcm9vbSh0dHkpOwogCQlyZXR1cm47CiAJfQogCWlmIChJX0lTVFJJUCh0dHkpIHx8IElfSVVDTEModHR5KSB8fCBJX0lHTkNSKHR0eSkgfHwKQEAgLTEwNTEsNiArMTA1Niw3IEBACiAJCWVsc2UKIAkJCXR0eS0+cmVhbF9yYXcgPSAwOwogCX0KKwluX3R0eV9zZXRfcm9vbSh0dHkpOwogfQogCiAvKioKQEAgLTExMzAsNyArMTEzNiw3IEBACiAgKgogICovCiAgCi1zdGF0aWMgaW5saW5lIGludCBjb3B5X2Zyb21fcmVhZF9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKK3N0YXRpYyBpbnQgY29weV9mcm9tX3JlYWRfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCiAJCQkJICAgICAgdW5zaWduZWQgY2hhciBfX3VzZXIgKipiLAogCQkJCSAgICAgIHNpemVfdCAqbnIpCiAKQEAgLTEzMDgsNiArMTMxNCw3IEBACiAJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOwogCQkJCWJyZWFrOwogCQkJfQorCQkJbl90dHlfc2V0X3Jvb20odHR5KTsKIAkJCWNsZWFyX2JpdChUVFlfRE9OVF9GTElQLCAmdHR5LT5mbGFncyk7CiAJCQl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKIAkJCXNldF9iaXQoVFRZX0RPTlRfRkxJUCwgJnR0eS0+ZmxhZ3MpOwpAQCAtMTQwMSw2ICsxNDA4LDggQEAKIAl9IGVsc2UgaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChUVFlfUFVTSCwgJnR0eS0+ZmxhZ3MpKQogCQkgZ290byBkb19pdF9hZ2FpbjsKIAorCW5fdHR5X3NldF9yb29tKHR0eSk7CisKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0xNTUzLDcgKzE1NjIsNiBAQAogCW5vcm1hbF9wb2xsLAkJLyogcG9sbCAqLwogCU5VTEwsCQkJLyogaGFuZ3VwICovCiAJbl90dHlfcmVjZWl2ZV9idWYsCS8qIHJlY2VpdmVfYnVmICovCi0Jbl90dHlfcmVjZWl2ZV9yb29tLAkvKiByZWNlaXZlX3Jvb20gKi8KIAluX3R0eV93cml0ZV93YWtldXAJLyogd3JpdGVfd2FrZXVwICovCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbnZyYW0uYyBiL2RyaXZlcnMvY2hhci9udnJhbS5jCmluZGV4IDFhZjczM2QuLjM1NTZjY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9udnJhbS5jCisrKyBiL2RyaXZlcnMvY2hhci9udnJhbS5jCkBAIC01NTcsMTMgKzU1NywxMyBAQAogCSAgICAobnZyYW1bNl0gJiAxKSA/IChudnJhbVs2XSA+PiA2KSArIDEgOiAwKTsKIAlQUklOVF9QUk9DKCJGbG9wcHkgMCB0eXBlICA6ICIpOwogCXR5cGUgPSBudnJhbVsyXSA+PiA0OwotCWlmICh0eXBlIDwgc2l6ZW9mIChmbG9wcHlfdHlwZXMpIC8gc2l6ZW9mICgqZmxvcHB5X3R5cGVzKSkKKwlpZiAodHlwZSA8IEFSUkFZX1NJWkUoZmxvcHB5X3R5cGVzKSkKIAkJUFJJTlRfUFJPQygiJXNcbiIsIGZsb3BweV90eXBlc1t0eXBlXSk7CiAJZWxzZQogCQlQUklOVF9QUk9DKCIlZCAodW5rbm93bilcbiIsIHR5cGUpOwogCVBSSU5UX1BST0MoIkZsb3BweSAxIHR5cGUgIDogIik7CiAJdHlwZSA9IG52cmFtWzJdICYgMHgwZjsKLQlpZiAodHlwZSA8IHNpemVvZiAoZmxvcHB5X3R5cGVzKSAvIHNpemVvZiAoKmZsb3BweV90eXBlcykpCisJaWYgKHR5cGUgPCBBUlJBWV9TSVpFKGZsb3BweV90eXBlcykpCiAJCVBSSU5UX1BST0MoIiVzXG4iLCBmbG9wcHlfdHlwZXNbdHlwZV0pOwogCWVsc2UKIAkJUFJJTlRfUFJPQygiJWQgKHVua25vd24pXG4iLCB0eXBlKTsKQEAgLTg0Myw4ICs4NDMsNiBAQAogCSIyIiwgIjQiLCAiMTYiLCAiMjU2IiwgIjY1NTM2IiwgIj8/IiwgIj8/IiwgIj8/IgogfTsKIAotI2RlZmluZSBmaWVsZHNpemUoYSkJKHNpemVvZihhKS9zaXplb2YoKmEpKQotCiBzdGF0aWMgaW50CiBhdGFyaV9wcm9jX2luZm9zKHVuc2lnbmVkIGNoYXIgKm52cmFtLCBjaGFyICpidWZmZXIsIGludCAqbGVuLAogICAgIG9mZl90ICpiZWdpbiwgb2ZmX3Qgb2Zmc2V0LCBpbnQgc2l6ZSkKQEAgLTg1Niw3ICs4NTQsNyBAQAogCVBSSU5UX1BST0MoIkNoZWNrc3VtIHN0YXR1cyAgOiAlc3ZhbGlkXG4iLCBjaGVja3N1bSA/ICIiIDogIm5vdCAiKTsKIAogCVBSSU5UX1BST0MoIkJvb3QgcHJlZmVyZW5jZSAgOiAiKTsKLQlmb3IgKGkgPSBmaWVsZHNpemUoYm9vdF9wcmVmcykgLSAxOyBpID49IDA7IC0taSkgeworCWZvciAoaSA9IEFSUkFZX1NJWkUoYm9vdF9wcmVmcykgLSAxOyBpID49IDA7IC0taSkgewogCQlpZiAobnZyYW1bMV0gPT0gYm9vdF9wcmVmc1tpXS52YWwpIHsKIAkJCVBSSU5UX1BST0MoIiVzXG4iLCBib290X3ByZWZzW2ldLm5hbWUpOwogCQkJYnJlYWs7CkBAIC04NzgsMTIgKzg3NiwxMiBAQAogCQlyZXR1cm4gMTsKIAogCVBSSU5UX1BST0MoIk9TIGxhbmd1YWdlICAgICAgOiAiKTsKLQlpZiAobnZyYW1bNl0gPCBmaWVsZHNpemUobGFuZ3VhZ2VzKSkKKwlpZiAobnZyYW1bNl0gPCBBUlJBWV9TSVpFKGxhbmd1YWdlcykpCiAJCVBSSU5UX1BST0MoIiVzXG4iLCBsYW5ndWFnZXNbbnZyYW1bNl1dKTsKIAllbHNlCiAJCVBSSU5UX1BST0MoIiV1ICh1bmRlZmluZWQpXG4iLCBudnJhbVs2XSk7CiAJUFJJTlRfUFJPQygiS2V5Ym9hcmQgbGFuZ3VhZ2U6ICIpOwotCWlmIChudnJhbVs3XSA8IGZpZWxkc2l6ZShsYW5ndWFnZXMpKQorCWlmIChudnJhbVs3XSA8IEFSUkFZX1NJWkUobGFuZ3VhZ2VzKSkKIAkJUFJJTlRfUFJPQygiJXNcbiIsIGxhbmd1YWdlc1tudnJhbVs3XV0pOwogCWVsc2UKIAkJUFJJTlRfUFJPQygiJXUgKHVuZGVmaW5lZClcbiIsIG52cmFtWzddKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYyBiL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYwppbmRleCBjZjQ1YjEwLi44YThjYTMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKKysrIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9zeW5jbGlua19jcy5jCkBAIC0xMDA3LDggKzEwMDcsOSBAQAogCiBzdGF0aWMgdm9pZCByeF9yZWFkeV9hc3luYyhNR1NMUENfSU5GTyAqaW5mbywgaW50IHRjZCkKIHsKLQl1bnNpZ25lZCBjaGFyIGRhdGEsIHN0YXR1czsKKwl1bnNpZ25lZCBjaGFyIGRhdGEsIHN0YXR1cywgZmxhZzsKIAlpbnQgZmlmb19jb3VudDsKKwlpbnQgd29yayA9IDA7CiAgCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7CiAgCXN0cnVjdCBtZ3NsX2ljb3VudCAqaWNvdW50ID0gJmluZm8tPmljb3VudDsKIApAQCAtMTAyMywyMCArMTAyNCwxNiBAQAogCQkJZmlmb19jb3VudCA9IDMyOwogCX0gZWxzZQogCQlmaWZvX2NvdW50ID0gMzI7Ci0JCisKKwl0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIGZpZm9fY291bnQpOwogCS8qIEZsdXNoIHJlY2VpdmVkIGFzeW5jIGRhdGEgdG8gcmVjZWl2ZSBkYXRhIGJ1ZmZlci4gKi8gCiAJd2hpbGUgKGZpZm9fY291bnQpIHsKIAkJZGF0YSAgID0gcmVhZF9yZWcoaW5mbywgQ0hBICsgUlhGSUZPKTsKIAkJc3RhdHVzID0gcmVhZF9yZWcoaW5mbywgQ0hBICsgUlhGSUZPKTsKIAkJZmlmb19jb3VudCAtPSAyOwogCi0JCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkKLQkJCWJyZWFrOwotCQkJCi0JCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyID0gZGF0YTsKIAkJaWNvdW50LT5yeCsrOwotCQkKLQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSAwOworCQlmbGFnID0gVFRZX05PUk1BTDsKIAogCQkvLyBpZiBubyBmcmFtZWluZy9jcmMgZXJyb3IgdGhlbiBzYXZlIGRhdGEKIAkJLy8gQklUNzpwYXJpdHkgZXJyb3IKQEAgLTEwNTUsMjYgKzEwNTIsMjMgQEAKIAkJCXN0YXR1cyAmPSBpbmZvLT5yZWFkX3N0YXR1c19tYXNrOwogCiAJCQlpZiAoc3RhdHVzICYgQklUNykKLQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9QQVJJVFk7CisJCQkJZmxhZyA9IFRUWV9QQVJJVFk7CiAJCQllbHNlIGlmIChzdGF0dXMgJiBCSVQ2KQotCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX0ZSQU1FOworCQkJCWZsYWcgPSBUVFlfRlJBTUU7CiAJCX0KLQkJCi0JCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKzsKLQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOwotCQl0dHktPmZsaXAuY291bnQrKzsKKwkJd29yayArPSB0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGRhdGEsIGZsYWcpOwogCX0KIAlpc3N1ZV9jb21tYW5kKGluZm8sIENIQSwgQ01EX1JYRklGTyk7CiAKIAlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKSB7Ci0JCXByaW50aygiJXMoJWQpOnJ4X3JlYWR5X2FzeW5jIGNvdW50PSVkXG4iLAotCQkJX19GSUxFX18sX19MSU5FX18sdHR5LT5mbGlwLmNvdW50KTsKKwkJcHJpbnRrKCIlcyglZCk6cnhfcmVhZHlfYXN5bmMiLAorCQkJX19GSUxFX18sX19MSU5FX18pOwogCQlwcmludGsoIiVzKCVkKTpyeD0lZCBicms9JWQgcGFyaXR5PSVkIGZyYW1lPSVkIG92ZXJydW49JWRcbiIsCiAJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpY291bnQtPnJ4LGljb3VudC0+YnJrLAogCQkJaWNvdW50LT5wYXJpdHksaWNvdW50LT5mcmFtZSxpY291bnQtPm92ZXJydW4pOwogCX0KIAkJCQotCWlmICh0dHktPmZsaXAuY291bnQpCisJaWYgKHdvcmspCiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiB9CiAKQEAgLTQwMDUsNyArMzk5OSw3IEBACiB7CiAJc3RhdGljIHVuc2lnbmVkIGNoYXIgcGF0dGVybnNbXSA9IAogCSAgICB7IDB4MDAsIDB4ZmYsIDB4YWEsIDB4NTUsIDB4NjksIDB4OTYsIDB4MGYgfTsKLQlzdGF0aWMgdW5zaWduZWQgaW50IGNvdW50ID0gc2l6ZW9mKHBhdHRlcm5zKSAvIHNpemVvZihwYXR0ZXJuc1swXSk7CisJc3RhdGljIHVuc2lnbmVkIGludCBjb3VudCA9IEFSUkFZX1NJWkUocGF0dGVybnMpOwogCXVuc2lnbmVkIGludCBpOwogCUJPT0xFQU4gcmMgPSBUUlVFOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC00MDE2LDcgKzQwMTAsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAJCXdyaXRlX3JlZyhpbmZvLCBYQUQxLCBwYXR0ZXJuc1tpXSk7CiAJCXdyaXRlX3JlZyhpbmZvLCBYQUQyLCBwYXR0ZXJuc1soaSArIDEpICUgY291bnRdKTsKLQkJaWYgKChyZWFkX3JlZyhpbmZvLCBYQUQxKSAhPSBwYXR0ZXJuc1tpXSkgfHwgCisJCWlmICgocmVhZF9yZWcoaW5mbywgWEFEMSkgIT0gcGF0dGVybnNbaV0pIHx8CiAJCSAgICAocmVhZF9yZWcoaW5mbywgWEFEMikgIT0gcGF0dGVybnNbKGkgKyAxKSAlIGNvdW50XSkpIHsKIAkJCXJjID0gRkFMU0U7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wdHkuYyBiL2RyaXZlcnMvY2hhci9wdHkuYwppbmRleCA0OWYzOTk3Li45YjVhMmMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcHR5LmMKKysrIGIvZHJpdmVycy9jaGFyL3B0eS5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAlpZiAoIXRvIHx8IHR0eS0+c3RvcHBlZCkKIAkJcmV0dXJuIDA7CiAKLQljID0gdG8tPmxkaXNjLnJlY2VpdmVfcm9vbSh0byk7CisJYyA9IHRvLT5yZWNlaXZlX3Jvb207CiAJaWYgKGMgPiBjb3VudCkKIAkJYyA9IGNvdW50OwogCXRvLT5sZGlzYy5yZWNlaXZlX2J1Zih0bywgYnVmLCBOVUxMLCBjKTsKQEAgLTEyNiw3ICsxMjYsNyBAQAogCWlmICghdG8gfHwgdHR5LT5zdG9wcGVkKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiB0by0+bGRpc2MucmVjZWl2ZV9yb29tKHRvKTsKKwlyZXR1cm4gdG8tPnJlY2VpdmVfcm9vbTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yYW5kb20uYyBiL2RyaXZlcnMvY2hhci9yYW5kb20uYwppbmRleCBiZGZkZmQyLi44NmJlMDRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKKysrIGIvZHJpdmVycy9jaGFyL3JhbmRvbS5jCkBAIC02MzIsNyArNjMyLDcgQEAKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCi1leHRlcm4gdm9pZCBhZGRfaW5wdXRfcmFuZG9tbmVzcyh1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGNvZGUsCit2b2lkIGFkZF9pbnB1dF9yYW5kb21uZXNzKHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSwKIAkJCQkgdW5zaWduZWQgaW50IHZhbHVlKQogewogCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGxhc3RfdmFsdWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2JvYXJkLmggYi9kcml2ZXJzL2NoYXIvcmlvL2JvYXJkLmgKaW5kZXggMGIzOTdlMS4uMjljOTgwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9ib2FyZC5oCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vYm9hcmQuaApAQCAtNTIsNjMgKzUyLDU3IEBACiAvKgogKioJVGhlIHNoYXBlIG9mIHRoZSBIb3N0IENvbnRyb2wgYXJlYSwgYXQgb2Zmc2V0IDB4N0MwMCwgV3JpdGUgT25seQogKi8KLXN0cnVjdCBzX0N0cmwKLXsKLQlCWVRFCURwQ3RsOwkJCQkvKiA3QzAwICovCi0JQllURQlEcF9VbnVzZWQyX1sxMjddOwotCUJZVEUJRHBJbnRTZXQ7CQkJLyogN0M4MCAqLwotCUJZVEUJRHBfVW51c2VkM19bMTI3XTsKLQlCWVRFCURwVHB1UmVzZXQ7CQkJLyogN0QwMCAqLwotCUJZVEUJRHBfVW51c2VkNF9bMTI3XTsKLQlCWVRFCURwSW50UmVzZXQ7CQkJLyogN0Q4MCAqLwotCUJZVEUJRHBfVW51c2VkNV9bMTI3XTsKK3N0cnVjdCBzX0N0cmwgeworCUJZVEUgRHBDdGw7CQkvKiA3QzAwICovCisJQllURSBEcF9VbnVzZWQyX1sxMjddOworCUJZVEUgRHBJbnRTZXQ7CQkvKiA3QzgwICovCisJQllURSBEcF9VbnVzZWQzX1sxMjddOworCUJZVEUgRHBUcHVSZXNldDsJLyogN0QwMCAqLworCUJZVEUgRHBfVW51c2VkNF9bMTI3XTsKKwlCWVRFIERwSW50UmVzZXQ7CS8qIDdEODAgKi8KKwlCWVRFIERwX1VudXNlZDVfWzEyN107CiB9OwogCiAvKgogKiogVGhlIFBST00gZGF0YSBhcmVhIG9uIHRoZSBob3N0ICgweDdDMDApLCBSZWFkIE9ubHkKICovCi1zdHJ1Y3Qgc19Qcm9tCi17Ci0JV09SRAlEcFNseENvZGVbMl07Ci0JV09SRAlEcFJldjsKLQlXT1JECURwX1VudXNlZDZfOwotCVdPUkQJRHBVbmlxWzRdOwotCVdPUkQJRHBKYWhyZTsKLQlXT1JECURwV29jaGU7Ci0JV09SRAlEcEh3RmVhdHVyZVs1XTsKLQlXT1JECURwT2VtSWQ7Ci0JV09SRAlEcFNpZ2d5WzE2XTsKK3N0cnVjdCBzX1Byb20geworCVdPUkQgRHBTbHhDb2RlWzJdOworCVdPUkQgRHBSZXY7CisJV09SRCBEcF9VbnVzZWQ2XzsKKwlXT1JEIERwVW5pcVs0XTsKKwlXT1JEIERwSmFocmU7CisJV09SRCBEcFdvY2hlOworCVdPUkQgRHBId0ZlYXR1cmVbNV07CisJV09SRCBEcE9lbUlkOworCVdPUkQgRHBTaWdneVsxNl07CiB9OwogCiAvKgogKiogVW5pb24gb2YgdGhlIEN0cmwgYW5kIFByb20gYXJlYXMKICovCi11bmlvbiB1X0N0cmxQcm9tCS8qIFRoaXMgaXMgdGhlIGNvbnRyb2wvUFJPTSBhcmVhICgweDdDMDApICovCi17Ci0Jc3RydWN0IHNfQ3RybAlEcEN0cmw7Ci0Jc3RydWN0IHNfUHJvbQlEcFByb207Cit1bmlvbiB1X0N0cmxQcm9tIHsJCS8qIFRoaXMgaXMgdGhlIGNvbnRyb2wvUFJPTSBhcmVhICgweDdDMDApICovCisJc3RydWN0IHNfQ3RybCBEcEN0cmw7CisJc3RydWN0IHNfUHJvbSBEcFByb207CiB9OwogCiAvKgogKiogVGhlIHRvcCBlbmQgb2YgbWVtb3J5IQogKi8KLXN0cnVjdCBzX1Bhcm1NYXBTCQkvKiBBcmVhIGNvbnRhaW5pbmcgUGFybSBNYXAgUG9pbnRlciAqLwotewotCUJZVEUJRHBfVW51c2VkOF9bRFBfUEFSTU1BUF9BRERSXTsKLQlXT1JECURwUGFybU1hcEFkOworc3RydWN0IHNfUGFybU1hcFMgewkJLyogQXJlYSBjb250YWluaW5nIFBhcm0gTWFwIFBvaW50ZXIgKi8KKwlCWVRFIERwX1VudXNlZDhfW0RQX1BBUk1NQVBfQUREUl07CisJV09SRCBEcFBhcm1NYXBBZDsKIH07CiAKLXN0cnVjdCBzX1N0YXJ0VXBTCi17Ci0JQllURSAgICBEcF9VbnVzZWQ5X1tEUF9TVEFSVFVQX0FERFJdOwotCUJZVEUJRHBfTG9uZ0p1bXBbMHg0XTsKLQlCWVRFCURwX1VudXNlZDEwX1syXTsKLQlCWVRFCURwX1Nob3J0SnVtcFsweDJdOworc3RydWN0IHNfU3RhcnRVcFMgeworCUJZVEUgRHBfVW51c2VkOV9bRFBfU1RBUlRVUF9BRERSXTsKKwlCWVRFIERwX0xvbmdKdW1wWzB4NF07CisJQllURSBEcF9VbnVzZWQxMF9bMl07CisJQllURSBEcF9TaG9ydEp1bXBbMHgyXTsKIH07CiAKLXVuaW9uIHVfU3JhbTJQYXJtTWFwCS8qIFRoaXMgaXMgdGhlIHRvcCBvZiBtZW1vcnkgKDB4N0UwMC0weDdGRkYpICovCi17Ci0JQllURQlEcFNyYW1NZW1bRFBfU1JBTTJfU0laRV07Cit1bmlvbiB1X1NyYW0yUGFybU1hcCB7CQkvKiBUaGlzIGlzIHRoZSB0b3Agb2YgbWVtb3J5ICgweDdFMDAtMHg3RkZGKSAqLworCUJZVEUgRHBTcmFtTWVtW0RQX1NSQU0yX1NJWkVdOwogCXN0cnVjdCBzX1Bhcm1NYXBTIERwUGFybU1hcFM7CiAJc3RydWN0IHNfU3RhcnRVcFMgRHBTdGFydFVwUzsKIH07CkBAIC0xMTYsMTMgKzExMCwxMiBAQAogLyoKICoqCVRoaXMgaXMgdGhlIERQIFJBTSBvdmVybGF5LgogKi8KLXN0cnVjdCBEcFJhbQotewotICAgIEJZVEUgCQkgRHBTcmFtMVtEUF9TUkFNMV9TSVpFXTsgICAgIC8qIDAwMDAgLSA3QkZGICovCi0gICAgdW5pb24gdV9DdHJsUHJvbSAgICAgRHBDdHJsUHJvbTsgICAgICAgICAgICAgICAgIC8qIDdDMDAgLSA3REZGICovCi0gICAgdW5pb24gdV9TcmFtMlBhcm1NYXAgRHBTcmFtMlBhcm1NYXA7ICAgICAgICAgICAgIC8qIDdFMDAgLSA3RkZGICovCi0gICAgQllURQkJIERwU2NyYXRjaFtEUF9TQ1JBVENIX1NJWkVdOyAvKiA4MDAwIC0gOEZGRiAqLwotICAgIEJZVEUJCSBEcFNyYW0zW0RQX1NSQU0zX1NJWkVdOyAgICAgLyogOTAwMCAtIEZGRkYgKi8KK3N0cnVjdCBEcFJhbSB7CisJQllURSBEcFNyYW0xW0RQX1NSQU0xX1NJWkVdOwkvKiAwMDAwIC0gN0JGRiAqLworCXVuaW9uIHVfQ3RybFByb20gRHBDdHJsUHJvbTsJLyogN0MwMCAtIDdERkYgKi8KKwl1bmlvbiB1X1NyYW0yUGFybU1hcCBEcFNyYW0yUGFybU1hcDsJLyogN0UwMCAtIDdGRkYgKi8KKwlCWVRFIERwU2NyYXRjaFtEUF9TQ1JBVENIX1NJWkVdOwkvKiA4MDAwIC0gOEZGRiAqLworCUJZVEUgRHBTcmFtM1tEUF9TUkFNM19TSVpFXTsJLyogOTAwMCAtIEZGRkYgKi8KIH07CiAKICNkZWZpbmUJRHBDb250cm9sCURwQ3RybFByb20uRHBDdHJsLkRwQ3RsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2Jvb3Rwa3QuaCBiL2RyaXZlcnMvY2hhci9yaW8vYm9vdHBrdC5oCmluZGV4IGMzMjlhZWIuLjYwMjI2NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vYm9vdHBrdC5oCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vYm9vdHBrdC5oCkBAIC00MSw3ICs0MSw3IEBACiAKICNpZm5kZWYgbGludAogI2lmZGVmIFNDQ1MKLXN0YXRpYyBjaGFyICpfcmlvX2Jvb3Rwa3RfaF9zY2NzID0gIkAoIylib290cGt0LmgJMS4xIiA7CitzdGF0aWMgY2hhciAqX3Jpb19ib290cGt0X2hfc2NjcyA9ICJAKCMpYm9vdHBrdC5oCTEuMSI7CiAjZW5kaWYKICNlbmRpZgogCkBAIC00OSwxNCArNDksMTMgQEAKICAgICAgKiBPdmVybGF5ZWQgb250byB0aGUgRGF0YSBmaWVsZHMgb2YgYSByZWd1bGFyCiAgICAgICogUGFja2V0CiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IEJPT1RfUEtUIEJPT1RfUEtUIDsKK3R5cGVkZWYgc3RydWN0IEJPT1RfUEtUIEJPT1RfUEtUOwogc3RydWN0IEJPT1RfUEtUIHsKLSAgICAgICAgICAgICAgICAgICAgc2hvcnQgICAgIHNlcV9udW0gOwotICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgZGF0YVsxMF0gOwotICAgICAgICAgICAgICAgIH0gOworCXNob3J0IHNlcV9udW07CisJY2hhciBkYXRhWzEwXTsKK307CiAKIAogI2VuZGlmCiAKIC8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9icmF0ZXMuaCBiL2RyaXZlcnMvY2hhci9yaW8vYnJhdGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNGZjODQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9icmF0ZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKLSAqKioqKioqCQlCUkFURVMuSAkJCQkgICAgICAqKioqKioqCi0gKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIEF1dGhvciAgOiBKZXJlbXkgUm9sbHMKLSBEYXRlICAgIDogMSBOb3YgMTk5MAotCi0gKgotICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotIFZlcnNpb24gOiAwLjAxCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9icmF0ZXNfaAotI2lmbmRlZiBsaW50Ci0vKiBzdGF0aWMgY2hhciAqIF9icmF0ZXNfaF9zY2NzID0gIkAoIylicmF0ZXMuaAkxLjQiOyAqLwotI2VuZGlmCi0jZGVmaW5lIF9icmF0ZXNfaCAxCi0vKiBMaXN0IG9mIGJhdWQgcmF0ZSBkZWZpbmVzLiBNb3N0IGFyZSBib3Jyb3dlZCBmcm9tIC91c3IvaW5jbHVkZS9zeXMvdGVybWlvLmgKLSovCi0jaWZuZGVmIElOS0VSTkVMCi0KLSNkZWZpbmUJQjAJMHgwMAotI2RlZmluZQlCNTAJMHgwMQotI2RlZmluZQlCNzUJMHgwMgotI2RlZmluZQlCMTEwCTB4MDMKLSNkZWZpbmUJQjEzNAkweDA0Ci0jZGVmaW5lCUIxNTAJMHgwNQotI2RlZmluZQlCMjAwCTB4MDYKLSNkZWZpbmUJQjMwMAkweDA3Ci0jZGVmaW5lCUI2MDAJMHgwOAotI2RlZmluZQlCMTIwMAkweDA5Ci0jZGVmaW5lCUIxODAwCTB4MGEKLSNkZWZpbmUJQjI0MDAJMHgwYgotI2RlZmluZQlCNDgwMAkweDBjCi0jZGVmaW5lCUI5NjAwCTB4MGQKLSNkZWZpbmUJQjE5MjAwCTB4MGUKLSNkZWZpbmUJQjM4NDAwCTB4MGYKLQotI2VuZGlmCi0KLS8qCi0qKiBUaGUgZm9sbG93aW5nIGJhdWRyYXRlcyBtYXkgb3IgbWF5IG5vdCBiZSBkZWZpbmVkCi0qKiBvbiB2YXJpb3VzIFVOSVggc3lzdGVtcy4KLSoqIElmIHRoZXkgYXJlIG5vdCB0aGVuIHdlIGRlZmluZSB0aGVtLgotKiogSWYgdGhleSBhcmUgdGhlbiB3ZSBkbyBub3QgZGVmaW5lIHRoZW0gOy0pCi0qKgotKiogVGhpcyBpcyBhcHBhbGxpbmcgdGhhdCB3ZSB1c2Ugc2FtZSBkZWZpbml0aW9ucyBhcyBVTklYCi0qKiBmb3Igb3VyIG93biBkb3dubG9hZCBjb2RlIGFzIHRoZXJlIGlzIG5vIGdhcnVudGVlIHRoYXQKLSoqIEI1NzYwMCB3aWxsIGJlIGRlZmluZWQgYXMgMHgxMSBieSBhIFVOSVggc3lzdGVtLi4uLgotKiogQXJnaGhoaGghISEhISEhISEhISEhIQotKi8KLSNpZiAhZGVmaW5lZChCNTYwMDApCi0jZGVmaW5lCUI1NjAwMAkweDEwCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKEI1NzYwMCkKLSNkZWZpbmUJQjU3NjAwCTB4MTEKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoQjY0MDAwKQotI2RlZmluZQlCNjQwMDAJMHgxMgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChCMTE1MjAwKQotI2RlZmluZQlCMTE1MjAwCTB4MTMKLSNlbmRpZgotCi0KLSNpZiAhZGVmaW5lZChCMjAwMCkKLSNkZWZpbmUgQjIwMDAJMHgxNAotI2VuZGlmCi0KLQotI2RlZmluZSBNQVhfUkFURSBCMjAwMAotCi1zdHJ1Y3QgICAgYmF1ZF9yYXRlICAgICAgICAgICAgLyogVGFnIGZvciBiYXVkIHJhdGVzICovCi17Ci0gICAgIC8qIHNob3J0ICAgIGhvc3RfcmF0ZSwqLyAgICAgICAgLyogQXMgcGFzc2VkIGJ5IHRoZSBkcml2ZXIgKi8KLSAgICAgc2hvcnQgICAgZGl2aXNvciwgICAgICAgICAgLyogVGhlIGRpdmlzb3IgKi8KLSAgICAgICAgICAgICAgcHJlc2NhbGVyOyAgICAgICAgLyogVGhlIHByZS1zY2FsZXIgKi8KLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9jaGFuLmggYi9kcml2ZXJzL2NoYXIvcmlvL2NoYW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzMDY1NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL2NoYW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKgotICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSovCi0jaWZuZGVmIF9jaGFuX2gKLSNkZWZpbmUgX2NoYW5faAotCi0jaWZuZGVmIGxpbnQKLSNpZmRlZiBTQ0NTCi1zdGF0aWMgY2hhciAqX3Jpb19jaGFuX2hfc2NjcyA9ICJAKCMpY2hhbi5oCTEuMSIgOwotI2VuZGlmCi0jZW5kaWYKLQotI2RlZmluZSBMaW5rMCAgIDAKLSNkZWZpbmUgTGluazEgICAxCi0jZGVmaW5lIExpbmsyICAgMgotI2RlZmluZSBMaW5rMyAgIDMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2NpcnJ1cy5oIGIvZHJpdmVycy9jaGFyL3Jpby9jaXJydXMuaAppbmRleCBjZjA1NmE5Li4yMTdmZjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL2NpcnJ1cy5oCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vY2lycnVzLmgKQEAgLTczLDIwICs3MywyMCBAQAogI2RlZmluZQlUSU1FUl9USUNLCTB4ODIKICNkZWZpbmUgU1RPUF9CUkVBSwkweDgzCiAjZGVmaW5lIEJBU0UoYSkgKChhKSA8IDQgPyAoc2hvcnQqKUNJUlJVU19GSVJTVCA6ICgoYSkgPCA4ID8gKHNob3J0ICopQ0lSUlVTX1NFQ09ORCA6ICgoYSkgPCAxMiA/IChzaG9ydCopQ0lSUlVTX1RISVJEIDogKHNob3J0ICopQ0lSUlVTX0ZPVVJUSCkpKQotI2RlZmluZSB0eGFjazEJKChzaG9ydCAqKTB4NzEwNCkgCi0jZGVmaW5lIHJ4YWNrMQkoKHNob3J0ICopMHg3MTAyKSAKKyNkZWZpbmUgdHhhY2sxCSgoc2hvcnQgKikweDcxMDQpCisjZGVmaW5lIHJ4YWNrMQkoKHNob3J0ICopMHg3MTAyKQogI2RlZmluZSBtZGFjazEgICgoc2hvcnQgKikweDcxMDYpCi0jZGVmaW5lIHR4YWNrMiAgKChzaG9ydCAqKTB4NzAwNikgCi0jZGVmaW5lIHJ4YWNrMgkoKHNob3J0ICopMHg3MDA0KSAKLSNkZWZpbmUgbWRhY2syICAoKHNob3J0ICopMHg3MTAwKSAKKyNkZWZpbmUgdHhhY2syICAoKHNob3J0ICopMHg3MDA2KQorI2RlZmluZSByeGFjazIJKChzaG9ydCAqKTB4NzAwNCkKKyNkZWZpbmUgbWRhY2syICAoKHNob3J0ICopMHg3MTAwKQogI2RlZmluZSBpbnRfbGF0Y2ggICAgICAgKChzaG9ydCAqKSAweDc4MDApCi0jZGVmaW5lIGludF9zdGF0dXMgICAgICAoKHNob3J0ICopIDB4N2MwMCkgCi0jZGVmaW5lIHR4MV9wZW5kaW5nICAgICAweDIwIAotI2RlZmluZSByeDFfcGVuZGluZyAgICAgMHgxMCAKLSNkZWZpbmUgbWQxX3BlbmRpbmcgICAgIDB4NDAgCi0jZGVmaW5lIHR4Ml9wZW5kaW5nICAgICAweDAyIAotI2RlZmluZSByeDJfcGVuZGluZyAgICAgMHgwMSAKLSNkZWZpbmUgbWQyX3BlbmRpbmcgICAgIDB4NDAgCisjZGVmaW5lIGludF9zdGF0dXMgICAgICAoKHNob3J0ICopIDB4N2MwMCkKKyNkZWZpbmUgdHgxX3BlbmRpbmcgICAgIDB4MjAKKyNkZWZpbmUgcngxX3BlbmRpbmcgICAgIDB4MTAKKyNkZWZpbmUgbWQxX3BlbmRpbmcgICAgIDB4NDAKKyNkZWZpbmUgdHgyX3BlbmRpbmcgICAgIDB4MDIKKyNkZWZpbmUgcngyX3BlbmRpbmcgICAgIDB4MDEKKyNkZWZpbmUgbWQyX3BlbmRpbmcgICAgIDB4NDAKICNkZWZpbmUgbW9kdWxlMV9iaXRzCTB4MDcKICNkZWZpbmUgbW9kdWxlMV9tb2Rlcm4JMHgwOAogI2RlZmluZSBtb2R1bGUyX2JpdHMJMHg3MApAQCAtMTEzLDY1ICsxMTMsNjUgQEAKICAgIE5CLiBUaGVzZSByZWdpc3RlcnMgYXJlIHJlbGF0aXZlIHZhbHVlcyBvbiA4IGJpdCBib3VuZGFyaWVzIHdoZXJlYXMKICAgIG9uIHRoZSBSVEEncyB0aGUgQ0lSUlVTIHJlZ2lzdGVycyBhcmUgb24gd29yZCBib3VuZGFyaWVzLiBVc2UgcG9pbnRlcgogICAgYXJpdGhtZXRpYyAoc2hvcnQgKikgdG8gb2J0YWluIHRoZSByZWFsIGFkZHJlc3NlcyByZXF1aXJlZCAqLwotI2RlZmluZSBjY3IJMHgwNQkvKiBDaGFubmVsIENvbW1hbmQgUmVnaXN0ZXIgICAgICovCi0jZGVmaW5lIGllcgkweDA2CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgICAgKi8KLSNkZWZpbmUgY29yMQkweDA4CS8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDEgICAgKi8KLSNkZWZpbmUgY29yMgkweDA5CS8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDIgICAgKi8KLSNkZWZpbmUgY29yMwkweDBhCS8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDMgICAgKi8KLSNkZWZpbmUgY29yNAkweDFlCS8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDQgICAgKi8KLSNkZWZpbmUJY29yNQkweDFmCS8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDUJKi8KKyNkZWZpbmUgY2NyCTB4MDUJCS8qIENoYW5uZWwgQ29tbWFuZCBSZWdpc3RlciAgICAgKi8KKyNkZWZpbmUgaWVyCTB4MDYJCS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgICAgKi8KKyNkZWZpbmUgY29yMQkweDA4CQkvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciAxICAgICovCisjZGVmaW5lIGNvcjIJMHgwOQkJLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMiAgICAqLworI2RlZmluZSBjb3IzCTB4MGEJCS8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDMgICAgKi8KKyNkZWZpbmUgY29yNAkweDFlCQkvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciA0ICAgICovCisjZGVmaW5lCWNvcjUJMHgxZgkJLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgNSAgICAqLwogCi0jZGVmaW5lIGNjc3IJMHgwYgkvKiBDaGFubmVsIENvbnRyb2wgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIHJkY3IJMHgwZQkvKiBSZWNlaXZlIERhdGEgQ291bnQgUmVnaXN0ZXIgICovCi0jZGVmaW5lIHRkY3IJMHgxMgkvKiBUcmFuc21pdCBEYXRhIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lIG1jb3IxCTB4MTUJLyogTW9kZW0gQ2hhbmdlIE9wdGlvbiBSZWdpc3RlciAxICovCi0jZGVmaW5lIG1jb3IyCTB4MTYJLyogTW9kZW0gQ2hhbmdlIE9wdGlvbiBSZWdzaXRlciAyICovCisjZGVmaW5lIGNjc3IJMHgwYgkJLyogQ2hhbm5lbCBDb250cm9sIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSByZGNyCTB4MGUJCS8qIFJlY2VpdmUgRGF0YSBDb3VudCBSZWdpc3RlciAgKi8KKyNkZWZpbmUgdGRjcgkweDEyCQkvKiBUcmFuc21pdCBEYXRhIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lIG1jb3IxCTB4MTUJCS8qIE1vZGVtIENoYW5nZSBPcHRpb24gUmVnaXN0ZXIgMSAqLworI2RlZmluZSBtY29yMgkweDE2CQkvKiBNb2RlbSBDaGFuZ2UgT3B0aW9uIFJlZ3NpdGVyIDIgKi8KIAotI2RlZmluZSBsaXZyCTB4MTgJLyogTG9jYWwgSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAqLwotI2RlZmluZSBzY2hyMQkweDFhCS8qIFNwZWNpYWwgQ2hhcmFjdGVyIFJlZ2lzdGVyIDEgKi8KLSNkZWZpbmUgc2NocjIJMHgxYgkvKiBTcGVjaWFsIENoYXJhY3RlciBSZWdpc3RlciAyICovCi0jZGVmaW5lIHNjaHIzCTB4MWMJLyogU3BlY2lhbCBDaGFyYWN0ZXIgUmVnaXN0ZXIgMyAqLwotI2RlZmluZSBzY2hyNAkweDFkCS8qIFNwZWNpYWwgQ2hhcmFjdGVyIFJlZ2lzdGVyIDQgKi8KKyNkZWZpbmUgbGl2cgkweDE4CQkvKiBMb2NhbCBJbnRlcnJ1cHQgVmVjdG9yIFJlZ2lzdGVyICovCisjZGVmaW5lIHNjaHIxCTB4MWEJCS8qIFNwZWNpYWwgQ2hhcmFjdGVyIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgc2NocjIJMHgxYgkJLyogU3BlY2lhbCBDaGFyYWN0ZXIgUmVnaXN0ZXIgMiAqLworI2RlZmluZSBzY2hyMwkweDFjCQkvKiBTcGVjaWFsIENoYXJhY3RlciBSZWdpc3RlciAzICovCisjZGVmaW5lIHNjaHI0CTB4MWQJCS8qIFNwZWNpYWwgQ2hhcmFjdGVyIFJlZ2lzdGVyIDQgKi8KIAotI2RlZmluZSBydHIJMHgyMCAgICAvKiBSZWNlaXZlIFRpbWVyIFJlZ2lzdGVyICovCi0jZGVmaW5lIHJ0cHIJMHgyMQkvKiBSZWNlaXZlIFRpbWVvdXQgUGVyaW9kIFJlZ2lzdGVyICovCi0jZGVmaW5lIGxuYwkweDI0CS8qIExuZXh0IGNoYXJhY3RlciAqLworI2RlZmluZSBydHIJMHgyMAkJLyogUmVjZWl2ZSBUaW1lciBSZWdpc3RlciAqLworI2RlZmluZSBydHByCTB4MjEJCS8qIFJlY2VpdmUgVGltZW91dCBQZXJpb2QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgbG5jCTB4MjQJCS8qIExuZXh0IGNoYXJhY3RlciAqLwogCi0jZGVmaW5lIHJpdnIJMHg0MwkvKiBSZWNlaXZlIEludGVycnVwdCBWZWN0b3IgUmVnaXN0ZXIgICAgKi8KLSNkZWZpbmUgdGl2cgkweDQyCS8qIFRyYW5zbWl0IEludGVycnVwdCBWZWN0b3IgUmVnaXN0ZXIgICAqLwotI2RlZmluZSBtaXZyCTB4NDEJLyogTW9kZW0gSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAgICAgICovCi0jZGVmaW5lIGdmcmNyCTB4NDAJLyogR2xvYmFsIEZpcm13YXJlIFJldmlzaW9uIGNvZGUgUmVnICAgICovCi0jZGVmaW5lIHJpY3IJMHg0NAkvKiBSZWNlaXZlIEludGVycnVwdGluZyBDaGFubmVsIFJlZyAgICAgKi8KLSNkZWZpbmUgdGljcgkweDQ1CS8qIFRyYW5zbWl0IEludGVycnVwdGluZyBDaGFubmVsIFJlZyAgICAqLwotI2RlZmluZSBtaWNyCTB4NDYJLyogTW9kZW0gSW50ZXJydXB0aW5nIENoYW5uZWwgUmVnaXN0ZXIgICovCisjZGVmaW5lIHJpdnIJMHg0MwkJLyogUmVjZWl2ZSBJbnRlcnJ1cHQgVmVjdG9yIFJlZ2lzdGVyICAgICovCisjZGVmaW5lIHRpdnIJMHg0MgkJLyogVHJhbnNtaXQgSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAgICovCisjZGVmaW5lIG1pdnIJMHg0MQkJLyogTW9kZW0gSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAgICAgICovCisjZGVmaW5lIGdmcmNyCTB4NDAJCS8qIEdsb2JhbCBGaXJtd2FyZSBSZXZpc2lvbiBjb2RlIFJlZyAgICAqLworI2RlZmluZSByaWNyCTB4NDQJCS8qIFJlY2VpdmUgSW50ZXJydXB0aW5nIENoYW5uZWwgUmVnICAgICAqLworI2RlZmluZSB0aWNyCTB4NDUJCS8qIFRyYW5zbWl0IEludGVycnVwdGluZyBDaGFubmVsIFJlZyAgICAqLworI2RlZmluZSBtaWNyCTB4NDYJCS8qIE1vZGVtIEludGVycnVwdGluZyBDaGFubmVsIFJlZ2lzdGVyICAqLwogCi0jZGVmaW5lIGdjcgkweDRiCS8qIEdsb2JhbCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyKi8KLSNkZWZpbmUgbWlzciAgICAweDRjICAgIC8qIE1vZGVtIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgZ2NyCTB4NGIJCS8qIEdsb2JhbCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIG1pc3IgICAgMHg0YwkJLyogTW9kZW0gaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLwogCiAjZGVmaW5lIHJidXNyCTB4NTkKICNkZWZpbmUgdGJ1c3IJMHg1YQogI2RlZmluZSBtYnVzcgkweDViCiAKLSNkZWZpbmUgZW9pcgkweDYwCS8qIEVuZCBPZiBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgcmRzcgkweDYyCS8qIFJlY2VpdmUgRGF0YSAvIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSB0ZHIJMHg2MwkvKiBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyICovCi0jZGVmaW5lIHN2cnIJMHg2NwkvKiBTZXJ2aWNlIFJlcXVlc3QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgZW9pcgkweDYwCQkvKiBFbmQgT2YgSW50ZXJydXB0IFJlZ2lzdGVyICovCisjZGVmaW5lIHJkc3IJMHg2MgkJLyogUmVjZWl2ZSBEYXRhIC8gU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIHRkcgkweDYzCQkvKiBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lIHN2cnIJMHg2NwkJLyogU2VydmljZSBSZXF1ZXN0IFJlZ2lzdGVyICovCiAKLSNkZWZpbmUgY2FyCTB4NjgJLyogQ2hhbm5lbCBBY2Nlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgbWlyCTB4NjkJLyogTW9kZW0gSW50ZXJydXB0IFJlZ2lzdGVyICovCi0jZGVmaW5lIHRpcgkweDZhCS8qIFRyYW5zbWl0IEludGVycnVwdCBSZWdpc3RlciAqLwotI2RlZmluZSByaXIJMHg2YgkvKiBSZWNlaXZlIEludGVycnVwdCBSZWdpc3RlciAqLwotI2RlZmluZSBtc3ZyMQkweDZjCS8qIE1vZGVtIFNpZ25hbCBWYWx1ZSBSZWdpc3RlciAxICovCi0jZGVmaW5lIG1zdnIyCTB4NmQJLyogTW9kZW0gU2lnbmFsIFZhbHVlIFJlZ2lzdGVyIDIqLwotI2RlZmluZSBwc3ZyCTB4NmYJLyogUHJpbnRlciBTaWduYWwgVmFsdWUgUmVnaXN0ZXIqLworI2RlZmluZSBjYXIJMHg2OAkJLyogQ2hhbm5lbCBBY2Nlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgbWlyCTB4NjkJCS8qIE1vZGVtIEludGVycnVwdCBSZWdpc3RlciAqLworI2RlZmluZSB0aXIJMHg2YQkJLyogVHJhbnNtaXQgSW50ZXJydXB0IFJlZ2lzdGVyICovCisjZGVmaW5lIHJpcgkweDZiCQkvKiBSZWNlaXZlIEludGVycnVwdCBSZWdpc3RlciAqLworI2RlZmluZSBtc3ZyMQkweDZjCQkvKiBNb2RlbSBTaWduYWwgVmFsdWUgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBtc3ZyMgkweDZkCQkvKiBNb2RlbSBTaWduYWwgVmFsdWUgUmVnaXN0ZXIgMiAqLworI2RlZmluZSBwc3ZyCTB4NmYJCS8qIFByaW50ZXIgU2lnbmFsIFZhbHVlIFJlZ2lzdGVyICovCiAKLSNkZWZpbmUgdGJwcgkweDcyCS8qIFRyYW5zbWl0IEJhdWQgUmF0ZSBQZXJpb2QgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgdGNvcgkweDc2CS8qIFRyYW5zbWl0IENsb2NrIE9wdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSB0YnByCTB4NzIJCS8qIFRyYW5zbWl0IEJhdWQgUmF0ZSBQZXJpb2QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgdGNvcgkweDc2CQkvKiBUcmFuc21pdCBDbG9jayBPcHRpb24gUmVnaXN0ZXIgKi8KIAotI2RlZmluZSByYnByCTB4NzgJLyogUmVjZWl2ZSBCYXVkIFJhdGUgUGVyaW9kIFJlZ2lzdGVyICovCi0jZGVmaW5lIHJiZXIJMHg3YQkvKiBSZWNlaXZlIEJhdWQgUmF0ZSBFeHRlbnNpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUgcmNvcgkweDdjCS8qIFJlY2VpdmUgQ2xvY2sgT3B0aW9uIFJlZ2lzdGVyKi8KLSNkZWZpbmUgcHByCTB4N2UJLyogUHJlc2NhbGFyIFBlcmlvZCBSZWdpc3RlciAgICAqLworI2RlZmluZSByYnByCTB4NzgJCS8qIFJlY2VpdmUgQmF1ZCBSYXRlIFBlcmlvZCBSZWdpc3RlciAqLworI2RlZmluZSByYmVyCTB4N2EJCS8qIFJlY2VpdmUgQmF1ZCBSYXRlIEV4dGVuc2lvbiBSZWdpc3RlciAqLworI2RlZmluZSByY29yCTB4N2MJCS8qIFJlY2VpdmUgQ2xvY2sgT3B0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIHBwcgkweDdlCQkvKiBQcmVzY2FsYXIgUGVyaW9kIFJlZ2lzdGVyICAgICovCiAKIC8qIE1pc2MgcmVnaXN0ZXJzIHVzZWQgZm9yIGZvcmNpbmcgdGhlIDE0MDAgb3V0IG9mIGl0cyByZXNldCB3b2VzICovCiAjZGVmaW5lIGFpcmwJMHg2ZApAQCAtMTkyLDEwICsxOTIsMTAgQEAKIAogLyogUkRTUiAtIHdoZW4gc3RhdHVzIHJlYWQgZnJvbSBGSUZPICovCiAjZGVmaW5lCVJEU1JfQlJFQUsJCTB4MDgJLyogQnJlYWsgcmVjZWl2ZWQgKi8KLSNkZWZpbmUgUkRTUl9USU1FT1VUICAgIAkweDgwICAgIC8qIE5vIG5ldyBkYXRhIHRpbWVvdXQgKi8KLSNkZWZpbmUgUkRTUl9TQzEgIAkgIAkweDEwICAgIC8qIFNwZWNpYWwgY2hhciAxICh0eCBYT04pIG1hdGNoZWQgKi8KLSNkZWZpbmUgUkRTUl9TQzIgIAkgIAkweDIwICAgIC8qIFNwZWNpYWwgY2hhciAyICh0eCBYT0ZGKSBtYXRjaGVkICovCi0jZGVmaW5lIFJEU1JfU0MxMl9NQVNLCSAgCTB4MzAgICAgLyogTWFzayBmb3Igc3BlY2lhbCBjaGFycyAxIGFuZCAyICovCisjZGVmaW5lIFJEU1JfVElNRU9VVCAgICAJMHg4MAkvKiBObyBuZXcgZGF0YSB0aW1lb3V0ICovCisjZGVmaW5lIFJEU1JfU0MxICAJICAJMHgxMAkvKiBTcGVjaWFsIGNoYXIgMSAodHggWE9OKSBtYXRjaGVkICovCisjZGVmaW5lIFJEU1JfU0MyICAJICAJMHgyMAkvKiBTcGVjaWFsIGNoYXIgMiAodHggWE9GRikgbWF0Y2hlZCAqLworI2RlZmluZSBSRFNSX1NDMTJfTUFTSwkgIAkweDMwCS8qIE1hc2sgZm9yIHNwZWNpYWwgY2hhcnMgMSBhbmQgMiAqLwogCiAvKiBQUFIgKi8KICNkZWZpbmUgUFBSX0RFRkFVTFQJMHgzMQkvKiBEZWZhdWx0IHZhbHVlIC0gZm9yIGEgMjVNaHogY2xvY2sgZ2l2ZXMKQEAgLTI0NCw3ICsyNDQsNyBAQAogI2RlZmluZSBJRVJfVElNRU9VVAkweDAxCS8qIFRpbWVvdXQgb24gbm8gZGF0YSAqLwogCiAjZGVmaW5lCUlFUl9ERUZBVUxUCTB4OTQJLyogRGVmYXVsdCB2YWx1ZXMgKi8KLSNkZWZpbmUgSUVSX1BBUkFMTEVMICAgIDB4ODQgICAgLyogRGVmYXVsdCBmb3IgUGFyYWxsZWwgKi8KKyNkZWZpbmUgSUVSX1BBUkFMTEVMICAgIDB4ODQJLyogRGVmYXVsdCBmb3IgUGFyYWxsZWwgKi8KICNkZWZpbmUJSUVSX0VNUFRZCTB4OTIJLyogVHJhbnNtaXR0ZXIgZW1wdHkgcmF0aGVyIHRoYW4gcmVhZHkgKi8KIAogLyogQ09SMSAtIERyaXZlciBvbmx5ICovCkBAIC0yNjQsMTEgKzI2NCwxMSBAQAogI2RlZmluZQlDT1IxXzdCSVRTCTB4MDIJLyogNyBkYXRhIGJpdHMgKi8KICNkZWZpbmUJQ09SMV84QklUUwkweDAzCS8qIDggZGF0YSBiaXRzICovCiAKLSNkZWZpbmUgQ09SMV9IT1NUICAgICAgIDB4ZWYgICAgLyogU2FmZSBob3N0IGJpdHMgKi8KKyNkZWZpbmUgQ09SMV9IT1NUICAgICAgIDB4ZWYJLyogU2FmZSBob3N0IGJpdHMgKi8KIAogLyogUlRBIG9ubHkgKi8KLSNkZWZpbmUgQ09SMV9DSU5QQ0sgICAgIDB4MDAgICAgLyogQ2hlY2sgcGFyaXR5IG9mIHJlY2VpdmVkIGNoYXJhY3RlcnMgKi8KLSNkZWZpbmUgQ09SMV9DTklOUENLICAgIDB4MTAgICAgLyogRG9uJ3QgY2hlY2sgcGFyaXR5ICovCisjZGVmaW5lIENPUjFfQ0lOUENLICAgICAweDAwCS8qIENoZWNrIHBhcml0eSBvZiByZWNlaXZlZCBjaGFyYWN0ZXJzICovCisjZGVmaW5lIENPUjFfQ05JTlBDSyAgICAweDEwCS8qIERvbid0IGNoZWNrIHBhcml0eSAqLwogCiAvKiBDT1IyIGJpdHMgZm9yIGJvdGggUlRBIGFuZCBkcml2ZXIgdXNlICovCiAjZGVmaW5lCUNPUjJfSVhBTlkJMHg4MAkvKiBJWEFOWSAtIGFueSBjaGFyYWN0ZXIgaXMgWE9OICovCkBAIC0yOTMsOSArMjkzLDkgQEAKICNkZWZpbmUJQ09SM19GQ1QJMHgyMAkvKiBGbG93IGNvbnRyb2wgdHJhbnNwYXJlbmN5ICovCiAjZGVmaW5lCUNPUjNfU0NEMTIJMHgxMAkvKiBTcGVjaWFsIGNoYXJhY3RlciBkZXRlY3QgZm9yIFNDSFIncyAxICsgMiAqLwogI2RlZmluZQlDT1IzX0ZJRk8xMgkweDBjCS8qIDEyIGNoYXJzIGZvciByZWNlaXZlIEZJRk8gdGhyZXNob2xkICovCi0jZGVmaW5lIENPUjNfRklGTzEwICAgICAweDBhICAgIC8qIDEwIGNoYXJzIGZvciByZWNlaXZlIEZJRk8gdGhyZXNob2xkICovCi0jZGVmaW5lIENPUjNfRklGTzggICAgICAweDA4ICAgIC8qIDggY2hhcnMgZm9yIHJlY2VpdmUgRklGTyB0aHJlc2hvbGQgKi8KLSNkZWZpbmUgQ09SM19GSUZPNiAgICAgIDB4MDYgICAgLyogNiBjaGFycyBmb3IgcmVjZWl2ZSBGSUZPIHRocmVzaG9sZCAqLworI2RlZmluZSBDT1IzX0ZJRk8xMCAgICAgMHgwYQkvKiAxMCBjaGFycyBmb3IgcmVjZWl2ZSBGSUZPIHRocmVzaG9sZCAqLworI2RlZmluZSBDT1IzX0ZJRk84ICAgICAgMHgwOAkvKiA4IGNoYXJzIGZvciByZWNlaXZlIEZJRk8gdGhyZXNob2xkICovCisjZGVmaW5lIENPUjNfRklGTzYgICAgICAweDA2CS8qIDYgY2hhcnMgZm9yIHJlY2VpdmUgRklGTyB0aHJlc2hvbGQgKi8KIAogI2RlZmluZSBDT1IzX1RIUkVTSE9MRCAgQ09SM19GSUZPOAkvKiBNVVNUIEJFIExFU1MgVEhBTiBNQ09SX1RIUkVTSE9MRCAqLwogCkBAIC0zODYsNyArMzg2LDcgQEAKIAogI2RlZmluZQlNQ09SX1RIUkVTSEJJVFMgMHgwRgkvKiBtYXNrIGZvciBBTkRpbmcgb3V0IHRoZSBhYm92ZSAqLwogCi0jZGVmaW5lCU1DT1JfVEhSRVNIT0xECU1DT1JfVEhSRVNIOSAvKiBNVVNUIEJFIEdSRUFURVIgVEhBTiBDT1IzX1RIUkVTSE9MRCAqLworI2RlZmluZQlNQ09SX1RIUkVTSE9MRAlNQ09SX1RIUkVTSDkJLyogTVVTVCBCRSBHUkVBVEVSIFRIQU4gQ09SM19USFJFU0hPTEQgKi8KIAogCiAvKiBSVFBSICovCkBAIC00MjksMjUgKzQyOSwyNSBAQAogI2RlZmluZSBDT05GSUcJCTB4MDEJLyogQ29uZmlndXJlIGEgcG9ydCAqLwogI2RlZmluZQlNT1BFTgkJMHgwMgkvKiBNb2RlbSBvcGVuIChibG9jayBmb3IgRENEKSAqLwogI2RlZmluZQlDTE9TRQkJMHgwMwkvKiBDbG9zZSBhIHBvcnQgKi8KLSNkZWZpbmUJV0ZMVVNICQkoMHgwNCB8IFBSRV9FTVBUSVZFKSAvKiBXcml0ZSBmbHVzaCAqLwotI2RlZmluZQlSRkxVU0gJCSgweDA1IHwgUFJFX0VNUFRJVkUpIC8qIFJlYWQgZmx1c2ggKi8KLSNkZWZpbmUJUkVTVU1FCQkoMHgwNiB8IFBSRV9FTVBUSVZFKSAvKiBSZXN1bWUgaWYgeG9mZmVkICovCi0jZGVmaW5lCVNCUkVBSwkJMHgwNyAJLyogU3RhcnQgYnJlYWsgKi8KKyNkZWZpbmUJV0ZMVVNICQkoMHgwNCB8IFBSRV9FTVBUSVZFKQkvKiBXcml0ZSBmbHVzaCAqLworI2RlZmluZQlSRkxVU0gJCSgweDA1IHwgUFJFX0VNUFRJVkUpCS8qIFJlYWQgZmx1c2ggKi8KKyNkZWZpbmUJUkVTVU1FCQkoMHgwNiB8IFBSRV9FTVBUSVZFKQkvKiBSZXN1bWUgaWYgeG9mZmVkICovCisjZGVmaW5lCVNCUkVBSwkJMHgwNwkvKiBTdGFydCBicmVhayAqLwogI2RlZmluZQlFQlJFQUsJCTB4MDgJLyogRW5kIGJyZWFrICovCi0jZGVmaW5lCVNVU1BFTkQJCSgweDA5IHwgUFJFX0VNUFRJVkUpIC8qIFN1c3Agb3AgKGJlaGF2ZSBhcyB0aG8geG9mZmVkKSAqLwotI2RlZmluZSBGQ0xPU0UgICAgICAgICAgKDB4MGEgfCBQUkVfRU1QVElWRSkgLyogRm9yY2UgY2xvc2UgKi8KLSNkZWZpbmUgWFBSSU5UICAgICAgICAgIDB4MGIgICAgLyogWHByaW50IHBhY2tldCAqLwotI2RlZmluZSBNQklTCQkoMHgwYyB8IFBSRV9FTVBUSVZFKSAvKiBTZXQgbW9kZW0gbGluZXMgKi8KLSNkZWZpbmUgTUJJQwkJKDB4MGQgfCBQUkVfRU1QVElWRSkgLyogQ2xlYXIgbW9kZW0gbGluZXMgKi8KLSNkZWZpbmUgTVNFVAkJKDB4MGUgfCBQUkVfRU1QVElWRSkgLyogU2V0IG1vZGVtIGxpbmVzICovCisjZGVmaW5lCVNVU1BFTkQJCSgweDA5IHwgUFJFX0VNUFRJVkUpCS8qIFN1c3Agb3AgKGJlaGF2ZSBhcyB0aG8geG9mZmVkKSAqLworI2RlZmluZSBGQ0xPU0UgICAgICAgICAgKDB4MGEgfCBQUkVfRU1QVElWRSkJLyogRm9yY2UgY2xvc2UgKi8KKyNkZWZpbmUgWFBSSU5UICAgICAgICAgIDB4MGIJLyogWHByaW50IHBhY2tldCAqLworI2RlZmluZSBNQklTCQkoMHgwYyB8IFBSRV9FTVBUSVZFKQkvKiBTZXQgbW9kZW0gbGluZXMgKi8KKyNkZWZpbmUgTUJJQwkJKDB4MGQgfCBQUkVfRU1QVElWRSkJLyogQ2xlYXIgbW9kZW0gbGluZXMgKi8KKyNkZWZpbmUgTVNFVAkJKDB4MGUgfCBQUkVfRU1QVElWRSkJLyogU2V0IG1vZGVtIGxpbmVzICovCiAjZGVmaW5lIFBDTE9TRQkJMHgwZgkvKiBQc2V1ZG8gY2xvc2UgLSBMZWF2ZXMgcngvdHggZW5hYmxlZCAqLwotI2RlZmluZSBNR0VUCQkoMHgxMCB8IFBSRV9FTVBUSVZFKSAvKiBGb3JjZSB1cGRhdGUgb2YgbW9kZW0gc3RhdHVzICovCi0jZGVmaW5lIE1FTURVTVAJCSgweDExIHwgUFJFX0VNUFRJVkUpIC8qIFNlbmQgYmFjayBtZW0gZnJvbSBhZGRyIHN1cHBsaWVkICovCi0jZGVmaW5lCVJFQURfUkVHSVNURVIJKDB4MTIgfCBQUkVfRU1QVElWRSkgLyogUmVhZCBDRDE0MDAgcmVnaXN0ZXIgKGRlYnVnKSAqLworI2RlZmluZSBNR0VUCQkoMHgxMCB8IFBSRV9FTVBUSVZFKQkvKiBGb3JjZSB1cGRhdGUgb2YgbW9kZW0gc3RhdHVzICovCisjZGVmaW5lIE1FTURVTVAJCSgweDExIHwgUFJFX0VNUFRJVkUpCS8qIFNlbmQgYmFjayBtZW0gZnJvbSBhZGRyIHN1cHBsaWVkICovCisjZGVmaW5lCVJFQURfUkVHSVNURVIJKDB4MTIgfCBQUkVfRU1QVElWRSkJLyogUmVhZCBDRDE0MDAgcmVnaXN0ZXIgKGRlYnVnKSAqLwogCiAvKiAiQ29tbWFuZCIgcGFja2V0cyBnb2luZyBmcm9tIHJlbW90ZSB0byBob3N0IENPTVBMRVRFIGFuZCBNT0RFTV9TVEFUVVMKICAgIHVzZSBkYXRhWzRdIC8gZGF0YVszXSB0byBpbmRpY2F0ZSBjdXJyZW50IHN0YXRlIGFuZCBtb2RlbSBzdGF0dXMgcmVzcGVjdGl2ZWx5Ci0qLyAKKyovCiAKICNkZWZpbmUJQ09NUExFVEUJKDB4MjAgfCBQUkVfRU1QVElWRSkKIAkJCQkvKiBDb21tYW5kIGNvbXBsZXRlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2NtZC5oIGIvZHJpdmVycy9jaGFyL3Jpby9jbWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM2OWVkYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL2NtZC5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgotICoqKioqKiogICAgICAgICAgIEMgTyBNIE0gQSBOIEQgICBQIEEgQyBLIEUgVCAgIEggRSBBIEQgRSBSIFMKLSAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gQXV0aG9yICA6IElhbiBOYW5kaHJhCi0gRGF0ZSAgICA6Ci0KLSAqCi0gKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCi0gKgotICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gVmVyc2lvbiA6IDAuMDEKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcwotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfY21kX2gKLSNkZWZpbmUgX2NtZF9oCi0KLSNpZm5kZWYgbGludAotI2lmZGVmIFNDQ1MKLXN0YXRpYyBjaGFyICpfcmlvX2NtZF9oX3NjY3MgPSAiQCgjKWNtZC5oCTEuMSIgOwotI2VuZGlmCi0jZW5kaWYKLQotCi0jZGVmaW5lIFBSRV9FTVBUSVZFX0NNRCAgICAgICAgIDB4ODAKLSNkZWZpbmUgSU5MSU5FX0NNRCAgICAgICAgICAgICAgflBSRV9FTVBUSVZFX0NNRAotCi0jZGVmaW5lIENNRF9JR05PUkVfUEtUICAgICAgICAgICggKHVzaG9ydCkgMCkKLSNkZWZpbmUgQ01EX1NUQVRVU19SRVEgICAgICAgICAgKCAodXNob3J0KSAxKQotI2RlZmluZSBDTURfVU5JVF9TVEFUVVNfUkVRICAgICAoICh1c2hvcnQpIDIpICAgICAvKiBJcyB0aGlzIG5lZWRlZCA/Pz8gKi8KLSNkZWZpbmUgQ01EX0NPTkZfUE9SVCAgICAgICAgICAgKCAodXNob3J0KSAzKQotI2RlZmluZSBDTURfQ09ORl9VTklUICAgICAgICAgICAoICh1c2hvcnQpIDQpCi0jZGVmaW5lIENNRF9ST1VURV9NQVBfUkVRICAgICAgICggKHVzaG9ydCkgNSkKLSNkZWZpbmUgQ01EX0ZMVVNIX1RYICAgICAgICAgICAgKCAodXNob3J0KSA2KQotI2RlZmluZSBDTURfRkxVU0hfUlggICAgICAgICAgICAoICh1c2hvcnQpIDcpCi0jZGVmaW5lIENNRF9QQVJUSU9OX1BPUlQgICAgICAgICggKHVzaG9ydCkgOCkKLSNkZWZpbmUgQ01EX1JFU0VUX1BPUlQgICAgICAgICAgKCAodXNob3J0KSAweDBhKQotI2RlZmluZSBDTURfQk9PVF9VTklUICAgICAgICAgICAoICh1c2hvcnQpIDB4MGIpCi0jZGVmaW5lIENNRF9GT1VORF9VTklUICAgICAgICAgICggKHVzaG9ydCkgMHgwYykKLSNkZWZpbmUgQ01EX0FUVEFDSEVEX1JUQV8yICAgICAgKCAodXNob3J0KSAweDBkKQotI2RlZmluZSBDTURfUFJPVklERV9CT09UICAgICAgICAoICh1c2hvcnQpIDB4MGUpCi0jZGVmaW5lIENNRF9DSVJSVVMgICAgICAgICAgICAgICggKHVzaG9ydCkgMHgwZikKLQotI2RlZmluZSBGT1JNX1NUQVRVU19QS1QgICAgICAgICAoICh1c2hvcnQpIDEgKQotI2RlZmluZSBGT1JNX1BPTExfUEtUICAgICAgICAgICAoICh1c2hvcnQpIDIgKQotI2RlZmluZSBGT1JNX0xJTktfU1RBVFVTX1BLVCAgICAoICh1c2hvcnQpIDMgKQotCi0KLSNkZWZpbmUgQ01EX0RBVEFfUE9SVCAgICAgICAgICAgKCAodXNob3J0KSAxICkKLSNkZWZpbmUgQ01EX0RBVEEgICAgICAgICAgICAgICAgKCAodXNob3J0KSAyICkKLQotI2RlZmluZSBDTURfVFhfUEFSVCAgICAgICAgICAgICAoICh1c2hvcnQpIDIgKQotI2RlZmluZSBDTURfUlhfUEFSVCAgICAgICAgICAgICAoICh1c2hvcnQpIDMgKQotI2RlZmluZSBDTURfUlhfTElNSVQgICAgICAgICAgICAoICh1c2hvcnQpIDQgKQotCi0jZW5kaWYKLQotLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2NtZGJsay5oIGIvZHJpdmVycy9jaGFyL3Jpby9jbWRibGsuaAppbmRleCAyYjhlZmJkLi5hOWE4YzQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL2NtZGJsay5oCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vY21kYmxrLmgKQEAgLTQ0LDE2ICs0NCwxNSBAQAogKiogYSBydXAuCiAqLwogCi1zdHJ1Y3QgQ21kQmxrCi17Ci0gc3RydWN0IENtZEJsayAqTmV4dFA7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBjb21tYW5kIGJsb2NrICovCi0gc3RydWN0CVBLVCAgICAgUGFja2V0OyAgICAgICAgIC8qIEEgcGFja2V0LCB0byBjb3B5IHRvIHRoZSBydXAgKi8KLSAgICAJICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGZ1bmMgdG8gY2FsbCB0byBjaGVjayBpZiBPSyAqLwotICAgIAlpbnQgICAgICgqUHJlRnVuY1ApKGludCwgc3RydWN0IENtZEJsayAqKTsKLSAgICAJaW50ICAgICBQcmVBcmc7ICAgICAgICAgLyogVGhlIGFyZyBmb3IgdGhlIGZ1bmMgKi8KLSAgICAJICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGZ1bmMgdG8gY2FsbCB3aGVuIGNvbXBsZXRlZCAqLwotICAgIAlpbnQgICAgICgqUG9zdEZ1bmNQKShpbnQsIHN0cnVjdCBDbWRCbGsgKik7Ci0gICAgCWludCAgICAgUG9zdEFyZzsgICAgICAgIC8qIFRoZSBhcmcgZm9yIHRoZSBmdW5jICovCitzdHJ1Y3QgQ21kQmxrIHsKKwlzdHJ1Y3QgQ21kQmxrICpOZXh0UDsJLyogUG9pbnRlciB0byBuZXh0IGNvbW1hbmQgYmxvY2sgKi8KKwlzdHJ1Y3QgUEtUIFBhY2tldDsJLyogQSBwYWNrZXQsIHRvIGNvcHkgdG8gdGhlIHJ1cCAqLworCS8qIFRoZSBmdW5jIHRvIGNhbGwgdG8gY2hlY2sgaWYgT0sgKi8KKwlpbnQgKCpQcmVGdW5jUCkgKGludCwgc3RydWN0IENtZEJsayAqKTsKKwlpbnQgUHJlQXJnOwkJLyogVGhlIGFyZyBmb3IgdGhlIGZ1bmMgKi8KKwkvKiBUaGUgZnVuYyB0byBjYWxsIHdoZW4gY29tcGxldGVkICovCisJaW50ICgqUG9zdEZ1bmNQKSAoaW50LCBzdHJ1Y3QgQ21kQmxrICopOworCWludCBQb3N0QXJnOwkJLyogVGhlIGFyZyBmb3IgdGhlIGZ1bmMgKi8KIH07CiAKICNkZWZpbmUgTlVNX1JJT19DTURfQkxLUyAoMyAqIChNQVhfUlVQICogNCArIExJTktTX1BFUl9VTklUICogNCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2NtZHBrdC5oIGIvZHJpdmVycy9jaGFyL3Jpby9jbWRwa3QuaAppbmRleCA0NmJlZmQzLi43N2NlZThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL2NtZHBrdC5oCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vY21kcGt0LmgKQEAgLTU0LDEzNSArNTQsMTEyIEBACiAqKiBUaGlzIHN0cnVjdHVyZSBvdmVybGF5cyBhIFBrdENtZC0+Q21kRGF0YSBzdHJ1Y3R1cmUsIGFuZCBzbyBzdGFydHMKICoqIGF0IERhdGFbMl0gaW4gdGhlIGFjdHVhbCBwa3QhCiAqLwotc3RydWN0IEJvb3RTZXF1ZW5jZQotewotICAgIFdPUkQJTnVtUGFja2V0czsKLSAgICBXT1JECUxvYWRCYXNlOwotICAgIFdPUkQJQ29kZVNpemU7CitzdHJ1Y3QgQm9vdFNlcXVlbmNlIHsKKwlXT1JEIE51bVBhY2tldHM7CisJV09SRCBMb2FkQmFzZTsKKwlXT1JEIENvZGVTaXplOwogfTsKIAogI2RlZmluZQlCT09UX1NFUVVFTkNFX0xFTgk4CiAKLXN0cnVjdCBTYW1Ub3AKLXsKLSAgICBCWVRFIFVuaXQ7Ci0gICAgQllURSBMaW5rOworc3RydWN0IFNhbVRvcCB7CisJQllURSBVbml0OworCUJZVEUgTGluazsKIH07CiAKLXN0cnVjdCBDbWRIZHIKLXsKLSAgICBCWVRFIFBjQ29tbWFuZDsKLSAgICB1bmlvbgotICAgIHsKLSAgICBCWVRFIFBjUGhiTnVtOwotICAgIEJZVEUgUGNMaW5rTnVtOwotICAgIEJZVEUgUGNJRE51bTsKLSAgICB9IFUwOworc3RydWN0IENtZEhkciB7CisJQllURSBQY0NvbW1hbmQ7CisJdW5pb24geworCQlCWVRFIFBjUGhiTnVtOworCQlCWVRFIFBjTGlua051bTsKKwkJQllURSBQY0lETnVtOworCX0gVTA7CiB9OwogCiAKLXN0cnVjdCBQa3RDbWQKLXsKLSAgICB1bmlvbgotICAgIHsKLQlzdHJ1Y3QgCi0JewotCSAgICBzdHJ1Y3QgQ21kSGRyIENtZEhkcjsKLQkgICAgc3RydWN0IEJvb3RTZXF1ZW5jZSBQY0Jvb3RTZXF1ZW5jZTsKLQl9IFMxOwotCXN0cnVjdAotCXsKLQkgICAgV09SRCBQY1NlcXVlbmNlOwotCSAgICBCWVRFIFBjQm9vdERhdGFbUlRBX0JPT1RfREFUQV9TSVpFXTsKLQl9IFMyOwotCXN0cnVjdAotCXsKLQkgICAgV09SRCAgX19jcnVkX187Ci0JICAgIEJZVEUgIFBjVW5pcU51bVs0XTsJICAgICAgICAvKiB0aGlzIGlzIHJlYWxseSBhIHVpbnQuICovCi0JICAgIEJZVEUgIFBjTW9kdWxlVHlwZXM7ICAJLyogd2hhdCBtb2R1bGVzIGFyZSBmaXR0ZWQgKi8KLQl9IFMzOwotCXN0cnVjdAotCXsKLQkgICAgc3RydWN0IENtZEhkciBDbWRIZHI7Ci0JICAgIEJZVEUgICBfX3VuZGVmaW5lZF9fOwotCSAgICBCWVRFICAgUGNNb2RlbVN0YXR1czsKLQkgICAgQllURSAgIFBjUG9ydFN0YXR1czsKLQkgICAgQllURSAgIFBjU3ViQ29tbWFuZDsJLyogY29tbWFuZHMgbGlrZSBtZW0gb3IgcmVnaXN0ZXIgZHVtcCAqLwotCSAgICBXT1JEICAgUGNTdWJBZGRyOwkJLyogQWRkcmVzcyBmb3IgY29tbWFuZCAqLwotCSAgICBCWVRFICAgUGNTdWJEYXRhWzY0XTsJLyogRGF0ZSBhcmVhIGZvciBjb21tYW5kICovCi0JfSBTNDsKLQlzdHJ1Y3QKLQl7Ci0JICAgIHN0cnVjdCBDbWRIZHIgQ21kSGRyOwotCSAgICBCWVRFICAgUGNDb21tYW5kVGV4dFsxXTsKLQkgICAgQllURSAgIF9fY3J1ZF9fWzIwXTsKLQkgICAgQllURSAgIFBjSUROdW0yOwkJLyogSXQgaGFkIHRvIGdvIHNvbWV3aGVyZSEgKi8KLQl9IFM1OwotCXN0cnVjdAotCXsKLQkgICAgc3RydWN0IENtZEhkciBDbWRIZHI7Ci0JICAgIHN0cnVjdCBTYW1Ub3AgICAgVG9wb2xvZ3lbTElOS1NfUEVSX1VOSVRdOwotCX0gUzY7Ci0gICAgfSBVMTsKK3N0cnVjdCBQa3RDbWQgeworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBDbWRIZHIgQ21kSGRyOworCQkJc3RydWN0IEJvb3RTZXF1ZW5jZSBQY0Jvb3RTZXF1ZW5jZTsKKwkJfSBTMTsKKwkJc3RydWN0IHsKKwkJCVdPUkQgUGNTZXF1ZW5jZTsKKwkJCUJZVEUgUGNCb290RGF0YVtSVEFfQk9PVF9EQVRBX1NJWkVdOworCQl9IFMyOworCQlzdHJ1Y3QgeworCQkJV09SRCBfX2NydWRfXzsKKwkJCUJZVEUgUGNVbmlxTnVtWzRdOwkvKiB0aGlzIGlzIHJlYWxseSBhIHVpbnQuICovCisJCQlCWVRFIFBjTW9kdWxlVHlwZXM7CS8qIHdoYXQgbW9kdWxlcyBhcmUgZml0dGVkICovCisJCX0gUzM7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgQ21kSGRyIENtZEhkcjsKKwkJCUJZVEUgX191bmRlZmluZWRfXzsKKwkJCUJZVEUgUGNNb2RlbVN0YXR1czsKKwkJCUJZVEUgUGNQb3J0U3RhdHVzOworCQkJQllURSBQY1N1YkNvbW1hbmQ7CS8qIGNvbW1hbmRzIGxpa2UgbWVtIG9yIHJlZ2lzdGVyIGR1bXAgKi8KKwkJCVdPUkQgUGNTdWJBZGRyOwkvKiBBZGRyZXNzIGZvciBjb21tYW5kICovCisJCQlCWVRFIFBjU3ViRGF0YVs2NF07CS8qIERhdGUgYXJlYSBmb3IgY29tbWFuZCAqLworCQl9IFM0OworCQlzdHJ1Y3QgeworCQkJc3RydWN0IENtZEhkciBDbWRIZHI7CisJCQlCWVRFIFBjQ29tbWFuZFRleHRbMV07CisJCQlCWVRFIF9fY3J1ZF9fWzIwXTsKKwkJCUJZVEUgUGNJRE51bTI7CS8qIEl0IGhhZCB0byBnbyBzb21ld2hlcmUhICovCisJCX0gUzU7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgQ21kSGRyIENtZEhkcjsKKwkJCXN0cnVjdCBTYW1Ub3AgVG9wb2xvZ3lbTElOS1NfUEVSX1VOSVRdOworCQl9IFM2OworCX0gVTE7CiB9OwogCi1zdHJ1Y3QgUGt0Q21kX00KLXsKLSAgICB1bmlvbgotICAgIHsKLQlzdHJ1Y3QgCi0JewotCSAgICBzdHJ1Y3QKLQkgICAgewotICAgIAkJdWNoYXIgUGNDb21tYW5kOwotICAgIAkJdW5pb24KLSAgICAJCXsKLSAgICAJCSAgICB1Y2hhciBQY1BoYk51bTsKLSAgICAJCSAgICB1Y2hhciBQY0xpbmtOdW07Ci0gICAgCQkgICAgdWNoYXIgUGNJRE51bTsKLSAgICAJCX0gVTA7Ci0JICAgIH0gQ21kSGRyOwotCSAgICBzdHJ1Y3QKLQkgICAgewotICAgICAgICAgICAgICAgIHVzaG9ydAlOdW1QYWNrZXRzOwotICAgICAgICAgICAgICAgIHVzaG9ydAlMb2FkQmFzZTsKLSAgICAgICAgICAgICAgICB1c2hvcnQJQ29kZVNpemU7Ci0gICAgICAgICAgICB9IFBjQm9vdFNlcXVlbmNlOwotCX0gUzE7Ci0Jc3RydWN0Ci0JewotCSAgICB1c2hvcnQgUGNTZXF1ZW5jZTsKLQkgICAgdWNoYXIgUGNCb290RGF0YVtSVEFfQk9PVF9EQVRBX1NJWkVdOwotCX0gUzI7Ci0Jc3RydWN0Ci0JewotCSAgICB1c2hvcnQgIF9fY3J1ZF9fOwotCSAgICB1Y2hhciAgUGNVbmlxTnVtWzRdOwkgICAgICAgIC8qIHRoaXMgaXMgcmVhbGx5IGEgdWludC4gKi8KLQkgICAgdWNoYXIgIFBjTW9kdWxlVHlwZXM7ICAJLyogd2hhdCBtb2R1bGVzIGFyZSBmaXR0ZWQgKi8KLQl9IFMzOwotCXN0cnVjdAotCXsKLQkgICAgdXNob3J0ICBfX2NtZF9oZHJfXzsKLQkgICAgdWNoYXIgICBfX3VuZGVmaW5lZF9fOwotCSAgICB1Y2hhciAgIFBjTW9kZW1TdGF0dXM7Ci0JICAgIHVjaGFyICAgUGNQb3J0U3RhdHVzOwotCSAgICB1Y2hhciAgIFBjU3ViQ29tbWFuZDsKLQkgICAgdXNob3J0ICBQY1N1YkFkZHI7Ci0JICAgIHVjaGFyICAgUGNTdWJEYXRhWzY0XTsKLQl9IFM0OwotCXN0cnVjdAotCXsKLQkgICAgdXNob3J0ICBfX2NtZF9oZHJfXzsKLQkgICAgdWNoYXIgICBQY0NvbW1hbmRUZXh0WzFdOwotCSAgICB1Y2hhciAgIF9fY3J1ZF9fWzIwXTsKLQkgICAgdWNoYXIgICBQY0lETnVtMjsJCS8qIFRhY2tlZCBvbiBlbmQgKi8KLQl9IFM1OwotCXN0cnVjdAotCXsKLQkgICAgdXNob3J0ICBfX2NtZF9oZHJfXzsKLQkgICAgc3RydWN0IFRvcCBUb3BvbG9neVtMSU5LU19QRVJfVU5JVF07Ci0JfSBTNjsKLSAgICB9IFUxOworc3RydWN0IFBrdENtZF9NIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgeworCQkJCXVjaGFyIFBjQ29tbWFuZDsKKwkJCQl1bmlvbiB7CisJCQkJCXVjaGFyIFBjUGhiTnVtOworCQkJCQl1Y2hhciBQY0xpbmtOdW07CisJCQkJCXVjaGFyIFBjSUROdW07CisJCQkJfSBVMDsKKwkJCX0gQ21kSGRyOworCQkJc3RydWN0IHsKKwkJCQl1c2hvcnQgTnVtUGFja2V0czsKKwkJCQl1c2hvcnQgTG9hZEJhc2U7CisJCQkJdXNob3J0IENvZGVTaXplOworCQkJfSBQY0Jvb3RTZXF1ZW5jZTsKKwkJfSBTMTsKKwkJc3RydWN0IHsKKwkJCXVzaG9ydCBQY1NlcXVlbmNlOworCQkJdWNoYXIgUGNCb290RGF0YVtSVEFfQk9PVF9EQVRBX1NJWkVdOworCQl9IFMyOworCQlzdHJ1Y3QgeworCQkJdXNob3J0IF9fY3J1ZF9fOworCQkJdWNoYXIgUGNVbmlxTnVtWzRdOwkvKiB0aGlzIGlzIHJlYWxseSBhIHVpbnQuICovCisJCQl1Y2hhciBQY01vZHVsZVR5cGVzOwkvKiB3aGF0IG1vZHVsZXMgYXJlIGZpdHRlZCAqLworCQl9IFMzOworCQlzdHJ1Y3QgeworCQkJdXNob3J0IF9fY21kX2hkcl9fOworCQkJdWNoYXIgX191bmRlZmluZWRfXzsKKwkJCXVjaGFyIFBjTW9kZW1TdGF0dXM7CisJCQl1Y2hhciBQY1BvcnRTdGF0dXM7CisJCQl1Y2hhciBQY1N1YkNvbW1hbmQ7CisJCQl1c2hvcnQgUGNTdWJBZGRyOworCQkJdWNoYXIgUGNTdWJEYXRhWzY0XTsKKwkJfSBTNDsKKwkJc3RydWN0IHsKKwkJCXVzaG9ydCBfX2NtZF9oZHJfXzsKKwkJCXVjaGFyIFBjQ29tbWFuZFRleHRbMV07CisJCQl1Y2hhciBfX2NydWRfX1syMF07CisJCQl1Y2hhciBQY0lETnVtMjsJLyogVGFja2VkIG9uIGVuZCAqLworCQl9IFM1OworCQlzdHJ1Y3QgeworCQkJdXNob3J0IF9fY21kX2hkcl9fOworCQkJc3RydWN0IFRvcCBUb3BvbG9neVtMSU5LU19QRVJfVU5JVF07CisJCX0gUzY7CisJfSBVMTsKIH07CiAKICNkZWZpbmUgQ29tbWFuZAkJVTEuUzEuQ21kSGRyLlBjQ29tbWFuZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9jb250cm9sLmggYi9kcml2ZXJzL2NoYXIvcmlvL2NvbnRyb2wuaAppbmRleCAxNzEyZjYyLi42ODUzZDAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL2NvbnRyb2wuaAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2NvbnRyb2wuaApAQCAtNTEsMTIgKzUxLDExIEBACiAjZGVmaW5lCVVGT0FECQkoIENPTlRST0wgKyA0ICkKICNkZWZpbmUgSVdBSVQJCSggQ09OVFJPTCArIDUgKQogCi0jZGVmaW5lCUlGT0FEX01BR0lDCTB4RjBBRAkJLyogb2YgY291cnNlICovCisjZGVmaW5lCUlGT0FEX01BR0lDCTB4RjBBRAkvKiBvZiBjb3Vyc2UgKi8KICNkZWZpbmUJWk9NQklFX01BR0lDCSh+MHhERUFEKQkvKiBub3QgZGVhZCAtPiB6b21iaWUgKi8KLSNkZWZpbmUJVUZPQURfTUFHSUMJMHhEMUUJCS8qIGtpbGwteW91ci1uZWlnaGJvdXIgKi8KLSNkZWZpbmUJSVdBSVRfTUFHSUMJMHhCMURFCQkvKiBCaWRlIHlvdXIgdGltZSAqLworI2RlZmluZQlVRk9BRF9NQUdJQwkweEQxRQkvKiBraWxsLXlvdXItbmVpZ2hib3VyICovCisjZGVmaW5lCUlXQUlUX01BR0lDCTB4QjFERQkvKiBCaWRlIHlvdXIgdGltZSAqLwogCiAjZW5kaWYKIAogLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2RhZW1vbi5oIGIvZHJpdmVycy9jaGFyL3Jpby9kYWVtb24uaAppbmRleCA2MmRiYTBlLi4yOGE5OTFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL2RhZW1vbi5oCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vZGFlbW9uLmgKQEAgLTQ0LDE4ICs0NCwxNiBAQAogKiogc3RydWN0dXJlcyB1c2VkIG9uIC9kZXYvcmlvCiAqLwogCi1zdHJ1Y3QgRXJyb3IKLXsKLQl1aW50CUVycm9yOwotCXVpbnQJRW50cnk7Ci0JdWludAlPdGhlcjsKK3N0cnVjdCBFcnJvciB7CisJdWludCBFcnJvcjsKKwl1aW50IEVudHJ5OworCXVpbnQgT3RoZXI7CiB9OwogCi1zdHJ1Y3QgRG93bkxvYWQKLXsKLQljaGFyCSpEYXRhUDsKLQl1aW50CUNvdW50OwotCXVpbnQJUHJvZHVjdENvZGU7CitzdHJ1Y3QgRG93bkxvYWQgeworCWNoYXIgKkRhdGFQOworCXVpbnQgQ291bnQ7CisJdWludCBQcm9kdWN0Q29kZTsKIH07CiAKIC8qCkBAIC02Niw0NiArNjQsNDEgQEAKICNlbmRpZgogCiAjaWZuZGVmIE1BWF9YUF9DVFJMX0xFTgotI2RlZmluZQlNQVhfWFBfQ1RSTF9MRU4gMTYJCS8qIEFMU08gSU4gUE9SVC5IICovCisjZGVmaW5lCU1BWF9YUF9DVFJMX0xFTiAxNgkvKiBBTFNPIElOIFBPUlQuSCAqLwogI2VuZGlmCiAKLXN0cnVjdAlQb3J0U2V0dXAKLXsKLQl1aW50CUZyb207CS8qIFNldC9DbGVhciBYUCAmIElYQU5ZIENvbnRyb2wgZnJvbSB0aGlzIHBvcnQuLi4uICovCi0JdWludAlUbzsJLyogLi4uLiB0byB0aGlzIHBvcnQgKi8KLQl1aW50CVhwQ3BzOwkJCS8qIGF0IHRoaXMgc3BlZWQgKi8KLQljaGFyCVhwT25bTUFYX1hQX0NUUkxfTEVOXTsJLyogdGhpcyBpcyB0aGUgc3RhcnQgc3RyaW5nICovCi0JY2hhcglYcE9mZltNQVhfWFBfQ1RSTF9MRU5dOwkvKiB0aGlzIGlzIHRoZSBzdG9wIHN0cmluZyAqLwotCXVjaGFyCUl4QW55OwkJCS8qIGVuYWJsZS9kaXNhYmxlIElYQU5ZICovCi0JdWNoYXIJSXhPbjsJCQkvKiBlbmFibGUvZGlzYWJsZSBJWE9OICovCi0JdWNoYXIJTG9jazsJCQkvKiBsb2NrIHBvcnQgcGFyYW1zICovCi0JdWNoYXIJU3RvcmU7CQkJLyogc3RvcmUgcGFyYW1zIGFjcm9zcyBjbG9zZXMgKi8KLQl1Y2hhcglEcmFpbjsJCQkvKiBjbG9zZSBvbmx5IHdoZW4gZHJhaW5lZCAqLworc3RydWN0IFBvcnRTZXR1cCB7CisJdWludCBGcm9tOwkJLyogU2V0L0NsZWFyIFhQICYgSVhBTlkgQ29udHJvbCBmcm9tIHRoaXMgcG9ydC4uLi4gKi8KKwl1aW50IFRvOwkJLyogLi4uLiB0byB0aGlzIHBvcnQgKi8KKwl1aW50IFhwQ3BzOwkJLyogYXQgdGhpcyBzcGVlZCAqLworCWNoYXIgWHBPbltNQVhfWFBfQ1RSTF9MRU5dOwkvKiB0aGlzIGlzIHRoZSBzdGFydCBzdHJpbmcgKi8KKwljaGFyIFhwT2ZmW01BWF9YUF9DVFJMX0xFTl07CS8qIHRoaXMgaXMgdGhlIHN0b3Agc3RyaW5nICovCisJdWNoYXIgSXhBbnk7CQkvKiBlbmFibGUvZGlzYWJsZSBJWEFOWSAqLworCXVjaGFyIEl4T247CQkvKiBlbmFibGUvZGlzYWJsZSBJWE9OICovCisJdWNoYXIgTG9jazsJCS8qIGxvY2sgcG9ydCBwYXJhbXMgKi8KKwl1Y2hhciBTdG9yZTsJCS8qIHN0b3JlIHBhcmFtcyBhY3Jvc3MgY2xvc2VzICovCisJdWNoYXIgRHJhaW47CQkvKiBjbG9zZSBvbmx5IHdoZW4gZHJhaW5lZCAqLwogfTsKIAotc3RydWN0CUxwYlJlcQotewotCXVpbnQJSG9zdDsKLQl1aW50CUxpbms7Ci0Jc3RydWN0ICBMUEIgICAgICpMcGJQOworc3RydWN0IExwYlJlcSB7CisJdWludCBIb3N0OworCXVpbnQgTGluazsKKwlzdHJ1Y3QgTFBCICpMcGJQOwogfTsKIAotc3RydWN0CVJ1cFJlcQotewotCXVpbnQJSG9zdE51bTsKLQl1aW50CVJ1cE51bTsKLQlzdHJ1Y3QgIFJVUCAJKlJ1cFA7CitzdHJ1Y3QgUnVwUmVxIHsKKwl1aW50IEhvc3ROdW07CisJdWludCBSdXBOdW07CisJc3RydWN0IFJVUCAqUnVwUDsKIH07CiAKLXN0cnVjdAlQb3J0UmVxCi17Ci0JdWludAlTeXNQb3J0OwotCXN0cnVjdCAgUG9ydCAJKlBvcnRQOworc3RydWN0IFBvcnRSZXEgeworCXVpbnQgU3lzUG9ydDsKKwlzdHJ1Y3QgUG9ydCAqUG9ydFA7CiB9OwogCi1zdHJ1Y3QgIFN0cmVhbUluZm8KLXsKLQl1aW50CVN5c1BvcnQ7CitzdHJ1Y3QgU3RyZWFtSW5mbyB7CisJdWludCBTeXNQb3J0OwogI2lmIDAKIAlxdWV1ZV90IFJRdWV1ZTsKIAlxdWV1ZV90IFdRdWV1ZTsKQEAgLTExNSw2OCArMTA4LDU5IEBACiAjZW5kaWYKIH07CiAKLXN0cnVjdAlIb3N0UmVxCi17Ci0JdWludAlIb3N0TnVtOwotCXN0cnVjdCAgSG9zdCAJKkhvc3RQOworc3RydWN0IEhvc3RSZXEgeworCXVpbnQgSG9zdE51bTsKKwlzdHJ1Y3QgSG9zdCAqSG9zdFA7CiB9OwogCi1zdHJ1Y3QJSG9zdERwUmFtCi17Ci0JdWludAlIb3N0TnVtOwotCXN0cnVjdAlEcFJhbQkqRHBSYW1QOworc3RydWN0IEhvc3REcFJhbSB7CisJdWludCBIb3N0TnVtOworCXN0cnVjdCBEcFJhbSAqRHBSYW1QOwogfTsKIAotc3RydWN0CURlYnVnQ3RybAotewotCXVpbnQJU3lzUG9ydDsKLQl1aW50CURlYnVnOwotCXVpbnQJV2FpdDsKK3N0cnVjdCBEZWJ1Z0N0cmwgeworCXVpbnQgU3lzUG9ydDsKKwl1aW50IERlYnVnOworCXVpbnQgV2FpdDsKIH07CiAKLXN0cnVjdAlNYXBJbmZvCi17Ci0JdWludAlGaXJzdFBvcnQ7CS8qIDggcG9ydHMsIHN0YXJ0aW5nIGZyb20gdGhpcyAodHR5KSBudW1iZXIgKi8KLQl1aW50CVJ0YVVuaXF1ZTsJLyogcmVzaWRlIG9uIHRoaXMgUlRBICh1bmlxdWUgbnVtYmVyKSAqLworc3RydWN0IE1hcEluZm8geworCXVpbnQgRmlyc3RQb3J0OwkJLyogOCBwb3J0cywgc3RhcnRpbmcgZnJvbSB0aGlzICh0dHkpIG51bWJlciAqLworCXVpbnQgUnRhVW5pcXVlOwkJLyogcmVzaWRlIG9uIHRoaXMgUlRBICh1bmlxdWUgbnVtYmVyKSAqLwogfTsKIAotc3RydWN0CU1hcEluCi17Ci0JdWludAlOdW1FbnRyaWVzOwkJLyogSG93IG1hbnkgcG9ydCBzZXRzIGFyZSB3ZSBtYXBwaW5nPyAqLwotCXN0cnVjdCAgTWFwSW5mbwkqTWFwSW5mb1A7CS8qIFBvaW50ZXIgdG8gKHVzZXIgc3BhY2UpIGluZm8gKi8KK3N0cnVjdCBNYXBJbiB7CisJdWludCBOdW1FbnRyaWVzOwkvKiBIb3cgbWFueSBwb3J0IHNldHMgYXJlIHdlIG1hcHBpbmc/ICovCisJc3RydWN0IE1hcEluZm8gKk1hcEluZm9QOwkvKiBQb2ludGVyIHRvICh1c2VyIHNwYWNlKSBpbmZvICovCiB9OwogCi1zdHJ1Y3QgIFNlbmRQYWNrCi17Ci0gICAgICAgIHVuc2lnbmVkIGludAlQb3J0TnVtOwotCXVuc2lnbmVkIGNoYXIJTGVuOwotCXVuc2lnbmVkIGNoYXIJRGF0YVtQS1RfTUFYX0RBVEFfTEVOXTsKK3N0cnVjdCBTZW5kUGFjayB7CisJdW5zaWduZWQgaW50IFBvcnROdW07CisJdW5zaWduZWQgY2hhciBMZW47CisJdW5zaWduZWQgY2hhciBEYXRhW1BLVF9NQVhfREFUQV9MRU5dOwogfTsKIAotc3RydWN0IFNwZWNpYWxSdXBDbWQKLXsKLQlzdHJ1Y3QJUEtUCQlQYWNrZXQ7Ci0JdW5zaWduZWQgc2hvcnQJSG9zdDsKLQl1bnNpZ25lZCBzaG9ydAlSdXBOdW07CitzdHJ1Y3QgU3BlY2lhbFJ1cENtZCB7CisJc3RydWN0IFBLVCBQYWNrZXQ7CisJdW5zaWduZWQgc2hvcnQgSG9zdDsKKwl1bnNpZ25lZCBzaG9ydCBSdXBOdW07CiB9OwogCi1zdHJ1Y3QJSWRlbnRpZnlSdGEKLXsKLQl1bG9uZwlSdGFVbmlxdWU7Ci0JdWNoYXIJSUQ7CitzdHJ1Y3QgSWRlbnRpZnlSdGEgeworCXVsb25nIFJ0YVVuaXF1ZTsKKwl1Y2hhciBJRDsKIH07CiAKLXN0cnVjdAlLaWxsTmVpZ2hib3VyCi17Ci0JdWxvbmcJVW5pcXVlTnVtOwotCXVjaGFyCUxpbms7CitzdHJ1Y3QgS2lsbE5laWdoYm91ciB7CisJdWxvbmcgVW5pcXVlTnVtOworCXVjaGFyIExpbms7CiB9OwogCiBzdHJ1Y3QgcmlvVmVyc2lvbiB7Ci0gICAgY2hhciAgICAgICAgdmVyc2lvbltNQVhfVkVSU0lPTl9MRU5dOwotICAgIGNoYXIgICAgICAgIHJlbGlkW01BWF9WRVJTSU9OX0xFTl07Ci0gICAgaW50ICAgICAgICAgYnVpbGRMZXZlbDsKLSAgICBjaGFyICAgICAgICBidWlsZERhdGVbTUFYX1ZFUlNJT05fTEVOXTsKKwljaGFyIHZlcnNpb25bTUFYX1ZFUlNJT05fTEVOXTsKKwljaGFyIHJlbGlkW01BWF9WRVJTSU9OX0xFTl07CisJaW50IGJ1aWxkTGV2ZWw7CisJY2hhciBidWlsZERhdGVbTUFYX1ZFUlNJT05fTEVOXTsKIH07CiAKIApAQCAtMzE2LDE2ICszMDAsMTYgQEAKICNkZWZpbmUJUklPX1NFVF9YUF9DUFMgICAgcklPQ1coMTU1LGludCkKICNkZWZpbmUgUklPX0dFVF9JWEFOWSAgICAgcklPQ1IoMTU2LGludCkJLyogaXhhbnkgYWxsb3dlZD8gKi8KICNkZWZpbmUgUklPX1NFVF9JWEFOWSAgICAgcklPQ1coMTU3LGludCkKLSNkZWZpbmUgUklPX1NFVF9JWEFOWV9PTiAgcklPQ04oMTU4KQkJLyogYWxsb3cgaXhhbnkgKi8KLSNkZWZpbmUgUklPX1NFVF9JWEFOWV9PRkYgcklPQ04oMTU5KQkJLyogZGlzYWxsb3cgaXhhbnkgKi8KKyNkZWZpbmUgUklPX1NFVF9JWEFOWV9PTiAgcklPQ04oMTU4KQkvKiBhbGxvdyBpeGFueSAqLworI2RlZmluZSBSSU9fU0VUX0lYQU5ZX09GRiBySU9DTigxNTkpCS8qIGRpc2FsbG93IGl4YW55ICovCiAjZGVmaW5lIFJJT19HRVRfTU9ERU0gICAgIHJJT0NSKDE2MCxpbnQpCS8qIHBvcnQgaXMgbW9kZW0vZGlyZWN0IGxpbmU/ICovCiAjZGVmaW5lIFJJT19TRVRfTU9ERU0gICAgIHJJT0NXKDE2MSxpbnQpCi0jZGVmaW5lIFJJT19TRVRfTU9ERU1fT04gIHJJT0NOKDE2MikJCS8qIHBvcnQgaXMgYSBtb2RlbSAqLwotI2RlZmluZSBSSU9fU0VUX01PREVNX09GRiBySU9DTigxNjMpCQkvKiBwb3J0IGlzIGRpcmVjdCAqLworI2RlZmluZSBSSU9fU0VUX01PREVNX09OICBySU9DTigxNjIpCS8qIHBvcnQgaXMgYSBtb2RlbSAqLworI2RlZmluZSBSSU9fU0VUX01PREVNX09GRiBySU9DTigxNjMpCS8qIHBvcnQgaXMgZGlyZWN0ICovCiAjZGVmaW5lIFJJT19HRVRfSVhPTiAgICAgIHJJT0NSKDE2NCxpbnQpCS8qIGl4b24gYWxsb3dlZD8gKi8KICNkZWZpbmUgUklPX1NFVF9JWE9OICAgICAgcklPQ1coMTY1LGludCkKLSNkZWZpbmUgUklPX1NFVF9JWE9OX09OICAgcklPQ04oMTY2KQkJLyogYWxsb3cgaXhvbiAqLwotI2RlZmluZSBSSU9fU0VUX0lYT05fT0ZGICBySU9DTigxNjcpCQkvKiBkaXNhbGxvdyBpeG9uICovCisjZGVmaW5lIFJJT19TRVRfSVhPTl9PTiAgIHJJT0NOKDE2NikJLyogYWxsb3cgaXhvbiAqLworI2RlZmluZSBSSU9fU0VUX0lYT05fT0ZGICBySU9DTigxNjcpCS8qIGRpc2FsbG93IGl4b24gKi8KIAogI2RlZmluZSBSSU9fR0VUX1NJVklFVwkgICgoKCdzJyk8PDgpIHwgMTA2KQkvKiBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIFNJICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vZGF0YS5oIGIvZHJpdmVycy9jaGFyL3Jpby9kYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYmMyZDEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9kYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoqCi0qKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKLSoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KLSAqCi0gKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCi0gKgotICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotKioKLSoqCU1vZHVsZQkJOiBkYXRhLmgKLSoqCVNJRAkJOiAxLjIKLSoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjA5Ci0qKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIxCi0qKgotKiogIGlkZW50IEAoIylkYXRhLmgJMS4yCi0qKgotKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpZm5kZWYgX19yaW9fZGF0YWRleF9fCi0jZGVmaW5lIF9fcmlvX2RhdGFkZXhfXwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjaGFyICpfZGF0YV9oX3NjY3NfID0gIkAoIylkYXRhLmgJMS4yIjsKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vZGVidWcuaCBiL2RyaXZlcnMvY2hhci9yaW8vZGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZlMGQwOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL2RlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotKiogRmlsZToJCWRlYnVnLmgKLSoqCi0qKiBBdXRob3I6CQlEYXZpZCBEaXgKLSoqCi0qKiBDcmVhdGVkOgkJMTJ0aCBNYXJjaCAxOTkzCi0qKgotKiogTGFzdCBtb2RpZmllZDoJOTMvMDQvMjcKLSoqCi0gKgotICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSovCi0KLSNpZm5kZWYgX2RlYnVnX2hfCi0jZGVmaW5lIF9kZWJ1Z19oXwotCi0KLSNpZiBkZWZpbmVkKERDSVJSVVMpCi0jZGVmaW5lCURCUEFDS0VUKHBrdCwgb3B0LCBzdHIsIGNobikgCWRlYnVnX3BhY2tldCgocGt0KSwgKG9wdCksIChzdHIpLCAoY2huKSkKLSNlbHNlCi0jZGVmaW5lCURCUEFDS0VUKHBrdCwgb3B0LCBzdHIsIGMpCi0jZW5kaWYJLyogRENJUlJVUyAqLwotCi0KLSNlbmRpZgkvKiBfZGVidWdfaF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vZGVmYXVsdHMuaCBiL2RyaXZlcnMvY2hhci9yaW8vZGVmYXVsdHMuaAppbmRleCAyZTczMDllLi41YjYwMGMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL2RlZmF1bHRzLmgKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9kZWZhdWx0cy5oCkBAIC0zNywxMyArMzcsMTMgQEAKIAogI2lmbmRlZiBsaW50CiAjaWZkZWYgU0NDUwotc3RhdGljIGNoYXIgKl9yaW9fZGVmYXVsdHNfaF9zY2NzID0gIkAoIylkZWZhdWx0cy5oCTEuMSIgOworc3RhdGljIGNoYXIgKl9yaW9fZGVmYXVsdHNfaF9zY2NzID0gIkAoIylkZWZhdWx0cy5oCTEuMSI7CiAjZW5kaWYKICNlbmRpZgogCiAKLSNkZWZpbmUgTUlMTElTRUNPTkQgICAgICAgICAgIChpbnQpICgxMDAwLzY0KSAgIC8qIDE1LjYyNSBsb3cgdGlja3MgKi8KLSNkZWZpbmUgU0VDT05EICAgICAgICAgICAgICAgIChpbnQpIDE1NjI1ICAgICAgIC8qIExvdyBwcmlvcml0eSB0aWNrcyAqLworI2RlZmluZSBNSUxMSVNFQ09ORCAgICAgICAgICAgKGludCkgKDEwMDAvNjQpCS8qIDE1LjYyNSBsb3cgdGlja3MgKi8KKyNkZWZpbmUgU0VDT05EICAgICAgICAgICAgICAgIChpbnQpIDE1NjI1CS8qIExvdyBwcmlvcml0eSB0aWNrcyAqLwogCiAjaWZkZWYgUlRBCiAjZGVmaW5lIFJYX0xJTUlUICAgICAgICh1c2hvcnQpIDMKQEAgLTU2LDQgKzU2LDMgQEAKIAogCiAvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vZWlzYS5oIGIvZHJpdmVycy9jaGFyL3Jpby9laXNhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MzcxYjAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9laXNhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qKgotKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4Ci0qKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCi0KLSAqCi0gKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCi0gKgotICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotKioKLSoqCU1vZHVsZQkJOiBlaXNhLmgKLSoqCVNJRAkJOiAxLjIKLSoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjEwCi0qKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIxCi0qKgotKiogIGlkZW50IEAoIyllaXNhLmgJMS4yCi0qKgotKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpZm5kZWYgX19yaW9fZWlzYV9oX18KLSNkZWZpbmUgX19yaW9fZWlzYV9oX18KLQotI2lmZGVmIFNDQ1NfTEFCRUxTCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjaGFyICpfZWlzYV9oX3NjY3NfID0gIkAoIyllaXNhLmgJMS4yIjsKLSNlbmRpZgotI2VuZGlmCi0KLS8qCi0qKiB0aGluZ3MgdG8gZG8gd2l0aCB0aGUgRUlTQSBidXMKLSovCi0KLSNkZWZpbmUgUklPX0VJU0FfU1RSSU5HX0FERFJFU1MgCTB4ZmZmZDkJLyogd2hlcmUgRUlTQSBpcyBzdG9yZWQgKi8KLQotI2RlZmluZQlSSU9fTUFYX0VJU0FfU0xPVFMJCTE2CS8qIGhvdyBtYW55IEVJU0Egc2xvdHM/ICovCi0KLSNkZWZpbmUJUklPX0VJU0FfSURFTlQJCQkweDk4NEQJLyogU3BlY2lhbGl4ICovCi0jZGVmaW5lCVJJT19FSVNBX1BST0RVQ1RfQ09ERQkJMHgxNAkvKiBDb2RlIDE0ICovCi0jZGVmaW5lCVJJT19FSVNBX0VOQUJMRV9CSVQJCTB4MDEJLyogVG8gZW5hYmxlIGNhcmQgKi8KLQotI2RlZmluZQlFSVNBX01FTU9SWV9CQVNFX0xPCQkweEMwMAkvKiBBMTYtQTIzICovCi0jZGVmaW5lCUVJU0FfTUVNT1JZX0JBU0VfSEkJCTB4QzAxCS8qIEEyNC1BMzEgKi8KLSNkZWZpbmUJRUlTQV9JTlRFUlJVUFRfVkVDCQkweEMwMgkvKiBzZWUgYmVsb3cgKi8KLSNkZWZpbmUJRUlTQV9DT05UUk9MX1BPUlQJCTB4QzAyCS8qIHNlZSBiZWxvdyAqLwotI2RlZmluZQlFSVNBX0lOVEVSUlVQVF9SRVNFVAkJMHhDMDMJLyogcmVhZCB0byBjbGVhciBJUlEgKi8KLQotI2RlZmluZQlFSVNBX1BST0RVQ1RfSURFTlRfTE8JCTB4QzgwCS8qIHdoZXJlIFJJT19FSVNBX0lERU5UIGlzICovCi0jZGVmaW5lCUVJU0FfUFJPRFVDVF9JREVOVF9ISQkJMHhDODEKLSNkZWZpbmUJRUlTQV9QUk9EVUNUX05VTUJFUgkJMHhDODIgICAvKiB3aGVyZSBQUk9EX0NPREUgaXMgKi8KLSNkZWZpbmUJRUlTQV9SRVZJU0lPTl9OVU1CRVIJCTB4QzgzCS8qIHJldmlzaW9uICgxZHApICovCi0jZGVmaW5lCUVJU0FfRU5BQkxFCQkJMHhDODQJLyogc2V0IExTQiB0byBlbmFibGUgY2FyZCAqLwotI2RlZmluZQlFSVNBX1VOSVFVRV9OVU1fMAkJMHhDODgJLyogdm9taXQgKi8KLSNkZWZpbmUJRUlTQV9VTklRVUVfTlVNXzEJCTB4QzhBCi0jZGVmaW5lCUVJU0FfVU5JUVVFX05VTV8yCQkweEM5MAkvKiBiaXQgc3RyYW5nZWx5IGFycmFuZ2VkICovCi0jZGVmaW5lCUVJU0FfVU5JUVVFX05VTV8zCQkweEM5MgotI2RlZmluZQlFSVNBX01BTlVGX1lFQVIJCQkweEM5OAkvKiB3aGVuICovCi0jZGVmaW5lCUVJU0FfTUFOVUZfV0VFSwkJCTB4QzlBCS8qIG1vcmUgd2hlbiAqLwotCi0jZGVmaW5lCUVJU0FfVFBfQk9PVF9GUk9NX1JBTQkweDAxCi0jZGVmaW5lCUVJU0FfVFBfQk9PVF9GUk9NX0xJTksJMHgwMAotI2RlZmluZQlFSVNBX1RQX0ZBU1RfTElOS1MJMHgwMgotI2RlZmluZQlFSVNBX1RQX1NMT1dfTElOS1MJMHgwMAotI2RlZmluZQlFSVNBX1RQX0JVU19FTkFCTEUJMHgwNAotI2RlZmluZQlFSVNBX1RQX0JVU19ESVNBQkxFCTB4MDAKLSNkZWZpbmUJRUlTQV9UUF9SVU4JCTB4MDgKLSNkZWZpbmUJRUlTQV9UUF9SRVNFVAkJMHgwMAotI2RlZmluZQlFSVNBX1BPTExFRAkJMHgwMAotI2RlZmluZQlFSVNBX0lSUV8zCQkweDMwCi0jZGVmaW5lCUVJU0FfSVJRXzQJCTB4NDAKLSNkZWZpbmUJRUlTQV9JUlFfNQkJMHg1MAotI2RlZmluZQlFSVNBX0lSUV82CQkweDYwCi0jZGVmaW5lCUVJU0FfSVJRXzcJCTB4NzAKLSNkZWZpbmUJRUlTQV9JUlFfOQkJMHg5MAotI2RlZmluZQlFSVNBX0lSUV8xMAkJMHhBMAotI2RlZmluZQlFSVNBX0lSUV8xMQkJMHhCMAotI2RlZmluZQlFSVNBX0lSUV8xMgkJMHhDMAotI2RlZmluZQlFSVNBX0lSUV8xNAkJMHhFMAotI2RlZmluZQlFSVNBX0lSUV8xNQkJMHhGMAotCi0jZGVmaW5lCUVJU0FfSU5URVJSVVBUX01BU0sJMHhGMAotI2RlZmluZQlFSVNBX0NPTlRST0xfTUFTSwkweDBGCi0KLSNkZWZpbmUJUklPX0VJU0FfREVGQVVMVF9NT0RFCUVJU0FfVFBfU0xPV19MSU5LUwotCi0jZGVmaW5lCVJJT0Vpc2FUb0l2ZWMoWCkJKHVjaGFyICkoKHVjaGFyKSgoWCkgJiBFSVNBX0lOVEVSUlVQVF9NQVNLKT4+NCkKLQotI2RlZmluZQlJTkJaKHoseCkJaW5iKCgoeik8PDEyKSB8ICh4KSkKLSNkZWZpbmUJT1VUQlooeix4LHkpCW91dGIoKCgoeik8PDEyKSB8ICh4KSksIHkpCi0KLSNlbmRpZiAvKiBfX3Jpb19laXNhX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9lbmFibGUuaCBiL2RyaXZlcnMvY2hhci9yaW8vZW5hYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlOWE0MTllLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9yaW8vZW5hYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKLSAqKioqKioqICAgICAgICAgICAgICAgRSBOIEEgQiBMIEUgICBIIEUgQSBEIEUgUiBTCi0gKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIEF1dGhvciAgOiBJYW4gTmFuZGhyYQotIERhdGUgICAgOgotCi0gKgotICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotIFZlcnNpb24gOiAwLjAxCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIGxpbnQKLSNpZmRlZiBTQ0NTCi1zdGF0aWMgY2hhciAqX3Jpb19lbmFibGVfaF9zY2NzID0gIkAoIyllbmFibGUuaAkxLjEiIDsKLSNlbmRpZgotI2VuZGlmCi0KLQotI2RlZmluZSBFTkFCTEVfTFRUICBUUlVFCi0jZGVmaW5lIEVOQUJMRV9MUlQgIFRSVUUKLQotCi0vKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9lcnJvci5oIGIvZHJpdmVycy9jaGFyL3Jpby9lcnJvci5oCmluZGV4IDIyOTQzOGUuLmYyMGYwNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vZXJyb3IuaAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2Vycm9yLmgKQEAgLTgwLDYgKzgwLDMgQEAKIAogCiAvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCi0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2Vycm9ycy5oIGIvZHJpdmVycy9jaGFyL3Jpby9lcnJvcnMuaAppbmRleCBmOTIwYjlmLi4xZDBkODkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL2Vycm9ycy5oCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vZXJyb3JzLmgKQEAgLTEwMSw0ICsxMDEsNCBAQAogI2RlZmluZQlOT1RfRU5PVUdIX0NPUkVfRk9SX1BDSV9DT1BZCTUzCiAKIAotI2VuZGlmIC8qIF9fcmlvX2Vycm9yc19oX18gKi8KKyNlbmRpZgkJCQkvKiBfX3Jpb19lcnJvcnNfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2Zvcm1wa3QuaCBiL2RyaXZlcnMvY2hhci9yaW8vZm9ybXBrdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGI2NWFlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9yaW8vZm9ybXBrdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKLSAqKioqKioqICAgICAgICAgRiBPIFIgTSAgIFAgQSBDIEsgRSBUICAgSCBFIEEgRCBFIFIgICBGIEkgTCBFCi0gKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIEF1dGhvciAgOiBJYW4gTmFuZGhyYQotIERhdGUgICAgOgotCi0gKgotICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotIFZlcnNpb24gOiAwLjAxCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9mb3JtcGt0X2gKLSNkZWZpbmUgX2Zvcm1wa3RfaCAxCi0KLSNpZm5kZWYgbGludAotI2lmZGVmIFNDQ1MKLXN0YXRpYyBjaGFyICpfcmlvX2Zvcm1wa3RfaF9zY2NzID0gIkAoIylmb3JtcGt0LmgJMS4xIiA7Ci0jZW5kaWYKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCBGT1JNX0JPT1RfUEtUXzEgRk9STV9CT09UX1BLVF8xIDsKLXN0cnVjdCBGT1JNX0JPT1RfUEtUXzEgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHBrdF9udW1iZXIgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHBrdF90b3RhbCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgYm9vdF90b3AgOwotICAgICAgICAgICAgICAgICAgICAgICB9IDsKLQotdHlwZWRlZiBzdHJ1Y3QgRk9STV9CT09UX1BLVF8yIEZPUk1fQk9PVF9QS1RfMiA7Ci1zdHJ1Y3QgRk9STV9CT09UX1BLVF8yIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBwa3RfbnVtYmVyIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICBib290X2RhdGFbMTBdIDsKLSAgICAgICAgICAgICAgICAgICAgICAgfSA7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgRk9STV9BVFRBQ0hfUlRBICAgRk9STV9BVFRBQ0hfUlRBIDsKLXN0cnVjdCBGT1JNX0FUVEFDSF9SVEEgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBjbWRfY29kZSA7Ci0gICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgYm9vdGVyX3NlcmlhbFs0XSA7Ci0gICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgYm9vdGVyX2xpbmsgOwotICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIGJvb3RlZV9zZXJpYWxbNF0gOwotICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIGJvb3RlZV9saW5rIDsKLSAgICAgICAgICAgICAgICAgICB9IDsKLQotCi10eXBlZGVmIHN0cnVjdCBGT1JNX0JPT1RfSUQgICBGT1JNX0JPT1RfSUQgOwotc3RydWN0IEZPUk1fQk9PVF9JRCAgewotICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIGNtZF9jb2RlIDsKLSAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBib290ZWVfc2VyaWFsWzRdIDsKLSAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBib290ZWVfcHJvZF9pZCA7Ci0gICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgYm9vdGVlX2xpbmsgOwotICAgICAgICAgICAgICAgICAgIH0gOwotCi0KLQotdHlwZWRlZiBzdHJ1Y3QgRk9STV9ST1VURV8xICAgRk9STV9ST1VURV8xIDsKLXN0cnVjdCBGT1JNX1JPVVRFXzEgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgY21kX2NvZGUgOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgcGt0X251bWJlciA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICB0b3RhbF9pbl9zZXF1ZW5jZSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICB1bml0X2lkIDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgIGhvc3RfdW5pdF9pZCA7Ci0gICAgICAgICAgICAgICAgICAgIH0gOwotCi10eXBlZGVmIHN0cnVjdCBGT1JNX1JPVVRFXzIgICBGT1JNX1JPVVRFXzIgOwotc3RydWN0IEZPUk1fUk9VVEVfMiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgY21kX2NvZGUgOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIHBrdF9udW1iZXIgOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIHRvdGFsX2luX3NlcXVlbmNlIDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICByb3V0ZV9kYXRhWzldIDsKLSAgICAgICAgICAgICAgICAgICAgfSA7Ci0KLXR5cGVkZWYgc3RydWN0IEZPUk1fUk9VVEVfUkVRICAgRk9STV9ST1VURV9SRVEgOwotc3RydWN0IEZPUk1fUk9VVEVfUkVRIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIGNtZF9jb2RlIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIHBrdF9udW1iZXIgOwotICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgdG90YWxfaW5fc2VxdWVuY2UgOwotICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgcm91dGVfZGF0YVsxMF0gOwotICAgICAgICAgICAgICAgICAgICAgIH0gOwotCi0KLXR5cGVkZWYgc3RydWN0IEZPUk1fRVJST1IgICBGT1JNX0VSUk9SIDsKLXN0cnVjdCBGT1JNX0VSUk9SIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICBjbWRfY29kZSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgZXJyb3JfY29kZSA7Ci0KLSAgICAgICAgICAgICAgICAgICAgfSA7Ci0KLXR5cGVkZWYgc3RydWN0IEZPUk1fU1RBVFVTICAgRk9STV9TVEFUVVMgOwotc3RydWN0IEZPUk1fU1RBVFVTIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICBjbWRfY29kZSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgc3RhdHVzX2NvZGUgOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIGxhc3RfcGFja2V0X3ZhbGlkIDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICB0eF9idWZmZXIgOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIHJ4X2J1ZmZlciA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgcG9ydF9zdGF0dXMgOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgIHBoYl9zdGF0dXMgOwotICAgICAgICAgICAgICAgICAgICB9IDsKLQotCi10eXBlZGVmIHN0cnVjdCBGT1JNX0xJTktfU1RBVFVTICAgRk9STV9MSU5LX1NUQVRVUyA7Ci1zdHJ1Y3QgRk9STV9MSU5LX1NUQVRVUyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIGNtZF9jb2RlIDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgc3RhdHVzX2NvZGUgOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBsaW5rX251bWJlciA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgIHJ4X2Vycm9ycyA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgIHR4X2Vycm9ycyA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgIGNzdW1fZXJyb3JzIDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCAgZGlzY29ubmVjdHMgOwotICAgICAgICAgICAgICAgICAgICB9IDsKLQotCi0KLXR5cGVkZWYgc3RydWN0IEZPUk1fUEFSVElUSU9OIEZPUk1fUEFSVElUSU9OIDsKLXN0cnVjdCBGT1JNX1BBUlRJVElPTiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIGNtZF9jb2RlIDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgc3RhdHVzX2NvZGUgOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICBwb3J0X251bWJlciA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIHR4X21heCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIHJ4X21heCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgIHJ4X2xpbWl0IDsKLSAgICAgICAgICAgICAgICAgICAgICB9IDsKLQotCi0jZW5kaWYKLQotLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2Z1bmMuaCBiL2RyaXZlcnMvY2hhci9yaW8vZnVuYy5oCmluZGV4IDAxOTg3YzYuLmI0Nzc4NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vZnVuYy5oCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vZnVuYy5oCkBAIC00NywyMCArNDcsMTkgQEAKIGludCBSSU9Cb290Q29kZVVOS05PV04oc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBEb3duTG9hZCAqKTsKIHZvaWQgbXNlY190aW1lb3V0KHN0cnVjdCBIb3N0ICopOwogaW50IFJJT0Jvb3RSdXAoc3RydWN0IHJpb19pbmZvICosIHVpbnQsIHN0cnVjdCBIb3N0ICosIHN0cnVjdCBQS1QgKik7Ci1pbnQgUklPQm9vdE9rKHN0cnVjdCByaW9faW5mbyAqLHN0cnVjdCBIb3N0ICosIHVsb25nKTsKLWludCBSSU9SdGFCb3VuZChzdHJ1Y3QgcmlvX2luZm8gKiwgdWludCk7IAoraW50IFJJT0Jvb3RPayhzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IEhvc3QgKiwgdWxvbmcpOworaW50IFJJT1J0YUJvdW5kKHN0cnVjdCByaW9faW5mbyAqLCB1aW50KTsKIHZvaWQgRmlsbFNsb3QoaW50LCBpbnQsIHVpbnQsIHN0cnVjdCBIb3N0ICopOwogCiAvKiByaW9jbWQuYyAqLwogaW50IFJJT0ZvYWRSdGEoc3RydWN0IEhvc3QgKiwgc3RydWN0IE1hcCAqKTsKIGludCBSSU9ab21iaWVSdGEoc3RydWN0IEhvc3QgKiwgc3RydWN0IE1hcCAqKTsKLWludCBSSU9Db21tYW5kUnRhKHN0cnVjdCByaW9faW5mbyAqLCB1aW50LCBpbnQgKCogZnVuYykoIHN0cnVjdCBIb3N0ICosIAotCQkJCQkJCQlzdHJ1Y3QgTWFwICopKTsKLWludCBSSU9JZGVudGlmeVJ0YShzdHJ1Y3QgcmlvX2luZm8gKiwgY2FkZHJfdCk7IAoraW50IFJJT0NvbW1hbmRSdGEoc3RydWN0IHJpb19pbmZvICosIHVpbnQsIGludCAoKmZ1bmMpIChzdHJ1Y3QgSG9zdCAqLCBzdHJ1Y3QgTWFwICopKTsKK2ludCBSSU9JZGVudGlmeVJ0YShzdHJ1Y3QgcmlvX2luZm8gKiwgY2FkZHJfdCk7CiBpbnQgUklPS2lsbE5laWdoYm91cihzdHJ1Y3QgcmlvX2luZm8gKiwgY2FkZHJfdCk7CiBpbnQgUklPU3VzcGVuZEJvb3RSdGEoc3RydWN0IEhvc3QgKiwgaW50LCBpbnQpOwogaW50IFJJT0ZvYWRXYWtldXAoc3RydWN0IHJpb19pbmZvICopOwotc3RydWN0IENtZEJsayAqIFJJT0dldENtZEJsayh2b2lkKTsKK3N0cnVjdCBDbWRCbGsgKlJJT0dldENtZEJsayh2b2lkKTsKIHZvaWQgUklPRnJlZUNtZEJsayhzdHJ1Y3QgQ21kQmxrICopOwogaW50IFJJT1F1ZXVlQ21kQmxrKHN0cnVjdCBIb3N0ICosIHVpbnQsIHN0cnVjdCBDbWRCbGsgKik7CiB2b2lkIFJJT1BvbGxIb3N0Q29tbWFuZHMoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBIb3N0ICopOwpAQCAtNzEsMTMgKzcwLDEzIEBACiAKIC8qIHJpb2N0cmwuYyAqLwogaW50IGNvcHlpbihpbnQsIGNhZGRyX3QsIGludCk7Ci1pbnQgcmlvY29udHJvbChzdHJ1Y3QgcmlvX2luZm8gKiwgZGV2X3QsaW50LGNhZGRyX3QsaW50KTsgCi1pbnQgUklPUHJlZW1wdGl2ZUNtZChzdHJ1Y3QgcmlvX2luZm8gKixzdHJ1Y3QgUG9ydCAqLHVjaGFyKTsKK2ludCByaW9jb250cm9sKHN0cnVjdCByaW9faW5mbyAqLCBkZXZfdCwgaW50LCBjYWRkcl90LCBpbnQpOworaW50IFJJT1ByZWVtcHRpdmVDbWQoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBQb3J0ICosIHVjaGFyKTsKIAogLyogcmlvaW5pdC5jICovCiB2b2lkIHJpb2luaXQoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBSaW9Ib3N0SW5mbyAqKTsKIHZvaWQgUklPSW5pdEhvc3RzKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgUmlvSG9zdEluZm8gKik7Ci12b2lkIFJJT0lTQWluaXQoc3RydWN0IHJpb19pbmZvICosaW50KTsKK3ZvaWQgUklPSVNBaW5pdChzdHJ1Y3QgcmlvX2luZm8gKiwgaW50KTsKIGludCBSSU9Eb0FUKHN0cnVjdCByaW9faW5mbyAqLCBpbnQsIGludCk7CiBjYWRkcl90IFJJT0NoZWNrRm9yQVRDYXJkKGludCk7CiBpbnQgUklPQXNzaWduQVQoc3RydWN0IHJpb19pbmZvICosIGludCwgY2FkZHJfdCwgaW50KTsKQEAgLTg1LDcgKzg0LDcgQEAKIHZvaWQgUklPQWxsb2NEYXRhU3RydWN0cyhzdHJ1Y3QgcmlvX2luZm8gKik7CiB2b2lkIFJJT1NldHVwRGF0YVN0cnVjdHMoc3RydWN0IHJpb19pbmZvICopOwogaW50IFJJT0RlZmF1bHROYW1lKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgSG9zdCAqLCB1aW50KTsKLXN0cnVjdCByaW9WZXJzaW9uICogUklPVmVyc2lkKHZvaWQpOworc3RydWN0IHJpb1ZlcnNpb24gKlJJT1ZlcnNpZCh2b2lkKTsKIGludCBSSU9NYXBpbihwYWRkcl90LCBpbnQsIGNhZGRyX3QgKik7CiB2b2lkIFJJT01hcG91dChwYWRkcl90LCBsb25nLCBjYWRkcl90KTsKIHZvaWQgUklPSG9zdFJlc2V0KHVpbnQsIHZvbGF0aWxlIHN0cnVjdCBEcFJhbSAqLCB1aW50KTsKQEAgLTEwOCw3ICsxMDcsNyBAQAogCiAvKiByaW9yb3V0ZS5jICovCiBpbnQgUklPUm91dGVSdXAoc3RydWN0IHJpb19pbmZvICosIHVpbnQsIHN0cnVjdCBIb3N0ICosIHN0cnVjdCBQS1QgKik7Ci12b2lkIFJJT0ZpeFBoYnMoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBIb3N0ICosIHVpbnQpOyAKK3ZvaWQgUklPRml4UGhicyhzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IEhvc3QgKiwgdWludCk7CiB1aW50IEdldFVuaXRUeXBlKHVpbnQpOwogaW50IFJJT1NldENoYW5nZShzdHJ1Y3QgcmlvX2luZm8gKik7CiBpbnQgUklPRmluZEZyZWVJRChzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IEhvc3QgKiwgdWludCAqLCB1aW50ICopOwpAQCAtMTE2LDkgKzExNSw5IEBACiAKIC8qIHJpb3R0eS5jICovCiAKLWludCByaW90b3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKTsKLWludCByaW90Y2xvc2Uodm9pZCAgKnB0cik7Ci1pbnQgcmlvdGlvY3RsKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqLCByZWdpc3RlciBpbnQsIHJlZ2lzdGVyIGNhZGRyX3QpOyAKK2ludCByaW90b3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitpbnQgcmlvdGNsb3NlKHZvaWQgKnB0cik7CitpbnQgcmlvdGlvY3RsKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqLCByZWdpc3RlciBpbnQsIHJlZ2lzdGVyIGNhZGRyX3QpOwogdm9pZCB0dHlzZXRoKHN0cnVjdCBQb3J0ICosIHN0cnVjdCB0dHlzdGF0aWNzICosIHN0cnVjdCBvbGRfc2d0dHliICpzZyk7CiAKIC8qIHJpb3RhYmxlLmMgKi8KQEAgLTEyNywyNyArMTI2LDI3IEBACiBpbnQgUklPRGVsZXRlUnRhKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgTWFwICopOwogaW50IFJJT0Fzc2lnblJ0YShzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IE1hcCAqKTsKIGludCBSSU9SZU1hcFBvcnRzKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgSG9zdCAqLCBzdHJ1Y3QgTWFwICopOwotaW50IFJJT0NoYW5nZU5hbWUoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBNYXAqKTsKK2ludCBSSU9DaGFuZ2VOYW1lKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgTWFwICopOwogCiAjaWYgMAogLyogcmlvZHJ2ci5jICovCi1zdHJ1Y3QgcmlvX2luZm8gKiByaW9faW5zdGFsbChzdHJ1Y3QgUmlvSG9zdEluZm8gKik7CitzdHJ1Y3QgcmlvX2luZm8gKnJpb19pbnN0YWxsKHN0cnVjdCBSaW9Ib3N0SW5mbyAqKTsKIGludCByaW9fdW5pbnN0YWxsKHJlZ2lzdGVyIHN0cnVjdCByaW9faW5mbyAqKTsKIGludCByaW9fb3BlbihzdHJ1Y3QgcmlvX2luZm8gKiwgaW50LCBzdHJ1Y3QgZmlsZSAqKTsKIGludCByaW9fY2xvc2Uoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBmaWxlICopOwogaW50IHJpb19yZWFkKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgZmlsZSAqLCBjaGFyICosIGludCk7Ci1pbnQgcmlvX3dyaXRlKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgZmlsZSAqCWYsIGNoYXIgKiwgaW50KTsKK2ludCByaW9fd3JpdGUoc3RydWN0IHJpb19pbmZvICosIHN0cnVjdCBmaWxlICpmLCBjaGFyICosIGludCk7CiBpbnQgcmlvX2lvY3RsKHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgZmlsZSAqLCBpbnQsIGNoYXIgKik7Ci1pbnQgcmlvX3NlbGVjdChzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IGZpbGUgKglmLCBpbnQsIHN0cnVjdCBzZWwgKik7Ci1pbnQJcmlvX2ludHIoY2hhciAqKTsKLWludCByaW9faXNyX3RocmVhZChjaGFyICAqKTsKLXN0cnVjdCByaW9faW5mbyAqIHJpb19pbmZvX3N0b3JlKCBpbnQgY21kLCBzdHJ1Y3QgcmlvX2luZm8gKiBwKTsKK2ludCByaW9fc2VsZWN0KHN0cnVjdCByaW9faW5mbyAqLCBzdHJ1Y3QgZmlsZSAqZiwgaW50LCBzdHJ1Y3Qgc2VsICopOworaW50IHJpb19pbnRyKGNoYXIgKik7CitpbnQgcmlvX2lzcl90aHJlYWQoY2hhciAqKTsKK3N0cnVjdCByaW9faW5mbyAqcmlvX2luZm9fc3RvcmUoaW50IGNtZCwgc3RydWN0IHJpb19pbmZvICpwKTsKICNlbmRpZgogCi1leHRlcm4gaW50ICAgIHJpb19wY2ljb3B5KGNoYXIgKnNyYywgY2hhciAqZHN0LCBpbnQgbik7Ci1leHRlcm4gaW50IHJpb19taW5vciAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1leHRlcm4gaW50IHJpb19pc21vZGVtIChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK2V4dGVybiBpbnQgcmlvX3BjaWNvcHkoY2hhciAqc3JjLCBjaGFyICpkc3QsIGludCBuKTsKK2V4dGVybiBpbnQgcmlvX21pbm9yKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworZXh0ZXJuIGludCByaW9faXNtb2RlbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIAotZXh0ZXJuIHZvaWQgcmlvX3N0YXJ0X2NhcmRfcnVubmluZyAoc3RydWN0IEhvc3QgKiBIb3N0UCk7CitleHRlcm4gdm9pZCByaW9fc3RhcnRfY2FyZF9ydW5uaW5nKHN0cnVjdCBIb3N0ICpIb3N0UCk7CiAKLSNlbmRpZgkvKiBfX2Z1bmNfaF9kZWYgKi8KKyNlbmRpZgkJCQkvKiBfX2Z1bmNfaF9kZWYgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vaG9zdC5oIGIvZHJpdmVycy9jaGFyL3Jpby9ob3N0LmgKaW5kZXggNGM2NTk2My4uZjdkZmNlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9ob3N0LmgKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9ob3N0LmgKQEAgLTQ5LDMzICs0OSwzMiBAQAogKiogICAgSG9zdCBkYXRhIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VkIGZvciB0aGUgc29mdHdhcmUgZXF1aXYuIG9mCiAqKiAgICB0aGUgaG9zdC4KICovCi1zdHJ1Y3QgICAgSG9zdAotewotICAgIHVjaGFyICAgICAgICAgICAgIAkgICAgVHlwZTsgICAgICAvKiBSSU9fRUlTQSwgUklPX01DQSwgLi4uICovCi0gICAgdWNoYXIgICAgICAgICAgICAgCSAgICBJdmVjOyAgICAgIC8qIFBPTExFRCBvciBpdmVjIG51bWJlciAqLwotICAgIHVjaGFyICAgICAgICAgICAgIAkgICAgTW9kZTsgICAgICAvKiBDb250cm9sIHN0dWZmICovCi0gICAgdWNoYXIgICAgICAgICAgICAgICAgICAgU2xvdDsgICAgICAvKiBTbG90ICovCi0gICAgdm9sYXRpbGUgY2FkZHJfdCAgICAgICAgQ2FkZHI7ICAgICAvKiBLViBhZGRyZXNzIG9mIERQUkFNICovCi0gICAgdm9sYXRpbGUgc3RydWN0IERwUmFtICAqQ2FyZFA7ICAgICAvKiBLViBhZGRyZXNzIG9mIERQUkFNLCB3aXRoIG92ZXJsYXkgKi8KLSAgICBwYWRkcl90ICAgICAgICAgIAkgICAgUGFkZHJQOyAgICAvKiBQaHlzLiBhZGRyZXNzIG9mIERQUkFNICovCi0gICAgY2hhciAgICAgICAgICAgICAgICAgICAgTmFtZVtNQVhfTkFNRV9MRU5dOyAgLyogVGhlIG5hbWUgb2YgdGhlIGhvc3QgKi8KLSAgICB1aW50ICAgICAgICAgICAgCSAgICBVbmlxdWVOdW07IC8qIGhvc3QgdW5pcXVlIG51bWJlciAqLwotICAgIHNwaW5sb2NrX3QJICAgICAgICAgICAgSG9zdExvY2s7ICAvKiBMb2NrIHN0cnVjdHVyZSBmb3IgTVBYICovCi0gICAgLypzdHJ1Y3QgcGNpX2RldmluZm8gICAgUGNpRGV2SW5mbzsgKi8vKiBQQ0kgQnVzL0RldmljZS9GdW5jdGlvbiBzdHVmZiAqLwotICAgIC8qc3RydWN0IGxvY2tiCSAgICBIb3N0TG9jazsgICovLyogTG9jayBzdHJ1Y3R1cmUgZm9yIE1QWCAqLwotICAgIHVpbnQgICAgICAgICAgICAgICAgICAgIFdvcmtUb0JlRG9uZTsgLyogc2V0IHRvIHRydWUgZWFjaCBpbnRlcnJ1cHQgKi8KLSAgICB1aW50ICAgICAgICAgICAgICAgICAgICBJbkludHI7ICAgIC8qIEJlaW5nIHNlcnZpY2VkPyAqLwotICAgIHVpbnQgICAgICAgICAgICAgICAgICAgIEludFNydkRvbmU7LyogaG9zdCdzIGludGVycnVwdCBoYXMgYmVlbiBzZXJ2aWNlZCAqLwotICAgIGludAkJCSAgICAoKkNvcHkpKCBjYWRkcl90LCBjYWRkcl90LCBpbnQgKTsgLyogY29weSBmdW5jICovCi0gICAgc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7Ci0gICAgLyoKLSAgICAqKiAgICAgICAgICAgICAgIEkgTSBQIE8gUiBUIEEgTiBUICEKLSAgICAqKgotICAgICoqIFRoZSByZXN0IG9mIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgY2xlYXJlZCB0byB6ZXJvIGFmdGVyCi0gICAgKiogYSBSSU9fSE9TVF9GT0FEIGNvbW1hbmQuCi0gICAgKi8KLSAgICAKLSAgICB1bG9uZyAgICAgICAgICAgICAgICAgICBGbGFnczsgICAgIC8qIFdoYXRzIGdvaW5nIGRvd24gKi8KK3N0cnVjdCBIb3N0IHsKKwl1Y2hhciBUeXBlOwkJLyogUklPX0VJU0EsIFJJT19NQ0EsIC4uLiAqLworCXVjaGFyIEl2ZWM7CQkvKiBQT0xMRUQgb3IgaXZlYyBudW1iZXIgKi8KKwl1Y2hhciBNb2RlOwkJLyogQ29udHJvbCBzdHVmZiAqLworCXVjaGFyIFNsb3Q7CQkvKiBTbG90ICovCisJdm9sYXRpbGUgY2FkZHJfdCBDYWRkcjsJLyogS1YgYWRkcmVzcyBvZiBEUFJBTSAqLworCXZvbGF0aWxlIHN0cnVjdCBEcFJhbSAqQ2FyZFA7CS8qIEtWIGFkZHJlc3Mgb2YgRFBSQU0sIHdpdGggb3ZlcmxheSAqLworCXBhZGRyX3QgUGFkZHJQOwkJLyogUGh5cy4gYWRkcmVzcyBvZiBEUFJBTSAqLworCWNoYXIgTmFtZVtNQVhfTkFNRV9MRU5dOwkvKiBUaGUgbmFtZSBvZiB0aGUgaG9zdCAqLworCXVpbnQgVW5pcXVlTnVtOwkJLyogaG9zdCB1bmlxdWUgbnVtYmVyICovCisJc3BpbmxvY2tfdCBIb3N0TG9jazsJLyogTG9jayBzdHJ1Y3R1cmUgZm9yIE1QWCAqLworCS8qc3RydWN0IHBjaV9kZXZpbmZvICAgIFBjaURldkluZm87ICovLyogUENJIEJ1cy9EZXZpY2UvRnVuY3Rpb24gc3R1ZmYgKi8KKwkvKnN0cnVjdCBsb2NrYiAgICAgICAgICBIb3N0TG9jazsgICovLyogTG9jayBzdHJ1Y3R1cmUgZm9yIE1QWCAqLworCXVpbnQgV29ya1RvQmVEb25lOwkvKiBzZXQgdG8gdHJ1ZSBlYWNoIGludGVycnVwdCAqLworCXVpbnQgSW5JbnRyOwkJLyogQmVpbmcgc2VydmljZWQ/ICovCisJdWludCBJbnRTcnZEb25lOwkvKiBob3N0J3MgaW50ZXJydXB0IGhhcyBiZWVuIHNlcnZpY2VkICovCisJaW50ICgqQ29weSkgKGNhZGRyX3QsIGNhZGRyX3QsIGludCk7CS8qIGNvcHkgZnVuYyAqLworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCS8qCisJICoqICAgICAgICAgICAgICAgSSBNIFAgTyBSIFQgQSBOIFQgIQorCSAqKgorCSAqKiBUaGUgcmVzdCBvZiB0aGlzIGRhdGEgc3RydWN0dXJlIGlzIGNsZWFyZWQgdG8gemVybyBhZnRlcgorCSAqKiBhIFJJT19IT1NUX0ZPQUQgY29tbWFuZC4KKwkgKi8KKworCXVsb25nIEZsYWdzOwkJLyogV2hhdHMgZ29pbmcgZG93biAqLwogI2RlZmluZSBSQ19XQUlUSU5HICAgICAgICAgICAgMAogI2RlZmluZSBSQ19TVEFSVFVQICAgICAgICAgICAgMQogI2RlZmluZSBSQ19SVU5OSU5HICAgICAgICAgICAgMgpAQCAtOTMsMjUgKzkyLDI1IEBACiAjZGVmaW5lIFJDX0JPT1RfT1dOICAgICAgICAgICAweDEwCS8qIE9ubHkgYm9vdCBSVEFzIGJvdW5kIHRvIHRoaXMgc3lzdGVtICovCiAjZGVmaW5lIFJDX0JPT1RfTk9ORSAgICAgICAgICAweDIwCS8qIERvbid0IGJvb3QgYW55IFJUQXMgKHNsYXZlIG1vZGUpICovCiAKLSAgICBzdHJ1Y3QgVG9wCQkgICAgVG9wb2xvZ3lbTElOS1NfUEVSX1VOSVRdOyAvKiBvbmUgcGVyIGxpbmsgKi8KLSAgICBzdHJ1Y3QgTWFwICAgICAgICAgICAgICBNYXBwaW5nW01BWF9SVVBdOyAgICAgLyogTWFwcGluZ3MgZm9yIGhvc3QgKi8KLSAgICBzdHJ1Y3QgUEhCCQkgICAgKlBoYlA7ICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIFBIQiBhcnJheSAqLwotICAgIHVzaG9ydCAgICAgICAgICAgCSAgICAqUGhiTnVtUDsgICAgICAgICAgICAgLyogUHRyIHRvIE51bWJlciBvZiBQSEIncyAqLwotICAgIHN0cnVjdCBMUEIgCSAgICAgICAgICAgICpMaW5rU3RyUCA7ICAgICAgICAgICAvKiBMaW5rIFN0cnVjdHVyZSBBcnJheSAqLwotICAgIHN0cnVjdCBSVVAgICAgICAgCSAgICAqUnVwUDsgICAgICAgICAgICAgICAgLyogU2l4dGVlbiByZWFsIHJ1cHMgaGVyZSAqLwotICAgIHN0cnVjdCBQQVJNX01BUCAgCSAgICAqUGFybU1hcFA7ICAgICAgICAgICAgLyogcG9pbnRzIHRvIHRoZSBwYXJtbWFwICovCi0gICAgdWludCAgICAgICAgICAgICAgICAgICAgRXh0cmFVbml0c1tNQVhfRVhUUkFfVU5JVFNdOyAvKiB1bmtub3duIHRoaW5ncyAqLwotICAgIHVpbnQgICAgICAgICAgICAgICAgICAgIE51bUV4dHJhQm9vdGVkOyAgICAgICAvKiBob3cgbWFueSBvZiB0aGUgYWJvdmUgKi8KLSAgICAvKgotICAgICoqIFR3ZW50eSBsb2dpY2FsIHJ1cHMuCi0gICAgKiogVGhlIGZpcnN0IHNpeHRlZW4gYXJlIHRoZSByZWFsIFJ1cCBlbnRyaWVzIChhYm92ZSksIHRoZSBsYXN0IGZvdXIKLSAgICAqKiBhcmUgdGhlIGxpbmsgUlVQcy4KLSAgICAqLwotICAgIHN0cnVjdCBVbml4UnVwCSAgICBVbml4UnVwc1tNQVhfUlVQK0xJTktTX1BFUl9VTklUXTsKLQlpbnQJCQkJdGltZW91dF9pZDsJLyogRm9yIGNhbGxpbmcgMTAwIG1zIGRlbGF5cyAqLwotCWludAkJCQl0aW1lb3V0X3NlbTsvKiBGb3IgY2FsbGluZyAxMDAgbXMgZGVsYXlzICovCi0gICAgbG9uZyBsb2NrczsgLyogbG9uZyByZXEnZCBmb3Igc2V0X2JpdCAtLVJSICovCi0gICAgY2hhciAgICAgICAgICAgICAJICAgIF9fX19lbmRfbWFya2VyX19fXzsKKwlzdHJ1Y3QgVG9wIFRvcG9sb2d5W0xJTktTX1BFUl9VTklUXTsJLyogb25lIHBlciBsaW5rICovCisJc3RydWN0IE1hcCBNYXBwaW5nW01BWF9SVVBdOwkvKiBNYXBwaW5ncyBmb3IgaG9zdCAqLworCXN0cnVjdCBQSEIgKlBoYlA7CS8qIFBvaW50ZXIgdG8gdGhlIFBIQiBhcnJheSAqLworCXVzaG9ydCAqUGhiTnVtUDsJLyogUHRyIHRvIE51bWJlciBvZiBQSEIncyAqLworCXN0cnVjdCBMUEIgKkxpbmtTdHJQOwkvKiBMaW5rIFN0cnVjdHVyZSBBcnJheSAqLworCXN0cnVjdCBSVVAgKlJ1cFA7CS8qIFNpeHRlZW4gcmVhbCBydXBzIGhlcmUgKi8KKwlzdHJ1Y3QgUEFSTV9NQVAgKlBhcm1NYXBQOwkvKiBwb2ludHMgdG8gdGhlIHBhcm1tYXAgKi8KKwl1aW50IEV4dHJhVW5pdHNbTUFYX0VYVFJBX1VOSVRTXTsJLyogdW5rbm93biB0aGluZ3MgKi8KKwl1aW50IE51bUV4dHJhQm9vdGVkOwkvKiBob3cgbWFueSBvZiB0aGUgYWJvdmUgKi8KKwkvKgorCSAqKiBUd2VudHkgbG9naWNhbCBydXBzLgorCSAqKiBUaGUgZmlyc3Qgc2l4dGVlbiBhcmUgdGhlIHJlYWwgUnVwIGVudHJpZXMgKGFib3ZlKSwgdGhlIGxhc3QgZm91cgorCSAqKiBhcmUgdGhlIGxpbmsgUlVQcy4KKwkgKi8KKwlzdHJ1Y3QgVW5peFJ1cCBVbml4UnVwc1tNQVhfUlVQICsgTElOS1NfUEVSX1VOSVRdOworCWludCB0aW1lb3V0X2lkOwkJLyogRm9yIGNhbGxpbmcgMTAwIG1zIGRlbGF5cyAqLworCWludCB0aW1lb3V0X3NlbTsJLyogRm9yIGNhbGxpbmcgMTAwIG1zIGRlbGF5cyAqLworCWxvbmcgbG9ja3M7CQkvKiBsb25nIHJlcSdkIGZvciBzZXRfYml0IC0tUlIgKi8KKwljaGFyIF9fX19lbmRfbWFya2VyX19fXzsKIH07CiAjZGVmaW5lIENvbnRyb2wgICAgICBDYXJkUC0+RHBDb250cm9sCiAjZGVmaW5lIFNldEludCAgICAgICBDYXJkUC0+RHBTZXRJbnQKQEAgLTEyOSw2ICsxMjgsNiBAQAogI2RlZmluZSBZZWFyICAgICAgICAgQ2FyZFAtPkRwWWVhcgogI2RlZmluZSBXZWVrICAgICAgICAgQ2FyZFAtPkRwV2VlawogCi0jZGVmaW5lIFJJT19EVU1CUEFSTSAweDA4NjAgICAgLyogd2hhdCBub3QgdG8gZXhwZWN0ICovCisjZGVmaW5lIFJJT19EVU1CUEFSTSAweDA4NjAJLyogd2hhdCBub3QgdG8gZXhwZWN0ICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9ob3N0aHcuaCBiL2RyaXZlcnMvY2hhci9yaW8vaG9zdGh3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZjMxZWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9ob3N0aHcuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgotICoqKioqKiogICAgICAgICAgICAgICAgSCBPIFMgVCAgICAgIEggQSBSIEQgVyBBIFIgRQotICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBBdXRob3IgIDogSWFuIE5hbmRocmEgLyBKZXJlbXkgUm9sbHMKLSBEYXRlICAgIDoKLQotICoKLSAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KLSAqCi0gKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSBWZXJzaW9uIDogMC4wMQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIGxpbnQKLSNpZmRlZiBTQ0NTX0xBQkVMUwotc3RhdGljIGNoYXIgKl9yaW9faG9zdGh3X2hfc2NjcyA9ICJAKCMpaG9zdGh3LmgJMS4yIiA7Ci0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIFNFVF9PVEhFUl9JTlRFUlJVUFQgICggKHZvbGF0aWxlIHVfc2hvcnQgKikgMHg3YzgwICkKLSNkZWZpbmUgU0VUX0VJU0FfSU5URVJSVVBUICAoICh2b2xhdGlsZSB1X3Nob3J0ICopIDB4N2VmMCApCi0KLSNkZWZpbmUgRUlTQV9IT1NUICAgIDB4MzAKLSNkZWZpbmUgQVRfSE9TVCAgICAgIDB4YTAKLSNkZWZpbmUgTUNBX0hPU1QgICAgIDB4YjAKLSNkZWZpbmUgUENJX0hPU1QgICAgIDB4ZDAKLQotI2RlZmluZSBQUk9EVUNUX01BU0sgMHhmMAotCi0KLS8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2xpbmsuaCBiL2RyaXZlcnMvY2hhci9yaW8vbGluay5oCmluZGV4IDk3MjI1MDMuLmJmYmE1YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vbGluay5oCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vbGluay5oCkBAIC03MCwyNyArNzAsMjcgQEAKICNkZWZpbmUgIERJRV9OT1cJCSh1c2hvcnQpIDB4MDIwMAogCiAvKiBCb290IHJlcXVlc3Qgc3R1ZmYgKi8KLSNkZWZpbmUgQk9PVF9SRVFVRVNUICAgICAgICgodXNob3J0KSAwKSAgICAvKiBSZXF1ZXN0IGZvciBhIGJvb3QgKi8KLSNkZWZpbmUgQk9PVF9BQk9SVCAgICAgICAgICgodXNob3J0KSAxKSAgICAvKiBBYm9ydCBhIGJvb3QgKi8KLSNkZWZpbmUgQk9PVF9TRVFVRU5DRSAgICAgICgodXNob3J0KSAyKSAgICAvKiBQYWNrZXQgd2l0aCB0aGUgbnVtYmVyIG9mIHBhY2tldHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbG9hZCBhZGRyZXNzICovCi0jZGVmaW5lIEJPT1RfQ09NUExFVEVEICAgICAoKHVzaG9ydCkgMykgICAgLyogQm9vdCBjb21wbGV0ZWQgKi8KKyNkZWZpbmUgQk9PVF9SRVFVRVNUICAgICAgICgodXNob3J0KSAwKQkvKiBSZXF1ZXN0IGZvciBhIGJvb3QgKi8KKyNkZWZpbmUgQk9PVF9BQk9SVCAgICAgICAgICgodXNob3J0KSAxKQkvKiBBYm9ydCBhIGJvb3QgKi8KKyNkZWZpbmUgQk9PVF9TRVFVRU5DRSAgICAgICgodXNob3J0KSAyKQkvKiBQYWNrZXQgd2l0aCB0aGUgbnVtYmVyIG9mIHBhY2tldHMKKwkJCQkJICAgYW5kIGxvYWQgYWRkcmVzcyAqLworI2RlZmluZSBCT09UX0NPTVBMRVRFRCAgICAgKCh1c2hvcnQpIDMpCS8qIEJvb3QgY29tcGxldGVkICovCiAKIC8qIFN0YXRlcyB0aGF0IGEgbGluayBjYW4gYmUgaW4gKi8KLSNkZWZpbmUJTElOS19ESVNDT05ORUNURUQgICgodXNob3J0KSAwKSAgICAvKiBEaXNjb25uZWN0ZWQgKi8KLSNkZWZpbmUgTElOS19CT09UMSAgICAgICAgICgodXNob3J0KSAxKSAgICAvKiBUcnlpbmcgdG8gc2VuZCAxc3Qgc3RhZ2UgYm9vdCAqLwotI2RlZmluZSBMSU5LX0JPT1QyICAgICAgICAgKCh1c2hvcnQpIDIpICAgIC8qIFRyeWluZyB0byBzZW5kIDJuZCBzdGFnZSBib290ICovCi0jZGVmaW5lIExJTktfQk9PVDJXQUlUICAgICAoKHVzaG9ydCkgMykgICAgLyogV2FpdGluZyBmb3Igc2VsZnRlc3QgcmVzdWx0cyAqLwotI2RlZmluZSBMSU5LX0JPT1QzICAgICAgICAgKCh1c2hvcnQpIDQpICAgIC8qIFRyeWluZyB0byBzZW5kIDNyZCBzdGFnZSBib290cyAqLwotI2RlZmluZSBMSU5LX1NZTkMgICAgICAgICAgKCh1c2hvcnQpIDUpICAgIC8qIFN5bmNpbmcgKi8KKyNkZWZpbmUJTElOS19ESVNDT05ORUNURUQgICgodXNob3J0KSAwKQkvKiBEaXNjb25uZWN0ZWQgKi8KKyNkZWZpbmUgTElOS19CT09UMSAgICAgICAgICgodXNob3J0KSAxKQkvKiBUcnlpbmcgdG8gc2VuZCAxc3Qgc3RhZ2UgYm9vdCAqLworI2RlZmluZSBMSU5LX0JPT1QyICAgICAgICAgKCh1c2hvcnQpIDIpCS8qIFRyeWluZyB0byBzZW5kIDJuZCBzdGFnZSBib290ICovCisjZGVmaW5lIExJTktfQk9PVDJXQUlUICAgICAoKHVzaG9ydCkgMykJLyogV2FpdGluZyBmb3Igc2VsZnRlc3QgcmVzdWx0cyAqLworI2RlZmluZSBMSU5LX0JPT1QzICAgICAgICAgKCh1c2hvcnQpIDQpCS8qIFRyeWluZyB0byBzZW5kIDNyZCBzdGFnZSBib290cyAqLworI2RlZmluZSBMSU5LX1NZTkMgICAgICAgICAgKCh1c2hvcnQpIDUpCS8qIFN5bmNpbmcgKi8KIAotI2RlZmluZSBMSU5LX0lOVFJPICAgICAgICAgKCh1c2hvcnQpIDEwKSAgICAvKiBJbnRyb2R1Y3RvcnkgcGFja2V0ICovCi0jZGVmaW5lIExJTktfU1VQUExZSUQgICAgICAoKHVzaG9ydCkgMTEpICAgIC8qIFRyeWluZyB0byBzdXBwbHkgYW4gSUQgKi8KLSNkZWZpbmUgTElOS19UT1BPTE9HWSAgICAgICgodXNob3J0KSAxMikgICAgLyogU2VuZCBhIHRvcG9sb2d5IHVwZGF0ZSAqLwotI2RlZmluZSBMSU5LX1JFUVVFU1RJRCAgICAgKCh1c2hvcnQpIDEzKSAgICAvKiBXYWl0aW5nIGZvciBhbiBJRCAqLwotI2RlZmluZSBMSU5LX0NPTk5FQ1RFRCAgICAgKCh1c2hvcnQpIDE0KSAgICAvKiBDb25uZWN0ZWQgKi8KKyNkZWZpbmUgTElOS19JTlRSTyAgICAgICAgICgodXNob3J0KSAxMCkJLyogSW50cm9kdWN0b3J5IHBhY2tldCAqLworI2RlZmluZSBMSU5LX1NVUFBMWUlEICAgICAgKCh1c2hvcnQpIDExKQkvKiBUcnlpbmcgdG8gc3VwcGx5IGFuIElEICovCisjZGVmaW5lIExJTktfVE9QT0xPR1kgICAgICAoKHVzaG9ydCkgMTIpCS8qIFNlbmQgYSB0b3BvbG9neSB1cGRhdGUgKi8KKyNkZWZpbmUgTElOS19SRVFVRVNUSUQgICAgICgodXNob3J0KSAxMykJLyogV2FpdGluZyBmb3IgYW4gSUQgKi8KKyNkZWZpbmUgTElOS19DT05ORUNURUQgICAgICgodXNob3J0KSAxNCkJLyogQ29ubmVjdGVkICovCiAKLSNkZWZpbmUgTElOS19JTlRFUkNPTk5FQ1QgICgodXNob3J0KSAyMCkgICAvKiBTdWJuZXRzIGludGVyY29ubmVjdGVkICovCisjZGVmaW5lIExJTktfSU5URVJDT05ORUNUICAoKHVzaG9ydCkgMjApCS8qIFN1Ym5ldHMgaW50ZXJjb25uZWN0ZWQgKi8KIAogI2RlZmluZSBMSU5LX1NQQVJFCSAgICgodXNob3J0KSA0MCkKIApAQCAtMTAzLDEyICsxMDMsMTIgQEAKICoqIExFRCBzdHVmZgogKi8KICNpZiBkZWZpbmVkKFJUQSkKLSNkZWZpbmUgTEVEX09GRiAgICAgICAgICAgICgodXNob3J0KSAwKSAgICAvKiBMRUQgb2ZmICovCi0jZGVmaW5lIExFRF9SRUQgICAgICAgICAgICAoKHVzaG9ydCkgMSkgICAgLyogTEVEIFJlZCAqLwotI2RlZmluZSBMRURfR1JFRU4gICAgICAgICAgKCh1c2hvcnQpIDIpICAgIC8qIExFRCBHcmVlbiAqLwotI2RlZmluZSBMRURfT1JBTkdFICAgICAgICAgKCh1c2hvcnQpIDQpICAgIC8qIExFRCBPcmFuZ2UgKi8KLSNkZWZpbmUgTEVEXzFUTzhfT1BFTiAgICAgICgodXNob3J0KSAxKSAgICAvKiBQb3J0IDEtPjggTEVEIG9uICovCi0jZGVmaW5lIExFRF85VE8xNl9PUEVOICAgICAoKHVzaG9ydCkgMikgICAgLyogUG9ydCA5LT4xNiBMRUQgb24gKi8KKyNkZWZpbmUgTEVEX09GRiAgICAgICAgICAgICgodXNob3J0KSAwKQkvKiBMRUQgb2ZmICovCisjZGVmaW5lIExFRF9SRUQgICAgICAgICAgICAoKHVzaG9ydCkgMSkJLyogTEVEIFJlZCAqLworI2RlZmluZSBMRURfR1JFRU4gICAgICAgICAgKCh1c2hvcnQpIDIpCS8qIExFRCBHcmVlbiAqLworI2RlZmluZSBMRURfT1JBTkdFICAgICAgICAgKCh1c2hvcnQpIDQpCS8qIExFRCBPcmFuZ2UgKi8KKyNkZWZpbmUgTEVEXzFUTzhfT1BFTiAgICAgICgodXNob3J0KSAxKQkvKiBQb3J0IDEtPjggTEVEIG9uICovCisjZGVmaW5lIExFRF85VE8xNl9PUEVOICAgICAoKHVzaG9ydCkgMikJLyogUG9ydCA5LT4xNiBMRUQgb24gKi8KICNkZWZpbmUgTEVEX1NFVF9DT0xPVVIoY29sb3VyKQkobGluay0+bGVkID0gKGNvbG91cikpCiAjZGVmaW5lIExFRF9PUl9DT0xPVVIoY29sb3VyKQkobGluay0+bGVkIHw9IChjb2xvdXIpKQogI2RlZmluZSBMRURfVElNRU9VVCh0aW1lKSAgICAobGluay0+bGVkX3RpbWVvdXQgPSBSaW9UaW1lUGx1cyhSaW9UaW1lKCksKHRpbWUpKSkKQEAgLTExNiw3MiArMTE2LDcyIEBACiAjZGVmaW5lIExFRF9TRVRfQ09MT1VSKGNvbG91cikKICNkZWZpbmUgTEVEX09SX0NPTE9VUihjb2xvdXIpCiAjZGVmaW5lIExFRF9USU1FT1VUKHRpbWUpCi0jZW5kaWYgLyogUlRBICovCisjZW5kaWYJCQkJLyogUlRBICovCiAKIHN0cnVjdCBMUEIgewotICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBsaW5rX251bWJlciA7ICAgICAgIC8qIExpbmsgTnVtYmVyICovCi0gICAgICAgICAgICAgICBDaGFubmVsX3B0ciAgIGluX2NoIDsgICAgICAgICAgICAgLyogTGluayBJbiBDaGFubmVsICovCi0gICAgICAgICAgICAgICBDaGFubmVsX3B0ciAgIG91dF9jaCA7ICAgICAgICAgICAgLyogTGluayBPdXQgQ2hhbm5lbCAqLworCVdPUkQgbGlua19udW1iZXI7CS8qIExpbmsgTnVtYmVyICovCisJQ2hhbm5lbF9wdHIgaW5fY2g7CS8qIExpbmsgSW4gQ2hhbm5lbCAqLworCUNoYW5uZWxfcHRyIG91dF9jaDsJLyogTGluayBPdXQgQ2hhbm5lbCAqLwogI2lmZGVmIFJUQQotICAgICAgICAgICAgICAgdWNoYXIgICAgICAgIHN0YXRfbGVkIDsgICAgICAgICAgLyogUG9ydCBvcGVuIGxlZHMgKi8KLSAgICAgICAgICAgICAgIHVjaGFyICAgICAgICBsZWQgOyAgICAgICAgICAgICAgIC8qIFRydWUsIGxpZ2h0IGxlZCEgKi8KKwl1Y2hhciBzdGF0X2xlZDsJCS8qIFBvcnQgb3BlbiBsZWRzICovCisJdWNoYXIgbGVkOwkJLyogVHJ1ZSwgbGlnaHQgbGVkISAqLwogI2VuZGlmCi0gICAgICAgICAgICAgICBCWVRFIGF0dGFjaGVkX3NlcmlhbFs0XTsgLyogQXR0YWNoZWQgc2VyaWFsIG51bWJlciAqLwotICAgICAgICAgICAgICAgQllURSBhdHRhY2hlZF9ob3N0X3NlcmlhbFs0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXJpYWwgbnVtYmVyIG9mIEhvc3Qgd2hvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdGVkIHRoZSBvdGhlciBlbmQgKi8KLSAgICAgICAgICAgICAgIFdPUkQgICAgICAgICAgZGVzY2hlZHVsZWQgOyAgICAgICAvKiBDdXJyZW50bHkgRGVzY2hlZHVsZWQgKi8KLSAgICAgICAgICAgICAgIFdPUkQgICAgICAgICAgc3RhdGU7ICAgICAgICAgICAgICAvKiBDdXJyZW50IHN0YXRlICovCi0gICAgICAgICAgICAgICBXT1JEICAgICAgICAgIHNlbmRfcG9sbCA7ICAgICAgICAgLyogU2VuZCBhIFBvbGwgUGFja2V0ICovCi0gICAgICAgICAgICAgICBQcm9jZXNzX3B0ciAgIGx0dF9wIDsgICAgICAgICAgICAgLyogUHJvY2VzcyBEZXNjcmlwdG9yICovCi0gICAgICAgICAgICAgICBQcm9jZXNzX3B0ciAgIGxydF9wIDsgICAgICAgICAgICAgLyogUHJvY2VzcyBEZXNjcmlwdG9yICovCi0gICAgICAgICAgICAgICBXT1JEICAgICAgICAgIGxydF9zdGF0dXMgOyAgICAgICAgLyogQ3VycmVudCBscnQgc3RhdHVzICovCi0gICAgICAgICAgICAgICBXT1JEICAgICAgICAgIGx0dF9zdGF0dXMgOyAgICAgICAgLyogQ3VycmVudCBsdHQgc3RhdHVzICovCi0gICAgICAgICAgICAgICBXT1JEICAgICAgICAgIHRpbWVvdXQgOyAgICAgICAgICAgLyogVGltZW91dCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgV09SRCAgICAgICAgICB0b3BvbG9neTsgICAgICAgICAgIC8qIFRvcG9sb2d5IGJpdHMgKi8KLSAgICAgICAgICAgICAgIFdPUkQgICAgICAgICAgbW9uX2x0dCA7Ci0gICAgICAgICAgICAgICBXT1JEICAgICAgICAgIG1vbl9scnQgOwotICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBXYWl0Tm9Cb290IDsJIC8qIFNlY3MgdG8gaG9sZCBvZmYgYm9vdGluZyAqLwotICAgICAgICAgICAgICAgUEtUX3B0ciAgICAgICBhZGRfcGFja2V0X2xpc3Q7ICAgIC8qIEFkZCBwYWNrZXRzIHRvIGhlcmUgKi8KLSAgICAgICAgICAgICAgIFBLVF9wdHIgICAgICAgcmVtb3ZlX3BhY2tldF9saXN0OyAvKiBTZW5kIHBhY2tldHMgZnJvbSBoZXJlICovCisJQllURSBhdHRhY2hlZF9zZXJpYWxbNF07CS8qIEF0dGFjaGVkIHNlcmlhbCBudW1iZXIgKi8KKwlCWVRFIGF0dGFjaGVkX2hvc3Rfc2VyaWFsWzRdOworCS8qIFNlcmlhbCBudW1iZXIgb2YgSG9zdCB3aG8KKwkgICBib290ZWQgdGhlIG90aGVyIGVuZCAqLworCVdPUkQgZGVzY2hlZHVsZWQ7CS8qIEN1cnJlbnRseSBEZXNjaGVkdWxlZCAqLworCVdPUkQgc3RhdGU7CQkvKiBDdXJyZW50IHN0YXRlICovCisJV09SRCBzZW5kX3BvbGw7CQkvKiBTZW5kIGEgUG9sbCBQYWNrZXQgKi8KKwlQcm9jZXNzX3B0ciBsdHRfcDsJLyogUHJvY2VzcyBEZXNjcmlwdG9yICovCisJUHJvY2Vzc19wdHIgbHJ0X3A7CS8qIFByb2Nlc3MgRGVzY3JpcHRvciAqLworCVdPUkQgbHJ0X3N0YXR1czsJLyogQ3VycmVudCBscnQgc3RhdHVzICovCisJV09SRCBsdHRfc3RhdHVzOwkvKiBDdXJyZW50IGx0dCBzdGF0dXMgKi8KKwlXT1JEIHRpbWVvdXQ7CQkvKiBUaW1lb3V0IHZhbHVlICovCisJV09SRCB0b3BvbG9neTsJCS8qIFRvcG9sb2d5IGJpdHMgKi8KKwlXT1JEIG1vbl9sdHQ7CisJV09SRCBtb25fbHJ0OworCVdPUkQgV2FpdE5vQm9vdDsJLyogU2VjcyB0byBob2xkIG9mZiBib290aW5nICovCisJUEtUX3B0ciBhZGRfcGFja2V0X2xpc3Q7CS8qIEFkZCBwYWNrZXRzIHRvIGhlcmUgKi8KKwlQS1RfcHRyIHJlbW92ZV9wYWNrZXRfbGlzdDsJLyogU2VuZCBwYWNrZXRzIGZyb20gaGVyZSAqLwogI2lmZGVmIFJUQQogI2lmZGVmIERDSVJSVVMKLSNkZWZpbmUgICAgUUJVRlNfUEVSX1JFRElSRUNUICg0IC8gUEtUU19QRVJfQlVGRkVSICsgMSkgCisjZGVmaW5lICAgIFFCVUZTX1BFUl9SRURJUkVDVCAoNCAvIFBLVFNfUEVSX0JVRkZFUiArIDEpCiAjZWxzZQotI2RlZmluZSAgICBRQlVGU19QRVJfUkVESVJFQ1QgKDggLyBQS1RTX1BFUl9CVUZGRVIgKyAxKSAKKyNkZWZpbmUgICAgUUJVRlNfUEVSX1JFRElSRUNUICg4IC8gUEtUU19QRVJfQlVGRkVSICsgMSkKICNlbmRpZgotICAgICAgICAgICAgICAgUEtUX3B0cl9wdHIgICByZF9hZGQgOyAgICAgICAgICAgIC8qIEFkZCBhIG5ldyBQYWNrZXQgaGVyZSAqLwotICAgICAgICAgICAgICAgUV9CVUZfcHRyICAgICByZF9hZGRfcWI7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGFkZCBRIGJ1ZiAqLwotICAgICAgICAgICAgICAgUEtUX3B0cl9wdHIgICByZF9hZGRfc3RfcWJiIDsgICAgIC8qIFBvaW50ZXIgdG8gc3RhcnQgb2YgdGhlIFEncyBidWYgKi8KLSAgICAgICAgICAgICAgIFBLVF9wdHJfcHRyICAgcmRfYWRkX2VuZF9xYmIgOyAgICAvKiBQb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIFEncyBidWYgKi8KLSAgICAgICAgICAgICAgIFBLVF9wdHJfcHRyICAgcmRfcmVtb3ZlIDsgICAgICAgICAvKiBSZW1vdmUgYSBQYWNrZXQgaGVyZSAqLwotICAgICAgICAgICAgICAgUV9CVUZfcHRyICAgICByZF9yZW1vdmVfcWIgOyAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHJlbW92ZSBRIGJ1ZiAqLwotICAgICAgICAgICAgICAgUEtUX3B0cl9wdHIgICByZF9yZW1vdmVfc3RfcWJiIDsgIC8qIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBRIGJ1ZiAqLwotICAgICAgICAgICAgICAgUEtUX3B0cl9wdHIgICByZF9yZW1vdmVfZW5kX3FiYiA7IC8qIFBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgUSBidWYgKi8KLSAgICAgICAgICAgICAgIHVzaG9ydCAgICAgICAgcGt0c19pbl9xIDsgICAgICAgICAvKiBQYWNrZXRzIGluIHF1ZXVlICovCisJUEtUX3B0cl9wdHIgcmRfYWRkOwkvKiBBZGQgYSBuZXcgUGFja2V0IGhlcmUgKi8KKwlRX0JVRl9wdHIgcmRfYWRkX3FiOwkvKiBQb2ludGVyIHRvIHRoZSBhZGQgUSBidWYgKi8KKwlQS1RfcHRyX3B0ciByZF9hZGRfc3RfcWJiOwkvKiBQb2ludGVyIHRvIHN0YXJ0IG9mIHRoZSBRJ3MgYnVmICovCisJUEtUX3B0cl9wdHIgcmRfYWRkX2VuZF9xYmI7CS8qIFBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgUSdzIGJ1ZiAqLworCVBLVF9wdHJfcHRyIHJkX3JlbW92ZTsJLyogUmVtb3ZlIGEgUGFja2V0IGhlcmUgKi8KKwlRX0JVRl9wdHIgcmRfcmVtb3ZlX3FiOwkvKiBQb2ludGVyIHRvIHRoZSByZW1vdmUgUSBidWYgKi8KKwlQS1RfcHRyX3B0ciByZF9yZW1vdmVfc3RfcWJiOwkvKiBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgUSBidWYgKi8KKwlQS1RfcHRyX3B0ciByZF9yZW1vdmVfZW5kX3FiYjsJLyogUG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBRIGJ1ZiAqLworCXVzaG9ydCBwa3RzX2luX3E7CS8qIFBhY2tldHMgaW4gcXVldWUgKi8KICNlbmRpZgogCi0gICAgICAgICAgICAgICBDaGFubmVsX3B0ciAgIGxydF9mYWlsX2NoYW4gOyAgICAgLyogTHJ0J3MgZmFpbHVyZSBjaGFubmVsICovCi0gICAgICAgICAgICAgICBDaGFubmVsX3B0ciAgIGx0dF9mYWlsX2NoYW4gOyAgICAgLyogTHR0J3MgZmFpbHVyZSBjaGFubmVsICovCisJQ2hhbm5lbF9wdHIgbHJ0X2ZhaWxfY2hhbjsJLyogTHJ0J3MgZmFpbHVyZSBjaGFubmVsICovCisJQ2hhbm5lbF9wdHIgbHR0X2ZhaWxfY2hhbjsJLyogTHR0J3MgZmFpbHVyZSBjaGFubmVsICovCiAKICNpZiBkZWZpbmVkIChIT1NUKSB8fCBkZWZpbmVkIChJTktFUk5FTCkKLSAvKiBSVVAgc3RydWN0dXJlIGZvciBIT1NUIHRvIGRyaXZlciBjb21tdW5pY2F0aW9ucyAqLwotICAgICAgICAgICAgICAgc3RydWN0IFJVUCAgICAgICAgICAgcnVwIDsgICAgICAgICAgICAgIAorCS8qIFJVUCBzdHJ1Y3R1cmUgZm9yIEhPU1QgdG8gZHJpdmVyIGNvbW11bmljYXRpb25zICovCisJc3RydWN0IFJVUCBydXA7CiAjZW5kaWYKLSAgICAgICAgICAgICAgIHN0cnVjdCBSVVAgICAgICAgICAgIGxpbmtfcnVwOyAgICAgICAgICAgLyogUlVQIGZvciB0aGUgbGluayAoUE9MTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BvbG9neSBldGMuKSAqLwotICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBhdHRhY2hlZF9saW5rIDsgICAgIC8qIE51bWJlciBvZiBhdHRhY2hlZCBsaW5rICovCi0gICAgICAgICAgICAgICBXT1JEICAgICAgICAgIGNzdW1fZXJyb3JzIDsgICAgICAgLyogY3N1bSBlcnJvcnMgKi8KLSAgICAgICAgICAgICAgIFdPUkQgICAgICAgICAgbnVtX2Rpc2Nvbm5lY3RzIDsgICAvKiBudW1iZXIgb2YgZGlzY29ubmVjdHMgKi8KLSAgICAgICAgICAgICAgIFdPUkQgICAgICAgICAgbnVtX3N5bmNfcmN2ZCA7ICAgICAvKiAjIHN5bmMncyByZWNlaXZlZCAqLwotICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBudW1fc3luY19ycXN0IDsgICAgIC8qICMgc3luYyByZXF1ZXN0cyAqLwotICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBudW1fdHggOyAgICAgICAgICAgIC8qIE51bSBwa3RzIHNlbnQgKi8KLSAgICAgICAgICAgICAgIFdPUkQgICAgICAgICAgbnVtX3J4IDsgICAgICAgICAgICAvKiBOdW0gcGt0cyByZWNlaXZlZCAqLwotICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBtb2R1bGVfYXR0YWNoZWQ7ICAgIC8qIE1vZHVsZSB0cHllcyBvZiBhdHRhY2hlZCAqLwotICAgICAgICAgICAgICAgV09SRCAgICAgICAgICBsZWRfdGltZW91dDsgICAgICAgIC8qIExFRCB0aW1lb3V0ICovCi0gICAgICAgICAgICAgICBXT1JEICAgICAgICAgIGZpcnN0X3BvcnQ7ICAgICAgICAgLyogRmlyc3QgcG9ydCB0byBzZXJ2aWNlICovCi0gICAgICAgICAgICAgICBXT1JEICAgICAgICAgIGxhc3RfcG9ydDsgICAgICAgICAgLyogTGFzdCBwb3J0IHRvIHNlcnZpY2UgKi8KLSAgICAgICAgICAgfSA7CisJc3RydWN0IFJVUCBsaW5rX3J1cDsJLyogUlVQIGZvciB0aGUgbGluayAoUE9MTCwKKwkJCQkgICB0b3BvbG9neSBldGMuKSAqLworCVdPUkQgYXR0YWNoZWRfbGluazsJLyogTnVtYmVyIG9mIGF0dGFjaGVkIGxpbmsgKi8KKwlXT1JEIGNzdW1fZXJyb3JzOwkvKiBjc3VtIGVycm9ycyAqLworCVdPUkQgbnVtX2Rpc2Nvbm5lY3RzOwkvKiBudW1iZXIgb2YgZGlzY29ubmVjdHMgKi8KKwlXT1JEIG51bV9zeW5jX3JjdmQ7CS8qICMgc3luYydzIHJlY2VpdmVkICovCisJV09SRCBudW1fc3luY19ycXN0OwkvKiAjIHN5bmMgcmVxdWVzdHMgKi8KKwlXT1JEIG51bV90eDsJCS8qIE51bSBwa3RzIHNlbnQgKi8KKwlXT1JEIG51bV9yeDsJCS8qIE51bSBwa3RzIHJlY2VpdmVkICovCisJV09SRCBtb2R1bGVfYXR0YWNoZWQ7CS8qIE1vZHVsZSB0cHllcyBvZiBhdHRhY2hlZCAqLworCVdPUkQgbGVkX3RpbWVvdXQ7CS8qIExFRCB0aW1lb3V0ICovCisJV09SRCBmaXJzdF9wb3J0OwkvKiBGaXJzdCBwb3J0IHRvIHNlcnZpY2UgKi8KKwlXT1JEIGxhc3RfcG9ydDsJCS8qIExhc3QgcG9ydCB0byBzZXJ2aWNlICovCit9OwogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9saW51eF9jb21wYXQuaCBiL2RyaXZlcnMvY2hhci9yaW8vbGludXhfY29tcGF0LmgKaW5kZXggZDUzODQzYS4uMTdhMTRjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9saW51eF9jb21wYXQuaAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2xpbnV4X2NvbXBhdC5oCkBAIC00MSw3ICs0MSw3IEBACiAjZW5kaWYKIAogc3RydWN0IHR0eXN0YXRpY3MgewotICBzdHJ1Y3QgdGVybWlvcyB0bTsKKwlzdHJ1Y3QgdGVybWlvcyB0bTsKIH07CiAKICNkZWZpbmUgYnplcm8oZCwgbikgICAgICAgICBtZW1zZXQoKGQpLCAwLCAobikpCkBAIC05NywyNiArOTcsMjQgQEAKIHRoZSBkZWZpbml0aW9ucyBmcm9tIExpbnV4LCBhbmQgaXMgaW5jb21wYXRpYmxlLi4uICovCiAKIC8qIFJ4QmF1ZCBhbmQgVHhCYXVkIGRlZmluaXRpb25zLi4uICovCi0jZGVmaW5lCVJJT19CMAkJCTB4MDAJCQkvKiBSVFMgLyBEVFIgc2lnbmFscyBkcm9wcGVkICovCi0jZGVmaW5lCVJJT19CNTAJCQkweDAxCQkJLyogNTAgYmF1ZCAqLwotI2RlZmluZQlSSU9fQjc1CQkJMHgwMgkJCS8qIDc1IGJhdWQgKi8KLSNkZWZpbmUJUklPX0IxMTAJCTB4MDMJCQkvKiAxMTAgYmF1ZCAqLwotI2RlZmluZQlSSU9fQjEzNAkJMHgwNAkJCS8qIDEzNC41IGJhdWQgKi8KLSNkZWZpbmUJUklPX0IxNTAJCTB4MDUJCQkvKiAxNTAgYmF1ZCAqLwotI2RlZmluZQlSSU9fQjIwMAkJMHgwNgkJCS8qIDIwMCBiYXVkICovCi0jZGVmaW5lCVJJT19CMzAwCQkweDA3CQkJLyogMzAwIGJhdWQgKi8KLSNkZWZpbmUJUklPX0I2MDAJCTB4MDgJCQkvKiA2MDAgYmF1ZCAqLwotI2RlZmluZQlSSU9fQjEyMDAJCTB4MDkJCQkvKiAxMjAwIGJhdWQgKi8KLSNkZWZpbmUJUklPX0IxODAwCQkweDBBCQkJLyogMTgwMCBiYXVkICovCi0jZGVmaW5lCVJJT19CMjQwMAkJMHgwQgkJCS8qIDI0MDAgYmF1ZCAqLwotI2RlZmluZQlSSU9fQjQ4MDAJCTB4MEMJCQkvKiA0ODAwIGJhdWQgKi8KLSNkZWZpbmUJUklPX0I5NjAwCQkweDBECQkJLyogOTYwMCBiYXVkICovCi0jZGVmaW5lCVJJT19CMTkyMDAJCTB4MEUJCQkvKiAxOTIwMCBiYXVkICovCi0jZGVmaW5lCVJJT19CMzg0MDAJCTB4MEYJCQkvKiAzODQwMCBiYXVkICovCi0jZGVmaW5lCVJJT19CNTYwMDAJCTB4MTAJCQkvKiA1NjAwMCBiYXVkICovCi0jZGVmaW5lCVJJT19CNTc2MDAJCTB4MTEJCQkvKiA1NzYwMCBiYXVkICovCi0jZGVmaW5lCVJJT19CNjQwMDAJCTB4MTIJCQkvKiA2NDAwMCBiYXVkICovCi0jZGVmaW5lCVJJT19CMTE1MjAwCQkweDEzCQkJLyogMTE1MjAwIGJhdWQgKi8KLSNkZWZpbmUJUklPX0IyMDAwCQkweDE0CQkJLyogMjAwMCBiYXVkICovCi0KLQorI2RlZmluZQlSSU9fQjAJCQkweDAwCS8qIFJUUyAvIERUUiBzaWduYWxzIGRyb3BwZWQgKi8KKyNkZWZpbmUJUklPX0I1MAkJCTB4MDEJLyogNTAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjc1CQkJMHgwMgkvKiA3NSBiYXVkICovCisjZGVmaW5lCVJJT19CMTEwCQkweDAzCS8qIDExMCBiYXVkICovCisjZGVmaW5lCVJJT19CMTM0CQkweDA0CS8qIDEzNC41IGJhdWQgKi8KKyNkZWZpbmUJUklPX0IxNTAJCTB4MDUJLyogMTUwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0IyMDAJCTB4MDYJLyogMjAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0IzMDAJCTB4MDcJLyogMzAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0I2MDAJCTB4MDgJLyogNjAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0IxMjAwCQkweDA5CS8qIDEyMDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjE4MDAJCTB4MEEJLyogMTgwMCBiYXVkICovCisjZGVmaW5lCVJJT19CMjQwMAkJMHgwQgkvKiAyNDAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0I0ODAwCQkweDBDCS8qIDQ4MDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjk2MDAJCTB4MEQJLyogOTYwMCBiYXVkICovCisjZGVmaW5lCVJJT19CMTkyMDAJCTB4MEUJLyogMTkyMDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjM4NDAwCQkweDBGCS8qIDM4NDAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0I1NjAwMAkJMHgxMAkvKiA1NjAwMCBiYXVkICovCisjZGVmaW5lCVJJT19CNTc2MDAJCTB4MTEJLyogNTc2MDAgYmF1ZCAqLworI2RlZmluZQlSSU9fQjY0MDAwCQkweDEyCS8qIDY0MDAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0IxMTUyMDAJCTB4MTMJLyogMTE1MjAwIGJhdWQgKi8KKyNkZWZpbmUJUklPX0IyMDAwCQkweDE0CS8qIDIwMDAgYmF1ZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9saXN0LmggYi9kcml2ZXJzL2NoYXIvcmlvL2xpc3QuaAppbmRleCBhNGY3ZjFmLi4zNmFhZDRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL2xpc3QuaAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL2xpc3QuaApAQCAtMzgsNyArMzgsNyBAQAogCiAjaWZkZWYgU0NDU19MQUJFTFMKICNpZm5kZWYgbGludAotc3RhdGljIGNoYXIgKl9yaW9fbGlzdF9oX3NjY3MgPSAiQCgjKWxpc3QuaAkxLjkiIDsKK3N0YXRpYyBjaGFyICpfcmlvX2xpc3RfaF9zY2NzID0gIkAoIylsaXN0LmgJMS45IjsKICNlbmRpZgogI2VuZGlmCiAKQEAgLTE2Niw3ICsxNjYsNyBAQAogI2VuZGlmCiAKIAotI2Vsc2UgLyogIUlOX0tFUk5FTCAqLworI2Vsc2UJCQkJLyogIUlOX0tFUk5FTCAqLwogCiAjZGVmaW5lIFpFUk9fUFRSIE5VTEwKIApAQCAtMTkyLDUgKzE5Miw1IEBACiAjZGVmaW5lIHNwbHgob2xkc3BsKSAgICBpZiAoKG9sZHNwbCkgPT0gMCkgc3BsMCgpCiAjZW5kaWYKIAotI2VuZGlmIC8qIGlmbmRlZiBfbGlzdC5oICovCisjZW5kaWYJCQkJLyogaWZuZGVmIF9saXN0LmggKi8KIC8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vbHJ0LmggYi9kcml2ZXJzL2NoYXIvcmlvL2xydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmFjOGZhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9yaW8vbHJ0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKLSAqKioqKioqICAgICAgICAgICAgICAgICAgICAgIEwgUiBUCi0gKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIEF1dGhvciAgOiBJYW4gTmFuZGhyYSAvIEplcmVteSBSb2xscwotIERhdGUgICAgOgotCi0gKgotICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotIFZlcnNpb24gOiAwLjAxCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIGxpbnQKLSNpZmRlZiBTQ0NTX0xBQkVMUwotc3RhdGljIGNoYXIgKl9yaW9fbHJ0X2hfc2NjcyA9ICJAKCMpbHJ0LmgJMS4xIiA7Ci0jZW5kaWYKLSNlbmRpZgotCi0KLSNpZmRlZiBEQ0lSUlVTCi0jZGVmaW5lIExSVF9TVEFDSyAgICAgICAodW5zaWduZWQgc2hvcnQpIDYwMAotI2Vsc2UKLSNkZWZpbmUgTFJUX1NUQUNLICAgICAgICAodXNob3J0KSAyMDAKLSNlbmRpZgotCi0KLQotLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLwotCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9sdHQuaCBiL2RyaXZlcnMvY2hhci9yaW8vbHR0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyN2RjZWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9sdHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgotICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgTCBUIFQKLSAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gQXV0aG9yICA6IElhbiBOYW5kaHJhIC8gSmVyZW15IFJvbGxzCi0gRGF0ZSAgICA6Ci0KLSAqCi0gKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCi0gKgotICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gVmVyc2lvbiA6IDAuMDEKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcwotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgbGludAotI2lmZGVmIFNDQ1NfTEFCRUxTCi1zdGF0aWMgY2hhciAqX3Jpb19sdHRfaF9zY2NzID0gIkAoIylsdHQuaAkxLjEiIDsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBEQ0lSUlVTCi0jZGVmaW5lIExUVF9TVEFDSyAgICAgICAodW5zaWduZWQgc2hvcnQpICA2MDAKLSNlbHNlCi0jZGVmaW5lIExUVF9TVEFDSyAgICAgICAodXNob3J0KSAyMDAKLSNlbmRpZgotIAotCi0KLQotLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLwotCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9sdHR3YWtlLmggYi9kcml2ZXJzL2NoYXIvcmlvL2x0dHdha2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUxN2QwZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL2x0dHdha2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgotICoqKioqKiogICAgICAgICAgICBMIFQgVCAgICBXIEEgSyBFIFUgUCAgICBIIEUgQSBEIEUgUgotICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBBdXRob3IgIDogSWFuIE5hbmRocmEKLSBEYXRlICAgIDoKLQotICoKLSAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KLSAqCi0gKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSBWZXJzaW9uIDogMC4wMQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBsaW50Ci0jaWZkZWYgU0NDU19MQUJFTFMKLXN0YXRpYyBjaGFyICpfcmlvX2x0dHdha2VfaF9zY2NzID0gIkAoIylsdHR3YWtlLmgJMS4xIiA7Ci0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIExUVF9XQUtFVVBfU1RBQ0sgICAgICAgICAgNTAwCi0jZGVmaW5lIExUVF9XQUtFVVBfSU5URVJWQUwgICAgICAgKGludCkgKDUwMCAqIE1JTExJU0VDT05EKQotCi0KLS8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KLQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vbWFwLmggYi9kcml2ZXJzL2NoYXIvcmlvL21hcC5oCmluZGV4IDQwMDY0NWExLi45N2ZlMjg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL21hcC5oCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vbWFwLmgKQEAgLTQ2LDIxICs0NiwyMCBAQAogI2RlZmluZQlUT1RBTF9NQVBfRU5UUklFUyAoTUFYX01BUF9FTlRSWSpSSU9fU0xPVFMpCiAjZGVmaW5lCU1BWF9OQU1FX0xFTiAzMgogCi1zdHJ1Y3QgTWFwCi17Ci0JdWludAlIb3N0VW5pcXVlTnVtOwkgICAgICAgIC8qIFN1cHBvcnRpbmcgaG9zdHMgdW5pcXVlIG51bWJlciAqLwotCXVpbnQJUnRhVW5pcXVlTnVtOwkgICAgICAgIC8qIFVuaXF1ZSBudW1iZXIgKi8KK3N0cnVjdCBNYXAgeworCXVpbnQgSG9zdFVuaXF1ZU51bTsJLyogU3VwcG9ydGluZyBob3N0cyB1bmlxdWUgbnVtYmVyICovCisJdWludCBSdGFVbmlxdWVOdW07CS8qIFVuaXF1ZSBudW1iZXIgKi8KIAkvKgotCSoqIFRoZSBuZXh0IHR3byBJRHMgbXVzdCBiZSBzd2FwcGVkIG9uIGJpZy1lbmRpYW4gYXJjaGl0ZWN0dXJlcwotCSoqIHdoZW4gdXNpbmcgYSB2Mi4wNCAvZXRjL3Jpby9jb25maWcgd2l0aCBhIHYzLjAwIGRyaXZlciAod2hlbgotCSoqIHVwZ3JhZGluZyBmb3IgZXhhbXBsZSkuCi0JKi8KLQl1c2hvcnQJSUQ7CQkJLyogSUQgdXNlZCBpbiB0aGUgc3VibmV0ICovCi0JdXNob3J0CUlEMjsJCQkvKiBJRCBvZiAybmQgYmxvY2sgb2YgOCBmb3IgMTYgcG9ydCAqLwotCXVsb25nCUZsYWdzOwkJCS8qIEJvb3RlZCwgSUQgR2l2ZW4sIERpc2Nvbm5lY3RlZCAqLwotCXVsb25nCVN5c1BvcnQ7CQkvKiBGaXJzdCB0dHkgbWFwcGVkIHRvIHRoaXMgcG9ydCAqLwotCXN0cnVjdCBUb3AgICBUb3BvbG9neVtMSU5LU19QRVJfVU5JVF07CS8qIElEIGNvbm5lY3RlZCB0byBlYWNoIGxpbmsgKi8KLQljaGFyCU5hbWVbTUFYX05BTUVfTEVOXTsgICAgICAgIC8qIEN1dGUgbmFtZSBieSB3aGljaCBSVEEgaXMga25vd24gKi8KKwkgKiogVGhlIG5leHQgdHdvIElEcyBtdXN0IGJlIHN3YXBwZWQgb24gYmlnLWVuZGlhbiBhcmNoaXRlY3R1cmVzCisJICoqIHdoZW4gdXNpbmcgYSB2Mi4wNCAvZXRjL3Jpby9jb25maWcgd2l0aCBhIHYzLjAwIGRyaXZlciAod2hlbgorCSAqKiB1cGdyYWRpbmcgZm9yIGV4YW1wbGUpLgorCSAqLworCXVzaG9ydCBJRDsJCS8qIElEIHVzZWQgaW4gdGhlIHN1Ym5ldCAqLworCXVzaG9ydCBJRDI7CQkvKiBJRCBvZiAybmQgYmxvY2sgb2YgOCBmb3IgMTYgcG9ydCAqLworCXVsb25nIEZsYWdzOwkJLyogQm9vdGVkLCBJRCBHaXZlbiwgRGlzY29ubmVjdGVkICovCisJdWxvbmcgU3lzUG9ydDsJCS8qIEZpcnN0IHR0eSBtYXBwZWQgdG8gdGhpcyBwb3J0ICovCisJc3RydWN0IFRvcCBUb3BvbG9neVtMSU5LU19QRVJfVU5JVF07CS8qIElEIGNvbm5lY3RlZCB0byBlYWNoIGxpbmsgKi8KKwljaGFyIE5hbWVbTUFYX05BTUVfTEVOXTsJLyogQ3V0ZSBuYW1lIGJ5IHdoaWNoIFJUQSBpcyBrbm93biAqLwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vbWNhLmggYi9kcml2ZXJzL2NoYXIvcmlvL21jYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGEzMjdlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9yaW8vbWNhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoqCi0qKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKLSoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KLSAqCi0gKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCi0gKgotICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotKioKLSoqCU1vZHVsZQkJOiBtY2EuaAotKioJU0lECQk6IDEuMgotKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MTEKLSoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjEKLSoqCi0qKiAgaWRlbnQgQCgjKW1jYS5oCTEuMgotKioKLSoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaWZuZGVmIF9fcmlvX21jYV9oX18KLSNkZWZpbmUJX19yaW9fbWNhX2hfXwotCi0jaWZkZWYgU0NDU19MQUJFTFMKLXN0YXRpYyBjaGFyICpfbWNhX2hfc2Njc18gPSAiQCgjKW1jYS5oCTEuMiI7Ci0jZW5kaWYKLQotLyoKLSoqIE1pY3JvIENoYW5uZWwgc3R1ZmYKLSovCi0KLSNkZWZpbmUJTWNhTWF4U2xvdHMJOAotI2RlZmluZSBNY2FTbG90U2VsZWN0CTB4OTYKLSNkZWZpbmUJTWNhU2xvdEVuYWJsZQkweDA4Ci0jZGVmaW5lCU1jYUlkTG93CTB4MTAwCi0jZGVmaW5lCU1jYUlkSGlnaAkweDEwMQotI2RlZmluZQlNY2FJcnFFbmFibGUJMHgxMDIKLSNkZWZpbmUJTWNhTWVtb3J5CTB4MTAzCi0jZGVmaW5lIE1jYVJJT0lkCTB4NmE1YwotI2RlZmluZQlNY2FJcnE5CQkweDAwCi0jZGVmaW5lCU1jYUlycTMJCTB4MDIKLSNkZWZpbmUJTWNhSXJxNAkJMHgwNAotI2RlZmluZQlNY2FJcnE3CQkweDA2Ci0jZGVmaW5lCU1jYUlycTEwCTB4MDgKLSNkZWZpbmUJTWNhSXJxMTEJMHgwQQotI2RlZmluZQlNY2FJcnExMgkweDBDCi0jZGVmaW5lCU1jYUlycTE1CTB4MEUKLSNkZWZpbmUgTWNhSXJxTWFzawkweDBFCi0jZGVmaW5lCU1jYUNhcmRFbmFibGUJMHgwMQotI2RlZmluZQlNY2FBZGRyZXNzKFgpCSgoKFgpJjB4RkYpPDwxNikKLQotI2RlZmluZQlNY2FUcEZhc3RMaW5rcwkgICAgICAgIDB4NDAKLSNkZWZpbmUJTWNhVHBTbG93TGlua3MJICAgICAgICAweDAwCi0jZGVmaW5lCU1jYVRwQm9vdEZyb21SYW0JMHgwMQotI2RlZmluZQlNY2FUcEJvb3RGcm9tTGluawkweDAwCi0jZGVmaW5lCU1jYVRwQnVzRW5hYmxlCQkweDAyCi0jZGVmaW5lCU1jYVRwQnVzRGlzYWJsZQkJMHgwMAotCi0jZGVmaW5lCVJJT19NQ0FfREVGQVVMVF9NT0RFCVNMT1dfTElOS1MKLQotI2VuZGlmCS8qIF9fcmlvX21jYV9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vbWVzZy5oIGIvZHJpdmVycy9jaGFyL3Jpby9tZXNnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZjZjMGIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9tZXNnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoqCi0qKiAgUGVybGUgU3BlY2lhbGl4IGRyaXZlciBmb3IgTGludXgKLSoqICBQb3J0ZWQgZnJvbSBleGlzdGluZyBSSU8gRHJpdmVyIGZvciBTQ08gc291cmNlcy4KLSAqCi0gKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCi0gKgotICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotKioKLSoqCU1vZHVsZQkJOiBtZXNnLmgKLSoqCVNJRAkJOiAxLjIKLSoqCUxhc3QgTW9kaWZpZWQJOiAxMS82Lzk4IDExOjM0OjEyCi0qKglSZXRyaWV2ZWQJOiAxMS82Lzk4IDExOjM0OjIxCi0qKgotKiogIGlkZW50IEAoIyltZXNnLmgJMS4yCi0qKgotKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpZm5kZWYgX19yaW9fbWVzZ19oX18KLSNkZWZpbmUJX19yaW9fbWVzZ19oX18KLQotI2lmZGVmIFNDQ1NfTEFCRUxTCi1zdGF0aWMgY2hhciAqX21lc2dfaF9zY2NzXyA9ICJAKCMpbWVzZy5oCTEuMiI7Ci0jZW5kaWYKLQotCi0jZW5kaWYgLyogX19yaW9fbWVzZ19oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcGFyYW0uaCBiL2RyaXZlcnMvY2hhci9yaW8vcGFyYW0uaAppbmRleCAyZGMzMGI5Li5kZTdlNTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL3BhcmFtLmgKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9wYXJhbS5oCkBAIC00MiwyMCArNDIsMTkgQEAKICoqIHRoZSBwYXJhbSBjb21tYW5kIGJsb2NrLCBhcyB1c2VkIGluIE9QRU4gYW5kIFBBUkFNIGNhbGxzLgogKi8KIAotc3RydWN0IHBoYl9wYXJhbQotewotICAgIEJZVEUgICAgQ21kOyAgICAgICAgLyogSXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdCB0aGVzZSBsaW5lIHVwICovCi0gICAgQllURSAgICBDb3IxOyAgICAgICAvKiB3aXRoIHdoYXQgaXMgZXhwZWN0ZWQgYXQgdGhlIG90aGVyIGVuZC4gKi8KLSAgICBCWVRFICAgIENvcjI7ICAgICAgIC8qIHRvIGNvbmZpcm0gdGhhdCB5b3UndmUgZ290IGl0IHJpZ2h0LCAgICAqLwotICAgIEJZVEUgICAgQ29yNDsgICAgICAgLyogY2hlY2sgd2l0aCBjaXJydXMvY2lycnVzLmggICAgICAgICAgICAgICovCi0gICAgQllURSAgICBDb3I1OwotICAgIEJZVEUgICAgVHhYb247CS8qIFRyYW5zbWl0IFgtT24gY2hhcmFjdGVyICovCi0gICAgQllURSAgICBUeFhvZmY7CS8qIFRyYW5zbWl0IFgtT2ZmIGNoYXJhY3RlciAqLwotICAgIEJZVEUgICAgUnhYb247CS8qIFJlY2VpdmUgWC1PbiBjaGFyYWN0ZXIgKi8KLSAgICBCWVRFICAgIFJ4WG9mZjsJLyogUmVjZWl2ZSBYLU9mZiBjaGFyYWN0ZXIgKi8KLSAgICBCWVRFICAgIExOZXh0OwkvKiBMaXRlcmFsLW5leHQgY2hhcmFjdGVyICovCi0gICAgQllURSAgICBUeEJhdWQ7CS8qIFRyYW5zbWl0IGJhdWRyYXRlICovCi0gICAgQllURSAgICBSeEJhdWQ7CS8qIFJlY2VpdmUgYmF1ZHJhdGUgKi8KK3N0cnVjdCBwaGJfcGFyYW0geworCUJZVEUgQ21kOwkJLyogSXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdCB0aGVzZSBsaW5lIHVwICovCisJQllURSBDb3IxOwkJLyogd2l0aCB3aGF0IGlzIGV4cGVjdGVkIGF0IHRoZSBvdGhlciBlbmQuICovCisJQllURSBDb3IyOwkJLyogdG8gY29uZmlybSB0aGF0IHlvdSd2ZSBnb3QgaXQgcmlnaHQsICAgICovCisJQllURSBDb3I0OwkJLyogY2hlY2sgd2l0aCBjaXJydXMvY2lycnVzLmggICAgICAgICAgICAgICovCisJQllURSBDb3I1OworCUJZVEUgVHhYb247CQkvKiBUcmFuc21pdCBYLU9uIGNoYXJhY3RlciAqLworCUJZVEUgVHhYb2ZmOwkJLyogVHJhbnNtaXQgWC1PZmYgY2hhcmFjdGVyICovCisJQllURSBSeFhvbjsJCS8qIFJlY2VpdmUgWC1PbiBjaGFyYWN0ZXIgKi8KKwlCWVRFIFJ4WG9mZjsJCS8qIFJlY2VpdmUgWC1PZmYgY2hhcmFjdGVyICovCisJQllURSBMTmV4dDsJCS8qIExpdGVyYWwtbmV4dCBjaGFyYWN0ZXIgKi8KKwlCWVRFIFR4QmF1ZDsJCS8qIFRyYW5zbWl0IGJhdWRyYXRlICovCisJQllURSBSeEJhdWQ7CQkvKiBSZWNlaXZlIGJhdWRyYXRlICovCiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcGFybW1hcC5oIGIvZHJpdmVycy9jaGFyL3Jpby9wYXJtbWFwLmgKaW5kZXggNDZmOTlkZi4uZmU0ZTAwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9wYXJtbWFwLmgKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9wYXJtbWFwLmgKQEAgLTQ0LDUzICs0NCw1MCBAQAogI2VuZGlmCiAjZW5kaWYKIAotdHlwZWRlZiBzdHJ1Y3QgUEFSTV9NQVAgUEFSTV9NQVAgOwordHlwZWRlZiBzdHJ1Y3QgUEFSTV9NQVAgUEFSTV9NQVA7CiAKLXN0cnVjdCBQQVJNX01BUAotewotUEhCX3B0ciAgICAgICAgICAgcGhiX3B0ciA7ICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBQSEIgYXJyYXkgKi8KLVdPUkRfcHRyICAgICAgICAgIHBoYl9udW1fcHRyIDsgICAgICAgICAgLyogUHRyIHRvIE51bWJlciBvZiBQSEIncyAqLwotRlJFRV9MSVNUX3B0ciAgICAgZnJlZV9saXN0OyAgICAgICAgICAgICAvKiBGcmVlIExpc3QgcG9pbnRlciAqLwotRlJFRV9MSVNUX3B0ciAgICAgZnJlZV9saXN0X2VuZDsgICAgICAgICAvKiBGcmVlIExpc3QgRW5kIHBvaW50ZXIgKi8KLVFfQlVGX3B0cl9wdHIgICAgIHFfZnJlZV9saXN0X3B0ciA7ICAgICAgLyogUHRyIHRvIFFfQlVGIHZhcmlhYmxlICovCi1CWVRFX3B0ciAgICAgICAgICB1bml0X2lkX3B0ciA7ICAgICAgICAgIC8qIFVuaXQgSWQgKi8KLUxQQl9wdHIgICAgICAgICAgIGxpbmtfc3RyX3B0ciA7ICAgICAgICAgLyogTGluayBTdHJ1Y3R1cmUgQXJyYXkgKi8KLUJZVEVfcHRyICAgICAgICAgIGJvb3Rsb2FkZXJfMSA7ICAgICAgICAgLyogMXN0IFN0YWdlIEJvb3QgTG9hZGVyICovCi1CWVRFX3B0ciAgICAgICAgICBib290bG9hZGVyXzIgOyAgICAgICAgIC8qIDJuZCBTdGFnZSBCb290IExvYWRlciAqLwotV09SRF9wdHIgICAgICAgICAgcG9ydF9yb3V0ZV9tYXBfcHRyIDsgICAvKiBQb3J0IFJvdXRlIE1hcCAqLwotUk9VVEVfU1RSX3B0ciAgICAgcm91dGVfcHRyIDsgICAgICAgICAgICAvKiBVbml0IFJvdXRlIE1hcCAqLwotTlVNQkVSX3B0ciAgICAgICAgbWFwX3ByZXNlbnQgOyAgICAgICAgICAvKiBSb3V0ZSBNYXAgcHJlc2VudCAqLwotTlVNQkVSICAgICAgICAgICAgcGt0X251bSA7ICAgICAgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIHBhY2tldHMgKi8KLU5VTUJFUiAgICAgICAgICAgIHFfbnVtIDsgICAgICAgICAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBRIHBhY2tldHMgKi8KLVdPUkQgICAgICAgICAgICAgIGJ1ZmZlcnNfcGVyX3BvcnQgOyAgICAgIC8qIE51bWJlciBvZiBidWZmZXJzIHBlciBwb3J0ICovCi1XT1JEICAgICAgICAgICAgICBoZWFwX3NpemUgOyAgICAgICAgICAgICAvKiBJbml0aWFsIHNpemUgb2YgaGVhcCAqLwotV09SRCAgICAgICAgICAgICAgaGVhcF9sZWZ0IDsgICAgICAgICAgICAgLyogQ3VycmVudCBIZWFwIGxlZnQgKi8KLVdPUkQgICAgICAgICAgICAgIGVycm9yIDsgICAgICAgICAgICAgICAgIC8qIEVycm9yIGNvZGUgKi8KLVdPUkQgICAgICAgICAgICAgIHR4X21heDsgICAgICAgICAgICAgICAgIC8qIE1heCBudW1iZXIgb2YgdHggcGt0cyBwZXIgcGhiICovCi1XT1JEICAgICAgICAgICAgICByeF9tYXg7ICAgICAgICAgICAgICAgICAvKiBNYXggbnVtYmVyIG9mIHJ4IHBrdHMgcGVyIHBoYiAqLwotV09SRCAgICAgICAgICAgICAgcnhfbGltaXQ7ICAgICAgICAgICAgICAgLyogRm9yIGhpZ2ggLyBsb3cgd2F0ZXJtYXJrcyAqLwotTlVNQkVSICAgICAgICAgICAgbGlua3MgOyAgICAgICAgICAgICAgICAgLyogTGlua3MgdG8gdXNlICovCi1OVU1CRVIgICAgICAgICAgICB0aW1lciA7ICAgICAgICAgICAgICAgICAvKiBJbnRlcnJ1cHRzIHBlciBzZWNvbmQgKi8KLVJVUF9wdHIgICAgICAgICAgIHJ1cHMgOyAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgUlVQcyAqLwotV09SRCAgICAgICAgICAgICAgbWF4X3BoYiA7ICAgICAgICAgICAgICAvKiBNb3N0bHkgZm9yIGRlYnVnZ2luZyAqLwotV09SRCAgICAgICAgICAgICAgbGl2aW5nIDsgICAgICAgICAgICAgICAvKiBKdXN0IGluY3JlbWVudHMhISAqLwotV09SRCAgICAgICAgICAgICAgaW5pdF9kb25lIDsgICAgICAgICAgICAvKiBJbml0aWFsaXNhdGlvbiBvdmVyICovCi1XT1JEICAgICAgICAgICAgICBib290aW5nX2xpbmsgOwotV09SRCAgICAgICAgICAgICAgaWRsZV9jb3VudCA7ICAgICAgICAgICAvKiBJZGxlIHRpbWUgY291bnRlciAqLwotV09SRCAgICAgICAgICAgICAgYnVzeV9jb3VudCA7ICAgICAgICAgICAvKiBCdXN5IGNvdW50ZXIgKi8KLVdPUkQgICAgICAgICAgICAgIGlkbGVfY29udHJvbCA7ICAgICAgICAgLyogQ29udHJvbCBJZGxlIFByb2Nlc3MgKi8KK3N0cnVjdCBQQVJNX01BUCB7CisJUEhCX3B0ciBwaGJfcHRyOwkvKiBQb2ludGVyIHRvIHRoZSBQSEIgYXJyYXkgKi8KKwlXT1JEX3B0ciBwaGJfbnVtX3B0cjsJLyogUHRyIHRvIE51bWJlciBvZiBQSEIncyAqLworCUZSRUVfTElTVF9wdHIgZnJlZV9saXN0OwkvKiBGcmVlIExpc3QgcG9pbnRlciAqLworCUZSRUVfTElTVF9wdHIgZnJlZV9saXN0X2VuZDsJLyogRnJlZSBMaXN0IEVuZCBwb2ludGVyICovCisJUV9CVUZfcHRyX3B0ciBxX2ZyZWVfbGlzdF9wdHI7CS8qIFB0ciB0byBRX0JVRiB2YXJpYWJsZSAqLworCUJZVEVfcHRyIHVuaXRfaWRfcHRyOwkvKiBVbml0IElkICovCisJTFBCX3B0ciBsaW5rX3N0cl9wdHI7CS8qIExpbmsgU3RydWN0dXJlIEFycmF5ICovCisJQllURV9wdHIgYm9vdGxvYWRlcl8xOwkvKiAxc3QgU3RhZ2UgQm9vdCBMb2FkZXIgKi8KKwlCWVRFX3B0ciBib290bG9hZGVyXzI7CS8qIDJuZCBTdGFnZSBCb290IExvYWRlciAqLworCVdPUkRfcHRyIHBvcnRfcm91dGVfbWFwX3B0cjsJLyogUG9ydCBSb3V0ZSBNYXAgKi8KKwlST1VURV9TVFJfcHRyIHJvdXRlX3B0cjsJLyogVW5pdCBSb3V0ZSBNYXAgKi8KKwlOVU1CRVJfcHRyIG1hcF9wcmVzZW50OwkvKiBSb3V0ZSBNYXAgcHJlc2VudCAqLworCU5VTUJFUiBwa3RfbnVtOwkJLyogVG90YWwgbnVtYmVyIG9mIHBhY2tldHMgKi8KKwlOVU1CRVIgcV9udW07CQkvKiBUb3RhbCBudW1iZXIgb2YgUSBwYWNrZXRzICovCisJV09SRCBidWZmZXJzX3Blcl9wb3J0OwkvKiBOdW1iZXIgb2YgYnVmZmVycyBwZXIgcG9ydCAqLworCVdPUkQgaGVhcF9zaXplOwkJLyogSW5pdGlhbCBzaXplIG9mIGhlYXAgKi8KKwlXT1JEIGhlYXBfbGVmdDsJCS8qIEN1cnJlbnQgSGVhcCBsZWZ0ICovCisJV09SRCBlcnJvcjsJCS8qIEVycm9yIGNvZGUgKi8KKwlXT1JEIHR4X21heDsJCS8qIE1heCBudW1iZXIgb2YgdHggcGt0cyBwZXIgcGhiICovCisJV09SRCByeF9tYXg7CQkvKiBNYXggbnVtYmVyIG9mIHJ4IHBrdHMgcGVyIHBoYiAqLworCVdPUkQgcnhfbGltaXQ7CQkvKiBGb3IgaGlnaCAvIGxvdyB3YXRlcm1hcmtzICovCisJTlVNQkVSIGxpbmtzOwkJLyogTGlua3MgdG8gdXNlICovCisJTlVNQkVSIHRpbWVyOwkJLyogSW50ZXJydXB0cyBwZXIgc2Vjb25kICovCisJUlVQX3B0ciBydXBzOwkJLyogUG9pbnRlciB0byB0aGUgUlVQcyAqLworCVdPUkQgbWF4X3BoYjsJCS8qIE1vc3RseSBmb3IgZGVidWdnaW5nICovCisJV09SRCBsaXZpbmc7CQkvKiBKdXN0IGluY3JlbWVudHMhISAqLworCVdPUkQgaW5pdF9kb25lOwkJLyogSW5pdGlhbGlzYXRpb24gb3ZlciAqLworCVdPUkQgYm9vdGluZ19saW5rOworCVdPUkQgaWRsZV9jb3VudDsJLyogSWRsZSB0aW1lIGNvdW50ZXIgKi8KKwlXT1JEIGJ1c3lfY291bnQ7CS8qIEJ1c3kgY291bnRlciAqLworCVdPUkQgaWRsZV9jb250cm9sOwkvKiBDb250cm9sIElkbGUgUHJvY2VzcyAqLwogI2lmIGRlZmluZWQoSE9TVCkgfHwgZGVmaW5lZChJTktFUk5FTCkKLVdPUkQgICAgICAgICAgICAgIHR4X2ludHI7ICAgICAgICAgICAgICAgLyogVFggaW50ZXJydXB0IHBlbmRpbmcgKi8KLVdPUkQgICAgICAgICAgICAgIHJ4X2ludHI7ICAgICAgICAgICAgICAgLyogUlggaW50ZXJydXB0IHBlbmRpbmcgKi8KLVdPUkQgICAgICAgICAgICAgIHJ1cF9pbnRyOyAgICAgICAgICAgICAgLyogUlVQIGludGVycnVwdCBwZW5kaW5nICovCisJV09SRCB0eF9pbnRyOwkJLyogVFggaW50ZXJydXB0IHBlbmRpbmcgKi8KKwlXT1JEIHJ4X2ludHI7CQkvKiBSWCBpbnRlcnJ1cHQgcGVuZGluZyAqLworCVdPUkQgcnVwX2ludHI7CQkvKiBSVVAgaW50ZXJydXB0IHBlbmRpbmcgKi8KICNlbmRpZgogI2lmIGRlZmluZWQoUlRBKQotV09SRAkJICBkeWluZ19jb3VudDsJCS8qIENvdW50IG9mIHByb2Nlc3NlcyBkZWFkICovCisJV09SRCBkeWluZ19jb3VudDsJLyogQ291bnQgb2YgcHJvY2Vzc2VzIGRlYWQgKi8KICNlbmRpZgotfSA7Cit9OwogCiAjZW5kaWYKIAogLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLwotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcGNpLmggYi9kcml2ZXJzL2NoYXIvcmlvL3BjaS5oCmluZGV4IGRjNjM1YmQuLjFlYmE5MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vcGNpLmgKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9wY2kuaApAQCAtNzMsNCArNzMsNCBAQAogCiAjZGVmaW5lCVJJT19QQ0lfREVGQVVMVF9NT0RFCTB4MDUKIAotI2VuZGlmCS8qIF9fcmlvX3BjaV9oX18gKi8KKyNlbmRpZgkJCQkvKiBfX3Jpb19wY2lfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3BoYi5oIGIvZHJpdmVycy9jaGFyL3Jpby9waGIuaAppbmRleCBlMTQ4M2EwLi4zYmFlYmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL3BoYi5oCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcGhiLmgKQEAgLTU4LDM3ICs1OCwzNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEhhbmRzaGFrZSBhc3NlcnRlZC4gRGVhc3NlcnRlZCBieSB0aGUgTFRUKHMpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBQSEJfSEFORFNIQUtFX1NFVCAgICAgICgodXNob3J0KSAweDAwMSkgLyogU2V0IGJ5IExSVCAqLworI2RlZmluZSBQSEJfSEFORFNIQUtFX1NFVCAgICAgICgodXNob3J0KSAweDAwMSkJLyogU2V0IGJ5IExSVCAqLwogCi0jZGVmaW5lIFBIQl9IQU5EU0hBS0VfUkVTRVQgICAgICgodXNob3J0KSAweDAwMikgLyogU2V0IGJ5IElTUiAvIGRyaXZlciAqLworI2RlZmluZSBQSEJfSEFORFNIQUtFX1JFU0VUICAgICAoKHVzaG9ydCkgMHgwMDIpCS8qIFNldCBieSBJU1IgLyBkcml2ZXIgKi8KIAogI2RlZmluZSBQSEJfSEFORFNIQUtFX0ZMQUdTICAgICAoUEhCX0hBTkRTSEFLRV9SRVNFVCB8IFBIQl9IQU5EU0hBS0VfU0VUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzZXQgYnkgbHR0ICovCisJCQkJCQkvKiBSZXNldCBieSBsdHQgKi8KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF4aW11bSBudW1iZXIgb2YgUEhCJ3MKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWYgZGVmaW5lZCAoSE9TVCkgfHwgZGVmaW5lZCAoSU5LRVJORUwpCi0jZGVmaW5lIE1BWF9QSEIgICAgICAgICAgICAgICAoKHVzaG9ydCkgMTI4KSAgLyogcmFuZ2UgMC0xMjcgKi8KKyNkZWZpbmUgTUFYX1BIQiAgICAgICAgICAgICAgICgodXNob3J0KSAxMjgpCS8qIHJhbmdlIDAtMTI3ICovCiAjZWxzZQotI2RlZmluZSBNQVhfUEhCICAgICAgICAgICAgICAgKCh1c2hvcnQpIDgpICAgIC8qIHJhbmdlIDAtNyAqLworI2RlZmluZSBNQVhfUEhCICAgICAgICAgICAgICAgKCh1c2hvcnQpIDgpCS8qIHJhbmdlIDAtNyAqLwogI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBEZWZpbmVzIGZvciB0aGUgbW9kZSBmaWVsZHMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFRYUEtUX0lOQ09NUExFVEUgICAgICAgIDB4MDAwMSAgLyogUHJldmlvdXMgdHggcGFja2V0IG5vdCBjb21wbGV0ZWQgKi8KLSNkZWZpbmUgVFhJTlRSX0VOQUJMRUQgICAgICAgICAgMHgwMDAyICAvKiBUeCBpbnRlcnJ1cHQgaXMgZW5hYmxlZCAqLwotI2RlZmluZSBUWF9UQUIzICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIFRBQjMgbW9kZSAqLwotI2RlZmluZSBUWF9PQ1JOTCAgICAgICAgICAgICAgICAweDAwMDggIC8qIE9DUk5MIG1vZGUgKi8KLSNkZWZpbmUgVFhfT05MQ1IgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBPTkxDUiBtb2RlICovCi0jZGVmaW5lIFRYX1NFTkRTUEFDRVMgICAgICAgICAgIDB4MDAyMCAgLyogU2VuZCBuIHNwYWNlcyBjb21tYW5kIG5lZWRzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpbmcgKi8KLSNkZWZpbmUgVFhfU0VORE5VTEwgICAgICAgICAgICAgMHgwMDQwICAvKiBFc2NhcGluZyBOVUxMIG5lZWRzIGNvbXBsZXRpbmcgKi8KLSNkZWZpbmUgVFhfU0VORExGICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMRiAtPiBDUiBMRiBuZWVkcyBjb21wbGV0aW5nICovCi0jZGVmaW5lIFRYX1BBUkFMTEVMQlVHICAgICAgICAgIDB4MDEwMCAgLyogQ0QxNDAwIExGIC0+IENSIExGIGJ1ZyBvbiBwYXJhbGxlbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgKi8KKyNkZWZpbmUgVFhQS1RfSU5DT01QTEVURSAgICAgICAgMHgwMDAxCS8qIFByZXZpb3VzIHR4IHBhY2tldCBub3QgY29tcGxldGVkICovCisjZGVmaW5lIFRYSU5UUl9FTkFCTEVEICAgICAgICAgIDB4MDAwMgkvKiBUeCBpbnRlcnJ1cHQgaXMgZW5hYmxlZCAqLworI2RlZmluZSBUWF9UQUIzICAgICAgICAgICAgICAgICAweDAwMDQJLyogVEFCMyBtb2RlICovCisjZGVmaW5lIFRYX09DUk5MICAgICAgICAgICAgICAgIDB4MDAwOAkvKiBPQ1JOTCBtb2RlICovCisjZGVmaW5lIFRYX09OTENSICAgICAgICAgICAgICAgIDB4MDAxMAkvKiBPTkxDUiBtb2RlICovCisjZGVmaW5lIFRYX1NFTkRTUEFDRVMgICAgICAgICAgIDB4MDAyMAkvKiBTZW5kIG4gc3BhY2VzIGNvbW1hbmQgbmVlZHMKKwkJCQkJICAgY29tcGxldGluZyAqLworI2RlZmluZSBUWF9TRU5ETlVMTCAgICAgICAgICAgICAweDAwNDAJLyogRXNjYXBpbmcgTlVMTCBuZWVkcyBjb21wbGV0aW5nICovCisjZGVmaW5lIFRYX1NFTkRMRiAgICAgICAgICAgICAgIDB4MDA4MAkvKiBMRiAtPiBDUiBMRiBuZWVkcyBjb21wbGV0aW5nICovCisjZGVmaW5lIFRYX1BBUkFMTEVMQlVHICAgICAgICAgIDB4MDEwMAkvKiBDRDE0MDAgTEYgLT4gQ1IgTEYgYnVnIG9uIHBhcmFsbGVsCisJCQkJCSAgIHBvcnQgKi8KICNkZWZpbmUgVFhfSEFOR09WRVIgICAgICAgICAgICAgKFRYX1NFTkRTUEFDRVMgfCBUWF9TRU5ETEYgfCBUWF9TRU5ETlVMTCkKICNkZWZpbmUgVFhfRFRSRkxPVwkJMHgwMjAwCS8qIERUUiB0eCBmbG93IGNvbnRyb2wgKi8KICNkZWZpbmUJVFhfRFRSRkxPV0VECQkweDA0MDAJLyogRFRSIGlzIGxvdyAtIGRvbid0IGFsbG93IG1vcmUgZGF0YQpAQCAtOTYsMzQgKzk2LDM0IEBACiAjZGVmaW5lCVRYX0RBVEFJTkZJRk8JCTB4MDgwMAkvKiBUaGVyZSBpcyBkYXRhIGluIHRoZSBGSUZPICovCiAjZGVmaW5lCVRYX0JVU1kJCQkweDEwMDAJLyogRGF0YSBpbiBGSUZPLCBzaGlmdCBvciBob2xkaW5nIHJlZ3MgKi8KIAotI2RlZmluZSBSWF9TUEFSRQkgICAgICAgIDB4MDAwMSAgIC8qIFNQQVJFICovCi0jZGVmaW5lIFJYSU5UUl9FTkFCTEVEICAgICAgICAgIDB4MDAwMiAgIC8qIFJ4IGludGVycnVwdCBlbmFibGVkICovCi0jZGVmaW5lIFJYX0lDUk5MICAgICAgICAgICAgICAgIDB4MDAwOCAgIC8qIElDUk5MIG1vZGUgKi8KLSNkZWZpbmUgUlhfSU5MQ1IgICAgICAgICAgICAgICAgMHgwMDEwICAgLyogSU5MQ1IgbW9kZSAqLwotI2RlZmluZSBSWF9JR05DUiAgICAgICAgICAgICAgICAweDAwMjAgICAvKiBJR05DUiBtb2RlICovCi0jZGVmaW5lIFJYX0NUU0ZMT1cgICAgICAgICAgICAgIDB4MDA0MCAgIC8qIENUU0ZMT1cgZW5hYmxlZCAqLwotI2RlZmluZSBSWF9JWE9GRiAgICAgICAgICAgICAgICAweDAwODAgICAvKiBJWE9GRiBlbmFibGVkICovCi0jZGVmaW5lIFJYX0NUU0ZMT1dFRCAgICAgICAgICAgIDB4MDEwMCAgIC8qIENUU0ZMT1cgYW5kIENUUyBkcm9wcGVkICovCi0jZGVmaW5lIFJYX0lYT0ZGRUQgICAgICAgICAgICAgIDB4MDIwMCAgIC8qIElYT0ZGIGFuZCB4b2ZmIHNlbnQgKi8KLSNkZWZpbmUgUlhfQlVGRkVSRUQJCTB4MDQwMAkgLyogVHJ5IGFuZCBwYXNzIG9uIGNvbXBsZXRlIHBhY2tldHMgKi8KKyNkZWZpbmUgUlhfU1BBUkUJICAgICAgICAweDAwMDEJLyogU1BBUkUgKi8KKyNkZWZpbmUgUlhJTlRSX0VOQUJMRUQgICAgICAgICAgMHgwMDAyCS8qIFJ4IGludGVycnVwdCBlbmFibGVkICovCisjZGVmaW5lIFJYX0lDUk5MICAgICAgICAgICAgICAgIDB4MDAwOAkvKiBJQ1JOTCBtb2RlICovCisjZGVmaW5lIFJYX0lOTENSICAgICAgICAgICAgICAgIDB4MDAxMAkvKiBJTkxDUiBtb2RlICovCisjZGVmaW5lIFJYX0lHTkNSICAgICAgICAgICAgICAgIDB4MDAyMAkvKiBJR05DUiBtb2RlICovCisjZGVmaW5lIFJYX0NUU0ZMT1cgICAgICAgICAgICAgIDB4MDA0MAkvKiBDVFNGTE9XIGVuYWJsZWQgKi8KKyNkZWZpbmUgUlhfSVhPRkYgICAgICAgICAgICAgICAgMHgwMDgwCS8qIElYT0ZGIGVuYWJsZWQgKi8KKyNkZWZpbmUgUlhfQ1RTRkxPV0VEICAgICAgICAgICAgMHgwMTAwCS8qIENUU0ZMT1cgYW5kIENUUyBkcm9wcGVkICovCisjZGVmaW5lIFJYX0lYT0ZGRUQgICAgICAgICAgICAgIDB4MDIwMAkvKiBJWE9GRiBhbmQgeG9mZiBzZW50ICovCisjZGVmaW5lIFJYX0JVRkZFUkVECQkweDA0MDAJLyogVHJ5IGFuZCBwYXNzIG9uIGNvbXBsZXRlIHBhY2tldHMgKi8KIAotI2RlZmluZSBQT1JUX0lTT1BFTiAgICAgICAgICAgICAweDAwMDEgIC8qIFBvcnQgb3Blbj8gKi8KLSNkZWZpbmUgUE9SVF9IVVBDTCAgICAgICAgICAgICAgMHgwMDAyICAvKiBIYW5ndXAgb24gY2xvc2U/ICovCi0jZGVmaW5lIFBPUlRfTU9QRU5QRU5EICAgICAgICAgIDB4MDAwNCAgLyogTW9kZW0gb3BlbiBwZW5kaW5nICovCi0jZGVmaW5lIFBPUlRfSVNQQVJBTExFTCAgICAgICAgIDB4MDAwOCAgLyogUGFyYWxsZWwgcG9ydCAqLwotI2RlZmluZSBQT1JUX0JSRUFLICAgICAgICAgICAgICAweDAwMTAgIC8qIFBvcnQgb24gYnJlYWsgKi8KLSNkZWZpbmUgUE9SVF9TVEFUVVNQRU5ECQkweDAwMjAgIC8qIFN0YXR1cyBwYWNrZXQgcGVuZGluZyAqLwotI2RlZmluZSBQT1JUX0JSRUFLUEVORCAgICAgICAgICAweDAwNDAgIC8qIEJyZWFrIHBhY2tldCBwZW5kaW5nICovCi0jZGVmaW5lIFBPUlRfTU9ERU1QRU5EICAgICAgICAgIDB4MDA4MCAgLyogTW9kZW0gc3RhdHVzIHBhY2tldCBwZW5kaW5nICovCi0jZGVmaW5lIFBPUlRfUEFSQUxMRUxCVUcgICAgICAgIDB4MDEwMCAgLyogQ0QxNDAwIExGIC0+IENSIExGIGJ1ZyBvbiBwYXJhbGxlbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgKi8KLSNkZWZpbmUgUE9SVF9GVUxMTU9ERU0gICAgICAgICAgMHgwMjAwICAvKiBGdWxsIG1vZGVtIHNpZ25hbHMgKi8KLSNkZWZpbmUgUE9SVF9SSjQ1ICAgICAgICAgICAgICAgMHgwNDAwICAvKiBSSjQ1IGNvbm5lY3RvciAtIG5vIFJJIHNpZ25hbCAqLwotI2RlZmluZSBQT1JUX1JFU1RSSUNURUQgICAgICAgICAweDA2MDAgIC8qIFJlc3RyaWN0ZWQgY29ubmVjdG9yIC0gbm8gUkkgLyBEVFIgKi8KKyNkZWZpbmUgUE9SVF9JU09QRU4gICAgICAgICAgICAgMHgwMDAxCS8qIFBvcnQgb3Blbj8gKi8KKyNkZWZpbmUgUE9SVF9IVVBDTCAgICAgICAgICAgICAgMHgwMDAyCS8qIEhhbmd1cCBvbiBjbG9zZT8gKi8KKyNkZWZpbmUgUE9SVF9NT1BFTlBFTkQgICAgICAgICAgMHgwMDA0CS8qIE1vZGVtIG9wZW4gcGVuZGluZyAqLworI2RlZmluZSBQT1JUX0lTUEFSQUxMRUwgICAgICAgICAweDAwMDgJLyogUGFyYWxsZWwgcG9ydCAqLworI2RlZmluZSBQT1JUX0JSRUFLICAgICAgICAgICAgICAweDAwMTAJLyogUG9ydCBvbiBicmVhayAqLworI2RlZmluZSBQT1JUX1NUQVRVU1BFTkQJCTB4MDAyMAkvKiBTdGF0dXMgcGFja2V0IHBlbmRpbmcgKi8KKyNkZWZpbmUgUE9SVF9CUkVBS1BFTkQgICAgICAgICAgMHgwMDQwCS8qIEJyZWFrIHBhY2tldCBwZW5kaW5nICovCisjZGVmaW5lIFBPUlRfTU9ERU1QRU5EICAgICAgICAgIDB4MDA4MAkvKiBNb2RlbSBzdGF0dXMgcGFja2V0IHBlbmRpbmcgKi8KKyNkZWZpbmUgUE9SVF9QQVJBTExFTEJVRyAgICAgICAgMHgwMTAwCS8qIENEMTQwMCBMRiAtPiBDUiBMRiBidWcgb24gcGFyYWxsZWwKKwkJCQkJICAgcG9ydCAqLworI2RlZmluZSBQT1JUX0ZVTExNT0RFTSAgICAgICAgICAweDAyMDAJLyogRnVsbCBtb2RlbSBzaWduYWxzICovCisjZGVmaW5lIFBPUlRfUko0NSAgICAgICAgICAgICAgIDB4MDQwMAkvKiBSSjQ1IGNvbm5lY3RvciAtIG5vIFJJIHNpZ25hbCAqLworI2RlZmluZSBQT1JUX1JFU1RSSUNURUQgICAgICAgICAweDA2MDAJLyogUmVzdHJpY3RlZCBjb25uZWN0b3IgLSBubyBSSSAvIERUUiAqLwogCi0jZGVmaW5lIFBPUlRfTU9ERU1CSVRTICAgICAgICAgIDB4MDYwMCAgLyogTWFzayBmb3IgbW9kZW0gZmllbGRzICovCisjZGVmaW5lIFBPUlRfTU9ERU1CSVRTICAgICAgICAgIDB4MDYwMAkvKiBNYXNrIGZvciBtb2RlbSBmaWVsZHMgKi8KIAotI2RlZmluZSBQT1JUX1dDTE9TRSAgICAgICAgICAgICAweDA4MDAgIC8qIFdhaXRpbmcgZm9yIGNsb3NlICovCisjZGVmaW5lIFBPUlRfV0NMT1NFICAgICAgICAgICAgIDB4MDgwMAkvKiBXYWl0aW5nIGZvciBjbG9zZSAqLwogI2RlZmluZQlQT1JUX0hBTkRTSEFLRUZJWAkweDEwMDAJLyogUG9ydCBoYXMgSC9XIGZsb3cgY29udHJvbCBmaXggKi8KICNkZWZpbmUJUE9SVF9XQVNQQ0xPU0VECQkweDIwMDAJLyogUG9ydCBjbG9zZWQgd2l0aCBQQ0xPU0UgKi8KICNkZWZpbmUJRFVNUE1PREUJCTB4NDAwMAkvKiBEdW1wIFJUQSBtZW0gKi8KQEAgLTE1NSwxMzkgKzE1NSwxMjggQEAKICNkZWZpbmUgcnhfZW5kICAgICAgIHU0LnMxLnJ4X2VuZF9wdHJfcHRyCiAjZGVmaW5lIHJ4X3JlbW92ZSAgICB1NC5zMS5yeF9yZW1vdmVfcHRyX3B0cgogI2VuZGlmCi10eXBlZGVmIHN0cnVjdCBQSEIgUEhCIDsKK3R5cGVkZWYgc3RydWN0IFBIQiBQSEI7CiBzdHJ1Y3QgUEhCIHsKICNpZmRlZiBSVEEKLSAgICAgICAgdXNob3J0ICAgICAgcG9ydDsKKwl1c2hvcnQgcG9ydDsKICNlbmRpZgogI2lmZGVmIElOS0VSTkVMCi0gICAgICAgIFdPUkQgICAgICBzb3VyY2U7CisJV09SRCBzb3VyY2U7CiAjZWxzZQotICAgICAgICB1bmlvbiAgICAgICAKLSAgICAgICAgewotICAgICAgICAgICAgdXNob3J0IHNvdXJjZTsgICAgICAgICAgICAgIC8qIENvbXBsZXRlIHNvdXJjZSAqLwotICAgICAgICAgICAgc3RydWN0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciB1bml0OyAgICAgLyogU291cmNlIHVuaXQgKi8KLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHBvcnQ7ICAgICAvKiBTb3VyY2UgcG9ydCAqLwotICAgICAgICAgICAgfSBzMjsKLSAgICAgICAgfSB1MjsKKwl1bmlvbiB7CisJCXVzaG9ydCBzb3VyY2U7CS8qIENvbXBsZXRlIHNvdXJjZSAqLworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgY2hhciB1bml0OwkvKiBTb3VyY2UgdW5pdCAqLworCQkJdW5zaWduZWQgY2hhciBwb3J0OwkvKiBTb3VyY2UgcG9ydCAqLworCQl9IHMyOworCX0gdTI7CiAjZW5kaWYKLSAgICAgICAgV09SRCAgICAgIGhhbmRzaGFrZSA7Ci0gICAgICAgIFdPUkQgICAgICBzdGF0dXMgOwotICAgICAgICBOVU1CRVIgICAgICAgdGltZW91dCA7ICAgICAgICAgICAvKiBNYXhpbXVtIG9mIDEuOSBzZWNvbmRzICovCi0gICAgICAgIFdPUkQgICAgICBsaW5rIDsgICAgICAgICAgICAgIC8qIFNlbmQgZG93biB0aGlzIGxpbmsgKi8KKwlXT1JEIGhhbmRzaGFrZTsKKwlXT1JEIHN0YXR1czsKKwlOVU1CRVIgdGltZW91dDsJCS8qIE1heGltdW0gb2YgMS45IHNlY29uZHMgKi8KKwlXT1JEIGxpbms7CQkvKiBTZW5kIGRvd24gdGhpcyBsaW5rICovCiAjaWZkZWYgSU5LRVJORUwKLSAgICAgICAgV09SRCAgICAgIGRlc3RpbmF0aW9uOworCVdPUkQgZGVzdGluYXRpb247CiAjZWxzZQotICAgICAgICB1bmlvbiAgICAgICAKLSAgICAgICAgewotICAgICAgICAgICAgdXNob3J0IGRlc3RpbmF0aW9uOyAgICAgICAgIC8qIENvbXBsZXRlIGRlc3RpbmF0aW9uICovCi0gICAgICAgICAgICBzdHJ1Y3QKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHVuaXQ7ICAgICAvKiBEZXN0aW5hdGlvbiB1bml0ICovCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBwb3J0OyAgICAgLyogRGVzdGluYXRpb24gcG9ydCAqLwotICAgICAgICAgICAgfSBzMTsKLSAgICAgICAgfSB1MTsKKwl1bmlvbiB7CisJCXVzaG9ydCBkZXN0aW5hdGlvbjsJLyogQ29tcGxldGUgZGVzdGluYXRpb24gKi8KKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGNoYXIgdW5pdDsJLyogRGVzdGluYXRpb24gdW5pdCAqLworCQkJdW5zaWduZWQgY2hhciBwb3J0OwkvKiBEZXN0aW5hdGlvbiBwb3J0ICovCisJCX0gczE7CisJfSB1MTsKICNlbmRpZgogI2lmZGVmIFJUQQotICAgICAgICB1c2hvcnQgICAgICB0eF9wa3RzX2FkZGVkOwotICAgICAgICB1c2hvcnQgICAgICB0eF9wa3RzX3JlbW92ZWQ7Ci0gICAgICAgIFFfQlVGX3B0ciAgIHR4X3Ffc3RhcnQgOyAgICAgICAgLyogU3RhcnQgb2YgdGhlIFEgbGlzdCBjaGFpbiAqLwotICAgICAgICBzaG9ydCAgICAgICBudW1fdHhfcV9idWZzIDsgICAgIC8qIE51bWJlciBvZiBRIGJ1ZmZlcnMgaW4gdGhlIGNoYWluICovCi0gICAgICAgIFBLVF9wdHJfcHRyIHR4X2FkZCA7ICAgICAgICAgICAgLyogQWRkIGEgbmV3IFBhY2tldCBoZXJlICovCi0gICAgICAgIFFfQlVGX3B0ciAgIHR4X2FkZF9xYjsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgYWRkIFEgYnVmICovCi0gICAgICAgIFBLVF9wdHJfcHRyIHR4X2FkZF9zdF9xYmIgOyAgICAgLyogUG9pbnRlciB0byBzdGFydCBvZiB0aGUgUSdzIGJ1ZiAqLwotICAgICAgICBQS1RfcHRyX3B0ciB0eF9hZGRfZW5kX3FiYiA7ICAgIC8qIFBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgUSdzIGJ1ZiAqLwotICAgICAgICBQS1RfcHRyX3B0ciB0eF9yZW1vdmUgOyAgICAgICAgIC8qIFJlbW92ZSBhIFBhY2tldCBoZXJlICovCi0gICAgICAgIFFfQlVGX3B0ciAgIHR4X3JlbW92ZV9xYiA7ICAgICAgLyogUG9pbnRlciB0byB0aGUgcmVtb3ZlIFEgYnVmICovCi0gICAgICAgIFBLVF9wdHJfcHRyIHR4X3JlbW92ZV9zdF9xYmIgOyAgLyogUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIFEgYnVmICovCi0gICAgICAgIFBLVF9wdHJfcHRyIHR4X3JlbW92ZV9lbmRfcWJiIDsgLyogUG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBRIGJ1ZiAqLworCXVzaG9ydCB0eF9wa3RzX2FkZGVkOworCXVzaG9ydCB0eF9wa3RzX3JlbW92ZWQ7CisJUV9CVUZfcHRyIHR4X3Ffc3RhcnQ7CS8qIFN0YXJ0IG9mIHRoZSBRIGxpc3QgY2hhaW4gKi8KKwlzaG9ydCBudW1fdHhfcV9idWZzOwkvKiBOdW1iZXIgb2YgUSBidWZmZXJzIGluIHRoZSBjaGFpbiAqLworCVBLVF9wdHJfcHRyIHR4X2FkZDsJLyogQWRkIGEgbmV3IFBhY2tldCBoZXJlICovCisJUV9CVUZfcHRyIHR4X2FkZF9xYjsJLyogUG9pbnRlciB0byB0aGUgYWRkIFEgYnVmICovCisJUEtUX3B0cl9wdHIgdHhfYWRkX3N0X3FiYjsJLyogUG9pbnRlciB0byBzdGFydCBvZiB0aGUgUSdzIGJ1ZiAqLworCVBLVF9wdHJfcHRyIHR4X2FkZF9lbmRfcWJiOwkvKiBQb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIFEncyBidWYgKi8KKwlQS1RfcHRyX3B0ciB0eF9yZW1vdmU7CS8qIFJlbW92ZSBhIFBhY2tldCBoZXJlICovCisJUV9CVUZfcHRyIHR4X3JlbW92ZV9xYjsJLyogUG9pbnRlciB0byB0aGUgcmVtb3ZlIFEgYnVmICovCisJUEtUX3B0cl9wdHIgdHhfcmVtb3ZlX3N0X3FiYjsJLyogUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIFEgYnVmICovCisJUEtUX3B0cl9wdHIgdHhfcmVtb3ZlX2VuZF9xYmI7CS8qIFBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgUSBidWYgKi8KICNlbmRpZgogI2lmZGVmIElOS0VSTkVMCi0gICAgICAgIFBLVF9wdHJfcHRyIHR4X3N0YXJ0IDsKLSAgICAgICAgUEtUX3B0cl9wdHIgdHhfZW5kIDsKLSAgICAgICAgUEtUX3B0cl9wdHIgdHhfYWRkIDsKLSAgICAgICAgUEtUX3B0cl9wdHIgdHhfcmVtb3ZlIDsKKwlQS1RfcHRyX3B0ciB0eF9zdGFydDsKKwlQS1RfcHRyX3B0ciB0eF9lbmQ7CisJUEtUX3B0cl9wdHIgdHhfYWRkOworCVBLVF9wdHJfcHRyIHR4X3JlbW92ZTsKICNlbmRpZgogI2lmZGVmIEhPU1QKLSAgICAgICAgdW5pb24KLSAgICAgICAgewotICAgICAgICAgICAgc3RydWN0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUEtUX3B0cl9wdHIgdHhfc3RhcnRfcHRyX3B0cjsKLSAgICAgICAgICAgICAgICBQS1RfcHRyX3B0ciB0eF9lbmRfcHRyX3B0cjsKLSAgICAgICAgICAgICAgICBQS1RfcHRyX3B0ciB0eF9hZGRfcHRyX3B0cjsKLSAgICAgICAgICAgICAgICBQS1RfcHRyX3B0ciB0eF9yZW1vdmVfcHRyX3B0cjsKLSAgICAgICAgICAgIH0gczE7Ci0gICAgICAgICAgICBzdHJ1Y3QKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1c2hvcnQgKiB0eF9zdGFydF9wdHI7Ci0gICAgICAgICAgICAgICAgdXNob3J0ICogdHhfZW5kX3B0cjsKLSAgICAgICAgICAgICAgICB1c2hvcnQgKiB0eF9hZGRfcHRyOwotICAgICAgICAgICAgICAgIHVzaG9ydCAqIHR4X3JlbW92ZV9wdHI7Ci0gICAgICAgICAgICB9IHMyOwotICAgICAgICB9IHUzOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCVBLVF9wdHJfcHRyIHR4X3N0YXJ0X3B0cl9wdHI7CisJCQlQS1RfcHRyX3B0ciB0eF9lbmRfcHRyX3B0cjsKKwkJCVBLVF9wdHJfcHRyIHR4X2FkZF9wdHJfcHRyOworCQkJUEtUX3B0cl9wdHIgdHhfcmVtb3ZlX3B0cl9wdHI7CisJCX0gczE7CisJCXN0cnVjdCB7CisJCQl1c2hvcnQgKnR4X3N0YXJ0X3B0cjsKKwkJCXVzaG9ydCAqdHhfZW5kX3B0cjsKKwkJCXVzaG9ydCAqdHhfYWRkX3B0cjsKKwkJCXVzaG9ydCAqdHhfcmVtb3ZlX3B0cjsKKwkJfSBzMjsKKwl9IHUzOwogI2VuZGlmCiAKICNpZmRlZiAgUlRBCi0gICAgICAgIHVzaG9ydCAgICAgIHJ4X3BrdHNfYWRkZWQ7Ci0gICAgICAgIHVzaG9ydCAgICAgIHJ4X3BrdHNfcmVtb3ZlZDsKLSAgICAgICAgUV9CVUZfcHRyICAgcnhfcV9zdGFydCA7ICAgICAgICAvKiBTdGFydCBvZiB0aGUgUSBsaXN0IGNoYWluICovCi0gICAgICAgIHNob3J0ICAgICAgIG51bV9yeF9xX2J1ZnMgOyAgICAgLyogTnVtYmVyIG9mIFEgYnVmZmVycyBpbiB0aGUgY2hhaW4gKi8KLSAgICAgICAgUEtUX3B0cl9wdHIgcnhfYWRkIDsgICAgICAgICAgICAvKiBBZGQgYSBuZXcgUGFja2V0IGhlcmUgKi8KLSAgICAgICAgUV9CVUZfcHRyICAgcnhfYWRkX3FiIDsgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBhZGQgUSBidWYgKi8KLSAgICAgICAgUEtUX3B0cl9wdHIgcnhfYWRkX3N0X3FiYiA7ICAgICAvKiBQb2ludGVyIHRvIHN0YXJ0IG9mIHRoZSBRJ3MgYnVmICovCi0gICAgICAgIFBLVF9wdHJfcHRyIHJ4X2FkZF9lbmRfcWJiIDsgICAgLyogUG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBRJ3MgYnVmICovCi0gICAgICAgIFBLVF9wdHJfcHRyIHJ4X3JlbW92ZSA7ICAgICAgICAgLyogUmVtb3ZlIGEgUGFja2V0IGhlcmUgKi8KLSAgICAgICAgUV9CVUZfcHRyICAgcnhfcmVtb3ZlX3FiIDsgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZW1vdmUgUSBidWYgKi8KLSAgICAgICAgUEtUX3B0cl9wdHIgcnhfcmVtb3ZlX3N0X3FiYiA7ICAvKiBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgUSBidWYgKi8KLSAgICAgICAgUEtUX3B0cl9wdHIgcnhfcmVtb3ZlX2VuZF9xYmIgOyAvKiBQb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIFEgYnVmICovCisJdXNob3J0IHJ4X3BrdHNfYWRkZWQ7CisJdXNob3J0IHJ4X3BrdHNfcmVtb3ZlZDsKKwlRX0JVRl9wdHIgcnhfcV9zdGFydDsJLyogU3RhcnQgb2YgdGhlIFEgbGlzdCBjaGFpbiAqLworCXNob3J0IG51bV9yeF9xX2J1ZnM7CS8qIE51bWJlciBvZiBRIGJ1ZmZlcnMgaW4gdGhlIGNoYWluICovCisJUEtUX3B0cl9wdHIgcnhfYWRkOwkvKiBBZGQgYSBuZXcgUGFja2V0IGhlcmUgKi8KKwlRX0JVRl9wdHIgcnhfYWRkX3FiOwkvKiBQb2ludGVyIHRvIHRoZSBhZGQgUSBidWYgKi8KKwlQS1RfcHRyX3B0ciByeF9hZGRfc3RfcWJiOwkvKiBQb2ludGVyIHRvIHN0YXJ0IG9mIHRoZSBRJ3MgYnVmICovCisJUEtUX3B0cl9wdHIgcnhfYWRkX2VuZF9xYmI7CS8qIFBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgUSdzIGJ1ZiAqLworCVBLVF9wdHJfcHRyIHJ4X3JlbW92ZTsJLyogUmVtb3ZlIGEgUGFja2V0IGhlcmUgKi8KKwlRX0JVRl9wdHIgcnhfcmVtb3ZlX3FiOwkvKiBQb2ludGVyIHRvIHRoZSByZW1vdmUgUSBidWYgKi8KKwlQS1RfcHRyX3B0ciByeF9yZW1vdmVfc3RfcWJiOwkvKiBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgUSBidWYgKi8KKwlQS1RfcHRyX3B0ciByeF9yZW1vdmVfZW5kX3FiYjsJLyogUG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBRIGJ1ZiAqLwogI2VuZGlmCiAjaWZkZWYgSU5LRVJORUwKLSAgICAgICAgUEtUX3B0cl9wdHIgcnhfc3RhcnQgOwotICAgICAgICBQS1RfcHRyX3B0ciByeF9lbmQgOwotICAgICAgICBQS1RfcHRyX3B0ciByeF9hZGQgOwotICAgICAgICBQS1RfcHRyX3B0ciByeF9yZW1vdmUgOworCVBLVF9wdHJfcHRyIHJ4X3N0YXJ0OworCVBLVF9wdHJfcHRyIHJ4X2VuZDsKKwlQS1RfcHRyX3B0ciByeF9hZGQ7CisJUEtUX3B0cl9wdHIgcnhfcmVtb3ZlOwogI2VuZGlmCiAjaWZkZWYgSE9TVAotICAgICAgICB1bmlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJ1Y3QKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQS1RfcHRyX3B0ciByeF9zdGFydF9wdHJfcHRyOwotICAgICAgICAgICAgICAgIFBLVF9wdHJfcHRyIHJ4X2VuZF9wdHJfcHRyOwotICAgICAgICAgICAgICAgIFBLVF9wdHJfcHRyIHJ4X2FkZF9wdHJfcHRyOwotICAgICAgICAgICAgICAgIFBLVF9wdHJfcHRyIHJ4X3JlbW92ZV9wdHJfcHRyOwotICAgICAgICAgICAgfSBzMTsKLSAgICAgICAgICAgIHN0cnVjdAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVzaG9ydCAqIHJ4X3N0YXJ0X3B0cjsKLSAgICAgICAgICAgICAgICB1c2hvcnQgKiByeF9lbmRfcHRyOwotICAgICAgICAgICAgICAgIHVzaG9ydCAqIHJ4X2FkZF9wdHI7Ci0gICAgICAgICAgICAgICAgdXNob3J0ICogcnhfcmVtb3ZlX3B0cjsKLSAgICAgICAgICAgIH0gczI7Ci0gICAgICAgIH0gdTQ7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJUEtUX3B0cl9wdHIgcnhfc3RhcnRfcHRyX3B0cjsKKwkJCVBLVF9wdHJfcHRyIHJ4X2VuZF9wdHJfcHRyOworCQkJUEtUX3B0cl9wdHIgcnhfYWRkX3B0cl9wdHI7CisJCQlQS1RfcHRyX3B0ciByeF9yZW1vdmVfcHRyX3B0cjsKKwkJfSBzMTsKKwkJc3RydWN0IHsKKwkJCXVzaG9ydCAqcnhfc3RhcnRfcHRyOworCQkJdXNob3J0ICpyeF9lbmRfcHRyOworCQkJdXNob3J0ICpyeF9hZGRfcHRyOworCQkJdXNob3J0ICpyeF9yZW1vdmVfcHRyOworCQl9IHMyOworCX0gdTQ7CiAjZW5kaWYKIAotI2lmZGVmIFJUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbWUgZmllbGRzIGZvciB0aGUgcmVtb3RlcyAqLwotICAgICAgICB1c2hvcnQgICAgIGZsdXNoX2NvdW50OwkJLyogQ291bnQgb2Ygd3JpdGUgZmx1c2hlcyAqLwotICAgICAgICB1c2hvcnQgICAgIHR4bW9kZTsJCS8qIE1vZGVzIGZvciB0eCAqLwotICAgICAgICB1c2hvcnQgICAgIHJ4bW9kZTsJCS8qIE1vZGVzIGZvciByeCAqLwotICAgICAgICB1c2hvcnQgICAgIHBvcnRtb2RlOwkJLyogR2VuZXJpYyBtb2RlcyAqLwotICAgICAgICB1c2hvcnQgICAgIGNvbHVtbjsJCS8qIFRBQjMgY29sdW1uIGNvdW50ICovCi0gICAgICAgIHVzaG9ydCAgICAgdHhfc3Vic2NyaXB0OwkvKiAoVFgpIFN1YnNjcmlwdCBpbnRvIGRhdGEgZmllbGQgKi8KLSAgICAgICAgdXNob3J0ICAgICByeF9zdWJzY3JpcHQ7CS8qIChSWCkgU3Vic2NyaXB0IGludG8gZGF0YSBmaWVsZCAqLwotICAgICAgICBQS1RfcHRyICAgIHJ4X2luY29tcGxldGU7CS8qIEhvbGQgYW4gaW5jb21wbGV0ZSBwYWNrZXQgaGVyZSAqLwotICAgICAgICB1c2hvcnQgICAgIG1vZGVtX2JpdHM7CQkvKiBNb2RlbSBiaXRzIHRvIG1hc2sgKi8KLQl1c2hvcnQJICAgbGFzdE1vZGVtOwkJLyogTW9kZW0gY29udHJvbCBsaW5lcy4gKi8KLSAgICAgICAgdXNob3J0ICAgICBhZGRyOwkJLyogQWRkcmVzcyBmb3Igc3ViIGNvbW1hbmRzICovCi0gICAgICAgIHVzaG9ydCAgICAgTW9uaXRvclRzdGF0ZTsJLyogVFJVRSBpZiBtb25pdG9yaW5nIHRzdG9wICovCisjaWZkZWYgUlRBCQkJLyogc29tZSBmaWVsZHMgZm9yIHRoZSByZW1vdGVzICovCisJdXNob3J0IGZsdXNoX2NvdW50OwkvKiBDb3VudCBvZiB3cml0ZSBmbHVzaGVzICovCisJdXNob3J0IHR4bW9kZTsJCS8qIE1vZGVzIGZvciB0eCAqLworCXVzaG9ydCByeG1vZGU7CQkvKiBNb2RlcyBmb3IgcnggKi8KKwl1c2hvcnQgcG9ydG1vZGU7CS8qIEdlbmVyaWMgbW9kZXMgKi8KKwl1c2hvcnQgY29sdW1uOwkJLyogVEFCMyBjb2x1bW4gY291bnQgKi8KKwl1c2hvcnQgdHhfc3Vic2NyaXB0OwkvKiAoVFgpIFN1YnNjcmlwdCBpbnRvIGRhdGEgZmllbGQgKi8KKwl1c2hvcnQgcnhfc3Vic2NyaXB0OwkvKiAoUlgpIFN1YnNjcmlwdCBpbnRvIGRhdGEgZmllbGQgKi8KKwlQS1RfcHRyIHJ4X2luY29tcGxldGU7CS8qIEhvbGQgYW4gaW5jb21wbGV0ZSBwYWNrZXQgaGVyZSAqLworCXVzaG9ydCBtb2RlbV9iaXRzOwkvKiBNb2RlbSBiaXRzIHRvIG1hc2sgKi8KKwl1c2hvcnQgbGFzdE1vZGVtOwkvKiBNb2RlbSBjb250cm9sIGxpbmVzLiAqLworCXVzaG9ydCBhZGRyOwkJLyogQWRkcmVzcyBmb3Igc3ViIGNvbW1hbmRzICovCisJdXNob3J0IE1vbml0b3JUc3RhdGU7CS8qIFRSVUUgaWYgbW9uaXRvcmluZyB0c3RvcCAqLwogI2VuZGlmCiAKLSAgICAgICAgfSA7Cit9OwogCiAjZW5kaWYKIAogLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3BrdC5oIGIvZHJpdmVycy9jaGFyL3Jpby9wa3QuaAppbmRleCA2NmJiMmZmMC4uODgyZmQ0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9wa3QuaAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3BrdC5oCkBAIC02OSw1MiArNjksNDQgQEAKICNkZWZpbmUgQ09OVFJPTF9QS1RfVFRMX01BU0sgKFBLVF9UVExfTUFTSyA8PCA4KQogI2RlZmluZSBDT05UUk9MX0RBVEFfV05EVyAgKERBVEFfV05EVyA8PCA4KQogCi1zdHJ1Y3QgUEtUICAgIHsKK3N0cnVjdCBQS1QgewogI2lmZGVmIElOS0VSTkVMCi0gICAgICAgICAgICAgICAgICAgQllURSAgICBkZXN0X3VuaXQgOyAgICAvKiBEZXN0aW5hdGlvbiBVbml0IElkICovCi0gICAgICAgICAgICAgICAgICAgQllURSAgICBkZXN0X3BvcnQgOyAgICAvKiBEZXN0aW5hdGlvbiBQT3J0ICovCi0gICAgICAgICAgICAgICAgICAgQllURSAgICBzcmNfdW5pdCA7ICAgICAvKiBTb3VyY2UgVW5pdCBJZCAqLwotICAgICAgICAgICAgICAgICAgIEJZVEUgICAgc3JjX3BvcnQgOyAgICAgLyogU291cmNlIFBPcnQgKi8KKwlCWVRFIGRlc3RfdW5pdDsJCS8qIERlc3RpbmF0aW9uIFVuaXQgSWQgKi8KKwlCWVRFIGRlc3RfcG9ydDsJCS8qIERlc3RpbmF0aW9uIFBPcnQgKi8KKwlCWVRFIHNyY191bml0OwkJLyogU291cmNlIFVuaXQgSWQgKi8KKwlCWVRFIHNyY19wb3J0OwkJLyogU291cmNlIFBPcnQgKi8KICNlbHNlCi0gICAgICAgICAgICAgICAgICAgdW5pb24gICAgICAgCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgZGVzdGluYXRpb247ICAgICAgICAgLyogQ29tcGxldGUgZGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0Ci0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdW5pdDsgICAgIC8qIERlc3RpbmF0aW9uIHVuaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgcG9ydDsgICAgIC8qIERlc3RpbmF0aW9uIHBvcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgfSBzMTsKLSAgICAgICAgICAgICAgICAgICB9IHUxOwotICAgICAgICAgICAgICAgICAgIHVuaW9uICAgICAgIAotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHNvdXJjZTsgICAgICAgICAgICAgIC8qIENvbXBsZXRlIHNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciB1bml0OyAgICAgLyogU291cmNlIHVuaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgcG9ydDsgICAgIC8qIFNvdXJjZSBwb3J0ICovCi0gICAgICAgICAgICAgICAgICAgICAgIH0gczI7Ci0gICAgICAgICAgICAgICAgICAgfSB1MjsKKwl1bmlvbiB7CisJCXVzaG9ydCBkZXN0aW5hdGlvbjsJLyogQ29tcGxldGUgZGVzdGluYXRpb24gKi8KKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGNoYXIgdW5pdDsJLyogRGVzdGluYXRpb24gdW5pdCAqLworCQkJdW5zaWduZWQgY2hhciBwb3J0OwkvKiBEZXN0aW5hdGlvbiBwb3J0ICovCisJCX0gczE7CisJfSB1MTsKKwl1bmlvbiB7CisJCXVzaG9ydCBzb3VyY2U7CS8qIENvbXBsZXRlIHNvdXJjZSAqLworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgY2hhciB1bml0OwkvKiBTb3VyY2UgdW5pdCAqLworCQkJdW5zaWduZWQgY2hhciBwb3J0OwkvKiBTb3VyY2UgcG9ydCAqLworCQl9IHMyOworCX0gdTI7CiAjZW5kaWYKICNpZmRlZiBJTktFUk5FTAotICAgICAgICAgICAgICAgICAgIEJZVEUgbGVuIDsKLSAgICAgICAgICAgICAgICAgICBCWVRFIGNvbnRyb2w7CisJQllURSBsZW47CisJQllURSBjb250cm9sOwogI2Vsc2UKLSAgICAgICAgICAgICAgICAgICB1bmlvbgotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCAgICAgIGNvbnRyb2w7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGNvbnRyb2w7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IHMzOwotICAgICAgICAgICAgICAgICAgICB9IHUzOworCXVuaW9uIHsKKwkJdXNob3J0IGNvbnRyb2w7CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBjaGFyIGxlbjsKKwkJCXVuc2lnbmVkIGNoYXIgY29udHJvbDsKKwkJfSBzMzsKKwl9IHUzOwogI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgQllURSAgICBkYXRhW1BLVF9NQVhfREFUQV9MRU5dIDsgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWN0dWFsIGRhdGEgOi0pICovCi0gICAgICAgICAgICAgICAgICAgV09SRCAgY3N1bSA7ICAgICAgICAgICAgICAgICAgLyogQy1TVU0gKi8KLSAgICAgICAgICAgICAgIH0gOworCUJZVEUgZGF0YVtQS1RfTUFYX0RBVEFfTEVOXTsKKwkvKiBBY3R1YWwgZGF0YSA6LSkgKi8KKwlXT1JEIGNzdW07CQkvKiBDLVNVTSAqLworfTsKICNlbmRpZgogCiAvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9wb2xsLmggYi9kcml2ZXJzL2NoYXIvcmlvL3BvbGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliOGU5OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL3BvbGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgotICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgUCBPIEwgTAotICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBBdXRob3IgIDogSWFuIE5hbmRocmEgLyBKZXJlbXkgUm9sbHMKLSBEYXRlICAgIDoKLQotICoKLSAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KLSAqCi0gKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSBWZXJzaW9uIDogMC4wMQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RzCi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBEYXRlICAgICBCeSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfcG9sbF9oCi0jZGVmaW5lIF9wb2xsX2gKLQotI2lmbmRlZiBsaW50Ci0jaWZkZWYgU0NDU19MQUJFTFMKLXN0YXRpYyBjaGFyICpfcmlvX3BvbGxfaF9zY2NzID0gIkAoIylwb2xsLmgJMS4yIiA7Ci0jZW5kaWYKLSNlbmRpZgotCi0KLSNpZmRlZiBIT1NUCi0jZGVmaW5lIFBPTExfU1RBQ0sgICAgICAgICAgICAxMDAKLSNlbmRpZgotI2lmZGVmIFJUQQotI2RlZmluZSBQT0xMX1NUQUNLICAgICAgICAgICAgMjAwCi0jZW5kaWYKLQotI2RlZmluZSBQT0xMX1BFUklPRCAgICAgICAgICAgKGludCkgU0VDT05ECi0KLS8qIFRoZSB2YXJpb3VzIHBvbGwgY29tbWFuZHMgKi8KLSNkZWZpbmUgUE9MTF9QT0xMICAgICAgICAgICAgIDAgICAgICAgICAgICAvKiBXZSBhcmUgY29ubmVjdGVkIGFuZCBoYXBweS4uICovCi0jZGVmaW5lIFBPTExfSU5UUk8gICAgICAgICAgICAxICAgICAgICAgICAgLyogSW50cm9kdWN0aW9uIHBhY2tldCAqLwotI2RlZmluZSBQT0xMX1RPUE9MT0dZICAgICAgICAgMiAgICAgICAgICAgIC8qIFRvcG9sb2d5IHVwZGF0ZSAqLwotI2RlZmluZSBQT0xMX0FTU0lHTiAgICAgICAgICAgMyAgICAgICAgICAgIC8qIElEIGFzc2lnbiAqLwotI2RlZmluZSBQT0xMX0ZPQUQgICAgICAgICAgICAgNCAgICAgICAgICAgIC8qIEYqKiogT2ZmIEFuZCBEaWUgKi8KLSNkZWZpbmUgUE9MTF9MTUQJICAgICAgNQkJICAgLyogTGV0IE1lIERpZSAqLwotI2RlZmluZSBQT0xMX0RZQgkgICAgICA2CQkgICAvKiBEaWUgWW91IEJhKioqKiogKi8KLQotLyogVGhlIHdheSBkYXRhIGZpZWxkcyBhcmUgc3BsaXQgdXAgZm9yIFBPTEwgcGFja2V0cyAqLwotI2RlZmluZSBQT0xMX0hPU1RfU0VSSUFMICAgICAgMiAgICAgICAgICAgIC8qIEhvc3Qgd2hvIGJvb3RlZCBtZSAqLwotI2RlZmluZSBQT0xMX01ZX1NFUklBTCAgICAgICAgNiAgICAgICAgICAgIC8qIE15IHNlcmlhbCBudW1iZXIgKi8KLSNkZWZpbmUgUE9MTF9ZT1VSX0lEICAgICAgICAgIDEgICAgICAgICAgICAvKiBZb3VyIElEIG51bWJlciAqLwotI2RlZmluZSBQT0xMX1RPUE9MT0dZX0ZJRUxEUyAgMiAgICAgICAgICAgIC8qIFRvcG9sb2d5IG1hcHMgKi8KLQotI2VuZGlmCi0KLS8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KLQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcG9ydC5oIGIvZHJpdmVycy9jaGFyL3Jpby9wb3J0LmgKaW5kZXggODUwNmFmMC4uYzk5YjFlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9wb3J0LmgKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9wb3J0LmgKQEAgLTQ2LDk2ICs0Niw5NCBAQAogKi8KIAogI2lmZGVmIFNUQVRTCi1zdHJ1Y3QgUklPU3RhdHMKLXsKK3N0cnVjdCBSSU9TdGF0cyB7CiAJLyoKLQkqKiBpbnRlcnJ1cHQgc3RhdGlzdGljcwotCSovCi0JdWludAlCcmVha0ludENudDsKLQl1aW50CU1vZGVtT2ZmQ250OwotCXVpbnQJTW9kZW1PbkNudDsKLQl1aW50CVJ4SW50Q250OwotCXVpbnQJVHhJbnRDbnQ7CisJICoqIGludGVycnVwdCBzdGF0aXN0aWNzCisJICovCisJdWludCBCcmVha0ludENudDsKKwl1aW50IE1vZGVtT2ZmQ250OworCXVpbnQgTW9kZW1PbkNudDsKKwl1aW50IFJ4SW50Q250OworCXVpbnQgVHhJbnRDbnQ7CiAJLyoKLQkqKiB0aHJvdWdocHV0IHN0YXRpc3RpY3MKLQkqLwotCXVpbnQJUnhDaGFyQ250OwotCXVpbnQJUnhQa3RDbnQ7Ci0JdWludAlSeFNhdmVDbnQ7Ci0JdWludAlUeENoYXJDbnQ7Ci0JdWludAlUeFBrdENudDsKKwkgKiogdGhyb3VnaHB1dCBzdGF0aXN0aWNzCisJICovCisJdWludCBSeENoYXJDbnQ7CisJdWludCBSeFBrdENudDsKKwl1aW50IFJ4U2F2ZUNudDsKKwl1aW50IFR4Q2hhckNudDsKKwl1aW50IFR4UGt0Q250OwogCS8qCi0JKiogZHJpdmVyIGVudHJ5IHN0YXRpc3RpY3MKLQkqLwotCXVpbnQJQ2xvc2VDbnQ7Ci0JdWludAlJb2N0bENudDsKLQl1aW50CU9wZW5DbnQ7Ci0JdWludAlSZWFkQ250OwotCXVpbnQJV3JpdGVDbnQ7CisJICoqIGRyaXZlciBlbnRyeSBzdGF0aXN0aWNzCisJICovCisJdWludCBDbG9zZUNudDsKKwl1aW50IElvY3RsQ250OworCXVpbnQgT3BlbkNudDsKKwl1aW50IFJlYWRDbnQ7CisJdWludCBXcml0ZUNudDsKIAkvKgotCSoqIHByb2Mgc3RhdGlzdGljcwotCSovCi0JdWludAlCbG9ja0NudDsKLQl1aW50CU91dHB1dENudDsKLQl1aW50CVJlc3VtZUNudDsKLQl1aW50CVJmbHVzaENudDsKLQl1aW50CVN1c3BlbmRDbnQ7Ci0JdWludAlUYnJlYWtDbnQ7Ci0JdWludAlUaW1lb3V0Q250OwotCXVpbnQJVW5ibG9ja0NudDsKLQl1aW50CVdmbHVzaENudDsKLQl1aW50CVdGQm9kZ2VDbnQ7CisJICoqIHByb2Mgc3RhdGlzdGljcworCSAqLworCXVpbnQgQmxvY2tDbnQ7CisJdWludCBPdXRwdXRDbnQ7CisJdWludCBSZXN1bWVDbnQ7CisJdWludCBSZmx1c2hDbnQ7CisJdWludCBTdXNwZW5kQ250OworCXVpbnQgVGJyZWFrQ250OworCXVpbnQgVGltZW91dENudDsKKwl1aW50IFVuYmxvY2tDbnQ7CisJdWludCBXZmx1c2hDbnQ7CisJdWludCBXRkJvZGdlQ250OwogfTsKICNlbmRpZgogCiAvKgogKioJUG9ydCBkYXRhIHN0cnVjdHVyZQogKi8KLXN0cnVjdAlQb3J0Ci17Ci0gIHN0cnVjdCBnc19wb3J0IGdzOyAKLSAgaW50CQkJCVBvcnROdW07CS8qIFJJTyBwb3J0IG5vLiwgMC01MTEgKi8KLSAgc3RydWN0IEhvc3QJKkhvc3RQOwotICB2b2xhdGlsZSBjYWRkcl90CQlDYWRkcjsKLSAgdXNob3J0CQkJSG9zdFBvcnQ7ICAvKiBQb3J0IG51bWJlciBvbiBob3N0IGNhcmQgKi8KLSAgdWNoYXIJCQlSdXBOdW07CS8qIE51bWJlciBvZiBSVVAgZm9yIHBvcnQgKi8KLSAgdWNoYXIJCQlJRDI7CS8qIFNlY29uZCBJRCBvZiBSVEEgZm9yIHBvcnQgKi8KLSAgdWxvbmcJCQlTdGF0ZTsJLyogRkxBR1MgZm9yIG9wZW4gJiB4b3BlbiAqLwotI2RlZmluZQlSSU9fTE9QRU4JMHgwMDAwMQkJLyogTG9jYWwgb3BlbiAqLwotI2RlZmluZQlSSU9fTU9QRU4JMHgwMDAwMgkJLyogTW9kZW0gb3BlbiAqLwotI2RlZmluZQlSSU9fV09QRU4JMHgwMDAwNAkJLyogV2FpdGluZyBmb3Igb3BlbiAqLwotI2RlZmluZQlSSU9fQ0xPU0lORwkweDAwMDA4CQkvKiBUaGUgcG9ydCBpcyBiZWluZyBjbG9zZSAqLwotI2RlZmluZQlSSU9fWFBCVVNZCTB4MDAwMTAJCS8qIFRyYW5zcGFyZW50IHByaW50ZXIgYnVzeSAqLwotI2RlZmluZQlSSU9fQlJFQUtJTkcJMHgwMDAyMAkJLyogQnJlYWsgaW4gcHJvZ3Jlc3MgKi8KLSNkZWZpbmUJUklPX0RJUkVDVAkweDAwMDQwCQkvKiBEb2luZyBEaXJlY3Qgb3V0cHV0ICovCi0jZGVmaW5lCVJJT19FWENMVVNJVkUJMHgwMDA4MAkJLyogU3RyZWFtIG9wZW4gZm9yIGV4Y2x1c2l2ZSB1c2UgKi8KLSNkZWZpbmUJUklPX05ERUxBWQkweDAwMTAwCQkvKiBTdHJlYW0gaXMgb3BlbiBGTkRFTEFZICovCi0jZGVmaW5lCVJJT19DQVJSX09OCTB4MDAyMDAJCS8qIFN0cmVhbSBoYXMgY2FycmllciBwcmVzZW50ICovCi0jZGVmaW5lCVJJT19YUFdBTlRSCTB4MDA0MDAJCS8qIFN0cmVhbSB3YW50ZWQgYnkgWHByaW50ICovCi0jZGVmaW5lCVJJT19SQkxLCTB4MDA4MDAJCS8qIFN0cmVhbSBpcyByZWFkLWJsb2NrZWQgKi8KLSNkZWZpbmUJUklPX0JVU1kJMHgwMTAwMAkJLyogU3RyZWFtIGlzIEJVU1kgZm9yIHdyaXRlICovCi0jZGVmaW5lCVJJT19USU1FT1VUCTB4MDIwMDAJCS8qIFN0cmVhbSB0aW1lb3V0IGluIHByb2dyZXNzICovCi0jZGVmaW5lCVJJT19UWFNUT1AJMHgwNDAwMAkJLyogU3RyZWFtIG91dHB1dCBpcyBzdG9wcGVkICovCi0jZGVmaW5lCVJJT19XQUlURkxVU0gJMHgwODAwMAkJLyogU3RyZWFtIHdhaXRpbmcgZm9yIGZsdXNoICovCi0jZGVmaW5lCVJJT19EWU5PUk9ECTB4MTAwMDAJCS8qIERyYWluIGZhaWxlZCAqLwotI2RlZmluZQlSSU9fREVMRVRFRAkweDIwMDAwCQkvKiBSVEEgaGFzIGJlZW4gZGVsZXRlZCAqLwotI2RlZmluZSBSSU9fSVNTQ0FOQ09ERQkweDQwMDAwCQkvKiBUaGlzIGxpbmUgaXMgaW4gc2NhbmNvZGUgbW9kZSAqLworc3RydWN0IFBvcnQgeworCXN0cnVjdCBnc19wb3J0IGdzOworCWludCBQb3J0TnVtOwkJLyogUklPIHBvcnQgbm8uLCAwLTUxMSAqLworCXN0cnVjdCBIb3N0ICpIb3N0UDsKKwl2b2xhdGlsZSBjYWRkcl90IENhZGRyOworCXVzaG9ydCBIb3N0UG9ydDsJLyogUG9ydCBudW1iZXIgb24gaG9zdCBjYXJkICovCisJdWNoYXIgUnVwTnVtOwkJLyogTnVtYmVyIG9mIFJVUCBmb3IgcG9ydCAqLworCXVjaGFyIElEMjsJCS8qIFNlY29uZCBJRCBvZiBSVEEgZm9yIHBvcnQgKi8KKwl1bG9uZyBTdGF0ZTsJCS8qIEZMQUdTIGZvciBvcGVuICYgeG9wZW4gKi8KKyNkZWZpbmUJUklPX0xPUEVOCTB4MDAwMDEJLyogTG9jYWwgb3BlbiAqLworI2RlZmluZQlSSU9fTU9QRU4JMHgwMDAwMgkvKiBNb2RlbSBvcGVuICovCisjZGVmaW5lCVJJT19XT1BFTgkweDAwMDA0CS8qIFdhaXRpbmcgZm9yIG9wZW4gKi8KKyNkZWZpbmUJUklPX0NMT1NJTkcJMHgwMDAwOAkvKiBUaGUgcG9ydCBpcyBiZWluZyBjbG9zZSAqLworI2RlZmluZQlSSU9fWFBCVVNZCTB4MDAwMTAJLyogVHJhbnNwYXJlbnQgcHJpbnRlciBidXN5ICovCisjZGVmaW5lCVJJT19CUkVBS0lORwkweDAwMDIwCS8qIEJyZWFrIGluIHByb2dyZXNzICovCisjZGVmaW5lCVJJT19ESVJFQ1QJMHgwMDA0MAkvKiBEb2luZyBEaXJlY3Qgb3V0cHV0ICovCisjZGVmaW5lCVJJT19FWENMVVNJVkUJMHgwMDA4MAkvKiBTdHJlYW0gb3BlbiBmb3IgZXhjbHVzaXZlIHVzZSAqLworI2RlZmluZQlSSU9fTkRFTEFZCTB4MDAxMDAJLyogU3RyZWFtIGlzIG9wZW4gRk5ERUxBWSAqLworI2RlZmluZQlSSU9fQ0FSUl9PTgkweDAwMjAwCS8qIFN0cmVhbSBoYXMgY2FycmllciBwcmVzZW50ICovCisjZGVmaW5lCVJJT19YUFdBTlRSCTB4MDA0MDAJLyogU3RyZWFtIHdhbnRlZCBieSBYcHJpbnQgKi8KKyNkZWZpbmUJUklPX1JCTEsJMHgwMDgwMAkvKiBTdHJlYW0gaXMgcmVhZC1ibG9ja2VkICovCisjZGVmaW5lCVJJT19CVVNZCTB4MDEwMDAJLyogU3RyZWFtIGlzIEJVU1kgZm9yIHdyaXRlICovCisjZGVmaW5lCVJJT19USU1FT1VUCTB4MDIwMDAJLyogU3RyZWFtIHRpbWVvdXQgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUJUklPX1RYU1RPUAkweDA0MDAwCS8qIFN0cmVhbSBvdXRwdXQgaXMgc3RvcHBlZCAqLworI2RlZmluZQlSSU9fV0FJVEZMVVNICTB4MDgwMDAJLyogU3RyZWFtIHdhaXRpbmcgZm9yIGZsdXNoICovCisjZGVmaW5lCVJJT19EWU5PUk9ECTB4MTAwMDAJLyogRHJhaW4gZmFpbGVkICovCisjZGVmaW5lCVJJT19ERUxFVEVECTB4MjAwMDAJLyogUlRBIGhhcyBiZWVuIGRlbGV0ZWQgKi8KKyNkZWZpbmUgUklPX0lTU0NBTkNPREUJMHg0MDAwMAkvKiBUaGlzIGxpbmUgaXMgaW4gc2NhbmNvZGUgbW9kZSAqLwogI2RlZmluZQlSSU9fVVNJTkdfRVVDCTB4MTAwMDAwCS8qIFVzaW5nIGV4dGVuZGVkIFVuaXggY2hhcnMgKi8KICNkZWZpbmUJUklPX0NBTl9DT09LCTB4MjAwMDAwCS8qIFRoaXMgbGluZSBjYW4gZG8gY29va2luZyAqLwotI2RlZmluZSBSSU9fVFJJQURfTU9ERSAgMHg0MDAwMDAgICAgICAgIC8qIEVuYWJsZSBUUklBRCBzcGVjaWFsIG9wcy4gKi8KLSNkZWZpbmUgUklPX1RSSUFEX0JMT0NLIDB4ODAwMDAwICAgICAgICAvKiBOZXh0IHJlYWQgd2lsbCBibG9jayAqLwotI2RlZmluZSBSSU9fVFJJQURfRlVOQyAgMHgxMDAwMDAwICAgICAgIC8qIFNlZW4gYSBmdW5jdGlvbiBrZXkgY29taW5nIGluICovCi0jZGVmaW5lIFJJT19USFJPVFRMRV9SWCAweDIwMDAwMDAgICAgICAgLyogUlggbmVlZHMgdG8gYmUgdGhyb3R0bGVkLiAqLworI2RlZmluZSBSSU9fVFJJQURfTU9ERSAgMHg0MDAwMDAJLyogRW5hYmxlIFRSSUFEIHNwZWNpYWwgb3BzLiAqLworI2RlZmluZSBSSU9fVFJJQURfQkxPQ0sgMHg4MDAwMDAJLyogTmV4dCByZWFkIHdpbGwgYmxvY2sgKi8KKyNkZWZpbmUgUklPX1RSSUFEX0ZVTkMgIDB4MTAwMDAwMAkvKiBTZWVuIGEgZnVuY3Rpb24ga2V5IGNvbWluZyBpbiAqLworI2RlZmluZSBSSU9fVEhST1RUTEVfUlggMHgyMDAwMDAwCS8qIFJYIG5lZWRzIHRvIGJlIHRocm90dGxlZC4gKi8KIAotICAgIHVsb25nCQkJQ29uZmlnOwkvKiBGTEFHUyBmb3IgTk9SRUFELi4uLiAqLwotI2RlZmluZQlSSU9fTk9SRUFECTB4MDAwMQkJLyogQXJlIG5vdCBhbGxvd2VkIHRvIHJlYWQgcG9ydCAqLwotI2RlZmluZQlSSU9fTk9XUklURQkweDAwMDIJCS8qIEFyZSBub3QgYWxsb3dlZCB0byB3cml0ZSBwb3J0ICovCi0jZGVmaW5lCVJJT19OT1hQUklOVAkweDAwMDQJCS8qIEFyZSBub3QgYWxsb3dlZCB0byB4cHJpbnQgcG9ydCAqLwotI2RlZmluZQlSSU9fTk9NQVNLCTB4MDAwNwkJLyogQWxsIG5vdCBhbGxvd2VkIHRoaW5ncyAqLwotI2RlZmluZSBSSU9fSVhBTlkJMHgwMDA4ICAgICAgICAgIC8qIFBvcnQgaXMgYWxsb3dlZCBpeGFueSAqLwotI2RlZmluZQlSSU9fTU9ERU0JMHgwMDEwCQkvKiBTdHJlYW0gaXMgYSBtb2RlbSBkZXZpY2UgKi8KLSNkZWZpbmUJUklPX0lYT04JMHgwMDIwCQkvKiBQb3J0IGlzIGFsbG93ZWQgaXhvbiAqLwotI2RlZmluZSBSSU9fV0FJVERSQUlOCTB4MDA0MAkJLyogV2FpdCBmb3IgcG9ydCB0byBjb21wbGV0ZWx5IGRyYWluICovCisJdWxvbmcgQ29uZmlnOwkJLyogRkxBR1MgZm9yIE5PUkVBRC4uLi4gKi8KKyNkZWZpbmUJUklPX05PUkVBRAkweDAwMDEJLyogQXJlIG5vdCBhbGxvd2VkIHRvIHJlYWQgcG9ydCAqLworI2RlZmluZQlSSU9fTk9XUklURQkweDAwMDIJLyogQXJlIG5vdCBhbGxvd2VkIHRvIHdyaXRlIHBvcnQgKi8KKyNkZWZpbmUJUklPX05PWFBSSU5UCTB4MDAwNAkvKiBBcmUgbm90IGFsbG93ZWQgdG8geHByaW50IHBvcnQgKi8KKyNkZWZpbmUJUklPX05PTUFTSwkweDAwMDcJLyogQWxsIG5vdCBhbGxvd2VkIHRoaW5ncyAqLworI2RlZmluZSBSSU9fSVhBTlkJMHgwMDA4CS8qIFBvcnQgaXMgYWxsb3dlZCBpeGFueSAqLworI2RlZmluZQlSSU9fTU9ERU0JMHgwMDEwCS8qIFN0cmVhbSBpcyBhIG1vZGVtIGRldmljZSAqLworI2RlZmluZQlSSU9fSVhPTgkweDAwMjAJLyogUG9ydCBpcyBhbGxvd2VkIGl4b24gKi8KKyNkZWZpbmUgUklPX1dBSVREUkFJTgkweDAwNDAJLyogV2FpdCBmb3IgcG9ydCB0byBjb21wbGV0ZWx5IGRyYWluICovCiAjZGVmaW5lIFJJT19NQVBfNTBfVE9fNTAJMHgwMDgwCS8qIE1hcCA1MCBiYXVkIHRvIDUwIGJhdWQgKi8KICNkZWZpbmUgUklPX01BUF8xMTBfVE9fMTEwCTB4MDEwMAkvKiBNYXAgMTEwIGJhdWQgdG8gMTEwIGJhdWQgKi8KIApAQCAtMTQ0LDkyICsxNDIsOTAgQEAKICoqIEFzIEx5bnhPUyBkb2VzIG5vdCBhcHBlYXIgdG8gc3VwcG9ydCBIYXJkd2FyZSBGbG93IENvbnRyb2wgLi4uLi4KICoqIERlZmluZSBvdXIgb3duIGZsb3cgY29udHJvbCBmbGFncyBpbiAnQ29uZmlnJy4KICovCi0jZGVmaW5lIFJJT19DVFNGTE9XCTB4MDIwMAkJLyogUklPJ3Mgb3duIENUU0ZMT1cgZmxhZyAqLwotI2RlZmluZSBSSU9fUlRTRkxPVwkweDA0MDAJCS8qIFJJTydzIG93biBSVFNGTE9XIGZsYWcgKi8KKyNkZWZpbmUgUklPX0NUU0ZMT1cJMHgwMjAwCS8qIFJJTydzIG93biBDVFNGTE9XIGZsYWcgKi8KKyNkZWZpbmUgUklPX1JUU0ZMT1cJMHgwNDAwCS8qIFJJTydzIG93biBSVFNGTE9XIGZsYWcgKi8KIAogCi0gICAgc3RydWN0IFBIQgkJCSpQaGJQOwkgIC8qIHBvaW50ZXIgdG8gUEhCIGZvciBwb3J0ICovCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICpUeEFkZDsgICAvKiBBZGQgcGFja2V0cyBoZXJlICovCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICpUeFN0YXJ0OyAvKiBTdGFydCBvZiBhZGQgYXJyYXkgKi8KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgKlR4RW5kOyAgICAgICAgIC8qIEVuZCBvZiBhZGQgYXJyYXkgKi8KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgKlJ4UmVtb3ZlOyAgICAgIC8qIFJlbW92ZSBwYWNrZXRzIGhlcmUgKi8KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgKlJ4U3RhcnQ7ICAgICAgIC8qIFN0YXJ0IG9mIHJlbW92ZSBhcnJheSAqLwotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAqUnhFbmQ7ICAgICAgICAgLyogRW5kIG9mIHJlbW92ZSBhcnJheSAqLwotICAgIHVpbnQJCQlSdGFVbmlxdWVOdW07CS8qIFVuaXF1ZSBudW1iZXIgb2YgUlRBICovCi0gICAgdXNob3J0CQkJUG9ydFN0YXRlOwkvKiBzdGF0dXMgb2YgcG9ydCAqLwotICAgIHVzaG9ydAkJCU1vZGVtU3RhdGU7CS8qIHN0YXR1cyBvZiBtb2RlbSBsaW5lcyAqLwotICAgIHVsb25nCQkJTW9kZW1MaW5lczsJLyogTW9kZW0gYml0cyBzZW50IHRvIFJUQSAqLwotICAgIHVjaGFyCQkJQ29va01vZGU7CS8qIHdobyBleHBhbmRzIENSL0xGPyAqLwotICAgIHVjaGFyCQkJUGFyYW1TZW07CS8qIFByZXZlbnQgd3JpdGUgZHVyaW5nIHBhcmFtICovCi0gICAgdWNoYXIJCQlNYXBwZWQ7CQkvKiBpZiBwb3J0IG1hcHBlZCBvbnRvIGhvc3QgKi8KLSAgICB1Y2hhcgkJCVNlY29uZEJsb2NrOwkvKiBpZiBwb3J0IGJlbG9uZ3MgdG8gMm5kIGJsb2NrCi0JCQkJCQkgICBvZiAxNiBwb3J0IFJUQSAqLwotICAgIHVjaGFyCQkJSW5Vc2U7CQkvKiBob3cgbWFueSBwcmUtZW1wdGl2ZSBjbWRzICovCi0gICAgdWNoYXIJCQlMb2NrOwkJLyogaWYgcGFyYW1zIGxvY2tlZCAqLwotICAgIHVjaGFyCQkJU3RvcmU7CS8qIGlmIHBhcmFtcyBzdG9yZWQgYWNyb3NzIGNsb3NlcyAqLwotICAgIHVjaGFyCQkJRmlyc3RPcGVuOyAvKiBUUlVFIGlmIGZpcnN0IHRpbWUgcG9ydCBvcGVuZWQgKi8KLSAgICB1Y2hhcgkJCUZsdXNoQ21kQm9kZ2U7CS8qIGlmIGRvaW5nIGEgKG5vbilmbHVzaCAqLwotICAgIHVjaGFyCQkJTWFnaWNGbGFnczsJLyogcmVxdWlyZSBpbnRyIHByb2Nlc3NpbmcgKi8KKwlzdHJ1Y3QgUEhCICpQaGJQOwkvKiBwb2ludGVyIHRvIFBIQiBmb3IgcG9ydCAqLworCVdPUkQgKlR4QWRkOwkJLyogQWRkIHBhY2tldHMgaGVyZSAqLworCVdPUkQgKlR4U3RhcnQ7CQkvKiBTdGFydCBvZiBhZGQgYXJyYXkgKi8KKwlXT1JEICpUeEVuZDsJCS8qIEVuZCBvZiBhZGQgYXJyYXkgKi8KKwlXT1JEICpSeFJlbW92ZTsJCS8qIFJlbW92ZSBwYWNrZXRzIGhlcmUgKi8KKwlXT1JEICpSeFN0YXJ0OwkJLyogU3RhcnQgb2YgcmVtb3ZlIGFycmF5ICovCisJV09SRCAqUnhFbmQ7CQkvKiBFbmQgb2YgcmVtb3ZlIGFycmF5ICovCisJdWludCBSdGFVbmlxdWVOdW07CS8qIFVuaXF1ZSBudW1iZXIgb2YgUlRBICovCisJdXNob3J0IFBvcnRTdGF0ZTsJLyogc3RhdHVzIG9mIHBvcnQgKi8KKwl1c2hvcnQgTW9kZW1TdGF0ZTsJLyogc3RhdHVzIG9mIG1vZGVtIGxpbmVzICovCisJdWxvbmcgTW9kZW1MaW5lczsJLyogTW9kZW0gYml0cyBzZW50IHRvIFJUQSAqLworCXVjaGFyIENvb2tNb2RlOwkJLyogd2hvIGV4cGFuZHMgQ1IvTEY/ICovCisJdWNoYXIgUGFyYW1TZW07CQkvKiBQcmV2ZW50IHdyaXRlIGR1cmluZyBwYXJhbSAqLworCXVjaGFyIE1hcHBlZDsJCS8qIGlmIHBvcnQgbWFwcGVkIG9udG8gaG9zdCAqLworCXVjaGFyIFNlY29uZEJsb2NrOwkvKiBpZiBwb3J0IGJlbG9uZ3MgdG8gMm5kIGJsb2NrCisJCQkJICAgb2YgMTYgcG9ydCBSVEEgKi8KKwl1Y2hhciBJblVzZTsJCS8qIGhvdyBtYW55IHByZS1lbXB0aXZlIGNtZHMgKi8KKwl1Y2hhciBMb2NrOwkJLyogaWYgcGFyYW1zIGxvY2tlZCAqLworCXVjaGFyIFN0b3JlOwkJLyogaWYgcGFyYW1zIHN0b3JlZCBhY3Jvc3MgY2xvc2VzICovCisJdWNoYXIgRmlyc3RPcGVuOwkvKiBUUlVFIGlmIGZpcnN0IHRpbWUgcG9ydCBvcGVuZWQgKi8KKwl1Y2hhciBGbHVzaENtZEJvZGdlOwkvKiBpZiBkb2luZyBhIChub24pZmx1c2ggKi8KKwl1Y2hhciBNYWdpY0ZsYWdzOwkvKiByZXF1aXJlIGludHIgcHJvY2Vzc2luZyAqLwogI2RlZmluZQlNQUdJQ19GTFVTSAkweDAxCS8qIG1pcnJvciBvZiBXZmx1c2hGbGFnICovCiAjZGVmaW5lCU1BR0lDX1JFQk9PVAkweDAyCS8qIFJUQSByZS1ib290ZWQsIHJlLW9wZW4gcG9ydHMgKi8KICNkZWZpbmUJTU9SRV9PVVRQVVRfRVlHT1IgMHgwNAkvKiByaW90cHJvYyBmYWlsZWQgdG8gZW1wdHkgY2xpc3RzICovCi0gICAgdWNoYXIJCQlXZmx1c2hGbGFnOwkvKiAxIEhvdyBtYW55IFdGTFVTSHMgYWN0aXZlICovCisJdWNoYXIgV2ZsdXNoRmxhZzsJLyogMSBIb3cgbWFueSBXRkxVU0hzIGFjdGl2ZSAqLwogLyoKICoqIFRyYW5zcGFyZW50IHByaW50IHN0dWZmCiAqLwotICAgIHN0cnVjdCBYcHJpbnQKLSAgICB7CisJc3RydWN0IFhwcmludCB7CiAjaWZuZGVmIE1BWF9YUF9DVFJMX0xFTgotI2RlZmluZSBNQVhfWFBfQ1RSTF9MRU4JCTE2CQkvKiBBTFNPIElOIERBRU1PTi5IICovCisjZGVmaW5lIE1BWF9YUF9DVFJMX0xFTgkJMTYJLyogQUxTTyBJTiBEQUVNT04uSCAqLwogI2VuZGlmCi0JdWludAkJCVhwQ3BzOwotCWNoYXIJCQlYcE9uW01BWF9YUF9DVFJMX0xFTl07Ci0JY2hhcgkJCVhwT2ZmW01BWF9YUF9DVFJMX0xFTl07Ci0JdXNob3J0CQkJWHBMZW47CQkvKiBzdHJsZW4oWHBPbikrc3RybGVuKFhwT2ZmKSAqLwotCXVjaGFyCQkJWHBBY3RpdmU7Ci0JdWNoYXIJCQlYcExhc3RUaWNrT2s7CS8qIFRSVUUgaWYgd2UgY2FuIHByb2Nlc3MgKi8KKwkJdWludCBYcENwczsKKwkJY2hhciBYcE9uW01BWF9YUF9DVFJMX0xFTl07CisJCWNoYXIgWHBPZmZbTUFYX1hQX0NUUkxfTEVOXTsKKwkJdXNob3J0IFhwTGVuOwkvKiBzdHJsZW4oWHBPbikrc3RybGVuKFhwT2ZmKSAqLworCQl1Y2hhciBYcEFjdGl2ZTsKKwkJdWNoYXIgWHBMYXN0VGlja09rOwkvKiBUUlVFIGlmIHdlIGNhbiBwcm9jZXNzICovCiAjZGVmaW5lCVhQX09QRU4JCTAwMDAxCiAjZGVmaW5lCVhQX1JVTkFCTEUJMDAwMDIKLQlzdHJ1Y3QgdHR5c3RhdGljcyAJCSpYdHR5UDsKLSAgICB9IFhwcmludDsKKwkJc3RydWN0IHR0eXN0YXRpY3MgKlh0dHlQOworCX0gWHByaW50OwogI2lmZGVmIFZQSVgKLSAgICB2ODZfdAkJCSpTdGFzaFA7Ci0gICAgdWludAkJCUludE1hc2s7Ci0gICAgc3RydWN0IHRlcm1zcyAJCVZwaXhTczsKLSAgICB1Y2hhcgkJCU1vZGVtU3RhdHVzUmVnOwkvKiBNb2RlbSBzdGF0dXMgcmVnaXN0ZXIgKi8KKwl2ODZfdCAqU3Rhc2hQOworCXVpbnQgSW50TWFzazsKKwlzdHJ1Y3QgdGVybXNzIFZwaXhTczsKKwl1Y2hhciBNb2RlbVN0YXR1c1JlZzsJLyogTW9kZW0gc3RhdHVzIHJlZ2lzdGVyICovCiAjZW5kaWYKLSAgICB1Y2hhcgkJCVJ4RGF0YVN0YXJ0OwotICAgIHVjaGFyCQkJQ29yMkNvcHk7CS8qIGNvcHkgb2YgQ09SMiAqLwotICAgIGNoYXIJCQkqTmFtZTsJCS8qIHBvaW50cyB0byB0aGUgUnRhJ3MgbmFtZSAqLworCXVjaGFyIFJ4RGF0YVN0YXJ0OworCXVjaGFyIENvcjJDb3B5OwkJLyogY29weSBvZiBDT1IyICovCisJY2hhciAqTmFtZTsJCS8qIHBvaW50cyB0byB0aGUgUnRhJ3MgbmFtZSAqLwogI2lmZGVmIFNUQVRTCi0gICAgc3RydWN0IFJJT1N0YXRzIAkJU3RhdDsJCS8qIHBvcnRzIHN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3QgUklPU3RhdHMgU3RhdDsJLyogcG9ydHMgc3RhdGlzdGljcyAqLwogI2VuZGlmCi0gICAgY2hhcgkJCSpUeFJpbmdCdWZmZXI7Ci0gICAgdXNob3J0CQkJVHhCdWZmZXJJbjsJLyogTmV3IGRhdGEgYXJyaXZlcyBoZXJlICovCi0gICAgdXNob3J0CQkJVHhCdWZmZXJPdXQ7CS8qIEludHIgcmVtb3ZlcyBkYXRhIGhlcmUgKi8KLSAgICB1c2hvcnQJCQlPbGRUeEJ1ZmZlck91dDsJLyogSW5kaWNhdGVzIGlmIGRyYWluaW5nICovCi0gICAgaW50CQkJCVRpbWVvdXRJZDsJLyogVGltZW91dCBJRCAqLwotICAgIHVpbnQJCQlEZWJ1ZzsKLSAgICB1Y2hhcgkJCVdhaXRVbnRpbEJvb3RlZDsgLyogVHJ1ZSBpZiBvcGVuIHNob3VsZCBibG9jayAqLwotICAgIHVpbnQJCQlzdGF0c0dhdGhlcjsJLyogVHJ1ZSBpZiBnYXRoZXJpbmcgc3RhdHMgKi8KLSAgICB1bG9uZwkJCXR4Y2hhcnM7CS8qIENoYXJzIHRyYW5zbWl0dGVkICovCi0gICAgdWxvbmcJCQlyeGNoYXJzOwkvKiBDaGFycyByZWNlaXZlZCAqLwotICAgIHVsb25nCQkJb3BlbnM7CQkvKiBwb3J0IG9wZW4gY291bnQgKi8KLSAgICB1bG9uZwkJCWNsb3NlczsJCS8qIHBvcnQgY2xvc2UgY291bnQgKi8KLSAgICB1bG9uZwkJCWlvY3RsczsJCS8qIGlvY3RsIGNvdW50ICovCi0gICAgdWNoYXIJCQlMYXN0UnhUZ2w7CS8qIExhc3Qgc3RhdGUgb2YgcnggdG9nZ2xlIGJpdCAqLwotICBzcGlubG9ja190CQkJCXBvcnRTZW07CS8qIExvY2sgdXNpbmcgdGhpcyBzZW0gKi8KLQlpbnQJCQkJTW9uaXRvclRzdGF0ZTsJLyogTW9uaXRvcmluZyA/ICovCi0JaW50CQkJCXRpbWVvdXRfaWQ7CS8qIEZvciBjYWxsaW5nIDEwMCBtcyBkZWxheXMgKi8KLQlpbnQJCQkJdGltZW91dF9zZW07LyogRm9yIGNhbGxpbmcgMTAwIG1zIGRlbGF5cyAqLwotCWludAkJCQlmaXJzdE9wZW47CS8qIEZpcnN0IHRpbWUgb3BlbiA/ICovCi0JY2hhciAqCQkJcDsJCQkvKiBzYXZlIHRoZSBnbG9iYWwgc3RydWMgaGVyZSAuLiAqLworCWNoYXIgKlR4UmluZ0J1ZmZlcjsKKwl1c2hvcnQgVHhCdWZmZXJJbjsJLyogTmV3IGRhdGEgYXJyaXZlcyBoZXJlICovCisJdXNob3J0IFR4QnVmZmVyT3V0OwkvKiBJbnRyIHJlbW92ZXMgZGF0YSBoZXJlICovCisJdXNob3J0IE9sZFR4QnVmZmVyT3V0OwkvKiBJbmRpY2F0ZXMgaWYgZHJhaW5pbmcgKi8KKwlpbnQgVGltZW91dElkOwkJLyogVGltZW91dCBJRCAqLworCXVpbnQgRGVidWc7CisJdWNoYXIgV2FpdFVudGlsQm9vdGVkOwkvKiBUcnVlIGlmIG9wZW4gc2hvdWxkIGJsb2NrICovCisJdWludCBzdGF0c0dhdGhlcjsJLyogVHJ1ZSBpZiBnYXRoZXJpbmcgc3RhdHMgKi8KKwl1bG9uZyB0eGNoYXJzOwkJLyogQ2hhcnMgdHJhbnNtaXR0ZWQgKi8KKwl1bG9uZyByeGNoYXJzOwkJLyogQ2hhcnMgcmVjZWl2ZWQgKi8KKwl1bG9uZyBvcGVuczsJCS8qIHBvcnQgb3BlbiBjb3VudCAqLworCXVsb25nIGNsb3NlczsJCS8qIHBvcnQgY2xvc2UgY291bnQgKi8KKwl1bG9uZyBpb2N0bHM7CQkvKiBpb2N0bCBjb3VudCAqLworCXVjaGFyIExhc3RSeFRnbDsJLyogTGFzdCBzdGF0ZSBvZiByeCB0b2dnbGUgYml0ICovCisJc3BpbmxvY2tfdCBwb3J0U2VtOwkvKiBMb2NrIHVzaW5nIHRoaXMgc2VtICovCisJaW50IE1vbml0b3JUc3RhdGU7CS8qIE1vbml0b3JpbmcgPyAqLworCWludCB0aW1lb3V0X2lkOwkJLyogRm9yIGNhbGxpbmcgMTAwIG1zIGRlbGF5cyAqLworCWludCB0aW1lb3V0X3NlbTsJLyogRm9yIGNhbGxpbmcgMTAwIG1zIGRlbGF5cyAqLworCWludCBmaXJzdE9wZW47CQkvKiBGaXJzdCB0aW1lIG9wZW4gPyAqLworCWNoYXIgKnA7CQkvKiBzYXZlIHRoZSBnbG9iYWwgc3RydWMgaGVyZSAuLiAqLwogfTsKIAotc3RydWN0IE1vZHVsZUluZm8KLXsKLQljaGFyCSpOYW1lOwotCXVpbnQJRmxhZ3NbNF07CS8qIG9uZSBwZXIgcG9ydCBvbiBhIG1vZHVsZSAqLworc3RydWN0IE1vZHVsZUluZm8geworCWNoYXIgKk5hbWU7CisJdWludCBGbGFnc1s0XTsJCS8qIG9uZSBwZXIgcG9ydCBvbiBhIG1vZHVsZSAqLwogfTsKICNlbmRpZgogCkBAIC0yMzgsOCArMjM0LDggQEAKICoqIHJ1bnMgaW50byBwcm9ibGVtcyB3aXRoIGRpZmZlcmluZyBzdHJ1Y3Qgc2l6ZXMgYmV0d2VlbiBkcml2ZXIgYW5kIGNvbmZpZy4KICovCiBzdHJ1Y3QgUG9ydFBhcmFtcyB7Ci0JdWludAlQb3J0OwotCXVsb25nCUNvbmZpZzsKLQl1bG9uZwlTdGF0ZTsKLQlzdHJ1Y3QgdHR5c3RhdGljcwkqVHR5UDsKKwl1aW50IFBvcnQ7CisJdWxvbmcgQ29uZmlnOworCXVsb25nIFN0YXRlOworCXN0cnVjdCB0dHlzdGF0aWNzICpUdHlQOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcHJvdG8uaCBiL2RyaXZlcnMvY2hhci9yaW8vcHJvdG8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmZjBlZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL3Byb3RvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoKLSAqCi0gKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCi0gKgotICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0jaWZuZGVmCV9wcm90b3R5cGVzX2gKLSNkZWZpbmUgX3Byb3RvdHlwZXNfaAotCi0KLS8qCi0qKiBib290LmMKLSovCi12b2lkIGluaXRfYm9vdCggY2hhciAqcCwgc2hvcnQgc3RhZ2UpOwotCi0vKgotKiogZGlzY29uY3QuYwotKi8KLXZvaWQga2lsbF9ib290ICggTFBCICpsaW5rICk7Ci12b2lkIGRpc2Nvbm5lY3RlZCggTFBCICpsaW5rICk7Ci1zaG9ydCBib290XzMoIExQQiAqbGluaywgUEtUICpwa3QgKTsKLXNob3J0IHNlbmRfM19wa3QoIExQQiAqbGluaywgUEtUICpwa3QpOwotCi0vKgotKiogZXJyb3IuYwotKi8KLXZvaWQgZHVfZXJyb3Iodm9pZCk7Ci0KLS8qCi0qKiBmb3JtcGt0LmMKLSovCi11c2hvcnQgc3VtX2l0KCBQS1QgKnBrdCApIDsKLXZvaWQgZm9ybV9ydXBfcGt0KCBSVVAgKmZvcm1fcnVwLCBQS1QgKnBrdCApOwotdm9pZCBmb3JtX3BvbGxfcGt0ICggaW50IHR5cGUsIExQQiAqbGluaywgaW50IG5vZGUgKTsKLXZvaWQgZm9ybV9yb3V0ZV9wa3QgKCBpbnQgdHlwZSwgUEtUICpwa3QsIExQQiAqbGluayApOwotCi0vKgotKiogaWRsZS5jCi0qLwotdm9pZCBpZGxlKCBQcm9jZXNzICppZGxlX3AgKTsKLQotLyoKLSoqIGluaXQuYwotKi8KLXZvaWQgZ2VuZXJhbF9pbml0KHZvaWQpOwotdm9pZCBtZW1faGFsdCggaW50IGVycm9yKTsKLQotLyoKLSoqIGxpbmtpbml0LmMKLSovCi12b2lkIGluaXRsaW5rKCB1X3Nob3J0IG51bWJlciwgTFBCICpsaW5rKTsKLXZvaWQgcnVubGluayggTFBCICpsaW5rKTsKLQotLyoKLSoqIGxpc3QuYwotKi8KLVBLVCAqZ2V0X2ZyZWVfc3RhcnQodm9pZCk7Ci12b2lkIHB1dF9mcmVlX3N0YXJ0KCBQS1QgKnBrdCk7Ci0KLSNpZmRlZiBIT1NUCi1pbnQgY2FuX3JlbW92ZV90cmFuc21pdCAoIFBLVCAqKnBrdCwgUEtUICpwb2ludGVyICk7Ci0jZW5kaWYKLQotI2lmZGVmIFJUQQotaW50IHNwbDcgKCB2b2lkICk7Ci1pbnQgc3BsMCAoIHZvaWQgKTsKLVFfQlVGICpnZXRfZnJlZV9xKCB2b2lkICk7Ci1QS1QgKmdldF9mcmVlX2VuZCh2b2lkKTsKLWludCBhZGRfZW5kKCBQS1QgKnBrdCwgUEhCICpwaGIsIGludCB0eXBlKTsKLXVuc2lnbmVkIHNob3J0IGZyZWVfcGFja2V0cyggUEhCICpwaGIsIGludCB0eXBlKTsKLWludCBjYW5fcmVtb3ZlX3N0YXJ0KCBQS1QgKipwa3QsIFBIQiAqcGhiLCBpbnQgdHlwZSk7Ci1pbnQgY2FuX2FkZF9zdGFydCggUEhCICpwaGIsIGludCB0eXBlKTsKLWludCBjYW5fYWRkX2VuZCggUEhCICpwaGIsIGludCB0eXBlKTsKLXZvaWQgcHV0X2ZyZWVfZW5kKCBQS1QgKnBrdCk7Ci1pbnQgcmVtb3ZlX3N0YXJ0KCBQS1QgKipwa3QsIFBIQiAqcGhiLCBpbnQgdHlwZSk7Ci0jZW5kaWYKLQotLyoKLSoqIExydC5jCi0qLwotdm9pZCBscnQoIFByb2Nlc3MgKmxydF9wLCBMUEIgKmxpbmsgKTsKLQotI2lmZGVmIFJUQQotdm9pZCBzZXRfbGVkX3JlZCAoIExQQiAqbGluayApOwotI2VuZGlmCi0KLS8qCi0qKiBsdHQuYwotKi8KLXZvaWQgbHR0KCBQcm9jZXNzICpsdHRfcCwgTFBCICpsaW5rLCBQSEIgKnBoYl9wdHJbXSApOwotdm9pZCBzZW5kX3BvbGwgKCBMUEIgKmxpbmsgKTsKLXZvaWQgcmVxdWVzdF9pZCAoIExQQiAqbGluayApOwotdm9pZCBzZW5kX3RvcG9sb2d5X3VwZGF0ZSAoIExQQiAqbGluayApOwotdm9pZCBzZW5kX3RvcG9sb2d5ICggTFBCICpsaW5rICk7Ci12b2lkIHN1cHBseV9pZCAoIExQQiAqbGluayApOwotCi0jaWZkZWYgUlRBCi12b2lkIHJlZGlyZWN0X3F1ZXVlICggTFBCICpsaW5rLCB1c2hvcnQgZmx1c2ggKTsKLWludCBvYnRhaW5fcnVwICggaW50IHJ1cF9udW1iZXIsIFBLVCAqKnBrdF9hZGRyZXNzLCBMUEIgKmxpbmsgKTsKLSNlbmRpZgotCi0jaWZkZWYgVEVTVElOR19QRVJGCi1pbnQgY29uc3VtZV9jcHUoIHZvaWQgKTsKLSNlbmRpZgotCi0vKgotKiogbHR0d2FrZS5jCi0qLwotI2lmZGVmIEhPU1QKLXZvaWQgbHR0X3dha2V1cCggUHJvY2VzcyAqbHR0X3dha2V1cF9wICk7Ci0jZW5kaWYKLQotLyoKLSoqIG1hcGdlbi5jCi0qLwotdm9pZCBnZW5lcmF0ZV9pZF9tYXAoIHNob3J0IG1hcHBpbmcsIFJPVVRFX1NUUiByb3V0ZVtdICk7Ci12b2lkIGdlbl9tYXAoIGludCBtYXBwaW5nLCBpbnQgbG9va2luZ19hdCwgaW50IGNvbWVfZnJvbSwgUk9VVEVfU1RSIHJvdXRlW10sIGludCBsaW5rLCBpbnQgKnR0bCApOwotdm9pZCBhZGp1c3RfdHRsKCBpbnQgbWFwcGluZywgaW50IGxvb2tpbmdfYXQsIGludCBjb21lX2Zyb20sIFJPVVRFX1NUUiByb3V0ZVtdLCBpbnQgbGluaywgaW50ICp0dGwpOwotdm9pZCBpbml0X3N5c19tYXAodm9pZCk7Ci0KLS8qCi0qKiBtbXUuYwotKi8KLWNoYXIgKnJpb19tYWxsb2MoIHVuc2lnbmVkIGludCBhbW91bnQpOwotY2hhciAqcmlvX2NhbGxvYyggdW5zaWduZWQgaW50IG51bSwgdW5zaWduZWQgaW50IHNpemUpOwotRVJST1IgcmlvX21tdV9pbml0KCB1aW50IHRvdGFsX21lbSApOwotCi0vKgotKiogcGFydG4uYwotKi8KLXZvaWQgcGFydGl0aW9uX3R4KCBzdHJ1Y3QgUEhCICpwaGIsIHVfc2hvcnQgdHhfc2l6ZSwgdV9zaG9ydCByeF9zaXplLCB1X3Nob3J0IHJ4X2xpbWl0KTsKLQotLyoKLSoqIHBvbGwuYwotKi8KLXZvaWQgdHhfcG9sbCggUHJvY2VzcyAqdHhfcG9sbF9wKTsKLQotLyoKLSoqIHByb2Nlc3MuYwotKi8KLWludCAgZ2V0X3Byb2Nfc3BhY2UoIFByb2Nlc3MgKipwZCwgaW50ICoqcHdzLCBpbnQgd3NzaXplKTsKLQotLyoKLSoqIHJlYWRyb20uYwotKi8KLXZvaWQgcmVhZF9zZXJpYWxfbnVtYmVyKGNoYXIgKmJ1Zik7Ci0KLS8qCi0qKiByaW8uYwotKi8KLWludCBtYWluKCB2b2lkICk7Ci0KLS8qCi0qKiByb3V0ZS5jCi0qLwotdm9pZCByb3V0ZV91cGRhdGUgKCBQS1QgKnBrdCwgTFBCICpsaW5rKTsKLQotLyoKLSoqIHJ0YWluaXQuYwotKi8KLSNpZiBkZWZpbmVkKFJUQSkKLXZvaWQgcnRhX2luaXQodXNob3J0IFJ0YVR5cGUpOwotI2VuZGlmIC8qIGRlZmluZWQoUlRBKSAqLwotCi0vKgotKiogcnVwYm9vdC5jCi0qLwotdm9pZCBydXBfYm9vdCggUEtUICpwa3QsIFJVUCAqdGhpc19ydXAsIExQQiAqbGluayk7Ci0KLSNpZmRlZiBSVEEKLXZvaWQga2lsbF95b3VyX25laWdoYm91ciggaW50IGxpbmtfdG9fa2lsbCApOwotI2VuZGlmCi0KLS8qCi0qKiBydXBjbWQuYwotKi8KLXZvaWQgcnVwX2NvbW1hbmQoIFBLVCAqcGt0LCBzdHJ1Y3QgUlVQICp0aGlzX3J1cCwgTFBCICpsaW5rKTsKLQotLyoKLSoqIHJ1cGVyci5jCi0qLwotdm9pZCBydXBfZXJyb3IoIFBLVCAqcGt0LCBSVVAgKnRoaXNfcnVwLCBMUEIgKmxpbmsgKTsKLXZvaWQgaWxsZWdhbF9jbWQoIFBLVCAqc3JjX3BrdCApOwotCi0vKgotKiogcnVwcG9sbC5jCi0qLwotdm9pZCBydXBfcG9sbCggUEtUICpwa3QsIFJVUCAqdGhpc19ydXAsIExQQiAqbGluayApOwotCi0vKgotKiogcnVwcG93ZXIuYwotKi8KLXZvaWQgcnVwX3Bvd2VyKCBQS1QgKnBrdCwgUlVQICp0aGlzX3J1cCwgTFBCICpsaW5rICk7Ci0KLS8qCi0qKiBydXBybS5jCi0qLwotdm9pZCBydXBfcm91dGVfbWFwKCBQS1QgKnBrdCwgUlVQICp0aGlzX3J1cCwgTFBCICpsaW5rKTsKLQotLyoKLSoqIHJ1cHN0YXQuYwotKi8KLXZvaWQgcnVwX3N0YXR1cyggUEtUICpwa3QsIFJVUCAqdGhpc19ydXAsIExQQiAqbGluayk7Ci0KLS8qCi0qKiBydXBzeW5jLmMKLSovCi12b2lkIHJ1cF9zeW5jKCBQS1QgKnBrdCk7Ci0KLS8qCi0qKiByeHBrdC5jCi0qLwotRVJST1IgIHJ4X3BrdCggUEtUX3B0cl9wdHIgcGt0X2FkZHJlc3MsIExQQiAqbGluayk7Ci0KLS8qCi0qKiBzZW5kc3RzLmMKLSovCi12b2lkIHNlbmRfc3RhdHVzKCBQS1QgKnJlcXVlc3RpbmdfcGt0LCBSVVAgKnRoaXNfcnVwKTsKLQotLyoKLSoqIHNlcmlhbC5jCi0qLwotdm9pZCBhc3NpZ25fc2VyaWFsICggY2hhciAqc2VyX2luLCBjaGFyICpzZXJfb3V0KTsKLWludCBjbXBfc2VyaWFsICggY2hhciAqc2VyXzEsIGNoYXIgKnNlcl8yKTsKLQotLyoKLSoqIHR4cGt0LmMKLSovCi1FUlJPUiAgdHhfcGt0KCBQS1QgKnBrdCwgTFBCICpsaW5rKTsKLXNob3J0IHNlbmRfc3luYyggTFBCICpsaW5rKTsKLQotI2VuZGlmCS8qIF9wcm90b3R5cGVzX2ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcHJvdHN0cy5oIGIvZHJpdmVycy9jaGFyL3Jpby9wcm90c3RzLmgKaW5kZXggODQ4MTExYS4uNjlmYzRiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9wcm90c3RzLmgKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9wcm90c3RzLmgKQEAgLTExNSw1ICsxMTUsMyBAQAogI2VuZGlmCiAKIC8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3FidWYuaCBiL2RyaXZlcnMvY2hhci9yaW8vcWJ1Zi5oCmluZGV4IDFmY2UwMmYuLmFjZDllOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vcWJ1Zi5oCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcWJ1Zi5oCkBAIC00MCw3ICs0MCw3IEBACiAKICNpZm5kZWYgbGludAogI2lmZGVmIFNDQ1NfTEFCRUxTCi1zdGF0aWMgY2hhciAqX3Jpb19xYnVmX2hfc2NjcyA9ICJAKCMpcWJ1Zi5oCTEuMSIgOworc3RhdGljIGNoYXIgKl9yaW9fcWJ1Zl9oX3NjY3MgPSAiQCgjKXFidWYuaAkxLjEiOwogI2VuZGlmCiAjZW5kaWYKIApAQCAtNTIsMTYgKzUyLDE1IEBACiAjZGVmaW5lIFBLVFNfUEVSX0JVRkZFUiAgICAoMjIwIC8gUEtUX0xFTkdUSCkKICNlbmRpZgogCi10eXBlZGVmIHN0cnVjdCBRX0JVRiBRX0JVRiA7Ci1zdHJ1Y3QgUV9CVUYgIHsKLSAgICAgICAgICAgICAgICAgIFFfQlVGX3B0ciBuZXh0IDsKLSAgICAgICAgICAgICAgICAgIFFfQlVGX3B0ciBwcmV2IDsKLSAgICAgICAgICAgICAgICAgIFBLVF9wdHIgYnVmW1BLVFNfUEVSX0JVRkZFUl0gOwotICAgICAgICAgICAgICB9IDsKK3R5cGVkZWYgc3RydWN0IFFfQlVGIFFfQlVGOworc3RydWN0IFFfQlVGIHsKKwlRX0JVRl9wdHIgbmV4dDsKKwlRX0JVRl9wdHIgcHJldjsKKwlQS1RfcHRyIGJ1ZltQS1RTX1BFUl9CVUZGRVJdOworfTsKIAogCiAjZW5kaWYKIAogCiAvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvLmggYi9kcml2ZXJzL2NoYXIvcmlvL3Jpby5oCmluZGV4IDEzYTk5MzEuLjdmNDVlMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vcmlvLmgKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW8uaApAQCAtNzIsOCArNzIsOCBAQAogI2RlZmluZQlSSU9fSE9TVFMJNAkvKiBudW1iZXIgb2YgaG9zdHMgdGhhdCBjYW4gYmUgZm91bmQgKi8KICNkZWZpbmUJUE9SVFNfUEVSX0hPU1QJMTI4CS8qIG51bWJlciBvZiBwb3J0cyBwZXIgaG9zdCAqLwogI2RlZmluZQlMSU5LU19QRVJfVU5JVAk0CS8qIG51bWJlciBvZiBsaW5rcyBmcm9tIGEgaG9zdCAqLwotI2RlZmluZQlSSU9fUE9SVFMJKFBPUlRTX1BFUl9IT1NUICogUklPX0hPU1RTKSAvKiBtYXguIG5vLiBvZiBwb3J0cyAqLwotI2RlZmluZQlSVEFTX1BFUl9IT1NUCShNQVhfUlVQKSAvKiBudW1iZXIgb2YgUlRBcyBwZXIgaG9zdCAqLworI2RlZmluZQlSSU9fUE9SVFMJKFBPUlRTX1BFUl9IT1NUICogUklPX0hPU1RTKQkvKiBtYXguIG5vLiBvZiBwb3J0cyAqLworI2RlZmluZQlSVEFTX1BFUl9IT1NUCShNQVhfUlVQKQkvKiBudW1iZXIgb2YgUlRBcyBwZXIgaG9zdCAqLwogI2RlZmluZQlQT1JUU19QRVJfUlRBCShQT1JUU19QRVJfSE9TVC9SVEFTX1BFUl9IT1NUKQkvKiBwb3J0cyBvbiBhIHJ0YSAqLwogI2RlZmluZQlQT1JUU19QRVJfTU9EVUxFIDQJLyogbnVtYmVyIG9mIHBvcnRzIG9uIGEgcGx1Zy1pbiBtb2R1bGUgKi8KIAkJCQkvKiBudW1iZXIgb2YgbW9kdWxlcyBvbiBhbiBSVEEgKi8KQEAgLTIxNiwxMCArMjE2LDkgQEAKICNkZWZpbmUJUklPX1BSSQkoUFpFUk8rMTApCiAjZGVmaW5lIFJJT19DTE9TRV9QUkkJUFpFUk8tMQkvKiB1bmludGVycnVwdGlibGUgc2xlZXBzIGZvciBjbG9zZSAqLwogCi10eXBlZGVmIHN0cnVjdCBEYkluZgotewotCXVpbnQJRmxhZzsKLQljaGFyCU5hbWVbOF07Cit0eXBlZGVmIHN0cnVjdCBEYkluZiB7CisJdWludCBGbGFnOworCWNoYXIgTmFtZVs4XTsKIH0gRGJJbmY7CiAKICNpZm5kZWYgVFJVRQpAQCAtMjUxLDcgKzI1MCw3IEBACiAJKigodWludCAqKVBLKSAgICA9IFBQLT5QYWNrZXRJbmZvOyBcCiB9CiAKLSNkZWZpbmUJUklPX0xJTktfRU5BQkxFCTB4ODBGRiAvKiBGRiBpcyBhIGhhY2ssIG1haW5seSBmb3IgTWlwcywgdG8gICAgICAgICovCisjZGVmaW5lCVJJT19MSU5LX0VOQUJMRQkweDgwRkYJLyogRkYgaXMgYSBoYWNrLCBtYWlubHkgZm9yIE1pcHMsIHRvICAgICAgICAqLwogCQkJICAgICAgIC8qIHByZXZlbnQgYSByZWFsbHkgc3R1cGlkIHJhY2UgY29uZGl0aW9uLiAgKi8KIAogI2RlZmluZQlOT1RfSU5JVElBTElTRUQJMApAQCAtMjkxLDQgKzI5MCw0IEBACiAjZGVmaW5lIERJU1RfTElORVNXX09VVFBVVAkweDQwCiAjZGVmaW5lIERJU1RfTElORVNXX01ETUlOVAkweDgwCiAKLSNlbmRpZiAvKiBfX3Jpb19oX18gKi8KKyNlbmRpZgkJCQkvKiBfX3Jpb19oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvX2xpbnV4LmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb19saW51eC5jCmluZGV4IGQ3ZDQ4NDAuLmM5YWYyODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vcmlvX2xpbnV4LmMKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9fbGludXguYwpAQCAtMzMsNyArMzMsNyBAQAogICogKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPiAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTU2LDEwICs1Niw2IEBACiAjaW5jbHVkZSA8bGludXgvZ2VuZXJpY19zZXJpYWwuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jaWYgQklUU19QRVJfTE9ORyAhPSAzMgotIyAgZXJyb3IgRklYTUU6IHRoaXMgZHJpdmVyIG9ubHkgd29ya3Mgb24gMzItYml0IHBsYXRmb3JtcwotI2VuZGlmCi0KICNpbmNsdWRlICJsaW51eF9jb21wYXQuaCIKICNpbmNsdWRlICJ0eXBkZWYuaCIKICNpbmNsdWRlICJwa3QuaCIKQEAgLTExNiw3ICsxMTIsNyBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NQRUNJQUxJWF9TWF9YSU9fSU84IDB4MjAwMAogI2VuZGlmCiAKLSNpZm5kZWYgUklPX1dJTkRPV19MRU4gCisjaWZuZGVmIFJJT19XSU5ET1dfTEVOCiAjZGVmaW5lIFJJT19XSU5ET1dfTEVOIDB4MTAwMDAKICNlbmRpZgogCkBAIC0xMzYsNDIgKzEzMiw0OSBAQAogKi8KICNkZWZpbmUgSVJRX1JBVEVfTElNSVQgMjAwCiAKLSNpZiAwCi0vKiBOb3QgaW1wbGVtZW50ZWQgKi8KLS8qIAotICogVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBtb3N0bHkgZm9yIHRlc3RpbmcgcHVycG9zZXMuIEJ1dCBpZiB5b3UgbmVlZAotICogc29tZSBuaWNlIHJlcG9ydGluZyBpbiB5b3VyIHN5c2xvZywgeW91IGNhbiBkZWZpbmUgdGhlbSBhbHNvLgotICovCi0jZGVmaW5lIFJJT19SRVBPUlRfRklGTwotI2RlZmluZSBSSU9fUkVQT1JUX09WRVJSVU4KLSNlbmRpZiAKLQogCiAvKiBUaGVzZSBjb25zdGFudHMgYXJlIGRlcml2ZWQgZnJvbSBTQ08gU291cmNlICovCiBzdGF0aWMgc3RydWN0IENvbmYKLVJJT0NvbmYgPQotewotICAvKiBsb2NhdG9yICovICAgICAgICAgIlJJTyBDb25maWcgaGVyZSIsCi0gIC8qIHN0YXJ0dXB0aW1lICovICAgICBIWioyLCAgICAgICAgICAgLyogaG93IGxvbmcgdG8gd2FpdCBmb3IgY2FyZCB0byBydW4gKi8KLSAgLyogc2xvd2Nvb2sgKi8gICAgICAgIDAsICAgICAgICAgICAgICAvKiBUUlVFIC0+IGFsd2F5cyB1c2UgbGluZSBkaXNjLiAqLwotICAvKiBpbnRycG9sbHRpbWUgKi8gICAgMSwgICAgICAgICAgICAgIC8qIFRoZSBmcmVxdWVuY3kgb2YgT1VSIHBvbGxzICovCi0gIC8qIGJyZWFraW50ZXJ2YWwgKi8gICAyNSwgICAgICAgICAgICAgLyogeDEwIG1TIFhYWDogdW5pdHMgc2VlbSB0byBiZSAxbXMgbm90IDEwISAtLSBSRVcqLwotICAvKiB0aW1lciAqLyAgICAgICAgICAgMTAsICAgICAgICAgICAgIC8qIG1TICovCi0gIC8qIFJ0YUxvYWRCYXNlICovICAgICAweDcwMDAsCi0gIC8qIEhvc3RMb2FkQmFzZSAqLyAgICAweDdDMDAsCi0gIC8qIFhwSHogKi8gICAgICAgICAgICA1LCAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIFhwcmludCBoaXRzIHBlciBzZWNvbmQgKi8KLSAgLyogWHBDcHMgKi8gICAgICAgICAgIDEyMCwgICAgICAgICAgICAvKiBYcHJpbnQgY2hhcmFjdGVycyBwZXIgc2Vjb25kICovCi0gIC8qIFhwT24gKi8gICAgICAgICAgICAiXDAzM2QjIiwgICAgICAgLyogc3RhcnQgWHByaW50IGZvciBhIHd5c2UgNjAgKi8KLSAgLyogWHBPZmYgKi8gICAgICAgICAgICJcMDI0IiwgICAgICAgICAvKiBlbmQgWHByaW50IGZvciBhIHd5c2UgNjAgKi8KLSAgLyogTWF4WHBDcHMgKi8gICAgICAgIDIwMDAsICAgICAgICAgICAvKiBoaWdoZXN0IFhwcmludCBzcGVlZCAqLwotICAvKiBNaW5YcENwcyAqLyAgICAgICAgMTAsICAgICAgICAgICAgIC8qIHNsb3dlc3QgWHByaW50IHNwZWVkICovCi0gIC8qIFNwaW5DbWRzICovICAgICAgICAxLCAgICAgICAgICAgICAgLyogbm9uLXplcm8gZm9yIG1lZ2EgZmFzdCBib290cyAqLwotICAvKiBGaXJzdCBBZGRyICovICAgICAgMHgwQTAwMDAsICAgICAgIC8qIEZpcnN0IGFkZHJlc3MgdG8gbG9vayBhdCAqLwotICAvKiBMYXN0IEFkZHIgKi8gICAgICAgMHhGRjAwMDAsICAgICAgIC8qIExhc3QgYWRkcmVzcyBsb29rZWQgYXQgKi8KLSAgLyogQnVmZmVyU2l6ZSAqLyAgICAgIDEwMjQsICAgICAgICAgICAvKiBCeXRlcyBwZXIgcG9ydCBvZiBidWZmZXJpbmcgKi8KLSAgLyogTG93V2F0ZXIgKi8gICAgICAgIDI1NiwgICAgICAgICAgICAvKiBob3cgbXVjaCBkYXRhIGxlZnQgYmVmb3JlIHdha2V1cCAqLwotICAvKiBMaW5lTGVuZ3RoICovICAgICAgODAsICAgICAgICAgICAgIC8qIGhvdyB3aWRlIGlzIHRoZSBjb25zb2xlPyAqLwotICAvKiBDbWRUaW1lb3V0ICovICAgICAgSFosICAgICAgICAgICAgIC8qIGhvdyBsb25nIGEgY2xvc2UgY29tbWFuZCBtYXkgdGFrZSAqLworIFJJT0NvbmYgPSB7CisJLyogbG9jYXRvciAqLyAiUklPIENvbmZpZyBoZXJlIiwKKwkJCQkJLyogc3RhcnR1cHRpbWUgKi8gSFogKiAyLAorCQkJCQkvKiBob3cgbG9uZyB0byB3YWl0IGZvciBjYXJkIHRvIHJ1biAqLworCQkJCS8qIHNsb3djb29rICovIDAsCisJCQkJLyogVFJVRSAtPiBhbHdheXMgdXNlIGxpbmUgZGlzYy4gKi8KKwkJCQkvKiBpbnRycG9sbHRpbWUgKi8gMSwKKwkJCQkvKiBUaGUgZnJlcXVlbmN5IG9mIE9VUiBwb2xscyAqLworCQkJCS8qIGJyZWFraW50ZXJ2YWwgKi8gMjUsCisJCQkJLyogeDEwIG1TIFhYWDogdW5pdHMgc2VlbSB0byBiZSAxbXMgbm90IDEwISAtLSBSRVcgKi8KKwkJCQkvKiB0aW1lciAqLyAxMCwKKwkJCQkvKiBtUyAqLworCS8qIFJ0YUxvYWRCYXNlICovIDB4NzAwMCwKKwkvKiBIb3N0TG9hZEJhc2UgKi8gMHg3QzAwLAorCQkJCS8qIFhwSHogKi8gNSwKKwkJCQkvKiBudW1iZXIgb2YgWHByaW50IGhpdHMgcGVyIHNlY29uZCAqLworCQkJCS8qIFhwQ3BzICovIDEyMCwKKwkJCQkvKiBYcHJpbnQgY2hhcmFjdGVycyBwZXIgc2Vjb25kICovCisJCQkJLyogWHBPbiAqLyAiXDAzM2QjIiwKKwkJCQkvKiBzdGFydCBYcHJpbnQgZm9yIGEgd3lzZSA2MCAqLworCQkJCS8qIFhwT2ZmICovICJcMDI0IiwKKwkJCQkvKiBlbmQgWHByaW50IGZvciBhIHd5c2UgNjAgKi8KKwkJCQkvKiBNYXhYcENwcyAqLyAyMDAwLAorCQkJCS8qIGhpZ2hlc3QgWHByaW50IHNwZWVkICovCisJCQkJLyogTWluWHBDcHMgKi8gMTAsCisJCQkJLyogc2xvd2VzdCBYcHJpbnQgc3BlZWQgKi8KKwkJCQkvKiBTcGluQ21kcyAqLyAxLAorCQkJCS8qIG5vbi16ZXJvIGZvciBtZWdhIGZhc3QgYm9vdHMgKi8KKwkJCQkJLyogRmlyc3QgQWRkciAqLyAweDBBMDAwMCwKKwkJCQkJLyogRmlyc3QgYWRkcmVzcyB0byBsb29rIGF0ICovCisJCQkJCS8qIExhc3QgQWRkciAqLyAweEZGMDAwMCwKKwkJCQkJLyogTGFzdCBhZGRyZXNzIGxvb2tlZCBhdCAqLworCQkJCS8qIEJ1ZmZlclNpemUgKi8gMTAyNCwKKwkJCQkvKiBCeXRlcyBwZXIgcG9ydCBvZiBidWZmZXJpbmcgKi8KKwkJCQkvKiBMb3dXYXRlciAqLyAyNTYsCisJCQkJLyogaG93IG11Y2ggZGF0YSBsZWZ0IGJlZm9yZSB3YWtldXAgKi8KKwkJCQkvKiBMaW5lTGVuZ3RoICovIDgwLAorCQkJCS8qIGhvdyB3aWRlIGlzIHRoZSBjb25zb2xlPyAqLworCQkJCS8qIENtZFRpbWVvdXQgKi8gSFosCisJCQkJLyogaG93IGxvbmcgYSBjbG9zZSBjb21tYW5kIG1heSB0YWtlICovCiB9OwogCiAKQEAgLTE3OSwyMSArMTgyLDIwIEBACiAKIC8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KIAotc3RhdGljIHZvaWQgcmlvX2Rpc2FibGVfdHhfaW50ZXJydXB0cyAodm9pZCAqIHB0cik7IAotc3RhdGljIHZvaWQgcmlvX2VuYWJsZV90eF9pbnRlcnJ1cHRzICh2b2lkICogcHRyKTsgCi1zdGF0aWMgdm9pZCByaW9fZGlzYWJsZV9yeF9pbnRlcnJ1cHRzICh2b2lkICogcHRyKTsgCi1zdGF0aWMgdm9pZCByaW9fZW5hYmxlX3J4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpOyAKLXN0YXRpYyBpbnQgIHJpb19nZXRfQ0QgKHZvaWQgKiBwdHIpOyAKLXN0YXRpYyB2b2lkIHJpb19zaHV0ZG93bl9wb3J0ICh2b2lkICogcHRyKTsKLXN0YXRpYyBpbnQgIHJpb19zZXRfcmVhbF90ZXJtaW9zICh2b2lkICAqcHRyKTsKLXN0YXRpYyB2b2lkIHJpb19odW5ndXAgKHZvaWQgICpwdHIpOwotc3RhdGljIHZvaWQgcmlvX2Nsb3NlICh2b2lkICAqcHRyKTsKLXN0YXRpYyBpbnQgcmlvX2NoYXJzX2luX2J1ZmZlciAodm9pZCAqIHB0cik7Ci1zdGF0aWMgaW50IHJpb19md19pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyB2b2lkIHJpb19kaXNhYmxlX3R4X2ludGVycnVwdHModm9pZCAqcHRyKTsKK3N0YXRpYyB2b2lkIHJpb19lbmFibGVfdHhfaW50ZXJydXB0cyh2b2lkICpwdHIpOworc3RhdGljIHZvaWQgcmlvX2Rpc2FibGVfcnhfaW50ZXJydXB0cyh2b2lkICpwdHIpOworc3RhdGljIHZvaWQgcmlvX2VuYWJsZV9yeF9pbnRlcnJ1cHRzKHZvaWQgKnB0cik7CitzdGF0aWMgaW50IHJpb19nZXRfQ0Qodm9pZCAqcHRyKTsKK3N0YXRpYyB2b2lkIHJpb19zaHV0ZG93bl9wb3J0KHZvaWQgKnB0cik7CitzdGF0aWMgaW50IHJpb19zZXRfcmVhbF90ZXJtaW9zKHZvaWQgKnB0cik7CitzdGF0aWMgdm9pZCByaW9faHVuZ3VwKHZvaWQgKnB0cik7CitzdGF0aWMgdm9pZCByaW9fY2xvc2Uodm9pZCAqcHRyKTsKK3N0YXRpYyBpbnQgcmlvX2NoYXJzX2luX2J1ZmZlcih2b2lkICpwdHIpOworc3RhdGljIGludCByaW9fZndfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIHN0YXRpYyBpbnQgcmlvX2luaXRfZHJpdmVycyh2b2lkKTsKIAotc3RhdGljIHZvaWQgbXlfaGQgKHZvaWQgKmFkZHIsIGludCBsZW4pOworc3RhdGljIHZvaWQgbXlfaGQodm9pZCAqYWRkciwgaW50IGxlbik7CiAKIHN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqcmlvX2RyaXZlciwgKnJpb19kcml2ZXIyOwogCkBAIC0yMTMsOSArMjE1LDkgQEAKIAogLyogVGhlc2UgYXJlIHRoZSBvbmx5IG9wZW4gc3BhY2VzIGluIG15IGNvbXB1dGVyLiBZb3VycyBtYXkgaGF2ZSBtb3JlCiAgICBvciBsZXNzLi4uLiAqLwotc3RhdGljIGludCByaW9fcHJvYmVfYWRkcnNbXT0gezB4YzAwMDAsIDB4ZDAwMDAsIDB4ZTAwMDB9Oworc3RhdGljIGludCByaW9fcHJvYmVfYWRkcnNbXSA9IHsgMHhjMDAwMCwgMHhkMDAwMCwgMHhlMDAwMCB9OwogCi0jZGVmaW5lIE5SX1JJT19BRERSUyAoc2l6ZW9mKHJpb19wcm9iZV9hZGRycykvc2l6ZW9mIChpbnQpKQorI2RlZmluZSBOUl9SSU9fQUREUlMgQVJSQVlfU0laRShyaW9fcHJvYmVfYWRkcnMpCiAKIAogLyogU2V0IHRoZSBtYXNrIHRvIGFsbC1vbmVzLiBUaGlzIGFsYXMsIG9ubHkgc3VwcG9ydHMgMzIgaW50ZXJydXB0cy4gCkBAIC0yMzEsMTcgKzIzMywxNyBAQAogbW9kdWxlX3BhcmFtKHJpb19pcnFtYXNrLCBsb25nLCAwKTsKIAogc3RhdGljIHN0cnVjdCByZWFsX2RyaXZlciByaW9fcmVhbF9kcml2ZXIgPSB7Ci0gIHJpb19kaXNhYmxlX3R4X2ludGVycnVwdHMsCi0gIHJpb19lbmFibGVfdHhfaW50ZXJydXB0cywKLSAgcmlvX2Rpc2FibGVfcnhfaW50ZXJydXB0cywKLSAgcmlvX2VuYWJsZV9yeF9pbnRlcnJ1cHRzLAotICByaW9fZ2V0X0NELAotICByaW9fc2h1dGRvd25fcG9ydCwgCi0gIHJpb19zZXRfcmVhbF90ZXJtaW9zLCAKLSAgcmlvX2NoYXJzX2luX2J1ZmZlciwKLSAgcmlvX2Nsb3NlLAotICByaW9faHVuZ3VwLAotICBOVUxMCisJcmlvX2Rpc2FibGVfdHhfaW50ZXJydXB0cywKKwlyaW9fZW5hYmxlX3R4X2ludGVycnVwdHMsCisJcmlvX2Rpc2FibGVfcnhfaW50ZXJydXB0cywKKwlyaW9fZW5hYmxlX3J4X2ludGVycnVwdHMsCisJcmlvX2dldF9DRCwKKwlyaW9fc2h1dGRvd25fcG9ydCwKKwlyaW9fc2V0X3JlYWxfdGVybWlvcywKKwlyaW9fY2hhcnNfaW5fYnVmZmVyLAorCXJpb19jbG9zZSwKKwlyaW9faHVuZ3VwLAorCU5VTEwKIH07CiAKIC8qIApAQCAtMjUwLDggKzI1Miw4IEBACiAgKi8KIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmlvX2Z3X2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5pb2N0bAkJPSByaW9fZndfaW9jdGwsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmlvY3RsID0gcmlvX2Z3X2lvY3RsLAogfTsKIAogc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHJpb19md19kZXZpY2UgPSB7CkBAIC0yNjYsMjUgKzI2OCwyMiBAQAogCiAvKiBUaGlzIGRvZXNuJ3Qgd29yay4gV2hvJ3MgcGFyYW5vaWQgYXJvdW5kIGhlcmU/IE5vdCBtZSEgKi8KIAotc3RhdGljIGlubGluZSBpbnQgcmlvX3BhcmFub2lhX2NoZWNrKHN0cnVjdCByaW9fcG9ydCBjb25zdCAqIHBvcnQsCi0JCQkJICAgIGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnJvdXRpbmUpCitzdGF0aWMgaW5saW5lIGludCByaW9fcGFyYW5vaWFfY2hlY2soc3RydWN0IHJpb19wb3J0IGNvbnN0ICpwb3J0LCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQogewogCi0gIHN0YXRpYyBjb25zdCBjaGFyICpiYWRtYWdpYyA9Ci0gICAgS0VSTl9FUlIgInJpbzogV2FybmluZzogYmFkIHJpbyBwb3J0IG1hZ2ljIG51bWJlciBmb3IgZGV2aWNlICVzIGluICVzXG4iOwotICBzdGF0aWMgY29uc3QgY2hhciAqYmFkaW5mbyA9Ci0gICAgS0VSTl9FUlIgInJpbzogV2FybmluZzogbnVsbCByaW8gcG9ydCBmb3IgZGV2aWNlICVzIGluICVzXG4iOwotIAotICBpZiAoIXBvcnQpIHsKLSAgICBwcmludGsgKGJhZGluZm8sIG5hbWUsIHJvdXRpbmUpOwotICAgIHJldHVybiAxOwotICB9Ci0gIGlmIChwb3J0LT5tYWdpYyAhPSBSSU9fTUFHSUMpIHsKLSAgICBwcmludGsgKGJhZG1hZ2ljLCBuYW1lLCByb3V0aW5lKTsKLSAgICByZXR1cm4gMTsKLSAgfQorCXN0YXRpYyBjb25zdCBjaGFyICpiYWRtYWdpYyA9IEtFUk5fRVJSICJyaW86IFdhcm5pbmc6IGJhZCByaW8gcG9ydCBtYWdpYyBudW1iZXIgZm9yIGRldmljZSAlcyBpbiAlc1xuIjsKKwlzdGF0aWMgY29uc3QgY2hhciAqYmFkaW5mbyA9IEtFUk5fRVJSICJyaW86IFdhcm5pbmc6IG51bGwgcmlvIHBvcnQgZm9yIGRldmljZSAlcyBpbiAlc1xuIjsKIAotICByZXR1cm4gMDsKKwlpZiAoIXBvcnQpIHsKKwkJcHJpbnRrKGJhZGluZm8sIG5hbWUsIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKHBvcnQtPm1hZ2ljICE9IFJJT19NQUdJQykgeworCQlwcmludGsoYmFkbWFnaWMsIG5hbWUsIHJvdXRpbmUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKIH0KICNlbHNlCiAjZGVmaW5lIHJpb19wYXJhbm9pYV9jaGVjayhhLGIsYykgMApAQCAtMjkyLDUzICsyOTEsNTMgQEAKIAogCiAjaWZkZWYgREVCVUcKLXN0YXRpYyB2b2lkIG15X2hkICh2b2lkICphZCwgaW50IGxlbikKK3N0YXRpYyB2b2lkIG15X2hkKHZvaWQgKmFkLCBpbnQgbGVuKQogewotICBpbnQgaSwgaiwgY2g7Ci0gIHVuc2lnbmVkIGNoYXIgKmFkZHIgPSBhZDsKLSAgCi0gIGZvciAoaT0wO2k8bGVuO2krPTE2KSB7Ci0gICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIiUwOHggIiwgKGludCkgYWRkcitpKTsKLSAgICBmb3IgKGo9MDtqPDE2O2orKykgewotICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIiUwMnggJXMiLCBhZGRyW2oraV0sIChqPT03KT8iICI6IiIpOwotICAgIH0KLSAgICBmb3IgKGo9MDtqPDE2O2orKykgewotICAgICAgY2ggPSBhZGRyW2oraV07Ci0gICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiJWMiLCAoY2ggPCAweDIwKT8nLic6KChjaCA+IDB4N2YpPycuJzpjaCkpOwotICAgIH0KLSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiXG4iKTsKLSAgfQorCWludCBpLCBqLCBjaDsKKwl1bnNpZ25lZCBjaGFyICphZGRyID0gYWQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDE2KSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIiUwOHggIiwgKGludCkgYWRkciArIGkpOworCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiJTAyeCAlcyIsIGFkZHJbaiArIGldLCAoaiA9PSA3KSA/ICIgIiA6ICIiKTsKKwkJfQorCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgeworCQkJY2ggPSBhZGRyW2ogKyBpXTsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIiVjIiwgKGNoIDwgMHgyMCkgPyAnLicgOiAoKGNoID4gMHg3ZikgPyAnLicgOiBjaCkpOworCQl9CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIlxuIik7CisJfQogfQogI2Vsc2UKICNkZWZpbmUgbXlfaGQoYWQsbGVuKSBkb3svKiBub3RoaW5nKi8gfSB3aGlsZSAoMCkKICNlbmRpZgogCiAKLS8qIERlbGF5IGEgbnVtYmVyIG9mIGppZmZpZXMsIGFsbG93aW5nIGEgc2lnbmFsIHRvIGludGVycnVwdCAqLyAKLWludCBSSU9EZWxheSAoc3RydWN0IFBvcnQgKlBvcnRQLCBpbnQgbmppZmZpZXMpCisvKiBEZWxheSBhIG51bWJlciBvZiBqaWZmaWVzLCBhbGxvd2luZyBhIHNpZ25hbCB0byBpbnRlcnJ1cHQgKi8KK2ludCBSSU9EZWxheShzdHJ1Y3QgUG9ydCAqUG9ydFAsIGludCBuamlmZmllcykKIHsKLSAgZnVuY19lbnRlciAoKTsKKwlmdW5jX2VudGVyKCk7CiAKLSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ERUxBWSwgImRlbGF5aW5nICVkIGppZmZpZXNcbiIsIG5qaWZmaWVzKTsgIAotICBtc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKG5qaWZmaWVzKSk7Ci0gIGZ1bmNfZXhpdCgpOworCXJpb19kcHJpbnRrKFJJT19ERUJVR19ERUxBWSwgImRlbGF5aW5nICVkIGppZmZpZXNcbiIsIG5qaWZmaWVzKTsKKwltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKG5qaWZmaWVzKSk7CisJZnVuY19leGl0KCk7CiAKLSAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotICAgIHJldHVybiBSSU9fRkFJTDsKLSAgZWxzZQotICAgIHJldHVybiAhUklPX0ZBSUw7CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gUklPX0ZBSUw7CisJZWxzZQorCQlyZXR1cm4gIVJJT19GQUlMOwogfQogCiAKLS8qIERlbGF5IGEgbnVtYmVyIG9mIGppZmZpZXMsIGRpc2FsbG93aW5nIGEgc2lnbmFsIHRvIGludGVycnVwdCAqLyAKLWludCBSSU9EZWxheV9uaSAoc3RydWN0IFBvcnQgKlBvcnRQLCBpbnQgbmppZmZpZXMpCisvKiBEZWxheSBhIG51bWJlciBvZiBqaWZmaWVzLCBkaXNhbGxvd2luZyBhIHNpZ25hbCB0byBpbnRlcnJ1cHQgKi8KK2ludCBSSU9EZWxheV9uaShzdHJ1Y3QgUG9ydCAqUG9ydFAsIGludCBuamlmZmllcykKIHsKLSAgZnVuY19lbnRlciAoKTsKKwlmdW5jX2VudGVyKCk7CiAKLSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ERUxBWSwgImRlbGF5aW5nICVkIGppZmZpZXMgKG5pKVxuIiwgbmppZmZpZXMpOyAgCi0gIG1zbGVlcChqaWZmaWVzX3RvX21zZWNzKG5qaWZmaWVzKSk7Ci0gIGZ1bmNfZXhpdCgpOwotICByZXR1cm4gIVJJT19GQUlMOworCXJpb19kcHJpbnRrKFJJT19ERUJVR19ERUxBWSwgImRlbGF5aW5nICVkIGppZmZpZXMgKG5pKVxuIiwgbmppZmZpZXMpOworCW1zbGVlcChqaWZmaWVzX3RvX21zZWNzKG5qaWZmaWVzKSk7CisJZnVuY19leGl0KCk7CisJcmV0dXJuICFSSU9fRkFJTDsKIH0KIAogCkBAIC0zNTQsMTI2ICszNTMsMTIxIEBACiB9CiAKIAotc3RhdGljIGludCByaW9fc2V0X3JlYWxfdGVybWlvcyAodm9pZCAqcHRyKQorc3RhdGljIGludCByaW9fc2V0X3JlYWxfdGVybWlvcyh2b2lkICpwdHIpCiB7Ci0gIGludCBydiwgbW9kZW07Ci0gIHN0cnVjdCB0dHlfc3RydWN0ICp0dHk7Ci0gIGZ1bmNfZW50ZXIoKTsKKwlpbnQgcnYsIG1vZGVtOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJZnVuY19lbnRlcigpOwogCi0gIHR0eSA9ICgoc3RydWN0IFBvcnQgKilwdHIpLT5ncy50dHk7CisJdHR5ID0gKChzdHJ1Y3QgUG9ydCAqKSBwdHIpLT5ncy50dHk7CiAKLSAgbW9kZW0gPSByaW9faXNtb2RlbSh0dHkpOworCW1vZGVtID0gcmlvX2lzbW9kZW0odHR5KTsKIAotICBydiA9IFJJT1BhcmFtKCAoc3RydWN0IFBvcnQgKikgcHRyLCBDT05GSUcsIG1vZGVtLCAxKTsKKwlydiA9IFJJT1BhcmFtKChzdHJ1Y3QgUG9ydCAqKSBwdHIsIENPTkZJRywgbW9kZW0sIDEpOwogCi0gIGZ1bmNfZXhpdCAoKTsKKwlmdW5jX2V4aXQoKTsKIAotICByZXR1cm4gcnY7CisJcmV0dXJuIHJ2OwogfQogCiAKLXN0YXRpYyB2b2lkIHJpb19yZXNldF9pbnRlcnJ1cHQgKHN0cnVjdCBIb3N0ICpIb3N0UCkKK3N0YXRpYyB2b2lkIHJpb19yZXNldF9pbnRlcnJ1cHQoc3RydWN0IEhvc3QgKkhvc3RQKQogewotICBmdW5jX2VudGVyKCk7CisJZnVuY19lbnRlcigpOwogCi0gIHN3aXRjaCggSG9zdFAtPlR5cGUgKSB7Ci0gIGNhc2UgUklPX0FUOgotICBjYXNlIFJJT19NQ0E6Ci0gIGNhc2UgUklPX1BDSToKLSAgICBXQllURShIb3N0UC0+UmVzZXRJbnQgLCAweGZmKTsKLSAgfQorCXN3aXRjaCAoSG9zdFAtPlR5cGUpIHsKKwljYXNlIFJJT19BVDoKKwljYXNlIFJJT19NQ0E6CisJY2FzZSBSSU9fUENJOgorCQlXQllURShIb3N0UC0+UmVzZXRJbnQsIDB4ZmYpOworCX0KIAotICBmdW5jX2V4aXQoKTsKKwlmdW5jX2V4aXQoKTsKIH0KIAogCi1zdGF0aWMgaXJxcmV0dXJuX3QgcmlvX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqcHRyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpcnFyZXR1cm5fdCByaW9faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKnB0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0gIHN0cnVjdCBIb3N0ICpIb3N0UDsKLSAgZnVuY19lbnRlciAoKTsKKwlzdHJ1Y3QgSG9zdCAqSG9zdFA7CisJZnVuY19lbnRlcigpOwogCi0gIEhvc3RQID0gKHN0cnVjdCBIb3N0KilwdHI7IC8qICZwLT5SSU9Ib3N0c1sobG9uZylwdHJdOyAqLwotICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lGTE9XLCAicmlvOiBlbnRlciByaW9faW50ZXJydXB0ICglZC8lZClcbiIsIAotICAgICAgICAgICAgICAgaXJxLCBIb3N0UC0+SXZlYyk7IAorCUhvc3RQID0gKHN0cnVjdCBIb3N0ICopIHB0cjsJLyogJnAtPlJJT0hvc3RzWyhsb25nKXB0cl07ICovCisJcmlvX2RwcmludGsoUklPX0RFQlVHX0lGTE9XLCAicmlvOiBlbnRlciByaW9faW50ZXJydXB0ICglZC8lZClcbiIsIGlycSwgSG9zdFAtPkl2ZWMpOwogCi0gIC8qIEFBYXJnaCEgVGhlIG9yZGVyIGluIHdoaWNoIHRvIGRvIHRoZXNlIHRoaW5ncyBpcyBlc3NlbnRpYWwgYW5kCi0gICAgIG5vdCB0cml2aWFsLiAKLSAgICAgCi0gICAgIC0gUmF0ZSBsaW1pdCBnb2VzIGJlZm9yZSAicmVjdXJzaXZlIi4gT3RoZXJ3aXNlIGEgc2VyaWVzIG9mCi0gICAgICAgcmVjdXJzaXZlIGNhbGxzIHdpbGwgaGFuZyB0aGUgbWFjaGluZSBpbiB0aGUgaW50ZXJydXB0IHJvdXRpbmUuIAorCS8qIEFBYXJnaCEgVGhlIG9yZGVyIGluIHdoaWNoIHRvIGRvIHRoZXNlIHRoaW5ncyBpcyBlc3NlbnRpYWwgYW5kCisJICAgbm90IHRyaXZpYWwuCiAKLSAgICAgLSBoYXJkd2FyZSB0d2lkZGxpbmcgZ29lcyBiZWZvcmUgInJlY3Vyc2l2ZSIuIE90aGVyd2lzZSB3aGVuIHdlCi0gICAgICAgcG9sbCB0aGUgY2FyZCwgYW5kIGEgcmVjdXJzaXZlIGludGVycnVwdCBoYXBwZW5zLCB3ZSB3b24ndAotICAgICAgIGFjayB0aGUgY2FyZCwgc28gaXQgbWlnaHQga2VlcCBvbiBpbnRlcnJ1cHRpbmcgdXMuIChlc3BlY2lhbGx5Ci0gICAgICAgbGV2ZWwgc2Vuc2l0aXZlIGludGVycnVwdCBzeXN0ZW1zIGxpa2UgUENJKS4KKwkgICAtIFJhdGUgbGltaXQgZ29lcyBiZWZvcmUgInJlY3Vyc2l2ZSIuIE90aGVyd2lzZSBhIHNlcmllcyBvZgorCSAgIHJlY3Vyc2l2ZSBjYWxscyB3aWxsIGhhbmcgdGhlIG1hY2hpbmUgaW4gdGhlIGludGVycnVwdCByb3V0aW5lLgogCi0gICAgIC0gUmF0ZSBsaW1pdCBnb2VzIGJlZm9yZSBoYXJkd2FyZSB0d2lkZGxpbmcuIE90aGVyd2lzZSB3ZSB3b24ndAotICAgICAgIGNhdGNoIGEgY2FyZCB0aGF0IGhhcyBnb25lIGJvbmtlcnMuCisJICAgLSBoYXJkd2FyZSB0d2lkZGxpbmcgZ29lcyBiZWZvcmUgInJlY3Vyc2l2ZSIuIE90aGVyd2lzZSB3aGVuIHdlCisJICAgcG9sbCB0aGUgY2FyZCwgYW5kIGEgcmVjdXJzaXZlIGludGVycnVwdCBoYXBwZW5zLCB3ZSB3b24ndAorCSAgIGFjayB0aGUgY2FyZCwgc28gaXQgbWlnaHQga2VlcCBvbiBpbnRlcnJ1cHRpbmcgdXMuIChlc3BlY2lhbGx5CisJICAgbGV2ZWwgc2Vuc2l0aXZlIGludGVycnVwdCBzeXN0ZW1zIGxpa2UgUENJKS4KIAotICAgICAtIFRoZSAiaW5pdGlhbGl6ZWQiIHRlc3QgZ29lcyBhZnRlciB0aGUgaGFyZHdhcmUgdHdpZGRsaW5nLiBPdGhlcndpc2UKLSAgICAgICB0aGUgY2FyZCB3aWxsIHN0aWNrIHVzIGluIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBhZ2Fpbi4KKwkgICAtIFJhdGUgbGltaXQgZ29lcyBiZWZvcmUgaGFyZHdhcmUgdHdpZGRsaW5nLiBPdGhlcndpc2Ugd2Ugd29uJ3QKKwkgICBjYXRjaCBhIGNhcmQgdGhhdCBoYXMgZ29uZSBib25rZXJzLgogCi0gICAgIC0gVGhlIGluaXRpYWxpemVkIHRlc3QgZ29lcyBiZWZvcmUgcmVjdXJzaXZlLiAKLSAgKi8KKwkgICAtIFRoZSAiaW5pdGlhbGl6ZWQiIHRlc3QgZ29lcyBhZnRlciB0aGUgaGFyZHdhcmUgdHdpZGRsaW5nLiBPdGhlcndpc2UKKwkgICB0aGUgY2FyZCB3aWxsIHN0aWNrIHVzIGluIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBhZ2Fpbi4KKworCSAgIC0gVGhlIGluaXRpYWxpemVkIHRlc3QgZ29lcyBiZWZvcmUgcmVjdXJzaXZlLgorCSAqLwogCiAKIAogI2lmZGVmIElSUV9SQVRFX0xJTUlUCi0gIC8qIEFhYXJnaCEgSSdtIGFzaGFtZWQuIFRoaXMgY29zdHMgbW9yZSBsaW5lcy1vZi1jb2RlIHRoYW4gdGhlCi0gICAgIGFjdHVhbCBpbnRlcnJ1cHQgcm91dGluZSEuIChXZWxsLCB1c2VkIHRvIHdoZW4gSSB3cm90ZSB0aGF0IGNvbW1lbnQpICovCi0gIHsKLSAgICBzdGF0aWMgaW50IGxhc3RqaWY7Ci0gICAgc3RhdGljIGludCBuaW50cj0wOworCS8qIEFhYXJnaCEgSSdtIGFzaGFtZWQuIFRoaXMgY29zdHMgbW9yZSBsaW5lcy1vZi1jb2RlIHRoYW4gdGhlCisJICAgYWN0dWFsIGludGVycnVwdCByb3V0aW5lIS4gKFdlbGwsIHVzZWQgdG8gd2hlbiBJIHdyb3RlIHRoYXQgY29tbWVudCkgKi8KKwl7CisJCXN0YXRpYyBpbnQgbGFzdGppZjsKKwkJc3RhdGljIGludCBuaW50ciA9IDA7CiAKLSAgICBpZiAobGFzdGppZiA9PSBqaWZmaWVzKSB7Ci0gICAgICBpZiAoKytuaW50ciA+IElSUV9SQVRFX0xJTUlUKSB7Ci0gICAgICAgIGZyZWVfaXJxIChIb3N0UC0+SXZlYywgcHRyKTsKLSAgICAgICAgcHJpbnRrIChLRVJOX0VSUiAicmlvOiBUb28gbWFueSBpbnRlcnJ1cHRzLiBUdXJuaW5nIG9mZiBpbnRlcnJ1cHQgJWQuXG4iLCAKLSAgICAgICAgICAgICAgICBIb3N0UC0+SXZlYyk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGxhc3RqaWYgPSBqaWZmaWVzOwotICAgICAgbmludHIgPSAwOwotICAgIH0KLSAgfQorCQlpZiAobGFzdGppZiA9PSBqaWZmaWVzKSB7CisJCQlpZiAoKytuaW50ciA+IElSUV9SQVRFX0xJTUlUKSB7CisJCQkJZnJlZV9pcnEoSG9zdFAtPkl2ZWMsIHB0cik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJyaW86IFRvbyBtYW55IGludGVycnVwdHMuIFR1cm5pbmcgb2ZmIGludGVycnVwdCAlZC5cbiIsIEhvc3RQLT5JdmVjKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxhc3RqaWYgPSBqaWZmaWVzOworCQkJbmludHIgPSAwOworCQl9CisJfQogI2VuZGlmCi0gIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSUZMT1csICJyaW86IFdlJ3ZlIGhhdmUgbm90aWNlZCB0aGUgaW50ZXJydXB0XG4iKTsgCi0gIGlmIChIb3N0UC0+SXZlYyA9PSBpcnEpIHsKLSAgICAvKiBUZWxsIHRoZSBjYXJkIHdlJ3ZlIG5vdGljZWQgdGhlIGludGVycnVwdC4gKi8KLSAgICByaW9fcmVzZXRfaW50ZXJydXB0IChIb3N0UCk7Ci0gIH0KKwlyaW9fZHByaW50ayhSSU9fREVCVUdfSUZMT1csICJyaW86IFdlJ3ZlIGhhdmUgbm90aWNlZCB0aGUgaW50ZXJydXB0XG4iKTsKKwlpZiAoSG9zdFAtPkl2ZWMgPT0gaXJxKSB7CisJCS8qIFRlbGwgdGhlIGNhcmQgd2UndmUgbm90aWNlZCB0aGUgaW50ZXJydXB0LiAqLworCQlyaW9fcmVzZXRfaW50ZXJydXB0KEhvc3RQKTsKKwl9CiAKLSAgaWYgKChIb3N0UC0+RmxhZ3MgJiBSVU5fU1RBVEUpICE9IFJDX1JVTk5JTkcpCi0gIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJaWYgKChIb3N0UC0+RmxhZ3MgJiBSVU5fU1RBVEUpICE9IFJDX1JVTk5JTkcpCisJCXJldHVybiBJUlFfSEFORExFRDsKIAotICBpZiAodGVzdF9hbmRfc2V0X2JpdCAoUklPX0JPQVJEX0lOVFJfTE9DSywgJkhvc3RQLT5sb2NrcykpIHsKLSAgICBwcmludGsgKEtFUk5fRVJSICJSZWN1cnNpdmUgaW50ZXJydXB0ISAoaG9zdCAlZC9pcnElZClcbiIsIAotICAgICAgICAgICAgKGludCkgcHRyLCBIb3N0UC0+SXZlYyk7Ci0gICAgcmV0dXJuIElSUV9IQU5ETEVEOwotICB9CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoUklPX0JPQVJEX0lOVFJfTE9DSywgJkhvc3RQLT5sb2NrcykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJSZWN1cnNpdmUgaW50ZXJydXB0ISAoaG9zdCAlZC9pcnElZClcbiIsIChpbnQpIHB0ciwgSG9zdFAtPkl2ZWMpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQogCi0gIFJJT1NlcnZpY2VIb3N0KHAsIEhvc3RQLCBpcnEpOworCVJJT1NlcnZpY2VIb3N0KHAsIEhvc3RQLCBpcnEpOwogCi0gIHJpb19kcHJpbnRrICggUklPX0RFQlVHX0lGTE9XLCAicmlvaW50cigpIGRvaW5nIGhvc3QgJWQgdHlwZSAlZFxuIiwgCi0gICAgICAgICAgICAgICAgKGludCkgcHRyLCBIb3N0UC0+VHlwZSk7CisJcmlvX2RwcmludGsoUklPX0RFQlVHX0lGTE9XLCAicmlvaW50cigpIGRvaW5nIGhvc3QgJWQgdHlwZSAlZFxuIiwgKGludCkgcHRyLCBIb3N0UC0+VHlwZSk7CiAKLSAgY2xlYXJfYml0IChSSU9fQk9BUkRfSU5UUl9MT0NLLCAmSG9zdFAtPmxvY2tzKTsKLSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JRkxPVywgInJpbzogZXhpdCByaW9faW50ZXJydXB0ICglZC8lZClcbiIsIAotICAgICAgICAgICAgICAgaXJxLCBIb3N0UC0+SXZlYyk7IAotICBmdW5jX2V4aXQgKCk7Ci0gIHJldHVybiBJUlFfSEFORExFRDsKKwljbGVhcl9iaXQoUklPX0JPQVJEX0lOVFJfTE9DSywgJkhvc3RQLT5sb2Nrcyk7CisJcmlvX2RwcmludGsoUklPX0RFQlVHX0lGTE9XLCAicmlvOiBleGl0IHJpb19pbnRlcnJ1cHQgKCVkLyVkKVxuIiwgaXJxLCBIb3N0UC0+SXZlYyk7CisJZnVuY19leGl0KCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCiAKLXN0YXRpYyB2b2lkIHJpb19wb2xsZnVuYyAodW5zaWduZWQgbG9uZyBkYXRhKQorc3RhdGljIHZvaWQgcmlvX3BvbGxmdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLSAgZnVuY19lbnRlciAoKTsKKwlmdW5jX2VudGVyKCk7CiAKLSAgcmlvX2ludGVycnVwdCAoMCwgJnAtPlJJT0hvc3RzW2RhdGFdLCBOVUxMKTsKLSAgcC0+UklPSG9zdHNbZGF0YV0udGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyByaW9fcG9sbDsKLSAgYWRkX3RpbWVyICgmcC0+UklPSG9zdHNbZGF0YV0udGltZXIpOworCXJpb19pbnRlcnJ1cHQoMCwgJnAtPlJJT0hvc3RzW2RhdGFdLCBOVUxMKTsKKwlwLT5SSU9Ib3N0c1tkYXRhXS50aW1lci5leHBpcmVzID0gamlmZmllcyArIHJpb19wb2xsOworCWFkZF90aW1lcigmcC0+UklPSG9zdHNbZGF0YV0udGltZXIpOwogCi0gIGZ1bmNfZXhpdCAoKTsKKwlmdW5jX2V4aXQoKTsKIH0KIAogCkBAIC00ODUsMTA2ICs0NzksOTEgQEAKIC8qIEVoaG0uIEkgZG9uJ3Qga25vdyBob3cgdG8gZmlkZGxlIHdpdGggaW50ZXJydXB0cyBvbiB0aGUgU3BlY2lhbGl4IAogICAgY2FyZHMuIC4uLi4gICBIbW0uIE9rIEkgZmlndXJlZCBpdCBvdXQuIFlvdSBkb24ndC4gIC0tIFJFVyAqLwogCi1zdGF0aWMgdm9pZCByaW9fZGlzYWJsZV90eF9pbnRlcnJ1cHRzICh2b2lkICogcHRyKSAKK3N0YXRpYyB2b2lkIHJpb19kaXNhYmxlX3R4X2ludGVycnVwdHModm9pZCAqcHRyKQogewotICBmdW5jX2VudGVyKCk7CisJZnVuY19lbnRlcigpOwogCi0gIC8qICBwb3J0LT5ncy5mbGFncyAmPSB+R1NfVFhfSU5URU47ICovCisJLyogIHBvcnQtPmdzLmZsYWdzICY9IH5HU19UWF9JTlRFTjsgKi8KIAotICBmdW5jX2V4aXQoKTsKKwlmdW5jX2V4aXQoKTsKIH0KIAogCi1zdGF0aWMgdm9pZCByaW9fZW5hYmxlX3R4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpIAorc3RhdGljIHZvaWQgcmlvX2VuYWJsZV90eF9pbnRlcnJ1cHRzKHZvaWQgKnB0cikKIHsKLSAgc3RydWN0IFBvcnQgKlBvcnRQID0gcHRyOwotICAvKiBpbnQgaG47ICovCisJc3RydWN0IFBvcnQgKlBvcnRQID0gcHRyOworCS8qIGludCBobjsgKi8KIAotICBmdW5jX2VudGVyKCk7CisJZnVuY19lbnRlcigpOwogCi0gIC8qIGhuID0gUG9ydFAtPkhvc3RQIC0gcC0+UklPSG9zdHM7CisJLyogaG4gPSBQb3J0UC0+SG9zdFAgLSBwLT5SSU9Ib3N0czsKIAotICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlB1c2hpbmcgaG9zdCAlZFxuIiwgaG4pOwotICAgICByaW9faW50ZXJydXB0ICgtMSwodm9pZCAqKSBobiwgTlVMTCk7ICovCisJICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJQdXNoaW5nIGhvc3QgJWRcbiIsIGhuKTsKKwkgICByaW9faW50ZXJydXB0ICgtMSwodm9pZCAqKSBobiwgTlVMTCk7ICovCiAKLSAgUklPVHhFbmFibGUoKGNoYXIgKikgUG9ydFApOworCVJJT1R4RW5hYmxlKChjaGFyICopIFBvcnRQKTsKIAotICAvKiAKLSAgICogSW4gZ2VuZXJhbCB3ZSBjYW5ub3QgY291bnQgb24gInR4IGVtcHR5IiBpbnRlcnJ1cHRzLCBhbHRob3VnaAotICAgKiB0aGUgaW50ZXJydXB0IHJvdXRpbmUgc2VlbXMgdG8gYmUgYWJsZSB0byB0ZWxsIHRoZSBkaWZmZXJlbmNlLiAKLSAgICovCi0gIFBvcnRQLT5ncy5mbGFncyAmPSB+R1NfVFhfSU5URU47CisJLyoKKwkgKiBJbiBnZW5lcmFsIHdlIGNhbm5vdCBjb3VudCBvbiAidHggZW1wdHkiIGludGVycnVwdHMsIGFsdGhvdWdoCisJICogdGhlIGludGVycnVwdCByb3V0aW5lIHNlZW1zIHRvIGJlIGFibGUgdG8gdGVsbCB0aGUgZGlmZmVyZW5jZS4KKwkgKi8KKwlQb3J0UC0+Z3MuZmxhZ3MgJj0gfkdTX1RYX0lOVEVOOwogCi0gIGZ1bmNfZXhpdCgpOworCWZ1bmNfZXhpdCgpOwogfQogCiAKLXN0YXRpYyB2b2lkIHJpb19kaXNhYmxlX3J4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpIAorc3RhdGljIHZvaWQgcmlvX2Rpc2FibGVfcnhfaW50ZXJydXB0cyh2b2lkICpwdHIpCiB7Ci0gIGZ1bmNfZW50ZXIoKTsKLSAgZnVuY19leGl0KCk7CisJZnVuY19lbnRlcigpOworCWZ1bmNfZXhpdCgpOwogfQogCi1zdGF0aWMgdm9pZCByaW9fZW5hYmxlX3J4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpIAorc3RhdGljIHZvaWQgcmlvX2VuYWJsZV9yeF9pbnRlcnJ1cHRzKHZvaWQgKnB0cikKIHsKLSAgLyogIHN0cnVjdCByaW9fcG9ydCAqcG9ydCA9IHB0cjsgKi8KLSAgZnVuY19lbnRlcigpOwotICBmdW5jX2V4aXQoKTsKKwkvKiAgc3RydWN0IHJpb19wb3J0ICpwb3J0ID0gcHRyOyAqLworCWZ1bmNfZW50ZXIoKTsKKwlmdW5jX2V4aXQoKTsKIH0KIAogCiAvKiBKZWV6LiBJc24ndCB0aGlzIHNpbXBsZT8gICovCi1zdGF0aWMgaW50IHJpb19nZXRfQ0QgKHZvaWQgKiBwdHIpIAorc3RhdGljIGludCByaW9fZ2V0X0NEKHZvaWQgKnB0cikKIHsKLSAgc3RydWN0IFBvcnQgKlBvcnRQID0gcHRyOwotICBpbnQgcnY7CisJc3RydWN0IFBvcnQgKlBvcnRQID0gcHRyOworCWludCBydjsKIAotICBmdW5jX2VudGVyKCk7Ci0gIHJ2ID0gKFBvcnRQLT5Nb2RlbVN0YXRlICYgTVNWUjFfQ0QpICE9IDA7CisJZnVuY19lbnRlcigpOworCXJ2ID0gKFBvcnRQLT5Nb2RlbVN0YXRlICYgTVNWUjFfQ0QpICE9IDA7CiAKLSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiR2V0dGluZyBDRCBzdGF0dXM6ICVkXG4iLCBydik7Ci0gIAotICBmdW5jX2V4aXQoKTsgIAotICByZXR1cm4gcnY7CisJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOSVQsICJHZXR0aW5nIENEIHN0YXR1czogJWRcbiIsIHJ2KTsKKworCWZ1bmNfZXhpdCgpOworCXJldHVybiBydjsKIH0KIAogCiAvKiBKZWV6LiBJc24ndCB0aGlzIHNpbXBsZT8gQWN0dWFsbHksIHdlIGNhbiBzeW5jIHdpdGggdGhlIGFjdHVhbCBwb3J0CiAgICBieSBqdXN0IHB1c2hpbmcgc3R1ZmYgaW50byB0aGUgcXVldWUgZ29pbmcgdG8gdGhlIHBvcnQuLi4gKi8KLXN0YXRpYyBpbnQgcmlvX2NoYXJzX2luX2J1ZmZlciAodm9pZCAqIHB0cikgCitzdGF0aWMgaW50IHJpb19jaGFyc19pbl9idWZmZXIodm9pZCAqcHRyKQogewotICBmdW5jX2VudGVyKCk7CisJZnVuY19lbnRlcigpOwogCi0gIGZ1bmNfZXhpdCgpOyAgCi0gIHJldHVybiAwOworCWZ1bmNfZXhpdCgpOworCXJldHVybiAwOwogfQogCiAKIC8qIE5vdGhpbmcgc3BlY2lhbCBoZXJlLi4uICovCi1zdGF0aWMgdm9pZCByaW9fc2h1dGRvd25fcG9ydCAodm9pZCAqIHB0cikgCitzdGF0aWMgdm9pZCByaW9fc2h1dGRvd25fcG9ydCh2b2lkICpwdHIpCiB7Ci0gIHN0cnVjdCBQb3J0ICpQb3J0UDsKKwlzdHJ1Y3QgUG9ydCAqUG9ydFA7CiAKLSAgZnVuY19lbnRlcigpOworCWZ1bmNfZW50ZXIoKTsKIAotICBQb3J0UCA9IChzdHJ1Y3QgUG9ydCAqKXB0cjsKLSAgUG9ydFAtPmdzLnR0eSA9IE5VTEw7Ci0jaWYgMAotICBwb3J0LT5ncy5mbGFncyAmPSB+IEdTX0FDVElWRTsKLSAgaWYgKCFwb3J0LT5ncy50dHkpIHsKLSAgICByaW9fZHByaW50ayAoUklPX0RCVUdfVFRZLCAiTm8gdHR5LlxuIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmICghcG9ydC0+Z3MudHR5LT50ZXJtaW9zKSB7Ci0gICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJObyB0ZXJtaW9zLlxuIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChwb3J0LT5ncy50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkgewotICAgIHJpb19zZXRzaWduYWxzIChwb3J0LCAwLCAwKTsKLSAgfQotI2VuZGlmCi0KLSAgZnVuY19leGl0KCk7CisJUG9ydFAgPSAoc3RydWN0IFBvcnQgKikgcHRyOworCVBvcnRQLT5ncy50dHkgPSBOVUxMOworCWZ1bmNfZXhpdCgpOwogfQogCiAKQEAgLTU5NSwxNiArNTc0LDE2IEBACiAgICBydW5uaW5nIG1pbmljb20gb24gYSBzZXJpYWwgcG9ydCB0aGF0IGlzIGRyaXZlbiBieSBhIG1vZHVsYXJpemVkCiAgICBkcml2ZXIuIEhhdmUgdGhlIG1vZGVtIGhhbmd1cC4gVGhlbiByZW1vdmUgdGhlIGRyaXZlciBtb2R1bGUuIFRoZW4KICAgIGV4aXQgbWluaWNvbS4gIEkgZXhwZWN0IGFuICJvb3BzIi4gIC0tIFJFVyAqLwotc3RhdGljIHZvaWQgcmlvX2h1bmd1cCAodm9pZCAqcHRyKQorc3RhdGljIHZvaWQgcmlvX2h1bmd1cCh2b2lkICpwdHIpCiB7Ci0gIHN0cnVjdCBQb3J0ICpQb3J0UDsKKwlzdHJ1Y3QgUG9ydCAqUG9ydFA7CiAKLSAgZnVuY19lbnRlcigpOwotICAKLSAgUG9ydFAgPSAoc3RydWN0IFBvcnQgKilwdHI7Ci0gIFBvcnRQLT5ncy50dHkgPSBOVUxMOworCWZ1bmNfZW50ZXIoKTsKIAotICBmdW5jX2V4aXQgKCk7CisJUG9ydFAgPSAoc3RydWN0IFBvcnQgKikgcHRyOworCVBvcnRQLT5ncy50dHkgPSBOVUxMOworCisJZnVuY19leGl0KCk7CiB9CiAKIApAQCAtNjEyLDE0NiArNTkxLDEwMCBAQAogICAgdGhpcy4gCiAgICByc19jbG9zZSAoLi4uKXtzYXZlX2ZsYWdzO2NsaTtyZWFsX2Nsb3NlKCk7ZGVjX3VzZV9jb3VudDtyZXN0b3JlX2ZsYWdzO30KICAqLwotc3RhdGljIHZvaWQgcmlvX2Nsb3NlICh2b2lkICpwdHIpCitzdGF0aWMgdm9pZCByaW9fY2xvc2Uodm9pZCAqcHRyKQogewotICBzdHJ1Y3QgUG9ydCAqUG9ydFA7CisJc3RydWN0IFBvcnQgKlBvcnRQOwogCi0gIGZ1bmNfZW50ZXIgKCk7CisJZnVuY19lbnRlcigpOwogCi0gIFBvcnRQID0gKHN0cnVjdCBQb3J0ICopcHRyOworCVBvcnRQID0gKHN0cnVjdCBQb3J0ICopIHB0cjsKIAotICByaW90Y2xvc2UgKHB0cik7CisJcmlvdGNsb3NlKHB0cik7CiAKLSAgaWYoUG9ydFAtPmdzLmNvdW50KSB7Ci0gICAgcHJpbnRrIChLRVJOX0VSUiAiV0FSTklORyBwb3J0IGNvdW50OiVkXG4iLCBQb3J0UC0+Z3MuY291bnQpOwotICAgIFBvcnRQLT5ncy5jb3VudCA9IDA7IAotICB9ICAgICAgICAgICAgICAgIAorCWlmIChQb3J0UC0+Z3MuY291bnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJXQVJOSU5HIHBvcnQgY291bnQ6JWRcbiIsIFBvcnRQLT5ncy5jb3VudCk7CisJCVBvcnRQLT5ncy5jb3VudCA9IDA7CisJfQogCi0gIFBvcnRQLT5ncy50dHkgPSBOVUxMOwotICBmdW5jX2V4aXQgKCk7CisJUG9ydFAtPmdzLnR0eSA9IE5VTEw7CisJZnVuY19leGl0KCk7CiB9CiAKIAogCi1zdGF0aWMgaW50IHJpb19md19pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCByaW9fZndfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotICBpbnQgcmMgPSAwOwotICBmdW5jX2VudGVyKCk7CisJaW50IHJjID0gMDsKKwlmdW5jX2VudGVyKCk7CiAKLSAgLyogVGhlICJkZXYiIGFyZ3VtZW50IGlzbid0IHVzZWQuICovCi0gIHJjID0gcmlvY29udHJvbCAocCwgMCwgY21kLCAodm9pZCAqKWFyZywgY2FwYWJsZShDQVBfU1lTX0FETUlOKSk7CisJLyogVGhlICJkZXYiIGFyZ3VtZW50IGlzbid0IHVzZWQuICovCisJcmMgPSByaW9jb250cm9sKHAsIDAsIGNtZCwgKHZvaWQgKikgYXJnLCBjYXBhYmxlKENBUF9TWVNfQURNSU4pKTsKIAotICBmdW5jX2V4aXQgKCk7Ci0gIHJldHVybiByYzsKKwlmdW5jX2V4aXQoKTsKKwlyZXR1cm4gcmM7CiB9CiAKLWV4dGVybiBpbnQgUklPU2hvcnRDb21tYW5kKHN0cnVjdCByaW9faW5mbyAqcCwgc3RydWN0IFBvcnQgKlBvcnRQLAotICAgICAgICAgICAgICAgaW50IGNvbW1hbmQsIGludCBsZW4sIGludCBhcmcpOworZXh0ZXJuIGludCBSSU9TaG9ydENvbW1hbmQoc3RydWN0IHJpb19pbmZvICpwLCBzdHJ1Y3QgUG9ydCAqUG9ydFAsIGludCBjb21tYW5kLCBpbnQgbGVuLCBpbnQgYXJnKTsKIAotc3RhdGljIGludCByaW9faW9jdGwgKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHAsIAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgaW50IHJpb19pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0gIGludCByYzsKLSAgc3RydWN0IFBvcnQgKlBvcnRQOwotICBpbnQgaXZhbDsKKwlpbnQgcmM7CisJc3RydWN0IFBvcnQgKlBvcnRQOworCWludCBpdmFsOwogCi0gIGZ1bmNfZW50ZXIoKTsKKwlmdW5jX2VudGVyKCk7CiAKLSAgUG9ydFAgPSAoc3RydWN0IFBvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCVBvcnRQID0gKHN0cnVjdCBQb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CiAKLSAgcmMgID0gMDsKLSAgc3dpdGNoIChjbWQpIHsKLSNpZiAwCi0gIGNhc2UgVElPQ0dTT0ZUQ0FSOgotICAgIHJjID0gcHV0X3VzZXIoKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpID8gMSA6IDApLAotICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCAqKSBhcmcpOwotICAgIGJyZWFrOwotI2VuZGlmCi0gIGNhc2UgVElPQ1NTT0ZUQ0FSOgotICAgIGlmICgocmMgPSBnZXRfdXNlcihpdmFsLCAodW5zaWduZWQgaW50ICopIGFyZykpID09IDApIHsKLSAgICAgIHR0eS0+dGVybWlvcy0+Y19jZmxhZyA9Ci0gICAgICAgICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiB+Q0xPQ0FMKSB8Ci0gICAgICAgIChpdmFsID8gQ0xPQ0FMIDogMCk7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIFRJT0NHU0VSSUFMOgotICAgIHJjID0gLUVGQVVMVDsKLSAgICBpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgKHZvaWQgKikgYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpKSkKLSAgICAgIHJjID0gZ3NfZ2V0c2VyaWFsKCZQb3J0UC0+Z3MsIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqKSBhcmcpOwotICAgIGJyZWFrOwotICBjYXNlIFRDU0JSSzoKLSAgICBpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgewotICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJCUkVBSyBvbiBkZWxldGVkIFJUQVxuIik7Ci0gICAgICByYyA9IC1FSU87ICAgICAgCi0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChSSU9TaG9ydENvbW1hbmQocCwgUG9ydFAsIFNCUkVBSywgMiwgMjUwKSA9PSBSSU9fRkFJTCkgewotICAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiU0JSRUFLIFJJT1Nob3J0Q29tbWFuZCBmYWlsZWRcbiIpOwotICAgICAgICAgcmMgPSAtRUlPOwotICAgICAgfSAgICAgICAgICAKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVENTQlJLUDoKLSAgICBpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgewotICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJCUkVBSyBvbiBkZWxldGVkIFJUQVxuIik7Ci0gICAgICByYyA9IC1FSU87ICAgICAgCi0gICAgfSBlbHNlIHsKLSAgICAgIGludCBsOwotICAgICAgbCA9IGFyZz9hcmcqMTAwOjI1MDsKLSAgICAgIGlmIChsID4gMjU1KSBsID0gMjU1OwotICAgICAgaWYgKFJJT1Nob3J0Q29tbWFuZChwLCBQb3J0UCwgU0JSRUFLLCAyLCBhcmc/YXJnKjEwMDoyNTApID09IFJJT19GQUlMKSB7Ci0gICAgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJTQlJFQUsgUklPU2hvcnRDb21tYW5kIGZhaWxlZFxuIik7Ci0gICAgICAgICByYyA9IC1FSU87Ci0gICAgICB9ICAgICAgICAgIAotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBUSU9DU1NFUklBTDoKLSAgICByYyA9IC1FRkFVTFQ7Ci0gICAgaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgKHZvaWQgKikgYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpKSkKLSAgICAgIHJjID0gZ3Nfc2V0c2VyaWFsKCZQb3J0UC0+Z3MsIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqKSBhcmcpOwotICAgIGJyZWFrOwotI2lmIDAKLSAgLyoKLSAgICogbm90ZTogdGhlc2UgSU9DVExzIG5vIGxvbmdlciByZWFjaCBoZXJlLiAgVXNlCi0gICAqIHRpb2Ntc2V0L3Rpb2NtZ2V0IGRyaXZlciBtZXRob2RzIGluc3RlYWQuICBUaGUKLSAgICogI2lmIDAgZGlzYWJsZW1lbnQgcHJlZGF0ZXMgdGhpcyBjb21tZW50LgotICAgKi8KLSAgY2FzZSBUSU9DTUdFVDoKLSAgICByYyA9IC1FRkFVTFQ7Ci0gICAgaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkICopIGFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVuc2lnbmVkIGludCkpKSB7Ci0gICAgICByYyA9IDA7Ci0gICAgICBpdmFsID0gcmlvX2dldHNpZ25hbHMocG9ydCk7Ci0gICAgICBwdXRfdXNlcihpdmFsLCAodW5zaWduZWQgaW50ICopIGFyZyk7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIFRJT0NNQklTOgotICAgIGlmICgocmMgPSBnZXRfdXNlcihpdmFsLCAodW5zaWduZWQgaW50ICopIGFyZykpID09IDApIHsKLSAgICAgIHJpb19zZXRzaWduYWxzKHBvcnQsICgoaXZhbCAmIFRJT0NNX0RUUikgPyAxIDogLTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpdmFsICYgVElPQ01fUlRTKSA/IDEgOiAtMSkpOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBUSU9DTUJJQzoKLSAgICBpZiAoKHJjID0gZ2V0X3VzZXIoaXZhbCwgKHVuc2lnbmVkIGludCAqKSBhcmcpKSA9PSAwKSB7Ci0gICAgICByaW9fc2V0c2lnbmFscyhwb3J0LCAoKGl2YWwgJiBUSU9DTV9EVFIpID8gMCA6IC0xKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaXZhbCAmIFRJT0NNX1JUUykgPyAwIDogLTEpKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVElPQ01TRVQ6Ci0gICAgaWYgKChyYyA9IGdldF91c2VyKGl2YWwsICh1bnNpZ25lZCBpbnQgKikgYXJnKSkgPT0gMCkgewotICAgICAgcmlvX3NldHNpZ25hbHMocG9ydCwgKChpdmFsICYgVElPQ01fRFRSKSA/IDEgOiAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaXZhbCAmIFRJT0NNX1JUUykgPyAxIDogMCkpOwotICAgIH0KLSAgICBicmVhazsKLSNlbmRpZgotICBkZWZhdWx0OgotICAgIHJjID0gLUVOT0lPQ1RMQ01EOwotICAgIGJyZWFrOwotICB9Ci0gIGZ1bmNfZXhpdCgpOwotICByZXR1cm4gcmM7CisJcmMgPSAwOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUSU9DU1NPRlRDQVI6CisJCWlmICgocmMgPSBnZXRfdXNlcihpdmFsLCAodW5zaWduZWQgaW50ICopIGFyZykpID09IDApIHsKKwkJCXR0eS0+dGVybWlvcy0+Y19jZmxhZyA9ICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiB+Q0xPQ0FMKSB8IChpdmFsID8gQ0xPQ0FMIDogMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUSU9DR1NFUklBTDoKKwkJcmMgPSAtRUZBVUxUOworCQlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgKHZvaWQgKikgYXJnLCBzaXplb2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpKSkKKwkJCXJjID0gZ3NfZ2V0c2VyaWFsKCZQb3J0UC0+Z3MsIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqKSBhcmcpOworCQlicmVhazsKKwljYXNlIFRDU0JSSzoKKwkJaWYgKFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVFRZLCAiQlJFQUsgb24gZGVsZXRlZCBSVEFcbiIpOworCQkJcmMgPSAtRUlPOworCQl9IGVsc2UgeworCQkJaWYgKFJJT1Nob3J0Q29tbWFuZChwLCBQb3J0UCwgU0JSRUFLLCAyLCAyNTApID09IFJJT19GQUlMKSB7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICJTQlJFQUsgUklPU2hvcnRDb21tYW5kIGZhaWxlZFxuIik7CisJCQkJcmMgPSAtRUlPOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgVENTQlJLUDoKKwkJaWYgKFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVFRZLCAiQlJFQUsgb24gZGVsZXRlZCBSVEFcbiIpOworCQkJcmMgPSAtRUlPOworCQl9IGVsc2UgeworCQkJaW50IGw7CisJCQlsID0gYXJnID8gYXJnICogMTAwIDogMjUwOworCQkJaWYgKGwgPiAyNTUpCisJCQkJbCA9IDI1NTsKKwkJCWlmIChSSU9TaG9ydENvbW1hbmQocCwgUG9ydFAsIFNCUkVBSywgMiwgYXJnID8gYXJnICogMTAwIDogMjUwKSA9PSBSSU9fRkFJTCkgeworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTlRSLCAiU0JSRUFLIFJJT1Nob3J0Q29tbWFuZCBmYWlsZWRcbiIpOworCQkJCXJjID0gLUVJTzsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIFRJT0NTU0VSSUFMOgorCQlyYyA9IC1FRkFVTFQ7CisJCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICh2b2lkICopIGFyZywgc2l6ZW9mKHN0cnVjdCBzZXJpYWxfc3RydWN0KSkpCisJCQlyYyA9IGdzX3NldHNlcmlhbCgmUG9ydFAtPmdzLCAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKikgYXJnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKwlmdW5jX2V4aXQoKTsKKwlyZXR1cm4gcmM7CiB9CiAKIApAQCAtNzcxLDM3ICs3MDQsMzcgQEAKICAqIGZsb3cgY29udHJvbCBzY2hlbWUgaXMgaW4gdXNlIGZvciB0aGF0IHBvcnQuIC0tIFNpbW9uIEFsbGVuCiAgKi8KIAotc3RhdGljIHZvaWQgcmlvX3Rocm90dGxlIChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3N0YXRpYyB2b2lkIHJpb190aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotICBzdHJ1Y3QgUG9ydCAqcG9ydCA9IChzdHJ1Y3QgUG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0gIAotICBmdW5jX2VudGVyKCk7Ci0gIC8qIElmIHRoZSBwb3J0IGlzIHVzaW5nIGFueSB0eXBlIG9mIGlucHV0IGZsb3cKLSAgICogY29udHJvbCB0aGVuIHRocm90dGxlIHRoZSBwb3J0LgotICAgKi8KKwlzdHJ1Y3QgUG9ydCAqcG9ydCA9IChzdHJ1Y3QgUG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOwogCi0gIGlmKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB8fCAoSV9JWE9GRih0dHkpKSApIHsKLSAgICBwb3J0LT5TdGF0ZSB8PSBSSU9fVEhST1RUTEVfUlg7Ci0gIH0KKwlmdW5jX2VudGVyKCk7CisJLyogSWYgdGhlIHBvcnQgaXMgdXNpbmcgYW55IHR5cGUgb2YgaW5wdXQgZmxvdworCSAqIGNvbnRyb2wgdGhlbiB0aHJvdHRsZSB0aGUgcG9ydC4KKwkgKi8KIAotICBmdW5jX2V4aXQoKTsKKwlpZiAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHx8IChJX0lYT0ZGKHR0eSkpKSB7CisJCXBvcnQtPlN0YXRlIHw9IFJJT19USFJPVFRMRV9SWDsKKwl9CisKKwlmdW5jX2V4aXQoKTsKIH0KIAogCi1zdGF0aWMgdm9pZCByaW9fdW50aHJvdHRsZSAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCitzdGF0aWMgdm9pZCByaW9fdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotICBzdHJ1Y3QgUG9ydCAqcG9ydCA9IChzdHJ1Y3QgUG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IFBvcnQgKnBvcnQgPSAoc3RydWN0IFBvcnQgKikgdHR5LT5kcml2ZXJfZGF0YTsKIAotICBmdW5jX2VudGVyKCk7Ci0gIC8qIEFsd2F5cyB1bnRocm90dGxlIGV2ZW4gaWYgZmxvdyBjb250cm9sIGlzIG5vdCBlbmFibGVkIG9uCi0gICAqIHRoaXMgcG9ydCBpbiBjYXNlIHdlIGRpc2FibGVkIGZsb3cgY29udHJvbCB3aGlsZSB0aGUgcG9ydAotICAgKiB3YXMgdGhyb3R0bGVkCi0gICAqLworCWZ1bmNfZW50ZXIoKTsKKwkvKiBBbHdheXMgdW50aHJvdHRsZSBldmVuIGlmIGZsb3cgY29udHJvbCBpcyBub3QgZW5hYmxlZCBvbgorCSAqIHRoaXMgcG9ydCBpbiBjYXNlIHdlIGRpc2FibGVkIGZsb3cgY29udHJvbCB3aGlsZSB0aGUgcG9ydAorCSAqIHdhcyB0aHJvdHRsZWQKKwkgKi8KIAotICBwb3J0LT5TdGF0ZSAmPSB+UklPX1RIUk9UVExFX1JYOworCXBvcnQtPlN0YXRlICY9IH5SSU9fVEhST1RUTEVfUlg7CiAKLSAgZnVuY19leGl0KCk7Ci0gIHJldHVybjsKKwlmdW5jX2V4aXQoKTsKKwlyZXR1cm47CiB9CiAKIApAQCAtODEzLDM1ICs3NDYsMzQgQEAKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAogCi1zdGF0aWMgc3RydWN0IHZwZF9wcm9tICpnZXRfVlBEX1BST00gKHN0cnVjdCBIb3N0ICpocCkKK3N0YXRpYyBzdHJ1Y3QgdnBkX3Byb20gKmdldF9WUERfUFJPTShzdHJ1Y3QgSG9zdCAqaHApCiB7Ci0gIHN0YXRpYyBzdHJ1Y3QgdnBkX3Byb20gdnBkcDsKLSAgY2hhciAqcDsKLSAgaW50IGk7CisJc3RhdGljIHN0cnVjdCB2cGRfcHJvbSB2cGRwOworCWNoYXIgKnA7CisJaW50IGk7CiAKLSAgZnVuY19lbnRlcigpOwotICByaW9fZHByaW50ayAoUklPX0RFQlVHX1BST0JFLCAiR29pbmcgdG8gdmVyaWZ5IHZwZCBwcm9tIGF0ICVwLlxuIiwgCi0gICAgICAgICAgICAgIGhwLT5DYWRkciArIFJJT19WUERfUk9NKTsKKwlmdW5jX2VudGVyKCk7CisJcmlvX2RwcmludGsoUklPX0RFQlVHX1BST0JFLCAiR29pbmcgdG8gdmVyaWZ5IHZwZCBwcm9tIGF0ICVwLlxuIiwgaHAtPkNhZGRyICsgUklPX1ZQRF9ST00pOwogCi0gIHAgPSAoY2hhciAqKSAmdnBkcDsKLSAgZm9yIChpPTA7aTwgc2l6ZW9mIChzdHJ1Y3QgdnBkX3Byb20pO2krKykKLSAgICAqcCsrID0gcmVhZGIgKGhwLT5DYWRkcitSSU9fVlBEX1JPTSArIGkqMik7Ci0gICAgICAvKiByZWFkX3Jpb19ieXRlIChocCwgUklPX1ZQRF9ST00gKyBpKjIpOyAqLworCXAgPSAoY2hhciAqKSAmdnBkcDsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCB2cGRfcHJvbSk7IGkrKykKKwkJKnArKyA9IHJlYWRiKGhwLT5DYWRkciArIFJJT19WUERfUk9NICsgaSAqIDIpOworCS8qIHJlYWRfcmlvX2J5dGUgKGhwLCBSSU9fVlBEX1JPTSArIGkqMik7ICovCiAKLSAgLyogVGVybWluYXRlIHRoZSBpZGVudGlmaWVyIHN0cmluZy4gCi0gICAgICoqKiByZXF1aXJlcyBvbmUgZXh0cmEgYnl0ZSBpbiBzdHJ1Y3QgdnBkX3Byb20gKioqICovCi0gICpwKys9MDsgCisJLyogVGVybWluYXRlIHRoZSBpZGVudGlmaWVyIHN0cmluZy4KKwkgKioqIHJlcXVpcmVzIG9uZSBleHRyYSBieXRlIGluIHN0cnVjdCB2cGRfcHJvbSAqKiogKi8KKwkqcCsrID0gMDsKIAotICBpZiAocmlvX2RlYnVnICYgUklPX0RFQlVHX1BST0JFKQotICAgIG15X2hkICgoY2hhciAqKSZ2cGRwLCAweDIwKTsKLSAgCi0gIGZ1bmNfZXhpdCgpOworCWlmIChyaW9fZGVidWcgJiBSSU9fREVCVUdfUFJPQkUpCisJCW15X2hkKChjaGFyICopICZ2cGRwLCAweDIwKTsKIAotICByZXR1cm4gJnZwZHA7CisJZnVuY19leGl0KCk7CisKKwlyZXR1cm4gJnZwZHA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgcmlvX29wcyA9IHsKLQkub3BlbiAgPSByaW90b3BlbiwKKwkub3BlbiA9IHJpb3RvcGVuLAogCS5jbG9zZSA9IGdzX2Nsb3NlLAogCS53cml0ZSA9IGdzX3dyaXRlLAogCS5wdXRfY2hhciA9IGdzX3B1dF9jaGFyLApAQCAtODkzLDcgKzgyNSw3IEBACiAJcmlvX2RyaXZlcjItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKIAl0dHlfc2V0X29wZXJhdGlvbnMocmlvX2RyaXZlcjIsICZyaW9fb3BzKTsKIAotCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgInNldF90ZXJtaW9zID0gJXBcbiIsIGdzX3NldF90ZXJtaW9zKTsKKwlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5JVCwgInNldF90ZXJtaW9zID0gJXBcbiIsIGdzX3NldF90ZXJtaW9zKTsKIAogCWlmICgoZXJyb3IgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKHJpb19kcml2ZXIpKSkKIAkJZ290byBvdXQyOwpAQCAtOTAxLDExNiArODMzLDExMSBAQAogCQlnb3RvIG91dDM7CiAJZnVuY19leGl0KCk7CiAJcmV0dXJuIDA7Ci1vdXQzOgorICAgICAgb3V0MzoKIAl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIocmlvX2RyaXZlcik7Ci1vdXQyOgorICAgICAgb3V0MjoKIAlwdXRfdHR5X2RyaXZlcihyaW9fZHJpdmVyMik7Ci1vdXQxOgorICAgICAgb3V0MToKIAlwdXRfdHR5X2RyaXZlcihyaW9fZHJpdmVyKTsKLW91dDoKLQlwcmludGsoS0VSTl9FUlIgInJpbzogQ291bGRuJ3QgcmVnaXN0ZXIgYSByaW8gZHJpdmVyLCBlcnJvciA9ICVkXG4iLAotCSAgICAgZXJyb3IpOworICAgICAgb3V0OgorCXByaW50ayhLRVJOX0VSUiAicmlvOiBDb3VsZG4ndCByZWdpc3RlciBhIHJpbyBkcml2ZXIsIGVycm9yID0gJWRcbiIsIGVycm9yKTsKIAlyZXR1cm4gMTsKIH0KIAogCi1zdGF0aWMgdm9pZCAqIGNrbWFsbG9jIChpbnQgc2l6ZSkKK3N0YXRpYyB2b2lkICpja21hbGxvYyhpbnQgc2l6ZSkKIHsKLSAgdm9pZCAqcDsKKwl2b2lkICpwOwogCi0gIHAgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotICBpZiAocCkgCi0gICAgbWVtc2V0KHAsIDAsIHNpemUpOwotICByZXR1cm4gcDsKKwlwID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAocCkKKwkJbWVtc2V0KHAsIDAsIHNpemUpOworCXJldHVybiBwOwogfQogCiAKIAotc3RhdGljIGludCByaW9faW5pdF9kYXRhc3RydWN0dXJlcyAodm9pZCkKK3N0YXRpYyBpbnQgcmlvX2luaXRfZGF0YXN0cnVjdHVyZXModm9pZCkKIHsKLSAgaW50IGk7Ci0gIHN0cnVjdCBQb3J0ICpwb3J0OwotICBmdW5jX2VudGVyKCk7CisJaW50IGk7CisJc3RydWN0IFBvcnQgKnBvcnQ7CisJZnVuY19lbnRlcigpOwogCi0gIC8qIE1hbnkgZHJpdmVycyBzdGF0aWNhbGx5IGFsbG9jYXRlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwb3J0cwotICAgICBUaGVyZSBpcyBubyByZWFzb24gbm90IHRvIGFsbG9jYXRlIHRoZW0gZHluYW1pY2FsbHkuIElzIHRoZXJlPyAtLSBSRVcgKi8KLSAgLyogSG93ZXZlciwgdGhlIFJJTyBkcml2ZXIgYWxsb3dzIHVzZXJzIHRvIGNvbmZpZ3VyZSB0aGVpciBmaXJzdAotICAgICBSVEEgYXMgdGhlIHBvcnRzIG51bWJlcmVkIDUwNC01MTEuIFdlIHRoZXJlZm9yZSBuZWVkIHRvIGFsbG9jYXRlIAotICAgICB0aGUgd2hvbGUgcmFuZ2UuIDotKCAgIC0tIFJFVyAqLwotICAKKwkvKiBNYW55IGRyaXZlcnMgc3RhdGljYWxseSBhbGxvY2F0ZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgcG9ydHMKKwkgICBUaGVyZSBpcyBubyByZWFzb24gbm90IHRvIGFsbG9jYXRlIHRoZW0gZHluYW1pY2FsbHkuIElzIHRoZXJlPyAtLSBSRVcgKi8KKwkvKiBIb3dldmVyLCB0aGUgUklPIGRyaXZlciBhbGxvd3MgdXNlcnMgdG8gY29uZmlndXJlIHRoZWlyIGZpcnN0CisJICAgUlRBIGFzIHRoZSBwb3J0cyBudW1iZXJlZCA1MDQtNTExLiBXZSB0aGVyZWZvcmUgbmVlZCB0byBhbGxvY2F0ZQorCSAgIHRoZSB3aG9sZSByYW5nZS4gOi0oICAgLS0gUkVXICovCisKICNkZWZpbmUgUklfU1ogICBzaXplb2Yoc3RydWN0IHJpb19pbmZvKQogI2RlZmluZSBIT1NUX1NaIHNpemVvZihzdHJ1Y3QgSG9zdCkKICNkZWZpbmUgUE9SVF9TWiBzaXplb2Yoc3RydWN0IFBvcnQgKikKICNkZWZpbmUgVE1JT19TWiBzaXplb2Yoc3RydWN0IHRlcm1pb3MgKikKLSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiZ2V0dGluZyA6ICVkICVkICVkICVkICVkIGJ5dGVzXG4iLCAKLSAgICAgICAgICAgICAgIFJJX1NaLCAKLSAgICAgICAgICAgICAgIFJJT19IT1NUUyAqIEhPU1RfU1osCi0gICAgICAgICAgICAgICBSSU9fUE9SVFMgKiBQT1JUX1NaLAotICAgICAgICAgICAgICAgUklPX1BPUlRTICogVE1JT19TWiwKLSAgICAgICAgICAgICAgIFJJT19QT1JUUyAqIFRNSU9fU1opOwotICAKLSAgaWYgKCEocCAgICAgICAgICAgICAgICAgID0gY2ttYWxsb2MgKCAgICAgICAgICAgICAgUklfU1opKSkgZ290byBmcmVlMDsKLSAgaWYgKCEocC0+UklPSG9zdHMgICAgICAgID0gY2ttYWxsb2MgKFJJT19IT1NUUyAqIEhPU1RfU1opKSkgZ290byBmcmVlMTsKLSAgaWYgKCEocC0+UklPUG9ydHAgICAgICAgID0gY2ttYWxsb2MgKFJJT19QT1JUUyAqIFBPUlRfU1opKSkgZ290byBmcmVlMjsKLSAgcC0+UklPQ29uZiA9IFJJT0NvbmY7Ci0gIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkdvdCA6ICVwICVwICVwXG4iLCAKLSAgICAgICAgICAgICAgIHAsIHAtPlJJT0hvc3RzLCBwLT5SSU9Qb3J0cCk7CisJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOSVQsICJnZXR0aW5nIDogJWQgJWQgJWQgJWQgJWQgYnl0ZXNcbiIsIFJJX1NaLCBSSU9fSE9TVFMgKiBIT1NUX1NaLCBSSU9fUE9SVFMgKiBQT1JUX1NaLCBSSU9fUE9SVFMgKiBUTUlPX1NaLCBSSU9fUE9SVFMgKiBUTUlPX1NaKTsKKworCWlmICghKHAgPSBja21hbGxvYyhSSV9TWikpKQorCQlnb3RvIGZyZWUwOworCWlmICghKHAtPlJJT0hvc3RzID0gY2ttYWxsb2MoUklPX0hPU1RTICogSE9TVF9TWikpKQorCQlnb3RvIGZyZWUxOworCWlmICghKHAtPlJJT1BvcnRwID0gY2ttYWxsb2MoUklPX1BPUlRTICogUE9SVF9TWikpKQorCQlnb3RvIGZyZWUyOworCXAtPlJJT0NvbmYgPSBSSU9Db25mOworCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTklULCAiR290IDogJXAgJXAgJXBcbiIsIHAsIHAtPlJJT0hvc3RzLCBwLT5SSU9Qb3J0cCk7CiAKICNpZiAxCi0gIGZvciAoaSA9IDA7IGkgPCBSSU9fUE9SVFM7IGkrKykgewotICAgIHBvcnQgPSBwLT5SSU9Qb3J0cFtpXSA9IGNrbWFsbG9jIChzaXplb2YgKHN0cnVjdCBQb3J0KSk7Ci0gICAgaWYgKCFwb3J0KSB7Ci0gICAgICBnb3RvIGZyZWU2OwotICAgIH0KLSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJpbml0aW5nIHBvcnQgJWQgKCVkKVxuIiwgaSwgcG9ydC0+TWFwcGVkKTsKLSAgICBwb3J0LT5Qb3J0TnVtID0gaTsKLSAgICBwb3J0LT5ncy5tYWdpYyA9IFJJT19NQUdJQzsKLSAgICBwb3J0LT5ncy5jbG9zZV9kZWxheSA9IEhaLzI7Ci0gICAgcG9ydC0+Z3MuY2xvc2luZ193YWl0ID0gMzAgKiBIWjsKLSAgICBwb3J0LT5ncy5yZCA9ICZyaW9fcmVhbF9kcml2ZXI7Ci0gICAgc3Bpbl9sb2NrX2luaXQoJnBvcnQtPnBvcnRTZW0pOwotICAgIC8qCi0gICAgICogSW5pdGlhbGl6aW5nIHdhaXQgcXVldWUKLSAgICAgKi8KLSAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0LT5ncy5vcGVuX3dhaXQpOwotICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnQtPmdzLmNsb3NlX3dhaXQpOwotICB9CisJZm9yIChpID0gMDsgaSA8IFJJT19QT1JUUzsgaSsrKSB7CisJCXBvcnQgPSBwLT5SSU9Qb3J0cFtpXSA9IGNrbWFsbG9jKHNpemVvZihzdHJ1Y3QgUG9ydCkpOworCQlpZiAoIXBvcnQpIHsKKwkJCWdvdG8gZnJlZTY7CisJCX0KKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOSVQsICJpbml0aW5nIHBvcnQgJWQgKCVkKVxuIiwgaSwgcG9ydC0+TWFwcGVkKTsKKwkJcG9ydC0+UG9ydE51bSA9IGk7CisJCXBvcnQtPmdzLm1hZ2ljID0gUklPX01BR0lDOworCQlwb3J0LT5ncy5jbG9zZV9kZWxheSA9IEhaIC8gMjsKKwkJcG9ydC0+Z3MuY2xvc2luZ193YWl0ID0gMzAgKiBIWjsKKwkJcG9ydC0+Z3MucmQgPSAmcmlvX3JlYWxfZHJpdmVyOworCQlzcGluX2xvY2tfaW5pdCgmcG9ydC0+cG9ydFNlbSk7CisJCS8qCisJCSAqIEluaXRpYWxpemluZyB3YWl0IHF1ZXVlCisJCSAqLworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0LT5ncy5vcGVuX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0LT5ncy5jbG9zZV93YWl0KTsKKwl9CiAjZWxzZQotICAvKiBXZSBjb3VsZCBwb3N0cG9uZSBpbml0aWFsaXppbmcgdGhlbSB0byB3aGVuIHRoZXkgYXJlIGNvbmZpZ3VyZWQuICovCisJLyogV2UgY291bGQgcG9zdHBvbmUgaW5pdGlhbGl6aW5nIHRoZW0gdG8gd2hlbiB0aGV5IGFyZSBjb25maWd1cmVkLiAqLwogI2VuZGlmCiAKIAotICAKLSAgaWYgKHJpb19kZWJ1ZyAmIFJJT19ERUJVR19JTklUKSB7Ci0gICAgbXlfaGQgKCZyaW9fcmVhbF9kcml2ZXIsIHNpemVvZiAocmlvX3JlYWxfZHJpdmVyKSk7Ci0gIH0KIAotICAKLSAgZnVuY19leGl0KCk7Ci0gIHJldHVybiAwOworCWlmIChyaW9fZGVidWcgJiBSSU9fREVCVUdfSU5JVCkgeworCQlteV9oZCgmcmlvX3JlYWxfZHJpdmVyLCBzaXplb2YocmlvX3JlYWxfZHJpdmVyKSk7CisJfQogCi0gZnJlZTY6Zm9yIChpLS07aT49MDtpLS0pCi0gICAgICAgIGtmcmVlIChwLT5SSU9Qb3J0cFtpXSk7CisKKwlmdW5jX2V4aXQoKTsKKwlyZXR1cm4gMDsKKworICAgICAgZnJlZTY6Zm9yIChpLS07IGkgPj0gMDsgaS0tKQorCQlrZnJlZShwLT5SSU9Qb3J0cFtpXSk7CiAvKmZyZWU1OgogIGZyZWU0OgotIGZyZWUzOiova2ZyZWUgKHAtPlJJT1BvcnRwKTsKLSBmcmVlMjprZnJlZSAocC0+UklPSG9zdHMpOwotIGZyZWUxOgotICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJOb3QgZW5vdWdoIG1lbW9yeSEgJXAgJXAgJXBcbiIsIAotICAgICAgICAJICAgICAgIHAsIHAtPlJJT0hvc3RzLCBwLT5SSU9Qb3J0cCk7Ci0gIGtmcmVlKHApOyAgICAgICAgCSAgICAgIAotIGZyZWUwOgotICByZXR1cm4gLUVOT01FTTsKKyBmcmVlMzoqLyBrZnJlZShwLT5SSU9Qb3J0cCk7CisgICAgICBmcmVlMjprZnJlZShwLT5SSU9Ib3N0cyk7CisgICAgICBmcmVlMToKKwlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5JVCwgIk5vdCBlbm91Z2ggbWVtb3J5ISAlcCAlcCAlcFxuIiwgcCwgcC0+UklPSG9zdHMsIHAtPlJJT1BvcnRwKTsKKwlrZnJlZShwKTsKKyAgICAgIGZyZWUwOgorCXJldHVybiAtRU5PTUVNOwogfQogCi1zdGF0aWMgdm9pZCAgX19leGl0IHJpb19yZWxlYXNlX2RyaXZlcnModm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCByaW9fcmVsZWFzZV9kcml2ZXJzKHZvaWQpCiB7Ci0gIGZ1bmNfZW50ZXIoKTsKLSAgdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHJpb19kcml2ZXIyKTsKLSAgdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHJpb19kcml2ZXIpOwotICBwdXRfdHR5X2RyaXZlcihyaW9fZHJpdmVyMik7Ci0gIHB1dF90dHlfZHJpdmVyKHJpb19kcml2ZXIpOwotICBmdW5jX2V4aXQoKTsKKwlmdW5jX2VudGVyKCk7CisJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHJpb19kcml2ZXIyKTsKKwl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIocmlvX2RyaXZlcik7CisJcHV0X3R0eV9kcml2ZXIocmlvX2RyaXZlcjIpOworCXB1dF90dHlfZHJpdmVyKHJpb19kcml2ZXIpOworCWZ1bmNfZXhpdCgpOwogfQogCiAKQEAgLTEwMjEsNyArOTQ4LDcgQEAKICAgICBUaGVyZSBpcyBhbm90aGVyIGJpdCBiZXNpZGVzIEJpdCAxNy4gVHVybmluZyB0aGF0IGJpdCBvZmYKICAgICAob24gYm9hcmRzIHNoaXBwZWQgd2l0aCB0aGUgZml4IGluIHRoZSBlZXByb20pIHJlc3VsdHMgaW4gYSAKICAgICBoYW5nIG9uIHRoZSBuZXh0IGFjY2VzcyB0byB0aGUgY2FyZC4gCi0gKi8KKyAgKi8KIAogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKICAqIFNldHRpbmcgYml0IDE3IGluIHRoZSBDTlRSTCByZWdpc3RlciBvZiB0aGUgUExYIDkwNTAgICogCkBAIC0xMDM0LDMxOSArOTYxLDI5MyBAQAogICAgRUVwcm9tLiAgQXMgdGhlIGJpdCBpcyByZWFkL3dyaXRlIGZvciB0aGUgQ1BVLCB3ZSBjYW4gZml4IGl0IGhlcmUsCiAgICBpZiB3ZSBkZXRlY3QgdGhhdCBpdCBpc24ndCBzZXQgY29ycmVjdGx5LiAtLSBSRVcgKi8KIAotc3RhdGljIHZvaWQgZml4X3Jpb19wY2kgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIHZvaWQgZml4X3Jpb19wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0gIHVuc2lnbmVkIGludCBod2Jhc2U7Ci0gIHVuc2lnbmVkIGxvbmcgcmViYXNlOwotICB1bnNpZ25lZCBpbnQgdDsKKwl1bnNpZ25lZCBpbnQgaHdiYXNlOworCXVuc2lnbmVkIGxvbmcgcmViYXNlOworCXVuc2lnbmVkIGludCB0OwogCiAjZGVmaW5lIENOVFJMX1JFR19PRkZTRVQgICAgICAgIDB4NTAKICNkZWZpbmUgQ05UUkxfUkVHX0dPT0RWQUxVRSAgICAgMHgxODI2MDAwMAogCi0gIHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAsICZod2Jhc2UpOwotICBod2Jhc2UgJj0gUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKLSAgcmViYXNlID0gICh1bG9uZykgaW9yZW1hcChod2Jhc2UsIDB4ODApOwotICB0ID0gcmVhZGwgKHJlYmFzZSArIENOVFJMX1JFR19PRkZTRVQpOwotICBpZiAodCAhPSBDTlRSTF9SRUdfR09PRFZBTFVFKSB7Ci0gICAgcHJpbnRrIChLRVJOX0RFQlVHICJyaW86IHBlcmZvcm1pbmcgY250cmwgcmVnIGZpeDogJTA4eCAtPiAlMDh4XG4iLCAKLSAgICAgICAgICAgIHQsIENOVFJMX1JFR19HT09EVkFMVUUpOyAKLSAgICB3cml0ZWwgKENOVFJMX1JFR19HT09EVkFMVUUsIHJlYmFzZSArIENOVFJMX1JFR19PRkZTRVQpOyAgCi0gIH0KLSAgaW91bm1hcCgoY2hhciopIHJlYmFzZSk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCwgJmh3YmFzZSk7CisJaHdiYXNlICY9IFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisJcmViYXNlID0gKHVsb25nKSBpb3JlbWFwKGh3YmFzZSwgMHg4MCk7CisJdCA9IHJlYWRsKHJlYmFzZSArIENOVFJMX1JFR19PRkZTRVQpOworCWlmICh0ICE9IENOVFJMX1JFR19HT09EVkFMVUUpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInJpbzogcGVyZm9ybWluZyBjbnRybCByZWcgZml4OiAlMDh4IC0+ICUwOHhcbiIsIHQsIENOVFJMX1JFR19HT09EVkFMVUUpOworCQl3cml0ZWwoQ05UUkxfUkVHX0dPT0RWQUxVRSwgcmViYXNlICsgQ05UUkxfUkVHX09GRlNFVCk7CisJfQorCWlvdW5tYXAoKGNoYXIgKikgcmViYXNlKTsKIH0KICNlbmRpZgogCiAKLXN0YXRpYyBpbnQgX19pbml0IHJpb19pbml0KHZvaWQpIAorc3RhdGljIGludCBfX2luaXQgcmlvX2luaXQodm9pZCkKIHsKLSAgaW50IGZvdW5kID0gMDsKLSAgaW50IGk7Ci0gIHN0cnVjdCBIb3N0ICpocDsKLSAgaW50IHJldHZhbDsKLSAgc3RydWN0IHZwZF9wcm9tICp2cGRwOwotICBpbnQgb2tib2FyZDsKKwlpbnQgZm91bmQgPSAwOworCWludCBpOworCXN0cnVjdCBIb3N0ICpocDsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCB2cGRfcHJvbSAqdnBkcDsKKwlpbnQgb2tib2FyZDsKIAogI2lmZGVmIENPTkZJR19QQ0kKLSAgc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgdGludDsKLSAgdW5zaWduZWQgc2hvcnQgdHNob3J0OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgdGludDsKKwl1bnNpZ25lZCBzaG9ydCB0c2hvcnQ7CiAjZW5kaWYKIAotICBmdW5jX2VudGVyKCk7Ci0gIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkluaXRpbmcgcmlvIG1vZHVsZS4uLiAocmlvX2RlYnVnPSVkKVxuIiwgCi0JICAgICAgIHJpb19kZWJ1Zyk7CisJZnVuY19lbnRlcigpOworCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTklULCAiSW5pdGluZyByaW8gbW9kdWxlLi4uIChyaW9fZGVidWc9JWQpXG4iLCByaW9fZGVidWcpOwogCi0gIGlmIChhYnMgKChsb25nKSAoJnJpb19kZWJ1ZykgLSByaW9fZGVidWcpIDwgMHgxMDAwMCkgewotICAgIHByaW50ayAoS0VSTl9XQVJOSU5HICJyaW86IHJpb19kZWJ1ZyBpcyBhbiBhZGRyZXNzLCBpbnN0ZWFkIG9mIGEgdmFsdWUuICIKLSAgICAgICAgICAgICJBc3N1bWluZyAtMS4gV2FzICV4LyVwLlxuIiwgcmlvX2RlYnVnLCAmcmlvX2RlYnVnKTsKLSAgICByaW9fZGVidWc9LTE7Ci0gIH0KKwlpZiAoYWJzKChsb25nKSAoJnJpb19kZWJ1ZykgLSByaW9fZGVidWcpIDwgMHgxMDAwMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJyaW86IHJpb19kZWJ1ZyBpcyBhbiBhZGRyZXNzLCBpbnN0ZWFkIG9mIGEgdmFsdWUuICIgIkFzc3VtaW5nIC0xLiBXYXMgJXgvJXAuXG4iLCByaW9fZGVidWcsICZyaW9fZGVidWcpOworCQlyaW9fZGVidWcgPSAtMTsKKwl9CiAKLSAgaWYgKG1pc2NfcmVnaXN0ZXIoJnJpb19md19kZXZpY2UpIDwgMCkgewotICAgIHByaW50ayhLRVJOX0VSUiAiUklPOiBVbmFibGUgdG8gcmVnaXN0ZXIgZmlybXdhcmUgbG9hZGVyIGRyaXZlci5cbiIpOwotICAgIHJldHVybiAtRUlPOwotICB9CisJaWYgKG1pc2NfcmVnaXN0ZXIoJnJpb19md19kZXZpY2UpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlJJTzogVW5hYmxlIHRvIHJlZ2lzdGVyIGZpcm13YXJlIGxvYWRlciBkcml2ZXIuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCi0gIHJldHZhbCA9IHJpb19pbml0X2RhdGFzdHJ1Y3R1cmVzICgpOwotICBpZiAocmV0dmFsIDwgMCkgewotICAgIG1pc2NfZGVyZWdpc3RlcigmcmlvX2Z3X2RldmljZSk7Ci0gICAgcmV0dXJuIHJldHZhbDsKLSAgfQotCisJcmV0dmFsID0gcmlvX2luaXRfZGF0YXN0cnVjdHVyZXMoKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQltaXNjX2RlcmVnaXN0ZXIoJnJpb19md19kZXZpY2UpOworCQlyZXR1cm4gcmV0dmFsOworCX0KICNpZmRlZiBDT05GSUdfUENJCi0gICAgLyogRmlyc3QgbG9vayBmb3IgdGhlIEpFVCBkZXZpY2VzOiAqLwotICAgIHdoaWxlICgocGRldiA9IHBjaV9nZXRfZGV2aWNlIChQQ0lfVkVORE9SX0lEX1NQRUNJQUxJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfU1BFQ0lBTElYX1NYX1hJT19JTzgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRldikpKSB7Ci0gICAgICAgaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSBjb250aW51ZTsKKwkvKiBGaXJzdCBsb29rIGZvciB0aGUgSkVUIGRldmljZXM6ICovCisJd2hpbGUgKChwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9TUEVDSUFMSVgsIFBDSV9ERVZJQ0VfSURfU1BFQ0lBTElYX1NYX1hJT19JTzgsIHBkZXYpKSkgeworCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCQljb250aW51ZTsKIAotICAgICAgLyogU3BlY2lhbGl4IGhhcyBhIHdob2xlIGJ1bmNoIG9mIGNhcmRzIHdpdGgKLSAgICAgICAgIDB4MjAwMCBhcyB0aGUgZGV2aWNlIElELiBUaGV5IHNheSBpdHMgYmVjYXVzZQotICAgICAgICAgdGhlIHN0YW5kYXJkIHJlcXVpcmVzIGl0LiBTdHVwaWQgc3RhbmRhcmQuICovCi0gICAgICAvKiBJdCBzZWVtcyB0aGF0IHJlYWRpbmcgYSB3b3JkIGRvZXNuJ3Qgd29yayByZWxpYWJseSBvbiAyLjAuCi0gICAgICAgICBBbHNvLCByZWFkaW5nIGEgbm9uLWFsaWduZWQgZHdvcmQgZG9lc24ndCB3b3JrLiBTbyB3ZSByZWFkIHRoZQotICAgICAgICAgd2hvbGUgZHdvcmQgYXQgMHgyYyBhbmQgZXh0cmFjdCB0aGUgd29yZCBhdCAweDJlIChTVUJTWVNURU1fSUQpCi0gICAgICAgICBvdXJzZWx2ZXMgKi8KLSAgICAgIC8qIEkgZG9uJ3Qga25vdyB3aHkgdGhlIGRlZmluZSBkb2Vzbid0IHdvcmssIGNvbnN0YW50IDB4MmMgZG9lcyAtLVJFVyAqLyAKLSAgICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZCAocGRldiwgMHgyYywgJnRpbnQpOwotICAgICAgdHNob3J0ID0gKHRpbnQgPj4gMTYpICYgMHhmZmZmOwotICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QUk9CRSwgIkdvdCBhIHNwZWNpYWxpeCBjYXJkOiAleC5cbiIsIHRpbnQpOwotICAgICAgaWYgKHRzaG9ydCAhPSAweDAxMDApIHsKLSAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QUk9CRSwgIkJ1dCBpdCdzIG5vdCBhIFJJTyBjYXJkICglZCkuLi5cbiIsIAotICAgICAgICAgICAgICAgICAgICB0c2hvcnQpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUFJPQkUsICJjcDFcbiIpOworCQkvKiBTcGVjaWFsaXggaGFzIGEgd2hvbGUgYnVuY2ggb2YgY2FyZHMgd2l0aAorCQkgICAweDIwMDAgYXMgdGhlIGRldmljZSBJRC4gVGhleSBzYXkgaXRzIGJlY2F1c2UKKwkJICAgdGhlIHN0YW5kYXJkIHJlcXVpcmVzIGl0LiBTdHVwaWQgc3RhbmRhcmQuICovCisJCS8qIEl0IHNlZW1zIHRoYXQgcmVhZGluZyBhIHdvcmQgZG9lc24ndCB3b3JrIHJlbGlhYmx5IG9uIDIuMC4KKwkJICAgQWxzbywgcmVhZGluZyBhIG5vbi1hbGlnbmVkIGR3b3JkIGRvZXNuJ3Qgd29yay4gU28gd2UgcmVhZCB0aGUKKwkJICAgd2hvbGUgZHdvcmQgYXQgMHgyYyBhbmQgZXh0cmFjdCB0aGUgd29yZCBhdCAweDJlIChTVUJTWVNURU1fSUQpCisJCSAgIG91cnNlbHZlcyAqLworCQkvKiBJIGRvbid0IGtub3cgd2h5IHRoZSBkZWZpbmUgZG9lc24ndCB3b3JrLCBjb25zdGFudCAweDJjIGRvZXMgLS1SRVcgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4MmMsICZ0aW50KTsKKwkJdHNob3J0ID0gKHRpbnQgPj4gMTYpICYgMHhmZmZmOworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUFJPQkUsICJHb3QgYSBzcGVjaWFsaXggY2FyZDogJXguXG4iLCB0aW50KTsKKwkJaWYgKHRzaG9ydCAhPSAweDAxMDApIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QUk9CRSwgIkJ1dCBpdCdzIG5vdCBhIFJJTyBjYXJkICglZCkuLi5cbiIsIHRzaG9ydCk7CisJCQljb250aW51ZTsKKwkJfQorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUFJPQkUsICJjcDFcbiIpOwogCi0gICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX0JBU0VfQUREUkVTU18yLCAmdGludCk7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzIsICZ0aW50KTsKIAotICAgICAgaHAgPSAmcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdOwotICAgICAgaHAtPlBhZGRyUCA9ICB0aW50ICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKLSAgICAgIGhwLT5JdmVjID0gcGRldi0+aXJxOwotICAgICAgaWYgKCgoMSA8PCBocC0+SXZlYykgJiByaW9faXJxbWFzaykgPT0gMCkKLSAgICAgICAgICAgICAgaHAtPkl2ZWMgPSAwOwotICAgICAgaHAtPkNhZGRyID0gaW9yZW1hcChwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUGFkZHJQLCBSSU9fV0lORE9XX0xFTik7Ci0gICAgICBocC0+Q2FyZFAJPSAoc3RydWN0IERwUmFtICopIGhwLT5DYWRkcjsKLSAgICAgIGhwLT5UeXBlICA9IFJJT19QQ0k7Ci0gICAgICBocC0+Q29weSAgPSByaW9fcGNpY29weTsgCi0gICAgICBocC0+TW9kZSAgPSBSSU9fUENJX0JPT1RfRlJPTV9SQU07Ci0gICAgICBzcGluX2xvY2tfaW5pdCgmaHAtPkhvc3RMb2NrKTsKLSAgICAgIHJpb19yZXNldF9pbnRlcnJ1cHQgKGhwKTsKLSAgICAgIHJpb19zdGFydF9jYXJkX3J1bm5pbmcgKGhwKTsKKwkJaHAgPSAmcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdOworCQlocC0+UGFkZHJQID0gdGludCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisJCWhwLT5JdmVjID0gcGRldi0+aXJxOworCQlpZiAoKCgxIDw8IGhwLT5JdmVjKSAmIHJpb19pcnFtYXNrKSA9PSAwKQorCQkJaHAtPkl2ZWMgPSAwOworCQlocC0+Q2FkZHIgPSBpb3JlbWFwKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5QYWRkclAsIFJJT19XSU5ET1dfTEVOKTsKKwkJaHAtPkNhcmRQID0gKHN0cnVjdCBEcFJhbSAqKSBocC0+Q2FkZHI7CisJCWhwLT5UeXBlID0gUklPX1BDSTsKKwkJaHAtPkNvcHkgPSByaW9fcGNpY29weTsKKwkJaHAtPk1vZGUgPSBSSU9fUENJX0JPT1RfRlJPTV9SQU07CisJCXNwaW5fbG9ja19pbml0KCZocC0+SG9zdExvY2spOworCQlyaW9fcmVzZXRfaW50ZXJydXB0KGhwKTsKKwkJcmlvX3N0YXJ0X2NhcmRfcnVubmluZyhocCk7CiAKLSAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUFJPQkUsICJHb2luZyB0byB0ZXN0IGl0ICglcC8lcCkuXG4iLAotICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUCwKLSAgICAgICAgICAgICAgICAgICBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ2FkZHIpOwotICAgICAgaWYgKFJJT0JvYXJkVGVzdCggcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5DYWRkciwgCi0gICAgICAgICAgICAgICAgICAgICAgICBSSU9fUENJLCAwICkgPT0gUklPX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRG9uZSBSSU9Cb2FyZFRlc3RcbiIpOwotICAgICAgICAgICAgICBXQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUmVzZXRJbnQsIDB4ZmYpOwotICAgICAgICAgICAgICBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlTnVtICA9Ci0gICAgICAgICAgICAgICAgICAgICAgKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzBdKSAmMHhGRik8PCAwKXwKLSAgICAgICAgICAgICAgICAgICAgICAoKFJCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbMV0pICYweEZGKTw8IDgpfAotICAgICAgICAgICAgICAgICAgICAgICgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVsyXSkgJjB4RkYpPDwxNil8Ci0gICAgICAgICAgICAgICAgICAgICAgKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzNdKSAmMHhGRik8PDI0KTsKLSAgICAgICAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QUk9CRSwgIkhtbSBUZXN0ZWQgb2ssIHVuaXFpZCA9ICV4LlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVOdW0pOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgZml4X3Jpb19wY2kgKHBkZXYpOwotICAgICAgICAgICAgICBwLT5SSU9MYXN0UENJU2VhcmNoID0gUklPX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgIHAtPlJJT051bUhvc3RzKys7Ci0gICAgICAgICAgICAgIGZvdW5kKys7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBpb3VubWFwKChjaGFyKikgKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5DYWRkcikpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKiBUaGVuIGxvb2sgZm9yIHRoZSBvbGRlciBQQ0kgY2FyZC4uLi4gOiAqLworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUFJPQkUsICJHb2luZyB0byB0ZXN0IGl0ICglcC8lcCkuXG4iLCAodm9pZCAqKSBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUGFkZHJQLCBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ2FkZHIpOworCQlpZiAoUklPQm9hcmRUZXN0KHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5QYWRkclAsIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5DYWRkciwgUklPX1BDSSwgMCkgPT0gUklPX1NVQ0NFU1MpIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTklULCAiRG9uZSBSSU9Cb2FyZFRlc3RcbiIpOworCQkJV0JZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlJlc2V0SW50LCAweGZmKTsKKwkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVOdW0gPQorCQkJICAgICgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVswXSkgJiAweEZGKSA8PCAwKSB8CisJCQkgICAgKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzFdKSAmIDB4RkYpIDw8IDgpIHwgKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzJdKSAmIDB4RkYpIDw8IDE2KSB8ICgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVszXSkgJiAweEZGKSA8PCAyNCk7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUFJPQkUsICJIbW0gVGVzdGVkIG9rLCB1bmlxaWQgPSAleC5cbiIsIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVOdW0pOwogCi0gIC8qIFRoZXNlIG9sZGVyIFBDSSBjYXJkcyBoYXZlIHByb2JsZW1zIChvbmx5IGJ5dGUtbW9kZSBhY2Nlc3MgaXMKLSAgICAgc3VwcG9ydGVkKSwgd2hpY2ggbWFrZXMgdGhlbSBhIGJpdCBhd2t3YXJkIHRvIHN1cHBvcnQuIAotICAgICBUaGV5IGFsc28gaGF2ZSBwcm9ibGVtcyBzaGFyaW5nIGludGVycnVwdHMuIEJlIGNhcmVmdWwuIAotICAgICAoVGhlIGRyaXZlciBub3cgcmVmdXNlcyB0byBzaGFyZSBpbnRlcnJ1cHRzIGZvciB0aGVzZQotICAgICBjYXJkcy4gVGhpcyBzaG91bGQgYmUgc3VmZmljaWVudCkuCi0gICovCisJCQlmaXhfcmlvX3BjaShwZGV2KTsKKwkJCXAtPlJJT0xhc3RQQ0lTZWFyY2ggPSBSSU9fU1VDQ0VTUzsKKwkJCXAtPlJJT051bUhvc3RzKys7CisJCQlmb3VuZCsrOworCQl9IGVsc2UgeworCQkJaW91bm1hcCgoY2hhciAqKSAocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkNhZGRyKSk7CisJCX0KKwl9CiAKLSAgICAvKiBUaGVuIGxvb2sgZm9yIHRoZSBvbGRlciBSSU8vUENJIGRldmljZXM6ICovCi0gICAgd2hpbGUgKChwZGV2ID0gcGNpX2dldF9kZXZpY2UgKFBDSV9WRU5ET1JfSURfU1BFQ0lBTElYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0RFVklDRV9JRF9TUEVDSUFMSVhfUklPLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZXYpKSkgewotICAgICAgIGlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgY29udGludWU7CisJLyogVGhlbiBsb29rIGZvciB0aGUgb2xkZXIgUENJIGNhcmQuLi4uIDogKi8KKworCS8qIFRoZXNlIG9sZGVyIFBDSSBjYXJkcyBoYXZlIHByb2JsZW1zIChvbmx5IGJ5dGUtbW9kZSBhY2Nlc3MgaXMKKwkgICBzdXBwb3J0ZWQpLCB3aGljaCBtYWtlcyB0aGVtIGEgYml0IGF3a3dhcmQgdG8gc3VwcG9ydC4KKwkgICBUaGV5IGFsc28gaGF2ZSBwcm9ibGVtcyBzaGFyaW5nIGludGVycnVwdHMuIEJlIGNhcmVmdWwuCisJICAgKFRoZSBkcml2ZXIgbm93IHJlZnVzZXMgdG8gc2hhcmUgaW50ZXJydXB0cyBmb3IgdGhlc2UKKwkgICBjYXJkcy4gVGhpcyBzaG91bGQgYmUgc3VmZmljaWVudCkuCisJICovCisKKwkvKiBUaGVuIGxvb2sgZm9yIHRoZSBvbGRlciBSSU8vUENJIGRldmljZXM6ICovCisJd2hpbGUgKChwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9TUEVDSUFMSVgsIFBDSV9ERVZJQ0VfSURfU1BFQ0lBTElYX1JJTywgcGRldikpKSB7CisJCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJCWNvbnRpbnVlOwogCiAjaWZkZWYgQ09ORklHX1JJT19PTERQQ0kKLSAgICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAsICZ0aW50KTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCwgJnRpbnQpOwogCi0gICAgICBocCA9ICZwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c107Ci0gICAgICBocC0+UGFkZHJQID0gIHRpbnQgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOwotICAgICAgaHAtPkl2ZWMgPSBwZGV2LT5pcnE7Ci0gICAgICBpZiAoKCgxIDw8IGhwLT5JdmVjKSAmIHJpb19pcnFtYXNrKSA9PSAwKSAKLSAgICAgIAlocC0+SXZlYyA9IDA7Ci0gICAgICBocC0+SXZlYyB8PSAweDgwMDA7IC8qIE1hcmsgYXMgbm9uLXNoYXJhYmxlICovCi0gICAgICBocC0+Q2FkZHIgPSBpb3JlbWFwKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5QYWRkclAsIFJJT19XSU5ET1dfTEVOKTsKLSAgICAgIGhwLT5DYXJkUAk9IChzdHJ1Y3QgRHBSYW0gKikgaHAtPkNhZGRyOwotICAgICAgaHAtPlR5cGUgID0gUklPX1BDSTsKLSAgICAgIGhwLT5Db3B5ICA9IHJpb19wY2ljb3B5OwotICAgICAgaHAtPk1vZGUgID0gUklPX1BDSV9CT09UX0ZST01fUkFNOwotICAgICAgc3Bpbl9sb2NrX2luaXQoJmhwLT5Ib3N0TG9jayk7CisJCWhwID0gJnAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXTsKKwkJaHAtPlBhZGRyUCA9IHRpbnQgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOworCQlocC0+SXZlYyA9IHBkZXYtPmlycTsKKwkJaWYgKCgoMSA8PCBocC0+SXZlYykgJiByaW9faXJxbWFzaykgPT0gMCkKKwkJCWhwLT5JdmVjID0gMDsKKwkJaHAtPkl2ZWMgfD0gMHg4MDAwOwkvKiBNYXJrIGFzIG5vbi1zaGFyYWJsZSAqLworCQlocC0+Q2FkZHIgPSBpb3JlbWFwKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5QYWRkclAsIFJJT19XSU5ET1dfTEVOKTsKKwkJaHAtPkNhcmRQID0gKHN0cnVjdCBEcFJhbSAqKSBocC0+Q2FkZHI7CisJCWhwLT5UeXBlID0gUklPX1BDSTsKKwkJaHAtPkNvcHkgPSByaW9fcGNpY29weTsKKwkJaHAtPk1vZGUgPSBSSU9fUENJX0JPT1RfRlJPTV9SQU07CisJCXNwaW5fbG9ja19pbml0KCZocC0+SG9zdExvY2spOwogCi0gICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1BST0JFLCAiSXZlYzogJXhcbiIsIGhwLT5JdmVjKTsKLSAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUFJPQkUsICJNb2RlOiAleFxuIiwgaHAtPk1vZGUpOworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUFJPQkUsICJJdmVjOiAleFxuIiwgaHAtPkl2ZWMpOworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUFJPQkUsICJNb2RlOiAleFxuIiwgaHAtPk1vZGUpOwogCi0gICAgICByaW9fcmVzZXRfaW50ZXJydXB0IChocCk7Ci0gICAgICByaW9fc3RhcnRfY2FyZF9ydW5uaW5nIChocCk7Ci0gICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QUk9CRSwgIkdvaW5nIHRvIHRlc3QgaXQgKCVwLyVwKS5cbiIsCi0gICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUGFkZHJQLAotICAgICAgICAgICAgICAgICAgIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5DYWRkcik7Ci0gICAgICBpZiAoUklPQm9hcmRUZXN0KCBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUGFkZHJQLAotICAgICAgICAgICAgICAgICAgICAgICAgcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkNhZGRyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIFJJT19QQ0ksIDAgKSA9PSBSSU9fU1VDQ0VTUykgewotICAgICAgICBXQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUmVzZXRJbnQsIDB4ZmYpOwotICAgICAgICBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlTnVtICA9Ci0gICAgICAgICAgKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzBdKSAmMHhGRik8PCAwKXwKLSAgICAgICAgICAoKFJCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbMV0pICYweEZGKTw8IDgpfAotICAgICAgICAgICgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVsyXSkgJjB4RkYpPDwxNil8Ci0gICAgICAgICAgKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzNdKSAmMHhGRik8PDI0KTsKLSAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QUk9CRSwgIkhtbSBUZXN0ZWQgb2ssIHVuaXFpZCA9ICV4LlxuIiwKLSAgICAgICAgICAgICAgICAgICBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlTnVtKTsKKwkJcmlvX3Jlc2V0X2ludGVycnVwdChocCk7CisJCXJpb19zdGFydF9jYXJkX3J1bm5pbmcoaHApOworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUFJPQkUsICJHb2luZyB0byB0ZXN0IGl0ICglcC8lcCkuXG4iLCAodm9pZCAqKSBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUGFkZHJQLCBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ2FkZHIpOworCQlpZiAoUklPQm9hcmRUZXN0KHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5QYWRkclAsIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5DYWRkciwgUklPX1BDSSwgMCkgPT0gUklPX1NVQ0NFU1MpIHsKKwkJCVdCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5SZXNldEludCwgMHhmZik7CisJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlTnVtID0KKwkJCSAgICAoKFJCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbMF0pICYgMHhGRikgPDwgMCkgfAorCQkJICAgICgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVsxXSkgJiAweEZGKSA8PCA4KSB8ICgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVsyXSkgJiAweEZGKSA8PCAxNikgfCAoKFJCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbM10pICYgMHhGRikgPDwgMjQpOworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BST0JFLCAiSG1tIFRlc3RlZCBvaywgdW5pcWlkID0gJXguXG4iLCBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlTnVtKTsKIAotICAgICAgICBwLT5SSU9MYXN0UENJU2VhcmNoID0gUklPX1NVQ0NFU1M7Ci0gICAgICAgIHAtPlJJT051bUhvc3RzKys7Ci0gICAgICAgIGZvdW5kKys7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpb3VubWFwKChjaGFyKikgKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5DYWRkcikpOwotICAgICAgfQorCQkJcC0+UklPTGFzdFBDSVNlYXJjaCA9IFJJT19TVUNDRVNTOworCQkJcC0+UklPTnVtSG9zdHMrKzsKKwkJCWZvdW5kKys7CisJCX0gZWxzZSB7CisJCQlpb3VubWFwKChjaGFyICopIChwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ2FkZHIpKTsKKwkJfQogI2Vsc2UKLSAgICAgIHByaW50ayAoS0VSTl9FUlIgIkZvdW5kIGFuIG9sZGVyIFJJTyBQQ0kgY2FyZCwgYnV0IHRoZSBkcml2ZXIgaXMgbm90ICIKLSAgICAgICAgICAgICAgImNvbXBpbGVkIHRvIHN1cHBvcnQgaXQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJGb3VuZCBhbiBvbGRlciBSSU8gUENJIGNhcmQsIGJ1dCB0aGUgZHJpdmVyIGlzIG5vdCAiICJjb21waWxlZCB0byBzdXBwb3J0IGl0LlxuIik7CiAjZW5kaWYKLSAgICB9Ci0jZW5kaWYgLyogUENJICovCisJfQorI2VuZGlmCQkJCS8qIFBDSSAqLwogCi0gIC8qIE5vdyBwcm9iZSBmb3IgSVNBIGNhcmRzLi4uICovCi0gIGZvciAoaT0wO2k8TlJfUklPX0FERFJTO2krKykgewotICAgIGhwID0gJnAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXTsKLSAgICBocC0+UGFkZHJQID0gcmlvX3Byb2JlX2FkZHJzW2ldOwotICAgIC8qIFRoZXJlIHdhcyBzb21ldGhpbmcgYWJvdXQgdGhlIElSUXMgb2YgdGhlc2UgY2FyZHMuICdGb3JnZXQgd2hhdC4tLVJFVyAqLwotICAgIGhwLT5JdmVjID0gMDsKLSAgICBocC0+Q2FkZHIgPSBpb3JlbWFwKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5QYWRkclAsIFJJT19XSU5ET1dfTEVOKTsKLSAgICBocC0+Q2FyZFAgPSAoc3RydWN0IERwUmFtICopIGhwLT5DYWRkcjsKLSAgICBocC0+VHlwZSA9IFJJT19BVDsKLSAgICBocC0+Q29weSA9IHJpb19wY2ljb3B5OyAvKiBBVCBjYXJkIFBDST8/Pz8gLSBQVkRMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogLS0gWUVTISB0aGlzIGlzIG5vdyBhIG5vcm1hbCBjb3B5LiBPbmx5IHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvbGQgUENJIGNhcmQgdXNlcyB0aGUgc3BlY2lhbCBQQ0kgY29weS4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogTW9yZW92ZXIsIHRoZSBJU0EgY2FyZCB3aWxsIHdvcmsgd2l0aCB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3BlY2lhbCBQQ0kgY29weSBhbnl3YXkuIC0tIFJFVyAqLwotICAgIGhwLT5Nb2RlID0gMDsKLSAgICBzcGluX2xvY2tfaW5pdCgmaHAtPkhvc3RMb2NrKTsKKwkvKiBOb3cgcHJvYmUgZm9yIElTQSBjYXJkcy4uLiAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9SSU9fQUREUlM7IGkrKykgeworCQlocCA9ICZwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c107CisJCWhwLT5QYWRkclAgPSByaW9fcHJvYmVfYWRkcnNbaV07CisJCS8qIFRoZXJlIHdhcyBzb21ldGhpbmcgYWJvdXQgdGhlIElSUXMgb2YgdGhlc2UgY2FyZHMuICdGb3JnZXQgd2hhdC4tLVJFVyAqLworCQlocC0+SXZlYyA9IDA7CisJCWhwLT5DYWRkciA9IGlvcmVtYXAocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlBhZGRyUCwgUklPX1dJTkRPV19MRU4pOworCQlocC0+Q2FyZFAgPSAoc3RydWN0IERwUmFtICopIGhwLT5DYWRkcjsKKwkJaHAtPlR5cGUgPSBSSU9fQVQ7CisJCWhwLT5Db3B5ID0gcmlvX3BjaWNvcHk7CS8qIEFUIGNhcmQgUENJPz8/PyAtIFBWREwKKwkJCQkJICogLS0gWUVTISB0aGlzIGlzIG5vdyBhIG5vcm1hbCBjb3B5LiBPbmx5IHRoZQorCQkJCQkgKiBvbGQgUENJIGNhcmQgdXNlcyB0aGUgc3BlY2lhbCBQQ0kgY29weS4KKwkJCQkJICogTW9yZW92ZXIsIHRoZSBJU0EgY2FyZCB3aWxsIHdvcmsgd2l0aCB0aGUKKwkJCQkJICogc3BlY2lhbCBQQ0kgY29weSBhbnl3YXkuIC0tIFJFVyAqLworCQlocC0+TW9kZSA9IDA7CisJCXNwaW5fbG9ja19pbml0KCZocC0+SG9zdExvY2spOwogCi0gICAgdnBkcCA9IGdldF9WUERfUFJPTSAoaHApOwotICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUFJPQkUsICJHb3QgVlBEIFJPTVxuIik7Ci0gICAgb2tib2FyZCA9IDA7Ci0gICAgaWYgKChzdHJuY21wICh2cGRwLT5pZGVudGlmaWVyLCBSSU9fSVNBX0lERU5ULCAxNikgPT0gMCkgfHwKLSAgICAgICAgKHN0cm5jbXAgKHZwZHAtPmlkZW50aWZpZXIsIFJJT19JU0EyX0lERU5ULCAxNikgPT0gMCkgfHwKLSAgICAgICAgKHN0cm5jbXAgKHZwZHAtPmlkZW50aWZpZXIsIFJJT19JU0EzX0lERU5ULCAxNikgPT0gMCkpIHsKLSAgICAgIC8qIEJvYXJkIGlzIHByZXNlbnQuLi4gKi8KLSAgICAgIGlmIChSSU9Cb2FyZFRlc3QgKGhwLT5QYWRkclAsIAotICAgICAgICAgICAgICAgICAgICAgICAgaHAtPkNhZGRyLCBSSU9fQVQsIDApID09IFJJT19TVUNDRVNTKSB7Ci0gICAgICAgIC8qIC4uLiBhbmQgZmVlbGluZyBmaW5lISEhISAqLwotICAgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1BST0JFLCAiSG1tIFRlc3RlZCBvaywgdW5pcWlkID0gJXguXG4iLAotICAgICAgICAgICAgICAgICAgIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVOdW0pOwotICAgICAgICBpZiAoUklPQXNzaWduQVQocCwgaHAtPlBhZGRyUCwgaHAtPkNhZGRyLCAwKSkgeyAgICAgICAgCi0gICAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QUk9CRSwgIkhtbSBUZXN0ZWQgb2ssIGhvc3QlZCB1bmlxaWQgPSAleC5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHAtPlJJT051bUhvc3RzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHMtMV0uVW5pcXVlTnVtKTsKLSAgICAgICAgICBva2JvYXJkKys7Ci0gICAgICAgICAgZm91bmQrKzsKLSAgICAgICAgfQotICAgICAgfQorCQl2cGRwID0gZ2V0X1ZQRF9QUk9NKGhwKTsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BST0JFLCAiR290IFZQRCBST01cbiIpOworCQlva2JvYXJkID0gMDsKKwkJaWYgKChzdHJuY21wKHZwZHAtPmlkZW50aWZpZXIsIFJJT19JU0FfSURFTlQsIDE2KSA9PSAwKSB8fCAoc3RybmNtcCh2cGRwLT5pZGVudGlmaWVyLCBSSU9fSVNBMl9JREVOVCwgMTYpID09IDApIHx8IChzdHJuY21wKHZwZHAtPmlkZW50aWZpZXIsIFJJT19JU0EzX0lERU5ULCAxNikgPT0gMCkpIHsKKwkJCS8qIEJvYXJkIGlzIHByZXNlbnQuLi4gKi8KKwkJCWlmIChSSU9Cb2FyZFRlc3QoaHAtPlBhZGRyUCwgaHAtPkNhZGRyLCBSSU9fQVQsIDApID09IFJJT19TVUNDRVNTKSB7CisJCQkJLyogLi4uIGFuZCBmZWVsaW5nIGZpbmUhISEhICovCisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BST0JFLCAiSG1tIFRlc3RlZCBvaywgdW5pcWlkID0gJXguXG4iLCBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlTnVtKTsKKwkJCQlpZiAoUklPQXNzaWduQVQocCwgaHAtPlBhZGRyUCwgaHAtPkNhZGRyLCAwKSkgeworCQkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUFJPQkUsICJIbW0gVGVzdGVkIG9rLCBob3N0JWQgdW5pcWlkID0gJXguXG4iLCBwLT5SSU9OdW1Ib3N0cywgcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHMgLSAxXS5VbmlxdWVOdW0pOworCQkJCQlva2JvYXJkKys7CisJCQkJCWZvdW5kKys7CisJCQkJfQorCQkJfQogCi0gICAgaWYgKCFva2JvYXJkKQotICAgICAgaW91bm1hcCAoKGNoYXIqKSAoaHAtPkNhZGRyKSk7Ci0gICAgfQotICB9CisJCQlpZiAoIW9rYm9hcmQpCisJCQkJaW91bm1hcCgoY2hhciAqKSAoaHAtPkNhZGRyKSk7CisJCX0KKwl9CiAKIAotICBmb3IgKGk9MDtpPHAtPlJJT051bUhvc3RzO2krKykgewotICAgIGhwID0gJnAtPlJJT0hvc3RzW2ldOwotICAgIGlmIChocC0+SXZlYykgewotICAgICAgaW50IG1vZGUgPSBTQV9TSElSUTsKLSAgICAgIGlmIChocC0+SXZlYyAmIDB4ODAwMCkge21vZGUgPSAwOyBocC0+SXZlYyAmPSAweDdmZmY7fQotICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUmVxdWVzdGluZyBpbnRlcnJ1cHQgaHA6ICVwIHJpb19pbnRlcnJ1cHQ6ICVkIE1vZGU6ICV4XG4iLCBocCxocC0+SXZlYywgaHAtPk1vZGUpOwotICAgICAgcmV0dmFsID0gcmVxdWVzdF9pcnEgKGhwLT5JdmVjLCByaW9faW50ZXJydXB0LCBtb2RlLCAicmlvIiwgaHApOwotICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUmV0dXJuIHZhbHVlIGZyb20gcmVxdWVzdF9pcnE6ICVkXG4iLCByZXR2YWwpOwotICAgICAgaWYgKHJldHZhbCkgewotICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgInJpbzogQ2Fubm90IGFsbG9jYXRlIGlycSAlZC5cbiIsIGhwLT5JdmVjKTsKLSAgICAgICAgICAgICAgaHAtPkl2ZWMgPSAwOwotICAgICAgfQotICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiR290IGlycSAlZC5cbiIsIGhwLT5JdmVjKTsKLSAgICAgIGlmIChocC0+SXZlYyAhPSAwKXsKLSAgICAgICAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRW5hYmxpbmcgaW50ZXJydXB0cyBvbiByaW8gY2FyZC5cbiIpOyAKLSAgICAgICAgICAgICAgaHAtPk1vZGUgfD0gUklPX1BDSV9JTlRfRU5BQkxFOwotICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgIGhwLT5Nb2RlICY9ICFSSU9fUENJX0lOVF9FTkFCTEU7Ci0gICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJOZXcgTW9kZTogJXhcbiIsIGhwLT5Nb2RlKTsKLSAgICAgIHJpb19zdGFydF9jYXJkX3J1bm5pbmcgKGhwKTsKLSAgICB9Ci0gICAgLyogSW5pdCB0aGUgdGltZXIgImFsd2F5cyIgdG8gbWFrZSBzdXJlIHRoYXQgaXQgY2FuIHNhZmVseSBiZSAKLSAgICAgICBkZWxldGVkIHdoZW4gd2UgdW5sb2FkLi4uICovCisJZm9yIChpID0gMDsgaSA8IHAtPlJJT051bUhvc3RzOyBpKyspIHsKKwkJaHAgPSAmcC0+UklPSG9zdHNbaV07CisJCWlmIChocC0+SXZlYykgeworCQkJaW50IG1vZGUgPSBTQV9TSElSUTsKKwkJCWlmIChocC0+SXZlYyAmIDB4ODAwMCkgeworCQkJCW1vZGUgPSAwOworCQkJCWhwLT5JdmVjICY9IDB4N2ZmZjsKKwkJCX0KKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTklULCAiUmVxdWVzdGluZyBpbnRlcnJ1cHQgaHA6ICVwIHJpb19pbnRlcnJ1cHQ6ICVkIE1vZGU6ICV4XG4iLCBocCwgaHAtPkl2ZWMsIGhwLT5Nb2RlKTsKKwkJCXJldHZhbCA9IHJlcXVlc3RfaXJxKGhwLT5JdmVjLCByaW9faW50ZXJydXB0LCBtb2RlLCAicmlvIiwgaHApOworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOSVQsICJSZXR1cm4gdmFsdWUgZnJvbSByZXF1ZXN0X2lycTogJWRcbiIsIHJldHZhbCk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJyaW86IENhbm5vdCBhbGxvY2F0ZSBpcnEgJWQuXG4iLCBocC0+SXZlYyk7CisJCQkJaHAtPkl2ZWMgPSAwOworCQkJfQorCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOSVQsICJHb3QgaXJxICVkLlxuIiwgaHAtPkl2ZWMpOworCQkJaWYgKGhwLT5JdmVjICE9IDApIHsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5JVCwgIkVuYWJsaW5nIGludGVycnVwdHMgb24gcmlvIGNhcmQuXG4iKTsKKwkJCQlocC0+TW9kZSB8PSBSSU9fUENJX0lOVF9FTkFCTEU7CisJCQl9IGVsc2UKKwkJCQlocC0+TW9kZSAmPSAhUklPX1BDSV9JTlRfRU5BQkxFOworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOSVQsICJOZXcgTW9kZTogJXhcbiIsIGhwLT5Nb2RlKTsKKwkJCXJpb19zdGFydF9jYXJkX3J1bm5pbmcoaHApOworCQl9CisJCS8qIEluaXQgdGhlIHRpbWVyICJhbHdheXMiIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGNhbiBzYWZlbHkgYmUKKwkJICAgZGVsZXRlZCB3aGVuIHdlIHVubG9hZC4uLiAqLwogCi0gICAgaW5pdF90aW1lciAoJmhwLT50aW1lcik7Ci0gICAgaWYgKCFocC0+SXZlYykgewotICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiU3RhcnRpbmcgcG9sbGluZyBhdCAlZGogaW50ZXJ2YWxzLlxuIiwgCi0gICAgICAgICAgICAgICAgICAgcmlvX3BvbGwpOwotICAgICAgaHAtPnRpbWVyLmRhdGEgPSBpOwotICAgICAgaHAtPnRpbWVyLmZ1bmN0aW9uID0gcmlvX3BvbGxmdW5jOwotICAgICAgaHAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgcmlvX3BvbGw7Ci0gICAgICBhZGRfdGltZXIgKCZocC0+dGltZXIpOwotICAgIH0KLSAgfQorCQlpbml0X3RpbWVyKCZocC0+dGltZXIpOworCQlpZiAoIWhwLT5JdmVjKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5JVCwgIlN0YXJ0aW5nIHBvbGxpbmcgYXQgJWRqIGludGVydmFscy5cbiIsIHJpb19wb2xsKTsKKwkJCWhwLT50aW1lci5kYXRhID0gaTsKKwkJCWhwLT50aW1lci5mdW5jdGlvbiA9IHJpb19wb2xsZnVuYzsKKwkJCWhwLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIHJpb19wb2xsOworCQkJYWRkX3RpbWVyKCZocC0+dGltZXIpOworCQl9CisJfQogCi0gIGlmIChmb3VuZCkgewotICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgInJpbzogdG90YWwgb2YgJWQgYm9hcmRzIGRldGVjdGVkLlxuIiwgZm91bmQpOwotICAgIHJpb19pbml0X2RyaXZlcnMgKCk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogZGVyZWdpc3RlciB0aGUgbWlzYyBkZXZpY2Ugd2UgY3JlYXRlZCBlYXJsaWVyICovCi0gICAgbWlzY19kZXJlZ2lzdGVyKCZyaW9fZndfZGV2aWNlKTsKLSAgfQorCWlmIChmb3VuZCkgeworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5JVCwgInJpbzogdG90YWwgb2YgJWQgYm9hcmRzIGRldGVjdGVkLlxuIiwgZm91bmQpOworCQlyaW9faW5pdF9kcml2ZXJzKCk7CisJfSBlbHNlIHsKKwkJLyogZGVyZWdpc3RlciB0aGUgbWlzYyBkZXZpY2Ugd2UgY3JlYXRlZCBlYXJsaWVyICovCisJCW1pc2NfZGVyZWdpc3RlcigmcmlvX2Z3X2RldmljZSk7CisJfQogCi0gIGZ1bmNfZXhpdCgpOwotICByZXR1cm4gZm91bmQ/MDotRUlPOworCWZ1bmNfZXhpdCgpOworCXJldHVybiBmb3VuZCA/IDAgOiAtRUlPOwogfQogCiAKLXN0YXRpYyB2b2lkIF9fZXhpdCByaW9fZXhpdCAodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCByaW9fZXhpdCh2b2lkKQogewotICBpbnQgaTsgCi0gIHN0cnVjdCBIb3N0ICpocDsKLSAgCi0gIGZ1bmNfZW50ZXIoKTsKKwlpbnQgaTsKKwlzdHJ1Y3QgSG9zdCAqaHA7CiAKLSAgZm9yIChpPTAsaHA9cC0+UklPSG9zdHM7aTxwLT5SSU9OdW1Ib3N0cztpKyssIGhwKyspIHsKLSAgICBSSU9Ib3N0UmVzZXQgKGhwLT5UeXBlLCBocC0+Q2FyZFAsIGhwLT5TbG90KTsKLSAgICBpZiAoaHAtPkl2ZWMpIHsKLSAgICAgIGZyZWVfaXJxIChocC0+SXZlYywgaHApOwotICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiZnJlZWQgaXJxICVkLlxuIiwgaHAtPkl2ZWMpOwotICAgIH0KLSAgICAvKiBJdCBpcyBzYWZlL2FsbG93ZWQgdG8gZGVsX3RpbWVyIGEgbm9uLWFjdGl2ZSB0aW1lciAqLwotICAgIGRlbF90aW1lciAoJmhwLT50aW1lcik7Ci0gIH0KKwlmdW5jX2VudGVyKCk7CiAKLSAgaWYgKG1pc2NfZGVyZWdpc3RlcigmcmlvX2Z3X2RldmljZSkgPCAwKSB7Ci0gICAgcHJpbnRrIChLRVJOX0lORk8gInJpbzogY291bGRuJ3QgZGVyZWdpc3RlciBjb250cm9sLWRldmljZVxuIik7Ci0gIH0KKwlmb3IgKGkgPSAwLCBocCA9IHAtPlJJT0hvc3RzOyBpIDwgcC0+UklPTnVtSG9zdHM7IGkrKywgaHArKykgeworCQlSSU9Ib3N0UmVzZXQoaHAtPlR5cGUsIGhwLT5DYXJkUCwgaHAtPlNsb3QpOworCQlpZiAoaHAtPkl2ZWMpIHsKKwkJCWZyZWVfaXJxKGhwLT5JdmVjLCBocCk7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5JVCwgImZyZWVkIGlycSAlZC5cbiIsIGhwLT5JdmVjKTsKKwkJfQorCQkvKiBJdCBpcyBzYWZlL2FsbG93ZWQgdG8gZGVsX3RpbWVyIGEgbm9uLWFjdGl2ZSB0aW1lciAqLworCQlkZWxfdGltZXIoJmhwLT50aW1lcik7CisJfQorCisJaWYgKG1pc2NfZGVyZWdpc3RlcigmcmlvX2Z3X2RldmljZSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gInJpbzogY291bGRuJ3QgZGVyZWdpc3RlciBjb250cm9sLWRldmljZVxuIik7CisJfQogCiAKLSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19DTEVBTlVQLCAiQ2xlYW5pbmcgdXAgZHJpdmVyc1xuIik7CisJcmlvX2RwcmludGsoUklPX0RFQlVHX0NMRUFOVVAsICJDbGVhbmluZyB1cCBkcml2ZXJzXG4iKTsKIAotICByaW9fcmVsZWFzZV9kcml2ZXJzICgpOworCXJpb19yZWxlYXNlX2RyaXZlcnMoKTsKIAotICAvKiBSZWxlYXNlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBtZW1vcnkgKi8KLSAga2ZyZWUgKHAtPlJJT1BvcnRwKTsKLSAga2ZyZWUgKHAtPlJJT0hvc3RzKTsKLSAga2ZyZWUgKHApOworCS8qIFJlbGVhc2UgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lbW9yeSAqLworCWtmcmVlKHAtPlJJT1BvcnRwKTsKKwlrZnJlZShwLT5SSU9Ib3N0cyk7CisJa2ZyZWUocCk7CiAKLSAgZnVuY19leGl0KCk7CisJZnVuY19leGl0KCk7CiB9CiAKIG1vZHVsZV9pbml0KHJpb19pbml0KTsKQEAgLTEzNzIsNCArMTI3MywzIEBACiAgKiB0YWItd2lkdGg6IDgKICAqIEVuZDoKICAqLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb19saW51eC5oIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9fbGludXguaAppbmRleCAxZmJhMTlkNS4uNGNlNzdmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9yaW9fbGludXguaAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb19saW51eC5oCkBAIC0zNywxNSArMzcsMTUgQEAKIAogCiBzdHJ1Y3QgdnBkX3Byb20gewotICB1bnNpZ25lZCBzaG9ydCBpZDsKLSAgY2hhciBod3JldjsKLSAgY2hhciBod2FzczsKLSAgaW50IHVuaXFpZDsKLSAgY2hhciBteWVhcjsKLSAgY2hhciBtd2VlazsKLSAgY2hhciBod19mZWF0dXJlWzVdOwotICBjaGFyIG9lbV9pZDsKLSAgY2hhciBpZGVudGlmaWVyWzE2XTsKKwl1bnNpZ25lZCBzaG9ydCBpZDsKKwljaGFyIGh3cmV2OworCWNoYXIgaHdhc3M7CisJaW50IHVuaXFpZDsKKwljaGFyIG15ZWFyOworCWNoYXIgbXdlZWs7CisJY2hhciBod19mZWF0dXJlWzVdOworCWNoYXIgb2VtX2lkOworCWNoYXIgaWRlbnRpZmllclsxNl07CiB9OwogCiAKQEAgLTc1LDEzICs3NSwxMyBAQAogICAgICAgKExfSVNJRyh0dHkpKSkKIAogCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmCQkJCS8qIF9fS0VSTkVMX18gKi8KIAogCiAjZGVmaW5lIFJJT19CT0FSRF9JTlRSX0xPQ0sgIDEKIAogCi0jaWZuZGVmIFJJT0NUTF9NSVNDX01JTk9SIAorI2lmbmRlZiBSSU9DVExfTUlTQ19NSU5PUgogLyogQWxsb3cgb3RoZXJzIHRvIGdhdGhlciB0aGlzIGludG8gIm1ham9yLmgiIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQgKi8KICNkZWZpbmUgUklPQ1RMX01JU0NfTUlOT1IgICAgMTY5CiAjZW5kaWYKQEAgLTEyMSwzOSArMTIxLDM5IEBACiAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKHNlbSwgZmxhZ3MpCiAKICNkZWZpbmUgcmlvX3NwaW5fbG9jayhzZW0pIFwKLSAgICAgICAgICAgIHNwaW5fbG9jayhzZW0pIAorICAgICAgICAgICAgc3Bpbl9sb2NrKHNlbSkKIAogI2RlZmluZSByaW9fc3Bpbl91bmxvY2soc2VtKSBcCi0gICAgICAgICAgICBzcGluX3VubG9jayhzZW0pIAorICAgICAgICAgICAgc3Bpbl91bmxvY2soc2VtKQogCiAjZW5kaWYKIAogCiAKICNpZmRlZiBDT05GSUdfUklPX09MRFBDSQotc3RhdGljIGlubGluZSB2b2lkICpyaW9fbWVtY3B5X3RvaW8gKHZvaWQgKmR1bW15LCB2b2lkICpkZXN0LCB2b2lkICpzb3VyY2UsIGludCBuKQorc3RhdGljIGlubGluZSB2b2lkICpyaW9fbWVtY3B5X3RvaW8odm9pZCAqZHVtbXksIHZvaWQgKmRlc3QsIHZvaWQgKnNvdXJjZSwgaW50IG4pCiB7Ci0gIGNoYXIgKmRzdCA9IGRlc3Q7Ci0gIGNoYXIgKnNyYyA9IHNvdXJjZTsKKwljaGFyICpkc3QgPSBkZXN0OworCWNoYXIgKnNyYyA9IHNvdXJjZTsKIAotICB3aGlsZSAobi0tKSB7Ci0gICAgd3JpdGViICgqc3JjKyssIGRzdCsrKTsKLSAgICAodm9pZCkgcmVhZGIgKGR1bW15KTsKLSAgfQorCXdoaWxlIChuLS0pIHsKKwkJd3JpdGViKCpzcmMrKywgZHN0KyspOworCQkodm9pZCkgcmVhZGIoZHVtbXkpOworCX0KIAotICByZXR1cm4gZGVzdDsKKwlyZXR1cm4gZGVzdDsKIH0KIAogCi1zdGF0aWMgaW5saW5lIHZvaWQgKnJpb19tZW1jcHlfZnJvbWlvICh2b2lkICpkZXN0LCB2b2lkICpzb3VyY2UsIGludCBuKQorc3RhdGljIGlubGluZSB2b2lkICpyaW9fbWVtY3B5X2Zyb21pbyh2b2lkICpkZXN0LCB2b2lkICpzb3VyY2UsIGludCBuKQogewotICBjaGFyICpkc3QgPSBkZXN0OwotICBjaGFyICpzcmMgPSBzb3VyY2U7CisJY2hhciAqZHN0ID0gZGVzdDsKKwljaGFyICpzcmMgPSBzb3VyY2U7CiAKLSAgd2hpbGUgKG4tLSkgCi0gICAgKmRzdCsrID0gcmVhZGIgKHNyYysrKTsKKwl3aGlsZSAobi0tKQorCQkqZHN0KysgPSByZWFkYihzcmMrKyk7CiAKLSAgcmV0dXJuIGRlc3Q7CisJcmV0dXJuIGRlc3Q7CiB9CiAKICNlbHNlCkBAIC0xNzksOSArMTc5LDggQEAKICNkZWZpbmUgZnVuY19leGl0KCkgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfRkxPVywgInJpbzogZXhpdCAgJXNcbiIsIF9fRlVOQ1RJT05fXykKICNkZWZpbmUgZnVuY19lbnRlcjIoKSByaW9fZHByaW50ayAoUklPX0RFQlVHX0ZMT1csICJyaW86IGVudGVyICVzIChwb3J0ICVkKVxuIixfX0ZVTkNUSU9OX18sIHBvcnQtPmxpbmUpCiAjZWxzZQotI2RlZmluZSByaW9fZHByaW50ayhmLCBzdHIuLi4pIC8qIG5vdGhpbmcgKi8KKyNkZWZpbmUgcmlvX2RwcmludGsoZiwgc3RyLi4uKQkvKiBub3RoaW5nICovCiAjZGVmaW5lIGZ1bmNfZW50ZXIoKQogI2RlZmluZSBmdW5jX2V4aXQoKQogI2RlZmluZSBmdW5jX2VudGVyMigpCiAjZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9ib2FyZC5oIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9ib2FyZC5oCmluZGV4IGNjNmFjNmEuLjgyMmMwNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vcmlvYm9hcmQuaAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2JvYXJkLmgKQEAgLTM1LDcgKzM1LDcgQEAKIAogKi8KIAotI2lmbmRlZglfcmlvYm9hcmRfaAkJCQkvKiBJZiBSSU9CT0FSRC5IIG5vdCBhbHJlYWR5IGRlZmluZWQgKi8KKyNpZm5kZWYJX3Jpb2JvYXJkX2gJCS8qIElmIFJJT0JPQVJELkggbm90IGFscmVhZHkgZGVmaW5lZCAqLwogI2RlZmluZQlfcmlvYm9hcmRfaCAgICAxCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDYsNyArNDYsNyBAQAogCiAvKiBIYXJkd2FyZSBSZWdpc3RlcnMuLi4gKi8KIAotI2RlZmluZQlSSU9fUkVHX0JBU0UJMHg3QzAwCQkJLyogQmFzZSBvZiBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZQlSSU9fUkVHX0JBU0UJMHg3QzAwCS8qIEJhc2Ugb2YgY29udHJvbCByZWdpc3RlcnMgKi8KIAogI2RlZmluZQlSSU9fQ09ORklHCVJJT19SRUdfQkFTRSArIDB4MDAwMAkvKiBXUklURTogQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwogI2RlZmluZQlSSU9fSU5UU0VUCVJJT19SRUdfQkFTRSArIDB4MDA4MAkvKiBXUklURTogSW50ZXJydXB0IFNldCAqLwpAQCAtNTgsMzAgKzU4LDMwIEBACiAjZGVmaW5lCVJJT19SRVNFVFNUQVQJUklPX1JFR19CQVNFICsgMHgwMTAwCS8qIFJFQUQ6IFJlc2V0IFN0YXR1cyAoSmV0IGJvYXJkcyBvbmx5KSAqLwogCiAvKiBSSU9fVlBEX1JPTSBkZWZpbml0aW9ucy4uLiAqLwotI2RlZmluZQlWUERfU0xYX0lEMQkweDAwCQkJLyogUkVBRDogU3BlY2lhbGl4IElkZW50aWZpZXIgIzEgKi8KLSNkZWZpbmUJVlBEX1NMWF9JRDIJMHgwMQkJCS8qIFJFQUQ6IFNwZWNpYWxpeCBJZGVudGlmaWVyICMyICovCi0jZGVmaW5lCVZQRF9IV19SRVYJMHgwMgkJCS8qIFJFQUQ6IEhhcmR3YXJlIFJldmlzaW9uICovCi0jZGVmaW5lCVZQRF9IV19BU1NFTQkweDAzCQkJLyogUkVBRDogSGFyZHdhcmUgQXNzZW1ibHkgTGV2ZWwgKi8KLSNkZWZpbmUJVlBEX1VOSVFVRUlENAkweDA0CQkJLyogUkVBRDogVW5pcXVlIElkZW50aWZpZXIgIzQgKi8KLSNkZWZpbmUJVlBEX1VOSVFVRUlEMwkweDA1CQkJLyogUkVBRDogVW5pcXVlIElkZW50aWZpZXIgIzMgKi8KLSNkZWZpbmUJVlBEX1VOSVFVRUlEMgkweDA2CQkJLyogUkVBRDogVW5pcXVlIElkZW50aWZpZXIgIzIgKi8KLSNkZWZpbmUJVlBEX1VOSVFVRUlEMQkweDA3CQkJLyogUkVBRDogVW5pcXVlIElkZW50aWZpZXIgIzEgKi8KLSNkZWZpbmUJVlBEX01BTlVfWUVBUgkweDA4CQkJLyogUkVBRDogWWVhciBPZiBNYW51ZmFjdHVyZSAoMCA9IDE5NzApICovCi0jZGVmaW5lCVZQRF9NQU5VX1dFRUsJMHgwOQkJCS8qIFJFQUQ6IFdlZWsgT2YgTWFudWZhY3R1cmUgKDAgPSB3ZWVrIDEgSmFuKSAqLwotI2RlZmluZQlWUERfSFdGRUFUVVJFMQkweDBBCQkJLyogUkVBRDogSGFyZHdhcmUgRmVhdHVyZSBCeXRlIDEgKi8KLSNkZWZpbmUJVlBEX0hXRkVBVFVSRTIJMHgwQgkJCS8qIFJFQUQ6IEhhcmR3YXJlIEZlYXR1cmUgQnl0ZSAyICovCi0jZGVmaW5lCVZQRF9IV0ZFQVRVUkUzCTB4MEMJCQkvKiBSRUFEOiBIYXJkd2FyZSBGZWF0dXJlIEJ5dGUgMyAqLwotI2RlZmluZQlWUERfSFdGRUFUVVJFNAkweDBECQkJLyogUkVBRDogSGFyZHdhcmUgRmVhdHVyZSBCeXRlIDQgKi8KLSNkZWZpbmUJVlBEX0hXRkVBVFVSRTUJMHgwRQkJCS8qIFJFQUQ6IEhhcmR3YXJlIEZlYXR1cmUgQnl0ZSA1ICovCi0jZGVmaW5lCVZQRF9PRU1JRAkweDBGCQkJLyogUkVBRDogT0VNIElkZW50aWZpZXIgKi8KLSNkZWZpbmUJVlBEX0lERU5UCTB4MTAJCQkvKiBSRUFEOiBJZGVudGlmaWVyIHN0cmluZyAoMTYgYnl0ZXMpICovCisjZGVmaW5lCVZQRF9TTFhfSUQxCTB4MDAJLyogUkVBRDogU3BlY2lhbGl4IElkZW50aWZpZXIgIzEgKi8KKyNkZWZpbmUJVlBEX1NMWF9JRDIJMHgwMQkvKiBSRUFEOiBTcGVjaWFsaXggSWRlbnRpZmllciAjMiAqLworI2RlZmluZQlWUERfSFdfUkVWCTB4MDIJLyogUkVBRDogSGFyZHdhcmUgUmV2aXNpb24gKi8KKyNkZWZpbmUJVlBEX0hXX0FTU0VNCTB4MDMJLyogUkVBRDogSGFyZHdhcmUgQXNzZW1ibHkgTGV2ZWwgKi8KKyNkZWZpbmUJVlBEX1VOSVFVRUlENAkweDA0CS8qIFJFQUQ6IFVuaXF1ZSBJZGVudGlmaWVyICM0ICovCisjZGVmaW5lCVZQRF9VTklRVUVJRDMJMHgwNQkvKiBSRUFEOiBVbmlxdWUgSWRlbnRpZmllciAjMyAqLworI2RlZmluZQlWUERfVU5JUVVFSUQyCTB4MDYJLyogUkVBRDogVW5pcXVlIElkZW50aWZpZXIgIzIgKi8KKyNkZWZpbmUJVlBEX1VOSVFVRUlEMQkweDA3CS8qIFJFQUQ6IFVuaXF1ZSBJZGVudGlmaWVyICMxICovCisjZGVmaW5lCVZQRF9NQU5VX1lFQVIJMHgwOAkvKiBSRUFEOiBZZWFyIE9mIE1hbnVmYWN0dXJlICgwID0gMTk3MCkgKi8KKyNkZWZpbmUJVlBEX01BTlVfV0VFSwkweDA5CS8qIFJFQUQ6IFdlZWsgT2YgTWFudWZhY3R1cmUgKDAgPSB3ZWVrIDEgSmFuKSAqLworI2RlZmluZQlWUERfSFdGRUFUVVJFMQkweDBBCS8qIFJFQUQ6IEhhcmR3YXJlIEZlYXR1cmUgQnl0ZSAxICovCisjZGVmaW5lCVZQRF9IV0ZFQVRVUkUyCTB4MEIJLyogUkVBRDogSGFyZHdhcmUgRmVhdHVyZSBCeXRlIDIgKi8KKyNkZWZpbmUJVlBEX0hXRkVBVFVSRTMJMHgwQwkvKiBSRUFEOiBIYXJkd2FyZSBGZWF0dXJlIEJ5dGUgMyAqLworI2RlZmluZQlWUERfSFdGRUFUVVJFNAkweDBECS8qIFJFQUQ6IEhhcmR3YXJlIEZlYXR1cmUgQnl0ZSA0ICovCisjZGVmaW5lCVZQRF9IV0ZFQVRVUkU1CTB4MEUJLyogUkVBRDogSGFyZHdhcmUgRmVhdHVyZSBCeXRlIDUgKi8KKyNkZWZpbmUJVlBEX09FTUlECTB4MEYJLyogUkVBRDogT0VNIElkZW50aWZpZXIgKi8KKyNkZWZpbmUJVlBEX0lERU5UCTB4MTAJLyogUkVBRDogSWRlbnRpZmllciBzdHJpbmcgKDE2IGJ5dGVzKSAqLwogI2RlZmluZQlWUERfSURFTlRfTEVOCTB4MTAKIAogLyogVlBEIFJPTSBEZWZpbml0aW9ucy4uLiAqLwogI2RlZmluZQlTTFhfSUQxCQkweDRECiAjZGVmaW5lCVNMWF9JRDIJCTB4OTgKIAotI2RlZmluZQlQUk9EVUNUX0lEKGEpCSgoYT4+NCkmMHhGKQkJLyogVXNlIHRvIG9idGFpbiBQcm9kdWN0IElEIGZyb20gVlBEX1VOSVFVRUlEMSAqLworI2RlZmluZQlQUk9EVUNUX0lEKGEpCSgoYT4+NCkmMHhGKQkvKiBVc2UgdG8gb2J0YWluIFByb2R1Y3QgSUQgZnJvbSBWUERfVU5JUVVFSUQxICovCiAKICNkZWZpbmUJSURfU1hfSVNBCTB4MgogI2RlZmluZQlJRF9SSU9fRUlTQQkweDMKQEAgLTEwMSw3ICsxMDEsNyBAQAogCiAvKiBGaXJtd2FyZSBsb2FkIHBvc2l0aW9uLi4uICovCiAKLSNkZWZpbmUJRklSTVdBUkVMT0FEQUREUgkweDdDMDAJCS8qIEZpcm13YXJlIGlzIGxvYWRlZCBfYmVmb3JlXyB0aGlzIGFkZHJlc3MgKi8KKyNkZWZpbmUJRklSTVdBUkVMT0FEQUREUgkweDdDMDAJLyogRmlybXdhcmUgaXMgbG9hZGVkIF9iZWZvcmVfIHRoaXMgYWRkcmVzcyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTEyLDE0ICsxMTIsMTQgQEAKIC8qIENvbnRyb2wgUmVnaXN0ZXIgRGVmaW5pdGlvbnMuLi4gKi8KICNkZWZpbmUJUklPX0lTQV9JREVOVAkiSkJKR1BHR0hJTlNNSlBKUiIKIAotI2RlZmluZQlSSU9fSVNBX0NGR19CT09UUkFNCTB4MDEJCS8qIEJvb3QgZnJvbSBSQU0sIGVsc2UgTGluayAqLwotI2RlZmluZQlSSU9fSVNBX0NGR19CVVNFTkFCTEUJMHgwMgkJLyogRW5hYmxlIHByb2Nlc3NvciBidXMgKi8KLSNkZWZpbmUJUklPX0lTQV9DRkdfSVJRTUFTSwkweDMwCQkvKiBJbnRlcnJ1cHQgbWFzayAqLwotI2RlZmluZQkgIFJJT19JU0FfQ0ZHX0lSUTEyCTB4MTAJCS8qIEludGVycnVwdCBMZXZlbCAxMiAqLwotI2RlZmluZQkgIFJJT19JU0FfQ0ZHX0lSUTExCTB4MjAJCS8qIEludGVycnVwdCBMZXZlbCAxMSAqLwotI2RlZmluZQkgIFJJT19JU0FfQ0ZHX0lSUTkJMHgzMAkJLyogSW50ZXJydXB0IExldmVsIDkgKi8KLSNkZWZpbmUJUklPX0lTQV9DRkdfTElOSzIwCTB4NDAJCS8qIDIwTWJwcyBsaW5rLCBlbHNlIDEwTWJwcyAqLwotI2RlZmluZQlSSU9fSVNBX0NGR19XQUlUU1RBVEUwCTB4ODAJCS8qIDAgd2FpdHN0YXRlcywgZWxzZSAxICovCisjZGVmaW5lCVJJT19JU0FfQ0ZHX0JPT1RSQU0JMHgwMQkvKiBCb290IGZyb20gUkFNLCBlbHNlIExpbmsgKi8KKyNkZWZpbmUJUklPX0lTQV9DRkdfQlVTRU5BQkxFCTB4MDIJLyogRW5hYmxlIHByb2Nlc3NvciBidXMgKi8KKyNkZWZpbmUJUklPX0lTQV9DRkdfSVJRTUFTSwkweDMwCS8qIEludGVycnVwdCBtYXNrICovCisjZGVmaW5lCSAgUklPX0lTQV9DRkdfSVJRMTIJMHgxMAkvKiBJbnRlcnJ1cHQgTGV2ZWwgMTIgKi8KKyNkZWZpbmUJICBSSU9fSVNBX0NGR19JUlExMQkweDIwCS8qIEludGVycnVwdCBMZXZlbCAxMSAqLworI2RlZmluZQkgIFJJT19JU0FfQ0ZHX0lSUTkJMHgzMAkvKiBJbnRlcnJ1cHQgTGV2ZWwgOSAqLworI2RlZmluZQlSSU9fSVNBX0NGR19MSU5LMjAJMHg0MAkvKiAyME1icHMgbGluaywgZWxzZSAxME1icHMgKi8KKyNkZWZpbmUJUklPX0lTQV9DRkdfV0FJVFNUQVRFMAkweDgwCS8qIDAgd2FpdHN0YXRlcywgZWxzZSAxICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMzAsMTcgKzEzMCwxNyBAQAogLyogQ29udHJvbCBSZWdpc3RlciBEZWZpbml0aW9ucy4uLiAqLwogI2RlZmluZQlSSU9fSVNBMl9JREVOVAkiSkJKR1BHR0hJTlNNSlBKUiIKIAotI2RlZmluZQlSSU9fSVNBMl9DRkdfQk9PVFJBTQkweDAxCQkvKiBCb290IGZyb20gUkFNLCBlbHNlIExpbmsgKi8KLSNkZWZpbmUJUklPX0lTQTJfQ0ZHX0JVU0VOQUJMRQkweDAyCQkvKiBFbmFibGUgcHJvY2Vzc29yIGJ1cyAqLwotI2RlZmluZQlSSU9fSVNBMl9DRkdfSU5URU5BQkxFCTB4MDQJCS8qIEludGVycnVwdCBlbmFibGUsIGVsc2UgZGlzYWJsZSAqLwotI2RlZmluZQlSSU9fSVNBMl9DRkdfMTZCSVQJMHgwOAkJLyogMTZiaXQgbW9kZSwgZWxzZSA4Yml0ICovCi0jZGVmaW5lCVJJT19JU0EyX0NGR19JUlFNQVNLCTB4MzAJCS8qIEludGVycnVwdCBtYXNrICovCi0jZGVmaW5lCSAgUklPX0lTQTJfQ0ZHX0lSUTE1CTB4MDAJCS8qIEludGVycnVwdCBMZXZlbCAxNSAqLwotI2RlZmluZQkgIFJJT19JU0EyX0NGR19JUlExMgkweDEwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgMTIgKi8KLSNkZWZpbmUJICBSSU9fSVNBMl9DRkdfSVJRMTEJMHgyMAkJLyogSW50ZXJydXB0IExldmVsIDExICovCi0jZGVmaW5lCSAgUklPX0lTQTJfQ0ZHX0lSUTkJMHgzMAkJLyogSW50ZXJydXB0IExldmVsIDkgKi8KLSNkZWZpbmUJUklPX0lTQTJfQ0ZHX0xJTksyMAkweDQwCQkvKiAyME1icHMgbGluaywgZWxzZSAxME1icHMgKi8KLSNkZWZpbmUJUklPX0lTQTJfQ0ZHX1dBSVRTVEFURTAJMHg4MAkJLyogMCB3YWl0c3RhdGVzLCBlbHNlIDEgKi8KKyNkZWZpbmUJUklPX0lTQTJfQ0ZHX0JPT1RSQU0JMHgwMQkvKiBCb290IGZyb20gUkFNLCBlbHNlIExpbmsgKi8KKyNkZWZpbmUJUklPX0lTQTJfQ0ZHX0JVU0VOQUJMRQkweDAyCS8qIEVuYWJsZSBwcm9jZXNzb3IgYnVzICovCisjZGVmaW5lCVJJT19JU0EyX0NGR19JTlRFTkFCTEUJMHgwNAkvKiBJbnRlcnJ1cHQgZW5hYmxlLCBlbHNlIGRpc2FibGUgKi8KKyNkZWZpbmUJUklPX0lTQTJfQ0ZHXzE2QklUCTB4MDgJLyogMTZiaXQgbW9kZSwgZWxzZSA4Yml0ICovCisjZGVmaW5lCVJJT19JU0EyX0NGR19JUlFNQVNLCTB4MzAJLyogSW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUJICBSSU9fSVNBMl9DRkdfSVJRMTUJMHgwMAkvKiBJbnRlcnJ1cHQgTGV2ZWwgMTUgKi8KKyNkZWZpbmUJICBSSU9fSVNBMl9DRkdfSVJRMTIJMHgxMAkvKiBJbnRlcnJ1cHQgTGV2ZWwgMTIgKi8KKyNkZWZpbmUJICBSSU9fSVNBMl9DRkdfSVJRMTEJMHgyMAkvKiBJbnRlcnJ1cHQgTGV2ZWwgMTEgKi8KKyNkZWZpbmUJICBSSU9fSVNBMl9DRkdfSVJROQkweDMwCS8qIEludGVycnVwdCBMZXZlbCA5ICovCisjZGVmaW5lCVJJT19JU0EyX0NGR19MSU5LMjAJMHg0MAkvKiAyME1icHMgbGluaywgZWxzZSAxME1icHMgKi8KKyNkZWZpbmUJUklPX0lTQTJfQ0ZHX1dBSVRTVEFURTAJMHg4MAkvKiAwIHdhaXRzdGF0ZXMsIGVsc2UgMSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTUxLDE0ICsxNTEsMTQgQEAKIC8qIENvbnRyb2wgUmVnaXN0ZXIgRGVmaW5pdGlvbnMuLi4gKi8KICNkZWZpbmUJUklPX0lTQTNfSURFTlQJIkpFVCBIT1NUIEJZIEtFViMiCiAKLSNkZWZpbmUJUklPX0lTQTNfQ0ZHX0JVU0VOQUJMRQkweDAyCQkvKiBFbmFibGUgcHJvY2Vzc29yIGJ1cyAqLwotI2RlZmluZQlSSU9fSVNBM19DRkdfSU5URU5BQkxFCTB4MDQJCS8qIEludGVycnVwdCBlbmFibGUsIGVsc2UgZGlzYWJsZSAqLwotI2RlZmluZQlSSU9fSVNBMzJfQ0ZHX0lSUU1BU0sJMHhGMzAJCS8qIEludGVycnVwdCBtYXNrICovCi0jZGVmaW5lCSAgUklPX0lTQTNfQ0ZHX0lSUTE1CTB4RjAJCS8qIEludGVycnVwdCBMZXZlbCAxNSAqLwotI2RlZmluZQkgIFJJT19JU0EzX0NGR19JUlExMgkweEMwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgMTIgKi8KLSNkZWZpbmUJICBSSU9fSVNBM19DRkdfSVJRMTEJMHhCMAkJLyogSW50ZXJydXB0IExldmVsIDExICovCi0jZGVmaW5lCSAgUklPX0lTQTNfQ0ZHX0lSUTEwCTB4QTAJCS8qIEludGVycnVwdCBMZXZlbCAxMCAqLwotI2RlZmluZQkgIFJJT19JU0EzX0NGR19JUlE5CTB4OTAJCS8qIEludGVycnVwdCBMZXZlbCA5ICovCisjZGVmaW5lCVJJT19JU0EzX0NGR19CVVNFTkFCTEUJMHgwMgkvKiBFbmFibGUgcHJvY2Vzc29yIGJ1cyAqLworI2RlZmluZQlSSU9fSVNBM19DRkdfSU5URU5BQkxFCTB4MDQJLyogSW50ZXJydXB0IGVuYWJsZSwgZWxzZSBkaXNhYmxlICovCisjZGVmaW5lCVJJT19JU0EzMl9DRkdfSVJRTUFTSwkweEYzMAkvKiBJbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZQkgIFJJT19JU0EzX0NGR19JUlExNQkweEYwCS8qIEludGVycnVwdCBMZXZlbCAxNSAqLworI2RlZmluZQkgIFJJT19JU0EzX0NGR19JUlExMgkweEMwCS8qIEludGVycnVwdCBMZXZlbCAxMiAqLworI2RlZmluZQkgIFJJT19JU0EzX0NGR19JUlExMQkweEIwCS8qIEludGVycnVwdCBMZXZlbCAxMSAqLworI2RlZmluZQkgIFJJT19JU0EzX0NGR19JUlExMAkweEEwCS8qIEludGVycnVwdCBMZXZlbCAxMCAqLworI2RlZmluZQkgIFJJT19JU0EzX0NGR19JUlE5CTB4OTAJLyogSW50ZXJydXB0IExldmVsIDkgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE2OSw5ICsxNjksOSBAQAogLyogQ29udHJvbCBSZWdpc3RlciBEZWZpbml0aW9ucy4uLiAqLwogI2RlZmluZQlSSU9fTUNBX0lERU5UCSJKQkpHUEdHSElOU01KUEpSIgogCi0jZGVmaW5lCVJJT19NQ0FfQ0ZHX0JPT1RSQU0JMHgwMQkJLyogQm9vdCBmcm9tIFJBTSwgZWxzZSBMaW5rICovCi0jZGVmaW5lCVJJT19NQ0FfQ0ZHX0JVU0VOQUJMRQkweDAyCQkvKiBFbmFibGUgcHJvY2Vzc29yIGJ1cyAqLwotI2RlZmluZQlSSU9fTUNBX0NGR19MSU5LMjAJMHg0MAkJLyogMjBNYnBzIGxpbmssIGVsc2UgMTBNYnBzICovCisjZGVmaW5lCVJJT19NQ0FfQ0ZHX0JPT1RSQU0JMHgwMQkvKiBCb290IGZyb20gUkFNLCBlbHNlIExpbmsgKi8KKyNkZWZpbmUJUklPX01DQV9DRkdfQlVTRU5BQkxFCTB4MDIJLyogRW5hYmxlIHByb2Nlc3NvciBidXMgKi8KKyNkZWZpbmUJUklPX01DQV9DRkdfTElOSzIwCTB4NDAJLyogMjBNYnBzIGxpbmssIGVsc2UgMTBNYnBzICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xODUsMzUgKzE4NSwzNSBAQAogI2RlZmluZQlFSVNBX1BST0RVQ1RfTlVNQkVSCTB4QzgyCiAjZGVmaW5lCUVJU0FfUkVWSVNJT05fTlVNQkVSCTB4QzgzCiAjZGVmaW5lCUVJU0FfQ0FSRF9FTkFCTEUJMHhDODQKLSNkZWZpbmUJRUlTQV9WUERfVU5JUVVFSUQ0CTB4Qzg4CQkvKiBSRUFEOiBVbmlxdWUgSWRlbnRpZmllciAjNCAqLwotI2RlZmluZQlFSVNBX1ZQRF9VTklRVUVJRDMJMHhDOEEJCS8qIFJFQUQ6IFVuaXF1ZSBJZGVudGlmaWVyICMzICovCi0jZGVmaW5lCUVJU0FfVlBEX1VOSVFVRUlEMgkweEM5MAkJLyogUkVBRDogVW5pcXVlIElkZW50aWZpZXIgIzIgKi8KLSNkZWZpbmUJRUlTQV9WUERfVU5JUVVFSUQxCTB4QzkyCQkvKiBSRUFEOiBVbmlxdWUgSWRlbnRpZmllciAjMSAqLwotI2RlZmluZQlFSVNBX1ZQRF9NQU5VX1lFQVIJMHhDOTgJCS8qIFJFQUQ6IFllYXIgT2YgTWFudWZhY3R1cmUgKDAgPSAxOTcwKSAqLwotI2RlZmluZQlFSVNBX1ZQRF9NQU5VX1dFRUsJMHhDOUEJCS8qIFJFQUQ6IFdlZWsgT2YgTWFudWZhY3R1cmUgKDAgPSB3ZWVrIDEgSmFuKSAqLworI2RlZmluZQlFSVNBX1ZQRF9VTklRVUVJRDQJMHhDODgJLyogUkVBRDogVW5pcXVlIElkZW50aWZpZXIgIzQgKi8KKyNkZWZpbmUJRUlTQV9WUERfVU5JUVVFSUQzCTB4QzhBCS8qIFJFQUQ6IFVuaXF1ZSBJZGVudGlmaWVyICMzICovCisjZGVmaW5lCUVJU0FfVlBEX1VOSVFVRUlEMgkweEM5MAkvKiBSRUFEOiBVbmlxdWUgSWRlbnRpZmllciAjMiAqLworI2RlZmluZQlFSVNBX1ZQRF9VTklRVUVJRDEJMHhDOTIJLyogUkVBRDogVW5pcXVlIElkZW50aWZpZXIgIzEgKi8KKyNkZWZpbmUJRUlTQV9WUERfTUFOVV9ZRUFSCTB4Qzk4CS8qIFJFQUQ6IFllYXIgT2YgTWFudWZhY3R1cmUgKDAgPSAxOTcwKSAqLworI2RlZmluZQlFSVNBX1ZQRF9NQU5VX1dFRUsJMHhDOUEJLyogUkVBRDogV2VlayBPZiBNYW51ZmFjdHVyZSAoMCA9IHdlZWsgMSBKYW4pICovCiAjZGVmaW5lCUVJU0FfTUVNX0FERFJfMjNfMTYJMHhDMDAKICNkZWZpbmUJRUlTQV9NRU1fQUREUl8zMV8yNAkweEMwMQotI2RlZmluZQlFSVNBX1JJT19DT05GSUcJCTB4QzAyCQkvKiBXUklURTogQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZQlFSVNBX1JJT19JTlRTRVQJCTB4QzAzCQkvKiBXUklURTogSW50ZXJydXB0IFNldCAqLwotI2RlZmluZQlFSVNBX1JJT19JTlRSRVNFVAkweEMwMwkJLyogUkVBRDogIEludGVycnVwdCBSZXNldCAqLworI2RlZmluZQlFSVNBX1JJT19DT05GSUcJCTB4QzAyCS8qIFdSSVRFOiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCUVJU0FfUklPX0lOVFNFVAkJMHhDMDMJLyogV1JJVEU6IEludGVycnVwdCBTZXQgKi8KKyNkZWZpbmUJRUlTQV9SSU9fSU5UUkVTRVQJMHhDMDMJLyogUkVBRDogIEludGVycnVwdCBSZXNldCAqLwogCiAvKiBDb250cm9sIFJlZ2lzdGVyIERlZmluaXRpb25zLi4uICovCi0jZGVmaW5lCVJJT19FSVNBX0NGR19CT09UUkFNCTB4MDEJCS8qIEJvb3QgZnJvbSBSQU0sIGVsc2UgTGluayAqLwotI2RlZmluZQlSSU9fRUlTQV9DRkdfTElOSzIwCTB4MDIJCS8qIDIwTWJwcyBsaW5rLCBlbHNlIDEwTWJwcyAqLwotI2RlZmluZQlSSU9fRUlTQV9DRkdfQlVTRU5BQkxFCTB4MDQJCS8qIEVuYWJsZSBwcm9jZXNzb3IgYnVzICovCi0jZGVmaW5lCVJJT19FSVNBX0NGR19QUk9DUlVOCTB4MDgJCS8qIFByb2Nlc3NvciBydW5uaW5nLCBlbHNlIHJlc2V0ICovCi0jZGVmaW5lCVJJT19FSVNBX0NGR19JUlFNQVNLCTB4RjAJCS8qIEludGVycnVwdCBtYXNrICovCi0jZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTE1CTB4RjAJCS8qIEludGVycnVwdCBMZXZlbCAxNSAqLwotI2RlZmluZQkgIFJJT19FSVNBX0NGR19JUlExNAkweEUwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgMTQgKi8KLSNkZWZpbmUJICBSSU9fRUlTQV9DRkdfSVJRMTIJMHhDMAkJLyogSW50ZXJydXB0IExldmVsIDEyICovCi0jZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTExCTB4QjAJCS8qIEludGVycnVwdCBMZXZlbCAxMSAqLwotI2RlZmluZQkgIFJJT19FSVNBX0NGR19JUlExMAkweEEwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgMTAgKi8KLSNkZWZpbmUJICBSSU9fRUlTQV9DRkdfSVJROQkweDkwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgOSAqLwotI2RlZmluZQkgIFJJT19FSVNBX0NGR19JUlE3CTB4NzAJCS8qIEludGVycnVwdCBMZXZlbCA3ICovCi0jZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTYJMHg2MAkJLyogSW50ZXJydXB0IExldmVsIDYgKi8KLSNkZWZpbmUJICBSSU9fRUlTQV9DRkdfSVJRNQkweDUwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgNSAqLwotI2RlZmluZQkgIFJJT19FSVNBX0NGR19JUlE0CTB4NDAJCS8qIEludGVycnVwdCBMZXZlbCA0ICovCi0jZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTMJMHgzMAkJLyogSW50ZXJydXB0IExldmVsIDMgKi8KKyNkZWZpbmUJUklPX0VJU0FfQ0ZHX0JPT1RSQU0JMHgwMQkvKiBCb290IGZyb20gUkFNLCBlbHNlIExpbmsgKi8KKyNkZWZpbmUJUklPX0VJU0FfQ0ZHX0xJTksyMAkweDAyCS8qIDIwTWJwcyBsaW5rLCBlbHNlIDEwTWJwcyAqLworI2RlZmluZQlSSU9fRUlTQV9DRkdfQlVTRU5BQkxFCTB4MDQJLyogRW5hYmxlIHByb2Nlc3NvciBidXMgKi8KKyNkZWZpbmUJUklPX0VJU0FfQ0ZHX1BST0NSVU4JMHgwOAkvKiBQcm9jZXNzb3IgcnVubmluZywgZWxzZSByZXNldCAqLworI2RlZmluZQlSSU9fRUlTQV9DRkdfSVJRTUFTSwkweEYwCS8qIEludGVycnVwdCBtYXNrICovCisjZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTE1CTB4RjAJLyogSW50ZXJydXB0IExldmVsIDE1ICovCisjZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTE0CTB4RTAJLyogSW50ZXJydXB0IExldmVsIDE0ICovCisjZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTEyCTB4QzAJLyogSW50ZXJydXB0IExldmVsIDEyICovCisjZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTExCTB4QjAJLyogSW50ZXJydXB0IExldmVsIDExICovCisjZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTEwCTB4QTAJLyogSW50ZXJydXB0IExldmVsIDEwICovCisjZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTkJMHg5MAkvKiBJbnRlcnJ1cHQgTGV2ZWwgOSAqLworI2RlZmluZQkgIFJJT19FSVNBX0NGR19JUlE3CTB4NzAJLyogSW50ZXJydXB0IExldmVsIDcgKi8KKyNkZWZpbmUJICBSSU9fRUlTQV9DRkdfSVJRNgkweDYwCS8qIEludGVycnVwdCBMZXZlbCA2ICovCisjZGVmaW5lCSAgUklPX0VJU0FfQ0ZHX0lSUTUJMHg1MAkvKiBJbnRlcnJ1cHQgTGV2ZWwgNSAqLworI2RlZmluZQkgIFJJT19FSVNBX0NGR19JUlE0CTB4NDAJLyogSW50ZXJydXB0IExldmVsIDQgKi8KKyNkZWZpbmUJICBSSU9fRUlTQV9DRkdfSVJRMwkweDMwCS8qIEludGVycnVwdCBMZXZlbCAzICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMjQsMjAgKzIyNCwyMCBAQAogLyogQ29udHJvbCBSZWdpc3RlciBEZWZpbml0aW9ucy4uLiAqLwogI2RlZmluZQlSSU9fU0JVU19JREVOVAkiSkJQR0sjXDBcMFwwXDBcMFwwXDBcMFwwXDAiCiAKLSNkZWZpbmUJUklPX1NCVVNfQ0ZHX0JPT1RSQU0JMHgwMQkJLyogQm9vdCBmcm9tIFJBTSwgZWxzZSBMaW5rICovCi0jZGVmaW5lCVJJT19TQlVTX0NGR19CVVNFTkFCTEUJMHgwMgkJLyogRW5hYmxlIHByb2Nlc3NvciBidXMgKi8KLSNkZWZpbmUJUklPX1NCVVNfQ0ZHX0lOVEVOQUJMRQkweDA0CQkvKiBJbnRlcnJ1cHQgZW5hYmxlLCBlbHNlIGRpc2FibGUgKi8KLSNkZWZpbmUJUklPX1NCVVNfQ0ZHX0lSUU1BU0sJMHgzOAkJLyogSW50ZXJydXB0IG1hc2sgKi8KLSNkZWZpbmUJICBSSU9fU0JVU19DRkdfSVJRTk9ORQkweDAwCQkvKiBObyBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJICBSSU9fU0JVU19DRkdfSVJRNwkweDM4CQkvKiBJbnRlcnJ1cHQgTGV2ZWwgNyAqLwotI2RlZmluZQkgIFJJT19TQlVTX0NGR19JUlE2CTB4MzAJCS8qIEludGVycnVwdCBMZXZlbCA2ICovCi0jZGVmaW5lCSAgUklPX1NCVVNfQ0ZHX0lSUTUJMHgyOAkJLyogSW50ZXJydXB0IExldmVsIDUgKi8KLSNkZWZpbmUJICBSSU9fU0JVU19DRkdfSVJRNAkweDIwCQkvKiBJbnRlcnJ1cHQgTGV2ZWwgNCAqLwotI2RlZmluZQkgIFJJT19TQlVTX0NGR19JUlEzCTB4MTgJCS8qIEludGVycnVwdCBMZXZlbCAzICovCi0jZGVmaW5lCSAgUklPX1NCVVNfQ0ZHX0lSUTIJMHgxMAkJLyogSW50ZXJydXB0IExldmVsIDIgKi8KLSNkZWZpbmUJICBSSU9fU0JVU19DRkdfSVJRMQkweDA4CQkvKiBJbnRlcnJ1cHQgTGV2ZWwgMSAqLwotI2RlZmluZQlSSU9fU0JVU19DRkdfTElOSzIwCTB4NDAJCS8qIDIwTWJwcyBsaW5rLCBlbHNlIDEwTWJwcyAqLwotI2RlZmluZQlSSU9fU0JVU19DRkdfUFJPQzI1CTB4ODAJCS8qIDI1TWh6IHByb2Nlc3NvciBjbG9jaywgZWxzZSAyME1oeiAqLworI2RlZmluZQlSSU9fU0JVU19DRkdfQk9PVFJBTQkweDAxCS8qIEJvb3QgZnJvbSBSQU0sIGVsc2UgTGluayAqLworI2RlZmluZQlSSU9fU0JVU19DRkdfQlVTRU5BQkxFCTB4MDIJLyogRW5hYmxlIHByb2Nlc3NvciBidXMgKi8KKyNkZWZpbmUJUklPX1NCVVNfQ0ZHX0lOVEVOQUJMRQkweDA0CS8qIEludGVycnVwdCBlbmFibGUsIGVsc2UgZGlzYWJsZSAqLworI2RlZmluZQlSSU9fU0JVU19DRkdfSVJRTUFTSwkweDM4CS8qIEludGVycnVwdCBtYXNrICovCisjZGVmaW5lCSAgUklPX1NCVVNfQ0ZHX0lSUU5PTkUJMHgwMAkvKiBObyBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJICBSSU9fU0JVU19DRkdfSVJRNwkweDM4CS8qIEludGVycnVwdCBMZXZlbCA3ICovCisjZGVmaW5lCSAgUklPX1NCVVNfQ0ZHX0lSUTYJMHgzMAkvKiBJbnRlcnJ1cHQgTGV2ZWwgNiAqLworI2RlZmluZQkgIFJJT19TQlVTX0NGR19JUlE1CTB4MjgJLyogSW50ZXJydXB0IExldmVsIDUgKi8KKyNkZWZpbmUJICBSSU9fU0JVU19DRkdfSVJRNAkweDIwCS8qIEludGVycnVwdCBMZXZlbCA0ICovCisjZGVmaW5lCSAgUklPX1NCVVNfQ0ZHX0lSUTMJMHgxOAkvKiBJbnRlcnJ1cHQgTGV2ZWwgMyAqLworI2RlZmluZQkgIFJJT19TQlVTX0NGR19JUlEyCTB4MTAJLyogSW50ZXJydXB0IExldmVsIDIgKi8KKyNkZWZpbmUJICBSSU9fU0JVU19DRkdfSVJRMQkweDA4CS8qIEludGVycnVwdCBMZXZlbCAxICovCisjZGVmaW5lCVJJT19TQlVTX0NGR19MSU5LMjAJMHg0MAkvKiAyME1icHMgbGluaywgZWxzZSAxME1icHMgKi8KKyNkZWZpbmUJUklPX1NCVVNfQ0ZHX1BST0MyNQkweDgwCS8qIDI1TWh6IHByb2Nlc3NvciBjbG9jaywgZWxzZSAyME1oeiAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjQ4LDE4ICsyNDgsMTggQEAKIC8qIENvbnRyb2wgUmVnaXN0ZXIgRGVmaW5pdGlvbnMuLi4gKi8KICNkZWZpbmUJUklPX1BDSV9JREVOVAkiRUNERFBHSkdKSEpSR1NLIyIKIAotI2RlZmluZQlSSU9fUENJX0NGR19CT09UUkFNCTB4MDEJCS8qIEJvb3QgZnJvbSBSQU0sIGVsc2UgTGluayAqLwotI2RlZmluZQlSSU9fUENJX0NGR19CVVNFTkFCTEUJMHgwMgkJLyogRW5hYmxlIHByb2Nlc3NvciBidXMgKi8KLSNkZWZpbmUJUklPX1BDSV9DRkdfSU5URU5BQkxFCTB4MDQJCS8qIEludGVycnVwdCBlbmFibGUsIGVsc2UgZGlzYWJsZSAqLwotI2RlZmluZQlSSU9fUENJX0NGR19MSU5LMjAJMHg0MAkJLyogMjBNYnBzIGxpbmssIGVsc2UgMTBNYnBzICovCi0jZGVmaW5lCVJJT19QQ0lfQ0ZHX1BST0MyNQkweDgwCQkvKiAyNU1oeiBwcm9jZXNzb3IgY2xvY2ssIGVsc2UgMjBNaHogKi8KKyNkZWZpbmUJUklPX1BDSV9DRkdfQk9PVFJBTQkweDAxCS8qIEJvb3QgZnJvbSBSQU0sIGVsc2UgTGluayAqLworI2RlZmluZQlSSU9fUENJX0NGR19CVVNFTkFCTEUJMHgwMgkvKiBFbmFibGUgcHJvY2Vzc29yIGJ1cyAqLworI2RlZmluZQlSSU9fUENJX0NGR19JTlRFTkFCTEUJMHgwNAkvKiBJbnRlcnJ1cHQgZW5hYmxlLCBlbHNlIGRpc2FibGUgKi8KKyNkZWZpbmUJUklPX1BDSV9DRkdfTElOSzIwCTB4NDAJLyogMjBNYnBzIGxpbmssIGVsc2UgMTBNYnBzICovCisjZGVmaW5lCVJJT19QQ0lfQ0ZHX1BST0MyNQkweDgwCS8qIDI1TWh6IHByb2Nlc3NvciBjbG9jaywgZWxzZSAyME1oeiAqLwogCiAvKiBQQ0kgRGVmaW5pdGlvbnMuLi4gKi8KLSNkZWZpbmUJU1BYX1ZFTkRPUl9JRAkJMHgxMUNCCQkvKiBBc3NpZ25lZCBieSB0aGUgUENJIFNJRyAqLwotI2RlZmluZQlTUFhfREVWSUNFX0lECQkweDgwMDAJCS8qIFJJTyBicmlkZ2UgYm9hcmRzICovCi0jZGVmaW5lCVNQWF9QTFhERVZJQ0VfSUQJMHgyMDAwCQkvKiBQTFggYnJpZGdlIGJvYXJkcyAqLworI2RlZmluZQlTUFhfVkVORE9SX0lECQkweDExQ0IJLyogQXNzaWduZWQgYnkgdGhlIFBDSSBTSUcgKi8KKyNkZWZpbmUJU1BYX0RFVklDRV9JRAkJMHg4MDAwCS8qIFJJTyBicmlkZ2UgYm9hcmRzICovCisjZGVmaW5lCVNQWF9QTFhERVZJQ0VfSUQJMHgyMDAwCS8qIFBMWCBicmlkZ2UgYm9hcmRzICovCiAjZGVmaW5lCVNQWF9TVUJfVkVORE9SX0lECVNQWF9WRU5ET1JfSUQJLyogU2FtZSBhcyB2ZW5kb3IgaWQgKi8KLSNkZWZpbmUJUklPX1NVQl9TWVNfSUQJCTB4MDgwMAkJLyogUklPIFBDSSBib2FyZCAqLworI2RlZmluZQlSSU9fU1VCX1NZU19JRAkJMHgwODAwCS8qIFJJTyBQQ0kgYm9hcmQgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI3MCwxMSArMjcwLDExIEBACiAvKiBDb250cm9sIFJlZ2lzdGVyIERlZmluaXRpb25zLi4uICovCiAjZGVmaW5lCVJJT19QQ0kyX0lERU5UCSJKRVQgSE9TVCBCWSBLRVYjIgogCi0jZGVmaW5lCVJJT19QQ0kyX0NGR19CVVNFTkFCTEUJMHgwMgkJLyogRW5hYmxlIHByb2Nlc3NvciBidXMgKi8KLSNkZWZpbmUJUklPX1BDSTJfQ0ZHX0lOVEVOQUJMRQkweDA0CQkvKiBJbnRlcnJ1cHQgZW5hYmxlLCBlbHNlIGRpc2FibGUgKi8KKyNkZWZpbmUJUklPX1BDSTJfQ0ZHX0JVU0VOQUJMRQkweDAyCS8qIEVuYWJsZSBwcm9jZXNzb3IgYnVzICovCisjZGVmaW5lCVJJT19QQ0kyX0NGR19JTlRFTkFCTEUJMHgwNAkvKiBJbnRlcnJ1cHQgZW5hYmxlLCBlbHNlIGRpc2FibGUgKi8KIAogLyogUENJIERlZmluaXRpb25zLi4uICovCi0jZGVmaW5lCVJJTzJfU1VCX1NZU19JRAkJMHgwMTAwCQkvKiBSSU8gKEpldCkgUENJIGJvYXJkICovCisjZGVmaW5lCVJJTzJfU1VCX1NZU19JRAkJMHgwMTAwCS8qIFJJTyAoSmV0KSBQQ0kgYm9hcmQgKi8KIAogI2VuZGlmCQkJCQkJLypfcmlvYm9hcmRfaCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2Jvb3QuYyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvYm9vdC5jCmluZGV4IDM0Y2JiMTMuLjkyZGY0MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vcmlvYm9vdC5jCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvYm9vdC5jCkBAIC02NjUsMTMgKzY2NSw2IEBACiAJc3RydWN0IENtZEJsayAqQ21kQmxrUDsKIAl1aW50IHNlcXVlbmNlOwogCi0jaWZkZWYgQ0hFQ0sKLQlDaGVja0hvc3QoSG9zdCk7Ci0JQ2hlY2tSdXAoUnVwKTsKLQlDaGVja0hvc3RQKEhvc3RQKTsKLQlDaGVja1BhY2tldFAoUGFja2V0UCk7Ci0jZW5kaWYKLQogCS8qCiAJKiogSWYgd2UgaGF2ZW4ndCBiZWVuIHRvbGQgd2hhdCB0byBib290LCB3ZSBjYW4ndCBib290IGl0LgogCSovCkBAIC05NTYsMTEgKzk0OSw2IEBACiAJICAgIE15VHlwZSA9ICJSVEEiOwogCSAgICBNeU5hbWUgPSBIb3N0UC0+TWFwcGluZ1tSdXBdLk5hbWU7CiAJfQotI2lmZGVmIENIRUNLCi0JQ2hlY2tTdHJpbmcoTXlUeXBlKTsKLQlDaGVja1N0cmluZyhNeU5hbWUpOwotI2VuZGlmCi0KIAlNeUxpbmsgPSBSQllURShQa3RDbWRQLT5MaW5rTnVtKTsKIAogCS8qCkBAIC0xMzA5LDUyICsxMjk3LDMgQEAKIAl9CiB9CiAKLSNpZiAwCi0vKgotCUZ1bmN0aW9uOglUaGlzIGZ1bmN0aW9uIGlzIHRvIGRpc2FibGUgdGhlIGRpc2sgaW50ZXJydXB0IAotICAgIFJldHVybnMgOiAgIE5vdGhpbmcKLSovCi12b2lkCi1kaXNhYmxlX2ludGVycnVwdCh2ZWN0b3IpCi1pbnQJdmVjdG9yOwotewotCWludAlwczsKLQlpbnQJdmFsOwotCi0JZGlzYWJsZShwcyk7Ci0JaWYgKHZlY3RvciA+IDQwKSAgewotCQl2YWwgPSAxIDw8ICh2ZWN0b3IgLSA0MCk7Ci0JCV9fb3V0YihTODI1OSsxLCBfX2luYihTODI1OSsxKSB8IHZhbCk7Ci0JfQotCWVsc2UgewotCQl2YWwgPSAxIDw8ICh2ZWN0b3IgLSAzMik7Ci0JCV9fb3V0YihNODI1OSsxLCBfX2luYihNODI1OSsxKSB8IHZhbCk7Ci0JfQotCXJlc3RvcmUocHMpOwotfQotCi0vKgotCUZ1bmN0aW9uOglUaGlzIGZ1bmN0aW9uIGlzIHRvIGVuYWJsZSB0aGUgZGlzayBpbnRlcnJ1cHQgCi0gICAgUmV0dXJucyA6ICAgTm90aGluZwotKi8KLXZvaWQKLWVuYWJsZV9pbnRlcnJ1cHQodmVjdG9yKQotaW50CXZlY3RvcjsKLXsKLQlpbnQJcHM7Ci0JaW50CXZhbDsKLQotCWRpc2FibGUocHMpOwotCWlmICh2ZWN0b3IgPiA0MCkgIHsKLQkJdmFsID0gMSA8PCAodmVjdG9yIC0gNDApOwotCQl2YWwgPSB+dmFsOwotCQlfX291dGIoUzgyNTkrMSwgX19pbmIoUzgyNTkrMSkgJiB2YWwpOwotCX0KLQllbHNlIHsKLQkJdmFsID0gMSA8PCAodmVjdG9yIC0gMzIpOwotCQl2YWwgPSB+dmFsOwotCQlfX291dGIoTTgyNTkrMSwgX19pbmIoTTgyNTkrMSkgJiB2YWwpOwotCX0KLQlyZXN0b3JlKHBzKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9jbWQuYyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvY21kLmMKaW5kZXggNTMzMDg1ZS4uNjk0YmZiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9yaW9jbWQuYworKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2NtZC5jCkBAIC04MywxMDIgKzgzLDk4IEBACiBzdGF0aWMgc3RydWN0IElkZW50aWZ5UnRhIElkUnRhOwogc3RhdGljIHN0cnVjdCBLaWxsTmVpZ2hib3VyIEtpbGxVbml0OwogCi1pbnQKLVJJT0ZvYWRSdGEoc3RydWN0IEhvc3QgKkhvc3RQLCBzdHJ1Y3QgTWFwICpNYXBQKQoraW50IFJJT0ZvYWRSdGEoc3RydWN0IEhvc3QgKkhvc3RQLCBzdHJ1Y3QgTWFwICpNYXBQKQogewogCXN0cnVjdCBDbWRCbGsgKkNtZEJsa1A7CiAKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkZPQUQgUlRBXG4iKTsKKwlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiRk9BRCBSVEFcbiIpOwogCiAJQ21kQmxrUCA9IFJJT0dldENtZEJsaygpOwogCi0JaWYgKCAhQ21kQmxrUCApIHsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJGT0FEIFJUQTogR2V0Q21kQmxrIGZhaWxlZFxuIik7CisJaWYgKCFDbWRCbGtQKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJGT0FEIFJUQTogR2V0Q21kQmxrIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCiAJQ21kQmxrUC0+UGFja2V0LmRlc3RfdW5pdCA9IE1hcFAtPklEOwogCUNtZEJsa1AtPlBhY2tldC5kZXN0X3BvcnQgPSBCT09UX1JVUDsKLQlDbWRCbGtQLT5QYWNrZXQuc3JjX3VuaXQgID0gMDsKLQlDbWRCbGtQLT5QYWNrZXQuc3JjX3BvcnQgID0gQk9PVF9SVVA7Ci0JQ21kQmxrUC0+UGFja2V0LmxlbgkgICA9IDB4ODQ7Ci0JQ21kQmxrUC0+UGFja2V0LmRhdGFbMF0gICA9IElGT0FEOwotCUNtZEJsa1AtPlBhY2tldC5kYXRhWzFdICAgPSAwOwotCUNtZEJsa1AtPlBhY2tldC5kYXRhWzJdICAgPSBJRk9BRF9NQUdJQyAmIDB4RkY7Ci0JQ21kQmxrUC0+UGFja2V0LmRhdGFbM10gICA9IChJRk9BRF9NQUdJQyA+PiA4KSAmIDB4RkY7CisJQ21kQmxrUC0+UGFja2V0LnNyY191bml0ID0gMDsKKwlDbWRCbGtQLT5QYWNrZXQuc3JjX3BvcnQgPSBCT09UX1JVUDsKKwlDbWRCbGtQLT5QYWNrZXQubGVuID0gMHg4NDsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVswXSA9IElGT0FEOworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzFdID0gMDsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVsyXSA9IElGT0FEX01BR0lDICYgMHhGRjsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVszXSA9IChJRk9BRF9NQUdJQyA+PiA4KSAmIDB4RkY7CiAKLQlpZiAoIFJJT1F1ZXVlQ21kQmxrKCBIb3N0UCwgTWFwUC0+SUQtMSwgQ21kQmxrUCkgPT0gUklPX0ZBSUwgKSB7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiRk9BRCBSVEE6IEZhaWxlZCB0byBxdWV1ZSBmb2FkIGNvbW1hbmRcbiIpOworCWlmIChSSU9RdWV1ZUNtZEJsayhIb3N0UCwgTWFwUC0+SUQgLSAxLCBDbWRCbGtQKSA9PSBSSU9fRkFJTCkgeworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiRk9BRCBSVEE6IEZhaWxlZCB0byBxdWV1ZSBmb2FkIGNvbW1hbmRcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLWludAotUklPWm9tYmllUnRhKHN0cnVjdCBIb3N0ICpIb3N0UCwgc3RydWN0IE1hcCAqTWFwUCkKK2ludCBSSU9ab21iaWVSdGEoc3RydWN0IEhvc3QgKkhvc3RQLCBzdHJ1Y3QgTWFwICpNYXBQKQogewogCXN0cnVjdCBDbWRCbGsgKkNtZEJsa1A7CiAKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlpPTUJJRSBSVEFcbiIpOworCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJaT01CSUUgUlRBXG4iKTsKIAogCUNtZEJsa1AgPSBSSU9HZXRDbWRCbGsoKTsKIAotCWlmICggIUNtZEJsa1AgKSB7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiWk9NQklFIFJUQTogR2V0Q21kQmxrIGZhaWxlZFxuIik7CisJaWYgKCFDbWRCbGtQKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJaT01CSUUgUlRBOiBHZXRDbWRCbGsgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKIAlDbWRCbGtQLT5QYWNrZXQuZGVzdF91bml0ID0gTWFwUC0+SUQ7CiAJQ21kQmxrUC0+UGFja2V0LmRlc3RfcG9ydCA9IEJPT1RfUlVQOwotCUNtZEJsa1AtPlBhY2tldC5zcmNfdW5pdCAgPSAwOwotCUNtZEJsa1AtPlBhY2tldC5zcmNfcG9ydCAgPSBCT09UX1JVUDsKLQlDbWRCbGtQLT5QYWNrZXQubGVuCSAgID0gMHg4NDsKLQlDbWRCbGtQLT5QYWNrZXQuZGF0YVswXSAgID0gWk9NQklFOwotCUNtZEJsa1AtPlBhY2tldC5kYXRhWzFdICAgPSAwOwotCUNtZEJsa1AtPlBhY2tldC5kYXRhWzJdICAgPSBaT01CSUVfTUFHSUMgJiAweEZGOwotCUNtZEJsa1AtPlBhY2tldC5kYXRhWzNdICAgPSAoWk9NQklFX01BR0lDID4+IDgpICYgMHhGRjsKKwlDbWRCbGtQLT5QYWNrZXQuc3JjX3VuaXQgPSAwOworCUNtZEJsa1AtPlBhY2tldC5zcmNfcG9ydCA9IEJPT1RfUlVQOworCUNtZEJsa1AtPlBhY2tldC5sZW4gPSAweDg0OworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzBdID0gWk9NQklFOworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzFdID0gMDsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVsyXSA9IFpPTUJJRV9NQUdJQyAmIDB4RkY7CisJQ21kQmxrUC0+UGFja2V0LmRhdGFbM10gPSAoWk9NQklFX01BR0lDID4+IDgpICYgMHhGRjsKIAotCWlmICggUklPUXVldWVDbWRCbGsoIEhvc3RQLCBNYXBQLT5JRC0xLCBDbWRCbGtQKSA9PSBSSU9fRkFJTCApIHsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJaT01CSUUgUlRBOiBGYWlsZWQgdG8gcXVldWUgem9tYmllIGNvbW1hbmRcbiIpOworCWlmIChSSU9RdWV1ZUNtZEJsayhIb3N0UCwgTWFwUC0+SUQgLSAxLCBDbWRCbGtQKSA9PSBSSU9fRkFJTCkgeworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiWk9NQklFIFJUQTogRmFpbGVkIHRvIHF1ZXVlIHpvbWJpZSBjb21tYW5kXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCXJldHVybiAwOwogfQogCi1pbnQKLVJJT0NvbW1hbmRSdGEoc3RydWN0IHJpb19pbmZvICpwLCB1aW50IFJ0YVVuaXF1ZSwKLQlpbnQgKCogZnVuYykoc3RydWN0IEhvc3QgKkhvc3RQLCBzdHJ1Y3QgTWFwICpNYXBQKSkKK2ludCBSSU9Db21tYW5kUnRhKHN0cnVjdCByaW9faW5mbyAqcCwgdWludCBSdGFVbmlxdWUsIGludCAoKmZ1bmMpIChzdHJ1Y3QgSG9zdCAqIEhvc3RQLCBzdHJ1Y3QgTWFwICogTWFwUCkpCiB7CiAJdWludCBIb3N0OwogCi0JcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJDb21tYW5kIFJUQSAweCV4IGZ1bmMgMHgleFxuIiwgUnRhVW5pcXVlLCAoaW50KWZ1bmMpOworCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJDb21tYW5kIFJUQSAweCV4IGZ1bmMgMHgleFxuIiwgUnRhVW5pcXVlLCAoaW50KSBmdW5jKTsKIAotCWlmICggIVJ0YVVuaXF1ZSApCi0JCXJldHVybigwKTsKKwlpZiAoIVJ0YVVuaXF1ZSkKKwkJcmV0dXJuICgwKTsKIAotCWZvciAoIEhvc3QgPSAwOyBIb3N0IDwgcC0+UklPTnVtSG9zdHM7IEhvc3QrKyApIHsKKwlmb3IgKEhvc3QgPSAwOyBIb3N0IDwgcC0+UklPTnVtSG9zdHM7IEhvc3QrKykgewogCQl1aW50IFJ0YTsKIAkJc3RydWN0IEhvc3QgKkhvc3RQID0gJnAtPlJJT0hvc3RzW0hvc3RdOwogCi0JCWZvciAoIFJ0YSA9IDA7IFJ0YSA8IFJUQVNfUEVSX0hPU1Q7IFJ0YSsrICkgeworCQlmb3IgKFJ0YSA9IDA7IFJ0YSA8IFJUQVNfUEVSX0hPU1Q7IFJ0YSsrKSB7CiAJCQlzdHJ1Y3QgTWFwICpNYXBQID0gJkhvc3RQLT5NYXBwaW5nW1J0YV07CiAKLQkJCWlmICggTWFwUC0+UnRhVW5pcXVlTnVtID09IFJ0YVVuaXF1ZSApIHsKKwkJCWlmIChNYXBQLT5SdGFVbmlxdWVOdW0gPT0gUnRhVW5pcXVlKSB7CiAJCQkJdWludCBMaW5rOwogCiAJCQkJLyoKLQkJCQkqKiBub3csIGxldHMganVzdCBjaGVjayB3ZSBoYXZlIGEgcm91dGUgdG8gaXQuLi4KLQkJCQkqKiBJRiB0aGUgcm91dGluZyBzdHVmZiBpcyB3b3JraW5nLCB0aGVuIG9uZSBvZiB0aGUKLQkJCQkqKiB0b3BvbG9neSBlbnRyaWVzIGZvciB0aGlzIHVuaXQgd2lsbCBoYXZlIGEgbGVnaXQKLQkJCQkqKiByb3V0ZSAqc29tZXdoZXJlKi4gV2UgY2FyZSBub3Qgd2hlcmUgLSBpZiBpdHMgZ290Ci0JCQkJKiogYW55IGNvbm5lY3Rpb25zLCB3ZSBjYW4gZ2V0IHRvIGl0LgotCQkJCSovCi0JCQkJZm9yICggTGluayA9IDA7IExpbmsgPCBMSU5LU19QRVJfVU5JVDsgTGluaysrICkgewotCQkJCQlpZiAoIE1hcFAtPlRvcG9sb2d5W0xpbmtdLlVuaXQgPD0gKHVjaGFyKU1BWF9SVVAgKSB7CisJCQkJICoqIG5vdywgbGV0cyBqdXN0IGNoZWNrIHdlIGhhdmUgYSByb3V0ZSB0byBpdC4uLgorCQkJCSAqKiBJRiB0aGUgcm91dGluZyBzdHVmZiBpcyB3b3JraW5nLCB0aGVuIG9uZSBvZiB0aGUKKwkJCQkgKiogdG9wb2xvZ3kgZW50cmllcyBmb3IgdGhpcyB1bml0IHdpbGwgaGF2ZSBhIGxlZ2l0CisJCQkJICoqIHJvdXRlICpzb21ld2hlcmUqLiBXZSBjYXJlIG5vdCB3aGVyZSAtIGlmIGl0cyBnb3QKKwkJCQkgKiogYW55IGNvbm5lY3Rpb25zLCB3ZSBjYW4gZ2V0IHRvIGl0LgorCQkJCSAqLworCQkJCWZvciAoTGluayA9IDA7IExpbmsgPCBMSU5LU19QRVJfVU5JVDsgTGluaysrKSB7CisJCQkJCWlmIChNYXBQLT5Ub3BvbG9neVtMaW5rXS5Vbml0IDw9ICh1Y2hhcikgTUFYX1JVUCkgewogCQkJCQkJLyoKLQkJCQkJCSoqIEl0cyB3b3J0aCB0cnlpbmcgdGhlIG9wZXJhdGlvbi4uLgotCQkJCQkJKi8KLQkJCQkJCXJldHVybiAoKmZ1bmMpKCBIb3N0UCwgTWFwUCApOworCQkJCQkJICoqIEl0cyB3b3J0aCB0cnlpbmcgdGhlIG9wZXJhdGlvbi4uLgorCQkJCQkJICovCisJCQkJCQlyZXR1cm4gKCpmdW5jKSAoSG9zdFAsIE1hcFApOwogCQkJCQl9CiAJCQkJfQogCQkJfQpAQCAtMTg4LDYwICsxODQsNTkgQEAKIH0KIAogCi1pbnQKLVJJT0lkZW50aWZ5UnRhKHN0cnVjdCByaW9faW5mbyAqcCwgY2FkZHJfdCBhcmcpCitpbnQgUklPSWRlbnRpZnlSdGEoc3RydWN0IHJpb19pbmZvICpwLCBjYWRkcl90IGFyZykKIHsKIAl1aW50IEhvc3Q7CiAKLQlpZiAoIGNvcHlpbiggKGludClhcmcsIChjYWRkcl90KSZJZFJ0YSwgc2l6ZW9mKElkUnRhKSApID09IENPUFlGQUlMICkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlJJT19JREVOVElGWV9SVEEgY29weSBmYWlsZWRcbiIpOworCWlmIChjb3B5aW4oKGludCkgYXJnLCAoY2FkZHJfdCkgJiBJZFJ0YSwgc2l6ZW9mKElkUnRhKSkgPT0gQ09QWUZBSUwpIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NNRCwgIlJJT19JREVOVElGWV9SVEEgY29weSBmYWlsZWRcbiIpOwogCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCWZvciAoIEhvc3QgPSAwIDsgSG9zdCA8IHAtPlJJT051bUhvc3RzOyBIb3N0KysgKSB7CisJZm9yIChIb3N0ID0gMDsgSG9zdCA8IHAtPlJJT051bUhvc3RzOyBIb3N0KyspIHsKIAkJdWludCBSdGE7CiAJCXN0cnVjdCBIb3N0ICpIb3N0UCA9ICZwLT5SSU9Ib3N0c1tIb3N0XTsKIAotCQlmb3IgKCBSdGEgPSAwOyBSdGEgPCBSVEFTX1BFUl9IT1NUOyBSdGErKyApIHsKKwkJZm9yIChSdGEgPSAwOyBSdGEgPCBSVEFTX1BFUl9IT1NUOyBSdGErKykgewogCQkJc3RydWN0IE1hcCAqTWFwUCA9ICZIb3N0UC0+TWFwcGluZ1tSdGFdOwogCi0JCQlpZiAoIE1hcFAtPlJ0YVVuaXF1ZU51bSA9PSBJZFJ0YS5SdGFVbmlxdWUgKSB7CisJCQlpZiAoTWFwUC0+UnRhVW5pcXVlTnVtID09IElkUnRhLlJ0YVVuaXF1ZSkgewogCQkJCXVpbnQgTGluazsKIAkJCQkvKgotCQkJCSoqIG5vdywgbGV0cyBqdXN0IGNoZWNrIHdlIGhhdmUgYSByb3V0ZSB0byBpdC4uLgotCQkJCSoqIElGIHRoZSByb3V0aW5nIHN0dWZmIGlzIHdvcmtpbmcsIHRoZW4gb25lIG9mIHRoZQotCQkJCSoqIHRvcG9sb2d5IGVudHJpZXMgZm9yIHRoaXMgdW5pdCB3aWxsIGhhdmUgYSBsZWdpdAotCQkJCSoqIHJvdXRlICpzb21ld2hlcmUqLiBXZSBjYXJlIG5vdCB3aGVyZSAtIGlmIGl0cyBnb3QKLQkJCQkqKiBhbnkgY29ubmVjdGlvbnMsIHdlIGNhbiBnZXQgdG8gaXQuCi0JCQkJKi8KLQkJCQlmb3IgKCBMaW5rID0gMDsgTGluayA8IExJTktTX1BFUl9VTklUOyBMaW5rKysgKSB7Ci0JCQkJCWlmICggTWFwUC0+VG9wb2xvZ3lbTGlua10uVW5pdCA8PSAodWNoYXIpTUFYX1JVUCApIHsKKwkJCQkgKiogbm93LCBsZXRzIGp1c3QgY2hlY2sgd2UgaGF2ZSBhIHJvdXRlIHRvIGl0Li4uCisJCQkJICoqIElGIHRoZSByb3V0aW5nIHN0dWZmIGlzIHdvcmtpbmcsIHRoZW4gb25lIG9mIHRoZQorCQkJCSAqKiB0b3BvbG9neSBlbnRyaWVzIGZvciB0aGlzIHVuaXQgd2lsbCBoYXZlIGEgbGVnaXQKKwkJCQkgKiogcm91dGUgKnNvbWV3aGVyZSouIFdlIGNhcmUgbm90IHdoZXJlIC0gaWYgaXRzIGdvdAorCQkJCSAqKiBhbnkgY29ubmVjdGlvbnMsIHdlIGNhbiBnZXQgdG8gaXQuCisJCQkJICovCisJCQkJZm9yIChMaW5rID0gMDsgTGluayA8IExJTktTX1BFUl9VTklUOyBMaW5rKyspIHsKKwkJCQkJaWYgKE1hcFAtPlRvcG9sb2d5W0xpbmtdLlVuaXQgPD0gKHVjaGFyKSBNQVhfUlVQKSB7CiAJCQkJCQkvKgotCQkJCQkJKiogSXRzIHdvcnRoIHRyeWluZyB0aGUgb3BlcmF0aW9uLi4uCi0JCQkJCQkqLworCQkJCQkJICoqIEl0cyB3b3J0aCB0cnlpbmcgdGhlIG9wZXJhdGlvbi4uLgorCQkJCQkJICovCiAJCQkJCQlzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQOwogCi0JCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIklERU5USUZZIFJUQVxuIik7CisJCQkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiSURFTlRJRlkgUlRBXG4iKTsKIAogCQkJCQkJQ21kQmxrUCA9IFJJT0dldENtZEJsaygpOwogCi0JCQkJCQlpZiAoICFDbWRCbGtQICkgewotCQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiSURFTlRJRlkgUlRBOiBHZXRDbWRCbGsgZmFpbGVkXG4iKTsKKwkJCQkJCWlmICghQ21kQmxrUCkgeworCQkJCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJJREVOVElGWSBSVEE6IEdldENtZEJsayBmYWlsZWRcbiIpOwogCQkJCQkJCXJldHVybiAtRU5YSU87CiAJCQkJCQl9Ci0JCQorCiAJCQkJCQlDbWRCbGtQLT5QYWNrZXQuZGVzdF91bml0ID0gTWFwUC0+SUQ7CiAJCQkJCQlDbWRCbGtQLT5QYWNrZXQuZGVzdF9wb3J0ID0gQk9PVF9SVVA7Ci0JCQkJCQlDbWRCbGtQLT5QYWNrZXQuc3JjX3VuaXQgID0gMDsKLQkJCQkJCUNtZEJsa1AtPlBhY2tldC5zcmNfcG9ydCAgPSBCT09UX1JVUDsKLQkJCQkJCUNtZEJsa1AtPlBhY2tldC5sZW4JICAgPSAweDg0OwotCQkJCQkJQ21kQmxrUC0+UGFja2V0LmRhdGFbMF0gICA9IElERU5USUZZOwotCQkJCQkJQ21kQmxrUC0+UGFja2V0LmRhdGFbMV0gICA9IDA7Ci0JCQkJCQlDbWRCbGtQLT5QYWNrZXQuZGF0YVsyXSAgID0gSWRSdGEuSUQ7Ci0JCQotCQkJCQkJaWYgKCBSSU9RdWV1ZUNtZEJsayggSG9zdFAsIE1hcFAtPklELTEsIENtZEJsa1ApID09IFJJT19GQUlMICkgewotCQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiSURFTlRJRlkgUlRBOiBGYWlsZWQgdG8gcXVldWUgY29tbWFuZFxuIik7CisJCQkJCQlDbWRCbGtQLT5QYWNrZXQuc3JjX3VuaXQgPSAwOworCQkJCQkJQ21kQmxrUC0+UGFja2V0LnNyY19wb3J0ID0gQk9PVF9SVVA7CisJCQkJCQlDbWRCbGtQLT5QYWNrZXQubGVuID0gMHg4NDsKKwkJCQkJCUNtZEJsa1AtPlBhY2tldC5kYXRhWzBdID0gSURFTlRJRlk7CisJCQkJCQlDbWRCbGtQLT5QYWNrZXQuZGF0YVsxXSA9IDA7CisJCQkJCQlDbWRCbGtQLT5QYWNrZXQuZGF0YVsyXSA9IElkUnRhLklEOworCisJCQkJCQlpZiAoUklPUXVldWVDbWRCbGsoSG9zdFAsIE1hcFAtPklEIC0gMSwgQ21kQmxrUCkgPT0gUklPX0ZBSUwpIHsKKwkJCQkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiSURFTlRJRlkgUlRBOiBGYWlsZWQgdG8gcXVldWUgY29tbWFuZFxuIik7CiAJCQkJCQkJcmV0dXJuIC1FSU87CiAJCQkJCQl9CiAJCQkJCQlyZXR1cm4gMDsKQEAgLTI0OSwxMTQgKzI0NCwxMTAgQEAKIAkJCQl9CiAJCQl9CiAJCX0KLQl9IAorCX0KIAlyZXR1cm4gLUVOT0VOVDsKIH0KIAogCi1pbnQKLVJJT0tpbGxOZWlnaGJvdXIoc3RydWN0IHJpb19pbmZvICpwLCBjYWRkcl90IGFyZykKK2ludCBSSU9LaWxsTmVpZ2hib3VyKHN0cnVjdCByaW9faW5mbyAqcCwgY2FkZHJfdCBhcmcpCiB7CiAJdWludCBIb3N0OwogCXVpbnQgSUQ7CiAJc3RydWN0IEhvc3QgKkhvc3RQOwogCXN0cnVjdCBDbWRCbGsgKkNtZEJsa1A7CiAKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIktJTEwgSE9TVCBORUlHSEJPVVJcbiIpOworCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJLSUxMIEhPU1QgTkVJR0hCT1VSXG4iKTsKIAotCWlmICggY29weWluKCAoaW50KWFyZywgKGNhZGRyX3QpJktpbGxVbml0LCBzaXplb2YoS2lsbFVuaXQpICkgPT0gQ09QWUZBSUwgKSB7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiUklPX0tJTExfTkVJR0hCT1VSIGNvcHkgZmFpbGVkXG4iKTsKKwlpZiAoY29weWluKChpbnQpIGFyZywgKGNhZGRyX3QpICYgS2lsbFVuaXQsIHNpemVvZihLaWxsVW5pdCkpID09IENPUFlGQUlMKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJSSU9fS0lMTF9ORUlHSEJPVVIgY29weSBmYWlsZWRcbiIpOwogCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCWlmICggS2lsbFVuaXQuTGluayA+IDMgKQorCWlmIChLaWxsVW5pdC5MaW5rID4gMykKIAkJcmV0dXJuIC1FTlhJTzsKLSAKKwogCUNtZEJsa1AgPSBSSU9HZXRDbWRCbGsoKTsKIAotCWlmICggIUNtZEJsa1AgKSB7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiVUZPQUQ6IEdldENtZEJsayBmYWlsZWRcbiIpOworCWlmICghQ21kQmxrUCkgeworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiVUZPQUQ6IEdldENtZEJsayBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KIAogCUNtZEJsa1AtPlBhY2tldC5kZXN0X3VuaXQgPSAwOwotCUNtZEJsa1AtPlBhY2tldC5zcmNfdW5pdCAgPSAwOworCUNtZEJsa1AtPlBhY2tldC5zcmNfdW5pdCA9IDA7CiAJQ21kQmxrUC0+UGFja2V0LmRlc3RfcG9ydCA9IEJPT1RfUlVQOwotCUNtZEJsa1AtPlBhY2tldC5zcmNfcG9ydCAgPSBCT09UX1JVUDsKLQlDbWRCbGtQLT5QYWNrZXQubGVuCSAgID0gMHg4NDsKLQlDbWRCbGtQLT5QYWNrZXQuZGF0YVswXSAgID0gVUZPQUQ7Ci0JQ21kQmxrUC0+UGFja2V0LmRhdGFbMV0gICA9IEtpbGxVbml0Lkxpbms7Ci0JQ21kQmxrUC0+UGFja2V0LmRhdGFbMl0gICA9IFVGT0FEX01BR0lDICYgMHhGRjsKLQlDbWRCbGtQLT5QYWNrZXQuZGF0YVszXSAgID0gKFVGT0FEX01BR0lDID4+IDgpICYgMHhGRjsKKwlDbWRCbGtQLT5QYWNrZXQuc3JjX3BvcnQgPSBCT09UX1JVUDsKKwlDbWRCbGtQLT5QYWNrZXQubGVuID0gMHg4NDsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVswXSA9IFVGT0FEOworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzFdID0gS2lsbFVuaXQuTGluazsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVsyXSA9IFVGT0FEX01BR0lDICYgMHhGRjsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVszXSA9IChVRk9BRF9NQUdJQyA+PiA4KSAmIDB4RkY7CiAKLQlmb3IgKCBIb3N0ID0gMDsgSG9zdCA8IHAtPlJJT051bUhvc3RzOyBIb3N0KysgKSB7CisJZm9yIChIb3N0ID0gMDsgSG9zdCA8IHAtPlJJT051bUhvc3RzOyBIb3N0KyspIHsKIAkJSUQgPSAwOwogCQlIb3N0UCA9ICZwLT5SSU9Ib3N0c1tIb3N0XTsKIAotCQlpZiAoIEhvc3RQLT5VbmlxdWVOdW0gPT0gS2lsbFVuaXQuVW5pcXVlTnVtICkgewotCQkJaWYgKCBSSU9RdWV1ZUNtZEJsayggSG9zdFAsIFJUQVNfUEVSX0hPU1QrS2lsbFVuaXQuTGluaywKLQkJCQkJCQlDbWRCbGtQKSA9PSBSSU9fRkFJTCApIHsKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlVGT0FEOiBGYWlsZWQgcXVldWUgY29tbWFuZFxuIik7CisJCWlmIChIb3N0UC0+VW5pcXVlTnVtID09IEtpbGxVbml0LlVuaXF1ZU51bSkgeworCQkJaWYgKFJJT1F1ZXVlQ21kQmxrKEhvc3RQLCBSVEFTX1BFUl9IT1NUICsgS2lsbFVuaXQuTGluaywgQ21kQmxrUCkgPT0gUklPX0ZBSUwpIHsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiVUZPQUQ6IEZhaWxlZCBxdWV1ZSBjb21tYW5kXG4iKTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KIAkJCXJldHVybiAwOwogCQl9CiAKLQkJZm9yICggSUQ9MDsgSUQgPCBSVEFTX1BFUl9IT1NUOyBJRCsrICkgewotCQkJaWYgKCBIb3N0UC0+TWFwcGluZ1tJRF0uUnRhVW5pcXVlTnVtID09IEtpbGxVbml0LlVuaXF1ZU51bSApIHsKLQkJCQlDbWRCbGtQLT5QYWNrZXQuZGVzdF91bml0ID0gSUQrMTsKLQkJCQlpZiAoIFJJT1F1ZXVlQ21kQmxrKCBIb3N0UCwgSUQsIENtZEJsa1ApID09IFJJT19GQUlMICkgewotCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlVGT0FEOiBGYWlsZWQgcXVldWUgY29tbWFuZFxuIik7CisJCWZvciAoSUQgPSAwOyBJRCA8IFJUQVNfUEVSX0hPU1Q7IElEKyspIHsKKwkJCWlmIChIb3N0UC0+TWFwcGluZ1tJRF0uUnRhVW5pcXVlTnVtID09IEtpbGxVbml0LlVuaXF1ZU51bSkgeworCQkJCUNtZEJsa1AtPlBhY2tldC5kZXN0X3VuaXQgPSBJRCArIDE7CisJCQkJaWYgKFJJT1F1ZXVlQ21kQmxrKEhvc3RQLCBJRCwgQ21kQmxrUCkgPT0gUklPX0ZBSUwpIHsKKwkJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NNRCwgIlVGT0FEOiBGYWlsZWQgcXVldWUgY29tbWFuZFxuIik7CiAJCQkJCXJldHVybiAtRUlPOwogCQkJCX0KIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfQogCX0KLQlSSU9GcmVlQ21kQmxrKCBDbWRCbGtQICk7CisJUklPRnJlZUNtZEJsayhDbWRCbGtQKTsKIAlyZXR1cm4gLUVOWElPOwogfQogCi1pbnQKLVJJT1N1c3BlbmRCb290UnRhKHN0cnVjdCBIb3N0ICpIb3N0UCwgaW50IElELCBpbnQgTGluaykKK2ludCBSSU9TdXNwZW5kQm9vdFJ0YShzdHJ1Y3QgSG9zdCAqSG9zdFAsIGludCBJRCwgaW50IExpbmspCiB7CiAJc3RydWN0IENtZEJsayAqQ21kQmxrUDsKIAotCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiU1VTUEVORCBCT09UIE9OIFJUQSBJRCAlZCwgbGluayAlY1xuIiwgSUQsICdBJyArIExpbmspOworCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJTVVNQRU5EIEJPT1QgT04gUlRBIElEICVkLCBsaW5rICVjXG4iLCBJRCwgJ0EnICsgTGluayk7CiAKIAlDbWRCbGtQID0gUklPR2V0Q21kQmxrKCk7CiAKLQlpZiAoICFDbWRCbGtQICkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlNVU1BFTkQgQk9PVCBPTiBSVEE6IEdldENtZEJsayBmYWlsZWRcbiIpOworCWlmICghQ21kQmxrUCkgeworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiU1VTUEVORCBCT09UIE9OIFJUQTogR2V0Q21kQmxrIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCiAJQ21kQmxrUC0+UGFja2V0LmRlc3RfdW5pdCA9IElEOwogCUNtZEJsa1AtPlBhY2tldC5kZXN0X3BvcnQgPSBCT09UX1JVUDsKLQlDbWRCbGtQLT5QYWNrZXQuc3JjX3VuaXQgID0gMDsKLQlDbWRCbGtQLT5QYWNrZXQuc3JjX3BvcnQgID0gQk9PVF9SVVA7Ci0JQ21kQmxrUC0+UGFja2V0LmxlbgkgICA9IDB4ODQ7Ci0JQ21kQmxrUC0+UGFja2V0LmRhdGFbMF0gICA9IElXQUlUOwotCUNtZEJsa1AtPlBhY2tldC5kYXRhWzFdICAgPSBMaW5rOwotCUNtZEJsa1AtPlBhY2tldC5kYXRhWzJdICAgPSBJV0FJVF9NQUdJQyAmIDB4RkY7Ci0JQ21kQmxrUC0+UGFja2V0LmRhdGFbM10gICA9IChJV0FJVF9NQUdJQyA+PiA4KSAmIDB4RkY7CisJQ21kQmxrUC0+UGFja2V0LnNyY191bml0ID0gMDsKKwlDbWRCbGtQLT5QYWNrZXQuc3JjX3BvcnQgPSBCT09UX1JVUDsKKwlDbWRCbGtQLT5QYWNrZXQubGVuID0gMHg4NDsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVswXSA9IElXQUlUOworCUNtZEJsa1AtPlBhY2tldC5kYXRhWzFdID0gTGluazsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVsyXSA9IElXQUlUX01BR0lDICYgMHhGRjsKKwlDbWRCbGtQLT5QYWNrZXQuZGF0YVszXSA9IChJV0FJVF9NQUdJQyA+PiA4KSAmIDB4RkY7CiAKLQlpZiAoIFJJT1F1ZXVlQ21kQmxrKCBIb3N0UCwgSUQgLSAxLCBDbWRCbGtQKSA9PSBSSU9fRkFJTCApIHsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJTVVNQRU5EIEJPT1QgT04gUlRBOiBGYWlsZWQgdG8gcXVldWUgaXdhaXQgY29tbWFuZFxuIik7CisJaWYgKFJJT1F1ZXVlQ21kQmxrKEhvc3RQLCBJRCAtIDEsIENtZEJsa1ApID09IFJJT19GQUlMKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJTVVNQRU5EIEJPT1QgT04gUlRBOiBGYWlsZWQgdG8gcXVldWUgaXdhaXQgY29tbWFuZFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAlyZXR1cm4gMDsKIH0KIAotaW50Ci1SSU9Gb2FkV2FrZXVwKHN0cnVjdCByaW9faW5mbyAqcCkKK2ludCBSSU9Gb2FkV2FrZXVwKHN0cnVjdCByaW9faW5mbyAqcCkKIHsKIAlpbnQgcG9ydDsKIAlyZWdpc3RlciBzdHJ1Y3QgUG9ydCAqUG9ydFA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWZvciAoIHBvcnQ9MDsgcG9ydDxSSU9fUE9SVFM7IHBvcnQrKykgeworCWZvciAocG9ydCA9IDA7IHBvcnQgPCBSSU9fUE9SVFM7IHBvcnQrKykgewogCQlQb3J0UCA9IHAtPlJJT1BvcnRwW3BvcnRdOwogCiAJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKQEAgLTM3NywxNiArMzY4LDE1IEBACiAJCVBvcnRQLT5UeEJ1ZmZlck91dCA9IDA7CiAJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwogCX0KLQlyZXR1cm4oMCk7CisJcmV0dXJuICgwKTsKIH0KIAogLyoKICoqIEluY29taW5nIGNvbW1hbmQgb24gdGhlIENPTU1BTkRfUlVQIHRvIGJlIHByb2Nlc3NlZC4KICovCi1zdGF0aWMgaW50Ci1SSU9Db21tYW5kUnVwKHN0cnVjdCByaW9faW5mbyAqcCwgdWludCBSdXAsIHN0cnVjdCBIb3N0ICpIb3N0UCwgUEtUICpQYWNrZXRQKQorc3RhdGljIGludCBSSU9Db21tYW5kUnVwKHN0cnVjdCByaW9faW5mbyAqcCwgdWludCBSdXAsIHN0cnVjdCBIb3N0ICpIb3N0UCwgUEtUICogUGFja2V0UCkKIHsKLQlzdHJ1Y3QgUGt0Q21kICpQa3RDbWRQID0gKHN0cnVjdCBQa3RDbWQgKilQYWNrZXRQLT5kYXRhOworCXN0cnVjdCBQa3RDbWQgKlBrdENtZFAgPSAoc3RydWN0IFBrdENtZCAqKSBQYWNrZXRQLT5kYXRhOwogCXN0cnVjdCBQb3J0ICpQb3J0UDsKIAlzdHJ1Y3QgVW5peFJ1cCAqVW5peFJ1cFA7CiAJdXNob3J0IFN5c1BvcnQ7CkBAIC0zOTUsMTI4ICszODUsMTAxIEBACiAJdXNob3J0IHN1YkNvbW1hbmQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWZ1bmNfZW50ZXIgKCk7Ci0KLSNpZmRlZiBDSEVDSwotCUNoZWNrSG9zdCggSG9zdCApOwotCUNoZWNrSG9zdFAoIEhvc3RQICk7Ci0JQ2hlY2tQYWNrZXRQKCBQYWNrZXRQICk7Ci0jZW5kaWYKKwlmdW5jX2VudGVyKCk7CiAKIAkvKgotCSoqIDE2IHBvcnQgUlRBIG5vdGU6Ci0JKiogQ29tbWFuZCBydXAgcGFja2V0cyBjb21pbmcgZnJvbSB0aGUgUlRBIHdpbGwgaGF2ZSBwa3QtPmRhdGFbMV0gKHdoaWNoCi0JKiogdHJhbnNsYXRlcyB0byBQa3RDbWRQLT5QaGJOdW0pIHNldCB0byB0aGUgaG9zdCBwb3J0IG51bWJlciBmb3IgdGhlCi0JKiogcGFydGljdWxhciB1bml0LiBUbyBhY2Nlc3MgdGhlIGNvcnJlY3QgQmFzZVN5c1BvcnQgZm9yIGEgMTYgcG9ydCBSVEEsCi0JKiogd2UgY2FuIHVzZSBQaGJOdW0gdG8gZ2V0IHRoZSBydXAgbnVtYmVyIGZvciB0aGUgYXBwcm9wcmlhdGUgOCBwb3J0Ci0JKiogYmxvY2sgKGZvciB0aGUgZmlyc3QgYmxvY2ssIHRoaXMgc2hvdWxkIGJlIGVxdWFsIHRvICdSdXAnKS4KLQkqLwotCXJ1cCA9IFJCWVRFKFBrdENtZFAtPlBoYk51bSkgLyAodXNob3J0KVBPUlRTX1BFUl9SVEE7CisJICoqIDE2IHBvcnQgUlRBIG5vdGU6CisJICoqIENvbW1hbmQgcnVwIHBhY2tldHMgY29taW5nIGZyb20gdGhlIFJUQSB3aWxsIGhhdmUgcGt0LT5kYXRhWzFdICh3aGljaAorCSAqKiB0cmFuc2xhdGVzIHRvIFBrdENtZFAtPlBoYk51bSkgc2V0IHRvIHRoZSBob3N0IHBvcnQgbnVtYmVyIGZvciB0aGUKKwkgKiogcGFydGljdWxhciB1bml0LiBUbyBhY2Nlc3MgdGhlIGNvcnJlY3QgQmFzZVN5c1BvcnQgZm9yIGEgMTYgcG9ydCBSVEEsCisJICoqIHdlIGNhbiB1c2UgUGhiTnVtIHRvIGdldCB0aGUgcnVwIG51bWJlciBmb3IgdGhlIGFwcHJvcHJpYXRlIDggcG9ydAorCSAqKiBibG9jayAoZm9yIHRoZSBmaXJzdCBibG9jaywgdGhpcyBzaG91bGQgYmUgZXF1YWwgdG8gJ1J1cCcpLgorCSAqLworCXJ1cCA9IFJCWVRFKFBrdENtZFAtPlBoYk51bSkgLyAodXNob3J0KSBQT1JUU19QRVJfUlRBOwogCVVuaXhSdXBQID0gJkhvc3RQLT5Vbml4UnVwc1tydXBdOwotCVN5c1BvcnQgPSBVbml4UnVwUC0+QmFzZVN5c1BvcnQgKyAKLQkJCShSQllURShQa3RDbWRQLT5QaGJOdW0pICUgKHVzaG9ydClQT1JUU19QRVJfUlRBKTsKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkNvbW1hbmQgb24gcnVwICVkLCBwb3J0ICVkXG4iLCBydXAsIFN5c1BvcnQpOworCVN5c1BvcnQgPSBVbml4UnVwUC0+QmFzZVN5c1BvcnQgKyAoUkJZVEUoUGt0Q21kUC0+UGhiTnVtKSAlICh1c2hvcnQpIFBPUlRTX1BFUl9SVEEpOworCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJDb21tYW5kIG9uIHJ1cCAlZCwgcG9ydCAlZFxuIiwgcnVwLCBTeXNQb3J0KTsKIAotI2lmZGVmIENIRUNLCi0JQ2hlY2tSdXAoIHJ1cCApOwotCUNoZWNrVW5peFJ1cFAoIFVuaXhSdXBQICk7Ci0jZW5kaWYKLQlpZiAoIFVuaXhSdXBQLT5CYXNlU3lzUG9ydCA9PSBOT19QT1JUICkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIk9CU0NVUkUgRVJST1IhXG4iKTsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJEaWFnbm9zdGljcyBmb2xsb3cuIFBsZWFzZSBXUklURSBUSEVTRSBET1dOIGFuZCByZXBvcnQgdGhlbSB0byBTcGVjaWFsaXggVGVjaG5pY2FsIFN1cHBvcnRcbiIpOwotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkNPTlRST0wgaW5mb3JtYXRpb246IEhvc3QgbnVtYmVyICVkLCBuYW1lIGBgJXMnJ1xuIiwgCi0JCQkgICAgIEhvc3RQLXAtPlJJT0hvc3RzLCBIb3N0UC0+TmFtZSApOwotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkNPTlRST0wgaW5mb3JtYXRpb246IFJ1cCBudW1iZXIgIDB4JXhcbiIsIHJ1cCk7CisJaWYgKFVuaXhSdXBQLT5CYXNlU3lzUG9ydCA9PSBOT19QT1JUKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJPQlNDVVJFIEVSUk9SIVxuIik7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJEaWFnbm9zdGljcyBmb2xsb3cuIFBsZWFzZSBXUklURSBUSEVTRSBET1dOIGFuZCByZXBvcnQgdGhlbSB0byBTcGVjaWFsaXggVGVjaG5pY2FsIFN1cHBvcnRcbiIpOworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiQ09OVFJPTCBpbmZvcm1hdGlvbjogSG9zdCBudW1iZXIgJWQsIG5hbWUgYGAlcycnXG4iLCBIb3N0UCAtIHAtPlJJT0hvc3RzLCBIb3N0UC0+TmFtZSk7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJDT05UUk9MIGluZm9ybWF0aW9uOiBSdXAgbnVtYmVyICAweCV4XG4iLCBydXApOwogCi0JCWlmICggUnVwID49ICh1c2hvcnQpTUFYX1JVUCApIHsKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiQ09OVFJPTCBpbmZvcm1hdGlvbjogVGhpcyBpcyB0aGUgUlVQIGZvciBSVEEgYGAlcycnXG4iLAotCQkJCSAgICAgSG9zdFAtPk1hcHBpbmdbUnVwXS5OYW1lKTsKKwkJaWYgKFJ1cCA+PSAodXNob3J0KSBNQVhfUlVQKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiQ09OVFJPTCBpbmZvcm1hdGlvbjogVGhpcyBpcyB0aGUgUlVQIGZvciBSVEEgYGAlcycnXG4iLCBIb3N0UC0+TWFwcGluZ1tSdXBdLk5hbWUpOwogCQl9IGVsc2UKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiQ09OVFJPTCBpbmZvcm1hdGlvbjogVGhpcyBpcyB0aGUgUlVQIGZvciBsaW5rIGBgJWMnJyBvZiBob3N0IGBgJXMnJ1xuIiwgCi0JCQkJICAgICAoJ0EnICsgUnVwIC0gTUFYX1JVUCksIEhvc3RQLT5OYW1lKTsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJDT05UUk9MIGluZm9ybWF0aW9uOiBUaGlzIGlzIHRoZSBSVVAgZm9yIGxpbmsgYGAlYycnIG9mIGhvc3QgYGAlcycnXG4iLCAoJ0EnICsgUnVwIC0gTUFYX1JVUCksIEhvc3RQLT5OYW1lKTsKIAotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlBBQ0tFVCBpbmZvcm1hdGlvbjogRGVzdGluYXRpb24gMHgleDoweCV4XG4iLAotCQkJICAgICBQYWNrZXRQLT5kZXN0X3VuaXQsIFBhY2tldFAtPmRlc3RfcG9ydCApOwotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlBBQ0tFVCBpbmZvcm1hdGlvbjogU291cmNlCSAgMHgleDoweCV4XG4iLAotCQkJICAgICBQYWNrZXRQLT5zcmNfdW5pdCwgUGFja2V0UC0+c3JjX3BvcnQgKTsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJQQUNLRVQgaW5mb3JtYXRpb246IExlbmd0aAkgIDB4JXggKCVkKVxuIiwgUGFja2V0UC0+bGVuLFBhY2tldFAtPmxlbiApOwotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlBBQ0tFVCBpbmZvcm1hdGlvbjogQ29udHJvbAkgMHgleCAoJWQpXG4iLCBQYWNrZXRQLT5jb250cm9sLCBQYWNrZXRQLT5jb250cm9sKTsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJQQUNLRVQgaW5mb3JtYXRpb246IENoZWNrCSAgIDB4JXggKCVkKVxuIiwgUGFja2V0UC0+Y3N1bSwgUGFja2V0UC0+Y3N1bSApOwotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIkNPTU1BTkQgaW5mb3JtYXRpb246IEhvc3QgUG9ydCBOdW1iZXIgMHgleCwgIgotCQkJCQkiQ29tbWFuZCBDb2RlIDB4JXhcbiIsIFBrdENtZFAtPlBoYk51bSwgUGt0Q21kUC0+Q29tbWFuZCApOworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiUEFDS0VUIGluZm9ybWF0aW9uOiBEZXN0aW5hdGlvbiAweCV4OjB4JXhcbiIsIFBhY2tldFAtPmRlc3RfdW5pdCwgUGFja2V0UC0+ZGVzdF9wb3J0KTsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NNRCwgIlBBQ0tFVCBpbmZvcm1hdGlvbjogU291cmNlCSAgMHgleDoweCV4XG4iLCBQYWNrZXRQLT5zcmNfdW5pdCwgUGFja2V0UC0+c3JjX3BvcnQpOworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiUEFDS0VUIGluZm9ybWF0aW9uOiBMZW5ndGgJICAweCV4ICglZClcbiIsIFBhY2tldFAtPmxlbiwgUGFja2V0UC0+bGVuKTsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NNRCwgIlBBQ0tFVCBpbmZvcm1hdGlvbjogQ29udHJvbAkgMHgleCAoJWQpXG4iLCBQYWNrZXRQLT5jb250cm9sLCBQYWNrZXRQLT5jb250cm9sKTsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NNRCwgIlBBQ0tFVCBpbmZvcm1hdGlvbjogQ2hlY2sJICAgMHgleCAoJWQpXG4iLCBQYWNrZXRQLT5jc3VtLCBQYWNrZXRQLT5jc3VtKTsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NNRCwgIkNPTU1BTkQgaW5mb3JtYXRpb246IEhvc3QgUG9ydCBOdW1iZXIgMHgleCwgIiAiQ29tbWFuZCBDb2RlIDB4JXhcbiIsIFBrdENtZFAtPlBoYk51bSwgUGt0Q21kUC0+Q29tbWFuZCk7CiAJCXJldHVybiBUUlVFOwogCX0KLQotI2lmZGVmIENIRUNLCi0JQ2hlY2tTeXNQb3J0KCBTeXNQb3J0ICk7Ci0jZW5kaWYKLQlQb3J0UCA9IHAtPlJJT1BvcnRwWyBTeXNQb3J0IF07CisJUG9ydFAgPSBwLT5SSU9Qb3J0cFtTeXNQb3J0XTsKIAlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0Jc3dpdGNoKCBSQllURShQa3RDbWRQLT5Db21tYW5kKSApIHsKLQkJY2FzZSBCUkVBS19SRUNFSVZFRDoKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiUmVjZWl2ZWQgYSBicmVhayFcbiIpOwotCQkJLyogSWYgdGhlIGN1cnJlbnQgbGluZSBkaXNjLiBpcyBub3QgbXVsdGktdGhyZWFkaW5nIGFuZAotCSAgIAkJCXRoZSBjdXJyZW50IHByb2Nlc3NvciBpcyBub3QgdGhlIGRlZmF1bHQsIHJlc2V0IHJ1cF9pbnRyCi0JICAgCQkJYW5kIHJldHVybiBGQUxTRSB0byBlbnN1cmUgdGhhdCB0aGUgY29tbWFuZCBwYWNrZXQgaXMKLQkgICAJCQlub3QgZnJlZWQuICovCi0JCQkvKiBDYWxsIHRtZ3IgSEFOR1VQIEhFUkUgKi8KLQkJCS8qIEZpeCB0aGlzIGxhdGVyIHdoZW4gZXZlcnkgdGhpbmcgd29ya3MgISEhISBSQU1SQUogKi8KLQkJCWdzX2dvdF9icmVhayAoJlBvcnRQLT5ncyk7CisJc3dpdGNoIChSQllURShQa3RDbWRQLT5Db21tYW5kKSkgeworCWNhc2UgQlJFQUtfUkVDRUlWRUQ6CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJSZWNlaXZlZCBhIGJyZWFrIVxuIik7CisJCS8qIElmIHRoZSBjdXJyZW50IGxpbmUgZGlzYy4gaXMgbm90IG11bHRpLXRocmVhZGluZyBhbmQKKwkJICAgdGhlIGN1cnJlbnQgcHJvY2Vzc29yIGlzIG5vdCB0aGUgZGVmYXVsdCwgcmVzZXQgcnVwX2ludHIKKwkJICAgYW5kIHJldHVybiBGQUxTRSB0byBlbnN1cmUgdGhhdCB0aGUgY29tbWFuZCBwYWNrZXQgaXMKKwkJICAgbm90IGZyZWVkLiAqLworCQkvKiBDYWxsIHRtZ3IgSEFOR1VQIEhFUkUgKi8KKwkJLyogRml4IHRoaXMgbGF0ZXIgd2hlbiBldmVyeSB0aGluZyB3b3JrcyAhISEhIFJBTVJBSiAqLworCQlnc19nb3RfYnJlYWsoJlBvcnRQLT5ncyk7CisJCWJyZWFrOworCisJY2FzZSBDT01QTEVURToKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NNRCwgIkNvbW1hbmQgY29tcGxldGUgb24gcGhiICVkIGhvc3QgJWRcbiIsIFJCWVRFKFBrdENtZFAtPlBoYk51bSksIEhvc3RQIC0gcC0+UklPSG9zdHMpOworCQlzdWJDb21tYW5kID0gMTsKKwkJc3dpdGNoIChSQllURShQa3RDbWRQLT5TdWJDb21tYW5kKSkgeworCQljYXNlIE1FTURVTVA6CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiTWVtb3J5IGR1bXAgY21kICgweCV4KSBmcm9tIGFkZHIgMHgleFxuIiwgUkJZVEUoUGt0Q21kUC0+U3ViQ29tbWFuZCksIFJXT1JEKFBrdENtZFAtPlN1YkFkZHIpKTsKIAkJCWJyZWFrOworCQljYXNlIFJFQURfUkVHSVNURVI6CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiUmVhZCByZWdpc3RlciAoMHgleClcbiIsIFJXT1JEKFBrdENtZFAtPlN1YkFkZHIpKTsKKwkJCXAtPkNkUmVnaXN0ZXIgPSAoUkJZVEUoUGt0Q21kUC0+TW9kZW1TdGF0dXMpICYgTVNWUjFfSE9TVCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXN1YkNvbW1hbmQgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHN1YkNvbW1hbmQpCisJCQlicmVhazsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NNRCwgIk5ldyBzdGF0dXMgaXMgMHgleCB3YXMgMHgleFxuIiwgUkJZVEUoUGt0Q21kUC0+UG9ydFN0YXR1cyksIFBvcnRQLT5Qb3J0U3RhdGUpOworCQlpZiAoUG9ydFAtPlBvcnRTdGF0ZSAhPSBSQllURShQa3RDbWRQLT5Qb3J0U3RhdHVzKSkgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NNRCwgIk1hcmsgc3RhdHVzICYgd2FrZXVwXG4iKTsKKwkJCVBvcnRQLT5Qb3J0U3RhdGUgPSBSQllURShQa3RDbWRQLT5Qb3J0U3RhdHVzKTsKKwkJCS8qIFdoYXQgc2hvdWxkIHdlIGRvIGhlcmUgLi4uCisJCQkgICB3YWtldXAoICZQb3J0UC0+UG9ydFN0YXRlICk7CisJCQkgKi8KKwkJfSBlbHNlCisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiTm8gY2hhbmdlXG4iKTsKIAotCQljYXNlIENPTVBMRVRFOgotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJDb21tYW5kIGNvbXBsZXRlIG9uIHBoYiAlZCBob3N0ICVkXG4iLAotCQkJICAgICBSQllURShQa3RDbWRQLT5QaGJOdW0pLCBIb3N0UC1wLT5SSU9Ib3N0cyk7Ci0JCQlzdWJDb21tYW5kID0gMTsKLQkJCXN3aXRjaCAoUkJZVEUoUGt0Q21kUC0+U3ViQ29tbWFuZCkpIHsKLQkJCQljYXNlIE1FTURVTVAgOgotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJNZW1vcnkgZHVtcCBjbWQgKDB4JXgpIGZyb20gYWRkciAweCV4XG4iLAotCQkJCSAgICAgUkJZVEUoUGt0Q21kUC0+U3ViQ29tbWFuZCksIFJXT1JEKFBrdENtZFAtPlN1YkFkZHIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBSRUFEX1JFR0lTVEVSIDoKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiUmVhZCByZWdpc3RlciAoMHgleClcbiIsIFJXT1JEKFBrdENtZFAtPlN1YkFkZHIpKTsKLQkJCQkJcC0+Q2RSZWdpc3RlciA9IChSQllURShQa3RDbWRQLT5Nb2RlbVN0YXR1cykgJiBNU1ZSMV9IT1NUKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXN1YkNvbW1hbmQgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHN1YkNvbW1hbmQpCi0JCQkJYnJlYWs7Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIk5ldyBzdGF0dXMgaXMgMHgleCB3YXMgMHgleFxuIiwKLQkJCQkgICAgIFJCWVRFKFBrdENtZFAtPlBvcnRTdGF0dXMpLFBvcnRQLT5Qb3J0U3RhdGUpOwotCQkJaWYgKFBvcnRQLT5Qb3J0U3RhdGUgIT0gUkJZVEUoUGt0Q21kUC0+UG9ydFN0YXR1cykpIHsKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIk1hcmsgc3RhdHVzICYgd2FrZXVwXG4iKTsKLQkJCQlQb3J0UC0+UG9ydFN0YXRlID0gUkJZVEUoUGt0Q21kUC0+UG9ydFN0YXR1cyk7Ci0JCQkJLyogV2hhdCBzaG91bGQgd2UgZG8gaGVyZSAuLi4KLQkJCQl3YWtldXAoICZQb3J0UC0+UG9ydFN0YXRlICk7Ci0JCQkJKi8KLQkJfSBlbHNlIAotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJObyBjaGFuZ2VcbiIpOwotCi0JCQkvKiBGQUxMVEhST1VHSCAqLwotCQljYXNlIE1PREVNX1NUQVRVUzoKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIE1PREVNX1NUQVRVUzoKKwkJLyoKKwkJICoqIEtub2NrIG91dCB0aGUgdGJ1c3kgYW5kIHRzdG9wIGJpdHMsIGFzIHRoZXNlIGFyZSBub3QgcmVsZXZhbnQKKwkJICoqIHRvIHRoZSBjaGVjayBmb3IgbW9kZW0gc3RhdHVzIGNoYW5nZSAodGhleSdyZSBqdXN0IHRoZXJlIGJlY2F1c2UKKwkJICoqIGl0J3MgYSBjb252ZW5pZW50IHBsYWNlIHRvIHB1dCB0aGVtISkuCisJCSAqLworCQlSZXBvcnRlZE1vZGVtU3RhdHVzID0gUkJZVEUoUGt0Q21kUC0+TW9kZW1TdGF0dXMpOworCQlpZiAoKFBvcnRQLT5Nb2RlbVN0YXRlICYgTVNWUjFfSE9TVCkgPT0gKFJlcG9ydGVkTW9kZW1TdGF0dXMgJiBNU1ZSMV9IT1NUKSkgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NNRCwgIk1vZGVtIHN0YXR1cyB1bmNoYW5nZWQgMHgleFxuIiwgUG9ydFAtPk1vZGVtU3RhdGUpOwogCQkJLyoKLQkJCSoqIEtub2NrIG91dCB0aGUgdGJ1c3kgYW5kIHRzdG9wIGJpdHMsIGFzIHRoZXNlIGFyZSBub3QgcmVsZXZhbnQKLQkJCSoqIHRvIHRoZSBjaGVjayBmb3IgbW9kZW0gc3RhdHVzIGNoYW5nZSAodGhleSdyZSBqdXN0IHRoZXJlIGJlY2F1c2UKLQkJCSoqIGl0J3MgYSBjb252ZW5pZW50IHBsYWNlIHRvIHB1dCB0aGVtISkuCi0JCQkqLwotCQkJUmVwb3J0ZWRNb2RlbVN0YXR1cyA9IFJCWVRFKFBrdENtZFAtPk1vZGVtU3RhdHVzKTsKLQkJCWlmICgoUG9ydFAtPk1vZGVtU3RhdGUgJiBNU1ZSMV9IT1NUKSA9PQotCQkJCQkoUmVwb3J0ZWRNb2RlbVN0YXR1cyAmIE1TVlIxX0hPU1QpKSB7Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJNb2RlbSBzdGF0dXMgdW5jaGFuZ2VkIDB4JXhcbiIsIFBvcnRQLT5Nb2RlbVN0YXRlKTsKLQkJCQkvKgotCQkJCSoqIFVwZGF0ZSBNb2RlbVN0YXRlIGp1c3QgaW4gY2FzZSB0YnVzeSBvciB0c3RvcCBzdGF0ZXMgaGF2ZQotCQkJCSoqIGNoYW5nZWQuCi0JCQkJKi8KLQkJCQlQb3J0UC0+TW9kZW1TdGF0ZSA9IFJlcG9ydGVkTW9kZW1TdGF0dXM7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIk1vZGVtIHN0YXR1cyBjaGFuZ2UgZnJvbSAweCV4IHRvIDB4JXhcbiIsCi0JCQkJICAgICBQb3J0UC0+TW9kZW1TdGF0ZSwgUmVwb3J0ZWRNb2RlbVN0YXR1cyk7Ci0JCQkJUG9ydFAtPk1vZGVtU3RhdGUgPSBSZXBvcnRlZE1vZGVtU3RhdHVzOworCQkJICoqIFVwZGF0ZSBNb2RlbVN0YXRlIGp1c3QgaW4gY2FzZSB0YnVzeSBvciB0c3RvcCBzdGF0ZXMgaGF2ZQorCQkJICoqIGNoYW5nZWQuCisJCQkgKi8KKwkJCVBvcnRQLT5Nb2RlbVN0YXRlID0gUmVwb3J0ZWRNb2RlbVN0YXR1czsKKwkJfSBlbHNlIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJNb2RlbSBzdGF0dXMgY2hhbmdlIGZyb20gMHgleCB0byAweCV4XG4iLCBQb3J0UC0+TW9kZW1TdGF0ZSwgUmVwb3J0ZWRNb2RlbVN0YXR1cyk7CisJCQlQb3J0UC0+TW9kZW1TdGF0ZSA9IFJlcG9ydGVkTW9kZW1TdGF0dXM7CiAjaWZkZWYgTU9ERU1fU1VQUE9SVAotCQkJCWlmICggUG9ydFAtPk1hcHBlZCApIHsKKwkJCWlmIChQb3J0UC0+TWFwcGVkKSB7CiAJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAogCQkJCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAkJCQkqKioJCQkJCQkJCQkJCQkJICAgKioqCkBAIC01MjUsNjggKzQ4OCw2NyBAQAogCQkJCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAkJCQlcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCQkJLyoKLQkJCQkqKiBJZiB0aGUgZGV2aWNlIGlzIGEgbW9kZW0sIHRoZW4gY2hlY2sgdGhlIG1vZGVtCi0JCQkJKiogY2Fycmllci4KLQkJCQkqLworCQkJCSAqKiBJZiB0aGUgZGV2aWNlIGlzIGEgbW9kZW0sIHRoZW4gY2hlY2sgdGhlIG1vZGVtCisJCQkJICoqIGNhcnJpZXIuCisJCQkJICovCiAJCQkJaWYgKFBvcnRQLT5ncy50dHkgPT0gTlVMTCkKIAkJCQkJYnJlYWs7CiAJCQkJaWYgKFBvcnRQLT5ncy50dHktPnRlcm1pb3MgPT0gTlVMTCkKIAkJCQkJYnJlYWs7Ci0JCQkgIAotCQkJCWlmICghKFBvcnRQLT5ncy50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpICYmCi0JCQkJKChQb3J0UC0+U3RhdGUgJiAoUklPX01PUEVOfFJJT19XT1BFTikpKSkgewogCi0JCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiSXMgdGhlcmUgYSBDYXJyaWVyP1xuIik7Ci0JCQkvKgotCQkJKiogSXMgdGhlcmUgYSBjYXJyaWVyPwotCQkJKi8KLQkJCQkJaWYgKCBQb3J0UC0+TW9kZW1TdGF0ZSAmIE1TVlIxX0NEICkgewotCQkJLyoKLQkJCSoqIEhhcyBjYXJyaWVyIGp1c3QgYXBwZWFyZWQ/Ci0JCQkqLworCQkJCWlmICghKFBvcnRQLT5ncy50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpICYmICgoUG9ydFAtPlN0YXRlICYgKFJJT19NT1BFTiB8IFJJT19XT1BFTikpKSkgeworCisJCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJJcyB0aGVyZSBhIENhcnJpZXI/XG4iKTsKKwkJCQkJLyoKKwkJCQkJICoqIElzIHRoZXJlIGEgY2Fycmllcj8KKwkJCQkJICovCisJCQkJCWlmIChQb3J0UC0+TW9kZW1TdGF0ZSAmIE1TVlIxX0NEKSB7CisJCQkJCQkvKgorCQkJCQkJICoqIEhhcyBjYXJyaWVyIGp1c3QgYXBwZWFyZWQ/CisJCQkJCQkgKi8KIAkJCQkJCWlmICghKFBvcnRQLT5TdGF0ZSAmIFJJT19DQVJSX09OKSkgewotCQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiQ2FycmllciBqdXN0IGNhbWUgdXAuXG4iKTsKKwkJCQkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiQ2FycmllciBqdXN0IGNhbWUgdXAuXG4iKTsKIAkJCQkJCQlQb3J0UC0+U3RhdGUgfD0gUklPX0NBUlJfT047Ci0JCQkJLyoKLQkJCQkqKiB3YWtldXAgYW55b25lIGluIFdPUEVOCi0JCQkJKi8KLQkJCQkJCQlpZiAoUG9ydFAtPlN0YXRlICYgKFBPUlRfSVNPUEVOIHwgUklPX1dPUEVOKSApCi0JCQkJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSAoJlBvcnRQLT5ncy5vcGVuX3dhaXQpOworCQkJCQkJCS8qCisJCQkJCQkJICoqIHdha2V1cCBhbnlvbmUgaW4gV09QRU4KKwkJCQkJCQkgKi8KKwkJCQkJCQlpZiAoUG9ydFAtPlN0YXRlICYgKFBPUlRfSVNPUEVOIHwgUklPX1dPUEVOKSkKKwkJCQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZQb3J0UC0+Z3Mub3Blbl93YWl0KTsKICNpZmRlZiBTVEFUUwotCQkJCVBvcnRQLT5TdGF0Lk1vZGVtT25DbnQrKzsKKwkJCQkJCQlQb3J0UC0+U3RhdC5Nb2RlbU9uQ250Kys7CiAjZW5kaWYKLQkJCX0KKwkJCQkJCX0KIAkJCQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkqKiBIYXMgY2FycmllciBqdXN0IGRyb3BwZWQ/Ci0JCQkqLworCQkJCQkJLyoKKwkJCQkJCSAqKiBIYXMgY2FycmllciBqdXN0IGRyb3BwZWQ/CisJCQkJCQkgKi8KIAkJCQkJCWlmIChQb3J0UC0+U3RhdGUgJiBSSU9fQ0FSUl9PTikgewotCQkJCQkJCWlmIChQb3J0UC0+U3RhdGUgJiAoUE9SVF9JU09QRU58UklPX1dPUEVOfFJJT19NT1BFTikpCi0JCQkJCQkJCXR0eV9oYW5ndXAgKFBvcnRQLT5ncy50dHkpOworCQkJCQkJCWlmIChQb3J0UC0+U3RhdGUgJiAoUE9SVF9JU09QRU4gfCBSSU9fV09QRU4gfCBSSU9fTU9QRU4pKQorCQkJCQkJCQl0dHlfaGFuZ3VwKFBvcnRQLT5ncy50dHkpOwogCQkJCQkJCVBvcnRQLT5TdGF0ZSAmPSB+UklPX0NBUlJfT047Ci0JCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJDYXJyaXJlciBqdXN0IHdlbnQgZG93blxuIik7CisJCQkJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NNRCwgIkNhcnJpcmVyIGp1c3Qgd2VudCBkb3duXG4iKTsKICNpZmRlZiBTVEFUUwotCQkJCVBvcnRQLT5TdGF0Lk1vZGVtT2ZmQ250Kys7CisJCQkJCQkJUG9ydFAtPlN0YXQuTW9kZW1PZmZDbnQrKzsKICNlbmRpZgorCQkJCQkJfQorCQkJCQl9CisJCQkJfQogCQkJfQotCQkJfQotCQl9Ci0JCX0KICNlbmRpZgotCQkJfQotCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CiAKLQkJZGVmYXVsdDoKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiVW5rbm93biBjb21tYW5kICVkIG9uIENNRF9SVVAgb2YgaG9zdCAlZFxuIiwKLQkJCSAgICAgUkJZVEUoUGt0Q21kUC0+Q29tbWFuZCksSG9zdFAtcC0+UklPSG9zdHMpOwotCQkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NNRCwgIlVua25vd24gY29tbWFuZCAlZCBvbiBDTURfUlVQIG9mIGhvc3QgJWRcbiIsIFJCWVRFKFBrdENtZFAtPkNvbW1hbmQpLCBIb3N0UCAtIHAtPlJJT0hvc3RzKTsKKwkJYnJlYWs7CiAJfQogCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwogCi0JZnVuY19leGl0ICgpOworCWZ1bmNfZXhpdCgpOwogCiAJcmV0dXJuIFRSVUU7CiB9CisKIC8qCiAqKiBUaGUgY29tbWFuZCBtZWNoYW5pc206CiAqKglFYWNoIHJ1cCBoYXMgYSBjaGFpbiBvZiBjb21tYW5kcyBhc3NvY2lhdGVkIHdpdGggaXQuCkBAIC02MDAsMTIgKzU2MiwxMSBAQAogLyoKICoqIEFsbG9jYXRlIGFuIGVtcHR5IGNvbW1hbmQgYmxvY2suCiAqLwotc3RydWN0IENtZEJsayAqCi1SSU9HZXRDbWRCbGsodm9pZCkKK3N0cnVjdCBDbWRCbGsgKlJJT0dldENtZEJsayh2b2lkKQogewogCXN0cnVjdCBDbWRCbGsgKkNtZEJsa1A7CiAKLQlDbWRCbGtQID0gKHN0cnVjdCBDbWRCbGsgKilzeXNicmsoc2l6ZW9mKHN0cnVjdCBDbWRCbGspKTsKKwlDbWRCbGtQID0gKHN0cnVjdCBDbWRCbGsgKikgc3lzYnJrKHNpemVvZihzdHJ1Y3QgQ21kQmxrKSk7CiAJaWYgKENtZEJsa1ApCiAJCWJ6ZXJvKENtZEJsa1AsIHNpemVvZihzdHJ1Y3QgQ21kQmxrKSk7CiAKQEAgLTYxNSwzMSArNTc2LDI0IEBACiAvKgogKiogUmV0dXJuIGEgYmxvY2sgdG8gdGhlIGhlYWQgb2YgdGhlIGZyZWUgbGlzdC4KICovCi12b2lkCi1SSU9GcmVlQ21kQmxrKHN0cnVjdCBDbWRCbGsgKkNtZEJsa1ApCit2b2lkIFJJT0ZyZWVDbWRCbGsoc3RydWN0IENtZEJsayAqQ21kQmxrUCkKIHsKLQlzeXNmcmVlKCh2b2lkICopQ21kQmxrUCwgc2l6ZW9mKHN0cnVjdCBDbWRCbGspKTsKKwlzeXNmcmVlKCh2b2lkICopIENtZEJsa1AsIHNpemVvZihzdHJ1Y3QgQ21kQmxrKSk7CiB9CiAKIC8qCiAqKiBhdHRhY2ggYSBjb21tYW5kIGJsb2NrIHRvIHRoZSBsaXN0IG9mIGNvbW1hbmRzIHRvIGJlIHBlcmZvcm1lZCBmb3IKICoqIGEgZ2l2ZW4gcnVwLgogKi8KLWludAotUklPUXVldWVDbWRCbGsoc3RydWN0IEhvc3QgKkhvc3RQLCB1aW50IFJ1cCwgc3RydWN0IENtZEJsayAqQ21kQmxrUCkKK2ludCBSSU9RdWV1ZUNtZEJsayhzdHJ1Y3QgSG9zdCAqSG9zdFAsIHVpbnQgUnVwLCBzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQKQogewogCXN0cnVjdCBDbWRCbGsgKipCYXNlOwogCXN0cnVjdCBVbml4UnVwICpVbml4UnVwUDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0jaWZkZWYgQ0hFQ0sKLQlDaGVja0hvc3RQKCBIb3N0UCApOwotCUNoZWNrUnVwKCBSdXAgKTsKLQlDaGVja0NtZEJsa1AoIENtZEJsa1AgKTsKLSNlbmRpZgotCWlmICggUnVwID49ICh1c2hvcnQpKE1BWF9SVVArTElOS1NfUEVSX1VOSVQpICkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIklsbGVnYWwgcnVwIG51bWJlciAlZCBpbiBSSU9RdWV1ZUNtZEJsa1xuIixSdXApOwotCQlSSU9GcmVlQ21kQmxrKCBDbWRCbGtQICk7CisJaWYgKFJ1cCA+PSAodXNob3J0KSAoTUFYX1JVUCArIExJTktTX1BFUl9VTklUKSkgeworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiSWxsZWdhbCBydXAgbnVtYmVyICVkIGluIFJJT1F1ZXVlQ21kQmxrXG4iLCBSdXApOworCQlSSU9GcmVlQ21kQmxrKENtZEJsa1ApOwogCQlyZXR1cm4gUklPX0ZBSUw7CiAJfQogCkBAIC02NDgsNTcgKzYwMiw1MiBAQAogCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzKTsKIAogCS8qCi0JKiogSWYgdGhlIFJVUCBpcyBjdXJyZW50bHkgaW5hY3RpdmUsIHRoZW4gcHV0IHRoZSByZXF1ZXN0Ci0JKiogc3RyYWlnaHQgb24gdGhlIFJVUC4uLi4KLQkqLwotCWlmICggKFVuaXhSdXBQLT5DbWRzV2FpdGluZ1AgPT0gTlVMTCkgJiYgKFVuaXhSdXBQLT5DbWRQZW5kaW5nUCA9PSBOVUxMKSAmJiAKLQkgICAgIChSV09SRChVbml4UnVwUC0+UnVwUC0+dHhjb250cm9sKSA9PSBUWF9SVVBfSU5BQ1RJVkUgKSAmJgotCQkoQ21kQmxrUC0+UHJlRnVuY1AgPyAoKkNtZEJsa1AtPlByZUZ1bmNQKShDbWRCbGtQLT5QcmVBcmcsQ21kQmxrUCkKLQkJCQkJCQk6VFJVRSkpIHsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJSVVAgaW5hY3RpdmUtcGxhY2luZyBjb21tYW5kIHN0cmFpZ2h0IG9uLiBDbWQgYnl0ZSBpcyAweCV4XG4iLAotCQkJCQkgICAgIENtZEJsa1AtPlBhY2tldC5kYXRhWzBdKTsKKwkgKiogSWYgdGhlIFJVUCBpcyBjdXJyZW50bHkgaW5hY3RpdmUsIHRoZW4gcHV0IHRoZSByZXF1ZXN0CisJICoqIHN0cmFpZ2h0IG9uIHRoZSBSVVAuLi4uCisJICovCisJaWYgKChVbml4UnVwUC0+Q21kc1dhaXRpbmdQID09IE5VTEwpICYmIChVbml4UnVwUC0+Q21kUGVuZGluZ1AgPT0gTlVMTCkgJiYgKFJXT1JEKFVuaXhSdXBQLT5SdXBQLT50eGNvbnRyb2wpID09IFRYX1JVUF9JTkFDVElWRSkgJiYgKENtZEJsa1AtPlByZUZ1bmNQID8gKCpDbWRCbGtQLT5QcmVGdW5jUCkgKENtZEJsa1AtPlByZUFyZywgQ21kQmxrUCkKKwkJCQkJCQkJCQkJCQkJCQkJICAgICA6IFRSVUUpKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJSVVAgaW5hY3RpdmUtcGxhY2luZyBjb21tYW5kIHN0cmFpZ2h0IG9uLiBDbWQgYnl0ZSBpcyAweCV4XG4iLCBDbWRCbGtQLT5QYWNrZXQuZGF0YVswXSk7CiAKIAkJLyoKLQkJKiogV2hhbW15ISBibGF0IHRoYXQgcGFjayEKLQkJKi8KLQkJSG9zdFAtPkNvcHkoIChjYWRkcl90KSZDbWRCbGtQLT5QYWNrZXQsIAotCQkJUklPX1BUUihIb3N0UC0+Q2FkZHIsIFVuaXhSdXBQLT5SdXBQLT50eHBrdCApLCBzaXplb2YoUEtUKSApOworCQkgKiogV2hhbW15ISBibGF0IHRoYXQgcGFjayEKKwkJICovCisJCUhvc3RQLT5Db3B5KChjYWRkcl90KSAmIENtZEJsa1AtPlBhY2tldCwgUklPX1BUUihIb3N0UC0+Q2FkZHIsIFVuaXhSdXBQLT5SdXBQLT50eHBrdCksIHNpemVvZihQS1QpKTsKIAogCQkvKgotCQkqKiBwbGFjZSBjb21tYW5kIHBhY2tldCBvbiB0aGUgcGVuZGluZyBwb3NpdGlvbi4KLQkJKi8KKwkJICoqIHBsYWNlIGNvbW1hbmQgcGFja2V0IG9uIHRoZSBwZW5kaW5nIHBvc2l0aW9uLgorCQkgKi8KIAkJVW5peFJ1cFAtPkNtZFBlbmRpbmdQID0gQ21kQmxrUDsKIAogCQkvKgotCQkqKiBzZXQgdGhlIGNvbW1hbmQgcmVnaXN0ZXIKLQkJKi8KLQkJV1dPUkQoVW5peFJ1cFAtPlJ1cFAtPnR4Y29udHJvbCAsIFRYX1BBQ0tFVF9SRUFEWSk7CisJCSAqKiBzZXQgdGhlIGNvbW1hbmQgcmVnaXN0ZXIKKwkJICovCisJCVdXT1JEKFVuaXhSdXBQLT5SdXBQLT50eGNvbnRyb2wsIFRYX1BBQ0tFVF9SRUFEWSk7CiAKIAkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlVuaXhSdXBQLT5SdXBMb2NrLCBmbGFncyk7CiAKIAkJcmV0dXJuIFJJT19TVUNDRVNTOwogCX0KLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlJVUCBhY3RpdmUgLSBlbi1xdWVpbmdcbiIpOworCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJSVVAgYWN0aXZlIC0gZW4tcXVlaW5nXG4iKTsKIAotCWlmICggVW5peFJ1cFAtPkNtZHNXYWl0aW5nUCAhPSBOVUxMKQotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlJ1cCBhY3RpdmUgLSBjb21tYW5kIHdhaXRpbmdcbiIpOwotCWlmICggVW5peFJ1cFAtPkNtZFBlbmRpbmdQICE9IE5VTEwgKQotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlJ1cCBhY3RpdmUgLSBjb21tYW5kIHBlbmRpbmdcbiIpOwotCWlmICggUldPUkQoVW5peFJ1cFAtPlJ1cFAtPnR4Y29udHJvbCkgIT0gVFhfUlVQX0lOQUNUSVZFICkKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJSdXAgYWN0aXZlIC0gY29tbWFuZCBydXAgbm90IHJlYWR5XG4iKTsKKwlpZiAoVW5peFJ1cFAtPkNtZHNXYWl0aW5nUCAhPSBOVUxMKQorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiUnVwIGFjdGl2ZSAtIGNvbW1hbmQgd2FpdGluZ1xuIik7CisJaWYgKFVuaXhSdXBQLT5DbWRQZW5kaW5nUCAhPSBOVUxMKQorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiUnVwIGFjdGl2ZSAtIGNvbW1hbmQgcGVuZGluZ1xuIik7CisJaWYgKFJXT1JEKFVuaXhSdXBQLT5SdXBQLT50eGNvbnRyb2wpICE9IFRYX1JVUF9JTkFDVElWRSkKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NNRCwgIlJ1cCBhY3RpdmUgLSBjb21tYW5kIHJ1cCBub3QgcmVhZHlcbiIpOwogCiAJQmFzZSA9ICZVbml4UnVwUC0+Q21kc1dhaXRpbmdQOwogCi0JcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJGaXJzdCB0cnkgdG8gcXVldWUgY21kYmxrIDB4JXggYXQgMHgleFxuIiwgKGludClDbWRCbGtQLChpbnQpQmFzZSk7CisJcmlvX2RwcmludGsoUklPX0RFQlVHX0NNRCwgIkZpcnN0IHRyeSB0byBxdWV1ZSBjbWRibGsgMHgleCBhdCAweCV4XG4iLCAoaW50KSBDbWRCbGtQLCAoaW50KSBCYXNlKTsKIAotCXdoaWxlICggKkJhc2UgKSB7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiQ29tbWFuZCBjbWRibGsgMHgleCBoZXJlXG4iLCAoaW50KSgqQmFzZSkpOworCXdoaWxlICgqQmFzZSkgeworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiQ29tbWFuZCBjbWRibGsgMHgleCBoZXJlXG4iLCAoaW50KSAoKkJhc2UpKTsKIAkJQmFzZSA9ICYoKCpCYXNlKS0+TmV4dFApOwotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIk5vdyB0cnkgdG8gcXVldWUgY21kIGNtZGJsayAweCV4IGF0IDB4JXhcbiIsCi0JCQkJCSAgICAgKGludClDbWRCbGtQLChpbnQpQmFzZSk7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJOb3cgdHJ5IHRvIHF1ZXVlIGNtZCBjbWRibGsgMHgleCBhdCAweCV4XG4iLCAoaW50KSBDbWRCbGtQLCAoaW50KSBCYXNlKTsKIAl9CiAKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIldpbGwgcXVldWUgY21kYmxrIDB4JXggYXQgMHgleFxuIiwoaW50KUNtZEJsa1AsKGludClCYXNlKTsKKwlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiV2lsbCBxdWV1ZSBjbWRibGsgMHgleCBhdCAweCV4XG4iLCAoaW50KSBDbWRCbGtQLCAoaW50KSBCYXNlKTsKIAogCSpCYXNlID0gQ21kQmxrUDsKIApAQCAtNzEzLDggKzY2Miw3IEBACiAqKiBIZXJlIHdlIGdvIC0gaWYgdGhlcmUgaXMgYW4gZW1wdHkgcnVwLCBmaWxsIGl0IQogKiogbXVzdCBiZSBjYWxsZWQgYXQgc3BscmlvKCkgb3IgaGlnaGVyLgogKi8KLXZvaWQKLVJJT1BvbGxIb3N0Q29tbWFuZHMoc3RydWN0IHJpb19pbmZvICpwLCBzdHJ1Y3QgSG9zdCAqSG9zdFApCit2b2lkIFJJT1BvbGxIb3N0Q29tbWFuZHMoc3RydWN0IHJpb19pbmZvICpwLCBzdHJ1Y3QgSG9zdCAqSG9zdFApCiB7CiAJcmVnaXN0ZXIgc3RydWN0IENtZEJsayAqQ21kQmxrUDsKIAlyZWdpc3RlciBzdHJ1Y3QgVW5peFJ1cCAqVW5peFJ1cFA7CkBAIC03MjMsMjYyICs2NzEsMjM0IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCi0JUnVwID0gTUFYX1JVUCtMSU5LU19QRVJfVU5JVDsKKwlSdXAgPSBNQVhfUlVQICsgTElOS1NfUEVSX1VOSVQ7CiAKLQlkbyB7CS8qIGRvIHRoaXMgbG9vcCBmb3IgZWFjaCBSVVAgKi8KKwlkbyB7CQkJLyogZG8gdGhpcyBsb29wIGZvciBlYWNoIFJVUCAqLwogCQkvKgotCQkqKiBsb2NhdGUgdGhlIHJ1cCB3ZSBhcmUgcHJvY2Vzc2luZyAmIGxvY2sgaXQKLQkJKi8KKwkJICoqIGxvY2F0ZSB0aGUgcnVwIHdlIGFyZSBwcm9jZXNzaW5nICYgbG9jayBpdAorCQkgKi8KIAkJVW5peFJ1cFAgPSAmSG9zdFAtPlVuaXhSdXBzWy0tUnVwXTsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzKTsKIAogCQkvKgotCQkqKiBGaXJzdCBjaGVjayBmb3IgaW5jb21pbmcgY29tbWFuZHM6Ci0JCSovCi0JCWlmICggUldPUkQoVW5peFJ1cFAtPlJ1cFAtPnJ4Y29udHJvbCkgIT0gUlhfUlVQX0lOQUNUSVZFICkgeworCQkgKiogRmlyc3QgY2hlY2sgZm9yIGluY29taW5nIGNvbW1hbmRzOgorCQkgKi8KKwkJaWYgKFJXT1JEKFVuaXhSdXBQLT5SdXBQLT5yeGNvbnRyb2wpICE9IFJYX1JVUF9JTkFDVElWRSkgewogCQkJaW50IEZyZWVNZTsKIAotCQkJUGFja2V0UCA9KFBLVCAqKVJJT19QVFIoSG9zdFAtPkNhZGRyLFJXT1JEKFVuaXhSdXBQLT5SdXBQLT5yeHBrdCkpOworCQkJUGFja2V0UCA9IChQS1QgKikgUklPX1BUUihIb3N0UC0+Q2FkZHIsIFJXT1JEKFVuaXhSdXBQLT5SdXBQLT5yeHBrdCkpOwogCi0JCQlTaG93UGFja2V0KCBEQkdfQ01ELCBQYWNrZXRQICk7CisJCQlTaG93UGFja2V0KERCR19DTUQsIFBhY2tldFApOwogCi0JCQlzd2l0Y2ggKCBSQllURShQYWNrZXRQLT5kZXN0X3BvcnQpICkgewotCQkJCWNhc2UgQk9PVF9SVVA6Ci0JCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiSW5jb21pbmcgQm9vdCAlcyBwYWNrZXQgJyV4J1xuIiwgCi0JCQkJCQlSQllURShQYWNrZXRQLT5sZW4pICYgMHg4MCA/ICJDb21tYW5kIjoiRGF0YSIsIAotCQkJCQkJCSAgICAgUkJZVEUoUGFja2V0UC0+ZGF0YVswXSkpOyAKLQkJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlVuaXhSdXBQLT5SdXBMb2NrLCBmbGFncyk7Ci0JCQkJCUZyZWVNZT0gUklPQm9vdFJ1cChwLCBSdXAsSG9zdFAsUGFja2V0UCk7Ci0JCQkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzKTsKLQkJCQkJYnJlYWs7CisJCQlzd2l0Y2ggKFJCWVRFKFBhY2tldFAtPmRlc3RfcG9ydCkpIHsKKwkJCWNhc2UgQk9PVF9SVVA6CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NNRCwgIkluY29taW5nIEJvb3QgJXMgcGFja2V0ICcleCdcbiIsIFJCWVRFKFBhY2tldFAtPmxlbikgJiAweDgwID8gIkNvbW1hbmQiIDogIkRhdGEiLCBSQllURShQYWNrZXRQLT5kYXRhWzBdKSk7CisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlVuaXhSdXBQLT5SdXBMb2NrLCBmbGFncyk7CisJCQkJRnJlZU1lID0gUklPQm9vdFJ1cChwLCBSdXAsIEhvc3RQLCBQYWNrZXRQKTsKKwkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlVuaXhSdXBQLT5SdXBMb2NrLCBmbGFncyk7CisJCQkJYnJlYWs7CiAKLQkJCQljYXNlIENPTU1BTkRfUlVQOgotCQkJCQkvKgotCQkJCQkqKiBGcmVlIHRoZSBSVVAgbG9jayBhcyBsb3NzIG9mIGNhcnJpZXIgY2F1c2VzIGEKLQkJCQkJKiogdHR5Zmx1c2ggd2hpY2ggd2lsbCAoZXZlbnR1YWxseSkgY2FsbCBhbm90aGVyCi0JCQkJCSoqIHJvdXRpbmUgdGhhdCB1c2VzIHRoZSBSVVAgbG9jay4KLQkJCQkJKi8KLQkJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlVuaXhSdXBQLT5SdXBMb2NrLCBmbGFncyk7Ci0JCQkJCUZyZWVNZT0gUklPQ29tbWFuZFJ1cChwLCBSdXAsSG9zdFAsUGFja2V0UCk7Ci0JCQkJCWlmIChQYWNrZXRQLT5kYXRhWzVdID09IE1FTURVTVApIHsKLQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiTWVtZHVtcCBmcm9tIDB4JXggY29tcGxldGVcbiIsCi0JCQkJCQkJCSAgICAgKih1c2hvcnQgKikgJihQYWNrZXRQLT5kYXRhWzZdKSk7Ci0JCQkJCQlIb3N0UC0+Q29weSggKGNhZGRyX3QpJihQYWNrZXRQLT5kYXRhWzhdKSwgCi0JCQkJCQkJCShjYWRkcl90KXAtPlJJT01lbUR1bXAsIDMyICk7Ci0JCQkJCX0KLQkJCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZVbml4UnVwUC0+UnVwTG9jaywgZmxhZ3MpOwotCQkJCQlicmVhazsKKwkJCWNhc2UgQ09NTUFORF9SVVA6CisJCQkJLyoKKwkJCQkgKiogRnJlZSB0aGUgUlVQIGxvY2sgYXMgbG9zcyBvZiBjYXJyaWVyIGNhdXNlcyBhCisJCQkJICoqIHR0eWZsdXNoIHdoaWNoIHdpbGwgKGV2ZW50dWFsbHkpIGNhbGwgYW5vdGhlcgorCQkJCSAqKiByb3V0aW5lIHRoYXQgdXNlcyB0aGUgUlVQIGxvY2suCisJCQkJICovCisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlVuaXhSdXBQLT5SdXBMb2NrLCBmbGFncyk7CisJCQkJRnJlZU1lID0gUklPQ29tbWFuZFJ1cChwLCBSdXAsIEhvc3RQLCBQYWNrZXRQKTsKKwkJCQlpZiAoUGFja2V0UC0+ZGF0YVs1XSA9PSBNRU1EVU1QKSB7CisJCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJNZW1kdW1wIGZyb20gMHgleCBjb21wbGV0ZVxuIiwgKih1c2hvcnQgKikgJiAoUGFja2V0UC0+ZGF0YVs2XSkpOworCQkJCQlIb3N0UC0+Q29weSgoY2FkZHJfdCkgJiAoUGFja2V0UC0+ZGF0YVs4XSksIChjYWRkcl90KSBwLT5SSU9NZW1EdW1wLCAzMik7CisJCQkJfQorCQkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzKTsKKwkJCQlicmVhazsKIAotCQkJCWNhc2UgUk9VVEVfUlVQOgotCQkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlVuaXhSdXBQLT5SdXBMb2NrLCBmbGFncyk7Ci0JCQkJCUZyZWVNZSA9IFJJT1JvdXRlUnVwKHAsIFJ1cCwgSG9zdFAsIFBhY2tldFAgKTsKLQkJCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCAmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzICk7Ci0JCQkJCWJyZWFrOworCQkJY2FzZSBST1VURV9SVVA6CisJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlVuaXhSdXBQLT5SdXBMb2NrLCBmbGFncyk7CisJCQkJRnJlZU1lID0gUklPUm91dGVSdXAocCwgUnVwLCBIb3N0UCwgUGFja2V0UCk7CisJCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZVbml4UnVwUC0+UnVwTG9jaywgZmxhZ3MpOworCQkJCWJyZWFrOwogCi0JCQkJZGVmYXVsdDoKLQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJVbmtub3duIFJVUCAlZFxuIiwgUkJZVEUoUGFja2V0UC0+ZGVzdF9wb3J0KSk7Ci0JCQkJCUZyZWVNZSA9IDE7Ci0JCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiVW5rbm93biBSVVAgJWRcbiIsIFJCWVRFKFBhY2tldFAtPmRlc3RfcG9ydCkpOworCQkJCUZyZWVNZSA9IDE7CisJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCWlmICggRnJlZU1lICkgewotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiRnJlZSBwcm9jZXNzZWQgaW5jb21pbmcgY29tbWFuZCBwYWNrZXRcbiIpOwotCQkJCXB1dF9mcmVlX2VuZChIb3N0UCxQYWNrZXRQKTsKKwkJCWlmIChGcmVlTWUpIHsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiRnJlZSBwcm9jZXNzZWQgaW5jb21pbmcgY29tbWFuZCBwYWNrZXRcbiIpOworCQkJCXB1dF9mcmVlX2VuZChIb3N0UCwgUGFja2V0UCk7CiAKLQkJCQlXV09SRChVbml4UnVwUC0+UnVwUC0+cnhjb250cm9sICwgUlhfUlVQX0lOQUNUSVZFKTsKKwkJCQlXV09SRChVbml4UnVwUC0+UnVwUC0+cnhjb250cm9sLCBSWF9SVVBfSU5BQ1RJVkUpOwogCi0JCQkJaWYgKCBSV09SRChVbml4UnVwUC0+UnVwUC0+aGFuZHNoYWtlKT09UEhCX0hBTkRTSEFLRV9TRVQgKSB7Ci0JCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiSGFuZHNoYWtlIHJ1cCAlZFxuIixSdXApOwotCQkJCQlXV09SRChVbml4UnVwUC0+UnVwUC0+aGFuZHNoYWtlLAotCQkJCQkJUEhCX0hBTkRTSEFLRV9TRVR8UEhCX0hBTkRTSEFLRV9SRVNFVCk7CisJCQkJaWYgKFJXT1JEKFVuaXhSdXBQLT5SdXBQLT5oYW5kc2hha2UpID09IFBIQl9IQU5EU0hBS0VfU0VUKSB7CisJCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJIYW5kc2hha2UgcnVwICVkXG4iLCBSdXApOworCQkJCQlXV09SRChVbml4UnVwUC0+UnVwUC0+aGFuZHNoYWtlLCBQSEJfSEFORFNIQUtFX1NFVCB8IFBIQl9IQU5EU0hBS0VfUkVTRVQpOwogCQkJCX0KIAkJCX0KIAkJfQogCiAJCS8qCi0JCSoqIElGIGEgY29tbWFuZCB3YXMgcnVubmluZyBvbiB0aGUgcG9ydCwgCi0JCSoqIGFuZCBpdCBoYXMgY29tcGxldGVkLCB0aGVuIHRpZHkgaXQgdXAuCi0JCSovCi0JCWlmICggKENtZEJsa1AgPSBVbml4UnVwUC0+Q21kUGVuZGluZ1ApICYmIC8qIEFTU0lHTiEgKi8KLQkJICAgICAoUldPUkQoVW5peFJ1cFAtPlJ1cFAtPnR4Y29udHJvbCkgPT0gVFhfUlVQX0lOQUNUSVZFKSkgeworCQkgKiogSUYgYSBjb21tYW5kIHdhcyBydW5uaW5nIG9uIHRoZSBwb3J0LAorCQkgKiogYW5kIGl0IGhhcyBjb21wbGV0ZWQsIHRoZW4gdGlkeSBpdCB1cC4KKwkJICovCisJCWlmICgoQ21kQmxrUCA9IFVuaXhSdXBQLT5DbWRQZW5kaW5nUCkgJiYJLyogQVNTSUdOISAqLworCQkgICAgKFJXT1JEKFVuaXhSdXBQLT5SdXBQLT50eGNvbnRyb2wpID09IFRYX1JVUF9JTkFDVElWRSkpIHsKIAkJCS8qCi0JCQkqKiB3ZSBhcmUgaWRsZS4KLQkJCSoqIHRoZXJlIGlzIGEgY29tbWFuZCBpbiBwZW5kaW5nLgotCQkJKiogVGhlcmVmb3JlLCB0aGlzIGNvbW1hbmQgaGFzIGZpbmlzaGVkLgotCQkJKiogU28sIHdha2V1cCB3aG9ldmVyIGlzIHdhaXRpbmcgZm9yIGl0IChhbmQgdGVsbCB0aGVtCi0JCQkqKiB3aGF0IGhhcHBlbmVkKS4KLQkJCSovCi0JCQlpZiAoIENtZEJsa1AtPlBhY2tldC5kZXN0X3BvcnQgPT0gQk9PVF9SVVAgKQotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiRnJlZSBCb290ICVzIENvbW1hbmQgQmxvY2sgJyV4J1xuIiwgCi0JCQkJCQlDbWRCbGtQLT5QYWNrZXQubGVuICYgMHg4MCA/ICJDb21tYW5kIjoiRGF0YSIsIAotCQkJCQkJCSAgICAgQ21kQmxrUC0+UGFja2V0LmRhdGFbMF0pOworCQkJICoqIHdlIGFyZSBpZGxlLgorCQkJICoqIHRoZXJlIGlzIGEgY29tbWFuZCBpbiBwZW5kaW5nLgorCQkJICoqIFRoZXJlZm9yZSwgdGhpcyBjb21tYW5kIGhhcyBmaW5pc2hlZC4KKwkJCSAqKiBTbywgd2FrZXVwIHdob2V2ZXIgaXMgd2FpdGluZyBmb3IgaXQgKGFuZCB0ZWxsIHRoZW0KKwkJCSAqKiB3aGF0IGhhcHBlbmVkKS4KKwkJCSAqLworCQkJaWYgKENtZEJsa1AtPlBhY2tldC5kZXN0X3BvcnQgPT0gQk9PVF9SVVApCisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NNRCwgIkZyZWUgQm9vdCAlcyBDb21tYW5kIEJsb2NrICcleCdcbiIsIENtZEJsa1AtPlBhY2tldC5sZW4gJiAweDgwID8gIkNvbW1hbmQiIDogIkRhdGEiLCBDbWRCbGtQLT5QYWNrZXQuZGF0YVswXSk7CiAKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiQ29tbWFuZCAweCV4IGNvbXBsZXRlZFxuIiwoaW50KUNtZEJsa1ApOworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NNRCwgIkNvbW1hbmQgMHgleCBjb21wbGV0ZWRcbiIsIChpbnQpIENtZEJsa1ApOwogCiAJCQkvKgotCQkJKiogQ2xlYXIgdGhlIFJ1cCBsb2NrIHRvIHByZXZlbnQgbXV0dWFsIGV4Y2x1c2lvbi4KLQkJCSovCi0JCQlpZiAoIENtZEJsa1AtPlBvc3RGdW5jUCApIHsKKwkJCSAqKiBDbGVhciB0aGUgUnVwIGxvY2sgdG8gcHJldmVudCBtdXR1YWwgZXhjbHVzaW9uLgorCQkJICovCisJCQlpZiAoQ21kQmxrUC0+UG9zdEZ1bmNQKSB7CiAJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlVuaXhSdXBQLT5SdXBMb2NrLCBmbGFncyk7Ci0JCQkJKCpDbWRCbGtQLT5Qb3N0RnVuY1ApIChDbWRCbGtQLT5Qb3N0QXJnLENtZEJsa1ApOworCQkJCSgqQ21kQmxrUC0+UG9zdEZ1bmNQKSAoQ21kQmxrUC0+UG9zdEFyZywgQ21kQmxrUCk7CiAJCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZVbml4UnVwUC0+UnVwTG9jaywgZmxhZ3MpOwogCQkJfQogCiAJCQkvKgotCQkJKiogLi4uLmNsZWFyIHRoZSBwZW5kaW5nIGZsYWcuLi4uCi0JCQkqLworCQkJICoqIC4uLi5jbGVhciB0aGUgcGVuZGluZyBmbGFnLi4uLgorCQkJICovCiAJCQlVbml4UnVwUC0+Q21kUGVuZGluZ1AgPSBOVUxMOwogCiAJCQkvKgotCQkJKiogLi4uLmFuZCByZXR1cm4gdGhlIGNvbW1hbmQgYmxvY2sgdG8gdGhlIGZyZWVsaXN0LgotCQkJKi8KLQkJCVJJT0ZyZWVDbWRCbGsoIENtZEJsa1AgKTsKKwkJCSAqKiAuLi4uYW5kIHJldHVybiB0aGUgY29tbWFuZCBibG9jayB0byB0aGUgZnJlZWxpc3QuCisJCQkgKi8KKwkJCVJJT0ZyZWVDbWRCbGsoQ21kQmxrUCk7CiAJCX0KIAogCQkvKgotCQkqKiBJZiB0aGVyZSBpcyBhIGNvbW1hbmQgZm9yIHRoaXMgcnVwLCBhbmQgdGhlIHJ1cAotCQkqKiBpcyBpZGxlLCB0aGVuIHByb2Nlc3MgdGhlIGNvbW1hbmQKLQkJKi8KLQkJaWYgKCAoQ21kQmxrUCA9IFVuaXhSdXBQLT5DbWRzV2FpdGluZ1ApICYmIC8qIEFTU0lHTiEgKi8KLQkJCShVbml4UnVwUC0+Q21kUGVuZGluZ1AgPT0gTlVMTCkgJiYKLQkJICAgICAoUldPUkQoVW5peFJ1cFAtPlJ1cFAtPnR4Y29udHJvbCkgPT0gVFhfUlVQX0lOQUNUSVZFKSkgeworCQkgKiogSWYgdGhlcmUgaXMgYSBjb21tYW5kIGZvciB0aGlzIHJ1cCwgYW5kIHRoZSBydXAKKwkJICoqIGlzIGlkbGUsIHRoZW4gcHJvY2VzcyB0aGUgY29tbWFuZAorCQkgKi8KKwkJaWYgKChDbWRCbGtQID0gVW5peFJ1cFAtPkNtZHNXYWl0aW5nUCkgJiYJLyogQVNTSUdOISAqLworCQkgICAgKFVuaXhSdXBQLT5DbWRQZW5kaW5nUCA9PSBOVUxMKSAmJiAoUldPUkQoVW5peFJ1cFAtPlJ1cFAtPnR4Y29udHJvbCkgPT0gVFhfUlVQX0lOQUNUSVZFKSkgewogCQkJLyoKLQkJCSoqIGlmIHRoZSBwcmUtZnVuY3Rpb24gaXMgbm9uLXplcm8sIGNhbGwgaXQuCi0JCQkqKiBJZiBpdCByZXR1cm5zIFJJT19GQUlMIHRoZW4gZG9uJ3QKLQkJCSoqIHNlbmQgdGhpcyBjb21tYW5kIHlldCEKLQkJCSovCi0jaWZkZWYgQ0hFQ0sKLQkJCUNoZWNrQ21kQmxrUCAoQ21kQmxrUCk7Ci0jZW5kaWYKLQkJCWlmICggIShDbWRCbGtQLT5QcmVGdW5jUCA/Ci0JCQkJKCpDbWRCbGtQLT5QcmVGdW5jUCkoQ21kQmxrUC0+UHJlQXJnLCBDbWRCbGtQKSA6IFRSVUUpKSB7Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJOb3QgcmVhZHkgdG8gc3RhcnQgY29tbWFuZCAweCV4XG4iLChpbnQpQ21kQmxrUCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlN0YXJ0IG5ldyBjb21tYW5kIDB4JXggQ21kIGJ5dGUgaXMgMHgleFxuIiwKLQkJCQkJCQkgICAgIChpbnQpQ21kQmxrUCwgQ21kQmxrUC0+UGFja2V0LmRhdGFbMF0pOworCQkJICoqIGlmIHRoZSBwcmUtZnVuY3Rpb24gaXMgbm9uLXplcm8sIGNhbGwgaXQuCisJCQkgKiogSWYgaXQgcmV0dXJucyBSSU9fRkFJTCB0aGVuIGRvbid0CisJCQkgKiogc2VuZCB0aGlzIGNvbW1hbmQgeWV0IQorCQkJICovCisJCQlpZiAoIShDbWRCbGtQLT5QcmVGdW5jUCA/ICgqQ21kQmxrUC0+UHJlRnVuY1ApIChDbWRCbGtQLT5QcmVBcmcsIENtZEJsa1ApIDogVFJVRSkpIHsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiTm90IHJlYWR5IHRvIHN0YXJ0IGNvbW1hbmQgMHgleFxuIiwgKGludCkgQ21kQmxrUCk7CisJCQl9IGVsc2UgeworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJTdGFydCBuZXcgY29tbWFuZCAweCV4IENtZCBieXRlIGlzIDB4JXhcbiIsIChpbnQpIENtZEJsa1AsIENtZEJsa1AtPlBhY2tldC5kYXRhWzBdKTsKIAkJCQkvKgotCQkJCSoqIFdoYW1teSEgYmxhdCB0aGF0IHBhY2shCi0JCQkJKi8KLSNpZmRlZiBDSEVDSwotCQkJCUNoZWNrUGFja2V0UCAoKFBLVCAqKVJJT19QVFIoSG9zdFAtPkNhZGRyLCBVbml4UnVwUC0+UnVwUC0+dHhwa3QpKTsKLSNlbmRpZgotCQkJCUhvc3RQLT5Db3B5KCAoY2FkZHJfdCkmQ21kQmxrUC0+UGFja2V0LCAKLQkJCQkJUklPX1BUUihIb3N0UC0+Q2FkZHIsIFVuaXhSdXBQLT5SdXBQLT50eHBrdCksIHNpemVvZihQS1QpKTsKKwkJCQkgKiogV2hhbW15ISBibGF0IHRoYXQgcGFjayEKKwkJCQkgKi8KKwkJCQlIb3N0UC0+Q29weSgoY2FkZHJfdCkgJiBDbWRCbGtQLT5QYWNrZXQsIFJJT19QVFIoSG9zdFAtPkNhZGRyLCBVbml4UnVwUC0+UnVwUC0+dHhwa3QpLCBzaXplb2YoUEtUKSk7CiAKIAkJCQkvKgotCQkJCSoqIHJlbW92ZSB0aGUgY29tbWFuZCBmcm9tIHRoZSBydXAgY29tbWFuZCBxdWV1ZS4uLgotCQkJCSovCisJCQkJICoqIHJlbW92ZSB0aGUgY29tbWFuZCBmcm9tIHRoZSBydXAgY29tbWFuZCBxdWV1ZS4uLgorCQkJCSAqLwogCQkJCVVuaXhSdXBQLT5DbWRzV2FpdGluZ1AgPSBDbWRCbGtQLT5OZXh0UDsKIAogCQkJCS8qCi0JCQkJKiogLi4uYW5kIHBsYWNlIGl0IG9uIHRoZSBwZW5kaW5nIHBvc2l0aW9uLgotCQkJCSovCisJCQkJICoqIC4uLmFuZCBwbGFjZSBpdCBvbiB0aGUgcGVuZGluZyBwb3NpdGlvbi4KKwkJCQkgKi8KIAkJCQlVbml4UnVwUC0+Q21kUGVuZGluZ1AgPSBDbWRCbGtQOwogCiAJCQkJLyoKLQkJCQkqKiBzZXQgdGhlIGNvbW1hbmQgcmVnaXN0ZXIKLQkJCQkqLwotCQkJCVdXT1JEKFVuaXhSdXBQLT5SdXBQLT50eGNvbnRyb2wsVFhfUEFDS0VUX1JFQURZKTsKKwkJCQkgKiogc2V0IHRoZSBjb21tYW5kIHJlZ2lzdGVyCisJCQkJICovCisJCQkJV1dPUkQoVW5peFJ1cFAtPlJ1cFAtPnR4Y29udHJvbCwgVFhfUEFDS0VUX1JFQURZKTsKIAogCQkJCS8qCi0JCQkJKiogdGhlIGNvbW1hbmQgYmxvY2sgd2lsbCBiZSBmcmVlZAotCQkJCSoqIHdoZW4gdGhlIGNvbW1hbmQgaGFzIGJlZW4gcHJvY2Vzc2VkLgotCQkJCSovCisJCQkJICoqIHRoZSBjb21tYW5kIGJsb2NrIHdpbGwgYmUgZnJlZWQKKwkJCQkgKiogd2hlbiB0aGUgY29tbWFuZCBoYXMgYmVlbiBwcm9jZXNzZWQuCisJCQkJICovCiAJCQl9CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVW5peFJ1cFAtPlJ1cExvY2ssIGZsYWdzKTsKLQl9IHdoaWxlICggUnVwICk7CisJfSB3aGlsZSAoUnVwKTsKIH0KIAotaW50Ci1SSU9XRmx1c2hNYXJrKGludCBpUG9ydFAsIHN0cnVjdCBDbWRCbGsgKkNtZEJsa1ApCitpbnQgUklPV0ZsdXNoTWFyayhpbnQgaVBvcnRQLCBzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQKQogewotCXN0cnVjdCBQb3J0ICoJUG9ydFAgPSAoc3RydWN0IFBvcnQgKilpUG9ydFA7CisJc3RydWN0IFBvcnQgKlBvcnRQID0gKHN0cnVjdCBQb3J0ICopIGlQb3J0UDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwotI2lmZGVmIENIRUNLCi0JQ2hlY2tQb3J0UCggUG9ydFAgKTsKLSNlbmRpZgogCVBvcnRQLT5XZmx1c2hGbGFnKys7CiAJUG9ydFAtPk1hZ2ljRmxhZ3MgfD0gTUFHSUNfRkxVU0g7CiAJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JcmV0dXJuIFJJT1VuVXNlKCBpUG9ydFAsIENtZEJsa1AgKTsKKwlyZXR1cm4gUklPVW5Vc2UoaVBvcnRQLCBDbWRCbGtQKTsKIH0KIAotaW50Ci1SSU9SRmx1c2hFbmFibGUoaW50IGlQb3J0UCwgc3RydWN0IENtZEJsayAqQ21kQmxrUCkKK2ludCBSSU9SRmx1c2hFbmFibGUoaW50IGlQb3J0UCwgc3RydWN0IENtZEJsayAqQ21kQmxrUCkKIHsKLQlzdHJ1Y3QgUG9ydCAqCVBvcnRQID0gKHN0cnVjdCBQb3J0ICopaVBvcnRQOworCXN0cnVjdCBQb3J0ICpQb3J0UCA9IChzdHJ1Y3QgUG9ydCAqKSBpUG9ydFA7CiAJUEtUICpQYWNrZXRQOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CiAKLQl3aGlsZSAoIGNhbl9yZW1vdmVfcmVjZWl2ZSgmUGFja2V0UCwgUG9ydFApICkgeworCXdoaWxlIChjYW5fcmVtb3ZlX3JlY2VpdmUoJlBhY2tldFAsIFBvcnRQKSkgewogCQlyZW1vdmVfcmVjZWl2ZShQb3J0UCk7Ci0JCVNob3dQYWNrZXQoREJHX1BST0MsIFBhY2tldFAgKTsKLQkJcHV0X2ZyZWVfZW5kKCBQb3J0UC0+SG9zdFAsIFBhY2tldFAgKTsKKwkJU2hvd1BhY2tldChEQkdfUFJPQywgUGFja2V0UCk7CisJCXB1dF9mcmVlX2VuZChQb3J0UC0+SG9zdFAsIFBhY2tldFApOwogCX0KIAotCWlmICggUldPUkQoUG9ydFAtPlBoYlAtPmhhbmRzaGFrZSk9PVBIQl9IQU5EU0hBS0VfU0VUICkgeworCWlmIChSV09SRChQb3J0UC0+UGhiUC0+aGFuZHNoYWtlKSA9PSBQSEJfSEFORFNIQUtFX1NFVCkgewogCQkvKgotCQkqKiBNQUdJQyEgKEJhc2ljYWxseSwgaGFuZHNoYWtlIHRoZSBSWCBidWZmZXIsIHNvIHRoYXQKLQkJKiogdGhlIFJUQXMgdXBzdHJlYW0gY2FuIGJlIHJlLWVuYWJsZWQuKQotCQkqLwotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NNRCwgIlV0aWw6IFNldCBSWCBoYW5kc2hha2UgYml0XG4iKTsKLQkJV1dPUkQoUG9ydFAtPlBoYlAtPmhhbmRzaGFrZSwgUEhCX0hBTkRTSEFLRV9TRVR8UEhCX0hBTkRTSEFLRV9SRVNFVCk7CisJCSAqKiBNQUdJQyEgKEJhc2ljYWxseSwgaGFuZHNoYWtlIHRoZSBSWCBidWZmZXIsIHNvIHRoYXQKKwkJICoqIHRoZSBSVEFzIHVwc3RyZWFtIGNhbiBiZSByZS1lbmFibGVkLikKKwkJICovCisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJVdGlsOiBTZXQgUlggaGFuZHNoYWtlIGJpdFxuIik7CisJCVdXT1JEKFBvcnRQLT5QaGJQLT5oYW5kc2hha2UsIFBIQl9IQU5EU0hBS0VfU0VUIHwgUEhCX0hBTkRTSEFLRV9SRVNFVCk7CiAJfQogCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwotCXJldHVybiBSSU9VblVzZSggaVBvcnRQLCBDbWRCbGtQICk7CisJcmV0dXJuIFJJT1VuVXNlKGlQb3J0UCwgQ21kQmxrUCk7CiB9CiAKLWludAotUklPVW5Vc2UoaW50IGlQb3J0UCwgc3RydWN0IENtZEJsayAqQ21kQmxrUCkKK2ludCBSSU9VblVzZShpbnQgaVBvcnRQLCBzdHJ1Y3QgQ21kQmxrICpDbWRCbGtQKQogewotCXN0cnVjdCBQb3J0ICoJUG9ydFAgPSAoc3RydWN0IFBvcnQgKilpUG9ydFA7CisJc3RydWN0IFBvcnQgKlBvcnRQID0gKHN0cnVjdCBQb3J0ICopIGlQb3J0UDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwogCi0jaWZkZWYgQ0hFQ0sKLQlDaGVja1BvcnRQKCBQb3J0UCApOwotI2VuZGlmCi0JcmlvX2RwcmludGsgKFJJT19ERUJVR19DTUQsICJEZWNyZW1lbnQgaW4gdXNlIGNvdW50IGZvciBwb3J0XG4iKTsKKwlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiRGVjcmVtZW50IGluIHVzZSBjb3VudCBmb3IgcG9ydFxuIik7CiAKIAlpZiAoUG9ydFAtPkluVXNlKSB7Ci0JCWlmICggLS1Qb3J0UC0+SW5Vc2UgIT0gTk9UX0lOVVNFICkgeworCQlpZiAoLS1Qb3J0UC0+SW5Vc2UgIT0gTk9UX0lOVVNFKSB7CiAJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQogCS8qCi0JKiogV2hpbGUgUG9ydFAtPkluVXNlIGlzIHNldCAoaS5lLiBhIHByZWVtcHRpdmUgY29tbWFuZCBoYXMgYmVlbiBzZW50IHRvCi0JKiogdGhlIFJUQSBhbmQgaXMgYXdhaXRpbmcgY29tcGxldGlvbiksIGFueSB0cmFuc21pdCBkYXRhIGlzIHByZXZlbnRlZCBmcm9tCi0JKiogYmVpbmcgdHJhbnNmZXJyZWQgZnJvbSB0aGUgd3JpdGUgcXVldWUgaW50byB0aGUgdHJhbnNtaXQgcGFja2V0cwotCSoqIChhZGRfdHJhbnNtaXQpIGFuZCBubyBmdXJ0aHVyIHRyYW5zbWl0IGludGVycnVwdCB3aWxsIGJlIHNlbnQgZm9yIHRoYXQKLQkqKiBkYXRhLiBUaGUgbmV4dCBpbnRlcnJ1cHQgd2lsbCBvY2N1ciB1cCB0byA1MDBtcyBsYXRlciAoUklPSW50ciBpcyBjYWxsZWQKLQkqKiB0d2ljZSBhIHNlY29uZCBhcyBhIHNhZnRleSBtZWFzdXJlKS4gVGhpcyB3YXMgdGhlIGNhc2Ugd2hlbiBrZXJtaXQgd2FzCi0JKiogdXNlZCB0byBzZW5kIGRhdGEgaW50byBhIFJJTyBwb3J0LiBBZnRlciBlYWNoIHBhY2tldCB3YXMgc2VudCwgVENGTFNICi0JKiogd2FzIGNhbGxlZCB0byBmbHVzaCB0aGUgcmVhZCBxdWV1ZSBwcmVlbXB0aXZlbHkuIFBvcnRQLT5JblVzZSB3YXMKLQkqKiBpbmNyZW1lbnRlZCwgdGhlcmVieSBibG9ja2luZyB0aGUgNiBieXRlIGFja25vd2xlZGdlbWVudCBwYWNrZXQKLQkqKiB0cmFuc21pdHRlZCBiYWNrLiBUaGlzIGFja25vd2xlZGdtZW50IGh1bmcgYXJvdW5kIGZvciA1MDBtcyBiZWZvcmUKLQkqKiBiZWluZyBzZW50LCB0aHVzIHJlZHVjaW5nIGlucHV0IHBlcmZvcm1hbmNlIHN1YnN0YW50aWFsbHkhLgotCSoqIFdoZW4gUG9ydFAtPkluVXNlIGJlY29tZXMgTk9UX0lOVVNFLCB3ZSBtdXN0IGVuc3VyZSB0aGF0IGFueSBkYXRhCi0JKiogaGFuZ2luZyBhcm91bmQgaW4gdGhlIHRyYW5zbWl0IGJ1ZmZlciBpcyBzZW50IGltbWVkaWF0ZWx5LgotCSovCisJICoqIFdoaWxlIFBvcnRQLT5JblVzZSBpcyBzZXQgKGkuZS4gYSBwcmVlbXB0aXZlIGNvbW1hbmQgaGFzIGJlZW4gc2VudCB0bworCSAqKiB0aGUgUlRBIGFuZCBpcyBhd2FpdGluZyBjb21wbGV0aW9uKSwgYW55IHRyYW5zbWl0IGRhdGEgaXMgcHJldmVudGVkIGZyb20KKwkgKiogYmVpbmcgdHJhbnNmZXJyZWQgZnJvbSB0aGUgd3JpdGUgcXVldWUgaW50byB0aGUgdHJhbnNtaXQgcGFja2V0cworCSAqKiAoYWRkX3RyYW5zbWl0KSBhbmQgbm8gZnVydGh1ciB0cmFuc21pdCBpbnRlcnJ1cHQgd2lsbCBiZSBzZW50IGZvciB0aGF0CisJICoqIGRhdGEuIFRoZSBuZXh0IGludGVycnVwdCB3aWxsIG9jY3VyIHVwIHRvIDUwMG1zIGxhdGVyIChSSU9JbnRyIGlzIGNhbGxlZAorCSAqKiB0d2ljZSBhIHNlY29uZCBhcyBhIHNhZnRleSBtZWFzdXJlKS4gVGhpcyB3YXMgdGhlIGNhc2Ugd2hlbiBrZXJtaXQgd2FzCisJICoqIHVzZWQgdG8gc2VuZCBkYXRhIGludG8gYSBSSU8gcG9ydC4gQWZ0ZXIgZWFjaCBwYWNrZXQgd2FzIHNlbnQsIFRDRkxTSAorCSAqKiB3YXMgY2FsbGVkIHRvIGZsdXNoIHRoZSByZWFkIHF1ZXVlIHByZWVtcHRpdmVseS4gUG9ydFAtPkluVXNlIHdhcworCSAqKiBpbmNyZW1lbnRlZCwgdGhlcmVieSBibG9ja2luZyB0aGUgNiBieXRlIGFja25vd2xlZGdlbWVudCBwYWNrZXQKKwkgKiogdHJhbnNtaXR0ZWQgYmFjay4gVGhpcyBhY2tub3dsZWRnbWVudCBodW5nIGFyb3VuZCBmb3IgNTAwbXMgYmVmb3JlCisJICoqIGJlaW5nIHNlbnQsIHRodXMgcmVkdWNpbmcgaW5wdXQgcGVyZm9ybWFuY2Ugc3Vic3RhbnRpYWxseSEuCisJICoqIFdoZW4gUG9ydFAtPkluVXNlIGJlY29tZXMgTk9UX0lOVVNFLCB3ZSBtdXN0IGVuc3VyZSB0aGF0IGFueSBkYXRhCisJICoqIGhhbmdpbmcgYXJvdW5kIGluIHRoZSB0cmFuc21pdCBidWZmZXIgaXMgc2VudCBpbW1lZGlhdGVseS4KKwkgKi8KIAlXV09SRChQb3J0UC0+SG9zdFAtPlBhcm1NYXBQLT50eF9pbnRyLCAxKTsKIAkvKiBXaGF0IHRvIGRvIGhlcmUgLi4KLQl3YWtldXAoIChjYWRkcl90KSYoUG9ydFAtPkluVXNlKSApOwotCSovCisJICAgd2FrZXVwKCAoY2FkZHJfdCkmKFBvcnRQLT5JblVzZSkgKTsKKwkgKi8KIAlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIAotdm9pZAotU2hvd1BhY2tldCh1aW50IEZsYWdzLCBzdHJ1Y3QgUEtUICpQYWNrZXRQKQordm9pZCBTaG93UGFja2V0KHVpbnQgRmxhZ3MsIHN0cnVjdCBQS1QgKlBhY2tldFApCiB7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvY3RybC5jIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9jdHJsLmMKaW5kZXggYjRkMWEyMy4uZmNmMThhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9yaW9jdHJsLmMKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9jdHJsLmMKQEAgLTgyLDE2ICs4MiwxNiBAQAogI2luY2x1ZGUgInJpb2lvY3RsLmgiCiAKIAotc3RhdGljIHN0cnVjdCBMcGJSZXEJIExwYlJlcTsKLXN0YXRpYyBzdHJ1Y3QgUnVwUmVxCSBSdXBSZXE7Ci1zdGF0aWMgc3RydWN0IFBvcnRSZXEJUG9ydFJlcTsKLXN0YXRpYyBzdHJ1Y3QgSG9zdFJlcQlIb3N0UmVxOworc3RhdGljIHN0cnVjdCBMcGJSZXEgTHBiUmVxOworc3RhdGljIHN0cnVjdCBSdXBSZXEgUnVwUmVxOworc3RhdGljIHN0cnVjdCBQb3J0UmVxIFBvcnRSZXE7CitzdGF0aWMgc3RydWN0IEhvc3RSZXEgSG9zdFJlcTsKIHN0YXRpYyBzdHJ1Y3QgSG9zdERwUmFtIEhvc3REcFJhbTsKIHN0YXRpYyBzdHJ1Y3QgRGVidWdDdHJsIERlYnVnQ3RybDsKLXN0YXRpYyBzdHJ1Y3QgTWFwCQkgTWFwRW50Oworc3RhdGljIHN0cnVjdCBNYXAgTWFwRW50Owogc3RhdGljIHN0cnVjdCBQb3J0U2V0dXAgUG9ydFNldHVwOwotc3RhdGljIHN0cnVjdCBEb3duTG9hZAlEb3duTG9hZDsKLXN0YXRpYyBzdHJ1Y3QgU2VuZFBhY2sgIFNlbmRQYWNrOworc3RhdGljIHN0cnVjdCBEb3duTG9hZCBEb3duTG9hZDsKK3N0YXRpYyBzdHJ1Y3QgU2VuZFBhY2sgU2VuZFBhY2s7CiAvKiBzdGF0aWMgc3RydWN0IFN0cmVhbUluZm8JU3RyZWFtSW5mbzsgKi8KIC8qIHN0YXRpYyBjaGFyIG1vZGVtdGFibGVbUklPX1BPUlRTXTsgKi8KIHN0YXRpYyBzdHJ1Y3QgU3BlY2lhbFJ1cENtZCBTcGVjaWFsUnVwQ21kOwpAQCAtOTksMTggKzk5LDE4IEBACiBzdGF0aWMgc3RydWN0IHBvcnRTdGF0cyBwb3J0U3RhdHM7CiAKIHN0YXRpYyBzdHJ1Y3QgU3ViQ21kU3RydWN0IHsKLQl1c2hvcnQJSG9zdDsKLQl1c2hvcnQJUnVwOwotCXVzaG9ydAlQb3J0OwotCXVzaG9ydAlBZGRyOworCXVzaG9ydCBIb3N0OworCXVzaG9ydCBSdXA7CisJdXNob3J0IFBvcnQ7CisJdXNob3J0IEFkZHI7CiB9IFN1YkNtZDsKIAogc3RydWN0IFBvcnRUdHkgewotCXVpbnQJCXBvcnQ7Ci0Jc3RydWN0IHR0eXN0YXRpY3MJVHR5OworCXVpbnQgcG9ydDsKKwlzdHJ1Y3QgdHR5c3RhdGljcyBUdHk7CiB9OwogCi1zdGF0aWMgc3RydWN0IFBvcnRUdHkJUG9ydFR0eTsKK3N0YXRpYyBzdHJ1Y3QgUG9ydFR0eSBQb3J0VHR5OwogdHlwZWRlZiBzdHJ1Y3QgdHR5c3RhdGljcyBURVJNSU87CiAKIC8qCkBAIC0xMjEsMjY3ICsxMjEsMjU5IEBACiAqKiBUaGUgUklPQm9vdENvZGVVTktOT1dOIGVudHJ5IGlzIHRoZXJlIHRvIHBvbGl0ZWx5IHRlbGwgdGhlIGNhbGxpbmcKICoqIHByb2Nlc3MgdG8gYm9nIG9mZi4KICovCi1zdGF0aWMgaW50IAotKCpSSU9Cb290VGFibGVbTUFYX1BST0RVQ1RdKShzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IERvd25Mb2FkICopID0KLXsKLS8qIDAgKi8JUklPQm9vdENvZGVIT1NULAkvKiBIb3N0IENhcmQgKi8KLS8qIDEgKi8JUklPQm9vdENvZGVSVEEsCQkvKiBSVEEgKi8KK3N0YXRpYyBpbnQKKyAoKlJJT0Jvb3RUYWJsZVtNQVhfUFJPRFVDVF0pIChzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IERvd25Mb2FkICopID0geworCQkJCQkvKiAwICovIFJJT0Jvb3RDb2RlSE9TVCwKKwkJCQkJLyogSG9zdCBDYXJkICovCisJCQkJCS8qIDEgKi8gUklPQm9vdENvZGVSVEEsCisJCQkJCS8qIFJUQSAqLwogfTsKIAogI2RlZmluZSBkcnZfbWFrZWRldihtYWosIG1pbikgKCgoKHVpbnQpIG1haiAmIDB4ZmYpIDw8IDgpIHwgKCh1aW50KSBtaW4gJiAweGZmKSkKIAotaW50IGNvcHlpbiAoaW50IGFyZywgY2FkZHJfdCBkcCwgaW50IHNpeikKK2ludCBjb3B5aW4oaW50IGFyZywgY2FkZHJfdCBkcCwgaW50IHNpeikKIHsKLSAgaW50IHJ2OworCWludCBydjsKIAotICByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJDb3B5aW5nICVkIGJ5dGVzIGZyb20gdXNlciAlcCB0byAlcC5cbiIsIHNpeiwgKHZvaWQgKilhcmcsIGRwKTsKLSAgcnYgPSBjb3B5X2Zyb21fdXNlciAoZHAsICh2b2lkICopYXJnLCBzaXopOwotICBpZiAocnYpIHJldHVybiBDT1BZRkFJTDsKLSAgZWxzZSByZXR1cm4gcnY7CisJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJDb3B5aW5nICVkIGJ5dGVzIGZyb20gdXNlciAlcCB0byAlcC5cbiIsIHNpeiwgKHZvaWQgKikgYXJnLCBkcCk7CisJcnYgPSBjb3B5X2Zyb21fdXNlcihkcCwgKHZvaWQgKikgYXJnLCBzaXopOworCWlmIChydikKKwkJcmV0dXJuIENPUFlGQUlMOworCWVsc2UKKwkJcmV0dXJuIHJ2OwogfQogCi1zdGF0aWMgaW50IGNvcHlvdXQgKGNhZGRyX3QgZHAsIGludCBhcmcsIGludCBzaXopCitzdGF0aWMgaW50IGNvcHlvdXQoY2FkZHJfdCBkcCwgaW50IGFyZywgaW50IHNpeikKIHsKLSAgaW50IHJ2OworCWludCBydjsKIAotICByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJDb3B5aW5nICVkIGJ5dGVzIHRvIHVzZXIgJXAgZnJvbSAlcC5cbiIsIHNpeiwgKHZvaWQgKilhcmcsIGRwKTsKLSAgcnYgPSBjb3B5X3RvX3VzZXIgKCh2b2lkICopYXJnLCBkcCwgc2l6KTsKLSAgaWYgKHJ2KSByZXR1cm4gQ09QWUZBSUw7Ci0gIGVsc2UgcmV0dXJuIHJ2OworCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiQ29weWluZyAlZCBieXRlcyB0byB1c2VyICVwIGZyb20gJXAuXG4iLCBzaXosICh2b2lkICopIGFyZywgZHApOworCXJ2ID0gY29weV90b191c2VyKCh2b2lkICopIGFyZywgZHAsIHNpeik7CisJaWYgKHJ2KQorCQlyZXR1cm4gQ09QWUZBSUw7CisJZWxzZQorCQlyZXR1cm4gcnY7CiB9CiAKLWludAotcmlvY29udHJvbChwLCBkZXYsIGNtZCwgYXJnLCBzdSkKLXN0cnVjdCByaW9faW5mbwkqIHA7Ci1kZXZfdAkJZGV2OwotaW50CQljbWQ7Ci1jYWRkcl90CQlhcmc7Ci1pbnQJCXN1OworaW50IHJpb2NvbnRyb2wocCwgZGV2LCBjbWQsIGFyZywgc3UpCitzdHJ1Y3QgcmlvX2luZm8gKnA7CitkZXZfdCBkZXY7CitpbnQgY21kOworY2FkZHJfdCBhcmc7CitpbnQgc3U7CiB7Ci0JdWludAlIb3N0OwkvKiBsZWF2ZSBtZSB1bnNpZ25lZCEgKi8KLQl1aW50CXBvcnQ7CS8qIGFuZCBtZSEgKi8KLQlzdHJ1Y3QgSG9zdAkqSG9zdFA7Ci0JdXNob3J0CWxvb3A7Ci0JaW50CQlFbnRyeTsKLQlzdHJ1Y3QgUG9ydAkqUG9ydFA7Ci0JUEtUCSpQYWNrZXRQOwotCWludAkJcmV0dmFsID0gMDsKKwl1aW50IEhvc3Q7CQkvKiBsZWF2ZSBtZSB1bnNpZ25lZCEgKi8KKwl1aW50IHBvcnQ7CQkvKiBhbmQgbWUhICovCisJc3RydWN0IEhvc3QgKkhvc3RQOworCXVzaG9ydCBsb29wOworCWludCBFbnRyeTsKKwlzdHJ1Y3QgUG9ydCAqUG9ydFA7CisJUEtUICpQYWNrZXRQOworCWludCByZXR2YWwgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCi0JZnVuY19lbnRlciAoKTsKLQkKKworCWZ1bmNfZW50ZXIoKTsKKwogCS8qIENvbmZ1c2UgdGhlIGNvbXBpbGVyIHRvIHRoaW5rIHRoYXQgd2UndmUgaW5pdGlhbGl6ZWQgdGhlc2UgKi8KLQlIb3N0PTA7CisJSG9zdCA9IDA7CiAJUG9ydFAgPSBOVUxMOwogCi0JcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiY29udHJvbCBpb2N0bCBjbWQ6IDB4JXggYXJnOiAweCV4XG4iLCBjbWQsIChpbnQpYXJnKTsKKwlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgImNvbnRyb2wgaW9jdGwgY21kOiAweCV4IGFyZzogMHgleFxuIiwgY21kLCAoaW50KSBhcmcpOwogCiAJc3dpdGNoIChjbWQpIHsKIAkJLyoKLQkJKiogUklPX1NFVF9USU1FUgotCQkqKgotCQkqKiBDaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBob3N0IGNhcmQgaW50ZXJydXB0IHRpbWVyLgotCQkqKiBJZiB0aGUgaG9zdCBjYXJkIG51bWJlciBpcyAtMSB0aGVuIGFsbCBob3N0IGNhcmRzIGFyZSBjaGFuZ2VkCi0JCSoqIG90aGVyd2lzZSBqdXN0IHRoZSBzcGVjaWZpZWQgaG9zdCBjYXJkIHdpbGwgYmUgY2hhbmdlZC4KLQkJKi8KLQkJY2FzZSBSSU9fU0VUX1RJTUVSOgotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1NFVF9USU1FUiB0byAlZG1zXG4iLCAodWludClhcmcpOwotCQkJewotCQkJCWludCBob3N0LCB2YWx1ZTsKLQkJCQlob3N0ID0gKHVpbnQpYXJnID4+IDE2OwotCQkJCXZhbHVlID0gKHVpbnQpYXJnICYgMHgwMDAwZmZmZjsKLQkJCQlpZiAoaG9zdCA9PSAtMSkgewotCQkJCQlmb3IgKGhvc3QgPSAwOyBob3N0IDwgcC0+UklPTnVtSG9zdHM7IGhvc3QrKykgewotCQkJCQkJaWYgKHAtPlJJT0hvc3RzW2hvc3RdLkZsYWdzID09IFJDX1JVTk5JTkcpIHsKLQkJCQkJCQlXV09SRChwLT5SSU9Ib3N0c1tob3N0XS5QYXJtTWFwUC0+dGltZXIgLCB2YWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGhvc3QgPj0gcC0+UklPTnVtSG9zdHMpIHsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCBwLT5SSU9Ib3N0c1tob3N0XS5GbGFncyA9PSBSQ19SVU5OSU5HICkgewotCQkJCQkJV1dPUkQocC0+UklPSG9zdHNbaG9zdF0uUGFybU1hcFAtPnRpbWVyICwgdmFsdWUpOworCQkgKiogUklPX1NFVF9USU1FUgorCQkgKioKKwkJICoqIENoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGhvc3QgY2FyZCBpbnRlcnJ1cHQgdGltZXIuCisJCSAqKiBJZiB0aGUgaG9zdCBjYXJkIG51bWJlciBpcyAtMSB0aGVuIGFsbCBob3N0IGNhcmRzIGFyZSBjaGFuZ2VkCisJCSAqKiBvdGhlcndpc2UganVzdCB0aGUgc3BlY2lmaWVkIGhvc3QgY2FyZCB3aWxsIGJlIGNoYW5nZWQuCisJCSAqLworCWNhc2UgUklPX1NFVF9USU1FUjoKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fU0VUX1RJTUVSIHRvICVkbXNcbiIsICh1aW50KSBhcmcpOworCQl7CisJCQlpbnQgaG9zdCwgdmFsdWU7CisJCQlob3N0ID0gKHVpbnQpIGFyZyA+PiAxNjsKKwkJCXZhbHVlID0gKHVpbnQpIGFyZyAmIDB4MDAwMGZmZmY7CisJCQlpZiAoaG9zdCA9PSAtMSkgeworCQkJCWZvciAoaG9zdCA9IDA7IGhvc3QgPCBwLT5SSU9OdW1Ib3N0czsgaG9zdCsrKSB7CisJCQkJCWlmIChwLT5SSU9Ib3N0c1tob3N0XS5GbGFncyA9PSBSQ19SVU5OSU5HKSB7CisJCQkJCQlXV09SRChwLT5SSU9Ib3N0c1tob3N0XS5QYXJtTWFwUC0+dGltZXIsIHZhbHVlKTsKIAkJCQkJfQogCQkJCX0KLQkJCX0KLQkJCXJldHVybiAwOwotCi0JCWNhc2UgUklPX0lERU5USUZZX0RSSVZFUjoKLQkJCS8qCi0JCQkqKiAxNS4xMC4xOTk4IEFSRyAtIEVTSUwgMDc2MCBwYXJ0IGZpeAotCQkJKiogQWRkZWQgZHJpdmVyIGlkZW50IHN0cmluZyBvdXRwdXQuCi0JCQkqKgotI2lmbmRlZiBfX1RISVNfUkVMRUFTRV9fCi0jd2FybmluZyBEcml2ZXIgVmVyc2lvbiBzdHJpbmcgbm90IGRlZmluZWQgIQotI2VuZGlmCi0JCQljcHJpbnRmKCIlcyAlcyAlcyAlc1xuIiwKLQkJCQlSSU9fRFJWX1NUUiwKLQkJCQlfX1RISVNfUkVMRUFTRV9fLAotCQkJCV9fREFURV9fLCBfX1RJTUVfXyApOwotCi0JCQlyZXR1cm4gMDsKLQotCQljYXNlIFJJT19ESVNQTEFZX0hPU1RfQ0ZHOgotCQkJKioKLQkJCSoqIDE1LjEwLjE5OTggQVJHIC0gRVNJTCAwNzYwIHBhcnQgZml4Ci0JCQkqKiBBZGRlZCBkcml2ZXIgaG9zdCBjYXJkIGlkZW50IHN0cmluZyBvdXRwdXQuCi0JCQkqKgotCQkJKiogTm90ZSB0aGF0IHRoZSBvbmx5IHR5cGVzIGN1cnJlbnRseSBzdXBwb3J0ZWQKLQkJCSoqIGFyZSBJU0EgYW5kIFBDSS4gQWxzbyB0aGlzIGRyaXZlciBkb2VzIG5vdAotCQkJKiogKHlldCkgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgT2xkIFBDSSBjYXJkCi0JCQkqKiBhbmQgdGhlIEpldCBQQ0kgY2FyZC4gSW4gZmFjdCBJIHRoaW5rIHRoaXMKLQkJCSoqIGRyaXZlciBvbmx5IHN1cHBvcnRzIEpFVCBQQ0kgIQotCQkJKioKLQotCQkJZm9yIChIb3N0ID0gMDsgSG9zdCA8IHAtPlJJT051bUhvc3RzOyBIb3N0KyspCi0JCQl7Ci0JCQkJSG9zdFAgPSAmKHAtPlJJT0hvc3RzW0hvc3RdKTsKLQotCQkJCXN3aXRjaCAoIEhvc3RQLT5UeXBlICkKLQkJCQl7Ci0JCQkJICAgIGNhc2UgUklPX0FUIDoKLQkJCQkJc3RyY3B5KCBob3N0X3R5cGUsIFJJT19BVF9IT1NUX1NUUiApOwotCQkJCQlicmVhazsKLQotCQkJCSAgICBjYXNlIFJJT19QQ0kgOgotCQkJCQlzdHJjcHkoIGhvc3RfdHlwZSwgUklPX1BDSV9IT1NUX1NUUiApOwotCQkJCQlicmVhazsKLQotCQkJCSAgICBkZWZhdWx0IDoKLQkJCQkJc3RyY3B5KCBob3N0X3R5cGUsICJVbmtub3duIiApOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQljcHJpbnRmKAotCQkJCSAgIlJJTyBIb3N0ICVkIC0gVHlwZTolcyBBZGRyOiVYIElSUTolZFxuIiwKLQkJCQkJSG9zdCwgaG9zdF90eXBlLAotCQkJCQkodWludClIb3N0UC0+UGFkZHJQLAotCQkJCQkoaW50KUhvc3RQLT5JdmVjIC0gMzIgICk7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJCSoqCi0JCQkqLwotCi0JCWNhc2UgUklPX0ZPQURfUlRBOgotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0ZPQURfUlRBXG4iKTsKLQkJCXJldHVybiBSSU9Db21tYW5kUnRhKHAsICh1aW50KWFyZywgUklPRm9hZFJ0YSk7Ci0KLQkJY2FzZSBSSU9fWk9NQklFX1JUQToKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19aT01CSUVfUlRBXG4iKTsKLQkJCXJldHVybiBSSU9Db21tYW5kUnRhKHAsICh1aW50KWFyZywgUklPWm9tYmllUnRhKTsKLQotCQljYXNlIFJJT19JREVOVElGWV9SVEE6Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSURFTlRJRllfUlRBXG4iKTsKLQkJCXJldHVybiBSSU9JZGVudGlmeVJ0YShwLCBhcmcpOwotCi0JCWNhc2UgUklPX0tJTExfTkVJR0hCT1VSOgotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0tJTExfTkVJR0hCT1VSXG4iKTsKLQkJCXJldHVybiBSSU9LaWxsTmVpZ2hib3VyKHAsIGFyZyk7Ci0KLQkJY2FzZSBTUEVDSUFMX1JVUF9DTUQ6Ci0JCQl7Ci0JCQkJc3RydWN0IENtZEJsayAqQ21kQmxrUDsKLQotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlNQRUNJQUxfUlVQX0NNRFxuIik7Ci0JCQkJaWYgKGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJlNwZWNpYWxSdXBDbWQsIAotCQkJCQkJCXNpemVvZihTcGVjaWFsUnVwQ21kKSkgPT0gQ09QWUZBSUwgKSB7Ci0JCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlNQRUNJQUxfUlVQX0NNRCBjb3B5IGZhaWxlZFxuIik7Ci0JCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKLQkJIAkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCQlDbWRCbGtQID0gUklPR2V0Q21kQmxrKCk7Ci0JCQkJaWYgKCAhQ21kQmxrUCApIHsKLQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiU1BFQ0lBTF9SVVBfQ01EIEdldENtZEJsayBmYWlsZWRcbiIpOwotCQkJCQlyZXR1cm4gLUVOWElPOwotCQkJCX0KLQkJCQlDbWRCbGtQLT5QYWNrZXQgPSBTcGVjaWFsUnVwQ21kLlBhY2tldDsKLQkJCQlpZiAoIFNwZWNpYWxSdXBDbWQuSG9zdCA+PSBwLT5SSU9OdW1Ib3N0cyApCi0JCQkJCVNwZWNpYWxSdXBDbWQuSG9zdCA9IDA7Ci0JCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlF1ZXVlIHNwZWNpYWwgcnVwIGNvbW1hbmQgZm9yIGhvc3QgJWQgcnVwICVkXG4iLAotCQkJCQkJU3BlY2lhbFJ1cENtZC5Ib3N0LCBTcGVjaWFsUnVwQ21kLlJ1cE51bSk7Ci0JCQkJCWlmIChSSU9RdWV1ZUNtZEJsaygmcC0+UklPSG9zdHNbU3BlY2lhbFJ1cENtZC5Ib3N0XSwgCi0JCQkJCQkJU3BlY2lhbFJ1cENtZC5SdXBOdW0sIENtZEJsa1ApID09IFJJT19GQUlMKSB7Ci0JCQkJCQljcHJpbnRmKCJGQUlMRUQgVE8gUVVFVUUgU1BFQ0lBTCBSVVAgQ09NTUFORFxuIik7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCi0JCQljYXNlIFJJT19ERUJVR19NRU06Ci0jaWZkZWYgREVCVUdfTUVNX1NVUFBPUlQKLVJJT19ERUJVR19DVFJMLCAJCQkJaWYgKHN1KQotCQkJCQlyZXR1cm4gcmlvX1JJT0RlYnVnTWVtb3J5KFJJT19ERUJVR19DVFJMLCBhcmcpOwotCQkJCWVsc2UKLSNlbmRpZgotCQkJCQlyZXR1cm4gLUVQRVJNOwotCi0JCQljYXNlIFJJT19BTExfTU9ERU06Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0FMTF9NT0RFTVxuIik7Ci0JCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBJT0NUTF9DT01NQU5EX1VOS05PV047CisJCQl9IGVsc2UgaWYgKGhvc3QgPj0gcC0+UklPTnVtSG9zdHMpIHsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJY2FzZSBSSU9fR0VUX1RBQkxFOgotCQkJCS8qCi0JCQkJKiogUmVhZCB0aGUgcm91dGluZyB0YWJsZSBmcm9tIHRoZSBkZXZpY2UgZHJpdmVyIHRvIHVzZXIgc3BhY2UKLQkJCQkqLwotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19HRVRfVEFCTEVcbiIpOwotCi0JCQkJaWYgKChyZXR2YWwgPSBSSU9BcGVsKHApKSAhPSAwKQotCQkgCQkJcmV0dXJuIHJldHZhbDsKLQotCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KXAtPlJJT0Nvbm5lY3RUYWJsZSwgKGludClhcmcsCi0JCQkJCQlUT1RBTF9NQVBfRU5UUklFUypzaXplb2Yoc3RydWN0IE1hcCkpID09IENPUFlGQUlMKSB7Ci0JCSAJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fR0VUX1RBQkxFIGNvcHkgZmFpbGVkXG4iKTsKLQkJIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7Ci0JCSAJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHAtPlJJT0hvc3RzW2hvc3RdLkZsYWdzID09IFJDX1JVTk5JTkcpIHsKKwkJCQkJV1dPUkQocC0+UklPSG9zdHNbaG9zdF0uUGFybU1hcFAtPnRpbWVyLCB2YWx1ZSk7CiAJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiAwOwogCi0JCQkJewotCQkJCQlpbnQgZW50cnk7Ci0JCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgICIqKioqKlxuTUFQIEVOVFJJRVNcbiIpOwotCQkJCQlmb3IgKCBlbnRyeT0wOyBlbnRyeTxUT1RBTF9NQVBfRU5UUklFUzsgZW50cnkrKyApCi0JCQkJCXsKLQkJCQkJICBpZiAoKHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uSUQgPT0gMCkgJiYKLQkJCQkJICAgICAgKHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uSG9zdFVuaXF1ZU51bSA9PSAwKSAmJgotCQkJCQkgICAgICAocC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5SdGFVbmlxdWVOdW0gPT0gMCkpIGNvbnRpbnVlOwotCQkJCQkgICAgICAKLQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5Ib3N0VW5pcXVlTnVtID0gMHgleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uSG9zdFVuaXF1ZU51bSApOwotCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWFwIGVudHJ5ICVkLlJ0YVVuaXF1ZU51bSA9IDB4JXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlJ0YVVuaXF1ZU51bSApOwotCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWFwIGVudHJ5ICVkLklEID0gMHgleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uSUQgKTsKLQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5JRDIgPSAweCV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5JRDIgKTsKLQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5GbGFncyA9IDB4JXhcbiIsIGVudHJ5LCAoaW50KXAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uRmxhZ3MgKTsKLQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5TeXNQb3J0ID0gMHgleFxuIiwgZW50cnksIChpbnQpcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5TeXNQb3J0ICk7Ci0JCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuVG9wWzBdLlVuaXQgPSAleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uVG9wb2xvZ3lbMF0uVW5pdCApOwotCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWFwIGVudHJ5ICVkLlRvcFswXS5MaW5rID0gJXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzBdLkxpbmsgKTsKLQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5Ub3BbMV0uVW5pdCA9ICV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ub3BvbG9neVsxXS5Vbml0ICk7Ci0JCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuVG9wWzFdLkxpbmsgPSAleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uVG9wb2xvZ3lbMV0uTGluayApOwotCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWFwIGVudHJ5ICVkLlRvcFsyXS5Vbml0ID0gJXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzJdLlVuaXQgKTsKLQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5Ub3BbMl0uTGluayA9ICV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5Ub3BvbG9neVsyXS5MaW5rICk7Ci0JCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuVG9wWzNdLlVuaXQgPSAleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uVG9wb2xvZ3lbM10uVW5pdCApOwotCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWFwIGVudHJ5ICVkLlRvcFs0XS5MaW5rID0gJXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlRvcG9sb2d5WzNdLkxpbmsgKTsKLQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5OYW1lID0gJXNcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLk5hbWUgKTsKLQkJCQkJfQotCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICAiKioqKipcbkVORCBNQVAgRU5UUklFU1xuIik7Ci0JCQkJfQotCQkJCXAtPlJJT1F1aWNrQ2hlY2sgPSBOT1RfQ0hBTkdFRDsJLyogYSB0YWJsZSBoYXMgYmVlbiBnb3R0ZW4gKi8KLQkJCQlyZXR1cm4gMDsKKwljYXNlIFJJT19JREVOVElGWV9EUklWRVI6CisJCS8qCisJCSAqKiAxNS4xMC4xOTk4IEFSRyAtIEVTSUwgMDc2MCBwYXJ0IGZpeAorCQkgKiogQWRkZWQgZHJpdmVyIGlkZW50IHN0cmluZyBvdXRwdXQuCisJCSAqKgorCQkgI2lmbmRlZiBfX1RISVNfUkVMRUFTRV9fCisJCSAjd2FybmluZyBEcml2ZXIgVmVyc2lvbiBzdHJpbmcgbm90IGRlZmluZWQgIQorCQkgI2VuZGlmCisJCSBjcHJpbnRmKCIlcyAlcyAlcyAlc1xuIiwKKwkJIFJJT19EUlZfU1RSLAorCQkgX19USElTX1JFTEVBU0VfXywKKwkJIF9fREFURV9fLCBfX1RJTUVfXyApOwogCi0JCQljYXNlIFJJT19QVVRfVEFCTEU6Ci0JCQkJLyoKLQkJCQkqKiBXcml0ZSB0aGUgcm91dGluZyB0YWJsZSB0byB0aGUgZGV2aWNlIGRyaXZlciBmcm9tIHVzZXIgc3BhY2UKLQkJCQkqLwotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19QVVRfVEFCTEVcbiIpOworCQkgcmV0dXJuIDA7CiAKLQkJCQlpZiAoICFzdSApIHsKLQkJIAkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19QVVRfVEFCTEUgIVJvb3RcbiIpOwotCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKLQkJIAkJCXJldHVybiAtRVBFUk07Ci0JCQkJfQotCQkJCWlmICggY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmcC0+UklPQ29ubmVjdFRhYmxlWzBdLCAKLQkJCQkJVE9UQUxfTUFQX0VOVFJJRVMqc2l6ZW9mKHN0cnVjdCBNYXApICkgPT0gQ09QWUZBSUwgKSB7Ci0JCSAJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUFVUX1RBQkxFIGNvcHkgZmFpbGVkXG4iKTsKLQkJIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKLQkJIAkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KKwkJIGNhc2UgUklPX0RJU1BMQVlfSE9TVF9DRkc6CisJCSAqKgorCQkgKiogMTUuMTAuMTk5OCBBUkcgLSBFU0lMIDA3NjAgcGFydCBmaXgKKwkJICoqIEFkZGVkIGRyaXZlciBob3N0IGNhcmQgaWRlbnQgc3RyaW5nIG91dHB1dC4KKwkJICoqCisJCSAqKiBOb3RlIHRoYXQgdGhlIG9ubHkgdHlwZXMgY3VycmVudGx5IHN1cHBvcnRlZAorCQkgKiogYXJlIElTQSBhbmQgUENJLiBBbHNvIHRoaXMgZHJpdmVyIGRvZXMgbm90CisJCSAqKiAoeWV0KSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBPbGQgUENJIGNhcmQKKwkJICoqIGFuZCB0aGUgSmV0IFBDSSBjYXJkLiBJbiBmYWN0IEkgdGhpbmsgdGhpcworCQkgKiogZHJpdmVyIG9ubHkgc3VwcG9ydHMgSkVUIFBDSSAhCisJCSAqKgorCisJCSBmb3IgKEhvc3QgPSAwOyBIb3N0IDwgcC0+UklPTnVtSG9zdHM7IEhvc3QrKykKKwkJIHsKKwkJIEhvc3RQID0gJihwLT5SSU9Ib3N0c1tIb3N0XSk7CisKKwkJIHN3aXRjaCAoIEhvc3RQLT5UeXBlICkKKwkJIHsKKwkJIGNhc2UgUklPX0FUIDoKKwkJIHN0cmNweSggaG9zdF90eXBlLCBSSU9fQVRfSE9TVF9TVFIgKTsKKwkJIGJyZWFrOworCisJCSBjYXNlIFJJT19QQ0kgOgorCQkgc3RyY3B5KCBob3N0X3R5cGUsIFJJT19QQ0lfSE9TVF9TVFIgKTsKKwkJIGJyZWFrOworCisJCSBkZWZhdWx0IDoKKwkJIHN0cmNweSggaG9zdF90eXBlLCAiVW5rbm93biIgKTsKKwkJIGJyZWFrOworCQkgfQorCisJCSBjcHJpbnRmKAorCQkgIlJJTyBIb3N0ICVkIC0gVHlwZTolcyBBZGRyOiVYIElSUTolZFxuIiwKKwkJIEhvc3QsIGhvc3RfdHlwZSwKKwkJICh1aW50KUhvc3RQLT5QYWRkclAsCisJCSAoaW50KUhvc3RQLT5JdmVjIC0gMzIgICk7CisJCSB9CisJCSByZXR1cm4gMDsKKwkJICoqCisJCSAqLworCisJY2FzZSBSSU9fRk9BRF9SVEE6CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX0ZPQURfUlRBXG4iKTsKKwkJcmV0dXJuIFJJT0NvbW1hbmRSdGEocCwgKHVpbnQpIGFyZywgUklPRm9hZFJ0YSk7CisKKwljYXNlIFJJT19aT01CSUVfUlRBOgorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19aT01CSUVfUlRBXG4iKTsKKwkJcmV0dXJuIFJJT0NvbW1hbmRSdGEocCwgKHVpbnQpIGFyZywgUklPWm9tYmllUnRhKTsKKworCWNhc2UgUklPX0lERU5USUZZX1JUQToKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fSURFTlRJRllfUlRBXG4iKTsKKwkJcmV0dXJuIFJJT0lkZW50aWZ5UnRhKHAsIGFyZyk7CisKKwljYXNlIFJJT19LSUxMX05FSUdIQk9VUjoKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fS0lMTF9ORUlHSEJPVVJcbiIpOworCQlyZXR1cm4gUklPS2lsbE5laWdoYm91cihwLCBhcmcpOworCisJY2FzZSBTUEVDSUFMX1JVUF9DTUQ6CisJCXsKKwkJCXN0cnVjdCBDbWRCbGsgKkNtZEJsa1A7CisKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiU1BFQ0lBTF9SVVBfQ01EXG4iKTsKKwkJCWlmIChjb3B5aW4oKGludCkgYXJnLCAoY2FkZHJfdCkgJiBTcGVjaWFsUnVwQ21kLCBzaXplb2YoU3BlY2lhbFJ1cENtZCkpID09IENPUFlGQUlMKSB7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJTUEVDSUFMX1JVUF9DTUQgY29weSBmYWlsZWRcbiIpOworCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCUNtZEJsa1AgPSBSSU9HZXRDbWRCbGsoKTsKKwkJCWlmICghQ21kQmxrUCkgeworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiU1BFQ0lBTF9SVVBfQ01EIEdldENtZEJsayBmYWlsZWRcbiIpOworCQkJCXJldHVybiAtRU5YSU87CisJCQl9CisJCQlDbWRCbGtQLT5QYWNrZXQgPSBTcGVjaWFsUnVwQ21kLlBhY2tldDsKKwkJCWlmIChTcGVjaWFsUnVwQ21kLkhvc3QgPj0gcC0+UklPTnVtSG9zdHMpCisJCQkJU3BlY2lhbFJ1cENtZC5Ib3N0ID0gMDsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUXVldWUgc3BlY2lhbCBydXAgY29tbWFuZCBmb3IgaG9zdCAlZCBydXAgJWRcbiIsIFNwZWNpYWxSdXBDbWQuSG9zdCwgU3BlY2lhbFJ1cENtZC5SdXBOdW0pOworCQkJaWYgKFJJT1F1ZXVlQ21kQmxrKCZwLT5SSU9Ib3N0c1tTcGVjaWFsUnVwQ21kLkhvc3RdLCBTcGVjaWFsUnVwQ21kLlJ1cE51bSwgQ21kQmxrUCkgPT0gUklPX0ZBSUwpIHsKKwkJCQljcHJpbnRmKCJGQUlMRUQgVE8gUVVFVUUgU1BFQ0lBTCBSVVAgQ09NTUFORFxuIik7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCisJY2FzZSBSSU9fREVCVUdfTUVNOgorCQlyZXR1cm4gLUVQRVJNOworCisJY2FzZSBSSU9fQUxMX01PREVNOgorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19BTExfTU9ERU1cbiIpOworCQlwLT5SSU9FcnJvci5FcnJvciA9IElPQ1RMX0NPTU1BTkRfVU5LTk9XTjsKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYXNlIFJJT19HRVRfVEFCTEU6CisJCS8qCisJCSAqKiBSZWFkIHRoZSByb3V0aW5nIHRhYmxlIGZyb20gdGhlIGRldmljZSBkcml2ZXIgdG8gdXNlciBzcGFjZQorCQkgKi8KKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fR0VUX1RBQkxFXG4iKTsKKworCQlpZiAoKHJldHZhbCA9IFJJT0FwZWwocCkpICE9IDApCisJCQlyZXR1cm4gcmV0dmFsOworCisJCWlmIChjb3B5b3V0KChjYWRkcl90KSBwLT5SSU9Db25uZWN0VGFibGUsIChpbnQpIGFyZywgVE9UQUxfTUFQX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IE1hcCkpID09IENPUFlGQUlMKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19HRVRfVEFCTEUgY29weSBmYWlsZWRcbiIpOworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJeworCQkJaW50IGVudHJ5OworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICIqKioqKlxuTUFQIEVOVFJJRVNcbiIpOworCQkJZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgVE9UQUxfTUFQX0VOVFJJRVM7IGVudHJ5KyspIHsKKwkJCQlpZiAoKHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uSUQgPT0gMCkgJiYgKHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uSG9zdFVuaXF1ZU51bSA9PSAwKSAmJiAocC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5SdGFVbmlxdWVOdW0gPT0gMCkpCisJCQkJCWNvbnRpbnVlOworCisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuSG9zdFVuaXF1ZU51bSA9IDB4JXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLkhvc3RVbmlxdWVOdW0pOworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiTWFwIGVudHJ5ICVkLlJ0YVVuaXF1ZU51bSA9IDB4JXhcbiIsIGVudHJ5LCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlJ0YVVuaXF1ZU51bSk7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuSUQgPSAweCV4XG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5JRCk7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuSUQyID0gMHgleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uSUQyKTsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5GbGFncyA9IDB4JXhcbiIsIGVudHJ5LCAoaW50KSBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLkZsYWdzKTsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIk1hcCBlbnRyeSAlZC5TeXNQb3J0ID0gMHgleFxuIiwgZW50cnksIChpbnQpIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uU3lzUG9ydCk7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuVG9wWzBdLlVuaXQgPSAleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uVG9wb2xvZ3lbMF0uVW5pdCk7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuVG9wWzBdLkxpbmsgPSAleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uVG9wb2xvZ3lbMF0uTGluayk7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuVG9wWzFdLlVuaXQgPSAleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uVG9wb2xvZ3lbMV0uVW5pdCk7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuVG9wWzFdLkxpbmsgPSAleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uVG9wb2xvZ3lbMV0uTGluayk7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuVG9wWzJdLlVuaXQgPSAleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uVG9wb2xvZ3lbMl0uVW5pdCk7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuVG9wWzJdLkxpbmsgPSAleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uVG9wb2xvZ3lbMl0uTGluayk7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuVG9wWzNdLlVuaXQgPSAleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uVG9wb2xvZ3lbM10uVW5pdCk7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuVG9wWzRdLkxpbmsgPSAleFxuIiwgZW50cnksIHAtPlJJT0Nvbm5lY3RUYWJsZVtlbnRyeV0uVG9wb2xvZ3lbM10uTGluayk7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJNYXAgZW50cnkgJWQuTmFtZSA9ICVzXG4iLCBlbnRyeSwgcC0+UklPQ29ubmVjdFRhYmxlW2VudHJ5XS5OYW1lKTsKKwkJCX0KKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiKioqKipcbkVORCBNQVAgRU5UUklFU1xuIik7CisJCX0KKwkJcC0+UklPUXVpY2tDaGVjayA9IE5PVF9DSEFOR0VEOwkvKiBhIHRhYmxlIGhhcyBiZWVuIGdvdHRlbiAqLworCQlyZXR1cm4gMDsKKworCWNhc2UgUklPX1BVVF9UQUJMRToKKwkJLyoKKwkJICoqIFdyaXRlIHRoZSByb3V0aW5nIHRhYmxlIHRvIHRoZSBkZXZpY2UgZHJpdmVyIGZyb20gdXNlciBzcGFjZQorCQkgKi8KKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fUFVUX1RBQkxFXG4iKTsKKworCQlpZiAoIXN1KSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19QVVRfVEFCTEUgIVJvb3RcbiIpOworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKwkJaWYgKGNvcHlpbigoaW50KSBhcmcsIChjYWRkcl90KSAmIHAtPlJJT0Nvbm5lY3RUYWJsZVswXSwgVE9UQUxfTUFQX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IE1hcCkpID09IENPUFlGQUlMKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19QVVRfVEFCTEUgY29weSBmYWlsZWRcbiIpOworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KIC8qCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCQkJCXsKQEAgLTQwOSwxMzUzICs0MDEsMTE0NCBAQAogCQkJCX0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwotCQkJCXJldHVybiBSSU9OZXdUYWJsZShwKTsKKwkJcmV0dXJuIFJJT05ld1RhYmxlKHApOwogCi0JIAkJY2FzZSBSSU9fR0VUX0JJTkRJTkdTIDoKLQkJCQkvKgotCQkJCSoqIFNlbmQgYmluZGluZ3MgdGFibGUsIGNvbnRhaW5pbmcgdW5pcXVlIG51bWJlcnMgb2YgUlRBcyBvd25lZAotCQkJCSoqIGJ5IHRoaXMgc3lzdGVtIHRvIHVzZXIgc3BhY2UKLQkJCQkqLwotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19HRVRfQklORElOR1NcbiIpOworCWNhc2UgUklPX0dFVF9CSU5ESU5HUzoKKwkJLyoKKwkJICoqIFNlbmQgYmluZGluZ3MgdGFibGUsIGNvbnRhaW5pbmcgdW5pcXVlIG51bWJlcnMgb2YgUlRBcyBvd25lZAorCQkgKiogYnkgdGhpcyBzeXN0ZW0gdG8gdXNlciBzcGFjZQorCQkgKi8KKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fR0VUX0JJTkRJTkdTXG4iKTsKIAotCQkJCWlmICggIXN1ICkKLQkJCQl7Ci0JCSAJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fR0VUX0JJTkRJTkdTICFSb290XG4iKTsKLQkJIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gTk9UX1NVUEVSX1VTRVI7Ci0JCSAJCQlyZXR1cm4gLUVQRVJNOwotCQkJCX0KLQkJCQlpZiAoY29weW91dCgoY2FkZHJfdCkgcC0+UklPQmluZFRhYiwgKGludClhcmcsIAotCQkJCQkJKHNpemVvZih1bG9uZykgKiBNQVhfUlRBX0JJTkRJTkdTKSkgPT0gQ09QWUZBSUwgKSB7Ci0JCSAJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fR0VUX0JJTkRJTkdTIGNvcHkgZmFpbGVkXG4iKTsKLQkJIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7Ci0JCSAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQl9Ci0JCQkJcmV0dXJuIDA7CisJCWlmICghc3UpIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX0dFVF9CSU5ESU5HUyAhUm9vdFxuIik7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOworCQkJcmV0dXJuIC1FUEVSTTsKKwkJfQorCQlpZiAoY29weW91dCgoY2FkZHJfdCkgcC0+UklPQmluZFRhYiwgKGludCkgYXJnLCAoc2l6ZW9mKHVsb25nKSAqIE1BWF9SVEFfQklORElOR1MpKSA9PSBDT1BZRkFJTCkgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fR0VUX0JJTkRJTkdTIGNvcHkgZmFpbGVkXG4iKTsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXR1cm4gMDsKIAotCSAJCWNhc2UgUklPX1BVVF9CSU5ESU5HUyA6CisJY2FzZSBSSU9fUFVUX0JJTkRJTkdTOgorCQkvKgorCQkgKiogUmVjZWl2ZSBhIGJpbmRpbmdzIHRhYmxlLCBjb250YWluaW5nIHVuaXF1ZSBudW1iZXJzIG9mIFJUQXMgb3duZWQKKwkJICoqIGJ5IHRoaXMgc3lzdGVtCisJCSAqLworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19QVVRfQklORElOR1NcbiIpOworCisJCWlmICghc3UpIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX1BVVF9CSU5ESU5HUyAhUm9vdFxuIik7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOworCQkJcmV0dXJuIC1FUEVSTTsKKwkJfQorCQlpZiAoY29weWluKChpbnQpIGFyZywgKGNhZGRyX3QpICYgcC0+UklPQmluZFRhYlswXSwgKHNpemVvZih1bG9uZykgKiBNQVhfUlRBX0JJTkRJTkdTKSkgPT0gQ09QWUZBSUwpIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX1BVVF9CSU5ESU5HUyBjb3B5IGZhaWxlZFxuIik7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgUklPX0JJTkRfUlRBOgorCQl7CisJCQlpbnQgRW1wdHlTbG90ID0gLTE7CiAJCQkvKgotCQkJKiogUmVjZWl2ZSBhIGJpbmRpbmdzIHRhYmxlLCBjb250YWluaW5nIHVuaXF1ZSBudW1iZXJzIG9mIFJUQXMgb3duZWQKLQkJCSoqIGJ5IHRoaXMgc3lzdGVtCi0JCQkqLwotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19QVVRfQklORElOR1NcbiIpOworCQkJICoqIEJpbmQgdGhpcyBSVEEgdG8gaG9zdCwgc28gdGhhdCBpdCB3aWxsIGJlIGJvb3RlZCBieQorCQkJICoqIGhvc3QgaW4gJ2Jvb3Qgb3duZWQgUlRBcycgbW9kZS4KKwkJCSAqLworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fQklORF9SVEFcbiIpOwogCi0JCQkJaWYgKCAhc3UgKQotCQkJCXsKLQkJIAkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19QVVRfQklORElOR1MgIVJvb3RcbiIpOwotCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKLQkJIAkJCXJldHVybiAtRVBFUk07Ci0JCQkJfQotCQkJCWlmIChjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZwLT5SSU9CaW5kVGFiWzBdLCAKLQkJCQkJCShzaXplb2YodWxvbmcpICogTUFYX1JUQV9CSU5ESU5HUykpPT1DT1BZRkFJTCApIHsKLQkJIAkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19QVVRfQklORElOR1MgY29weSBmYWlsZWRcbiIpOwotCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOwotCQkgCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCXJldHVybiAwOwotCi0JCQljYXNlIFJJT19CSU5EX1JUQSA6Ci0JCQkJewotCQkJCQlpbnQJRW1wdHlTbG90ID0gLTE7CisJCQlpZiAoIXN1KSB7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fQklORF9SVEEgIVJvb3RcbiIpOworCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gTk9UX1NVUEVSX1VTRVI7CisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCX0KKwkJCWZvciAoRW50cnkgPSAwOyBFbnRyeSA8IE1BWF9SVEFfQklORElOR1M7IEVudHJ5KyspIHsKKwkJCQlpZiAoKEVtcHR5U2xvdCA9PSAtMSkgJiYgKHAtPlJJT0JpbmRUYWJbRW50cnldID09IDBMKSkKKwkJCQkJRW1wdHlTbG90ID0gRW50cnk7CisJCQkJZWxzZSBpZiAocC0+UklPQmluZFRhYltFbnRyeV0gPT0gKGludCkgYXJnKSB7CiAJCQkJCS8qCi0JCQkJCSoqIEJpbmQgdGhpcyBSVEEgdG8gaG9zdCwgc28gdGhhdCBpdCB3aWxsIGJlIGJvb3RlZCBieSAKLQkJCQkJKiogaG9zdCBpbiAnYm9vdCBvd25lZCBSVEFzJyBtb2RlLgotCQkJCQkqLwotCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fQklORF9SVEFcbiIpOwotCi0JCQkJCWlmICggIXN1ICkgewotCQkgCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19CSU5EX1JUQSAhUm9vdFxuIik7Ci0JCSAJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKLQkJIAkJCQlyZXR1cm4gLUVQRVJNOwotCQkJCQl9Ci0JCQkJCWZvciAoRW50cnkgPSAwOyBFbnRyeSA8IE1BWF9SVEFfQklORElOR1M7IEVudHJ5KyspIHsKLQkJIAkJCQlpZiAoKEVtcHR5U2xvdCA9PSAtMSkgJiYgKHAtPlJJT0JpbmRUYWJbRW50cnldID09IDBMKSkKLQkJCQkJCQlFbXB0eVNsb3QgPSBFbnRyeTsKLQkJIAkJCQllbHNlIGlmIChwLT5SSU9CaW5kVGFiW0VudHJ5XSA9PSAoaW50KSBhcmcpIHsKLQkJCQkJCQkvKgotCQkJCQkJCSoqIEFscmVhZHkgZXhpc3RzIC0gZGVsZXRlCi0JCQkJCQkJKi8KLQkJCQkJCQlwLT5SSU9CaW5kVGFiW0VudHJ5XSA9IDBMOwotCQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJlbW92aW5nIFJ0YSAleCBmcm9tIHAtPlJJT0JpbmRUYWJcbiIsCi0JCSAJCQkJCQkJCQkJCQkoaW50KSBhcmcpOwotCQkJCQkJCXJldHVybiAwOwotCQkgCQkJCX0KLQkJCQkJfQotCQkJCQkvKgotCQkJCQkqKiBEb3Nlbid0IGV4aXN0IC0gYWRkCi0JCQkJCSovCi0JCQkJCWlmIChFbXB0eVNsb3QgIT0gLTEpIHsKLQkJIAkJCQlwLT5SSU9CaW5kVGFiW0VtcHR5U2xvdF0gPSAoaW50KSBhcmc7Ci0JCSAJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQWRkaW5nIFJ0YSAleCB0byBwLT5SSU9CaW5kVGFiXG4iLAotCQkgIAkJCQkJKGludCkgYXJnKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJIAkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJwLT5SSU9CaW5kVGFiIGZ1bGwhIC0gUnRhICV4IG5vdCBhZGRlZFxuIiwKLQkJICAJCQkJCShpbnQpIGFyZyk7Ci0JCSAJCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQkJCX0KKwkJCQkJICoqIEFscmVhZHkgZXhpc3RzIC0gZGVsZXRlCisJCQkJCSAqLworCQkJCQlwLT5SSU9CaW5kVGFiW0VudHJ5XSA9IDBMOworCQkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJlbW92aW5nIFJ0YSAleCBmcm9tIHAtPlJJT0JpbmRUYWJcbiIsIChpbnQpIGFyZyk7CiAJCQkJCXJldHVybiAwOwogCQkJCX0KKwkJCX0KKwkJCS8qCisJCQkgKiogRG9zZW4ndCBleGlzdCAtIGFkZAorCQkJICovCisJCQlpZiAoRW1wdHlTbG90ICE9IC0xKSB7CisJCQkJcC0+UklPQmluZFRhYltFbXB0eVNsb3RdID0gKGludCkgYXJnOworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiQWRkaW5nIFJ0YSAleCB0byBwLT5SSU9CaW5kVGFiXG4iLCAoaW50KSBhcmcpOworCQkJfSBlbHNlIHsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgInAtPlJJT0JpbmRUYWIgZnVsbCEgLSBSdGEgJXggbm90IGFkZGVkXG4iLCAoaW50KSBhcmcpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KIAotCQkJY2FzZSBSSU9fUkVTVU1FIDoKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUkVTVU1FXG4iKTsKLQkJCQlwb3J0ID0gKHVpbnQpIGFyZzsKLQkJCQlpZiAoKHBvcnQgPCAwKSB8fCAocG9ydCA+IDUxMSkpIHsKLQkJIAkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19SRVNVTUU6IEJhZCBwb3J0IG51bWJlciAlZFxuIiwgcG9ydCk7Ci0JCSAJCQlwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKLQkJIAkJCXJldHVybiAtRUlOVkFMOwotCQkJCX0KLQkJCQlQb3J0UCA9IHAtPlJJT1BvcnRwW3BvcnRdOwotCQkJCWlmICghUG9ydFAtPk1hcHBlZCkgewotCQkgCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1JFU1VNRTogUG9ydCAlZCBub3QgbWFwcGVkXG4iLCBwb3J0KTsKLQkJIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OT1RfTUFQUEVEX0lOVE9fU1lTVEVNOwotCQkgCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCQkJCWlmICghKFBvcnRQLT5TdGF0ZSAmIChSSU9fTE9QRU4gfCBSSU9fTU9QRU4pKSkgewotCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUkVTVU1FOiBQb3J0ICVkIG5vdCBvcGVuXG4iLCBwb3J0KTsKLQkJIAkJCXJldHVybiAtRUlOVkFMOwotCQkJCX0KKwljYXNlIFJJT19SRVNVTUU6CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX1JFU1VNRVxuIik7CisJCXBvcnQgPSAodWludCkgYXJnOworCQlpZiAoKHBvcnQgPCAwKSB8fCAocG9ydCA+IDUxMSkpIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX1JFU1VNRTogQmFkIHBvcnQgbnVtYmVyICVkXG4iLCBwb3J0KTsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJUG9ydFAgPSBwLT5SSU9Qb3J0cFtwb3J0XTsKKwkJaWYgKCFQb3J0UC0+TWFwcGVkKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19SRVNVTUU6IFBvcnQgJWQgbm90IG1hcHBlZFxuIiwgcG9ydCk7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTk9UX01BUFBFRF9JTlRPX1NZU1RFTTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICghKFBvcnRQLT5TdGF0ZSAmIChSSU9fTE9QRU4gfCBSSU9fTU9QRU4pKSkgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fUkVTVU1FOiBQb3J0ICVkIG5vdCBvcGVuXG4iLCBwb3J0KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAKLQkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JCQkJaWYgKFJJT1ByZWVtcHRpdmVDbWQocCwgKHAtPlJJT1BvcnRwW3BvcnRdKSwgUkVTVU1FKSA9PSAKLQkJCQkJCQkJCQlSSU9fRkFJTCkgewotCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUkVTVU1FIGZhaWxlZFxuIik7Ci0JCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwotCQkJCQlyZXR1cm4gLUVCVVNZOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1JFU1VNRTogUG9ydCAlZCByZXN1bWVkXG4iLCBwb3J0KTsKLQkJCQkJUG9ydFAtPlN0YXRlIHw9IFJJT19CVVNZOwotCQkJCX0KLQkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKLQkJCQlyZXR1cm4gcmV0dmFsOworCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCWlmIChSSU9QcmVlbXB0aXZlQ21kKHAsIChwLT5SSU9Qb3J0cFtwb3J0XSksIFJFU1VNRSkgPT0gUklPX0ZBSUwpIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX1JFU1VNRSBmYWlsZWRcbiIpOworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9IGVsc2UgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fUkVTVU1FOiBQb3J0ICVkIHJlc3VtZWRcbiIsIHBvcnQpOworCQkJUG9ydFAtPlN0YXRlIHw9IFJJT19CVVNZOworCQl9CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlyZXR1cm4gcmV0dmFsOwogCi0JCQljYXNlIFJJT19BU1NJR05fUlRBOgotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19BU1NJR05fUlRBXG4iKTsKLQkJCQlpZiAoICFzdSApIHsKLQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0FTU0lHTl9SVEEgIVJvb3RcbiIpOworCWNhc2UgUklPX0FTU0lHTl9SVEE6CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX0FTU0lHTl9SVEFcbiIpOworCQlpZiAoIXN1KSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19BU1NJR05fUlRBICFSb290XG4iKTsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gTk9UX1NVUEVSX1VTRVI7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisJCWlmIChjb3B5aW4oKGludCkgYXJnLCAoY2FkZHJfdCkgJiBNYXBFbnQsIHNpemVvZihNYXBFbnQpKQorCQkgICAgPT0gQ09QWUZBSUwpIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiQ29weSBmcm9tIHVzZXIgc3BhY2UgZmFpbGVkXG4iKTsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJldHVybiBSSU9Bc3NpZ25SdGEocCwgJk1hcEVudCk7CisKKwljYXNlIFJJT19DSEFOR0VfTkFNRToKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fQ0hBTkdFX05BTUVcbiIpOworCQlpZiAoIXN1KSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19DSEFOR0VfTkFNRSAhUm9vdFxuIik7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOworCQkJcmV0dXJuIC1FUEVSTTsKKwkJfQorCQlpZiAoY29weWluKChpbnQpIGFyZywgKGNhZGRyX3QpICYgTWFwRW50LCBzaXplb2YoTWFwRW50KSkKKwkJICAgID09IENPUFlGQUlMKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIkNvcHkgZnJvbSB1c2VyIHNwYWNlIGZhaWxlZFxuIik7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXR1cm4gUklPQ2hhbmdlTmFtZShwLCAmTWFwRW50KTsKKworCWNhc2UgUklPX0RFTEVURV9SVEE6CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX0RFTEVURV9SVEFcbiIpOworCQlpZiAoIXN1KSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19ERUxFVEVfUlRBICFSb290XG4iKTsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gTk9UX1NVUEVSX1VTRVI7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisJCWlmIChjb3B5aW4oKGludCkgYXJnLCAoY2FkZHJfdCkgJiBNYXBFbnQsIHNpemVvZihNYXBFbnQpKQorCQkgICAgPT0gQ09QWUZBSUwpIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiQ29weSBmcm9tIGRhdGEgc3BhY2UgZmFpbGVkXG4iKTsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJldHVybiBSSU9EZWxldGVSdGEocCwgJk1hcEVudCk7CisKKwljYXNlIFJJT19RVUlDS19DSEVDSzoKKwkJLyoKKwkJICoqIDA5LjEyLjE5OTggQVJHIC0gRVNJTCAwNzc2IHBhcnQgZml4CisJCSAqKiBBIGN1c3RvbWVyIHdhcyB1c2luZyB0aGlzIHRvIGdldCB0aGUgUlRBcworCQkgKiogY29ubmVjdC9kaXNjb25uZWN0IHN0YXR1cy4KKwkJICoqIFJJT0NvbkNvbigpIGhhZCBiZWVuIGJvdGNoZWQgdXNlIFJJT0hhbHRlZAorCQkgKiogdG8ga2VlcCB0cmFjayBvZiBSVEEgY29ubmVjdGlvbnMgYW5kCisJCSAqKiBkaXNjb25uZWN0aW9ucy4gVGhhdCBoYXMgYmVlbiBjaGFuZ2VkIGFuZAorCQkgKiogUklPUnRhRGlzQ29ucyBpbiB0aGUgcmlvX2luZm8gc3RydWN0IG5vdworCQkgKiogZG9lcyB0aGUgam9iLiBTbyB3ZSBuZWVkIHRvIHJldHVybiB0aGUgdmFsdWUKKwkJICoqIG9mIFJJT1J0YUNvbnMgaW5zdGVhZCBvZiBSSU9IYWx0ZWQuCisJCSAqKgorCQkgaWYgKGNvcHlvdXQoKGNhZGRyX3QpJnAtPlJJT0hhbHRlZCwoaW50KWFyZywKKwkJIHNpemVvZih1aW50KSk9PUNPUFlGQUlMKSB7CisJCSAqKgorCQkgKi8KKworCQlpZiAoY29weW91dCgoY2FkZHJfdCkgJiBwLT5SSU9SdGFEaXNDb25zLCAoaW50KSBhcmcsIHNpemVvZih1aW50KSkgPT0gQ09QWUZBSUwpIHsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgUklPX0xBU1RfRVJST1I6CisJCWlmIChjb3B5b3V0KChjYWRkcl90KSAmIHAtPlJJT0Vycm9yLCAoaW50KSBhcmcsIHNpemVvZihzdHJ1Y3QgRXJyb3IpKSA9PSBDT1BZRkFJTCkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgUklPX0dFVF9MT0c6CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX0dFVF9MT0dcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKworCWNhc2UgUklPX0dFVF9NT0RUWVBFOgorCQlpZiAoY29weWluKChpbnQpIGFyZywgKGNhZGRyX3QpICYgcG9ydCwgc2l6ZW9mKHVpbnQpKSA9PSBDT1BZRkFJTCkgeworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJHZXQgbW9kdWxlIHR5cGUgZm9yIHBvcnQgJWRcbiIsIHBvcnQpOworCQlpZiAocG9ydCA8IDAgfHwgcG9ydCA+IDUxMSkgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fR0VUX01PRFRZUEU6IEJhZCBwb3J0IG51bWJlciAlZFxuIiwgcG9ydCk7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCVBvcnRQID0gKHAtPlJJT1BvcnRwW3BvcnRdKTsKKwkJaWYgKCFQb3J0UC0+TWFwcGVkKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19HRVRfTU9EVFlQRTogUG9ydCAlZCBub3QgbWFwcGVkXG4iLCBwb3J0KTsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OT1RfTUFQUEVEX0lOVE9fU1lTVEVNOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyoKKwkJICoqIFJldHVybiBtb2R1bGUgdHlwZSBvZiBwb3J0CisJCSAqLworCQlwb3J0ID0gUG9ydFAtPkhvc3RQLT5Vbml4UnVwc1tQb3J0UC0+UnVwTnVtXS5Nb2RUeXBlczsKKwkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpICYgcG9ydCwgKGludCkgYXJnLCBzaXplb2YodWludCkpID09IENPUFlGQUlMKSB7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmV0dXJuICgwKTsKKwkJLyoKKwkJICoqIDAyLjAzLjE5OTkgQVJHIC0gRVNJTCAwODIwIGZpeAorCQkgKiogV2UgYXJlIG5vIGxvbmdlciB1c2luZyAiQm9vdCBNb2RlIiwgc28gdGhlc2UgaW9jdGxzCisJCSAqKiBhcmUgbm90IHJlcXVpcmVkIDoKKwkJICoqCisJCSBjYXNlIFJJT19HRVRfQk9PVF9NT0RFIDoKKwkJIHJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICgiR2V0IGJvb3QgbW9kZSAtICV4XG4iLCBwLT5SSU9Cb290TW9kZSkpOworCQkgKioKKwkJICoqIFJldHVybiBib290IHN0YXRlIG9mIHN5c3RlbSAtIEJPT1RfQUxMLCBCT09UX09XTiBvciBCT09UX05PTkUKKwkJICoqCisJCSBpZiAoY29weW91dCgoY2FkZHJfdCkmcC0+UklPQm9vdE1vZGUsIChpbnQpYXJnLAorCQkgc2l6ZW9mKHAtPlJJT0Jvb3RNb2RlKSkgPT0gQ09QWUZBSUwpIHsKKwkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCSByZXR1cm4gLUVGQVVMVDsKKwkJIH0KKwkJIHJldHVybigwKTsKKworCQkgY2FzZSBSSU9fU0VUX0JPT1RfTU9ERSA6CisJCSBwLT5SSU9Cb290TW9kZSA9ICh1aW50KSBhcmc7CisJCSByaW9fZHByaW50KFJJT19ERUJVR19DVFJMLCAoIlNldCBib290IG1vZGUgdG8gMHgleFxuIiwgcC0+UklPQm9vdE1vZGUpKTsKKwkJIHJldHVybigwKTsKKwkJICoqCisJCSAqKiBFbmQgRVNJTCAwODIwIGZpeAorCQkgKi8KKworCWNhc2UgUklPX0JMT0NLX09QRU5TOgorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIk9wZW5zIGJsb2NrIHVudGlsIGJvb3RlZFxuIik7CisJCWZvciAoRW50cnkgPSAwOyBFbnRyeSA8IFJJT19QT1JUUzsgRW50cnkrKykgeworCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcC0+UklPUG9ydHBbRW50cnldLT5XYWl0VW50aWxCb290ZWQgPSAxOworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFJJT19TRVRVUF9QT1JUUzoKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJTZXR1cCBwb3J0c1xuIik7CisJCWlmIChjb3B5aW4oKGludCkgYXJnLCAoY2FkZHJfdCkgJiBQb3J0U2V0dXAsIHNpemVvZihQb3J0U2V0dXApKQorCQkgICAgPT0gQ09QWUZBSUwpIHsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiRUZBVUxUIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlpZiAoUG9ydFNldHVwLkZyb20gPiBQb3J0U2V0dXAuVG8gfHwgUG9ydFNldHVwLlRvID49IFJJT19QT1JUUykgeworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIkVOWElPIik7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCWlmIChQb3J0U2V0dXAuWHBDcHMgPiBwLT5SSU9Db25mLk1heFhwQ3BzIHx8IFBvcnRTZXR1cC5YcENwcyA8IHAtPlJJT0NvbmYuTWluWHBDcHMpIHsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gWFBSSU5UX0NQU19PVVRfT0ZfUkFOR0U7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIkVJTlZBTCIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKCFwLT5SSU9Qb3J0cCkgeworCQkJY3ByaW50ZigiTm8gcC0+UklPUG9ydHAgYXJyYXkhXG4iKTsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiTm8gcC0+UklPUG9ydHAgYXJyYXkhXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiZW50ZXJpbmcgbG9vcCAoJWQgJWQpIVxuIiwgUG9ydFNldHVwLkZyb20sIFBvcnRTZXR1cC5Ubyk7CisJCWZvciAobG9vcCA9IFBvcnRTZXR1cC5Gcm9tOyBsb29wIDw9IFBvcnRTZXR1cC5UbzsgbG9vcCsrKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgImluIGxvb3AgKCVkKSFcbiIsIGxvb3ApOworCQl9CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiYWZ0ZXIgbG9vcCAoJWQpIVxuIiwgbG9vcCk7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUmV0dmFsOiV4XG4iLCByZXR2YWwpOworCQlyZXR1cm4gcmV0dmFsOworCisJY2FzZSBSSU9fR0VUX1BPUlRfU0VUVVA6CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiR2V0IHBvcnQgc2V0dXBcbiIpOworCQlpZiAoY29weWluKChpbnQpIGFyZywgKGNhZGRyX3QpICYgUG9ydFNldHVwLCBzaXplb2YoUG9ydFNldHVwKSkKKwkJICAgID09IENPUFlGQUlMKSB7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlpZiAoUG9ydFNldHVwLkZyb20gPj0gUklPX1BPUlRTKSB7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKworCQlwb3J0ID0gUG9ydFNldHVwLlRvID0gUG9ydFNldHVwLkZyb207CisJCVBvcnRTZXR1cC5JeEFueSA9IChwLT5SSU9Qb3J0cFtwb3J0XS0+Q29uZmlnICYgUklPX0lYQU5ZKSA/IDEgOiAwOworCQlQb3J0U2V0dXAuSXhPbiA9IChwLT5SSU9Qb3J0cFtwb3J0XS0+Q29uZmlnICYgUklPX0lYT04pID8gMSA6IDA7CisJCVBvcnRTZXR1cC5EcmFpbiA9IChwLT5SSU9Qb3J0cFtwb3J0XS0+Q29uZmlnICYgUklPX1dBSVREUkFJTikgPyAxIDogMDsKKwkJUG9ydFNldHVwLlN0b3JlID0gcC0+UklPUG9ydHBbcG9ydF0tPlN0b3JlOworCQlQb3J0U2V0dXAuTG9jayA9IHAtPlJJT1BvcnRwW3BvcnRdLT5Mb2NrOworCQlQb3J0U2V0dXAuWHBDcHMgPSBwLT5SSU9Qb3J0cFtwb3J0XS0+WHByaW50LlhwQ3BzOworCQliY29weShwLT5SSU9Qb3J0cFtwb3J0XS0+WHByaW50LlhwT24sIFBvcnRTZXR1cC5YcE9uLCBNQVhfWFBfQ1RSTF9MRU4pOworCQliY29weShwLT5SSU9Qb3J0cFtwb3J0XS0+WHByaW50LlhwT2ZmLCBQb3J0U2V0dXAuWHBPZmYsIE1BWF9YUF9DVFJMX0xFTik7CisJCVBvcnRTZXR1cC5YcE9uW01BWF9YUF9DVFJMX0xFTiAtIDFdID0gJ1wwJzsKKwkJUG9ydFNldHVwLlhwT2ZmW01BWF9YUF9DVFJMX0xFTiAtIDFdID0gJ1wwJzsKKworCQlpZiAoY29weW91dCgoY2FkZHJfdCkgJiBQb3J0U2V0dXAsIChpbnQpIGFyZywgc2l6ZW9mKFBvcnRTZXR1cCkpCisJCSAgICA9PSBDT1BZRkFJTCkgeworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJldHVybiByZXR2YWw7CisKKwljYXNlIFJJT19HRVRfUE9SVF9QQVJBTVM6CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiR2V0IHBvcnQgcGFyYW1zXG4iKTsKKwkJaWYgKGNvcHlpbigoaW50KSBhcmcsIChjYWRkcl90KSAmIFBvcnRQYXJhbXMsIHNpemVvZihzdHJ1Y3QgUG9ydFBhcmFtcykpID09IENPUFlGQUlMKSB7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlpZiAoUG9ydFBhcmFtcy5Qb3J0ID49IFJJT19QT1JUUykgeworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCVBvcnRQID0gKHAtPlJJT1BvcnRwW1BvcnRQYXJhbXMuUG9ydF0pOworCQlQb3J0UGFyYW1zLkNvbmZpZyA9IFBvcnRQLT5Db25maWc7CisJCVBvcnRQYXJhbXMuU3RhdGUgPSBQb3J0UC0+U3RhdGU7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUG9ydCAlZFxuIiwgUG9ydFBhcmFtcy5Qb3J0KTsKKworCQlpZiAoY29weW91dCgoY2FkZHJfdCkgJiBQb3J0UGFyYW1zLCAoaW50KSBhcmcsIHNpemVvZihzdHJ1Y3QgUG9ydFBhcmFtcykpID09IENPUFlGQUlMKSB7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHJldHZhbDsKKworCWNhc2UgUklPX0dFVF9QT1JUX1RUWToKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJHZXQgcG9ydCB0dHlcbiIpOworCQlpZiAoY29weWluKChpbnQpIGFyZywgKGNhZGRyX3QpICYgUG9ydFR0eSwgc2l6ZW9mKHN0cnVjdCBQb3J0VHR5KSkKKwkJICAgID09IENPUFlGQUlMKSB7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlpZiAoUG9ydFR0eS5wb3J0ID49IFJJT19QT1JUUykgeworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJQb3J0ICVkXG4iLCBQb3J0VHR5LnBvcnQpOworCQlQb3J0UCA9IChwLT5SSU9Qb3J0cFtQb3J0VHR5LnBvcnRdKTsKKwkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpICYgUG9ydFR0eSwgKGludCkgYXJnLCBzaXplb2Yoc3RydWN0IFBvcnRUdHkpKSA9PSBDT1BZRkFJTCkgeworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJldHVybiByZXR2YWw7CisKKwljYXNlIFJJT19TRVRfUE9SVF9UVFk6CisJCWlmIChjb3B5aW4oKGludCkgYXJnLCAoY2FkZHJfdCkgJiBQb3J0VHR5LCBzaXplb2Yoc3RydWN0IFBvcnRUdHkpKSA9PSBDT1BZRkFJTCkgeworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJTZXQgcG9ydCAlZCB0dHlcbiIsIFBvcnRUdHkucG9ydCk7CisJCWlmIChQb3J0VHR5LnBvcnQgPj0gKHVzaG9ydCkgUklPX1BPUlRTKSB7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKwkJUG9ydFAgPSAocC0+UklPUG9ydHBbUG9ydFR0eS5wb3J0XSk7CisJCVJJT1BhcmFtKFBvcnRQLCBDT05GSUcsIFBvcnRQLT5TdGF0ZSAmIFJJT19NT0RFTSwgT0tfVE9fU0xFRVApOworCQlyZXR1cm4gcmV0dmFsOworCisJY2FzZSBSSU9fU0VUX1BPUlRfUEFSQU1TOgorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlNldCBwb3J0IHBhcmFtc1xuIik7CisJCWlmIChjb3B5aW4oKGludCkgYXJnLCAoY2FkZHJfdCkgJiBQb3J0UGFyYW1zLCBzaXplb2YoUG9ydFBhcmFtcykpCisJCSAgICA9PSBDT1BZRkFJTCkgeworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJaWYgKFBvcnRQYXJhbXMuUG9ydCA+PSAodXNob3J0KSBSSU9fUE9SVFMpIHsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCQlQb3J0UCA9IChwLT5SSU9Qb3J0cFtQb3J0UGFyYW1zLlBvcnRdKTsKKwkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlQb3J0UC0+Q29uZmlnID0gUG9ydFBhcmFtcy5Db25maWc7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlyZXR1cm4gcmV0dmFsOworCisJY2FzZSBSSU9fR0VUX1BPUlRfU1RBVFM6CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX0dFVF9QT1JUX1NUQVRTXG4iKTsKKwkJaWYgKGNvcHlpbigoaW50KSBhcmcsIChjYWRkcl90KSAmIHBvcnRTdGF0cywgc2l6ZW9mKHN0cnVjdCBwb3J0U3RhdHMpKSA9PSBDT1BZRkFJTCkgeworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJaWYgKHBvcnRTdGF0cy5wb3J0ID49IFJJT19QT1JUUykgeworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCVBvcnRQID0gKHAtPlJJT1BvcnRwW3BvcnRTdGF0cy5wb3J0XSk7CisJCXBvcnRTdGF0cy5nYXRoZXIgPSBQb3J0UC0+c3RhdHNHYXRoZXI7CisJCXBvcnRTdGF0cy50eGNoYXJzID0gUG9ydFAtPnR4Y2hhcnM7CisJCXBvcnRTdGF0cy5yeGNoYXJzID0gUG9ydFAtPnJ4Y2hhcnM7CisJCXBvcnRTdGF0cy5vcGVucyA9IFBvcnRQLT5vcGVuczsKKwkJcG9ydFN0YXRzLmNsb3NlcyA9IFBvcnRQLT5jbG9zZXM7CisJCXBvcnRTdGF0cy5pb2N0bHMgPSBQb3J0UC0+aW9jdGxzOworCQlpZiAoY29weW91dCgoY2FkZHJfdCkgJiBwb3J0U3RhdHMsIChpbnQpIGFyZywgc2l6ZW9mKHN0cnVjdCBwb3J0U3RhdHMpKSA9PSBDT1BZRkFJTCkgeworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJldHVybiByZXR2YWw7CisKKwljYXNlIFJJT19SRVNFVF9QT1JUX1NUQVRTOgorCQlwb3J0ID0gKHVpbnQpIGFyZzsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fUkVTRVRfUE9SVF9TVEFUU1xuIik7CisJCWlmIChwb3J0ID49IFJJT19QT1JUUykgeworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCVBvcnRQID0gKHAtPlJJT1BvcnRwW3BvcnRdKTsKKwkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlQb3J0UC0+dHhjaGFycyA9IDA7CisJCVBvcnRQLT5yeGNoYXJzID0gMDsKKwkJUG9ydFAtPm9wZW5zID0gMDsKKwkJUG9ydFAtPmNsb3NlcyA9IDA7CisJCVBvcnRQLT5pb2N0bHMgPSAwOworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJcmV0dXJuIHJldHZhbDsKKworCWNhc2UgUklPX0dBVEhFUl9QT1JUX1NUQVRTOgorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19HQVRIRVJfUE9SVF9TVEFUU1xuIik7CisJCWlmIChjb3B5aW4oKGludCkgYXJnLCAoY2FkZHJfdCkgJiBwb3J0U3RhdHMsIHNpemVvZihzdHJ1Y3QgcG9ydFN0YXRzKSkgPT0gQ09QWUZBSUwpIHsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWlmIChwb3J0U3RhdHMucG9ydCA+PSBSSU9fUE9SVFMpIHsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCQlQb3J0UCA9IChwLT5SSU9Qb3J0cFtwb3J0U3RhdHMucG9ydF0pOworCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCVBvcnRQLT5zdGF0c0dhdGhlciA9IHBvcnRTdGF0cy5nYXRoZXI7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlyZXR1cm4gcmV0dmFsOworCisJY2FzZSBSSU9fUkVBRF9DT05GSUc6CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX1JFQURfQ09ORklHXG4iKTsKKwkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpICYgcC0+UklPQ29uZiwgKGludCkgYXJnLCBzaXplb2Yoc3RydWN0IENvbmYpKSA9PSBDT1BZRkFJTCkgeworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJldHVybiByZXR2YWw7CisKKwljYXNlIFJJT19TRVRfQ09ORklHOgorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19TRVRfQ09ORklHXG4iKTsKKwkJaWYgKCFzdSkgeworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKwkJaWYgKGNvcHlpbigoaW50KSBhcmcsIChjYWRkcl90KSAmIHAtPlJJT0NvbmYsIHNpemVvZihzdHJ1Y3QgQ29uZikpCisJCSAgICA9PSBDT1BZRkFJTCkgeworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJLyoKKwkJICoqIG1vdmUgYSBmZXcgdmFsdWUgYXJvdW5kCisJCSAqLworCQlmb3IgKEhvc3QgPSAwOyBIb3N0IDwgcC0+UklPTnVtSG9zdHM7IEhvc3QrKykKKwkJCWlmICgocC0+UklPSG9zdHNbSG9zdF0uRmxhZ3MgJiBSVU5fU1RBVEUpID09IFJDX1JVTk5JTkcpCisJCQkJV1dPUkQocC0+UklPSG9zdHNbSG9zdF0uUGFybU1hcFAtPnRpbWVyLCBwLT5SSU9Db25mLlRpbWVyKTsKKwkJcmV0dXJuIHJldHZhbDsKKworCWNhc2UgUklPX1NUQVJUX1BPTExFUjoKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fU1RBUlRfUE9MTEVSXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYXNlIFJJT19TVE9QX1BPTExFUjoKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fU1RPUF9QT0xMRVJcbiIpOworCQlpZiAoIXN1KSB7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOworCQkJcmV0dXJuIC1FUEVSTTsKKwkJfQorCQlwLT5SSU9Qb2xsaW5nID0gTk9UX1BPTExJTkc7CisJCXJldHVybiByZXR2YWw7CisKKwljYXNlIFJJT19TRVRERUJVRzoKKwljYXNlIFJJT19HRVRERUJVRzoKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fU0VUREVCVUcvUklPX0dFVERFQlVHXG4iKTsKKwkJaWYgKGNvcHlpbigoaW50KSBhcmcsIChjYWRkcl90KSAmIERlYnVnQ3RybCwgc2l6ZW9mKERlYnVnQ3RybCkpCisJCSAgICA9PSBDT1BZRkFJTCkgeworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJaWYgKERlYnVnQ3RybC5TeXNQb3J0ID09IE5PX1BPUlQpIHsKKwkJCWlmIChjbWQgPT0gUklPX1NFVERFQlVHKSB7CisJCQkJaWYgKCFzdSkgewogCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOwogCQkJCQlyZXR1cm4gLUVQRVJNOwogCQkJCX0KLQkJCQlpZiAoY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmTWFwRW50LCBzaXplb2YoTWFwRW50KSkKLQkJCQkJCQkJCT09IENPUFlGQUlMKSB7Ci0JCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkNvcHkgZnJvbSB1c2VyIHNwYWNlIGZhaWxlZFxuIik7Ci0JCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCXJldHVybiBSSU9Bc3NpZ25SdGEocCwgJk1hcEVudCk7Ci0KLQkJCWNhc2UgUklPX0NIQU5HRV9OQU1FOgotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19DSEFOR0VfTkFNRVxuIik7Ci0JCQkJaWYgKCAhc3UgKSB7Ci0JCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19DSEFOR0VfTkFNRSAhUm9vdFxuIik7Ci0JCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gTk9UX1NVUEVSX1VTRVI7Ci0JCQkJCXJldHVybiAtRVBFUk07Ci0JCQkJfQotCQkJCWlmIChjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZNYXBFbnQsIHNpemVvZihNYXBFbnQpKQotCQkJCQkJPT0gQ09QWUZBSUwpIHsKLQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQ29weSBmcm9tIHVzZXIgc3BhY2UgZmFpbGVkXG4iKTsKLQkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOwotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQl9Ci0JCQkJcmV0dXJuIFJJT0NoYW5nZU5hbWUocCwgJk1hcEVudCk7Ci0KLQkJCWNhc2UgUklPX0RFTEVURV9SVEE6Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0RFTEVURV9SVEFcbiIpOwotCQkJCWlmICggIXN1ICkgewotCQkgCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0RFTEVURV9SVEEgIVJvb3RcbiIpOwotCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKLQkJIAkJCXJldHVybiAtRVBFUk07Ci0JCQkJfQotCQkJCWlmIChjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZNYXBFbnQsIHNpemVvZihNYXBFbnQpKQotCQkJCQkJCT09IENPUFlGQUlMICkgewotCQkgCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQ29weSBmcm9tIGRhdGEgc3BhY2UgZmFpbGVkXG4iKTsKLQkJIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKLQkJIAkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCQlyZXR1cm4gUklPRGVsZXRlUnRhKHAsICZNYXBFbnQpOwotCi0JCQljYXNlIFJJT19RVUlDS19DSEVDSzoKLQkJCQkvKgotCQkJCSoqIDA5LjEyLjE5OTggQVJHIC0gRVNJTCAwNzc2IHBhcnQgZml4Ci0JCQkJKiogQSBjdXN0b21lciB3YXMgdXNpbmcgdGhpcyB0byBnZXQgdGhlIFJUQXMKLQkJCQkqKiBjb25uZWN0L2Rpc2Nvbm5lY3Qgc3RhdHVzLgotCQkJCSoqIFJJT0NvbkNvbigpIGhhZCBiZWVuIGJvdGNoZWQgdXNlIFJJT0hhbHRlZAotCQkJCSoqIHRvIGtlZXAgdHJhY2sgb2YgUlRBIGNvbm5lY3Rpb25zIGFuZAotCQkJCSoqIGRpc2Nvbm5lY3Rpb25zLiBUaGF0IGhhcyBiZWVuIGNoYW5nZWQgYW5kCi0JCQkJKiogUklPUnRhRGlzQ29ucyBpbiB0aGUgcmlvX2luZm8gc3RydWN0IG5vdwotCQkJCSoqIGRvZXMgdGhlIGpvYi4gU28gd2UgbmVlZCB0byByZXR1cm4gdGhlIHZhbHVlCi0JCQkJKiogb2YgUklPUnRhQ29ucyBpbnN0ZWFkIG9mIFJJT0hhbHRlZC4KLQkJCQkqKgotCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KSZwLT5SSU9IYWx0ZWQsKGludClhcmcsCi0JCQkJCQkJc2l6ZW9mKHVpbnQpKT09Q09QWUZBSUwpIHsKLQkJCQkqKgotCQkJCSovCi0KLQkJCQlpZiAoY29weW91dCgoY2FkZHJfdCkmcC0+UklPUnRhRGlzQ29ucywoaW50KWFyZywKLQkJCQkJCQlzaXplb2YodWludCkpPT1DT1BZRkFJTCkgeworCQkJCXAtPnJpb19kZWJ1ZyA9IERlYnVnQ3RybC5EZWJ1ZzsKKwkJCQlwLT5SSU9EZWJ1Z1dhaXQgPSBEZWJ1Z0N0cmwuV2FpdDsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlNldCBnbG9iYWwgZGVidWcgdG8gMHgleCBzZXQgd2FpdCB0byAweCV4XG4iLCBwLT5yaW9fZGVidWcsIHAtPlJJT0RlYnVnV2FpdCk7CisJCQl9IGVsc2UgeworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiR2V0IGdsb2JhbCBkZWJ1ZyAweCV4IHdhaXQgMHgleFxuIiwgcC0+cmlvX2RlYnVnLCBwLT5SSU9EZWJ1Z1dhaXQpOworCQkJCURlYnVnQ3RybC5EZWJ1ZyA9IHAtPnJpb19kZWJ1ZzsKKwkJCQlEZWJ1Z0N0cmwuV2FpdCA9IHAtPlJJT0RlYnVnV2FpdDsKKwkJCQlpZiAoY29weW91dCgoY2FkZHJfdCkgJiBEZWJ1Z0N0cmwsIChpbnQpIGFyZywgc2l6ZW9mKERlYnVnQ3RybCkpID09IENPUFlGQUlMKSB7CisJCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX1NFVC9HRVQgREVCVUc6IGJhZCBwb3J0IG51bWJlciAlZFxuIiwgRGVidWdDdHJsLlN5c1BvcnQpOwogCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOwogCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCQl9Ci0JCQkJcmV0dXJuIDA7CisJCQl9CisJCX0gZWxzZSBpZiAoRGVidWdDdHJsLlN5c1BvcnQgPj0gUklPX1BPUlRTICYmIERlYnVnQ3RybC5TeXNQb3J0ICE9IE5PX1BPUlQpIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX1NFVC9HRVQgREVCVUc6IGJhZCBwb3J0IG51bWJlciAlZFxuIiwgRGVidWdDdHJsLlN5c1BvcnQpOworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQlyZXR1cm4gLUVOWElPOworCQl9IGVsc2UgaWYgKGNtZCA9PSBSSU9fU0VUREVCVUcpIHsKKwkJCWlmICghc3UpIHsKKwkJCQlwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOworCQkJCXJldHVybiAtRVBFUk07CisJCQl9CisJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlwLT5SSU9Qb3J0cFtEZWJ1Z0N0cmwuU3lzUG9ydF0tPkRlYnVnID0gRGVidWdDdHJsLkRlYnVnOworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19TRVRERUJVRyAweCV4XG4iLCBwLT5SSU9Qb3J0cFtEZWJ1Z0N0cmwuU3lzUG9ydF0tPkRlYnVnKTsKKwkJfSBlbHNlIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX0dFVERFQlVHIDB4JXhcbiIsIHAtPlJJT1BvcnRwW0RlYnVnQ3RybC5TeXNQb3J0XS0+RGVidWcpOworCQkJRGVidWdDdHJsLkRlYnVnID0gcC0+UklPUG9ydHBbRGVidWdDdHJsLlN5c1BvcnRdLT5EZWJ1ZzsKKwkJCWlmIChjb3B5b3V0KChjYWRkcl90KSAmIERlYnVnQ3RybCwgKGludCkgYXJnLCBzaXplb2YoRGVidWdDdHJsKSkgPT0gQ09QWUZBSUwpIHsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19HRVRERUJVRzogQmFkIGNvcHkgdG8gdXNlciBzcGFjZVxuIik7CisJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmV0dmFsOwogCi0JCQljYXNlIFJJT19MQVNUX0VSUk9SOgotCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KSZwLT5SSU9FcnJvciwgKGludClhcmcsIAotCQkJCQkJc2l6ZW9mKHN0cnVjdCBFcnJvcikpID09Q09QWUZBSUwgKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQlyZXR1cm4gMDsKKwljYXNlIFJJT19WRVJTSUQ6CisJCS8qCisJCSAqKiBFbnF1aXJlIGFib3V0IHRoZSByZWxlYXNlIGFuZCB2ZXJzaW9uLgorCQkgKiogV2UgcmV0dXJuIE1BWF9WRVJTSU9OX0xFTiBieXRlcywgYmVpbmcgYQorCQkgKiogdGV4dHVhbCBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nLgorCQkgKi8KKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fVkVSU0lEXG4iKTsKKwkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpIFJJT1ZlcnNpZCgpLCAoaW50KSBhcmcsIHNpemVvZihzdHJ1Y3QgcmlvVmVyc2lvbikpID09IENPUFlGQUlMKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19WRVJTSUQ6IEJhZCBjb3B5IHRvIHVzZXIgc3BhY2UgKGhvc3Q9JWQpXG4iLCBIb3N0KTsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXR1cm4gcmV0dmFsOwogCi0JCQljYXNlIFJJT19HRVRfTE9HOgotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19HRVRfTE9HXG4iKTsKLSNpZmRlZiBMT0dHSU5HCi0JCQkJUklPR2V0TG9nKGFyZyk7Ci0JCQkJcmV0dXJuIDA7Ci0jZWxzZQotCQkJCXJldHVybiAtRUlOVkFMOwotI2VuZGlmCisJCS8qCisJCSAqKiAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisJCSAqKiAhISBjb21tZW50ZWQgb3V0IHByZXZpb3VzICdSSU9fVkVSU0lEJyBmdW5jdGlvbmFsaXR5ICEhCisJCSAqKiAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisJCSAqKgorCQkgY2FzZSBSSU9fVkVSU0lEOgorCQkgKioKKwkJICoqIEVucXVpcmUgYWJvdXQgdGhlIHJlbGVhc2UgYW5kIHZlcnNpb24uCisJCSAqKiBXZSByZXR1cm4gTUFYX1ZFUlNJT05fTEVOIGJ5dGVzLCBiZWluZyBhIHRleHR1YWwgbnVsbAorCQkgKiogdGVybWluYXRlZCBzdHJpbmcuCisJCSAqKgorCQkgcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgKCJSSU9fVkVSU0lEXG4iKSk7CisJCSBpZiAoY29weW91dCgoY2FkZHJfdClSSU9WZXJzaWQoKSwKKwkJIChpbnQpYXJnLCBNQVhfVkVSU0lPTl9MRU4gKSA9PSBDT1BZRkFJTCApIHsKKwkJIHJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICgiUklPX1ZFUlNJRDogQmFkIGNvcHkgdG8gdXNlciBzcGFjZVxuIixIb3N0KSk7CisJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkgcmV0dXJuIC1FRkFVTFQ7CisJCSB9CisJCSByZXR1cm4gcmV0dmFsOworCQkgKioKKwkJICoqICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKwkJICovCiAKLQkJCWNhc2UgUklPX0dFVF9NT0RUWVBFOgotCQkJCWlmICggY29weWluKCAoaW50KWFyZywgKGNhZGRyX3QpJnBvcnQsIAotCQkJCQkJCQkJc2l6ZW9mKHVpbnQpKSA9PSBDT1BZRkFJTCApCi0JCQkJewotCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOwotCQkgCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkdldCBtb2R1bGUgdHlwZSBmb3IgcG9ydCAlZFxuIiwgcG9ydCk7Ci0JCQkJaWYgKCBwb3J0IDwgMCB8fCBwb3J0ID4gNTExICkKLQkJCQl7Ci0JCSAJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fR0VUX01PRFRZUEU6IEJhZCBwb3J0IG51bWJlciAlZFxuIiwgcG9ydCk7Ci0JCSAJCQlwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKLQkJIAkJCXJldHVybiAtRUlOVkFMOwotCQkJCX0KLQkJCQlQb3J0UCA9IChwLT5SSU9Qb3J0cFtwb3J0XSk7Ci0JCQkJaWYgKCFQb3J0UC0+TWFwcGVkKQotCQkJCXsKLQkJIAkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19HRVRfTU9EVFlQRTogUG9ydCAlZCBub3QgbWFwcGVkXG4iLCBwb3J0KTsKLQkJIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OT1RfTUFQUEVEX0lOVE9fU1lTVEVNOwotCQkgCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCQkJCS8qCi0JCQkJKiogUmV0dXJuIG1vZHVsZSB0eXBlIG9mIHBvcnQKLQkJCQkqLwotCQkJCXBvcnQgPSBQb3J0UC0+SG9zdFAtPlVuaXhSdXBzW1BvcnRQLT5SdXBOdW1dLk1vZFR5cGVzOwotCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KSZwb3J0LCAoaW50KWFyZywgCi0JCQkJCQkJc2l6ZW9mKHVpbnQpKSA9PSBDT1BZRkFJTCkgewotCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKLQkJIAkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCQlyZXR1cm4oMCk7CisJY2FzZSBSSU9fTlVNX0hPU1RTOgorCQkvKgorCQkgKiogRW5xdWlyZSBhcyB0byB0aGUgbnVtYmVyIG9mIGhvc3RzIGxvY2F0ZWQKKwkJICoqIGF0IGluaXQgdGltZS4KKwkJICovCisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX05VTV9IT1NUU1xuIik7CisJCWlmIChjb3B5b3V0KChjYWRkcl90KSAmIHAtPlJJT051bUhvc3RzLCAoaW50KSBhcmcsIHNpemVvZihwLT5SSU9OdW1Ib3N0cykpID09IENPUFlGQUlMKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19OVU1fSE9TVFM6IEJhZCBjb3B5IHRvIHVzZXIgc3BhY2VcbiIpOworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJldHVybiByZXR2YWw7CisKKwljYXNlIFJJT19IT1NUX0ZPQUQ6CisJCS8qCisJCSAqKiBLaWxsIGhvc3QuIFRoaXMgbWF5IG5vdCBiZSBpbiB0aGUgZmluYWwgdmVyc2lvbi4uLgorCQkgKi8KKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9GT0FEICVkXG4iLCAoaW50KSBhcmcpOworCQlpZiAoIXN1KSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX0ZPQUQ6IE5vdCBzdXBlciB1c2VyXG4iKTsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gTk9UX1NVUEVSX1VTRVI7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisJCXAtPlJJT0hhbHRlZCA9IDE7CisJCXAtPlJJT1N5c3RlbVVwID0gMDsKKworCQlmb3IgKEhvc3QgPSAwOyBIb3N0IDwgcC0+UklPTnVtSG9zdHM7IEhvc3QrKykgeworCQkJKHZvaWQpIFJJT0JvYXJkVGVzdChwLT5SSU9Ib3N0c1tIb3N0XS5QYWRkclAsIHAtPlJJT0hvc3RzW0hvc3RdLkNhZGRyLCBwLT5SSU9Ib3N0c1tIb3N0XS5UeXBlLCBwLT5SSU9Ib3N0c1tIb3N0XS5TbG90KTsKKwkJCWJ6ZXJvKChjYWRkcl90KSAmIHAtPlJJT0hvc3RzW0hvc3RdLkZsYWdzLCAoKGludCkgJnAtPlJJT0hvc3RzW0hvc3RdLl9fX19lbmRfbWFya2VyX19fXykgLSAoKGludCkgJnAtPlJJT0hvc3RzW0hvc3RdLkZsYWdzKSk7CisJCQlwLT5SSU9Ib3N0c1tIb3N0XS5GbGFncyA9IFJDX1dBSVRJTkc7CisJCX0KKwkJUklPRm9hZFdha2V1cChwKTsKKwkJcC0+UklPTnVtQm9vdFBrdHMgPSAwOworCQlwLT5SSU9Cb290aW5nID0gMDsKKwkJcHJpbnRrKCJIRUVFRUVMUCFcbiIpOworCisJCWZvciAobG9vcCA9IDA7IGxvb3AgPCBSSU9fUE9SVFM7IGxvb3ArKykgeworCQkJc3Bpbl9sb2NrX2luaXQoJnAtPlJJT1BvcnRwW2xvb3BdLT5wb3J0U2VtKTsKKwkJCXAtPlJJT1BvcnRwW2xvb3BdLT5JblVzZSA9IE5PVF9JTlVTRTsKKwkJfQorCisJCXAtPlJJT1N5c3RlbVVwID0gMDsKKwkJcmV0dXJuIHJldHZhbDsKKworCWNhc2UgUklPX0RPV05MT0FEOgorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19ET1dOTE9BRFxuIik7CisJCWlmICghc3UpIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX0RPV05MT0FEOiBOb3Qgc3VwZXIgdXNlclxuIik7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOworCQkJcmV0dXJuIC1FUEVSTTsKKwkJfQorCQlpZiAoY29weWluKChpbnQpIGFyZywgKGNhZGRyX3QpICYgRG93bkxvYWQsIHNpemVvZihEb3duTG9hZCkpID09IENPUFlGQUlMKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19ET1dOTE9BRDogQ29weSBpbiBmcm9tIHVzZXIgc3BhY2UgZmFpbGVkXG4iKTsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiQ29waWVkIGluIGRvd25sb2FkIGNvZGUgZm9yIHByb2R1Y3QgY29kZSAweCV4XG4iLCBEb3duTG9hZC5Qcm9kdWN0Q29kZSk7CisKKwkJLyoKKwkJICoqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSBwcm9kdWN0IGNvZGUgaXMgYW4gdW5zaWduZWQgb2JqZWN0IQorCQkgKi8KKwkJaWYgKERvd25Mb2FkLlByb2R1Y3RDb2RlID4gTUFYX1BST0RVQ1QpIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX0RPV05MT0FEOiBCYWQgcHJvZHVjdCBjb2RlICVkIHBhc3NlZFxuIiwgRG93bkxvYWQuUHJvZHVjdENvZGUpOworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBOT19TVUNIX1BST0RVQ1Q7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCS8qCisJCSAqKiBkbyBzb21ldGhpbmchCisJCSAqLworCQlyZXR2YWwgPSAoKihSSU9Cb290VGFibGVbRG93bkxvYWQuUHJvZHVjdENvZGVdKSkgKHAsICZEb3duTG9hZCk7CisJCS8qIDwtLSBQYW5pYyAqLworCQlwLT5SSU9IYWx0ZWQgPSAwOworCQkvKgorCQkgKiogYW5kIGdvIGJhY2ssIGNvbnRlbnQgd2l0aCBhIGpvYiB3ZWxsIGNvbXBsZXRlZC4KKwkJICovCisJCXJldHVybiByZXR2YWw7CisKKwljYXNlIFJJT19QQVJNUzoKKwkJeworCQkJdWludCBob3N0OworCisJCQlpZiAoY29weWluKChpbnQpIGFyZywgKGNhZGRyX3QpICYgaG9zdCwgc2l6ZW9mKGhvc3QpKSA9PSBDT1BZRkFJTCkgeworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUkVROiBDb3B5IGluIGZyb20gdXNlciBzcGFjZSBmYWlsZWRcbiIpOworCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KIAkJCS8qCi0JCQkqKiAwMi4wMy4xOTk5IEFSRyAtIEVTSUwgMDgyMCBmaXgKLQkJCSoqIFdlIGFyZSBubyBsb25nZXIgdXNpbmcgIkJvb3QgTW9kZSIsIHNvIHRoZXNlIGlvY3RscwotCQkJKiogYXJlIG5vdCByZXF1aXJlZCA6Ci0JCQkqKgotCSAJCWNhc2UgUklPX0dFVF9CT09UX01PREUgOgotCQkJCXJpb19kcHJpbnQoUklPX0RFQlVHX0NUUkwsICgiR2V0IGJvb3QgbW9kZSAtICV4XG4iLCBwLT5SSU9Cb290TW9kZSkpOwotCQkJCSoqCi0JCQkJKiogUmV0dXJuIGJvb3Qgc3RhdGUgb2Ygc3lzdGVtIC0gQk9PVF9BTEwsIEJPT1RfT1dOIG9yIEJPT1RfTk9ORQotCQkJCSoqCi0JCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpJnAtPlJJT0Jvb3RNb2RlLCAoaW50KWFyZywgCi0JCQkJCQlzaXplb2YocC0+UklPQm9vdE1vZGUpKSA9PSBDT1BZRkFJTCkgewotCQkgCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKLQkJIAkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCQlyZXR1cm4oMCk7Ci0JCQkKLSAJCQljYXNlIFJJT19TRVRfQk9PVF9NT0RFIDoKLQkJCQlwLT5SSU9Cb290TW9kZSA9ICh1aW50KSBhcmc7Ci0JCQkJcmlvX2RwcmludChSSU9fREVCVUdfQ1RSTCwgKCJTZXQgYm9vdCBtb2RlIHRvIDB4JXhcbiIsIHAtPlJJT0Jvb3RNb2RlKSk7Ci0JCQkJcmV0dXJuKDApOwotCQkJKioKLQkJCSoqIEVuZCBFU0lMIDA4MjAgZml4Ci0JCQkqLworCQkJICoqIEZldGNoIHRoZSBwYXJtbWFwCisJCQkgKi8KKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX1BBUk1TXG4iKTsKKwkJCWlmIChjb3B5b3V0KChjYWRkcl90KSBwLT5SSU9Ib3N0c1tob3N0XS5QYXJtTWFwUCwgKGludCkgYXJnLCBzaXplb2YoUEFSTV9NQVApKSA9PSBDT1BZRkFJTCkgeworCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fUEFSTVM6IENvcHkgb3V0IHRvIHVzZXIgc3BhY2UgZmFpbGVkXG4iKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmV0dmFsOwogCi0JIAkJY2FzZSBSSU9fQkxPQ0tfT1BFTlM6Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiT3BlbnMgYmxvY2sgdW50aWwgYm9vdGVkXG4iKTsKLQkJCQlmb3IgKCBFbnRyeT0wOyBFbnRyeSA8IFJJT19QT1JUUzsgRW50cnkrKyApIHsKLQkJIAkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKLQkJIAkJCXAtPlJJT1BvcnRwW0VudHJ5XS0+V2FpdFVudGlsQm9vdGVkID0gMTsKLQkJIAkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwotCQkJCX0KLQkJCQlyZXR1cm4gMDsKLQkJCQotCSAJCWNhc2UgUklPX1NFVFVQX1BPUlRTOgotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlNldHVwIHBvcnRzXG4iKTsKLQkJCQlpZiAoY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmUG9ydFNldHVwLCBzaXplb2YoUG9ydFNldHVwKSkgCi0JCQkJCQk9PSBDT1BZRkFJTCApIHsKLQkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKLQkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkVGQVVMVCIpOwotCQkJCQkgcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCWlmICggUG9ydFNldHVwLkZyb20gPiBQb3J0U2V0dXAuVG8gfHwgCi0JCQkJCQkJCVBvcnRTZXR1cC5UbyA+PSBSSU9fUE9SVFMgKSB7Ci0JCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKLQkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkVOWElPIik7Ci0JCQkJCSByZXR1cm4gLUVOWElPOwotCQkJCX0KLQkJCQlpZiAoIFBvcnRTZXR1cC5YcENwcyA+IHAtPlJJT0NvbmYuTWF4WHBDcHMgfHwKLQkJCQkJIFBvcnRTZXR1cC5YcENwcyA8IHAtPlJJT0NvbmYuTWluWHBDcHMgKSB7Ci0JCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFhQUklOVF9DUFNfT1VUX09GX1JBTkdFOwotCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiRUlOVkFMIik7Ci0JCQkJCSByZXR1cm4gLUVJTlZBTDsKLQkJCQl9Ci0JCQkJaWYgKCAhcC0+UklPUG9ydHAgKSB7Ci0JCQkJCSBjcHJpbnRmKCJObyBwLT5SSU9Qb3J0cCBhcnJheSFcbiIpOwotCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTm8gcC0+UklPUG9ydHAgYXJyYXkhXG4iKTsKLQkJCQkJIHJldHVybiAtRUlPOwotCQkJCX0KLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJlbnRlcmluZyBsb29wICglZCAlZCkhXG4iLCBQb3J0U2V0dXAuRnJvbSwgUG9ydFNldHVwLlRvKTsKLQkJCQlmb3IgKGxvb3A9UG9ydFNldHVwLkZyb207IGxvb3A8PVBvcnRTZXR1cC5UbzsgbG9vcCsrKSB7Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiaW4gbG9vcCAoJWQpIVxuIiwgbG9vcCk7Ci0jaWYgMAotCQkJCQlQb3J0UCA9IHAtPlJJT1BvcnRwW2xvb3BdOwotCQkJCQlpZiAoICFQb3J0UC0+VHR5UCApCi0JCQkJCQlQb3J0UC0+VHR5UCA9ICZwLT5jaGFubmVsW2xvb3BdOworCWNhc2UgUklPX0hPU1RfUkVROgorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1JFUVxuIik7CisJCWlmIChjb3B5aW4oKGludCkgYXJnLCAoY2FkZHJfdCkgJiBIb3N0UmVxLCBzaXplb2YoSG9zdFJlcSkpID09IENPUFlGQUlMKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1JFUTogQ29weSBpbiBmcm9tIHVzZXIgc3BhY2UgZmFpbGVkXG4iKTsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWlmIChIb3N0UmVxLkhvc3ROdW0gPj0gcC0+UklPTnVtSG9zdHMpIHsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9SRVE6IElsbGVnYWwgaG9zdCBudW1iZXIgJWRcbiIsIEhvc3RSZXEuSG9zdE51bSk7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUmVxdWVzdCBmb3IgaG9zdCAlZFxuIiwgSG9zdFJlcS5Ib3N0TnVtKTsKIAotCQkgCQkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKLQkJCQkJCWlmICggUG9ydFNldHVwLkl4QW55ICkKLQkJCQkJCQlQb3J0UC0+Q29uZmlnIHw9IFJJT19JWEFOWTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlQb3J0UC0+Q29uZmlnICY9IH5SSU9fSVhBTlk7Ci0JCQkJCQlpZiAoIFBvcnRTZXR1cC5JeE9uICkKLQkJCQkJCQlQb3J0UC0+Q29uZmlnIHw9IFJJT19JWE9OOwotCQkJCQkJZWxzZQotCQkJCQkJCVBvcnRQLT5Db25maWcgJj0gflJJT19JWE9OOwotCQkJCQkgCi0JCQkJCSAvKgotCQkJCQkgKiogSWYgdGhlIHBvcnQgbmVlZHMgdG8gd2FpdCBmb3IgYWxsIGEgcHJvY2Vzc2VzIG91dHB1dAotCQkJCQkgKiogdG8gZHJhaW4gYmVmb3JlIGNsb3NpbmcgdGhlbiB0aGlzIGZsYWcgd2lsbCBiZSBzZXQuCi0JCQkJCSAqLwotCQkJCQkgCWlmIChQb3J0U2V0dXAuRHJhaW4pIHsKLQkJCQkJCQlQb3J0UC0+Q29uZmlnIHw9IFJJT19XQUlURFJBSU47Ci0JCQkJCSAJfSBlbHNlIHsKLQkJCQkJCQlQb3J0UC0+Q29uZmlnICY9IH5SSU9fV0FJVERSQUlOOwotCQkJCQkgCX0KLQkJCQkJIC8qCi0JCQkJCSAqKiBTdG9yZSBzZXR0aW5ncyBpZiBsb2NraW5nIG9yIHVubG9ja2luZyBwb3J0IG9yIGlmIHRoZQotCQkJCQkgKiogcG9ydCBpcyBub3QgbG9ja2VkLCB3aGVuIHNldHRpbmcgdGhlIHN0b3JlIG9wdGlvbi4KLQkJCQkJICovCi0JCQkJCSBpZiAoUG9ydFAtPk1hcHBlZCAmJgotCQkJCQkJICgoUG9ydFNldHVwLkxvY2sgJiYgIVBvcnRQLT5Mb2NrKSB8fAotCQkJCQkJCSghUG9ydFAtPkxvY2sgJiYKLQkJCQkJCQkoUG9ydFNldHVwLlN0b3JlICYmICFQb3J0UC0+U3RvcmUpKSkpIHsKLQkJCQkJCVBvcnRQLT5TdG9yZWRUdHkuaWZsYWcgPSBQb3J0UC0+VHR5UC0+dG0uY19pZmxhZzsKLQkJCQkJCVBvcnRQLT5TdG9yZWRUdHkub2ZsYWcgPSBQb3J0UC0+VHR5UC0+dG0uY19vZmxhZzsKLQkJCQkJCVBvcnRQLT5TdG9yZWRUdHkuY2ZsYWcgPSBQb3J0UC0+VHR5UC0+dG0uY19jZmxhZzsKLQkJCQkJCVBvcnRQLT5TdG9yZWRUdHkubGZsYWcgPSBQb3J0UC0+VHR5UC0+dG0uY19sZmxhZzsKLQkJCQkJCVBvcnRQLT5TdG9yZWRUdHkubGluZSA9IFBvcnRQLT5UdHlQLT50bS5jX2xpbmU7Ci0JCQkJCQliY29weShQb3J0UC0+VHR5UC0+dG0uY19jYywgUG9ydFAtPlN0b3JlZFR0eS5jYywKLQkJCQkJIAkJTkNDICsgNSk7Ci0JCQkJCSB9Ci0JCQkJCSBQb3J0UC0+TG9jayA9IFBvcnRTZXR1cC5Mb2NrOwotCQkJCQkgUG9ydFAtPlN0b3JlID0gUG9ydFNldHVwLlN0b3JlOwotCQkJCQkgUG9ydFAtPlhwcmludC5YcENwcyA9IFBvcnRTZXR1cC5YcENwczsKLQkJCQkJIGJjb3B5KFBvcnRTZXR1cC5YcE9uLFBvcnRQLT5YcHJpbnQuWHBPbixNQVhfWFBfQ1RSTF9MRU4pOwotCQkJCQkgYmNvcHkoUG9ydFNldHVwLlhwT2ZmLFBvcnRQLT5YcHJpbnQuWHBPZmYsTUFYX1hQX0NUUkxfTEVOKTsKLQkJCQkJIFBvcnRQLT5YcHJpbnQuWHBPbltNQVhfWFBfQ1RSTF9MRU4tMV0gPSAnXDAnOwotCQkJCQkgUG9ydFAtPlhwcmludC5YcE9mZltNQVhfWFBfQ1RSTF9MRU4tMV0gPSAnXDAnOwotCQkJCQkgUG9ydFAtPlhwcmludC5YcExlbiA9IFJJT1N0cmxlbihQb3J0UC0+WHByaW50LlhwT24pKwotCQkJCQkJCQlSSU9TdHJsZW4oUG9ydFAtPlhwcmludC5YcE9mZik7Ci0JCQkJCSByaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtICwgZmxhZ3MpOwotI2VuZGlmCi0JCQkJfQotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgImFmdGVyIGxvb3AgKCVkKSFcbiIsIGxvb3ApOwotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJldHZhbDoleFxuIiwgcmV0dmFsKTsKLQkJCQlyZXR1cm4gcmV0dmFsOworCQlpZiAoY29weW91dCgoY2FkZHJfdCkgJiBwLT5SSU9Ib3N0c1tIb3N0UmVxLkhvc3ROdW1dLCAoaW50KSBIb3N0UmVxLkhvc3RQLCBzaXplb2Yoc3RydWN0IEhvc3QpKSA9PSBDT1BZRkFJTCkgeworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUkVROiBCYWQgY29weSB0byB1c2VyIHNwYWNlXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJldHVybiByZXR2YWw7CiAKLQkJCWNhc2UgUklPX0dFVF9QT1JUX1NFVFVQIDoKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJHZXQgcG9ydCBzZXR1cFxuIik7Ci0JCQkJaWYgKGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJlBvcnRTZXR1cCwgc2l6ZW9mKFBvcnRTZXR1cCkpIAotCQkJCQkJCT09IENPUFlGQUlMICkgewotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOwotCQkJCQkgcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCWlmICggUG9ydFNldHVwLkZyb20gPj0gUklPX1BPUlRTICkgewotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7Ci0JCQkJCSByZXR1cm4gLUVOWElPOwotCQkJCX0KKwljYXNlIFJJT19IT1NUX0RQUkFNOgorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJlcXVlc3QgZm9yIERQUkFNXG4iKTsKKwkJaWYgKGNvcHlpbigoaW50KSBhcmcsIChjYWRkcl90KSAmIEhvc3REcFJhbSwgc2l6ZW9mKEhvc3REcFJhbSkpID09IENPUFlGQUlMKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX0RQUkFNOiBDb3B5IGluIGZyb20gdXNlciBzcGFjZSBmYWlsZWRcbiIpOworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJaWYgKEhvc3REcFJhbS5Ib3N0TnVtID49IHAtPlJJT051bUhvc3RzKSB7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfRFBSQU06IElsbGVnYWwgaG9zdCBudW1iZXIgJWRcbiIsIEhvc3REcFJhbS5Ib3N0TnVtKTsKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSZXF1ZXN0IGZvciBob3N0ICVkXG4iLCBIb3N0RHBSYW0uSG9zdE51bSk7CiAKLQkJCQlwb3J0ID0gUG9ydFNldHVwLlRvID0gUG9ydFNldHVwLkZyb207Ci0JCQkJUG9ydFNldHVwLkl4QW55ID0gKHAtPlJJT1BvcnRwW3BvcnRdLT5Db25maWcgJiBSSU9fSVhBTlkpID8gCi0JCQkJCQkJCQkJCQkJMSA6IDA7Ci0JCQkJUG9ydFNldHVwLkl4T24gPSAocC0+UklPUG9ydHBbcG9ydF0tPkNvbmZpZyAmIFJJT19JWE9OKSA/IAotCQkJCQkJCQkJCQkJCTEgOiAwOwotCQkJCVBvcnRTZXR1cC5EcmFpbiA9IChwLT5SSU9Qb3J0cFtwb3J0XS0+Q29uZmlnICYgUklPX1dBSVREUkFJTikgPwotCQkJCQkJCQkJCQkJIAkxIDogMDsKLQkJCQlQb3J0U2V0dXAuU3RvcmUgPSBwLT5SSU9Qb3J0cFtwb3J0XS0+U3RvcmU7Ci0JCQkJUG9ydFNldHVwLkxvY2sgPSBwLT5SSU9Qb3J0cFtwb3J0XS0+TG9jazsKLQkJCQlQb3J0U2V0dXAuWHBDcHMgPSBwLT5SSU9Qb3J0cFtwb3J0XS0+WHByaW50LlhwQ3BzOwotCQkJCWJjb3B5KHAtPlJJT1BvcnRwW3BvcnRdLT5YcHJpbnQuWHBPbiwgUG9ydFNldHVwLlhwT24sCi0JCQkJCQkJCQkJCQkJTUFYX1hQX0NUUkxfTEVOKTsKLQkJCQliY29weShwLT5SSU9Qb3J0cFtwb3J0XS0+WHByaW50LlhwT2ZmLCBQb3J0U2V0dXAuWHBPZmYsCi0JCQkJCQkJCQkJCQkJTUFYX1hQX0NUUkxfTEVOKTsKLQkJCQlQb3J0U2V0dXAuWHBPbltNQVhfWFBfQ1RSTF9MRU4tMV0gPSAnXDAnOwotCQkJCVBvcnRTZXR1cC5YcE9mZltNQVhfWFBfQ1RSTF9MRU4tMV0gPSAnXDAnOworCQlpZiAocC0+UklPSG9zdHNbSG9zdERwUmFtLkhvc3ROdW1dLlR5cGUgPT0gUklPX1BDSSkgeworCQkJaW50IG9mZjsKKwkJCS8qIEl0J3MgaGFyZHdhcmUgbGlrZSB0aGlzIHRoYXQgcmVhbGx5IGdldHMgb24gbXkgdGl0cy4gKi8KKwkJCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGNvcHlbc2l6ZW9mKHN0cnVjdCBEcFJhbSldOworCQkJZm9yIChvZmYgPSAwOyBvZmYgPCBzaXplb2Yoc3RydWN0IERwUmFtKTsgb2ZmKyspCisJCQkJY29weVtvZmZdID0gcC0+UklPSG9zdHNbSG9zdERwUmFtLkhvc3ROdW1dLkNhZGRyW29mZl07CisJCQlpZiAoY29weW91dCgoY2FkZHJfdCkgY29weSwgKGludCkgSG9zdERwUmFtLkRwUmFtUCwgc2l6ZW9mKHN0cnVjdCBEcFJhbSkpID09IENPUFlGQUlMKSB7CisJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX0RQUkFNOiBCYWQgY29weSB0byB1c2VyIHNwYWNlXG4iKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJfSBlbHNlIGlmIChjb3B5b3V0KChjYWRkcl90KSBwLT5SSU9Ib3N0c1tIb3N0RHBSYW0uSG9zdE51bV0uQ2FkZHIsIChpbnQpIEhvc3REcFJhbS5EcFJhbVAsIHNpemVvZihzdHJ1Y3QgRHBSYW0pKSA9PSBDT1BZRkFJTCkgeworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfRFBSQU06IEJhZCBjb3B5IHRvIHVzZXIgc3BhY2VcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHJldHZhbDsKIAotCQkJCWlmICggY29weW91dCgoY2FkZHJfdCkmUG9ydFNldHVwLChpbnQpYXJnLHNpemVvZihQb3J0U2V0dXApKQotCQkJCQkJCQkJCQkJCQk9PUNPUFlGQUlMICkgewotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKLQkJCQkJIHJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCQlyZXR1cm4gcmV0dmFsOworCWNhc2UgUklPX1NFVF9CVVNZOgorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19TRVRfQlVTWVxuIik7CisJCWlmICgoaW50KSBhcmcgPCAwIHx8IChpbnQpIGFyZyA+IDUxMSkgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fU0VUX0JVU1k6IEJhZCBwb3J0IG51bWJlciAlZFxuIiwgKGludCkgYXJnKTsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlwLT5SSU9Qb3J0cFsoaW50KSBhcmddLT5TdGF0ZSB8PSBSSU9fQlVTWTsKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCXJldHVybiByZXR2YWw7CiAKLQkJCWNhc2UgUklPX0dFVF9QT1JUX1BBUkFNUyA6Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiR2V0IHBvcnQgcGFyYW1zXG4iKTsKLQkJCQlpZiAoY29weWluKCAoaW50KWFyZywgKGNhZGRyX3QpJlBvcnRQYXJhbXMsCi0JCQkJCXNpemVvZihzdHJ1Y3QgUG9ydFBhcmFtcykpID09IENPUFlGQUlMKSB7Ci0JCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCWlmIChQb3J0UGFyYW1zLlBvcnQgPj0gUklPX1BPUlRTKSB7Ci0JCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOwotCQkJCQlyZXR1cm4gLUVOWElPOwotCQkJCX0KLQkJCQlQb3J0UCA9IChwLT5SSU9Qb3J0cFtQb3J0UGFyYW1zLlBvcnRdKTsKLQkJCQlQb3J0UGFyYW1zLkNvbmZpZyA9IFBvcnRQLT5Db25maWc7Ci0JCQkJUG9ydFBhcmFtcy5TdGF0ZSA9IFBvcnRQLT5TdGF0ZTsKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJQb3J0ICVkXG4iLCBQb3J0UGFyYW1zLlBvcnQpOworCWNhc2UgUklPX0hPU1RfUE9SVDoKKwkJLyoKKwkJICoqIFRoZSBkYWVtb24gd2FudCBwb3J0IGluZm9ybWF0aW9uCisJCSAqKiAocHJvYmFibHkgZm9yIGRlYnVnIHJlYXNvbnMpCisJCSAqLworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1BPUlRcbiIpOworCQlpZiAoY29weWluKChpbnQpIGFyZywgKGNhZGRyX3QpICYgUG9ydFJlcSwgc2l6ZW9mKFBvcnRSZXEpKSA9PSBDT1BZRkFJTCkgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9QT1JUOiBDb3B5IGluIGZyb20gdXNlciBzcGFjZSBmYWlsZWRcbiIpOworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KIAotCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KSZQb3J0UGFyYW1zLCAoaW50KWFyZywgCi0JCQkJCQlzaXplb2Yoc3RydWN0IFBvcnRQYXJhbXMpKSA9PSBDT1BZRkFJTCApIHsKLQkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7Ci0JCQkJCSByZXR1cm4gLUVGQVVMVDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJldHZhbDsKKwkJaWYgKFBvcnRSZXEuU3lzUG9ydCA+PSBSSU9fUE9SVFMpIHsJLyogU3lzUG9ydCBpcyB1bnNpZ25lZCAqLworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9QT1JUOiBJbGxlZ2FsIHBvcnQgbnVtYmVyICVkXG4iLCBQb3J0UmVxLlN5c1BvcnQpOworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUmVxdWVzdCBmb3IgcG9ydCAlZFxuIiwgUG9ydFJlcS5TeXNQb3J0KTsKKwkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpIHAtPlJJT1BvcnRwW1BvcnRSZXEuU3lzUG9ydF0sIChpbnQpIFBvcnRSZXEuUG9ydFAsIHNpemVvZihzdHJ1Y3QgUG9ydCkpID09IENPUFlGQUlMKSB7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9QT1JUOiBCYWQgY29weSB0byB1c2VyIHNwYWNlXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJldHVybiByZXR2YWw7CiAKLQkJCWNhc2UgUklPX0dFVF9QT1JUX1RUWSA6Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiR2V0IHBvcnQgdHR5XG4iKTsKLQkJCQlpZiAoY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmUG9ydFR0eSwgc2l6ZW9mKHN0cnVjdCBQb3J0VHR5KSkgCi0JCQkJCQk9PSBDT1BZRkFJTCkgewotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOwotCQkJCQkgcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCWlmICggUG9ydFR0eS5wb3J0ID49IFJJT19QT1JUUyApIHsKLQkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOwotCQkJCQkgcmV0dXJuIC1FTlhJTzsKLQkJCQl9CisJY2FzZSBSSU9fSE9TVF9SVVA6CisJCS8qCisJCSAqKiBUaGUgZGFlbW9uIHdhbnQgcnVwIGluZm9ybWF0aW9uCisJCSAqKiAocHJvYmFibHkgZm9yIGRlYnVnIHJlYXNvbnMpCisJCSAqLworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1JVUFxuIik7CisJCWlmIChjb3B5aW4oKGludCkgYXJnLCAoY2FkZHJfdCkgJiBSdXBSZXEsIHNpemVvZihSdXBSZXEpKSA9PSBDT1BZRkFJTCkgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9SVVA6IENvcHkgaW4gZnJvbSB1c2VyIHNwYWNlIGZhaWxlZFxuIik7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlpZiAoUnVwUmVxLkhvc3ROdW0gPj0gcC0+UklPTnVtSG9zdHMpIHsJLyogaG9zdCBpcyB1bnNpZ25lZCAqLworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9SVVA6IElsbGVnYWwgaG9zdCBudW1iZXIgJWRcbiIsIFJ1cFJlcS5Ib3N0TnVtKTsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCQlpZiAoUnVwUmVxLlJ1cE51bSA+PSBNQVhfUlVQICsgTElOS1NfUEVSX1VOSVQpIHsJLyogZWVrISAqLworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9SVVA6IElsbGVnYWwgcnVwIG51bWJlciAlZFxuIiwgUnVwUmVxLlJ1cE51bSk7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IFJVUF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJSG9zdFAgPSAmcC0+UklPSG9zdHNbUnVwUmVxLkhvc3ROdW1dOwogCi0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUG9ydCAlZFxuIiwgUG9ydFR0eS5wb3J0KTsKLQkJCQlQb3J0UCA9IChwLT5SSU9Qb3J0cFtQb3J0VHR5LnBvcnRdKTsKLSNpZiAwCi0JCQkJUG9ydFR0eS5UdHkudG0uY19pZmxhZyA9IFBvcnRQLT5UdHlQLT50bS5jX2lmbGFnOwotCQkJCVBvcnRUdHkuVHR5LnRtLmNfb2ZsYWcgPSBQb3J0UC0+VHR5UC0+dG0uY19vZmxhZzsKLQkJCQlQb3J0VHR5LlR0eS50bS5jX2NmbGFnID0gUG9ydFAtPlR0eVAtPnRtLmNfY2ZsYWc7Ci0JCQkJUG9ydFR0eS5UdHkudG0uY19sZmxhZyA9IFBvcnRQLT5UdHlQLT50bS5jX2xmbGFnOwotI2VuZGlmCi0JCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpJlBvcnRUdHksIChpbnQpYXJnLCAKLQkJCQkJCQlzaXplb2Yoc3RydWN0IFBvcnRUdHkpKSA9PSBDT1BZRkFJTCkgewotCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOwotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJldHZhbDsKKwkJaWYgKChIb3N0UC0+RmxhZ3MgJiBSVU5fU1RBVEUpICE9IFJDX1JVTk5JTkcpIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUlVQOiBIb3N0ICVkIG5vdCBydW5uaW5nXG4iLCBSdXBSZXEuSG9zdE51bSk7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfTk9UX1JVTk5JTkc7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJlcXVlc3QgZm9yIHJ1cCAlZCBmcm9tIGhvc3QgJWRcbiIsIFJ1cFJlcS5SdXBOdW0sIFJ1cFJlcS5Ib3N0TnVtKTsKIAotCQkJY2FzZSBSSU9fU0VUX1BPUlRfVFRZIDoKLQkJCQlpZiAoY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmUG9ydFR0eSwgCi0JCQkJCQlzaXplb2Yoc3RydWN0IFBvcnRUdHkpKSA9PSBDT1BZRkFJTCkgewotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOwotCQkJCQkgcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlNldCBwb3J0ICVkIHR0eVxuIiwgUG9ydFR0eS5wb3J0KTsKLQkJCQlpZiAoUG9ydFR0eS5wb3J0ID49ICh1c2hvcnQpIFJJT19QT1JUUykgewotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7Ci0JCQkJCSByZXR1cm4gLUVOWElPOwotCQkJCX0KLQkJCQlQb3J0UCA9IChwLT5SSU9Qb3J0cFtQb3J0VHR5LnBvcnRdKTsKLSNpZiAwCi0JCSAJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKLQkJCQlQb3J0UC0+VHR5UC0+dG0uY19pZmxhZyA9IFBvcnRUdHkuVHR5LnRtLmNfaWZsYWc7Ci0JCQkJUG9ydFAtPlR0eVAtPnRtLmNfb2ZsYWcgPSBQb3J0VHR5LlR0eS50bS5jX29mbGFnOwotCQkJCVBvcnRQLT5UdHlQLT50bS5jX2NmbGFnID0gUG9ydFR0eS5UdHkudG0uY19jZmxhZzsKLQkJCQlQb3J0UC0+VHR5UC0+dG0uY19sZmxhZyA9IFBvcnRUdHkuVHR5LnRtLmNfbGZsYWc7Ci0JCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSAsIGZsYWdzKTsKLSNlbmRpZgorCQlpZiAoY29weW91dCgoY2FkZHJfdCkgSG9zdFAtPlVuaXhSdXBzW1J1cFJlcS5SdXBOdW1dLlJ1cFAsIChpbnQpIFJ1cFJlcS5SdXBQLCBzaXplb2Yoc3RydWN0IFJVUCkpID09IENPUFlGQUlMKSB7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9SVVA6IEJhZCBjb3B5IHRvIHVzZXIgc3BhY2VcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHJldHZhbDsKIAotCQkJCVJJT1BhcmFtKFBvcnRQLCBDT05GSUcsIFBvcnRQLT5TdGF0ZSAmIFJJT19NT0RFTSwgT0tfVE9fU0xFRVApOwotCQkJCXJldHVybiByZXR2YWw7CisJY2FzZSBSSU9fSE9TVF9MUEI6CisJCS8qCisJCSAqKiBUaGUgZGFlbW9uIHdhbnQgbHBiIGluZm9ybWF0aW9uCisJCSAqKiAocHJvYmFibHkgZm9yIGRlYnVnIHJlYXNvbnMpCisJCSAqLworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX0xQQlxuIik7CisJCWlmIChjb3B5aW4oKGludCkgYXJnLCAoY2FkZHJfdCkgJiBMcGJSZXEsIHNpemVvZihMcGJSZXEpKSA9PSBDT1BZRkFJTCkgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9MUEI6IEJhZCBjb3B5IGZyb20gdXNlciBzcGFjZVxuIik7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlpZiAoTHBiUmVxLkhvc3QgPj0gcC0+UklPTnVtSG9zdHMpIHsJLyogaG9zdCBpcyB1bnNpZ25lZCAqLworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9MUEI6IElsbGVnYWwgaG9zdCBudW1iZXIgJWRcbiIsIExwYlJlcS5Ib3N0KTsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCQlpZiAoTHBiUmVxLkxpbmsgPj0gTElOS1NfUEVSX1VOSVQpIHsJLyogZWVrISAqLworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9MUEI6IElsbGVnYWwgbGluayBudW1iZXIgJWRcbiIsIExwYlJlcS5MaW5rKTsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gTElOS19OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJSG9zdFAgPSAmcC0+UklPSG9zdHNbTHBiUmVxLkhvc3RdOwogCi0JCQljYXNlIFJJT19TRVRfUE9SVF9QQVJBTVMgOgotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlNldCBwb3J0IHBhcmFtc1xuIik7Ci0JCQkJaWYgKCBjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZQb3J0UGFyYW1zLCBzaXplb2YoUG9ydFBhcmFtcykpCi0JCQkJCT09IENPUFlGQUlMICkgewotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOwotCQkJCQkgcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCWlmIChQb3J0UGFyYW1zLlBvcnQgPj0gKHVzaG9ydCkgUklPX1BPUlRTKSB7Ci0JCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKLQkJCQkJIHJldHVybiAtRU5YSU87Ci0JCQkJfQotCQkJCVBvcnRQID0gKHAtPlJJT1BvcnRwW1BvcnRQYXJhbXMuUG9ydF0pOwotCQkgCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JCQkJUG9ydFAtPkNvbmZpZyA9IFBvcnRQYXJhbXMuQ29uZmlnOwotCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0gLCBmbGFncyk7Ci0JCQkJcmV0dXJuIHJldHZhbDsKKwkJaWYgKChIb3N0UC0+RmxhZ3MgJiBSVU5fU1RBVEUpICE9IFJDX1JVTk5JTkcpIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfTFBCOiBIb3N0ICVkIG5vdCBydW5uaW5nXG4iLCBMcGJSZXEuSG9zdCk7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfTk9UX1JVTk5JTkc7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJlcXVlc3QgZm9yIGxwYiAlZCBmcm9tIGhvc3QgJWRcbiIsIExwYlJlcS5MaW5rLCBMcGJSZXEuSG9zdCk7CiAKLQkJCWNhc2UgUklPX0dFVF9QT1JUX1NUQVRTIDoKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fR0VUX1BPUlRfU1RBVFNcbiIpOwotCQkJCWlmICggY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmcG9ydFN0YXRzLCAKLQkJCQkJCXNpemVvZihzdHJ1Y3QgcG9ydFN0YXRzKSkgPT0gQ09QWUZBSUwgKSB7Ci0JCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7Ci0JCQkJCSByZXR1cm4gLUVGQVVMVDsKLQkJCQl9Ci0JCQkJaWYgKCBwb3J0U3RhdHMucG9ydCA+PSBSSU9fUE9SVFMgKSB7Ci0JCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKLQkJCQkJIHJldHVybiAtRU5YSU87Ci0JCQkJfQotCQkJCVBvcnRQID0gKHAtPlJJT1BvcnRwW3BvcnRTdGF0cy5wb3J0XSk7Ci0JCQkJcG9ydFN0YXRzLmdhdGhlciA9IFBvcnRQLT5zdGF0c0dhdGhlcjsKLQkJCQlwb3J0U3RhdHMudHhjaGFycyA9IFBvcnRQLT50eGNoYXJzOwotCQkJCXBvcnRTdGF0cy5yeGNoYXJzID0gUG9ydFAtPnJ4Y2hhcnM7Ci0JCQkJcG9ydFN0YXRzLm9wZW5zID0gUG9ydFAtPm9wZW5zOwotCQkJCXBvcnRTdGF0cy5jbG9zZXMgPSBQb3J0UC0+Y2xvc2VzOwotCQkJCXBvcnRTdGF0cy5pb2N0bHMgPSBQb3J0UC0+aW9jdGxzOwotCQkJCWlmICggY29weW91dCgoY2FkZHJfdCkmcG9ydFN0YXRzLCAoaW50KWFyZywgCi0JCQkJCQkJc2l6ZW9mKHN0cnVjdCBwb3J0U3RhdHMpKSA9PSBDT1BZRkFJTCApIHsKLQkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7Ci0JCQkJCSByZXR1cm4gLUVGQVVMVDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJldHZhbDsKKwkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpICYgSG9zdFAtPkxpbmtTdHJQW0xwYlJlcS5MaW5rXSwgKGludCkgTHBiUmVxLkxwYlAsIHNpemVvZihzdHJ1Y3QgTFBCKSkgPT0gQ09QWUZBSUwpIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfTFBCOiBCYWQgY29weSB0byB1c2VyIHNwYWNlXG4iKTsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXR1cm4gcmV0dmFsOwogCi0JCQljYXNlIFJJT19SRVNFVF9QT1JUX1NUQVRTIDoKLQkJCQlwb3J0ID0gKHVpbnQpIGFyZzsKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUkVTRVRfUE9SVF9TVEFUU1xuIik7Ci0JCQkJaWYgKCBwb3J0ID49IFJJT19QT1JUUyApIHsKLQkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOwotCQkJCQkgcmV0dXJuIC1FTlhJTzsKLQkJCQl9Ci0JCQkJUG9ydFAgPSAocC0+UklPUG9ydHBbcG9ydF0pOwotCQkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKLQkJCQlQb3J0UC0+dHhjaGFycwk9IDA7Ci0JCQkJUG9ydFAtPnJ4Y2hhcnMJPSAwOwotCQkJCVBvcnRQLT5vcGVucwk9IDA7Ci0JCQkJUG9ydFAtPmNsb3Nlcwk9IDA7Ci0JCQkJUG9ydFAtPmlvY3Rscwk9IDA7Ci0JCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JCQkJcmV0dXJuIHJldHZhbDsKKwkJLyoKKwkJICoqIEhlcmUgMyBJT0NUTCdzIHRoYXQgYWxsb3cgdXMgdG8gY2hhbmdlIHRoZSB3YXkgaW4gd2hpY2gKKwkJICoqIHJpbyBsb2dzIGVycm9ycy4gc2VuZCB0aGVtIGp1c3QgdG8gc3lzbG9nIG9yIHNlbmQgdGhlbQorCQkgKiogdG8gYm90aCBzeXNsb2cgYW5kIGNvbnNvbGUgb3Igc2VuZCB0aGVtIHRvIGp1c3QgdGhlIGNvbnNvbGUuCisJCSAqKgorCQkgKiogU2VlIFJpb1N0ckJ1ZigpIGluIHV0aWwuYyBmb3IgdGhlIG90aGVyIGhhbGYuCisJCSAqLworCWNhc2UgUklPX1NZU0xPR19PTkxZOgorCQlwLT5SSU9QcmludExvZ1N0YXRlID0gUFJJTlRfVE9fTE9HOwkvKiBKdXN0IHN5c2xvZyAqLworCQlyZXR1cm4gMDsKIAotCQkJY2FzZSBSSU9fR0FUSEVSX1BPUlRfU1RBVFMgOgotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19HQVRIRVJfUE9SVF9TVEFUU1xuIik7Ci0JCQkJaWYgKCBjb3B5aW4oIChpbnQpYXJnLCAoY2FkZHJfdCkmcG9ydFN0YXRzLCAKLQkJCQkJCXNpemVvZihzdHJ1Y3QgcG9ydFN0YXRzKSkgPT0gQ09QWUZBSUwgKSB7Ci0JCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7Ci0JCQkJCSByZXR1cm4gLUVGQVVMVDsKLQkJCQl9Ci0JCQkJaWYgKCBwb3J0U3RhdHMucG9ydCA+PSBSSU9fUE9SVFMgKSB7Ci0JCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKLQkJCQkJIHJldHVybiAtRU5YSU87Ci0JCQkJfQotCQkJCVBvcnRQID0gKHAtPlJJT1BvcnRwW3BvcnRTdGF0cy5wb3J0XSk7Ci0JCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwotCQkJCVBvcnRQLT5zdGF0c0dhdGhlciA9IHBvcnRTdGF0cy5nYXRoZXI7Ci0JCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSAsIGZsYWdzKTsKLQkJCQlyZXR1cm4gcmV0dmFsOworCWNhc2UgUklPX1NZU0xPR19DT05TOgorCQlwLT5SSU9QcmludExvZ1N0YXRlID0gUFJJTlRfVE9fTE9HX0NPTlM7CS8qIHN5c2xvZyBhbmQgY29uc29sZSAqLworCQlyZXR1cm4gMDsKIAotI2lmZGVmIERFQlVHX1NVUFBPUlRFRAotCQkJY2FzZSBSSU9fUkVBRF9MRVZFTFM6Ci0JCQkJewotCQkJCQkgaW50IG51bTsKLQkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19SRUFEX0xFVkVMU1xuIik7Ci0JCQkJCSBmb3IgKCBudW09MDsgUklPRGJJbmZbbnVtXS5GbGFnOyBudW0rKyApIDsKLQkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIiVkIGxldmVscyB0byBjb3B5XG4iLG51bSk7Ci0JCQkJCSBpZiAoY29weW91dCgoY2FkZHJfdClSSU9EYkluZiwoaW50KWFyZywKLQkJCQkJCXNpemVvZihzdHJ1Y3QgRGJJbmYpKihudW0rMSkpPT1DT1BZRkFJTCkgewotCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUmVhZExldmVscyBDb3B5IGZhaWxlZFxuIik7Ci0JCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOwotCQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJCSB9Ci0JCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICIlZCBsZXZlbHMgdG8gY29waWVkXG4iLG51bSk7Ci0JCQkJCSByZXR1cm4gcmV0dmFsOwotCQkJCX0KLSNlbmRpZgorCWNhc2UgUklPX0NPTlNfT05MWToKKwkJcC0+UklPUHJpbnRMb2dTdGF0ZSA9IFBSSU5UX1RPX0NPTlM7CS8qIEp1c3QgY29uc29sZSAqLworCQlyZXR1cm4gMDsKIAotCQkJIGNhc2UgUklPX1JFQURfQ09ORklHOgotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19SRUFEX0NPTkZJR1xuIik7Ci0JCQkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpJnAtPlJJT0NvbmYsIChpbnQpYXJnLCAKLQkJCQkJCQlzaXplb2Yoc3RydWN0IENvbmYpKSA9PUNPUFlGQUlMICkgewotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKLQkJCQkJIHJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCQlyZXR1cm4gcmV0dmFsOworCWNhc2UgUklPX1NJR05BTFNfT046CisJCWlmIChwLT5SSU9TaWduYWxQcm9jZXNzKSB7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IFNJR05BTFNfQUxSRUFEWV9TRVQ7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCXAtPlJJT1NpZ25hbFByb2Nlc3MgPSBnZXRwaWQoKTsKKwkJcC0+UklPUHJpbnREaXNhYmxlZCA9IERPTlRfUFJJTlQ7CisJCXJldHVybiByZXR2YWw7CiAKLQkJCWNhc2UgUklPX1NFVF9DT05GSUc6Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1NFVF9DT05GSUdcbiIpOwotCQkJCWlmICggIXN1ICkgewotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKLQkJCQkJIHJldHVybiAtRVBFUk07Ci0JCQkJfQotCQkJCWlmICggY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmcC0+UklPQ29uZiwgc2l6ZW9mKHN0cnVjdCBDb25mKSApCi0JCQkJCQk9PUNPUFlGQUlMICkgewotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOwotCQkJCQkgcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCS8qCi0JCQkJKiogbW92ZSBhIGZldyB2YWx1ZSBhcm91bmQKLQkJCQkqLwotCQkJCWZvciAoSG9zdD0wOyBIb3N0IDwgcC0+UklPTnVtSG9zdHM7IEhvc3QrKykKLQkJCQkJIGlmICggKHAtPlJJT0hvc3RzW0hvc3RdLkZsYWdzICYgUlVOX1NUQVRFKSA9PSBSQ19SVU5OSU5HICkKLQkJCQkJIAlXV09SRChwLT5SSU9Ib3N0c1tIb3N0XS5QYXJtTWFwUC0+dGltZXIgLCAKLQkJCQkJCQkJcC0+UklPQ29uZi5UaW1lcik7Ci0JCQkJcmV0dXJuIHJldHZhbDsKKwljYXNlIFJJT19TSUdOQUxTX09GRjoKKwkJaWYgKHAtPlJJT1NpZ25hbFByb2Nlc3MgIT0gZ2V0cGlkKCkpIHsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gTk9UX1JFQ0VJVklOR19QUk9DRVNTOworCQkJcmV0dXJuIC1FUEVSTTsKKwkJfQorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIkNsZWFyIHNpZ25hbCBwcm9jZXNzIHRvIHplcm9cbiIpOworCQlwLT5SSU9TaWduYWxQcm9jZXNzID0gMDsKKwkJcmV0dXJuIHJldHZhbDsKIAotCQkJY2FzZSBSSU9fU1RBUlRfUE9MTEVSOgotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19TVEFSVF9QT0xMRVJcbiIpOwotCQkJCXJldHVybiAtRUlOVkFMOworCWNhc2UgUklPX1NFVF9CWVRFX01PREU6CisJCWZvciAoSG9zdCA9IDA7IEhvc3QgPCBwLT5SSU9OdW1Ib3N0czsgSG9zdCsrKQorCQkJaWYgKHAtPlJJT0hvc3RzW0hvc3RdLlR5cGUgPT0gUklPX0FUKQorCQkJCXAtPlJJT0hvc3RzW0hvc3RdLk1vZGUgJj0gfldPUkRfT1BFUkFUSU9OOworCQlyZXR1cm4gcmV0dmFsOwogCi0JCQljYXNlIFJJT19TVE9QX1BPTExFUjoKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fU1RPUF9QT0xMRVJcbiIpOwotCQkJCWlmICggIXN1ICkgewotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKLQkJCQkJIHJldHVybiAtRVBFUk07Ci0JCQkJfQotCQkJCXAtPlJJT1BvbGxpbmcgPSBOT1RfUE9MTElORzsKLQkJCQlyZXR1cm4gcmV0dmFsOworCWNhc2UgUklPX1NFVF9XT1JEX01PREU6CisJCWZvciAoSG9zdCA9IDA7IEhvc3QgPCBwLT5SSU9OdW1Ib3N0czsgSG9zdCsrKQorCQkJaWYgKHAtPlJJT0hvc3RzW0hvc3RdLlR5cGUgPT0gUklPX0FUKQorCQkJCXAtPlJJT0hvc3RzW0hvc3RdLk1vZGUgfD0gV09SRF9PUEVSQVRJT047CisJCXJldHVybiByZXR2YWw7CiAKLQkJCWNhc2UgUklPX1NFVERFQlVHOgotCQkJY2FzZSBSSU9fR0VUREVCVUc6Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1NFVERFQlVHL1JJT19HRVRERUJVR1xuIik7Ci0JCQkJaWYgKCBjb3B5aW4oIChpbnQpYXJnLCAoY2FkZHJfdCkmRGVidWdDdHJsLCBzaXplb2YoRGVidWdDdHJsKSApCi0JCQkJCQkJPT1DT1BZRkFJTCApIHsKLQkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKLQkJCQkJIHJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCQlpZiAoIERlYnVnQ3RybC5TeXNQb3J0ID09IE5PX1BPUlQgKSB7Ci0JCQkJCWlmICggY21kID09IFJJT19TRVRERUJVRyApIHsKLQkJCQkJCWlmICggIXN1ICkgewotCQkJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gTk9UX1NVUEVSX1VTRVI7Ci0JCQkJCQkJcmV0dXJuIC1FUEVSTTsKLQkJCQkJCX0KLQkJCQkJCXAtPnJpb19kZWJ1ZyA9IERlYnVnQ3RybC5EZWJ1ZzsKLQkJCQkJCXAtPlJJT0RlYnVnV2FpdCA9IERlYnVnQ3RybC5XYWl0OwotCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiU2V0IGdsb2JhbCBkZWJ1ZyB0byAweCV4IHNldCB3YWl0IHRvIDB4JXhcbiIsCi0JCQkJCQkJcC0+cmlvX2RlYnVnLHAtPlJJT0RlYnVnV2FpdCk7Ci0JCQkJCX0KLQkJCQkgCWVsc2UgewotCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiR2V0IGdsb2JhbCBkZWJ1ZyAweCV4IHdhaXQgMHgleFxuIiwKLQkJCQkJCQkJCQlwLT5yaW9fZGVidWcscC0+UklPRGVidWdXYWl0KTsKLQkJCQkJCURlYnVnQ3RybC5EZWJ1ZyA9IHAtPnJpb19kZWJ1ZzsKLQkJCQkJCURlYnVnQ3RybC5XYWl0ICA9IHAtPlJJT0RlYnVnV2FpdDsKLQkJCQkJCWlmICggY29weW91dCgoY2FkZHJfdCkmRGVidWdDdHJsLChpbnQpYXJnLAotCQkJCQkJCQlzaXplb2YoRGVidWdDdHJsKSkgPT0gQ09QWUZBSUwgKSB7Ci0JCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1NFVC9HRVQgREVCVUc6IGJhZCBwb3J0IG51bWJlciAlZFxuIiwKLQkJCQkJCQkJCURlYnVnQ3RybC5TeXNQb3J0KTsKLQkJCQkJCSAJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKLQkJCQkJCSAJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoIERlYnVnQ3RybC5TeXNQb3J0ID49IFJJT19QT1JUUyAmJiAKLQkJCQkJCQlEZWJ1Z0N0cmwuU3lzUG9ydCAhPSBOT19QT1JUICkgewotCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1NFVC9HRVQgREVCVUc6IGJhZCBwb3J0IG51bWJlciAlZFxuIiwKLQkJCQkJCQkJCURlYnVnQ3RybC5TeXNQb3J0KTsKLQkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOwotCQkJCQkgcmV0dXJuIC1FTlhJTzsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoIGNtZCA9PSBSSU9fU0VUREVCVUcgKSB7Ci0JCQkJCWlmICggIXN1ICkgewotCQkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBOT1RfU1VQRVJfVVNFUjsKLQkJCQkJCXJldHVybiAtRVBFUk07Ci0JCQkJCX0KLQkJCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwotCQkJCQlwLT5SSU9Qb3J0cFtEZWJ1Z0N0cmwuU3lzUG9ydF0tPkRlYnVnID0gRGVidWdDdHJsLkRlYnVnOwotCQkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtICwgZmxhZ3MpOwotCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fU0VUREVCVUcgMHgleFxuIiwKLQkJCQkJCQkJcC0+UklPUG9ydHBbRGVidWdDdHJsLlN5c1BvcnRdLT5EZWJ1Zyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fR0VUREVCVUcgMHgleFxuIiwKLQkJCQkJCQkJCSBwLT5SSU9Qb3J0cFtEZWJ1Z0N0cmwuU3lzUG9ydF0tPkRlYnVnKTsKLQkJCQkJRGVidWdDdHJsLkRlYnVnID0gcC0+UklPUG9ydHBbRGVidWdDdHJsLlN5c1BvcnRdLT5EZWJ1ZzsKLQkJCQkJaWYgKCBjb3B5b3V0KChjYWRkcl90KSZEZWJ1Z0N0cmwsKGludClhcmcsCi0JCQkJCQkJCXNpemVvZihEZWJ1Z0N0cmwpKT09Q09QWUZBSUwgKSB7Ci0JCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fR0VUREVCVUc6IEJhZCBjb3B5IHRvIHVzZXIgc3BhY2VcbiIpOwotCQkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKLQkJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiByZXR2YWw7CisJY2FzZSBSSU9fU0VUX0ZBU1RfQlVTOgorCQlmb3IgKEhvc3QgPSAwOyBIb3N0IDwgcC0+UklPTnVtSG9zdHM7IEhvc3QrKykKKwkJCWlmIChwLT5SSU9Ib3N0c1tIb3N0XS5UeXBlID09IFJJT19BVCkKKwkJCQlwLT5SSU9Ib3N0c1tIb3N0XS5Nb2RlIHw9IEZBU1RfQVRfQlVTOworCQlyZXR1cm4gcmV0dmFsOwogCi0JCQljYXNlIFJJT19WRVJTSUQ6Ci0JCQkJLyoKLQkJCQkqKiBFbnF1aXJlIGFib3V0IHRoZSByZWxlYXNlIGFuZCB2ZXJzaW9uLgotCQkJCSoqIFdlIHJldHVybiBNQVhfVkVSU0lPTl9MRU4gYnl0ZXMsIGJlaW5nIGEKLQkJCQkqKiB0ZXh0dWFsIG51bGwgdGVybWluYXRlZCBzdHJpbmcuCi0JCQkJKi8KLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fVkVSU0lEXG4iKTsKLQkJCQlpZiAoIGNvcHlvdXQoCShjYWRkcl90KVJJT1ZlcnNpZCgpLAotCQkJCQkJKGludClhcmcsCi0JCQkJCQlzaXplb2Yoc3RydWN0IHJpb1ZlcnNpb24pICkgPT0gQ09QWUZBSUwgKQotCQkJCXsKLQkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgICJSSU9fVkVSU0lEOiBCYWQgY29weSB0byB1c2VyIHNwYWNlIChob3N0PSVkKVxuIiwgSG9zdCk7Ci0JCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOwotCQkJCQkgcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCXJldHVybiByZXR2YWw7CisJY2FzZSBSSU9fU0VUX1NMT1dfQlVTOgorCQlmb3IgKEhvc3QgPSAwOyBIb3N0IDwgcC0+UklPTnVtSG9zdHM7IEhvc3QrKykKKwkJCWlmIChwLT5SSU9Ib3N0c1tIb3N0XS5UeXBlID09IFJJT19BVCkKKwkJCQlwLT5SSU9Ib3N0c1tIb3N0XS5Nb2RlICY9IH5GQVNUX0FUX0JVUzsKKwkJcmV0dXJuIHJldHZhbDsKIAotCQkJLyoKLQkJCSoqICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKLQkJCSoqICEhIGNvbW1lbnRlZCBvdXQgcHJldmlvdXMgJ1JJT19WRVJTSUQnIGZ1bmN0aW9uYWxpdHkgISEKLQkJCSoqICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKLQkJCSoqCi0JCQljYXNlIFJJT19WRVJTSUQ6Ci0JCQkJKioKLQkJCQkqKiBFbnF1aXJlIGFib3V0IHRoZSByZWxlYXNlIGFuZCB2ZXJzaW9uLgotCQkJCSoqIFdlIHJldHVybiBNQVhfVkVSU0lPTl9MRU4gYnl0ZXMsIGJlaW5nIGEgdGV4dHVhbCBudWxsCi0JCQkJKiogdGVybWluYXRlZCBzdHJpbmcuCi0JCQkJKioKLQkJCQlyaW9fZHByaW50KFJJT19ERUJVR19DVFJMLCAoIlJJT19WRVJTSURcbiIpKTsKLQkJCQlpZiAoY29weW91dCgoY2FkZHJfdClSSU9WZXJzaWQoKSwgCi0JCQkJCQkoaW50KWFyZywgTUFYX1ZFUlNJT05fTEVOICkgPT0gQ09QWUZBSUwgKSB7Ci0JCQkJCSByaW9fZHByaW50KFJJT19ERUJVR19DVFJMLCAoIlJJT19WRVJTSUQ6IEJhZCBjb3B5IHRvIHVzZXIgc3BhY2VcbiIsSG9zdCkpOwotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKLQkJCQkJIHJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCQlyZXR1cm4gcmV0dmFsOwotCQkJKioKLQkJCSoqICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKLQkJCSovCisJY2FzZSBSSU9fTUFQX0I1MF9UT181MDoKKwljYXNlIFJJT19NQVBfQjUwX1RPXzU3NjAwOgorCWNhc2UgUklPX01BUF9CMTEwX1RPXzExMDoKKwljYXNlIFJJT19NQVBfQjExMF9UT18xMTUyMDA6CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiQmF1ZCByYXRlIG1hcHBpbmdcbiIpOworCQlwb3J0ID0gKHVpbnQpIGFyZzsKKwkJaWYgKHBvcnQgPCAwIHx8IHBvcnQgPiA1MTEpIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiQmF1ZCByYXRlIG1hcHBpbmc6IEJhZCBwb3J0IG51bWJlciAlZFxuIiwgcG9ydCk7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBSSU9fTUFQX0I1MF9UT181MDoKKwkJCXAtPlJJT1BvcnRwW3BvcnRdLT5Db25maWcgfD0gUklPX01BUF81MF9UT181MDsKKwkJCWJyZWFrOworCQljYXNlIFJJT19NQVBfQjUwX1RPXzU3NjAwOgorCQkJcC0+UklPUG9ydHBbcG9ydF0tPkNvbmZpZyAmPSB+UklPX01BUF81MF9UT181MDsKKwkJCWJyZWFrOworCQljYXNlIFJJT19NQVBfQjExMF9UT18xMTA6CisJCQlwLT5SSU9Qb3J0cFtwb3J0XS0+Q29uZmlnIHw9IFJJT19NQVBfMTEwX1RPXzExMDsKKwkJCWJyZWFrOworCQljYXNlIFJJT19NQVBfQjExMF9UT18xMTUyMDA6CisJCQlwLT5SSU9Qb3J0cFtwb3J0XS0+Q29uZmlnICY9IH5SSU9fTUFQXzExMF9UT18xMTA7CisJCQlicmVhazsKKwkJfQorCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJcmV0dXJuIHJldHZhbDsKIAotCQkJY2FzZSBSSU9fTlVNX0hPU1RTOgotCQkJCS8qCi0JCQkJKiogRW5xdWlyZSBhcyB0byB0aGUgbnVtYmVyIG9mIGhvc3RzIGxvY2F0ZWQKLQkJCQkqKiBhdCBpbml0IHRpbWUuCi0JCQkJKi8KLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fTlVNX0hPU1RTXG4iKTsKLQkJCQlpZiAoY29weW91dCgoY2FkZHJfdCkmcC0+UklPTnVtSG9zdHMsIChpbnQpYXJnLCAKLQkJCQkJCQlzaXplb2YocC0+UklPTnVtSG9zdHMpICk9PUNPUFlGQUlMICkgewotCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX05VTV9IT1NUUzogQmFkIGNvcHkgdG8gdXNlciBzcGFjZVxuIik7Ci0JCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOwotCQkJCQkgcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCXJldHVybiByZXR2YWw7CisJY2FzZSBSSU9fU1RSRUFNX0lORk86CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX1NUUkVBTV9JTkZPXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJCWNhc2UgUklPX0hPU1RfRk9BRDoKLQkJCQkvKgotCQkJCSoqIEtpbGwgaG9zdC4gVGhpcyBtYXkgbm90IGJlIGluIHRoZSBmaW5hbCB2ZXJzaW9uLi4uCi0JCQkJKi8KLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9GT0FEICVkXG4iLCAoaW50KWFyZyk7Ci0JCQkJaWYgKCAhc3UgKSB7Ci0JCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9GT0FEOiBOb3Qgc3VwZXIgdXNlclxuIik7Ci0JCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9TVVBFUl9VU0VSOwotCQkJCQkgcmV0dXJuIC1FUEVSTTsKLQkJCQl9Ci0JCQkJcC0+UklPSGFsdGVkID0gMTsKLQkJCQlwLT5SSU9TeXN0ZW1VcCA9IDA7CisJY2FzZSBSSU9fU0VORF9QQUNLRVQ6CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX1NFTkRfUEFDS0VUXG4iKTsKKwkJaWYgKGNvcHlpbigoaW50KSBhcmcsIChjYWRkcl90KSAmIFNlbmRQYWNrLCBzaXplb2YoU2VuZFBhY2spKSA9PSBDT1BZRkFJTCkgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fU0VORF9QQUNLRVQ6IEJhZCBjb3B5IGZyb20gdXNlciBzcGFjZVxuIik7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlpZiAoU2VuZFBhY2suUG9ydE51bSA+PSAxMjgpIHsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQogCi0JCQkJZm9yICggSG9zdD0wOyBIb3N0PHAtPlJJT051bUhvc3RzOyBIb3N0KysgKSB7Ci0JCQkJCSAodm9pZClSSU9Cb2FyZFRlc3QoIHAtPlJJT0hvc3RzW0hvc3RdLlBhZGRyUCwgCi0JCQkJCQlwLT5SSU9Ib3N0c1tIb3N0XS5DYWRkciwgcC0+UklPSG9zdHNbSG9zdF0uVHlwZSwgCi0JCQkJCQkJCXAtPlJJT0hvc3RzW0hvc3RdLlNsb3QgKTsKLQkJCQkJIGJ6ZXJvKCAoY2FkZHJfdCkmcC0+UklPSG9zdHNbSG9zdF0uRmxhZ3MsIAotCQkJCQkJCSgoaW50KSZwLT5SSU9Ib3N0c1tIb3N0XS5fX19fZW5kX21hcmtlcl9fX18pIC0KLQkJCQkJCQkJICgoaW50KSZwLT5SSU9Ib3N0c1tIb3N0XS5GbGFncykgKTsKLQkJCQkJIHAtPlJJT0hvc3RzW0hvc3RdLkZsYWdzICA9IFJDX1dBSVRJTkc7Ci0jaWYgMAotCQkJCQkgUklPU2V0dXBEYXRhU3RydWN0cyhwKTsKLSNlbmRpZgotCQkJCX0KLQkJCQlSSU9Gb2FkV2FrZXVwKHApOwotCQkJCXAtPlJJT051bUJvb3RQa3RzID0gMDsKLQkJCQlwLT5SSU9Cb290aW5nID0gMDsKLQotI2lmZGVmIFJJTkdCVUZGRVJfU1VQUE9SVAotCQkJCWZvciggbG9vcD0wOyBsb29wPFJJT19QT1JUUzsgbG9vcCsrICkKLQkJCQkJaWYgKCBwLT5SSU9Qb3J0cFtsb29wXS0+VHhSaW5nQnVmZmVyICkKLQkJCQkJCXN5c2ZyZWUoKHZvaWQgKilwLT5SSU9Qb3J0cFtsb29wXS0+VHhSaW5nQnVmZmVyLCAKLQkJCQkJCQlSSU9CdWZmZXJTaXplICk7Ci0jZW5kaWYKLSNpZiAwCi0JCQkJYnplcm8oKGNhZGRyX3QpJnAtPlJJT1BvcnRwWzBdLFJJT19QT1JUUypzaXplb2Yoc3RydWN0IFBvcnQpKTsKLSNlbHNlCi0JCQkJcHJpbnRrICgiSEVFRUVFTFAhXG4iKTsKLSNlbmRpZgotCi0JCQkJZm9yKCBsb29wPTA7IGxvb3A8UklPX1BPUlRTOyBsb29wKysgKSB7Ci0jaWYgMAotCQkJCQlwLT5SSU9Qb3J0cFtsb29wXS0+VHR5UCA9ICZwLT5jaGFubmVsW2xvb3BdOwotI2VuZGlmCi0JCQkJCQotCQkJCQlzcGluX2xvY2tfaW5pdCgmcC0+UklPUG9ydHBbbG9vcF0tPnBvcnRTZW0pOwotCQkJCQlwLT5SSU9Qb3J0cFtsb29wXS0+SW5Vc2UgPSBOT1RfSU5VU0U7Ci0JCQkJfQotCi0JCQkJcC0+UklPU3lzdGVtVXAgPSAwOwotCQkJCXJldHVybiByZXR2YWw7Ci0KLQkJCWNhc2UgUklPX0RPV05MT0FEOgotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19ET1dOTE9BRFxuIik7Ci0JCQkJaWYgKCAhc3UgKSB7Ci0JCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fRE9XTkxPQUQ6IE5vdCBzdXBlciB1c2VyXG4iKTsKLQkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gTk9UX1NVUEVSX1VTRVI7Ci0JCQkJCSByZXR1cm4gLUVQRVJNOwotCQkJCX0KLQkJCQlpZiAoIGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJkRvd25Mb2FkLCAKLQkJCQkJCQlzaXplb2YoRG93bkxvYWQpICk9PUNPUFlGQUlMICkgewotCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0RPV05MT0FEOiBDb3B5IGluIGZyb20gdXNlciBzcGFjZSBmYWlsZWRcbiIpOwotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOwotCQkJCQkgcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkNvcGllZCBpbiBkb3dubG9hZCBjb2RlIGZvciBwcm9kdWN0IGNvZGUgMHgleFxuIiwKLQkJCQkgICAgRG93bkxvYWQuUHJvZHVjdENvZGUpOwotCi0JCQkJLyoKLQkJCQkqKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgcHJvZHVjdCBjb2RlIGlzIGFuIHVuc2lnbmVkIG9iamVjdCEKLQkJCQkqLwotCQkJCWlmICggRG93bkxvYWQuUHJvZHVjdENvZGUgPiBNQVhfUFJPRFVDVCApIHsKLQkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19ET1dOTE9BRDogQmFkIHByb2R1Y3QgY29kZSAlZCBwYXNzZWRcbiIsCi0JCQkJCQkJRG93bkxvYWQuUHJvZHVjdENvZGUpOwotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBOT19TVUNIX1BST0RVQ1Q7Ci0JCQkJCSByZXR1cm4gLUVOWElPOwotCQkJCX0KLQkJCQkvKgotCQkJCSoqIGRvIHNvbWV0aGluZyEKLQkJCQkqLwotCQkJCXJldHZhbCA9ICgqKFJJT0Jvb3RUYWJsZVtEb3duTG9hZC5Qcm9kdWN0Q29kZV0pKShwLCAmRG93bkxvYWQpOwotCQkJCQkJCQkJCS8qIDwtLSBQYW5pYyAqLwotCQkJCXAtPlJJT0hhbHRlZCA9IDA7Ci0JCQkJLyoKLQkJCQkqKiBhbmQgZ28gYmFjaywgY29udGVudCB3aXRoIGEgam9iIHdlbGwgY29tcGxldGVkLgotCQkJCSovCi0JCQkJcmV0dXJuIHJldHZhbDsKLQotCQkJY2FzZSBSSU9fUEFSTVM6Ci0JCQkJewotCQkJCQl1aW50IGhvc3Q7Ci0KLQkJCQkJaWYgKGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJmhvc3QsIAotCQkJCQkJCXNpemVvZihob3N0KSApID09IENPUFlGQUlMICkgewotCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAKLQkJCQkJCQkiUklPX0hPU1RfUkVROiBDb3B5IGluIGZyb20gdXNlciBzcGFjZSBmYWlsZWRcbiIpOwotCQkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOwotCQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJCX0KLQkJCQkJLyoKLQkJCQkJKiogRmV0Y2ggdGhlIHBhcm1tYXAKLQkJCQkJKi8KLQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1BBUk1TXG4iKTsKLQkJCQkJaWYgKCBjb3B5b3V0KCAoY2FkZHJfdClwLT5SSU9Ib3N0c1tob3N0XS5QYXJtTWFwUCwgCi0JCQkJCQkJCShpbnQpYXJnLCBzaXplb2YoUEFSTV9NQVApICk9PUNPUFlGQUlMICkgewotCQkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKLQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19QQVJNUzogQ29weSBvdXQgdG8gdXNlciBzcGFjZSBmYWlsZWRcbiIpOwotCQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHJldHZhbDsKLQotCQkJY2FzZSBSSU9fSE9TVF9SRVE6Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUkVRXG4iKTsKLQkJCQlpZiAoY29weWluKChpbnQpYXJnLCAoY2FkZHJfdCkmSG9zdFJlcSwgCi0JCQkJCQkJc2l6ZW9mKEhvc3RSZXEpICk9PUNPUFlGQUlMICkgewotCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUkVROiBDb3B5IGluIGZyb20gdXNlciBzcGFjZSBmYWlsZWRcbiIpOwotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOwotCQkJCQkgcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCWlmICggSG9zdFJlcS5Ib3N0TnVtID49IHAtPlJJT051bUhvc3RzICkgewotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX05VTUJFUl9PVVRfT0ZfUkFOR0U7Ci0JCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9SRVE6IElsbGVnYWwgaG9zdCBudW1iZXIgJWRcbiIsCi0JCQkJCQkJSG9zdFJlcS5Ib3N0TnVtKTsKLQkJCQkJIHJldHVybiAtRU5YSU87Ci0JCQkJfQotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJlcXVlc3QgZm9yIGhvc3QgJWRcbiIsIEhvc3RSZXEuSG9zdE51bSk7Ci0KLQkJCQlpZiAoY29weW91dCgoY2FkZHJfdCkmcC0+UklPSG9zdHNbSG9zdFJlcS5Ib3N0TnVtXSwgCi0JCQkJCShpbnQpSG9zdFJlcS5Ib3N0UCxzaXplb2Yoc3RydWN0IEhvc3QpICkgPT0gQ09QWUZBSUwpIHsKLQkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKLQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUkVROiBCYWQgY29weSB0byB1c2VyIHNwYWNlXG4iKTsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCXJldHVybiByZXR2YWw7Ci0KLQkJCSBjYXNlIFJJT19IT1NUX0RQUkFNOgotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJlcXVlc3QgZm9yIERQUkFNXG4iKTsKLQkJCQlpZiAoIGNvcHlpbiggKGludClhcmcsIChjYWRkcl90KSZIb3N0RHBSYW0sIAotCQkJCQkJCQlzaXplb2YoSG9zdERwUmFtKSApPT1DT1BZRkFJTCApIHsKLQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfRFBSQU06IENvcHkgaW4gZnJvbSB1c2VyIHNwYWNlIGZhaWxlZFxuIik7Ci0JCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCWlmICggSG9zdERwUmFtLkhvc3ROdW0gPj0gcC0+UklPTnVtSG9zdHMgKSB7Ci0JCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9OVU1CRVJfT1VUX09GX1JBTkdFOwotCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9EUFJBTTogSWxsZWdhbCBob3N0IG51bWJlciAlZFxuIiwKLQkJCQkJCQkJCQlIb3N0RHBSYW0uSG9zdE51bSk7Ci0JCQkJCXJldHVybiAtRU5YSU87Ci0JCQkJfQotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJlcXVlc3QgZm9yIGhvc3QgJWRcbiIsIEhvc3REcFJhbS5Ib3N0TnVtKTsKLQotCQkJCWlmIChwLT5SSU9Ib3N0c1tIb3N0RHBSYW0uSG9zdE51bV0uVHlwZSA9PSBSSU9fUENJKSB7Ci0JCQkJCSBpbnQgb2ZmOwotCQkJCQkgLyogSXQncyBoYXJkd2FyZSBsaWtlIHRoaXMgdGhhdCByZWFsbHkgZ2V0cyBvbiBteSB0aXRzLiAqLwotCQkJCQkgc3RhdGljIHVuc2lnbmVkIGNoYXIgY29weVtzaXplb2Yoc3RydWN0IERwUmFtKV07Ci0JCQkJCWZvciAoIG9mZj0wOyBvZmY8c2l6ZW9mKHN0cnVjdCBEcFJhbSk7IG9mZisrICkKLQkJCQkJCWNvcHlbb2ZmXSA9IHAtPlJJT0hvc3RzW0hvc3REcFJhbS5Ib3N0TnVtXS5DYWRkcltvZmZdOwotCQkJCQlpZiAoIGNvcHlvdXQoIChjYWRkcl90KWNvcHksIChpbnQpSG9zdERwUmFtLkRwUmFtUCwgCi0JCQkJCQkJc2l6ZW9mKHN0cnVjdCBEcFJhbSkgKSA9PSBDT1BZRkFJTCApIHsKLQkJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7Ci0JCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9EUFJBTTogQmFkIGNvcHkgdG8gdXNlciBzcGFjZVxuIik7Ci0JCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChjb3B5b3V0KChjYWRkcl90KXAtPlJJT0hvc3RzW0hvc3REcFJhbS5Ib3N0TnVtXS5DYWRkciwKLQkJCQkJKGludClIb3N0RHBSYW0uRHBSYW1QLCAKLQkJCQkJCXNpemVvZihzdHJ1Y3QgRHBSYW0pICkgPT0gQ09QWUZBSUwgKSB7Ci0JCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOwotCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfRFBSQU06IEJhZCBjb3B5IHRvIHVzZXIgc3BhY2VcbiIpOwotCQkJCQkgcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCXJldHVybiByZXR2YWw7Ci0KLQkJCSBjYXNlIFJJT19TRVRfQlVTWToKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fU0VUX0JVU1lcbiIpOwotCQkJCWlmICggKGludClhcmcgPCAwIHx8IChpbnQpYXJnID4gNTExICkgewotCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1NFVF9CVVNZOiBCYWQgcG9ydCBudW1iZXIgJWRcbiIsKGludClhcmcpOwotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7Ci0JCQkJCSByZXR1cm4gLUVJTlZBTDsKLQkJCQl9Ci0JCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwotCQkJCXAtPlJJT1BvcnRwWyhpbnQpYXJnXS0+U3RhdGUgfD0gUklPX0JVU1k7Ci0JCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSAsIGZsYWdzKTsKLQkJCQlyZXR1cm4gcmV0dmFsOwotCi0JCQkgY2FzZSBSSU9fSE9TVF9QT1JUOgotCQkJCS8qCi0JCQkJKiogVGhlIGRhZW1vbiB3YW50IHBvcnQgaW5mb3JtYXRpb24KLQkJCQkqKiAocHJvYmFibHkgZm9yIGRlYnVnIHJlYXNvbnMpCi0JCQkJKi8KLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9QT1JUXG4iKTsKLQkJCQlpZiAoIGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJlBvcnRSZXEsIAotCQkJCQlzaXplb2YoUG9ydFJlcSkgKT09Q09QWUZBSUwgKSB7Ci0JCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1BPUlQ6IENvcHkgaW4gZnJvbSB1c2VyIHNwYWNlIGZhaWxlZFxuIik7Ci0JCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCi0JCQkJaWYgKFBvcnRSZXEuU3lzUG9ydCA+PSBSSU9fUE9SVFMpIHsgLyogU3lzUG9ydCBpcyB1bnNpZ25lZCAqLwotCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUE9SVDogSWxsZWdhbCBwb3J0IG51bWJlciAlZFxuIiwKLQkJCQkJCQkJCQkJUG9ydFJlcS5TeXNQb3J0KTsKLQkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOwotCQkJCQkgcmV0dXJuIC1FTlhJTzsKLQkJCQl9Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUmVxdWVzdCBmb3IgcG9ydCAlZFxuIiwgUG9ydFJlcS5TeXNQb3J0KTsKLQkJCQlpZiAoY29weW91dCgoY2FkZHJfdClwLT5SSU9Qb3J0cFtQb3J0UmVxLlN5c1BvcnRdLCAKLQkJCQkJCQkgKGludClQb3J0UmVxLlBvcnRQLAotCQkJCQkJCQlzaXplb2Yoc3RydWN0IFBvcnQpICkgPT0gQ09QWUZBSUwpIHsKLQkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7Ci0JCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9QT1JUOiBCYWQgY29weSB0byB1c2VyIHNwYWNlXG4iKTsKLQkJCQkJIHJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCQlyZXR1cm4gcmV0dmFsOwotCi0JCQljYXNlIFJJT19IT1NUX1JVUDoKLQkJCQkvKgotCQkJCSoqIFRoZSBkYWVtb24gd2FudCBydXAgaW5mb3JtYXRpb24KLQkJCQkqKiAocHJvYmFibHkgZm9yIGRlYnVnIHJlYXNvbnMpCi0JCQkJKi8KLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9SVVBcbiIpOwotCQkJCWlmIChjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZSdXBSZXEsIAotCQkJCQkJc2l6ZW9mKFJ1cFJlcSkgKT09Q09QWUZBSUwgKSB7Ci0JCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9SVVA6IENvcHkgaW4gZnJvbSB1c2VyIHNwYWNlIGZhaWxlZFxuIik7Ci0JCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7Ci0JCQkJCSByZXR1cm4gLUVGQVVMVDsKLQkJCQl9Ci0JCQkJaWYgKFJ1cFJlcS5Ib3N0TnVtID49IHAtPlJJT051bUhvc3RzKSB7IC8qIGhvc3QgaXMgdW5zaWduZWQgKi8KLQkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1JVUDogSWxsZWdhbCBob3N0IG51bWJlciAlZFxuIiwKLQkJCQkJCQkJUnVwUmVxLkhvc3ROdW0pOwotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX05VTUJFUl9PVVRfT0ZfUkFOR0U7Ci0JCQkJCSByZXR1cm4gLUVOWElPOwotCQkJCX0KLQkJCQlpZiAoIFJ1cFJlcS5SdXBOdW0gPj0gTUFYX1JVUCtMSU5LU19QRVJfVU5JVCApIHsgLyogZWVrISAqLwotCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfUlVQOiBJbGxlZ2FsIHJ1cCBudW1iZXIgJWRcbiIsCi0JCQkJCQkJUnVwUmVxLlJ1cE51bSk7Ci0JCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFJVUF9OVU1CRVJfT1VUX09GX1JBTkdFOwotCQkJCQkgcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCQkJCUhvc3RQID0gJnAtPlJJT0hvc3RzW1J1cFJlcS5Ib3N0TnVtXTsKLQotCQkJCWlmICgoSG9zdFAtPkZsYWdzICYgUlVOX1NUQVRFKSAhPSBSQ19SVU5OSU5HKSB7Ci0JCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9SVVA6IEhvc3QgJWQgbm90IHJ1bm5pbmdcbiIsCi0JCQkJCQkJUnVwUmVxLkhvc3ROdW0pOwotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX05PVF9SVU5OSU5HOwotCQkJCQkgcmV0dXJuIC1FSU87Ci0JCQkJfQotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJlcXVlc3QgZm9yIHJ1cCAlZCBmcm9tIGhvc3QgJWRcbiIsCi0JCQkJCQlSdXBSZXEuUnVwTnVtLFJ1cFJlcS5Ib3N0TnVtKTsKLQotCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KUhvc3RQLT5Vbml4UnVwc1tSdXBSZXEuUnVwTnVtXS5SdXBQLAotCQkJCQkoaW50KVJ1cFJlcS5SdXBQLHNpemVvZihzdHJ1Y3QgUlVQKSApID09IENPUFlGQUlMKSB7Ci0JCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7Ci0JCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX1JVUDogQmFkIGNvcHkgdG8gdXNlciBzcGFjZVxuIik7Ci0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCQlyZXR1cm4gcmV0dmFsOwotCi0JCQljYXNlIFJJT19IT1NUX0xQQjoKLQkJCQkvKgotCQkJCSoqIFRoZSBkYWVtb24gd2FudCBscGIgaW5mb3JtYXRpb24KLQkJCQkqKiAocHJvYmFibHkgZm9yIGRlYnVnIHJlYXNvbnMpCi0JCQkJKi8KLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9MUEJcbiIpOwotCQkJCWlmIChjb3B5aW4oKGludClhcmcsIChjYWRkcl90KSZMcGJSZXEsIAotCQkJCQlzaXplb2YoTHBiUmVxKSApPT1DT1BZRkFJTCApIHsKLQkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX0xQQjogQmFkIGNvcHkgZnJvbSB1c2VyIHNwYWNlXG4iKTsKLQkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKLQkJCQkJIHJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCQlpZiAoTHBiUmVxLkhvc3QgPj0gcC0+UklPTnVtSG9zdHMpIHsgLyogaG9zdCBpcyB1bnNpZ25lZCAqLwotCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fSE9TVF9MUEI6IElsbGVnYWwgaG9zdCBudW1iZXIgJWRcbiIsCi0JCQkJCQkJTHBiUmVxLkhvc3QpOwotCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfTlVNQkVSX09VVF9PRl9SQU5HRTsKLQkJCQkJcmV0dXJuIC1FTlhJTzsKLQkJCQl9Ci0JCQkJaWYgKCBMcGJSZXEuTGluayA+PSBMSU5LU19QRVJfVU5JVCApIHsgLyogZWVrISAqLwotCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX0hPU1RfTFBCOiBJbGxlZ2FsIGxpbmsgbnVtYmVyICVkXG4iLAotCQkJCQkJCUxwYlJlcS5MaW5rKTsKLQkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gTElOS19OVU1CRVJfT1VUX09GX1JBTkdFOwotCQkJCQkgcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCQkJCUhvc3RQID0gJnAtPlJJT0hvc3RzW0xwYlJlcS5Ib3N0XTsKLQotCQkJCWlmICggKEhvc3RQLT5GbGFncyAmIFJVTl9TVEFURSkgIT0gUkNfUlVOTklORyApIHsKLQkJCQkJIHJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX0xQQjogSG9zdCAlZCBub3QgcnVubmluZ1xuIiwKLQkJCQkJCUxwYlJlcS5Ib3N0ICk7Ci0JCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfTk9UX1JVTk5JTkc7Ci0JCQkJCSByZXR1cm4gLUVJTzsKLQkJCQl9Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUmVxdWVzdCBmb3IgbHBiICVkIGZyb20gaG9zdCAlZFxuIiwKLQkJCQkJTHBiUmVxLkxpbmssIExwYlJlcS5Ib3N0KTsKLQotCQkJCWlmIChjb3B5b3V0KChjYWRkcl90KSZIb3N0UC0+TGlua1N0clBbTHBiUmVxLkxpbmtdLAotCQkJCQkoaW50KUxwYlJlcS5McGJQLHNpemVvZihzdHJ1Y3QgTFBCKSApID09IENPUFlGQUlMKSB7Ci0JCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19IT1NUX0xQQjogQmFkIGNvcHkgdG8gdXNlciBzcGFjZVxuIik7Ci0JCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7Ci0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCQlyZXR1cm4gcmV0dmFsOwotCi0JCQkJLyoKLQkJCQkqKiBIZXJlIDMgSU9DVEwncyB0aGF0IGFsbG93IHVzIHRvIGNoYW5nZSB0aGUgd2F5IGluIHdoaWNoCi0JCQkJKiogcmlvIGxvZ3MgZXJyb3JzLiBzZW5kIHRoZW0ganVzdCB0byBzeXNsb2cgb3Igc2VuZCB0aGVtCi0JCQkJKiogdG8gYm90aCBzeXNsb2cgYW5kIGNvbnNvbGUgb3Igc2VuZCB0aGVtIHRvIGp1c3QgdGhlIGNvbnNvbGUuCi0JCQkJKioKLQkJCQkqKiBTZWUgUmlvU3RyQnVmKCkgaW4gdXRpbC5jIGZvciB0aGUgb3RoZXIgaGFsZi4KLQkJCQkqLwotCQkJY2FzZSBSSU9fU1lTTE9HX09OTFk6Ci0JCQkJcC0+UklPUHJpbnRMb2dTdGF0ZSA9IFBSSU5UX1RPX0xPRzsJLyogSnVzdCBzeXNsb2cgKi8KLQkJCQlyZXR1cm4gMDsKLQotCQkJY2FzZSBSSU9fU1lTTE9HX0NPTlM6Ci0JCQkJcC0+UklPUHJpbnRMb2dTdGF0ZSA9IFBSSU5UX1RPX0xPR19DT05TOy8qIHN5c2xvZyBhbmQgY29uc29sZSAqLwotCQkJCXJldHVybiAwOwotCi0JCQljYXNlIFJJT19DT05TX09OTFk6Ci0JCQkJcC0+UklPUHJpbnRMb2dTdGF0ZSA9IFBSSU5UX1RPX0NPTlM7CS8qIEp1c3QgY29uc29sZSAqLwotCQkJCXJldHVybiAwOwotCi0JCQljYXNlIFJJT19TSUdOQUxTX09OOgotCQkJCWlmICggcC0+UklPU2lnbmFsUHJvY2VzcyApIHsKLQkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gU0lHTkFMU19BTFJFQURZX1NFVDsKLQkJCQkJIHJldHVybiAtRUJVU1k7Ci0JCQkJfQotCQkJCXAtPlJJT1NpZ25hbFByb2Nlc3MgPSBnZXRwaWQoKTsKLQkJCQlwLT5SSU9QcmludERpc2FibGVkID0gRE9OVF9QUklOVDsKLQkJCQlyZXR1cm4gcmV0dmFsOwotCi0JCQljYXNlIFJJT19TSUdOQUxTX09GRjoKLQkJCQlpZiAoIHAtPlJJT1NpZ25hbFByb2Nlc3MgIT0gZ2V0cGlkKCkgKSB7Ci0JCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IE5PVF9SRUNFSVZJTkdfUFJPQ0VTUzsKLQkJCQkJIHJldHVybiAtRVBFUk07Ci0JCQkJfQotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIkNsZWFyIHNpZ25hbCBwcm9jZXNzIHRvIHplcm9cbiIpOwotCQkJCXAtPlJJT1NpZ25hbFByb2Nlc3MgPSAwOwotCQkJCXJldHVybiByZXR2YWw7Ci0KLQkJCWNhc2UgUklPX1NFVF9CWVRFX01PREU6Ci0JCQkJZm9yICggSG9zdD0wOyBIb3N0PHAtPlJJT051bUhvc3RzOyBIb3N0KysgKQotCQkJCQkgaWYgKCBwLT5SSU9Ib3N0c1tIb3N0XS5UeXBlID09IFJJT19BVCApCi0JCQkJCQkgcC0+UklPSG9zdHNbSG9zdF0uTW9kZSAmPSB+V09SRF9PUEVSQVRJT047Ci0JCQkJcmV0dXJuIHJldHZhbDsKLQotCQkJY2FzZSBSSU9fU0VUX1dPUkRfTU9ERToKLQkJCQlmb3IgKCBIb3N0PTA7IEhvc3Q8cC0+UklPTnVtSG9zdHM7IEhvc3QrKyApCi0JCQkJCSBpZiAoIHAtPlJJT0hvc3RzW0hvc3RdLlR5cGUgPT0gUklPX0FUICkKLQkJCQkJCSBwLT5SSU9Ib3N0c1tIb3N0XS5Nb2RlIHw9IFdPUkRfT1BFUkFUSU9OOwotCQkJCXJldHVybiByZXR2YWw7Ci0KLQkJCWNhc2UgUklPX1NFVF9GQVNUX0JVUzoKLQkJCQlmb3IgKCBIb3N0PTA7IEhvc3Q8cC0+UklPTnVtSG9zdHM7IEhvc3QrKyApCi0JCQkJCSBpZiAoIHAtPlJJT0hvc3RzW0hvc3RdLlR5cGUgPT0gUklPX0FUICkKLQkJCQkJCSBwLT5SSU9Ib3N0c1tIb3N0XS5Nb2RlIHw9IEZBU1RfQVRfQlVTOwotCQkJCXJldHVybiByZXR2YWw7Ci0KLQkJCWNhc2UgUklPX1NFVF9TTE9XX0JVUzoKLQkJCQlmb3IgKCBIb3N0PTA7IEhvc3Q8cC0+UklPTnVtSG9zdHM7IEhvc3QrKyApCi0JCQkJCSBpZiAoIHAtPlJJT0hvc3RzW0hvc3RdLlR5cGUgPT0gUklPX0FUICkKLQkJCQkJCSBwLT5SSU9Ib3N0c1tIb3N0XS5Nb2RlICY9IH5GQVNUX0FUX0JVUzsKLQkJCQlyZXR1cm4gcmV0dmFsOwotCi0JCQljYXNlIFJJT19NQVBfQjUwX1RPXzUwOgotCQkJY2FzZSBSSU9fTUFQX0I1MF9UT181NzYwMDoKLQkJCWNhc2UgUklPX01BUF9CMTEwX1RPXzExMDoKLQkJCWNhc2UgUklPX01BUF9CMTEwX1RPXzExNTIwMDoKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJCYXVkIHJhdGUgbWFwcGluZ1xuIik7Ci0JCQkJcG9ydCA9ICh1aW50KSBhcmc7Ci0JCQkJaWYgKCBwb3J0IDwgMCB8fCBwb3J0ID4gNTExICkgewotCQkJCQkgcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQmF1ZCByYXRlIG1hcHBpbmc6IEJhZCBwb3J0IG51bWJlciAlZFxuIiwgcG9ydCk7Ci0JCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKLQkJCQkJIHJldHVybiAtRUlOVkFMOwotCQkJCX0KLQkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JCQkJc3dpdGNoKCBjbWQgKQotCQkJCXsKLQkJCQkJY2FzZSBSSU9fTUFQX0I1MF9UT181MCA6Ci0JCQkJCQlwLT5SSU9Qb3J0cFtwb3J0XS0+Q29uZmlnIHw9IFJJT19NQVBfNTBfVE9fNTA7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBSSU9fTUFQX0I1MF9UT181NzYwMCA6Ci0JCQkJCQlwLT5SSU9Qb3J0cFtwb3J0XS0+Q29uZmlnICY9IH5SSU9fTUFQXzUwX1RPXzUwOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgUklPX01BUF9CMTEwX1RPXzExMCA6Ci0JCQkJCQlwLT5SSU9Qb3J0cFtwb3J0XS0+Q29uZmlnIHw9IFJJT19NQVBfMTEwX1RPXzExMDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFJJT19NQVBfQjExMF9UT18xMTUyMDAgOgotCQkJCQkJcC0+UklPUG9ydHBbcG9ydF0tPkNvbmZpZyAmPSB+UklPX01BUF8xMTBfVE9fMTEwOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0gLCBmbGFncyk7Ci0JCQkJcmV0dXJuIHJldHZhbDsKLQotCQkJY2FzZSBSSU9fU1RSRUFNX0lORk86Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1NUUkVBTV9JTkZPXG4iKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJY2FzZSBSSU9fU0VORF9QQUNLRVQ6Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX1NFTkRfUEFDS0VUXG4iKTsKLQkJCQlpZiAoIGNvcHlpbiggKGludClhcmcsIChjYWRkcl90KSZTZW5kUGFjaywKLQkJCQkJCQkJCXNpemVvZihTZW5kUGFjaykgKT09Q09QWUZBSUwgKSB7Ci0JCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fU0VORF9QQUNLRVQ6IEJhZCBjb3B5IGZyb20gdXNlciBzcGFjZVxuIik7Ci0JCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7Ci0JCQkJCSByZXR1cm4gLUVGQVVMVDsKLQkJCQl9Ci0JCQkJaWYgKCBTZW5kUGFjay5Qb3J0TnVtID49IDEyOCApIHsKLQkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOwotCQkJCQkgcmV0dXJuIC1FTlhJTzsKLQkJCQl9Ci0KLQkJCQlQb3J0UCA9IHAtPlJJT1BvcnRwW1NlbmRQYWNrLlBvcnROdW1dOwotCQkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJUG9ydFAgPSBwLT5SSU9Qb3J0cFtTZW5kUGFjay5Qb3J0TnVtXTsKKwkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwogCi0JCQkJaWYgKCAhY2FuX2FkZF90cmFuc21pdCgmUGFja2V0UCxQb3J0UCkgKSB7Ci0JCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFVOSVRfSVNfSU5fVVNFOwotCQkJCQkgcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSAsIGZsYWdzKTsKLQkJCQkJIHJldHVybiAtRU5PU1BDOwotCQkJCX0KKwkJaWYgKCFjYW5fYWRkX3RyYW5zbWl0KCZQYWNrZXRQLCBQb3J0UCkpIHsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gVU5JVF9JU19JTl9VU0U7CisJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCXJldHVybiAtRU5PU1BDOworCQl9CiAKLQkJCQlmb3IgKCBsb29wPTA7IGxvb3A8KHVzaG9ydCkoU2VuZFBhY2suTGVuICYgMTI3KTsgbG9vcCsrICkKLQkJCQkJIFdCWVRFKFBhY2tldFAtPmRhdGFbbG9vcF0sIFNlbmRQYWNrLkRhdGFbbG9vcF0gKTsKKwkJZm9yIChsb29wID0gMDsgbG9vcCA8ICh1c2hvcnQpIChTZW5kUGFjay5MZW4gJiAxMjcpOyBsb29wKyspCisJCQlXQllURShQYWNrZXRQLT5kYXRhW2xvb3BdLCBTZW5kUGFjay5EYXRhW2xvb3BdKTsKIAotCQkJCVdCWVRFKFBhY2tldFAtPmxlbiwgU2VuZFBhY2suTGVuKTsKKwkJV0JZVEUoUGFja2V0UC0+bGVuLCBTZW5kUGFjay5MZW4pOwogCi0JCQkJYWRkX3RyYW5zbWl0KCBQb3J0UCApOwotCQkJCS8qCi0JCQkJKiogQ291bnQgY2hhcmFjdGVycyB0cmFuc21pdHRlZCBmb3IgcG9ydCBzdGF0aXN0aWNzIHJlcG9ydGluZwotCQkJCSovCi0JCQkJaWYgKFBvcnRQLT5zdGF0c0dhdGhlcikKLQkJCQkJIFBvcnRQLT50eGNoYXJzICs9IChTZW5kUGFjay5MZW4gJiAxMjcpOwotCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0gLCBmbGFncyk7Ci0JCQkJcmV0dXJuIHJldHZhbDsKKwkJYWRkX3RyYW5zbWl0KFBvcnRQKTsKKwkJLyoKKwkJICoqIENvdW50IGNoYXJhY3RlcnMgdHJhbnNtaXR0ZWQgZm9yIHBvcnQgc3RhdGlzdGljcyByZXBvcnRpbmcKKwkJICovCisJCWlmIChQb3J0UC0+c3RhdHNHYXRoZXIpCisJCQlQb3J0UC0+dHhjaGFycyArPSAoU2VuZFBhY2suTGVuICYgMTI3KTsKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCXJldHVybiByZXR2YWw7CiAKLQkJCWNhc2UgUklPX05PX01FU0c6Ci0JCQkJaWYgKCBzdSApCi0JCQkJCSBwLT5SSU9Ob01lc3NhZ2UgPSAxOwotCQkJCXJldHVybiBzdSA/IDAgOiAtRVBFUk07CisJY2FzZSBSSU9fTk9fTUVTRzoKKwkJaWYgKHN1KQorCQkJcC0+UklPTm9NZXNzYWdlID0gMTsKKwkJcmV0dXJuIHN1ID8gMCA6IC1FUEVSTTsKIAotCQkJY2FzZSBSSU9fTUVTRzoKLQkJCQlpZiAoIHN1ICkKLQkJCQkJcC0+UklPTm9NZXNzYWdlID0gMDsKLQkJCQlyZXR1cm4gc3UgPyAwIDogLUVQRVJNOworCWNhc2UgUklPX01FU0c6CisJCWlmIChzdSkKKwkJCXAtPlJJT05vTWVzc2FnZSA9IDA7CisJCXJldHVybiBzdSA/IDAgOiAtRVBFUk07CiAKLQkJCWNhc2UgUklPX1dIQVRfTUVTRzoKLQkJCQlpZiAoIGNvcHlvdXQoIChjYWRkcl90KSZwLT5SSU9Ob01lc3NhZ2UsIChpbnQpYXJnLCAKLQkJCQkJc2l6ZW9mKHAtPlJJT05vTWVzc2FnZSkgKT09Q09QWUZBSUwgKSB7Ci0JCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19XSEFUX01FU0c6IEJhZCBjb3B5IHRvIHVzZXIgc3BhY2VcbiIpOwotCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOwotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQl9Ci0JCQkJcmV0dXJuIDA7CisJY2FzZSBSSU9fV0hBVF9NRVNHOgorCQlpZiAoY29weW91dCgoY2FkZHJfdCkgJiBwLT5SSU9Ob01lc3NhZ2UsIChpbnQpIGFyZywgc2l6ZW9mKHAtPlJJT05vTWVzc2FnZSkpID09IENPUFlGQUlMKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19XSEFUX01FU0c6IEJhZCBjb3B5IHRvIHVzZXIgc3BhY2VcbiIpOworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJldHVybiAwOwogCi0JCQljYXNlIFJJT19NRU1fRFVNUCA6Ci0JCQkJaWYgKGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJlN1YkNtZCwgCi0JCQkJCQlzaXplb2Yoc3RydWN0IFN1YkNtZFN0cnVjdCkpID09IENPUFlGQUlMKSB7Ci0JCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7Ci0JCQkJCSByZXR1cm4gLUVGQVVMVDsKLQkJCQl9Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUklPX01FTV9EVU1QIGhvc3QgJWQgcnVwICVkIGFkZHIgJXhcbiIsIAotCQkJCQkJU3ViQ21kLkhvc3QsIFN1YkNtZC5SdXAsIFN1YkNtZC5BZGRyKTsKKwljYXNlIFJJT19NRU1fRFVNUDoKKwkJaWYgKGNvcHlpbigoaW50KSBhcmcsIChjYWRkcl90KSAmIFN1YkNtZCwgc2l6ZW9mKHN0cnVjdCBTdWJDbWRTdHJ1Y3QpKSA9PSBDT1BZRkFJTCkgeworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fTUVNX0RVTVAgaG9zdCAlZCBydXAgJWQgYWRkciAleFxuIiwgU3ViQ21kLkhvc3QsIFN1YkNtZC5SdXAsIFN1YkNtZC5BZGRyKTsKIAotCQkJCWlmIChTdWJDbWQuUnVwID49IE1BWF9SVVArTElOS1NfUEVSX1VOSVQgKSB7Ci0JCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IFJVUF9OVU1CRVJfT1VUX09GX1JBTkdFOwotCQkJCQkgcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQorCQlpZiAoU3ViQ21kLlJ1cCA+PSBNQVhfUlVQICsgTElOS1NfUEVSX1VOSVQpIHsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gUlVQX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCi0JCQkJaWYgKFN1YkNtZC5Ib3N0ID49IHAtPlJJT051bUhvc3RzICkgewotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX05VTUJFUl9PVVRfT0ZfUkFOR0U7Ci0JCQkJCSByZXR1cm4gLUVJTlZBTDsKLQkJCQl9CisJCWlmIChTdWJDbWQuSG9zdCA+PSBwLT5SSU9OdW1Ib3N0cykgeworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCi0JCQkJcG9ydCA9IHAtPlJJT0hvc3RzW1N1YkNtZC5Ib3N0XS4KLQkJCQkJCQkJVW5peFJ1cHNbU3ViQ21kLlJ1cF0uQmFzZVN5c1BvcnQ7CisJCXBvcnQgPSBwLT5SSU9Ib3N0c1tTdWJDbWQuSG9zdF0uVW5peFJ1cHNbU3ViQ21kLlJ1cF0uQmFzZVN5c1BvcnQ7CiAKLQkJCQlQb3J0UCA9IHAtPlJJT1BvcnRwW3BvcnRdOworCQlQb3J0UCA9IHAtPlJJT1BvcnRwW3BvcnRdOwogCi0JCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CiAKLQkJCQlpZiAoIFJJT1ByZWVtcHRpdmVDbWQocCwgIFBvcnRQLCBNRU1EVU1QICkgPT0gUklPX0ZBSUwgKSB7Ci0JCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fTUVNX0RVTVAgZmFpbGVkXG4iKTsKLQkJCQkJIHJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmUG9ydFAtPnBvcnRTZW0gLCBmbGFncyk7Ci0JCQkJCSByZXR1cm4gLUVCVVNZOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCSBQb3J0UC0+U3RhdGUgfD0gUklPX0JVU1k7CisJCWlmIChSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLCBNRU1EVU1QKSA9PSBSSU9fRkFJTCkgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fTUVNX0RVTVAgZmFpbGVkXG4iKTsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfSBlbHNlCisJCQlQb3J0UC0+U3RhdGUgfD0gUklPX0JVU1k7CiAKLQkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtICwgZmxhZ3MpOwotCQkJCWlmICggY29weW91dCggKGNhZGRyX3QpcC0+UklPTWVtRHVtcCwgKGludClhcmcsIAotCQkJCQkJCU1FTURVTVBfU0laRSkgPT0gQ09QWUZBSUwgKSB7Ci0JCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fTUVNX0RVTVAgY29weSBmYWlsZWRcbiIpOwotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKLQkJCQkJIHJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCQlyZXR1cm4gMDsKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCWlmIChjb3B5b3V0KChjYWRkcl90KSBwLT5SSU9NZW1EdW1wLCAoaW50KSBhcmcsIE1FTURVTVBfU0laRSkgPT0gQ09QWUZBSUwpIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX01FTV9EVU1QIGNvcHkgZmFpbGVkXG4iKTsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXR1cm4gMDsKIAotCQkJY2FzZSBSSU9fVElDSzoKLQkJCQlpZiAoKGludClhcmcgPCAwIHx8IChpbnQpYXJnID49IHAtPlJJT051bUhvc3RzKQotCQkJCQkgcmV0dXJuIC1FSU5WQUw7Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiU2V0IGludGVycnVwdCBmb3IgaG9zdCAlZFxuIiwgKGludClhcmcpOwotCQkJCVdCWVRFKHAtPlJJT0hvc3RzWyhpbnQpYXJnXS5TZXRJbnQgLCAweGZmKTsKLQkJCQlyZXR1cm4gMDsKKwljYXNlIFJJT19USUNLOgorCQlpZiAoKGludCkgYXJnIDwgMCB8fCAoaW50KSBhcmcgPj0gcC0+UklPTnVtSG9zdHMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJTZXQgaW50ZXJydXB0IGZvciBob3N0ICVkXG4iLCAoaW50KSBhcmcpOworCQlXQllURShwLT5SSU9Ib3N0c1soaW50KSBhcmddLlNldEludCwgMHhmZik7CisJCXJldHVybiAwOwogCi0JCQljYXNlIFJJT19UT0NLOgotCQkJCWlmICgoaW50KWFyZyA8IDAgfHwgKGludClhcmcgPj0gcC0+UklPTnVtSG9zdHMpCi0JCQkJCSByZXR1cm4gLUVJTlZBTDsKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJDbGVhciBpbnRlcnJ1cHQgZm9yIGhvc3QgJWRcbiIsIChpbnQpYXJnKTsKLQkJCQlXQllURSgocC0+UklPSG9zdHNbKGludClhcmddLlJlc2V0SW50KSAsIDB4ZmYpOwotCQkJCXJldHVybiAwOworCWNhc2UgUklPX1RPQ0s6CisJCWlmICgoaW50KSBhcmcgPCAwIHx8IChpbnQpIGFyZyA+PSBwLT5SSU9OdW1Ib3N0cykKKwkJCXJldHVybiAtRUlOVkFMOworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIkNsZWFyIGludGVycnVwdCBmb3IgaG9zdCAlZFxuIiwgKGludCkgYXJnKTsKKwkJV0JZVEUoKHAtPlJJT0hvc3RzWyhpbnQpIGFyZ10uUmVzZXRJbnQpLCAweGZmKTsKKwkJcmV0dXJuIDA7CiAKLQkJCWNhc2UgUklPX1JFQURfQ0hFQ0s6Ci0JCQkJLyogQ2hlY2sgcmVhZHMgZm9yIHBrdHMgd2l0aCBkYXRhWzBdIHRoZSBzYW1lICovCi0JCQkJcC0+UklPUmVhZENoZWNrID0gIXAtPlJJT1JlYWRDaGVjazsKLQkJCQlpZiAoY29weW91dCgoY2FkZHJfdCkmcC0+UklPUmVhZENoZWNrLChpbnQpYXJnLAotCQkJCQkJCXNpemVvZih1aW50KSk9PSBDT1BZRkFJTCkgewotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZT1VUX0ZBSUxFRDsKLQkJCQkJIHJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCQlyZXR1cm4gMDsKKwljYXNlIFJJT19SRUFEX0NIRUNLOgorCQkvKiBDaGVjayByZWFkcyBmb3IgcGt0cyB3aXRoIGRhdGFbMF0gdGhlIHNhbWUgKi8KKwkJcC0+UklPUmVhZENoZWNrID0gIXAtPlJJT1JlYWRDaGVjazsKKwkJaWYgKGNvcHlvdXQoKGNhZGRyX3QpICYgcC0+UklPUmVhZENoZWNrLCAoaW50KSBhcmcsIHNpemVvZih1aW50KSkgPT0gQ09QWUZBSUwpIHsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWU9VVF9GQUlMRUQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXR1cm4gMDsKIAotCQkJY2FzZSBSSU9fUkVBRF9SRUdJU1RFUiA6Ci0JCQkJaWYgKGNvcHlpbigoaW50KWFyZywgKGNhZGRyX3QpJlN1YkNtZCwgCi0JCQkJCQkJc2l6ZW9mKHN0cnVjdCBTdWJDbWRTdHJ1Y3QpKSA9PSBDT1BZRkFJTCkgewotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBDT1BZSU5fRkFJTEVEOwotCQkJCQkgcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlJJT19SRUFEX1JFR0lTVEVSIGhvc3QgJWQgcnVwICVkIHBvcnQgJWQgcmVnICV4XG4iLCAKLQkJCQkJCVN1YkNtZC5Ib3N0LCBTdWJDbWQuUnVwLCBTdWJDbWQuUG9ydCwgU3ViQ21kLkFkZHIpOworCWNhc2UgUklPX1JFQURfUkVHSVNURVI6CisJCWlmIChjb3B5aW4oKGludCkgYXJnLCAoY2FkZHJfdCkgJiBTdWJDbWQsIHNpemVvZihzdHJ1Y3QgU3ViQ21kU3RydWN0KSkgPT0gQ09QWUZBSUwpIHsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUklPX1JFQURfUkVHSVNURVIgaG9zdCAlZCBydXAgJWQgcG9ydCAlZCByZWcgJXhcbiIsIFN1YkNtZC5Ib3N0LCBTdWJDbWQuUnVwLCBTdWJDbWQuUG9ydCwgU3ViQ21kLkFkZHIpOwogCi0JCQkJaWYgKFN1YkNtZC5Qb3J0ID4gNTExKSB7Ci0JCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJCYXVkIHJhdGUgbWFwcGluZzogQmFkIHBvcnQgbnVtYmVyICVkXG4iLCAKLQkJCQkJCQkJU3ViQ21kLlBvcnQpOwotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBQT1JUX05VTUJFUl9PVVRfT0ZfUkFOR0U7Ci0JCQkJCSByZXR1cm4gLUVJTlZBTDsKLQkJCQl9CisJCWlmIChTdWJDbWQuUG9ydCA+IDUxMSkgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJCYXVkIHJhdGUgbWFwcGluZzogQmFkIHBvcnQgbnVtYmVyICVkXG4iLCBTdWJDbWQuUG9ydCk7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAKLQkJCQlpZiAoU3ViQ21kLlJ1cCA+PSBNQVhfUlVQK0xJTktTX1BFUl9VTklUICkgewotCQkJCQkgcC0+UklPRXJyb3IuRXJyb3IgPSBSVVBfTlVNQkVSX09VVF9PRl9SQU5HRTsKLQkJCQkJIHJldHVybiAtRUlOVkFMOwotCQkJCX0KKwkJaWYgKFN1YkNtZC5SdXAgPj0gTUFYX1JVUCArIExJTktTX1BFUl9VTklUKSB7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IFJVUF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAotCQkJCWlmIChTdWJDbWQuSG9zdCA+PSBwLT5SSU9OdW1Ib3N0cyApIHsKLQkJCQkJIHAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9OVU1CRVJfT1VUX09GX1JBTkdFOwotCQkJCQkgcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQorCQlpZiAoU3ViQ21kLkhvc3QgPj0gcC0+UklPTnVtSG9zdHMpIHsKKwkJCXAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9OVU1CRVJfT1VUX09GX1JBTkdFOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAotCQkJCXBvcnQgPSBwLT5SSU9Ib3N0c1tTdWJDbWQuSG9zdF0uCi0JCQkJCQlVbml4UnVwc1tTdWJDbWQuUnVwXS5CYXNlU3lzUG9ydCArIFN1YkNtZC5Qb3J0OwotCQkJCVBvcnRQID0gcC0+UklPUG9ydHBbcG9ydF07CisJCXBvcnQgPSBwLT5SSU9Ib3N0c1tTdWJDbWQuSG9zdF0uVW5peFJ1cHNbU3ViQ21kLlJ1cF0uQmFzZVN5c1BvcnQgKyBTdWJDbWQuUG9ydDsKKwkJUG9ydFAgPSBwLT5SSU9Qb3J0cFtwb3J0XTsKIAotCQkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwogCi0JCQkJaWYgKFJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIFJFQURfUkVHSVNURVIpID09IFJJT19GQUlMKSB7Ci0JCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUkVBRF9SRUdJU1RFUiBmYWlsZWRcbiIpOwotCQkJCQkgcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSAsIGZsYWdzKTsKLQkJCQkJIHJldHVybiAtRUJVU1k7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJIFBvcnRQLT5TdGF0ZSB8PSBSSU9fQlVTWTsKKwkJaWYgKFJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIFJFQURfUkVHSVNURVIpID09IFJJT19GQUlMKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlJJT19SRUFEX1JFR0lTVEVSIGZhaWxlZFxuIik7CisJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0gZWxzZQorCQkJUG9ydFAtPlN0YXRlIHw9IFJJT19CVVNZOwogCi0JCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSAsIGZsYWdzKTsKLQkJCQlpZiAoY29weW91dCgoY2FkZHJfdCkmcC0+Q2RSZWdpc3RlciwgKGludClhcmcsIAotCQkJCQkJCXNpemVvZih1aW50KSkgPT0gQ09QWUZBSUwgKSB7Ci0JCQkJCSByaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJSSU9fUkVBRF9SRUdJU1RFUiBjb3B5IGZhaWxlZFxuIik7Ci0JCQkJCSBwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOwotCQkJCQkgcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCXJldHVybiAwOwotCQkJCS8qCi0JCQkJKiogcmlvX21ha2VfZGV2OiBnaXZlbiBwb3J0IG51bWJlciAoMC01MTEpIE9SZWQgd2l0aCBwb3J0IHR5cGUKLQkJCQkqKiAoUklPX0RFVl9ESVJFQ1QsIFJJT19ERVZfTU9ERU0sIFJJT19ERVZfWFBSSU5UKSByZXR1cm4gZGV2X3QKLQkJCQkqKiB2YWx1ZSB0byBwYXNzIHRvIG1rbm9kIHRvIGNyZWF0ZSB0aGUgY29ycmVjdCBkZXZpY2Ugbm9kZS4KLQkJCQkqLwotCQkJY2FzZSBSSU9fTUFLRV9ERVY6Ci0JCQkJewotCQkJCQl1aW50IHBvcnQgPSAodWludClhcmcgJiBSSU9fTU9ERU1fTUFTSzsKKwkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCWlmIChjb3B5b3V0KChjYWRkcl90KSAmIHAtPkNkUmVnaXN0ZXIsIChpbnQpIGFyZywgc2l6ZW9mKHVpbnQpKSA9PSBDT1BZRkFJTCkgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJSSU9fUkVBRF9SRUdJU1RFUiBjb3B5IGZhaWxlZFxuIik7CisJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlPVVRfRkFJTEVEOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmV0dXJuIDA7CisJCS8qCisJCSAqKiByaW9fbWFrZV9kZXY6IGdpdmVuIHBvcnQgbnVtYmVyICgwLTUxMSkgT1JlZCB3aXRoIHBvcnQgdHlwZQorCQkgKiogKFJJT19ERVZfRElSRUNULCBSSU9fREVWX01PREVNLCBSSU9fREVWX1hQUklOVCkgcmV0dXJuIGRldl90CisJCSAqKiB2YWx1ZSB0byBwYXNzIHRvIG1rbm9kIHRvIGNyZWF0ZSB0aGUgY29ycmVjdCBkZXZpY2Ugbm9kZS4KKwkJICovCisJY2FzZSBSSU9fTUFLRV9ERVY6CisJCXsKKwkJCXVpbnQgcG9ydCA9ICh1aW50KSBhcmcgJiBSSU9fTU9ERU1fTUFTSzsKIAotCQkJCQlzd2l0Y2ggKCAodWludClhcmcgJiBSSU9fREVWX01BU0sgKSB7Ci0JCQkJCQljYXNlIFJJT19ERVZfRElSRUNUOgotCQkJCQkJCWFyZyA9IChjYWRkcl90KWRydl9tYWtlZGV2KE1BSk9SKGRldiksIHBvcnQpOwotCQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1ha2VkZXYgZGlyZWN0IDB4JXggaXMgMHgleFxuIixwb3J0LCAoaW50KWFyZyk7Ci0JCQkJCQkJcmV0dXJuIChpbnQpYXJnOwotCQkJCQkgCWNhc2UgUklPX0RFVl9NT0RFTToKLQkJCQkJCQlhcmcgPSAgKGNhZGRyX3QpZHJ2X21ha2VkZXYoTUFKT1IoZGV2KSwgKHBvcnR8UklPX01PREVNX0JJVCkgKTsKLQkJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYWtlZGV2IG1vZGVtIDB4JXggaXMgMHgleFxuIixwb3J0LCAoaW50KWFyZyk7Ci0JCQkJCQkJcmV0dXJuIChpbnQpYXJnOwotCQkJCQkJY2FzZSBSSU9fREVWX1hQUklOVDoKLQkJCQkJCQlhcmcgPSAoY2FkZHJfdClkcnZfbWFrZWRldihNQUpPUihkZXYpLCBwb3J0KTsKLQkJCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJNYWtlZGV2IHByaW50ZXIgMHgleCBpcyAweCV4XG4iLHBvcnQsIChpbnQpYXJnKTsKLQkJCQkJCQlyZXR1cm4gKGludClhcmc7Ci0JCQkJCX0KLQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTUFLRSBEZXZpY2UgaXMgY2FsbGVkXG4iKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCQkJCS8qCi0JCQkJKiogcmlvX21pbm9yOiBnaXZlbiBhIGRldl90IGZyb20gYSBzdGF0KCkgY2FsbCwgcmV0dXJuCi0JCQkJKiogdGhlIHBvcnQgbnVtYmVyICgwLTUxMSkgT1JlZCB3aXRoIHRoZSBwb3J0IHR5cGUKLQkJCQkqKiAoIFJJT19ERVZfRElSRUNULCBSSU9fREVWX01PREVNLCBSSU9fREVWX1hQUklOVCApCi0JCQkJKi8KLQkJCWNhc2UgUklPX01JTk9SOgotCQkJCXsKLQkJCQkJZGV2X3QgZHY7Ci0JCQkJCWludCBtaW5vOworCQkJc3dpdGNoICgodWludCkgYXJnICYgUklPX0RFVl9NQVNLKSB7CisJCQljYXNlIFJJT19ERVZfRElSRUNUOgorCQkJCWFyZyA9IChjYWRkcl90KSBkcnZfbWFrZWRldihNQUpPUihkZXYpLCBwb3J0KTsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIk1ha2VkZXYgZGlyZWN0IDB4JXggaXMgMHgleFxuIiwgcG9ydCwgKGludCkgYXJnKTsKKwkJCQlyZXR1cm4gKGludCkgYXJnOworCQkJY2FzZSBSSU9fREVWX01PREVNOgorCQkJCWFyZyA9IChjYWRkcl90KSBkcnZfbWFrZWRldihNQUpPUihkZXYpLCAocG9ydCB8IFJJT19NT0RFTV9CSVQpKTsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIk1ha2VkZXYgbW9kZW0gMHgleCBpcyAweCV4XG4iLCBwb3J0LCAoaW50KSBhcmcpOworCQkJCXJldHVybiAoaW50KSBhcmc7CisJCQljYXNlIFJJT19ERVZfWFBSSU5UOgorCQkJCWFyZyA9IChjYWRkcl90KSBkcnZfbWFrZWRldihNQUpPUihkZXYpLCBwb3J0KTsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIk1ha2VkZXYgcHJpbnRlciAweCV4IGlzIDB4JXhcbiIsIHBvcnQsIChpbnQpIGFyZyk7CisJCQkJcmV0dXJuIChpbnQpIGFyZzsKKwkJCX0KKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiTUFLRSBEZXZpY2UgaXMgY2FsbGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qCisJCSAqKiByaW9fbWlub3I6IGdpdmVuIGEgZGV2X3QgZnJvbSBhIHN0YXQoKSBjYWxsLCByZXR1cm4KKwkJICoqIHRoZSBwb3J0IG51bWJlciAoMC01MTEpIE9SZWQgd2l0aCB0aGUgcG9ydCB0eXBlCisJCSAqKiAoIFJJT19ERVZfRElSRUNULCBSSU9fREVWX01PREVNLCBSSU9fREVWX1hQUklOVCApCisJCSAqLworCWNhc2UgUklPX01JTk9SOgorCQl7CisJCQlkZXZfdCBkdjsKKwkJCWludCBtaW5vOwogCi0JCQkJCWR2ID0gKGRldl90KSgoaW50KWFyZyk7Ci0JCQkJCW1pbm8gPSBSSU9fVU5NT0RFTShkdik7CisJCQlkdiA9IChkZXZfdCkgKChpbnQpIGFyZyk7CisJCQltaW5vID0gUklPX1VOTU9ERU0oZHYpOwogCi0JCQkJCWlmICggUklPX0lTTU9ERU0oZHYpICkgewotCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiTWlub3IgZm9yIGRldmljZSAweCV4OiBtb2RlbSAlZFxuIiwgZHYsIG1pbm8pOwotCQkJCQkJYXJnID0gKGNhZGRyX3QpKG1pbm8gfCBSSU9fREVWX01PREVNKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIk1pbm9yIGZvciBkZXZpY2UgMHgleDogZGlyZWN0ICVkXG4iLCBkdiwgbWlubyk7Ci0JCQkJCQlhcmcgPSAoY2FkZHJfdCkobWlubyB8IFJJT19ERVZfRElSRUNUKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gKGludClhcmc7Ci0JCQkJfQorCQkJaWYgKFJJT19JU01PREVNKGR2KSkgeworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiTWlub3IgZm9yIGRldmljZSAweCV4OiBtb2RlbSAlZFxuIiwgZHYsIG1pbm8pOworCQkJCWFyZyA9IChjYWRkcl90KSAobWlubyB8IFJJT19ERVZfTU9ERU0pOworCQkJfSBlbHNlIHsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIk1pbm9yIGZvciBkZXZpY2UgMHgleDogZGlyZWN0ICVkXG4iLCBkdiwgbWlubyk7CisJCQkJYXJnID0gKGNhZGRyX3QpIChtaW5vIHwgUklPX0RFVl9ESVJFQ1QpOworCQkJfQorCQkJcmV0dXJuIChpbnQpIGFyZzsKKwkJfQogCX0KLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJJTlZBTElEIERBRU1PTiBJT0NUTCAweCV4XG4iLGNtZCk7CisJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJJTlZBTElEIERBRU1PTiBJT0NUTCAweCV4XG4iLCBjbWQpOwogCXAtPlJJT0Vycm9yLkVycm9yID0gSU9DVExfQ09NTUFORF9VTktOT1dOOwogCi0JZnVuY19leGl0ICgpOworCWZ1bmNfZXhpdCgpOwogCXJldHVybiAtRUlOVkFMOwogfQogCiAvKgogKiogUHJlLWVtcHRpdmUgY29tbWFuZHMgZ28gb24gUlVQcyBhbmQgYXJlIG9ubHkgb25lIGJ5dGUgbG9uZy4KICovCi1pbnQKLVJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIENtZCkKLXN0cnVjdCByaW9faW5mbyAqCXA7CitpbnQgUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgQ21kKQorc3RydWN0IHJpb19pbmZvICpwOwogc3RydWN0IFBvcnQgKlBvcnRQOwogdWNoYXIgQ21kOwogewpAQCAtMTc2NSwxMDUgKzE1NDgsOTYgQEAKIAl1c2hvcnQgcnVwOwogCWludCBwb3J0OwogCi0jaWZkZWYgQ0hFQ0sKLQlDaGVja1BvcnRQKCBQb3J0UCApOwotI2VuZGlmCi0KLQlpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJQcmVlbXB0aXZlIGNvbW1hbmQgdG8gZGVsZXRlZCBSVEEgaWdub3JlZFxuIik7CisJaWYgKFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUHJlZW1wdGl2ZSBjb21tYW5kIHRvIGRlbGV0ZWQgUlRBIGlnbm9yZWRcbiIpOwogCQlyZXR1cm4gUklPX0ZBSUw7CiAJfQogCi0JaWYgKCgoaW50KSgoY2hhcilQb3J0UC0+SW5Vc2UpID09IC0xKSB8fCAhIChDbWRCbGtQID0gUklPR2V0Q21kQmxrKCkpICkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJDYW5ub3QgYWxsb2NhdGUgY29tbWFuZCBibG9jayBmb3IgY29tbWFuZCAlZCBvbiBwb3J0ICVkXG4iLAotCQkgICAgICAgQ21kLCBQb3J0UC0+UG9ydE51bSk7CisJaWYgKCgoaW50KSAoKGNoYXIpIFBvcnRQLT5JblVzZSkgPT0gLTEpIHx8ICEoQ21kQmxrUCA9IFJJT0dldENtZEJsaygpKSkgeworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIkNhbm5vdCBhbGxvY2F0ZSBjb21tYW5kIGJsb2NrIGZvciBjb21tYW5kICVkIG9uIHBvcnQgJWRcbiIsIENtZCwgUG9ydFAtPlBvcnROdW0pOwogCQlyZXR1cm4gUklPX0ZBSUw7CiAJfQogCi0JcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiQ29tbWFuZCBibGsgMHgleCAtIEluVXNlIG5vdyAlZFxuIiwgCi0JICAgICAgIChpbnQpQ21kQmxrUCxQb3J0UC0+SW5Vc2UpOworCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiQ29tbWFuZCBibGsgMHgleCAtIEluVXNlIG5vdyAlZFxuIiwgKGludCkgQ21kQmxrUCwgUG9ydFAtPkluVXNlKTsKIAotCVBrdENtZFAgPSAoc3RydWN0IFBrdENtZF9NICopJkNtZEJsa1AtPlBhY2tldC5kYXRhWzBdOworCVBrdENtZFAgPSAoc3RydWN0IFBrdENtZF9NICopICZDbWRCbGtQLT5QYWNrZXQuZGF0YVswXTsKIAotCUNtZEJsa1AtPlBhY2tldC5zcmNfdW5pdCAgPSAwOworCUNtZEJsa1AtPlBhY2tldC5zcmNfdW5pdCA9IDA7CiAJaWYgKFBvcnRQLT5TZWNvbmRCbG9jaykKIAkJcnVwID0gUG9ydFAtPklEMjsKIAllbHNlCiAJCXJ1cCA9IFBvcnRQLT5SdXBOdW07CiAJQ21kQmxrUC0+UGFja2V0LmRlc3RfdW5pdCA9IHJ1cDsKLQlDbWRCbGtQLT5QYWNrZXQuc3JjX3BvcnQgID0gQ09NTUFORF9SVVA7CisJQ21kQmxrUC0+UGFja2V0LnNyY19wb3J0ID0gQ09NTUFORF9SVVA7CiAJQ21kQmxrUC0+UGFja2V0LmRlc3RfcG9ydCA9IENPTU1BTkRfUlVQOwotCUNtZEJsa1AtPlBhY2tldC5sZW4JICA9IFBLVF9DTURfQklUIHwgMjsKLQlDbWRCbGtQLT5Qb3N0RnVuY1AJPSBSSU9VblVzZTsKLQlDbWRCbGtQLT5Qb3N0QXJnCT0gKGludClQb3J0UDsKLQlQa3RDbWRQLT5Db21tYW5kCT0gQ21kOwotCXBvcnQJCQkJPSBQb3J0UC0+SG9zdFBvcnQgJSAodXNob3J0KVBPUlRTX1BFUl9SVEE7CisJQ21kQmxrUC0+UGFja2V0LmxlbiA9IFBLVF9DTURfQklUIHwgMjsKKwlDbWRCbGtQLT5Qb3N0RnVuY1AgPSBSSU9VblVzZTsKKwlDbWRCbGtQLT5Qb3N0QXJnID0gKGludCkgUG9ydFA7CisJUGt0Q21kUC0+Q29tbWFuZCA9IENtZDsKKwlwb3J0ID0gUG9ydFAtPkhvc3RQb3J0ICUgKHVzaG9ydCkgUE9SVFNfUEVSX1JUQTsKIAkvKgotCSoqIEluZGV4IHBvcnRzIDgtMTUgZm9yIDJuZCBibG9jayBvZiAxNiBwb3J0IFJUQS4KLQkqLworCSAqKiBJbmRleCBwb3J0cyA4LTE1IGZvciAybmQgYmxvY2sgb2YgMTYgcG9ydCBSVEEuCisJICovCiAJaWYgKFBvcnRQLT5TZWNvbmRCbG9jaykKIAkJcG9ydCArPSAodXNob3J0KSBQT1JUU19QRVJfUlRBOwotCVBrdENtZFAtPlBoYk51bQkgICA9IHBvcnQ7CisJUGt0Q21kUC0+UGhiTnVtID0gcG9ydDsKIAotCXN3aXRjaCAoIENtZCApIHsKLQkJY2FzZSBNRU1EVU1QOgotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUXVldWUgTUVNRFVNUCBjb21tYW5kIGJsayAweCV4IChhZGRyIDB4JXgpXG4iLAotCQkJICAgICAgIChpbnQpQ21kQmxrUCwgKGludClTdWJDbWQuQWRkcik7Ci0JCQlQa3RDbWRQLT5TdWJDb21tYW5kCQk9IE1FTURVTVA7Ci0JCQlQa3RDbWRQLT5TdWJBZGRyCQk9IFN1YkNtZC5BZGRyOwotCQkJYnJlYWs7Ci0JCWNhc2UgRkNMT1NFOgotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUXVldWUgRkNMT1NFIGNvbW1hbmQgYmxrIDB4JXhcbiIsKGludClDbWRCbGtQKTsKLQkJCWJyZWFrOwotCQljYXNlIFJFQURfUkVHSVNURVI6Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJRdWV1ZSBSRUFEX1JFR0lTVEVSICgweCV4KSBjb21tYW5kIGJsayAweCV4XG4iLAotCQkgCQkoaW50KVN1YkNtZC5BZGRyLCAoaW50KUNtZEJsa1ApOwotCQkJUGt0Q21kUC0+U3ViQ29tbWFuZAkJPSBSRUFEX1JFR0lTVEVSOwotCQkJUGt0Q21kUC0+U3ViQWRkcgkJPSBTdWJDbWQuQWRkcjsKLQkJCWJyZWFrOwotCQljYXNlIFJFU1VNRToKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlF1ZXVlIFJFU1VNRSBjb21tYW5kIGJsayAweCV4XG4iLChpbnQpQ21kQmxrUCk7Ci0JCQlicmVhazsKLQkJY2FzZSBSRkxVU0g6Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJRdWV1ZSBSRkxVU0ggY29tbWFuZCBibGsgMHgleFxuIiwoaW50KUNtZEJsa1ApOwotCQkJQ21kQmxrUC0+UG9zdEZ1bmNQID0gUklPUkZsdXNoRW5hYmxlOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1VTUEVORDoKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlF1ZXVlIFNVU1BFTkQgY29tbWFuZCBibGsgMHgleFxuIiwoaW50KUNtZEJsa1ApOwotCQkJYnJlYWs7CisJc3dpdGNoIChDbWQpIHsKKwljYXNlIE1FTURVTVA6CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUXVldWUgTUVNRFVNUCBjb21tYW5kIGJsayAweCV4IChhZGRyIDB4JXgpXG4iLCAoaW50KSBDbWRCbGtQLCAoaW50KSBTdWJDbWQuQWRkcik7CisJCVBrdENtZFAtPlN1YkNvbW1hbmQgPSBNRU1EVU1QOworCQlQa3RDbWRQLT5TdWJBZGRyID0gU3ViQ21kLkFkZHI7CisJCWJyZWFrOworCWNhc2UgRkNMT1NFOgorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlF1ZXVlIEZDTE9TRSBjb21tYW5kIGJsayAweCV4XG4iLCAoaW50KSBDbWRCbGtQKTsKKwkJYnJlYWs7CisJY2FzZSBSRUFEX1JFR0lTVEVSOgorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlF1ZXVlIFJFQURfUkVHSVNURVIgKDB4JXgpIGNvbW1hbmQgYmxrIDB4JXhcbiIsIChpbnQpIFN1YkNtZC5BZGRyLCAoaW50KSBDbWRCbGtQKTsKKwkJUGt0Q21kUC0+U3ViQ29tbWFuZCA9IFJFQURfUkVHSVNURVI7CisJCVBrdENtZFAtPlN1YkFkZHIgPSBTdWJDbWQuQWRkcjsKKwkJYnJlYWs7CisJY2FzZSBSRVNVTUU6CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUXVldWUgUkVTVU1FIGNvbW1hbmQgYmxrIDB4JXhcbiIsIChpbnQpIENtZEJsa1ApOworCQlicmVhazsKKwljYXNlIFJGTFVTSDoKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJRdWV1ZSBSRkxVU0ggY29tbWFuZCBibGsgMHgleFxuIiwgKGludCkgQ21kQmxrUCk7CisJCUNtZEJsa1AtPlBvc3RGdW5jUCA9IFJJT1JGbHVzaEVuYWJsZTsKKwkJYnJlYWs7CisJY2FzZSBTVVNQRU5EOgorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ1RSTCwgIlF1ZXVlIFNVU1BFTkQgY29tbWFuZCBibGsgMHgleFxuIiwgKGludCkgQ21kQmxrUCk7CisJCWJyZWFrOwogCi0JCWNhc2UgTUdFVCA6Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJRdWV1ZSBNR0VUIGNvbW1hbmQgYmxrIDB4JXhcbiIsIChpbnQpQ21kQmxrUCk7Ci0JCQlicmVhazsKKwljYXNlIE1HRVQ6CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUXVldWUgTUdFVCBjb21tYW5kIGJsayAweCV4XG4iLCAoaW50KSBDbWRCbGtQKTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBNU0VUIDoKLQkJY2FzZSBNQklDIDoKLQkJY2FzZSBNQklTIDoKLQkJCUNtZEJsa1AtPlBhY2tldC5kYXRhWzRdID0gKGNoYXIpIFBvcnRQLT5Nb2RlbUxpbmVzOwotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19DVFJMLCAiUXVldWUgTVNFVC9NQklDL01CSVMgY29tbWFuZCBibGsgMHgleFxuIiwgKGludClDbWRCbGtQKTsKLQkJCWJyZWFrOworCWNhc2UgTVNFVDoKKwljYXNlIE1CSUM6CisJY2FzZSBNQklTOgorCQlDbWRCbGtQLT5QYWNrZXQuZGF0YVs0XSA9IChjaGFyKSBQb3J0UC0+TW9kZW1MaW5lczsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0NUUkwsICJRdWV1ZSBNU0VUL01CSUMvTUJJUyBjb21tYW5kIGJsayAweCV4XG4iLCAoaW50KSBDbWRCbGtQKTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBXRkxVU0g6Ci0JCQkvKgotCQkJKiogSWYgd2UgaGF2ZSBxdWV1ZWQgdXAgdGhlIG1heGltdW0gbnVtYmVyIG9mIFdyaXRlIGZsdXNoZXMKLQkJCSoqIGFsbG93ZWQgdGhlbiB3ZSBzaG91bGQgbm90IGJvdGhlciBzZW5kaW5nIGFueSBtb3JlIHRvIHRoZQotCQkJKiogUlRBLgotCQkJKi8KLQkJCWlmICgoaW50KSgoY2hhcilQb3J0UC0+V2ZsdXNoRmxhZykgPT0gKGludCktMSkgewotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ1RSTCwgIlRyYXNoZWQgV0ZMVVNILCBXZmx1c2hGbGFnIGFib3V0IHRvIHdyYXAhIik7Ci0JCQkJUklPRnJlZUNtZEJsayhDbWRCbGtQKTsKLQkJCQlyZXR1cm4oUklPX0ZBSUwpOwotCQkJfSBlbHNlIHsKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0NUUkwsICJRdWV1ZSBXRkxVU0ggY29tbWFuZCBibGsgMHgleFxuIiwKLQkJCQkgICAgICAgKGludClDbWRCbGtQKTsKLQkJCQlDbWRCbGtQLT5Qb3N0RnVuY1AgPSBSSU9XRmx1c2hNYXJrOwotCQkJfQotCQkJYnJlYWs7CisJY2FzZSBXRkxVU0g6CisJCS8qCisJCSAqKiBJZiB3ZSBoYXZlIHF1ZXVlZCB1cCB0aGUgbWF4aW11bSBudW1iZXIgb2YgV3JpdGUgZmx1c2hlcworCQkgKiogYWxsb3dlZCB0aGVuIHdlIHNob3VsZCBub3QgYm90aGVyIHNlbmRpbmcgYW55IG1vcmUgdG8gdGhlCisJCSAqKiBSVEEuCisJCSAqLworCQlpZiAoKGludCkgKChjaGFyKSBQb3J0UC0+V2ZsdXNoRmxhZykgPT0gKGludCkgLTEpIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiVHJhc2hlZCBXRkxVU0gsIFdmbHVzaEZsYWcgYWJvdXQgdG8gd3JhcCEiKTsKKwkJCVJJT0ZyZWVDbWRCbGsoQ21kQmxrUCk7CisJCQlyZXR1cm4gKFJJT19GQUlMKTsKKwkJfSBlbHNlIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DVFJMLCAiUXVldWUgV0ZMVVNIIGNvbW1hbmQgYmxrIDB4JXhcbiIsIChpbnQpIENtZEJsa1ApOworCQkJQ21kQmxrUC0+UG9zdEZ1bmNQID0gUklPV0ZsdXNoTWFyazsKKwkJfQorCQlicmVhazsKIAl9CiAKIAlQb3J0UC0+SW5Vc2UrKzsKIAotCVJldCA9IFJJT1F1ZXVlQ21kQmxrKCBQb3J0UC0+SG9zdFAsIHJ1cCwgQ21kQmxrUCApOworCVJldCA9IFJJT1F1ZXVlQ21kQmxrKFBvcnRQLT5Ib3N0UCwgcnVwLCBDbWRCbGtQKTsKIAogCXJldHVybiBSZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2RydnIuaCBiL2RyaXZlcnMvY2hhci9yaW8vcmlvZHJ2ci5oCmluZGV4IGJjMzhhYzUuLjY2M2VlMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vcmlvZHJ2ci5oCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvZHJ2ci5oCkBAIC0zMyw3ICszMyw3IEBACiAjaWZuZGVmIF9fcmlvZHJ2cl9oCiAjZGVmaW5lIF9fcmlvZHJ2cl9oCiAKLSNpbmNsdWRlIDxhc20vcGFyYW0uaD4JLyogZm9yIEhaICovCisjaW5jbHVkZSA8YXNtL3BhcmFtLmg+CQkvKiBmb3IgSFogKi8KIAogI2lmZGVmIFNDQ1NfTEFCRUxTCiBzdGF0aWMgY2hhciAqX3Jpb2RydnJfaF9zY2NzXyA9ICJAKCMpcmlvZHJ2ci5oCTEuMyI7CkBAIC00NCwxNSArNDQsMTUgQEAKIAogCiBzdHJ1Y3QgcmlvX2luZm8gewotCWludAkJCW1vZGU7CQkJLyogSW50ciBvciBwb2xsZWQsIHdvcmQvYnl0ZSAqLwotCXNwaW5sb2NrX3QJCVJJT0ludHJTZW07CQkvKiBJbnRlcnJ1cHQgdGhyZWFkIHNlbSAqLwotCWludAkJCWN1cnJlbnRfY2hhbjsJCS8qIGN1cnJlbnQgY2hhbm5lbCAqLwotCWludAkJCVJJT0ZhaWxlZDsJCS8qIE5vdCBpbml0aWFsaXNlZCA/ICovCi0JaW50CQkJUklPSW5zdGFsbEF0dGVtcHRzOwkvKiBuby4gb2YgcmlvLWluc3RhbGwoKSBjYWxscyAqLwotCWludAkJCVJJT0xhc3RQQ0lTZWFyY2g7CS8qIHN0YXR1cyBvZiBsYXN0IHNlYXJjaCAqLwotCWludAkJCVJJT051bUhvc3RzOwkJLyogTnVtYmVyIG9mIFJJTyBIb3N0cyAqLwotCXN0cnVjdCBIb3N0CQkqIFJJT0hvc3RzOwkJLyogUklPIEhvc3QgdmFsdWVzICovCi0Jc3RydWN0IFBvcnQJCSoqUklPUG9ydHA7CQkvKiBSSU8gcG9ydCB2YWx1ZXMgKi8KKwlpbnQgbW9kZTsJCS8qIEludHIgb3IgcG9sbGVkLCB3b3JkL2J5dGUgKi8KKwlzcGlubG9ja190IFJJT0ludHJTZW07CS8qIEludGVycnVwdCB0aHJlYWQgc2VtICovCisJaW50IGN1cnJlbnRfY2hhbjsJLyogY3VycmVudCBjaGFubmVsICovCisJaW50IFJJT0ZhaWxlZDsJCS8qIE5vdCBpbml0aWFsaXNlZCA/ICovCisJaW50IFJJT0luc3RhbGxBdHRlbXB0czsJLyogbm8uIG9mIHJpby1pbnN0YWxsKCkgY2FsbHMgKi8KKwlpbnQgUklPTGFzdFBDSVNlYXJjaDsJLyogc3RhdHVzIG9mIGxhc3Qgc2VhcmNoICovCisJaW50IFJJT051bUhvc3RzOwkvKiBOdW1iZXIgb2YgUklPIEhvc3RzICovCisJc3RydWN0IEhvc3QgKlJJT0hvc3RzOwkvKiBSSU8gSG9zdCB2YWx1ZXMgKi8KKwlzdHJ1Y3QgUG9ydCAqKlJJT1BvcnRwOwkvKiBSSU8gcG9ydCB2YWx1ZXMgKi8KIC8qCiAqKiAwMi4wMy4xOTk5IEFSRyAtIEVTSUwgMDgyMCBmaXgKICoqIFdlIG5vIGxvbmdlciB1c2UgUklPQm9vdE1vZGUKQEAgLTYwLDkgKzYwLDkgQEAKIAlpbnQJCQlSSU9Cb290TW9kZTsJCSogUklPIGJvb3QgbW9kZSAqCiAqKgogKi8KLQlpbnQJCQlSSU9QcmludERpc2FibGVkOwkvKiBSSU8gcHJpbnRpbmcgZGlzYWJsZWQgPyAqLwotCWludAkJCVJJT1ByaW50TG9nU3RhdGU7CS8qIFJJTyBwcmludGluZyBzdGF0ZSA/ICovCi0JaW50CQkJUklPUG9sbGluZzsJCS8qIFBvbGxpbmcgPyAqLworCWludCBSSU9QcmludERpc2FibGVkOwkvKiBSSU8gcHJpbnRpbmcgZGlzYWJsZWQgPyAqLworCWludCBSSU9QcmludExvZ1N0YXRlOwkvKiBSSU8gcHJpbnRpbmcgc3RhdGUgPyAqLworCWludCBSSU9Qb2xsaW5nOwkJLyogUG9sbGluZyA/ICovCiAvKgogKiogMDkuMTIuMTk5OCBBUkcgLSBFU0lMIDA3NzYgcGFydCBmaXgKICoqIFRoZSAnUklPX1FVSUNLX0NIRUNLJyBpb2N0bCB3YXMgdXNpbmcgUklPSGFsdGVkLgpAQCAtNzAsNjEgKzcwLDYxIEBACiAqKiB1cGRhdGVkIGluIFJJT0NvbkNvbigpIC0gdG8ga2VlcCB0cmFjayBvZiBSVEEgY29ubmVjdGlvbnMvZGlzY29ubmVjdGlvbnMuCiAqKiAnUklPX1FVSUNLX0NIRUNLJyBub3cgcmV0dXJucyB0aGUgdmFsdWUgb2YgUklPUnRhRGlzQ29ucy4KICovCi0JaW50CQkJUklPSGFsdGVkOwkJLyogaGFsdGVkID8gKi8KLQlpbnQJCQlSSU9SdGFEaXNDb25zOwkJLyogUlRBIGNvbm5lY3Rpb25zL2Rpc2Nvbm5lY3Rpb25zICovCi0JdWludAkJCVJJT1JlYWRDaGVjazsJCS8qIFJpbyByZWFkIGNoZWNrICovCi0JdWludAkJCVJJT05vTWVzc2FnZTsJCS8qIFRvIGRpc3BsYXkgbWVzc2FnZSBvciBub3QgKi8KLQl1aW50CQkJUklPTnVtQm9vdFBrdHM7CQkvKiBob3cgbWFueSBwYWNrZXRzIGZvciBhbiBSVEEgKi8KLQl1aW50CQkJUklPQm9vdENvdW50OyAJCS8qIHNpemUgb2YgUlRBIGNvZGUgKi8KLQl1aW50CQkJUklPQm9vdGluZzsJCS8qIGNvdW50IG9mIG91dHN0YW5kaW5nIGJvb3RzICovCi0JdWludAkJCVJJT1N5c3RlbVVwOwkJLyogQm9vdGVkID8/ICovCi0JdWludAkJCVJJT0NvdW50aW5nOwkJLyogZm9yIGNvdW50aW5nIGludGVycnVwdHMgKi8KLQl1aW50CQkJUklPSW50Q291bnQ7CQkvKiAjIG9mIGludHIgc2luY2UgbGFzdCBjaGVjayAqLwotCXVpbnQJCQlSSU9UeENvdW50OwkJLyogbnVtYmVyIG9mIHhtaXQgaW50cnMgICovCi0JdWludAkJCVJJT1J4Q291bnQ7CQkvKiBudW1iZXIgb2YgcnggaW50cnMgKi8KLQl1aW50CQkJUklPUnVwQ291bnQ7CQkvKiBudW1iZXIgb2YgcnVwIGludHJzICovCi0JaW50CQkJUklYVGltZXI7IAotCWludAkJCVJJT0J1ZmZlclNpemU7CQkvKiBCdWZmZXJzaXplICovCi0JaW50CQkJUklPQnVmZmVyTWFzazsJCS8qIEJ1ZmZlcnNpemUgKi8KKwlpbnQgUklPSGFsdGVkOwkJLyogaGFsdGVkID8gKi8KKwlpbnQgUklPUnRhRGlzQ29uczsJLyogUlRBIGNvbm5lY3Rpb25zL2Rpc2Nvbm5lY3Rpb25zICovCisJdWludCBSSU9SZWFkQ2hlY2s7CS8qIFJpbyByZWFkIGNoZWNrICovCisJdWludCBSSU9Ob01lc3NhZ2U7CS8qIFRvIGRpc3BsYXkgbWVzc2FnZSBvciBub3QgKi8KKwl1aW50IFJJT051bUJvb3RQa3RzOwkvKiBob3cgbWFueSBwYWNrZXRzIGZvciBhbiBSVEEgKi8KKwl1aW50IFJJT0Jvb3RDb3VudDsJLyogc2l6ZSBvZiBSVEEgY29kZSAqLworCXVpbnQgUklPQm9vdGluZzsJLyogY291bnQgb2Ygb3V0c3RhbmRpbmcgYm9vdHMgKi8KKwl1aW50IFJJT1N5c3RlbVVwOwkvKiBCb290ZWQgPz8gKi8KKwl1aW50IFJJT0NvdW50aW5nOwkvKiBmb3IgY291bnRpbmcgaW50ZXJydXB0cyAqLworCXVpbnQgUklPSW50Q291bnQ7CS8qICMgb2YgaW50ciBzaW5jZSBsYXN0IGNoZWNrICovCisJdWludCBSSU9UeENvdW50OwkvKiBudW1iZXIgb2YgeG1pdCBpbnRycyAgKi8KKwl1aW50IFJJT1J4Q291bnQ7CS8qIG51bWJlciBvZiByeCBpbnRycyAqLworCXVpbnQgUklPUnVwQ291bnQ7CS8qIG51bWJlciBvZiBydXAgaW50cnMgKi8KKwlpbnQgUklYVGltZXI7CisJaW50IFJJT0J1ZmZlclNpemU7CS8qIEJ1ZmZlcnNpemUgKi8KKwlpbnQgUklPQnVmZmVyTWFzazsJLyogQnVmZmVyc2l6ZSAqLwogCi0JaW50CQkJUklPRmlyc3RNYWpvcjsJCS8qIEZpcnN0IGhvc3QgY2FyZCdzIG1ham9yIG5vICovCisJaW50IFJJT0ZpcnN0TWFqb3I7CS8qIEZpcnN0IGhvc3QgY2FyZCdzIG1ham9yIG5vICovCiAKLQl1aW50CQkJUklPTGFzdFBvcnRzTWFwcGVkOwkvKiBoaWdoZXN0IHBvcnQgbnVtYmVyIGtub3duICovCi0JdWludAkJCVJJT0ZpcnN0UG9ydHNNYXBwZWQ7CS8qIGxvd2VzdCBwb3J0IG51bWJlciBrbm93biAqLworCXVpbnQgUklPTGFzdFBvcnRzTWFwcGVkOwkvKiBoaWdoZXN0IHBvcnQgbnVtYmVyIGtub3duICovCisJdWludCBSSU9GaXJzdFBvcnRzTWFwcGVkOwkvKiBsb3dlc3QgcG9ydCBudW1iZXIga25vd24gKi8KIAotCXVpbnQJCQlSSU9MYXN0UG9ydHNCb290ZWQ7CS8qIGhpZ2hlc3QgcG9ydCBudW1iZXIgcnVubmluZyAqLwotCXVpbnQJCQlSSU9GaXJzdFBvcnRzQm9vdGVkOwkvKiBsb3dlc3QgcG9ydCBudW1iZXIgcnVubmluZyAqLworCXVpbnQgUklPTGFzdFBvcnRzQm9vdGVkOwkvKiBoaWdoZXN0IHBvcnQgbnVtYmVyIHJ1bm5pbmcgKi8KKwl1aW50IFJJT0ZpcnN0UG9ydHNCb290ZWQ7CS8qIGxvd2VzdCBwb3J0IG51bWJlciBydW5uaW5nICovCiAKLQl1aW50CQkJUklPTGFzdFBvcnRzT3BlbmVkOwkvKiBoaWdoZXN0IHBvcnQgbnVtYmVyIHJ1bm5pbmcgKi8KLQl1aW50CQkJUklPRmlyc3RQb3J0c09wZW5lZDsJLyogbG93ZXN0IHBvcnQgbnVtYmVyIHJ1bm5pbmcgKi8KKwl1aW50IFJJT0xhc3RQb3J0c09wZW5lZDsJLyogaGlnaGVzdCBwb3J0IG51bWJlciBydW5uaW5nICovCisJdWludCBSSU9GaXJzdFBvcnRzT3BlbmVkOwkvKiBsb3dlc3QgcG9ydCBudW1iZXIgcnVubmluZyAqLwogCiAJLyogRmxhZyB0byBzYXkgdGhhdCB0aGUgdG9wb2xvZ3kgaW5mb3JtYXRpb24gaGFzIGJlZW4gY2hhbmdlZC4gKi8KLQl1aW50CQkJUklPUXVpY2tDaGVjazsgCi0JdWludAkJCUNkUmVnaXN0ZXI7CQkvKiA/Pz8gKi8KLQlpbnQJCQlSSU9TaWduYWxQcm9jZXNzOwkvKiBTaWduYWxsaW5nIHByb2Nlc3MgKi8KLQlpbnQJCQlyaW9fZGVidWc7CQkvKiBUbyBkZWJ1ZyAuLi4gKi8KLQlpbnQJCQlSSU9EZWJ1Z1dhaXQ7CQkvKiBGb3Igd2hhdCA/Pz8gKi8KLQlpbnQJCQl0cHJpOwkJCS8qIFRocmVhZCBwcmlvICovCi0JaW50CQkJdGlkOwkJCS8qIFRocmVhZCBpZCAqLwotCXVpbnQJCQlfUklPX1BvbGxlZDsJCS8qIENvdW50ZXIgZm9yIHBvbGxpbmcgKi8KLQl1aW50CQkJX1JJT19JbnRlcnJ1cHRlZDsJLyogQ291bnRlciBmb3IgaW50ZXJydXB0ICovCi0JaW50CQkJaW50cl90aWQ7CQkvKiBpb2ludHNldCByZXR1cm4gdmFsdWUgKi8KLQlpbnQJCQlUeEVuU2VtOwkJLyogVHhFbmFibGUgU2VtYXBob3JlICovCisJdWludCBSSU9RdWlja0NoZWNrOworCXVpbnQgQ2RSZWdpc3RlcjsJLyogPz8/ICovCisJaW50IFJJT1NpZ25hbFByb2Nlc3M7CS8qIFNpZ25hbGxpbmcgcHJvY2VzcyAqLworCWludCByaW9fZGVidWc7CQkvKiBUbyBkZWJ1ZyAuLi4gKi8KKwlpbnQgUklPRGVidWdXYWl0OwkvKiBGb3Igd2hhdCA/Pz8gKi8KKwlpbnQgdHByaTsJCS8qIFRocmVhZCBwcmlvICovCisJaW50IHRpZDsJCS8qIFRocmVhZCBpZCAqLworCXVpbnQgX1JJT19Qb2xsZWQ7CS8qIENvdW50ZXIgZm9yIHBvbGxpbmcgKi8KKwl1aW50IF9SSU9fSW50ZXJydXB0ZWQ7CS8qIENvdW50ZXIgZm9yIGludGVycnVwdCAqLworCWludCBpbnRyX3RpZDsJCS8qIGlvaW50c2V0IHJldHVybiB2YWx1ZSAqLworCWludCBUeEVuU2VtOwkJLyogVHhFbmFibGUgU2VtYXBob3JlICovCiAKIAotCXN0cnVjdCBFcnJvcgkJUklPRXJyb3I7CQkvKiB0byBJZGVudGlmeSB3aGF0IHdlbnQgd3JvbmcgKi8gCi0Jc3RydWN0IENvbmYJCVJJT0NvbmY7CQkvKiBDb25maWd1cmF0aW9uID8/PyAqLwotCXN0cnVjdCB0dHlzdGF0aWNzCWNoYW5uZWxbUklPX1BPUlRTXTsJLyogY2hhbm5lbCBpbmZvcm1hdGlvbiAqLwotCWNoYXIJCQlSSU9Cb290UGFja2V0c1sxKyhTSVhUWV9GT1VSX0svUlRBX0JPT1RfREFUQV9TSVpFKV0KLQkJCQkJCQkJW1JUQV9CT09UX0RBVEFfU0laRV07Ci0Jc3RydWN0IE1hcAkJUklPQ29ubmVjdFRhYmxlW1RPVEFMX01BUF9FTlRSSUVTXTsKLQlzdHJ1Y3QgTWFwCQlSSU9TYXZlZFRhYmxlW1RPVEFMX01BUF9FTlRSSUVTXTsKKwlzdHJ1Y3QgRXJyb3IgUklPRXJyb3I7CS8qIHRvIElkZW50aWZ5IHdoYXQgd2VudCB3cm9uZyAqLworCXN0cnVjdCBDb25mIFJJT0NvbmY7CS8qIENvbmZpZ3VyYXRpb24gPz8/ICovCisJc3RydWN0IHR0eXN0YXRpY3MgY2hhbm5lbFtSSU9fUE9SVFNdOwkvKiBjaGFubmVsIGluZm9ybWF0aW9uICovCisJY2hhciBSSU9Cb290UGFja2V0c1sxICsgKFNJWFRZX0ZPVVJfSyAvIFJUQV9CT09UX0RBVEFfU0laRSldCisJICAgIFtSVEFfQk9PVF9EQVRBX1NJWkVdOworCXN0cnVjdCBNYXAgUklPQ29ubmVjdFRhYmxlW1RPVEFMX01BUF9FTlRSSUVTXTsKKwlzdHJ1Y3QgTWFwIFJJT1NhdmVkVGFibGVbVE9UQUxfTUFQX0VOVFJJRVNdOwogCiAJLyogUlRBIHRvIGhvc3QgYmluZGluZyB0YWJsZSBmb3IgbWFzdGVyL3NsYXZlIG9wZXJhdGlvbiAqLwotCXVsb25nCQkJUklPQmluZFRhYltNQVhfUlRBX0JJTkRJTkdTXTsKKwl1bG9uZyBSSU9CaW5kVGFiW01BWF9SVEFfQklORElOR1NdOwogCS8qIFJUQSBtZW1vcnkgZHVtcCB2YXJpYWJsZSAqLwotCXVjaGFyCQkJUklPTWVtRHVtcFtNRU1EVU1QX1NJWkVdOyAKLQlzdHJ1Y3QgTW9kdWxlSW5mbyAJUklPTW9kdWxlVHlwZXNbTUFYX01PRFVMRV9UWVBFU107CisJdWNoYXIgUklPTWVtRHVtcFtNRU1EVU1QX1NJWkVdOworCXN0cnVjdCBNb2R1bGVJbmZvIFJJT01vZHVsZVR5cGVzW01BWF9NT0RVTEVfVFlQRVNdOwogCiB9OwogCkBAIC0xNDEsNCArMTQxLDQgQEAKICNkZWZpbmUgV1JCWVRFKHgseSkJCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSgoeCkpID0gXAogCQkJCQkodW5zaWduZWQgY2hhcikoeSkKIAotI2VuZGlmCS8qIF9fcmlvZHJ2ci5oICovCisjZW5kaWYJCQkJLyogX19yaW9kcnZyLmggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvaW5mby5oIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9pbmZvLmgKaW5kZXggZTA4NDIxYy4uOGRlNzk2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9yaW9pbmZvLmgKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9pbmZvLmgKQEAgLTQxLDI5ICs0MSwyOSBAQAogKiogSG9zdCBjYXJkIGRhdGEgc3RydWN0dXJlCiAqLwogc3RydWN0IFJpb0hvc3RJbmZvIHsKLQlsb25nCWxvY2F0aW9uOwkvKiBSSU8gQ2FyZCBCYXNlIEkvTyBhZGRyZXNzICovCi0JbG9uZwl2ZWN0b3I7CQkvKiBSSU8gQ2FyZCBJUlEgdmVjdG9yICovCi0JaW50CWJ1czsJCS8qIElTQS9FSVNBL01DQS9QQ0kgKi8KLQlpbnQJbW9kZTsJCS8qIHBvaW50ZXIgdG8gaG9zdCBtb2RlIC0gSU5URVJSVVBUIC8gUE9MTEVEICovCisJbG9uZyBsb2NhdGlvbjsJCS8qIFJJTyBDYXJkIEJhc2UgSS9PIGFkZHJlc3MgKi8KKwlsb25nIHZlY3RvcjsJCS8qIFJJTyBDYXJkIElSUSB2ZWN0b3IgKi8KKwlpbnQgYnVzOwkJLyogSVNBL0VJU0EvTUNBL1BDSSAqLworCWludCBtb2RlOwkJLyogcG9pbnRlciB0byBob3N0IG1vZGUgLSBJTlRFUlJVUFQgLyBQT0xMRUQgKi8KIAlzdHJ1Y3Qgb2xkX3NndHR5YgotCQkqIFNnOwkJLyogcG9pbnRlciB0byBkZWZhdWx0IHRlcm0gY2hhcmFjdGVyaXN0aWNzICovCisJKlNnOwkJCS8qIHBvaW50ZXIgdG8gZGVmYXVsdCB0ZXJtIGNoYXJhY3RlcmlzdGljcyAqLwogfTsKIAogCiAvKiBNb2RlIGluIHJpbyBkZXZpY2UgaW5mbyAqLwotI2RlZmluZSBJTlRFUlJVUFRFRF9NT0RFCTB4MDEJCS8qIEludGVycnVwdCBpcyBnZW5lcmF0ZWQgKi8KLSNkZWZpbmUgUE9MTEVEX01PREUJCTB4MDIJCS8qIE5vIGludGVycnVwdCAqLwotI2RlZmluZSBBVVRPX01PREUJCTB4MDMJCS8qIEF1dG8gbW9kZSAqLworI2RlZmluZSBJTlRFUlJVUFRFRF9NT0RFCTB4MDEJLyogSW50ZXJydXB0IGlzIGdlbmVyYXRlZCAqLworI2RlZmluZSBQT0xMRURfTU9ERQkJMHgwMgkvKiBObyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgQVVUT19NT0RFCQkweDAzCS8qIEF1dG8gbW9kZSAqLwogCi0jZGVmaW5lIFdPUkRfQUNDRVNTX01PREUJMHgxMAkJLyogV29yZCBBY2Nlc3MgTW9kZSAqLwotI2RlZmluZSBCWVRFX0FDQ0VTU19NT0RFCTB4MjAJCS8qIEJ5dGUgQWNjZXNzIE1vZGUgKi8KKyNkZWZpbmUgV09SRF9BQ0NFU1NfTU9ERQkweDEwCS8qIFdvcmQgQWNjZXNzIE1vZGUgKi8KKyNkZWZpbmUgQllURV9BQ0NFU1NfTU9ERQkweDIwCS8qIEJ5dGUgQWNjZXNzIE1vZGUgKi8KIAogCiAvKiBCdXMgdHlwZSB0aGF0IFJJTyBzdXBwb3J0cyAqLwotI2RlZmluZSBJU0FfQlVTCQkJMHgwMQkJLyogVGhlIGNhcmQgaXMgSVNBICovCi0jZGVmaW5lIEVJU0FfQlVTCQkweDAyCQkvKiBUaGUgY2FyZCBpcyBFSVNBICovCi0jZGVmaW5lIE1DQV9CVVMJCQkweDA0CQkvKiBUaGUgY2FyZCBpcyBNQ0EgKi8KLSNkZWZpbmUgUENJX0JVUwkJCTB4MDgJCS8qIFRoZSBjYXJkIGlzIFBDSSAqLworI2RlZmluZSBJU0FfQlVTCQkJMHgwMQkvKiBUaGUgY2FyZCBpcyBJU0EgKi8KKyNkZWZpbmUgRUlTQV9CVVMJCTB4MDIJLyogVGhlIGNhcmQgaXMgRUlTQSAqLworI2RlZmluZSBNQ0FfQlVTCQkJMHgwNAkvKiBUaGUgY2FyZCBpcyBNQ0EgKi8KKyNkZWZpbmUgUENJX0JVUwkJCTB4MDgJLyogVGhlIGNhcmQgaXMgUENJICovCiAKIC8qCiAqKiAxMS4xMS4xOTk4IEFSRyAtIEVTSUwgPz8/PyBwYXJ0IGZpeApAQCAtOTMsNCArOTMsNCBAQAogCSdWJyAtICdAJwkJCQkvKiBsaXRlcmFsIG5leHQgY2hhciAqLyBcCiB9CiAKLSNlbmRpZiAvKiBfX3Jpb2luZm9faCAqLworI2VuZGlmCQkJCS8qIF9fcmlvaW5mb19oICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2luaXQuYyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvaW5pdC5jCmluZGV4IDg5OGExMjYuLjBkNDRlZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vcmlvaW5pdC5jCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvaW5pdC5jCkBAIC04NywyMjIgKzg3LDggQEAKIAogaW50IFJJT1BDSWluaXQoc3RydWN0IHJpb19pbmZvICpwLCBpbnQgTW9kZSk7CiAKLSNpZiAwCi1zdGF0aWMgdm9pZCBSSU9BbGxvY2F0ZUludGVycnVwdHMoc3RydWN0IHJpb19pbmZvICopOwotc3RhdGljIGludCBSSU9SZXBvcnQoc3RydWN0IHJpb19pbmZvICopOwotc3RhdGljIHZvaWQgUklPU3RvcEludGVycnVwdHMoc3RydWN0IHJpb19pbmZvICosIGludCwgaW50KTsKLSNlbmRpZgotCiBzdGF0aWMgaW50IFJJT1NjcnViKGludCwgQllURSAqLCBpbnQpOwogCi0jaWYgMAotZXh0ZXJuIGludAlyaW9faW50cigpOwotCi0vKgotKioJSW5pdCB0aW1lIGNvZGUuCi0qLwotdm9pZAotcmlvaW5pdCggcCwgaW5mbyApCi1zdHJ1Y3QgcmlvX2luZm8JCSogcDsKLXN0cnVjdCBSaW9Ib3N0SW5mbwkqIGluZm87Ci17Ci0JLyoKLQkqKiBNdWx0aS1Ib3N0IGNhcmQgc3VwcG9ydCAtIHRha2luZyB0aGUgZWFzeSB3YXkgb3V0IC0gc29ycnkgIQotCSoqIFdlIGFsbG9jYXRlIGFuZCBzZXQgdXAgdGhlIEhvc3QgYW5kIFBvcnQgc3RydWN0cyB3aGVuIHRoZQotCSoqIGRyaXZlciBpcyBjYWxsZWQgdG8gJ2luc3RhbGwnIHRoZSBmaXJzdCBob3N0LgotCSoqIFdlIGNoZWNrIGZvciB0aGlzIGZpcnN0ICdjYWxsJyBieSB0ZXN0aW5nIHRoZSBSSU9Qb3J0cCBwb2ludGVyLgotCSovCi0JaWYgKCAhcC0+UklPUG9ydHAgKQotCXsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAgIkFsbG9jYXRpbmcgYW5kIHNldHRpbmcgdXAgZHJpdmVyIGRhdGEgc3RydWN0dXJlc1xuIik7Ci0KLQkJUklPQWxsb2NEYXRhU3RydWN0cyhwKTsJCS8qIGFsbG9jYXRlIGhvc3QvcG9ydCBzdHJ1Y3RzICovCi0JCVJJT1NldHVwRGF0YVN0cnVjdHMocCk7CQkvKiBzZXR1cCB0b3BvbG9neSBzdHJ1Y3RzICovCi0JfQotCi0JUklPSW5pdEhvc3RzKCBwLCBpbmZvICk7CS8qIGh1bnQgZG93biB0aGUgaGFyZHdhcmUgKi8KLQotCVJJT0FsbG9jYXRlSW50ZXJydXB0cyhwKTsJLyogYWxsb2NhdGUgaW50ZXJydXB0cyAqLwotCVJJT1JlcG9ydChwKTsJCQkvKiBzaG93IHdoYXQgd2UgZm91bmQgKi8KLX0KLQotLyoKLSoqIEluaXRpYWxpc2UgdGhlIENhcmRzIAotKi8gCi12b2lkCi1SSU9Jbml0SG9zdHMocCwgaW5mbykKLXN0cnVjdCByaW9faW5mbwkJKiBwOwotc3RydWN0IFJpb0hvc3RJbmZvCSogaW5mbzsKLXsKLS8qCi0qKiAxNS4xMC4xOTk4IEFSRyAtIEVTSUwgMDc2MiBwYXJ0IGZpeAotKiogSWYgdGhlcmUgaXMgbm8gSVNBIGNhcmQgZGVmaW5pdGlvbiAtIHdlIGFsd2F5cyBsb29rIGZvciBQQ0kgY2FyZHMuCi0qKiBBcyB3ZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IG9uZSBob3N0IGNhcmQgdGhpcyBsZXRzIGFuIElTQSBjYXJkCi0qKiBkZWZpbml0aW9uIHRha2UgcHJlY2VkZW5jZSBvdmVyIFBMVUcgYW5kIFBMQVkuCi0qKiBObyBJU0EgY2FyZCAtIHdlIGFyZSBQTFVHIGFuZCBQTEFZIHdpdGggUENJLgotKi8KLQotCS8qCi0JKiogTm90ZSAtIGZvciBQQ0kgYm90aCB0aGVzZSB3aWxsIGJlIHplcm8sIHRoYXQncyBva2F5IGJlY2F1c2UKLQkqKiBSSU9QQ0lJbml0KCkgZmlsbHMgdGhlbSBpbiBpZiBhIGNhcmQgaXMgZm91bmQuCi0JKi8KLQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uSXZlYwk9IGluZm8tPnZlY3RvcjsKLQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUGFkZHJQCT0gaW5mby0+bG9jYXRpb247Ci0KLQkvKgotCSoqIENoZWNrIHRoYXQgd2UgYXJlIGFibGUgdG8gYWNjb21tb2RhdGUgYW5vdGhlciBob3N0Ci0JKi8KLQlpZiAoIHAtPlJJT051bUhvc3RzID49IFJJT19IT1NUUyApCi0JewotCQlwLT5SSU9GYWlsZWQrKzsKLQkJcmV0dXJuOwotCX0KLQotCWlmICggaW5mby0+YnVzICYgSVNBX0JVUyApCi0JewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiaW5pdGlhbGlzaW5nIGNhcmQgJWQgKElTQSlcbiIsIHAtPlJJT051bUhvc3RzKTsKLQkJUklPSVNBaW5pdChwLCBwLT5tb2RlKTsKLQl9Ci0JZWxzZQotCXsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAgImluaXRpYWxpc2luZyBjYXJkICVkIChQQ0kpXG4iLCBwLT5SSU9OdW1Ib3N0cyk7Ci0JCVJJT1BDSWluaXQocCwgUklPX1BDSV9ERUZBVUxUX01PREUpOwotCX0KLQotCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJUb3RhbCBob3N0cyBpbml0aWFsaXNlZCBzbyBmYXIgOiAlZFxuIiwgcC0+UklPTnVtSG9zdHMpOwotCi0KLSNpZmRlZiBGVVRVUkVfUkVMRUFTRQotCWlmIChwLT5idXMgJiBFSVNBX0JVUykKLQkJLyogRUlTQSBjYXJkICovCi0JCVJJT0VJU0Fpbml0KHAsIFJJT19FSVNBX0RFRkFVTFRfTU9ERSk7Ci0KLQlpZiAocC0+YnVzICYgTUNBX0JVUykKLQkJLyogTUNBIGNhcmQgKi8KLQkJUklPTUNBaW5pdChwLCBSSU9fTUNBX0RFRkFVTFRfTU9ERSk7Ci0jZW5kaWYKLX0KLQotLyoKLSoqIGdvIHRocm91Z2ggbWVtb3J5IGZvciBhbiBBVCBob3N0IHRoYXQgd2UgcGFzcyBpbiB0aGUgZGV2aWNlIGluZm8KLSoqIHN0cnVjdHVyZSBhbmQgaW5pdGlhbGlzZQotKi8KLXZvaWQKLVJJT0lTQWluaXQocCwgbW9kZSkKLXN0cnVjdCByaW9faW5mbyAqCXA7Ci1pbnQJCQkJCW1vZGU7Ci17Ci0KLSAgLyogWFhYIE5lZWQgdG8gaW1wbGVtZW50IHRoaXMuICovCi0jaWYgMAotCXAtPmludHJfdGlkID0gaW9pbnRzZXQocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkl2ZWMsCi0JCQkJCShpbnQgKCopKCkpcmlvX2ludHIsIChjaGFyKilwLT5SSU9OdW1Ib3N0cyk7Ci0KLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiU2V0IGludGVycnVwdCBoYW5kbGVyLCBpbnRyX3RpZCA9IDB4JXhcbiIsIHAtPmludHJfdGlkICk7Ci0KLQlpZiAoUklPRG9BVChwLCBwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUGFkZHJQLCBtb2RlKSkgewotCQlyZXR1cm47Ci0JfQotCWVsc2UgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJSSU9Eb0FUIGZhaWxlZFxuIik7Ci0JCXAtPlJJT0ZhaWxlZCsrOwotCX0KLSNlbmRpZgotCi19Ci0KLS8qCi0qKiBSSU9Eb0FUIDoKLSoqCi0qKiBNYXAgaW4gYSBib2FyZHMgcGh5c2ljYWwgYWRkcmVzcywgY2hlY2sgdGhhdCB0aGUgYm9hcmQgaXMgdGhlcmUsCi0qKiB0ZXN0IHRoZSBib2FyZCBhbmQgaWYgZXZlcnl0aGluZyBpcyBva2F5IGFzc2lnbiB0aGUgYm9hcmQgYW4gZW50cnkKLSoqIGluIHRoZSBSaW8gSG9zdHMgc3RydWN0dXJlLgotKi8KLWludAotUklPRG9BVChwLCBCYXNlLCBtb2RlKQotc3RydWN0IHJpb19pbmZvICoJcDsKLWludAkJQmFzZTsKLWludAkJbW9kZTsKLXsKLSNkZWZpbmUJRk9VTkQJCTEKLSNkZWZpbmUgTk9UX0ZPVU5ECTAKLQotCWNhZGRyX3QJCWNhcmRBZGRyOwotCi0JLyoKLQkqKiBDaGVjayB0byBzZWUgaWYgd2UgYWN0dWFsbHkgaGF2ZSBhIGJvYXJkIGF0IHRoaXMgcGh5c2ljYWwgYWRkcmVzcy4KLQkqLwotCWlmICgoY2FyZEFkZHIgPSBSSU9DaGVja0ZvckFUQ2FyZChCYXNlKSkgIT0gMCkgewotCQkvKgotCQkqKiBOb3cgdGVzdCB0aGUgYm9hcmQgdG8gc2VlIGlmIGl0IGlzIHdvcmtpbmcuCi0JCSovCi0JCWlmIChSSU9Cb2FyZFRlc3QoQmFzZSwgY2FyZEFkZHIsIFJJT19BVCwgMCkgPT0gUklPX1NVQ0NFU1MpIHsKLQkJCS8qCi0JCQkqKiBGaWxsIG91dCBhIHNsb3QgaW4gdGhlIFJpbyBob3N0IHN0cnVjdHVyZS4KLQkJCSovCi0JCQlpZiAoUklPQXNzaWduQVQocCwgQmFzZSwgY2FyZEFkZHIsIG1vZGUpKSB7Ci0JCQkJcmV0dXJuKEZPVU5EKTsKLQkJCX0KLQkJfQotCQlSSU9NYXBvdXQoQmFzZSwgUklPX0FUX01FTV9TSVpFLCBjYXJkQWRkcik7Ci0JfQotCXJldHVybihOT1RfRk9VTkQpOwotfQotCi1jYWRkcl90Ci1SSU9DaGVja0ZvckFUQ2FyZChCYXNlKQotaW50CQlCYXNlOwotewotCWludAkJCQlvZmY7Ci0Jc3RydWN0IERwUmFtCSpjYXJkcDsJCS8qIChQb2ludHMgYXQgdGhlIGhvc3QpICovCi0JY2FkZHJfdAkJCXZpcnRBZGRyOwotCXVuc2lnbmVkIGNoYXIJCQlSSU9TaWdUYWJbMjRdOwotLyoKLSoqIFRhYmxlIG9mIHZhbHVlcyB0byBzZWFyY2ggZm9yIGFzIHByb20gc2lnbmF0dXJlIG9mIGEgaG9zdCBjYXJkCi0qLwotCXN0cmNweShSSU9TaWdUYWIsICJKQkpHUEdHSElOU01KUEpSIik7Ci0KLQkvKgotCSoqIEhleSEgWWVzLCBZb3UgcmVhZGluZyB0aGlzIGNvZGUhIFlvLCBncmFiIGEgbG9hZCBhIHRoaXM6Ci0JKioKLQkqKiBJRiB0aGUgY2FyZCBpcyB1c2luZyBXT1JEIE1PREUgcmF0aGVyIHRoYW4gQllURSBNT0RFCi0JKiogdGhlbiBpdCB3aWxsIG9jY3VweSAxMjhLIG9mIFBIWVNJQ0FMIG1lbW9yeSBhcmVhLiBTbywKLQkqKiB5b3UgbWlnaHQgdGhpbmsgdGhhdCB0aGUgZm9sbG93aW5nIE1hcGluIGlzIHdyb25nLiBXZWxsLAotCSoqIGl0IGlzbid0LCBiZWNhdXNlIHRoZSBTRUNPTkQgNjRLIG9mIG9jY3VwaWVkIHNwYWNlIGlzIGFuCi0JKiogRVhBQ1QgQ09QWSBvZiB0aGUgRklSU1QgNjRLLiAoZ29vZD8pLCBzbywgd2UgbmVlZCBvbmx5Ci0JKiogbWFwIGl0IGluIGluIG9uZSA2NEsgYmxvY2suCi0JKi8KLQlpZiAoUklPTWFwaW4oQmFzZSwgUklPX0FUX01FTV9TSVpFLCAmdmlydEFkZHIpID09IC0xKSB7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBDb3VsZG4ndCBtYXAgdGhlIGJvYXJkIGluIVxuIik7Ci0JCXJldHVybigoY2FkZHJfdCkwKTsKLQl9Ci0KLQkvKgotCSoqIHZpcnRBZGRyIHBvaW50cyB0byB0aGUgRFAgcmFtIG9mIHRoZSBzeXN0ZW0uCi0JKiogV2Ugbm93IGNhc3QgdGhpcyB0byBhIHBvaW50ZXIgdG8gYSBSSU8gSG9zdCwKLQkqKiBhbmQgaGF2ZSBhIHJ1bW1hZ2UgYWJvdXQgaW4gdGhlIFBST00uCi0JKi8KLQljYXJkcCA9IChzdHJ1Y3QgRHBSYW0gKil2aXJ0QWRkcjsKLQotCWZvciAob2ZmPTA7IFJJT1NpZ1RhYltvZmZdOyBvZmYrKykgewotCQlpZiAoKFJCWVRFKGNhcmRwLT5EcFNpZ25hdHVyZVtvZmZdKSAmIDB4RkYpICE9IFJJT1NpZ1RhYltvZmZdKSB7Ci0JCQkvKgotCQkJKiogU2lnbmF0dXJlIG1pc21hdGNoIC0gY2FyZCBub3QgYXQgdGhpcyBhZGRyZXNzCi0JCQkqLwotCQkJUklPTWFwb3V0KEJhc2UsIFJJT19BVF9NRU1fU0laRSwgdmlydEFkZHIpOwotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IENvdWxkbid0IG1hdGNoIHRoZSBzaWduYXR1cmUgMHgleCAweCV4IVxuIiwKLQkJCQkJCShpbnQpY2FyZHAsIG9mZik7Ci0JCQlyZXR1cm4oKGNhZGRyX3QpMCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSoqIElmIHdlIGdldCBoZXJlIHRoZW4gd2UgbXVzdCBoYXZlIGZvdW5kIGEgdmFsaWQgYm9hcmQgc28gcmV0dXJuCi0JKiogaXRzIHZpcnR1YWwgYWRkcmVzcy4KLQkqLwotCXJldHVybih2aXJ0QWRkcik7Ci19Ci0jZW5kaWYKIAogLyoqCiAqKiBSSU9Bc3NpZ25BVCA6CkBAIC0zNjcsNjY3ICsxNTMsNiBAQAogCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBUZXN0cyBQYXNzZWQgYXQgMHgleFxuIiwgQmFzZSk7CiAJcmV0dXJuKDEpOwogfQotI2lmIDAKLSNpZmRlZiBGVVRVUkVfUkVMRUFTRQotaW50IFJJT01DQWluaXQoaW50IE1vZGUpCi17Ci0JdWNoYXIgU2xvdE51bWJlcjsKLQljYWRkcl90IENhZGRyOwotCXVpbnQJUGFkZHI7Ci0JdWludAlJdmVjOwotCWludAkgSGFuZGxlOwotCWludAkgcmV0ID0gMDsKLQotCS8qCi0JKiogVmFsaWQgbW9kZSBpbmZvcm1hdGlvbiBmb3IgTUNBIGNhcmRzCi0JKiogaXMgb25seSBGQVNUIExJTktTCi0JKi8KLQlNb2RlID0gKE1vZGUgJiBGQVNUX0xJTktTKSA/IE1jYVRwRmFzdExpbmtzIDogTWNhVHBTbG93TGlua3M7Ci0JcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPTUNBaW5pdCglZClcbiIsTW9kZSk7Ci0KLQotCS8qCi0JKiogQ2hlY2sgb3V0IGVhY2ggb2YgdGhlIHNsb3RzCi0JKi8KLQlmb3IgKFNsb3ROdW1iZXIgPSAwOyBTbG90TnVtYmVyIDwgTWNhTWF4U2xvdHM7IFNsb3ROdW1iZXIrKykgewotCS8qCi0JKiogRW5hYmxlIHRoZSBzbG90IHdlIHdhbnQgdG8gdGFsayB0bwotCSovCi0Jb3V0YiggTWNhU2xvdFNlbGVjdCwgU2xvdE51bWJlciB8IE1jYVNsb3RFbmFibGUgKTsKLQotCS8qCi0JKiogUmVhZCB0aGUgSUQgd29yZCBmcm9tIHRoZSBzbG90Ci0JKi8KLQlpZiAoKChpbmIoTWNhSWRIaWdoKTw8IDgpfGluYihNY2FJZExvdykpID09IE1jYVJJT0lkKQotCXsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUG90ZW50aWFsIE1DQSBjYXJkIGluIHNsb3QgJWRcbiIsIFNsb3ROdW1iZXIpOwotCi0JCS8qCi0JCSoqIENhcmQgYXBwZWFycyB0byBiZSBhIFJJTyBNQ0EgY2FyZCEKLQkJKi8KLQkJUklPTWFjaGluZVR5cGUgfD0gKDE8PFJJT19NQ0EpOwotCi0JCS8qCi0JCSoqIEp1c3QgY2hlY2sgd2UgaGF2ZW4ndCBmb3VuZCB0b28gbWFueSB3b25kZXJmdWwgb2JqZWN0cwotCQkqLwotCQlpZiAoIFJJT051bUhvc3RzID49IFJJT19IT1NUUyApCi0JCXsKLQkJUnByaW50ZihSSU9NZXNnVG9vTWFueUNhcmRzKTsKLQkJcmV0dXJuKHJldCk7Ci0JCX0KLQotCQkvKgotCQkqKiBNY2FJcnFFbmFibGUgY29udGFpbnMgdGhlIGludGVycnVwdCB2ZWN0b3IsIGFuZCBhIGNhcmQKLQkJKiogZW5hYmxlIGJpdC4KLQkJKi8KLQkJSXZlYyA9IGluYihNY2FJcnFFbmFibGUpOwotCi0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkl2ZWMgaXMgJXhcbiIsIEl2ZWMpOwotCi0JCXN3aXRjaCAoIEl2ZWMgJiBNY2FJcnFNYXNrICkKLQkJewotCQljYXNlIE1jYUlycTk6Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIklSUTlcbiIpOwotCQlicmVhazsKLQkJY2FzZSBNY2FJcnEzOgotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJJUlEzXG4iKTsKLQkJYnJlYWs7Ci0JCWNhc2UgTWNhSXJxNDoKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiSVJRNFxuIik7Ci0JCWJyZWFrOwotCQljYXNlIE1jYUlycTc6Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIklSUTdcbiIpOwotCQlicmVhazsKLQkJY2FzZSBNY2FJcnExMDoKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiSVJRMTBcbiIpOwotCQlicmVhazsKLQkJY2FzZSBNY2FJcnExMToKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiSVJRMTFcbiIpOwotCQlicmVhazsKLQkJY2FzZSBNY2FJcnExMjoKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiSVJRMTJcbiIpOwotCQlicmVhazsKLQkJY2FzZSBNY2FJcnExNToKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiSVJRMTVcbiIpOwotCQlicmVhazsKLQkJfQotCi0JCS8qCi0JCSoqIElmIHRoZSBjYXJkIGVuYWJsZSBiaXQgaXNuJ3Qgc2V0LCB0aGVuIHNldCBpdCEKLQkJKi8KLQkJaWYgKChJdmVjICYgTWNhQ2FyZEVuYWJsZSkgIT0gTWNhQ2FyZEVuYWJsZSkgewotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiTWNhQ2FyZEVuYWJsZSBub3Qgc2V0IC0gc2V0dGluZyFcbiIpOwotCQkJb3V0YihNY2FJcnFFbmFibGUsSXZlY3xNY2FDYXJkRW5hYmxlKTsKLQkJfSBlbHNlCi0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJNY2FDYXJkRW5hYmxlIGFscmVhZHkgc2V0XG4iKTsKLQotCQkvKgotCQkqKiBDb252ZXJ0IHRoZSBJUlEgZW5hYmxlIG1hc2sgaW50byBzb21ldGhpbmcgdXNlZnVsCi0JCSovCi0JCUl2ZWMgPSBSSU9NY2FUb0l2ZWNbSXZlYyAmIE1jYUlycU1hc2tdOwotCi0JCS8qCi0JCSoqIEZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3MKLQkJKi8KLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiaW5iKE1jYU1lbW9yeSkgaXMgJXhcbiIsIGluYihNY2FNZW1vcnkpKTsKLQkJUGFkZHIgPSBNY2FBZGRyZXNzKGluYihNY2FNZW1vcnkpKTsKLQotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJNQ0EgY2FyZCBoYXMgSXZlYyAlZCBBZGRyICV4XG4iLCBJdmVjLCBQYWRkcik7Ci0KLQkJaWYgKCBQYWRkciAhPSAwICkKLQkJewotCi0JCS8qCi0JCSoqIFRlbGwgdGhlIG1lbW9yeSBtYXBwZXIgdGhhdCB3ZSB3YW50IHRvIHRhbGsgdG8gaXQKLQkJKi8KLQkJSGFuZGxlID0gUklPTWFwaW4oIFBhZGRyLCBSSU9fTUNBX01FTV9TSVpFLCAmQ2FkZHIgKTsKLQotCQlpZiAoIEhhbmRsZSA9PSAtMSApIHsKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkNvdWxkbid0IG1hcCAlZCBieXRlcyBhdCAleFxuIiwgUklPX01DQV9NRU1fU0laRSwgUGFkZHI7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkJvYXJkIG1hcHBlZCB0byB2YWRkciAweCV4XG4iLCBDYWRkcik7Ci0KLQkJLyoKLQkJKiogQW5kIGNoZWNrIHRoYXQgaXQgaXMgYWN0dWFsbHkgdGhlcmUhCi0JCSovCi0JCWlmICggUklPQm9hcmRUZXN0KCBQYWRkcixDYWRkcixSSU9fTUNBLFNsb3ROdW1iZXIgKSA9PSBSSU9fU1VDQ0VTUyApCi0JCXsKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkJvYXJkIGhhcyBwYXNzZWQgdGVzdFxuIik7Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJTbG90ICVkLiBUeXBlICVkLiBQYWRkciAweCV4LiBDYWRkciAweCV4LiBNb2RlIDB4JXguXG4iLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb3ROdW1iZXIsIFJJT19NQ0EsIFBhZGRyLCBDYWRkciwgTW9kZSk7Ci0KLQkJCS8qCi0JCQkqKiBCb2FyZCBoYXMgcGFzc2VkIGl0cyBzY3J1YiB0ZXN0LiBGaWxsIGluIGFsbCB0aGUKLQkJCSoqIHRyYW5zaWVudCBzdHVmZi4KLQkJCSovCi0JCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uU2xvdAkgPSBTbG90TnVtYmVyOwotCQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLkl2ZWMJID0gSXZlYzsKLQkJCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5UeXBlCSA9IFJJT19NQ0E7Ci0JCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uQ29weQkgPSBiY29weTsKLQkJCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5QYWRkclAgICA9IFBhZGRyOwotCQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLkNhZGRyCT0gQ2FkZHI7Ci0JCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uQ2FyZFAJPSAoc3RydWN0IERwUmFtICopQ2FkZHI7Ci0JCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uTW9kZQkgPSBNb2RlOwotCQkJV0JZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlJlc2V0SW50ICwgMHhmZik7Ci0JCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVW5pcXVlTnVtID0KLQkJCSgoUkJZVEUocC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlVuaXF1ZVswXSkmMHhGRik8PDApfAotCQkJCQkJKChSQllURShwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVW5pcXVlWzFdKSYweEZGKTw8OCl8Ci0JCQkoKFJCWVRFKHAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5VbmlxdWVbMl0pJjB4RkYpPDwxNil8Ci0JCQkoKFJCWVRFKHAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5VbmlxdWVbM10pJjB4RkYpPDwyNCk7Ci0JCQlSSU9OdW1Ib3N0cysrOwotCQkJcmV0Kys7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvKgotCQkJKiogSXQgZmFpbGVkIHRoZSB0ZXN0LCBzbyBpZ25vcmUgaXQuCi0JCQkqLwotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiVEVTVCBGQUlMRURcbiIpOwotCQkJUklPTWFwb3V0KFBhZGRyLCBSSU9fTUNBX01FTV9TSVpFLCBDYWRkciApOwotCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlNsb3QgJWQgLSBQYWRkciB6ZXJvIVxuIiwgU2xvdE51bWJlcik7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiU2xvdCAlZCBOT1QgUklPXG4iLCBTbG90TnVtYmVyKTsKLQl9Ci0JfQotCS8qCi0JKiogTm93IHdlIGhhdmUgY2hlY2tlZCBhbGwgdGhlIHNsb3RzLCB0dXJuIG9mZiB0aGUgTUNBIHNsb3Qgc2VsZWN0b3IKLQkqLwotCW91dGIoTWNhU2xvdFNlbGVjdCwwKTsKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJTbG90ICVkIE5PVCBSSU9cbiIsIFNsb3ROdW1iZXIpOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCBSSU9FSVNBaW5pdCggaW50IE1vZGUgKQotewotCXN0YXRpYyBpbnQgRUlTQURvbmUgPSAwOwotCXVpbnQgUGFkZHI7Ci0JaW50IFBvbGxJbnRNaXhNc2dEb25lID0gMDsKLQljYWRkcl90IENhZGRyOwotCXVzaG9ydCBJZGVudDsKLQl1Y2hhciBFaXNhU2xvdDsKLQl1Y2hhciBJdmVjOwotCWludCByZXQgPSAwOwotCi0JLyoKLQkqKiBUaGUgb25seSB2YWxpZCBtb2RlIGluZm9ybWF0aW9uIGZvciBFSVNBIGhvc3RzIGlzIGZhc3Qgb3Igc2xvdwotCSoqIGxpbmtzLgotCSovCi0JTW9kZSA9IChNb2RlICYgRkFTVF9MSU5LUykgPyBFSVNBX1RQX0ZBU1RfTElOS1MgOiBFSVNBX1RQX1NMT1dfTElOS1M7Ci0KLQlpZiAoIEVJU0FEb25lICkKLQl7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJT0VJU0Fpbml0KCkgLSBhbHJlYWR5IGRvbmUsIHJldHVybi5cbiIpOwotCQlyZXR1cm4oMCk7Ci0JfQotCi0JRUlTQURvbmUrKzsKLQotCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJT0VJU0Fpbml0KClcbiIpOwotCi0KLQkvKgotCSoqIEZpcnN0IGNoZWNrIGFsbCBjYXJkcyB0byBzZWUgaWYgQU5ZIGFyZSBzZXQgZm9yIHBvbGxlZCBtb2RlIG9wZXJhdGlvbi4KLQkqKiBJZiBzbywgc2V0IEFMTCB0byBwb2xsZWQuCi0JKi8KLQotCWZvciAoIEVpc2FTbG90PTE7IEVpc2FTbG90PD1SSU9fTUFYX0VJU0FfU0xPVFM7IEVpc2FTbG90KysgKQotCXsKLQlJZGVudCA9IChJTkJaKEVpc2FTbG90LEVJU0FfUFJPRFVDVF9JREVOVF9ISSk8PDgpIHwKLQkJIElOQlooRWlzYVNsb3QsRUlTQV9QUk9EVUNUX0lERU5UX0xPKTsKLQotCWlmICggSWRlbnQgPT0gUklPX0VJU0FfSURFTlQgKQotCXsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRm91bmQgU3BlY2lhbGl4IHByb2R1Y3RcbiIpOwotCi0JCWlmICggSU5CWihFaXNhU2xvdCxFSVNBX1BST0RVQ1RfTlVNQkVSKSAhPSBSSU9fRUlTQV9QUk9EVUNUX0NPREUgKQotCQl7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIk5vdCBTcGVjaWFsaXggUklPIC0gUHJvZHVjdCBudW1iZXIgJXhcbiIsCi0JCQkJCQlJTkJaKEVpc2FTbG90LCBFSVNBX1BST0RVQ1RfTlVNQkVSKSk7Ci0JCWNvbnRpbnVlOyAgLyogbmV4dCBzbG90ICovCi0JCX0KLQkJLyoKLQkJKiogSXRzIGEgU3BlY2lhbGl4IFJJTyEKLQkJKi8KLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPIFJldmlzaW9uICVkXG4iLAotCQkJCQlJTkJaKEVpc2FTbG90LCBFSVNBX1JFVklTSU9OX05VTUJFUikpOwotCQkKLQkJUklPTWFjaGluZVR5cGUgfD0gKDE8PFJJT19FSVNBKTsKLQotCQkvKgotCQkqKiBKdXN0IGNoZWNrIHdlIGhhdmVuJ3QgZm91bmQgdG9vIG1hbnkgd29uZGVyZnVsIG9iamVjdHMKLQkJKi8KLQkJaWYgKCBSSU9OdW1Ib3N0cyA+PSBSSU9fSE9TVFMgKQotCQl7Ci0JCVJwcmludGYoUklPTWVzZ1Rvb01hbnlDYXJkcyk7Ci0JCXJldHVybiAwOwotCQl9Ci0KLQkJLyoKLQkJKiogRW5zdXJlIHRoYXQgdGhlIGVuYWJsZSBiaXQgaXMgc2V0IQotCQkqLwotCQlPVVRCWiggRWlzYVNsb3QsIEVJU0FfRU5BQkxFLCBSSU9fRUlTQV9FTkFCTEVfQklUICk7Ci0KLQkJLyoKLQkJKiogRUlTQV9JTlRFUlJVUFRfVkVDIGNvbnRhaW5zIHRoZSBpbnRlcnJ1cHQgdmVjdG9yLgotCQkqLwotCQlJdmVjID0gSU5CWihFaXNhU2xvdCxFSVNBX0lOVEVSUlVQVF9WRUMpOwotCi0jaWZkZWYgUklPREVCVUcKLQkJc3dpdGNoICggSXZlYyAmIEVJU0FfSU5URVJSVVBUX01BU0sgKQotCQl7Ci0JCWNhc2UgRUlTQV9JUlFfMzoKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkVJU0EgSVJRIDNcbiIpOwotCQlicmVhazsKLQkJY2FzZSBFSVNBX0lSUV80OgotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRUlTQSBJUlEgNFxuIik7Ci0JCWJyZWFrOwotCQljYXNlIEVJU0FfSVJRXzU6Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJFSVNBIElSUSA1XG4iKTsKLQkJYnJlYWs7Ci0JCWNhc2UgRUlTQV9JUlFfNjoKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkVJU0EgSVJRIDZcbiIpOwotCQlicmVhazsKLQkJY2FzZSBFSVNBX0lSUV83OgotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRUlTQSBJUlEgN1xuIik7Ci0JCWJyZWFrOwotCQljYXNlIEVJU0FfSVJRXzk6Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJFSVNBIElSUSA5XG4iKTsKLQkJYnJlYWs7Ci0JCWNhc2UgRUlTQV9JUlFfMTA6Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJFSVNBIElSUSAxMFxuIik7Ci0JCWJyZWFrOwotCQljYXNlIEVJU0FfSVJRXzExOgotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRUlTQSBJUlEgMTFcbiIpOwotCQlicmVhazsKLQkJY2FzZSBFSVNBX0lSUV8xMjoKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkVJU0EgSVJRIDEyXG4iKTsKLQkJYnJlYWs7Ci0JCWNhc2UgRUlTQV9JUlFfMTQ6Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJFSVNBIElSUSAxNFxuIik7Ci0JCWJyZWFrOwotCQljYXNlIEVJU0FfSVJRXzE1OgotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRUlTQSBJUlEgMTVcbiIpOwotCQlicmVhazsKLQkJY2FzZSBFSVNBX1BPTExFRDoKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkVJU0EgUE9MTEVEXG4iKTsKLQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsIE5VTEwsREJHX0lOSVR8REJHX0ZBSUwsIlNoYWdnZWQgaW50ZXJydXB0IG51bWJlciFcbiIpOwotCQlJdmVjICY9IEVJU0FfQ09OVFJPTF9NQVNLOwotCQl9Ci0jZW5kaWYKLQotCQlpZiAoIChJdmVjICYgRUlTQV9JTlRFUlJVUFRfTUFTSykgPT0KLQkJIEVJU0FfUE9MTEVEICkKLQkJewotCQlSSU9XaWxsUG9sbCA9IDE7Ci0JCWJyZWFrOwkJLyogRnJvbSBFaXNhU2xvdCBsb29wICovCi0JCX0KLQl9Ci0JfQotCi0JLyoKLQkqKiBEbyBpdCBhbGwgYWdhaW4gbm93IHdlIGtub3cgd2hldGhlciB0byBjaGFuZ2UgYWxsIGNhcmRzIHRvIHBvbGxlZAotCSoqIG1vZGUgb3Igbm90Ci0JKi8KLQotCWZvciAoIEVpc2FTbG90PTE7IEVpc2FTbG90PD1SSU9fTUFYX0VJU0FfU0xPVFM7IEVpc2FTbG90KysgKQotCXsKLQlJZGVudCA9IChJTkJaKEVpc2FTbG90LEVJU0FfUFJPRFVDVF9JREVOVF9ISSk8PDgpIHwKLQkJIElOQlooRWlzYVNsb3QsRUlTQV9QUk9EVUNUX0lERU5UX0xPKTsKLQotCWlmICggSWRlbnQgPT0gUklPX0VJU0FfSURFTlQgKQotCXsKLQkJaWYgKCBJTkJaKEVpc2FTbG90LEVJU0FfUFJPRFVDVF9OVU1CRVIpICE9IFJJT19FSVNBX1BST0RVQ1RfQ09ERSApCi0JCWNvbnRpbnVlOyAgLyogbmV4dCBzbG90ICovCi0KLQkJLyoKLQkJKiogSXRzIGEgU3BlY2lhbGl4IFJJTyEKLQkJKi8KLQkJCi0JCS8qCi0JCSoqIEVuc3VyZSB0aGF0IHRoZSBlbmFibGUgYml0IGlzIHNldCEKLQkJKi8KLQkJT1VUQlooIEVpc2FTbG90LCBFSVNBX0VOQUJMRSwgUklPX0VJU0FfRU5BQkxFX0JJVCApOwotCi0JCS8qCi0JCSoqIEVJU0FfSU5URVJSVVBUX1ZFQyBjb250YWlucyB0aGUgaW50ZXJydXB0IHZlY3Rvci4KLQkJKi8KLQkJSXZlYyA9IElOQlooRWlzYVNsb3QsRUlTQV9JTlRFUlJVUFRfVkVDKTsKLQotCQlpZiAoIFJJT1dpbGxQb2xsICkKLQkJewotCQkJLyoKLQkJCSoqIElmIHdlIGFyZSBnb2luZyB0byBvcGVyYXRlIGluIHBvbGxlZCBtb2RlLCBidXQgdGhpcwotCQkJKiogYm9hcmQgaXMgY29uZmlndXJlZCB0byBiZSBpbnRlcnJ1cHQgZHJpdmVuLCBkaXNwbGF5Ci0JCQkqKiB0aGUgbWVzc2FnZSBleHBsYWluaW5nIHRoZSBzaXR1YXRpb24gdG8gdGhlIHB1bnRlciwKLQkJCSoqIGFzc3VtaW5nIHdlIGhhdmVuJ3QgYWxyZWFkeSBkb25lIHNvLgotCQkJKi8KLQotCQkJaWYgKCAhUG9sbEludE1peE1zZ0RvbmUgJiYKLQkJCSAoSXZlYyAmIEVJU0FfSU5URVJSVVBUX01BU0spICE9IEVJU0FfUE9MTEVEICkKLQkJCXsKLQkJCVJwcmludGYoUklPTWVzZ0FsbFBvbGxlZCk7Ci0JCQlQb2xsSW50TWl4TXNnRG9uZSA9IDE7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkqKiBVbmdyYWNpb3VzbHkgaWdub3JlIHdoYXRldmVyIHRoZSBib2FyZCByZXBvcnRzIGFzIGl0cwotCQkJKiogaW50ZXJydXB0IHZlY3Rvci4uLgotCQkJKi8KLQotCQkJSXZlYyAmPSB+RUlTQV9JTlRFUlJVUFRfTUFTSzsKLQotCQkJLyoKLQkJCSoqIC4uLmFuZCBmb3JjZSBpdCB0byBkYW5jZSB0byB0aGUgcG9sbCB0dW5lLgotCQkJKi8KLQotCQkJSXZlYyB8PSBFSVNBX1BPTExFRDsKLQkJfQotCi0JCS8qCi0JCSoqIENvbnZlcnQgdGhlIElSUSBlbmFibGUgbWFzayBpbnRvIHNvbWV0aGluZyB1c2VmdWwgKDAtMTUpCi0JCSovCi0JCUl2ZWMgPSBSSU9FaXNhVG9JdmVjKEl2ZWMpOwotCi0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkVJU0EgaG9zdCBpbiBzbG90ICVkIGhhcyBJdmVjIDB4JXhcbiIsCi0JCSBFaXNhU2xvdCwgSXZlYyk7Ci0KLQkJLyoKLQkJKiogRmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcwotCQkqLwotCQlQYWRkciA9IChJTkJaKEVpc2FTbG90LEVJU0FfTUVNT1JZX0JBU0VfSEkpPDwyNCkgfAotCQkJCShJTkJaKEVpc2FTbG90LEVJU0FfTUVNT1JZX0JBU0VfTE8pPDwxNik7Ci0KLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiRUlTQSBjYXJkIGhhcyBJdmVjICVkIEFkZHIgJXhcbiIsIEl2ZWMsIFBhZGRyKTsKLQotCQlpZiAoIFBhZGRyID09IDAgKQotCQl7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwKLQkJICJCb2FyZCBpbiBzbG90ICVkIGNvbmZpZ3VyZWQgZm9yIGFkZHJlc3MgemVybyFcbiIsIEVpc2FTbG90KTsKLQkJY29udGludWU7Ci0JCX0KLQotCQkvKgotCQkqKiBUZWxsIHRoZSBtZW1vcnkgbWFwcGVyIHRoYXQgd2Ugd2FudCB0byB0YWxrIHRvIGl0Ci0JCSovCi0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkFib3V0IHRvIG1hcCBFSVNBIGNhcmQgXG4iKTsKLQotCQlpZiAoUklPTWFwaW4oIFBhZGRyLCBSSU9fRUlTQV9NRU1fU0laRSwgJkNhZGRyKSA9PSAtMSkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJDb3VsZG4ndCBtYXAgJWQgYnl0ZXMgYXQgJXhcbiIsCi0JCQkJCQkJUklPX0VJU0FfTUVNX1NJWkUsUGFkZHIpOwotCQljb250aW51ZTsKLQkJfQotCi0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIkJvYXJkIG1hcHBlZCB0byB2YWRkciAweCV4XG4iLCBDYWRkcik7Ci0KLQkJLyoKLQkJKiogQW5kIGNoZWNrIHRoYXQgaXQgaXMgYWN0dWFsbHkgdGhlcmUhCi0JCSovCi0JCWlmICggUklPQm9hcmRUZXN0KCBQYWRkcixDYWRkcixSSU9fRUlTQSxFaXNhU2xvdCkgPT0gUklPX1NVQ0NFU1MgKQotCQkJewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJCb2FyZCBoYXMgcGFzc2VkIHRlc3RcbiIpOwotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsIAotCQkiU2xvdCAlZC4gSXZlYyAlZC4gVHlwZSAlZC4gUGFkZHIgMHgleC4gQ2FkZHIgMHgleC4gTW9kZSAweCV4LlxuIiwKLQkJCUVpc2FTbG90LEl2ZWMsUklPX0VJU0EsUGFkZHIsQ2FkZHIsTW9kZSk7Ci0KLQkJLyoKLQkJKiogQm9hcmQgaGFzIHBhc3NlZCBpdHMgc2NydWIgdGVzdC4gRmlsbCBpbiBhbGwgdGhlCi0JCSoqIHRyYW5zaWVudCBzdHVmZi4KLQkJKi8KLQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlNsb3QJID0gRWlzYVNsb3Q7Ci0JCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5JdmVjCSA9IEl2ZWM7Ci0JCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5UeXBlCSA9IFJJT19FSVNBOwotCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uQ29weQkgPSBiY29weTsKLQkJCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uUGFkZHJQICAgPSBQYWRkcjsKLQkJCQlwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uQ2FkZHIJPSBDYWRkcjsKLQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLkNhcmRQCT0gKHN0cnVjdCBEcFJhbSAqKUNhZGRyOwotCQkJCXAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5Nb2RlCSA9IE1vZGU7Ci0JCS8qCi0JCSoqIGJlY2F1c2UgdGhlIEVJU0EgcHJvbSBpcyBtYXBwZWQgaW50byBJTyBzcGFjZSwgd2UKLQkJKiogbmVlZCB0byBjb3B5IHRoZSB1bnFpdWUgbnVtYmVyIGludG8gdGhlIG1lbW9yeSBhcmVhCi0JCSoqIHRoYXQgaXQgd291bGQgaGF2ZSBvY2N1cGllZCwgc28gdGhhdCB0aGUgZG93bmxvYWQKLQkJKiogY29kZSBjYW4gZGV0ZXJtaW5lIGl0cyBJRCBhbmQgY2FyZCB0eXBlLgotCQkqLwotCSBXQllURShwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVW5pcXVlWzBdLElOQlooRWlzYVNsb3QsRUlTQV9VTklRVUVfTlVNXzApKTsKLQkgV0JZVEUocC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlVuaXF1ZVsxXSxJTkJaKEVpc2FTbG90LEVJU0FfVU5JUVVFX05VTV8xKSk7Ci0JIFdCWVRFKHAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5VbmlxdWVbMl0sSU5CWihFaXNhU2xvdCxFSVNBX1VOSVFVRV9OVU1fMikpOwotCSBXQllURShwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVW5pcXVlWzNdLElOQlooRWlzYVNsb3QsRUlTQV9VTklRVUVfTlVNXzMpKTsKLQkJcC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlVuaXF1ZU51bSA9Ci0JCQkoKFJCWVRFKHAtPlJJT0hvc3RzW1JJT051bUhvc3RzXS5VbmlxdWVbMF0pJjB4RkYpPDwwKXwKLQkJCQkJCSgoUkJZVEUocC0+UklPSG9zdHNbUklPTnVtSG9zdHNdLlVuaXF1ZVsxXSkmMHhGRik8PDgpfAotCQkJKChSQllURShwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVW5pcXVlWzJdKSYweEZGKTw8MTYpfAotCQkJKChSQllURShwLT5SSU9Ib3N0c1tSSU9OdW1Ib3N0c10uVW5pcXVlWzNdKSYweEZGKTw8MjQpOwotCQlJTkJaKEVpc2FTbG90LEVJU0FfSU5URVJSVVBUX1JFU0VUKTsKLQkJCQlSSU9OdW1Ib3N0cysrOwotCQlyZXQrKzsKLQkJCX0KLQkJZWxzZQotCQl7Ci0JCS8qCi0JCSoqIEl0IGZhaWxlZCB0aGUgdGVzdCwgc28gaWdub3JlIGl0LgotCQkqLwotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJURVNUIEZBSUxFRFxuIik7Ci0KLQkJUklPTWFwb3V0KFBhZGRyLCBSSU9fRUlTQV9NRU1fU0laRSwgQ2FkZHIgKTsKLQkJfQotCX0KLQl9Ci0JaWYgKFJJT01hY2hpbmVUeXBlICYgUklPX0VJU0EpCi0JcmV0dXJuIHJldCsxOwotCXJldHVybiByZXQ7Ci19Ci0jZW5kaWYKLQotCi0jaWZuZGVmIGxpbnV4Ci0KLSNkZWZpbmUgQ09ORklHX0FERFJFU1MJMHhjZjgKLSNkZWZpbmUgQ09ORklHX0RBVEEJCTB4Y2ZjCi0jZGVmaW5lIEZPUldBUkRfUkVHCQkweGNmYQotCi0KLXN0YXRpYyBpbnQKLXJlYWRfY29uZmlnKGludCBidXNfbnVtYmVyLCBpbnQgZGV2aWNlX251bSwgaW50IHJfbnVtYmVyKSAKLXsKLQl1bnNpZ25lZCBpbnQgY2F2OwotCXVuc2lnbmVkIGludCB2YWw7Ci0KLS8qCi0gICBCdWlsZCBjb25maWdfYWRkcmVzc192YWx1ZToKLQotICAgICAgMzEgICAgICAgIDI0IDIzICAgICAgICAxNiAxNSAgICAgIDExIDEwICA4IDcgICAgICAgIDAgCi0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIHwxfCAwMDAwMDAwIHwgYnVzX251bWJlciB8IGRldmljZSAjIHwgMDAwIHwgcmVnaXN0ZXIgfAotICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0JY2F2ID0gcl9udW1iZXIgJiAweGZmOwotCWNhdiB8PSAoKGRldmljZV9udW0gJiAweDFmKSA8PCAxMSk7Ci0JY2F2IHw9ICgoYnVzX251bWJlciAmIDB4ZmYpIDw8IDE2KTsKLQljYXYgfD0gMHg4MDAwMDAwMDsgLyogRW5hYmxlIGJpdCAqLwotCW91dHBkKENPTkZJR19BRERSRVNTLGNhdik7Ci0JdmFsID0gaW5wZChDT05GSUdfREFUQSk7Ci0Jb3V0cGQoQ09ORklHX0FERFJFU1MsMCk7Ci0JcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljCi13cml0ZV9jb25maWcoYnVzX251bWJlcixkZXZpY2VfbnVtLHJfbnVtYmVyLHZhbCkgCi17Ci0JdW5zaWduZWQgaW50IGNhdjsKLQotLyoKLSAgIEJ1aWxkIGNvbmZpZ19hZGRyZXNzX3ZhbHVlOgotCi0gICAgICAzMSAgICAgICAgMjQgMjMgICAgICAgIDE2IDE1ICAgICAgMTEgMTAgIDggNyAgICAgICAgMCAKLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgfDF8IDAwMDAwMDAgfCBidXNfbnVtYmVyIHwgZGV2aWNlICMgfCAwMDAgfCByZWdpc3RlciB8Ci0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLQljYXYgPSByX251bWJlciAmIDB4ZmY7Ci0JY2F2IHw9ICgoZGV2aWNlX251bSAmIDB4MWYpIDw8IDExKTsKLQljYXYgfD0gKChidXNfbnVtYmVyICYgMHhmZikgPDwgMTYpOwotCWNhdiB8PSAweDgwMDAwMDAwOyAvKiBFbmFibGUgYml0ICovCi0Jb3V0cGQoQ09ORklHX0FERFJFU1MsIGNhdik7Ci0Jb3V0cGQoQ09ORklHX0RBVEEsIHZhbCk7Ci0Jb3V0cGQoQ09ORklHX0FERFJFU1MsIDApOwotCXJldHVybiB2YWw7Ci19Ci0jZWxzZQotLyogWFhYIEltcGxlbWVudCB0aGVzZS4uLiAqLwotc3RhdGljIGludAotcmVhZF9jb25maWcoaW50IGJ1c19udW1iZXIsIGludCBkZXZpY2VfbnVtLCBpbnQgcl9udW1iZXIpIAotewotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotd3JpdGVfY29uZmlnKGludCBidXNfbnVtYmVyLCBpbnQgZGV2aWNlX251bSwgaW50IHJfbnVtYmVyKSAKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgotCi1pbnQKLVJJT1BDSWluaXQocCwgTW9kZSkKLXN0cnVjdCByaW9faW5mbwkqcDsKLWludCAJCU1vZGU7Ci17Ci0JI2RlZmluZSBNQVhfUENJX1NMT1QJCTMyCi0JI2RlZmluZSBSSU9fUENJX0pFVF9DQVJECTB4MjAwMDExQ0IKLQotCXN0YXRpYyBpbnQJc2xvdDsJLyogY291bnQgb2YgbWFjaGluZSdzIFBDSSBzbG90cyBzZWFyY2hlZCBzbyBmYXIgKi8KLQljYWRkcl90CQlDYWRkcjsJLyogVmlydHVhbCBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IFBDSSBob3N0IGNhcmQuICovCi0JdW5zaWduZWQgY2hhcglJdmVjOwkvKiBpbnRlcnJ1cHQgdmVjdG9yIGZvciB0aGUgY3VycmVudCBQQ0kgaG9zdCAqLwotCXVuc2lnbmVkIGxvbmcJUGFkZHI7CS8qIFBoeXNpY2FsIGFkZHJlc3MgZm9yIHRoZSBjdXJyZW50IFBDSSBob3N0ICovCi0JaW50CQlIYW5kbGU7CS8qIEhhbmRsZSB0byBWaXJ0dWFsIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGN1cnJlbnQgUENJIGhvc3QgKi8KLQotCi0JcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAgIlNlYXJjaCBmb3IgYSBSSU8gUENJIGNhcmQgLSBzdGFydCBhdCBzbG90ICVkXG4iLCBzbG90KTsKLQotCS8qCi0JKiogSW5pdGlhbGlzZSB0aGUgc2VhcmNoIHN0YXR1cwotCSovCi0JcC0+UklPTGFzdFBDSVNlYXJjaAk9IFJJT19GQUlMOwotCi0Jd2hpbGUgKCAoc2xvdCA8IE1BWF9QQ0lfU0xPVCkgJiAocC0+UklPTGFzdFBDSVNlYXJjaCAhPSBSSU9fU1VDQ0VTUykgKQotCXsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAgIkN1cnJlbnRseSB0ZXN0aW5nIHNsb3QgJWRcbiIsIHNsb3QpOwotCi0JCWlmIChyZWFkX2NvbmZpZygwLHNsb3QsMCkgPT0gUklPX1BDSV9KRVRfQ0FSRCkgewotCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkl2ZWMgPSAwOwotCQkJUGFkZHIgPSByZWFkX2NvbmZpZygwLHNsb3QsMHgxOCk7Ci0JCQlQYWRkciA9IFBhZGRyIC0gKFBhZGRyICYgMHgxKTsgLyogTWFzayBvZmYgdGhlIGlvIGJpdCAqLwotCi0JCQlpZiAoIChQYWRkciA9PSAwKSB8fCAoKFBhZGRyICYgMHhmZmZmMDAwMCkgPT0gMHhmZmZmMDAwMCkgKSB7Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAgIkdvb2ZlZCB1cCBzbG90XG4iKTsJLyogd2hhdCEgKi8KLQkJCQlzbG90Kys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5QYWRkclAgPSBQYWRkcjsKLQkJCUl2ZWMgPSAocmVhZF9jb25maWcoMCxzbG90LDB4M2MpICYgMHhmZik7Ci0KLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgICJQQ0kgSG9zdCBhdCAweCV4LCBJbnRyICVkXG4iLCAoaW50KVBhZGRyLCBJdmVjKTsKLQotCQkJSGFuZGxlID0gUklPTWFwaW4oIFBhZGRyLCBSSU9fUENJX01FTV9TSVpFLCAmQ2FkZHIgKTsKLQkJCWlmIChIYW5kbGUgPT0gLTEpIHsKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiQ291bGRuJ3QgbWFwICVkIGJ5dGVzIGF0IDB4JXhcbiIsIFJJT19QQ0lfTUVNX1NJWkUsIChpbnQpUGFkZHIpOwotCQkJCXNsb3QrKzsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5JdmVjID0gSXZlYyArIDMyOwotCQkJcC0+aW50cl90aWQgPSBpb2ludHNldChwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uSXZlYywKLQkJCQkJCShpbnQgKCopKCkpcmlvX2ludHIsIChjaGFyICopcC0+UklPTnVtSG9zdHMpOwotCQkJaWYgKFJJT0JvYXJkVGVzdCggUGFkZHIsIENhZGRyLCBSSU9fUENJLCAwICkgPT0gUklPX1NVQ0NFU1MpIHsKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICgiQm9hcmQgaGFzIHBhc3NlZCB0ZXN0XG4iKTsKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICgiUGFkZHIgMHgleC4gQ2FkZHIgMHgleC4gTW9kZSAweCV4LlxuIiwgUGFkZHIsIENhZGRyLCBNb2RlKTsKLQotCQkJCS8qCi0JCQkJKiogQm9hcmQgaGFzIHBhc3NlZCBpdHMgc2NydWIgdGVzdC4gRmlsbCBpbiBhbGwgdGhlCi0JCQkJKiogdHJhbnNpZW50IHN0dWZmLgotCQkJCSovCi0JCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlNsb3QJICAgPSAwOwotCQkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5JdmVjCSAgID0gSXZlYyArIDMyOwotCQkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5UeXBlCSAgID0gUklPX1BDSTsKLQkJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ29weQkgICA9IHJpb19wY2ljb3B5OyAKLQkJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUGFkZHJQCSAgID0gUGFkZHI7Ci0JCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkNhZGRyCSAgID0gQ2FkZHI7Ci0JCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkNhcmRQCSAgID0gKHN0cnVjdCBEcFJhbSAqKUNhZGRyOwotCQkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5Nb2RlCSAgID0gTW9kZTsKLQotI2lmIDAKLQkJCQlXQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ29udHJvbCwgCi0JCQkJCQlCT09UX0ZST01fUkFNIHwgRVhURVJOQUxfQlVTX09GRiB8IAotCQkJCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLk1vZGUgfCAKLQkJCQkJCUlOVEVSUlVQVF9ESVNBQkxFICk7Ci0JCQkJV0JZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlJlc2V0SW50LDB4ZmYpOwotCQkJCVdCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5Db250cm9sLAotCQkJCQkJQk9PVF9GUk9NX1JBTSB8IEVYVEVSTkFMX0JVU19PRkYgfCAKLQkJCQkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5Nb2RlIHwKLQkJCQkJCUlOVEVSUlVQVF9ESVNBQkxFICk7Ci0JCQkJV0JZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlJlc2V0SW50LDB4ZmYpOwotI2Vsc2UKLQkJCQlXQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uUmVzZXRJbnQsIDB4ZmYpOwotI2VuZGlmCi0JCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZU51bSAgPQotCQkJCQkoKFJCWVRFKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbMF0pJjB4RkYpPDwwKXwKLQkJCQkJKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzFdKSYweEZGKTw8OCl8Ci0JCQkJCSgoUkJZVEUocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVsyXSkmMHhGRik8PDE2KXwKLQkJCQkJKChSQllURShwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uVW5pcXVlWzNdKSYweEZGKTw8MjQpOwotCi0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiVW5pcXVlIG5vIDB4JXguXG4iLCAKLQkJCQkgICAgcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZU51bSk7Ci0KLQkJCQlwLT5SSU9MYXN0UENJU2VhcmNoID0gUklPX1NVQ0NFU1M7Ci0JCQkJcC0+UklPTnVtSG9zdHMrKzsKLQkJCX0KLQkJfQotCQlzbG90Kys7Ci0JfQotCi0JaWYgKCBzbG90ID49IE1BWF9QQ0lfU0xPVCApIHsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAgIkFsbCAlZCBQQ0kgc2xvdHMgaGF2ZSB0ZXN0ZWQgZm9yIFJJTyBjYXJkcyAhISFcbiIsCi0JCQkgICAgIE1BWF9QQ0lfU0xPVCk7Ci0JfQotCi0KLQkvKgotCSoqIEkgZG9uJ3QgdGhpbmsgd2Ugd2FudCB0byBkbyB0aGlzIGFueW1vcmUKLQkqKgotCi0JaWYgKCFwLT5SSU9MYXN0UENJU2VhcmNoID09IFJJT19GQUlMICkgewotCQlwLT5SSU9GYWlsZWQrKzsKLQl9Ci0KLQkqKgotCSovCi19Ci0KLSNpZmRlZiBGVVRVUkVfUkVMRUFTRQotdm9pZCByaW9oYWx0KCB2b2lkICkKLXsKLQlpbnQgaG9zdDsKLQlmb3IgKCBob3N0PTA7IGhvc3Q8cC0+UklPTnVtSG9zdHM7IGhvc3QrKyApCi0JewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJTdG9wIGhvc3QgJWRcbiIsIGhvc3QpOwotCQkodm9pZClSSU9Cb2FyZFRlc3QoIHAtPlJJT0hvc3RzW2hvc3RdLlBhZGRyUCwgcC0+UklPSG9zdHNbaG9zdF0uQ2FkZHIsIHAtPlJJT0hvc3RzW2hvc3RdLlR5cGUscC0+UklPSG9zdHNbaG9zdF0uU2xvdCApOwotCX0KLX0KLSNlbmRpZgotI2VuZGlmCiAKIHN0YXRpYwl1Y2hhcgl2YWxbXSA9IHsKICNpZmRlZiBWRVJZX0xPTkdfVEVTVApAQCAtMTI2MiwyMDAgKzM4Nyw2IEBACiAJcmV0dXJuIFJJT19TVUNDRVNTOwogfQogCi0vKgotKiogdHJ5IHRvIGVuc3VyZSB0aGF0IGV2ZXJ5IGhvc3QgaXMgZWl0aGVyIGluIHBvbGxlZCBtb2RlCi0qKiBvciBpcyBpbiBpbnRlcnJ1cHQgbW9kZS4gT25seSBhbGxvdyBpbnRlcnJ1cHQgbW9kZSBpZgotKiogYWxsIGhvc3RzIGNhbiBpbnRlcnJ1cHQgKHdoeT8pCi0qKiBhbmQgZm9yY2UgaW50byBwb2xsZWQgbW9kZSBpZiB0b2xkIHRvLiBQYXRjaCB1cCB0aGUKLSoqIGludGVycnVwdCB2ZWN0b3IgJiBzYWx1dGUgVGhlIFF1ZWVuIHdoZW4geW91J3ZlIGRvbmUuCi0qLwotI2lmIDAKLXN0YXRpYyB2b2lkCi1SSU9BbGxvY2F0ZUludGVycnVwdHMocCkKLXN0cnVjdCByaW9faW5mbyAqCXA7Ci17Ci0JaW50IEhvc3Q7Ci0KLQkvKgotCSoqIEVhc3kgY2FzZSAtIGlmIHdlIGhhdmUgYmVlbiB0b2xkIHRvIHBvbGwsIHRoZW4gd2UgcG9sbC4KLQkqLwotCWlmIChwLT5tb2RlICYgUE9MTEVEX01PREUpIHsKLQkJUklPU3RvcEludGVycnVwdHMocCwgMCwgMCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSoqIGNoZWNrIC0gaWYgYW55IGhvc3QgaGFzIGJlZW4gc2V0IHRvIHBvbGxlZCBtb2RlLCB0aGVuIGFsbCBtdXN0IGJlLgotCSovCi0JZm9yIChIb3N0PTA7IEhvc3Q8cC0+UklPTnVtSG9zdHM7IEhvc3QrKykgewotCQlpZiAoIChwLT5SSU9Ib3N0c1tIb3N0XS5UeXBlICE9IFJJT19BVCkgJiYKLQkJCQkocC0+UklPSG9zdHNbSG9zdF0uSXZlYyA9PSBQT0xMRUQpICkgewotCQkJUklPU3RvcEludGVycnVwdHMocCwgMSwgSG9zdCApOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCWZvciAoSG9zdD0wOyBIb3N0PHAtPlJJT051bUhvc3RzOyBIb3N0KyspIHsKLQkJaWYgKHAtPlJJT0hvc3RzW0hvc3RdLlR5cGUgPT0gUklPX0FUKSB7Ci0JCQlpZiAoIChwLT5SSU9Ib3N0c1tIb3N0XS5JdmVjIC0gMzIpID09IDApIHsKLQkJCQlSSU9TdG9wSW50ZXJydXB0cyhwLCAyLCBIb3N0ICk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKgotKiogc29tZXRoaW5nIGhhcyBkZWNpZGVkIHRoYXQgd2UgY2FuJ3QgYmUgZG9pbmcgd2l0aCB0aGVzZQotKiogbmV3LWZhbmdsZWQgaW50ZXJydXB0IHRoaW5naWVzLiBTZXQgZXZlcnl0aGluZyB1cCB0byBqdXN0Ci0qKiBwb2xsLgotKi8KLXN0YXRpYyB2b2lkCi1SSU9TdG9wSW50ZXJydXB0cyhwLCBSZWFzb24sIEhvc3QpCi1zdHJ1Y3QgcmlvX2luZm8gKglwOwotaW50CVJlYXNvbjsKLWludAlIb3N0OyAKLXsKLSNpZmRlZiBGVVRVUkVfUkVMRUFTRQotCXN3aXRjaCAoUmVhc29uKSB7Ci0JCWNhc2UgMDoJLyogZm9yY2VkIGludG8gcG9sbGluZyBieSByaW9fcG9sbGVkICovCi0JCQlicmVhazsKLQkJY2FzZSAxOgkvKiBTQ1UgaGFzIHNldCAnSG9zdCcgaW50byBwb2xsZWQgbW9kZSAqLwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoJLyogdGhlcmUgYXJlbid0IGVub3VnaCBpbnRlcnJ1cHQgdmVjdG9ycyBmb3IgJ0hvc3QnICovCi0JCQlicmVhazsKLQl9Ci0jZW5kaWYKLQotCWZvciAoSG9zdD0wOyBIb3N0PHAtPlJJT051bUhvc3RzOyBIb3N0KysgKSB7Ci0JCXN0cnVjdCBIb3N0ICpIb3N0UCA9ICZwLT5SSU9Ib3N0c1tIb3N0XTsKLQotCQlzd2l0Y2ggKEhvc3RQLT5UeXBlKSB7Ci0JCQljYXNlIFJJT19BVDoKLQkJCQkvKgotCQkJCSoqIFRoZSBBVCBob3N0IGhhcyBpdCdzIGludGVycnVwdHMgZGlzYWJsZWQgYnkgY2xlYXJpbmcgdGhlCi0JCQkJKiogaW50X2VuYWJsZSBiaXQuCi0JCQkJKi8KLQkJCQlIb3N0UC0+TW9kZSAmPSB+SU5URVJSVVBUX0VOQUJMRTsKLQkJCQlIb3N0UC0+SXZlYyA9IFBPTExFRDsKLQkJCQlicmVhazsKLSNpZmRlZiBGVVRVUkVfUkVMRUFTRQotCQkJY2FzZSBSSU9fRUlTQToKLQkJCQkvKgotCQkJCSoqIFRoZSBFSVNBIGhvc3QgaGFzIGl0J3MgaW50ZXJydXB0cyBkaXNhYmxlZCBieSBzZXR0aW5nIHRoZQotCQkJCSoqIEl2ZWMgdG8gemVybwotCQkJCSovCi0JCQkJSG9zdFAtPkl2ZWMgPSBQT0xMRUQ7Ci0JCQkJYnJlYWs7Ci0jZW5kaWYKLQkJCWNhc2UgUklPX1BDSToKLQkJCQkvKgotCQkJCSoqIFRoZSBQQ0kgaG9zdCBoYXMgaXQncyBpbnRlcnJ1cHRzIGRpc2FibGVkIGJ5IGNsZWFyaW5nIHRoZQotCQkJCSoqIGludF9lbmFibGUgYml0LCBsaWtlIGEgcmVndWxhciBob3N0IGNhcmQuCi0JCQkJKi8KLQkJCQlIb3N0UC0+TW9kZSAmPSB+UklPX1BDSV9JTlRfRU5BQkxFOwotCQkJCUhvc3RQLT5JdmVjID0gUE9MTEVEOwotCQkJCWJyZWFrOwotI2lmZGVmIEZVVFVSRV9SRUxFQVNFCi0JCQljYXNlIFJJT19NQ0E6Ci0JCQkJLyoKLQkJCQkqKiBUaGVyZSdzIGFsd2F5cyBvbmUsIGlzbid0IHRoZXJlPwotCQkJCSoqIFRoZSBNQ0EgaG9zdCBjYXJkIGNhbm5vdCBoYXZlIGl0J3MgaW50ZXJydXB0cyBkaXNhYmxlZC4KLQkJCQkqLwotCQkJCVJJT1BhdGNoVmVjKEhvc3RQKTsKLQkJCQlicmVhazsKLSNlbmRpZgotCQl9Ci0JfQotfQotCi0vKgotKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgaW5pdCB0aW1lIHRvIHNldHVwIHRoZSBkYXRhIHN0cnVjdHVyZXMuCi0qLwotdm9pZAotUklPQWxsb2NEYXRhU3RydWN0cyhwKQotc3RydWN0IHJpb19pbmZvICoJcDsKLXsKLQlpbnQJcG9ydCwKLQkJaG9zdCwKLQkJdG07Ci0KLQlwLT5SSU9Qb3J0cCA9IChzdHJ1Y3QgUG9ydCAqKXN5c2JyayhSSU9fUE9SVFMgKiBzaXplb2Yoc3RydWN0IFBvcnQpKTsKLQlpZiAoIXAtPlJJT1BvcnRwKSB7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTy1pbml0OiBObyBtZW1vcnkgZm9yIHBvcnQgc3RydWN0dXJlc1xuIik7Ci0JCXAtPlJJT0ZhaWxlZCsrOwotCQlyZXR1cm47Ci0JfSAKLQliemVybyggcC0+UklPUG9ydHAsIHNpemVvZihzdHJ1Y3QgUG9ydCkgKiBSSU9fUE9SVFMgKTsKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiUklPLWluaXQ6IGFsbG9jYXRlZCBhbmQgY2xlYXJlZCBtZW1vcnkgZm9yIHBvcnQgc3RydWN0c1xuIik7Ci0JcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAgIkZpcnN0IFJJTyBwb3J0IHN0cnVjdCBAMHgleCwgc2l6ZT0weCV4IGJ5dGVzXG4iLAotCSAgICAoaW50KXAtPlJJT1BvcnRwLCBzaXplb2Yoc3RydWN0IFBvcnQpKTsKLQotCWZvciggcG9ydD0wOyBwb3J0PFJJT19QT1JUUzsgcG9ydCsrICkgewotCQlwLT5SSU9Qb3J0cFtwb3J0XS5Qb3J0TnVtID0gcG9ydDsKLQkJcC0+UklPUG9ydHBbcG9ydF0uVHR5UCA9ICZwLT5jaGFubmVsW3BvcnRdOwotCQlzcmVzZXQgKHAtPlJJT1BvcnRwW3BvcnRdLkluVXNlKTsJLyogTGV0IHRoZSBmaXJzdCBndXkgdXNlcyBpdCAqLwotCQlwLT5SSU9Qb3J0cFtwb3J0XS5wb3J0U2VtID0gLTE7CS8qIExldCB0aGUgZmlyc3QgZ3V5IHRha2VzIGl0ICovCi0JCXAtPlJJT1BvcnRwW3BvcnRdLlBhcmFtU2VtID0gLTE7CS8qIExldCB0aGUgZmlyc3QgZ3V5IHRha2VzIGl0ICovCi0JCXAtPlJJT1BvcnRwW3BvcnRdLnRpbWVvdXRfaWQgPSAwOwkvKiBMZXQgdGhlIGZpcnN0IGd1eSB0YWtlcyBpdCAqLwotCX0KLQotCXAtPlJJT0hvc3RzID0gKHN0cnVjdCBIb3N0ICopc3lzYnJrKFJJT19IT1NUUyAqIHNpemVvZihzdHJ1Y3QgSG9zdCkpOwotCWlmICghcC0+UklPSG9zdHMpIHsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiUklPLWluaXQ6IE5vIG1lbW9yeSBmb3IgaG9zdCBzdHJ1Y3R1cmVzXG4iKTsKLQkJcC0+UklPRmFpbGVkKys7Ci0JCXJldHVybjsKLQl9Ci0JYnplcm8ocC0+UklPSG9zdHMsIHNpemVvZihzdHJ1Y3QgSG9zdCkqUklPX0hPU1RTKTsKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICAiUklPLWluaXQ6IGFsbG9jYXRlZCBhbmQgY2xlYXJlZCBtZW1vcnkgZm9yIGhvc3Qgc3RydWN0c1xuIik7Ci0JcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAgIkZpcnN0IFJJTyBob3N0IHN0cnVjdCBAMHgleCwgc2l6ZT0weCV4IGJ5dGVzXG4iLAotCSAgICAoaW50KXAtPlJJT0hvc3RzLCBzaXplb2Yoc3RydWN0IEhvc3QpKTsKLQotCWZvciggaG9zdD0wOyBob3N0PFJJT19IT1NUUzsgaG9zdCsrICkgewotCQlzcGluX2xvY2tfaW5pdCAoJnAtPlJJT0hvc3RzW2hvc3RdLkhvc3RMb2NrKTsKLQkJcC0+UklPSG9zdHNbaG9zdF0udGltZW91dF9pZCA9IDA7IC8qIExldCB0aGUgZmlyc3QgZ3V5IHRha2VzIGl0ICovCi0JfQotCS8qCi0JKiogY2hlY2sgdGhhdCB0aGUgYnVmZmVyIHNpemUgaXMgdmFsaWQsIHJvdW5kIGRvd24gdG8gdGhlIG5leHQgcG93ZXIgb2YKLQkqKiB0d28gaWYgbmVjZXNzYXJ5OyBpZiB0aGUgcmVzdWx0IGlzIHplcm8sIHRoZW4sIGhleSwgbm8gZG91YmxlIGJ1ZmZlcnMuCi0JKi8KLQlmb3IgKCB0bSA9IDE7IHRtICYmIHRtIDw9IHAtPlJJT0NvbmYuQnVmZmVyU2l6ZTsgdG0gPDw9IDEgKQotCQk7Ci0JdG0gPj49IDE7Ci0JcC0+UklPQnVmZmVyU2l6ZSA9IHRtOwotCXAtPlJJT0J1ZmZlck1hc2sgPSB0bSA/IHRtIC0gMSA6IDA7Ci19Ci0KLS8qCi0qKiB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIHdoZW5ldmVyIHRoZSBkYXRhIHN0cnVjdHVyZXMgbmVlZCB0byBiZQotKiogcmUtc2V0dXAsIGZvciBleGFtcGxlLCBhZnRlciBhIHJpb2hhbHQgKHdoeSBkaWQgSSBldmVyIGludmVudCBpdD8pCi0qLwotdm9pZAotUklPU2V0dXBEYXRhU3RydWN0cyhwKQotc3RydWN0IHJpb19pbmZvCSogcDsKLXsKLQlpbnQgaG9zdCwgZW50cnksIHJ1cDsKLQotCWZvciAoIGhvc3Q9MDsgaG9zdDxSSU9fSE9TVFM7IGhvc3QrKyApIHsKLQkJc3RydWN0IEhvc3QgKkhvc3RQID0gJnAtPlJJT0hvc3RzW2hvc3RdOwotCQlmb3IgKCBlbnRyeT0wOyBlbnRyeTxMSU5LU19QRVJfVU5JVDsgZW50cnkrKyApIHsKLQkJCUhvc3RQLT5Ub3BvbG9neVtlbnRyeV0uVW5pdCA9IFJPVVRFX0RJU0NPTk5FQ1Q7Ci0JCQlIb3N0UC0+VG9wb2xvZ3lbZW50cnldLkxpbmsgPSBOT19MSU5LOwotCQl9Ci0JCWJjb3B5KCJIT1NUIFgiLCBIb3N0UC0+TmFtZSwgNyk7Ci0JCUhvc3RQLT5OYW1lWzVdID0gJzEnK2hvc3Q7Ci0JCWZvciAocnVwPTA7IHJ1cDwoTUFYX1JVUCArIExJTktTX1BFUl9VTklUKTsgcnVwKyspIHsKLQkJCWlmIChydXAgPCBNQVhfUlVQKSB7Ci0JCQkJZm9yIChlbnRyeT0wOyBlbnRyeTxMSU5LU19QRVJfVU5JVDsgZW50cnkrKyApIHsKLQkJCQkJSG9zdFAtPk1hcHBpbmdbcnVwXS5Ub3BvbG9neVtlbnRyeV0uVW5pdCA9IFJPVVRFX0RJU0NPTk5FQ1Q7Ci0JCQkJCUhvc3RQLT5NYXBwaW5nW3J1cF0uVG9wb2xvZ3lbZW50cnldLkxpbmsgPSBOT19MSU5LOwotCQkJCX0KLQkJCQlSSU9EZWZhdWx0TmFtZShwLCBIb3N0UCwgcnVwKTsKLQkJCX0KLQkJCXNwaW5fbG9ja19pbml0KCZIb3N0UC0+VW5peFJ1cHNbcnVwXS5SdXBMb2NrKTsKLQkJfQotCX0KLX0KLSNlbmRpZgogCiBpbnQKIFJJT0RlZmF1bHROYW1lKHAsIEhvc3RQLCBVbml0SWQpCkBAIC0xNDYzLDEwICszOTQsNiBAQAogc3RydWN0IEhvc3QgKglIb3N0UDsKIHVpbnQJCQlVbml0SWQ7CiB7Ci0jaWZkZWYgQ0hFQ0sKLQlDaGVja0hvc3QoIEhvc3QgKTsKLQlDaGVja1VuaXRJZCggVW5pdElkICk7Ci0jZW5kaWYKIAliY29weSgiVU5LTk9XTiBSVEEgWC1YWCIsSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5OYW1lLDE3KTsKIAlIb3N0UC0+TWFwcGluZ1tVbml0SWRdLk5hbWVbMTJdPScxJysoSG9zdFAtcC0+UklPSG9zdHMpOwogCWlmICgoVW5pdElkKzEpID4gOSkgewpAQCAtMTQ4MywzMyArNDEwLDYgQEAKICNkZWZpbmUgUklPX1JFTEVBU0UJIkxpbnV4IgogI2RlZmluZSBSRUxFQVNFX0lECSIxLjAiCiAKLSNpZiAwCi1zdGF0aWMgaW50Ci1SSU9SZXBvcnQocCkKLXN0cnVjdCByaW9faW5mbyAqCXA7Ci17Ci0JY2hhciAqCVJJT1JlbGVhc2UgPSBSSU9fUkVMRUFTRTsKLQljaGFyICoJUklPUmVsSUQgPSBSRUxFQVNFX0lEOwotCWludAkJaG9zdDsKLQotCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIlJJTyA6IFJlbGVhc2U6ICVzIElEOiAlc1xuIiwgUklPUmVsZWFzZSwgUklPUmVsSUQpOwotCi0JaWYgKCBwLT5SSU9OdW1Ib3N0cz09MCApIHsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiXG5ObyBIb3N0cyBjb25maWd1cmVkXG4iKTsKLQkJcmV0dXJuKDApOwotCX0KLQotCWZvciAoIGhvc3Q9MDsgaG9zdCA8IHAtPlJJT051bUhvc3RzOyBob3N0KysgKSB7Ci0JCXN0cnVjdCBIb3N0ICpIb3N0UCA9ICZwLT5SSU9Ib3N0c1tob3N0XTsKLQkJc3dpdGNoICggSG9zdFAtPlR5cGUgKSB7Ci0JCQljYXNlIFJJT19BVDoKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOSVQsICJBVCBCVVMgOiBmb3VuZCB0aGUgY2FyZCBhdCAweCV4XG4iLCBIb3N0UC0+UGFkZHJQKTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IHJpb1ZlcnNpb24Jc3RWZXJzaW9uOwogCiBzdHJ1Y3QgcmlvVmVyc2lvbiAqCkBAIC0xNTIzLDI3ICs0MjMsNiBAQAogICAgIHJldHVybiAmc3RWZXJzaW9uOwogfQogCi0jaWYgMAotaW50Ci1SSU9NYXBpbihwYWRkciwgc2l6ZSwgdmFkZHIpCi1wYWRkcl90CQlwYWRkcjsKLWludAkJCXNpemU7Ci1jYWRkcl90ICoJdmFkZHI7Ci17Ci0JKnZhZGRyID0gKGNhZGRyX3QpcGVybWFwKCAobG9uZylwYWRkciwgc2l6ZSk7Ci0JcmV0dXJuICgoaW50KSp2YWRkcik7Ci19Ci0KLXZvaWQKLVJJT01hcG91dChwYWRkciwgc2l6ZSwgdmFkZHIpCi1wYWRkcl90CQlwYWRkcjsKLWxvbmcJCXNpemU7Ci1jYWRkcl90IAl2YWRkcjsKLXsKLX0KLSNlbmRpZgotCi0KIHZvaWQKIFJJT0hvc3RSZXNldChUeXBlLCBEcFJhbVAsIFNsb3QpCiB1aW50IFR5cGU7CkBAIC0xNTcwLDMxICs0NDksNiBAQAogCQkJV0JZVEUoRHBSYW1QLT5EcFJlc2V0VHB1LCAweEZGKTsKIAkJCXVkZWxheSgzKTsKIAkJCWJyZWFrOwotI2lmZGVmIEZVVFVSRV9SRUxFQVNFCi0JY2FzZSBSSU9fRUlTQToKLQkvKgotCSoqIEJldCB0aGlzIGRvZXNuJ3Qgd29yayEKLQkqLwotCU9VVEJaKCBTbG90LCBFSVNBX0NPTlRST0xfUE9SVCwKLQkJRUlTQV9UUF9SVU4JCXwgRUlTQV9UUF9CVVNfRElTQUJMRSAgIHwKLQkJRUlTQV9UUF9TTE9XX0xJTktTIHwgRUlTQV9UUF9CT09UX0ZST01fUkFNICk7Ci0JT1VUQlooIFNsb3QsIEVJU0FfQ09OVFJPTF9QT1JULAotCQlFSVNBX1RQX1JFU0VUCSAgfCBFSVNBX1RQX0JVU19ESVNBQkxFICAgfCAKLQkJRUlTQV9UUF9TTE9XX0xJTktTIHwgRUlTQV9UUF9CT09UX0ZST01fUkFNICk7Ci0Jc3VzcGVuZCggMyApOwotCU9VVEJaKCBTbG90LCBFSVNBX0NPTlRST0xfUE9SVCwKLQkJRUlTQV9UUF9SVU4JCXwgRUlTQV9UUF9CVVNfRElTQUJMRSAgIHwgCi0JCUVJU0FfVFBfU0xPV19MSU5LUyB8IEVJU0FfVFBfQk9PVF9GUk9NX1JBTSApOwotCWJyZWFrOwotCWNhc2UgUklPX01DQToKLQlXQllURShEcFJhbVAtPkRwQ29udHJvbCAgLCBNY2FUcEJvb3RGcm9tUmFtIHwgTWNhVHBCdXNEaXNhYmxlICk7Ci0JV0JZVEUoRHBSYW1QLT5EcFJlc2V0VHB1ICwgMHhGRiApOwotCXN1c3BlbmQoIDMgKTsKLQlXQllURShEcFJhbVAtPkRwQ29udHJvbCAgLCBNY2FUcEJvb3RGcm9tUmFtIHwgTWNhVHBCdXNEaXNhYmxlICk7Ci0JV0JZVEUoRHBSYW1QLT5EcFJlc2V0VHB1ICwgMHhGRiApOwotCXN1c3BlbmQoIDMgKTsKLQkJYnJlYWs7Ci0jZW5kaWYKIAljYXNlIFJJT19QQ0k6CiAJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5JVCwgIiAoUklPX1BDSSlcbiIpOwogCQlEcFJhbVAtPkRwQ29udHJvbCAgPSBSSU9fUENJX0JPT1RfRlJPTV9SQU07CkBAIC0xNjA0LDEyICs0NTgsNiBAQAogCQkvKiBmb3IgKGk9MDsgaTw2MDAwOyBpKyspOyAgKi8KIAkJLyogc3VzcGVuZCggMyApOyAqLwogCQlicmVhazsKLSNpZmRlZiBGVVRVUkVfUkVMRUFTRQotCWRlZmF1bHQ6Ci0JUnByaW50ZihSSU9NZXNnTm9TdXBwb3J0LFR5cGUsRHBSYW1QLFNsb3QpOwotCXJldHVybjsKLSNlbmRpZgotCiAJZGVmYXVsdDoKIAkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAiIChVTktOT1dOKVxuIik7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9pbnRyLmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2ludHIuYwppbmRleCBlNDJlN2I1Li4zNGQ4Nzg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2ludHIuYworKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2ludHIuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KQEAgLTg3LDk5ICs4OCw5MyBAQAogc3RhdGljIHZvaWQgUklPUmVjZWl2ZShzdHJ1Y3QgcmlvX2luZm8gKiwgc3RydWN0IFBvcnQgKik7CiAKIAotc3RhdGljIGNoYXIgKmZpcnN0Y2hhcnMgKGNoYXIgKnAsIGludCBuY2gpCitzdGF0aWMgY2hhciAqZmlyc3RjaGFycyhjaGFyICpwLCBpbnQgbmNoKQogewotICBzdGF0aWMgY2hhciBidWZbMl1bMTI4XTsKLSAgc3RhdGljIGludCB0PTA7Ci0gIHQgPSAhIHQ7Ci0gIG1lbWNweSAoYnVmW3RdLCBwLCBuY2gpOwotICBidWZbdF1bbmNoXSA9IDA7Ci0gIHJldHVybiBidWZbdF07CisJc3RhdGljIGNoYXIgYnVmWzJdWzEyOF07CisJc3RhdGljIGludCB0ID0gMDsKKwl0ID0gIXQ7CisJbWVtY3B5KGJ1Zlt0XSwgcCwgbmNoKTsKKwlidWZbdF1bbmNoXSA9IDA7CisJcmV0dXJuIGJ1Zlt0XTsKIH0KIAogCiAjZGVmaW5lCUlOQ1IoIFAsIEkgKQkoKFApID0gKCgoUCkrKEkpKSAmIHAtPlJJT0J1ZmZlck1hc2spKQogLyogRW5hYmxlIGFuZCBzdGFydCB0aGUgdHJhbnNtaXNzaW9uIG9mIHBhY2tldHMgKi8KLXZvaWQKLVJJT1R4RW5hYmxlKGVuKQotY2hhciAqCQllbjsKK3ZvaWQgUklPVHhFbmFibGUoZW4pCitjaGFyICplbjsKIHsKLSAgc3RydWN0IFBvcnQgKglQb3J0UDsKLSAgc3RydWN0IHJpb19pbmZvICpwOwotICBzdHJ1Y3QgdHR5X3N0cnVjdCogdHR5OwotICBpbnQgYzsKLSAgc3RydWN0IFBLVCAqCVBhY2tldFA7Ci0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IFBvcnQgKlBvcnRQOworCXN0cnVjdCByaW9faW5mbyAqcDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCWludCBjOworCXN0cnVjdCBQS1QgKlBhY2tldFA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotICBQb3J0UCA9IChzdHJ1Y3QgUG9ydCAqKWVuOyAKLSAgcCA9IChzdHJ1Y3QgcmlvX2luZm8gKilQb3J0UC0+cDsKLSAgdHR5ID0gUG9ydFAtPmdzLnR0eTsKKwlQb3J0UCA9IChzdHJ1Y3QgUG9ydCAqKSBlbjsKKwlwID0gKHN0cnVjdCByaW9faW5mbyAqKSBQb3J0UC0+cDsKKwl0dHkgPSBQb3J0UC0+Z3MudHR5OwogCiAKLSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAidHggcG9ydCAlZDogJWQgY2hhcnMgcXVldWVkLlxuIiwgCi0JICAgICAgUG9ydFAtPlBvcnROdW0sIFBvcnRQLT5ncy54bWl0X2NudCk7CisJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICJ0eCBwb3J0ICVkOiAlZCBjaGFycyBxdWV1ZWQuXG4iLCBQb3J0UC0+UG9ydE51bSwgUG9ydFAtPmdzLnhtaXRfY250KTsKIAotICBpZiAoIVBvcnRQLT5ncy54bWl0X2NudCkgcmV0dXJuOwotICAKKwlpZiAoIVBvcnRQLT5ncy54bWl0X2NudCkKKwkJcmV0dXJuOwogCi0gIC8qIFRoaXMgcm91dGluZSBpcyBhbiBvcmRlciBvZiBtYWduaXR1ZGUgc2ltcGxlciB0aGFuIHRoZSBzcGVjaWFsaXgKLSAgICAgdmVyc2lvbi4gT25lIG9mIHRoZSBkaXNhZHZhbnRhZ2VzIGlzIHRoYXQgdGhpcyB2ZXJzaW9uIHdpbGwgc2VuZAotICAgICBhbiBpbmNvbXBsZXRlIHBhY2tldCAodXN1YWxseSA2NCBieXRlcyBpbnN0ZWFkIG9mIDcyKSBvbmNlIGZvcgotICAgICBldmVyeSA0ayB3b3J0aCBvZiBkYXRhLiBMZXQncyBqdXN0IHNheSB0aGF0IHRoaXMgd29uJ3QgaW5mbHVlbmNlCi0gICAgIHBlcmZvcm1hbmNlIHNpZ25pZmljYW50bHkuLi4uLiAqLwogCi0gIHJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkvKiBUaGlzIHJvdXRpbmUgaXMgYW4gb3JkZXIgb2YgbWFnbml0dWRlIHNpbXBsZXIgdGhhbiB0aGUgc3BlY2lhbGl4CisJICAgdmVyc2lvbi4gT25lIG9mIHRoZSBkaXNhZHZhbnRhZ2VzIGlzIHRoYXQgdGhpcyB2ZXJzaW9uIHdpbGwgc2VuZAorCSAgIGFuIGluY29tcGxldGUgcGFja2V0ICh1c3VhbGx5IDY0IGJ5dGVzIGluc3RlYWQgb2YgNzIpIG9uY2UgZm9yCisJICAgZXZlcnkgNGsgd29ydGggb2YgZGF0YS4gTGV0J3MganVzdCBzYXkgdGhhdCB0aGlzIHdvbid0IGluZmx1ZW5jZQorCSAgIHBlcmZvcm1hbmNlIHNpZ25pZmljYW50bHkuLi4uLiAqLwogCi0gIHdoaWxlIChjYW5fYWRkX3RyYW5zbWl0KCAmUGFja2V0UCwgUG9ydFAgKSkgewotICAgIGMgPSBQb3J0UC0+Z3MueG1pdF9jbnQ7Ci0gICAgaWYgKGMgPiBQS1RfTUFYX0RBVEFfTEVOKSBjID0gUEtUX01BWF9EQVRBX0xFTjsKKwlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CiAKLSAgICAvKiBEb24ndCBjb3B5IHBhc3QgdGhlIGVuZCBvZiB0aGUgc291cmNlIGJ1ZmZlciAqLwotICAgIGlmIChjID4gU0VSSUFMX1hNSVRfU0laRSAtIFBvcnRQLT5ncy54bWl0X3RhaWwpIAotICAgICAgYyA9IFNFUklBTF9YTUlUX1NJWkUgLSBQb3J0UC0+Z3MueG1pdF90YWlsOworCXdoaWxlIChjYW5fYWRkX3RyYW5zbWl0KCZQYWNrZXRQLCBQb3J0UCkpIHsKKwkJYyA9IFBvcnRQLT5ncy54bWl0X2NudDsKKwkJaWYgKGMgPiBQS1RfTUFYX0RBVEFfTEVOKQorCQkJYyA9IFBLVF9NQVhfREFUQV9MRU47CiAKLSAgICB7IGludCB0OwotICAgIHQgPSAoYyA+IDEwKT8xMDpjOwotICAgIAotICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgInJpbzogdHggcG9ydCAlZDogY29weWluZyAlZCBjaGFyczogJXMgLSAlc1xuIiwgCi0JCSBQb3J0UC0+UG9ydE51bSwgYywgCi0JCSBmaXJzdGNoYXJzIChQb3J0UC0+Z3MueG1pdF9idWYgKyBQb3J0UC0+Z3MueG1pdF90YWlsICAgICAgLCB0KSwKLQkJIGZpcnN0Y2hhcnMgKFBvcnRQLT5ncy54bWl0X2J1ZiArIFBvcnRQLT5ncy54bWl0X3RhaWwgKyBjLXQsIHQpKTsKLSAgICB9Ci0gICAgLyogSWYgZm9yIG9uZSByZWFzb24gb3IgYW5vdGhlciwgd2UgY2FuJ3QgY29weSBtb3JlIGRhdGEsIAotICAgICAgIHdlJ3JlIGRvbmUhICovCi0gICAgaWYgKGMgPT0gMCkgYnJlYWs7CisJCS8qIERvbid0IGNvcHkgcGFzdCB0aGUgZW5kIG9mIHRoZSBzb3VyY2UgYnVmZmVyICovCisJCWlmIChjID4gU0VSSUFMX1hNSVRfU0laRSAtIFBvcnRQLT5ncy54bWl0X3RhaWwpCisJCQljID0gU0VSSUFMX1hNSVRfU0laRSAtIFBvcnRQLT5ncy54bWl0X3RhaWw7CiAKLSAgICByaW9fbWVtY3B5X3RvaW8gKFBvcnRQLT5Ib3N0UC0+Q2FkZHIsIChjYWRkcl90KVBhY2tldFAtPmRhdGEsIAotCQkgUG9ydFAtPmdzLnhtaXRfYnVmICsgUG9ydFAtPmdzLnhtaXRfdGFpbCwgYyk7Ci0gICAgLyogICAgdWRlbGF5ICgxKTsgKi8KKwkJeworCQkJaW50IHQ7CisJCQl0ID0gKGMgPiAxMCkgPyAxMCA6IGM7CiAKLSAgICB3cml0ZWIgKGMsICYoUGFja2V0UC0+bGVuKSk7Ci0gICAgaWYgKCEoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgKSB7Ci0gICAgICBhZGRfdHJhbnNtaXQgKCBQb3J0UCApOwotICAgICAgLyoKLSAgICAgICoqIENvdW50IGNoYXJzIHR4J2QgZm9yIHBvcnQgc3RhdGlzdGljcyByZXBvcnRpbmcKLSAgICAgICovCi0gICAgICBpZiAoIFBvcnRQLT5zdGF0c0dhdGhlciApCi0JUG9ydFAtPnR4Y2hhcnMgKz0gYzsKLSAgICB9Ci0gICAgUG9ydFAtPmdzLnhtaXRfdGFpbCA9IChQb3J0UC0+Z3MueG1pdF90YWlsICsgYykgJiAoU0VSSUFMX1hNSVRfU0laRS0xKTsKLSAgICBQb3J0UC0+Z3MueG1pdF9jbnQgLT0gYzsKLSAgfQorCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICJyaW86IHR4IHBvcnQgJWQ6IGNvcHlpbmcgJWQgY2hhcnM6ICVzIC0gJXNcbiIsIFBvcnRQLT5Qb3J0TnVtLCBjLCBmaXJzdGNoYXJzKFBvcnRQLT5ncy54bWl0X2J1ZiArIFBvcnRQLT5ncy54bWl0X3RhaWwsIHQpLCBmaXJzdGNoYXJzKFBvcnRQLT5ncy54bWl0X2J1ZiArIFBvcnRQLT5ncy54bWl0X3RhaWwgKyBjIC0gdCwgdCkpOworCQl9CisJCS8qIElmIGZvciBvbmUgcmVhc29uIG9yIGFub3RoZXIsIHdlIGNhbid0IGNvcHkgbW9yZSBkYXRhLAorCQkgICB3ZSdyZSBkb25lISAqLworCQlpZiAoYyA9PSAwKQorCQkJYnJlYWs7CiAKLSAgcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCXJpb19tZW1jcHlfdG9pbyhQb3J0UC0+SG9zdFAtPkNhZGRyLCAoY2FkZHJfdCkgUGFja2V0UC0+ZGF0YSwgUG9ydFAtPmdzLnhtaXRfYnVmICsgUG9ydFAtPmdzLnhtaXRfdGFpbCwgYyk7CisJCS8qICAgIHVkZWxheSAoMSk7ICovCiAKLSAgaWYgKFBvcnRQLT5ncy54bWl0X2NudCA8PSAoUG9ydFAtPmdzLndha2V1cF9jaGFycyArIDIqUEtUX01BWF9EQVRBX0xFTikpIHsKLSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJXYWtpbmcgdXAuLi4uIGxkaXNjOiVkICglZC8lZCkuLi4uIiwKLQkJIChpbnQpKFBvcnRQLT5ncy50dHktPmZsYWdzICYgKDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCkpLAotCQkgUG9ydFAtPmdzLndha2V1cF9jaGFycywgUG9ydFAtPmdzLnhtaXRfY250KTsgCi0gICAgaWYgKChQb3J0UC0+Z3MudHR5LT5mbGFncyAmICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApKSAmJgotCVBvcnRQLT5ncy50dHktPmxkaXNjLndyaXRlX3dha2V1cCkKLSAgICAgIChQb3J0UC0+Z3MudHR5LT5sZGlzYy53cml0ZV93YWtldXApKFBvcnRQLT5ncy50dHkpOwotICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIiglZC8lZClcbiIsCi0JCVBvcnRQLT5ncy53YWtldXBfY2hhcnMsIFBvcnRQLT5ncy54bWl0X2NudCk7IAotICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmUG9ydFAtPmdzLnR0eS0+d3JpdGVfd2FpdCk7Ci0gIH0KKwkJd3JpdGViKGMsICYoUGFja2V0UC0+bGVuKSk7CisJCWlmICghKFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEKSkgeworCQkJYWRkX3RyYW5zbWl0KFBvcnRQKTsKKwkJCS8qCisJCQkgKiogQ291bnQgY2hhcnMgdHgnZCBmb3IgcG9ydCBzdGF0aXN0aWNzIHJlcG9ydGluZworCQkJICovCisJCQlpZiAoUG9ydFAtPnN0YXRzR2F0aGVyKQorCQkJCVBvcnRQLT50eGNoYXJzICs9IGM7CisJCX0KKwkJUG9ydFAtPmdzLnhtaXRfdGFpbCA9IChQb3J0UC0+Z3MueG1pdF90YWlsICsgYykgJiAoU0VSSUFMX1hNSVRfU0laRSAtIDEpOworCQlQb3J0UC0+Z3MueG1pdF9jbnQgLT0gYzsKKwl9CisKKwlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKworCWlmIChQb3J0UC0+Z3MueG1pdF9jbnQgPD0gKFBvcnRQLT5ncy53YWtldXBfY2hhcnMgKyAyICogUEtUX01BWF9EQVRBX0xFTikpIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICJXYWtpbmcgdXAuLi4uIGxkaXNjOiVkICglZC8lZCkuLi4uIiwgKGludCkgKFBvcnRQLT5ncy50dHktPmZsYWdzICYgKDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCkpLCBQb3J0UC0+Z3Mud2FrZXVwX2NoYXJzLCBQb3J0UC0+Z3MueG1pdF9jbnQpOworCQlpZiAoKFBvcnRQLT5ncy50dHktPmZsYWdzICYgKDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCkpICYmIFBvcnRQLT5ncy50dHktPmxkaXNjLndyaXRlX3dha2V1cCkKKwkJCShQb3J0UC0+Z3MudHR5LT5sZGlzYy53cml0ZV93YWtldXApIChQb3J0UC0+Z3MudHR5KTsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICIoJWQvJWQpXG4iLCBQb3J0UC0+Z3Mud2FrZXVwX2NoYXJzLCBQb3J0UC0+Z3MueG1pdF9jbnQpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJlBvcnRQLT5ncy50dHktPndyaXRlX3dhaXQpOworCX0KIAogfQogCkBAIC0xODgsMzYxICsxODMsMzQ5IEBACiAqKiBSSU8gSG9zdCBTZXJ2aWNlIHJvdXRpbmUuIERvZXMgYWxsIHRoZSB3b3JrIHRyYWRpdGlvbmFsbHkgYXNzb2NpYXRlZCB3aXRoIGFuCiAqKiBpbnRlcnJ1cHQuCiAqLwotc3RhdGljIGludAlSdXBJbnRyOwotc3RhdGljIGludAlSeEludHI7Ci1zdGF0aWMgaW50CVR4SW50cjsKLXZvaWQKLVJJT1NlcnZpY2VIb3N0KHAsIEhvc3RQLCBGcm9tKQotc3RydWN0IHJpb19pbmZvICoJcDsKK3N0YXRpYyBpbnQgUnVwSW50cjsKK3N0YXRpYyBpbnQgUnhJbnRyOworc3RhdGljIGludCBUeEludHI7Cit2b2lkIFJJT1NlcnZpY2VIb3N0KHAsIEhvc3RQLCBGcm9tKQorc3RydWN0IHJpb19pbmZvICpwOwogc3RydWN0IEhvc3QgKkhvc3RQOwotaW50IEZyb207IAoraW50IEZyb207CiB7Ci0gIHJpb19zcGluX2xvY2sgKCZIb3N0UC0+SG9zdExvY2spOwotICBpZiAoIChIb3N0UC0+RmxhZ3MgJiBSVU5fU1RBVEUpICE9IFJDX1JVTk5JTkcgKSB7IAotICAgIHN0YXRpYyBpbnQgdCA9MDsKLSAgICByaW9fc3Bpbl91bmxvY2sgKCZIb3N0UC0+SG9zdExvY2spOyAKLSAgICBpZiAoKHQrKyAlIDIwMCkgPT0gMCkKLSAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIkludGVycnVwdCBidXQgaG9zdCBub3QgcnVubmluZy4gZmxhZ3M9JXguXG4iLCAoaW50KUhvc3RQLT5GbGFncyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHJpb19zcGluX3VubG9jayAoJkhvc3RQLT5Ib3N0TG9jayk7IAotCi0gIGlmICggUldPUkQoIEhvc3RQLT5QYXJtTWFwUC0+cnVwX2ludHIgKSApIHsKLSAgICBXV09SRCggSG9zdFAtPlBhcm1NYXBQLT5ydXBfaW50ciAsIDAgKTsKLSAgICBwLT5SSU9SdXBDb3VudCsrOwotICAgIFJ1cEludHIrKzsKLSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJyaW86IFJVUCBpbnRlcnJ1cHQgb24gaG9zdCAlZFxuIiwgSG9zdFAtcC0+UklPSG9zdHMpOwotICAgIFJJT1BvbGxIb3N0Q29tbWFuZHMocCwgSG9zdFAgKTsKLSAgfQotCi0gIGlmICggUldPUkQoIEhvc3RQLT5QYXJtTWFwUC0+cnhfaW50ciApICkgewotICAgIGludCBwb3J0OwotCi0gICAgV1dPUkQoIEhvc3RQLT5QYXJtTWFwUC0+cnhfaW50ciAsIDAgKTsKLSAgICBwLT5SSU9SeENvdW50Kys7Ci0gICAgUnhJbnRyKys7Ci0KLSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJyaW86IFJYIGludGVycnVwdCBvbiBob3N0ICVkXG4iLCBIb3N0UC1wLT5SSU9Ib3N0cyk7Ci0gICAgLyoKLSAgICAqKiBMb29wIHRocm91Z2ggZXZlcnkgcG9ydC4gSWYgdGhlIHBvcnQgaXMgbWFwcGVkIGludG8KLSAgICAqKiB0aGUgc3lzdGVtICggaS5lLiBoYXMgL2Rldi90dHlYWFhYIGFzc29jaWF0ZWQgKSB0aGVuIGl0IGlzCi0gICAgKiogd29ydGggY2hlY2tpbmcuIElmIHRoZSBwb3J0IGlzbid0IG9wZW4sIGdyYWIgYW55IHBhY2tldHMKLSAgICAqKiBoYW5naW5nIG9uIGl0cyByZWNlaXZlIHF1ZXVlIGFuZCBzdHVmZiB0aGVtIG9uIHRoZSBmcmVlCi0gICAgKiogbGlzdDsgY2hlY2sgZm9yIGNvbW1hbmRzIG9uIHRoZSB3YXkuCi0gICAgKi8KLSAgICBmb3IgKCBwb3J0PXAtPlJJT0ZpcnN0UG9ydHNCb290ZWQ7IAotCSAgcG9ydDxwLT5SSU9MYXN0UG9ydHNCb290ZWQrUE9SVFNfUEVSX1JUQTsgcG9ydCsrICkgewotICAgICAgc3RydWN0IFBvcnQgKlBvcnRQID0gcC0+UklPUG9ydHBbcG9ydF07Ci0gICAgICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5UDsKLSAgICAgIHN0cnVjdCBQS1QgKlBhY2tldFA7Ci0JCQotICAgICAgLyoKLSAgICAgICoqIG5vdCBtYXBwZWQgaW4gLSBtb3N0IG9mIHRoZSBSSU9Qb3J0cFtdIGluZm9ybWF0aW9uCi0gICAgICAqKiBoYXMgbm90IGJlZW4gc2V0IHVwIQotICAgICAgKiogT3B0aW1pc2U6IHBvcnRzIGNvbWUgaW4gYnVuZGxlcyBvZiBlaWdodC4KLSAgICAgICovCi0gICAgICBpZiAoICFQb3J0UC0+TWFwcGVkICkgewotCXBvcnQgKz0gNzsKLQljb250aW51ZTsgLyogd2l0aCB0aGUgbmV4dCBwb3J0ICovCi0gICAgICB9Ci0KLSAgICAgIC8qCi0gICAgICAqKiBJZiB0aGUgaG9zdCBib2FyZCBpc24ndCBUSElTIGhvc3QgYm9hcmQsIGNoZWNrIHRoZSBuZXh0IG9uZS4KLSAgICAgICoqIG9wdGltaXNlOiBwb3J0cyBjb21lIGluIGJ1bmRsZXMgb2YgZWlnaHQuCi0gICAgICAqLwotICAgICAgaWYgKCBQb3J0UC0+SG9zdFAgIT0gSG9zdFAgKSB7Ci0JcG9ydCArPSA3OwotCWNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICAvKgotICAgICAgKiogTGV0IHVzIHNlZSAtIGlzIHRoZSBwb3J0IG9wZW4/IElmIG5vdCwgdGhlbiBkb24ndCBzZXJ2aWNlIGl0LgotICAgICAgKi8KLSAgICAgIGlmICggISggUG9ydFAtPlBvcnRTdGF0ZSAmIFBPUlRfSVNPUEVOICkgKSB7Ci0JY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIC8qCi0gICAgICAqKiBmaW5kIGNvcnJlc3BvbmRpbmcgdHR5IHN0cnVjdHVyZS4gVGhlIHByb2Nlc3Mgb2YgbWFwcGluZwotICAgICAgKiogdGhlIHBvcnRzIHB1dHMgdGhlc2UgaGVyZS4KLSAgICAgICovCi0gICAgICB0dHlQID0gUG9ydFAtPmdzLnR0eTsKLQotICAgICAgLyoKLSAgICAgICoqIExvY2sgdGhlIHBvcnQgYmVmb3JlIHdlIGJlZ2luIHdvcmtpbmcgb24gaXQuCi0gICAgICAqLwotICAgICAgcmlvX3NwaW5fbG9jaygmUG9ydFAtPnBvcnRTZW0pOwotCi0gICAgICAvKgotICAgICAgKiogUHJvY2VzcyByZWNlaXZlZCBkYXRhIGlmIHRoZXJlIGlzIGFueS4KLSAgICAgICovCi0gICAgICBpZiAoIGNhbl9yZW1vdmVfcmVjZWl2ZSggJlBhY2tldFAsIFBvcnRQICkgKQotCVJJT1JlY2VpdmUocCwgUG9ydFApOwotCi0gICAgICAvKgotICAgICAgKiogSWYgdGhlcmUgaXMgbm8gZGF0YSBsZWZ0IHRvIGJlIHJlYWQgZnJvbSB0aGUgcG9ydCwgYW5kCi0gICAgICAqKiBpdCdzIGhhbmRzaGFrZSBiaXQgaXMgc2V0LCB0aGVuIHdlIG11c3QgY2xlYXIgdGhlIGhhbmRzaGFrZSwKLSAgICAgICoqIHNvIHRoYXQgdGhhdCBkb3duc3RyZWFtIFJUQSBpcyByZS1lbmFibGVkLgotICAgICAgKi8KLSAgICAgIGlmICggIWNhbl9yZW1vdmVfcmVjZWl2ZSggJlBhY2tldFAsIFBvcnRQICkgJiYgCi0JICAgKCBSV09SRCggUG9ydFAtPlBoYlAtPmhhbmRzaGFrZSApPT1QSEJfSEFORFNIQUtFX1NFVCApICkgewotCQkJCS8qCi0JCQkJKiogTUFHSUMhICggQmFzaWNhbGx5LCBoYW5kc2hha2UgdGhlIFJYIGJ1ZmZlciwgc28gdGhhdAotCQkJCSoqIHRoZSBSVEFzIHVwc3RyZWFtIGNhbiBiZSByZS1lbmFibGVkLiApCi0JCQkJKi8KLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJTZXQgUlggaGFuZHNoYWtlIGJpdFxuIik7Ci0JV1dPUkQoIFBvcnRQLT5QaGJQLT5oYW5kc2hha2UsIAotCSAgICAgICBQSEJfSEFORFNIQUtFX1NFVHxQSEJfSEFORFNIQUtFX1JFU0VUICk7Ci0gICAgICB9Ci0gICAgICByaW9fc3Bpbl91bmxvY2soJlBvcnRQLT5wb3J0U2VtKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIFJXT1JEKCBIb3N0UC0+UGFybU1hcFAtPnR4X2ludHIgKSApIHsKLSAgICBpbnQgcG9ydDsKLQotICAgIFdXT1JEKCBIb3N0UC0+UGFybU1hcFAtPnR4X2ludHIgLCAwKTsKLQotICAgIHAtPlJJT1R4Q291bnQrKzsKLSAgICBUeEludHIrKzsKLSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJyaW86IFRYIGludGVycnVwdCBvbiBob3N0ICVkXG4iLCBIb3N0UC1wLT5SSU9Ib3N0cyk7Ci0KLSAgICAvKgotICAgICoqIExvb3AgdGhyb3VnaCBldmVyeSBwb3J0LgotICAgICoqIElmIHRoZSBwb3J0IGlzIG1hcHBlZCBpbnRvIHRoZSBzeXN0ZW0gKCBpLmUuIGhhcyAvZGV2L3R0eVhYWFgKLSAgICAqKiBhc3NvY2lhdGVkICkgdGhlbiBpdCBpcyB3b3J0aCBjaGVja2luZy4KLSAgICAqLwotICAgIGZvciAoIHBvcnQ9cC0+UklPRmlyc3RQb3J0c0Jvb3RlZDsgCi0JICBwb3J0PHAtPlJJT0xhc3RQb3J0c0Jvb3RlZCtQT1JUU19QRVJfUlRBOyBwb3J0KysgKSB7Ci0gICAgICBzdHJ1Y3QgUG9ydCAqUG9ydFAgPSBwLT5SSU9Qb3J0cFtwb3J0XTsKLSAgICAgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHlQOwotICAgICAgc3RydWN0IFBLVCAqUGFja2V0UDsKLQotICAgICAgLyoKLSAgICAgICoqIG5vdCBtYXBwZWQgaW4gLSBtb3N0IG9mIHRoZSBSSU9Qb3J0cFtdIGluZm9ybWF0aW9uCi0gICAgICAqKiBoYXMgbm90IGJlZW4gc2V0IHVwIQotICAgICAgKi8KLSAgICAgIGlmICggIVBvcnRQLT5NYXBwZWQgKSB7Ci0JcG9ydCArPSA3OwotCWNvbnRpbnVlOyAvKiB3aXRoIHRoZSBuZXh0IHBvcnQgKi8KLSAgICAgIH0KLQotICAgICAgLyoKLSAgICAgICoqIElmIHRoZSBob3N0IGJvYXJkIGlzbid0IHJ1bm5pbmcsIHRoZW4gaXRzIGRhdGEgc3RydWN0dXJlcwotICAgICAgKiogYXJlIG5vIHVzZSB0byB1cyAtIGNvbnRpbnVlIHF1aWV0bHkuCi0gICAgICAqLwotICAgICAgaWYgKCBQb3J0UC0+SG9zdFAgIT0gSG9zdFAgKSB7Ci0JcG9ydCArPSA3OwotCWNvbnRpbnVlOyAvKiB3aXRoIHRoZSBuZXh0IHBvcnQgKi8KLSAgICAgIH0KLQotICAgICAgLyoKLSAgICAgICoqIExldCB1cyBzZWUgLSBpcyB0aGUgcG9ydCBvcGVuPyBJZiBub3QsIHRoZW4gZG9uJ3Qgc2VydmljZSBpdC4KLSAgICAgICovCi0gICAgICBpZiAoICEoIFBvcnRQLT5Qb3J0U3RhdGUgJiBQT1JUX0lTT1BFTiApICkgewotCWNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJyaW86IExvb2tpbmcgaW50byBwb3J0ICVkLlxuIiwgcG9ydCk7Ci0gICAgICAvKgotICAgICAgKiogTG9jayB0aGUgcG9ydCBiZWZvcmUgd2UgYmVnaW4gd29ya2luZyBvbiBpdC4KLSAgICAgICovCi0gICAgICByaW9fc3Bpbl9sb2NrKCZQb3J0UC0+cG9ydFNlbSk7Ci0KLSAgICAgIC8qCi0gICAgICAqKiBJZiB3ZSBjYW4ndCBhZGQgYW55dGhpbmcgdG8gdGhlIHRyYW5zbWl0IHF1ZXVlLCB0aGVuCi0gICAgICAqKiB3ZSBuZWVkIGRvIG5vbmUgb2YgdGhpcyBwcm9jZXNzaW5nLgotICAgICAgKi8KLSAgICAgIGlmICggIWNhbl9hZGRfdHJhbnNtaXQoICZQYWNrZXRQLCBQb3J0UCApICkgewotCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIkNhbid0IGFkZCB0byBwb3J0LCBzbyBza2lwcGluZy5cbiIpOwotCXJpb19zcGluX3VubG9jaygmUG9ydFAtPnBvcnRTZW0pOwotCWNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICAvKgotICAgICAgKiogZmluZCBjb3JyZXNwb25kaW5nIHR0eSBzdHJ1Y3R1cmUuIFRoZSBwcm9jZXNzIG9mIG1hcHBpbmcKLSAgICAgICoqIHRoZSBwb3J0cyBwdXRzIHRoZXNlIGhlcmUuCi0gICAgICAqLwotICAgICAgdHR5UCA9IFBvcnRQLT5ncy50dHk7Ci0gICAgICAvKiBJZiB0dHlQIGlzIE5VTEwsIHRoZSBwb3J0IGlzIGdldHRpbmcgY2xvc2VkLiBGb3JnZXQgYWJvdXQgaXQuICovCi0gICAgICBpZiAoIXR0eVApIHsKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJubyB0dHksIHNvIHNraXBwaW5nLlxuIik7Ci0JcmlvX3NwaW5fdW5sb2NrKCZQb3J0UC0+cG9ydFNlbSk7Ci0JY29udGludWU7Ci0gICAgICB9Ci0gICAgICAvKgotICAgICAgKiogSWYgdGhlcmUgaXMgbW9yZSByb29tIGF2YWlsYWJsZSB3ZSBzdGFydCB1cCB0aGUgdHJhbnNtaXQKLSAgICAgICoqIGRhdGEgcHJvY2VzcyBhZ2Fpbi4gVGhpcyBjYW4gYmUgZGlyZWN0IEkvTywgaWYgdGhlIGNvb2ttb2RlCi0gICAgICAqKiBpcyBzZXQgdG8gQ09PS19SQVcgb3IgQ09PS19NRURJVU0sIG9yIHdpbGwgYmUgYSBjYWxsIHRvIHRoZQotICAgICAgKiogcmlvdHByb2MoIFRfT1VUUFVUICkgaWYgd2UgYXJlIGluIENPT0tfV0VMTCBtb2RlLCB0byBmZXRjaAotICAgICAgKiogY2hhcmFjdGVycyB2aWEgdGhlIGxpbmUgZGlzY2lwbGluZS4gV2UgbXVzdCBhbHdheXMgY2FsbAotICAgICAgKiogdGhlIGxpbmUgZGlzY2lwbGluZSwKLSAgICAgICoqIHNvIHRoYXQgdXNlciBpbnB1dCBjaGFyYWN0ZXJzIGNhbiBiZSBlY2hvZWQgY29ycmVjdGx5LgotICAgICAgKioKLSAgICAgICoqICsrKysgVXBkYXRlICsrKysrCi0gICAgICAqKiBXaXRoIHRoZSBhZHZlbnQgb2YgZG91YmxlIGJ1ZmZlcmluZywgd2Ugbm93IHNlZSBpZgotICAgICAgKiogVHhCdWZmZXJPdXQtSW4gaXMgbm9uLXplcm8uIElmIHNvLCB0aGVuIHdlIGNvcHkgYSBwYWNrZXQKLSAgICAgICoqIHRvIHRoZSBvdXRwdXQgcGxhY2UsIGFuZCBzZXQgaXQgZ29pbmcuIElmIHRoaXMgZW1wdGllcwotICAgICAgKiogdGhlIGJ1ZmZlciwgdGhlbiB3ZSBtdXN0IGlzc3VlIGEgd2FrZXVwKCApIG9uIE9VVC4KLSAgICAgICoqIElmIGl0IGZyZWVzIHNwYWNlIGluIHRoZSBidWZmZXIgdGhlbiB3ZSBtdXN0IGlzc3VlCi0gICAgICAqKiBhIHdha2V1cCggKSBvbiBJTi4KLSAgICAgICoqCi0gICAgICAqKiArKysrIEV4dHJhISBFeHRyYSEgSWYgUG9ydFAtPldmbHVzaEZsYWcgaXMgc2V0LCB0aGVuIHdlCi0gICAgICAqKiBoYXZlIHRvIHNlbmQgYSBXRkxVU0ggY29tbWFuZCBkb3duIHRoZSBQSEIsIHRvIG1hcmsgdGhlCi0gICAgICAqKiBlbmQgcG9pbnQgb2YgYSBXRkxVU0guIFdlIGFsc28gbmVlZCB0byBjbGVhciBvdXQgYW55Ci0gICAgICAqKiBkYXRhIGZyb20gdGhlIGRvdWJsZSBidWZmZXIhICggbm90ZSB0aGF0IFdmbHVzaEZsYWcgaXMgYQotICAgICAgKiogKmNvdW50KiBvZiB0aGUgbnVtYmVyIG9mIFdGTFVTSCBjb21tYW5kcyBvdXRzdGFuZGluZyEgKQotICAgICAgKioKLSAgICAgICoqICsrKysgQW5kIHRoZXJlJ3MgbW9yZSEKLSAgICAgICoqIElmIGFuIFJUQSBpcyBwb3dlcmVkIG9mZiwgdGhlbiBvbiBhZ2FpbiwgYW5kIHJlYm9vdGVkLAotICAgICAgKiogd2hpbHN0IGl0IGhhcyBwb3J0cyBvcGVuLCB0aGVuIHdlIG5lZWQgdG8gcmUtb3BlbiB0aGUgcG9ydHMuCi0gICAgICAqKiAoIHJlYXNvbmFibGUgZW5vdWdoICkuIFdlIGNhbid0IGRvIHRoaXMgd2hlbiB3ZSBzcG90IHRoZQotICAgICAgKiogcmUtYm9vdCwgaW4gaW50ZXJydXB0IHRpbWUsIGJlY2F1c2UgdGhlIHF1ZXVlIGlzIHByb2JhYmx5Ci0gICAgICAqKiBmdWxsLiBTbywgd2hlbiB3ZSBjb21lIGluIGhlcmUsIHdlIG5lZWQgdG8gdGVzdCBpZiBhbnkKLSAgICAgICoqIHBvcnRzIGFyZSBpbiB0aGlzIGNvbmRpdGlvbiwgYW5kIHJlLW9wZW4gdGhlIHBvcnQgYmVmb3JlCi0gICAgICAqKiB3ZSB0cnkgdG8gc2VuZCBhbnkgbW9yZSBkYXRhIHRvIGl0LiBOb3csIHRoZSByZS1ib290ZWQKLSAgICAgICoqIFJUQSB3aWxsIGJlIGRpc2NhcmRpbmcgcGFja2V0cyBmcm9tIHRoZSBQSEIgdW50aWwgaXQKLSAgICAgICoqIHJlY2VpdmVzIHRoaXMgb3BlbiBwYWNrZXQsIGJ1dCBkb24ndCB3b3JyeSB0b29vIG11Y2gKLSAgICAgICoqIGFib3V0IHRoYXQuIFRoZSBvbmUgdGhpbmcgdGhhdCBpcyBpbnRlcmVzdGluZyBpcyB0aGUKLSAgICAgICoqIGNvbWJpbmF0aW9uIG9mIHRoaXMgZWZmZWN0IGFuZCB0aGUgV0ZMVVNIIGVmZmVjdCEKLSAgICAgICovCi0gICAgICAvKiBGb3Igbm93IGRvbid0IGhhbmRsZSBSVEEgcmVib290cy4gLS0gUkVXLiAKLQkgUmVlbmFibGVkLiBPdGhlcndpc2UgUlRBIHJlYm9vdHMgZGlkbid0IHdvcmsuIER1aC4gLS0gUkVXICovCi0gICAgICBpZiAoIFBvcnRQLT5NYWdpY0ZsYWdzICkgewotI2lmIDEKLQlpZiAoIFBvcnRQLT5NYWdpY0ZsYWdzICYgTUFHSUNfUkVCT09UICkgewotCSAgLyoKLQkgICoqIHdlbGwsIHRoZSBSVEEgaGFzIGJlZW4gcmVib290ZWQsIGFuZCB0aGVyZSBpcyByb29tCi0JICAqKiBvbiBpdHMgcXVldWUgdG8gYWRkIHRoZSBvcGVuIHBhY2tldCB0aGF0IGlzIHJlcXVpcmVkLgotCSAgKioKLQkgICoqIFRoZSBtZXNzeSBwYXJ0IG9mIHRoaXMgbGluZSBpcyB0cnlpbmcgdG8gZGVjaWRlIGlmCi0JICAqKiB3ZSBuZWVkIHRvIGNhbGwgdGhlIFBhcmFtIGZ1bmN0aW9uIGFzIGEgdHR5IG9yIGFzCi0JICAqKiBhIG1vZGVtLgotCSAgKiogRE9OVCBVU0UgQ0xPQ0FMIEFTIEEgVEVTVCBGT1IgVEhJUyEKLQkgICoqCi0JICAqKiBJZiB3ZSBjYW4ndCBwYXJhbSB0aGUgcG9ydCwgdGhlbiBtb3ZlIG9uIHRvIHRoZQotCSAgKiogbmV4dCBwb3J0LgotCSAgKi8KLQkgIFBvcnRQLT5JblVzZSA9IE5PVF9JTlVTRTsKLQotCSAgcmlvX3NwaW5fdW5sb2NrKCZQb3J0UC0+cG9ydFNlbSk7Ci0JICBpZiAoIFJJT1BhcmFtKFBvcnRQLCBPUEVOLCAoKFBvcnRQLT5Db3IyQ29weSAmIAotCQkJCSAgICAgICAoQ09SMl9SVFNGTE9XfENPUjJfQ1RTRkxPVyApICk9PSAKLQkJCQkgICAgICAoQ09SMl9SVFNGTE9XfENPUjJfQ1RTRkxPVyApICkgPyAKLQkJCVRSVUUgOiBGQUxTRSwgRE9OVF9TTEVFUCApID09IFJJT19GQUlMICkgewotCSAgICBjb250aW51ZTsgLyogd2l0aCBuZXh0IHBvcnQgKi8KLQkgIH0KLQkgIHJpb19zcGluX2xvY2soJlBvcnRQLT5wb3J0U2VtKTsKLQkgIFBvcnRQLT5NYWdpY0ZsYWdzICY9IH5NQUdJQ19SRUJPT1Q7CisJcmlvX3NwaW5fbG9jaygmSG9zdFAtPkhvc3RMb2NrKTsKKwlpZiAoKEhvc3RQLT5GbGFncyAmIFJVTl9TVEFURSkgIT0gUkNfUlVOTklORykgeworCQlzdGF0aWMgaW50IHQgPSAwOworCQlyaW9fc3Bpbl91bmxvY2soJkhvc3RQLT5Ib3N0TG9jayk7CisJCWlmICgodCsrICUgMjAwKSA9PSAwKQorCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICJJbnRlcnJ1cHQgYnV0IGhvc3Qgbm90IHJ1bm5pbmcuIGZsYWdzPSV4LlxuIiwgKGludCkgSG9zdFAtPkZsYWdzKTsKKwkJcmV0dXJuOwogCX0KKwlyaW9fc3Bpbl91bmxvY2soJkhvc3RQLT5Ib3N0TG9jayk7CisKKwlpZiAoUldPUkQoSG9zdFAtPlBhcm1NYXBQLT5ydXBfaW50cikpIHsKKwkJV1dPUkQoSG9zdFAtPlBhcm1NYXBQLT5ydXBfaW50ciwgMCk7CisJCXAtPlJJT1J1cENvdW50Kys7CisJCVJ1cEludHIrKzsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICJyaW86IFJVUCBpbnRlcnJ1cHQgb24gaG9zdCAlZFxuIiwgSG9zdFAgLSBwLT5SSU9Ib3N0cyk7CisJCVJJT1BvbGxIb3N0Q29tbWFuZHMocCwgSG9zdFApOworCX0KKworCWlmIChSV09SRChIb3N0UC0+UGFybU1hcFAtPnJ4X2ludHIpKSB7CisJCWludCBwb3J0OworCisJCVdXT1JEKEhvc3RQLT5QYXJtTWFwUC0+cnhfaW50ciwgMCk7CisJCXAtPlJJT1J4Q291bnQrKzsKKwkJUnhJbnRyKys7CisKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICJyaW86IFJYIGludGVycnVwdCBvbiBob3N0ICVkXG4iLCBIb3N0UCAtIHAtPlJJT0hvc3RzKTsKKwkJLyoKKwkJICoqIExvb3AgdGhyb3VnaCBldmVyeSBwb3J0LiBJZiB0aGUgcG9ydCBpcyBtYXBwZWQgaW50bworCQkgKiogdGhlIHN5c3RlbSAoIGkuZS4gaGFzIC9kZXYvdHR5WFhYWCBhc3NvY2lhdGVkICkgdGhlbiBpdCBpcworCQkgKiogd29ydGggY2hlY2tpbmcuIElmIHRoZSBwb3J0IGlzbid0IG9wZW4sIGdyYWIgYW55IHBhY2tldHMKKwkJICoqIGhhbmdpbmcgb24gaXRzIHJlY2VpdmUgcXVldWUgYW5kIHN0dWZmIHRoZW0gb24gdGhlIGZyZWUKKwkJICoqIGxpc3Q7IGNoZWNrIGZvciBjb21tYW5kcyBvbiB0aGUgd2F5LgorCQkgKi8KKwkJZm9yIChwb3J0ID0gcC0+UklPRmlyc3RQb3J0c0Jvb3RlZDsgcG9ydCA8IHAtPlJJT0xhc3RQb3J0c0Jvb3RlZCArIFBPUlRTX1BFUl9SVEE7IHBvcnQrKykgeworCQkJc3RydWN0IFBvcnQgKlBvcnRQID0gcC0+UklPUG9ydHBbcG9ydF07CisJCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5UDsKKwkJCXN0cnVjdCBQS1QgKlBhY2tldFA7CisKKwkJCS8qCisJCQkgKiogbm90IG1hcHBlZCBpbiAtIG1vc3Qgb2YgdGhlIFJJT1BvcnRwW10gaW5mb3JtYXRpb24KKwkJCSAqKiBoYXMgbm90IGJlZW4gc2V0IHVwIQorCQkJICoqIE9wdGltaXNlOiBwb3J0cyBjb21lIGluIGJ1bmRsZXMgb2YgZWlnaHQuCisJCQkgKi8KKwkJCWlmICghUG9ydFAtPk1hcHBlZCkgeworCQkJCXBvcnQgKz0gNzsKKwkJCQljb250aW51ZTsJLyogd2l0aCB0aGUgbmV4dCBwb3J0ICovCisJCQl9CisKKwkJCS8qCisJCQkgKiogSWYgdGhlIGhvc3QgYm9hcmQgaXNuJ3QgVEhJUyBob3N0IGJvYXJkLCBjaGVjayB0aGUgbmV4dCBvbmUuCisJCQkgKiogb3B0aW1pc2U6IHBvcnRzIGNvbWUgaW4gYnVuZGxlcyBvZiBlaWdodC4KKwkJCSAqLworCQkJaWYgKFBvcnRQLT5Ib3N0UCAhPSBIb3N0UCkgeworCQkJCXBvcnQgKz0gNzsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqKiBMZXQgdXMgc2VlIC0gaXMgdGhlIHBvcnQgb3Blbj8gSWYgbm90LCB0aGVuIGRvbid0IHNlcnZpY2UgaXQuCisJCQkgKi8KKwkJCWlmICghKFBvcnRQLT5Qb3J0U3RhdGUgJiBQT1JUX0lTT1BFTikpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqKiBmaW5kIGNvcnJlc3BvbmRpbmcgdHR5IHN0cnVjdHVyZS4gVGhlIHByb2Nlc3Mgb2YgbWFwcGluZworCQkJICoqIHRoZSBwb3J0cyBwdXRzIHRoZXNlIGhlcmUuCisJCQkgKi8KKwkJCXR0eVAgPSBQb3J0UC0+Z3MudHR5OworCisJCQkvKgorCQkJICoqIExvY2sgdGhlIHBvcnQgYmVmb3JlIHdlIGJlZ2luIHdvcmtpbmcgb24gaXQuCisJCQkgKi8KKwkJCXJpb19zcGluX2xvY2soJlBvcnRQLT5wb3J0U2VtKTsKKworCQkJLyoKKwkJCSAqKiBQcm9jZXNzIHJlY2VpdmVkIGRhdGEgaWYgdGhlcmUgaXMgYW55LgorCQkJICovCisJCQlpZiAoY2FuX3JlbW92ZV9yZWNlaXZlKCZQYWNrZXRQLCBQb3J0UCkpCisJCQkJUklPUmVjZWl2ZShwLCBQb3J0UCk7CisKKwkJCS8qCisJCQkgKiogSWYgdGhlcmUgaXMgbm8gZGF0YSBsZWZ0IHRvIGJlIHJlYWQgZnJvbSB0aGUgcG9ydCwgYW5kCisJCQkgKiogaXQncyBoYW5kc2hha2UgYml0IGlzIHNldCwgdGhlbiB3ZSBtdXN0IGNsZWFyIHRoZSBoYW5kc2hha2UsCisJCQkgKiogc28gdGhhdCB0aGF0IGRvd25zdHJlYW0gUlRBIGlzIHJlLWVuYWJsZWQuCisJCQkgKi8KKwkJCWlmICghY2FuX3JlbW92ZV9yZWNlaXZlKCZQYWNrZXRQLCBQb3J0UCkgJiYgKFJXT1JEKFBvcnRQLT5QaGJQLT5oYW5kc2hha2UpID09IFBIQl9IQU5EU0hBS0VfU0VUKSkgeworCQkJCS8qCisJCQkJICoqIE1BR0lDISAoIEJhc2ljYWxseSwgaGFuZHNoYWtlIHRoZSBSWCBidWZmZXIsIHNvIHRoYXQKKwkJCQkgKiogdGhlIFJUQXMgdXBzdHJlYW0gY2FuIGJlIHJlLWVuYWJsZWQuICkKKwkJCQkgKi8KKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5UUiwgIlNldCBSWCBoYW5kc2hha2UgYml0XG4iKTsKKwkJCQlXV09SRChQb3J0UC0+UGhiUC0+aGFuZHNoYWtlLCBQSEJfSEFORFNIQUtFX1NFVCB8IFBIQl9IQU5EU0hBS0VfUkVTRVQpOworCQkJfQorCQkJcmlvX3NwaW5fdW5sb2NrKCZQb3J0UC0+cG9ydFNlbSk7CisJCX0KKwl9CisKKwlpZiAoUldPUkQoSG9zdFAtPlBhcm1NYXBQLT50eF9pbnRyKSkgeworCQlpbnQgcG9ydDsKKworCQlXV09SRChIb3N0UC0+UGFybU1hcFAtPnR4X2ludHIsIDApOworCisJCXAtPlJJT1R4Q291bnQrKzsKKwkJVHhJbnRyKys7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTlRSLCAicmlvOiBUWCBpbnRlcnJ1cHQgb24gaG9zdCAlZFxuIiwgSG9zdFAgLSBwLT5SSU9Ib3N0cyk7CisKKwkJLyoKKwkJICoqIExvb3AgdGhyb3VnaCBldmVyeSBwb3J0LgorCQkgKiogSWYgdGhlIHBvcnQgaXMgbWFwcGVkIGludG8gdGhlIHN5c3RlbSAoIGkuZS4gaGFzIC9kZXYvdHR5WFhYWAorCQkgKiogYXNzb2NpYXRlZCApIHRoZW4gaXQgaXMgd29ydGggY2hlY2tpbmcuCisJCSAqLworCQlmb3IgKHBvcnQgPSBwLT5SSU9GaXJzdFBvcnRzQm9vdGVkOyBwb3J0IDwgcC0+UklPTGFzdFBvcnRzQm9vdGVkICsgUE9SVFNfUEVSX1JUQTsgcG9ydCsrKSB7CisJCQlzdHJ1Y3QgUG9ydCAqUG9ydFAgPSBwLT5SSU9Qb3J0cFtwb3J0XTsKKwkJCXN0cnVjdCB0dHlfc3RydWN0ICp0dHlQOworCQkJc3RydWN0IFBLVCAqUGFja2V0UDsKKworCQkJLyoKKwkJCSAqKiBub3QgbWFwcGVkIGluIC0gbW9zdCBvZiB0aGUgUklPUG9ydHBbXSBpbmZvcm1hdGlvbgorCQkJICoqIGhhcyBub3QgYmVlbiBzZXQgdXAhCisJCQkgKi8KKwkJCWlmICghUG9ydFAtPk1hcHBlZCkgeworCQkJCXBvcnQgKz0gNzsKKwkJCQljb250aW51ZTsJLyogd2l0aCB0aGUgbmV4dCBwb3J0ICovCisJCQl9CisKKwkJCS8qCisJCQkgKiogSWYgdGhlIGhvc3QgYm9hcmQgaXNuJ3QgcnVubmluZywgdGhlbiBpdHMgZGF0YSBzdHJ1Y3R1cmVzCisJCQkgKiogYXJlIG5vIHVzZSB0byB1cyAtIGNvbnRpbnVlIHF1aWV0bHkuCisJCQkgKi8KKwkJCWlmIChQb3J0UC0+SG9zdFAgIT0gSG9zdFApIHsKKwkJCQlwb3J0ICs9IDc7CisJCQkJY29udGludWU7CS8qIHdpdGggdGhlIG5leHQgcG9ydCAqLworCQkJfQorCisJCQkvKgorCQkJICoqIExldCB1cyBzZWUgLSBpcyB0aGUgcG9ydCBvcGVuPyBJZiBub3QsIHRoZW4gZG9uJ3Qgc2VydmljZSBpdC4KKwkJCSAqLworCQkJaWYgKCEoUG9ydFAtPlBvcnRTdGF0ZSAmIFBPUlRfSVNPUEVOKSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5UUiwgInJpbzogTG9va2luZyBpbnRvIHBvcnQgJWQuXG4iLCBwb3J0KTsKKwkJCS8qCisJCQkgKiogTG9jayB0aGUgcG9ydCBiZWZvcmUgd2UgYmVnaW4gd29ya2luZyBvbiBpdC4KKwkJCSAqLworCQkJcmlvX3NwaW5fbG9jaygmUG9ydFAtPnBvcnRTZW0pOworCisJCQkvKgorCQkJICoqIElmIHdlIGNhbid0IGFkZCBhbnl0aGluZyB0byB0aGUgdHJhbnNtaXQgcXVldWUsIHRoZW4KKwkJCSAqKiB3ZSBuZWVkIGRvIG5vbmUgb2YgdGhpcyBwcm9jZXNzaW5nLgorCQkJICovCisJCQlpZiAoIWNhbl9hZGRfdHJhbnNtaXQoJlBhY2tldFAsIFBvcnRQKSkgeworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTlRSLCAiQ2FuJ3QgYWRkIHRvIHBvcnQsIHNvIHNraXBwaW5nLlxuIik7CisJCQkJcmlvX3NwaW5fdW5sb2NrKCZQb3J0UC0+cG9ydFNlbSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiogZmluZCBjb3JyZXNwb25kaW5nIHR0eSBzdHJ1Y3R1cmUuIFRoZSBwcm9jZXNzIG9mIG1hcHBpbmcKKwkJCSAqKiB0aGUgcG9ydHMgcHV0cyB0aGVzZSBoZXJlLgorCQkJICovCisJCQl0dHlQID0gUG9ydFAtPmdzLnR0eTsKKwkJCS8qIElmIHR0eVAgaXMgTlVMTCwgdGhlIHBvcnQgaXMgZ2V0dGluZyBjbG9zZWQuIEZvcmdldCBhYm91dCBpdC4gKi8KKwkJCWlmICghdHR5UCkgeworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTlRSLCAibm8gdHR5LCBzbyBza2lwcGluZy5cbiIpOworCQkJCXJpb19zcGluX3VubG9jaygmUG9ydFAtPnBvcnRTZW0pOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyoKKwkJCSAqKiBJZiB0aGVyZSBpcyBtb3JlIHJvb20gYXZhaWxhYmxlIHdlIHN0YXJ0IHVwIHRoZSB0cmFuc21pdAorCQkJICoqIGRhdGEgcHJvY2VzcyBhZ2Fpbi4gVGhpcyBjYW4gYmUgZGlyZWN0IEkvTywgaWYgdGhlIGNvb2ttb2RlCisJCQkgKiogaXMgc2V0IHRvIENPT0tfUkFXIG9yIENPT0tfTUVESVVNLCBvciB3aWxsIGJlIGEgY2FsbCB0byB0aGUKKwkJCSAqKiByaW90cHJvYyggVF9PVVRQVVQgKSBpZiB3ZSBhcmUgaW4gQ09PS19XRUxMIG1vZGUsIHRvIGZldGNoCisJCQkgKiogY2hhcmFjdGVycyB2aWEgdGhlIGxpbmUgZGlzY2lwbGluZS4gV2UgbXVzdCBhbHdheXMgY2FsbAorCQkJICoqIHRoZSBsaW5lIGRpc2NpcGxpbmUsCisJCQkgKiogc28gdGhhdCB1c2VyIGlucHV0IGNoYXJhY3RlcnMgY2FuIGJlIGVjaG9lZCBjb3JyZWN0bHkuCisJCQkgKioKKwkJCSAqKiArKysrIFVwZGF0ZSArKysrKworCQkJICoqIFdpdGggdGhlIGFkdmVudCBvZiBkb3VibGUgYnVmZmVyaW5nLCB3ZSBub3cgc2VlIGlmCisJCQkgKiogVHhCdWZmZXJPdXQtSW4gaXMgbm9uLXplcm8uIElmIHNvLCB0aGVuIHdlIGNvcHkgYSBwYWNrZXQKKwkJCSAqKiB0byB0aGUgb3V0cHV0IHBsYWNlLCBhbmQgc2V0IGl0IGdvaW5nLiBJZiB0aGlzIGVtcHRpZXMKKwkJCSAqKiB0aGUgYnVmZmVyLCB0aGVuIHdlIG11c3QgaXNzdWUgYSB3YWtldXAoICkgb24gT1VULgorCQkJICoqIElmIGl0IGZyZWVzIHNwYWNlIGluIHRoZSBidWZmZXIgdGhlbiB3ZSBtdXN0IGlzc3VlCisJCQkgKiogYSB3YWtldXAoICkgb24gSU4uCisJCQkgKioKKwkJCSAqKiArKysrIEV4dHJhISBFeHRyYSEgSWYgUG9ydFAtPldmbHVzaEZsYWcgaXMgc2V0LCB0aGVuIHdlCisJCQkgKiogaGF2ZSB0byBzZW5kIGEgV0ZMVVNIIGNvbW1hbmQgZG93biB0aGUgUEhCLCB0byBtYXJrIHRoZQorCQkJICoqIGVuZCBwb2ludCBvZiBhIFdGTFVTSC4gV2UgYWxzbyBuZWVkIHRvIGNsZWFyIG91dCBhbnkKKwkJCSAqKiBkYXRhIGZyb20gdGhlIGRvdWJsZSBidWZmZXIhICggbm90ZSB0aGF0IFdmbHVzaEZsYWcgaXMgYQorCQkJICoqICpjb3VudCogb2YgdGhlIG51bWJlciBvZiBXRkxVU0ggY29tbWFuZHMgb3V0c3RhbmRpbmchICkKKwkJCSAqKgorCQkJICoqICsrKysgQW5kIHRoZXJlJ3MgbW9yZSEKKwkJCSAqKiBJZiBhbiBSVEEgaXMgcG93ZXJlZCBvZmYsIHRoZW4gb24gYWdhaW4sIGFuZCByZWJvb3RlZCwKKwkJCSAqKiB3aGlsc3QgaXQgaGFzIHBvcnRzIG9wZW4sIHRoZW4gd2UgbmVlZCB0byByZS1vcGVuIHRoZSBwb3J0cy4KKwkJCSAqKiAoIHJlYXNvbmFibGUgZW5vdWdoICkuIFdlIGNhbid0IGRvIHRoaXMgd2hlbiB3ZSBzcG90IHRoZQorCQkJICoqIHJlLWJvb3QsIGluIGludGVycnVwdCB0aW1lLCBiZWNhdXNlIHRoZSBxdWV1ZSBpcyBwcm9iYWJseQorCQkJICoqIGZ1bGwuIFNvLCB3aGVuIHdlIGNvbWUgaW4gaGVyZSwgd2UgbmVlZCB0byB0ZXN0IGlmIGFueQorCQkJICoqIHBvcnRzIGFyZSBpbiB0aGlzIGNvbmRpdGlvbiwgYW5kIHJlLW9wZW4gdGhlIHBvcnQgYmVmb3JlCisJCQkgKiogd2UgdHJ5IHRvIHNlbmQgYW55IG1vcmUgZGF0YSB0byBpdC4gTm93LCB0aGUgcmUtYm9vdGVkCisJCQkgKiogUlRBIHdpbGwgYmUgZGlzY2FyZGluZyBwYWNrZXRzIGZyb20gdGhlIFBIQiB1bnRpbCBpdAorCQkJICoqIHJlY2VpdmVzIHRoaXMgb3BlbiBwYWNrZXQsIGJ1dCBkb24ndCB3b3JyeSB0b29vIG11Y2gKKwkJCSAqKiBhYm91dCB0aGF0LiBUaGUgb25lIHRoaW5nIHRoYXQgaXMgaW50ZXJlc3RpbmcgaXMgdGhlCisJCQkgKiogY29tYmluYXRpb24gb2YgdGhpcyBlZmZlY3QgYW5kIHRoZSBXRkxVU0ggZWZmZWN0IQorCQkJICovCisJCQkvKiBGb3Igbm93IGRvbid0IGhhbmRsZSBSVEEgcmVib290cy4gLS0gUkVXLgorCQkJICAgUmVlbmFibGVkLiBPdGhlcndpc2UgUlRBIHJlYm9vdHMgZGlkbid0IHdvcmsuIER1aC4gLS0gUkVXICovCisJCQlpZiAoUG9ydFAtPk1hZ2ljRmxhZ3MpIHsKKyNpZiAxCisJCQkJaWYgKFBvcnRQLT5NYWdpY0ZsYWdzICYgTUFHSUNfUkVCT09UKSB7CisJCQkJCS8qCisJCQkJCSAqKiB3ZWxsLCB0aGUgUlRBIGhhcyBiZWVuIHJlYm9vdGVkLCBhbmQgdGhlcmUgaXMgcm9vbQorCQkJCQkgKiogb24gaXRzIHF1ZXVlIHRvIGFkZCB0aGUgb3BlbiBwYWNrZXQgdGhhdCBpcyByZXF1aXJlZC4KKwkJCQkJICoqCisJCQkJCSAqKiBUaGUgbWVzc3kgcGFydCBvZiB0aGlzIGxpbmUgaXMgdHJ5aW5nIHRvIGRlY2lkZSBpZgorCQkJCQkgKiogd2UgbmVlZCB0byBjYWxsIHRoZSBQYXJhbSBmdW5jdGlvbiBhcyBhIHR0eSBvciBhcworCQkJCQkgKiogYSBtb2RlbS4KKwkJCQkJICoqIERPTlQgVVNFIENMT0NBTCBBUyBBIFRFU1QgRk9SIFRISVMhCisJCQkJCSAqKgorCQkJCQkgKiogSWYgd2UgY2FuJ3QgcGFyYW0gdGhlIHBvcnQsIHRoZW4gbW92ZSBvbiB0byB0aGUKKwkJCQkJICoqIG5leHQgcG9ydC4KKwkJCQkJICovCisJCQkJCVBvcnRQLT5JblVzZSA9IE5PVF9JTlVTRTsKKworCQkJCQlyaW9fc3Bpbl91bmxvY2soJlBvcnRQLT5wb3J0U2VtKTsKKwkJCQkJaWYgKFJJT1BhcmFtKFBvcnRQLCBPUEVOLCAoKFBvcnRQLT5Db3IyQ29weSAmIChDT1IyX1JUU0ZMT1cgfCBDT1IyX0NUU0ZMT1cpKSA9PSAoQ09SMl9SVFNGTE9XIHwgQ09SMl9DVFNGTE9XKSkgPyBUUlVFIDogRkFMU0UsIERPTlRfU0xFRVApID09IFJJT19GQUlMKSB7CisJCQkJCQljb250aW51ZTsJLyogd2l0aCBuZXh0IHBvcnQgKi8KKwkJCQkJfQorCQkJCQlyaW9fc3Bpbl9sb2NrKCZQb3J0UC0+cG9ydFNlbSk7CisJCQkJCVBvcnRQLT5NYWdpY0ZsYWdzICY9IH5NQUdJQ19SRUJPT1Q7CisJCQkJfQogI2VuZGlmCiAKLQkvKgotCSoqIEFzIG1lbnRpb25lZCBhYm92ZSwgdGhpcyBpcyBhIHRhY2t5IGhhY2sgdG8gY29wZQotCSoqIHdpdGggV0ZMVVNICi0JKi8KLQlpZiAoIFBvcnRQLT5XZmx1c2hGbGFnICkgewotCSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiV2FudCB0byBXRkxVU0ggbWFyayB0aGlzIHBvcnRcbiIpOworCQkJCS8qCisJCQkJICoqIEFzIG1lbnRpb25lZCBhYm92ZSwgdGhpcyBpcyBhIHRhY2t5IGhhY2sgdG8gY29wZQorCQkJCSAqKiB3aXRoIFdGTFVTSAorCQkJCSAqLworCQkJCWlmIChQb3J0UC0+V2ZsdXNoRmxhZykgeworCQkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5UUiwgIldhbnQgdG8gV0ZMVVNIIG1hcmsgdGhpcyBwb3J0XG4iKTsKIAotCSAgaWYgKCBQb3J0UC0+SW5Vc2UgKQotCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJGQUlMUyAtIFBPUlQgSVMgSU4gVVNFXG4iKTsKKwkJCQkJaWYgKFBvcnRQLT5JblVzZSkKKwkJCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTlRSLCAiRkFJTFMgLSBQT1JUIElTIElOIFVTRVxuIik7CisJCQkJfQorCisJCQkJd2hpbGUgKFBvcnRQLT5XZmx1c2hGbGFnICYmIGNhbl9hZGRfdHJhbnNtaXQoJlBhY2tldFAsIFBvcnRQKSAmJiAoUG9ydFAtPkluVXNlID09IE5PVF9JTlVTRSkpIHsKKwkJCQkJaW50IHA7CisJCQkJCXN0cnVjdCBQa3RDbWQgKlBrdENtZFA7CisKKwkJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICJBZGQgV0ZMVVNIIG1hcmtlciB0byBkYXRhIHF1ZXVlXG4iKTsKKwkJCQkJLyoKKwkJCQkJICoqIG1ha2UgaXQgbG9vayBqdXN0IGxpa2UgYSBXRkxVU0ggY29tbWFuZAorCQkJCQkgKi8KKwkJCQkJUGt0Q21kUCA9IChzdHJ1Y3QgUGt0Q21kICopICZQYWNrZXRQLT5kYXRhWzBdOworCisJCQkJCVdCWVRFKFBrdENtZFAtPkNvbW1hbmQsIFdGTFVTSCk7CisKKwkJCQkJcCA9IFBvcnRQLT5Ib3N0UG9ydCAlICh1c2hvcnQpIFBPUlRTX1BFUl9SVEE7CisKKwkJCQkJLyoKKwkJCQkJICoqIElmIHNlY29uZCBibG9jayBvZiBwb3J0cyBmb3IgMTYgcG9ydCBSVEEsIGFkZCA4CisJCQkJCSAqKiB0byBpbmRleCA4LTE1LgorCQkJCQkgKi8KKwkJCQkJaWYgKFBvcnRQLT5TZWNvbmRCbG9jaykKKwkJCQkJCXAgKz0gUE9SVFNfUEVSX1JUQTsKKworCQkJCQlXQllURShQa3RDbWRQLT5QaGJOdW0sIHApOworCisJCQkJCS8qCisJCQkJCSAqKiB0byBtYWtlIGRlYnVnZ2VyeSBlYXNpZXIKKwkJCQkJICovCisJCQkJCVdCWVRFKFBhY2tldFAtPmRhdGFbMl0sICdXJyk7CisJCQkJCVdCWVRFKFBhY2tldFAtPmRhdGFbM10sICdGJyk7CisJCQkJCVdCWVRFKFBhY2tldFAtPmRhdGFbNF0sICdMJyk7CisJCQkJCVdCWVRFKFBhY2tldFAtPmRhdGFbNV0sICdVJyk7CisJCQkJCVdCWVRFKFBhY2tldFAtPmRhdGFbNl0sICdTJyk7CisJCQkJCVdCWVRFKFBhY2tldFAtPmRhdGFbN10sICdIJyk7CisJCQkJCVdCWVRFKFBhY2tldFAtPmRhdGFbOF0sICcgJyk7CisJCQkJCVdCWVRFKFBhY2tldFAtPmRhdGFbOV0sICcwJyArIFBvcnRQLT5XZmx1c2hGbGFnKTsKKwkJCQkJV0JZVEUoUGFja2V0UC0+ZGF0YVsxMF0sICcgJyk7CisJCQkJCVdCWVRFKFBhY2tldFAtPmRhdGFbMTFdLCAnICcpOworCQkJCQlXQllURShQYWNrZXRQLT5kYXRhWzEyXSwgJ1wwJyk7CisKKwkJCQkJLyoKKwkJCQkJICoqIGl0cyB0d28gYnl0ZXMgbG9uZyEKKwkJCQkJICovCisJCQkJCVdCWVRFKFBhY2tldFAtPmxlbiwgUEtUX0NNRF9CSVQgfCAyKTsKKworCQkJCQkvKgorCQkJCQkgKiogcXVldWUgaXQhCisJCQkJCSAqLworCQkJCQlpZiAoIShQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCkpIHsKKwkJCQkJCWFkZF90cmFuc21pdChQb3J0UCk7CisJCQkJCQkvKgorCQkJCQkJICoqIENvdW50IGNoYXJzIHR4J2QgZm9yIHBvcnQgc3RhdGlzdGljcyByZXBvcnRpbmcKKwkJCQkJCSAqLworCQkJCQkJaWYgKFBvcnRQLT5zdGF0c0dhdGhlcikKKwkJCQkJCQlQb3J0UC0+dHhjaGFycyArPSAyOworCQkJCQl9CisKKwkJCQkJaWYgKC0tKFBvcnRQLT5XZmx1c2hGbGFnKSA9PSAwKSB7CisJCQkJCQlQb3J0UC0+TWFnaWNGbGFncyAmPSB+TUFHSUNfRkxVU0g7CisJCQkJCX0KKworCQkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5UUiwgIldmbHVzaCBjb3VudCBub3cgc3RhbmRzIGF0ICVkXG4iLCBQb3J0UC0+V2ZsdXNoRmxhZyk7CisJCQkJfQorCQkJCWlmIChQb3J0UC0+TWFnaWNGbGFncyAmIE1PUkVfT1VUUFVUX0VZR09SKSB7CisJCQkJCWlmIChQb3J0UC0+TWFnaWNGbGFncyAmIE1BR0lDX0ZMVVNIKSB7CisJCQkJCQlQb3J0UC0+TWFnaWNGbGFncyB8PSBNT1JFX09VVFBVVF9FWUdPUjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICghY2FuX2FkZF90cmFuc21pdCgmUGFja2V0UCwgUG9ydFApKSB7CisJCQkJCQkJcmlvX3NwaW5fdW5sb2NrKCZQb3J0UC0+cG9ydFNlbSk7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCQlyaW9fc3Bpbl91bmxvY2soJlBvcnRQLT5wb3J0U2VtKTsKKwkJCQkJCVJJT1R4RW5hYmxlKChjaGFyICopIFBvcnRQKTsKKwkJCQkJCXJpb19zcGluX2xvY2soJlBvcnRQLT5wb3J0U2VtKTsKKwkJCQkJCVBvcnRQLT5NYWdpY0ZsYWdzICY9IH5NT1JFX09VVFBVVF9FWUdPUjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCisJCQkvKgorCQkJICoqIElmIHdlIGNhbid0IGFkZCBhbnl0aGluZyB0byB0aGUgdHJhbnNtaXQgcXVldWUsIHRoZW4KKwkJCSAqKiB3ZSBuZWVkIGRvIG5vbmUgb2YgdGhlIHJlbWFpbmluZyBwcm9jZXNzaW5nLgorCQkJICovCisJCQlpZiAoIWNhbl9hZGRfdHJhbnNtaXQoJlBhY2tldFAsIFBvcnRQKSkgeworCQkJCXJpb19zcGluX3VubG9jaygmUG9ydFAtPnBvcnRTZW0pOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlyaW9fc3Bpbl91bmxvY2soJlBvcnRQLT5wb3J0U2VtKTsKKwkJCVJJT1R4RW5hYmxlKChjaGFyICopIFBvcnRQKTsKKwkJfQogCX0KLQkJCQkKLQl3aGlsZSAoIFBvcnRQLT5XZmx1c2hGbGFnICYmCi0JCWNhbl9hZGRfdHJhbnNtaXQoICZQYWNrZXRQLCBQb3J0UCApICYmIAotCQkoIFBvcnRQLT5JblVzZSA9PSBOT1RfSU5VU0UgKSApIHsKLQkgIGludCBwOwotCSAgc3RydWN0IFBrdENtZCAqUGt0Q21kUDsKLQotCSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiQWRkIFdGTFVTSCBtYXJrZXIgdG8gZGF0YSBxdWV1ZVxuIik7Ci0JICAvKgotCSAgKiogbWFrZSBpdCBsb29rIGp1c3QgbGlrZSBhIFdGTFVTSCBjb21tYW5kCi0JICAqLwotCSAgUGt0Q21kUCA9ICggc3RydWN0IFBrdENtZCAqICkmUGFja2V0UC0+ZGF0YVswXTsKLQotCSAgV0JZVEUoIFBrdENtZFAtPkNvbW1hbmQgLCBXRkxVU0ggKTsKLQotCSAgcCA9ICBQb3J0UC0+SG9zdFBvcnQgJSAoIHVzaG9ydCApUE9SVFNfUEVSX1JUQTsKLQotCSAgLyoKLQkgICoqIElmIHNlY29uZCBibG9jayBvZiBwb3J0cyBmb3IgMTYgcG9ydCBSVEEsIGFkZCA4Ci0JICAqKiB0byBpbmRleCA4LTE1LgotCSAgKi8KLQkgIGlmICggUG9ydFAtPlNlY29uZEJsb2NrICkKLQkgICAgcCArPSBQT1JUU19QRVJfUlRBOwotCi0JICBXQllURSggUGt0Q21kUC0+UGhiTnVtLCBwICk7Ci0KLQkgIC8qCi0JICAqKiB0byBtYWtlIGRlYnVnZ2VyeSBlYXNpZXIKLQkgICovCi0JICBXQllURSggUGFja2V0UC0+ZGF0YVsgMl0sICdXJyAgKTsKLQkgIFdCWVRFKCBQYWNrZXRQLT5kYXRhWyAzXSwgJ0YnICApOwotCSAgV0JZVEUoIFBhY2tldFAtPmRhdGFbIDRdLCAnTCcgICk7Ci0JICBXQllURSggUGFja2V0UC0+ZGF0YVsgNV0sICdVJyAgKTsKLQkgIFdCWVRFKCBQYWNrZXRQLT5kYXRhWyA2XSwgJ1MnICApOwotCSAgV0JZVEUoIFBhY2tldFAtPmRhdGFbIDddLCAnSCcgICk7Ci0JICBXQllURSggUGFja2V0UC0+ZGF0YVsgOF0sICcgJyAgKTsKLQkgIFdCWVRFKCBQYWNrZXRQLT5kYXRhWyA5XSwgJzAnK1BvcnRQLT5XZmx1c2hGbGFnICk7Ci0JICBXQllURSggUGFja2V0UC0+ZGF0YVsxMF0sICcgJyAgKTsKLQkgIFdCWVRFKCBQYWNrZXRQLT5kYXRhWzExXSwgJyAnICApOwotCSAgV0JZVEUoIFBhY2tldFAtPmRhdGFbMTJdLCAnXDAnICk7Ci0KLQkgIC8qCi0JICAqKiBpdHMgdHdvIGJ5dGVzIGxvbmchCi0JICAqLwotCSAgV0JZVEUoIFBhY2tldFAtPmxlbiAsIFBLVF9DTURfQklUIHwgMiApOwotCi0JICAvKgotCSAgKiogcXVldWUgaXQhCi0JICAqLwotCSAgaWYgKCAhKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApICkgewotCSAgICBhZGRfdHJhbnNtaXQoIFBvcnRQICk7Ci0JICAgIC8qCi0JICAgICoqIENvdW50IGNoYXJzIHR4J2QgZm9yIHBvcnQgc3RhdGlzdGljcyByZXBvcnRpbmcKLQkgICAgKi8KLQkgICAgaWYgKCBQb3J0UC0+c3RhdHNHYXRoZXIgKQotCSAgICAgIFBvcnRQLT50eGNoYXJzICs9IDI7Ci0JICB9Ci0KLQkgIGlmICggLS0oIFBvcnRQLT5XZmx1c2hGbGFnICkgPT0gMCApIHsKLQkgICAgUG9ydFAtPk1hZ2ljRmxhZ3MgJj0gfk1BR0lDX0ZMVVNIOwotCSAgfQotCi0JICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJXZmx1c2ggY291bnQgbm93IHN0YW5kcyBhdCAlZFxuIiwgCi0JCSBQb3J0UC0+V2ZsdXNoRmxhZyk7Ci0JfQotCWlmICggUG9ydFAtPk1hZ2ljRmxhZ3MgJiBNT1JFX09VVFBVVF9FWUdPUiApIHsKLQkgIGlmICggUG9ydFAtPk1hZ2ljRmxhZ3MgJiBNQUdJQ19GTFVTSCApIHsKLQkgICAgUG9ydFAtPk1hZ2ljRmxhZ3MgfD0gTU9SRV9PVVRQVVRfRVlHT1I7Ci0JICB9Ci0JICBlbHNlIHsKLQkgICAgaWYgKCAhY2FuX2FkZF90cmFuc21pdCggJlBhY2tldFAsIFBvcnRQICkgKSB7Ci0JICAgICAgcmlvX3NwaW5fdW5sb2NrKCZQb3J0UC0+cG9ydFNlbSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgICAgcmlvX3NwaW5fdW5sb2NrKCZQb3J0UC0+cG9ydFNlbSk7Ci0JICAgIFJJT1R4RW5hYmxlKChjaGFyICopUG9ydFApOwotCSAgICByaW9fc3Bpbl9sb2NrKCZQb3J0UC0+cG9ydFNlbSk7Ci0JICAgIFBvcnRQLT5NYWdpY0ZsYWdzICY9IH5NT1JFX09VVFBVVF9FWUdPUjsKLQkgIH0KLQl9Ci0gICAgICB9Ci0KLQotICAgICAgLyoKLSAgICAgICoqIElmIHdlIGNhbid0IGFkZCBhbnl0aGluZyB0byB0aGUgdHJhbnNtaXQgcXVldWUsIHRoZW4KLSAgICAgICoqIHdlIG5lZWQgZG8gbm9uZSBvZiB0aGUgcmVtYWluaW5nIHByb2Nlc3NpbmcuCi0gICAgICAqLwotICAgICAgaWYgKCFjYW5fYWRkX3RyYW5zbWl0KCAmUGFja2V0UCwgUG9ydFAgKSApIHsKLQlyaW9fc3Bpbl91bmxvY2soJlBvcnRQLT5wb3J0U2VtKTsKLQljb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgcmlvX3NwaW5fdW5sb2NrKCZQb3J0UC0+cG9ydFNlbSk7Ci0gICAgICBSSU9UeEVuYWJsZSgoY2hhciAqKVBvcnRQKTsKLSAgICB9Ci0gIH0KIH0KIAogLyoKQEAgLTU1MCwxODAgKzUzMywxNjIgQEAKICoqIE5COiBDYWxsZWQgd2l0aCB0aGUgdHR5IGxvY2tlZC4gVGhlIHNwbCBmcm9tIHRoZSBsb2NrYiggKSBpcyBwYXNzZWQuCiAqKiB3ZSByZXR1cm4gdGhlIHR0eVNwbCBsZXZlbCB0aGF0IHdlIHJlLWxvY2tlZCBhdC4KICovCi1zdGF0aWMgdm9pZAotUklPUmVjZWl2ZShwLCBQb3J0UCkKLXN0cnVjdCByaW9faW5mbyAqCXA7Ci1zdHJ1Y3QgUG9ydCAqCQlQb3J0UDsKK3N0YXRpYyB2b2lkIFJJT1JlY2VpdmUocCwgUG9ydFApCitzdHJ1Y3QgcmlvX2luZm8gKnA7CitzdHJ1Y3QgUG9ydCAqUG9ydFA7CiB7Ci0gIHN0cnVjdCB0dHlfc3RydWN0ICpUdHlQOwotICByZWdpc3RlciB1c2hvcnQgdHJhbnNDb3VudDsKLSAgc3RydWN0IFBLVCAqUGFja2V0UDsKLSAgcmVnaXN0ZXIgdWludAlEYXRhQ250OwotICB1Y2hhciAqCXB0cjsKLSAgaW50IGNvcGllZCA9MDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqVHR5UDsKKwlyZWdpc3RlciB1c2hvcnQgdHJhbnNDb3VudDsKKwlzdHJ1Y3QgUEtUICpQYWNrZXRQOworCXJlZ2lzdGVyIHVpbnQgRGF0YUNudDsKKwl1Y2hhciAqcHRyOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlpbnQgY29waWVkID0gMDsKIAotICBzdGF0aWMgaW50IGludENvdW50LCBSeEludENudDsKKwlzdGF0aWMgaW50IGludENvdW50LCBSeEludENudDsKIAotICAvKgotICAqKiBUaGUgcmVjZWl2ZSBkYXRhIHByb2Nlc3MgaXMgdG8gcmVtb3ZlIHBhY2tldHMgZnJvbSB0aGUKLSAgKiogUEhCIHVudGlsIHRoZXJlIGFyZW4ndCBhbnkgbW9yZSBvciB0aGUgY3VycmVudCBjYmxvY2sKLSAgKiogaXMgZnVsbC4gV2hlbiB0aGlzIG9jY3VycywgdGhlcmUgd2lsbCBiZSBzb21lIGxlZnQgb3ZlcgotICAqKiBkYXRhIGluIHRoZSBwYWNrZXQsIHRoYXQgd2UgbXVzdCBkbyBzb21ldGhpbmcgd2l0aC4KLSAgKiogQXMgd2UgaGF2ZW4ndCB1bmhvb2tlZCB0aGUgcGFja2V0IGZyb20gdGhlIHJlYWQgbGlzdAotICAqKiB5ZXQsIHdlIGNhbiBqdXN0IGxlYXZlIHRoZSBwYWNrZXQgdGhlcmUsIGhhdmluZyBmaXJzdAotICAqKiBtYWRlIGEgbm90ZSBvZiBob3cgZmFyIHdlIGdvdC4gVGhpcyBtZWFucyB0aGF0IHdlIG5lZWQKLSAgKiogYSBwb2ludGVyIHBlciBwb3J0IHNheWluZyB3aGVyZSB3ZSBzdGFydCB0YWtpbmcgdGhlCi0gICoqIGRhdGEgZnJvbSAtIHRoaXMgd2lsbCBub3JtYWxseSBiZSB6ZXJvLCBidXQgd2hlbiB3ZQotICAqKiBydW4gb3V0IG9mIHNwYWNlIGl0IHdpbGwgYmUgc2V0IHRvIHRoZSBvZmZzZXQgb2YgdGhlCi0gICoqIG5leHQgYnl0ZSB0byBjb3B5IGZyb20gdGhlIHBhY2tldCBkYXRhIGFyZWEuIFRoZSBwYWNrZXQKLSAgKiogbGVuZ3RoIGZpZWxkIGlzIGRlY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdAotICAqKiB3ZSBzdWNjZXNmdWxseSByZW1vdmVkIGZyb20gdGhlIHBhY2tldC4gV2hlbiB0aGlzIHJlYWNoZXMKLSAgKiogemVybywgd2UgcmVzZXQgdGhlIG9mZnNldCBwb2ludGVyIHRvIGJlIHplcm8sIGFuZCBmcmVlCi0gICoqIHRoZSBwYWNrZXQgZnJvbSB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlLgotICAqLworCS8qCisJICoqIFRoZSByZWNlaXZlIGRhdGEgcHJvY2VzcyBpcyB0byByZW1vdmUgcGFja2V0cyBmcm9tIHRoZQorCSAqKiBQSEIgdW50aWwgdGhlcmUgYXJlbid0IGFueSBtb3JlIG9yIHRoZSBjdXJyZW50IGNibG9jaworCSAqKiBpcyBmdWxsLiBXaGVuIHRoaXMgb2NjdXJzLCB0aGVyZSB3aWxsIGJlIHNvbWUgbGVmdCBvdmVyCisJICoqIGRhdGEgaW4gdGhlIHBhY2tldCwgdGhhdCB3ZSBtdXN0IGRvIHNvbWV0aGluZyB3aXRoLgorCSAqKiBBcyB3ZSBoYXZlbid0IHVuaG9va2VkIHRoZSBwYWNrZXQgZnJvbSB0aGUgcmVhZCBsaXN0CisJICoqIHlldCwgd2UgY2FuIGp1c3QgbGVhdmUgdGhlIHBhY2tldCB0aGVyZSwgaGF2aW5nIGZpcnN0CisJICoqIG1hZGUgYSBub3RlIG9mIGhvdyBmYXIgd2UgZ290LiBUaGlzIG1lYW5zIHRoYXQgd2UgbmVlZAorCSAqKiBhIHBvaW50ZXIgcGVyIHBvcnQgc2F5aW5nIHdoZXJlIHdlIHN0YXJ0IHRha2luZyB0aGUKKwkgKiogZGF0YSBmcm9tIC0gdGhpcyB3aWxsIG5vcm1hbGx5IGJlIHplcm8sIGJ1dCB3aGVuIHdlCisJICoqIHJ1biBvdXQgb2Ygc3BhY2UgaXQgd2lsbCBiZSBzZXQgdG8gdGhlIG9mZnNldCBvZiB0aGUKKwkgKiogbmV4dCBieXRlIHRvIGNvcHkgZnJvbSB0aGUgcGFja2V0IGRhdGEgYXJlYS4gVGhlIHBhY2tldAorCSAqKiBsZW5ndGggZmllbGQgaXMgZGVjcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0CisJICoqIHdlIHN1Y2Nlc2Z1bGx5IHJlbW92ZWQgZnJvbSB0aGUgcGFja2V0LiBXaGVuIHRoaXMgcmVhY2hlcworCSAqKiB6ZXJvLCB3ZSByZXNldCB0aGUgb2Zmc2V0IHBvaW50ZXIgdG8gYmUgemVybywgYW5kIGZyZWUKKwkgKiogdGhlIHBhY2tldCBmcm9tIHRoZSBmcm9udCBvZiB0aGUgcXVldWUuCisJICovCiAKLSAgaW50Q291bnQrKzsKKwlpbnRDb3VudCsrOwogCi0gIFR0eVAgPSBQb3J0UC0+Z3MudHR5OwotICBpZiAoIVR0eVApIHsKLSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJSSU9SZWNlaXZlOiB0dHkgaXMgbnVsbC4gXG4iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoUG9ydFAtPlN0YXRlICYgUklPX1RIUk9UVExFX1JYKSB7Ci0gICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiUklPUmVjZWl2ZTogVGhyb3R0bGVkLiBDYW4ndCBoYW5kbGUgbW9yZSBpbnB1dC5cbiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICggUG9ydFAtPlN0YXRlICYgUklPX0RFTEVURUQgKQotICAgIHsKLSAgICAgIHdoaWxlICggY2FuX3JlbW92ZV9yZWNlaXZlKCAmUGFja2V0UCwgUG9ydFAgKSApCi0JewotCSAgcmVtb3ZlX3JlY2VpdmUoIFBvcnRQICk7Ci0JICBwdXRfZnJlZV9lbmQoIFBvcnRQLT5Ib3N0UCwgUGFja2V0UCApOworCVR0eVAgPSBQb3J0UC0+Z3MudHR5OworCWlmICghVHR5UCkgeworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5UUiwgIlJJT1JlY2VpdmU6IHR0eSBpcyBudWxsLiBcbiIpOworCQlyZXR1cm47CiAJfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qCi0gICAgICAqKiBsb29wLCBqdXN0IHNvIGxvbmcgYXM6Ci0gICAgICAqKiAgIGkgKSB0aGVyZSdzIHNvbWUgZGF0YSAoIGkuZS4gY2FuX3JlbW92ZV9yZWNlaXZlICkKLSAgICAgICoqICBpaSApIHdlIGhhdmVuJ3QgYmVlbiBibG9ja2VkCi0gICAgICAqKiBpaWkgKSB0aGVyZSdzIHNvbWV3aGVyZSB0byBwdXQgdGhlIGRhdGEKLSAgICAgICoqICBpdiApIHdlIGhhdmVuJ3Qgb3V0c3RheWVkIG91ciB3ZWxjb21lCi0gICAgICAqLwotICAgICAgdHJhbnNDb3VudCA9IDE7Ci0gICAgICB3aGlsZSAoIGNhbl9yZW1vdmVfcmVjZWl2ZSgmUGFja2V0UCwgUG9ydFApCi0JICAgICAgJiYgdHJhbnNDb3VudCkKLQl7CisKKwlpZiAoUG9ydFAtPlN0YXRlICYgUklPX1RIUk9UVExFX1JYKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTlRSLCAiUklPUmVjZWl2ZTogVGhyb3R0bGVkLiBDYW4ndCBoYW5kbGUgbW9yZSBpbnB1dC5cbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEKSB7CisJCXdoaWxlIChjYW5fcmVtb3ZlX3JlY2VpdmUoJlBhY2tldFAsIFBvcnRQKSkgeworCQkJcmVtb3ZlX3JlY2VpdmUoUG9ydFApOworCQkJcHV0X2ZyZWVfZW5kKFBvcnRQLT5Ib3N0UCwgUGFja2V0UCk7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiogbG9vcCwganVzdCBzbyBsb25nIGFzOgorCQkgKiogICBpICkgdGhlcmUncyBzb21lIGRhdGEgKCBpLmUuIGNhbl9yZW1vdmVfcmVjZWl2ZSApCisJCSAqKiAgaWkgKSB3ZSBoYXZlbid0IGJlZW4gYmxvY2tlZAorCQkgKiogaWlpICkgdGhlcmUncyBzb21ld2hlcmUgdG8gcHV0IHRoZSBkYXRhCisJCSAqKiAgaXYgKSB3ZSBoYXZlbid0IG91dHN0YXllZCBvdXIgd2VsY29tZQorCQkgKi8KKwkJdHJhbnNDb3VudCA9IDE7CisJCXdoaWxlIChjYW5fcmVtb3ZlX3JlY2VpdmUoJlBhY2tldFAsIFBvcnRQKQorCQkgICAgICAgJiYgdHJhbnNDb3VudCkgewogI2lmZGVmIFNUQVRTCi0JICBQb3J0UC0+U3RhdC5SeEludENudCsrOwotI2VuZGlmIC8qIFNUQVRTICovCi0JICBSeEludENudCsrOworCQkJUG9ydFAtPlN0YXQuUnhJbnRDbnQrKzsKKyNlbmRpZgkJCQkvKiBTVEFUUyAqLworCQkJUnhJbnRDbnQrKzsKIAotCSAgLyoKLQkgICoqIGNoZWNrIHRoYXQgaXQgaXMgbm90IGEgY29tbWFuZCEKLQkgICovCi0JICBpZiAoIFBhY2tldFAtPmxlbiAmIFBLVF9DTURfQklUICkgewotCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJSSU86IHVuZXhwZWN0ZWQgY29tbWFuZCBwYWNrZXQgcmVjZWl2ZWQgb24gUEhCXG4iKTsKLQkgICAgLyoJICAgIHJpb19kcHJpbnQoUklPX0RFQlVHX0lOVFIsICgiIHN5c3BvcnQgICA9ICVkXG4iLCBwLT5SSU9Qb3J0cC0+UG9ydE51bSkpOyAqLwotCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICIgZGVzdF91bml0ID0gJWRcbiIsIFBhY2tldFAtPmRlc3RfdW5pdCk7Ci0JICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIiBkZXN0X3BvcnQgPSAlZFxuIiwgUGFja2V0UC0+ZGVzdF9wb3J0KTsKLQkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiIHNyY191bml0ICA9ICVkXG4iLCBQYWNrZXRQLT5zcmNfdW5pdCk7Ci0JICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIiBzcmNfcG9ydCAgPSAlZFxuIiwgUGFja2V0UC0+c3JjX3BvcnQpOwotCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICIgbGVuCSAgID0gJWRcbiIsIFBhY2tldFAtPmxlbik7Ci0JICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIiBjb250cm9sICAgPSAlZFxuIiwgUGFja2V0UC0+Y29udHJvbCk7Ci0JICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIiBjc3VtCSAgID0gJWRcbiIsIFBhY2tldFAtPmNzdW0pOwotCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICIJIGRhdGEgYnl0ZXM6ICIpOwotCSAgICBmb3IgKCBEYXRhQ250PTA7IERhdGFDbnQ8UEtUX01BWF9EQVRBX0xFTjsgRGF0YUNudCsrICkKLQkgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICIlZFxuIiwgUGFja2V0UC0+ZGF0YVtEYXRhQ250XSk7Ci0JICAgIHJlbW92ZV9yZWNlaXZlKCBQb3J0UCApOwotCSAgICBwdXRfZnJlZV9lbmQoIFBvcnRQLT5Ib3N0UCwgUGFja2V0UCApOwotCSAgICBjb250aW51ZTsgLyogd2l0aCBuZXh0IHBhY2tldCAqLwotCSAgfQorCQkJLyoKKwkJCSAqKiBjaGVjayB0aGF0IGl0IGlzIG5vdCBhIGNvbW1hbmQhCisJCQkgKi8KKwkJCWlmIChQYWNrZXRQLT5sZW4gJiBQS1RfQ01EX0JJVCkgeworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTlRSLCAiUklPOiB1bmV4cGVjdGVkIGNvbW1hbmQgcGFja2V0IHJlY2VpdmVkIG9uIFBIQlxuIik7CisJCQkJLyogICAgICByaW9fZHByaW50KFJJT19ERUJVR19JTlRSLCAoIiBzeXNwb3J0ICAgPSAlZFxuIiwgcC0+UklPUG9ydHAtPlBvcnROdW0pKTsgKi8KKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5UUiwgIiBkZXN0X3VuaXQgPSAlZFxuIiwgUGFja2V0UC0+ZGVzdF91bml0KTsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5UUiwgIiBkZXN0X3BvcnQgPSAlZFxuIiwgUGFja2V0UC0+ZGVzdF9wb3J0KTsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5UUiwgIiBzcmNfdW5pdCAgPSAlZFxuIiwgUGFja2V0UC0+c3JjX3VuaXQpOworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTlRSLCAiIHNyY19wb3J0ICA9ICVkXG4iLCBQYWNrZXRQLT5zcmNfcG9ydCk7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICIgbGVuCSAgID0gJWRcbiIsIFBhY2tldFAtPmxlbik7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICIgY29udHJvbCAgID0gJWRcbiIsIFBhY2tldFAtPmNvbnRyb2wpOworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTlRSLCAiIGNzdW0JICAgPSAlZFxuIiwgUGFja2V0UC0+Y3N1bSk7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICIJIGRhdGEgYnl0ZXM6ICIpOworCQkJCWZvciAoRGF0YUNudCA9IDA7IERhdGFDbnQgPCBQS1RfTUFYX0RBVEFfTEVOOyBEYXRhQ250KyspCisJCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTlRSLCAiJWRcbiIsIFBhY2tldFAtPmRhdGFbRGF0YUNudF0pOworCQkJCXJlbW92ZV9yZWNlaXZlKFBvcnRQKTsKKwkJCQlwdXRfZnJlZV9lbmQoUG9ydFAtPkhvc3RQLCBQYWNrZXRQKTsKKwkJCQljb250aW51ZTsJLyogd2l0aCBuZXh0IHBhY2tldCAqLworCQkJfQogCi0JICAvKgotCSAgKiogSG93IG1hbnkgY2hhcmFjdGVycyBjYW4gd2UgbW92ZSAndXBzdHJlYW0nID8KLQkgICoqCi0JICAqKiBEZXRlcm1pbmUgdGhlIG1pbmltdW0gb2YgdGhlIGFtb3VudCBvZiBkYXRhCi0JICAqKiBhdmFpbGFibGUgYW5kIHRoZSBhbW91bnQgb2Ygc3BhY2UgaW4gd2hpY2ggdG8KLQkgICoqIHB1dCBpdC4KLQkgICoqCi0JICAqKiAxLglHZXQgdGhlIHBhY2tldCBsZW5ndGggYnkgbWFza2luZyAnbGVuJwotCSAgKioJZm9yIG9ubHkgdGhlIGxlbmd0aCBiaXRzLgotCSAgKiogMi4JQXZhaWxhYmxlIHNwYWNlIGlzIFtidWZmZXIgc2l6ZV0gLSBbc3BhY2UgdXNlZF0KLQkgICoqCi0JICAqKiBUcmFuc2ZlciBjb3VudCBpcyB0aGUgbWluaW11bSBvZiBwYWNrZXQgbGVuZ3RoCi0JICAqKiBhbmQgYXZhaWxhYmxlIHNwYWNlLgotCSAgKi8KLQkJCQotCSAgdHJhbnNDb3VudCA9IG1pbl90KHVuc2lnbmVkIGludCwgUGFja2V0UC0+bGVuICYgUEtUX0xFTl9NQVNLLAotCQkJICAgVFRZX0ZMSVBCVUZfU0laRSAtIFR0eVAtPmZsaXAuY291bnQpOwotCSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19SRUMsICAicG9ydCAlZDogQ29weSAlZCBieXRlc1xuIiwgCi0JCQkJICAgICAgUG9ydFAtPlBvcnROdW0sIHRyYW5zQ291bnQpOwotCSAgLyoKLQkgICoqIFRvIHVzZSB0aGUgZm9sbG93aW5nICdra3ByaW50ZnMnIGZvciBkZWJ1Z2dpbmcgLSBjaGFuZ2UgdGhlICcjdW5kZWYnCi0JICAqKiB0byAnI2RlZmluZScsICh0aGlzIGlzIHRoZSBvbmx5IHBsYWNlIF9fX0RFQlVHX0lUX19fIG9jY3VycyBpbiB0aGUKLQkgICoqIGRyaXZlcikuCi0JICAqLworCQkJLyoKKwkJCSAqKiBIb3cgbWFueSBjaGFyYWN0ZXJzIGNhbiB3ZSBtb3ZlICd1cHN0cmVhbScgPworCQkJICoqCisJCQkgKiogRGV0ZXJtaW5lIHRoZSBtaW5pbXVtIG9mIHRoZSBhbW91bnQgb2YgZGF0YQorCQkJICoqIGF2YWlsYWJsZSBhbmQgdGhlIGFtb3VudCBvZiBzcGFjZSBpbiB3aGljaCB0bworCQkJICoqIHB1dCBpdC4KKwkJCSAqKgorCQkJICoqIDEuICAgICAgICBHZXQgdGhlIHBhY2tldCBsZW5ndGggYnkgbWFza2luZyAnbGVuJworCQkJICoqICAgZm9yIG9ubHkgdGhlIGxlbmd0aCBiaXRzLgorCQkJICoqIDIuICAgICAgICBBdmFpbGFibGUgc3BhY2UgaXMgW2J1ZmZlciBzaXplXSAtIFtzcGFjZSB1c2VkXQorCQkJICoqCisJCQkgKiogVHJhbnNmZXIgY291bnQgaXMgdGhlIG1pbmltdW0gb2YgcGFja2V0IGxlbmd0aAorCQkJICoqIGFuZCBhdmFpbGFibGUgc3BhY2UuCisJCQkgKi8KKworCQkJdHJhbnNDb3VudCA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKFR0eVAsIFBhY2tldFAtPmxlbiAmIFBLVF9MRU5fTUFTSyk7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUkVDLCAicG9ydCAlZDogQ29weSAlZCBieXRlc1xuIiwgUG9ydFAtPlBvcnROdW0sIHRyYW5zQ291bnQpOworCQkJLyoKKwkJCSAqKiBUbyB1c2UgdGhlIGZvbGxvd2luZyAna2twcmludGZzJyBmb3IgZGVidWdnaW5nIC0gY2hhbmdlIHRoZSAnI3VuZGVmJworCQkJICoqIHRvICcjZGVmaW5lJywgKHRoaXMgaXMgdGhlIG9ubHkgcGxhY2UgX19fREVCVUdfSVRfX18gb2NjdXJzIGluIHRoZQorCQkJICoqIGRyaXZlcikuCisJCQkgKi8KICN1bmRlZiBfX19ERUJVR19JVF9fXwogI2lmZGVmIF9fX0RFQlVHX0lUX19fCi0JICBra3ByaW50ZigiSTolZCBSOiVkIFA6JWQgUTolZCBDOiVkIEY6JXggIiwKLQkJICAgaW50Q291bnQsCi0JCSAgIFJ4SW50Q250LAotCQkgICBQb3J0UC0+UG9ydE51bSwKLQkJICAgVHR5UC0+cnhxdWV1ZS5jb3VudCwKLQkJICAgdHJhbnNDb3VudCwKLQkJICAgVHR5UC0+ZmxhZ3MgKTsKKwkJCWtrcHJpbnRmKCJJOiVkIFI6JWQgUDolZCBROiVkIEM6JWQgRjoleCAiLCBpbnRDb3VudCwgUnhJbnRDbnQsIFBvcnRQLT5Qb3J0TnVtLCBUdHlQLT5yeHF1ZXVlLmNvdW50LCB0cmFuc0NvdW50LCBUdHlQLT5mbGFncyk7CiAjZW5kaWYKLQkgIHB0ciA9ICh1Y2hhciAqKSBQYWNrZXRQLT5kYXRhICsgUG9ydFAtPlJ4RGF0YVN0YXJ0OworCQkJcHRyID0gKHVjaGFyICopIFBhY2tldFAtPmRhdGEgKyBQb3J0UC0+UnhEYXRhU3RhcnQ7CiAKLQkgIHJpb19tZW1jcHlfZnJvbWlvIChUdHlQLT5mbGlwLmNoYXJfYnVmX3B0ciwgcHRyLCB0cmFuc0NvdW50KTsKLQkgIG1lbXNldChUdHlQLT5mbGlwLmZsYWdfYnVmX3B0ciwgVFRZX05PUk1BTCwgdHJhbnNDb3VudCk7Ci0KKwkJCXR0eV9wcmVwYXJlX2ZsaXBfc3RyaW5nKFR0eVAsICZidWYsIHRyYW5zQ291bnQpOworCQkJcmlvX21lbWNweV9mcm9taW8oYnVmLCBwdHIsIHRyYW5zQ291bnQpOwogI2lmZGVmIFNUQVRTCi0JICAvKgotCSAgKioga2VlcCBhIGNvdW50IGZvciBzdGF0aXN0aWNhbCBwdXJwb3NlcwotCSAgKi8KLQkgIFBvcnRQLT5TdGF0LlJ4Q2hhckNudAkrPSB0cmFuc0NvdW50OworCQkJLyoKKwkJCSAqKiBrZWVwIGEgY291bnQgZm9yIHN0YXRpc3RpY2FsIHB1cnBvc2VzCisJCQkgKi8KKwkJCVBvcnRQLT5TdGF0LlJ4Q2hhckNudCArPSB0cmFuc0NvdW50OwogI2VuZGlmCi0JICBQb3J0UC0+UnhEYXRhU3RhcnQJKz0gdHJhbnNDb3VudDsKLQkgIFBhY2tldFAtPmxlbgkJLT0gdHJhbnNDb3VudDsKLQkgIGNvcGllZCArPSB0cmFuc0NvdW50OwotCSAgVHR5UC0+ZmxpcC5jb3VudCArPSB0cmFuc0NvdW50OwotCSAgVHR5UC0+ZmxpcC5jaGFyX2J1Zl9wdHIgKz0gdHJhbnNDb3VudDsKLQkgIFR0eVAtPmZsaXAuZmxhZ19idWZfcHRyICs9IHRyYW5zQ291bnQ7CisJCQlQb3J0UC0+UnhEYXRhU3RhcnQgKz0gdHJhbnNDb3VudDsKKwkJCVBhY2tldFAtPmxlbiAtPSB0cmFuc0NvdW50OworCQkJY29waWVkICs9IHRyYW5zQ291bnQ7CiAKIAogI2lmZGVmIF9fX0RFQlVHX0lUX19fCi0JICBra3ByaW50ZigiVDolZCBMOiVkXG4iLCBEYXRhQ250LCBQYWNrZXRQLT5sZW4gKTsKKwkJCWtrcHJpbnRmKCJUOiVkIEw6JWRcbiIsIERhdGFDbnQsIFBhY2tldFAtPmxlbik7CiAjZW5kaWYKIAotCSAgaWYgKCBQYWNrZXRQLT5sZW4gPT0gMCApCi0JICAgIHsKKwkJCWlmIChQYWNrZXRQLT5sZW4gPT0gMCkgewogCQkJCS8qCi0JCQkJKiogSWYgd2UgaGF2ZSBlbXB0aWVkIHRoZSBwYWNrZXQsIHRoZW4gd2UgY2FuCi0JCQkJKiogZnJlZSBpdCwgYW5kIHJlc2V0IHRoZSBzdGFydCBwb2ludGVyIGZvcgotCQkJCSoqIHRoZSBuZXh0IHBhY2tldC4KLQkJCQkqLwotCSAgICAgIHJlbW92ZV9yZWNlaXZlKCBQb3J0UCApOwotCSAgICAgIHB1dF9mcmVlX2VuZCggUG9ydFAtPkhvc3RQLCBQYWNrZXRQICk7Ci0JICAgICAgUG9ydFAtPlJ4RGF0YVN0YXJ0ID0gMDsKKwkJCQkgKiogSWYgd2UgaGF2ZSBlbXB0aWVkIHRoZSBwYWNrZXQsIHRoZW4gd2UgY2FuCisJCQkJICoqIGZyZWUgaXQsIGFuZCByZXNldCB0aGUgc3RhcnQgcG9pbnRlciBmb3IKKwkJCQkgKiogdGhlIG5leHQgcGFja2V0LgorCQkJCSAqLworCQkJCXJlbW92ZV9yZWNlaXZlKFBvcnRQKTsKKwkJCQlwdXRfZnJlZV9lbmQoUG9ydFAtPkhvc3RQLCBQYWNrZXRQKTsKKwkJCQlQb3J0UC0+UnhEYXRhU3RhcnQgPSAwOwogI2lmZGVmIFNUQVRTCiAJCQkJLyoKLQkJCQkqKiBtb3JlIGxpZXMgKCBvb3BzLCBJIG1lYW4gc3RhdGlzdGljcyApCi0JCQkJKi8KLQkgICAgICBQb3J0UC0+U3RhdC5SeFBrdENudCsrOwotI2VuZGlmIC8qIFNUQVRTICovCi0JICAgIH0KKwkJCQkgKiogbW9yZSBsaWVzICggb29wcywgSSBtZWFuIHN0YXRpc3RpY3MgKQorCQkJCSAqLworCQkJCVBvcnRQLT5TdGF0LlJ4UGt0Q250Kys7CisjZW5kaWYJCQkJLyogU1RBVFMgKi8KKwkJCX0KKwkJfQogCX0KLSAgICB9Ci0gIGlmIChjb3BpZWQpIHsKLSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JFQywgInBvcnQgJWQ6IHB1c2hpbmcgdHR5IGZsaXAgYnVmZmVyOiAlZCB0b3RhbCBieXRlcyBjb3BpZWQuXG4iLCBQb3J0UC0+UG9ydE51bSwgY29waWVkKTsKLSAgICB0dHlfZmxpcF9idWZmZXJfcHVzaCAoVHR5UCk7Ci0gIH0KKwlpZiAoY29waWVkKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19SRUMsICJwb3J0ICVkOiBwdXNoaW5nIHR0eSBmbGlwIGJ1ZmZlcjogJWQgdG90YWwgYnl0ZXMgY29waWVkLlxuIiwgUG9ydFAtPlBvcnROdW0sIGNvcGllZCk7CisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKFR0eVApOworCX0KIAotICByZXR1cm47CisJcmV0dXJuOwogfQogCiAjaWZkZWYgRlVUVVJFX1JFTEVBU0UKQEAgLTczMSwyMjEgKzY5NiwyMTAgQEAKICoqIFRoZSBwcm9jIHJvdXRpbmUgY2FsbGVkIGJ5IHRoZSBsaW5lIGRpc2NpcGxpbmUgdG8gZG8gdGhlIHdvcmsgZm9yIGl0LgogKiogVGhlIHByb2Mgcm91dGluZSB3b3JrcyBoYW5kIGluIGhhbmQgd2l0aCB0aGUgaW50ZXJydXB0IHJvdXRpbmUuCiAqLwotaW50Ci1yaW90cHJvYyhwLCB0cCwgY21kLCBwb3J0KQotc3RydWN0IHJpb19pbmZvICoJcDsKK2ludCByaW90cHJvYyhwLCB0cCwgY21kLCBwb3J0KQorc3RydWN0IHJpb19pbmZvICpwOwogcmVnaXN0ZXIgc3RydWN0IHR0eXN0YXRpY3MgKnRwOwogaW50IGNtZDsKLWludAlwb3J0OworaW50IHBvcnQ7CiB7CiAJcmVnaXN0ZXIgc3RydWN0IFBvcnQgKlBvcnRQOwogCWludCBTeXNQb3J0OwogCXN0cnVjdCBQS1QgKlBhY2tldFA7CiAKLQlTeXNQb3J0ID0gcG9ydDsJLyogQmVsaWV2ZSBtZSwgaXQgd29ya3MuICovCisJU3lzUG9ydCA9IHBvcnQ7CQkvKiBCZWxpZXZlIG1lLCBpdCB3b3Jrcy4gKi8KIAotCWlmICggU3lzUG9ydCA8IDAgfHwgU3lzUG9ydCA+PSBSSU9fUE9SVFMgKSB7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIklsbGVnYWwgcG9ydCAlZCBkZXJpdmVkIGZyb20gVFRZIGluIHJpb3Rwcm9jKClcbiIsU3lzUG9ydCk7CisJaWYgKFN5c1BvcnQgPCAwIHx8IFN5c1BvcnQgPj0gUklPX1BPUlRTKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTlRSLCAiSWxsZWdhbCBwb3J0ICVkIGRlcml2ZWQgZnJvbSBUVFkgaW4gcmlvdHByb2MoKVxuIiwgU3lzUG9ydCk7CiAJCXJldHVybiAwOwogCX0KIAlQb3J0UCA9IHAtPlJJT1BvcnRwW1N5c1BvcnRdOwogCi0JaWYgKCh1aW50KVBvcnRQLT5QaGJQIDwgKHVpbnQpUG9ydFAtPkNhZGRyIHx8IAotCQkJKHVpbnQpUG9ydFAtPlBoYlAgPj0gKHVpbnQpUG9ydFAtPkNhZGRyK1NJWFRZX0ZPVVJfSyApIHsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiUklPOiBOVUxMIG9yIEJBRCBQaGJQIG9uIHN5cyBwb3J0ICVkIGluIHByb2Mgcm91dGluZVxuIiwKLQkJCQkJCQlTeXNQb3J0KTsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiCSBQb3J0UCA9IDB4JXhcbiIsUG9ydFApOwotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICIJIFBvcnRQLT5QaGJQID0gMHgleFxuIixQb3J0UC0+UGhiUCk7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIgkgUG9ydFAtPkNhZGRyID0gMHgleFxuIixQb3J0UC0+UGhiUCk7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIgkgUG9ydFAtPkhvc3RQb3J0ID0gMHgleFxuIixQb3J0UC0+SG9zdFBvcnQpOworCWlmICgodWludCkgUG9ydFAtPlBoYlAgPCAodWludCkgUG9ydFAtPkNhZGRyIHx8ICh1aW50KSBQb3J0UC0+UGhiUCA+PSAodWludCkgUG9ydFAtPkNhZGRyICsgU0lYVFlfRk9VUl9LKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTlRSLCAiUklPOiBOVUxMIG9yIEJBRCBQaGJQIG9uIHN5cyBwb3J0ICVkIGluIHByb2Mgcm91dGluZVxuIiwgU3lzUG9ydCk7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTlRSLCAiCSBQb3J0UCA9IDB4JXhcbiIsIFBvcnRQKTsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICIJIFBvcnRQLT5QaGJQID0gMHgleFxuIiwgUG9ydFAtPlBoYlApOworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5UUiwgIgkgUG9ydFAtPkNhZGRyID0gMHgleFxuIiwgUG9ydFAtPlBoYlApOworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5UUiwgIgkgUG9ydFAtPkhvc3RQb3J0ID0gMHgleFxuIiwgUG9ydFAtPkhvc3RQb3J0KTsKIAkJcmV0dXJuIDA7CiAJfQogCi0Jc3dpdGNoKGNtZCkgewotCQljYXNlIFRfV0ZMVVNIOgotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiVF9XRkxVU0hcbiIpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUX1dGTFVTSDoKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICJUX1dGTFVTSFxuIik7CisJCS8qCisJCSAqKiBCZWNhdXNlIG9mIHRoZSBzcG9va3kgd2F5IHRoZSBSSU8gd29ya3MsIHdlIGRvbid0IG5lZWQKKwkJICoqIHRvIGlzc3VlIGEgZmx1c2ggY29tbWFuZCBvbiBhbnkgb2YgdGhlIFNFVCpGIGNvbW1hbmRzLAorCQkgKiogYXMgdGhhdCBjYXVzZXMgdHJvdWJsZSB3aXRoIGdldHR5IGFuZCBsb2dpbiwgd2hpY2ggaXNzdWUKKwkJICoqIHRoZXNlIGNvbW1hbmRzIHRvIGluY3VyIGEgUkVBRCBmbHVzaCwgYW5kIHJlbHkgb24gdGhlIGZhY3QKKwkJICoqIHRoYXQgdGhlIGxpbmUgZGlzY2lwbGluZSBkb2VzIGEgd2FpdCBmb3IgZHJhaW4gZm9yIHRoZW0uCisJCSAqKiBBcyB0aGUgcmlvIGRvZXNuJ3Qgd2FpdCBmb3IgZHJhaW4sIHRoZSB3cml0ZSBmbHVzaCB3b3VsZAorCQkgKiogZGVzdHJveSB0aGUgUGFzc3dvcmQ6IHByb21wdC4gVGhpcyBpc24ndCB2ZXJ5IGZyaWVuZGx5LCBzbworCQkgKiogaGVyZSB3ZSBvbmx5IGlzc3VlIGEgV0ZMVVNIIGNvbW1hbmQgaWYgd2UgYXJlIGluIHRoZSBpbnRlcnJ1cHQKKwkJICoqIHJvdXRpbmUsIG9yIHdlIGFyZW4ndCBleGVjdXRpbmcgYSBTRVQqRiBjb21tYW5kLgorCQkgKi8KKwkJaWYgKFBvcnRQLT5Ib3N0UC0+SW5JbnRyIHx8ICFQb3J0UC0+Rmx1c2hDbWRCb2RnZSkgewogCQkJLyoKLQkJCSoqIEJlY2F1c2Ugb2YgdGhlIHNwb29reSB3YXkgdGhlIFJJTyB3b3Jrcywgd2UgZG9uJ3QgbmVlZAotCQkJKiogdG8gaXNzdWUgYSBmbHVzaCBjb21tYW5kIG9uIGFueSBvZiB0aGUgU0VUKkYgY29tbWFuZHMsCi0JCQkqKiBhcyB0aGF0IGNhdXNlcyB0cm91YmxlIHdpdGggZ2V0dHkgYW5kIGxvZ2luLCB3aGljaCBpc3N1ZQotCQkJKiogdGhlc2UgY29tbWFuZHMgdG8gaW5jdXIgYSBSRUFEIGZsdXNoLCBhbmQgcmVseSBvbiB0aGUgZmFjdAotCQkJKiogdGhhdCB0aGUgbGluZSBkaXNjaXBsaW5lIGRvZXMgYSB3YWl0IGZvciBkcmFpbiBmb3IgdGhlbS4KLQkJCSoqIEFzIHRoZSByaW8gZG9lc24ndCB3YWl0IGZvciBkcmFpbiwgdGhlIHdyaXRlIGZsdXNoIHdvdWxkCi0JCQkqKiBkZXN0cm95IHRoZSBQYXNzd29yZDogcHJvbXB0LiBUaGlzIGlzbid0IHZlcnkgZnJpZW5kbHksIHNvCi0JCQkqKiBoZXJlIHdlIG9ubHkgaXNzdWUgYSBXRkxVU0ggY29tbWFuZCBpZiB3ZSBhcmUgaW4gdGhlIGludGVycnVwdAotCQkJKiogcm91dGluZSwgb3Igd2UgYXJlbid0IGV4ZWN1dGluZyBhIFNFVCpGIGNvbW1hbmQuCi0JCQkqLwotCQkJaWYgKCBQb3J0UC0+SG9zdFAtPkluSW50ciB8fCAhUG9ydFAtPkZsdXNoQ21kQm9kZ2UgKSB7Ci0JCQkJLyoKLQkJCQkqKiBmb3JtIGEgd2ZsdXNoIHBhY2tldCAtIDEgYnl0ZSBsb25nLCBubyBkYXRhCi0JCQkJKi8KLQkJCQlpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgewotCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJXRkxVU0ggb24gZGVsZXRlZCBSVEFcbiIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKCBSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLCBXRkxVU0ggKSA9PSBSSU9fRkFJTCApIHsKLQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlRfV0ZMVVNIIENvbW1hbmQgZmFpbGVkXG4iKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1dGTFVTSCBDb21tYW5kXG4iKTsKLQkJCQl9Ci0JCQkJLyoKLQkJCQkqKiBXRkxVU0ggb3BlcmF0aW9uIC0gZmx1c2ggdGhlIGRhdGEhCi0JCQkJKi8KLQkJCQlQb3J0UC0+VHhCdWZmZXJJbiA9IFBvcnRQLT5UeEJ1ZmZlck91dCA9IDA7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1dGTFVTSCBDb21tYW5kIGlnbm9yZWRcbiIpOworCQkJICoqIGZvcm0gYSB3Zmx1c2ggcGFja2V0IC0gMSBieXRlIGxvbmcsIG5vIGRhdGEKKwkJCSAqLworCQkJaWYgKFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEKSB7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICJXRkxVU0ggb24gZGVsZXRlZCBSVEFcbiIpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgV0ZMVVNIKSA9PSBSSU9fRkFJTCkgeworCQkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5UUiwgIlRfV0ZMVVNIIENvbW1hbmQgZmFpbGVkXG4iKTsKKwkJCQl9IGVsc2UKKwkJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICJUX1dGTFVTSCBDb21tYW5kXG4iKTsKIAkJCX0KIAkJCS8qCi0JCQkqKiBzb3J0IG91dCB0aGUgbGluZSBkaXNjaXBsaW5lCi0JCQkqLwotCQkJaWYgKFBvcnRQLT5Db29rTW9kZSA9PSBDT09LX1dFTEwpCi0JCQkJZ290byBzdGFydDsKLQkJCWJyZWFrOwotCQotCQljYXNlIFRfUkVTVU1FOgotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiVF9SRVNVTUVcbiIpOwotCQkJLyoKLQkJCSoqIHNlbmQgcHJlLWVtcHRpdmUgcmVzdW1lIHBhY2tldAotCQkJKi8KLQkJCWlmICggUG9ydFAtPlN0YXRlICYgUklPX0RFTEVURUQgKSB7Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiUkVTVU1FIG9uIGRlbGV0ZWQgUlRBXG4iKTsKKwkJCSAqKiBXRkxVU0ggb3BlcmF0aW9uIC0gZmx1c2ggdGhlIGRhdGEhCisJCQkgKi8KKwkJCVBvcnRQLT5UeEJ1ZmZlckluID0gUG9ydFAtPlR4QnVmZmVyT3V0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTlRSLCAiVF9XRkxVU0ggQ29tbWFuZCBpZ25vcmVkXG4iKTsKKwkJfQorCQkvKgorCQkgKiogc29ydCBvdXQgdGhlIGxpbmUgZGlzY2lwbGluZQorCQkgKi8KKwkJaWYgKFBvcnRQLT5Db29rTW9kZSA9PSBDT09LX1dFTEwpCisJCQlnb3RvIHN0YXJ0OworCQlicmVhazsKKworCWNhc2UgVF9SRVNVTUU6CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTlRSLCAiVF9SRVNVTUVcbiIpOworCQkvKgorCQkgKiogc2VuZCBwcmUtZW1wdGl2ZSByZXN1bWUgcGFja2V0CisJCSAqLworCQlpZiAoUG9ydFAtPlN0YXRlICYgUklPX0RFTEVURUQpIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTlRSLCAiUkVTVU1FIG9uIGRlbGV0ZWQgUlRBXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLCBSRVNVTUUpID09IFJJT19GQUlMKSB7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICJUX1JFU1VNRSBDb21tYW5kIGZhaWxlZFxuIik7CiAJCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIFJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIFJFU1VNRSApID09IFJJT19GQUlMICkgewotCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1JFU1VNRSBDb21tYW5kIGZhaWxlZFxuIik7Ci0JCQkJfQorCQl9CisJCS8qCisJCSAqKiBhbmQgcmUtc3RhcnQgdGhlIHNlbmRlciBzb2Z0d2FyZSEKKwkJICovCisJCWlmIChQb3J0UC0+Q29va01vZGUgPT0gQ09PS19XRUxMKQorCQkJZ290byBzdGFydDsKKwkJYnJlYWs7CisKKwljYXNlIFRfVElNRToKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICJUX1RJTUVcbiIpOworCQkvKgorCQkgKiogVF9USU1FIGlzIGNhbGxlZCB3aGVuIHhETFkgaXMgc2V0IGluIG9mbGFncyBhbmQKKwkJICoqIHRoZSBsaW5lIGRpc2NpcGxpbmUgdGltZW91dCBoYXMgZXhwaXJlZC4gSXQncworCQkgKiogZnVuY3Rpb24gaW4gbGlmZSBpcyB0byBjbGVhciB0aGUgVElNRU9VVCBmbGFnCisJCSAqKiBhbmQgdG8gcmUtc3RhcnQgb3V0cHV0IHRvIHRoZSBwb3J0LgorCQkgKi8KKwkJLyoKKwkJICoqIEZhbGwgdGhyb3VnaCBhbmQgcmUtc3RhcnQgb3V0cHV0CisJCSAqLworCWNhc2UgVF9PVVRQVVQ6CisJICAgICAgc3RhcnQ6CisJCWlmIChQb3J0UC0+TWFnaWNGbGFncyAmIE1BR0lDX0ZMVVNIKSB7CisJCQlQb3J0UC0+TWFnaWNGbGFncyB8PSBNT1JFX09VVFBVVF9FWUdPUjsKKwkJCXJldHVybiAwOworCQl9CisJCVJJT1R4RW5hYmxlKChjaGFyICopIFBvcnRQKTsKKwkJUG9ydFAtPk1hZ2ljRmxhZ3MgJj0gfk1PUkVfT1VUUFVUX0VZR09SOworCQkvKnJpb19kcHJpbnQoUklPX0RFQlVHX0lOVFIsIFBvcnRQLERCR19QUk9DLCJUX09VVFBVVCBmaW5pc2hlZFxuIik7ICovCisJCWJyZWFrOworCisJY2FzZSBUX1NVU1BFTkQ6CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTlRSLCAiVF9TVVNQRU5EXG4iKTsKKwkJLyoKKwkJICoqIHNlbmQgYSBzdXNwZW5kIHByZS1lbXB0aXZlIHBhY2tldC4KKwkJICovCisJCWlmIChQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCkgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICJTVVNQRU5EIGRlbGV0ZWQgUlRBXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLCBTVVNQRU5EKSA9PSBSSU9fRkFJTCkgeworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTlRSLCAiVF9TVVNQRU5EIENvbW1hbmQgZmFpbGVkXG4iKTsKIAkJCX0KLQkJCS8qCi0JCQkqKiBhbmQgcmUtc3RhcnQgdGhlIHNlbmRlciBzb2Z0d2FyZSEKLQkJCSovCi0JCQlpZiAoUG9ydFAtPkNvb2tNb2RlID09IENPT0tfV0VMTCkKLQkJCQlnb3RvIHN0YXJ0OwotCQkJYnJlYWs7Ci0JCi0JCWNhc2UgVF9USU1FOgotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiVF9USU1FXG4iKTsKLQkJCS8qCi0JCQkqKiBUX1RJTUUgaXMgY2FsbGVkIHdoZW4geERMWSBpcyBzZXQgaW4gb2ZsYWdzIGFuZAotCQkJKiogdGhlIGxpbmUgZGlzY2lwbGluZSB0aW1lb3V0IGhhcyBleHBpcmVkLiBJdCdzCi0JCQkqKiBmdW5jdGlvbiBpbiBsaWZlIGlzIHRvIGNsZWFyIHRoZSBUSU1FT1VUIGZsYWcKLQkJCSoqIGFuZCB0byByZS1zdGFydCBvdXRwdXQgdG8gdGhlIHBvcnQuCi0JCQkqLwotCQkJLyoKLQkJCSoqIEZhbGwgdGhyb3VnaCBhbmQgcmUtc3RhcnQgb3V0cHV0Ci0JCQkqLwotCQljYXNlIFRfT1VUUFVUOgotc3RhcnQ6Ci0JCQlpZiAoIFBvcnRQLT5NYWdpY0ZsYWdzICYgTUFHSUNfRkxVU0ggKSB7Ci0JCQkJUG9ydFAtPk1hZ2ljRmxhZ3MgfD0gTU9SRV9PVVRQVVRfRVlHT1I7CisJCX0KKwkJLyoKKwkJICoqIGRvbmUhCisJCSAqLworCQlicmVhazsKKworCWNhc2UgVF9CTE9DSzoKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICJUX0JMT0NLXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIFRfUkZMVVNIOgorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5UUiwgIlRfUkZMVVNIXG4iKTsKKwkJaWYgKFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5UUiwgIlJGTFVTSCBvbiBkZWxldGVkIFJUQVxuIik7CisJCQlQb3J0UC0+UnhEYXRhU3RhcnQgPSAwOworCQl9IGVsc2UgeworCQkJaWYgKFJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIFJGTFVTSCkgPT0gUklPX0ZBSUwpIHsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5UUiwgIlRfUkZMVVNIIENvbW1hbmQgZmFpbGVkXG4iKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KLQkJCVJJT1R4RW5hYmxlKChjaGFyICopUG9ydFApOwotCQkJUG9ydFAtPk1hZ2ljRmxhZ3MgJj0gfk1PUkVfT1VUUFVUX0VZR09SOwotCQkJLypyaW9fZHByaW50KFJJT19ERUJVR19JTlRSLCBQb3J0UCxEQkdfUFJPQywiVF9PVVRQVVQgZmluaXNoZWRcbiIpOyovCi0JCQlicmVhazsKLQkKLQkJY2FzZSBUX1NVU1BFTkQ6Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1NVU1BFTkRcbiIpOwotCQkJLyoKLQkJCSoqIHNlbmQgYSBzdXNwZW5kIHByZS1lbXB0aXZlIHBhY2tldC4KLQkJCSovCi0JCQlpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgewotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlNVU1BFTkQgZGVsZXRlZCBSVEFcbiIpOworCQkJUG9ydFAtPlJ4RGF0YVN0YXJ0ID0gMDsKKwkJCXdoaWxlIChjYW5fcmVtb3ZlX3JlY2VpdmUoJlBhY2tldFAsIFBvcnRQKSkgeworCQkJCXJlbW92ZV9yZWNlaXZlKFBvcnRQKTsKKwkJCQlTaG93UGFja2V0KERCR19QUk9DLCBQYWNrZXRQKTsKKwkJCQlwdXRfZnJlZV9lbmQoUG9ydFAtPkhvc3RQLCBQYWNrZXRQKTsKIAkJCX0KLQkJCWVsc2UgewotCQkJCWlmICggUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgU1VTUEVORCApID09IFJJT19GQUlMICkgewotCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1NVU1BFTkQgQ29tbWFuZCBmYWlsZWRcbiIpOwotCQkJCX0KKwkJCWlmIChQb3J0UC0+UGhiUC0+aGFuZHNoYWtlID09IFBIQl9IQU5EU0hBS0VfU0VUKSB7CisJCQkJLyoKKwkJCQkgKiogTUFHSUMhCisJCQkJICovCisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICJTZXQgcmVjZWl2ZSBoYW5kc2hha2UgYml0XG4iKTsKKwkJCQlQb3J0UC0+UGhiUC0+aGFuZHNoYWtlIHw9IFBIQl9IQU5EU0hBS0VfUkVTRVQ7CiAJCQl9Ci0JCQkvKgotCQkJKiogZG9uZSEKLQkJCSovCi0JCQlicmVhazsKLQkKLQkJY2FzZSBUX0JMT0NLOgotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiVF9CTE9DS1xuIik7Ci0JCQlicmVhazsKLQkKLQkJY2FzZSBUX1JGTFVTSDoKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlRfUkZMVVNIXG4iKTsKLQkJCWlmICggUG9ydFAtPlN0YXRlICYgUklPX0RFTEVURUQgKSB7Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiUkZMVVNIIG9uIGRlbGV0ZWQgUlRBXG4iKTsKLQkJCQlQb3J0UC0+UnhEYXRhU3RhcnQgPSAwOworCQl9CisJCWJyZWFrOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgVF9VTkJMT0NLOgorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5UUiwgIlRfVU5CTE9DS1xuIik7CisJCS8qCisJCSAqKiBJZiB0aGVyZSBpcyBhbnkgZGF0YSB0byByZWNlaXZlIHNldCBhIHRpbWVvdXQgdG8gc2VydmljZSBpdC4KKwkJICovCisJCVJJT1JlY2VpdmUocCwgUG9ydFApOworCQlicmVhazsKKworCWNhc2UgVF9CUkVBSzoKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICJUX0JSRUFLXG4iKTsKKwkJLyoKKwkJICoqIFNlbmQgYSBicmVhayBjb21tYW5kLiBGb3IgU3lzIFYKKwkJICoqIHRoaXMgaXMgYSB0aW1lZCBicmVhaywgc28gd2UKKwkJICoqIHNlbmQgYSBTQlJFQUtbdGltZV0gcGFja2V0CisJCSAqLworCQkvKgorCQkgKiogQnVpbGQgYSBCUkVBSyBjb21tYW5kCisJCSAqLworCQlpZiAoUG9ydFAtPlN0YXRlICYgUklPX0RFTEVURUQpIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19JTlRSLCAiQlJFQUsgb24gZGVsZXRlZCBSVEFcbiIpOworCQl9IGVsc2UgeworCQkJaWYgKFJJT1Nob3J0Q29tbWFuZChQb3J0UCwgU0JSRUFLLCAyLCBwLT5SSU9Db25mLkJyZWFrSW50ZXJ2YWwpID09IFJJT19GQUlMKSB7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICJTQlJFQUsgUklPU2hvcnRDb21tYW5kIGZhaWxlZFxuIik7CiAJCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIFJJT1ByZWVtcHRpdmVDbWQoIHAsIFBvcnRQLCBSRkxVU0ggKSA9PSBSSU9fRkFJTCApIHsKLQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiVF9SRkxVU0ggQ29tbWFuZCBmYWlsZWRcbiIpOwotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQkJUG9ydFAtPlJ4RGF0YVN0YXJ0ID0gMDsKLQkJCQl3aGlsZSAoIGNhbl9yZW1vdmVfcmVjZWl2ZSgmUGFja2V0UCwgUG9ydFApICkgewotCQkJCQlyZW1vdmVfcmVjZWl2ZShQb3J0UCk7Ci0JCQkJCVNob3dQYWNrZXQoREJHX1BST0MsIFBhY2tldFAgKTsKLQkJCQkJcHV0X2ZyZWVfZW5kKFBvcnRQLT5Ib3N0UCwgUGFja2V0UCApOwotCQkJCX0KLQkJCQlpZiAoIFBvcnRQLT5QaGJQLT5oYW5kc2hha2UgPT0gUEhCX0hBTkRTSEFLRV9TRVQgKSB7Ci0JCQkJCS8qCi0JCQkJCSoqIE1BR0lDIQotCQkJCQkqLwotCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJTZXQgcmVjZWl2ZSBoYW5kc2hha2UgYml0XG4iKTsKLQkJCQkJUG9ydFAtPlBoYlAtPmhhbmRzaGFrZSB8PSBQSEJfSEFORFNIQUtFX1JFU0VUOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJY2FzZSBUX1VOQkxPQ0s6Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJUX1VOQkxPQ0tcbiIpOwotCQkJLyoKLQkJCSoqIElmIHRoZXJlIGlzIGFueSBkYXRhIHRvIHJlY2VpdmUgc2V0IGEgdGltZW91dCB0byBzZXJ2aWNlIGl0LgotCQkJKi8KLQkJCVJJT1JlY2VpdmUocCwgUG9ydFApOwotCQkJYnJlYWs7Ci0JCi0JCWNhc2UgVF9CUkVBSzoKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlRfQlJFQUtcbiIpOwotCQkJLyoKLQkJCSoqIFNlbmQgYSBicmVhayBjb21tYW5kLiBGb3IgU3lzIFYKLQkJCSoqIHRoaXMgaXMgYSB0aW1lZCBicmVhaywgc28gd2UKLQkJCSoqIHNlbmQgYSBTQlJFQUtbdGltZV0gcGFja2V0Ci0JCQkqLwotCQkJLyoKLQkJCSoqIEJ1aWxkIGEgQlJFQUsgY29tbWFuZAotCQkJKi8KLQkJCWlmICggUG9ydFAtPlN0YXRlICYgUklPX0RFTEVURUQgKSB7Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiQlJFQUsgb24gZGVsZXRlZCBSVEFcbiIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKFJJT1Nob3J0Q29tbWFuZChQb3J0UCxTQlJFQUssMiwKLQkJCQkJCQkJcC0+UklPQ29uZi5CcmVha0ludGVydmFsKT09UklPX0ZBSUwpIHsKLQkJCSAgIAkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiU0JSRUFLIFJJT1Nob3J0Q29tbWFuZCBmYWlsZWRcbiIpOwotCQkJCX0KLQkJCX0KLQkKLQkJCS8qCi0JCQkqKiBkb25lIQotCQkJKi8KLQkJCWJyZWFrOwotCQotCQljYXNlIFRfSU5QVVQ6Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX0lOVFIsICJQcm9jIFRfSU5QVVQgY2FsbGVkIC0gSSBkb24ndCBrbm93IHdoYXQgdG8gZG8hXG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIFRfUEFSTToKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlByb2MgVF9QQVJNIGNhbGxlZCAtIEkgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIVxuIik7Ci0JCQlicmVhazsKLQkKLQkJY2FzZSBUX1NXVENIOgotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTlRSLCAiUHJvYyBUX1NXVENIIGNhbGxlZCAtIEkgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIVxuIik7Ci0JCQlicmVhazsKLQkKLQkJZGVmYXVsdDoKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfSU5UUiwgIlByb2MgVU5LTk9XTiBjb21tYW5kICVkXG4iLGNtZCk7CisJCX0KKworCQkvKgorCQkgKiogZG9uZSEKKwkJICovCisJCWJyZWFrOworCisJY2FzZSBUX0lOUFVUOgorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5UUiwgIlByb2MgVF9JTlBVVCBjYWxsZWQgLSBJIGRvbid0IGtub3cgd2hhdCB0byBkbyFcbiIpOworCQlicmVhazsKKwljYXNlIFRfUEFSTToKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICJQcm9jIFRfUEFSTSBjYWxsZWQgLSBJIGRvbid0IGtub3cgd2hhdCB0byBkbyFcbiIpOworCQlicmVhazsKKworCWNhc2UgVF9TV1RDSDoKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX0lOVFIsICJQcm9jIFRfU1dUQ0ggY2FsbGVkIC0gSSBkb24ndCBrbm93IHdoYXQgdG8gZG8hXG4iKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfSU5UUiwgIlByb2MgVU5LTk9XTiBjb21tYW5kICVkXG4iLCBjbWQpOwogCX0KIAkvKgotCSoqIFRfT1VUUFVUIHJldHVybnMgd2l0aG91dCBwYXNzaW5nIHRocm91Z2ggdGhpcyBwb2ludCEKLQkqLwotCS8qcmlvX2RwcmludChSSU9fREVCVUdfSU5UUiwgUG9ydFAsREJHX1BST0MsInJpb3Rwcm9jIGRvbmVcbiIpOyovCi0JcmV0dXJuKDApOworCSAqKiBUX09VVFBVVCByZXR1cm5zIHdpdGhvdXQgcGFzc2luZyB0aHJvdWdoIHRoaXMgcG9pbnQhCisJICovCisJLypyaW9fZHByaW50KFJJT19ERUJVR19JTlRSLCBQb3J0UCxEQkdfUFJPQywicmlvdHByb2MgZG9uZVxuIik7ICovCisJcmV0dXJuICgwKTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9pb2N0bC5oIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9pb2N0bC5oCmluZGV4IGMzZDY3OTcuLjE0YjgzZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vcmlvaW9jdGwuaAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2lvY3RsLmgKQEAgLTQyLDE0ICs0MiwxNCBAQAogKi8KIAogc3RydWN0IHBvcnRTdGF0cyB7Ci0JaW50CXBvcnQ7Ci0JaW50CWdhdGhlcjsKLQl1bG9uZwl0eGNoYXJzOwotCXVsb25nCXJ4Y2hhcnM7Ci0JdWxvbmcJb3BlbnM7Ci0JdWxvbmcJY2xvc2VzOwotCXVsb25nCWlvY3RsczsKLX07IAorCWludCBwb3J0OworCWludCBnYXRoZXI7CisJdWxvbmcgdHhjaGFyczsKKwl1bG9uZyByeGNoYXJzOworCXVsb25nIG9wZW5zOworCXVsb25nIGNsb3NlczsKKwl1bG9uZyBpb2N0bHM7Cit9OwogCiAKICNkZWZpbmUgcklPQwkoJ3InPDw4KQpAQCAtMTAwLDQgKzEwMCw0IEBACiAjZGVmaW5lIFJJT19SRVNFVF9QT1JUX1NUQVRTCShSSU9DIHwgMTk0KQogI2RlZmluZSBSSU9fR0VUX1BPUlRfU1RBVFMJKFJJT0MgfCAxOTUpCiAKLSNlbmRpZgkvKiBfX3Jpb2lvY3RsX2hfXyAqLworI2VuZGlmCQkJCS8qIF9fcmlvaW9jdGxfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2xvY2tzLmggYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2xvY2tzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMGNkYWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9yaW9sb2Nrcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qKgotKiogIFBlcmxlIFNwZWNpYWxpeCBkcml2ZXIgZm9yIExpbnV4Ci0qKiAgUG9ydGVkIGZyb20gZXhpc3RpbmcgUklPIERyaXZlciBmb3IgU0NPIHNvdXJjZXMuCi0gKgotICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSoqCi0qKglNb2R1bGUJCTogcmlvbG9ja3MuaAotKioJU0lECQk6IDEuMgotKioJTGFzdCBNb2RpZmllZAk6IDExLzYvOTggMTE6MzQ6MTMKLSoqCVJldHJpZXZlZAk6IDExLzYvOTggMTE6MzQ6MjIKLSoqCi0qKiAgaWRlbnQgQCgjKXJpb2xvY2tzLmgJMS4yCi0qKgotKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpZm5kZWYJX19yaW9fcmlvbG9ja3NfaF9fCi0jZGVmaW5lCV9fcmlvX3Jpb2xvY2tzX2hfXwotCi0jaWZkZWYgU0NDU19MQUJFTFMKLXN0YXRpYyBjaGFyICpfcmlvbG9ja3NfaF9zY2NzXyA9ICJAKCMpcmlvbG9ja3MuaAkxLjIiOwotI2VuZGlmCi0KLSNkZWZpbmUgTE9DS0IobGspCQlsb2NrYihsayk7Ci0jZGVmaW5lIFVOTE9DS0IobGssIG9sZHNwbCkJdW5sb2NrYihsaywgb2xkc3BsKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb3BhcmFtLmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3BhcmFtLmMKaW5kZXggZjEwOTE2My4uYzYyMmY0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9yaW9wYXJhbS5jCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvcGFyYW0uYwpAQCAtMTU3LDI5NSArMTU3LDI1MyBAQAogKiogTkIuIGZvciBNUFgKICoqCXR0eSBsb2NrIG11c3QgTk9UIGhhdmUgYmVlbiBwcmV2aW91c2x5IGFjcXVpcmVkLgogKi8KLWludAotUklPUGFyYW0oUG9ydFAsIGNtZCwgTW9kZW0sIFNsZWVwRmxhZykKK2ludCBSSU9QYXJhbShQb3J0UCwgY21kLCBNb2RlbSwgU2xlZXBGbGFnKQogc3RydWN0IFBvcnQgKlBvcnRQOwogaW50IGNtZDsKIGludCBNb2RlbTsKLWludCBTbGVlcEZsYWc7IAoraW50IFNsZWVwRmxhZzsKIHsKIAlyZWdpc3RlciBzdHJ1Y3QgdHR5X3N0cnVjdCAqVHR5UDsKLQlpbnQJcmV0dmFsOworCWludCByZXR2YWw7CiAJcmVnaXN0ZXIgc3RydWN0IHBoYl9wYXJhbSAqcGhiX3BhcmFtX3B0cjsKIAlQS1QgKlBhY2tldFA7CiAJaW50IHJlczsKLQl1Y2hhciBDb3IxPTAsIENvcjI9MCwgQ29yND0wLCBDb3I1PTA7Ci0JdWNoYXIgVHhYb249MCwgVHhYb2ZmPTAsIFJ4WG9uPTAsIFJ4WG9mZj0wOwotCXVjaGFyIExOZXh0PTAsIFR4QmF1ZD0wLCBSeEJhdWQ9MDsKLQlpbnQJCXJldHJpZXMgPSAweGZmOworCXVjaGFyIENvcjEgPSAwLCBDb3IyID0gMCwgQ29yNCA9IDAsIENvcjUgPSAwOworCXVjaGFyIFR4WG9uID0gMCwgVHhYb2ZmID0gMCwgUnhYb24gPSAwLCBSeFhvZmYgPSAwOworCXVjaGFyIExOZXh0ID0gMCwgVHhCYXVkID0gMCwgUnhCYXVkID0gMDsKKwlpbnQgcmV0cmllcyA9IDB4ZmY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWZ1bmNfZW50ZXIgKCk7CisJZnVuY19lbnRlcigpOwogCiAJVHR5UCA9IFBvcnRQLT5ncy50dHk7CiAKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiUklPUGFyYW06IFBvcnQ6JWQgY21kOiVkIE1vZGVtOiVkIFNsZWVwRmxhZzolZCBNYXBwZWQ6ICVkLCB0dHk9JXBcbiIsCi0JICAgIFBvcnRQLT5Qb3J0TnVtLCBjbWQsIE1vZGVtLCBTbGVlcEZsYWcsIFBvcnRQLT5NYXBwZWQsIFR0eVApOworCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIlJJT1BhcmFtOiBQb3J0OiVkIGNtZDolZCBNb2RlbTolZCBTbGVlcEZsYWc6JWQgTWFwcGVkOiAlZCwgdHR5PSVwXG4iLCBQb3J0UC0+UG9ydE51bSwgY21kLCBNb2RlbSwgU2xlZXBGbGFnLCBQb3J0UC0+TWFwcGVkLCBUdHlQKTsKIAogCWlmICghVHR5UCkgewotCSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkNhbid0IGNhbGwgcmlvcGFyYW0gd2l0aCBudWxsIHR0eS5cbiIpOworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICJDYW4ndCBjYWxsIHJpb3BhcmFtIHdpdGggbnVsbCB0dHkuXG4iKTsKIAotCSAgZnVuY19leGl0ICgpOworCQlmdW5jX2V4aXQoKTsKIAotCSAgcmV0dXJuIFJJT19GQUlMOworCQlyZXR1cm4gUklPX0ZBSUw7CiAJfQotCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzICk7CisJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwogCiAJaWYgKGNtZCA9PSBPUEVOKSB7CiAJCS8qCi0JCSoqIElmIHRoZSBwb3J0IGlzIHNldCB0byBzdG9yZSBvciBsb2NrIHRoZSBwYXJhbWV0ZXJzLCBhbmQgaXQgaXMKLQkJKiogcGFyYW1lZCB3aXRoIE9QRU4sIHdlIHdhbnQgdG8gcmVzdG9yZSB0aGUgc2F2ZWQgcG9ydCB0ZXJtaW8sIGJ1dAotCQkqKiBvbmx5IGlmIFN0b3JlZFRlcm1pbyBoYXMgYmVlbiBzYXZlZCwgaS5lLiBOT1QgMXN0IG9wZW4gYWZ0ZXIgcmVib290LgotCQkqLwotI2lmIDAKLQkJaWYgKFBvcnRQLT5GaXJzdE9wZW4pIHsKLQkJCVBvcnRQLT5TdG9yZWRUdHkuaWZsYWcgPSBUdHlQLT50bS5jX2lmbGFnOwotCQkJUG9ydFAtPlN0b3JlZFR0eS5vZmxhZyA9IFR0eVAtPnRtLmNfb2ZsYWc7Ci0JCQlQb3J0UC0+U3RvcmVkVHR5LmNmbGFnID0gVHR5UC0+dG0uY19jZmxhZzsKLQkJCVBvcnRQLT5TdG9yZWRUdHkubGZsYWcgPSBUdHlQLT50bS5jX2xmbGFnOwotCQkJUG9ydFAtPlN0b3JlZFR0eS5saW5lID0gVHR5UC0+dG0uY19saW5lOwotCQkJZm9yIChpID0gMDsgaSA8IE5DQyArIDU7IGkrKykKLQkJCQlQb3J0UC0+U3RvcmVkVHR5LmNjW2ldID0gVHR5UC0+dG0uY19jY1tpXTsKLQkJCVBvcnRQLT5GaXJzdE9wZW4gPSAwOwotCQl9Ci0JCWVsc2UgaWYgKFBvcnRQLT5TdG9yZSB8fCBQb3J0UC0+TG9jaykgewotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIk9QRU46IFJlc3RvcmluZyBzdG9yZWQvbG9ja2VkIHBhcmFtc1xuIik7Ci0JCQlUdHlQLT50bS5jX2lmbGFnID0gUG9ydFAtPlN0b3JlZFR0eS5pZmxhZzsKLQkJCVR0eVAtPnRtLmNfb2ZsYWcgPSBQb3J0UC0+U3RvcmVkVHR5Lm9mbGFnOwotCQkJVHR5UC0+dG0uY19jZmxhZyA9IFBvcnRQLT5TdG9yZWRUdHkuY2ZsYWc7Ci0JCQlUdHlQLT50bS5jX2xmbGFnID0gUG9ydFAtPlN0b3JlZFR0eS5sZmxhZzsKLQkJCVR0eVAtPnRtLmNfbGluZSA9IFBvcnRQLT5TdG9yZWRUdHkubGluZTsKLQkJCWZvciAoaSA9IDA7IGkgPCBOQ0MgKyA1OyBpKyspCi0JCQkJVHR5UC0+dG0uY19jY1tpXSA9IFBvcnRQLT5TdG9yZWRUdHkuY2NbaV07Ci0JCX0KLSNlbmRpZgorCQkgKiogSWYgdGhlIHBvcnQgaXMgc2V0IHRvIHN0b3JlIG9yIGxvY2sgdGhlIHBhcmFtZXRlcnMsIGFuZCBpdCBpcworCQkgKiogcGFyYW1lZCB3aXRoIE9QRU4sIHdlIHdhbnQgdG8gcmVzdG9yZSB0aGUgc2F2ZWQgcG9ydCB0ZXJtaW8sIGJ1dAorCQkgKiogb25seSBpZiBTdG9yZWRUZXJtaW8gaGFzIGJlZW4gc2F2ZWQsIGkuZS4gTk9UIDFzdCBvcGVuIGFmdGVyIHJlYm9vdC4KKwkJICovCiAJfQogCiAJLyoKLQkqKiB3YWl0IGZvciBzcGFjZQotCSovCi0Jd2hpbGUgKCAhKHJlcz1jYW5fYWRkX3RyYW5zbWl0KCZQYWNrZXRQLFBvcnRQKSkgfHwgCi0JCQkoUG9ydFAtPkluVXNlICE9IE5PVF9JTlVTRSkgKSB7Ci0JCWlmIChyZXRyaWVzIC0tIDw9IDApIHsKKwkgKiogd2FpdCBmb3Igc3BhY2UKKwkgKi8KKwl3aGlsZSAoIShyZXMgPSBjYW5fYWRkX3RyYW5zbWl0KCZQYWNrZXRQLCBQb3J0UCkpIHx8IChQb3J0UC0+SW5Vc2UgIT0gTk9UX0lOVVNFKSkgeworCQlpZiAocmV0cmllcy0tIDw9IDApIHsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmICggUG9ydFAtPkluVXNlICE9IE5PVF9JTlVTRSApIHsKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJQb3J0IElOX1VTRSBmb3IgcHJlLWVtcHRpdmUgY29tbWFuZFxuIik7CisJCWlmIChQb3J0UC0+SW5Vc2UgIT0gTk9UX0lOVVNFKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICJQb3J0IElOX1VTRSBmb3IgcHJlLWVtcHRpdmUgY29tbWFuZFxuIik7CiAJCX0KIAotCQlpZiAoICFyZXMgKSB7Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiUG9ydCBoYXMgbm8gc3BhY2Ugb24gdHJhbnNtaXQgcXVldWVcbiIpOworCQlpZiAoIXJlcykgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiUG9ydCBoYXMgbm8gc3BhY2Ugb24gdHJhbnNtaXQgcXVldWVcbiIpOwogCQl9CiAKLQkJaWYgKCBTbGVlcEZsYWcgIT0gT0tfVE9fU0xFRVAgKSB7Ci0JCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCWlmIChTbGVlcEZsYWcgIT0gT0tfVE9fU0xFRVApIHsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwogCQkJZnVuY19leGl0KCk7Ci0JCQkKKwogCQkJcmV0dXJuIFJJT19GQUlMOwogCQl9CiAKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIndhaXQgZm9yIGNhbl9hZGRfdHJhbnNtaXRcbiIpOwotCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIndhaXQgZm9yIGNhbl9hZGRfdHJhbnNtaXRcbiIpOworCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKIAkJcmV0dmFsID0gUklPRGVsYXkoUG9ydFAsIEhVTkRSRURfTVMpOwotCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoICZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CiAJCWlmIChyZXR2YWwgPT0gUklPX0ZBSUwpIHsKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJ3YWl0IGZvciBjYW5fYWRkX3RyYW5zbWl0IGJyb2tlbiBieSBzaWduYWxcbiIpOwotCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAid2FpdCBmb3IgY2FuX2FkZF90cmFuc21pdCBicm9rZW4gYnkgc2lnbmFsXG4iKTsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwogCQkJcHNldGVycihFSU5UUik7CiAJCQlmdW5jX2V4aXQoKTsKIAogCQkJcmV0dXJuIFJJT19GQUlMOwogCQl9Ci0JCWlmICggUG9ydFAtPlN0YXRlICYgUklPX0RFTEVURUQgKSB7Ci0JCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JCQlmdW5jX2V4aXQgKCk7CisJCWlmIChQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCkgeworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlmdW5jX2V4aXQoKTsKIAogCQkJcmV0dXJuIFJJT19TVUNDRVNTOwogCQl9CiAJfQogCiAJaWYgKCFyZXMpIHsKLQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwotCQlmdW5jX2V4aXQgKCk7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlmdW5jX2V4aXQoKTsKIAogCQlyZXR1cm4gUklPX0ZBSUw7CiAJfQogCi0JcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgImNhbl9hZGRfdHJhbnNtaXQoKSByZXR1cm5zICV4XG4iLHJlcyk7Ci0JcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlBhY2tldCBpcyAweCV4XG4iLChpbnQpIFBhY2tldFApOworCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgImNhbl9hZGRfdHJhbnNtaXQoKSByZXR1cm5zICV4XG4iLCByZXMpOworCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIlBhY2tldCBpcyAweCV4XG4iLCAoaW50KSBQYWNrZXRQKTsKIAotCXBoYl9wYXJhbV9wdHIgPSAoc3RydWN0IHBoYl9wYXJhbSAqKVBhY2tldFAtPmRhdGE7CisJcGhiX3BhcmFtX3B0ciA9IChzdHJ1Y3QgcGhiX3BhcmFtICopIFBhY2tldFAtPmRhdGE7CiAKIAotI2lmIDAKLQkvKgotCSoqIENPUiAxCi0JKi8KLQlpZiAoIFR0eVAtPnRtLmNfaWZsYWcgJiBJTlBDSyApIHsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlBhcml0eSBjaGVja2luZyBvbiBpbnB1dCBlbmFibGVkXG4iKTsKLQkJQ29yMSB8PSBDT1IxX0lOUENLOwotCX0KLSNlbmRpZgotCi0Jc3dpdGNoICggVHR5UC0+dGVybWlvcy0+Y19jZmxhZyAmIENTSVpFICkgewotCQljYXNlIENTNToKKwlzd2l0Y2ggKFR0eVAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBDU0laRSkgeworCWNhc2UgQ1M1OgogCQl7Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiNSBiaXQgZGF0YVxuIik7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICI1IGJpdCBkYXRhXG4iKTsKIAkJCUNvcjEgfD0gQ09SMV81QklUUzsKIAkJCWJyZWFrOwogCQl9Ci0JCWNhc2UgQ1M2OgorCWNhc2UgQ1M2OgogCQl7Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiNiBiaXQgZGF0YVxuIik7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICI2IGJpdCBkYXRhXG4iKTsKIAkJCUNvcjEgfD0gQ09SMV82QklUUzsKIAkJCWJyZWFrOwogCQl9Ci0JCWNhc2UgQ1M3OgorCWNhc2UgQ1M3OgogCQl7Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiNyBiaXQgZGF0YVxuIik7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICI3IGJpdCBkYXRhXG4iKTsKIAkJCUNvcjEgfD0gQ09SMV83QklUUzsKIAkJCWJyZWFrOwogCQl9Ci0JCWNhc2UgQ1M4OgorCWNhc2UgQ1M4OgogCQl7Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiOCBiaXQgZGF0YVxuIik7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICI4IGJpdCBkYXRhXG4iKTsKIAkJCUNvcjEgfD0gQ09SMV84QklUUzsKIAkJCWJyZWFrOwogCQl9CiAJfQogCi0JaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgQ1NUT1BCICkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiMiBzdG9wIGJpdHNcbiIpOworCWlmIChUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgQ1NUT1BCKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIjIgc3RvcCBiaXRzXG4iKTsKIAkJQ29yMSB8PSBDT1IxXzJTVE9QOwotCX0KLQllbHNlIHsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIjEgc3RvcCBiaXRcbiIpOworCX0gZWxzZSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIjEgc3RvcCBiaXRcbiIpOwogCQlDb3IxIHw9IENPUjFfMVNUT1A7CiAJfQogCi0JaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgUEFSRU5CICkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIHBhcml0eVxuIik7CisJaWYgKFR0eVAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJFTkIpIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIHBhcml0eVxuIik7CiAJCUNvcjEgfD0gQ09SMV9OT1JNQUw7Ci0JfQotCWVsc2UgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRGlzYWJsZSBwYXJpdHlcbiIpOworCX0gZWxzZSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIkRpc2FibGUgcGFyaXR5XG4iKTsKIAkJQ29yMSB8PSBDT1IxX05PUDsKIAl9Ci0JaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgUEFST0REICkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiT2RkIHBhcml0eVxuIik7CisJaWYgKFR0eVAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJPREQpIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiT2RkIHBhcml0eVxuIik7CiAJCUNvcjEgfD0gQ09SMV9PREQ7Ci0JfQotCWVsc2UgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRXZlbiBwYXJpdHlcbiIpOwotCQlDb3IxIHw9IENPUjFfRVZFTjsgCisJfSBlbHNlIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiRXZlbiBwYXJpdHlcbiIpOworCQlDb3IxIHw9IENPUjFfRVZFTjsKIAl9CiAKIAkvKgotCSoqIENPUiAyCi0JKi8KLQlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBJWE9OICkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIHN0YXJ0L3N0b3Agb3V0cHV0IGNvbnRyb2xcbiIpOworCSAqKiBDT1IgMgorCSAqLworCWlmIChUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgSVhPTikgeworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICJFbmFibGUgc3RhcnQvc3RvcCBvdXRwdXQgY29udHJvbFxuIik7CiAJCUNvcjIgfD0gQ09SMl9JWE9OOwotCX0KLQllbHNlIHsKLQkJaWYgKCBQb3J0UC0+Q29uZmlnICYgUklPX0lYT04gKSB7Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRm9yY2UgZW5hYmxlIHN0YXJ0L3N0b3Agb3V0cHV0IGNvbnRyb2xcbiIpOworCX0gZWxzZSB7CisJCWlmIChQb3J0UC0+Q29uZmlnICYgUklPX0lYT04pIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIkZvcmNlIGVuYWJsZSBzdGFydC9zdG9wIG91dHB1dCBjb250cm9sXG4iKTsKIAkJCUNvcjIgfD0gQ09SMl9JWE9OOwotCQl9Ci0JCWVsc2UKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJJWE9OIGhhcyBiZWVuIGRpc2FibGVkLlxuIik7CisJCX0gZWxzZQorCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiSVhPTiBoYXMgYmVlbiBkaXNhYmxlZC5cbiIpOwogCX0KIAogCWlmIChUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgSVhBTlkpIHsKLQkJaWYgKCBQb3J0UC0+Q29uZmlnICYgUklPX0lYQU5ZICkgewotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkVuYWJsZSBhbnkga2V5IHRvIHJlc3RhcnQgb3V0cHV0XG4iKTsKKwkJaWYgKFBvcnRQLT5Db25maWcgJiBSSU9fSVhBTlkpIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIkVuYWJsZSBhbnkga2V5IHRvIHJlc3RhcnQgb3V0cHV0XG4iKTsKIAkJCUNvcjIgfD0gQ09SMl9JWEFOWTsKLQkJfQotCQllbHNlCi0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiSVhBTlkgaGFzIGJlZW4gZGlzYWJsZWQgZHVlIHRvIHNhbml0eSByZWFzb25zLlxuIik7CisJCX0gZWxzZQorCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiSVhBTlkgaGFzIGJlZW4gZGlzYWJsZWQgZHVlIHRvIHNhbml0eSByZWFzb25zLlxuIik7CiAJfQogCi0JaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgSVhPRkYgKSB7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJFbmFibGUgc3RhcnQvc3RvcCBpbnB1dCBjb250cm9sIDJcbiIpOworCWlmIChUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgSVhPRkYpIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIHN0YXJ0L3N0b3AgaW5wdXQgY29udHJvbCAyXG4iKTsKIAkJQ29yMiB8PSBDT1IyX0lYT0ZGOwogCX0KIAotCWlmICggVHR5UC0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMICkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiSGFuZ3VwIG9uIGxhc3QgY2xvc2VcbiIpOworCWlmIChUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiSGFuZ3VwIG9uIGxhc3QgY2xvc2VcbiIpOwogCQlDb3IyIHw9IENPUjJfSFVQQ0w7CiAJfQogCi0JaWYgKCBDX0NSVFNDVFMgKFR0eVApKSB7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJSeCBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZW5hYmxlZFxuIik7CisJaWYgKENfQ1JUU0NUUyhUdHlQKSkgeworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICJSeCBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZW5hYmxlZFxuIik7CiAJCUNvcjIgfD0gQ09SMl9DVFNGTE9XOwogCQlDb3IyIHw9IENPUjJfUlRTRkxPVzsKIAl9IGVsc2UgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiUnggaGFyZHdhcmUgZmxvdyBjb250cm9sIGRpc2FibGVkXG4iKTsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiUnggaGFyZHdhcmUgZmxvdyBjb250cm9sIGRpc2FibGVkXG4iKTsKIAkJQ29yMiAmPSB+Q09SMl9DVFNGTE9XOwogCQlDb3IyICY9IH5DT1IyX1JUU0ZMT1c7CiAJfQogCiAKLQlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwgKSB7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJMb2NhbCBsaW5lXG4iKTsKLQl9Ci0JZWxzZSB7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJQb3NzaWJsZSBNb2RlbSBsaW5lXG4iKTsKKwlpZiAoVHR5UC0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkgeworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICJMb2NhbCBsaW5lXG4iKTsKKwl9IGVsc2UgeworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICJQb3NzaWJsZSBNb2RlbSBsaW5lXG4iKTsKIAl9CiAKIAkvKgotCSoqIENPUiA0ICh0aGVyZSBpcyBubyBDT1IgMykKLQkqLwotCWlmICggVHR5UC0+dGVybWlvcy0+Y19pZmxhZyAmIElHTkJSSyApIHsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIklnbm9yZSBicmVhayBjb25kaXRpb25cbiIpOworCSAqKiBDT1IgNCAodGhlcmUgaXMgbm8gQ09SIDMpCisJICovCisJaWYgKFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBJR05CUkspIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiSWdub3JlIGJyZWFrIGNvbmRpdGlvblxuIik7CiAJCUNvcjQgfD0gQ09SNF9JR05CUks7CiAJfQotCWlmICggIShUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgQlJLSU5UKSApIHsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkJyZWFrIGdlbmVyYXRlcyBOVUxMIGNvbmRpdGlvblxuIik7CisJaWYgKCEoVHR5UC0+dGVybWlvcy0+Y19pZmxhZyAmIEJSS0lOVCkpIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiQnJlYWsgZ2VuZXJhdGVzIE5VTEwgY29uZGl0aW9uXG4iKTsKIAkJQ29yNCB8PSBDT1I0X05CUktJTlQ7CiAJfSBlbHNlIHsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkludGVycnVwdCBvbglicmVhayBjb25kaXRpb25cbiIpOworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICJJbnRlcnJ1cHQgb24JYnJlYWsgY29uZGl0aW9uXG4iKTsKIAl9CiAKLQlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBJTkxDUiApIHsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIk1hcCBuZXdsaW5lIHRvIGNhcnJpYWdlIHJldHVybiBvbiBpbnB1dFxuIik7CisJaWYgKFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBJTkxDUikgeworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICJNYXAgbmV3bGluZSB0byBjYXJyaWFnZSByZXR1cm4gb24gaW5wdXRcbiIpOwogCQlDb3I0IHw9IENPUjRfSU5MQ1I7CiAJfQogCi0JaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgSUdOQ1IgKSB7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJJZ25vcmUgY2FycmlhZ2UgcmV0dXJuIG9uIGlucHV0XG4iKTsKKwlpZiAoVHR5UC0+dGVybWlvcy0+Y19pZmxhZyAmIElHTkNSKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIklnbm9yZSBjYXJyaWFnZSByZXR1cm4gb24gaW5wdXRcbiIpOwogCQlDb3I0IHw9IENPUjRfSUdOQ1I7CiAJfQogCi0JaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgSUNSTkwgKSB7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJNYXAgY2FycmlhZ2UgcmV0dXJuIHRvIG5ld2xpbmUgb24gaW5wdXRcbiIpOworCWlmIChUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgSUNSTkwpIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiTWFwIGNhcnJpYWdlIHJldHVybiB0byBuZXdsaW5lIG9uIGlucHV0XG4iKTsKIAkJQ29yNCB8PSBDT1I0X0lDUk5MOwogCX0KLQlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBJR05QQVIgKSB7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJJZ25vcmUgY2hhcmFjdGVycyB3aXRoIHBhcml0eSBlcnJvcnNcbiIpOworCWlmIChUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgSUdOUEFSKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIklnbm9yZSBjaGFyYWN0ZXJzIHdpdGggcGFyaXR5IGVycm9yc1xuIik7CiAJCUNvcjQgfD0gQ09SNF9JR05QQVI7CiAJfQotCWlmICggVHR5UC0+dGVybWlvcy0+Y19pZmxhZyAmIFBBUk1SSyApIHsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIk1hcmsgcGFyaXR5IGVycm9yc1xuIik7CisJaWYgKFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBQQVJNUkspIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiTWFyayBwYXJpdHkgZXJyb3JzXG4iKTsKIAkJQ29yNCB8PSBDT1I0X1BBUk1SSzsKIAl9CiAKIAkvKgotCSoqIFNldCB0aGUgUkFJU0VNT0QgZmxhZyB0byBlbnN1cmUgdGhhdCB0aGUgbW9kZW0gbGluZXMgYXJlIHJhaXNlZAotCSoqIG9uIHJlY2VwdGlvbiBvZiBhIGNvbmZpZyBwYWNrZXQuCi0JKiogVGhlIGRvd25sb2FkIGNvZGUgaGFuZGxlcyB0aGUgemVybyBiYXVkIGNvbmRpdGlvbi4KLQkqLworCSAqKiBTZXQgdGhlIFJBSVNFTU9EIGZsYWcgdG8gZW5zdXJlIHRoYXQgdGhlIG1vZGVtIGxpbmVzIGFyZSByYWlzZWQKKwkgKiogb24gcmVjZXB0aW9uIG9mIGEgY29uZmlnIHBhY2tldC4KKwkgKiogVGhlIGRvd25sb2FkIGNvZGUgaGFuZGxlcyB0aGUgemVybyBiYXVkIGNvbmRpdGlvbi4KKwkgKi8KIAlDb3I0IHw9IENPUjRfUkFJU0VNT0Q7CiAKIAkvKgotCSoqIENPUiA1Ci0JKi8KKwkgKiogQ09SIDUKKwkgKi8KIAogCUNvcjUgPSBDT1I1X0NNT0U7CiAKIAkvKgotCSoqIFNldCB0byBtb25pdG9yIHRidXN5L3RzdG9wIChvciBub3QpLgotCSovCisJICoqIFNldCB0byBtb25pdG9yIHRidXN5L3RzdG9wIChvciBub3QpLgorCSAqLwogCiAJaWYgKFBvcnRQLT5Nb25pdG9yVHN0YXRlKQogCQlDb3I1IHw9IENPUjVfVFNUQVRFX09OOwpAQCAtNDUzLDE4MiArNDExLDE4MyBAQAogCQlDb3I1IHw9IENPUjVfVFNUQVRFX09GRjsKIAogCS8qCi0JKiogQ291bGQgc2V0IExORSBoZXJlIGlmIHlvdSB3YW50ZWQgTE5leHQgcHJvY2Vzc2luZy4gU1ZSNCB3aWxsIHVzZSBpdC4KLQkqLwotCWlmICggVHR5UC0+dGVybWlvcy0+Y19pZmxhZyAmIElTVFJJUCApIHsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlN0cmlwIGlucHV0IGNoYXJhY3RlcnNcbiIpOwotCQlpZiAoISAoUG9ydFAtPlN0YXRlICYgUklPX1RSSUFEX01PREUpKSB7CisJICoqIENvdWxkIHNldCBMTkUgaGVyZSBpZiB5b3Ugd2FudGVkIExOZXh0IHByb2Nlc3NpbmcuIFNWUjQgd2lsbCB1c2UgaXQuCisJICovCisJaWYgKFR0eVAtPnRlcm1pb3MtPmNfaWZsYWcgJiBJU1RSSVApIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiU3RyaXAgaW5wdXQgY2hhcmFjdGVyc1xuIik7CisJCWlmICghKFBvcnRQLT5TdGF0ZSAmIFJJT19UUklBRF9NT0RFKSkgewogCQkJQ29yNSB8PSBDT1I1X0lTVFJJUDsKIAkJfQogCX0KIAotCWlmICggVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIE9OTENSICkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiTWFwIG5ld2xpbmUgdG8gY2FycmlhZ2UtcmV0dXJuLCBuZXdsaW5lIG9uIG91dHB1dFxuIik7Ci0JCWlmICggUG9ydFAtPkNvb2tNb2RlID09IENPT0tfTUVESVVNICkKKwlpZiAoVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIE9OTENSKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIk1hcCBuZXdsaW5lIHRvIGNhcnJpYWdlLXJldHVybiwgbmV3bGluZSBvbiBvdXRwdXRcbiIpOworCQlpZiAoUG9ydFAtPkNvb2tNb2RlID09IENPT0tfTUVESVVNKQogCQkJQ29yNSB8PSBDT1I1X09OTENSOwogCX0KLQlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBPQ1JOTCApIHsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIk1hcCBjYXJyaWFnZSByZXR1cm4gdG8gbmV3bGluZSBvbiBvdXRwdXRcbiIpOwotCQlpZiAoIFBvcnRQLT5Db29rTW9kZSA9PSBDT09LX01FRElVTSApCisJaWYgKFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBPQ1JOTCkgeworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICJNYXAgY2FycmlhZ2UgcmV0dXJuIHRvIG5ld2xpbmUgb24gb3V0cHV0XG4iKTsKKwkJaWYgKFBvcnRQLT5Db29rTW9kZSA9PSBDT09LX01FRElVTSkKIAkJCUNvcjUgfD0gQ09SNV9PQ1JOTDsKIAl9Ci0JaWYgKCAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBUQUJETFkpID09IFRBQjMgKSB7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJUYWIgZGVsYXkgMyBzZXRcbiIpOwotCQlpZiAoIFBvcnRQLT5Db29rTW9kZSA9PSBDT09LX01FRElVTSApCisJaWYgKChUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgVEFCRExZKSA9PSBUQUIzKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIlRhYiBkZWxheSAzIHNldFxuIik7CisJCWlmIChQb3J0UC0+Q29va01vZGUgPT0gQ09PS19NRURJVU0pCiAJCQlDb3I1IHw9IENPUjVfVEFCMzsKIAl9CiAKIAkvKgotCSoqIEZsb3cgY29udHJvbCBieXRlcy4KLQkqLworCSAqKiBGbG93IGNvbnRyb2wgYnl0ZXMuCisJICovCiAJVHhYb24gPSBUdHlQLT50ZXJtaW9zLT5jX2NjW1ZTVEFSVF07CiAJVHhYb2ZmID0gVHR5UC0+dGVybWlvcy0+Y19jY1tWU1RPUF07CiAJUnhYb24gPSBUdHlQLT50ZXJtaW9zLT5jX2NjW1ZTVEFSVF07CiAJUnhYb2ZmID0gVHR5UC0+dGVybWlvcy0+Y19jY1tWU1RPUF07CiAJLyoKLQkqKiBMTkVYVCBieXRlCi0JKi8KKwkgKiogTE5FWFQgYnl0ZQorCSAqLwogCUxOZXh0ID0gMDsKIAogCS8qCi0JKiogQmF1ZCByYXRlIGJ5dGVzCi0JKi8KLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiTWFwcGluZyBvZiByeC90eCBiYXVkICV4ICgleClcbiIsIAotCQkJCSAgICAgVHR5UC0+dGVybWlvcy0+Y19jZmxhZywgQ0JBVUQpOworCSAqKiBCYXVkIHJhdGUgYnl0ZXMKKwkgKi8KKwlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICJNYXBwaW5nIG9mIHJ4L3R4IGJhdWQgJXggKCV4KVxuIiwgVHR5UC0+dGVybWlvcy0+Y19jZmxhZywgQ0JBVUQpOwogCiAJc3dpdGNoIChUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpIHsKICNkZWZpbmUgZShiKSBjYXNlIEIgIyMgYiA6IFJ4QmF1ZCA9IFR4QmF1ZCA9IFJJT19CICMjIGIgO2JyZWFrCi0JICBlKDUwKTtlKDc1KTtlKDExMCk7ZSgxMzQpO2UoMTUwKTtlKDIwMCk7ZSgzMDApO2UoNjAwKTtlKDEyMDApOwotCSAgZSgxODAwKTtlKDI0MDApO2UoNDgwMCk7ZSg5NjAwKTtlKDE5MjAwKTtlKDM4NDAwKTtlKDU3NjAwKTsKLQkgIGUoMTE1MjAwKTsgLyogZSgyMzA0MDApO2UoNDYwODAwKTsgZSg5MjE2MDApOyAgKi8KKwkJZSg1MCk7CisJCWUoNzUpOworCQllKDExMCk7CisJCWUoMTM0KTsKKwkJZSgxNTApOworCQllKDIwMCk7CisJCWUoMzAwKTsKKwkJZSg2MDApOworCQllKDEyMDApOworCQllKDE4MDApOworCQllKDI0MDApOworCQllKDQ4MDApOworCQllKDk2MDApOworCQllKDE5MjAwKTsKKwkJZSgzODQwMCk7CisJCWUoNTc2MDApOworCQllKDExNTIwMCk7CS8qIGUoMjMwNDAwKTtlKDQ2MDgwMCk7IGUoOTIxNjAwKTsgICovCiAJfQogCiAJLyogWFhYIE1Jc3NpbmcgY29udmVyc2lvbiB0YWJsZS4gWFhYICovCi0JLyogCSAoVHR5UC0+dGVybWlvcy0+Y19jZmxhZyAmIFZfQ0JBVUQpOyAqLworCS8qICAgICAgIChUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgVl9DQkFVRCk7ICovCiAKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAidHggYmF1ZCAweCV4LCByeCBiYXVkIDB4JXhcbiIsIFR4QmF1ZCwgUnhCYXVkKTsKKwlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICJ0eCBiYXVkIDB4JXgsIHJ4IGJhdWQgMHgleFxuIiwgVHhCYXVkLCBSeEJhdWQpOwogCiAKIAkvKgotCSoqIExlZnRvdmVycwotCSovCi0JaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JFQUQgKQotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIHJlY2VpdmVyXG4iKTsKKwkgKiogTGVmdG92ZXJzCisJICovCisJaWYgKFR0eVAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUkVBRCkKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIHJlY2VpdmVyXG4iKTsKICNpZmRlZiBSQ1YxRU4KLQlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBSQ1YxRU4gKQotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiUkNWMUVOICg/KVxuIik7CisJaWYgKFR0eVAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBSQ1YxRU4pCisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIlJDVjFFTiAoPylcbiIpOwogI2VuZGlmCiAjaWZkZWYgWE1UMUVOCi0JaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgWE1UMUVOICkKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlhNVDFFTiAoPylcbiIpOworCWlmIChUdHlQLT50ZXJtaW9zLT5jX2NmbGFnICYgWE1UMUVOKQorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICJYTVQxRU4gKD8pXG4iKTsKICNlbmRpZgotI2lmIDAKLQlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfY2ZsYWcgJiBMT0JMSyApCi0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJMT0JMSyAtIEpDTCBvdXRwdXQgYmxvY2tzIHdoZW4gbm90IGN1cnJlbnRcbiIpOwotI2VuZGlmCi0JaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2xmbGFnICYgSVNJRyApCi0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJJbnB1dCBjaGFyYWN0ZXIgc2lnbmFsIGdlbmVyYXRpbmcgZW5hYmxlZFxuIik7Ci0JaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2xmbGFnICYgSUNBTk9OICkKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkNhbm9uaWNhbCBpbnB1dDogZXJhc2UgYW5kIGtpbGwgZW5hYmxlZFxuIik7Ci0JaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2xmbGFnICYgWENBU0UgKQotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiQ2Fub25pY2FsIHVwcGVyL2xvd2VyIHByZXNlbnRhdGlvblxuIik7Ci0JaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2xmbGFnICYgRUNITyApCi0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJFbmFibGUgaW5wdXQgZWNob1xuIik7Ci0JaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2xmbGFnICYgRUNIT0UgKQotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIGVjaG8gZXJhc2VcbiIpOwotCWlmICggVHR5UC0+dGVybWlvcy0+Y19sZmxhZyAmIEVDSE9LICkKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkVuYWJsZSBlY2hvIGtpbGxcbiIpOwotCWlmICggVHR5UC0+dGVybWlvcy0+Y19sZmxhZyAmIEVDSE9OTCApCi0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJFbmFibGUgZWNobyBuZXdsaW5lXG4iKTsKLQlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfbGZsYWcgJiBOT0ZMU0ggKQotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiRGlzYWJsZSBmbHVzaCBhZnRlciBpbnRlcnJ1cHQgb3IgcXVpdFxuIik7CisJaWYgKFR0eVAtPnRlcm1pb3MtPmNfbGZsYWcgJiBJU0lHKQorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICJJbnB1dCBjaGFyYWN0ZXIgc2lnbmFsIGdlbmVyYXRpbmcgZW5hYmxlZFxuIik7CisJaWYgKFR0eVAtPnRlcm1pb3MtPmNfbGZsYWcgJiBJQ0FOT04pCisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIkNhbm9uaWNhbCBpbnB1dDogZXJhc2UgYW5kIGtpbGwgZW5hYmxlZFxuIik7CisJaWYgKFR0eVAtPnRlcm1pb3MtPmNfbGZsYWcgJiBYQ0FTRSkKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiQ2Fub25pY2FsIHVwcGVyL2xvd2VyIHByZXNlbnRhdGlvblxuIik7CisJaWYgKFR0eVAtPnRlcm1pb3MtPmNfbGZsYWcgJiBFQ0hPKQorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICJFbmFibGUgaW5wdXQgZWNob1xuIik7CisJaWYgKFR0eVAtPnRlcm1pb3MtPmNfbGZsYWcgJiBFQ0hPRSkKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiRW5hYmxlIGVjaG8gZXJhc2VcbiIpOworCWlmIChUdHlQLT50ZXJtaW9zLT5jX2xmbGFnICYgRUNIT0spCisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIkVuYWJsZSBlY2hvIGtpbGxcbiIpOworCWlmIChUdHlQLT50ZXJtaW9zLT5jX2xmbGFnICYgRUNIT05MKQorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICJFbmFibGUgZWNobyBuZXdsaW5lXG4iKTsKKwlpZiAoVHR5UC0+dGVybWlvcy0+Y19sZmxhZyAmIE5PRkxTSCkKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiRGlzYWJsZSBmbHVzaCBhZnRlciBpbnRlcnJ1cHQgb3IgcXVpdFxuIik7CiAjaWZkZWYgVE9TVE9QCi0JaWYgKCBUdHlQLT50ZXJtaW9zLT5jX2xmbGFnICYgVE9TVE9QICkKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlNlbmQgU0lHVFRPVSBmb3IgYmFja2dyb3VuZCBvdXRwdXRcbiIpOworCWlmIChUdHlQLT50ZXJtaW9zLT5jX2xmbGFnICYgVE9TVE9QKQorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICJTZW5kIFNJR1RUT1UgZm9yIGJhY2tncm91bmQgb3V0cHV0XG4iKTsKICNlbmRpZgogI2lmZGVmIFhDTFVERQotCWlmICggVHR5UC0+dGVybWlvcy0+Y19sZmxhZyAmIFhDTFVERSApCi0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJFeGNsdXNpdmUgdXNlIG9mIHRoaXMgbGluZVxuIik7CisJaWYgKFR0eVAtPnRlcm1pb3MtPmNfbGZsYWcgJiBYQ0xVREUpCisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIkV4Y2x1c2l2ZSB1c2Ugb2YgdGhpcyBsaW5lXG4iKTsKICNlbmRpZgotCWlmICggVHR5UC0+dGVybWlvcy0+Y19pZmxhZyAmIElVQ0xDICkKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIk1hcCB1cHBlcmNhc2UgdG8gbG93ZXJjYXNlIG9uIGlucHV0XG4iKTsKLQlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBPUE9TVCApCi0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJFbmFibGUgb3V0cHV0IHBvc3QtcHJvY2Vzc2luZ1xuIik7Ci0JaWYgKCBUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgT0xDVUMgKQotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiTWFwIGxvd2VyY2FzZSB0byB1cHBlcmNhc2Ugb24gb3V0cHV0XG4iKTsKLQlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBPTk9DUiApCi0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJObyBjYXJyaWFnZSByZXR1cm4gb3V0cHV0IGF0IGNvbHVtbiAwXG4iKTsKLQlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBPTkxSRVQgKQotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiTmV3bGluZSBwZXJmb3JtcyBjYXJyaWFnZSByZXR1cm4gZnVuY3Rpb25cbiIpOwotCWlmICggVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIE9GSUxMICkKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIlVzZSBmaWxsIGNoYXJhY3RlcnMgZm9yIGRlbGF5XG4iKTsKLQlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBPRkRFTCApCi0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJGaWxsIGNoYXJhY3RlciBpcyBERUxcbiIpOwotCWlmICggVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIE5MRExZICkKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIk5ld2xpbmUgZGVsYXkgc2V0XG4iKTsKLQlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBDUkRMWSApCi0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJDYXJyaWFnZSByZXR1cm4gZGVsYXkgc2V0XG4iKTsKLQlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBUQUJETFkgKQotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiVGFiIGRlbGF5IHNldFxuIik7Ci0jaWYgMAotCWlmICggVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIEJTRExZICkKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19QQVJBTSwgIkJhY2stc3BhY2UgZGVsYXkgc2V0XG4iKTsKLQlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBWVERMWSApCi0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJWZXJ0aWNhbCB0YWIgZGVsYXkgc2V0XG4iKTsKLQlpZiAoIFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBGRkRMWSApCi0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJGb3JtLWZlZWQgZGVsYXkgc2V0XG4iKTsKLSNlbmRpZgorCWlmIChUdHlQLT50ZXJtaW9zLT5jX2lmbGFnICYgSVVDTEMpCisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIk1hcCB1cHBlcmNhc2UgdG8gbG93ZXJjYXNlIG9uIGlucHV0XG4iKTsKKwlpZiAoVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIE9QT1NUKQorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICJFbmFibGUgb3V0cHV0IHBvc3QtcHJvY2Vzc2luZ1xuIik7CisJaWYgKFR0eVAtPnRlcm1pb3MtPmNfb2ZsYWcgJiBPTENVQykKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiTWFwIGxvd2VyY2FzZSB0byB1cHBlcmNhc2Ugb24gb3V0cHV0XG4iKTsKKwlpZiAoVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIE9OT0NSKQorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICJObyBjYXJyaWFnZSByZXR1cm4gb3V0cHV0IGF0IGNvbHVtbiAwXG4iKTsKKwlpZiAoVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIE9OTFJFVCkKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiTmV3bGluZSBwZXJmb3JtcyBjYXJyaWFnZSByZXR1cm4gZnVuY3Rpb25cbiIpOworCWlmIChUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgT0ZJTEwpCisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIlVzZSBmaWxsIGNoYXJhY3RlcnMgZm9yIGRlbGF5XG4iKTsKKwlpZiAoVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIE9GREVMKQorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICJGaWxsIGNoYXJhY3RlciBpcyBERUxcbiIpOworCWlmIChUdHlQLT50ZXJtaW9zLT5jX29mbGFnICYgTkxETFkpCisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgIk5ld2xpbmUgZGVsYXkgc2V0XG4iKTsKKwlpZiAoVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIENSRExZKQorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUEFSQU0sICJDYXJyaWFnZSByZXR1cm4gZGVsYXkgc2V0XG4iKTsKKwlpZiAoVHR5UC0+dGVybWlvcy0+Y19vZmxhZyAmIFRBQkRMWSkKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiVGFiIGRlbGF5IHNldFxuIik7CiAJLyoKLQkqKiBUaGVzZSB0aGluZ3MgYXJlIGtpbmQgb2YgdXNlZnVsIGluIGEgbGF0ZXIgbGlmZSEKLQkqLworCSAqKiBUaGVzZSB0aGluZ3MgYXJlIGtpbmQgb2YgdXNlZnVsIGluIGEgbGF0ZXIgbGlmZSEKKwkgKi8KIAlQb3J0UC0+Q29yMkNvcHkgPSBDb3IyOwogCi0JaWYgKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApIHsKLQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwotCQlmdW5jX2V4aXQgKCk7CisJaWYgKFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEKSB7CisJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQlmdW5jX2V4aXQoKTsKIAogCQlyZXR1cm4gUklPX0ZBSUw7CiAJfQogCiAJLyoKLQkqKiBBY3R1YWxseSB3cml0ZSB0aGUgaW5mbyBpbnRvIHRoZSBwYWNrZXQgdG8gYmUgc2VudAotCSovCi0JV0JZVEUocGhiX3BhcmFtX3B0ci0+Q21kLAljbWQpOwotCVdCWVRFKHBoYl9wYXJhbV9wdHItPkNvcjEsCSBDb3IxKTsKLQlXQllURShwaGJfcGFyYW1fcHRyLT5Db3IyLAkgQ29yMik7Ci0JV0JZVEUocGhiX3BhcmFtX3B0ci0+Q29yNCwJIENvcjQpOwotCVdCWVRFKHBoYl9wYXJhbV9wdHItPkNvcjUsCSBDb3I1KTsKLQlXQllURShwaGJfcGFyYW1fcHRyLT5UeFhvbiwJVHhYb24pOwotCVdCWVRFKHBoYl9wYXJhbV9wdHItPlJ4WG9uLAlSeFhvbik7CisJICoqIEFjdHVhbGx5IHdyaXRlIHRoZSBpbmZvIGludG8gdGhlIHBhY2tldCB0byBiZSBzZW50CisJICovCisJV0JZVEUocGhiX3BhcmFtX3B0ci0+Q21kLCBjbWQpOworCVdCWVRFKHBoYl9wYXJhbV9wdHItPkNvcjEsIENvcjEpOworCVdCWVRFKHBoYl9wYXJhbV9wdHItPkNvcjIsIENvcjIpOworCVdCWVRFKHBoYl9wYXJhbV9wdHItPkNvcjQsIENvcjQpOworCVdCWVRFKHBoYl9wYXJhbV9wdHItPkNvcjUsIENvcjUpOworCVdCWVRFKHBoYl9wYXJhbV9wdHItPlR4WG9uLCBUeFhvbik7CisJV0JZVEUocGhiX3BhcmFtX3B0ci0+UnhYb24sIFJ4WG9uKTsKIAlXQllURShwaGJfcGFyYW1fcHRyLT5UeFhvZmYsIFR4WG9mZik7CiAJV0JZVEUocGhiX3BhcmFtX3B0ci0+UnhYb2ZmLCBSeFhvZmYpOwotCVdCWVRFKHBoYl9wYXJhbV9wdHItPkxOZXh0LAlMTmV4dCk7CisJV0JZVEUocGhiX3BhcmFtX3B0ci0+TE5leHQsIExOZXh0KTsKIAlXQllURShwaGJfcGFyYW1fcHRyLT5UeEJhdWQsIFR4QmF1ZCk7CiAJV0JZVEUocGhiX3BhcmFtX3B0ci0+UnhCYXVkLCBSeEJhdWQpOwogCiAJLyoKLQkqKiBTZXQgdGhlIGxlbmd0aC9jb21tYW5kIGZpZWxkCi0JKi8KLQlXQllURShQYWNrZXRQLT5sZW4gLCAxMiB8IFBLVF9DTURfQklUKTsKKwkgKiogU2V0IHRoZSBsZW5ndGgvY29tbWFuZCBmaWVsZAorCSAqLworCVdCWVRFKFBhY2tldFAtPmxlbiwgMTIgfCBQS1RfQ01EX0JJVCk7CiAKIAkvKgotCSoqIFRoZSBwYWNrZXQgaXMgZm9ybWVkIC0gbm93LCB3aGFjayBpdCBvZmYKLQkqKiB0byBpdHMgZmluYWwgZGVzdGluYXRpb246Ci0JKi8KKwkgKiogVGhlIHBhY2tldCBpcyBmb3JtZWQgLSBub3csIHdoYWNrIGl0IG9mZgorCSAqKiB0byBpdHMgZmluYWwgZGVzdGluYXRpb246CisJICovCiAJYWRkX3RyYW5zbWl0KFBvcnRQKTsKIAkvKgotCSoqIENvdW50IGNoYXJhY3RlcnMgdHJhbnNtaXR0ZWQgZm9yIHBvcnQgc3RhdGlzdGljcyByZXBvcnRpbmcKLQkqLworCSAqKiBDb3VudCBjaGFyYWN0ZXJzIHRyYW5zbWl0dGVkIGZvciBwb3J0IHN0YXRpc3RpY3MgcmVwb3J0aW5nCisJICovCiAJaWYgKFBvcnRQLT5zdGF0c0dhdGhlcikKIAkJUG9ydFAtPnR4Y2hhcnMgKz0gMTI7CiAKLQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CiAKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1BBUkFNLCAiYWRkX3RyYW5zbWl0IHJldHVybmVkLlxuIik7CisJcmlvX2RwcmludGsoUklPX0RFQlVHX1BBUkFNLCAiYWRkX3RyYW5zbWl0IHJldHVybmVkLlxuIik7CiAJLyoKLQkqKiBqb2IgZG9uZS4KLQkqLwotCWZ1bmNfZXhpdCAoKTsKKwkgKiogam9iIGRvbmUuCisJICovCisJZnVuY19leGl0KCk7CiAKIAlyZXR1cm4gUklPX1NVQ0NFU1M7CiB9CkBAIC02MzgsMTYgKzU5NywxNSBAQAogKiogV2UgY2FuIGFkZCBhbm90aGVyIHBhY2tldCB0byBhIHRyYW5zbWl0IHF1ZXVlIGlmIHRoZSBwYWNrZXQgcG9pbnRlciBwb2ludGVkCiAqKiB0byBieSB0aGUgVHhBZGQgcG9pbnRlciBoYXMgUEtUX0lOX1VTRSBjbGVhciBpbiBpdHMgYWRkcmVzcy4KICovCi1pbnQKLWNhbl9hZGRfdHJhbnNtaXQoUGt0UCwgUG9ydFApCitpbnQgY2FuX2FkZF90cmFuc21pdChQa3RQLCBQb3J0UCkKIFBLVCAqKlBrdFA7Ci1zdHJ1Y3QgUG9ydCAqUG9ydFA7IAorc3RydWN0IFBvcnQgKlBvcnRQOwogewogCXJlZ2lzdGVyIFBLVCAqdHA7CiAKLQkqUGt0UCA9IHRwID0gKFBLVCAqKVJJT19QVFIoUG9ydFAtPkNhZGRyLFJXT1JEKCpQb3J0UC0+VHhBZGQpKTsKKwkqUGt0UCA9IHRwID0gKFBLVCAqKSBSSU9fUFRSKFBvcnRQLT5DYWRkciwgUldPUkQoKlBvcnRQLT5UeEFkZCkpOwogCi0JcmV0dXJuICEoKHVpbnQpdHAgJiBQS1RfSU5fVVNFKTsKKwlyZXR1cm4gISgodWludCkgdHAgJiBQS1RfSU5fVVNFKTsKIH0KIAogLyoKQEAgLTY1NSwyNSArNjEzLDIyIEBACiAqKiBhbmQgdGhlbiBtb3ZlIHRoZSBUeEFkZCBwb2ludGVyIGFsb25nIG9uZSBwb3NpdGlvbiB0byBwb2ludCB0byB0aGUgbmV4dAogKiogcGFja2V0IHBvaW50ZXIuIFlvdSBtdXN0IHdyYXAgdGhlIHBvaW50ZXIgZnJvbSB0aGUgZW5kIGJhY2sgdG8gdGhlIHN0YXJ0LgogKi8KLXZvaWQKLWFkZF90cmFuc21pdChQb3J0UCkKLXN0cnVjdCBQb3J0ICpQb3J0UDsgCit2b2lkIGFkZF90cmFuc21pdChQb3J0UCkKK3N0cnVjdCBQb3J0ICpQb3J0UDsKIHsKLSAgaWYgKFJXT1JEKCpQb3J0UC0+VHhBZGQpICYgUEtUX0lOX1VTRSkgewotICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUEFSQU0sICJhZGRfdHJhbnNtaXQ6IFBhY2tldCBoYXMgYmVlbiBzdG9sZW4hIik7Ci0gIH0KLQlXV09SRCggKih1c2hvcnQgKilQb3J0UC0+VHhBZGQsIFJXT1JEKCpQb3J0UC0+VHhBZGQpIHwgUEtUX0lOX1VTRSk7Ci0JUG9ydFAtPlR4QWRkID0gKFBvcnRQLT5UeEFkZCA9PSBQb3J0UC0+VHhFbmQpID8gUG9ydFAtPlR4U3RhcnQgOiAKLQkJCQkJUG9ydFAtPlR4QWRkICsgMTsKLQlXV09SRCggUG9ydFAtPlBoYlAtPnR4X2FkZCAsIFJJT19PRkYoUG9ydFAtPkNhZGRyLFBvcnRQLT5UeEFkZCkgKTsKKwlpZiAoUldPUkQoKlBvcnRQLT5UeEFkZCkgJiBQS1RfSU5fVVNFKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19QQVJBTSwgImFkZF90cmFuc21pdDogUGFja2V0IGhhcyBiZWVuIHN0b2xlbiEiKTsKKwl9CisJV1dPUkQoKih1c2hvcnQgKikgUG9ydFAtPlR4QWRkLCBSV09SRCgqUG9ydFAtPlR4QWRkKSB8IFBLVF9JTl9VU0UpOworCVBvcnRQLT5UeEFkZCA9IChQb3J0UC0+VHhBZGQgPT0gUG9ydFAtPlR4RW5kKSA/IFBvcnRQLT5UeFN0YXJ0IDogUG9ydFAtPlR4QWRkICsgMTsKKwlXV09SRChQb3J0UC0+UGhiUC0+dHhfYWRkLCBSSU9fT0ZGKFBvcnRQLT5DYWRkciwgUG9ydFAtPlR4QWRkKSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBQdXQgYSBwYWNrZXQgb250byB0aGUgZW5kIG9mIHRoZQogICogZnJlZSBsaXN0CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLXB1dF9mcmVlX2VuZChIb3N0UCwgUGt0UCkKK3ZvaWQgcHV0X2ZyZWVfZW5kKEhvc3RQLCBQa3RQKQogc3RydWN0IEhvc3QgKkhvc3RQOwogUEtUICpQa3RQOwogewpAQCAtNjg4LDI0ICs2NDMsMjMgQEAKIAkqCiAJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0JcmlvX2RwcmludGsgKFJJT19ERUJVR19QRkUsICAicHV0X2ZyZWVfZW5kKFBrdFA9JXgpXG4iLChpbnQpUGt0UCk7CisJcmlvX2RwcmludGsoUklPX0RFQlVHX1BGRSwgInB1dF9mcmVlX2VuZChQa3RQPSV4KVxuIiwgKGludCkgUGt0UCk7CiAKLQlpZiAoKG9sZF9lbmQ9UldPUkQoSG9zdFAtPlBhcm1NYXBQLT5mcmVlX2xpc3RfZW5kKSkgIT0gVFBOVUxMKSB7Ci0JCW5ld19lbmQgPSBSSU9fT0ZGKEhvc3RQLT5DYWRkcixQa3RQKTsKLQkJdG1wX3BvaW50ZXIgPSAoRlJFRV9MSVNUICopUklPX1BUUihIb3N0UC0+Q2FkZHIsb2xkX2VuZCk7Ci0JCVdXT1JEKHRtcF9wb2ludGVyLT5uZXh0ICwgbmV3X2VuZCApOwotCQlXV09SRCgoKEZSRUVfTElTVCAqKVBrdFApLT5wcmV2ICwgb2xkX2VuZCk7Ci0JCVdXT1JEKCgoRlJFRV9MSVNUICopUGt0UCktPm5leHQgLCBUUE5VTEwpOworCWlmICgob2xkX2VuZCA9IFJXT1JEKEhvc3RQLT5QYXJtTWFwUC0+ZnJlZV9saXN0X2VuZCkpICE9IFRQTlVMTCkgeworCQluZXdfZW5kID0gUklPX09GRihIb3N0UC0+Q2FkZHIsIFBrdFApOworCQl0bXBfcG9pbnRlciA9IChGUkVFX0xJU1QgKikgUklPX1BUUihIb3N0UC0+Q2FkZHIsIG9sZF9lbmQpOworCQlXV09SRCh0bXBfcG9pbnRlci0+bmV4dCwgbmV3X2VuZCk7CisJCVdXT1JEKCgoRlJFRV9MSVNUICopIFBrdFApLT5wcmV2LCBvbGRfZW5kKTsKKwkJV1dPUkQoKChGUkVFX0xJU1QgKikgUGt0UCktPm5leHQsIFRQTlVMTCk7CiAJCVdXT1JEKEhvc3RQLT5QYXJtTWFwUC0+ZnJlZV9saXN0X2VuZCwgbmV3X2VuZCk7CisJfSBlbHNlIHsJCS8qIEZpcnN0IHBhY2tldCBvbiB0aGUgZnJlZSBsaXN0IHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEgKi8KKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1BGRSwgInB1dF9mcmVlX2VuZCgpOiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW5cbiIpOworCQlXV09SRChIb3N0UC0+UGFybU1hcFAtPmZyZWVfbGlzdF9lbmQsIFJJT19PRkYoSG9zdFAtPkNhZGRyLCBQa3RQKSk7CisJCXRtcF9wb2ludGVyID0gKEZSRUVfTElTVCAqKSBQa3RQOworCQlXV09SRCh0bXBfcG9pbnRlci0+cHJldiwgVFBOVUxMKTsKKwkJV1dPUkQodG1wX3BvaW50ZXItPm5leHQsIFRQTlVMTCk7CiAJfQotCWVsc2UgewkvKiBGaXJzdCBwYWNrZXQgb24gdGhlIGZyZWUgbGlzdCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4hICovCi0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUEZFLCAicHV0X2ZyZWVfZW5kKCk6IFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlblxuIik7Ci0JCVdXT1JEKEhvc3RQLT5QYXJtTWFwUC0+ZnJlZV9saXN0X2VuZCAsIFJJT19PRkYoSG9zdFAtPkNhZGRyLFBrdFApKTsKLQkJdG1wX3BvaW50ZXIgPSAoRlJFRV9MSVNUICopUGt0UDsKLQkJV1dPUkQodG1wX3BvaW50ZXItPnByZXYgLCBUUE5VTEwpOwotCQlXV09SRCh0bXBfcG9pbnRlci0+bmV4dCAsIFRQTlVMTCk7Ci0JfQotCXJpb19kcHJpbnRrIChSSU9fREVCVUdfQ01ELCAiQmVmb3JlIHVubG9jazogJXBcbiIsICZIb3N0UC0+SG9zdExvY2spOworCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJCZWZvcmUgdW5sb2NrOiAlcFxuIiwgJkhvc3RQLT5Ib3N0TG9jayk7CiAJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJkhvc3RQLT5Ib3N0TG9jaywgZmxhZ3MpOwogfQogCkBAIC03MTUsMTQgKzY2OSwxMiBAQAogKiogcmVsZXZhbnQgcGFja2V0LCBbaGF2aW5nIGNsZWFyZWQgdGhlIFBLVF9JTl9VU0UgYml0XS4gSWYgUEtUX0lOX1VTRSBpcyBjbGVhciwKICoqIHRoZW4gY2FuX3JlbW92ZV9yZWNlaXZlKCkgcmV0dXJucyAwLgogKi8KLWludAotY2FuX3JlbW92ZV9yZWNlaXZlKFBrdFAsIFBvcnRQKQoraW50IGNhbl9yZW1vdmVfcmVjZWl2ZShQa3RQLCBQb3J0UCkKIFBLVCAqKlBrdFA7CiBzdHJ1Y3QgUG9ydCAqUG9ydFA7CiB7Ci0JaWYgKCBSV09SRCgqUG9ydFAtPlJ4UmVtb3ZlKSAmIFBLVF9JTl9VU0UpIHsKLQkJKlBrdFAgPSAoUEtUICopUklPX1BUUihQb3J0UC0+Q2FkZHIsCi0JCQkJCVJXT1JEKCpQb3J0UC0+UnhSZW1vdmUpICYgflBLVF9JTl9VU0UpOworCWlmIChSV09SRCgqUG9ydFAtPlJ4UmVtb3ZlKSAmIFBLVF9JTl9VU0UpIHsKKwkJKlBrdFAgPSAoUEtUICopIFJJT19QVFIoUG9ydFAtPkNhZGRyLCBSV09SRCgqUG9ydFAtPlJ4UmVtb3ZlKSAmIH5QS1RfSU5fVVNFKTsKIAkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwpAQCAtNzMzLDEyICs2ODUsMTAgQEAKICoqIGFuZCB0aGVuIGJ1bXAgdGhlIHBvaW50ZXJzLiBPbmNlIHRoZSBwb2ludGVycyBnZXQgdG8gdGhlIGVuZCwgdGhleSBtdXN0CiAqKiBiZSB3cmFwcGVkIGJhY2sgdG8gdGhlIHN0YXJ0LgogKi8KLXZvaWQKLXJlbW92ZV9yZWNlaXZlKFBvcnRQKQotc3RydWN0IFBvcnQgKlBvcnRQOyAKK3ZvaWQgcmVtb3ZlX3JlY2VpdmUoUG9ydFApCitzdHJ1Y3QgUG9ydCAqUG9ydFA7CiB7Ci0JV1dPUkQoICpQb3J0UC0+UnhSZW1vdmUsIFJXT1JEKCpQb3J0UC0+UnhSZW1vdmUpICYgflBLVF9JTl9VU0UgKTsKLQlQb3J0UC0+UnhSZW1vdmUgPSAoUG9ydFAtPlJ4UmVtb3ZlID09IFBvcnRQLT5SeEVuZCkgPyBQb3J0UC0+UnhTdGFydCA6IAotCQkJCQkJCQlQb3J0UC0+UnhSZW1vdmUgKyAxOwotCVdXT1JEKCBQb3J0UC0+UGhiUC0+cnhfcmVtb3ZlICwgUklPX09GRihQb3J0UC0+Q2FkZHIsIFBvcnRQLT5SeFJlbW92ZSkgKTsKKwlXV09SRCgqUG9ydFAtPlJ4UmVtb3ZlLCBSV09SRCgqUG9ydFAtPlJ4UmVtb3ZlKSAmIH5QS1RfSU5fVVNFKTsKKwlQb3J0UC0+UnhSZW1vdmUgPSAoUG9ydFAtPlJ4UmVtb3ZlID09IFBvcnRQLT5SeEVuZCkgPyBQb3J0UC0+UnhTdGFydCA6IFBvcnRQLT5SeFJlbW92ZSArIDE7CisJV1dPUkQoUG9ydFAtPlBoYlAtPnJ4X3JlbW92ZSwgUklPX09GRihQb3J0UC0+Q2FkZHIsIFBvcnRQLT5SeFJlbW92ZSkpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9wY2ljb3B5LmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3BjaWNvcHkuYwppbmRleCAyZWE5OWE2Li41MzVhZmFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb3BjaWNvcHkuYworKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3BjaWNvcHkuYwpAQCAtMSw4ICsxLDggQEAKIAogLyogWWVhaC4gV2UgaGF2ZSBjb3B5cmlnaHQgb24gdGhpcyBvbmUuIFN1cmUuICovCiAKLXZvaWQgcmlvX3BjaWNvcHkoIGNoYXIgKmZyb20sIGNoYXIgKnRvLCBpbnQgYW1vdW50KQordm9pZCByaW9fcGNpY29weShjaGFyICpmcm9tLCBjaGFyICp0bywgaW50IGFtb3VudCkKIHsKLSAgd2hpbGUgKCBhbW91bnQtLSApCi0gICAgKnRvKysgPSAqZnJvbSsrOworCXdoaWxlIChhbW91bnQtLSkKKwkJKnRvKysgPSAqZnJvbSsrOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9yb3V0ZS5jIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9yb3V0ZS5jCmluZGV4IGU5NTY0YzkuLmY5ODg4OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vcmlvcm91dGUuYworKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3JvdXRlLmMKQEAgLTkzLDYyNSArOTMsNTA1IEBACiAqKiBJbmNvbWluZyBvbiB0aGUgUk9VVEVfUlVQCiAqKiBJIHdyb3RlIHRoaXMgd2hpbGUgSSB3YXMgdGlyZWQuIEZvcmdpdmUgbWUuCiAqLwotaW50IFJJT1JvdXRlUnVwKCBzdHJ1Y3QgcmlvX2luZm8gKnAsIHVpbnQgUnVwLCBzdHJ1Y3QgSG9zdCAqSG9zdFAsIFBLVCAqUGFja2V0UCApCitpbnQgUklPUm91dGVSdXAoc3RydWN0IHJpb19pbmZvICpwLCB1aW50IFJ1cCwgc3RydWN0IEhvc3QgKkhvc3RQLCBQS1QgKiBQYWNrZXRQKQogewotICBzdHJ1Y3QgUGt0Q21kICpQa3RDbWRQID0gKHN0cnVjdCBQa3RDbWQgKilQYWNrZXRQLT5kYXRhOwotICBzdHJ1Y3QgUGt0Q21kX00gKlBrdFJlcGx5UDsKLSAgc3RydWN0IENtZEJsayAqQ21kQmxrUDsKLSAgc3RydWN0IFBvcnQgKlBvcnRQOwotICBzdHJ1Y3QgTWFwICpNYXBQOwotICBzdHJ1Y3QgVG9wICpUb3BQOwotICBpbnQgVGhpc0xpbmssIFRoaXNMaW5rTWluLCBUaGlzTGlua01heDsKLSAgaW50IHBvcnQ7Ci0gIGludCBNb2QsIE1vZDEsIE1vZDI7Ci0gIHVzaG9ydCBSdGFUeXBlOwotICB1aW50IFJ0YVVuaXE7Ci0gIHVpbnQgVGhpc1VuaXQsIFRoaXNVbml0MjsJLyogMiBpZHMgdG8gYWNjb21tb2RhdGUgMTYgcG9ydCBSVEEgKi8KLSAgdWludCBPbGRVbml0LCBOZXdVbml0LCBPbGRMaW5rLCBOZXdMaW5rOwotICBjaGFyICpNeVR5cGUsICpNeU5hbWU7Ci0gIGludCBMaWVzOwotICB1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBQa3RDbWQgKlBrdENtZFAgPSAoc3RydWN0IFBrdENtZCAqKSBQYWNrZXRQLT5kYXRhOworCXN0cnVjdCBQa3RDbWRfTSAqUGt0UmVwbHlQOworCXN0cnVjdCBDbWRCbGsgKkNtZEJsa1A7CisJc3RydWN0IFBvcnQgKlBvcnRQOworCXN0cnVjdCBNYXAgKk1hcFA7CisJc3RydWN0IFRvcCAqVG9wUDsKKwlpbnQgVGhpc0xpbmssIFRoaXNMaW5rTWluLCBUaGlzTGlua01heDsKKwlpbnQgcG9ydDsKKwlpbnQgTW9kLCBNb2QxLCBNb2QyOworCXVzaG9ydCBSdGFUeXBlOworCXVpbnQgUnRhVW5pcTsKKwl1aW50IFRoaXNVbml0LCBUaGlzVW5pdDI7CS8qIDIgaWRzIHRvIGFjY29tbW9kYXRlIDE2IHBvcnQgUlRBICovCisJdWludCBPbGRVbml0LCBOZXdVbml0LCBPbGRMaW5rLCBOZXdMaW5rOworCWNoYXIgKk15VHlwZSwgKk15TmFtZTsKKwlpbnQgTGllczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0jaWZkZWYgU1RBQ0sKLSAgICBSSU9TdGFja0NoZWNrKCJSSU9Sb3V0ZVJ1cCIpOwotI2VuZGlmCi0jaWZkZWYgQ0hFQ0sKLSAgICBDaGVja1BhY2tldFAoUGFja2V0UCk7Ci0gICAgQ2hlY2tIb3N0UChIb3N0UCk7Ci0gICAgQ2hlY2tSdXAoUnVwKTsKLSAgICBDaGVja0hvc3QoSG9zdCk7Ci0jZW5kaWYKLSAgLyoKLSAgKiogSXMgdGhpcyB1bml0IHRlbGxpbmcgdXMgaXQncyBjdXJyZW50IGxpbmsgdG9wb2xvZ3k/Ci0gICovCi0gIGlmICggUkJZVEUoUGt0Q21kUC0+Q29tbWFuZCkgPT0gUk9VVEVfVE9QT0xPR1kgKQotICB7Ci0gICAgTWFwUCA9IEhvc3RQLT5NYXBwaW5nOwotCi0gICAgLyoKLSAgICAqKiBUaGUgcGFja2V0IGNhbiBiZSBzZW50IGVpdGhlciBieSB0aGUgaG9zdCBvciBieSBhbiBSVEEuCi0gICAgKiogSWYgaXQgY29tZXMgZnJvbSB0aGUgaG9zdCwgdGhlbiB3ZSBuZWVkIHRvIGZpbGwgaW4gdGhlCi0gICAgKiogVG9wb2xvZ3kgYXJyYXkgaW4gdGhlIGhvc3Qgc3RydWN0dXJlLiBJZiBpdCBjYW1lIGluCi0gICAgKiogZnJvbSBhbiBSVEEgdGhlbiB3ZSBuZWVkIHRvIGZpbGwgaW4gdGhlIE1hcHBpbmcgc3RydWN0dXJlJ3MKLSAgICAqKiBUb3BvbG9neSBhcnJheSBmb3IgdGhlIHVuaXQuCi0gICAgKi8KLSAgICBpZiAoIFJ1cCA+PSAodXNob3J0KU1BWF9SVVAgKQotICAgIHsKLSAgICAgIFRoaXNVbml0ID0gSE9TVF9JRDsKLSAgICAgIFRvcFAgPSBIb3N0UC0+VG9wb2xvZ3k7Ci0gICAgICBNeVR5cGUgPSAiSG9zdCI7Ci0gICAgICBNeU5hbWUgPSBIb3N0UC0+TmFtZTsKLSAgICAgIFRoaXNMaW5rTWluID0gVGhpc0xpbmtNYXggPSBSdXAgLSBNQVhfUlVQOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgVGhpc1VuaXQgPSBSdXArMTsKLSAgICAgIFRvcFAgPSBIb3N0UC0+TWFwcGluZ1tSdXBdLlRvcG9sb2d5OwotICAgICAgTXlUeXBlID0gIlJUQSI7Ci0gICAgICBNeU5hbWUgPSBIb3N0UC0+TWFwcGluZ1tSdXBdLk5hbWU7Ci0gICAgICBUaGlzTGlua01pbiA9IDA7Ci0gICAgICBUaGlzTGlua01heCA9IExJTktTX1BFUl9VTklUIC0gMTsKLSAgICB9Ci0KLSAgICAvKgotICAgICoqIExpZXMgd2lsbCBub3QgYmUgdG9sZXJhdGVkLgotICAgICoqIElmIGFueSBwYWlyIG9mIGxpbmtzIGNsYWltIHRvIGJlIGNvbm5lY3RlZCB0byB0aGUgc2FtZQotICAgICoqIHBsYWNlLCB0aGVuIGlnbm9yZSB0aGlzIHBhY2tldCBjb21wbGV0ZWx5LgotICAgICovCi0gICAgTGllcyA9IDA7Ci0gICAgZm9yICggVGhpc0xpbms9VGhpc0xpbmtNaW4gKyAxOyBUaGlzTGluayA8PSBUaGlzTGlua01heDsgVGhpc0xpbmsrKykKLSAgICB7Ci0gICAgICAvKgotICAgICAgKiogaXQgd29uJ3QgbGllIGFib3V0IG5ldHdvcmsgaW50ZXJjb25uZWN0LCB0b3RhbCBkaXNjb25uZWN0cwotICAgICAgKiogYW5kIG5vLUlEcy4gKG9yIGF0IGxlYXN0LCBpdCBkb2Vzbid0ICptYXR0ZXIqIGlmIGl0IGRvZXMpCi0gICAgICAqLwotICAgICAgaWYgKCBSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5W1RoaXNMaW5rXS5Vbml0KSA+ICh1c2hvcnQpTUFYX1JVUCApCi0JICBjb250aW51ZTsKLQotICAgICAgZm9yICggTmV3TGluaz1UaGlzTGlua01pbjsgTmV3TGluayA8IFRoaXNMaW5rOyBOZXdMaW5rKysgKQotICAgICAgewotICAgICAgICBpZiAoIChSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5W1RoaXNMaW5rXS5Vbml0KSA9PQotICAgICAgICAgICAgICBSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5W05ld0xpbmtdLlVuaXQpKSAmJgotCSAgICAgKFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbVGhpc0xpbmtdLkxpbmspID09Ci0gICAgICAgICAgICAgIFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbTmV3TGlua10uTGluaykpICkKLQl7Ci0gICAgICAgICAgTGllcysrOwotCX0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIExpZXMgKQotICAgIHsKLSAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJMSUVTISBEQU1OIExJRVMhICVkIExJRVMhXG4iLExpZXMpOwotICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIiVkOiVjICVkOiVjICVkOiVjICVkOiVjXG4iLAotICAgICAgICAgIFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbMF0uVW5pdCksIAotCSAgJ0EnK1JCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbMF0uTGluayksCi0gICAgICAgICAgUkJZVEUoUGt0Q21kUC0+Um91dGVUb3BvbG9neVsxXS5Vbml0KSwKLQkgICdBJytSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5WzFdLkxpbmspLAotICAgICAgICAgIFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbMl0uVW5pdCksCi0JICAnQScrUkJZVEUoUGt0Q21kUC0+Um91dGVUb3BvbG9neVsyXS5MaW5rKSwKLSAgICAgICAgICBSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5WzNdLlVuaXQpLAotCSAgJ0EnK1JCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbM10uTGluaykpOwotICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqKiBub3csIHByb2Nlc3MgZWFjaCBsaW5rLgotICAgICovCi0gICAgZm9yICggVGhpc0xpbms9VGhpc0xpbmtNaW47IFRoaXNMaW5rIDw9IFRoaXNMaW5rTWF4OyBUaGlzTGluaysrKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAqKiB0aGlzIGlzIHdoYXQgaXQgd2FzIGNvbm5lY3RlZCB0bwotICAgICAgKi8KLSAgICAgIE9sZFVuaXQgPSBUb3BQW1RoaXNMaW5rXS5Vbml0OwotICAgICAgT2xkTGluayA9IFRvcFBbVGhpc0xpbmtdLkxpbms7Ci0KLSAgICAgIC8qCi0gICAgICAqKiB0aGlzIGlzIHdoYXQgaXQgaXMgbm93IGNvbm5lY3RlZCB0bwotICAgICAgKi8KLSAgICAgIE5ld1VuaXQgPSBSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5W1RoaXNMaW5rXS5Vbml0KTsKLSAgICAgIE5ld0xpbmsgPSBSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5W1RoaXNMaW5rXS5MaW5rKTsKLQotICAgICAgaWYgKCBPbGRVbml0ICE9IE5ld1VuaXQgfHwgT2xkTGluayAhPSBOZXdMaW5rICkKLSAgICAgIHsKIAkvKgotCSoqIHNvbWV0aGluZyBoYXMgY2hhbmdlZCEKLQkqLworCSAqKiBJcyB0aGlzIHVuaXQgdGVsbGluZyB1cyBpdCdzIGN1cnJlbnQgbGluayB0b3BvbG9neT8KKwkgKi8KKwlpZiAoUkJZVEUoUGt0Q21kUC0+Q29tbWFuZCkgPT0gUk9VVEVfVE9QT0xPR1kpIHsKKwkJTWFwUCA9IEhvc3RQLT5NYXBwaW5nOwogCi0gICAgICAgIGlmICggTmV3VW5pdCA+IE1BWF9SVVAgJiYKLQkgICAgIE5ld1VuaXQgIT0gUk9VVEVfRElTQ09OTkVDVCAmJgotCSAgICAgTmV3VW5pdCAhPSBST1VURV9OT19JRCAmJgotCSAgICAgTmV3VW5pdCAhPSBST1VURV9JTlRFUkNPTk5FQ1QgKQotCXsKLQkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIkkgaGF2ZSBhIGxpbmsgZnJvbSAlcyAlcyB0byB1bml0ICVkOiVkIC0gSSBkb24ndCBsaWtlIGl0LlxuIiwKLQkJICBNeVR5cGUsCi0JCSAgTXlOYW1lLAotCQkgIE5ld1VuaXQsCi0JCSAgTmV3TGluayk7CisJCS8qCisJCSAqKiBUaGUgcGFja2V0IGNhbiBiZSBzZW50IGVpdGhlciBieSB0aGUgaG9zdCBvciBieSBhbiBSVEEuCisJCSAqKiBJZiBpdCBjb21lcyBmcm9tIHRoZSBob3N0LCB0aGVuIHdlIG5lZWQgdG8gZmlsbCBpbiB0aGUKKwkJICoqIFRvcG9sb2d5IGFycmF5IGluIHRoZSBob3N0IHN0cnVjdHVyZS4gSWYgaXQgY2FtZSBpbgorCQkgKiogZnJvbSBhbiBSVEEgdGhlbiB3ZSBuZWVkIHRvIGZpbGwgaW4gdGhlIE1hcHBpbmcgc3RydWN0dXJlJ3MKKwkJICoqIFRvcG9sb2d5IGFycmF5IGZvciB0aGUgdW5pdC4KKwkJICovCisJCWlmIChSdXAgPj0gKHVzaG9ydCkgTUFYX1JVUCkgeworCQkJVGhpc1VuaXQgPSBIT1NUX0lEOworCQkJVG9wUCA9IEhvc3RQLT5Ub3BvbG9neTsKKwkJCU15VHlwZSA9ICJIb3N0IjsKKwkJCU15TmFtZSA9IEhvc3RQLT5OYW1lOworCQkJVGhpc0xpbmtNaW4gPSBUaGlzTGlua01heCA9IFJ1cCAtIE1BWF9SVVA7CisJCX0gZWxzZSB7CisJCQlUaGlzVW5pdCA9IFJ1cCArIDE7CisJCQlUb3BQID0gSG9zdFAtPk1hcHBpbmdbUnVwXS5Ub3BvbG9neTsKKwkJCU15VHlwZSA9ICJSVEEiOworCQkJTXlOYW1lID0gSG9zdFAtPk1hcHBpbmdbUnVwXS5OYW1lOworCQkJVGhpc0xpbmtNaW4gPSAwOworCQkJVGhpc0xpbmtNYXggPSBMSU5LU19QRVJfVU5JVCAtIDE7CisJCX0KKworCQkvKgorCQkgKiogTGllcyB3aWxsIG5vdCBiZSB0b2xlcmF0ZWQuCisJCSAqKiBJZiBhbnkgcGFpciBvZiBsaW5rcyBjbGFpbSB0byBiZSBjb25uZWN0ZWQgdG8gdGhlIHNhbWUKKwkJICoqIHBsYWNlLCB0aGVuIGlnbm9yZSB0aGlzIHBhY2tldCBjb21wbGV0ZWx5LgorCQkgKi8KKwkJTGllcyA9IDA7CisJCWZvciAoVGhpc0xpbmsgPSBUaGlzTGlua01pbiArIDE7IFRoaXNMaW5rIDw9IFRoaXNMaW5rTWF4OyBUaGlzTGluaysrKSB7CisJCQkvKgorCQkJICoqIGl0IHdvbid0IGxpZSBhYm91dCBuZXR3b3JrIGludGVyY29ubmVjdCwgdG90YWwgZGlzY29ubmVjdHMKKwkJCSAqKiBhbmQgbm8tSURzLiAob3IgYXQgbGVhc3QsIGl0IGRvZXNuJ3QgKm1hdHRlciogaWYgaXQgZG9lcykKKwkJCSAqLworCQkJaWYgKFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbVGhpc0xpbmtdLlVuaXQpID4gKHVzaG9ydCkgTUFYX1JVUCkKKwkJCQljb250aW51ZTsKKworCQkJZm9yIChOZXdMaW5rID0gVGhpc0xpbmtNaW47IE5ld0xpbmsgPCBUaGlzTGluazsgTmV3TGluaysrKSB7CisJCQkJaWYgKChSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5W1RoaXNMaW5rXS5Vbml0KSA9PSBSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5W05ld0xpbmtdLlVuaXQpKSAmJiAoUkJZVEUoUGt0Q21kUC0+Um91dGVUb3BvbG9neVtUaGlzTGlua10uTGluaykgPT0gUkJZVEUoUGt0Q21kUC0+Um91dGVUb3BvbG9neVtOZXdMaW5rXS5MaW5rKSkpIHsKKwkJCQkJTGllcysrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChMaWVzKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUk9VVEUsICJMSUVTISBEQU1OIExJRVMhICVkIExJRVMhXG4iLCBMaWVzKTsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19ST1VURSwgIiVkOiVjICVkOiVjICVkOiVjICVkOiVjXG4iLAorCQkJCSAgICBSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5WzBdLlVuaXQpLAorCQkJCSAgICAnQScgKyBSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5WzBdLkxpbmspLAorCQkJCSAgICBSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5WzFdLlVuaXQpLAorCQkJCSAgICAnQScgKyBSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5WzFdLkxpbmspLCBSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5WzJdLlVuaXQpLCAnQScgKyBSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5WzJdLkxpbmspLCBSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5WzNdLlVuaXQpLCAnQScgKyBSQllURShQa3RDbWRQLT5Sb3V0ZVRvcG9sb2d5WzNdLkxpbmspKTsKKwkJCXJldHVybiBUUlVFOworCQl9CisKKwkJLyoKKwkJICoqIG5vdywgcHJvY2VzcyBlYWNoIGxpbmsuCisJCSAqLworCQlmb3IgKFRoaXNMaW5rID0gVGhpc0xpbmtNaW47IFRoaXNMaW5rIDw9IFRoaXNMaW5rTWF4OyBUaGlzTGluaysrKSB7CisJCQkvKgorCQkJICoqIHRoaXMgaXMgd2hhdCBpdCB3YXMgY29ubmVjdGVkIHRvCisJCQkgKi8KKwkJCU9sZFVuaXQgPSBUb3BQW1RoaXNMaW5rXS5Vbml0OworCQkJT2xkTGluayA9IFRvcFBbVGhpc0xpbmtdLkxpbms7CisKKwkJCS8qCisJCQkgKiogdGhpcyBpcyB3aGF0IGl0IGlzIG5vdyBjb25uZWN0ZWQgdG8KKwkJCSAqLworCQkJTmV3VW5pdCA9IFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbVGhpc0xpbmtdLlVuaXQpOworCQkJTmV3TGluayA9IFJCWVRFKFBrdENtZFAtPlJvdXRlVG9wb2xvZ3lbVGhpc0xpbmtdLkxpbmspOworCisJCQlpZiAoT2xkVW5pdCAhPSBOZXdVbml0IHx8IE9sZExpbmsgIT0gTmV3TGluaykgeworCQkJCS8qCisJCQkJICoqIHNvbWV0aGluZyBoYXMgY2hhbmdlZCEKKwkJCQkgKi8KKworCQkJCWlmIChOZXdVbml0ID4gTUFYX1JVUCAmJiBOZXdVbml0ICE9IFJPVVRFX0RJU0NPTk5FQ1QgJiYgTmV3VW5pdCAhPSBST1VURV9OT19JRCAmJiBOZXdVbml0ICE9IFJPVVRFX0lOVEVSQ09OTkVDVCkgeworCQkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUk9VVEUsICJJIGhhdmUgYSBsaW5rIGZyb20gJXMgJXMgdG8gdW5pdCAlZDolZCAtIEkgZG9uJ3QgbGlrZSBpdC5cbiIsIE15VHlwZSwgTXlOYW1lLCBOZXdVbml0LCBOZXdMaW5rKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiogcHV0IHRoZSBuZXcgdmFsdWVzIGluCisJCQkJCSAqLworCQkJCQlUb3BQW1RoaXNMaW5rXS5Vbml0ID0gTmV3VW5pdDsKKwkJCQkJVG9wUFtUaGlzTGlua10uTGluayA9IE5ld0xpbms7CisKKwkJCQkJUklPU2V0Q2hhbmdlKHApOworCisJCQkJCWlmIChPbGRVbml0IDw9IE1BWF9SVVApIHsKKwkJCQkJCS8qCisJCQkJCQkgKiogSWYgc29tZXRoaW5nIGhhcyBiZWNvbWUgYnVzdCwgdGhlbiByZS1lbmFibGUgdGhlbSBtZXNzYWdlcworCQkJCQkJICovCisJCQkJCQlpZiAoIXAtPlJJT05vTWVzc2FnZSkKKwkJCQkJCQlSSU9Db25Db24ocCwgSG9zdFAsIFRoaXNVbml0LCBUaGlzTGluaywgT2xkVW5pdCwgT2xkTGluaywgRElTQ09OTkVDVCk7CisJCQkJCX0KKworCQkJCQlpZiAoKE5ld1VuaXQgPD0gTUFYX1JVUCkgJiYgIXAtPlJJT05vTWVzc2FnZSkKKwkJCQkJCVJJT0NvbkNvbihwLCBIb3N0UCwgVGhpc1VuaXQsIFRoaXNMaW5rLCBOZXdVbml0LCBOZXdMaW5rLCBDT05ORUNUKTsKKworCQkJCQlpZiAoTmV3VW5pdCA9PSBST1VURV9OT19JRCkKKwkJCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19ST1VURSwgIiVzICVzICglYykgaXMgY29ubmVjdGVkIHRvIGFuIHVuY29uZmlndXJlZCB1bml0LlxuIiwgTXlUeXBlLCBNeU5hbWUsICdBJyArIFRoaXNMaW5rKTsKKworCQkJCQlpZiAoTmV3VW5pdCA9PSBST1VURV9JTlRFUkNPTk5FQ1QpIHsKKwkJCQkJCWlmICghcC0+UklPTm9NZXNzYWdlKQorCQkJCQkJCWNwcmludGYoIiVzICclcycgKCVjKSBpcyBjb25uZWN0ZWQgdG8gYW5vdGhlciBuZXR3b3JrLlxuIiwgTXlUeXBlLCBNeU5hbWUsICdBJyArIFRoaXNMaW5rKTsKKwkJCQkJfQorCisJCQkJCS8qCisJCQkJCSAqKiBwZXJmb3JtIGFuIHVwZGF0ZSBmb3IgJ3RoZSBvdGhlciBlbmQnLCBzbyB0aGF0IHRoZXNlIG1lc3NhZ2VzCisJCQkJCSAqKiBvbmx5IGFwcGVhcnMgb25jZS4gT25seSBkaXNjb25uZWN0IHRoZSBvdGhlciBlbmQgaWYgaXQgaXMgcG9pbnRpbmcKKwkJCQkJICoqIGF0IHVzIQorCQkJCQkgKi8KKwkJCQkJaWYgKE9sZFVuaXQgPT0gSE9TVF9JRCkgeworCQkJCQkJaWYgKEhvc3RQLT5Ub3BvbG9neVtPbGRMaW5rXS5Vbml0ID09IFRoaXNVbml0ICYmIEhvc3RQLT5Ub3BvbG9neVtPbGRMaW5rXS5MaW5rID09IFRoaXNMaW5rKSB7CisJCQkJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiU0VUVElORyBIT1NUICglYykgVE8gRElTQ09OTkVDVEVEIVxuIiwgT2xkTGluayArICdBJyk7CisJCQkJCQkJSG9zdFAtPlRvcG9sb2d5W09sZExpbmtdLlVuaXQgPSBST1VURV9ESVNDT05ORUNUOworCQkJCQkJCUhvc3RQLT5Ub3BvbG9neVtPbGRMaW5rXS5MaW5rID0gTk9fTElOSzsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiSE9TVCglYykgV0FTIE5PVCBDT05ORUNURUQgVE8gJXMgKCVjKSFcbiIsIE9sZExpbmsgKyAnQScsIEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0IC0gMV0uTmFtZSwgVGhpc0xpbmsgKyAnQScpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgaWYgKE9sZFVuaXQgPD0gTUFYX1JVUCkgeworCQkJCQkJaWYgKEhvc3RQLT5NYXBwaW5nW09sZFVuaXQgLSAxXS5Ub3BvbG9neVtPbGRMaW5rXS5Vbml0ID09IFRoaXNVbml0ICYmIEhvc3RQLT5NYXBwaW5nW09sZFVuaXQgLSAxXS5Ub3BvbG9neVtPbGRMaW5rXS5MaW5rID09IFRoaXNMaW5rKSB7CisJCQkJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiU0VUVElORyBSVEEgJXMgKCVjKSBUTyBESVNDT05ORUNURUQhXG4iLCBIb3N0UC0+TWFwcGluZ1tPbGRVbml0IC0gMV0uTmFtZSwgT2xkTGluayArICdBJyk7CisJCQkJCQkJSG9zdFAtPk1hcHBpbmdbT2xkVW5pdCAtIDFdLlRvcG9sb2d5W09sZExpbmtdLlVuaXQgPSBST1VURV9ESVNDT05ORUNUOworCQkJCQkJCUhvc3RQLT5NYXBwaW5nW09sZFVuaXQgLSAxXS5Ub3BvbG9neVtPbGRMaW5rXS5MaW5rID0gTk9fTElOSzsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiUlRBICVzICglYykgV0FTIE5PVCBDT05ORUNURUQgVE8gJXMgKCVjKVxuIiwgSG9zdFAtPk1hcHBpbmdbT2xkVW5pdCAtIDFdLk5hbWUsIE9sZExpbmsgKyAnQScsIEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0IC0gMV0uTmFtZSwgVGhpc0xpbmsgKyAnQScpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmIChOZXdVbml0ID09IEhPU1RfSUQpIHsKKwkJCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19ST1VURSwgIk1BUktJTkcgSE9TVCAoJWMpIENPTk5FQ1RFRCBUTyAlcyAoJWMpXG4iLCBOZXdMaW5rICsgJ0EnLCBNeU5hbWUsIFRoaXNMaW5rICsgJ0EnKTsKKwkJCQkJCUhvc3RQLT5Ub3BvbG9neVtOZXdMaW5rXS5Vbml0ID0gVGhpc1VuaXQ7CisJCQkJCQlIb3N0UC0+VG9wb2xvZ3lbTmV3TGlua10uTGluayA9IFRoaXNMaW5rOworCQkJCQl9IGVsc2UgaWYgKE5ld1VuaXQgPD0gTUFYX1JVUCkgeworCQkJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiTUFSS0lORyBSVEEgJXMgKCVjKSBDT05ORUNURUQgVE8gJXMgKCVjKVxuIiwgSG9zdFAtPk1hcHBpbmdbTmV3VW5pdCAtIDFdLk5hbWUsIE5ld0xpbmsgKyAnQScsIE15TmFtZSwgVGhpc0xpbmsgKyAnQScpOworCQkJCQkJSG9zdFAtPk1hcHBpbmdbTmV3VW5pdCAtIDFdLlRvcG9sb2d5W05ld0xpbmtdLlVuaXQgPSBUaGlzVW5pdDsKKwkJCQkJCUhvc3RQLT5NYXBwaW5nW05ld1VuaXQgLSAxXS5Ub3BvbG9neVtOZXdMaW5rXS5MaW5rID0gVGhpc0xpbms7CisJCQkJCX0KKwkJCQl9CisJCQkJUklPU2V0Q2hhbmdlKHApOworCQkJCVJJT0NoZWNrSXNvbGF0ZWQocCwgSG9zdFAsIE9sZFVuaXQpOworCQkJfQorCQl9CisJCXJldHVybiBUUlVFOwogCX0KLQllbHNlCi0JewotCSAgLyoKLQkgICoqIHB1dCB0aGUgbmV3IHZhbHVlcyBpbgotCSAgKi8KLQkgIFRvcFBbVGhpc0xpbmtdLlVuaXQgPSBOZXdVbml0OwotCSAgVG9wUFtUaGlzTGlua10uTGluayA9IE5ld0xpbms7CiAKLQkgIFJJT1NldENoYW5nZShwKTsKLQotCSAgaWYgKCBPbGRVbml0IDw9IE1BWF9SVVAgKQotCSAgewotCSAgICAvKgotCSAgICAqKiBJZiBzb21ldGhpbmcgaGFzIGJlY29tZSBidXN0LCB0aGVuIHJlLWVuYWJsZSB0aGVtIG1lc3NhZ2VzCi0JICAgICovCi0JICAgIGlmICghIHAtPlJJT05vTWVzc2FnZSkKLQkJUklPQ29uQ29uKHAsSG9zdFAsVGhpc1VuaXQsVGhpc0xpbmssT2xkVW5pdCxPbGRMaW5rLERJU0NPTk5FQ1QpOwotCSAgfQotCi0JICBpZiAoICggTmV3VW5pdCA8PSBNQVhfUlVQICkgJiYgIXAtPlJJT05vTWVzc2FnZSApCi0JICAgIFJJT0NvbkNvbihwLEhvc3RQLFRoaXNVbml0LFRoaXNMaW5rLE5ld1VuaXQsTmV3TGluayxDT05ORUNUKTsKLQotCSAgaWYgKCBOZXdVbml0ID09IFJPVVRFX05PX0lEICkKLQkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIiVzICVzICglYykgaXMgY29ubmVjdGVkIHRvIGFuIHVuY29uZmlndXJlZCB1bml0LlxuIiwKLQkJICAgIE15VHlwZSxNeU5hbWUsJ0EnK1RoaXNMaW5rKTsKLQotCSAgaWYgKCBOZXdVbml0ID09IFJPVVRFX0lOVEVSQ09OTkVDVCApCi0JICB7Ci0JICAgIGlmICghIHAtPlJJT05vTWVzc2FnZSkKLQkJY3ByaW50ZigiJXMgJyVzJyAoJWMpIGlzIGNvbm5lY3RlZCB0byBhbm90aGVyIG5ldHdvcmsuXG4iLCBNeVR5cGUsTXlOYW1lLCdBJytUaGlzTGluayk7Ci0JICB9Ci0KLQkgIC8qCi0JICAqKiBwZXJmb3JtIGFuIHVwZGF0ZSBmb3IgJ3RoZSBvdGhlciBlbmQnLCBzbyB0aGF0IHRoZXNlIG1lc3NhZ2VzCi0JICAqKiBvbmx5IGFwcGVhcnMgb25jZS4gT25seSBkaXNjb25uZWN0IHRoZSBvdGhlciBlbmQgaWYgaXQgaXMgcG9pbnRpbmcKLQkgICoqIGF0IHVzIQotCSAgKi8KLQkgIGlmICggT2xkVW5pdCA9PSBIT1NUX0lEICkKLQkgIHsKLQkgICAgaWYgKCBIb3N0UC0+VG9wb2xvZ3lbT2xkTGlua10uVW5pdCA9PSBUaGlzVW5pdCAmJgotCQkgSG9zdFAtPlRvcG9sb2d5W09sZExpbmtdLkxpbmsgPT0gVGhpc0xpbmsgKQotCSAgICB7Ci0JICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlNFVFRJTkcgSE9TVCAoJWMpIFRPIERJU0NPTk5FQ1RFRCFcbiIsIE9sZExpbmsrJ0EnKTsKLQkgICAgICBIb3N0UC0+VG9wb2xvZ3lbT2xkTGlua10uVW5pdCA9IFJPVVRFX0RJU0NPTk5FQ1Q7Ci0JICAgICAgSG9zdFAtPlRvcG9sb2d5W09sZExpbmtdLkxpbmsgPSBOT19MSU5LOwotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCSAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJIT1NUKCVjKSBXQVMgTk9UIENPTk5FQ1RFRCBUTyAlcyAoJWMpIVxuIiwKLQkJICAgIE9sZExpbmsrJ0EnLEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0LTFdLk5hbWUsVGhpc0xpbmsrJ0EnKTsKLQkgICAgfQotCSAgfQotCSAgZWxzZSBpZiAoIE9sZFVuaXQgPD0gTUFYX1JVUCApCi0JICB7Ci0JICAgIGlmICggSG9zdFAtPk1hcHBpbmdbT2xkVW5pdC0xXS5Ub3BvbG9neVtPbGRMaW5rXS5Vbml0ID09IFRoaXNVbml0ICYmCi0JICAgICAgICAgSG9zdFAtPk1hcHBpbmdbT2xkVW5pdC0xXS5Ub3BvbG9neVtPbGRMaW5rXS5MaW5rID09IFRoaXNMaW5rICkKLQkgICAgewotCSAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJTRVRUSU5HIFJUQSAlcyAoJWMpIFRPIERJU0NPTk5FQ1RFRCFcbiIsCi0JCQkJICAgSG9zdFAtPk1hcHBpbmdbT2xkVW5pdC0xXS5OYW1lLE9sZExpbmsrJ0EnKTsKLQkgICAgICBIb3N0UC0+TWFwcGluZ1tPbGRVbml0LTFdLlRvcG9sb2d5W09sZExpbmtdLlVuaXQ9Uk9VVEVfRElTQ09OTkVDVDsKLQkgICAgICBIb3N0UC0+TWFwcGluZ1tPbGRVbml0LTFdLlRvcG9sb2d5W09sZExpbmtdLkxpbms9Tk9fTElOSzsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiUlRBICVzICglYykgV0FTIE5PVCBDT05ORUNURUQgVE8gJXMgKCVjKVxuIiwKLQkJCSAgICBIb3N0UC0+TWFwcGluZ1tPbGRVbml0LTFdLk5hbWUsT2xkTGluaysnQScsCi0JCQkgICAgSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXQtMV0uTmFtZSxUaGlzTGluaysnQScpOwotCSAgICB9Ci0JICB9Ci0JICBpZiAoIE5ld1VuaXQgPT0gSE9TVF9JRCApCi0JICB7Ci0JICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJNQVJLSU5HIEhPU1QgKCVjKSBDT05ORUNURUQgVE8gJXMgKCVjKVxuIiwKLQkJCQlOZXdMaW5rKydBJyxNeU5hbWUsVGhpc0xpbmsrJ0EnKTsKLQkgICAgSG9zdFAtPlRvcG9sb2d5W05ld0xpbmtdLlVuaXQgPSBUaGlzVW5pdDsKLQkgICAgSG9zdFAtPlRvcG9sb2d5W05ld0xpbmtdLkxpbmsgPSBUaGlzTGluazsKLQkgIH0KLQkgIGVsc2UgaWYgKCBOZXdVbml0IDw9IE1BWF9SVVAgKQotCSAgewotCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiTUFSS0lORyBSVEEgJXMgKCVjKSBDT05ORUNURUQgVE8gJXMgKCVjKVxuIiwKLQkgICAgICBIb3N0UC0+TWFwcGluZ1tOZXdVbml0LTFdLk5hbWUsTmV3TGluaysnQScsTXlOYW1lLFRoaXNMaW5rKydBJyk7Ci0JICAgIEhvc3RQLT5NYXBwaW5nW05ld1VuaXQtMV0uVG9wb2xvZ3lbTmV3TGlua10uVW5pdD1UaGlzVW5pdDsKLQkgICAgSG9zdFAtPk1hcHBpbmdbTmV3VW5pdC0xXS5Ub3BvbG9neVtOZXdMaW5rXS5MaW5rPVRoaXNMaW5rOwotCSAgfQorCS8qCisJICoqIFRoZSBvbmx5IG90aGVyIGNvbW1hbmQgd2UgcmVjb2duaXNlIGlzIGEgcm91dGVfcmVxdWVzdCBjb21tYW5kCisJICovCisJaWYgKFJCWVRFKFBrdENtZFAtPkNvbW1hbmQpICE9IFJPVVRFX1JFUVVFU1QpIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiVW5rbm93biBjb21tYW5kICVkIHJlY2VpdmVkIG9uIHJ1cCAlZCBob3N0ICVkIFJPVVRFX1JVUFxuIiwgUkJZVEUoUGt0Q21kUC0+Q29tbWFuZCksIFJ1cCwgKGludCkgSG9zdFApOworCQlyZXR1cm4gVFJVRTsKIAl9Ci0JUklPU2V0Q2hhbmdlKHApOwotCVJJT0NoZWNrSXNvbGF0ZWQocCwgSG9zdFAsIE9sZFVuaXQgKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci0gIH0KIAotICAvKgotICAqKiBUaGUgb25seSBvdGhlciBjb21tYW5kIHdlIHJlY29nbmlzZSBpcyBhIHJvdXRlX3JlcXVlc3QgY29tbWFuZAotICAqLwotICBpZiAoIFJCWVRFKFBrdENtZFAtPkNvbW1hbmQpICE9IFJPVVRFX1JFUVVFU1QgKQotICB7Ci0gICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlVua25vd24gY29tbWFuZCAlZCByZWNlaXZlZCBvbiBydXAgJWQgaG9zdCAlZCBST1VURV9SVVBcbiIsIAotCSAgIFJCWVRFKFBrdENtZFAtPkNvbW1hbmQpLFJ1cCwoaW50KUhvc3RQKTsKLSAgICByZXR1cm4gVFJVRTsKLSAgfQotICAgICAgCi0gIFJ0YVVuaXEgPSAoUkJZVEUoUGt0Q21kUC0+VW5pcU51bVswXSkpICsKLQkgICAgKFJCWVRFKFBrdENtZFAtPlVuaXFOdW1bMV0pIDw8IDgpICsKLQkgICAgKFJCWVRFKFBrdENtZFAtPlVuaXFOdW1bMl0pIDw8IDE2KSArCi0JICAgIChSQllURShQa3RDbWRQLT5VbmlxTnVtWzNdKSA8PCAyNCk7CisJUnRhVW5pcSA9IChSQllURShQa3RDbWRQLT5VbmlxTnVtWzBdKSkgKyAoUkJZVEUoUGt0Q21kUC0+VW5pcU51bVsxXSkgPDwgOCkgKyAoUkJZVEUoUGt0Q21kUC0+VW5pcU51bVsyXSkgPDwgMTYpICsgKFJCWVRFKFBrdENtZFAtPlVuaXFOdW1bM10pIDw8IDI0KTsKIAotICAvKgotICAqKiBEZXRlcm1pbmUgaWYgOCBvciAxNiBwb3J0IFJUQQotICAqLwotICBSdGFUeXBlID0gR2V0VW5pdFR5cGUoUnRhVW5pcSk7CisJLyoKKwkgKiogRGV0ZXJtaW5lIGlmIDggb3IgMTYgcG9ydCBSVEEKKwkgKi8KKwlSdGFUeXBlID0gR2V0VW5pdFR5cGUoUnRhVW5pcSk7CiAKLSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlJlY2VpdmVkIGEgcmVxdWVzdCBmb3IgYW4gSUQgZm9yIHNlcmlhbCBudW1iZXIgJXhcbiIsIFJ0YVVuaXEpOworCXJpb19kcHJpbnRrKFJJT19ERUJVR19ST1VURSwgIlJlY2VpdmVkIGEgcmVxdWVzdCBmb3IgYW4gSUQgZm9yIHNlcmlhbCBudW1iZXIgJXhcbiIsIFJ0YVVuaXEpOwogCi0gIE1vZCA9IFJCWVRFKFBrdENtZFAtPk1vZHVsZVR5cGVzKTsKLSAgTW9kMSA9IExPTllCTEUoTW9kKTsKLSAgaWYgKFJ0YVR5cGUgPT0gVFlQRV9SVEExNikKLSAgewotICAgIC8qCi0gICAgKiogT25seSBvbmUgaWRlbnQgaXMgc2V0IGZvciBhIDE2IHBvcnQgUlRBLiBUbyBtYWtlIGNvbXBhdGlibGUKLSAgICAqKiB3aXRoIDggcG9ydCwgc2V0IDJuZCBpZGVudCBpbiBNb2QyIHRvIHRoZSBzYW1lIGFzIE1vZDEuCi0gICAgKi8KLSAgICBNb2QyID0gTW9kMTsKLSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiQmFja3BsYW5lIHR5cGUgaXMgJXMgKGFsbCBwb3J0cylcbiIsCi0gICAgIHAtPlJJT01vZHVsZVR5cGVzW01vZDFdLk5hbWUpOwotICB9Ci0gIGVsc2UKLSAgewotICAgIE1vZDIgPSBISU5ZQkxFKE1vZCk7Ci0gICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIk1vZHVsZSB0eXBlcyBhcmUgJXMgKHBvcnRzIDAtMykgYW5kICVzIChwb3J0cyA0LTcpXG4iLAotICAgICBwLT5SSU9Nb2R1bGVUeXBlc1tNb2QxXS5OYW1lLCBwLT5SSU9Nb2R1bGVUeXBlc1tNb2QyXS5OYW1lKTsKLSAgfQotCi0gIGlmICggUnRhVW5pcSA9PSAweGZmZmZmZmZmICkKLSAgewotICAgICAgU2hvd1BhY2tldCggREJHX1NQRUNJQUwsIFBhY2tldFAgKTsKLSAgfQotCi0gIC8qCi0gICoqIHRyeSB0byB1bmhvb2sgYSBjb21tYW5kIGJsb2NrIGZyb20gdGhlIGNvbW1hbmQgZnJlZSBsaXN0LgotICAqLwotICBpZiAoICEoQ21kQmxrUCA9IFJJT0dldENtZEJsaygpKSApCi0gIHsKLSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiTm8gY29tbWFuZCBibG9ja3MgdG8gcm91dGUgUlRBISBjb21lIGJhY2sgbGF0ZXIuXG4iKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qCi0gICoqIEZpbGwgaW4gdGhlIGRlZmF1bHQgaW5mbyBvbiB0aGUgY29tbWFuZCBibG9jawotICAqLwotICBDbWRCbGtQLT5QYWNrZXQuZGVzdF91bml0ID0gUnVwOwotICBDbWRCbGtQLT5QYWNrZXQuZGVzdF9wb3J0ID0gUk9VVEVfUlVQOwotICBDbWRCbGtQLT5QYWNrZXQuc3JjX3VuaXQgPSBIT1NUX0lEOwotICBDbWRCbGtQLT5QYWNrZXQuc3JjX3BvcnQgPSBST1VURV9SVVA7Ci0gIENtZEJsa1AtPlBhY2tldC5sZW4gPSBQS1RfQ01EX0JJVCB8IDE7Ci0gIENtZEJsa1AtPlByZUZ1bmNQID0gQ21kQmxrUC0+UG9zdEZ1bmNQID0gTlVMTDsKLSAgUGt0UmVwbHlQID0gKHN0cnVjdCBQa3RDbWRfTSAqKUNtZEJsa1AtPlBhY2tldC5kYXRhOwotCi0gIGlmICghIFJJT0Jvb3RPayhwLCBIb3N0UCwgUnRhVW5pcSkpCi0gIHsKLSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiUlRBICV4IHRyaWVkIHRvIGdldCBhbiBJRCwgYnV0IGRvZXMgbm90IGJlbG9uZyAtIEZPQUQgaXQhXG4iLAotCSAgUnRhVW5pcSk7Ci0gICAgUGt0UmVwbHlQLT5Db21tYW5kID0gUk9VVEVfRk9BRDsKLSAgICBIb3N0UC0+Q29weSgiUlRfRk9BRCIsIFBrdFJlcGx5UC0+Q29tbWFuZFRleHQsIDcpOwotICAgIFJJT1F1ZXVlQ21kQmxrKEhvc3RQLCBSdXAsIENtZEJsa1ApOwotICAgIHJldHVybiBUUlVFOwotICB9Ci0KLSAgLyoKLSAgKiogQ2hlY2sgdG8gc2VlIGlmIHRoZSBSVEEgaXMgY29uZmlndXJlZCBmb3IgdGhpcyBob3N0Ci0gICovCi0gIGZvciAoIFRoaXNVbml0PTA7IFRoaXNVbml0PE1BWF9SVVA7IFRoaXNVbml0KysgKQotICB7Ci0gICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIkVudHJ5ICVkIEZsYWdzPSVzICVzIFVuaXF1ZU51bT0weCV4XG4iLAotCQkJVGhpc1VuaXQsCi0JCQlIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uRmxhZ3MgJiBTTE9UX0lOX1VTRSA/Ci0JCQkJCSAgICAiU2xvdC1Jbi1Vc2UiOiJOb3QgSW4gVXNlIiwKLQkJCUhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5GbGFncyAmIFNMT1RfVEVOVEFUSVZFID8gCi0JCQkJCSAgICAiU2xvdC1UZW50YXRpdmUiOiJOb3QgVGVudGF0aXZlIiwKLQkJCUhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5SdGFVbmlxdWVOdW0pOwotCi0gICAgLyoKLSAgICAqKiBXZSBoYXZlIGFuIGVudHJ5IGZvciBpdC4KLSAgICAqLwotICAgIGlmICggKEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5GbGFncyAmIChTTE9UX0lOX1VTRSB8IFNMT1RfVEVOVEFUSVZFKSkgJiYKLSAgICAgICAgIChIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uUnRhVW5pcXVlTnVtID09IFJ0YVVuaXEpICkKLSAgICB7Ci0gICAgICBpZiAoUnRhVHlwZSA9PSBUWVBFX1JUQTE2KQotICAgICAgewotCSAgVGhpc1VuaXQyID0gSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLklEMiAtIDE7Ci0gICAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIkZvdW5kIHVuaXQgMHgleCBhdCBzbG90cyAlZCslZFxuIiwKLQkJCQkJICAgIFJ0YVVuaXEsVGhpc1VuaXQsVGhpc1VuaXQyKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiRm91bmQgdW5pdCAweCV4IGF0IHNsb3QgJWRcbiIsCi0JCQkJCSAgICBSdGFVbmlxLFRoaXNVbml0KTsKLSAgICAgIC8qCi0gICAgICAqKiBJZiB3ZSBoYXZlIG5vIGtub3dsZWRnZSBvZiBib290aW5nIGl0LCB0aGVuIHRoZSBob3N0IGhhcwotICAgICAgKiogYmVlbiByZS1ib290ZWQsIGFuZCBzbyB3ZSBtdXN0IGtpbGwgdGhlIFJUQSwgc28gdGhhdCBpdAotICAgICAgKiogd2lsbCBiZSBib290ZWQgYWdhaW4gKHBvdGVudGlhbGx5IHdpdGggbmV3IGJpbnMpCi0gICAgICAqKiBhbmQgaXQgd2lsbCB0aGVuIHJlLWFzayBmb3IgYW4gSUQsIHdoaWNoIHdlIHdpbGwgc2VydmljZS4KLSAgICAgICovCi0gICAgICBpZiAoIChIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uRmxhZ3MgJiBTTE9UX0lOX1VTRSkgJiYgCi0JICAhKEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5GbGFncyAmIFJUQV9CT09URUQpICkKLSAgICAgIHsKLQlpZiAoICEoSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLkZsYWdzICYgTVNHX0RPTkUpICkKLQl7Ci0JICAgIGlmICggIXAtPlJJT05vTWVzc2FnZSApCi0JICAgICAgICBjcHJpbnRmKCJSVEEgJyVzJyBpcyBiZWluZyB1cGRhdGVkLlxuIixIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uTmFtZSk7Ci0JICAgIEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5GbGFncyB8PSBNU0dfRE9ORTsKKwlNb2QgPSBSQllURShQa3RDbWRQLT5Nb2R1bGVUeXBlcyk7CisJTW9kMSA9IExPTllCTEUoTW9kKTsKKwlpZiAoUnRhVHlwZSA9PSBUWVBFX1JUQTE2KSB7CisJCS8qCisJCSAqKiBPbmx5IG9uZSBpZGVudCBpcyBzZXQgZm9yIGEgMTYgcG9ydCBSVEEuIFRvIG1ha2UgY29tcGF0aWJsZQorCQkgKiogd2l0aCA4IHBvcnQsIHNldCAybmQgaWRlbnQgaW4gTW9kMiB0byB0aGUgc2FtZSBhcyBNb2QxLgorCQkgKi8KKwkJTW9kMiA9IE1vZDE7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19ST1VURSwgIkJhY2twbGFuZSB0eXBlIGlzICVzIChhbGwgcG9ydHMpXG4iLCBwLT5SSU9Nb2R1bGVUeXBlc1tNb2QxXS5OYW1lKTsKKwl9IGVsc2UgeworCQlNb2QyID0gSElOWUJMRShNb2QpOworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUk9VVEUsICJNb2R1bGUgdHlwZXMgYXJlICVzIChwb3J0cyAwLTMpIGFuZCAlcyAocG9ydHMgNC03KVxuIiwgcC0+UklPTW9kdWxlVHlwZXNbTW9kMV0uTmFtZSwgcC0+UklPTW9kdWxlVHlwZXNbTW9kMl0uTmFtZSk7CiAJfQotCVBrdFJlcGx5UC0+Q29tbWFuZCA9IFJPVVRFX0ZPQUQ7Ci0JSG9zdFAtPkNvcHkoIlJUX0ZPQUQiLFBrdFJlcGx5UC0+Q29tbWFuZFRleHQsNyk7CisKKwlpZiAoUnRhVW5pcSA9PSAweGZmZmZmZmZmKSB7CisJCVNob3dQYWNrZXQoREJHX1NQRUNJQUwsIFBhY2tldFApOworCX0KKworCS8qCisJICoqIHRyeSB0byB1bmhvb2sgYSBjb21tYW5kIGJsb2NrIGZyb20gdGhlIGNvbW1hbmQgZnJlZSBsaXN0LgorCSAqLworCWlmICghKENtZEJsa1AgPSBSSU9HZXRDbWRCbGsoKSkpIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiTm8gY29tbWFuZCBibG9ja3MgdG8gcm91dGUgUlRBISBjb21lIGJhY2sgbGF0ZXIuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiogRmlsbCBpbiB0aGUgZGVmYXVsdCBpbmZvIG9uIHRoZSBjb21tYW5kIGJsb2NrCisJICovCisJQ21kQmxrUC0+UGFja2V0LmRlc3RfdW5pdCA9IFJ1cDsKKwlDbWRCbGtQLT5QYWNrZXQuZGVzdF9wb3J0ID0gUk9VVEVfUlVQOworCUNtZEJsa1AtPlBhY2tldC5zcmNfdW5pdCA9IEhPU1RfSUQ7CisJQ21kQmxrUC0+UGFja2V0LnNyY19wb3J0ID0gUk9VVEVfUlVQOworCUNtZEJsa1AtPlBhY2tldC5sZW4gPSBQS1RfQ01EX0JJVCB8IDE7CisJQ21kQmxrUC0+UHJlRnVuY1AgPSBDbWRCbGtQLT5Qb3N0RnVuY1AgPSBOVUxMOworCVBrdFJlcGx5UCA9IChzdHJ1Y3QgUGt0Q21kX00gKikgQ21kQmxrUC0+UGFja2V0LmRhdGE7CisKKwlpZiAoIVJJT0Jvb3RPayhwLCBIb3N0UCwgUnRhVW5pcSkpIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiUlRBICV4IHRyaWVkIHRvIGdldCBhbiBJRCwgYnV0IGRvZXMgbm90IGJlbG9uZyAtIEZPQUQgaXQhXG4iLCBSdGFVbmlxKTsKKwkJUGt0UmVwbHlQLT5Db21tYW5kID0gUk9VVEVfRk9BRDsKKwkJSG9zdFAtPkNvcHkoIlJUX0ZPQUQiLCBQa3RSZXBseVAtPkNvbW1hbmRUZXh0LCA3KTsKKwkJUklPUXVldWVDbWRCbGsoSG9zdFAsIFJ1cCwgQ21kQmxrUCk7CisJCXJldHVybiBUUlVFOworCX0KKworCS8qCisJICoqIENoZWNrIHRvIHNlZSBpZiB0aGUgUlRBIGlzIGNvbmZpZ3VyZWQgZm9yIHRoaXMgaG9zdAorCSAqLworCWZvciAoVGhpc1VuaXQgPSAwOyBUaGlzVW5pdCA8IE1BWF9SVVA7IFRoaXNVbml0KyspIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiRW50cnkgJWQgRmxhZ3M9JXMgJXMgVW5pcXVlTnVtPTB4JXhcbiIsCisJCQkgICAgVGhpc1VuaXQsIEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5GbGFncyAmIFNMT1RfSU5fVVNFID8gIlNsb3QtSW4tVXNlIiA6ICJOb3QgSW4gVXNlIiwgSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLkZsYWdzICYgU0xPVF9URU5UQVRJVkUgPyAiU2xvdC1UZW50YXRpdmUiIDogIk5vdCBUZW50YXRpdmUiLCBIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uUnRhVW5pcXVlTnVtKTsKKworCQkvKgorCQkgKiogV2UgaGF2ZSBhbiBlbnRyeSBmb3IgaXQuCisJCSAqLworCQlpZiAoKEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5GbGFncyAmIChTTE9UX0lOX1VTRSB8IFNMT1RfVEVOVEFUSVZFKSkgJiYgKEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5SdGFVbmlxdWVOdW0gPT0gUnRhVW5pcSkpIHsKKwkJCWlmIChSdGFUeXBlID09IFRZUEVfUlRBMTYpIHsKKwkJCQlUaGlzVW5pdDIgPSBIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uSUQyIC0gMTsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUk9VVEUsICJGb3VuZCB1bml0IDB4JXggYXQgc2xvdHMgJWQrJWRcbiIsIFJ0YVVuaXEsIFRoaXNVbml0LCBUaGlzVW5pdDIpOworCQkJfSBlbHNlCisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiRm91bmQgdW5pdCAweCV4IGF0IHNsb3QgJWRcbiIsIFJ0YVVuaXEsIFRoaXNVbml0KTsKKwkJCS8qCisJCQkgKiogSWYgd2UgaGF2ZSBubyBrbm93bGVkZ2Ugb2YgYm9vdGluZyBpdCwgdGhlbiB0aGUgaG9zdCBoYXMKKwkJCSAqKiBiZWVuIHJlLWJvb3RlZCwgYW5kIHNvIHdlIG11c3Qga2lsbCB0aGUgUlRBLCBzbyB0aGF0IGl0CisJCQkgKiogd2lsbCBiZSBib290ZWQgYWdhaW4gKHBvdGVudGlhbGx5IHdpdGggbmV3IGJpbnMpCisJCQkgKiogYW5kIGl0IHdpbGwgdGhlbiByZS1hc2sgZm9yIGFuIElELCB3aGljaCB3ZSB3aWxsIHNlcnZpY2UuCisJCQkgKi8KKwkJCWlmICgoSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLkZsYWdzICYgU0xPVF9JTl9VU0UpICYmICEoSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLkZsYWdzICYgUlRBX0JPT1RFRCkpIHsKKwkJCQlpZiAoIShIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uRmxhZ3MgJiBNU0dfRE9ORSkpIHsKKwkJCQkJaWYgKCFwLT5SSU9Ob01lc3NhZ2UpCisJCQkJCQljcHJpbnRmKCJSVEEgJyVzJyBpcyBiZWluZyB1cGRhdGVkLlxuIiwgSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLk5hbWUpOworCQkJCQlIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uRmxhZ3MgfD0gTVNHX0RPTkU7CisJCQkJfQorCQkJCVBrdFJlcGx5UC0+Q29tbWFuZCA9IFJPVVRFX0ZPQUQ7CisJCQkJSG9zdFAtPkNvcHkoIlJUX0ZPQUQiLCBQa3RSZXBseVAtPkNvbW1hbmRUZXh0LCA3KTsKKwkJCQlSSU9RdWV1ZUNtZEJsayhIb3N0UCwgUnVwLCBDbWRCbGtQKTsKKwkJCQlyZXR1cm4gVFJVRTsKKwkJCX0KKworCQkJLyoKKwkJCSAqKiBTZW5kIHRoZSBJRCAoZW50cnkpIHRvIHRoaXMgUlRBLiBUaGUgSUQgbnVtYmVyIGlzIGltcGxpY2l0IGFzCisJCQkgKiogdGhlIG9mZnNldCBpbnRvIHRoZSB0YWJsZS4gSXQgaXMgd29ydGggbm90aW5nIGF0IHRoaXMgc3RhZ2UKKwkJCSAqKiB0aGF0IG9mZnNldCB6ZXJvIGluIHRoZSB0YWJsZSBjb250YWlucyB0aGUgZW50cmllcyBmb3IgdGhlCisJCQkgKiogUlRBIHdpdGggSUQgMSEhISEKKwkJCSAqLworCQkJUGt0UmVwbHlQLT5Db21tYW5kID0gUk9VVEVfQUxMT0NBVEU7CisJCQlQa3RSZXBseVAtPklETnVtID0gVGhpc1VuaXQgKyAxOworCQkJaWYgKFJ0YVR5cGUgPT0gVFlQRV9SVEExNikgeworCQkJCWlmIChIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uRmxhZ3MgJiBTTE9UX0lOX1VTRSkKKwkJCQkJLyoKKwkJCQkJICoqIEFkanVzdCB0aGUgcGhiIGFuZCB0eCBwa3QgZGVzdF91bml0cyBmb3IgMm5kIGJsb2NrIG9mIDgKKwkJCQkJICoqIG9ubHkgaWYgdGhlIFJUQSBoYXMgcG9ydHMgYXNzb2NpYXRlZCAoU0xPVF9JTl9VU0UpCisJCQkJCSAqLworCQkJCQlSSU9GaXhQaGJzKHAsIEhvc3RQLCBUaGlzVW5pdDIpOworCQkJCVBrdFJlcGx5UC0+SUROdW0yID0gVGhpc1VuaXQyICsgMTsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUk9VVEUsICJSVEEgJyVzJyBoYXMgYmVlbiBhbGxvY2F0ZWQgSURzICVkKyVkXG4iLCBIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uTmFtZSwgUGt0UmVwbHlQLT5JRE51bSwgUGt0UmVwbHlQLT5JRE51bTIpOworCQkJfSBlbHNlIHsKKwkJCQlQa3RSZXBseVAtPklETnVtMiA9IFJPVVRFX05PX0lEOworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19ST1VURSwgIlJUQSAnJXMnIGhhcyBiZWVuIGFsbG9jYXRlZCBJRCAlZFxuIiwgSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLk5hbWUsIFBrdFJlcGx5UC0+SUROdW0pOworCQkJfQorCQkJSG9zdFAtPkNvcHkoIlJUX0FMTE9DQVQiLCBQa3RSZXBseVAtPkNvbW1hbmRUZXh0LCAxMCk7CisKKwkJCVJJT1F1ZXVlQ21kQmxrKEhvc3RQLCBSdXAsIENtZEJsa1ApOworCisJCQkvKgorCQkJICoqIElmIHRoaXMgaXMgYSBmcmVzaGx5IGJvb3RlZCBSVEEsIHRoZW4gd2UgbmVlZCB0byByZS1vcGVuCisJCQkgKiogdGhlIHBvcnRzLCBpZiBhbnkgd2hlcmUgb3Blbiwgc28gdGhhdCBkYXRhIG1heSBvbmNlIG1vcmUKKwkJCSAqKiBmbG93IGFyb3VuZCB0aGUgc3lzdGVtIQorCQkJICovCisJCQlpZiAoKEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5GbGFncyAmIFJUQV9ORVdCT09UKSAmJiAoSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLlN5c1BvcnQgIT0gTk9fUE9SVCkpIHsKKwkJCQkvKgorCQkJCSAqKiBsb29rIGF0IHRoZSBwb3J0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBiZWFzdCBhbmQKKwkJCQkgKiogc2VlIGlmIGFueSB3aGVyZSBvcGVuLiBJZiB0aGV5IHdhcywgdGhlbiByZS1vcGVuCisJCQkJICoqIHRoZW0sIHVzaW5nIHRoZSBpbmZvIGZyb20gdGhlIHR0eSBmbGFncy4KKwkJCQkgKi8KKwkJCQlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgUE9SVFNfUEVSX1JUQTsgcG9ydCsrKSB7CisJCQkJCVBvcnRQID0gcC0+UklPUG9ydHBbcG9ydCArIEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5TeXNQb3J0XTsKKwkJCQkJaWYgKFBvcnRQLT5TdGF0ZSAmIChSSU9fTU9QRU4gfCBSSU9fTE9QRU4pKSB7CisJCQkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUk9VVEUsICJSZS1vcGVuZWQgdGhpcyBwb3J0XG4iKTsKKwkJCQkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQkJCVBvcnRQLT5NYWdpY0ZsYWdzIHw9IE1BR0lDX1JFQk9PVDsKKwkJCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChSdGFUeXBlID09IFRZUEVfUlRBMTYpIHsKKwkJCQkJZm9yIChwb3J0ID0gMDsgcG9ydCA8IFBPUlRTX1BFUl9SVEE7IHBvcnQrKykgeworCQkJCQkJUG9ydFAgPSBwLT5SSU9Qb3J0cFtwb3J0ICsgSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXQyXS5TeXNQb3J0XTsKKwkJCQkJCWlmIChQb3J0UC0+U3RhdGUgJiAoUklPX01PUEVOIHwgUklPX0xPUEVOKSkgeworCQkJCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19ST1VURSwgIlJlLW9wZW5lZCB0aGlzIHBvcnRcbiIpOworCQkJCQkJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQkJCQlQb3J0UC0+TWFnaWNGbGFncyB8PSBNQUdJQ19SRUJPT1Q7CisJCQkJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8qCisJCQkgKioga2VlcCBhIGNvcHkgb2YgdGhlIG1vZHVsZSB0eXBlcyEKKwkJCSAqLworCQkJSG9zdFAtPlVuaXhSdXBzW1RoaXNVbml0XS5Nb2RUeXBlcyA9IE1vZDsKKwkJCWlmIChSdGFUeXBlID09IFRZUEVfUlRBMTYpCisJCQkJSG9zdFAtPlVuaXhSdXBzW1RoaXNVbml0Ml0uTW9kVHlwZXMgPSBNb2Q7CisKKwkJCS8qCisJCQkgKiogSWYgZWl0aGVyIG9mIHRoZSBtb2R1bGVzIG9uIHRoaXMgdW5pdCBpcyByZWFkLW9ubHkgb3Igd3JpdGUtb25seQorCQkJICoqIG9yIG5vbmUteHByaW50LCB0aGVuIHdlIG5lZWQgdG8gdHJhbnNmZXIgdGhhdCBpbmZvIG92ZXIgdG8gdGhlCisJCQkgKiogcmVsZXZhbnQgcG9ydHMuCisJCQkgKi8KKwkJCWlmIChIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uU3lzUG9ydCAhPSBOT19QT1JUKSB7CisJCQkJZm9yIChwb3J0ID0gMDsgcG9ydCA8IFBPUlRTX1BFUl9NT0RVTEU7IHBvcnQrKykgeworCQkJCQlwLT5SSU9Qb3J0cFtwb3J0ICsgSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLlN5c1BvcnRdLT5Db25maWcgJj0gflJJT19OT01BU0s7CisJCQkJCXAtPlJJT1BvcnRwW3BvcnQgKyBIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uU3lzUG9ydF0tPkNvbmZpZyB8PSBwLT5SSU9Nb2R1bGVUeXBlc1tNb2QxXS5GbGFnc1twb3J0XTsKKwkJCQkJcC0+UklPUG9ydHBbcG9ydCArIFBPUlRTX1BFUl9NT0RVTEUgKyBIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uU3lzUG9ydF0tPkNvbmZpZyAmPSB+UklPX05PTUFTSzsKKwkJCQkJcC0+UklPUG9ydHBbcG9ydCArIFBPUlRTX1BFUl9NT0RVTEUgKyBIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uU3lzUG9ydF0tPkNvbmZpZyB8PSBwLT5SSU9Nb2R1bGVUeXBlc1tNb2QyXS5GbGFnc1twb3J0XTsKKwkJCQl9CisJCQkJaWYgKFJ0YVR5cGUgPT0gVFlQRV9SVEExNikgeworCQkJCQlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgUE9SVFNfUEVSX01PRFVMRTsgcG9ydCsrKSB7CisJCQkJCQlwLT5SSU9Qb3J0cFtwb3J0ICsgSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXQyXS5TeXNQb3J0XS0+Q29uZmlnICY9IH5SSU9fTk9NQVNLOworCQkJCQkJcC0+UklPUG9ydHBbcG9ydCArIEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0Ml0uU3lzUG9ydF0tPkNvbmZpZyB8PSBwLT5SSU9Nb2R1bGVUeXBlc1tNb2QxXS5GbGFnc1twb3J0XTsKKwkJCQkJCXAtPlJJT1BvcnRwW3BvcnQgKyBQT1JUU19QRVJfTU9EVUxFICsgSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXQyXS5TeXNQb3J0XS0+Q29uZmlnICY9IH5SSU9fTk9NQVNLOworCQkJCQkJcC0+UklPUG9ydHBbcG9ydCArIFBPUlRTX1BFUl9NT0RVTEUgKyBIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdDJdLlN5c1BvcnRdLT5Db25maWcgfD0gcC0+UklPTW9kdWxlVHlwZXNbTW9kMl0uRmxhZ3NbcG9ydF07CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8qCisJCQkgKiogSm9iIGRvbmUsIGdldCBvbiB3aXRoIHRoZSBpbnRlcnJ1cHRzIQorCQkJICovCisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCX0KKwkvKgorCSAqKiBUaGVyZSBpcyBubyB0YWJsZSBlbnRyeSBmb3IgdGhpcyBSVEEgYXQgYWxsLgorCSAqKgorCSAqKiBMZXRzIGNoZWNrIHRvIHNlZSBpZiB3ZSBhY3R1YWxseSBib290ZWQgdGhpcyB1bml0IC0gaWYgbm90LAorCSAqKiB0aGVuIHdlIHJlc2V0IGl0IGFuZCBpdCB3aWxsIGdvIHJvdW5kIHRoZSBsb29wIG9mIGJlaW5nIGJvb3RlZAorCSAqKiB3ZSBjYW4gdGhlbiB3b3JyeSBhYm91dCB0cnlpbmcgdG8gZml0IGl0IGludG8gdGhlIHRhYmxlLgorCSAqLworCWZvciAoVGhpc1VuaXQgPSAwOyBUaGlzVW5pdCA8IEhvc3RQLT5OdW1FeHRyYUJvb3RlZDsgVGhpc1VuaXQrKykKKwkJaWYgKEhvc3RQLT5FeHRyYVVuaXRzW1RoaXNVbml0XSA9PSBSdGFVbmlxKQorCQkJYnJlYWs7CisJaWYgKFRoaXNVbml0ID09IEhvc3RQLT5OdW1FeHRyYUJvb3RlZCAmJiBUaGlzVW5pdCAhPSBNQVhfRVhUUkFfVU5JVFMpIHsKKwkJLyoKKwkJICoqIGlmIHRoZSB1bml0IHdhc24ndCBpbiB0aGUgdGFibGUsIGFuZCB0aGUgdGFibGUgd2Fzbid0IGZ1bGwsIHRoZW4KKwkJICoqIHdlIHJlc2V0IHRoZSB1bml0LCBiZWNhdXNlIHdlIGRpZG4ndCBib290IGl0LgorCQkgKiogSG93ZXZlciwgaWYgdGhlIHRhYmxlIGlzIGZ1bGwsIGl0IGNvdWxkIGJlIHRoYXQgd2UgZGlkIGJvb3QKKwkJICoqIHRoaXMgdW5pdCwgYW5kIHNvIHdlIHdvbid0IHJlYm9vdCBpdCwgYmVjYXVzZSBpdCBpc24ndCByZWFsbHkKKwkJICoqIGFsbCB0aGF0IGRpc2FzdGVyb3VzIHRvIGtlZXAgdGhlIG9sZCBiaW5zIGluIG1vc3QgY2FzZXMuIFRoaXMKKwkJICoqIGlzIGEgcmF0aGVyIHRhY2t5IGZlYXR1cmUsIGJ1dCB3ZSBhcmUgb24gdGhlIGVkZ2Ugb2YgcmVhbGxpdHkKKwkJICoqIGhlcmUsIGJlY2F1c2UgdGhlIGltcGxpY2F0aW9uIGlzIHRoYXQgc29tZW9uZSBoYXMgY29ubmVjdGVkCisJCSAqKiAxNitNQVhfRVhUUkFfVU5JVFMgb250byBvbmUgaG9zdC4KKwkJICovCisJCXN0YXRpYyBpbnQgVW5rbm93bk1lc2dEb25lID0gMDsKKworCQlpZiAoIVVua25vd25NZXNnRG9uZSkgeworCQkJaWYgKCFwLT5SSU9Ob01lc3NhZ2UpCisJCQkJY3ByaW50ZigiT25lIG9yIG1vcmUgdW5rbm93biBSVEFzIGFyZSBiZWluZyB1cGRhdGVkLlxuIik7CisJCQlVbmtub3duTWVzZ0RvbmUgPSAxOworCQl9CisKKwkJUGt0UmVwbHlQLT5Db21tYW5kID0gUk9VVEVfRk9BRDsKKwkJSG9zdFAtPkNvcHkoIlJUX0ZPQUQiLCBQa3RSZXBseVAtPkNvbW1hbmRUZXh0LCA3KTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiogd2UgZGlkIGJvb3QgaXQgKGFzIGFuIGV4dHJhKSwgYW5kIHRoZXJlIG1heSBub3cgYmUgYSB0YWJsZQorCQkgKiogc2xvdCBmcmVlIChiZWNhdXNlIG9mIGEgZGVsZXRlKSwgc28gd2Ugd2lsbCB0cnkgdG8gbWFrZQorCQkgKiogYSB0ZW50YXRpdmUgZW50cnkgZm9yIGl0LCBzbyB0aGF0IHRoZSBjb25maWd1cmF0b3IgY2FuIHNlZSBpdAorCQkgKiogYW5kIGZpbGwgaW4gdGhlIGRldGFpbHMgZm9yIHVzLgorCQkgKi8KKwkJaWYgKFJ0YVR5cGUgPT0gVFlQRV9SVEExNikgeworCQkJaWYgKFJJT0ZpbmRGcmVlSUQocCwgSG9zdFAsICZUaGlzVW5pdCwgJlRoaXNVbml0MikgPT0gMCkgeworCQkJCVJJT0RlZmF1bHROYW1lKHAsIEhvc3RQLCBUaGlzVW5pdCk7CisJCQkJRmlsbFNsb3QoVGhpc1VuaXQsIFRoaXNVbml0MiwgUnRhVW5pcSwgSG9zdFApOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKFJJT0ZpbmRGcmVlSUQocCwgSG9zdFAsICZUaGlzVW5pdCwgTlVMTCkgPT0gMCkgeworCQkJCVJJT0RlZmF1bHROYW1lKHAsIEhvc3RQLCBUaGlzVW5pdCk7CisJCQkJRmlsbFNsb3QoVGhpc1VuaXQsIDAsIFJ0YVVuaXEsIEhvc3RQKTsKKwkJCX0KKwkJfQorCQlQa3RSZXBseVAtPkNvbW1hbmQgPSBST1VURV9VU0VEOworCQlIb3N0UC0+Q29weSgiUlRfVVNFRCIsIFBrdFJlcGx5UC0+Q29tbWFuZFRleHQsIDcpOworCX0KIAlSSU9RdWV1ZUNtZEJsayhIb3N0UCwgUnVwLCBDbWRCbGtQKTsKIAlyZXR1cm4gVFJVRTsKLSAgICAgIH0KLQotICAgICAgLyoKLSAgICAgICoqIFNlbmQgdGhlIElEIChlbnRyeSkgdG8gdGhpcyBSVEEuIFRoZSBJRCBudW1iZXIgaXMgaW1wbGljaXQgYXMKLSAgICAgICoqIHRoZSBvZmZzZXQgaW50byB0aGUgdGFibGUuIEl0IGlzIHdvcnRoIG5vdGluZyBhdCB0aGlzIHN0YWdlCi0gICAgICAqKiB0aGF0IG9mZnNldCB6ZXJvIGluIHRoZSB0YWJsZSBjb250YWlucyB0aGUgZW50cmllcyBmb3IgdGhlCi0gICAgICAqKiBSVEEgd2l0aCBJRCAxISEhIQotICAgICAgKi8KLSAgICAgIFBrdFJlcGx5UC0+Q29tbWFuZCA9IFJPVVRFX0FMTE9DQVRFOwotICAgICAgUGt0UmVwbHlQLT5JRE51bSAgID0gVGhpc1VuaXQrMTsKLSAgICAgIGlmIChSdGFUeXBlID09IFRZUEVfUlRBMTYpCi0gICAgICB7Ci0gICAgICAgIGlmIChIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uRmxhZ3MgJiBTTE9UX0lOX1VTRSkKLQkgICAgLyoKLQkgICAgKiogQWRqdXN0IHRoZSBwaGIgYW5kIHR4IHBrdCBkZXN0X3VuaXRzIGZvciAybmQgYmxvY2sgb2YgOAotCSAgICAqKiBvbmx5IGlmIHRoZSBSVEEgaGFzIHBvcnRzIGFzc29jaWF0ZWQgKFNMT1RfSU5fVVNFKQotCSAgICAqLwotCSAgICBSSU9GaXhQaGJzKHAsIEhvc3RQLCBUaGlzVW5pdDIpOwotCSAgICBQa3RSZXBseVAtPklETnVtMiAgPSBUaGlzVW5pdDIrMTsKLQkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlJUQSAnJXMnIGhhcyBiZWVuIGFsbG9jYXRlZCBJRHMgJWQrJWRcbiIsCi0JICAgICAgICAgIEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5OYW1lLCBQa3RSZXBseVAtPklETnVtLCBQa3RSZXBseVAtPklETnVtMik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0JICAgIFBrdFJlcGx5UC0+SUROdW0yID0gUk9VVEVfTk9fSUQ7Ci0JICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJSVEEgJyVzJyBoYXMgYmVlbiBhbGxvY2F0ZWQgSUQgJWRcbiIsCi0JICAgICAgICAgIEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5OYW1lLFBrdFJlcGx5UC0+SUROdW0pOwotICAgICAgfQotICAgICAgSG9zdFAtPkNvcHkoIlJUX0FMTE9DQVQiLFBrdFJlcGx5UC0+Q29tbWFuZFRleHQsMTApOwotCi0gICAgICBSSU9RdWV1ZUNtZEJsayggSG9zdFAsIFJ1cCwgQ21kQmxrUCk7Ci0KLSAgICAgIC8qCi0gICAgICAqKiBJZiB0aGlzIGlzIGEgZnJlc2hseSBib290ZWQgUlRBLCB0aGVuIHdlIG5lZWQgdG8gcmUtb3BlbgotICAgICAgKiogdGhlIHBvcnRzLCBpZiBhbnkgd2hlcmUgb3Blbiwgc28gdGhhdCBkYXRhIG1heSBvbmNlIG1vcmUKLSAgICAgICoqIGZsb3cgYXJvdW5kIHRoZSBzeXN0ZW0hCi0gICAgICAqLwotICAgICAgaWYgKCAoSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLkZsYWdzICYgUlRBX05FV0JPT1QpICYmCi0JICAgKEhvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5TeXNQb3J0ICE9IE5PX1BPUlQpICkKLSAgICAgIHsKLQkvKgotCSoqIGxvb2sgYXQgdGhlIHBvcnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJlYXN0IGFuZAotCSoqIHNlZSBpZiBhbnkgd2hlcmUgb3Blbi4gSWYgdGhleSB3YXMsIHRoZW4gcmUtb3BlbgotCSoqIHRoZW0sIHVzaW5nIHRoZSBpbmZvIGZyb20gdGhlIHR0eSBmbGFncy4KLQkqLwotCWZvciAoIHBvcnQ9MDsgcG9ydDxQT1JUU19QRVJfUlRBOyBwb3J0KysgKQotCXsKLQkgIFBvcnRQID0gcC0+UklPUG9ydHBbcG9ydCtIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdF0uU3lzUG9ydF07Ci0JICBpZiAoIFBvcnRQLT5TdGF0ZSAmIChSSU9fTU9QRU58UklPX0xPUEVOKSApCi0JICB7Ci0JICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJSZS1vcGVuZWQgdGhpcyBwb3J0XG4iKTsKLQkgICAgcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwotCSAgICBQb3J0UC0+TWFnaWNGbGFncyB8PSBNQUdJQ19SRUJPT1Q7Ci0JICAgIHJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwotCSAgfQotCX0KLQlpZiAoUnRhVHlwZSA9PSBUWVBFX1JUQTE2KQotCXsKLQkgIGZvciAoIHBvcnQ9MDsgcG9ydDxQT1JUU19QRVJfUlRBOyBwb3J0KysgKQotCSAgewotCSAgICBQb3J0UCA9IHAtPlJJT1BvcnRwW3BvcnQrSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXQyXS5TeXNQb3J0XTsKLQkgICAgaWYgKCBQb3J0UC0+U3RhdGUgJiAoUklPX01PUEVOfFJJT19MT1BFTikgKQotCSAgICB7Ci0JICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlJlLW9wZW5lZCB0aGlzIHBvcnRcbiIpOwotCSAgICAgIHJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKLQkgICAgICBQb3J0UC0+TWFnaWNGbGFncyB8PSBNQUdJQ19SRUJPT1Q7Ci0JICAgICAgcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JICAgIH0KLQkgIH0KLQl9Ci0gICAgICB9Ci0KLSAgICAgIC8qCi0gICAgICAqKiBrZWVwIGEgY29weSBvZiB0aGUgbW9kdWxlIHR5cGVzIQotICAgICAgKi8KLSAgICAgIEhvc3RQLT5Vbml4UnVwc1tUaGlzVW5pdF0uTW9kVHlwZXMgPSBNb2Q7Ci0gICAgICBpZiAoUnRhVHlwZSA9PSBUWVBFX1JUQTE2KQotCSAgICAgIEhvc3RQLT5Vbml4UnVwc1tUaGlzVW5pdDJdLk1vZFR5cGVzID0gTW9kOwotCi0gICAgICAvKgotICAgICAgKiogSWYgZWl0aGVyIG9mIHRoZSBtb2R1bGVzIG9uIHRoaXMgdW5pdCBpcyByZWFkLW9ubHkgb3Igd3JpdGUtb25seQotICAgICAgKiogb3Igbm9uZS14cHJpbnQsIHRoZW4gd2UgbmVlZCB0byB0cmFuc2ZlciB0aGF0IGluZm8gb3ZlciB0byB0aGUKLSAgICAgICoqIHJlbGV2YW50IHBvcnRzLgotICAgICAgKi8KLSAgICAgIGlmICggSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLlN5c1BvcnQgIT0gTk9fUE9SVCApCi0gICAgICB7Ci0gICAgICAgIGZvciAoIHBvcnQ9MDsgcG9ydDxQT1JUU19QRVJfTU9EVUxFOyBwb3J0KysgKQotCXsKLQkgIHAtPlJJT1BvcnRwW3BvcnQrSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLlN5c1BvcnRdLT5Db25maWcgJj0gflJJT19OT01BU0s7Ci0JICBwLT5SSU9Qb3J0cFtwb3J0K0hvc3RQLT5NYXBwaW5nW1RoaXNVbml0XS5TeXNQb3J0XS0+Q29uZmlnIHw9Ci0JICAgcC0+UklPTW9kdWxlVHlwZXNbTW9kMV0uRmxhZ3NbcG9ydF07Ci0JICBwLT5SSU9Qb3J0cFtwb3J0K1BPUlRTX1BFUl9NT0RVTEUrSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLlN5c1BvcnRdLT5Db25maWcgJj0gflJJT19OT01BU0s7Ci0JICBwLT5SSU9Qb3J0cFtwb3J0K1BPUlRTX1BFUl9NT0RVTEUrSG9zdFAtPk1hcHBpbmdbVGhpc1VuaXRdLlN5c1BvcnRdLT5Db25maWcgfD0gcC0+UklPTW9kdWxlVHlwZXNbTW9kMl0uRmxhZ3NbcG9ydF07Ci0JfQotCWlmIChSdGFUeXBlID09IFRZUEVfUlRBMTYpCi0JewotICAgICAgICAgIGZvciAoIHBvcnQ9MDsgcG9ydDxQT1JUU19QRVJfTU9EVUxFOyBwb3J0KysgKQotCSAgewotCSAgICBwLT5SSU9Qb3J0cFtwb3J0K0hvc3RQLT5NYXBwaW5nW1RoaXNVbml0Ml0uU3lzUG9ydF0tPkNvbmZpZyAmPSB+UklPX05PTUFTSzsKLQkgICAgcC0+UklPUG9ydHBbcG9ydCtIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdDJdLlN5c1BvcnRdLT5Db25maWcgfD0gcC0+UklPTW9kdWxlVHlwZXNbTW9kMV0uRmxhZ3NbcG9ydF07Ci0JICAgIHAtPlJJT1BvcnRwW3BvcnQrUE9SVFNfUEVSX01PRFVMRStIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdDJdLlN5c1BvcnRdLT5Db25maWcgJj0gflJJT19OT01BU0s7Ci0JICAgIHAtPlJJT1BvcnRwW3BvcnQrUE9SVFNfUEVSX01PRFVMRStIb3N0UC0+TWFwcGluZ1tUaGlzVW5pdDJdLlN5c1BvcnRdLT5Db25maWcgfD0gcC0+UklPTW9kdWxlVHlwZXNbTW9kMl0uRmxhZ3NbcG9ydF07Ci0gICAgICAgICAgfQotCX0KLSAgICAgIH0KLQotICAgICAgLyoKLSAgICAgICoqIEpvYiBkb25lLCBnZXQgb24gd2l0aCB0aGUgaW50ZXJydXB0cyEKLSAgICAgICovCi0gICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gIH0KLSAgLyoKLSAgKiogVGhlcmUgaXMgbm8gdGFibGUgZW50cnkgZm9yIHRoaXMgUlRBIGF0IGFsbC4KLSAgKioKLSAgKiogTGV0cyBjaGVjayB0byBzZWUgaWYgd2UgYWN0dWFsbHkgYm9vdGVkIHRoaXMgdW5pdCAtIGlmIG5vdCwKLSAgKiogdGhlbiB3ZSByZXNldCBpdCBhbmQgaXQgd2lsbCBnbyByb3VuZCB0aGUgbG9vcCBvZiBiZWluZyBib290ZWQKLSAgKiogd2UgY2FuIHRoZW4gd29ycnkgYWJvdXQgdHJ5aW5nIHRvIGZpdCBpdCBpbnRvIHRoZSB0YWJsZS4KLSAgKi8KLSAgZm9yICggVGhpc1VuaXQ9MDsgVGhpc1VuaXQ8SG9zdFAtPk51bUV4dHJhQm9vdGVkOyBUaGlzVW5pdCsrICkKLSAgICBpZiAoIEhvc3RQLT5FeHRyYVVuaXRzW1RoaXNVbml0XSA9PSBSdGFVbmlxICkKLSAgICAgIGJyZWFrOwotICBpZiAoIFRoaXNVbml0ID09IEhvc3RQLT5OdW1FeHRyYUJvb3RlZCAmJiBUaGlzVW5pdCAhPSBNQVhfRVhUUkFfVU5JVFMgKQotICB7Ci0gICAgLyoKLSAgICAqKiBpZiB0aGUgdW5pdCB3YXNuJ3QgaW4gdGhlIHRhYmxlLCBhbmQgdGhlIHRhYmxlIHdhc24ndCBmdWxsLCB0aGVuCi0gICAgKiogd2UgcmVzZXQgdGhlIHVuaXQsIGJlY2F1c2Ugd2UgZGlkbid0IGJvb3QgaXQuCi0gICAgKiogSG93ZXZlciwgaWYgdGhlIHRhYmxlIGlzIGZ1bGwsIGl0IGNvdWxkIGJlIHRoYXQgd2UgZGlkIGJvb3QKLSAgICAqKiB0aGlzIHVuaXQsIGFuZCBzbyB3ZSB3b24ndCByZWJvb3QgaXQsIGJlY2F1c2UgaXQgaXNuJ3QgcmVhbGx5Ci0gICAgKiogYWxsIHRoYXQgZGlzYXN0ZXJvdXMgdG8ga2VlcCB0aGUgb2xkIGJpbnMgaW4gbW9zdCBjYXNlcy4gVGhpcwotICAgICoqIGlzIGEgcmF0aGVyIHRhY2t5IGZlYXR1cmUsIGJ1dCB3ZSBhcmUgb24gdGhlIGVkZ2Ugb2YgcmVhbGxpdHkKLSAgICAqKiBoZXJlLCBiZWNhdXNlIHRoZSBpbXBsaWNhdGlvbiBpcyB0aGF0IHNvbWVvbmUgaGFzIGNvbm5lY3RlZAotICAgICoqIDE2K01BWF9FWFRSQV9VTklUUyBvbnRvIG9uZSBob3N0LgotICAgICovCi0gICAgc3RhdGljIGludCBVbmtub3duTWVzZ0RvbmUgPSAwOwotCi0gICAgaWYgKCAhVW5rbm93bk1lc2dEb25lICkKLSAgICB7Ci0JaWYgKCEgcC0+UklPTm9NZXNzYWdlKQotCSAgICBjcHJpbnRmKCJPbmUgb3IgbW9yZSB1bmtub3duIFJUQXMgYXJlIGJlaW5nIHVwZGF0ZWQuXG4iKTsKLQlVbmtub3duTWVzZ0RvbmUgPSAxOwotICAgIH0KLQotICAgIFBrdFJlcGx5UC0+Q29tbWFuZCA9IFJPVVRFX0ZPQUQ7Ci0gICAgSG9zdFAtPkNvcHkoIlJUX0ZPQUQiLFBrdFJlcGx5UC0+Q29tbWFuZFRleHQsNyk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgLyoKLSAgICAqKiB3ZSBkaWQgYm9vdCBpdCAoYXMgYW4gZXh0cmEpLCBhbmQgdGhlcmUgbWF5IG5vdyBiZSBhIHRhYmxlCi0gICAgKiogc2xvdCBmcmVlIChiZWNhdXNlIG9mIGEgZGVsZXRlKSwgc28gd2Ugd2lsbCB0cnkgdG8gbWFrZQotICAgICoqIGEgdGVudGF0aXZlIGVudHJ5IGZvciBpdCwgc28gdGhhdCB0aGUgY29uZmlndXJhdG9yIGNhbiBzZWUgaXQKLSAgICAqKiBhbmQgZmlsbCBpbiB0aGUgZGV0YWlscyBmb3IgdXMuCi0gICAgKi8KLSAgICBpZiAoUnRhVHlwZSA9PSBUWVBFX1JUQTE2KQotICAgIHsKLQlpZiAoUklPRmluZEZyZWVJRChwLCBIb3N0UCwgJlRoaXNVbml0LCAmVGhpc1VuaXQyKSA9PSAwKQotCXsKLQkgICAgUklPRGVmYXVsdE5hbWUocCwgSG9zdFAsIFRoaXNVbml0KTsKLQkgICAgRmlsbFNsb3QoVGhpc1VuaXQsIFRoaXNVbml0MiwgUnRhVW5pcSwgSG9zdFApOwotCX0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlpZiAoUklPRmluZEZyZWVJRChwLCBIb3N0UCwgJlRoaXNVbml0LCBOVUxMKSA9PSAwKQotCXsKLQkgICAgUklPRGVmYXVsdE5hbWUocCwgSG9zdFAsIFRoaXNVbml0KTsKLQkgICAgRmlsbFNsb3QoVGhpc1VuaXQsIDAsIFJ0YVVuaXEsIEhvc3RQKTsKLQl9Ci0gICAgfQotICAgIFBrdFJlcGx5UC0+Q29tbWFuZCA9IFJPVVRFX1VTRUQ7Ci0gICAgSG9zdFAtPkNvcHkoIlJUX1VTRUQiLFBrdFJlcGx5UC0+Q29tbWFuZFRleHQsNyk7Ci0gIH0KLSAgUklPUXVldWVDbWRCbGsoIEhvc3RQLCBSdXAsIENtZEJsa1ApOwotICByZXR1cm4gVFJVRTsKIH0KIAogCi12b2lkCi1SSU9GaXhQaGJzKHAsIEhvc3RQLCB1bml0KQordm9pZCBSSU9GaXhQaGJzKHAsIEhvc3RQLCB1bml0KQogc3RydWN0IHJpb19pbmZvICpwOwogc3RydWN0IEhvc3QgKkhvc3RQOwogdWludCB1bml0OwogewotCXVzaG9ydAkJCWxpbmssIHBvcnQ7Ci0Jc3RydWN0IFBvcnQJCSpQb3J0UDsKKwl1c2hvcnQgbGluaywgcG9ydDsKKwlzdHJ1Y3QgUG9ydCAqUG9ydFA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgUG9ydE4gPSBIb3N0UC0+TWFwcGluZ1t1bml0XS5TeXNQb3J0OwogCi0JcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlJJT0ZpeFBoYnMgdW5pdCAlZCBzeXNwb3J0ICVkXG4iLCB1bml0LCBQb3J0Tik7CisJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiUklPRml4UGhicyB1bml0ICVkIHN5c3BvcnQgJWRcbiIsIHVuaXQsIFBvcnROKTsKIAogCWlmIChQb3J0TiAhPSAtMSkgewotCQl1c2hvcnQJCWRlc3RfdW5pdCA9IEhvc3RQLT5NYXBwaW5nW3VuaXRdLklEMjsKKwkJdXNob3J0IGRlc3RfdW5pdCA9IEhvc3RQLT5NYXBwaW5nW3VuaXRdLklEMjsKIAogCQkvKgotCQkqKiBHZXQgdGhlIGxpbmsgbnVtYmVyIHVzZWQgZm9yIHRoZSAxc3QgOCBwaGJzIG9uIHRoaXMgdW5pdC4KLQkJKi8KKwkJICoqIEdldCB0aGUgbGluayBudW1iZXIgdXNlZCBmb3IgdGhlIDFzdCA4IHBoYnMgb24gdGhpcyB1bml0LgorCQkgKi8KIAkJUG9ydFAgPSBwLT5SSU9Qb3J0cFtIb3N0UC0+TWFwcGluZ1tkZXN0X3VuaXQgLSAxXS5TeXNQb3J0XTsKIAogCQlsaW5rID0gUldPUkQoUG9ydFAtPlBoYlAtPmxpbmspOwogCiAJCWZvciAocG9ydCA9IDA7IHBvcnQgPCBQT1JUU19QRVJfUlRBOyBwb3J0KyssIFBvcnROKyspIHsKLQkJCXVzaG9ydAkJZGVzdF9wb3J0ID0gcG9ydCArIDg7Ci0jaWYgMAotCQkJdWludAkJUGt0SW50OwotI2VuZGlmCi0JCQlXT1JECQkqVHhQa3RQOwotCQkJUEtUCQkqUGt0OworCQkJdXNob3J0IGRlc3RfcG9ydCA9IHBvcnQgKyA4OworCQkJV09SRCAqVHhQa3RQOworCQkJUEtUICpQa3Q7CiAKIAkJCVBvcnRQID0gcC0+UklPUG9ydHBbUG9ydE5dOwogCiAJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CiAJCQkvKgotCQkJKiogSWYgUlRBIGlzIG5vdCBwb3dlcmVkIG9uLCB0aGUgdHggcGFja2V0cyB3aWxsIGJlCi0JCQkqKiB1bnNldCwgc28gZ28gbm8gZnVydGhlci4KLQkJCSovCisJCQkgKiogSWYgUlRBIGlzIG5vdCBwb3dlcmVkIG9uLCB0aGUgdHggcGFja2V0cyB3aWxsIGJlCisJCQkgKiogdW5zZXQsIHNvIGdvIG5vIGZ1cnRoZXIuCisJCQkgKi8KIAkJCWlmIChQb3J0UC0+VHhTdGFydCA9PSAwKSB7Ci0JCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJUeCBwa3RzIG5vdCBzZXQgdXAgeWV0XG4iKTsKLQkJCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JCQkJCWJyZWFrOworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19ST1VURSwgIlR4IHBrdHMgbm90IHNldCB1cCB5ZXRcbiIpOworCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJCWJyZWFrOwogCQkJfQogCiAJCQkvKgotCQkJKiogRm9yIHRoZSBzZWNvbmQgc2xvdCBvZiBhIDE2IHBvcnQgUlRBLCB0aGUgZHJpdmVyIG5lZWRzIHRvCi0JCQkqKiBzb3J0IG91dCB0aGUgcGhiIHRvIHBvcnQgbWFwcGluZ3MuIFRoZSBkZXN0X3VuaXQgZm9yIHRoaXMKLQkJCSoqIGdyb3VwIG9mIDggcGhicyBpcyBzZXQgdG8gdGhlIGRlc3RfdW5pdCBvZiB0aGUgYWNjb21wYW55aW5nCi0JCQkqKiA4IHBvcnQgYmxvY2suIFRoZSBkZXN0X3BvcnQgb2YgdGhlIHNlY29uZCB1bml0IGlzIHNldCB0bwotCQkJKiogYmUgaW4gdGhlIHJhbmdlIDgtMTUgKGkuZS4gOCBpcyBhZGRlZCkuIFRodXMsIGZvciBhIDE2IHBvcnQKLQkJCSoqIFJUQSB3aXRoIElEcyA1IGFuZCA2LCB0cmFmZmljIGJvdW5kIGZvciBwb3J0IDYgb2YgdW5pdCA2Ci0JCQkqKiAoYmVpbmcgdGhlIHNlY29uZCBtYXAgSUQpIHdpbGwgYmUgc2VudCB0byBkZXN0X3VuaXQgNSwgcG9ydAotCQkJKiogMTQuIFdoZW4gdGhpcyBSVEEgaXMgZGVsZXRlZCwgZGVzdF91bml0IGZvciBJRCA2IHdpbGwgYmUKLQkJCSoqIHJlc3RvcmVkLCBhbmQgdGhlIGRlc3RfcG9ydCB3aWxsIGJlIHJlZHVjZWQgYnkgOC4KLQkJCSoqIFRyYW5zbWl0IHBhY2tldHMgYWxzbyBoYXZlIGEgZGVzdGluYXRpb24gZmllbGQgd2hpY2ggbmVlZHMKLQkJCSoqIGFkanVzdGluZyBpbiB0aGUgc2FtZSBtYW5uZXIuCi0JCQkqKiBOb3RlIHRoYXQgdGhlIHVuaXQvcG9ydCBieXRlcyBpbiAnZGVzdCcgYXJlIHN3YXBwZWQuCi0JCQkqKiBXZSBhbHNvIG5lZWQgdG8gYWRqdXN0IHRoZSBwaGIgYW5kIHJ1cCBsaW5rIG51bWJlcnMgZm9yIHRoZQotCQkJKiogc2Vjb25kIGJsb2NrIG9mIDggdHR5cy4KLQkJCSovCisJCQkgKiogRm9yIHRoZSBzZWNvbmQgc2xvdCBvZiBhIDE2IHBvcnQgUlRBLCB0aGUgZHJpdmVyIG5lZWRzIHRvCisJCQkgKiogc29ydCBvdXQgdGhlIHBoYiB0byBwb3J0IG1hcHBpbmdzLiBUaGUgZGVzdF91bml0IGZvciB0aGlzCisJCQkgKiogZ3JvdXAgb2YgOCBwaGJzIGlzIHNldCB0byB0aGUgZGVzdF91bml0IG9mIHRoZSBhY2NvbXBhbnlpbmcKKwkJCSAqKiA4IHBvcnQgYmxvY2suIFRoZSBkZXN0X3BvcnQgb2YgdGhlIHNlY29uZCB1bml0IGlzIHNldCB0bworCQkJICoqIGJlIGluIHRoZSByYW5nZSA4LTE1IChpLmUuIDggaXMgYWRkZWQpLiBUaHVzLCBmb3IgYSAxNiBwb3J0CisJCQkgKiogUlRBIHdpdGggSURzIDUgYW5kIDYsIHRyYWZmaWMgYm91bmQgZm9yIHBvcnQgNiBvZiB1bml0IDYKKwkJCSAqKiAoYmVpbmcgdGhlIHNlY29uZCBtYXAgSUQpIHdpbGwgYmUgc2VudCB0byBkZXN0X3VuaXQgNSwgcG9ydAorCQkJICoqIDE0LiBXaGVuIHRoaXMgUlRBIGlzIGRlbGV0ZWQsIGRlc3RfdW5pdCBmb3IgSUQgNiB3aWxsIGJlCisJCQkgKiogcmVzdG9yZWQsIGFuZCB0aGUgZGVzdF9wb3J0IHdpbGwgYmUgcmVkdWNlZCBieSA4LgorCQkJICoqIFRyYW5zbWl0IHBhY2tldHMgYWxzbyBoYXZlIGEgZGVzdGluYXRpb24gZmllbGQgd2hpY2ggbmVlZHMKKwkJCSAqKiBhZGp1c3RpbmcgaW4gdGhlIHNhbWUgbWFubmVyLgorCQkJICoqIE5vdGUgdGhhdCB0aGUgdW5pdC9wb3J0IGJ5dGVzIGluICdkZXN0JyBhcmUgc3dhcHBlZC4KKwkJCSAqKiBXZSBhbHNvIG5lZWQgdG8gYWRqdXN0IHRoZSBwaGIgYW5kIHJ1cCBsaW5rIG51bWJlcnMgZm9yIHRoZQorCQkJICoqIHNlY29uZCBibG9jayBvZiA4IHR0eXMuCisJCQkgKi8KIAkJCWZvciAoVHhQa3RQID0gUG9ydFAtPlR4U3RhcnQ7IFR4UGt0UCA8PSBQb3J0UC0+VHhFbmQ7IFR4UGt0UCsrKSB7CiAJCQkJLyoKLQkJCQkqKiAqVHhQa3RQIGlzIHRoZSBwb2ludGVyIHRvIHRoZSB0cmFuc21pdCBwYWNrZXQgb24gdGhlIGhvc3QKLQkJCQkqKiBjYXJkLiBUaGlzIG5lZWRzIHRvIGJlIHRyYW5zbGF0ZWQgaW50byBhIDMyIGJpdCBwb2ludGVyCi0JCQkJKiogc28gaXQgY2FuIGJlIGFjY2Vzc2VkIGZyb20gdGhlIGRyaXZlci4KLQkJCQkqLwotCQkJCVBrdCA9IChQS1QgKikgUklPX1BUUihIb3N0UC0+Q2FkZHIsUklORFcoVHhQa3RQKSk7CisJCQkJICoqICpUeFBrdFAgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIHRyYW5zbWl0IHBhY2tldCBvbiB0aGUgaG9zdAorCQkJCSAqKiBjYXJkLiBUaGlzIG5lZWRzIHRvIGJlIHRyYW5zbGF0ZWQgaW50byBhIDMyIGJpdCBwb2ludGVyCisJCQkJICoqIHNvIGl0IGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBkcml2ZXIuCisJCQkJICovCisJCQkJUGt0ID0gKFBLVCAqKSBSSU9fUFRSKEhvc3RQLT5DYWRkciwgUklORFcoVHhQa3RQKSk7CiAKIAkJCQkvKgotCQkJCSoqIElmIHRoZSBwYWNrZXQgaXMgdXNlZCwgcmVzZXQgaXQuCi0JCQkJKi8KLQkJCQlQa3QgPSAoUEtUICopKCh1aW50KVBrdCAmIH5QS1RfSU5fVVNFKTsKKwkJCQkgKiogSWYgdGhlIHBhY2tldCBpcyB1c2VkLCByZXNldCBpdC4KKwkJCQkgKi8KKwkJCQlQa3QgPSAoUEtUICopICgodWludCkgUGt0ICYgflBLVF9JTl9VU0UpOwogCQkJCVdCWVRFKFBrdC0+ZGVzdF91bml0LCBkZXN0X3VuaXQpOwogCQkJCVdCWVRFKFBrdC0+ZGVzdF9wb3J0LCBkZXN0X3BvcnQpOwogCQkJfQotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgInBoYiBkZXN0OiBPbGQgJXg6JXggTmV3ICV4OiV4XG4iLAotCQkJCQlSV09SRChQb3J0UC0+UGhiUC0+ZGVzdGluYXRpb24pICYgMHhmZiwKLQkJCQkJKFJXT1JEKFBvcnRQLT5QaGJQLT5kZXN0aW5hdGlvbikgPj4gOCkgJiAweGZmLAotCQkJCQlkZXN0X3VuaXQsIGRlc3RfcG9ydCk7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUk9VVEUsICJwaGIgZGVzdDogT2xkICV4OiV4IE5ldyAleDoleFxuIiwgUldPUkQoUG9ydFAtPlBoYlAtPmRlc3RpbmF0aW9uKSAmIDB4ZmYsIChSV09SRChQb3J0UC0+UGhiUC0+ZGVzdGluYXRpb24pID4+IDgpICYgMHhmZiwgZGVzdF91bml0LCBkZXN0X3BvcnQpOwogCQkJV1dPUkQoUG9ydFAtPlBoYlAtPmRlc3RpbmF0aW9uLCBkZXN0X3VuaXQgKyAoZGVzdF9wb3J0IDw8IDgpKTsKIAkJCVdXT1JEKFBvcnRQLT5QaGJQLT5saW5rLCBsaW5rKTsKIAogCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CiAJCX0KIAkJLyoKLQkJKiogTm93IG1ha2Ugc3VyZSB0aGUgcmFuZ2Ugb2YgcG9ydHMgdG8gYmUgc2VydmljZWQgaW5jbHVkZXMKLQkJKiogdGhlIDJuZCA4IG9uIHRoaXMgMTYgcG9ydCBSVEEuCi0JCSovCi0JCWlmIChsaW5rID4gMykgcmV0dXJuOworCQkgKiogTm93IG1ha2Ugc3VyZSB0aGUgcmFuZ2Ugb2YgcG9ydHMgdG8gYmUgc2VydmljZWQgaW5jbHVkZXMKKwkJICoqIHRoZSAybmQgOCBvbiB0aGlzIDE2IHBvcnQgUlRBLgorCQkgKi8KKwkJaWYgKGxpbmsgPiAzKQorCQkJcmV0dXJuOwogCQlpZiAoKCh1bml0ICogOCkgKyA3KSA+IFJXT1JEKEhvc3RQLT5MaW5rU3RyUFtsaW5rXS5sYXN0X3BvcnQpKSB7Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAibGFzdCBwb3J0IG9uIGhvc3QgbGluayAlZDogJWRcbiIsIGxpbmssICh1bml0ICogOCkgKyA3KTsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19ST1VURSwgImxhc3QgcG9ydCBvbiBob3N0IGxpbmsgJWQ6ICVkXG4iLCBsaW5rLCAodW5pdCAqIDgpICsgNyk7CiAJCQlXV09SRChIb3N0UC0+TGlua1N0clBbbGlua10ubGFzdF9wb3J0LCAodW5pdCAqIDgpICsgNyk7CiAJCX0KIAl9CkBAIC03MjMsMjYgKzYwMywyMSBAQAogKiogdGhlIHdvcmxkIGFib3V0IGl0LiBUaGlzIGlzIGRvbmUgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRvcgogKiogb25seSBnZXRzIHVwLXRvLWRhdGUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBpcyBnb2luZyBvbi4KICovCi1zdGF0aWMgaW50Ci1SSU9DaGVja0lzb2xhdGVkKHAsIEhvc3RQLCBVbml0SWQpCi1zdHJ1Y3QgcmlvX2luZm8gKglwOworc3RhdGljIGludCBSSU9DaGVja0lzb2xhdGVkKHAsIEhvc3RQLCBVbml0SWQpCitzdHJ1Y3QgcmlvX2luZm8gKnA7CiBzdHJ1Y3QgSG9zdCAqSG9zdFA7CiB1aW50IFVuaXRJZDsKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmSG9zdFAtPkhvc3RMb2NrLCBmbGFncyk7CiAKLSNpZmRlZiBDSEVDSwotCUNoZWNrSG9zdFAoIEhvc3RQICk7Ci0JQ2hlY2tVbml0SWQoIFVuaXRJZCApOwotI2VuZGlmCi0JaWYgKCBSSU9DaGVjayggSG9zdFAsIFVuaXRJZCApICkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiVW5pdCAlZCBpcyBOT1QgaXNvbGF0ZWRcbiIsIFVuaXRJZCk7CisJaWYgKFJJT0NoZWNrKEhvc3RQLCBVbml0SWQpKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19ST1VURSwgIlVuaXQgJWQgaXMgTk9UIGlzb2xhdGVkXG4iLCBVbml0SWQpOwogCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmSG9zdFAtPkhvc3RMb2NrLCBmbGFncyk7Ci0JCXJldHVybigwKTsKKwkJcmV0dXJuICgwKTsKIAl9CiAKLQlSSU9Jc29sYXRlKHAsIEhvc3RQLCBVbml0SWQgKTsKKwlSSU9Jc29sYXRlKHAsIEhvc3RQLCBVbml0SWQpOwogCVJJT1NldENoYW5nZShwKTsKIAlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmSG9zdFAtPkhvc3RMb2NrLCBmbGFncyk7CiAJcmV0dXJuIDE7CkBAIC03NTMsODUgKzYyOCw3NSBAQAogKiogYWxsIHRoZSB1bml0cyBhdHRhY2hlZCB0byBpdC4gVGhpcyB3aWxsIG1lYW4gdGhhdCB0aGUgZW50aXJlCiAqKiBzdWJuZXQgd2lsbCByZS1pbnRyb2R1Y2UgaXRzZWxmLgogKi8KLXN0YXRpYyBpbnQKLVJJT0lzb2xhdGUocCwgSG9zdFAsIFVuaXRJZCkKLXN0cnVjdCByaW9faW5mbyAqCXA7Ci1zdHJ1Y3QgSG9zdCAqCQlIb3N0UDsKLXVpbnQgVW5pdElkOyAKK3N0YXRpYyBpbnQgUklPSXNvbGF0ZShwLCBIb3N0UCwgVW5pdElkKQorc3RydWN0IHJpb19pbmZvICpwOworc3RydWN0IEhvc3QgKkhvc3RQOwordWludCBVbml0SWQ7CiB7CiAJdWludCBsaW5rLCB1bml0OwogCi0jaWZkZWYgQ0hFQ0sKLQlDaGVja0hvc3RQKCBIb3N0UCApOwotCUNoZWNrVW5pdElkKCBVbml0SWQgKTsKLSNlbmRpZgogCVVuaXRJZC0tOwkJLyogdGhpcyB0cmljayByZWxpZXMgb24gdGhlIFVuaXQgSWQgYmVpbmcgVU5TSUdORUQhICovCiAKLQlpZiAoIFVuaXRJZCA+PSBNQVhfUlVQICkJLyogZG9udGNoYSBqdXN0IGx1cnYgdW5zaWduZWQgbWF0aHMhICovCi0JCXJldHVybigwKTsKKwlpZiAoVW5pdElkID49IE1BWF9SVVApCS8qIGRvbnRjaGEganVzdCBsdXJ2IHVuc2lnbmVkIG1hdGhzISAqLworCQlyZXR1cm4gKDApOwogCi0JaWYgKCBIb3N0UC0+TWFwcGluZ1tVbml0SWRdLkZsYWdzICYgQkVFTl9IRVJFICkKLQkJcmV0dXJuKDApOworCWlmIChIb3N0UC0+TWFwcGluZ1tVbml0SWRdLkZsYWdzICYgQkVFTl9IRVJFKQorCQlyZXR1cm4gKDApOwogCiAJSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5GbGFncyB8PSBCRUVOX0hFUkU7CiAKLQlpZiAoIHAtPlJJT1ByaW50RGlzYWJsZWQgPT0gRE9fUFJJTlQgKQotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiUklPTWVzZ0lzb2xhdGVkICVzIiwgSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5OYW1lKTsKKwlpZiAocC0+UklPUHJpbnREaXNhYmxlZCA9PSBET19QUklOVCkKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiUklPTWVzZ0lzb2xhdGVkICVzIiwgSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5OYW1lKTsKIAotCWZvciAoIGxpbms9MDsgbGluazxMSU5LU19QRVJfVU5JVDsgbGluaysrKSB7CisJZm9yIChsaW5rID0gMDsgbGluayA8IExJTktTX1BFUl9VTklUOyBsaW5rKyspIHsKIAkJdW5pdCA9IEhvc3RQLT5NYXBwaW5nW1VuaXRJZF0uVG9wb2xvZ3lbbGlua10uVW5pdDsKIAkJSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5Ub3BvbG9neVtsaW5rXS5Vbml0ID0gUk9VVEVfRElTQ09OTkVDVDsKIAkJSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5Ub3BvbG9neVtsaW5rXS5MaW5rID0gTk9fTElOSzsKLQkJUklPSXNvbGF0ZShwLCBIb3N0UCwgdW5pdCApOworCQlSSU9Jc29sYXRlKHAsIEhvc3RQLCB1bml0KTsKIAl9CiAJSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5GbGFncyAmPSB+QkVFTl9IRVJFOwogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50Ci1SSU9DaGVjayhIb3N0UCwgVW5pdElkKQorc3RhdGljIGludCBSSU9DaGVjayhIb3N0UCwgVW5pdElkKQogc3RydWN0IEhvc3QgKkhvc3RQOwogdWludCBVbml0SWQ7CiB7Ci0gIHVuc2lnbmVkIGNoYXIgbGluazsKKwl1bnNpZ25lZCBjaGFyIGxpbms7CiAKLSNpZmRlZiBDSEVDSwotCUNoZWNrSG9zdFAoIEhvc3RQICk7Ci0JQ2hlY2tVbml0SWQoIFVuaXRJZCApOwotI2VuZGlmCiAvKiAJcmlvX2RwcmludChSSU9fREVCVUdfUk9VVEUsICgiQ2hlY2sgdG8gc2VlIGlmIHVuaXQgJWQgaGFzIGEgcm91dGUgdG8gdGhlIGhvc3RcbiIsVW5pdElkKSk7ICovCi0JcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlJJT0NoZWNrIDogVW5pdElEID0gJWRcbiIsIFVuaXRJZCk7CisJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiUklPQ2hlY2sgOiBVbml0SUQgPSAlZFxuIiwgVW5pdElkKTsKIAotCWlmICggVW5pdElkID09IEhPU1RfSUQgKSB7CisJaWYgKFVuaXRJZCA9PSBIT1NUX0lEKSB7CiAJCS8qIHJpb19kcHJpbnQoUklPX0RFQlVHX1JPVVRFLCAoIlVuaXQgJWQgaXMgTk9UIGlzb2xhdGVkIC0gaXQgSVMgdGhlIGhvc3QhXG4iLCBVbml0SWQpKTsgKi8KIAkJcmV0dXJuIDE7CiAJfQogCiAJVW5pdElkLS07CiAKLQlpZiAoIFVuaXRJZCA+PSBNQVhfUlVQICkgeworCWlmIChVbml0SWQgPj0gTUFYX1JVUCkgewogCQkvKiByaW9fZHByaW50KFJJT19ERUJVR19ST1VURSwgKCJVbml0ICVkIC0gaWdub3JlZC5cbiIsIFVuaXRJZCkpOyAqLwogCQlyZXR1cm4gMDsKIAl9CiAKLQlmb3IgKCBsaW5rPTA7IGxpbms8TElOS1NfUEVSX1VOSVQ7IGxpbmsrKyApIHsKLQkJaWYgKCBIb3N0UC0+TWFwcGluZ1tVbml0SWRdLlRvcG9sb2d5W2xpbmtdLlVuaXQ9PUhPU1RfSUQgKSB7CisJZm9yIChsaW5rID0gMDsgbGluayA8IExJTktTX1BFUl9VTklUOyBsaW5rKyspIHsKKwkJaWYgKEhvc3RQLT5NYXBwaW5nW1VuaXRJZF0uVG9wb2xvZ3lbbGlua10uVW5pdCA9PSBIT1NUX0lEKSB7CiAJCQkvKiByaW9fZHByaW50KFJJT19ERUJVR19ST1VURSwgKCJVbml0ICVkIGlzIGNvbm5lY3RlZCBkaXJlY3RseSB0byBob3N0IHZpYSBsaW5rICglYykuXG4iLCAKLQkJCQkJCVVuaXRJZCwgJ0EnK2xpbmspKTsgKi8KKwkJCSAgIFVuaXRJZCwgJ0EnK2xpbmspKTsgKi8KIAkJCXJldHVybiAxOwogCQl9CiAJfQogCi0JaWYgKCBIb3N0UC0+TWFwcGluZ1tVbml0SWRdLkZsYWdzICYgQkVFTl9IRVJFICkgeworCWlmIChIb3N0UC0+TWFwcGluZ1tVbml0SWRdLkZsYWdzICYgQkVFTl9IRVJFKSB7CiAJCS8qIHJpb19kcHJpbnQoUklPX0RFQlVHX1JPVVRFLCAoIkJlZW4gdG8gVW5pdCAlZCBiZWZvcmUgLSBpZ25vcmluZ1xuIiwgVW5pdElkKSk7ICovCiAJCXJldHVybiAwOwogCX0KIAogCUhvc3RQLT5NYXBwaW5nW1VuaXRJZF0uRmxhZ3MgfD0gQkVFTl9IRVJFOwogCi0JZm9yICggbGluaz0wOyBsaW5rIDwgTElOS1NfUEVSX1VOSVQ7IGxpbmsrKyApIHsKKwlmb3IgKGxpbmsgPSAwOyBsaW5rIDwgTElOS1NfUEVSX1VOSVQ7IGxpbmsrKykgewogCQkvKiByaW9fZHByaW50KFJJT19ERUJVR19ST1VURSwgKCJVbml0ICVkIGNoZWNrIGxpbmsgKCVjKVxuIiwgVW5pdElkLCdBJytsaW5rKSk7ICovCi0JCWlmICggUklPQ2hlY2soIEhvc3RQLCBIb3N0UC0+TWFwcGluZ1tVbml0SWRdLlRvcG9sb2d5W2xpbmtdLlVuaXQgKSApIHsKKwkJaWYgKFJJT0NoZWNrKEhvc3RQLCBIb3N0UC0+TWFwcGluZ1tVbml0SWRdLlRvcG9sb2d5W2xpbmtdLlVuaXQpKSB7CiAJCQkvKiByaW9fZHByaW50KFJJT19ERUJVR19ST1VURSwgKCJVbml0ICVkIGlzIGNvbm5lY3RlZCB0byBzb21ldGhpbmcgdGhhdCBrbm93cyB0aGUgaG9zdCB2aWEgbGluayAoJWMpXG4iLCBVbml0SWQsbGluaysnQScpKTsgKi8KIAkJCUhvc3RQLT5NYXBwaW5nW1VuaXRJZF0uRmxhZ3MgJj0gfkJFRU5fSEVSRTsKIAkJCXJldHVybiAxOwpAQCAtODQxLDcgKzcwNiw3IEBACiAJSG9zdFAtPk1hcHBpbmdbVW5pdElkXS5GbGFncyAmPSB+QkVFTl9IRVJFOwogCiAJLyogcmlvX2RwcmludChSSU9fREVCVUdfUk9VVEUsICgiVW5pdCAlZCBET0VTTlQgS05PVyBUSEUgSE9TVCFcbiIsIFVuaXRJZCkpOyAqLwotCQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg0OSw2MSArNzE0LDU3IEBACiAqKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHVuaXQgKGhvc3QsIDE2LzggcG9ydCBSVEEpCiAqLwogCi11aW50Ci1HZXRVbml0VHlwZShVbmlxKQordWludCBHZXRVbml0VHlwZShVbmlxKQogdWludCBVbmlxOwogewotCXN3aXRjaCAoIChVbmlxID4+IDI4KSAmIDB4ZikKLQl7Ci0JCWNhc2UgUklPX0FUOgotCQljYXNlIFJJT19NQ0E6Ci0JCWNhc2UgUklPX0VJU0E6Ci0JCWNhc2UgUklPX1BDSToKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJVbml0IHR5cGU6IEhvc3RcbiIpOwotCQkJcmV0dXJuKFRZUEVfSE9TVCk7Ci0JCWNhc2UgUklPX1JUQV8xNjoKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJVbml0IHR5cGU6IDE2IHBvcnQgUlRBXG4iKTsKLQkJCXJldHVybihUWVBFX1JUQTE2KTsKLQkJY2FzZSBSSU9fUlRBOgotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlVuaXQgdHlwZTogOCBwb3J0IFJUQVxuIik7Ci0JCQlyZXR1cm4oVFlQRV9SVEE4KTsKLQkJZGVmYXVsdCA6Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiVW5pdCB0eXBlOiBVbnJlY29nbmlzZWRcbiIpOwotCQkJcmV0dXJuKDk5KTsKKwlzd2l0Y2ggKChVbmlxID4+IDI4KSAmIDB4ZikgeworCWNhc2UgUklPX0FUOgorCWNhc2UgUklPX01DQToKKwljYXNlIFJJT19FSVNBOgorCWNhc2UgUklPX1BDSToKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiVW5pdCB0eXBlOiBIb3N0XG4iKTsKKwkJcmV0dXJuIChUWVBFX0hPU1QpOworCWNhc2UgUklPX1JUQV8xNjoKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiVW5pdCB0eXBlOiAxNiBwb3J0IFJUQVxuIik7CisJCXJldHVybiAoVFlQRV9SVEExNik7CisJY2FzZSBSSU9fUlRBOgorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUk9VVEUsICJVbml0IHR5cGU6IDggcG9ydCBSVEFcbiIpOworCQlyZXR1cm4gKFRZUEVfUlRBOCk7CisJZGVmYXVsdDoKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiVW5pdCB0eXBlOiBVbnJlY29nbmlzZWRcbiIpOworCQlyZXR1cm4gKDk5KTsKIAl9CiB9CiAKLWludAotUklPU2V0Q2hhbmdlKHApCi1zdHJ1Y3QgcmlvX2luZm8gKglwOworaW50IFJJT1NldENoYW5nZShwKQorc3RydWN0IHJpb19pbmZvICpwOwogewotCWlmICggcC0+UklPUXVpY2tDaGVjayAhPSBOT1RfQ0hBTkdFRCApCi0JCXJldHVybigwKTsKKwlpZiAocC0+UklPUXVpY2tDaGVjayAhPSBOT1RfQ0hBTkdFRCkKKwkJcmV0dXJuICgwKTsKIAlwLT5SSU9RdWlja0NoZWNrID0gQ0hBTkdFRDsKLQlpZiAoIHAtPlJJT1NpZ25hbFByb2Nlc3MgKSB7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJTZW5kIFNJRy1IVVAiKTsKKwlpZiAocC0+UklPU2lnbmFsUHJvY2VzcykgeworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUk9VVEUsICJTZW5kIFNJRy1IVVAiKTsKIAkJLyoKLQkJcHNpZ25hbCggUklPU2lnbmFsUHJvY2VzcywgU0lHSFVQICk7Ci0JCSovCisJCSAgIHBzaWduYWwoIFJJT1NpZ25hbFByb2Nlc3MsIFNJR0hVUCApOworCQkgKi8KIAl9Ci0JcmV0dXJuKDApOworCXJldHVybiAoMCk7CiB9CiAKLXN0YXRpYyB2b2lkCi1SSU9Db25Db24ocCwgSG9zdFAsIEZyb21JZCwgRnJvbUxpbmssIFRvSWQsIFRvTGluaywgQ2hhbmdlKQotc3RydWN0IHJpb19pbmZvICoJcDsKK3N0YXRpYyB2b2lkIFJJT0NvbkNvbihwLCBIb3N0UCwgRnJvbUlkLCBGcm9tTGluaywgVG9JZCwgVG9MaW5rLCBDaGFuZ2UpCitzdHJ1Y3QgcmlvX2luZm8gKnA7CiBzdHJ1Y3QgSG9zdCAqSG9zdFA7CiB1aW50IEZyb21JZDsKIHVpbnQgRnJvbUxpbms7CiB1aW50IFRvSWQ7CiB1aW50IFRvTGluazsKLWludCBDaGFuZ2U7IAoraW50IENoYW5nZTsKIHsKLSAgICBjaGFyICpGcm9tTmFtZTsKLSAgICBjaGFyICpGcm9tVHlwZTsKLSAgICBjaGFyICpUb05hbWU7Ci0gICAgY2hhciAqVG9UeXBlOwotICAgIHVuc2lnbmVkIGludCB0cDsKKwljaGFyICpGcm9tTmFtZTsKKwljaGFyICpGcm9tVHlwZTsKKwljaGFyICpUb05hbWU7CisJY2hhciAqVG9UeXBlOworCXVuc2lnbmVkIGludCB0cDsKIAogLyoKICoqIDE1LjEwLjE5OTggQVJHIC0gRVNJTCAwNzU5CkBAIC05MzIsMzggKzc5MywzMiBAQAogKiogcmlvX2luZm8gc3RydWN0IC0gUklPUnRhRGlzQ29ucyAoUklPIFJUQSBjb25uZWN0aW9ucykga2VlcHMgdHJhY2sgb2YgUlRBCiAqKiBjb25uZWN0aW9ucyBhbmQgZGlzY29ubmVjdGlvbnMuIAogKi8KLSAgICBpZiAoQ2hhbmdlID09IENPTk5FQ1QpIHsKLQkJaWYgKHAtPlJJT1J0YURpc0NvbnMpIHAtPlJJT1J0YURpc0NvbnMtLTsKLQkgfQotCSBlbHNlIHsKKwlpZiAoQ2hhbmdlID09IENPTk5FQ1QpIHsKKwkJaWYgKHAtPlJJT1J0YURpc0NvbnMpCisJCQlwLT5SSU9SdGFEaXNDb25zLS07CisJfSBlbHNlIHsKIAkJcC0+UklPUnRhRGlzQ29ucysrOwotCSB9CisJfQogCi0gICAgaWYgKCBwLT5SSU9QcmludERpc2FibGVkID09IERPTlRfUFJJTlQgKQorCWlmIChwLT5SSU9QcmludERpc2FibGVkID09IERPTlRfUFJJTlQpCiAJCXJldHVybjsKIAotICAgIGlmICggRnJvbUlkID4gVG9JZCApIHsKKwlpZiAoRnJvbUlkID4gVG9JZCkgewogCQl0cCA9IEZyb21JZDsKIAkJRnJvbUlkID0gVG9JZDsKIAkJVG9JZCA9IHRwOwogCQl0cCA9IEZyb21MaW5rOwogCQlGcm9tTGluayA9IFRvTGluazsKIAkJVG9MaW5rID0gdHA7Ci0gICAgfQorCX0KIAotICAgIEZyb21OYW1lID0gRnJvbUlkID8gSG9zdFAtPk1hcHBpbmdbRnJvbUlkLTFdLk5hbWUgOiBIb3N0UC0+TmFtZTsKLSAgICBGcm9tVHlwZSA9IEZyb21JZCA/ICJSVEEiIDogIkhPU1QiOwotICAgIFRvTmFtZSA9IFRvSWQgPyBIb3N0UC0+TWFwcGluZ1tUb0lkLTFdLk5hbWUgOiBIb3N0UC0+TmFtZTsKLSAgICBUb1R5cGUgPSBUb0lkID8gIlJUQSIgOiAiSE9TVCI7CisJRnJvbU5hbWUgPSBGcm9tSWQgPyBIb3N0UC0+TWFwcGluZ1tGcm9tSWQgLSAxXS5OYW1lIDogSG9zdFAtPk5hbWU7CisJRnJvbVR5cGUgPSBGcm9tSWQgPyAiUlRBIiA6ICJIT1NUIjsKKwlUb05hbWUgPSBUb0lkID8gSG9zdFAtPk1hcHBpbmdbVG9JZCAtIDFdLk5hbWUgOiBIb3N0UC0+TmFtZTsKKwlUb1R5cGUgPSBUb0lkID8gIlJUQSIgOiAiSE9TVCI7CiAKLSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiTGluayBiZXR3ZWVuICVzICclcycgKCVjKSBhbmQgJXMgJyVzJyAoJWMpICVzLlxuIiwKLQkJCSAgICBGcm9tVHlwZSwgRnJvbU5hbWUsICdBJytGcm9tTGluaywKLQkJCSAgICBUb1R5cGUsICAgVG9OYW1lLCAgICdBJytUb0xpbmssCi0JCQkgICAgKENoYW5nZT09Q09OTkVDVCkgPyAiZXN0YWJsaXNoZWQiIDogImRpc2Nvbm5lY3RlZCIpOwotICAgIGNwcmludGYoIkxpbmsgYmV0d2VlbiAlcyAnJXMnICglYykgYW5kICVzICclcycgKCVjKSAlcy5cbiIsCi0JCQkgICAgRnJvbVR5cGUsIEZyb21OYW1lLCAnQScrRnJvbUxpbmssCi0JCQkgICAgVG9UeXBlLCAgIFRvTmFtZSwgICAnQScrVG9MaW5rLAotCQkJICAgIChDaGFuZ2U9PUNPTk5FQ1QpID8gImVzdGFibGlzaGVkIiA6ICJkaXNjb25uZWN0ZWQiKTsKKwlyaW9fZHByaW50ayhSSU9fREVCVUdfUk9VVEUsICJMaW5rIGJldHdlZW4gJXMgJyVzJyAoJWMpIGFuZCAlcyAnJXMnICglYykgJXMuXG4iLCBGcm9tVHlwZSwgRnJvbU5hbWUsICdBJyArIEZyb21MaW5rLCBUb1R5cGUsIFRvTmFtZSwgJ0EnICsgVG9MaW5rLCAoQ2hhbmdlID09IENPTk5FQ1QpID8gImVzdGFibGlzaGVkIiA6ICJkaXNjb25uZWN0ZWQiKTsKKwljcHJpbnRmKCJMaW5rIGJldHdlZW4gJXMgJyVzJyAoJWMpIGFuZCAlcyAnJXMnICglYykgJXMuXG4iLCBGcm9tVHlwZSwgRnJvbU5hbWUsICdBJyArIEZyb21MaW5rLCBUb1R5cGUsIFRvTmFtZSwgJ0EnICsgVG9MaW5rLCAoQ2hhbmdlID09IENPTk5FQ1QpID8gImVzdGFibGlzaGVkIiA6ICJkaXNjb25uZWN0ZWQiKTsKIH0KIAogLyoKQEAgLTk3MiwyNCArODI3LDIxIEBACiAqKiBEZWxldGUgYW5kIFJUQSBlbnRyeSBmcm9tIHRoZSBzYXZlZCB0YWJsZSBnaXZlbiB0byB1cwogKiogYnkgdGhlIGNvbmZpZ3VyYXRpb24gcHJvZ3JhbS4KICovCi1zdGF0aWMgaW50Ci1SSU9SZW1vdmVGcm9tU2F2ZWRUYWJsZShzdHJ1Y3QgcmlvX2luZm8gKnAsIHN0cnVjdCBNYXAgKnBNYXApCitzdGF0aWMgaW50IFJJT1JlbW92ZUZyb21TYXZlZFRhYmxlKHN0cnVjdCByaW9faW5mbyAqcCwgc3RydWN0IE1hcCAqcE1hcCkKIHsKLSAgICBpbnQJCWVudHJ5OworCWludCBlbnRyeTsKIAotICAgIC8qCi0gICAgKiogV2UgbG9vcCBmb3IgYWxsIGVudHJpZXMgZXZlbiBhZnRlciBmaW5kaW5nIGFuIGVudHJ5IGFuZAotICAgICoqIHplcm9pbmcgaXQgYmVjYXVzZSB3ZSBtYXkgaGF2ZSB0d28gZW50cmllcyB0byBkZWxldGUgaWYKLSAgICAqKiBpdCdzIGEgMTYgcG9ydCBSVEEuCi0gICAgKi8KLSAgICBmb3IgKGVudHJ5ID0gMDsgZW50cnkgPCBUT1RBTF9NQVBfRU5UUklFUzsgZW50cnkrKykKLSAgICB7Ci0JaWYgKHAtPlJJT1NhdmVkVGFibGVbZW50cnldLlJ0YVVuaXF1ZU51bSA9PSBwTWFwLT5SdGFVbmlxdWVOdW0pCi0JewotCSAgICBiemVybygoY2FkZHJfdCkmcC0+UklPU2F2ZWRUYWJsZVtlbnRyeV0sIHNpemVvZihzdHJ1Y3QgTWFwKSk7CisJLyoKKwkgKiogV2UgbG9vcCBmb3IgYWxsIGVudHJpZXMgZXZlbiBhZnRlciBmaW5kaW5nIGFuIGVudHJ5IGFuZAorCSAqKiB6ZXJvaW5nIGl0IGJlY2F1c2Ugd2UgbWF5IGhhdmUgdHdvIGVudHJpZXMgdG8gZGVsZXRlIGlmCisJICoqIGl0J3MgYSAxNiBwb3J0IFJUQS4KKwkgKi8KKwlmb3IgKGVudHJ5ID0gMDsgZW50cnkgPCBUT1RBTF9NQVBfRU5UUklFUzsgZW50cnkrKykgeworCQlpZiAocC0+UklPU2F2ZWRUYWJsZVtlbnRyeV0uUnRhVW5pcXVlTnVtID09IHBNYXAtPlJ0YVVuaXF1ZU51bSkgeworCQkJYnplcm8oKGNhZGRyX3QpICYgcC0+UklPU2F2ZWRUYWJsZVtlbnRyeV0sIHNpemVvZihzdHJ1Y3QgTWFwKSk7CisJCX0KIAl9Ci0gICAgfQotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiAKQEAgLTk5OSw2NCArODUxLDU4IEBACiAqKiBTY2FuIHRoZSB1bml0IGxpbmtzIHRvIGFuZCByZXR1cm4gemVybyBpZiB0aGUgdW5pdCBpcyBjb21wbGV0ZWx5CiAqKiBkaXNjb25uZWN0ZWQuCiAqLwotc3RhdGljIGludAotUklPRnJlZURpc2Nvbm5lY3RlZChzdHJ1Y3QgcmlvX2luZm8gKnAsIHN0cnVjdCBIb3N0ICpIb3N0UCwgaW50IHVuaXQpCitzdGF0aWMgaW50IFJJT0ZyZWVEaXNjb25uZWN0ZWQoc3RydWN0IHJpb19pbmZvICpwLCBzdHJ1Y3QgSG9zdCAqSG9zdFAsIGludCB1bml0KQogewotICAgIGludAkJbGluazsKKwlpbnQgbGluazsKIAogCi0gICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlJJT0ZyZWVEaXNjb25uZWN0IHVuaXQgJWRcbiIsIHVuaXQpOwotICAgIC8qCi0gICAgKiogSWYgdGhlIHNsb3QgaXMgdGVudGF0aXZlIGFuZCBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlCi0gICAgKiogc2Vjb25kIGhhbGYgb2YgYSAxNiBwb3J0IFJUQSB0aGVuIHNjYW4gdG8gc2VlIGlmCi0gICAgKiogaXMgZGlzY29ubmVjdGVkLgotICAgICovCi0gICAgZm9yIChsaW5rID0gMDsgbGluayA8IExJTktTX1BFUl9VTklUOyBsaW5rKyspCi0gICAgewotCWlmIChIb3N0UC0+TWFwcGluZ1t1bml0XS5Ub3BvbG9neVtsaW5rXS5Vbml0ICE9IFJPVVRFX0RJU0NPTk5FQ1QpCi0JICAgIGJyZWFrOwotICAgIH0KKwlyaW9fZHByaW50ayhSSU9fREVCVUdfUk9VVEUsICJSSU9GcmVlRGlzY29ubmVjdCB1bml0ICVkXG4iLCB1bml0KTsKKwkvKgorCSAqKiBJZiB0aGUgc2xvdCBpcyB0ZW50YXRpdmUgYW5kIGRvZXMgbm90IGJlbG9uZyB0byB0aGUKKwkgKiogc2Vjb25kIGhhbGYgb2YgYSAxNiBwb3J0IFJUQSB0aGVuIHNjYW4gdG8gc2VlIGlmCisJICoqIGlzIGRpc2Nvbm5lY3RlZC4KKwkgKi8KKwlmb3IgKGxpbmsgPSAwOyBsaW5rIDwgTElOS1NfUEVSX1VOSVQ7IGxpbmsrKykgeworCQlpZiAoSG9zdFAtPk1hcHBpbmdbdW5pdF0uVG9wb2xvZ3lbbGlua10uVW5pdCAhPSBST1VURV9ESVNDT05ORUNUKQorCQkJYnJlYWs7CisJfQogCi0gICAgLyoKLSAgICAqKiBJZiBub3QgYWxsIGxpbmtzIGFyZSBkaXNjb25uZWN0ZWQgdGhlbiB3ZSBjYW4gZm9yZ2V0IGFib3V0IGl0LgotICAgICovCi0gICAgaWYgKGxpbmsgPCBMSU5LU19QRVJfVU5JVCkKLQkgICAgcmV0dXJuIDE7CisJLyoKKwkgKiogSWYgbm90IGFsbCBsaW5rcyBhcmUgZGlzY29ubmVjdGVkIHRoZW4gd2UgY2FuIGZvcmdldCBhYm91dCBpdC4KKwkgKi8KKwlpZiAobGluayA8IExJTktTX1BFUl9VTklUKQorCQlyZXR1cm4gMTsKIAogI2lmZGVmIE5FRURfVE9fRklYX1RISVMKLSAgICAvKiBPayBzbyBhbGwgdGhlIGxpbmtzIGFyZSBkaXNjb25uZWN0ZWQuIEJ1dCB3ZSBtYXkgaGF2ZSBvbmx5IGp1c3QKLSAgICAqKiBtYWRlIHRoaXMgc2xvdCB0ZW50YXRpdmUgYW5kIG5vdCB5ZXQgcmVjZWl2ZWQgYSB0b3BvbG9neSB1cGRhdGUuCi0gICAgKiogTGV0cyBjaGVjayBob3cgbG9uZyBhZ28gd2UgbWFkZSBpdCB0ZW50YXRpdmUuCi0gICAgKi8KLSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiSnVzdCBhYm91dCB0byBjaGVjayBMQk9MVCBvbiBlbnRyeSAlZFxuIiwgdW5pdCk7Ci0gICAgaWYgKGRydl9nZXRwYXJtKExCT0xULCAodWxvbmdfdCAqKSAmY3VycmVudF90aW1lKSkKLSAgICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgImRydl9nZXRwYXJtKExCT0xULC4uLi4pIEZhaWxlZC5cbiIpOworCS8qIE9rIHNvIGFsbCB0aGUgbGlua3MgYXJlIGRpc2Nvbm5lY3RlZC4gQnV0IHdlIG1heSBoYXZlIG9ubHkganVzdAorCSAqKiBtYWRlIHRoaXMgc2xvdCB0ZW50YXRpdmUgYW5kIG5vdCB5ZXQgcmVjZWl2ZWQgYSB0b3BvbG9neSB1cGRhdGUuCisJICoqIExldHMgY2hlY2sgaG93IGxvbmcgYWdvIHdlIG1hZGUgaXQgdGVudGF0aXZlLgorCSAqLworCXJpb19kcHJpbnRrKFJJT19ERUJVR19ST1VURSwgIkp1c3QgYWJvdXQgdG8gY2hlY2sgTEJPTFQgb24gZW50cnkgJWRcbiIsIHVuaXQpOworCWlmIChkcnZfZ2V0cGFybShMQk9MVCwgKHVsb25nX3QgKikgJiBjdXJyZW50X3RpbWUpKQorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUk9VVEUsICJkcnZfZ2V0cGFybShMQk9MVCwuLi4uKSBGYWlsZWQuXG4iKTsKIAotICAgIGVsYXBzZV90aW1lID0gY3VycmVudF90aW1lIC0gVGVudFRpbWVbdW5pdF07Ci0gICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgImVsYXBzZSAlZCA9IGN1cnJlbnQgJWQgLSB0ZW50ICVkICglZCB1c2VjKVxuIiwKLSAgICAgICAgZWxhcHNlX3RpbWUsIGN1cnJlbnRfdGltZSwgVGVudFRpbWVbdW5pdF0sIGRydl9oenRvdXNlYyhlbGFwc2VfdGltZSkpOwotICAgIGlmIChkcnZfaHp0b3VzZWMoZWxhcHNlX3RpbWUpIDwgV0FJVF9UT19GSU5JU0gpCi0gICAgewotICAgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlNraXBwaW5nIHNsb3QgJWQsIG5vdCB0aW1lZCBvdXQgeWV0ICVkXG4iLAotICAgICAgICAgICAgdW5pdCwgZHJ2X2h6dG91c2VjKGVsYXBzZV90aW1lKSk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KKwllbGFwc2VfdGltZSA9IGN1cnJlbnRfdGltZSAtIFRlbnRUaW1lW3VuaXRdOworCXJpb19kcHJpbnRrKFJJT19ERUJVR19ST1VURSwgImVsYXBzZSAlZCA9IGN1cnJlbnQgJWQgLSB0ZW50ICVkICglZCB1c2VjKVxuIiwgZWxhcHNlX3RpbWUsIGN1cnJlbnRfdGltZSwgVGVudFRpbWVbdW5pdF0sIGRydl9oenRvdXNlYyhlbGFwc2VfdGltZSkpOworCWlmIChkcnZfaHp0b3VzZWMoZWxhcHNlX3RpbWUpIDwgV0FJVF9UT19GSU5JU0gpIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiU2tpcHBpbmcgc2xvdCAlZCwgbm90IHRpbWVkIG91dCB5ZXQgJWRcbiIsIHVuaXQsIGRydl9oenRvdXNlYyhlbGFwc2VfdGltZSkpOworCQlyZXR1cm4gMTsKKwl9CiAjZW5kaWYKIAotICAgIC8qCi0gICAgKiogV2UgaGF2ZSBmb3VuZCBhbiB1c2FibGUgc2xvdC4KLSAgICAqKiBJZiBpdCBpcyBoYWxmIG9mIGEgMTYgcG9ydCBSVEEgdGhlbiBkZWxldGUgdGhlIG90aGVyIGhhbGYuCi0gICAgKi8KLSAgICBpZiAoSG9zdFAtPk1hcHBpbmdbdW5pdF0uSUQyICE9IDApCi0gICAgewotCWludCBuT3RoZXIgPSAoSG9zdFAtPk1hcHBpbmdbdW5pdF0uSUQyKSAtMTsKKwkvKgorCSAqKiBXZSBoYXZlIGZvdW5kIGFuIHVzYWJsZSBzbG90LgorCSAqKiBJZiBpdCBpcyBoYWxmIG9mIGEgMTYgcG9ydCBSVEEgdGhlbiBkZWxldGUgdGhlIG90aGVyIGhhbGYuCisJICovCisJaWYgKEhvc3RQLT5NYXBwaW5nW3VuaXRdLklEMiAhPSAwKSB7CisJCWludCBuT3RoZXIgPSAoSG9zdFAtPk1hcHBpbmdbdW5pdF0uSUQyKSAtIDE7CiAKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiUmlvRnJlZWRpcyBzZWNvbmQgc2xvdCAlZC5cbiIsIG5PdGhlcik7Ci0JYnplcm8oKGNhZGRyX3QpJkhvc3RQLT5NYXBwaW5nW25PdGhlcl0sIHNpemVvZihzdHJ1Y3QgTWFwKSk7Ci0gICAgfQotICAgIFJJT1JlbW92ZUZyb21TYXZlZFRhYmxlKHAsICZIb3N0UC0+TWFwcGluZ1t1bml0XSk7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19ST1VURSwgIlJpb0ZyZWVkaXMgc2Vjb25kIHNsb3QgJWQuXG4iLCBuT3RoZXIpOworCQliemVybygoY2FkZHJfdCkgJiBIb3N0UC0+TWFwcGluZ1tuT3RoZXJdLCBzaXplb2Yoc3RydWN0IE1hcCkpOworCX0KKwlSSU9SZW1vdmVGcm9tU2F2ZWRUYWJsZShwLCAmSG9zdFAtPk1hcHBpbmdbdW5pdF0pOwogCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIApAQCAtMTA2NiwxNTAgKzkxMiwxMzQgQEAKICoqIFRoaXMgZnVuY3Rpb24gc2NhbnMgdGhlIGdpdmVuIGhvc3QgdGFibGUgZm9yIGVpdGhlciBvbmUKICoqIG9yIHR3byBmcmVlIHVuaXQgSUQncy4KICovCi1pbnQKLVJJT0ZpbmRGcmVlSUQoc3RydWN0IHJpb19pbmZvICpwLCBzdHJ1Y3QgSG9zdCAqSG9zdFAsIHVpbnQgKnBJRDEsIHVpbnQgKnBJRDIpCitpbnQgUklPRmluZEZyZWVJRChzdHJ1Y3QgcmlvX2luZm8gKnAsIHN0cnVjdCBIb3N0ICpIb3N0UCwgdWludCAqIHBJRDEsIHVpbnQgKiBwSUQyKQogewotICAgIGludCB1bml0LHRlbXBJRDsKKwlpbnQgdW5pdCwgdGVtcElEOwogCi0gICAgLyoKLSAgICAqKiBJbml0aWFsaXNlIHRoZSBJRCdzIHRvIE1BWF9SVVAuCi0gICAgKiogV2UgZG8gdGhpcyB0byBtYWtlIHRoZSBsb29wIGZvciBzZXR0aW5nIHRoZSBJRCdzIGFzIHNpbXBsZSBhcwotICAgICoqIHBvc3NpYmxlLgotICAgICovCi0gICAgKnBJRDEgPSBNQVhfUlVQOwotICAgIGlmIChwSUQyICE9IE5VTEwpCi0JKnBJRDIgPSBNQVhfUlVQOwotCi0gICAgLyoKLSAgICAqKiBTY2FuIGFsbCBlbnRyaWVzIG9mIHRoZSBob3N0IG1hcHBpbmcgdGFibGUgZm9yIGZyZWUgc2xvdHMuCi0gICAgKiogV2Ugc2NhbiBmb3IgZnJlZSBzbG90cyBmaXJzdCBhbmQgdGhlbiBpZiB0aGF0IGlzIG5vdCBzdWNjZXNzZnVsCi0gICAgKiogd2Ugc3RhcnQgYWxsIG92ZXIgYWdhaW4gbG9va2luZyBmb3IgdGVudGF0aXZlIHNsb3RzIHdlIGNhbiByZS11c2UuCi0gICAgKi8KLSAgICBmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX1JVUDsgdW5pdCsrKQotICAgIHsKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiU2Nhbm5pbmcgdW5pdCAlZFxuIix1bml0KTsKIAkvKgotCSoqIElmIHRoZSBmbGFncyBhcmUgemVybyB0aGVuIHRoZSBzbG90IGlzIGVtcHR5LgotCSovCi0JaWYgKEhvc3RQLT5NYXBwaW5nW3VuaXRdLkZsYWdzID09IDApCi0JewotCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiICAgICAgVGhpcyBzbG90IGlzIGVtcHR5LlxuIik7Ci0JICAgIC8qCi0JICAgICoqIElmIHdlIGhhdmVuJ3QgYWxsb2NhdGVkIHRoZSBmaXJzdCBJRCB0aGVuIGRvIGl0IG5vdy4KLQkgICAgKi8KLQkgICAgaWYgKCpwSUQxID09IE1BWF9SVVApCi0JICAgIHsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIk1ha2UgdGVudGF0aXZlIGVudHJ5IGZvciBmaXJzdCB1bml0ICVkXG4iLCB1bml0KTsKLQkJKnBJRDEgPSB1bml0OworCSAqKiBJbml0aWFsaXNlIHRoZSBJRCdzIHRvIE1BWF9SVVAuCisJICoqIFdlIGRvIHRoaXMgdG8gbWFrZSB0aGUgbG9vcCBmb3Igc2V0dGluZyB0aGUgSUQncyBhcyBzaW1wbGUgYXMKKwkgKiogcG9zc2libGUuCisJICovCisJKnBJRDEgPSBNQVhfUlVQOworCWlmIChwSUQyICE9IE5VTEwpCisJCSpwSUQyID0gTUFYX1JVUDsKIAorCS8qCisJICoqIFNjYW4gYWxsIGVudHJpZXMgb2YgdGhlIGhvc3QgbWFwcGluZyB0YWJsZSBmb3IgZnJlZSBzbG90cy4KKwkgKiogV2Ugc2NhbiBmb3IgZnJlZSBzbG90cyBmaXJzdCBhbmQgdGhlbiBpZiB0aGF0IGlzIG5vdCBzdWNjZXNzZnVsCisJICoqIHdlIHN0YXJ0IGFsbCBvdmVyIGFnYWluIGxvb2tpbmcgZm9yIHRlbnRhdGl2ZSBzbG90cyB3ZSBjYW4gcmUtdXNlLgorCSAqLworCWZvciAodW5pdCA9IDA7IHVuaXQgPCBNQVhfUlVQOyB1bml0KyspIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiU2Nhbm5pbmcgdW5pdCAlZFxuIiwgdW5pdCk7CiAJCS8qCi0JCSoqIElmIHRoZSBzZWNvbmQgSUQgaXMgbm90IG5lZWRlZCB0aGVuIHdlIGNhbiByZXR1cm4KLQkJKiogbm93LgotCQkqLwotCQlpZiAocElEMiA9PSBOVUxMKQotCQkgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCS8qCi0JCSoqIEFsbG9jYXRlIHRoZSBzZWNvbmQgc2xvdCBhbmQgcmV0dXJuLgotCQkqLwotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiTWFrZSB0ZW50YXRpdmUgZW50cnkgZm9yIHNlY29uZCB1bml0ICVkXG4iLCB1bml0KTsKLQkJKnBJRDIgPSB1bml0OwotCQlyZXR1cm4gMDsKLQkgICAgfQotCX0KLSAgICB9CisJCSAqKiBJZiB0aGUgZmxhZ3MgYXJlIHplcm8gdGhlbiB0aGUgc2xvdCBpcyBlbXB0eS4KKwkJICovCisJCWlmIChIb3N0UC0+TWFwcGluZ1t1bml0XS5GbGFncyA9PSAwKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUk9VVEUsICIgICAgICBUaGlzIHNsb3QgaXMgZW1wdHkuXG4iKTsKKwkJCS8qCisJCQkgKiogSWYgd2UgaGF2ZW4ndCBhbGxvY2F0ZWQgdGhlIGZpcnN0IElEIHRoZW4gZG8gaXQgbm93LgorCQkJICovCisJCQlpZiAoKnBJRDEgPT0gTUFYX1JVUCkgeworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19ST1VURSwgIk1ha2UgdGVudGF0aXZlIGVudHJ5IGZvciBmaXJzdCB1bml0ICVkXG4iLCB1bml0KTsKKwkJCQkqcElEMSA9IHVuaXQ7CiAKLSAgICAvKgotICAgICoqIElmIHdlIG1hbmFnZSB0byBjb21lIG91dCBvZiB0aGUgZnJlZSBzbG90IGxvb3AgdGhlbiB3ZQotICAgICoqIG5lZWQgdG8gc3RhcnQgYWxsIG92ZXIgYWdhaW4gbG9va2luZyBmb3IgdGVudGF0aXZlIHNsb3RzCi0gICAgKiogdGhhdCB3ZSBjYW4gcmUtdXNlLgotICAgICovCi0gICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIlN0YXJ0aW5nIHRvIHNjYW4gZm9yIHRlbnRhdGl2ZSBzbG90c1xuIik7Ci0gICAgZm9yICh1bml0ID0gMDsgdW5pdCA8IE1BWF9SVVA7IHVuaXQrKykKLSAgICB7Ci0JaWYgKCgoSG9zdFAtPk1hcHBpbmdbdW5pdF0uRmxhZ3MgJiBTTE9UX1RFTlRBVElWRSkgfHwKLQkgICAgICAgICAgICAgICAgICAgICAgIChIb3N0UC0+TWFwcGluZ1t1bml0XS5GbGFncyA9PSAwKSkgICYmICEgCi0JICAgKEhvc3RQLT5NYXBwaW5nW3VuaXRdLkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QgKSkKLQl7Ci0JICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICIgICAgU2xvdCAlZCBsb29rcyBwcm9taXNpbmcuXG4iLHVuaXQpOwotCi0JICAgIGlmKHVuaXQgPT0gKnBJRDEpCi0JICAgIHsKLQkgICAgCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICIgICAgTm8gaXQgaXNuJ3QsIGl0cyB0aGUgMXN0IGhhbGZcbiIpOwotCQljb250aW51ZTsKLQkgICAgfQotCi0JICAgIC8qCi0JICAgICoqIFNsb3QgaXMgVGVudGF0aXZlIG9yIEVtcHR5LCBidXQgbm90IGEgdGVudGF0aXZlIHNlY29uZCAKLQkgICAgKiogc2xvdCBvZiBhIDE2IHBvcnRlci4KLQkgICAgKiogQXR0ZW1wdCB0byBmcmVlIHVwIHRoaXMgc2xvdCAoYW5kIGl0cyBwYXJudGVyIGlmCi0JICAgICoqIGl0IGlzIGEgMTYgcG9ydCBzbG90LiBUaGUgc2Vjb25kIHNsb3Qgd2lsbCBiZWNvbWUKLQkgICAgKiogZW1wdHkgYWZ0ZXIgYSBjYWxsIHRvIFJJT0ZyZWVEaXNjb25uZWN0ZWQgc28gdGhhdHMgd2h5Ci0JICAgICoqIHdlIGxvb2sgZm9yIGVtcHR5IHNsb3RzIGFib3ZlICBhcyB3ZWxsKS4KLQkgICAgKi8KLQkgICAgaWYgKEhvc3RQLT5NYXBwaW5nW3VuaXRdLkZsYWdzICE9IDApIAotCSAgICAJaWYgKFJJT0ZyZWVEaXNjb25uZWN0ZWQocCwgSG9zdFAsIHVuaXQpICE9IDApCi0JCQkgICAgY29udGludWU7Ci0JICAgIC8qCi0JICAgICoqIElmIHdlIGhhdmVuJ3QgYWxsb2NhdGVkIHRoZSBmaXJzdCBJRCB0aGVuIGRvIGl0IG5vdy4KLQkgICAgKi8KLQkgICAgaWYgKCpwSUQxID09IE1BWF9SVVApCi0JICAgIHsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19ST1VURSwgIkdyYWIgdGVudGF0aXZlIGVudHJ5IGZvciBmaXJzdCB1bml0ICVkXG4iLCB1bml0KTsKLQkJKnBJRDEgPSB1bml0OwotCi0JCS8qCi0JCSoqIENsZWFyIG91dCB0aGlzIHNsb3Qgbm93IHRoYXQgd2UgaW50ZW5kIHRvIHVzZSBpdC4KLQkJKi8KLQkJYnplcm8oJkhvc3RQLT5NYXBwaW5nW3VuaXRdLCBzaXplb2Yoc3RydWN0IE1hcCkpOwotCi0JCS8qCi0JCSoqIElmIHRoZSBzZWNvbmQgSUQgaXMgbm90IG5lZWRlZCB0aGVuIHdlIGNhbiByZXR1cm4KLQkJKiogbm93LgotCQkqLwotCQlpZiAocElEMiA9PSBOVUxMKQotCQkgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCS8qCi0JCSoqIEFsbG9jYXRlIHRoZSBzZWNvbmQgc2xvdCBhbmQgcmV0dXJuLgotCQkqLwotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1JPVVRFLCAiR3JhYiB0ZW50YXRpdmUvZW1wdHkgIGVudHJ5IGZvciBzZWNvbmQgdW5pdCAlZFxuIiwKLQkJICAgICAgdW5pdCk7Ci0JCSpwSUQyID0gdW5pdDsKLQotCQkvKgotCQkqKiBDbGVhciBvdXQgdGhpcyBzbG90IG5vdyB0aGF0IHdlIGludGVuZCB0byB1c2UgaXQuCi0JCSovCi0JCWJ6ZXJvKCZIb3N0UC0+TWFwcGluZ1t1bml0XSwgc2l6ZW9mKHN0cnVjdCBNYXApKTsKLQotCQkvKiBBdCB0aGlzIHBvaW50IHVuZGVyIHRoZSByaWdodCh3cm9uZz8pIGNvbmRpdGlvbnMKLQkJKiogd2UgbWF5IGhhdmUgYSBmaXJzdCB1bml0IElEIGJlaW5nIGhpZ2hlciB0aGFuIHRoZQotCQkqKiBzZWNvbmQgdW5pdCBJRC4gVGhpcyBpcyBhIGJhZCBpZGVhIGlmIHdlIGFyZSBhYm91dAotCQkqKiB0byBmaWxsIHRoZSBzbG90cyB3aXRoIGEgMTYgcG9ydCBSVEEuCi0JCSoqIEJldHRlciBjaGVjayBhbmQgc3dhcCB0aGVtIG92ZXIuCi0JCSovCi0KLQkJaWYgKCpwSUQxID4gKnBJRDIpCi0JCXsKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfUk9VVEUsICJTd2FwcGluZyBJRFMgJWQgJWRcbiIsICpwSUQxLCAqcElEMik7Ci0JCQl0ZW1wSUQgPSAqcElEMTsKLQkJCSpwSUQxID0gKnBJRDI7Ci0JCQkqcElEMiA9IHRlbXBJRDsKKwkJCQkvKgorCQkJCSAqKiBJZiB0aGUgc2Vjb25kIElEIGlzIG5vdCBuZWVkZWQgdGhlbiB3ZSBjYW4gcmV0dXJuCisJCQkJICoqIG5vdy4KKwkJCQkgKi8KKwkJCQlpZiAocElEMiA9PSBOVUxMKQorCQkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiogQWxsb2NhdGUgdGhlIHNlY29uZCBzbG90IGFuZCByZXR1cm4uCisJCQkJICovCisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiTWFrZSB0ZW50YXRpdmUgZW50cnkgZm9yIHNlY29uZCB1bml0ICVkXG4iLCB1bml0KTsKKwkJCQkqcElEMiA9IHVuaXQ7CisJCQkJcmV0dXJuIDA7CisJCQl9CiAJCX0KLQkJcmV0dXJuIDA7Ci0JICAgIH0KIAl9Ci0gICAgfQogCi0gICAgLyoKLSAgICAqKiBJZiB3ZSBtYW5hZ2UgdG8gZ2V0IHRvIHRoZSBlbmQgb2YgdGhlIHNlY29uZCBsb29wIHRoZW4gd2UKLSAgICAqKiBjYW4gZ2l2ZSB1cCBhbmQgcmV0dXJuIGEgZmFpbHVyZS4KLSAgICAqLwotICAgIHJldHVybiAxOworCS8qCisJICoqIElmIHdlIG1hbmFnZSB0byBjb21lIG91dCBvZiB0aGUgZnJlZSBzbG90IGxvb3AgdGhlbiB3ZQorCSAqKiBuZWVkIHRvIHN0YXJ0IGFsbCBvdmVyIGFnYWluIGxvb2tpbmcgZm9yIHRlbnRhdGl2ZSBzbG90cworCSAqKiB0aGF0IHdlIGNhbiByZS11c2UuCisJICovCisJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiU3RhcnRpbmcgdG8gc2NhbiBmb3IgdGVudGF0aXZlIHNsb3RzXG4iKTsKKwlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX1JVUDsgdW5pdCsrKSB7CisJCWlmICgoKEhvc3RQLT5NYXBwaW5nW3VuaXRdLkZsYWdzICYgU0xPVF9URU5UQVRJVkUpIHx8IChIb3N0UC0+TWFwcGluZ1t1bml0XS5GbGFncyA9PSAwKSkgJiYgIShIb3N0UC0+TWFwcGluZ1t1bml0XS5GbGFncyAmIFJUQTE2X1NFQ09ORF9TTE9UKSkgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiICAgIFNsb3QgJWQgbG9va3MgcHJvbWlzaW5nLlxuIiwgdW5pdCk7CisKKwkJCWlmICh1bml0ID09ICpwSUQxKSB7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1JPVVRFLCAiICAgIE5vIGl0IGlzbid0LCBpdHMgdGhlIDFzdCBoYWxmXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqKiBTbG90IGlzIFRlbnRhdGl2ZSBvciBFbXB0eSwgYnV0IG5vdCBhIHRlbnRhdGl2ZSBzZWNvbmQKKwkJCSAqKiBzbG90IG9mIGEgMTYgcG9ydGVyLgorCQkJICoqIEF0dGVtcHQgdG8gZnJlZSB1cCB0aGlzIHNsb3QgKGFuZCBpdHMgcGFybnRlciBpZgorCQkJICoqIGl0IGlzIGEgMTYgcG9ydCBzbG90LiBUaGUgc2Vjb25kIHNsb3Qgd2lsbCBiZWNvbWUKKwkJCSAqKiBlbXB0eSBhZnRlciBhIGNhbGwgdG8gUklPRnJlZURpc2Nvbm5lY3RlZCBzbyB0aGF0cyB3aHkKKwkJCSAqKiB3ZSBsb29rIGZvciBlbXB0eSBzbG90cyBhYm92ZSAgYXMgd2VsbCkuCisJCQkgKi8KKwkJCWlmIChIb3N0UC0+TWFwcGluZ1t1bml0XS5GbGFncyAhPSAwKQorCQkJCWlmIChSSU9GcmVlRGlzY29ubmVjdGVkKHAsIEhvc3RQLCB1bml0KSAhPSAwKQorCQkJCQljb250aW51ZTsKKwkJCS8qCisJCQkgKiogSWYgd2UgaGF2ZW4ndCBhbGxvY2F0ZWQgdGhlIGZpcnN0IElEIHRoZW4gZG8gaXQgbm93LgorCQkJICovCisJCQlpZiAoKnBJRDEgPT0gTUFYX1JVUCkgeworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19ST1VURSwgIkdyYWIgdGVudGF0aXZlIGVudHJ5IGZvciBmaXJzdCB1bml0ICVkXG4iLCB1bml0KTsKKwkJCQkqcElEMSA9IHVuaXQ7CisKKwkJCQkvKgorCQkJCSAqKiBDbGVhciBvdXQgdGhpcyBzbG90IG5vdyB0aGF0IHdlIGludGVuZCB0byB1c2UgaXQuCisJCQkJICovCisJCQkJYnplcm8oJkhvc3RQLT5NYXBwaW5nW3VuaXRdLCBzaXplb2Yoc3RydWN0IE1hcCkpOworCisJCQkJLyoKKwkJCQkgKiogSWYgdGhlIHNlY29uZCBJRCBpcyBub3QgbmVlZGVkIHRoZW4gd2UgY2FuIHJldHVybgorCQkJCSAqKiBub3cuCisJCQkJICovCisJCQkJaWYgKHBJRDIgPT0gTlVMTCkKKwkJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICoqIEFsbG9jYXRlIHRoZSBzZWNvbmQgc2xvdCBhbmQgcmV0dXJuLgorCQkJCSAqLworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19ST1VURSwgIkdyYWIgdGVudGF0aXZlL2VtcHR5ICBlbnRyeSBmb3Igc2Vjb25kIHVuaXQgJWRcbiIsIHVuaXQpOworCQkJCSpwSUQyID0gdW5pdDsKKworCQkJCS8qCisJCQkJICoqIENsZWFyIG91dCB0aGlzIHNsb3Qgbm93IHRoYXQgd2UgaW50ZW5kIHRvIHVzZSBpdC4KKwkJCQkgKi8KKwkJCQliemVybygmSG9zdFAtPk1hcHBpbmdbdW5pdF0sIHNpemVvZihzdHJ1Y3QgTWFwKSk7CisKKwkJCQkvKiBBdCB0aGlzIHBvaW50IHVuZGVyIHRoZSByaWdodCh3cm9uZz8pIGNvbmRpdGlvbnMKKwkJCQkgKiogd2UgbWF5IGhhdmUgYSBmaXJzdCB1bml0IElEIGJlaW5nIGhpZ2hlciB0aGFuIHRoZQorCQkJCSAqKiBzZWNvbmQgdW5pdCBJRC4gVGhpcyBpcyBhIGJhZCBpZGVhIGlmIHdlIGFyZSBhYm91dAorCQkJCSAqKiB0byBmaWxsIHRoZSBzbG90cyB3aXRoIGEgMTYgcG9ydCBSVEEuCisJCQkJICoqIEJldHRlciBjaGVjayBhbmQgc3dhcCB0aGVtIG92ZXIuCisJCQkJICovCisKKwkJCQlpZiAoKnBJRDEgPiAqcElEMikgeworCQkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUk9VVEUsICJTd2FwcGluZyBJRFMgJWQgJWRcbiIsICpwSUQxLCAqcElEMik7CisJCQkJCXRlbXBJRCA9ICpwSUQxOworCQkJCQkqcElEMSA9ICpwSUQyOworCQkJCQkqcElEMiA9IHRlbXBJRDsKKwkJCQl9CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqKiBJZiB3ZSBtYW5hZ2UgdG8gZ2V0IHRvIHRoZSBlbmQgb2YgdGhlIHNlY29uZCBsb29wIHRoZW4gd2UKKwkgKiogY2FuIGdpdmUgdXAgYW5kIHJldHVybiBhIGZhaWx1cmUuCisJICovCisJcmV0dXJuIDE7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9zcGFjZS5oIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9zcGFjZS5oCmluZGV4IDMyYjA5YjAuLjUzNGYxZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vcmlvc3BhY2UuaAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3NwYWNlLmgKQEAgLTQ3LDkgKzQ3LDggQEAKICoqIEluIHBhcnRpY3VsYXIsIGl0IHdvbid0IGJlIGFibGUgdG8gc2VlIGNoYW5nZXMgdG8gUklPX1NMT1RTCiAqLwogCi1zdHJ1Y3QgQ29uZgotewotCWNoYXIgICAgICAgICBMb2NhdG9yWzI0XTsKK3N0cnVjdCBDb25mIHsKKwljaGFyIExvY2F0b3JbMjRdOwogCXVuc2lnbmVkIGludCBTdGFydHVwVGltZTsKIAl1bnNpZ25lZCBpbnQgU2xvd0Nvb2s7CiAJdW5zaWduZWQgaW50IEludHJQb2xsVGltZTsKQEAgLTU5LDggKzU4LDggQEAKIAl1bnNpZ25lZCBpbnQgSG9zdExvYWRCYXNlOwogCXVuc2lnbmVkIGludCBYcEh6OwogCXVuc2lnbmVkIGludCBYcENwczsKLQljaGFyICAgICAgICAgKlhwT247Ci0JY2hhciAgICAgICAgICpYcE9mZjsKKwljaGFyICpYcE9uOworCWNoYXIgKlhwT2ZmOwogCXVuc2lnbmVkIGludCBNYXhYcENwczsKIAl1bnNpZ25lZCBpbnQgTWluWHBDcHM7CiAJdW5zaWduZWQgaW50IFNwaW5DbWRzOwpAQCAtNzQsNyArNzMsNyBAQAogCiAvKgogKioJQm9hcmQgdHlwZXMgLSB0aGVzZSBNVVNUIGNvcnJlc3BvbmQgdG8gcHJvZHVjdCBjb2RlcyEKLSovIAorKi8KICNkZWZpbmUJUklPX0VNUFRZCTB4MAogI2RlZmluZQlSSU9fRUlTQQkweDMKICNkZWZpbmUJUklPX1JUQV8xNgkweDkKQEAgLTg2LDE4ICs4NSwxNiBAQAogLyoKICoqCUJvYXJkIGRhdGEgc3RydWN0dXJlLiBUaGlzIGlzIHVzZWQgZm9yIGNvbmZpZ3VyYXRpb24gaW5mbwogKi8KLXN0cnVjdAlCcmQKLXsKLSAgICB1bnNpZ25lZCBjaGFyIFR5cGU7CS8qIFJJT19FSVNBLCBSSU9fTUNBLCBSSU9fQVQsIFJJT19FTVBUWS4uLiAqLwotICAgIHVuc2lnbmVkIGNoYXIgSXZlYzsJLyogUE9MTEVEIG9yIGl2ZWMgbnVtYmVyICovCi0gICAgdW5zaWduZWQgY2hhciBNb2RlOwkvKiBDb250cm9sIHN0dWZmLCBzZWUgYmVsb3cgKi8KK3N0cnVjdCBCcmQgeworCXVuc2lnbmVkIGNoYXIgVHlwZTsJLyogUklPX0VJU0EsIFJJT19NQ0EsIFJJT19BVCwgUklPX0VNUFRZLi4uICovCisJdW5zaWduZWQgY2hhciBJdmVjOwkvKiBQT0xMRUQgb3IgaXZlYyBudW1iZXIgKi8KKwl1bnNpZ25lZCBjaGFyIE1vZGU7CS8qIENvbnRyb2wgc3R1ZmYsIHNlZSBiZWxvdyAqLwogfTsKIAotc3RydWN0CUJvYXJkCi17Ci0gICAgY2hhciAgICAgICBMb2NhdG9yW1JJT19MT0NBVE9SX0xFTl07Ci0gICAgaW50ICAgICAgICBOdW1TbG90czsKLSAgICBzdHJ1Y3QgQnJkIEJvYXJkc1tNQVhfUklPX0JPQVJEU107CitzdHJ1Y3QgQm9hcmQgeworCWNoYXIgTG9jYXRvcltSSU9fTE9DQVRPUl9MRU5dOworCWludCBOdW1TbG90czsKKwlzdHJ1Y3QgQnJkIEJvYXJkc1tNQVhfUklPX0JPQVJEU107CiB9OwogCiAjZGVmaW5lCUJPT1RfRlJPTV9MSU5LCQkweDAwCkBAIC0xNTgsNCArMTU1LDQgQEAKIAogI2RlZmluZQlEQkdfQUxXQVlTCTB4ODAwMDAwMDAKIAotI2VuZGlmIC8qIF9fcmlvX3Jpb3NwYWNlX2hfXyAqLworI2VuZGlmCQkJCS8qIF9fcmlvX3Jpb3NwYWNlX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW90YWJsZS5jIGIvZHJpdmVycy9jaGFyL3Jpby9yaW90YWJsZS5jCmluZGV4IGU0NWJjMjcuLmE4NmIyMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vcmlvdGFibGUuYworKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3RhYmxlLmMKQEAgLTkxLDkgKzkxLDggQEAKICoqIEEgY29uZmlndXJhdGlvbiB0YWJsZSBoYXMgYmVlbiBsb2FkZWQuIEl0IGlzIG5vdyB1cCB0byB1cwogKiogdG8gc29ydCBpdCBvdXQgYW5kIHVzZSB0aGUgaW5mb3JtYXRpb24gY29udGFpbmVkIHRoZXJlaW4uCiAqLwotaW50Ci1SSU9OZXdUYWJsZShwKQotc3RydWN0IHJpb19pbmZvICoJcDsKK2ludCBSSU9OZXdUYWJsZShwKQorc3RydWN0IHJpb19pbmZvICpwOwogewogCWludCBIb3N0LCBIb3N0MSwgSG9zdDIsIE5hbWVJc1VuaXF1ZSwgRW50cnksIFN1YkVudDsKIAlzdHJ1Y3QgTWFwICpNYXBQOwpAQCAtMTAzLDI2ICsxMDIsMjYgQEAKIAljaGFyICpjcHRyOwogCiAJLyoKLQkqKiBXZSBoYXZlIGJlZW4gc2VudCBhIG5ldyB0YWJsZSB0byBpbnN0YWxsLiBXZSBuZWVkIHRvIGJyZWFrCi0JKiogaXQgZG93biBpbnRvIGxpdHRsZSBiaXRzIGFuZCBzcHJlYWQgaXQgYXJvdW5kIGEgYml0IHRvIHNlZQotCSoqIHdoYXQgd2UgaGF2ZSBnb3QuCi0JKi8KKwkgKiogV2UgaGF2ZSBiZWVuIHNlbnQgYSBuZXcgdGFibGUgdG8gaW5zdGFsbC4gV2UgbmVlZCB0byBicmVhaworCSAqKiBpdCBkb3duIGludG8gbGl0dGxlIGJpdHMgYW5kIHNwcmVhZCBpdCBhcm91bmQgYSBiaXQgdG8gc2VlCisJICoqIHdoYXQgd2UgaGF2ZSBnb3QuCisJICovCiAJLyoKLQkqKiBUaGluZ3MgdG8gY2hlY2s6Ci0JKiogKHRoaW5ncyBtYXJrZWQgJ3h4JyBhcmVuJ3QgY2hlY2tlZCBhbnkgbW9yZSEpCi0JKiogKDEpCVRoYXQgdGhlcmUgYXJlIG5vIGJvb3RlZCBIb3N0cy9SVEFzIG91dCB0aGVyZS4KLQkqKiAoMikJVGhhdCB0aGUgbmFtZXMgYXJlIHByb3Blcmx5IGZvcm1lZAotCSoqICgzKQlUaGF0IGJsYW5rIGVudHJpZXMgcmVhbGx5IGFyZS4KLQkqKiB4eCAoNCkJVGhhdCBob3N0cyBtZW50aW9uZWQgaW4gdGhlIHRhYmxlIGFjdHVhbGx5IGV4aXN0LiB4eAotCSoqICg1KQlUaGF0IHRoZSBJRHMgYXJlIHVuaXF1ZSAocGVyIGhvc3QpLgotCSoqICg2KQlUaGF0IGhvc3QgSURzIGFyZSB6ZXJvCi0JKiogKDcpCVRoYXQgcG9ydCBudW1iZXJzIGFyZSB2YWxpZAotCSoqICg4KQlUaGF0IHBvcnQgbnVtYmVycyBhcmVuJ3QgZHVwbGljYXRlZAotCSoqICg5KQlUaGF0IG5hbWVzIGFyZW4ndCBkdXBsaWNhdGVkCi0JKiogeHggKDEwKSBUaGF0IGhvc3RzIHRoYXQgYWN0dWFsbHkgZXhpc3QgYXJlIG1lbnRpb25lZCBpbiB0aGUgdGFibGUuIHh4Ci0JKi8KLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUklPTmV3VGFibGU6IGVudGVyaW5nKDEpXG4iKTsgCi0JaWYgKCBwLT5SSU9TeXN0ZW1VcCApIHsJCS8qICgxKSAqLworCSAqKiBUaGluZ3MgdG8gY2hlY2s6CisJICoqICh0aGluZ3MgbWFya2VkICd4eCcgYXJlbid0IGNoZWNrZWQgYW55IG1vcmUhKQorCSAqKiAoMSkgVGhhdCB0aGVyZSBhcmUgbm8gYm9vdGVkIEhvc3RzL1JUQXMgb3V0IHRoZXJlLgorCSAqKiAoMikgVGhhdCB0aGUgbmFtZXMgYXJlIHByb3Blcmx5IGZvcm1lZAorCSAqKiAoMykgVGhhdCBibGFuayBlbnRyaWVzIHJlYWxseSBhcmUuCisJICoqIHh4ICg0KSAgICAgIFRoYXQgaG9zdHMgbWVudGlvbmVkIGluIHRoZSB0YWJsZSBhY3R1YWxseSBleGlzdC4geHgKKwkgKiogKDUpIFRoYXQgdGhlIElEcyBhcmUgdW5pcXVlIChwZXIgaG9zdCkuCisJICoqICg2KSBUaGF0IGhvc3QgSURzIGFyZSB6ZXJvCisJICoqICg3KSBUaGF0IHBvcnQgbnVtYmVycyBhcmUgdmFsaWQKKwkgKiogKDgpIFRoYXQgcG9ydCBudW1iZXJzIGFyZW4ndCBkdXBsaWNhdGVkCisJICoqICg5KSBUaGF0IG5hbWVzIGFyZW4ndCBkdXBsaWNhdGVkCisJICoqIHh4ICgxMCkgVGhhdCBob3N0cyB0aGF0IGFjdHVhbGx5IGV4aXN0IGFyZSBtZW50aW9uZWQgaW4gdGhlIHRhYmxlLiB4eAorCSAqLworCXJpb19kcHJpbnRrKFJJT19ERUJVR19UQUJMRSwgIlJJT05ld1RhYmxlOiBlbnRlcmluZygxKVxuIik7CisJaWYgKHAtPlJJT1N5c3RlbVVwKSB7CS8qICgxKSAqLwogCQlwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfSEFTX0FMUkVBRFlfQkVFTl9CT09URUQ7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtMTMxLDE5ICsxMzAsMTkgQEAKIAlwLT5SSU9FcnJvci5FbnRyeSA9IC0xOwogCXAtPlJJT0Vycm9yLk90aGVyID0gLTE7CiAKLQlmb3IgKCBFbnRyeT0wOyBFbnRyeTxUT1RBTF9NQVBfRU5UUklFUzsgRW50cnkrKyApIHsKKwlmb3IgKEVudHJ5ID0gMDsgRW50cnkgPCBUT1RBTF9NQVBfRU5UUklFUzsgRW50cnkrKykgewogCQlNYXBQID0gJnAtPlJJT0Nvbm5lY3RUYWJsZVtFbnRyeV07CiAJCWlmICgoTWFwUC0+RmxhZ3MgJiBSVEExNl9TRUNPTkRfU0xPVCkgPT0gMCkgewotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJT05ld1RhYmxlOiBlbnRlcmluZygyKVxuIik7Ci0JCQljcHRyID0gTWFwUC0+TmFtZTsJCS8qICgyKSAqLwotCQkJY3B0cltNQVhfTkFNRV9MRU4tMV09J1wwJzsKLQkJCWlmICggY3B0clswXT09J1wwJyApIHsKLQkJCQliY29weShNYXBQLT5SdGFVbmlxdWVOdW0/IlJUQQlOTiI6IkhPU1QgTk4iLE1hcFAtPk5hbWUsOCk7Ci0JCQkJTWFwUC0+TmFtZVs1XSA9ICcwJytFbnRyeS8xMDsKLQkJCQlNYXBQLT5OYW1lWzZdID0gJzAnK0VudHJ5JTEwOworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiUklPTmV3VGFibGU6IGVudGVyaW5nKDIpXG4iKTsKKwkJCWNwdHIgPSBNYXBQLT5OYW1lOwkvKiAoMikgKi8KKwkJCWNwdHJbTUFYX05BTUVfTEVOIC0gMV0gPSAnXDAnOworCQkJaWYgKGNwdHJbMF0gPT0gJ1wwJykgeworCQkJCWJjb3B5KE1hcFAtPlJ0YVVuaXF1ZU51bSA/ICJSVEEJTk4iIDogIkhPU1QgTk4iLCBNYXBQLT5OYW1lLCA4KTsKKwkJCQlNYXBQLT5OYW1lWzVdID0gJzAnICsgRW50cnkgLyAxMDsKKwkJCQlNYXBQLT5OYW1lWzZdID0gJzAnICsgRW50cnkgJSAxMDsKIAkJCX0KLQkJCXdoaWxlICggKmNwdHIgKSB7Ci0JCQkJaWYgKCAqY3B0cjwnICcgfHwgKmNwdHI+J34nICkgeworCQkJd2hpbGUgKCpjcHRyKSB7CisJCQkJaWYgKCpjcHRyIDwgJyAnIHx8ICpjcHRyID4gJ34nKSB7CiAJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQkFEX0NIQVJBQ1RFUl9JTl9OQU1FOwogCQkJCQlwLT5SSU9FcnJvci5FbnRyeSA9IEVudHJ5OwogCQkJCQlyZXR1cm4gLUVOWElPOwpAQCAtMTUzLDEzMyArMTUyLDExOSBAQAogCQl9CiAKIAkJLyoKLQkJKiogSWYgdGhlIGVudHJ5IHNhdmVkIHdhcyBhIHRlbnRhdGl2ZSBlbnRyeSB0aGVuIGp1c3QgZm9yZ2V0Ci0JCSoqIGFib3V0IGl0LgotCQkqLwotCQlpZiAoIE1hcFAtPkZsYWdzICYgU0xPVF9URU5UQVRJVkUgKSB7CisJCSAqKiBJZiB0aGUgZW50cnkgc2F2ZWQgd2FzIGEgdGVudGF0aXZlIGVudHJ5IHRoZW4ganVzdCBmb3JnZXQKKwkJICoqIGFib3V0IGl0LgorCQkgKi8KKwkJaWYgKE1hcFAtPkZsYWdzICYgU0xPVF9URU5UQVRJVkUpIHsKIAkJCU1hcFAtPkhvc3RVbmlxdWVOdW0gPSAwOwogCQkJTWFwUC0+UnRhVW5pcXVlTnVtID0gMDsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJT05ld1RhYmxlOiBlbnRlcmluZygzKVxuIik7Ci0JCWlmICggIU1hcFAtPlJ0YVVuaXF1ZU51bSAmJiAhTWFwUC0+SG9zdFVuaXF1ZU51bSApIHsgLyogKDMpICovCi0JCQlpZiAoIE1hcFAtPklEIHx8IE1hcFAtPlN5c1BvcnQgfHwgTWFwUC0+RmxhZ3MgKSB7Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIiVzIHByZXRlbmRpbmcgdG8gYmUgZW1wdHkgYnV0IGlzbid0XG4iLE1hcFAtPk5hbWUpOworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVEFCTEUsICJSSU9OZXdUYWJsZTogZW50ZXJpbmcoMylcbiIpOworCQlpZiAoIU1hcFAtPlJ0YVVuaXF1ZU51bSAmJiAhTWFwUC0+SG9zdFVuaXF1ZU51bSkgewkvKiAoMykgKi8KKwkJCWlmIChNYXBQLT5JRCB8fCBNYXBQLT5TeXNQb3J0IHx8IE1hcFAtPkZsYWdzKSB7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiJXMgcHJldGVuZGluZyB0byBiZSBlbXB0eSBidXQgaXNuJ3RcbiIsIE1hcFAtPk5hbWUpOwogCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gVEFCTEVfRU5UUllfSVNOVF9QUk9QRVJMWV9OVUxMOwogCQkJCXAtPlJJT0Vycm9yLkVudHJ5ID0gRW50cnk7CiAJCQkJcmV0dXJuIC1FTlhJTzsKIAkJCX0KLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICIhUklPOiBEYWVtb246IHRlc3QgKDMpIHBhc3Nlc1xuIik7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVEFCTEUsICIhUklPOiBEYWVtb246IHRlc3QgKDMpIHBhc3Nlc1xuIik7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSSU9OZXdUYWJsZTogZW50ZXJpbmcoNClcbiIpOwotCQlmb3IgKCBIb3N0PTA7IEhvc3Q8cC0+UklPTnVtSG9zdHM7IEhvc3QrKyApIHsgLyogKDQpICovCi0JCQlpZiAoIHAtPlJJT0hvc3RzW0hvc3RdLlVuaXF1ZU51bT09TWFwUC0+SG9zdFVuaXF1ZU51bSApIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiUklPTmV3VGFibGU6IGVudGVyaW5nKDQpXG4iKTsKKwkJZm9yIChIb3N0ID0gMDsgSG9zdCA8IHAtPlJJT051bUhvc3RzOyBIb3N0KyspIHsJLyogKDQpICovCisJCQlpZiAocC0+UklPSG9zdHNbSG9zdF0uVW5pcXVlTnVtID09IE1hcFAtPkhvc3RVbmlxdWVOdW0pIHsKIAkJCQlIb3N0UCA9ICZwLT5SSU9Ib3N0c1tIb3N0XTsKIAkJCQkvKgotCQkJCSoqIGhhdmluZyBkb25lIHRoZSBsb29rdXAsIHdlIGRvbid0IHJlYWxseSB3YW50IHRvIGRvCi0JCQkJKiogaXQgYWdhaW4sIHNvIGhhbmcgdGhlIGhvc3QgbnVtYmVyIGluIGEgc2FmZSBwbGFjZQotCQkJCSovCisJCQkJICoqIGhhdmluZyBkb25lIHRoZSBsb29rdXAsIHdlIGRvbid0IHJlYWxseSB3YW50IHRvIGRvCisJCQkJICoqIGl0IGFnYWluLCBzbyBoYW5nIHRoZSBob3N0IG51bWJlciBpbiBhIHNhZmUgcGxhY2UKKwkJCQkgKi8KIAkJCQlNYXBQLT5Ub3BvbG9neVswXS5Vbml0ID0gSG9zdDsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQogCi0JCWlmICggSG9zdCA+PSBwLT5SSU9OdW1Ib3N0cyApIHsKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSVEEgJXMgaGFzIHVua25vd24gaG9zdCB1bmlxdWUgbnVtYmVyIDB4JXhcbiIsCi0JCQkJCQkJCQlNYXBQLT5OYW1lLCBNYXBQLT5Ib3N0VW5pcXVlTnVtKTsKKwkJaWYgKEhvc3QgPj0gcC0+UklPTnVtSG9zdHMpIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UQUJMRSwgIlJUQSAlcyBoYXMgdW5rbm93biBob3N0IHVuaXF1ZSBudW1iZXIgMHgleFxuIiwgTWFwUC0+TmFtZSwgTWFwUC0+SG9zdFVuaXF1ZU51bSk7CiAJCQlNYXBQLT5Ib3N0VW5pcXVlTnVtID0gMDsKLQkJCS8qIE1hcFAtPlJ0YVVuaXF1ZU51bQk9IDA7ICovCi0JCQkvKiBNYXBQLT5JRAkJCT0gMDsgKi8KLQkJCS8qIE1hcFAtPkZsYWdzCQkgPSAwOyAqLwotCQkJLyogTWFwUC0+U3lzUG9ydAkJID0gMDsgKi8KLQkJCS8qIE1hcFAtPk5hbWVbMF0JCSA9IDA7ICovCisJCQkvKiBNYXBQLT5SdGFVbmlxdWVOdW0gICA9IDA7ICovCisJCQkvKiBNYXBQLT5JRCAgICAgICAgICAgICAgICAgICAgID0gMDsgKi8KKwkJCS8qIE1hcFAtPkZsYWdzICAgICAgICAgICA9IDA7ICovCisJCQkvKiBNYXBQLT5TeXNQb3J0ICAgICAgICAgICAgICAgICA9IDA7ICovCisJCQkvKiBNYXBQLT5OYW1lWzBdICAgICAgICAgICAgICAgICA9IDA7ICovCiAJCQljb250aW51ZTsKIAkJfQogCi0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSSU9OZXdUYWJsZTogZW50ZXJpbmcoNSlcbiIpOyAKLQkJaWYgKCBNYXBQLT5SdGFVbmlxdWVOdW0gKSB7IC8qICg1KSAqLwotCQkJaWYgKCAhTWFwUC0+SUQgKSB7Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJTzogUlRBICVzIGhhcyBiZWVuIGFsbG9jYXRlZCBhbiBJRCBvZiB6ZXJvIVxuIiwKLQkJCQkJCQlNYXBQLT5OYW1lKTsKLQkJCQlwLT5SSU9FcnJvci5FcnJvcgkJID0gWkVST19SVEFfSUQ7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UQUJMRSwgIlJJT05ld1RhYmxlOiBlbnRlcmluZyg1KVxuIik7CisJCWlmIChNYXBQLT5SdGFVbmlxdWVOdW0pIHsJLyogKDUpICovCisJCQlpZiAoIU1hcFAtPklEKSB7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiUklPOiBSVEEgJXMgaGFzIGJlZW4gYWxsb2NhdGVkIGFuIElEIG9mIHplcm8hXG4iLCBNYXBQLT5OYW1lKTsKKwkJCQlwLT5SSU9FcnJvci5FcnJvciA9IFpFUk9fUlRBX0lEOwogCQkJCXAtPlJJT0Vycm9yLkVudHJ5ID0gRW50cnk7CiAJCQkJcmV0dXJuIC1FTlhJTzsKIAkJCX0KLQkJCWlmICggTWFwUC0+SUQgPiBNQVhfUlVQICkgewotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSSU86IFJUQSAlcyBoYXMgYmVlbiBhbGxvY2F0ZWQgYW4gaW52YWxpZCBJRCAlZFxuIiwKLQkJCQkJCQlNYXBQLT5OYW1lLCBNYXBQLT5JRCk7CisJCQlpZiAoTWFwUC0+SUQgPiBNQVhfUlVQKSB7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiUklPOiBSVEEgJXMgaGFzIGJlZW4gYWxsb2NhdGVkIGFuIGludmFsaWQgSUQgJWRcbiIsIE1hcFAtPk5hbWUsIE1hcFAtPklEKTsKIAkJCQlwLT5SSU9FcnJvci5FcnJvciA9IElEX05VTUJFUl9PVVRfT0ZfUkFOR0U7CiAJCQkJcC0+UklPRXJyb3IuRW50cnkgPSBFbnRyeTsKIAkJCQlyZXR1cm4gLUVOWElPOwogCQkJfQotCQkJZm9yICggU3ViRW50PTA7IFN1YkVudDxFbnRyeTsgU3ViRW50KysgKSB7Ci0JCQkJaWYgKCBNYXBQLT5Ib3N0VW5pcXVlTnVtID09IAotCQkJCQkJcC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uSG9zdFVuaXF1ZU51bSAmJiAKLQkJCQkJCU1hcFAtPklEID09IHAtPlJJT0Nvbm5lY3RUYWJsZVtTdWJFbnRdLklEICkgewotCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiRHVwbC4gSUQgbnVtYmVyIGFsbG9jYXRlZCB0byBSVEEgJXMgYW5kIFJUQSAlc1xuIiwKLQkJCQkJCQlNYXBQLT5OYW1lLCBwLT5SSU9Db25uZWN0VGFibGVbU3ViRW50XS5OYW1lKTsKKwkJCWZvciAoU3ViRW50ID0gMDsgU3ViRW50IDwgRW50cnk7IFN1YkVudCsrKSB7CisJCQkJaWYgKE1hcFAtPkhvc3RVbmlxdWVOdW0gPT0gcC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uSG9zdFVuaXF1ZU51bSAmJiBNYXBQLT5JRCA9PSBwLT5SSU9Db25uZWN0VGFibGVbU3ViRW50XS5JRCkgeworCQkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVEFCTEUsICJEdXBsLiBJRCBudW1iZXIgYWxsb2NhdGVkIHRvIFJUQSAlcyBhbmQgUlRBICVzXG4iLCBNYXBQLT5OYW1lLCBwLT5SSU9Db25uZWN0VGFibGVbU3ViRW50XS5OYW1lKTsKIAkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBEVVBMSUNBVEVEX1JUQV9JRDsKIAkJCQkJcC0+UklPRXJyb3IuRW50cnkgPSBFbnRyeTsKIAkJCQkJcC0+UklPRXJyb3IuT3RoZXIgPSBTdWJFbnQ7CiAJCQkJCXJldHVybiAtRU5YSU87CiAJCQkJfQogCQkJCS8qCi0JCQkJKiogSWYgdGhlIFJ0YVVuaXF1ZU51bSBpcyB0aGUgc2FtZSwgaXQgbWF5IGJlIGxvb2tpbmcgYXQgYm90aAotCQkJCSoqIGVudHJpZXMgZm9yIGEgMTYgcG9ydCBSVEEsIHNvIGNoZWNrIHRoZSBpZHMKLQkJCQkqLwotCQkJCWlmICgoTWFwUC0+UnRhVW5pcXVlTnVtID09IAotCQkJCQkJcC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uUnRhVW5pcXVlTnVtKQotCQkJCSAJCSYmIChNYXBQLT5JRDIgIT0gcC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uSUQpKSB7Ci0JCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSVEEgJXMgaGFzIGR1cGxpY2F0ZSB1bmlxdWUgbnVtYmVyXG4iLE1hcFAtPk5hbWUpOwotCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUlRBICVzIGhhcyBkdXBsaWNhdGUgdW5pcXVlIG51bWJlclxuIiwKLQkJCQkJCQkJCQlwLT5SSU9Db25uZWN0VGFibGVbU3ViRW50XS5OYW1lKTsKKwkJCQkgKiogSWYgdGhlIFJ0YVVuaXF1ZU51bSBpcyB0aGUgc2FtZSwgaXQgbWF5IGJlIGxvb2tpbmcgYXQgYm90aAorCQkJCSAqKiBlbnRyaWVzIGZvciBhIDE2IHBvcnQgUlRBLCBzbyBjaGVjayB0aGUgaWRzCisJCQkJICovCisJCQkJaWYgKChNYXBQLT5SdGFVbmlxdWVOdW0gPT0gcC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uUnRhVW5pcXVlTnVtKQorCQkJCSAgICAmJiAoTWFwUC0+SUQyICE9IHAtPlJJT0Nvbm5lY3RUYWJsZVtTdWJFbnRdLklEKSkgeworCQkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVEFCTEUsICJSVEEgJXMgaGFzIGR1cGxpY2F0ZSB1bmlxdWUgbnVtYmVyXG4iLCBNYXBQLT5OYW1lKTsKKwkJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiUlRBICVzIGhhcyBkdXBsaWNhdGUgdW5pcXVlIG51bWJlclxuIiwgcC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uTmFtZSk7CiAJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gRFVQTElDQVRFX1VOSVFVRV9OVU1CRVI7CiAJCQkJCXAtPlJJT0Vycm9yLkVudHJ5ID0gRW50cnk7CiAJCQkJCXAtPlJJT0Vycm9yLk90aGVyID0gU3ViRW50OwogCQkJCQlyZXR1cm4gLUVOWElPOwogCQkJCX0KIAkJCX0KLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSSU9OZXdUYWJsZTogZW50ZXJpbmcoN2EpXG4iKTsgCisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVEFCTEUsICJSSU9OZXdUYWJsZTogZW50ZXJpbmcoN2EpXG4iKTsKIAkJCS8qICg3YSkgKi8KLQkJCWlmICgoTWFwUC0+U3lzUG9ydCAhPSBOT19QT1JUKSYmKE1hcFAtPlN5c1BvcnQgJSBQT1JUU19QRVJfUlRBKSkgewotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJUVFkgUG9ydCBudW1iZXIgJWQtUlRBICVzIGlzIG5vdCBhIG11bHRpcGxlIG9mICVkIVxuIiwKLQkJCQkJKGludClNYXBQLT5TeXNQb3J0LE1hcFAtPk5hbWUsIFBPUlRTX1BFUl9SVEEpOworCQkJaWYgKChNYXBQLT5TeXNQb3J0ICE9IE5PX1BPUlQpICYmIChNYXBQLT5TeXNQb3J0ICUgUE9SVFNfUEVSX1JUQSkpIHsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVEFCTEUsICJUVFkgUG9ydCBudW1iZXIgJWQtUlRBICVzIGlzIG5vdCBhIG11bHRpcGxlIG9mICVkIVxuIiwgKGludCkgTWFwUC0+U3lzUG9ydCwgTWFwUC0+TmFtZSwgUE9SVFNfUEVSX1JUQSk7CiAJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBUVFlfTlVNQkVSX09VVF9PRl9SQU5HRTsKIAkJCQlwLT5SSU9FcnJvci5FbnRyeSA9IEVudHJ5OwogCQkJCXJldHVybiAtRU5YSU87CiAJCQl9Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUklPTmV3VGFibGU6IGVudGVyaW5nKDdiKVxuIik7IAorCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiUklPTmV3VGFibGU6IGVudGVyaW5nKDdiKVxuIik7CiAJCQkvKiAoN2IpICovCi0JCQlpZiAoKE1hcFAtPlN5c1BvcnQgIT0gTk9fUE9SVCkmJihNYXBQLT5TeXNQb3J0ID49IFJJT19QT1JUUykpIHsKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiVFRZIFBvcnQgbnVtYmVyICVkIGZvciBSVEEgJXMgaXMgdG9vIGJpZ1xuIiwKLQkJCQkJCQkoaW50KU1hcFAtPlN5c1BvcnQsIE1hcFAtPk5hbWUpOworCQkJaWYgKChNYXBQLT5TeXNQb3J0ICE9IE5PX1BPUlQpICYmIChNYXBQLT5TeXNQb3J0ID49IFJJT19QT1JUUykpIHsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVEFCTEUsICJUVFkgUG9ydCBudW1iZXIgJWQgZm9yIFJUQSAlcyBpcyB0b28gYmlnXG4iLCAoaW50KSBNYXBQLT5TeXNQb3J0LCBNYXBQLT5OYW1lKTsKIAkJCQlwLT5SSU9FcnJvci5FcnJvciA9IFRUWV9OVU1CRVJfT1VUX09GX1JBTkdFOwogCQkJCXAtPlJJT0Vycm9yLkVudHJ5ID0gRW50cnk7CiAJCQkJcmV0dXJuIC1FTlhJTzsKIAkJCX0KLQkJCWZvciAoIFN1YkVudD0wOyBTdWJFbnQ8RW50cnk7IFN1YkVudCsrICkgewotCQkJCWlmICggcC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uRmxhZ3MgJiBSVEExNl9TRUNPTkRfU0xPVCApCi0JCQkJCQljb250aW51ZTsKLQkJCQlpZiAoIHAtPlJJT0Nvbm5lY3RUYWJsZVtTdWJFbnRdLlJ0YVVuaXF1ZU51bSApIHsKLQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJT05ld1RhYmxlOiBlbnRlcmluZyg4KVxuIik7IAorCQkJZm9yIChTdWJFbnQgPSAwOyBTdWJFbnQgPCBFbnRyeTsgU3ViRW50KyspIHsKKwkJCQlpZiAocC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uRmxhZ3MgJiBSVEExNl9TRUNPTkRfU0xPVCkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKHAtPlJJT0Nvbm5lY3RUYWJsZVtTdWJFbnRdLlJ0YVVuaXF1ZU51bSkgeworCQkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVEFCTEUsICJSSU9OZXdUYWJsZTogZW50ZXJpbmcoOClcbiIpOwogCQkJCQkvKiAoOCkgKi8KLQkJCQkJaWYgKCAoTWFwUC0+U3lzUG9ydCAhPSBOT19QT1JUKSAmJiAoTWFwUC0+U3lzUG9ydCA9PSAKLQkJCQkJCQkJCXAtPlJJT0Nvbm5lY3RUYWJsZVtTdWJFbnRdLlN5c1BvcnQpICkgewotCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJUQSAlczpzYW1lIFRUWSBwb3J0ICMgYXMgUlRBICVzICglZClcbiIsCi0JCQkJCQkJTWFwUC0+TmFtZSwgcC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uTmFtZSwKLQkJCQkJCQkoaW50KU1hcFAtPlN5c1BvcnQpOworCQkJCQlpZiAoKE1hcFAtPlN5c1BvcnQgIT0gTk9fUE9SVCkgJiYgKE1hcFAtPlN5c1BvcnQgPT0gcC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uU3lzUG9ydCkpIHsKKwkJCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UQUJMRSwgIlJUQSAlczpzYW1lIFRUWSBwb3J0ICMgYXMgUlRBICVzICglZClcbiIsIE1hcFAtPk5hbWUsIHAtPlJJT0Nvbm5lY3RUYWJsZVtTdWJFbnRdLk5hbWUsIChpbnQpIE1hcFAtPlN5c1BvcnQpOwogCQkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBUVFlfTlVNQkVSX0lOX1VTRTsKIAkJCQkJCXAtPlJJT0Vycm9yLkVudHJ5ID0gRW50cnk7CiAJCQkJCQlwLT5SSU9FcnJvci5PdGhlciA9IFN1YkVudDsKIAkJCQkJCXJldHVybiAtRU5YSU87CiAJCQkJCX0KLQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJT05ld1RhYmxlOiBlbnRlcmluZyg5KVxuIik7IAotCQkJCQlpZiAoc3RyY21wKE1hcFAtPk5hbWUsCi0JCQkJCQkJcC0+UklPQ29ubmVjdFRhYmxlW1N1YkVudF0uTmFtZSk9PTAgJiYgIShNYXBQLT5GbGFncyAmIFJUQTE2X1NFQ09ORF9TTE9UKSkgeyAvKiAoOSkgKi8KLQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSVEEgbmFtZSAlcyB1c2VkIHR3aWNlXG4iLCBNYXBQLT5OYW1lKTsKKwkJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiUklPTmV3VGFibGU6IGVudGVyaW5nKDkpXG4iKTsKKwkJCQkJaWYgKHN0cmNtcChNYXBQLT5OYW1lLCBwLT5SSU9Db25uZWN0VGFibGVbU3ViRW50XS5OYW1lKSA9PSAwICYmICEoTWFwUC0+RmxhZ3MgJiBSVEExNl9TRUNPTkRfU0xPVCkpIHsJLyogKDkpICovCisJCQkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVEFCTEUsICJSVEEgbmFtZSAlcyB1c2VkIHR3aWNlXG4iLCBNYXBQLT5OYW1lKTsKIAkJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gTkFNRV9VU0VEX1RXSUNFOwogCQkJCQkJcC0+UklPRXJyb3IuRW50cnkgPSBFbnRyeTsKIAkJCQkJCXAtPlJJT0Vycm9yLk90aGVyID0gU3ViRW50OwpAQCAtMjg3LDE5ICsyNzIsMTYgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0KLQkJfQotCQllbHNlIHsgLyogKDYpICovCi0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUklPTmV3VGFibGU6IGVudGVyaW5nKDYpXG4iKTsgCi0JCQlpZiAoIE1hcFAtPklEICkgewotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSSU86SE9TVCAlcyBoYXMgYmVlbiBhbGxvY2F0ZWQgSUQgdGhhdCBpc24ndCB6ZXJvIVxuIiwKLQkJCQkJTWFwUC0+TmFtZSk7CisJCX0gZWxzZSB7CS8qICg2KSAqLworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiUklPTmV3VGFibGU6IGVudGVyaW5nKDYpXG4iKTsKKwkJCWlmIChNYXBQLT5JRCkgeworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UQUJMRSwgIlJJTzpIT1NUICVzIGhhcyBiZWVuIGFsbG9jYXRlZCBJRCB0aGF0IGlzbid0IHplcm8hXG4iLCBNYXBQLT5OYW1lKTsKIAkJCQlwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfSURfTk9UX1pFUk87CiAJCQkJcC0+UklPRXJyb3IuRW50cnkgPSBFbnRyeTsKIAkJCQlyZXR1cm4gLUVOWElPOwogCQkJfQotCQkJaWYgKCBNYXBQLT5TeXNQb3J0ICE9IE5PX1BPUlQgKSB7Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJJTzogSE9TVCAlcyBoYXMgYmVlbiBhbGxvY2F0ZWQgcG9ydCBudW1iZXJzIVxuIiwKLQkJCQkJTWFwUC0+TmFtZSk7CisJCQlpZiAoTWFwUC0+U3lzUG9ydCAhPSBOT19QT1JUKSB7CisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiUklPOiBIT1NUICVzIGhhcyBiZWVuIGFsbG9jYXRlZCBwb3J0IG51bWJlcnMhXG4iLCBNYXBQLT5OYW1lKTsKIAkJCQlwLT5SSU9FcnJvci5FcnJvciA9IEhPU1RfU1lTUE9SVF9CQUQ7CiAJCQkJcC0+UklPRXJyb3IuRW50cnkgPSBFbnRyeTsKIAkJCQlyZXR1cm4gLUVOWElPOwpAQCAtMzA4LDEwNiArMjkwLDEwMSBAQAogCX0KIAogCS8qCi0JKiogd293ISBpZiB3ZSBnZXQgaGVyZSB0aGVuIGl0J3MgYSBnb29keSEKLQkqLworCSAqKiB3b3chIGlmIHdlIGdldCBoZXJlIHRoZW4gaXQncyBhIGdvb2R5IQorCSAqLwogCiAJLyoKLQkqKiBaZXJvIHRoZSAob2xkKSBlbnRyaWVzIGZvciBlYWNoIGhvc3QuLi4KLQkqLwotCWZvciAoIEhvc3Q9MDsgSG9zdDxSSU9fSE9TVFM7IEhvc3QrKyApIHsKLQkJZm9yICggRW50cnk9MDsgRW50cnk8TUFYX1JVUDsgRW50cnkrKyApIHsKLQkJCWJ6ZXJvKChjYWRkcl90KSZwLT5SSU9Ib3N0c1tIb3N0XS5NYXBwaW5nW0VudHJ5XSwgCi0JCQkJCQkJCQkJCXNpemVvZihzdHJ1Y3QgTWFwKSk7CisJICoqIFplcm8gdGhlIChvbGQpIGVudHJpZXMgZm9yIGVhY2ggaG9zdC4uLgorCSAqLworCWZvciAoSG9zdCA9IDA7IEhvc3QgPCBSSU9fSE9TVFM7IEhvc3QrKykgeworCQlmb3IgKEVudHJ5ID0gMDsgRW50cnkgPCBNQVhfUlVQOyBFbnRyeSsrKSB7CisJCQliemVybygoY2FkZHJfdCkgJiBwLT5SSU9Ib3N0c1tIb3N0XS5NYXBwaW5nW0VudHJ5XSwgc2l6ZW9mKHN0cnVjdCBNYXApKTsKIAkJfQotCQliemVybygoY2FkZHJfdCkmcC0+UklPSG9zdHNbSG9zdF0uTmFtZVswXSwKLQkJCQkJCQkJc2l6ZW9mKHAtPlJJT0hvc3RzW0hvc3RdLk5hbWUpICk7CisJCWJ6ZXJvKChjYWRkcl90KSAmIHAtPlJJT0hvc3RzW0hvc3RdLk5hbWVbMF0sIHNpemVvZihwLT5SSU9Ib3N0c1tIb3N0XS5OYW1lKSk7CiAJfQogCiAJLyoKLQkqKiBDb3B5IGluIHRoZSBuZXcgdGFibGUgZW50cmllcwotCSovCi0JZm9yICggRW50cnk9MDsgRW50cnk8IFRPVEFMX01BUF9FTlRSSUVTOyBFbnRyeSsrICkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUklPTmV3VGFibGU6IENvcHkgdGFibGUgZm9yIEhvc3QgZW50cnkgJWRcbiIsIEVudHJ5KTsKKwkgKiogQ29weSBpbiB0aGUgbmV3IHRhYmxlIGVudHJpZXMKKwkgKi8KKwlmb3IgKEVudHJ5ID0gMDsgRW50cnkgPCBUT1RBTF9NQVBfRU5UUklFUzsgRW50cnkrKykgeworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVEFCTEUsICJSSU9OZXdUYWJsZTogQ29weSB0YWJsZSBmb3IgSG9zdCBlbnRyeSAlZFxuIiwgRW50cnkpOwogCQlNYXBQID0gJnAtPlJJT0Nvbm5lY3RUYWJsZVtFbnRyeV07CiAKIAkJLyoKLQkJKiogTm93LCBpZiBpdCBpcyBhbiBlbXB0eSBzbG90IGlnbm9yZSBpdCEKLQkJKi8KLQkJaWYgKCBNYXBQLT5Ib3N0VW5pcXVlTnVtPT0wICkKKwkJICoqIE5vdywgaWYgaXQgaXMgYW4gZW1wdHkgc2xvdCBpZ25vcmUgaXQhCisJCSAqLworCQlpZiAoTWFwUC0+SG9zdFVuaXF1ZU51bSA9PSAwKQogCQkJY29udGludWU7CiAKIAkJLyoKLQkJKiogd2Ugc2F2ZWQgdGhlIGhvc3QgbnVtYmVyIGVhcmxpZXIsIHNvIGdyYWIgaXQgYmFjawotCQkqLworCQkgKiogd2Ugc2F2ZWQgdGhlIGhvc3QgbnVtYmVyIGVhcmxpZXIsIHNvIGdyYWIgaXQgYmFjaworCQkgKi8KIAkJSG9zdFAgPSAmcC0+UklPSG9zdHNbTWFwUC0+VG9wb2xvZ3lbMF0uVW5pdF07CiAKIAkJLyoKLQkJKiogSWYgaXQgaXMgYSBob3N0LCB0aGVuIHdlIG9ubHkgbmVlZCB0byBmaWxsIGluIHRoZSBuYW1lIGZpZWxkLgotCQkqLwotCQlpZiAoIE1hcFAtPklEPT0wICkgewotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkhvc3QgZW50cnkgZm91bmQuIE5hbWUgJXNcbiIsIE1hcFAtPk5hbWUpOwotCQkJYmNvcHkoTWFwUC0+TmFtZSxIb3N0UC0+TmFtZSxNQVhfTkFNRV9MRU4pOworCQkgKiogSWYgaXQgaXMgYSBob3N0LCB0aGVuIHdlIG9ubHkgbmVlZCB0byBmaWxsIGluIHRoZSBuYW1lIGZpZWxkLgorCQkgKi8KKwkJaWYgKE1hcFAtPklEID09IDApIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UQUJMRSwgIkhvc3QgZW50cnkgZm91bmQuIE5hbWUgJXNcbiIsIE1hcFAtPk5hbWUpOworCQkJYmNvcHkoTWFwUC0+TmFtZSwgSG9zdFAtPk5hbWUsIE1BWF9OQU1FX0xFTik7CiAJCQljb250aW51ZTsKIAkJfQogCiAJCS8qCi0JCSoqIEl0cyBhbiBSVEEgZW50cnksIHNvIGZpbGwgaW4gdGhlIGhvc3QgbWFwcGluZyBlbnRyaWVzIGZvciBpdAotCQkqKiBhbmQgdGhlIHBvcnQgbWFwcGluZyBlbnRyaWVzLiBOb3RpY2UgdGhhdCBlbnRyeSB6ZXJvIGlzIGZvcgotCQkqKiBJRCBvbmUuCi0JCSovCi0JCUhvc3RNYXBQID0gJkhvc3RQLT5NYXBwaW5nW01hcFAtPklELTFdOworCQkgKiogSXRzIGFuIFJUQSBlbnRyeSwgc28gZmlsbCBpbiB0aGUgaG9zdCBtYXBwaW5nIGVudHJpZXMgZm9yIGl0CisJCSAqKiBhbmQgdGhlIHBvcnQgbWFwcGluZyBlbnRyaWVzLiBOb3RpY2UgdGhhdCBlbnRyeSB6ZXJvIGlzIGZvcgorCQkgKiogSUQgb25lLgorCQkgKi8KKwkJSG9zdE1hcFAgPSAmSG9zdFAtPk1hcHBpbmdbTWFwUC0+SUQgLSAxXTsKIAogCQlpZiAoTWFwUC0+RmxhZ3MgJiBTTE9UX0lOX1VTRSkgewotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlJ0YSBlbnRyeSBmb3VuZC4gTmFtZSAlc1xuIiwgTWFwUC0+TmFtZSk7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVEFCTEUsICJSdGEgZW50cnkgZm91bmQuIE5hbWUgJXNcbiIsIE1hcFAtPk5hbWUpOwogCQkJLyoKLQkJCSoqIHN0cnVjdHVyZSBhc3NpZ24sIHRoZW4gc29ydCBvdXQgdGhlIGJpdHMgd2Ugc2hvdWxkbid0IGhhdmUgZG9uZQotCQkJKi8KKwkJCSAqKiBzdHJ1Y3R1cmUgYXNzaWduLCB0aGVuIHNvcnQgb3V0IHRoZSBiaXRzIHdlIHNob3VsZG4ndCBoYXZlIGRvbmUKKwkJCSAqLwogCQkJKkhvc3RNYXBQID0gKk1hcFA7CiAKIAkJCUhvc3RNYXBQLT5GbGFncyA9IFNMT1RfSU5fVVNFOwogCQkJaWYgKE1hcFAtPkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QpCiAJCQkJSG9zdE1hcFAtPkZsYWdzIHw9IFJUQTE2X1NFQ09ORF9TTE9UOwogCi0JCQlSSU9SZU1hcFBvcnRzKHAsIEhvc3RQLCBIb3N0TWFwUCApOwotCQl9Ci0JCWVsc2UgewotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIlRFTlRBVElWRSBSdGEgZW50cnkgZm91bmQuIE5hbWUgJXNcbiIsIE1hcFAtPk5hbWUpOworCQkJUklPUmVNYXBQb3J0cyhwLCBIb3N0UCwgSG9zdE1hcFApOworCQl9IGVsc2UgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiVEVOVEFUSVZFIFJ0YSBlbnRyeSBmb3VuZC4gTmFtZSAlc1xuIiwgTWFwUC0+TmFtZSk7CiAJCX0KIAl9CiAKLQlmb3IgKCBFbnRyeT0wOyBFbnRyeTwgVE9UQUxfTUFQX0VOVFJJRVM7IEVudHJ5KysgKSB7CisJZm9yIChFbnRyeSA9IDA7IEVudHJ5IDwgVE9UQUxfTUFQX0VOVFJJRVM7IEVudHJ5KyspIHsKIAkJcC0+UklPU2F2ZWRUYWJsZVtFbnRyeV0gPSBwLT5SSU9Db25uZWN0VGFibGVbRW50cnldOwogCX0KIAotCWZvciAoIEhvc3Q9MDsgSG9zdDxwLT5SSU9OdW1Ib3N0czsgSG9zdCsrICkgewotCQlmb3IgKCBTdWJFbnQ9MDsgU3ViRW50PExJTktTX1BFUl9VTklUOyBTdWJFbnQrKyApIHsKKwlmb3IgKEhvc3QgPSAwOyBIb3N0IDwgcC0+UklPTnVtSG9zdHM7IEhvc3QrKykgeworCQlmb3IgKFN1YkVudCA9IDA7IFN1YkVudCA8IExJTktTX1BFUl9VTklUOyBTdWJFbnQrKykgewogCQkJcC0+UklPSG9zdHNbSG9zdF0uVG9wb2xvZ3lbU3ViRW50XS5Vbml0ID0gUk9VVEVfRElTQ09OTkVDVDsKIAkJCXAtPlJJT0hvc3RzW0hvc3RdLlRvcG9sb2d5W1N1YkVudF0uTGluayA9IE5PX0xJTks7CiAJCX0KLQkJZm9yICggRW50cnk9MDsgRW50cnk8TUFYX1JVUDsgRW50cnkrKyApIHsKLQkJCWZvciAoIFN1YkVudD0wOyBTdWJFbnQ8TElOS1NfUEVSX1VOSVQ7IFN1YkVudCsrICkgewotCQkJCXAtPlJJT0hvc3RzW0hvc3RdLk1hcHBpbmdbRW50cnldLlRvcG9sb2d5W1N1YkVudF0uVW5pdCA9IAotCQkJCQkJCQlST1VURV9ESVNDT05ORUNUOwotCQkJCXAtPlJJT0hvc3RzW0hvc3RdLk1hcHBpbmdbRW50cnldLlRvcG9sb2d5W1N1YkVudF0uTGluayA9IAotCQkJCQkJCQlOT19MSU5LOworCQlmb3IgKEVudHJ5ID0gMDsgRW50cnkgPCBNQVhfUlVQOyBFbnRyeSsrKSB7CisJCQlmb3IgKFN1YkVudCA9IDA7IFN1YkVudCA8IExJTktTX1BFUl9VTklUOyBTdWJFbnQrKykgeworCQkJCXAtPlJJT0hvc3RzW0hvc3RdLk1hcHBpbmdbRW50cnldLlRvcG9sb2d5W1N1YkVudF0uVW5pdCA9IFJPVVRFX0RJU0NPTk5FQ1Q7CisJCQkJcC0+UklPSG9zdHNbSG9zdF0uTWFwcGluZ1tFbnRyeV0uVG9wb2xvZ3lbU3ViRW50XS5MaW5rID0gTk9fTElOSzsKIAkJCX0KIAkJfQotCQlpZiAoICFwLT5SSU9Ib3N0c1tIb3N0XS5OYW1lWzBdICkgewotCQkJYmNvcHkoIkhPU1QgMSIscC0+UklPSG9zdHNbSG9zdF0uTmFtZSw3KTsKKwkJaWYgKCFwLT5SSU9Ib3N0c1tIb3N0XS5OYW1lWzBdKSB7CisJCQliY29weSgiSE9TVCAxIiwgcC0+UklPSG9zdHNbSG9zdF0uTmFtZSwgNyk7CiAJCQlwLT5SSU9Ib3N0c1tIb3N0XS5OYW1lWzVdICs9IEhvc3Q7CiAJCX0KIAkJLyoKLQkJKiogQ2hlY2sgdGhhdCBkZWZhdWx0IG5hbWUgYXNzaWduZWQgaXMgdW5pcXVlLgotCQkqLworCQkgKiogQ2hlY2sgdGhhdCBkZWZhdWx0IG5hbWUgYXNzaWduZWQgaXMgdW5pcXVlLgorCQkgKi8KIAkJSG9zdDEgPSBIb3N0OwogCQlOYW1lSXNVbmlxdWUgPSAwOwogCQl3aGlsZSAoIU5hbWVJc1VuaXF1ZSkgewogCQkJTmFtZUlzVW5pcXVlID0gMTsKLQkJCWZvciAoIEhvc3QyPTA7IEhvc3QyPHAtPlJJT051bUhvc3RzOyBIb3N0MisrICkgeworCQkJZm9yIChIb3N0MiA9IDA7IEhvc3QyIDwgcC0+UklPTnVtSG9zdHM7IEhvc3QyKyspIHsKIAkJCQlpZiAoSG9zdDIgPT0gSG9zdCkKIAkJCQkJY29udGludWU7CiAJCQkJaWYgKHN0cmNtcChwLT5SSU9Ib3N0c1tIb3N0XS5OYW1lLCBwLT5SSU9Ib3N0c1tIb3N0Ml0uTmFtZSkKLQkJCQkJCQkJCSA9PSAwKSB7CisJCQkJICAgID09IDApIHsKIAkJCQkJTmFtZUlzVW5pcXVlID0gMDsKIAkJCQkJSG9zdDErKzsKIAkJCQkJaWYgKEhvc3QxID49IHAtPlJJT051bUhvc3RzKQpAQCAtNDE3LDE1ICszOTQsMTQgQEAKIAkJCX0KIAkJfQogCQkvKgotCQkqKiBSZW5hbWUgaG9zdCBpZiBuYW1lIGFscmVhZHkgdXNlZC4KLQkJKi8KLQkJaWYgKEhvc3QxICE9IEhvc3QpCi0JCXsKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJEZWZhdWx0IG5hbWUgJXMgYWxyZWFkeSB1c2VkXG4iLCBwLT5SSU9Ib3N0c1tIb3N0XS5OYW1lKTsKLQkJCWJjb3B5KCJIT1NUIDEiLHAtPlJJT0hvc3RzW0hvc3RdLk5hbWUsNyk7CisJCSAqKiBSZW5hbWUgaG9zdCBpZiBuYW1lIGFscmVhZHkgdXNlZC4KKwkJICovCisJCWlmIChIb3N0MSAhPSBIb3N0KSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVEFCTEUsICJEZWZhdWx0IG5hbWUgJXMgYWxyZWFkeSB1c2VkXG4iLCBwLT5SSU9Ib3N0c1tIb3N0XS5OYW1lKTsKKwkJCWJjb3B5KCJIT1NUIDEiLCBwLT5SSU9Ib3N0c1tIb3N0XS5OYW1lLCA3KTsKIAkJCXAtPlJJT0hvc3RzW0hvc3RdLk5hbWVbNV0gKz0gSG9zdDE7CiAJCX0KLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkFzc2lnbmluZyBkZWZhdWx0IG5hbWUgJXNcbiIsIHAtPlJJT0hvc3RzW0hvc3RdLk5hbWUpOworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVEFCTEUsICJBc3NpZ25pbmcgZGVmYXVsdCBuYW1lICVzXG4iLCBwLT5SSU9Ib3N0c1tIb3N0XS5OYW1lKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC00MzQsOSArNDEwLDggQEAKICoqIFVzZXIgcHJvY2VzcyBuZWVkcyB0aGUgY29uZmlnIHRhYmxlIC0gYnVpbGQgaXQgZnJvbSBmaXJzdAogKiogcHJpbmNpcGxlcy4KICovCi1pbnQKLVJJT0FwZWwocCkKLXN0cnVjdCByaW9faW5mbyAqCXA7CitpbnQgUklPQXBlbChwKQorc3RydWN0IHJpb19pbmZvICpwOwogewogCWludCBIb3N0OwogCWludCBsaW5rOwpAQCAtNDQ2LDM1ICs0MjEsMzQgQEAKIAlzdHJ1Y3QgSG9zdCAqSG9zdFA7CiAJbG9uZyBvbGRzcGw7CiAKLQlkaXNhYmxlKG9sZHNwbCk7CQkvKiBzdHJhbmdlIGJ1dCB0cnVlISAqLwotIAotCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJHZW5lcmF0aW5nIGEgdGFibGUgdG8gcmV0dXJuIHRvIGNvbmZpZy5yaW9cbiIpOworCWRpc2FibGUob2xkc3BsKTsJLyogc3RyYW5nZSBidXQgdHJ1ZSEgKi8KIAotCWJ6ZXJvKChjYWRkcl90KSZwLT5SSU9Db25uZWN0VGFibGVbMF0sIAotCQkJCQlzaXplb2Yoc3RydWN0IE1hcCkgKiBUT1RBTF9NQVBfRU5UUklFUyApOworCXJpb19kcHJpbnRrKFJJT19ERUJVR19UQUJMRSwgIkdlbmVyYXRpbmcgYSB0YWJsZSB0byByZXR1cm4gdG8gY29uZmlnLnJpb1xuIik7CiAKLQlmb3IgKCBIb3N0PTA7IEhvc3Q8UklPX0hPU1RTOyBIb3N0KysgKSB7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJQcm9jZXNzaW5nIGhvc3QgJWRcbiIsIEhvc3QpOworCWJ6ZXJvKChjYWRkcl90KSAmIHAtPlJJT0Nvbm5lY3RUYWJsZVswXSwgc2l6ZW9mKHN0cnVjdCBNYXApICogVE9UQUxfTUFQX0VOVFJJRVMpOworCisJZm9yIChIb3N0ID0gMDsgSG9zdCA8IFJJT19IT1NUUzsgSG9zdCsrKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UQUJMRSwgIlByb2Nlc3NpbmcgaG9zdCAlZFxuIiwgSG9zdCk7CiAJCUhvc3RQID0gJnAtPlJJT0hvc3RzW0hvc3RdOwogCQlNYXBQID0gJnAtPlJJT0Nvbm5lY3RUYWJsZVtOZXh0KytdOwogCQlNYXBQLT5Ib3N0VW5pcXVlTnVtID0gSG9zdFAtPlVuaXF1ZU51bTsKLQkJaWYgKCAoSG9zdFAtPkZsYWdzICYgUlVOX1NUQVRFKSAhPSBSQ19SVU5OSU5HICkKKwkJaWYgKChIb3N0UC0+RmxhZ3MgJiBSVU5fU1RBVEUpICE9IFJDX1JVTk5JTkcpCiAJCQljb250aW51ZTsKIAkJTWFwUC0+UnRhVW5pcXVlTnVtID0gMDsKIAkJTWFwUC0+SUQgPSAwOwogCQlNYXBQLT5GbGFncyA9IFNMT1RfSU5fVVNFOwogCQlNYXBQLT5TeXNQb3J0ID0gTk9fUE9SVDsKLQkJZm9yICggbGluaz0wOyBsaW5rPExJTktTX1BFUl9VTklUOyBsaW5rKysgKQorCQlmb3IgKGxpbmsgPSAwOyBsaW5rIDwgTElOS1NfUEVSX1VOSVQ7IGxpbmsrKykKIAkJCU1hcFAtPlRvcG9sb2d5W2xpbmtdID0gSG9zdFAtPlRvcG9sb2d5W2xpbmtdOwotCQliY29weShIb3N0UC0+TmFtZSxNYXBQLT5OYW1lLE1BWF9OQU1FX0xFTik7Ci0JCWZvciAoIFJ1cD0wOyBSdXA8TUFYX1JVUDsgUnVwKysgKSB7Ci0JCQlpZiAoIEhvc3RQLT5NYXBwaW5nW1J1cF0uRmxhZ3MgJiAoU0xPVF9JTl9VU0V8U0xPVF9URU5UQVRJVkUpICkgeworCQliY29weShIb3N0UC0+TmFtZSwgTWFwUC0+TmFtZSwgTUFYX05BTUVfTEVOKTsKKwkJZm9yIChSdXAgPSAwOyBSdXAgPCBNQVhfUlVQOyBSdXArKykgeworCQkJaWYgKEhvc3RQLT5NYXBwaW5nW1J1cF0uRmxhZ3MgJiAoU0xPVF9JTl9VU0UgfCBTTE9UX1RFTlRBVElWRSkpIHsKIAkJCQlwLT5SSU9Db25uZWN0VGFibGVbTmV4dF0gPSBIb3N0UC0+TWFwcGluZ1tSdXBdOwotCQkJCWlmICggSG9zdFAtPk1hcHBpbmdbUnVwXS5GbGFncyAmIFNMT1RfSU5fVVNFKQorCQkJCWlmIChIb3N0UC0+TWFwcGluZ1tSdXBdLkZsYWdzICYgU0xPVF9JTl9VU0UpCiAJCQkJCXAtPlJJT0Nvbm5lY3RUYWJsZVtOZXh0XS5GbGFncyB8PSBTTE9UX0lOX1VTRTsKLQkJCQlpZiAoIEhvc3RQLT5NYXBwaW5nW1J1cF0uRmxhZ3MgJiBTTE9UX1RFTlRBVElWRSkKKwkJCQlpZiAoSG9zdFAtPk1hcHBpbmdbUnVwXS5GbGFncyAmIFNMT1RfVEVOVEFUSVZFKQogCQkJCQlwLT5SSU9Db25uZWN0VGFibGVbTmV4dF0uRmxhZ3MgfD0gU0xPVF9URU5UQVRJVkU7Ci0JCQkJaWYgKCBIb3N0UC0+TWFwcGluZ1tSdXBdLkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QgKQorCQkJCWlmIChIb3N0UC0+TWFwcGluZ1tSdXBdLkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QpCiAJCQkJCXAtPlJJT0Nvbm5lY3RUYWJsZVtOZXh0XS5GbGFncyB8PSBSVEExNl9TRUNPTkRfU0xPVDsKIAkJCQlOZXh0Kys7CiAJCQl9CkBAIC00ODksOCArNDYzLDcgQEAKICoqIGlmIHRoZSBlbnRyeSBpcyBzdWl0YWJseSBpbmFjdGl2ZSwgdGhlbiB3ZSBjYW4gZ29iIG9uIGl0IGFuZCByZW1vdmUKICoqIGl0IGZyb20gdGhlIHRhYmxlLgogKi8KLWludAotUklPRGVsZXRlUnRhKHAsIE1hcFApCitpbnQgUklPRGVsZXRlUnRhKHAsIE1hcFApCiBzdHJ1Y3QgcmlvX2luZm8gKnA7CiBzdHJ1Y3QgTWFwICpNYXBQOwogewpAQCAtNTAyLDExMCArNDc1LDk4IEBACiAJaW50IHdvcmtfZG9uZSA9IDA7CiAJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzLCBzZW1fZmxhZ3M7CiAKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiRGVsZXRlIGVudHJ5IG9uIGhvc3QgJXgsIHJ0YSAleFxuIiwKLQkJCQkJCQkJTWFwUC0+SG9zdFVuaXF1ZU51bSwgTWFwUC0+UnRhVW5pcXVlTnVtKTsKKwlyaW9fZHByaW50ayhSSU9fREVCVUdfVEFCTEUsICJEZWxldGUgZW50cnkgb24gaG9zdCAleCwgcnRhICV4XG4iLCBNYXBQLT5Ib3N0VW5pcXVlTnVtLCBNYXBQLT5SdGFVbmlxdWVOdW0pOwogCi0JZm9yICggaG9zdD0wOyBob3N0IDwgcC0+UklPTnVtSG9zdHM7IGhvc3QrKyApIHsKKwlmb3IgKGhvc3QgPSAwOyBob3N0IDwgcC0+UklPTnVtSG9zdHM7IGhvc3QrKykgewogCQlIb3N0UCA9ICZwLT5SSU9Ib3N0c1tob3N0XTsKIAotCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoICZIb3N0UC0+SG9zdExvY2ssIGxvY2tfZmxhZ3MgKTsKKwkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZIb3N0UC0+SG9zdExvY2ssIGxvY2tfZmxhZ3MpOwogCi0JCWlmICggKEhvc3RQLT5GbGFncyAmIFJVTl9TVEFURSkgIT0gUkNfUlVOTklORyApIHsKKwkJaWYgKChIb3N0UC0+RmxhZ3MgJiBSVU5fU1RBVEUpICE9IFJDX1JVTk5JTkcpIHsKIAkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZIb3N0UC0+SG9zdExvY2ssIGxvY2tfZmxhZ3MpOwogCQkJY29udGludWU7CiAJCX0KIAotCQlmb3IgKCBlbnRyeT0wOyBlbnRyeTxNQVhfUlVQOyBlbnRyeSsrICkgewotCQkJaWYgKCBNYXBQLT5SdGFVbmlxdWVOdW0gPT0gSG9zdFAtPk1hcHBpbmdbZW50cnldLlJ0YVVuaXF1ZU51bSApIHsKKwkJZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgTUFYX1JVUDsgZW50cnkrKykgeworCQkJaWYgKE1hcFAtPlJ0YVVuaXF1ZU51bSA9PSBIb3N0UC0+TWFwcGluZ1tlbnRyeV0uUnRhVW5pcXVlTnVtKSB7CiAJCQkJSG9zdE1hcFAgPSAmSG9zdFAtPk1hcHBpbmdbZW50cnldOwotCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJGb3VuZCBlbnRyeSBvZmZzZXQgJWQgb24gaG9zdCAlc1xuIiwgCi0JCQkJCQllbnRyeSwgSG9zdFAtPk5hbWUpOworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UQUJMRSwgIkZvdW5kIGVudHJ5IG9mZnNldCAlZCBvbiBob3N0ICVzXG4iLCBlbnRyeSwgSG9zdFAtPk5hbWUpOwogCiAJCQkJLyoKLQkJCQkqKiBDaGVjayBhbGwgZm91ciBsaW5rcyBvZiB0aGUgdW5pdCBhcmUgZGlzY29ubmVjdGVkCi0JCQkJKi8KLQkJCQlmb3IgKCBsaW5rPTA7IGxpbms8IExJTktTX1BFUl9VTklUOyBsaW5rKysgKSB7Ci0JCQkJCWlmICggSG9zdE1hcFAtPlRvcG9sb2d5W2xpbmtdLlVuaXQgIT0gUk9VVEVfRElTQ09OTkVDVCApIHsKLQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJFbnRyeSBpcyBpbiB1c2UgYW5kIGNhbm5vdCBiZSBkZWxldGVkIVxuIik7CisJCQkJICoqIENoZWNrIGFsbCBmb3VyIGxpbmtzIG9mIHRoZSB1bml0IGFyZSBkaXNjb25uZWN0ZWQKKwkJCQkgKi8KKwkJCQlmb3IgKGxpbmsgPSAwOyBsaW5rIDwgTElOS1NfUEVSX1VOSVQ7IGxpbmsrKykgeworCQkJCQlpZiAoSG9zdE1hcFAtPlRvcG9sb2d5W2xpbmtdLlVuaXQgIT0gUk9VVEVfRElTQ09OTkVDVCkgeworCQkJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiRW50cnkgaXMgaW4gdXNlIGFuZCBjYW5ub3QgYmUgZGVsZXRlZCFcbiIpOwogCQkJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBVTklUX0lTX0lOX1VTRTsKLQkJCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmSG9zdFAtPkhvc3RMb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZIb3N0UC0+SG9zdExvY2ssIGxvY2tfZmxhZ3MpOwogCQkJCQkJcmV0dXJuIC1FQlVTWTsKIAkJCQkJfQogCQkJCX0KIAkJCQkvKgotCQkJCSoqIFNsb3QgaGFzIGJlZW4gYWxsb2NhdGVkLCBCVVQgbm90IGJvb3RlZC9yb3V0ZWQvCi0JCQkJKiogY29ubmVjdGVkL3NlbGVjdGVkIG9yIGFueXRoaW5nIGVsc2UtZWQKLQkJCQkqLworCQkJCSAqKiBTbG90IGhhcyBiZWVuIGFsbG9jYXRlZCwgQlVUIG5vdCBib290ZWQvcm91dGVkLworCQkJCSAqKiBjb25uZWN0ZWQvc2VsZWN0ZWQgb3IgYW55dGhpbmcgZWxzZS1lZAorCQkJCSAqLwogCQkJCVN5c1BvcnQgPSBIb3N0TWFwUC0+U3lzUG9ydDsKIAotCQkJCWlmICggU3lzUG9ydCAhPSBOT19QT1JUICkgewotCQkJCQlmb3IgKHBvcnQ9U3lzUG9ydDsgcG9ydCA8IFN5c1BvcnQrUE9SVFNfUEVSX1JUQTsgcG9ydCsrKSB7CisJCQkJaWYgKFN5c1BvcnQgIT0gTk9fUE9SVCkgeworCQkJCQlmb3IgKHBvcnQgPSBTeXNQb3J0OyBwb3J0IDwgU3lzUG9ydCArIFBPUlRTX1BFUl9SVEE7IHBvcnQrKykgewogCQkJCQkJUG9ydFAgPSBwLT5SSU9Qb3J0cFtwb3J0XTsKLQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJVbm1hcCBwb3J0XG4iKTsKKwkJCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UQUJMRSwgIlVubWFwIHBvcnRcbiIpOwogCi0JCQkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoICZQb3J0UC0+cG9ydFNlbSwgc2VtX2ZsYWdzICk7CisJCQkJCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBzZW1fZmxhZ3MpOwogCiAJCQkJCQlQb3J0UC0+TWFwcGVkID0gMDsKIAotCQkJCQkJaWYgKCBQb3J0UC0+U3RhdGUgJiAoUklPX01PUEVOfFJJT19MT1BFTikgKSB7CisJCQkJCQlpZiAoUG9ydFAtPlN0YXRlICYgKFJJT19NT1BFTiB8IFJJT19MT1BFTikpIHsKIAotCQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJHb2Igb24gcG9ydFxuIik7CisJCQkJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiR29iIG9uIHBvcnRcbiIpOwogCQkJCQkJCVBvcnRQLT5UeEJ1ZmZlckluID0gUG9ydFAtPlR4QnVmZmVyT3V0ID0gMDsKIAkJCQkJCQkvKiBXaGF0IHNob3VsZCBJIGRvIAotCQkJCQkJCXdha2V1cCggJlBvcnRQLT5UeEJ1ZmZlckluICk7Ci0JCQkJCQkJd2FrZXVwKCAmUG9ydFAtPlR4QnVmZmVyT3V0KTsKLQkJCQkJCQkqLworCQkJCQkJCSAgIHdha2V1cCggJlBvcnRQLT5UeEJ1ZmZlckluICk7CisJCQkJCQkJICAgd2FrZXVwKCAmUG9ydFAtPlR4QnVmZmVyT3V0KTsKKwkJCQkJCQkgKi8KIAkJCQkJCQlQb3J0UC0+SW5Vc2UgPSBOT1RfSU5VU0U7CiAJCQkJCQkJLyogV2hhdCBzaG91bGQgSSBkbyAKLQkJCQkJCQl3YWtldXAoICZQb3J0UC0+SW5Vc2UgKTsKLQkJCQkJCQlzaWduYWwoUG9ydFAtPlR0eVAtPnRfcGdycCxTSUdLSUxMKTsKLQkJCQkJCQl0dHlmbHVzaChQb3J0UC0+VHR5UCwoRlJFQUR8RldSSVRFKSk7Ci0JCQkJCQkJKi8KKwkJCQkJCQkgICB3YWtldXAoICZQb3J0UC0+SW5Vc2UgKTsKKwkJCQkJCQkgICBzaWduYWwoUG9ydFAtPlR0eVAtPnRfcGdycCxTSUdLSUxMKTsKKwkJCQkJCQkgICB0dHlmbHVzaChQb3J0UC0+VHR5UCwoRlJFQUR8RldSSVRFKSk7CisJCQkJCQkJICovCiAJCQkJCQkJUG9ydFAtPlN0YXRlIHw9IFJJT19DTE9TSU5HIHwgUklPX0RFTEVURUQ7CiAJCQkJCQl9CiAKIAkJCQkJCS8qCi0JCQkJCQkqKiBGb3IgdGhlIHNlY29uZCBzbG90IG9mIGEgMTYgcG9ydCBSVEEsIHRoZQotCQkJCQkJKiogZHJpdmVyIG5lZWRzIHRvIHJlc2V0IHRoZSBjaGFuZ2VzIG1hZGUgdG8KLQkJCQkJCSoqIHRoZSBwaGIgdG8gcG9ydCBtYXBwaW5ncyBpbiBSSU9Sb3V0ZVJ1cC4KLQkJCQkJCSovCisJCQkJCQkgKiogRm9yIHRoZSBzZWNvbmQgc2xvdCBvZiBhIDE2IHBvcnQgUlRBLCB0aGUKKwkJCQkJCSAqKiBkcml2ZXIgbmVlZHMgdG8gcmVzZXQgdGhlIGNoYW5nZXMgbWFkZSB0bworCQkJCQkJICoqIHRoZSBwaGIgdG8gcG9ydCBtYXBwaW5ncyBpbiBSSU9Sb3V0ZVJ1cC4KKwkJCQkJCSAqLwogCQkJCQkJaWYgKFBvcnRQLT5TZWNvbmRCbG9jaykgewogCQkJCQkJCXVzaG9ydCBkZXN0X3VuaXQgPSBIb3N0TWFwUC0+SUQ7CiAJCQkJCQkJdXNob3J0IGRlc3RfcG9ydCA9IHBvcnQgLSBTeXNQb3J0OwotCQkJCQkJCVdPUkQJICpUeFBrdFA7Ci0JCQkJCQkJUEtUCSpQa3Q7CisJCQkJCQkJV09SRCAqVHhQa3RQOworCQkJCQkJCVBLVCAqUGt0OwogCi0JCQkJCQkJZm9yIChUeFBrdFAgPSBQb3J0UC0+VHhTdGFydDsKLQkJCQkJCQkJVHhQa3RQIDw9IFBvcnRQLT5UeEVuZDsgVHhQa3RQKyspIHsKKwkJCQkJCQlmb3IgKFR4UGt0UCA9IFBvcnRQLT5UeFN0YXJ0OyBUeFBrdFAgPD0gUG9ydFAtPlR4RW5kOyBUeFBrdFArKykgewogCQkJCQkJCQkvKgotCQkJCQkJCQkqKiAqVHhQa3RQIGlzIHRoZSBwb2ludGVyIHRvIHRoZQotCQkJCQkJCQkqKiB0cmFuc21pdCBwYWNrZXQgb24gdGhlIGhvc3QgY2FyZC4KLQkJCQkJCQkJKiogVGhpcyBuZWVkcyB0byBiZSB0cmFuc2xhdGVkIGludG8KLQkJCQkJCQkJKiogYSAzMiBiaXQgcG9pbnRlciBzbyBpdCBjYW4gYmUKLQkJCQkJCQkJKiogYWNjZXNzZWQgZnJvbSB0aGUgZHJpdmVyLgotCQkJCQkJCQkqLwotCQkJCQkJCQlQa3QgPSAoUEtUICopIFJJT19QVFIoSG9zdFAtPkNhZGRyLAotCQkJCQkJCQkgCVJXT1JEKCpUeFBrdFApKTsKLQkJCQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgCi0JCQkJCQkiVHggcGFja2V0ICgleCkgZGVzdGluYXRpb246IE9sZCAleDoleCBOZXcgJXg6JXhcbiIsCi0JCQkJCQkJCSAqVHhQa3RQLCBQa3QtPmRlc3RfdW5pdCwKLQkJCQkJCQkJIFBrdC0+ZGVzdF9wb3J0LCBkZXN0X3VuaXQsIGRlc3RfcG9ydCk7CisJCQkJCQkJCSAqKiAqVHhQa3RQIGlzIHRoZSBwb2ludGVyIHRvIHRoZQorCQkJCQkJCQkgKiogdHJhbnNtaXQgcGFja2V0IG9uIHRoZSBob3N0IGNhcmQuCisJCQkJCQkJCSAqKiBUaGlzIG5lZWRzIHRvIGJlIHRyYW5zbGF0ZWQgaW50bworCQkJCQkJCQkgKiogYSAzMiBiaXQgcG9pbnRlciBzbyBpdCBjYW4gYmUKKwkJCQkJCQkJICoqIGFjY2Vzc2VkIGZyb20gdGhlIGRyaXZlci4KKwkJCQkJCQkJICovCisJCQkJCQkJCVBrdCA9IChQS1QgKikgUklPX1BUUihIb3N0UC0+Q2FkZHIsIFJXT1JEKCpUeFBrdFApKTsKKwkJCQkJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiVHggcGFja2V0ICgleCkgZGVzdGluYXRpb246IE9sZCAleDoleCBOZXcgJXg6JXhcbiIsICpUeFBrdFAsIFBrdC0+ZGVzdF91bml0LCBQa3QtPmRlc3RfcG9ydCwgZGVzdF91bml0LCBkZXN0X3BvcnQpOwogCQkJCQkJCQlXV09SRChQa3QtPmRlc3RfdW5pdCwgZGVzdF91bml0KTsKIAkJCQkJCQkJV1dPUkQoUGt0LT5kZXN0X3BvcnQsIGRlc3RfcG9ydCk7CiAJCQkJCQkJfQotCQkJCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsIAotCQkJCQkJIlBvcnQgJWQgcGhiIGRlc3RpbmF0aW9uOiBPbGQgJXg6JXggTmV3ICV4OiV4XG4iLAotCQkJCQkJCSBwb3J0LCBQb3J0UC0+UGhiUC0+ZGVzdGluYXRpb24gJiAweGZmLAotCQkJCQkJCSAoUG9ydFAtPlBoYlAtPmRlc3RpbmF0aW9uID4+IDgpICYgMHhmZiwKLQkJCQkJCQkgZGVzdF91bml0LCBkZXN0X3BvcnQpOwotCQkJCQkJCVdXT1JEKFBvcnRQLT5QaGJQLT5kZXN0aW5hdGlvbiwKLQkJCQkJCQkgZGVzdF91bml0ICsgKGRlc3RfcG9ydCA8PCA4KSk7CisJCQkJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiUG9ydCAlZCBwaGIgZGVzdGluYXRpb246IE9sZCAleDoleCBOZXcgJXg6JXhcbiIsIHBvcnQsIFBvcnRQLT5QaGJQLT5kZXN0aW5hdGlvbiAmIDB4ZmYsIChQb3J0UC0+UGhiUC0+ZGVzdGluYXRpb24gPj4gOCkgJiAweGZmLCBkZXN0X3VuaXQsIGRlc3RfcG9ydCk7CisJCQkJCQkJV1dPUkQoUG9ydFAtPlBoYlAtPmRlc3RpbmF0aW9uLCBkZXN0X3VuaXQgKyAoZGVzdF9wb3J0IDw8IDgpKTsKIAkJCQkJCX0KIAkJCQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgc2VtX2ZsYWdzKTsKIAkJCQkJfQogCQkJCX0KLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiRW50cnkgbnVsbGVkLlxuIik7Ci0JCQkJYnplcm8oKGNoYXIgKilIb3N0TWFwUCxzaXplb2Yoc3RydWN0IE1hcCkpOworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UQUJMRSwgIkVudHJ5IG51bGxlZC5cbiIpOworCQkJCWJ6ZXJvKChjaGFyICopIEhvc3RNYXBQLCBzaXplb2Yoc3RydWN0IE1hcCkpOwogCQkJCXdvcmtfZG9uZSsrOwogCQkJfQogCQl9CkBAIC02MTMsMjAzICs1NzQsMTc4IEBACiAJfQogCiAJLyogWFhYWFggbG9jayBtZSB1cCAqLwotCWZvciAoIGVudHJ5PTA7IGVudHJ5PCBUT1RBTF9NQVBfRU5UUklFUzsgZW50cnkrKyApIHsKLQkJaWYgKCBwLT5SSU9TYXZlZFRhYmxlW2VudHJ5XS5SdGFVbmlxdWVOdW0gPT0gTWFwUC0+UnRhVW5pcXVlTnVtICkgewotCQkJYnplcm8oKGNoYXIgKikmcC0+UklPU2F2ZWRUYWJsZVtlbnRyeV0sc2l6ZW9mKHN0cnVjdCBNYXApKTsKKwlmb3IgKGVudHJ5ID0gMDsgZW50cnkgPCBUT1RBTF9NQVBfRU5UUklFUzsgZW50cnkrKykgeworCQlpZiAocC0+UklPU2F2ZWRUYWJsZVtlbnRyeV0uUnRhVW5pcXVlTnVtID09IE1hcFAtPlJ0YVVuaXF1ZU51bSkgeworCQkJYnplcm8oKGNoYXIgKikgJnAtPlJJT1NhdmVkVGFibGVbZW50cnldLCBzaXplb2Yoc3RydWN0IE1hcCkpOwogCQkJd29ya19kb25lKys7CiAJCX0KLQkJaWYgKCBwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlJ0YVVuaXF1ZU51bSA9PSBNYXBQLT5SdGFVbmlxdWVOdW0gKSB7Ci0JCQliemVybygoY2hhciAqKSZwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLHNpemVvZihzdHJ1Y3QgTWFwKSk7CisJCWlmIChwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLlJ0YVVuaXF1ZU51bSA9PSBNYXBQLT5SdGFVbmlxdWVOdW0pIHsKKwkJCWJ6ZXJvKChjaGFyICopICZwLT5SSU9Db25uZWN0VGFibGVbZW50cnldLCBzaXplb2Yoc3RydWN0IE1hcCkpOwogCQkJd29ya19kb25lKys7CiAJCX0KIAl9Ci0JaWYgKCB3b3JrX2RvbmUgKQorCWlmICh3b3JrX2RvbmUpCiAJCXJldHVybiAwOwogCi0JcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkNvdWxkbid0IGZpbmQgZW50cnkgdG8gYmUgZGVsZXRlZFxuIik7CisJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiQ291bGRuJ3QgZmluZCBlbnRyeSB0byBiZSBkZWxldGVkXG4iKTsKIAlwLT5SSU9FcnJvci5FcnJvciA9IENPVUxETlRfRklORF9FTlRSWTsKIAlyZXR1cm4gLUVOWElPOwogfQogCi1pbnQgUklPQXNzaWduUnRhKCBzdHJ1Y3QgcmlvX2luZm8gKnAsIHN0cnVjdCBNYXAgKk1hcFAgKQoraW50IFJJT0Fzc2lnblJ0YShzdHJ1Y3QgcmlvX2luZm8gKnAsIHN0cnVjdCBNYXAgKk1hcFApCiB7Ci0gICAgaW50IGhvc3Q7Ci0gICAgc3RydWN0IE1hcCAqSG9zdE1hcFA7Ci0gICAgY2hhciAqc3B0cjsKLSAgICBpbnQJbGluazsKKwlpbnQgaG9zdDsKKwlzdHJ1Y3QgTWFwICpIb3N0TWFwUDsKKwljaGFyICpzcHRyOworCWludCBsaW5rOwogCiAKLSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiQXNzaWduIGVudHJ5IG9uIGhvc3QgJXgsIHJ0YSAleCwgSUQgJWQsIFN5c3BvcnQgJWRcbiIsCi0JCQkJTWFwUC0+SG9zdFVuaXF1ZU51bSxNYXBQLT5SdGFVbmlxdWVOdW0sCi0JCQkJTWFwUC0+SUQsIChpbnQpTWFwUC0+U3lzUG9ydCk7CisJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiQXNzaWduIGVudHJ5IG9uIGhvc3QgJXgsIHJ0YSAleCwgSUQgJWQsIFN5c3BvcnQgJWRcbiIsIE1hcFAtPkhvc3RVbmlxdWVOdW0sIE1hcFAtPlJ0YVVuaXF1ZU51bSwgTWFwUC0+SUQsIChpbnQpIE1hcFAtPlN5c1BvcnQpOwogCi0gICAgaWYgKChNYXBQLT5JRCAhPSAodXNob3J0KS0xKSAmJgotCSgoaW50KU1hcFAtPklEIDwgKGludCkxIHx8IChpbnQpTWFwUC0+SUQgPiBNQVhfUlVQICkpCi0gICAgewotCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJCYWQgSUQgaW4gbWFwIGVudHJ5IVxuIik7Ci0JcC0+UklPRXJyb3IuRXJyb3IgPSBJRF9OVU1CRVJfT1VUX09GX1JBTkdFOwotCXJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBpZiAoTWFwUC0+UnRhVW5pcXVlTnVtID09IDApCi0gICAgewotCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSdGEgVW5pcXVlIG51bWJlciB6ZXJvIVxuIik7Ci0JcC0+UklPRXJyb3IuRXJyb3IgPSBSVEFfVU5JUVVFX05VTUJFUl9aRVJPOwotCXJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBpZiAoIChNYXBQLT5TeXNQb3J0ICE9IE5PX1BPUlQpICYmIChNYXBQLT5TeXNQb3J0ICUgUE9SVFNfUEVSX1JUQSkgKQotICAgIHsKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUG9ydCAlZCBub3QgbXVsdGlwbGUgb2YgJWQhXG4iLChpbnQpTWFwUC0+U3lzUG9ydCxQT1JUU19QRVJfUlRBKTsKLQlwLT5SSU9FcnJvci5FcnJvciA9IFRUWV9OVU1CRVJfT1VUX09GX1JBTkdFOwotCXJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBpZiAoIChNYXBQLT5TeXNQb3J0ICE9IE5PX1BPUlQpICYmIChNYXBQLT5TeXNQb3J0ID49IFJJT19QT1JUUykgKQotICAgIHsKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiUG9ydCAlZCBub3QgdmFsaWQhXG4iLChpbnQpTWFwUC0+U3lzUG9ydCk7Ci0JcC0+UklPRXJyb3IuRXJyb3IgPSBUVFlfTlVNQkVSX09VVF9PRl9SQU5HRTsKLQlyZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICAvKgotICAgICoqIENvcHkgdGhlIG5hbWUgYWNyb3NzIHRvIHRoZSBtYXAgZW50cnkuCi0gICAgKi8KLSAgICBNYXBQLT5OYW1lW01BWF9OQU1FX0xFTi0xXSA9ICdcMCc7Ci0gICAgc3B0ciA9IE1hcFAtPk5hbWU7Ci0gICAgd2hpbGUgKCAqc3B0ciApCi0gICAgewotICAgIGlmICggKnNwdHI8JyAnIHx8ICpzcHRyPid+JyApCi0gICAgewotCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJOYW1lIGVudHJ5IGNvbnRhaW5zIG5vbi1wcmludGluZyBjaGFyYWN0ZXJzIVxuIik7Ci0JcC0+UklPRXJyb3IuRXJyb3IgPSBCQURfQ0hBUkFDVEVSX0lOX05BTUU7Ci0JcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIHNwdHIrKzsKLSAgICB9Ci0KLSAgICBmb3IgKCBob3N0PTA7IGhvc3QgPCBwLT5SSU9OdW1Ib3N0czsgaG9zdCsrICkKLSAgICB7Ci0JaWYgKCBNYXBQLT5Ib3N0VW5pcXVlTnVtID09IHAtPlJJT0hvc3RzW2hvc3RdLlVuaXF1ZU51bSApCi0JewotCSAgICBpZiAoIChwLT5SSU9Ib3N0c1tob3N0XS5GbGFncyAmIFJVTl9TVEFURSkgIT0gUkNfUlVOTklORyApCi0JICAgIHsKLQkJcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX05PVF9SVU5OSU5HOwotCQlyZXR1cm4gLUVOWElPOwotCSAgICB9Ci0KLQkgICAgLyoKLQkgICAgKiogTm93IHdlIGhhdmUgYSBob3N0IHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gSUQKLQkgICAgKiogaWYgdGhlIGVudHJ5IGRvZXMgbm90IGFscmVhZHkgaGF2ZSBvbmUuCi0JICAgICovCi0JICAgIGlmIChNYXBQLT5JRCA9PSAodXNob3J0KS0xKQotCSAgICB7Ci0JCWludCBuTmV3SUQ7Ci0KLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkF0dGVtcHRpbmcgdG8gZ2V0IGEgbmV3IElEIGZvciBydGEgXCIlc1wiXG4iLAotCQkgICAgICBNYXBQLT5OYW1lKTsKLQkJLyoKLQkJKiogVGhlIGlkZWEgaGVyZSBpcyB0byBhbGxvdyBSVEEncyB0byBiZSBhc3NpZ25lZAotCQkqKiBiZWZvcmUgdGhleSBhY3R1YWxseSBhcHBlYXIgb24gdGhlIG5ldHdvcmsuCi0JCSoqIFRoaXMgYWxsb3dzIHRoZSBhZGRpdGlvbiBvZiBSVEEncyB3aXRob3V0IGhhdmluZwotCQkqKiB0byBwbHVnIHRoZW0gaW4uCi0JCSoqIFdoYXQgd2UgZG8gaXM6Ci0JCSoqICAtIEZpbmQgYSBmcmVlIElEIGFuZCBhbGxvY2F0ZSBpdCB0byB0aGUgUlRBLgotCQkqKiAgLSBJZiB0aGlzIG1hcCBlbnRyeSBpcyB0aGUgc2Vjb25kIGhhbGYgb2YgYQotCQkqKiAgICAxNiBwb3J0IGVudHJ5IHRoZW4gZmluZCB0aGUgb3RoZXIgaGFsZiBhbmQKLQkJKiogICAgbWFrZSBzdXJlIHRoZSAyIGNyb3NzIHJlZmVyZW5jZSBlYWNoIG90aGVyLgotCQkqLwotCQlpZiAoUklPRmluZEZyZWVJRChwLCAmcC0+UklPSG9zdHNbaG9zdF0sICZuTmV3SUQsIE5VTEwpICE9IDApCi0JCXsKLQkJICAgIHAtPlJJT0Vycm9yLkVycm9yID0gQ09VTEROVF9GSU5EX0VOVFJZOwotCQkgICAgcmV0dXJuIC1FQlVTWTsKLQkJfQotCQlNYXBQLT5JRCA9ICh1c2hvcnQpbk5ld0lEICsgMTsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkFsbG9jYXRlZCBJRCAlZCBmb3IgdGhpcyBuZXcgUlRBLlxuIiwgTWFwUC0+SUQpOwotCQlIb3N0TWFwUCA9ICZwLT5SSU9Ib3N0c1tob3N0XS5NYXBwaW5nW25OZXdJRF07Ci0JCUhvc3RNYXBQLT5SdGFVbmlxdWVOdW0gPSBNYXBQLT5SdGFVbmlxdWVOdW07Ci0JCUhvc3RNYXBQLT5Ib3N0VW5pcXVlTnVtID0gTWFwUC0+SG9zdFVuaXF1ZU51bTsKLQkJSG9zdE1hcFAtPklEID0gTWFwUC0+SUQ7Ci0JCWZvciAobGluayA9IDA7IGxpbmsgPCBMSU5LU19QRVJfVU5JVDsgbGluaysrKQotCQl7Ci0JCSAgICBIb3N0TWFwUC0+VG9wb2xvZ3lbbGlua10uVW5pdCA9IFJPVVRFX0RJU0NPTk5FQ1Q7Ci0JCSAgICBIb3N0TWFwUC0+VG9wb2xvZ3lbbGlua10uTGluayA9IE5PX0xJTks7Ci0JCX0KLQkJaWYgKE1hcFAtPkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QpCi0JCXsKLQkJICAgIGludCB1bml0OwotCi0JCSAgICBmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX1JVUDsgdW5pdCsrKQotCQkJaWYgKHAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbdW5pdF0uUnRhVW5pcXVlTnVtID09Ci0JCQkgICAgTWFwUC0+UnRhVW5pcXVlTnVtKQotCQkJICAgIGJyZWFrOwotCQkgICAgaWYgKHVuaXQgPT0gTUFYX1JVUCkKLQkJICAgIHsKLQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09VTEROVF9GSU5EX0VOVFJZOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJICAgIH0KLQkJICAgIEhvc3RNYXBQLT5GbGFncyB8PSBSVEExNl9TRUNPTkRfU0xPVDsKLQkJICAgIEhvc3RNYXBQLT5JRDIgPSBNYXBQLT5JRDIgPSBwLT5SSU9Ib3N0c1tob3N0XS5NYXBwaW5nW3VuaXRdLklEOwotCQkgICAgcC0+UklPSG9zdHNbaG9zdF0uTWFwcGluZ1t1bml0XS5JRDIgPSBNYXBQLT5JRDsKLQkJICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJDcm9zcyByZWZlcmVuY2VkIGlkICVkIHRvIElEICVkLlxuIiwKLQkJCSAgTWFwUC0+SUQsCi0JCQkgIHAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbdW5pdF0uSUQpOwotCQl9Ci0JICAgIH0KLQotCSAgICBIb3N0TWFwUCA9ICZwLT5SSU9Ib3N0c1tob3N0XS5NYXBwaW5nW01hcFAtPklELTFdOwotCi0JICAgIGlmICggSG9zdE1hcFAtPkZsYWdzICYgU0xPVF9JTl9VU0UgKQotCSAgICB7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJNYXAgdGFibGUgc2xvdCBmb3IgSUQgJWQgaXMgYWxyZWFkeSBpbiB1c2UuXG4iLCBNYXBQLT5JRCk7Ci0JCXAtPlJJT0Vycm9yLkVycm9yID0gSURfQUxSRUFEWV9JTl9VU0U7Ci0JCXJldHVybiAtRUJVU1k7Ci0JICAgIH0KLQotCSAgICAvKgotCSAgICAqKiBBc3NpZ24gdGhlIHN5cyBwb3J0cyBhbmQgdGhlIG5hbWUsIGFuZCBtYXJrIHRoZSBzbG90IGFzCi0JICAgICoqIGJlaW5nIGluIHVzZS4KLQkgICAgKi8KLQkgICAgSG9zdE1hcFAtPlN5c1BvcnQgPSBNYXBQLT5TeXNQb3J0OwotCSAgICBpZiAoKE1hcFAtPkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QpID09IDApCi0JICAgICAgQ0NPUFkoIE1hcFAtPk5hbWUsIEhvc3RNYXBQLT5OYW1lLCBNQVhfTkFNRV9MRU4gKTsKLQkgICAgSG9zdE1hcFAtPkZsYWdzID0gU0xPVF9JTl9VU0UgfCBSVEFfQk9PVEVEOwotI2lmZGVmIE5FRURfVE9fRklYCi0JICAgIFJJT19TVl9CUk9BRENBU1QocC0+UklPSG9zdHNbaG9zdF0uc3ZGbGFnc1tNYXBQLT5JRC0xXSk7Ci0jZW5kaWYKLQkgICAgaWYgKE1hcFAtPkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QpCi0JCUhvc3RNYXBQLT5GbGFncyB8PSBSVEExNl9TRUNPTkRfU0xPVDsKLQotCSAgICBSSU9SZU1hcFBvcnRzKCBwLCAmcC0+UklPSG9zdHNbaG9zdF0sIEhvc3RNYXBQICk7Ci0JICAgIC8qCi0JICAgICoqIEFkanVzdCAybmQgYmxvY2sgb2YgOCBwaGJzCi0JICAgICovCi0JICAgIGlmIChNYXBQLT5GbGFncyAmIFJUQTE2X1NFQ09ORF9TTE9UKQotCQlSSU9GaXhQaGJzKHAsICZwLT5SSU9Ib3N0c1tob3N0XSwgSG9zdE1hcFAtPklEIC0gMSk7Ci0KLQkgICAgaWYgKCBIb3N0TWFwUC0+U3lzUG9ydCAhPSBOT19QT1JUICkKLQkgICAgewotCQlpZiAoIEhvc3RNYXBQLT5TeXNQb3J0IDwgcC0+UklPRmlyc3RQb3J0c0Jvb3RlZCApCi0JCSAgICBwLT5SSU9GaXJzdFBvcnRzQm9vdGVkID0gSG9zdE1hcFAtPlN5c1BvcnQ7Ci0JCWlmICggSG9zdE1hcFAtPlN5c1BvcnQgPiBwLT5SSU9MYXN0UG9ydHNCb290ZWQgKQotCQkgICAgcC0+UklPTGFzdFBvcnRzQm9vdGVkID0gSG9zdE1hcFAtPlN5c1BvcnQ7Ci0JICAgIH0KLQkgICAgaWYgKE1hcFAtPkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QpCi0JICAgICAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiU2Vjb25kIG1hcCBvZiBSVEEgJXMgYWRkZWQgdG8gY29uZmlndXJhdGlvblxuIiwKLQkJIHAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbTWFwUC0+SUQyIC0gMV0uTmFtZSk7Ci0JICAgIGVsc2UKLQkgICAgICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJSVEEgJXMgYWRkZWQgdG8gY29uZmlndXJhdGlvblxuIiwgTWFwUC0+TmFtZSk7Ci0JICAgIHJldHVybiAwOworCWlmICgoTWFwUC0+SUQgIT0gKHVzaG9ydCkgLSAxKSAmJiAoKGludCkgTWFwUC0+SUQgPCAoaW50KSAxIHx8IChpbnQpIE1hcFAtPklEID4gTUFYX1JVUCkpIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiQmFkIElEIGluIG1hcCBlbnRyeSFcbiIpOworCQlwLT5SSU9FcnJvci5FcnJvciA9IElEX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCXJldHVybiAtRUlOVkFMOwogCX0KLSAgICB9Ci0gICAgcC0+UklPRXJyb3IuRXJyb3IgPSBVTktOT1dOX0hPU1RfTlVNQkVSOwotICAgIHJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJVbmtub3duIGhvc3QgJXhcbiIsIE1hcFAtPkhvc3RVbmlxdWVOdW0pOwotICAgIHJldHVybiAtRU5YSU87CisJaWYgKE1hcFAtPlJ0YVVuaXF1ZU51bSA9PSAwKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UQUJMRSwgIlJ0YSBVbmlxdWUgbnVtYmVyIHplcm8hXG4iKTsKKwkJcC0+UklPRXJyb3IuRXJyb3IgPSBSVEFfVU5JUVVFX05VTUJFUl9aRVJPOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKChNYXBQLT5TeXNQb3J0ICE9IE5PX1BPUlQpICYmIChNYXBQLT5TeXNQb3J0ICUgUE9SVFNfUEVSX1JUQSkpIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiUG9ydCAlZCBub3QgbXVsdGlwbGUgb2YgJWQhXG4iLCAoaW50KSBNYXBQLT5TeXNQb3J0LCBQT1JUU19QRVJfUlRBKTsKKwkJcC0+UklPRXJyb3IuRXJyb3IgPSBUVFlfTlVNQkVSX09VVF9PRl9SQU5HRTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICgoTWFwUC0+U3lzUG9ydCAhPSBOT19QT1JUKSAmJiAoTWFwUC0+U3lzUG9ydCA+PSBSSU9fUE9SVFMpKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UQUJMRSwgIlBvcnQgJWQgbm90IHZhbGlkIVxuIiwgKGludCkgTWFwUC0+U3lzUG9ydCk7CisJCXAtPlJJT0Vycm9yLkVycm9yID0gVFRZX05VTUJFUl9PVVRfT0ZfUkFOR0U7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICoqIENvcHkgdGhlIG5hbWUgYWNyb3NzIHRvIHRoZSBtYXAgZW50cnkuCisJICovCisJTWFwUC0+TmFtZVtNQVhfTkFNRV9MRU4gLSAxXSA9ICdcMCc7CisJc3B0ciA9IE1hcFAtPk5hbWU7CisJd2hpbGUgKCpzcHRyKSB7CisJCWlmICgqc3B0ciA8ICcgJyB8fCAqc3B0ciA+ICd+JykgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiTmFtZSBlbnRyeSBjb250YWlucyBub24tcHJpbnRpbmcgY2hhcmFjdGVycyFcbiIpOworCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBCQURfQ0hBUkFDVEVSX0lOX05BTUU7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlzcHRyKys7CisJfQorCisJZm9yIChob3N0ID0gMDsgaG9zdCA8IHAtPlJJT051bUhvc3RzOyBob3N0KyspIHsKKwkJaWYgKE1hcFAtPkhvc3RVbmlxdWVOdW0gPT0gcC0+UklPSG9zdHNbaG9zdF0uVW5pcXVlTnVtKSB7CisJCQlpZiAoKHAtPlJJT0hvc3RzW2hvc3RdLkZsYWdzICYgUlVOX1NUQVRFKSAhPSBSQ19SVU5OSU5HKSB7CisJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBIT1NUX05PVF9SVU5OSU5HOworCQkJCXJldHVybiAtRU5YSU87CisJCQl9CisKKwkJCS8qCisJCQkgKiogTm93IHdlIGhhdmUgYSBob3N0IHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gSUQKKwkJCSAqKiBpZiB0aGUgZW50cnkgZG9lcyBub3QgYWxyZWFkeSBoYXZlIG9uZS4KKwkJCSAqLworCQkJaWYgKE1hcFAtPklEID09ICh1c2hvcnQpIC0gMSkgeworCQkJCWludCBuTmV3SUQ7CisKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVEFCTEUsICJBdHRlbXB0aW5nIHRvIGdldCBhIG5ldyBJRCBmb3IgcnRhIFwiJXNcIlxuIiwgTWFwUC0+TmFtZSk7CisJCQkJLyoKKwkJCQkgKiogVGhlIGlkZWEgaGVyZSBpcyB0byBhbGxvdyBSVEEncyB0byBiZSBhc3NpZ25lZAorCQkJCSAqKiBiZWZvcmUgdGhleSBhY3R1YWxseSBhcHBlYXIgb24gdGhlIG5ldHdvcmsuCisJCQkJICoqIFRoaXMgYWxsb3dzIHRoZSBhZGRpdGlvbiBvZiBSVEEncyB3aXRob3V0IGhhdmluZworCQkJCSAqKiB0byBwbHVnIHRoZW0gaW4uCisJCQkJICoqIFdoYXQgd2UgZG8gaXM6CisJCQkJICoqICAtIEZpbmQgYSBmcmVlIElEIGFuZCBhbGxvY2F0ZSBpdCB0byB0aGUgUlRBLgorCQkJCSAqKiAgLSBJZiB0aGlzIG1hcCBlbnRyeSBpcyB0aGUgc2Vjb25kIGhhbGYgb2YgYQorCQkJCSAqKiAgICAxNiBwb3J0IGVudHJ5IHRoZW4gZmluZCB0aGUgb3RoZXIgaGFsZiBhbmQKKwkJCQkgKiogICAgbWFrZSBzdXJlIHRoZSAyIGNyb3NzIHJlZmVyZW5jZSBlYWNoIG90aGVyLgorCQkJCSAqLworCQkJCWlmIChSSU9GaW5kRnJlZUlEKHAsICZwLT5SSU9Ib3N0c1tob3N0XSwgJm5OZXdJRCwgTlVMTCkgIT0gMCkgeworCQkJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPVUxETlRfRklORF9FTlRSWTsKKwkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCQl9CisJCQkJTWFwUC0+SUQgPSAodXNob3J0KSBuTmV3SUQgKyAxOworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UQUJMRSwgIkFsbG9jYXRlZCBJRCAlZCBmb3IgdGhpcyBuZXcgUlRBLlxuIiwgTWFwUC0+SUQpOworCQkJCUhvc3RNYXBQID0gJnAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbbk5ld0lEXTsKKwkJCQlIb3N0TWFwUC0+UnRhVW5pcXVlTnVtID0gTWFwUC0+UnRhVW5pcXVlTnVtOworCQkJCUhvc3RNYXBQLT5Ib3N0VW5pcXVlTnVtID0gTWFwUC0+SG9zdFVuaXF1ZU51bTsKKwkJCQlIb3N0TWFwUC0+SUQgPSBNYXBQLT5JRDsKKwkJCQlmb3IgKGxpbmsgPSAwOyBsaW5rIDwgTElOS1NfUEVSX1VOSVQ7IGxpbmsrKykgeworCQkJCQlIb3N0TWFwUC0+VG9wb2xvZ3lbbGlua10uVW5pdCA9IFJPVVRFX0RJU0NPTk5FQ1Q7CisJCQkJCUhvc3RNYXBQLT5Ub3BvbG9neVtsaW5rXS5MaW5rID0gTk9fTElOSzsKKwkJCQl9CisJCQkJaWYgKE1hcFAtPkZsYWdzICYgUlRBMTZfU0VDT05EX1NMT1QpIHsKKwkJCQkJaW50IHVuaXQ7CisKKwkJCQkJZm9yICh1bml0ID0gMDsgdW5pdCA8IE1BWF9SVVA7IHVuaXQrKykKKwkJCQkJCWlmIChwLT5SSU9Ib3N0c1tob3N0XS5NYXBwaW5nW3VuaXRdLlJ0YVVuaXF1ZU51bSA9PSBNYXBQLT5SdGFVbmlxdWVOdW0pCisJCQkJCQkJYnJlYWs7CisJCQkJCWlmICh1bml0ID09IE1BWF9SVVApIHsKKwkJCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09VTEROVF9GSU5EX0VOVFJZOworCQkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCQkJfQorCQkJCQlIb3N0TWFwUC0+RmxhZ3MgfD0gUlRBMTZfU0VDT05EX1NMT1Q7CisJCQkJCUhvc3RNYXBQLT5JRDIgPSBNYXBQLT5JRDIgPSBwLT5SSU9Ib3N0c1tob3N0XS5NYXBwaW5nW3VuaXRdLklEOworCQkJCQlwLT5SSU9Ib3N0c1tob3N0XS5NYXBwaW5nW3VuaXRdLklEMiA9IE1hcFAtPklEOworCQkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVEFCTEUsICJDcm9zcyByZWZlcmVuY2VkIGlkICVkIHRvIElEICVkLlxuIiwgTWFwUC0+SUQsIHAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbdW5pdF0uSUQpOworCQkJCX0KKwkJCX0KKworCQkJSG9zdE1hcFAgPSAmcC0+UklPSG9zdHNbaG9zdF0uTWFwcGluZ1tNYXBQLT5JRCAtIDFdOworCisJCQlpZiAoSG9zdE1hcFAtPkZsYWdzICYgU0xPVF9JTl9VU0UpIHsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVEFCTEUsICJNYXAgdGFibGUgc2xvdCBmb3IgSUQgJWQgaXMgYWxyZWFkeSBpbiB1c2UuXG4iLCBNYXBQLT5JRCk7CisJCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBJRF9BTFJFQURZX0lOX1VTRTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCisJCQkvKgorCQkJICoqIEFzc2lnbiB0aGUgc3lzIHBvcnRzIGFuZCB0aGUgbmFtZSwgYW5kIG1hcmsgdGhlIHNsb3QgYXMKKwkJCSAqKiBiZWluZyBpbiB1c2UuCisJCQkgKi8KKwkJCUhvc3RNYXBQLT5TeXNQb3J0ID0gTWFwUC0+U3lzUG9ydDsKKwkJCWlmICgoTWFwUC0+RmxhZ3MgJiBSVEExNl9TRUNPTkRfU0xPVCkgPT0gMCkKKwkJCQlDQ09QWShNYXBQLT5OYW1lLCBIb3N0TWFwUC0+TmFtZSwgTUFYX05BTUVfTEVOKTsKKwkJCUhvc3RNYXBQLT5GbGFncyA9IFNMT1RfSU5fVVNFIHwgUlRBX0JPT1RFRDsKKyNpZmRlZiBORUVEX1RPX0ZJWAorCQkJUklPX1NWX0JST0FEQ0FTVChwLT5SSU9Ib3N0c1tob3N0XS5zdkZsYWdzW01hcFAtPklEIC0gMV0pOworI2VuZGlmCisJCQlpZiAoTWFwUC0+RmxhZ3MgJiBSVEExNl9TRUNPTkRfU0xPVCkKKwkJCQlIb3N0TWFwUC0+RmxhZ3MgfD0gUlRBMTZfU0VDT05EX1NMT1Q7CisKKwkJCVJJT1JlTWFwUG9ydHMocCwgJnAtPlJJT0hvc3RzW2hvc3RdLCBIb3N0TWFwUCk7CisJCQkvKgorCQkJICoqIEFkanVzdCAybmQgYmxvY2sgb2YgOCBwaGJzCisJCQkgKi8KKwkJCWlmIChNYXBQLT5GbGFncyAmIFJUQTE2X1NFQ09ORF9TTE9UKQorCQkJCVJJT0ZpeFBoYnMocCwgJnAtPlJJT0hvc3RzW2hvc3RdLCBIb3N0TWFwUC0+SUQgLSAxKTsKKworCQkJaWYgKEhvc3RNYXBQLT5TeXNQb3J0ICE9IE5PX1BPUlQpIHsKKwkJCQlpZiAoSG9zdE1hcFAtPlN5c1BvcnQgPCBwLT5SSU9GaXJzdFBvcnRzQm9vdGVkKQorCQkJCQlwLT5SSU9GaXJzdFBvcnRzQm9vdGVkID0gSG9zdE1hcFAtPlN5c1BvcnQ7CisJCQkJaWYgKEhvc3RNYXBQLT5TeXNQb3J0ID4gcC0+UklPTGFzdFBvcnRzQm9vdGVkKQorCQkJCQlwLT5SSU9MYXN0UG9ydHNCb290ZWQgPSBIb3N0TWFwUC0+U3lzUG9ydDsKKwkJCX0KKwkJCWlmIChNYXBQLT5GbGFncyAmIFJUQTE2X1NFQ09ORF9TTE9UKQorCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UQUJMRSwgIlNlY29uZCBtYXAgb2YgUlRBICVzIGFkZGVkIHRvIGNvbmZpZ3VyYXRpb25cbiIsIHAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbTWFwUC0+SUQyIC0gMV0uTmFtZSk7CisJCQllbHNlCisJCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiUlRBICVzIGFkZGVkIHRvIGNvbmZpZ3VyYXRpb25cbiIsIE1hcFAtPk5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcC0+UklPRXJyb3IuRXJyb3IgPSBVTktOT1dOX0hPU1RfTlVNQkVSOworCXJpb19kcHJpbnRrKFJJT19ERUJVR19UQUJMRSwgIlVua25vd24gaG9zdCAleFxuIiwgTWFwUC0+SG9zdFVuaXF1ZU51bSk7CisJcmV0dXJuIC1FTlhJTzsKIH0KIAogCi1pbnQKLVJJT1JlTWFwUG9ydHMocCwgSG9zdFAsIEhvc3RNYXBQKQotc3RydWN0IHJpb19pbmZvICoJcDsKK2ludCBSSU9SZU1hcFBvcnRzKHAsIEhvc3RQLCBIb3N0TWFwUCkKK3N0cnVjdCByaW9faW5mbyAqcDsKIHN0cnVjdCBIb3N0ICpIb3N0UDsKLXN0cnVjdCBNYXAgKkhvc3RNYXBQOyAKK3N0cnVjdCBNYXAgKkhvc3RNYXBQOwogewogCXJlZ2lzdGVyIHN0cnVjdCBQb3J0ICpQb3J0UDsKIAl1aW50IFN1YkVudDsKQEAgLTgxOCwxMzYgKzc1NCwxMjAgQEAKIAl1c2hvcnQgUnRhVHlwZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0jaWZkZWYgQ0hFQ0sKLQlDaGVja0hvc3RQKCBIb3N0UCApOwotCUNoZWNrSG9zdE1hcFAoIEhvc3RNYXBQICk7Ci0jZW5kaWYKLQotCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJNYXBwaW5nIHN5c3BvcnQgJWQgdG8gaWQgJWRcbiIsIChpbnQpSG9zdE1hcFAtPlN5c1BvcnQsIEhvc3RNYXBQLT5JRCk7CisJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiTWFwcGluZyBzeXNwb3J0ICVkIHRvIGlkICVkXG4iLCAoaW50KSBIb3N0TWFwUC0+U3lzUG9ydCwgSG9zdE1hcFAtPklEKTsKIAogCS8qCi0JKiogV2UgbmVlZCB0byB0ZWxsIHRoZSBVbml4UnVwcyB3aGljaCBzeXNwb3J0IHRoZSBydXAgY29ycmVzcG9uZHMgdG8KLQkqLwotCUhvc3RQLT5Vbml4UnVwc1tIb3N0TWFwUC0+SUQtMV0uQmFzZVN5c1BvcnQgPSBIb3N0TWFwUC0+U3lzUG9ydDsKKwkgKiogV2UgbmVlZCB0byB0ZWxsIHRoZSBVbml4UnVwcyB3aGljaCBzeXNwb3J0IHRoZSBydXAgY29ycmVzcG9uZHMgdG8KKwkgKi8KKwlIb3N0UC0+VW5peFJ1cHNbSG9zdE1hcFAtPklEIC0gMV0uQmFzZVN5c1BvcnQgPSBIb3N0TWFwUC0+U3lzUG9ydDsKIAotCWlmICggSG9zdE1hcFAtPlN5c1BvcnQgPT0gTk9fUE9SVCApCi0JCXJldHVybigwKTsKKwlpZiAoSG9zdE1hcFAtPlN5c1BvcnQgPT0gTk9fUE9SVCkKKwkJcmV0dXJuICgwKTsKIAogCVJ0YVR5cGUgPSBHZXRVbml0VHlwZShIb3N0TWFwUC0+UnRhVW5pcXVlTnVtKTsKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiTWFwcGluZyBzeXNwb3J0ICVkLSVkXG4iLAotCQkJCShpbnQpSG9zdE1hcFAtPlN5c1BvcnQsIChpbnQpSG9zdE1hcFAtPlN5c1BvcnQrUE9SVFNfUEVSX1JUQS0xKTsKKwlyaW9fZHByaW50ayhSSU9fREVCVUdfVEFCTEUsICJNYXBwaW5nIHN5c3BvcnQgJWQtJWRcbiIsIChpbnQpIEhvc3RNYXBQLT5TeXNQb3J0LCAoaW50KSBIb3N0TWFwUC0+U3lzUG9ydCArIFBPUlRTX1BFUl9SVEEgLSAxKTsKIAogCS8qCi0JKiogbm93IG1hcCBlYWNoIG9mIGl0cyBlaWdodCBwb3J0cwotCSovCi0JZm9yICggU3ViRW50PTA7IFN1YkVudDxQT1JUU19QRVJfUlRBOyBTdWJFbnQrKykgewotCSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgInN1YmVudCA9ICVkLCBIb3N0TWFwUC0+U3lzUG9ydCA9ICVkXG4iLCAKLQkJICBTdWJFbnQsIChpbnQpSG9zdE1hcFAtPlN5c1BvcnQpOwotCQlTeXNQb3J0ID0gSG9zdE1hcFAtPlN5c1BvcnQrU3ViRW50OwkJLyogcG9ydG51bWJlciB3aXRoaW4gc3lzdGVtICovCi0JCQkJCS8qIHBvcnRudW1iZXIgb24gaG9zdCAqLwotCQkKLQkJSG9zdFBvcnQgPSAoSG9zdE1hcFAtPklELTEpKlBPUlRTX1BFUl9SVEErU3ViRW50OyAKKwkgKiogbm93IG1hcCBlYWNoIG9mIGl0cyBlaWdodCBwb3J0cworCSAqLworCWZvciAoU3ViRW50ID0gMDsgU3ViRW50IDwgUE9SVFNfUEVSX1JUQTsgU3ViRW50KyspIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAic3ViZW50ID0gJWQsIEhvc3RNYXBQLT5TeXNQb3J0ID0gJWRcbiIsIFN1YkVudCwgKGludCkgSG9zdE1hcFAtPlN5c1BvcnQpOworCQlTeXNQb3J0ID0gSG9zdE1hcFAtPlN5c1BvcnQgKyBTdWJFbnQ7CS8qIHBvcnRudW1iZXIgd2l0aGluIHN5c3RlbSAqLworCQkvKiBwb3J0bnVtYmVyIG9uIGhvc3QgKi8KIAotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiYzEgcCA9ICVwLCBwLT5yaW9Qb3J0cCA9ICVwXG4iLCBwLCBwLT5SSU9Qb3J0cCk7CisJCUhvc3RQb3J0ID0gKEhvc3RNYXBQLT5JRCAtIDEpICogUE9SVFNfUEVSX1JUQSArIFN1YkVudDsKKworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVEFCTEUsICJjMSBwID0gJXAsIHAtPnJpb1BvcnRwID0gJXBcbiIsIHAsIHAtPlJJT1BvcnRwKTsKIAkJUG9ydFAgPSBwLT5SSU9Qb3J0cFtTeXNQb3J0XTsKLSNpZiAwCi0JCVBvcnRQLT5UdHlQCT0gJnAtPmNoYW5uZWxbU3lzUG9ydF07Ci0jZW5kaWYKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIk1hcCBwb3J0XG4iKTsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiTWFwIHBvcnRcbiIpOwogCiAJCS8qCi0JCSoqIFBvaW50IGF0IGFsbCB0aGUgcmVhbCBuZWF0IGRhdGEgc3RydWN0dXJlcwotCQkqLworCQkgKiogUG9pbnQgYXQgYWxsIHRoZSByZWFsIG5lYXQgZGF0YSBzdHJ1Y3R1cmVzCisJCSAqLwogCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CiAJCVBvcnRQLT5Ib3N0UCA9IEhvc3RQOwogCQlQb3J0UC0+Q2FkZHIgPSBIb3N0UC0+Q2FkZHI7CiAKIAkJLyoKLQkJKiogVGhlIFBoYlAgY2Fubm90IGJlIGZpbGxlZCBpbiB5ZXQKLQkJKiogdW5sZXNzIHRoZSBob3N0IGhhcyBiZWVuIGJvb3RlZAotCQkqLworCQkgKiogVGhlIFBoYlAgY2Fubm90IGJlIGZpbGxlZCBpbiB5ZXQKKwkJICoqIHVubGVzcyB0aGUgaG9zdCBoYXMgYmVlbiBib290ZWQKKwkJICovCiAJCWlmICgoSG9zdFAtPkZsYWdzICYgUlVOX1NUQVRFKSA9PSBSQ19SVU5OSU5HKSB7CiAJCQlzdHJ1Y3QgUEhCICpQaGJQID0gUG9ydFAtPlBoYlAgPSAmSG9zdFAtPlBoYlBbSG9zdFBvcnRdOwotCQkJUG9ydFAtPlR4QWRkID0oV09SRCAqKVJJT19QVFIoSG9zdFAtPkNhZGRyLFJXT1JEKFBoYlAtPnR4X2FkZCkpOwotCQkJUG9ydFAtPlR4U3RhcnQgPShXT1JEICopUklPX1BUUihIb3N0UC0+Q2FkZHIsUldPUkQoUGhiUC0+dHhfc3RhcnQpKTsKLQkJCVBvcnRQLT5UeEVuZCA9KFdPUkQgKilSSU9fUFRSKEhvc3RQLT5DYWRkcixSV09SRChQaGJQLT50eF9lbmQpKTsKLQkJCVBvcnRQLT5SeFJlbW92ZT0oV09SRCAqKVJJT19QVFIoSG9zdFAtPkNhZGRyLAotCQkJCQkJCQkJUldPUkQoUGhiUC0+cnhfcmVtb3ZlKSk7Ci0JCQlQb3J0UC0+UnhTdGFydCA9KFdPUkQgKilSSU9fUFRSKEhvc3RQLT5DYWRkcixSV09SRChQaGJQLT5yeF9zdGFydCkpOwotCQkJUG9ydFAtPlJ4RW5kID0oV09SRCAqKVJJT19QVFIoSG9zdFAtPkNhZGRyLFJXT1JEKFBoYlAtPnJ4X2VuZCkpOwotCQl9Ci0JCWVsc2UKKwkJCVBvcnRQLT5UeEFkZCA9IChXT1JEICopIFJJT19QVFIoSG9zdFAtPkNhZGRyLCBSV09SRChQaGJQLT50eF9hZGQpKTsKKwkJCVBvcnRQLT5UeFN0YXJ0ID0gKFdPUkQgKikgUklPX1BUUihIb3N0UC0+Q2FkZHIsIFJXT1JEKFBoYlAtPnR4X3N0YXJ0KSk7CisJCQlQb3J0UC0+VHhFbmQgPSAoV09SRCAqKSBSSU9fUFRSKEhvc3RQLT5DYWRkciwgUldPUkQoUGhiUC0+dHhfZW5kKSk7CisJCQlQb3J0UC0+UnhSZW1vdmUgPSAoV09SRCAqKSBSSU9fUFRSKEhvc3RQLT5DYWRkciwgUldPUkQoUGhiUC0+cnhfcmVtb3ZlKSk7CisJCQlQb3J0UC0+UnhTdGFydCA9IChXT1JEICopIFJJT19QVFIoSG9zdFAtPkNhZGRyLCBSV09SRChQaGJQLT5yeF9zdGFydCkpOworCQkJUG9ydFAtPlJ4RW5kID0gKFdPUkQgKikgUklPX1BUUihIb3N0UC0+Q2FkZHIsIFJXT1JEKFBoYlAtPnJ4X2VuZCkpOworCQl9IGVsc2UKIAkJCVBvcnRQLT5QaGJQID0gTlVMTDsKIAogCQkvKgotCQkqKiBwb3J0IHJlbGF0ZWQgZmxhZ3MKLQkJKi8KLQkJUG9ydFAtPkhvc3RQb3J0CT0gSG9zdFBvcnQ7CisJCSAqKiBwb3J0IHJlbGF0ZWQgZmxhZ3MKKwkJICovCisJCVBvcnRQLT5Ib3N0UG9ydCA9IEhvc3RQb3J0OwogCQkvKgotCQkqKiBGb3IgZWFjaCBwYXJ0IG9mIGEgMTYgcG9ydCBSVEEsIFJ1cE51bSBpcyBJRCAtIDEuCi0JCSovCisJCSAqKiBGb3IgZWFjaCBwYXJ0IG9mIGEgMTYgcG9ydCBSVEEsIFJ1cE51bSBpcyBJRCAtIDEuCisJCSAqLwogCQlQb3J0UC0+UnVwTnVtID0gSG9zdE1hcFAtPklEIC0gMTsKIAkJaWYgKEhvc3RNYXBQLT5GbGFncyAmIFJUQTE2X1NFQ09ORF9TTE9UKSB7Ci0JCQlQb3J0UC0+SUQyCQkJID0gSG9zdE1hcFAtPklEMiAtIDE7Ci0JCQlQb3J0UC0+U2Vjb25kQmxvY2sJID0gVFJVRTsKLQkJfQotCQllbHNlIHsKLQkJCVBvcnRQLT5JRDIJCQkgPSAwOwotCQkJUG9ydFAtPlNlY29uZEJsb2NrCSA9IEZBTFNFOwotCQl9Ci0JCVBvcnRQLT5SdGFVbmlxdWVOdW0JPSBIb3N0TWFwUC0+UnRhVW5pcXVlTnVtOwotCi0JCS8qCi0JCSoqIElmIHRoZSBwb3J0IHdhcyBhbHJlYWR5IG1hcHBlZCB0aGVuIHRoYXRzIGFsbCB3ZSBuZWVkIHRvIGRvLgotCQkqLwotCQlpZiAoUG9ydFAtPk1hcHBlZCkgewotCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwotCQkJY29udGludWU7Ci0JCX0KLQkJZWxzZSBIb3N0TWFwUC0+RmxhZ3MgJj0gflJUQV9ORVdCT09UOwotCi0JCVBvcnRQLT5TdGF0ZQkJID0gMDsKLQkJUG9ydFAtPkNvbmZpZwkJPSAwOwotCQkvKgotCQkqKiBDaGVjayBvdXQgdGhlIG1vZHVsZSB0eXBlIC0gaWYgaXQgaXMgc3BlY2lhbCAocmVhZCBvbmx5IGV0Yy4pCi0JCSoqIHRoZW4gd2UgbmVlZCB0byBzZXQgZmxhZ3MgaW4gdGhlIFBvcnRQLT5Db25maWcuCi0JCSoqIE5vdGU6IEZvciAxNiBwb3J0IFJUQSwgYWxsIHBvcnRzIGFyZSBvZiB0aGUgc2FtZSB0eXBlLgotCQkqLwotCQlpZiAoUnRhVHlwZSA9PSBUWVBFX1JUQTE2KSB7Ci0JCQlQb3J0UC0+Q29uZmlnIHw9IHAtPlJJT01vZHVsZVR5cGVzW0hvc3RQLT5Vbml4UnVwcwotCQkJCVtIb3N0TWFwUC0+SUQtMV0uTW9kVHlwZXNdLkZsYWdzW1N1YkVudCAlIFBPUlRTX1BFUl9NT0RVTEVdOworCQkJUG9ydFAtPklEMiA9IEhvc3RNYXBQLT5JRDIgLSAxOworCQkJUG9ydFAtPlNlY29uZEJsb2NrID0gVFJVRTsKIAkJfSBlbHNlIHsKLQkJCWlmICggU3ViRW50IDwgUE9SVFNfUEVSX01PRFVMRSApCi0JCQkJUG9ydFAtPkNvbmZpZyB8PSBwLT5SSU9Nb2R1bGVUeXBlc1tMT05ZQkxFKEhvc3RQLT5Vbml4UnVwcwotCQkJCVtIb3N0TWFwUC0+SUQtMV0uTW9kVHlwZXMpXS5GbGFnc1tTdWJFbnQgJSBQT1JUU19QRVJfTU9EVUxFXTsKKwkJCVBvcnRQLT5JRDIgPSAwOworCQkJUG9ydFAtPlNlY29uZEJsb2NrID0gRkFMU0U7CisJCX0KKwkJUG9ydFAtPlJ0YVVuaXF1ZU51bSA9IEhvc3RNYXBQLT5SdGFVbmlxdWVOdW07CisKKwkJLyoKKwkJICoqIElmIHRoZSBwb3J0IHdhcyBhbHJlYWR5IG1hcHBlZCB0aGVuIHRoYXRzIGFsbCB3ZSBuZWVkIHRvIGRvLgorCQkgKi8KKwkJaWYgKFBvcnRQLT5NYXBwZWQpIHsKKwkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJY29udGludWU7CisJCX0gZWxzZQorCQkJSG9zdE1hcFAtPkZsYWdzICY9IH5SVEFfTkVXQk9PVDsKKworCQlQb3J0UC0+U3RhdGUgPSAwOworCQlQb3J0UC0+Q29uZmlnID0gMDsKKwkJLyoKKwkJICoqIENoZWNrIG91dCB0aGUgbW9kdWxlIHR5cGUgLSBpZiBpdCBpcyBzcGVjaWFsIChyZWFkIG9ubHkgZXRjLikKKwkJICoqIHRoZW4gd2UgbmVlZCB0byBzZXQgZmxhZ3MgaW4gdGhlIFBvcnRQLT5Db25maWcuCisJCSAqKiBOb3RlOiBGb3IgMTYgcG9ydCBSVEEsIGFsbCBwb3J0cyBhcmUgb2YgdGhlIHNhbWUgdHlwZS4KKwkJICovCisJCWlmIChSdGFUeXBlID09IFRZUEVfUlRBMTYpIHsKKwkJCVBvcnRQLT5Db25maWcgfD0gcC0+UklPTW9kdWxlVHlwZXNbSG9zdFAtPlVuaXhSdXBzW0hvc3RNYXBQLT5JRCAtIDFdLk1vZFR5cGVzXS5GbGFnc1tTdWJFbnQgJSBQT1JUU19QRVJfTU9EVUxFXTsKKwkJfSBlbHNlIHsKKwkJCWlmIChTdWJFbnQgPCBQT1JUU19QRVJfTU9EVUxFKQorCQkJCVBvcnRQLT5Db25maWcgfD0gcC0+UklPTW9kdWxlVHlwZXNbTE9OWUJMRShIb3N0UC0+VW5peFJ1cHNbSG9zdE1hcFAtPklEIC0gMV0uTW9kVHlwZXMpXS5GbGFnc1tTdWJFbnQgJSBQT1JUU19QRVJfTU9EVUxFXTsKIAkJCWVsc2UKLQkJCQlQb3J0UC0+Q29uZmlnIHw9IHAtPlJJT01vZHVsZVR5cGVzW0hJTllCTEUoSG9zdFAtPlVuaXhSdXBzCi0JCQkJW0hvc3RNYXBQLT5JRC0xXS5Nb2RUeXBlcyldLkZsYWdzW1N1YkVudCAlIFBPUlRTX1BFUl9NT0RVTEVdOworCQkJCVBvcnRQLT5Db25maWcgfD0gcC0+UklPTW9kdWxlVHlwZXNbSElOWUJMRShIb3N0UC0+VW5peFJ1cHNbSG9zdE1hcFAtPklEIC0gMV0uTW9kVHlwZXMpXS5GbGFnc1tTdWJFbnQgJSBQT1JUU19QRVJfTU9EVUxFXTsKIAkJfQogCiAJCS8qCi0JCSoqIG1vcmUgcG9ydCByZWxhdGVkIGZsYWdzCi0JCSovCi0JCVBvcnRQLT5Qb3J0U3RhdGUJPSAwOwotCQlQb3J0UC0+TW9kZW1MaW5lcwk9IDA7Ci0JCVBvcnRQLT5Nb2RlbVN0YXRlCT0gMDsKLQkJUG9ydFAtPkNvb2tNb2RlCQk9IENPT0tfV0VMTDsKLQkJUG9ydFAtPlBhcmFtU2VtCQk9IDA7Ci0JCVBvcnRQLT5GbHVzaENtZEJvZGdlPSAwOwotCQlQb3J0UC0+V2ZsdXNoRmxhZwk9IDA7Ci0JCVBvcnRQLT5NYWdpY0ZsYWdzCT0gMDsKLQkJUG9ydFAtPkxvY2sJCQk9IDA7Ci0JCVBvcnRQLT5TdG9yZQkJPSAwOwotCQlQb3J0UC0+Rmlyc3RPcGVuCT0gMTsKKwkJICoqIG1vcmUgcG9ydCByZWxhdGVkIGZsYWdzCisJCSAqLworCQlQb3J0UC0+UG9ydFN0YXRlID0gMDsKKwkJUG9ydFAtPk1vZGVtTGluZXMgPSAwOworCQlQb3J0UC0+TW9kZW1TdGF0ZSA9IDA7CisJCVBvcnRQLT5Db29rTW9kZSA9IENPT0tfV0VMTDsKKwkJUG9ydFAtPlBhcmFtU2VtID0gMDsKKwkJUG9ydFAtPkZsdXNoQ21kQm9kZ2UgPSAwOworCQlQb3J0UC0+V2ZsdXNoRmxhZyA9IDA7CisJCVBvcnRQLT5NYWdpY0ZsYWdzID0gMDsKKwkJUG9ydFAtPkxvY2sgPSAwOworCQlQb3J0UC0+U3RvcmUgPSAwOworCQlQb3J0UC0+Rmlyc3RPcGVuID0gMTsKIAogCQkvKgotCQkqKiBCdWZmZXJzICduIHRoaW5ncwotCQkqLwotCQlQb3J0UC0+UnhEYXRhU3RhcnQJPSAwOwotCQlQb3J0UC0+Q29yMkNvcHkJID0gMDsKLQkJUG9ydFAtPk5hbWUJCSA9ICZIb3N0TWFwUC0+TmFtZVswXTsKKwkJICoqIEJ1ZmZlcnMgJ24gdGhpbmdzCisJCSAqLworCQlQb3J0UC0+UnhEYXRhU3RhcnQgPSAwOworCQlQb3J0UC0+Q29yMkNvcHkgPSAwOworCQlQb3J0UC0+TmFtZSA9ICZIb3N0TWFwUC0+TmFtZVswXTsKICNpZmRlZiBTVEFUUwotCQliemVybyggKGNhZGRyX3QpJlBvcnRQLT5TdGF0LCBzaXplb2Yoc3RydWN0IFJJT1N0YXRzKSApOworCQliemVybygoY2FkZHJfdCkgJiBQb3J0UC0+U3RhdCwgc2l6ZW9mKHN0cnVjdCBSSU9TdGF0cykpOwogI2VuZGlmCiAJCVBvcnRQLT5zdGF0c0dhdGhlciA9IDA7CiAJCVBvcnRQLT50eGNoYXJzID0gMDsKQEAgLTk1NSw5MCArODc1LDg3IEBACiAJCVBvcnRQLT5vcGVucyA9IDA7CiAJCVBvcnRQLT5jbG9zZXMgPSAwOwogCQlQb3J0UC0+aW9jdGxzID0gMDsKLQkJaWYgKCBQb3J0UC0+VHhSaW5nQnVmZmVyICkKLQkJCWJ6ZXJvKCBQb3J0UC0+VHhSaW5nQnVmZmVyLCBwLT5SSU9CdWZmZXJTaXplICk7Ci0JCWVsc2UgaWYgKCBwLT5SSU9CdWZmZXJTaXplICkgeworCQlpZiAoUG9ydFAtPlR4UmluZ0J1ZmZlcikKKwkJCWJ6ZXJvKFBvcnRQLT5UeFJpbmdCdWZmZXIsIHAtPlJJT0J1ZmZlclNpemUpOworCQllbHNlIGlmIChwLT5SSU9CdWZmZXJTaXplKSB7CiAJCQlQb3J0UC0+VHhSaW5nQnVmZmVyID0gc3lzYnJrKHAtPlJJT0J1ZmZlclNpemUpOwotCQkJYnplcm8oIFBvcnRQLT5UeFJpbmdCdWZmZXIsIHAtPlJJT0J1ZmZlclNpemUgKTsKKwkJCWJ6ZXJvKFBvcnRQLT5UeFJpbmdCdWZmZXIsIHAtPlJJT0J1ZmZlclNpemUpOwogCQl9Ci0JCVBvcnRQLT5UeEJ1ZmZlck91dAk9IDA7Ci0JCVBvcnRQLT5UeEJ1ZmZlckluCSA9IDA7Ci0JCVBvcnRQLT5EZWJ1ZwkJPSAwOworCQlQb3J0UC0+VHhCdWZmZXJPdXQgPSAwOworCQlQb3J0UC0+VHhCdWZmZXJJbiA9IDA7CisJCVBvcnRQLT5EZWJ1ZyA9IDA7CiAJCS8qCi0JCSoqIExhc3RSeFRnbCBzdG9yZXMgdGhlIHN0YXRlIG9mIHRoZSByeCB0b2dnbGUgYml0IGZvciB0aGlzCi0JCSoqIHBvcnQsIHRvIGJlIGNvbXBhcmVkIHdpdGggdGhlIHN0YXRlIG9mIHRoZSBuZXh0IHBrdCByZWNlaXZlZC4KLQkJKiogSWYgdGhlIHNhbWUsIHdlIGhhdmUgcmVjZWl2ZWQgdGhlIHNhbWUgcnggcGt0IGZyb20gdGhlIFJUQQotCQkqKiB0d2ljZS4gSW5pdGlhbGlzZSB0byBhIHZhbHVlIG5vdCBlcXVhbCB0byBQSEJfUlhfVEdMIG9yIDAuCi0JCSovCi0JCVBvcnRQLT5MYXN0UnhUZ2wJPSB+KHVjaGFyKVBIQl9SWF9UR0w7CisJCSAqKiBMYXN0UnhUZ2wgc3RvcmVzIHRoZSBzdGF0ZSBvZiB0aGUgcnggdG9nZ2xlIGJpdCBmb3IgdGhpcworCQkgKiogcG9ydCwgdG8gYmUgY29tcGFyZWQgd2l0aCB0aGUgc3RhdGUgb2YgdGhlIG5leHQgcGt0IHJlY2VpdmVkLgorCQkgKiogSWYgdGhlIHNhbWUsIHdlIGhhdmUgcmVjZWl2ZWQgdGhlIHNhbWUgcnggcGt0IGZyb20gdGhlIFJUQQorCQkgKiogdHdpY2UuIEluaXRpYWxpc2UgdG8gYSB2YWx1ZSBub3QgZXF1YWwgdG8gUEhCX1JYX1RHTCBvciAwLgorCQkgKi8KKwkJUG9ydFAtPkxhc3RSeFRnbCA9IH4odWNoYXIpIFBIQl9SWF9UR0w7CiAKIAkJLyoKLQkJKiogYW5kIG1hcmsgdGhlIHBvcnQgYXMgdXNhYmxlCi0JCSovCisJCSAqKiBhbmQgbWFyayB0aGUgcG9ydCBhcyB1c2FibGUKKwkJICovCiAJCVBvcnRQLT5NYXBwZWQgPSAxOwogCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKIAl9Ci0JaWYgKCBIb3N0TWFwUC0+U3lzUG9ydCA8IHAtPlJJT0ZpcnN0UG9ydHNNYXBwZWQgKQorCWlmIChIb3N0TWFwUC0+U3lzUG9ydCA8IHAtPlJJT0ZpcnN0UG9ydHNNYXBwZWQpCiAJCXAtPlJJT0ZpcnN0UG9ydHNNYXBwZWQgPSBIb3N0TWFwUC0+U3lzUG9ydDsKLQlpZiAoIEhvc3RNYXBQLT5TeXNQb3J0ID4gcC0+UklPTGFzdFBvcnRzTWFwcGVkICkKKwlpZiAoSG9zdE1hcFAtPlN5c1BvcnQgPiBwLT5SSU9MYXN0UG9ydHNNYXBwZWQpCiAJCXAtPlJJT0xhc3RQb3J0c01hcHBlZCA9IEhvc3RNYXBQLT5TeXNQb3J0OwogCiAJcmV0dXJuIDA7CiB9CiAKLWludAotUklPQ2hhbmdlTmFtZShwLCBNYXBQKQoraW50IFJJT0NoYW5nZU5hbWUocCwgTWFwUCkKIHN0cnVjdCByaW9faW5mbyAqcDsKLXN0cnVjdCBNYXAqIE1hcFA7IAorc3RydWN0IE1hcCAqTWFwUDsKIHsKIAlpbnQgaG9zdDsKIAlzdHJ1Y3QgTWFwICpIb3N0TWFwUDsKIAljaGFyICpzcHRyOwogCi0JcmlvX2RwcmludGsgKFJJT19ERUJVR19UQUJMRSwgIkNoYW5nZSBuYW1lIGVudHJ5IG9uIGhvc3QgJXgsIHJ0YSAleCwgSUQgJWQsIFN5c3BvcnQgJWRcbiIsCi0JCQkJCQkJCU1hcFAtPkhvc3RVbmlxdWVOdW0sTWFwUC0+UnRhVW5pcXVlTnVtLAotCQkJCQkJCQlNYXBQLT5JRCwgKGludClNYXBQLT5TeXNQb3J0KTsKKwlyaW9fZHByaW50ayhSSU9fREVCVUdfVEFCTEUsICJDaGFuZ2UgbmFtZSBlbnRyeSBvbiBob3N0ICV4LCBydGEgJXgsIElEICVkLCBTeXNwb3J0ICVkXG4iLCBNYXBQLT5Ib3N0VW5pcXVlTnVtLCBNYXBQLT5SdGFVbmlxdWVOdW0sIE1hcFAtPklELCAoaW50KSBNYXBQLT5TeXNQb3J0KTsKIAotCWlmICggTWFwUC0+SUQgPiBNQVhfUlVQICkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiQmFkIElEIGluIG1hcCBlbnRyeSFcbiIpOworCWlmIChNYXBQLT5JRCA+IE1BWF9SVVApIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiQmFkIElEIGluIG1hcCBlbnRyeSFcbiIpOwogCQlwLT5SSU9FcnJvci5FcnJvciA9IElEX05VTUJFUl9PVVRfT0ZfUkFOR0U7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCU1hcFAtPk5hbWVbTUFYX05BTUVfTEVOLTFdID0gJ1wwJzsKKwlNYXBQLT5OYW1lW01BWF9OQU1FX0xFTiAtIDFdID0gJ1wwJzsKIAlzcHRyID0gTWFwUC0+TmFtZTsKIAotCXdoaWxlICggKnNwdHIgKSB7Ci0JCWlmICggKnNwdHI8JyAnIHx8ICpzcHRyPid+JyApIHsKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVEFCTEUsICJOYW1lIGVudHJ5IGNvbnRhaW5zIG5vbi1wcmludGluZyBjaGFyYWN0ZXJzIVxuIik7CisJd2hpbGUgKCpzcHRyKSB7CisJCWlmICgqc3B0ciA8ICcgJyB8fCAqc3B0ciA+ICd+JykgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RBQkxFLCAiTmFtZSBlbnRyeSBjb250YWlucyBub24tcHJpbnRpbmcgY2hhcmFjdGVycyFcbiIpOwogCQkJcC0+UklPRXJyb3IuRXJyb3IgPSBCQURfQ0hBUkFDVEVSX0lOX05BTUU7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlzcHRyKys7CiAJfQogCi0JZm9yICggaG9zdD0wOyBob3N0IDwgcC0+UklPTnVtSG9zdHM7IGhvc3QrKyApIHsKLQkJaWYgKCBNYXBQLT5Ib3N0VW5pcXVlTnVtID09IHAtPlJJT0hvc3RzW2hvc3RdLlVuaXF1ZU51bSApIHsKLQkJCWlmICggKHAtPlJJT0hvc3RzW2hvc3RdLkZsYWdzICYgUlVOX1NUQVRFKSAhPSBSQ19SVU5OSU5HICkgeworCWZvciAoaG9zdCA9IDA7IGhvc3QgPCBwLT5SSU9OdW1Ib3N0czsgaG9zdCsrKSB7CisJCWlmIChNYXBQLT5Ib3N0VW5pcXVlTnVtID09IHAtPlJJT0hvc3RzW2hvc3RdLlVuaXF1ZU51bSkgeworCQkJaWYgKChwLT5SSU9Ib3N0c1tob3N0XS5GbGFncyAmIFJVTl9TVEFURSkgIT0gUkNfUlVOTklORykgewogCQkJCXAtPlJJT0Vycm9yLkVycm9yID0gSE9TVF9OT1RfUlVOTklORzsKIAkJCQlyZXR1cm4gLUVOWElPOwogCQkJfQotCQkJaWYgKCBNYXBQLT5JRD09MCApIHsKLQkJCQlDQ09QWSggTWFwUC0+TmFtZSwgcC0+UklPSG9zdHNbaG9zdF0uTmFtZSwgTUFYX05BTUVfTEVOICk7CisJCQlpZiAoTWFwUC0+SUQgPT0gMCkgeworCQkJCUNDT1BZKE1hcFAtPk5hbWUsIHAtPlJJT0hvc3RzW2hvc3RdLk5hbWUsIE1BWF9OQU1FX0xFTik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAKLQkJCUhvc3RNYXBQID0gJnAtPlJJT0hvc3RzW2hvc3RdLk1hcHBpbmdbTWFwUC0+SUQtMV07CisJCQlIb3N0TWFwUCA9ICZwLT5SSU9Ib3N0c1tob3N0XS5NYXBwaW5nW01hcFAtPklEIC0gMV07CiAKLQkJCWlmICggSG9zdE1hcFAtPlJ0YVVuaXF1ZU51bSAhPSBNYXBQLT5SdGFVbmlxdWVOdW0gKSB7CisJCQlpZiAoSG9zdE1hcFAtPlJ0YVVuaXF1ZU51bSAhPSBNYXBQLT5SdGFVbmlxdWVOdW0pIHsKIAkJCQlwLT5SSU9FcnJvci5FcnJvciA9IFJUQV9OVU1CRVJfV1JPTkc7CiAJCQkJcmV0dXJuIC1FTlhJTzsKIAkJCX0KLQkJCUNDT1BZKCBNYXBQLT5OYW1lLCBIb3N0TWFwUC0+TmFtZSwgTUFYX05BTUVfTEVOICk7CisJCQlDQ09QWShNYXBQLT5OYW1lLCBIb3N0TWFwUC0+TmFtZSwgTUFYX05BTUVfTEVOKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQogCXAtPlJJT0Vycm9yLkVycm9yID0gVU5LTk9XTl9IT1NUX05VTUJFUjsKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RBQkxFLCAiVW5rbm93biBob3N0ICV4XG4iLCBNYXBQLT5Ib3N0VW5pcXVlTnVtKTsKKwlyaW9fZHByaW50ayhSSU9fREVCVUdfVEFCTEUsICJVbmtub3duIGhvc3QgJXhcbiIsIE1hcFAtPkhvc3RVbmlxdWVOdW0pOwogCXJldHVybiAtRU5YSU87CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb3RpbWUuaCBiL2RyaXZlcnMvY2hhci9yaW8vcmlvdGltZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmQ1MmJjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9yaW8vcmlvdGltZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCi0gKioqKioqKiAgICAgICAgICAgIFQgSSBNIEUKLSAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gQXV0aG9yICA6IEplcmVteSBSb2xscwotIERhdGUgICAgOgotCi0gKgotICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgotICoKLQotICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gVmVyc2lvbiA6IDAuMDEKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcwotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX3Jpb3RpbWVfaAotI2RlZmluZSBfcmlvdGltZV9oIDEKLQotI2lmbmRlZiBsaW50Ci0jaWZkZWYgU0NDUwotc3RhdGljIGNoYXIgKl9yaW9fcmlvdGltZV9oX3NjY3MgPSAiQCgjKXJpb3RpbWUuaAkxLjEiIDsKLSNlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgVFdPX1BPV0VSX0ZJRlRFRU4gKHVzaG9ydCkzMjc2OAotI2RlZmluZSBSaW9UaW1lKCkgICAgcmlvdGltZQotI2RlZmluZSBSaW9UaW1lQWZ0ZXIodGltZTEsdGltZTIpICgodXNob3J0KXRpbWUxIC0gKHVzaG9ydCl0aW1lMikgPCBUV09fUE9XRVJfRklGVEVFTgotI2RlZmluZSBSaW9UaW1lUGx1cyh0aW1lMSx0aW1lMikgKCh1c2hvcnQpdGltZTEgKyAodXNob3J0KXRpbWUyKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbnZlcnQgYSBSSU8gdGljayAoMS8xMHRoIHNlY29uZCkKLSAqIGludG8gdHJhbnNwdXRlciBsb3cgcHJpb3JpdHkgdGlja3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLSNkZWZpbmUgUmlvVGltZVRvTG93KHRpbWUpICh0aW1lKigxMDAwMDAgLyA2NCkpCi0jZGVmaW5lIFJpb0xvd1RvVGltZSh0aW1lKSAoKHRpbWUqNjQpLzEwMDAwMCkKLQotI2RlZmluZSBSSU9URU5USFNFQ09ORCAodXNob3J0KTEKLSNkZWZpbmUgUklPU0VDT05EICh1c2hvcnQpKFJJT1RFTlRIU0VDT05EICogMTApCi0jZW5kaWYKLQotLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW90dHkuYyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvdHR5LmMKaW5kZXggNzhhMzIxYS4uNjM3OTgxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9yaW90dHkuYworKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3R0eS5jCkBAIC04OSwyMiArODksMTMgQEAKICNpbmNsdWRlICJsaXN0LmgiCiAjaW5jbHVkZSAic2FtLmgiCiAKLSNpZiAwCi1zdGF0aWMgdm9pZCB0dHlzZXRoX3B2KHN0cnVjdCBQb3J0ICosIHN0cnVjdCB0dHlzdGF0aWNzICosIAotCQkJCXN0cnVjdCB0ZXJtaW9zICpzZywgaW50KTsKLSNlbmRpZgotCiBzdGF0aWMgdm9pZCBSSU9DbGVhclVwKHN0cnVjdCBQb3J0ICpQb3J0UCk7Ci1pbnQgUklPU2hvcnRDb21tYW5kKHN0cnVjdCByaW9faW5mbyAqcCwgc3RydWN0IFBvcnQgKlBvcnRQLCAKLQkJCSAgIGludCBjb21tYW5kLCBpbnQgbGVuLCBpbnQgYXJnKTsKK2ludCBSSU9TaG9ydENvbW1hbmQoc3RydWN0IHJpb19pbmZvICpwLCBzdHJ1Y3QgUG9ydCAqUG9ydFAsIGludCBjb21tYW5kLCBpbnQgbGVuLCBpbnQgYXJnKTsKIAotI2lmIDAKLXN0YXRpYyBpbnQgUklPQ29va01vZGUoc3RydWN0IHR0eXN0YXRpY3MgKik7Ci0jZW5kaWYKIAotZXh0ZXJuIGludAljb252X3ZiW107CS8qIG5vdyBkZWZpbmVkIGluIHR0eW1nci5jICovCi1leHRlcm4gaW50CWNvbnZfYnZbXTsJLyogbm93IGRlZmluZWQgaW4gdHR5bWdyLmMgKi8KLSAKK2V4dGVybiBpbnQgY29udl92YltdOwkJLyogbm93IGRlZmluZWQgaW4gdHR5bWdyLmMgKi8KK2V4dGVybiBpbnQgY29udl9idltdOwkJLyogbm93IGRlZmluZWQgaW4gdHR5bWdyLmMgKi8KKwogLyoKICoqIDE2LjA5LjE5OTggQVJHIC0gRml4IHRvIGJ1aWxkIHJpb3R0eS5rLm8gZm9yIE1vZHVsYXIgS2VybmVsIFN1cHBvcnQKICoqCkBAIC0xMTcsMjcgKzEwOCwyNSBAQAogI2VuZGlmCiAKICNpZmRlZiBORUVEX1RISVMyCi1zdGF0aWMgc3RydWN0IG9sZF9zZ3R0eWIgCi1kZWZhdWx0X3NnID0gCi17IAotCUIxOTIwMCwgQjE5MjAwLAkJCQkvKiBpbnB1dCBhbmQgb3V0cHV0IHNwZWVkICovIAotCSdIJyAtICdAJywJCQkJCS8qIGVyYXNlIGNoYXIgKi8gCi0JLTEsCQkJCQkJCS8qIDJuZCBlcmFzZSBjaGFyICovIAotCSdVJyAtICdAJywJCQkJCS8qIGtpbGwgY2hhciAqLyAKLQlFQ0hPIHwgQ1JNT0QsCQkJCS8qIG1vZGUgKi8gCi0JJ0MnIC0gJ0AnLAkJCQkJLyogaW50ZXJydXB0IGNoYXJhY3RlciAqLyAKLQknXFwnIC0gJ0AnLAkJCQkJLyogcXVpdCBjaGFyICovIAotCSdRJyAtICdAJywJCQkJCS8qIHN0YXJ0IGNoYXIgKi8KLQknUycgLSAnQCcsCQkJCQkvKiBzdG9wIGNoYXIgKi8gCi0JJ0QnIC0gJ0AnLAkJCQkJLyogRU9GICovCi0JLTEsCQkJCQkJCS8qIGJyayAqLwotCShMQ1JUQlMgfCBMQ1JURVJBIHwgTENSVEtJTCB8IExDVExFQ0gpLAkvKiBsb2NhbCBtb2RlIHdvcmQgKi8gCi0JJ1onIC0gJ0AnLAkJCQkJLyogcHJvY2VzcyBzdG9wICovCi0JJ1knIC0gJ0AnLAkJCQkJLyogZGVsYXllZCBzdG9wICovCi0JJ1InIC0gJ0AnLAkJCQkJLyogcmVwcmludCBsaW5lICovIAotCSdPJyAtICdAJywJCQkJCS8qIGZsdXNoIG91dHB1dCAqLwotCSdXJyAtICdAJywJCQkJCS8qIHdvcmQgZXJhc2UgKi8KLQknVicgLSAnQCcJCQkJCS8qIGxpdGVyYWwgbmV4dCBjaGFyICovCitzdGF0aWMgc3RydWN0IG9sZF9zZ3R0eWIgZGVmYXVsdF9zZyA9IHsKKwlCMTkyMDAsIEIxOTIwMCwJCS8qIGlucHV0IGFuZCBvdXRwdXQgc3BlZWQgKi8KKwknSCcgLSAnQCcsCQkvKiBlcmFzZSBjaGFyICovCisJLTEsCQkJLyogMm5kIGVyYXNlIGNoYXIgKi8KKwknVScgLSAnQCcsCQkvKiBraWxsIGNoYXIgKi8KKwlFQ0hPIHwgQ1JNT0QsCQkvKiBtb2RlICovCisJJ0MnIC0gJ0AnLAkJLyogaW50ZXJydXB0IGNoYXJhY3RlciAqLworCSdcXCcgLSAnQCcsCQkvKiBxdWl0IGNoYXIgKi8KKwknUScgLSAnQCcsCQkvKiBzdGFydCBjaGFyICovCisJJ1MnIC0gJ0AnLAkJLyogc3RvcCBjaGFyICovCisJJ0QnIC0gJ0AnLAkJLyogRU9GICovCisJLTEsCQkJLyogYnJrICovCisJKExDUlRCUyB8IExDUlRFUkEgfCBMQ1JUS0lMIHwgTENUTEVDSCksCS8qIGxvY2FsIG1vZGUgd29yZCAqLworCSdaJyAtICdAJywJCS8qIHByb2Nlc3Mgc3RvcCAqLworCSdZJyAtICdAJywJCS8qIGRlbGF5ZWQgc3RvcCAqLworCSdSJyAtICdAJywJCS8qIHJlcHJpbnQgbGluZSAqLworCSdPJyAtICdAJywJCS8qIGZsdXNoIG91dHB1dCAqLworCSdXJyAtICdAJywJCS8qIHdvcmQgZXJhc2UgKi8KKwknVicgLSAnQCcJCS8qIGxpdGVyYWwgbmV4dCBjaGFyICovCiB9OwogI2VuZGlmCiAKQEAgLTE0NSw2MiArMTM0LDU5IEBACiBleHRlcm4gc3RydWN0IHJpb19pbmZvICpwOwogCiAKLWludAotcmlvdG9wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK2ludCByaW90b3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlyZWdpc3RlciB1aW50IFN5c1BvcnQ7CiAJaW50IE1vZGVtOwogCWludCByZXBlYXRfdGhpcyA9IDI1MDsKLQlzdHJ1Y3QgUG9ydCAqUG9ydFA7CQkgLyogcG9pbnRlciB0byB0aGUgcG9ydCBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgUG9ydCAqUG9ydFA7CS8qIHBvaW50ZXIgdG8gdGhlIHBvcnQgc3RydWN0dXJlICovCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0dmFsID0gMDsKIAotCWZ1bmNfZW50ZXIgKCk7CisJZnVuY19lbnRlcigpOwogCiAJLyogTWFrZSBzdXJlIGRyaXZlcl9kYXRhIGlzIE5VTEwgaW4gY2FzZSB0aGUgcmlvIGlzbid0IGJvb3RlZCBqZXQuIEVsc2UgZ3NfY2xvc2UKIAkgICBpcyBnb2luZyB0byBvb3BzLgotCSovCisJICovCiAJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7Ci0gICAgICAgIAotCVN5c1BvcnQgPSByaW9fbWlub3IodHR5KTsKLQlNb2RlbSAgID0gcmlvX2lzbW9kZW0odHR5KTsKIAotCWlmICggcC0+UklPRmFpbGVkICkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlN5c3RlbSBpbml0aWFsaXNhdGlvbiBmYWlsZWRcbiIpOworCVN5c1BvcnQgPSByaW9fbWlub3IodHR5KTsKKwlNb2RlbSA9IHJpb19pc21vZGVtKHR0eSk7CisKKwlpZiAocC0+UklPRmFpbGVkKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UVFksICJTeXN0ZW0gaW5pdGlhbGlzYXRpb24gZmFpbGVkXG4iKTsKIAkJcHNldGVycihFTlhJTyk7Ci0JCWZ1bmNfZXhpdCAoKTsKKwkJZnVuY19leGl0KCk7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCi0JcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJwb3J0IG9wZW4gU3lzUG9ydCAlZCAoJXMpIChtYXBwZWQ6JWQpXG4iLAotCSAgICAgICBTeXNQb3J0LCAgTW9kZW0gPyAiTW9kZW0iIDogInR0eSIsCi0JCQkJICAgcC0+UklPUG9ydHBbU3lzUG9ydF0tPk1hcHBlZCk7CisJcmlvX2RwcmludGsoUklPX0RFQlVHX1RUWSwgInBvcnQgb3BlbiBTeXNQb3J0ICVkICglcykgKG1hcHBlZDolZClcbiIsIFN5c1BvcnQsIE1vZGVtID8gIk1vZGVtIiA6ICJ0dHkiLCBwLT5SSU9Qb3J0cFtTeXNQb3J0XS0+TWFwcGVkKTsKIAogCS8qCi0JKiogVmFsaWRhdGUgdGhhdCB3ZSBoYXZlIHJlY2VpdmVkIGEgbGVnaXRpbWF0ZSByZXF1ZXN0LgotCSoqIEN1cnJlbnRseSwganVzdCBjaGVjayB0aGF0IHdlIGFyZSBvcGVuaW5nIGEgcG9ydCBvbgotCSoqIGEgaG9zdCBjYXJkIHRoYXQgYWN0dWFsbHkgZXhpc3RzLCBhbmQgdGhhdCB0aGUgcG9ydAotCSoqIGhhcyBiZWVuIG1hcHBlZCBvbnRvIGEgaG9zdC4KLQkqLworCSAqKiBWYWxpZGF0ZSB0aGF0IHdlIGhhdmUgcmVjZWl2ZWQgYSBsZWdpdGltYXRlIHJlcXVlc3QuCisJICoqIEN1cnJlbnRseSwganVzdCBjaGVjayB0aGF0IHdlIGFyZSBvcGVuaW5nIGEgcG9ydCBvbgorCSAqKiBhIGhvc3QgY2FyZCB0aGF0IGFjdHVhbGx5IGV4aXN0cywgYW5kIHRoYXQgdGhlIHBvcnQKKwkgKiogaGFzIGJlZW4gbWFwcGVkIG9udG8gYSBob3N0LgorCSAqLwogCWlmIChTeXNQb3J0ID49IFJJT19QT1JUUykgewkvKiBvdXQgb2YgcmFuZ2UgPyAqLwotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIklsbGVnYWwgcG9ydCBudW1iZXIgJWRcbiIsU3lzUG9ydCk7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UVFksICJJbGxlZ2FsIHBvcnQgbnVtYmVyICVkXG4iLCBTeXNQb3J0KTsKIAkJcHNldGVycihFTlhJTyk7CiAJCWZ1bmNfZXhpdCgpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KIAogCS8qCi0JKiogR3JhYiBwb2ludGVyIHRvIHRoZSBwb3J0IHN0dWN0dXJlCi0JKi8KKwkgKiogR3JhYiBwb2ludGVyIHRvIHRoZSBwb3J0IHN0dWN0dXJlCisJICovCiAJUG9ydFAgPSBwLT5SSU9Qb3J0cFtTeXNQb3J0XTsJLyogR2V0IGNvbnRyb2wgc3RydWMgKi8KLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlBvcnRQOiAlcFxuIiwgUG9ydFApOwotCWlmICggIVBvcnRQLT5NYXBwZWQgKSB7CS8qIHdlIGFyZW4ndCBtYXBwZWQgeWV0ISAqLworCXJpb19kcHJpbnRrKFJJT19ERUJVR19UVFksICJQb3J0UDogJXBcbiIsIFBvcnRQKTsKKwlpZiAoIVBvcnRQLT5NYXBwZWQpIHsJLyogd2UgYXJlbid0IG1hcHBlZCB5ZXQhICovCiAJCS8qCi0JCSoqIFRoZSBzeXN0ZW0gZG9lc24ndCBrbm93IHdoaWNoIFJUQSB0aGlzIHBvcnQKLQkJKiogY29ycmVzcG9uZHMgdG8uCi0JCSovCi0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAicG9ydCBub3QgbWFwcGVkIGludG8gc3lzdGVtXG4iKTsKLQkJZnVuY19leGl0ICgpOworCQkgKiogVGhlIHN5c3RlbSBkb2Vzbid0IGtub3cgd2hpY2ggUlRBIHRoaXMgcG9ydAorCQkgKiogY29ycmVzcG9uZHMgdG8uCisJCSAqLworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVFRZLCAicG9ydCBub3QgbWFwcGVkIGludG8gc3lzdGVtXG4iKTsKKwkJZnVuY19leGl0KCk7CiAJCXBzZXRlcnIoRU5YSU8pOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTIxMCwxMzIgKzE5Niw5MyBAQAogCVBvcnRQLT5ncy50dHkgPSB0dHk7CiAJUG9ydFAtPmdzLmNvdW50Kys7CiAKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIiVkIGJ5dGVzIGluIHR4IGJ1ZmZlclxuIiwKLQkJCQkgICBQb3J0UC0+Z3MueG1pdF9jbnQpOworCXJpb19kcHJpbnRrKFJJT19ERUJVR19UVFksICIlZCBieXRlcyBpbiB0eCBidWZmZXJcbiIsIFBvcnRQLT5ncy54bWl0X2NudCk7CiAKLQlyZXR2YWwgPSBnc19pbml0X3BvcnQgKCZQb3J0UC0+Z3MpOworCXJldHZhbCA9IGdzX2luaXRfcG9ydCgmUG9ydFAtPmdzKTsKIAlpZiAocmV0dmFsKSB7CiAJCVBvcnRQLT5ncy5jb3VudC0tOwogCQlyZXR1cm4gLUVOWElPOwogCX0KIAkvKgotCSoqIElmIHRoZSBob3N0IGhhc24ndCBiZWVuIGJvb3RlZCB5ZXQsIHRoZW4gCi0JKiogZmFpbAotCSovCi0JaWYgKCAoUG9ydFAtPkhvc3RQLT5GbGFncyAmIFJVTl9TVEFURSkgIT0gUkNfUlVOTklORyApIHsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJIb3N0IG5vdCBydW5uaW5nXG4iKTsKKwkgKiogSWYgdGhlIGhvc3QgaGFzbid0IGJlZW4gYm9vdGVkIHlldCwgdGhlbgorCSAqKiBmYWlsCisJICovCisJaWYgKChQb3J0UC0+SG9zdFAtPkZsYWdzICYgUlVOX1NUQVRFKSAhPSBSQ19SVU5OSU5HKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UVFksICJIb3N0IG5vdCBydW5uaW5nXG4iKTsKIAkJcHNldGVycihFTlhJTyk7Ci0JCWZ1bmNfZXhpdCAoKTsKKwkJZnVuY19leGl0KCk7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCiAJLyoKLQkqKiBJZiB0aGUgUlRBIGhhcyBub3QgYm9vdGVkIHlldCBhbmQgdGhlIHVzZXIgaGFzIGNob29zZW4gdG8gYmxvY2sKLQkqKiB1bnRpbCB0aGUgUlRBIGlzIHByZXNlbnQgdGhlbiB3ZSBtdXN0IHNwaW4gaGVyZSB3YWl0aW5nIGZvcgotCSoqIHRoZSBSVEEgdG8gYm9vdC4KLQkqLwotI2lmIDAKLQlpZiAoIShQb3J0UC0+SG9zdFAtPk1hcHBpbmdbUG9ydFAtPlJ1cE51bV0uRmxhZ3MgJiBSVEFfQk9PVEVEKSkgewotCQlpZiAoUG9ydFAtPldhaXRVbnRpbEJvb3RlZCkgewotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJXYWl0aW5nIGZvciBSVEEgdG8gYm9vdFxuIik7Ci0JCQlkbyB7Ci0JCQkJaWYgKFJJT0RlbGF5KFBvcnRQLCBIVU5EUkVEX01TKSA9PSBSSU9fRkFJTCkgewotCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlJUQSBFSU5UUiBpbiBkZWxheSBcbiIpOwotCQkJCQlmdW5jX2V4aXQgKCk7Ci0JCQkJCXJldHVybiAtRUlOVFI7Ci0JCQkJfQotCQkJCWlmIChyZXBlYXRfdGhpcyAtLSA8PSAwKSB7Ci0JCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiV2FpdGluZyBmb3IgUlRBIHRvIGJvb3QgdGltZW91dFxuIik7Ci0JCQkJCVJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIEZDTE9TRSApOyAKLQkJCQkJcHNldGVycihFSU5UUik7Ci0JCQkJCWZ1bmNfZXhpdCAoKTsKLQkJCQkJcmV0dXJuIC1FSU87Ci0JCQkJfQotCQkJfSB3aGlsZSghKFBvcnRQLT5Ib3N0UC0+TWFwcGluZ1tQb3J0UC0+UnVwTnVtXS5GbGFncyAmIFJUQV9CT09URUQpKTsKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUlRBIGhhcyBiZWVuIGJvb3RlZFxuIik7Ci0JCX0gZWxzZSB7Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlJUQSBuZXZlciBib290ZWRcbiIpOwotCQkJcHNldGVycihFTlhJTyk7Ci0JCQlmdW5jX2V4aXQgKCk7Ci0JCQlyZXR1cm4gMDsKKwkgKiogSWYgdGhlIFJUQSBoYXMgbm90IGJvb3RlZCB5ZXQgYW5kIHRoZSB1c2VyIGhhcyBjaG9vc2VuIHRvIGJsb2NrCisJICoqIHVudGlsIHRoZSBSVEEgaXMgcHJlc2VudCB0aGVuIHdlIG11c3Qgc3BpbiBoZXJlIHdhaXRpbmcgZm9yCisJICoqIHRoZSBSVEEgdG8gYm9vdC4KKwkgKi8KKwkvKiBJIGZpbmQgdGhlIGFib3ZlIGNvZGUgYSBiaXQgaGFpcnkuIEkgZmluZCB0aGUgYmVsb3cgY29kZQorCSAgIGVhc2llciB0byByZWFkIGFuZCBzaG9ydGVyLiBOb3csIGlmIGl0IHdvcmtzIHRvbyB0aGF0IHdvdWxkCisJICAgYmUgZ3JlYXQuLi4gLS0gUkVXIAorCSAqLworCXJpb19kcHJpbnRrKFJJT19ERUJVR19UVFksICJDaGVja2luZyBpZiBSVEEgaGFzIGJvb3RlZC4uLiBcbiIpOworCXdoaWxlICghKFBvcnRQLT5Ib3N0UC0+TWFwcGluZ1tQb3J0UC0+UnVwTnVtXS5GbGFncyAmIFJUQV9CT09URUQpKSB7CisJCWlmICghUG9ydFAtPldhaXRVbnRpbEJvb3RlZCkgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RUWSwgIlJUQSBuZXZlciBib290ZWRcbiIpOworCQkJZnVuY19leGl0KCk7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisKKwkJLyogVW5kZXIgTGludXggeW91J2Qgbm9ybWFsbHkgdXNlIGEgd2FpdCBpbnN0ZWFkIG9mIHRoaXMKKwkJICAgYnVzeS13YWl0aW5nLiBJJ2xsIHN0aWNrIHdpdGggdGhlIG9sZCBpbXBsZW1lbnRhdGlvbiBmb3IKKwkJICAgbm93LiAtLVJFVworCQkgKi8KKwkJaWYgKFJJT0RlbGF5KFBvcnRQLCBIVU5EUkVEX01TKSA9PSBSSU9fRkFJTCkgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RUWSwgIlJUQV93YWl0X2Zvcl9ib290OiBFSU5UUiBpbiBkZWxheSBcbiIpOworCQkJZnVuY19leGl0KCk7CisJCQlyZXR1cm4gLUVJTlRSOworCQl9CisJCWlmIChyZXBlYXRfdGhpcy0tIDw9IDApIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UVFksICJXYWl0aW5nIGZvciBSVEEgdG8gYm9vdCB0aW1lb3V0XG4iKTsKKwkJCWZ1bmNfZXhpdCgpOworCQkJcmV0dXJuIC1FSU87CiAJCX0KIAl9Ci0jZWxzZQotCS8qIEkgZmluZCB0aGUgYWJvdmUgY29kZSBhIGJpdCBoYWlyeS4gSSBmaW5kIHRoZSBiZWxvdyBjb2RlCi0gICAgICAgICAgIGVhc2llciB0byByZWFkIGFuZCBzaG9ydGVyLiBOb3csIGlmIGl0IHdvcmtzIHRvbyB0aGF0IHdvdWxkCi0JICAgYmUgZ3JlYXQuLi4gLS0gUkVXIAotCSovCi0JcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJDaGVja2luZyBpZiBSVEEgaGFzIGJvb3RlZC4uLiBcbiIpOwotCXdoaWxlICghKFBvcnRQLT5Ib3N0UC0+TWFwcGluZ1tQb3J0UC0+UnVwTnVtXS5GbGFncyAmIFJUQV9CT09URUQpKSB7Ci0JICBpZiAoIVBvcnRQLT5XYWl0VW50aWxCb290ZWQpIHsKLQkgICAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJSVEEgbmV2ZXIgYm9vdGVkXG4iKTsKLQkgICAgZnVuY19leGl0ICgpOwotCSAgICByZXR1cm4gLUVOWElPOwotCSAgfQotCi0JICAvKiBVbmRlciBMaW51eCB5b3UnZCBub3JtYWxseSB1c2UgYSB3YWl0IGluc3RlYWQgb2YgdGhpcwotCSAgICAgYnVzeS13YWl0aW5nLiBJJ2xsIHN0aWNrIHdpdGggdGhlIG9sZCBpbXBsZW1lbnRhdGlvbiBmb3IKLQkgICAgIG5vdy4gLS1SRVcgCi0JICAqLwotCSAgaWYgKFJJT0RlbGF5KFBvcnRQLCBIVU5EUkVEX01TKSA9PSBSSU9fRkFJTCkgewotCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlJUQV93YWl0X2Zvcl9ib290OiBFSU5UUiBpbiBkZWxheSBcbiIpOwotCSAgICBmdW5jX2V4aXQgKCk7Ci0JICAgIHJldHVybiAtRUlOVFI7Ci0JICB9Ci0JICBpZiAocmVwZWF0X3RoaXMgLS0gPD0gMCkgewotCSAgICByaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIldhaXRpbmcgZm9yIFJUQSB0byBib290IHRpbWVvdXRcbiIpOwotCSAgICBmdW5jX2V4aXQgKCk7Ci0JICAgIHJldHVybiAtRUlPOwotCSAgfQotCX0KLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlJUQSBoYXMgYmVlbiBib290ZWRcbiIpOwotI2VuZGlmCi0jaWYgMAotCXRwID0gIFBvcnRQLT5UdHlQOwkJLyogZ2V0IHR0eSBzdHJ1Y3QgKi8KLSNlbmRpZgorCXJpb19kcHJpbnRrKFJJT19ERUJVR19UVFksICJSVEEgaGFzIGJlZW4gYm9vdGVkXG4iKTsKIAlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JaWYgKCBwLT5SSU9IYWx0ZWQgKSB7CisJaWYgKHAtPlJJT0hhbHRlZCkgewogCQlnb3RvIGJvbWJvdXQ7CiAJfQotI2lmIDAKLQlyZXR2YWwgPSBnc19pbml0X3BvcnQoJlBvcnRQLT5ncyk7Ci0JaWYgKHJldHZhbCl7Ci0JCWZ1bmNfZXhpdCAoKTsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0jZW5kaWYKIAogCS8qCi0JKiogSWYgdGhlIHBvcnQgaXMgaW4gdGhlIGZpbmFsIHRocm93cyBvZiBiZWluZyBjbG9zZWQsCi0JKiogd2Ugc2hvdWxkIHdhaXQgaGVyZSAocG9saXRlbHkpLCB3YWl0aW5nCi0JKiogZm9yIGl0IHRvIGZpbmlzaCwgc28gdGhhdCBpdCBkb2Vzbid0IGNsb3NlIHVzIQotCSovCi0Jd2hpbGUgKCAoUG9ydFAtPlN0YXRlICYgUklPX0NMT1NJTkcpICYmICFwLT5SSU9IYWx0ZWQgKSB7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiV2FpdGluZyBmb3IgUklPX0NMT1NJTkcgdG8gZ28gYXdheVxuIik7Ci0JCWlmIChyZXBlYXRfdGhpcyAtLSA8PSAwKSB7Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIldhaXRpbmcgZm9yIG5vdCBpZGxlIGNsb3NlZCBicm9rZW4gYnkgc2lnbmFsXG4iKTsKLQkJCVJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIEZDTE9TRSApOyAKKwkgKiogSWYgdGhlIHBvcnQgaXMgaW4gdGhlIGZpbmFsIHRocm93cyBvZiBiZWluZyBjbG9zZWQsCisJICoqIHdlIHNob3VsZCB3YWl0IGhlcmUgKHBvbGl0ZWx5KSwgd2FpdGluZworCSAqKiBmb3IgaXQgdG8gZmluaXNoLCBzbyB0aGF0IGl0IGRvZXNuJ3QgY2xvc2UgdXMhCisJICovCisJd2hpbGUgKChQb3J0UC0+U3RhdGUgJiBSSU9fQ0xPU0lORykgJiYgIXAtPlJJT0hhbHRlZCkgeworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVFRZLCAiV2FpdGluZyBmb3IgUklPX0NMT1NJTkcgdG8gZ28gYXdheVxuIik7CisJCWlmIChyZXBlYXRfdGhpcy0tIDw9IDApIHsKKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UVFksICJXYWl0aW5nIGZvciBub3QgaWRsZSBjbG9zZWQgYnJva2VuIGJ5IHNpZ25hbFxuIik7CisJCQlSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLCBGQ0xPU0UpOwogCQkJcmV0dmFsID0gLUVJTlRSOwogCQkJZ290byBib21ib3V0OwogCQl9CiAJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwogCQlpZiAoUklPRGVsYXkoUG9ydFAsIEhVTkRSRURfTVMpID09IFJJT19GQUlMKSB7Ci0JCQlyaW9fc3Bpbl9sb2NrX2lycXNhdmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7IAorCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwogCQkJcmV0dmFsID0gLUVJTlRSOwogCQkJZ290byBib21ib3V0OwogCQl9Ci0JCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsgCisJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKIAl9CiAKLQlpZiAoICFQb3J0UC0+TWFwcGVkICkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlBvcnQgdW5tYXBwZWQgd2hpbGUgY2xvc2luZyFcbiIpOworCWlmICghUG9ydFAtPk1hcHBlZCkgeworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVFRZLCAiUG9ydCB1bm1hcHBlZCB3aGlsZSBjbG9zaW5nIVxuIik7CiAJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwogCQlyZXR2YWwgPSAtRU5YSU87Ci0JCWZ1bmNfZXhpdCAoKTsKKwkJZnVuY19leGl0KCk7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCi0JaWYgKCBwLT5SSU9IYWx0ZWQgKSB7CisJaWYgKHAtPlJJT0hhbHRlZCkgewogCQlnb3RvIGJvbWJvdXQ7CiAJfQogCkBAIC0zNDYsMTYgKzI5MywxNiBAQAogKi8KIAkvKiBVaD8gU3VwcG9zZSBJIHR1cm4gdGhlc2Ugb24gYW5kIHRoZW4gYW5vdGhlciBwcm9jZXNzIG9wZW5zCiAJICAgdGhlIHBvcnQgYWdhaW4/IFRoZSBmbGFncyBnZXQgY2xlYXJlZCEgTm90IGdvb2QuIC0tIFJFVyAqLwotCWlmICggIShQb3J0UC0+U3RhdGUgJiAoUklPX0xPUEVOIHwgUklPX01PUEVOKSkgKSB7Ci0JCVBvcnRQLT5Db25maWcgJj0gfihSSU9fQ1RTRkxPV3xSSU9fUlRTRkxPVyk7CisJaWYgKCEoUG9ydFAtPlN0YXRlICYgKFJJT19MT1BFTiB8IFJJT19NT1BFTikpKSB7CisJCVBvcnRQLT5Db25maWcgJj0gfihSSU9fQ1RTRkxPVyB8IFJJT19SVFNGTE9XKTsKIAl9CiAKIAlpZiAoIShQb3J0UC0+Zmlyc3RPcGVuKSkgewkvKiBGaXJzdCB0aW1lID8gKi8KLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJGaXJzdCBvcGVuIGZvciB0aGlzIHBvcnRcbiIpOwotCQorCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVFRZLCAiRmlyc3Qgb3BlbiBmb3IgdGhpcyBwb3J0XG4iKTsKKwogCiAJCVBvcnRQLT5maXJzdE9wZW4rKzsKLQkJUG9ydFAtPkNvb2tNb2RlID0gMDsgLyogWFhYIFJJT0Nvb2tNb2RlKHRwKTsgKi8KKwkJUG9ydFAtPkNvb2tNb2RlID0gMDsJLyogWFhYIFJJT0Nvb2tNb2RlKHRwKTsgKi8KIAkJUG9ydFAtPkluVXNlID0gTk9UX0lOVVNFOwogCiAJCS8qIFRlbnRhdGl2ZSBmaXggZm9yIGJ1ZyBQUjI3LiBEaWRuJ3Qgd29yay4gKi8KQEAgLTM2MywyNiArMzEwLDIxIEBACiAKIAkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CiAjaWZkZWYgTkVFRF9USElTCi0JCXR0eXNldGgoUG9ydFAsIHRwLCAoc3RydWN0IG9sZF9zZ3R0eWIgKikmZGVmYXVsdF9zZyk7CisJCXR0eXNldGgoUG9ydFAsIHRwLCAoc3RydWN0IG9sZF9zZ3R0eWIgKikgJmRlZmF1bHRfc2cpOwogI2VuZGlmCiAKIAkJLyogU29tZW9uZSBleHBsYWluIHRvIG1lIHdoeSB0aGlzIGRlbGF5L2NvbmZpZyBpcwotICAgICAgICAgICAgICAgICAgIGhlcmUuIElmIEkgcmVhZCB0aGUgZG9jcyBjb3JyZWN0bHkgdGhlICJvcGVuIgotICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgcGlnZ3liYWNrcyB0aGUgcGFyYW1ldGVycyBpbW1lZGlhdGVseS4gCisJCSAgIGhlcmUuIElmIEkgcmVhZCB0aGUgZG9jcyBjb3JyZWN0bHkgdGhlICJvcGVuIgorCQkgICBjb21tYW5kIHBpZ2d5YmFja3MgdGhlIHBhcmFtZXRlcnMgaW1tZWRpYXRlbHkuCiAJCSAgIC0tIFJFVyAqLwotCQlSSU9QYXJhbShQb3J0UCxPUEVOLE1vZGVtLE9LX1RPX1NMRUVQKTsJCS8qIE9wZW4gdGhlIHBvcnQgKi8KLSNpZiAwCi0JCS8qIFRoaXMgZGVsYXkgb2YgMSBzZWNvbmQgd2FzIGFubm95aW5nLiBJIHJlbW92ZWQgaXQuIC0tIFJFVyAqLwotCQlSSU9EZWxheShQb3J0UCwgSFVORFJFRF9NUyoxMCk7Ci0JCVJJT1BhcmFtKFBvcnRQLENPTkZJRyxNb2RlbSxPS19UT19TTEVFUCk7CS8qIENvbmZpZyB0aGUgcG9ydCAqLwotI2VuZGlmCisJCVJJT1BhcmFtKFBvcnRQLCBPUEVOLCBNb2RlbSwgT0tfVE9fU0xFRVApOwkvKiBPcGVuIHRoZSBwb3J0ICovCiAJCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKIAogCQkvKgotCQkqKiB3YWl0IGZvciB0aGUgcG9ydCB0byBiZSBub3QgY2xvc2VkLgotCQkqLwotCQl3aGlsZSAoICEoUG9ydFAtPlBvcnRTdGF0ZSAmIFBPUlRfSVNPUEVOKSAmJiAhcC0+UklPSGFsdGVkICkgewotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJXYWl0aW5nIGZvciBQT1JUX0lTT1BFTi1jdXJyZW50bHkgJXhcbiIsUG9ydFAtPlBvcnRTdGF0ZSk7CisJCSAqKiB3YWl0IGZvciB0aGUgcG9ydCB0byBiZSBub3QgY2xvc2VkLgorCQkgKi8KKwkJd2hpbGUgKCEoUG9ydFAtPlBvcnRTdGF0ZSAmIFBPUlRfSVNPUEVOKSAmJiAhcC0+UklPSGFsdGVkKSB7CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVFRZLCAiV2FpdGluZyBmb3IgUE9SVF9JU09QRU4tY3VycmVudGx5ICV4XG4iLCBQb3J0UC0+UG9ydFN0YXRlKTsKIC8qCiAqKiAxNS4xMC4xOTk4IEFSRyAtIEVTSUwgMDc1OQogKiogKFBhcnQpIGZpeCBmb3IgcG9ydCBiZWluZyB0cmFzaGVkIHdoZW4gb3BlbmVkIHdoaWxzdCBSVEEgImRpc2Nvbm5lY3RlZCIKQEAgLTM5OSwxMTUgKzM0MSwxMDYgQEAKICovCiAJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKIAkJCWlmIChSSU9EZWxheShQb3J0UCwgSFVORFJFRF9NUykgPT0gUklPX0ZBSUwpIHsKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIldhaXRpbmcgZm9yIG9wZW4gdG8gZmluaXNoIGJyb2tlbiBieSBzaWduYWxcbiIpOwotCQkJCVJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIEZDTE9TRSApOwotCQkJCWZ1bmNfZXhpdCAoKTsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVFRZLCAiV2FpdGluZyBmb3Igb3BlbiB0byBmaW5pc2ggYnJva2VuIGJ5IHNpZ25hbFxuIik7CisJCQkJUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgRkNMT1NFKTsKKwkJCQlmdW5jX2V4aXQoKTsKIAkJCQlyZXR1cm4gLUVJTlRSOwogCQkJfQogCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwogCQl9CiAKLQkJaWYgKCBwLT5SSU9IYWx0ZWQgKSB7Ci0JCSAgcmV0dmFsID0gLUVJTzsKLWJvbWJvdXQ6Ci0JCSAgLyogCQkJUklPQ2xlYXJVcCggUG9ydFAgKTsgKi8KKwkJaWYgKHAtPlJJT0hhbHRlZCkgeworCQkJcmV0dmFsID0gLUVJTzsKKwkJICAgICAgYm9tYm91dDoKKwkJCS8qICAgICAgICAgICAgICAgICAgICBSSU9DbGVhclVwKCBQb3J0UCApOyAqLwogCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CiAJCQlyZXR1cm4gcmV0dmFsOwogCQl9Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUE9SVF9JU09QRU4gZm91bmRcbiIpOworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVFRZLCAiUE9SVF9JU09QRU4gZm91bmRcbiIpOwogCX0KLQotI2lmZGVmIE1PREVNX1NVUFBPUlQgCisjaWZkZWYgTU9ERU1fU1VQUE9SVAogCWlmIChNb2RlbSkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIk1vZGVtIC0gdGVzdCBmb3IgY2FycmllclxuIik7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UVFksICJNb2RlbSAtIHRlc3QgZm9yIGNhcnJpZXJcbiIpOwogCQkvKgotCQkqKiBBQ1RJT04KLQkJKiogaW5zZXJ0IHRlc3QgZm9yIGNhcnJpZXIgaGVyZS4gLS0gPz8/Ci0JCSoqIEkgYWxyZWFkeSBzZWUgdGhhdCB0ZXN0IGhlcmUuIFdoYXQncyB0aGUgZGVhbD8gLS0gUkVXCi0JCSovCi0JCWlmICgoUG9ydFAtPmdzLnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkgfHwgKFBvcnRQLT5Nb2RlbVN0YXRlICYgTVNWUjFfQ0QpKQotCQl7Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIm9wZW4oJWQpIE1vZGVtIGNhcnIgb25cbiIsIFN5c1BvcnQpOworCQkgKiogQUNUSU9OCisJCSAqKiBpbnNlcnQgdGVzdCBmb3IgY2FycmllciBoZXJlLiAtLSA/Pz8KKwkJICoqIEkgYWxyZWFkeSBzZWUgdGhhdCB0ZXN0IGhlcmUuIFdoYXQncyB0aGUgZGVhbD8gLS0gUkVXCisJCSAqLworCQlpZiAoKFBvcnRQLT5ncy50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpIHx8IChQb3J0UC0+TW9kZW1TdGF0ZSAmIE1TVlIxX0NEKSkgeworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RUWSwgIm9wZW4oJWQpIE1vZGVtIGNhcnIgb25cbiIsIFN5c1BvcnQpOwogCQkJLyoKLQkJCXRwLT50bS5jX3N0YXRlIHw9IENBUlJfT047Ci0JCQl3YWtldXAoKGNhZGRyX3QpICZ0cC0+dG0uY19jYW5xKTsKLQkJCSovCisJCQkgICB0cC0+dG0uY19zdGF0ZSB8PSBDQVJSX09OOworCQkJICAgd2FrZXVwKChjYWRkcl90KSAmdHAtPnRtLmNfY2FucSk7CisJCQkgKi8KIAkJCVBvcnRQLT5TdGF0ZSB8PSBSSU9fQ0FSUl9PTjsKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSAoJlBvcnRQLT5ncy5vcGVuX3dhaXQpOwotCQl9Ci0JCWVsc2UgLyogbm8gY2FycmllciAtIHdhaXQgZm9yIERDRCAqLwotCQl7Ci0JCSAgLyoKLQkJCXdoaWxlICghKFBvcnRQLT5ncy50dHktPnRlcm1pb3MtPmNfc3RhdGUgJiBDQVJSX09OKSAmJiAKLQkJCSAgICAgICAhKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSAmJiAhcC0+UklPSGFsdGVkICkKLQkJICAqLwotCQkJd2hpbGUgKCEoUG9ydFAtPlN0YXRlICYgUklPX0NBUlJfT04pICYmIAotCQkJICAgICAgICEoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spICYmICFwLT5SSU9IYWx0ZWQgKSB7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJlBvcnRQLT5ncy5vcGVuX3dhaXQpOworCQl9IGVsc2UgewkvKiBubyBjYXJyaWVyIC0gd2FpdCBmb3IgRENEICovCiAKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIm9wZW4oJWQpIHNsZWVwaW5nIGZvciBjYXJyIG9uXG4iLFN5c1BvcnQpOworCQkJLyoKKwkJCSAgIHdoaWxlICghKFBvcnRQLT5ncy50dHktPnRlcm1pb3MtPmNfc3RhdGUgJiBDQVJSX09OKSAmJgorCQkJICAgIShmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgJiYgIXAtPlJJT0hhbHRlZCApCisJCQkgKi8KKwkJCXdoaWxlICghKFBvcnRQLT5TdGF0ZSAmIFJJT19DQVJSX09OKSAmJiAhKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSAmJiAhcC0+UklPSGFsdGVkKSB7CisKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVFRZLCAib3BlbiglZCkgc2xlZXBpbmcgZm9yIGNhcnIgb25cbiIsIFN5c1BvcnQpOwogCQkJCS8qCi0JCQkJUG9ydFAtPmdzLnR0eS0+dGVybWlvcy0+Y19zdGF0ZSB8PSBXT1BFTjsKLQkJCQkqLworCQkJCSAgIFBvcnRQLT5ncy50dHktPnRlcm1pb3MtPmNfc3RhdGUgfD0gV09QRU47CisJCQkJICovCiAJCQkJUG9ydFAtPlN0YXRlIHw9IFJJT19XT1BFTjsKIAkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKLQkJCQlpZiAoUklPRGVsYXkgKFBvcnRQLCBIVU5EUkVEX01TKSA9PSBSSU9fRkFJTCkKLSNpZiAwCi0JCQkJaWYgKCBzbGVlcCgoY2FkZHJfdCkmdHAtPnRtLmNfY2FucW8sIFRUSVBSSXxQQ0FUQ0gpKQotI2VuZGlmCi0JCQkJewotCQkJCQkvKgotCQkJCQkqKiBBQ1RJT046IHZlcmlmeSB0aGF0IHRoaXMgaXMgYSBnb29kIHRoaW5nCi0JCQkJCSoqIHRvIGRvIGhlcmUuIC0tID8/PwotCQkJCQkqKiBJIHRoaW5rIGl0J3MgT0suIC0tIFJFVwotCQkJCQkqLwotCQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIm9wZW4oJWQpIHNsZWVwaW5nIGZvciBjYXJyIGJyb2tlbiBieSBzaWduYWxcbiIsCi0JCQkJCSAgICAgICBTeXNQb3J0KTsKLQkJCQkJUklPUHJlZW1wdGl2ZUNtZCggcCwgUG9ydFAsIEZDTE9TRSApOwotCQkJCQkvKgotCQkJCQl0cC0+dG0uY19zdGF0ZSAmPSB+V09QRU47Ci0JCQkJCSovCi0JCQkJCVBvcnRQLT5TdGF0ZSAmPSB+UklPX1dPUEVOOwotCQkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKLQkJCQkJZnVuY19leGl0ICgpOwotCQkJCQlyZXR1cm4gLUVJTlRSOwotCQkJCX0KKwkJCQlpZiAoUklPRGVsYXkoUG9ydFAsIEhVTkRSRURfTVMpID09IFJJT19GQUlMKQorCQkJCQl7CisJCQkJCQkvKgorCQkJCQkJICoqIEFDVElPTjogdmVyaWZ5IHRoYXQgdGhpcyBpcyBhIGdvb2QgdGhpbmcKKwkJCQkJCSAqKiB0byBkbyBoZXJlLiAtLSA/Pz8KKwkJCQkJCSAqKiBJIHRoaW5rIGl0J3MgT0suIC0tIFJFVworCQkJCQkJICovCisJCQkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVFRZLCAib3BlbiglZCkgc2xlZXBpbmcgZm9yIGNhcnIgYnJva2VuIGJ5IHNpZ25hbFxuIiwgU3lzUG9ydCk7CisJCQkJCQlSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLCBGQ0xPU0UpOworCQkJCQkJLyoKKwkJCQkJCSAgIHRwLT50bS5jX3N0YXRlICY9IH5XT1BFTjsKKwkJCQkJCSAqLworCQkJCQkJUG9ydFAtPlN0YXRlICY9IH5SSU9fV09QRU47CisJCQkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKKwkJCQkJCWZ1bmNfZXhpdCgpOworCQkJCQkJcmV0dXJuIC1FSU5UUjsKKwkJCQkJfQogCQkJfQogCQkJUG9ydFAtPlN0YXRlICY9IH5SSU9fV09QRU47CiAJCX0KLQkJaWYgKCBwLT5SSU9IYWx0ZWQgKQorCQlpZiAocC0+UklPSGFsdGVkKQogCQkJZ290byBib21ib3V0OwotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlNldHRpbmcgUklPX01PUEVOXG4iKTsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RUWSwgIlNldHRpbmcgUklPX01PUEVOXG4iKTsKIAkJUG9ydFAtPlN0YXRlIHw9IFJJT19NT1BFTjsKLQl9Ci0JZWxzZQorCX0gZWxzZQogI2VuZGlmCiAJewogCQkvKgotCQkqKiBBQ1RJT04KLQkJKiogRGlyZWN0IGxpbmUgb3BlbiAtIGZvcmNlIGNhcnJpZXIgKHdpbGwgcHJvYmFibHkgbWVhbgotCQkqKiB0aGF0IHNsZWVwaW5nIE1vZGVtIGxpbmUgZnViYXIpCi0JCSovCisJCSAqKiBBQ1RJT04KKwkJICoqIERpcmVjdCBsaW5lIG9wZW4gLSBmb3JjZSBjYXJyaWVyICh3aWxsIHByb2JhYmx5IG1lYW4KKwkJICoqIHRoYXQgc2xlZXBpbmcgTW9kZW0gbGluZSBmdWJhcikKKwkJICovCiAJCVBvcnRQLT5TdGF0ZSB8PSBSSU9fTE9QRU47CiAJfQogCi0JaWYgKCBwLT5SSU9IYWx0ZWQgKSB7CisJaWYgKHAtPlJJT0hhbHRlZCkgewogCQlnb3RvIGJvbWJvdXQ7CiAJfQogCi0JcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJoaWdoIGxldmVsIG9wZW4gZG9uZVxuIik7CisJcmlvX2RwcmludGsoUklPX0RFQlVHX1RUWSwgImhpZ2ggbGV2ZWwgb3BlbiBkb25lXG4iKTsKIAogI2lmZGVmIFNUQVRTCiAJUG9ydFAtPlN0YXQuT3BlbkNudCsrOwogI2VuZGlmCiAJLyoKLQkqKiBDb3VudCBvcGVucyBmb3IgcG9ydCBzdGF0aXN0aWNzIHJlcG9ydGluZwotCSovCisJICoqIENvdW50IG9wZW5zIGZvciBwb3J0IHN0YXRpc3RpY3MgcmVwb3J0aW5nCisJICovCiAJaWYgKFBvcnRQLT5zdGF0c0dhdGhlcikKIAkJUG9ydFAtPm9wZW5zKys7CiAKIAlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlJldHVybmluZyBmcm9tIG9wZW5cbiIpOwotCWZ1bmNfZXhpdCAoKTsKKwlyaW9fZHByaW50ayhSSU9fREVCVUdfVFRZLCAiUmV0dXJuaW5nIGZyb20gb3BlblxuIik7CisJZnVuY19leGl0KCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUxNiw4NSArNDQ5LDczIEBACiAqKiBUaGUgb3BlcmF0aW5nIHN5c3RlbSB0aGlua3MgdGhhdCB0aGlzIGlzIGxhc3QgY2xvc2UgZm9yIHRoZSBkZXZpY2UuCiAqKiBBcyB0aGVyZSBhcmUgdHdvIGludGVyZmFjZXMgdG8gdGhlIHBvcnQgKE1vZGVtIGFuZCB0dHkpLCB3ZSBuZWVkIHRvCiAqKiBjaGVjayB0aGF0IGJvdGggYXJlIGNsb3NlZCBiZWZvcmUgd2UgY2xvc2UgdGhlIGRldmljZS4KLSovIAotaW50Ci1yaW90Y2xvc2Uodm9pZCAgKnB0cikKKyovCitpbnQgcmlvdGNsb3NlKHZvaWQgKnB0cikKIHsKLSNpZiAwCi0JcmVnaXN0ZXIgdWludCBTeXNQb3J0ID0gZGV2OwotCXN0cnVjdCB0dHlzdGF0aWNzICp0cDsJCS8qIHBvaW50ZXIgdG8gb3VyIHR0eXN0cnVjdCAqLwotI2VuZGlmCiAJc3RydWN0IFBvcnQgKlBvcnRQID0gcHRyOwkvKiBwb2ludGVyIHRvIHRoZSBwb3J0IHN0cnVjdHVyZSAqLwogCWludCBkZWxldGVkID0gMDsKLQlpbnQJdHJ5ID0gLTE7IC8qIERpc2FibGUgdGhlIHRpbWVvdXRzIGJ5IHNldHRpbmcgdGhlbSB0byAtMSAqLwotCWludAlyZXBlYXRfdGhpcyA9IC0xOyAvKiBDb25ncmF0cyB0byB0aG9zZSBoYXZpbmcgMTUgeWVhcnMgb2YgCi0JCQkJICAgICB1cHRpbWUhIChZb3UgZ2V0IHRvIGJyZWFrIHRoZSBkcml2ZXIuKSAqLworCWludCB0cnkgPSAtMTsJCS8qIERpc2FibGUgdGhlIHRpbWVvdXRzIGJ5IHNldHRpbmcgdGhlbSB0byAtMSAqLworCWludCByZXBlYXRfdGhpcyA9IC0xOwkvKiBDb25ncmF0cyB0byB0aG9zZSBoYXZpbmcgMTUgeWVhcnMgb2YKKwkJCQkgICB1cHRpbWUhIChZb3UgZ2V0IHRvIGJyZWFrIHRoZSBkcml2ZXIuKSAqLwogCXVuc2lnbmVkIGxvbmcgZW5kX3RpbWU7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHk7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBNb2RlbTsKIAlpbnQgcnYgPSAwOwotCQotCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAicG9ydCBjbG9zZSBTeXNQb3J0ICVkXG4iLFBvcnRQLT5Qb3J0TnVtKTsKKworCXJpb19kcHJpbnRrKFJJT19ERUJVR19UVFksICJwb3J0IGNsb3NlIFN5c1BvcnQgJWRcbiIsIFBvcnRQLT5Qb3J0TnVtKTsKIAogCS8qIFBvcnRQID0gcC0+UklPUG9ydHBbU3lzUG9ydF07ICovCi0JcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJQb3J0IGlzIGF0IGFkZHJlc3MgMHgleFxuIiwoaW50KVBvcnRQKTsKLQkvKiB0cCA9IFBvcnRQLT5UdHlQOyovCQkJLyogR2V0IHR0eSAqLworCXJpb19kcHJpbnRrKFJJT19ERUJVR19UVFksICJQb3J0IGlzIGF0IGFkZHJlc3MgMHgleFxuIiwgKGludCkgUG9ydFApOworCS8qIHRwID0gUG9ydFAtPlR0eVA7ICovLyogR2V0IHR0eSAqLwogCXR0eSA9IFBvcnRQLT5ncy50dHk7Ci0JcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUVFkgaXMgYXQgYWRkcmVzcyAweCV4XG4iLChpbnQpdHR5KTsKKwlyaW9fZHByaW50ayhSSU9fREVCVUdfVFRZLCAiVFRZIGlzIGF0IGFkZHJlc3MgMHgleFxuIiwgKGludCkgdHR5KTsKIAotCWlmIChQb3J0UC0+Z3MuY2xvc2luZ193YWl0KSAKKwlpZiAoUG9ydFAtPmdzLmNsb3Npbmdfd2FpdCkKIAkJZW5kX3RpbWUgPSBqaWZmaWVzICsgUG9ydFAtPmdzLmNsb3Npbmdfd2FpdDsKLQllbHNlIAorCWVsc2UKIAkJZW5kX3RpbWUgPSBqaWZmaWVzICsgTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CiAKIAlNb2RlbSA9IHJpb19pc21vZGVtKHR0eSk7Ci0jaWYgMAotCS8qIFdoYXQgRi5DS0lORyBjYWNoZT8gRXZlbiB0aGVuLCBhIGhpZ2x5IGlkbGUgbXVsdGlwcm9jZXNzb3IsCi0JICAgc3lzdGVtIHdpdGggbGFyZ2UgY2FjaGVzIHRoaXMgd29uJ3Qgd29yayAuIEJldHRlciBmaW5kIG91dCB3aGVuIAotCSAgIHRoaXMgZG9lc24ndCB3b3JrIGFzYXAsIGFuZCBmaXggdGhlIGNhdXNlLiAgLS0gUkVXICovCi0JCi0JUklPRGVsYXkoUG9ydFAsIEhVTkRSRURfTVMqMTApOwkvKiBUbyBmbHVzaCB0aGUgY2FjaGUgKi8KLSNlbmRpZgogCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKIAogCS8qCi0JKiogU2V0dGluZyB0aGlzIGZsYWcgd2lsbCBtYWtlIGFueSBwcm9jZXNzIHRyeWluZyB0byBvcGVuCi0JKiogdGhpcyBwb3J0IGJsb2NrIHVudGlsIHdlIGFyZSBjb21wbGV0ZSBjbG9zaW5nIGl0LgotCSovCisJICoqIFNldHRpbmcgdGhpcyBmbGFnIHdpbGwgbWFrZSBhbnkgcHJvY2VzcyB0cnlpbmcgdG8gb3BlbgorCSAqKiB0aGlzIHBvcnQgYmxvY2sgdW50aWwgd2UgYXJlIGNvbXBsZXRlIGNsb3NpbmcgaXQuCisJICovCiAJUG9ydFAtPlN0YXRlIHw9IFJJT19DTE9TSU5HOwogCi0JaWYgKCAoUG9ydFAtPlN0YXRlICYgUklPX0RFTEVURUQpICkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNsb3NlIG9uIGRlbGV0ZWQgUlRBXG4iKTsKKwlpZiAoKFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEKSkgeworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVFRZLCAiQ2xvc2Ugb24gZGVsZXRlZCBSVEFcbiIpOwogCQlkZWxldGVkID0gMTsKIAl9Ci0JCi0JaWYgKCBwLT5SSU9IYWx0ZWQgKSB7Ci0JCVJJT0NsZWFyVXAoIFBvcnRQICk7CisKKwlpZiAocC0+UklPSGFsdGVkKSB7CisJCVJJT0NsZWFyVXAoUG9ydFApOwogCQlydiA9IC1FSU87CiAJCWdvdG8gY2xvc2VfZW5kOwogCX0KIAotCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiQ2xlYXIgYml0c1xuIik7CisJcmlvX2RwcmludGsoUklPX0RFQlVHX1RUWSwgIkNsZWFyIGJpdHNcbiIpOwogCS8qCi0JKiogY2xlYXIgdGhlIG9wZW4gYml0cyBmb3IgdGhpcyBkZXZpY2UKLQkqLworCSAqKiBjbGVhciB0aGUgb3BlbiBiaXRzIGZvciB0aGlzIGRldmljZQorCSAqLwogCVBvcnRQLT5TdGF0ZSAmPSAoTW9kZW0gPyB+UklPX01PUEVOIDogflJJT19MT1BFTik7CiAJUG9ydFAtPlN0YXRlICY9IH5SSU9fQ0FSUl9PTjsKIAlQb3J0UC0+TW9kZW1TdGF0ZSAmPSB+TVNWUjFfQ0Q7CiAJLyoKLQkqKiBJZiB0aGUgZGV2aWNlIHdhcyBvcGVuIGFzIGJvdGggYSBNb2RlbSBhbmQgYSB0dHkgbGluZQotCSoqIHRoZW4gd2UgbmVlZCB0byB3aW1wIG91dCBoZXJlLCBhcyB0aGUgcG9ydCBoYXMgbm90IHJlYWxseQotCSoqIGJlZW4gZmluYWxseSBjbG9zZWQgKGdlZSwgd2hpenohKSBUaGUgdGVzdCBoZXJlIHVzZXMgdGhlCi0JKiogYml0IGZvciB0aGUgT1RIRVIgbW9kZSBvZiBvcGVyYXRpb24sIHRvIHNlZSBpZiBUSEFUIGlzCi0JKiogc3RpbGwgYWN0aXZlIQotCSovCi0JaWYgKCAoUG9ydFAtPlN0YXRlICYgKFJJT19MT1BFTnxSSU9fTU9QRU4pKSApIHsKKwkgKiogSWYgdGhlIGRldmljZSB3YXMgb3BlbiBhcyBib3RoIGEgTW9kZW0gYW5kIGEgdHR5IGxpbmUKKwkgKiogdGhlbiB3ZSBuZWVkIHRvIHdpbXAgb3V0IGhlcmUsIGFzIHRoZSBwb3J0IGhhcyBub3QgcmVhbGx5CisJICoqIGJlZW4gZmluYWxseSBjbG9zZWQgKGdlZSwgd2hpenohKSBUaGUgdGVzdCBoZXJlIHVzZXMgdGhlCisJICoqIGJpdCBmb3IgdGhlIE9USEVSIG1vZGUgb2Ygb3BlcmF0aW9uLCB0byBzZWUgaWYgVEhBVCBpcworCSAqKiBzdGlsbCBhY3RpdmUhCisJICovCisJaWYgKChQb3J0UC0+U3RhdGUgJiAoUklPX0xPUEVOIHwgUklPX01PUEVOKSkpIHsKIAkJLyoKLQkJKiogVGhlIHBvcnQgaXMgc3RpbGwgb3BlbiBmb3IgdGhlIG90aGVyIHRhc2sgLQotCQkqKiByZXR1cm4sIHByZXRlbmRpbmcgdGhhdCB3ZSBhcmUgc3RpbGwgYWN0aXZlLgotCQkqLwotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNoYW5uZWwgJWQgc3RpbGwgb3BlbiAhXG4iLFBvcnRQLT5Qb3J0TnVtKTsKKwkJICoqIFRoZSBwb3J0IGlzIHN0aWxsIG9wZW4gZm9yIHRoZSBvdGhlciB0YXNrIC0KKwkJICoqIHJldHVybiwgcHJldGVuZGluZyB0aGF0IHdlIGFyZSBzdGlsbCBhY3RpdmUuCisJCSAqLworCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVFRZLCAiQ2hhbm5lbCAlZCBzdGlsbCBvcGVuICFcbiIsIFBvcnRQLT5Qb3J0TnVtKTsKIAkJUG9ydFAtPlN0YXRlICY9IH5SSU9fQ0xPU0lORzsKIAkJaWYgKFBvcnRQLT5maXJzdE9wZW4pCiAJCQlQb3J0UC0+Zmlyc3RPcGVuLS07CkBAIC02MDIsNDggKzUyMyw0NyBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNsb3NpbmcgZG93biAtIGV2ZXJ5dGhpbmcgbXVzdCBnbyFcbiIpOworCXJpb19kcHJpbnRrKFJJT19ERUJVR19UVFksICJDbG9zaW5nIGRvd24gLSBldmVyeXRoaW5nIG11c3QgZ28hXG4iKTsKIAogCVBvcnRQLT5TdGF0ZSAmPSB+UklPX0RZTk9ST0Q7CiAKIAkvKgotCSoqIFRoaXMgaXMgd2hlcmUgd2Ugd2FpdCBmb3IgdGhlIHBvcnQKLQkqKiB0byBkcmFpbiBkb3duIGJlZm9yZSBjbG9zaW5nLiBCeWUtYnllLi4uLgotCSoqIChXZSBuZXZlciBtZWFudCB0byBkbyB0aGlzKQotCSovCi0JcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUaW1lb3V0IDEgc3RhcnRzXG4iKTsKKwkgKiogVGhpcyBpcyB3aGVyZSB3ZSB3YWl0IGZvciB0aGUgcG9ydAorCSAqKiB0byBkcmFpbiBkb3duIGJlZm9yZSBjbG9zaW5nLiBCeWUtYnllLi4uLgorCSAqKiAoV2UgbmV2ZXIgbWVhbnQgdG8gZG8gdGhpcykKKwkgKi8KKwlyaW9fZHByaW50ayhSSU9fREVCVUdfVFRZLCAiVGltZW91dCAxIHN0YXJ0c1xuIik7CiAKIAlpZiAoIWRlbGV0ZWQpCi0Jd2hpbGUgKCAoUG9ydFAtPkluVXNlICE9IE5PVF9JTlVTRSkgJiYgIXAtPlJJT0hhbHRlZCAmJiAKLQkJKFBvcnRQLT5UeEJ1ZmZlckluICE9IFBvcnRQLT5UeEJ1ZmZlck91dCkgKSB7Ci0JCWNwcmludGYoIk5lZWQgdG8gZmx1c2ggdGhlIHR0eXBvcnRcbiIpOwotCQlpZiAocmVwZWF0X3RoaXMgLS0gPD0gMCkgewotCQkJcnYgPSAtRUlOVFI7Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIldhaXRpbmcgZm9yIG5vdCBpZGxlIGNsb3NlZCBicm9rZW4gYnkgc2lnbmFsXG4iKTsKLQkJCVJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIEZDTE9TRSk7Ci0JCQlnb3RvIGNsb3NlX2VuZDsKLQkJfQotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNhbGxpbmcgdGltZW91dCB0byBmbHVzaCBpbiBjbG9zaW5nXG4iKTsKLQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JCWlmIChSSU9EZWxheV9uaShQb3J0UCwgSFVORFJFRF9NUyoxMCkgPT0gUklPX0ZBSUwpIHsKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiUlRBIEVJTlRSIGluIGRlbGF5IFxuIik7Ci0JCQlydiA9IC1FSU5UUjsKKwkJd2hpbGUgKChQb3J0UC0+SW5Vc2UgIT0gTk9UX0lOVVNFKSAmJiAhcC0+UklPSGFsdGVkICYmIChQb3J0UC0+VHhCdWZmZXJJbiAhPSBQb3J0UC0+VHhCdWZmZXJPdXQpKSB7CisJCQljcHJpbnRmKCJOZWVkIHRvIGZsdXNoIHRoZSB0dHlwb3J0XG4iKTsKKwkJCWlmIChyZXBlYXRfdGhpcy0tIDw9IDApIHsKKwkJCQlydiA9IC1FSU5UUjsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVFRZLCAiV2FpdGluZyBmb3Igbm90IGlkbGUgY2xvc2VkIGJyb2tlbiBieSBzaWduYWxcbiIpOworCQkJCVJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIEZDTE9TRSk7CisJCQkJZ290byBjbG9zZV9lbmQ7CisJCQl9CisJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVFRZLCAiQ2FsbGluZyB0aW1lb3V0IHRvIGZsdXNoIGluIGNsb3NpbmdcbiIpOworCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CisJCQlpZiAoUklPRGVsYXlfbmkoUG9ydFAsIEhVTkRSRURfTVMgKiAxMCkgPT0gUklPX0ZBSUwpIHsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVFRZLCAiUlRBIEVJTlRSIGluIGRlbGF5IFxuIik7CisJCQkJcnYgPSAtRUlOVFI7CisJCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOworCQkJCWdvdG8gY2xvc2VfZW5kOworCQkJfQogCQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwotCQkJZ290byBjbG9zZV9lbmQ7CiAJCX0KLQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwotCX0KIAogCVBvcnRQLT5UeEJ1ZmZlckluID0gUG9ydFAtPlR4QnVmZmVyT3V0ID0gMDsKIAlyZXBlYXRfdGhpcyA9IDB4ZmY7CiAKIAlQb3J0UC0+SW5Vc2UgPSAwOwotCWlmICggKFBvcnRQLT5TdGF0ZSAmIChSSU9fTE9QRU58UklPX01PUEVOKSkgKSB7CisJaWYgKChQb3J0UC0+U3RhdGUgJiAoUklPX0xPUEVOIHwgUklPX01PUEVOKSkpIHsKIAkJLyoKLQkJKiogVGhlIHBvcnQgaGFzIGJlZW4gcmUtb3BlbmVkIGZvciB0aGUgb3RoZXIgdGFzayAtCi0JCSoqIHJldHVybiwgcHJldGVuZGluZyB0aGF0IHdlIGFyZSBzdGlsbCBhY3RpdmUuCi0JCSovCi0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiQ2hhbm5lbCAlZCByZS1vcGVuIVxuIiwgUG9ydFAtPlBvcnROdW0pOworCQkgKiogVGhlIHBvcnQgaGFzIGJlZW4gcmUtb3BlbmVkIGZvciB0aGUgb3RoZXIgdGFzayAtCisJCSAqKiByZXR1cm4sIHByZXRlbmRpbmcgdGhhdCB3ZSBhcmUgc3RpbGwgYWN0aXZlLgorCQkgKi8KKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RUWSwgIkNoYW5uZWwgJWQgcmUtb3BlbiFcbiIsIFBvcnRQLT5Qb3J0TnVtKTsKIAkJUG9ydFAtPlN0YXRlICY9IH5SSU9fQ0xPU0lORzsKIAkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CiAJCWlmIChQb3J0UC0+Zmlyc3RPcGVuKQpAQCAtNjUxLDggKzU3MSw4IEBACiAJCXJldHVybiAtRUlPOwogCX0KIAotCWlmICggcC0+UklPSGFsdGVkICkgewotCQlSSU9DbGVhclVwKCBQb3J0UCApOworCWlmIChwLT5SSU9IYWx0ZWQpIHsKKwkJUklPQ2xlYXJVcChQb3J0UCk7CiAJCWdvdG8gY2xvc2VfZW5kOwogCX0KIApAQCAtNjY1LDExNSArNTg1LDczIEBACiAJfQogCiAJaWYgKCFkZWxldGVkKQotCSAgd2hpbGUgKHRyeSAmJiAoUG9ydFAtPlBvcnRTdGF0ZSAmIFBPUlRfSVNPUEVOKSkgewotCSAgICAgICAgdHJ5LS07Ci0JCWlmICh0aW1lX2FmdGVyIChqaWZmaWVzLCBlbmRfdGltZSkpIHsKLQkJICByaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlJ1biBvdXQgb2YgdHJpZXMgLSBmb3JjZSB0aGUgYnVnZ2VyIHNodXQhXG4iICk7Ci0JCSAgUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCxGQ0xPU0UpOwotCQkgIGJyZWFrOwotCQl9Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiQ2xvc2U6IFBvcnRTdGF0ZTpJU09QRU4gaXMgJWRcbiIsIAotCQkJCQkgICBQb3J0UC0+UG9ydFN0YXRlICYgUE9SVF9JU09QRU4pOworCQl3aGlsZSAodHJ5ICYmIChQb3J0UC0+UG9ydFN0YXRlICYgUE9SVF9JU09QRU4pKSB7CisJCQl0cnktLTsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGVuZF90aW1lKSkgeworCQkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UVFksICJSdW4gb3V0IG9mIHRyaWVzIC0gZm9yY2UgdGhlIGJ1Z2dlciBzaHV0IVxuIik7CisJCQkJUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgRkNMT1NFKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UVFksICJDbG9zZTogUG9ydFN0YXRlOklTT1BFTiBpcyAlZFxuIiwgUG9ydFAtPlBvcnRTdGF0ZSAmIFBPUlRfSVNPUEVOKTsKIAotCQlpZiAoIHAtPlJJT0hhbHRlZCApIHsKLQkJCVJJT0NsZWFyVXAoIFBvcnRQICk7Ci0JCQlnb3RvIGNsb3NlX2VuZDsKKwkJCWlmIChwLT5SSU9IYWx0ZWQpIHsKKwkJCQlSSU9DbGVhclVwKFBvcnRQKTsKKwkJCQlnb3RvIGNsb3NlX2VuZDsKKwkJCX0KKwkJCWlmIChSSU9EZWxheShQb3J0UCwgSFVORFJFRF9NUykgPT0gUklPX0ZBSUwpIHsKKwkJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfVFRZLCAiUlRBIEVJTlRSIGluIGRlbGF5IFxuIik7CisJCQkJUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgRkNMT1NFKTsKKwkJCQlicmVhazsKKwkJCX0KIAkJfQotCQlpZiAoUklPRGVsYXkoUG9ydFAsIEhVTkRSRURfTVMpID09IFJJT19GQUlMKSB7Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlJUQSBFSU5UUiBpbiBkZWxheSBcbiIpOwotCQkJUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCxGQ0xPU0UpOwotCQkJYnJlYWs7Ci0JCX0KLQl9CiAJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwotCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiQ2xvc2U6IHRyeSB3YXMgJWQgb24gY29tcGxldGlvblxuIiwgdHJ5ICk7Ci0gCisJcmlvX2RwcmludGsoUklPX0RFQlVHX1RUWSwgIkNsb3NlOiB0cnkgd2FzICVkIG9uIGNvbXBsZXRpb25cbiIsIHRyeSk7CisKIAkvKiBSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLCBGQ0xPU0UpOyAqLwogCiAvKgogKiogMTUuMTAuMTk5OCBBUkcgLSBFU0lMIDA3NjEgcGFydCBmaXgKICoqIFJJTyBoYXMgaXQncyBvd24gQ1RTRkxPVyBhbmQgUlRTRkxPVyBmbGFncyBpbiAnQ29uZmlnJyBpbiB0aGUgcG9ydCBzdHJ1Y3R1cmUsKiogd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZmxhZ3MgYXJlIGNsZWFyIHdoZW4gdGhlIHBvcnQgaXMgb3BlbmVkLgogKi8KLQlQb3J0UC0+Q29uZmlnICY9IH4oUklPX0NUU0ZMT1d8UklPX1JUU0ZMT1cpOworCVBvcnRQLT5Db25maWcgJj0gfihSSU9fQ1RTRkxPVyB8IFJJT19SVFNGTE9XKTsKIAogI2lmZGVmIFNUQVRTCiAJUG9ydFAtPlN0YXQuQ2xvc2VDbnQrKzsKICNlbmRpZgogCS8qCi0JKiogQ291bnQgb3BlbnMgZm9yIHBvcnQgc3RhdGlzdGljcyByZXBvcnRpbmcKLQkqLworCSAqKiBDb3VudCBvcGVucyBmb3IgcG9ydCBzdGF0aXN0aWNzIHJlcG9ydGluZworCSAqLwogCWlmIChQb3J0UC0+c3RhdHNHYXRoZXIpCiAJCVBvcnRQLT5jbG9zZXMrKzsKIAotY2xvc2VfZW5kOgorICAgICAgY2xvc2VfZW5kOgogCS8qIFhYWDogV2h5IHdvdWxkIGEgIkRFTEVURUQiIGZsYWcgYmUgcmVzZXQgaGVyZT8gSSdkIGhhdmUKIAkgICB0aG91Z2h0IHRoYXQgYSAiZGVsZXRlZCIgZmxhZyBtZWFucyB0aGF0IHRoZSBwb3J0IHdhcwogCSAgIHBlcm1hbmVudGx5IGdvbmUsIGJ1dCBoZXJlIHdlIGNhbiBtYWtlIGl0IHJlYXBwZWFyIGJ5IGl0CiAJICAgYmVpbmcgaW4gY2xvc2UgZHVyaW5nIHRoZSAiZGVsZXRpb24iLgotCSovCi0JUG9ydFAtPlN0YXRlICY9IH4oUklPX0NMT1NJTkd8UklPX0RFTEVURUQpOworCSAqLworCVBvcnRQLT5TdGF0ZSAmPSB+KFJJT19DTE9TSU5HIHwgUklPX0RFTEVURUQpOwogCWlmIChQb3J0UC0+Zmlyc3RPcGVuKQogCQlQb3J0UC0+Zmlyc3RPcGVuLS07CiAJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJSZXR1cm4gZnJvbSBjbG9zZVxuIik7CisJcmlvX2RwcmludGsoUklPX0RFQlVHX1RUWSwgIlJldHVybiBmcm9tIGNsb3NlXG4iKTsKIAlyZXR1cm4gcnY7CiB9CiAKIAotLyoKLSoqIGRlY2lkZSBpZiB3ZSBuZWVkIHRvIHVzZSB0aGUgbGluZSBkaXNjaXBsaW5lLgotKiogVGhpcyByb3V0aW5lIGNhbiByZXR1cm4gb25lIG9mIHRocmVlIHZhbHVlczoKLSoqIENPT0tfUkFXIGlmIG5vIHByb2Nlc3NpbmcgaGFzIHRvIGJlIGRvbmUgYnkgdGhlIGxpbmUgZGlzY2lwbGluZSBvciB0aGUgY2FyZAotKiogQ09PS19XRUxMIGlmIHRoZSBsaW5lIGRpc2NpcGxpbmUgbXVzdCBiZSB1c2VkIHRvIGRvIHRoZSBwcm9jZXNzaW5nCi0qKiBDT09LX01FRElVTSBpZiB0aGUgY2FyZCBjYW4gZG8gYWxsIHRoZSBwcm9jZXNzaW5nIG5lY2Vzc2FyeS4KLSovCi0jaWYgMAotc3RhdGljIGludAotUklPQ29va01vZGUoc3RydWN0IHR0eXN0YXRpY3MgKnRwKQotewotCS8qCi0JKiogV2UgY2FuJ3QgaGFuZGxlIHRtLmNfbXN0YXRlICE9IDAgb24gU0NPCi0JKiogV2UgY2FuJ3QgaGFuZGxlIG1hcHBpbmcKLQkqKiBXZSBjYW4ndCBoYW5kbGUgbm9uLXR0d3JpdGUgbGluZSBkaXNjLgotCSoqIFdlIGNhbid0IGhhbmRsZSBsZmxhZyBYQ0FTRQotCSoqIFdlIGNhbiBoYW5kbGUgb2ZsYWcgT1BPU1QgJiAoT0NSTkwsIE9OTENSLCBUQUIzKQotCSovCiAKLSNpZmRlZiBDSEVDSwotCUNoZWNrVHR5UCggdHAgKTsKLSNlbmRpZgotCWlmICghKHRwLT50bS5jX29mbGFnICYgT1BPU1QpKQkvKiBObyBwb3N0IHByb2Nlc3NpbmcgKi8KLQkJcmV0dXJuIENPT0tfUkFXOwkvKiBSYXcgbW9kZSBvL3AgKi8KLQotCWlmICggdHAtPnRtLmNfbGZsYWcgJiBYQ0FTRSApCi0JCXJldHVybiBDT09LX1dFTEw7CS8qIFVzZSBsaW5lIGRpc2MgKi8KLQotCWlmICh0cC0+dG0uY19vZmxhZyAmIH4oT1BPU1QgfCBPTkxDUiB8IE9DUk5MIHwgVEFCMyApICkKLQkJcmV0dXJuIENPT0tfV0VMTDsJLyogVXNlIGxpbmUgZGlzYyBmb3Igc3RyYW5nZSBtb2RlcyAqLwotCi0JaWYgKCB0cC0+dG0uY19vZmxhZyA9PSBPUE9TVCApCS8qIElmIG9ubHkgT1BPU1QgaXMgc2V0LCBkbyBSQVcgKi8KLQkJcmV0dXJuIENPT0tfUkFXOwotCi0JLyoKLQkqKiBTbywgd2UgbmVlZCB0byBvdXRwdXQgcHJvY2VzcyEKLQkqLwotCXJldHVybiBDT09LX01FRElVTTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotUklPQ2xlYXJVcChQb3J0UCkKK3N0YXRpYyB2b2lkIFJJT0NsZWFyVXAoUG9ydFApCiBzdHJ1Y3QgUG9ydCAqUG9ydFA7CiB7Ci0JcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJSSU9IYWx0ZWQgc2V0XG4iKTsKLQlQb3J0UC0+Q29uZmlnID0gMDsJICAvKiBEaXJlY3Qgc2VtYXBob3JlICovCisJcmlvX2RwcmludGsoUklPX0RFQlVHX1RUWSwgIlJJT0hhbHRlZCBzZXRcbiIpOworCVBvcnRQLT5Db25maWcgPSAwOwkvKiBEaXJlY3Qgc2VtYXBob3JlICovCiAJUG9ydFAtPlBvcnRTdGF0ZSA9IDA7CiAJUG9ydFAtPmZpcnN0T3BlbiA9IDA7CiAJUG9ydFAtPkZsdXNoQ21kQm9kZ2UgPSAwOwogCVBvcnRQLT5Nb2RlbVN0YXRlID0gUG9ydFAtPkNvb2tNb2RlID0gMDsKIAlQb3J0UC0+TWFwcGVkID0gMDsKIAlQb3J0UC0+V2ZsdXNoRmxhZyA9IDA7Ci0JUG9ydFAtPk1hZ2ljRmxhZ3MJPSAwOworCVBvcnRQLT5NYWdpY0ZsYWdzID0gMDsKIAlQb3J0UC0+UnhEYXRhU3RhcnQgPSAwOwogCVBvcnRQLT5UeEJ1ZmZlckluID0gMDsKIAlQb3J0UC0+VHhCdWZmZXJPdXQgPSAwOwpAQCAtNzg4LDMzICs2NjYsMjYgQEAKICoqIE90aGVyIHZhbHVlcyBvZiBsZW4gYXJlbid0IGFsbG93ZWQsIGFuZCB3aWxsIGNhdXNlCiAqKiBhIHBhbmljLgogKi8KLWludCBSSU9TaG9ydENvbW1hbmQoc3RydWN0IHJpb19pbmZvICpwLCBzdHJ1Y3QgUG9ydCAqUG9ydFAsCi0JCWludCBjb21tYW5kLCBpbnQgbGVuLCBpbnQgYXJnKQoraW50IFJJT1Nob3J0Q29tbWFuZChzdHJ1Y3QgcmlvX2luZm8gKnAsIHN0cnVjdCBQb3J0ICpQb3J0UCwgaW50IGNvbW1hbmQsIGludCBsZW4sIGludCBhcmcpCiB7CiAJUEtUICpQYWNrZXRQOwotCWludAkJcmV0cmllcyA9IDIwOyAvKiBhdCAxMCBwZXIgc2Vjb25kIC0+IDIgc2Vjb25kcyAqLworCWludCByZXRyaWVzID0gMjA7CS8qIGF0IDEwIHBlciBzZWNvbmQgLT4gMiBzZWNvbmRzICovCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiZW50ZXJpbmcgc2hvcnRjb21tYW5kLlxuIik7Ci0jaWZkZWYgQ0hFQ0sKLQlDaGVja1BvcnRQKCBQb3J0UCApOwotCWlmICggbGVuIDwgMSB8fCBsZW4gPiAyICkKLQkJY3ByaW50ZigoIlNUVVBJRCBMRU5HVEggJWRcbiIsbGVuKSk7Ci0jZW5kaWYKKwlyaW9fZHByaW50ayhSSU9fREVCVUdfVFRZLCAiZW50ZXJpbmcgc2hvcnRjb21tYW5kLlxuIik7CiAKLQlpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlNob3J0IGNvbW1hbmQgdG8gZGVsZXRlZCBSVEEgaWdub3JlZFxuIik7CisJaWYgKFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UVFksICJTaG9ydCBjb21tYW5kIHRvIGRlbGV0ZWQgUlRBIGlnbm9yZWRcbiIpOwogCQlyZXR1cm4gUklPX0ZBSUw7CiAJfQogCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKIAogCS8qCi0JKiogSWYgdGhlIHBvcnQgaXMgaW4gdXNlIGZvciBwcmUtZW1wdGl2ZSBjb21tYW5kLCB0aGVuIHdhaXQgZm9yIGl0IHRvIAotCSoqIGJlIGZyZWUgYWdhaW4uCi0JKi8KLQl3aGlsZSAoIChQb3J0UC0+SW5Vc2UgIT0gTk9UX0lOVVNFKSAmJiAhcC0+UklPSGFsdGVkICkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIldhaXRpbmcgZm9yIG5vdCBpbiB1c2UgKCVkKVxuIiwgCi0JCQkJCSAgIHJldHJpZXMpOworCSAqKiBJZiB0aGUgcG9ydCBpcyBpbiB1c2UgZm9yIHByZS1lbXB0aXZlIGNvbW1hbmQsIHRoZW4gd2FpdCBmb3IgaXQgdG8KKwkgKiogYmUgZnJlZSBhZ2Fpbi4KKwkgKi8KKwl3aGlsZSAoKFBvcnRQLT5JblVzZSAhPSBOT1RfSU5VU0UpICYmICFwLT5SSU9IYWx0ZWQpIHsKKwkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RUWSwgIldhaXRpbmcgZm9yIG5vdCBpbiB1c2UgKCVkKVxuIiwgcmV0cmllcyk7CiAJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwogCQlpZiAocmV0cmllcy0tIDw9IDApIHsKIAkJCXJldHVybiBSSU9fRkFJTDsKQEAgLTgyNCw0NyArNjk1LDQ3IEBACiAJCX0KIAkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwogCX0KLQlpZiAoIFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEICkgewotCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlNob3J0IGNvbW1hbmQgdG8gZGVsZXRlZCBSVEEgaWdub3JlZFxuIik7CisJaWYgKFBvcnRQLT5TdGF0ZSAmIFJJT19ERUxFVEVEKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UVFksICJTaG9ydCBjb21tYW5kIHRvIGRlbGV0ZWQgUlRBIGlnbm9yZWRcbiIpOwogCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKIAkJcmV0dXJuIFJJT19GQUlMOwogCX0KIAotCXdoaWxlICggIWNhbl9hZGRfdHJhbnNtaXQoJlBhY2tldFAsUG9ydFApICYmICFwLT5SSU9IYWx0ZWQgKSB7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiV2FpdGluZyB0byBhZGQgc2hvcnQgY29tbWFuZCB0byBxdWV1ZSAoJWQpXG4iLCByZXRyaWVzKTsKKwl3aGlsZSAoIWNhbl9hZGRfdHJhbnNtaXQoJlBhY2tldFAsIFBvcnRQKSAmJiAhcC0+UklPSGFsdGVkKSB7CisJCXJpb19kcHJpbnRrKFJJT19ERUJVR19UVFksICJXYWl0aW5nIHRvIGFkZCBzaG9ydCBjb21tYW5kIHRvIHF1ZXVlICglZClcbiIsIHJldHJpZXMpOwogCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKIAkJaWYgKHJldHJpZXMtLSA8PSAwKSB7Ci0JCSAgcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJvdXQgb2YgdHJpZXMuIEZhaWxpbmdcbiIpOworCQkJcmlvX2RwcmludGsoUklPX0RFQlVHX1RUWSwgIm91dCBvZiB0cmllcy4gRmFpbGluZ1xuIik7CiAJCQlyZXR1cm4gUklPX0ZBSUw7CiAJCX0KLQkJaWYgKCBSSU9EZWxheV9uaShQb3J0UCwgSFVORFJFRF9NUyk9PVJJT19GQUlMICkgeworCQlpZiAoUklPRGVsYXlfbmkoUG9ydFAsIEhVTkRSRURfTVMpID09IFJJT19GQUlMKSB7CiAJCQlyZXR1cm4gUklPX0ZBSUw7CiAJCX0KIAkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwogCX0KIAotCWlmICggcC0+UklPSGFsdGVkICkgeworCWlmIChwLT5SSU9IYWx0ZWQpIHsKIAkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CiAJCXJldHVybiBSSU9fRkFJTDsKIAl9CiAKIAkvKgotCSoqIHNldCB0aGUgY29tbWFuZCBieXRlIGFuZCB0aGUgYXJndW1lbnQgYnl0ZQotCSovCi0JV0JZVEUoUGFja2V0UC0+ZGF0YVswXSAsIGNvbW1hbmQpOworCSAqKiBzZXQgdGhlIGNvbW1hbmQgYnl0ZSBhbmQgdGhlIGFyZ3VtZW50IGJ5dGUKKwkgKi8KKwlXQllURShQYWNrZXRQLT5kYXRhWzBdLCBjb21tYW5kKTsKIAotCWlmICggbGVuPT0yICkKLQkJV0JZVEUoUGFja2V0UC0+ZGF0YVsxXSAsIGFyZyk7CisJaWYgKGxlbiA9PSAyKQorCQlXQllURShQYWNrZXRQLT5kYXRhWzFdLCBhcmcpOwogCiAJLyoKLQkqKiBzZXQgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IGFuZCBzZXQgdGhlIGNvbW1hbmQgYml0LgotCSovCi0JV0JZVEUoUGFja2V0UC0+bGVuICwgUEtUX0NNRF9CSVQgfCBsZW4pOworCSAqKiBzZXQgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IGFuZCBzZXQgdGhlIGNvbW1hbmQgYml0LgorCSAqLworCVdCWVRFKFBhY2tldFAtPmxlbiwgUEtUX0NNRF9CSVQgfCBsZW4pOwogCiAJYWRkX3RyYW5zbWl0KFBvcnRQKTsKIAkvKgotCSoqIENvdW50IGNoYXJhY3RlcnMgdHJhbnNtaXR0ZWQgZm9yIHBvcnQgc3RhdGlzdGljcyByZXBvcnRpbmcKLQkqLworCSAqKiBDb3VudCBjaGFyYWN0ZXJzIHRyYW5zbWl0dGVkIGZvciBwb3J0IHN0YXRpc3RpY3MgcmVwb3J0aW5nCisJICovCiAJaWYgKFBvcnRQLT5zdGF0c0dhdGhlcikKIAkJUG9ydFAtPnR4Y2hhcnMgKz0gbGVuOwogCkBAIC04NzMsNTAxICs3NDQsMyBAQAogfQogCiAKLSNpZiAwCi0vKgotKiogVGhpcyBpcyBhbiBpb2N0bCBpbnRlcmZhY2UuIFRoaXMgaXMgdGhlIHR3ZW50aWV0aCBjZW50dXJ5LiBZb3Uga25vdyB3aGF0Ci0qKiBpdHMgYWxsIGFib3V0LgotKi8KLWludAotcmlvdGlvY3RsKHN0cnVjdCByaW9faW5mbyAqcCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGNtZCwgY2FkZHJfdCBhcmcpCi17Ci0JcmVnaXN0ZXIgc3RydWN0CQlQb3J0ICpQb3J0UDsKLQlyZWdpc3RlciBzdHJ1Y3QJCXR0eXN0YXRpY3MgKnRwOwotCWludAkJCQkJY3VycmVudDsKLQlpbnQJCQkJCVBhcmFtU2VtSW5jcmVtZW50ZWQgPSAwOwotCWludAkJCQkJb2xkX29mbGFnLCBvbGRfY2ZsYWcsIG9sZF9pZmxhZywgY2hhbmdlZCwgb2xkY29vazsKLQlpbnQJCQkJCWk7Ci0JdW5zaWduZWQgY2hhcgkJc2lvX3JlZ3NbNV07CQkvKiBIZXJlIGJlIG1hZ2ljICovCi0Jc2hvcnQJCQkJdnBpeF9jZmxhZzsKLQlzaG9ydAkJCQlkaXZpc29yOwotCWludAkJCQkJYmF1ZDsKLQl1aW50CQkJCVN5c1BvcnQgPSByaW9fbWlub3IodHR5KTsKLQlpbnQJCQkJTW9kZW0gPSByaW9faXNtb2RlbSh0dHkpOwotCWludAkJCQkJaW9jdGxfcHJvY2Vzc2VkOwotCi0JcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJwb3J0IGlvY3RsIFN5c1BvcnQgJWQgY29tbWFuZCAweCV4IGFyZ3VtZW50IDB4JXggJXNcbiIsCi0JCQlTeXNQb3J0LCBjbWQsIGFyZywgTW9kZW0/Ik1vZGVtIjoidHR5IikgOwotCi0JaWYgKCBTeXNQb3J0ID49IFJJT19QT1JUUyApIHsKLQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJCYWQgcG9ydCBudW1iZXIgJWRcbiIsIFN5c1BvcnQpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCVBvcnRQID0gcC0+UklPUG9ydHBbU3lzUG9ydF07Ci0JdHAgPSBQb3J0UC0+VHR5UDsKLQotCXJpb19zcGluX2xvY2tfaXJxc2F2ZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKLQotI2lmZGVmIFNUQVRTCi0JUG9ydFAtPlN0YXQuSW9jdGxDbnQrKzsKLSNlbmRpZgotCi0JaWYgKCBQb3J0UC0+U3RhdGUgJiBSSU9fREVMRVRFRCApIHsKLQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCi0JaWYgKCBwLT5SSU9IYWx0ZWQgKSB7Ci0JCVJJT0NsZWFyVXAoIFBvcnRQICk7Ci0JCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKgotCSoqIENvdW50IGlvY3RscyBmb3IgcG9ydCBzdGF0aXN0aWNzIHJlcG9ydGluZwotCSovCi0JaWYgKFBvcnRQLT5zdGF0c0dhdGhlcikKLQkJUG9ydFAtPmlvY3RscysrOwotCi0JLyoKLQkqKiBTcGVjaWFsaXggUklPIElvY3RsIGNhbGxzCi0JKi8KLQlzd2l0Y2ggKGNtZCkgewotCi0JCWNhc2UgVENSSU9UUklBRDoKLQkJCWlmICggYXJnICkKLQkJCQlQb3J0UC0+U3RhdGUgfD0gUklPX1RSSUFEX01PREU7Ci0JCQllbHNlCi0JCQkJUG9ydFAtPlN0YXRlICY9IH5SSU9fVFJJQURfTU9ERTsKLQkJCS8qCi0JCQkqKiBOb3JtYWxseSwgd2hlbiBpc3RyaXAgaXMgc2V0IG9uIGEgcG9ydCwgYSBjb25maWcgaXMKLQkJCSoqIHNlbnQgdG8gdGhlIFJUQSBpbnN0cnVjdGluZyB0aGUgQ0QxNDAwIHRvIGRvIHRoZQotCQkJKiogc3RyaXBwaW5nLiBJbiBUUklBRCBtb2RlLCB0aGUgaW50ZXJydXB0IHJlY2VpdmUgcm91dGluZQotCQkJKiogbXVzdCBkbyB0aGUgc3RyaXBwaW5nIGluc3RlYWQsIHNpbmNlIGl0IGhhcyB0byBkZXRlY3QKLQkJCSoqIGFuIDggYml0IGZ1bmN0aW9uIGtleSBzZXF1ZW5jZS4gSWYgaXN0cmlwIGlzIHNldCB3aXRoCi0JCQkqKiBUUklBRCBtb2RlIG9uKG9mZiksIGFuZCA4IGJpdCBkYXRhIGlzIGJlaW5nIHJlYWQgYnkKLQkJCSoqIHRoZSBwb3J0LCB0aGUgdXNlciB0aGVuIHR1cm5zIFRSSUFEIG1vZGUgb2ZmKG9uKSwgdGhlIFJUQQotCQkJKiogbXVzdCBiZSByZWNvbmZpZ3VyZWQgKG5vdCkgdG8gZG8gdGhlIHN0cmlwcGluZy4KLQkJCSoqIEhlbmNlIHdlIGNhbGwgUklPUGFyYW0gaGVyZS4KLQkJCSovCi0JCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKLQkJCVJJT1BhcmFtKFBvcnRQLENPTkZJRyxNb2RlbSxPS19UT19TTEVFUCk7CQotCQkJcmV0dXJuIDA7Ci0KLQkJY2FzZSBUQ1JJT1RTVEFURToKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAidGJ1c3kvdHN0b3AgbW9uaXRvcmluZyAlc2FibGVkXG4iLAotCQkgCQlhcmcgPyAiZW4iIDogImRpcyIpOwotCQkJLyogTW9uaXRvclRzdGF0ZSA9IDAgOyovCi0JCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKLQkJCVJJT1BhcmFtKFBvcnRQLCBDT05GSUcsIE1vZGVtLCBPS19UT19TTEVFUCk7Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIFRDUklPU1RBVEU6IC8qIGN1cnJlbnQgc3RhdGUgb2YgTW9kZW0gaW5wdXQgcGlucyAqLwotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT1NUQVRFXG4iKTsKLQkJCWlmIChSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLCBNR0VUKSA9PSBSSU9fRkFJTCkKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRDUklPU1RBVEUgY29tbWFuZCBmYWlsZWRcbiIpOwotCQkJUG9ydFAtPlN0YXRlIHw9IFJJT19CVVNZOwotCQkJY3VycmVudCA9IFBvcnRQLT5Nb2RlbVN0YXRlOwotCQkJaWYgKCBjb3B5b3V0KChjYWRkcl90KSZjdXJyZW50LCAoaW50KWFyZywKLQkJCQkJCQlzaXplb2YoY3VycmVudCkpPT1DT1BZRkFJTCApIHsKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNvcHlvdXQgZmFpbGVkXG4iKTsKLQkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKLQkJCQlwc2V0ZXJyKEVGQVVMVCk7Ci0JCQl9Ci0JCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKLQkJCXJldHVybiAwOwotCi0JCWNhc2UgVENSSU9NQklTOgkJLyogU2V0IG1vZGVtIGxpbmVzICovCi0JCWNhc2UgVENSSU9NQklDOgkJLyogQ2xlYXIgbW9kZW0gbGluZXMgKi8KLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9NQklTL1RDUklPTUJJQ1xuIik7Ci0JCQlpZiAoY21kID09IFRDUklPTUJJUykgewotCQkJCXVpbnQJCXN0YXRlOwotCQkJCXN0YXRlID0gKHVpbnQpYXJnOwotCQkJCVBvcnRQLT5Nb2RlbVN0YXRlIHw9ICh1c2hvcnQpc3RhdGU7Ci0JCQkJUG9ydFAtPk1vZGVtTGluZXMgPSAodWxvbmcpIGFyZzsKLQkJCQlpZiAoUklPUHJlZW1wdGl2ZUNtZChwLCBQb3J0UCwgTUJJUykgPT0gUklPX0ZBSUwpCi0JCQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAKLQkJCQkJICJUQ1JJT01CSVMgY29tbWFuZCBmYWlsZWRcbiIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdWludAkJc3RhdGU7Ci0KLQkJCQlzdGF0ZSA9ICh1aW50KWFyZzsKLQkJCQlQb3J0UC0+TW9kZW1TdGF0ZSAmPSB+KHVzaG9ydClzdGF0ZTsKLQkJCQlQb3J0UC0+TW9kZW1MaW5lcyA9ICh1bG9uZykgYXJnOwotCQkJCWlmIChSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLCBNQklDKSA9PSBSSU9fRkFJTCkKLQkJCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT01CSUMgY29tbWFuZCBmYWlsZWRcbiIpOwotCQkJfQotCQkJUG9ydFAtPlN0YXRlIHw9IFJJT19CVVNZOwotCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIFRDUklPWFBPTjogLyogc2V0IFhwcmludCBPTiBzdHJpbmcgKi8KLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9YUE9OXG4iKTsKLQkJCWlmICggY29weWluKChpbnQpYXJnLCAoY2FkZHJfdClQb3J0UC0+WHByaW50LlhwT24sCi0JCQkJCQlNQVhfWFBfQ1RSTF9MRU4pPT1DT1BZRkFJTCApIHsKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNvcHlpbiBmYWlsZWRcbiIpOwotCQkJCVBvcnRQLT5YcHJpbnQuWHBPblswXSA9ICdcMCc7Ci0JCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JCQkJcHNldGVycihFRkFVTFQpOwotCQkJfQotCQkJUG9ydFAtPlhwcmludC5YcE9uW01BWF9YUF9DVFJMX0xFTi0xXSA9ICdcMCc7Ci0JCQlQb3J0UC0+WHByaW50LlhwTGVuID0gc3RybGVuKFBvcnRQLT5YcHJpbnQuWHBPbikrCi0JCQkJCQkJCQkJCQlzdHJsZW4oUG9ydFAtPlhwcmludC5YcE9mZik7Ci0JCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKLQkJCXJldHVybiAwOwotCi0JCWNhc2UgVENSSU9YUE9GRjogLyogc2V0IFhwcmludCBPRkYgc3RyaW5nICovCi0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRDUklPWFBPRkZcbiIpOwotCQkJaWYgKCBjb3B5aW4oIChpbnQpYXJnLCAoY2FkZHJfdClQb3J0UC0+WHByaW50LlhwT2ZmLAotCQkJCQkJTUFYX1hQX0NUUkxfTEVOKT09Q09QWUZBSUwgKSB7Ci0JCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJDb3B5aW4gZmFpbGVkXG4iKTsKLQkJCQlQb3J0UC0+WHByaW50LlhwT2ZmWzBdID0gJ1wwJzsKLQkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKLQkJCQlwc2V0ZXJyKEVGQVVMVCk7Ci0JCQl9Ci0JCQlQb3J0UC0+WHByaW50LlhwT2ZmW01BWF9YUF9DVFJMX0xFTi0xXSA9ICdcMCc7Ci0JCQlQb3J0UC0+WHByaW50LlhwTGVuID0gc3RybGVuKFBvcnRQLT5YcHJpbnQuWHBPbikrCi0JCQkJCQkJCQkJc3RybGVuKFBvcnRQLT5YcHJpbnQuWHBPZmYpOwotCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIFRDUklPWFBDUFM6IC8qIHNldCBYcHJpbnQgQ1BTIHN0cmluZyAqLwotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT1hQQ1BTXG4iKTsKLQkJCWlmICggKHVpbnQpYXJnID4gcC0+UklPQ29uZi5NYXhYcENwcyB8fCAKLQkJCQkJKHVpbnQpYXJnIDwgcC0+UklPQ29uZi5NaW5YcENwcyApIHsKLQkJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIiVkIENQUyBvdXQgb2YgcmFuZ2VcbiIsYXJnKTsKLQkJCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKLQkJCQlwc2V0ZXJyKEVJTlZBTCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlQb3J0UC0+WHByaW50LlhwQ3BzID0gKHVpbnQpYXJnOwotCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIFRDUklPWFBSSU5UOgotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT1hQUklOVFxuIik7Ci0JCQlpZiAoIGNvcHlvdXQoKGNhZGRyX3QpJlBvcnRQLT5YcHJpbnQsIChpbnQpYXJnLAotCQkJCQlzaXplb2Yoc3RydWN0IFhwcmludCkpPT1DT1BZRkFJTCApIHsKLQkJCSAgICAgICAgcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JCQkJcHNldGVycihFRkFVTFQpOwotCQkJfQotCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIFRDUklPSVhBTllPTjoKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9JWEFOWU9OXG4iKTsKLQkJCVBvcnRQLT5Db25maWcgfD0gUklPX0lYQU5ZOwotCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIFRDUklPSVhBTllPRkY6Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRDUklPSVhBTllPRkZcbiIpOwotCQkJUG9ydFAtPkNvbmZpZyAmPSB+UklPX0lYQU5ZOwotCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIFRDUklPSVhPTk9OOgotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT0lYT05PTlxuIik7Ci0JCQlQb3J0UC0+Q29uZmlnIHw9IFJJT19JWE9OOwotCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIFRDUklPSVhPTk9GRjoKLQkJCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiVENSSU9JWE9OT0ZGXG4iKTsKLQkJCVBvcnRQLT5Db25maWcgJj0gflJJT19JWE9OOwotCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JCQlyZXR1cm4gMDsKLQotLyoKLSoqIDE1LjEwLjE5OTggQVJHIC0gRVNJTCAwNzYxIHBhcnQgZml4Ci0qKiBBZGRlZCBzdXBwb3J0IGZvciBDVFMgYW5kIFJUUyBmbG93IGNvbnRyb2wgaW9jdGxzIDoKLSovCi0JCWNhc2UgVENSSU9DVFNGTE9XRU46Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRDUklPQ1RTRkxPV0VOXG4iKTsKLQkJCVBvcnRQLT5Db25maWcgfD0gUklPX0NUU0ZMT1c7Ci0JCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKLQkJCVJJT1BhcmFtKFBvcnRQLENPTkZJRyxNb2RlbSxPS19UT19TTEVFUCk7CQotCQkJcmV0dXJuIDA7Ci0KLQkJY2FzZSBUQ1JJT0NUU0ZMT1dESVM6Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIlRDUklPQ1RTRkxPV0RJU1xuIik7Ci0JCQlQb3J0UC0+Q29uZmlnICY9IH5SSU9fQ1RTRkxPVzsKLQkJCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwotCQkJUklPUGFyYW0oUG9ydFAsQ09ORklHLE1vZGVtLE9LX1RPX1NMRUVQKTsJCi0JCQlyZXR1cm4gMDsKLQotCQljYXNlIFRDUklPUlRTRkxPV0VOOgotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT1JUU0ZMT1dFTlxuIik7Ci0JCQlQb3J0UC0+Q29uZmlnIHw9IFJJT19SVFNGTE9XOwotCQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JCQlSSU9QYXJhbShQb3J0UCxDT05GSUcsTW9kZW0sT0tfVE9fU0xFRVApOwkKLQkJCXJldHVybiAwOwotCi0JCWNhc2UgVENSSU9SVFNGTE9XRElTOgotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJUQ1JJT1JUU0ZMT1dESVNcbiIpOwotCQkJUG9ydFAtPkNvbmZpZyAmPSB+UklPX1JUU0ZMT1c7Ci0JCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKLQkJCVJJT1BhcmFtKFBvcnRQLENPTkZJRyxNb2RlbSxPS19UT19TTEVFUCk7CQotCQkJcmV0dXJuIDA7Ci0KLS8qIGVuZCBFU0lMIDA3NjEgcGFydCBmaXggKi8KLQotCX0KLQotCi0JLyogTHlueCBJT0NUTFMgKi8KLQlzd2l0Y2ggKGNtZCkgewotCQljYXNlIFRJT0NTRVRQOgotCQljYXNlIFRJT0NTRVROOgotCQljYXNlIE9USU9DU0VUUDoKLQkJY2FzZSBPVElPQ1NFVE46Ci0JCQlpb2N0bF9wcm9jZXNzZWQrKzsKLQkJCXR0eXNldGgoUG9ydFAsIHRwLCAoc3RydWN0IG9sZF9zZ3R0eWIgKilhcmcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVENTRVRBOgotCQljYXNlIFRDU0VUQVc6Ci0JCWNhc2UgVENTRVRBRjoKLQkJCWlvY3RsX3Byb2Nlc3NlZCsrOwotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJOT04gUE9TSVggaW9jdGxcbiIpOwotCQkJdHR5c2V0aF9wdihQb3J0UCwgdHAsIChzdHJ1Y3QgdGVybWlvcyAqKWFyZywgMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBUQ1NFVEFQOgkvKiBwb3NpeCB0Y3NldGF0dHIoKSAqLwotCQljYXNlIFRDU0VUQVdQOgkvKiBwb3NpeCB0Y3NldGF0dHIoKSAqLwotCQljYXNlIFRDU0VUQUZQOgkvKiBwb3NpeCB0Y3NldGF0dHIoKSAqLwotCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJOT04gUE9TSVggU1lTViBpb2N0bFxuIik7Ci0JCQl0dHlzZXRoX3B2KFBvcnRQLCB0cCwgKHN0cnVjdCB0ZXJtaW9zICopYXJnLCAxKTsKLQkJCWlvY3RsX3Byb2Nlc3NlZCsrOwotCQkJYnJlYWs7Ci0JfQotCi0JLyoKLQkqKiBJZiBpdHMgYW55IG9mIHRoZSBjb21tYW5kcyB0aGF0IHJlcXVpcmUgdGhlIHBvcnQgdG8gYmUgaW4gdGhlCi0JKiogbm9uLWJ1c3kgc3RhdGUgd2FpdCB1bnRpbCBhbGwgb3V0cHV0IGhhcyBkcmFpbmVkIAotCSovCi0JaWYgKCFpb2N0bF9wcm9jZXNzZWQpCi0Jc3dpdGNoKGNtZCkgewotCQljYXNlIFRDU0VUQVc6Ci0JCWNhc2UgVENTRVRBRjoKLQkJY2FzZSBUQ1NFVEE6Ci0JCWNhc2UgVENTQlJLOgotI2RlZmluZSBPTERfUE9TSVggKCd4JyA8PCA4KQotI2RlZmluZSBPTERfUE9TSVhfU0VUQSAoT0xEX1BPU0lYIHwgMikKLSNkZWZpbmUgT0xEX1BPU0lYX1NFVEFXIChPTERfUE9TSVggfCAzKQotI2RlZmluZSBPTERfUE9TSVhfU0VUQUYgKE9MRF9QT1NJWCB8IDQpCi0jZGVmaW5lIE5FV19QT1NJWCAoKCdpJyA8PCAyNCkgfCAoJ1gnIDw8IDE2KSkKLSNkZWZpbmUgTkVXX1BPU0lYX1NFVEEgKE5FV19QT1NJWCB8IDIpCi0jZGVmaW5lIE5FV19QT1NJWF9TRVRBVyAoTkVXX1BPU0lYIHwgMykKLSNkZWZpbmUgTkVXX1BPU0lYX1NFVEFGIChORVdfUE9TSVggfCA0KQotCQljYXNlIE9MRF9QT1NJWF9TRVRBOgotCQljYXNlIE9MRF9QT1NJWF9TRVRBVzoKLQkJY2FzZSBPTERfUE9TSVhfU0VUQUY6Ci0JCWNhc2UgTkVXX1BPU0lYX1NFVEE6Ci0JCWNhc2UgTkVXX1BPU0lYX1NFVEFXOgotCQljYXNlIE5FV19QT1NJWF9TRVRBRjoKLSNpZmRlZiBUSU9DU0VUUAotCQljYXNlIFRJT0NTRVRQOgotI2VuZGlmCi0JCWNhc2UgVElPQ1NFVEQ6Ci0JCWNhc2UgVElPQ1NFVE46Ci0JCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIndhaXQgZm9yIG5vbi1CVVNZLCBzZW1hcGhvcmUgc2V0XG4iKTsKLQkJCS8qCi0JCQkqKiBXYWl0IGZvciBkcmFpbiBoZXJlLCBhdCBsZWFzdCBhcyBmYXIgYXMgdGhlIGRvdWJsZSBidWZmZXIKLQkJCSoqIGJlaW5nIGVtcHR5LgotCQkJKi8KLQkJCS8qIFhYWCBEb2VzIHRoZSBhYm92ZSBjb21tZW50IG1lYW4gdGhhdCB0aGlzIGhhcwotCQkJICAgc3RpbGwgdG8gYmUgaW1wbGVtZW50ZWQ/IC0tIFJFVyAqLwotCQkJLyogWFhYIElzIHRoZSBsb2NraW5nIE9LIHRvZ2V0aGVyIHdpdGggbG9ja2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdHhlbmFibGU/IChEZWFkbG9jaz8pIC0tIFJFVyAqLwotCQkJCi0JCQlSSU9UeEVuYWJsZSgoY2hhciAqKVBvcnRQKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotCi0Jb2xkX2NmbGFnID0gdHAtPnRtLmNfY2ZsYWc7Ci0Jb2xkX2lmbGFnID0gdHAtPnRtLmNfaWZsYWc7Ci0Jb2xkX29mbGFnID0gdHAtPnRtLmNfb2ZsYWc7Ci0Jb2xkY29vayA9IFBvcnRQLT5Db29rTW9kZTsKLQotCWlmICggcC0+UklPSGFsdGVkICkgewotCQlSSU9DbGVhclVwKCBQb3J0UCApOwotCQlyaW9fc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmUG9ydFAtPnBvcnRTZW0sIGZsYWdzKTsKLQkJcHNldGVycihFSU8pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlQb3J0UC0+Rmx1c2hDbWRCb2RnZSA9IDA7Ci0KLQkvKgotCSoqIElmIHRoZSBwb3J0IGlzIGxvY2tlZCwgYW5kIGl0IGlzIHJlY29uZmlndXJlZCwgd2Ugd2FudAotCSoqIHRvIHJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSB0dHkgc3RydWN0dXJlIHNvIHRoZSBjaGFuZ2UgaXMgTk9UCi0JKiogbWFkZS4KLQkqLwotCWlmIChQb3J0UC0+TG9jaykgewotCQl0cC0+dG0uY19pZmxhZyA9IFBvcnRQLT5TdG9yZWRUdHkuaWZsYWc7Ci0JCXRwLT50bS5jX29mbGFnID0gUG9ydFAtPlN0b3JlZFR0eS5vZmxhZzsKLQkJdHAtPnRtLmNfY2ZsYWcgPSBQb3J0UC0+U3RvcmVkVHR5LmNmbGFnOwotCQl0cC0+dG0uY19sZmxhZyA9IFBvcnRQLT5TdG9yZWRUdHkubGZsYWc7Ci0JCXRwLT50bS5jX2xpbmUgPSBQb3J0UC0+U3RvcmVkVHR5LmxpbmU7Ci0JCWZvciAoaSA9IDA7IGkgPCBOQ0MgKyAxOyBpKyspCi0JCQl0cC0+dG0uY19jY1tpXSA9IFBvcnRQLT5TdG9yZWRUdHkuY2NbaV07Ci0JfQotCWVsc2UgewotCQkvKgotCQkqKiBJZiB0aGUgcG9ydCBpcyBzZXQgdG8gc3RvcmUgdGhlIHBhcmFtZXRlcnMsIGFuZCBpdCBpcwotCQkqKiByZWNvbmZpZ3VyZWQsIHdlIHdhbnQgdG8gc2F2ZSB0aGUgY3VycmVudCB0dHkgc3RydWN0IHNvIGl0Ci0JCSoqIG1heSBiZSByZXN0b3JlZCBvbiB0aGUgbmV4dCBvcGVuLgotCQkqLwotCQlpZiAoUG9ydFAtPlN0b3JlKSB7Ci0JCQlQb3J0UC0+U3RvcmVkVHR5LmlmbGFnID0gdHAtPnRtLmNfaWZsYWc7Ci0JCQlQb3J0UC0+U3RvcmVkVHR5Lm9mbGFnID0gdHAtPnRtLmNfb2ZsYWc7Ci0JCQlQb3J0UC0+U3RvcmVkVHR5LmNmbGFnID0gdHAtPnRtLmNfY2ZsYWc7Ci0JCQlQb3J0UC0+U3RvcmVkVHR5LmxmbGFnID0gdHAtPnRtLmNfbGZsYWc7Ci0JCQlQb3J0UC0+U3RvcmVkVHR5LmxpbmUgPSB0cC0+dG0uY19saW5lOwotCQkJZm9yIChpID0gMDsgaSA8IE5DQyArIDE7IGkrKykKLQkJCQlQb3J0UC0+U3RvcmVkVHR5LmNjW2ldID0gdHAtPnRtLmNfY2NbaV07Ci0JCX0KLQl9Ci0KLQljaGFuZ2VkID0gKHRwLT50bS5jX2NmbGFnICE9IG9sZF9jZmxhZykgfHwKLQkJCQkodHAtPnRtLmNfaWZsYWcgIT0gb2xkX2lmbGFnKSB8fAotCQkJCSh0cC0+dG0uY19vZmxhZyAhPSBvbGRfb2ZsYWcpOwotCi0JUG9ydFAtPkNvb2tNb2RlID0gUklPQ29va01vZGUodHApOwkvKiBTZXQgbmV3IGNvb2tpbmcgbW9kZSAqLwotCi0JcmlvX2RwcmludGsgKFJJT19ERUJVR19UVFksICJSSU9Jb2N0bCBjaGFuZ2VkICVkIG5ld2Nvb2sgJWQgb2xkY29vayAlZFxuIiwKLQkJCWNoYW5nZWQsUG9ydFAtPkNvb2tNb2RlLG9sZGNvb2spOwotCi0jaWZkZWYgTU9ERU1fU1VQUE9SVAotCS8qCi0JKioga2x1ZGdlIHRvIGZvcmNlIENBUlJfT04gaWYgQ0xPQ0FMIHNldAotCSovCi0JaWYgKCh0cC0+dG0uY19jZmxhZyAmIENMT0NBTCkgfHwgKFBvcnRQLT5Nb2RlbVN0YXRlICYgTVNWUjFfQ0QpKQl7Ci0JCXRwLT50bS5jX3N0YXRlIHw9IENBUlJfT047Ci0JCXdha2V1cCAoKGNhZGRyX3QpJnRwLT50bS5jX2NhbnEpOwotCX0KLSNlbmRpZgotCi0JaWYgKCBwLT5SSU9IYWx0ZWQgKSB7Ci0JCVJJT0NsZWFyVXAoIFBvcnRQICk7Ci0JCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwotCQlwc2V0ZXJyKEVJTyk7Ci0JCXJldHVybiAwOwotCX0KLQkvKgotCSoqIFJlLWNvbmZpZ3VyZSBpZiBtb2RlcyBvciBjb29raW5nIGhhdmUgY2hhbmdlZAotCSovCi0JaWYgKGNoYW5nZWQgfHwgb2xkY29vayAhPSBQb3J0UC0+Q29va01vZGUgfHwgKGlvY3RsX3Byb2Nlc3NlZCkpIHsKLQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JCXJpb19kcHJpbnRrIChSSU9fREVCVUdfVFRZLCAiSW9jdGwgY2hhbmdpbmcgdGhlIFBPUlQgc2V0dGluZ3NcbiIpOwotCQlSSU9QYXJhbShQb3J0UCxDT05GSUcsTW9kZW0sT0tfVE9fU0xFRVApOwkKLQkJcmlvX3NwaW5fbG9ja19pcnFzYXZlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwotCX0KLQotCWlmIChwLT5SSU9IYWx0ZWQpIHsKLQkJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7Ci0JCVJJT0NsZWFyVXAoIFBvcnRQICk7Ci0JCXBzZXRlcnIoRUlPKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJpb19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZQb3J0UC0+cG9ydFNlbSwgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi0vKgotCXR0eXNldGggLS0gc2V0IGhhcmR3YXJlIGRlcGVuZGVudCB0dHkgc2V0dGluZ3MKLSovCi12b2lkCi10dHlzZXRoKFBvcnRQLCBzLCBzZykKLXN0cnVjdCBQb3J0ICoJCVBvcnRQOwotc3RydWN0IHR0eXN0YXRpY3MgKgkJczsKLXN0cnVjdCBvbGRfc2d0dHliICpzZzsKLXsKLQlzdHJ1Y3Qgb2xkX3NndHR5YiAqCXRzZzsKLQlzdHJ1Y3QgdGVybWlvcyAqdHAgPSAmcy0+dG07Ci0KLQl0c2cgPSAmcy0+c2c7Ci0KLQlpZiAoc2ctPnNnX2ZsYWdzICYgKEVWRU5QfE9ERFApKSAgewotCQl0cC0+Y19jZmxhZyAmPSBQQVJFTkI7Ci0JCWlmIChzZy0+c2dfZmxhZ3MgJiBFVkVOUCkgewotCQkJaWYgKHNnLT5zZ19mbGFncyAmIE9ERFApIHsKLQkJCQl0cC0+Y19jZmxhZyAmPSBWX0NTNzsKLQkJCQl0cC0+Y19jZmxhZyAmPSB+UEFSRU5COwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdHAtPmNfY2ZsYWcgJj0gVl9DUzc7Ci0JCQkJdHAtPmNfY2ZsYWcgJj0gUEFSRU5COwotCQkJCXRwLT5jX2NmbGFnICY9IFBBUk9ERDsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChzZy0+c2dfZmxhZ3MgJiBPRERQKSB7Ci0JCQl0cC0+Y19jZmxhZyAmPSBWX0NTNzsKLQkJCXRwLT5jX2NmbGFnICY9IFBBUkVOQjsKLQkJCXRwLT5jX2NmbGFnICY9IFBBUk9ERDsKLQkJfQotCQllbHNlIHsKLQkJCXRwLT5jX2NmbGFnICY9IFZfQ1M3OwotCQkJdHAtPmNfY2ZsYWcgJj0gUEFSRU5COwotCQl9Ci0JfQotLyoKLSAqIFVzZSBpc3BlZWQgYXMgdGhlIGRlc2lyZWQgc3BlZWQuICBNb3N0IGltcGxlbWVudGF0aW9ucyBkb24ndCBoYW5kbGUgCi0gKiBzZXBhcmF0ZSBpbnB1dCBhbmQgb3V0cHV0IHNwZWVkcyB2ZXJ5IHdlbGwuIElmIHRoZSBSSU8gaGFuZGxlcyB0aGlzLCAKLSAqIEkgd2lsbCBoYXZlIHRvIHVzZSBzZXBhcmF0ZSBzZXRzIG9mIGZsYWdzIHRvIHN0b3JlIHRoZW0gaW4gdGhlIAotICogUG9ydCBzdHJ1Y3R1cmUuCi0gKi8KLQlpZiAoICFzZy0+c2dfb3NwZWVkICkKLQkJc2ctPnNnX29zcGVlZCA9IHNnLT5zZ19pc3BlZWQ7Ci0JZWxzZQotCQlzZy0+c2dfaXNwZWVkID0gc2ctPnNnX29zcGVlZDsKLQlpZiAoc2ctPnNnX2lzcGVlZCA+IFZfRVhUQiApIAotCQlzZy0+c2dfaXNwZWVkID0gVl9FWFRCOwotCWlmIChzZy0+c2dfaXNwZWVkIDwgVl9CMCkKLQkJc2ctPnNnX2lzcGVlZCA9IFZfQjA7Ci0JKnRzZyA9ICpzZzsKLSAgIHRwLT5jX2NmbGFnID0gKHRwLT5jX2NmbGFnICYgflZfQ0JBVUQpIHwgY29udl9idlsoaW50KXNnLT5zZ19pc3BlZWRdOwotfQotCi0vKgotCXR0eXNldGhfcHYgLS0gc2V0IGhhcmR3YXJlIGRlcGVuZGVudCB0dHkgc2V0dGluZ3MgdXNpbmcgZWl0aGVyIHRoZQotCQkJUE9TSVggdGVybWlvcyBzdHJ1Y3R1cmUgb3IgdGhlIFN5c3RlbSBWIHRlcm1pbyBzdHJ1Y3R1cmUuCi0JCQkJc3lzdiA9IDAgPT4gKFBPU0lYKToJIHN0cnVjdCB0ZXJtaW9zICpzZwotCQkJCXN5c3YgIT0gMCA9PiAoU3lzdGVtIFYpOiBzdHJ1Y3QgdGVybWlvICpzZwotKi8KLXN0YXRpYyB2b2lkCi10dHlzZXRoX3B2KFBvcnRQLCBzLCBzZywgc3lzdikKLXN0cnVjdCBQb3J0ICpQb3J0UDsKLXN0cnVjdCB0dHlzdGF0aWNzICpzOwotc3RydWN0IHRlcm1pb3MgKnNnOwotaW50IHN5c3Y7Ci17Ci0gICAgaW50IHNwZWVkOwotICAgIHVuc2lnbmVkIGNoYXIgY3NpemU7Ci0gICAgdW5zaWduZWQgY2hhciBjcmVhZDsKLSAgICB1bnNpZ25lZCBpbnQgbGNyX2ZsYWdzOwotICAgIGludCBwczsKLSAKLSAgICBpZiAoc3lzdikgewotICAgICAgICAvKiBzZyBwb2ludHMgdG8gYSBTeXN0ZW0gViB0ZXJtaW8gc3RydWN0dXJlICovCi0gICAgICAgIGNzaXplID0gKChzdHJ1Y3QgdGVybWlvICopc2cpLT5jX2NmbGFnICYgQ1NJWkU7Ci0gICAgICAgIGNyZWFkID0gKChzdHJ1Y3QgdGVybWlvICopc2cpLT5jX2NmbGFnICYgQ1JFQUQ7Ci0gICAgICAgIHNwZWVkID0gY29udl92YlsoKHN0cnVjdCB0ZXJtaW8gKilzZyktPmNfY2ZsYWcgJiBWX0NCQVVEXTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIHNnIHBvaW50cyB0byBhIFBPU0lYIHRlcm1pb3Mgc3RydWN0dXJlICovCi0gICAgICAgIGNzaXplID0gc2ctPmNfY2ZsYWcgJiBDU0laRTsKLSAgICAgICAgY3JlYWQgPSBzZy0+Y19jZmxhZyAmIENSRUFEOwotICAgICAgICBzcGVlZCA9IGNvbnZfdmJbc2ctPmNfY2ZsYWcgJiBWX0NCQVVEXTsKLSAgICB9Ci0gICAgaWYgKHMtPnNnLnNnX2lzcGVlZCAhPSBzcGVlZCB8fCBzLT5zZy5zZ19vc3BlZWQgIT0gc3BlZWQpIHsKLSAgICAgICAgcy0+c2cuc2dfaXNwZWVkID0gc3BlZWQ7Ci0gICAgICAgIHMtPnNnLnNnX29zcGVlZCA9IHNwZWVkOwotICAgICAgICBzLT50bS5jX2NmbGFnID0gKHMtPnRtLmNfY2ZsYWcgJiB+Vl9DQkFVRCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZfYnZbKGludClzLT5zZy5zZ19pc3BlZWRdOwotICAgIH0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW90eXBlcy5oIGIvZHJpdmVycy9jaGFyL3Jpby9yaW90eXBlcy5oCmluZGV4IDFjN2M0MmMuLjliNjdlMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vcmlvdHlwZXMuaAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3R5cGVzLmgKQEAgLTg5LDQ3ICs4OSw0NiBAQAogdHlwZWRlZiBSSU9fUE9JTlRFUiB1c2hvcnRfcHRyOwogI2VuZGlmCiAKLSNlbHNlIC8qIG5vdCBJTktFUk5FTCAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgQllURTsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIFdPUkQ7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgICBEV09SRDsKLXR5cGVkZWYgc2hvcnQgICAgICAgICAgIE5VTUJFUjsKLXR5cGVkZWYgc2hvcnQgICAgICAgICAgICpOVU1CRVJfcHRyOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgKldPUkRfcHRyOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgKkJZVEVfcHRyOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWNoYXIgOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdXNob3J0IDsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgIHVpbnQgOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgdWxvbmcgOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdV9jaGFyIDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVfc2hvcnQgOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdV9pbnQgOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgdV9sb25nIDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIEVSUk9SIDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBJRCA7Ci10eXBlZGVmIGNoYXIgICAgICAgICAgICAgKmNoYXJfcHRyOwotdHlwZWRlZiBDaGFubmVsICAgICAgICAgICpDaGFubmVsX3B0cjsKKyNlbHNlCQkJCS8qIG5vdCBJTktFUk5FTCAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEJZVEU7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFdPUkQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgRFdPUkQ7Cit0eXBlZGVmIHNob3J0IE5VTUJFUjsKK3R5cGVkZWYgc2hvcnQgKk5VTUJFUl9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICpXT1JEX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAqQllURV9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWNoYXI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVzaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWxvbmc7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdV9jaGFyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1X3Nob3J0OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdV9pbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdV9sb25nOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBFUlJPUjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBJRDsKK3R5cGVkZWYgY2hhciAqY2hhcl9wdHI7Cit0eXBlZGVmIENoYW5uZWwgKkNoYW5uZWxfcHRyOwogdHlwZWRlZiBzdHJ1Y3QgRlJFRV9MSVNUICpGUkVFX0xJU1RfcHRyOwogdHlwZWRlZiBzdHJ1Y3QgRlJFRV9MSVNUICoqRlJFRV9MSVNUX3B0cl9wdHI7Ci10eXBlZGVmIHN0cnVjdCBMUEIgICAgICAgKkxQQl9wdHI7Ci10eXBlZGVmIHN0cnVjdCBQcm9jZXNzICAgKlByb2Nlc3NfcHRyOwotdHlwZWRlZiBzdHJ1Y3QgUEhCICAgICAgICpQSEJfcHRyOwotdHlwZWRlZiBzdHJ1Y3QgUEtUICAgICAgICpQS1RfcHRyOwotdHlwZWRlZiBzdHJ1Y3QgUEtUICAgICAgICoqUEtUX3B0cl9wdHI7Ci10eXBlZGVmIHN0cnVjdCBRX0JVRiAgICAgKlFfQlVGX3B0cjsKLXR5cGVkZWYgc3RydWN0IFFfQlVGICAgICAqKlFfQlVGX3B0cl9wdHI7Cit0eXBlZGVmIHN0cnVjdCBMUEIgKkxQQl9wdHI7Cit0eXBlZGVmIHN0cnVjdCBQcm9jZXNzICpQcm9jZXNzX3B0cjsKK3R5cGVkZWYgc3RydWN0IFBIQiAqUEhCX3B0cjsKK3R5cGVkZWYgc3RydWN0IFBLVCAqUEtUX3B0cjsKK3R5cGVkZWYgc3RydWN0IFBLVCAqKlBLVF9wdHJfcHRyOwordHlwZWRlZiBzdHJ1Y3QgUV9CVUYgKlFfQlVGX3B0cjsKK3R5cGVkZWYgc3RydWN0IFFfQlVGICoqUV9CVUZfcHRyX3B0cjsKIHR5cGVkZWYgc3RydWN0IFJPVVRFX1NUUiAqUk9VVEVfU1RSX3B0cjsKLXR5cGVkZWYgc3RydWN0IFJVUCAgICAgICAqUlVQX3B0cjsKLXR5cGVkZWYgc2hvcnQgICAgICAgICAgICAqc2hvcnRfcHRyOwotdHlwZWRlZiB1X3Nob3J0ICAgICAgICAgICp1X3Nob3J0X3B0cjsKLXR5cGVkZWYgdXNob3J0ICAgICAgICAgICAqdXNob3J0X3B0cjsKLXR5cGVkZWYgc3RydWN0IFBLVAkgUEtUOwotdHlwZWRlZiBzdHJ1Y3QgTFBCCSBMUEI7Ci10eXBlZGVmIHN0cnVjdCBSVVAJIFJVUDsKK3R5cGVkZWYgc3RydWN0IFJVUCAqUlVQX3B0cjsKK3R5cGVkZWYgc2hvcnQgKnNob3J0X3B0cjsKK3R5cGVkZWYgdV9zaG9ydCAqdV9zaG9ydF9wdHI7Cit0eXBlZGVmIHVzaG9ydCAqdXNob3J0X3B0cjsKK3R5cGVkZWYgc3RydWN0IFBLVCBQS1Q7Cit0eXBlZGVmIHN0cnVjdCBMUEIgTFBCOwordHlwZWRlZiBzdHJ1Y3QgUlVQIFJVUDsKICNlbmRpZgogCiAKLSNlbmRpZiAvKiBfX3Jpb3R5cGVzX18gKi8KKyNlbmRpZgkJCQkvKiBfX3Jpb3R5cGVzX18gKi8KIAogLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb3dpbmlmLmggYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3dpbmlmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YTRmMTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9yaW93aW5pZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoJCQkJCQkJCQkqLwotLyoJVGl0bGUJCToJUklPIFNoYXJlZCBNZW1vcnkgV2luZG93IEludGVmYWNlCSovCi0vKgkJCQkJCQkJCSovCi0vKglBdXRob3IJCToJTi5QLlZhc3NhbGxvCQkJCSovCi0vKgkJCQkJCQkJCSovCi0vKglDcmVhdGlvbgk6CTd0aCBKdW5lIDE5OTkJCQkJKi8KLS8qCQkJCQkJCQkJKi8KLS8qCVZlcnNpb24JCToJMS4wLjAJCQkJCSovCi0vKgkJCQkJCQkJCSovCi0vKglDb3B5cmlnaHQJOgkoYykgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiAxOTk5CSoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCQkJCQkJCQkJKi8KLS8qCURlc2NyaXB0aW9uCToJUHJvdG90eXBlcywgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMJKi8KLS8qCQkJCWRlc2NyaWJpbmcgUklPIGhvc3QgY2FyZCBzaGFyZWQJbWVtb3J5CSovCi0vKgkJCQl3aW5kb3cgaW50ZXJmYWNlIHN0cnVjdHVyZXM6CQkqLwotLyoJCQkJCVBBUk1NQVAJCQkJKi8KLS8qCQkJCQlSVVAJCQkJKi8KLS8qCQkJCQlQSEIJCQkJKi8KLS8qCQkJCQlMUEIJCQkJKi8KLS8qCQkJCQlQS1QJCQkJKi8KLS8qCQkJCQkJCQkJKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEhpc3RvcnkuLi4KLQotMS4wLjAJMDcvMDYvOTkgTlBWCUNyZWF0aW9uLiAoYmFzZWQgb24gUEFSTU1BUC5IKQotCi0qLwotCi0jaWZuZGVmCV9yaW93aW5pZl9oCQkJCS8qIElmIFJJT1dJTkRJRi5IIG5vdCBhbHJlYWR5IGRlZmluZWQgKi8KLSNkZWZpbmUJX3Jpb3dpbmlmX2ggICAgMQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBHZW5lcmFsICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lCVRQTlVMTAkJKChfdTE2KSgweDgwMDApKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBQQVJNX01BUCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgUEFSTV9NQVAgc3RydWN0dXJlIGRlZmluZXMgZ2xvYmFsIHZhbHVlcyByZWxhdGluZyB0byB0aGUgSG9zdCBDYXJkIC8gUlRBCi0gICBhbmQgaXMgdGhlIG1haW4gc3RydWN0dXJlIGZyb20gd2hpY2ggYWxsIG90aGVyIHN0cnVjdHVyZXMgYXJlIHJlZmVyZW5jZWQuICovCi0KLXR5cGVkZWYJc3RydWN0CV9QQVJNX01BUAotewotCV91MTYJcGhiX3B0cjsJCS8qIDB4MDAgUG9pbnRlciB0byB0aGUgUEhCIGFycmF5ICovCi0JX3UxNglwaGJfbnVtX3B0cjsJCS8qIDB4MDIgUHRyIHRvIE51bWJlciBvZiBQSEIncyAqLwotCV91MTYJZnJlZV9saXN0OwkJLyogMHgwNCBGcmVlIExpc3QgcG9pbnRlciAqLwotCV91MTYJZnJlZV9saXN0X2VuZDsJCS8qIDB4MDYgRnJlZSBMaXN0IEVuZCBwb2ludGVyICovCi0JX3UxNglxX2ZyZWVfbGlzdF9wdHI7CS8qIDB4MDggUHRyIHRvIFFfQlVGIHZhcmlhYmxlICovCi0JX3UxNgl1bml0X2lkX3B0cjsJCS8qIDB4MEEgVW5pdCBJZCAqLwotCV91MTYJbGlua19zdHJfcHRyOwkJLyogMHgwQyBMaW5rIFN0cnVjdHVyZSBBcnJheSAqLwotCV91MTYJYm9vdGxvYWRlcl8xOwkJLyogMHgwRSAxc3QgU3RhZ2UgQm9vdCBMb2FkZXIgKi8KLQlfdTE2CWJvb3Rsb2FkZXJfMjsJCS8qIDB4MTAgMm5kIFN0YWdlIEJvb3QgTG9hZGVyICovCi0JX3UxNglwb3J0X3JvdXRlX21hcF9wdHI7CS8qIDB4MTIgUG9ydCBSb3V0ZSBNYXAgKi8KLQlfdTE2CXJvdXRlX3B0cjsJCS8qIDB4MTQgUm91dGUgTWFwICovCi0JX3UxNgltYXBfcHJlc2VudDsJCS8qIDB4MTYgUm91dGUgTWFwIHByZXNlbnQgKi8KLQlfdTE2CXBrdF9udW07CQkvKiAweDE4IFRvdGFsIG51bWJlciBvZiBwYWNrZXRzICovCi0JX3UxNglxX251bTsJCQkvKiAweDFBIFRvdGFsIG51bWJlciBvZiBRIHBhY2tldHMgKi8KLQlfdTE2CWJ1ZmZlcnNfcGVyX3BvcnQ7CS8qIDB4MUMgTnVtYmVyIG9mIGJ1ZmZlcnMgcGVyIHBvcnQgKi8KLQlfdTE2CWhlYXBfc2l6ZTsJCS8qIDB4MUUgSW5pdGlhbCBzaXplIG9mIGhlYXAgKi8KLQlfdTE2CWhlYXBfbGVmdDsJCS8qIDB4MjAgQ3VycmVudCBIZWFwIGxlZnQgKi8KLQlfdTE2CWVycm9yOwkJCS8qIDB4MjIgRXJyb3IgY29kZSAqLwotCV91MTYJdHhfbWF4OwkJCS8qIDB4MjQgTWF4IG51bWJlciBvZiB0eCBwa3RzIHBlciBwaGIgKi8KLQlfdTE2CXJ4X21heDsJCQkvKiAweDI2IE1heCBudW1iZXIgb2YgcnggcGt0cyBwZXIgcGhiICovCi0JX3UxNglyeF9saW1pdDsJCS8qIDB4MjggRm9yIGhpZ2ggLyBsb3cgd2F0ZXJtYXJrcyAqLwotCV91MTYJbGlua3M7CQkJLyogMHgyQSBMaW5rcyB0byB1c2UgKi8KLQlfdTE2CXRpbWVyOwkJCS8qIDB4MkMgSW50ZXJydXB0cyBwZXIgc2Vjb25kICovCi0JX3UxNglydXBzOwkJCS8qIDB4MkUgUG9pbnRlciB0byB0aGUgUlVQcyAqLwotCV91MTYJbWF4X3BoYjsJCS8qIDB4MzAgTW9zdGx5IGZvciBkZWJ1Z2dpbmcgKi8KLQlfdTE2CWxpdmluZzsJCQkvKiAweDMyIEp1c3QgaW5jcmVtZW50cyEhICovCi0JX3UxNglpbml0X2RvbmU7CQkvKiAweDM0IEluaXRpYWxpc2F0aW9uIG92ZXIgKi8KLQlfdTE2CWJvb3RpbmdfbGluazsJCS8qIDB4MzYgKi8KLQlfdTE2CWlkbGVfY291bnQ7CQkvKiAweDM4IElkbGUgdGltZSBjb3VudGVyICovCi0JX3UxNglidXN5X2NvdW50OwkJLyogMHgzQSBCdXN5IGNvdW50ZXIgKi8KLQlfdTE2CWlkbGVfY29udHJvbDsJCS8qIDB4M0MgQ29udHJvbCBJZGxlIFByb2Nlc3MgKi8KLQlfdTE2CXR4X2ludHI7CQkvKiAweDNFIFRYIGludGVycnVwdCBwZW5kaW5nICovCi0JX3UxNglyeF9pbnRyOwkJLyogMHg0MCBSWCBpbnRlcnJ1cHQgcGVuZGluZyAqLwotCV91MTYJcnVwX2ludHI7CQkvKiAweDQyIFJVUCBpbnRlcnJ1cHQgcGVuZGluZyAqLwotCi19IFBBUk1fTUFQOwotCi0vKiBTYW1lIHRoaW5nIGFnYWluLCBidXQgZGVmaW5lZCBhcyBvZmZzZXRzLi4uICovCi0KLSNkZWZpbmUJUE1fcGhiX3B0cgkJMHgwMAkvKiAweDAwIFBvaW50ZXIgdG8gdGhlIFBIQiBhcnJheSAqLwotI2RlZmluZQlQTV9waGJfbnVtX3B0cgkJMHgwMgkvKiAweDAyIFB0ciB0byBOdW1iZXIgb2YgUEhCJ3MgKi8KLSNkZWZpbmUJUE1fZnJlZV9saXN0CQkweDA0CS8qIDB4MDQgRnJlZSBMaXN0IHBvaW50ZXIgKi8KLSNkZWZpbmUJUE1fZnJlZV9saXN0X2VuZAkweDA2CS8qIDB4MDYgRnJlZSBMaXN0IEVuZCBwb2ludGVyICovCi0jZGVmaW5lCVBNX3FfZnJlZV9saXN0X3B0cgkweDA4CS8qIDB4MDggUHRyIHRvIFFfQlVGIHZhcmlhYmxlICovCi0jZGVmaW5lCVBNX3VuaXRfaWRfcHRyCQkweDBBCS8qIDB4MEEgVW5pdCBJZCAqLwotI2RlZmluZQlQTV9saW5rX3N0cl9wdHIJCTB4MEMJLyogMHgwQyBMaW5rIFN0cnVjdHVyZSBBcnJheSAqLwotI2RlZmluZQlQTV9ib290bG9hZGVyXzEJCTB4MEUJLyogMHgwRSAxc3QgU3RhZ2UgQm9vdCBMb2FkZXIgKi8KLSNkZWZpbmUJUE1fYm9vdGxvYWRlcl8yCQkweDEwCS8qIDB4MTAgMm5kIFN0YWdlIEJvb3QgTG9hZGVyICovCi0jZGVmaW5lCVBNX3BvcnRfcm91dGVfbWFwX3B0cgkweDEyCS8qIDB4MTIgUG9ydCBSb3V0ZSBNYXAgKi8KLSNkZWZpbmUJUE1fcm91dGVfcHRyCQkweDE0CS8qIDB4MTQgUm91dGUgTWFwICovCi0jZGVmaW5lCVBNX21hcF9wcmVzZW50CQkweDE2CS8qIDB4MTYgUm91dGUgTWFwIHByZXNlbnQgKi8KLSNkZWZpbmUJUE1fcGt0X251bQkJMHgxOAkvKiAweDE4IFRvdGFsIG51bWJlciBvZiBwYWNrZXRzICovCi0jZGVmaW5lCVBNX3FfbnVtCQkweDFBCS8qIDB4MUEgVG90YWwgbnVtYmVyIG9mIFEgcGFja2V0cyAqLwotI2RlZmluZQlQTV9idWZmZXJzX3Blcl9wb3J0CTB4MUMJLyogMHgxQyBOdW1iZXIgb2YgYnVmZmVycyBwZXIgcG9ydCAqLwotI2RlZmluZQlQTV9oZWFwX3NpemUJCTB4MUUJLyogMHgxRSBJbml0aWFsIHNpemUgb2YgaGVhcCAqLwotI2RlZmluZQlQTV9oZWFwX2xlZnQJCTB4MjAJLyogMHgyMCBDdXJyZW50IEhlYXAgbGVmdCAqLwotI2RlZmluZQlQTV9lcnJvcgkJMHgyMgkvKiAweDIyIEVycm9yIGNvZGUgKi8KLSNkZWZpbmUJUE1fdHhfbWF4CQkweDI0CS8qIDB4MjQgTWF4IG51bWJlciBvZiB0eCBwa3RzIHBlciBwaGIgKi8KLSNkZWZpbmUJUE1fcnhfbWF4CQkweDI2CS8qIDB4MjYgTWF4IG51bWJlciBvZiByeCBwa3RzIHBlciBwaGIgKi8KLSNkZWZpbmUJUE1fcnhfbGltaXQJCTB4MjgJLyogMHgyOCBGb3IgaGlnaCAvIGxvdyB3YXRlcm1hcmtzICovCi0jZGVmaW5lCVBNX2xpbmtzCQkweDJBCS8qIDB4MkEgTGlua3MgdG8gdXNlICovCi0jZGVmaW5lCVBNX3RpbWVyCQkweDJDCS8qIDB4MkMgSW50ZXJydXB0cyBwZXIgc2Vjb25kICovCi0jZGVmaW5lCVBNX3J1cHMJCQkweDJFCS8qIDB4MkUgUG9pbnRlciB0byB0aGUgUlVQcyAqLwotI2RlZmluZQlQTV9tYXhfcGhiCQkweDMwCS8qIDB4MzAgTW9zdGx5IGZvciBkZWJ1Z2dpbmcgKi8KLSNkZWZpbmUJUE1fbGl2aW5nCQkweDMyCS8qIDB4MzIgSnVzdCBpbmNyZW1lbnRzISEgKi8KLSNkZWZpbmUJUE1faW5pdF9kb25lCQkweDM0CS8qIDB4MzQgSW5pdGlhbGlzYXRpb24gb3ZlciAqLwotI2RlZmluZQlQTV9ib290aW5nX2xpbmsJCTB4MzYJLyogMHgzNiAqLwotI2RlZmluZQlQTV9pZGxlX2NvdW50CQkweDM4CS8qIDB4MzggSWRsZSB0aW1lIGNvdW50ZXIgKi8KLSNkZWZpbmUJUE1fYnVzeV9jb3VudAkJMHgzQQkvKiAweDNBIEJ1c3kgY291bnRlciAqLwotI2RlZmluZQlQTV9pZGxlX2NvbnRyb2wJCTB4M0MJLyogMHgzQyBDb250cm9sIElkbGUgUHJvY2VzcyAqLwotI2RlZmluZQlQTV90eF9pbnRyCQkweDNFCS8qIDB4NEUgVFggaW50ZXJydXB0IHBlbmRpbmcgKi8KLSNkZWZpbmUJUE1fcnhfaW50cgkJMHg0MAkvKiAweDQwIFJYIGludGVycnVwdCBwZW5kaW5nICovCi0jZGVmaW5lCVBNX3J1cF9pbnRyCQkweDQyCS8qIDB4NDIgUlVQIGludGVycnVwdCBwZW5kaW5nICovCi0jZGVmaW5lCXNpemVvZl9QQVJNX01BUAkJMHg0NAkvKiBzdHJ1Y3R1cmUgc2l6ZSA9IDB4NDQgKi8KLQotLyogUEFSTV9NQVAuZXJyb3IgZGVmaW5pdGlvbnMuLi4gKi8KLSNkZWZpbmUJRV9OT19FUlJPUgkJMHgwMAotI2RlZmluZQlFX1BST0NFU1NfTk9UX0lOSVQJMHgwMQotI2RlZmluZQlFX0xJTktfVElNRU9VVAkJMHgwMgotI2RlZmluZQlFX05PX1JPVVRFCQkweDAzCi0jZGVmaW5lCUVfQ09ORlVTRUQJCTB4MDQKLSNkZWZpbmUJRV9IT01FCQkJMHgwNQotI2RlZmluZQlFX0NTVU1fRkFJTAkJMHgwNgotI2RlZmluZQlFX0RJU0NPTk5FQ1RFRAkJMHgwNwotI2RlZmluZQlFX0JBRF9SVVAJCTB4MDgKLSNkZWZpbmUJRV9OT19WSVJHSU4JCTB4MDkKLSNkZWZpbmUJRV9CT09UX1JVUF9CVVNZCQkweDEwCi0jZGVmaW5lCUVfQ0hBTkFMTE9DCQkweDgwCi0jZGVmaW5lCUVfUE9MTF9BTExPQwkJMHg4MQotI2RlZmluZQlFX0xUVFdBS0UJCTB4ODIKLSNkZWZpbmUJRV9MVFRfQUxMT0MJCTB4ODMKLSNkZWZpbmUJRV9MUlRfQUxMT0MJCTB4ODQKLSNkZWZpbmUJRV9DSVJSVVMJCTB4ODUKLSNkZWZpbmUJRV9NT05JVE9SCQkweDg2Ci0jZGVmaW5lCUVfUEhCX0FMTE9DCQkweDg3Ci0jZGVmaW5lCUVfQVJSQVlfQUxMT0MJCTB4ODgKLSNkZWZpbmUJRV9RQlVGX0FMTE9DCQkweDg5Ci0jZGVmaW5lCUVfUEtUX0FMTE9DCQkweDhhCi0jZGVmaW5lCUVfR0VUX1RYX1FfQlVGCQkweDhiCi0jZGVmaW5lCUVfR0VUX1JYX1FfQlVGCQkweDhjCi0jZGVmaW5lCUVfTUVNX09VVAkJMHg4ZAotI2RlZmluZQlFX01NVV9JTklUCQkweDhlCi0jZGVmaW5lCUVfTFRUX0lOSVQJCTB4OGYKLSNkZWZpbmUJRV9MUlRfSU5JVAkJMHg5MAotI2RlZmluZQlFX0xJTktfUlVOCQkweDkxCi0jZGVmaW5lCUVfTU9OSVRPUl9BTExPQwkJMHg5MgotI2RlZmluZQlFX01PTklUT1JfSU5JVAkJMHg5MwotI2RlZmluZQlFX1BPTExfSU5JVAkJMHg5NAotCi0vKiBQQVJNX01BUC5saW5rcyBkZWZpbml0aW9ucy4uLiAqLwotI2RlZmluZQlSSU9fTElOS19FTkFCTEUJMHg4MEZGCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgUlVQICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBSVVAgKFJlbW90ZSBVbml0IFBvcnQpIHN0cnVjdHVyZSByZWxhdGVzIHRvIHRoZSBSZW1vdGUgVGVybWluYWwgQWRhcHRlcnMKLSAgIGF0dGFjaGVkIHRvIHRoZSBzeXN0ZW0gYW5kIHRoZXJlIGlzIG5vcm1hbGx5IGFuIGFycmF5IG9mIE1BWF9SVVBTICg9MTYpIHN0cnVjdHVyZXMKLSAgIGluIGEgaG9zdCBjYXJkLCBkZWZpbmVkIGJ5IFBBUk1fTUFQLT5ydXAuICovCi0KLXR5cGVkZWYJc3RydWN0CV9SVVAKLXsKLQlfdTE2CQl0eHBrdDsJCQkvKiAweDAwIE91dGdvaW5nIHBhY2tldCAqLwotCV91MTYJCXJ4cGt0OwkJCS8qIDB4MDIgbmNvbWluZyBwYWNrZXQgKi8KLQlfdTE2CQlsaW5rOwkJCS8qIDB4MDQgV2hpY2ggbGluayB0byBzZW5kIHBhY2tldCBkb3duID8gKi8KLQlfdTgJCXJ1cF9kZXN0X3VuaXRbMl07CS8qIDB4MDYgRGVzdGluYXRpb24gVW5pdCAqLwotCV91MTYJCWhhbmRzaGFrZTsJCS8qIDB4MDggSGFuZHNoYWtpbmcgKi8KLQlfdTE2CQl0aW1lb3V0OwkJLyogMHgwQSBUaW1lb3V0ICovCi0JX3UxNgkJc3RhdHVzOwkJCS8qIDB4MEMgU3RhdHVzICovCi0JX3UxNgkJdHhjb250cm9sOwkJLyogMHgwRSBUcmFuc21pdCBjb250cm9sICovCi0JX3UxNgkJcnhjb250cm9sOwkJLyogMHgxMCBSZWNlaXZlIGNvbnRyb2wgKi8KLQotfSBSVVA7Ci0KLS8qIFNhbWUgdGhpbmcgYWdhaW4sIGJ1dCBkZWZpbmVkIGFzIG9mZnNldHMuLi4gKi8KLQotI2RlZmluZQlSVVBfdHhwa3QJCTB4MDAJCS8qIDB4MDAgT3V0Z29pbmcgcGFja2V0ICovCi0jZGVmaW5lCVJVUF9yeHBrdAkJMHgwMgkJLyogMHgwMiBJbmNvbWluZyBwYWNrZXQgKi8KLSNkZWZpbmUJUlVQX2xpbmsJCTB4MDQJCS8qIDB4MDQgV2hpY2ggbGluayB0byBzZW5kIHBhY2tldCBkb3duID8gKi8KLSNkZWZpbmUJUlVQX3J1cF9kZXN0X3VuaXQJMHgwNgkJLyogMHgwNiBEZXN0aW5hdGlvbiBVbml0ICovCi0jZGVmaW5lCVJVUF9oYW5kc2hha2UJCTB4MDgJCS8qIDB4MDggSGFuZHNoYWtpbmcgKi8KLSNkZWZpbmUJUlVQX3RpbWVvdXQJCTB4MEEJCS8qIDB4MEEgVGltZW91dCAqLwotI2RlZmluZQlSVVBfc3RhdHVzCQkweDBDCQkvKiAweDBDIFN0YXR1cyAqLwotI2RlZmluZQlSVVBfdHhjb250cm9sCQkweDBFCQkvKiAweDBFIFRyYW5zbWl0IGNvbnRyb2wgKi8KLSNkZWZpbmUJUlVQX3J4Y29udHJvbAkJMHgxMAkJLyogMHgxMCBSZWNlaXZlIGNvbnRyb2wgKi8KLSNkZWZpbmUJc2l6ZW9mX1JVUAkJMHgxMgkJLyogc3RydWN0dXJlIHNpemUgPSAweDEyICovCi0KLSNkZWZpbmUgTUFYX1JVUAkJCTE2Ci0KLS8qIFJVUC50eGNvbnRyb2wgZGVmaW5pdGlvbnMuLi4gKi8KLSNkZWZpbmUJVFhfUlVQX0lOQUNUSVZFCQkwCQkvKiBOb3RoaW5nIHRvIHRyYW5zbWl0ICovCi0jZGVmaW5lCVRYX1BBQ0tFVF9SRUFEWQkJMQkJLyogVHJhbnNtaXQgcGFja2V0IHJlYWR5ICovCi0jZGVmaW5lCVRYX0xPQ0tfUlVQCQkyCQkvKiBUcmFuc21pdCBzaWRlIGxvY2tlZCAqLwotCi0vKiBSVVAudHhjb250cm9sIGRlZmluaXRpb25zLi4uICovCi0jZGVmaW5lCVJYX1JVUF9JTkFDVElWRQkJMAkJLyogTm90aGluZyByZWNlaXZlZCAqLwotI2RlZmluZQlSWF9QQUNLRVRfUkVBRFkJCTEJCS8qIFBhY2tldCByZWNlaXZlZCAqLwotCi0jZGVmaW5lCVJVUF9OT19PV05FUgkJMHhGRgkJLyogUlVQIG5vdCBvd25lZCBieSBhbnkgcHJvY2VzcyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFBIQiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgUEhCIChQb3J0IEhlYWRlciBCbG9jaykgc3RydWN0dXJlIHJlbGF0ZXMgdG8gdGhlIHNlcmlhbCBwb3J0cyBhdHRhY2hlZAotICAgdG8gdGhlIHN5c3RlbSBhbmQgdGhlcmUgaXMgbm9ybWFsbHkgYW4gYXJyYXkgb2YgTUFYX1BIQlMgKD0xMjgpIHN0cnVjdHVyZXMKLSAgIGluIGEgaG9zdCBjYXJkLCBkZWZpbmVkIGJ5IFBBUk1fTUFQLT5waGJfcHRyIGFuZCBQQVJNX01BUC0+cGhiX251bV9wdHIuICovCi0KLXR5cGVkZWYJc3RydWN0CV9QSEIKLXsKLQlfdTE2CQlzb3VyY2U7CQkJLyogMHgwMCBMb2NhdGlvbiBvZiB0aGUgUEhCIGluIHRoZSBob3N0IGNhcmQgKi8KLQlfdTE2CQloYW5kc2hha2U7CQkvKiAweDAyIFVzZWQgdG8gbWFuYWdlIHJlY2VpdmUgcGFja2V0IGZsb3cgY29udHJvbCAqLwotCV91MTYJCXN0YXR1czsJCQkvKiAweDA0IEludGVybmFsIHBvcnQgdHJhbnNtaXQvcmVjZWl2ZSBzdGF0dXMgKi8KLQlfdTE2CQl0aW1lb3V0OwkJLyogMHgwNiBUaW1lIHBlcmlvZCB0byB3YWl0IGZvciBhbiBBQ0sgKi8KLQlfdTE2CQlsaW5rOwkJCS8qIDB4MDggVGhlIGhvc3QgbGluayBhc3NvY2lhdGVkIHdpdGggdGhlIFBIQiAqLwotCV91MTYJCWRlc3RpbmF0aW9uOwkJLyogMHgwQSBMb2NhdGlvbiBvZiB0aGUgcmVtb3RlIHBvcnQgb24gdGhlIG5ldHdvcmsgKi8KLQotCV91MTYJCXR4X3N0YXJ0OwkJLyogMHgwQyBmaXJzdCBlbnRyeSBpbiB0aGUgcGFja2V0IGFycmF5IGZvciB0cmFuc21pdCBwYWNrZXRzICovCi0JX3UxNgkJdHhfZW5kOwkJCS8qIDB4MEUgbGFzdCBlbnRyeSBpbiB0aGUgcGFja2V0IGFycmF5IGZvciB0cmFuc21pdCBwYWNrZXRzICovCi0JX3UxNgkJdHhfYWRkOwkJCS8qIDB4MTAgcG9zaXRpb24gaW4gdGhlIHBhY2tldCBhcnJheSBmb3IgbmV3IHRyYW5zbWl0IHBhY2tldHMgKi8KLQlfdTE2CQl0eF9yZW1vdmU7CQkvKiAweDEyIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHBhY2tldCBwb2ludGVyIGFycmF5ICovCi0KLQlfdTE2CQlyeF9zdGFydDsJCS8qIDB4MTQgZmlyc3QgZW50cnkgaW4gdGhlIHBhY2tldCBhcnJheSBmb3IgcmVjZWl2ZSBwYWNrZXRzICovCi0JX3UxNgkJcnhfZW5kOwkJCS8qIDB4MTYgbGFzdCBlbnRyeSBpbiB0aGUgcGFja2V0IGFycmF5IGZvciByZWNlaXZlIHBhY2tldHMgKi8KLQlfdTE2CQlyeF9hZGQ7CQkJLyogMHgxOCBwb3NpdGlvbiBpbiB0aGUgcGFja2V0IGFycmF5IGZvciBuZXcgcmVjZWl2ZSBwYWNrZXRzICovCi0JX3UxNgkJcnhfcmVtb3ZlOwkJLyogMHgxQSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBwYWNrZXQgcG9pbnRlciBhcnJheSAqLwotCi19IFBIQjsKLQotLyogU2FtZSB0aGluZyBhZ2FpbiwgYnV0IGRlZmluZWQgYXMgb2Zmc2V0cy4uLiAqLwotCi0jZGVmaW5lCVBIQl9zb3VyY2UJCTB4MDAJCS8qIDB4MDAgTG9jYXRpb24gb2YgdGhlIFBIQiBpbiB0aGUgaG9zdCBjYXJkICovCi0jZGVmaW5lCVBIQl9oYW5kc2hha2UJCTB4MDIJCS8qIDB4MDIgVXNlZCB0byBtYW5hZ2UgcmVjZWl2ZSBwYWNrZXQgZmxvdyBjb250cm9sICovCi0jZGVmaW5lCVBIQl9zdGF0dXMJCTB4MDQJCS8qIDB4MDQgSW50ZXJuYWwgcG9ydCB0cmFuc21pdC9yZWNlaXZlIHN0YXR1cyAqLwotI2RlZmluZQlQSEJfdGltZW91dAkJMHgwNgkJLyogMHgwNiBUaW1lIHBlcmlvZCB0byB3YWl0IGZvciBhbiBBQ0sgKi8KLSNkZWZpbmUJUEhCX2xpbmsJCTB4MDgJCS8qIDB4MDggVGhlIGhvc3QgbGluayBhc3NvY2lhdGVkIHdpdGggdGhlIFBIQiAqLwotI2RlZmluZQlQSEJfZGVzdGluYXRpb24JCTB4MEEJCS8qIDB4MEEgTG9jYXRpb24gb2YgdGhlIHJlbW90ZSBwb3J0IG9uIHRoZSBuZXR3b3JrICovCi0jZGVmaW5lCVBIQl90eF9zdGFydAkJMHgwQwkJLyogMHgwQyBmaXJzdCBlbnRyeSBpbiB0aGUgcGFja2V0IGFycmF5IGZvciB0cmFuc21pdCBwYWNrZXRzICovCi0jZGVmaW5lCVBIQl90eF9lbmQJCTB4MEUJCS8qIDB4MEUgbGFzdCBlbnRyeSBpbiB0aGUgcGFja2V0IGFycmF5IGZvciB0cmFuc21pdCBwYWNrZXRzICovCi0jZGVmaW5lCVBIQl90eF9hZGQJCTB4MTAJCS8qIDB4MTAgcG9zaXRpb24gaW4gdGhlIHBhY2tldCBhcnJheSBmb3IgbmV3IHRyYW5zbWl0IHBhY2tldHMgKi8KLSNkZWZpbmUJUEhCX3R4X3JlbW92ZQkJMHgxMgkJLyogMHgxMiBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBwYWNrZXQgcG9pbnRlciBhcnJheSAqLwotI2RlZmluZQlQSEJfcnhfc3RhcnQJCTB4MTQJCS8qIDB4MTQgZmlyc3QgZW50cnkgaW4gdGhlIHBhY2tldCBhcnJheSBmb3IgcmVjZWl2ZSBwYWNrZXRzICovCi0jZGVmaW5lCVBIQl9yeF9lbmQJCTB4MTYJCS8qIDB4MTYgbGFzdCBlbnRyeSBpbiB0aGUgcGFja2V0IGFycmF5IGZvciByZWNlaXZlIHBhY2tldHMgKi8KLSNkZWZpbmUJUEhCX3J4X2FkZAkJMHgxOAkJLyogMHgxOCBwb3NpdGlvbiBpbiB0aGUgcGFja2V0IGFycmF5IGZvciBuZXcgcmVjZWl2ZSBwYWNrZXRzICovCi0jZGVmaW5lCVBIQl9yeF9yZW1vdmUJCTB4MUEJCS8qIDB4MUEgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgcGFja2V0IHBvaW50ZXIgYXJyYXkgKi8KLSNkZWZpbmUJc2l6ZW9mX1BIQgkJMHgxQwkJLyogc3RydWN0dXJlIHNpemUgPSAweDFDICovCi0KLS8qIFBIQi5oYW5kc2hha2UgZGVmaW5pdGlvbnMuLi4gKi8KLSNkZWZpbmUJUEhCX0hBTkRTSEFLRV9TRVQJMHgwMDAxCQkvKiBTZXQgYnkgTFJUICovCi0jZGVmaW5lCVBIQl9IQU5EU0hBS0VfUkVTRVQJMHgwMDAyCQkvKiBTZXQgYnkgSVNSIC8gZHJpdmVyICovCi0jZGVmaW5lCVBIQl9IQU5EU0hBS0VfRkxBR1MJKFBIQl9IQU5EU0hBS0VfUkVTRVR8UEhCX0hBTkRTSEFLRV9TRVQpCi0JCQkJCQkvKiBSZXNldCBieSBsdHQgKi8KLQotI2RlZmluZQlNQVhfUEhCCQkJMTI4CQkvKiByYW5nZSAwLTEyNyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIExQQiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgTFBCIChMaW5rIFBhcmFtZXRlciBCbG9jaykgc3RydWN0dXJlIHJlbGF0ZXMgdG8gYSBSSU8gTmV0d29yayBMaW5rCi0gICBhbmQgdGhlcmUgaXMgbm9ybWFsbHkgYW4gYXJyYXkgb2YgTUFYX0xJTktTICg9NCkgc3RydWN0dXJlcyBpbiBhIGhvc3QgY2FyZCwKLSAgIGRlZmluZWQgYnkgUEFSTV9NQVAtPmxpbmtfc3RyX3B0ci4gKi8KLQotdHlwZWRlZglzdHJ1Y3QJX0xQQgotewotCV91MTYJCWxpbmtfbnVtYmVyOwkJLyogMHgwMCBMaW5rIE51bWJlciAqLwotCV91MTYJCWluX2NoOwkJCS8qIDB4MDIgTGluayBJbiBDaGFubmVsICovCi0JX3UxNgkJb3V0X2NoOwkJCS8qIDB4MDQgTGluayBPdXQgQ2hhbm5lbCAqLwotCV91OAkJYXR0YWNoZWRfc2VyaWFsWzRdOwkvKiAweDA2IEF0dGFjaGVkIHNlcmlhbCBudW1iZXIgKi8KLQlfdTgJCWF0dGFjaGVkX2hvc3Rfc2VyaWFsWzRdOy8qIDB4MEEgU2VyaWFsIG51bWJlciBvZiBIb3N0IHdobyBib290ZWQgb3RoZXIgZW5kICovCi0JX3UxNgkJZGVzY2hlZHVsZWQ7CQkvKiAweDBFIEN1cnJlbnRseSBEZXNjaGVkdWxlZCAqLwotCV91MTYJCXN0YXRlOwkJCS8qIDB4MTAgQ3VycmVudCBzdGF0ZSAqLwotCV91MTYJCXNlbmRfcG9sbDsJCS8qIDB4MTIgU2VuZCBhIFBvbGwgUGFja2V0ICovCi0JX3UxNgkJbHR0X3A7CQkJLyogMHgxNCBQcm9jZXNzIERlc2NyaXB0b3IgKi8KLQlfdTE2CQlscnRfcDsJCQkvKiAweDE2IFByb2Nlc3MgRGVzY3JpcHRvciAqLwotCV91MTYJCWxydF9zdGF0dXM7CQkvKiAweDE4IEN1cnJlbnQgbHJ0IHN0YXR1cyAqLwotCV91MTYJCWx0dF9zdGF0dXM7CQkvKiAweDFBIEN1cnJlbnQgbHR0IHN0YXR1cyAqLwotCV91MTYJCXRpbWVvdXQ7CQkvKiAweDFDIFRpbWVvdXQgdmFsdWUgKi8KLQlfdTE2CQl0b3BvbG9neTsJCS8qIDB4MUUgVG9wb2xvZ3kgYml0cyAqLwotCV91MTYJCW1vbl9sdHQ7CQkvKiAweDIwICovCi0JX3UxNgkJbW9uX2xydDsJCS8qIDB4MjIgKi8KLQlfdTE2CQludW1fcGt0czsJCS8qIDB4MjQgKi8KLQlfdTE2CQlhZGRfcGFja2V0X2xpc3Q7CS8qIDB4MjYgQWRkIHBhY2tldHMgdG8gaGVyZSAqLwotCV91MTYJCXJlbW92ZV9wYWNrZXRfbGlzdDsJLyogMHgyOCBTZW5kIHBhY2tldHMgZnJvbSBoZXJlICovCi0KLQlfdTE2CQlscnRfZmFpbF9jaGFuOwkJLyogMHgyQSBMcnQncyBmYWlsdXJlIGNoYW5uZWwgKi8KLQlfdTE2CQlsdHRfZmFpbF9jaGFuOwkJLyogMHgyQyBMdHQncyBmYWlsdXJlIGNoYW5uZWwgKi8KLQotCVJVUAkJcnVwOwkJCS8qIDB4MkUgUlVQIHN0cnVjdHVyZSBmb3IgSE9TVCB0byBkcml2ZXIgY29tbXMgKi8KLQlSVVAJCWxpbmtfcnVwOwkJLyogMHg0MCBSVVAgZm9yIHRoZSBsaW5rIChQT0xMLCB0b3BvbG9neSBldGMuKSAqLwotCV91MTYJCWF0dGFjaGVkX2xpbms7CQkvKiAweDUyIE51bWJlciBvZiBhdHRhY2hlZCBsaW5rICovCi0JX3UxNgkJY3N1bV9lcnJvcnM7CQkvKiAweDU0IGNzdW0gZXJyb3JzICovCi0JX3UxNgkJbnVtX2Rpc2Nvbm5lY3RzOwkvKiAweDU2IG51bWJlciBvZiBkaXNjb25uZWN0cyAqLwotCV91MTYJCW51bV9zeW5jX3JjdmQ7CQkvKiAweDU4ICMgc3luYydzIHJlY2VpdmVkICovCi0JX3UxNgkJbnVtX3N5bmNfcnFzdDsJCS8qIDB4NUEgIyBzeW5jIHJlcXVlc3RzICovCi0JX3UxNgkJbnVtX3R4OwkJCS8qIDB4NUMgTnVtIHBrdHMgc2VudCAqLwotCV91MTYJCW51bV9yeDsJCQkvKiAweDVFIE51bSBwa3RzIHJlY2VpdmVkICovCi0JX3UxNgkJbW9kdWxlX2F0dGFjaGVkOwkvKiAweDYwIE1vZHVsZSB0cHllcyBvZiBhdHRhY2hlZCAqLwotCV91MTYJCWxlZF90aW1lb3V0OwkJLyogMHg2MiBMRUQgdGltZW91dCAqLwotCV91MTYJCWZpcnN0X3BvcnQ7CQkvKiAweDY0IEZpcnN0IHBvcnQgdG8gc2VydmljZSAqLwotCV91MTYJCWxhc3RfcG9ydDsJCS8qIDB4NjYgTGFzdCBwb3J0IHRvIHNlcnZpY2UgKi8KLQotfSBMUEI7Ci0KLS8qIFNhbWUgdGhpbmcgYWdhaW4sIGJ1dCBkZWZpbmVkIGFzIG9mZnNldHMuLi4gKi8KLQotI2RlZmluZQlMUEJfbGlua19udW1iZXIJCTB4MDAJCS8qIDB4MDAgTGluayBOdW1iZXIgKi8KLSNkZWZpbmUJTFBCX2luX2NoCQkweDAyCQkvKiAweDAyIExpbmsgSW4gQ2hhbm5lbCAqLwotI2RlZmluZQlMUEJfb3V0X2NoCQkweDA0CQkvKiAweDA0IExpbmsgT3V0IENoYW5uZWwgKi8KLSNkZWZpbmUJTFBCX2F0dGFjaGVkX3NlcmlhbAkweDA2CQkvKiAweDA2IEF0dGFjaGVkIHNlcmlhbCBudW1iZXIgKi8KLSNkZWZpbmUJTFBCX2F0dGFjaGVkX2hvc3Rfc2VyaWFsIDB4MEEJCS8qIDB4MEEgU2VyaWFsIG51bWJlciBvZiBIb3N0IHdobyBib290ZWQgb3RoZXIgZW5kICovCi0jZGVmaW5lCUxQQl9kZXNjaGVkdWxlZAkJMHgwRQkJLyogMHgwRSBDdXJyZW50bHkgRGVzY2hlZHVsZWQgKi8KLSNkZWZpbmUJTFBCX3N0YXRlCQkweDEwCQkvKiAweDEwIEN1cnJlbnQgc3RhdGUgKi8KLSNkZWZpbmUJTFBCX3NlbmRfcG9sbAkJMHgxMgkJLyogMHgxMiBTZW5kIGEgUG9sbCBQYWNrZXQgKi8KLSNkZWZpbmUJTFBCX2x0dF9wCQkweDE0CQkvKiAweDE0IFByb2Nlc3MgRGVzY3JpcHRvciAqLwotI2RlZmluZQlMUEJfbHJ0X3AJCTB4MTYJCS8qIDB4MTYgUHJvY2VzcyBEZXNjcmlwdG9yICovCi0jZGVmaW5lCUxQQl9scnRfc3RhdHVzCQkweDE4CQkvKiAweDE4IEN1cnJlbnQgbHJ0IHN0YXR1cyAqLwotI2RlZmluZQlMUEJfbHR0X3N0YXR1cwkJMHgxQQkJLyogMHgxQSBDdXJyZW50IGx0dCBzdGF0dXMgKi8KLSNkZWZpbmUJTFBCX3RpbWVvdXQJCTB4MUMJCS8qIDB4MUMgVGltZW91dCB2YWx1ZSAqLwotI2RlZmluZQlMUEJfdG9wb2xvZ3kJCTB4MUUJCS8qIDB4MUUgVG9wb2xvZ3kgYml0cyAqLwotI2RlZmluZQlMUEJfbW9uX2x0dAkJMHgyMAkJLyogMHgyMCAqLwotI2RlZmluZQlMUEJfbW9uX2xydAkJMHgyMgkJLyogMHgyMiAqLwotI2RlZmluZQlMUEJfbnVtX3BrdHMJCTB4MjQJCS8qIDB4MjQgKi8KLSNkZWZpbmUJTFBCX2FkZF9wYWNrZXRfbGlzdAkweDI2CQkvKiAweDI2IEFkZCBwYWNrZXRzIHRvIGhlcmUgKi8KLSNkZWZpbmUJTFBCX3JlbW92ZV9wYWNrZXRfbGlzdAkweDI4CQkvKiAweDI4IFNlbmQgcGFja2V0cyBmcm9tIGhlcmUgKi8KLSNkZWZpbmUJTFBCX2xydF9mYWlsX2NoYW4JMHgyQQkJLyogMHgyQSBMcnQncyBmYWlsdXJlIGNoYW5uZWwgKi8KLSNkZWZpbmUJTFBCX2x0dF9mYWlsX2NoYW4JMHgyQwkJLyogMHgyQyBMdHQncyBmYWlsdXJlIGNoYW5uZWwgKi8KLSNkZWZpbmUJTFBCX3J1cAkJCTB4MkUJCS8qIDB4MkUgUlVQIHN0cnVjdHVyZSBmb3IgSE9TVCB0byBkcml2ZXIgY29tbXMgKi8KLSNkZWZpbmUJTFBCX2xpbmtfcnVwCQkweDQwCQkvKiAweDQwIFJVUCBmb3IgdGhlIGxpbmsgKFBPTEwsIHRvcG9sb2d5IGV0Yy4pICovCi0jZGVmaW5lCUxQQl9hdHRhY2hlZF9saW5rCTB4NTIJCS8qIDB4NTIgTnVtYmVyIG9mIGF0dGFjaGVkIGxpbmsgKi8KLSNkZWZpbmUJTFBCX2NzdW1fZXJyb3JzCQkweDU0CQkvKiAweDU0IGNzdW0gZXJyb3JzICovCi0jZGVmaW5lCUxQQl9udW1fZGlzY29ubmVjdHMJMHg1NgkJLyogMHg1NiBudW1iZXIgb2YgZGlzY29ubmVjdHMgKi8KLSNkZWZpbmUJTFBCX251bV9zeW5jX3JjdmQJMHg1OAkJLyogMHg1OCAjIHN5bmMncyByZWNlaXZlZCAqLwotI2RlZmluZQlMUEJfbnVtX3N5bmNfcnFzdAkweDVBCQkvKiAweDVBICMgc3luYyByZXF1ZXN0cyAqLwotI2RlZmluZQlMUEJfbnVtX3R4CQkweDVDCQkvKiAweDVDIE51bSBwa3RzIHNlbnQgKi8KLSNkZWZpbmUJTFBCX251bV9yeAkJMHg1RQkJLyogMHg1RSBOdW0gcGt0cyByZWNlaXZlZCAqLwotI2RlZmluZQlMUEJfbW9kdWxlX2F0dGFjaGVkCTB4NjAJCS8qIDB4NjAgTW9kdWxlIHRweWVzIG9mIGF0dGFjaGVkICovCi0jZGVmaW5lCUxQQl9sZWRfdGltZW91dAkJMHg2MgkJLyogMHg2MiBMRUQgdGltZW91dCAqLwotI2RlZmluZQlMUEJfZmlyc3RfcG9ydAkJMHg2NAkJLyogMHg2NCBGaXJzdCBwb3J0IHRvIHNlcnZpY2UgKi8KLSNkZWZpbmUJTFBCX2xhc3RfcG9ydAkJMHg2NgkJLyogMHg2NiBMYXN0IHBvcnQgdG8gc2VydmljZSAqLwotI2RlZmluZQlzaXplb2ZfTFBCCQkweDY4CQkvKiBzdHJ1Y3R1cmUgc2l6ZSA9IDB4NjggKi8KLQotI2RlZmluZQlMSU5LU19QRVJfVU5JVAkJNAkJLyogbnVtYmVyIG9mIGxpbmtzIGZyb20gYSBob3N0ICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIEZSRUVfTElTVCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFVzZWQgdG8gb3ZlcmxheSBwYWNrZXQgaGVhZGVycyB3aGVuIGFsbG9jYXRpbmcvZnJlZWluZyBwYWNrZXRzIGZyb20gdGhlIGZyZWUgbGlzdCAqLwotCi10eXBlZGVmCXN0cnVjdAlfRlJFRV9MSVNUCi17Ci0JX3UxNgkJbmV4dDsJCQkvKiAweDAwIG9mZnNldCBvZiBuZXh0IGxpc3QgaXRlbSAqLwotCV91MTYJCXByZXY7CQkJLyogMHgwMiBvZmZzZXQgb2YgcHJldmlvdXMgbGlzdCBpdGVtICovCi0KLX0gRlJFRV9MSVNUOwotCi0vKiBTYW1lIHRoaW5nIGFnYWluLCBidXQgZGVmaW5lZCBhcyBvZmZzZXRzLi4uICovCi0KLSNkZWZpbmUJRkxfbmV4dAkJCTB4MDAJCS8qIDB4MDAgb2Zmc2V0IG9mIG5leHQgbGlzdCBpdGVtICovCi0jZGVmaW5lCUZMX3ByZXYJCQkweDAyCQkvKiAweDAyIG9mZnNldCBvZiBwcmV2aW91cyBsaXN0IGl0ZW0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBQS1QgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIFBLVCBpcyB0aGUgbWFpbiB1bml0IG9mIGNvbW11bmljYXRpb24gYmV0d2VlbiBIb3N0IENhcmRzIGFuZCBSVEFzIGFjcm9zcwotICAgdGhlIFJJTyBuZXR3b3JrLiAgKi8KLQotI2RlZmluZSBQS1RfTUFYX0RBVEFfTEVOICAgNzIJCQkvKiBTaXplIG9mIHBhY2tldCBkYXRhICovCi0KLXR5cGVkZWYJc3RydWN0CV9QS1QKLXsKLQlfdTgJCWRlc3RfdW5pdDsJCS8qIDB4MDAgRGVzdGluYXRpb24gVW5pdCBJZCAqLwotCV91OAkJZGVzdF9wb3J0OwkJLyogMHgwMSBEZXN0aW5hdGlvbiBQb3J0ICovCi0JX3U4CQlzcmNfdW5pdDsJCS8qIDB4MDIgU291cmNlIFVuaXQgSWQgKi8KLQlfdTgJCXNyY19wb3J0OwkJLyogMHgwMyBTb3VyY2UgUG9ydCAqLwotCV91OAkJbGVuOwkJCS8qIDB4MDQgTGVuZ3RoIChpbiBieXRlcykgb2YgZGF0YSBmaWVsZCAqLwotCV91OAkJY29udHJvbDsJCS8qIDB4MDUgKi8KLQlfdTgJCWRhdGFbUEtUX01BWF9EQVRBX0xFTl07CS8qIDB4MDYgQWN0dWFsIGRhdGEgKi8KLQlfdTE2CQljc3VtOwkJCS8qIDB4NEUgQy1TVU0gKi8KLQotfSBQS1Q7Ci0KLS8qIFNhbWUgdGhpbmcgYWdhaW4sIGJ1dCBkZWZpbmVkIGFzIG9mZnNldHMuLi4gKi8KLQotI2RlZmluZQlQS1RfZGVzdF91bml0CQkweDAwCQkvKiAweDAwIERlc3RpbmF0aW9uIFVuaXQgSWQgKi8KLSNkZWZpbmUJUEtUX2Rlc3RfcG9ydAkJMHgwMQkJLyogMHgwMSBEZXN0aW5hdGlvbiBQb3J0ICovCi0jZGVmaW5lCVBLVF9zcmNfdW5pdAkJMHgwMgkJLyogMHgwMiBTb3VyY2UgVW5pdCBJZCAqLwotI2RlZmluZQlQS1Rfc3JjX3BvcnQJCTB4MDMJCS8qIDB4MDMgU291cmNlIFBvcnQgKi8KLSNkZWZpbmUJUEtUX2xlbgkJCTB4MDQJCS8qIDB4MDQgTGVuZ3RoIChpbiBieXRlcykgb2YgZGF0YSBmaWVsZCAqLwotI2RlZmluZQlQS1RfY29udHJvbAkJMHgwNQkJLyogMHgwNSAqLwotI2RlZmluZQlQS1RfZGF0YQkJMHgwNgkJLyogMHgwNiBBY3R1YWwgZGF0YSAqLwotI2RlZmluZQlQS1RfY3N1bQkJMHg0RQkJLyogMHg0RSBDLVNVTSAqLwotI2RlZmluZQlzaXplb2ZfUEtUCQkweDUwCQkvKiBzdHJ1Y3R1cmUgc2l6ZSA9IDB4NTAgKi8KLQotLyogUEtULmxlbiBkZWZpbml0aW9ucy4uLiAqLwotI2RlZmluZQlQS1RfQ01EX0JJVAkJMHg4MAotI2RlZmluZQlQS1RfQ01EX0RBVEEJCTB4ODAKLSNkZWZpbmUJUEtUX0xFTl9NQVNLCQkweDdGCi0KLS8qIFBLVC5jb250cm9sIGRlZmluaXRpb25zLi4uICovCi0jZGVmaW5lCVBLVF9BQ0sJCQkweDQwCi0jZGVmaW5lCVBLVF9UR0wJCQkweDIwCi0jZGVmaW5lCURBVEFfV05EVwkJMHgxMAotI2RlZmluZQlQS1RfVFRMX01BU0sJCTB4MEYKLSNkZWZpbmUJTUFYX1RUTAkJCTB4MEYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgQ29udHJvbCBQYWNrZXRzICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBhbmQgc3RydWN0dXJlcyBkZWZpbmUgdGhlIGNvbnRyb2wgcGFja2V0cyBzZW50Ci0gICBiZXR3ZWVuIHRoZSBkcml2ZXIgYW5kIFJJTyBQb3J0cywgUlRBcyBhbmQgSG9zdCBDYXJkcy4gKi8KLQotI2RlZmluZQlQUkVfRU1QVElWRQkJMHg4MAkJCS8qIFByZS1lbXB0aXZlIGNvbW1hbmQgKHNlbnQgdmlhIHBvcnQncyBSVVApICovCi0KLS8qICJpbi1iYW5kIiBhbmQgInByZS1lbXB0aXZlIiBwb3J0IGNvbW1hbmRzLi4uICovCi0jZGVmaW5lCU9QRU4JCQkweDAwCQkJLyogRHJpdmVyLT5SSU8gT3BlbiBhIHBvcnQgKi8KLSNkZWZpbmUJQ09ORklHCQkJMHgwMQkJCS8qIERyaXZlci0+UklPIENvbmZpZ3VyZSBhIHBvcnQgKi8KLSNkZWZpbmUJTU9QRU4JCQkweDAyCQkJLyogRHJpdmVyLT5SSU8gTW9kZW0gb3BlbiAod2FpdCBmb3IgRENEKSAqLwotI2RlZmluZQlDTE9TRQkJCTB4MDMJCQkvKiBEcml2ZXItPlJJTyBDbG9zZSBhIHBvcnQgKi8KLSNkZWZpbmUJV0ZMVVNICQkJKDB4MDR8UFJFX0VNUFRJVkUpCS8qIERyaXZlci0+UklPIFdyaXRlIGZsdXNoICovCi0jZGVmaW5lCVJGTFVTSAkJCSgweDA1fFBSRV9FTVBUSVZFKQkvKiBEcml2ZXItPlJJTyBSZWFkIGZsdXNoICovCi0jZGVmaW5lCVJFU1VNRQkJCSgweDA2fFBSRV9FTVBUSVZFKQkvKiBEcml2ZXItPlJJTyBCZWhhdmUgYXMgaWYgWE9OIHJlY2VpdmVkICovCi0jZGVmaW5lCVNCUkVBSwkJCTB4MDcJCQkvKiBEcml2ZXItPlJJTyBTdGFydCBicmVhayAqLwotI2RlZmluZQlFQlJFQUsJCQkweDA4CQkJLyogRHJpdmVyLT5SSU8gRW5kIGJyZWFrICovCi0jZGVmaW5lCVNVU1BFTkQJCQkoMHgwOXxQUkVfRU1QVElWRSkJLyogRHJpdmVyLT5SSU8gQmVoYXZlIGFzIGlmIFhPRkYgcmVjZWl2ZWQgKi8KLSNkZWZpbmUJRkNMT1NFCQkJKDB4MEF8UFJFX0VNUFRJVkUpCS8qIERyaXZlci0+UklPIEZvcmNlIGNsb3NlICovCi0jZGVmaW5lCVhQUklOVAkJCTB4MEIJCQkvKiBEcml2ZXItPlJJTyBYcHJpbnQgcGFja2V0ICovCi0jZGVmaW5lCU1CSVMJCQkoMHgwQ3xQUkVfRU1QVElWRSkJLyogRHJpdmVyLT5SSU8gU2V0IG1vZGVtIGxpbmVzICovCi0jZGVmaW5lCU1CSUMJCQkoMHgwRHxQUkVfRU1QVElWRSkJLyogRHJpdmVyLT5SSU8gQ2xlYXIgbW9kZW0gbGluZXMgKi8KLSNkZWZpbmUJTVNFVAkJCSgweDBFfFBSRV9FTVBUSVZFKQkvKiBEcml2ZXItPlJJTyBTZXQgbW9kZW0gbGluZXMgKi8KLSNkZWZpbmUJUENMT1NFCQkJMHgwRgkJCS8qIERyaXZlci0+UklPIFBzZXVkbyBjbG9zZSAqLwotI2RlZmluZQlNR0VUCQkJKDB4MTB8UFJFX0VNUFRJVkUpCS8qIERyaXZlci0+UklPIEZvcmNlIHVwZGF0ZSBvZiBtb2RlbSBzdGF0dXMgKi8KLSNkZWZpbmUJTUVNRFVNUAkJCSgweDExfFBSRV9FTVBUSVZFKQkvKiBEcml2ZXItPlJJTyBERUJVRyByZXF1ZXN0IGZvciBSVEEgbWVtb3J5ICovCi0jZGVmaW5lCVJFQURfUkVHSVNURVIJCSgweDEyfFBSRV9FTVBUSVZFKQkvKiBEcml2ZXItPlJJTyBERUJVRyByZWFkIENEMTQwMCByZWdpc3RlciAqLwotCi0vKiBSZW1vdGUgVW5pdCBQb3J0IChSVVApIHBhY2tldCBkZWZpbml0aW9ucy4uLiAoc3BlY2lmaWVkIGluIFBLVC5kZXN0X3VuaXQgYW5kIFBLVC5zcmNfdW5pdCkgKi8KLSNkZWZpbmUJU1lOQ19SVVAJCTB4RkYJCQkvKiBEb3dubG9hZCBpbnRlcm5hbCAqLwotI2RlZmluZQlDT01NQU5EX1JVUAkJMHhGRQkJCS8qIENvbW1hbmQgYWNrL3N0YXR1cyAqLwotI2RlZmluZQlFUlJPUl9SVVAJCTB4RkQJCQkvKiBEb3dubG9hZCBpbnRlcm5hbCAqLwotI2RlZmluZQlQT0xMX1JVUAkJMHhGQwkJCS8qIERvd25sb2FkIGludGVybmFsICovCi0jZGVmaW5lCUJPT1RfUlVQCQkweEZCCQkJLyogVXNlZCB0byBib290IFJUQXMgKi8KLSNkZWZpbmUJUk9VVEVfUlVQCQkweEZBCQkJLyogVXNlZCB0byBzcGVjaWZ5IHJvdXRpbmcvdG9wb2xvZ3kgKi8KLSNkZWZpbmUJU1RBVFVTX1JVUAkJMHhGOQkJCS8qIE5vdCB1c2VkICovCi0jZGVmaW5lCVBPV0VSX1JVUAkJMHhGOAkJCS8qIERvd25sb2FkIGludGVybmFsICovCi0KLS8qIENPTU1BTkRfUlVQIGRlZmluaXRpb25zLi4uICovCi0jZGVmaW5lCUNPTVBMRVRFCQkoMHgyMHxQUkVfRU1QVElWRSkJLyogUklPLT5Ecml2ZXIgQ29tbWFuZCBjb21wbGV0ZSAqLwotI2RlZmluZQlCUkVBS19SRUNFSVZFRAkJKDB4MjF8UFJFX0VNUFRJVkUpCS8qIFJJTy0+RHJpdmVyIEJyZWFrIHJlY2VpdmVkICovCi0jZGVmaW5lCU1PREVNX1NUQVRVUwkJKDB4MjJ8UFJFX0VNUFRJVkUpCS8qIFJJTy0+RHJpdmVyIE1vZGVtIHN0YXR1cyBjaGFuZ2UgKi8KLQotLyogQk9PVF9SVVAgZGVmaW5pdGlvbnMuLi4gKi8KLSNkZWZpbmUJQk9PVF9SRVFVRVNUCQkweDAwCQkJLyogUklPLT5Ecml2ZXIgUmVxdWVzdCBmb3IgYm9vdCAqLwotI2RlZmluZQlCT09UX0FCT1JUCQkweDAxCQkJLyogRHJpdmVyLT5SSU8gQWJvcnQgYSBib290ICovCi0jZGVmaW5lCUJPT1RfU0VRVUVOQ0UJCTB4MDIJCQkvKiBEcml2ZXItPlJJTyBQYWNrZXQgd2l0aCBmaXJtd2FyZSBkZXRhaWxzICovCi0jZGVmaW5lCUJPT1RfQ09NUExFVEVECQkweDAzCQkJLyogUklPLT5Ecml2ZXIgQm9vdCBjb21wbGV0ZWQgKi8KLSNkZWZpbmUgSUZPQUQJCQkweDJGCQkJLyogRHJpdmVyLT5SSU8gU2h1dGRvd24vUmVib290IFJUQSAoRmFsbCBPdmVyIEFuZCBEaWUpICovCi0jZGVmaW5lCUlERU5USUZZCQkweDMwCQkJLyogRHJpdmVyLT5SSU8gSWRlbnRpZnkgUlRBICovCi0jZGVmaW5lCVpPTUJJRQkJCTB4MzEJCQkvKiBEcml2ZXItPlJJTyBTaHV0ZG93bi9GbGFzaCBMRURzICovCi0jZGVmaW5lCVVGT0FECQkJMHgzMgkJCS8qIERyaXZlci0+UklPIFNodXRkb3duL1JlYm9vdCBuZWlnaGJvdXJpbmcgUlRBICovCi0jZGVmaW5lIElXQUlUCQkJMHgzMwkJCS8qIERyaXZlci0+UklPIFBhdXNlIGJvb3RpbmcgcHJvY2VzcyAqLwotCi0vKiBST1VURV9SVVAgZGVmaW5pdGlvbnMuLi4gKi8KLSNkZWZpbmUJUk9VVEVfUkVRVUVTVAkJMHgwMAkJCS8qIFJJTy0+RHJpdmVyIFJlcXVlc3QgYW4gSUQgKi8KLSNkZWZpbmUJUk9VVEVfRk9BRAkJMHgwMQkJCS8qIERyaXZlci0+UklPIFNodXRkb3duL3JlYm9vdCBSVEEgKi8KLSNkZWZpbmUJUk9VVEVfQUxSRUFEWQkJMHgwMgkJCS8qIERyaXZlci0+UklPIE5vdCB1c2VkICovCi0jZGVmaW5lCVJPVVRFX1VTRUQJCTB4MDMJCQkvKiBEcml2ZXItPlJJTyBOb3QgdXNlZCAqLwotI2RlZmluZQlST1VURV9BTExPQ0FURQkJMHgwNAkJCS8qIERyaXZlci0+UklPIEFsbG9jYXRlIFJUQSBSVVAgbnVtYmVycyAqLwotI2RlZmluZQlST1VURV9SRVFfVE9QCQkweDA1CQkJLyogRHJpdmVyLT5SSU8gTm90IHVzZWQgKi8KLSNkZWZpbmUgUk9VVEVfVE9QT0xPR1kJCTB4MDYJCQkvKiBSSU8tPkRyaXZlciBSb3V0ZS9Ub3BvbG9neSBzdGF0dXMgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBPUEVOICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogKERyaXZlci0+UklPLGluLWJhbmQpCi0KLSAgIFNlbnQgdG8gb3BlbiBhIHBvcnQuIAotICAgU3RydWN0dXJlIG9mIGNvbmZpZ3VyYXRpb24gaW5mbyB1c2VkIHdpdGggT1BFTiwgQ09ORklHIGFuZCBNT1BFTiBwYWNrZXRzLi4uICovCi0KLSNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCi0jZGVmaW5lCVBLVF9Db3IxCQkoUEtUX0RhdGErMSkJCS8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDEgKi8KLSNkZWZpbmUJUEtUX0NvcjIJCShQS1RfRGF0YSsyKQkJLyogQ2hhbm5lbCBPcHRpb24gUmVnaXN0ZXIgMiAqLwotI2RlZmluZQlQS1RfQ29yNAkJKFBLVF9EYXRhKzMpCQkvKiBDaGFubmVsIE9wdGlvbiBSZWdpc3RlciA0ICovCi0jZGVmaW5lCVBLVF9Db3I1CQkoUEtUX0RhdGErNCkJCS8qIENoYW5uZWwgT3B0aW9uIFJlZ2lzdGVyIDUgKi8KLSNkZWZpbmUJUEtUX1R4WG9uCQkoUEtUX0RhdGErNSkJCS8qIFRyYW5zbWl0IFhPTiBjaGFyYWN0ZXIgKi8KLSNkZWZpbmUJUEtUX1R4WG9mZgkJKFBLVF9EYXRhKzYpCQkvKiBUcmFuc21pdCBYT0ZGIGNoYXJhY3RlciAqLwotI2RlZmluZQlQS1RfUnhYb24JCShQS1RfRGF0YSs3KQkJLyogUmVjZWl2ZSBYT04gY2hhcmFjdGVyICovCi0jZGVmaW5lCVBLVF9SeFhvZmYJCShQS1RfRGF0YSs4KQkJLyogUmVjZWl2ZSBYT0ZGIGNoYXJhY3RlciAqLwotI2RlZmluZQlQS1RfTG5leHQJCShQS1RfRGF0YSs5KQkJLyogTG5leHQgY2hhcmFjdGVyICovCi0jZGVmaW5lCVBLVF9UeEJhdWQJCShQS1RfRGF0YSsxMCkJCS8qIFRyYW5zbWl0IGJhdWQgcmF0ZSAqLwotI2RlZmluZQlQS1RfUnhCYXVkCQkoUEtUX0RhdGErMTEpCQkvKiBSZWNlaXZlIGJhdWQgcmF0ZSAqLwotCi0vKiBDT1IxIGRlZmluaXRpb25zLi4uICovCi0jZGVmaW5lCUNPUjFfUEFSSVRZCQkweEUwCQkJLyogUGFyaXR5IG1hc2sgKi8KLSNkZWZpbmUJQ09SMV9OT05FCQkweDAwCQkJLyogTm8gcGFyaXR5ICovCi0jZGVmaW5lCUNPUjFfU1BBQ0UJCTB4MjAJCQkvKiBTcGFjZSBwYXJpdHkgKi8KLSNkZWZpbmUJQ09SMV9FVkVOCQkweDQwCQkJLyogRXZlbiBwYXJpdHkgKi8KLSNkZWZpbmUJQ09SMV9NQVJLCQkweEEwCQkJLyogTWFyayBwYXJpdHkgKi8KLSNkZWZpbmUJQ09SMV9PREQJCTB4QzAJCQkvKiBPZGQgcGFyaXR5ICovCi0KLSNkZWZpbmUJQ09SMV9TVE9QQklUUwkJMHgwQwkJCS8qIFN0b3AgYml0cyBtYXNrICovCi0jZGVmaW5lCUNPUjFfU1RPUDEJCTB4MDAJCQkvKiAxIHN0b3AgYml0ICovCi0jZGVmaW5lCUNPUjFfU1RPUDFfNQkJMHgwNAkJCS8qIDEuNSBzdG9wIGJpdHMgKi8KLSNkZWZpbmUJQ09SMV9TVE9QMgkJMHgwOAkJCS8qIDIgc3RvcCBiaXRzICovCi0KLSNkZWZpbmUJQ09SMV9EQVRBQklUUwkJMHgwMwkJCS8qIERhdGEgYml0cyBtYXNrICovCi0jZGVmaW5lCUNPUjFfREFUQTUJCTB4MDAJCQkvKiA1IGRhdGEgYml0cyAqLwotI2RlZmluZQlDT1IxX0RBVEE2CQkweDAxCQkJLyogNiBkYXRhIGJpdHMgKi8KLSNkZWZpbmUJQ09SMV9EQVRBNwkJMHgwMgkJCS8qIDcgZGF0YSBiaXRzICovCi0jZGVmaW5lCUNPUjFfREFUQTgJCTB4MDMJCQkvKiA4IGRhdGEgYml0cyAqLwotCi0vKiBDT1IyIGRlZmluaXRpb25zLi4uICovCi0jZGVmaW5lCUNPUjJfWE9OX1RYRkxPVwkJMHg0MAkJCS8qIFhPTi9YT0ZGIFRyYW5zbWl0IEZsb3cgKi8KLSNkZWZpbmUJQ09SMl9YQU5ZX1RYRkxPVwkweEMwCQkJLyogWE9OL1hBTlkgVHJhbnNtaXQgRmxvdyAqLwotI2RlZmluZQlDT1IyX0hVUENMCQkweDIwCQkJLyogSGFuZyBVcCBPbiBDbG9zZSAqLwotI2RlZmluZQlDT1IyX0RTUl9UWEZMT1cJCTB4MDgJCQkvKiBEU1IgVHJhbnNtaXQgRmxvdyBDb250cm9sICovCi0jZGVmaW5lCUNPUjJfUlRTX1JYRkxPVwkJMHgwNAkJCS8qIFJUUyBSZWNlaXZlIEZsb3cgQ29udHJvbCAqLwotI2RlZmluZQlDT1IyX0NUU19UWEZMT1cJCTB4MDIJCQkvKiBDVFMgVHJhbnNtaXQgRmxvdyBDb250cm9sICovCi0jZGVmaW5lCUNPUjJfWE9OX1JYRkxPVwkJMHgwMQkJCS8qIFhPTi9YT0ZGIFJlY2VpdmUgRmxvdyAqLwotCi0vKiBDT1I0IGRlZmluaXRpb24uLi4gKi8KLSNkZWZpbmUJQ09SNF9JR05DUgkJMHg4MAkJCS8qIERpc2NhcmQgcmVjZWl2ZWQgQ1IgKi8KLSNkZWZpbmUJQ09SNF9JQ1JOTAkJMHg0MAkJCS8qIE1hcCByZWNlaXZlZCBDUiAtPiBOTCAqLwotI2RlZmluZQlDT1I0X0lOTENSCQkweDIwCQkJLyogTWFwIHJlY2VpdmVkIE5MIC0+IENSICovCi0jZGVmaW5lCUNPUjRfSUdOQlJLCQkweDEwCQkJLyogSWdub3JlIFJlY2VpdmVkIEJyZWFrICovCi0jZGVmaW5lCUNPUjRfTkJSS0lOVAkJMHgwOAkJCS8qIE5vIGludGVycnVwdCBvbiByeCBCcmVhayAqLwotI2RlZmluZQlDT1I0X0lHTlBBUgkJMHgwNAkJCS8qIGlnbm9yZSByeCBwYXJpdHkgZXJyb3IgY2hhcnMgKi8KLSNkZWZpbmUJQ09SNF9QQVJNUksJCTB4MDIJCQkvKiBNYXJrIHJ4IHBhcml0eSBlcnJvciBjaGFycyAqLwotI2RlZmluZQlDT1I0X1JBSVNFTU9ECQkweDAxCQkJLyogUmFpc2UgbW9kZW0gbGluZXMgb24gITAgYmF1ZCAqLwotCi0vKiBDT1I1IGRlZmluaXRpb25zLi4uICovCi0jZGVmaW5lCUNPUjVfSVNUUklQCQkweDgwCQkJLyogU3RyaXAgaW5wdXQgY2hhcnMgdG8gNyBiaXRzICovCi0jZGVmaW5lCUNPUjVfTE5FCQkweDQwCQkJLyogRW5hYmxlIExORVhUIHByb2Nlc3NpbmcgKi8KLSNkZWZpbmUJQ09SNV9DTU9FCQkweDIwCQkJLyogTWF0Y2ggZ29vZCAmIGVycm9yIGNoYXJhY3RlcnMgKi8KLSNkZWZpbmUJQ09SNV9UQUIzCQkweDEwCQkJLyogVEFCMyBtb2RlICovCi0jZGVmaW5lCUNPUjVfVFNUQVRFX09OCQkweDA4CQkJLyogRW5hYmxlIHRidXN5L3RzdG9wIG1vbml0b3JpbmcgKi8KLSNkZWZpbmUJQ09SNV9UU1RBVEVfT0ZGCQkweDA0CQkJLyogRGlzYWJsZSB0YnVzeS90c3RvcCBtb25pdG9yaW5nICovCi0jZGVmaW5lCUNPUjVfT05MQ1IJCTB4MDIJCQkvKiBOTCAtPiBDUiBOTCBvbiBvdXRwdXQgKi8KLSNkZWZpbmUJQ09SNV9PQ1JOTAkJMHgwMQkJCS8qIENSIC0+IE5MIG9uIG91dHB1dCAqLwotCi0vKiBSeEJhdWQgYW5kIFR4QmF1ZCBkZWZpbml0aW9ucy4uLiAqLwotI2RlZmluZQlSSU9fQjAJCQkweDAwCQkJLyogUlRTIC8gRFRSIHNpZ25hbHMgZHJvcHBlZCAqLwotI2RlZmluZQlSSU9fQjUwCQkJMHgwMQkJCS8qIDUwIGJhdWQgKi8KLSNkZWZpbmUJUklPX0I3NQkJCTB4MDIJCQkvKiA3NSBiYXVkICovCi0jZGVmaW5lCVJJT19CMTEwCQkweDAzCQkJLyogMTEwIGJhdWQgKi8KLSNkZWZpbmUJUklPX0IxMzQJCTB4MDQJCQkvKiAxMzQuNSBiYXVkICovCi0jZGVmaW5lCVJJT19CMTUwCQkweDA1CQkJLyogMTUwIGJhdWQgKi8KLSNkZWZpbmUJUklPX0IyMDAJCTB4MDYJCQkvKiAyMDAgYmF1ZCAqLwotI2RlZmluZQlSSU9fQjMwMAkJMHgwNwkJCS8qIDMwMCBiYXVkICovCi0jZGVmaW5lCVJJT19CNjAwCQkweDA4CQkJLyogNjAwIGJhdWQgKi8KLSNkZWZpbmUJUklPX0IxMjAwCQkweDA5CQkJLyogMTIwMCBiYXVkICovCi0jZGVmaW5lCVJJT19CMTgwMAkJMHgwQQkJCS8qIDE4MDAgYmF1ZCAqLwotI2RlZmluZQlSSU9fQjI0MDAJCTB4MEIJCQkvKiAyNDAwIGJhdWQgKi8KLSNkZWZpbmUJUklPX0I0ODAwCQkweDBDCQkJLyogNDgwMCBiYXVkICovCi0jZGVmaW5lCVJJT19COTYwMAkJMHgwRAkJCS8qIDk2MDAgYmF1ZCAqLwotI2RlZmluZQlSSU9fQjE5MjAwCQkweDBFCQkJLyogMTkyMDAgYmF1ZCAqLwotI2RlZmluZQlSSU9fQjM4NDAwCQkweDBGCQkJLyogMzg0MDAgYmF1ZCAqLwotI2RlZmluZQlSSU9fQjU2MDAwCQkweDEwCQkJLyogNTYwMDAgYmF1ZCAqLwotI2RlZmluZQlSSU9fQjU3NjAwCQkweDExCQkJLyogNTc2MDAgYmF1ZCAqLwotI2RlZmluZQlSSU9fQjY0MDAwCQkweDEyCQkJLyogNjQwMDAgYmF1ZCAqLwotI2RlZmluZQlSSU9fQjExNTIwMAkJMHgxMwkJCS8qIDExNTIwMCBiYXVkICovCi0jZGVmaW5lCVJJT19CMjAwMAkJMHgxNAkJCS8qIDIwMDAgYmF1ZCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgQ09ORklHICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAoRHJpdmVyLT5SSU8saW4tYmFuZCkKLQotICAgQ09ORklHIGlzIHNlbnQgZnJvbSB0aGUgZHJpdmVyIHRvIGNvbmZpZ3VyZSBhbiBhbHJlYWR5IG9wZW5lZCBwb3J0LgotICAgUGFja2V0IHN0cnVjdHVyZSBpcyBzYW1lIGFzIE9QRU4uICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgTU9QRU4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAoRHJpdmVyLT5SSU8saW4tYmFuZCkKLQotICAgTU9QRU4gaXMgc2VudCBmcm9tIHRoZSBkcml2ZXIgdG8gb3BlbiBhIHBvcnQgYXR0YWNoZWQgdG8gYSBtb2RlbS4gKGluLWJhbmQpCi0gICBQYWNrZXQgc3RydWN0dXJlIGlzIHNhbWUgYXMgT1BFTi4gICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBDTE9TRSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIChEcml2ZXItPlJJTyxpbi1iYW5kKQotCi0gICBDTE9TRSBpcyBzZW50IGZyb20gdGhlIGRyaXZlciB0byBjbG9zZSBhIHByZXZpb3VzbHkgb3BlbmVkIHBvcnQuCi0gICBObyBwYXJhbWV0ZXJzLgotICovCi0jaWYgMAotI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KLSNlbmRpZgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFdGTFVTSCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQotCi0gICBXRkxVU0ggaXMgc2VudCBwcmUtZW1wdGl2ZWx5IGZyb20gdGhlIGRyaXZlciB0byBmbHVzaCB0aGUgd3JpdGUgYnVmZmVycyBhbmQKLSAgIHBhY2tldHMgb2YgYSBwb3J0LiAgKHByZS1lbXB0aXZlKQotICAgCi0gICBXRkxVU0ggaXMgYWxzbyBzZW50IGluLWJhbmQgZnJvbSB0aGUgZHJpdmVyIHRvIGEgcG9ydCBhcyBhIG1hcmtlciB0byBlbmQKLSAgIHdyaXRlIGZsdXNoaW5nIHByZXZpb3VzbHkgc3RhcnRlZCBieSBhIHByZS1lbXB0aXZlIFdGTFVTSCBwYWNrZXQuIChpbi1iYW5kKQotICAgKi8KLSNpZiAwCi0jZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLwotI2VuZGlmCi0jZGVmaW5lCVBLVF9QaGJOdW0JCShQS1RfRGF0YSsxKQkJLyogUG9ydCBudW1iZXIgd3J0IFJUQSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgUkZMVVNIICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCi0KLSAgIFJGTFVTSCBpcyBzZW50IHByZS1lbXB0aXZlbHkgZnJvbSB0aGUgZHJpdmVyIHRvIGZsdXNoIHRoZSByZWFkIGJ1ZmZlcnMgYW5kCi0gICBwYWNrZXRzIG9mIGEgcG9ydC4KLSAgICovCi0jaWYgMAotI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KLSNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFJFU1VNRSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQotCi0gICBSRVNVTUUgaXMgc2VudCBwcmUtZW1wdGl2ZWx5IGZyb20gdGhlIGRyaXZlciB0byBjYXVzZSBhIHBvcnQgdG8gcmVzdW1lIAotICAgdHJhbnNtaXNzaW9uIG9mIGRhdGEgaWYgYmxvY2tlZCBieSBYT0ZGLiAgKGFzIGlmIFhPTiBoYWQgYmVlbiByZWNlaXZlZCkKLSAgICovCi0jaWYgMAotI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KLSNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFNCUkVBSyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogKERyaXZlci0+UklPLGluLWJhbmQpCi0KLSAgIFNCUkVBSyBpcyBzZW50IGluLWJhbmQgZnJvbSB0aGUgZHJpdmVyIHRvIGEgcG9ydCB0byBzdXNwZW5kIGRhdGEgYW5kIHN0YXJ0Ci0gICBicmVhayBzaWduYWwgdHJhbnNtaXNzaW9uLgotCi0gICBJZiB0aGUgYnJlYWsgZGVsYXkgaXMgMCwgdGhlIGJyZWFrIHNpZ25hbCB3aWxsIGJlIGFja25vd2xlZGdlZCB3aXRoIGEKLSAgIFJVUF9DT01NQU5ELCBDT01QTEVURSBwYWNrZXQgYW5kIGNvbnRpbnVlIHVudGlsIGFuIEVCUkVBSyBwYWNrZXQgaXMgcmVjZWl2ZWQuCi0KLSAgIE90aGVyd2lzZSwgdGhlcmUgaXMgbm8gYWNrbm93bGVkZ2VtZW50IGFuZCB0aGUgYnJlYWsgc2lnbmFsIHdpbGwgbGFzdCBmb3IgdGhlCi0gICBzcGVjaWZpZWQgbnVtYmVyIG9mIG1TLgotICAgKi8KLSNpZiAwCi0jZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLwotI2VuZGlmCi0jZGVmaW5lCVBLVF9CcmVha0RlbGF5CQkoUEtUX0RhdGErMSkJCS8qIEJyZWFrIGRlbGF5IGluIG1TICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBFQlJFQUsgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIChEcml2ZXItPlJJTyxpbi1iYW5kKQotCi0gICBFQlJFQUsgaXMgc2VudCBpbi1iYW5kIGZyb20gdGhlIGRyaXZlciB0byBhIHBvcnQgdG8gc3RvcCB0cmFuc21pc3Npb24gb2YgYQotICAgYnJlYWsgc2lnbmFsLgotCi0gICBObyBwYXJhbWV0ZXJzLiAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFNVU1BFTkQgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQotCi0gICBTVVNQRU5EIGlzIHNlbnQgcHJlLWVtcHRpdmVseSBmcm9tIHRoZSBkcml2ZXIgdG8gY2F1c2UgYSBwb3J0IHRvIHN1c3BlbmQKLSAgIHRyYW5zbWlzc2lvbiBvZiBkYXRhLiAgKGFzIGlmIFhPRkYgaGFkIGJlZW4gcmVjZWl2ZWQpCi0gICAqLwotI2lmIDAKLSNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCi0jZGVmaW5lCVBLVF9QaGJOdW0JCShQS1RfRGF0YSsxKQkJLyogUG9ydCBudW1iZXIgd3J0IFJUQSAqLwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBGQ0xPU0UgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKLQotICAgRkNMT1NFIGlzIHNlbnQgcHJlLWVtcHRpdmVseSBmcm9tIHRoZSBkcml2ZXIgdG8gZm9yY2UgY2xvc2UgYSBwb3J0LgotICAgQSBmb3JjZSBjbG9zZSBmbHVzaGVzIHJlY2VpdmUgYW5kIHRyYW5zbWl0IHF1ZXVlcywgYW5kIGFsc28gbG93ZXJzIGFsbCBvdXRwdXQKLSAgIG1vZGVtIHNpZ25hbHMgaWYgdGhlIENPUjVfSFVQQ0wgKEhhbmcgVXAgT24gQ2xvc2UpIGZsYWcgaXMgc2V0LgotICAgKi8KLSNpZiAwCi0jZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLwotI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qIFBvcnQgbnVtYmVyIHdydCBSVEEgKi8KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgWFBSSU5UICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAoRHJpdmVyLT5SSU8saW4tYmFuZCkKLQotICAgWFBSSU5UIGlzIHNlbnQgYXMgYSBub3JtYWwgSS9PIGRhdGEgcGFja2V0IGV4Y2VwdCB0aGF0IHRoZSBQS1RfQ01EX0JJVCBvZgotICAgdGhlICJsZW4iIGZpZWxkIGlzIHNldCwgYW5kIHRoZSBmaXJzdCAiZGF0YSIgYnl0ZSBpcyBYUFJJTlQuCi0KLSAgIFRoZSBJL08gZGF0YSBpbiB0aGUgWFBSSU5UIHBhY2tldCB3aWxsIGNvbnRhaW4gdGhlIGZvbGxvd2luZzoKLSAgIC0JVHJhbnNwYXJlbnQgUHJpbnQgU3RhcnQgU2VxdWVuY2UKLSAgIC0JVHJhbnNwYXJlbnQgUHJpbnQgRGF0YQotICAgLQlUcmFuc3BhcmVudCBQcmludCBTdG9wIFNlcXVlbmNlLgotICAgKi8KLSNpZiAwCi0jZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLwotI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qIFBvcnQgbnVtYmVyIHdydCBSVEEgKi8KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIE1CSVMgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCi0KLSAgIE1CSVMgaXMgc2VudCBwcmUtZW1wdGl2ZWx5IGZyb20gdGhlIGRyaXZlciB0byBzZXQgYSBwb3J0J3MgbW9kZW0gc2lnbmFscy4KLSAgICovCi0jaWYgMAotI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KLSNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCi0jZW5kaWYKLSNkZWZpbmUJUEtUX01vZGVtU2V0CQkoUEtUX0RhdGErNCkJCS8qIE1vZGVtIHNldCBzaWduYWxzIG1hc2sgKi8KLQotLyogTW9kZW1TZXQgZGVmaW5pdGlvbnMuLi4gKi8KLSNkZWZpbmUJTUJJU19SVFMJCTB4MDEJCQkvKiBSVFMgbW9kZW0gc2lnbmFsICovCi0jZGVmaW5lCU1CSVNfRFRSCQkweDAyCQkJLyogRFRSIG1vZGVtIHNpZ25hbCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIE1CSUMgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCi0KLSAgIE1CSUMgaXMgc2VudCBwcmUtZW1wdGl2ZWx5IGZyb20gdGhlIGRyaXZlciB0byBjbGVhciBhIHBvcnQncyBtb2RlbSBzaWduYWxzLgotICAgKi8KLSNpZiAwICAgCi0jZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLwotI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qIFBvcnQgbnVtYmVyIHdydCBSVEEgKi8KLSNlbmRpZgotCi0jZGVmaW5lCVBLVF9Nb2RlbUNsZWFyCQkoUEtUX0RhdGErNCkJCS8qIE1vZGVtIGNsZWFyIHNpZ25hbHMgbWFzayAqLwotCi0vKiBNb2RlbUNsZWFyIGRlZmluaXRpb25zLi4uICovCi0jZGVmaW5lCU1CSUNfUlRTCQkweDAxCQkJLyogUlRTIG1vZGVtIHNpZ25hbCAqLwotI2RlZmluZQlNQklDX0RUUgkJMHgwMgkJCS8qIERUUiBtb2RlbSBzaWduYWwgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBNU0VUICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQotCi0gICBNU0VUIGlzIHNlbnQgcHJlLWVtcHRpdmVseSBmcm9tIHRoZSBkcml2ZXIgdG8gc2V0L2NsZWFyIGEgcG9ydCdzIG1vZGVtIHNpZ25hbHMuICovCi0jaWYgMAotI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KLSNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCi0jZW5kaWYKLQotI2RlZmluZQlQS1RfTW9kZW1TZXQJCShQS1RfRGF0YSs0KQkJLyogTW9kZW0gc2V0IHNpZ25hbHMgbWFzayAqLwotCi0vKiBNb2RlbVNldCBkZWZpbml0aW9ucy4uLiAqLwotI2RlZmluZQlNU0VUX1JUUwkJMHgwMQkJCS8qIFJUUyBtb2RlbSBzaWduYWwgKi8KLSNkZWZpbmUJTVNFVF9EVFIJCTB4MDIJCQkvKiBEVFIgbW9kZW0gc2lnbmFsICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBQQ0xPU0UgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIChEcml2ZXItPlJJTyxpbi1iYW5kKQotCi0gICBQQ0xPU0UgaXMgc2VudCBmcm9tIHRoZSBkcml2ZXIgdG8gcHNldWRvIGNsb3NlIGEgcHJldmlvdXNseSBvcGVuZWQgcG9ydC4KLSAgIAotICAgVGhlIHBvcnQgd2lsbCBjbG9zZSB3aGVuIGFsbCBkYXRhIGhhcyBiZWVuIHNlbnQvcmVjZWl2ZWQsIGhvd2V2ZXIsIHRoZQotICAgcG9ydCdzIHRyYW5zbWl0IC8gcmVjZWl2ZSBhbmQgbW9kZW0gc2lnbmFscyB3aWxsIGJlIGxlZnQgZW5hYmxlZCBhbmQgdGhlCi0gICBwb3J0IG1hcmtlZCBpbnRlcm5hbGx5IGFzIFBzZXVkbyBDbG9zZWQuICovCi0KLSNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgTUdFVCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKLQotICAgTUdFVCBpcyBzZW50IHByZS1lbXB0aXZlbHkgZnJvbSB0aGUgZHJpdmVyIHRvIHJlcXVlc3QgdGhlIHBvcnQncyBjdXJyZW50IG1vZGVtIHNpZ25hbHMuICovCi0KLSNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCi0jZGVmaW5lCVBLVF9QaGJOdW0JCShQS1RfRGF0YSsxKQkJLyogUG9ydCBudW1iZXIgd3J0IFJUQSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgTUVNRFVNUCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCi0KLSAgIE1FTURVTVAgaXMgc2VudCBwcmUtZW1wdGl2ZWx5IGZyb20gdGhlIGRyaXZlciB0byByZXF1ZXN0IGEgZHVtcCBvZiAzMiBieXRlcwotICAgb2YgdGhlIHNwZWNpZmllZCBwb3J0J3MgUlRBIGFkZHJlc3Mgc3BhY2UuCi0gICAqLwotI2lmIDAKLSNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCi0jZW5kaWYKLSNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCi0jZGVmaW5lCVBLVF9TdWJDbWQJCShQS1RfRGF0YSs1KQkJLyogU3ViIENvbW1hbmQgKi8KLSNkZWZpbmUJUEtUX0FkZHJlc3MJCShQS1RfRGF0YSs2KQkJLyogUmVxdWVzdGVkIGFkZHJlc3MgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIFJFQURfUkVHSVNURVIgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQotCi0gICBSRUFEX1JFR0lTVEVSIGlzIHNlbnQgcHJlLWVtcHRpdmVseSBmcm9tIHRoZSBkcml2ZXIgdG8gcmVxdWVzdCB0aGUgY29udGVudHMKLSAgIG9mIHRoZSBDRDE0MDAgcmVnaXN0ZXIgc3BlY2lmaWVkIGluIGFkZHJlc3MuCi0gICAqLwotI2lmIDAKLSNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCi0jZW5kaWYKLSNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCi0jZGVmaW5lCVBLVF9TdWJDbWQJCShQS1RfRGF0YSs1KQkJLyogU3ViIENvbW1hbmQgKi8KLSNkZWZpbmUJUEtUX0FkZHJlc3MJCShQS1RfRGF0YSs2KQkJLyogUmVxdWVzdGVkIGFkZHJlc3MgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKiAgIENPTU1BTkRfUlVQIC0gQ09NUExFVEUgICAqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogKFJJTy0+RHJpdmVyLHByZS1lbXB0aXZlKQotCi0gICBDT01NQU5EX1JVUCAtIENPTVBMRVRFIGlzIHNlbnQgaW4gcmVzcG9uc2UgdG8gYWxsIHBvcnQgSS9PIGNvbnRyb2wgY29tbWFuZAotICAgcGFja2V0cywgZXhjZXB0IE1FTURVTVAgYW5kIFJFQURfUkVHSVNURVIuCi0gICAqLwotI2lmIDAKLSNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCi0jZW5kaWYKLSNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCi0jZGVmaW5lCVBLVF9DbWQyCQkoUEtUX0RhdGErMikJCS8qIENvbW1hbmQgY29kZSBjb3B5ICovCi0jZGVmaW5lCVBLVF9Nb2RlbVN0YXR1cwkJKFBLVF9EYXRhKzMpCQkvKiBNb2RlbSBzaWduYWwgc3RhdHVzICovCi0jZGVmaW5lCVBLVF9Qb3J0U3RhdHVzCQkoUEtUX0RhdGErNCkJCS8qIFBvcnQgc2lnbmFsIHN0YXR1cyAqLwotI2RlZmluZQlQS1RfU3ViQ21kCQkoUEtUX0RhdGErNSkJCS8qIFN1YiBDb21tYW5kICovCi0KLS8qIE1vZGVtU3RhdHVzIGRlZmluaXRpb25zLi4uICovCi0jZGVmaW5lCU1PREVNX0RTUgkJMHg4MAkJCS8qIERhdGEgU2V0IFJlYWR5IG1vZGVtIHN0YXRlICovCi0jZGVmaW5lCU1PREVNX0NUUwkJMHg0MAkJCS8qIENsZWFyIFRvIFNlbmQgbW9kZW0gc3RhdGUgKi8KLSNkZWZpbmUJTU9ERU1fUkkJCTB4MjAJCQkvKiBSaW5nIEluZGljYXRlIG1vZGVtIHN0YXRlICovCi0jZGVmaW5lCU1PREVNX0NECQkweDEwCQkJLyogQ2FycmllciBEZXRlY3QgbW9kZW0gc3RhdGUgKi8KLSNkZWZpbmUJTU9ERU1fVFNUT1AJCTB4MDgJCQkvKiBUcmFuc21pdCBTdG9wcGVkIHN0YXRlICovCi0jZGVmaW5lCU1PREVNX1RFTVBUWQkJMHgwNAkJCS8qIFRyYW5zbWl0IEVtcHR5IHN0YXRlICovCi0jZGVmaW5lCU1PREVNX0RUUgkJMHgwMgkJCS8qIERUUiBtb2RlbSBvdXRwdXQgc3RhdGUgKi8KLSNkZWZpbmUJTU9ERU1fUlRTCQkweDAxCQkJLyogUlRTIG1vZGVtIG91dHB1dCBzdGF0ZSAqLwotCi0vKiBQb3J0U3RhdHVzIGRlZmluaXRpb25zLi4uICovCi0jZGVmaW5lCVBPUlRfSVNPUEVOCQkweDAxCQkJLyogUG9ydCBvcGVuID8gKi8KLSNkZWZpbmUJUE9SVF9IVVBDTAkJMHgwMgkJCS8qIEhhbmd1cCBvbiBjbG9zZT8gKi8KLSNkZWZpbmUJUE9SVF9NT1BFTlBFTkQJCTB4MDQJCQkvKiBNb2RlbSBvcGVuIHBlbmRpbmcgKi8KLSNkZWZpbmUJUE9SVF9JU1BBUkFMTEVMCQkweDA4CQkJLyogUGFyYWxsZWwgcG9ydCAqLwotI2RlZmluZQlQT1JUX0JSRUFLCQkweDEwCQkJLyogUG9ydCBvbiBicmVhayAqLwotI2RlZmluZQlQT1JUX1NUQVRVU1BFTkQJCTAwMjAJCQkvKiBTdGF0dXMgcGFja2V0IHBlbmRpbmcgKi8KLSNkZWZpbmUJUE9SVF9CUkVBS1BFTkQJCTB4NDAJCQkvKiBCcmVhayBwYWNrZXQgcGVuZGluZyAqLwotI2RlZmluZQlQT1JUX01PREVNUEVORAkJMHg4MAkJCS8qIE1vZGVtIHN0YXR1cyBwYWNrZXQgcGVuZGluZyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqICAgQ09NTUFORF9SVVAgLSBDT01QTEVURSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAoUklPLT5Ecml2ZXIscHJlLWVtcHRpdmUpCi0KLSAgIENPTU1BTkRfUlVQIC0gQ09NUExFVEUgaXMgc2VudCBpbiByZXNwb25zZSB0byBhbGwgcG9ydCBJL08gY29udHJvbCBjb21tYW5kCi0gICBwYWNrZXRzLCBleGNlcHQgTUVNRFVNUCBhbmQgUkVBRF9SRUdJU1RFUi4KLSAgICovCi0jaWYgMAotI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KLSNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCi0jZGVmaW5lCVBLVF9DbWQyCQkoUEtUX0RhdGErMikJCS8qIENvbW1hbmQgY29kZSBjb3B5ICovCi0jZW5kaWYKLSNkZWZpbmUJUEtUX01vZGVtU3RhdHVzCQkoUEtUX0RhdGErMykJCS8qIE1vZGVtIHNpZ25hbCBzdGF0dXMgKi8KLSNkZWZpbmUJUEtUX1BvcnRTdGF0dXMJCShQS1RfRGF0YSs0KQkJLyogUG9ydCBzaWduYWwgc3RhdHVzICovCi0jaWYgMAotI2RlZmluZQlQS1RfU3ViQ21kCQkoUEtUX0RhdGErNSkJCS8qIFN1YiBDb21tYW5kICovCi0jZW5kaWYKLQotLyogTW9kZW1TdGF0dXMgZGVmaW5pdGlvbnMuLi4gKi8KLSNkZWZpbmUJTU9ERU1fRFNSCQkweDgwCQkJLyogRGF0YSBTZXQgUmVhZHkgbW9kZW0gc3RhdGUgKi8KLSNkZWZpbmUJTU9ERU1fQ1RTCQkweDQwCQkJLyogQ2xlYXIgVG8gU2VuZCBtb2RlbSBzdGF0ZSAqLwotI2RlZmluZQlNT0RFTV9SSQkJMHgyMAkJCS8qIFJpbmcgSW5kaWNhdGUgbW9kZW0gc3RhdGUgKi8KLSNkZWZpbmUJTU9ERU1fQ0QJCTB4MTAJCQkvKiBDYXJyaWVyIERldGVjdCBtb2RlbSBzdGF0ZSAqLwotI2RlZmluZQlNT0RFTV9UU1RPUAkJMHgwOAkJCS8qIFRyYW5zbWl0IFN0b3BwZWQgc3RhdGUgKi8KLSNkZWZpbmUJTU9ERU1fVEVNUFRZCQkweDA0CQkJLyogVHJhbnNtaXQgRW1wdHkgc3RhdGUgKi8KLSNkZWZpbmUJTU9ERU1fRFRSCQkweDAyCQkJLyogRFRSIG1vZGVtIG91dHB1dCBzdGF0ZSAqLwotI2RlZmluZQlNT0RFTV9SVFMJCTB4MDEJCQkvKiBSVFMgbW9kZW0gb3V0cHV0IHN0YXRlICovCi0KLS8qIFBvcnRTdGF0dXMgZGVmaW5pdGlvbnMuLi4gKi8KLSNkZWZpbmUJUE9SVF9JU09QRU4JCTB4MDEJCQkvKiBQb3J0IG9wZW4gPyAqLwotI2RlZmluZQlQT1JUX0hVUENMCQkweDAyCQkJLyogSGFuZ3VwIG9uIGNsb3NlPyAqLwotI2RlZmluZQlQT1JUX01PUEVOUEVORAkJMHgwNAkJCS8qIE1vZGVtIG9wZW4gcGVuZGluZyAqLwotI2RlZmluZQlQT1JUX0lTUEFSQUxMRUwJCTB4MDgJCQkvKiBQYXJhbGxlbCBwb3J0ICovCi0jZGVmaW5lCVBPUlRfQlJFQUsJCTB4MTAJCQkvKiBQb3J0IG9uIGJyZWFrICovCi0jZGVmaW5lCVBPUlRfU1RBVFVTUEVORAkJMDAyMAkJCS8qIFN0YXR1cyBwYWNrZXQgcGVuZGluZyAqLwotI2RlZmluZQlQT1JUX0JSRUFLUEVORAkJMHg0MAkJCS8qIEJyZWFrIHBhY2tldCBwZW5kaW5nICovCi0jZGVmaW5lCVBPUlRfTU9ERU1QRU5ECQkweDgwCQkJLyogTW9kZW0gc3RhdHVzIHBhY2tldCBwZW5kaW5nICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKiAgIENPTU1BTkRfUlVQIC0gQ09NUExFVEUgLSBNRU1EVU1QICAgKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIChSSU8tPkRyaXZlcixwcmUtZW1wdGl2ZSkKLQotICAgQ09NTUFORF9SVVAgLSBDT01QTEVURSAtIE1FTURVTVAgaXMgc2VudCBhcyBhbiBhY2tub3dsZWRnZW1lbnQgZm9yIGEgTUVNRFVNUAotICAgcG9ydCBJL08gY29udHJvbCBjb21tYW5kIHBhY2tldC4KLSAgICovCi0jaWYgMAotI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KLSNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCi0jZGVmaW5lCVBLVF9DbWQyCQkoUEtUX0RhdGErMikJCS8qIENvbW1hbmQgY29kZSBjb3B5ICovCi0jZGVmaW5lCVBLVF9Nb2RlbVN0YXR1cwkJKFBLVF9EYXRhKzMpCQkvKiBNb2RlbSBzaWduYWwgc3RhdHVzICovCi0jZGVmaW5lCVBLVF9Qb3J0U3RhdHVzCQkoUEtUX0RhdGErNCkJCS8qIFBvcnQgc2lnbmFsIHN0YXR1cyAqLwotI2RlZmluZQlQS1RfU3ViQ21kCQkoUEtUX0RhdGErNSkJCS8qIFN1YiBDb21tYW5kICovCi0jZGVmaW5lCVBLVF9BZGRyZXNzCQkoUEtUX0RhdGErNikJCS8qIFJlcXVlc3RlZCBhZGRyZXNzICovCi0jZW5kaWYKLSNkZWZpbmUJUEtUX0R1bXAJCShQS1RfRGF0YSs4KQkJLyogMzJieXRlcyBvZiByZXF1ZXN0ZWQgZHVtcCBkYXRhICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKiAgIENPTU1BTkRfUlVQIC0gQ09NUExFVEUgLSBSRUFEX1JFR0lTVEVSICAgKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIChSSU8tPkRyaXZlcixwcmUtZW1wdGl2ZSkKLQotICAgQ09NTUFORF9SVVAgLSBDT01QTEVURSAtIFJFQURfUkVHSVNURVIgaXMgc2VudCBhcyBhbiBhY2tub3dsZWRnZW1lbnQgZm9yIGEKLSAgIFJFQURfUkVHSVNURVIgcG9ydCBJL08gY29udHJvbCBjb21tYW5kIHBhY2tldC4KLSAgICovCi0jaWYgMAotI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKkNvbW1hbmQgY29kZSAqLwotI2RlZmluZQlQS1RfUGhiTnVtCQkoUEtUX0RhdGErMSkJCS8qUG9ydCBudW1iZXIgd3J0IFJUQSAqLwotI2RlZmluZQlQS1RfQ21kMgkJKFBLVF9EYXRhKzIpCQkvKiBDb21tYW5kIGNvZGUgY29weSAqLwotI2VuZGlmCi0jZGVmaW5lCVBLVF9SZWdpc3RlclZhbHVlCShQS1RfRGF0YSszKQkJLyogTW9kZW0gc2lnbmFsIHN0YXR1cyAqLwotI2lmIDAKLSNkZWZpbmUJUEtUX1BvcnRTdGF0dXMJCShQS1RfRGF0YSs0KQkJLyogUG9ydCBzaWduYWwgc3RhdHVzICovCi0jZGVmaW5lCVBLVF9TdWJDbWQJCShQS1RfRGF0YSs1KQkJLyogU3ViIENvbW1hbmQgKi8KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqICAgQ09NTUFORF9SVVAgLSBCUkVBS19SRUNFSVZFRCAgICoqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAoUklPLT5Ecml2ZXIscHJlLWVtcHRpdmUpCi0KLSAgIENPTU1BTkRfUlVQIC0gQlJFQUtfUkVDRUlWRUQgcGFja2V0cyBhcmUgc2VudCB3aGVuIHRoZSBwb3J0IGRldGVjdHMgYSByZWNlaXZlIEJSRUFLIHNpZ25hbC4KLSAgICovCi0jaWYgMAotI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KLSNkZWZpbmUJUEtUX1BoYk51bQkJKFBLVF9EYXRhKzEpCQkvKiBQb3J0IG51bWJlciB3cnQgUlRBICovCi0jZGVmaW5lCVBLVF9DbWQyCQkoUEtUX0RhdGErMikJCS8qIENvbW1hbmQgY29kZSBjb3B5ICovCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKiAgIENPTU1BTkRfUlVQIC0gTU9ERU1fU1RBVFVTICAgKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogKFJJTy0+RHJpdmVyLHByZS1lbXB0aXZlKQotCi0gICBDT01NQU5EX1JVUCAtIE1PREVNX1NUQVRVUyBwYWNrZXRzIGFyZSBzZW50IHdoZW5ldmVyIHRoZSBwb3J0IGRldGVjdHMgYQotICAgY2hhbmdlIGluIHRoZSBpbnB1dCBtb2RlbSBzaWduYWwgc3RhdGVzLgotCi0gICAqLwotI2lmIDAKLSNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCi0jZGVmaW5lCVBLVF9QaGJOdW0JCShQS1RfRGF0YSsxKQkJLyogUG9ydCBudW1iZXIgd3J0IFJUQSAqLwotI2RlZmluZQlQS1RfQ21kMgkJKFBLVF9EYXRhKzIpCQkvKiBDb21tYW5kIGNvZGUgY29weSAqLwotI2RlZmluZQlQS1RfTW9kZW1TdGF0dXMJCShQS1RfRGF0YSszKQkJLyogTW9kZW0gc2lnbmFsIHN0YXR1cyAqLwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKiogICBCT09UX1JVUCAtIEJPT1RfUkVRVUVTVCAgICoqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIChSSU8tPkRyaXZlcixwcmUtZW1wdGl2ZSkKLQotICAgQk9PVF9SVVAgLSBCT09UX1JFUVVFU1QgcGFja2V0cyBhcmUgc2VudCB0byB0aGUgRHJpdmVyIGZyb20gUklPIHRvIHJlcXVlc3QKLSAgIGZpcm13YXJlIGNvZGUgdG8gbG9hZCBvbnRvIGF0dGFjaGVkIFJUQXMuCi0gICAqLwotI2lmIDAKLSNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKiAgIEJPT1RfUlVQIC0gQk9PVF9TRVFVRU5DRSAgICoqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQotCi0gICBCT09UX1JVUCAtIEJPT1RfU0VRVUVOQ0UgcGFja2V0cyBhcmUgc2VudCBmcm9tIHRoZSBEcml2ZXIgdG8gUklPIGluIHJlc3BvbnNlCi0gICB0byBhIEJPT1RfUlVQIC0gQk9PVF9SRVFVRVNUIHBhY2tldC4KLSAgICovCi0jaWYgMAotI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KLSNlbmRpZgotI2RlZmluZQlQS1RfTnVtUGFja2V0cwkJKFBLVF9EYXRhKzIpCQkvKiBQYWNrZXRzIHJlcXVpcmVkIHRvIGxvYWQgZmlybXdhcmUgKi8KLSNkZWZpbmUJUEtUX0xvYWRCYXNlCQkoUEtUX0RhdGErNCkJCS8qIFJUQSBmaXJtd2FyZSBsb2FkIGFkZHJlc3MgKi8KLSNkZWZpbmUJUEtUX0NvZGVTaXplCQkoUEtUX0RhdGErNikJCS8qIFNpemUgb2YgZmlybXdhcmUgaW4gYnl0ZXMgKi8KLSNkZWZpbmUJUEtUX0NtZFN0cmluZwkJKFBLVF9EYXRhKzgpCQkvKiBDb21tYW5kIHN0cmluZyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqICAgQk9PVF9SVVAgLSBCT09UX0NPTVBMRVRFRCAgICoqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAoUklPLT5Ecml2ZXIscHJlLWVtcHRpdmUpCi0KLSAgIEJPT1RfUlVQIC0gQk9PVF9DT01QTEVURSBpcyBzZW50IHRvIHRoZSBEcml2ZXIgZnJvbSBSSU8gd2hlbiBkb3dubG9hZGluZyBvZgotICAgUlRBIGZpcm13YXJlIGhhcyBjb21wbGV0ZWQuCi0gICAqLwotI2lmIDAKLSNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCi0jZW5kaWYKLSNkZWZpbmUJUEtUX0xpbmtOdW1iZXIJCShQS1RfRGF0YSsxKQkJLyogTGluayBudW1iZXIgUlRBIGJvb3RlZCBvbiAqLwotI2RlZmluZQlQS1RfU2VyaWFsTnVtYmVyCShQS1RfRGF0YSsyKQkJLyogNCBieXRlIHNlcmlhbCBudW1iZXIgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKiAgIEJPT1RfUlVQIC0gUGFja2V0IFJlcXVlc3QgICAqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogKFJJTy0+RHJpdmVyLHByZS1lbXB0aXZlKQotCi0gICBCT09UX1JVUCBwYWNrZXQgd2l0aG91dCB0aGUgUEtUX0NNRF9CSVQgc2V0IGluIHRoZSBQS1QtPmxlbiBmaWVsZCBpcyBzZW50Ci0gICBmcm9tIFJJTyB0byB0aGUgRHJpdmVyIGFzIGEgcmVxdWVzdCBmb3IgYSBmaXJtd2FyZSBib290IHBhY2tldC4gKi8KLQotI2RlZmluZQlQS1RfU2VxdWVuY2VOdW1iZXIJKFBLVF9EYXRhKzApCQkvKiBQYWNrZXQgc2VxdWVuY2UgbnVtYmVyICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKiAgIEJPT1RfUlVQIC0gUGFja2V0IFJlc3BvbnNlICAgKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKLQotICAgSW4gcmVzcG9uc2UgdG8gYSBCT09UX1JVUCBib290IHBhY2tldCByZXF1ZXN0LCB0aGUgZHJpdmVyIGZpbGxzIG91dCB0aGUgcmVzcG9uc2UKLSAgIHBhY2tldCB3aXRoIHRoZSA3MCBieXRlcyBvZiB0aGUgcmVxdWVzdGVkIHNlcXVlbmNlLgotICAgKi8KLSNpZiAwCi0jZGVmaW5lCVBLVF9TZXF1ZW5jZU51bWJlcgkoUEtUX0RhdGErMCkJCS8qIFBhY2tldCBzZXF1ZW5jZSBudW1iZXIgKi8KLSNlbmRpZgotI2RlZmluZQlQS1RfRmlybXdhcmVQYWNrZXQJKFBLVF9EYXRhKzIpCQkvKiBGaXJtd2FyZSBwYWNrZXQgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBCT09UX1JVUCAtIElGT0FEICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQotCi0gICBCT09UX1JVUCAtIElGT0FEIHBhY2tldHMgYXJlIHNlbnQgZnJvbSB0aGUgRHJpdmVyIHRvIGFuIFJUQSB0byBjYXVzZSB0aGUKLSAgIFJUQSB0byBzaHV0IGRvd24gYW5kIHJlYm9vdC4KLSAgICovCi0jaWYgMAotI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KLSNlbmRpZgotI2RlZmluZQlQS1RfSWZvYWRJZDEJCShQS1RfRGF0YSsyKQkJLyogSUZPQUQgSWQgMSAqLwotI2RlZmluZQlQS1RfSWZvYWRJZDIJCShQS1RfRGF0YSszKQkJLyogSUZPQUQgSWQgMiAqLwotCi0jZGVmaW5lCUlGT0FESUQxCQkweEFECi0jZGVmaW5lCUlGT0FESUQyCQkweEYwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKiAgIEJPT1RfUlVQIC0gSURFTlRJRlkgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKLQotICAgQk9PVF9SVVAgLSBJREVOVElGWSBwYWNrZXRzIGFyZSBzZW50IGZyb20gdGhlIERyaXZlciB0byBhbiBSVEEgdG8gY2F1c2UgdGhlCi0gICBSVEEgdG8gZmxhc2ggaXRzIExFRHMgZm9yIGEgcGVyaW9kIG9mIHRpbWUuCi0gICAqLwotI2lmIDAKLSNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCi0jZW5kaWYKLSNkZWZpbmUJUEtUX0lkZW50aWZ5SWQJCShQS1RfRGF0YSsyKQkJLyogZGVmaW5lcyBwYXR0ZXJuIHRvIGZsYXNoICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgQk9PVF9SVVAgLSBaT01CSUUgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKLQotICAgQk9PVF9SVVAgLSBaT01CSUUgcGFja2V0cyBhcmUgc2VudCBmcm9tIHRoZSBEcml2ZXIgdG8gYW4gUlRBIHRvIGNhdXNlIHRoZQotICAgUlRBIHRvIHNodXQgZG93biBhbmQgZmxhc2ggaXQncyBMRURzLgotICAgKi8KLSNpZiAwCi0jZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLwotI2VuZGlmCi0jZGVmaW5lCVBLVF9ab21iaWVJZDEJCShQS1RfRGF0YSsyKQkJLyogWk9NQklFIElkIDEgKi8KLSNkZWZpbmUJUEtUX1pvbWJpZUlkMgkJKFBLVF9EYXRhKzMpCQkvKiBaT01CSUUgSWQgMiAqLwotCi0jZGVmaW5lCVpPTUJJRUlEMQkJMHg1MgotI2RlZmluZQlaT01CSUVJRDIJCTB4MjEKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBCT09UX1JVUCAtIFVGT0FEICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogKERyaXZlci0+UklPLHByZS1lbXB0aXZlKQotCi0gICBCT09UX1JVUCAtIFVGT0FEIHBhY2tldHMgYXJlIHNlbnQgZnJvbSB0aGUgRHJpdmVyIHRvIGFuIFJUQSB0byBjYXVzZSB0aGUgUlRBCi0gICB0byBhc2sgaXQncyBuZWlnaGJvdXJpbmcgUlRBIHRvIHNodXQgZG93biBhbmQgcmVib290LgotICAgKi8KLSNpZiAwCi0jZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLwotI2RlZmluZQlQS1RfTGlua051bWJlcgkJKFBLVF9EYXRhKzEpCQkvKiBMaW5rIG51bWJlciBvZiBSVEEgdG8gVUZPQUQgKi8KLSNlbmRpZgotI2RlZmluZQlQS1RfVWZvYWRJZDEJCShQS1RfRGF0YSsyKQkJLyogVUZPQUQgSWQgMSAqLwotI2RlZmluZQlQS1RfVWZvYWRJZDIJCShQS1RfRGF0YSszKQkJLyogVUZPQUQgSWQgMiAqLwotCi0jZGVmaW5lCVVGT0FESUQxCQkweDFFCi0jZGVmaW5lCVVGT0FESUQyCQkweDBECi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgQk9PVF9SVVAgLSBJV0FJVCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKLQotICAgQk9PVF9SVVAgLSBJV0FJVCBwYWNrZXRzIGFyZSBzZW50IGZyb20gdGhlIERyaXZlciB0byBhbiBSVEEgdG8gY2F1c2UgdGhlIFJUQQotICAgdG8gcGF1c2UgYm9vdGluZyBvbiB0aGUgc3BlY2lmaWVkIGxpbmsgZm9yIDMwIHNlY29uZHMuCi0gICAqLwotI2lmIDAKLSNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCi0jZGVmaW5lCVBLVF9MaW5rTnVtYmVyCQkoUEtUX0RhdGErMSkJCS8qIExpbmsgbnVtYmVyIG9mIFJUQSB0byBVRk9BRCAqLwotI2VuZGlmCi0jZGVmaW5lCVBLVF9Jd2FpdElkMQkJKFBLVF9EYXRhKzIpCQkvKiBJV0FJVCBJZCAxICovCi0jZGVmaW5lCVBLVF9Jd2FpdElkMgkJKFBLVF9EYXRhKzMpCQkvKiBJV0FJVCBJZCAyICovCi0KLSNkZWZpbmUJSVdBSVRJRDEJCTB4REUKLSNkZWZpbmUJSVdBSVRJRDIJCTB4QjEKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKiAgIFJPVVRFX1JVUCAtIFJPVVRFX1JFUVVFU1QgICAqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogKFJJTy0+RHJpdmVyLHByZS1lbXB0aXZlKQotCi0gICBST1VURV9SVVAgLSBST1VURV9SRVFVRVNUIHBhY2tldHMgYXJlIHNlbnQgZnJvbSBhIG5ld2x5IGJvb3RlZCBvciBjb25uZWN0ZWQKLSAgIFJUQSB0byBhIERyaXZlciB0byByZXF1ZXN0IGFuIElEIChSVVAgb3IgdW5pdCBudW1iZXIpLgotICAgKi8KLSNpZiAwCi0jZGVmaW5lCVBLVF9DbWQJCQkoUEtUX0RhdGErMCkJCS8qIENvbW1hbmQgY29kZSAqLwotI2VuZGlmCi0jZGVmaW5lCVBLVF9TZXJpYWxOdW1iZXIJKFBLVF9EYXRhKzIpCQkvKiA0IGJ5dGUgc2VyaWFsIG51bWJlciAqLwotI2RlZmluZQlQS1RfTW9kdWxlVHlwZXMJCShQS1RfRGF0YSs2KQkJLyogUlRBIE1vZHVsZSB0eXBlcyAqLwotCi0vKiBNb2R1bGVUeXBlcyBkZWZpbml0aW9ucy4uLiAqLwotI2RlZmluZQlNT0RfQkxBTksJCTB4MEYJCQkvKiBCbGFuayBwbGF0ZSBhdHRhY2hlZCAqLwotI2RlZmluZQlNT0RfUlMyMzJEQjI1CQkweDAwCQkJLyogUlMyMzIgREIyNSBjb25uZWN0b3IgKi8KLSNkZWZpbmUJTU9EX1JTMjMyUko0NQkJMHgwMQkJCS8qIFJTMjMyIFJKNDUgY29ubmVjdG9yICovCi0jZGVmaW5lCU1PRF9SUzQyMkRCMjUJCTB4MDIJCQkvKiBSUzQyMiBEQjI1IGNvbm5lY3RvciAqLwotI2RlZmluZQlNT0RfUlM0ODVEQjI1CQkweDAzCQkJLyogUlM0ODUgREIyNSBjb25uZWN0b3IgKi8KLSNkZWZpbmUJTU9EX1BBUkFMTEVMCQkweDA0CQkJLyogQ2VudHJvbmljcyBwYXJhbGxlbCAqLwotCi0jZGVmaW5lCU1PRDIJCQkweDA4CQkJLyogU2V0IHRvIGluZGljYXRlIFJldjIgbW9kdWxlICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqICAgUk9VVEVfUlVQIC0gUk9VVEVfRk9BRCAgICoqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIChEcml2ZXItPlJJTyxwcmUtZW1wdGl2ZSkKLQotICAgUk9VVEVfUlVQIC0gUk9VVEVfRk9BRCBwYWNrZXQgaXMgc2VudCBhcyBhIHJlc3BvbnNlIHRvIGEgUk9VVEVfUlVQIC0gUk9VVEVfUkVRVUVTVAotICAgcGFja2V0IHRvIGNhdXNlIHRoZSBSVEEgdG8gIkZhbGwgT3ZlciBBbmQgRGllIi4sIGkuZS4gc2h1dGRvd24gYW5kIHJlYm9vdC4KLSAgICovCi0jaWYgMAotI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KLSNlbmRpZgotI2RlZmluZQlQS1RfUm91dGVDbWRTdHJpbmcJKFBLVF9EYXRhKzIpCQkvKiBDb21tYW5kIHN0cmluZyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKiogICBST1VURV9SVVAgLSBST1VURV9BTExPQ0FURSAgICoqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAoRHJpdmVyLT5SSU8scHJlLWVtcHRpdmUpCi0KLSAgIFJPVVRFX1JVUCAtIFJPVVRFX0FMTE9DQVRFIHBhY2tldCBpcyBzZW50IGFzIGEgcmVzcG9uc2UgdG8gYSBST1VURV9SVVAgLSBST1VURV9SRVFVRVNUCi0gICBwYWNrZXQgdG8gYWxsb2NhdGUgdGhlIFJUQSdzIElkIG51bWJlciAoUlVQIG51bWJlciAxLi4xNikKLSAgICovCi0jaWYgMAotI2RlZmluZQlQS1RfQ21kCQkJKFBLVF9EYXRhKzApCQkvKiBDb21tYW5kIGNvZGUgKi8KLSNlbmRpZgotI2RlZmluZQlQS1RfSWROdW0JCShQS1RfRGF0YSsxKQkJLyogUlVQIG51bWJlciBmb3IgcG9ydHMgMS4uOCAqLwotI2lmIDAKLSNkZWZpbmUJUEtUX1JvdXRlQ21kU3RyaW5nCShQS1RfRGF0YSsyKQkJLyogQ29tbWFuZCBzdHJpbmcgKi8KLSNlbmRpZgotI2RlZmluZQlQS1RfSWROdW0yCQkoUEtUX0RhdGErMHgxNykJCS8qIFJVUCBudW1iZXIgZm9yIHBvcnRzIDkuLjE2ICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKiAgIFJPVVRFX1JVUCAtIFJPVVRFX1RPUE9MT0dZICAgKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIChSSU8tPkRyaXZlcixwcmUtZW1wdGl2ZSkKLQotICAgUk9VVEVfUlVQIC0gUk9VVEVfVE9QT0xPR1kgcGFja2V0IGlzIHNlbnQgdG8gaW5mb3JtIHRoZSBkcml2ZXIgb2YgYW4gUlRBJ3MKLSAgIGN1cnJlbnQgbGluayBzdGF0dXMuCi0gICAqLwotI2lmIDAKLSNkZWZpbmUJUEtUX0NtZAkJCShQS1RfRGF0YSswKQkJLyogQ29tbWFuZCBjb2RlICovCi0jZW5kaWYKLSNkZWZpbmUJUEtUX0xpbmsxUnVwCQkoUEtUX0RhdGErMikJCS8qIExpbmsgMSBSVVAgbnVtYmVyICovCi0jZGVmaW5lCVBLVF9MaW5rMUxpbmsJCShQS1RfRGF0YSszKQkJLyogTGluayAxIGxpbmsgbnVtYmVyICovCi0jZGVmaW5lCVBLVF9MaW5rMlJ1cAkJKFBLVF9EYXRhKzQpCQkvKiBMaW5rIDIgUlVQIG51bWJlciAqLwotI2RlZmluZQlQS1RfTGluazJMaW5rCQkoUEtUX0RhdGErNSkJCS8qIExpbmsgMiBsaW5rIG51bWJlciAqLwotI2RlZmluZQlQS1RfTGluazNSdXAJCShQS1RfRGF0YSs2KQkJLyogTGluayAzIFJVUCBudW1iZXIgKi8KLSNkZWZpbmUJUEtUX0xpbmszTGluawkJKFBLVF9EYXRhKzcpCQkvKiBMaW5rIDMgbGluayBudW1iZXIgKi8KLSNkZWZpbmUJUEtUX0xpbms0UnVwCQkoUEtUX0RhdGErOCkJCS8qIExpbmsgNCBSVVAgbnVtYmVyICovCi0jZGVmaW5lCVBLVF9MaW5rNExpbmsJCShQS1RfRGF0YSs5KQkJLyogTGluayA0IGxpbmsgbnVtYmVyICovCi0jZGVmaW5lCVBLVF9SdGFWcGRQcm9tCQkoUEtUX0RhdGErMTApCQkvKiAzMiBieXRlcyBvZiBSVEEgVlBEIFBST00gQ29udGVudHMgKi8KLQotI2VuZGlmCQkJCQkJLyogX3N4d2luaWZfaCAqLwotCi0vKiBFbmQgb2YgUklPV0lOSUYuSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaXNjb3MuaCBiL2RyaXZlcnMvY2hhci9yaW8vcmlzY29zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ODVjYzEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9yaXNjb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKioKLSoqICBQZXJsZSBTcGVjaWFsaXggZHJpdmVyIGZvciBMaW51eAotKiogIFBvcnRlZCBmcm9tIGV4aXN0aW5nIFJJTyBEcml2ZXIgZm9yIFNDTyBzb3VyY2VzLgotICoKLSAqICAoQykgMTk5MCAtIDIwMDAgU3BlY2lhbGl4IEludGVybmF0aW9uYWwgTHRkLiwgQnlmbGVldCwgU3VycmV5LCBVSy4KLSAqCi0gKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0qKgotKioJTW9kdWxlCQk6IHJpc2Nvcy5oCi0qKglTSUQJCTogMS4yCi0qKglMYXN0IE1vZGlmaWVkCTogMTEvNi85OCAxMTozNDoxOQotKioJUmV0cmlldmVkCTogMTEvNi85OCAxMTozNDoyMgotKioKLSoqICBpZGVudCBAKCMpcmlzY29zLmgJMS4yCi0qKgotKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpZm5kZWYgX19yaW9fcmlzY29zX2hfXwotI2RlZmluZSBfX3Jpb19yaXNjb3NfaF9fCi0KLSNpZmRlZiBTQ0NTX0xBQkVMUwotc3RhdGljIGNoYXIgKl9yaXNjb3NfaF9zY2NzXyA9ICJAKCMpcmlzY29zLmgJMS4yIjsKLSNlbmRpZgotCi0vKgotKiogVGhpcyBtb2R1bGUgdXNlZCB0byBkZWZpbmUgYWxsIHRob3NlIGxpdHRsZSBpdHN5IGJpdHMgcmVxdWlyZWQgZm9yIFJJU0MvT1MKLSoqIG5vdyBpdCdzIGZ1bGwgb2YgbnVsbCBtYWNyb3MuCi0qLwotCi0vKgotKioJUkJZVEUgcmVhZHMgYSBieXRlIGZyb20gYSBsb2NhdGlvbi4KLSoqCVJXT1JEIHJlYWRzIGEgd29yZCBmcm9tIGEgbG9jYXRpb24uCi0qKglXQllURSB3cml0ZXMgYSBieXRlIHRvIGEgbG9jYXRpb24uCi0qKglXV09SRCB3cml0ZXMgYSB3b3JkIHRvIGEgbG9jYXRpb24uCi0qKglSSU5EVyByZWFkcyBhIHdvcmQgdGhyb3VnaCBhIHBvaW50ZXIuCi0qKglXSU5EVyB3cml0ZXMgYSB3b3JkIHRocm91Z2ggYSBwb2ludGVyLgotKioJUklPU1dBQiBzd2FwcyB0aGUgdHdvIGJ5dGVzIG9mIGEgd29yZCwgaWYgbmVlZGVkLgotKi8KLQotI2RlZmluZQlSSU9TV0FCKE4pICAgICAgKE4pCi0jZGVmaW5lCVdCWVRFKEEsVikJKEEpPSh1Y2hhcikoVikKLSNkZWZpbmUgV1dPUkQoQSxWKQkoQSk9KHVzaG9ydCkoVikKLSNkZWZpbmUgUkJZVEUoQSkJKHVjaGFyKShBKQotI2RlZmluZSBSV09SRChBKQkodXNob3J0KShBKQotI2RlZmluZSBSSU5EVyhBKQkoKih1c2hvcnQgKikoQSkpCi0jZGVmaW5lIFdJTkRXKEEsVikJKCoodXNob3J0ICopKEEpPSh1c2hvcnQpKFYpKQotCi0jZW5kaWYgLyogX19yaW9fcmlzY29zX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yb20uaCBiL2RyaXZlcnMvY2hhci9yaW8vcm9tLmgKaW5kZXggZWU3OWI4ZS4uNThhNzg0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9yb20uaAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3JvbS5oCkBAIC0zOSwxOSArMzksMTkgQEAKIAogI2lmbmRlZiBsaW50CiAjaWZkZWYgU0NDUwotc3RhdGljIGNoYXIgKl9yaW9fcm9tX2hfc2NjcyA9ICJAKCMpcm9tLmgJMS4xIiA7CitzdGF0aWMgY2hhciAqX3Jpb19yb21faF9zY2NzID0gIkAoIylyb20uaAkxLjEiOwogI2VuZGlmCiAjZW5kaWYKIAotdHlwZWRlZiBzdHJ1Y3QgIFJPTSAgUk9NIDsKLXN0cnVjdCAgUk9NICB7Ci0gICAgICAgICAgICAgICAgIHVfc2hvcnQgICAgc2x4IDsKLSAgICAgICAgICAgICAgICAgY2hhciAgICAgICBwY2JfbGV0dGVyX3JldiA7Ci0gICAgICAgICAgICAgICAgIGNoYXIgICAgICAgcGNiX251bWJlcl9yZXYgOwotICAgICAgICAgICAgICAgICBjaGFyICAgICAgIHNlcmlhbFs0XSA7Ci0gICAgICAgICAgICAgICAgIGNoYXIgICAgICAgeWVhciA7Ci0gICAgICAgICAgICAgICAgIGNoYXIgICAgICAgd2VlayA7Ci0gICAgICAgICAgICAgfSA7Cit0eXBlZGVmIHN0cnVjdCBST00gUk9NOworc3RydWN0IFJPTSB7CisJdV9zaG9ydCBzbHg7CisJY2hhciBwY2JfbGV0dGVyX3JldjsKKwljaGFyIHBjYl9udW1iZXJfcmV2OworCWNoYXIgc2VyaWFsWzRdOworCWNoYXIgeWVhcjsKKwljaGFyIHdlZWs7Cit9OwogCiAjZW5kaWYKIApAQCAtNjAsNSArNjAsMyBAQAogI2RlZmluZSBST01fTEVOR1RIICAweDIwCiAKIC8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3JvdXRlLmggYi9kcml2ZXJzL2NoYXIvcmlvL3JvdXRlLmgKaW5kZXggYzQyZGJiOS4uNzY5NzQ0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9yb3V0ZS5oCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcm91dGUuaApAQCAtNDQsMjYgKzQ0LDI2IEBACiAjZW5kaWYKIAogI2RlZmluZSBNQVhfTElOS1MgNAotI2RlZmluZSBNQVhfTk9ERVMgMTcgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gbm9kZXMgaW4gYSBzdWJuZXQgKi8KLSNkZWZpbmUgTk9ERV9CWVRFUyAoKE1BWF9OT0RFUyAvIDgpICsgMSkgICAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgbmVlZGVkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgYml0IHBlciBub2RlICovCi0jZGVmaW5lIFJPVVRFX0RBVEFfU0laRSAgKE5PREVfQllURVMgKyAyKSAgICAgLyogTnVtYmVyIG9mIGJ5dGVzIGZvciBjb21wbGV0ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvIGFib3V0IGNvc3QgZXRjLiAqLworI2RlZmluZSBNQVhfTk9ERVMgMTcJCS8qIE1heGltdW0gbm9kZXMgaW4gYSBzdWJuZXQgKi8KKyNkZWZpbmUgTk9ERV9CWVRFUyAoKE1BWF9OT0RFUyAvIDgpICsgMSkJLyogTnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCBmb3IKKwkJCQkJCSAgIDEgYml0IHBlciBub2RlICovCisjZGVmaW5lIFJPVVRFX0RBVEFfU0laRSAgKE5PREVfQllURVMgKyAyKQkvKiBOdW1iZXIgb2YgYnl0ZXMgZm9yIGNvbXBsZXRlCisJCQkJCQkgICBpbmZvIGFib3V0IGNvc3QgZXRjLiAqLwogI2RlZmluZSBST1VURVNfUEVSX1BBQ0tFVCAoKFBLVF9NQVhfREFUQV9MRU4gLTIpLyBST1VURV9EQVRBX1NJWkUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIG5vZGVzIHdlIGNhbiBzcXVlZXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50byBvbmUgcGFja2V0ICovCisJCQkJCSAgICAgIC8qIE51bWJlciBvZiBub2RlcyB3ZSBjYW4gc3F1ZWV6ZQorCQkJCQkgICAgICAgICBpbnRvIG9uZSBwYWNrZXQgKi8KICNkZWZpbmUgTUFYX1RPUE9MT0dZX1BBQ0tFVFMgKE1BWF9OT0RFUyAvIFJPVVRFU19QRVJfUEFDS0VUICsgMSkKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIERlZmluZSB0aGUgdHlwZXMgb2YgY29tbWFuZCBmb3IgdGhlIFJPVVRFIFJVUC4KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFJPVVRFX1JFUVVFU1QgICAgMCAgICAgICAgICAgICAgICAgICAgLyogUmVxdWVzdCBhbiBJRCAqLwotI2RlZmluZSBST1VURV9GT0FEICAgICAgIDEgICAgICAgICAgICAgICAgICAgIC8qIEtpbGwgdGhlIFJUQSAqLwotI2RlZmluZSBST1VURV9BTFJFQURZICAgIDIgICAgICAgICAgICAgICAgICAgIC8qIElEIGdpdmVuIGFscmVhZHkgKi8KLSNkZWZpbmUgUk9VVEVfVVNFRCAgICAgICAzICAgICAgICAgICAgICAgICAgICAvKiBBbGwgSUQncyB1c2VkICovCi0jZGVmaW5lIFJPVVRFX0FMTE9DQVRFICAgNCAgICAgICAgICAgICAgICAgICAgLyogSGVyZSBpdCBpcyAqLwotI2RlZmluZSBST1VURV9SRVFfVE9QICAgIDUgICAgICAgICAgICAgICAgICAgIC8qIEkgYmV0IHlvdSBkaWRuJ3QgZXhwZWN0Li4uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBUb3BvbG9naWNhbCBJbnF1aXNpdGlvbiAqLwotI2RlZmluZSBST1VURV9UT1BPTE9HWSAgIDYgICAgICAgICAgICAgICAgICAgIC8qIFRvcG9sb2d5IHJlcXVlc3QgYW5zd2VyZWQgRkQgKi8KKyNkZWZpbmUgUk9VVEVfUkVRVUVTVCAgICAwCS8qIFJlcXVlc3QgYW4gSUQgKi8KKyNkZWZpbmUgUk9VVEVfRk9BRCAgICAgICAxCS8qIEtpbGwgdGhlIFJUQSAqLworI2RlZmluZSBST1VURV9BTFJFQURZICAgIDIJLyogSUQgZ2l2ZW4gYWxyZWFkeSAqLworI2RlZmluZSBST1VURV9VU0VEICAgICAgIDMJLyogQWxsIElEJ3MgdXNlZCAqLworI2RlZmluZSBST1VURV9BTExPQ0FURSAgIDQJLyogSGVyZSBpdCBpcyAqLworI2RlZmluZSBST1VURV9SRVFfVE9QICAgIDUJLyogSSBiZXQgeW91IGRpZG4ndCBleHBlY3QuLi4uCisJCQkJICAgdGhlIFRvcG9sb2dpY2FsIElucXVpc2l0aW9uICovCisjZGVmaW5lIFJPVVRFX1RPUE9MT0dZICAgNgkvKiBUb3BvbG9neSByZXF1ZXN0IGFuc3dlcmVkIEZEICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRGVmaW5lIHRoZSBSb3V0ZSBNYXAgU3RydWN0dXJlCiAgKgpAQCAtNzIsMjIgKzcyLDIyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdHlwZWRlZiBzdHJ1Y3QgQ09TVF9ST1VURSBDT1NUX1JPVVRFOwogc3RydWN0IENPU1RfUk9VVEUgewotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgY29zdDsgICAgICAgIC8qIENvc3QgZG93biB0aGlzIGxpbmsgKi8KLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHJvdXRlW05PREVfQllURVNdOyAvKiBOb2RlcyB0aG9yb3VnaCB0aGlzIHJvdXRlICovCi0gICAgICAgICAgICAgICAgICB9IDsKKwl1bnNpZ25lZCBjaGFyIGNvc3Q7CS8qIENvc3QgZG93biB0aGlzIGxpbmsgKi8KKwl1bnNpZ25lZCBjaGFyIHJvdXRlW05PREVfQllURVNdOwkvKiBOb2RlcyB0aG9yb3VnaCB0aGlzIHJvdXRlICovCit9OwogCi10eXBlZGVmIHN0cnVjdCBST1VURV9TVFIgUk9VVEVfU1RSIDsKLXN0cnVjdCAgUk9VVEVfU1RSIHsKLSAgICAgICAgICAgICAgICAgICAgICBDT1NUX1JPVVRFIGNvc3Rfcm91dGVbTUFYX0xJTktTXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvc3QgLyByb3V0ZSBmb3IgdGhpcyBsaW5rICovCi0gICAgICAgICAgICAgICAgICAgICAgdXNob3J0IGZhdm91cmVkOyAgICAgICAgICAvKiBmYXZvdXJlZCBsaW5rICovCi0gICAgICAgICAgICAgICAgICB9IDsKK3R5cGVkZWYgc3RydWN0IFJPVVRFX1NUUiBST1VURV9TVFI7CitzdHJ1Y3QgUk9VVEVfU1RSIHsKKwlDT1NUX1JPVVRFIGNvc3Rfcm91dGVbTUFYX0xJTktTXTsKKwkvKiBjb3N0IC8gcm91dGUgZm9yIHRoaXMgbGluayAqLworCXVzaG9ydCBmYXZvdXJlZDsJLyogZmF2b3VyZWQgbGluayAqLworfTsKIAogCi0jZGVmaW5lIE5PX0xJTksgICAgICAgICAgICAoc2hvcnQpIDUgICAgICAvKiBMaW5rIHVuYXR0YWNoZWQgKi8KLSNkZWZpbmUgUk9VVEVfTk9fSUQgICAgICAgIChzaG9ydCkgMTAwICAgIC8qIE5vIElkICovCi0jZGVmaW5lIFJPVVRFX0RJU0NPTk5FQ1QgICAodXNob3J0KSAweGZmICAvKiBOb3QgY29ubmVjdGVkICovCi0jZGVmaW5lIFJPVVRFX0lOVEVSQ09OTkVDVCAodXNob3J0KSAweDQwICAvKiBTdWItbmV0IGludGVyY29ubmVjdCAqLworI2RlZmluZSBOT19MSU5LICAgICAgICAgICAgKHNob3J0KSA1CS8qIExpbmsgdW5hdHRhY2hlZCAqLworI2RlZmluZSBST1VURV9OT19JRCAgICAgICAgKHNob3J0KSAxMDAJLyogTm8gSWQgKi8KKyNkZWZpbmUgUk9VVEVfRElTQ09OTkVDVCAgICh1c2hvcnQpIDB4ZmYJLyogTm90IGNvbm5lY3RlZCAqLworI2RlZmluZSBST1VURV9JTlRFUkNPTk5FQ1QgKHVzaG9ydCkgMHg0MAkvKiBTdWItbmV0IGludGVyY29ubmVjdCAqLwogCiAKICNkZWZpbmUgU1lOQ19SVVAgICAgICAgICAodXNob3J0KSAyNTUKQEAgLTk5LDEwICs5OSw5IEBACiAjZGVmaW5lIFNUQVRVU19SVVAgICAgICAgKHVzaG9ydCkgMjQ5CiAjZGVmaW5lIFBPV0VSX1JVUCAgICAgICAgKHVzaG9ydCkgMjQ4CiAKLSNkZWZpbmUgSElHSEVTVF9SVVAgICAgICAodXNob3J0KSAyNTUgICAvKiBTZXQgdG8gVG9wIG9uZSAqLwotI2RlZmluZSBMT1dFU1RfUlVQICAgICAgICh1c2hvcnQpIDI0OCAgIC8qIFNldCB0byBib3R0b20gb25lICovCisjZGVmaW5lIEhJR0hFU1RfUlVQICAgICAgKHVzaG9ydCkgMjU1CS8qIFNldCB0byBUb3Agb25lICovCisjZGVmaW5lIExPV0VTVF9SVVAgICAgICAgKHVzaG9ydCkgMjQ4CS8qIFNldCB0byBib3R0b20gb25lICovCiAKICNlbmRpZgogCiAvKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcnRhaHcuaCBiL2RyaXZlcnMvY2hhci9yaW8vcnRhaHcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4NjAxMS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL3J0YWh3LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgotICoqKioqKiogICAgICAgICAgICAgICAgUiBUIEEgICAgSCBBIFIgRCBXIEEgUiBFCi0gKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIEF1dGhvciAgOiBJYW4gTmFuZGhyYQotIERhdGUgICAgOgotCi0gKgotICogIChDKSAxOTkwIC0gMjAwMCBTcGVjaWFsaXggSW50ZXJuYXRpb25hbCBMdGQuLCBCeWZsZWV0LCBTdXJyZXksIFVLLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotIFZlcnNpb24gOiAwLjAxCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHMKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIERhdGUgICAgIEJ5ICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIGxpbnQKLSNpZmRlZiBTQ0NTX0xBQkVMUwotc3RhdGljIGNoYXIgKl9yaW9fcnRhaHdfaF9zY2NzID0gIkAoIylydGFody5oCTEuNSIgOwotI2VuZGlmCi0jZW5kaWYKLQotI2RlZmluZQlXQVRDSERPR19BRERSCSgodW5zaWduZWQgc2hvcnQgKikweDdhMDApCi0jZGVmaW5lIFJUQV9MRURfQUREUgkoKHVuc2lnbmVkIHNob3J0ICopMHg3YzAwKQotI2RlZmluZSBTRVJJQUxOVU1fQUREUgkoKHVuc2lnbmVkIGNoYXIgKikweDc4MDkpCi0jZGVmaW5lIExBVENIX0FERFIgICAgICAoKHVuc2lnbmVkIGNoYXIgKikweDc4MDApCi0KLS8qCi0qKiBIZXJlIHdlIGRlZmluZSB3aGVyZSB0aGUgY2QxNDAwIGNoaXBzIGFyZSBpbiBtZW1vcnkuCi0qLwotI2RlZmluZSBDRDE0MDBfT05FX0FERFIJCSgweDczMDApCi0jZGVmaW5lIENEMTQwMF9UV09fQUREUgkJKDB4NzIwMCkKLSNkZWZpbmUgQ0QxNDAwX1RIUkVFX0FERFIJKDB4NzEwMCkKLSNkZWZpbmUgQ0QxNDAwX0ZPVVJfQUREUgkoMHg3MDAwKQotCi0vKgotKiogRGVmaW5lIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgbW9kdWxlcyB3ZSBjYW4gaGF2ZQotKi8KLWVudW0gbW9kdWxlIHsKLSAgICBNT0RfQkxBTksJCT0gMHgwZiwJCS8qIEJsYW5rIHBsYXRlIGF0dGFjaGVkICovCi0gICAgTU9EX1JTMjMyREIyNQk9IDB4MDAsCQkvKiBSUzIzMiBEQjI1IGNvbm5lY3RvciAqLwotICAgIE1PRF9SUzIzMlJKNDUJPSAweDAxLAkJLyogUlMyMzIgUko0NSBjb25uZWN0b3IgKi8KLSAgICBNT0RfUlM0MjJEQjI1CT0gMHgwMiwJCS8qIFJTNDIyIERCMjUgY29ubmVjdG9yICovCi0gICAgTU9EX1JTNDg1REIyNQk9IDB4MDMsCQkvKiBSUzQ4NSBEQjI1IGNvbm5lY3RvciAqLwotICAgIE1PRF9QQVJBTExFTAk9IDB4MDQJCS8qIENlbnRyb25pY3MgcGFyYWxsZWwgKi8KLX07Ci0KLSNkZWZpbmUgVFlQRV9IT1NUCTAKLSNkZWZpbmUgVFlQRV9SVEE4CTEKLSNkZWZpbmUgVFlQRV9SVEExNgkyCi0KLSNkZWZpbmUJV0FUQ0hfRE9HCVdBVENIRE9HX0FERFIKLQotLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9ydXAuaCBiL2RyaXZlcnMvY2hhci9yaW8vcnVwLmgKaW5kZXggYjlkMmJjMC4uOGQ0NGZlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9ydXAuaAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3J1cC5oCkBAIC00NCwzOSArNDQsMzggQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZCggSE9TVCApIHx8IGRlZmluZWQoIElOS0VSTkVMICkKLSNkZWZpbmUgTUFYX1JVUCAgICAgICAgICAoKHNob3J0KSAxNikgCisjZGVmaW5lIE1BWF9SVVAgICAgICAgICAgKChzaG9ydCkgMTYpCiAjZW5kaWYKICNpZmRlZiBSVEEKICNkZWZpbmUgTUFYX1JVUCAgICAgICAgICAoKHNob3J0KSAxKQogI2VuZGlmCiAKLSNkZWZpbmUgUEtUU19QRVJfUlVQICAgICAoKHNob3J0KSAyKSAgICAgLyogVGhleSBhcmUgYWx3YXlzIHVzZWQgaW4gcGFpcnMgKi8KKyNkZWZpbmUgUEtUU19QRVJfUlVQICAgICAoKHNob3J0KSAyKQkvKiBUaGV5IGFyZSBhbHdheXMgdXNlZCBpbiBwYWlycyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRGVmaW5lIGFsbCB0aGUgIHBhY2tldCByZXF1ZXN0IHN0dWZmCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBUWF9SVVBfSU5BQ1RJVkUgICAgICAgICAgMCAgICAgICAgLyogTm90aGluZyB0byB0cmFuc21pdCAqLwotI2RlZmluZSBUWF9QQUNLRVRfUkVBRFkgICAgICAgICAgMSAgICAgICAgLyogVHJhbnNtaXQgcGFja2V0IHJlYWR5ICovCi0jZGVmaW5lIFRYX0xPQ0tfUlVQICAgICAgICAgICAgICAyICAgICAgICAvKiBUcmFuc21pdCBzaWRlIGxvY2tlZCAqLworI2RlZmluZSBUWF9SVVBfSU5BQ1RJVkUgICAgICAgICAgMAkvKiBOb3RoaW5nIHRvIHRyYW5zbWl0ICovCisjZGVmaW5lIFRYX1BBQ0tFVF9SRUFEWSAgICAgICAgICAxCS8qIFRyYW5zbWl0IHBhY2tldCByZWFkeSAqLworI2RlZmluZSBUWF9MT0NLX1JVUCAgICAgICAgICAgICAgMgkvKiBUcmFuc21pdCBzaWRlIGxvY2tlZCAqLwogCi0jZGVmaW5lIFJYX1JVUF9JTkFDVElWRSAgICAgICAgICAwICAgICAgICAvKiBOb3RoaW5nIHJlY2VpdmVkICovCi0jZGVmaW5lIFJYX1BBQ0tFVF9SRUFEWSAgICAgICAgICAxICAgICAgICAvKiBQYWNrZXQgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgUlhfUlVQX0lOQUNUSVZFICAgICAgICAgIDAJLyogTm90aGluZyByZWNlaXZlZCAqLworI2RlZmluZSBSWF9QQUNLRVRfUkVBRFkgICAgICAgICAgMQkvKiBQYWNrZXQgcmVjZWl2ZWQgKi8KIAotI2RlZmluZSBSVVBfTk9fT1dORVIgICAgICAgICAgICAgMHhmZiAgICAgLyogUlVQIG5vdCBvd25lZCBieSBhbnkgcHJvY2VzcyAqLworI2RlZmluZSBSVVBfTk9fT1dORVIgICAgICAgICAgICAgMHhmZgkvKiBSVVAgbm90IG93bmVkIGJ5IGFueSBwcm9jZXNzICovCiAKIHN0cnVjdCBSVVAgewotICAgICAgICAgICAgIFBLVF9wdHIgICAgdHhwa3Q7ICAgICAgICAgICAgLyogT3V0Z29pbmcgcGFja2V0ICovCi0gICAgICAgICAgICAgUEtUX3B0ciAgICByeHBrdDsgICAgICAgICAgICAvKiBJbmNvbWluZyBwYWNrZXQgKi8KLSAgICAgICAgICAgICBXT1JEICAgICAgIGxpbms7ICAgICAgICAgICAgIC8qIFdoaWNoIGxpbmsgdG8gc2VuZCBkb3duPyAqLwotICAgICAgICAgICAgIEJZVEUgICAgICAgcnVwX2Rlc3RfdW5pdFsyXTsgLyogRGVzdGluYXRpb24gdW5pdCAqLwotICAgICAgICAgICAgIFdPUkQgICAgICAgaGFuZHNoYWtlOyAgICAgICAgLyogRm9yIGhhbmRzaGFraW5nICovCi0gICAgICAgICAgICAgV09SRCAgICAgICB0aW1lb3V0OyAgICAgICAgICAvKiBUaW1lb3V0ICovCi0gICAgICAgICAgICAgV09SRCAgICAgICBzdGF0dXM7ICAgICAgICAgICAvKiBTdGF0dXMgKi8KLSAgICAgICAgICAgICBXT1JEICAgICAgIHR4Y29udHJvbDsgICAgICAgIC8qIFRyYW5zbWl0IGNvbnRyb2wgKi8KLSAgICAgICAgICAgICBXT1JEICAgICAgIHJ4Y29udHJvbDsgICAgICAgIC8qIFJlY2VpdmUgY29udHJvbCAqLwotICAgICAgICAgICB9OwotIAorCVBLVF9wdHIgdHhwa3Q7CQkvKiBPdXRnb2luZyBwYWNrZXQgKi8KKwlQS1RfcHRyIHJ4cGt0OwkJLyogSW5jb21pbmcgcGFja2V0ICovCisJV09SRCBsaW5rOwkJLyogV2hpY2ggbGluayB0byBzZW5kIGRvd24/ICovCisJQllURSBydXBfZGVzdF91bml0WzJdOwkvKiBEZXN0aW5hdGlvbiB1bml0ICovCisJV09SRCBoYW5kc2hha2U7CQkvKiBGb3IgaGFuZHNoYWtpbmcgKi8KKwlXT1JEIHRpbWVvdXQ7CQkvKiBUaW1lb3V0ICovCisJV09SRCBzdGF0dXM7CQkvKiBTdGF0dXMgKi8KKwlXT1JEIHR4Y29udHJvbDsJCS8qIFRyYW5zbWl0IGNvbnRyb2wgKi8KKwlXT1JEIHJ4Y29udHJvbDsJCS8qIFJlY2VpdmUgY29udHJvbCAqLworfTsKKwogI2VuZGlmCiAKIC8qKioqKioqKioqKiBlbmQgb2YgZmlsZSAqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9ydXBzdGF0LmggYi9kcml2ZXJzL2NoYXIvcmlvL3J1cHN0YXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhYWZhZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL3J1cHN0YXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgotICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgUlVQU1RBVAotICoqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBBdXRob3IgIDogSmVyZW15IFJvbGxzCi0gRGF0ZSAgICA6Ci0KLSAqCi0gKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCi0gKgotICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gVmVyc2lvbiA6IDAuMDEKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcwotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX3J1cHN0YXRfaAotI2RlZmluZSBfcnVwc3RhdF9oCi0KLSNpZm5kZWYgbGludAotI2lmZGVmIFNDQ1NfTEFCRUxTCi1zdGF0aWMgY2hhciAqX3Jpb19ydXBzdGF0X2hfc2NjcyA9ICJAKCMpcnVwc3RhdC5oCTEuMSIgOwotI2VuZGlmCi0jZW5kaWYKLQotI2RlZmluZSAgICBTVEFUVVNfU1lOQyAgICAwCi0jZGVmaW5lICAgIFNUQVRVU19SRVFfVE9QIDEKLSNkZWZpbmUgICAgU1RBVFVTX1RPUE9MT0dZICAgIDIKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vc2FtLmggYi9kcml2ZXJzL2NoYXIvcmlvL3NhbS5oCmluZGV4IGMxYWNjYjguLjMxNDk0MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vc2FtLmgKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9zYW0uaApAQCAtNjAsMTUgKzYwLDEyIEBACiAjZGVmaW5lIFJYICAgIEZBTFNFCiAKIAotdHlwZWRlZiBzdHJ1Y3QgRlJFRV9MSVNUIEZSRUVfTElTVCA7Ci1zdHJ1Y3QgRlJFRV9MSVNUICAgewotICAgICAgICAgICAgICAgICAgICAgICBGUkVFX0xJU1RfcHRyIG5leHQgOwotICAgICAgICAgICAgICAgICAgICAgICBGUkVFX0xJU1RfcHRyIHByZXYgOwotICAgICAgICAgICAgICAgICAgIH0gOwordHlwZWRlZiBzdHJ1Y3QgRlJFRV9MSVNUIEZSRUVfTElTVDsKK3N0cnVjdCBGUkVFX0xJU1QgeworCUZSRUVfTElTVF9wdHIgbmV4dDsKKwlGUkVFX0xJU1RfcHRyIHByZXY7Cit9OwogCiAKICNlbmRpZgogLyoqKioqKioqKioqIGVuZCBvZiBmaWxlICoqKioqKioqKioqLwotCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9zZWxmdGVzdC5oIGIvZHJpdmVycy9jaGFyL3Jpby9zZWxmdGVzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWFlNDg3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9yaW8vc2VsZnRlc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0qKiBGaWxlOgkJc2VsZnRlc3QuaAotKioKLSoqIEF1dGhvcjoJCURhdmlkIERpeAotKioKLSoqIENyZWF0ZWQ6CQkxNXRoIE1hcmNoIDE5OTMKLSoqCi0qKiBMYXN0IG1vZGlmaWVkOgk5NC8wNi8xNAotKioKLSAqCi0gKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCi0gKgotICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotKi8KLQotI2lmbmRlZglfc2VsZnRlc3RzX2hfCi0jZGVmaW5lIF9zZWxmdGVzdHNfaF8KLQotLyoKLSoqIFNlbGZ0ZXN0IGlkZW50aWZpZXIuLi4KLSovCi0jZGVmaW5lIFNFTEZURVNUX01BR0lDCTB4NWE1YQotCi0vKgotKiogVGhpcyBpcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBwYWNrZXQgdGhhdCBpcyBzZW50IGJhY2sgYWZ0ZXIgZWFjaAotKiogc2VsZnRlc3Qgb24gYSBib290aW5nIFJUQS4KLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgc2hvcnQJCW1hZ2ljOwkJCS8qIElkZW50aWZpZXMgcGFja2V0IHR5cGUgKi8KLSAgICBpbnQJCQl0ZXN0OwkJCS8qIFRlc3QgbnVtYmVyLCBzZWUgYmVsb3cgKi8KLSAgICB1bnNpZ25lZCBpbnQJcmVzdWx0OwkJCS8qIFJlc3VsdCB2YWx1ZSAqLwotICAgIHVuc2lnbmVkIGludAlkYXRhSW47Ci0gICAgdW5zaWduZWQgaW50CWRhdGFPdXQ7Ci19c2VsZnRlc3RTdHJ1Y3Q7Ci0KLS8qCi0qKiBUaGUgZGlmZmVyZW50IHRlc3RzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSBmb2xsb3dpbmcgZGF0YSB2YWx1ZXMuCi0qLwotZW51bSB0ZXN0IHsKLSAgICBURVNUU19DT01QTEVURQk9IDB4MDAsCi0gICAgTUVNVEVTVF9BRERSCT0gMHgwMSwKLSAgICBNRU1URVNUX0JJVAkJPSAweDAyLAotICAgIE1FTVRFU1RfRklMTAk9IDB4MDMsCi0gICAgTUVNVEVTVF9EQVRBQlVTCT0gMHgwNCwKLSAgICBNRU1URVNUX0FERFJCVVMJPSAweDA1LAotICAgIENEMTQwMF9JTklUCQk9IDB4MTAsCi0gICAgQ0QxNDAwX0xPT1AJCT0gMHgxMSwKLSAgICBDRDE0MDBfSU5URVJSVVBUICAgID0gMHgxMgotfTsKLQotZW51bSByZXN1bHQgewotICAgIEVfUE9SVAkJPSAweDEwLAotICAgIEVfVFgJCT0gMHgxMSwKLSAgICBFX1JYCQk9IDB4MTIsCi0gICAgRV9FWENFUFQJCT0gMHgxMywKLSAgICBFX0NPTVBBUkUJCT0gMHgxNCwKLSAgICBFX01PREVNCQk9IDB4MTUsCi0gICAgRV9USU1FT1VUCQk9IDB4MTYsCi0gICAgRV9JTlRFUlJVUFQgICAgICAgICA9IDB4MTcKLX07Ci0jZW5kaWYJLyogX3NlbGZ0ZXN0c19oXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9zcGFjZS5oIGIvZHJpdmVycy9jaGFyL3Jpby9zcGFjZS5oCmluZGV4IDcyMzk4ZDMuLjFmMTI2OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vc3BhY2UuaAorKysgYi9kcml2ZXJzL2NoYXIvcmlvL3NwYWNlLmgKQEAgLTQyLDQgKzQyLDQgQEAKIGV4dGVybiBpbnQgcmlvX2xpbWl0c1tdOwogZXh0ZXJuIGludCByaW9fdmVjdHNbXTsKIAotI2VuZGlmIC8qIF9fcmlvX3NwYWNlX2hfXyAqLworI2VuZGlmCQkJCS8qIF9fcmlvX3NwYWNlX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9zeXNtYXAuaCBiL2RyaXZlcnMvY2hhci9yaW8vc3lzbWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYzczMTMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9zeXNtYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCi0gKioqKioqKiAgICAgICAgICBTIFkgUyBUIEUgTSAgIE0gQSBQICAgSCBFIEEgRCBFIFIKLSAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gQXV0aG9yICA6IElhbiBOYW5kaHJhCi0gRGF0ZSAgICA6Ci0KLSAqCi0gKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCi0gKgotICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gVmVyc2lvbiA6IDAuMDEKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcwotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgbGludAotI2lmZGVmIFNDQ1NfTEFCRUxTCi1zdGF0aWMgY2hhciAqX3Jpb19zeXNtYXBfaF9zY2NzID0gIkAoIylzeXNtYXAuaAkxLjEiIDsKLSNlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgU1lTVEVNX01BUF9MRU4gICAgIDY0ICAgICAgICAgICAvKiBMZW4gb2YgU3lzdGVtIE1hcCBhcnJheSAqLwotCi0KLXR5cGVkZWYgc3RydWN0IFNZU19NQVAgICAgICAgIFNZU19NQVAgOwotdHlwZWRlZiBzdHJ1Y3QgU1lTX01BUF9MSU5LICAgU1lTX01BUF9MSU5LIDsKLQotc3RydWN0IFNZU19NQVBfTElOSyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBpZCA7ICAgICAgICAgIC8qIFVuaXQgSWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IGxpbmsgOyAgICAgICAgLyogSWQncyBMaW5rICovCi0gICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBiZWVuX2hlcmUgOyAgIC8qIFVzZWQgYnkgbWFwX2dlbiAqLwotICAgICAgICAgICAgICAgICAgICB9IDsKLQotc3RydWN0IFNZU19NQVAgewotICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICBzZXJpYWxfbnVtWzRdIDsKLSAgICAgICAgICAgICAgICAgICBTWVNfTUFQX0xJTksgbGlua1s0XSA7Ci0gICAgICAgICAgICAgICB9IDsKLQotCi0vKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vdGltZW91dHMuaCBiL2RyaXZlcnMvY2hhci9yaW8vdGltZW91dHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiMzEzMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL3RpbWVvdXRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKgotICoqKioqKiogICAgICAgICAgICAgICAgICAgICBUIEkgTSBFIE8gVSBUIFMKLSAqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gQXV0aG9yICA6IElhbiBOYW5kaHJhCi0gRGF0ZSAgICA6Ci0KLSAqCi0gKiAgKEMpIDE5OTAgLSAyMDAwIFNwZWNpYWxpeCBJbnRlcm5hdGlvbmFsIEx0ZC4sIEJ5ZmxlZXQsIFN1cnJleSwgVUsuCi0gKgotICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gVmVyc2lvbiA6IDAuMDEKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kcwotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgRGF0ZSAgICAgQnkgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgbGludAotI2lmZGVmIFNDQ1NfTEFCRUxTCi1zdGF0aWMgY2hhciAqX3Jpb19kZWZhdWx0c19oX3NjY3MgPSAiQCgjKXRpbWVvdXRzLmgJMS4zIiA7Ci0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIE1JTExJU0VDT05EICAgICAgICAgICAoaW50KSAoMTAwMC82NCkgICAvKiAxNS42MjUgbG93IHRpY2tzICovCi0jZGVmaW5lIFNFQ09ORCAgICAgICAgICAgICAgICAoaW50KSAxNTYyNSAgICAgICAvKiBMb3cgcHJpb3JpdHkgdGlja3MgKi8KLQotI2RlZmluZSBUWF9USU1FT1VUICAgICAgICAgIChpbnQpICgyMDAgKiBNSUxMSVNFQ09ORCkKLQotCi0vKioqKioqKioqKiogZW5kIG9mIGZpbGUgKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vdG9wLmggYi9kcml2ZXJzL2NoYXIvcmlvL3RvcC5oCmluZGV4IDI1NWM0MGQuLmQxNWExMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vdG9wLmgKKysrIGIvZHJpdmVycy9jaGFyL3Jpby90b3AuaApAQCAtNDAsMTAgKzQwLDkgQEAKIC8qCiAqKiBUb3BvbG9neSBpbmZvcm1hdGlvbgogKi8KLXN0cnVjdCBUb3AKLXsKLSAgICB1Y2hhciBVbml0OwotICAgIHVjaGFyIExpbms7CitzdHJ1Y3QgVG9wIHsKKwl1Y2hhciBVbml0OworCXVjaGFyIExpbms7CiB9OwogCi0jZW5kaWYgLyogX19yaW9fdG9wX2hfXyAqLworI2VuZGlmCQkJCS8qIF9fcmlvX3RvcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vdHlwZGVmLmggYi9kcml2ZXJzL2NoYXIvcmlvL3R5cGRlZi5oCmluZGV4IDJjYjlkZDYuLjE4NWI4ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vdHlwZGVmLmgKKysrIGIvZHJpdmVycy9jaGFyL3Jpby90eXBkZWYuaApAQCAtNDUsMTEgKzQ1LDExIEBACiAqKiBUaGVzZSB0eXBlcyBhcmUgT05MWSB0byBiZSB1c2VkIGZvciByZWZlcmluZyB0byBkYXRhIHN0cnVjdHVyZXMKICoqIG9uIHRoZSBSSU8gSG9zdCBjYXJkIQogKi8KLXR5cGVkZWYJdm9sYXRpbGUgdW5zaWduZWQgY2hhcglCWVRFOwotdHlwZWRlZiB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydAlXT1JEOwotdHlwZWRlZiB2b2xhdGlsZSB1bnNpZ25lZCBpbnQJRFdPUkQ7Ci10eXBlZGVmCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IFJJT1A7Ci10eXBlZGVmCXZvbGF0aWxlIHNob3J0ICAgICAgICAgIE5VTUJFUjsKK3R5cGVkZWYgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBCWVRFOwordHlwZWRlZiB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBXT1JEOwordHlwZWRlZiB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgRFdPUkQ7Cit0eXBlZGVmIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IFJJT1A7Cit0eXBlZGVmIHZvbGF0aWxlIHNob3J0IE5VTUJFUjsKIAogCiAvKgpAQCAtNTksMTMgKzU5LDEzIEBACiAqKiBhcmUgaGVyZSBvbmx5IHRvIG1ha2UgdGhlIHNvdXJjZSBjb21waWxlLgogKi8KIC8qIHR5cGVkZWYgdW5zaWduZWQgaW50CXVpbnQ7ICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcJdWxvbmdfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQJdXNob3J0X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIJdWNoYXJfdDsKLXR5cGVkZWYgdW5zaWduZWQgY2hhcglxdWV1ZV90OwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyCW1ibGtfdDsKLXR5cGVkZWYJdW5zaWduZWQgaW50IAlwYWRkcl90OwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWNoYXI7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWxvbmdfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdXNob3J0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWNoYXJfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBxdWV1ZV90OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIG1ibGtfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHBhZGRyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWNoYXI7CiAKICNkZWZpbmUJVFBOVUxMCSgodXNob3J0KSgweDgwMDApKQogCkBAIC03MywxMCArNzMsMTAgQEAKIC8qCiAqKiBSSU8gc3RydWN0dXJlcyBkZWZpbmVkIGluIG90aGVyIGluY2x1ZGUgZmlsZXMuCiAqLwotdHlwZWRlZiBzdHJ1Y3QgUEtUCSAJUEtUOwotdHlwZWRlZiBzdHJ1Y3QgTFBCCSAJTFBCOwotdHlwZWRlZiBzdHJ1Y3QgUlVQCSAJUlVQOwotdHlwZWRlZiBzdHJ1Y3QgUG9ydAkJUG9ydDsKLXR5cGVkZWYgc3RydWN0IERwUmFtCQlEcFJhbTsKK3R5cGVkZWYgc3RydWN0IFBLVCBQS1Q7Cit0eXBlZGVmIHN0cnVjdCBMUEIgTFBCOwordHlwZWRlZiBzdHJ1Y3QgUlVQIFJVUDsKK3R5cGVkZWYgc3RydWN0IFBvcnQgUG9ydDsKK3R5cGVkZWYgc3RydWN0IERwUmFtIERwUmFtOwogCi0jZW5kaWYgLyogX19yaW9fdHlwZGVmX2hfXyAqLworI2VuZGlmCQkJCS8qIF9fcmlvX3R5cGRlZl9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vdW5peHJ1cC5oIGIvZHJpdmVycy9jaGFyL3Jpby91bml4cnVwLmgKaW5kZXggZWRkZjg2Mi4uYTEyNmM3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby91bml4cnVwLmgKKysrIGIvZHJpdmVycy9jaGFyL3Jpby91bml4cnVwLmgKQEAgLTQxLDE2ICs0MSwxNSBAQAogKiogICAgVW5peFJ1cCBkYXRhIHN0cnVjdHVyZS4gVGhpcyBjb250YWlucyBwb2ludGVycyB0byBhY3R1YWwgUlVQcyBvbiB0aGUKICoqICAgIGhvc3QgY2FyZCwgYW5kIGFsbCB0aGUgY29tbWFuZC9ib290IGNvbnRyb2wgc3R1ZmYuCiAqLwotc3RydWN0ICAgIFVuaXhSdXAKLXsKLSAgICBzdHJ1Y3QgQ21kQmxrICAgICpDbWRzV2FpdGluZ1A7CS8qIENvbW1hbmRzIHdhaXRpbmcgdG8gYmUgZG9uZSAqLwotICAgIHN0cnVjdCBDbWRCbGsgICAgKkNtZFBlbmRpbmdQOwkvKiBUaGUgY29tbWFuZCBjdXJyZW50bHkgYmVpbmcgc2VudCAqLwotICAgIHN0cnVjdCBSVVAgICAgICAgKlJ1cFA7CQkvKiB0aGUgUnVwIHRvIHNlbmQgaXQgdG8gKi8KLSAgICB1aW50ICAgICAgICAgICAgIElkOwkJLyogSWQgbnVtYmVyICovCi0gICAgdWludCAgICAgICAgICAgICBCYXNlU3lzUG9ydDsJLyogU3lzUG9ydCBvZiBmaXJzdCB0dHkgb24gdGhpcyBSVEEgKi8KLSAgICB1aW50ICAgICAgICAgICAgIE1vZFR5cGVzOwkJLyogTW9kdWxlcyBvbiB0aGlzIFJUQSAqLwotICAgIHNwaW5sb2NrX3QJICAgICBSdXBMb2NrOwkJLyogTG9jayBzdHJ1Y3R1cmUgZm9yIE1QWCAqLwotLyogICAgc3RydWN0IGxvY2tiICAgICBSdXBMb2NrOwkqLwkvKiBMb2NrIHN0cnVjdHVyZSBmb3IgTVBYICovCitzdHJ1Y3QgVW5peFJ1cCB7CisJc3RydWN0IENtZEJsayAqQ21kc1dhaXRpbmdQOwkvKiBDb21tYW5kcyB3YWl0aW5nIHRvIGJlIGRvbmUgKi8KKwlzdHJ1Y3QgQ21kQmxrICpDbWRQZW5kaW5nUDsJLyogVGhlIGNvbW1hbmQgY3VycmVudGx5IGJlaW5nIHNlbnQgKi8KKwlzdHJ1Y3QgUlVQICpSdXBQOwkvKiB0aGUgUnVwIHRvIHNlbmQgaXQgdG8gKi8KKwl1aW50IElkOwkJLyogSWQgbnVtYmVyICovCisJdWludCBCYXNlU3lzUG9ydDsJLyogU3lzUG9ydCBvZiBmaXJzdCB0dHkgb24gdGhpcyBSVEEgKi8KKwl1aW50IE1vZFR5cGVzOwkJLyogTW9kdWxlcyBvbiB0aGlzIFJUQSAqLworCXNwaW5sb2NrX3QgUnVwTG9jazsJLyogTG9jayBzdHJ1Y3R1cmUgZm9yIE1QWCAqLworCS8qICAgIHN0cnVjdCBsb2NrYiAgICAgUnVwTG9jazsJKi8vKiBMb2NrIHN0cnVjdHVyZSBmb3IgTVBYICovCiB9OwogCi0jZW5kaWYgLyogX19yaW9fdW5peHJ1cF9oX18gKi8KKyNlbmRpZgkJCQkvKiBfX3Jpb191bml4cnVwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpc2NvbTguYyBiL2RyaXZlcnMvY2hhci9yaXNjb204LmMKaW5kZXggNTVhM2EwMS4uMTE5ZTYyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpc2NvbTguYworKysgYi9kcml2ZXJzL2NoYXIvcmlzY29tOC5jCkBAIC00Niw2ICs0Niw3IEBACiAjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApAQCAtODEsNyArODIsNiBAQAogc3RhdGljIHN0cnVjdCByaXNjb21fYm9hcmQgKiBJUlFfdG9fYm9hcmRbMTZdOwogc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpyaXNjb21fZHJpdmVyOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgKiB0bXBfYnVmOwotc3RhdGljIERFQ0xBUkVfTVVURVgodG1wX2J1Zl9zZW0pOwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBiYXVkX3RhYmxlW10gPSAgewogCTAsIDUwLCA3NSwgMTEwLCAxMzQsIDE1MCwgMjAwLCAzMDAsIDYwMCwgMTIwMCwgMTgwMCwgMjQwMCwgNDgwMCwKQEAgLTEwNywxNSArMTA3LDE1IEBACiAKIC8qIFJJU0NvbS84IEkvTyBwb3J0cyBhZGRyZXNzZXMgKHdpdGhvdXQgYWRkcmVzcyB0cmFuc2xhdGlvbikgKi8KIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCByY19pb3BvcnRbXSA9ICB7Ci0jaWYgMQkKKyNpZiAxCiAJMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywKLSNlbHNlCQorI2Vsc2UKIAkweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDEwLAogCTB4MTEsIDB4MTIsIDB4MTgsIDB4MjgsIDB4MzEsIDB4MzIsIDB4MzksIDB4M2EsIDB4NDAsIDB4NDEsIDB4NjEsIDB4NjIsCiAJMHg2MywgMHg2NCwgMHg2YiwgMHg3MCwgMHg3MSwgMHg3OCwgMHg3YSwgMHg3YiwgMHg3ZiwgMHgxMDAsIDB4MTAxCi0jZW5kaWYJCisjZW5kaWYKIH07Ci0jZGVmaW5lIFJDX05JT1BPUlQJKHNpemVvZihyY19pb3BvcnQpIC8gc2l6ZW9mKHJjX2lvcG9ydFswXSkpCisjZGVmaW5lIFJDX05JT1BPUlQJQVJSQVlfU0laRShyY19pb3BvcnQpCiAKIAogc3RhdGljIGlubGluZSBpbnQgcmNfcGFyYW5vaWFfY2hlY2soc3RydWN0IHJpc2NvbV9wb3J0IGNvbnN0ICogcG9ydCwKQEAgLTM1NCwyOCArMzU0LDE3IEBACiAJc3RydWN0IHJpc2NvbV9wb3J0ICpwb3J0OwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJdW5zaWduZWQgY2hhciBzdGF0dXM7Ci0JdW5zaWduZWQgY2hhciBjaDsKKwl1bnNpZ25lZCBjaGFyIGNoLCBmbGFnOwogCQogCWlmICghKHBvcnQgPSByY19nZXRfcG9ydChicCwgIlJlY2VpdmUiKSkpCiAJCXJldHVybjsKIAogCXR0eSA9IHBvcnQtPnR0eTsKLQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpICB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInJjJWQ6IHBvcnQgJWQ6IFdvcmtpbmcgYXJvdW5kIGZsaXAgIgotCQkJCSAgICAiYnVmZmVyIG92ZXJmbG93LlxuIiwKLQkJICAgICAgIGJvYXJkX05vKGJwKSwgcG9ydF9Obyhwb3J0KSk7Ci0JCXJldHVybjsKLQl9CiAJCiAjaWZkZWYgUkNfUkVQT1JUX09WRVJSVU4JCiAJc3RhdHVzID0gcmNfaW4oYnAsIENEMTgwX1JDU1IpOwotCWlmIChzdGF0dXMgJiBSQ1NSX09FKSAgeworCWlmIChzdGF0dXMgJiBSQ1NSX09FKQogCQlwb3J0LT5vdmVycnVuKys7Ci0jaWYgMAkJCi0JCXByaW50ayhLRVJOX0VSUiAicmMlZDogcG9ydCAlZDogT3ZlcnJ1bi4gVG90YWwgJWxkIG92ZXJydW5zXG4iLCAKLQkJICAgICAgIGJvYXJkX05vKGJwKSwgcG9ydF9Obyhwb3J0KSwgcG9ydC0+b3ZlcnJ1bik7Ci0jZW5kaWYJCQotCX0KIAlzdGF0dXMgJj0gcG9ydC0+bWFya19tYXNrOwogI2Vsc2UJCiAJc3RhdHVzID0gcmNfaW4oYnAsIENEMTgwX1JDU1IpICYgcG9ydC0+bWFya19tYXNrOwpAQCAtMzkzLDI1ICszODIsMjQgQEAKIAl9IGVsc2UgaWYgKHN0YXR1cyAmIFJDU1JfQlJFQUspICB7CiAJCXByaW50ayhLRVJOX0lORk8gInJjJWQ6IHBvcnQgJWQ6IEhhbmRsaW5nIGJyZWFrLi4uXG4iLAogCQkgICAgICAgYm9hcmRfTm8oYnApLCBwb3J0X05vKHBvcnQpKTsKLQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9CUkVBSzsKKwkJZmxhZyA9IFRUWV9CUkVBSzsKIAkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfU0FLKQogCQkJZG9fU0FLKHR0eSk7CiAJCQogCX0gZWxzZSBpZiAoc3RhdHVzICYgUkNTUl9QRSkgCi0JCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfUEFSSVRZOworCQlmbGFnID0gVFRZX1BBUklUWTsKIAkKIAllbHNlIGlmIChzdGF0dXMgJiBSQ1NSX0ZFKSAKLQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9GUkFNRTsKKwkJZmxhZyA9IFRUWV9GUkFNRTsKIAkKICAgICAgICAgZWxzZSBpZiAoc3RhdHVzICYgUkNTUl9PRSkKLQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9PVkVSUlVOOworCQlmbGFnID0gVFRZX09WRVJSVU47CiAJCiAJZWxzZQotCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gMDsKKwkJZmxhZyA9IFRUWV9OT1JNQUw7CiAJCi0JKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IGNoOwotCXR0eS0+ZmxpcC5jb3VudCsrOwotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmssIDEpOworCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY2gsIGZsYWcpOworCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByY19yZWNlaXZlKHN0cnVjdCByaXNjb21fYm9hcmQgY29uc3QgKiBicCkKQEAgLTQzMiwxNyArNDIwLDE1IEBACiAjZW5kaWYJCiAJCiAJd2hpbGUgKGNvdW50LS0pICB7Ci0JCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkgIHsKKwkJaWYgKHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgMSkgPT0gMCkgIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgInJjJWQ6IHBvcnQgJWQ6IFdvcmtpbmcgYXJvdW5kICIKIAkJCQkJICAgICJmbGlwIGJ1ZmZlciBvdmVyZmxvdy5cbiIsCiAJCQkgICAgICAgYm9hcmRfTm8oYnApLCBwb3J0X05vKHBvcnQpKTsKIAkJCWJyZWFrOwogCQl9Ci0JCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSByY19pbihicCwgQ0QxODBfUkRSKTsKLQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IDA7Ci0JCXR0eS0+ZmxpcC5jb3VudCsrOworCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIHJjX2luKGJwLCBDRDE4MF9SRFIpLCBUVFlfTk9STUFMKTsKIAl9Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yaywgMSk7CisJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHJjX3RyYW5zbWl0KHN0cnVjdCByaXNjb21fYm9hcmQgY29uc3QgKiBicCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yb2NrZXQuYyBiL2RyaXZlcnMvY2hhci9yb2NrZXQuYwppbmRleCBkM2JjNzMxLi4wOTQ5ZGNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcm9ja2V0LmMKKysrIGIvZHJpdmVycy9jaGFyL3JvY2tldC5jCkBAIC0zMjUsMTkgKzMyNSwxNiBAQAogewogCXVuc2lnbmVkIGludCBDaGFyTlN0YXQ7CiAJaW50IFRvUmVjdiwgd1JlY3YsIHNwYWNlID0gMCwgY291bnQ7Ci0JdW5zaWduZWQgY2hhciAqY2J1ZjsKLQljaGFyICpmYnVmOworCXVuc2lnbmVkIGNoYXIgKmNidWYsICpjaGVhZDsKKwljaGFyICpmYnVmLCAqZmhlYWQ7CiAJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CiAKIAlsZCA9IHR0eV9sZGlzY19yZWYodHR5KTsKIAogCVRvUmVjdiA9IHNHZXRSeENudChjcCk7Ci0JaWYgKGxkKQotCQlzcGFjZSA9IGxkLT5yZWNlaXZlX3Jvb20odHR5KTsKKwlzcGFjZSA9IHR0eS0+cmVjZWl2ZV9yb29tOwogCWlmIChzcGFjZSA+IDIgKiBUVFlfRkxJUEJVRl9TSVpFKQogCQlzcGFjZSA9IDIgKiBUVFlfRkxJUEJVRl9TSVpFOwotCWNidWYgPSB0dHktPmZsaXAuY2hhcl9idWY7Ci0JZmJ1ZiA9IHR0eS0+ZmxpcC5mbGFnX2J1ZjsKIAljb3VudCA9IDA7CiAjaWZkZWYgUk9DS0VUX0RFQlVHX0lOVFIKIAlwcmludGsoS0VSTl9JTkZPICJycF9kb19yZWNlaXZlKCVkLCAlZCkuLi4iLCBUb1JlY3YsIHNwYWNlKTsKQEAgLTM1MCw5ICszNDcsMTMgQEAKIAlpZiAoVG9SZWN2ID4gc3BhY2UpCiAJCVRvUmVjdiA9IHNwYWNlOwogCisJVG9SZWN2ID0gdHR5X3ByZXBhcmVfZmxpcF9zdHJpbmdfZmxhZ3ModHR5LCAmY2hlYWQsICZmaGVhZCwgVG9SZWN2KTsKIAlpZiAoVG9SZWN2IDw9IDApCiAJCWdvdG8gZG9uZTsKIAorCWNidWYgPSBjaGVhZDsKKwlmYnVmID0gZmhlYWQ7CisKIAkvKgogCSAqIGlmIHN0YXR1cyBpbmRpY2F0ZXMgdGhlcmUgYXJlIGVycm9yZWQgY2hhcmFjdGVycyBpbiB0aGUKIAkgKiBGSUZPLCB0aGVuIGVudGVyIHN0YXR1cyBtb2RlIChhIHdvcmQgaW4gRklGTyBob2xkcwpAQCAtMzk5LDcgKzQwMCw3IEBACiAJCQllbHNlIGlmIChDaGFyTlN0YXQgJiBTVE1SQ1ZST1ZSSCkKIAkJCQkqZmJ1ZisrID0gVFRZX09WRVJSVU47CiAJCQllbHNlCi0JCQkJKmZidWYrKyA9IDA7CisJCQkJKmZidWYrKyA9IFRUWV9OT1JNQUw7CiAJCQkqY2J1ZisrID0gQ2hhck5TdGF0ICYgMHhmZjsKIAkJCWNvdW50Kys7CiAJCQlUb1JlY3YtLTsKQEAgLTQyNiwxMyArNDI3LDEzIEBACiAJCQlzSW5TdHJXKHNHZXRUeFJ4RGF0YUlPKGNwKSwgKHVuc2lnbmVkIHNob3J0ICopIGNidWYsIHdSZWN2KTsKIAkJaWYgKFRvUmVjdiAmIDEpCiAJCQljYnVmW1RvUmVjdiAtIDFdID0gc0luQihzR2V0VHhSeERhdGFJTyhjcCkpOwotCQltZW1zZXQoZmJ1ZiwgMCwgVG9SZWN2KTsKKwkJbWVtc2V0KGZidWYsIFRUWV9OT1JNQUwsIFRvUmVjdik7CiAJCWNidWYgKz0gVG9SZWN2OwogCQlmYnVmICs9IFRvUmVjdjsKIAkJY291bnQgKz0gVG9SZWN2OwogCX0KIAkvKiAgUHVzaCB0aGUgZGF0YSB1cCB0byB0aGUgdHR5IGxheWVyICovCi0JbGQtPnJlY2VpdmVfYnVmKHR0eSwgdHR5LT5mbGlwLmNoYXJfYnVmLCB0dHktPmZsaXAuZmxhZ19idWYsIGNvdW50KTsKKwlsZC0+cmVjZWl2ZV9idWYodHR5LCBjYnVmLCBmYnVmLCBjb3VudCk7CiBkb25lOgogCXR0eV9sZGlzY19kZXJlZihsZCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcnRjLmMgYi9kcml2ZXJzL2NoYXIvcnRjLmMKaW5kZXggYTdmMDk5Zi4uN2NhYzZkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3J0Yy5jCisrKyBiL2RyaXZlcnMvY2hhci9ydGMuYwpAQCAtNDYsMTAgKzQ2LDEwIEBACiAgKiAgICAgIDEuMTFhICAgRGFuaWVsZSBCZWxsdWNjaTogQXVkaXQgY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSBpbiBydGNfaW5pdAogICoJMS4xMglWZW5rYXRlc2ggUGFsbGlwYWRpOiBIb29rcyBmb3IgZW11bGF0aW5nIHJ0YyBvbiBIUEVUIGJhc2UtdGltZXIKICAqCQlDT05GSUdfSFBFVF9FTVVMQVRFX1JUQwotICoKKyAqCTEuMTJhYwlBbGFuIENveDogQWxsb3cgcmVhZCBhY2Nlc3MgdG8gdGhlIGRheSBvZiB3ZWVrIHJlZ2lzdGVyCiAgKi8KIAotI2RlZmluZSBSVENfVkVSU0lPTgkJIjEuMTIiCisjZGVmaW5lIFJUQ19WRVJTSU9OCQkiMS4xMmFjIgogCiAjZGVmaW5lIFJUQ19JT19FWFRFTlQJMHg4CiAKQEAgLTEyNTAsOSArMTI1MCw5IEBACiAKIAkvKgogCSAqIE9ubHkgdGhlIHZhbHVlcyB0aGF0IHdlIHJlYWQgZnJvbSB0aGUgUlRDIGFyZSBzZXQuIFdlIGxlYXZlCi0JICogdG1fd2RheSwgdG1feWRheSBhbmQgdG1faXNkc3QgdW50b3VjaGVkLiBFdmVuIHRob3VnaCB0aGUKLQkgKiBSVEMgaGFzIFJUQ19EQVlfT0ZfV0VFSywgd2UgaWdub3JlIGl0LCBhcyBpdCBpcyBvbmx5IHVwZGF0ZWQKLQkgKiBieSB0aGUgUlRDIHdoZW4gaW5pdGlhbGx5IHNldCB0byBhIG5vbi16ZXJvIHZhbHVlLgorCSAqIHRtX3dkYXksIHRtX3lkYXkgYW5kIHRtX2lzZHN0IHVudG91Y2hlZC4gTm90ZSB0aGF0IHdoaWxlIHRoZQorCSAqIFJUQyBoYXMgUlRDX0RBWV9PRl9XRUVLLCB3ZSBzaG91bGQgdXN1YWxseSBpZ25vcmUgaXQsIGFzIGl0IGlzCisJICogb25seSB1cGRhdGVkIGJ5IHRoZSBSVEMgd2hlbiBpbml0aWFsbHkgc2V0IHRvIGEgbm9uLXplcm8gdmFsdWUuCiAJICovCiAJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOwogCXJ0Y190bS0+dG1fc2VjID0gQ01PU19SRUFEKFJUQ19TRUNPTkRTKTsKQEAgLTEyNjEsNiArMTI2MSw5IEBACiAJcnRjX3RtLT50bV9tZGF5ID0gQ01PU19SRUFEKFJUQ19EQVlfT0ZfTU9OVEgpOwogCXJ0Y190bS0+dG1fbW9uID0gQ01PU19SRUFEKFJUQ19NT05USCk7CiAJcnRjX3RtLT50bV95ZWFyID0gQ01PU19SRUFEKFJUQ19ZRUFSKTsKKwkvKiBPbmx5IHNldCBmcm9tIDIuNi4xNiBvbndhcmRzICovCisJcnRjX3RtLT50bV93ZGF5ID0gQ01PU19SRUFEKFJUQ19EQVlfT0ZfV0VFSyk7CisKICNpZmRlZiBDT05GSUdfTUFDSF9ERUNTVEFUSU9OCiAJcmVhbF95ZWFyID0gQ01PU19SRUFEKFJUQ19ERUNfWUVBUik7CiAjZW5kaWYKQEAgLTEyNzUsNiArMTI3OCw3IEBACiAJCUJDRF9UT19CSU4ocnRjX3RtLT50bV9tZGF5KTsKIAkJQkNEX1RPX0JJTihydGNfdG0tPnRtX21vbik7CiAJCUJDRF9UT19CSU4ocnRjX3RtLT50bV95ZWFyKTsKKwkJQkNEX1RPX0JJTihydGNfdG0tPnRtX3dkYXkpOwogCX0KIAogI2lmZGVmIENPTkZJR19NQUNIX0RFQ1NUQVRJT04KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zM2MyNDEwLXJ0Yy5jIGIvZHJpdmVycy9jaGFyL3MzYzI0MTAtcnRjLmMKaW5kZXggM2RmN2E1Ny4uMmUzMDg2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3MzYzI0MTAtcnRjLmMKKysrIGIvZHJpdmVycy9jaGFyL3MzYzI0MTAtcnRjLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KIAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0zMyw3ICszNCw2IEBACiAKICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAKLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KICNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLXJ0Yy5oPgogCiAvKiBuZWVkIHRoaXMgZm9yIHRoZSBSVENfQUYgZGVmaW5pdGlvbnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zY2MuaCBiL2RyaXZlcnMvY2hhci9zY2MuaAppbmRleCA1MTgxMGY3Li45Mzk5OGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc2NjLmgKKysrIGIvZHJpdmVycy9jaGFyL3NjYy5oCkBAIC0zOTksNyArMzk5LDcgQEAKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAidHN0YiAlMCIgOiA6ICJnIiAoKl9zY2NfZGVsKSA6ICJjYyIgKTtcCiAgICAgfSB3aGlsZSAoMCkKIAotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgc2NjX3NoYWRvd1syXVsxNl07CitzdGF0aWMgdW5zaWduZWQgY2hhciBzY2Nfc2hhZG93WzJdWzE2XTsKIAogLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgc2hvdWxkIHJlbGF4IHRoZSBzb21laG93IGNvbXBsaWNhdGVkCiAgKiByZWdpc3RlciBhY2Nlc3Mgb2YgdGhlIFNDQy4gX1NDQ3dyaXRlKCkgc3RvcmVzIGFsbCB3cml0dGVuIHZhbHVlcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3NlbGVjdGlvbi5jIGIvZHJpdmVycy9jaGFyL3NlbGVjdGlvbi5jCmluZGV4IDViMTg3YzguLjcxMDkzYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zZWxlY3Rpb24uYworKysgYi9kcml2ZXJzL2NoYXIvc2VsZWN0aW9uLmMKQEAgLTI3NSw3ICsyNzUsOCBAQAogaW50IHBhc3RlX3NlbGVjdGlvbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCXN0cnVjdCB2Y19kYXRhICp2YyA9IChzdHJ1Y3QgdmNfZGF0YSAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0JaW50CXBhc3RlZCA9IDAsIGNvdW50OworCWludAlwYXN0ZWQgPSAwOworCXVuc2lnbmVkIGludCBjb3VudDsKIAlzdHJ1Y3QgIHR0eV9sZGlzYyAqbGQ7CiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAKQEAgLTI5Myw3ICsyOTQsNyBAQAogCQkJY29udGludWU7CiAJCX0KIAkJY291bnQgPSBzZWxfYnVmZmVyX2x0aCAtIHBhc3RlZDsKLQkJY291bnQgPSBtaW4oY291bnQsIHR0eS0+bGRpc2MucmVjZWl2ZV9yb29tKHR0eSkpOworCQljb3VudCA9IG1pbihjb3VudCwgdHR5LT5yZWNlaXZlX3Jvb20pOwogCQl0dHktPmxkaXNjLnJlY2VpdmVfYnVmKHR0eSwgc2VsX2J1ZmZlciArIHBhc3RlZCwgTlVMTCwgY291bnQpOwogCQlwYXN0ZWQgKz0gY291bnQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Nlcl9hMjIzMi5jIGIvZHJpdmVycy9jaGFyL3Nlcl9hMjIzMi5jCmluZGV4IGRkYTMwZTQuLjgwYTViODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zZXJfYTIyMzIuYworKysgYi9kcml2ZXJzL2NoYXIvc2VyX2EyMjMyLmMKQEAgLTE5NCwxMSArMTk0LDYgQEAKICovCiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPmdzLnR0eTsKIAotCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkKLQkJcmV0dXJuOwotCi0JdHR5LT5mbGlwLmNvdW50Kys7Ci0KICNpZiAwCiAJc3dpdGNoKGVycikgewogCWNhc2UgVFRZX0JSRUFLOgpAQCAtMjEyLDggKzIwNyw3IEBACiAJfQogI2VuZGlmCiAKLQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gZXJyOwotCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSBjaDsKKwl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBlcnIpOwogCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zZXJpYWwxNjcuYyBiL2RyaXZlcnMvY2hhci9zZXJpYWwxNjcuYwppbmRleCBjMmRlYWM5Li4wMzdjOTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc2VyaWFsMTY3LmMKKysrIGIvZHJpdmVycy9jaGFyL3NlcmlhbDE2Ny5jCkBAIC0xMTcsNyArMTE3LDcgQEAKICAgICAgICAgey0xIH0sICAgICAgLyogdHR5UzIgKi8KICAgICAgICAgey0xIH0sICAgICAgLyogdHR5UzMgKi8KIH07Ci0jZGVmaW5lIE5SX1BPUlRTICAgICAgICAoc2l6ZW9mKGN5X3BvcnQpL3NpemVvZihzdHJ1Y3QgY3ljbGFkZXNfcG9ydCkpCisjZGVmaW5lIE5SX1BPUlRTICAgICAgICBBUlJBWV9TSVpFKGN5X3BvcnQpCiAKIC8qCiAgKiB0bXBfYnVmIGlzIHVzZWQgYXMgYSB0ZW1wb3JhcnkgYnVmZmVyIGJ5IHNlcmlhbF93cml0ZS4gIFdlIG5lZWQgdG8KQEAgLTEyOSw3ICsxMjksNiBAQAogICogbWVtb3J5IGlmIGxhcmdlIG51bWJlcnMgb2Ygc2VyaWFsIHBvcnRzIGFyZSBvcGVuLgogICovCiBzdGF0aWMgdW5zaWduZWQgY2hhciAqdG1wX2J1ZiA9IDA7Ci1ERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKIAogLyoKICAqIFRoaXMgaXMgdXNlZCB0byBsb29rIHVwIHRoZSBkaXZpc29yIHNwZWVkcyBhbmQgdGhlIHRpbWVvdXRzCkBAIC00MjIsNDUgKzQyMSwzNSBAQAogCSAgICBiYXNlX2FkZHJbQ3lSRU9JUl0gPSByZm9jID8gMCA6IEN5Tk9UUkFOUzsKIAkgICAgcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KLQlpZiAodHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSl7Ci0JICAgIHR0eS0+ZmxpcC5jb3VudCsrOworCWlmICh0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIDEpICE9IDApewogCSAgICBpZiAoZXJyICYgaW5mby0+cmVhZF9zdGF0dXNfbWFzayl7CiAJCWlmKGVyciAmIEN5QlJFQUspewotCQkgICAgKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9CUkVBSzsKLQkJICAgICp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSBkYXRhOworCQkgICAgdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBkYXRhLCBUVFlfQlJFQUspOwogCQkgICAgaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfU0FLKXsKIAkJCWRvX1NBSyh0dHkpOwogCQkgICAgfQogCQl9ZWxzZSBpZihlcnIgJiBDeUZSQU1FKXsKLQkJICAgICp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfRlJBTUU7Ci0JCSAgICAqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gZGF0YTsKKwkJICAgIHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgZGF0YSwgVFRZX0ZSQU1FKTsKIAkJfWVsc2UgaWYoZXJyICYgQ3lQQVJJVFkpewotCQkgICAgKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9QQVJJVFk7Ci0JCSAgICAqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gZGF0YTsKKwkJICAgIHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgZGF0YSwgVFRZX1BBUklUWSk7CiAJCX1lbHNlIGlmKGVyciAmIEN5T1ZFUlJVTil7Ci0JCSAgICAqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX09WRVJSVU47Ci0JCSAgICAqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gMDsKKwkJICAgIHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pOwogCQkgICAgLyoKIAkJICAgICAgIElmIHRoZSBmbGlwIGJ1ZmZlciBpdHNlbGYgaXMKIAkJICAgICAgIG92ZXJmbG93aW5nLCB3ZSBzdGlsbCBsb29zZQogCQkgICAgICAgdGhlIG5leHQgaW5jb21pbmcgY2hhcmFjdGVyLgogCQkgICAgICovCi0JCSAgICBpZih0dHktPmZsaXAuY291bnQgPCBUVFlfRkxJUEJVRl9TSVpFKXsKLQkJCXR0eS0+ZmxpcC5jb3VudCsrOwotCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9OT1JNQUw7Ci0JCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gZGF0YTsKLQkJICAgIH0KKwkJICAgIHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgZGF0YSwgVFRZX05PUk1BTCk7CisJCX0KIAkJLyogVGhlc2UgdHdvIGNvbmRpdGlvbnMgbWF5IGltcGx5ICovCiAJCS8qIGEgbm9ybWFsIHJlYWQgc2hvdWxkIGJlIGRvbmUuICovCiAJCS8qIGVsc2UgaWYoZGF0YSAmIEN5VElNRU9VVCkgKi8KIAkJLyogZWxzZSBpZihkYXRhICYgQ3lTUEVDSEFSKSAqLwogCQl9ZWxzZXsKLQkJICAgICp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSAwOwotCQkgICAgKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IDA7CisJCSAgICB0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9OT1JNQUwpOwogCQl9CiAJICAgIH1lbHNlewotCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gMDsKLQkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IDA7CisJCSAgICB0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGRhdGEsIFRUWV9OT1JNQUwpOwogCSAgICB9CiAJfWVsc2V7CiAJICAgIC8qIHRoZXJlIHdhcyBhIHNvZnR3YXJlIGJ1ZmZlciBvdmVycnVuCkBAIC02OTIsMTIgKzY4MSw3IEBACiAjZW5kaWYKIAl3aGlsZShjaGFyX2NvdW50LS0pewogCSAgICBkYXRhID0gYmFzZV9hZGRyW0N5UkRSXTsKLQkgICAgaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKXsKLQkJY29udGludWU7Ci0JICAgIH0KLQkgICAgdHR5LT5mbGlwLmNvdW50Kys7Ci0JICAgICp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfTk9STUFMOwotCSAgICAqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gZGF0YTsKKwkgICAgdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBkYXRhLCBUVFlfTk9STUFMKTsKICNpZmRlZiBDWUNMT01fMTZZX0hBQ0sKIAkgICAgdWRlbGF5KDEwTCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zb255cGkuYyBiL2RyaXZlcnMvY2hhci9zb255cGkuYwppbmRleCA1MWEwNzM3Li5mOGRkODUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc29ueXBpLmMKKysrIGIvZHJpdmVycy9jaGFyL3NvbnlwaS5jCkBAIC00NzEsNyArNDcxLDYgQEAKIAogc3RhdGljIHN0cnVjdCBzb255cGlfZGV2aWNlIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAJdTE2IGlycTsKIAl1MTYgYml0czsKIAl1MTYgaW9wb3J0MTsKQEAgLTUxMSw2ICs1MTAsMTEgQEAKICNkZWZpbmUgU09OWVBJX0FDUElfQUNUSVZFIDAKICNlbmRpZgkJCQkvKiBDT05GSUdfQUNQSSAqLwogCisjaWZkZWYgQ09ORklHX0FDUEkKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9kZXZpY2UgKnNvbnlwaV9hY3BpX2RldmljZTsKK3N0YXRpYyBpbnQgYWNwaV9lbmFibGVkOworI2VuZGlmCisKIHN0YXRpYyBpbnQgc29ueXBpX2VjX3dyaXRlKHU4IGFkZHIsIHU4IHZhbHVlKQogewogI2lmZGVmIENPTkZJR19BQ1BJX0VDCkBAIC04NjQsNiArODY4LDExIEBACiAJaWYgKHVzZWlucHV0KQogCQlzb255cGlfcmVwb3J0X2lucHV0X2V2ZW50KGV2ZW50KTsKIAorI2lmZGVmIENPTkZJR19BQ1BJCisJaWYgKGFjcGlfZW5hYmxlZCkKKwkJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoc29ueXBpX2FjcGlfZGV2aWNlLCAxLCBldmVudCk7CisjZW5kaWYKKwogCWtmaWZvX3B1dChzb255cGlfZGV2aWNlLmZpZm8sICh1bnNpZ25lZCBjaGFyICopJmV2ZW50LCBzaXplb2YoZXZlbnQpKTsKIAlraWxsX2Zhc3luYygmc29ueXBpX2RldmljZS5maWZvX2FzeW5jLCBTSUdJTywgUE9MTF9JTik7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzb255cGlfZGV2aWNlLmZpZm9fcHJvY19saXN0KTsKQEAgLTExNjUsNDUgKzExNzQsMzggQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBvbGRfY2FtZXJhX3Bvd2VyOwotCi1zdGF0aWMgaW50IHNvbnlwaV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorI2lmZGVmIENPTkZJR19BQ1BJCitzdGF0aWMgaW50IHNvbnlwaV9hY3BpX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlvbGRfY2FtZXJhX3Bvd2VyID0gc29ueXBpX2RldmljZS5jYW1lcmFfcG93ZXI7Ci0Jc29ueXBpX2Rpc2FibGUoKTsKLQorCXNvbnlwaV9hY3BpX2RldmljZSA9IGRldmljZTsKKwlzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCAiU29ueSBsYXB0b3AgaG90a2V5cyIpOworCXN0cmNweShhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCAic29ueS9ob3RrZXkiKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzb255cGlfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgc29ueXBpX2FjcGlfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKIHsKLQlzb255cGlfZW5hYmxlKG9sZF9jYW1lcmFfcG93ZXIpOworCXNvbnlwaV9hY3BpX2RldmljZSA9IE5VTEw7CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKIAotc3RhdGljIHZvaWQgc29ueXBpX3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlzb255cGlfZGlzYWJsZSgpOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzb255cGlfZHJpdmVyID0gewotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kCT0gc29ueXBpX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBzb255cGlfcmVzdW1lLAotI2VuZGlmCi0JLnNodXRkb3duCT0gc29ueXBpX3NodXRkb3duLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJzb255cGkiLAorc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBzb255cGlfYWNwaV9kcml2ZXIgPSB7CisJLm5hbWUgICAgICAgICAgID0gInNvbnlwaSIsCisJLmNsYXNzICAgICAgICAgID0gImhrZXkiLAorCS5pZHMgICAgICAgICAgICA9ICJTTlk2MDAxIiwKKwkub3BzICAgICAgICAgICAgPSB7CisJCSAgICAgICAgICAgLmFkZCA9IHNvbnlwaV9hY3BpX2FkZCwKKwkJCSAgIC5yZW1vdmUgPSBzb255cGlfYWNwaV9yZW1vdmUsCiAJfSwKIH07CisjZW5kaWYKIAogc3RhdGljIGludCBfX2RldmluaXQgc29ueXBpX2NyZWF0ZV9pbnB1dF9kZXZpY2VzKHZvaWQpCiB7CiAJc3RydWN0IGlucHV0X2RldiAqam9nX2RldjsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICprZXlfZGV2OwogCWludCBpOworCWludCBlcnJvcjsKIAogCXNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2RldiA9IGpvZ19kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKIAlpZiAoIWpvZ19kZXYpCkBAIC0xMjE5LDkgKzEyMjEsOCBAQAogCiAJc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2ID0ga2V5X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwogCWlmICgha2V5X2RldikgewotCQlpbnB1dF9mcmVlX2RldmljZShqb2dfZGV2KTsKLQkJc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2ID0gTlVMTDsKLQkJcmV0dXJuIC1FTk9NRU07CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9qb2dkZXY7CiAJfQogCiAJa2V5X2Rldi0+bmFtZSA9ICJTb255IFZhaW8gS2V5cyI7CkBAIC0xMjM0LDEzNiArMTIzNSw2NyBAQAogCQlpZiAoc29ueXBpX2lucHV0a2V5c1tpXS5pbnB1dGV2KQogCQkJc2V0X2JpdChzb255cGlfaW5wdXRrZXlzW2ldLmlucHV0ZXYsIGtleV9kZXYtPmtleWJpdCk7CiAKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoam9nX2Rldik7Ci0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGtleV9kZXYpOworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGpvZ19kZXYpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJfZnJlZV9rZXlkZXY7CisKKwllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShrZXlfZGV2KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyX3VucmVnaXN0ZXJfam9nZGV2OwogCiAJcmV0dXJuIDA7CisKKyBlcnJfdW5yZWdpc3Rlcl9qb2dkZXY6CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uoam9nX2Rldik7CisJLyogU2V0IHRvIE5VTEwgc28gd2UgZG9uJ3QgZnJlZSBpdCBhZ2FpbiBiZWxvdyAqLworCWpvZ19kZXYgPSBOVUxMOworIGVycl9mcmVlX2tleWRldjoKKwlpbnB1dF9mcmVlX2RldmljZShrZXlfZGV2KTsKKwlzb255cGlfZGV2aWNlLmlucHV0X2tleV9kZXYgPSBOVUxMOworIGVycl9mcmVlX2pvZ2RldjoKKwlpbnB1dF9mcmVlX2RldmljZShqb2dfZGV2KTsKKwlzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYgPSBOVUxMOworCisJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzb255cGlfcHJvYmUodm9pZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNvbnlwaV9zZXR1cF9pb3BvcnRzKHN0cnVjdCBzb255cGlfZGV2aWNlICpkZXYsCisJCQkJY29uc3Qgc3RydWN0IHNvbnlwaV9pb3BvcnRfbGlzdCAqaW9wb3J0X2xpc3QpCiB7Ci0JaW50IGksIHJldDsKLQlzdHJ1Y3Qgc29ueXBpX2lvcG9ydF9saXN0ICppb3BvcnRfbGlzdDsKLQlzdHJ1Y3Qgc29ueXBpX2lycV9saXN0ICppcnFfbGlzdDsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OworCXdoaWxlIChpb3BvcnRfbGlzdC0+cG9ydDEpIHsKIAotCWlmICgocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkJCQkgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8zLCBOVUxMKSkpCi0JCXNvbnlwaV9kZXZpY2UubW9kZWwgPSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxOwotCWVsc2UgaWYgKChwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAotCQkJCQkgIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8xLCBOVUxMKSkpCi0JCXNvbnlwaV9kZXZpY2UubW9kZWwgPSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzOwotCWVsc2UKLQkJc29ueXBpX2RldmljZS5tb2RlbCA9IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTI7Ci0KLQlzb255cGlfZGV2aWNlLmRldiA9IHBjaWRldjsKLQotCXNwaW5fbG9ja19pbml0KCZzb255cGlfZGV2aWNlLmZpZm9fbG9jayk7Ci0Jc29ueXBpX2RldmljZS5maWZvID0ga2ZpZm9fYWxsb2MoU09OWVBJX0JVRl9TSVpFLCBHRlBfS0VSTkVMLAotCQkJCQkgJnNvbnlwaV9kZXZpY2UuZmlmb19sb2NrKTsKLQlpZiAoSVNfRVJSKHNvbnlwaV9kZXZpY2UuZmlmbykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IGtmaWZvX2FsbG9jIGZhaWxlZFxuIik7Ci0JCXJldCA9IFBUUl9FUlIoc29ueXBpX2RldmljZS5maWZvKTsKLQkJZ290byBvdXRfZmlmbzsKLQl9Ci0KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzb255cGlfZGV2aWNlLmZpZm9fcHJvY19saXN0KTsKLQlpbml0X01VVEVYKCZzb255cGlfZGV2aWNlLmxvY2spOwotCXNvbnlwaV9kZXZpY2UuYmx1ZXRvb3RoX3Bvd2VyID0gLTE7Ci0KLQlpZiAocGNpZGV2ICYmIHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZFxuIik7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gb3V0X3BjaWVuYWJsZTsKLQl9Ci0KLQlpZiAobWlub3IgIT0gLTEpCi0JCXNvbnlwaV9taXNjX2RldmljZS5taW5vciA9IG1pbm9yOwotCWlmICgocmV0ID0gbWlzY19yZWdpc3Rlcigmc29ueXBpX21pc2NfZGV2aWNlKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IG1pc2NfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKLQkJZ290byBvdXRfbWlzY3JlZzsKLQl9Ci0KLQotCWlmIChzb255cGlfZGV2aWNlLm1vZGVsID09IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEpIHsKLQkJaW9wb3J0X2xpc3QgPSBzb255cGlfdHlwZTFfaW9wb3J0X2xpc3Q7Ci0JCXNvbnlwaV9kZXZpY2UucmVnaW9uX3NpemUgPSBTT05ZUElfVFlQRTFfUkVHSU9OX1NJWkU7Ci0JCXNvbnlwaV9kZXZpY2UuZXZ0eXBlX29mZnNldCA9IFNPTllQSV9UWVBFMV9FVlRZUEVfT0ZGU0VUOwotCQlpcnFfbGlzdCA9IHNvbnlwaV90eXBlMV9pcnFfbGlzdDsKLQl9IGVsc2UgaWYgKHNvbnlwaV9kZXZpY2UubW9kZWwgPT0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMikgewotCQlpb3BvcnRfbGlzdCA9IHNvbnlwaV90eXBlMl9pb3BvcnRfbGlzdDsKLQkJc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSA9IFNPTllQSV9UWVBFMl9SRUdJT05fU0laRTsKLQkJc29ueXBpX2RldmljZS5ldnR5cGVfb2Zmc2V0ID0gU09OWVBJX1RZUEUyX0VWVFlQRV9PRkZTRVQ7Ci0JCWlycV9saXN0ID0gc29ueXBpX3R5cGUyX2lycV9saXN0OwotCX0gZWxzZSB7Ci0JCWlvcG9ydF9saXN0ID0gc29ueXBpX3R5cGUzX2lvcG9ydF9saXN0OwotCQlzb255cGlfZGV2aWNlLnJlZ2lvbl9zaXplID0gU09OWVBJX1RZUEUzX1JFR0lPTl9TSVpFOwotCQlzb255cGlfZGV2aWNlLmV2dHlwZV9vZmZzZXQgPSBTT05ZUElfVFlQRTNfRVZUWVBFX09GRlNFVDsKLQkJaXJxX2xpc3QgPSBzb255cGlfdHlwZTNfaXJxX2xpc3Q7Ci0JfQotCi0JZm9yIChpID0gMDsgaW9wb3J0X2xpc3RbaV0ucG9ydDE7IGkrKykgewotCQlpZiAocmVxdWVzdF9yZWdpb24oaW9wb3J0X2xpc3RbaV0ucG9ydDEsCisJCWlmIChyZXF1ZXN0X3JlZ2lvbihpb3BvcnRfbGlzdC0+cG9ydDEsCiAJCQkJICAgc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSwKIAkJCQkgICAiU29ueSBQcm9ncmFtYWJsZSBJL08gRGV2aWNlIikpIHsKLQkJCS8qIGdldCB0aGUgaW9wb3J0ICovCi0JCQlzb255cGlfZGV2aWNlLmlvcG9ydDEgPSBpb3BvcnRfbGlzdFtpXS5wb3J0MTsKLQkJCXNvbnlwaV9kZXZpY2UuaW9wb3J0MiA9IGlvcG9ydF9saXN0W2ldLnBvcnQyOwotCQkJYnJlYWs7CisJCQlkZXYtPmlvcG9ydDEgPSBpb3BvcnRfbGlzdC0+cG9ydDE7CisJCQlkZXYtPmlvcG9ydDIgPSBpb3BvcnRfbGlzdC0+cG9ydDI7CisJCQlyZXR1cm4gMDsKIAkJfQotCX0KLQlpZiAoIXNvbnlwaV9kZXZpY2UuaW9wb3J0MSkgewotCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaTogcmVxdWVzdF9yZWdpb24gZmFpbGVkXG4iKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBvdXRfcmVxcmVnOworCQlpb3BvcnRfbGlzdCsrOwogCX0KIAotCWZvciAoaSA9IDA7IGlycV9saXN0W2ldLmlycTsgaSsrKSB7CisJcmV0dXJuIC1FQlVTWTsKK30KIAotCQlzb255cGlfZGV2aWNlLmlycSA9IGlycV9saXN0W2ldLmlycTsKLQkJc29ueXBpX2RldmljZS5iaXRzID0gaXJxX2xpc3RbaV0uYml0czsKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNvbnlwaV9zZXR1cF9pcnEoc3RydWN0IHNvbnlwaV9kZXZpY2UgKmRldiwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3Qgc29ueXBpX2lycV9saXN0ICppcnFfbGlzdCkKK3sKKwl3aGlsZSAoaXJxX2xpc3QtPmlycSkgewogCi0JCWlmICghcmVxdWVzdF9pcnEoc29ueXBpX2RldmljZS5pcnEsIHNvbnlwaV9pcnEsCi0JCQkJIFNBX1NISVJRLCAic29ueXBpIiwgc29ueXBpX2lycSkpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoIWlycV9saXN0W2ldLmlycSkgewotCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaTogcmVxdWVzdF9pcnEgZmFpbGVkXG4iKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBvdXRfcmVxaXJxOwotCX0KLQotCWlmICh1c2VpbnB1dCkgewotCi0JCXJldCA9IHNvbnlwaV9jcmVhdGVfaW5wdXRfZGV2aWNlcygpOwotCQlpZiAocmV0KQotCQkJZ290byBvdXRfaW5wdXRkZXZpY2VzOwotCi0JCXNwaW5fbG9ja19pbml0KCZzb255cGlfZGV2aWNlLmlucHV0X2ZpZm9fbG9jayk7Ci0JCXNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmbyA9Ci0JCQlrZmlmb19hbGxvYyhTT05ZUElfQlVGX1NJWkUsIEdGUF9LRVJORUwsCi0JCQkJICAgICZzb255cGlfZGV2aWNlLmlucHV0X2ZpZm9fbG9jayk7Ci0JCWlmIChJU19FUlIoc29ueXBpX2RldmljZS5pbnB1dF9maWZvKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IGtmaWZvX2FsbG9jIGZhaWxlZFxuIik7Ci0JCQlyZXQgPSBQVFJfRVJSKHNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmbyk7Ci0JCQlnb3RvIG91dF9pbmZpZm87CisJCWlmICghcmVxdWVzdF9pcnEoaXJxX2xpc3QtPmlycSwgc29ueXBpX2lycSwKKwkJCQkgU0FfU0hJUlEsICJzb255cGkiLCBzb255cGlfaXJxKSkgeworCQkJZGV2LT5pcnEgPSBpcnFfbGlzdC0+aXJxOworCQkJZGV2LT5iaXRzID0gaXJxX2xpc3QtPmJpdHM7CisJCQlyZXR1cm4gMDsKIAkJfQotCi0JCUlOSVRfV09SSygmc29ueXBpX2RldmljZS5pbnB1dF93b3JrLCBpbnB1dF9rZXlyZWxlYXNlLCBOVUxMKTsKKwkJaXJxX2xpc3QrKzsKIAl9CiAKLQlzb255cGlfZGV2aWNlLnBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJzb255cGkiLCAtMSwKLQkJCQkJCQkgICAgIE5VTEwsIDApOwotCWlmIChJU19FUlIoc29ueXBpX2RldmljZS5wZGV2KSkgewotCQlyZXQgPSBQVFJfRVJSKHNvbnlwaV9kZXZpY2UucGRldik7Ci0JCWdvdG8gb3V0X3BsYXRmb3JtZGV2OwotCX0KKwlyZXR1cm4gLUVCVVNZOworfQogCi0Jc29ueXBpX2VuYWJsZSgwKTsKLQotCXByaW50ayhLRVJOX0lORk8gInNvbnlwaTogU29ueSBQcm9ncmFtbWFibGUgSS9PIENvbnRyb2xsZXIgRHJpdmVyIgotCSAgICAgICAidiVzLlxuIiwgU09OWVBJX0RSSVZFUl9WRVJTSU9OKTsKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzb255cGlfZGlzcGxheV9pbmZvKHZvaWQpCit7CiAJcHJpbnRrKEtFUk5fSU5GTyAic29ueXBpOiBkZXRlY3RlZCB0eXBlJWQgbW9kZWwsICIKIAkgICAgICAgInZlcmJvc2UgPSAlZCwgZm5rZXlpbml0ID0gJXMsIGNhbWVyYSA9ICVzLCAiCiAJICAgICAgICJjb21wYXQgPSAlcywgbWFzayA9IDB4JTA4bHgsIHVzZWlucHV0ID0gJXMsIGFjcGkgPSAlc1xuIiwKQEAgLTEzODIsNTUgKzEzMTQsMTk2IEBACiAJaWYgKG1pbm9yID09IC0xKQogCQlwcmludGsoS0VSTl9JTkZPICJzb255cGk6IGRldmljZSBhbGxvY2F0ZWQgbWlub3IgaXMgJWRcbiIsCiAJCSAgICAgICBzb255cGlfbWlzY19kZXZpY2UubWlub3IpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzb255cGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCWNvbnN0IHN0cnVjdCBzb255cGlfaW9wb3J0X2xpc3QgKmlvcG9ydF9saXN0OworCWNvbnN0IHN0cnVjdCBzb255cGlfaXJxX2xpc3QgKmlycV9saXN0OworCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7CisJaW50IGVycm9yOworCisJc3Bpbl9sb2NrX2luaXQoJnNvbnlwaV9kZXZpY2UuZmlmb19sb2NrKTsKKwlzb255cGlfZGV2aWNlLmZpZm8gPSBrZmlmb19hbGxvYyhTT05ZUElfQlVGX1NJWkUsIEdGUF9LRVJORUwsCisJCQkJCSAmc29ueXBpX2RldmljZS5maWZvX2xvY2spOworCWlmIChJU19FUlIoc29ueXBpX2RldmljZS5maWZvKSkgeworCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaToga2ZpZm9fYWxsb2MgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoc29ueXBpX2RldmljZS5maWZvKTsKKwl9CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzb255cGlfZGV2aWNlLmZpZm9fcHJvY19saXN0KTsKKwlpbml0X01VVEVYKCZzb255cGlfZGV2aWNlLmxvY2spOworCXNvbnlwaV9kZXZpY2UuYmx1ZXRvb3RoX3Bvd2VyID0gLTE7CisKKwlpZiAoKHBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCisJCQkJICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMywgTlVMTCkpKQorCQlzb255cGlfZGV2aWNlLm1vZGVsID0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMTsKKwllbHNlIGlmICgocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCQkJICBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMSwgTlVMTCkpKQorCQlzb255cGlfZGV2aWNlLm1vZGVsID0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMzsKKwllbHNlCisJCXNvbnlwaV9kZXZpY2UubW9kZWwgPSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyOworCisJaWYgKHBjaWRldiAmJiBwY2lfZW5hYmxlX2RldmljZShwY2lkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic29ueXBpOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWRcbiIpOworCQllcnJvciA9IC1FSU87CisJCWdvdG8gZXJyX3B1dF9wY2lkZXY7CisJfQorCisJc29ueXBpX2RldmljZS5kZXYgPSBwY2lkZXY7CisKKwlpZiAoc29ueXBpX2RldmljZS5tb2RlbCA9PSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxKSB7CisJCWlvcG9ydF9saXN0ID0gc29ueXBpX3R5cGUxX2lvcG9ydF9saXN0OworCQlzb255cGlfZGV2aWNlLnJlZ2lvbl9zaXplID0gU09OWVBJX1RZUEUxX1JFR0lPTl9TSVpFOworCQlzb255cGlfZGV2aWNlLmV2dHlwZV9vZmZzZXQgPSBTT05ZUElfVFlQRTFfRVZUWVBFX09GRlNFVDsKKwkJaXJxX2xpc3QgPSBzb255cGlfdHlwZTFfaXJxX2xpc3Q7CisJfSBlbHNlIGlmIChzb255cGlfZGV2aWNlLm1vZGVsID09IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIpIHsKKwkJaW9wb3J0X2xpc3QgPSBzb255cGlfdHlwZTJfaW9wb3J0X2xpc3Q7CisJCXNvbnlwaV9kZXZpY2UucmVnaW9uX3NpemUgPSBTT05ZUElfVFlQRTJfUkVHSU9OX1NJWkU7CisJCXNvbnlwaV9kZXZpY2UuZXZ0eXBlX29mZnNldCA9IFNPTllQSV9UWVBFMl9FVlRZUEVfT0ZGU0VUOworCQlpcnFfbGlzdCA9IHNvbnlwaV90eXBlMl9pcnFfbGlzdDsKKwl9IGVsc2UgeworCQlpb3BvcnRfbGlzdCA9IHNvbnlwaV90eXBlM19pb3BvcnRfbGlzdDsKKwkJc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSA9IFNPTllQSV9UWVBFM19SRUdJT05fU0laRTsKKwkJc29ueXBpX2RldmljZS5ldnR5cGVfb2Zmc2V0ID0gU09OWVBJX1RZUEUzX0VWVFlQRV9PRkZTRVQ7CisJCWlycV9saXN0ID0gc29ueXBpX3R5cGUzX2lycV9saXN0OworCX0KKworCWVycm9yID0gc29ueXBpX3NldHVwX2lvcG9ydHMoJnNvbnlwaV9kZXZpY2UsIGlvcG9ydF9saXN0KTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IGZhaWxlZCB0byByZXF1ZXN0IGlvcG9ydHNcbiIpOworCQlnb3RvIGVycl9kaXNhYmxlX3BjaWRldjsKKwl9CisKKwllcnJvciA9IHNvbnlwaV9zZXR1cF9pcnEoJnNvbnlwaV9kZXZpY2UsIGlycV9saXN0KTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IHJlcXVlc3RfaXJxIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2ZyZWVfaW9wb3J0czsKKwl9CisKKwlpZiAobWlub3IgIT0gLTEpCisJCXNvbnlwaV9taXNjX2RldmljZS5taW5vciA9IG1pbm9yOworCWVycm9yID0gbWlzY19yZWdpc3Rlcigmc29ueXBpX21pc2NfZGV2aWNlKTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IG1pc2NfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZV9pcnE7CisJfQorCisJc29ueXBpX2Rpc3BsYXlfaW5mbygpOworCisJaWYgKHVzZWlucHV0KSB7CisKKwkJZXJyb3IgPSBzb255cGlfY3JlYXRlX2lucHV0X2RldmljZXMoKTsKKwkJaWYgKGVycm9yKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkic29ueXBpOiBmYWlsZWQgdG8gY3JlYXRlIGlucHV0IGRldmljZXNcbiIpOworCQkJZ290byBlcnJfbWlzY2Rldl91bnJlZ2lzdGVyOworCQl9CisKKwkJc3Bpbl9sb2NrX2luaXQoJnNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmb19sb2NrKTsKKwkJc29ueXBpX2RldmljZS5pbnB1dF9maWZvID0KKwkJCWtmaWZvX2FsbG9jKFNPTllQSV9CVUZfU0laRSwgR0ZQX0tFUk5FTCwKKwkJCQkgICAgJnNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmb19sb2NrKTsKKwkJaWYgKElTX0VSUihzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8pKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaToga2ZpZm9fYWxsb2MgZmFpbGVkXG4iKTsKKwkJCWVycm9yID0gUFRSX0VSUihzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8pOworCQkJZ290byBlcnJfaW5wZGV2X3VucmVnaXN0ZXI7CisJCX0KKworCQlJTklUX1dPUksoJnNvbnlwaV9kZXZpY2UuaW5wdXRfd29yaywgaW5wdXRfa2V5cmVsZWFzZSwgTlVMTCk7CisJfQorCisJc29ueXBpX2VuYWJsZSgwKTsKIAogCXJldHVybiAwOwogCi1vdXRfcGxhdGZvcm1kZXY6Ci0Ja2ZpZm9fZnJlZShzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8pOwotb3V0X2luZmlmbzoKKyBlcnJfaW5wZGV2X3VucmVnaXN0ZXI6CiAJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uoc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2KTsKIAlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYpOwotb3V0X2lucHV0ZGV2aWNlczoKLQlmcmVlX2lycShzb255cGlfZGV2aWNlLmlycSwgc29ueXBpX2lycSk7Ci1vdXRfcmVxaXJxOgotCXJlbGVhc2VfcmVnaW9uKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSwgc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSk7Ci1vdXRfcmVxcmVnOgorIGVycl9taXNjZGV2X3VucmVnaXN0ZXI6CiAJbWlzY19kZXJlZ2lzdGVyKCZzb255cGlfbWlzY19kZXZpY2UpOwotb3V0X21pc2NyZWc6CisgZXJyX2ZyZWVfaXJxOgorCWZyZWVfaXJxKHNvbnlwaV9kZXZpY2UuaXJxLCBzb255cGlfaXJxKTsKKyBlcnJfZnJlZV9pb3BvcnRzOgorCXJlbGVhc2VfcmVnaW9uKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSwgc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSk7CisgZXJyX2Rpc2FibGVfcGNpZGV2OgogCWlmIChwY2lkZXYpCiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2lkZXYpOwotb3V0X3BjaWVuYWJsZToKKyBlcnJfcHV0X3BjaWRldjoKKwlwY2lfZGV2X3B1dChwY2lkZXYpOwogCWtmaWZvX2ZyZWUoc29ueXBpX2RldmljZS5maWZvKTsKLW91dF9maWZvOgotCXBjaV9kZXZfcHV0KHNvbnlwaV9kZXZpY2UuZGV2KTsKLQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgc29ueXBpX3JlbW92ZSh2b2lkKQorc3RhdGljIGludCBfX2RldmV4aXQgc29ueXBpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJc29ueXBpX2Rpc2FibGUoKTsKIAogCXN5bmNocm9uaXplX3NjaGVkKCk7ICAvKiBBbGxvdyBzb255cGkgaW50ZXJydXB0IHRvIGNvbXBsZXRlLiAqLwogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CiAKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcihzb255cGlfZGV2aWNlLnBkZXYpOwotCiAJaWYgKHVzZWlucHV0KSB7CiAJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldik7CiAJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldik7CiAJCWtmaWZvX2ZyZWUoc29ueXBpX2RldmljZS5pbnB1dF9maWZvKTsKIAl9CiAKKwltaXNjX2RlcmVnaXN0ZXIoJnNvbnlwaV9taXNjX2RldmljZSk7CisKIAlmcmVlX2lycShzb255cGlfZGV2aWNlLmlycSwgc29ueXBpX2lycSk7CiAJcmVsZWFzZV9yZWdpb24oc29ueXBpX2RldmljZS5pb3BvcnQxLCBzb255cGlfZGV2aWNlLnJlZ2lvbl9zaXplKTsKLQltaXNjX2RlcmVnaXN0ZXIoJnNvbnlwaV9taXNjX2RldmljZSk7Ci0JaWYgKHNvbnlwaV9kZXZpY2UuZGV2KQorCisJaWYgKHNvbnlwaV9kZXZpY2UuZGV2KSB7CiAJCXBjaV9kaXNhYmxlX2RldmljZShzb255cGlfZGV2aWNlLmRldik7CisJCXBjaV9kZXZfcHV0KHNvbnlwaV9kZXZpY2UuZGV2KTsKKwl9CisKIAlrZmlmb19mcmVlKHNvbnlwaV9kZXZpY2UuZmlmbyk7Ci0JcGNpX2Rldl9wdXQoc29ueXBpX2RldmljZS5kZXYpOwotCXByaW50ayhLRVJOX0lORk8gInNvbnlwaTogcmVtb3ZlZC5cbiIpOworCisJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgb2xkX2NhbWVyYV9wb3dlcjsKKworc3RhdGljIGludCBzb255cGlfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlvbGRfY2FtZXJhX3Bvd2VyID0gc29ueXBpX2RldmljZS5jYW1lcmFfcG93ZXI7CisJc29ueXBpX2Rpc2FibGUoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvbnlwaV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXNvbnlwaV9lbmFibGUob2xkX2NhbWVyYV9wb3dlcik7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBzb255cGlfc3VzcGVuZAlOVUxMCisjZGVmaW5lIHNvbnlwaV9yZXN1bWUJTlVMTAorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNvbnlwaV9zaHV0ZG93bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc29ueXBpX2Rpc2FibGUoKTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc29ueXBpX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAic29ueXBpIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gc29ueXBpX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc29ueXBpX3JlbW92ZSksCisJLnNodXRkb3duCT0gc29ueXBpX3NodXRkb3duLAorCS5zdXNwZW5kCT0gc29ueXBpX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzb255cGlfcmVzdW1lLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNvbnlwaV9wbGF0Zm9ybV9kZXZpY2U7CisKIHN0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRkYXRhIHNvbnlwaV9kbWlfdGFibGVbXSA9IHsKIAl7CiAJCS5pZGVudCA9ICJTb255IFZhaW8iLApAQCAtMTQ1MSwyNiArMTUyNCw1MiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzb255cGlfaW5pdCh2b2lkKQogewotCWludCByZXQ7CisJaW50IGVycm9yOworCisJcHJpbnRrKEtFUk5fSU5GTworCQkic29ueXBpOiBTb255IFByb2dyYW1tYWJsZSBJL08gQ29udHJvbGxlciBEcml2ZXIgdiVzLlxuIiwKKwkJU09OWVBJX0RSSVZFUl9WRVJTSU9OKTsKIAogCWlmICghZG1pX2NoZWNrX3N5c3RlbShzb255cGlfZG1pX3RhYmxlKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNvbnlwaV9kcml2ZXIpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJZXJyb3IgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNvbnlwaV9kcml2ZXIpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOwogCi0JcmV0ID0gc29ueXBpX3Byb2JlKCk7Ci0JaWYgKHJldCkKLQkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNvbnlwaV9kcml2ZXIpOworCXNvbnlwaV9wbGF0Zm9ybV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInNvbnlwaSIsIC0xKTsKKwlpZiAoIXNvbnlwaV9wbGF0Zm9ybV9kZXZpY2UpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVycl9kcml2ZXJfdW5yZWdpc3RlcjsKKwl9CiAKLQlyZXR1cm4gcmV0OworCWVycm9yID0gcGxhdGZvcm1fZGV2aWNlX2FkZChzb255cGlfcGxhdGZvcm1fZGV2aWNlKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyX2ZyZWVfZGV2aWNlOworCisjaWZkZWYgQ09ORklHX0FDUEkKKwlpZiAoYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZzb255cGlfYWNwaV9kcml2ZXIpID4gMCkKKwkJYWNwaV9lbmFibGVkID0gMTsKKyNlbmRpZgorCisJcmV0dXJuIDA7CisKKyBlcnJfZnJlZV9kZXZpY2U6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChzb255cGlfcGxhdGZvcm1fZGV2aWNlKTsKKyBlcnJfZHJpdmVyX3VucmVnaXN0ZXI6CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNvbnlwaV9kcml2ZXIpOworCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHNvbnlwaV9leGl0KHZvaWQpCiB7CisjaWZkZWYgQ09ORklHX0FDUEkKKwlpZiAoYWNwaV9lbmFibGVkKQorCQlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmc29ueXBpX2FjcGlfZHJpdmVyKTsKKyNlbmRpZgorCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNvbnlwaV9wbGF0Zm9ybV9kZXZpY2UpOwogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzb255cGlfZHJpdmVyKTsKLQlzb255cGlfcmVtb3ZlKCk7CisJcHJpbnRrKEtFUk5fSU5GTyAic29ueXBpOiByZW1vdmVkLlxuIik7CiB9CiAKIG1vZHVsZV9pbml0KHNvbnlwaV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zcGVjaWFsaXguYyBiL2RyaXZlcnMvY2hhci9zcGVjaWFsaXguYwppbmRleCAwYmJmY2U0Li41MzQzZTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3BlY2lhbGl4LmMKKysrIGIvZHJpdmVycy9jaGFyL3NwZWNpYWxpeC5jCkBAIC04NSw2ICs4NSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KQEAgLTE4Myw3ICsxODQsNiBAQAogCiBzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnNwZWNpYWxpeF9kcml2ZXI7CiBzdGF0aWMgdW5zaWduZWQgY2hhciAqIHRtcF9idWY7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWCh0bXBfYnVmX3NlbSk7CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGJhdWRfdGFibGVbXSA9ICB7CiAJMCwgNTAsIDc1LCAxMTAsIDEzNCwgMTUwLCAyMDAsIDMwMCwgNjAwLCAxMjAwLCAxODAwLCAyNDAwLCA0ODAwLApAQCAtNjY1LDcgKzY2NSw3IEBACiAJc3RydWN0IHNwZWNpYWxpeF9wb3J0ICpwb3J0OwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJdW5zaWduZWQgY2hhciBzdGF0dXM7Ci0JdW5zaWduZWQgY2hhciBjaDsKKwl1bnNpZ25lZCBjaGFyIGNoLCBmbGFnOwogCiAJZnVuY19lbnRlcigpOwogCkBAIC02NzYsOCArNjc2LDYgQEAKIAkJcmV0dXJuOwogCX0KIAl0dHkgPSBwb3J0LT50dHk7Ci0JZHByaW50ayAoU1hfREVCVUdfUlgsICJwb3J0OiAlcCBjb3VudDogJWQgQlVGRl9TSVpFOiAlZFxuIiwKLQkJIHBvcnQsICB0dHktPmZsaXAuY291bnQsIFRUWV9GTElQQlVGX1NJWkUpOwogCiAJc3RhdHVzID0gc3hfaW4oYnAsIENEMTg2eF9SQ1NSKTsKIApAQCAtNjkxLDcgKzY4OSw3IEBACiAKIAkvKiBUaGlzIGZsaXAgYnVmZmVyIGNoZWNrIG5lZWRzIHRvIGJlIGJlbG93IHRoZSByZWFkaW5nIG9mIHRoZQogCSAgIHN0YXR1cyByZWdpc3RlciB0byByZXNldCB0aGUgY2hpcCdzIElSUS4uLi4gKi8KLQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpIHsKKwlpZiAodHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCAxKSA9PSAwKSB7CiAJCWRwcmludGsoU1hfREVCVUdfRklGTywgInN4JWQ6IHBvcnQgJWQ6IFdvcmtpbmcgYXJvdW5kIGZsaXAgYnVmZmVyIG92ZXJmbG93LlxuIiwKIAkJICAgICAgIGJvYXJkX05vKGJwKSwgcG9ydF9Obyhwb3J0KSk7CiAJCWZ1bmNfZXhpdCgpOwpAQCAtNzEyLDI2ICs3MTAsMjQgQEAKIAl9IGVsc2UgaWYgKHN0YXR1cyAmIFJDU1JfQlJFQUspIHsKIAkJZHByaW50ayhTWF9ERUJVR19SWCwgInN4JWQ6IHBvcnQgJWQ6IEhhbmRsaW5nIGJyZWFrLi4uXG4iLAogCQkgICAgICAgYm9hcmRfTm8oYnApLCBwb3J0X05vKHBvcnQpKTsKLQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9CUkVBSzsKKwkJZmxhZyA9IFRUWV9CUkVBSzsKIAkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfU0FLKQogCQkJZG9fU0FLKHR0eSk7CiAKIAl9IGVsc2UgaWYgKHN0YXR1cyAmIFJDU1JfUEUpCi0JCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfUEFSSVRZOworCQlmbGFnID0gVFRZX1BBUklUWTsKIAogCWVsc2UgaWYgKHN0YXR1cyAmIFJDU1JfRkUpCi0JCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfRlJBTUU7CisJCWZsYWcgPSBUVFlfRlJBTUU7CiAKIAllbHNlIGlmIChzdGF0dXMgJiBSQ1NSX09FKQotCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX09WRVJSVU47CisJCWZsYWcgPSBUVFlfT1ZFUlJVTjsKIAogCWVsc2UKLQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IDA7CisJCWZsYWcgPSBUVFlfTk9STUFMOwogCi0JKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IGNoOwotCXR0eS0+ZmxpcC5jb3VudCsrOwotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmssIDEpOwotCisJaWYodHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgZmxhZykpCisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiAJZnVuY19leGl0KCk7CiB9CiAKQEAgLTc1NSwxOCArNzUxLDExIEBACiAJZHByaW50ayAoU1hfREVCVUdfUlgsICJwb3J0OiAlcDogY291bnQ6ICVkXG4iLCBwb3J0LCBjb3VudCk7CiAJcG9ydC0+aGl0c1tjb3VudCA+IDggPyA5IDogY291bnRdKys7CiAKLQl3aGlsZSAoY291bnQtLSkgewotCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gInN4JWQ6IHBvcnQgJWQ6IFdvcmtpbmcgYXJvdW5kIGZsaXAgYnVmZmVyIG92ZXJmbG93LlxuIiwKLQkJCSAgICAgICBib2FyZF9ObyhicCksIHBvcnRfTm8ocG9ydCkpOwotCQkJYnJlYWs7Ci0JCX0KLQkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IHN4X2luKGJwLCBDRDE4NnhfUkRSKTsKLQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IDA7Ci0JCXR0eS0+ZmxpcC5jb3VudCsrOwotCX0KLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+ZmxpcC53b3JrLCAxKTsKKwl0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIGNvdW50KTsKIAorCXdoaWxlIChjb3VudC0tKQorCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIHN4X2luKGJwLCBDRDE4NnhfUkRSKSwgVFRZX05PUk1BTCk7CisJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKIAlmdW5jX2V4aXQoKTsKIH0KIApAQCAtMjU2Niw4ICsyNTU1LDYgQEAKIAogCWZ1bmNfZW50ZXIoKTsKIAotCWluaXRfTVVURVgoJnRtcF9idWZfc2VtKTsgLyogSW5pdCBkZSB0aGUgc2VtYXBob3JlIC0gcHZkbCAqLwotCiAJaWYgKGlvYmFzZVswXSB8fCBpb2Jhc2VbMV0gfHwgaW9iYXNlWzJdIHx8IGlvYmFzZVszXSkgewogCQlmb3IoaSA9IDA7IGkgPCBTWF9OQk9BUkQ7IGkrKykgewogCQkJc3hfYm9hcmRbaV0uYmFzZSA9IGlvYmFzZVtpXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zdGFsbGlvbi5jIGIvZHJpdmVycy9jaGFyL3N0YWxsaW9uLmMKaW5kZXggOTVhZjJhOS4uYmRhYWI2OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zdGFsbGlvbi5jCisrKyBiL2RyaXZlcnMvY2hhci9zdGFsbGlvbi5jCkBAIC0xMDMsNyArMTAzLDcgQEAKIAkvKnsgQlJEX0VBU1lJTywgMHgyYTAsIDAsIDAsIDEwLCAwIH0sKi8KIH07CiAKLXN0YXRpYyBpbnQJc3RsX25yYnJkcyA9IHNpemVvZihzdGxfYnJkY29uZikgLyBzaXplb2Yoc3RsY29uZl90KTsKK3N0YXRpYyBpbnQJc3RsX25yYnJkcyA9IEFSUkFZX1NJWkUoc3RsX2JyZGNvbmYpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTQyNCw3ICs0MjQsNyBAQAogCXsgUENJX1ZFTkRPUl9JRF9OUywgUENJX0RFVklDRV9JRF9OU184NzQxMCwgQlJEX0VDSFBDSSB9LAogfTsKIAotc3RhdGljIGludAlzdGxfbnJwY2licmRzID0gc2l6ZW9mKHN0bF9wY2licmRzKSAvIHNpemVvZihzdGxwY2licmRfdCk7CitzdGF0aWMgaW50CXN0bF9ucnBjaWJyZHMgPSBBUlJBWV9TSVpFKHN0bF9wY2licmRzKTsKIAogI2VuZGlmCiAKQEAgLTcwNCw3ICs3MDQsNyBAQAogCTIzMDQwMCwgNDYwODAwLCA5MjE2MDAKIH07CiAKLSNkZWZpbmUJU0MyNjE5OF9OUkJBVURTCQkoc2l6ZW9mKHNjMjYxOThfYmF1ZHRhYmxlKSAvIHNpemVvZih1bnNpZ25lZCBpbnQpKQorI2RlZmluZQlTQzI2MTk4X05SQkFVRFMJCUFSUkFZX1NJWkUoc2MyNjE5OF9iYXVkdGFibGUpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNzM4LDcgKzczOCw3IEBACiAJc3RsX2luaXQoKTsKIAlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKIAotCXJldHVybigwKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtODg5LDcgKzg4OSw3IEBACiAJCX0KIAkJdmFsID0gKHZhbCAqIGJhc2UpICsgYzsKIAl9Ci0JcmV0dXJuKHZhbCk7CisJcmV0dXJuIHZhbDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTAxLDI2ICs5MDEsMjUgQEAKIHN0YXRpYyBpbnQgc3RsX3BhcnNlYnJkKHN0bGNvbmZfdCAqY29uZnAsIGNoYXIgKiphcmdwKQogewogCWNoYXIJKnNwOwotCWludAlucmJyZG5hbWVzLCBpOworCWludAlpOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoInN0bF9wYXJzZWJyZChjb25mcD0leCxhcmdwPSV4KVxuIiwgKGludCkgY29uZnAsIChpbnQpIGFyZ3ApOwogI2VuZGlmCiAKIAlpZiAoKGFyZ3BbMF0gPT0gKGNoYXIgKikgTlVMTCkgfHwgKCphcmdwWzBdID09IDApKQotCQlyZXR1cm4oMCk7CisJCXJldHVybiAwOwogCiAJZm9yIChzcCA9IGFyZ3BbMF0sIGkgPSAwOyAoKCpzcCAhPSAwKSAmJiAoaSA8IDI1KSk7IHNwKyssIGkrKykKIAkJKnNwID0gVE9MT1dFUigqc3ApOwogCi0JbnJicmRuYW1lcyA9IHNpemVvZihzdGxfYnJkc3RyKSAvIHNpemVvZihzdGxicmR0eXBlX3QpOwotCWZvciAoaSA9IDA7IChpIDwgbnJicmRuYW1lcyk7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0bF9icmRzdHIpOyBpKyspIHsKIAkJaWYgKHN0cmNtcChzdGxfYnJkc3RyW2ldLm5hbWUsIGFyZ3BbMF0pID09IDApCiAJCQlicmVhazsKIAl9Ci0JaWYgKGkgPj0gbnJicmRuYW1lcykgeworCWlmIChpID09IEFSUkFZX1NJWkUoc3RsX2JyZHN0cikpIHsKIAkJcHJpbnRrKCJTVEFMTElPTjogdW5rbm93biBib2FyZCBuYW1lLCAlcz9cbiIsIGFyZ3BbMF0pOwotCQlyZXR1cm4oMCk7CisJCXJldHVybiAwOwogCX0KIAogCWNvbmZwLT5icmR0eXBlID0gc3RsX2JyZHN0cltpXS50eXBlOwpAQCAtOTM2LDcgKzkzNSw3IEBACiAJfQogCWlmICgoYXJncFtpXSAhPSAoY2hhciAqKSBOVUxMKSAmJiAoKmFyZ3BbaV0gIT0gMCkpCiAJCWNvbmZwLT5pcnEgPSBzdGxfYXRvbChhcmdwW2ldKTsKLQlyZXR1cm4oMSk7CisJcmV0dXJuIDE7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTk0Nyw3ICs5NDYsNyBAQAogCiBzdGF0aWMgdm9pZCAqc3RsX21lbWFsbG9jKGludCBsZW4pCiB7Ci0JcmV0dXJuKCh2b2lkICopIGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKSk7CisJcmV0dXJuICh2b2lkICopIGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTY0LDEyICs5NjMsMTIgQEAKIAlpZiAoYnJkcCA9PSAoc3RsYnJkX3QgKikgTlVMTCkgewogCQlwcmludGsoIlNUQUxMSU9OOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IChzaXplPSVkKVxuIiwKIAkJCXNpemVvZihzdGxicmRfdCkpOwotCQlyZXR1cm4oKHN0bGJyZF90ICopIE5VTEwpOworCQlyZXR1cm4gKHN0bGJyZF90ICopIE5VTEw7CiAJfQogCiAJbWVtc2V0KGJyZHAsIDAsIHNpemVvZihzdGxicmRfdCkpOwogCWJyZHAtPm1hZ2ljID0gU1RMX0JPQVJETUFHSUM7Ci0JcmV0dXJuKGJyZHApOworCXJldHVybiBicmRwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05ODksMTAgKzk4OCwxMCBAQAogCW1pbm9yZGV2ID0gdHR5LT5pbmRleDsKIAlicmRuciA9IE1JTk9SMkJSRChtaW5vcmRldik7CiAJaWYgKGJyZG5yID49IHN0bF9ucmJyZHMpCi0JCXJldHVybigtRU5PREVWKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJYnJkcCA9IHN0bF9icmRzW2JyZG5yXTsKIAlpZiAoYnJkcCA9PSAoc3RsYnJkX3QgKikgTlVMTCkKLQkJcmV0dXJuKC1FTk9ERVYpOworCQlyZXR1cm4gLUVOT0RFVjsKIAltaW5vcmRldiA9IE1JTk9SMlBPUlQobWlub3JkZXYpOwogCWZvciAocG9ydG5yID0gLTEsIHBhbmVsbnIgPSAwOyAocGFuZWxuciA8IFNUTF9NQVhQQU5FTFMpOyBwYW5lbG5yKyspIHsKIAkJaWYgKGJyZHAtPnBhbmVsc1twYW5lbG5yXSA9PSAoc3RscGFuZWxfdCAqKSBOVUxMKQpAQCAtMTAwNCwxMSArMTAwMywxMSBAQAogCQltaW5vcmRldiAtPSBicmRwLT5wYW5lbHNbcGFuZWxucl0tPm5ycG9ydHM7CiAJfQogCWlmIChwb3J0bnIgPCAwKQotCQlyZXR1cm4oLUVOT0RFVik7CisJCXJldHVybiAtRU5PREVWOwogCiAJcG9ydHAgPSBicmRwLT5wYW5lbHNbcGFuZWxucl0tPnBvcnRzW3BvcnRucl07CiAJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKLQkJcmV0dXJuKC1FTk9ERVYpOworCQlyZXR1cm4gLUVOT0RFVjsKIAogLyoKICAqCU9uIHRoZSBmaXJzdCBvcGVuIG9mIHRoZSBkZXZpY2Ugc2V0dXAgdGhlIHBvcnQgaGFyZHdhcmUsIGFuZApAQCAtMTAyMiw3ICsxMDIxLDcgQEAKIAkJaWYgKHBvcnRwLT50eC5idWYgPT0gKGNoYXIgKikgTlVMTCkgewogCQkJcG9ydHAtPnR4LmJ1ZiA9IChjaGFyICopIHN0bF9tZW1hbGxvYyhTVExfVFhCVUZTSVpFKTsKIAkJCWlmIChwb3J0cC0+dHguYnVmID09IChjaGFyICopIE5VTEwpCi0JCQkJcmV0dXJuKC1FTk9NRU0pOworCQkJCXJldHVybiAtRU5PTUVNOwogCQkJcG9ydHAtPnR4LmhlYWQgPSBwb3J0cC0+dHguYnVmOwogCQkJcG9ydHAtPnR4LnRhaWwgPSBwb3J0cC0+dHguYnVmOwogCQl9CkBAIC0xMDQ0LDggKzEwNDMsOCBAQAogCWlmIChwb3J0cC0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSB7CiAJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnBvcnRwLT5jbG9zZV93YWl0KTsKIAkJaWYgKHBvcnRwLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCi0JCQlyZXR1cm4oLUVBR0FJTik7Ci0JCXJldHVybigtRVJFU1RBUlRTWVMpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAJfQogCiAvKgpAQCAtMTA1NSwxMSArMTA1NCwxMSBAQAogICovCiAJaWYgKCEoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKSB7CiAJCWlmICgocmMgPSBzdGxfd2FpdGNhcnJpZXIocG9ydHAsIGZpbHApKSAhPSAwKQotCQkJcmV0dXJuKHJjKTsKKwkJCXJldHVybiByYzsKIAl9CiAJcG9ydHAtPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CiAKLQlyZXR1cm4oMCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTExMTYsNyArMTExNSw3IEBACiAJcG9ydHAtPm9wZW53YWl0Y250LS07CiAJcmVzdG9yZV9mbGFncyhmbGFncyk7CiAKLQlyZXR1cm4ocmMpOworCXJldHVybiByYzsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTIxMiwxMiArMTIxMSwxMiBAQAogCiAJaWYgKCh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpIHx8CiAJICAgIChzdGxfdG1wd3JpdGVidWYgPT0gKGNoYXIgKikgTlVMTCkpCi0JCXJldHVybigwKTsKKwkJcmV0dXJuIDA7CiAJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwogCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCi0JCXJldHVybigwKTsKKwkJcmV0dXJuIDA7CiAJaWYgKHBvcnRwLT50eC5idWYgPT0gKGNoYXIgKikgTlVMTCkKLQkJcmV0dXJuKDApOworCQlyZXR1cm4gMDsKIAogLyoKICAqCUlmIGNvcHlpbmcgZGlyZWN0IGZyb20gdXNlciBzcGFjZSB3ZSBtdXN0IGNhdGVyIGZvciBwYWdlIGZhdWx0cywKQEAgLTEyNTYsNyArMTI1NSw3IEBACiAJY2xlYXJfYml0KEFTWUlfVFhMT1csICZwb3J0cC0+aXN0YXRlKTsKIAlzdGxfc3RhcnRyeHR4KHBvcnRwLCAtMSwgMSk7CiAKLQlyZXR1cm4oY291bnQpOworCXJldHVybiBjb3VudDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTMzNywxNiArMTMzNiwxNiBAQAogI2VuZGlmCiAKIAlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQotCQlyZXR1cm4oMCk7CisJCXJldHVybiAwOwogCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQotCQlyZXR1cm4oMCk7CisJCXJldHVybiAwOwogCWlmIChwb3J0cC0+dHguYnVmID09IChjaGFyICopIE5VTEwpCi0JCXJldHVybigwKTsKKwkJcmV0dXJuIDA7CiAKIAloZWFkID0gcG9ydHAtPnR4LmhlYWQ7CiAJdGFpbCA9IHBvcnRwLT50eC50YWlsOwotCXJldHVybigoaGVhZCA+PSB0YWlsKSA/IChTVExfVFhCVUZTSVpFIC0gKGhlYWQgLSB0YWlsKSAtIDEpIDogKHRhaWwgLSBoZWFkIC0gMSkpOworCXJldHVybiAoKGhlYWQgPj0gdGFpbCkgPyAoU1RMX1RYQlVGU0laRSAtIChoZWFkIC0gdGFpbCkgLSAxKSA6ICh0YWlsIC0gaGVhZCAtIDEpKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTM3MSwxOSArMTM3MCwxOSBAQAogI2VuZGlmCiAKIAlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQotCQlyZXR1cm4oMCk7CisJCXJldHVybiAwOwogCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQotCQlyZXR1cm4oMCk7CisJCXJldHVybiAwOwogCWlmIChwb3J0cC0+dHguYnVmID09IChjaGFyICopIE5VTEwpCi0JCXJldHVybigwKTsKKwkJcmV0dXJuIDA7CiAKIAloZWFkID0gcG9ydHAtPnR4LmhlYWQ7CiAJdGFpbCA9IHBvcnRwLT50eC50YWlsOwogCXNpemUgPSAoaGVhZCA+PSB0YWlsKSA/IChoZWFkIC0gdGFpbCkgOiAoU1RMX1RYQlVGU0laRSAtICh0YWlsIC0gaGVhZCkpOwogCWlmICgoc2l6ZSA9PSAwKSAmJiB0ZXN0X2JpdChBU1lJX1RYQlVTWSwgJnBvcnRwLT5pc3RhdGUpKQogCQlzaXplID0gMTsKLQlyZXR1cm4oc2l6ZSk7CisJcmV0dXJuIHNpemU7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE0NDgsNyArMTQ0Nyw3IEBACiAJCSAgICAoc2lvLmNsb3NlX2RlbGF5ICE9IHBvcnRwLT5jbG9zZV9kZWxheSkgfHwKIAkJICAgICgoc2lvLmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSAhPQogCQkgICAgKHBvcnRwLT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykpKQotCQkJcmV0dXJuKC1FUEVSTSk7CisJCQlyZXR1cm4gLUVQRVJNOwogCX0gCiAKIAlwb3J0cC0+ZmxhZ3MgPSAocG9ydHAtPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSB8CkBAIC0xNDU4LDcgKzE0NTcsNyBAQAogCXBvcnRwLT5jbG9zaW5nX3dhaXQgPSBzaW8uY2xvc2luZ193YWl0OwogCXBvcnRwLT5jdXN0b21fZGl2aXNvciA9IHNpby5jdXN0b21fZGl2aXNvcjsKIAlzdGxfc2V0cG9ydChwb3J0cCwgcG9ydHAtPnR0eS0+dGVybWlvcyk7Ci0JcmV0dXJuKDApOworCXJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNDY4LDEyICsxNDY3LDEyIEBACiAJc3RscG9ydF90CSpwb3J0cDsKIAogCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCi0JCXJldHVybigtRU5PREVWKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwogCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCi0JCXJldHVybigtRU5PREVWKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQotCQlyZXR1cm4oLUVJTyk7CisJCXJldHVybiAtRUlPOwogCiAJcmV0dXJuIHN0bF9nZXRzaWduYWxzKHBvcnRwKTsKIH0KQEAgLTE0ODUsMTIgKzE0ODQsMTIgQEAKIAlpbnQgcnRzID0gLTEsIGR0ciA9IC0xOwogCiAJaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKLQkJcmV0dXJuKC1FTk9ERVYpOworCQlyZXR1cm4gLUVOT0RFVjsKIAlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKLQkJcmV0dXJuKC1FTk9ERVYpOworCQlyZXR1cm4gLUVOT0RFVjsKIAlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCi0JCXJldHVybigtRUlPKTsKKwkJcmV0dXJuIC1FSU87CiAKIAlpZiAoc2V0ICYgVElPQ01fUlRTKQogCQlydHMgPSAxOwpAQCAtMTUxOCwxNSArMTUxNywxNSBAQAogI2VuZGlmCiAKIAlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQotCQlyZXR1cm4oLUVOT0RFVik7CisJCXJldHVybiAtRU5PREVWOwogCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQotCQlyZXR1cm4oLUVOT0RFVik7CisJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKChjbWQgIT0gVElPQ0dTRVJJQUwpICYmIChjbWQgIT0gVElPQ1NTRVJJQUwpICYmCiAgCSAgICAoY21kICE9IENPTV9HRVRQT1JUU1RBVFMpICYmIChjbWQgIT0gQ09NX0NMUlBPUlRTVEFUUykpIHsKIAkJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQotCQkJcmV0dXJuKC1FSU8pOworCQkJcmV0dXJuIC1FSU87CiAJfQogCiAJcmMgPSAwOwpAQCAtMTU2Nyw3ICsxNTY2LDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JcmV0dXJuKHJjKTsKKwlyZXR1cm4gcmM7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE4NzMsNyArMTg3Miw3IEBACiAJCXBvc1soTUFYTElORSAtIDIpXSA9ICcrJzsKIAlwb3NbKE1BWExJTkUgLSAxKV0gPSAnXG4nOwogCi0JcmV0dXJuKE1BWExJTkUpOworCXJldHVybiBNQVhMSU5FOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xOTU4LDcgKzE5NTcsNyBAQAogCiBzdGxfcmVhZGRvbmU6CiAJKnN0YXJ0ID0gcGFnZTsKLQlyZXR1cm4ocG9zIC0gcGFnZSk7CisJcmV0dXJuIChwb3MgLSBwYWdlKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjM1MCw3ICsyMzQ5LDcgQEAKIAl9IGVsc2UgewogCQlyYyA9IDA7CiAJfQotCXJldHVybihyYyk7CisJcmV0dXJuIHJjOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yOTAyLDcgKzI5MDEsOCBAQAogCWlmIChwb3J0cC0+dHR5ICE9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKSB7CiAJCWlmIChwb3J0cC0+dHR5LT5kcml2ZXJfZGF0YSA9PSBwb3J0cCkgewogCQkJcG9ydHAtPnN0YXRzLnR0eXN0YXRlID0gcG9ydHAtPnR0eS0+ZmxhZ3M7Ci0JCQlwb3J0cC0+c3RhdHMucnhidWZmZXJlZCA9IHBvcnRwLT50dHktPmZsaXAuY291bnQ7CisJCQkvKiBObyBsb25nZXIgYXZhaWxhYmxlIGFzIGEgc3RhdGlzdGljICovCisJCQlwb3J0cC0+c3RhdHMucnhidWZmZXJlZCA9IDE7IC8qcG9ydHAtPnR0eS0+ZmxpcC5jb3VudDsgKi8KIAkJCWlmIChwb3J0cC0+dHR5LT50ZXJtaW9zICE9IChzdHJ1Y3QgdGVybWlvcyAqKSBOVUxMKSB7CiAJCQkJcG9ydHAtPnN0YXRzLmNmbGFncyA9IHBvcnRwLT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CiAJCQkJcG9ydHAtPnN0YXRzLmlmbGFncyA9IHBvcnRwLT50dHktPnRlcm1pb3MtPmNfaWZsYWc7CkBAIC0zMTE2LDcgKzMxMTYsNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JcmV0dXJuKDApOworCXJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMTMyLDcgKzMxMzIsNyBAQAogc3RhdGljIGludCBzdGxfY2QxNDAwZ2V0cmVnKHN0bHBvcnRfdCAqcG9ydHAsIGludCByZWducikKIHsKIAlvdXRiKChyZWduciArIHBvcnRwLT51YXJ0YWRkciksIHBvcnRwLT5pb2FkZHIpOwotCXJldHVybihpbmIocG9ydHAtPmlvYWRkciArIEVSRUdfREFUQSkpOworCXJldHVybiBpbmIocG9ydHAtPmlvYWRkciArIEVSRUdfREFUQSk7CiB9CiAKIHN0YXRpYyB2b2lkIHN0bF9jZDE0MDBzZXRyZWcoc3RscG9ydF90ICpwb3J0cCwgaW50IHJlZ25yLCBpbnQgdmFsdWUpCkBAIC0zMTQ2LDkgKzMxNDYsOSBAQAogCW91dGIoKHJlZ25yICsgcG9ydHAtPnVhcnRhZGRyKSwgcG9ydHAtPmlvYWRkcik7CiAJaWYgKGluYihwb3J0cC0+aW9hZGRyICsgRVJFR19EQVRBKSAhPSB2YWx1ZSkgewogCQlvdXRiKHZhbHVlLCBwb3J0cC0+aW9hZGRyICsgRVJFR19EQVRBKTsKLQkJcmV0dXJuKDEpOworCQlyZXR1cm4gMTsKIAl9Ci0JcmV0dXJuKDApOworCXJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMjA2LDcgKzMyMDYsNyBAQAogCX0KIAogCUJSRERJU0FCTEUocGFuZWxwLT5icmRucik7Ci0JcmV0dXJuKGNoaXBtYXNrKTsKKwlyZXR1cm4gY2hpcG1hc2s7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM1NTcsNyArMzU1Nyw3IEBACiAjZWxzZQogCXNpZ3MgfD0gVElPQ01fRFNSOwogI2VuZGlmCi0JcmV0dXJuKHNpZ3MpOworCXJldHVybiBzaWdzOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zODMwLDkgKzM4MzAsOSBAQAogI2VuZGlmCiAKIAlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQotCQlyZXR1cm4oMCk7CisJCXJldHVybiAwOwogCi0JcmV0dXJuKHRlc3RfYml0KEFTWUlfVFhCVVNZLCAmcG9ydHAtPmlzdGF0ZSkgPyAxIDogMCk7CisJcmV0dXJuIHRlc3RfYml0KEFTWUlfVFhCVVNZLCAmcG9ydHAtPmlzdGF0ZSkgPyAxIDogMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzkxMiwyMCArMzkxMiwyMCBAQAogCQlvdXRiKChTUkVSICsgcG9ydHAtPnVhcnRhZGRyKSwgaW9hZGRyKTsKIAkJb3V0YigoaW5iKGlvYWRkciArIEVSRUdfREFUQSkgJiB+KFNSRVJfVFhEQVRBIHwgU1JFUl9UWEVNUFRZKSksCiAJCQkoaW9hZGRyICsgRVJFR19EQVRBKSk7Ci0JCXJldHVybigxKTsKKwkJcmV0dXJuIDE7CiAJfSBlbHNlIGlmIChwb3J0cC0+YnJrbGVuID4gMSkgewogCQlvdXRiKChURFIgKyBwb3J0cC0+dWFydGFkZHIpLCBpb2FkZHIpOwogCQlvdXRiKEVUQ19DTUQsIChpb2FkZHIgKyBFUkVHX0RBVEEpKTsKIAkJb3V0YihFVENfU1RPUEJSRUFLLCAoaW9hZGRyICsgRVJFR19EQVRBKSk7CiAJCXBvcnRwLT5icmtsZW4gPSAtMTsKLQkJcmV0dXJuKDEpOworCQlyZXR1cm4gMTsKIAl9IGVsc2UgewogCQlvdXRiKChDT1IyICsgcG9ydHAtPnVhcnRhZGRyKSwgaW9hZGRyKTsKIAkJb3V0YigoaW5iKGlvYWRkciArIEVSRUdfREFUQSkgJiB+Q09SMl9FVEMpLAogCQkJKGlvYWRkciArIEVSRUdfREFUQSkpOwogCQlwb3J0cC0+YnJrbGVuID0gMDsKIAl9Ci0JcmV0dXJuKDApOworCXJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MDQ2LDkgKzQwNDYsNyBAQAogCWlmICgoaW9hY2sgJiBBQ0tfVFlQTUFTSykgPT0gQUNLX1RZUFJYR09PRCkgewogCQlvdXRiKChSRENSICsgcG9ydHAtPnVhcnRhZGRyKSwgaW9hZGRyKTsKIAkJbGVuID0gaW5iKGlvYWRkciArIEVSRUdfREFUQSk7Ci0JCWlmICgodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKSB8fAotCQkgICAgKHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgPT0gKGNoYXIgKikgTlVMTCkgfHwKLQkJICAgICgoYnVmbGVuID0gVFRZX0ZMSVBCVUZfU0laRSAtIHR0eS0+ZmxpcC5jb3VudCkgPT0gMCkpIHsKKwkJaWYgKHR0eSA9PSBOVUxMIHx8IChidWZsZW4gPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIGxlbikpID09IDApIHsKIAkJCWxlbiA9IE1JTihsZW4sIHNpemVvZihzdGxfdW53YW50ZWQpKTsKIAkJCW91dGIoKFJEU1IgKyBwb3J0cC0+dWFydGFkZHIpLCBpb2FkZHIpOwogCQkJaW5zYigoaW9hZGRyICsgRVJFR19EQVRBKSwgJnN0bF91bndhbnRlZFswXSwgbGVuKTsKQEAgLTQwNTcsMTIgKzQwNTUsMTAgQEAKIAkJfSBlbHNlIHsKIAkJCWxlbiA9IE1JTihsZW4sIGJ1Zmxlbik7CiAJCQlpZiAobGVuID4gMCkgeworCQkJCXVuc2lnbmVkIGNoYXIgKnB0cjsKIAkJCQlvdXRiKChSRFNSICsgcG9ydHAtPnVhcnRhZGRyKSwgaW9hZGRyKTsKLQkJCQlpbnNiKChpb2FkZHIgKyBFUkVHX0RBVEEpLCB0dHktPmZsaXAuY2hhcl9idWZfcHRyLCBsZW4pOwotCQkJCW1lbXNldCh0dHktPmZsaXAuZmxhZ19idWZfcHRyLCAwLCBsZW4pOwotCQkJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgKz0gbGVuOwotCQkJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgKz0gbGVuOwotCQkJCXR0eS0+ZmxpcC5jb3VudCArPSBsZW47CisJCQkJdHR5X3ByZXBhcmVfZmxpcF9zdHJpbmcodHR5LCAmcHRyLCBsZW4pOworCQkJCWluc2IoKGlvYWRkciArIEVSRUdfREFUQSksIHB0ciwgbGVuKTsKIAkJCQl0dHlfc2NoZWR1bGVfZmxpcCh0dHkpOwogCQkJCXBvcnRwLT5zdGF0cy5yeHRvdGFsICs9IGxlbjsKIAkJCX0KQEAgLTQwODYsOCArNDA4Miw3IEBACiAJCQkJcG9ydHAtPnN0YXRzLnR4eG9mZisrOwogCQkJZ290byBzdGxfcnhhbGxkb25lOwogCQl9Ci0JCWlmICgodHR5ICE9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKSAmJgotCQkgICAgKChwb3J0cC0+cnhpZ25vcmVtc2sgJiBzdGF0dXMpID09IDApKSB7CisJCWlmICh0dHkgIT0gTlVMTCAmJiAocG9ydHAtPnJ4aWdub3JlbXNrICYgc3RhdHVzKSA9PSAwKSB7CiAJCQlpZiAocG9ydHAtPnJ4bWFya21zayAmIHN0YXR1cykgewogCQkJCWlmIChzdGF0dXMgJiBTVF9CUkVBSykgewogCQkJCQlzdGF0dXMgPSBUVFlfQlJFQUs7CkBAIC00MTA3LDE0ICs0MTAyLDggQEAKIAkJCX0gZWxzZSB7CiAJCQkJc3RhdHVzID0gMDsKIAkJCX0KLQkJCWlmICh0dHktPmZsaXAuY2hhcl9idWZfcHRyICE9IChjaGFyICopIE5VTEwpIHsKLQkJCQlpZiAodHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSkgewotCQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gc3RhdHVzOwotCQkJCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gY2g7Ci0JCQkJCXR0eS0+ZmxpcC5jb3VudCsrOwotCQkJCX0KLQkJCQl0dHlfc2NoZWR1bGVfZmxpcCh0dHkpOwotCQkJfQorCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgc3RhdHVzKTsKKwkJCXR0eV9zY2hlZHVsZV9mbGlwKHR0eSk7CiAJCX0KIAl9IGVsc2UgewogCQlwcmludGsoIlNUQUxMSU9OOiBiYWQgUlggaW50ZXJydXB0IGFjayB2YWx1ZT0leFxuIiwgaW9hY2spOwpAQCAtNDE3Nyw3ICs0MTY2LDcgQEAKIHN0YXRpYyBpbnQgc3RsX3NjMjYxOThnZXRyZWcoc3RscG9ydF90ICpwb3J0cCwgaW50IHJlZ25yKQogewogCW91dGIoKHJlZ25yIHwgcG9ydHAtPnVhcnRhZGRyKSwgKHBvcnRwLT5pb2FkZHIgKyBYUF9BRERSKSk7Ci0JcmV0dXJuKGluYihwb3J0cC0+aW9hZGRyICsgWFBfREFUQSkpOworCXJldHVybiBpbmIocG9ydHAtPmlvYWRkciArIFhQX0RBVEEpOwogfQogCiBzdGF0aWMgdm9pZCBzdGxfc2MyNjE5OHNldHJlZyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcmVnbnIsIGludCB2YWx1ZSkKQEAgLTQxOTEsOSArNDE4MCw5IEBACiAJb3V0YigocmVnbnIgfCBwb3J0cC0+dWFydGFkZHIpLCAocG9ydHAtPmlvYWRkciArIFhQX0FERFIpKTsKIAlpZiAoaW5iKHBvcnRwLT5pb2FkZHIgKyBYUF9EQVRBKSAhPSB2YWx1ZSkgewogCQlvdXRiKHZhbHVlLCAocG9ydHAtPmlvYWRkciArIFhQX0RBVEEpKTsKLQkJcmV0dXJuKDEpOworCQlyZXR1cm4gMTsKIAl9Ci0JcmV0dXJuKDApOworCXJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MjA1LDcgKzQxOTQsNyBAQAogc3RhdGljIGludCBzdGxfc2MyNjE5OGdldGdsb2JyZWcoc3RscG9ydF90ICpwb3J0cCwgaW50IHJlZ25yKQogewogCW91dGIocmVnbnIsIChwb3J0cC0+aW9hZGRyICsgWFBfQUREUikpOwotCXJldHVybihpbmIocG9ydHAtPmlvYWRkciArIFhQX0RBVEEpKTsKKwlyZXR1cm4gaW5iKHBvcnRwLT5pb2FkZHIgKyBYUF9EQVRBKTsKIH0KIAogI2lmIDAKQEAgLTQyNjMsNyArNDI1Miw3IEBACiAJfQogCiAJQlJERElTQUJMRShwYW5lbHAtPmJyZG5yKTsKLQlyZXR1cm4oY2hpcG1hc2spOworCXJldHVybiBjaGlwbWFzazsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDU1Nyw3ICs0NTQ2LDcgQEAKIAlzaWdzIHw9IChpcHIgJiBJUFJfRFRSKSA/IDA6IFRJT0NNX0RUUjsKIAlzaWdzIHw9IChpcHIgJiBJUFJfUlRTKSA/IDA6IFRJT0NNX1JUUzsKIAlzaWdzIHw9IFRJT0NNX0RTUjsKLQlyZXR1cm4oc2lncyk7CisJcmV0dXJuIHNpZ3M7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQ4MzksOSArNDgyOCw5IEBACiAjZW5kaWYKIAogCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCi0JCXJldHVybigwKTsKKwkJcmV0dXJuIDA7CiAJaWYgKHRlc3RfYml0KEFTWUlfVFhCVVNZLCAmcG9ydHAtPmlzdGF0ZSkpCi0JCXJldHVybigxKTsKKwkJcmV0dXJuIDE7CiAKIAlzYXZlX2ZsYWdzKGZsYWdzKTsKIAljbGkoKTsKQEAgLTQ4NTAsNyArNDgzOSw3IEBACiAJQlJERElTQUJMRShwb3J0cC0+YnJkbnIpOwogCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwogCi0JcmV0dXJuKChzciAmIFNSX1RYRU1QVFkpID8gMCA6IDEpOworCXJldHVybiAoc3IgJiBTUl9UWEVNUFRZKSA/IDAgOiAxOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC01MDEzLDkgKzUwMDIsNyBAQAogCWxlbiA9IGluYihpb2FkZHIgKyBYUF9EQVRBKSArIDE7CiAKIAlpZiAoKGlhY2sgJiBJVlJfVFlQRU1BU0spID09IElWUl9SWERBVEEpIHsKLQkJaWYgKCh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpIHx8Ci0JCSAgICAodHR5LT5mbGlwLmNoYXJfYnVmX3B0ciA9PSAoY2hhciAqKSBOVUxMKSB8fAotCQkgICAgKChidWZsZW4gPSBUVFlfRkxJUEJVRl9TSVpFIC0gdHR5LT5mbGlwLmNvdW50KSA9PSAwKSkgeworCQlpZiAodHR5ID09IE5VTEwgfHwgKGJ1ZmxlbiA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgbGVuKSkgPT0gMCkgewogCQkJbGVuID0gTUlOKGxlbiwgc2l6ZW9mKHN0bF91bndhbnRlZCkpOwogCQkJb3V0YihHUlhGSUZPLCAoaW9hZGRyICsgWFBfQUREUikpOwogCQkJaW5zYigoaW9hZGRyICsgWFBfREFUQSksICZzdGxfdW53YW50ZWRbMF0sIGxlbik7CkBAIC01MDI0LDEyICs1MDExLDEwIEBACiAJCX0gZWxzZSB7CiAJCQlsZW4gPSBNSU4obGVuLCBidWZsZW4pOwogCQkJaWYgKGxlbiA+IDApIHsKKwkJCQl1bnNpZ25lZCBjaGFyICpwdHI7CiAJCQkJb3V0YihHUlhGSUZPLCAoaW9hZGRyICsgWFBfQUREUikpOwotCQkJCWluc2IoKGlvYWRkciArIFhQX0RBVEEpLCB0dHktPmZsaXAuY2hhcl9idWZfcHRyLCBsZW4pOwotCQkJCW1lbXNldCh0dHktPmZsaXAuZmxhZ19idWZfcHRyLCAwLCBsZW4pOwotCQkJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgKz0gbGVuOwotCQkJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgKz0gbGVuOwotCQkJCXR0eS0+ZmxpcC5jb3VudCArPSBsZW47CisJCQkJdHR5X3ByZXBhcmVfZmxpcF9zdHJpbmcodHR5LCAmcHRyLCBsZW4pOworCQkJCWluc2IoKGlvYWRkciArIFhQX0RBVEEpLCBwdHIsIGxlbik7CiAJCQkJdHR5X3NjaGVkdWxlX2ZsaXAodHR5KTsKIAkJCQlwb3J0cC0+c3RhdHMucnh0b3RhbCArPSBsZW47CiAJCQl9CkBAIC01MDk3LDE0ICs1MDgyLDggQEAKIAkJCXN0YXR1cyA9IDA7CiAJCX0KIAotCQlpZiAodHR5LT5mbGlwLmNoYXJfYnVmX3B0ciAhPSAoY2hhciAqKSBOVUxMKSB7Ci0JCQlpZiAodHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSkgewotCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBzdGF0dXM7Ci0JCQkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IGNoOwotCQkJCXR0eS0+ZmxpcC5jb3VudCsrOwotCQkJfQotCQkJdHR5X3NjaGVkdWxlX2ZsaXAodHR5KTsKLQkJfQorCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBzdGF0dXMpOworCQl0dHlfc2NoZWR1bGVfZmxpcCh0dHkpOwogCiAJCWlmIChzdGF0dXMgPT0gMCkKIAkJCXBvcnRwLT5zdGF0cy5yeHRvdGFsKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3guYyBiL2RyaXZlcnMvY2hhci9zeC5jCmluZGV4IDNhZDc1OGEuLjY0YmY4OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeC5jCisrKyBiL2RyaXZlcnMvY2hhci9zeC5jCkBAIC0zNDUsOSArMzQ1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YzgwMDAsIDB4ZDgwMDAsIDB4ZTgwMDAsIDB4YTAwMDB9Owogc3RhdGljIGludCBzaTFfcHJvYmVfYWRkcnNbXT0geyAweGQwMDAwfTsKIAotI2RlZmluZSBOUl9TWF9BRERSUyAoc2l6ZW9mKHN4X3Byb2JlX2FkZHJzKS9zaXplb2YgKGludCkpCi0jZGVmaW5lIE5SX1NJX0FERFJTIChzaXplb2Yoc2lfcHJvYmVfYWRkcnMpL3NpemVvZiAoaW50KSkKLSNkZWZpbmUgTlJfU0kxX0FERFJTIChzaXplb2Yoc2kxX3Byb2JlX2FkZHJzKS9zaXplb2YgKGludCkpCisjZGVmaW5lIE5SX1NYX0FERFJTIEFSUkFZX1NJWkUoc3hfcHJvYmVfYWRkcnMpCisjZGVmaW5lIE5SX1NJX0FERFJTIEFSUkFZX1NJWkUoc2lfcHJvYmVfYWRkcnMpCisjZGVmaW5lIE5SX1NJMV9BRERSUyBBUlJBWV9TSVpFKHNpMV9wcm9iZV9hZGRycykKIAogCiAvKiBTZXQgdGhlIG1hc2sgdG8gYWxsLW9uZXMuIFRoaXMgYWxhcywgb25seSBzdXBwb3J0cyAzMiBpbnRlcnJ1cHRzLiAKQEAgLTEwODUsNiArMTA4NSw3IEBACiAJaW50IHJ4X29wOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IGNvcGllZD0wOworCXVuc2lnbmVkIGNoYXIgKnJwOwogCiAJZnVuY19lbnRlcjIgKCk7CiAJdHR5ID0gcG9ydC0+Z3MudHR5OwpAQCAtMTA5NSw4ICsxMDk2LDggQEAKIAkJc3hfZHByaW50ayAoU1hfREVCVUdfUkVDRUlWRSwgInJ4b3A9JWQsIGMgPSAlZC5cbiIsIHJ4X29wLCBjKTsgCiAKIAkJLyogRG9uJ3QgY29weSBtb3JlIGJ5dGVzIHRoYW4gdGhlcmUgaXMgcm9vbSBmb3IgaW4gdGhlIGJ1ZmZlciAqLwotCQlpZiAodHR5LT5mbGlwLmNvdW50ICsgYyA+IFRUWV9GTElQQlVGX1NJWkUpIAotCQkJYyA9IFRUWV9GTElQQlVGX1NJWkUgLSB0dHktPmZsaXAuY291bnQ7CisKKwkJYyA9IHR0eV9wcmVwYXJlX2ZsaXBfc3RyaW5nKHR0eSwgJnJwLCBjKTsKIAogCQlzeF9kcHJpbnRrIChTWF9ERUJVR19SRUNFSVZFLCAiYyA9ICVkLlxuIiwgYyk7IAogCkBAIC0xMTExLDE0ICsxMTEyLDggQEAKIAkJc3hfZHByaW50ayAoU1hfREVCVUdfUkVDRUlWRSAsICJDb3B5aW5nIG92ZXIgJWQgY2hhcnMuIEZpcnN0IGlzICVkIGF0ICVseFxuIiwgYywgCiAJCSAgICAgICAgICAgIHJlYWRfc3hfYnl0ZSAocG9ydC0+Ym9hcmQsIENIQU5fT0ZGU0VUKHBvcnQsaGlfcnhidWYpICsgcnhfb3ApLAogCQkgICAgICAgICAgICBDSEFOX09GRlNFVChwb3J0LCBoaV9yeGJ1ZikpOyAKLQkJbWVtY3B5X2Zyb21pbyAodHR5LT5mbGlwLmNoYXJfYnVmX3B0ciwgCisJCW1lbWNweV9mcm9taW8gKHJwLAogCQkgICAgICAgICAgICAgICBwb3J0LT5ib2FyZC0+YmFzZSArIENIQU5fT0ZGU0VUKHBvcnQsaGlfcnhidWYpICsgcnhfb3AsIGMpOwotCQltZW1zZXQodHR5LT5mbGlwLmZsYWdfYnVmX3B0ciwgVFRZX05PUk1BTCwgYyk7Ci0KLQkJLyogVXBkYXRlIHRoZSBrZXJuZWwgYnVmZmVyIGVuZCAqLwotCQl0dHktPmZsaXAuY291bnQgKz0gYzsKLQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciArPSBjOwotCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyICs9IGM7CiAKIAkJLyogVGhpcyBvbmUgbGFzdC4gKCBOb3QgZXNzZW50aWFsLikKIAkJICAgSXQgYWxsb3dzIHRoZSBjYXJkIHRvIHN0YXJ0IHB1dHRpbmcgbW9yZSBkYXRhIGludG8gdGhlIGJ1ZmZlciEgCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYyBiL2RyaXZlcnMvY2hhci9zeW5jbGluay5jCmluZGV4IDYyYWEwZTUuLmVkZTY4OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeW5jbGluay5jCisrKyBiL2RyaXZlcnMvY2hhci9zeW5jbGluay5jCkBAIC05NTEsNyArOTUxLDYgQEAKICAqIG1lbW9yeSBpZiBsYXJnZSBudW1iZXJzIG9mIHNlcmlhbCBwb3J0cyBhcmUgb3Blbi4KICAqLwogc3RhdGljIHVuc2lnbmVkIGNoYXIgKnRtcF9idWY7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWCh0bXBfYnVmX3NlbSk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IG1nc2xfcGFyYW5vaWFfY2hlY2soc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLAogCQkJCQljaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQpAQCAtMTQ2Nyw2ICsxNDY2LDcgQEAKIHsKIAlpbnQgRmlmb2NvdW50OwogCXUxNiBzdGF0dXM7CisJaW50IHdvcmsgPSAwOwogCXVuc2lnbmVkIGNoYXIgRGF0YUJ5dGU7CiAgCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7CiAgCXN0cnVjdAltZ3NsX2ljb3VudCAqaWNvdW50ID0gJmluZm8tPmljb3VudDsKQEAgLTE0ODcsNiArMTQ4Nyw4IEBACiAJLyogZmx1c2ggdGhlIHJlY2VpdmUgRklGTyAqLwogCiAJd2hpbGUoIChGaWZvY291bnQgPSAodXNjX0luUmVnKGluZm8sUklDUikgPj4gOCkpICkgeworCQlpbnQgZmxhZzsKKwogCQkvKiByZWFkIG9uZSBieXRlIGZyb20gUnhGSUZPICovCiAJCW91dHcoIChpbncoaW5mby0+aW9fYmFzZSArIENDQVIpICYgMHgwNzgwKSB8IChSRFIrTFNCT05MWSksCiAJCSAgICAgIGluZm8tPmlvX2Jhc2UgKyBDQ0FSICk7CkBAIC0xNDk4LDEzICsxNTAwLDkgQEAKIAkJCQlSWFNUQVRVU19PVkVSUlVOICsgUlhTVEFUVVNfQlJFQUtfUkVDRUlWRUQpICkKIAkJCXVzY19VbmxhdGNoUnhzdGF0dXNCaXRzKGluZm8sUlhTVEFUVVNfQUxMKTsKIAkJCi0JCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkKLQkJCWNvbnRpbnVlOwotCQkJCi0JCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyID0gRGF0YUJ5dGU7CiAJCWljb3VudC0+cngrKzsKIAkJCi0JCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gMDsKKwkJZmxhZyA9IDA7CiAJCWlmICggc3RhdHVzICYgKFJYU1RBVFVTX0ZSQU1JTkdfRVJST1IgKyBSWFNUQVRVU19QQVJJVFlfRVJST1IgKwogCQkJCVJYU1RBVFVTX09WRVJSVU4gKyBSWFNUQVRVU19CUkVBS19SRUNFSVZFRCkgKSB7CiAJCQlwcmludGsoInJ4ZXJyPSUwNFhcbiIsc3RhdHVzKTsJCQkJCQpAQCAtMTUzMCw0MSArMTUyOCwzMSBAQAogCQkJc3RhdHVzICY9IGluZm8tPnJlYWRfc3RhdHVzX21hc2s7CiAJCQogCQkJaWYgKHN0YXR1cyAmIFJYU1RBVFVTX0JSRUFLX1JFQ0VJVkVEKSB7Ci0JCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfQlJFQUs7CisJCQkJZmxhZyA9IFRUWV9CUkVBSzsKIAkJCQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TQUspCiAJCQkJCWRvX1NBSyh0dHkpOwogCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBSWFNUQVRVU19QQVJJVFlfRVJST1IpCi0JCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfUEFSSVRZOworCQkJCWZsYWcgPSBUVFlfUEFSSVRZOwogCQkJZWxzZSBpZiAoc3RhdHVzICYgUlhTVEFUVVNfRlJBTUlOR19FUlJPUikKLQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9GUkFNRTsKLQkJCWlmIChzdGF0dXMgJiBSWFNUQVRVU19PVkVSUlVOKSB7Ci0JCQkJLyogT3ZlcnJ1biBpcyBzcGVjaWFsLCBzaW5jZSBpdCdzCi0JCQkJICogcmVwb3J0ZWQgaW1tZWRpYXRlbHksIGFuZCBkb2Vzbid0Ci0JCQkJICogYWZmZWN0IHRoZSBjdXJyZW50IGNoYXJhY3RlcgotCQkJCSAqLwotCQkJCWlmICh0dHktPmZsaXAuY291bnQgPCBUVFlfRkxJUEJVRl9TSVpFKSB7Ci0JCQkJCXR0eS0+ZmxpcC5jb3VudCsrOwotCQkJCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyKys7Ci0JCQkJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKzsKLQkJCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfT1ZFUlJVTjsKLQkJCQl9Ci0JCQl9CisJCQkJZmxhZyA9IFRUWV9GUkFNRTsKIAkJfQkvKiBlbmQgb2YgaWYgKGVycm9yKSAqLwotCQkKLQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOwotCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyKys7Ci0JCXR0eS0+ZmxpcC5jb3VudCsrOworCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIERhdGFCeXRlLCBmbGFnKTsKKwkJaWYgKHN0YXR1cyAmIFJYU1RBVFVTX09WRVJSVU4pIHsKKwkJCS8qIE92ZXJydW4gaXMgc3BlY2lhbCwgc2luY2UgaXQncworCQkJICogcmVwb3J0ZWQgaW1tZWRpYXRlbHksIGFuZCBkb2Vzbid0CisJCQkgKiBhZmZlY3QgdGhlIGN1cnJlbnQgY2hhcmFjdGVyCisJCQkgKi8KKwkJCXdvcmsgKz0gdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTik7CisJCX0KIAl9CiAKIAlpZiAoIGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUiApIHsKLQkJcHJpbnRrKCIlcyglZCk6bWdzbF9pc3JfcmVjZWl2ZV9kYXRhIGZsaXAgY291bnQ9JWRcbiIsCi0JCQlfX0ZJTEVfXyxfX0xJTkVfXyx0dHktPmZsaXAuY291bnQpOwogCQlwcmludGsoIiVzKCVkKTpyeD0lZCBicms9JWQgcGFyaXR5PSVkIGZyYW1lPSVkIG92ZXJydW49JWRcbiIsCiAJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpY291bnQtPnJ4LGljb3VudC0+YnJrLAogCQkJaWNvdW50LT5wYXJpdHksaWNvdW50LT5mcmFtZSxpY291bnQtPm92ZXJydW4pOwogCX0KIAkJCQotCWlmICggdHR5LT5mbGlwLmNvdW50ICkKKwlpZih3b3JrKQogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogfQogCkBAIC03MDU4LDcgKzcwNDYsNyBAQAogewogCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBCaXRQYXR0ZXJuc1tdID0KIAkJeyAweDAwMDAsIDB4ZmZmZiwgMHhhYWFhLCAweDU1NTUsIDB4MTIzNCwgMHg2OTY5LCAweDk2OTYsIDB4MGYwZiB9OwotCXN0YXRpYyB1bnNpZ25lZCBpbnQgUGF0dGVybmNvdW50ID0gc2l6ZW9mKEJpdFBhdHRlcm5zKS9zaXplb2YodW5zaWduZWQgc2hvcnQpOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgUGF0dGVybmNvdW50ID0gQVJSQVlfU0laRShCaXRQYXR0ZXJucyk7CiAJdW5zaWduZWQgaW50IGk7CiAJQk9PTEVBTiByYyA9IFRSVUU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTc1MDEsOSArNzQ4OSw5IEBACiAgKi8KIHN0YXRpYyBCT09MRUFOIG1nc2xfbWVtb3J5X3Rlc3QoIHN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyApCiB7Ci0Jc3RhdGljIHVuc2lnbmVkIGxvbmcgQml0UGF0dGVybnNbXSA9IHsgMHgwLCAweDU1NTU1NTU1LCAweGFhYWFhYWFhLAotCQkJCQkJCQkJCQkweDY2NjY2NjY2LCAweDk5OTk5OTk5LCAweGZmZmZmZmZmLCAweDEyMzQ1Njc4IH07Ci0JdW5zaWduZWQgbG9uZyBQYXR0ZXJuY291bnQgPSBzaXplb2YoQml0UGF0dGVybnMpL3NpemVvZih1bnNpZ25lZCBsb25nKTsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBCaXRQYXR0ZXJuc1tdID0KKwkJeyAweDAsIDB4NTU1NTU1NTUsIDB4YWFhYWFhYWEsIDB4NjY2NjY2NjYsIDB4OTk5OTk5OTksIDB4ZmZmZmZmZmYsIDB4MTIzNDU2NzggfTsKKwl1bnNpZ25lZCBsb25nIFBhdHRlcm5jb3VudCA9IEFSUkFZX1NJWkUoQml0UGF0dGVybnMpOwogCXVuc2lnbmVkIGxvbmcgaTsKIAl1bnNpZ25lZCBsb25nIFRlc3RMaW1pdCA9IFNIQVJFRF9NRU1fQUREUkVTU19TSVpFL3NpemVvZih1bnNpZ25lZCBsb25nKTsKIAl1bnNpZ25lZCBsb25nICogVGVzdEFkZHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3luY2xpbmtfZ3QuYyBiL2RyaXZlcnMvY2hhci9zeW5jbGlua19ndC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NWE2MGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmtfZ3QuYwpAQCAtMCwwICsxLDQ0OTEgQEAKKy8qCisgKiAkSWQ6IHN5bmNsaW5rX2d0LmMsdiA0LjIyIDIwMDYvMDEvMDkgMjA6MTY6MDYgcGF1bGtmIEV4cCAkCisgKgorICogRGV2aWNlIGRyaXZlciBmb3IgTWljcm9nYXRlIFN5bmNMaW5rIEdUIHNlcmlhbCBhZGFwdGVycy4KKyAqCisgKiB3cml0dGVuIGJ5IFBhdWwgRnVsZ2h1bSBmb3IgTWljcm9nYXRlIENvcnBvcmF0aW9uCisgKiBwYXVsa2ZAbWljcm9nYXRlLmNvbQorICoKKyAqIE1pY3JvZ2F0ZSBhbmQgU3luY0xpbmsgYXJlIHRyYWRlbWFya3Mgb2YgTWljcm9nYXRlIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKQorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogREVCVUcgT1VUUFVUIERFRklOSVRJT05TCisgKgorICogdW5jb21tZW50IGxpbmVzIGJlbG93IHRvIGVuYWJsZSBzcGVjaWZpYyB0eXBlcyBvZiBkZWJ1ZyBvdXRwdXQKKyAqCisgKiBEQkdJTkZPICAgaW5mb3JtYXRpb24gLSBtb3N0IHZlcmJvc2Ugb3V0cHV0CisgKiBEQkdFUlIgICAgc2VyaW91cyBlcnJvcnMKKyAqIERCR0JIICAgICBib3R0b20gaGFsZiBzZXJ2aWNlIHJvdXRpbmUgZGVidWdnaW5nCisgKiBEQkdJU1IgICAgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBkZWJ1Z2dpbmcKKyAqIERCR0RBVEEgICBvdXRwdXQgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgZGF0YQorICogREJHVEJVRiAgIG91dHB1dCB0cmFuc21pdCBETUEgYnVmZmVycyBhbmQgcmVnaXN0ZXJzCisgKiBEQkdSQlVGICAgb3V0cHV0IHJlY2VpdmUgRE1BIGJ1ZmZlcnMgYW5kIHJlZ2lzdGVycworICovCisKKyNkZWZpbmUgREJHSU5GTyhmbXQpIGlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKSBwcmludGsgZm10CisjZGVmaW5lIERCR0VSUihmbXQpIGlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9FUlJPUikgcHJpbnRrIGZtdAorI2RlZmluZSBEQkdCSChmbXQpIGlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9CSCkgcHJpbnRrIGZtdAorI2RlZmluZSBEQkdJU1IoZm10KSBpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKSBwcmludGsgZm10CisjZGVmaW5lIERCR0RBVEEoaW5mbywgYnVmLCBzaXplLCBsYWJlbCkgaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0RBVEEpIHRyYWNlX2Jsb2NrKChpbmZvKSwgKGJ1ZiksIChzaXplKSwgKGxhYmVsKSkKKy8vI2RlZmluZSBEQkdUQlVGKGluZm8pIGR1bXBfdGJ1ZnMoaW5mbykKKy8vI2RlZmluZSBEQkdSQlVGKGluZm8pIGR1bXBfcmJ1ZnMoaW5mbykKKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAibGludXgvc3luY2xpbmsuaCIKKworI2lmZGVmIENPTkZJR19IRExDX01PRFVMRQorI2RlZmluZSBDT05GSUdfSERMQyAxCisjZW5kaWYKKworLyoKKyAqIG1vZHVsZSBpZGVudGlmaWNhdGlvbgorICovCitzdGF0aWMgY2hhciAqZHJpdmVyX25hbWUgICAgID0gIlN5bmNMaW5rIEdUIjsKK3N0YXRpYyBjaGFyICpkcml2ZXJfdmVyc2lvbiAgPSAiJFJldmlzaW9uOiA0LjIyICQiOworc3RhdGljIGNoYXIgKnR0eV9kcml2ZXJfbmFtZSA9ICJzeW5jbGlua19ndCI7CitzdGF0aWMgY2hhciAqdHR5X2Rldl9wcmVmaXggID0gInR0eVNMRyI7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisjZGVmaW5lIE1HU0xfTUFHSUMgMHg1NDAxCisjZGVmaW5lIE1BWF9ERVZJQ0VTIDEyCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lfdGFibGVbXSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9NSUNST0dBVEUsIFNZTkNMSU5LX0dUX0RFVklDRV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAorCXtQQ0lfVkVORE9SX0lEX01JQ1JPR0FURSwgU1lOQ0xJTktfR1Q0X0RFVklDRV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAorCXtQQ0lfVkVORE9SX0lEX01JQ1JPR0FURSwgU1lOQ0xJTktfQUNfREVWSUNFX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sCisJezAsfSwgLyogdGVybWluYXRlIGxpc3QgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGNpX3RhYmxlKTsKKworc3RhdGljIGludCAgaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldixjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyB2b2lkIHJlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKmRldik7CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAic3luY2xpbmtfZ3QiLAorCS5pZF90YWJsZQk9IHBjaV90YWJsZSwKKwkucHJvYmUJCT0gaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChyZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgcGNpX3JlZ2lzdGVyZWQ7CisKKy8qCisgKiBtb2R1bGUgY29uZmlndXJhdGlvbiBhbmQgc3RhdHVzCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2xndF9pbmZvICpzbGd0X2RldmljZV9saXN0Oworc3RhdGljIGludCBzbGd0X2RldmljZV9jb3VudDsKKworc3RhdGljIGludCB0dHltYWpvcjsKK3N0YXRpYyBpbnQgZGVidWdfbGV2ZWw7CitzdGF0aWMgaW50IG1heGZyYW1lW01BWF9ERVZJQ0VTXTsKK3N0YXRpYyBpbnQgZG9zeW5jcHBwW01BWF9ERVZJQ0VTXTsKKworbW9kdWxlX3BhcmFtKHR0eW1ham9yLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRlYnVnX2xldmVsLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG1heGZyYW1lLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGRvc3luY3BwcCwgaW50LCBOVUxMLCAwKTsKKworTU9EVUxFX1BBUk1fREVTQyh0dHltYWpvciwgIlRUWSBtYWpvciBkZXZpY2UgbnVtYmVyIG92ZXJyaWRlOiAwPWF1dG8gYXNzaWduZWQiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWdfbGV2ZWwsICJEZWJ1ZyBzeXNsb2cgb3V0cHV0OiAwPWRpc2FibGVkLCAxIHRvIDU9aW5jcmVhc2luZyBkZXRhaWwiKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4ZnJhbWUsICJNYXhpbXVtIGZyYW1lIHNpemUgdXNlZCBieSBkZXZpY2UgKDQwOTYgdG8gNjU1MzUpIik7CitNT0RVTEVfUEFSTV9ERVNDKGRvc3luY3BwcCwgIkVuYWJsZSBzeW5jaHJvbm91cyBuZXQgZGV2aWNlLCAwPWRpc2FibGUgMT1lbmFibGUiKTsKKworLyoKKyAqIHR0eSBzdXBwb3J0IGFuZCBjYWxsYmFja3MKKyAqLworI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykgKGlmbGFnICYgKElHTkJSS3xCUktJTlR8SUdOUEFSfFBBUk1SS3xJTlBDSykpCisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqc2VyaWFsX2RyaXZlcjsKKworc3RhdGljIGludCAgb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApOworc3RhdGljIHZvaWQgY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKTsKK3N0YXRpYyB2b2lkIGhhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIHNldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcyk7CisKK3N0YXRpYyBpbnQgIHdyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIHB1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpOworc3RhdGljIHZvaWQgc2VuZF94Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIGNoKTsKK3N0YXRpYyB2b2lkIHdhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCk7CitzdGF0aWMgaW50ICB3cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBmbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCB0eF9ob2xkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgdHhfcmVsZWFzZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKKworc3RhdGljIGludCAgaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgIHJlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LGludCAqZW9mLCB2b2lkICpkYXRhKTsKK3N0YXRpYyBpbnQgIGNoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIHRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KTsKK3N0YXRpYyB2b2lkIHVudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpOworc3RhdGljIHZvaWQgc2V0X2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBicmVha19zdGF0ZSk7CisKKy8qCisgKiBnZW5lcmljIEhETEMgc3VwcG9ydCBhbmQgY2FsbGJhY2tzCisgKi8KKyNpZmRlZiBDT05GSUdfSERMQworI2RlZmluZSBkZXZfdG9fcG9ydChEKSAoZGV2X3RvX2hkbGMoRCktPnByaXYpCitzdGF0aWMgdm9pZCBoZGxjZGV2X3R4X2RvbmUoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyk7CitzdGF0aWMgdm9pZCBoZGxjZGV2X3J4KHN0cnVjdCBzbGd0X2luZm8gKmluZm8sIGNoYXIgKmJ1ZiwgaW50IHNpemUpOworc3RhdGljIGludCAgaGRsY2Rldl9pbml0KHN0cnVjdCBzbGd0X2luZm8gKmluZm8pOworc3RhdGljIHZvaWQgaGRsY2Rldl9leGl0KHN0cnVjdCBzbGd0X2luZm8gKmluZm8pOworI2VuZGlmCisKKworLyoKKyAqIGRldmljZSBzcGVjaWZpYyBzdHJ1Y3R1cmVzLCBtYWNyb3MgYW5kIGZ1bmN0aW9ucworICovCisKKyNkZWZpbmUgU0xHVF9NQVhfUE9SVFMgNAorI2RlZmluZSBTTEdUX1JFR19TSVpFICAyNTYKKworLyoKKyAqIERNQSBidWZmZXIgZGVzY3JpcHRvciBhbmQgYWNjZXNzIG1hY3JvcworICovCitzdHJ1Y3Qgc2xndF9kZXNjCit7CisJdW5zaWduZWQgc2hvcnQgY291bnQ7CisJdW5zaWduZWQgc2hvcnQgc3RhdHVzOworCXVuc2lnbmVkIGludCBwYnVmOyAgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBkYXRhIGJ1ZmZlciAqLworCXVuc2lnbmVkIGludCBuZXh0OyAgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBuZXh0IGRlc2NyaXB0b3IgKi8KKworCS8qIGRyaXZlciBib29rIGtlZXBpbmcgKi8KKwljaGFyICpidWY7ICAgICAgICAgIC8qIHZpcnR1YWwgIGFkZHJlc3Mgb2YgZGF0YSBidWZmZXIgKi8KKyAgICAJdW5zaWduZWQgaW50IHBkZXNjOyAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgZGVzY3JpcHRvciAqLworCWRtYV9hZGRyX3QgYnVmX2RtYV9hZGRyOworfTsKKworI2RlZmluZSBzZXRfZGVzY19idWZmZXIoYSxiKSAoYSkucGJ1ZiA9IGNwdV90b19sZTMyKCh1bnNpZ25lZCBpbnQpKGIpKQorI2RlZmluZSBzZXRfZGVzY19uZXh0KGEsYikgKGEpLm5leHQgICA9IGNwdV90b19sZTMyKCh1bnNpZ25lZCBpbnQpKGIpKQorI2RlZmluZSBzZXRfZGVzY19jb3VudChhLGIpKGEpLmNvdW50ICA9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBzaG9ydCkoYikpCisjZGVmaW5lIHNldF9kZXNjX2VvZihhLGIpICAoYSkuc3RhdHVzID0gY3B1X3RvX2xlMTYoKGIpID8gKGxlMTZfdG9fY3B1KChhKS5zdGF0dXMpIHwgQklUMCkgOiAobGUxNl90b19jcHUoKGEpLnN0YXR1cykgJiB+QklUMCkpCisjZGVmaW5lIGRlc2NfY291bnQoYSkgICAgICAobGUxNl90b19jcHUoKGEpLmNvdW50KSkKKyNkZWZpbmUgZGVzY19zdGF0dXMoYSkgICAgIChsZTE2X3RvX2NwdSgoYSkuc3RhdHVzKSkKKyNkZWZpbmUgZGVzY19jb21wbGV0ZShhKSAgIChsZTE2X3RvX2NwdSgoYSkuc3RhdHVzKSAmIEJJVDE1KQorI2RlZmluZSBkZXNjX2VvZihhKSAgICAgICAgKGxlMTZfdG9fY3B1KChhKS5zdGF0dXMpICYgQklUMikKKyNkZWZpbmUgZGVzY19jcmNfZXJyb3IoYSkgIChsZTE2X3RvX2NwdSgoYSkuc3RhdHVzKSAmIEJJVDEpCisjZGVmaW5lIGRlc2NfYWJvcnQoYSkgICAgICAobGUxNl90b19jcHUoKGEpLnN0YXR1cykgJiBCSVQwKQorI2RlZmluZSBkZXNjX3Jlc2lkdWUoYSkgICAgKChsZTE2X3RvX2NwdSgoYSkuc3RhdHVzKSAmIDB4MzgpID4+IDMpCisKK3N0cnVjdCBfaW5wdXRfc2lnbmFsX2V2ZW50cyB7CisJaW50IHJpX3VwOworCWludCByaV9kb3duOworCWludCBkc3JfdXA7CisJaW50IGRzcl9kb3duOworCWludCBkY2RfdXA7CisJaW50IGRjZF9kb3duOworCWludCBjdHNfdXA7CisJaW50IGN0c19kb3duOworfTsKKworLyoKKyAqIGRldmljZSBpbnN0YW5jZSBkYXRhIHN0cnVjdHVyZQorICovCitzdHJ1Y3Qgc2xndF9pbmZvIHsKKwl2b2lkICppZl9wdHI7CQkvKiBHZW5lcmFsIHB1cnBvc2UgcG9pbnRlciAodXNlZCBieSBTUFBQKSAqLworCisJc3RydWN0IHNsZ3RfaW5mbyAqbmV4dF9kZXZpY2U7CS8qIGRldmljZSBsaXN0IGxpbmsgKi8KKworCWludCBtYWdpYzsKKwlpbnQgZmxhZ3M7CisKKwljaGFyIGRldmljZV9uYW1lWzI1XTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCWludCBwb3J0X2NvdW50OyAgLyogY291bnQgb2YgcG9ydHMgb24gYWRhcHRlciAqLworCWludCBhZGFwdGVyX251bTsgLyogYWRhcHRlciBpbnN0YW5jZSBudW1iZXIgKi8KKwlpbnQgcG9ydF9udW07ICAgIC8qIHBvcnQgaW5zdGFuY2UgbnVtYmVyICovCisKKwkvKiBhcnJheSBvZiBwb2ludGVycyB0byBwb3J0IGNvbnRleHRzIG9uIHRoaXMgYWRhcHRlciAqLworCXN0cnVjdCBzbGd0X2luZm8gKnBvcnRfYXJyYXlbU0xHVF9NQVhfUE9SVFNdOworCisJaW50CQkJY291bnQ7CQkvKiBjb3VudCBvZiBvcGVucyAqLworCWludAkJCWxpbmU7CQkvKiB0dHkgbGluZSBpbnN0YW5jZSBudW1iZXIgKi8KKwl1bnNpZ25lZCBzaG9ydAkJY2xvc2VfZGVsYXk7CisJdW5zaWduZWQgc2hvcnQJCWNsb3Npbmdfd2FpdDsJLyogdGltZSB0byB3YWl0IGJlZm9yZSBjbG9zaW5nICovCisKKwlzdHJ1Y3QgbWdzbF9pY291bnQJaWNvdW50OworCisJc3RydWN0IHR0eV9zdHJ1Y3QgCSp0dHk7CisJaW50CQkJdGltZW91dDsKKwlpbnQJCQl4X2NoYXI7CQkvKiB4b24veG9mZiBjaGFyYWN0ZXIgKi8KKwlpbnQJCQlibG9ja2VkX29wZW47CS8qICMgb2YgYmxvY2tlZCBvcGVucyAqLworCXVuc2lnbmVkIGludAkJcmVhZF9zdGF0dXNfbWFzazsKKwl1bnNpZ25lZCBpbnQgCQlpZ25vcmVfc3RhdHVzX21hc2s7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdAlvcGVuX3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QJY2xvc2Vfd2FpdDsKKworCXdhaXRfcXVldWVfaGVhZF90CXN0YXR1c19ldmVudF93YWl0X3E7CisJd2FpdF9xdWV1ZV9oZWFkX3QJZXZlbnRfd2FpdF9xOworCXN0cnVjdCB0aW1lcl9saXN0CXR4X3RpbWVyOworCXN0cnVjdCB0aW1lcl9saXN0CXJ4X3RpbWVyOworCisJc3BpbmxvY2tfdCBsb2NrOwkvKiBzcGlubG9jayBmb3Igc3luY2hyb25pemluZyB3aXRoIElTUiAqLworCisJc3RydWN0IHdvcmtfc3RydWN0IHRhc2s7CisJdTMyIHBlbmRpbmdfYmg7CisJaW50IGJoX3JlcXVlc3RlZDsKKwlpbnQgYmhfcnVubmluZzsKKworCWludCBpc3Jfb3ZlcmZsb3c7CisJaW50IGlycV9yZXF1ZXN0ZWQ7CS8qIG5vbnplcm8gaWYgSVJRIHJlcXVlc3RlZCAqLworCWludCBpcnFfb2NjdXJyZWQ7CS8qIGZvciBkaWFnbm9zdGljcyB1c2UgKi8KKworCS8qIGRldmljZSBjb25maWd1cmF0aW9uICovCisKKwl1bnNpZ25lZCBpbnQgYnVzX3R5cGU7CisJdW5zaWduZWQgaW50IGlycV9sZXZlbDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqIHJlZ19hZGRyOyAgLyogbWVtb3J5IG1hcHBlZCByZWdpc3RlcnMgYWRkcmVzcyAqLworCXUzMiBwaHlzX3JlZ19hZGRyOworCWludCByZWdfYWRkcl9yZXF1ZXN0ZWQ7CisKKwlNR1NMX1BBUkFNUyBwYXJhbXM7ICAgICAgIC8qIGNvbW11bmljYXRpb25zIHBhcmFtZXRlcnMgKi8KKwl1MzIgaWRsZV9tb2RlOworCXUzMiBtYXhfZnJhbWVfc2l6ZTsgICAgICAgLyogYXMgc2V0IGJ5IGRldmljZSBjb25maWcgKi8KKworCXVuc2lnbmVkIGludCByYXdfcnhfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgaWZfbW9kZTsKKworCS8qIGRldmljZSBzdGF0dXMgKi8KKworCWludCByeF9lbmFibGVkOworCWludCByeF9yZXN0YXJ0OworCisJaW50IHR4X2VuYWJsZWQ7CisJaW50IHR4X2FjdGl2ZTsKKworCXVuc2lnbmVkIGNoYXIgc2lnbmFsczsgICAgLyogc2VyaWFsIHNpZ25hbCBzdGF0ZXMgKi8KKwl1bnNpZ25lZCBpbnQgaW5pdF9lcnJvcjsgIC8qIGluaXRpYWxpemF0aW9uIGVycm9yICovCisKKwl1bnNpZ25lZCBjaGFyICp0eF9idWY7CisJaW50IHR4X2NvdW50OworCisJY2hhciBmbGFnX2J1ZltNQVhfQVNZTkNfQlVGRkVSX1NJWkVdOworCWNoYXIgY2hhcl9idWZbTUFYX0FTWU5DX0JVRkZFUl9TSVpFXTsKKwlCT09MRUFOIGRyb3BfcnRzX29uX3R4X2RvbmU7CisJc3RydWN0CV9pbnB1dF9zaWduYWxfZXZlbnRzCWlucHV0X3NpZ25hbF9ldmVudHM7CisKKwlpbnQgZGNkX2Noa2NvdW50OwkvKiBjaGVjayBjb3VudHMgdG8gcHJldmVudCAqLworCWludCBjdHNfY2hrY291bnQ7CS8qIHRvbyBtYW55IElSUXMgaWYgYSBzaWduYWwgKi8KKwlpbnQgZHNyX2Noa2NvdW50OwkvKiBpcyBmbG9hdGluZyAqLworCWludCByaV9jaGtjb3VudDsKKworCWNoYXIgKmJ1ZnM7CQkvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgRE1BIGJ1ZmZlciBsaXN0cyAqLworCWRtYV9hZGRyX3QgYnVmc19kbWFfYWRkcjsgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBidWZmZXIgZGVzY3JpcHRvcnMgKi8KKworCXVuc2lnbmVkIGludCByYnVmX2NvdW50OworCXN0cnVjdCBzbGd0X2Rlc2MgKnJidWZzOworCXVuc2lnbmVkIGludCByYnVmX2N1cnJlbnQ7CisJdW5zaWduZWQgaW50IHJidWZfaW5kZXg7CisKKwl1bnNpZ25lZCBpbnQgdGJ1Zl9jb3VudDsKKwlzdHJ1Y3Qgc2xndF9kZXNjICp0YnVmczsKKwl1bnNpZ25lZCBpbnQgdGJ1Zl9jdXJyZW50OworCXVuc2lnbmVkIGludCB0YnVmX3N0YXJ0OworCisJdW5zaWduZWQgY2hhciAqdG1wX3JidWY7CisJdW5zaWduZWQgaW50IHRtcF9yYnVmX2NvdW50OworCisJLyogU1BQUC9DaXNjbyBIRExDIGRldmljZSBwYXJ0cyAqLworCisJaW50IG5ldGNvdW50OworCWludCBkb3N5bmNwcHA7CisJc3BpbmxvY2tfdCBuZXRsb2NrOworI2lmZGVmIENPTkZJR19IRExDCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKyNlbmRpZgorCit9OworCitzdGF0aWMgTUdTTF9QQVJBTVMgZGVmYXVsdF9wYXJhbXMgPSB7CisJLm1vZGUgICAgICAgICAgICA9IE1HU0xfTU9ERV9IRExDLAorCS5sb29wYmFjayAgICAgICAgPSAwLAorCS5mbGFncyAgICAgICAgICAgPSBIRExDX0ZMQUdfVU5ERVJSVU5fQUJPUlQxNSwKKwkuZW5jb2RpbmcgICAgICAgID0gSERMQ19FTkNPRElOR19OUlpJX1NQQUNFLAorCS5jbG9ja19zcGVlZCAgICAgPSAwLAorCS5hZGRyX2ZpbHRlciAgICAgPSAweGZmLAorCS5jcmNfdHlwZSAgICAgICAgPSBIRExDX0NSQ18xNl9DQ0lUVCwKKwkucHJlYW1ibGVfbGVuZ3RoID0gSERMQ19QUkVBTUJMRV9MRU5HVEhfOEJJVFMsCisJLnByZWFtYmxlICAgICAgICA9IEhETENfUFJFQU1CTEVfUEFUVEVSTl9OT05FLAorCS5kYXRhX3JhdGUgICAgICAgPSA5NjAwLAorCS5kYXRhX2JpdHMgICAgICAgPSA4LAorCS5zdG9wX2JpdHMgICAgICAgPSAxLAorCS5wYXJpdHkgICAgICAgICAgPSBBU1lOQ19QQVJJVFlfTk9ORQorfTsKKworCisjZGVmaW5lIEJIX1JFQ0VJVkUgIDEKKyNkZWZpbmUgQkhfVFJBTlNNSVQgMgorI2RlZmluZSBCSF9TVEFUVVMgICA0CisjZGVmaW5lIElPX1BJTl9TSFVURE9XTl9MSU1JVCAxMDAKKworI2RlZmluZSBETUFCVUZTSVpFIDI1NgorI2RlZmluZSBERVNDX0xJU1RfU0laRSA0MDk2CisKKyNkZWZpbmUgTUFTS19QQVJJVFkgIEJJVDEKKyNkZWZpbmUgTUFTS19GUkFNSU5HIEJJVDIKKyNkZWZpbmUgTUFTS19CUkVBSyAgIEJJVDMKKyNkZWZpbmUgTUFTS19PVkVSUlVOIEJJVDQKKworI2RlZmluZSBHU1IgICAweDAwIC8qIGdsb2JhbCBzdGF0dXMgKi8KKyNkZWZpbmUgVERSICAgMHg4MCAvKiB0eCBkYXRhICovCisjZGVmaW5lIFJEUiAgIDB4ODAgLyogcnggZGF0YSAqLworI2RlZmluZSBUQ1IgICAweDgyIC8qIHR4IGNvbnRyb2wgKi8KKyNkZWZpbmUgVElSICAgMHg4NCAvKiB0eCBpZGxlICovCisjZGVmaW5lIFRQUiAgIDB4ODUgLyogdHggcHJlYW1ibGUgKi8KKyNkZWZpbmUgUkNSICAgMHg4NiAvKiByeCBjb250cm9sICovCisjZGVmaW5lIFZDUiAgIDB4ODggLyogVi4yNCBjb250cm9sICovCisjZGVmaW5lIENDUiAgIDB4ODkgLyogY2xvY2sgY29udHJvbCAqLworI2RlZmluZSBCRFIgICAweDhhIC8qIGJhdWQgZGl2aXNvciAqLworI2RlZmluZSBTQ1IgICAweDhjIC8qIHNlcmlhbCBjb250cm9sICovCisjZGVmaW5lIFNTUiAgIDB4OGUgLyogc2VyaWFsIHN0YXR1cyAqLworI2RlZmluZSBSRENTUiAweDkwIC8qIHJ4IERNQSBjb250cm9sL3N0YXR1cyAqLworI2RlZmluZSBURENTUiAweDk0IC8qIHR4IERNQSBjb250cm9sL3N0YXR1cyAqLworI2RlZmluZSBSRERBUiAweDk4IC8qIHJ4IERNQSBkZXNjcmlwdG9yIGFkZHJlc3MgKi8KKyNkZWZpbmUgVEREQVIgMHg5YyAvKiB0eCBETUEgZGVzY3JpcHRvciBhZGRyZXNzICovCisKKyNkZWZpbmUgUlhJRExFICAgICAgQklUMTQKKyNkZWZpbmUgUlhCUkVBSyAgICAgQklUMTQKKyNkZWZpbmUgSVJRX1RYREFUQSAgQklUMTMKKyNkZWZpbmUgSVJRX1RYSURMRSAgQklUMTIKKyNkZWZpbmUgSVJRX1RYVU5ERVIgQklUMTEgLyogSERMQyAqLworI2RlZmluZSBJUlFfUlhEQVRBICBCSVQxMAorI2RlZmluZSBJUlFfUlhJRExFICBCSVQ5ICAvKiBIRExDICovCisjZGVmaW5lIElSUV9SWEJSRUFLIEJJVDkgIC8qIGFzeW5jICovCisjZGVmaW5lIElSUV9SWE9WRVIgIEJJVDgKKyNkZWZpbmUgSVJRX0RTUiAgICAgQklUNworI2RlZmluZSBJUlFfQ1RTICAgICBCSVQ2CisjZGVmaW5lIElSUV9EQ0QgICAgIEJJVDUKKyNkZWZpbmUgSVJRX1JJICAgICAgQklUNAorI2RlZmluZSBJUlFfQUxMICAgICAweDNmZjAKKyNkZWZpbmUgSVJRX01BU1RFUiAgQklUMAorCisjZGVmaW5lIHNsZ3RfaXJxX29uKGluZm8sIG1hc2spIFwKKwl3cl9yZWcxNigoaW5mbyksIFNDUiwgKHVuc2lnbmVkIHNob3J0KShyZF9yZWcxNigoaW5mbyksIFNDUikgfCAobWFzaykpKQorI2RlZmluZSBzbGd0X2lycV9vZmYoaW5mbywgbWFzaykgXAorCXdyX3JlZzE2KChpbmZvKSwgU0NSLCAodW5zaWduZWQgc2hvcnQpKHJkX3JlZzE2KChpbmZvKSwgU0NSKSAmIH4obWFzaykpKQorCitzdGF0aWMgX191OCAgcmRfcmVnOChzdHJ1Y3Qgc2xndF9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgYWRkcik7CitzdGF0aWMgdm9pZCAgd3JfcmVnOChzdHJ1Y3Qgc2xndF9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgYWRkciwgX191OCB2YWx1ZSk7CitzdGF0aWMgX191MTYgcmRfcmVnMTYoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGFkZHIpOworc3RhdGljIHZvaWQgIHdyX3JlZzE2KHN0cnVjdCBzbGd0X2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBhZGRyLCBfX3UxNiB2YWx1ZSk7CitzdGF0aWMgX191MzIgcmRfcmVnMzIoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGFkZHIpOworc3RhdGljIHZvaWQgIHdyX3JlZzMyKHN0cnVjdCBzbGd0X2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBhZGRyLCBfX3UzMiB2YWx1ZSk7CisKK3N0YXRpYyB2b2lkICBtc2Nfc2V0X3ZjcihzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKTsKKworc3RhdGljIGludCAgc3RhcnR1cChzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgIGJsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHAsc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyk7CitzdGF0aWMgdm9pZCBzaHV0ZG93bihzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKTsKK3N0YXRpYyB2b2lkIHByb2dyYW1faHcoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyk7CitzdGF0aWMgdm9pZCBjaGFuZ2VfcGFyYW1zKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pOworCitzdGF0aWMgaW50ICByZWdpc3Rlcl90ZXN0KHN0cnVjdCBzbGd0X2luZm8gKmluZm8pOworc3RhdGljIGludCAgaXJxX3Rlc3Qoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50ICBsb29wYmFja190ZXN0KHN0cnVjdCBzbGd0X2luZm8gKmluZm8pOworc3RhdGljIGludCAgYWRhcHRlcl90ZXN0KHN0cnVjdCBzbGd0X2luZm8gKmluZm8pOworCitzdGF0aWMgdm9pZCByZXNldF9hZGFwdGVyKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pOworc3RhdGljIHZvaWQgcmVzZXRfcG9ydChzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKTsKK3N0YXRpYyB2b2lkIGFzeW5jX21vZGUoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyk7CitzdGF0aWMgdm9pZCBoZGxjX21vZGUoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyk7CisKK3N0YXRpYyB2b2lkIHJ4X3N0b3Aoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyk7CitzdGF0aWMgdm9pZCByeF9zdGFydChzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKTsKK3N0YXRpYyB2b2lkIHJlc2V0X3JidWZzKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pOworc3RhdGljIHZvaWQgZnJlZV9yYnVmcyhzdHJ1Y3Qgc2xndF9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgZmlyc3QsIHVuc2lnbmVkIGludCBsYXN0KTsKK3N0YXRpYyB2b2lkIHJkbWFfcmVzZXQoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50ICByeF9nZXRfZnJhbWUoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50ICByeF9nZXRfYnVmKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pOworCitzdGF0aWMgdm9pZCB0eF9zdGFydChzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKTsKK3N0YXRpYyB2b2lkIHR4X3N0b3Aoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyk7CitzdGF0aWMgdm9pZCB0eF9zZXRfaWRsZShzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZnJlZV90YnVmX2NvdW50KHN0cnVjdCBzbGd0X2luZm8gKmluZm8pOworc3RhdGljIHZvaWQgcmVzZXRfdGJ1ZnMoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyk7CitzdGF0aWMgdm9pZCB0ZG1hX3Jlc2V0KHN0cnVjdCBzbGd0X2luZm8gKmluZm8pOworc3RhdGljIHZvaWQgdHhfbG9hZChzdHJ1Y3Qgc2xndF9pbmZvICppbmZvLCBjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBjb3VudCk7CisKK3N0YXRpYyB2b2lkIGdldF9zaWduYWxzKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pOworc3RhdGljIHZvaWQgc2V0X3NpZ25hbHMoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyk7CitzdGF0aWMgdm9pZCBlbmFibGVfbG9vcGJhY2soc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyk7CitzdGF0aWMgdm9pZCBzZXRfcmF0ZShzdHJ1Y3Qgc2xndF9pbmZvICppbmZvLCB1MzIgZGF0YV9yYXRlKTsKKworc3RhdGljIGludCAgYmhfYWN0aW9uKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pOworc3RhdGljIHZvaWQgYmhfaGFuZGxlcih2b2lkKiBjb250ZXh0KTsKK3N0YXRpYyB2b2lkIGJoX3RyYW5zbWl0KHN0cnVjdCBzbGd0X2luZm8gKmluZm8pOworc3RhdGljIHZvaWQgaXNyX3NlcmlhbChzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKTsKK3N0YXRpYyB2b2lkIGlzcl9yZG1hKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pOworc3RhdGljIHZvaWQgaXNyX3R4ZW9tKHN0cnVjdCBzbGd0X2luZm8gKmluZm8sIHVuc2lnbmVkIHNob3J0IHN0YXR1cyk7CitzdGF0aWMgdm9pZCBpc3JfdGRtYShzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBzbGd0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncyk7CisKK3N0YXRpYyBpbnQgIGFsbG9jX2RtYV9idWZzKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pOworc3RhdGljIHZvaWQgZnJlZV9kbWFfYnVmcyhzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgIGFsbG9jX2Rlc2Moc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyk7CitzdGF0aWMgdm9pZCBmcmVlX2Rlc2Moc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50ICBhbGxvY19idWZzKHN0cnVjdCBzbGd0X2luZm8gKmluZm8sIHN0cnVjdCBzbGd0X2Rlc2MgKmJ1ZnMsIGludCBjb3VudCk7CitzdGF0aWMgdm9pZCBmcmVlX2J1ZnMoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbywgc3RydWN0IHNsZ3RfZGVzYyAqYnVmcywgaW50IGNvdW50KTsKKworc3RhdGljIGludCAgYWxsb2NfdG1wX3JidWYoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyk7CitzdGF0aWMgdm9pZCBmcmVlX3RtcF9yYnVmKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pOworCitzdGF0aWMgdm9pZCB0eF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgY29udGV4dCk7CitzdGF0aWMgdm9pZCByeF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgY29udGV4dCk7CisKKy8qCisgKiBpb2N0bCBoYW5kbGVycworICovCitzdGF0aWMgaW50ICBnZXRfc3RhdHMoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbywgc3RydWN0IG1nc2xfaWNvdW50IF9fdXNlciAqdXNlcl9pY291bnQpOworc3RhdGljIGludCAgZ2V0X3BhcmFtcyhzdHJ1Y3Qgc2xndF9pbmZvICppbmZvLCBNR1NMX1BBUkFNUyBfX3VzZXIgKnBhcmFtcyk7CitzdGF0aWMgaW50ICBzZXRfcGFyYW1zKHN0cnVjdCBzbGd0X2luZm8gKmluZm8sIE1HU0xfUEFSQU1TIF9fdXNlciAqcGFyYW1zKTsKK3N0YXRpYyBpbnQgIGdldF90eGlkbGUoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbywgaW50IF9fdXNlciAqaWRsZV9tb2RlKTsKK3N0YXRpYyBpbnQgIHNldF90eGlkbGUoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbywgaW50IGlkbGVfbW9kZSk7CitzdGF0aWMgaW50ICB0eF9lbmFibGUoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbywgaW50IGVuYWJsZSk7CitzdGF0aWMgaW50ICB0eF9hYm9ydChzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgIHJ4X2VuYWJsZShzdHJ1Y3Qgc2xndF9pbmZvICppbmZvLCBpbnQgZW5hYmxlKTsKK3N0YXRpYyBpbnQgIG1vZGVtX2lucHV0X3dhaXQoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyxpbnQgYXJnKTsKK3N0YXRpYyBpbnQgIHdhaXRfbWdzbF9ldmVudChzdHJ1Y3Qgc2xndF9pbmZvICppbmZvLCBpbnQgX191c2VyICptYXNrX3B0cik7CitzdGF0aWMgaW50ICB0aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50ICB0aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpOworc3RhdGljIHZvaWQgc2V0X2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBicmVha19zdGF0ZSk7CitzdGF0aWMgaW50ICBnZXRfaW50ZXJmYWNlKHN0cnVjdCBzbGd0X2luZm8gKmluZm8sIGludCBfX3VzZXIgKmlmX21vZGUpOworc3RhdGljIGludCAgc2V0X2ludGVyZmFjZShzdHJ1Y3Qgc2xndF9pbmZvICppbmZvLCBpbnQgaWZfbW9kZSk7CisKKy8qCisgKiBkcml2ZXIgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkIGFkZF9kZXZpY2Uoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyk7CitzdGF0aWMgdm9pZCBkZXZpY2VfaW5pdChpbnQgYWRhcHRlcl9udW0sIHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK3N0YXRpYyBpbnQgIGNsYWltX3Jlc291cmNlcyhzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKTsKK3N0YXRpYyB2b2lkIHJlbGVhc2VfcmVzb3VyY2VzKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pOworCisvKgorICogREVCVUcgT1VUUFVUIENPREUKKyAqLworI2lmbmRlZiBEQkdJTkZPCisjZGVmaW5lIERCR0lORk8oZm10KQorI2VuZGlmCisjaWZuZGVmIERCR0VSUgorI2RlZmluZSBEQkdFUlIoZm10KQorI2VuZGlmCisjaWZuZGVmIERCR0JICisjZGVmaW5lIERCR0JIKGZtdCkKKyNlbmRpZgorI2lmbmRlZiBEQkdJU1IKKyNkZWZpbmUgREJHSVNSKGZtdCkKKyNlbmRpZgorCisjaWZkZWYgREJHREFUQQorc3RhdGljIHZvaWQgdHJhY2VfYmxvY2soc3RydWN0IHNsZ3RfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqZGF0YSwgaW50IGNvdW50LCBjb25zdCBjaGFyICpsYWJlbCkKK3sKKwlpbnQgaTsKKwlpbnQgbGluZWNvdW50OworCXByaW50aygiJXMgJXMgZGF0YTpcbiIsaW5mby0+ZGV2aWNlX25hbWUsIGxhYmVsKTsKKwl3aGlsZShjb3VudCkgeworCQlsaW5lY291bnQgPSAoY291bnQgPiAxNikgPyAxNiA6IGNvdW50OworCQlmb3IoaT0wOyBpIDwgbGluZWNvdW50OyBpKyspCisJCQlwcmludGsoIiUwMlggIiwodW5zaWduZWQgY2hhcilkYXRhW2ldKTsKKwkJZm9yKDtpPDE3O2krKykKKwkJCXByaW50aygiICAgIik7CisJCWZvcihpPTA7aTxsaW5lY291bnQ7aSsrKSB7CisJCQlpZiAoZGF0YVtpXT49MDQwICYmIGRhdGFbaV08PTAxNzYpCisJCQkJcHJpbnRrKCIlYyIsZGF0YVtpXSk7CisJCQllbHNlCisJCQkJcHJpbnRrKCIuIik7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCQlkYXRhICArPSBsaW5lY291bnQ7CisJCWNvdW50IC09IGxpbmVjb3VudDsKKwl9Cit9CisjZWxzZQorI2RlZmluZSBEQkdEQVRBKGluZm8sIGJ1Ziwgc2l6ZSwgbGFiZWwpCisjZW5kaWYKKworI2lmZGVmIERCR1RCVUYKK3N0YXRpYyB2b2lkIGR1bXBfdGJ1ZnMoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKK3sKKwlpbnQgaTsKKwlwcmludGsoInRidWZfY3VycmVudD0lZFxuIiwgaW5mby0+dGJ1Zl9jdXJyZW50KTsKKwlmb3IgKGk9MCA7IGkgPCBpbmZvLT50YnVmX2NvdW50IDsgaSsrKSB7CisJCXByaW50aygiJWQ6IGNvdW50PSUwNFggc3RhdHVzPSUwNFhcbiIsCisJCQlpLCBsZTE2X3RvX2NwdShpbmZvLT50YnVmc1tpXS5jb3VudCksIGxlMTZfdG9fY3B1KGluZm8tPnRidWZzW2ldLnN0YXR1cykpOworCX0KK30KKyNlbHNlCisjZGVmaW5lIERCR1RCVUYoaW5mbykKKyNlbmRpZgorCisjaWZkZWYgREJHUkJVRgorc3RhdGljIHZvaWQgZHVtcF9yYnVmcyhzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKQoreworCWludCBpOworCXByaW50aygicmJ1Zl9jdXJyZW50PSVkXG4iLCBpbmZvLT5yYnVmX2N1cnJlbnQpOworCWZvciAoaT0wIDsgaSA8IGluZm8tPnJidWZfY291bnQgOyBpKyspIHsKKwkJcHJpbnRrKCIlZDogY291bnQ9JTA0WCBzdGF0dXM9JTA0WFxuIiwKKwkJCWksIGxlMTZfdG9fY3B1KGluZm8tPnJidWZzW2ldLmNvdW50KSwgbGUxNl90b19jcHUoaW5mby0+cmJ1ZnNbaV0uc3RhdHVzKSk7CisJfQorfQorI2Vsc2UKKyNkZWZpbmUgREJHUkJVRihpbmZvKQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50IHNhbml0eV9jaGVjayhzdHJ1Y3Qgc2xndF9pbmZvICppbmZvLCBjaGFyICpkZXZuYW1lLCBjb25zdCBjaGFyICpuYW1lKQoreworI2lmZGVmIFNBTklUWV9DSEVDSworCWlmICghaW5mbykgeworCQlwcmludGsoIm51bGwgc3RydWN0IHNsZ3RfaW5mbyBmb3IgKCVzKSBpbiAlc1xuIiwgZGV2bmFtZSwgbmFtZSk7CisJCXJldHVybiAxOworCX0KKwlpZiAoaW5mby0+bWFnaWMgIT0gTUdTTF9NQUdJQykgeworCQlwcmludGsoImJhZCBtYWdpYyBudW1iZXIgc3RydWN0IHNsZ3RfaW5mbyAoJXMpIGluICVzXG4iLCBkZXZuYW1lLCBuYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorI2Vsc2UKKwlpZiAoIWluZm8pCisJCXJldHVybiAxOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbGluZSBkaXNjaXBsaW5lIGNhbGxiYWNrIHdyYXBwZXJzCisgKgorICogVGhlIHdyYXBwZXJzIG1haW50YWluIGxpbmUgZGlzY2lwbGluZSByZWZlcmVuY2VzCisgKiB3aGlsZSBjYWxsaW5nIGludG8gdGhlIGxpbmUgZGlzY2lwbGluZS4KKyAqCisgKiBsZGlzY19yZWNlaXZlX2J1ZiAgLSBwYXNzIHJlY2VpdmUgZGF0YSB0byBsaW5lIGRpc2NpcGxpbmUKKyAqLworc3RhdGljIHZvaWQgbGRpc2NfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCSAgICAgIGNvbnN0IF9fdTggKmRhdGEsIGNoYXIgKmZsYWdzLCBpbnQgY291bnQpCit7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CisJaWYgKCF0dHkpCisJCXJldHVybjsKKwlsZCA9IHR0eV9sZGlzY19yZWYodHR5KTsKKwlpZiAobGQpIHsKKwkJaWYgKGxkLT5yZWNlaXZlX2J1ZikKKwkJCWxkLT5yZWNlaXZlX2J1Zih0dHksIGRhdGEsIGZsYWdzLCBjb3VudCk7CisJCXR0eV9sZGlzY19kZXJlZihsZCk7CisJfQorfQorCisvKiB0dHkgY2FsbGJhY2tzICovCisKK3N0YXRpYyBpbnQgb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3Qgc2xndF9pbmZvICppbmZvOworCWludCByZXR2YWwsIGxpbmU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxpbmUgPSB0dHktPmluZGV4OworCWlmICgobGluZSA8IDApIHx8IChsaW5lID49IHNsZ3RfZGV2aWNlX2NvdW50KSkgeworCQlEQkdFUlIoKCIlczogb3BlbiB3aXRoIGludmFsaWQgbGluZSAjJWQuXG4iLCBkcml2ZXJfbmFtZSwgbGluZSkpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpbmZvID0gc2xndF9kZXZpY2VfbGlzdDsKKwl3aGlsZShpbmZvICYmIGluZm8tPmxpbmUgIT0gbGluZSkKKwkJaW5mbyA9IGluZm8tPm5leHRfZGV2aWNlOworCWlmIChzYW5pdHlfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAib3BlbiIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoaW5mby0+aW5pdF9lcnJvcikgeworCQlEQkdFUlIoKCIlcyBpbml0IGVycm9yPSVkXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+aW5pdF9lcnJvcikpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl0dHktPmRyaXZlcl9kYXRhID0gaW5mbzsKKwlpbmZvLT50dHkgPSB0dHk7CisKKwlEQkdJTkZPKCgiJXMgb3Blbiwgb2xkIHJlZiBjb3VudCA9ICVkXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+Y291bnQpKTsKKworCS8qIElmIHBvcnQgaXMgY2xvc2luZywgc2lnbmFsIGNhbGxlciB0byB0cnkgYWdhaW4gKi8KKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCBpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpeworCQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKQorCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmaW5mby0+Y2xvc2Vfd2FpdCk7CisJCXJldHZhbCA9ICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKSA/CisJCQktRUFHQUlOIDogLUVSRVNUQVJUU1lTKTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWluZm8tPnR0eS0+bG93X2xhdGVuY3kgPSAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19MT1dfTEFURU5DWSkgPyAxIDogMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5uZXRsb2NrLCBmbGFncyk7CisJaWYgKGluZm8tPm5ldGNvdW50KSB7CisJCXJldHZhbCA9IC1FQlVTWTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCQlnb3RvIGNsZWFudXA7CisJfQorCWluZm8tPmNvdW50Kys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCisJaWYgKGluZm8tPmNvdW50ID09IDEpIHsKKwkJLyogMXN0IG9wZW4gb24gdGhpcyBkZXZpY2UsIGluaXQgaGFyZHdhcmUgKi8KKwkJcmV0dmFsID0gc3RhcnR1cChpbmZvKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCQlnb3RvIGNsZWFudXA7CisJfQorCisJcmV0dmFsID0gYmxvY2tfdGlsX3JlYWR5KHR0eSwgZmlscCwgaW5mbyk7CisJaWYgKHJldHZhbCkgeworCQlEQkdJTkZPKCgiJXMgYmxvY2tfdGlsX3JlYWR5IHJjPSVkXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgcmV0dmFsKSk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlyZXR2YWwgPSAwOworCitjbGVhbnVwOgorCWlmIChyZXR2YWwpIHsKKwkJaWYgKHR0eS0+Y291bnQgPT0gMSkKKwkJCWluZm8tPnR0eSA9IE5VTEw7IC8qIHR0eSBsYXllciB3aWxsIHJlbGVhc2UgdHR5IHN0cnVjdCAqLworCQlpZihpbmZvLT5jb3VudCkKKwkJCWluZm8tPmNvdW50LS07CisJfQorCisJREJHSU5GTygoIiVzIG9wZW4gcmM9JWRcbiIsIGluZm8tPmRldmljZV9uYW1lLCByZXR2YWwpKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBjbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3Qgc2xndF9pbmZvICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmIChzYW5pdHlfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY2xvc2UiKSkKKwkJcmV0dXJuOworCURCR0lORk8oKCIlcyBjbG9zZSBlbnRyeSwgY291bnQ9JWRcbiIsIGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5jb3VudCkpOworCisJaWYgKCFpbmZvLT5jb3VudCkKKwkJcmV0dXJuOworCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpCisJCWdvdG8gY2xlYW51cDsKKworCWlmICgodHR5LT5jb3VudCA9PSAxKSAmJiAoaW5mby0+Y291bnQgIT0gMSkpIHsKKwkJLyoKKwkJICogdHR5LT5jb3VudCBpcyAxIGFuZCB0aGUgdHR5IHN0cnVjdHVyZSB3aWxsIGJlIGZyZWVkLgorCQkgKiBpbmZvLT5jb3VudCBzaG91bGQgYmUgb25lIGluIHRoaXMgY2FzZS4KKwkJICogaWYgaXQncyBub3QsIGNvcnJlY3QgaXQgc28gdGhhdCB0aGUgcG9ydCBpcyBzaHV0ZG93bi4KKwkJICovCisJCURCR0VSUigoIiVzIGNsb3NlOiBiYWQgcmVmY291bnQ7IHR0eS0+Y291bnQ9MSwgIgorCQkgICAgICAgImluZm8tPmNvdW50PSVkXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+Y291bnQpKTsKKwkJaW5mby0+Y291bnQgPSAxOworCX0KKworCWluZm8tPmNvdW50LS07CisKKwkvKiBpZiBhdCBsZWFzdCBvbmUgb3BlbiByZW1haW5pbmcsIGxlYXZlIGhhcmR3YXJlIGFjdGl2ZSAqLworCWlmIChpbmZvLT5jb3VudCkKKwkJZ290byBjbGVhbnVwOworCisJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfQ0xPU0lORzsKKworCS8qIHNldCB0dHktPmNsb3NpbmcgdG8gbm90aWZ5IGxpbmUgZGlzY2lwbGluZSB0bworCSAqIG9ubHkgcHJvY2VzcyBYT04vWE9GRiBjaGFyYWN0ZXJzLiBPbmx5IHRoZSBOX1RUWQorCSAqIGRpc2NpcGxpbmUgYXBwZWFycyB0byB1c2UgdGhpcyAocHBwIGRvZXMgbm90KS4KKwkgKi8KKwl0dHktPmNsb3NpbmcgPSAxOworCisJLyogd2FpdCBmb3IgdHJhbnNtaXQgZGF0YSB0byBjbGVhciBhbGwgbGF5ZXJzICovCisKKwlpZiAoaW5mby0+Y2xvc2luZ193YWl0ICE9IEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FKSB7CisJCURCR0lORk8oKCIlcyBjYWxsIHR0eV93YWl0X3VudGlsX3NlbnRcbiIsIGluZm8tPmRldmljZV9uYW1lKSk7CisJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBpbmZvLT5jbG9zaW5nX3dhaXQpOworCX0KKworIAlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkKKyAJCXdhaXRfdW50aWxfc2VudCh0dHksIGluZm8tPnRpbWVvdXQpOworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CisKKwlzaHV0ZG93bihpbmZvKTsKKworCXR0eS0+Y2xvc2luZyA9IDA7CisJaW5mby0+dHR5ID0gTlVMTDsKKworCWlmIChpbmZvLT5ibG9ja2VkX29wZW4pIHsKKwkJaWYgKGluZm8tPmNsb3NlX2RlbGF5KSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGluZm8tPmNsb3NlX2RlbGF5KSk7CisJCX0KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCX0KKworCWluZm8tPmZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRXxBU1lOQ19DTE9TSU5HKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+Y2xvc2Vfd2FpdCk7CisKK2NsZWFudXA6CisJREJHSU5GTygoIiVzIGNsb3NlIGV4aXQsIGNvdW50PSVkXG4iLCB0dHktPmRyaXZlci0+bmFtZSwgaW5mby0+Y291bnQpKTsKK30KKworc3RhdGljIHZvaWQgaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImhhbmd1cCIpKQorCQlyZXR1cm47CisJREJHSU5GTygoIiVzIGhhbmd1cFxuIiwgaW5mby0+ZGV2aWNlX25hbWUpKTsKKworCWZsdXNoX2J1ZmZlcih0dHkpOworCXNodXRkb3duKGluZm8pOworCisJaW5mby0+Y291bnQgPSAwOworCWluZm8tPmZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOworCWluZm8tPnR0eSA9IE5VTEw7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwlzdHJ1Y3Qgc2xndF9pbmZvICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJREJHSU5GTygoIiVzIHNldF90ZXJtaW9zXG4iLCB0dHktPmRyaXZlci0+bmFtZSkpOworCisJLyoganVzdCByZXR1cm4gaWYgbm90aGluZyBoYXMgY2hhbmdlZCAqLworCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnKQorCSAgICAmJiAoUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKQorCQk9PSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKQorCQlyZXR1cm47CisKKwljaGFuZ2VfcGFyYW1zKGluZm8pOworCisJLyogSGFuZGxlIHRyYW5zaXRpb24gdG8gQjAgc3RhdHVzICovCisJaWYgKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQgJiYKKwkgICAgISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkpIHsKKwkJaW5mby0+c2lnbmFscyAmPSB+KFNlcmlhbFNpZ25hbF9SVFMgKyBTZXJpYWxTaWduYWxfRFRSKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQlzZXRfc2lnbmFscyhpbmZvKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJfQorCisJLyogSGFuZGxlIHRyYW5zaXRpb24gYXdheSBmcm9tIEIwIHN0YXR1cyAqLworCWlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpICYmCisJICAgIHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSB7CisJCWluZm8tPnNpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX0RUUjsKKyAJCWlmICghKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHx8CisgCQkgICAgIXRlc3RfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKSkgeworCQkJaW5mby0+c2lnbmFscyB8PSBTZXJpYWxTaWduYWxfUlRTOworIAkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJIAlzZXRfc2lnbmFscyhpbmZvKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJfQorCisJLyogSGFuZGxlIHR1cm5pbmcgb2ZmIENSVFNDVFMgKi8KKwlpZiAob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTICYmCisJICAgICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKKwkJdHR5LT5od19zdG9wcGVkID0gMDsKKwkJdHhfcmVsZWFzZSh0dHkpOworCX0KK30KKworc3RhdGljIGludCB3cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzYW5pdHlfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAid3JpdGUiKSkKKwkJZ290byBjbGVhbnVwOworCURCR0lORk8oKCIlcyB3cml0ZSBjb3VudD0lZFxuIiwgaW5mby0+ZGV2aWNlX25hbWUsIGNvdW50KSk7CisKKwlpZiAoIXR0eSB8fCAhaW5mby0+dHhfYnVmKQorCQlnb3RvIGNsZWFudXA7CisKKwlpZiAoY291bnQgPiBpbmZvLT5tYXhfZnJhbWVfc2l6ZSkgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJaWYgKCFjb3VudCkKKwkJZ290byBjbGVhbnVwOworCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9SQVcpIHsKKwkJdW5zaWduZWQgaW50IGJ1ZnNfbmVlZGVkID0gKGNvdW50L0RNQUJVRlNJWkUpOworCQl1bnNpZ25lZCBpbnQgYnVmc19mcmVlID0gZnJlZV90YnVmX2NvdW50KGluZm8pOworCQlpZiAoY291bnQgJSBETUFCVUZTSVpFKQorCQkJKytidWZzX25lZWRlZDsKKwkJaWYgKGJ1ZnNfbmVlZGVkID4gYnVmc19mcmVlKQorCQkJZ290byBjbGVhbnVwOworCX0gZWxzZSB7CisJCWlmIChpbmZvLT50eF9hY3RpdmUpCisJCQlnb3RvIGNsZWFudXA7CisJCWlmIChpbmZvLT50eF9jb3VudCkgeworCQkJLyogc2VuZCBhY2N1bXVsYXRlZCBkYXRhIGZyb20gc2VuZF9jaGFyKCkgY2FsbHMgKi8KKwkJCS8qIGFzIGZyYW1lIGFuZCB3YWl0IGJlZm9yZSBhY2NlcHRpbmcgbW9yZSBkYXRhLiAqLworCQkJdHhfbG9hZChpbmZvLCBpbmZvLT50eF9idWYsIGluZm8tPnR4X2NvdW50KTsKKwkJCWdvdG8gc3RhcnQ7CisJCX0KKwl9CisKKwlyZXQgPSBpbmZvLT50eF9jb3VudCA9IGNvdW50OworCXR4X2xvYWQoaW5mbywgYnVmLCBjb3VudCk7CisJZ290byBzdGFydDsKKworc3RhcnQ6CisgCWlmIChpbmZvLT50eF9jb3VudCAmJiAhdHR5LT5zdG9wcGVkICYmICF0dHktPmh3X3N0b3BwZWQpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQlpZiAoIWluZm8tPnR4X2FjdGl2ZSkKKwkJIAl0eF9zdGFydChpbmZvKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisgCX0KKworY2xlYW51cDoKKwlEQkdJTkZPKCgiJXMgd3JpdGUgcmM9JWRcbiIsIGluZm8tPmRldmljZV9uYW1lLCByZXQpKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBwdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQoreworCXN0cnVjdCBzbGd0X2luZm8gKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInB1dF9jaGFyIikpCisJCXJldHVybjsKKwlEQkdJTkZPKCgiJXMgcHV0X2NoYXIoJWQpXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgY2gpKTsKKwlpZiAoIXR0eSB8fCAhaW5mby0+dHhfYnVmKQorCQlyZXR1cm47CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWlmICghaW5mby0+dHhfYWN0aXZlICYmIChpbmZvLT50eF9jb3VudCA8IGluZm8tPm1heF9mcmFtZV9zaXplKSkKKwkJaW5mby0+dHhfYnVmW2luZm8tPnR4X2NvdW50KytdID0gY2g7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfeGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCkKK3sKKwlzdHJ1Y3Qgc2xndF9pbmZvICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNhbml0eV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJzZW5kX3hjaGFyIikpCisJCXJldHVybjsKKwlEQkdJTkZPKCgiJXMgc2VuZF94Y2hhciglZClcbiIsIGluZm8tPmRldmljZV9uYW1lLCBjaCkpOworCWluZm8tPnhfY2hhciA9IGNoOworCWlmIChjaCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCWlmICghaW5mby0+dHhfZW5hYmxlZCkKKwkJIAl0eF9zdGFydChpbmZvKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJfQorfQorCitzdGF0aWMgdm9pZCB3YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpCit7CisJc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBvcmlnX2ppZmZpZXMsIGNoYXJfdGltZTsKKworCWlmICghaW5mbyApCisJCXJldHVybjsKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIndhaXRfdW50aWxfc2VudCIpKQorCQlyZXR1cm47CisJREJHSU5GTygoIiVzIHdhaXRfdW50aWxfc2VudCBlbnRyeVxuIiwgaW5mby0+ZGV2aWNlX25hbWUpKTsKKwlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkKKwkJZ290byBleGl0OworCisJb3JpZ19qaWZmaWVzID0gamlmZmllczsKKworCS8qIFNldCBjaGVjayBpbnRlcnZhbCB0byAxLzUgb2YgZXN0aW1hdGVkIHRpbWUgdG8KKwkgKiBzZW5kIGEgY2hhcmFjdGVyLCBhbmQgbWFrZSBpdCBhdCBsZWFzdCAxLiBUaGUgY2hlY2sKKwkgKiBpbnRlcnZhbCBzaG91bGQgYWxzbyBiZSBsZXNzIHRoYW4gdGhlIHRpbWVvdXQuCisJICogTm90ZTogdXNlIHRpZ2h0IHRpbWluZ3MgaGVyZSB0byBzYXRpc2Z5IHRoZSBOSVNULVBDVFMuCisJICovCisKKwlpZiAoaW5mby0+cGFyYW1zLmRhdGFfcmF0ZSkgeworCSAgICAgICAJY2hhcl90aW1lID0gaW5mby0+dGltZW91dC8oMzIgKiA1KTsKKwkJaWYgKCFjaGFyX3RpbWUpCisJCQljaGFyX3RpbWUrKzsKKwl9IGVsc2UKKwkJY2hhcl90aW1lID0gMTsKKworCWlmICh0aW1lb3V0KQorCQljaGFyX3RpbWUgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBjaGFyX3RpbWUsIHRpbWVvdXQpOworCisJd2hpbGUgKGluZm8tPnR4X2FjdGl2ZSkgeworCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGNoYXJfdGltZSkpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJaWYgKHRpbWVvdXQgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBvcmlnX2ppZmZpZXMgKyB0aW1lb3V0KSkKKwkJCWJyZWFrOworCX0KKworZXhpdDoKKwlEQkdJTkZPKCgiJXMgd2FpdF91bnRpbF9zZW50IGV4aXRcbiIsIGluZm8tPmRldmljZV9uYW1lKSk7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzbGd0X2luZm8gKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOworCWludCByZXQ7CisKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIndyaXRlX3Jvb20iKSkKKwkJcmV0dXJuIDA7CisJcmV0ID0gKGluZm8tPnR4X2FjdGl2ZSkgPyAwIDogSERMQ19NQVhfRlJBTUVfU0laRTsKKwlEQkdJTkZPKCgiJXMgd3JpdGVfcm9vbT0lZFxuIiwgaW5mby0+ZGV2aWNlX25hbWUsIHJldCkpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzYW5pdHlfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiZmx1c2hfY2hhcnMiKSkKKwkJcmV0dXJuOworCURCR0lORk8oKCIlcyBmbHVzaF9jaGFycyBlbnRyeSB0eF9jb3VudD0lZFxuIiwgaW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPnR4X2NvdW50KSk7CisKKwlpZiAoaW5mby0+dHhfY291bnQgPD0gMCB8fCB0dHktPnN0b3BwZWQgfHwKKwkgICAgdHR5LT5od19zdG9wcGVkIHx8ICFpbmZvLT50eF9idWYpCisJCXJldHVybjsKKworCURCR0lORk8oKCIlcyBmbHVzaF9jaGFycyBzdGFydCB0cmFuc21pdFxuIiwgaW5mby0+ZGV2aWNlX25hbWUpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlpZiAoIWluZm8tPnR4X2FjdGl2ZSAmJiBpbmZvLT50eF9jb3VudCkgeworCQl0eF9sb2FkKGluZm8sIGluZm8tPnR4X2J1ZixpbmZvLT50eF9jb3VudCk7CisJIAl0eF9zdGFydChpbmZvKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzbGd0X2luZm8gKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImZsdXNoX2J1ZmZlciIpKQorCQlyZXR1cm47CisJREJHSU5GTygoIiVzIGZsdXNoX2J1ZmZlclxuIiwgaW5mby0+ZGV2aWNlX25hbWUpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlpZiAoIWluZm8tPnR4X2FjdGl2ZSkKKwkJaW5mby0+dHhfY291bnQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCXR0eV93YWtldXAodHR5KTsKK30KKworLyoKKyAqIHRocm90dGxlIChzdG9wKSB0cmFuc21pdHRlcgorICovCitzdGF0aWMgdm9pZCB0eF9ob2xkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzYW5pdHlfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAidHhfaG9sZCIpKQorCQlyZXR1cm47CisJREJHSU5GTygoIiVzIHR4X2hvbGRcbiIsIGluZm8tPmRldmljZV9uYW1lKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWlmIChpbmZvLT50eF9lbmFibGVkICYmIGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9BU1lOQykKKwkgCXR4X3N0b3AoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7Cit9CisKKy8qCisgKiByZWxlYXNlIChzdGFydCkgdHJhbnNtaXR0ZXIKKyAqLworc3RhdGljIHZvaWQgdHhfcmVsZWFzZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzbGd0X2luZm8gKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInR4X3JlbGVhc2UiKSkKKwkJcmV0dXJuOworCURCR0lORk8oKCIlcyB0eF9yZWxlYXNlXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSkpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlpZiAoIWluZm8tPnR4X2FjdGl2ZSAmJiBpbmZvLT50eF9jb3VudCkgeworCQl0eF9sb2FkKGluZm8sIGluZm8tPnR4X2J1ZiwgaW5mby0+dHhfY291bnQpOworCSAJdHhfc3RhcnQoaW5mbyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworfQorCisvKgorICogU2VydmljZSBhbiBJT0NUTCByZXF1ZXN0CisgKgorICogQXJndW1lbnRzCisgKgorICogCXR0eQlwb2ludGVyIHRvIHR0eSBpbnN0YW5jZSBkYXRhCisgKiAJZmlsZQlwb2ludGVyIHRvIGFzc29jaWF0ZWQgZmlsZSBvYmplY3QgZm9yIGRldmljZQorICogCWNtZAlJT0NUTCBjb21tYW5kIGNvZGUKKyAqIAlhcmcJY29tbWFuZCBhcmd1bWVudC9jb250ZXh0CisgKgorICogUmV0dXJuIDAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBpb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzbGd0X2luZm8gKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBtZ3NsX2ljb3VudCBjbm93OwkvKiBrZXJuZWwgY291bnRlciB0ZW1wcyAqLworCXN0cnVjdCBzZXJpYWxfaWNvdW50ZXJfc3RydWN0IF9fdXNlciAqcF9jdXNlcjsJLyogdXNlciBzcGFjZSAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImlvY3RsIikpCisJCXJldHVybiAtRU5PREVWOworCURCR0lORk8oKCIlcyBpb2N0bCgpIGNtZD0lMDhYXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgY21kKSk7CisKKwlpZiAoKGNtZCAhPSBUSU9DR1NFUklBTCkgJiYgKGNtZCAhPSBUSU9DU1NFUklBTCkgJiYKKwkgICAgKGNtZCAhPSBUSU9DTUlXQUlUKSAmJiAoY21kICE9IFRJT0NHSUNPVU5UKSkgeworCQlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCisJCSAgICByZXR1cm4gLUVJTzsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTUdTTF9JT0NHUEFSQU1TOgorCQlyZXR1cm4gZ2V0X3BhcmFtcyhpbmZvLCBhcmdwKTsKKwljYXNlIE1HU0xfSU9DU1BBUkFNUzoKKwkJcmV0dXJuIHNldF9wYXJhbXMoaW5mbywgYXJncCk7CisJY2FzZSBNR1NMX0lPQ0dUWElETEU6CisJCXJldHVybiBnZXRfdHhpZGxlKGluZm8sIGFyZ3ApOworCWNhc2UgTUdTTF9JT0NTVFhJRExFOgorCQlyZXR1cm4gc2V0X3R4aWRsZShpbmZvLCAoaW50KWFyZyk7CisJY2FzZSBNR1NMX0lPQ1RYRU5BQkxFOgorCQlyZXR1cm4gdHhfZW5hYmxlKGluZm8sIChpbnQpYXJnKTsKKwljYXNlIE1HU0xfSU9DUlhFTkFCTEU6CisJCXJldHVybiByeF9lbmFibGUoaW5mbywgKGludClhcmcpOworCWNhc2UgTUdTTF9JT0NUWEFCT1JUOgorCQlyZXR1cm4gdHhfYWJvcnQoaW5mbyk7CisJY2FzZSBNR1NMX0lPQ0dTVEFUUzoKKwkJcmV0dXJuIGdldF9zdGF0cyhpbmZvLCBhcmdwKTsKKwljYXNlIE1HU0xfSU9DV0FJVEVWRU5UOgorCQlyZXR1cm4gd2FpdF9tZ3NsX2V2ZW50KGluZm8sIGFyZ3ApOworCWNhc2UgVElPQ01JV0FJVDoKKwkJcmV0dXJuIG1vZGVtX2lucHV0X3dhaXQoaW5mbywoaW50KWFyZyk7CisJY2FzZSBNR1NMX0lPQ0dJRjoKKwkJcmV0dXJuIGdldF9pbnRlcmZhY2UoaW5mbywgYXJncCk7CisJY2FzZSBNR1NMX0lPQ1NJRjoKKwkJcmV0dXJuIHNldF9pbnRlcmZhY2UoaW5mbywoaW50KWFyZyk7CisJY2FzZSBUSU9DR0lDT1VOVDoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQljbm93ID0gaW5mby0+aWNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJcF9jdXNlciA9IGFyZ3A7CisJCWlmIChwdXRfdXNlcihjbm93LmN0cywgJnBfY3VzZXItPmN0cykgfHwKKwkJICAgIHB1dF91c2VyKGNub3cuZHNyLCAmcF9jdXNlci0+ZHNyKSB8fAorCQkgICAgcHV0X3VzZXIoY25vdy5ybmcsICZwX2N1c2VyLT5ybmcpIHx8CisJCSAgICBwdXRfdXNlcihjbm93LmRjZCwgJnBfY3VzZXItPmRjZCkgfHwKKwkJICAgIHB1dF91c2VyKGNub3cucngsICZwX2N1c2VyLT5yeCkgfHwKKwkJICAgIHB1dF91c2VyKGNub3cudHgsICZwX2N1c2VyLT50eCkgfHwKKwkJICAgIHB1dF91c2VyKGNub3cuZnJhbWUsICZwX2N1c2VyLT5mcmFtZSkgfHwKKwkJICAgIHB1dF91c2VyKGNub3cub3ZlcnJ1biwgJnBfY3VzZXItPm92ZXJydW4pIHx8CisJCSAgICBwdXRfdXNlcihjbm93LnBhcml0eSwgJnBfY3VzZXItPnBhcml0eSkgfHwKKwkJICAgIHB1dF91c2VyKGNub3cuYnJrLCAmcF9jdXNlci0+YnJrKSB8fAorCQkgICAgcHV0X3VzZXIoY25vdy5idWZfb3ZlcnJ1biwgJnBfY3VzZXItPmJ1Zl9vdmVycnVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHByb2MgZnMgc3VwcG9ydAorICovCitzdGF0aWMgaW5saW5lIGludCBsaW5lX2luZm8oY2hhciAqYnVmLCBzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKQoreworCWNoYXIgc3RhdF9idWZbMzBdOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJldCA9IHNwcmludGYoYnVmLCAiJXM6IElPPSUwOFggSVJRPSVkIE1heEZyYW1lU2l6ZT0ldVxuIiwKKwkJICAgICAgaW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPnBoeXNfcmVnX2FkZHIsCisJCSAgICAgIGluZm8tPmlycV9sZXZlbCwgaW5mby0+bWF4X2ZyYW1lX3NpemUpOworCisJLyogb3V0cHV0IGN1cnJlbnQgc2VyaWFsIHNpZ25hbCBzdGF0ZXMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJZ2V0X3NpZ25hbHMoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlzdGF0X2J1ZlswXSA9IDA7CisJc3RhdF9idWZbMV0gPSAwOworCWlmIChpbmZvLT5zaWduYWxzICYgU2VyaWFsU2lnbmFsX1JUUykKKwkJc3RyY2F0KHN0YXRfYnVmLCAifFJUUyIpOworCWlmIChpbmZvLT5zaWduYWxzICYgU2VyaWFsU2lnbmFsX0NUUykKKwkJc3RyY2F0KHN0YXRfYnVmLCAifENUUyIpOworCWlmIChpbmZvLT5zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RUUikKKwkJc3RyY2F0KHN0YXRfYnVmLCAifERUUiIpOworCWlmIChpbmZvLT5zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RTUikKKwkJc3RyY2F0KHN0YXRfYnVmLCAifERTUiIpOworCWlmIChpbmZvLT5zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RDRCkKKwkJc3RyY2F0KHN0YXRfYnVmLCAifENEIik7CisJaWYgKGluZm8tPnNpZ25hbHMgJiBTZXJpYWxTaWduYWxfUkkpCisJCXN0cmNhdChzdGF0X2J1ZiwgInxSSSIpOworCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlICE9IE1HU0xfTU9ERV9BU1lOQykgeworCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiXHRIRExDIHR4b2s6JWQgcnhvazolZCIsCisJCQkgICAgICAgaW5mby0+aWNvdW50LnR4b2ssIGluZm8tPmljb3VudC5yeG9rKTsKKwkJaWYgKGluZm8tPmljb3VudC50eHVuZGVyKQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiB0eHVuZGVyOiVkIiwgaW5mby0+aWNvdW50LnR4dW5kZXIpOworCQlpZiAoaW5mby0+aWNvdW50LnR4YWJvcnQpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHR4YWJvcnQ6JWQiLCBpbmZvLT5pY291bnQudHhhYm9ydCk7CisJCWlmIChpbmZvLT5pY291bnQucnhzaG9ydCkKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgcnhzaG9ydDolZCIsIGluZm8tPmljb3VudC5yeHNob3J0KTsKKwkJaWYgKGluZm8tPmljb3VudC5yeGxvbmcpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHJ4bG9uZzolZCIsIGluZm8tPmljb3VudC5yeGxvbmcpOworCQlpZiAoaW5mby0+aWNvdW50LnJ4b3ZlcikKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgcnhvdmVyOiVkIiwgaW5mby0+aWNvdW50LnJ4b3Zlcik7CisJCWlmIChpbmZvLT5pY291bnQucnhjcmMpCisJCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiIHJ4Y3JjOiVkIiwgaW5mby0+aWNvdW50LnJ4Y3JjKTsKKwl9IGVsc2UgeworCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiXHRBU1lOQyB0eDolZCByeDolZCIsCisJCQkgICAgICAgaW5mby0+aWNvdW50LnR4LCBpbmZvLT5pY291bnQucngpOworCQlpZiAoaW5mby0+aWNvdW50LmZyYW1lKQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBmZTolZCIsIGluZm8tPmljb3VudC5mcmFtZSk7CisJCWlmIChpbmZvLT5pY291bnQucGFyaXR5KQorCQkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIiBwZTolZCIsIGluZm8tPmljb3VudC5wYXJpdHkpOworCQlpZiAoaW5mby0+aWNvdW50LmJyaykKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgYnJrOiVkIiwgaW5mby0+aWNvdW50LmJyayk7CisJCWlmIChpbmZvLT5pY291bnQub3ZlcnJ1bikKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgb2U6JWQiLCBpbmZvLT5pY291bnQub3ZlcnJ1bik7CisJfQorCisJLyogQXBwZW5kIHNlcmlhbCBzaWduYWwgc3RhdHVzIHRvIGVuZCAqLworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIgJXNcbiIsIHN0YXRfYnVmKzEpOworCisJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIlx0dHhhY3RpdmU9JWQgYmhfcmVxPSVkIGJoX3J1bj0lZCBwZW5kaW5nX2JoPSV4XG4iLAorCQkgICAgICAgaW5mby0+dHhfYWN0aXZlLGluZm8tPmJoX3JlcXVlc3RlZCxpbmZvLT5iaF9ydW5uaW5nLAorCQkgICAgICAgaW5mby0+cGVuZGluZ19iaCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBDYWxsZWQgdG8gcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgZGV2aWNlcworICovCitzdGF0aWMgaW50IHJlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LAorCQkgICAgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBsZW4gPSAwLCBsOworCW9mZl90CWJlZ2luID0gMDsKKwlzdHJ1Y3Qgc2xndF9pbmZvICppbmZvOworCisJbGVuICs9IHNwcmludGYocGFnZSwgInN5bmNsaW5rX2d0IGRyaXZlcjolc1xuIiwgZHJpdmVyX3ZlcnNpb24pOworCisJaW5mbyA9IHNsZ3RfZGV2aWNlX2xpc3Q7CisJd2hpbGUoIGluZm8gKSB7CisJCWwgPSBsaW5lX2luZm8ocGFnZSArIGxlbiwgaW5mbyk7CisJCWxlbiArPSBsOworCQlpZiAobGVuK2JlZ2luID4gb2ZmK2NvdW50KQorCQkJZ290byBkb25lOworCQlpZiAobGVuK2JlZ2luIDwgb2ZmKSB7CisJCQliZWdpbiArPSBsZW47CisJCQlsZW4gPSAwOworCQl9CisJCWluZm8gPSBpbmZvLT5uZXh0X2RldmljZTsKKwl9CisKKwkqZW9mID0gMTsKK2RvbmU6CisJaWYgKG9mZiA+PSBsZW4rYmVnaW4pCisJCXJldHVybiAwOworCSpzdGFydCA9IHBhZ2UgKyAob2ZmLWJlZ2luKTsKKwlyZXR1cm4gKChjb3VudCA8IGJlZ2luK2xlbi1vZmYpID8gY291bnQgOiBiZWdpbitsZW4tb2ZmKTsKK30KKworLyoKKyAqIHJldHVybiBjb3VudCBvZiBieXRlcyBpbiB0cmFuc21pdCBidWZmZXIKKyAqLworc3RhdGljIGludCBjaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgc2xndF9pbmZvICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImNoYXJzX2luX2J1ZmZlciIpKQorCQlyZXR1cm4gMDsKKwlEQkdJTkZPKCgiJXMgY2hhcnNfaW5fYnVmZmVyKCk9JWRcbiIsIGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT50eF9jb3VudCkpOworCXJldHVybiBpbmZvLT50eF9jb3VudDsKK30KKworLyoKKyAqIHNpZ25hbCByZW1vdGUgZGV2aWNlIHRvIHRocm90dGxlIHNlbmQgZGF0YSAob3VyIHJlY2VpdmUgZGF0YSkKKyAqLworc3RhdGljIHZvaWQgdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzYW5pdHlfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAidGhyb3R0bGUiKSkKKwkJcmV0dXJuOworCURCR0lORk8oKCIlcyB0aHJvdHRsZVxuIiwgaW5mby0+ZGV2aWNlX25hbWUpKTsKKwlpZiAoSV9JWE9GRih0dHkpKQorCQlzZW5kX3hjaGFyKHR0eSwgU1RPUF9DSEFSKHR0eSkpOworIAlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJCWluZm8tPnNpZ25hbHMgJj0gflNlcmlhbFNpZ25hbF9SVFM7CisJIAlzZXRfc2lnbmFscyhpbmZvKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJfQorfQorCisvKgorICogc2lnbmFsIHJlbW90ZSBkZXZpY2UgdG8gc3RvcCB0aHJvdHRsaW5nIHNlbmQgZGF0YSAob3VyIHJlY2VpdmUgZGF0YSkKKyAqLworc3RhdGljIHZvaWQgdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlzdHJ1Y3Qgc2xndF9pbmZvICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNhbml0eV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJ1bnRocm90dGxlIikpCisJCXJldHVybjsKKwlEQkdJTkZPKCgiJXMgdW50aHJvdHRsZVxuIiwgaW5mby0+ZGV2aWNlX25hbWUpKTsKKwlpZiAoSV9JWE9GRih0dHkpKSB7CisJCWlmIChpbmZvLT54X2NoYXIpCisJCQlpbmZvLT54X2NoYXIgPSAwOworCQllbHNlCisJCQlzZW5kX3hjaGFyKHR0eSwgU1RBUlRfQ0hBUih0dHkpKTsKKwl9CisgCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJaW5mby0+c2lnbmFscyB8PSBTZXJpYWxTaWduYWxfUlRTOworCSAJc2V0X3NpZ25hbHMoaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCX0KK30KKworLyoKKyAqIHNldCBvciBjbGVhciB0cmFuc21pdCBicmVhayBjb25kaXRpb24KKyAqIGJyZWFrX3N0YXRlCS0xPXNldCBicmVhayBjb25kaXRpb24sIDA9Y2xlYXIKKyAqLworc3RhdGljIHZvaWQgc2V0X2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBicmVha19zdGF0ZSkKK3sKKwlzdHJ1Y3Qgc2xndF9pbmZvICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNhbml0eV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJzZXRfYnJlYWsiKSkKKwkJcmV0dXJuOworCURCR0lORk8oKCIlcyBzZXRfYnJlYWsoJWQpXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgYnJlYWtfc3RhdGUpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwl2YWx1ZSA9IHJkX3JlZzE2KGluZm8sIFRDUik7CisgCWlmIChicmVha19zdGF0ZSA9PSAtMSkKKwkJdmFsdWUgfD0gQklUNjsKKwllbHNlCisJCXZhbHVlICY9IH5CSVQ2OworCXdyX3JlZzE2KGluZm8sIFRDUiwgdmFsdWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworfQorCisjaWZkZWYgQ09ORklHX0hETEMKKworLyoqCisgKiBjYWxsZWQgYnkgZ2VuZXJpYyBIRExDIGxheWVyIHdoZW4gcHJvdG9jb2wgc2VsZWN0ZWQgKFBQUCwgZnJhbWUgcmVsYXksIGV0Yy4pCisgKiBzZXQgZW5jb2RpbmcgYW5kIGZyYW1lIGNoZWNrIHNlcXVlbmNlIChGQ1MpIG9wdGlvbnMKKyAqCisgKiBkZXYgICAgICAgcG9pbnRlciB0byBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUKKyAqIGVuY29kaW5nICBzZXJpYWwgZW5jb2Rpbmcgc2V0dGluZworICogcGFyaXR5ICAgIEZDUyBzZXR0aW5nCisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGRsY2Rldl9hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgZW5jb2RpbmcsCisJCQkgIHVuc2lnbmVkIHNob3J0IHBhcml0eSkKK3sKKwlzdHJ1Y3Qgc2xndF9pbmZvICppbmZvID0gZGV2X3RvX3BvcnQoZGV2KTsKKwl1bnNpZ25lZCBjaGFyICBuZXdfZW5jb2Rpbmc7CisJdW5zaWduZWQgc2hvcnQgbmV3X2NyY3R5cGU7CisKKwkvKiByZXR1cm4gZXJyb3IgaWYgVFRZIGludGVyZmFjZSBvcGVuICovCisJaWYgKGluZm8tPmNvdW50KQorCQlyZXR1cm4gLUVCVVNZOworCisJREJHSU5GTygoIiVzIGhkbGNkZXZfYXR0YWNoXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSkpOworCisJc3dpdGNoIChlbmNvZGluZykKKwl7CisJY2FzZSBFTkNPRElOR19OUlo6ICAgICAgICBuZXdfZW5jb2RpbmcgPSBIRExDX0VOQ09ESU5HX05SWjsgYnJlYWs7CisJY2FzZSBFTkNPRElOR19OUlpJOiAgICAgICBuZXdfZW5jb2RpbmcgPSBIRExDX0VOQ09ESU5HX05SWklfU1BBQ0U7IGJyZWFrOworCWNhc2UgRU5DT0RJTkdfRk1fTUFSSzogICAgbmV3X2VuY29kaW5nID0gSERMQ19FTkNPRElOR19CSVBIQVNFX01BUks7IGJyZWFrOworCWNhc2UgRU5DT0RJTkdfRk1fU1BBQ0U6ICAgbmV3X2VuY29kaW5nID0gSERMQ19FTkNPRElOR19CSVBIQVNFX1NQQUNFOyBicmVhazsKKwljYXNlIEVOQ09ESU5HX01BTkNIRVNURVI6IG5ld19lbmNvZGluZyA9IEhETENfRU5DT0RJTkdfQklQSEFTRV9MRVZFTDsgYnJlYWs7CisJZGVmYXVsdDogcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChwYXJpdHkpCisJeworCWNhc2UgUEFSSVRZX05PTkU6ICAgICAgICAgICAgbmV3X2NyY3R5cGUgPSBIRExDX0NSQ19OT05FOyBicmVhazsKKwljYXNlIFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQ6IG5ld19jcmN0eXBlID0gSERMQ19DUkNfMTZfQ0NJVFQ7IGJyZWFrOworCWNhc2UgUEFSSVRZX0NSQzMyX1BSMV9DQ0lUVDogbmV3X2NyY3R5cGUgPSBIRExDX0NSQ18zMl9DQ0lUVDsgYnJlYWs7CisJZGVmYXVsdDogcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW5mby0+cGFyYW1zLmVuY29kaW5nID0gbmV3X2VuY29kaW5nOworCWluZm8tPnBhcmFtcy5jcmNfdHlwZSA9IG5ld19jcmN0eXBlOzsKKworCS8qIGlmIG5ldHdvcmsgaW50ZXJmYWNlIHVwLCByZXByb2dyYW0gaGFyZHdhcmUgKi8KKwlpZiAoaW5mby0+bmV0Y291bnQpCisJCXByb2dyYW1faHcoaW5mbyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgZ2VuZXJpYyBIRExDIGxheWVyIHRvIHNlbmQgZnJhbWUKKyAqCisgKiBza2IgIHNvY2tldCBidWZmZXIgY29udGFpbmluZyBIRExDIGZyYW1lCisgKiBkZXYgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGRsY2Rldl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyA9IGRldl90b19wb3J0KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEQkdJTkZPKCgiJXMgaGRsY194bWl0XG4iLCBkZXYtPm5hbWUpKTsKKworCS8qIHN0b3Agc2VuZGluZyB1bnRpbCB0aGlzIGZyYW1lIGNvbXBsZXRlcyAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIGNvcHkgZGF0YSB0byBkZXZpY2UgYnVmZmVycyAqLworCWluZm8tPnR4X2NvdW50ID0gc2tiLT5sZW47CisJdHhfbG9hZChpbmZvLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKworCS8qIHVwZGF0ZSBuZXR3b3JrIHN0YXRpc3RpY3MgKi8KKwlzdGF0cy0+dHhfcGFja2V0cysrOworCXN0YXRzLT50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCS8qIGRvbmUgd2l0aCBzb2NrZXQgYnVmZmVyLCBzbyBmcmVlIGl0ICovCisJZGV2X2tmcmVlX3NrYihza2IpOworCisJLyogc2F2ZSBzdGFydCB0aW1lIGZvciB0cmFuc21pdCB0aW1lb3V0IGRldGVjdGlvbiAqLworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJLyogc3RhcnQgaGFyZHdhcmUgdHJhbnNtaXR0ZXIgaWYgbmVjZXNzYXJ5ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWlmICghaW5mby0+dHhfYWN0aXZlKQorCSAJdHhfc3RhcnQoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgbmV0d29yayBsYXllciB3aGVuIGludGVyZmFjZSBlbmFibGVkCisgKiBjbGFpbSByZXNvdXJjZXMgYW5kIGluaXRpYWxpemUgaGFyZHdhcmUKKyAqCisgKiBkZXYgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGRsY2Rldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyA9IGRldl90b19wb3J0KGRldik7CisJaW50IHJjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEQkdJTkZPKCgiJXMgaGRsY2Rldl9vcGVuXG4iLCBkZXYtPm5hbWUpKTsKKworCS8qIGdlbmVyaWMgSERMQyBsYXllciBvcGVuIHByb2Nlc3NpbmcgKi8KKwlpZiAoKHJjID0gaGRsY19vcGVuKGRldikpKQorCQlyZXR1cm4gcmM7CisKKwkvKiBhcmJpdHJhdGUgYmV0d2VlbiBuZXR3b3JrIGFuZCB0dHkgb3BlbnMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCWlmIChpbmZvLT5jb3VudCAhPSAwIHx8IGluZm8tPm5ldGNvdW50ICE9IDApIHsKKwkJREJHSU5GTygoIiVzIGhkbGNfb3BlbiBidXN5XG4iLCBkZXYtPm5hbWUpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlpbmZvLT5uZXRjb3VudD0xOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKworCS8qIGNsYWltIHJlc291cmNlcyBhbmQgaW5pdCBhZGFwdGVyICovCisJaWYgKChyYyA9IHN0YXJ0dXAoaW5mbykpICE9IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKwkJaW5mby0+bmV0Y291bnQ9MDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bmV0bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogYXNzZXJ0IERUUiBhbmQgUlRTLCBhcHBseSBoYXJkd2FyZSBzZXR0aW5ncyAqLworCWluZm8tPnNpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUyArIFNlcmlhbFNpZ25hbF9EVFI7CisJcHJvZ3JhbV9odyhpbmZvKTsKKworCS8qIGVuYWJsZSBuZXR3b3JrIGxheWVyIHRyYW5zbWl0ICovCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCS8qIGluZm9ybSBnZW5lcmljIEhETEMgbGF5ZXIgb2YgY3VycmVudCBEQ0Qgc3RhdHVzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlnZXRfc2lnbmFscyhpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJaGRsY19zZXRfY2FycmllcihpbmZvLT5zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RDRCwgZGV2KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNhbGxlZCBieSBuZXR3b3JrIGxheWVyIHdoZW4gaW50ZXJmYWNlIGlzIGRpc2FibGVkCisgKiBzaHV0ZG93biBoYXJkd2FyZSBhbmQgcmVsZWFzZSByZXNvdXJjZXMKKyAqCisgKiBkZXYgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGRsY2Rldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbGd0X2luZm8gKmluZm8gPSBkZXZfdG9fcG9ydChkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEQkdJTkZPKCgiJXMgaGRsY2Rldl9jbG9zZVxuIiwgZGV2LT5uYW1lKSk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBzaHV0ZG93biBhZGFwdGVyIGFuZCByZWxlYXNlIHJlc291cmNlcyAqLworCXNodXRkb3duKGluZm8pOworCisJaGRsY19jbG9zZShkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKwlpbmZvLT5uZXRjb3VudD0wOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPm5ldGxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNhbGxlZCBieSBuZXR3b3JrIGxheWVyIHRvIHByb2Nlc3MgSU9DVEwgY2FsbCB0byBuZXR3b3JrIGRldmljZQorICoKKyAqIGRldiAgcG9pbnRlciB0byBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUKKyAqIGlmciAgcG9pbnRlciB0byBuZXR3b3JrIGludGVyZmFjZSByZXF1ZXN0IHN0cnVjdHVyZQorICogY21kICBJT0NUTCBjb21tYW5kIGNvZGUKKyAqCisgKiByZXR1cm5zIDAgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBoZGxjZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKHN5bmNfc2VyaWFsX3NldHRpbmdzKTsKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBuZXdfbGluZTsKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBfX3VzZXIgKmxpbmUgPSBpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5zeW5jOworCXN0cnVjdCBzbGd0X2luZm8gKmluZm8gPSBkZXZfdG9fcG9ydChkZXYpOworCXVuc2lnbmVkIGludCBmbGFnczsKKworCURCR0lORk8oKCIlcyBoZGxjZGV2X2lvY3RsXG4iLCBkZXYtPm5hbWUpKTsKKworCS8qIHJldHVybiBlcnJvciBpZiBUVFkgaW50ZXJmYWNlIG9wZW4gKi8KKwlpZiAoaW5mby0+Y291bnQpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoY21kICE9IFNJT0NXQU5ERVYpCisJCXJldHVybiBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCisJc3dpdGNoKGlmci0+aWZyX3NldHRpbmdzLnR5cGUpIHsKKwljYXNlIElGX0dFVF9JRkFDRTogLyogcmV0dXJuIGN1cnJlbnQgc3luY19zZXJpYWxfc2V0dGluZ3MgKi8KKworCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfU1lOQ19TRVJJQUw7CisJCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplIDwgc2l6ZSkgeworCQkJaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA9IHNpemU7IC8qIGRhdGEgc2l6ZSB3YW50ZWQgKi8KKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCisJCWZsYWdzID0gaW5mby0+cGFyYW1zLmZsYWdzICYgKEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1JYQ19EUExMIHwKKwkJCQkJICAgICAgSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfUlhDX1RYQ1BJTiB8CisJCQkJCSAgICAgIEhETENfRkxBR19UWENfVFhDUElOIHwgSERMQ19GTEFHX1RYQ19EUExMIHwKKwkJCQkJICAgICAgSERMQ19GTEFHX1RYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX1JYQ1BJTik7CisKKwkJc3dpdGNoIChmbGFncyl7CisJCWNhc2UgKEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1RYQ19UWENQSU4pOiBuZXdfbGluZS5jbG9ja190eXBlID0gQ0xPQ0tfRVhUOyBicmVhazsKKwkJY2FzZSAoSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX0JSRyk6ICAgIG5ld19saW5lLmNsb2NrX3R5cGUgPSBDTE9DS19JTlQ7IGJyZWFrOworCQljYXNlIChIRExDX0ZMQUdfUlhDX1JYQ1BJTiB8IEhETENfRkxBR19UWENfQlJHKTogICAgbmV3X2xpbmUuY2xvY2tfdHlwZSA9IENMT0NLX1RYSU5UOyBicmVhazsKKwkJY2FzZSAoSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX1JYQ1BJTik6IG5ld19saW5lLmNsb2NrX3R5cGUgPSBDTE9DS19UWEZST01SWDsgYnJlYWs7CisJCWRlZmF1bHQ6IG5ld19saW5lLmNsb2NrX3R5cGUgPSBDTE9DS19ERUZBVUxUOworCQl9CisKKwkJbmV3X2xpbmUuY2xvY2tfcmF0ZSA9IGluZm8tPnBhcmFtcy5jbG9ja19zcGVlZDsKKwkJbmV3X2xpbmUubG9vcGJhY2sgICA9IGluZm8tPnBhcmFtcy5sb29wYmFjayA/IDE6MDsKKworCQlpZiAoY29weV90b191c2VyKGxpbmUsICZuZXdfbGluZSwgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIElGX0lGQUNFX1NZTkNfU0VSSUFMOiAvKiBzZXQgc3luY19zZXJpYWxfc2V0dGluZ3MgKi8KKworCQlpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X2xpbmUsIGxpbmUsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJc3dpdGNoIChuZXdfbGluZS5jbG9ja190eXBlKQorCQl7CisJCWNhc2UgQ0xPQ0tfRVhUOiAgICAgIGZsYWdzID0gSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX1RYQ1BJTjsgYnJlYWs7CisJCWNhc2UgQ0xPQ0tfVFhGUk9NUlg6IGZsYWdzID0gSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX1JYQ1BJTjsgYnJlYWs7CisJCWNhc2UgQ0xPQ0tfSU5UOiAgICAgIGZsYWdzID0gSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX0JSRzsgICAgYnJlYWs7CisJCWNhc2UgQ0xPQ0tfVFhJTlQ6ICAgIGZsYWdzID0gSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfVFhDX0JSRzsgICAgYnJlYWs7CisJCWNhc2UgQ0xPQ0tfREVGQVVMVDogIGZsYWdzID0gaW5mby0+cGFyYW1zLmZsYWdzICYKKwkJCQkJICAgICAoSERMQ19GTEFHX1JYQ19SWENQSU4gfCBIRExDX0ZMQUdfUlhDX0RQTEwgfAorCQkJCQkgICAgICBIRExDX0ZMQUdfUlhDX0JSRyAgICB8IEhETENfRkxBR19SWENfVFhDUElOIHwKKwkJCQkJICAgICAgSERMQ19GTEFHX1RYQ19UWENQSU4gfCBIRExDX0ZMQUdfVFhDX0RQTEwgfAorCQkJCQkgICAgICBIRExDX0ZMQUdfVFhDX0JSRyAgICB8IEhETENfRkxBR19UWENfUlhDUElOKTsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKG5ld19saW5lLmxvb3BiYWNrICE9IDAgJiYgbmV3X2xpbmUubG9vcGJhY2sgIT0gMSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWluZm8tPnBhcmFtcy5mbGFncyAmPSB+KEhETENfRkxBR19SWENfUlhDUElOIHwgSERMQ19GTEFHX1JYQ19EUExMIHwKKwkJCQkJSERMQ19GTEFHX1JYQ19CUkcgICAgfCBIRExDX0ZMQUdfUlhDX1RYQ1BJTiB8CisJCQkJCUhETENfRkxBR19UWENfVFhDUElOIHwgSERMQ19GTEFHX1RYQ19EUExMIHwKKwkJCQkJSERMQ19GTEFHX1RYQ19CUkcgICAgfCBIRExDX0ZMQUdfVFhDX1JYQ1BJTik7CisJCWluZm8tPnBhcmFtcy5mbGFncyB8PSBmbGFnczsKKworCQlpbmZvLT5wYXJhbXMubG9vcGJhY2sgPSBuZXdfbGluZS5sb29wYmFjazsKKworCQlpZiAoZmxhZ3MgJiAoSERMQ19GTEFHX1JYQ19CUkcgfCBIRExDX0ZMQUdfVFhDX0JSRykpCisJCQlpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQgPSBuZXdfbGluZS5jbG9ja19yYXRlOworCQllbHNlCisJCQlpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQgPSAwOworCisJCS8qIGlmIG5ldHdvcmsgaW50ZXJmYWNlIHVwLCByZXByb2dyYW0gaGFyZHdhcmUgKi8KKwkJaWYgKGluZm8tPm5ldGNvdW50KQorCQkJcHJvZ3JhbV9odyhpbmZvKTsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKwl9Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IG5ldHdvcmsgbGF5ZXIgd2hlbiB0cmFuc21pdCB0aW1lb3V0IGlzIGRldGVjdGVkCisgKgorICogZGV2ICBwb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBoZGxjZGV2X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2xndF9pbmZvICppbmZvID0gZGV2X3RvX3BvcnQoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURCR0lORk8oKCIlcyBoZGxjZGV2X3R4X3RpbWVvdXRcbiIsIGRldi0+bmFtZSkpOworCisJc3RhdHMtPnR4X2Vycm9ycysrOworCXN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycysrOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXR4X3N0b3AoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IGRldmljZSBkcml2ZXIgd2hlbiB0cmFuc21pdCBjb21wbGV0ZXMKKyAqIHJlZW5hYmxlIG5ldHdvcmsgbGF5ZXIgdHJhbnNtaXQgaWYgc3RvcHBlZAorICoKKyAqIGluZm8gIHBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGluZm9ybWF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIGhkbGNkZXZfdHhfZG9uZShzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKQoreworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGluZm8tPm5ldGRldikpCisJCW5ldGlmX3dha2VfcXVldWUoaW5mby0+bmV0ZGV2KTsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgZGV2aWNlIGRyaXZlciB3aGVuIGZyYW1lIHJlY2VpdmVkCisgKiBwYXNzIGZyYW1lIHRvIG5ldHdvcmsgbGF5ZXIKKyAqCisgKiBpbmZvICBwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBpbmZvcm1hdGlvbgorICogYnVmICAgcG9pbnRlciB0byBidWZmZXIgY29udGlhbmluZyBmcmFtZSBkYXRhCisgKiBzaXplICBjb3VudCBvZiBkYXRhIGJ5dGVzIGluIGJ1ZgorICovCitzdGF0aWMgdm9pZCBoZGxjZGV2X3J4KHN0cnVjdCBzbGd0X2luZm8gKmluZm8sIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGluZm8tPm5ldGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisKKwlEQkdJTkZPKCgiJXMgaGRsY2Rldl9yeFxuIiwgZGV2LT5uYW1lKSk7CisKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJREJHRVJSKCgiJXM6IGNhbid0IGFsbG9jIHNrYiwgZHJvcCBwYWNrZXRcbiIsIGRldi0+bmFtZSkpOworCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCisJbWVtY3B5KHNrYl9wdXQoc2tiLCBzaXplKSxidWYsc2l6ZSk7CisKKwlza2ItPnByb3RvY29sID0gaGRsY190eXBlX3RyYW5zKHNrYiwgaW5mby0+bmV0ZGV2KTsKKworCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJc3RhdHMtPnJ4X2J5dGVzICs9IHNpemU7CisKKwluZXRpZl9yeChza2IpOworCisJaW5mby0+bmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKK30KKworLyoqCisgKiBjYWxsZWQgYnkgZGV2aWNlIGRyaXZlciB3aGVuIGFkZGluZyBkZXZpY2UgaW5zdGFuY2UKKyAqIGRvIGdlbmVyaWMgSERMQyBpbml0aWFsaXphdGlvbgorICoKKyAqIGluZm8gIHBvaW50ZXIgdG8gZGV2aWNlIGluc3RhbmNlIGluZm9ybWF0aW9uCisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaGRsY2Rldl9pbml0KHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCit7CisJaW50IHJjOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaGRsY19kZXZpY2UgKmhkbGM7CisKKwkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBuZXR3b3JrIGFuZCBIRExDIGxheWVyIG9iamVjdHMgKi8KKworCWlmICghKGRldiA9IGFsbG9jX2hkbGNkZXYoaW5mbykpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXMgaGRsYyBkZXZpY2UgYWxsb2MgZmFpbHVyZVxuIiwgaW5mby0+ZGV2aWNlX25hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBmb3IgbmV0d29yayBsYXllciByZXBvcnRpbmcgcHVycG9zZXMgb25seSAqLworCWRldi0+bWVtX3N0YXJ0ID0gaW5mby0+cGh5c19yZWdfYWRkcjsKKwlkZXYtPm1lbV9lbmQgICA9IGluZm8tPnBoeXNfcmVnX2FkZHIgKyBTTEdUX1JFR19TSVpFIC0gMTsKKwlkZXYtPmlycSAgICAgICA9IGluZm8tPmlycV9sZXZlbDsKKworCS8qIG5ldHdvcmsgbGF5ZXIgY2FsbGJhY2tzIGFuZCBzZXR0aW5ncyAqLworCWRldi0+ZG9faW9jdGwgICAgICAgPSBoZGxjZGV2X2lvY3RsOworCWRldi0+b3BlbiAgICAgICAgICAgPSBoZGxjZGV2X29wZW47CisJZGV2LT5zdG9wICAgICAgICAgICA9IGhkbGNkZXZfY2xvc2U7CisJZGV2LT50eF90aW1lb3V0ICAgICA9IGhkbGNkZXZfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gMTAqSFo7CisJZGV2LT50eF9xdWV1ZV9sZW4gICA9IDUwOworCisJLyogZ2VuZXJpYyBIRExDIGxheWVyIGNhbGxiYWNrcyBhbmQgc2V0dGluZ3MgKi8KKwloZGxjICAgICAgICAgPSBkZXZfdG9faGRsYyhkZXYpOworCWhkbGMtPmF0dGFjaCA9IGhkbGNkZXZfYXR0YWNoOworCWhkbGMtPnhtaXQgICA9IGhkbGNkZXZfeG1pdDsKKworCS8qIHJlZ2lzdGVyIG9iamVjdHMgd2l0aCBIRExDIGxheWVyICovCisJaWYgKChyYyA9IHJlZ2lzdGVyX2hkbGNfZGV2aWNlKGRldikpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOnVuYWJsZSB0byByZWdpc3RlciBoZGxjIGRldmljZVxuIixfX0ZJTEVfXyk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiByYzsKKwl9CisKKwlpbmZvLT5uZXRkZXYgPSBkZXY7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2FsbGVkIGJ5IGRldmljZSBkcml2ZXIgd2hlbiByZW1vdmluZyBkZXZpY2UgaW5zdGFuY2UKKyAqIGRvIGdlbmVyaWMgSERMQyBjbGVhbnVwCisgKgorICogaW5mbyAgcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgaW5mb3JtYXRpb24KKyAqLworc3RhdGljIHZvaWQgaGRsY2Rldl9leGl0KHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCit7CisJdW5yZWdpc3Rlcl9oZGxjX2RldmljZShpbmZvLT5uZXRkZXYpOworCWZyZWVfbmV0ZGV2KGluZm8tPm5ldGRldik7CisJaW5mby0+bmV0ZGV2ID0gTlVMTDsKK30KKworI2VuZGlmIC8qIGlmZGVmIENPTkZJR19IRExDICovCisKKy8qCisgKiBnZXQgYXN5bmMgZGF0YSBmcm9tIHJ4IERNQSBidWZmZXJzCisgKi8KK3N0YXRpYyB2b2lkIHJ4X2FzeW5jKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCit7CisgCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7CisgCXN0cnVjdCBtZ3NsX2ljb3VudCAqaWNvdW50ID0gJmluZm8tPmljb3VudDsKKwl1bnNpZ25lZCBpbnQgc3RhcnQsIGVuZDsKKwl1bnNpZ25lZCBjaGFyICpwOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCXN0cnVjdCBzbGd0X2Rlc2MgKmJ1ZnMgPSBpbmZvLT5yYnVmczsKKwlpbnQgaSwgY291bnQ7CisJaW50IGNoYXJzID0gMDsKKwlpbnQgc3RhdDsKKwl1bnNpZ25lZCBjaGFyIGNoOworCisJc3RhcnQgPSBlbmQgPSBpbmZvLT5yYnVmX2N1cnJlbnQ7CisKKwl3aGlsZShkZXNjX2NvbXBsZXRlKGJ1ZnNbZW5kXSkpIHsKKwkJY291bnQgPSBkZXNjX2NvdW50KGJ1ZnNbZW5kXSkgLSBpbmZvLT5yYnVmX2luZGV4OworCQlwICAgICA9IGJ1ZnNbZW5kXS5idWYgKyBpbmZvLT5yYnVmX2luZGV4OworCisJCURCR0lTUigoIiVzIHJ4X2FzeW5jIGNvdW50PSVkXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgY291bnQpKTsKKwkJREJHREFUQShpbmZvLCBwLCBjb3VudCwgInJ4Iik7CisKKwkJZm9yKGk9MCA7IGkgPCBjb3VudDsgaSs9MiwgcCs9MikgeworCQkJaWYgKHR0eSAmJiBjaGFycykgeworCQkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisJCQkJY2hhcnMgPSAwOworCQkJfQorCQkJY2ggPSAqcDsKKwkJCWljb3VudC0+cngrKzsKKworCQkJc3RhdCA9IDA7CisKKwkJCWlmICgoc3RhdHVzID0gKihwKzEpICYgKEJJVDkgKyBCSVQ4KSkpIHsKKwkJCQlpZiAoc3RhdHVzICYgQklUOSkKKwkJCQkJaWNvdW50LT5wYXJpdHkrKzsKKwkJCQllbHNlIGlmIChzdGF0dXMgJiBCSVQ4KQorCQkJCQlpY291bnQtPmZyYW1lKys7CisJCQkJLyogZGlzY2FyZCBjaGFyIGlmIHR0eSBjb250cm9sIGZsYWdzIHNheSBzbyAqLworCQkJCWlmIChzdGF0dXMgJiBpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2spCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChzdGF0dXMgJiBCSVQ5KQorCQkJCQlzdGF0ID0gVFRZX1BBUklUWTsKKwkJCQllbHNlIGlmIChzdGF0dXMgJiBCSVQ4KQorCQkJCQlzdGF0ID0gVFRZX0ZSQU1FOworCQkJfQorCQkJaWYgKHR0eSkgeworCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY2gsIHN0YXQpOworCQkJCWNoYXJzKys7CisJCQl9CisJCX0KKworCQlpZiAoaSA8IGNvdW50KSB7CisJCQkvKiByZWNlaXZlIGJ1ZmZlciBub3QgY29tcGxldGVkICovCisJCQlpbmZvLT5yYnVmX2luZGV4ICs9IGk7CisJCQlpbmZvLT5yeF90aW1lci5leHBpcmVzID0gamlmZmllcyArIDE7CisJCQlhZGRfdGltZXIoJmluZm8tPnJ4X3RpbWVyKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaW5mby0+cmJ1Zl9pbmRleCA9IDA7CisJCWZyZWVfcmJ1ZnMoaW5mbywgZW5kLCBlbmQpOworCisJCWlmICgrK2VuZCA9PSBpbmZvLT5yYnVmX2NvdW50KQorCQkJZW5kID0gMDsKKworCQkvKiBpZiBlbnRpcmUgbGlzdCBzZWFyY2hlZCB0aGVuIG5vIGZyYW1lIGF2YWlsYWJsZSAqLworCQlpZiAoZW5kID09IHN0YXJ0KQorCQkJYnJlYWs7CisJfQorCisJaWYgKHR0eSAmJiBjaGFycykKKwkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKK30KKworLyoKKyAqIHJldHVybiBuZXh0IGJvdHRvbSBoYWxmIGFjdGlvbiB0byBwZXJmb3JtCisgKi8KK3N0YXRpYyBpbnQgYmhfYWN0aW9uKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlpZiAoaW5mby0+cGVuZGluZ19iaCAmIEJIX1JFQ0VJVkUpIHsKKwkJaW5mby0+cGVuZGluZ19iaCAmPSB+QkhfUkVDRUlWRTsKKwkJcmMgPSBCSF9SRUNFSVZFOworCX0gZWxzZSBpZiAoaW5mby0+cGVuZGluZ19iaCAmIEJIX1RSQU5TTUlUKSB7CisJCWluZm8tPnBlbmRpbmdfYmggJj0gfkJIX1RSQU5TTUlUOworCQlyYyA9IEJIX1RSQU5TTUlUOworCX0gZWxzZSBpZiAoaW5mby0+cGVuZGluZ19iaCAmIEJIX1NUQVRVUykgeworCQlpbmZvLT5wZW5kaW5nX2JoICY9IH5CSF9TVEFUVVM7CisJCXJjID0gQkhfU1RBVFVTOworCX0gZWxzZSB7CisJCS8qIE1hcmsgQkggcm91dGluZSBhcyBjb21wbGV0ZSAqLworCQlpbmZvLT5iaF9ydW5uaW5nICAgPSAwOworCQlpbmZvLT5iaF9yZXF1ZXN0ZWQgPSAwOworCQlyYyA9IDA7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBwZXJmb3JtIGJvdHRvbSBoYWxmIHByb2Nlc3NpbmcKKyAqLworc3RhdGljIHZvaWQgYmhfaGFuZGxlcih2b2lkKiBjb250ZXh0KQoreworCXN0cnVjdCBzbGd0X2luZm8gKmluZm8gPSBjb250ZXh0OworCWludCBhY3Rpb247CisKKwlpZiAoIWluZm8pCisJCXJldHVybjsKKwlpbmZvLT5iaF9ydW5uaW5nID0gMTsKKworCXdoaWxlKChhY3Rpb24gPSBiaF9hY3Rpb24oaW5mbykpKSB7CisJCXN3aXRjaCAoYWN0aW9uKSB7CisJCWNhc2UgQkhfUkVDRUlWRToKKwkJCURCR0JIKCgiJXMgYmggcmVjZWl2ZVxuIiwgaW5mby0+ZGV2aWNlX25hbWUpKTsKKwkJCXN3aXRjaChpbmZvLT5wYXJhbXMubW9kZSkgeworCQkJY2FzZSBNR1NMX01PREVfQVNZTkM6CisJCQkJcnhfYXN5bmMoaW5mbyk7CisJCQkJYnJlYWs7CisJCQljYXNlIE1HU0xfTU9ERV9IRExDOgorCQkJCXdoaWxlKHJ4X2dldF9mcmFtZShpbmZvKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIE1HU0xfTU9ERV9SQVc6CisJCQkJd2hpbGUocnhfZ2V0X2J1ZihpbmZvKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiByZXN0YXJ0IHJlY2VpdmVyIGlmIHJ4IERNQSBidWZmZXJzIGV4aGF1c3RlZCAqLworCQkJaWYgKGluZm8tPnJ4X3Jlc3RhcnQpCisJCQkJcnhfc3RhcnQoaW5mbyk7CisJCQlicmVhazsKKwkJY2FzZSBCSF9UUkFOU01JVDoKKwkJCWJoX3RyYW5zbWl0KGluZm8pOworCQkJYnJlYWs7CisJCWNhc2UgQkhfU1RBVFVTOgorCQkJREJHQkgoKCIlcyBiaCBzdGF0dXNcbiIsIGluZm8tPmRldmljZV9uYW1lKSk7CisJCQlpbmZvLT5yaV9jaGtjb3VudCA9IDA7CisJCQlpbmZvLT5kc3JfY2hrY291bnQgPSAwOworCQkJaW5mby0+ZGNkX2Noa2NvdW50ID0gMDsKKwkJCWluZm8tPmN0c19jaGtjb3VudCA9IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR0JIKCgiJXMgdW5rbm93biBhY3Rpb25cbiIsIGluZm8tPmRldmljZV9uYW1lKSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlEQkdCSCgoIiVzIGJoX2hhbmRsZXIgZXhpdFxuIiwgaW5mby0+ZGV2aWNlX25hbWUpKTsKK30KKworc3RhdGljIHZvaWQgYmhfdHJhbnNtaXQoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gaW5mby0+dHR5OworCisJREJHQkgoKCIlcyBiaF90cmFuc21pdFxuIiwgaW5mby0+ZGV2aWNlX25hbWUpKTsKKwlpZiAodHR5KSB7CisJCXR0eV93YWtldXAodHR5KTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCX0KK30KKworc3RhdGljIHZvaWQgZHNyX2NoYW5nZShzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKQoreworCWdldF9zaWduYWxzKGluZm8pOworCURCR0lTUigoImRzcl9jaGFuZ2UgJXMgc2lnbmFscz0lMDRYXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+c2lnbmFscykpOworCWlmICgoaW5mby0+ZHNyX2Noa2NvdW50KSsrID09IElPX1BJTl9TSFVURE9XTl9MSU1JVCkgeworCQlzbGd0X2lycV9vZmYoaW5mbywgSVJRX0RTUik7CisJCXJldHVybjsKKwl9CisJaW5mby0+aWNvdW50LmRzcisrOworCWlmIChpbmZvLT5zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RTUikKKwkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5kc3JfdXArKzsKKwllbHNlCisJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMuZHNyX2Rvd24rKzsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPnN0YXR1c19ldmVudF93YWl0X3EpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZXZlbnRfd2FpdF9xKTsKKwlpbmZvLT5wZW5kaW5nX2JoIHw9IEJIX1NUQVRVUzsKK30KKworc3RhdGljIHZvaWQgY3RzX2NoYW5nZShzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKQoreworCWdldF9zaWduYWxzKGluZm8pOworCURCR0lTUigoImN0c19jaGFuZ2UgJXMgc2lnbmFscz0lMDRYXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+c2lnbmFscykpOworCWlmICgoaW5mby0+Y3RzX2Noa2NvdW50KSsrID09IElPX1BJTl9TSFVURE9XTl9MSU1JVCkgeworCQlzbGd0X2lycV9vZmYoaW5mbywgSVJRX0NUUyk7CisJCXJldHVybjsKKwl9CisJaW5mby0+aWNvdW50LmN0cysrOworCWlmIChpbmZvLT5zaWduYWxzICYgU2VyaWFsU2lnbmFsX0NUUykKKwkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5jdHNfdXArKzsKKwllbHNlCisJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMuY3RzX2Rvd24rKzsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPnN0YXR1c19ldmVudF93YWl0X3EpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZXZlbnRfd2FpdF9xKTsKKwlpbmZvLT5wZW5kaW5nX2JoIHw9IEJIX1NUQVRVUzsKKworCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0NUU19GTE9XKSB7CisJCWlmIChpbmZvLT50dHkpIHsKKwkJCWlmIChpbmZvLT50dHktPmh3X3N0b3BwZWQpIHsKKwkJCQlpZiAoaW5mby0+c2lnbmFscyAmIFNlcmlhbFNpZ25hbF9DVFMpIHsKKwkJIAkJCWluZm8tPnR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCQkJCWluZm8tPnBlbmRpbmdfYmggfD0gQkhfVFJBTlNNSVQ7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICghKGluZm8tPnNpZ25hbHMgJiBTZXJpYWxTaWduYWxfQ1RTKSkKKwkJIAkJCWluZm8tPnR0eS0+aHdfc3RvcHBlZCA9IDE7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRjZF9jaGFuZ2Uoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKK3sKKwlnZXRfc2lnbmFscyhpbmZvKTsKKwlEQkdJU1IoKCJkY2RfY2hhbmdlICVzIHNpZ25hbHM9JTA0WFxuIiwgaW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPnNpZ25hbHMpKTsKKwlpZiAoKGluZm8tPmRjZF9jaGtjb3VudCkrKyA9PSBJT19QSU5fU0hVVERPV05fTElNSVQpIHsKKwkJc2xndF9pcnFfb2ZmKGluZm8sIElSUV9EQ0QpOworCQlyZXR1cm47CisJfQorCWluZm8tPmljb3VudC5kY2QrKzsKKwlpZiAoaW5mby0+c2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EQ0QpIHsKKwkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5kY2RfdXArKzsKKwl9IGVsc2UgeworCQlpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzLmRjZF9kb3duKys7CisJfQorI2lmZGVmIENPTkZJR19IRExDCisJaWYgKGluZm8tPm5ldGNvdW50KQorCQloZGxjX3NldF9jYXJyaWVyKGluZm8tPnNpZ25hbHMgJiBTZXJpYWxTaWduYWxfRENELCBpbmZvLT5uZXRkZXYpOworI2VuZGlmCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5zdGF0dXNfZXZlbnRfd2FpdF9xKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmV2ZW50X3dhaXRfcSk7CisJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9TVEFUVVM7CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkgeworCQlpZiAoaW5mby0+c2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EQ0QpCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CisJCWVsc2UgeworCQkJaWYgKGluZm8tPnR0eSkKKwkJCQl0dHlfaGFuZ3VwKGluZm8tPnR0eSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJpX2NoYW5nZShzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKQoreworCWdldF9zaWduYWxzKGluZm8pOworCURCR0lTUigoInJpX2NoYW5nZSAlcyBzaWduYWxzPSUwNFhcbiIsIGluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5zaWduYWxzKSk7CisJaWYgKChpbmZvLT5yaV9jaGtjb3VudCkrKyA9PSBJT19QSU5fU0hVVERPV05fTElNSVQpIHsKKwkJc2xndF9pcnFfb2ZmKGluZm8sIElSUV9SSSk7CisJCXJldHVybjsKKwl9CisJaW5mby0+aWNvdW50LmRjZCsrOworCWlmIChpbmZvLT5zaWduYWxzICYgU2VyaWFsU2lnbmFsX1JJKSB7CisJCWluZm8tPmlucHV0X3NpZ25hbF9ldmVudHMucmlfdXArKzsKKwl9IGVsc2UgeworCQlpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzLnJpX2Rvd24rKzsKKwl9CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5zdGF0dXNfZXZlbnRfd2FpdF9xKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmV2ZW50X3dhaXRfcSk7CisJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9TVEFUVVM7Cit9CisKK3N0YXRpYyB2b2lkIGlzcl9zZXJpYWwoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXMgPSByZF9yZWcxNihpbmZvLCBTU1IpOworCisJREJHSVNSKCgiJXMgaXNyX3NlcmlhbCBzdGF0dXM9JTA0WFxuIiwgaW5mby0+ZGV2aWNlX25hbWUsIHN0YXR1cykpOworCisJd3JfcmVnMTYoaW5mbywgU1NSLCBzdGF0dXMpOyAvKiBjbGVhciBwZW5kaW5nICovCisKKwlpbmZvLT5pcnFfb2NjdXJyZWQgPSAxOworCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9BU1lOQykgeworCQlpZiAoc3RhdHVzICYgSVJRX1RYSURMRSkgeworCQkJaWYgKGluZm8tPnR4X2NvdW50KQorCQkJCWlzcl90eGVvbShpbmZvLCBzdGF0dXMpOworCQl9CisJCWlmICgoc3RhdHVzICYgSVJRX1JYQlJFQUspICYmIChzdGF0dXMgJiBSWEJSRUFLKSkgeworCQkJaW5mby0+aWNvdW50LmJyaysrOworCQkJLyogcHJvY2VzcyBicmVhayBkZXRlY3Rpb24gaWYgdHR5IGNvbnRyb2wgYWxsb3dzICovCisJCQlpZiAoaW5mby0+dHR5KSB7CisJCQkJaWYgKCEoc3RhdHVzICYgaW5mby0+aWdub3JlX3N0YXR1c19tYXNrKSkgeworCQkJCQlpZiAoaW5mby0+cmVhZF9zdGF0dXNfbWFzayAmIE1BU0tfQlJFQUspIHsKKwkJCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKGluZm8tPnR0eSwgMCwgVFRZX0JSRUFLKTsKKwkJCQkJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX1NBSykKKwkJCQkJCQlkb19TQUsoaW5mby0+dHR5KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChzdGF0dXMgJiAoSVJRX1RYSURMRSArIElSUV9UWFVOREVSKSkKKwkJCWlzcl90eGVvbShpbmZvLCBzdGF0dXMpOworCisJCWlmIChzdGF0dXMgJiBJUlFfUlhJRExFKSB7CisJCQlpZiAoc3RhdHVzICYgUlhJRExFKQorCQkJCWluZm8tPmljb3VudC5yeGlkbGUrKzsKKwkJCWVsc2UKKwkJCQlpbmZvLT5pY291bnQuZXhpdGh1bnQrKzsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZXZlbnRfd2FpdF9xKTsKKwkJfQorCisJCWlmIChzdGF0dXMgJiBJUlFfUlhPVkVSKQorCQkJcnhfc3RhcnQoaW5mbyk7CisJfQorCisJaWYgKHN0YXR1cyAmIElSUV9EU1IpCisJCWRzcl9jaGFuZ2UoaW5mbyk7CisJaWYgKHN0YXR1cyAmIElSUV9DVFMpCisJCWN0c19jaGFuZ2UoaW5mbyk7CisJaWYgKHN0YXR1cyAmIElSUV9EQ0QpCisJCWRjZF9jaGFuZ2UoaW5mbyk7CisJaWYgKHN0YXR1cyAmIElSUV9SSSkKKwkJcmlfY2hhbmdlKGluZm8pOworfQorCitzdGF0aWMgdm9pZCBpc3JfcmRtYShzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKQoreworCXVuc2lnbmVkIGludCBzdGF0dXMgPSByZF9yZWczMihpbmZvLCBSRENTUik7CisKKwlEQkdJU1IoKCIlcyBpc3JfcmRtYSBzdGF0dXM9JTA4eFxuIiwgaW5mby0+ZGV2aWNlX25hbWUsIHN0YXR1cykpOworCisJLyogUkRDU1IgKHJ4IERNQSBjb250cm9sL3N0YXR1cykKKwkgKgorCSAqIDMxLi4wNyAgcmVzZXJ2ZWQKKwkgKiAwNiAgICAgIHNhdmUgc3RhdHVzIGJ5dGUgdG8gRE1BIGJ1ZmZlcgorCSAqIDA1ICAgICAgZXJyb3IKKwkgKiAwNCAgICAgIGVvbCAoZW5kIG9mIGxpc3QpCisJICogMDMgICAgICBlb2IgKGVuZCBvZiBidWZmZXIpCisJICogMDIgICAgICBJUlEgZW5hYmxlCisJICogMDEgICAgICByZXNldAorCSAqIDAwICAgICAgZW5hYmxlCisJICovCisJd3JfcmVnMzIoaW5mbywgUkRDU1IsIHN0YXR1cyk7CS8qIGNsZWFyIHBlbmRpbmcgKi8KKworCWlmIChzdGF0dXMgJiAoQklUNSArIEJJVDQpKSB7CisJCURCR0lTUigoIiVzIGlzcl9yZG1hIHJ4X3Jlc3RhcnQ9MVxuIiwgaW5mby0+ZGV2aWNlX25hbWUpKTsKKwkJaW5mby0+cnhfcmVzdGFydCA9IDE7CisJfQorCWluZm8tPnBlbmRpbmdfYmggfD0gQkhfUkVDRUlWRTsKK30KKworc3RhdGljIHZvaWQgaXNyX3RkbWEoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzID0gcmRfcmVnMzIoaW5mbywgVERDU1IpOworCisJREJHSVNSKCgiJXMgaXNyX3RkbWEgc3RhdHVzPSUwOHhcbiIsIGluZm8tPmRldmljZV9uYW1lLCBzdGF0dXMpKTsKKworCS8qIFREQ1NSICh0eCBETUEgY29udHJvbC9zdGF0dXMpCisJICoKKwkgKiAzMS4uMDYgIHJlc2VydmVkCisJICogMDUgICAgICBlcnJvcgorCSAqIDA0ICAgICAgZW9sIChlbmQgb2YgbGlzdCkKKwkgKiAwMyAgICAgIGVvYiAoZW5kIG9mIGJ1ZmZlcikKKwkgKiAwMiAgICAgIElSUSBlbmFibGUKKwkgKiAwMSAgICAgIHJlc2V0CisJICogMDAgICAgICBlbmFibGUKKwkgKi8KKwl3cl9yZWczMihpbmZvLCBURENTUiwgc3RhdHVzKTsJLyogY2xlYXIgcGVuZGluZyAqLworCisJaWYgKHN0YXR1cyAmIChCSVQ1ICsgQklUNCArIEJJVDMpKSB7CisJCS8vIGFub3RoZXIgdHJhbnNtaXQgYnVmZmVyIGhhcyBjb21wbGV0ZWQKKwkJLy8gcnVuIGJvdHRvbSBoYWxmIHRvIGdldCBtb3JlIHNlbmQgZGF0YSBmcm9tIHVzZXIKKwkJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9UUkFOU01JVDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlzcl90eGVvbShzdHJ1Y3Qgc2xndF9pbmZvICppbmZvLCB1bnNpZ25lZCBzaG9ydCBzdGF0dXMpCit7CisJREJHSVNSKCgiJXMgdHhlb20gc3RhdHVzPSUwNHhcbiIsIGluZm8tPmRldmljZV9uYW1lLCBzdGF0dXMpKTsKKworCXNsZ3RfaXJxX29mZihpbmZvLCBJUlFfVFhEQVRBICsgSVJRX1RYSURMRSArIElSUV9UWFVOREVSKTsKKwl0ZG1hX3Jlc2V0KGluZm8pOworCXJlc2V0X3RidWZzKGluZm8pOworCWlmIChzdGF0dXMgJiBJUlFfVFhVTkRFUikgeworCQl1bnNpZ25lZCBzaG9ydCB2YWwgPSByZF9yZWcxNihpbmZvLCBUQ1IpOworCQl3cl9yZWcxNihpbmZvLCBUQ1IsICh1bnNpZ25lZCBzaG9ydCkodmFsIHwgQklUMikpOyAvKiBzZXQgcmVzZXQgYml0ICovCisJCXdyX3JlZzE2KGluZm8sIFRDUiwgdmFsKTsgLyogY2xlYXIgcmVzZXQgYml0ICovCisJfQorCisJaWYgKGluZm8tPnR4X2FjdGl2ZSkgeworCQlpZiAoaW5mby0+cGFyYW1zLm1vZGUgIT0gTUdTTF9NT0RFX0FTWU5DKSB7CisJCQlpZiAoc3RhdHVzICYgSVJRX1RYVU5ERVIpCisJCQkJaW5mby0+aWNvdW50LnR4dW5kZXIrKzsKKwkJCWVsc2UgaWYgKHN0YXR1cyAmIElSUV9UWElETEUpCisJCQkJaW5mby0+aWNvdW50LnR4b2srKzsKKwkJfQorCisJCWluZm8tPnR4X2FjdGl2ZSA9IDA7CisJCWluZm8tPnR4X2NvdW50ID0gMDsKKworCQlkZWxfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsKKworCQlpZiAoaW5mby0+cGFyYW1zLm1vZGUgIT0gTUdTTF9NT0RFX0FTWU5DICYmIGluZm8tPmRyb3BfcnRzX29uX3R4X2RvbmUpIHsKKwkJCWluZm8tPnNpZ25hbHMgJj0gflNlcmlhbFNpZ25hbF9SVFM7CisJCQlpbmZvLT5kcm9wX3J0c19vbl90eF9kb25lID0gMDsKKwkJCXNldF9zaWduYWxzKGluZm8pOworCQl9CisKKyNpZmRlZiBDT05GSUdfSERMQworCQlpZiAoaW5mby0+bmV0Y291bnQpCisJCQloZGxjZGV2X3R4X2RvbmUoaW5mbyk7CisJCWVsc2UKKyNlbmRpZgorCQl7CisJCQlpZiAoaW5mby0+dHR5ICYmIChpbmZvLT50dHktPnN0b3BwZWQgfHwgaW5mby0+dHR5LT5od19zdG9wcGVkKSkgeworCQkJCXR4X3N0b3AoaW5mbyk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaW5mby0+cGVuZGluZ19iaCB8PSBCSF9UUkFOU01JVDsKKwkJfQorCX0KK30KKworLyogaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZQorICoKKyAqIAlpcnEJaW50ZXJydXB0IG51bWJlcgorICogCWRldl9pZAlkZXZpY2UgSUQgc3VwcGxpZWQgZHVyaW5nIGludGVycnVwdCByZWdpc3RyYXRpb24KKyAqIAlyZWdzCWludGVycnVwdGVkIHByb2Nlc3NvciBjb250ZXh0CisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzbGd0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlzdHJ1Y3Qgc2xndF9pbmZvICppbmZvOworCXVuc2lnbmVkIGludCBnc3I7CisJdW5zaWduZWQgaW50IGk7CisKKwlEQkdJU1IoKCJzbGd0X2ludGVycnVwdCBpcnE9JWQgZW50cnlcbiIsIGlycSkpOworCisJaW5mbyA9IGRldl9pZDsKKwlpZiAoIWluZm8pCisJCXJldHVybiBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmaW5mby0+bG9jayk7CisKKwl3aGlsZSgoZ3NyID0gcmRfcmVnMzIoaW5mbywgR1NSKSAmIDB4ZmZmZmZmMDApKSB7CisJCURCR0lTUigoIiVzIGdzcj0lMDh4XG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgZ3NyKSk7CisJCWluZm8tPmlycV9vY2N1cnJlZCA9IDE7CisJCWZvcihpPTA7IGkgPCBpbmZvLT5wb3J0X2NvdW50IDsgaSsrKSB7CisJCQlpZiAoaW5mby0+cG9ydF9hcnJheVtpXSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGdzciAmIChCSVQ4IDw8IGkpKQorCQkJCWlzcl9zZXJpYWwoaW5mby0+cG9ydF9hcnJheVtpXSk7CisJCQlpZiAoZ3NyICYgKEJJVDE2IDw8IChpKjIpKSkKKwkJCQlpc3JfcmRtYShpbmZvLT5wb3J0X2FycmF5W2ldKTsKKwkJCWlmIChnc3IgJiAoQklUMTcgPDwgKGkqMikpKQorCQkJCWlzcl90ZG1hKGluZm8tPnBvcnRfYXJyYXlbaV0pOworCQl9CisJfQorCisJZm9yKGk9MDsgaSA8IGluZm8tPnBvcnRfY291bnQgOyBpKyspIHsKKwkJc3RydWN0IHNsZ3RfaW5mbyAqcG9ydCA9IGluZm8tPnBvcnRfYXJyYXlbaV07CisKKwkJaWYgKHBvcnQgJiYgKHBvcnQtPmNvdW50IHx8IHBvcnQtPm5ldGNvdW50KSAmJgorCQkgICAgcG9ydC0+cGVuZGluZ19iaCAmJiAhcG9ydC0+YmhfcnVubmluZyAmJgorCQkgICAgIXBvcnQtPmJoX3JlcXVlc3RlZCkgeworCQkJREJHSVNSKCgiJXMgYmggcXVldWVkXG4iLCBwb3J0LT5kZXZpY2VfbmFtZSkpOworCQkJc2NoZWR1bGVfd29yaygmcG9ydC0+dGFzayk7CisJCQlwb3J0LT5iaF9yZXF1ZXN0ZWQgPSAxOworCQl9CisJfQorCisJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOworCisJREJHSVNSKCgic2xndF9pbnRlcnJ1cHQgaXJxPSVkIGV4aXRcbiIsIGlycSkpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBzdGFydHVwKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCit7CisJREJHSU5GTygoIiVzIHN0YXJ0dXBcbiIsIGluZm8tPmRldmljZV9uYW1lKSk7CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWluZm8tPnR4X2J1ZikgeworCQlpbmZvLT50eF9idWYgPSBrbWFsbG9jKGluZm8tPm1heF9mcmFtZV9zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFpbmZvLT50eF9idWYpIHsKKwkJCURCR0VSUigoIiVzIGNhbid0IGFsbG9jYXRlIHR4IGJ1ZmZlclxuIiwgaW5mby0+ZGV2aWNlX25hbWUpKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJaW5mby0+cGVuZGluZ19iaCA9IDA7CisKKwltZW1zZXQoJmluZm8tPmljb3VudCwgMCwgc2l6ZW9mKGluZm8tPmljb3VudCkpOworCisJLyogcHJvZ3JhbSBoYXJkd2FyZSBmb3IgY3VycmVudCBwYXJhbWV0ZXJzICovCisJY2hhbmdlX3BhcmFtcyhpbmZvKTsKKworCWlmIChpbmZvLT50dHkpCisJCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKworCWluZm8tPmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgY2FsbGVkIGJ5IGNsb3NlKCkgYW5kIGhhbmd1cCgpIHRvIHNodXRkb3duIGhhcmR3YXJlCisgKi8KK3N0YXRpYyB2b2lkIHNodXRkb3duKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKQorCQlyZXR1cm47CisKKwlEQkdJTkZPKCgiJXMgc2h1dGRvd25cbiIsIGluZm8tPmRldmljZV9uYW1lKSk7CisKKwkvKiBjbGVhciBzdGF0dXMgd2FpdCBxdWV1ZSBiZWNhdXNlIHN0YXR1cyBjaGFuZ2VzICovCisJLyogY2FuJ3QgaGFwcGVuIGFmdGVyIHNodXR0aW5nIGRvd24gdGhlIGhhcmR3YXJlICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5zdGF0dXNfZXZlbnRfd2FpdF9xKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmV2ZW50X3dhaXRfcSk7CisKKwlkZWxfdGltZXJfc3luYygmaW5mby0+dHhfdGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZpbmZvLT5yeF90aW1lcik7CisKKwlrZnJlZShpbmZvLT50eF9idWYpOworCWluZm8tPnR4X2J1ZiA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwl0eF9zdG9wKGluZm8pOworCXJ4X3N0b3AoaW5mbyk7CisKKwlzbGd0X2lycV9vZmYoaW5mbywgSVJRX0FMTCB8IElSUV9NQVNURVIpOworCisgCWlmICghaW5mby0+dHR5IHx8IGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSB7CisgCQlpbmZvLT5zaWduYWxzICY9IH4oU2VyaWFsU2lnbmFsX0RUUiArIFNlcmlhbFNpZ25hbF9SVFMpOworCQlzZXRfc2lnbmFscyhpbmZvKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCWlmIChpbmZvLT50dHkpCisJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisKKwlpbmZvLT5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHByb2dyYW1faHcoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJcnhfc3RvcChpbmZvKTsKKwl0eF9zdG9wKGluZm8pOworCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDIHx8CisJICAgIGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9SQVcgfHwKKwkgICAgaW5mby0+bmV0Y291bnQpCisJCWhkbGNfbW9kZShpbmZvKTsKKwllbHNlCisJCWFzeW5jX21vZGUoaW5mbyk7CisKKwlzZXRfc2lnbmFscyhpbmZvKTsKKworCWluZm8tPmRjZF9jaGtjb3VudCA9IDA7CisJaW5mby0+Y3RzX2Noa2NvdW50ID0gMDsKKwlpbmZvLT5yaV9jaGtjb3VudCA9IDA7CisJaW5mby0+ZHNyX2Noa2NvdW50ID0gMDsKKworCXNsZ3RfaXJxX29uKGluZm8sIElSUV9EQ0QgfCBJUlFfQ1RTIHwgSVJRX0RTUik7CisJZ2V0X3NpZ25hbHMoaW5mbyk7CisKKwlpZiAoaW5mby0+bmV0Y291bnQgfHwKKwkgICAgKGluZm8tPnR0eSAmJiBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUkVBRCkpCisJCXJ4X3N0YXJ0KGluZm8pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7Cit9CisKKy8qCisgKiByZWNvbmZpZ3VyZSBhZGFwdGVyIGJhc2VkIG9uIG5ldyBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyB2b2lkIGNoYW5nZV9wYXJhbXMoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBjZmxhZzsKKwlpbnQgYml0c19wZXJfY2hhcjsKKworCWlmICghaW5mby0+dHR5IHx8ICFpbmZvLT50dHktPnRlcm1pb3MpCisJCXJldHVybjsKKwlEQkdJTkZPKCgiJXMgY2hhbmdlX3BhcmFtc1xuIiwgaW5mby0+ZGV2aWNlX25hbWUpKTsKKworCWNmbGFnID0gaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCisJLyogaWYgQjAgcmF0ZSAoaGFuZ3VwKSBzcGVjaWZpZWQgdGhlbiBuZWdhdGUgRFRSIGFuZCBSVFMgKi8KKwkvKiBvdGhlcndpc2UgYXNzZXJ0IERUUiBhbmQgUlRTICovCisgCWlmIChjZmxhZyAmIENCQVVEKQorCQlpbmZvLT5zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SVFMgKyBTZXJpYWxTaWduYWxfRFRSOworCWVsc2UKKwkJaW5mby0+c2lnbmFscyAmPSB+KFNlcmlhbFNpZ25hbF9SVFMgKyBTZXJpYWxTaWduYWxfRFRSKTsKKworCS8qIGJ5dGUgc2l6ZSBhbmQgcGFyaXR5ICovCisKKwlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKKwljYXNlIENTNTogaW5mby0+cGFyYW1zLmRhdGFfYml0cyA9IDU7IGJyZWFrOworCWNhc2UgQ1M2OiBpbmZvLT5wYXJhbXMuZGF0YV9iaXRzID0gNjsgYnJlYWs7CisJY2FzZSBDUzc6IGluZm8tPnBhcmFtcy5kYXRhX2JpdHMgPSA3OyBicmVhazsKKwljYXNlIENTODogaW5mby0+cGFyYW1zLmRhdGFfYml0cyA9IDg7IGJyZWFrOworCWRlZmF1bHQ6ICBpbmZvLT5wYXJhbXMuZGF0YV9iaXRzID0gNzsgYnJlYWs7CisJfQorCisJaW5mby0+cGFyYW1zLnN0b3BfYml0cyA9IChjZmxhZyAmIENTVE9QQikgPyAyIDogMTsKKworCWlmIChjZmxhZyAmIFBBUkVOQikKKwkJaW5mby0+cGFyYW1zLnBhcml0eSA9IChjZmxhZyAmIFBBUk9ERCkgPyBBU1lOQ19QQVJJVFlfT0REIDogQVNZTkNfUEFSSVRZX0VWRU47CisJZWxzZQorCQlpbmZvLT5wYXJhbXMucGFyaXR5ID0gQVNZTkNfUEFSSVRZX05PTkU7CisKKwkvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGppZmZpZXMgdG8gdHJhbnNtaXQgYSBmdWxsCisJICogRklGTyAoMzIgYnl0ZXMpIGF0IHNwZWNpZmllZCBkYXRhIHJhdGUKKwkgKi8KKwliaXRzX3Blcl9jaGFyID0gaW5mby0+cGFyYW1zLmRhdGFfYml0cyArCisJCQlpbmZvLT5wYXJhbXMuc3RvcF9iaXRzICsgMTsKKworCWluZm8tPnBhcmFtcy5kYXRhX3JhdGUgPSB0dHlfZ2V0X2JhdWRfcmF0ZShpbmZvLT50dHkpOworCisJaWYgKGluZm8tPnBhcmFtcy5kYXRhX3JhdGUpIHsKKwkJaW5mby0+dGltZW91dCA9ICgzMipIWipiaXRzX3Blcl9jaGFyKSAvCisJCQkJaW5mby0+cGFyYW1zLmRhdGFfcmF0ZTsKKwl9CisJaW5mby0+dGltZW91dCArPSBIWi81MDsJCS8qIEFkZCAuMDIgc2Vjb25kcyBvZiBzbG9wICovCisKKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKQorCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19DVFNfRkxPVzsKKwllbHNlCisJCWluZm8tPmZsYWdzICY9IH5BU1lOQ19DVFNfRkxPVzsKKworCWlmIChjZmxhZyAmIENMT0NBTCkKKwkJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0NIRUNLX0NEOworCWVsc2UKKwkJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfQ0hFQ0tfQ0Q7CisKKwkvKiBwcm9jZXNzIHR0eSBpbnB1dCBjb250cm9sIGZsYWdzICovCisKKwlpbmZvLT5yZWFkX3N0YXR1c19tYXNrID0gSVJRX1JYT1ZFUjsKKwlpZiAoSV9JTlBDSyhpbmZvLT50dHkpKQorCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IE1BU0tfUEFSSVRZIHwgTUFTS19GUkFNSU5HOworIAlpZiAoSV9CUktJTlQoaW5mby0+dHR5KSB8fCBJX1BBUk1SSyhpbmZvLT50dHkpKQorIAkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBNQVNLX0JSRUFLOworCWlmIChJX0lHTlBBUihpbmZvLT50dHkpKQorCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gTUFTS19QQVJJVFkgfCBNQVNLX0ZSQU1JTkc7CisJaWYgKElfSUdOQlJLKGluZm8tPnR0eSkpIHsKKwkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IE1BU0tfQlJFQUs7CisJCS8qIElmIGlnbm9yaW5nIHBhcml0eSBhbmQgYnJlYWsgaW5kaWNhdG9ycywgaWdub3JlCisJCSAqIG92ZXJydW5zIHRvby4gIChGb3IgcmVhbCByYXcgc3VwcG9ydCkuCisJCSAqLworCQlpZiAoSV9JR05QQVIoaW5mby0+dHR5KSkKKwkJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBNQVNLX09WRVJSVU47CisJfQorCisJcHJvZ3JhbV9odyhpbmZvKTsKK30KKworc3RhdGljIGludCBnZXRfc3RhdHMoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbywgc3RydWN0IG1nc2xfaWNvdW50IF9fdXNlciAqdXNlcl9pY291bnQpCit7CisJREJHSU5GTygoIiVzIGdldF9zdGF0c1xuIiwgIGluZm8tPmRldmljZV9uYW1lKSk7CisJaWYgKCF1c2VyX2ljb3VudCkgeworCQltZW1zZXQoJmluZm8tPmljb3VudCwgMCwgc2l6ZW9mKGluZm8tPmljb3VudCkpOworCX0gZWxzZSB7CisJCWlmIChjb3B5X3RvX3VzZXIodXNlcl9pY291bnQsICZpbmZvLT5pY291bnQsIHNpemVvZihzdHJ1Y3QgbWdzbF9pY291bnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfcGFyYW1zKHN0cnVjdCBzbGd0X2luZm8gKmluZm8sIE1HU0xfUEFSQU1TIF9fdXNlciAqdXNlcl9wYXJhbXMpCit7CisJREJHSU5GTygoIiVzIGdldF9wYXJhbXNcbiIsIGluZm8tPmRldmljZV9uYW1lKSk7CisJaWYgKGNvcHlfdG9fdXNlcih1c2VyX3BhcmFtcywgJmluZm8tPnBhcmFtcywgc2l6ZW9mKE1HU0xfUEFSQU1TKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF9wYXJhbXMoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbywgTUdTTF9QQVJBTVMgX191c2VyICpuZXdfcGFyYW1zKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCU1HU0xfUEFSQU1TIHRtcF9wYXJhbXM7CisKKwlEQkdJTkZPKCgiJXMgc2V0X3BhcmFtc1xuIiwgaW5mby0+ZGV2aWNlX25hbWUpKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnRtcF9wYXJhbXMsIG5ld19wYXJhbXMsIHNpemVvZihNR1NMX1BBUkFNUykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJbWVtY3B5KCZpbmZvLT5wYXJhbXMsICZ0bXBfcGFyYW1zLCBzaXplb2YoTUdTTF9QQVJBTVMpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisKKyAJY2hhbmdlX3BhcmFtcyhpbmZvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF90eGlkbGUoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbywgaW50IF9fdXNlciAqaWRsZV9tb2RlKQoreworCURCR0lORk8oKCIlcyBnZXRfdHhpZGxlPSVkXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+aWRsZV9tb2RlKSk7CisJaWYgKHB1dF91c2VyKGluZm8tPmlkbGVfbW9kZSwgaWRsZV9tb2RlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3R4aWRsZShzdHJ1Y3Qgc2xndF9pbmZvICppbmZvLCBpbnQgaWRsZV9tb2RlKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCURCR0lORk8oKCIlcyBzZXRfdHhpZGxlKCVkKVxuIiwgaW5mby0+ZGV2aWNlX25hbWUsIGlkbGVfbW9kZSkpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlpbmZvLT5pZGxlX21vZGUgPSBpZGxlX21vZGU7CisJdHhfc2V0X2lkbGUoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHhfZW5hYmxlKHN0cnVjdCBzbGd0X2luZm8gKmluZm8sIGludCBlbmFibGUpCit7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJREJHSU5GTygoIiVzIHR4X2VuYWJsZSglZClcbiIsIGluZm8tPmRldmljZV9uYW1lLCBlbmFibGUpKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CisJaWYgKGVuYWJsZSkgeworCQlpZiAoIWluZm8tPnR4X2VuYWJsZWQpCisJCQl0eF9zdGFydChpbmZvKTsKKwl9IGVsc2UgeworCQlpZiAoaW5mby0+dHhfZW5hYmxlZCkKKwkJCXR4X3N0b3AoaW5mbyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKgorICogYWJvcnQgdHJhbnNtaXQgSERMQyBmcmFtZQorICovCitzdGF0aWMgaW50IHR4X2Fib3J0KHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCit7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJREJHSU5GTygoIiVzIHR4X2Fib3J0XG4iLCBpbmZvLT5kZXZpY2VfbmFtZSkpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwl0ZG1hX3Jlc2V0KGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ4X2VuYWJsZShzdHJ1Y3Qgc2xndF9pbmZvICppbmZvLCBpbnQgZW5hYmxlKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCURCR0lORk8oKCIlcyByeF9lbmFibGUoJWQpXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgZW5hYmxlKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWlmIChlbmFibGUpIHsKKwkJaWYgKCFpbmZvLT5yeF9lbmFibGVkKQorCQkJcnhfc3RhcnQoaW5mbyk7CisJfSBlbHNlIHsKKwkJaWYgKGluZm8tPnJ4X2VuYWJsZWQpCisJCQlyeF9zdG9wKGluZm8pOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICB3YWl0IGZvciBzcGVjaWZpZWQgZXZlbnQgdG8gb2NjdXIKKyAqLworc3RhdGljIGludCB3YWl0X21nc2xfZXZlbnQoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbywgaW50IF9fdXNlciAqbWFza19wdHIpCit7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHM7CisJaW50IHJjPTA7CisJc3RydWN0IG1nc2xfaWNvdW50IGNwcmV2LCBjbm93OworCWludCBldmVudHM7CisJaW50IG1hc2s7CisJc3RydWN0CV9pbnB1dF9zaWduYWxfZXZlbnRzIG9sZHNpZ3MsIG5ld3NpZ3M7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlpZiAoZ2V0X3VzZXIobWFzaywgbWFza19wdHIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCURCR0lORk8oKCIlcyB3YWl0X21nc2xfZXZlbnQoJWQpXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgbWFzaykpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJLyogcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHN0YXRlIG1hdGNoZXMgcmVxdWVzdGVkIGV2ZW50cyAqLworCWdldF9zaWduYWxzKGluZm8pOworCXMgPSBpbmZvLT5zaWduYWxzOworCisJZXZlbnRzID0gbWFzayAmCisJCSggKChzICYgU2VyaWFsU2lnbmFsX0RTUikgPyBNZ3NsRXZlbnRfRHNyQWN0aXZlOk1nc2xFdmVudF9Ec3JJbmFjdGl2ZSkgKworIAkJICAoKHMgJiBTZXJpYWxTaWduYWxfRENEKSA/IE1nc2xFdmVudF9EY2RBY3RpdmU6TWdzbEV2ZW50X0RjZEluYWN0aXZlKSArCisJCSAgKChzICYgU2VyaWFsU2lnbmFsX0NUUykgPyBNZ3NsRXZlbnRfQ3RzQWN0aXZlOk1nc2xFdmVudF9DdHNJbmFjdGl2ZSkgKworCQkgICgocyAmIFNlcmlhbFNpZ25hbF9SSSkgID8gTWdzbEV2ZW50X1JpQWN0aXZlIDpNZ3NsRXZlbnRfUmlJbmFjdGl2ZSkgKTsKKwlpZiAoZXZlbnRzKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogc2F2ZSBjdXJyZW50IGlycSBjb3VudHMgKi8KKwljcHJldiA9IGluZm8tPmljb3VudDsKKwlvbGRzaWdzID0gaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50czsKKworCS8qIGVuYWJsZSBodW50IGFuZCBpZGxlIGlycXMgaWYgbmVlZGVkICovCisJaWYgKG1hc2sgJiAoTWdzbEV2ZW50X0V4aXRIdW50TW9kZStNZ3NsRXZlbnRfSWRsZVJlY2VpdmVkKSkgeworCQl1bnNpZ25lZCBzaG9ydCB2YWwgPSByZF9yZWcxNihpbmZvLCBTQ1IpOworCQlpZiAoISh2YWwgJiBJUlFfUlhJRExFKSkKKwkJCXdyX3JlZzE2KGluZm8sIFNDUiwgKHVuc2lnbmVkIHNob3J0KSh2YWwgfCBJUlFfUlhJRExFKSk7CisJfQorCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlhZGRfd2FpdF9xdWV1ZSgmaW5mby0+ZXZlbnRfd2FpdF9xLCAmd2FpdCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKworCWZvcig7OykgeworCQlzY2hlZHVsZSgpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJjID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBnZXQgY3VycmVudCBpcnEgY291bnRzICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJY25vdyA9IGluZm8tPmljb3VudDsKKwkJbmV3c2lncyA9IGluZm8tPmlucHV0X3NpZ25hbF9ldmVudHM7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJCS8qIGlmIG5vIGNoYW5nZSwgd2FpdCBhYm9ydGVkIGZvciBzb21lIHJlYXNvbiAqLworCQlpZiAobmV3c2lncy5kc3JfdXAgICA9PSBvbGRzaWdzLmRzcl91cCAgICYmCisJCSAgICBuZXdzaWdzLmRzcl9kb3duID09IG9sZHNpZ3MuZHNyX2Rvd24gJiYKKwkJICAgIG5ld3NpZ3MuZGNkX3VwICAgPT0gb2xkc2lncy5kY2RfdXAgICAmJgorCQkgICAgbmV3c2lncy5kY2RfZG93biA9PSBvbGRzaWdzLmRjZF9kb3duICYmCisJCSAgICBuZXdzaWdzLmN0c191cCAgID09IG9sZHNpZ3MuY3RzX3VwICAgJiYKKwkJICAgIG5ld3NpZ3MuY3RzX2Rvd24gPT0gb2xkc2lncy5jdHNfZG93biAmJgorCQkgICAgbmV3c2lncy5yaV91cCAgICA9PSBvbGRzaWdzLnJpX3VwICAgICYmCisJCSAgICBuZXdzaWdzLnJpX2Rvd24gID09IG9sZHNpZ3MucmlfZG93biAgJiYKKwkJICAgIGNub3cuZXhpdGh1bnQgICAgPT0gY3ByZXYuZXhpdGh1bnQgICAmJgorCQkgICAgY25vdy5yeGlkbGUgICAgICA9PSBjcHJldi5yeGlkbGUpIHsKKwkJCXJjID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisKKwkJZXZlbnRzID0gbWFzayAmCisJCQkoIChuZXdzaWdzLmRzcl91cCAgICE9IG9sZHNpZ3MuZHNyX3VwICAgPyBNZ3NsRXZlbnRfRHNyQWN0aXZlOjApICAgKworCQkJICAobmV3c2lncy5kc3JfZG93biAhPSBvbGRzaWdzLmRzcl9kb3duID8gTWdzbEV2ZW50X0RzckluYWN0aXZlOjApICsKKwkJCSAgKG5ld3NpZ3MuZGNkX3VwICAgIT0gb2xkc2lncy5kY2RfdXAgICA/IE1nc2xFdmVudF9EY2RBY3RpdmU6MCkgICArCisJCQkgIChuZXdzaWdzLmRjZF9kb3duICE9IG9sZHNpZ3MuZGNkX2Rvd24gPyBNZ3NsRXZlbnRfRGNkSW5hY3RpdmU6MCkgKworCQkJICAobmV3c2lncy5jdHNfdXAgICAhPSBvbGRzaWdzLmN0c191cCAgID8gTWdzbEV2ZW50X0N0c0FjdGl2ZTowKSAgICsKKwkJCSAgKG5ld3NpZ3MuY3RzX2Rvd24gIT0gb2xkc2lncy5jdHNfZG93biA/IE1nc2xFdmVudF9DdHNJbmFjdGl2ZTowKSArCisJCQkgIChuZXdzaWdzLnJpX3VwICAgICE9IG9sZHNpZ3MucmlfdXAgICAgPyBNZ3NsRXZlbnRfUmlBY3RpdmU6MCkgICAgKworCQkJICAobmV3c2lncy5yaV9kb3duICAhPSBvbGRzaWdzLnJpX2Rvd24gID8gTWdzbEV2ZW50X1JpSW5hY3RpdmU6MCkgICsKKwkJCSAgKGNub3cuZXhpdGh1bnQgICAgIT0gY3ByZXYuZXhpdGh1bnQgICA/IE1nc2xFdmVudF9FeGl0SHVudE1vZGU6MCkgKworCQkJICAoY25vdy5yeGlkbGUgICAgICAhPSBjcHJldi5yeGlkbGUgICAgID8gTWdzbEV2ZW50X0lkbGVSZWNlaXZlZDowKSApOworCQlpZiAoZXZlbnRzKQorCQkJYnJlYWs7CisKKwkJY3ByZXYgPSBjbm93OworCQlvbGRzaWdzID0gbmV3c2lnczsKKwl9CisKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmaW5mby0+ZXZlbnRfd2FpdF9xLCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCisJaWYgKG1hc2sgJiAoTWdzbEV2ZW50X0V4aXRIdW50TW9kZSArIE1nc2xFdmVudF9JZGxlUmVjZWl2ZWQpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJaWYgKCF3YWl0cXVldWVfYWN0aXZlKCZpbmZvLT5ldmVudF93YWl0X3EpKSB7CisJCQkvKiBkaXNhYmxlIGVuYWJsZSBleGl0IGh1bnQgbW9kZS9pZGxlIHJjdmQgSVJRcyAqLworCQkJd3JfcmVnMTYoaW5mbywgU0NSLAorCQkJCSh1bnNpZ25lZCBzaG9ydCkocmRfcmVnMTYoaW5mbywgU0NSKSAmIH5JUlFfUlhJRExFKSk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJfQorZXhpdDoKKwlpZiAocmMgPT0gMCkKKwkJcmMgPSBwdXRfdXNlcihldmVudHMsIG1hc2tfcHRyKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ludGVyZmFjZShzdHJ1Y3Qgc2xndF9pbmZvICppbmZvLCBpbnQgX191c2VyICppZl9tb2RlKQoreworCURCR0lORk8oKCIlcyBnZXRfaW50ZXJmYWNlPSV4XG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+aWZfbW9kZSkpOworCWlmIChwdXRfdXNlcihpbmZvLT5pZl9tb2RlLCBpZl9tb2RlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2ludGVyZmFjZShzdHJ1Y3Qgc2xndF9pbmZvICppbmZvLCBpbnQgaWZfbW9kZSkKK3sKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwlEQkdJTkZPKCgiJXMgc2V0X2ludGVyZmFjZT0leClcbiIsIGluZm8tPmRldmljZV9uYW1lLCBpZl9tb2RlKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWluZm8tPmlmX21vZGUgPSBpZl9tb2RlOworCisJbXNjX3NldF92Y3IoaW5mbyk7CisKKwkvKiBUQ1IgKHR4IGNvbnRyb2wpIDA3ICAxPVJUUyBkcml2ZXIgY29udHJvbCAqLworCXZhbCA9IHJkX3JlZzE2KGluZm8sIFRDUik7CisJaWYgKGluZm8tPmlmX21vZGUgJiBNR1NMX0lOVEVSRkFDRV9SVFNfRU4pCisJCXZhbCB8PSBCSVQ3OworCWVsc2UKKwkJdmFsICY9IH5CSVQ3OworCXdyX3JlZzE2KGluZm8sIFRDUiwgdmFsKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vZGVtX2lucHV0X3dhaXQoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyxpbnQgYXJnKQoreworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYzsKKwlzdHJ1Y3QgbWdzbF9pY291bnQgY3ByZXYsIGNub3c7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwkvKiBzYXZlIGN1cnJlbnQgaXJxIGNvdW50cyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwljcHJldiA9IGluZm8tPmljb3VudDsKKwlhZGRfd2FpdF9xdWV1ZSgmaW5mby0+c3RhdHVzX2V2ZW50X3dhaXRfcSwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlmb3IoOzspIHsKKwkJc2NoZWR1bGUoKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyYyA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogZ2V0IG5ldyBpcnEgY291bnRzICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJY25vdyA9IGluZm8tPmljb3VudDsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwkJLyogaWYgbm8gY2hhbmdlLCB3YWl0IGFib3J0ZWQgZm9yIHNvbWUgcmVhc29uICovCisJCWlmIChjbm93LnJuZyA9PSBjcHJldi5ybmcgJiYgY25vdy5kc3IgPT0gY3ByZXYuZHNyICYmCisJCSAgICBjbm93LmRjZCA9PSBjcHJldi5kY2QgJiYgY25vdy5jdHMgPT0gY3ByZXYuY3RzKSB7CisJCQlyYyA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCisJCS8qIGNoZWNrIGZvciBjaGFuZ2UgaW4gY2FsbGVyIHNwZWNpZmllZCBtb2RlbSBpbnB1dCAqLworCQlpZiAoKGFyZyAmIFRJT0NNX1JORyAmJiBjbm93LnJuZyAhPSBjcHJldi5ybmcpIHx8CisJCSAgICAoYXJnICYgVElPQ01fRFNSICYmIGNub3cuZHNyICE9IGNwcmV2LmRzcikgfHwKKwkJICAgIChhcmcgJiBUSU9DTV9DRCAgJiYgY25vdy5kY2QgIT0gY3ByZXYuZGNkKSB8fAorCQkgICAgKGFyZyAmIFRJT0NNX0NUUyAmJiBjbm93LmN0cyAhPSBjcHJldi5jdHMpKSB7CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWNwcmV2ID0gY25vdzsKKwl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJmluZm8tPnN0YXR1c19ldmVudF93YWl0X3EsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiByYzsKK30KKworLyoKKyAqICByZXR1cm4gc3RhdGUgb2Ygc2VyaWFsIGNvbnRyb2wgYW5kIHN0YXR1cyBzaWduYWxzCisgKi8KK3N0YXRpYyBpbnQgdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgaW50IHJlc3VsdDsKKyAJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKyAJZ2V0X3NpZ25hbHMoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisKKwlyZXN1bHQgPSAoKGluZm8tPnNpZ25hbHMgJiBTZXJpYWxTaWduYWxfUlRTKSA/IFRJT0NNX1JUUzowKSArCisJCSgoaW5mby0+c2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EVFIpID8gVElPQ01fRFRSOjApICsKKwkJKChpbmZvLT5zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RDRCkgPyBUSU9DTV9DQVI6MCkgKworCQkoKGluZm8tPnNpZ25hbHMgJiBTZXJpYWxTaWduYWxfUkkpICA/IFRJT0NNX1JORzowKSArCisJCSgoaW5mby0+c2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EU1IpID8gVElPQ01fRFNSOjApICsKKwkJKChpbmZvLT5zaWduYWxzICYgU2VyaWFsU2lnbmFsX0NUUykgPyBUSU9DTV9DVFM6MCk7CisKKwlEQkdJTkZPKCgiJXMgdGlvY21nZXQgdmFsdWU9JTA4WFxuIiwgaW5mby0+ZGV2aWNlX25hbWUsIHJlc3VsdCkpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBzZXQgbW9kZW0gY29udHJvbCBzaWduYWxzIChEVFIvUlRTKQorICoKKyAqIAljbWQJc2lnbmFsIGNvbW1hbmQ6IFRJT0NNQklTID0gc2V0IGJpdCBUSU9DTUJJQyA9IGNsZWFyIGJpdAorICoJCVRJT0NNU0VUID0gc2V0L2NsZWFyIHNpZ25hbCB2YWx1ZXMKKyAqIAl2YWx1ZQliaXQgbWFzayBmb3IgY29tbWFuZAorICovCitzdGF0aWMgaW50IHRpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCBzbGd0X2luZm8gKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOworIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJREJHSU5GTygoIiVzIHRpb2Ntc2V0KCV4LCV4KVxuIiwgaW5mby0+ZGV2aWNlX25hbWUsIHNldCwgY2xlYXIpKTsKKworCWlmIChzZXQgJiBUSU9DTV9SVFMpCisJCWluZm8tPnNpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUzsKKwlpZiAoc2V0ICYgVElPQ01fRFRSKQorCQlpbmZvLT5zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9EVFI7CisJaWYgKGNsZWFyICYgVElPQ01fUlRTKQorCQlpbmZvLT5zaWduYWxzICY9IH5TZXJpYWxTaWduYWxfUlRTOworCWlmIChjbGVhciAmIFRJT0NNX0RUUikKKwkJaW5mby0+c2lnbmFscyAmPSB+U2VyaWFsU2lnbmFsX0RUUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKyAJc2V0X3NpZ25hbHMoaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgYmxvY2sgY3VycmVudCBwcm9jZXNzIHVudGlsIHRoZSBkZXZpY2UgaXMgcmVhZHkgdG8gb3BlbgorICovCitzdGF0aWMgaW50IGJsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgIHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJaW50CQlyZXR2YWw7CisJaW50CQlkb19jbG9jYWwgPSAwLCBleHRyYV9jb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCURCR0lORk8oKCIlcyBibG9ja190aWxfcmVhZHlcbiIsIHR0eS0+ZHJpdmVyLT5uYW1lKSk7CisKKwlpZiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sgfHwgdHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpeworCQkvKiBub25ibG9jayBtb2RlIGlzIHNldCBvciBwb3J0IGlzIG5vdCBlbmFibGVkICovCisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJCXJldHVybiAwOworCX0KKworCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpCisJCWRvX2Nsb2NhbCA9IDE7CisKKwkvKiBXYWl0IGZvciBjYXJyaWVyIGRldGVjdCBhbmQgdGhlIGxpbmUgdG8gYmVjb21lCisJICogZnJlZSAoaS5lLiwgbm90IGluIHVzZSBieSB0aGUgY2FsbG91dCkuICBXaGlsZSB3ZSBhcmUgaW4KKwkgKiB0aGlzIGxvb3AsIGluZm8tPmNvdW50IGlzIGRyb3BwZWQgYnkgb25lLCBzbyB0aGF0CisJICogY2xvc2UoKSBrbm93cyB3aGVuIHRvIGZyZWUgdGhpbmdzLiAgV2UgcmVzdG9yZSBpdCB1cG9uCisJICogZXhpdCwgZWl0aGVyIG5vcm1hbCBvciBhYm5vcm1hbC4KKwkgKi8KKworCXJldHZhbCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpIHsKKwkJZXh0cmFfY291bnQgPSAxOworCQlpbmZvLT5jb3VudC0tOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJaW5mby0+YmxvY2tlZF9vcGVuKys7CisKKwl3aGlsZSAoMSkgeworCQlpZiAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQkJaW5mby0+c2lnbmFscyB8PSBTZXJpYWxTaWduYWxfUlRTICsgU2VyaWFsU2lnbmFsX0RUUjsKKwkJIAlzZXRfc2lnbmFscyhpbmZvKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCQl9CisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCAhKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKXsKKwkJCXJldHZhbCA9IChpbmZvLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpID8KKwkJCQkJLUVBR0FJTiA6IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCSAJZ2V0X3NpZ25hbHMoaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisgCQlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpICYmCisgCQkgICAgKGRvX2Nsb2NhbCB8fCAoaW5mby0+c2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EQ0QpKSApIHsKKyAJCQlicmVhazsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKworCQlEQkdJTkZPKCgiJXMgYmxvY2tfdGlsX3JlYWR5IHdhaXRcbiIsIHR0eS0+ZHJpdmVyLT5uYW1lKSk7CisJCXNjaGVkdWxlKCk7CisJfQorCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmaW5mby0+b3Blbl93YWl0LCAmd2FpdCk7CisKKwlpZiAoZXh0cmFfY291bnQpCisJCWluZm8tPmNvdW50Kys7CisJaW5mby0+YmxvY2tlZF9vcGVuLS07CisKKwlpZiAoIXJldHZhbCkKKwkJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKworCURCR0lORk8oKCIlcyBibG9ja190aWxfcmVhZHkgcmVhZHksIHJjPSVkXG4iLCB0dHktPmRyaXZlci0+bmFtZSwgcmV0dmFsKSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBhbGxvY190bXBfcmJ1ZihzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKQoreworCWluZm8tPnRtcF9yYnVmID0ga21hbGxvYyhpbmZvLT5tYXhfZnJhbWVfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGluZm8tPnRtcF9yYnVmID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3RtcF9yYnVmKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCit7CisJa2ZyZWUoaW5mby0+dG1wX3JidWYpOworCWluZm8tPnRtcF9yYnVmID0gTlVMTDsKK30KKworLyoKKyAqIGFsbG9jYXRlIERNQSBkZXNjcmlwdG9yIGxpc3RzLgorICovCitzdGF0aWMgaW50IGFsbG9jX2Rlc2Moc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgcGJ1ZnM7CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgdG8gaG9sZCBkZXNjcmlwdG9yIGxpc3RzICovCisJaW5mby0+YnVmcyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGluZm8tPnBkZXYsIERFU0NfTElTVF9TSVpFLCAmaW5mby0+YnVmc19kbWFfYWRkcik7CisJaWYgKGluZm8tPmJ1ZnMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoaW5mby0+YnVmcywgMCwgREVTQ19MSVNUX1NJWkUpOworCisJaW5mby0+cmJ1ZnMgPSAoc3RydWN0IHNsZ3RfZGVzYyopaW5mby0+YnVmczsKKwlpbmZvLT50YnVmcyA9ICgoc3RydWN0IHNsZ3RfZGVzYyopaW5mby0+YnVmcykgKyBpbmZvLT5yYnVmX2NvdW50OworCisJcGJ1ZnMgPSAodW5zaWduZWQgaW50KWluZm8tPmJ1ZnNfZG1hX2FkZHI7CisKKwkvKgorCSAqIEJ1aWxkIGNpcmN1bGFyIGxpc3RzIG9mIGRlc2NyaXB0b3JzCisJICovCisKKwlmb3IgKGk9MDsgaSA8IGluZm8tPnJidWZfY291bnQ7IGkrKykgeworCQkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgZGVzY3JpcHRvciAqLworCQlpbmZvLT5yYnVmc1tpXS5wZGVzYyA9IHBidWZzICsgKGkgKiBzaXplb2Yoc3RydWN0IHNsZ3RfZGVzYykpOworCisJCS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgbmV4dCBkZXNjcmlwdG9yICovCisJCWlmIChpID09IGluZm8tPnJidWZfY291bnQgLSAxKQorCQkJaW5mby0+cmJ1ZnNbaV0ubmV4dCA9IGNwdV90b19sZTMyKHBidWZzKTsKKwkJZWxzZQorCQkJaW5mby0+cmJ1ZnNbaV0ubmV4dCA9IGNwdV90b19sZTMyKHBidWZzICsgKChpKzEpICogc2l6ZW9mKHN0cnVjdCBzbGd0X2Rlc2MpKSk7CisJCXNldF9kZXNjX2NvdW50KGluZm8tPnJidWZzW2ldLCBETUFCVUZTSVpFKTsKKwl9CisKKwlmb3IgKGk9MDsgaSA8IGluZm8tPnRidWZfY291bnQ7IGkrKykgeworCQkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgZGVzY3JpcHRvciAqLworCQlpbmZvLT50YnVmc1tpXS5wZGVzYyA9IHBidWZzICsgKChpbmZvLT5yYnVmX2NvdW50ICsgaSkgKiBzaXplb2Yoc3RydWN0IHNsZ3RfZGVzYykpOworCisJCS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgbmV4dCBkZXNjcmlwdG9yICovCisJCWlmIChpID09IGluZm8tPnRidWZfY291bnQgLSAxKQorCQkJaW5mby0+dGJ1ZnNbaV0ubmV4dCA9IGNwdV90b19sZTMyKHBidWZzICsgaW5mby0+cmJ1Zl9jb3VudCAqIHNpemVvZihzdHJ1Y3Qgc2xndF9kZXNjKSk7CisJCWVsc2UKKwkJCWluZm8tPnRidWZzW2ldLm5leHQgPSBjcHVfdG9fbGUzMihwYnVmcyArICgoaW5mby0+cmJ1Zl9jb3VudCArIGkgKyAxKSAqIHNpemVvZihzdHJ1Y3Qgc2xndF9kZXNjKSkpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2Rlc2Moc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKK3sKKwlpZiAoaW5mby0+YnVmcyAhPSBOVUxMKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaW5mby0+cGRldiwgREVTQ19MSVNUX1NJWkUsIGluZm8tPmJ1ZnMsIGluZm8tPmJ1ZnNfZG1hX2FkZHIpOworCQlpbmZvLT5idWZzICA9IE5VTEw7CisJCWluZm8tPnJidWZzID0gTlVMTDsKKwkJaW5mby0+dGJ1ZnMgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBhbGxvY19idWZzKHN0cnVjdCBzbGd0X2luZm8gKmluZm8sIHN0cnVjdCBzbGd0X2Rlc2MgKmJ1ZnMsIGludCBjb3VudCkKK3sKKwlpbnQgaTsKKwlmb3IgKGk9MDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaWYgKChidWZzW2ldLmJ1ZiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGluZm8tPnBkZXYsIERNQUJVRlNJWkUsICZidWZzW2ldLmJ1Zl9kbWFfYWRkcikpID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJYnVmc1tpXS5wYnVmICA9IGNwdV90b19sZTMyKCh1bnNpZ25lZCBpbnQpYnVmc1tpXS5idWZfZG1hX2FkZHIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9idWZzKHN0cnVjdCBzbGd0X2luZm8gKmluZm8sIHN0cnVjdCBzbGd0X2Rlc2MgKmJ1ZnMsIGludCBjb3VudCkKK3sKKwlpbnQgaTsKKwlmb3IgKGk9MDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaWYgKGJ1ZnNbaV0uYnVmID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChpbmZvLT5wZGV2LCBETUFCVUZTSVpFLCBidWZzW2ldLmJ1ZiwgYnVmc1tpXS5idWZfZG1hX2FkZHIpOworCQlidWZzW2ldLmJ1ZiA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IGFsbG9jX2RtYV9idWZzKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCit7CisJaW5mby0+cmJ1Zl9jb3VudCA9IDMyOworCWluZm8tPnRidWZfY291bnQgPSAzMjsKKworCWlmIChhbGxvY19kZXNjKGluZm8pIDwgMCB8fAorCSAgICBhbGxvY19idWZzKGluZm8sIGluZm8tPnJidWZzLCBpbmZvLT5yYnVmX2NvdW50KSA8IDAgfHwKKwkgICAgYWxsb2NfYnVmcyhpbmZvLCBpbmZvLT50YnVmcywgaW5mby0+dGJ1Zl9jb3VudCkgPCAwIHx8CisJICAgIGFsbG9jX3RtcF9yYnVmKGluZm8pIDwgMCkgeworCQlEQkdFUlIoKCIlcyBETUEgYnVmZmVyIGFsbG9jIGZhaWxcbiIsIGluZm8tPmRldmljZV9uYW1lKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXNldF9yYnVmcyhpbmZvKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9kbWFfYnVmcyhzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKQoreworCWlmIChpbmZvLT5idWZzKSB7CisJCWZyZWVfYnVmcyhpbmZvLCBpbmZvLT5yYnVmcywgaW5mby0+cmJ1Zl9jb3VudCk7CisJCWZyZWVfYnVmcyhpbmZvLCBpbmZvLT50YnVmcywgaW5mby0+dGJ1Zl9jb3VudCk7CisJCWZyZWVfZGVzYyhpbmZvKTsKKwl9CisJZnJlZV90bXBfcmJ1ZihpbmZvKTsKK30KKworc3RhdGljIGludCBjbGFpbV9yZXNvdXJjZXMoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKK3sKKwlpZiAocmVxdWVzdF9tZW1fcmVnaW9uKGluZm8tPnBoeXNfcmVnX2FkZHIsIFNMR1RfUkVHX1NJWkUsICJzeW5jbGlua19ndCIpID09IE5VTEwpIHsKKwkJREJHRVJSKCgiJXMgcmVnIGFkZHIgY29uZmxpY3QsIGFkZHI9JTA4WFxuIiwKKwkJCWluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5waHlzX3JlZ19hZGRyKSk7CisJCWluZm8tPmluaXRfZXJyb3IgPSBEaWFnU3RhdHVzX0FkZHJlc3NDb25mbGljdDsKKwkJZ290byBlcnJvdXQ7CisJfQorCWVsc2UKKwkJaW5mby0+cmVnX2FkZHJfcmVxdWVzdGVkID0gMTsKKworCWluZm8tPnJlZ19hZGRyID0gaW9yZW1hcChpbmZvLT5waHlzX3JlZ19hZGRyLCBTTEdUX1JFR19TSVpFKTsKKwlpZiAoIWluZm8tPnJlZ19hZGRyKSB7CisJCURCR0VSUigoIiVzIGNhbnQgbWFwIGRldmljZSByZWdpc3RlcnMsIGFkZHI9JTA4WFxuIiwKKwkJCWluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5waHlzX3JlZ19hZGRyKSk7CisJCWluZm8tPmluaXRfZXJyb3IgPSBEaWFnU3RhdHVzX0NhbnRBc3NpZ25QY2lSZXNvdXJjZXM7CisJCWdvdG8gZXJyb3V0OworCX0KKwlyZXR1cm4gMDsKKworZXJyb3V0OgorCXJlbGVhc2VfcmVzb3VyY2VzKGluZm8pOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX3Jlc291cmNlcyhzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKQoreworCWlmIChpbmZvLT5pcnFfcmVxdWVzdGVkKSB7CisJCWZyZWVfaXJxKGluZm8tPmlycV9sZXZlbCwgaW5mbyk7CisJCWluZm8tPmlycV9yZXF1ZXN0ZWQgPSAwOworCX0KKworCWlmIChpbmZvLT5yZWdfYWRkcl9yZXF1ZXN0ZWQpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGluZm8tPnBoeXNfcmVnX2FkZHIsIFNMR1RfUkVHX1NJWkUpOworCQlpbmZvLT5yZWdfYWRkcl9yZXF1ZXN0ZWQgPSAwOworCX0KKworCWlmIChpbmZvLT5yZWdfYWRkcikgeworCQlpb3VubWFwKGluZm8tPnJlZ19hZGRyKTsKKwkJaW5mby0+cmVnX2FkZHIgPSBOVUxMOworCX0KK30KKworLyogQWRkIHRoZSBzcGVjaWZpZWQgZGV2aWNlIGluc3RhbmNlIGRhdGEgc3RydWN0dXJlIHRvIHRoZQorICogZ2xvYmFsIGxpbmtlZCBsaXN0IG9mIGRldmljZXMgYW5kIGluY3JlbWVudCB0aGUgZGV2aWNlIGNvdW50LgorICovCitzdGF0aWMgdm9pZCBhZGRfZGV2aWNlKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCit7CisJY2hhciAqZGV2c3RyOworCisJaW5mby0+bmV4dF9kZXZpY2UgPSBOVUxMOworCWluZm8tPmxpbmUgPSBzbGd0X2RldmljZV9jb3VudDsKKwlzcHJpbnRmKGluZm8tPmRldmljZV9uYW1lLCAiJXMlZCIsIHR0eV9kZXZfcHJlZml4LCBpbmZvLT5saW5lKTsKKworCWlmIChpbmZvLT5saW5lIDwgTUFYX0RFVklDRVMpIHsKKwkJaWYgKG1heGZyYW1lW2luZm8tPmxpbmVdKQorCQkJaW5mby0+bWF4X2ZyYW1lX3NpemUgPSBtYXhmcmFtZVtpbmZvLT5saW5lXTsKKwkJaW5mby0+ZG9zeW5jcHBwID0gZG9zeW5jcHBwW2luZm8tPmxpbmVdOworCX0KKworCXNsZ3RfZGV2aWNlX2NvdW50Kys7CisKKwlpZiAoIXNsZ3RfZGV2aWNlX2xpc3QpCisJCXNsZ3RfZGV2aWNlX2xpc3QgPSBpbmZvOworCWVsc2UgeworCQlzdHJ1Y3Qgc2xndF9pbmZvICpjdXJyZW50X2RldiA9IHNsZ3RfZGV2aWNlX2xpc3Q7CisJCXdoaWxlKGN1cnJlbnRfZGV2LT5uZXh0X2RldmljZSkKKwkJCWN1cnJlbnRfZGV2ID0gY3VycmVudF9kZXYtPm5leHRfZGV2aWNlOworCQljdXJyZW50X2Rldi0+bmV4dF9kZXZpY2UgPSBpbmZvOworCX0KKworCWlmIChpbmZvLT5tYXhfZnJhbWVfc2l6ZSA8IDQwOTYpCisJCWluZm8tPm1heF9mcmFtZV9zaXplID0gNDA5NjsKKwllbHNlIGlmIChpbmZvLT5tYXhfZnJhbWVfc2l6ZSA+IDY1NTM1KQorCQlpbmZvLT5tYXhfZnJhbWVfc2l6ZSA9IDY1NTM1OworCisJc3dpdGNoKGluZm8tPnBkZXYtPmRldmljZSkgeworCWNhc2UgU1lOQ0xJTktfR1RfREVWSUNFX0lEOgorCQlkZXZzdHIgPSAiR1QiOworCQlicmVhazsKKwljYXNlIFNZTkNMSU5LX0dUNF9ERVZJQ0VfSUQ6CisJCWRldnN0ciA9ICJHVDQiOworCQlicmVhazsKKwljYXNlIFNZTkNMSU5LX0FDX0RFVklDRV9JRDoKKwkJZGV2c3RyID0gIkFDIjsKKwkJaW5mby0+cGFyYW1zLm1vZGUgPSBNR1NMX01PREVfQVNZTkM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldnN0ciA9ICIodW5rbm93biBtb2RlbCkiOworCX0KKwlwcmludGsoIlN5bmNMaW5rICVzICVzIElPPSUwOHggSVJRPSVkIE1heEZyYW1lU2l6ZT0ldVxuIiwKKwkJZGV2c3RyLCBpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+cGh5c19yZWdfYWRkciwKKwkJaW5mby0+aXJxX2xldmVsLCBpbmZvLT5tYXhfZnJhbWVfc2l6ZSk7CisKKyNpZmRlZiBDT05GSUdfSERMQworCWhkbGNkZXZfaW5pdChpbmZvKTsKKyNlbmRpZgorfQorCisvKgorICogIGFsbG9jYXRlIGRldmljZSBpbnN0YW5jZSBzdHJ1Y3R1cmUsIHJldHVybiBOVUxMIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIHN0cnVjdCBzbGd0X2luZm8gKmFsbG9jX2RldihpbnQgYWRhcHRlcl9udW0sIGludCBwb3J0X251bSwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHNsZ3RfaW5mbyAqaW5mbzsKKworCWluZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2xndF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWluZm8pIHsKKwkJREJHRVJSKCgiJXMgZGV2aWNlIGFsbG9jIGZhaWxlZCBhZGFwdGVyPSVkIHBvcnQ9JWRcbiIsCisJCQlkcml2ZXJfbmFtZSwgYWRhcHRlcl9udW0sIHBvcnRfbnVtKSk7CisJfSBlbHNlIHsKKwkJbWVtc2V0KGluZm8sIDAsIHNpemVvZihzdHJ1Y3Qgc2xndF9pbmZvKSk7CisJCWluZm8tPm1hZ2ljID0gTUdTTF9NQUdJQzsKKwkJSU5JVF9XT1JLKCZpbmZvLT50YXNrLCBiaF9oYW5kbGVyLCBpbmZvKTsKKwkJaW5mby0+bWF4X2ZyYW1lX3NpemUgPSA0MDk2OworCQlpbmZvLT5yYXdfcnhfc2l6ZSA9IERNQUJVRlNJWkU7CisJCWluZm8tPmNsb3NlX2RlbGF5ID0gNSpIWi8xMDsKKwkJaW5mby0+Y2xvc2luZ193YWl0ID0gMzAqSFo7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPm9wZW5fd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmNsb3NlX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5zdGF0dXNfZXZlbnRfd2FpdF9xKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+ZXZlbnRfd2FpdF9xKTsKKwkJc3Bpbl9sb2NrX2luaXQoJmluZm8tPm5ldGxvY2spOworCQltZW1jcHkoJmluZm8tPnBhcmFtcywmZGVmYXVsdF9wYXJhbXMsc2l6ZW9mKE1HU0xfUEFSQU1TKSk7CisJCWluZm8tPmlkbGVfbW9kZSA9IEhETENfVFhJRExFX0ZMQUdTOworCQlpbmZvLT5hZGFwdGVyX251bSA9IGFkYXB0ZXJfbnVtOworCQlpbmZvLT5wb3J0X251bSA9IHBvcnRfbnVtOworCisJCWluaXRfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsKKwkJaW5mby0+dHhfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWluZm87CisJCWluZm8tPnR4X3RpbWVyLmZ1bmN0aW9uID0gdHhfdGltZW91dDsKKworCQlpbml0X3RpbWVyKCZpbmZvLT5yeF90aW1lcik7CisJCWluZm8tPnJ4X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpbmZvOworCQlpbmZvLT5yeF90aW1lci5mdW5jdGlvbiA9IHJ4X3RpbWVvdXQ7CisKKwkJLyogQ29weSBjb25maWd1cmF0aW9uIGluZm8gdG8gZGV2aWNlIGluc3RhbmNlIGRhdGEgKi8KKwkJaW5mby0+cGRldiA9IHBkZXY7CisJCWluZm8tPmlycV9sZXZlbCA9IHBkZXYtPmlycTsKKwkJaW5mby0+cGh5c19yZWdfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LDApOworCisJCWluZm8tPmJ1c190eXBlID0gTUdTTF9CVVNfVFlQRV9QQ0k7CisJCWluZm8tPmlycV9mbGFncyA9IFNBX1NISVJROworCisJCWluZm8tPmluaXRfZXJyb3IgPSAtMTsgLyogYXNzdW1lIGVycm9yLCBzZXQgdG8gMCBvbiBzdWNjZXNzZnVsIGluaXQgKi8KKwl9CisKKwlyZXR1cm4gaW5mbzsKK30KKworc3RhdGljIHZvaWQgZGV2aWNlX2luaXQoaW50IGFkYXB0ZXJfbnVtLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3Qgc2xndF9pbmZvICpwb3J0X2FycmF5W1NMR1RfTUFYX1BPUlRTXTsKKwlpbnQgaTsKKwlpbnQgcG9ydF9jb3VudCA9IDE7CisKKwlpZiAocGRldi0+ZGV2aWNlID09IFNZTkNMSU5LX0dUNF9ERVZJQ0VfSUQpCisJCXBvcnRfY291bnQgPSA0OworCisJLyogYWxsb2NhdGUgZGV2aWNlIGluc3RhbmNlcyBmb3IgYWxsIHBvcnRzICovCisJZm9yIChpPTA7IGkgPCBwb3J0X2NvdW50OyArK2kpIHsKKwkJcG9ydF9hcnJheVtpXSA9IGFsbG9jX2RldihhZGFwdGVyX251bSwgaSwgcGRldik7CisJCWlmIChwb3J0X2FycmF5W2ldID09IE5VTEwpIHsKKwkJCWZvciAoLS1pOyBpID49IDA7IC0taSkKKwkJCQlrZnJlZShwb3J0X2FycmF5W2ldKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIGdpdmUgY29weSBvZiBwb3J0X2FycmF5IHRvIGFsbCBwb3J0cyBhbmQgYWRkIHRvIGRldmljZSBsaXN0ICAqLworCWZvciAoaT0wOyBpIDwgcG9ydF9jb3VudDsgKytpKSB7CisJCW1lbWNweShwb3J0X2FycmF5W2ldLT5wb3J0X2FycmF5LCBwb3J0X2FycmF5LCBzaXplb2YocG9ydF9hcnJheSkpOworCQlhZGRfZGV2aWNlKHBvcnRfYXJyYXlbaV0pOworCQlwb3J0X2FycmF5W2ldLT5wb3J0X2NvdW50ID0gcG9ydF9jb3VudDsKKwkJc3Bpbl9sb2NrX2luaXQoJnBvcnRfYXJyYXlbaV0tPmxvY2spOworCX0KKworCS8qIEFsbG9jYXRlIGFuZCBjbGFpbSBhZGFwdGVyIHJlc291cmNlcyAqLworCWlmICghY2xhaW1fcmVzb3VyY2VzKHBvcnRfYXJyYXlbMF0pKSB7CisKKwkJYWxsb2NfZG1hX2J1ZnMocG9ydF9hcnJheVswXSk7CisKKwkJLyogY29weSByZXNvdXJjZSBpbmZvcm1hdGlvbiBmcm9tIGZpcnN0IHBvcnQgdG8gb3RoZXJzICovCisJCWZvciAoaSA9IDE7IGkgPCBwb3J0X2NvdW50OyArK2kpIHsKKwkJCXBvcnRfYXJyYXlbaV0tPmxvY2sgICAgICA9IHBvcnRfYXJyYXlbMF0tPmxvY2s7CisJCQlwb3J0X2FycmF5W2ldLT5pcnFfbGV2ZWwgPSBwb3J0X2FycmF5WzBdLT5pcnFfbGV2ZWw7CisJCQlwb3J0X2FycmF5W2ldLT5yZWdfYWRkciAgPSBwb3J0X2FycmF5WzBdLT5yZWdfYWRkcjsKKwkJCWFsbG9jX2RtYV9idWZzKHBvcnRfYXJyYXlbaV0pOworCQl9CisKKwkJaWYgKHJlcXVlc3RfaXJxKHBvcnRfYXJyYXlbMF0tPmlycV9sZXZlbCwKKwkJCQkJc2xndF9pbnRlcnJ1cHQsCisJCQkJCXBvcnRfYXJyYXlbMF0tPmlycV9mbGFncywKKwkJCQkJcG9ydF9hcnJheVswXS0+ZGV2aWNlX25hbWUsCisJCQkJCXBvcnRfYXJyYXlbMF0pIDwgMCkgeworCQkJREJHRVJSKCgiJXMgcmVxdWVzdF9pcnEgZmFpbGVkIElSUT0lZFxuIiwKKwkJCQlwb3J0X2FycmF5WzBdLT5kZXZpY2VfbmFtZSwKKwkJCQlwb3J0X2FycmF5WzBdLT5pcnFfbGV2ZWwpKTsKKwkJfSBlbHNlIHsKKwkJCXBvcnRfYXJyYXlbMF0tPmlycV9yZXF1ZXN0ZWQgPSAxOworCQkJYWRhcHRlcl90ZXN0KHBvcnRfYXJyYXlbMF0pOworCQkJZm9yIChpPTEgOyBpIDwgcG9ydF9jb3VudCA7IGkrKykKKwkJCQlwb3J0X2FycmF5W2ldLT5pbml0X2Vycm9yID0gcG9ydF9hcnJheVswXS0+aW5pdF9lcnJvcjsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBfX2RldmluaXQgaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldikpIHsKKwkJcHJpbnRrKCJlcnJvciBlbmFibGluZyBwY2kgZGV2aWNlICVwXG4iLCBkZXYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcGNpX3NldF9tYXN0ZXIoZGV2KTsKKwlkZXZpY2VfaW5pdChzbGd0X2RldmljZV9jb3VudCwgZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHJlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKK30KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBvcHMgPSB7CisJLm9wZW4gPSBvcGVuLAorCS5jbG9zZSA9IGNsb3NlLAorCS53cml0ZSA9IHdyaXRlLAorCS5wdXRfY2hhciA9IHB1dF9jaGFyLAorCS5mbHVzaF9jaGFycyA9IGZsdXNoX2NoYXJzLAorCS53cml0ZV9yb29tID0gd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gY2hhcnNfaW5fYnVmZmVyLAorCS5mbHVzaF9idWZmZXIgPSBmbHVzaF9idWZmZXIsCisJLmlvY3RsID0gaW9jdGwsCisJLnRocm90dGxlID0gdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgPSB1bnRocm90dGxlLAorCS5zZW5kX3hjaGFyID0gc2VuZF94Y2hhciwKKwkuYnJlYWtfY3RsID0gc2V0X2JyZWFrLAorCS53YWl0X3VudGlsX3NlbnQgPSB3YWl0X3VudGlsX3NlbnQsCisgCS5yZWFkX3Byb2MgPSByZWFkX3Byb2MsCisJLnNldF90ZXJtaW9zID0gc2V0X3Rlcm1pb3MsCisJLnN0b3AgPSB0eF9ob2xkLAorCS5zdGFydCA9IHR4X3JlbGVhc2UsCisJLmhhbmd1cCA9IGhhbmd1cCwKKwkudGlvY21nZXQgPSB0aW9jbWdldCwKKwkudGlvY21zZXQgPSB0aW9jbXNldCwKK307CisKK3N0YXRpYyB2b2lkIHNsZ3RfY2xlYW51cCh2b2lkKQoreworCWludCByYzsKKwlzdHJ1Y3Qgc2xndF9pbmZvICppbmZvOworCXN0cnVjdCBzbGd0X2luZm8gKnRtcDsKKworCXByaW50aygidW5sb2FkICVzICVzXG4iLCBkcml2ZXJfbmFtZSwgZHJpdmVyX3ZlcnNpb24pOworCisJaWYgKHNlcmlhbF9kcml2ZXIpIHsKKwkJaWYgKChyYyA9IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihzZXJpYWxfZHJpdmVyKSkpCisJCQlEQkdFUlIoKCJ0dHlfdW5yZWdpc3Rlcl9kcml2ZXIgZXJyb3I9JWRcbiIsIHJjKSk7CisJCXB1dF90dHlfZHJpdmVyKHNlcmlhbF9kcml2ZXIpOworCX0KKworCS8qIHJlc2V0IGRldmljZXMgKi8KKwlpbmZvID0gc2xndF9kZXZpY2VfbGlzdDsKKwl3aGlsZShpbmZvKSB7CisJCXJlc2V0X3BvcnQoaW5mbyk7CisJCWluZm8gPSBpbmZvLT5uZXh0X2RldmljZTsKKwl9CisKKwkvKiByZWxlYXNlIGRldmljZXMgKi8KKwlpbmZvID0gc2xndF9kZXZpY2VfbGlzdDsKKwl3aGlsZShpbmZvKSB7CisjaWZkZWYgQ09ORklHX0hETEMKKwkJaGRsY2Rldl9leGl0KGluZm8pOworI2VuZGlmCisJCWZyZWVfZG1hX2J1ZnMoaW5mbyk7CisJCWZyZWVfdG1wX3JidWYoaW5mbyk7CisJCWlmIChpbmZvLT5wb3J0X251bSA9PSAwKQorCQkJcmVsZWFzZV9yZXNvdXJjZXMoaW5mbyk7CisJCXRtcCA9IGluZm87CisJCWluZm8gPSBpbmZvLT5uZXh0X2RldmljZTsKKwkJa2ZyZWUodG1wKTsKKwl9CisKKwlpZiAocGNpX3JlZ2lzdGVyZWQpCisJCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcGNpX2RyaXZlcik7Cit9CisKKy8qCisgKiAgRHJpdmVyIGluaXRpYWxpemF0aW9uIGVudHJ5IHBvaW50LgorICovCitzdGF0aWMgaW50IF9faW5pdCBzbGd0X2luaXQodm9pZCkKK3sKKwlpbnQgcmM7CisKKyAJcHJpbnRrKCIlcyAlc1xuIiwgZHJpdmVyX25hbWUsIGRyaXZlcl92ZXJzaW9uKTsKKworCXNsZ3RfZGV2aWNlX2NvdW50ID0gMDsKKwlpZiAoKHJjID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcGNpX2RyaXZlcikpIDwgMCkgeworCQlwcmludGsoIiVzIHBjaV9yZWdpc3Rlcl9kcml2ZXIgZXJyb3I9JWRcbiIsIGRyaXZlcl9uYW1lLCByYyk7CisJCXJldHVybiByYzsKKwl9CisJcGNpX3JlZ2lzdGVyZWQgPSAxOworCisJaWYgKCFzbGd0X2RldmljZV9saXN0KSB7CisJCXByaW50aygiJXMgbm8gZGV2aWNlcyBmb3VuZFxuIixkcml2ZXJfbmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXNlcmlhbF9kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKE1BWF9ERVZJQ0VTKTsKKwlpZiAoIXNlcmlhbF9kcml2ZXIpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIHR0eV9kcml2ZXIgc3RydWN0dXJlICovCisKKwlzZXJpYWxfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCXNlcmlhbF9kcml2ZXItPmRyaXZlcl9uYW1lID0gdHR5X2RyaXZlcl9uYW1lOworCXNlcmlhbF9kcml2ZXItPm5hbWUgPSB0dHlfZGV2X3ByZWZpeDsKKwlzZXJpYWxfZHJpdmVyLT5tYWpvciA9IHR0eW1ham9yOworCXNlcmlhbF9kcml2ZXItPm1pbm9yX3N0YXJ0ID0gNjQ7CisJc2VyaWFsX2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJc2VyaWFsX2RyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlzZXJpYWxfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJc2VyaWFsX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPQorCQlCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisJc2VyaWFsX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOworCXR0eV9zZXRfb3BlcmF0aW9ucyhzZXJpYWxfZHJpdmVyLCAmb3BzKTsKKwlpZiAoKHJjID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihzZXJpYWxfZHJpdmVyKSkgPCAwKSB7CisJCURCR0VSUigoIiVzIGNhbid0IHJlZ2lzdGVyIHNlcmlhbCBkcml2ZXJcbiIsIGRyaXZlcl9uYW1lKSk7CisJCXB1dF90dHlfZHJpdmVyKHNlcmlhbF9kcml2ZXIpOworCQlzZXJpYWxfZHJpdmVyID0gTlVMTDsKKwkJZ290byBlcnJvcjsKKwl9CisKKyAJcHJpbnRrKCIlcyAlcywgdHR5IG1ham9yIyVkXG4iLAorCQlkcml2ZXJfbmFtZSwgZHJpdmVyX3ZlcnNpb24sCisJCXNlcmlhbF9kcml2ZXItPm1ham9yKTsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlzbGd0X2NsZWFudXAoKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbGd0X2V4aXQodm9pZCkKK3sKKwlzbGd0X2NsZWFudXAoKTsKK30KKworbW9kdWxlX2luaXQoc2xndF9pbml0KTsKK21vZHVsZV9leGl0KHNsZ3RfZXhpdCk7CisKKy8qCisgKiByZWdpc3RlciBhY2Nlc3Mgcm91dGluZXMKKyAqLworCisjZGVmaW5lIENBTENfUkVHQUREUigpIFwKKwl1bnNpZ25lZCBsb25nIHJlZ19hZGRyID0gKCh1bnNpZ25lZCBsb25nKWluZm8tPnJlZ19hZGRyKSArIGFkZHI7IFwKKwlpZiAoYWRkciA+PSAweDgwKSBcCisJCXJlZ19hZGRyICs9IChpbmZvLT5wb3J0X251bSkgKiAzMjsKKworc3RhdGljIF9fdTggcmRfcmVnOChzdHJ1Y3Qgc2xndF9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgYWRkcikKK3sKKwlDQUxDX1JFR0FERFIoKTsKKwlyZXR1cm4gcmVhZGIoKHZvaWQgX19pb21lbSAqKXJlZ19hZGRyKTsKK30KKworc3RhdGljIHZvaWQgd3JfcmVnOChzdHJ1Y3Qgc2xndF9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgYWRkciwgX191OCB2YWx1ZSkKK3sKKwlDQUxDX1JFR0FERFIoKTsKKwl3cml0ZWIodmFsdWUsICh2b2lkIF9faW9tZW0gKilyZWdfYWRkcik7Cit9CisKK3N0YXRpYyBfX3UxNiByZF9yZWcxNihzdHJ1Y3Qgc2xndF9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgYWRkcikKK3sKKwlDQUxDX1JFR0FERFIoKTsKKwlyZXR1cm4gcmVhZHcoKHZvaWQgX19pb21lbSAqKXJlZ19hZGRyKTsKK30KKworc3RhdGljIHZvaWQgd3JfcmVnMTYoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGFkZHIsIF9fdTE2IHZhbHVlKQoreworCUNBTENfUkVHQUREUigpOworCXdyaXRldyh2YWx1ZSwgKHZvaWQgX19pb21lbSAqKXJlZ19hZGRyKTsKK30KKworc3RhdGljIF9fdTMyIHJkX3JlZzMyKHN0cnVjdCBzbGd0X2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBhZGRyKQoreworCUNBTENfUkVHQUREUigpOworCXJldHVybiByZWFkbCgodm9pZCBfX2lvbWVtICopcmVnX2FkZHIpOworfQorCitzdGF0aWMgdm9pZCB3cl9yZWczMihzdHJ1Y3Qgc2xndF9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgYWRkciwgX191MzIgdmFsdWUpCit7CisJQ0FMQ19SRUdBRERSKCk7CisJd3JpdGVsKHZhbHVlLCAodm9pZCBfX2lvbWVtICopcmVnX2FkZHIpOworfQorCitzdGF0aWMgdm9pZCByZG1hX3Jlc2V0KHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBzZXQgcmVzZXQgYml0ICovCisJd3JfcmVnMzIoaW5mbywgUkRDU1IsIEJJVDEpOworCisJLyogd2FpdCBmb3IgZW5hYmxlIGJpdCBjbGVhcmVkICovCisJZm9yKGk9MCA7IGkgPCAxMDAwIDsgaSsrKQorCQlpZiAoIShyZF9yZWczMihpbmZvLCBSRENTUikgJiBCSVQwKSkKKwkJCWJyZWFrOworfQorCitzdGF0aWMgdm9pZCB0ZG1hX3Jlc2V0KHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBzZXQgcmVzZXQgYml0ICovCisJd3JfcmVnMzIoaW5mbywgVERDU1IsIEJJVDEpOworCisJLyogd2FpdCBmb3IgZW5hYmxlIGJpdCBjbGVhcmVkICovCisJZm9yKGk9MCA7IGkgPCAxMDAwIDsgaSsrKQorCQlpZiAoIShyZF9yZWczMihpbmZvLCBURENTUikgJiBCSVQwKSkKKwkJCWJyZWFrOworfQorCisvKgorICogZW5hYmxlIGludGVybmFsIGxvb3BiYWNrCisgKiBUeENMSyBhbmQgUnhDTEsgYXJlIGdlbmVyYXRlZCBmcm9tIEJSRworICogYW5kIFR4RCBpcyBsb29wZWQgYmFjayB0byBSeEQgaW50ZXJuYWxseS4KKyAqLworc3RhdGljIHZvaWQgZW5hYmxlX2xvb3BiYWNrKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCit7CisJLyogU0NSIChzZXJpYWwgY29udHJvbCkgQklUMj1sb29vcGJhY2sgZW5hYmxlICovCisJd3JfcmVnMTYoaW5mbywgU0NSLCAodW5zaWduZWQgc2hvcnQpKHJkX3JlZzE2KGluZm8sIFNDUikgfCBCSVQyKSk7CisKKwlpZiAoaW5mby0+cGFyYW1zLm1vZGUgIT0gTUdTTF9NT0RFX0FTWU5DKSB7CisJCS8qIENDUiAoY2xvY2sgY29udHJvbCkKKwkJICogMDcuLjA1ICB0eCBjbG9jayBzb3VyY2UgKDAxMCA9IEJSRykKKwkJICogMDQuLjAyICByeCBjbG9jayBzb3VyY2UgKDAxMCA9IEJSRykKKwkJICogMDEgICAgICBhdXhjbGsgZW5hYmxlICAgKDAgPSBkaXNhYmxlKQorCQkgKiAwMCAgICAgIEJSRyBlbmFibGUgICAgICAoMSA9IGVuYWJsZSkKKwkJICoKKwkJICogMDEwMCAxMDAxCisJCSAqLworCQl3cl9yZWc4KGluZm8sIENDUiwgMHg0OSk7CisKKwkJLyogc2V0IHNwZWVkIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSBkZWZhdWx0ICovCisJCWlmIChpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQpCisJCQlzZXRfcmF0ZShpbmZvLCBpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQpOworCQllbHNlCisJCQlzZXRfcmF0ZShpbmZvLCAzNjg2NDAwKTsKKwl9Cit9CisKKy8qCisgKiAgc2V0IGJhdWQgcmF0ZSBnZW5lcmF0b3IgdG8gc3BlY2lmaWVkIHJhdGUKKyAqLworc3RhdGljIHZvaWQgc2V0X3JhdGUoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbywgdTMyIHJhdGUpCit7CisJdW5zaWduZWQgaW50IGRpdjsKKwlzdGF0aWMgdW5zaWduZWQgaW50IG9zYyA9IDE0NzQ1NjAwOworCisJLyogZGl2ID0gb3NjL3JhdGUgLSAxCisJICoKKwkgKiBSb3VuZCBkaXYgdXAgaWYgb3NjL3JhdGUgaXMgbm90IGludGVnZXIgdG8KKwkgKiBmb3JjZSB0byBuZXh0IHNsb3dlc3QgcmF0ZS4KKwkgKi8KKworCWlmIChyYXRlKSB7CisJCWRpdiA9IG9zYy9yYXRlOworCQlpZiAoIShvc2MgJSByYXRlKSAmJiBkaXYpCisJCQlkaXYtLTsKKwkJd3JfcmVnMTYoaW5mbywgQkRSLCAodW5zaWduZWQgc2hvcnQpZGl2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJ4X3N0b3Aoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwkvKiBkaXNhYmxlIGFuZCByZXNldCByZWNlaXZlciAqLworCXZhbCA9IHJkX3JlZzE2KGluZm8sIFJDUikgJiB+QklUMTsgICAgICAgICAgLyogY2xlYXIgZW5hYmxlIGJpdCAqLworCXdyX3JlZzE2KGluZm8sIFJDUiwgKHVuc2lnbmVkIHNob3J0KSh2YWwgfCBCSVQyKSk7IC8qIHNldCByZXNldCBiaXQgKi8KKwl3cl9yZWcxNihpbmZvLCBSQ1IsIHZhbCk7ICAgICAgICAgICAgICAgICAgLyogY2xlYXIgcmVzZXQgYml0ICovCisKKwlzbGd0X2lycV9vZmYoaW5mbywgSVJRX1JYT1ZFUiArIElSUV9SWERBVEEgKyBJUlFfUlhJRExFKTsKKworCS8qIGNsZWFyIHBlbmRpbmcgcnggaW50ZXJydXB0cyAqLworCXdyX3JlZzE2KGluZm8sIFNTUiwgSVJRX1JYSURMRSArIElSUV9SWE9WRVIpOworCisJcmRtYV9yZXNldChpbmZvKTsKKworCWluZm8tPnJ4X2VuYWJsZWQgPSAwOworCWluZm8tPnJ4X3Jlc3RhcnQgPSAwOworfQorCitzdGF0aWMgdm9pZCByeF9zdGFydChzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKQoreworCXVuc2lnbmVkIHNob3J0IHZhbDsKKworCXNsZ3RfaXJxX29mZihpbmZvLCBJUlFfUlhPVkVSICsgSVJRX1JYREFUQSk7CisKKwkvKiBjbGVhciBwZW5kaW5nIHJ4IG92ZXJydW4gSVJRICovCisJd3JfcmVnMTYoaW5mbywgU1NSLCBJUlFfUlhPVkVSKTsKKworCS8qIHJlc2V0IGFuZCBkaXNhYmxlIHJlY2VpdmVyICovCisJdmFsID0gcmRfcmVnMTYoaW5mbywgUkNSKSAmIH5CSVQxOyAvKiBjbGVhciBlbmFibGUgYml0ICovCisJd3JfcmVnMTYoaW5mbywgUkNSLCAodW5zaWduZWQgc2hvcnQpKHZhbCB8IEJJVDIpKTsgLyogc2V0IHJlc2V0IGJpdCAqLworCXdyX3JlZzE2KGluZm8sIFJDUiwgdmFsKTsgICAgICAgICAgICAgICAgICAvKiBjbGVhciByZXNldCBiaXQgKi8KKworCXJkbWFfcmVzZXQoaW5mbyk7CisJcmVzZXRfcmJ1ZnMoaW5mbyk7CisKKwkvKiBzZXQgMXN0IGRlc2NyaXB0b3IgYWRkcmVzcyAqLworCXdyX3JlZzMyKGluZm8sIFJEREFSLCBpbmZvLT5yYnVmc1swXS5wZGVzYyk7CisKKwlpZiAoaW5mby0+cGFyYW1zLm1vZGUgIT0gTUdTTF9NT0RFX0FTWU5DKSB7CisJCS8qIGVuYWJsZSByeCBETUEgYW5kIERNQSBpbnRlcnJ1cHQgKi8KKwkJd3JfcmVnMzIoaW5mbywgUkRDU1IsIChCSVQyICsgQklUMCkpOworCX0gZWxzZSB7CisJCS8qIGVuYWJsZSBzYXZpbmcgb2Ygcnggc3RhdHVzLCByeCBETUEgYW5kIERNQSBpbnRlcnJ1cHQgKi8KKwkJd3JfcmVnMzIoaW5mbywgUkRDU1IsIChCSVQ2ICsgQklUMiArIEJJVDApKTsKKwl9CisKKwlzbGd0X2lycV9vbihpbmZvLCBJUlFfUlhPVkVSKTsKKworCS8qIGVuYWJsZSByZWNlaXZlciAqLworCXdyX3JlZzE2KGluZm8sIFJDUiwgKHVuc2lnbmVkIHNob3J0KShyZF9yZWcxNihpbmZvLCBSQ1IpIHwgQklUMSkpOworCisJaW5mby0+cnhfcmVzdGFydCA9IDA7CisJaW5mby0+cnhfZW5hYmxlZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHR4X3N0YXJ0KHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCit7CisJaWYgKCFpbmZvLT50eF9lbmFibGVkKSB7CisJCXdyX3JlZzE2KGluZm8sIFRDUiwKKwkJCSh1bnNpZ25lZCBzaG9ydCkocmRfcmVnMTYoaW5mbywgVENSKSB8IEJJVDEpKTsKKwkJaW5mby0+dHhfZW5hYmxlZCA9IFRSVUU7CisJfQorCisJaWYgKGluZm8tPnR4X2NvdW50KSB7CisJCWluZm8tPmRyb3BfcnRzX29uX3R4X2RvbmUgPSAwOworCisJCWlmIChpbmZvLT5wYXJhbXMubW9kZSAhPSBNR1NMX01PREVfQVNZTkMpIHsKKwkJCWlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfQVVUT19SVFMpIHsKKwkJCQlnZXRfc2lnbmFscyhpbmZvKTsKKwkJCQlpZiAoIShpbmZvLT5zaWduYWxzICYgU2VyaWFsU2lnbmFsX1JUUykpIHsKKwkJCQkJaW5mby0+c2lnbmFscyB8PSBTZXJpYWxTaWduYWxfUlRTOworCQkJCQlzZXRfc2lnbmFscyhpbmZvKTsKKwkJCQkJaW5mby0+ZHJvcF9ydHNfb25fdHhfZG9uZSA9IDE7CisJCQkJfQorCQkJfQorCisJCQlzbGd0X2lycV9vZmYoaW5mbywgSVJRX1RYREFUQSk7CisJCQlzbGd0X2lycV9vbihpbmZvLCBJUlFfVFhVTkRFUiArIElSUV9UWElETEUpOworCQkJLyogY2xlYXIgdHggaWRsZSBhbmQgdW5kZXJydW4gc3RhdHVzIGJpdHMgKi8KKwkJCXdyX3JlZzE2KGluZm8sIFNTUiwgKHVuc2lnbmVkIHNob3J0KShJUlFfVFhJRExFICsgSVJRX1RYVU5ERVIpKTsKKworCQkJaWYgKCEocmRfcmVnMzIoaW5mbywgVERDU1IpICYgQklUMCkpIHsKKwkJCQkvKiB0eCBETUEgc3RvcHBlZCwgcmVzdGFydCB0eCBETUEgKi8KKwkJCQl0ZG1hX3Jlc2V0KGluZm8pOworCQkJCS8qIHNldCAxc3QgZGVzY3JpcHRvciBhZGRyZXNzICovCisJCQkJd3JfcmVnMzIoaW5mbywgVEREQVIsIGluZm8tPnRidWZzW2luZm8tPnRidWZfc3RhcnRdLnBkZXNjKTsKKwkJCQlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX1JBVykKKwkJCQkJd3JfcmVnMzIoaW5mbywgVERDU1IsIEJJVDIgKyBCSVQwKTsgLyogSVJRICsgRE1BIGVuYWJsZSAqLworCQkJCWVsc2UKKwkJCQkJd3JfcmVnMzIoaW5mbywgVERDU1IsIEJJVDApOyAvKiBETUEgZW5hYmxlICovCisJCQl9CisKKwkJCWlmIChpbmZvLT5wYXJhbXMubW9kZSAhPSBNR1NMX01PREVfUkFXKSB7CisJCQkJaW5mby0+dHhfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwMDApOworCQkJCWFkZF90aW1lcigmaW5mby0+dHhfdGltZXIpOworCQkJfQorCQl9IGVsc2UgeworCQkJdGRtYV9yZXNldChpbmZvKTsKKwkJCS8qIHNldCAxc3QgZGVzY3JpcHRvciBhZGRyZXNzICovCisJCQl3cl9yZWczMihpbmZvLCBURERBUiwgaW5mby0+dGJ1ZnNbaW5mby0+dGJ1Zl9zdGFydF0ucGRlc2MpOworCisJCQlzbGd0X2lycV9vZmYoaW5mbywgSVJRX1RYREFUQSk7CisJCQlzbGd0X2lycV9vbihpbmZvLCBJUlFfVFhJRExFKTsKKwkJCS8qIGNsZWFyIHR4IGlkbGUgc3RhdHVzIGJpdCAqLworCQkJd3JfcmVnMTYoaW5mbywgU1NSLCBJUlFfVFhJRExFKTsKKworCQkJLyogZW5hYmxlIHR4IERNQSAqLworCQkJd3JfcmVnMzIoaW5mbywgVERDU1IsIEJJVDApOworCQl9CisKKwkJaW5mby0+dHhfYWN0aXZlID0gMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHR4X3N0b3Aoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwlkZWxfdGltZXIoJmluZm8tPnR4X3RpbWVyKTsKKworCXRkbWFfcmVzZXQoaW5mbyk7CisKKwkvKiByZXNldCBhbmQgZGlzYWJsZSB0cmFuc21pdHRlciAqLworCXZhbCA9IHJkX3JlZzE2KGluZm8sIFRDUikgJiB+QklUMTsgICAgICAgICAgLyogY2xlYXIgZW5hYmxlIGJpdCAqLworCXdyX3JlZzE2KGluZm8sIFRDUiwgKHVuc2lnbmVkIHNob3J0KSh2YWwgfCBCSVQyKSk7IC8qIHNldCByZXNldCBiaXQgKi8KKwl3cl9yZWcxNihpbmZvLCBUQ1IsIHZhbCk7ICAgICAgICAgICAgICAgICAgLyogY2xlYXIgcmVzZXQgKi8KKworCXNsZ3RfaXJxX29mZihpbmZvLCBJUlFfVFhEQVRBICsgSVJRX1RYSURMRSArIElSUV9UWFVOREVSKTsKKworCS8qIGNsZWFyIHR4IGlkbGUgYW5kIHVuZGVycnVuIHN0YXR1cyBiaXQgKi8KKwl3cl9yZWcxNihpbmZvLCBTU1IsICh1bnNpZ25lZCBzaG9ydCkoSVJRX1RYSURMRSArIElSUV9UWFVOREVSKSk7CisKKwlyZXNldF90YnVmcyhpbmZvKTsKKworCWluZm8tPnR4X2VuYWJsZWQgPSAwOworCWluZm8tPnR4X2FjdGl2ZSAgPSAwOworfQorCitzdGF0aWMgdm9pZCByZXNldF9wb3J0KHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCit7CisJaWYgKCFpbmZvLT5yZWdfYWRkcikKKwkJcmV0dXJuOworCisJdHhfc3RvcChpbmZvKTsKKwlyeF9zdG9wKGluZm8pOworCisJaW5mby0+c2lnbmFscyAmPSB+KFNlcmlhbFNpZ25hbF9EVFIgKyBTZXJpYWxTaWduYWxfUlRTKTsKKwlzZXRfc2lnbmFscyhpbmZvKTsKKworCXNsZ3RfaXJxX29mZihpbmZvLCBJUlFfQUxMIHwgSVJRX01BU1RFUik7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X2FkYXB0ZXIoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKK3sKKwlpbnQgaTsKKwlmb3IgKGk9MDsgaSA8IGluZm8tPnBvcnRfY291bnQ7ICsraSkgeworCQlpZiAoaW5mby0+cG9ydF9hcnJheVtpXSkKKwkJCXJlc2V0X3BvcnQoaW5mby0+cG9ydF9hcnJheVtpXSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhc3luY19tb2RlKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCit7CisgIAl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwlzbGd0X2lycV9vZmYoaW5mbywgSVJRX0FMTCB8IElSUV9NQVNURVIpOworCXR4X3N0b3AoaW5mbyk7CisJcnhfc3RvcChpbmZvKTsKKworCS8qIFRDUiAodHggY29udHJvbCkKKwkgKgorCSAqIDE1Li4xMyAgbW9kZSwgMDEwPWFzeW5jCisJICogMTIuLjEwICBlbmNvZGluZywgMDAwPU5SWgorCSAqIDA5ICAgICAgcGFyaXR5IGVuYWJsZQorCSAqIDA4ICAgICAgMT1vZGQgcGFyaXR5LCAwPWV2ZW4gcGFyaXR5CisJICogMDcgICAgICAxPVJUUyBkcml2ZXIgY29udHJvbAorCSAqIDA2ICAgICAgMT1icmVhayBlbmFibGUKKwkgKiAwNS4uMDQgIGNoYXJhY3RlciBsZW5ndGgKKwkgKiAgICAgICAgIDAwPTUgYml0cworCSAqICAgICAgICAgMDE9NiBiaXRzCisJICogICAgICAgICAxMD03IGJpdHMKKwkgKiAgICAgICAgIDExPTggYml0cworCSAqIDAzICAgICAgMD0xIHN0b3AgYml0LCAxPTIgc3RvcCBiaXRzCisJICogMDIgICAgICByZXNldAorCSAqIDAxICAgICAgZW5hYmxlCisJICogMDAgICAgICBhdXRvLUNUUyBlbmFibGUKKwkgKi8KKwl2YWwgPSAweDQwMDA7CisKKwlpZiAoaW5mby0+aWZfbW9kZSAmIE1HU0xfSU5URVJGQUNFX1JUU19FTikKKwkJdmFsIHw9IEJJVDc7CisKKwlpZiAoaW5mby0+cGFyYW1zLnBhcml0eSAhPSBBU1lOQ19QQVJJVFlfTk9ORSkgeworCQl2YWwgfD0gQklUOTsKKwkJaWYgKGluZm8tPnBhcmFtcy5wYXJpdHkgPT0gQVNZTkNfUEFSSVRZX09ERCkKKwkJCXZhbCB8PSBCSVQ4OworCX0KKworCXN3aXRjaCAoaW5mby0+cGFyYW1zLmRhdGFfYml0cykKKwl7CisJY2FzZSA2OiB2YWwgfD0gQklUNDsgYnJlYWs7CisJY2FzZSA3OiB2YWwgfD0gQklUNTsgYnJlYWs7CisJY2FzZSA4OiB2YWwgfD0gQklUNSArIEJJVDQ7IGJyZWFrOworCX0KKworCWlmIChpbmZvLT5wYXJhbXMuc3RvcF9iaXRzICE9IDEpCisJCXZhbCB8PSBCSVQzOworCisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19BVVRPX0NUUykKKwkJdmFsIHw9IEJJVDA7CisKKwl3cl9yZWcxNihpbmZvLCBUQ1IsIHZhbCk7CisKKwkvKiBSQ1IgKHJ4IGNvbnRyb2wpCisJICoKKwkgKiAxNS4uMTMgIG1vZGUsIDAxMD1hc3luYworCSAqIDEyLi4xMCAgZW5jb2RpbmcsIDAwMD1OUloKKwkgKiAwOSAgICAgIHBhcml0eSBlbmFibGUKKwkgKiAwOCAgICAgIDE9b2RkIHBhcml0eSwgMD1ldmVuIHBhcml0eQorCSAqIDA3Li4wNiAgcmVzZXJ2ZWQsIG11c3QgYmUgMAorCSAqIDA1Li4wNCAgY2hhcmFjdGVyIGxlbmd0aAorCSAqICAgICAgICAgMDA9NSBiaXRzCisJICogICAgICAgICAwMT02IGJpdHMKKwkgKiAgICAgICAgIDEwPTcgYml0cworCSAqICAgICAgICAgMTE9OCBiaXRzCisJICogMDMgICAgICByZXNlcnZlZCwgbXVzdCBiZSB6ZXJvCisJICogMDIgICAgICByZXNldAorCSAqIDAxICAgICAgZW5hYmxlCisJICogMDAgICAgICBhdXRvLURDRCBlbmFibGUKKwkgKi8KKwl2YWwgPSAweDQwMDA7CisKKwlpZiAoaW5mby0+cGFyYW1zLnBhcml0eSAhPSBBU1lOQ19QQVJJVFlfTk9ORSkgeworCQl2YWwgfD0gQklUOTsKKwkJaWYgKGluZm8tPnBhcmFtcy5wYXJpdHkgPT0gQVNZTkNfUEFSSVRZX09ERCkKKwkJCXZhbCB8PSBCSVQ4OworCX0KKworCXN3aXRjaCAoaW5mby0+cGFyYW1zLmRhdGFfYml0cykKKwl7CisJY2FzZSA2OiB2YWwgfD0gQklUNDsgYnJlYWs7CisJY2FzZSA3OiB2YWwgfD0gQklUNTsgYnJlYWs7CisJY2FzZSA4OiB2YWwgfD0gQklUNSArIEJJVDQ7IGJyZWFrOworCX0KKworCWlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfQVVUT19EQ0QpCisJCXZhbCB8PSBCSVQwOworCisJd3JfcmVnMTYoaW5mbywgUkNSLCB2YWwpOworCisJLyogQ0NSIChjbG9jayBjb250cm9sKQorCSAqCisJICogMDcuLjA1ICAwMTEgPSB0eCBjbG9jayBzb3VyY2UgaXMgQlJHLzE2CisJICogMDQuLjAyICAwMTAgPSByeCBjbG9jayBzb3VyY2UgaXMgQlJHCisJICogMDEgICAgICAwID0gYXV4Y2xrIGRpc2FibGVkCisJICogMDAgICAgICAxID0gQlJHIGVuYWJsZWQKKwkgKgorCSAqIDAxMTAgMTAwMQorCSAqLworCXdyX3JlZzgoaW5mbywgQ0NSLCAweDY5KTsKKworCW1zY19zZXRfdmNyKGluZm8pOworCisJdHhfc2V0X2lkbGUoaW5mbyk7CisKKwkvKiBTQ1IgKHNlcmlhbCBjb250cm9sKQorCSAqCisJICogMTUgIDE9dHggcmVxIG9uIEZJRk8gaGFsZiBlbXB0eQorCSAqIDE0ICAxPXJ4IHJlcSBvbiBGSUZPIGhhbGYgZnVsbAorCSAqIDEzICB0eCBkYXRhICBJUlEgZW5hYmxlCisJICogMTIgIHR4IGlkbGUgIElSUSBlbmFibGUKKwkgKiAxMSAgcnggYnJlYWsgb24gSVJRIGVuYWJsZQorCSAqIDEwICByeCBkYXRhICBJUlEgZW5hYmxlCisJICogMDkgIHJ4IGJyZWFrIG9mZiBJUlEgZW5hYmxlCisJICogMDggIG92ZXJydW4gIElSUSBlbmFibGUKKwkgKiAwNyAgRFNSICAgICAgSVJRIGVuYWJsZQorCSAqIDA2ICBDVFMgICAgICBJUlEgZW5hYmxlCisJICogMDUgIERDRCAgICAgIElSUSBlbmFibGUKKwkgKiAwNCAgUkkgICAgICAgSVJRIGVuYWJsZQorCSAqIDAzICByZXNlcnZlZCwgbXVzdCBiZSB6ZXJvCisJICogMDIgIDE9dHhkLT5yeGQgaW50ZXJuYWwgbG9vcGJhY2sgZW5hYmxlCisJICogMDEgIHJlc2VydmVkLCBtdXN0IGJlIHplcm8KKwkgKiAwMCAgMT1tYXN0ZXIgSVJRIGVuYWJsZQorCSAqLworCXZhbCA9IEJJVDE1ICsgQklUMTQgKyBCSVQwOworCXdyX3JlZzE2KGluZm8sIFNDUiwgdmFsKTsKKworCXNsZ3RfaXJxX29uKGluZm8sIElSUV9SWEJSRUFLIHwgSVJRX1JYT1ZFUik7CisKKwlzZXRfcmF0ZShpbmZvLCBpbmZvLT5wYXJhbXMuZGF0YV9yYXRlICogMTYpOworCisJaWYgKGluZm8tPnBhcmFtcy5sb29wYmFjaykKKwkJZW5hYmxlX2xvb3BiYWNrKGluZm8pOworfQorCitzdGF0aWMgdm9pZCBoZGxjX21vZGUoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwlzbGd0X2lycV9vZmYoaW5mbywgSVJRX0FMTCB8IElSUV9NQVNURVIpOworCXR4X3N0b3AoaW5mbyk7CisJcnhfc3RvcChpbmZvKTsKKworCS8qIFRDUiAodHggY29udHJvbCkKKwkgKgorCSAqIDE1Li4xMyAgbW9kZSwgMDAwPUhETEMgMDAxPXJhdyBzeW5jCisJICogMTIuLjEwICBlbmNvZGluZworCSAqIDA5ICAgICAgQ1JDIGVuYWJsZQorCSAqIDA4ICAgICAgQ1JDMzIKKwkgKiAwNyAgICAgIDE9UlRTIGRyaXZlciBjb250cm9sCisJICogMDYgICAgICBwcmVhbWJsZSBlbmFibGUKKwkgKiAwNS4uMDQgIHByZWFtYmxlIGxlbmd0aAorCSAqIDAzICAgICAgc2hhcmUgb3Blbi9jbG9zZSBmbGFnCisJICogMDIgICAgICByZXNldAorCSAqIDAxICAgICAgZW5hYmxlCisJICogMDAgICAgICBhdXRvLUNUUyBlbmFibGUKKwkgKi8KKwl2YWwgPSAwOworCisJaWYgKGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9SQVcpCisJCXZhbCB8PSBCSVQxMzsKKwlpZiAoaW5mby0+aWZfbW9kZSAmIE1HU0xfSU5URVJGQUNFX1JUU19FTikKKwkJdmFsIHw9IEJJVDc7CisKKwlzd2l0Y2goaW5mby0+cGFyYW1zLmVuY29kaW5nKQorCXsKKwljYXNlIEhETENfRU5DT0RJTkdfTlJaQjogICAgICAgICAgdmFsIHw9IEJJVDEwOyBicmVhazsKKwljYXNlIEhETENfRU5DT0RJTkdfTlJaSV9NQVJLOiAgICAgdmFsIHw9IEJJVDExOyBicmVhazsKKwljYXNlIEhETENfRU5DT0RJTkdfTlJaSTogICAgICAgICAgdmFsIHw9IEJJVDExICsgQklUMTA7IGJyZWFrOworCWNhc2UgSERMQ19FTkNPRElOR19CSVBIQVNFX01BUks6ICB2YWwgfD0gQklUMTI7IGJyZWFrOworCWNhc2UgSERMQ19FTkNPRElOR19CSVBIQVNFX1NQQUNFOiB2YWwgfD0gQklUMTIgKyBCSVQxMDsgYnJlYWs7CisJY2FzZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfTEVWRUw6IHZhbCB8PSBCSVQxMiArIEJJVDExOyBicmVhazsKKwljYXNlIEhETENfRU5DT0RJTkdfRElGRl9CSVBIQVNFX0xFVkVMOiB2YWwgfD0gQklUMTIgKyBCSVQxMSArIEJJVDEwOyBicmVhazsKKwl9CisKKwlzd2l0Y2ggKGluZm8tPnBhcmFtcy5jcmNfdHlwZSkKKwl7CisJY2FzZSBIRExDX0NSQ18xNl9DQ0lUVDogdmFsIHw9IEJJVDk7IGJyZWFrOworCWNhc2UgSERMQ19DUkNfMzJfQ0NJVFQ6IHZhbCB8PSBCSVQ5ICsgQklUODsgYnJlYWs7CisJfQorCisJaWYgKGluZm8tPnBhcmFtcy5wcmVhbWJsZSAhPSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fTk9ORSkKKwkJdmFsIHw9IEJJVDY7CisKKwlzd2l0Y2ggKGluZm8tPnBhcmFtcy5wcmVhbWJsZV9sZW5ndGgpCisJeworCWNhc2UgSERMQ19QUkVBTUJMRV9MRU5HVEhfMTZCSVRTOiB2YWwgfD0gQklUNTsgYnJlYWs7CisJY2FzZSBIRExDX1BSRUFNQkxFX0xFTkdUSF8zMkJJVFM6IHZhbCB8PSBCSVQ0OyBicmVhazsKKwljYXNlIEhETENfUFJFQU1CTEVfTEVOR1RIXzY0QklUUzogdmFsIHw9IEJJVDUgKyBCSVQ0OyBicmVhazsKKwl9CisKKwlpZiAoaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX0FVVE9fQ1RTKQorCQl2YWwgfD0gQklUMDsKKworCXdyX3JlZzE2KGluZm8sIFRDUiwgdmFsKTsKKworCS8qIFRQUiAodHJhbnNtaXQgcHJlYW1ibGUpICovCisKKwlzd2l0Y2ggKGluZm8tPnBhcmFtcy5wcmVhbWJsZSkKKwl7CisJY2FzZSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fRkxBR1M6IHZhbCA9IDB4N2U7IGJyZWFrOworCWNhc2UgSERMQ19QUkVBTUJMRV9QQVRURVJOX09ORVM6ICB2YWwgPSAweGZmOyBicmVhazsKKwljYXNlIEhETENfUFJFQU1CTEVfUEFUVEVSTl9aRVJPUzogdmFsID0gMHgwMDsgYnJlYWs7CisJY2FzZSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fMTA6ICAgIHZhbCA9IDB4NTU7IGJyZWFrOworCWNhc2UgSERMQ19QUkVBTUJMRV9QQVRURVJOXzAxOiAgICB2YWwgPSAweGFhOyBicmVhazsKKwlkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMHg3ZTsgYnJlYWs7CisJfQorCXdyX3JlZzgoaW5mbywgVFBSLCAodW5zaWduZWQgY2hhcil2YWwpOworCisJLyogUkNSIChyeCBjb250cm9sKQorCSAqCisJICogMTUuLjEzICBtb2RlLCAwMDA9SERMQyAwMDE9cmF3IHN5bmMKKwkgKiAxMi4uMTAgIGVuY29kaW5nCisJICogMDkgICAgICBDUkMgZW5hYmxlCisJICogMDggICAgICBDUkMzMgorCSAqIDA3Li4wMyAgcmVzZXJ2ZWQsIG11c3QgYmUgMAorCSAqIDAyICAgICAgcmVzZXQKKwkgKiAwMSAgICAgIGVuYWJsZQorCSAqIDAwICAgICAgYXV0by1EQ0QgZW5hYmxlCisJICovCisJdmFsID0gMDsKKworCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfUkFXKQorCQl2YWwgfD0gQklUMTM7CisKKwlzd2l0Y2goaW5mby0+cGFyYW1zLmVuY29kaW5nKQorCXsKKwljYXNlIEhETENfRU5DT0RJTkdfTlJaQjogICAgICAgICAgdmFsIHw9IEJJVDEwOyBicmVhazsKKwljYXNlIEhETENfRU5DT0RJTkdfTlJaSV9NQVJLOiAgICAgdmFsIHw9IEJJVDExOyBicmVhazsKKwljYXNlIEhETENfRU5DT0RJTkdfTlJaSTogICAgICAgICAgdmFsIHw9IEJJVDExICsgQklUMTA7IGJyZWFrOworCWNhc2UgSERMQ19FTkNPRElOR19CSVBIQVNFX01BUks6ICB2YWwgfD0gQklUMTI7IGJyZWFrOworCWNhc2UgSERMQ19FTkNPRElOR19CSVBIQVNFX1NQQUNFOiB2YWwgfD0gQklUMTIgKyBCSVQxMDsgYnJlYWs7CisJY2FzZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfTEVWRUw6IHZhbCB8PSBCSVQxMiArIEJJVDExOyBicmVhazsKKwljYXNlIEhETENfRU5DT0RJTkdfRElGRl9CSVBIQVNFX0xFVkVMOiB2YWwgfD0gQklUMTIgKyBCSVQxMSArIEJJVDEwOyBicmVhazsKKwl9CisKKwlzd2l0Y2ggKGluZm8tPnBhcmFtcy5jcmNfdHlwZSkKKwl7CisJY2FzZSBIRExDX0NSQ18xNl9DQ0lUVDogdmFsIHw9IEJJVDk7IGJyZWFrOworCWNhc2UgSERMQ19DUkNfMzJfQ0NJVFQ6IHZhbCB8PSBCSVQ5ICsgQklUODsgYnJlYWs7CisJfQorCisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19BVVRPX0RDRCkKKwkJdmFsIHw9IEJJVDA7CisKKwl3cl9yZWcxNihpbmZvLCBSQ1IsIHZhbCk7CisKKwkvKiBDQ1IgKGNsb2NrIGNvbnRyb2wpCisJICoKKwkgKiAwNy4uMDUgIHR4IGNsb2NrIHNvdXJjZQorCSAqIDA0Li4wMiAgcnggY2xvY2sgc291cmNlCisJICogMDEgICAgICBhdXhjbGsgZW5hYmxlCisJICogMDAgICAgICBCUkcgZW5hYmxlCisJICovCisJdmFsID0gMDsKKworCWlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfVFhDX0JSRykKKwl7CisJCS8vIHdoZW4gUnhDIHNvdXJjZSBpcyBEUExMLCBCUkcgZ2VuZXJhdGVzIDE2WCBEUExMCisJCS8vIHJlZmVyZW5jZSBjbG9jaywgc28gdGFrZSBUeEMgZnJvbSBCUkcvMTYgdG8gZ2V0CisJCS8vIHRyYW5zbWl0IGNsb2NrIGF0IGFjdHVhbCBkYXRhIHJhdGUKKwkJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19SWENfRFBMTCkKKwkJCXZhbCB8PSBCSVQ2ICsgQklUNTsJLyogMDExLCB0eGNsayA9IEJSRy8xNiAqLworCQllbHNlCisJCQl2YWwgfD0gQklUNjsJLyogMDEwLCB0eGNsayA9IEJSRyAqLworCX0KKwllbHNlIGlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiBIRExDX0ZMQUdfVFhDX0RQTEwpCisJCXZhbCB8PSBCSVQ3OwkvKiAxMDAsIHR4Y2xrID0gRFBMTCBJbnB1dCAqLworCWVsc2UgaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19UWENfUlhDUElOKQorCQl2YWwgfD0gQklUNTsJLyogMDAxLCB0eGNsayA9IFJYQyBJbnB1dCAqLworCisJaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19SWENfQlJHKQorCQl2YWwgfD0gQklUMzsJLyogMDEwLCByeGNsayA9IEJSRyAqLworCWVsc2UgaWYgKGluZm8tPnBhcmFtcy5mbGFncyAmIEhETENfRkxBR19SWENfRFBMTCkKKwkJdmFsIHw9IEJJVDQ7CS8qIDEwMCwgcnhjbGsgPSBEUExMICovCisJZWxzZSBpZiAoaW5mby0+cGFyYW1zLmZsYWdzICYgSERMQ19GTEFHX1JYQ19UWENQSU4pCisJCXZhbCB8PSBCSVQyOwkvKiAwMDEsIHJ4Y2xrID0gVFhDIElucHV0ICovCisKKwlpZiAoaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkKQorCQl2YWwgfD0gQklUMSArIEJJVDA7CisKKwl3cl9yZWc4KGluZm8sIENDUiwgKHVuc2lnbmVkIGNoYXIpdmFsKTsKKworCWlmIChpbmZvLT5wYXJhbXMuZmxhZ3MgJiAoSERMQ19GTEFHX1RYQ19EUExMICsgSERMQ19GTEFHX1JYQ19EUExMKSkKKwl7CisJCS8vIHByb2dyYW0gRFBMTCBtb2RlCisJCXN3aXRjaChpbmZvLT5wYXJhbXMuZW5jb2RpbmcpCisJCXsKKwkJY2FzZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfTUFSSzoKKwkJY2FzZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfU1BBQ0U6CisJCQl2YWwgPSBCSVQ3OyBicmVhazsKKwkJY2FzZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfTEVWRUw6CisJCWNhc2UgSERMQ19FTkNPRElOR19ESUZGX0JJUEhBU0VfTEVWRUw6CisJCQl2YWwgPSBCSVQ3ICsgQklUNjsgYnJlYWs7CisJCWRlZmF1bHQ6IHZhbCA9IEJJVDY7CS8vIE5SWiBlbmNvZGluZ3MKKwkJfQorCQl3cl9yZWcxNihpbmZvLCBSQ1IsICh1bnNpZ25lZCBzaG9ydCkocmRfcmVnMTYoaW5mbywgUkNSKSB8IHZhbCkpOworCisJCS8vIERQTEwgcmVxdWlyZXMgYSAxNlggcmVmZXJlbmNlIGNsb2NrIGZyb20gQlJHCisJCXNldF9yYXRlKGluZm8sIGluZm8tPnBhcmFtcy5jbG9ja19zcGVlZCAqIDE2KTsKKwl9CisJZWxzZQorCQlzZXRfcmF0ZShpbmZvLCBpbmZvLT5wYXJhbXMuY2xvY2tfc3BlZWQpOworCisJdHhfc2V0X2lkbGUoaW5mbyk7CisKKwltc2Nfc2V0X3ZjcihpbmZvKTsKKworCS8qIFNDUiAoc2VyaWFsIGNvbnRyb2wpCisJICoKKwkgKiAxNSAgMT10eCByZXEgb24gRklGTyBoYWxmIGVtcHR5CisJICogMTQgIDE9cnggcmVxIG9uIEZJRk8gaGFsZiBmdWxsCisJICogMTMgIHR4IGRhdGEgIElSUSBlbmFibGUKKwkgKiAxMiAgdHggaWRsZSAgSVJRIGVuYWJsZQorCSAqIDExICB1bmRlcnJ1biBJUlEgZW5hYmxlCisJICogMTAgIHJ4IGRhdGEgIElSUSBlbmFibGUKKwkgKiAwOSAgcnggaWRsZSAgSVJRIGVuYWJsZQorCSAqIDA4ICBvdmVycnVuICBJUlEgZW5hYmxlCisJICogMDcgIERTUiAgICAgIElSUSBlbmFibGUKKwkgKiAwNiAgQ1RTICAgICAgSVJRIGVuYWJsZQorCSAqIDA1ICBEQ0QgICAgICBJUlEgZW5hYmxlCisJICogMDQgIFJJICAgICAgIElSUSBlbmFibGUKKwkgKiAwMyAgcmVzZXJ2ZWQsIG11c3QgYmUgemVybworCSAqIDAyICAxPXR4ZC0+cnhkIGludGVybmFsIGxvb3BiYWNrIGVuYWJsZQorCSAqIDAxICByZXNlcnZlZCwgbXVzdCBiZSB6ZXJvCisJICogMDAgIDE9bWFzdGVyIElSUSBlbmFibGUKKwkgKi8KKwl3cl9yZWcxNihpbmZvLCBTQ1IsIEJJVDE1ICsgQklUMTQgKyBCSVQwKTsKKworCWlmIChpbmZvLT5wYXJhbXMubG9vcGJhY2spCisJCWVuYWJsZV9sb29wYmFjayhpbmZvKTsKK30KKworLyoKKyAqICBzZXQgdHJhbnNtaXQgaWRsZSBtb2RlCisgKi8KK3N0YXRpYyB2b2lkIHR4X3NldF9pZGxlKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgY2hhciB2YWwgPSAweGZmOworCisJc3dpdGNoKGluZm8tPmlkbGVfbW9kZSkKKwl7CisJY2FzZSBIRExDX1RYSURMRV9GTEFHUzogICAgICAgICAgdmFsID0gMHg3ZTsgYnJlYWs7CisJY2FzZSBIRExDX1RYSURMRV9BTFRfWkVST1NfT05FUzogdmFsID0gMHhhYTsgYnJlYWs7CisJY2FzZSBIRExDX1RYSURMRV9aRVJPUzogICAgICAgICAgdmFsID0gMHgwMDsgYnJlYWs7CisJY2FzZSBIRExDX1RYSURMRV9PTkVTOiAgICAgICAgICAgdmFsID0gMHhmZjsgYnJlYWs7CisJY2FzZSBIRExDX1RYSURMRV9BTFRfTUFSS19TUEFDRTogdmFsID0gMHhhYTsgYnJlYWs7CisJY2FzZSBIRExDX1RYSURMRV9TUEFDRTogICAgICAgICAgdmFsID0gMHgwMDsgYnJlYWs7CisJY2FzZSBIRExDX1RYSURMRV9NQVJLOiAgICAgICAgICAgdmFsID0gMHhmZjsgYnJlYWs7CisJfQorCisJd3JfcmVnOChpbmZvLCBUSVIsIHZhbCk7Cit9CisKKy8qCisgKiBnZXQgc3RhdGUgb2YgVjI0IHN0YXR1cyAoaW5wdXQpIHNpZ25hbHMKKyAqLworc3RhdGljIHZvaWQgZ2V0X3NpZ25hbHMoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXMgPSByZF9yZWcxNihpbmZvLCBTU1IpOworCisJLyogY2xlYXIgYWxsIHNlcmlhbCBzaWduYWxzIGV4Y2VwdCBEVFIgYW5kIFJUUyAqLworCWluZm8tPnNpZ25hbHMgJj0gU2VyaWFsU2lnbmFsX0RUUiArIFNlcmlhbFNpZ25hbF9SVFM7CisKKwlpZiAoc3RhdHVzICYgQklUMykKKwkJaW5mby0+c2lnbmFscyB8PSBTZXJpYWxTaWduYWxfRFNSOworCWlmIChzdGF0dXMgJiBCSVQyKQorCQlpbmZvLT5zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9DVFM7CisJaWYgKHN0YXR1cyAmIEJJVDEpCisJCWluZm8tPnNpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX0RDRDsKKwlpZiAoc3RhdHVzICYgQklUMCkKKwkJaW5mby0+c2lnbmFscyB8PSBTZXJpYWxTaWduYWxfUkk7Cit9CisKKy8qCisgKiBzZXQgVi4yNCBDb250cm9sIFJlZ2lzdGVyIGJhc2VkIG9uIGN1cnJlbnQgY29uZmlndXJhdGlvbgorICovCitzdGF0aWMgdm9pZCBtc2Nfc2V0X3ZjcihzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKQoreworCXVuc2lnbmVkIGNoYXIgdmFsID0gMDsKKworCS8qIFZDUiAoVi4yNCBjb250cm9sKQorCSAqCisJICogMDcuLjA0ICBzZXJpYWwgSUYgc2VsZWN0CisJICogMDMgICAgICBEVFIKKwkgKiAwMiAgICAgIFJUUworCSAqIDAxICAgICAgTEwKKwkgKiAwMCAgICAgIFJMCisJICovCisKKwlzd2l0Y2goaW5mby0+aWZfbW9kZSAmIE1HU0xfSU5URVJGQUNFX01BU0spCisJeworCWNhc2UgTUdTTF9JTlRFUkZBQ0VfUlMyMzI6CisJCXZhbCB8PSBCSVQ1OyAvKiAwMDEwICovCisJCWJyZWFrOworCWNhc2UgTUdTTF9JTlRFUkZBQ0VfVjM1OgorCQl2YWwgfD0gQklUNyArIEJJVDYgKyBCSVQ1OyAvKiAxMTEwICovCisJCWJyZWFrOworCWNhc2UgTUdTTF9JTlRFUkZBQ0VfUlM0MjI6CisJCXZhbCB8PSBCSVQ2OyAvKiAwMTAwICovCisJCWJyZWFrOworCX0KKworCWlmIChpbmZvLT5zaWduYWxzICYgU2VyaWFsU2lnbmFsX0RUUikKKwkJdmFsIHw9IEJJVDM7CisJaWYgKGluZm8tPnNpZ25hbHMgJiBTZXJpYWxTaWduYWxfUlRTKQorCQl2YWwgfD0gQklUMjsKKwlpZiAoaW5mby0+aWZfbW9kZSAmIE1HU0xfSU5URVJGQUNFX0xMKQorCQl2YWwgfD0gQklUMTsKKwlpZiAoaW5mby0+aWZfbW9kZSAmIE1HU0xfSU5URVJGQUNFX1JMKQorCQl2YWwgfD0gQklUMDsKKwl3cl9yZWc4KGluZm8sIFZDUiwgdmFsKTsKK30KKworLyoKKyAqIHNldCBzdGF0ZSBvZiBWMjQgY29udHJvbCAob3V0cHV0KSBzaWduYWxzCisgKi8KK3N0YXRpYyB2b2lkIHNldF9zaWduYWxzKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgY2hhciB2YWwgPSByZF9yZWc4KGluZm8sIFZDUik7CisJaWYgKGluZm8tPnNpZ25hbHMgJiBTZXJpYWxTaWduYWxfRFRSKQorCQl2YWwgfD0gQklUMzsKKwllbHNlCisJCXZhbCAmPSB+QklUMzsKKwlpZiAoaW5mby0+c2lnbmFscyAmIFNlcmlhbFNpZ25hbF9SVFMpCisJCXZhbCB8PSBCSVQyOworCWVsc2UKKwkJdmFsICY9IH5CSVQyOworCXdyX3JlZzgoaW5mbywgVkNSLCB2YWwpOworfQorCisvKgorICogZnJlZSByYW5nZSBvZiByZWNlaXZlIERNQSBidWZmZXJzIChpIHRvIGxhc3QpCisgKi8KK3N0YXRpYyB2b2lkIGZyZWVfcmJ1ZnMoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCBsYXN0KQoreworCWludCBkb25lID0gMDsKKworCXdoaWxlKCFkb25lKSB7CisJCS8qIHJlc2V0IGN1cnJlbnQgYnVmZmVyIGZvciByZXVzZSAqLworCQlpbmZvLT5yYnVmc1tpXS5zdGF0dXMgPSAwOworCQlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX1JBVykKKwkJCXNldF9kZXNjX2NvdW50KGluZm8tPnJidWZzW2ldLCBpbmZvLT5yYXdfcnhfc2l6ZSk7CisJCWVsc2UKKwkJCXNldF9kZXNjX2NvdW50KGluZm8tPnJidWZzW2ldLCBETUFCVUZTSVpFKTsKKworCQlpZiAoaSA9PSBsYXN0KQorCQkJZG9uZSA9IDE7CisJCWlmICgrK2kgPT0gaW5mby0+cmJ1Zl9jb3VudCkKKwkJCWkgPSAwOworCX0KKwlpbmZvLT5yYnVmX2N1cnJlbnQgPSBpOworfQorCisvKgorICogbWFyayBhbGwgcmVjZWl2ZSBETUEgYnVmZmVycyBhcyBmcmVlCisgKi8KK3N0YXRpYyB2b2lkIHJlc2V0X3JidWZzKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCit7CisJZnJlZV9yYnVmcyhpbmZvLCAwLCBpbmZvLT5yYnVmX2NvdW50IC0gMSk7Cit9CisKKy8qCisgKiBwYXNzIHJlY2VpdmUgSERMQyBmcmFtZSB0byB1cHBlciBsYXllcgorICoKKyAqIHJldHVybiAxIGlmIGZyYW1lIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIDAKKyAqLworc3RhdGljIGludCByeF9nZXRfZnJhbWUoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgc3RhcnQsIGVuZDsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisJdW5zaWduZWQgaW50IGZyYW1lc2l6ZSA9IDA7CisJaW50IHJjID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7CisJdW5zaWduZWQgY2hhciBhZGRyX2ZpZWxkID0gMHhmZjsKKworY2hlY2tfYWdhaW46CisKKwlmcmFtZXNpemUgPSAwOworCWFkZHJfZmllbGQgPSAweGZmOworCXN0YXJ0ID0gZW5kID0gaW5mby0+cmJ1Zl9jdXJyZW50OworCisJZm9yICg7OykgeworCQlpZiAoIWRlc2NfY29tcGxldGUoaW5mby0+cmJ1ZnNbZW5kXSkpCisJCQlnb3RvIGNsZWFudXA7CisKKwkJaWYgKGZyYW1lc2l6ZSA9PSAwICYmIGluZm8tPnBhcmFtcy5hZGRyX2ZpbHRlciAhPSAweGZmKQorCQkJYWRkcl9maWVsZCA9IGluZm8tPnJidWZzW2VuZF0uYnVmWzBdOworCisJCWZyYW1lc2l6ZSArPSBkZXNjX2NvdW50KGluZm8tPnJidWZzW2VuZF0pOworCisJCWlmIChkZXNjX2VvZihpbmZvLT5yYnVmc1tlbmRdKSkKKwkJCWJyZWFrOworCisJCWlmICgrK2VuZCA9PSBpbmZvLT5yYnVmX2NvdW50KQorCQkJZW5kID0gMDsKKworCQlpZiAoZW5kID09IGluZm8tPnJidWZfY3VycmVudCkgeworCQkJaWYgKGluZm8tPnJ4X2VuYWJsZWQpeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJCQlyeF9zdGFydChpbmZvKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwkJCX0KKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCX0KKworCS8qIHN0YXR1cworCSAqCisJICogMTUgICAgICBidWZmZXIgY29tcGxldGUKKwkgKiAxNC4uMDYgIHJlc2VydmVkCisJICogMDUuLjA0ICByZXNpZHVlCisJICogMDIgICAgICBlb2YgKGVuZCBvZiBmcmFtZSkKKwkgKiAwMSAgICAgIENSQyBlcnJvcgorCSAqIDAwICAgICAgYWJvcnQKKwkgKi8KKwlzdGF0dXMgPSBkZXNjX3N0YXR1cyhpbmZvLT5yYnVmc1tlbmRdKTsKKworCS8qIGlnbm9yZSBDUkMgYml0IGlmIG5vdCB1c2luZyBDUkMgKGJpdCBpcyB1bmRlZmluZWQpICovCisJaWYgKGluZm8tPnBhcmFtcy5jcmNfdHlwZSA9PSBIRExDX0NSQ19OT05FKQorCQlzdGF0dXMgJj0gfkJJVDE7CisKKwlpZiAoZnJhbWVzaXplID09IDAgfHwKKwkJIChhZGRyX2ZpZWxkICE9IDB4ZmYgJiYgYWRkcl9maWVsZCAhPSBpbmZvLT5wYXJhbXMuYWRkcl9maWx0ZXIpKSB7CisJCWZyZWVfcmJ1ZnMoaW5mbywgc3RhcnQsIGVuZCk7CisJCWdvdG8gY2hlY2tfYWdhaW47CisJfQorCisJaWYgKGZyYW1lc2l6ZSA8IDIgfHwgc3RhdHVzICYgKEJJVDErQklUMCkpIHsKKwkJaWYgKGZyYW1lc2l6ZSA8IDIgfHwgKHN0YXR1cyAmIEJJVDApKQorCQkJaW5mby0+aWNvdW50LnJ4c2hvcnQrKzsKKwkJZWxzZQorCQkJaW5mby0+aWNvdW50LnJ4Y3JjKys7CisJCWZyYW1lc2l6ZSA9IDA7CisKKyNpZmRlZiBDT05GSUdfSERMQworCQl7CisJCQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGluZm8tPm5ldGRldik7CisJCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCQlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzKys7CisJCX0KKyNlbmRpZgorCX0gZWxzZSB7CisJCS8qIGFkanVzdCBmcmFtZSBzaXplIGZvciBDUkMsIGlmIGFueSAqLworCQlpZiAoaW5mby0+cGFyYW1zLmNyY190eXBlID09IEhETENfQ1JDXzE2X0NDSVRUKQorCQkJZnJhbWVzaXplIC09IDI7CisJCWVsc2UgaWYgKGluZm8tPnBhcmFtcy5jcmNfdHlwZSA9PSBIRExDX0NSQ18zMl9DQ0lUVCkKKwkJCWZyYW1lc2l6ZSAtPSA0OworCX0KKworCURCR0JIKCgiJXMgcnggZnJhbWUgc3RhdHVzPSUwNFggc2l6ZT0lZFxuIiwKKwkJaW5mby0+ZGV2aWNlX25hbWUsIHN0YXR1cywgZnJhbWVzaXplKSk7CisJREJHREFUQShpbmZvLCBpbmZvLT5yYnVmc1tzdGFydF0uYnVmLCBtaW5fdChpbnQsIGZyYW1lc2l6ZSwgRE1BQlVGU0laRSksICJyeCIpOworCisJaWYgKGZyYW1lc2l6ZSkgeworCQlpZiAoZnJhbWVzaXplID4gaW5mby0+bWF4X2ZyYW1lX3NpemUpCisJCQlpbmZvLT5pY291bnQucnhsb25nKys7CisJCWVsc2UgeworCQkJLyogY29weSBkbWEgYnVmZmVyKHMpIHRvIGNvbnRpZ3VvdXMgdGVtcCBidWZmZXIgKi8KKwkJCWludCBjb3B5X2NvdW50ID0gZnJhbWVzaXplOworCQkJaW50IGkgPSBzdGFydDsKKwkJCXVuc2lnbmVkIGNoYXIgKnAgPSBpbmZvLT50bXBfcmJ1ZjsKKwkJCWluZm8tPnRtcF9yYnVmX2NvdW50ID0gZnJhbWVzaXplOworCisJCQlpbmZvLT5pY291bnQucnhvaysrOworCisJCQl3aGlsZShjb3B5X2NvdW50KSB7CisJCQkJaW50IHBhcnRpYWxfY291bnQgPSBtaW4oY29weV9jb3VudCwgRE1BQlVGU0laRSk7CisJCQkJbWVtY3B5KHAsIGluZm8tPnJidWZzW2ldLmJ1ZiwgcGFydGlhbF9jb3VudCk7CisJCQkJcCArPSBwYXJ0aWFsX2NvdW50OworCQkJCWNvcHlfY291bnQgLT0gcGFydGlhbF9jb3VudDsKKwkJCQlpZiAoKytpID09IGluZm8tPnJidWZfY291bnQpCisJCQkJCWkgPSAwOworCQkJfQorCisjaWZkZWYgQ09ORklHX0hETEMKKwkJCWlmIChpbmZvLT5uZXRjb3VudCkKKwkJCQloZGxjZGV2X3J4KGluZm8saW5mby0+dG1wX3JidWYsIGZyYW1lc2l6ZSk7CisJCQllbHNlCisjZW5kaWYKKwkJCQlsZGlzY19yZWNlaXZlX2J1Zih0dHksIGluZm8tPnRtcF9yYnVmLCBpbmZvLT5mbGFnX2J1ZiwgZnJhbWVzaXplKTsKKwkJfQorCX0KKwlmcmVlX3JidWZzKGluZm8sIHN0YXJ0LCBlbmQpOworCXJjID0gMTsKKworY2xlYW51cDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBwYXNzIHJlY2VpdmUgYnVmZmVyIChSQVcgc3luY2hyb25vdXMgbW9kZSkgdG8gdHR5IGxheWVyCisgKiByZXR1cm4gMSBpZiBidWZmZXIgYXZhaWxhYmxlLCBvdGhlcndpc2UgMAorICovCitzdGF0aWMgaW50IHJ4X2dldF9idWYoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgaSA9IGluZm8tPnJidWZfY3VycmVudDsKKworCWlmICghZGVzY19jb21wbGV0ZShpbmZvLT5yYnVmc1tpXSkpCisJCXJldHVybiAwOworCURCR0RBVEEoaW5mbywgaW5mby0+cmJ1ZnNbaV0uYnVmLCBkZXNjX2NvdW50KGluZm8tPnJidWZzW2ldKSwgInJ4Iik7CisJREJHSU5GTygoInJ4X2dldF9idWYgc2l6ZT0lZFxuIiwgZGVzY19jb3VudChpbmZvLT5yYnVmc1tpXSkpKTsKKwlsZGlzY19yZWNlaXZlX2J1ZihpbmZvLT50dHksIGluZm8tPnJidWZzW2ldLmJ1ZiwKKwkJCSAgaW5mby0+ZmxhZ19idWYsIGRlc2NfY291bnQoaW5mby0+cmJ1ZnNbaV0pKTsKKwlmcmVlX3JidWZzKGluZm8sIGksIGkpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCByZXNldF90YnVmcyhzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKQoreworCXVuc2lnbmVkIGludCBpOworCWluZm8tPnRidWZfY3VycmVudCA9IDA7CisJZm9yIChpPTAgOyBpIDwgaW5mby0+dGJ1Zl9jb3VudCA7IGkrKykgeworCQlpbmZvLT50YnVmc1tpXS5zdGF0dXMgPSAwOworCQlpbmZvLT50YnVmc1tpXS5jb3VudCAgPSAwOworCX0KK30KKworLyoKKyAqIHJldHVybiBudW1iZXIgb2YgZnJlZSB0cmFuc21pdCBETUEgYnVmZmVycworICovCitzdGF0aWMgdW5zaWduZWQgaW50IGZyZWVfdGJ1Zl9jb3VudChzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKQoreworCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CisJdW5zaWduZWQgaW50IGkgPSBpbmZvLT50YnVmX2N1cnJlbnQ7CisKKwlkbworCXsKKwkJaWYgKGRlc2NfY291bnQoaW5mby0+dGJ1ZnNbaV0pKQorCQkJYnJlYWs7IC8qIGJ1ZmZlciBpbiB1c2UgKi8KKwkJKytjb3VudDsKKwkJaWYgKCsraSA9PSBpbmZvLT50YnVmX2NvdW50KQorCQkJaT0wOworCX0gd2hpbGUgKGkgIT0gaW5mby0+dGJ1Zl9jdXJyZW50KTsKKworCS8qIGxhc3QgYnVmZmVyIHdpdGggemVybyBjb3VudCBtYXkgYmUgaW4gdXNlLCBhc3N1bWUgaXQgaXMgKi8KKwlpZiAoY291bnQpCisJCS0tY291bnQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKiBsb2FkIHRyYW5zbWl0IERNQSBidWZmZXIocykgd2l0aCBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIHR4X2xvYWQoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBzaG9ydCBjb3VudDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3Qgc2xndF9kZXNjICpkOworCisJaWYgKHNpemUgPT0gMCkKKwkJcmV0dXJuOworCisJREJHREFUQShpbmZvLCBidWYsIHNpemUsICJ0eCIpOworCisJaW5mby0+dGJ1Zl9zdGFydCA9IGkgPSBpbmZvLT50YnVmX2N1cnJlbnQ7CisKKwl3aGlsZSAoc2l6ZSkgeworCQlkID0gJmluZm8tPnRidWZzW2ldOworCQlpZiAoKytpID09IGluZm8tPnRidWZfY291bnQpCisJCQlpID0gMDsKKworCQljb3VudCA9ICh1bnNpZ25lZCBzaG9ydCkoKHNpemUgPiBETUFCVUZTSVpFKSA/IERNQUJVRlNJWkUgOiBzaXplKTsKKwkJbWVtY3B5KGQtPmJ1ZiwgYnVmLCBjb3VudCk7CisKKwkJc2l6ZSAtPSBjb3VudDsKKwkJYnVmICArPSBjb3VudDsKKworCQlpZiAoIXNpemUgJiYgaW5mby0+cGFyYW1zLm1vZGUgIT0gTUdTTF9NT0RFX1JBVykKKwkJCXNldF9kZXNjX2VvZigqZCwgMSk7IC8qIEhETEM6IHNldCBFT0Ygb2YgbGFzdCBkZXNjICovCisJCWVsc2UKKwkJCXNldF9kZXNjX2VvZigqZCwgMCk7CisKKwkJc2V0X2Rlc2NfY291bnQoKmQsIGNvdW50KTsKKwl9CisKKwlpbmZvLT50YnVmX2N1cnJlbnQgPSBpOworfQorCitzdGF0aWMgaW50IHJlZ2lzdGVyX3Rlc3Qoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKK3sKKwlzdGF0aWMgdW5zaWduZWQgc2hvcnQgcGF0dGVybnNbXSA9CisJCXsweDAwMDAsIDB4ZmZmZiwgMHhhYWFhLCAweDU1NTUsIDB4Njk2OSwgMHg5Njk2fTsKKwlzdGF0aWMgdW5zaWduZWQgaW50IGNvdW50ID0gc2l6ZW9mKHBhdHRlcm5zKS9zaXplb2YocGF0dGVybnNbMF0pOworCXVuc2lnbmVkIGludCBpOworCWludCByYyA9IDA7CisKKwlmb3IgKGk9MCA7IGkgPCBjb3VudCA7IGkrKykgeworCQl3cl9yZWcxNihpbmZvLCBUSVIsIHBhdHRlcm5zW2ldKTsKKwkJd3JfcmVnMTYoaW5mbywgQkRSLCBwYXR0ZXJuc1soaSsxKSVjb3VudF0pOworCQlpZiAoKHJkX3JlZzE2KGluZm8sIFRJUikgIT0gcGF0dGVybnNbaV0pIHx8CisJCSAgICAocmRfcmVnMTYoaW5mbywgQkRSKSAhPSBwYXR0ZXJuc1soaSsxKSVjb3VudF0pKSB7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlicmVhazsKKwkJfQorCX0KKworCWluZm8tPmluaXRfZXJyb3IgPSByYyA/IDAgOiBEaWFnU3RhdHVzX0FkZHJlc3NGYWlsdXJlOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBpcnFfdGVzdChzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0dHlfc3RydWN0ICpvbGR0dHkgPSBpbmZvLT50dHk7CisJdTMyIHNwZWVkID0gaW5mby0+cGFyYW1zLmRhdGFfcmF0ZTsKKworCWluZm8tPnBhcmFtcy5kYXRhX3JhdGUgPSA5MjE2MDA7CisJaW5mby0+dHR5ID0gTlVMTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisJYXN5bmNfbW9kZShpbmZvKTsKKwlzbGd0X2lycV9vbihpbmZvLCBJUlFfVFhJRExFKTsKKworCS8qIGVuYWJsZSB0cmFuc21pdHRlciAqLworCXdyX3JlZzE2KGluZm8sIFRDUiwKKwkJKHVuc2lnbmVkIHNob3J0KShyZF9yZWcxNihpbmZvLCBUQ1IpIHwgQklUMSkpOworCisJLyogd3JpdGUgb25lIGJ5dGUgYW5kIHdhaXQgZm9yIHR4IGlkbGUgKi8KKwl3cl9yZWcxNihpbmZvLCBURFIsIDApOworCisJLyogYXNzdW1lIGZhaWx1cmUgKi8KKwlpbmZvLT5pbml0X2Vycm9yID0gRGlhZ1N0YXR1c19JcnFGYWlsdXJlOworCWluZm8tPmlycV9vY2N1cnJlZCA9IEZBTFNFOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJdGltZW91dD0xMDA7CisJd2hpbGUodGltZW91dC0tICYmICFpbmZvLT5pcnFfb2NjdXJyZWQpCisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlyZXNldF9wb3J0KGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJaW5mby0+cGFyYW1zLmRhdGFfcmF0ZSA9IHNwZWVkOworCWluZm8tPnR0eSA9IG9sZHR0eTsKKworCWluZm8tPmluaXRfZXJyb3IgPSBpbmZvLT5pcnFfb2NjdXJyZWQgPyAwIDogRGlhZ1N0YXR1c19JcnFGYWlsdXJlOworCXJldHVybiBpbmZvLT5pcnFfb2NjdXJyZWQgPyAwIDogLUVOT0RFVjsKK30KKworc3RhdGljIGludCBsb29wYmFja190ZXN0X3J4KHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgY2hhciAqc3JjLCAqZGVzdDsKKwlpbnQgY291bnQ7CisKKwlpZiAoZGVzY19jb21wbGV0ZShpbmZvLT5yYnVmc1swXSkpIHsKKwkJY291bnQgPSBkZXNjX2NvdW50KGluZm8tPnJidWZzWzBdKTsKKwkJc3JjICAgPSBpbmZvLT5yYnVmc1swXS5idWY7CisJCWRlc3QgID0gaW5mby0+dG1wX3JidWY7CisKKwkJZm9yKCA7IGNvdW50IDsgY291bnQtPTIsIHNyYys9MikgeworCQkJLyogc3JjPWRhdGEgYnl0ZSAoc3JjKzEpPXN0YXR1cyBieXRlICovCisJCQlpZiAoISgqKHNyYysxKSAmIChCSVQ5ICsgQklUOCkpKSB7CisJCQkJKmRlc3QgPSAqc3JjOworCQkJCWRlc3QrKzsKKwkJCQlpbmZvLT50bXBfcmJ1Zl9jb3VudCsrOworCQkJfQorCQl9CisJCURCR0RBVEEoaW5mbywgaW5mby0+dG1wX3JidWYsIGluZm8tPnRtcF9yYnVmX2NvdW50LCAicngiKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxvb3BiYWNrX3Rlc3Qoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKK3sKKyNkZWZpbmUgVEVTVEZSQU1FU0laRSAyMAorCisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXUxNiBjb3VudCA9IFRFU1RGUkFNRVNJWkU7CisJdW5zaWduZWQgY2hhciBidWZbVEVTVEZSQU1FU0laRV07CisJaW50IHJjID0gLUVOT0RFVjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3RydWN0IHR0eV9zdHJ1Y3QgKm9sZHR0eSA9IGluZm8tPnR0eTsKKwlNR1NMX1BBUkFNUyBwYXJhbXM7CisKKwltZW1jcHkoJnBhcmFtcywgJmluZm8tPnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpOworCisJaW5mby0+cGFyYW1zLm1vZGUgPSBNR1NMX01PREVfQVNZTkM7CisJaW5mby0+cGFyYW1zLmRhdGFfcmF0ZSA9IDkyMTYwMDsKKwlpbmZvLT5wYXJhbXMubG9vcGJhY2sgPSAxOworCWluZm8tPnR0eSA9IE5VTEw7CisKKwkvKiBidWlsZCBhbmQgc2VuZCB0cmFuc21pdCBmcmFtZSAqLworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IFRFU1RGUkFNRVNJWkU7ICsrY291bnQpCisJCWJ1Zltjb3VudF0gPSAodW5zaWduZWQgY2hhciljb3VudDsKKworCWluZm8tPnRtcF9yYnVmX2NvdW50ID0gMDsKKwltZW1zZXQoaW5mby0+dG1wX3JidWYsIDAsIFRFU1RGUkFNRVNJWkUpOworCisJLyogcHJvZ3JhbSBoYXJkd2FyZSBmb3IgSERMQyBhbmQgZW5hYmxlZCByZWNlaXZlciAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlhc3luY19tb2RlKGluZm8pOworCXJ4X3N0YXJ0KGluZm8pOworCWluZm8tPnR4X2NvdW50ID0gY291bnQ7CisJdHhfbG9hZChpbmZvLCBidWYsIGNvdW50KTsKKwl0eF9zdGFydChpbmZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CisKKwkvKiB3YWl0IGZvciByZWNlaXZlIGNvbXBsZXRlICovCisJZm9yICh0aW1lb3V0ID0gMTAwOyB0aW1lb3V0OyAtLXRpbWVvdXQpIHsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMTApOworCQlpZiAobG9vcGJhY2tfdGVzdF9yeChpbmZvKSkgeworCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiB2ZXJpZnkgcmVjZWl2ZWQgZnJhbWUgbGVuZ3RoIGFuZCBjb250ZW50cyAqLworCWlmICghcmMgJiYgKGluZm8tPnRtcF9yYnVmX2NvdW50ICE9IGNvdW50IHx8CisJCSAgbWVtY21wKGJ1ZiwgaW5mby0+dG1wX3JidWYsIGNvdW50KSkpIHsKKwkJcmMgPSAtRU5PREVWOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKKwlyZXNldF9hZGFwdGVyKGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisJbWVtY3B5KCZpbmZvLT5wYXJhbXMsICZwYXJhbXMsIHNpemVvZihpbmZvLT5wYXJhbXMpKTsKKwlpbmZvLT50dHkgPSBvbGR0dHk7CisKKwlpbmZvLT5pbml0X2Vycm9yID0gcmMgPyBEaWFnU3RhdHVzX0RtYUZhaWx1cmUgOiAwOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBhZGFwdGVyX3Rlc3Qoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKK3sKKwlEQkdJTkZPKCgidGVzdGluZyAlc1xuIiwgaW5mby0+ZGV2aWNlX25hbWUpKTsKKwlpZiAoKGluZm8tPmluaXRfZXJyb3IgPSByZWdpc3Rlcl90ZXN0KGluZm8pKSA8IDApIHsKKwkJcHJpbnRrKCJyZWdpc3RlciB0ZXN0IGZhaWx1cmUgJXMgYWRkcj0lMDhYXG4iLAorCQkJaW5mby0+ZGV2aWNlX25hbWUsIGluZm8tPnBoeXNfcmVnX2FkZHIpOworCX0gZWxzZSBpZiAoKGluZm8tPmluaXRfZXJyb3IgPSBpcnFfdGVzdChpbmZvKSkgPCAwKSB7CisJCXByaW50aygiSVJRIHRlc3QgZmFpbHVyZSAlcyBJUlE9JWRcbiIsCisJCQlpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+aXJxX2xldmVsKTsKKwl9IGVsc2UgaWYgKChpbmZvLT5pbml0X2Vycm9yID0gbG9vcGJhY2tfdGVzdChpbmZvKSkgPCAwKSB7CisJCXByaW50aygibG9vcGJhY2sgdGVzdCBmYWlsdXJlICVzXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSk7CisJfQorCXJldHVybiBpbmZvLT5pbml0X2Vycm9yOworfQorCisvKgorICogdHJhbnNtaXQgdGltZW91dCBoYW5kbGVyCisgKi8KK3N0YXRpYyB2b2lkIHR4X3RpbWVvdXQodW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXN0cnVjdCBzbGd0X2luZm8gKmluZm8gPSAoc3RydWN0IHNsZ3RfaW5mbyopY29udGV4dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJREJHSU5GTygoIiVzIHR4X3RpbWVvdXRcbiIsIGluZm8tPmRldmljZV9uYW1lKSk7CisJaWYoaW5mby0+dHhfYWN0aXZlICYmIGluZm8tPnBhcmFtcy5tb2RlID09IE1HU0xfTU9ERV9IRExDKSB7CisJCWluZm8tPmljb3VudC50eHRpbWVvdXQrKzsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCWluZm8tPnR4X2FjdGl2ZSA9IDA7CisJaW5mby0+dHhfY291bnQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOworCisjaWZkZWYgQ09ORklHX0hETEMKKwlpZiAoaW5mby0+bmV0Y291bnQpCisJCWhkbGNkZXZfdHhfZG9uZShpbmZvKTsKKwllbHNlCisjZW5kaWYKKwkJYmhfdHJhbnNtaXQoaW5mbyk7Cit9CisKKy8qCisgKiByZWNlaXZlIGJ1ZmZlciBwb2xsaW5nIHRpbWVyCisgKi8KK3N0YXRpYyB2b2lkIHJ4X3RpbWVvdXQodW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXN0cnVjdCBzbGd0X2luZm8gKmluZm8gPSAoc3RydWN0IHNsZ3RfaW5mbyopY29udGV4dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJREJHSU5GTygoIiVzIHJ4X3RpbWVvdXRcbiIsIGluZm8tPmRldmljZV9uYW1lKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlpbmZvLT5wZW5kaW5nX2JoIHw9IEJIX1JFQ0VJVkU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWJoX2hhbmRsZXIoaW5mbyk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zeW5jbGlua21wLmMgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmttcC5jCmluZGV4IGVlNWE0MGIuLjk2MGFkYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeW5jbGlua21wLmMKKysrIGIvZHJpdmVycy9jaGFyL3N5bmNsaW5rbXAuYwpAQCAtMjE5Niw3ICsyMTk2LDcgQEAKIAkJCWlmICggdHR5ICkgewogCQkJCWlmICghKHN0YXR1cyAmIGluZm8tPmlnbm9yZV9zdGF0dXNfbWFzazEpKSB7CiAJCQkJCWlmIChpbmZvLT5yZWFkX3N0YXR1c19tYXNrMSAmIEJSS0QpIHsKLQkJCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX0JSRUFLOworCQkJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfQlJFQUspOwogCQkJCQkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfU0FLKQogCQkJCQkJCWRvX1NBSyh0dHkpOwogCQkJCQl9CkBAIC0yMjQwLDE2ICsyMjQwLDEwIEBACiAKIAl3aGlsZSgoc3RhdHVzID0gcmVhZF9yZWcoaW5mbyxDU1QwKSkgJiBCSVQwKQogCXsKKwkJaW50IGZsYWcgPSAwOworCQlpbnQgb3ZlciA9IDA7CiAJCURhdGFCeXRlID0gcmVhZF9yZWcoaW5mbyxUUkIpOwogCi0JCWlmICggdHR5ICkgewotCQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKQotCQkJCWNvbnRpbnVlOwotCi0JCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciA9IERhdGFCeXRlOwotCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSAwOwotCQl9Ci0KIAkJaWNvdW50LT5yeCsrOwogCiAJCWlmICggc3RhdHVzICYgKFBFICsgRlJNRSArIE9WUk4pICkgewpAQCAtMjI3Miw0MiArMjI2NiwzNCBAQAogCiAJCQlpZiAoIHR0eSApIHsKIAkJCQlpZiAoc3RhdHVzICYgUEUpCi0JCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX1BBUklUWTsKKwkJCQkJZmxhZyA9IFRUWV9QQVJJVFk7CiAJCQkJZWxzZSBpZiAoc3RhdHVzICYgRlJNRSkKLQkJCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfRlJBTUU7CisJCQkJCWZsYWcgPSBUVFlfRlJBTUU7CiAJCQkJaWYgKHN0YXR1cyAmIE9WUk4pIHsKIAkJCQkJLyogT3ZlcnJ1biBpcyBzcGVjaWFsLCBzaW5jZSBpdCdzCiAJCQkJCSAqIHJlcG9ydGVkIGltbWVkaWF0ZWx5LCBhbmQgZG9lc24ndAogCQkJCQkgKiBhZmZlY3QgdGhlIGN1cnJlbnQgY2hhcmFjdGVyCiAJCQkJCSAqLwotCQkJCQlpZiAodHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSkgewotCQkJCQkJdHR5LT5mbGlwLmNvdW50Kys7Ci0JCQkJCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyKys7Ci0JCQkJCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyKys7Ci0JCQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9PVkVSUlVOOwotCQkJCQl9CisJCQkJCW92ZXIgPSAxOwogCQkJCX0KIAkJCX0KIAkJfQkvKiBlbmQgb2YgaWYgKGVycm9yKSAqLwogCiAJCWlmICggdHR5ICkgewotCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOwotCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOwotCQkJdHR5LT5mbGlwLmNvdW50Kys7CisJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIERhdGFCeXRlLCBmbGFnKTsKKwkJCWlmIChvdmVyKQorCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pOwogCQl9CiAJfQogCiAJaWYgKCBkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IgKSB7Ci0JCXByaW50aygiJXMoJWQpOiVzIGlzcl9yeHJkeSgpIGZsaXAgY291bnQ9JWRcbiIsCi0JCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwKLQkJCXR0eSA/IHR0eS0+ZmxpcC5jb3VudCA6IDApOwogCQlwcmludGsoIiVzKCVkKTolcyByeD0lZCBicms9JWQgcGFyaXR5PSVkIGZyYW1lPSVkIG92ZXJydW49JWRcbiIsCiAJCQlfX0ZJTEVfXyxfX0xJTkVfXyxpbmZvLT5kZXZpY2VfbmFtZSwKIAkJCWljb3VudC0+cngsaWNvdW50LT5icmssaWNvdW50LT5wYXJpdHksCiAJCQlpY291bnQtPmZyYW1lLGljb3VudC0+b3ZlcnJ1bik7CiAJfQogCi0JaWYgKCB0dHkgJiYgdHR5LT5mbGlwLmNvdW50ICkKKwlpZiAoIHR0eSApCiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiB9CiAKQEAgLTUxMDQsNyArNTA5MCw3IEBACiBpbnQgcmVnaXN0ZXJfdGVzdChTTE1QX0lORk8gKmluZm8pCiB7CiAJc3RhdGljIHVuc2lnbmVkIGNoYXIgdGVzdHZhbFtdID0gezB4MDAsIDB4ZmYsIDB4YWEsIDB4NTUsIDB4NjksIDB4OTZ9OwotCXN0YXRpYyB1bnNpZ25lZCBpbnQgY291bnQgPSBzaXplb2YodGVzdHZhbCkvc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgY291bnQgPSBBUlJBWV9TSVpFKHRlc3R2YWwpOwogCXVuc2lnbmVkIGludCBpOwogCWludCByYyA9IFRSVUU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTU0MjIsNyArNTQwOCw3IEBACiB7CiAJc3RhdGljIHVuc2lnbmVkIGxvbmcgdGVzdHZhbFtdID0geyAweDAsIDB4NTU1NTU1NTUsIDB4YWFhYWFhYWEsCiAJCTB4NjY2NjY2NjYsIDB4OTk5OTk5OTksIDB4ZmZmZmZmZmYsIDB4MTIzNDU2NzggfTsKLQl1bnNpZ25lZCBsb25nIGNvdW50ID0gc2l6ZW9mKHRlc3R2YWwpL3NpemVvZih1bnNpZ25lZCBsb25nKTsKKwl1bnNpZ25lZCBsb25nIGNvdW50ID0gQVJSQVlfU0laRSh0ZXN0dmFsKTsKIAl1bnNpZ25lZCBsb25nIGk7CiAJdW5zaWduZWQgbG9uZyBsaW1pdCA9IFNDQV9NRU1fU0laRS9zaXplb2YodW5zaWduZWQgbG9uZyk7CiAJdW5zaWduZWQgbG9uZyAqIGFkZHIgPSAodW5zaWduZWQgbG9uZyAqKWluZm8tPm1lbW9yeV9iYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N5c3JxLmMgYi9kcml2ZXJzL2NoYXIvc3lzcnEuYwppbmRleCAxNDUyNzVlLi41NzY1ZjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3lzcnEuYworKysgYi9kcml2ZXJzL2NoYXIvc3lzcnEuYwpAQCAtMTUzLDYgKzE1MywyMSBAQAogCiAvKiBFTkQgU1lOQyBTWVNSUSBIQU5ETEVSUyBCTE9DSyAqLwogCisjaWZkZWYgQ09ORklHX0RFQlVHX01VVEVYRVMKKworc3RhdGljIHZvaWQKK3N5c3JxX2hhbmRsZV9zaG93bG9ja3MoaW50IGtleSwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJbXV0ZXhfZGVidWdfc2hvd19hbGxfbG9ja3MoKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfc2hvd2xvY2tzX29wID0geworCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX3Nob3dsb2NrcywKKwkuaGVscF9tc2cJPSAic2hvdy1hbGwtbG9ja3MoRCkiLAorCS5hY3Rpb25fbXNnCT0gIlNob3cgTG9ja3MgSGVsZCIsCit9OworCisjZW5kaWYKIAogLyogU0hPVyBTWVNSUSBIQU5ETEVSUyBCTE9DSyAqLwogCkBAIC0yOTQsNyArMzA5LDExIEBACiAjZWxzZQogLyogYyAqLwlOVUxMLAogI2VuZGlmCisjaWZkZWYgQ09ORklHX0RFQlVHX01VVEVYRVMKKy8qIGQgKi8gJnN5c3JxX3Nob3dsb2Nrc19vcCwKKyNlbHNlCiAvKiBkICovIE5VTEwsCisjZW5kaWYKIC8qIGUgKi8JJnN5c3JxX3Rlcm1fb3AsCiAvKiBmICovCSZzeXNycV9tb29tX29wLAogLyogZyAqLwlOVUxMLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RiMDIxOS5jIGIvZHJpdmVycy9jaGFyL3RiMDIxOS5jCmluZGV4IGIzZDQxMWEuLmFjMmEyOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90YjAyMTkuYworKysgYi9kcml2ZXJzL2NoYXIvdGIwMjE5LmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogIERyaXZlciBmb3IgVEFOQkFDIFRCMDIxOSBiYXNlIGJvYXJkLgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDUgIFlvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA1ICBZb2ljaGkgWXVhc2EgPHlvaWNoaV95dWFzYUB0cmlwZWFrcy5jby5qcD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGFzbS92cjQxeHgvZ2l1Lmg+CiAjaW5jbHVkZSA8YXNtL3ZyNDF4eC90YjAyMTkuaD4KIAotTU9EVUxFX0FVVEhPUigiWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4iKTsKK01PRFVMRV9BVVRIT1IoIllvaWNoaSBZdWFzYSA8eW9pY2hpX3l1YXNhQHRyaXBlYWtzLmNvLmpwPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJUQU5CQUMgVEIwMjE5IGJhc2UgYm9hcmQgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90bGNsay5jIGIvZHJpdmVycy9jaGFyL3RsY2xrLmMKaW5kZXggMTIxNjdjMC4uNGMyNzIxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RsY2xrLmMKKysrIGIvZHJpdmVycy9jaGFyL3RsY2xrLmMKQEAgLTM0LDcgKzM0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4JLyogcHJpbnRrKCkgKi8KICNpbmNsdWRlIDxsaW51eC9mcy5oPgkJLyogZXZlcnl0aGluZy4uLiAqLwogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CS8qIGVycm9yIGNvZGVzICovCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogdWRlbGF5ICovCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtMTU2LDYgKzE1NSw4IEBACiBkb2N1bWVudGVkIGluIHRoZSBNQ1BCTDAwMTAgVFBTIHVuZGVyIHRoZSBUZWxlY29tIENsb2NrIEFQSSBzZWN0aW9uLCAxMS40LgogYWxhcm1zCQkJCToKIGN1cnJlbnRfcmVmCQkJOgorcmVjZWl2ZWRfcmVmX2NsazNhCQk6CityZWNlaXZlZF9yZWZfY2xrM2IJCToKIGVuYWJsZV9jbGszYV9vdXRwdXQJCToKIGVuYWJsZV9jbGszYl9vdXRwdXQJCToKIGVuYWJsZV9jbGthMF9vdXRwdXQJCToKQEAgLTE2NSw3ICsxNjYsNyBAQAogZmlsdGVyX3NlbGVjdAkJCToKIGhhcmR3YXJlX3N3aXRjaGluZwkJOgogaGFyZHdhcmVfc3dpdGNoaW5nX21vZGUJCToKLWludGVycnVwdF9zd2l0Y2gJCToKK3RlbGNsb2NrX3ZlcnNpb24JCToKIG1vZGVfc2VsZWN0CQkJOgogcmVmYWxpZ24JCQk6CiByZXNldAkJCQk6CkBAIC0xNzMsNyArMTc0LDYgQEAKIHNlbGVjdF9hbWNiMl90cmFuc21pdF9jbG9jawk6CiBzZWxlY3RfcmVkdW5kYW50X2Nsb2NrCQk6CiBzZWxlY3RfcmVmX2ZyZXF1ZW5jeQkJOgotdGVzdF9tb2RlCQkJOgogCiBBbGwgc3lzZnMgaW50ZXJmYWNlcyBhcmUgaW50ZWdlcnMgaW4gaGV4IGZvcm1hdCwgaS5lIGVjaG8gOTkgPiByZWZhbGlnbgogaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBlY2hvIDB4OTkgPiByZWZhbGlnbi4KQEAgLTIxMSw3ICsyMTEsNyBAQAogCXJlc3VsdCA9IHJlcXVlc3RfaXJxKHRlbGNsa19pbnRlcnJ1cHQsICZ0bGNsa19pbnRlcnJ1cHQsCiAJCQkgICAgIFNBX0lOVEVSUlVQVCwgInRlbGNvX2Nsb2NrIiwgdGxjbGtfaW50ZXJydXB0KTsKIAlpZiAocmVzdWx0ID09IC1FQlVTWSkgewotCQlwcmludGsoS0VSTl9FUlIgInRlbGNvX2Nsb2NrOiBJbnRlcnJ1cHQgY2FuJ3QgYmUgcmVzZXJ2ZWQhXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0bGNsazogSW50ZXJydXB0IGNhbid0IGJlIHJlc2VydmVkLlxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWluYihUTENMS19SRUc2KTsJLyogQ2xlYXIgaW50ZXJydXB0IGV2ZW50cyAqLwpAQCAtMjI2LDcgKzIyNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXNzaXplX3QgdGxjbGtfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorc3RhdGljIHNzaXplX3QgdGxjbGtfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAogCQlsb2ZmX3QgKmZfcG9zKQogewogCWlmIChjb3VudCA8IHNpemVvZihzdHJ1Y3QgdGxjbGtfYWxhcm1zKSkKQEAgLTI0Miw3ICsyNDIsNyBAQAogCXJldHVybiAgc2l6ZW9mKHN0cnVjdCB0bGNsa19hbGFybXMpOwogfQogCi1zc2l6ZV90IHRsY2xrX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCitzdGF0aWMgc3NpemVfdCB0bGNsa193cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAogCSAgICBsb2ZmX3QgKmZfcG9zKQogewogCXJldHVybiAwOwpAQCAtMjc4LDIxICsyNzgsMjEgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihjdXJyZW50X3JlZiwgU19JUlVHTywgc2hvd19jdXJyZW50X3JlZiwgTlVMTCk7CiAKIAotc3RhdGljIHNzaXplX3Qgc2hvd19pbnRlcnJ1cHRfc3dpdGNoKHN0cnVjdCBkZXZpY2UgKmQsCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbGNsb2NrX3ZlcnNpb24oc3RydWN0IGRldmljZSAqZCwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAl1bnNpZ25lZCBsb25nIHJldF92YWw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZldmVudF9sb2NrLCBmbGFncyk7Ci0JcmV0X3ZhbCA9IGluYihUTENMS19SRUc2KTsKKwlyZXRfdmFsID0gaW5iKFRMQ0xLX1JFRzUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2ZW50X2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JWxYXG4iLCByZXRfdmFsKTsKIH0KIAotc3RhdGljIERFVklDRV9BVFRSKGludGVycnVwdF9zd2l0Y2gsIFNfSVJVR08sCi0JCXNob3dfaW50ZXJydXB0X3N3aXRjaCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGVsY2xvY2tfdmVyc2lvbiwgU19JUlVHTywKKwkJc2hvd190ZWxjbG9ja192ZXJzaW9uLCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybXMoc3RydWN0IGRldmljZSAqZCwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsICBjaGFyICpidWYpCkBAIC0zMDksNiArMzA5LDUwIEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08sIHNob3dfYWxhcm1zLCBOVUxMKTsKIAorc3RhdGljIHNzaXplX3Qgc3RvcmVfcmVjZWl2ZWRfcmVmX2NsazNhKHN0cnVjdCBkZXZpY2UgKmQsCisJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJdW5zaWduZWQgY2hhciB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNzY2FuZihidWYsICIlbFgiLCAmdG1wKTsKKwlkZXZfZGJnKGQsICI6IHRtcCA9IDB4JWxYXG4iLCB0bXApOworCisJdmFsID0gKHVuc2lnbmVkIGNoYXIpdG1wOworCXNwaW5fbG9ja19pcnFzYXZlKCZldmVudF9sb2NrLCBmbGFncyk7CisJU0VUX1BPUlRfQklUUyhUTENMS19SRUcxLCAweGVmLCB2YWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2ZW50X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBzdHJubGVuKGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIocmVjZWl2ZWRfcmVmX2NsazNhLCBTX0lXVUdPLCBOVUxMLAorCQlzdG9yZV9yZWNlaXZlZF9yZWZfY2xrM2EpOworCisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3JlY2VpdmVkX3JlZl9jbGszYihzdHJ1Y3QgZGV2aWNlICpkLAorCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCXVuc2lnbmVkIGNoYXIgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzc2NhbmYoYnVmLCAiJWxYIiwgJnRtcCk7CisJZGV2X2RiZyhkLCAiOiB0bXAgPSAweCVsWFxuIiwgdG1wKTsKKworCXZhbCA9ICh1bnNpZ25lZCBjaGFyKXRtcDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXZlbnRfbG9jaywgZmxhZ3MpOworCVNFVF9QT1JUX0JJVFMoVExDTEtfUkVHMSwgMHhlZiwgdmFsIDw8IDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2ZW50X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBzdHJubGVuKGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIocmVjZWl2ZWRfcmVmX2NsazNiLCBTX0lXVUdPLCBOVUxMLAorCQlzdG9yZV9yZWNlaXZlZF9yZWZfY2xrM2IpOworCisKIHN0YXRpYyBzc2l6ZV90IHN0b3JlX2VuYWJsZV9jbGszYl9vdXRwdXQoc3RydWN0IGRldmljZSAqZCwKIAkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKQEAgLTQzNiwyNiArNDgwLDYgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihlbmFibGVfY2xrYTBfb3V0cHV0LCBTX0lXVUdPLCBOVUxMLAogCQlzdG9yZV9lbmFibGVfY2xrYTBfb3V0cHV0KTsKIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfdGVzdF9tb2RlKHN0cnVjdCBkZXZpY2UgKmQsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQl1bnNpZ25lZCBjaGFyIHZhbDsKLQotCXNzY2FuZihidWYsICIlbFgiLCAmdG1wKTsKLQlkZXZfZGJnKGQsICJ0bXAgPSAweCVsWFxuIiwgdG1wKTsKLQotCXZhbCA9ICh1bnNpZ25lZCBjaGFyKXRtcDsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZXZlbnRfbG9jaywgZmxhZ3MpOwotCVNFVF9QT1JUX0JJVFMoVExDTEtfUkVHNCwgMHhmZCwgMik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHN0cm5sZW4oYnVmLCBjb3VudCk7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUih0ZXN0X21vZGUsIFNfSVdVR08sIE5VTEwsIHN0b3JlX3Rlc3RfbW9kZSk7Ci0KIHN0YXRpYyBzc2l6ZV90IHN0b3JlX3NlbGVjdF9hbWNiMl90cmFuc21pdF9jbG9jayhzdHJ1Y3QgZGV2aWNlICpkLAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CkBAIC00NzUsNyArNDk5LDcgQEAKIAkJCVNFVF9QT1JUX0JJVFMoVExDTEtfUkVHMywgMHhjNywgMHgzOCk7CiAJCQlzd2l0Y2ggKHZhbCkgewogCQkJY2FzZSBDTEtfOF81OTJNSHo6Ci0JCQkJU0VUX1BPUlRfQklUUyhUTENMS19SRUcwLCAweGZjLCAxKTsKKwkJCQlTRVRfUE9SVF9CSVRTKFRMQ0xLX1JFRzAsIDB4ZmMsIDIpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBDTEtfMTFfMTg0TUh6OgogCQkJCVNFVF9QT1JUX0JJVFMoVExDTEtfUkVHMCwgMHhmYywgMCk7CkBAIC00ODQsNyArNTA4LDcgQEAKIAkJCQlTRVRfUE9SVF9CSVRTKFRMQ0xLX1JFRzAsIDB4ZmMsIDMpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBDTEtfNDRfNzM2TUh6OgotCQkJCVNFVF9QT1JUX0JJVFMoVExDTEtfUkVHMCwgMHhmYywgMik7CisJCQkJU0VUX1BPUlRfQklUUyhUTENMS19SRUcwLCAweGZjLCAxKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfSBlbHNlCkBAIC02NTMsOSArNjc3LDcgQEAKIAlkZXZfZGJnKGQsICJ0bXAgPSAweCVsWFxuIiwgdG1wKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZXZlbnRfbG9jaywgZmxhZ3MpOwogCVNFVF9QT1JUX0JJVFMoVExDTEtfUkVHMCwgMHhmNywgMCk7Ci0JdWRlbGF5KDIpOwogCVNFVF9QT1JUX0JJVFMoVExDTEtfUkVHMCwgMHhmNywgMHgwOCk7Ci0JdWRlbGF5KDIpOwogCVNFVF9QT1JUX0JJVFMoVExDTEtfUkVHMCwgMHhmNywgMCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRfbG9jaywgZmxhZ3MpOwogCkBAIC03MDYsMTUgKzcyOCwxNiBAQAogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdGxjbGtfc3lzZnNfZW50cmllc1tdID0gewogCSZkZXZfYXR0cl9jdXJyZW50X3JlZi5hdHRyLAotCSZkZXZfYXR0cl9pbnRlcnJ1cHRfc3dpdGNoLmF0dHIsCisJJmRldl9hdHRyX3RlbGNsb2NrX3ZlcnNpb24uYXR0ciwKIAkmZGV2X2F0dHJfYWxhcm1zLmF0dHIsCisJJmRldl9hdHRyX3JlY2VpdmVkX3JlZl9jbGszYS5hdHRyLAorCSZkZXZfYXR0cl9yZWNlaXZlZF9yZWZfY2xrM2IuYXR0ciwKIAkmZGV2X2F0dHJfZW5hYmxlX2NsazNhX291dHB1dC5hdHRyLAogCSZkZXZfYXR0cl9lbmFibGVfY2xrM2Jfb3V0cHV0LmF0dHIsCiAJJmRldl9hdHRyX2VuYWJsZV9jbGtiMV9vdXRwdXQuYXR0ciwKIAkmZGV2X2F0dHJfZW5hYmxlX2Nsa2ExX291dHB1dC5hdHRyLAogCSZkZXZfYXR0cl9lbmFibGVfY2xrYjBfb3V0cHV0LmF0dHIsCiAJJmRldl9hdHRyX2VuYWJsZV9jbGthMF9vdXRwdXQuYXR0ciwKLQkmZGV2X2F0dHJfdGVzdF9tb2RlLmF0dHIsCiAJJmRldl9hdHRyX3NlbGVjdF9hbWNiMV90cmFuc21pdF9jbG9jay5hdHRyLAogCSZkZXZfYXR0cl9zZWxlY3RfYW1jYjJfdHJhbnNtaXRfY2xvY2suYXR0ciwKIAkmZGV2X2F0dHJfc2VsZWN0X3JlZHVuZGFudF9jbG9jay5hdHRyLApAQCAtNzQxLDcgKzc2NCw3IEBACiAKIAlyZXQgPSByZWdpc3Rlcl9jaHJkZXYodGxjbGtfbWFqb3IsICJ0ZWxjb19jbG9jayIsICZ0bGNsa19mb3BzKTsKIAlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgInRlbGNvX2Nsb2NrOiBjYW4ndCBnZXQgbWFqb3IhICVkXG4iLCB0bGNsa19tYWpvcik7CisJCXByaW50ayhLRVJOX0VSUiAidGxjbGs6IGNhbid0IGdldCBtYWpvciAlZC5cbiIsIHRsY2xrX21ham9yKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJYWxhcm1fZXZlbnRzID0ga3phbGxvYyggc2l6ZW9mKHN0cnVjdCB0bGNsa19hbGFybXMpLCBHRlBfS0VSTkVMKTsKQEAgLTc1MCw3ICs3NzMsNyBAQAogCiAJLyogUmVhZCB0ZWxlY29tIGNsb2NrIElSUSBudW1iZXIgKFNldCBieSBCSU9TKSAqLwogCWlmICghcmVxdWVzdF9yZWdpb24oVExDTEtfQkFTRSwgOCwgInRlbGNvX2Nsb2NrIikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0bGNsazogcmVxdWVzdF9yZWdpb24gZmFpbGVkISAweCVYXG4iLAorCQlwcmludGsoS0VSTl9FUlIgInRsY2xrOiByZXF1ZXN0X3JlZ2lvbiAweCVYIGZhaWxlZC5cbiIsCiAJCQlUTENMS19CQVNFKTsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIG91dDI7CkBAIC03NTgsNyArNzgxLDcgQEAKIAl0ZWxjbGtfaW50ZXJydXB0ID0gKGluYihUTENMS19SRUc3KSAmIDB4MGYpOwogCiAJaWYgKDB4MEYgPT0gdGVsY2xrX2ludGVycnVwdCApIHsgLyogbm90IE1DUEJMMDAxMCA/ICovCi0JCXByaW50ayhLRVJOX0VSUiAidGVsY2xrX2ludGVycnVwID0gMHgleCBub24tbWNwYmwwMDEwIGh3XG4iLAorCQlwcmludGsoS0VSTl9FUlIgInRlbGNsa19pbnRlcnJ1cCA9IDB4JXggbm9uLW1jcGJsMDAxMCBody5cbiIsCiAJCQl0ZWxjbGtfaW50ZXJydXB0KTsKIAkJcmV0ID0gLUVOWElPOwogCQlnb3RvIG91dDM7CkBAIC03NjgsNyArNzkxLDcgQEAKIAogCXJldCA9IG1pc2NfcmVnaXN0ZXIoJnRsY2xrX21pc2NkZXYpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiIG1pc2NfcmVnaXN0ZXIgcmV0cnVucyAlZFxuIiwgcmV0KTsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0bGNsazogbWlzY19yZWdpc3RlciByZXR1cm5zICVkLlxuIiwgcmV0KTsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIG91dDM7CiAJfQpAQCAtNzc2LDggKzc5OSw3IEBACiAJdGxjbGtfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgidGVsY29fY2xvY2siLAogCQkJCS0xLCBOVUxMLCAwKTsKIAlpZiAoIXRsY2xrX2RldmljZSkgewotCQlwcmludGsoS0VSTl9FUlIgIiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIgcmV0cnVucyAweCVYXG4iLAotCQkJKHVuc2lnbmVkIGludCkgdGxjbGtfZGV2aWNlKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0bGNsazogcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZC5cbiIpOwogCQlyZXQgPSAtRUJVU1k7CiAJCWdvdG8gb3V0NDsKIAl9CkBAIC03ODUsNyArODA3LDcgQEAKIAlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnRsY2xrX2RldmljZS0+ZGV2LmtvYmosCiAJCQkmdGxjbGtfYXR0cmlidXRlX2dyb3VwKTsKIAlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBkZXZpY2UgYXR0cmlidXRlc1xuIik7CisJCXByaW50ayhLRVJOX0VSUiAidGxjbGs6IGZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZGV2aWNlIGF0dHJpYnV0ZXMuXG4iKTsKIAkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZ0bGNsa19kZXZpY2UtPmRldi5rb2JqLAogCQkJJnRsY2xrX2F0dHJpYnV0ZV9ncm91cCk7CiAJCWdvdG8gb3V0NTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvdHBtL01ha2VmaWxlCmluZGV4IDIzOTJlNDAuLmJhNDU4MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90cG0vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jaGFyL3RwbS9NYWtlZmlsZQpAQCAtMiw2ICsyLDkgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBrZXJuZWwgdHBtIGRldmljZSBkcml2ZXJzLgogIwogb2JqLSQoQ09ORklHX1RDR19UUE0pICs9IHRwbS5vCitpZmRlZiBDT05GSUdfQUNQSQorCW9iai0kKENPTkZJR19UQ0dfVFBNKSArPSB0cG1fYmlvcy5vCitlbmRpZgogb2JqLSQoQ09ORklHX1RDR19OU0MpICs9IHRwbV9uc2Mubwogb2JqLSQoQ09ORklHX1RDR19BVE1FTCkgKz0gdHBtX2F0bWVsLm8KIG9iai0kKENPTkZJR19UQ0dfSU5GSU5FT04pICs9IHRwbV9pbmZpbmVvbi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG0uYwppbmRleCBhOWJlMGU4Li41YTM4NzA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmMKQEAgLTQ2Niw2ICs0NjYsNyBAQAogCWtmcmVlKGNoaXAtPnZlbmRvci0+bWlzY2Rldi5uYW1lKTsKIAogCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5rb2JqLCBjaGlwLT52ZW5kb3ItPmF0dHJfZ3JvdXApOworCXRwbV9iaW9zX2xvZ190ZWFyZG93bihjaGlwLT5iaW9zX2Rpcik7CiAKIAlkZXZfbWFza1tjaGlwLT5kZXZfbnVtIC8gVFBNX05VTV9NQVNLX0VOVFJJRVMgXSAmPQogCQl+KDEgPDwgKGNoaXAtPmRldl9udW0gJSBUUE1fTlVNX01BU0tfRU5UUklFUykpOwpAQCAtNTkzLDYgKzU5NCw4IEBACiAKIAlzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgY2hpcC0+dmVuZG9yLT5hdHRyX2dyb3VwKTsKIAorCWNoaXAtPmJpb3NfZGlyID0gdHBtX2Jpb3NfbG9nX3NldHVwKGRldm5hbWUpOworCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh0cG1fcmVnaXN0ZXJfaGFyZHdhcmUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG0uaCBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmgKaW5kZXggMTU5ODgyYy4uZmQzYTRiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG0uaAorKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS5oCkBAIC04Miw2ICs4Miw4IEBACiAKIAlzdHJ1Y3QgdHBtX3ZlbmRvcl9zcGVjaWZpYyAqdmVuZG9yOwogCisJc3RydWN0IGRlbnRyeSAqKmJpb3NfZGlyOworCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogfTsKIApAQCAtMTA3LDMgKzEwOSwxNiBAQAogZXh0ZXJuIHZvaWQgdHBtX3JlbW92ZV9oYXJkd2FyZShzdHJ1Y3QgZGV2aWNlICopOwogZXh0ZXJuIGludCB0cG1fcG1fc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICosIHBtX21lc3NhZ2VfdCk7CiBleHRlcm4gaW50IHRwbV9wbV9yZXN1bWUoc3RydWN0IGRldmljZSAqKTsKKworI2lmZGVmIENPTkZJR19BQ1BJCitleHRlcm4gc3RydWN0IGRlbnRyeSAqKiB0cG1fYmlvc19sb2dfc2V0dXAoY2hhciAqKTsKK2V4dGVybiB2b2lkIHRwbV9iaW9zX2xvZ190ZWFyZG93bihzdHJ1Y3QgZGVudHJ5ICoqKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkZW50cnkqIHRwbV9iaW9zX2xvZ19zZXR1cChjaGFyICpuYW1lKQoreworCXJldHVybiBOVUxMOworfQorc3RhdGljIGlubGluZSB2b2lkIHRwbV9iaW9zX2xvZ190ZWFyZG93bihzdHJ1Y3QgZGVudHJ5ICoqZGlyKQoreworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV9iaW9zLmMgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbV9iaW9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVkZjdhOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX2Jpb3MuYwpAQCAtMCwwICsxLDU0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBBdXRob3JzOgorICoJU2VpamkgTXVuZXRvaCA8bXVuZXRvaEBqcC5pYm0uY29tPgorICoJU3RlZmFuIEJlcmdlciA8c3RlZmFuYkB1cy5pYm0uY29tPgorICoJUmVpbmVyIFNhaWxlciA8c2FpbGVyQHdhdHNvbi5pYm0uY29tPgorICoJS3lsZW5lIEhhbGwgPGtqaGFsbEB1cy5pYm0uY29tPgorICoKKyAqIEFjY2VzcyB0byB0aGUgZXZlbnRsb2cgZXh0ZW5kZWQgYnkgdGhlIFRDRyBCSU9TIG9mIFBDIHBsYXRmb3JtCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgPGFjcGkvYWN0eXBlcy5oPgorI2luY2x1ZGUgPGFjcGkvYWN0YmwuaD4KKyNpbmNsdWRlICJ0cG0uaCIKKworI2RlZmluZSBUQ0dfRVZFTlRfTkFNRV9MRU5fTUFYCTI1NQorI2RlZmluZSBNQVhfVEVYVF9FVkVOVAkJMTAwMAkvKiBNYXggZXZlbnQgc3RyaW5nIGxlbmd0aCAqLworI2RlZmluZSBBQ1BJX1RDUEFfU0lHCQkiVENQQSIJLyogMHg0MTUwNDM1NCAvJ1RDUEEnICovCisKK3N0cnVjdCB0cG1fYmlvc19sb2cgeworCXZvaWQgKmJpb3NfZXZlbnRfbG9nOworCXZvaWQgKmJpb3NfZXZlbnRfbG9nX2VuZDsKK307CisKK3N0cnVjdCBhY3BpX3RjcGEgeworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBoZHI7CisJdTE2IHJlc2VydmVkOworCXUzMiBsb2dfbWF4X2xlbiBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJdTMyIGxvZ19zdGFydF9hZGRyIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK307CisKK3N0cnVjdCB0Y3BhX2V2ZW50IHsKKwl1MzIgcGNyX2luZGV4OworCXUzMiBldmVudF90eXBlOworCXU4IHBjcl92YWx1ZVsyMF07CS8qIFNIQTEgKi8KKwl1MzIgZXZlbnRfc2l6ZTsKKwl1OCBldmVudF9kYXRhWzBdOworfTsKKworZW51bSB0Y3BhX2V2ZW50X3R5cGVzIHsKKwlQUkVCT09UID0gMCwKKwlQT1NUX0NPREUsCisJVU5VU0VELAorCU5PX0FDVElPTiwKKwlTRVBBUkFUT1IsCisJQUNUSU9OLAorCUVWRU5UX1RBRywKKwlTQ1JUTV9DT05URU5UUywKKwlTQ1JUTV9WRVJTSU9OLAorCUNQVV9NSUNST0NPREUsCisJUExBVEZPUk1fQ09ORklHX0ZMQUdTLAorCVRBQkxFX09GX0RFVklDRVMsCisJQ09NUEFDVF9IQVNILAorCUlQTCwKKwlJUExfUEFSVElUSU9OX0RBVEEsCisJTk9OSE9TVF9DT0RFLAorCU5PTkhPU1RfQ09ORklHLAorCU5PTkhPU1RfSU5GTywKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiB0Y3BhX2V2ZW50X3R5cGVfc3RyaW5nc1tdID0geworCSJQUkVCT09UIiwKKwkiUE9TVCBDT0RFIiwKKwkiIiwKKwkiTk8gQUNUSU9OIiwKKwkiU0VQQVJBVE9SIiwKKwkiQUNUSU9OIiwKKwkiRVZFTlQgVEFHIiwKKwkiUy1DUlRNIENvbnRlbnRzIiwKKwkiUy1DUlRNIFZlcnNpb24iLAorCSJDUFUgTWljcm9jb2RlIiwKKwkiUGxhdGZvcm0gQ29uZmlnIEZsYWdzIiwKKwkiVGFibGUgb2YgRGV2aWNlcyIsCisJIkNvbXBhY3QgSGFzaCIsCisJIklQTCIsCisJIklQTCBQYXJ0aXRpb24gRGF0YSIsCisJIk5vbi1Ib3N0IENvZGUiLAorCSJOb24tSG9zdCBDb25maWciLAorCSJOb24tSG9zdCBJbmZvIgorfTsKKworZW51bSB0Y3BhX3BjX2V2ZW50X2lkcyB7CisJU01CSU9TID0gMSwKKwlCSVNfQ0VSVCwKKwlQT1NUX0JJT1NfUk9NLAorCUVTQ0QsCisJQ01PUywKKwlOVlJBTSwKKwlPUFRJT05fUk9NX0VYRUMsCisJT1BUSU9OX1JPTV9DT05GSUcsCisJT1BUSU9OX1JPTV9NSUNST0NPREUsCisJU19DUlRNX1ZFUlNJT04sCisJU19DUlRNX0NPTlRFTlRTLAorCVBPU1RfQ09OVEVOVFMsCit9OworCitzdGF0aWMgY29uc3QgY2hhciogdGNwYV9wY19ldmVudF9pZF9zdHJpbmdzW10gPSB7CisJIiIKKwkiU01CSU9TIiwKKwkiQklTIENlcnRpZmljYXRlIiwKKwkiUE9TVCBCSU9TICIsCisJIkVTQ0QgIiwKKwkiQ01PUyIsCisJIk5WUkFNIiwKKwkiT3B0aW9uIFJPTSIsCisJIk9wdGlvbiBST00gY29uZmlnIiwKKwkiT3B0aW9uIFJPTSBtaWNyb2NvZGUiLAorCSJTLUNSVE0gVmVyc2lvbiIsCisJIlMtQ1JUTSBDb250ZW50cyIsCisJIlMtQ1JUTSBQT1NUIENvbnRlbnRzIiwKK307CisKKy8qIHJldHVybnMgcG9pbnRlciB0byBzdGFydCBvZiBwb3MuIGVudHJ5IG9mIHRjZyBsb2cgKi8KK3N0YXRpYyB2b2lkICp0cG1fYmlvc19tZWFzdXJlbWVudHNfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKK3sKKwlsb2ZmX3QgaTsKKwlzdHJ1Y3QgdHBtX2Jpb3NfbG9nICpsb2cgPSBtLT5wcml2YXRlOworCXZvaWQgKmFkZHIgPSBsb2ctPmJpb3NfZXZlbnRfbG9nOworCXZvaWQgKmxpbWl0ID0gbG9nLT5iaW9zX2V2ZW50X2xvZ19lbmQ7CisJc3RydWN0IHRjcGFfZXZlbnQgKmV2ZW50OworCisJLyogcmVhZCBvdmVyICpwb3MgbWVhc3VyZW1lbnRzICovCisJZm9yIChpID0gMDsgaSA8ICpwb3M7IGkrKykgeworCQlldmVudCA9IGFkZHI7CisKKwkJaWYgKChhZGRyICsgc2l6ZW9mKHN0cnVjdCB0Y3BhX2V2ZW50KSkgPCBsaW1pdCkgeworCQkJaWYgKGV2ZW50LT5ldmVudF90eXBlID09IDAgJiYgZXZlbnQtPmV2ZW50X3NpemUgPT0gMCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCWFkZHIgKz0gc2l6ZW9mKHN0cnVjdCB0Y3BhX2V2ZW50KSArIGV2ZW50LT5ldmVudF9zaXplOworCQl9CisJfQorCisJLyogbm93IGNoZWNrIGlmIGN1cnJlbnQgZW50cnkgaXMgdmFsaWQgKi8KKwlpZiAoKGFkZHIgKyBzaXplb2Yoc3RydWN0IHRjcGFfZXZlbnQpKSA+PSBsaW1pdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlldmVudCA9IGFkZHI7CisKKwlpZiAoKGV2ZW50LT5ldmVudF90eXBlID09IDAgJiYgZXZlbnQtPmV2ZW50X3NpemUgPT0gMCkgfHwKKwkgICAgKChhZGRyICsgc2l6ZW9mKHN0cnVjdCB0Y3BhX2V2ZW50KSArIGV2ZW50LT5ldmVudF9zaXplKSA+PSBsaW1pdCkpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGFkZHI7Cit9CisKK3N0YXRpYyB2b2lkICp0cG1fYmlvc19tZWFzdXJlbWVudHNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsCisJCQkJCWxvZmZfdCAqcG9zKQoreworCXN0cnVjdCB0Y3BhX2V2ZW50ICpldmVudCA9IHY7CisJc3RydWN0IHRwbV9iaW9zX2xvZyAqbG9nID0gbS0+cHJpdmF0ZTsKKwl2b2lkICpsaW1pdCA9IGxvZy0+Ymlvc19ldmVudF9sb2dfZW5kOworCisJdiArPSBzaXplb2Yoc3RydWN0IHRjcGFfZXZlbnQpICsgZXZlbnQtPmV2ZW50X3NpemU7CisKKwkvKiBub3cgY2hlY2sgaWYgY3VycmVudCBlbnRyeSBpcyB2YWxpZCAqLworCWlmICgodiArIHNpemVvZihzdHJ1Y3QgdGNwYV9ldmVudCkpID49IGxpbWl0KQorCQlyZXR1cm4gTlVMTDsKKworCWV2ZW50ID0gdjsKKworCWlmIChldmVudC0+ZXZlbnRfdHlwZSA9PSAwICYmIGV2ZW50LT5ldmVudF9zaXplID09IDApCisJCXJldHVybiBOVUxMOworCisJaWYgKChldmVudC0+ZXZlbnRfdHlwZSA9PSAwICYmIGV2ZW50LT5ldmVudF9zaXplID09IDApIHx8CisJICAgICgodiArIHNpemVvZihzdHJ1Y3QgdGNwYV9ldmVudCkgKyBldmVudC0+ZXZlbnRfc2l6ZSkgPj0gbGltaXQpKQorCQlyZXR1cm4gTlVMTDsKKworCSgqcG9zKSsrOworCXJldHVybiB2OworfQorCitzdGF0aWMgdm9pZCB0cG1fYmlvc19tZWFzdXJlbWVudHNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2V2ZW50X25hbWUoY2hhciAqZGVzdCwgc3RydWN0IHRjcGFfZXZlbnQgKmV2ZW50LAorCQkJdW5zaWduZWQgY2hhciAqIGV2ZW50X2VudHJ5KQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSAiIjsKKwljaGFyIGRhdGFbNDBdID0gIiI7CisJaW50IGksIG5fbGVuID0gMCwgZF9sZW4gPSAwOworCXUzMiBldmVudF9pZCwgZXZlbnRfZGF0YV9zaXplOworCisJc3dpdGNoKGV2ZW50LT5ldmVudF90eXBlKSB7CisJY2FzZSBQUkVCT09UOgorCWNhc2UgUE9TVF9DT0RFOgorCWNhc2UgVU5VU0VEOgorCWNhc2UgTk9fQUNUSU9OOgorCWNhc2UgU0NSVE1fQ09OVEVOVFM6CisJY2FzZSBTQ1JUTV9WRVJTSU9OOgorCWNhc2UgQ1BVX01JQ1JPQ09ERToKKwljYXNlIFBMQVRGT1JNX0NPTkZJR19GTEFHUzoKKwljYXNlIFRBQkxFX09GX0RFVklDRVM6CisJY2FzZSBDT01QQUNUX0hBU0g6CisJY2FzZSBJUEw6CisJY2FzZSBJUExfUEFSVElUSU9OX0RBVEE6CisJY2FzZSBOT05IT1NUX0NPREU6CisJY2FzZSBOT05IT1NUX0NPTkZJRzoKKwljYXNlIE5PTkhPU1RfSU5GTzoKKwkJbmFtZSA9IHRjcGFfZXZlbnRfdHlwZV9zdHJpbmdzW2V2ZW50LT5ldmVudF90eXBlXTsKKwkJbl9sZW4gPSBzdHJsZW4obmFtZSk7CisJCWJyZWFrOworCWNhc2UgU0VQQVJBVE9SOgorCWNhc2UgQUNUSU9OOgorCQlpZiAoTUFYX1RFWFRfRVZFTlQgPiBldmVudC0+ZXZlbnRfc2l6ZSkgeworCQkJbmFtZSA9IGV2ZW50X2VudHJ5OworCQkJbl9sZW4gPSBldmVudC0+ZXZlbnRfc2l6ZTsKKwkJfQorCQlicmVhazsKKwljYXNlIEVWRU5UX1RBRzoKKwkJZXZlbnRfaWQgPSBiZTMyX3RvX2NwdShldmVudF9lbnRyeSk7CisJCWV2ZW50X2RhdGFfc2l6ZSA9IGJlMzJfdG9fY3B1KCZldmVudF9lbnRyeVs0XSk7CisKKwkJLyogVG9EbyBSb3cgZGF0YSAtPiBCYXNlNjQgKi8KKworCQlzd2l0Y2ggKGV2ZW50X2lkKSB7CisJCWNhc2UgU01CSU9TOgorCQljYXNlIEJJU19DRVJUOgorCQljYXNlIENNT1M6CisJCWNhc2UgTlZSQU06CisJCWNhc2UgT1BUSU9OX1JPTV9FWEVDOgorCQljYXNlIE9QVElPTl9ST01fQ09ORklHOgorCQljYXNlIE9QVElPTl9ST01fTUlDUk9DT0RFOgorCQljYXNlIFNfQ1JUTV9WRVJTSU9OOgorCQljYXNlIFNfQ1JUTV9DT05URU5UUzoKKwkJY2FzZSBQT1NUX0NPTlRFTlRTOgorCQkJbmFtZSA9IHRjcGFfcGNfZXZlbnRfaWRfc3RyaW5nc1tldmVudF9pZF07CisJCQluX2xlbiA9IHN0cmxlbihuYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIFBPU1RfQklPU19ST006CisJCWNhc2UgRVNDRDoKKwkJCW5hbWUgPSB0Y3BhX3BjX2V2ZW50X2lkX3N0cmluZ3NbZXZlbnRfaWRdOworCQkJbl9sZW4gPSBzdHJsZW4obmFtZSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykKKwkJCQlkX2xlbiArPSBzcHJpbnRmKGRhdGEsICIlMDJ4IiwKKwkJCQkJCWV2ZW50X2VudHJ5WzggKyBpXSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHNucHJpbnRmKGRlc3QsIE1BWF9URVhUX0VWRU5ULCAiWyUuKnMlLipzXSIsCisJCQluX2xlbiwgbmFtZSwgZF9sZW4sIGRhdGEpOworCit9CisKK3N0YXRpYyBpbnQgdHBtX2JpbmFyeV9iaW9zX21lYXN1cmVtZW50c19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKworCWNoYXIgKmV2ZW50bmFtZTsKKwljaGFyIGRhdGFbNF07CisJdTMyIGhlbHA7CisJaW50IGksIGxlbjsKKwlzdHJ1Y3QgdGNwYV9ldmVudCAqZXZlbnQgPSAoc3RydWN0IHRjcGFfZXZlbnQgKikgdjsKKwl1bnNpZ25lZCBjaGFyICpldmVudF9lbnRyeSA9CisJICAgICh1bnNpZ25lZCBjaGFyICopICh2ICsgc2l6ZW9mKHN0cnVjdCB0Y3BhX2V2ZW50KSk7CisKKwlldmVudG5hbWUgPSBrbWFsbG9jKE1BWF9URVhUX0VWRU5ULCBHRlBfS0VSTkVMKTsKKwlpZiAoIWV2ZW50bmFtZSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFUlJPUiAtIE5vIE1lbW9yeSBmb3IgZXZlbnQgbmFtZVxuICIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIDFzdDogUENSIHVzZWQgaXMgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQgKDQgYnl0ZXMpICovCisJaGVscCA9IGxlMzJfdG9fY3B1KGV2ZW50LT5wY3JfaW5kZXgpOworCW1lbWNweShkYXRhLCAmaGVscCwgNCk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJc2VxX3B1dGMobSwgZGF0YVtpXSk7CisKKwkvKiAybmQ6IFNIQTEgKDIwIGJ5dGVzKSAqLworCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKQorCQlzZXFfcHV0YyhtLCBldmVudC0+cGNyX3ZhbHVlW2ldKTsKKworCS8qIDNyZDogZXZlbnQgdHlwZSBpZGVudGlmaWVyICg0IGJ5dGVzKSAqLworCWhlbHAgPSBsZTMyX3RvX2NwdShldmVudC0+ZXZlbnRfdHlwZSk7CisJbWVtY3B5KGRhdGEsICZoZWxwLCA0KTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQlzZXFfcHV0YyhtLCBkYXRhW2ldKTsKKworCWxlbiA9IDA7CisKKwlsZW4gKz0gZ2V0X2V2ZW50X25hbWUoZXZlbnRuYW1lLCBldmVudCwgZXZlbnRfZW50cnkpOworCisJLyogNHRoOiAgZmlsZW5hbWUgPD0gMjU1ICsgXCcwJyBkZWxpbWl0ZXIgKi8KKwlpZiAobGVuID4gVENHX0VWRU5UX05BTUVfTEVOX01BWCkKKwkJbGVuID0gVENHX0VWRU5UX05BTUVfTEVOX01BWDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJc2VxX3B1dGMobSwgZXZlbnRuYW1lW2ldKTsKKworCS8qIDV0aDogZGVsaW1pdGVyICovCisJc2VxX3B1dGMobSwgJ1wwJyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0cG1fYmlvc19tZWFzdXJlbWVudHNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICpzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHRwbV9iaW9zX2xvZyAqbG9nID0gc2VxLT5wcml2YXRlOworCisJaWYgKGxvZykgeworCQlrZnJlZShsb2ctPmJpb3NfZXZlbnRfbG9nKTsKKwkJa2ZyZWUobG9nKTsKKwl9CisKKwlyZXR1cm4gc2VxX3JlbGVhc2UoaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IHRwbV9hc2NpaV9iaW9zX21lYXN1cmVtZW50c19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlpbnQgbGVuID0gMDsKKwlpbnQgaTsKKwljaGFyICpldmVudG5hbWU7CisJc3RydWN0IHRjcGFfZXZlbnQgKmV2ZW50ID0gdjsKKwl1bnNpZ25lZCBjaGFyICpldmVudF9lbnRyeSA9CisJICAgICh1bnNpZ25lZCBjaGFyICopICh2ICsgc2l6ZW9mKHN0cnVjdCB0Y3BhX2V2ZW50KSk7CisKKwlldmVudG5hbWUgPSBrbWFsbG9jKE1BWF9URVhUX0VWRU5ULCBHRlBfS0VSTkVMKTsKKwlpZiAoIWV2ZW50bmFtZSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFUlJPUiAtIE5vIE1lbW9yeSBmb3IgZXZlbnQgbmFtZVxuICIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXNlcV9wcmludGYobSwgIiUyZCAiLCBldmVudC0+cGNyX2luZGV4KTsKKworCS8qIDJuZDogU0hBMSAqLworCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKQorCQlzZXFfcHJpbnRmKG0sICIlMDJ4IiwgZXZlbnQtPnBjcl92YWx1ZVtpXSk7CisKKwkvKiAzcmQ6IGV2ZW50IHR5cGUgaWRlbnRpZmllciAqLworCXNlcV9wcmludGYobSwgIiAlMDJ4IiwgZXZlbnQtPmV2ZW50X3R5cGUpOworCisJbGVuICs9IGdldF9ldmVudF9uYW1lKGV2ZW50bmFtZSwgZXZlbnQsIGV2ZW50X2VudHJ5KTsKKworCS8qIDR0aDogZXZlbnRuYW1lIDw9IG1heCArIFwnMCcgZGVsaW1pdGVyICovCisJc2VxX3ByaW50ZihtLCAiICVzXG4iLCBldmVudG5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgdHBtX2FzY2lpX2JfbWVhc3VybWVudHNfc2Vxb3BzID0geworCS5zdGFydCA9IHRwbV9iaW9zX21lYXN1cmVtZW50c19zdGFydCwKKwkubmV4dCA9IHRwbV9iaW9zX21lYXN1cmVtZW50c19uZXh0LAorCS5zdG9wID0gdHBtX2Jpb3NfbWVhc3VyZW1lbnRzX3N0b3AsCisJLnNob3cgPSB0cG1fYXNjaWlfYmlvc19tZWFzdXJlbWVudHNfc2hvdywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgdHBtX2JpbmFyeV9iX21lYXN1cm1lbnRzX3NlcW9wcyA9IHsKKwkuc3RhcnQgPSB0cG1fYmlvc19tZWFzdXJlbWVudHNfc3RhcnQsCisJLm5leHQgPSB0cG1fYmlvc19tZWFzdXJlbWVudHNfbmV4dCwKKwkuc3RvcCA9IHRwbV9iaW9zX21lYXN1cmVtZW50c19zdG9wLAorCS5zaG93ID0gdHBtX2JpbmFyeV9iaW9zX21lYXN1cmVtZW50c19zaG93LAorfTsKKworLyogcmVhZCBiaW5hcnkgYmlvcyBsb2cgKi8KK3N0YXRpYyBpbnQgcmVhZF9sb2coc3RydWN0IHRwbV9iaW9zX2xvZyAqbG9nKQoreworCXN0cnVjdCBhY3BpX3RjcGEgKmJ1ZmY7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXZvaWQgKnZpcnQ7CisKKwlpZiAobG9nLT5iaW9zX2V2ZW50X2xvZyAhPSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBFUlJPUiAtIEV2ZW50bG9nIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIEZpbmQgVENQQSBlbnRyeSBpbiBSU0RUIChBQ1BJX0xPR0lDQUxfQUREUkVTU0lORykgKi8KKwlzdGF0dXMgPSBhY3BpX2dldF9maXJtd2FyZV90YWJsZShBQ1BJX1RDUEFfU0lHLCAxLAorCQkJCQkgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcsCisJCQkJCSAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqKQorCQkJCQkgJmJ1ZmYpOworCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVSUk9SIC0gQ291bGQgbm90IGdldCBUQ1BBIHRhYmxlXG4iLAorCQkgICAgICAgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoYnVmZi0+bG9nX21heF9sZW4gPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFUlJPUiAtIFRDUEEgbG9nIGFyZWEgZW1wdHlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogbWFsbG9jIEV2ZW50TG9nIHNwYWNlICovCisJbG9nLT5iaW9zX2V2ZW50X2xvZyA9IGttYWxsb2MoYnVmZi0+bG9nX21heF9sZW4sIEdGUF9LRVJORUwpOworCWlmICghbG9nLT5iaW9zX2V2ZW50X2xvZykgeworCQlwcmludGsKKwkJICAgICgiJXM6IEVSUk9SIC0gTm90IGVub3VnaCAgTWVtb3J5IGZvciBCSU9TIG1lYXN1cmVtZW50c1xuIiwKKwkJICAgICBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWxvZy0+Ymlvc19ldmVudF9sb2dfZW5kID0gbG9nLT5iaW9zX2V2ZW50X2xvZyArIGJ1ZmYtPmxvZ19tYXhfbGVuOworCisJYWNwaV9vc19tYXBfbWVtb3J5KGJ1ZmYtPmxvZ19zdGFydF9hZGRyLCBidWZmLT5sb2dfbWF4X2xlbiwgJnZpcnQpOworCisJbWVtY3B5KGxvZy0+Ymlvc19ldmVudF9sb2csIHZpcnQsIGJ1ZmYtPmxvZ19tYXhfbGVuKTsKKworCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHZpcnQsIGJ1ZmYtPmxvZ19tYXhfbGVuKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0cG1fYXNjaWlfYmlvc19tZWFzdXJlbWVudHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgdHBtX2Jpb3NfbG9nICpsb2c7CisJc3RydWN0IHNlcV9maWxlICpzZXE7CisKKwlsb2cgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHBtX2Jpb3NfbG9nKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsb2cpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKChlcnIgPSByZWFkX2xvZyhsb2cpKSkKKwkJcmV0dXJuIGVycjsKKworCS8qIG5vdyByZWdpc3RlciBzZXEgZmlsZSAqLworCWVyciA9IHNlcV9vcGVuKGZpbGUsICZ0cG1fYXNjaWlfYl9tZWFzdXJtZW50c19zZXFvcHMpOworCWlmICghZXJyKSB7CisJCXNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwkJc2VxLT5wcml2YXRlID0gbG9nOworCX0gZWxzZSB7CisJCWtmcmVlKGxvZy0+Ymlvc19ldmVudF9sb2cpOworCQlrZnJlZShsb2cpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRwbV9hc2NpaV9iaW9zX21lYXN1cmVtZW50c19vcHMgPSB7CisJLm9wZW4gPSB0cG1fYXNjaWlfYmlvc19tZWFzdXJlbWVudHNfb3BlbiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSB0cG1fYmlvc19tZWFzdXJlbWVudHNfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgdHBtX2JpbmFyeV9iaW9zX21lYXN1cmVtZW50c19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgdHBtX2Jpb3NfbG9nICpsb2c7CisJc3RydWN0IHNlcV9maWxlICpzZXE7CisKKwlsb2cgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHBtX2Jpb3NfbG9nKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsb2cpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKChlcnIgPSByZWFkX2xvZyhsb2cpKSkKKwkJcmV0dXJuIGVycjsKKworCS8qIG5vdyByZWdpc3RlciBzZXEgZmlsZSAqLworCWVyciA9IHNlcV9vcGVuKGZpbGUsICZ0cG1fYmluYXJ5X2JfbWVhc3VybWVudHNfc2Vxb3BzKTsKKwlpZiAoIWVycikgeworCQlzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCXNlcS0+cHJpdmF0ZSA9IGxvZzsKKwl9IGVsc2UgeworCQlrZnJlZShsb2ctPmJpb3NfZXZlbnRfbG9nKTsKKwkJa2ZyZWUobG9nKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0cG1fYmluYXJ5X2Jpb3NfbWVhc3VyZW1lbnRzX29wcyA9IHsKKwkub3BlbiA9IHRwbV9iaW5hcnlfYmlvc19tZWFzdXJlbWVudHNfb3BlbiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSB0cG1fYmlvc19tZWFzdXJlbWVudHNfcmVsZWFzZSwKK307CisKK3N0cnVjdCBkZW50cnkgKip0cG1fYmlvc19sb2dfc2V0dXAoY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICoqcmV0ID0gTlVMTCwgKnRwbV9kaXIsICpiaW5fZmlsZSwgKmFzY2lpX2ZpbGU7CisKKwl0cG1fZGlyID0gc2VjdXJpdHlmc19jcmVhdGVfZGlyKG5hbWUsIE5VTEwpOworCWlmICghdHBtX2RpcikKKwkJZ290byBvdXQ7CisKKwliaW5fZmlsZSA9CisJICAgIHNlY3VyaXR5ZnNfY3JlYXRlX2ZpbGUoImJpbmFyeV9iaW9zX21lYXN1cmVtZW50cyIsCisJCQkJICAgU19JUlVTUiB8IFNfSVJHUlAsIHRwbV9kaXIsIE5VTEwsCisJCQkJICAgJnRwbV9iaW5hcnlfYmlvc19tZWFzdXJlbWVudHNfb3BzKTsKKwlpZiAoIWJpbl9maWxlKQorCQlnb3RvIG91dF90cG07CisKKwlhc2NpaV9maWxlID0KKwkgICAgc2VjdXJpdHlmc19jcmVhdGVfZmlsZSgiYXNjaWlfYmlvc19tZWFzdXJlbWVudHMiLAorCQkJCSAgIFNfSVJVU1IgfCBTX0lSR1JQLCB0cG1fZGlyLCBOVUxMLAorCQkJCSAgICZ0cG1fYXNjaWlfYmlvc19tZWFzdXJlbWVudHNfb3BzKTsKKwlpZiAoIWFzY2lpX2ZpbGUpCisJCWdvdG8gb3V0X2JpbjsKKworCXJldCA9IGttYWxsb2MoMyAqIHNpemVvZihzdHJ1Y3QgZGVudHJ5ICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJldCkKKwkJZ290byBvdXRfYXNjaWk7CisKKwlyZXRbMF0gPSBhc2NpaV9maWxlOworCXJldFsxXSA9IGJpbl9maWxlOworCXJldFsyXSA9IHRwbV9kaXI7CisKKwlyZXR1cm4gcmV0OworCitvdXRfYXNjaWk6CisJc2VjdXJpdHlmc19yZW1vdmUoYXNjaWlfZmlsZSk7CitvdXRfYmluOgorCXNlY3VyaXR5ZnNfcmVtb3ZlKGJpbl9maWxlKTsKK291dF90cG06CisJc2VjdXJpdHlmc19yZW1vdmUodHBtX2Rpcik7CitvdXQ6CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0cG1fYmlvc19sb2dfc2V0dXApOworCit2b2lkIHRwbV9iaW9zX2xvZ190ZWFyZG93bihzdHJ1Y3QgZGVudHJ5ICoqbHN0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJc2VjdXJpdHlmc19yZW1vdmUobHN0W2ldKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRwbV9iaW9zX2xvZ190ZWFyZG93bik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHR5X2lvLmMgYi9kcml2ZXJzL2NoYXIvdHR5X2lvLmMKaW5kZXggNGIxZWVmNS4uZWI4YjViZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3R0eV9pby5jCisrKyBiL2RyaXZlcnMvY2hhci90dHlfaW8uYwpAQCAtMTY2LDkgKzE2NiwxMiBAQAogCXJldHVybiB0dHk7CiB9CiAKK3N0YXRpYyB2b2lkIHR0eV9idWZmZXJfZnJlZV9hbGwoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3R0eV9zdHJ1Y3Qoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAlrZnJlZSh0dHktPndyaXRlX2J1Zik7CisJdHR5X2J1ZmZlcl9mcmVlX2FsbCh0dHkpOwogCWtmcmVlKHR0eSk7CiB9CiAKQEAgLTIzMSw2ICsyMzQsMjAwIEBACiB9CiAKIC8qCisgKiBUdHkgYnVmZmVyIGFsbG9jYXRpb24gbWFuYWdlbWVudAorICovCisKK3N0YXRpYyB2b2lkIHR0eV9idWZmZXJfZnJlZV9hbGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgdHR5X2J1ZmZlciAqdGhlYWQ7CisJd2hpbGUoKHRoZWFkID0gdHR5LT5idWYuaGVhZCkgIT0gTlVMTCkgeworCQl0dHktPmJ1Zi5oZWFkID0gdGhlYWQtPm5leHQ7CisJCWtmcmVlKHRoZWFkKTsKKwl9CisJd2hpbGUoKHRoZWFkID0gdHR5LT5idWYuZnJlZSkgIT0gTlVMTCkgeworCQl0dHktPmJ1Zi5mcmVlID0gdGhlYWQtPm5leHQ7CisJCWtmcmVlKHRoZWFkKTsKKwl9CisJdHR5LT5idWYudGFpbCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHR0eV9idWZmZXJfaW5pdChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXR0eS0+YnVmLmhlYWQgPSBOVUxMOworCXR0eS0+YnVmLnRhaWwgPSBOVUxMOworCXR0eS0+YnVmLmZyZWUgPSBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHR0eV9idWZmZXIgKnR0eV9idWZmZXJfYWxsb2Moc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHR0eV9idWZmZXIgKnAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHR5X2J1ZmZlcikgKyAyICogc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYocCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlwLT51c2VkID0gMDsKKwlwLT5zaXplID0gc2l6ZTsKKwlwLT5uZXh0ID0gTlVMTDsKKwlwLT5jaGFyX2J1Zl9wdHIgPSAoY2hhciAqKShwLT5kYXRhKTsKKwlwLT5mbGFnX2J1Zl9wdHIgPSAodW5zaWduZWQgY2hhciAqKXAtPmNoYXJfYnVmX3B0ciArIHNpemU7CisvKiAJcHJpbnRrKCJGbGlwIGNyZWF0ZSAlcFxuIiwgcCk7ICovCisJcmV0dXJuIHA7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHR0eV9yZWFkIGxvY2sgaGVsZC4gVGhpcyBuZWVkcyB0byBhY3F1aXJlIHN0cmF0ZWd5CisgICBjb2RlIHRvIGRlY2lkZSBpZiB3ZSBzaG91bGQga2ZyZWUgb3IgcmVsaW5rIGEgZ2l2ZW4gZXhwaXJlZCBidWZmZXIgKi8KKworc3RhdGljIHZvaWQgdHR5X2J1ZmZlcl9mcmVlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0dHlfYnVmZmVyICpiKQoreworCS8qIER1bWIgc3RyYXRlZ3kgZm9yIG5vdyAtIHNob3VsZCBrZWVwIHNvbWUgc3RhdHMgKi8KKy8qIAlwcmludGsoIkZsaXAgZGlzcG9zZSAlcFxuIiwgYik7ICovCisJaWYoYi0+c2l6ZSA+PSA1MTIpCisJCWtmcmVlKGIpOworCWVsc2UgeworCQliLT5uZXh0ID0gdHR5LT5idWYuZnJlZTsKKwkJdHR5LT5idWYuZnJlZSA9IGI7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHR0eV9idWZmZXIgKnR0eV9idWZmZXJfZmluZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgdHR5X2J1ZmZlciAqKnRiaCA9ICZ0dHktPmJ1Zi5mcmVlOworCXdoaWxlKCgqdGJoKSAhPSBOVUxMKSB7CisJCXN0cnVjdCB0dHlfYnVmZmVyICp0ID0gKnRiaDsKKwkJaWYodC0+c2l6ZSA+PSBzaXplKSB7CisJCQkqdGJoID0gdC0+bmV4dDsKKwkJCXQtPm5leHQgPSBOVUxMOworCQkJdC0+dXNlZCA9IDA7CisJCQkvKiBERUJVRyBPTkxZICovCisJCQltZW1zZXQodC0+ZGF0YSwgJyonLCBzaXplKTsKKy8qIAkJCXByaW50aygiRmxpcCByZWN5Y2xlICVwXG4iLCB0KTsgKi8KKwkJCXJldHVybiB0OworCQl9CisJCXRiaCA9ICYoKCp0YmgpLT5uZXh0KTsKKwl9CisJLyogUm91bmQgdGhlIGJ1ZmZlciBzaXplIG91dCAqLworCXNpemUgPSAoc2l6ZSArIDB4RkYpICYgfiAweEZGOworCXJldHVybiB0dHlfYnVmZmVyX2FsbG9jKHNpemUpOworCS8qIFNob3VsZCBwb3NzaWJseSBjaGVjayBpZiB0aGlzIGZhaWxzIGZvciB0aGUgbGFyZ2VzdCBidWZmZXIgd2UKKwkgICBoYXZlIHF1ZXVlZCBhbmQgcmVjeWNsZSB0aGF0ID8gKi8KK30KKworaW50IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHNpemVfdCBzaXplKQoreworCXN0cnVjdCB0dHlfYnVmZmVyICpiID0gdHR5LT5idWYudGFpbCwgKm47CisJaW50IGxlZnQgPSAwOworCisJLyogT1BUSU1JU0FUSU9OOiBXZSBjb3VsZCBrZWVwIGEgcGVyIHR0eSAiemVybyIgc2l6ZWQgYnVmZmVyIHRvCisJICAgcmVtb3ZlIHRoaXMgY29uZGl0aW9uYWwgaWYgaXRzIHdvcnRoIGl0LiBUaGlzIHdvdWxkIGJlIGludmlzaWJsZQorCSAgIHRvIHRoZSBjYWxsZXJzICovCisJaWYoYiAhPSBOVUxMKQorCQlsZWZ0ID0gYi0+c2l6ZSAtIGItPnVzZWQ7CisJaWYobGVmdCA+PSBzaXplKQorCQlyZXR1cm4gc2l6ZTsKKwkvKiBUaGlzIGlzIHRoZSBzbG93IHBhdGggLSBsb29raW5nIGZvciBuZXcgYnVmZmVycyB0byB1c2UgKi8KKwluID0gdHR5X2J1ZmZlcl9maW5kKHR0eSwgc2l6ZSk7CisJaWYobiA9PSBOVUxMKQorCQlyZXR1cm4gbGVmdDsKKwlpZihiICE9IE5VTEwpCisJCWItPm5leHQgPSBuOworCWVsc2UKKwkJdHR5LT5idWYuaGVhZCA9IG47CisJdHR5LT5idWYudGFpbCA9IG47CisJcmV0dXJuIHNpemU7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKTsKKworaW50IHR0eV9pbnNlcnRfZmxpcF9zdHJpbmcoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciAqY2hhcnMsIHNpemVfdCBzaXplKQoreworCWludCBjb3BpZWQgPSAwOworCWRvIHsKKwkJaW50IHNwYWNlID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBzaXplIC0gY29waWVkKTsKKwkJc3RydWN0IHR0eV9idWZmZXIgKnRiID0gdHR5LT5idWYudGFpbDsKKwkJLyogSWYgdGhlcmUgaXMgbm8gc3BhY2UgdGhlbiB0YiBtYXkgYmUgTlVMTCAqLworCQlpZih1bmxpa2VseShzcGFjZSA9PSAwKSkKKwkJCWJyZWFrOworCQltZW1jcHkodGItPmNoYXJfYnVmX3B0ciArIHRiLT51c2VkLCBjaGFycywgc3BhY2UpOworCQltZW1zZXQodGItPmZsYWdfYnVmX3B0ciArIHRiLT51c2VkLCBUVFlfTk9STUFMLCBzcGFjZSk7CisJCXRiLT51c2VkICs9IHNwYWNlOworCQljb3BpZWQgKz0gc3BhY2U7CisJCWNoYXJzICs9IHNwYWNlOworLyogCQlwcmludGsoIkZsaXAgaW5zZXJ0ICVkLlxuIiwgc3BhY2UpOyAqLworCX0KKwkvKiBUaGVyZSBpcyBhIHNtYWxsIGNoYW5jZSB0aGF0IHdlIG5lZWQgdG8gc3BsaXQgdGhlIGRhdGEgb3ZlcgorCSAgIHNldmVyYWwgYnVmZmVycy4gSWYgdGhpcyBpcyB0aGUgY2FzZSB3ZSBtdXN0IGxvb3AgKi8KKwl3aGlsZSAodW5saWtlbHkoc2l6ZSA+IGNvcGllZCkpOworCXJldHVybiBjb3BpZWQ7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHR0eV9pbnNlcnRfZmxpcF9zdHJpbmcpOworCitpbnQgdHR5X2luc2VydF9mbGlwX3N0cmluZ19mbGFncyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyICpjaGFycywgY2hhciAqZmxhZ3MsIHNpemVfdCBzaXplKQoreworCWludCBjb3BpZWQgPSAwOworCWRvIHsKKwkJaW50IHNwYWNlID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBzaXplIC0gY29waWVkKTsKKwkJc3RydWN0IHR0eV9idWZmZXIgKnRiID0gdHR5LT5idWYudGFpbDsKKwkJLyogSWYgdGhlcmUgaXMgbm8gc3BhY2UgdGhlbiB0YiBtYXkgYmUgTlVMTCAqLworCQlpZih1bmxpa2VseShzcGFjZSA9PSAwKSkKKwkJCWJyZWFrOworCQltZW1jcHkodGItPmNoYXJfYnVmX3B0ciArIHRiLT51c2VkLCBjaGFycywgc3BhY2UpOworCQltZW1jcHkodGItPmZsYWdfYnVmX3B0ciArIHRiLT51c2VkLCBmbGFncywgc3BhY2UpOworCQl0Yi0+dXNlZCArPSBzcGFjZTsKKwkJY29waWVkICs9IHNwYWNlOworCQljaGFycyArPSBzcGFjZTsKKwkJZmxhZ3MgKz0gc3BhY2U7CisJfQorCS8qIFRoZXJlIGlzIGEgc21hbGwgY2hhbmNlIHRoYXQgd2UgbmVlZCB0byBzcGxpdCB0aGUgZGF0YSBvdmVyCisJICAgc2V2ZXJhbCBidWZmZXJzLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHdlIG11c3QgbG9vcCAqLworCXdoaWxlICh1bmxpa2VseShzaXplID4gY29waWVkKSk7CisJcmV0dXJuIGNvcGllZDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwodHR5X2luc2VydF9mbGlwX3N0cmluZ19mbGFncyk7CisKKworLyoKKyAqCVByZXBhcmUgYSBibG9jayBvZiBzcGFjZSBpbiB0aGUgYnVmZmVyIGZvciBkYXRhLiBSZXR1cm5zIHRoZSBsZW5ndGgKKyAqCWF2YWlsYWJsZSBhbmQgYnVmZmVyIHBvaW50ZXIgdG8gdGhlIHNwYWNlIHdoaWNoIGlzIG5vdyBhbGxvY2F0ZWQgYW5kCisgKglhY2NvdW50ZWQgZm9yIGFzIHJlYWR5IGZvciBub3JtYWwgY2hhcmFjdGVycy4gVGhpcyBpcyB1c2VkIGZvciBkcml2ZXJzCisgKgl0aGF0IG5lZWQgdGhlaXIgb3duIGJsb2NrIGNvcHkgcm91dGluZXMgaW50byB0aGUgYnVmZmVyLiBUaGVyZSBpcyBubworICoJZ3VhcmFudGVlIHRoZSBidWZmZXIgaXMgYSBETUEgdGFyZ2V0IQorICovCisKK2ludCB0dHlfcHJlcGFyZV9mbGlwX3N0cmluZyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyICoqY2hhcnMsIHNpemVfdCBzaXplKQoreworCWludCBzcGFjZSA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgc2l6ZSk7CisJc3RydWN0IHR0eV9idWZmZXIgKnRiID0gdHR5LT5idWYudGFpbDsKKwkqY2hhcnMgPSB0Yi0+Y2hhcl9idWZfcHRyICsgdGItPnVzZWQ7CisJbWVtc2V0KHRiLT5mbGFnX2J1Zl9wdHIgKyB0Yi0+dXNlZCwgVFRZX05PUk1BTCwgc3BhY2UpOworCXRiLT51c2VkICs9IHNwYWNlOworCXJldHVybiBzcGFjZTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwodHR5X3ByZXBhcmVfZmxpcF9zdHJpbmcpOworCisvKgorICoJUHJlcGFyZSBhIGJsb2NrIG9mIHNwYWNlIGluIHRoZSBidWZmZXIgZm9yIGRhdGEuIFJldHVybnMgdGhlIGxlbmd0aAorICoJYXZhaWxhYmxlIGFuZCBidWZmZXIgcG9pbnRlciB0byB0aGUgc3BhY2Ugd2hpY2ggaXMgbm93IGFsbG9jYXRlZCBhbmQKKyAqCWFjY291bnRlZCBmb3IgYXMgcmVhZHkgZm9yIGNoYXJhY3RlcnMuIFRoaXMgaXMgdXNlZCBmb3IgZHJpdmVycworICoJdGhhdCBuZWVkIHRoZWlyIG93biBibG9jayBjb3B5IHJvdXRpbmVzIGludG8gdGhlIGJ1ZmZlci4gVGhlcmUgaXMgbm8KKyAqCWd1YXJhbnRlZSB0aGUgYnVmZmVyIGlzIGEgRE1BIHRhcmdldCEKKyAqLworCitpbnQgdHR5X3ByZXBhcmVfZmxpcF9zdHJpbmdfZmxhZ3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciAqKmNoYXJzLCBjaGFyICoqZmxhZ3MsIHNpemVfdCBzaXplKQoreworCWludCBzcGFjZSA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgc2l6ZSk7CisJc3RydWN0IHR0eV9idWZmZXIgKnRiID0gdHR5LT5idWYudGFpbDsKKwkqY2hhcnMgPSB0Yi0+Y2hhcl9idWZfcHRyICsgdGItPnVzZWQ7CisJKmZsYWdzID0gdGItPmZsYWdfYnVmX3B0ciArIHRiLT51c2VkOworCXRiLT51c2VkICs9IHNwYWNlOworCXJldHVybiBzcGFjZTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwodHR5X3ByZXBhcmVfZmxpcF9zdHJpbmdfZmxhZ3MpOworCisKKworLyoKICAqCVRoaXMgaXMgcHJvYmFibHkgb3ZlcmtpbGwgZm9yIHJlYWwgd29ybGQgcHJvY2Vzc29ycyBidXQKICAqCXRoZXkgYXJlIG5vdCBvbiBob3QgcGF0aHMgc28gYSBsaXR0bGUgZGlzY2lwbGluZSB3b24ndCBkbyAKICAqCWFueSBoYXJtLgpAQCAtNDkyLDYgKzY4OSwxNyBAQAogCWlmIChsZCA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCS8qCisJICoJTm8gbW9yZSBpbnB1dCBwbGVhc2UsIHdlIGFyZSBzd2l0Y2hpbmcuIFRoZSBuZXcgbGRpc2MKKwkgKgl3aWxsIHVwZGF0ZSB0aGlzIHZhbHVlIGluIHRoZSBsZGlzYyBvcGVuIGZ1bmN0aW9uCisJICovCisKKwl0dHktPnJlY2VpdmVfcm9vbSA9IDA7CisKKwkvKgorCSAqCVByb2JsZW06IFdoYXQgZG8gd2UgZG8gaWYgdGhpcyBibG9ja3MgPworCSAqLworCiAJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOwogCiAJaWYgKHR0eS0+bGRpc2MubnVtID09IGxkaXNjKSB7CkBAIC01NjAsOSArNzY4LDkgQEAKIAkgKgl3ZSBzYXkgc28gbGF0ZXIgb24uCiAJICovCiAKLQl3b3JrID0gY2FuY2VsX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmspOworCXdvcmsgPSBjYW5jZWxfZGVsYXllZF93b3JrKCZ0dHktPmJ1Zi53b3JrKTsKIAkvKgotCSAqIFdhaXQgZm9yIC0+aGFuZ3VwX3dvcmsgYW5kIC0+ZmxpcC53b3JrIGhhbmRsZXJzIHRvIHRlcm1pbmF0ZQorCSAqIFdhaXQgZm9yIC0+aGFuZ3VwX3dvcmsgYW5kIC0+YnVmLndvcmsgaGFuZGxlcnMgdG8gdGVybWluYXRlCiAJICovCiAJIAogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CkBAIC02MTYsNyArODI0LDcgQEAKIAkvKiBSZXN0YXJ0IGl0IGluIGNhc2Ugbm8gY2hhcmFjdGVycyBraWNrIGl0IG9mZi4gU2FmZSBpZgogCSAgIGFscmVhZHkgcnVubmluZyAqLwogCWlmICh3b3JrKQotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+ZmxpcC53b3JrLCAxKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmJ1Zi53b3JrLCAxKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0xNzIxLDEwICsxOTI5LDEwIEBACiAJICovCiAJY2xlYXJfYml0KFRUWV9MRElTQywgJnR0eS0+ZmxhZ3MpOwogCWNsZWFyX2JpdChUVFlfRE9OVF9GTElQLCAmdHR5LT5mbGFncyk7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnR0eS0+YnVmLndvcmspOwogCiAJLyoKLQkgKiBXYWl0IGZvciAtPmhhbmd1cF93b3JrIGFuZCAtPmZsaXAud29yayBoYW5kbGVycyB0byB0ZXJtaW5hdGUKKwkgKiBXYWl0IGZvciAtPmhhbmd1cF93b3JrIGFuZCAtPmJ1Zi53b3JrIGhhbmRsZXJzIHRvIHRlcm1pbmF0ZQogCSAqLwogCSAKIAlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwpAQCAtMjUxOCwxNyArMjcyNiwxNSBAQAogCiAvKgogICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBvdXQgb2YgdGhlIHNvZnR3YXJlIGludGVycnVwdCB0byBmbHVzaCBkYXRhCi0gKiBmcm9tIHRoZSBmbGlwIGJ1ZmZlciB0byB0aGUgbGluZSBkaXNjaXBsaW5lLiAKKyAqIGZyb20gdGhlIGJ1ZmZlciBjaGFpbiB0byB0aGUgbGluZSBkaXNjaXBsaW5lLgogICovCiAgCiBzdGF0aWMgdm9pZCBmbHVzaF90b19sZGlzYyh2b2lkICpwcml2YXRlXykKIHsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gKHN0cnVjdCB0dHlfc3RydWN0ICopIHByaXZhdGVfOwotCXVuc2lnbmVkIGNoYXIJKmNwOwotCWNoYXIJCSpmcDsKLQlpbnQJCWNvdW50OwogCXVuc2lnbmVkIGxvbmcgCWZsYWdzOwogCXN0cnVjdCB0dHlfbGRpc2MgKmRpc2M7CisJc3RydWN0IHR0eV9idWZmZXIgKnRidWY7CiAKIAlkaXNjID0gdHR5X2xkaXNjX3JlZih0dHkpOwogCWlmIChkaXNjID09IE5VTEwpCS8qICAhVFRZX0xESVNDICovCkBAIC0yNTM4LDI4ICsyNzQ0LDIzIEBACiAJCS8qCiAJCSAqIERvIGl0IGFmdGVyIHRoZSBuZXh0IHRpbWVyIHRpY2s6CiAJCSAqLwotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+ZmxpcC53b3JrLCAxKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmJ1Zi53b3JrLCAxKTsKIAkJZ290byBvdXQ7CiAJfQogCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOwotCWlmICh0dHktPmZsaXAuYnVmX251bSkgewotCQljcCA9IHR0eS0+ZmxpcC5jaGFyX2J1ZiArIFRUWV9GTElQQlVGX1NJWkU7Ci0JCWZwID0gdHR5LT5mbGlwLmZsYWdfYnVmICsgVFRZX0ZMSVBCVUZfU0laRTsKLQkJdHR5LT5mbGlwLmJ1Zl9udW0gPSAwOwotCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyID0gdHR5LT5mbGlwLmNoYXJfYnVmOwotCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gdHR5LT5mbGlwLmZsYWdfYnVmOwotCX0gZWxzZSB7Ci0JCWNwID0gdHR5LT5mbGlwLmNoYXJfYnVmOwotCQlmcCA9IHR0eS0+ZmxpcC5mbGFnX2J1ZjsKLQkJdHR5LT5mbGlwLmJ1Zl9udW0gPSAxOwotCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyID0gdHR5LT5mbGlwLmNoYXJfYnVmICsgVFRZX0ZMSVBCVUZfU0laRTsKLQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IHR0eS0+ZmxpcC5mbGFnX2J1ZiArIFRUWV9GTElQQlVGX1NJWkU7CisJd2hpbGUoKHRidWYgPSB0dHktPmJ1Zi5oZWFkKSAhPSBOVUxMKSB7CisJCXR0eS0+YnVmLmhlYWQgPSB0YnVmLT5uZXh0OworCQlpZiAodHR5LT5idWYuaGVhZCA9PSBOVUxMKQorCQkJdHR5LT5idWYudGFpbCA9IE5VTEw7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CisJCS8qIHByaW50aygiUHJvY2VzcyBidWZmZXIgJXAgZm9yICVkXG4iLCB0YnVmLCB0YnVmLT51c2VkKTsgKi8KKwkJZGlzYy0+cmVjZWl2ZV9idWYodHR5LCB0YnVmLT5jaGFyX2J1Zl9wdHIsCisJCQkJICAgICAgIHRidWYtPmZsYWdfYnVmX3B0ciwKKwkJCQkgICAgICAgdGJ1Zi0+dXNlZCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOworCQl0dHlfYnVmZmVyX2ZyZWUodHR5LCB0YnVmKTsKIAl9Ci0JY291bnQgPSB0dHktPmZsaXAuY291bnQ7Ci0JdHR5LT5mbGlwLmNvdW50ID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOwotCi0JZGlzYy0+cmVjZWl2ZV9idWYodHR5LCBjcCwgZnAsIGNvdW50KTsKIG91dDoKIAl0dHlfbGRpc2NfZGVyZWYoZGlzYyk7CiB9CkBAIC0yNjU0LDExICsyODU1LDEyIEBACiAJaWYgKHR0eS0+bG93X2xhdGVuY3kpCiAJCWZsdXNoX3RvX2xkaXNjKCh2b2lkICopIHR0eSk7CiAJZWxzZQotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+ZmxpcC53b3JrLCAxKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmJ1Zi53b3JrLCAxKTsKIH0KIAogRVhQT1JUX1NZTUJPTCh0dHlfZmxpcF9idWZmZXJfcHVzaCk7CiAKKwogLyoKICAqIFRoaXMgc3Vicm91dGluZSBpbml0aWFsaXplcyBhIHR0eSBzdHJ1Y3R1cmUuCiAgKi8KQEAgLTI2NjksMTAgKzI4NzEsMTAgQEAKIAl0dHlfbGRpc2NfYXNzaWduKHR0eSwgdHR5X2xkaXNjX2dldChOX1RUWSkpOwogCXR0eS0+cGdycCA9IC0xOwogCXR0eS0+b3ZlcnJ1bl90aW1lID0gamlmZmllczsKLQl0dHktPmZsaXAuY2hhcl9idWZfcHRyID0gdHR5LT5mbGlwLmNoYXJfYnVmOwotCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSB0dHktPmZsaXAuZmxhZ19idWY7Ci0JSU5JVF9XT1JLKCZ0dHktPmZsaXAud29yaywgZmx1c2hfdG9fbGRpc2MsIHR0eSk7Ci0JaW5pdF9NVVRFWCgmdHR5LT5mbGlwLnB0eV9zZW0pOworCXR0eS0+YnVmLmhlYWQgPSB0dHktPmJ1Zi50YWlsID0gTlVMTDsKKwl0dHlfYnVmZmVyX2luaXQodHR5KTsKKwlJTklUX1dPUksoJnR0eS0+YnVmLndvcmssIGZsdXNoX3RvX2xkaXNjLCB0dHkpOworCWluaXRfTVVURVgoJnR0eS0+YnVmLnB0eV9zZW0pOwogCWluaXRfTVVURVgoJnR0eS0+dGVybWlvc19zZW0pOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnR0eS0+d3JpdGVfd2FpdCk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmdHR5LT5yZWFkX3dhaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Zpb2NvbnMuYyBiL2RyaXZlcnMvY2hhci92aW9jb25zLmMKaW5kZXggNGQ3NWMyNi4uNGU1MzYwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Zpb2NvbnMuYworKysgYi9kcml2ZXJzL2NoYXIvdmlvY29ucy5jCkBAIC0xMzEsNyArMTMxLDcgQEAKIAogc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICp2aW90dHlfZHJpdmVyOwogCi12b2lkIGh2bG9nKGNoYXIgKmZtdCwgLi4uKQorc3RhdGljIHZvaWQgaHZsb2coY2hhciAqZm10LCAuLi4pCiB7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE0Nyw3ICsxNDcsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnNvbGVsb2dsb2NrLCBmbGFncyk7CiB9CiAKLXZvaWQgaHZsb2dPdXRwdXQoY29uc3QgY2hhciAqYnVmLCBpbnQgY291bnQpCitzdGF0aWMgdm9pZCBodmxvZ091dHB1dChjb25zdCBjaGFyICpidWYsIGludCBjb3VudCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBiZWdpbjsKQEAgLTQ3NiwxOSArNDc2LDE5IEBACiAgKi8KIHN0YXRpYyB2b2lkIGluaXREYXRhRXZlbnQoc3RydWN0IHZpb2NoYXJscGV2ZW50ICp2aW9jaGFyLCBIdkxwSW5kZXggbHApCiB7CisJc3RydWN0IEh2THBFdmVudCAqaGV2ID0gJnZpb2NoYXItPmV2ZW50OworCiAJbWVtc2V0KHZpb2NoYXIsIDAsIHNpemVvZihzdHJ1Y3QgdmlvY2hhcmxwZXZlbnQpKTsKIAotCXZpb2NoYXItPmV2ZW50LnhGbGFncy54VmFsaWQgPSAxOwotCXZpb2NoYXItPmV2ZW50LnhGbGFncy54RnVuY3Rpb24gPSBIdkxwRXZlbnRfRnVuY3Rpb25fSW50OwotCXZpb2NoYXItPmV2ZW50LnhGbGFncy54QWNrSW5kID0gSHZMcEV2ZW50X0Fja0luZF9Ob0FjazsKLQl2aW9jaGFyLT5ldmVudC54RmxhZ3MueEFja1R5cGUgPSBIdkxwRXZlbnRfQWNrVHlwZV9EZWZlcnJlZEFjazsKLQl2aW9jaGFyLT5ldmVudC54VHlwZSA9IEh2THBFdmVudF9UeXBlX1ZpcnR1YWxJbzsKLQl2aW9jaGFyLT5ldmVudC54U3VidHlwZSA9IHZpb21ham9yc3VidHlwZV9jaGFyaW8gfCB2aW9jaGFyZGF0YTsKLQl2aW9jaGFyLT5ldmVudC54U291cmNlTHAgPSBIdkxwQ29uZmlnX2dldExwSW5kZXgoKTsKLQl2aW9jaGFyLT5ldmVudC54VGFyZ2V0THAgPSBscDsKLQl2aW9jaGFyLT5ldmVudC54U2l6ZU1pbnVzMSA9IHNpemVvZihzdHJ1Y3QgdmlvY2hhcmxwZXZlbnQpOwotCXZpb2NoYXItPmV2ZW50LnhTb3VyY2VJbnN0YW5jZUlkID0gdmlvcGF0aF9zb3VyY2VpbnN0KGxwKTsKLQl2aW9jaGFyLT5ldmVudC54VGFyZ2V0SW5zdGFuY2VJZCA9IHZpb3BhdGhfdGFyZ2V0aW5zdChscCk7CisJaGV2LT5mbGFncyA9IEhWX0xQX0VWRU5UX1ZBTElEIHwgSFZfTFBfRVZFTlRfREVGRVJSRURfQUNLIHwKKwkJSFZfTFBfRVZFTlRfSU5UOworCWhldi0+eFR5cGUgPSBIdkxwRXZlbnRfVHlwZV9WaXJ0dWFsSW87CisJaGV2LT54U3VidHlwZSA9IHZpb21ham9yc3VidHlwZV9jaGFyaW8gfCB2aW9jaGFyZGF0YTsKKwloZXYtPnhTb3VyY2VMcCA9IEh2THBDb25maWdfZ2V0THBJbmRleCgpOworCWhldi0+eFRhcmdldExwID0gbHA7CisJaGV2LT54U2l6ZU1pbnVzMSA9IHNpemVvZihzdHJ1Y3QgdmlvY2hhcmxwZXZlbnQpOworCWhldi0+eFNvdXJjZUluc3RhbmNlSWQgPSB2aW9wYXRoX3NvdXJjZWluc3QobHApOworCWhldi0+eFRhcmdldEluc3RhbmNlSWQgPSB2aW9wYXRoX3RhcmdldGluc3QobHApOwogfQogCiAvKgpAQCAtNzUyLDcgKzc1Miw3IEBACiAJc3RydWN0IHBvcnRfaW5mbyAqcGk7CiAJaW50IHJlamVjdCA9IDA7CiAKLQlpZiAoZXZlbnQtPnhGbGFncy54RnVuY3Rpb24gPT0gSHZMcEV2ZW50X0Z1bmN0aW9uX0FjaykgeworCWlmIChodmxwZXZlbnRfaXNfYWNrKGV2ZW50KSkgewogCQlpZiAocG9ydCA+PSBWVFRZX1BPUlRTKQogCQkJcmV0dXJuOwogCkBAIC03ODgsNyArNzg4LDcgQEAKIAl9CiAKIAkvKiBUaGlzIGhhZCBiZXR0ZXIgcmVxdWlyZSBhbiBhY2ssIG90aGVyd2lzZSBjb21wbGFpbiAqLwotCWlmIChldmVudC0+eEZsYWdzLnhBY2tJbmQgIT0gSHZMcEV2ZW50X0Fja0luZF9Eb0FjaykgeworCWlmICghaHZscGV2ZW50X25lZWRfYWNrKGV2ZW50KSkgewogCQlwcmludGsoVklPQ09OU19LRVJOX1dBUk4gInZpb2NoYXJvcGVuIHdpdGhvdXQgYWNrIGJpdCFcbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtODU2LDcgKzg1Niw3IEBACiAJc3RydWN0IHZpb2NoYXJscGV2ZW50ICpjZXZlbnQgPSAoc3RydWN0IHZpb2NoYXJscGV2ZW50ICopZXZlbnQ7CiAJdTggcG9ydCA9IGNldmVudC0+dmlydHVhbF9kZXZpY2U7CiAKLQlpZiAoZXZlbnQtPnhGbGFncy54RnVuY3Rpb24gPT0gSHZMcEV2ZW50X0Z1bmN0aW9uX0ludCkgeworCWlmIChodmxwZXZlbnRfaXNfaW50KGV2ZW50KSkgewogCQlpZiAocG9ydCA+PSBWVFRZX1BPUlRTKSB7CiAJCQlwcmludGsoVklPQ09OU19LRVJOX1dBUk4KIAkJCQkJImNsb3NlIG1lc3NhZ2UgZnJvbSBpbnZhbGlkIHZpcnR1YWwgZGV2aWNlLlxuIik7CkBAIC05MDQsNiArOTA0LDcgQEAKIAlzdHJ1Y3QgdmlvY2hhcmxwZXZlbnQgKmNldmVudCA9IChzdHJ1Y3QgdmlvY2hhcmxwZXZlbnQgKilldmVudDsKIAlzdHJ1Y3QgcG9ydF9pbmZvICpwaTsKIAlpbnQgaW5kZXg7CisJaW50IG51bV9wdXNoZWQ7CiAJdTggcG9ydCA9IGNldmVudC0+dmlydHVhbF9kZXZpY2U7CiAKIAlpZiAocG9ydCA+PSBWVFRZX1BPUlRTKSB7CkBAIC05NjQsNiArOTY1LDcgQEAKIAkgKiBmdW5jdGlvbmFsaXR5IHdpbGwgb25seSB3b3JrIGlmIGJ1aWx0IGludG8gdGhlIGtlcm5lbCBhbmQKIAkgKiB0aGVuIG9ubHkgaWYgc3lzcnEgaXMgZW5hYmxlZCB0aHJvdWdoIHRoZSBwcm9jIGZpbGVzeXN0ZW0uCiAJICovCisJbnVtX3B1c2hlZCA9IDA7CiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY2V2ZW50LT5sZW47IGluZGV4KyspIHsKICNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKIAkJaWYgKHN5c3JxX2VuYWJsZWQpIHsKQEAgLTk5MywxNiArOTk1LDE0IEBACiAJCSAqIERvbid0IGF0dGVtcHQgdG8gY29weSBtb3JlIGRhdGEgaW50byB0aGUgYnVmZmVyIHRoYW4gd2UKIAkJICogaGF2ZSByb29tIGZvciBiZWNhdXNlIGl0IHdvdWxkIGZhaWwgd2l0aG91dCBpbmRpY2F0aW9uLgogCQkgKi8KLQkJaWYgKCh0dHktPmZsaXAuY291bnQgKyAxKSA+IFRUWV9GTElQQlVGX1NJWkUpIHsKKwkJaWYodHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjZXZlbnQtPmRhdGFbaW5kZXhdLCBUVFlfTk9STUFMKSA9PSAwKSB7CiAJCQlwcmludGsoVklPQ09OU19LRVJOX1dBUk4gImlucHV0IGJ1ZmZlciBvdmVyZmxvdyFcbiIpOwogCQkJYnJlYWs7CiAJCX0KLQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjZXZlbnQtPmRhdGFbaW5kZXhdLCBUVFlfTk9STUFMKTsKKwkJbnVtX3B1c2hlZCsrOwogCX0KIAotCS8qIGlmIGNldmVudC0+bGVuID09IDAgdGhlbiBubyBkYXRhIHdhcyBhZGRlZCB0byB0aGUgYnVmZmVyIGFuZCBmbGlwLmNvdW50ID09IDAgKi8KLQlpZiAodHR5LT5mbGlwLmNvdW50KQotCQkvKiBUaGUgbmV4dCBjYWxsIHJlc2V0cyBmbGlwLmNvdW50IHdoZW4gdGhlIGRhdGEgaXMgZmx1c2hlZC4gKi8KKwlpZiAobnVtX3B1c2hlZCkKIAkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKIH0KIApAQCAtMTA1Niw4ICsxMDU2LDcgQEAKIAkJdmlvSGFuZGxlQ29uZmlnKGV2ZW50KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJaWYgKChldmVudC0+eEZsYWdzLnhGdW5jdGlvbiA9PSBIdkxwRXZlbnRfRnVuY3Rpb25fSW50KSAmJgotCQkgICAgKGV2ZW50LT54RmxhZ3MueEFja0luZCA9PSBIdkxwRXZlbnRfQWNrSW5kX0RvQWNrKSkgeworCQlpZiAoaHZscGV2ZW50X2lzX2ludChldmVudCkgJiYgaHZscGV2ZW50X25lZWRfYWNrKGV2ZW50KSkgewogCQkJZXZlbnQtPnhSYyA9IEh2THBFdmVudF9SY19JbnZhbGlkU3VidHlwZTsKIAkJCUh2Q2FsbEV2ZW50X2Fja0xwRXZlbnQoZXZlbnQpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdm1lX3NjYy5jIGIvZHJpdmVycy9jaGFyL3ZtZV9zY2MuYwppbmRleCAxOWJhODM2Li5kOTMyNTI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdm1lX3NjYy5jCisrKyBiL2RyaXZlcnMvY2hhci92bWVfc2NjLmMKQEAgLTQzNCwxMyArNDM0LDcgQEAKIAkJU0NDd3JpdGVfTkIoQ09NTUFORF9SRUcsIENSX0hJR0hFU1RfSVVTX1JFU0VUKTsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KLQlpZiAodHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSkgewotCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciA9IGNoOwotCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IDA7Ci0JCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKzsKLQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOwotCQl0dHktPmZsaXAuY291bnQrKzsKLQl9CisJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgMCk7CiAKIAkvKiBDaGVjayBpZiBhbm90aGVyIGNoYXJhY3RlciBpcyBhbHJlYWR5IHJlYWR5OyBpbiB0aGF0IGNhc2UsIHRoZQogCSAqIHNwY29uZF9pbnQoKSBmdW5jdGlvbiBtdXN0IGJlIHVzZWQsIGJlY2F1c2UgdGhpcyBjaGFyYWN0ZXIgbWF5IGhhdmUgYW4KQEAgLTQ4NywxMyArNDgxLDcgQEAKIAkJZWxzZQogCQkJZXJyID0gMDsKIAotCQlpZiAodHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSkgewotCQkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgPSBjaDsKLQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gZXJyOwotCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOwotCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOwotCQkJdHR5LT5mbGlwLmNvdW50Kys7Ci0JCX0KKwkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgZXJyKTsKIAogCQkvKiArK1RlU2NoZTogKkFsbCogZXJyb3JzIGhhdmUgdG8gYmUgY2xlYXJlZCBtYW51YWxseSwKIAkJICogZWxzZSB0aGUgY29uZGl0aW9uIHBlcnNpc3RzIGZvciB0aGUgbmV4dCBjaGFycwpAQCAtODc1LDEzICs4NjMsMTMgQEAKIAkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogI2lmIGRlZmluZWQoQ09ORklHX01WTUUxNDdfU0NDKSB8fCBkZWZpbmVkKENPTkZJR19NVk1FMTYyX1NDQykKIAkJaWYgKE1BQ0hfSVNfTVZNRTE0NyB8fCBNQUNIX0lTX01WTUUxNngpIHsKLQkJCWZvciAoaT0wOyBpPHNpemVvZihtdm1lX2luaXRfdGFiKS9zaXplb2YoKm12bWVfaW5pdF90YWIpOyArK2kpCisJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtdm1lX2luaXRfdGFiKTsgKytpKQogCQkJCVNDQ3dyaXRlKG12bWVfaW5pdF90YWJbaV0ucmVnLCBtdm1lX2luaXRfdGFiW2ldLnZhbCk7CiAJCX0KICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0JWTUU2MDAwX1NDQykKIAkJaWYgKE1BQ0hfSVNfQlZNRTYwMDApIHsKLQkJCWZvciAoaT0wOyBpPHNpemVvZihidm1lX2luaXRfdGFiKS9zaXplb2YoKmJ2bWVfaW5pdF90YWIpOyArK2kpCisJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidm1lX2luaXRfdGFiKTsgKytpKQogCQkJCVNDQ3dyaXRlKGJ2bWVfaW5pdF90YWJbaV0ucmVnLCBidm1lX2luaXRfdGFiW2ldLnZhbCk7CiAJCX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3ZyNDF4eF9naXUuYyBiL2RyaXZlcnMvY2hhci92cjQxeHhfZ2l1LmMKaW5kZXggOWFjNmQ0My4uMjI2N2M3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3ZyNDF4eF9naXUuYworKysgYi9kcml2ZXJzL2NoYXIvdnI0MXh4X2dpdS5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCiAgKglBdXRob3I6IFlvaWNoaSBZdWFzYSA8eXl1YXNhQG12aXN0YS5jb20gb3Igc291cmNlQG12aXN0YS5jb20+Ci0gKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgIFlvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgIFlvaWNoaSBZdWFzYSA8eW9pY2hpX3l1YXNhQHRyaXBlYWtzLmNvLmpwPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0zNSw3ICszNSw3IEBACiAjaW5jbHVkZSA8YXNtL3ZyNDF4eC9naXUuaD4KICNpbmNsdWRlIDxhc20vdnI0MXh4L3ZyNDF4eC5oPgogCi1NT0RVTEVfQVVUSE9SKCJZb2ljaGkgWXVhc2EgPHl1YXNhQGhoLmlpajR1Lm9yLmpwPiIpOworTU9EVUxFX0FVVEhPUigiWW9pY2hpIFl1YXNhIDx5b2ljaGlfeXVhc2FAdHJpcGVha3MuY28uanA+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIk5FQyBWUjQxMDAgc2VyaWVzIEdlbmVyYWwtcHVycG9zZSBJL08gVW5pdCBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIApAQCAtNzE4LDcgKzcxOCw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHZyNDF4eF9naXVfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgdnI0MXh4X2dpdV9pbml0KHZvaWQpCiB7CiAJaW50IHJldHZhbDsKIApAQCAtNzMzLDcgKzczMyw3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHZvaWQgX19kZXZleGl0IHZyNDF4eF9naXVfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHZyNDF4eF9naXVfZXhpdCh2b2lkKQogewogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZnaXVfZGV2aWNlX2RyaXZlcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci92cjQxeHhfcnRjLmMgYi9kcml2ZXJzL2NoYXIvdnI0MXh4X3J0Yy5jCmluZGV4IDQzNWIzMDcuLmJjMWI0YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci92cjQxeHhfcnRjLmMKKysrIGIvZHJpdmVycy9jaGFyL3ZyNDF4eF9ydGMuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgRHJpdmVyIGZvciBORUMgVlI0MTAwIHNlcmllcyAgUmVhbCBUaW1lIENsb2NrIHVuaXQuCiAgKgotICogIENvcHlyaWdodCAoQykgMjAwMy0yMDA1ICBZb2ljaGkgWXVhc2EgPHl1YXNhQGhoLmlpajR1Lm9yLmpwPgorICogIENvcHlyaWdodCAoQykgMjAwMy0yMDA1ICBZb2ljaGkgWXVhc2EgPHlvaWNoaV95dWFzYUB0cmlwZWFrcy5jby5qcD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMzcsNyArMzcsNyBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3ZyNDF4eC92cjQxeHguaD4KIAotTU9EVUxFX0FVVEhPUigiWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4iKTsKK01PRFVMRV9BVVRIT1IoIllvaWNoaSBZdWFzYSA8eW9pY2hpX3l1YXNhQHRyaXBlYWtzLmNvLmpwPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJORUMgVlI0MTAwIHNlcmllcyBSVEMgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKQEAgLTEyNyw4ICsxMjcsNiBAQAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwJfSwKIH07CiAKLSNkZWZpbmUgUlRDX05VTV9SRVNPVVJDRVMJc2l6ZW9mKHJ0Y19yZXNvdXJjZSkgLyBzaXplb2Yoc3RydWN0IHJlc291cmNlKQotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVhZF9lbGFwc2VkX3NlY29uZCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmlyc3RfbG93LCBmaXJzdF9taWQsIGZpcnN0X2hpZ2g7CkBAIC02ODYsNyArNjg0LDggQEAKIAkJYnJlYWs7CiAJfQogCi0JcnRjX3BsYXRmb3JtX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoIlJUQyIsIC0xLCBydGNfcmVzb3VyY2UsIFJUQ19OVU1fUkVTT1VSQ0VTKTsKKwlydGNfcGxhdGZvcm1fZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiUlRDIiwgLTEsCisJCQkgICAgICBydGNfcmVzb3VyY2UsIEFSUkFZX1NJWkUocnRjX3Jlc291cmNlKSk7CiAJaWYgKElTX0VSUihydGNfcGxhdGZvcm1fZGV2aWNlKSkKIAkJcmV0dXJuIFBUUl9FUlIocnRjX3BsYXRmb3JtX2RldmljZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci92dC5jIGIvZHJpdmVycy9jaGFyL3Z0LmMKaW5kZXggZTkxMjY4ZS4uZjFkOWNiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Z0LmMKKysrIGIvZHJpdmVycy9jaGFyL3Z0LmMKQEAgLTI3NTgsMjkgKzI3NTgsNiBAQAogICAgIHZlc2FfYmxhbmtfbW9kZSA9IChtb2RlIDwgNCkgPyBtb2RlIDogMDsKIH0KIAotLyoKLSAqIFRoaXMgaXMgY2FsbGVkIGJ5IGEgdGltZXIgaGFuZGxlcgotICovCi1zdGF0aWMgdm9pZCB2ZXNhX3Bvd2VyZG93bih2b2lkKQotewotICAgIHN0cnVjdCB2Y19kYXRhICpjID0gdmNfY29uc1tmZ19jb25zb2xlXS5kOwotICAgIC8qCi0gICAgICogIFBvd2VyIGRvd24gaWYgY3VycmVudGx5IHN1c3BlbmRlZCAoMSBvciAyKSwKLSAgICAgKiAgc3VzcGVuZCBpZiBjdXJyZW50bHkgYmxhbmtlZCAoMCksCi0gICAgICogIGVsc2UgZG8gbm90aGluZyAoaS5lLiBhbHJlYWR5IHBvd2VyZWQgZG93biAoMykpLgotICAgICAqICBDYWxsZWQgb25seSBpZiBwb3dlcmRvd24gZmVhdHVyZXMgYXJlIGFsbG93ZWQuCi0gICAgICovCi0gICAgc3dpdGNoICh2ZXNhX2JsYW5rX21vZGUpIHsKLSAgICBjYXNlIFZFU0FfTk9fQkxBTktJTkc6Ci0JICAgIGMtPnZjX3N3LT5jb25fYmxhbmsoYywgVkVTQV9WU1lOQ19TVVNQRU5EKzEsIDApOwotCSAgICBicmVhazsKLSAgICBjYXNlIFZFU0FfVlNZTkNfU1VTUEVORDoKLSAgICBjYXNlIFZFU0FfSFNZTkNfU1VTUEVORDoKLQkgICAgYy0+dmNfc3ctPmNvbl9ibGFuayhjLCBWRVNBX1BPV0VSRE9XTisxLCAwKTsKLQkgICAgYnJlYWs7Ci0gICAgfQotfQotCiB2b2lkIGRvX2JsYW5rX3NjcmVlbihpbnQgZW50ZXJpbmdfZ2Z4KQogewogCXN0cnVjdCB2Y19kYXRhICp2YyA9IHZjX2NvbnNbZmdfY29uc29sZV0uZDsKQEAgLTI3OTEsOCArMjc2OCw3IEBACiAJaWYgKGNvbnNvbGVfYmxhbmtlZCkgewogCQlpZiAoYmxhbmtfc3RhdGUgPT0gYmxhbmtfdmVzYV93YWl0KSB7CiAJCQlibGFua19zdGF0ZSA9IGJsYW5rX29mZjsKLQkJCXZlc2FfcG93ZXJkb3duKCk7Ci0KKwkJCXZjLT52Y19zdy0+Y29uX2JsYW5rKHZjLCB2ZXNhX2JsYW5rX21vZGUgKyAxLCAwKTsKIAkJfQogCQlyZXR1cm47CiAJfQpAQCAtMjgyMiw3ICsyNzk4LDcgQEAKIAogCXNhdmVfc2NyZWVuKHZjKTsKIAkvKiBJbiBjYXNlIHdlIG5lZWQgdG8gcmVzZXQgb3JpZ2luLCBibGFua2luZyBob29rIHJldHVybnMgMSAqLwotCWkgPSB2Yy0+dmNfc3ctPmNvbl9ibGFuayh2YywgMSwgMCk7CisJaSA9IHZjLT52Y19zdy0+Y29uX2JsYW5rKHZjLCB2ZXNhX29mZl9pbnRlcnZhbCA/IDEgOiAodmVzYV9ibGFua19tb2RlICsgMSksIDApOwogCWNvbnNvbGVfYmxhbmtlZCA9IGZnX2NvbnNvbGUgKyAxOwogCWlmIChpKQogCQlzZXRfb3JpZ2luKHZjKTsKQEAgLTI4MzAsMTMgKzI4MDYsMTAgQEAKIAlpZiAoY29uc29sZV9ibGFua19ob29rICYmIGNvbnNvbGVfYmxhbmtfaG9vaygxKSkKIAkJcmV0dXJuOwogCi0JaWYgKHZlc2Ffb2ZmX2ludGVydmFsKSB7CisJaWYgKHZlc2Ffb2ZmX2ludGVydmFsICYmIHZlc2FfYmxhbmtfbW9kZSkgewogCQlibGFua19zdGF0ZSA9IGJsYW5rX3Zlc2Ffd2FpdDsKIAkJbW9kX3RpbWVyKCZjb25zb2xlX3RpbWVyLCBqaWZmaWVzICsgdmVzYV9vZmZfaW50ZXJ2YWwpOwogCX0KLQotICAgIAlpZiAodmVzYV9ibGFua19tb2RlKQotCQl2Yy0+dmNfc3ctPmNvbl9ibGFuayh2YywgdmVzYV9ibGFua19tb2RlICsgMSwgMCk7CiB9CiBFWFBPUlRfU1lNQk9MKGRvX2JsYW5rX3NjcmVlbik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9LY29uZmlnIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL0tjb25maWcKaW5kZXggYTY1NDQ3OS4uYzBkZmNmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL0tjb25maWcKQEAgLTM5NSwxMiArMzk1LDM4IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtYWNoendkLgogCitjb25maWcgU0JDX0VQWF9DM19XQVRDSERPRworCXRyaXN0YXRlICJXaW5zeXN0ZW1zIFNCQyBFUFgtQzMgd2F0Y2hkb2ciCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBYODYKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBidWlsdC1pbiB3YXRjaGRvZyB0aW1lciBvbiB0aGUgRVBYLUMzCisJICBTaW5nbGUtYm9hcmQgY29tcHV0ZXIgbWFkZSBieSBXaW5zeXN0ZW1zLCBJbmMuCisKKwkgICpOb3RlKjogVGhpcyBoYXJkd2FyZSB3YXRjaGRvZyBpcyBub3QgcHJvYmVhYmxlIGFuZCB0aHVzIHRoZXJlCisJICBpcyBubyB3YXkgdG8ga25vdyBpZiB3cml0aW5nIHRvIGl0cyBJTyBhZGRyZXNzIHdpbGwgY29ycnVwdAorCSAgeW91ciBzeXN0ZW0gb3IgaGF2ZSBhbnkgcmVhbCBlZmZlY3QuICBUaGUgb25seSB3YXkgdG8gYmUgc3VyZQorCSAgdGhhdCB0aGlzIGRyaXZlciBkb2VzIHdoYXQgeW91IHdhbnQgaXMgdG8gbWFrZSBzdXJlIHlvdQorCSAgYXJlIHJ1bm5uaW5nIGl0IG9uIGFuIEVQWC1DMyBmcm9tIFdpbnN5c3RlbXMgd2l0aCB0aGUgd2F0Y2hkb2cKKwkgIHRpbWVyIGF0IElPIGFkZHJlc3MgMHgxZWUgYW5kIDB4MWVmLiAgSXQgd2lsbCB3cml0ZSB0byBib3RoIHRob3NlCisJICBJTyBwb3J0cy4gIEJhc2ljYWxseSwgdGhlIGFzc3VtcHRpb24gaXMgbWFkZSB0aGF0IGlmIHlvdSBjb21waWxlCisJICB0aGlzIGRyaXZlciBpbnRvIHlvdXIga2VybmVsIGFuZC9vciBsb2FkIGl0IGFzIGEgbW9kdWxlLCB0aGF0IHlvdQorCSAga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcgYW5kIHRoYXQgeW91IGFyZSBpbiBmYWN0IHJ1bm5pbmcgb24gYW4KKwkgIEVQWC1DMyBib2FyZCEKKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2JjX2VweF9jMy4KKworCiAjIFBvd2VyUEMgQXJjaGl0ZWN0dXJlCiAKIGNvbmZpZyA4eHhfV0RUCiAJdHJpc3RhdGUgIk1QQzh4eCBXYXRjaGRvZyBUaW1lciIKIAlkZXBlbmRzIG9uIFdBVENIRE9HICYmIDh4eAogCitjb25maWcgODN4eF9XRFQKKwl0cmlzdGF0ZSAiTVBDODN4eCBXYXRjaGRvZyBUaW1lciIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIFBQQ184M3h4CisKIGNvbmZpZyBNVjY0WDYwX1dEVAogCXRyaXN0YXRlICJNVjY0WDYwIChNYXJ2ZWxsIERpc2NvdmVyeSkgV2F0Y2hkb2cgVGltZXIiCiAJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBNVjY0WDYwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvTWFrZWZpbGUKaW5kZXggY2ZkMGEzOS4uMzZjMGIyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9NYWtlZmlsZQpAQCAtNTIsOSArNTIsMTEgQEAKIG9iai0kKENPTkZJR19XODM4NzdGX1dEVCkgKz0gdzgzODc3Zl93ZHQubwogb2JqLSQoQ09ORklHX1c4Mzk3N0ZfV0RUKSArPSB3ODM5NzdmX3dkdC5vCiBvYmotJChDT05GSUdfTUFDSFpfV0RUKSArPSBtYWNoendkLm8KK29iai0kKENPTkZJR19TQkNfRVBYX0MzX1dBVENIRE9HKSArPSBzYmNfZXB4X2MzLm8KIAogIyBQb3dlclBDIEFyY2hpdGVjdHVyZQogb2JqLSQoQ09ORklHXzh4eF9XRFQpICs9IG1wYzh4eF93ZHQubworb2JqLSQoQ09ORklHXzgzeHhfV0RUKSArPSBtcGM4M3h4X3dkdC5vCiBvYmotJChDT05GSUdfTVY2NFg2MF9XRFQpICs9IG12NjR4NjBfd2R0Lm8KIG9iai0kKENPTkZJR19CT09LRV9XRFQpICs9IGJvb2tlX3dkdC5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9jcHU1d2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvY3B1NXdkdC5jCmluZGV4IGU3NTA0NWYuLjNlODQxMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9jcHU1d2R0LmMKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2NwdTV3ZHQuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTU3LDcgKzU4LDcgQEAKIC8qIHNvbWUgZGV2aWNlIGRhdGEgKi8KIAogc3RhdGljIHN0cnVjdCB7Ci0Jc3RydWN0IHNlbWFwaG9yZSBzdG9wOworCXN0cnVjdCBjb21wbGV0aW9uIHN0b3A7CiAJdm9sYXRpbGUgaW50IHJ1bm5pbmc7CiAJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CiAJdm9sYXRpbGUgaW50IHF1ZXVlOwpAQCAtODUsNyArODYsNyBAQAogCX0KIAllbHNlIHsKIAkJLyogdGlja3MgZG9lc24ndCBtYXR0ZXIgYW55d2F5ICovCi0JCXVwKCZjcHU1d2R0X2RldmljZS5zdG9wKTsKKwkJY29tcGxldGUoJmNwdTV3ZHRfZGV2aWNlLnN0b3ApOwogCX0KIAogfQpAQCAtMjM5LDcgKzI0MCw3IEBACiAJaWYgKCAhdmFsICkKIAkJcHJpbnRrKEtFUk5fSU5GTyBQRlggInNvcnJ5LCB3YXMgbXkgZmF1bHRcbiIpOwogCi0JaW5pdF9NVVRFWF9MT0NLRUQoJmNwdTV3ZHRfZGV2aWNlLnN0b3ApOworCWluaXRfY29tcGxldGlvbigmY3B1NXdkdF9kZXZpY2Uuc3RvcCk7CiAJY3B1NXdkdF9kZXZpY2UucXVldWUgPSAwOwogCiAJY2xlYXJfYml0KDAsICZjcHU1d2R0X2RldmljZS5pbnVzZSk7CkBAIC0yNjksNyArMjcwLDcgQEAKIHsKIAlpZiAoIGNwdTV3ZHRfZGV2aWNlLnF1ZXVlICkgewogCQljcHU1d2R0X2RldmljZS5xdWV1ZSA9IDA7Ci0JCWRvd24oJmNwdTV3ZHRfZGV2aWNlLnN0b3ApOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjcHU1d2R0X2RldmljZS5zdG9wKTsKIAl9CiAKIAltaXNjX2RlcmVnaXN0ZXIoJmNwdTV3ZHRfbWlzYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvbXBjODN4eF93ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9tcGM4M3h4X3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNmY1MDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvbXBjODN4eF93ZHQuYwpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIG1wYzgzeHhfd2R0LmMgLSBNUEM4M3h4IHdhdGNoZG9nIHVzZXJzcGFjZSBpbnRlcmZhY2UKKyAqCisgKiBBdXRob3JzOiBEYXZlIFVwZGVncmFmZiA8ZGF2ZUBjcmF5Lm9yZz4KKyAqIAkgICAgS3VtYXIgR2FsYSA8Z2FsYWtAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqIAkJQXR0cmlidXRpb246IGZyb20gODN4eF93c3Q6IEZsb3JpYW4gU2NoaXJtZXIgPGpvbHRAdHV4Ym94Lm9yZz4KKyAqIAkJCQkuLmFuZCBmcm9tIHNjNTIwX3dkdAorICoKKyAqIE5vdGU6IGl0IGFwcGVhcnMgdGhhdCB5b3UgY2FuIG9ubHkgYWN0dWFsbHkgRU5BQkxFIG9yIERJU0FCTEUgdGhlIHRoaW5nCisgKiBvbmNlIGFmdGVyIFBPUi4gT25jZSBlbmFibGVkLCB5b3UgY2Fubm90IGRpc2FibGUsIGFuZCB2aWNlIHZlcnNhLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0cnVjdCBtcGM4M3h4X3dkdCB7CisJX19iZTMyIHJlczA7CisJX19iZTMyIHN3Y3JyOyAvKiBTeXN0ZW0gd2F0Y2hkb2cgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBTV0NSUl9TV1RDIDB4RkZGRjAwMDAgLyogU29mdHdhcmUgV2F0Y2hkb2cgVGltZSBDb3VudC4gKi8KKyNkZWZpbmUgU1dDUlJfU1dFTiAweDAwMDAwMDA0IC8qIFdhdGNoZG9nIEVuYWJsZSBiaXQuICovCisjZGVmaW5lIFNXQ1JSX1NXUkkgMHgwMDAwMDAwMiAvKiBTb2Z0d2FyZSBXYXRjaGRvZyBSZXNldC9JbnRlcnJ1cHQgU2VsZWN0IGJpdC4qLworI2RlZmluZSBTV0NSUl9TV1BSIDB4MDAwMDAwMDEgLyogU29mdHdhcmUgV2F0Y2hkb2cgQ291bnRlciBQcmVzY2FsZSBiaXQuICovCisJX19iZTMyIHN3Y25yOyAvKiBTeXN0ZW0gd2F0Y2hkb2cgY291bnQgcmVnaXN0ZXIgKi8KKwl1OCByZXMxWzJdOworCV9fYmUxNiBzd3NycjsgLyogU3lzdGVtIHdhdGNoZG9nIHNlcnZpY2UgcmVnaXN0ZXIgKi8KKwl1OCByZXMyWzB4RjBdOworfTsKKworc3RhdGljIHN0cnVjdCBtcGM4M3h4X3dkdCBfX2lvbWVtICp3ZF9iYXNlOworCitzdGF0aWMgdTE2IHRpbWVvdXQgPSAweGZmZmY7Cittb2R1bGVfcGFyYW0odGltZW91dCwgdXNob3J0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGltZW91dCwgIldhdGNoZG9nIHRpbWVvdXQgaW4gdGlja3MuICgwPHRpbWVvdXQ8NjU1MzYsIGRlZmF1bHQ9NjU1MzUiKTsKKworc3RhdGljIGludCByZXNldCA9IDE7Cittb2R1bGVfcGFyYW0ocmVzZXQsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhyZXNldCwgIldhdGNoZG9nIEludGVycnVwdC9SZXNldCBNb2RlLiAwID0gaW50ZXJydXB0LCAxID0gcmVzZXQiKTsKKworLyoKKyAqIFdlIGFsd2F5cyBwcmVzY2FsZSwgYnV0IGlmIHNvbWVvbmUgcmVhbGx5IGRvZXNuJ3Qgd2FudCB0byB0aGV5IGNhbiBzZXQgdGhpcworICogdG8gMAorICovCitzdGF0aWMgaW50IHByZXNjYWxlID0gMTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGltZW91dF9zZWM7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdkdF9pc19vcGVuOworc3RhdGljIHNwaW5sb2NrX3Qgd2R0X3NwaW5sb2NrOworCitzdGF0aWMgdm9pZCBtcGM4M3h4X3dkdF9rZWVwYWxpdmUodm9pZCkKK3sKKwkvKiBQaW5nIHRoZSBXRFQgKi8KKwlzcGluX2xvY2soJndkdF9zcGlubG9jayk7CisJb3V0X2JlMTYoJndkX2Jhc2UtPnN3c3JyLCAweDU1NmMpOworCW91dF9iZTE2KCZ3ZF9iYXNlLT5zd3NyciwgMHhhYTM5KTsKKwlzcGluX3VubG9jaygmd2R0X3NwaW5sb2NrKTsKK30KKworc3RhdGljIHNzaXplX3QgbXBjODN4eF93ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWlmIChjb3VudCkKKwkJbXBjODN4eF93ZHRfa2VlcGFsaXZlKCk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IG1wYzgzeHhfd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdTMyIHRtcCA9IFNXQ1JSX1NXRU47CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJndkdF9pc19vcGVuKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIE9uY2Ugd2Ugc3RhcnQgdGhlIHdhdGNoZG9nIHdlIGNhbid0IHN0b3AgaXQgKi8KKwlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCisJLyogR29vZCwgZmlyZSB1cCB0aGUgc2hvdyAqLworCWlmIChwcmVzY2FsZSkKKwkJdG1wIHw9IFNXQ1JSX1NXUFI7CisJaWYgKHJlc2V0KQorCQl0bXAgfD0gU1dDUlJfU1dSSTsKKworCXRtcCB8PSB0aW1lb3V0IDw8IDE2OworCisJb3V0X2JlMzIoJndkX2Jhc2UtPnN3Y3JyLCB0bXApOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IG1wYzgzeHhfd2R0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcHJpbnRrKEtFUk5fQ1JJVCAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJbXBjODN4eF93ZHRfa2VlcGFsaXZlKCk7CisJY2xlYXJfYml0KDAsICZ3ZHRfaXNfb3Blbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXBjODN4eF93ZHRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCQkub3B0aW9ucyA9IFdESU9GX0tFRVBBTElWRVBJTkcsCisJCS5maXJtd2FyZV92ZXJzaW9uID0gMSwKKwkJLmlkZW50aXR5ID0gIk1QQzgzeHgiLAorCX07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpID8gLUVGQVVMVCA6IDA7CisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCW1wYzgzeHhfd2R0X2tlZXBhbGl2ZSgpOworCQlyZXR1cm4gMDsKKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCXJldHVybiBwdXRfdXNlcih0aW1lb3V0X3NlYywgcCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1wYzgzeHhfd2R0X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSBtcGM4M3h4X3dkdF93cml0ZSwKKwkuaW9jdGwJCT0gbXBjODN4eF93ZHRfaW9jdGwsCisJLm9wZW4JCT0gbXBjODN4eF93ZHRfb3BlbiwKKwkucmVsZWFzZQk9IG1wYzgzeHhfd2R0X3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgbXBjODN4eF93ZHRfbWlzY2RldiA9IHsKKwkubWlub3IJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJPSAmbXBjODN4eF93ZHRfZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG1wYzgzeHhfd2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgKmZyZXEgPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJLyogZ2V0IGEgcG9pbnRlciB0byB0aGUgcmVnaXN0ZXIgbWVtb3J5ICovCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKworCWlmICghcikgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJd2RfYmFzZSA9IGlvcmVtYXAoci0+c3RhcnQsIHNpemVvZiAoc3RydWN0IG1wYzgzeHhfd2R0KSk7CisKKwlpZiAod2RfYmFzZSA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZtcGM4M3h4X3dkdF9taXNjZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgIgorCQkJCSIoZXJyPSVkKVxuIiwKKwkJCQlXQVRDSERPR19NSU5PUiwgcmV0KTsKKwkJZ290byBlcnJfdW5tYXA7CisJfQorCisJLyogQ2FsY3VsYXRlIHRoZSB0aW1lb3V0IGluIHNlY29uZHMgKi8KKwlpZiAocHJlc2NhbGUpCisJCXRpbWVvdXRfc2VjID0gKHRpbWVvdXQgKiAweDEwMDAwKSAvICgqZnJlcSk7CisJZWxzZQorCQl0aW1lb3V0X3NlYyA9IHRpbWVvdXQgLyAoKmZyZXEpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiV0RUIGRyaXZlciBmb3IgTVBDODN4eCBpbml0aWFsaXplZC4gIgorCQkibW9kZTolcyB0aW1lb3V0PSVkICglZCBzZWNvbmRzKVxuIiwKKwkJcmVzZXQgPyAicmVzZXQiOiJpbnRlcnJ1cHQiLCB0aW1lb3V0LCB0aW1lb3V0X3NlYyk7CisKKwlzcGluX2xvY2tfaW5pdCgmd2R0X3NwaW5sb2NrKTsKKworCXJldHVybiAwOworCitlcnJfdW5tYXA6CisJaW91bm1hcCh3ZF9iYXNlKTsKK2Vycl9vdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbXBjODN4eF93ZHRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJm1wYzgzeHhfd2R0X21pc2NkZXYpOworCWlvdW5tYXAod2RfYmFzZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXBjODN4eF93ZHRfZHJpdmVyID0geworCS5wcm9iZQkJPSBtcGM4M3h4X3dkdF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG1wYzgzeHhfd2R0X3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gIm1wYzgzeHhfd2R0IiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgbXBjODN4eF93ZHRfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1wYzgzeHhfd2R0X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtcGM4M3h4X3dkdF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1wYzgzeHhfd2R0X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG1wYzgzeHhfd2R0X2luaXQpOworbW9kdWxlX2V4aXQobXBjODN4eF93ZHRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkRhdmUgVXBkZWdyYWZmLCBLdW1hciBHYWxhIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3Igd2F0Y2hkb2cgdGltZXIgaW4gTVBDODN4eCB1UHJvY2Vzc29yIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvbXBjOHh4X3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL21wYzh4eF93ZHQuYwppbmRleCA1NmQ2MmJhLi5iMmZjNzFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvbXBjOHh4X3dkdC5jCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9tcGM4eHhfd2R0LmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgogI2luY2x1ZGUgPGFzbS84eHhfaW1tYXAuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPHN5c2xpYi9tOHh4X3dkdC5oPgogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB3ZHRfb3BlbmVkOwpAQCAtMjUsMTggKzI2LDI2IEBACiAKIHN0YXRpYyB2b2lkIG1wYzh4eF93ZHRfaGFuZGxlcl9kaXNhYmxlKHZvaWQpCiB7Ci0Jdm9sYXRpbGUgaW1tYXBfdCAqaW1hcCA9ICh2b2xhdGlsZSBpbW1hcF90ICopSU1BUF9BRERSOworCXZvbGF0aWxlIHVpbnQgX19pb21lbSAqcGlzY3I7CisJcGlzY3IgPSAodWludCAqKSYoKGltbWFwX3QqKUlNQVBfQUREUiktPmltX3NpdC5zaXRfcGlzY3I7CiAKLQlpbWFwLT5pbV9zaXQuc2l0X3Bpc2NyICY9IH4oUElTQ1JfUElFIHwgUElTQ1JfUFRFKTsKKwlpZiAoIW04eHhfaGFzX2ludGVybmFsX3J0YykKKwkJbTh4eF93ZHRfc3RvcF90aW1lcigpOworCWVsc2UKKwkJb3V0X2JlMzIocGlzY3IsIGluX2JlMzIocGlzY3IpICYgfihQSVNDUl9QSUUgfCBQSVNDUl9QVEUpKTsKIAogCXByaW50ayhLRVJOX05PVElDRSAibXBjOHh4X3dkdDoga2VlcC1hbGl2ZSBoYW5kbGVyIGRlYWN0aXZhdGVkXG4iKTsKIH0KIAogc3RhdGljIHZvaWQgbXBjOHh4X3dkdF9oYW5kbGVyX2VuYWJsZSh2b2lkKQogewotCXZvbGF0aWxlIGltbWFwX3QgKmltYXAgPSAodm9sYXRpbGUgaW1tYXBfdCAqKUlNQVBfQUREUjsKKwl2b2xhdGlsZSB1aW50IF9faW9tZW0gKnBpc2NyOworCXBpc2NyID0gKHVpbnQgKikmKChpbW1hcF90KilJTUFQX0FERFIpLT5pbV9zaXQuc2l0X3Bpc2NyOwogCi0JaW1hcC0+aW1fc2l0LnNpdF9waXNjciB8PSBQSVNDUl9QSUUgfCBQSVNDUl9QVEU7CisJaWYgKCFtOHh4X2hhc19pbnRlcm5hbF9ydGMpCisJCW04eHhfd2R0X2luc3RhbGxfdGltZXIoKTsKKwllbHNlCisJCW91dF9iZTMyKHBpc2NyLCBpbl9iZTMyKHBpc2NyKSB8IFBJU0NSX1BJRSB8IFBJU0NSX1BURSk7CiAKIAlwcmludGsoS0VSTl9OT1RJQ0UgIm1wYzh4eF93ZHQ6IGtlZXAtYWxpdmUgaGFuZGxlciBhY3RpdmF0ZWRcbiIpOwogfQpAQCAtNjgsOSArNzcsNiBAQAogc3RhdGljIHNzaXplX3QgbXBjOHh4X3dkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwKIAkJCQlsb2ZmX3QgKiBwcG9zKQogewotCWlmIChwcG9zICE9ICZmaWxlLT5mX3BvcykKLQkJcmV0dXJuIC1FU1BJUEU7Ci0KIAlpZiAobGVuKQogCQltOHh4X3dkdF9yZXNldCgpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvczNjMjQxMF93ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zM2MyNDEwX3dkdC5jCmluZGV4IGViNjY3ZGEuLjlkYzU0NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zM2MyNDEwX3dkdC5jCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zM2MyNDEwX3dkdC5jCkBAIC00NiwxMiArNDYsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSA8YXNtL2FyY2gvbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CiAKICN1bmRlZiBTM0MyNFhYX1ZBX1dBVENIRE9HCiAjZGVmaW5lIFMzQzI0WFhfVkFfV0FUQ0hET0cgKDApCkBAIC0zOTcsNyArMzk3LDYgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JY2xrX3VzZSh3ZHRfY2xvY2spOwogCWNsa19lbmFibGUod2R0X2Nsb2NrKTsKIAogCS8qIHNlZSBpZiB3ZSBjYW4gYWN0dWFsbHkgc2V0IHRoZSByZXF1ZXN0ZWQgdGltZXIgbWFyZ2luLCBhbmQgaWYKQEAgLTQ0NCw3ICs0NDMsNiBAQAogCiAJaWYgKHdkdF9jbG9jayAhPSBOVUxMKSB7CiAJCWNsa19kaXNhYmxlKHdkdF9jbG9jayk7Ci0JCWNsa191bnVzZSh3ZHRfY2xvY2spOwogCQljbGtfcHV0KHdkdF9jbG9jayk7CiAJCXdkdF9jbG9jayA9IE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NhMTEwMF93ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zYTExMDBfd2R0LmMKaW5kZXggZmI4OGI0MC4uYjQ3NGVhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NhMTEwMF93ZHQuYworKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2ExMTAwX3dkdC5jCkBAIC03NCw3ICs3NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNhMTEwMGRvZ193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQorc3RhdGljIHNzaXplX3Qgc2ExMTAwZG9nX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQogewogCWlmIChsZW4pCiAJCS8qIFJlZnJlc2ggT1NNUjMgdGltZXIuICovCkBAIC05NiwyMCArOTYsMjAgQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgotCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHN0cnVjdCB3YXRjaGRvZ19pbmZvICopYXJnLCAmaWRlbnQsCisJCXJldCA9IGNvcHlfdG9fdXNlcigoc3RydWN0IHdhdGNoZG9nX2luZm8gX191c2VyICopYXJnLCAmaWRlbnQsCiAJCQkJICAgc2l6ZW9mKGlkZW50KSkgPyAtRUZBVUxUIDogMDsKIAkJYnJlYWs7CiAKIAljYXNlIFdESU9DX0dFVFNUQVRVUzoKLQkJcmV0ID0gcHV0X3VzZXIoMCwgKGludCAqKWFyZyk7CisJCXJldCA9IHB1dF91c2VyKDAsIChpbnQgX191c2VyICopYXJnKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6Ci0JCXJldCA9IHB1dF91c2VyKGJvb3Rfc3RhdHVzLCAoaW50ICopYXJnKTsKKwkJcmV0ID0gcHV0X3VzZXIoYm9vdF9zdGF0dXMsIChpbnQgX191c2VyICopYXJnKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdESU9DX1NFVFRJTUVPVVQ6Ci0JCXJldCA9IGdldF91c2VyKHRpbWUsIChpbnQgKilhcmcpOworCQlyZXQgPSBnZXRfdXNlcih0aW1lLCAoaW50IF9fdXNlciAqKWFyZyk7CiAJCWlmIChyZXQpCiAJCQlicmVhazsKIApAQCAtMTIzLDcgKzEyMyw3IEBACiAJCS8qZmFsbCB0aHJvdWdoKi8KIAogCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKLQkJcmV0ID0gcHV0X3VzZXIocHJlX21hcmdpbiAvIE9TQ1JfRlJFUSwgKGludCAqKWFyZyk7CisJCXJldCA9IHB1dF91c2VyKHByZV9tYXJnaW4gLyBPU0NSX0ZSRVEsIChpbnQgX191c2VyICopYXJnKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdESU9DX0tFRVBBTElWRToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zYmNfZXB4X2MzLmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2JjX2VweF9jMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MTc2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2JjX2VweF9jMy5jCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICoJU0JDIEVQWCBDMyAwLjEJQSBIYXJkd2FyZSBXYXRjaGRvZyBEZXZpY2UgZm9yIHRoZSBXaW5zeXN0ZW1zIEVQWC1DMworICoJc2luZ2xlIGJvYXJkIGNvbXB1dGVyCisgKgorICoJKGMpIENvcHlyaWdodCAyMDA2IENhbGluIEEuIEN1bGlhbnUgPGNhbGluQGFqdmFyLm9yZz4sIEFsbCBSaWdodHMKKyAqCVJlc2VydmVkLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJYmFzZWQgb24gc29mdGRvZy5jIGJ5IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBQRlggImVweF9jMzogIgorc3RhdGljIGludCBlcHhfYzNfYWxpdmU7CisKKyNkZWZpbmUgV0FUQ0hET0dfVElNRU9VVCAxCQkvKiAxIHNlYyBkZWZhdWx0IHRpbWVvdXQgKi8KKworc3RhdGljIGludCBub3dheW91dCA9IFdBVENIRE9HX05PV0FZT1VUOworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKKyNkZWZpbmUgRVBYQzNfV0FUQ0hET0dfQ1RMX1JFRyAweDFlZSAvKiB3cml0ZSAxIHRvIGVuYWJsZSwgMCB0byBkaXNhYmxlICovCisjZGVmaW5lIEVQWEMzX1dBVENIRE9HX1BFVF9SRUcgMHgxZWYgLyogd3JpdGUgYW55dGhpbmcgdG8gcGV0IG9uY2UgZW5hYmxlZCAqLworCitzdGF0aWMgdm9pZCBlcHhfYzNfc3RhcnQodm9pZCkKK3sKKwlvdXRiKDEsIEVQWEMzX1dBVENIRE9HX0NUTF9SRUcpOworfQorCitzdGF0aWMgdm9pZCBlcHhfYzNfc3RvcCh2b2lkKQoreworCisJb3V0YigwLCBFUFhDM19XQVRDSERPR19DVExfUkVHKTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJTdG9wcGVkIHdhdGNoZG9nIHRpbWVyLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGVweF9jM19wZXQodm9pZCkKK3sKKwlvdXRiKDEsIEVQWEMzX1dBVENIRE9HX1BFVF9SRUcpOworfQorCisvKgorICoJQWxsb3cgb25seSBvbmUgcGVyc29uIHRvIGhvbGQgaXQgb3BlbgorICovCitzdGF0aWMgaW50IGVweF9jM19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChlcHhfYzNfYWxpdmUpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAobm93YXlvdXQpCisJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisKKwkvKiBBY3RpdmF0ZSB0aW1lciAqLworCWVweF9jM19zdGFydCgpOworCWVweF9jM19wZXQoKTsKKworCWVweF9jM19hbGl2ZSA9IDE7CisJcHJpbnRrKEtFUk5fSU5GTyAiU3RhcnRlZCB3YXRjaGRvZyB0aW1lci5cbiIpOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGVweF9jM19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qIFNodXQgb2ZmIHRoZSB0aW1lci4KKwkgKiBMb2NrIGl0IGluIGlmIGl0J3MgYSBtb2R1bGUgYW5kIHdlIGRlZmluZWQgLi4uTk9XQVlPVVQgKi8KKwlpZiAoIW5vd2F5b3V0KQorCQllcHhfYzNfc3RvcCgpOwkJLyogVHVybiB0aGUgV0RUIG9mZiAqLworCisJZXB4X2MzX2FsaXZlID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBlcHhfYzNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmRhdGEsCisJCQlzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJLyogUmVmcmVzaCB0aGUgdGltZXIuICovCisJaWYgKGxlbikKKwkJZXB4X2MzX3BldCgpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgZXB4X2MzX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IG9wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCQkub3B0aW9ucwkJPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwKKwkJCQkJICBXRElPRl9NQUdJQ0NMT1NFLAorCQkuZmlybXdhcmVfdmVyc2lvbgk9IDAsCisJCS5pZGVudGl0eQkJPSAiV2luc3lzdGVtcyBFUFgtQzMgSC9XIFdhdGNoZG9nIiwKKwl9OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCB3YXRjaGRvZ19pbmZvICopYXJnLAorCQkJCSAmaWRlbnQsIHNpemVvZihpZGVudCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJcmV0dXJuIHB1dF91c2VyKDAsKGludCAqKWFyZyk7CisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCWVweF9jM19wZXQoKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQlyZXR1cm4gcHV0X3VzZXIoV0FUQ0hET0dfVElNRU9VVCwoaW50ICopYXJnKTsKKwljYXNlIFdESU9DX1NFVE9QVElPTlM6IHsKKwkJaWYgKGdldF91c2VyKG9wdGlvbnMsIChpbnQgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKG9wdGlvbnMgJiBXRElPU19ESVNBQkxFQ0FSRCkgeworCQkJZXB4X2MzX3N0b3AoKTsKKwkJCXJldHZhbCA9IDA7CisJCX0KKworCQlpZiAob3B0aW9ucyAmIFdESU9TX0VOQUJMRUNBUkQpIHsKKwkJCWVweF9jM19zdGFydCgpOworCQkJcmV0dmFsID0gMDsKKwkJfQorCisJCXJldHVybiByZXR2YWw7CisJfQorCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorfQorCitzdGF0aWMgaW50IGVweF9jM19ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLAorCQkJCXZvaWQgKnVudXNlZCkKK3sKKwlpZiAoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKQorCQllcHhfYzNfc3RvcCgpOwkJLyogVHVybiB0aGUgV0RUIG9mZiAqLworCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlcHhfYzNfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLndyaXRlCQk9IGVweF9jM193cml0ZSwKKwkuaW9jdGwJCT0gZXB4X2MzX2lvY3RsLAorCS5vcGVuCQk9IGVweF9jM19vcGVuLAorCS5yZWxlYXNlCT0gZXB4X2MzX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgZXB4X2MzX21pc2NkZXYgPSB7CisJLm1pbm9yCQk9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJCT0gJmVweF9jM19mb3BzLAorfTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBlcHhfYzNfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBlcHhfYzNfbm90aWZ5X3N5cywKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIGJhbm5lcltdIF9faW5pdGRhdGEgPQorICAgIEtFUk5fSU5GTyBQRlggIkhhcmR3YXJlIFdhdGNoZG9nIFRpbWVyIGZvciBXaW5zeXN0ZW1zIEVQWC1DMyBTQkM6IDAuMVxuIjsKKworc3RhdGljIGludCBfX2luaXQgd2F0Y2hkb2dfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmVweF9jM19ub3RpZmllcik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyICIKKwkJCSIoZXJyPSVkKVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZlcHhfYzNfbWlzY2Rldik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAiCisJCQkiKGVycj0lZClcbiIsIFdBVENIRE9HX01JTk9SLCByZXQpOworCQl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmZXB4X2MzX25vdGlmaWVyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcmludGsoYmFubmVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgd2F0Y2hkb2dfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3RlcigmZXB4X2MzX21pc2NkZXYpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZlcHhfYzNfbm90aWZpZXIpOworfQorCittb2R1bGVfaW5pdCh3YXRjaGRvZ19pbml0KTsKK21vZHVsZV9leGl0KHdhdGNoZG9nX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJDYWxpbiBBLiBDdWxpYW51IDxjYWxpbkBhanZhci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhhcmR3YXJlIFdhdGNoZG9nIERldmljZSBmb3IgV2luc3lzdGVtcyBFUFgtQzMgU0JDLiAgTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHdheSB0byBwcm9iZSBmb3IgdGhpcyBkZXZpY2UgLS0gc28gb25seSB1c2UgaXQgaWYgeW91IGFyZSAqc3VyZSogeW91IGFyZSBydW5ubmluZyBvbiB0aGlzIHNwZWNpZmljIFNCQyBzeXN0ZW0gZnJvbSBXaW5zeXN0ZW1zISAgSXQgd3JpdGVzIHRvIElPIHBvcnRzIDB4MWVlIGFuZCAweDFlZiEiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy93ZHQ5NzcuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy93ZHQ5NzcuYwppbmRleCA0NGQ0OWRmLi4zODQzOTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvd2R0OTc3LmMKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3dkdDk3Ny5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqCVdkdDk3NwkwLjAzOglBIFdhdGNoZG9nIERldmljZSBmb3IgTmV0d2luZGVyIFc4Mzk3N0FGIGNoaXAKKyAqCVdkdDk3NwkwLjA0OglBIFdhdGNoZG9nIERldmljZSBmb3IgTmV0d2luZGVyIFc4Mzk3N0FGIGNoaXAKICAqCiAgKgkoYykgQ29weXJpZ2h0IDE5OTggUmViZWwuY29tIChXb29keSBTdXdhbHNraSA8d29vZHlAbmV0d2luZGVyLm9yZz4pCiAgKgpAQCAtMTgsNiArMTgsOCBAQAogICoJCQkJICAgIGZyb20gbWludXRlcyB0byBzZWNvbmRzLgogICogICAgICAwNy1KdWwtMjAwMyBEYW5pZWxlIEJlbGx1Y2NpOiBBdWRpdCByZXR1cm4gY29kZSBvZiBtaXNjX3JlZ2lzdGVyIGluCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG53d2F0Y2hkb2dfaW5pdC4KKyAqICAgICAgMjUtT2N0LTIwMDUgV29vZHkgU3V3YWxza2k6IENvbnZlcnQgYWRkcmVzc2VzIHRvICNkZWZzLCBhZGQgc3BpbmxvY2tzCisgKgkJCQkgICAgcmVtb3ZlIGxpbWl0aWF0aW9uIHRvIGJlIHVzZWQgb24gTmV0d2luZGVycyBvbmx5CiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMjgsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CkBAIC0zNyw4ICs0MCwxOCBAQAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2RlZmluZSBQRlggIldkdDk3NzogIgotI2RlZmluZSBXQVRDSERPR19NSU5PUgkxMzAKKyNkZWZpbmUgV0FUQ0hET0dfVkVSU0lPTiAgIjAuMDQiCisjZGVmaW5lIFdBVENIRE9HX05BTUUgICAgICJXZHQ5NzciCisjZGVmaW5lIFBGWCBXQVRDSERPR19OQU1FICI6ICIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gICAgV0FUQ0hET0dfTkFNRSAiIGRyaXZlciwgdiIgV0FUQ0hET0dfVkVSU0lPTiAiXG4iCisKKyNkZWZpbmUgSU9fSU5ERVhfUE9SVAkweDM3MAkJLyogb24gc29tZSBzeXN0ZW1zIGl0IGNhbiBiZSAweDNGMCAqLworI2RlZmluZSBJT19EQVRBX1BPUlQJKElPX0lOREVYX1BPUlQrMSkKKworI2RlZmluZSBVTkxPQ0tfREFUQQkweDg3CisjZGVmaW5lIExPQ0tfREFUQQkweEFBCisjZGVmaW5lIERFVklDRV9SRUdJU1RFUgkweDA3CisKIAogI2RlZmluZQlERUZBVUxUX1RJTUVPVVQJNjAJCQkvKiBkZWZhdWx0IHRpbWVvdXQgaW4gc2Vjb25kcyAqLwogCkBAIC00Nyw2ICs2MCw3IEBACiBzdGF0aWMJdW5zaWduZWQgbG9uZyB0aW1lcl9hbGl2ZTsKIHN0YXRpYwlpbnQgdGVzdG1vZGU7CiBzdGF0aWMJY2hhciBleHBlY3RfY2xvc2U7CitzdGF0aWMJc3BpbmxvY2tfdCBzcGlubG9jazsKIAogbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHRpbWVvdXQsIldhdGNoZG9nIHRpbWVvdXQgaW4gc2Vjb25kcyAoNjAuLjE1MzAwKSwgZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhERUZBVUxUX1RJTUVPVVQpICIpIik7CkBAIC02Myw5ICs3NywxMyBAQAogCiBzdGF0aWMgaW50IHdkdDk3N19zdGFydCh2b2lkKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3BpbmxvY2ssIGZsYWdzKTsKKwogCS8qIHVubG9jayB0aGUgU3VwZXJJTyBjaGlwICovCi0Jb3V0YigweDg3LDB4MzcwKTsKLQlvdXRiKDB4ODcsMHgzNzApOworCW91dGJfcChVTkxPQ0tfREFUQSwgSU9fSU5ERVhfUE9SVCk7CisJb3V0Yl9wKFVOTE9DS19EQVRBLCBJT19JTkRFWF9QT1JUKTsKIAogCS8qIHNlbGVjdCBkZXZpY2UgQXV4MiAoZGV2aWNlPTgpIGFuZCBzZXQgd2F0Y2hkb2cgcmVncyBGMiwgRjMgYW5kIEY0CiAJICogRjIgaGFzIHRoZSB0aW1lb3V0IGluIG1pbnV0ZXMKQEAgLTczLDI4ICs5MSwyOSBAQAogCSAqICAgYXQgdGltZW91dCwgYW5kIHRvIHJlc2V0IHRpbWVyIG9uIGtiZC9tb3VzZSBhY3Rpdml0eSAobm90IGltcGwuKQogCSAqIEY0IGlzIHVzZWQgdG8ganVzdCBjbGVhciB0aGUgVElNRU9VVCdlZCBzdGF0ZSAoYml0IDApCiAJICovCi0Jb3V0YigweDA3LDB4MzcwKTsKLQlvdXRiKDB4MDgsMHgzNzEpOwotCW91dGIoMHhGMiwweDM3MCk7Ci0Jb3V0Yih0aW1lb3V0TSwweDM3MSk7Ci0Jb3V0YigweEYzLDB4MzcwKTsKLQlvdXRiKDB4MDAsMHgzNzEpOwkvKiBhbm90aGVyIHNldHRpbmcgaXMgMEUgZm9yIGtiZC9tb3VzZS9MRUQgKi8KLQlvdXRiKDB4RjQsMHgzNzApOwotCW91dGIoMHgwMCwweDM3MSk7CisJb3V0Yl9wKERFVklDRV9SRUdJU1RFUiwgSU9fSU5ERVhfUE9SVCk7CisJb3V0Yl9wKDB4MDgsIElPX0RBVEFfUE9SVCk7CisJb3V0Yl9wKDB4RjIsIElPX0lOREVYX1BPUlQpOworCW91dGJfcCh0aW1lb3V0TSwgSU9fREFUQV9QT1JUKTsKKwlvdXRiX3AoMHhGMywgSU9fSU5ERVhfUE9SVCk7CisJb3V0Yl9wKDB4MDAsIElPX0RBVEFfUE9SVCk7CS8qIGFub3RoZXIgc2V0dGluZyBpcyAwRSBmb3Iga2JkL21vdXNlL0xFRCAqLworCW91dGJfcCgweEY0LCBJT19JTkRFWF9QT1JUKTsKKwlvdXRiX3AoMHgwMCwgSU9fREFUQV9QT1JUKTsKIAogCS8qIGF0IGxhc3Qgc2VsZWN0IGRldmljZSBBdXgxIChkZXY9NykgYW5kIHNldCBHUDE2IGFzIGEgd2F0Y2hkb2cgb3V0cHV0ICovCiAJLyogaW4gdGVzdCBtb2RlIHdhdGNoIHRoZSBiaXQgMSBvbiBGNCB0byBpbmRpY2F0ZSAidHJpZ2dlcmVkIiAqLwogCWlmICghdGVzdG1vZGUpCiAJewotCQlvdXRiKDB4MDcsMHgzNzApOwotCQlvdXRiKDB4MDcsMHgzNzEpOwotCQlvdXRiKDB4RTYsMHgzNzApOwotCQlvdXRiKDB4MDgsMHgzNzEpOworCQlvdXRiX3AoREVWSUNFX1JFR0lTVEVSLCBJT19JTkRFWF9QT1JUKTsKKwkJb3V0Yl9wKDB4MDcsIElPX0RBVEFfUE9SVCk7CisJCW91dGJfcCgweEU2LCBJT19JTkRFWF9QT1JUKTsKKwkJb3V0Yl9wKDB4MDgsIElPX0RBVEFfUE9SVCk7CiAJfQogCiAJLyogbG9jayB0aGUgU3VwZXJJTyBjaGlwICovCi0Jb3V0YigweEFBLDB4MzcwKTsKKwlvdXRiX3AoTE9DS19EQVRBLCBJT19JTkRFWF9QT1JUKTsKIAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwaW5sb2NrLCBmbGFncyk7CiAJcHJpbnRrKEtFUk5fSU5GTyBQRlggImFjdGl2YXRlZC5cbiIpOwogCiAJcmV0dXJuIDA7CkBAIC0xMDYsMzUgKzEyNSwzOSBAQAogCiBzdGF0aWMgaW50IHdkdDk3N19zdG9wKHZvaWQpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3BpbmxvY2ssIGZsYWdzKTsKKwogCS8qIHVubG9jayB0aGUgU3VwZXJJTyBjaGlwICovCi0Jb3V0YigweDg3LDB4MzcwKTsKLQlvdXRiKDB4ODcsMHgzNzApOworCW91dGJfcChVTkxPQ0tfREFUQSwgSU9fSU5ERVhfUE9SVCk7CisJb3V0Yl9wKFVOTE9DS19EQVRBLCBJT19JTkRFWF9QT1JUKTsKIAogCS8qIHNlbGVjdCBkZXZpY2UgQXV4MiAoZGV2aWNlPTgpIGFuZCBzZXQgd2F0Y2hkb2cgcmVncyBGMixGMyBhbmQgRjQKIAkqIEYzIGlzIHJlc2V0IHRvIGl0cyBkZWZhdWx0IHN0YXRlCiAJKiBGNCBjYW4gY2xlYXIgdGhlIFRJTUVPVVQnZWQgc3RhdGUgKGJpdCAwKSAtIGJhY2sgdG8gZGVmYXVsdAogCSogV2UgY2FuIG5vdCB1c2UgR1AxNyBhcyBhIFBvd2VyTGVkLCBhcyB3ZSB1c2UgaXRzIHVzYWdlIGFzIGEgUmVkTGVkCiAJKi8KLQlvdXRiKDB4MDcsMHgzNzApOwotCW91dGIoMHgwOCwweDM3MSk7Ci0Jb3V0YigweEYyLDB4MzcwKTsKLQlvdXRiKDB4RkYsMHgzNzEpOwotCW91dGIoMHhGMywweDM3MCk7Ci0Jb3V0YigweDAwLDB4MzcxKTsKLQlvdXRiKDB4RjQsMHgzNzApOwotCW91dGIoMHgwMCwweDM3MSk7Ci0Jb3V0YigweEYyLDB4MzcwKTsKLQlvdXRiKDB4MDAsMHgzNzEpOworCW91dGJfcChERVZJQ0VfUkVHSVNURVIsIElPX0lOREVYX1BPUlQpOworCW91dGJfcCgweDA4LCBJT19EQVRBX1BPUlQpOworCW91dGJfcCgweEYyLCBJT19JTkRFWF9QT1JUKTsKKwlvdXRiX3AoMHhGRiwgSU9fREFUQV9QT1JUKTsKKwlvdXRiX3AoMHhGMywgSU9fSU5ERVhfUE9SVCk7CisJb3V0Yl9wKDB4MDAsIElPX0RBVEFfUE9SVCk7CisJb3V0Yl9wKDB4RjQsIElPX0lOREVYX1BPUlQpOworCW91dGJfcCgweDAwLCBJT19EQVRBX1BPUlQpOworCW91dGJfcCgweEYyLCBJT19JTkRFWF9QT1JUKTsKKwlvdXRiX3AoMHgwMCwgSU9fREFUQV9QT1JUKTsKIAogCS8qIGF0IGxhc3Qgc2VsZWN0IGRldmljZSBBdXgxIChkZXY9NykgYW5kIHNldCBHUDE2IGFzIGEgd2F0Y2hkb2cgb3V0cHV0ICovCi0Jb3V0YigweDA3LDB4MzcwKTsKLQlvdXRiKDB4MDcsMHgzNzEpOwotCW91dGIoMHhFNiwweDM3MCk7Ci0Jb3V0YigweDA4LDB4MzcxKTsKKwlvdXRiX3AoREVWSUNFX1JFR0lTVEVSLCBJT19JTkRFWF9QT1JUKTsKKwlvdXRiX3AoMHgwNywgSU9fREFUQV9QT1JUKTsKKwlvdXRiX3AoMHhFNiwgSU9fSU5ERVhfUE9SVCk7CisJb3V0Yl9wKDB4MDgsIElPX0RBVEFfUE9SVCk7CiAKIAkvKiBsb2NrIHRoZSBTdXBlcklPIGNoaXAgKi8KLQlvdXRiKDB4QUEsMHgzNzApOworCW91dGJfcChMT0NLX0RBVEEsIElPX0lOREVYX1BPUlQpOwogCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BpbmxvY2ssIGZsYWdzKTsKIAlwcmludGsoS0VSTl9JTkZPIFBGWCAic2h1dGRvd24uXG4iKTsKIAogCXJldHVybiAwOwpAQCAtMTQ3LDE5ICsxNzAsMjMgQEAKIAogc3RhdGljIGludCB3ZHQ5Nzdfa2VlcGFsaXZlKHZvaWQpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3BpbmxvY2ssIGZsYWdzKTsKKwogCS8qIHVubG9jayB0aGUgU3VwZXJJTyBjaGlwICovCi0Jb3V0YigweDg3LDB4MzcwKTsKLQlvdXRiKDB4ODcsMHgzNzApOworCW91dGJfcChVTkxPQ0tfREFUQSwgSU9fSU5ERVhfUE9SVCk7CisJb3V0Yl9wKFVOTE9DS19EQVRBLCBJT19JTkRFWF9QT1JUKTsKIAogCS8qIHNlbGVjdCBkZXZpY2UgQXV4MiAoZGV2aWNlPTgpIGFuZCBraWNrcyB3YXRjaGRvZyByZWcgRjIgKi8KIAkvKiBGMiBoYXMgdGhlIHRpbWVvdXQgaW4gbWludXRlcyAqLwotCW91dGIoMHgwNywweDM3MCk7Ci0Jb3V0YigweDA4LDB4MzcxKTsKLQlvdXRiKDB4RjIsMHgzNzApOwotCW91dGIodGltZW91dE0sMHgzNzEpOworCW91dGJfcChERVZJQ0VfUkVHSVNURVIsIElPX0lOREVYX1BPUlQpOworCW91dGJfcCgweDA4LCBJT19EQVRBX1BPUlQpOworCW91dGJfcCgweEYyLCBJT19JTkRFWF9QT1JUKTsKKwlvdXRiX3AodGltZW91dE0sIElPX0RBVEFfUE9SVCk7CiAKIAkvKiBsb2NrIHRoZSBTdXBlcklPIGNoaXAgKi8KLQlvdXRiKDB4QUEsMHgzNzApOworCW91dGJfcChMT0NLX0RBVEEsIElPX0lOREVYX1BPUlQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwaW5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5OCwyMiArMjI1LDI2IEBACiBzdGF0aWMgaW50IHdkdDk3N19nZXRfc3RhdHVzKGludCAqc3RhdHVzKQogewogCWludCBuZXdfc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkqc3RhdHVzPTA7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwaW5sb2NrLCBmbGFncyk7CiAKIAkvKiB1bmxvY2sgdGhlIFN1cGVySU8gY2hpcCAqLwotCW91dGIoMHg4NywweDM3MCk7Ci0Jb3V0YigweDg3LDB4MzcwKTsKKwlvdXRiX3AoVU5MT0NLX0RBVEEsIElPX0lOREVYX1BPUlQpOworCW91dGJfcChVTkxPQ0tfREFUQSwgSU9fSU5ERVhfUE9SVCk7CiAKIAkvKiBzZWxlY3QgZGV2aWNlIEF1eDIgKGRldmljZT04KSBhbmQgcmVhZCB3YXRjaGRvZyByZWcgRjQgKi8KLQlvdXRiKDB4MDcsMHgzNzApOwotCW91dGIoMHgwOCwweDM3MSk7Ci0Jb3V0YigweEY0LDB4MzcwKTsKLQluZXdfc3RhdHVzID0gaW5iKDB4MzcxKTsKKwlvdXRiX3AoREVWSUNFX1JFR0lTVEVSLCBJT19JTkRFWF9QT1JUKTsKKwlvdXRiX3AoMHgwOCwgSU9fREFUQV9QT1JUKTsKKwlvdXRiX3AoMHhGNCwgSU9fSU5ERVhfUE9SVCk7CisJbmV3X3N0YXR1cyA9IGluYl9wKElPX0RBVEFfUE9SVCk7CiAKIAkvKiBsb2NrIHRoZSBTdXBlcklPIGNoaXAgKi8KLQlvdXRiKDB4QUEsMHgzNzApOworCW91dGJfcChMT0NLX0RBVEEsIElPX0lOREVYX1BPUlQpOwogCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BpbmxvY2ssIGZsYWdzKTsKKworCSpzdGF0dXM9MDsKIAlpZiAobmV3X3N0YXR1cyAmIDEpCiAJCSpzdGF0dXMgfD0gV0RJT0ZfQ0FSRFJFU0VUOwogCkBAIC0yNDksOCArMjgwLDggQEAKIAkJd2R0OTc3X3N0b3AoKTsKIAkJY2xlYXJfYml0KDAsJnRpbWVyX2FsaXZlKTsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CiAJCXdkdDk3N19rZWVwYWxpdmUoKTsKKwkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIlVuZXhwZWN0ZWQgY2xvc2UsIG5vdCBzdG9wcGluZyB3YXRjaGRvZyFcbiIpOwogCX0KIAlleHBlY3RfY2xvc2UgPSAwOwogCXJldHVybiAwOwpAQCAtMjcxLDE0ICszMDIsMTcgQEAKIHN0YXRpYyBzc2l6ZV90IHdkdDk3N193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlpZiAoY291bnQpIHsKLQkJaWYgKCFub3dheW91dCkgeworCWlmIChjb3VudCkKKwl7CisJCWlmICghbm93YXlvdXQpCisJCXsKIAkJCXNpemVfdCBpOwogCiAJCQkvKiBJbiBjYXNlIGl0IHdhcyBzZXQgbG9uZyBhZ28gKi8KIAkJCWV4cGVjdF9jbG9zZSA9IDA7CiAKLQkJCWZvciAoaSA9IDA7IGkgIT0gY291bnQ7IGkrKykgeworCQkJZm9yIChpID0gMDsgaSAhPSBjb3VudDsgaSsrKQorCQkJewogCQkJCWNoYXIgYzsKIAkJCQlpZiAoZ2V0X3VzZXIoYywgYnVmICsgaSkpCiAJCQkJCXJldHVybiAtRUZBVUxUOwpAQCAtMjg3LDYgKzMyMSw3IEBACiAJCQl9CiAJCX0KIAorCQkvKiBzb21lb25lIHdyb3RlIHRvIHVzLCB3ZSBzaG91bGQgcmVzdGFydCB0aW1lciAqLwogCQl3ZHQ5Nzdfa2VlcGFsaXZlKCk7CiAJfQogCXJldHVybiBjb3VudDsKQEAgLTMwOCw3ICszNDMsNyBAQAogCQkJCVdESU9GX01BR0lDQ0xPU0UgfAogCQkJCVdESU9GX0tFRVBBTElWRVBJTkcsCiAJLmZpcm13YXJlX3ZlcnNpb24gPQkxLAotCS5pZGVudGl0eSA9CQkiV2luYm9uZCA4Mzk3NyIsCisJLmlkZW50aXR5ID0JCVdBVENIRE9HX05BTUUsCiB9OwogCiBzdGF0aWMgaW50IHdkdDk3N19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKQEAgLTQwNSw1MCArNDQwLDgxIEBACiAJLm5vdGlmaWVyX2NhbGwgPSB3ZHQ5Nzdfbm90aWZ5X3N5cywKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IG53d2F0Y2hkb2dfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgd2Q5NzdfaW5pdCh2b2lkKQogewotCWludCByZXR2YWw7Ci0JaWYgKCFtYWNoaW5lX2lzX25ldHdpbmRlcigpKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlpbnQgcmM7CisKKwkvL2lmICghbWFjaGluZV9pc19uZXR3aW5kZXIoKSkKKwkvLwlyZXR1cm4gLUVOT0RFVjsKKworCXByaW50ayhLRVJOX0lORk8gUEZYIERSSVZFUl9WRVJTSU9OKTsKKworCXNwaW5fbG9ja19pbml0KCZzcGlubG9jayk7CiAKIAkvKiBDaGVjayB0aGF0IHRoZSB0aW1lb3V0IHZhbHVlIGlzIHdpdGhpbiBpdCdzIHJhbmdlIDsgaWYgbm90IHJlc2V0IHRvIHRoZSBkZWZhdWx0ICovCi0JaWYgKHdkdDk3N19zZXRfdGltZW91dCh0aW1lb3V0KSkgeworCWlmICh3ZHQ5Nzdfc2V0X3RpbWVvdXQodGltZW91dCkpCisJewogCQl3ZHQ5Nzdfc2V0X3RpbWVvdXQoREVGQVVMVF9USU1FT1VUKTsKIAkJcHJpbnRrKEtFUk5fSU5GTyBQRlggInRpbWVvdXQgdmFsdWUgbXVzdCBiZSA2MDx0aW1lb3V0PDE1MzAwLCB1c2luZyAlZFxuIiwKIAkJCURFRkFVTFRfVElNRU9VVCk7CiAJfQogCi0JcmV0dmFsID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHQ5Nzdfbm90aWZpZXIpOwotCWlmIChyZXR2YWwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwKLQkJCXJldHZhbCk7Ci0JCXJldHVybiByZXR2YWw7CisJLyogb24gTmV0d2luZGVyIHRoZSBJT3BvcnRzIGFyZSBhbHJlYWR5IHJlc2VydmVkIGJ5CisJICogYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL25ldHdpbmRlci1ody5jCisJICovCisJaWYgKCFtYWNoaW5lX2lzX25ldHdpbmRlcigpKQorCXsKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihJT19JTkRFWF9QT1JULCAyLCBXQVRDSERPR19OQU1FKSkKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSS9PIGFkZHJlc3MgMHglMDR4IGFscmVhZHkgaW4gdXNlXG4iLAorCQkJCUlPX0lOREVYX1BPUlQpOworCQkJcmMgPSAtRUlPOworCQkJZ290byBlcnJfb3V0OworCQl9CiAJfQogCi0JcmV0dmFsID0gbWlzY19yZWdpc3Rlcigmd2R0OTc3X21pc2NkZXYpOwotCWlmIChyZXR2YWwpIHsKKwlyYyA9IG1pc2NfcmVnaXN0ZXIoJndkdDk3N19taXNjZGV2KTsKKwlpZiAocmMpCisJewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKLQkJCVdBVENIRE9HX01JTk9SLCByZXR2YWwpOwotCQl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0OTc3X25vdGlmaWVyKTsKLQkJcmV0dXJuIHJldHZhbDsKKwkJCXdkdDk3N19taXNjZGV2Lm1pbm9yLCByYyk7CisJCWdvdG8gZXJyX291dF9yZWdpb247CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyBQRlggImluaXRpYWxpemVkLiB0aW1lb3V0PSVkIHNlYyAobm93YXlvdXQ9JWQsIHRlc3Rtb2RlID0gJWkpXG4iLAorCXJjID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHQ5Nzdfbm90aWZpZXIpOworCWlmIChyYykKKwl7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgKGVycj0lZClcbiIsCisJCQlyYyk7CisJCWdvdG8gZXJyX291dF9taXNjZGV2OworCX0KKworCXByaW50ayhLRVJOX0lORk8gUEZYICJpbml0aWFsaXplZC4gdGltZW91dD0lZCBzZWMgKG5vd2F5b3V0PSVkLCB0ZXN0bW9kZT0laSlcbiIsCiAJCXRpbWVvdXQsIG5vd2F5b3V0LCB0ZXN0bW9kZSk7CiAKIAlyZXR1cm4gMDsKKworZXJyX291dF9taXNjZGV2OgorICAgICAgICBtaXNjX2RlcmVnaXN0ZXIoJndkdDk3N19taXNjZGV2KTsKK2Vycl9vdXRfcmVnaW9uOgorCWlmICghbWFjaGluZV9pc19uZXR3aW5kZXIoKSkKKwkgICAgICAgIHJlbGVhc2VfcmVnaW9uKElPX0lOREVYX1BPUlQsMik7CitlcnJfb3V0OgorCXJldHVybiByYzsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IG53d2F0Y2hkb2dfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHdkOTc3X2V4aXQodm9pZCkKIHsKKwl3ZHQ5Nzdfc3RvcCgpOwogCW1pc2NfZGVyZWdpc3Rlcigmd2R0OTc3X21pc2NkZXYpOwogCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHQ5Nzdfbm90aWZpZXIpOworCXJlbGVhc2VfcmVnaW9uKElPX0lOREVYX1BPUlQsMik7CiB9CiAKLW1vZHVsZV9pbml0KG53d2F0Y2hkb2dfaW5pdCk7Ci1tb2R1bGVfZXhpdChud3dhdGNoZG9nX2V4aXQpOworbW9kdWxlX2luaXQod2Q5NzdfaW5pdCk7Cittb2R1bGVfZXhpdCh3ZDk3N19leGl0KTsKIAotTU9EVUxFX0FVVEhPUigiV29vZHkgU3V3YWxza2kgPHdvb2R5QG5ldHdpbmRlci5vcmc+Iik7CitNT0RVTEVfQVVUSE9SKCJXb29keSBTdXdhbHNraSA8d29vZHlzQHhhbmRyb3MuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJXODM5NzdBRiBXYXRjaGRvZyBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29ubmVjdG9yL2NuX3Byb2MuYyBiL2RyaXZlcnMvY29ubmVjdG9yL2NuX3Byb2MuYwppbmRleCA5NjlkMmI0YS4uNGI0ZDdkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jb25uZWN0b3IvY25fcHJvYy5jCisrKyBiL2RyaXZlcnMvY29ubmVjdG9yL2NuX3Byb2MuYwpAQCAtMjQsNiArMjQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCkBAIC0zNCwxNCArMzUsMTQgQEAKIHN0YXRpYyBhdG9taWNfdCBwcm9jX2V2ZW50X251bV9saXN0ZW5lcnMgPSBBVE9NSUNfSU5JVCgwKTsKIHN0YXRpYyBzdHJ1Y3QgY2JfaWQgY25fcHJvY19ldmVudF9pZCA9IHsgQ05fSURYX1BST0MsIENOX1ZBTF9QUk9DIH07CiAKLS8qIHByb2NfY291bnRzIGlzIHVzZWQgYXMgdGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgbmV0bGluayBtZXNzYWdlICovCisvKiBwcm9jX2V2ZW50X2NvdW50cyBpcyB1c2VkIGFzIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIG5ldGxpbmsgbWVzc2FnZSAqLwogc3RhdGljIERFRklORV9QRVJfQ1BVKF9fdTMyLCBwcm9jX2V2ZW50X2NvdW50cykgPSB7IDAgfTsKIAogc3RhdGljIGlubGluZSB2b2lkIGdldF9zZXEoX191MzIgKnRzLCBpbnQgKmNwdSkKIHsKIAkqdHMgPSBnZXRfY3B1X3Zhcihwcm9jX2V2ZW50X2NvdW50cykrKzsKIAkqY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXB1dF9jcHVfdmFyKHByb2NfY291bnRzKTsKKwlwdXRfY3B1X3Zhcihwcm9jX2V2ZW50X2NvdW50cyk7CiB9CiAKIHZvaWQgcHJvY19mb3JrX2Nvbm5lY3RvcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCkBAIC01Niw3ICs1Nyw3IEBACiAJbXNnID0gKHN0cnVjdCBjbl9tc2cqKWJ1ZmZlcjsKIAlldiA9IChzdHJ1Y3QgcHJvY19ldmVudCopbXNnLT5kYXRhOwogCWdldF9zZXEoJm1zZy0+c2VxLCAmZXYtPmNwdSk7Ci0JZ2V0bnN0aW1lc3RhbXAoJmV2LT50aW1lc3RhbXApOworCWt0aW1lX2dldF90cygmZXYtPnRpbWVzdGFtcCk7IC8qIGdldCBoaWdoIHJlcyBtb25vdG9uaWMgdGltZXN0YW1wICovCiAJZXYtPndoYXQgPSBQUk9DX0VWRU5UX0ZPUks7CiAJZXYtPmV2ZW50X2RhdGEuZm9yay5wYXJlbnRfcGlkID0gdGFzay0+cmVhbF9wYXJlbnQtPnBpZDsKIAlldi0+ZXZlbnRfZGF0YS5mb3JrLnBhcmVudF90Z2lkID0gdGFzay0+cmVhbF9wYXJlbnQtPnRnaWQ7CkBAIC04Miw3ICs4Myw3IEBACiAJbXNnID0gKHN0cnVjdCBjbl9tc2cqKWJ1ZmZlcjsKIAlldiA9IChzdHJ1Y3QgcHJvY19ldmVudCopbXNnLT5kYXRhOwogCWdldF9zZXEoJm1zZy0+c2VxLCAmZXYtPmNwdSk7Ci0JZ2V0bnN0aW1lc3RhbXAoJmV2LT50aW1lc3RhbXApOworCWt0aW1lX2dldF90cygmZXYtPnRpbWVzdGFtcCk7CiAJZXYtPndoYXQgPSBQUk9DX0VWRU5UX0VYRUM7CiAJZXYtPmV2ZW50X2RhdGEuZXhlYy5wcm9jZXNzX3BpZCA9IHRhc2stPnBpZDsKIAlldi0+ZXZlbnRfZGF0YS5leGVjLnByb2Nlc3NfdGdpZCA9IHRhc2stPnRnaWQ7CkBAIC0xMTYsNyArMTE3LDcgQEAKIAl9IGVsc2UKIAkgICAgIAlyZXR1cm47CiAJZ2V0X3NlcSgmbXNnLT5zZXEsICZldi0+Y3B1KTsKLQlnZXRuc3RpbWVzdGFtcCgmZXYtPnRpbWVzdGFtcCk7CisJa3RpbWVfZ2V0X3RzKCZldi0+dGltZXN0YW1wKTsKIAogCW1lbWNweSgmbXNnLT5pZCwgJmNuX3Byb2NfZXZlbnRfaWQsIHNpemVvZihtc2ctPmlkKSk7CiAJbXNnLT5hY2sgPSAwOyAvKiBub3QgdXNlZCAqLwpAQCAtMTM2LDcgKzEzNyw3IEBACiAJbXNnID0gKHN0cnVjdCBjbl9tc2cqKWJ1ZmZlcjsKIAlldiA9IChzdHJ1Y3QgcHJvY19ldmVudCopbXNnLT5kYXRhOwogCWdldF9zZXEoJm1zZy0+c2VxLCAmZXYtPmNwdSk7Ci0JZ2V0bnN0aW1lc3RhbXAoJmV2LT50aW1lc3RhbXApOworCWt0aW1lX2dldF90cygmZXYtPnRpbWVzdGFtcCk7CiAJZXYtPndoYXQgPSBQUk9DX0VWRU5UX0VYSVQ7CiAJZXYtPmV2ZW50X2RhdGEuZXhpdC5wcm9jZXNzX3BpZCA9IHRhc2stPnBpZDsKIAlldi0+ZXZlbnRfZGF0YS5leGl0LnByb2Nlc3NfdGdpZCA9IHRhc2stPnRnaWQ7CkBAIC0xNjksNyArMTcwLDcgQEAKIAltc2cgPSAoc3RydWN0IGNuX21zZyopYnVmZmVyOwogCWV2ID0gKHN0cnVjdCBwcm9jX2V2ZW50Kiltc2ctPmRhdGE7CiAJbXNnLT5zZXEgPSByY3ZkX3NlcTsKLQlnZXRuc3RpbWVzdGFtcCgmZXYtPnRpbWVzdGFtcCk7CisJa3RpbWVfZ2V0X3RzKCZldi0+dGltZXN0YW1wKTsKIAlldi0+Y3B1ID0gLTE7CiAJZXYtPndoYXQgPSBQUk9DX0VWRU5UX05PTkU7CiAJZXYtPmV2ZW50X2RhdGEuYWNrLmVyciA9IGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCmluZGV4IGE5MTYzZDAuLjI3N2E4NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYwpAQCAtNDEsNyArNDEsNiBAQAogLyogaW50ZXJuYWwgcHJvdG90eXBlcyAqLwogc3RhdGljIGludCBfX2NwdWZyZXFfZ292ZXJub3Ioc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIHVuc2lnbmVkIGludCBldmVudCk7CiBzdGF0aWMgdm9pZCBoYW5kbGVfdXBkYXRlKHZvaWQgKmRhdGEpOwotc3RhdGljIGlubGluZSB2b2lkIGFkanVzdF9qaWZmaWVzKHVuc2lnbmVkIGxvbmcgdmFsLCBzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyAqY2kpOwogCiAvKioKICAqIFR3byBub3RpZmllciBsaXN0czogdGhlICJwb2xpY3kiIGxpc3QgaXMgaW52b2x2ZWQgaW4gdGhlIApAQCAtMTI3LDcgKzEyNiw3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IGRpc2FibGVfcmF0ZWxpbWl0ID0gMTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZGlzYWJsZV9yYXRlbGltaXRfbG9jayk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjcHVmcmVxX2RlYnVnX2VuYWJsZV9yYXRlbGltaXQodm9pZCkKK3N0YXRpYyB2b2lkIGNwdWZyZXFfZGVidWdfZW5hYmxlX3JhdGVsaW1pdCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTEzNyw3ICsxMzYsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpc2FibGVfcmF0ZWxpbWl0X2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNwdWZyZXFfZGVidWdfZGlzYWJsZV9yYXRlbGltaXQodm9pZCkKK3N0YXRpYyB2b2lkIGNwdWZyZXFfZGVidWdfZGlzYWJsZV9yYXRlbGltaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0yMDYsNyArMjA1LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxfcF9qX3JlZjsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgIGxfcF9qX3JlZl9mcmVxOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgYWRqdXN0X2ppZmZpZXModW5zaWduZWQgbG9uZyB2YWwsIHN0cnVjdCBjcHVmcmVxX2ZyZXFzICpjaSkKK3N0YXRpYyB2b2lkIGFkanVzdF9qaWZmaWVzKHVuc2lnbmVkIGxvbmcgdmFsLCBzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyAqY2kpCiB7CiAJaWYgKGNpLT5mbGFncyAmIENQVUZSRVFfQ09OU1RfTE9PUFMpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2stYWVzLmMgYi9kcml2ZXJzL2NyeXB0by9wYWRsb2NrLWFlcy5jCmluZGV4IDcxNDA3YzUuLjY0ODE5YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2stYWVzLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vcGFkbG9jay1hZXMuYwpAQCAtOTksOSArOTksNiBAQAogCXJldHVybiB4ID4+IChuIDw8IDMpOwogfQogCi0jZGVmaW5lIHVpbnQzMl90X2luKHgpIGxlMzJfdG9fY3B1KCooY29uc3QgdWludDMyX3QgKikoeCkpCi0jZGVmaW5lIHVpbnQzMl90X291dCh0bywgZnJvbSkgKCoodWludDMyX3QgKikodG8pID0gY3B1X3RvX2xlMzIoZnJvbSkpCi0KICNkZWZpbmUgRV9LRVkgY3R4LT5FCiAjZGVmaW5lIERfS0VZIGN0eC0+RAogCkBAIC0yOTQsNiArMjkxLDcgQEAKIGFlc19zZXRfa2V5KHZvaWQgKmN0eF9hcmcsIGNvbnN0IHVpbnQ4X3QgKmluX2tleSwgdW5zaWduZWQgaW50IGtleV9sZW4sIHVpbnQzMl90ICpmbGFncykKIHsKIAlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gYWVzX2N0eChjdHhfYXJnKTsKKwljb25zdCBfX2xlMzIgKmtleSA9IChjb25zdCBfX2xlMzIgKilpbl9rZXk7CiAJdWludDMyX3QgaSwgdCwgdSwgdiwgdzsKIAl1aW50MzJfdCBQW0FFU19FWFRFTkRFRF9LRVlfU0laRV07CiAJdWludDMyX3Qgcm91bmRzOwpAQCAtMzEzLDEwICszMTEsMTAgQEAKIAljdHgtPkUgPSBjdHgtPmVfZGF0YTsKIAljdHgtPkQgPSBjdHgtPmVfZGF0YTsKIAotCUVfS0VZWzBdID0gdWludDMyX3RfaW4gKGluX2tleSk7Ci0JRV9LRVlbMV0gPSB1aW50MzJfdF9pbiAoaW5fa2V5ICsgNCk7Ci0JRV9LRVlbMl0gPSB1aW50MzJfdF9pbiAoaW5fa2V5ICsgOCk7Ci0JRV9LRVlbM10gPSB1aW50MzJfdF9pbiAoaW5fa2V5ICsgMTIpOworCUVfS0VZWzBdID0gbGUzMl90b19jcHUoa2V5WzBdKTsKKwlFX0tFWVsxXSA9IGxlMzJfdG9fY3B1KGtleVsxXSk7CisJRV9LRVlbMl0gPSBsZTMyX3RvX2NwdShrZXlbMl0pOworCUVfS0VZWzNdID0gbGUzMl90b19jcHUoa2V5WzNdKTsKIAogCS8qIFByZXBhcmUgY29udHJvbCB3b3Jkcy4gKi8KIAltZW1zZXQoJmN0eC0+Y3dvcmQsIDAsIHNpemVvZihjdHgtPmN3b3JkKSk7CkBAIC0zNDMsMTcgKzM0MSwxNyBAQAogCQlicmVhazsKIAogCWNhc2UgMjQ6Ci0JCUVfS0VZWzRdID0gdWludDMyX3RfaW4gKGluX2tleSArIDE2KTsKLQkJdCA9IEVfS0VZWzVdID0gdWludDMyX3RfaW4gKGluX2tleSArIDIwKTsKKwkJRV9LRVlbNF0gPSBsZTMyX3RvX2NwdShrZXlbNF0pOworCQl0ID0gRV9LRVlbNV0gPSBsZTMyX3RvX2NwdShrZXlbNV0pOwogCQlmb3IgKGkgPSAwOyBpIDwgODsgKytpKQogCQkJbG9vcDYgKGkpOwogCQlicmVhazsKIAogCWNhc2UgMzI6Ci0JCUVfS0VZWzRdID0gdWludDMyX3RfaW4gKGluX2tleSArIDE2KTsKLQkJRV9LRVlbNV0gPSB1aW50MzJfdF9pbiAoaW5fa2V5ICsgMjApOwotCQlFX0tFWVs2XSA9IHVpbnQzMl90X2luIChpbl9rZXkgKyAyNCk7Ci0JCXQgPSBFX0tFWVs3XSA9IHVpbnQzMl90X2luIChpbl9rZXkgKyAyOCk7CisJCUVfS0VZWzRdID0gbGUzMl90b19jcHUoaW5fa2V5WzRdKTsKKwkJRV9LRVlbNV0gPSBsZTMyX3RvX2NwdShpbl9rZXlbNV0pOworCQlFX0tFWVs2XSA9IGxlMzJfdG9fY3B1KGluX2tleVs2XSk7CisJCXQgPSBFX0tFWVs3XSA9IGxlMzJfdG9fY3B1KGluX2tleVs3XSk7CiAJCWZvciAoaSA9IDA7IGkgPCA3OyArK2kpCiAJCQlsb29wOCAoaSk7CiAJCWJyZWFrOwpAQCAtNDY4LDYgKzQ2Niw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBhZXNfYWxnID0gewogCS5jcmFfbmFtZQkJPQkiYWVzIiwKKwkuY3JhX2RyaXZlcl9uYW1lCT0JImFlcy1wYWRsb2NrIiwKKwkuY3JhX3ByaW9yaXR5CQk9CTMwMCwKIAkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIsCiAJLmNyYV9ibG9ja3NpemUJCT0JQUVTX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgYWVzX2N0eCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9wYWRsb2NrLmggYi9kcml2ZXJzL2NyeXB0by9wYWRsb2NrLmgKaW5kZXggM2NmMmI3YS4uYjc4NDg5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vcGFkbG9jay5oCisrKyBiL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2suaApAQCAtMTcsNyArMTcsNyBAQAogCiAvKiBDb250cm9sIHdvcmQuICovCiBzdHJ1Y3QgY3dvcmQgewotCWludCBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCisJdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKIAkJcm91bmRzOjQsCiAJCWFsZ286MywKIAkJa2V5Z2VuOjEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Rpby9kaW8tZHJpdmVyLmMgYi9kcml2ZXJzL2Rpby9kaW8tZHJpdmVyLmMKaW5kZXggZmZlNmY0NC4uY2E4ZTY5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kaW8vZGlvLWRyaXZlci5jCisrKyBiL2RyaXZlcnMvZGlvL2Rpby1kcml2ZXIuYwpAQCAtODMsNyArODMsNiBAQAogCS8qIGluaXRpYWxpemUgY29tbW9uIGRyaXZlciBmaWVsZHMgKi8KIAlkcnYtPmRyaXZlci5uYW1lID0gZHJ2LT5uYW1lOwogCWRydi0+ZHJpdmVyLmJ1cyA9ICZkaW9fYnVzX3R5cGU7Ci0JZHJ2LT5kcml2ZXIucHJvYmUgPSBkaW9fZGV2aWNlX3Byb2JlOwogCiAJLyogcmVnaXN0ZXIgd2l0aCBjb3JlICovCiAJY291bnQgPSBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKQEAgLTE0NSw3ICsxNDQsOCBAQAogCiBzdHJ1Y3QgYnVzX3R5cGUgZGlvX2J1c190eXBlID0gewogCS5uYW1lCT0gImRpbyIsCi0JLm1hdGNoCT0gZGlvX2J1c19tYXRjaAorCS5tYXRjaAk9IGRpb19idXNfbWF0Y2gsCisJLnByb2JlCT0gZGlvX2RldmljZV9wcm9iZSwKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL0tjb25maWcgYi9kcml2ZXJzL2VkYWMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODE5ZTdmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9lZGFjL0tjb25maWcKQEAgLTAsMCArMSwxMDIgQEAKKyMKKyMJRURBQyBLY29uZmlnCisjCUNvcHlyaWdodCAoYykgMjAwMyBMaW51eCBOZXR3b3J4CisjCUxpY2Vuc2VkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgR1BMCisjCisjICRJZDogS2NvbmZpZyx2IDEuNC4yLjcgMjAwNS8wNy8wOCAyMjowNTozOCBkc3BfbGxubCBFeHAgJAorIworCittZW51ICdFREFDIC0gZXJyb3IgZGV0ZWN0aW9uIGFuZCByZXBvcnRpbmcgKFJBUyknCisKK2NvbmZpZyBFREFDCisJdHJpc3RhdGUgIkVEQUMgY29yZSBzeXN0ZW0gZXJyb3IgcmVwb3J0aW5nIgorCWRlcGVuZHMgb24gWDg2CisJZGVmYXVsdCB5CisJaGVscAorCSAgRURBQyBpcyBkZXNpZ25lZCB0byByZXBvcnQgZXJyb3JzIGluIHRoZSBjb3JlIHN5c3RlbS4KKwkgIFRoZXNlIGFyZSBsb3ctbGV2ZWwgZXJyb3JzIHRoYXQgYXJlIHJlcG9ydGVkIGluIHRoZSBDUFUgb3IKKwkgIHN1cHBvcnRpbmcgY2hpcHNldDogbWVtb3J5IGVycm9ycywgY2FjaGUgZXJyb3JzLCBQQ0kgZXJyb3JzLAorCSAgdGhlcm1hbCB0aHJvdHRsaW5nLCBldGMuLiAgSWYgdW5zdXJlLCBzZWxlY3QgJ1knLgorCisKK2NvbW1lbnQgIlJlcG9ydGluZyBzdWJzeXN0ZW1zIgorCWRlcGVuZHMgb24gRURBQworCitjb25maWcgRURBQ19ERUJVRworCWJvb2wgIkRlYnVnZ2luZyIKKwlkZXBlbmRzIG9uIEVEQUMKKwloZWxwCisJICBUaGlzIHR1cm5zIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGVudGlyZSBFREFDCisJICBzdWItc3lzdGVtLiBZb3UgY2FuIGluc2VydCBtb2R1bGUgd2l0aCAiZGVidWdfbGV2ZWw9eCIsIGN1cnJlbnQKKwkgIHRoZXJlJ3JlIGZvdXIgZGVidWcgbGV2ZWxzICh4PTAsMSwyLDMgZnJvbSBsb3cgdG8gaGlnaCkuCisJICBVc3VhbGx5IHlvdSBzaG91bGQgc2VsZWN0ICdOJy4KKworY29uZmlnIEVEQUNfTU1fRURBQworCXRyaXN0YXRlICJNYWluIE1lbW9yeSBFREFDIChFcnJvciBEZXRlY3Rpb24gQW5kIENvcnJlY3Rpb24pIHJlcG9ydGluZyIKKwlkZXBlbmRzIG9uIEVEQUMKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTb21lIHN5c3RlbXMgYXJlIGFibGUgdG8gZGV0ZWN0IGFuZCBjb3JyZWN0IGVycm9ycyBpbiBtYWluCisJICBtZW1vcnkuICBFREFDIGNhbiByZXBvcnQgc3RhdGlzdGljcyBvbiBtZW1vcnkgZXJyb3IKKwkgIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiAoRURBQyAtIG9yIGNvbW1vbmx5IHJlZmVycmVkIHRvIEVDQworCSAgZXJyb3JzKS4gIEVEQUMgd2lsbCBhbHNvIHRyeSB0byBkZWNvZGUgd2hlcmUgdGhlc2UgZXJyb3JzCisJICBvY2N1cnJlZCBzbyB0aGF0IGEgcGFydGljdWxhciBmYWlsaW5nIG1lbW9yeSBtb2R1bGUgY2FuIGJlCisJICByZXBsYWNlZC4gIElmIHVuc3VyZSwgc2VsZWN0ICdZJy4KKworCitjb25maWcgRURBQ19BTUQ3NlgKKwl0cmlzdGF0ZSAiQU1EIDc2eCAoNzYwLCA3NjIsIDc2OCkiCisJZGVwZW5kcyBvbiBFREFDX01NX0VEQUMgICYmIFBDSQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiBvbiB0aGUgQU1EIDc2eAorCSAgc2VyaWVzIG9mIGNoaXBzZXRzIHVzZWQgd2l0aCB0aGUgQXRobG9uIHByb2Nlc3Nvci4KKworY29uZmlnIEVEQUNfRTdYWFgKKwl0cmlzdGF0ZSAiSW50ZWwgZTd4eHggKGU3MjA1LCBlNzUwMCwgZTc1MDEsIGU3NTA1KSIKKwlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBQQ0kKKwloZWxwCisJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gdGhlIEludGVsCisJICBFNzIwNSwgRTc1MDAsIEU3NTAxIGFuZCBFNzUwNSBzZXJ2ZXIgY2hpcHNldHMuCisKK2NvbmZpZyBFREFDX0U3NTJYCisJdHJpc3RhdGUgIkludGVsIGU3NTJ4IChlNzUyMCwgZTc1MjUsIGU3MzIwKSIKKwlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBQQ0kKKwloZWxwCisJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gdGhlIEludGVsCisJICBFNzUyMCwgRTc1MjUsIEU3MzIwIHNlcnZlciBjaGlwc2V0cy4KKworY29uZmlnIEVEQUNfSTgyODc1UAorCXRyaXN0YXRlICJJbnRlbCA4Mjg3NXAgKEQ4Mjg3NVAsIEU3MjEwKSIKKwlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBQQ0kKKwloZWxwCisJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gdGhlIEludGVsCisJICBEUDgyNzg1UCBhbmQgRTcyMTAgc2VydmVyIGNoaXBzZXRzLgorCitjb25maWcgRURBQ19JODI4NjAKKwl0cmlzdGF0ZSAiSW50ZWwgODI4NjAiCisJZGVwZW5kcyBvbiBFREFDX01NX0VEQUMgJiYgUENJCisJaGVscAorCSAgU3VwcG9ydCBmb3IgZXJyb3IgZGV0ZWN0aW9uIGFuZCBjb3JyZWN0aW9uIG9uIHRoZSBJbnRlbAorCSAgODI4NjAgY2hpcHNldC4KKworY29uZmlnIEVEQUNfUjgyNjAwCisJdHJpc3RhdGUgIlJhZGlzeXMgODI2MDAgZW1iZWRkZWQgY2hpcHNldCIKKwlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQworCWhlbHAKKwkgIFN1cHBvcnQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiBvbiB0aGUgUmFkaXN5cworCSAgODI2MDAgZW1iZWRkZWQgY2hpcHNldC4KKworY2hvaWNlCisJcHJvbXB0ICJFcnJvciBkZXRlY3RpbmcgbWV0aG9kIgorCWRlcGVuZHMgb24gRURBQworCWRlZmF1bHQgRURBQ19QT0xMCisKK2NvbmZpZyBFREFDX1BPTEwKKwlib29sICJQb2xsIGZvciBlcnJvcnMiCisJZGVwZW5kcyBvbiBFREFDCisJaGVscAorCSAgUG9sbCB0aGUgY2hpcHNldCBwZXJpb2RpY2FsbHkgdG8gZGV0ZWN0IGVycm9ycy4KKworZW5kY2hvaWNlCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9NYWtlZmlsZSBiL2RyaXZlcnMvZWRhYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzEzN2ZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9lZGFjL01ha2VmaWxlCkBAIC0wLDAgKzEsMTggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBrZXJuZWwgRURBQyBkcml2ZXJzLgorIworIyBDb3B5cmlnaHQgMDIgSnVsIDIwMDMsIExpbnV4IE5ldHdvcnggKGh0dHA6Ly9sbnhpLmNvbSkKKyMgVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorIworIyAkSWQ6IE1ha2VmaWxlLHYgMS40LjIuMyAyMDA1LzA3LzA4IDIyOjA1OjM4IGRzcF9sbG5sIEV4cCAkCisKKworb2JqLSQoQ09ORklHX0VEQUNfTU1fRURBQykJCSs9IGVkYWNfbWMubworb2JqLSQoQ09ORklHX0VEQUNfQU1ENzZYKQkJKz0gYW1kNzZ4X2VkYWMubworb2JqLSQoQ09ORklHX0VEQUNfRTdYWFgpCQkrPSBlN3h4eF9lZGFjLm8KK29iai0kKENPTkZJR19FREFDX0U3NTJYKQkJKz0gZTc1MnhfZWRhYy5vCitvYmotJChDT05GSUdfRURBQ19JODI4NzVQKQkJKz0gaTgyODc1cF9lZGFjLm8KK29iai0kKENPTkZJR19FREFDX0k4Mjg2MCkJCSs9IGk4Mjg2MF9lZGFjLm8KK29iai0kKENPTkZJR19FREFDX1I4MjYwMCkJCSs9IHI4MjYwMF9lZGFjLm8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2FtZDc2eF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvYW1kNzZ4X2VkYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmNjODEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9lZGFjL2FtZDc2eF9lZGFjLmMKQEAgLTAsMCArMSwzNTYgQEAKKy8qCisgKiBBTUQgNzZ4IE1lbW9yeSBDb250cm9sbGVyIGtlcm5lbCBtb2R1bGUKKyAqIChDKSAyMDAzIExpbnV4IE5ldHdvcnggKGh0dHA6Ly9sbnhpLmNvbSkKKyAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogV3JpdHRlbiBieSBUaGF5bmUgSGFyYmF1Z2gKKyAqIEJhc2VkIG9uIHdvcmsgYnkgRGFuIEhvbGxpcyA8Z29lbW9uIGF0IGFuaW1lIGRvdCBuZXQ+IGFuZCBvdGhlcnMuCisgKglodHRwOi8vd3d3LmFuaW1lLm5ldC9+Z29lbW9uL2xpbnV4LWVjYy8KKyAqCisgKiAkSWQ6IGVkYWNfYW1kNzZ4LmMsdiAxLjQuMi41IDIwMDUvMTAvMDUgMDA6NDM6NDQgZHNwX2xsbmwgRXhwICQKKyAqCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAiZWRhY19tYy5oIgorCisKKyNkZWZpbmUgQU1ENzZYX05SX0NTUk9XUyA4CisjZGVmaW5lIEFNRDc2WF9OUl9DSEFOUyAgMQorI2RlZmluZSBBTUQ3NlhfTlJfRElNTVMgIDQKKworCisvKiBBTUQgNzZ4IHJlZ2lzdGVyIGFkZHJlc3NlcyAtIGRldmljZSAwIGZ1bmN0aW9uIDAgLSBQQ0kgYnJpZGdlICovCisjZGVmaW5lIEFNRDc2WF9FQ0NfTU9ERV9TVEFUVVMJMHg0OAkvKiBNb2RlIGFuZCBzdGF0dXMgb2YgRUNDICgzMmIpCisJCQkJCSAqCisJCQkJCSAqIDMxOjE2IHJlc2VydmVkCisJCQkJCSAqIDE1OjE0IFNFUlIgZW5hYmxlZDogeDE9dWUgMXg9Y2UKKwkJCQkJICogMTMgICAgcmVzZXJ2ZWQKKwkJCQkJICogMTIgICAgZGlhZzogZGlzYWJsZWQsIGVuYWJsZWQKKwkJCQkJICogMTE6MTAgbW9kZTogZGlzLCBFQywgRUNDLCBFQ0Mrc2NydWIKKwkJCQkJICogIDk6OCAgc3RhdHVzOiB4MT11ZSAxeD1jZQorCQkJCQkgKiAgNzo0ICBVRSBjcyByb3cKKwkJCQkJICogIDM6MCAgQ0UgY3Mgcm93CisJCQkJCSAqLworI2RlZmluZSBBTUQ3NlhfRFJBTV9NT0RFX1NUQVRVUwkweDU4CS8qIERSQU0gTW9kZSBhbmQgc3RhdHVzICgzMmIpCisJCQkJCSAqCisJCQkJCSAqIDMxOjI2IGNsb2NrIGRpc2FibGUgNSAtIDAKKwkJCQkJICogMjUgICAgU0RSQU0gaW5pdAorCQkJCQkgKiAyNCAgICByZXNlcnZlZAorCQkJCQkgKiAyMyAgICBtb2RlIHJlZ2lzdGVyIHNlcnZpY2UKKwkJCQkJICogMjI6MjEgc3VzcGVuZCB0byBSQU0KKwkJCQkJICogMjAgICAgYnVyc3QgcmVmcmVzaCBlbmFibGUKKwkJCQkJICogMTkgICAgcmVmcmVzaCBkaXNhYmxlCisJCQkJCSAqIDE4ICAgIHJlc2VydmVkCisJCQkJCSAqIDE3OjE2IGN5Y2xlcy1wZXItcmVmcmVzaAorCQkJCQkgKiAxNTo4ICByZXNlcnZlZAorCQkJCQkgKiAgNzowICB4NCBtb2RlIGVuYWJsZSA3IC0gMAorCQkJCQkgKi8KKyNkZWZpbmUgQU1ENzZYX01FTV9CQVNFX0FERFIJMHhDMAkvKiBNZW1vcnkgYmFzZSBhZGRyZXNzICg4IHggMzJiKQorCQkJCQkgKgorCQkJCQkgKiAzMToyMyBjaGlwLXNlbGVjdCBiYXNlCisJCQkJCSAqIDIyOjE2IHJlc2VydmVkCisJCQkJCSAqIDE1OjcgIGNoaXAtc2VsZWN0IG1hc2sKKwkJCQkJICogIDY6MyAgcmVzZXJ2ZWQKKwkJCQkJICogIDI6MSAgYWRkcmVzcyBtb2RlCisJCQkJCSAqICAwICAgIGNoaXAtc2VsZWN0IGVuYWJsZQorCQkJCQkgKi8KKworCitzdHJ1Y3QgYW1kNzZ4X2Vycm9yX2luZm8geworCXUzMiBlY2NfbW9kZV9zdGF0dXM7Cit9OworCisKK2VudW0gYW1kNzZ4X2NoaXBzIHsKKwlBTUQ3NjEgPSAwLAorCUFNRDc2MgorfTsKKworCitzdHJ1Y3QgYW1kNzZ4X2Rldl9pbmZvIHsKKwljb25zdCBjaGFyICpjdGxfbmFtZTsKK307CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhbWQ3NnhfZGV2X2luZm8gYW1kNzZ4X2RldnNbXSA9IHsKKwlbQU1ENzYxXSA9IHsuY3RsX25hbWUgPSAiQU1ENzYxIn0sCisJW0FNRDc2Ml0gPSB7LmN0bF9uYW1lID0gIkFNRDc2MiJ9LAorfTsKKworCisvKioKKyAqCWFtZDc2eF9nZXRfZXJyb3JfaW5mbwktCWZldGNoIGVycm9yIGluZm9ybWF0aW9uCisgKglAbWNpOiBNZW1vcnkgY29udHJvbGxlcgorICoJQGluZm86IEluZm8gdG8gZmlsbCBpbgorICoKKyAqCUZldGNoIGFuZCBzdG9yZSB0aGUgQU1ENzZ4IEVDQyBzdGF0dXMuIENsZWFyIHBlbmRpbmcgc3RhdHVzCisgKglvbiB0aGUgY2hpcCBzbyB0aGF0IGZ1cnRoZXIgZXJyb3JzIHdpbGwgYmUgcmVwb3J0ZWQKKyAqLworCitzdGF0aWMgdm9pZCBhbWQ3NnhfZ2V0X2Vycm9yX2luZm8gKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCQkgICBzdHJ1Y3QgYW1kNzZ4X2Vycm9yX2luZm8gKmluZm8pCit7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG1jaS0+cGRldiwgQU1ENzZYX0VDQ19NT0RFX1NUQVRVUywKKwkJCQkmaW5mby0+ZWNjX21vZGVfc3RhdHVzKTsKKworCWlmIChpbmZvLT5lY2NfbW9kZV9zdGF0dXMgJiBCSVQoOCkpCisJCXBjaV93cml0ZV9iaXRzMzIobWNpLT5wZGV2LCBBTUQ3NlhfRUNDX01PREVfU1RBVFVTLAorCQkJCSAgICh1MzIpIEJJVCg4KSwgKHUzMikgQklUKDgpKTsKKworCWlmIChpbmZvLT5lY2NfbW9kZV9zdGF0dXMgJiBCSVQoOSkpCisJCXBjaV93cml0ZV9iaXRzMzIobWNpLT5wZGV2LCBBTUQ3NlhfRUNDX01PREVfU1RBVFVTLAorCQkJCSAgICh1MzIpIEJJVCg5KSwgKHUzMikgQklUKDkpKTsKK30KKworCisvKioKKyAqCWFtZDc2eF9wcm9jZXNzX2Vycm9yX2luZm8JLQlFcnJvciBjaGVjaworICoJQG1jaTogTWVtb3J5IGNvbnRyb2xsZXIKKyAqCUBpbmZvOiBQcmV2aW91c2x5IGZldGNoZWQgaW5mb3JtYXRpb24gZnJvbSBjaGlwCisgKglAaGFuZGxlX2Vycm9yczogMSBpZiB3ZSBzaG91bGQgZG8gcmVjb3ZlcnkKKyAqCisgKglQcm9jZXNzIHRoZSBjaGlwIHN0YXRlIGFuZCBkZWNpZGUgaWYgYW4gZXJyb3IgaGFzIG9jY3VycmVkLgorICoJQSByZXR1cm4gb2YgMSBpbmRpY2F0ZXMgYW4gZXJyb3IuIEFsc28gaWYgaGFuZGxlX2Vycm9ycyBpcyB0cnVlCisgKgl0aGVuIGF0dGVtcHQgdG8gaGFuZGxlIGFuZCBjbGVhbiB1cCBhZnRlciB0aGUgZXJyb3IKKyAqLworCitzdGF0aWMgaW50IGFtZDc2eF9wcm9jZXNzX2Vycm9yX2luZm8gKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJc3RydWN0IGFtZDc2eF9lcnJvcl9pbmZvICppbmZvLCBpbnQgaGFuZGxlX2Vycm9ycykKK3sKKwlpbnQgZXJyb3JfZm91bmQ7CisJdTMyIHJvdzsKKworCWVycm9yX2ZvdW5kID0gMDsKKworCS8qCisJICoJQ2hlY2sgZm9yIGFuIHVuY29ycmVjdGFibGUgZXJyb3IKKwkgKi8KKwlpZiAoaW5mby0+ZWNjX21vZGVfc3RhdHVzICYgQklUKDgpKSB7CisJCWVycm9yX2ZvdW5kID0gMTsKKworCQlpZiAoaGFuZGxlX2Vycm9ycykgeworCQkJcm93ID0gKGluZm8tPmVjY19tb2RlX3N0YXR1cyA+PiA0KSAmIDB4ZjsKKwkJCWVkYWNfbWNfaGFuZGxlX3VlKG1jaSwKKwkJCSAgICBtY2ktPmNzcm93c1tyb3ddLmZpcnN0X3BhZ2UsIDAsIHJvdywKKwkJCSAgICBtY2ktPmN0bF9uYW1lKTsKKwkJfQorCX0KKworCS8qCisJICoJQ2hlY2sgZm9yIGEgY29ycmVjdGFibGUgZXJyb3IKKwkgKi8KKwlpZiAoaW5mby0+ZWNjX21vZGVfc3RhdHVzICYgQklUKDkpKSB7CisJCWVycm9yX2ZvdW5kID0gMTsKKworCQlpZiAoaGFuZGxlX2Vycm9ycykgeworCQkJcm93ID0gaW5mby0+ZWNjX21vZGVfc3RhdHVzICYgMHhmOworCQkJZWRhY19tY19oYW5kbGVfY2UobWNpLAorCQkJICAgIG1jaS0+Y3Nyb3dzW3Jvd10uZmlyc3RfcGFnZSwgMCwgMCwgcm93LCAwLAorCQkJICAgIG1jaS0+Y3RsX25hbWUpOworCQl9CisJfQorCXJldHVybiBlcnJvcl9mb3VuZDsKK30KKworLyoqCisgKglhbWQ3NnhfY2hlY2sJLQlQb2xsIHRoZSBjb250cm9sbGVyCisgKglAbWNpOiBNZW1vcnkgY29udHJvbGxlcgorICoKKyAqCUNhbGxlZCBieSB0aGUgcG9sbCBoYW5kbGVycyB0aGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBzdGF0dXMKKyAqCWZyb20gdGhlIGNvbnRyb2xsZXIgYW5kIGNoZWNrcyBmb3IgZXJyb3JzLgorICovCisKK3N0YXRpYyB2b2lkIGFtZDc2eF9jaGVjayhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJc3RydWN0IGFtZDc2eF9lcnJvcl9pbmZvIGluZm87CisJZGVidWdmMygiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCWFtZDc2eF9nZXRfZXJyb3JfaW5mbyhtY2ksICZpbmZvKTsKKwlhbWQ3NnhfcHJvY2Vzc19lcnJvcl9pbmZvKG1jaSwgJmluZm8sIDEpOworfQorCisKKy8qKgorICoJYW1kNzZ4X3Byb2JlMQktCVBlcmZvcm0gc2V0IHVwIGZvciBkZXRlY3RlZCBkZXZpY2UKKyAqCUBwZGV2OyBQQ0kgZGV2aWNlIGRldGVjdGVkCisgKglAZGV2X2lkeDogRGV2aWNlIHR5cGUgaW5kZXgKKyAqCisgKglXZSBoYXZlIGZvdW5kIGFuIEFNRDc2eCBhbmQgbm93IG5lZWQgdG8gc2V0IHVwIHRoZSBtZW1vcnkKKyAqCWNvbnRyb2xsZXIgc3RhdHVzIHJlcG9ydGluZy4gV2UgY29uZmlndXJlIGFuZCBzZXQgdXAgdGhlCisgKgltZW1vcnkgY29udHJvbGxlciByZXBvcnRpbmcgYW5kIGNsYWltIHRoZSBkZXZpY2UuCisgKi8KKworc3RhdGljIGludCBhbWQ3NnhfcHJvYmUxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgZGV2X2lkeCkKK3sKKwlpbnQgcmMgPSAtRU5PREVWOworCWludCBpbmRleDsKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kgPSBOVUxMOworCWVudW0gZWRhY190eXBlIGVtc19tb2Rlc1tdID0geworCQlFREFDX05PTkUsCisJCUVEQUNfRUMsCisJCUVEQUNfU0VDREVELAorCQlFREFDX1NFQ0RFRAorCX07CisJdTMyIGVtczsKKwl1MzIgZW1zX21vZGU7CisKKwlkZWJ1Z2YwKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgQU1ENzZYX0VDQ19NT0RFX1NUQVRVUywgJmVtcyk7CisJZW1zX21vZGUgPSAoZW1zID4+IDEwKSAmIDB4MzsKKworCW1jaSA9IGVkYWNfbWNfYWxsb2MoMCwgQU1ENzZYX05SX0NTUk9XUywgQU1ENzZYX05SX0NIQU5TKTsKKworCWlmIChtY2kgPT0gTlVMTCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisKKwlkZWJ1Z2YwKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpOiBtY2kgPSAlcFxuIiwgX19mdW5jX18sIG1jaSk7CisKKwltY2ktPnBkZXYgPSBwY2lfZGV2X2dldChwZGV2KTsKKwltY2ktPm10eXBlX2NhcCA9IE1FTV9GTEFHX1JERFI7CisKKwltY2ktPmVkYWNfY3RsX2NhcCA9IEVEQUNfRkxBR19OT05FIHwgRURBQ19GTEFHX0VDIHwgRURBQ19GTEFHX1NFQ0RFRDsKKwltY2ktPmVkYWNfY2FwID0gZW1zX21vZGUgPworCSAgICAoRURBQ19GTEFHX0VDIHwgRURBQ19GTEFHX1NFQ0RFRCkgOiBFREFDX0ZMQUdfTk9ORTsKKworCW1jaS0+bW9kX25hbWUgPSBCU19NT0RfU1RSOworCW1jaS0+bW9kX3ZlciA9ICIkUmV2aXNpb246IDEuNC4yLjUgJCI7CisJbWNpLT5jdGxfbmFtZSA9IGFtZDc2eF9kZXZzW2Rldl9pZHhdLmN0bF9uYW1lOworCW1jaS0+ZWRhY19jaGVjayA9IGFtZDc2eF9jaGVjazsKKwltY2ktPmN0bF9wYWdlX3RvX3BoeXMgPSBOVUxMOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbWNpLT5ucl9jc3Jvd3M7IGluZGV4KyspIHsKKwkJc3RydWN0IGNzcm93X2luZm8gKmNzcm93ID0gJm1jaS0+Y3Nyb3dzW2luZGV4XTsKKwkJdTMyIG1iYTsKKwkJdTMyIG1iYV9iYXNlOworCQl1MzIgbWJhX21hc2s7CisJCXUzMiBkbXM7CisKKwkJLyogZmluZCB0aGUgRFJBTSBDaGlwIFNlbGVjdCBCYXNlIGFkZHJlc3MgYW5kIG1hc2sgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG1jaS0+cGRldiwKKwkJCQkgICAgICBBTUQ3NlhfTUVNX0JBU0VfQUREUiArIChpbmRleCAqIDQpLAorCQkJCSAgICAgICZtYmEpOworCisJCWlmICghKG1iYSAmIEJJVCgwKSkpCisJCQljb250aW51ZTsKKworCQltYmFfYmFzZSA9IG1iYSAmIDB4ZmY4MDAwMDBVTDsKKwkJbWJhX21hc2sgPSAoKG1iYSAmIDB4ZmY4MCkgPDwgMTYpIHwgMHg3ZmZmZmZVTDsKKworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQobWNpLT5wZGV2LCBBTUQ3NlhfRFJBTV9NT0RFX1NUQVRVUywKKwkJCQkgICAgICAmZG1zKTsKKworCQljc3Jvdy0+Zmlyc3RfcGFnZSA9IG1iYV9iYXNlID4+IFBBR0VfU0hJRlQ7CisJCWNzcm93LT5ucl9wYWdlcyA9IChtYmFfbWFzayArIDEpID4+IFBBR0VfU0hJRlQ7CisJCWNzcm93LT5sYXN0X3BhZ2UgPSBjc3Jvdy0+Zmlyc3RfcGFnZSArIGNzcm93LT5ucl9wYWdlcyAtIDE7CisJCWNzcm93LT5wYWdlX21hc2sgPSBtYmFfbWFzayA+PiBQQUdFX1NISUZUOworCQljc3Jvdy0+Z3JhaW4gPSBjc3Jvdy0+bnJfcGFnZXMgPDwgUEFHRV9TSElGVDsKKwkJY3Nyb3ctPm10eXBlID0gTUVNX1JERFI7CisJCWNzcm93LT5kdHlwZSA9ICgoZG1zID4+IGluZGV4KSAmIDB4MSkgPyBERVZfWDQgOiBERVZfVU5LTk9XTjsKKwkJY3Nyb3ctPmVkYWNfbW9kZSA9IGVtc19tb2Rlc1tlbXNfbW9kZV07CisJfQorCisJLyogY2xlYXIgY291bnRlcnMgKi8KKwlwY2lfd3JpdGVfYml0czMyKG1jaS0+cGRldiwgQU1ENzZYX0VDQ19NT0RFX1NUQVRVUywgKHUzMikgKDB4MyA8PCA4KSwKKwkJCSAodTMyKSAoMHgzIDw8IDgpKTsKKworCWlmIChlZGFjX21jX2FkZF9tYyhtY2kpKSB7CisJCWRlYnVnZjMoIk1DOiAiIF9fRklMRV9fCisJCQkiOiAlcygpOiBmYWlsZWQgZWRhY19tY19hZGRfbWMoKVxuIiwgX19mdW5jX18pOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogZ2V0IHRoaXMgZmFyIGFuZCBpdCdzIHN1Y2Nlc3NmdWwgKi8KKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpOiBzdWNjZXNzXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7CisKK2ZhaWw6CisJaWYgKG1jaSkgeworCQlpZihtY2ktPnBkZXYpCisJCQlwY2lfZGV2X3B1dChtY2ktPnBkZXYpOworCQllZGFjX21jX2ZyZWUobWNpKTsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKiByZXR1cm5zIGNvdW50ICg+PSAwKSwgb3IgbmVnYXRpdmUgb24gZXJyb3IgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGFtZDc2eF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJZGVidWdmMCgiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCisJLyogZG9uJ3QgbmVlZCB0byBjYWxsIHBjaV9kZXZpY2VfZW5hYmxlKCkgKi8KKwlyZXR1cm4gYW1kNzZ4X3Byb2JlMShwZGV2LCBlbnQtPmRyaXZlcl9kYXRhKTsKK30KKworCisvKioKKyAqCWFtZDc2eF9yZW1vdmVfb25lCS0JZHJpdmVyIHNodXRkb3duCisgKglAcGRldjogUENJIGRldmljZSBiZWluZyBoYW5kZWQgYmFjaworICoKKyAqCUNhbGxlZCB3aGVuIHRoZSBkcml2ZXIgaXMgdW5sb2FkZWQuIEZpbmQgdGhlIG1hdGNoaW5nIG1jaQorICoJc3RydWN0dXJlIGZvciB0aGUgZGV2aWNlIHRoZW4gZGVsZXRlIHRoZSBtY2kgYW5kIGZyZWUgdGhlCisgKglyZXNvdXJjZXMuCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGFtZDc2eF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaTsKKworCWRlYnVnZjAoX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCisJaWYgKChtY2kgPSBlZGFjX21jX2ZpbmRfbWNpX2J5X3BkZXYocGRldikpID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAoZWRhY19tY19kZWxfbWMobWNpKSkKKwkJcmV0dXJuOworCXBjaV9kZXZfcHV0KG1jaS0+cGRldik7CisJZWRhY19tY19mcmVlKG1jaSk7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFtZDc2eF9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7UENJX1ZFTkRfREVWKEFNRCwgRkVfR0FURV83MDBDKSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgQU1ENzYyfSwKKwl7UENJX1ZFTkRfREVWKEFNRCwgRkVfR0FURV83MDBFKSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgQU1ENzYxfSwKKwl7MCx9CQkJLyogMCB0ZXJtaW5hdGVkIGxpc3QuICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYW1kNzZ4X3BjaV90YmwpOworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhbWQ3NnhfZHJpdmVyID0geworCS5uYW1lID0gQlNfTU9EX1NUUiwKKwkucHJvYmUgPSBhbWQ3NnhfaW5pdF9vbmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFtZDc2eF9yZW1vdmVfb25lKSwKKwkuaWRfdGFibGUgPSBhbWQ3NnhfcGNpX3RibCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFtZDc2eF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmFtZDc2eF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYW1kNzZ4X2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFtZDc2eF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbWQ3NnhfaW5pdCk7Cittb2R1bGVfZXhpdChhbWQ3NnhfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkxpbnV4IE5ldHdvcnggKGh0dHA6Ly9sbnhpLmNvbSkgVGhheW5lIEhhcmJhdWdoIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1DIHN1cHBvcnQgZm9yIEFNRCA3NnggbWVtb3J5IGNvbnRyb2xsZXJzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZTc1MnhfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2U3NTJ4X2VkYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzBhNWE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9lZGFjL2U3NTJ4X2VkYWMuYwpAQCAtMCwwICsxLDEwNzEgQEAKKy8qCisgKiBJbnRlbCBlNzUyeCBNZW1vcnkgQ29udHJvbGxlciBrZXJuZWwgbW9kdWxlCisgKiAoQykgMjAwNCBMaW51eCBOZXR3b3J4IChodHRwOi8vbG54aS5jb20pCisgKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqIFNlZSAiZW51bSBlNzUyeF9jaGlwcyIgYmVsb3cgZm9yIHN1cHBvcnRlZCBjaGlwc2V0cworICoKKyAqIFdyaXR0ZW4gYnkgVG9tIFppbW1lcm1hbgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIAlUaGF5bmUgSGFyYmF1Z2ggYXQgcmVhbG1zeXMuY29tICg/KQorICogCVdhbmcgWmhlbnl1IGF0IGludGVsLmNvbQorICogCURhdmUgSmlhbmcgYXQgbXZpc3RhLmNvbQorICoKKyAqICRJZDogZWRhY19lNzUyeC5jLHYgMS41LjIuMTEgMjAwNS8xMC8wNSAwMDo0Mzo0NCBkc3BfbGxubCBFeHAgJAorICoKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJlZGFjX21jLmgiCisKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0lOVEVMXzc1MjBfMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzc1MjBfMCAgICAgIDB4MzU5MAorI2VuZGlmCQkJCS8qIFBDSV9ERVZJQ0VfSURfSU5URUxfNzUyMF8wICAgICAgKi8KKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0lOVEVMXzc1MjBfMV9FUlIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF83NTIwXzFfRVJSICAweDM1OTEKKyNlbmRpZgkJCQkvKiBQQ0lfREVWSUNFX0lEX0lOVEVMXzc1MjBfMV9FUlIgICovCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9JTlRFTF83NTI1XzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF83NTI1XzAgICAgICAweDM1OUUKKyNlbmRpZgkJCQkvKiBQQ0lfREVWSUNFX0lEX0lOVEVMXzc1MjVfMCAgICAgICovCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9JTlRFTF83NTI1XzFfRVJSCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfNzUyNV8xX0VSUiAgMHgzNTkzCisjZW5kaWYJCQkJLyogUENJX0RFVklDRV9JRF9JTlRFTF83NTI1XzFfRVJSICAqLworCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfSU5URUxfNzMyMF8wCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfNzMyMF8wCTB4MzU5MgorI2VuZGlmCQkJCS8qIFBDSV9ERVZJQ0VfSURfSU5URUxfNzMyMF8wICovCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9JTlRFTF83MzIwXzFfRVJSCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfNzMyMF8xX0VSUgkweDM1OTMKKyNlbmRpZgkJCQkvKiBQQ0lfREVWSUNFX0lEX0lOVEVMXzczMjBfMV9FUlIgKi8KKworI2RlZmluZSBFNzUyWF9OUl9DU1JPV1MJCTgJLyogbnVtYmVyIG9mIGNzcm93cyAqLworCisKKy8qIEU3NTJYIHJlZ2lzdGVyIGFkZHJlc3NlcyAtIGRldmljZSAwIGZ1bmN0aW9uIDAgKi8KKyNkZWZpbmUgRTc1MlhfRFJCCQkweDYwCS8qIERSQU0gcm93IGJvdW5kYXJ5IHJlZ2lzdGVyICg4YikgKi8KKyNkZWZpbmUgRTc1MlhfRFJBCQkweDcwCS8qIERSQU0gcm93IGF0dHJpYnV0ZSByZWdpc3RlciAoOGIpICovCisJCQkJCS8qCisJCQkJCSAqIDMxOjMwICAgRGV2aWNlIHdpZHRoIHJvdyA3CisJCQkJCSAqICAgICAgMDE9eDggMTA9eDQgMTE9eDggRERSMgorCQkJCQkgKiAyNzoyNiAgIERldmljZSB3aWR0aCByb3cgNgorCQkJCQkgKiAyMzoyMiAgIERldmljZSB3aWR0aCByb3cgNQorCQkJCQkgKiAxOToyMCAgIERldmljZSB3aWR0aCByb3cgNAorCQkJCQkgKiAxNToxNCAgIERldmljZSB3aWR0aCByb3cgMworCQkJCQkgKiAxMToxMCAgIERldmljZSB3aWR0aCByb3cgMgorCQkJCQkgKiAgNzo2ICAgIERldmljZSB3aWR0aCByb3cgMQorCQkJCQkgKiAgMzoyICAgIERldmljZSB3aWR0aCByb3cgMAorCQkJCQkgKi8KKyNkZWZpbmUgRTc1MlhfRFJDCQkweDdDCS8qIERSQU0gY29udHJvbGxlciBtb2RlIHJlZyAoMzJiKSAqLworCQkJCQkvKiBGSVhNRTpJUyBUSElTIFJJR0hUPyAqLworCQkJCQkvKgorCQkJCQkgKiAyMiAgICBOdW1iZXIgY2hhbm5lbHMgMD0xLDE9MgorCQkJCQkgKiAxOToxOCBEUkIgR3JhbnVsYXJpdHkgMzIvNjRNQgorCQkJCQkgKi8KKyNkZWZpbmUgRTc1MlhfRFJNCQkweDgwCS8qIERpbW0gbWFwcGluZyByZWdpc3RlciAqLworI2RlZmluZSBFNzUyWF9ERFJDU1IJCTB4OUEJLyogRERSIGNvbnRyb2wgYW5kIHN0YXR1cyByZWcgKDE2YikgKi8KKwkJCQkJLyoKKwkJCQkJICogMTQ6MTIgMSBzaW5nbGUgQSwgMiBzaW5nbGUgQiwgMyBkdWFsCisJCQkJCSAqLworI2RlZmluZSBFNzUyWF9UT0xNCQkweEM0CS8qIERSQU0gdG9wIG9mIGxvdyBtZW1vcnkgcmVnICgxNmIpICovCisjZGVmaW5lIEU3NTJYX1JFTUFQQkFTRQkJMHhDNgkvKiBEUkFNIHJlbWFwIGJhc2UgYWRkcmVzcyByZWcgKDE2YikgKi8KKyNkZWZpbmUgRTc1MlhfUkVNQVBMSU1JVAkweEM4CS8qIERSQU0gcmVtYXAgbGltaXQgYWRkcmVzcyByZWcgKDE2YikgKi8KKyNkZWZpbmUgRTc1MlhfUkVNQVBPRkZTRVQJMHhDQQkvKiBEUkFNIHJlbWFwIGxpbWl0IG9mZnNldCByZWcgKDE2YikgKi8KKworLyogRTc1MlggcmVnaXN0ZXIgYWRkcmVzc2VzIC0gZGV2aWNlIDAgZnVuY3Rpb24gMSAqLworI2RlZmluZSBFNzUyWF9GRVJSX0dMT0JBTAkweDQwCS8qIEdsb2JhbCBmaXJzdCBlcnJvciByZWdpc3RlciAoMzJiKSAqLworI2RlZmluZSBFNzUyWF9ORVJSX0dMT0JBTAkweDQ0CS8qIEdsb2JhbCBuZXh0IGVycm9yIHJlZ2lzdGVyICgzMmIpICovCisjZGVmaW5lIEU3NTJYX0hJX0ZFUlIJCTB4NTAJLyogSHViIGludGVyZmFjZSBmaXJzdCBlcnJvciByZWcgKDhiKSAqLworI2RlZmluZSBFNzUyWF9ISV9ORVJSCQkweDUyCS8qIEh1YiBpbnRlcmZhY2UgbmV4dCBlcnJvciByZWcgKDhiKSAqLworI2RlZmluZSBFNzUyWF9ISV9FUlJNQVNLCTB4NTQJLyogSHViIGludGVyZmFjZSBlcnJvciBtYXNrIHJlZyAoOGIpICovCisjZGVmaW5lIEU3NTJYX0hJX1NNSUNNRAkJMHg1QQkvKiBIdWIgaW50ZXJmYWNlIFNNSSBjb21tYW5kIHJlZyAoOGIpICovCisjZGVmaW5lIEU3NTJYX1NZU0JVU19GRVJSCTB4NjAJLyogU3lzdGVtIGJ1c3MgZmlyc3QgZXJyb3IgcmVnICgxNmIpICovCisjZGVmaW5lIEU3NTJYX1NZU0JVU19ORVJSCTB4NjIJLyogU3lzdGVtIGJ1c3MgbmV4dCBlcnJvciByZWcgKDE2YikgKi8KKyNkZWZpbmUgRTc1MlhfU1lTQlVTX0VSUk1BU0sJMHg2NAkvKiBTeXN0ZW0gYnVzcyBlcnJvciBtYXNrIHJlZyAoMTZiKSAqLworI2RlZmluZSBFNzUyWF9TWVNCVVNfU01JQ01ECTB4NkEJLyogU3lzdGVtIGJ1c3MgU01JIGNvbW1hbmQgcmVnICgxNmIpICovCisjZGVmaW5lIEU3NTJYX0JVRl9GRVJSCQkweDcwCS8qIE1lbW9yeSBidWZmZXIgZmlyc3QgZXJyb3IgcmVnICg4YikgKi8KKyNkZWZpbmUgRTc1MlhfQlVGX05FUlIJCTB4NzIJLyogTWVtb3J5IGJ1ZmZlciBuZXh0IGVycm9yIHJlZyAoOGIpICovCisjZGVmaW5lIEU3NTJYX0JVRl9FUlJNQVNLCTB4NzQJLyogTWVtb3J5IGJ1ZmZlciBlcnJvciBtYXNrIHJlZyAoOGIpICovCisjZGVmaW5lIEU3NTJYX0JVRl9TTUlDTUQJMHg3QQkvKiBNZW1vcnkgYnVmZmVyIFNNSSBjb21tYW5kIHJlZyAoOGIpICovCisjZGVmaW5lIEU3NTJYX0RSQU1fRkVSUgkJMHg4MAkvKiBEUkFNIGZpcnN0IGVycm9yIHJlZ2lzdGVyICgxNmIpICovCisjZGVmaW5lIEU3NTJYX0RSQU1fTkVSUgkJMHg4MgkvKiBEUkFNIG5leHQgZXJyb3IgcmVnaXN0ZXIgKDE2YikgKi8KKyNkZWZpbmUgRTc1MlhfRFJBTV9FUlJNQVNLCTB4ODQJLyogRFJBTSBlcnJvciBtYXNrIHJlZ2lzdGVyICg4YikgKi8KKyNkZWZpbmUgRTc1MlhfRFJBTV9TTUlDTUQJMHg4QQkvKiBEUkFNIFNNSSBjb21tYW5kIHJlZ2lzdGVyICg4YikgKi8KKyNkZWZpbmUgRTc1MlhfRFJBTV9SRVRSX0FERAkweEFDCS8qIERSQU0gUmV0cnkgYWRkcmVzcyByZWdpc3RlciAoMzJiKSAqLworI2RlZmluZSBFNzUyWF9EUkFNX1NFQzFfQURECTB4QTAJLyogRFJBTSBmaXJzdCBjb3JyZWN0YWJsZSBtZW1vcnkgKi8KKwkJCQkJLyogICAgIGVycm9yIGFkZHJlc3MgcmVnaXN0ZXIgKDMyYikgKi8KKwkJCQkJLyoKKwkJCQkJICogMzEgICAgUmVzZXJ2ZWQKKwkJCQkJICogMzA6MiAgQ0UgYWRkcmVzcyAoNjQgYnl0ZSBibG9jayAzNDo2KQorCQkJCQkgKiAxICAgICBSZXNlcnZlZAorCQkJCQkgKiAwICAgICBIaUxvQ1MKKwkJCQkJICovCisjZGVmaW5lIEU3NTJYX0RSQU1fU0VDMl9BREQJMHhDOAkvKiBEUkFNIGZpcnN0IGNvcnJlY3RhYmxlIG1lbW9yeSAqLworCQkJCQkvKiAgICAgZXJyb3IgYWRkcmVzcyByZWdpc3RlciAoMzJiKSAqLworCQkJCQkvKgorCQkJCQkgKiAzMSAgICBSZXNlcnZlZAorCQkJCQkgKiAzMDoyICBDRSBhZGRyZXNzICg2NCBieXRlIGJsb2NrIDM0OjYpCisJCQkJCSAqIDEgICAgIFJlc2VydmVkCisJCQkJCSAqIDAgICAgIEhpTG9DUworCQkJCQkgKi8KKyNkZWZpbmUgRTc1MlhfRFJBTV9ERURfQURECTB4QTQJLyogRFJBTSBmaXJzdCB1bmNvcnJlY3RhYmxlIG1lbW9yeSAqLworCQkJCQkvKiAgICAgZXJyb3IgYWRkcmVzcyByZWdpc3RlciAoMzJiKSAqLworCQkJCQkvKgorCQkJCQkgKiAzMSAgICBSZXNlcnZlZAorCQkJCQkgKiAzMDoyICBDRSBhZGRyZXNzICg2NCBieXRlIGJsb2NrIDM0OjYpCisJCQkJCSAqIDEgICAgIFJlc2VydmVkCisJCQkJCSAqIDAgICAgIEhpTG9DUworCQkJCQkgKi8KKyNkZWZpbmUgRTc1MlhfRFJBTV9TQ1JCX0FERAkweEE4CS8qIERSQU0gZmlyc3QgdW5jb3JyZWN0YWJsZSBzY3J1YiBtZW1vcnkgKi8KKwkJCQkJLyogICAgIGVycm9yIGFkZHJlc3MgcmVnaXN0ZXIgKDMyYikgKi8KKwkJCQkJLyoKKwkJCQkJICogMzEgICAgUmVzZXJ2ZWQKKwkJCQkJICogMzA6MiAgQ0UgYWRkcmVzcyAoNjQgYnl0ZSBibG9jayAzNDo2KQorCQkJCQkgKiAxICAgICBSZXNlcnZlZAorCQkJCQkgKiAwICAgICBIaUxvQ1MKKwkJCQkJICovCisjZGVmaW5lIEU3NTJYX0RSQU1fU0VDMV9TWU5EUk9NRSAweEM0CS8qIERSQU0gZmlyc3QgY29ycmVjdGFibGUgbWVtb3J5ICovCisJCQkJCS8qICAgICBlcnJvciBzeW5kcm9tZSByZWdpc3RlciAoMTZiKSAqLworI2RlZmluZSBFNzUyWF9EUkFNX1NFQzJfU1lORFJPTUUgMHhDNgkvKiBEUkFNIHNlY29uZCBjb3JyZWN0YWJsZSBtZW1vcnkgKi8KKwkJCQkJLyogICAgIGVycm9yIHN5bmRyb21lIHJlZ2lzdGVyICgxNmIpICovCisjZGVmaW5lIEU3NTJYX0RFVlBSRVMxCQkweEY0CS8qIERldmljZSBQcmVzZW50IDEgcmVnaXN0ZXIgKDhiKSAqLworCisvKiBJQ0g1UiByZWdpc3RlciBhZGRyZXNzZXMgLSBkZXZpY2UgMzAgZnVuY3Rpb24gMCAqLworI2RlZmluZSBJQ0g1Ul9QQ0lfU1RBVAkJMHgwNgkvKiBQQ0kgc3RhdHVzIHJlZ2lzdGVyICgxNmIpICovCisjZGVmaW5lIElDSDVSX1BDSV8yTkRfU1RBVAkweDFFCS8qIFBDSSBzdGF0dXMgc2Vjb25kYXJ5IHJlZyAoMTZiKSAqLworI2RlZmluZSBJQ0g1Ul9QQ0lfQlJJREdFX0NUTAkweDNFCS8qIFBDSSBicmlkZ2UgY29udHJvbCByZWdpc3RlciAoMTZiKSAqLworCitlbnVtIGU3NTJ4X2NoaXBzIHsKKwlFNzUyMCA9IDAsCisJRTc1MjUgPSAxLAorCUU3MzIwID0gMgorfTsKKworCitzdHJ1Y3QgZTc1MnhfcHZ0IHsKKwlzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlX2NrOworCXN0cnVjdCBwY2lfZGV2ICpkZXZfZDBmMDsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2X2QwZjE7CisJdTMyIHRvbG07CisJdTMyIHJlbWFwYmFzZTsKKwl1MzIgcmVtYXBsaW1pdDsKKwlpbnQgbWNfc3ltbWV0cmljOworCXU4IG1hcFs4XTsKKwlpbnQgbWFwX3R5cGU7CisJY29uc3Qgc3RydWN0IGU3NTJ4X2Rldl9pbmZvICpkZXZfaW5mbzsKK307CisKKworc3RydWN0IGU3NTJ4X2Rldl9pbmZvIHsKKwl1MTYgZXJyX2RldjsKKwljb25zdCBjaGFyICpjdGxfbmFtZTsKK307CisKK3N0cnVjdCBlNzUyeF9lcnJvcl9pbmZvIHsKKwl1MzIgZmVycl9nbG9iYWw7CisJdTMyIG5lcnJfZ2xvYmFsOworCXU4IGhpX2ZlcnI7CisJdTggaGlfbmVycjsKKwl1MTYgc3lzYnVzX2ZlcnI7CisJdTE2IHN5c2J1c19uZXJyOworCXU4IGJ1Zl9mZXJyOworCXU4IGJ1Zl9uZXJyOworCXUxNiBkcmFtX2ZlcnI7CisJdTE2IGRyYW1fbmVycjsKKwl1MzIgZHJhbV9zZWMxX2FkZDsKKwl1MzIgZHJhbV9zZWMyX2FkZDsKKwl1MTYgZHJhbV9zZWMxX3N5bmRyb21lOworCXUxNiBkcmFtX3NlYzJfc3luZHJvbWU7CisJdTMyIGRyYW1fZGVkX2FkZDsKKwl1MzIgZHJhbV9zY3JiX2FkZDsKKwl1MzIgZHJhbV9yZXRyX2FkZDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZTc1MnhfZGV2X2luZm8gZTc1MnhfZGV2c1tdID0geworCVtFNzUyMF0gPSB7CisJCSAgIC5lcnJfZGV2ID0gUENJX0RFVklDRV9JRF9JTlRFTF83NTIwXzFfRVJSLAorCQkgICAuY3RsX25hbWUgPSAiRTc1MjAifSwKKwlbRTc1MjVdID0geworCQkgICAuZXJyX2RldiA9IFBDSV9ERVZJQ0VfSURfSU5URUxfNzUyNV8xX0VSUiwKKwkJICAgLmN0bF9uYW1lID0gIkU3NTI1In0sCisJW0U3MzIwXSA9IHsKKwkJICAgLmVycl9kZXYgPSBQQ0lfREVWSUNFX0lEX0lOVEVMXzczMjBfMV9FUlIsCisJCSAgIC5jdGxfbmFtZSA9ICJFNzMyMCJ9LAorfTsKKworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjdGxfcGFnZV90b19waHlzKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHBhZ2UpCit7CisJdTMyIHJlbWFwOworCXN0cnVjdCBlNzUyeF9wdnQgKnB2dCA9IChzdHJ1Y3QgZTc1MnhfcHZ0ICopIG1jaS0+cHZ0X2luZm87CisKKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAocGFnZSA8IHB2dC0+dG9sbSkKKwkJcmV0dXJuIHBhZ2U7CisJaWYgKChwYWdlID49IDB4MTAwMDAwKSAmJiAocGFnZSA8IHB2dC0+cmVtYXBiYXNlKSkKKwkJcmV0dXJuIHBhZ2U7CisJcmVtYXAgPSAocGFnZSAtIHB2dC0+dG9sbSkgKyBwdnQtPnJlbWFwYmFzZTsKKwlpZiAocmVtYXAgPCBwdnQtPnJlbWFwbGltaXQpCisJCXJldHVybiByZW1hcDsKKwlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgcGFnZSAlbHggLSBvdXQgb2YgcmFuZ2VcbiIsIHBhZ2UpOworCXJldHVybiBwdnQtPnRvbG0gLSAxOworfQorCitzdGF0aWMgdm9pZCBkb19wcm9jZXNzX2NlKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgdTE2IGVycm9yX29uZSwKKwkJICAgICAgIHUzMiBzZWMxX2FkZCwgdTE2IHNlYzFfc3luZHJvbWUpCit7CisJdTMyIHBhZ2U7CisJaW50IHJvdzsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgaTsKKwlzdHJ1Y3QgZTc1MnhfcHZ0ICpwdnQgPSAoc3RydWN0IGU3NTJ4X3B2dCAqKSBtY2ktPnB2dF9pbmZvOworCisJZGVidWdmMygiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCisJLyogY29udmVydCB0aGUgYWRkciB0byA0ayBwYWdlICovCisJcGFnZSA9IHNlYzFfYWRkID4+IChQQUdFX1NISUZUIC0gNCk7CisKKwkvKiBGSVhNRSAtIGNoZWNrIGZvciAtMSAqLworCWlmIChwdnQtPm1jX3N5bW1ldHJpYykgeworCQkvKiBjaGlwIHNlbGVjdCBhcmUgYml0cyAxNCAmIDEzICovCisJCXJvdyA9ICgocGFnZSA+PiAxKSAmIDMpOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiVGVzdCByb3cgJWQgVGFibGUgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWRcbiIsCisJCSAgICAgICByb3csIHB2dC0+bWFwWzBdLCBwdnQtPm1hcFsxXSwgcHZ0LT5tYXBbMl0sCisJCSAgICAgICBwdnQtPm1hcFszXSwgcHZ0LT5tYXBbNF0sIHB2dC0+bWFwWzVdLAorCQkgICAgICAgcHZ0LT5tYXBbNl0sIHB2dC0+bWFwWzddKTsKKworCQkvKiB0ZXN0IGZvciBjaGFubmVsIHJlbWFwcGluZyAqLworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlpZiAocHZ0LT5tYXBbaV0gPT0gcm93KQorCQkJCWJyZWFrOworCQl9CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlRlc3QgY29tcHV0ZWQgcm93ICVkXG4iLCBpKTsKKwkJaWYgKGkgPCA4KQorCQkJcm93ID0gaTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJNQyVkOiByb3cgJWQgbm90IGZvdW5kIGluIHJlbWFwIHRhYmxlXG4iLAorCQkJICAgICAgIG1jaS0+bWNfaWR4LCByb3cpOworCX0gZWxzZQorCQlyb3cgPSBlZGFjX21jX2ZpbmRfY3Nyb3dfYnlfcGFnZShtY2ksIHBhZ2UpOworCS8qIDAgPSBjaGFubmVsIEEsIDEgPSBjaGFubmVsIEIgKi8KKwljaGFubmVsID0gIShlcnJvcl9vbmUgJiAxKTsKKworCWlmICghcHZ0LT5tYXBfdHlwZSkKKwkJcm93ID0gNyAtIHJvdzsKKwllZGFjX21jX2hhbmRsZV9jZShtY2ksIHBhZ2UsIDAsIHNlYzFfc3luZHJvbWUsIHJvdywgY2hhbm5lbCwKKwkgICAgImU3NTJ4IENFIik7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHByb2Nlc3NfY2Uoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLCB1MTYgZXJyb3Jfb25lLAorCQl1MzIgc2VjMV9hZGQsIHUxNiBzZWMxX3N5bmRyb21lLCBpbnQgKmVycm9yX2ZvdW5kLAorCQlpbnQgaGFuZGxlX2Vycm9yKQoreworCSplcnJvcl9mb3VuZCA9IDE7CisKKwlpZiAoaGFuZGxlX2Vycm9yKQorCQlkb19wcm9jZXNzX2NlKG1jaSwgZXJyb3Jfb25lLCBzZWMxX2FkZCwgc2VjMV9zeW5kcm9tZSk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3Byb2Nlc3NfdWUoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLCB1MTYgZXJyb3Jfb25lLCB1MzIgZGVkX2FkZCwKKwkJdTMyIHNjcmJfYWRkKQoreworCXUzMiBlcnJvcl8yYiwgYmxvY2tfcGFnZTsKKwlpbnQgcm93OworCXN0cnVjdCBlNzUyeF9wdnQgKnB2dCA9IChzdHJ1Y3QgZTc1MnhfcHZ0ICopIG1jaS0+cHZ0X2luZm87CisKKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoZXJyb3Jfb25lICYgMHgwMjAyKSB7CisJCWVycm9yXzJiID0gZGVkX2FkZDsKKwkJLyogY29udmVydCB0byA0ayBhZGRyZXNzICovCisJCWJsb2NrX3BhZ2UgPSBlcnJvcl8yYiA+PiAoUEFHRV9TSElGVCAtIDQpOworCQlyb3cgPSBwdnQtPm1jX3N5bW1ldHJpYyA/CisJCSAgICAvKiBjaGlwIHNlbGVjdCBhcmUgYml0cyAxNCAmIDEzICovCisJCSAgICAoKGJsb2NrX3BhZ2UgPj4gMSkgJiAzKSA6CisJCSAgICBlZGFjX21jX2ZpbmRfY3Nyb3dfYnlfcGFnZShtY2ksIGJsb2NrX3BhZ2UpOworCQllZGFjX21jX2hhbmRsZV91ZShtY2ksIGJsb2NrX3BhZ2UsIDAsIHJvdywKKwkJCQkgICAgICAgImU3NTJ4IFVFIGZyb20gUmVhZCIpOworCX0KKwlpZiAoZXJyb3Jfb25lICYgMHgwNDA0KSB7CisJCWVycm9yXzJiID0gc2NyYl9hZGQ7CisJCS8qIGNvbnZlcnQgdG8gNGsgYWRkcmVzcyAqLworCQlibG9ja19wYWdlID0gZXJyb3JfMmIgPj4gKFBBR0VfU0hJRlQgLSA0KTsKKwkJcm93ID0gcHZ0LT5tY19zeW1tZXRyaWMgPworCQkgICAgLyogY2hpcCBzZWxlY3QgYXJlIGJpdHMgMTQgJiAxMyAqLworCQkgICAgKChibG9ja19wYWdlID4+IDEpICYgMykgOgorCQkgICAgZWRhY19tY19maW5kX2Nzcm93X2J5X3BhZ2UobWNpLCBibG9ja19wYWdlKTsKKwkJZWRhY19tY19oYW5kbGVfdWUobWNpLCBibG9ja19wYWdlLCAwLCByb3csCisJCQkJICAgICAgICJlNzUyeCBVRSBmcm9tIFNjcnViZXIiKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcm9jZXNzX3VlKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgdTE2IGVycm9yX29uZSwKKwkJdTMyIGRlZF9hZGQsIHUzMiBzY3JiX2FkZCwgaW50ICplcnJvcl9mb3VuZCwgaW50IGhhbmRsZV9lcnJvcikKK3sKKwkqZXJyb3JfZm91bmQgPSAxOworCisJaWYgKGhhbmRsZV9lcnJvcikKKwkJZG9fcHJvY2Vzc191ZShtY2ksIGVycm9yX29uZSwgZGVkX2FkZCwgc2NyYl9hZGQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJvY2Vzc191ZV9ub19pbmZvX3dyKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJaW50ICplcnJvcl9mb3VuZCwgaW50IGhhbmRsZV9lcnJvcikKK3sKKwkqZXJyb3JfZm91bmQgPSAxOworCisJaWYgKCFoYW5kbGVfZXJyb3IpCisJCXJldHVybjsKKworCWRlYnVnZjMoIk1DOiAiIF9fRklMRV9fICI6ICVzKClcbiIsIF9fZnVuY19fKTsKKwllZGFjX21jX2hhbmRsZV91ZV9ub19pbmZvKG1jaSwgImU3NTJ4IFVFIGxvZyBtZW1vcnkgd3JpdGUiKTsKK30KKworc3RhdGljIHZvaWQgZG9fcHJvY2Vzc19kZWRfcmV0cnkoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLCB1MTYgZXJyb3IsCisJCXUzMiByZXRyeV9hZGQpCit7CisJdTMyIGVycm9yXzFiLCBwYWdlOworCWludCByb3c7CisJc3RydWN0IGU3NTJ4X3B2dCAqcHZ0ID0gKHN0cnVjdCBlNzUyeF9wdnQgKikgbWNpLT5wdnRfaW5mbzsKKworCWVycm9yXzFiID0gcmV0cnlfYWRkOworCXBhZ2UgPSBlcnJvcl8xYiA+PiAoUEFHRV9TSElGVCAtIDQpOwkvKiBjb252ZXJ0IHRoZSBhZGRyIHRvIDRrIHBhZ2UgKi8KKwlyb3cgPSBwdnQtPm1jX3N5bW1ldHJpYyA/CisJICAgICgocGFnZSA+PiAxKSAmIDMpIDoJLyogY2hpcCBzZWxlY3QgYXJlIGJpdHMgMTQgJiAxMyAqLworCSAgICBlZGFjX21jX2ZpbmRfY3Nyb3dfYnlfcGFnZShtY2ksIHBhZ2UpOworCXByaW50ayhLRVJOX1dBUk5JTkcKKwkgICAgICAgIk1DJWQ6IENFIHBhZ2UgMHglbHgsIHJvdyAlZCA6IE1lbW9yeSByZWFkIHJldHJ5XG4iLAorCSAgICAgICBtY2ktPm1jX2lkeCwgKGxvbmcgdW5zaWduZWQgaW50KSBwYWdlLCByb3cpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJvY2Vzc19kZWRfcmV0cnkoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLCB1MTYgZXJyb3IsCisJCXUzMiByZXRyeV9hZGQsIGludCAqZXJyb3JfZm91bmQsIGludCBoYW5kbGVfZXJyb3IpCit7CisJKmVycm9yX2ZvdW5kID0gMTsKKworCWlmIChoYW5kbGVfZXJyb3IpCisJCWRvX3Byb2Nlc3NfZGVkX3JldHJ5KG1jaSwgZXJyb3IsIHJldHJ5X2FkZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcm9jZXNzX3RocmVzaG9sZF9jZShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIHUxNiBlcnJvciwKKwkJaW50ICplcnJvcl9mb3VuZCwgaW50IGhhbmRsZV9lcnJvcikKK3sKKwkqZXJyb3JfZm91bmQgPSAxOworCisJaWYgKGhhbmRsZV9lcnJvcikKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTUMlZDogTWVtb3J5IHRocmVzaG9sZCBDRVxuIiwKKwkJICAgICAgIG1jaS0+bWNfaWR4KTsKK30KKworc3RhdGljIGNoYXIgKmdsb2JhbF9tZXNzYWdlWzExXSA9IHsKKwkiUENJIEV4cHJlc3MgQzEiLCAiUENJIEV4cHJlc3MgQyIsICJQQ0kgRXhwcmVzcyBCMSIsCisJIlBDSSBFeHByZXNzIEIiLCAiUENJIEV4cHJlc3MgQTEiLCAiUENJIEV4cHJlc3MgQSIsCisJIkRNQSBDb250cm9sZXIiLCAiSFVCIEludGVyZmFjZSIsICJTeXN0ZW0gQnVzIiwKKwkiRFJBTSBDb250cm9sZXIiLCAiSW50ZXJuYWwgQnVmZmVyIgorfTsKKworc3RhdGljIGNoYXIgKmZhdGFsX21lc3NhZ2VbMl0gPSB7ICJOb24tRmF0YWwgIiwgIkZhdGFsICIgfTsKKworc3RhdGljIHZvaWQgZG9fZ2xvYmFsX2Vycm9yKGludCBmYXRhbCwgdTMyIGVycm9ycykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxMTsgaSsrKSB7CisJCWlmIChlcnJvcnMgJiAoMSA8PCBpKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzRXJyb3IgJXNcbiIsCisJCQkgICAgICAgZmF0YWxfbWVzc2FnZVtmYXRhbF0sIGdsb2JhbF9tZXNzYWdlW2ldKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnbG9iYWxfZXJyb3IoaW50IGZhdGFsLCB1MzIgZXJyb3JzLCBpbnQgKmVycm9yX2ZvdW5kLAorCQlpbnQgaGFuZGxlX2Vycm9yKQoreworCSplcnJvcl9mb3VuZCA9IDE7CisKKwlpZiAoaGFuZGxlX2Vycm9yKQorCQlkb19nbG9iYWxfZXJyb3IoZmF0YWwsIGVycm9ycyk7Cit9CisKK3N0YXRpYyBjaGFyICpodWJfbWVzc2FnZVs3XSA9IHsKKwkiSEkgQWRkcmVzcyBvciBDb21tYW5kIFBhcml0eSIsICJISSBJbGxlZ2FsIEFjY2VzcyIsCisJIkhJIEludGVybmFsIFBhcml0eSIsICJPdXQgb2YgUmFuZ2UgQWNjZXNzIiwKKwkiSEkgRGF0YSBQYXJpdHkiLCAiRW5oYW5jZWQgQ29uZmlnIEFjY2VzcyIsCisJIkh1YiBJbnRlcmZhY2UgVGFyZ2V0IEFib3J0IgorfTsKKworc3RhdGljIHZvaWQgZG9faHViX2Vycm9yKGludCBmYXRhbCwgdTggZXJyb3JzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQlpZiAoZXJyb3JzICYgKDEgPDwgaSkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlc0Vycm9yICVzXG4iLAorCQkJICAgICAgIGZhdGFsX21lc3NhZ2VbZmF0YWxdLCBodWJfbWVzc2FnZVtpXSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaHViX2Vycm9yKGludCBmYXRhbCwgdTggZXJyb3JzLCBpbnQgKmVycm9yX2ZvdW5kLAorCQlpbnQgaGFuZGxlX2Vycm9yKQoreworCSplcnJvcl9mb3VuZCA9IDE7CisKKwlpZiAoaGFuZGxlX2Vycm9yKQorCQlkb19odWJfZXJyb3IoZmF0YWwsIGVycm9ycyk7Cit9CisKK3N0YXRpYyBjaGFyICptZW1idWZfbWVzc2FnZVs0XSA9IHsKKwkiSW50ZXJuYWwgUE1XQiB0byBEUkFNIHBhcml0eSIsCisJIkludGVybmFsIFBNV0IgdG8gU3lzdGVtIEJ1cyBQYXJpdHkiLAorCSJJbnRlcm5hbCBTeXN0ZW0gQnVzIG9yIElPIHRvIFBNV0IgUGFyaXR5IiwKKwkiSW50ZXJuYWwgRFJBTSB0byBQTVdCIFBhcml0eSIKK307CisKK3N0YXRpYyB2b2lkIGRvX21lbWJ1Zl9lcnJvcih1OCBlcnJvcnMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmIChlcnJvcnMgJiAoMSA8PCBpKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5vbi1GYXRhbCBFcnJvciAlc1xuIiwKKwkJCSAgICAgICBtZW1idWZfbWVzc2FnZVtpXSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWVtYnVmX2Vycm9yKHU4IGVycm9ycywgaW50ICplcnJvcl9mb3VuZCwgaW50IGhhbmRsZV9lcnJvcikKK3sKKwkqZXJyb3JfZm91bmQgPSAxOworCisJaWYgKGhhbmRsZV9lcnJvcikKKwkJZG9fbWVtYnVmX2Vycm9yKGVycm9ycyk7Cit9CisKKyNpZiAwCitjaGFyICpzeXNidXNfbWVzc2FnZVsxMF0gPSB7CisJIkFkZHIgb3IgUmVxdWVzdCBQYXJpdHkiLAorCSJEYXRhIFN0cm9iZSBHbGl0Y2giLAorCSJBZGRyIFN0cm9iZSBHbGl0Y2giLAorCSJEYXRhIFBhcml0eSIsCisJIkFkZHIgQWJvdmUgVE9NIiwKKwkiTm9uIERSQU0gTG9jayBFcnJvciIsCisJIk1DRVJSIiwgIkJJTklUIiwKKwkiTWVtb3J5IFBhcml0eSIsCisJIklPIFN1YnN5c3RlbSBQYXJpdHkiCit9OworI2VuZGlmICAvKiAgMCAgKi8KKworc3RhdGljIHZvaWQgZG9fc3lzYnVzX2Vycm9yKGludCBmYXRhbCwgdTMyIGVycm9ycykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCWlmIChlcnJvcnMgJiAoMSA8PCBpKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzRXJyb3IgU3lzdGVtIEJ1cyAlc1xuIiwKKwkJCSAgICAgICBmYXRhbF9tZXNzYWdlW2ZhdGFsXSwgZ2xvYmFsX21lc3NhZ2VbaV0pOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHN5c2J1c19lcnJvcihpbnQgZmF0YWwsIHUzMiBlcnJvcnMsIGludCAqZXJyb3JfZm91bmQsCisJCWludCBoYW5kbGVfZXJyb3IpCit7CisJKmVycm9yX2ZvdW5kID0gMTsKKworCWlmIChoYW5kbGVfZXJyb3IpCisJCWRvX3N5c2J1c19lcnJvcihmYXRhbCwgZXJyb3JzKTsKK30KKworc3RhdGljIHZvaWQgZTc1MnhfY2hlY2tfaHViX2ludGVyZmFjZSAoc3RydWN0IGU3NTJ4X2Vycm9yX2luZm8gKmluZm8sCisJCWludCAqZXJyb3JfZm91bmQsIGludCBoYW5kbGVfZXJyb3IpCit7CisJdTggc3RhdDg7CisKKwkvL3BjaV9yZWFkX2NvbmZpZ19ieXRlKGRldixFNzUyWF9ISV9GRVJSLCZzdGF0OCk7CisJc3RhdDggPSBpbmZvLT5oaV9mZXJyOworCWlmKHN0YXQ4ICYgMHg3ZikgeyAvKiBFcnJvciwgc28gcHJvY2VzcyAqLworCQlzdGF0OCAmPSAweDdmOworCQlpZihzdGF0OCAmIDB4MmIpCisJCQlodWJfZXJyb3IoMSwgc3RhdDggJiAweDJiLCBlcnJvcl9mb3VuZCwgaGFuZGxlX2Vycm9yKTsKKwkJaWYoc3RhdDggJiAweDU0KQorCQkJaHViX2Vycm9yKDAsIHN0YXQ4ICYgMHg1NCwgZXJyb3JfZm91bmQsIGhhbmRsZV9lcnJvcik7CisJfQorCS8vcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LEU3NTJYX0hJX05FUlIsJnN0YXQ4KTsKKwlzdGF0OCA9IGluZm8tPmhpX25lcnI7CisJaWYoc3RhdDggJiAweDdmKSB7IC8qIEVycm9yLCBzbyBwcm9jZXNzICovCisJCXN0YXQ4ICY9IDB4N2Y7CisJCWlmIChzdGF0OCAmIDB4MmIpCisJCQlodWJfZXJyb3IoMSwgc3RhdDggJiAweDJiLCBlcnJvcl9mb3VuZCwgaGFuZGxlX2Vycm9yKTsKKwkJaWYoc3RhdDggJiAweDU0KQorCQkJaHViX2Vycm9yKDAsIHN0YXQ4ICYgMHg1NCwgZXJyb3JfZm91bmQsIGhhbmRsZV9lcnJvcik7CisJfQorfQorCitzdGF0aWMgdm9pZCBlNzUyeF9jaGVja19zeXNidXMgKHN0cnVjdCBlNzUyeF9lcnJvcl9pbmZvICppbmZvLCBpbnQgKmVycm9yX2ZvdW5kLAorCQlpbnQgaGFuZGxlX2Vycm9yKQoreworCXUzMiBzdGF0MzIsIGVycm9yMzI7CisKKwkvL3BjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsRTc1MlhfU1lTQlVTX0ZFUlIsJnN0YXQzMik7CisJc3RhdDMyID0gaW5mby0+c3lzYnVzX2ZlcnIgKyAoaW5mby0+c3lzYnVzX25lcnIgPDwgMTYpOworCisJaWYgKHN0YXQzMiA9PSAwKQorCQlyZXR1cm47ICAvKiBubyBlcnJvcnMgKi8KKworCWVycm9yMzIgPSAoc3RhdDMyID4+IDE2KSAmIDB4M2ZmOworCXN0YXQzMiA9IHN0YXQzMiAmIDB4M2ZmOworCWlmKHN0YXQzMiAmIDB4MDgzKQorCQlzeXNidXNfZXJyb3IoMSwgc3RhdDMyICYgMHgwODMsIGVycm9yX2ZvdW5kLCBoYW5kbGVfZXJyb3IpOworCWlmKHN0YXQzMiAmIDB4MzdjKQorCQlzeXNidXNfZXJyb3IoMCwgc3RhdDMyICYgMHgzN2MsIGVycm9yX2ZvdW5kLCBoYW5kbGVfZXJyb3IpOworCWlmKGVycm9yMzIgJiAweDA4MykKKwkJc3lzYnVzX2Vycm9yKDEsIGVycm9yMzIgJiAweDA4MywgZXJyb3JfZm91bmQsIGhhbmRsZV9lcnJvcik7CisJaWYoZXJyb3IzMiAmIDB4MzdjKQorCQlzeXNidXNfZXJyb3IoMCwgZXJyb3IzMiAmIDB4MzdjLCBlcnJvcl9mb3VuZCwgaGFuZGxlX2Vycm9yKTsKK30KKworc3RhdGljIHZvaWQgZTc1MnhfY2hlY2tfbWVtYnVmIChzdHJ1Y3QgZTc1MnhfZXJyb3JfaW5mbyAqaW5mbywgaW50ICplcnJvcl9mb3VuZCwKKwkJaW50IGhhbmRsZV9lcnJvcikKK3sKKwl1OCBzdGF0ODsKKworCXN0YXQ4ID0gaW5mby0+YnVmX2ZlcnI7CisJaWYgKHN0YXQ4ICYgMHgwZikgeyAvKiBFcnJvciwgc28gcHJvY2VzcyAqLworCQlzdGF0OCAmPSAweDBmOworCQltZW1idWZfZXJyb3Ioc3RhdDgsIGVycm9yX2ZvdW5kLCBoYW5kbGVfZXJyb3IpOworCX0KKwlzdGF0OCA9IGluZm8tPmJ1Zl9uZXJyOworCWlmIChzdGF0OCAmIDB4MGYpIHsgLyogRXJyb3IsIHNvIHByb2Nlc3MgKi8KKwkJc3RhdDggJj0gMHgwZjsKKwkJbWVtYnVmX2Vycm9yKHN0YXQ4LCBlcnJvcl9mb3VuZCwgaGFuZGxlX2Vycm9yKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGU3NTJ4X2NoZWNrX2RyYW0gKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJc3RydWN0IGU3NTJ4X2Vycm9yX2luZm8gKmluZm8sIGludCAqZXJyb3JfZm91bmQsIGludCBoYW5kbGVfZXJyb3IpCit7CisJdTE2IGVycm9yX29uZSwgZXJyb3JfbmV4dDsKKworCWVycm9yX29uZSA9IGluZm8tPmRyYW1fZmVycjsKKwllcnJvcl9uZXh0ID0gaW5mby0+ZHJhbV9uZXJyOworCisJLyogZGVjb2RlIGFuZCByZXBvcnQgZXJyb3JzICovCisJaWYoZXJyb3Jfb25lICYgMHgwMTAxKSAgLyogY2hlY2sgZmlyc3QgZXJyb3IgY29ycmVjdGFibGUgKi8KKwkJcHJvY2Vzc19jZShtY2ksIGVycm9yX29uZSwgaW5mby0+ZHJhbV9zZWMxX2FkZCwKKwkJCSAgIGluZm8tPmRyYW1fc2VjMV9zeW5kcm9tZSwgZXJyb3JfZm91bmQsCisJCQkgICBoYW5kbGVfZXJyb3IpOworCisJaWYoZXJyb3JfbmV4dCAmIDB4MDEwMSkgIC8qIGNoZWNrIG5leHQgZXJyb3IgY29ycmVjdGFibGUgKi8KKwkJcHJvY2Vzc19jZShtY2ksIGVycm9yX25leHQsIGluZm8tPmRyYW1fc2VjMl9hZGQsCisJCQkgICBpbmZvLT5kcmFtX3NlYzJfc3luZHJvbWUsIGVycm9yX2ZvdW5kLAorCQkJICAgaGFuZGxlX2Vycm9yKTsKKworCWlmKGVycm9yX29uZSAmIDB4NDA0MCkKKwkJcHJvY2Vzc191ZV9ub19pbmZvX3dyKG1jaSwgZXJyb3JfZm91bmQsIGhhbmRsZV9lcnJvcik7CisKKwlpZihlcnJvcl9uZXh0ICYgMHg0MDQwKQorCQlwcm9jZXNzX3VlX25vX2luZm9fd3IobWNpLCBlcnJvcl9mb3VuZCwgaGFuZGxlX2Vycm9yKTsKKworCWlmKGVycm9yX29uZSAmIDB4MjAyMCkKKwkJcHJvY2Vzc19kZWRfcmV0cnkobWNpLCBlcnJvcl9vbmUsIGluZm8tPmRyYW1fcmV0cl9hZGQsCisJCQkJICBlcnJvcl9mb3VuZCwgaGFuZGxlX2Vycm9yKTsKKworCWlmKGVycm9yX25leHQgJiAweDIwMjApCisJCXByb2Nlc3NfZGVkX3JldHJ5KG1jaSwgZXJyb3JfbmV4dCwgaW5mby0+ZHJhbV9yZXRyX2FkZCwKKwkJCQkgIGVycm9yX2ZvdW5kLCBoYW5kbGVfZXJyb3IpOworCisJaWYoZXJyb3Jfb25lICYgMHgwODA4KQorCQlwcm9jZXNzX3RocmVzaG9sZF9jZShtY2ksIGVycm9yX29uZSwgZXJyb3JfZm91bmQsCisJCQkJICAgICBoYW5kbGVfZXJyb3IpOworCisJaWYoZXJyb3JfbmV4dCAmIDB4MDgwOCkKKwkJcHJvY2Vzc190aHJlc2hvbGRfY2UobWNpLCBlcnJvcl9uZXh0LCBlcnJvcl9mb3VuZCwKKwkJCQkgICAgIGhhbmRsZV9lcnJvcik7CisKKwlpZihlcnJvcl9vbmUgJiAweDA2MDYpCisJCXByb2Nlc3NfdWUobWNpLCBlcnJvcl9vbmUsIGluZm8tPmRyYW1fZGVkX2FkZCwKKwkJCSAgIGluZm8tPmRyYW1fc2NyYl9hZGQsIGVycm9yX2ZvdW5kLCBoYW5kbGVfZXJyb3IpOworCisJaWYoZXJyb3JfbmV4dCAmIDB4MDYwNikKKwkJcHJvY2Vzc191ZShtY2ksIGVycm9yX25leHQsIGluZm8tPmRyYW1fZGVkX2FkZCwKKwkJCSAgIGluZm8tPmRyYW1fc2NyYl9hZGQsIGVycm9yX2ZvdW5kLCBoYW5kbGVfZXJyb3IpOworfQorCitzdGF0aWMgdm9pZCBlNzUyeF9nZXRfZXJyb3JfaW5mbyAoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCSAgc3RydWN0IGU3NTJ4X2Vycm9yX2luZm8gKmluZm8pCit7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlzdHJ1Y3QgZTc1MnhfcHZ0ICpwdnQ7CisKKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisJcHZ0ID0gKHN0cnVjdCBlNzUyeF9wdnQgKikgbWNpLT5wdnRfaW5mbzsKKwlkZXYgPSBwdnQtPmRldl9kMGYxOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgRTc1MlhfRkVSUl9HTE9CQUwsICZpbmZvLT5mZXJyX2dsb2JhbCk7CisKKwlpZiAoaW5mby0+ZmVycl9nbG9iYWwpIHsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBFNzUyWF9ISV9GRVJSLCAmaW5mby0+aGlfZmVycik7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgRTc1MlhfU1lTQlVTX0ZFUlIsCisJCQkJJmluZm8tPnN5c2J1c19mZXJyKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBFNzUyWF9CVUZfRkVSUiwgJmluZm8tPmJ1Zl9mZXJyKTsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBFNzUyWF9EUkFNX0ZFUlIsCisJCQkJJmluZm8tPmRyYW1fZmVycik7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIEU3NTJYX0RSQU1fU0VDMV9BREQsCisJCQkJJmluZm8tPmRyYW1fc2VjMV9hZGQpOworCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIEU3NTJYX0RSQU1fU0VDMV9TWU5EUk9NRSwKKwkJCQkmaW5mby0+ZHJhbV9zZWMxX3N5bmRyb21lKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgRTc1MlhfRFJBTV9ERURfQURELAorCQkJCSZpbmZvLT5kcmFtX2RlZF9hZGQpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBFNzUyWF9EUkFNX1NDUkJfQURELAorCQkJCSZpbmZvLT5kcmFtX3NjcmJfYWRkKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgRTc1MlhfRFJBTV9SRVRSX0FERCwKKwkJCQkmaW5mby0+ZHJhbV9yZXRyX2FkZCk7CisKKwkJaWYgKGluZm8tPmhpX2ZlcnIgJiAweDdmKQorCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgRTc1MlhfSElfRkVSUiwKKwkJCQkJaW5mby0+aGlfZmVycik7CisKKwkJaWYgKGluZm8tPnN5c2J1c19mZXJyKQorCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgRTc1MlhfU1lTQlVTX0ZFUlIsCisJCQkJCWluZm8tPnN5c2J1c19mZXJyKTsKKworCQlpZiAoaW5mby0+YnVmX2ZlcnIgJiAweDBmKQorCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgRTc1MlhfQlVGX0ZFUlIsCisJCQkJCWluZm8tPmJ1Zl9mZXJyKTsKKworCQlpZiAoaW5mby0+ZHJhbV9mZXJyKQorCQkJcGNpX3dyaXRlX2JpdHMxNihwdnQtPmJyaWRnZV9jaywgRTc1MlhfRFJBTV9GRVJSLAorCQkJCQlpbmZvLT5kcmFtX2ZlcnIsIGluZm8tPmRyYW1fZmVycik7CisKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIEU3NTJYX0ZFUlJfR0xPQkFMLAorCQkJCWluZm8tPmZlcnJfZ2xvYmFsKTsKKwl9CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBFNzUyWF9ORVJSX0dMT0JBTCwgJmluZm8tPm5lcnJfZ2xvYmFsKTsKKworCWlmIChpbmZvLT5uZXJyX2dsb2JhbCkgeworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIEU3NTJYX0hJX05FUlIsICZpbmZvLT5oaV9uZXJyKTsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBFNzUyWF9TWVNCVVNfTkVSUiwKKwkJCQkmaW5mby0+c3lzYnVzX25lcnIpOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIEU3NTJYX0JVRl9ORVJSLCAmaW5mby0+YnVmX25lcnIpOworCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIEU3NTJYX0RSQU1fTkVSUiwKKwkJCQkmaW5mby0+ZHJhbV9uZXJyKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgRTc1MlhfRFJBTV9TRUMyX0FERCwKKwkJCQkmaW5mby0+ZHJhbV9zZWMyX2FkZCk7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgRTc1MlhfRFJBTV9TRUMyX1NZTkRST01FLAorCQkJCSZpbmZvLT5kcmFtX3NlYzJfc3luZHJvbWUpOworCisJCWlmIChpbmZvLT5oaV9uZXJyICYgMHg3ZikKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIEU3NTJYX0hJX05FUlIsCisJCQkJCWluZm8tPmhpX25lcnIpOworCisJCWlmIChpbmZvLT5zeXNidXNfbmVycikKKwkJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIEU3NTJYX1NZU0JVU19ORVJSLAorCQkJCQlpbmZvLT5zeXNidXNfbmVycik7CisKKwkJaWYgKGluZm8tPmJ1Zl9uZXJyICYgMHgwZikKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIEU3NTJYX0JVRl9ORVJSLAorCQkJCQlpbmZvLT5idWZfbmVycik7CisKKwkJaWYgKGluZm8tPmRyYW1fbmVycikKKwkJCXBjaV93cml0ZV9iaXRzMTYocHZ0LT5icmlkZ2VfY2ssIEU3NTJYX0RSQU1fTkVSUiwKKwkJCQkJaW5mby0+ZHJhbV9uZXJyLCBpbmZvLT5kcmFtX25lcnIpOworCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBFNzUyWF9ORVJSX0dMT0JBTCwKKwkJCQlpbmZvLT5uZXJyX2dsb2JhbCk7CisJfQorfQorCitzdGF0aWMgaW50IGU3NTJ4X3Byb2Nlc3NfZXJyb3JfaW5mbyAoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQlzdHJ1Y3QgZTc1MnhfZXJyb3JfaW5mbyAqaW5mbywgaW50IGhhbmRsZV9lcnJvcnMpCit7CisJdTMyIGVycm9yMzIsIHN0YXQzMjsKKwlpbnQgZXJyb3JfZm91bmQ7CisKKwllcnJvcl9mb3VuZCA9IDA7CisJZXJyb3IzMiA9IChpbmZvLT5mZXJyX2dsb2JhbCA+PiAxOCkgJiAweDNmZjsKKwlzdGF0MzIgPSAoaW5mby0+ZmVycl9nbG9iYWwgPj4gNCkgJiAweDdmZjsKKworCWlmIChlcnJvcjMyKQorCQlnbG9iYWxfZXJyb3IoMSwgZXJyb3IzMiwgJmVycm9yX2ZvdW5kLCBoYW5kbGVfZXJyb3JzKTsKKworCWlmIChzdGF0MzIpCisJCWdsb2JhbF9lcnJvcigwLCBzdGF0MzIsICZlcnJvcl9mb3VuZCwgaGFuZGxlX2Vycm9ycyk7CisKKwllcnJvcjMyID0gKGluZm8tPm5lcnJfZ2xvYmFsID4+IDE4KSAmIDB4M2ZmOworCXN0YXQzMiA9IChpbmZvLT5uZXJyX2dsb2JhbCA+PiA0KSAmIDB4N2ZmOworCisJaWYgKGVycm9yMzIpCisJCWdsb2JhbF9lcnJvcigxLCBlcnJvcjMyLCAmZXJyb3JfZm91bmQsIGhhbmRsZV9lcnJvcnMpOworCisJaWYgKHN0YXQzMikKKwkJZ2xvYmFsX2Vycm9yKDAsIHN0YXQzMiwgJmVycm9yX2ZvdW5kLCBoYW5kbGVfZXJyb3JzKTsKKworCWU3NTJ4X2NoZWNrX2h1Yl9pbnRlcmZhY2UoaW5mbywgJmVycm9yX2ZvdW5kLCBoYW5kbGVfZXJyb3JzKTsKKwllNzUyeF9jaGVja19zeXNidXMoaW5mbywgJmVycm9yX2ZvdW5kLCBoYW5kbGVfZXJyb3JzKTsKKwllNzUyeF9jaGVja19tZW1idWYoaW5mbywgJmVycm9yX2ZvdW5kLCBoYW5kbGVfZXJyb3JzKTsKKwllNzUyeF9jaGVja19kcmFtKG1jaSwgaW5mbywgJmVycm9yX2ZvdW5kLCBoYW5kbGVfZXJyb3JzKTsKKwlyZXR1cm4gZXJyb3JfZm91bmQ7Cit9CisKK3N0YXRpYyB2b2lkIGU3NTJ4X2NoZWNrKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlzdHJ1Y3QgZTc1MnhfZXJyb3JfaW5mbyBpbmZvOworCWRlYnVnZjMoIk1DOiAiIF9fRklMRV9fICI6ICVzKClcbiIsIF9fZnVuY19fKTsKKwllNzUyeF9nZXRfZXJyb3JfaW5mbyhtY2ksICZpbmZvKTsKKwllNzUyeF9wcm9jZXNzX2Vycm9yX2luZm8obWNpLCAmaW5mbywgMSk7Cit9CisKK3N0YXRpYyBpbnQgZTc1MnhfcHJvYmUxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgZGV2X2lkeCkKK3sKKwlpbnQgcmMgPSAtRU5PREVWOworCWludCBpbmRleDsKKwl1MTYgcGNpX2RhdGEsIHN0YXQ7CisJdTMyIHN0YXQzMjsKKwl1MTYgc3RhdDE2OworCXU4IHN0YXQ4OworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IE5VTEw7CisJc3RydWN0IGU3NTJ4X3B2dCAqcHZ0ID0gTlVMTDsKKwl1MTYgZGRyY3NyOworCXUzMiBkcmM7CisJaW50IGRyY19jaGFuOwkJLyogTnVtYmVyIG9mIGNoYW5uZWxzIDA9MWNoYW4sMT0yY2hhbiAqLworCWludCBkcmNfZHJiZzsJCS8qIERSQiBncmFudWxhcml0eSAwPTY0bWIsMT0xMjhtYiAqLworCWludCBkcmNfZGRpbTsJCS8qIERSQU0gRGF0YSBJbnRlZ3JpdHkgTW9kZSAwPW5vbmUsMj1lZGFjICovCisJdTMyIGRyYTsKKwl1bnNpZ25lZCBsb25nIGxhc3RfY3VtdWxfc2l6ZTsKKwlzdHJ1Y3QgcGNpX2RldiAqcHJlc19kZXY7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CisKKwlkZWJ1Z2YwKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpOiBtY2lcbiIsIF9fZnVuY19fKTsKKwlkZWJ1Z2YwKCJTdGFydGluZyBQcm9iZTFcbiIpOworCisJLyogZW5hYmxlIGRldmljZSAwIGZ1bmN0aW9uIDEgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBFNzUyWF9ERVZQUkVTMSwgJnN0YXQ4KTsKKwlzdGF0OCB8PSAoMSA8PCA1KTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgRTc1MlhfREVWUFJFUzEsIHN0YXQ4KTsKKworCS8qIG5lZWQgdG8gZmluZCBvdXQgdGhlIG51bWJlciBvZiBjaGFubmVscyAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBFNzUyWF9EUkMsICZkcmMpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIEU3NTJYX0REUkNTUiwgJmRkcmNzcik7CisJLyogRklYTUU6IHNob3VsZCBjaGVjayA+PjEyIG9yIDB4ZiwgdHJ1ZSBmb3IgYWxsPyAqLworCS8qIER1YWwgY2hhbm5lbCA9IDEsIFNpbmdsZSBjaGFubmVsID0gMCAqLworCWRyY19jaGFuID0gKCgoZGRyY3NyID4+IDEyKSAmIDMpID09IDMpOworCWRyY19kcmJnID0gZHJjX2NoYW4gKyAxOwkvKiAxMjggaW4gZHVhbCBtb2RlLCA2NCBpbiBzaW5nbGUgKi8KKwlkcmNfZGRpbSA9IChkcmMgPj4gMjApICYgMHgzOworCisJbWNpID0gZWRhY19tY19hbGxvYyhzaXplb2YoKnB2dCksIEU3NTJYX05SX0NTUk9XUywgZHJjX2NoYW4gKyAxKTsKKworCWlmIChtY2kgPT0gTlVMTCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisKKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpOiBpbml0IG1jaVxuIiwgX19mdW5jX18pOworCisJbWNpLT5tdHlwZV9jYXAgPSBNRU1fRkxBR19SRERSOworCW1jaS0+ZWRhY19jdGxfY2FwID0gRURBQ19GTEFHX05PTkUgfCBFREFDX0ZMQUdfU0VDREVEIHwKKwkgICAgRURBQ19GTEFHX1M0RUNENEVEOworCS8qIEZJWE1FIC0gd2hhdCBpZiBkaWZmZXJlbnQgbWVtb3J5IHR5cGVzIGFyZSBpbiBkaWZmZXJlbnQgY3Nyb3dzPyAqLworCW1jaS0+bW9kX25hbWUgPSBCU19NT0RfU1RSOworCW1jaS0+bW9kX3ZlciA9ICIkUmV2aXNpb246IDEuNS4yLjExICQiOworCW1jaS0+cGRldiA9IHBkZXY7CisKKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpOiBpbml0IHB2dFxuIiwgX19mdW5jX18pOworCXB2dCA9IChzdHJ1Y3QgZTc1MnhfcHZ0ICopIG1jaS0+cHZ0X2luZm87CisJcHZ0LT5kZXZfaW5mbyA9ICZlNzUyeF9kZXZzW2Rldl9pZHhdOworCXB2dC0+YnJpZGdlX2NrID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCQkJIHB2dC0+ZGV2X2luZm8tPmVycl9kZXYsCisJCQkJCSBwdnQtPmJyaWRnZV9jayk7CisJaWYgKHB2dC0+YnJpZGdlX2NrID09IE5VTEwpCisJCXB2dC0+YnJpZGdlX2NrID0gcGNpX3NjYW5fc2luZ2xlX2RldmljZShwZGV2LT5idXMsCisJCQkJCQkJUENJX0RFVkZOKDAsIDEpKTsKKwlpZiAocHZ0LT5icmlkZ2VfY2sgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIk1DOiBlcnJvciByZXBvcnRpbmcgZGV2aWNlIG5vdCBmb3VuZDoiCisJCSAgICAgICAidmVuZG9yICV4IGRldmljZSAweCV4IChicm9rZW4gQklPUz8pXG4iLAorCQkgICAgICAgUENJX1ZFTkRPUl9JRF9JTlRFTCwgZTc1MnhfZGV2c1tkZXZfaWR4XS5lcnJfZGV2KTsKKwkJZ290byBmYWlsOworCX0KKwlwdnQtPm1jX3N5bW1ldHJpYyA9ICgoZGRyY3NyICYgMHgxMCkgIT0gMCk7CisKKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpOiBtb3JlIG1jaSBpbml0XG4iLCBfX2Z1bmNfXyk7CisJbWNpLT5jdGxfbmFtZSA9IHB2dC0+ZGV2X2luZm8tPmN0bF9uYW1lOworCW1jaS0+ZWRhY19jaGVjayA9IGU3NTJ4X2NoZWNrOworCW1jaS0+Y3RsX3BhZ2VfdG9fcGh5cyA9IGN0bF9wYWdlX3RvX3BoeXM7CisKKwkvKiBmaW5kIG91dCB0aGUgZGV2aWNlIHR5cGVzICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIEU3NTJYX0RSQSwgJmRyYSk7CisKKwkvKgorCSAqIFRoZSBkcmFtIHJvdyBib3VuZGFyeSAoRFJCKSByZWcgdmFsdWVzIGFyZSBib3VuZGFyeSBhZGRyZXNzIGZvcgorCSAqIGVhY2ggRFJBTSByb3cgd2l0aCBhIGdyYW51bGFyaXR5IG9mIDY0IG9yIDEyOE1CIChzaW5nbGUvZHVhbAorCSAqIGNoYW5uZWwgb3BlcmF0aW9uKS4gIERSQiByZWdzIGFyZSBjdW11bGF0aXZlOyB0aGVyZWZvcmUgRFJCNyB3aWxsCisJICogY29udGFpbiB0aGUgdG90YWwgbWVtb3J5IGNvbnRhaW5lZCBpbiBhbGwgZWlnaHQgcm93cy4KKwkgKi8KKwlmb3IgKGxhc3RfY3VtdWxfc2l6ZSA9IGluZGV4ID0gMDsgaW5kZXggPCBtY2ktPm5yX2Nzcm93czsgaW5kZXgrKykgeworCQl1OCB2YWx1ZTsKKwkJdTMyIGN1bXVsX3NpemU7CisJCS8qIG1lbV9kZXYgMD14OCwgMT14NCAqLworCQlpbnQgbWVtX2RldiA9IChkcmEgPj4gKGluZGV4ICogNCArIDIpKSAmIDB4MzsKKwkJc3RydWN0IGNzcm93X2luZm8gKmNzcm93ID0gJm1jaS0+Y3Nyb3dzW2luZGV4XTsKKworCQltZW1fZGV2ID0gKG1lbV9kZXYgPT0gMik7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKG1jaS0+cGRldiwgRTc1MlhfRFJCICsgaW5kZXgsICZ2YWx1ZSk7CisJCS8qIGNvbnZlcnQgYSAxMjggb3IgNjQgTWlCIERSQiB0byBhIHBhZ2Ugc2l6ZS4gKi8KKwkJY3VtdWxfc2l6ZSA9IHZhbHVlIDw8ICgyNSArIGRyY19kcmJnIC0gUEFHRV9TSElGVCk7CisJCWRlYnVnZjMoIk1DOiAiIF9fRklMRV9fICI6ICVzKCk6ICglZCkgY3VtdWxfc2l6ZSAweCV4XG4iLAorCQkJX19mdW5jX18sIGluZGV4LCBjdW11bF9zaXplKTsKKwkJaWYgKGN1bXVsX3NpemUgPT0gbGFzdF9jdW11bF9zaXplKQorCQkJY29udGludWU7CS8qIG5vdCBwb3B1bGF0ZWQgKi8KKworCQljc3Jvdy0+Zmlyc3RfcGFnZSA9IGxhc3RfY3VtdWxfc2l6ZTsKKwkJY3Nyb3ctPmxhc3RfcGFnZSA9IGN1bXVsX3NpemUgLSAxOworCQljc3Jvdy0+bnJfcGFnZXMgPSBjdW11bF9zaXplIC0gbGFzdF9jdW11bF9zaXplOworCQlsYXN0X2N1bXVsX3NpemUgPSBjdW11bF9zaXplOworCQljc3Jvdy0+Z3JhaW4gPSAxIDw8IDEyOwkvKiA0S2lCIC0gcmVzb2x1dGlvbiBvZiBDRUxPRyAqLworCQljc3Jvdy0+bXR5cGUgPSBNRU1fUkREUjsJLyogb25seSBvbmUgdHlwZSBzdXBwb3J0ZWQgKi8KKwkJY3Nyb3ctPmR0eXBlID0gbWVtX2RldiA/IERFVl9YNCA6IERFVl9YODsKKworCQkvKgorCQkgKiBpZiBzaW5nbGUgY2hhbm5lbCBvciB4OCBkZXZpY2VzIHRoZW4gU0VDREVECisJCSAqIGlmIGR1YWwgY2hhbm5lbCBhbmQgeDQgdGhlbiBTNEVDRDRFRAorCQkgKi8KKwkJaWYgKGRyY19kZGltKSB7CisJCQlpZiAoZHJjX2NoYW4gJiYgbWVtX2RldikgeworCQkJCWNzcm93LT5lZGFjX21vZGUgPSBFREFDX1M0RUNENEVEOworCQkJCW1jaS0+ZWRhY19jYXAgfD0gRURBQ19GTEFHX1M0RUNENEVEOworCQkJfSBlbHNlIHsKKwkJCQljc3Jvdy0+ZWRhY19tb2RlID0gRURBQ19TRUNERUQ7CisJCQkJbWNpLT5lZGFjX2NhcCB8PSBFREFDX0ZMQUdfU0VDREVEOworCQkJfQorCQl9IGVsc2UKKwkJCWNzcm93LT5lZGFjX21vZGUgPSBFREFDX05PTkU7CisJfQorCisJLyogRmlsbCBpbiB0aGUgbWVtb3J5IG1hcCB0YWJsZSAqLworCXsKKwkJdTggdmFsdWU7CisJCXU4IGxhc3QgPSAwOworCQl1OCByb3cgPSAwOworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA4OyBpbmRleCArPSAyKSB7CisKKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKG1jaS0+cGRldiwgRTc1MlhfRFJCICsgaW5kZXgsCisJCQkJCSAgICAgJnZhbHVlKTsKKwkJCS8qIHRlc3QgaWYgdGhlcmUgaXMgYSBkaW1tIGluIHRoaXMgc2xvdCAqLworCQkJaWYgKHZhbHVlID09IGxhc3QpIHsKKwkJCQkvKiBubyBkaW1tIGluIHRoZSBzbG90LCBzbyBmbGFnIGl0IGFzIGVtcHR5ICovCisJCQkJcHZ0LT5tYXBbaW5kZXhdID0gMHhmZjsKKwkJCQlwdnQtPm1hcFtpbmRleCArIDFdID0gMHhmZjsKKwkJCX0gZWxzZSB7CS8qIHRoZXJlIGlzIGEgZGltbSBpbiB0aGUgc2xvdCAqLworCQkJCXB2dC0+bWFwW2luZGV4XSA9IHJvdzsKKwkJCQlyb3crKzsKKwkJCQlsYXN0ID0gdmFsdWU7CisJCQkJLyogdGVzdCB0aGUgbmV4dCB2YWx1ZSB0byBzZWUgaWYgdGhlIGRpbW0gaXMKKwkJCQkgICBkb3VibGUgc2lkZWQgKi8KKwkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShtY2ktPnBkZXYsCisJCQkJCQkgICAgIEU3NTJYX0RSQiArIGluZGV4ICsgMSwKKwkJCQkJCSAgICAgJnZhbHVlKTsKKwkJCQlwdnQtPm1hcFtpbmRleCArIDFdID0gKHZhbHVlID09IGxhc3QpID8KKwkJCQkgICAgMHhmZiA6CS8qIHRoZSBkaW1tIGlzIHNpbmdsZSBzaWRlZCwKKwkJCQkJCSAgIHNvIGZsYWcgYXMgZW1wdHkgKi8KKwkJCQkgICAgcm93OwkvKiB0aGlzIGlzIGEgZG91YmxlIHNpZGVkIGRpbW0KKwkJCQkJCSAgIHRvIHNhdmUgdGhlIG5leHQgcm93ICMgKi8KKwkJCQlyb3crKzsKKwkJCQlsYXN0ID0gdmFsdWU7CisJCQl9CisJCX0KKwl9CisKKwkvKiBzZXQgdGhlIG1hcCB0eXBlLiAgMSA9IG5vcm1hbCwgMCA9IHJldmVyc2VkICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUobWNpLT5wZGV2LCBFNzUyWF9EUk0sICZzdGF0OCk7CisJcHZ0LT5tYXBfdHlwZSA9ICgoc3RhdDggJiAweDBmKSA+ICgoc3RhdDggPj4gNCkgJiAweDBmKSk7CisKKwltY2ktPmVkYWNfY2FwIHw9IEVEQUNfRkxBR19OT05FOworCisJZGVidWdmMygiTUM6ICIgX19GSUxFX18gIjogJXMoKTogdG9sbSwgcmVtYXBiYXNlLCByZW1hcGxpbWl0XG4iLAorCQlfX2Z1bmNfXyk7CisJLyogbG9hZCB0aGUgdG9wIG9mIGxvdyBtZW1vcnksIHJlbWFwIGJhc2UsIGFuZCByZW1hcCBsaW1pdCB2YXJzICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQobWNpLT5wZGV2LCBFNzUyWF9UT0xNLCAmcGNpX2RhdGEpOworCXB2dC0+dG9sbSA9ICgodTMyKSBwY2lfZGF0YSkgPDwgNDsKKwlwY2lfcmVhZF9jb25maWdfd29yZChtY2ktPnBkZXYsIEU3NTJYX1JFTUFQQkFTRSwgJnBjaV9kYXRhKTsKKwlwdnQtPnJlbWFwYmFzZSA9ICgodTMyKSBwY2lfZGF0YSkgPDwgMTQ7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQobWNpLT5wZGV2LCBFNzUyWF9SRU1BUExJTUlULCAmcGNpX2RhdGEpOworCXB2dC0+cmVtYXBsaW1pdCA9ICgodTMyKSBwY2lfZGF0YSkgPDwgMTQ7CisJcHJpbnRrKCJ0b2xtID0gJXgsIHJlbWFwYmFzZSA9ICV4LCByZW1hcGxpbWl0ID0gJXhcbiIsIHB2dC0+dG9sbSwKKwkgICAgICAgcHZ0LT5yZW1hcGJhc2UsIHB2dC0+cmVtYXBsaW1pdCk7CisKKwlpZiAoZWRhY19tY19hZGRfbWMobWNpKSkgeworCQlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXworCQkJIjogJXMoKTogZmFpbGVkIGVkYWNfbWNfYWRkX21jKClcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBXYWxrIHRocm91Z2ggdGhlIFBDSSB0YWJsZSBhbmQgY2xlYXIgZXJyb3JzICovCisJc3dpdGNoIChkZXZfaWR4KSB7CisJY2FzZSBFNzUyMDoKKwkJZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCQkgICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMXzc1MjBfMCwgTlVMTCk7CisJCWJyZWFrOworCWNhc2UgRTc1MjU6CisJCWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCisJCQkJICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF83NTI1XzAsIE5VTEwpOworCQlicmVhazsKKwljYXNlIEU3MzIwOgorCQlkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfNzMyMF8wLCBOVUxMKTsKKwkJYnJlYWs7CisJfQorCisKKwlwdnQtPmRldl9kMGYwID0gZGV2OworCWZvciAocHJlc19kZXYgPSBkZXY7CisJICAgICAoKHN0cnVjdCBwY2lfZGV2ICopIHByZXNfZGV2LT5nbG9iYWxfbGlzdC5uZXh0ICE9IGRldik7CisJICAgICBwcmVzX2RldiA9IChzdHJ1Y3QgcGNpX2RldiAqKSBwcmVzX2Rldi0+Z2xvYmFsX2xpc3QubmV4dCkgeworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocHJlc19kZXYsIFBDSV9DT01NQU5ELCAmc3RhdDMyKTsKKwkJc3RhdCA9ICh1MTYpIChzdGF0MzIgPj4gMTYpOworCQkvKiBjbGVhciBhbnkgZXJyb3IgYml0cyAqLworCQlpZiAoc3RhdDMyICYgKCgxIDw8IDYpICsgKDEgPDwgOCkpKQorCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHByZXNfZGV2LCBQQ0lfU1RBVFVTLCBzdGF0KTsKKwl9CisJLyogZmluZCB0aGUgZXJyb3IgcmVwb3J0aW5nIGRldmljZSBhbmQgY2xlYXIgZXJyb3JzICovCisJZGV2ID0gcHZ0LT5kZXZfZDBmMSA9IHBjaV9kZXZfZ2V0KHB2dC0+YnJpZGdlX2NrKTsKKwkvKiBUdXJuIG9mZiBlcnJvciBkaXNhYmxlICYgU01JIGluIGNhc2UgdGhlIEJJT1MgdHVybmVkIGl0IG9uICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgRTc1MlhfSElfRVJSTUFTSywgMHgwMCk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgRTc1MlhfSElfU01JQ01ELCAweDAwKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBFNzUyWF9TWVNCVVNfRVJSTUFTSywgMHgwMCk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgRTc1MlhfU1lTQlVTX1NNSUNNRCwgMHgwMCk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgRTc1MlhfQlVGX0VSUk1BU0ssIDB4MDApOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIEU3NTJYX0JVRl9TTUlDTUQsIDB4MDApOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIEU3NTJYX0RSQU1fRVJSTUFTSywgMHgwMCk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgRTc1MlhfRFJBTV9TTUlDTUQsIDB4MDApOworCS8qIGNsZWFyIG90aGVyIE1DSCBlcnJvcnMgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBFNzUyWF9GRVJSX0dMT0JBTCwgJnN0YXQzMik7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIEU3NTJYX0ZFUlJfR0xPQkFMLCBzdGF0MzIpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIEU3NTJYX05FUlJfR0xPQkFMLCAmc3RhdDMyKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgRTc1MlhfTkVSUl9HTE9CQUwsIHN0YXQzMik7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBFNzUyWF9ISV9GRVJSLCAmc3RhdDgpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIEU3NTJYX0hJX0ZFUlIsIHN0YXQ4KTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIEU3NTJYX0hJX05FUlIsICZzdGF0OCk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgRTc1MlhfSElfTkVSUiwgc3RhdDgpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIEU3NTJYX1NZU0JVU19GRVJSLCAmc3RhdDMyKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgRTc1MlhfU1lTQlVTX0ZFUlIsIHN0YXQzMik7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBFNzUyWF9CVUZfRkVSUiwgJnN0YXQ4KTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBFNzUyWF9CVUZfRkVSUiwgc3RhdDgpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgRTc1MlhfQlVGX05FUlIsICZzdGF0OCk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgRTc1MlhfQlVGX05FUlIsIHN0YXQ4KTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIEU3NTJYX0RSQU1fRkVSUiwgJnN0YXQxNik7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgRTc1MlhfRFJBTV9GRVJSLCBzdGF0MTYpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgRTc1MlhfRFJBTV9ORVJSLCAmc3RhdDE2KTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBFNzUyWF9EUkFNX05FUlIsIHN0YXQxNik7CisKKwkvKiBnZXQgdGhpcyBmYXIgYW5kIGl0J3Mgc3VjY2Vzc2Z1bCAqLworCWRlYnVnZjMoIk1DOiAiIF9fRklMRV9fICI6ICVzKCk6IHN1Y2Nlc3NcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlpZiAobWNpKSB7CisJCWlmIChwdnQtPmRldl9kMGYwKQorCQkJcGNpX2Rldl9wdXQocHZ0LT5kZXZfZDBmMCk7CisJCWlmIChwdnQtPmRldl9kMGYxKQorCQkJcGNpX2Rldl9wdXQocHZ0LT5kZXZfZDBmMSk7CisJCWlmIChwdnQtPmJyaWRnZV9jaykKKwkJCXBjaV9kZXZfcHV0KHB2dC0+YnJpZGdlX2NrKTsKKwkJZWRhY19tY19mcmVlKG1jaSk7CisJfQorCXJldHVybiByYzsKK30KKworLyogcmV0dXJucyBjb3VudCAoPj0gMCksIG9yIG5lZ2F0aXZlIG9uIGVycm9yICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlNzUyeF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlkZWJ1Z2YwKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiB3YWtlIHVwIGFuZCBlbmFibGUgZGV2aWNlICovCisJaWYocGNpX2VuYWJsZV9kZXZpY2UocGRldikgPCAwKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gZTc1MnhfcHJvYmUxKHBkZXYsIGVudC0+ZHJpdmVyX2RhdGEpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBlNzUyeF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaTsKKwlzdHJ1Y3QgZTc1MnhfcHZ0ICpwdnQ7CisKKwlkZWJ1Z2YwKF9fRklMRV9fICI6ICVzKClcbiIsIF9fZnVuY19fKTsKKworCWlmICgobWNpID0gZWRhY19tY19maW5kX21jaV9ieV9wZGV2KHBkZXYpKSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoZWRhY19tY19kZWxfbWMobWNpKSkKKwkJcmV0dXJuOworCisJcHZ0ID0gKHN0cnVjdCBlNzUyeF9wdnQgKikgbWNpLT5wdnRfaW5mbzsKKwlwY2lfZGV2X3B1dChwdnQtPmRldl9kMGYwKTsKKwlwY2lfZGV2X3B1dChwdnQtPmRldl9kMGYxKTsKKwlwY2lfZGV2X3B1dChwdnQtPmJyaWRnZV9jayk7CisJZWRhY19tY19mcmVlKG1jaSk7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGU3NTJ4X3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0geworCXtQQ0lfVkVORF9ERVYoSU5URUwsIDc1MjBfMCksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJIEU3NTIwfSwKKwl7UENJX1ZFTkRfREVWKElOVEVMLCA3NTI1XzApLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCSBFNzUyNX0sCisJe1BDSV9WRU5EX0RFVihJTlRFTCwgNzMyMF8wKSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgRTczMjB9LAorCXswLH0JCQkvKiAwIHRlcm1pbmF0ZWQgbGlzdC4gKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBlNzUyeF9wY2lfdGJsKTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZTc1MnhfZHJpdmVyID0geworICAgICAgbmFtZTogQlNfTU9EX1NUUiwKKyAgICAgIHByb2JlOiBlNzUyeF9pbml0X29uZSwKKyAgICAgIHJlbW92ZTogX19kZXZleGl0X3AoZTc1MnhfcmVtb3ZlX29uZSksCisgICAgICBpZF90YWJsZTogZTc1MnhfcGNpX3RibCwKK307CisKKworc3RhdGljIGludCBfX2luaXQgZTc1MnhfaW5pdCh2b2lkKQoreworCWludCBwY2lfcmM7CisKKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisJcGNpX3JjID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZTc1MnhfZHJpdmVyKTsKKwlyZXR1cm4gKHBjaV9yYyA8IDApID8gcGNpX3JjIDogMDsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgZTc1MnhfZXhpdCh2b2lkKQoreworCWRlYnVnZjMoIk1DOiAiIF9fRklMRV9fICI6ICVzKClcbiIsIF9fZnVuY19fKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmU3NTJ4X2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQoZTc1MnhfaW5pdCk7Cittb2R1bGVfZXhpdChlNzUyeF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTGludXggTmV0d29yeCAoaHR0cDovL2xueGkuY29tKSBUb20gWmltbWVybWFuXG4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUMgc3VwcG9ydCBmb3IgSW50ZWwgZTc1MnggbWVtb3J5IGNvbnRyb2xsZXJzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZTd4eHhfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2U3eHh4X2VkYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWUzMjBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9lZGFjL2U3eHh4X2VkYWMuYwpAQCAtMCwwICsxLDU1OCBAQAorLyoKKyAqIEludGVsIGU3eHh4IE1lbW9yeSBDb250cm9sbGVyIGtlcm5lbCBtb2R1bGUKKyAqIChDKSAyMDAzIExpbnV4IE5ldHdvcnggKGh0dHA6Ly9sbnhpLmNvbSkKKyAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogU2VlICJlbnVtIGU3eHh4X2NoaXBzIiBiZWxvdyBmb3Igc3VwcG9ydGVkIGNoaXBzZXRzCisgKgorICogV3JpdHRlbiBieSBUaGF5bmUgSGFyYmF1Z2gKKyAqIEJhc2VkIG9uIHdvcmsgYnkgRGFuIEhvbGxpcyA8Z29lbW9uIGF0IGFuaW1lIGRvdCBuZXQ+IGFuZCBvdGhlcnMuCisgKglodHRwOi8vd3d3LmFuaW1lLm5ldC9+Z29lbW9uL2xpbnV4LWVjYy8KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAJRXJpYyBCaWVkZXJtYW4gKExpbnV4IE5ldHdvcngpCisgKiAJVG9tIFppbW1lcm1hbiAoTGludXggTmV0d29yeCkKKyAqIAlKaW0gR2FybGljayAoTGF3cmVuY2UgTGl2ZXJtb3JlIE5hdGlvbmFsIExhYnMpCisgKglEYXZlIFBldGVyc29uIChMYXdyZW5jZSBMaXZlcm1vcmUgTmF0aW9uYWwgTGFicykKKyAqCVRoYXQgT25lIEd1eSAoU29tZSBvdGhlciBwbGFjZSkKKyAqCVdhbmcgWmhlbnl1IChpbnRlbC5jb20pCisgKgorICogJElkOiBlZGFjX2U3eHh4LmMsdiAxLjUuMi45IDIwMDUvMTAvMDUgMDA6NDM6NDQgZHNwX2xsbmwgRXhwICQKKyAqCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSAiZWRhY19tYy5oIgorCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9JTlRFTF83MjA1XzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF83MjA1XzAJMHgyNTVkCisjZW5kaWYJCQkJLyogUENJX0RFVklDRV9JRF9JTlRFTF83MjA1XzAgKi8KKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0lOVEVMXzcyMDVfMV9FUlIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF83MjA1XzFfRVJSCTB4MjU1MQorI2VuZGlmCQkJCS8qIFBDSV9ERVZJQ0VfSURfSU5URUxfNzIwNV8xX0VSUiAqLworCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfSU5URUxfNzUwMF8wCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfNzUwMF8wCTB4MjU0MAorI2VuZGlmCQkJCS8qIFBDSV9ERVZJQ0VfSURfSU5URUxfNzUwMF8wICovCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9JTlRFTF83NTAwXzFfRVJSCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfNzUwMF8xX0VSUgkweDI1NDEKKyNlbmRpZgkJCQkvKiBQQ0lfREVWSUNFX0lEX0lOVEVMXzc1MDBfMV9FUlIgKi8KKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0lOVEVMXzc1MDFfMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzc1MDFfMAkweDI1NGMKKyNlbmRpZgkJCQkvKiBQQ0lfREVWSUNFX0lEX0lOVEVMXzc1MDFfMCAqLworCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfSU5URUxfNzUwMV8xX0VSUgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzc1MDFfMV9FUlIJMHgyNTQxCisjZW5kaWYJCQkJLyogUENJX0RFVklDRV9JRF9JTlRFTF83NTAxXzFfRVJSICovCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9JTlRFTF83NTA1XzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF83NTA1XzAJMHgyNTUwCisjZW5kaWYJCQkJLyogUENJX0RFVklDRV9JRF9JTlRFTF83NTA1XzAgKi8KKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0lOVEVMXzc1MDVfMV9FUlIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF83NTA1XzFfRVJSCTB4MjU1MQorI2VuZGlmCQkJCS8qIFBDSV9ERVZJQ0VfSURfSU5URUxfNzUwNV8xX0VSUiAqLworCisKKyNkZWZpbmUgRTdYWFhfTlJfQ1NST1dTCQk4CS8qIG51bWJlciBvZiBjc3Jvd3MgKi8KKyNkZWZpbmUgRTdYWFhfTlJfRElNTVMJCTgJLyogRklYTUUgLSBpcyB0aGlzIGNvcnJlY3Q/ICovCisKKworLyogRTdYWFggcmVnaXN0ZXIgYWRkcmVzc2VzIC0gZGV2aWNlIDAgZnVuY3Rpb24gMCAqLworI2RlZmluZSBFN1hYWF9EUkIJCTB4NjAJLyogRFJBTSByb3cgYm91bmRhcnkgcmVnaXN0ZXIgKDhiKSAqLworI2RlZmluZSBFN1hYWF9EUkEJCTB4NzAJLyogRFJBTSByb3cgYXR0cmlidXRlIHJlZ2lzdGVyICg4YikgKi8KKwkJCQkJLyoKKwkJCQkJICogMzEgICBEZXZpY2Ugd2lkdGggcm93IDcgMD14OCAxPXg0CisJCQkJCSAqIDI3ICAgRGV2aWNlIHdpZHRoIHJvdyA2CisJCQkJCSAqIDIzICAgRGV2aWNlIHdpZHRoIHJvdyA1CisJCQkJCSAqIDE5ICAgRGV2aWNlIHdpZHRoIHJvdyA0CisJCQkJCSAqIDE1ICAgRGV2aWNlIHdpZHRoIHJvdyAzCisJCQkJCSAqIDExICAgRGV2aWNlIHdpZHRoIHJvdyAyCisJCQkJCSAqICA3ICAgRGV2aWNlIHdpZHRoIHJvdyAxCisJCQkJCSAqICAzICAgRGV2aWNlIHdpZHRoIHJvdyAwCisJCQkJCSAqLworI2RlZmluZSBFN1hYWF9EUkMJCTB4N0MJLyogRFJBTSBjb250cm9sbGVyIG1vZGUgcmVnICgzMmIpICovCisJCQkJCS8qCisJCQkJCSAqIDIyICAgIE51bWJlciBjaGFubmVscyAwPTEsMT0yCisJCQkJCSAqIDE5OjE4IERSQiBHcmFudWxhcml0eSAzMi82NE1CCisJCQkJCSAqLworI2RlZmluZSBFN1hYWF9UT0xNCQkweEM0CS8qIERSQU0gdG9wIG9mIGxvdyBtZW1vcnkgcmVnICgxNmIpICovCisjZGVmaW5lIEU3WFhYX1JFTUFQQkFTRQkJMHhDNgkvKiBEUkFNIHJlbWFwIGJhc2UgYWRkcmVzcyByZWcgKDE2YikgKi8KKyNkZWZpbmUgRTdYWFhfUkVNQVBMSU1JVAkweEM4CS8qIERSQU0gcmVtYXAgbGltaXQgYWRkcmVzcyByZWcgKDE2YikgKi8KKworLyogRTdYWFggcmVnaXN0ZXIgYWRkcmVzc2VzIC0gZGV2aWNlIDAgZnVuY3Rpb24gMSAqLworI2RlZmluZSBFN1hYWF9EUkFNX0ZFUlIJCTB4ODAJLyogRFJBTSBmaXJzdCBlcnJvciByZWdpc3RlciAoOGIpICovCisjZGVmaW5lIEU3WFhYX0RSQU1fTkVSUgkJMHg4MgkvKiBEUkFNIG5leHQgZXJyb3IgcmVnaXN0ZXIgKDhiKSAqLworI2RlZmluZSBFN1hYWF9EUkFNX0NFTE9HX0FERAkweEEwCS8qIERSQU0gZmlyc3QgY29ycmVjdGFibGUgbWVtb3J5ICovCisJCQkJCS8qICAgICBlcnJvciBhZGRyZXNzIHJlZ2lzdGVyICgzMmIpICovCisJCQkJCS8qCisJCQkJCSAqIDMxOjI4IFJlc2VydmVkCisJCQkJCSAqIDI3OjYgIENFIGFkZHJlc3MgKDRrIGJsb2NrIDMzOjEyKQorCQkJCQkgKiAgNTowICBSZXNlcnZlZAorCQkJCQkgKi8KKyNkZWZpbmUgRTdYWFhfRFJBTV9VRUxPR19BREQJMHhCMAkvKiBEUkFNIGZpcnN0IHVuY29ycmVjdGFibGUgbWVtb3J5ICovCisJCQkJCS8qICAgICBlcnJvciBhZGRyZXNzIHJlZ2lzdGVyICgzMmIpICovCisJCQkJCS8qCisJCQkJCSAqIDMxOjI4IFJlc2VydmVkCisJCQkJCSAqIDI3OjYgIENFIGFkZHJlc3MgKDRrIGJsb2NrIDMzOjEyKQorCQkJCQkgKiAgNTowICBSZXNlcnZlZAorCQkJCQkgKi8KKyNkZWZpbmUgRTdYWFhfRFJBTV9DRUxPR19TWU5EUk9NRSAweEQwCS8qIERSQU0gZmlyc3QgY29ycmVjdGFibGUgbWVtb3J5ICovCisJCQkJCS8qICAgICBlcnJvciBzeW5kcm9tZSByZWdpc3RlciAoMTZiKSAqLworCitlbnVtIGU3eHh4X2NoaXBzIHsKKwlFNzUwMCA9IDAsCisJRTc1MDEsCisJRTc1MDUsCisJRTcyMDUsCit9OworCisKK3N0cnVjdCBlN3h4eF9wdnQgeworCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2VfY2s7CisJdTMyIHRvbG07CisJdTMyIHJlbWFwYmFzZTsKKwl1MzIgcmVtYXBsaW1pdDsKKwljb25zdCBzdHJ1Y3QgZTd4eHhfZGV2X2luZm8gKmRldl9pbmZvOworfTsKKworCitzdHJ1Y3QgZTd4eHhfZGV2X2luZm8geworCXUxNiBlcnJfZGV2OworCWNvbnN0IGNoYXIgKmN0bF9uYW1lOworfTsKKworCitzdHJ1Y3QgZTd4eHhfZXJyb3JfaW5mbyB7CisJdTggZHJhbV9mZXJyOworCXU4IGRyYW1fbmVycjsKKwl1MzIgZHJhbV9jZWxvZ19hZGQ7CisJdTE2IGRyYW1fY2Vsb2dfc3luZHJvbWU7CisJdTMyIGRyYW1fdWVsb2dfYWRkOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlN3h4eF9kZXZfaW5mbyBlN3h4eF9kZXZzW10gPSB7CisJW0U3NTAwXSA9IHsKKwkJICAgLmVycl9kZXYgPSBQQ0lfREVWSUNFX0lEX0lOVEVMXzc1MDBfMV9FUlIsCisJCSAgIC5jdGxfbmFtZSA9ICJFNzUwMCJ9LAorCVtFNzUwMV0gPSB7CisJCSAgIC5lcnJfZGV2ID0gUENJX0RFVklDRV9JRF9JTlRFTF83NTAxXzFfRVJSLAorCQkgICAuY3RsX25hbWUgPSAiRTc1MDEifSwKKwlbRTc1MDVdID0geworCQkgICAuZXJyX2RldiA9IFBDSV9ERVZJQ0VfSURfSU5URUxfNzUwNV8xX0VSUiwKKwkJICAgLmN0bF9uYW1lID0gIkU3NTA1In0sCisJW0U3MjA1XSA9IHsKKwkJICAgLmVycl9kZXYgPSBQQ0lfREVWSUNFX0lEX0lOVEVMXzcyMDVfMV9FUlIsCisJCSAgIC5jdGxfbmFtZSA9ICJFNzIwNSJ9LAorfTsKKworCisvKiBGSVhNRSAtIGlzIHRoaXMgdmFsaWQgZm9yIGJvdGggU0VDREVEIGFuZCBTNEVDRDRFRD8gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGU3eHh4X2ZpbmRfY2hhbm5lbCh1MTYgc3luZHJvbWUpCit7CisJZGVidWdmMygiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCisJaWYgKChzeW5kcm9tZSAmIDB4ZmYwMCkgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKChzeW5kcm9tZSAmIDB4MDBmZikgPT0gMCkKKwkJcmV0dXJuIDE7CisJaWYgKChzeW5kcm9tZSAmIDB4ZjAwMCkgPT0gMCB8fCAoc3luZHJvbWUgJiAweDBmMDApID09IDApCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitjdGxfcGFnZV90b19waHlzKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgdW5zaWduZWQgbG9uZyBwYWdlKQoreworCXUzMiByZW1hcDsKKwlzdHJ1Y3QgZTd4eHhfcHZ0ICpwdnQgPSAoc3RydWN0IGU3eHh4X3B2dCAqKSBtY2ktPnB2dF9pbmZvOworCisJZGVidWdmMygiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCisJaWYgKChwYWdlIDwgcHZ0LT50b2xtKSB8fAorCSAgICAoKHBhZ2UgPj0gMHgxMDAwMDApICYmIChwYWdlIDwgcHZ0LT5yZW1hcGJhc2UpKSkKKwkJcmV0dXJuIHBhZ2U7CisJcmVtYXAgPSAocGFnZSAtIHB2dC0+dG9sbSkgKyBwdnQtPnJlbWFwYmFzZTsKKwlpZiAocmVtYXAgPCBwdnQtPnJlbWFwbGltaXQpCisJCXJldHVybiByZW1hcDsKKwlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgcGFnZSAlbHggLSBvdXQgb2YgcmFuZ2VcbiIsIHBhZ2UpOworCXJldHVybiBwdnQtPnRvbG0gLSAxOworfQorCisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfY2Uoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLCBzdHJ1Y3QgZTd4eHhfZXJyb3JfaW5mbyAqaW5mbykKK3sKKwl1MzIgZXJyb3JfMWIsIHBhZ2U7CisJdTE2IHN5bmRyb21lOworCWludCByb3c7CisJaW50IGNoYW5uZWw7CisKKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiByZWFkIHRoZSBlcnJvciBhZGRyZXNzICovCisJZXJyb3JfMWIgPSBpbmZvLT5kcmFtX2NlbG9nX2FkZDsKKwkvKiBGSVhNRSAtIHNob3VsZCB1c2UgUEFHRV9TSElGVCAqLworCXBhZ2UgPSBlcnJvcl8xYiA+PiA2OwkvKiBjb252ZXJ0IHRoZSBhZGRyZXNzIHRvIDRrIHBhZ2UgKi8KKwkvKiByZWFkIHRoZSBzeW5kcm9tZSAqLworCXN5bmRyb21lID0gaW5mby0+ZHJhbV9jZWxvZ19zeW5kcm9tZTsKKwkvKiBGSVhNRSAtIGNoZWNrIGZvciAtMSAqLworCXJvdyA9IGVkYWNfbWNfZmluZF9jc3Jvd19ieV9wYWdlKG1jaSwgcGFnZSk7CisJLyogY29udmVydCBzeW5kcm9tZSB0byBjaGFubmVsICovCisJY2hhbm5lbCA9IGU3eHh4X2ZpbmRfY2hhbm5lbChzeW5kcm9tZSk7CisJZWRhY19tY19oYW5kbGVfY2UobWNpLCBwYWdlLCAwLCBzeW5kcm9tZSwgcm93LCBjaGFubmVsLAorCQkJICAgICAgICJlN3h4eCBDRSIpOworfQorCisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfY2Vfbm9faW5mbyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJZGVidWdmMygiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCWVkYWNfbWNfaGFuZGxlX2NlX25vX2luZm8obWNpLCAiZTd4eHggQ0UgbG9nIHJlZ2lzdGVyIG92ZXJmbG93Iik7Cit9CisKKworc3RhdGljIHZvaWQgcHJvY2Vzc191ZShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIHN0cnVjdCBlN3h4eF9lcnJvcl9pbmZvICppbmZvKQoreworCXUzMiBlcnJvcl8yYiwgYmxvY2tfcGFnZTsKKwlpbnQgcm93OworCisJZGVidWdmMygiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCisJLyogcmVhZCB0aGUgZXJyb3IgYWRkcmVzcyAqLworCWVycm9yXzJiID0gaW5mby0+ZHJhbV91ZWxvZ19hZGQ7CisJLyogRklYTUUgLSBzaG91bGQgdXNlIFBBR0VfU0hJRlQgKi8KKwlibG9ja19wYWdlID0gZXJyb3JfMmIgPj4gNjsJLyogY29udmVydCB0byA0ayBhZGRyZXNzICovCisJcm93ID0gZWRhY19tY19maW5kX2Nzcm93X2J5X3BhZ2UobWNpLCBibG9ja19wYWdlKTsKKwllZGFjX21jX2hhbmRsZV91ZShtY2ksIGJsb2NrX3BhZ2UsIDAsIHJvdywgImU3eHh4IFVFIik7Cit9CisKKworc3RhdGljIHZvaWQgcHJvY2Vzc191ZV9ub19pbmZvKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisJZWRhY19tY19oYW5kbGVfdWVfbm9faW5mbyhtY2ksICJlN3h4eCBVRSBsb2cgcmVnaXN0ZXIgb3ZlcmZsb3ciKTsKK30KKworCitzdGF0aWMgdm9pZCBlN3h4eF9nZXRfZXJyb3JfaW5mbyAoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQlzdHJ1Y3QgZTd4eHhfZXJyb3JfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZTd4eHhfcHZ0ICpwdnQ7CisKKwlwdnQgPSAoc3RydWN0IGU3eHh4X3B2dCAqKSBtY2ktPnB2dF9pbmZvOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHB2dC0+YnJpZGdlX2NrLCBFN1hYWF9EUkFNX0ZFUlIsCisJICAgICZpbmZvLT5kcmFtX2ZlcnIpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHB2dC0+YnJpZGdlX2NrLCBFN1hYWF9EUkFNX05FUlIsCisJICAgICZpbmZvLT5kcmFtX25lcnIpOworCisJaWYgKChpbmZvLT5kcmFtX2ZlcnIgJiAxKSB8fCAoaW5mby0+ZHJhbV9uZXJyICYgMSkpIHsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+YnJpZGdlX2NrLCBFN1hYWF9EUkFNX0NFTE9HX0FERCwKKwkJICAgICZpbmZvLT5kcmFtX2NlbG9nX2FkZCk7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHB2dC0+YnJpZGdlX2NrLAorCQkgICAgRTdYWFhfRFJBTV9DRUxPR19TWU5EUk9NRSwgJmluZm8tPmRyYW1fY2Vsb2dfc3luZHJvbWUpOworCX0KKworCWlmICgoaW5mby0+ZHJhbV9mZXJyICYgMikgfHwgKGluZm8tPmRyYW1fbmVyciAmIDIpKQorCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5icmlkZ2VfY2ssIEU3WFhYX0RSQU1fVUVMT0dfQURELAorCQkgICAgJmluZm8tPmRyYW1fdWVsb2dfYWRkKTsKKworCWlmIChpbmZvLT5kcmFtX2ZlcnIgJiAzKQorCQlwY2lfd3JpdGVfYml0czgocHZ0LT5icmlkZ2VfY2ssIEU3WFhYX0RSQU1fRkVSUiwgMHgwMywKKwkJICAgIDB4MDMpOworCisJaWYgKGluZm8tPmRyYW1fbmVyciAmIDMpCisJCXBjaV93cml0ZV9iaXRzOChwdnQtPmJyaWRnZV9jaywgRTdYWFhfRFJBTV9ORVJSLCAweDAzLAorCQkgICAgMHgwMyk7Cit9CisKKworc3RhdGljIGludCBlN3h4eF9wcm9jZXNzX2Vycm9yX2luZm8gKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJc3RydWN0IGU3eHh4X2Vycm9yX2luZm8gKmluZm8sIGludCBoYW5kbGVfZXJyb3JzKQoreworCWludCBlcnJvcl9mb3VuZDsKKworCWVycm9yX2ZvdW5kID0gMDsKKworCS8qIGRlY29kZSBhbmQgcmVwb3J0IGVycm9ycyAqLworCWlmIChpbmZvLT5kcmFtX2ZlcnIgJiAxKSB7CS8qIGNoZWNrIGZpcnN0IGVycm9yIGNvcnJlY3RhYmxlICovCisJCWVycm9yX2ZvdW5kID0gMTsKKworCQlpZiAoaGFuZGxlX2Vycm9ycykKKwkJCXByb2Nlc3NfY2UobWNpLCBpbmZvKTsKKwl9CisKKwlpZiAoaW5mby0+ZHJhbV9mZXJyICYgMikgewkvKiBjaGVjayBmaXJzdCBlcnJvciB1bmNvcnJlY3RhYmxlICovCisJCWVycm9yX2ZvdW5kID0gMTsKKworCQlpZiAoaGFuZGxlX2Vycm9ycykKKwkJCXByb2Nlc3NfdWUobWNpLCBpbmZvKTsKKwl9CisKKwlpZiAoaW5mby0+ZHJhbV9uZXJyICYgMSkgewkvKiBjaGVjayBuZXh0IGVycm9yIGNvcnJlY3RhYmxlICovCisJCWVycm9yX2ZvdW5kID0gMTsKKworCQlpZiAoaGFuZGxlX2Vycm9ycykgeworCQkJaWYgKGluZm8tPmRyYW1fZmVyciAmIDEpCisJCQkJcHJvY2Vzc19jZV9ub19pbmZvKG1jaSk7CisJCQllbHNlCisJCQkJcHJvY2Vzc19jZShtY2ksIGluZm8pOworCQl9CisJfQorCisJaWYgKGluZm8tPmRyYW1fbmVyciAmIDIpIHsJLyogY2hlY2sgbmV4dCBlcnJvciB1bmNvcnJlY3RhYmxlICovCisJCWVycm9yX2ZvdW5kID0gMTsKKworCQlpZiAoaGFuZGxlX2Vycm9ycykgeworCQkJaWYgKGluZm8tPmRyYW1fZmVyciAmIDIpCisJCQkJcHJvY2Vzc191ZV9ub19pbmZvKG1jaSk7CisJCQllbHNlCisJCQkJcHJvY2Vzc191ZShtY2ksIGluZm8pOworCQl9CisJfQorCisJcmV0dXJuIGVycm9yX2ZvdW5kOworfQorCisKK3N0YXRpYyB2b2lkIGU3eHh4X2NoZWNrKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlzdHJ1Y3QgZTd4eHhfZXJyb3JfaW5mbyBpbmZvOworCisJZGVidWdmMygiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCWU3eHh4X2dldF9lcnJvcl9pbmZvKG1jaSwgJmluZm8pOworCWU3eHh4X3Byb2Nlc3NfZXJyb3JfaW5mbyhtY2ksICZpbmZvLCAxKTsKK30KKworCitzdGF0aWMgaW50IGU3eHh4X3Byb2JlMShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGRldl9pZHgpCit7CisJaW50IHJjID0gLUVOT0RFVjsKKwlpbnQgaW5kZXg7CisJdTE2IHBjaV9kYXRhOworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IE5VTEw7CisJc3RydWN0IGU3eHh4X3B2dCAqcHZ0ID0gTlVMTDsKKwl1MzIgZHJjOworCWludCBkcmNfY2hhbiA9IDE7CS8qIE51bWJlciBvZiBjaGFubmVscyAwPTFjaGFuLDE9MmNoYW4gKi8KKwlpbnQgZHJjX2RyYmcgPSAxOwkvKiBEUkIgZ3JhbnVsYXJpdHkgMD0zMm1iLDE9NjRtYiAqLworCWludCBkcmNfZGRpbTsJCS8qIERSQU0gRGF0YSBJbnRlZ3JpdHkgTW9kZSAwPW5vbmUsMj1lZGFjICovCisJdTMyIGRyYTsKKwl1bnNpZ25lZCBsb25nIGxhc3RfY3VtdWxfc2l6ZTsKKworCisJZGVidWdmMCgiTUM6ICIgX19GSUxFX18gIjogJXMoKTogbWNpXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBuZWVkIHRvIGZpbmQgb3V0IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgRTdYWFhfRFJDLCAmZHJjKTsKKwkvKiBvbmx5IGU3NTAxIGNhbiBiZSBzaW5nbGUgY2hhbm5lbCAqLworCWlmIChkZXZfaWR4ID09IEU3NTAxKSB7CisJCWRyY19jaGFuID0gKChkcmMgPj4gMjIpICYgMHgxKTsKKwkJZHJjX2RyYmcgPSAoZHJjID4+IDE4KSAmIDB4MzsKKwl9CisJZHJjX2RkaW0gPSAoZHJjID4+IDIwKSAmIDB4MzsKKworCW1jaSA9IGVkYWNfbWNfYWxsb2Moc2l6ZW9mKCpwdnQpLCBFN1hYWF9OUl9DU1JPV1MsIGRyY19jaGFuICsgMSk7CisKKwlpZiAobWNpID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJZGVidWdmMygiTUM6ICIgX19GSUxFX18gIjogJXMoKTogaW5pdCBtY2lcbiIsIF9fZnVuY19fKTsKKworCW1jaS0+bXR5cGVfY2FwID0gTUVNX0ZMQUdfUkREUjsKKwltY2ktPmVkYWNfY3RsX2NhcCA9CisJICAgIEVEQUNfRkxBR19OT05FIHwgRURBQ19GTEFHX1NFQ0RFRCB8IEVEQUNfRkxBR19TNEVDRDRFRDsKKwkvKiBGSVhNRSAtIHdoYXQgaWYgZGlmZmVyZW50IG1lbW9yeSB0eXBlcyBhcmUgaW4gZGlmZmVyZW50IGNzcm93cz8gKi8KKwltY2ktPm1vZF9uYW1lID0gQlNfTU9EX1NUUjsKKwltY2ktPm1vZF92ZXIgPSAiJFJldmlzaW9uOiAxLjUuMi45ICQiOworCW1jaS0+cGRldiA9IHBkZXY7CisKKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpOiBpbml0IHB2dFxuIiwgX19mdW5jX18pOworCXB2dCA9IChzdHJ1Y3QgZTd4eHhfcHZ0ICopIG1jaS0+cHZ0X2luZm87CisJcHZ0LT5kZXZfaW5mbyA9ICZlN3h4eF9kZXZzW2Rldl9pZHhdOworCXB2dC0+YnJpZGdlX2NrID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCQkJIHB2dC0+ZGV2X2luZm8tPmVycl9kZXYsCisJCQkJCSBwdnQtPmJyaWRnZV9jayk7CisJaWYgKCFwdnQtPmJyaWRnZV9jaykgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJNQzogZXJyb3IgcmVwb3J0aW5nIGRldmljZSBub3QgZm91bmQ6IgorCQkgICAgICAgInZlbmRvciAleCBkZXZpY2UgMHgleCAoYnJva2VuIEJJT1M/KVxuIiwKKwkJICAgICAgIFBDSV9WRU5ET1JfSURfSU5URUwsIGU3eHh4X2RldnNbZGV2X2lkeF0uZXJyX2Rldik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpOiBtb3JlIG1jaSBpbml0XG4iLCBfX2Z1bmNfXyk7CisJbWNpLT5jdGxfbmFtZSA9IHB2dC0+ZGV2X2luZm8tPmN0bF9uYW1lOworCisJbWNpLT5lZGFjX2NoZWNrID0gZTd4eHhfY2hlY2s7CisJbWNpLT5jdGxfcGFnZV90b19waHlzID0gY3RsX3BhZ2VfdG9fcGh5czsKKworCS8qIGZpbmQgb3V0IHRoZSBkZXZpY2UgdHlwZXMgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgRTdYWFhfRFJBLCAmZHJhKTsKKworCS8qCisJICogVGhlIGRyYW0gcm93IGJvdW5kYXJ5IChEUkIpIHJlZyB2YWx1ZXMgYXJlIGJvdW5kYXJ5IGFkZHJlc3MKKwkgKiBmb3IgZWFjaCBEUkFNIHJvdyB3aXRoIGEgZ3JhbnVsYXJpdHkgb2YgMzIgb3IgNjRNQiAoc2luZ2xlL2R1YWwKKwkgKiBjaGFubmVsIG9wZXJhdGlvbikuICBEUkIgcmVncyBhcmUgY3VtdWxhdGl2ZTsgdGhlcmVmb3JlIERSQjcgd2lsbAorCSAqIGNvbnRhaW4gdGhlIHRvdGFsIG1lbW9yeSBjb250YWluZWQgaW4gYWxsIGVpZ2h0IHJvd3MuCisJICovCisJZm9yIChsYXN0X2N1bXVsX3NpemUgPSBpbmRleCA9IDA7IGluZGV4IDwgbWNpLT5ucl9jc3Jvd3M7IGluZGV4KyspIHsKKwkJdTggdmFsdWU7CisJCXUzMiBjdW11bF9zaXplOworCQkvKiBtZW1fZGV2IDA9eDgsIDE9eDQgKi8KKwkJaW50IG1lbV9kZXYgPSAoZHJhID4+IChpbmRleCAqIDQgKyAzKSkgJiAweDE7CisJCXN0cnVjdCBjc3Jvd19pbmZvICpjc3JvdyA9ICZtY2ktPmNzcm93c1tpbmRleF07CisKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUobWNpLT5wZGV2LCBFN1hYWF9EUkIgKyBpbmRleCwgJnZhbHVlKTsKKwkJLyogY29udmVydCBhIDY0IG9yIDMyIE1pQiBEUkIgdG8gYSBwYWdlIHNpemUuICovCisJCWN1bXVsX3NpemUgPSB2YWx1ZSA8PCAoMjUgKyBkcmNfZHJiZyAtIFBBR0VfU0hJRlQpOworCQlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpOiAoJWQpIGN1bXVsX3NpemUgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBpbmRleCwgY3VtdWxfc2l6ZSk7CisJCWlmIChjdW11bF9zaXplID09IGxhc3RfY3VtdWxfc2l6ZSkKKwkJCWNvbnRpbnVlOwkvKiBub3QgcG9wdWxhdGVkICovCisKKwkJY3Nyb3ctPmZpcnN0X3BhZ2UgPSBsYXN0X2N1bXVsX3NpemU7CisJCWNzcm93LT5sYXN0X3BhZ2UgPSBjdW11bF9zaXplIC0gMTsKKwkJY3Nyb3ctPm5yX3BhZ2VzID0gY3VtdWxfc2l6ZSAtIGxhc3RfY3VtdWxfc2l6ZTsKKwkJbGFzdF9jdW11bF9zaXplID0gY3VtdWxfc2l6ZTsKKwkJY3Nyb3ctPmdyYWluID0gMSA8PCAxMjsJLyogNEtpQiAtIHJlc29sdXRpb24gb2YgQ0VMT0cgKi8KKwkJY3Nyb3ctPm10eXBlID0gTUVNX1JERFI7CS8qIG9ubHkgb25lIHR5cGUgc3VwcG9ydGVkICovCisJCWNzcm93LT5kdHlwZSA9IG1lbV9kZXYgPyBERVZfWDQgOiBERVZfWDg7CisKKwkJLyoKKwkJICogaWYgc2luZ2xlIGNoYW5uZWwgb3IgeDggZGV2aWNlcyB0aGVuIFNFQ0RFRAorCQkgKiBpZiBkdWFsIGNoYW5uZWwgYW5kIHg0IHRoZW4gUzRFQ0Q0RUQKKwkJICovCisJCWlmIChkcmNfZGRpbSkgeworCQkJaWYgKGRyY19jaGFuICYmIG1lbV9kZXYpIHsKKwkJCQljc3Jvdy0+ZWRhY19tb2RlID0gRURBQ19TNEVDRDRFRDsKKwkJCQltY2ktPmVkYWNfY2FwIHw9IEVEQUNfRkxBR19TNEVDRDRFRDsKKwkJCX0gZWxzZSB7CisJCQkJY3Nyb3ctPmVkYWNfbW9kZSA9IEVEQUNfU0VDREVEOworCQkJCW1jaS0+ZWRhY19jYXAgfD0gRURBQ19GTEFHX1NFQ0RFRDsKKwkJCX0KKwkJfSBlbHNlCisJCQljc3Jvdy0+ZWRhY19tb2RlID0gRURBQ19OT05FOworCX0KKworCW1jaS0+ZWRhY19jYXAgfD0gRURBQ19GTEFHX05PTkU7CisKKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpOiB0b2xtLCByZW1hcGJhc2UsIHJlbWFwbGltaXRcbiIsCisJCV9fZnVuY19fKTsKKwkvKiBsb2FkIHRoZSB0b3Agb2YgbG93IG1lbW9yeSwgcmVtYXAgYmFzZSwgYW5kIHJlbWFwIGxpbWl0IHZhcnMgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChtY2ktPnBkZXYsIEU3WFhYX1RPTE0sICZwY2lfZGF0YSk7CisJcHZ0LT50b2xtID0gKCh1MzIpIHBjaV9kYXRhKSA8PCA0OworCXBjaV9yZWFkX2NvbmZpZ193b3JkKG1jaS0+cGRldiwgRTdYWFhfUkVNQVBCQVNFLCAmcGNpX2RhdGEpOworCXB2dC0+cmVtYXBiYXNlID0gKCh1MzIpIHBjaV9kYXRhKSA8PCAxNDsKKwlwY2lfcmVhZF9jb25maWdfd29yZChtY2ktPnBkZXYsIEU3WFhYX1JFTUFQTElNSVQsICZwY2lfZGF0YSk7CisJcHZ0LT5yZW1hcGxpbWl0ID0gKCh1MzIpIHBjaV9kYXRhKSA8PCAxNDsKKwlwcmludGsoInRvbG0gPSAleCwgcmVtYXBiYXNlID0gJXgsIHJlbWFwbGltaXQgPSAleFxuIiwgcHZ0LT50b2xtLAorCSAgICAgICBwdnQtPnJlbWFwYmFzZSwgcHZ0LT5yZW1hcGxpbWl0KTsKKworCS8qIGNsZWFyIGFueSBwZW5kaW5nIGVycm9ycywgb3IgaW5pdGlhbCBzdGF0ZSBiaXRzICovCisJcGNpX3dyaXRlX2JpdHM4KHB2dC0+YnJpZGdlX2NrLCBFN1hYWF9EUkFNX0ZFUlIsIDB4MDMsIDB4MDMpOworCXBjaV93cml0ZV9iaXRzOChwdnQtPmJyaWRnZV9jaywgRTdYWFhfRFJBTV9ORVJSLCAweDAzLCAweDAzKTsKKworCWlmIChlZGFjX21jX2FkZF9tYyhtY2kpICE9IDApIHsKKwkJZGVidWdmMygiTUM6ICIgX19GSUxFX18KKwkJCSI6ICVzKCk6IGZhaWxlZCBlZGFjX21jX2FkZF9tYygpXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogZ2V0IHRoaXMgZmFyIGFuZCBpdCdzIHN1Y2Nlc3NmdWwgKi8KKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpOiBzdWNjZXNzXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7CisKK2ZhaWw6CisJaWYgKG1jaSAhPSBOVUxMKSB7CisJCWlmKHB2dCAhPSBOVUxMICYmIHB2dC0+YnJpZGdlX2NrKQorCQkJcGNpX2Rldl9wdXQocHZ0LT5icmlkZ2VfY2spOworCQllZGFjX21jX2ZyZWUobWNpKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIHJldHVybnMgY291bnQgKD49IDApLCBvciBuZWdhdGl2ZSBvbiBlcnJvciAqLworc3RhdGljIGludCBfX2RldmluaXQKK2U3eHh4X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWRlYnVnZjAoIk1DOiAiIF9fRklMRV9fICI6ICVzKClcbiIsIF9fZnVuY19fKTsKKworCS8qIHdha2UgdXAgYW5kIGVuYWJsZSBkZXZpY2UgKi8KKwlyZXR1cm4gcGNpX2VuYWJsZV9kZXZpY2UocGRldikgPworCSAgICAtRUlPIDogZTd4eHhfcHJvYmUxKHBkZXYsIGVudC0+ZHJpdmVyX2RhdGEpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBlN3h4eF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaTsKKwlzdHJ1Y3QgZTd4eHhfcHZ0ICpwdnQ7CisKKwlkZWJ1Z2YwKF9fRklMRV9fICI6ICVzKClcbiIsIF9fZnVuY19fKTsKKworCWlmICgoKG1jaSA9IGVkYWNfbWNfZmluZF9tY2lfYnlfcGRldihwZGV2KSkgIT0gMCkgJiYKKwkgICAgZWRhY19tY19kZWxfbWMobWNpKSkgeworCQlwdnQgPSAoc3RydWN0IGU3eHh4X3B2dCAqKSBtY2ktPnB2dF9pbmZvOworCQlwY2lfZGV2X3B1dChwdnQtPmJyaWRnZV9jayk7CisJCWVkYWNfbWNfZnJlZShtY2kpOworCX0KK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgZTd4eHhfcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJe1BDSV9WRU5EX0RFVihJTlRFTCwgNzIwNV8wKSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgRTcyMDV9LAorCXtQQ0lfVkVORF9ERVYoSU5URUwsIDc1MDBfMCksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJIEU3NTAwfSwKKwl7UENJX1ZFTkRfREVWKElOVEVMLCA3NTAxXzApLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCSBFNzUwMX0sCisJe1BDSV9WRU5EX0RFVihJTlRFTCwgNzUwNV8wKSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgRTc1MDV9LAorCXswLH0JCQkvKiAwIHRlcm1pbmF0ZWQgbGlzdC4gKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBlN3h4eF9wY2lfdGJsKTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZTd4eHhfZHJpdmVyID0geworCS5uYW1lID0gQlNfTU9EX1NUUiwKKwkucHJvYmUgPSBlN3h4eF9pbml0X29uZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoZTd4eHhfcmVtb3ZlX29uZSksCisJLmlkX3RhYmxlID0gZTd4eHhfcGNpX3RibCwKK307CisKKworc3RhdGljIGludCBfX2luaXQgZTd4eHhfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZlN3h4eF9kcml2ZXIpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlN3h4eF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZlN3h4eF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChlN3h4eF9pbml0KTsKK21vZHVsZV9leGl0KGU3eHh4X2V4aXQpOworCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkxpbnV4IE5ldHdvcnggKGh0dHA6Ly9sbnhpLmNvbSkgVGhheW5lIEhhcmJhdWdoIGV0IGFsXG4iCisJICAgICAgIkJhc2VkIG9uLndvcmsgYnkgRGFuIEhvbGxpcyBldCBhbCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNQyBzdXBwb3J0IGZvciBJbnRlbCBlN3h4eCBtZW1vcnkgY29udHJvbGxlcnMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9lZGFjX21jLmMgYi9kcml2ZXJzL2VkYWMvZWRhY19tYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZTliZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2VkYWMvZWRhY19tYy5jCkBAIC0wLDAgKzEsMjIwOSBAQAorLyoKKyAqIGVkYWNfbWMga2VybmVsIG1vZHVsZQorICogKEMpIDIwMDUgTGludXggTmV0d29yeCAoaHR0cDovL2xueGkuY29tKQorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBXcml0dGVuIGJ5IFRoYXluZSBIYXJiYXVnaAorICogQmFzZWQgb24gd29yayBieSBEYW4gSG9sbGlzIDxnb2Vtb24gYXQgYW5pbWUgZG90IG5ldD4gYW5kIG90aGVycy4KKyAqCWh0dHA6Ly93d3cuYW5pbWUubmV0L35nb2Vtb24vbGludXgtZWNjLworICoKKyAqIE1vZGlmaWVkIGJ5IERhdmUgUGV0ZXJzb24gYW5kIERvdWcgVGhvbXBzb24KKyAqCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL2VkYWMuaD4KKworI2luY2x1ZGUgImVkYWNfbWMuaCIKKworI2RlZmluZQlFREFDX01DX1ZFUlNJT04JImVkYWNfbWMgIFZlcjogMi4wLjAgIiBfX0RBVEVfXworCisjaWZkZWYgQ09ORklHX0VEQUNfREVCVUcKKy8qIFZhbHVlcyBvZiAwIHRvIDQgd2lsbCBnZW5lcmF0ZSBvdXRwdXQgKi8KK2ludCBlZGFjX2RlYnVnX2xldmVsID0gMTsKK0VYUE9SVF9TWU1CT0woZWRhY19kZWJ1Z19sZXZlbCk7CisjZW5kaWYKKworLyogRURBQyBDb250cm9scywgc2V0YWJsZSBieSBtb2R1bGUgcGFyYW1ldGVyLCBhbmQgc3lzZnMgKi8KK3N0YXRpYyBpbnQgbG9nX3VlID0gMTsKK3N0YXRpYyBpbnQgbG9nX2NlID0gMTsKK3N0YXRpYyBpbnQgcGFuaWNfb25fdWUgPSAxOworc3RhdGljIGludCBwb2xsX21zZWMgPSAxMDAwOworCitzdGF0aWMgaW50IGNoZWNrX3BjaV9wYXJpdHkgPSAwOwkvKiBkZWZhdWx0IFlFUyBjaGVjayBQQ0kgcGFyaXR5ICovCitzdGF0aWMgaW50IHBhbmljX29uX3BjaV9wYXJpdHk7CQkvKiBkZWZhdWx0IG5vIHBhbmljIG9uIFBDSSBQYXJpdHkgKi8KK3N0YXRpYyBhdG9taWNfdCBwY2lfcGFyaXR5X2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7CisKKy8qIGxvY2sgdG8gbWVtb3J5IGNvbnRyb2xsZXIncyBjb250cm9sIGFycmF5ICovCitzdGF0aWMgREVDTEFSRV9NVVRFWChtZW1fY3Rsc19tdXRleCk7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBtY19kZXZpY2VzID0gTElTVF9IRUFEX0lOSVQobWNfZGV2aWNlcyk7CisKKy8qIFN0cnVjdHVyZSBvZiB0aGUgd2hpdGVsaXN0IGFuZCBibGFja2xpc3QgYXJyYXlzICovCitzdHJ1Y3QgZWRhY19wY2lfZGV2aWNlX2xpc3QgeworCXVuc2lnbmVkIGludCAgdmVuZG9yOwkJLyogVmVuZG9yIElEICovCisJdW5zaWduZWQgaW50ICBkZXZpY2U7CQkvKiBEZXZpaWNlIElEICovCit9OworCisKKyNkZWZpbmUgTUFYX0xJU1RFRF9QQ0lfREVWSUNFUwkJMzIKKworLyogTGlzdCBvZiBQQ0kgZGV2aWNlcyAodmVuZG9yLWlkOmRldmljZS1pZCkgdGhhdCBzaG91bGQgYmUgc2tpcHBlZCAqLworc3RhdGljIHN0cnVjdCBlZGFjX3BjaV9kZXZpY2VfbGlzdCBwY2lfYmxhY2tsaXN0W01BWF9MSVNURURfUENJX0RFVklDRVNdOworc3RhdGljIGludCBwY2lfYmxhY2tsaXN0X2NvdW50OworCisvKiBMaXN0IG9mIFBDSSBkZXZpY2VzICh2ZW5kb3ItaWQ6ZGV2aWNlLWlkKSB0aGF0IHNob3VsZCBiZSBzY2FubmVkICovCitzdGF0aWMgc3RydWN0IGVkYWNfcGNpX2RldmljZV9saXN0IHBjaV93aGl0ZWxpc3RbTUFYX0xJU1RFRF9QQ0lfREVWSUNFU107CitzdGF0aWMgaW50IHBjaV93aGl0ZWxpc3RfY291bnQgOworCisvKiAgU1RBUlQgc3lzZnMgZGF0YSBhbmQgbWV0aG9kcyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqbWVtX3R5cGVzW10gPSB7CisJW01FTV9FTVBUWV0gPSAiRW1wdHkiLAorCVtNRU1fUkVTRVJWRURdID0gIlJlc2VydmVkIiwKKwlbTUVNX1VOS05PV05dID0gIlVua25vd24iLAorCVtNRU1fRlBNXSA9ICJGUE0iLAorCVtNRU1fRURPXSA9ICJFRE8iLAorCVtNRU1fQkVET10gPSAiQkVETyIsCisJW01FTV9TRFJdID0gIlVuYnVmZmVyZWQtU0RSIiwKKwlbTUVNX1JEUl0gPSAiUmVnaXN0ZXJlZC1TRFIiLAorCVtNRU1fRERSXSA9ICJVbmJ1ZmZlcmVkLUREUiIsCisJW01FTV9SRERSXSA9ICJSZWdpc3RlcmVkLUREUiIsCisJW01FTV9STUJTXSA9ICJSTUJTIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmRldl90eXBlc1tdID0geworCVtERVZfVU5LTk9XTl0gPSAiVW5rbm93biIsCisJW0RFVl9YMV0gPSAieDEiLAorCVtERVZfWDJdID0gIngyIiwKKwlbREVWX1g0XSA9ICJ4NCIsCisJW0RFVl9YOF0gPSAieDgiLAorCVtERVZfWDE2XSA9ICJ4MTYiLAorCVtERVZfWDMyXSA9ICJ4MzIiLAorCVtERVZfWDY0XSA9ICJ4NjQiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZWRhY19jYXBzW10gPSB7CisJW0VEQUNfVU5LTk9XTl0gPSAiVW5rbm93biIsCisJW0VEQUNfTk9ORV0gPSAiTm9uZSIsCisJW0VEQUNfUkVTRVJWRURdID0gIlJlc2VydmVkIiwKKwlbRURBQ19QQVJJVFldID0gIlBBUklUWSIsCisJW0VEQUNfRUNdID0gIkVDIiwKKwlbRURBQ19TRUNERURdID0gIlNFQ0RFRCIsCisJW0VEQUNfUzJFQ0QyRURdID0gIlMyRUNEMkVEIiwKKwlbRURBQ19TNEVDRDRFRF0gPSAiUzRFQ0Q0RUQiLAorCVtFREFDX1M4RUNEOEVEXSA9ICJTOEVDRDhFRCIsCisJW0VEQUNfUzE2RUNEMTZFRF0gPSAiUzE2RUNEMTZFRCIKK307CisKKworLyogc3lzZnMgb2JqZWN0OiAvc3lzL2RldmljZXMvc3lzdGVtL2VkYWMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGVkYWNfY2xhc3MgPSB7CisJc2V0X2tzZXRfbmFtZSgiZWRhYyIpLAorfTsKKworLyogc3lzZnMgb2JqZWN0czoKKyAqCS9zeXMvZGV2aWNlcy9zeXN0ZW0vZWRhYy9tYworICoJL3N5cy9kZXZpY2VzL3N5c3RlbS9lZGFjL3BjaQorICovCitzdGF0aWMgc3RydWN0IGtvYmplY3QgZWRhY19tZW1jdHJsX2tvYmo7CitzdGF0aWMgc3RydWN0IGtvYmplY3QgZWRhY19wY2lfa29iajsKKworLyoKKyAqIC9zeXMvZGV2aWNlcy9zeXN0ZW0vZWRhYy9tYzsKKyAqIAlkYXRhIHN0cnVjdHVyZXMgYW5kIG1ldGhvZHMKKyAqLworc3RhdGljIHNzaXplX3QgbWVtY3RybF9zdHJpbmdfc2hvdyh2b2lkICpwdHIsIGNoYXIgKmJ1ZmZlcikKK3sKKwljaGFyICp2YWx1ZSA9IChjaGFyKikgcHRyOworCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgIiVzXG4iLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1lbWN0cmxfaW50X3Nob3codm9pZCAqcHRyLCBjaGFyICpidWZmZXIpCit7CisJaW50ICp2YWx1ZSA9IChpbnQqKSBwdHI7CisJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJWRcbiIsICp2YWx1ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1lbWN0cmxfaW50X3N0b3JlKHZvaWQgKnB0ciwgY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgY291bnQpCit7CisJaW50ICp2YWx1ZSA9IChpbnQqKSBwdHI7CisKKwlpZiAoaXNkaWdpdCgqYnVmZmVyKSkKKwkJKnZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmZmVyLCBOVUxMLCAwKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RydWN0IG1lbWN0cmxfZGV2X2F0dHJpYnV0ZSB7CisJc3RydWN0IGF0dHJpYnV0ZQlhdHRyOworCXZvaWQJKnZhbHVlOworCXNzaXplX3QgKCpzaG93KSh2b2lkICosY2hhciAqKTsKKwlzc2l6ZV90ICgqc3RvcmUpKHZvaWQgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworfTsKKworLyogU2V0IG9mIHNob3cvc3RvcmUgYWJzdHJhY3QgbGV2ZWwgZnVuY3Rpb25zIGZvciBtZW1vcnkgY29udHJvbCBvYmplY3QgKi8KK3N0YXRpYyBzc2l6ZV90CittZW1jdHJsX2Rldl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWZmZXIpCit7CisJc3RydWN0IG1lbWN0cmxfZGV2X2F0dHJpYnV0ZSAqbWVtY3RybF9kZXY7CisJbWVtY3RybF9kZXYgPSAoc3RydWN0IG1lbWN0cmxfZGV2X2F0dHJpYnV0ZSopYXR0cjsKKworCWlmIChtZW1jdHJsX2Rldi0+c2hvdykKKwkJcmV0dXJuIG1lbWN0cmxfZGV2LT5zaG93KG1lbWN0cmxfZGV2LT52YWx1ZSwgYnVmZmVyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIHNzaXplX3QKK21lbWN0cmxfZGV2X3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IG1lbWN0cmxfZGV2X2F0dHJpYnV0ZSAqbWVtY3RybF9kZXY7CisJbWVtY3RybF9kZXYgPSAoc3RydWN0IG1lbWN0cmxfZGV2X2F0dHJpYnV0ZSopYXR0cjsKKworCWlmIChtZW1jdHJsX2Rldi0+c3RvcmUpCisJCXJldHVybiBtZW1jdHJsX2Rldi0+c3RvcmUobWVtY3RybF9kZXYtPnZhbHVlLCBidWZmZXIsIGNvdW50KTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIHN0cnVjdCBzeXNmc19vcHMgbWVtY3RybGZzX29wcyA9IHsKKwkuc2hvdyAgID0gbWVtY3RybF9kZXZfc2hvdywKKwkuc3RvcmUgID0gbWVtY3RybF9kZXZfc3RvcmUKK307CisKKyNkZWZpbmUgTUVNQ1RSTF9BVFRSKF9uYW1lLF9tb2RlLF9zaG93LF9zdG9yZSkJCQlcCitzdHJ1Y3QgbWVtY3RybF9kZXZfYXR0cmlidXRlIGF0dHJfIyNfbmFtZSA9IHsJCQlcCisJLmF0dHIgPSB7Lm5hbWUgPSBfX3N0cmluZ2lmeShfbmFtZSksIC5tb2RlID0gX21vZGUgfSwJXAorCS52YWx1ZSAgPSAmX25hbWUsCQkJCQlcCisJLnNob3cgICA9IF9zaG93LAkJCQkJXAorCS5zdG9yZSAgPSBfc3RvcmUsCQkJCQlcCit9OworCisjZGVmaW5lIE1FTUNUUkxfU1RSSU5HX0FUVFIoX25hbWUsX2RhdGEsX21vZGUsX3Nob3csX3N0b3JlKQlcCitzdHJ1Y3QgbWVtY3RybF9kZXZfYXR0cmlidXRlIGF0dHJfIyNfbmFtZSA9IHsJCQlcCisJLmF0dHIgPSB7Lm5hbWUgPSBfX3N0cmluZ2lmeShfbmFtZSksIC5tb2RlID0gX21vZGUgfSwJXAorCS52YWx1ZSAgPSBfZGF0YSwJCQkJCVwKKwkuc2hvdyAgID0gX3Nob3csCQkJCQlcCisJLnN0b3JlICA9IF9zdG9yZSwJCQkJCVwKK307CisKKy8qIGN3cm93PGlkPiBhdHRyaWJ1dGUgZiovCitNRU1DVFJMX1NUUklOR19BVFRSKG1jX3ZlcnNpb24sRURBQ19NQ19WRVJTSU9OLFNfSVJVR08sbWVtY3RybF9zdHJpbmdfc2hvdyxOVUxMKTsKKworLyogY3Nyb3c8aWQ+IGNvbnRyb2wgZmlsZXMgKi8KK01FTUNUUkxfQVRUUihwYW5pY19vbl91ZSxTX0lSVUdPfFNfSVdVU1IsbWVtY3RybF9pbnRfc2hvdyxtZW1jdHJsX2ludF9zdG9yZSk7CitNRU1DVFJMX0FUVFIobG9nX3VlLFNfSVJVR098U19JV1VTUixtZW1jdHJsX2ludF9zaG93LG1lbWN0cmxfaW50X3N0b3JlKTsKK01FTUNUUkxfQVRUUihsb2dfY2UsU19JUlVHT3xTX0lXVVNSLG1lbWN0cmxfaW50X3Nob3csbWVtY3RybF9pbnRfc3RvcmUpOworTUVNQ1RSTF9BVFRSKHBvbGxfbXNlYyxTX0lSVUdPfFNfSVdVU1IsbWVtY3RybF9pbnRfc2hvdyxtZW1jdHJsX2ludF9zdG9yZSk7CisKKworLyogQmFzZSBBdHRyaWJ1dGVzIG9mIHRoZSBtZW1vcnkgRUNDIG9iamVjdCAqLworc3RhdGljIHN0cnVjdCBtZW1jdHJsX2Rldl9hdHRyaWJ1dGUgKm1lbWN0cmxfYXR0cltdID0geworCSZhdHRyX3BhbmljX29uX3VlLAorCSZhdHRyX2xvZ191ZSwKKwkmYXR0cl9sb2dfY2UsCisJJmF0dHJfcG9sbF9tc2VjLAorCSZhdHRyX21jX3ZlcnNpb24sCisJTlVMTCwKK307CisKKy8qIE1haW4gTUMga29iamVjdCByZWxlYXNlKCkgZnVuY3Rpb24gKi8KK3N0YXRpYyB2b2lkIGVkYWNfbWVtY3RybF9tYXN0ZXJfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwlkZWJ1Z2YxKCJFREFDIE1DOiAiIF9fRklMRV9fICI6ICVzKClcbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUga3R5cGVfbWVtY3RybCA9IHsKKwkucmVsZWFzZQk9IGVkYWNfbWVtY3RybF9tYXN0ZXJfcmVsZWFzZSwKKwkuc3lzZnNfb3BzCT0gJm1lbWN0cmxmc19vcHMsCisJLmRlZmF1bHRfYXR0cnMJPSAoc3RydWN0IGF0dHJpYnV0ZSAqKikgbWVtY3RybF9hdHRyLAorfTsKKworCisvKiBJbml0aWFsaXplIHRoZSBtYWluIHN5c2ZzIGVudHJpZXMgZm9yIGVkYWM6CisgKiAgIC9zeXMvZGV2aWNlcy9zeXN0ZW0vZWRhYworICoKKyAqIGFuZCBjaGlsZHJlbgorICoKKyAqIFJldHVybjogIDAgU1VDQ0VTUworICogICAgICAgICAhMCBGQUlMVVJFCisgKi8KK3N0YXRpYyBpbnQgZWRhY19zeXNmc19tZW1jdHJsX3NldHVwKHZvaWQpCit7CisJaW50IGVycj0wOworCisJZGVidWdmMSgiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCisJLyogY3JlYXRlIHRoZSAvc3lzL2RldmljZXMvc3lzdGVtL2VkYWMgZGlyZWN0b3J5ICovCisJZXJyID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZlZGFjX2NsYXNzKTsKKwlpZiAoIWVycikgeworCQkvKiBJbml0IHRoZSBNQydzIGtvYmplY3QgKi8KKwkJbWVtc2V0KCZlZGFjX21lbWN0cmxfa29iaiwgMCwgc2l6ZW9mIChlZGFjX21lbWN0cmxfa29iaikpOworCQlrb2JqZWN0X2luaXQoJmVkYWNfbWVtY3RybF9rb2JqKTsKKworCQllZGFjX21lbWN0cmxfa29iai5wYXJlbnQgPSAmZWRhY19jbGFzcy5rc2V0LmtvYmo7CisJCWVkYWNfbWVtY3RybF9rb2JqLmt0eXBlID0gJmt0eXBlX21lbWN0cmw7CisKKwkJLyogZ2VuZXJhdGUgc3lzZnMgIi4uLi4vZWRhYy9tYyIgICAqLworCQllcnIgPSBrb2JqZWN0X3NldF9uYW1lKCZlZGFjX21lbWN0cmxfa29iaiwibWMiKTsKKwkJaWYgKCFlcnIpIHsKKwkJCS8qIEZJWE1FOiBtYXliZSBuZXcgc3lzZGV2X2NyZWF0ZV9zdWJkaXIoKSAqLworCQkJZXJyID0ga29iamVjdF9yZWdpc3RlcigmZWRhY19tZW1jdHJsX2tvYmopOworCQkJaWYgKGVycikgeworCQkJCWRlYnVnZjEoIkZhaWxlZCB0byByZWdpc3RlciAnLi4uL2VkYWMvbWMnXG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJZGVidWdmMSgiUmVnaXN0ZXJlZCAnLi4uL2VkYWMvbWMnIGtvYmplY3RcbiIpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZGVidWdmMShLRVJOX1dBUk5JTkcgIl9fRklMRV9fICVzKCkgZXJyb3I9JWRcbiIsIF9fZnVuY19fLGVycik7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIE1DIHRlYXJkb3duOgorICoJdGhlICcuLi4uL2VkYWMvbWMnIGtvYmplY3QgZm9sbG93ZWQgYnkgJy4uLi4vZWRhYycgaXRzZWxmCisgKi8KK3N0YXRpYyB2b2lkIGVkYWNfc3lzZnNfbWVtY3RybF90ZWFyZG93bih2b2lkKQoreworCWRlYnVnZjAoIk1DOiAiIF9fRklMRV9fICI6ICVzKClcbiIsIF9fZnVuY19fKTsKKworCS8qIFVucmVnaXN0ZXIgdGhlIE1DJ3Mga29iamVjdCAqLworCWtvYmplY3RfdW5yZWdpc3RlcigmZWRhY19tZW1jdHJsX2tvYmopOworCisJLyogcmVsZWFzZSB0aGUgbWFzdGVyIGVkYWMgbWMga29iamVjdCAqLworCWtvYmplY3RfcHV0KCZlZGFjX21lbWN0cmxfa29iaik7CisKKwkvKiBVbnJlZ2lzdGVyIHRoZSAnZWRhYycgb2JqZWN0ICovCisJc3lzZGV2X2NsYXNzX3VucmVnaXN0ZXIoJmVkYWNfY2xhc3MpOworfQorCisvKgorICogL3N5cy9kZXZpY2VzL3N5c3RlbS9lZGFjL3BjaTsKKyAqIAlkYXRhIHN0cnVjdHVyZXMgYW5kIG1ldGhvZHMKKyAqLworCitzdHJ1Y3QgbGlzdF9jb250cm9sIHsKKwlzdHJ1Y3QgZWRhY19wY2lfZGV2aWNlX2xpc3QgKmxpc3Q7CisJaW50ICpjb3VudDsKK307CisKKy8qIE91dHB1dCB0aGUgbGlzdCBhczogIHZlbmRvcl9pZDpkZXZpY2U6aWQ8LHZlbmRvcl9pZDpkZXZpY2VfaWQ+ICovCitzdGF0aWMgc3NpemVfdCBlZGFjX3BjaV9saXN0X3N0cmluZ19zaG93KHZvaWQgKnB0ciwgY2hhciAqYnVmZmVyKQoreworCXN0cnVjdCBsaXN0X2NvbnRyb2wgKmxpc3RjdGw7CisJc3RydWN0IGVkYWNfcGNpX2RldmljZV9saXN0ICpsaXN0OworCWNoYXIgKnAgPSBidWZmZXI7CisJaW50IGxlbj0wOworCWludCBpOworCisJbGlzdGN0bCA9IHB0cjsKKwlsaXN0ID0gbGlzdGN0bC0+bGlzdDsKKworCWZvciAoaSA9IDA7IGkgPCAqKGxpc3RjdGwtPmNvdW50KTsgaSsrLCBsaXN0KysgKSB7CisJCWlmIChsZW4gPiAwKQorCQkJbGVuICs9IHNucHJpbnRmKHAgKyBsZW4sIChQQUdFX1NJWkUtbGVuKSwgIiwiKTsKKworCQlsZW4gKz0gc25wcmludGYocCArIGxlbiwKKwkJCQkoUEFHRV9TSVpFLWxlbiksCisJCQkJIiV4OiV4IiwKKwkJCQlsaXN0LT52ZW5kb3IsbGlzdC0+ZGV2aWNlKTsKKwl9CisKKwlsZW4gKz0gc25wcmludGYocCArIGxlbiwoUEFHRV9TSVpFLWxlbiksICJcbiIpOworCisJcmV0dXJuIChzc2l6ZV90KSBsZW47Cit9CisKKy8qKgorICoKKyAqIFNjYW4gc3RyaW5nIGZyb20gKipzIHRvICoqZSBsb29raW5nIGZvciBvbmUgJ3ZlbmRvcjpkZXZpY2UnIHR1cGxlCisgKiB3aGVyZSBlYWNoIGZpZWxkIGlzIGEgaGV4IHZhbHVlCisgKgorICogcmV0dXJuIDAgaWYgYW4gZW50cnkgaXMgTk9UIGZvdW5kCisgKiByZXR1cm4gMSBpZiBhbiBlbnRyeSBpcyBmb3VuZAorICoJZmlsbCBpbiAqdmVuZG9yX2lkIGFuZCAqZGV2aWNlX2lkIHdpdGggdmFsdWVzIGZvdW5kCisgKgorICogSW4gYm90aCBjYXNlcywgbWFrZSBzdXJlICpzIGhhcyBiZWVuIG1vdmVkIGZvcndhcmQgdG93YXJkICplCisgKi8KK3N0YXRpYyBpbnQgcGFyc2Vfb25lX2RldmljZShjb25zdCBjaGFyICoqcyxjb25zdCBjaGFyICoqZSwKKwl1bnNpZ25lZCBpbnQgKnZlbmRvcl9pZCwgdW5zaWduZWQgaW50ICpkZXZpY2VfaWQpCit7CisJY29uc3QgY2hhciAqcnVubmVyLCAqcDsKKworCS8qIGlmIG51bGwgYnl0ZSwgd2UgYXJlIGRvbmUgKi8KKwlpZiAoISoqcykgeworCQkoKnMpKys7CS8qIGtlZXAgKnMgbW92aW5nICovCisJCXJldHVybiAwOworCX0KKworCS8qIHNraXAgb3ZlciBuZXdsaW5lcyAmIHdoaXRlc3BhY2UgKi8KKwlpZiAoKCoqcyA9PSAnXG4nKSB8fCBpc3NwYWNlKCoqcykpIHsKKwkJKCpzKSsrOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWlzeGRpZ2l0KCoqcykpIHsKKwkJKCpzKSsrOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBwYXJzZSB2ZW5kb3JfaWQgKi8KKwlydW5uZXIgPSAqczsKKwl3aGlsZSAocnVubmVyIDwgKmUpIHsKKwkJLyogc2NhbiBmb3IgdmVuZG9yOmRldmljZSBkZWxpbWl0ZXIgKi8KKwkJaWYgKCpydW5uZXIgPT0gJzonKSB7CisJCQkqdmVuZG9yX2lkID0gc2ltcGxlX3N0cnRvbCgoY2hhciopICpzLCAoY2hhcioqKSAmcCwgMTYpOworCQkJcnVubmVyID0gcCArIDE7CisJCQlicmVhazsKKwkJfQorCQlydW5uZXIrKzsKKwl9CisKKwlpZiAoIWlzeGRpZ2l0KCpydW5uZXIpKSB7CisJCSpzID0gKytydW5uZXI7CisJCXJldHVybiAwOworCX0KKworCS8qIHBhcnNlIGRldmljZV9pZCAqLworCWlmIChydW5uZXIgPCAqZSkgeworCQkqZGV2aWNlX2lkID0gc2ltcGxlX3N0cnRvbCgoY2hhciopcnVubmVyLCAoY2hhcioqKSZwLCAxNik7CisJCXJ1bm5lciA9IHA7CisJfQorCisJKnMgPSBydW5uZXI7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHNzaXplX3QgZWRhY19wY2lfbGlzdF9zdHJpbmdfc3RvcmUodm9pZCAqcHRyLCBjb25zdCBjaGFyICpidWZmZXIsCisJCQkJCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgbGlzdF9jb250cm9sICpsaXN0Y3RsOworCXN0cnVjdCBlZGFjX3BjaV9kZXZpY2VfbGlzdCAqbGlzdDsKKwl1bnNpZ25lZCBpbnQgdmVuZG9yX2lkLCBkZXZpY2VfaWQ7CisJY29uc3QgY2hhciAqcywgKmU7CisJaW50ICppbmRleDsKKworCXMgPSAoY2hhciopYnVmZmVyOworCWUgPSBzICsgY291bnQ7CisKKwlsaXN0Y3RsID0gcHRyOworCWxpc3QgPSBsaXN0Y3RsLT5saXN0OworCWluZGV4ID0gbGlzdGN0bC0+Y291bnQ7CisKKwkqaW5kZXggPSAwOworCXdoaWxlICgqaW5kZXggPCBNQVhfTElTVEVEX1BDSV9ERVZJQ0VTKSB7CisKKwkJaWYgKHBhcnNlX29uZV9kZXZpY2UoJnMsJmUsJnZlbmRvcl9pZCwmZGV2aWNlX2lkKSkgeworCQkJbGlzdFsgKmluZGV4IF0udmVuZG9yID0gdmVuZG9yX2lkOworCQkJbGlzdFsgKmluZGV4IF0uZGV2aWNlID0gZGV2aWNlX2lkOworCQkJKCppbmRleCkrKzsKKwkJfQorCisJCS8qIGNoZWNrIGZvciBhbGwgZGF0YSBjb25zdW1lICovCisJCWlmIChzID49IGUpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVkYWNfcGNpX2ludF9zaG93KHZvaWQgKnB0ciwgY2hhciAqYnVmZmVyKQoreworCWludCAqdmFsdWUgPSBwdHI7CisJcmV0dXJuIHNwcmludGYoYnVmZmVyLCIlZFxuIiwqdmFsdWUpOworfQorCitzdGF0aWMgc3NpemVfdCBlZGFjX3BjaV9pbnRfc3RvcmUodm9pZCAqcHRyLCBjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgKnZhbHVlID0gcHRyOworCisJaWYgKGlzZGlnaXQoKmJ1ZmZlcikpCisJCSp2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZmZlcixOVUxMLDApOworCisJcmV0dXJuIGNvdW50OworfQorCitzdHJ1Y3QgZWRhY19wY2lfZGV2X2F0dHJpYnV0ZSB7CisJc3RydWN0IGF0dHJpYnV0ZQlhdHRyOworCXZvaWQJKnZhbHVlOworCXNzaXplX3QgKCpzaG93KSh2b2lkICosY2hhciAqKTsKKwlzc2l6ZV90ICgqc3RvcmUpKHZvaWQgKiwgY29uc3QgY2hhciAqLHNpemVfdCk7Cit9OworCisvKiBTZXQgb2Ygc2hvdy9zdG9yZSBhYnN0cmFjdCBsZXZlbCBmdW5jdGlvbnMgZm9yIFBDSSBQYXJpdHkgb2JqZWN0ICovCitzdGF0aWMgc3NpemVfdCBlZGFjX3BjaV9kZXZfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCQljaGFyICpidWZmZXIpCit7CisJc3RydWN0IGVkYWNfcGNpX2Rldl9hdHRyaWJ1dGUgKmVkYWNfcGNpX2RldjsKKwllZGFjX3BjaV9kZXY9IChzdHJ1Y3QgZWRhY19wY2lfZGV2X2F0dHJpYnV0ZSopYXR0cjsKKworCWlmIChlZGFjX3BjaV9kZXYtPnNob3cpCisJCXJldHVybiBlZGFjX3BjaV9kZXYtPnNob3coZWRhY19wY2lfZGV2LT52YWx1ZSwgYnVmZmVyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIHNzaXplX3QgZWRhY19wY2lfZGV2X3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBlZGFjX3BjaV9kZXZfYXR0cmlidXRlICplZGFjX3BjaV9kZXY7CisJZWRhY19wY2lfZGV2PSAoc3RydWN0IGVkYWNfcGNpX2Rldl9hdHRyaWJ1dGUqKWF0dHI7CisKKwlpZiAoZWRhY19wY2lfZGV2LT5zaG93KQorCQlyZXR1cm4gZWRhY19wY2lfZGV2LT5zdG9yZShlZGFjX3BjaV9kZXYtPnZhbHVlLCBidWZmZXIsIGNvdW50KTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIHN0cnVjdCBzeXNmc19vcHMgZWRhY19wY2lfc3lzZnNfb3BzID0geworCS5zaG93ICAgPSBlZGFjX3BjaV9kZXZfc2hvdywKKwkuc3RvcmUgID0gZWRhY19wY2lfZGV2X3N0b3JlCit9OworCisKKyNkZWZpbmUgRURBQ19QQ0lfQVRUUihfbmFtZSxfbW9kZSxfc2hvdyxfc3RvcmUpCQkJXAorc3RydWN0IGVkYWNfcGNpX2Rldl9hdHRyaWJ1dGUgZWRhY19wY2lfYXR0cl8jI19uYW1lID0gewkJXAorCS5hdHRyID0gey5uYW1lID0gX19zdHJpbmdpZnkoX25hbWUpLCAubW9kZSA9IF9tb2RlIH0sCVwKKwkudmFsdWUgID0gJl9uYW1lLAkJCQkJXAorCS5zaG93ICAgPSBfc2hvdywJCQkJCVwKKwkuc3RvcmUgID0gX3N0b3JlLAkJCQkJXAorfTsKKworI2RlZmluZSBFREFDX1BDSV9TVFJJTkdfQVRUUihfbmFtZSxfZGF0YSxfbW9kZSxfc2hvdyxfc3RvcmUpCVwKK3N0cnVjdCBlZGFjX3BjaV9kZXZfYXR0cmlidXRlIGVkYWNfcGNpX2F0dHJfIyNfbmFtZSA9IHsJCVwKKwkuYXR0ciA9IHsubmFtZSA9IF9fc3RyaW5naWZ5KF9uYW1lKSwgLm1vZGUgPSBfbW9kZSB9LAlcCisJLnZhbHVlICA9IF9kYXRhLAkJCQkJXAorCS5zaG93ICAgPSBfc2hvdywJCQkJCVwKKwkuc3RvcmUgID0gX3N0b3JlLAkJCQkJXAorfTsKKworc3RhdGljIHN0cnVjdCBsaXN0X2NvbnRyb2wgcGNpX3doaXRlbGlzdF9jb250cm9sID0geworCS5saXN0ID0gcGNpX3doaXRlbGlzdCwKKwkuY291bnQgPSAmcGNpX3doaXRlbGlzdF9jb3VudAorfTsKKworc3RhdGljIHN0cnVjdCBsaXN0X2NvbnRyb2wgcGNpX2JsYWNrbGlzdF9jb250cm9sID0geworCS5saXN0ID0gcGNpX2JsYWNrbGlzdCwKKwkuY291bnQgPSAmcGNpX2JsYWNrbGlzdF9jb3VudAorfTsKKworLyogd2hpdGVsaXN0IGF0dHJpYnV0ZSAqLworRURBQ19QQ0lfU1RSSU5HX0FUVFIocGNpX3Bhcml0eV93aGl0ZWxpc3QsCisJJnBjaV93aGl0ZWxpc3RfY29udHJvbCwKKwlTX0lSVUdPfFNfSVdVU1IsCisJZWRhY19wY2lfbGlzdF9zdHJpbmdfc2hvdywKKwllZGFjX3BjaV9saXN0X3N0cmluZ19zdG9yZSk7CisKK0VEQUNfUENJX1NUUklOR19BVFRSKHBjaV9wYXJpdHlfYmxhY2tsaXN0LAorCSZwY2lfYmxhY2tsaXN0X2NvbnRyb2wsCisJU19JUlVHT3xTX0lXVVNSLAorCWVkYWNfcGNpX2xpc3Rfc3RyaW5nX3Nob3csCisJZWRhY19wY2lfbGlzdF9zdHJpbmdfc3RvcmUpOworCisvKiBQQ0kgUGFyaXR5IGNvbnRyb2wgZmlsZXMgKi8KK0VEQUNfUENJX0FUVFIoY2hlY2tfcGNpX3Bhcml0eSxTX0lSVUdPfFNfSVdVU1IsZWRhY19wY2lfaW50X3Nob3csZWRhY19wY2lfaW50X3N0b3JlKTsKK0VEQUNfUENJX0FUVFIocGFuaWNfb25fcGNpX3Bhcml0eSxTX0lSVUdPfFNfSVdVU1IsZWRhY19wY2lfaW50X3Nob3csZWRhY19wY2lfaW50X3N0b3JlKTsKK0VEQUNfUENJX0FUVFIocGNpX3Bhcml0eV9jb3VudCxTX0lSVUdPLGVkYWNfcGNpX2ludF9zaG93LE5VTEwpOworCisvKiBCYXNlIEF0dHJpYnV0ZXMgb2YgdGhlIG1lbW9yeSBFQ0Mgb2JqZWN0ICovCitzdGF0aWMgc3RydWN0IGVkYWNfcGNpX2Rldl9hdHRyaWJ1dGUgKmVkYWNfcGNpX2F0dHJbXSA9IHsKKwkmZWRhY19wY2lfYXR0cl9jaGVja19wY2lfcGFyaXR5LAorCSZlZGFjX3BjaV9hdHRyX3BhbmljX29uX3BjaV9wYXJpdHksCisJJmVkYWNfcGNpX2F0dHJfcGNpX3Bhcml0eV9jb3VudCwKKwkmZWRhY19wY2lfYXR0cl9wY2lfcGFyaXR5X3doaXRlbGlzdCwKKwkmZWRhY19wY2lfYXR0cl9wY2lfcGFyaXR5X2JsYWNrbGlzdCwKKwlOVUxMLAorfTsKKworLyogTm8gbWVtb3J5IHRvIHJlbGVhc2UgKi8KK3N0YXRpYyB2b2lkIGVkYWNfcGNpX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJZGVidWdmMSgiRURBQyBQQ0k6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBrdHlwZV9lZGFjX3BjaSA9IHsKKwkucmVsZWFzZQk9IGVkYWNfcGNpX3JlbGVhc2UsCisJLnN5c2ZzX29wcwk9ICZlZGFjX3BjaV9zeXNmc19vcHMsCisJLmRlZmF1bHRfYXR0cnMJPSAoc3RydWN0IGF0dHJpYnV0ZSAqKikgZWRhY19wY2lfYXR0ciwKK307CisKKy8qKgorICogZWRhY19zeXNmc19wY2lfc2V0dXAoKQorICoKKyAqLworc3RhdGljIGludCBlZGFjX3N5c2ZzX3BjaV9zZXR1cCh2b2lkKQoreworCWludCBlcnI7CisKKwlkZWJ1Z2YxKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwltZW1zZXQoJmVkYWNfcGNpX2tvYmosIDAsIHNpemVvZihlZGFjX3BjaV9rb2JqKSk7CisKKwlrb2JqZWN0X2luaXQoJmVkYWNfcGNpX2tvYmopOworCWVkYWNfcGNpX2tvYmoucGFyZW50ID0gJmVkYWNfY2xhc3Mua3NldC5rb2JqOworCWVkYWNfcGNpX2tvYmoua3R5cGUgPSAma3R5cGVfZWRhY19wY2k7CisKKwllcnIgPSBrb2JqZWN0X3NldF9uYW1lKCZlZGFjX3BjaV9rb2JqLCAicGNpIik7CisJaWYgKCFlcnIpIHsKKwkJLyogSW5zdGFuc3RpYXRlIHRoZSBjc3JvdyBvYmplY3QgKi8KKwkJLyogRklYTUU6IG1heWJlIG5ldyBzeXNkZXZfY3JlYXRlX3N1YmRpcigpICovCisJCWVyciA9IGtvYmplY3RfcmVnaXN0ZXIoJmVkYWNfcGNpX2tvYmopOworCQlpZiAoZXJyKQorCQkJZGVidWdmMSgiRmFpbGVkIHRvIHJlZ2lzdGVyICcuLi4vZWRhYy9wY2knXG4iKTsKKwkJZWxzZQorCQkJZGVidWdmMSgiUmVnaXN0ZXJlZCAnLi4uL2VkYWMvcGNpJyBrb2JqZWN0XG4iKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgdm9pZCBlZGFjX3N5c2ZzX3BjaV90ZWFyZG93bih2b2lkKQoreworCWRlYnVnZjAoIk1DOiAiIF9fRklMRV9fICI6ICVzKClcbiIsIF9fZnVuY19fKTsKKworCWtvYmplY3RfdW5yZWdpc3RlcigmZWRhY19wY2lfa29iaik7CisJa29iamVjdF9wdXQoJmVkYWNfcGNpX2tvYmopOworfQorCisvKiBFREFDIHN5c2ZzIENTUk9XIGRhdGEgc3RydWN0dXJlcyBhbmQgbWV0aG9kcyAqLworCisvKiBTZXQgb2YgbW9yZSBkZXRhaWxlZCBjc3JvdzxpZD4gYXR0cmlidXRlIHNob3cvc3RvcmUgZnVuY3Rpb25zICovCitzdGF0aWMgc3NpemVfdCBjc3Jvd19jaDBfZGltbV9sYWJlbF9zaG93KHN0cnVjdCBjc3Jvd19pbmZvICpjc3JvdywgY2hhciAqZGF0YSkKK3sKKwlzc2l6ZV90IHNpemUgPSAwOworCisJaWYgKGNzcm93LT5ucl9jaGFubmVscyA+IDApIHsKKwkJc2l6ZSA9IHNucHJpbnRmKGRhdGEsIEVEQUNfTUNfTEFCRUxfTEVOLCIlc1xuIiwKKwkJCWNzcm93LT5jaGFubmVsc1swXS5sYWJlbCk7CisJfQorCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBjc3Jvd19jaDFfZGltbV9sYWJlbF9zaG93KHN0cnVjdCBjc3Jvd19pbmZvICpjc3JvdywgY2hhciAqZGF0YSkKK3sKKwlzc2l6ZV90IHNpemUgPSAwOworCisJaWYgKGNzcm93LT5ucl9jaGFubmVscyA+IDApIHsKKwkJc2l6ZSA9IHNucHJpbnRmKGRhdGEsIEVEQUNfTUNfTEFCRUxfTEVOLCAiJXNcbiIsCisJCQljc3Jvdy0+Y2hhbm5lbHNbMV0ubGFiZWwpOworCX0KKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3QgY3Nyb3dfY2gwX2RpbW1fbGFiZWxfc3RvcmUoc3RydWN0IGNzcm93X2luZm8gKmNzcm93LAorCQkJY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUpCit7CisJc3NpemVfdCBtYXhfc2l6ZSA9IDA7CisKKwlpZiAoY3Nyb3ctPm5yX2NoYW5uZWxzID4gMCkgeworCQltYXhfc2l6ZSA9IG1pbigoc3NpemVfdClzaXplLChzc2l6ZV90KUVEQUNfTUNfTEFCRUxfTEVOLTEpOworCQlzdHJuY3B5KGNzcm93LT5jaGFubmVsc1swXS5sYWJlbCwgZGF0YSwgbWF4X3NpemUpOworCQljc3Jvdy0+Y2hhbm5lbHNbMF0ubGFiZWxbbWF4X3NpemVdID0gJ1wwJzsKKwl9CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNzcm93X2NoMV9kaW1tX2xhYmVsX3N0b3JlKHN0cnVjdCBjc3Jvd19pbmZvICpjc3JvdywKKwkJCWNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplKQoreworCXNzaXplX3QgbWF4X3NpemUgPSAwOworCisJaWYgKGNzcm93LT5ucl9jaGFubmVscyA+IDEpIHsKKwkJbWF4X3NpemUgPSBtaW4oKHNzaXplX3Qpc2l6ZSwoc3NpemVfdClFREFDX01DX0xBQkVMX0xFTi0xKTsKKwkJc3RybmNweShjc3Jvdy0+Y2hhbm5lbHNbMV0ubGFiZWwsIGRhdGEsIG1heF9zaXplKTsKKwkJY3Nyb3ctPmNoYW5uZWxzWzFdLmxhYmVsW21heF9zaXplXSA9ICdcMCc7CisJfQorCXJldHVybiBtYXhfc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3QgY3Nyb3dfdWVfY291bnRfc2hvdyhzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3Nyb3csIGNoYXIgKmRhdGEpCit7CisJcmV0dXJuIHNwcmludGYoZGF0YSwiJXVcbiIsIGNzcm93LT51ZV9jb3VudCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNzcm93X2NlX2NvdW50X3Nob3coc3RydWN0IGNzcm93X2luZm8gKmNzcm93LCBjaGFyICpkYXRhKQoreworCXJldHVybiBzcHJpbnRmKGRhdGEsIiV1XG4iLCBjc3Jvdy0+Y2VfY291bnQpOworfQorCitzdGF0aWMgc3NpemVfdCBjc3Jvd19jaDBfY2VfY291bnRfc2hvdyhzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3Nyb3csIGNoYXIgKmRhdGEpCit7CisJc3NpemVfdCBzaXplID0gMDsKKworCWlmIChjc3Jvdy0+bnJfY2hhbm5lbHMgPiAwKSB7CisJCXNpemUgPSBzcHJpbnRmKGRhdGEsIiV1XG4iLCBjc3Jvdy0+Y2hhbm5lbHNbMF0uY2VfY291bnQpOworCX0KKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3QgY3Nyb3dfY2gxX2NlX2NvdW50X3Nob3coc3RydWN0IGNzcm93X2luZm8gKmNzcm93LCBjaGFyICpkYXRhKQoreworCXNzaXplX3Qgc2l6ZSA9IDA7CisKKwlpZiAoY3Nyb3ctPm5yX2NoYW5uZWxzID4gMSkgeworCQlzaXplID0gc3ByaW50ZihkYXRhLCIldVxuIiwgY3Nyb3ctPmNoYW5uZWxzWzFdLmNlX2NvdW50KTsKKwl9CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNzcm93X3NpemVfc2hvdyhzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3Nyb3csIGNoYXIgKmRhdGEpCit7CisJcmV0dXJuIHNwcmludGYoZGF0YSwiJXVcbiIsIFBBR0VTX1RPX01pQihjc3Jvdy0+bnJfcGFnZXMpKTsKK30KKworc3RhdGljIHNzaXplX3QgY3Nyb3dfbWVtX3R5cGVfc2hvdyhzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3Nyb3csIGNoYXIgKmRhdGEpCit7CisJcmV0dXJuIHNwcmludGYoZGF0YSwiJXNcbiIsIG1lbV90eXBlc1tjc3Jvdy0+bXR5cGVdKTsKK30KKworc3RhdGljIHNzaXplX3QgY3Nyb3dfZGV2X3R5cGVfc2hvdyhzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3Nyb3csIGNoYXIgKmRhdGEpCit7CisJcmV0dXJuIHNwcmludGYoZGF0YSwiJXNcbiIsIGRldl90eXBlc1tjc3Jvdy0+ZHR5cGVdKTsKK30KKworc3RhdGljIHNzaXplX3QgY3Nyb3dfZWRhY19tb2RlX3Nob3coc3RydWN0IGNzcm93X2luZm8gKmNzcm93LCBjaGFyICpkYXRhKQoreworCXJldHVybiBzcHJpbnRmKGRhdGEsIiVzXG4iLCBlZGFjX2NhcHNbY3Nyb3ctPmVkYWNfbW9kZV0pOworfQorCitzdHJ1Y3QgY3Nyb3dkZXZfYXR0cmlidXRlIHsKKwlzdHJ1Y3QgYXR0cmlidXRlCWF0dHI7CisJc3NpemVfdCAoKnNob3cpKHN0cnVjdCBjc3Jvd19pbmZvICosY2hhciAqKTsKKwlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBjc3Jvd19pbmZvICosIGNvbnN0IGNoYXIgKixzaXplX3QpOworfTsKKworI2RlZmluZSB0b19jc3JvdyhrKSBjb250YWluZXJfb2Yoaywgc3RydWN0IGNzcm93X2luZm8sIGtvYmopCisjZGVmaW5lIHRvX2Nzcm93ZGV2X2F0dHIoYSkgY29udGFpbmVyX29mKGEsIHN0cnVjdCBjc3Jvd2Rldl9hdHRyaWJ1dGUsIGF0dHIpCisKKy8qIFNldCBvZiBzaG93L3N0b3JlIGhpZ2hlciBsZXZlbCBmdW5jdGlvbnMgZm9yIGNzcm93IG9iamVjdHMgKi8KK3N0YXRpYyBzc2l6ZV90IGNzcm93ZGV2X3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkJY2hhciAqYnVmZmVyKQoreworCXN0cnVjdCBjc3Jvd19pbmZvICpjc3JvdyA9IHRvX2Nzcm93KGtvYmopOworCXN0cnVjdCBjc3Jvd2Rldl9hdHRyaWJ1dGUgKmNzcm93ZGV2X2F0dHIgPSB0b19jc3Jvd2Rldl9hdHRyKGF0dHIpOworCisJaWYgKGNzcm93ZGV2X2F0dHItPnNob3cpCisJCXJldHVybiBjc3Jvd2Rldl9hdHRyLT5zaG93KGNzcm93LCBidWZmZXIpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgc3NpemVfdCBjc3Jvd2Rldl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3Nyb3cgPSB0b19jc3Jvdyhrb2JqKTsKKwlzdHJ1Y3QgY3Nyb3dkZXZfYXR0cmlidXRlICogY3Nyb3dkZXZfYXR0ciA9IHRvX2Nzcm93ZGV2X2F0dHIoYXR0cik7CisKKwlpZiAoY3Nyb3dkZXZfYXR0ci0+c3RvcmUpCisJCXJldHVybiBjc3Jvd2Rldl9hdHRyLT5zdG9yZShjc3JvdywgYnVmZmVyLCBjb3VudCk7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIGNzcm93ZnNfb3BzID0geworCS5zaG93ICAgPSBjc3Jvd2Rldl9zaG93LAorCS5zdG9yZSAgPSBjc3Jvd2Rldl9zdG9yZQorfTsKKworI2RlZmluZSBDU1JPV0RFVl9BVFRSKF9uYW1lLF9tb2RlLF9zaG93LF9zdG9yZSkJCQlcCitzdHJ1Y3QgY3Nyb3dkZXZfYXR0cmlidXRlIGF0dHJfIyNfbmFtZSA9IHsJCQlcCisJLmF0dHIgPSB7Lm5hbWUgPSBfX3N0cmluZ2lmeShfbmFtZSksIC5tb2RlID0gX21vZGUgfSwJXAorCS5zaG93ICAgPSBfc2hvdywJCQkJCVwKKwkuc3RvcmUgID0gX3N0b3JlLAkJCQkJXAorfTsKKworLyogY3dyb3c8aWQ+L2F0dHJpYnV0ZSBmaWxlcyAqLworQ1NST1dERVZfQVRUUihzaXplX21iLFNfSVJVR08sY3Nyb3dfc2l6ZV9zaG93LE5VTEwpOworQ1NST1dERVZfQVRUUihkZXZfdHlwZSxTX0lSVUdPLGNzcm93X2Rldl90eXBlX3Nob3csTlVMTCk7CitDU1JPV0RFVl9BVFRSKG1lbV90eXBlLFNfSVJVR08sY3Nyb3dfbWVtX3R5cGVfc2hvdyxOVUxMKTsKK0NTUk9XREVWX0FUVFIoZWRhY19tb2RlLFNfSVJVR08sY3Nyb3dfZWRhY19tb2RlX3Nob3csTlVMTCk7CitDU1JPV0RFVl9BVFRSKHVlX2NvdW50LFNfSVJVR08sY3Nyb3dfdWVfY291bnRfc2hvdyxOVUxMKTsKK0NTUk9XREVWX0FUVFIoY2VfY291bnQsU19JUlVHTyxjc3Jvd19jZV9jb3VudF9zaG93LE5VTEwpOworQ1NST1dERVZfQVRUUihjaDBfY2VfY291bnQsU19JUlVHTyxjc3Jvd19jaDBfY2VfY291bnRfc2hvdyxOVUxMKTsKK0NTUk9XREVWX0FUVFIoY2gxX2NlX2NvdW50LFNfSVJVR08sY3Nyb3dfY2gxX2NlX2NvdW50X3Nob3csTlVMTCk7CisKKy8qIGNvbnRyb2wvYXR0cmlidXRlIGZpbGVzICovCitDU1JPV0RFVl9BVFRSKGNoMF9kaW1tX2xhYmVsLFNfSVJVR098U19JV1VTUiwKKwkJY3Nyb3dfY2gwX2RpbW1fbGFiZWxfc2hvdywKKwkJY3Nyb3dfY2gwX2RpbW1fbGFiZWxfc3RvcmUpOworQ1NST1dERVZfQVRUUihjaDFfZGltbV9sYWJlbCxTX0lSVUdPfFNfSVdVU1IsCisJCWNzcm93X2NoMV9kaW1tX2xhYmVsX3Nob3csCisJCWNzcm93X2NoMV9kaW1tX2xhYmVsX3N0b3JlKTsKKworCisvKiBBdHRyaWJ1dGVzIG9mIHRoZSBDU1JPVzxpZD4gb2JqZWN0ICovCitzdGF0aWMgc3RydWN0IGNzcm93ZGV2X2F0dHJpYnV0ZSAqY3Nyb3dfYXR0cltdID0geworCSZhdHRyX2Rldl90eXBlLAorCSZhdHRyX21lbV90eXBlLAorCSZhdHRyX2VkYWNfbW9kZSwKKwkmYXR0cl9zaXplX21iLAorCSZhdHRyX3VlX2NvdW50LAorCSZhdHRyX2NlX2NvdW50LAorCSZhdHRyX2NoMF9jZV9jb3VudCwKKwkmYXR0cl9jaDFfY2VfY291bnQsCisJJmF0dHJfY2gwX2RpbW1fbGFiZWwsCisJJmF0dHJfY2gxX2RpbW1fbGFiZWwsCisJTlVMTCwKK307CisKKworLyogTm8gbWVtb3J5IHRvIHJlbGVhc2UgKi8KK3N0YXRpYyB2b2lkIGVkYWNfY3Nyb3dfaW5zdGFuY2VfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwlkZWJ1Z2YxKCJFREFDIE1DOiAiIF9fRklMRV9fICI6ICVzKClcbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUga3R5cGVfY3Nyb3cgPSB7CisJLnJlbGVhc2UJPSBlZGFjX2Nzcm93X2luc3RhbmNlX3JlbGVhc2UsCisJLnN5c2ZzX29wcwk9ICZjc3Jvd2ZzX29wcywKKwkuZGVmYXVsdF9hdHRycwk9IChzdHJ1Y3QgYXR0cmlidXRlICoqKSBjc3Jvd19hdHRyLAorfTsKKworLyogQ3JlYXRlIGEgQ1NST1cgb2JqZWN0IHVuZGVyIHNwZWNpZmVkIGVkYWNfbWNfZGV2aWNlICovCitzdGF0aWMgaW50IGVkYWNfY3JlYXRlX2Nzcm93X29iamVjdChzdHJ1Y3Qga29iamVjdCAqZWRhY19tY2lfa29iaiwKKwkJCQlzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3Nyb3csIGludCBpbmRleCApCit7CisJaW50IGVyciA9IDA7CisKKwlkZWJ1Z2YwKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwltZW1zZXQoJmNzcm93LT5rb2JqLCAwLCBzaXplb2YoY3Nyb3ctPmtvYmopKTsKKworCS8qIGdlbmVyYXRlIC4uLi4vZWRhYy9tYy9tYzxpZD4vY3Nyb3c8aW5kZXg+ICAgKi8KKworCWtvYmplY3RfaW5pdCgmY3Nyb3ctPmtvYmopOworCWNzcm93LT5rb2JqLnBhcmVudCA9IGVkYWNfbWNpX2tvYmo7CisJY3Nyb3ctPmtvYmoua3R5cGUgPSAma3R5cGVfY3Nyb3c7CisKKwkvKiBuYW1lIHRoaXMgaW5zdGFuY2Ugb2YgY3Nyb3c8aWQ+ICovCisJZXJyID0ga29iamVjdF9zZXRfbmFtZSgmY3Nyb3ctPmtvYmosImNzcm93JWQiLGluZGV4KTsKKwlpZiAoIWVycikgeworCQkvKiBJbnN0YW5zdGlhdGUgdGhlIGNzcm93IG9iamVjdCAqLworCQllcnIgPSBrb2JqZWN0X3JlZ2lzdGVyKCZjc3Jvdy0+a29iaik7CisJCWlmIChlcnIpCisJCQlkZWJ1Z2YwKCJGYWlsZWQgdG8gcmVnaXN0ZXIgQ1NST1clZFxuIixpbmRleCk7CisJCWVsc2UKKwkJCWRlYnVnZjAoIlJlZ2lzdGVyZWQgQ1NST1clZFxuIixpbmRleCk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyogc3lzZnMgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBtZXRob2RzIGZvciB0aGUgTUNJIGtvYmplY3RzICovCisKK3N0YXRpYyBzc2l6ZV90IG1jaV9yZXNldF9jb3VudGVyc19zdG9yZShzdHJ1Y3QgbWVtX2N0bF9pbmZvICAqbWNpLAorCQkJCQljb25zdCBjaGFyICpkYXRhLCBzaXplX3QgY291bnQgKQoreworCWludCByb3csIGNoYW47CisKKwltY2ktPnVlX25vaW5mb19jb3VudCA9IDA7CisJbWNpLT5jZV9ub2luZm9fY291bnQgPSAwOworCW1jaS0+dWVfY291bnQgPSAwOworCW1jaS0+Y2VfY291bnQgPSAwOworCWZvciAocm93ID0gMDsgcm93IDwgbWNpLT5ucl9jc3Jvd3M7IHJvdysrKSB7CisJCXN0cnVjdCBjc3Jvd19pbmZvICpyaSA9ICZtY2ktPmNzcm93c1tyb3ddOworCisJCXJpLT51ZV9jb3VudCA9IDA7CisJCXJpLT5jZV9jb3VudCA9IDA7CisJCWZvciAoY2hhbiA9IDA7IGNoYW4gPCByaS0+bnJfY2hhbm5lbHM7IGNoYW4rKykKKwkJCXJpLT5jaGFubmVsc1tjaGFuXS5jZV9jb3VudCA9IDA7CisJfQorCW1jaS0+c3RhcnRfdGltZSA9IGppZmZpZXM7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1jaV91ZV9jb3VudF9zaG93KHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgY2hhciAqZGF0YSkKK3sKKwlyZXR1cm4gc3ByaW50ZihkYXRhLCIlZFxuIiwgbWNpLT51ZV9jb3VudCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1jaV9jZV9jb3VudF9zaG93KHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgY2hhciAqZGF0YSkKK3sKKwlyZXR1cm4gc3ByaW50ZihkYXRhLCIlZFxuIiwgbWNpLT5jZV9jb3VudCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1jaV9jZV9ub2luZm9fc2hvdyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIGNoYXIgKmRhdGEpCit7CisJcmV0dXJuIHNwcmludGYoZGF0YSwiJWRcbiIsIG1jaS0+Y2Vfbm9pbmZvX2NvdW50KTsKK30KKworc3RhdGljIHNzaXplX3QgbWNpX3VlX25vaW5mb19zaG93KHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgY2hhciAqZGF0YSkKK3sKKwlyZXR1cm4gc3ByaW50ZihkYXRhLCIlZFxuIiwgbWNpLT51ZV9ub2luZm9fY291bnQpOworfQorCitzdGF0aWMgc3NpemVfdCBtY2lfc2Vjb25kc19zaG93KHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgY2hhciAqZGF0YSkKK3sKKwlyZXR1cm4gc3ByaW50ZihkYXRhLCIlbGRcbiIsIChqaWZmaWVzIC0gbWNpLT5zdGFydF90aW1lKSAvIEhaKTsKK30KKworc3RhdGljIHNzaXplX3QgbWNpX21vZF9uYW1lX3Nob3coc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLCBjaGFyICpkYXRhKQoreworCXJldHVybiBzcHJpbnRmKGRhdGEsIiVzICVzXG4iLCBtY2ktPm1vZF9uYW1lLCBtY2ktPm1vZF92ZXIpOworfQorCitzdGF0aWMgc3NpemVfdCBtY2lfY3RsX25hbWVfc2hvdyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIGNoYXIgKmRhdGEpCit7CisJcmV0dXJuIHNwcmludGYoZGF0YSwiJXNcbiIsIG1jaS0+Y3RsX25hbWUpOworfQorCitzdGF0aWMgaW50IG1jaV9vdXRwdXRfZWRhY19jYXAoY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGVkYWNfY2FwKQoreworCWNoYXIgKnAgPSBidWY7CisJaW50IGJpdF9pZHg7CisKKwlmb3IgKGJpdF9pZHggPSAwOyBiaXRfaWR4IDwgOCAqIHNpemVvZihlZGFjX2NhcCk7IGJpdF9pZHgrKykgeworCQlpZiAoKGVkYWNfY2FwID4+IGJpdF9pZHgpICYgMHgxKQorCQkJcCArPSBzcHJpbnRmKHAsICIlcyAiLCBlZGFjX2NhcHNbYml0X2lkeF0pOworCX0KKworCXJldHVybiBwIC0gYnVmOworfQorCitzdGF0aWMgc3NpemVfdCBtY2lfZWRhY19jYXBhYmlsaXR5X3Nob3coc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLCBjaGFyICpkYXRhKQoreworCWNoYXIgKnAgPSBkYXRhOworCisJcCArPSBtY2lfb3V0cHV0X2VkYWNfY2FwKHAsbWNpLT5lZGFjX2N0bF9jYXApOworCXAgKz0gc3ByaW50ZihwLCAiXG4iKTsKKworCXJldHVybiBwIC0gZGF0YTsKK30KKworc3RhdGljIHNzaXplX3QgbWNpX2VkYWNfY3VycmVudF9jYXBhYmlsaXR5X3Nob3coc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCQkJY2hhciAqZGF0YSkKK3sKKwljaGFyICpwID0gZGF0YTsKKworCXAgKz0gbWNpX291dHB1dF9lZGFjX2NhcChwLG1jaS0+ZWRhY19jYXApOworCXAgKz0gc3ByaW50ZihwLCAiXG4iKTsKKworCXJldHVybiBwIC0gZGF0YTsKK30KKworc3RhdGljIGludCBtY2lfb3V0cHV0X210eXBlX2NhcChjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbXR5cGVfY2FwKQoreworCWNoYXIgKnAgPSBidWY7CisJaW50IGJpdF9pZHg7CisKKwlmb3IgKGJpdF9pZHggPSAwOyBiaXRfaWR4IDwgOCAqIHNpemVvZihtdHlwZV9jYXApOyBiaXRfaWR4KyspIHsKKwkJaWYgKChtdHlwZV9jYXAgPj4gYml0X2lkeCkgJiAweDEpCisJCQlwICs9IHNwcmludGYocCwgIiVzICIsIG1lbV90eXBlc1tiaXRfaWR4XSk7CisJfQorCisJcmV0dXJuIHAgLSBidWY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1jaV9zdXBwb3J0ZWRfbWVtX3R5cGVfc2hvdyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIGNoYXIgKmRhdGEpCit7CisJY2hhciAqcCA9IGRhdGE7CisKKwlwICs9IG1jaV9vdXRwdXRfbXR5cGVfY2FwKHAsbWNpLT5tdHlwZV9jYXApOworCXAgKz0gc3ByaW50ZihwLCAiXG4iKTsKKworCXJldHVybiBwIC0gZGF0YTsKK30KKworc3RhdGljIHNzaXplX3QgbWNpX3NpemVfbWJfc2hvdyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIGNoYXIgKmRhdGEpCit7CisJaW50IHRvdGFsX3BhZ2VzLCBjc3Jvd19pZHg7CisKKwlmb3IgKHRvdGFsX3BhZ2VzID0gY3Nyb3dfaWR4ID0gMDsgY3Nyb3dfaWR4IDwgbWNpLT5ucl9jc3Jvd3M7CisJCQljc3Jvd19pZHgrKykgeworCQlzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3Nyb3cgPSAmbWNpLT5jc3Jvd3NbY3Nyb3dfaWR4XTsKKworCQlpZiAoIWNzcm93LT5ucl9wYWdlcykKKwkJCWNvbnRpbnVlOworCQl0b3RhbF9wYWdlcyArPSBjc3Jvdy0+bnJfcGFnZXM7CisJfQorCisJcmV0dXJuIHNwcmludGYoZGF0YSwiJXVcbiIsIFBBR0VTX1RPX01pQih0b3RhbF9wYWdlcykpOworfQorCitzdHJ1Y3QgbWNpZGV2X2F0dHJpYnV0ZSB7CisJc3RydWN0IGF0dHJpYnV0ZQlhdHRyOworCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgbWVtX2N0bF9pbmZvICosY2hhciAqKTsKKwlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBtZW1fY3RsX2luZm8gKiwgY29uc3QgY2hhciAqLHNpemVfdCk7Cit9OworCisjZGVmaW5lIHRvX21jaShrKSBjb250YWluZXJfb2Yoaywgc3RydWN0IG1lbV9jdGxfaW5mbywgZWRhY19tY2lfa29iaikKKyNkZWZpbmUgdG9fbWNpZGV2X2F0dHIoYSkgY29udGFpbmVyX29mKGEsIHN0cnVjdCBtY2lkZXZfYXR0cmlidXRlLCBhdHRyKQorCitzdGF0aWMgc3NpemVfdCBtY2lkZXZfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZmZlcikKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptZW1fY3RsX2luZm8gPSB0b19tY2koa29iaik7CisJc3RydWN0IG1jaWRldl9hdHRyaWJ1dGUgKiBtY2lkZXZfYXR0ciA9IHRvX21jaWRldl9hdHRyKGF0dHIpOworCisJaWYgKG1jaWRldl9hdHRyLT5zaG93KQorCQlyZXR1cm4gbWNpZGV2X2F0dHItPnNob3cobWVtX2N0bF9pbmZvLCBidWZmZXIpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgc3NpemVfdCBtY2lkZXZfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWVtX2N0bF9pbmZvID0gdG9fbWNpKGtvYmopOworCXN0cnVjdCBtY2lkZXZfYXR0cmlidXRlICogbWNpZGV2X2F0dHIgPSB0b19tY2lkZXZfYXR0cihhdHRyKTsKKworCWlmIChtY2lkZXZfYXR0ci0+c3RvcmUpCisJCXJldHVybiBtY2lkZXZfYXR0ci0+c3RvcmUobWVtX2N0bF9pbmZvLCBidWZmZXIsIGNvdW50KTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIHN0cnVjdCBzeXNmc19vcHMgbWNpX29wcyA9IHsKKwkuc2hvdyAgID0gbWNpZGV2X3Nob3csCisJLnN0b3JlICA9IG1jaWRldl9zdG9yZQorfTsKKworI2RlZmluZSBNQ0lERVZfQVRUUihfbmFtZSxfbW9kZSxfc2hvdyxfc3RvcmUpCQkJXAorc3RydWN0IG1jaWRldl9hdHRyaWJ1dGUgbWNpX2F0dHJfIyNfbmFtZSA9IHsJCQlcCisJLmF0dHIgPSB7Lm5hbWUgPSBfX3N0cmluZ2lmeShfbmFtZSksIC5tb2RlID0gX21vZGUgfSwJXAorCS5zaG93ICAgPSBfc2hvdywJCQkJCVwKKwkuc3RvcmUgID0gX3N0b3JlLAkJCQkJXAorfTsKKworLyogQ29udHJvbCBmaWxlICovCitNQ0lERVZfQVRUUihyZXNldF9jb3VudGVycyxTX0lXVVNSLE5VTEwsbWNpX3Jlc2V0X2NvdW50ZXJzX3N0b3JlKTsKKworLyogQXR0cmlidXRlIGZpbGVzICovCitNQ0lERVZfQVRUUihtY19uYW1lLFNfSVJVR08sbWNpX2N0bF9uYW1lX3Nob3csTlVMTCk7CitNQ0lERVZfQVRUUihtb2R1bGVfbmFtZSxTX0lSVUdPLG1jaV9tb2RfbmFtZV9zaG93LE5VTEwpOworTUNJREVWX0FUVFIoZWRhY19jYXBhYmlsaXR5LFNfSVJVR08sbWNpX2VkYWNfY2FwYWJpbGl0eV9zaG93LE5VTEwpOworTUNJREVWX0FUVFIoc2l6ZV9tYixTX0lSVUdPLG1jaV9zaXplX21iX3Nob3csTlVMTCk7CitNQ0lERVZfQVRUUihzZWNvbmRzX3NpbmNlX3Jlc2V0LFNfSVJVR08sbWNpX3NlY29uZHNfc2hvdyxOVUxMKTsKK01DSURFVl9BVFRSKHVlX25vaW5mb19jb3VudCxTX0lSVUdPLG1jaV91ZV9ub2luZm9fc2hvdyxOVUxMKTsKK01DSURFVl9BVFRSKGNlX25vaW5mb19jb3VudCxTX0lSVUdPLG1jaV9jZV9ub2luZm9fc2hvdyxOVUxMKTsKK01DSURFVl9BVFRSKHVlX2NvdW50LFNfSVJVR08sbWNpX3VlX2NvdW50X3Nob3csTlVMTCk7CitNQ0lERVZfQVRUUihjZV9jb3VudCxTX0lSVUdPLG1jaV9jZV9jb3VudF9zaG93LE5VTEwpOworTUNJREVWX0FUVFIoZWRhY19jdXJyZW50X2NhcGFiaWxpdHksU19JUlVHTywKKwltY2lfZWRhY19jdXJyZW50X2NhcGFiaWxpdHlfc2hvdyxOVUxMKTsKK01DSURFVl9BVFRSKHN1cHBvcnRlZF9tZW1fdHlwZSxTX0lSVUdPLAorCW1jaV9zdXBwb3J0ZWRfbWVtX3R5cGVfc2hvdyxOVUxMKTsKKworCitzdGF0aWMgc3RydWN0IG1jaWRldl9hdHRyaWJ1dGUgKm1jaV9hdHRyW10gPSB7CisJJm1jaV9hdHRyX3Jlc2V0X2NvdW50ZXJzLAorCSZtY2lfYXR0cl9tb2R1bGVfbmFtZSwKKwkmbWNpX2F0dHJfbWNfbmFtZSwKKwkmbWNpX2F0dHJfZWRhY19jYXBhYmlsaXR5LAorCSZtY2lfYXR0cl9lZGFjX2N1cnJlbnRfY2FwYWJpbGl0eSwKKwkmbWNpX2F0dHJfc3VwcG9ydGVkX21lbV90eXBlLAorCSZtY2lfYXR0cl9zaXplX21iLAorCSZtY2lfYXR0cl9zZWNvbmRzX3NpbmNlX3Jlc2V0LAorCSZtY2lfYXR0cl91ZV9ub2luZm9fY291bnQsCisJJm1jaV9hdHRyX2NlX25vaW5mb19jb3VudCwKKwkmbWNpX2F0dHJfdWVfY291bnQsCisJJm1jaV9hdHRyX2NlX2NvdW50LAorCU5VTEwKK307CisKKworLyoKKyAqIFJlbGVhc2Ugb2YgYSBNQyBjb250cm9sbGluZyBpbnN0YW5jZQorICovCitzdGF0aWMgdm9pZCBlZGFjX21jaV9pbnN0YW5jZV9yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaTsKKwltY2kgPSBjb250YWluZXJfb2Yoa29iaixzdHJ1Y3QgbWVtX2N0bF9pbmZvLGVkYWNfbWNpX2tvYmopOworCisJZGVidWdmMCgiTUM6ICIgX19GSUxFX18gIjogJXMoKSBpZHg9JWQgY2FsbGluZyBrZnJlZVxuIiwKKwkJX19mdW5jX18sIG1jaS0+bWNfaWR4KTsKKworCWtmcmVlKG1jaSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGt0eXBlX21jaSA9IHsKKwkucmVsZWFzZQk9IGVkYWNfbWNpX2luc3RhbmNlX3JlbGVhc2UsCisJLnN5c2ZzX29wcwk9ICZtY2lfb3BzLAorCS5kZWZhdWx0X2F0dHJzCT0gKHN0cnVjdCBhdHRyaWJ1dGUgKiopIG1jaV9hdHRyLAorfTsKKworI2RlZmluZSBFREFDX0RFVklDRV9TWU1MSU5LCSJkZXZpY2UiCisKKy8qCisgKiBDcmVhdGUgYSBuZXcgTWVtb3J5IENvbnRyb2xsZXIga29iamVjdCBpbnN0YW5jZSwKKyAqCW1jPGlkPiB1bmRlciB0aGUgJ21jJyBkaXJlY3RvcnkKKyAqCisgKiBSZXR1cm46CisgKgkwCVN1Y2Nlc3MKKyAqCSEwCUZhaWx1cmUKKyAqLworc3RhdGljIGludCBlZGFjX2NyZWF0ZV9zeXNmc19tY2lfZGV2aWNlKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlpbnQgaTsKKwlpbnQgZXJyOworCXN0cnVjdCBjc3Jvd19pbmZvICpjc3JvdzsKKwlzdHJ1Y3Qga29iamVjdCAqZWRhY19tY2lfa29iaj0mbWNpLT5lZGFjX21jaV9rb2JqOworCisJZGVidWdmMCgiTUM6ICIgX19GSUxFX18gIjogJXMoKSBpZHg9JWRcbiIsIF9fZnVuY19fLCBtY2ktPm1jX2lkeCk7CisKKwltZW1zZXQoZWRhY19tY2lfa29iaiwgMCwgc2l6ZW9mKCplZGFjX21jaV9rb2JqKSk7CisJa29iamVjdF9pbml0KGVkYWNfbWNpX2tvYmopOworCisJLyogc2V0IHRoZSBuYW1lIG9mIHRoZSBtYzxpZD4gb2JqZWN0ICovCisJZXJyID0ga29iamVjdF9zZXRfbmFtZShlZGFjX21jaV9rb2JqLCJtYyVkIixtY2ktPm1jX2lkeCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIGxpbmsgdG8gb3VyIHBhcmVudCB0aGUgJy4uLi4vZWRhYy9tYycgb2JqZWN0ICovCisJZWRhY19tY2lfa29iai0+cGFyZW50ID0gJmVkYWNfbWVtY3RybF9rb2JqOworCWVkYWNfbWNpX2tvYmotPmt0eXBlID0gJmt0eXBlX21jaTsKKworCS8qIHJlZ2lzdGVyIHRoZSBtYzxpZD4ga29iamVjdCAqLworCWVyciA9IGtvYmplY3RfcmVnaXN0ZXIoZWRhY19tY2lfa29iaik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIGNyZWF0ZSBhIHN5bWxpbmsgZm9yIHRoZSBkZXZpY2UgKi8KKwllcnIgPSBzeXNmc19jcmVhdGVfbGluayhlZGFjX21jaV9rb2JqLCAmbWNpLT5wZGV2LT5kZXYua29iaiwKKwkJCQlFREFDX0RFVklDRV9TWU1MSU5LKTsKKwlpZiAoZXJyKSB7CisJCWtvYmplY3RfdW5yZWdpc3RlcihlZGFjX21jaV9rb2JqKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBNYWtlIGRpcmVjdG9yaWVzIGZvciBlYWNoIENTUk9XIG9iamVjdAorCSAqIHVuZGVyIHRoZSBtYzxpZD4ga29iamVjdAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBtY2ktPm5yX2Nzcm93czsgaSsrKSB7CisKKwkJY3Nyb3cgPSAmbWNpLT5jc3Jvd3NbaV07CisKKwkJLyogT25seSBleHBvc2UgcG9wdWxhdGVkIENTUk9XcyAqLworCQlpZiAoY3Nyb3ctPm5yX3BhZ2VzID4gMCkgeworCQkJZXJyID0gZWRhY19jcmVhdGVfY3Nyb3dfb2JqZWN0KGVkYWNfbWNpX2tvYmosY3Nyb3csaSk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCS8qIE1hcmsgdGhpcyBNQ0kgaW5zdGFuY2UgYXMgaGF2aW5nIHN5c2ZzIGVudHJpZXMgKi8KKwltY2ktPnN5c2ZzX2FjdGl2ZSA9IE1DSV9TWVNGU19BQ1RJVkU7CisKKwlyZXR1cm4gMDsKKworCisJLyogQ1NST1cgZXJyb3I6IGJhY2tvdXQgd2hhdCBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQsICAqLworZmFpbDoKKwlmb3IgKCBpLS07IGkgPj0gMDsgaS0tKSB7CisJCWlmIChjc3Jvdy0+bnJfcGFnZXMgPiAwKSB7CisJCQlrb2JqZWN0X3VucmVnaXN0ZXIoJm1jaS0+Y3Nyb3dzW2ldLmtvYmopOworCQkJa29iamVjdF9wdXQoJm1jaS0+Y3Nyb3dzW2ldLmtvYmopOworCQl9CisJfQorCisJa29iamVjdF91bnJlZ2lzdGVyKGVkYWNfbWNpX2tvYmopOworCWtvYmplY3RfcHV0KGVkYWNfbWNpX2tvYmopOworCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIHJlbW92ZSBhIE1lbW9yeSBDb250cm9sbGVyIGluc3RhbmNlCisgKi8KK3N0YXRpYyB2b2lkIGVkYWNfcmVtb3ZlX3N5c2ZzX21jaV9kZXZpY2Uoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCWludCBpOworCisJZGVidWdmMCgiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCisJLyogcmVtb3ZlIGFsbCBjc3JvdyBrb2JqZWN0cyAqLworCWZvciAoaSA9IDA7IGkgPCBtY2ktPm5yX2Nzcm93czsgaSsrKSB7CisJCWlmIChtY2ktPmNzcm93c1tpXS5ucl9wYWdlcyA+IDApICB7CisJCQlrb2JqZWN0X3VucmVnaXN0ZXIoJm1jaS0+Y3Nyb3dzW2ldLmtvYmopOworCQkJa29iamVjdF9wdXQoJm1jaS0+Y3Nyb3dzW2ldLmtvYmopOworCQl9CisJfQorCisJc3lzZnNfcmVtb3ZlX2xpbmsoJm1jaS0+ZWRhY19tY2lfa29iaiwgRURBQ19ERVZJQ0VfU1lNTElOSyk7CisKKwlrb2JqZWN0X3VucmVnaXN0ZXIoJm1jaS0+ZWRhY19tY2lfa29iaik7CisJa29iamVjdF9wdXQoJm1jaS0+ZWRhY19tY2lfa29iaik7Cit9CisKKy8qIEVORCBPRiBzeXNmcyBkYXRhIGFuZCBtZXRob2RzICovCisKKyNpZmRlZiBDT05GSUdfRURBQ19ERUJVRworCitFWFBPUlRfU1lNQk9MKGVkYWNfbWNfZHVtcF9jaGFubmVsKTsKKwordm9pZCBlZGFjX21jX2R1bXBfY2hhbm5lbChzdHJ1Y3QgY2hhbm5lbF9pbmZvICpjaGFuKQoreworCWRlYnVnZjQoIlx0Y2hhbm5lbCA9ICVwXG4iLCBjaGFuKTsKKwlkZWJ1Z2Y0KCJcdGNoYW5uZWwtPmNoYW5faWR4ID0gJWRcbiIsIGNoYW4tPmNoYW5faWR4KTsKKwlkZWJ1Z2Y0KCJcdGNoYW5uZWwtPmNlX2NvdW50ID0gJWRcbiIsIGNoYW4tPmNlX2NvdW50KTsKKwlkZWJ1Z2Y0KCJcdGNoYW5uZWwtPmxhYmVsID0gJyVzJ1xuIiwgY2hhbi0+bGFiZWwpOworCWRlYnVnZjQoIlx0Y2hhbm5lbC0+Y3Nyb3cgPSAlcFxuXG4iLCBjaGFuLT5jc3Jvdyk7Cit9CisKKworRVhQT1JUX1NZTUJPTChlZGFjX21jX2R1bXBfY3Nyb3cpOworCit2b2lkIGVkYWNfbWNfZHVtcF9jc3JvdyhzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3Nyb3cpCit7CisJZGVidWdmNCgiXHRjc3JvdyA9ICVwXG4iLCBjc3Jvdyk7CisJZGVidWdmNCgiXHRjc3Jvdy0+Y3Nyb3dfaWR4ID0gJWRcbiIsIGNzcm93LT5jc3Jvd19pZHgpOworCWRlYnVnZjQoIlx0Y3Nyb3ctPmZpcnN0X3BhZ2UgPSAweCVseFxuIiwKKwkJY3Nyb3ctPmZpcnN0X3BhZ2UpOworCWRlYnVnZjQoIlx0Y3Nyb3ctPmxhc3RfcGFnZSA9IDB4JWx4XG4iLCBjc3Jvdy0+bGFzdF9wYWdlKTsKKwlkZWJ1Z2Y0KCJcdGNzcm93LT5wYWdlX21hc2sgPSAweCVseFxuIiwgY3Nyb3ctPnBhZ2VfbWFzayk7CisJZGVidWdmNCgiXHRjc3Jvdy0+bnJfcGFnZXMgPSAweCV4XG4iLCBjc3Jvdy0+bnJfcGFnZXMpOworCWRlYnVnZjQoIlx0Y3Nyb3ctPm5yX2NoYW5uZWxzID0gJWRcbiIsCisJCWNzcm93LT5ucl9jaGFubmVscyk7CisJZGVidWdmNCgiXHRjc3Jvdy0+Y2hhbm5lbHMgPSAlcFxuIiwgY3Nyb3ctPmNoYW5uZWxzKTsKKwlkZWJ1Z2Y0KCJcdGNzcm93LT5tY2kgPSAlcFxuXG4iLCBjc3Jvdy0+bWNpKTsKK30KKworCitFWFBPUlRfU1lNQk9MKGVkYWNfbWNfZHVtcF9tY2kpOworCit2b2lkIGVkYWNfbWNfZHVtcF9tY2koc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCWRlYnVnZjMoIlx0bWNpID0gJXBcbiIsIG1jaSk7CisJZGVidWdmMygiXHRtY2ktPm10eXBlX2NhcCA9ICVseFxuIiwgbWNpLT5tdHlwZV9jYXApOworCWRlYnVnZjMoIlx0bWNpLT5lZGFjX2N0bF9jYXAgPSAlbHhcbiIsIG1jaS0+ZWRhY19jdGxfY2FwKTsKKwlkZWJ1Z2YzKCJcdG1jaS0+ZWRhY19jYXAgPSAlbHhcbiIsIG1jaS0+ZWRhY19jYXApOworCWRlYnVnZjQoIlx0bWNpLT5lZGFjX2NoZWNrID0gJXBcbiIsIG1jaS0+ZWRhY19jaGVjayk7CisJZGVidWdmMygiXHRtY2ktPm5yX2Nzcm93cyA9ICVkLCBjc3Jvd3MgPSAlcFxuIiwKKwkJbWNpLT5ucl9jc3Jvd3MsIG1jaS0+Y3Nyb3dzKTsKKwlkZWJ1Z2YzKCJcdHBkZXYgPSAlcFxuIiwgbWNpLT5wZGV2KTsKKwlkZWJ1Z2YzKCJcdG1vZF9uYW1lOmN0bF9uYW1lID0gJXM6JXNcbiIsCisJCW1jaS0+bW9kX25hbWUsIG1jaS0+Y3RsX25hbWUpOworCWRlYnVnZjMoIlx0cHZ0X2luZm8gPSAlcFxuXG4iLCBtY2ktPnB2dF9pbmZvKTsKK30KKworCisjZW5kaWYJCQkJLyogQ09ORklHX0VEQUNfREVCVUcgKi8KKworLyogJ3B0cicgcG9pbnRzIHRvIGEgcG9zc2libHkgdW5hbGlnbmVkIGl0ZW0gWCBzdWNoIHRoYXQgc2l6ZW9mKFgpIGlzICdzaXplJy4KKyAqIEFkanVzdCAncHRyJyBzbyB0aGF0IGl0cyBhbGlnbm1lbnQgaXMgYXQgbGVhc3QgYXMgc3RyaW5nZW50IGFzIHdoYXQgdGhlCisgKiBjb21waWxlciB3b3VsZCBwcm92aWRlIGZvciBYIGFuZCByZXR1cm4gdGhlIGFsaWduZWQgcmVzdWx0LgorICoKKyAqIElmICdzaXplJyBpcyBhIGNvbnN0YW50LCB0aGUgY29tcGlsZXIgd2lsbCBvcHRpbWl6ZSB0aGlzIHdob2xlIGZ1bmN0aW9uCisgKiBkb3duIHRvIGVpdGhlciBhIG5vLW9wIG9yIHRoZSBhZGRpdGlvbiBvZiBhIGNvbnN0YW50IHRvIHRoZSB2YWx1ZSBvZiAncHRyJy4KKyAqLworc3RhdGljIGlubGluZSBjaGFyICogYWxpZ25fcHRyICh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCit7CisJdW5zaWduZWQgYWxpZ24sIHI7CisKKwkvKiBIZXJlIHdlIGFzc3VtZSB0aGF0IHRoZSBhbGlnbm1lbnQgb2YgYSAibG9uZyBsb25nIiBpcyB0aGUgbW9zdAorCSAqIHN0cmluZ2VudCBhbGlnbm1lbnQgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBldmVyIHByb3ZpZGUgYnkgZGVmYXVsdC4KKwkgKiBBcyBmYXIgYXMgSSBrbm93LCB0aGlzIGlzIGEgcmVhc29uYWJsZSBhc3N1bXB0aW9uLgorCSAqLworCWlmIChzaXplID4gc2l6ZW9mKGxvbmcpKQorCQlhbGlnbiA9IHNpemVvZihsb25nIGxvbmcpOworCWVsc2UgaWYgKHNpemUgPiBzaXplb2YoaW50KSkKKwkJYWxpZ24gPSBzaXplb2YobG9uZyk7CisJZWxzZSBpZiAoc2l6ZSA+IHNpemVvZihzaG9ydCkpCisJCWFsaWduID0gc2l6ZW9mKGludCk7CisJZWxzZSBpZiAoc2l6ZSA+IHNpemVvZihjaGFyKSkKKwkJYWxpZ24gPSBzaXplb2Yoc2hvcnQpOworCWVsc2UKKwkJcmV0dXJuIChjaGFyICopIHB0cjsKKworCXIgPSBzaXplICUgYWxpZ247CisKKwlpZiAociA9PSAwKQorCQlyZXR1cm4gKGNoYXIgKikgcHRyOworCisJcmV0dXJuIChjaGFyICopICgoKHVuc2lnbmVkIGxvbmcpIHB0cikgKyBhbGlnbiAtIHIpOworfQorCisKK0VYUE9SVF9TWU1CT0woZWRhY19tY19hbGxvYyk7CisKKy8qKgorICogZWRhY19tY19hbGxvYzogQWxsb2NhdGUgYSBzdHJ1Y3QgbWVtX2N0bF9pbmZvIHN0cnVjdHVyZQorICogQHNpemVfcHZ0OglzaXplIG9mIHByaXZhdGUgc3RvcmFnZSBuZWVkZWQKKyAqIEBucl9jc3Jvd3M6CU51bWJlciBvZiBDV1JPV1MgbmVlZGVkIGZvciB0aGlzIE1DCisgKiBAbnJfY2hhbnM6CU51bWJlciBvZiBjaGFubmVscyBmb3IgdGhlIE1DCisgKgorICogRXZlcnl0aGluZyBpcyBrbWFsbG9jJ2VkIGFzIG9uZSBiaWcgY2h1bmsgLSBtb3JlIGVmZmljaWVudC4KKyAqIE9ubHkgY2FuIGJlIHVzZWQgaWYgYWxsIHN0cnVjdHVyZXMgaGF2ZSB0aGUgc2FtZSBsaWZldGltZSAtIG90aGVyd2lzZQorICogeW91IGhhdmUgdG8gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgeW91ciBvd24gc3RydWN0dXJlcy4KKyAqCisgKiBVc2UgZWRhY19tY19mcmVlKCkgdG8gZnJlZSBtYyBzdHJ1Y3R1cmVzIGFsbG9jYXRlZCBieSB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFJldHVybnM6CisgKglOVUxMIGFsbG9jYXRpb24gZmFpbGVkCisgKglzdHJ1Y3QgbWVtX2N0bF9pbmZvIHBvaW50ZXIKKyAqLworc3RydWN0IG1lbV9jdGxfaW5mbyAqZWRhY19tY19hbGxvYyh1bnNpZ25lZCBzel9wdnQsIHVuc2lnbmVkIG5yX2Nzcm93cywKKwkJCQkJdW5zaWduZWQgbnJfY2hhbnMpCit7CisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpOworCXN0cnVjdCBjc3Jvd19pbmZvICpjc2ksICpjc3JvdzsKKwlzdHJ1Y3QgY2hhbm5lbF9pbmZvICpjaGksICpjaHAsICpjaGFuOworCXZvaWQgKnB2dDsKKwl1bnNpZ25lZCBzaXplOworCWludCByb3csIGNobjsKKworCS8qIEZpZ3VyZSBvdXQgdGhlIG9mZnNldHMgb2YgdGhlIHZhcmlvdXMgaXRlbXMgZnJvbSB0aGUgc3RhcnQgb2YgYW4gbWMKKwkgKiBzdHJ1Y3R1cmUuICBXZSB3YW50IHRoZSBhbGlnbm1lbnQgb2YgZWFjaCBpdGVtIHRvIGJlIGF0IGxlYXN0IGFzCisJICogc3RyaW5nZW50IGFzIHdoYXQgdGhlIGNvbXBpbGVyIHdvdWxkIHByb3ZpZGUgaWYgd2UgY291bGQgc2ltcGx5CisJICogaGFyZGNvZGUgZXZlcnl0aGluZyBpbnRvIGEgc2luZ2xlIHN0cnVjdC4KKwkgKi8KKwltY2kgPSAoc3RydWN0IG1lbV9jdGxfaW5mbyAqKSAwOworCWNzaSA9IChzdHJ1Y3QgY3Nyb3dfaW5mbyAqKWFsaWduX3B0cigmbWNpWzFdLCBzaXplb2YoKmNzaSkpOworCWNoaSA9IChzdHJ1Y3QgY2hhbm5lbF9pbmZvICopCisJCQlhbGlnbl9wdHIoJmNzaVtucl9jc3Jvd3NdLCBzaXplb2YoKmNoaSkpOworCXB2dCA9IGFsaWduX3B0cigmY2hpW25yX2NoYW5zICogbnJfY3Nyb3dzXSwgc3pfcHZ0KTsKKwlzaXplID0gKCh1bnNpZ25lZCBsb25nKSBwdnQpICsgc3pfcHZ0OworCisJaWYgKChtY2kgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIEFkanVzdCBwb2ludGVycyBzbyB0aGV5IHBvaW50IHdpdGhpbiB0aGUgbWVtb3J5IHdlIGp1c3QgYWxsb2NhdGVkCisJICogcmF0aGVyIHRoYW4gYW4gaW1hZ2luYXJ5IGNodW5rIG9mIG1lbW9yeSBsb2NhdGVkIGF0IGFkZHJlc3MgMC4KKwkgKi8KKwljc2kgPSAoc3RydWN0IGNzcm93X2luZm8gKikgKCgoY2hhciAqKSBtY2kpICsgKCh1bnNpZ25lZCBsb25nKSBjc2kpKTsKKwljaGkgPSAoc3RydWN0IGNoYW5uZWxfaW5mbyAqKSAoKChjaGFyICopIG1jaSkgKyAoKHVuc2lnbmVkIGxvbmcpIGNoaSkpOworCXB2dCA9IHN6X3B2dCA/ICgoKGNoYXIgKikgbWNpKSArICgodW5zaWduZWQgbG9uZykgcHZ0KSkgOiBOVUxMOworCisJbWVtc2V0KG1jaSwgMCwgc2l6ZSk7CS8qIGNsZWFyIGFsbCBmaWVsZHMgKi8KKworCW1jaS0+Y3Nyb3dzID0gY3NpOworCW1jaS0+cHZ0X2luZm8gPSBwdnQ7CisJbWNpLT5ucl9jc3Jvd3MgPSBucl9jc3Jvd3M7CisKKwlmb3IgKHJvdyA9IDA7IHJvdyA8IG5yX2Nzcm93czsgcm93KyspIHsKKwkJY3Nyb3cgPSAmY3NpW3Jvd107CisJCWNzcm93LT5jc3Jvd19pZHggPSByb3c7CisJCWNzcm93LT5tY2kgPSBtY2k7CisJCWNzcm93LT5ucl9jaGFubmVscyA9IG5yX2NoYW5zOworCQljaHAgPSAmY2hpW3JvdyAqIG5yX2NoYW5zXTsKKwkJY3Nyb3ctPmNoYW5uZWxzID0gY2hwOworCisJCWZvciAoY2huID0gMDsgY2huIDwgbnJfY2hhbnM7IGNobisrKSB7CisJCQljaGFuID0gJmNocFtjaG5dOworCQkJY2hhbi0+Y2hhbl9pZHggPSBjaG47CisJCQljaGFuLT5jc3JvdyA9IGNzcm93OworCQl9CisJfQorCisJcmV0dXJuIG1jaTsKK30KKworCitFWFBPUlRfU1lNQk9MKGVkYWNfbWNfZnJlZSk7CisKKy8qKgorICogZWRhY19tY19mcmVlOiAgRnJlZSBhIHByZXZpb3VzbHkgYWxsb2NhdGVkICdtY2knIHN0cnVjdHVyZQorICogQG1jaTogcG9pbnRlciB0byBhIHN0cnVjdCBtZW1fY3RsX2luZm8gc3RydWN0dXJlCisgKgorICogRnJlZSB1cCBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIG1jaSBzdHJ1Y3R1cmUKKyAqIEEgTUNJIHN0cnVjdHVyZSBjYW4gYmUgaW4gMiBzdGF0ZXMgYWZ0ZXIgYmVpbmcgYWxsb2NhdGVkCisgKiBieSBlZGFjX21jX2FsbG9jKCkuCisgKgkxKSBBbGxvY2F0ZWQgaW4gYSBNQyBkcml2ZXIncyBwcm9iZSwgYnV0IG5vdCB5ZXQgY29tbWl0dGVkCisgKgkyKSBBbGxvY2F0ZWQgYW5kIGNvbW1pdHRlZCwgYnkgYSBjYWxsIHRvICBlZGFjX21jX2FkZF9tYygpCisgKiBlZGFjX21jX2FkZF9tYygpIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGFkZHMgdGhlIHN5c2ZzIGVudHJpZXMKKyAqIHRodXMsIHRoaXMgZnJlZSBmdW5jdGlvbiBtdXN0IGRldGVybWluZSB3aGljaCBzdGF0ZSB0aGUgJ21jaScKKyAqIHN0cnVjdHVyZSBpcyBpbiwgdGhlbiBlaXRoZXIgZnJlZSBpdCBkaXJlY3RseSBvcgorICogcGVyZm9ybSBrb2JqZWN0IGNsZWFudXAgYnkgY2FsbGluZyBlZGFjX3JlbW92ZV9zeXNmc19tY2lfZGV2aWNlKCkuCisgKgorICogVk9JRCBSZXR1cm4KKyAqLwordm9pZCBlZGFjX21jX2ZyZWUoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCS8qIG9ubHkgaWYgc3lzZnMgZW50cmllcyBmb3IgdGhpcyBtY2kgaW5zdGFuY2UgZXhpc3QKKwkgKiBkbyB3ZSByZW1vdmUgdGhlbSBhbmQgZGVmZXIgdGhlIGFjdHVhbCBrZnJlZSB2aWEKKwkgKiB0aGUga29iamVjdCAncmVsZWFzZSgpJyBjYWxsYmFjay4KKyAJICoKKwkgKiBPdGhlcndpc2UsIGRvIGEgc3RyYWlnaHQga2ZyZWUgbm93LgorCSAqLworCWlmIChtY2ktPnN5c2ZzX2FjdGl2ZSA9PSBNQ0lfU1lTRlNfQUNUSVZFKQorCQllZGFjX3JlbW92ZV9zeXNmc19tY2lfZGV2aWNlKG1jaSk7CisJZWxzZQorCQlrZnJlZShtY2kpOworfQorCisKKworRVhQT1JUX1NZTUJPTChlZGFjX21jX2ZpbmRfbWNpX2J5X3BkZXYpOworCitzdHJ1Y3QgbWVtX2N0bF9pbmZvICplZGFjX21jX2ZpbmRfbWNpX2J5X3BkZXYoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpOworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CisKKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlsaXN0X2Zvcl9lYWNoKGl0ZW0sICZtY19kZXZpY2VzKSB7CisJCW1jaSA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IG1lbV9jdGxfaW5mbywgbGluayk7CisKKwkJaWYgKG1jaS0+cGRldiA9PSBwZGV2KQorCQkJcmV0dXJuIG1jaTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBhZGRfbWNfdG9fZ2xvYmFsX2xpc3QgKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICppdGVtLCAqaW5zZXJ0X2JlZm9yZTsKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICpwOworCWludCBpOworCisJaWYgKGxpc3RfZW1wdHkoJm1jX2RldmljZXMpKSB7CisJCW1jaS0+bWNfaWR4ID0gMDsKKwkJaW5zZXJ0X2JlZm9yZSA9ICZtY19kZXZpY2VzOworCX0gZWxzZSB7CisJCWlmIChlZGFjX21jX2ZpbmRfbWNpX2J5X3BkZXYobWNpLT5wZGV2KSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJFREFDIE1DOiAlcyAoJXMpICVzICVzIGFscmVhZHkgYXNzaWduZWQgJWRcbiIsCisJCQkJbWNpLT5wZGV2LT5kZXYuYnVzX2lkLCBwY2lfbmFtZShtY2ktPnBkZXYpLAorCQkJCW1jaS0+bW9kX25hbWUsIG1jaS0+Y3RsX25hbWUsIG1jaS0+bWNfaWR4KTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJaW5zZXJ0X2JlZm9yZSA9IE5VTEw7CisJCWkgPSAwOworCisJCWxpc3RfZm9yX2VhY2goaXRlbSwgJm1jX2RldmljZXMpIHsKKwkJCXAgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBtZW1fY3RsX2luZm8sIGxpbmspOworCisJCQlpZiAocC0+bWNfaWR4ICE9IGkpIHsKKwkJCQlpbnNlcnRfYmVmb3JlID0gaXRlbTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaSsrOworCQl9CisKKwkJbWNpLT5tY19pZHggPSBpOworCisJCWlmIChpbnNlcnRfYmVmb3JlID09IE5VTEwpCisJCQlpbnNlcnRfYmVmb3JlID0gJm1jX2RldmljZXM7CisJfQorCisJbGlzdF9hZGRfdGFpbF9yY3UoJm1jaS0+bGluaywgaW5zZXJ0X2JlZm9yZSk7CisJcmV0dXJuIDA7Cit9CisKKworCitFWFBPUlRfU1lNQk9MKGVkYWNfbWNfYWRkX21jKTsKKworLyoqCisgKiBlZGFjX21jX2FkZF9tYzogSW5zZXJ0IHRoZSAnbWNpJyBzdHJ1Y3R1cmUgaW50byB0aGUgbWNpIGdsb2JhbCBsaXN0CisgKiBAbWNpOiBwb2ludGVyIHRvIHRoZSBtY2kgc3RydWN0dXJlIHRvIGJlIGFkZGVkIHRvIHRoZSBsaXN0CisgKgorICogUmV0dXJuOgorICoJMAlTdWNjZXNzCisgKgkhMAlGYWlsdXJlCisgKi8KKworLyogRklYTUUgLSBzaG91bGQgYSB3YXJuaW5nIGJlIHByaW50ZWQgaWYgbm8gZXJyb3IgZGV0ZWN0aW9uPyBjb3JyZWN0aW9uPyAqLworaW50IGVkYWNfbWNfYWRkX21jKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlpbnQgcmMgPSAxOworCisJZGVidWdmMCgiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworI2lmZGVmIENPTkZJR19FREFDX0RFQlVHCisJaWYgKGVkYWNfZGVidWdfbGV2ZWwgPj0gMykKKwkJZWRhY19tY19kdW1wX21jaShtY2kpOworCWlmIChlZGFjX2RlYnVnX2xldmVsID49IDQpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IG1jaS0+bnJfY3Nyb3dzOyBpKyspIHsKKwkJCWludCBqOworCQkJZWRhY19tY19kdW1wX2Nzcm93KCZtY2ktPmNzcm93c1tpXSk7CisJCQlmb3IgKGogPSAwOyBqIDwgbWNpLT5jc3Jvd3NbaV0ubnJfY2hhbm5lbHM7IGorKykKKwkJCQllZGFjX21jX2R1bXBfY2hhbm5lbCgmbWNpLT5jc3Jvd3NbaV0uCisJCQkJCQkJICBjaGFubmVsc1tqXSk7CisJCX0KKwl9CisjZW5kaWYKKwlkb3duKCZtZW1fY3Rsc19tdXRleCk7CisKKwlpZiAoYWRkX21jX3RvX2dsb2JhbF9saXN0KG1jaSkpCisJCWdvdG8gZmluaXNoOworCisJLyogc2V0IGxvYWQgdGltZSBzbyB0aGF0IGVycm9yIHJhdGUgY2FuIGJlIHRyYWNrZWQgKi8KKwltY2ktPnN0YXJ0X3RpbWUgPSBqaWZmaWVzOworCisgICAgICAgIGlmIChlZGFjX2NyZWF0ZV9zeXNmc19tY2lfZGV2aWNlKG1jaSkpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HCisgICAgICAgICAgICAgICAgICAgICAgICJFREFDIE1DJWQ6IGZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZGV2aWNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBtY2ktPm1jX2lkeCk7CisJCS8qIEZJWE1FIC0gc2hvdWxkIHRoZXJlIGJlIGFuIGVycm9yIGNvZGUgYW5kIHVud2luZD8gKi8KKyAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgfQorCisJLyogUmVwb3J0IGFjdGlvbiB0YWtlbiAqLworCXByaW50ayhLRVJOX0lORk8KKwkgICAgICAgIkVEQUMgTUMlZDogR2l2aW5nIG91dCBkZXZpY2UgdG8gJXMgJXM6IFBDSSAlc1xuIiwKKwkgICAgICAgbWNpLT5tY19pZHgsIG1jaS0+bW9kX25hbWUsIG1jaS0+Y3RsX25hbWUsCisJICAgICAgIHBjaV9uYW1lKG1jaS0+cGRldikpOworCisKKwlyYyA9IDA7CisKK2ZpbmlzaDoKKwl1cCgmbWVtX2N0bHNfbXV0ZXgpOworCXJldHVybiByYzsKK30KKworCisKK3N0YXRpYyB2b2lkIGNvbXBsZXRlX21jX2xpc3RfZGVsIChzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpOworCisJbWNpID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBtZW1fY3RsX2luZm8sIHJjdSk7CisJSU5JVF9MSVNUX0hFQUQoJm1jaS0+bGluayk7CisJY29tcGxldGUoJm1jaS0+Y29tcGxldGUpOworfQorCitzdGF0aWMgdm9pZCBkZWxfbWNfZnJvbV9nbG9iYWxfbGlzdCAoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCWxpc3RfZGVsX3JjdSgmbWNpLT5saW5rKTsKKwlpbml0X2NvbXBsZXRpb24oJm1jaS0+Y29tcGxldGUpOworCWNhbGxfcmN1KCZtY2ktPnJjdSwgY29tcGxldGVfbWNfbGlzdF9kZWwpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJm1jaS0+Y29tcGxldGUpOworfQorCitFWFBPUlRfU1lNQk9MKGVkYWNfbWNfZGVsX21jKTsKKworLyoqCisgKiBlZGFjX21jX2RlbF9tYzogIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG1jaSBzdHJ1Y3R1cmUgZnJvbSBnbG9iYWwgbGlzdAorICogQG1jaToJUG9pbnRlciB0byBzdHJ1Y3QgbWVtX2N0bF9pbmZvIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnM6CisgKgkwCVN1Y2Nlc3MKKyAqCTEgCUZhaWx1cmUKKyAqLworaW50IGVkYWNfbWNfZGVsX21jKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlpbnQgcmMgPSAxOworCisJZGVidWdmMCgiTUMlZDogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBtY2ktPm1jX2lkeCwgX19mdW5jX18pOworCWRvd24oJm1lbV9jdGxzX211dGV4KTsKKwlkZWxfbWNfZnJvbV9nbG9iYWxfbGlzdChtY2kpOworCXByaW50ayhLRVJOX0lORk8KKwkgICAgICAgIkVEQUMgTUMlZDogUmVtb3ZlZCBkZXZpY2UgJWQgZm9yICVzICVzOiBQQ0kgJXNcbiIsCisJICAgICAgIG1jaS0+bWNfaWR4LCBtY2ktPm1jX2lkeCwgbWNpLT5tb2RfbmFtZSwgbWNpLT5jdGxfbmFtZSwKKwkgICAgICAgcGNpX25hbWUobWNpLT5wZGV2KSk7CisJcmMgPSAwOworCXVwKCZtZW1fY3Rsc19tdXRleCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKworRVhQT1JUX1NZTUJPTChlZGFjX21jX3NjcnViX2Jsb2NrKTsKKwordm9pZCBlZGFjX21jX3NjcnViX2Jsb2NrKHVuc2lnbmVkIGxvbmcgcGFnZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkgICAgICB1MzIgc2l6ZSkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGc7CisJdm9pZCAqdmlydF9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCisJZGVidWdmMygiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCisJLyogRUNDIGVycm9yIHBhZ2Ugd2FzIG5vdCBpbiBvdXIgbWVtb3J5LiBJZ25vcmUgaXQuICovCisJaWYoIXBmbl92YWxpZChwYWdlKSkKKwkJcmV0dXJuOworCisJLyogRmluZCB0aGUgYWN0dWFsIHBhZ2Ugc3RydWN0dXJlIHRoZW4gbWFwIGl0IGFuZCBmaXggKi8KKwlwZyA9IHBmbl90b19wYWdlKHBhZ2UpOworCisJaWYgKFBhZ2VIaWdoTWVtKHBnKSkKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJdmlydF9hZGRyID0ga21hcF9hdG9taWMocGcsIEtNX0JPVU5DRV9SRUFEKTsKKworCS8qIFBlcmZvcm0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGF0b21pYyBzY3J1YiBvcGVyYXRpb24gKi8KKwlhdG9taWNfc2NydWIodmlydF9hZGRyICsgb2Zmc2V0LCBzaXplKTsKKworCS8qIFVubWFwIGFuZCBjb21wbGV0ZSAqLworCWt1bm1hcF9hdG9taWModmlydF9hZGRyLCBLTV9CT1VOQ0VfUkVBRCk7CisKKwlpZiAoUGFnZUhpZ2hNZW0ocGcpKQorCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKworLyogRklYTUUgLSBzaG91bGQgcmV0dXJuIC0xICovCitFWFBPUlRfU1lNQk9MKGVkYWNfbWNfZmluZF9jc3Jvd19ieV9wYWdlKTsKKworaW50IGVkYWNfbWNfZmluZF9jc3Jvd19ieV9wYWdlKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBwYWdlKQoreworCXN0cnVjdCBjc3Jvd19pbmZvICpjc3Jvd3MgPSBtY2ktPmNzcm93czsKKwlpbnQgcm93LCBpOworCisJZGVidWdmMSgiTUMlZDogIiBfX0ZJTEVfXyAiOiAlcygpOiAweCVseFxuIiwgbWNpLT5tY19pZHgsIF9fZnVuY19fLAorCQlwYWdlKTsKKwlyb3cgPSAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBtY2ktPm5yX2Nzcm93czsgaSsrKSB7CisJCXN0cnVjdCBjc3Jvd19pbmZvICpjc3JvdyA9ICZjc3Jvd3NbaV07CisKKwkJaWYgKGNzcm93LT5ucl9wYWdlcyA9PSAwKQorCQkJY29udGludWU7CisKKwkJZGVidWdmMygiTUMlZDogIiBfX0ZJTEVfXworCQkJIjogJXMoKTogZmlyc3QoMHglbHgpIHBhZ2UoMHglbHgpIgorCQkJIiBsYXN0KDB4JWx4KSBtYXNrKDB4JWx4KVxuIiwgbWNpLT5tY19pZHgsCisJCQlfX2Z1bmNfXywgY3Nyb3ctPmZpcnN0X3BhZ2UsIHBhZ2UsCisJCQljc3Jvdy0+bGFzdF9wYWdlLCBjc3Jvdy0+cGFnZV9tYXNrKTsKKworCQlpZiAoKHBhZ2UgPj0gY3Nyb3ctPmZpcnN0X3BhZ2UpICYmCisJCSAgICAocGFnZSA8PSBjc3Jvdy0+bGFzdF9wYWdlKSAmJgorCQkgICAgKChwYWdlICYgY3Nyb3ctPnBhZ2VfbWFzaykgPT0KKwkJICAgICAoY3Nyb3ctPmZpcnN0X3BhZ2UgJiBjc3Jvdy0+cGFnZV9tYXNrKSkpIHsKKwkJCXJvdyA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChyb3cgPT0gLTEpCisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIkVEQUMgTUMlZDogY291bGQgbm90IGxvb2sgdXAgcGFnZSBlcnJvciBhZGRyZXNzICVseFxuIiwKKwkJICAgICAgIG1jaS0+bWNfaWR4LCAodW5zaWduZWQgbG9uZykgcGFnZSk7CisKKwlyZXR1cm4gcm93OworfQorCisKK0VYUE9SVF9TWU1CT0woZWRhY19tY19oYW5kbGVfY2UpOworCisvKiBGSVhNRSAtIHNldGFibGUgbG9nICh3YXJuaW5nL2VtZXJnKSBsZXZlbHMgKi8KKy8qIEZJWE1FIC0gaW50ZWdyYXRlIHdpdGggZXZsb2c6IGh0dHA6Ly9ldmxvZy5zb3VyY2Vmb3JnZS5uZXQvICovCit2b2lkIGVkYWNfbWNfaGFuZGxlX2NlKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCSAgICB1bnNpZ25lZCBsb25nIHBhZ2VfZnJhbWVfbnVtYmVyLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0X2luX3BhZ2UsCisJCQkgICAgdW5zaWduZWQgbG9uZyBzeW5kcm9tZSwgaW50IHJvdywgaW50IGNoYW5uZWwsCisJCQkgICAgY29uc3QgY2hhciAqbXNnKQoreworCXVuc2lnbmVkIGxvbmcgcmVtYXBwZWRfcGFnZTsKKworCWRlYnVnZjMoIk1DJWQ6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgbWNpLT5tY19pZHgsIF9fZnVuY19fKTsKKworCS8qIEZJWE1FIC0gbWF5YmUgbWFrZSBwYW5pYyBvbiBJTlRFUk5BTCBFUlJPUiBhbiBvcHRpb24gKi8KKwlpZiAocm93ID49IG1jaS0+bnJfY3Nyb3dzIHx8IHJvdyA8IDApIHsKKwkJLyogc29tZXRoaW5nIGlzIHdyb25nICovCisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIkVEQUMgTUMlZDogSU5URVJOQUwgRVJST1I6IHJvdyBvdXQgb2YgcmFuZ2UgKCVkID49ICVkKVxuIiwKKwkJICAgICAgIG1jaS0+bWNfaWR4LCByb3csIG1jaS0+bnJfY3Nyb3dzKTsKKwkJZWRhY19tY19oYW5kbGVfY2Vfbm9faW5mbyhtY2ksICJJTlRFUk5BTCBFUlJPUiIpOworCQlyZXR1cm47CisJfQorCWlmIChjaGFubmVsID49IG1jaS0+Y3Nyb3dzW3Jvd10ubnJfY2hhbm5lbHMgfHwgY2hhbm5lbCA8IDApIHsKKwkJLyogc29tZXRoaW5nIGlzIHdyb25nICovCisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIkVEQUMgTUMlZDogSU5URVJOQUwgRVJST1I6IGNoYW5uZWwgb3V0IG9mIHJhbmdlICIKKwkJICAgICAgICIoJWQgPj0gJWQpXG4iLAorCQkgICAgICAgbWNpLT5tY19pZHgsIGNoYW5uZWwsIG1jaS0+Y3Nyb3dzW3Jvd10ubnJfY2hhbm5lbHMpOworCQllZGFjX21jX2hhbmRsZV9jZV9ub19pbmZvKG1jaSwgIklOVEVSTkFMIEVSUk9SIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAobG9nX2NlKQorCQkvKiBGSVhNRSAtIHB1dCBpbiBESU1NIGxvY2F0aW9uICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJFREFDIE1DJWQ6IENFIHBhZ2UgMHglbHgsIG9mZnNldCAweCVseCwiCisJCSAgICAgICAiIGdyYWluICVkLCBzeW5kcm9tZSAweCVseCwgcm93ICVkLCBjaGFubmVsICVkLCIKKwkJICAgICAgICIgbGFiZWwgXCIlc1wiOiAlc1xuIiwgbWNpLT5tY19pZHgsCisJCSAgICAgICBwYWdlX2ZyYW1lX251bWJlciwgb2Zmc2V0X2luX3BhZ2UsCisJCSAgICAgICBtY2ktPmNzcm93c1tyb3ddLmdyYWluLCBzeW5kcm9tZSwgcm93LCBjaGFubmVsLAorCQkgICAgICAgbWNpLT5jc3Jvd3Nbcm93XS5jaGFubmVsc1tjaGFubmVsXS5sYWJlbCwgbXNnKTsKKworCW1jaS0+Y2VfY291bnQrKzsKKwltY2ktPmNzcm93c1tyb3ddLmNlX2NvdW50Kys7CisJbWNpLT5jc3Jvd3Nbcm93XS5jaGFubmVsc1tjaGFubmVsXS5jZV9jb3VudCsrOworCisJaWYgKG1jaS0+c2NydWJfbW9kZSAmIFNDUlVCX1NXX1NSQykgeworCQkvKgorCQkgKiBTb21lIE1DJ3MgY2FuIHJlbWFwIG1lbW9yeSBzbyB0aGF0IGl0IGlzIHN0aWxsIGF2YWlsYWJsZQorCQkgKiBhdCBhIGRpZmZlcmVudCBhZGRyZXNzIHdoZW4gUENJIGRldmljZXMgbWFwIGludG8gbWVtb3J5LgorCQkgKiBNQydzIHRoYXQgY2FuJ3QgZG8gdGhpcyBsb3NlIHRoZSBtZW1vcnkgd2hlcmUgUENJIGRldmljZXMKKwkJICogYXJlIG1hcHBlZC4gIFRoaXMgbWFwcGluZyBpcyBNQyBkZXBlbmRhbnQgYW5kIHNvIHdlIGNhbGwKKwkJICogYmFjayBpbnRvIHRoZSBNQyBkcml2ZXIgZm9yIGl0IHRvIG1hcCB0aGUgTUMgcGFnZSB0bworCQkgKiBhIHBoeXNpY2FsIChDUFUpIHBhZ2Ugd2hpY2ggY2FuIHRoZW4gYmUgbWFwcGVkIHRvIGEgdmlydHVhbAorCQkgKiBwYWdlIC0gd2hpY2ggY2FuIHRoZW4gYmUgc2NydWJiZWQuCisJCSAqLworCQlyZW1hcHBlZF9wYWdlID0gbWNpLT5jdGxfcGFnZV90b19waHlzID8KKwkJICAgIG1jaS0+Y3RsX3BhZ2VfdG9fcGh5cyhtY2ksIHBhZ2VfZnJhbWVfbnVtYmVyKSA6CisJCSAgICBwYWdlX2ZyYW1lX251bWJlcjsKKworCQllZGFjX21jX3NjcnViX2Jsb2NrKHJlbWFwcGVkX3BhZ2UsIG9mZnNldF9pbl9wYWdlLAorCQkJCQkgbWNpLT5jc3Jvd3Nbcm93XS5ncmFpbik7CisJfQorfQorCisKK0VYUE9SVF9TWU1CT0woZWRhY19tY19oYW5kbGVfY2Vfbm9faW5mbyk7CisKK3ZvaWQgZWRhY19tY19oYW5kbGVfY2Vfbm9faW5mbyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkJICAgIGNvbnN0IGNoYXIgKm1zZykKK3sKKwlpZiAobG9nX2NlKQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiRURBQyBNQyVkOiBDRSAtIG5vIGluZm9ybWF0aW9uIGF2YWlsYWJsZTogJXNcbiIsCisJCSAgICAgICBtY2ktPm1jX2lkeCwgbXNnKTsKKwltY2ktPmNlX25vaW5mb19jb3VudCsrOworCW1jaS0+Y2VfY291bnQrKzsKK30KKworCitFWFBPUlRfU1lNQk9MKGVkYWNfbWNfaGFuZGxlX3VlKTsKKwordm9pZCBlZGFjX21jX2hhbmRsZV91ZShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkgICAgdW5zaWduZWQgbG9uZyBwYWdlX2ZyYW1lX251bWJlciwKKwkJCSAgICB1bnNpZ25lZCBsb25nIG9mZnNldF9pbl9wYWdlLCBpbnQgcm93LAorCQkJICAgIGNvbnN0IGNoYXIgKm1zZykKK3sKKwlpbnQgbGVuID0gRURBQ19NQ19MQUJFTF9MRU4gKiA0OworCWNoYXIgbGFiZWxzW2xlbiArIDFdOworCWNoYXIgKnBvcyA9IGxhYmVsczsKKwlpbnQgY2hhbjsKKwlpbnQgY2hhcnM7CisKKwlkZWJ1Z2YzKCJNQyVkOiAiIF9fRklMRV9fICI6ICVzKClcbiIsIG1jaS0+bWNfaWR4LCBfX2Z1bmNfXyk7CisKKwkvKiBGSVhNRSAtIG1heWJlIG1ha2UgcGFuaWMgb24gSU5URVJOQUwgRVJST1IgYW4gb3B0aW9uICovCisJaWYgKHJvdyA+PSBtY2ktPm5yX2Nzcm93cyB8fCByb3cgPCAwKSB7CisJCS8qIHNvbWV0aGluZyBpcyB3cm9uZyAqLworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJFREFDIE1DJWQ6IElOVEVSTkFMIEVSUk9SOiByb3cgb3V0IG9mIHJhbmdlICglZCA+PSAlZClcbiIsCisJCSAgICAgICBtY2ktPm1jX2lkeCwgcm93LCBtY2ktPm5yX2Nzcm93cyk7CisJCWVkYWNfbWNfaGFuZGxlX3VlX25vX2luZm8obWNpLCAiSU5URVJOQUwgRVJST1IiKTsKKwkJcmV0dXJuOworCX0KKworCWNoYXJzID0gc25wcmludGYocG9zLCBsZW4gKyAxLCAiJXMiLAorCQkJIG1jaS0+Y3Nyb3dzW3Jvd10uY2hhbm5lbHNbMF0ubGFiZWwpOworCWxlbiAtPSBjaGFyczsKKwlwb3MgKz0gY2hhcnM7CisJZm9yIChjaGFuID0gMTsgKGNoYW4gPCBtY2ktPmNzcm93c1tyb3ddLm5yX2NoYW5uZWxzKSAmJiAobGVuID4gMCk7CisJICAgICBjaGFuKyspIHsKKwkJY2hhcnMgPSBzbnByaW50Zihwb3MsIGxlbiArIDEsICI6JXMiLAorCQkJCSBtY2ktPmNzcm93c1tyb3ddLmNoYW5uZWxzW2NoYW5dLmxhYmVsKTsKKwkJbGVuIC09IGNoYXJzOworCQlwb3MgKz0gY2hhcnM7CisJfQorCisJaWYgKGxvZ191ZSkKKwkJcHJpbnRrKEtFUk5fRU1FUkcKKwkJICAgICAgICJFREFDIE1DJWQ6IFVFIHBhZ2UgMHglbHgsIG9mZnNldCAweCVseCwgZ3JhaW4gJWQsIHJvdyAlZCwiCisJCSAgICAgICAiIGxhYmVscyBcIiVzXCI6ICVzXG4iLCBtY2ktPm1jX2lkeCwKKwkJICAgICAgIHBhZ2VfZnJhbWVfbnVtYmVyLCBvZmZzZXRfaW5fcGFnZSwKKwkJICAgICAgIG1jaS0+Y3Nyb3dzW3Jvd10uZ3JhaW4sIHJvdywgbGFiZWxzLCBtc2cpOworCisJaWYgKHBhbmljX29uX3VlKQorCQlwYW5pYworCQkgICAgKCJFREFDIE1DJWQ6IFVFIHBhZ2UgMHglbHgsIG9mZnNldCAweCVseCwgZ3JhaW4gJWQsIHJvdyAlZCwiCisJCSAgICAgIiBsYWJlbHMgXCIlc1wiOiAlc1xuIiwgbWNpLT5tY19pZHgsCisJCSAgICAgcGFnZV9mcmFtZV9udW1iZXIsIG9mZnNldF9pbl9wYWdlLAorCQkgICAgIG1jaS0+Y3Nyb3dzW3Jvd10uZ3JhaW4sIHJvdywgbGFiZWxzLCBtc2cpOworCisJbWNpLT51ZV9jb3VudCsrOworCW1jaS0+Y3Nyb3dzW3Jvd10udWVfY291bnQrKzsKK30KKworCitFWFBPUlRfU1lNQk9MKGVkYWNfbWNfaGFuZGxlX3VlX25vX2luZm8pOworCit2b2lkIGVkYWNfbWNfaGFuZGxlX3VlX25vX2luZm8oc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCSAgICBjb25zdCBjaGFyICptc2cpCit7CisJaWYgKHBhbmljX29uX3VlKQorCQlwYW5pYygiRURBQyBNQyVkOiBVbmNvcnJlY3RlZCBFcnJvciIsIG1jaS0+bWNfaWR4KTsKKworCWlmIChsb2dfdWUpCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJFREFDIE1DJWQ6IFVFIC0gbm8gaW5mb3JtYXRpb24gYXZhaWxhYmxlOiAlc1xuIiwKKwkJICAgICAgIG1jaS0+bWNfaWR4LCBtc2cpOworCW1jaS0+dWVfbm9pbmZvX2NvdW50Kys7CisJbWNpLT51ZV9jb3VudCsrOworfQorCisKKyNpZmRlZiBDT05GSUdfUENJCisKK3N0YXRpYyB1MTYgZ2V0X3BjaV9wYXJpdHlfc3RhdHVzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBzZWNvbmRhcnkpCit7CisJaW50IHdoZXJlOworCXUxNiBzdGF0dXM7CisKKwl3aGVyZSA9IHNlY29uZGFyeSA/IFBDSV9TRUNfU1RBVFVTIDogUENJX1NUQVRVUzsKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHdoZXJlLCAmc3RhdHVzKTsKKworCS8qIElmIHdlIGdldCBiYWNrIDB4RkZGRiB0aGVuIHdlIG11c3Qgc3VzcGVjdCB0aGF0IHRoZSBjYXJkIGhhcyBiZWVuIHB1bGxlZCBidXQKKwkgICB0aGUgTGludXggUENJIGxheWVyIGhhcyBub3QgeWV0IGZpbmlzaGVkIGNsZWFuaW5nIHVwLiBXZSBkb24ndCB3YW50IHRvIHJlcG9ydAorCSAgIG9uIHN1Y2ggZGV2aWNlcyAqLworCisJaWYgKHN0YXR1cyA9PSAweEZGRkYpIHsKKwkJdTMyIHNhbml0eTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMCwgJnNhbml0eSk7CisJCWlmIChzYW5pdHkgPT0gMHhGRkZGRkZGRikKKwkJCXJldHVybiAwOworCX0KKwlzdGF0dXMgJj0gUENJX1NUQVRVU19ERVRFQ1RFRF9QQVJJVFkgfCBQQ0lfU1RBVFVTX1NJR19TWVNURU1fRVJST1IgfAorCQkgIFBDSV9TVEFUVVNfUEFSSVRZOworCisJaWYgKHN0YXR1cykKKwkJLyogcmVzZXQgb25seSB0aGUgYml0cyB3ZSBhcmUgaW50ZXJlc3RlZCBpbiAqLworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCB3aGVyZSwgc3RhdHVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3R5cGVkZWYgdm9pZCAoKnBjaV9wYXJpdHlfY2hlY2tfZm5fdCkgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCisvKiBDbGVhciBhbnkgUENJIHBhcml0eSBlcnJvcnMgbG9nZ2VkIGJ5IHRoaXMgZGV2aWNlLiAqLworc3RhdGljIHZvaWQgZWRhY19wY2lfZGV2X3Bhcml0eV9jbGVhciggc3RydWN0IHBjaV9kZXYgKmRldiApCit7CisJdTggaGVhZGVyX3R5cGU7CisKKwlnZXRfcGNpX3Bhcml0eV9zdGF0dXMoZGV2LCAwKTsKKworCS8qIHJlYWQgdGhlIGRldmljZSBUWVBFLCBsb29raW5nIGZvciBicmlkZ2VzICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSEVBREVSX1RZUEUsICZoZWFkZXJfdHlwZSk7CisKKwlpZiAoKGhlYWRlcl90eXBlICYgMHg3RikgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSkKKwkJZ2V0X3BjaV9wYXJpdHlfc3RhdHVzKGRldiwgMSk7Cit9CisKKy8qCisgKiAgUENJIFBhcml0eSBwb2xsaW5nCisgKgorICovCitzdGF0aWMgdm9pZCBlZGFjX3BjaV9kZXZfcGFyaXR5X3Rlc3Qoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1MTYgc3RhdHVzOworCXU4ICBoZWFkZXJfdHlwZTsKKworCS8qIHJlYWQgdGhlIFNUQVRVUyByZWdpc3RlciBvbiB0aGlzIGRldmljZQorCSAqLworCXN0YXR1cyA9IGdldF9wY2lfcGFyaXR5X3N0YXR1cyhkZXYsIDApOworCisJZGVidWdmMigiUENJIFNUQVRVUz0gMHglMDR4ICVzXG4iLCBzdGF0dXMsIGRldi0+ZGV2LmJ1c19pZCApOworCisJLyogY2hlY2sgdGhlIHN0YXR1cyByZWcgZm9yIGVycm9ycyAqLworCWlmIChzdGF0dXMpIHsKKwkJaWYgKHN0YXR1cyAmIChQQ0lfU1RBVFVTX1NJR19TWVNURU1fRVJST1IpKQorCQkJcHJpbnRrKEtFUk5fQ1JJVAorCQkJICAgCSJFREFDIFBDSS0gIgorCQkJCSJTaWduYWxlZCBTeXN0ZW0gRXJyb3Igb24gJXNcbiIsCisJCQkJcGNpX25hbWUgKGRldikpOworCisJCWlmIChzdGF0dXMgJiAoUENJX1NUQVRVU19QQVJJVFkpKSB7CisJCQlwcmludGsoS0VSTl9DUklUCisJCQkgICAJIkVEQUMgUENJLSAiCisJCQkJIk1hc3RlciBEYXRhIFBhcml0eSBFcnJvciBvbiAlc1xuIiwKKwkJCQlwY2lfbmFtZSAoZGV2KSk7CisKKwkJCWF0b21pY19pbmMoJnBjaV9wYXJpdHlfY291bnQpOworCQl9CisKKwkJaWYgKHN0YXR1cyAmIChQQ0lfU1RBVFVTX0RFVEVDVEVEX1BBUklUWSkpIHsKKwkJCXByaW50ayhLRVJOX0NSSVQKKwkJCSAgIAkiRURBQyBQQ0ktICIKKwkJCQkiRGV0ZWN0ZWQgUGFyaXR5IEVycm9yIG9uICVzXG4iLAorCQkJCXBjaV9uYW1lIChkZXYpKTsKKworCQkJYXRvbWljX2luYygmcGNpX3Bhcml0eV9jb3VudCk7CisJCX0KKwl9CisKKwkvKiByZWFkIHRoZSBkZXZpY2UgVFlQRSwgbG9va2luZyBmb3IgYnJpZGdlcyAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0hFQURFUl9UWVBFLCAmaGVhZGVyX3R5cGUpOworCisJZGVidWdmMigiUENJIEhFQURFUiBUWVBFPSAweCUwMnggJXNcbiIsIGhlYWRlcl90eXBlLCBkZXYtPmRldi5idXNfaWQgKTsKKworCWlmICgoaGVhZGVyX3R5cGUgJiAweDdGKSA9PSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFKSB7CisJCS8qIE9uIGJyaWRnZXMsIG5lZWQgdG8gZXhhbWluZSBzZWNvbmRhcnkgc3RhdHVzIHJlZ2lzdGVyICAqLworCQlzdGF0dXMgPSBnZXRfcGNpX3Bhcml0eV9zdGF0dXMoZGV2LCAxKTsKKworCQlkZWJ1Z2YyKCJQQ0kgU0VDX1NUQVRVUz0gMHglMDR4ICVzXG4iLAorCQkJCXN0YXR1cywgZGV2LT5kZXYuYnVzX2lkICk7CisKKwkJLyogY2hlY2sgdGhlIHNlY29uZGFyeSBzdGF0dXMgcmVnIGZvciBlcnJvcnMgKi8KKwkJaWYgKHN0YXR1cykgeworCQkJaWYgKHN0YXR1cyAmIChQQ0lfU1RBVFVTX1NJR19TWVNURU1fRVJST1IpKQorCQkJCXByaW50ayhLRVJOX0NSSVQKKwkJCQkJIkVEQUMgUENJLUJyaWRnZS0gIgorCQkJCQkiU2lnbmFsZWQgU3lzdGVtIEVycm9yIG9uICVzXG4iLAorCQkJCQlwY2lfbmFtZSAoZGV2KSk7CisKKwkJCWlmIChzdGF0dXMgJiAoUENJX1NUQVRVU19QQVJJVFkpKSB7CisJCQkJcHJpbnRrKEtFUk5fQ1JJVAorCQkJCQkiRURBQyBQQ0ktQnJpZGdlLSAiCisJCQkJCSJNYXN0ZXIgRGF0YSBQYXJpdHkgRXJyb3Igb24gJXNcbiIsCisJCQkJCXBjaV9uYW1lIChkZXYpKTsKKworCQkJCWF0b21pY19pbmMoJnBjaV9wYXJpdHlfY291bnQpOworCQkJfQorCisJCQlpZiAoc3RhdHVzICYgKFBDSV9TVEFUVVNfREVURUNURURfUEFSSVRZKSkgeworCQkJCXByaW50ayhLRVJOX0NSSVQKKwkJCQkJIkVEQUMgUENJLUJyaWRnZS0gIgorCQkJCQkiRGV0ZWN0ZWQgUGFyaXR5IEVycm9yIG9uICVzXG4iLAorCQkJCQlwY2lfbmFtZSAoZGV2KSk7CisKKwkJCQlhdG9taWNfaW5jKCZwY2lfcGFyaXR5X2NvdW50KTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAqIGNoZWNrX2Rldl9vbl9saXN0OiBTY2FuIGZvciBhIFBDSSBkZXZpY2Ugb24gYSB3aGl0ZS9ibGFjayBsaXN0CisgKiBAbGlzdDoJYW4gRURBQyAgJmVkYWNfcGNpX2RldmljZV9saXN0ICB3aGl0ZS9ibGFjayBsaXN0IHBvaW50ZXIKKyAqIEBmcmVlX2luZGV4OglpbmRleCBvZiBuZXh0IGZyZWUgZW50cnkgb24gdGhlIGxpc3QKKyAqIEBwY2lfZGV2OglQQ0kgRGV2aWNlIHBvaW50ZXIKKyAqCisgKiBzZWUgaWYgbGlzdCBjb250YWlucyB0aGUgZGV2aWNlLgorICoKKyAqIFJldHVybnM6ICAJMCBub3QgZm91bmQKKyAqCQkxIGZvdW5kIG9uIGxpc3QKKyAqLworc3RhdGljIGludCBjaGVja19kZXZfb25fbGlzdChzdHJ1Y3QgZWRhY19wY2lfZGV2aWNlX2xpc3QgKmxpc3QsIGludCBmcmVlX2luZGV4LAorCQkJCXN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgcmMgPSAwOyAgICAgLyogQXNzdW1lIG5vdCBmb3VuZCAqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCB2ZW5kb3I9ZGV2LT52ZW5kb3I7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGRldmljZT1kZXYtPmRldmljZTsKKworICAgICAgICAvKiBTY2FuIHRoZSBsaXN0LCBsb29raW5nIGZvciBhIHZlbmRvci9kZXZpY2UgbWF0Y2gKKyAgICAgICAgICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmVlX2luZGV4OyBpKyssIGxpc3QrKyApIHsKKyAgICAgICAgICAgICAgICBpZiAoICAgIChsaXN0LT52ZW5kb3IgPT0gdmVuZG9yICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChsaXN0LT5kZXZpY2UgPT0gZGV2aWNlICkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByYzsKK30KKworLyoKKyAqIHBjaV9kZXYgcGFyaXR5IGxpc3QgaXRlcmF0b3IKKyAqIAlTY2FuIHRoZSBQQ0kgZGV2aWNlIGxpc3QgZm9yIG9uZSBpdGVyYXRpb24sIGxvb2tpbmcgZm9yIFNFUlJPUnMKKyAqCU1hc3RlciBQYXJpdHkgRVJST1JTIG9yIFBhcml0eSBFUlJPUnMgb24gcHJpbWFyeSBvciBzZWNvbmRhcnkgZGV2aWNlcworICovCitzdGF0aWMgaW5saW5lIHZvaWQgZWRhY19wY2lfZGV2X3Bhcml0eV9pdGVyYXRvcihwY2lfcGFyaXR5X2NoZWNrX2ZuX3QgZm4pCit7CisJc3RydWN0IHBjaV9kZXYgKmRldj1OVUxMOworCisJLyogcmVxdWVzdCBmb3Iga2VybmVsIGFjY2VzcyB0byB0aGUgbmV4dCBQQ0kgZGV2aWNlLCBpZiBhbnksCisJICogYW5kIHdoaWxlIHdlIGFyZSBsb29raW5nIGF0IGl0IGhhdmUgaXRzIHJlZmVyZW5jZSBjb3VudAorCSAqIGJ1bXBlZCB1bnRpbCB3ZSBhcmUgZG9uZSB3aXRoIGl0CisJICovCisJd2hpbGUoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldikpICE9IE5VTEwpIHsKKworICAgICAgICAgICAgICAgIC8qIGlmIHdoaXRlbGlzdCBleGlzdHMgdGhlbiBpdCBoYXMgcHJpb3JpdHksIHNvIG9ubHkgc2NhbiB0aG9zZQorICAgICAgICAgICAgICAgICAqIGRldmljZXMgb24gdGhlIHdoaXRlbGlzdAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChwY2lfd2hpdGVsaXN0X2NvdW50ID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja19kZXZfb25fbGlzdChwY2lfd2hpdGVsaXN0LAorCQkJCQlwY2lfd2hpdGVsaXN0X2NvdW50LCBkZXYpKQorCQkJCWZuKGRldik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBpZiBubyB3aGl0ZWxpc3QsIHRoZW4gY2hlY2sgaWYgdGhpcyBkZXZpY2VzIGlzCisJCQkgKiBibGFja2xpc3RlZAorCQkJICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrX2Rldl9vbl9saXN0KHBjaV9ibGFja2xpc3QsCisJCQkJCXBjaV9ibGFja2xpc3RfY291bnQsIGRldikpCisJCQkJZm4oZGV2KTsKKyAgICAgICAgICAgICAgICB9CisJfQorfQorCitzdGF0aWMgdm9pZCBkb19wY2lfcGFyaXR5X2NoZWNrKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgYmVmb3JlX2NvdW50OworCisJZGVidWdmMygiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCisJaWYgKCFjaGVja19wY2lfcGFyaXR5KQorCQlyZXR1cm47CisKKwliZWZvcmVfY291bnQgPSBhdG9taWNfcmVhZCgmcGNpX3Bhcml0eV9jb3VudCk7CisKKwkvKiBzY2FuIGFsbCBQQ0kgZGV2aWNlcyBsb29raW5nIGZvciBhIFBhcml0eSBFcnJvciBvbiBkZXZpY2VzIGFuZAorCSAqIGJyaWRnZXMKKwkgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJZWRhY19wY2lfZGV2X3Bhcml0eV9pdGVyYXRvcihlZGFjX3BjaV9kZXZfcGFyaXR5X3Rlc3QpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCS8qIE9ubHkgaWYgb3BlcmF0b3IgaGFzIHNlbGVjdGVkIHBhbmljIG9uIFBDSSBFcnJvciAqLworCWlmIChwYW5pY19vbl9wY2lfcGFyaXR5KSB7CisJCS8qIElmIHRoZSBjb3VudCBpcyBkaWZmZXJlbnQgJ2FmdGVyJyBmcm9tICdiZWZvcmUnICovCisJCWlmIChiZWZvcmVfY291bnQgIT0gYXRvbWljX3JlYWQoJnBjaV9wYXJpdHlfY291bnQpKQorCQkJcGFuaWMoIkVEQUM6IFBDSSBQYXJpdHkgRXJyb3IiKTsKKwl9Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX3BjaV9wYXJpdHlfZXJyb3JzKHZvaWQpCit7CisJLyogQ2xlYXIgYW55IFBDSSBidXMgcGFyaXR5IGVycm9ycyB0aGF0IGRldmljZXMgaW5pdGlhbGx5IGhhdmUgbG9nZ2VkCisJICogaW4gdGhlaXIgcmVnaXN0ZXJzLgorCSAqLworCWVkYWNfcGNpX2Rldl9wYXJpdHlfaXRlcmF0b3IoZWRhY19wY2lfZGV2X3Bhcml0eV9jbGVhcik7Cit9CisKKworI2Vsc2UgIC8qIENPTkZJR19QQ0kgKi8KKworCitzdGF0aWMgaW5saW5lIHZvaWQgZG9fcGNpX3Bhcml0eV9jaGVjayh2b2lkKQoreworCS8qIG5vLW9wICovCit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX3BjaV9wYXJpdHlfZXJyb3JzKHZvaWQpCit7CisJLyogbm8tb3AgKi8KK30KKworCisjZW5kaWYgIC8qIENPTkZJR19QQ0kgKi8KKworLyoKKyAqIEl0ZXJhdGUgb3ZlciBhbGwgTUMgaW5zdGFuY2VzIGFuZCBjaGVjayBmb3IgRUNDLCBldCBhbCwgZXJyb3JzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19tY19kZXZpY2VzICh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqaXRlbTsKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2k7CisKKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBkdXJpbmcgcG9sbCwgaGF2ZSBpbnRlcnJ1cHRzIG9mZiAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2goaXRlbSwgJm1jX2RldmljZXMpIHsKKwkJbWNpID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3QgbWVtX2N0bF9pbmZvLCBsaW5rKTsKKworCQlpZiAobWNpLT5lZGFjX2NoZWNrICE9IE5VTEwpCisJCQltY2ktPmVkYWNfY2hlY2sobWNpKTsKKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKworLyoKKyAqIENoZWNrIE1DIHN0YXR1cyBldmVyeSBwb2xsX21zZWMuCisgKiBDaGVjayBQQ0kgc3RhdHVzIGV2ZXJ5IHBvbGxfbXNlYyBhcyB3ZWxsLgorICoKKyAqIFRoaXMgd2hlcmUgdGhlIHdvcmsgZ2V0cyBkb25lIGZvciBlZGFjLgorICoKKyAqIFNNUCBzYWZlLCBkb2Vzbid0IHVzZSBOTUksIGFuZCBhdXRvLXJhdGUtbGltaXRzLgorICovCitzdGF0aWMgdm9pZCBkb19lZGFjX2NoZWNrKHZvaWQpCit7CisKKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwljaGVja19tY19kZXZpY2VzKCk7CisKKwlkb19wY2lfcGFyaXR5X2NoZWNrKCk7Cit9CisKKworLyoKKyAqIEVEQUMgdGhyZWFkIHN0YXRlIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCBic190aHJlYWRfaW5mbworeworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwlzdHJ1Y3QgY29tcGxldGlvbiAqZXZlbnQ7CisJY2hhciAqbmFtZTsKKwl2b2lkICgqcnVuKSh2b2lkKTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgYnNfdGhyZWFkX2luZm8gYnNfdGhyZWFkOworCisvKgorICogIGVkYWNfa2VybmVsX3RocmVhZAorICogICAgICBUaGlzIHRoZSBrZXJuZWwgdGhyZWFkIHRoYXQgcHJvY2Vzc2VzIGVkYWMgb3BlcmF0aW9ucworICogICAgICBpbiBhIG5vcm1hbCB0aHJlYWQgZW52aXJvbm1lbnQKKyAqLworc3RhdGljIGludCBlZGFjX2tlcm5lbF90aHJlYWQodm9pZCAqYXJnKQoreworCXN0cnVjdCBic190aHJlYWRfaW5mbyAqdGhyZWFkID0gKHN0cnVjdCBic190aHJlYWRfaW5mbyAqKSBhcmc7CisKKwkvKiBkZXRhY2ggdGhyZWFkICovCisJZGFlbW9uaXplKHRocmVhZC0+bmFtZSk7CisKKwljdXJyZW50LT5leGl0X3NpZ25hbCA9IFNJR0NITEQ7CisJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOworCXRocmVhZC0+dGFzayA9IGN1cnJlbnQ7CisKKwkvKiBpbmRpY2F0ZSB0byBzdGFydGluZyB0YXNrIHdlIGhhdmUgc3RhcnRlZCAqLworCWNvbXBsZXRlKHRocmVhZC0+ZXZlbnQpOworCisJLyogbG9vcCBmb3JldmVyLCB1bnRpbCB3ZSBhcmUgdG9sZCB0byBzdG9wICovCisJd2hpbGUodGhyZWFkLT5ydW4gIT0gTlVMTCkgeworCQl2b2lkICgqcnVuKSh2b2lkKTsKKworCQkvKiBjYWxsIHRoZSBmdW5jdGlvbiB0byBjaGVjayB0aGUgbWVtb3J5IGNvbnRyb2xsZXJzICovCisJCXJ1biA9IHRocmVhZC0+cnVuOworCQlpZiAocnVuKQorCQkJcnVuKCk7CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKKworCQkvKiBlbnN1cmUgd2UgYXJlIGludGVycnVwdGFibGUgKi8KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQkvKiBnb3RvIHNsZWVwIGZvciB0aGUgaW50ZXJ2YWwgKi8KKwkJc2NoZWR1bGVfdGltZW91dCgoSFogKiBwb2xsX21zZWMpIC8gMTAwMCk7CisJCXRyeV90b19mcmVlemUoKTsKKwl9CisKKwkvKiBub3RpZnkgd2FpdGVyIHRoYXQgd2UgYXJlIGV4aXRpbmcgKi8KKwljb21wbGV0ZSh0aHJlYWQtPmV2ZW50KTsKKworCXJldHVybiAwOworfQorCisvKgorICogZWRhY19tY19pbml0CisgKiAgICAgIG1vZHVsZSBpbml0aWFsaXphdGlvbiBlbnRyeSBwb2ludAorICovCitzdGF0aWMgaW50IF9faW5pdCBlZGFjX21jX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBjb21wbGV0aW9uIGV2ZW50OworCisJcHJpbnRrKEtFUk5fSU5GTyAiTUM6ICIgX19GSUxFX18gIiB2ZXJzaW9uICIgRURBQ19NQ19WRVJTSU9OICJcbiIpOworCisJLyoKKwkgKiBIYXJ2ZXN0IGFuZCBjbGVhciBhbnkgYm9vdC9pbml0aWFsaXphdGlvbiBQQ0kgcGFyaXR5IGVycm9ycworCSAqCisJICogRklYTUU6IFRoaXMgb25seSBjbGVhcnMgZXJyb3JzIGxvZ2dlZCBieSBkZXZpY2VzIHByZXNlbnQgYXQgdGltZSBvZgorCSAqIAltb2R1bGUgaW5pdGlhbGl6YXRpb24uICBXZSBzaG91bGQgYWxzbyBkbyBhbiBpbml0aWFsIGNsZWFyCisJICoJb2YgZWFjaCBuZXdseSBob3RwbHVnZ2VkIGRldmljZS4KKwkgKi8KKwljbGVhcl9wY2lfcGFyaXR5X2Vycm9ycygpOworCisJLyogcGVyZm9ybSBjaGVjayBmb3IgZmlyc3QgdGltZSB0byBoYXJ2ZXN0IGJvb3QgbGVmdG92ZXJzICovCisJZG9fZWRhY19jaGVjaygpOworCisJLyogQ3JlYXRlIHRoZSBNQyBzeXNmcyBlbnRpcmVzICovCisJaWYgKGVkYWNfc3lzZnNfbWVtY3RybF9zZXR1cCgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRURBQyBNQzogRXJyb3IgaW5pdGlhbGl6aW5nIHN5c2ZzIGNvZGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBDcmVhdGUgdGhlIFBDSSBwYXJpdHkgc3lzZnMgZW50cmllcyAqLworCWlmIChlZGFjX3N5c2ZzX3BjaV9zZXR1cCgpKSB7CisJCWVkYWNfc3lzZnNfbWVtY3RybF90ZWFyZG93bigpOworCQlwcmludGsoS0VSTl9FUlIgIkVEQUMgUENJOiBFcnJvciBpbml0aWFsaXppbmcgc3lzZnMgY29kZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIENyZWF0ZSBvdXIga2VybmVsIHRocmVhZCAqLworCWluaXRfY29tcGxldGlvbigmZXZlbnQpOworCWJzX3RocmVhZC5ldmVudCA9ICZldmVudDsKKwlic190aHJlYWQubmFtZSA9ICJrZWRhYyI7CisJYnNfdGhyZWFkLnJ1biA9IGRvX2VkYWNfY2hlY2s7CisKKwkvKiBjcmVhdGUgb3VyIGtlcm5lbCB0aHJlYWQgKi8KKwlyZXQgPSBrZXJuZWxfdGhyZWFkKGVkYWNfa2VybmVsX3RocmVhZCwgJmJzX3RocmVhZCwgQ0xPTkVfS0VSTkVMKTsKKwlpZiAocmV0IDwgMCkgeworCQkvKiByZW1vdmUgdGhlIHN5c2ZzIGVudHJpZXMgKi8KKwkJZWRhY19zeXNmc19tZW1jdHJsX3RlYXJkb3duKCk7CisJCWVkYWNfc3lzZnNfcGNpX3RlYXJkb3duKCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIHdhaXQgZm9yIG91ciBrZXJuZWwgdGhlYXJkIGFjayB0aGF0IGl0IGlzIHVwIGFuZCBydW5uaW5nICovCisJd2FpdF9mb3JfY29tcGxldGlvbigmZXZlbnQpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIGVkYWNfbWNfZXhpdCgpCisgKiAgICAgIG1vZHVsZSBleGl0L3Rlcm1pbmF0aW9uIGZ1bmN0aW9uaQorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgZWRhY19tY19leGl0KHZvaWQpCit7CisJc3RydWN0IGNvbXBsZXRpb24gZXZlbnQ7CisKKwlkZWJ1Z2YwKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlpbml0X2NvbXBsZXRpb24oJmV2ZW50KTsKKwlic190aHJlYWQuZXZlbnQgPSAmZXZlbnQ7CisKKwkvKiBBcyBzb29uIGFzIC0+cnVuIGlzIHNldCB0byBOVUxMLCB0aGUgdGFzayBjb3VsZCBkaXNhcHBlYXIsCisJICogc28gd2UgbmVlZCB0byBob2xkIHRhc2tsaXN0X2xvY2sgdW50aWwgd2UgaGF2ZSBzZW50IHRoZSBzaWduYWwKKwkgKi8KKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCWJzX3RocmVhZC5ydW4gPSBOVUxMOworCXNlbmRfc2lnKFNJR0tJTEwsIGJzX3RocmVhZC50YXNrLCAxKTsKKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmZXZlbnQpOworCisgICAgICAgIC8qIHRlYXIgZG93biB0aGUgc3lzZnMgZGV2aWNlICovCisJZWRhY19zeXNmc19tZW1jdHJsX3RlYXJkb3duKCk7CisJZWRhY19zeXNmc19wY2lfdGVhcmRvd24oKTsKK30KKworCisKKworbW9kdWxlX2luaXQoZWRhY19tY19pbml0KTsKK21vZHVsZV9leGl0KGVkYWNfbWNfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkxpbnV4IE5ldHdvcnggKGh0dHA6Ly9sbnhpLmNvbSkgVGhheW5lIEhhcmJhdWdoIGV0IGFsXG4iCisJICAgICAgIkJhc2VkIG9uLndvcmsgYnkgRGFuIEhvbGxpcyBldCBhbCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb3JlIGxpYnJhcnkgcm91dGluZXMgZm9yIE1DIHJlcG9ydGluZyIpOworCittb2R1bGVfcGFyYW0ocGFuaWNfb25fdWUsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBhbmljX29uX3VlLCAiUGFuaWMgb24gdW5jb3JyZWN0ZWQgZXJyb3I6IDA9b2ZmIDE9b24iKTsKK21vZHVsZV9wYXJhbShjaGVja19wY2lfcGFyaXR5LCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhjaGVja19wY2lfcGFyaXR5LCAiQ2hlY2sgZm9yIFBDSSBidXMgcGFyaXR5IGVycm9yczogMD1vZmYgMT1vbiIpOworbW9kdWxlX3BhcmFtKHBhbmljX29uX3BjaV9wYXJpdHksIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBhbmljX29uX3BjaV9wYXJpdHksICJQYW5pYyBvbiBQQ0kgQnVzIFBhcml0eSBlcnJvcjogMD1vZmYgMT1vbiIpOworbW9kdWxlX3BhcmFtKGxvZ191ZSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobG9nX3VlLCAiTG9nIHVuY29ycmVjdGFibGUgZXJyb3IgdG8gY29uc29sZTogMD1vZmYgMT1vbiIpOworbW9kdWxlX3BhcmFtKGxvZ19jZSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobG9nX2NlLCAiTG9nIGNvcnJlY3RhYmxlIGVycm9yIHRvIGNvbnNvbGU6IDA9b2ZmIDE9b24iKTsKK21vZHVsZV9wYXJhbShwb2xsX21zZWMsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBvbGxfbXNlYywgIlBvbGxpbmcgcGVyaW9kIGluIG1pbGxpc2Vjb25kcyIpOworI2lmZGVmIENPTkZJR19FREFDX0RFQlVHCittb2R1bGVfcGFyYW0oZWRhY19kZWJ1Z19sZXZlbCwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZWRhY19kZWJ1Z19sZXZlbCwgIkRlYnVnIGxldmVsIik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9lZGFjX21jLmggYi9kcml2ZXJzL2VkYWMvZWRhY19tYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZWNmNDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2VkYWMvZWRhY19tYy5oCkBAIC0wLDAgKzEsNDQ4IEBACisvKgorICogTUMga2VybmVsIG1vZHVsZQorICogKEMpIDIwMDMgTGludXggTmV0d29yeCAoaHR0cDovL2xueGkuY29tKQorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBXcml0dGVuIGJ5IFRoYXluZSBIYXJiYXVnaAorICogQmFzZWQgb24gd29yayBieSBEYW4gSG9sbGlzIDxnb2Vtb24gYXQgYW5pbWUgZG90IG5ldD4gYW5kIG90aGVycy4KKyAqCWh0dHA6Ly93d3cuYW5pbWUubmV0L35nb2Vtb24vbGludXgtZWNjLworICoKKyAqIE5NSSBoYW5kbGluZyBzdXBwb3J0IGFkZGVkIGJ5CisgKiAgICAgRGF2ZSBQZXRlcnNvbiA8ZHNwQGxsbmwuZ292PiA8ZGF2ZV9wZXRlcnNvbkBwb2JveC5jb20+CisgKgorICogJElkOiBlZGFjX21jLmgsdiAxLjQuMi4xMCAyMDA1LzEwLzA1IDAwOjQzOjQ0IGRzcF9sbG5sIEV4cCAkCisgKgorICovCisKKworI2lmbmRlZiBfRURBQ19NQ19IXworI2RlZmluZSBfRURBQ19NQ19IXworCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L25taS5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKworCisjZGVmaW5lIEVEQUNfTUNfTEFCRUxfTEVOCTMxCisjZGVmaW5lIE1DX1BST0NfTkFNRV9NQVhfTEVOIDcKKworI2lmIFBBR0VfU0hJRlQgPCAyMAorI2RlZmluZSBQQUdFU19UT19NaUIoIHBhZ2VzICkJKCAoIHBhZ2VzICkgPj4gKCAyMCAtIFBBR0VfU0hJRlQgKSApCisjZWxzZQkJCQkvKiBQQUdFX1NISUZUID4gMjAgKi8KKyNkZWZpbmUgUEFHRVNfVE9fTWlCKCBwYWdlcyApCSggKCBwYWdlcyApIDw8ICggUEFHRV9TSElGVCAtIDIwICkgKQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRURBQ19ERUJVRworZXh0ZXJuIGludCBlZGFjX2RlYnVnX2xldmVsOworI2RlZmluZSBlZGFjX2RlYnVnX3ByaW50ayhsZXZlbCwgZm10LCBhcmdzLi4uKSBcCitkbyB7IGlmIChsZXZlbCA8PSBlZGFjX2RlYnVnX2xldmVsKSBwcmludGsoS0VSTl9ERUJVRyBmbXQsICMjYXJncyk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgZGVidWdmMCggLi4uICkgZWRhY19kZWJ1Z19wcmludGsoMCwgX19WQV9BUkdTX18gKQorI2RlZmluZSBkZWJ1Z2YxKCAuLi4gKSBlZGFjX2RlYnVnX3ByaW50aygxLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIGRlYnVnZjIoIC4uLiApIGVkYWNfZGVidWdfcHJpbnRrKDIsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgZGVidWdmMyggLi4uICkgZWRhY19kZWJ1Z19wcmludGsoMywgX19WQV9BUkdTX18gKQorI2RlZmluZSBkZWJ1Z2Y0KCAuLi4gKSBlZGFjX2RlYnVnX3ByaW50ayg0LCBfX1ZBX0FSR1NfXyApCisjZWxzZQkJCQkvKiAhQ09ORklHX0VEQUNfREVCVUcgKi8KKyNkZWZpbmUgZGVidWdmMCggLi4uICkKKyNkZWZpbmUgZGVidWdmMSggLi4uICkKKyNkZWZpbmUgZGVidWdmMiggLi4uICkKKyNkZWZpbmUgZGVidWdmMyggLi4uICkKKyNkZWZpbmUgZGVidWdmNCggLi4uICkKKyNlbmRpZgkJCQkvKiAhQ09ORklHX0VEQUNfREVCVUcgKi8KKworCisjZGVmaW5lIGJzX3hzdHIocykgYnNfc3RyKHMpCisjZGVmaW5lIGJzX3N0cihzKSAjcworI2RlZmluZSBCU19NT0RfU1RSIGJzX3hzdHIoS0JVSUxEX0JBU0VOQU1FKQorCisjZGVmaW5lIEJJVCh4KSAoMSA8PCAoeCkpCisKKyNkZWZpbmUgUENJX1ZFTkRfREVWKHZlbmQsIGRldikgUENJX1ZFTkRPUl9JRF8gIyMgdmVuZCwgUENJX0RFVklDRV9JRF8gIyMgdmVuZCAjIyBfICMjIGRldgorCisvKiBtZW1vcnkgZGV2aWNlcyAqLworZW51bSBkZXZfdHlwZSB7CisJREVWX1VOS05PV04gPSAwLAorCURFVl9YMSwKKwlERVZfWDIsCisJREVWX1g0LAorCURFVl9YOCwKKwlERVZfWDE2LAorCURFVl9YMzIsCQkvKiBEbyB0aGVzZSBwYXJ0cyBleGlzdD8gKi8KKwlERVZfWDY0CQkJLyogRG8gdGhlc2UgcGFydHMgZXhpc3Q/ICovCit9OworCisjZGVmaW5lIERFVl9GTEFHX1VOS05PV04JQklUKERFVl9VTktOT1dOKQorI2RlZmluZSBERVZfRkxBR19YMQkJQklUKERFVl9YMSkKKyNkZWZpbmUgREVWX0ZMQUdfWDIJCUJJVChERVZfWDIpCisjZGVmaW5lIERFVl9GTEFHX1g0CQlCSVQoREVWX1g0KQorI2RlZmluZSBERVZfRkxBR19YOAkJQklUKERFVl9YOCkKKyNkZWZpbmUgREVWX0ZMQUdfWDE2CQlCSVQoREVWX1gxNikKKyNkZWZpbmUgREVWX0ZMQUdfWDMyCQlCSVQoREVWX1gzMikKKyNkZWZpbmUgREVWX0ZMQUdfWDY0CQlCSVQoREVWX1g2NCkKKworLyogbWVtb3J5IHR5cGVzICovCitlbnVtIG1lbV90eXBlIHsKKwlNRU1fRU1QVFkgPSAwLAkJLyogRW1wdHkgY3Nyb3cgKi8KKwlNRU1fUkVTRVJWRUQsCQkvKiBSZXNlcnZlZCBjc3JvdyB0eXBlICovCisJTUVNX1VOS05PV04sCQkvKiBVbmtub3duIGNzcm93IHR5cGUgKi8KKwlNRU1fRlBNLAkJLyogRmFzdCBwYWdlIG1vZGUgKi8KKwlNRU1fRURPLAkJLyogRXh0ZW5kZWQgZGF0YSBvdXQgKi8KKwlNRU1fQkVETywJCS8qIEJ1cnN0IEV4dGVuZGVkIGRhdGEgb3V0ICovCisJTUVNX1NEUiwJCS8qIFNpbmdsZSBkYXRhIHJhdGUgU0RSQU0gKi8KKwlNRU1fUkRSLAkJLyogUmVnaXN0ZXJlZCBzaW5nbGUgZGF0YSByYXRlIFNEUkFNICovCisJTUVNX0REUiwJCS8qIERvdWJsZSBkYXRhIHJhdGUgU0RSQU0gKi8KKwlNRU1fUkREUiwJCS8qIFJlZ2lzdGVyZWQgRG91YmxlIGRhdGEgcmF0ZSBTRFJBTSAqLworCU1FTV9STUJTCQkvKiBSYW1idXMgRFJBTSAqLworfTsKKworI2RlZmluZSBNRU1fRkxBR19FTVBUWQkJQklUKE1FTV9FTVBUWSkKKyNkZWZpbmUgTUVNX0ZMQUdfUkVTRVJWRUQJQklUKE1FTV9SRVNFUlZFRCkKKyNkZWZpbmUgTUVNX0ZMQUdfVU5LTk9XTglCSVQoTUVNX1VOS05PV04pCisjZGVmaW5lIE1FTV9GTEFHX0ZQTQkJQklUKE1FTV9GUE0pCisjZGVmaW5lIE1FTV9GTEFHX0VETwkJQklUKE1FTV9FRE8pCisjZGVmaW5lIE1FTV9GTEFHX0JFRE8JCUJJVChNRU1fQkVETykKKyNkZWZpbmUgTUVNX0ZMQUdfU0RSCQlCSVQoTUVNX1NEUikKKyNkZWZpbmUgTUVNX0ZMQUdfUkRSCQlCSVQoTUVNX1JEUikKKyNkZWZpbmUgTUVNX0ZMQUdfRERSCQlCSVQoTUVNX0REUikKKyNkZWZpbmUgTUVNX0ZMQUdfUkREUgkJQklUKE1FTV9SRERSKQorI2RlZmluZSBNRU1fRkxBR19STUJTCQlCSVQoTUVNX1JNQlMpCisKKworLyogY2hpcHNldCBFcnJvciBEZXRlY3Rpb24gYW5kIENvcnJlY3Rpb24gY2FwYWJpbGl0aWVzIGFuZCBtb2RlICovCitlbnVtIGVkYWNfdHlwZSB7CisJRURBQ19VTktOT1dOID0gMCwJLyogVW5rbm93biBpZiBFQ0MgaXMgYXZhaWxhYmxlICovCisJRURBQ19OT05FLAkJLyogRG9lc250IHN1cHBvcnQgRUNDICovCisJRURBQ19SRVNFUlZFRCwJCS8qIFJlc2VydmVkIEVDQyB0eXBlICovCisJRURBQ19QQVJJVFksCQkvKiBEZXRlY3RzIHBhcml0eSBlcnJvcnMgKi8KKwlFREFDX0VDLAkJLyogRXJyb3IgQ2hlY2tpbmcgLSBubyBjb3JyZWN0aW9uICovCisJRURBQ19TRUNERUQsCQkvKiBTaW5nbGUgYml0IGVycm9yIGNvcnJlY3Rpb24sIERvdWJsZSBkZXRlY3Rpb24gKi8KKwlFREFDX1MyRUNEMkVELAkJLyogQ2hpcGtpbGwgeDIgZGV2aWNlcyAtIGRvIHRoZXNlIGV4aXN0PyAqLworCUVEQUNfUzRFQ0Q0RUQsCQkvKiBDaGlwa2lsbCB4NCBkZXZpY2VzICovCisJRURBQ19TOEVDRDhFRCwJCS8qIENoaXBraWxsIHg4IGRldmljZXMgKi8KKwlFREFDX1MxNkVDRDE2RUQsCS8qIENoaXBraWxsIHgxNiBkZXZpY2VzICovCit9OworCisjZGVmaW5lIEVEQUNfRkxBR19VTktOT1dOCUJJVChFREFDX1VOS05PV04pCisjZGVmaW5lIEVEQUNfRkxBR19OT05FCQlCSVQoRURBQ19OT05FKQorI2RlZmluZSBFREFDX0ZMQUdfUEFSSVRZCUJJVChFREFDX1BBUklUWSkKKyNkZWZpbmUgRURBQ19GTEFHX0VDCQlCSVQoRURBQ19FQykKKyNkZWZpbmUgRURBQ19GTEFHX1NFQ0RFRAlCSVQoRURBQ19TRUNERUQpCisjZGVmaW5lIEVEQUNfRkxBR19TMkVDRDJFRAlCSVQoRURBQ19TMkVDRDJFRCkKKyNkZWZpbmUgRURBQ19GTEFHX1M0RUNENEVECUJJVChFREFDX1M0RUNENEVEKQorI2RlZmluZSBFREFDX0ZMQUdfUzhFQ0Q4RUQJQklUKEVEQUNfUzhFQ0Q4RUQpCisjZGVmaW5lIEVEQUNfRkxBR19TMTZFQ0QxNkVECUJJVChFREFDX1MxNkVDRDE2RUQpCisKKworLyogc2NydWJiaW5nIGNhcGFiaWxpdGllcyAqLworZW51bSBzY3J1Yl90eXBlIHsKKwlTQ1JVQl9VTktOT1dOID0gMCwJLyogVW5rbm93biBpZiBzY3J1YmJlciBpcyBhdmFpbGFibGUgKi8KKwlTQ1JVQl9OT05FLAkJLyogTm8gc2NydWJiZXIgKi8KKwlTQ1JVQl9TV19QUk9HLAkJLyogU1cgcHJvZ3Jlc3NpdmUgKHNlcXVlbnRpYWwpIHNjcnViYmluZyAqLworCVNDUlVCX1NXX1NSQywJCS8qIFNvZnR3YXJlIHNjcnViIG9ubHkgZXJyb3JzICovCisJU0NSVUJfU1dfUFJPR19TUkMsCS8qIFByb2dyZXNzaXZlIHNvZnR3YXJlIHNjcnViIGZyb20gYW4gZXJyb3IgKi8KKwlTQ1JVQl9TV19UVU5BQkxFLAkvKiBTb2Z0d2FyZSBzY3J1YiBmcmVxdWVuY3kgaXMgdHVuYWJsZSAqLworCVNDUlVCX0hXX1BST0csCQkvKiBIVyBwcm9ncmVzc2l2ZSAoc2VxdWVudGlhbCkgc2NydWJiaW5nICovCisJU0NSVUJfSFdfU1JDLAkJLyogSGFyZHdhcmUgc2NydWIgb25seSBlcnJvcnMgKi8KKwlTQ1JVQl9IV19QUk9HX1NSQywJLyogUHJvZ3Jlc3NpdmUgaGFyZHdhcmUgc2NydWIgZnJvbSBhbiBlcnJvciAqLworCVNDUlVCX0hXX1RVTkFCTEUJLyogSGFyZHdhcmUgc2NydWIgZnJlcXVlbmN5IGlzIHR1bmFibGUgKi8KK307CisKKyNkZWZpbmUgU0NSVUJfRkxBR19TV19QUk9HCUJJVChTQ1JVQl9TV19QUk9HKQorI2RlZmluZSBTQ1JVQl9GTEFHX1NXX1NSQwlCSVQoU0NSVUJfU1dfU1JDX0NPUlIpCisjZGVmaW5lIFNDUlVCX0ZMQUdfU1dfUFJPR19TUkMJQklUKFNDUlVCX1NXX1BST0dfU1JDX0NPUlIpCisjZGVmaW5lIFNDUlVCX0ZMQUdfU1dfVFVOCUJJVChTQ1JVQl9TV19TQ1JVQl9UVU5BQkxFKQorI2RlZmluZSBTQ1JVQl9GTEFHX0hXX1BST0cJQklUKFNDUlVCX0hXX1BST0cpCisjZGVmaW5lIFNDUlVCX0ZMQUdfSFdfU1JDCUJJVChTQ1JVQl9IV19TUkNfQ09SUikKKyNkZWZpbmUgU0NSVUJfRkxBR19IV19QUk9HX1NSQwlCSVQoU0NSVUJfSFdfUFJPR19TUkNfQ09SUikKKyNkZWZpbmUgU0NSVUJfRkxBR19IV19UVU4JQklUKFNDUlVCX0hXX1RVTkFCTEUpCisKK2VudW0gbWNpX3N5c2ZzX3N0YXR1cyB7CisJTUNJX1NZU0ZTX0lOQUNUSVZFID0gMCwJLyogc3lzZnMgZW50cmllcyBOT1QgcmVnaXN0ZXJlZCAqLworCU1DSV9TWVNGU19BQ1RJVkUJLyogc3lzZnMgZW50cmllcyBBUkUgcmVnaXN0ZXJlZCAqLworfTsKKworLyogRklYTUUgLSBzaG91bGQgaGF2ZSBub3RpZnkgY2FwYWJpbGl0aWVzOiBOTUksIExPRywgUFJPQywgZXRjICovCisKKy8qCisgKiBUaGVyZSBhcmUgc2V2ZXJhbCB0aGluZ3MgdG8gYmUgYXdhcmUgb2YgdGhhdCBhcmVuJ3QgYXQgYWxsIG9idmlvdXM6CisgKgorICoKKyAqIFNPQ0tFVFMsIFNPQ0tFVCBTRVRTLCBCQU5LUywgUk9XUywgQ0hJUC1TRUxFQ1QgUk9XUywgQ0hBTk5FTFMsIGV0Yy4uCisgKgorICogVGhlc2UgYXJlIHNvbWUgb2YgdGhlIG1hbnkgdGVybXMgdGhhdCBhcmUgdGhyb3duIGFib3V0IHRoYXQgZG9uJ3QgYWx3YXlzCisgKiBtZWFuIHdoYXQgcGVvcGxlIHRoaW5rIHRoZXkgbWVhbiAoSW5jb25jZWl2YWJsZSEpLiAgSW4gdGhlIGludGVyZXN0IG9mCisgKiBjcmVhdGluZyBhIGNvbW1vbiBncm91bmQgZm9yIGRpc2N1c3Npb24sIHRlcm1zIGFuZCB0aGVpciBkZWZpbml0aW9ucworICogd2lsbCBiZSBlc3RhYmxpc2hlZC4KKyAqCisgKiBNZW1vcnkgZGV2aWNlczoJVGhlIGluZGl2aWR1YWwgY2hpcCBvbiBhIG1lbW9yeSBzdGljay4gIFRoZXNlIGRldmljZXMKKyAqCQkJY29tbW9ubHkgb3V0cHV0IDQgYW5kIDggYml0cyBlYWNoLiAgR3JvdXBpbmcgc2V2ZXJhbAorICoJCQlvZiB0aGVzZSBpbiBwYXJhbGxlbCBwcm92aWRlcyA2NCBiaXRzIHdoaWNoIGlzIGNvbW1vbgorICoJCQlmb3IgYSBtZW1vcnkgc3RpY2suCisgKgorICogTWVtb3J5IFN0aWNrOglBIHByaW50ZWQgY2lyY3VpdCBib2FyZCB0aGF0IGFncmVnYXRlcyBtdWx0aXBsZQorICoJCQltZW1vcnkgZGV2aWNlcyBpbiBwYXJhbGxlbC4gIFRoaXMgaXMgdGhlIGF0b21pYworICoJCQltZW1vcnkgY29tcG9uZW50IHRoYXQgaXMgcHVyY2hhc2VhYmxlIGJ5IEpvZSBjb25zdW1lcgorICoJCQlhbmQgbG9hZGVkIGludG8gYSBtZW1vcnkgc29ja2V0LgorICoKKyAqIFNvY2tldDoJCUEgcGh5c2ljYWwgY29ubmVjdG9yIG9uIHRoZSBtb3RoZXJib2FyZCB0aGF0IGFjY2VwdHMKKyAqCQkJYSBzaW5nbGUgbWVtb3J5IHN0aWNrLgorICoKKyAqIENoYW5uZWw6CQlTZXQgb2YgbWVtb3J5IGRldmljZXMgb24gYSBtZW1vcnkgc3RpY2sgdGhhdCBtdXN0IGJlCisgKgkJCWdyb3VwZWQgaW4gcGFyYWxsZWwgd2l0aCBvbmUgb3IgbW9yZSBhZGRpdGlvbmFsCisgKgkJCWNoYW5uZWxzIGZyb20gb3RoZXIgbWVtb3J5IHN0aWNrcy4gIFRoaXMgcGFyYWxsZWwKKyAqCQkJZ3JvdXBpbmcgb2YgdGhlIG91dHB1dCBmcm9tIG11bHRpcGxlIGNoYW5uZWxzIGFyZQorICoJCQluZWNlc3NhcnkgZm9yIHRoZSBzbWFsbGVzdCBncmFudWxhcml0eSBvZiBtZW1vcnkgYWNjZXNzLgorICoJCQlTb21lIG1lbW9yeSBjb250cm9sbGVycyBhcmUgY2FwYWJsZSBvZiBzaW5nbGUgY2hhbm5lbCAtCisgKgkJCXdoaWNoIG1lYW5zIHRoYXQgbWVtb3J5IHN0aWNrcyBjYW4gYmUgbG9hZGVkCisgKgkJCWluZGl2aWR1YWxseS4gIE90aGVyIG1lbW9yeSBjb250cm9sbGVycyBhcmUgb25seQorICoJCQljYXBhYmxlIG9mIGR1YWwgY2hhbm5lbCAtIHdoaWNoIG1lYW5zIHRoYXQgbWVtb3J5CisgKgkJCXN0aWNrcyBtdXN0IGJlIGxvYWRlZCBhcyBwYWlycyAoc2VlICJzb2NrZXQgc2V0IikuCisgKgorICogQ2hpcC1zZWxlY3Qgcm93OglBbGwgb2YgdGhlIG1lbW9yeSBkZXZpY2VzIHRoYXQgYXJlIHNlbGVjdGVkIHRvZ2V0aGVyLgorICoJCQlmb3IgYSBzaW5nbGUsIG1pbmltdW0gZ3JhaW4gb2YgbWVtb3J5IGFjY2Vzcy4KKyAqCQkJVGhpcyBzZWxlY3RzIGFsbCBvZiB0aGUgcGFyYWxsZWwgbWVtb3J5IGRldmljZXMgYWNyb3NzCisgKgkJCWFsbCBvZiB0aGUgcGFyYWxsZWwgY2hhbm5lbHMuICBDb21tb24gY2hpcC1zZWxlY3Qgcm93cworICoJCQlmb3Igc2luZ2xlIGNoYW5uZWwgYXJlIDY0IGJpdHMsIGZvciBkdWFsIGNoYW5uZWwgMTI4CisgKgkJCWJpdHMuCisgKgorICogU2luZ2xlLVJhbmtlZCBzdGljazoJQSBTaW5nbGUtcmFua2VkIHN0aWNrIGhhcyAxIGNoaXAtc2VsZWN0IHJvdyBvZiBtZW1tb3J5LgorICoJCQlNb3RoZXJib2FyZHMgY29tbW9ubHkgZHJpdmUgdHdvIGNoaXAtc2VsZWN0IHBpbnMgdG8KKyAqCQkJYSBtZW1vcnkgc3RpY2suIEEgc2luZ2xlLXJhbmtlZCBzdGljaywgd2lsbCBvY2N1cHkKKyAqCQkJb25seSBvbmUgb2YgdGhvc2Ugcm93cy4gVGhlIG90aGVyIHdpbGwgYmUgdW51c2VkLgorICoKKyAqIERvdWJsZS1SYW5rZWQgc3RpY2s6CUEgZG91YmxlLXJhbmtlZCBzdGljayBoYXMgdHdvIGNoaXAtc2VsZWN0IHJvd3Mgd2hpY2gKKyAqCQkJYWNjZXNzIGRpZmZlcmVudCBzZXRzIG9mIG1lbW9yeSBkZXZpY2VzLiAgVGhlIHR3bworICoJCQlyb3dzIGNhbm5vdCBiZSBhY2Nlc3NlZCBjb25jdXJyZW50bHkuCisgKgorICogRG91YmxlLXNpZGVkIHN0aWNrOglERVBSRUNBVEVEIFRFUk0sIHNlZSBEb3VibGUtUmFua2VkIHN0aWNrLgorICoJCQlBIGRvdWJsZS1zaWRlZCBzdGljayBoYXMgdHdvIGNoaXAtc2VsZWN0IHJvd3Mgd2hpY2gKKyAqCQkJYWNjZXNzIGRpZmZlcmVudCBzZXRzIG9mIG1lbW9yeSBkZXZpY2VzLiAgVGhlIHR3bworICoJCQlyb3dzIGNhbm5vdCBiZSBhY2Nlc3NlZCBjb25jdXJyZW50bHkuICAiRG91YmxlLXNpZGVkIgorICoJCQlpcyBpcnJlc3BlY3RpdmUgb2YgdGhlIG1lbW9yeSBkZXZpY2VzIGJlaW5nIG1vdW50ZWQKKyAqCQkJb24gYm90aCBzaWRlcyBvZiB0aGUgbWVtb3J5IHN0aWNrLgorICoKKyAqIFNvY2tldCBzZXQ6CQlBbGwgb2YgdGhlIG1lbW9yeSBzdGlja3MgdGhhdCBhcmUgcmVxdWlyZWQgZm9yIGZvcgorICoJCQlhIHNpbmdsZSBtZW1vcnkgYWNjZXNzIG9yIGFsbCBvZiB0aGUgbWVtb3J5IHN0aWNrcworICoJCQlzcGFubmVkIGJ5IGEgY2hpcC1zZWxlY3Qgcm93LiAgQSBzaW5nbGUgc29ja2V0IHNldAorICoJCQloYXMgdHdvIGNoaXAtc2VsZWN0IHJvd3MgYW5kIGlmIGRvdWJsZS1zaWRlZCBzdGlja3MKKyAqCQkJYXJlIHVzZWQgdGhlc2Ugd2lsbCBvY2N1cHkgdGhvc2UgY2hpcC1zZWxlY3Qgcm93cy4KKyAqCisgKiBCYW5rOgkJVGhpcyB0ZXJtIGlzIGF2b2lkZWQgYmVjYXVzZSBpdCBpcyB1bmNsZWFyIHdoZW4KKyAqCQkJbmVlZGluZyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGNoaXAtc2VsZWN0IHJvd3MgYW5kCisgKgkJCXNvY2tldCBzZXRzLgorICoKKyAqIENvbnRyb2xsZXIgcGFnZXM6CisgKgorICogUGh5c2ljYWwgcGFnZXM6CisgKgorICogVmlydHVhbCBwYWdlczoKKyAqCisgKgorICogU1RSVUNUVVJFIE9SR0FOSVpBVElPTiBBTkQgQ0hPSUNFUworICoKKyAqCisgKgorICogUFMgLSBJIGVuam95ZWQgd3JpdGluZyBhbGwgdGhhdCBhYm91dCBhcyBtdWNoIGFzIHlvdSBlbmpveWVkIHJlYWRpbmcgaXQuCisgKi8KKworCitzdHJ1Y3QgY2hhbm5lbF9pbmZvIHsKKwlpbnQgY2hhbl9pZHg7CQkvKiBjaGFubmVsIGluZGV4ICovCisJdTMyIGNlX2NvdW50OwkJLyogQ29ycmVjdGFibGUgRXJyb3JzIGZvciB0aGlzIENIQU5ORUwgKi8KKwljaGFyIGxhYmVsW0VEQUNfTUNfTEFCRUxfTEVOICsgMV07CS8qIERJTU0gbGFiZWwgb24gbW90aGVyYm9hcmQgKi8KKwlzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3Nyb3c7CS8qIHRoZSBwYXJlbnQgKi8KK307CisKKworc3RydWN0IGNzcm93X2luZm8geworCXVuc2lnbmVkIGxvbmcgZmlyc3RfcGFnZTsJLyogZmlyc3QgcGFnZSBudW1iZXIgaW4gZGltbSAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF9wYWdlOwkvKiBsYXN0IHBhZ2UgbnVtYmVyIGluIGRpbW0gKi8KKwl1bnNpZ25lZCBsb25nIHBhZ2VfbWFzazsJLyogdXNlZCBmb3IgaW50ZXJsZWF2aW5nIC0KKwkJCQkJICAgMFVMIGZvciBub24gaW50bHYgKi8KKwl1MzIgbnJfcGFnZXM7CQkvKiBudW1iZXIgb2YgcGFnZXMgaW4gY3Nyb3cgKi8KKwl1MzIgZ3JhaW47CQkvKiBncmFudWxhcml0eSBvZiByZXBvcnRlZCBlcnJvciBpbiBieXRlcyAqLworCWludCBjc3Jvd19pZHg7CQkvKiB0aGUgY2hpcC1zZWxlY3Qgcm93ICovCisJZW51bSBkZXZfdHlwZSBkdHlwZTsJLyogbWVtb3J5IGRldmljZSB0eXBlICovCisJdTMyIHVlX2NvdW50OwkJLyogVW5jb3JyZWN0YWJsZSBFcnJvcnMgZm9yIHRoaXMgY3Nyb3cgKi8KKwl1MzIgY2VfY291bnQ7CQkvKiBDb3JyZWN0YWJsZSBFcnJvcnMgZm9yIHRoaXMgY3Nyb3cgKi8KKwllbnVtIG1lbV90eXBlIG10eXBlOwkvKiBtZW1vcnkgY3Nyb3cgdHlwZSAqLworCWVudW0gZWRhY190eXBlIGVkYWNfbW9kZTsJLyogRURBQyBtb2RlIGZvciB0aGlzIGNzcm93ICovCisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpOwkvKiB0aGUgcGFyZW50ICovCisKKwlzdHJ1Y3Qga29iamVjdCBrb2JqOwkvKiBzeXNmcyBrb2JqZWN0IGZvciB0aGlzIGNzcm93ICovCisKKwkvKiBGSVhNRSB0aGUgbnVtYmVyIG9mIENIQU5ORUxzIG1pZ2h0IG5lZWQgdG8gYmVjb21lIGR5bmFtaWMgKi8KKwl1MzIgbnJfY2hhbm5lbHM7CisJc3RydWN0IGNoYW5uZWxfaW5mbyAqY2hhbm5lbHM7Cit9OworCisKK3N0cnVjdCBtZW1fY3RsX2luZm8geworCXN0cnVjdCBsaXN0X2hlYWQgbGluazsgIC8qIGZvciBnbG9iYWwgbGlzdCBvZiBtZW1fY3RsX2luZm8gc3RydWN0cyAqLworCXVuc2lnbmVkIGxvbmcgbXR5cGVfY2FwOwkvKiBtZW1vcnkgdHlwZXMgc3VwcG9ydGVkIGJ5IG1jICovCisJdW5zaWduZWQgbG9uZyBlZGFjX2N0bF9jYXA7CS8qIE1lbSBjb250cm9sbGVyIEVEQUMgY2FwYWJpbGl0aWVzICovCisJdW5zaWduZWQgbG9uZyBlZGFjX2NhcDsJLyogY29uZmlndXJhdGlvbiBjYXBhYmlsaXRpZXMgLSB0aGlzIGlzCisJCQkJICAgY2xvc2VseSByZWxhdGVkIHRvIGVkYWNfY3RsX2NhcC4gIFRoZQorCQkJCSAgIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgY29udHJvbGxlcgorCQkJCSAgIG1heSBiZSBjYXBhYmxlIG9mIHM0ZWNkNGVkIHdoaWNoIHdvdWxkCisJCQkJICAgYmUgbGlzdGVkIGluIGVkYWNfY3RsX2NhcCwgYnV0IGlmCisJCQkJICAgY2hhbm5lbHMgYXJlbid0IGNhcGFibGUgb2YgczRlY2Q0ZWQgdGhlbiB0aGUKKwkJCQkgICBlZGFjX2NhcCB3b3VsZCBub3QgaGF2ZSB0aGF0IGNhcGFiaWxpdHkuICovCisJdW5zaWduZWQgbG9uZyBzY3J1Yl9jYXA7CS8qIGNoaXBzZXQgc2NydWIgY2FwYWJpbGl0aWVzICovCisJZW51bSBzY3J1Yl90eXBlIHNjcnViX21vZGU7CS8qIGN1cnJlbnQgc2NydWIgbW9kZSAqLworCisJZW51bSBtY2lfc3lzZnNfc3RhdHVzIHN5c2ZzX2FjdGl2ZTsJLyogc3RhdHVzIG9mIHN5c2ZzICovCisKKwkvKiBwb2ludGVyIHRvIGVkYWMgY2hlY2tpbmcgcm91dGluZSAqLworCXZvaWQgKCplZGFjX2NoZWNrKSAoc3RydWN0IG1lbV9jdGxfaW5mbyAqIG1jaSk7CisJLyoKKwkgKiBSZW1hcHMgbWVtb3J5IHBhZ2VzOiBjb250cm9sbGVyIHBhZ2VzIHRvIHBoeXNpY2FsIHBhZ2VzLgorCSAqIEZvciBtb3N0IE1DJ3MsIHRoaXMgd2lsbCBiZSBOVUxMLgorCSAqLworCS8qIEZJWE1FIC0gd2h5IG5vdCBzZW5kIHRoZSBwaHlzIHBhZ2UgdG8gYmVnaW4gd2l0aD8gKi8KKwl1bnNpZ25lZCBsb25nICgqY3RsX3BhZ2VfdG9fcGh5cykgKHN0cnVjdCBtZW1fY3RsX2luZm8gKiBtY2ksCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgcGFnZSk7CisJaW50IG1jX2lkeDsKKwlpbnQgbnJfY3Nyb3dzOworCXN0cnVjdCBjc3Jvd19pbmZvICpjc3Jvd3M7CisJLyoKKwkgKiBGSVhNRSAtIHdoYXQgYWJvdXQgY29udHJvbGxlcnMgb24gb3RoZXIgYnVzc2VzPyAtIElEcyBtdXN0IGJlCisJICogdW5pcXVlLiAgcGRldiBwb2ludGVyIHNob3VsZCBiZSBzdWZmaWNpZW50bHkgdW5pcXVlLCBidXQKKwkgKiBCVVM6U0xPVC5GVU5DIG51bWJlcnMgbWF5IG5vdCBiZSB1bmlxdWUuCisJICovCisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJY29uc3QgY2hhciAqbW9kX25hbWU7CisJY29uc3QgY2hhciAqbW9kX3ZlcjsKKwljb25zdCBjaGFyICpjdGxfbmFtZTsKKwljaGFyIHByb2NfbmFtZVtNQ19QUk9DX05BTUVfTUFYX0xFTiArIDFdOworCXZvaWQgKnB2dF9pbmZvOworCXUzMiB1ZV9ub2luZm9fY291bnQ7CS8qIFVuY29ycmVjdGFibGUgRXJyb3JzIHcvbyBpbmZvICovCisJdTMyIGNlX25vaW5mb19jb3VudDsJLyogQ29ycmVjdGFibGUgRXJyb3JzIHcvbyBpbmZvICovCisJdTMyIHVlX2NvdW50OwkJLyogVG90YWwgVW5jb3JyZWN0YWJsZSBFcnJvcnMgZm9yIHRoaXMgTUMgKi8KKwl1MzIgY2VfY291bnQ7CQkvKiBUb3RhbCBDb3JyZWN0YWJsZSBFcnJvcnMgZm9yIHRoaXMgTUMgKi8KKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3RpbWU7CS8qIG1jaSBsb2FkIHN0YXJ0IHRpbWUgKGluIGppZmZpZXMpICovCisKKwkvKiB0aGlzIHN0dWZmIGlzIGZvciBzYWZlIHJlbW92YWwgb2YgbWMgZGV2aWNlcyBmcm9tIGdsb2JhbCBsaXN0IHdoaWxlCisJICogTk1JIGhhbmRsZXJzIG1heSBiZSB0cmF2ZXJzaW5nIGxpc3QKKwkgKi8KKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1OworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRlOworCisJLyogZWRhYyBzeXNmcyBkZXZpY2UgY29udHJvbCAqLworCXN0cnVjdCBrb2JqZWN0IGVkYWNfbWNpX2tvYmo7Cit9OworCisKKworLyogd3JpdGUgYWxsIG9yIHNvbWUgYml0cyBpbiBhIGJ5dGUtcmVnaXN0ZXIqLworc3RhdGljIGlubGluZSB2b2lkIHBjaV93cml0ZV9iaXRzOChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IG9mZnNldCwKKwkJCQkgICB1OCB2YWx1ZSwgdTggbWFzaykKK3sKKwlpZiAobWFzayAhPSAweGZmKSB7CisJCXU4IGJ1ZjsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgb2Zmc2V0LCAmYnVmKTsKKwkJdmFsdWUgJj0gbWFzazsKKwkJYnVmICY9IH5tYXNrOworCQl2YWx1ZSB8PSBidWY7CisJfQorCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBvZmZzZXQsIHZhbHVlKTsKK30KKworCisvKiB3cml0ZSBhbGwgb3Igc29tZSBiaXRzIGluIGEgd29yZC1yZWdpc3RlciovCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX3dyaXRlX2JpdHMxNihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IG9mZnNldCwKKwkJCQkgICAgdTE2IHZhbHVlLCB1MTYgbWFzaykKK3sKKwlpZiAobWFzayAhPSAweGZmZmYpIHsKKwkJdTE2IGJ1ZjsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgb2Zmc2V0LCAmYnVmKTsKKwkJdmFsdWUgJj0gbWFzazsKKwkJYnVmICY9IH5tYXNrOworCQl2YWx1ZSB8PSBidWY7CisJfQorCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBvZmZzZXQsIHZhbHVlKTsKK30KKworCisvKiB3cml0ZSBhbGwgb3Igc29tZSBiaXRzIGluIGEgZHdvcmQtcmVnaXN0ZXIqLworc3RhdGljIGlubGluZSB2b2lkIHBjaV93cml0ZV9iaXRzMzIoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBvZmZzZXQsCisJCQkJICAgIHUzMiB2YWx1ZSwgdTMyIG1hc2spCit7CisJaWYgKG1hc2sgIT0gMHhmZmZmKSB7CisJCXUzMiBidWY7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBvZmZzZXQsICZidWYpOworCQl2YWx1ZSAmPSBtYXNrOworCQlidWYgJj0gfm1hc2s7CisJCXZhbHVlIHw9IGJ1ZjsKKwl9CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBvZmZzZXQsIHZhbHVlKTsKK30KKworCisjaWZkZWYgQ09ORklHX0VEQUNfREVCVUcKK3ZvaWQgZWRhY19tY19kdW1wX2NoYW5uZWwoc3RydWN0IGNoYW5uZWxfaW5mbyAqY2hhbik7Cit2b2lkIGVkYWNfbWNfZHVtcF9tY2koc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKTsKK3ZvaWQgZWRhY19tY19kdW1wX2Nzcm93KHN0cnVjdCBjc3Jvd19pbmZvICpjc3Jvdyk7CisjZW5kaWYJCQkJLyogQ09ORklHX0VEQUNfREVCVUcgKi8KKworZXh0ZXJuIGludCBlZGFjX21jX2FkZF9tYyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpOworZXh0ZXJuIGludCBlZGFjX21jX2RlbF9tYyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpOworCitleHRlcm4gaW50IGVkYWNfbWNfZmluZF9jc3Jvd19ieV9wYWdlKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBwYWdlKTsKKworZXh0ZXJuIHN0cnVjdCBtZW1fY3RsX2luZm8gKmVkYWNfbWNfZmluZF9tY2lfYnlfcGRldihzdHJ1Y3QgcGNpX2RldgorCQkJCQkJCSAgKnBkZXYpOworCitleHRlcm4gdm9pZCBlZGFjX21jX3NjcnViX2Jsb2NrKHVuc2lnbmVkIGxvbmcgcGFnZSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1MzIgc2l6ZSk7CisKKy8qCisgKiBUaGUgbm8gaW5mbyBlcnJvcnMgYXJlIHVzZWQgd2hlbiBlcnJvciBvdmVyZmxvd3MgYXJlIHJlcG9ydGVkLgorICogVGhlcmUgYXJlIGEgbGltaXRlZCBudW1iZXIgb2YgZXJyb3IgbG9nZ2luZyByZWdpc3RlcnMgdGhhdCBjYW4KKyAqIGJlIGV4YXVzdGVkLiAgV2hlbiBhbGwgcmVnaXN0ZXJzIGFyZSBleGhhdXN0ZWQgYW5kIGFuIGFkZGl0aW9uYWwKKyAqIGVycm9yIG9jY3VycyB0aGVuIGFuIGVycm9yIG92ZXJmbG93IHJlZ2lzdGVyIHJlY29yZHMgdGhhdCBhbgorICogZXJyb3Igb2NjdXJlZCBhbmQgdGhlIHR5cGUgb2YgZXJyb3IsIGJ1dCBkb2Vzbid0IGhhdmUgYW55CisgKiBmdXJ0aGVyIGluZm9ybWF0aW9uLiAgVGhlIGNlL3VlIHZlcnNpb25zIG1ha2UgZm9yIGNsZWFuZXIKKyAqIHJlcG9ydGluZyBsb2dpYyBhbmQgZnVuY3Rpb24gaW50ZXJmYWNlIC0gcmVkdWNlcyBjb25kaXRpb25hbAorICogc3RhdGVtZW50IGNsdXR0ZXIgYW5kIGV4dHJhIGZ1bmN0aW9uIGFyZ3VtZW50cy4KKyAqLworZXh0ZXJuIHZvaWQgZWRhY19tY19oYW5kbGVfY2Uoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgcGFnZV9mcmFtZV9udW1iZXIsCisJCQkJICAgdW5zaWduZWQgbG9uZyBvZmZzZXRfaW5fcGFnZSwKKwkJCQkgICB1bnNpZ25lZCBsb25nIHN5bmRyb21lLAorCQkJCSAgIGludCByb3csIGludCBjaGFubmVsLCBjb25zdCBjaGFyICptc2cpOworCitleHRlcm4gdm9pZCBlZGFjX21jX2hhbmRsZV9jZV9ub19pbmZvKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCQkJICAgY29uc3QgY2hhciAqbXNnKTsKKworZXh0ZXJuIHZvaWQgZWRhY19tY19oYW5kbGVfdWUoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgcGFnZV9mcmFtZV9udW1iZXIsCisJCQkJICAgdW5zaWduZWQgbG9uZyBvZmZzZXRfaW5fcGFnZSwKKwkJCQkgICBpbnQgcm93LCBjb25zdCBjaGFyICptc2cpOworCitleHRlcm4gdm9pZCBlZGFjX21jX2hhbmRsZV91ZV9ub19pbmZvKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCQkJICAgY29uc3QgY2hhciAqbXNnKTsKKworLyoKKyAqIFRoaXMga21hbGxvYydzIGFuZCBpbml0aWFsaXplcyBhbGwgdGhlIHN0cnVjdHVyZXMuCisgKiBDYW4ndCBiZSB1c2VkIGlmIGFsbCBzdHJ1Y3R1cmVzIGRvbid0IGhhdmUgdGhlIHNhbWUgbGlmZXRpbWUuCisgKi8KK2V4dGVybiBzdHJ1Y3QgbWVtX2N0bF9pbmZvICplZGFjX21jX2FsbG9jKHVuc2lnbmVkIHN6X3B2dCwKKwkJdW5zaWduZWQgbnJfY3Nyb3dzLCB1bnNpZ25lZCBucl9jaGFucyk7CisKKy8qIEZyZWUgYW4gbWMgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnkgZWRhY19tY19hbGxvYygpICovCitleHRlcm4gdm9pZCBlZGFjX21jX2ZyZWUoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKTsKKworCisjZW5kaWYJCQkJLyogX0VEQUNfTUNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9pODI4NjBfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2k4Mjg2MF9lZGFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI1OTZlNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZWRhYy9pODI4NjBfZWRhYy5jCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogSW50ZWwgODI4NjAgTWVtb3J5IENvbnRyb2xsZXIga2VybmVsIG1vZHVsZQorICogKEMpIDIwMDUgUmVkIEhhdCAoaHR0cDovL3d3dy5yZWRoYXQuY29tKQorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBXcml0dGVuIGJ5IEJlbiBXb29kYXJkIDx3b29kYXJkQHJlZGhhdC5jb20+CisgKiBzaGFtZWxlc3NseSBjb3BpZWQgZnJvbSBhbmQgYmFzZWQgdXBvbiB0aGUgZWRhY19pODI4NzUgZHJpdmVyCisgKiBieSBUaGF5bmUgSGFyYmF1Z2ggb2YgTGludXggTmV0d29yeC4gKGh0dHA6Ly9sbnhpLmNvbSkKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJlZGFjX21jLmgiCisKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODYwXzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84Mjg2MF8wCTB4MjUzMQorI2VuZGlmCQkJCS8qIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NjBfMCAqLworCisjZGVmaW5lIEk4Mjg2MF9NQ0hDRkcgMHg1MAorI2RlZmluZSBJODI4NjBfR0JBIDB4NjAKKyNkZWZpbmUgSTgyODYwX0dCQV9NQVNLIDB4N0ZGCisjZGVmaW5lIEk4Mjg2MF9HQkFfU0hJRlQgMjQKKyNkZWZpbmUgSTgyODYwX0VSUlNUUyAweEM4CisjZGVmaW5lIEk4Mjg2MF9FQVAgMHhFNAorI2RlZmluZSBJODI4NjBfREVSUkNUTF9TVFMgMHhFMgorCitlbnVtIGk4Mjg2MF9jaGlwcyB7CisJSTgyODYwID0gMCwKK307CisKK3N0cnVjdCBpODI4NjBfZGV2X2luZm8geworCWNvbnN0IGNoYXIgKmN0bF9uYW1lOworfTsKKworc3RydWN0IGk4Mjg2MF9lcnJvcl9pbmZvIHsKKwl1MTYgZXJyc3RzOworCXUzMiBlYXA7CisJdTE2IGRlcnJzeW47CisJdTE2IGVycnN0czI7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGk4Mjg2MF9kZXZfaW5mbyBpODI4NjBfZGV2c1tdID0geworCVtJODI4NjBdID0geworCQkgICAgLmN0bF9uYW1lID0gImk4Mjg2MCJ9LAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2ICptY2lfcGRldiA9IE5VTEw7CS8qIGluaXQgZGV2OiBpbiBjYXNlIHRoYXQgQUdQIGNvZGUKKwkJCQkJICAgaGFzIGFscmVhZHkgcmVnaXN0ZXJlZCBkcml2ZXIgKi8KKworc3RhdGljIGludCBpODI4NjBfcmVnaXN0ZXJlZCA9IDE7CisKK3N0YXRpYyB2b2lkIGk4Mjg2MF9nZXRfZXJyb3JfaW5mbyAoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQlzdHJ1Y3QgaTgyODYwX2Vycm9yX2luZm8gKmluZm8pCit7CisJLyoKKwkgKiBUaGlzIGlzIGEgbWVzcyBiZWNhdXNlIHRoZXJlIGlzIG5vIGF0b21pYyB3YXkgdG8gcmVhZCBhbGwgdGhlCisJICogcmVnaXN0ZXJzIGF0IG9uY2UgYW5kIHRoZSByZWdpc3RlcnMgY2FuIHRyYW5zaXRpb24gZnJvbSBDRSBiZWluZworCSAqIG92ZXJ3cml0dGVuIGJ5IFVFLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKG1jaS0+cGRldiwgSTgyODYwX0VSUlNUUywgJmluZm8tPmVycnN0cyk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG1jaS0+cGRldiwgSTgyODYwX0VBUCwgJmluZm8tPmVhcCk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQobWNpLT5wZGV2LCBJODI4NjBfREVSUkNUTF9TVFMsICZpbmZvLT5kZXJyc3luKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChtY2ktPnBkZXYsIEk4Mjg2MF9FUlJTVFMsICZpbmZvLT5lcnJzdHMyKTsKKworCXBjaV93cml0ZV9iaXRzMTYobWNpLT5wZGV2LCBJODI4NjBfRVJSU1RTLCAweDAwMDMsIDB4MDAwMyk7CisKKwkvKgorCSAqIElmIHRoZSBlcnJvciBpcyB0aGUgc2FtZSBmb3IgYm90aCByZWFkcyB0aGVuIHRoZSBmaXJzdCBzZXQgb2YgcmVhZHMKKwkgKiBpcyB2YWxpZC4gIElmIHRoZXJlIGlzIGEgY2hhbmdlIHRoZW4gdGhlcmUgaXMgYSBDRSBubyBpbmZvIGFuZCB0aGUKKwkgKiBzZWNvbmQgc2V0IG9mIHJlYWRzIGlzIHZhbGlkIGFuZCBzaG91bGQgYmUgVUUgaW5mby4KKwkgKi8KKwlpZiAoIShpbmZvLT5lcnJzdHMyICYgMHgwMDAzKSkKKwkJcmV0dXJuOworCWlmICgoaW5mby0+ZXJyc3RzIF4gaW5mby0+ZXJyc3RzMikgJiAweDAwMDMpIHsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG1jaS0+cGRldiwgSTgyODYwX0VBUCwgJmluZm8tPmVhcCk7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKG1jaS0+cGRldiwgSTgyODYwX0RFUlJDVExfU1RTLAorCQkgICAgJmluZm8tPmRlcnJzeW4pOworCX0KK30KKworc3RhdGljIGludCBpODI4NjBfcHJvY2Vzc19lcnJvcl9pbmZvIChzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCXN0cnVjdCBpODI4NjBfZXJyb3JfaW5mbyAqaW5mbywgaW50IGhhbmRsZV9lcnJvcnMpCit7CisJaW50IHJvdzsKKworCWlmICghKGluZm8tPmVycnN0czIgJiAweDAwMDMpKQorCQlyZXR1cm4gMDsKKworCWlmICghaGFuZGxlX2Vycm9ycykKKwkJcmV0dXJuIDE7CisKKwlpZiAoKGluZm8tPmVycnN0cyBeIGluZm8tPmVycnN0czIpICYgMHgwMDAzKSB7CisJCWVkYWNfbWNfaGFuZGxlX2NlX25vX2luZm8obWNpLCAiVUUgb3Zlcndyb3RlIENFIik7CisJCWluZm8tPmVycnN0cyA9IGluZm8tPmVycnN0czI7CisJfQorCisJaW5mby0+ZWFwID4+PSBQQUdFX1NISUZUOworCXJvdyA9IGVkYWNfbWNfZmluZF9jc3Jvd19ieV9wYWdlKG1jaSwgaW5mby0+ZWFwKTsKKworCWlmIChpbmZvLT5lcnJzdHMgJiAweDAwMDIpCisJCWVkYWNfbWNfaGFuZGxlX3VlKG1jaSwgaW5mby0+ZWFwLCAwLCByb3csICJpODI4NjAgVUUiKTsKKwllbHNlCisJCWVkYWNfbWNfaGFuZGxlX2NlKG1jaSwgaW5mby0+ZWFwLCAwLCBpbmZvLT5kZXJyc3luLCByb3csCisJCQkJICAgICAgIDAsICJpODI4NjAgVUUiKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBpODI4NjBfY2hlY2soc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCXN0cnVjdCBpODI4NjBfZXJyb3JfaW5mbyBpbmZvOworCisJZGVidWdmMSgiTUMlZDogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBtY2ktPm1jX2lkeCwgX19mdW5jX18pOworCWk4Mjg2MF9nZXRfZXJyb3JfaW5mbyhtY2ksICZpbmZvKTsKKwlpODI4NjBfcHJvY2Vzc19lcnJvcl9pbmZvKG1jaSwgJmluZm8sIDEpOworfQorCitzdGF0aWMgaW50IGk4Mjg2MF9wcm9iZTEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBkZXZfaWR4KQoreworCWludCByYyA9IC1FTk9ERVY7CisJaW50IGluZGV4OworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBsYXN0X2N1bXVsX3NpemU7CisKKwl1MTYgbWNoY2ZnX2RkaW07CS8qIERSQU0gRGF0YSBJbnRlZ3JpdHkgTW9kZSAwPW5vbmUsMj1lZGFjICovCisKKwkvKiBSRFJBTSBoYXMgY2hhbm5lbHMgYnV0IHRoZXNlIGRvbid0IG1hcCBvbnRvIHRoZSBhYnN0cmFjdGlvbnMgdGhhdAorCSAgIGVkYWMgdXNlcy4KKwkgICBUaGUgZGV2aWNlIGdyb3VwcyBmcm9tIHRoZSBHUkEgcmVnaXN0ZXJzIHNlZW0gdG8gbWFwIHJlYXNvbmFibHkKKwkgICB3ZWxsIG9udG8gdGhlIG5vdGlvbiBvZiBhIGNoaXAgc2VsZWN0IHJvdy4KKwkgICBUaGVyZSBhcmUgMTYgR1JBIHJlZ2lzdGVycyBhbmQgc2luY2UgdGhlIG5hbWUgaXMgYXNzb2NpYXRlZCB3aXRoCisJICAgdGhlIGNoYW5uZWwgYW5kIHRoZSBHUkEgcmVnaXN0ZXJzIG1hcCB0byBwaHlzaWNhbCBkZXZpY2VzIHNvIHdlIGFyZQorCSAgIGdvaW5nIHRvIG1ha2UgMSBjaGFubmVsIGZvciBncm91cC4KKwkgKi8KKwltY2kgPSBlZGFjX21jX2FsbG9jKDAsIDE2LCAxKTsKKwlpZiAoIW1jaSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpOiBpbml0IG1jaVxuIiwgX19mdW5jX18pOworCisJbWNpLT5wZGV2ID0gcGRldjsKKwltY2ktPm10eXBlX2NhcCA9IE1FTV9GTEFHX0REUjsKKworCisJbWNpLT5lZGFjX2N0bF9jYXAgPSBFREFDX0ZMQUdfTk9ORSB8IEVEQUNfRkxBR19TRUNERUQ7CisJLyogSSJtIG5vdCBzdXJlIGFib3V0IHRoaXMgYnV0IEkgdGhpbmsgdGhhdCBhbGwgUkRSQU0gaXMgU0VDREVEICovCisJbWNpLT5lZGFjX2NhcCA9IEVEQUNfRkxBR19TRUNERUQ7CisJLyogYWRqdXN0IEZMQUdTICovCisKKwltY2ktPm1vZF9uYW1lID0gQlNfTU9EX1NUUjsKKwltY2ktPm1vZF92ZXIgPSAiJFJldmlzaW9uOiAxLjEuMi42ICQiOworCW1jaS0+Y3RsX25hbWUgPSBpODI4NjBfZGV2c1tkZXZfaWR4XS5jdGxfbmFtZTsKKwltY2ktPmVkYWNfY2hlY2sgPSBpODI4NjBfY2hlY2s7CisJbWNpLT5jdGxfcGFnZV90b19waHlzID0gTlVMTDsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKG1jaS0+cGRldiwgSTgyODYwX01DSENGRywgJm1jaGNmZ19kZGltKTsKKwltY2hjZmdfZGRpbSA9IG1jaGNmZ19kZGltICYgMHgxODA7CisKKwkvKgorCSAqIFRoZSBncm91cCByb3cgYm91bmRhcnkgKEdSQSkgcmVnIHZhbHVlcyBhcmUgYm91bmRhcnkgYWRkcmVzcworCSAqIGZvciBlYWNoIERSQU0gcm93IHdpdGggYSBncmFudWxhcml0eSBvZiAxNk1CLiAgR1JBIHJlZ3MgYXJlCisJICogY3VtdWxhdGl2ZTsgdGhlcmVmb3JlIEdSQTE1IHdpbGwgY29udGFpbiB0aGUgdG90YWwgbWVtb3J5IGNvbnRhaW5lZAorCSAqIGluIGFsbCBlaWdodCByb3dzLgorCSAqLworCWZvciAobGFzdF9jdW11bF9zaXplID0gaW5kZXggPSAwOyBpbmRleCA8IG1jaS0+bnJfY3Nyb3dzOyBpbmRleCsrKSB7CisJCXUxNiB2YWx1ZTsKKwkJdTMyIGN1bXVsX3NpemU7CisJCXN0cnVjdCBjc3Jvd19pbmZvICpjc3JvdyA9ICZtY2ktPmNzcm93c1tpbmRleF07CisKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQobWNpLT5wZGV2LCBJODI4NjBfR0JBICsgaW5kZXggKiAyLAorCQkJCSAgICAgJnZhbHVlKTsKKworCQljdW11bF9zaXplID0gKHZhbHVlICYgSTgyODYwX0dCQV9NQVNLKSA8PAorCQkgICAgKEk4Mjg2MF9HQkFfU0hJRlQgLSBQQUdFX1NISUZUKTsKKwkJZGVidWdmMygiTUM6ICIgX19GSUxFX18gIjogJXMoKTogKCVkKSBjdW11bF9zaXplIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgaW5kZXgsIGN1bXVsX3NpemUpOworCQlpZiAoY3VtdWxfc2l6ZSA9PSBsYXN0X2N1bXVsX3NpemUpCisJCQljb250aW51ZTsJLyogbm90IHBvcHVsYXRlZCAqLworCisJCWNzcm93LT5maXJzdF9wYWdlID0gbGFzdF9jdW11bF9zaXplOworCQljc3Jvdy0+bGFzdF9wYWdlID0gY3VtdWxfc2l6ZSAtIDE7CisJCWNzcm93LT5ucl9wYWdlcyA9IGN1bXVsX3NpemUgLSBsYXN0X2N1bXVsX3NpemU7CisJCWxhc3RfY3VtdWxfc2l6ZSA9IGN1bXVsX3NpemU7CisJCWNzcm93LT5ncmFpbiA9IDEgPDwgMTI7CS8qIEk4Mjg2MF9FQVAgaGFzIDRLaUIgcmVvbHV0aW9uICovCisJCWNzcm93LT5tdHlwZSA9IE1FTV9STUJTOworCQljc3Jvdy0+ZHR5cGUgPSBERVZfVU5LTk9XTjsKKwkJY3Nyb3ctPmVkYWNfbW9kZSA9IG1jaGNmZ19kZGltID8gRURBQ19TRUNERUQgOiBFREFDX05PTkU7CisJfQorCisJLyogY2xlYXIgY291bnRlcnMgKi8KKwlwY2lfd3JpdGVfYml0czE2KG1jaS0+cGRldiwgSTgyODYwX0VSUlNUUywgMHgwMDAzLCAweDAwMDMpOworCisJaWYgKGVkYWNfbWNfYWRkX21jKG1jaSkpIHsKKwkJZGVidWdmMygiTUM6ICIgX19GSUxFX18KKwkJCSI6ICVzKCk6IGZhaWxlZCBlZGFjX21jX2FkZF9tYygpXG4iLAorCQkJX19mdW5jX18pOworCQllZGFjX21jX2ZyZWUobWNpKTsKKwl9IGVsc2UgeworCQkvKiBnZXQgdGhpcyBmYXIgYW5kIGl0J3Mgc3VjY2Vzc2Z1bCAqLworCQlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpOiBzdWNjZXNzXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gMDsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKiByZXR1cm5zIGNvdW50ICg+PSAwKSwgb3IgbmVnYXRpdmUgb24gZXJyb3IgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGk4Mjg2MF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJaW50IHJjOworCisJZGVidWdmMCgiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCisJcHJpbnRrKEtFUk5fSU5GTyAiaTgyODYwIGluaXQgb25lXG4iKTsKKwlpZihwY2lfZW5hYmxlX2RldmljZShwZGV2KSA8IDApCisJCXJldHVybiAtRUlPOworCXJjID0gaTgyODYwX3Byb2JlMShwZGV2LCBlbnQtPmRyaXZlcl9kYXRhKTsKKwlpZihyYyA9PSAwKQorCQltY2lfcGRldiA9IHBjaV9kZXZfZ2V0KHBkZXYpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGk4Mjg2MF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaTsKKworCWRlYnVnZjAoX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCisJbWNpID0gZWRhY19tY19maW5kX21jaV9ieV9wZGV2KHBkZXYpOworCWlmICgobWNpICE9IE5VTEwpICYmIChlZGFjX21jX2RlbF9tYyhtY2kpID09IDApKQorCQllZGFjX21jX2ZyZWUobWNpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGk4Mjg2MF9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7UENJX1ZFTkRfREVWKElOVEVMLCA4Mjg2MF8wKSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgSTgyODYwfSwKKwl7MCx9CQkJLyogMCB0ZXJtaW5hdGVkIGxpc3QuICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaTgyODYwX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaTgyODYwX2RyaXZlciA9IHsKKwkubmFtZSA9IEJTX01PRF9TVFIsCisJLnByb2JlID0gaTgyODYwX2luaXRfb25lLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChpODI4NjBfcmVtb3ZlX29uZSksCisJLmlkX3RhYmxlID0gaTgyODYwX3BjaV90YmwsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpODI4NjBfaW5pdCh2b2lkKQoreworCWludCBwY2lfcmM7CisKKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisJaWYgKChwY2lfcmMgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpODI4NjBfZHJpdmVyKSkgPCAwKQorCQlyZXR1cm4gcGNpX3JjOworCisJaWYgKCFtY2lfcGRldikgeworCQlpODI4NjBfcmVnaXN0ZXJlZCA9IDA7CisJCW1jaV9wZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCQkJICBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODYwXzAsIE5VTEwpOworCQlpZiAobWNpX3BkZXYgPT0gTlVMTCkgeworCQkJZGVidWdmMCgiODYwIHBjaV9nZXRfZGV2aWNlIGZhaWxcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJcGNpX3JjID0gaTgyODYwX2luaXRfb25lKG1jaV9wZGV2LCBpODI4NjBfcGNpX3RibCk7CisJCWlmIChwY2lfcmMgPCAwKSB7CisJCQlkZWJ1Z2YwKCI4NjAgaW5pdCBmYWlsXG4iKTsKKwkJCXBjaV9kZXZfcHV0KG1jaV9wZGV2KTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaTgyODYwX2V4aXQodm9pZCkKK3sKKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmk4Mjg2MF9kcml2ZXIpOworCWlmICghaTgyODYwX3JlZ2lzdGVyZWQpIHsKKwkJaTgyODYwX3JlbW92ZV9vbmUobWNpX3BkZXYpOworCQlwY2lfZGV2X3B1dChtY2lfcGRldik7CisJfQorfQorCittb2R1bGVfaW5pdChpODI4NjBfaW5pdCk7Cittb2R1bGVfZXhpdChpODI4NjBfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IKKyAgICAoIlJlZCBIYXQgSW5jLiAoaHR0cDovL3d3dy5yZWRoYXQuY29tLmNvbSkgQmVuIFdvb2RhcmQgPHdvb2RhcmRAcmVkaGF0LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRUNDIHN1cHBvcnQgZm9yIEludGVsIDgyODYwIG1lbW9yeSBodWIgY29udHJvbGxlcnMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9pODI4NzVwX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9pODI4NzVwX2VkYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDljMDhmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9lZGFjL2k4Mjg3NXBfZWRhYy5jCkBAIC0wLDAgKzEsNTMyIEBACisvKgorICogSW50ZWwgRDgyODc1UCBNZW1vcnkgQ29udHJvbGxlciBrZXJuZWwgbW9kdWxlCisgKiAoQykgMjAwMyBMaW51eCBOZXR3b3J4IChodHRwOi8vbG54aS5jb20pCisgKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqIFdyaXR0ZW4gYnkgVGhheW5lIEhhcmJhdWdoCisgKiBDb250cmlidXRvcnM6CisgKglXYW5nIFpoZW55dSBhdCBpbnRlbC5jb20KKyAqCisgKiAkSWQ6IGVkYWNfaTgyODc1cC5jLHYgMS41LjIuMTEgMjAwNS8xMC8wNSAwMDo0Mzo0NCBkc3BfbGxubCBFeHAgJAorICoKKyAqIE5vdGU6IEU3MjEwIGFwcGVhcnMgc2FtZSBhcyBEODI4NzVQIC0gemhlbnl1Lnoud2FuZyBhdCBpbnRlbC5jb20KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJlZGFjX21jLmgiCisKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODc1XzAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84Mjg3NV8wCTB4MjU3OAorI2VuZGlmCQkJCS8qIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NzVfMCAqLworCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NzVfNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODc1XzYJMHgyNTdlCisjZW5kaWYJCQkJLyogUENJX0RFVklDRV9JRF9JTlRFTF84Mjg3NV82ICovCisKKworLyogZm91ciBjc3Jvd3MgaW4gZHVhbCBjaGFubmVsLCBlaWdodCBpbiBzaW5nbGUgY2hhbm5lbCAqLworI2RlZmluZSBJODI4NzVQX05SX0NTUk9XUyhucl9jaGFucykgKDgvKG5yX2NoYW5zKSkKKworCisvKiBJbnRlbCA4Mjg3NXAgcmVnaXN0ZXIgYWRkcmVzc2VzIC0gZGV2aWNlIDAgZnVuY3Rpb24gMCAtIERSQU0gQ29udHJvbGxlciAqLworI2RlZmluZSBJODI4NzVQX0VBUAkJMHg1OAkvKiBFcnJvciBBZGRyZXNzIFBvaW50ZXIgKDMyYikKKwkJCQkJICoKKwkJCQkJICogMzE6MTIgYmxvY2sgYWRkcmVzcworCQkJCQkgKiAxMTowICByZXNlcnZlZAorCQkJCQkgKi8KKworI2RlZmluZSBJODI4NzVQX0RFUlJTWU4JCTB4NWMJLyogRFJBTSBFcnJvciBTeW5kcm9tZSAoOGIpCisJCQkJCSAqCisJCQkJCSAqICA3OjAgIERSQU0gRUNDIFN5bmRyb21lCisJCQkJCSAqLworCisjZGVmaW5lIEk4Mjg3NVBfREVTCQkweDVkCS8qIERSQU0gRXJyb3IgU3RhdHVzICg4YikKKwkJCQkJICoKKwkJCQkJICogIDc6MSAgcmVzZXJ2ZWQKKwkJCQkJICogIDAgICAgRXJyb3IgY2hhbm5lbCAwLzEKKwkJCQkJICovCisKKyNkZWZpbmUgSTgyODc1UF9FUlJTVFMJCTB4YzgJLyogRXJyb3IgU3RhdHVzIFJlZ2lzdGVyICgxNmIpCisJCQkJCSAqCisJCQkJCSAqIDE1OjEwIHJlc2VydmVkCisJCQkJCSAqICA5ICAgIG5vbi1EUkFNIGxvY2sgZXJyb3IgKG5kbG9jaykKKwkJCQkJICogIDggICAgU2Z0d3IgR2VuZXJhdGVkIFNNSQorCQkJCQkgKiAgNyAgICBFQ0MgVUUKKwkJCQkJICogIDYgICAgcmVzZXJ2ZWQKKwkJCQkJICogIDUgICAgTUNIIGRldGVjdHMgdW5pbXBsZW1lbnRlZCBjeWNsZQorCQkJCQkgKiAgNCAgICBBR1AgYWNjZXNzIG91dHNpZGUgR0EKKwkJCQkJICogIDMgICAgSW52YWxpZCBBR1AgYWNjZXNzCisJCQkJCSAqICAyICAgIEludmFsaWQgR0EgdHJhbnNsYXRpb24gdGFibGUKKwkJCQkJICogIDEgICAgVW5zdXBwb3J0ZWQgQUdQIGNvbW1hbmQKKwkJCQkJICogIDAgICAgRUNDIENFCisJCQkJCSAqLworCisjZGVmaW5lIEk4Mjg3NVBfRVJSQ01ECQkweGNhCS8qIEVycm9yIENvbW1hbmQgKDE2YikKKwkJCQkJICoKKwkJCQkJICogMTU6MTAgcmVzZXJ2ZWQKKwkJCQkJICogIDkgICAgU0VSUiBvbiBub24tRFJBTSBsb2NrCisJCQkJCSAqICA4ICAgIFNFUlIgb24gRUNDIFVFCisJCQkJCSAqICA3ICAgIFNFUlIgb24gRUNDIENFCisJCQkJCSAqICA2ICAgIHRhcmdldCBhYm9ydCBvbiBoaWdoIGV4Y2VwdGlvbgorCQkJCQkgKiAgNSAgICBkZXRlY3QgdW5pbXBsZW1lbnRlZCBjeWMKKwkJCQkJICogIDQgICAgQUdQIGFjY2VzcyBvdXRzaWRlIG9mIEdBCisJCQkJCSAqICAzICAgIFNFUlIgb24gaW52YWxpZCBBR1AgYWNjZXNzCisJCQkJCSAqICAyICAgIGludmFsaWQgdHJhbnNsYXRpb24gdGFibGUKKwkJCQkJICogIDEgICAgU0VSUiBvbiB1bnN1cHBvcnRlZCBBR1AgY29tbWFuZAorCQkJCQkgKiAgMCAgICByZXNlcnZlZAorCQkJCQkgKi8KKworCisvKiBJbnRlbCA4Mjg3NXAgcmVnaXN0ZXIgYWRkcmVzc2VzIC0gZGV2aWNlIDYgZnVuY3Rpb24gMCAtIERSQU0gQ29udHJvbGxlciAqLworI2RlZmluZSBJODI4NzVQX1BDSUNNRDYJCTB4MDQJLyogUENJIENvbW1hbmQgUmVnaXN0ZXIgKDE2YikKKwkJCQkJICoKKwkJCQkJICogMTU6MTAgcmVzZXJ2ZWQKKwkJCQkJICogIDkgICAgZmFzdCBiYWNrLXRvLWJhY2sgLSBybyAwCisJCQkJCSAqICA4ICAgIFNFUlIgZW5hYmxlIC0gcm8gMAorCQkJCQkgKiAgNyAgICBhZGRyL2RhdGEgc3RlcHBpbmcgLSBybyAwCisJCQkJCSAqICA2ICAgIHBhcml0eSBlcnIgZW5hYmxlIC0gcm8gMAorCQkJCQkgKiAgNSAgICBWR0EgcGFsZXR0ZSBzbm9vcCAtIHJvIDAKKwkJCQkJICogIDQgICAgbWVtIHdyICYgaW52YWxpZGF0ZSAtIHJvIDAKKwkJCQkJICogIDMgICAgc3BlY2lhbCBjeWNsZSAtIHJvIDAKKwkJCQkJICogIDIgICAgYnVzIG1hc3RlciAtIHJvIDAKKwkJCQkJICogIDEgICAgbWVtIGFjY2VzcyBkZXY2IC0gMChkaXMpLDEoZW4pCisJCQkJCSAqICAwICAgIElPIGFjY2VzcyBkZXYzIC0gMChkaXMpLDEoZW4pCisJCQkJCSAqLworCisjZGVmaW5lIEk4Mjg3NVBfQkFSNgkJMHgxMAkvKiBNZW0gRGVsYXlzIEJhc2UgQUREUiBSZWcgKDMyYikKKwkJCQkJICoKKwkJCQkJICogMzE6MTIgbWVtIGJhc2UgYWRkciBbMzE6MTJdCisJCQkJCSAqIDExOjQgIGFkZHJlc3MgbWFzayAtIHJvIDAKKwkJCQkJICogIDMgICAgcHJlZmV0Y2hhYmxlIC0gcm8gMChub24pLDEocHJlKQorCQkJCQkgKiAgMjoxICBtZW0gdHlwZSAtIHJvIDAKKwkJCQkJICogIDAgICAgbWVtIHNwYWNlIC0gcm8gMAorCQkJCQkgKi8KKworLyogSW50ZWwgODI4NzVwIE1NSU8gcmVnaXN0ZXIgc3BhY2UgLSBkZXZpY2UgMCBmdW5jdGlvbiAwIC0gTU1SIHNwYWNlICovCisKKyNkZWZpbmUgSTgyODc1UF9EUkJfU0hJRlQgMjYJLyogNjRNaUIgZ3JhaW4gKi8KKyNkZWZpbmUgSTgyODc1UF9EUkIJCTB4MDAJLyogRFJBTSBSb3cgQm91bmRhcnkgKDhiIHggOCkKKwkJCQkJICoKKwkJCQkJICogIDcgICAgcmVzZXJ2ZWQKKwkJCQkJICogIDY6MCAgNjRNaUIgcm93IGJvdW5kYXJ5IGFkZHIKKwkJCQkJICovCisKKyNkZWZpbmUgSTgyODc1UF9EUkEJCTB4MTAJLyogRFJBTSBSb3cgQXR0cmlidXRlICg0YiB4IDgpCisJCQkJCSAqCisJCQkJCSAqICA3ICAgIHJlc2VydmVkCisJCQkJCSAqICA2OjQgIHJvdyBhdHRyIHJvdyAxCisJCQkJCSAqICAzICAgIHJlc2VydmVkCisJCQkJCSAqICAyOjAgIHJvdyBhdHRyIHJvdyAwCisJCQkJCSAqCisJCQkJCSAqIDAwMCA9ICA0S2lCCisJCQkJCSAqIDAwMSA9ICA4S2lCCisJCQkJCSAqIDAxMCA9IDE2S2lCCisJCQkJCSAqIDAxMSA9IDMyS2lCCisJCQkJCSAqLworCisjZGVmaW5lIEk4Mjg3NVBfRFJDCQkweDY4CS8qIERSQU0gQ29udHJvbGxlciBNb2RlICgzMmIpCisJCQkJCSAqCisJCQkJCSAqIDMxOjMwIHJlc2VydmVkCisJCQkJCSAqIDI5ICAgIGluaXQgY29tcGxldGUKKwkJCQkJICogMjg6MjMgcmVzZXJ2ZWQKKwkJCQkJICogMjI6MjEgbnIgY2hhbiAwMD0xLDAxPTIKKwkJCQkJICogMjAgICAgcmVzZXJ2ZWQKKwkJCQkJICogMTk6MTggRGF0YSBJbnRlZyBNb2RlIDAwPW5vbmUsMDE9ZWNjCisJCQkJCSAqIDE3OjExIHJlc2VydmVkCisJCQkJCSAqIDEwOjggIHJlZnJlc2ggbW9kZQorCQkJCQkgKiAgNyAgICByZXNlcnZlZAorCQkJCQkgKiAgNjo0ICBtb2RlIHNlbGVjdAorCQkJCQkgKiAgMzoyICByZXNlcnZlZAorCQkJCQkgKiAgMTowICBEUkFNIHR5cGUgMDE9RERSCisJCQkJCSAqLworCisKK2VudW0gaTgyODc1cF9jaGlwcyB7CisJSTgyODc1UCA9IDAsCit9OworCisKK3N0cnVjdCBpODI4NzVwX3B2dCB7CisJc3RydWN0IHBjaV9kZXYgKm92cmZsX3BkZXY7CisJdm9pZCAqb3ZyZmxfd2luZG93OworfTsKKworCitzdHJ1Y3QgaTgyODc1cF9kZXZfaW5mbyB7CisJY29uc3QgY2hhciAqY3RsX25hbWU7Cit9OworCisKK3N0cnVjdCBpODI4NzVwX2Vycm9yX2luZm8geworCXUxNiBlcnJzdHM7CisJdTMyIGVhcDsKKwl1OCBkZXM7CisJdTggZGVycnN5bjsKKwl1MTYgZXJyc3RzMjsKK307CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpODI4NzVwX2Rldl9pbmZvIGk4Mjg3NXBfZGV2c1tdID0geworCVtJODI4NzVQXSA9IHsKKwkJICAgICAuY3RsX25hbWUgPSAiaTgyODc1cCJ9LAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2ICptY2lfcGRldiA9IE5VTEw7CS8qIGluaXQgZGV2OiBpbiBjYXNlIHRoYXQgQUdQIGNvZGUKKwkJCQkJICAgaGFzIGFscmVhZHkgcmVnaXN0ZXJlZCBkcml2ZXIgKi8KK3N0YXRpYyBpbnQgaTgyODc1cF9yZWdpc3RlcmVkID0gMTsKKworc3RhdGljIHZvaWQgaTgyODc1cF9nZXRfZXJyb3JfaW5mbyAoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQlzdHJ1Y3QgaTgyODc1cF9lcnJvcl9pbmZvICppbmZvKQoreworCS8qCisJICogVGhpcyBpcyBhIG1lc3MgYmVjYXVzZSB0aGVyZSBpcyBubyBhdG9taWMgd2F5IHRvIHJlYWQgYWxsIHRoZQorCSAqIHJlZ2lzdGVycyBhdCBvbmNlIGFuZCB0aGUgcmVnaXN0ZXJzIGNhbiB0cmFuc2l0aW9uIGZyb20gQ0UgYmVpbmcKKwkgKiBvdmVyd3JpdHRlbiBieSBVRS4KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChtY2ktPnBkZXYsIEk4Mjg3NVBfRVJSU1RTLCAmaW5mby0+ZXJyc3RzKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQobWNpLT5wZGV2LCBJODI4NzVQX0VBUCwgJmluZm8tPmVhcCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUobWNpLT5wZGV2LCBJODI4NzVQX0RFUywgJmluZm8tPmRlcyk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUobWNpLT5wZGV2LCBJODI4NzVQX0RFUlJTWU4sICZpbmZvLT5kZXJyc3luKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChtY2ktPnBkZXYsIEk4Mjg3NVBfRVJSU1RTLCAmaW5mby0+ZXJyc3RzMik7CisKKwlwY2lfd3JpdGVfYml0czE2KG1jaS0+cGRldiwgSTgyODc1UF9FUlJTVFMsIDB4MDA4MSwgMHgwMDgxKTsKKworCS8qCisJICogSWYgdGhlIGVycm9yIGlzIHRoZSBzYW1lIHRoZW4gd2UgY2FuIGZvciBib3RoIHJlYWRzIHRoZW4KKwkgKiB0aGUgZmlyc3Qgc2V0IG9mIHJlYWRzIGlzIHZhbGlkLiAgSWYgdGhlcmUgaXMgYSBjaGFuZ2UgdGhlbgorCSAqIHRoZXJlIGlzIGEgQ0Ugbm8gaW5mbyBhbmQgdGhlIHNlY29uZCBzZXQgb2YgcmVhZHMgaXMgdmFsaWQKKwkgKiBhbmQgc2hvdWxkIGJlIFVFIGluZm8uCisJICovCisJaWYgKCEoaW5mby0+ZXJyc3RzMiAmIDB4MDA4MSkpCisJCXJldHVybjsKKwlpZiAoKGluZm8tPmVycnN0cyBeIGluZm8tPmVycnN0czIpICYgMHgwMDgxKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChtY2ktPnBkZXYsIEk4Mjg3NVBfRUFQLCAmaW5mby0+ZWFwKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUobWNpLT5wZGV2LCBJODI4NzVQX0RFUywgJmluZm8tPmRlcyk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKG1jaS0+cGRldiwgSTgyODc1UF9ERVJSU1lOLAorCQkgICAgJmluZm8tPmRlcnJzeW4pOworCX0KK30KKworc3RhdGljIGludCBpODI4NzVwX3Byb2Nlc3NfZXJyb3JfaW5mbyAoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQlzdHJ1Y3QgaTgyODc1cF9lcnJvcl9pbmZvICppbmZvLCBpbnQgaGFuZGxlX2Vycm9ycykKK3sKKwlpbnQgcm93LCBtdWx0aV9jaGFuOworCisJbXVsdGlfY2hhbiA9IG1jaS0+Y3Nyb3dzWzBdLm5yX2NoYW5uZWxzIC0gMTsKKworCWlmICghKGluZm8tPmVycnN0czIgJiAweDAwODEpKQorCQlyZXR1cm4gMDsKKworCWlmICghaGFuZGxlX2Vycm9ycykKKwkJcmV0dXJuIDE7CisKKwlpZiAoKGluZm8tPmVycnN0cyBeIGluZm8tPmVycnN0czIpICYgMHgwMDgxKSB7CisJCWVkYWNfbWNfaGFuZGxlX2NlX25vX2luZm8obWNpLCAiVUUgb3Zlcndyb3RlIENFIik7CisJCWluZm8tPmVycnN0cyA9IGluZm8tPmVycnN0czI7CisJfQorCisJaW5mby0+ZWFwID4+PSBQQUdFX1NISUZUOworCXJvdyA9IGVkYWNfbWNfZmluZF9jc3Jvd19ieV9wYWdlKG1jaSwgaW5mby0+ZWFwKTsKKworCWlmIChpbmZvLT5lcnJzdHMgJiAweDAwODApCisJCWVkYWNfbWNfaGFuZGxlX3VlKG1jaSwgaW5mby0+ZWFwLCAwLCByb3csICJpODI4NzVwIFVFIik7CisJZWxzZQorCQllZGFjX21jX2hhbmRsZV9jZShtY2ksIGluZm8tPmVhcCwgMCwgaW5mby0+ZGVycnN5biwgcm93LAorCQkJCSAgICAgICBtdWx0aV9jaGFuID8gKGluZm8tPmRlcyAmIDB4MSkgOiAwLAorCQkJCSAgICAgICAiaTgyODc1cCBDRSIpOworCisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHZvaWQgaTgyODc1cF9jaGVjayhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJc3RydWN0IGk4Mjg3NXBfZXJyb3JfaW5mbyBpbmZvOworCisJZGVidWdmMSgiTUMlZDogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBtY2ktPm1jX2lkeCwgX19mdW5jX18pOworCWk4Mjg3NXBfZ2V0X2Vycm9yX2luZm8obWNpLCAmaW5mbyk7CisJaTgyODc1cF9wcm9jZXNzX2Vycm9yX2luZm8obWNpLCAmaW5mbywgMSk7Cit9CisKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitleHRlcm4gaW50IHBjaV9wcm9jX2F0dGFjaF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKik7CisjZW5kaWYKKworc3RhdGljIGludCBpODI4NzVwX3Byb2JlMShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGRldl9pZHgpCit7CisJaW50IHJjID0gLUVOT0RFVjsKKwlpbnQgaW5kZXg7CisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpID0gTlVMTDsKKwlzdHJ1Y3QgaTgyODc1cF9wdnQgKnB2dCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBsYXN0X2N1bXVsX3NpemU7CisJc3RydWN0IHBjaV9kZXYgKm92cmZsX3BkZXY7CisJdm9pZCBfX2lvbWVtICpvdnJmbF93aW5kb3cgPSBOVUxMOworCisJdTMyIGRyYzsKKwl1MzIgZHJjX2NoYW47CQkvKiBOdW1iZXIgb2YgY2hhbm5lbHMgMD0xY2hhbiwxPTJjaGFuICovCisJdTMyIG5yX2NoYW5zOworCXUzMiBkcmNfZGRpbTsJCS8qIERSQU0gRGF0YSBJbnRlZ3JpdHkgTW9kZSAwPW5vbmUsMj1lZGFjICovCisKKwlkZWJ1Z2YwKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlvdnJmbF9wZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5EX0RFVihJTlRFTCwgODI4NzVfNiksIE5VTEwpOworCisJaWYgKCFvdnJmbF9wZGV2KSB7CisJCS8qCisJCSAqIEludGVsIHRlbGxzIEJJT1MgZGV2ZWxvcGVycyB0byBoaWRlIGRldmljZSA2IHdoaWNoCisJCSAqIGNvbmZpZ3VyZXMgdGhlIG92ZXJmbG93IGRldmljZSBhY2Nlc3MgY29udGFpbmluZworCQkgKiB0aGUgRFJCcyAtIHRoaXMgaXMgd2hlcmUgd2UgZXhwb3NlIGRldmljZSA2LgorCQkgKiBodHRwOi8vd3d3Lng4Ni1zZWNyZXQuY29tL2FydGljbGVzL3R3ZWFrL3BhdC9wYXRzZWNyZXRzLTIuaHRtCisJCSAqLworCQlwY2lfd3JpdGVfYml0czgocGRldiwgMHhmNCwgMHgyLCAweDIpOworCQlvdnJmbF9wZGV2ID0KKwkJICAgIHBjaV9zY2FuX3NpbmdsZV9kZXZpY2UocGRldi0+YnVzLCBQQ0lfREVWRk4oNiwgMCkpOworCQlpZiAoIW92cmZsX3BkZXYpCisJCQlnb3RvIGZhaWw7CisJfQorI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJaWYgKCFvdnJmbF9wZGV2LT5wcm9jZW50ICYmIHBjaV9wcm9jX2F0dGFjaF9kZXZpY2Uob3ZyZmxfcGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNQzogIiBfX0ZJTEVfXworCQkgICAgICAgIjogJXMoKTogRmFpbGVkIHRvIGF0dGFjaCBvdmVyZmxvdyBkZXZpY2VcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbDsKKwl9CisjZW5kaWYJCQkJLyogQ09ORklHX1BST0NfRlMgKi8KKwlpZiAocGNpX2VuYWJsZV9kZXZpY2Uob3ZyZmxfcGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNQzogIiBfX0ZJTEVfXworCQkgICAgICAgIjogJXMoKTogRmFpbGVkIHRvIGVuYWJsZSBvdmVyZmxvdyBkZXZpY2VcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhvdnJmbF9wZGV2LCBwY2lfbmFtZShvdnJmbF9wZGV2KSkpIHsKKyNpZmRlZiBDT1JSRUNUX0JJT1MKKwkJZ290byBmYWlsOworI2VuZGlmCisJfQorCS8qIGNhY2hlIGlzIGlycmVsZXZhbnQgZm9yIFBDSSBidXMgcmVhZHMvd3JpdGVzICovCisJb3ZyZmxfd2luZG93ID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9yZXNvdXJjZV9zdGFydChvdnJmbF9wZGV2LCAwKSwKKwkJCQkgICAgICAgcGNpX3Jlc291cmNlX2xlbihvdnJmbF9wZGV2LCAwKSk7CisKKwlpZiAoIW92cmZsX3dpbmRvdykgeworCQlwcmludGsoS0VSTl9FUlIgIk1DOiAiIF9fRklMRV9fCisJCSAgICAgICAiOiAlcygpOiBGYWlsZWQgdG8gaW9yZW1hcCBiYXI2XG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBuZWVkIHRvIGZpbmQgb3V0IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKwlkcmMgPSByZWFkbChvdnJmbF93aW5kb3cgKyBJODI4NzVQX0RSQyk7CisJZHJjX2NoYW4gPSAoKGRyYyA+PiAyMSkgJiAweDEpOworCW5yX2NoYW5zID0gZHJjX2NoYW4gKyAxOworCWRyY19kZGltID0gKGRyYyA+PiAxOCkgJiAweDE7CisKKwltY2kgPSBlZGFjX21jX2FsbG9jKHNpemVvZigqcHZ0KSwgSTgyODc1UF9OUl9DU1JPV1MobnJfY2hhbnMpLAorCQkJCSBucl9jaGFucyk7CisKKwlpZiAoIW1jaSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisKKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpOiBpbml0IG1jaVxuIiwgX19mdW5jX18pOworCisJbWNpLT5wZGV2ID0gcGRldjsKKwltY2ktPm10eXBlX2NhcCA9IE1FTV9GTEFHX0REUjsKKworCW1jaS0+ZWRhY19jdGxfY2FwID0gRURBQ19GTEFHX05PTkUgfCBFREFDX0ZMQUdfU0VDREVEOworCW1jaS0+ZWRhY19jYXAgPSBFREFDX0ZMQUdfVU5LTk9XTjsKKwkvKiBhZGp1c3QgRkxBR1MgKi8KKworCW1jaS0+bW9kX25hbWUgPSBCU19NT0RfU1RSOworCW1jaS0+bW9kX3ZlciA9ICIkUmV2aXNpb246IDEuNS4yLjExICQiOworCW1jaS0+Y3RsX25hbWUgPSBpODI4NzVwX2RldnNbZGV2X2lkeF0uY3RsX25hbWU7CisJbWNpLT5lZGFjX2NoZWNrID0gaTgyODc1cF9jaGVjazsKKwltY2ktPmN0bF9wYWdlX3RvX3BoeXMgPSBOVUxMOworCisJZGVidWdmMygiTUM6ICIgX19GSUxFX18gIjogJXMoKTogaW5pdCBwdnRcbiIsIF9fZnVuY19fKTsKKworCXB2dCA9IChzdHJ1Y3QgaTgyODc1cF9wdnQgKikgbWNpLT5wdnRfaW5mbzsKKwlwdnQtPm92cmZsX3BkZXYgPSBvdnJmbF9wZGV2OworCXB2dC0+b3ZyZmxfd2luZG93ID0gb3ZyZmxfd2luZG93OworCisJLyoKKwkgKiBUaGUgZHJhbSByb3cgYm91bmRhcnkgKERSQikgcmVnIHZhbHVlcyBhcmUgYm91bmRhcnkgYWRkcmVzcworCSAqIGZvciBlYWNoIERSQU0gcm93IHdpdGggYSBncmFudWxhcml0eSBvZiAzMiBvciA2NE1CIChzaW5nbGUvZHVhbAorCSAqIGNoYW5uZWwgb3BlcmF0aW9uKS4gIERSQiByZWdzIGFyZSBjdW11bGF0aXZlOyB0aGVyZWZvcmUgRFJCNyB3aWxsCisJICogY29udGFpbiB0aGUgdG90YWwgbWVtb3J5IGNvbnRhaW5lZCBpbiBhbGwgZWlnaHQgcm93cy4KKwkgKi8KKwlmb3IgKGxhc3RfY3VtdWxfc2l6ZSA9IGluZGV4ID0gMDsgaW5kZXggPCBtY2ktPm5yX2Nzcm93czsgaW5kZXgrKykgeworCQl1OCB2YWx1ZTsKKwkJdTMyIGN1bXVsX3NpemU7CisJCXN0cnVjdCBjc3Jvd19pbmZvICpjc3JvdyA9ICZtY2ktPmNzcm93c1tpbmRleF07CisKKwkJdmFsdWUgPSByZWFkYihvdnJmbF93aW5kb3cgKyBJODI4NzVQX0RSQiArIGluZGV4KTsKKwkJY3VtdWxfc2l6ZSA9IHZhbHVlIDw8IChJODI4NzVQX0RSQl9TSElGVCAtIFBBR0VfU0hJRlQpOworCQlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpOiAoJWQpIGN1bXVsX3NpemUgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBpbmRleCwgY3VtdWxfc2l6ZSk7CisJCWlmIChjdW11bF9zaXplID09IGxhc3RfY3VtdWxfc2l6ZSkKKwkJCWNvbnRpbnVlOwkvKiBub3QgcG9wdWxhdGVkICovCisKKwkJY3Nyb3ctPmZpcnN0X3BhZ2UgPSBsYXN0X2N1bXVsX3NpemU7CisJCWNzcm93LT5sYXN0X3BhZ2UgPSBjdW11bF9zaXplIC0gMTsKKwkJY3Nyb3ctPm5yX3BhZ2VzID0gY3VtdWxfc2l6ZSAtIGxhc3RfY3VtdWxfc2l6ZTsKKwkJbGFzdF9jdW11bF9zaXplID0gY3VtdWxfc2l6ZTsKKwkJY3Nyb3ctPmdyYWluID0gMSA8PCAxMjsJLyogSTgyODc1UF9FQVAgaGFzIDRLaUIgcmVvbHV0aW9uICovCisJCWNzcm93LT5tdHlwZSA9IE1FTV9ERFI7CisJCWNzcm93LT5kdHlwZSA9IERFVl9VTktOT1dOOworCQljc3Jvdy0+ZWRhY19tb2RlID0gZHJjX2RkaW0gPyBFREFDX1NFQ0RFRCA6IEVEQUNfTk9ORTsKKwl9CisKKwkvKiBjbGVhciBjb3VudGVycyAqLworCXBjaV93cml0ZV9iaXRzMTYobWNpLT5wZGV2LCBJODI4NzVQX0VSUlNUUywgMHgwMDgxLCAweDAwODEpOworCisJaWYgKGVkYWNfbWNfYWRkX21jKG1jaSkpIHsKKwkJZGVidWdmMygiTUM6ICIgX19GSUxFX18KKwkJCSI6ICVzKCk6IGZhaWxlZCBlZGFjX21jX2FkZF9tYygpXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBnZXQgdGhpcyBmYXIgYW5kIGl0J3Mgc3VjY2Vzc2Z1bCAqLworCWRlYnVnZjMoIk1DOiAiIF9fRklMRV9fICI6ICVzKCk6IHN1Y2Nlc3NcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKKworICAgICAgZmFpbDoKKwlpZiAobWNpKQorCQllZGFjX21jX2ZyZWUobWNpKTsKKworCWlmIChvdnJmbF93aW5kb3cpCisJCWlvdW5tYXAob3ZyZmxfd2luZG93KTsKKworCWlmIChvdnJmbF9wZGV2KSB7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMob3ZyZmxfcGRldik7CisJCXBjaV9kaXNhYmxlX2RldmljZShvdnJmbF9wZGV2KTsKKwl9CisKKwkvKiBOT1RFOiB0aGUgb3ZyZmwgcHJvYyBlbnRyeSBhbmQgcGNpX2RldiBhcmUgaW50ZW50aW9uYWxseSBsZWZ0ICovCisJcmV0dXJuIHJjOworfQorCisKKy8qIHJldHVybnMgY291bnQgKD49IDApLCBvciBuZWdhdGl2ZSBvbiBlcnJvciAqLworc3RhdGljIGludCBfX2RldmluaXQgaTgyODc1cF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWludCByYzsKKworCWRlYnVnZjAoIk1DOiAiIF9fRklMRV9fICI6ICVzKClcbiIsIF9fZnVuY19fKTsKKworCXByaW50ayhLRVJOX0lORk8gImk4Mjg3NXAgaW5pdCBvbmVcbiIpOworCWlmKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisJcmMgPSBpODI4NzVwX3Byb2JlMShwZGV2LCBlbnQtPmRyaXZlcl9kYXRhKTsKKwlpZiAobWNpX3BkZXYgPT0gTlVMTCkKKwkJbWNpX3BkZXYgPSBwY2lfZGV2X2dldChwZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IGk4Mjg3NXBfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2k7CisJc3RydWN0IGk4Mjg3NXBfcHZ0ICpwdnQgPSBOVUxMOworCisJZGVidWdmMChfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoKG1jaSA9IGVkYWNfbWNfZmluZF9tY2lfYnlfcGRldihwZGV2KSkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJcHZ0ID0gKHN0cnVjdCBpODI4NzVwX3B2dCAqKSBtY2ktPnB2dF9pbmZvOworCWlmIChwdnQtPm92cmZsX3dpbmRvdykKKwkJaW91bm1hcChwdnQtPm92cmZsX3dpbmRvdyk7CisKKwlpZiAocHZ0LT5vdnJmbF9wZGV2KSB7CisjaWZkZWYgQ09SUkVDVF9CSU9TCisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocHZ0LT5vdnJmbF9wZGV2KTsKKyNlbmRpZgkJCQkvKkNPUlJFQ1RfQklPUyAqLworCQlwY2lfZGlzYWJsZV9kZXZpY2UocHZ0LT5vdnJmbF9wZGV2KTsKKwkJcGNpX2Rldl9wdXQocHZ0LT5vdnJmbF9wZGV2KTsKKwl9CisKKwlpZiAoZWRhY19tY19kZWxfbWMobWNpKSkKKwkJcmV0dXJuOworCisJZWRhY19tY19mcmVlKG1jaSk7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGk4Mjg3NXBfcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJe1BDSV9WRU5EX0RFVihJTlRFTCwgODI4NzVfMCksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJIEk4Mjg3NVB9LAorCXswLH0JCQkvKiAwIHRlcm1pbmF0ZWQgbGlzdC4gKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpODI4NzVwX3BjaV90YmwpOworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpODI4NzVwX2RyaXZlciA9IHsKKwkubmFtZSA9IEJTX01PRF9TVFIsCisJLnByb2JlID0gaTgyODc1cF9pbml0X29uZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoaTgyODc1cF9yZW1vdmVfb25lKSwKKwkuaWRfdGFibGUgPSBpODI4NzVwX3BjaV90YmwsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGk4Mjg3NXBfaW5pdCh2b2lkKQoreworCWludCBwY2lfcmM7CisKKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisJcGNpX3JjID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaTgyODc1cF9kcml2ZXIpOworCWlmIChwY2lfcmMgPCAwKQorCQlyZXR1cm4gcGNpX3JjOworCWlmIChtY2lfcGRldiA9PSBOVUxMKSB7CisJCWk4Mjg3NXBfcmVnaXN0ZXJlZCA9IDA7CisJCW1jaV9wZGV2ID0KKwkJICAgIHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCisJCQkJICAgUENJX0RFVklDRV9JRF9JTlRFTF84Mjg3NV8wLCBOVUxMKTsKKwkJaWYgKCFtY2lfcGRldikgeworCQkJZGVidWdmMCgiODc1cCBwY2lfZ2V0X2RldmljZSBmYWlsXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCXBjaV9yYyA9IGk4Mjg3NXBfaW5pdF9vbmUobWNpX3BkZXYsIGk4Mjg3NXBfcGNpX3RibCk7CisJCWlmIChwY2lfcmMgPCAwKSB7CisJCQlkZWJ1Z2YwKCI4NzVwIGluaXQgZmFpbFxuIik7CisJCQlwY2lfZGV2X3B1dChtY2lfcGRldik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgaTgyODc1cF9leGl0KHZvaWQpCit7CisJZGVidWdmMygiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpODI4NzVwX2RyaXZlcik7CisJaWYgKCFpODI4NzVwX3JlZ2lzdGVyZWQpIHsKKwkJaTgyODc1cF9yZW1vdmVfb25lKG1jaV9wZGV2KTsKKwkJcGNpX2Rldl9wdXQobWNpX3BkZXYpOworCX0KK30KKworCittb2R1bGVfaW5pdChpODI4NzVwX2luaXQpOworbW9kdWxlX2V4aXQoaTgyODc1cF9leGl0KTsKKworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJMaW51eCBOZXR3b3J4IChodHRwOi8vbG54aS5jb20pIFRoYXluZSBIYXJiYXVnaCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNQyBzdXBwb3J0IGZvciBJbnRlbCA4Mjg3NSBtZW1vcnkgaHViIGNvbnRyb2xsZXJzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvcjgyNjAwX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9yODI2MDBfZWRhYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MDg5MjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2VkYWMvcjgyNjAwX2VkYWMuYwpAQCAtMCwwICsxLDQwNyBAQAorLyoKKyAqIFJhZGlzeXMgODI2MDAgRW1iZWRkZWQgY2hpcHNldCBNZW1vcnkgQ29udHJvbGxlciBrZXJuZWwgbW9kdWxlCisgKiAoQykgMjAwNSBFQURTIEFzdHJpdW0KKyAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogV3JpdHRlbiBieSBUaW0gU21hbGwgPHRpbUBidXR0ZXJzaWRldXAuY29tPiwgYmFzZWQgb24gd29yayBieSBUaGF5bmUKKyAqIEhhcmJhdWdoLCBEYW4gSG9sbGlzIDxnb2Vtb24gYXQgYW5pbWUgZG90IG5ldD4gYW5kIG90aGVycy4KKyAqCisgKiAkSWQ6IGVkYWNfcjgyNjAwLmMsdiAxLjEuMi42IDIwMDUvMTAvMDUgMDA6NDM6NDQgZHNwX2xsbmwgRXhwICQKKyAqCisgKiBXcml0dGVuIHdpdGggcmVmZXJlbmNlIHRvIDgyNjAwIEhpZ2ggSW50ZWdyYXRpb24gRHVhbCBQQ0kgU3lzdGVtCisgKiBDb250cm9sbGVyIERhdGEgQm9vazoKKyAqIGh0dHA6Ly93d3cucmFkaXN5cy5jb20vZmlsZXMvc3VwcG9ydF9kb3dubG9hZHMvMDA3LTAxMjc3LTAwMDIuODI2MDBEYXRhQm9vay5wZGYKKyAqIHJlZmVyZW5jZXMgdG8gdGhpcyBkb2N1bWVudCBnaXZlbiBpbiBbXQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJlZGFjX21jLmgiCisKKy8qIFJhZGlzeXMgc2F5ICJUaGUgODI2MDAgaW50ZWdyYXRlcyBhIG1haW4gbWVtb3J5IFNEUkFNIGNvbnRyb2xsZXIgdGhhdAorICogc3VwcG9ydHMgdXAgdG8gZm91ciBiYW5rcyBvZiBtZW1vcnkuIFRoZSBmb3VyIGJhbmtzIGNhbiBzdXBwb3J0IGEgbWl4IG9mCisgKiBzaXplcyBvZiA2NCBiaXQgd2lkZSAoNzIgYml0cyB3aXRoIEVDQykgU3luY2hyb25vdXMgRFJBTSAoU0RSQU0pIERJTU1zLAorICogZWFjaCBvZiB3aGljaCBjYW4gYmUgYW55IHNpemUgZnJvbSAxNk1CIHRvIDUxMk1CLiBCb3RoIHJlZ2lzdGVyZWQgKGNvbnRyb2wKKyAqIHNpZ25hbHMgYnVmZmVyZWQpIGFuZCB1bmJ1ZmZlcmVkIERJTU0gdHlwZXMgYXJlIHN1cHBvcnRlZC4gTWl4aW5nIG9mCisgKiByZWdpc3RlcmVkIGFuZCB1bmJ1ZmZlcmVkIERJTU1zIGFzIHdlbGwgYXMgbWl4aW5nIG9mIEVDQyBhbmQgbm9uLUVDQyBESU1NcworICogaXMgbm90IGFsbG93ZWQuIFRoZSA4MjYwMCBTRFJBTSBpbnRlcmZhY2Ugb3BlcmF0ZXMgYXQgdGhlIHNhbWUgZnJlcXVlbmN5IGFzCisgKiB0aGUgQ1BVIGJ1cywgNjZNSHosIDEwME1IeiBvciAxMzNNSHouIgorICovCisKKyNkZWZpbmUgUjgyNjAwX05SX0NTUk9XUyA0CisjZGVmaW5lIFI4MjYwMF9OUl9DSEFOUyAgMQorI2RlZmluZSBSODI2MDBfTlJfRElNTVMgIDQKKworI2RlZmluZSBSODI2MDBfQlJJREdFX0lEICAweDgyMDAKKworLyogUmFkaXN5cyA4MjYwMCByZWdpc3RlciBhZGRyZXNzZXMgLSBkZXZpY2UgMCBmdW5jdGlvbiAwIC0gUENJIGJyaWRnZSAqLworI2RlZmluZSBSODI2MDBfRFJBTUMJMHg1NwkvKiBWYXJpb3VzIFNEUkFNIHJlbGF0ZWQgY29udHJvbCBiaXRzCisJCQkJICogYWxsIGJpdHMgYXJlIFIvVworCQkJCSAqCisJCQkJICogNyAgICBTRFJBTSBJU0EgSG9sZSBFbmFibGUKKwkJCQkgKiA2ICAgIEZsYXNoIFBhZ2UgTW9kZSBFbmFibGUKKwkJCQkgKiA1ICAgIEVDQyBFbmFibGU6IDE9RUNDIDA9bm9FQ0MKKwkJCQkgKiA0ICAgIERSQU0gRElNTSBUeXBlOiAxPQorCQkJCSAqIDMgICAgQklPUyBBbGlhcyBEaXNhYmxlCisJCQkJICogMiAgICBTRFJBTSBCSU9TIEZsYXNoIFdyaXRlIEVuYWJsZQorCQkJCSAqIDE6MCAgU0RSQU0gUmVmcmVzaCBSYXRlOiAwMD1EaXNhYmxlZAorCQkJCSAqICAgICAgICAgIDAxPTcuOHVzZWMgKDI1Nk1iaXQgU0RSQU1zKQorCQkJCSAqICAgICAgICAgIDEwPTE1LjZ1cyAxMT0xMjV1c2VjCisJCQkJICovCisKKyNkZWZpbmUgUjgyNjAwX1NEUkFNQwkweDc2CS8qICJTRFJBTSBDb250cm9sIFJlZ2lzdGVyIgorCQkJCSAqIE1vcmUgU0RSQU0gcmVsYXRlZCBjb250cm9sIGJpdHMKKwkJCQkgKiBhbGwgYml0cyBhcmUgUi9XCisJCQkJICoKKwkJCQkgKiAxNTo4IFJlc2VydmVkLgorCQkJCSAqCisJCQkJICogNzo1ICBTcGVjaWFsIFNEUkFNIE1vZGUgU2VsZWN0CisJCQkJICoKKwkJCQkgKiA0ICAgIEZvcmNlIEVDQworCQkJCSAqCisJCQkJICogICAgICAgIDE9RHJpdmUgRUNDIGJpdHMgdG8gMCBkdXJpbmcKKwkJCQkgKiAgICAgICAgICB3cml0ZSBjeWNsZXMgKGkuZS4gRUNDIHRlc3QgbW9kZSkKKwkJCQkgKgorCQkJCSAqICAgICAgICAwPU5vcm1hbCBFQ0MgZnVuY3Rpb25pbmcKKwkJCQkgKgorCQkJCSAqIDMgICAgRW5oYW5jZWQgUGFnaW5nIEVuYWJsZQorCQkJCSAqCisJCQkJICogMiAgICBDQVMjIExhdGVuY3kgMD0zY2xrcyAxPTJjbGtzCisJCQkJICoKKwkJCQkgKiAxICAgIFJBUyMgdG8gQ0FTIyBEZWxheSAwPTMgMT0yCisJCQkJICoKKwkJCQkgKiAwICAgIFJBUyMgUHJlY2hhcmdlICAgICAwPTMgMT0yCisJCQkJICovCisKKyNkZWZpbmUgUjgyNjAwX0VBUAkweDgwCS8qIEVDQyBFcnJvciBBZGRyZXNzIFBvaW50ZXIgUmVnaXN0ZXIKKwkJCQkgKgorCQkJCSAqIDMxICAgIERpc2FibGUgSGFyZHdhcmUgU2NydWJiaW5nIChSVykKKwkJCQkgKiAgICAgICAgMD1TY3J1YiBvbiBjb3JyZWN0ZWQgcmVhZAorCQkJCSAqICAgICAgICAxPURvbid0IHNjcnViIG9uIGNvcnJlY3RlZCByZWFkCisJCQkJICoKKwkJCQkgKiAzMDoxMiBFcnJvciBBZGRyZXNzIFBvaW50ZXIgKFJPKQorCQkJCSAqICAgICAgICBVcHBlciAxOSBiaXRzIG9mIGVycm9yIGFkZHJlc3MKKwkJCQkgKgorCQkJCSAqIDExOjQgIFN5bmRyb21lIEJpdHMgKFJPKQorCQkJCSAqCisJCQkJICogMyAgICAgQlNFUlIjIG9uIG11bHRpYml0IGVycm9yIChSVykKKwkJCQkgKiAgICAgICAgMT1lbmFibGUgMD1kaXNhYmxlCisJCQkJICoKKwkJCQkgKiAyICAgICBOTUkgb24gU2luZ2xlIEJpdCBFcm9yIChSVykKKwkJCQkgKiAgICAgICAgMT1OTUkgdHJpZ2dlcmVkIGJ5IFNCRSBuLmIuIG90aGVyCisJCQkJICogICAgICAgICAgcHJlcmVxdWVpc3RzCisJCQkJICogICAgICAgIDA9Tk1JIG5vdCB0cmlnZ2VyZWQKKwkJCQkgKgorCQkJCSAqIDEgICAgIE1CRSAoUi9XQykKKwkJCQkgKiAgICAgICAgcmVhZCAxPU1CRSBhdCBFQVAgKHNlZSBhYm92ZSkKKwkJCQkgKiAgICAgICAgcmVhZCAwPW5vIE1CRSwgb3IgU0JFIG9jY3VycmVkIGZpcnN0CisJCQkJICogICAgICAgIHdyaXRlIDE9Q2xlYXIgTUJFIHN0YXR1cyAobXVzdCBhbHNvCisJCQkJICogICAgICAgICAgY2xlYXIgU0JFKQorCQkJCSAqICAgICAgICB3cml0ZSAwPU5PUAorCQkJCSAqCisJCQkJICogMSAgICAgU0JFIChSL1dDKQorCQkJCSAqICAgICAgICByZWFkIDE9U0JFIGF0IEVBUCAoc2VlIGFib3ZlKQorCQkJCSAqICAgICAgICByZWFkIDA9bm8gU0JFLCBvciBNQkUgb2NjdXJyZWQgZmlyc3QKKwkJCQkgKiAgICAgICAgd3JpdGUgMT1DbGVhciBTQkUgc3RhdHVzIChtdXN0IGFsc28KKwkJCQkgKiAgICAgICAgICBjbGVhciBNQkUpCisJCQkJICogICAgICAgIHdyaXRlIDA9Tk9QCisJCQkJICovCisKKyNkZWZpbmUgUjgyNjAwX0RSQkEJMHg2MAkvKiArIDB4NjAuLjB4NjMgU0RSQU0gUm93IEJvdW5kcnkgQWRkcmVzcworCQkJCSAqICBSZWdpc3RlcnMKKwkJCQkgKgorCQkJCSAqIDc6MCAgQWRkcmVzcyBsaW5lcyAzMDoyNCAtIHVwcGVyIGxpbWl0IG9mCisJCQkJICogZWFjaCByb3cgW3A1N10KKwkJCQkgKi8KKworc3RydWN0IHI4MjYwMF9lcnJvcl9pbmZvIHsKKwl1MzIgZWFwcjsKK307CisKKworc3RhdGljIHVuc2lnbmVkIGludCBkaXNhYmxlX2hhcmR3YXJlX3NjcnViID0gMDsKKworCitzdGF0aWMgdm9pZCByODI2MDBfZ2V0X2Vycm9yX2luZm8gKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJc3RydWN0IHI4MjYwMF9lcnJvcl9pbmZvICppbmZvKQoreworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChtY2ktPnBkZXYsIFI4MjYwMF9FQVAsICZpbmZvLT5lYXByKTsKKworCWlmIChpbmZvLT5lYXByICYgQklUKDApKQorCQkvKiBDbGVhciBlcnJvciB0byBhbGxvdyBuZXh0IGVycm9yIHRvIGJlIHJlcG9ydGVkIFtwLjYyXSAqLworCQlwY2lfd3JpdGVfYml0czMyKG1jaS0+cGRldiwgUjgyNjAwX0VBUCwKKwkJCQkgICAoKHUzMikgQklUKDApICYgKHUzMikgQklUKDEpKSwKKwkJCQkgICAoKHUzMikgQklUKDApICYgKHUzMikgQklUKDEpKSk7CisKKwlpZiAoaW5mby0+ZWFwciAmIEJJVCgxKSkKKwkJLyogQ2xlYXIgZXJyb3IgdG8gYWxsb3cgbmV4dCBlcnJvciB0byBiZSByZXBvcnRlZCBbcC42Ml0gKi8KKwkJcGNpX3dyaXRlX2JpdHMzMihtY2ktPnBkZXYsIFI4MjYwMF9FQVAsCisJCQkJICAgKCh1MzIpIEJJVCgwKSAmICh1MzIpIEJJVCgxKSksCisJCQkJICAgKCh1MzIpIEJJVCgwKSAmICh1MzIpIEJJVCgxKSkpOworfQorCisKK3N0YXRpYyBpbnQgcjgyNjAwX3Byb2Nlc3NfZXJyb3JfaW5mbyAoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQlzdHJ1Y3QgcjgyNjAwX2Vycm9yX2luZm8gKmluZm8sIGludCBoYW5kbGVfZXJyb3JzKQoreworCWludCBlcnJvcl9mb3VuZDsKKwl1MzIgZWFwYWRkciwgcGFnZTsKKwl1MzIgc3luZHJvbWU7CisKKwllcnJvcl9mb3VuZCA9IDA7CisKKwkvKiBiaXRzIDMwOjEyIHN0b3JlIHRoZSB1cHBlciAxOSBiaXRzIG9mIHRoZSAzMiBiaXQgZXJyb3IgYWRkcmVzcyAqLworCWVhcGFkZHIgPSAoKGluZm8tPmVhcHIgPj4gMTIpICYgMHg3RkZGKSA8PCAxMzsKKwkvKiBTeW5kcm9tZSBpbiBiaXRzIDExOjQgW3AuNjJdICAgICAgICovCisJc3luZHJvbWUgPSAoaW5mby0+ZWFwciA+PiA0KSAmIDB4RkY7CisKKwkvKiB0aGUgUjgyNjAwIHJlcG9ydHMgYXQgbGVzcyB0aGFuIHBhZ2UgKgorCSAqIGdyYW51bGFyaXR5ICh1cHBlciAxOSBiaXRzIG9ubHkpICAgICAqLworCXBhZ2UgPSBlYXBhZGRyID4+IFBBR0VfU0hJRlQ7CisKKwlpZiAoaW5mby0+ZWFwciAmIEJJVCgwKSkgeyAJLyogQ0U/ICovCisJCWVycm9yX2ZvdW5kID0gMTsKKworCQlpZiAoaGFuZGxlX2Vycm9ycykKKwkJCWVkYWNfbWNfaGFuZGxlX2NlKAorCQkJICAgIG1jaSwgcGFnZSwgMCwJLyogbm90IGF2YWlsICovCisJCQkgICAgc3luZHJvbWUsCisJCQkgICAgZWRhY19tY19maW5kX2Nzcm93X2J5X3BhZ2UobWNpLCBwYWdlKSwKKwkJCSAgICAwLAkvKiBjaGFubmVsICovCisJCQkgICAgbWNpLT5jdGxfbmFtZSk7CisJfQorCisJaWYgKGluZm8tPmVhcHIgJiBCSVQoMSkpIHsgCS8qIFVFPyAqLworCQllcnJvcl9mb3VuZCA9IDE7CisKKwkJaWYgKGhhbmRsZV9lcnJvcnMpCisJCQkvKiA4MjYwMCBkb2Vzbid0IGdpdmUgZW5vdWdoIGluZm8gKi8KKwkJCWVkYWNfbWNfaGFuZGxlX3VlKG1jaSwgcGFnZSwgMCwKKwkJCSAgICBlZGFjX21jX2ZpbmRfY3Nyb3dfYnlfcGFnZShtY2ksIHBhZ2UpLAorCQkJICAgIG1jaS0+Y3RsX25hbWUpOworCX0KKworCXJldHVybiBlcnJvcl9mb3VuZDsKK30KKworc3RhdGljIHZvaWQgcjgyNjAwX2NoZWNrKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlzdHJ1Y3QgcjgyNjAwX2Vycm9yX2luZm8gaW5mbzsKKworCWRlYnVnZjEoIk1DJWQ6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgbWNpLT5tY19pZHgsIF9fZnVuY19fKTsKKwlyODI2MDBfZ2V0X2Vycm9yX2luZm8obWNpLCAmaW5mbyk7CisJcjgyNjAwX3Byb2Nlc3NfZXJyb3JfaW5mbyhtY2ksICZpbmZvLCAxKTsKK30KKworc3RhdGljIGludCByODI2MDBfcHJvYmUxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgZGV2X2lkeCkKK3sKKwlpbnQgcmMgPSAtRU5PREVWOworCWludCBpbmRleDsKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kgPSBOVUxMOworCXU4IGRyYW1jcjsKKwl1MzIgZWNjX29uOworCXUzMiByZWdfc2RyYW07CisJdTMyIGVhcHI7CisJdTMyIHNjcnViX2Rpc2FibGVkOworCXUzMiBzZHJhbV9yZWZyZXNoX3JhdGU7CisJdTMyIHJvd19oaWdoX2xpbWl0X2xhc3QgPSAwOworCXUzMiBlYXBfaW5pdF9iaXRzOworCisJZGVidWdmMCgiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBSODI2MDBfRFJBTUMsICZkcmFtY3IpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBSODI2MDBfRUFQLCAmZWFwcik7CisKKwllY2Nfb24gPSBkcmFtY3IgJiBCSVQoNSk7CisJcmVnX3NkcmFtID0gZHJhbWNyICYgQklUKDQpOworCXNjcnViX2Rpc2FibGVkID0gZWFwciAmIEJJVCgzMSk7CisJc2RyYW1fcmVmcmVzaF9yYXRlID0gZHJhbWNyICYgKEJJVCgwKSB8IEJJVCgxKSk7CisKKwlkZWJ1Z2YyKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpOiBzZHJhbSByZWZyZXNoIHJhdGUgPSAlIzB4XG4iLAorCQlfX2Z1bmNfXywgc2RyYW1fcmVmcmVzaF9yYXRlKTsKKworCWRlYnVnZjIoIk1DOiAiIF9fRklMRV9fICI6ICVzKCk6IERSQU1DIHJlZ2lzdGVyID0gJSMweFxuIiwgX19mdW5jX18sCisJCWRyYW1jcik7CisKKwltY2kgPSBlZGFjX21jX2FsbG9jKDAsIFI4MjYwMF9OUl9DU1JPV1MsIFI4MjYwMF9OUl9DSEFOUyk7CisKKwlpZiAobWNpID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJZGVidWdmMCgiTUM6ICIgX19GSUxFX18gIjogJXMoKTogbWNpID0gJXBcbiIsIF9fZnVuY19fLCBtY2kpOworCisJbWNpLT5wZGV2ID0gcGRldjsKKwltY2ktPm10eXBlX2NhcCA9IE1FTV9GTEFHX1JERFIgfCBNRU1fRkxBR19ERFI7CisKKwltY2ktPmVkYWNfY3RsX2NhcCA9IEVEQUNfRkxBR19OT05FIHwgRURBQ19GTEFHX0VDIHwgRURBQ19GTEFHX1NFQ0RFRDsKKwkvKiBGSVhNRSB0cnkgdG8gd29yayBvdXQgaWYgdGhlIGNoaXAgbGVhZHMgaGF2ZSBiZWVuICAgICAgICAgICAgICAgICAqCisJICogdXNlZCBmb3IgQ09NMiBpbnN0ZWFkIG9uIHRoaXMgYm9hcmQ/IFtNQTY/XSAgICAgICBNQVlCRTogICAgICAgICAgKi8KKworCS8qIE9uIHRoZSBSODI2MDAsIHRoZSBwaW5zIGZvciBtZW1vcnkgYml0cyA3Mjo2NSAtIGkuZS4gdGhlICAgKgorCSAqIEVDIGJpdHMgYXJlIHNoYXJlZCB3aXRoIHRoZSBwaW5zIGZvciBDT00yICghKSwgc28gaWYgQ09NMiAgKgorCSAqIGlzIGVuYWJsZWQsIHdlIGFzc3VtZSBDT00yIGlzIHdpcmVkIHVwLCBhbmQgdGh1cyBubyBFREFDICAgKgorCSAqIGlzIHBvc3NpYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwltY2ktPmVkYWNfY2FwID0gRURBQ19GTEFHX05PTkUgfCBFREFDX0ZMQUdfRUMgfCBFREFDX0ZMQUdfU0VDREVEOworCWlmIChlY2Nfb24pIHsKKwkJaWYgKHNjcnViX2Rpc2FibGVkKQorCQkJZGVidWdmMygiTUM6ICIgX19GSUxFX18gIjogJXMoKTogbWNpID0gJXAgLSAiCisJCQkJIlNjcnViYmluZyBkaXNhYmxlZCEgRUFQOiAlIzB4XG4iLCBfX2Z1bmNfXywKKwkJCQltY2ksIGVhcHIpOworCX0gZWxzZQorCQltY2ktPmVkYWNfY2FwID0gRURBQ19GTEFHX05PTkU7CisKKwltY2ktPm1vZF9uYW1lID0gQlNfTU9EX1NUUjsKKwltY2ktPm1vZF92ZXIgPSAiJFJldmlzaW9uOiAxLjEuMi42ICQiOworCW1jaS0+Y3RsX25hbWUgPSAiUjgyNjAwIjsKKwltY2ktPmVkYWNfY2hlY2sgPSByODI2MDBfY2hlY2s7CisJbWNpLT5jdGxfcGFnZV90b19waHlzID0gTlVMTDsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1jaS0+bnJfY3Nyb3dzOyBpbmRleCsrKSB7CisJCXN0cnVjdCBjc3Jvd19pbmZvICpjc3JvdyA9ICZtY2ktPmNzcm93c1tpbmRleF07CisJCXU4IGRyYmFyOwkvKiBzRHJhbSBSb3cgQm91bmRyeSBBZGRyZXNzIFJlZ2lzdGVyICovCisJCXUzMiByb3dfaGlnaF9saW1pdDsKKwkJdTMyIHJvd19iYXNlOworCisJCS8qIGZpbmQgdGhlIERSQU0gQ2hpcCBTZWxlY3QgQmFzZSBhZGRyZXNzIGFuZCBtYXNrICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKG1jaS0+cGRldiwgUjgyNjAwX0RSQkEgKyBpbmRleCwgJmRyYmFyKTsKKworCQlkZWJ1Z2YxKCJNQyVkOiAiIF9fRklMRV9fICI6ICVzKCkgUm93PSVkIERSQkEgPSAlIzB4XG4iLAorCQkJbWNpLT5tY19pZHgsIF9fZnVuY19fLCBpbmRleCwgZHJiYXIpOworCisJCXJvd19oaWdoX2xpbWl0ID0gKCh1MzIpIGRyYmFyIDw8IDI0KTsKKy8qCQlyb3dfaGlnaF9saW1pdCA9ICgodTMyKWRyYmFyIDw8IDI0KSB8IDB4ZmZmZmZmVUw7ICovCisKKwkJZGVidWdmMSgiTUMlZDogIiBfX0ZJTEVfXyAiOiAlcygpIFJvdz0lZCwgIgorCQkJIkJvdW5kcnkgQWRkcmVzcz0lIzB4LCBMYXN0ID0gJSMweCBcbiIsCisJCQltY2ktPm1jX2lkeCwgX19mdW5jX18sIGluZGV4LCByb3dfaGlnaF9saW1pdCwKKwkJCXJvd19oaWdoX2xpbWl0X2xhc3QpOworCisJCS8qIEVtcHR5IHJvdyBbcC41N10gKi8KKwkJaWYgKHJvd19oaWdoX2xpbWl0ID09IHJvd19oaWdoX2xpbWl0X2xhc3QpCisJCQljb250aW51ZTsKKworCQlyb3dfYmFzZSA9IHJvd19oaWdoX2xpbWl0X2xhc3Q7CisKKwkJY3Nyb3ctPmZpcnN0X3BhZ2UgPSByb3dfYmFzZSA+PiBQQUdFX1NISUZUOworCQljc3Jvdy0+bGFzdF9wYWdlID0gKHJvd19oaWdoX2xpbWl0ID4+IFBBR0VfU0hJRlQpIC0gMTsKKwkJY3Nyb3ctPm5yX3BhZ2VzID0gY3Nyb3ctPmxhc3RfcGFnZSAtIGNzcm93LT5maXJzdF9wYWdlICsgMTsKKwkJLyogRXJyb3IgYWRkcmVzcyBpcyB0b3AgMTkgYml0cyAtIHNvIGdyYW51bGFyaXR5IGlzICAgICAgKgorCQkgKiAxNCBiaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQljc3Jvdy0+Z3JhaW4gPSAxIDw8IDE0OworCQljc3Jvdy0+bXR5cGUgPSByZWdfc2RyYW0gPyBNRU1fUkREUiA6IE1FTV9ERFI7CisJCS8qIEZJWE1FIC0gY2hlY2sgdGhhdCB0aGlzIGlzIHVua25vd2FibGUgd2l0aCB0aGlzIGNoaXBzZXQgKi8KKwkJY3Nyb3ctPmR0eXBlID0gREVWX1VOS05PV047CisKKwkJLyogTW9kZSBpcyBnbG9iYWwgb24gODI2MDAgKi8KKwkJY3Nyb3ctPmVkYWNfbW9kZSA9IGVjY19vbiA/IEVEQUNfU0VDREVEIDogRURBQ19OT05FOworCQlyb3dfaGlnaF9saW1pdF9sYXN0ID0gcm93X2hpZ2hfbGltaXQ7CisJfQorCisJLyogY2xlYXIgY291bnRlcnMgKi8KKwkvKiBGSVhNRSBzaG91bGQgd2U/ICovCisKKwlpZiAoZWRhY19tY19hZGRfbWMobWNpKSkgeworCQlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXworCQkJIjogJXMoKTogZmFpbGVkIGVkYWNfbWNfYWRkX21jKClcbiIsIF9fZnVuY19fKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIGdldCB0aGlzIGZhciBhbmQgaXQncyBzdWNjZXNzZnVsICovCisKKwkvKiBDbGVhciBlcnJvciBmbGFncyB0byBhbGxvdyBuZXh0IGVycm9yIHRvIGJlIHJlcG9ydGVkIFtwLjYyXSAqLworCS8qIFRlc3Qgc3lzdGVtcyBzZWVtIHRvIGFsd2F5cyBoYXZlIHRoZSBVRSBmbGFnIHJhaXNlZCBvbiBib290ICovCisKKwllYXBfaW5pdF9iaXRzID0gQklUKDApICYgQklUKDEpOworCWlmIChkaXNhYmxlX2hhcmR3YXJlX3NjcnViKSB7CisJCWVhcF9pbml0X2JpdHMgfD0gQklUKDMxKTsKKwkJZGVidWdmMygiTUM6ICIgX19GSUxFX18gIjogJXMoKTogRGlzYWJsaW5nIEhhcmR3YXJlIFNjcnViICIKKwkJCSIoc2NydWIgb24gZXJyb3IpXG4iLCBfX2Z1bmNfXyk7CisJfQorCisJcGNpX3dyaXRlX2JpdHMzMihtY2ktPnBkZXYsIFI4MjYwMF9FQVAsIGVhcF9pbml0X2JpdHMsCisJCQkgZWFwX2luaXRfYml0cyk7CisKKwlkZWJ1Z2YzKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpOiBzdWNjZXNzXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7CisKK2ZhaWw6CisJaWYgKG1jaSkKKwkJZWRhY19tY19mcmVlKG1jaSk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIHJldHVybnMgY291bnQgKD49IDApLCBvciBuZWdhdGl2ZSBvbiBlcnJvciAqLworc3RhdGljIGludCBfX2RldmluaXQgcjgyNjAwX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlkZWJ1Z2YwKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBkb24ndCBuZWVkIHRvIGNhbGwgcGNpX2RldmljZV9lbmFibGUoKSAqLworCXJldHVybiByODI2MDBfcHJvYmUxKHBkZXYsIGVudC0+ZHJpdmVyX2RhdGEpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCByODI2MDBfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2k7CisKKwlkZWJ1Z2YwKF9fRklMRV9fICI6ICVzKClcbiIsIF9fZnVuY19fKTsKKworCWlmICgoKG1jaSA9IGVkYWNfbWNfZmluZF9tY2lfYnlfcGRldihwZGV2KSkgIT0gTlVMTCkgJiYKKwkgICAgIWVkYWNfbWNfZGVsX21jKG1jaSkpCisJCWVkYWNfbWNfZnJlZShtY2kpOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCByODI2MDBfcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9SQURJU1lTLCBSODI2MDBfQlJJREdFX0lEKX0sCisJezAsfQkJCS8qIDAgdGVybWluYXRlZCBsaXN0LiAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHI4MjYwMF9wY2lfdGJsKTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcjgyNjAwX2RyaXZlciA9IHsKKwkubmFtZSA9IEJTX01PRF9TVFIsCisJLnByb2JlID0gcjgyNjAwX2luaXRfb25lLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChyODI2MDBfcmVtb3ZlX29uZSksCisJLmlkX3RhYmxlID0gcjgyNjAwX3BjaV90YmwsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IHI4MjYwMF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnI4MjYwMF9kcml2ZXIpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCByODI2MDBfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcjgyNjAwX2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQocjgyNjAwX2luaXQpOworbW9kdWxlX2V4aXQocjgyNjAwX2V4aXQpOworCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlRpbSBTbWFsbCA8dGltQGJ1dHRlcnNpZGV1cC5jb20+IC0gV1BBRCBMdGQuICIKKwkgICAgICAib24gYmVoYWxmIG9mIEVBRFMgQXN0cml1bSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNQyBzdXBwb3J0IGZvciBSYWRpc3lzIDgyNjAwIG1lbW9yeSBjb250cm9sbGVycyIpOworCittb2R1bGVfcGFyYW0oZGlzYWJsZV9oYXJkd2FyZV9zY3J1YiwgYm9vbCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfaGFyZHdhcmVfc2NydWIsCisJCSAiSWYgc2V0LCBkaXNhYmxlIHRoZSBjaGlwc2V0J3MgYXV0b21hdGljIHNjcnViIGZvciBDRXMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZGVsbF9yYnUuYyBiL2RyaXZlcnMvZmlybXdhcmUvZGVsbF9yYnUuYwppbmRleCBkZmVkYjc3Li5mZGI4YjA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2RlbGxfcmJ1LmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9kZWxsX3JidS5jCkBAIC00OSw3ICs0OSw3IEBACiBNT0RVTEVfQVVUSE9SKCJBYmhheSBTYWx1bmtlIDxhYmhheV9zYWx1bmtlQGRlbGwuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIHVwZGF0aW5nIEJJT1MgaW1hZ2Ugb24gREVMTCBzeXN0ZW1zIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfVkVSU0lPTigiMy4xIik7CitNT0RVTEVfVkVSU0lPTigiMy4yIik7CiAKICNkZWZpbmUgQklPU19TQ0FOX0xJTUlUIDB4ZmZmZmZmZmYKICNkZWZpbmUgTUFYX0lNQUdFX0xFTkdUSCAxNgpAQCAtNTY0LDEyICs1NjQsMTAgQEAKIAogc3RhdGljIHZvaWQgY2FsbGJhY2tmbl9yYnUoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgdm9pZCAqY29udGV4dCkKIHsKLQlpbnQgcmMgPSAwOworCXJidV9kYXRhLmVudHJ5X2NyZWF0ZWQgPSAwOwogCi0JaWYgKCFmdyB8fCAhZnctPnNpemUpIHsKLQkJcmJ1X2RhdGEuZW50cnlfY3JlYXRlZCA9IDA7CisJaWYgKCFmdyB8fCAhZnctPnNpemUpCiAJCXJldHVybjsKLQl9CiAKIAlzcGluX2xvY2soJnJidV9kYXRhLmxvY2spOwogCWlmICghc3RyY21wKGltYWdlX3R5cGUsICJtb25vIikpIHsKQEAgLTU5MiwxNSArNTkwLDYgQEAKIAl9IGVsc2UKIAkJcHJfZGVidWcoImludmFsaWQgaW1hZ2UgdHlwZSBzcGVjaWZpZWQuXG4iKTsKIAlzcGluX3VubG9jaygmcmJ1X2RhdGEubG9jayk7Ci0KLQlyYyA9IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLCBGV19BQ1RJT05fTk9IT1RQTFVHLAotCQkiZGVsbF9yYnUiLCAmcmJ1X2RldmljZS0+ZGV2LCAmY29udGV4dCwgY2FsbGJhY2tmbl9yYnUpOwotCWlmIChyYykKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkiZGVsbF9yYnU6JXMgcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQgZmFpbGVkIgotCQkJIiAlZFxuIiwgX19GVU5DVElPTl9fLCByYyk7Ci0JZWxzZQotCQlyYnVfZGF0YS5lbnRyeV9jcmVhdGVkID0gMTsKIH0KIAogc3RhdGljIHNzaXplX3QgcmVhZF9yYnVfaW1hZ2VfdHlwZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmZmVyLApAQCAtNzM1LDE0ICs3MjQsNyBAQAogCXN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmcmJ1X2RldmljZS0+ZGV2LmtvYmosCiAJCSZyYnVfcGFja2V0X3NpemVfYXR0cik7CiAKLQlyYyA9IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLCBGV19BQ1RJT05fTk9IT1RQTFVHLAotCQkiZGVsbF9yYnUiLCAmcmJ1X2RldmljZS0+ZGV2LCAmY29udGV4dCwgY2FsbGJhY2tmbl9yYnUpOwotCWlmIChyYykKLQkJcHJpbnRrKEtFUk5fRVJSICJkZWxsX3JidTolczpyZXF1ZXN0X2Zpcm13YXJlX25vd2FpdCIKLQkJCSIgZmFpbGVkICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKLQllbHNlCi0JCXJidV9kYXRhLmVudHJ5X2NyZWF0ZWQgPSAxOwotCisJcmJ1X2RhdGEuZW50cnlfY3JlYXRlZCA9IDA7CiAJcmV0dXJuIHJjOwogCiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaXZhcnMuYyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpdmFycy5jCmluZGV4IGJkYTViY2UuLjM0MzM3OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWZpdmFycy5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpdmFycy5jCkBAIC02NSwxMSArNjUsMTEgQEAKICAqICAgdjAuMDEgcmVsZWFzZSB0byBsaW51eC1pYTY0QGxpbnV4aWE2NC5vcmcKICAqLwogCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JCS8qIGZvciBjYXBhYmxlKCkgKi8KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi92dDgyMzEuYyBiL2RyaXZlcnMvaHdtb24vdnQ4MjMxLmMKaW5kZXggZDAwYTcyNi4uM2ViMDhmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi92dDgyMzEuYworKysgYi9kcml2ZXJzL2h3bW9uL3Z0ODIzMS5jCkBAIC04NDEsNyArODQxLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgc21fdnQ4MjMxX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZ2dDgyMzFfcGNpX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnZ0ODIzMV9wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHNtX3Z0ODIzMV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnCmluZGV4IDQwMTBmZTkuLjA4ZDViOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnCkBAIC0yMzYsMjcgKzIzNiwxNyBAQAogCSAgVGhpcyBzdXBwb3J0IGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgaTJjLWl4cDIwMDAuCiAKLWNvbmZpZyBJMkNfS0VZV0VTVAotCXRyaXN0YXRlICJQb3dlcm1hYyBLZXl3ZXN0IEkyQyBpbnRlcmZhY2UiCitjb25maWcgSTJDX1BPV0VSTUFDCisJdHJpc3RhdGUgIlBvd2VybWFjIEkyQyBpbnRlcmZhY2UiCiAJZGVwZW5kcyBvbiBJMkMgJiYgUFBDX1BNQUMKKwlkZWZhdWx0IHkKIAloZWxwCi0JICBUaGlzIHN1cHBvcnRzIHRoZSB1c2Ugb2YgdGhlIEkyQyBpbnRlcmZhY2UgaW4gdGhlIGNvbWJvLUkvTwotCSAgY2hpcCBvbiByZWNlbnQgQXBwbGUgbWFjaGluZXMuICBTYXkgWSBpZiB5b3UgaGF2ZSBzdWNoIGEgbWFjaGluZS4KLQotCSAgVGhpcyBzdXBwb3J0IGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUgCi0JICB3aWxsIGJlIGNhbGxlZCBpMmMta2V5d2VzdC4KLQotY29uZmlnIEkyQ19QTUFDX1NNVQotCXRyaXN0YXRlICJQb3dlcm1hYyBTTVUgSTJDIGludGVyZmFjZSIKLQlkZXBlbmRzIG9uIEkyQyAmJiBQTUFDX1NNVQotCWhlbHAKLQkgIFRoaXMgc3VwcG9ydHMgdGhlIHVzZSBvZiB0aGUgSTJDIGludGVyZmFjZSBpbiB0aGUgU01VCi0JICBjaGlwIG9uIHJlY2VudCBBcHBsZSBtYWNoaW5lcyBsaWtlIHRoZSBpTWFjIEc1LiAgSXQgaXMgdXNlZAotCSAgYW1vbmcgb3RoZXJzIGJ5IHRoZSB0aGVybWFsIGNvbnRyb2wgZHJpdmVyIGZvciB0aG9zZSBtYWNoaW5lcy4KLQkgIFNheSBZIGlmIHlvdSBoYXZlIHN1Y2ggYSBtYWNoaW5lLgorCSAgVGhpcyBleHBvc2VzIHRoZSB2YXJpb3VzIFBvd2VyTWFjIGkyYyBpbnRlcmZhY2VzIHRvIHRoZSBsaW51eCBpMmMKKwkgIGxheWVyIGFuZCB0byB1c2VybGFuZC4gSXQgaXMgdXNlZCBieSB2YXJpb3VzIGRyaXZlcnMgb24gdGhlIHBvd2VtYWMKKwkgIHBsYXRmb3JtLCB0aHVzIHNob3VsZCBnZW5lcmFsbHkgYmUgZW5hYmxlZC4KIAogCSAgVGhpcyBzdXBwb3J0IGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGkyYy1wbWFjLXNtdS4KKwkgIHdpbGwgYmUgY2FsbGVkIGkyYy1wb3dlcm1hYy4KIAogY29uZmlnIEkyQ19NUEMKIAl0cmlzdGF0ZSAiTVBDMTA3LzgyNHgvODV4eC81Mnh4IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlIGIvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlCmluZGV4IGYxZGYwMGYuLmI0NDgzMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUKQEAgLTE5LDggKzE5LDcgQEAKIG9iai0kKENPTkZJR19JMkNfSVRFKQkJKz0gaTJjLWl0ZS5vCiBvYmotJChDT05GSUdfSTJDX0lYUDIwMDApCSs9IGkyYy1peHAyMDAwLm8KIG9iai0kKENPTkZJR19JMkNfSVhQNFhYKQkrPSBpMmMtaXhwNHh4Lm8KLW9iai0kKENPTkZJR19JMkNfS0VZV0VTVCkJKz0gaTJjLWtleXdlc3Qubwotb2JqLSQoQ09ORklHX0kyQ19QTUFDX1NNVSkJKz0gaTJjLXBtYWMtc211Lm8KK29iai0kKENPTkZJR19JMkNfUE9XRVJNQUMpCSs9IGkyYy1wb3dlcm1hYy5vCiBvYmotJChDT05GSUdfSTJDX01QQykJCSs9IGkyYy1tcGMubwogb2JqLSQoQ09ORklHX0kyQ19NVjY0WFhYKQkrPSBpMmMtbXY2NHh4eC5vCiBvYmotJChDT05GSUdfSTJDX05GT1JDRTIpCSs9IGkyYy1uZm9yY2UyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMta2V5d2VzdC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1rZXl3ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MWY3NDguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1rZXl3ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NTEgKzAsMCBAQAotLyoKLSAgICBpMmMgU3VwcG9ydCBmb3IgQXBwbGUgS2V5d2VzdCBJMkMgQnVzIENvbnRyb2xsZXIKLQotICAgIENvcHlyaWdodCAoYykgMjAwMSBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+Ci0KLSAgICBPcmlnaW5hbCB3b3JrIGJ5Ci0gICAgCi0gICAgQ29weXJpZ2h0IChjKSAyMDAwIFBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAc3RpbXB5Lm5ldHJvZWRnZS5jb20+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICAgIENoYW5nZXM6Ci0KLSAgICAyMDAxLzEyLzEzIEJlbkgJTmV3IGltcGxlbWVudGF0aW9uCi0gICAgMjAwMS8xMi8xNSBCZW5ICUFkZCBzdXBwb3J0IGZvciAiYnl0ZSIgYW5kICJxdWljayIKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVycy4gQWRkIGkyY194ZmVyIHJvdXRpbmUuCi0gICAgMjAwMy8wOS8yMSBCZW5ICVJld29yayBzdGF0ZSBtYWNoaW5lIHdpdGggUGF1bHVzIGhlbHAKLSAgICAyMDA0LzAxLzIxIEJlbkgJTWVyZ2UgaW4gR3JlZyBLSCBjaGFuZ2VzLCBwb2xsZWQgbW9kZSBpcyBiYWNrCi0gICAgMjAwNC8wMi8wNSBCZW5ICU1lcmdlIDY0IGJpdHMgZml4ZXMgZnJvbSB0aGUgZzUgcHBjNjQgdHJlZQotCi0gICAgTXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgdmFyaW91cyBtb2RlcyBzdXBwb3J0ZWQgYnkga2V5d2VzdCBhcmU6Ci0KLSAgICAgLSBEdW1iIG1vZGUgOiBub3QgaW1wbGVtZW50ZWQsIHByb2JhYmx5IGRpcmVjdCB0d2Vha2luZyBvZiBsaW5lcwotICAgICAtIFN0YW5kYXJkIG1vZGUgOiBzaW1wbGUgaTJjIHRyYW5zYWN0aW9uIG9mIHR5cGUKLSAgICAgICAgIFMgQWRkciBSL1cgQSBEYXRhIEEgRGF0YSAuLi4gVAotICAgICAtIFN0YW5kYXJkIHN1YiBtb2RlIDogY29tYmluZWQgOCBiaXQgc3ViYWRkciB3cml0ZSB3aXRoIGRhdGEgcmVhZAotICAgICAgICAgUyBBZGRyIFIvVyBBIFN1YkFkZHIgQSBEYXRhIEEgRGF0YSAuLi4gVAotICAgICAtIENvbWJpbmVkIG1vZGUgOiBTdWJhZGRyZXNzIGFuZCBEYXRhIHNlcXVlbmNlcyBhcHBlbmRlZCB3aXRoIG5vIHN0b3AKLSAgICAgICAgIFMgQWRkciBSL1cgQSBTdWJBZGRyIFMgQWRkciBSL1cgQSBEYXRhIEEgRGF0YSAuLi4gVAotCi0gICAgQ3VycmVudGx5LCB0aGlzIGRyaXZlciB1c2VzIG9ubHkgU3RhbmRhcmQgbW9kZSBmb3IgaTJjIHhmZXIsIGFuZAotICAgIHNtYnVzIGJ5dGUgJiBxdWljayB0cmFuc2ZlcnMgOyBhbmQgdXNlcyBTdGFuZGFyZFN1YiBtb2RlIGZvcgotICAgIG90aGVyIHNtYnVzIHRyYW5zZmVycyBpbnN0ZWFkIG9mIGNvbWJpbmVkIGFzIHdlIG5lZWQgdGhhdCBmb3IgdGhlCi0gICAgc291bmQgZHJpdmVyIHRvIGJlIGhhcHB5Ci0qLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgotI2luY2x1ZGUgPGFzbS9wbWFjX2xvd19pMmMuaD4KLQotI2luY2x1ZGUgImkyYy1rZXl3ZXN0LmgiCi0KLSN1bmRlZiBQT0xMRURfTU9ERQotCi0vKiBTb21lIGRlYnVnIG1hY3JvcyAqLwotI2RlZmluZSBXUk9OR19TVEFURShuYW1lKSBkbyB7XAotCQlwcl9kZWJ1ZygiS1c6IHdyb25nIHN0YXRlLiBHb3QgJXMsIHN0YXRlOiAlcyAoaXNyOiAlMDJ4KVxuIiwgXAotCQkJIG5hbWUsIF9fa3dfc3RhdGVfbmFtZXNbaWZhY2UtPnN0YXRlXSwgaXNyKTsJXAotCX0gd2hpbGUoMCkKLQotI2lmZGVmIERFQlVHCi1zdGF0aWMgY29uc3QgY2hhciAqX19rd19zdGF0ZV9uYW1lc1tdID0gewotCSJzdGF0ZV9pZGxlIiwKLQkic3RhdGVfYWRkciIsCi0JInN0YXRlX3JlYWQiLAotCSJzdGF0ZV93cml0ZSIsCi0JInN0YXRlX3N0b3AiLAotCSJzdGF0ZV9kZWFkIgotfTsKLSNlbmRpZiAvKiBERUJVRyAqLwotCi1NT0RVTEVfQVVUSE9SKCJCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkkyQyBkcml2ZXIgZm9yIEFwcGxlJ3MgS2V5d2VzdCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0jaWZkZWYgUE9MTEVEX01PREUKLS8qIERvbid0IHNjaGVkdWxlLCB0aGUgZzUgZmFuIGNvbnRyb2xsZXIgaXMgdG9vCi0gKiB0aW1pbmcgc2Vuc2l0aXZlCi0gKi8KLXN0YXRpYyB1OAotd2FpdF9pbnRlcnJ1cHQoc3RydWN0IGtleXdlc3RfaWZhY2UqIGlmYWNlKQotewotCWludCBpOwotCXU4IGlzcjsKLQkKLQlmb3IgKGkgPSAwOyBpIDwgMjAwMDAwOyBpKyspIHsKLQkJaXNyID0gcmVhZF9yZWcocmVnX2lzcikgJiBLV19JMkNfSVJRX01BU0s7Ci0JCWlmIChpc3IgIT0gMCkKLQkJCXJldHVybiBpc3I7Ci0JCXVkZWxheSgxMCk7Ci0JfQotCXJldHVybiBpc3I7Ci19Ci0jZW5kaWYgLyogUE9MTEVEX01PREUgKi8KLQotc3RhdGljIHZvaWQKLWRvX3N0b3Aoc3RydWN0IGtleXdlc3RfaWZhY2UqIGlmYWNlLCBpbnQgcmVzdWx0KQotewotCXdyaXRlX3JlZyhyZWdfY29udHJvbCwgS1dfSTJDX0NUTF9TVE9QKTsKLQlpZmFjZS0+c3RhdGUgPSBzdGF0ZV9zdG9wOwotCWlmYWNlLT5yZXN1bHQgPSByZXN1bHQ7Ci19Ci0KLS8qIE1haW4gc3RhdGUgbWFjaGluZSBmb3Igc3RhbmRhcmQgJiBzdGFuZGFyZCBzdWIgbW9kZSAqLwotc3RhdGljIHZvaWQKLWhhbmRsZV9pbnRlcnJ1cHQoc3RydWN0IGtleXdlc3RfaWZhY2UgKmlmYWNlLCB1OCBpc3IpCi17Ci0JaW50IGFjazsKLQkKLQlpZiAoaXNyID09IDApIHsKLQkJaWYgKGlmYWNlLT5zdGF0ZSAhPSBzdGF0ZV9zdG9wKSB7Ci0JCQlwcl9kZWJ1ZygiS1c6IFRpbWVvdXQgIVxuIik7Ci0JCQlkb19zdG9wKGlmYWNlLCAtRUlPKTsKLQkJfQotCQlpZiAoaWZhY2UtPnN0YXRlID09IHN0YXRlX3N0b3ApIHsKLQkJCWFjayA9IHJlYWRfcmVnKHJlZ19zdGF0dXMpOwotCQkJaWYgKCEoYWNrICYgS1dfSTJDX1NUQVRfQlVTWSkpIHsKLQkJCQlpZmFjZS0+c3RhdGUgPSBzdGF0ZV9pZGxlOwotCQkJCXdyaXRlX3JlZyhyZWdfaWVyLCAweDAwKTsKLSNpZm5kZWYgUE9MTEVEX01PREUKLQkJCQljb21wbGV0ZSgmaWZhY2UtPmNvbXBsZXRlKTsKLSNlbmRpZiAvKiBQT0xMRURfTU9ERSAqLwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoaXNyICYgS1dfSTJDX0lSUV9BRERSKSB7Ci0JCWFjayA9IHJlYWRfcmVnKHJlZ19zdGF0dXMpOwotCQlpZiAoaWZhY2UtPnN0YXRlICE9IHN0YXRlX2FkZHIpIHsKLQkJCXdyaXRlX3JlZyhyZWdfaXNyLCBLV19JMkNfSVJRX0FERFIpOwotCQkJV1JPTkdfU1RBVEUoIktXX0kyQ19JUlFfQUREUiIpOyAKLQkJCWRvX3N0b3AoaWZhY2UsIC1FSU8pOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgoYWNrICYgS1dfSTJDX1NUQVRfTEFTVF9BQUspID09IDApIHsKLQkJCWlmYWNlLT5zdGF0ZSA9IHN0YXRlX3N0b3A7CQkgICAgIAotCQkJaWZhY2UtPnJlc3VsdCA9IC1FTk9ERVY7Ci0JCQlwcl9kZWJ1ZygiS1c6IE5BSyBvbiBhZGRyZXNzXG4iKTsKLQkJfSBlbHNlIHsKLQkJCS8qIEhhbmRsZSBydyAicXVpY2siIG1vZGUgKi8KLQkJCWlmIChpZmFjZS0+ZGF0YWxlbiA9PSAwKSB7Ci0JCQkJZG9fc3RvcChpZmFjZSwgMCk7Ci0JCQl9IGVsc2UgaWYgKGlmYWNlLT5yZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEKSB7Ci0JCQkJaWZhY2UtPnN0YXRlID0gc3RhdGVfcmVhZDsKLQkJCQlpZiAoaWZhY2UtPmRhdGFsZW4gPiAxKQotCQkJCQl3cml0ZV9yZWcocmVnX2NvbnRyb2wsIEtXX0kyQ19DVExfQUFLKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWZhY2UtPnN0YXRlID0gc3RhdGVfd3JpdGU7Ci0JCQkJd3JpdGVfcmVnKHJlZ19kYXRhLCAqKGlmYWNlLT5kYXRhKyspKTsKLQkJCQlpZmFjZS0+ZGF0YWxlbi0tOwotCQkJfQotCQl9Ci0JCXdyaXRlX3JlZyhyZWdfaXNyLCBLV19JMkNfSVJRX0FERFIpOwotCX0KLQotCWlmIChpc3IgJiBLV19JMkNfSVJRX0RBVEEpIHsKLQkJaWYgKGlmYWNlLT5zdGF0ZSA9PSBzdGF0ZV9yZWFkKSB7Ci0JCQkqKGlmYWNlLT5kYXRhKyspID0gcmVhZF9yZWcocmVnX2RhdGEpOwotCQkJd3JpdGVfcmVnKHJlZ19pc3IsIEtXX0kyQ19JUlFfREFUQSk7Ci0JCQlpZmFjZS0+ZGF0YWxlbi0tOwotCQkJaWYgKGlmYWNlLT5kYXRhbGVuID09IDApCi0JCQkJaWZhY2UtPnN0YXRlID0gc3RhdGVfc3RvcDsKLQkJCWVsc2UgaWYgKGlmYWNlLT5kYXRhbGVuID09IDEpCi0JCQkJd3JpdGVfcmVnKHJlZ19jb250cm9sLCAwKTsKLQkJfSBlbHNlIGlmIChpZmFjZS0+c3RhdGUgPT0gc3RhdGVfd3JpdGUpIHsKLQkJCS8qIENoZWNrIGFjayBzdGF0dXMgKi8KLQkJCWFjayA9IHJlYWRfcmVnKHJlZ19zdGF0dXMpOwotCQkJaWYgKChhY2sgJiBLV19JMkNfU1RBVF9MQVNUX0FBSykgPT0gMCkgewotCQkJCXByX2RlYnVnKCJLVzogbmFjayBvbiBkYXRhIHdyaXRlICgleCk6ICV4XG4iLAotCQkJCSAgICBpZmFjZS0+ZGF0YVstMV0sIGFjayk7Ci0JCQkJZG9fc3RvcChpZmFjZSwgLUVJTyk7Ci0JCQl9IGVsc2UgaWYgKGlmYWNlLT5kYXRhbGVuKSB7Ci0JCQkJd3JpdGVfcmVnKHJlZ19kYXRhLCAqKGlmYWNlLT5kYXRhKyspKTsKLQkJCQlpZmFjZS0+ZGF0YWxlbi0tOwotCQkJfSBlbHNlIHsKLQkJCQl3cml0ZV9yZWcocmVnX2NvbnRyb2wsIEtXX0kyQ19DVExfU1RPUCk7Ci0JCQkJaWZhY2UtPnN0YXRlID0gc3RhdGVfc3RvcDsKLQkJCQlpZmFjZS0+cmVzdWx0ID0gMDsKLQkJCX0KLQkJCXdyaXRlX3JlZyhyZWdfaXNyLCBLV19JMkNfSVJRX0RBVEEpOwotCQl9IGVsc2UgewotCQkJd3JpdGVfcmVnKHJlZ19pc3IsIEtXX0kyQ19JUlFfREFUQSk7Ci0JCQlXUk9OR19TVEFURSgiS1dfSTJDX0lSUV9EQVRBIik7IAotCQkJaWYgKGlmYWNlLT5zdGF0ZSAhPSBzdGF0ZV9zdG9wKQotCQkJCWRvX3N0b3AoaWZhY2UsIC1FSU8pOwotCQl9Ci0JfQotCi0JaWYgKGlzciAmIEtXX0kyQ19JUlFfU1RPUCkgewotCQl3cml0ZV9yZWcocmVnX2lzciwgS1dfSTJDX0lSUV9TVE9QKTsKLQkJaWYgKGlmYWNlLT5zdGF0ZSAhPSBzdGF0ZV9zdG9wKSB7Ci0JCQlXUk9OR19TVEFURSgiS1dfSTJDX0lSUV9TVE9QIik7Ci0JCQlpZmFjZS0+cmVzdWx0ID0gLUVJTzsKLQkJfQotCQlpZmFjZS0+c3RhdGUgPSBzdGF0ZV9pZGxlOwotCQl3cml0ZV9yZWcocmVnX2llciwgMHgwMCk7Ci0jaWZuZGVmIFBPTExFRF9NT0RFCi0JCWNvbXBsZXRlKCZpZmFjZS0+Y29tcGxldGUpOwotI2VuZGlmIC8qIFBPTExFRF9NT0RFICovCQkJCi0JfQotCi0JaWYgKGlzciAmIEtXX0kyQ19JUlFfU1RBUlQpCi0JCXdyaXRlX3JlZyhyZWdfaXNyLCBLV19JMkNfSVJRX1NUQVJUKTsKLX0KLQotI2lmbmRlZiBQT0xMRURfTU9ERQotCi0vKiBJbnRlcnJ1cHQgaGFuZGxlciAqLwotc3RhdGljIGlycXJldHVybl90Ci1rZXl3ZXN0X2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXN0cnVjdCBrZXl3ZXN0X2lmYWNlICppZmFjZSA9IChzdHJ1Y3Qga2V5d2VzdF9pZmFjZSAqKWRldl9pZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlmYWNlLT5sb2NrLCBmbGFncyk7Ci0JZGVsX3RpbWVyKCZpZmFjZS0+dGltZW91dF90aW1lcik7Ci0JaGFuZGxlX2ludGVycnVwdChpZmFjZSwgcmVhZF9yZWcocmVnX2lzcikpOwotCWlmIChpZmFjZS0+c3RhdGUgIT0gc3RhdGVfaWRsZSkgewotCQlpZmFjZS0+dGltZW91dF90aW1lci5leHBpcmVzID0gamlmZmllcyArIFBPTExfVElNRU9VVDsKLQkJYWRkX3RpbWVyKCZpZmFjZS0+dGltZW91dF90aW1lcik7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlmYWNlLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgdm9pZAota2V5d2VzdF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3Qga2V5d2VzdF9pZmFjZSAqaWZhY2UgPSAoc3RydWN0IGtleXdlc3RfaWZhY2UgKilkYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlwcl9kZWJ1ZygidGltZW91dCAhXG4iKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaWZhY2UtPmxvY2ssIGZsYWdzKTsKLQloYW5kbGVfaW50ZXJydXB0KGlmYWNlLCByZWFkX3JlZyhyZWdfaXNyKSk7Ci0JaWYgKGlmYWNlLT5zdGF0ZSAhPSBzdGF0ZV9pZGxlKSB7Ci0JCWlmYWNlLT50aW1lb3V0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgUE9MTF9USU1FT1VUOwotCQlhZGRfdGltZXIoJmlmYWNlLT50aW1lb3V0X3RpbWVyKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWZhY2UtPmxvY2ssIGZsYWdzKTsKLX0KLQotI2VuZGlmIC8qIFBPTExFRF9NT0RFICovCi0KLS8qCi0gKiBTTUJVUy10eXBlIHRyYW5zZmVyIGVudHJ5cG9pbnQKLSAqLwotc3RhdGljIHMzMgota2V5d2VzdF9zbWJ1c194ZmVyKAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqCWFkYXAsCi0JCQl1MTYJCQlhZGRyLAotCQkJdW5zaWduZWQgc2hvcnQJCWZsYWdzLAotCQkJY2hhcgkJCXJlYWRfd3JpdGUsCi0JCQl1OAkJCWNvbW1hbmQsCi0JCQlpbnQJCQlzaXplLAotCQkJdW5pb24gaTJjX3NtYnVzX2RhdGEqCWRhdGEpCi17Ci0Jc3RydWN0IGtleXdlc3RfY2hhbiogY2hhbiA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7Ci0Jc3RydWN0IGtleXdlc3RfaWZhY2UqIGlmYWNlID0gY2hhbi0+aWZhY2U7Ci0JaW50IGxlbjsKLQl1OCogYnVmZmVyOwotCXUxNiBjdXJfd29yZDsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKGlmYWNlLT5zdGF0ZSA9PSBzdGF0ZV9kZWFkKQotCQlyZXR1cm4gLUVOWElPOwotCQkKLQkvKiBQcmVwYXJlIGRhdGFzICYgc2VsZWN0IG1vZGUgKi8KLQlpZmFjZS0+Y3VyX21vZGUgJj0gfktXX0kyQ19NT0RFX01PREVfTUFTSzsKLQlzd2l0Y2ggKHNpemUpIHsKLSAgICAgICAgY2FzZSBJMkNfU01CVVNfUVVJQ0s6Ci0JICAgIAlsZW4gPSAwOwotCSAgICAJYnVmZmVyID0gTlVMTDsKLQkgICAgCWlmYWNlLT5jdXJfbW9kZSB8PSBLV19JMkNfTU9ERV9TVEFOREFSRDsKLQkgICAgCWJyZWFrOwotICAgICAgICBjYXNlIEkyQ19TTUJVU19CWVRFOgotCSAgICAJbGVuID0gMTsKLQkgICAgCWJ1ZmZlciA9ICZkYXRhLT5ieXRlOwotCSAgICAJaWZhY2UtPmN1cl9tb2RlIHw9IEtXX0kyQ19NT0RFX1NUQU5EQVJEOwotCSAgICAJYnJlYWs7Ci0gICAgICAgIGNhc2UgSTJDX1NNQlVTX0JZVEVfREFUQToKLQkgICAgCWxlbiA9IDE7Ci0JICAgIAlidWZmZXIgPSAmZGF0YS0+Ynl0ZTsKLQkgICAgCWlmYWNlLT5jdXJfbW9kZSB8PSBLV19JMkNfTU9ERV9TVEFOREFSRFNVQjsKLQkgICAgCWJyZWFrOwotICAgICAgICBjYXNlIEkyQ19TTUJVU19XT1JEX0RBVEE6Ci0JICAgIAlsZW4gPSAyOwotCSAgICAJY3VyX3dvcmQgPSBjcHVfdG9fbGUxNihkYXRhLT53b3JkKTsKLQkgICAgCWJ1ZmZlciA9ICh1OCAqKSZjdXJfd29yZDsKLQkgICAgCWlmYWNlLT5jdXJfbW9kZSB8PSBLV19JMkNfTU9ERV9TVEFOREFSRFNVQjsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgSTJDX1NNQlVTX0JMT0NLX0RBVEE6Ci0JICAgIAlsZW4gPSBkYXRhLT5ibG9ja1swXTsKLQkgICAgCWJ1ZmZlciA9ICZkYXRhLT5ibG9ja1sxXTsKLQkgICAgCWlmYWNlLT5jdXJfbW9kZSB8PSBLV19JMkNfTU9ERV9TVEFOREFSRFNVQjsKLQkJYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0JICAgIAlyZXR1cm4gLTE7Ci0JfQotCi0JLyogVHVybiBhIHN0YW5kYXJkc3ViIHJlYWQgaW50byBhIGNvbWJpbmVkIG1vZGUgYWNjZXNzICovCi0gCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFECi0gCSAgICAmJiAoaWZhY2UtPmN1cl9tb2RlICYgS1dfSTJDX01PREVfTU9ERV9NQVNLKSA9PSBLV19JMkNfTU9ERV9TVEFOREFSRFNVQikgewotIAkJaWZhY2UtPmN1cl9tb2RlICY9IH5LV19JMkNfTU9ERV9NT0RFX01BU0s7Ci0gCQlpZmFjZS0+Y3VyX21vZGUgfD0gS1dfSTJDX01PREVfQ09NQklORUQ7Ci0gCX0KLQotCS8qIE9yaWdpbmFsIGRyaXZlciBoYWQgdGhpcyBsaW1pdGF0aW9uICovCi0JaWYgKGxlbiA+IDMyKQotCQlsZW4gPSAzMjsKLQotCWlmIChwbWFjX2xvd19pMmNfbG9jayhpZmFjZS0+bm9kZSkpCi0JCXJldHVybiAtRU5YSU87Ci0KLQlwcl9kZWJ1ZygiY2hhbjogJWQsIGFkZHI6IDB4JXgsIHRyYW5zZmVyIGxlbjogJWQsIHJlYWQ6ICVkXG4iLAotCQljaGFuLT5jaGFuX25vLCBhZGRyLCBsZW4sIHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpOwotCi0JaWZhY2UtPmRhdGEgPSBidWZmZXI7Ci0JaWZhY2UtPmRhdGFsZW4gPSBsZW47Ci0JaWZhY2UtPnN0YXRlID0gc3RhdGVfYWRkcjsKLQlpZmFjZS0+cmVzdWx0ID0gMDsKLQlpZmFjZS0+cmVhZF93cml0ZSA9IHJlYWRfd3JpdGU7Ci0JCi0JLyogU2V0dXAgY2hhbm5lbCAmIGNsZWFyIHBlbmRpbmcgaXJxcyAqLwotCXdyaXRlX3JlZyhyZWdfaXNyLCByZWFkX3JlZyhyZWdfaXNyKSk7Ci0Jd3JpdGVfcmVnKHJlZ19tb2RlLCBpZmFjZS0+Y3VyX21vZGUgfCAoY2hhbi0+Y2hhbl9ubyA8PCA0KSk7Ci0Jd3JpdGVfcmVnKHJlZ19zdGF0dXMsIDApOwotCi0JLyogU2V0IHVwIGFkZHJlc3MgYW5kIHIvdyBiaXQgKi8KLQl3cml0ZV9yZWcocmVnX2FkZHIsCi0JCShhZGRyIDw8IDEpIHwgKChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEKSA/IDB4MDEgOiAweDAwKSk7Ci0KLQkvKiBTZXQgdXAgdGhlIHN1YiBhZGRyZXNzICovCi0JaWYgKChpZmFjZS0+Y3VyX21vZGUgJiBLV19JMkNfTU9ERV9NT0RFX01BU0spID09IEtXX0kyQ19NT0RFX1NUQU5EQVJEU1VCCi0JICAgIHx8IChpZmFjZS0+Y3VyX21vZGUgJiBLV19JMkNfTU9ERV9NT0RFX01BU0spID09IEtXX0kyQ19NT0RFX0NPTUJJTkVEKQotCQl3cml0ZV9yZWcocmVnX3N1YmFkZHIsIGNvbW1hbmQpOwotCi0jaWZuZGVmIFBPTExFRF9NT0RFCi0JLyogQXJtIHRpbWVvdXQgKi8KLQlpZmFjZS0+dGltZW91dF90aW1lci5leHBpcmVzID0gamlmZmllcyArIFBPTExfVElNRU9VVDsKLQlhZGRfdGltZXIoJmlmYWNlLT50aW1lb3V0X3RpbWVyKTsKLSNlbmRpZgotCi0JLyogU3RhcnQgc2VuZGluZyBhZGRyZXNzICYgZW5hYmxlIGludGVycnVwdCovCi0Jd3JpdGVfcmVnKHJlZ19jb250cm9sLCBLV19JMkNfQ1RMX1hBRERSKTsKLQl3cml0ZV9yZWcocmVnX2llciwgS1dfSTJDX0lSUV9NQVNLKTsKLQotI2lmZGVmIFBPTExFRF9NT0RFCi0JcHJfZGVidWcoInVzaW5nIHBvbGxlZCBtb2RlLi4uXG4iKTsKLQkvKiBTdGF0ZSBtYWNoaW5lLCB0byB0dXJuIGludG8gYW4gaW50ZXJydXB0IGhhbmRsZXIgKi8KLQl3aGlsZShpZmFjZS0+c3RhdGUgIT0gc3RhdGVfaWRsZSkgewotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JCXU4IGlzciA9IHdhaXRfaW50ZXJydXB0KGlmYWNlKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlmYWNlLT5sb2NrLCBmbGFncyk7Ci0JCWhhbmRsZV9pbnRlcnJ1cHQoaWZhY2UsIGlzcik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlmYWNlLT5sb2NrLCBmbGFncyk7Ci0JfQotI2Vsc2UgLyogUE9MTEVEX01PREUgKi8KLQlwcl9kZWJ1ZygidXNpbmcgaW50ZXJydXB0IG1vZGUuLi5cbiIpOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJmlmYWNlLT5jb21wbGV0ZSk7CQotI2VuZGlmIC8qIFBPTExFRF9NT0RFICovCQotCi0JcmMgPSBpZmFjZS0+cmVzdWx0OwkKLQlwcl9kZWJ1ZygidHJhbnNmZXIgZG9uZSwgcmVzdWx0OiAlZFxuIiwgcmMpOwotCi0JaWYgKHJjID09IDAgJiYgc2l6ZSA9PSBJMkNfU01CVVNfV09SRF9EQVRBICYmIHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpCi0JICAgIAlkYXRhLT53b3JkID0gbGUxNl90b19jcHUoY3VyX3dvcmQpOwotCQotCS8qIFJlbGVhc2Ugc2VtICovCi0JcG1hY19sb3dfaTJjX3VubG9jayhpZmFjZS0+bm9kZSk7Ci0JCi0JcmV0dXJuIHJjOwotfQotCi0vKgotICogR2VuZXJpYyBpMmMgbWFzdGVyIHRyYW5zZmVyIGVudHJ5cG9pbnQKLSAqLwotc3RhdGljIGludAota2V5d2VzdF94ZmVyKAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsCi0JCXN0cnVjdCBpMmNfbXNnICptc2dzLCAKLQkJaW50IG51bSkKLXsKLQlzdHJ1Y3Qga2V5d2VzdF9jaGFuKiBjaGFuID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKLQlzdHJ1Y3Qga2V5d2VzdF9pZmFjZSogaWZhY2UgPSBjaGFuLT5pZmFjZTsKLQlzdHJ1Y3QgaTJjX21zZyAqcG1zZzsKLQlpbnQgaSwgY29tcGxldGVkOwotCWludCByYyA9IDA7Ci0KLQlpZiAoaWZhY2UtPnN0YXRlID09IHN0YXRlX2RlYWQpCi0JCXJldHVybiAtRU5YSU87Ci0KLQlpZiAocG1hY19sb3dfaTJjX2xvY2soaWZhY2UtPm5vZGUpKQotCQlyZXR1cm4gLUVOWElPOwotCi0JLyogU2V0IGFkYXB0ZXIgdG8gc3RhbmRhcmQgbW9kZSAqLwotCWlmYWNlLT5jdXJfbW9kZSAmPSB+S1dfSTJDX01PREVfTU9ERV9NQVNLOwotCWlmYWNlLT5jdXJfbW9kZSB8PSBLV19JMkNfTU9ERV9TVEFOREFSRDsKLQotCWNvbXBsZXRlZCA9IDA7Ci0JZm9yIChpID0gMDsgcmMgPj0gMCAmJiBpIDwgbnVtOykgewotCQl1OCBhZGRyOwotCQkKLQkJcG1zZyA9ICZtc2dzW2krK107Ci0JCWFkZHIgPSBwbXNnLT5hZGRyOwotCQlpZiAocG1zZy0+ZmxhZ3MgJiBJMkNfTV9URU4pIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiaTJjLWtleXdlc3Q6IDEwIGJpdHMgYWRkciBub3Qgc3VwcG9ydGVkICFcbiIpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJcHJfZGVidWcoInhmZXI6IGNoYW46ICVkLCBkb2luZyAlcyAlZCBieXRlcyB0byAweCUwMnggLSAlZCBvZiAlZCBtZXNzYWdlc1xuIiwKLQkJICAgICBjaGFuLT5jaGFuX25vLAotCQkgICAgIHBtc2ctPmZsYWdzICYgSTJDX01fUkQgPyAicmVhZCIgOiAid3JpdGUiLAotICAgICAgICAgICAgICAgICAgICAgcG1zZy0+bGVuLCBhZGRyLCBpLCBudW0pOwotICAgIAotCQkvKiBTZXR1cCBjaGFubmVsICYgY2xlYXIgcGVuZGluZyBpcnFzICovCi0JCXdyaXRlX3JlZyhyZWdfbW9kZSwgaWZhY2UtPmN1cl9tb2RlIHwgKGNoYW4tPmNoYW5fbm8gPDwgNCkpOwotCQl3cml0ZV9yZWcocmVnX2lzciwgcmVhZF9yZWcocmVnX2lzcikpOwotCQl3cml0ZV9yZWcocmVnX3N0YXR1cywgMCk7Ci0JCQotCQlpZmFjZS0+ZGF0YSA9IHBtc2ctPmJ1ZjsKLQkJaWZhY2UtPmRhdGFsZW4gPSBwbXNnLT5sZW47Ci0JCWlmYWNlLT5zdGF0ZSA9IHN0YXRlX2FkZHI7Ci0JCWlmYWNlLT5yZXN1bHQgPSAwOwotCQlpZiAocG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkKLQkJCWlmYWNlLT5yZWFkX3dyaXRlID0gSTJDX1NNQlVTX1JFQUQ7Ci0JCWVsc2UKLQkJCWlmYWNlLT5yZWFkX3dyaXRlID0gSTJDX1NNQlVTX1dSSVRFOwotCi0JCS8qIFNldCB1cCBhZGRyZXNzIGFuZCByL3cgYml0ICovCi0JCWlmIChwbXNnLT5mbGFncyAmIEkyQ19NX1JFVl9ESVJfQUREUikKLQkJCWFkZHIgXj0gMTsJCQotCQl3cml0ZV9yZWcocmVnX2FkZHIsCi0JCQkoYWRkciA8PCAxKSB8Ci0JCQkoKGlmYWNlLT5yZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEKSA/IDB4MDEgOiAweDAwKSk7Ci0KLSNpZm5kZWYgUE9MTEVEX01PREUKLQkJLyogQXJtIHRpbWVvdXQgKi8KLQkJaWZhY2UtPnRpbWVvdXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBQT0xMX1RJTUVPVVQ7Ci0JCWFkZF90aW1lcigmaWZhY2UtPnRpbWVvdXRfdGltZXIpOwotI2VuZGlmCi0KLQkJLyogU3RhcnQgc2VuZGluZyBhZGRyZXNzICYgZW5hYmxlIGludGVycnVwdCovCi0JCXdyaXRlX3JlZyhyZWdfaWVyLCBLV19JMkNfSVJRX01BU0spOwotCQl3cml0ZV9yZWcocmVnX2NvbnRyb2wsIEtXX0kyQ19DVExfWEFERFIpOwotCi0jaWZkZWYgUE9MTEVEX01PREUKLQkJcHJfZGVidWcoInVzaW5nIHBvbGxlZCBtb2RlLi4uXG4iKTsKLQkJLyogU3RhdGUgbWFjaGluZSwgdG8gdHVybiBpbnRvIGFuIGludGVycnVwdCBoYW5kbGVyICovCi0JCXdoaWxlKGlmYWNlLT5zdGF0ZSAhPSBzdGF0ZV9pZGxlKSB7Ci0JCQl1OCBpc3IgPSB3YWl0X2ludGVycnVwdChpZmFjZSk7Ci0JCQloYW5kbGVfaW50ZXJydXB0KGlmYWNlLCBpc3IpOwotCQl9Ci0jZWxzZSAvKiBQT0xMRURfTU9ERSAqLwotCQlwcl9kZWJ1ZygidXNpbmcgaW50ZXJydXB0IG1vZGUuLi5cbiIpOwotCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZpZmFjZS0+Y29tcGxldGUpOwkKLSNlbmRpZiAvKiBQT0xMRURfTU9ERSAqLwkKLQotCQlyYyA9IGlmYWNlLT5yZXN1bHQ7Ci0JCWlmIChyYyA9PSAwKQotCQkJY29tcGxldGVkKys7Ci0JCXByX2RlYnVnKCJ0cmFuc2ZlciBkb25lLCByZXN1bHQ6ICVkXG4iLCByYyk7Ci0JfQotCi0JLyogUmVsZWFzZSBzZW0gKi8KLQlwbWFjX2xvd19pMmNfdW5sb2NrKGlmYWNlLT5ub2RlKTsKLQotCXJldHVybiBjb21wbGV0ZWQ7Ci19Ci0KLXN0YXRpYyB1MzIKLWtleXdlc3RfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiBhZGFwdGVyKQotewotCXJldHVybiBJMkNfRlVOQ19TTUJVU19RVUlDSyB8IEkyQ19GVU5DX1NNQlVTX0JZVEUgfAotCSAgICAgICBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgfAotCSAgICAgICBJMkNfRlVOQ19TTUJVU19CTE9DS19EQVRBOwotfQotCi0vKiBGb3Igbm93LCB3ZSBvbmx5IGhhbmRsZSBjb21iaW5lZCBtb2RlIChzbWJ1cykgKi8KLXN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBrZXl3ZXN0X2FsZ29yaXRobSA9IHsKLQkuc21idXNfeGZlcgk9IGtleXdlc3Rfc21idXNfeGZlciwKLQkubWFzdGVyX3hmZXIJPSBrZXl3ZXN0X3hmZXIsCi0JLmZ1bmN0aW9uYWxpdHkJPSBrZXl3ZXN0X2Z1bmMsCi19OwotCi0KLXN0YXRpYyBpbnQKLWNyZWF0ZV9pZmFjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JdW5zaWduZWQgbG9uZyBzdGVwczsKLQl1bnNpZ25lZCBic3RlcHMsIHRzaXplLCBpLCBuY2hhbiwgYWRkcm9mZnNldDsKLQlzdHJ1Y3Qga2V5d2VzdF9pZmFjZSogaWZhY2U7Ci0JdTMyICpwc3RlcHMsICpwcmF0ZTsKLQlpbnQgcmM7Ci0KLQlpZiAobnAtPm5faW50cnMgPCAxIHx8IG5wLT5uX2FkZHJzIDwgMSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBNaXNzaW5nIGludGVycnVwdCBvciBhZGRyZXNzICFcbiIsCi0JCSAgICAgICBucC0+ZnVsbF9uYW1lKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWlmIChwbWFjX2xvd19pMmNfbG9jayhucCkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcHN0ZXBzID0gKHUzMiAqKWdldF9wcm9wZXJ0eShucCwgIkFBUEwsYWRkcmVzcy1zdGVwIiwgTlVMTCk7Ci0Jc3RlcHMgPSBwc3RlcHMgPyAoKnBzdGVwcykgOiAweDEwOwotCi0JLyogSHJtLi4uIG1heWJlIHdlIGNhbiBiZSBzbWFydGVyIGhlcmUgKi8KLQlmb3IgKGJzdGVwcyA9IDA7IChzdGVwcyAmIDB4MDEpID09IDA7IGJzdGVwcysrKQotCQlzdGVwcyA+Pj0gMTsKLQotCWlmIChucC0+cGFyZW50LT5uYW1lWzBdID09ICd1JykgewotCQluY2hhbiA9IDI7Ci0JCWFkZHJvZmZzZXQgPSAzOwotCX0gZWxzZSB7Ci0JCWFkZHJvZmZzZXQgPSAwOwotCQluY2hhbiA9IDE7Ci0JfQotCi0JdHNpemUgPSBzaXplb2Yoc3RydWN0IGtleXdlc3RfaWZhY2UpICsKLQkJKHNpemVvZihzdHJ1Y3Qga2V5d2VzdF9jaGFuKSArIDQpICogbmNoYW47Ci0JaWZhY2UgPSBremFsbG9jKHRzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoaWZhY2UgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImkyYy1rZXl3ZXN0OiBjYW4ndCBhbGxvY2F0ZSBpbnRlZmFjZSAhXG4iKTsKLQkJcG1hY19sb3dfaTJjX3VubG9jayhucCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlzcGluX2xvY2tfaW5pdCgmaWZhY2UtPmxvY2spOwotCWluaXRfY29tcGxldGlvbigmaWZhY2UtPmNvbXBsZXRlKTsKLQlpZmFjZS0+bm9kZSA9IG9mX25vZGVfZ2V0KG5wKTsKLQlpZmFjZS0+YnN0ZXBzID0gYnN0ZXBzOwotCWlmYWNlLT5jaGFuX2NvdW50ID0gbmNoYW47Ci0JaWZhY2UtPnN0YXRlID0gc3RhdGVfaWRsZTsKLQlpZmFjZS0+aXJxID0gbnAtPmludHJzWzBdLmxpbmU7Ci0JaWZhY2UtPmNoYW5uZWxzID0gKHN0cnVjdCBrZXl3ZXN0X2NoYW4gKikKLQkJKCgodW5zaWduZWQgbG9uZykoaWZhY2UgKyAxKSArIDNVTCkgJiB+M1VMKTsKLQlpZmFjZS0+YmFzZSA9IGlvcmVtYXAobnAtPmFkZHJzWzBdLmFkZHJlc3MgKyBhZGRyb2Zmc2V0LAotCQkJCQkJbnAtPmFkZHJzWzBdLnNpemUpOwotCWlmICghaWZhY2UtPmJhc2UpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpMmMta2V5d2VzdDogY2FuJ3QgbWFwIGludGVmYWNlICFcbiIpOwotCQlrZnJlZShpZmFjZSk7Ci0JCXBtYWNfbG93X2kyY191bmxvY2sobnApOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLSNpZm5kZWYgUE9MTEVEX01PREUKLQlpbml0X3RpbWVyKCZpZmFjZS0+dGltZW91dF90aW1lcik7Ci0JaWZhY2UtPnRpbWVvdXRfdGltZXIuZnVuY3Rpb24gPSBrZXl3ZXN0X3RpbWVvdXQ7Ci0JaWZhY2UtPnRpbWVvdXRfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWlmYWNlOwotI2VuZGlmCi0KLQkvKiBTZWxlY3QgaW50ZXJmYWNlIHJhdGUgKi8KLQlpZmFjZS0+Y3VyX21vZGUgPSBLV19JMkNfTU9ERV8xMDBLSFo7Ci0JcHJhdGUgPSAodTMyICopZ2V0X3Byb3BlcnR5KG5wLCAiQUFQTCxpMmMtcmF0ZSIsIE5VTEwpOwotCWlmIChwcmF0ZSkgc3dpdGNoKCpwcmF0ZSkgewotCWNhc2UgMTAwOgotCQlpZmFjZS0+Y3VyX21vZGUgPSBLV19JMkNfTU9ERV8xMDBLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNTA6Ci0JCWlmYWNlLT5jdXJfbW9kZSA9IEtXX0kyQ19NT0RFXzUwS0haOwotCQlicmVhazsKLQljYXNlIDI1OgotCQlpZmFjZS0+Y3VyX21vZGUgPSBLV19JMkNfTU9ERV8yNUtIWjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaTJjLWtleXdlc3Q6IHVua25vd24gcmF0ZSAlbGRLaHosIHVzaW5nIDEwMEtIelxuIiwKLQkJICAgICAgIChsb25nKSpwcmF0ZSk7Ci0JfQotCQotCS8qIFNlbGVjdCBzdGFuZGFyZCBtb2RlIGJ5IGRlZmF1bHQgKi8KLQlpZmFjZS0+Y3VyX21vZGUgfD0gS1dfSTJDX01PREVfU1RBTkRBUkQ7Ci0JCi0JLyogV3JpdGUgbW9kZSAqLwotCXdyaXRlX3JlZyhyZWdfbW9kZSwgaWZhY2UtPmN1cl9tb2RlKTsKLQkKLQkvKiBTd2l0Y2ggaW50ZXJydXB0cyBvZmYgJiBjbGVhciB0aGVtKi8KLQl3cml0ZV9yZWcocmVnX2llciwgMHgwMCk7Ci0Jd3JpdGVfcmVnKHJlZ19pc3IsIEtXX0kyQ19JUlFfTUFTSyk7Ci0KLSNpZm5kZWYgUE9MTEVEX01PREUKLQkvKiBSZXF1ZXN0IGNoaXAgaW50ZXJydXB0ICovCQotCXJjID0gcmVxdWVzdF9pcnEoaWZhY2UtPmlycSwga2V5d2VzdF9pcnEsIFNBX0lOVEVSUlVQVCwgImtleXdlc3QgaTJjIiwgaWZhY2UpOwotCWlmIChyYykgewotCQlwcmludGsoS0VSTl9FUlIgImkyYy1rZXl3ZXN0OiBjYW4ndCBnZXQgSVJRICVkICFcbiIsIGlmYWNlLT5pcnEpOwotCQlpb3VubWFwKGlmYWNlLT5iYXNlKTsKLQkJa2ZyZWUoaWZhY2UpOwotCQlwbWFjX2xvd19pMmNfdW5sb2NrKG5wKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotI2VuZGlmIC8qIFBPTExFRF9NT0RFICovCi0KLQlwbWFjX2xvd19pMmNfdW5sb2NrKG5wKTsKLQlkZXZfc2V0X2RydmRhdGEoZGV2LCBpZmFjZSk7Ci0JCi0JZm9yIChpPTA7IGk8bmNoYW47IGkrKykgewotCQlzdHJ1Y3Qga2V5d2VzdF9jaGFuKiBjaGFuID0gJmlmYWNlLT5jaGFubmVsc1tpXTsKLQkJCi0JCXNwcmludGYoY2hhbi0+YWRhcHRlci5uYW1lLCAiJXMgJWQiLCBucC0+cGFyZW50LT5uYW1lLCBpKTsKLQkJY2hhbi0+aWZhY2UgPSBpZmFjZTsKLQkJY2hhbi0+Y2hhbl9ubyA9IGk7Ci0JCWNoYW4tPmFkYXB0ZXIuYWxnbyA9ICZrZXl3ZXN0X2FsZ29yaXRobTsKLQkJY2hhbi0+YWRhcHRlci5hbGdvX2RhdGEgPSBOVUxMOwotCQljaGFuLT5hZGFwdGVyLmNsaWVudF9yZWdpc3RlciA9IE5VTEw7Ci0JCWNoYW4tPmFkYXB0ZXIuY2xpZW50X3VucmVnaXN0ZXIgPSBOVUxMOwotCQlpMmNfc2V0X2FkYXBkYXRhKCZjaGFuLT5hZGFwdGVyLCBjaGFuKTsKLQkJY2hhbi0+YWRhcHRlci5kZXYucGFyZW50ID0gZGV2OwotCi0JCXJjID0gaTJjX2FkZF9hZGFwdGVyKCZjaGFuLT5hZGFwdGVyKTsKLQkJaWYgKHJjKSB7Ci0JCQlwcmludGsoImkyYy1rZXl3ZXN0LmM6IEFkYXB0ZXIgJXMgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIiwKLQkJCQljaGFuLT5hZGFwdGVyLm5hbWUpOwotCQkJaTJjX3NldF9hZGFwZGF0YSgmY2hhbi0+YWRhcHRlciwgTlVMTCk7Ci0JCX0KLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBLZXlXZXN0IGkyYyBvbiBcIiVzXCIsICVkIGNoYW5uZWwlcywgc3RlcHBpbmc6ICVkIGJpdHNcbiIsCi0JCW5wLT5wYXJlbnQtPm5hbWUsIG5jaGFuLCBuY2hhbiA+IDEgPyAicyIgOiAiIiwgYnN0ZXBzKTsKLQkJCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWRpc3Bvc2VfaWZhY2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBrZXl3ZXN0X2lmYWNlICppZmFjZSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCBpLCByYzsKLQkKLQkvKiBNYWtlIHN1cmUgd2Ugc3RvcCBhbGwgYWN0aXZpdHkgKi8KLQlpZiAocG1hY19sb3dfaTJjX2xvY2soaWZhY2UtPm5vZGUpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotI2lmbmRlZiBQT0xMRURfTU9ERQotCXNwaW5fbG9ja19pcnEoJmlmYWNlLT5sb2NrKTsKLQl3aGlsZSAoaWZhY2UtPnN0YXRlICE9IHN0YXRlX2lkbGUpIHsKLQkJc3Bpbl91bmxvY2tfaXJxKCZpZmFjZS0+bG9jayk7Ci0JCW1zbGVlcCgxMDApOwotCQlzcGluX2xvY2tfaXJxKCZpZmFjZS0+bG9jayk7Ci0JfQotI2VuZGlmIC8qIFBPTExFRF9NT0RFICovCi0JaWZhY2UtPnN0YXRlID0gc3RhdGVfZGVhZDsKLSNpZm5kZWYgUE9MTEVEX01PREUKLQlzcGluX3VubG9ja19pcnEoJmlmYWNlLT5sb2NrKTsKLQlmcmVlX2lycShpZmFjZS0+aXJxLCBpZmFjZSk7Ci0jZW5kaWYgLyogUE9MTEVEX01PREUgKi8KLQotCXBtYWNfbG93X2kyY191bmxvY2soaWZhY2UtPm5vZGUpOwotCi0JLyogUmVsZWFzZSBhbGwgY2hhbm5lbHMgKi8KLQlmb3IgKGk9MDsgaTxpZmFjZS0+Y2hhbl9jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBrZXl3ZXN0X2NoYW4qIGNoYW4gPSAmaWZhY2UtPmNoYW5uZWxzW2ldOwotCQlpZiAoaTJjX2dldF9hZGFwZGF0YSgmY2hhbi0+YWRhcHRlcikgPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlyYyA9IGkyY19kZWxfYWRhcHRlcigmY2hhbi0+YWRhcHRlcik7Ci0JCWkyY19zZXRfYWRhcGRhdGEoJmNoYW4tPmFkYXB0ZXIsIE5VTEwpOwotCQkvKiBXZSBhcmVuJ3QgdGhhdCBwcmVwYXJlZCB0byBkZWFsIHdpdGggdGhpcy4uLiAqLwotCQlpZiAocmMpCi0JCQlwcmludGsoImkyYy1rZXl3ZXN0LmM6IGkyY19kZWxfYWRhcHRlciBmYWlsZWQsIHRoYXQncyBiYWQgIVxuIik7Ci0JfQotCWlvdW5tYXAoaWZhY2UtPmJhc2UpOwotCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOwotCW9mX25vZGVfcHV0KGlmYWNlLT5ub2RlKTsKLQlrZnJlZShpZmFjZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotY3JlYXRlX2lmYWNlX21hY2lvKHN0cnVjdCBtYWNpb19kZXYqIGRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCi17Ci0JcmV0dXJuIGNyZWF0ZV9pZmFjZShkZXYtPm9mZGV2Lm5vZGUsICZkZXYtPm9mZGV2LmRldik7Ci19Ci0KLXN0YXRpYyBpbnQKLWRpc3Bvc2VfaWZhY2VfbWFjaW8oc3RydWN0IG1hY2lvX2RldiogZGV2KQotewotCXJldHVybiBkaXNwb3NlX2lmYWNlKCZkZXYtPm9mZGV2LmRldik7Ci19Ci0KLXN0YXRpYyBpbnQKLWNyZWF0ZV9pZmFjZV9vZl9wbGF0Zm9ybShzdHJ1Y3Qgb2ZfZGV2aWNlKiBkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQotewotCXJldHVybiBjcmVhdGVfaWZhY2UoZGV2LT5ub2RlLCAmZGV2LT5kZXYpOwotfQotCi1zdGF0aWMgaW50Ci1kaXNwb3NlX2lmYWNlX29mX3BsYXRmb3JtKHN0cnVjdCBvZl9kZXZpY2UqIGRldikKLXsKLQlyZXR1cm4gZGlzcG9zZV9pZmFjZSgmZGV2LT5kZXYpOwotfQotCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBpMmNfa2V5d2VzdF9tYXRjaFtdID0gCi17Ci0JewotCS50eXBlCQk9ICJpMmMiLAotCS5jb21wYXRpYmxlCT0gImtleXdlc3QiCi0JfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWFjaW9fZHJpdmVyIGkyY19rZXl3ZXN0X21hY2lvX2RyaXZlciA9IAotewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubmFtZSAJCT0gImkyYy1rZXl3ZXN0IiwKLQkubWF0Y2hfdGFibGUJPSBpMmNfa2V5d2VzdF9tYXRjaCwKLQkucHJvYmUJCT0gY3JlYXRlX2lmYWNlX21hY2lvLAotCS5yZW1vdmUJCT0gZGlzcG9zZV9pZmFjZV9tYWNpbwotfTsKLQotc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgaTJjX2tleXdlc3Rfb2ZfcGxhdGZvcm1fZHJpdmVyID0gCi17Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5uYW1lIAkJPSAiaTJjLWtleXdlc3QiLAotCS5tYXRjaF90YWJsZQk9IGkyY19rZXl3ZXN0X21hdGNoLAotCS5wcm9iZQkJPSBjcmVhdGVfaWZhY2Vfb2ZfcGxhdGZvcm0sCi0JLnJlbW92ZQkJPSBkaXNwb3NlX2lmYWNlX29mX3BsYXRmb3JtCi19OwotCi1zdGF0aWMgaW50IF9faW5pdAotaTJjX2tleXdlc3RfaW5pdCh2b2lkKQotewotCW9mX3JlZ2lzdGVyX2RyaXZlcigmaTJjX2tleXdlc3Rfb2ZfcGxhdGZvcm1fZHJpdmVyKTsKLQltYWNpb19yZWdpc3Rlcl9kcml2ZXIoJmkyY19rZXl3ZXN0X21hY2lvX2RyaXZlcik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0Ci1pMmNfa2V5d2VzdF9jbGVhbnVwKHZvaWQpCi17Ci0Jb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJmkyY19rZXl3ZXN0X29mX3BsYXRmb3JtX2RyaXZlcik7Ci0JbWFjaW9fdW5yZWdpc3Rlcl9kcml2ZXIoJmkyY19rZXl3ZXN0X21hY2lvX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGkyY19rZXl3ZXN0X2luaXQpOwotbW9kdWxlX2V4aXQoaTJjX2tleXdlc3RfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWtleXdlc3QuaCBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMta2V5d2VzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTAyMmUxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMta2V5d2VzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSNpZm5kZWYgX19JMkNfS0VZV0VTVF9IX18KLSNkZWZpbmUgX19JMkNfS0VZV0VTVF9IX18KLQotLyogVGhlIFR1bWJsZXIgYXVkaW8gZXF1YWxpemVyIGNhbiBiZSByZWFsbHkgc2xvdyBzb21ldGltZXMgKi8KLSNkZWZpbmUgUE9MTF9USU1FT1VUCQkoMipIWikKLQotLyogUmVnaXN0ZXIgaW5kaWNlcyAqLwotdHlwZWRlZiBlbnVtIHsKLQlyZWdfbW9kZSA9IDAsCi0JcmVnX2NvbnRyb2wsCi0JcmVnX3N0YXR1cywKLQlyZWdfaXNyLAotCXJlZ19pZXIsCi0JcmVnX2FkZHIsCi0JcmVnX3N1YmFkZHIsCi0JcmVnX2RhdGEKLX0gcmVnX3Q7Ci0KLQotLyogTW9kZSByZWdpc3RlciAqLwotI2RlZmluZSBLV19JMkNfTU9ERV8xMDBLSFoJMHgwMAotI2RlZmluZSBLV19JMkNfTU9ERV81MEtIWgkweDAxCi0jZGVmaW5lIEtXX0kyQ19NT0RFXzI1S0haCTB4MDIKLSNkZWZpbmUgS1dfSTJDX01PREVfRFVNQgkweDAwCi0jZGVmaW5lIEtXX0kyQ19NT0RFX1NUQU5EQVJECTB4MDQKLSNkZWZpbmUgS1dfSTJDX01PREVfU1RBTkRBUkRTVUIJMHgwOAotI2RlZmluZSBLV19JMkNfTU9ERV9DT01CSU5FRAkweDBDCi0jZGVmaW5lIEtXX0kyQ19NT0RFX01PREVfTUFTSwkweDBDCi0jZGVmaW5lIEtXX0kyQ19NT0RFX0NIQU5fTUFTSwkweEYwCi0KLS8qIENvbnRyb2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgS1dfSTJDX0NUTF9BQUsJCTB4MDEKLSNkZWZpbmUgS1dfSTJDX0NUTF9YQUREUgkweDAyCi0jZGVmaW5lIEtXX0kyQ19DVExfU1RPUAkJMHgwNAotI2RlZmluZSBLV19JMkNfQ1RMX1NUQVJUCTB4MDgKLQotLyogU3RhdHVzIHJlZ2lzdGVyICovCi0jZGVmaW5lIEtXX0kyQ19TVEFUX0JVU1kJMHgwMQotI2RlZmluZSBLV19JMkNfU1RBVF9MQVNUX0FBSwkweDAyCi0jZGVmaW5lIEtXX0kyQ19TVEFUX0xBU1RfUlcJMHgwNAotI2RlZmluZSBLV19JMkNfU1RBVF9TREEJCTB4MDgKLSNkZWZpbmUgS1dfSTJDX1NUQVRfU0NMCQkweDEwCi0KLS8qIElFUiAmIElTUiByZWdpc3RlcnMgKi8KLSNkZWZpbmUgS1dfSTJDX0lSUV9EQVRBCQkweDAxCi0jZGVmaW5lIEtXX0kyQ19JUlFfQUREUgkJMHgwMgotI2RlZmluZSBLV19JMkNfSVJRX1NUT1AJCTB4MDQKLSNkZWZpbmUgS1dfSTJDX0lSUV9TVEFSVAkweDA4Ci0jZGVmaW5lIEtXX0kyQ19JUlFfTUFTSwkJMHgwRgotCi0vKiBQaHlzaWNhbCBpbnRlcmZhY2UgKi8KLXN0cnVjdCBrZXl3ZXN0X2lmYWNlCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlCSpub2RlOwotCXZvaWQgX19pb21lbSAqCQliYXNlOwotCXVuc2lnbmVkCQlic3RlcHM7Ci0JaW50CQkJaXJxOwotCXNwaW5sb2NrX3QJCWxvY2s7Ci0Jc3RydWN0IGtleXdlc3RfY2hhbgkqY2hhbm5lbHM7Ci0JdW5zaWduZWQJCWNoYW5fY291bnQ7Ci0JdTgJCQljdXJfbW9kZTsKLQljaGFyCQkJcmVhZF93cml0ZTsKLQl1OAkJCSpkYXRhOwotCXVuc2lnbmVkCQlkYXRhbGVuOwotCWludAkJCXN0YXRlOwotCWludAkJCXJlc3VsdDsKLQlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lb3V0X3RpbWVyOwotCXN0cnVjdCBjb21wbGV0aW9uCWNvbXBsZXRlOwotfTsKLQotZW51bSB7Ci0Jc3RhdGVfaWRsZSwKLQlzdGF0ZV9hZGRyLAotCXN0YXRlX3JlYWQsCi0Jc3RhdGVfd3JpdGUsCi0Jc3RhdGVfc3RvcCwKLQlzdGF0ZV9kZWFkCi19OwotCi0vKiBDaGFubmVsIG9uIGFuIGludGVyZmFjZSAqLwotc3RydWN0IGtleXdlc3RfY2hhbgotewotCXN0cnVjdCBpMmNfYWRhcHRlcglhZGFwdGVyOwotCXN0cnVjdCBrZXl3ZXN0X2lmYWNlKglpZmFjZTsKLQl1bnNpZ25lZAkJY2hhbl9ubzsKLX07Ci0KLS8qIFJlZ2lzdGVyIGFjY2VzcyAqLwotCi1zdGF0aWMgaW5saW5lIHU4IF9fcmVhZF9yZWcoc3RydWN0IGtleXdlc3RfaWZhY2UgKmlmYWNlLCByZWdfdCByZWcpCi17Ci0JcmV0dXJuIGluXzgoaWZhY2UtPmJhc2UKLQkJKyAoKCh1bnNpZ25lZClyZWcpIDw8IGlmYWNlLT5ic3RlcHMpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fd3JpdGVfcmVnKHN0cnVjdCBrZXl3ZXN0X2lmYWNlICppZmFjZSwgcmVnX3QgcmVnLCB1OCB2YWwpCi17Ci0Jb3V0XzgoaWZhY2UtPmJhc2UKLQkJKyAoKCh1bnNpZ25lZClyZWcpIDw8IGlmYWNlLT5ic3RlcHMpLCB2YWwpOwotCSh2b2lkKV9fcmVhZF9yZWcoaWZhY2UsIHJlZ19zdWJhZGRyKTsKLX0KLQotI2RlZmluZSB3cml0ZV9yZWcocmVnLCB2YWwpCV9fd3JpdGVfcmVnKGlmYWNlLCByZWcsIHZhbCkgCi0jZGVmaW5lIHJlYWRfcmVnKHJlZykJCV9fcmVhZF9yZWcoaWZhY2UsIHJlZykgCi0KLQotCi0jZW5kaWYgLyogX19JMkNfS0VZV0VTVF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG1hYy1zbXUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG1hYy1zbXUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlZmU3Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBtYWMtc211LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotLyoKLSAgICBpMmMgU3VwcG9ydCBmb3IgQXBwbGUgU01VIENvbnRyb2xsZXIKLQotICAgIENvcHlyaWdodCAoYykgMjAwNSBCZW5qYW1pbiBIZXJyZW5zY2htaWR0LCBJQk0gQ29ycC4KLSAgICAgICAgICAgICAgICAgICAgICAgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0qLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGFzbS9wcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgotI2luY2x1ZGUgPGFzbS9zbXUuaD4KLQotc3RhdGljIGludCBwcm9iZTsKLQotTU9EVUxFX0FVVEhPUigiQmVuamFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJJMkMgZHJpdmVyIGZvciBBcHBsZSdzIFNNVSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotbW9kdWxlX3BhcmFtKHByb2JlLCBib29sLCAwKTsKLQotCi0vKiBQaHlzaWNhbCBpbnRlcmZhY2UgKi8KLXN0cnVjdCBzbXVfaWZhY2UKLXsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIJYWRhcHRlcjsKLQlzdHJ1Y3QgY29tcGxldGlvbgljb21wbGV0ZTsKLQl1MzIJCQlidXNpZDsKLX07Ci0KLXN0YXRpYyB2b2lkIHNtdV9pMmNfZG9uZShzdHJ1Y3Qgc211X2kyY19jbWQgKmNtZCwgdm9pZCAqbWlzYykKLXsKLQlzdHJ1Y3Qgc211X2lmYWNlCSppZmFjZSA9IG1pc2M7Ci0JY29tcGxldGUoJmlmYWNlLT5jb21wbGV0ZSk7Ci19Ci0KLS8qCi0gKiBTTUJVUy10eXBlIHRyYW5zZmVyIGVudHJ5cG9pbnQKLSAqLwotc3RhdGljIHMzMiBzbXVfc21idXNfeGZlcigJc3RydWN0IGkyY19hZGFwdGVyKglhZGFwLAotCQkJCXUxNgkJCWFkZHIsCi0JCQkJdW5zaWduZWQgc2hvcnQJCWZsYWdzLAotCQkJCWNoYXIJCQlyZWFkX3dyaXRlLAotCQkJCXU4CQkJY29tbWFuZCwKLQkJCQlpbnQJCQlzaXplLAotCQkJCXVuaW9uIGkyY19zbWJ1c19kYXRhKglkYXRhKQotewotCXN0cnVjdCBzbXVfaWZhY2UJKmlmYWNlID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKLQlzdHJ1Y3Qgc211X2kyY19jbWQJY21kOwotCWludAkJCXJjID0gMDsKLQlpbnQJCQlyZWFkID0gKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpOwotCi0JY21kLmluZm8uYnVzID0gaWZhY2UtPmJ1c2lkOwotCWNtZC5pbmZvLmRldmFkZHIgPSAoYWRkciA8PCAxKSB8IChyZWFkID8gMHgwMSA6IDB4MDApOwotCi0JLyogUHJlcGFyZSBkYXRhcyAmIHNlbGVjdCBtb2RlICovCi0Jc3dpdGNoIChzaXplKSB7Ci0gICAgICAgIGNhc2UgSTJDX1NNQlVTX1FVSUNLOgotCQljbWQuaW5mby50eXBlID0gU01VX0kyQ19UUkFOU0ZFUl9TSU1QTEU7Ci0JCWNtZC5pbmZvLmRhdGFsZW4gPSAwOwotCSAgICAJYnJlYWs7Ci0gICAgICAgIGNhc2UgSTJDX1NNQlVTX0JZVEU6Ci0JCWNtZC5pbmZvLnR5cGUgPSBTTVVfSTJDX1RSQU5TRkVSX1NJTVBMRTsKLQkJY21kLmluZm8uZGF0YWxlbiA9IDE7Ci0JCWlmICghcmVhZCkKLQkJCWNtZC5pbmZvLmRhdGFbMF0gPSBkYXRhLT5ieXRlOwotCSAgICAJYnJlYWs7Ci0gICAgICAgIGNhc2UgSTJDX1NNQlVTX0JZVEVfREFUQToKLQkJY21kLmluZm8udHlwZSA9IFNNVV9JMkNfVFJBTlNGRVJfU1REU1VCOwotCQljbWQuaW5mby5kYXRhbGVuID0gMTsKLQkJY21kLmluZm8uc3VibGVuID0gMTsKLQkJY21kLmluZm8uc3ViYWRkclswXSA9IGNvbW1hbmQ7Ci0JCWNtZC5pbmZvLnN1YmFkZHJbMV0gPSAwOwotCQljbWQuaW5mby5zdWJhZGRyWzJdID0gMDsKLQkJaWYgKCFyZWFkKQotCQkJY21kLmluZm8uZGF0YVswXSA9IGRhdGEtPmJ5dGU7Ci0JICAgIAlicmVhazsKLSAgICAgICAgY2FzZSBJMkNfU01CVVNfV09SRF9EQVRBOgotCQljbWQuaW5mby50eXBlID0gU01VX0kyQ19UUkFOU0ZFUl9TVERTVUI7Ci0JCWNtZC5pbmZvLmRhdGFsZW4gPSAyOwotCQljbWQuaW5mby5zdWJsZW4gPSAxOwotCQljbWQuaW5mby5zdWJhZGRyWzBdID0gY29tbWFuZDsKLQkJY21kLmluZm8uc3ViYWRkclsxXSA9IDA7Ci0JCWNtZC5pbmZvLnN1YmFkZHJbMl0gPSAwOwotCQlpZiAoIXJlYWQpIHsKLQkJCWNtZC5pbmZvLmRhdGFbMF0gPSBkYXRhLT5ieXRlICYgMHhmZjsKLQkJCWNtZC5pbmZvLmRhdGFbMV0gPSAoZGF0YS0+Ynl0ZSA+PiA4KSAmIDB4ZmY7Ci0JCX0KLQkJYnJlYWs7Ci0JLyogTm90ZSB0aGF0IHRoZXNlIGFyZSBicm9rZW4gdnMuIHRoZSBleHBlY3RlZCBzbWJ1cyBBUEkgd2hlcmUKLQkgKiBvbiByZWFkcywgdGhlIGxlbmdodCBpcyBhY3R1YWxseSByZXR1cm5lZCBmcm9tIHRoZSBmdW5jdGlvbiwKLQkgKiBidXQgSSB0aGluayB0aGUgY3VycmVudCBBUEkgbWFrZXMgbm8gc2Vuc2UgYW5kIEkgZG9uJ3Qgd2FudAotCSAqIGFueSBkcml2ZXIgdGhhdCBJIGhhdmVuJ3QgdmVyaWZpZWQgZm9yIGNvcnJlY3RuZXNzIHRvIGdvCi0JICogYW55d2hlcmUgbmVhciBhIHBtYWMgaTJjIGJ1cyBhbnl3YXkgLi4uCi0JICovCi0gICAgICAgIGNhc2UgSTJDX1NNQlVTX0JMT0NLX0RBVEE6Ci0JCWNtZC5pbmZvLnR5cGUgPSBTTVVfSTJDX1RSQU5TRkVSX1NURFNVQjsKLQkJY21kLmluZm8uZGF0YWxlbiA9IGRhdGEtPmJsb2NrWzBdICsgMTsKLQkJaWYgKGNtZC5pbmZvLmRhdGFsZW4gPiA2KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICghcmVhZCkKLQkJCW1lbWNweShjbWQuaW5mby5kYXRhLCBkYXRhLT5ibG9jaywgY21kLmluZm8uZGF0YWxlbik7Ci0JCWNtZC5pbmZvLnN1YmxlbiA9IDE7Ci0JCWNtZC5pbmZvLnN1YmFkZHJbMF0gPSBjb21tYW5kOwotCQljbWQuaW5mby5zdWJhZGRyWzFdID0gMDsKLQkJY21kLmluZm8uc3ViYWRkclsyXSA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgSTJDX1NNQlVTX0kyQ19CTE9DS19EQVRBOgotCQljbWQuaW5mby50eXBlID0gU01VX0kyQ19UUkFOU0ZFUl9TVERTVUI7Ci0JCWNtZC5pbmZvLmRhdGFsZW4gPSBkYXRhLT5ibG9ja1swXTsKLQkJaWYgKGNtZC5pbmZvLmRhdGFsZW4gPiA3KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICghcmVhZCkKLQkJCW1lbWNweShjbWQuaW5mby5kYXRhLCAmZGF0YS0+YmxvY2tbMV0sCi0JCQkgICAgICAgY21kLmluZm8uZGF0YWxlbik7Ci0JCWNtZC5pbmZvLnN1YmxlbiA9IDE7Ci0JCWNtZC5pbmZvLnN1YmFkZHJbMF0gPSBjb21tYW5kOwotCQljbWQuaW5mby5zdWJhZGRyWzFdID0gMDsKLQkJY21kLmluZm8uc3ViYWRkclsyXSA9IDA7Ci0JCWJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0JICAgIAlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBUdXJuIGEgc3RhbmRhcmRzdWIgcmVhZCBpbnRvIGEgY29tYmluZWQgbW9kZSBhY2Nlc3MgKi8KLSAJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQgJiYKLQkgICAgY21kLmluZm8udHlwZSA9PSBTTVVfSTJDX1RSQU5TRkVSX1NURFNVQikKLQkJY21kLmluZm8udHlwZSA9IFNNVV9JMkNfVFJBTlNGRVJfQ09NQklORUQ7Ci0KLQkvKiBGaW5pc2ggZmlsbGluZyBjb21tYW5kIGFuZCBzdWJtaXQgaXQgKi8KLQljbWQuZG9uZSA9IHNtdV9pMmNfZG9uZTsKLQljbWQubWlzYyA9IGlmYWNlOwotCXJjID0gc211X3F1ZXVlX2kyYygmY21kKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmaWZhY2UtPmNvbXBsZXRlKTsKLQlyYyA9IGNtZC5zdGF0dXM7Ci0KLQlpZiAoIXJlYWQgfHwgcmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlzd2l0Y2ggKHNpemUpIHsKLSAgICAgICAgY2FzZSBJMkNfU01CVVNfQllURToKLSAgICAgICAgY2FzZSBJMkNfU01CVVNfQllURV9EQVRBOgotCQlkYXRhLT5ieXRlID0gY21kLmluZm8uZGF0YVswXTsKLQkgICAgCWJyZWFrOwotICAgICAgICBjYXNlIEkyQ19TTUJVU19XT1JEX0RBVEE6Ci0JCWRhdGEtPndvcmQgPSAoKHUxNiljbWQuaW5mby5kYXRhWzFdKSA8PCA4OwotCQlkYXRhLT53b3JkIHw9IGNtZC5pbmZvLmRhdGFbMF07Ci0JCWJyZWFrOwotCS8qIE5vdGUgdGhhdCB0aGVzZSBhcmUgYnJva2VuIHZzLiB0aGUgZXhwZWN0ZWQgc21idXMgQVBJIHdoZXJlCi0JICogb24gcmVhZHMsIHRoZSBsZW5naHQgaXMgYWN0dWFsbHkgcmV0dXJuZWQgZnJvbSB0aGUgZnVuY3Rpb24sCi0JICogYnV0IEkgdGhpbmsgdGhlIGN1cnJlbnQgQVBJIG1ha2VzIG5vIHNlbnNlIGFuZCBJIGRvbid0IHdhbnQKLQkgKiBhbnkgZHJpdmVyIHRoYXQgSSBoYXZlbid0IHZlcmlmaWVkIGZvciBjb3JyZWN0bmVzcyB0byBnbwotCSAqIGFueXdoZXJlIG5lYXIgYSBwbWFjIGkyYyBidXMgYW55d2F5IC4uLgotCSAqLwotICAgICAgICBjYXNlIEkyQ19TTUJVU19CTE9DS19EQVRBOgotCWNhc2UgSTJDX1NNQlVTX0kyQ19CTE9DS19EQVRBOgotCQltZW1jcHkoJmRhdGEtPmJsb2NrWzBdLCBjbWQuaW5mby5kYXRhLCBjbWQuaW5mby5kYXRhbGVuKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdTMyCi1zbXVfc21idXNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiBhZGFwdGVyKQotewotCXJldHVybiBJMkNfRlVOQ19TTUJVU19RVUlDSyB8IEkyQ19GVU5DX1NNQlVTX0JZVEUgfAotCSAgICAgICBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgfAotCSAgICAgICBJMkNfRlVOQ19TTUJVU19CTE9DS19EQVRBOwotfQotCi0vKiBGb3Igbm93LCB3ZSBvbmx5IGhhbmRsZSBjb21iaW5lZCBtb2RlIChzbWJ1cykgKi8KLXN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzbXVfYWxnb3JpdGhtID0gewotCS5zbWJ1c194ZmVyCT0gc211X3NtYnVzX3hmZXIsCi0JLmZ1bmN0aW9uYWxpdHkJPSBzbXVfc21idXNfZnVuYywKLX07Ci0KLXN0YXRpYyBpbnQgY3JlYXRlX2lmYWNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgc211X2lmYWNlKiBpZmFjZTsKLQl1MzIgKnJlZywgYnVzaWQ7Ci0JaW50IHJjOwotCi0JcmVnID0gKHUzMiAqKWdldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOwotCWlmIChyZWcgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImkyYy1wbWFjLXNtdTogY2FuJ3QgZmluZCBidXMgbnVtYmVyICFcbiIpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQlidXNpZCA9ICpyZWc7Ci0KLQlpZmFjZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbXVfaWZhY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAoaWZhY2UgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImkyYy1wbWFjLXNtdTogY2FuJ3QgYWxsb2NhdGUgaW50ZWZhY2UgIVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlpbml0X2NvbXBsZXRpb24oJmlmYWNlLT5jb21wbGV0ZSk7Ci0JaWZhY2UtPmJ1c2lkID0gYnVzaWQ7Ci0KLQlkZXZfc2V0X2RydmRhdGEoZGV2LCBpZmFjZSk7Ci0KLQlzcHJpbnRmKGlmYWNlLT5hZGFwdGVyLm5hbWUsICJzbXUtaTJjLSUwMngiLCBidXNpZCk7Ci0JaWZhY2UtPmFkYXB0ZXIuYWxnbyA9ICZzbXVfYWxnb3JpdGhtOwotCWlmYWNlLT5hZGFwdGVyLmFsZ29fZGF0YSA9IE5VTEw7Ci0JaWZhY2UtPmFkYXB0ZXIuY2xpZW50X3JlZ2lzdGVyID0gTlVMTDsKLQlpZmFjZS0+YWRhcHRlci5jbGllbnRfdW5yZWdpc3RlciA9IE5VTEw7Ci0JaTJjX3NldF9hZGFwZGF0YSgmaWZhY2UtPmFkYXB0ZXIsIGlmYWNlKTsKLQlpZmFjZS0+YWRhcHRlci5kZXYucGFyZW50ID0gZGV2OwotCi0JcmMgPSBpMmNfYWRkX2FkYXB0ZXIoJmlmYWNlLT5hZGFwdGVyKTsKLQlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpMmMtcGFtYy1zbXUuYzogQWRhcHRlciAlcyByZWdpc3RyYXRpb24gIgotCQkgICAgICAgImZhaWxlZFxuIiwgaWZhY2UtPmFkYXB0ZXIubmFtZSk7Ci0JCWkyY19zZXRfYWRhcGRhdGEoJmlmYWNlLT5hZGFwdGVyLCBOVUxMKTsKLQl9Ci0KLQlpZiAocHJvYmUpIHsKLQkJdW5zaWduZWQgY2hhciBhZGRyOwotCQlwcmludGsoIlByb2JlOiAiKTsKLQkJZm9yIChhZGRyID0gMHgwMDsgYWRkciA8PSAweDdmOyBhZGRyKyspIHsKLQkJCWlmIChpMmNfc21idXNfeGZlcigmaWZhY2UtPmFkYXB0ZXIsYWRkciwKLQkJCQkJICAgMCwwLDAsSTJDX1NNQlVTX1FVSUNLLE5VTEwpID49IDApCi0JCQkJcHJpbnRrKCIlMDJ4ICIsIGFkZHIpOwotCQl9Ci0JCXByaW50aygiXG4iKTsKLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICJTTVUgaTJjIGJ1cyAleCByZWdpc3RlcmVkXG4iLCBidXNpZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkaXNwb3NlX2lmYWNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgc211X2lmYWNlICppZmFjZSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCByYzsKLQotCXJjID0gaTJjX2RlbF9hZGFwdGVyKCZpZmFjZS0+YWRhcHRlcik7Ci0JaTJjX3NldF9hZGFwZGF0YSgmaWZhY2UtPmFkYXB0ZXIsIE5VTEwpOwotCS8qIFdlIGFyZW4ndCB0aGF0IHByZXBhcmVkIHRvIGRlYWwgd2l0aCB0aGlzLi4uICovCi0JaWYgKHJjKQotCQlwcmludGsoImkyYy1wbWFjLXNtdS5jOiBGYWlsZWQgdG8gcmVtb3ZlIGJ1cyAlcyAhXG4iLAotCQkgICAgICAgaWZhY2UtPmFkYXB0ZXIubmFtZSk7Ci0JZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7Ci0Ja2ZyZWUoaWZhY2UpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCBjcmVhdGVfaWZhY2Vfb2ZfcGxhdGZvcm0oc3RydWN0IG9mX2RldmljZSogZGV2LAotCQkJCSAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKLXsKLQlyZXR1cm4gY3JlYXRlX2lmYWNlKGRldi0+bm9kZSwgJmRldi0+ZGV2KTsKLX0KLQotCi1zdGF0aWMgaW50IGRpc3Bvc2VfaWZhY2Vfb2ZfcGxhdGZvcm0oc3RydWN0IG9mX2RldmljZSogZGV2KQotewotCXJldHVybiBkaXNwb3NlX2lmYWNlKCZkZXYtPmRldik7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgaTJjX3NtdV9tYXRjaFtdID0KLXsKLQl7Ci0JCS5jb21wYXRpYmxlCT0gInNtdS1pMmMiLAotCX0sCi0Je30sCi19Owotc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgaTJjX3NtdV9vZl9wbGF0Zm9ybV9kcml2ZXIgPQotewotCS5uYW1lIAkJPSAiaTJjLXNtdSIsCi0JLm1hdGNoX3RhYmxlCT0gaTJjX3NtdV9tYXRjaCwKLQkucHJvYmUJCT0gY3JlYXRlX2lmYWNlX29mX3BsYXRmb3JtLAotCS5yZW1vdmUJCT0gZGlzcG9zZV9pZmFjZV9vZl9wbGF0Zm9ybQotfTsKLQotCi1zdGF0aWMgaW50IF9faW5pdCBpMmNfcG1hY19zbXVfaW5pdCh2b2lkKQotewotCW9mX3JlZ2lzdGVyX2RyaXZlcigmaTJjX3NtdV9vZl9wbGF0Zm9ybV9kcml2ZXIpOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpMmNfcG1hY19zbXVfY2xlYW51cCh2b2lkKQotewotCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZpMmNfc211X29mX3BsYXRmb3JtX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGkyY19wbWFjX3NtdV9pbml0KTsKLW1vZHVsZV9leGl0KGkyY19wbWFjX3NtdV9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG93ZXJtYWMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG93ZXJtYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjc4NmViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wb3dlcm1hYy5jCkBAIC0wLDAgKzEsMjkwIEBACisvKgorICAgIGkyYyBTdXBwb3J0IGZvciBBcHBsZSBTTVUgQ29udHJvbGxlcgorCisgICAgQ29weXJpZ2h0IChjKSAyMDA1IEJlbmphbWluIEhlcnJlbnNjaG1pZHQsIElCTSBDb3JwLgorICAgICAgICAgICAgICAgICAgICAgICA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vcG1hY19sb3dfaTJjLmg+CisKK01PRFVMRV9BVVRIT1IoIkJlbmphbWluIEhlcnJlbnNjaG1pZHQgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSTJDIGRyaXZlciBmb3IgQXBwbGUgUG93ZXJNYWMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIFNNQlVTLXR5cGUgdHJhbnNmZXIgZW50cnlwb2ludAorICovCitzdGF0aWMgczMyIGkyY19wb3dlcm1hY19zbWJ1c194ZmVyKAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqCWFkYXAsCisJCQkJCXUxNgkJCWFkZHIsCisJCQkJCXVuc2lnbmVkIHNob3J0CQlmbGFncywKKwkJCQkJY2hhcgkJCXJlYWRfd3JpdGUsCisJCQkJCXU4CQkJY29tbWFuZCwKKwkJCQkJaW50CQkJc2l6ZSwKKwkJCQkJdW5pb24gaTJjX3NtYnVzX2RhdGEqCWRhdGEpCit7CisJc3RydWN0IHBtYWNfaTJjX2J1cwkqYnVzID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKKwlpbnQJCQlyYyA9IDA7CisJaW50CQkJcmVhZCA9IChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEKTsKKwlpbnQJCQlhZGRyZGlyID0gKGFkZHIgPDwgMSkgfCByZWFkOworCXU4CQkJbG9jYWxbMl07CisKKwlyYyA9IHBtYWNfaTJjX29wZW4oYnVzLCAwKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXN3aXRjaCAoc2l6ZSkgeworICAgICAgICBjYXNlIEkyQ19TTUJVU19RVUlDSzoKKwkJcmMgPSBwbWFjX2kyY19zZXRtb2RlKGJ1cywgcG1hY19pMmNfbW9kZV9zdGQpOworCQlpZiAocmMpCisJCQlnb3RvIGJhaWw7CisJCXJjID0gcG1hY19pMmNfeGZlcihidXMsIGFkZHJkaXIsIDAsIDAsIE5VTEwsIDApOworCSAgICAJYnJlYWs7CisgICAgICAgIGNhc2UgSTJDX1NNQlVTX0JZVEU6CisJCXJjID0gcG1hY19pMmNfc2V0bW9kZShidXMsIHBtYWNfaTJjX21vZGVfc3RkKTsKKwkJaWYgKHJjKQorCQkJZ290byBiYWlsOworCQlyYyA9IHBtYWNfaTJjX3hmZXIoYnVzLCBhZGRyZGlyLCAwLCAwLCAmZGF0YS0+Ynl0ZSwgMSk7CisJICAgIAlicmVhazsKKyAgICAgICAgY2FzZSBJMkNfU01CVVNfQllURV9EQVRBOgorCQlyYyA9IHBtYWNfaTJjX3NldG1vZGUoYnVzLCByZWFkID8KKwkJCQkgICAgICBwbWFjX2kyY19tb2RlX2NvbWJpbmVkIDoKKwkJCQkgICAgICBwbWFjX2kyY19tb2RlX3N0ZHN1Yik7CisJCWlmIChyYykKKwkJCWdvdG8gYmFpbDsKKwkJcmMgPSBwbWFjX2kyY194ZmVyKGJ1cywgYWRkcmRpciwgMSwgY29tbWFuZCwgJmRhdGEtPmJ5dGUsIDEpOworCSAgICAJYnJlYWs7CisgICAgICAgIGNhc2UgSTJDX1NNQlVTX1dPUkRfREFUQToKKwkJcmMgPSBwbWFjX2kyY19zZXRtb2RlKGJ1cywgcmVhZCA/CisJCQkJICAgICAgcG1hY19pMmNfbW9kZV9jb21iaW5lZCA6CisJCQkJICAgICAgcG1hY19pMmNfbW9kZV9zdGRzdWIpOworCQlpZiAocmMpCisJCQlnb3RvIGJhaWw7CisJCWlmICghcmVhZCkgeworCQkJbG9jYWxbMF0gPSBkYXRhLT53b3JkICYgMHhmZjsKKwkJCWxvY2FsWzFdID0gKGRhdGEtPndvcmQgPj4gOCkgJiAweGZmOworCQl9CisJCXJjID0gcG1hY19pMmNfeGZlcihidXMsIGFkZHJkaXIsIDEsIGNvbW1hbmQsIGxvY2FsLCAyKTsKKwkJaWYgKHJjID09IDAgJiYgcmVhZCkgeworCQkJZGF0YS0+d29yZCA9ICgodTE2KWxvY2FsWzFdKSA8PCA4OworCQkJZGF0YS0+d29yZCB8PSBsb2NhbFswXTsKKwkJfQorCSAgICAJYnJlYWs7CisKKwkvKiBOb3RlIHRoYXQgdGhlc2UgYXJlIGJyb2tlbiB2cy4gdGhlIGV4cGVjdGVkIHNtYnVzIEFQSSB3aGVyZQorCSAqIG9uIHJlYWRzLCB0aGUgbGVuZ2h0IGlzIGFjdHVhbGx5IHJldHVybmVkIGZyb20gdGhlIGZ1bmN0aW9uLAorCSAqIGJ1dCBJIHRoaW5rIHRoZSBjdXJyZW50IEFQSSBtYWtlcyBubyBzZW5zZSBhbmQgSSBkb24ndCB3YW50CisJICogYW55IGRyaXZlciB0aGF0IEkgaGF2ZW4ndCB2ZXJpZmllZCBmb3IgY29ycmVjdG5lc3MgdG8gZ28KKwkgKiBhbnl3aGVyZSBuZWFyIGEgcG1hYyBpMmMgYnVzIGFueXdheSAuLi4KKwkgKgorCSAqIEknbSBhbHNvIG5vdCBjb21wbGV0ZWx5IHN1cmUgd2hhdCBraW5kIG9mIHBoYXNlcyB0byBkbyBiZXR3ZWVuCisJICogdGhlIGFjdHVhbCBjb21tYW5kIGFuZCB0aGUgZGF0YSAod2hhdCBJIGFtIF9zdXBwb3NlZF8gdG8gZG8gdGhhdAorCSAqIGlzKS4gRm9yIG5vdywgSSBhc3N1bWUgd3JpdGVzIGFyZSBhIHNpbmdsZSBzdHJlYW0gYW5kIHJlYWRzIGhhdmUKKwkgKiBhIHJlcGVhdCBzdGFydC9hZGRyIHBoYXNlIChidXQgbm90IHN0b3AgaW4gYmV0d2VlbikKKwkgKi8KKyAgICAgICAgY2FzZSBJMkNfU01CVVNfQkxPQ0tfREFUQToKKwkJcmMgPSBwbWFjX2kyY19zZXRtb2RlKGJ1cywgcmVhZCA/CisJCQkJICAgICAgcG1hY19pMmNfbW9kZV9jb21iaW5lZCA6CisJCQkJICAgICAgcG1hY19pMmNfbW9kZV9zdGRzdWIpOworCQlpZiAocmMpCisJCQlnb3RvIGJhaWw7CisJCXJjID0gcG1hY19pMmNfeGZlcihidXMsIGFkZHJkaXIsIDEsIGNvbW1hbmQsIGRhdGEtPmJsb2NrLAorCQkJCSAgIGRhdGEtPmJsb2NrWzBdICsgMSk7CisKKwkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfSTJDX0JMT0NLX0RBVEE6CisJCXJjID0gcG1hY19pMmNfc2V0bW9kZShidXMsIHJlYWQgPworCQkJCSAgICAgIHBtYWNfaTJjX21vZGVfY29tYmluZWQgOgorCQkJCSAgICAgIHBtYWNfaTJjX21vZGVfc3Rkc3ViKTsKKwkJaWYgKHJjKQorCQkJZ290byBiYWlsOworCQlyYyA9IHBtYWNfaTJjX3hmZXIoYnVzLCBhZGRyZGlyLCAxLCBjb21tYW5kLAorCQkJCSAgIHJlYWQgPyBkYXRhLT5ibG9jayA6ICZkYXRhLT5ibG9ja1sxXSwKKwkJCQkgICBkYXRhLT5ibG9ja1swXSk7CisJCWJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisJICAgIAlyYyA9IC1FSU5WQUw7CisJfQorIGJhaWw6CisJcG1hY19pMmNfY2xvc2UoYnVzKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBHZW5lcmljIGkyYyBtYXN0ZXIgdHJhbnNmZXIgZW50cnlwb2ludC4gVGhpcyBkcml2ZXIgb25seSBzdXBwb3J0IHNpbmdsZQorICogbWVzc2FnZXMgKGZvciAibGFtZSBpMmMiIHRyYW5zZmVycykuIEFueXRoaW5nIGVsc2Ugc2hvdWxkIHVzZSB0aGUgc21idXMKKyAqIGVudHJ5IHBvaW50CisgKi8KK3N0YXRpYyBpbnQgaTJjX3Bvd2VybWFjX21hc3Rlcl94ZmVyKAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsCisJCQkJCXN0cnVjdCBpMmNfbXNnICptc2dzLAorCQkJCQlpbnQgbnVtKQoreworCXN0cnVjdCBwbWFjX2kyY19idXMJKmJ1cyA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CisJaW50CQkJcmMgPSAwOworCWludAkJCXJlYWQ7CisJaW50CQkJYWRkcmRpcjsKKworCWlmIChudW0gIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG1zZ3MtPmZsYWdzICYgSTJDX01fVEVOKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZWFkID0gKG1zZ3MtPmZsYWdzICYgSTJDX01fUkQpICE9IDA7CisJYWRkcmRpciA9IChtc2dzLT5hZGRyIDw8IDEpIHwgcmVhZDsKKwlpZiAobXNncy0+ZmxhZ3MgJiBJMkNfTV9SRVZfRElSX0FERFIpCisJCWFkZHJkaXIgXj0gMTsKKworCXJjID0gcG1hY19pMmNfb3BlbihidXMsIDApOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCXJjID0gcG1hY19pMmNfc2V0bW9kZShidXMsIHBtYWNfaTJjX21vZGVfc3RkKTsKKwlpZiAocmMpCisJCWdvdG8gYmFpbDsKKwlyYyA9IHBtYWNfaTJjX3hmZXIoYnVzLCBhZGRyZGlyLCAwLCAwLCBtc2dzLT5idWYsIG1zZ3MtPmxlbik7CisgYmFpbDoKKwlwbWFjX2kyY19jbG9zZShidXMpOworCXJldHVybiByYyA8IDAgPyByYyA6IG1zZ3MtPmxlbjsKK30KKworc3RhdGljIHUzMiBpMmNfcG93ZXJtYWNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiBhZGFwdGVyKQoreworCXJldHVybiBJMkNfRlVOQ19TTUJVU19RVUlDSyB8IEkyQ19GVU5DX1NNQlVTX0JZVEUgfAorCQlJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgfAorCQlJMkNfRlVOQ19TTUJVU19CTE9DS19EQVRBIHwgSTJDX0ZVTkNfSTJDOworfQorCisvKiBGb3Igbm93LCB3ZSBvbmx5IGhhbmRsZSBzbWJ1cyAqLworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGkyY19wb3dlcm1hY19hbGdvcml0aG0gPSB7CisJLnNtYnVzX3hmZXIJPSBpMmNfcG93ZXJtYWNfc21idXNfeGZlciwKKwkubWFzdGVyX3hmZXIJPSBpMmNfcG93ZXJtYWNfbWFzdGVyX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkJPSBpMmNfcG93ZXJtYWNfZnVuYywKK307CisKKworc3RhdGljIGludCBpMmNfcG93ZXJtYWNfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIJKmFkYXB0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgcG1hY19pMmNfYnVzCSpidXMgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXB0ZXIpOworCWludAkJCXJjOworCisJcmMgPSBpMmNfZGVsX2FkYXB0ZXIoYWRhcHRlcik7CisJcG1hY19pMmNfZGV0YWNoX2FkYXB0ZXIoYnVzLCBhZGFwdGVyKTsKKwlpMmNfc2V0X2FkYXBkYXRhKGFkYXB0ZXIsIE5VTEwpOworCS8qIFdlIGFyZW4ndCB0aGF0IHByZXBhcmVkIHRvIGRlYWwgd2l0aCB0aGlzLi4uICovCisJaWYgKHJjKQorCQlwcmludGsoImkyYy1wb3dlcm1hYy5jOiBGYWlsZWQgdG8gcmVtb3ZlIGJ1cyAlcyAhXG4iLAorCQkgICAgICAgYWRhcHRlci0+bmFtZSk7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisJa2ZyZWUoYWRhcHRlcik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGkyY19wb3dlcm1hY19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBtYWNfaTJjX2J1cyAqYnVzID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXI7CisJY2hhciBuYW1lWzMyXSwgKmJhc2VuYW1lOworCWludCByYzsKKworCWlmIChidXMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBPaywgbm93IHdlIG5lZWQgdG8gbWFrZSB1cCBhIG5hbWUgZm9yIHRoZSBpbnRlcmZhY2UgdGhhdCB3aWxsCisJICogbWF0Y2ggd2hhdCB3ZSB1c2VkIHRvIGRvIGluIHRoZSBwYXN0LCB0aGF0IGlzIGJhc2ljYWxseSB0aGUKKwkgKiBjb250cm9sbGVyJ3MgcGFyZW50IGRldmljZSBub2RlIGZvciBrZXl3ZXN0LiBQTVUgZGlkbid0IGhhdmUgYQorCSAqIG5hbWluZyBjb252ZW50aW9uIGFuZCBTTVUgaGFzIGEgZGlmZmVyZW50IG9uZQorCSAqLworCXN3aXRjaChwbWFjX2kyY19nZXRfdHlwZShidXMpKSB7CisJY2FzZSBwbWFjX2kyY19idXNfa2V5d2VzdDoKKwkJcGFyZW50ID0gb2ZfZ2V0X3BhcmVudChwbWFjX2kyY19nZXRfY29udHJvbGxlcihidXMpKTsKKwkJaWYgKHBhcmVudCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJhc2VuYW1lID0gcGFyZW50LT5uYW1lOworCQlicmVhazsKKwljYXNlIHBtYWNfaTJjX2J1c19wbXU6CisJCWJhc2VuYW1lID0gInBtdSI7CisJCWJyZWFrOworCWNhc2UgcG1hY19pMmNfYnVzX3NtdToKKwkJLyogVGhpcyBpcyBub3Qgd2hhdCB3ZSB1c2VkIHRvIGRvIGJ1dCBJJ20gZml4aW5nIGRyaXZlcnMgYXQKKwkJICogdGhlIHNhbWUgdGltZSBhcyB0aGlzIGNoYW5nZQorCQkgKi8KKwkJYmFzZW5hbWUgPSAic211IjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXNucHJpbnRmKG5hbWUsIDMyLCAiJXMgJWQiLCBiYXNlbmFtZSwgcG1hY19pMmNfZ2V0X2NoYW5uZWwoYnVzKSk7CisJb2Zfbm9kZV9wdXQocGFyZW50KTsKKworCWFkYXB0ZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2FkYXB0ZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYWRhcHRlciA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaTJjLXBvd2VybWFjOiBjYW4ndCBhbGxvY2F0ZSBpbnRlZmFjZSAhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGFkYXB0ZXIpOworCXN0cmNweShhZGFwdGVyLT5uYW1lLCBuYW1lKTsKKwlhZGFwdGVyLT5hbGdvID0gJmkyY19wb3dlcm1hY19hbGdvcml0aG07CisJaTJjX3NldF9hZGFwZGF0YShhZGFwdGVyLCBidXMpOworCWFkYXB0ZXItPmRldi5wYXJlbnQgPSBkZXY7CisJcG1hY19pMmNfYXR0YWNoX2FkYXB0ZXIoYnVzLCBhZGFwdGVyKTsKKwlyYyA9IGkyY19hZGRfYWRhcHRlcihhZGFwdGVyKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpMmMtcG93ZXJtYWM6IEFkYXB0ZXIgJXMgcmVnaXN0cmF0aW9uICIKKwkJICAgICAgICJmYWlsZWRcbiIsIG5hbWUpOworCQlpMmNfc2V0X2FkYXBkYXRhKGFkYXB0ZXIsIE5VTEwpOworCQlwbWFjX2kyY19kZXRhY2hfYWRhcHRlcihidXMsIGFkYXB0ZXIpOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIlBvd2VyTWFjIGkyYyBidXMgJXMgcmVnaXN0ZXJlZFxuIiwgbmFtZSk7CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBpMmNfcG93ZXJtYWNfZHJpdmVyID0geworCS5uYW1lID0gImkyYy1wb3dlcm1hYyIsCisJLmJ1cyA9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUgPSBpMmNfcG93ZXJtYWNfcHJvYmUsCisJLnJlbW92ZSA9IGkyY19wb3dlcm1hY19yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpMmNfcG93ZXJtYWNfaW5pdCh2b2lkKQoreworCWRyaXZlcl9yZWdpc3RlcigmaTJjX3Bvd2VybWFjX2RyaXZlcik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IGkyY19wb3dlcm1hY19jbGVhbnVwKHZvaWQpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmkyY19wb3dlcm1hY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpMmNfcG93ZXJtYWNfaW5pdCk7Cittb2R1bGVfZXhpdChpMmNfcG93ZXJtYWNfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB4YS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEuYwppbmRleCA3MGY3YWI4Li44NmUyMjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB4YS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLmMKQEAgLTg5OSw2ICs4OTksMTIgQEAKIAlzdHJ1Y3QgcHhhX2kyYyAqaTJjID0gYWRhcC0+YWxnb19kYXRhOwogCWludCByZXQsIGk7CiAKKwkvKiBJZiB0aGUgSTJDIGNvbnRyb2xsZXIgaXMgZGlzYWJsZWQgd2UgbmVlZCB0byByZXNldCBpdCAocHJvYmFibHkgZHVlCisgCSAgIHRvIGEgc3VzcGVuZC9yZXN1bWUgZGVzdHJveWluZyBzdGF0ZSkuIFdlIGRvIHRoaXMgaGVyZSBhcyB3ZSBjYW4gdGhlbgorIAkgICBhdm9pZCB3b3JyeWluZyBhYm91dCByZXN1bWluZyB0aGUgY29udHJvbGxlciBiZWZvcmUgaXRzIHVzZXJzLiAqLworCWlmICghKElDUiAmIElDUl9JVUUpKQorCQlpMmNfcHhhX3Jlc2V0KGkyYyk7CisKIAlmb3IgKGkgPSBhZGFwLT5yZXRyaWVzOyBpID49IDA7IGktLSkgewogCQlyZXQgPSBpMmNfcHhhX2RvX3hmZXIoaTJjLCBtc2dzLCBudW0pOwogCQlpZiAocmV0ICE9IEkyQ19SRVRSWSkKQEAgLTkzOSw3ICs5NDUsOSBAQAogc3RhdGljIGludCBpMmNfcHhhX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcHhhX2kyYyAqaTJjID0gJmkyY19weGE7CisjaWZkZWYgQ09ORklHX0kyQ19QWEFfU0xBVkUKIAlzdHJ1Y3QgaTJjX3B4YV9wbGF0Zm9ybV9kYXRhICpwbGF0ID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKyNlbmRpZgogCWludCByZXQ7CiAKICNpZmRlZiBDT05GSUdfUFhBMjd4CkBAIC0xMDI0LDUgKzEwMzIsNyBAQAogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaTJjX3B4YV9kcml2ZXIpOwogfQogCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKIG1vZHVsZV9pbml0KGkyY19hZGFwX3B4YV9pbml0KTsKIG1vZHVsZV9leGl0KGkyY19hZGFwX3B4YV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczNjMjQxMC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKaW5kZXggNThjZmQzMS4uZjdkNDBmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKQEAgLTM0LDEyICszNCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KICNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWlpYy5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2lpYy5oPgpAQCAtNzM4LDcgKzczOCw2IEBACiB7CiAJaWYgKGkyYy0+Y2xrICE9IE5VTEwgJiYgIUlTX0VSUihpMmMtPmNsaykpIHsKIAkJY2xrX2Rpc2FibGUoaTJjLT5jbGspOwotCQljbGtfdW51c2UoaTJjLT5jbGspOwogCQljbGtfcHV0KGkyYy0+Y2xrKTsKIAkJaTJjLT5jbGsgPSBOVUxMOwogCX0KQEAgLTc3OCw3ICs3NzcsNiBAQAogCiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiY2xvY2sgc291cmNlICVwXG4iLCBpMmMtPmNsayk7CiAKLQljbGtfdXNlKGkyYy0+Y2xrKTsKIAljbGtfZW5hYmxlKGkyYy0+Y2xrKTsKIAogCS8qIG1hcCB0aGUgcmVnaXN0ZXJzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy90cHM2NTAxMC5jIGIvZHJpdmVycy9pMmMvY2hpcHMvdHBzNjUwMTAuYwppbmRleCBlNzBiM2RiLi4xYWYzZGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy90cHM2NTAxMC5jCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL3RwczY1MDEwLmMKQEAgLTQ5NCw2ICs0OTQsNyBAQAogewogCXN0cnVjdCB0cHM2NTAxMAkJKnRwczsKIAlpbnQJCQlzdGF0dXM7CisJdW5zaWduZWQgbG9uZwkJaXJxZmxhZ3M7CiAKIAlpZiAodGhlX3RwcykgewogCQlkZXZfZGJnKCZidXMtPmRldiwgIm9ubHkgb25lICVzIGZvciBub3dcbiIsIERSSVZFUl9OQU1FKTsKQEAgLTUyMCwxMyArNTIxLDE0IEBACiAJfQogCiAjaWZkZWYJQ09ORklHX0FSTQorCWlycWZsYWdzID0gU0FfU0FNUExFX1JBTkRPTSB8IFNBX1RSSUdHRVJfTE9XOwogCWlmIChtYWNoaW5lX2lzX29tYXBfaDIoKSkgewogCQl0cHMtPm1vZGVsID0gVFBTNjUwMTA7CiAJCW9tYXBfY2ZnX3JlZyhXNF9HUElPNTgpOwogCQl0cHMtPmlycSA9IE9NQVBfR1BJT19JUlEoNTgpOwogCQlvbWFwX3JlcXVlc3RfZ3Bpbyg1OCk7CiAJCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDU4LCAxKTsKLQkJc2V0X2lycV90eXBlKHRwcy0+aXJxLCBJUlFUX0ZBTExJTkcpOworCQlpcnFmbGFncyB8PSBTQV9UUklHR0VSX0ZBTExJTkc7CiAJfQogCWlmIChtYWNoaW5lX2lzX29tYXBfb3NrKCkpIHsKIAkJdHBzLT5tb2RlbCA9IFRQUzY1MDEwOwpAQCAtNTM0LDcgKzUzNiw3IEBACiAJCXRwcy0+aXJxID0gT01BUF9HUElPX0lSUShPTUFQX01QVUlPKDEpKTsKIAkJb21hcF9yZXF1ZXN0X2dwaW8oT01BUF9NUFVJTygxKSk7CiAJCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKE9NQVBfTVBVSU8oMSksIDEpOwotCQlzZXRfaXJxX3R5cGUodHBzLT5pcnEsIElSUVRfRkFMTElORyk7CisJCWlycWZsYWdzIHw9IFNBX1RSSUdHRVJfRkFMTElORzsKIAl9CiAJaWYgKG1hY2hpbmVfaXNfb21hcF9oMygpKSB7CiAJCXRwcy0+bW9kZWwgPSBUUFM2NTAxMzsKQEAgLTU0MiwxMyArNTQ0LDEyIEBACiAJCS8vIEZJWE1FIHNldCB1cCB0aGlzIGJvYXJkJ3MgSVJRIC4uLgogCX0KICNlbHNlCi0jZGVmaW5lIHNldF9pcnFfdHlwZShudW0sdHJpZ2dlcikJZG97fXdoaWxlKDApCisJaXJxZmxhZ3MgPSBTQV9TQU1QTEVfUkFORE9NOwogI2VuZGlmCiAKIAlpZiAodHBzLT5pcnEgPiAwKSB7Ci0JCXNldF9pcnFfdHlwZSh0cHMtPmlycSwgSVJRVF9MT1cpOwogCQlzdGF0dXMgPSByZXF1ZXN0X2lycSh0cHMtPmlycSwgdHBzNjUwMTBfaXJxLAotCQkJU0FfU0FNUExFX1JBTkRPTSwgRFJJVkVSX05BTUUsIHRwcyk7CisJCQlpcnFmbGFncywgRFJJVkVSX05BTUUsIHRwcyk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQlkZXZfZGJnKCZ0cHMtPmNsaWVudC5kZXYsICJjYW4ndCBnZXQgSVJRICVkLCBlcnIgJWRcbiIsCiAJCQkJCXRwcy0+aXJxLCBzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYyBiL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKaW5kZXggNTJiNzc0Ny4uMGNlNThiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYworKysgYi9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCkBAIC02MywxMyArNjMsNiBAQAogCXJldHVybiByYzsKIH0KIAotc3RydWN0IGJ1c190eXBlIGkyY19idXNfdHlwZSA9IHsKLQkubmFtZSA9CQkiaTJjIiwKLQkubWF0Y2ggPQlpMmNfZGV2aWNlX21hdGNoLAotCS5zdXNwZW5kID0gICAgICBpMmNfYnVzX3N1c3BlbmQsCi0JLnJlc3VtZSA9ICAgICAgIGkyY19idXNfcmVzdW1lLAotfTsKLQogc3RhdGljIGludCBpMmNfZGV2aWNlX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gLUVOT0RFVjsKQEAgLTgwLDYgKzczLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0cnVjdCBidXNfdHlwZSBpMmNfYnVzX3R5cGUgPSB7CisJLm5hbWUgPQkJImkyYyIsCisJLm1hdGNoID0JaTJjX2RldmljZV9tYXRjaCwKKwkucHJvYmUgPQlpMmNfZGV2aWNlX3Byb2JlLAorCS5yZW1vdmUgPQlpMmNfZGV2aWNlX3JlbW92ZSwKKwkuc3VzcGVuZCA9ICAgICAgaTJjX2J1c19zdXNwZW5kLAorCS5yZXN1bWUgPSAgICAgICBpMmNfYnVzX3Jlc3VtZSwKK307CisKIHZvaWQgaTJjX2FkYXB0ZXJfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCA9IGRldl90b19pMmNfYWRhcHRlcihkZXYpOwpAQCAtOTAsOCArOTIsNiBAQAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5uYW1lID0JImkyY19hZGFwdGVyIiwKIAkuYnVzID0gJmkyY19idXNfdHlwZSwKLQkucHJvYmUgPSBpMmNfZGV2aWNlX3Byb2JlLAotCS5yZW1vdmUgPSBpMmNfZGV2aWNlX3JlbW92ZSwKIH07CiAKIHN0YXRpYyB2b2lkIGkyY19hZGFwdGVyX2NsYXNzX2Rldl9yZWxlYXNlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldikKQEAgLTI5NCw4ICsyOTQsNiBAQAogCS8qIGFkZCB0aGUgZHJpdmVyIHRvIHRoZSBsaXN0IG9mIGkyYyBkcml2ZXJzIGluIHRoZSBkcml2ZXIgY29yZSAqLwogCWRyaXZlci0+ZHJpdmVyLm93bmVyID0gb3duZXI7CiAJZHJpdmVyLT5kcml2ZXIuYnVzID0gJmkyY19idXNfdHlwZTsKLQlkcml2ZXItPmRyaXZlci5wcm9iZSA9IGkyY19kZXZpY2VfcHJvYmU7Ci0JZHJpdmVyLT5kcml2ZXIucmVtb3ZlID0gaTJjX2RldmljZV9yZW1vdmU7CiAKIAlyZXMgPSBkcml2ZXJfcmVnaXN0ZXIoJmRyaXZlci0+ZHJpdmVyKTsKIAlpZiAocmVzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWNkLmMgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwppbmRleCBkMzExMTdlLi4zMzI1NjYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtY2QuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwpAQCAtOTgwLDcgKzk4MCw3IEBACiAgKiBhbmQgYXR0ZW1wdCB0byByZWNvdmVyIGlmIHRoZXJlIGFyZSBwcm9ibGVtcy4gIFJldHVybnMgIDAgaWYgZXZlcnl0aGluZydzCiAgKiBvazsgbm9uemVybyBpZiB0aGUgcmVxdWVzdCBoYXMgYmVlbiB0ZXJtaW5hdGVkLgogICovCi1zdGF0aWMgaW5saW5lCitzdGF0aWMKIGludCBjZHJvbV9yZWFkX2NoZWNrX2lyZWFzb24gKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGxlbiwgaW50IGlyZWFzb24pCiB7CiAJaWYgKGlyZWFzb24gPT0gMikKQEAgLTEzMzIsOCArMTMzMiw2IEBACiAJaWYgKGNkcm9tX3JlYWRfZnJvbV9idWZmZXIoZHJpdmUpKQogCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAKLQlibGtfYXR0ZW1wdF9yZW1lcmdlKGRyaXZlLT5xdWV1ZSwgcnEpOwotCiAJLyogQ2xlYXIgdGhlIGxvY2FsIHNlY3RvciBidWZmZXIuICovCiAJaW5mby0+bnNlY3RvcnNfYnVmZmVyZWQgPSAwOwogCkBAIC0xNTQxLDcgKzE1MzksNyBAQAogLyoKICAqIFdyaXRlIGhhbmRsaW5nCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNkcm9tX3dyaXRlX2NoZWNrX2lyZWFzb24oaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgbGVuLCBpbnQgaXJlYXNvbikKK3N0YXRpYyBpbnQgY2Ryb21fd3JpdGVfY2hlY2tfaXJlYXNvbihpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBsZW4sIGludCBpcmVhc29uKQogewogCS8qIFR3byBub3RlcyBhYm91dCBJREUgaW50ZXJydXB0IHJlYXNvbiBoZXJlIC0gMCBtZWFucyB0aGF0CiAJICogdGhlIGRyaXZlIHdhbnRzIHRvIHJlY2VpdmUgZGF0YSBmcm9tIHVzLCAyIG1lYW5zIHRoYXQKQEAgLTE4NzQsMTQgKzE4NzIsNiBAQAogCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAJfQogCi0JLyoKLQkgKiBmb3IgZHZkLXJhbSBhbmQgc3VjaCBtZWRpYSwgaXQncyBhIHJlYWxseSBiaWcgZGVhbCB0byBnZXQKLQkgKiBiaWcgd3JpdGVzIGFsbCB0aGUgdGltZS4gc28gc2NvdXIgdGhlIHF1ZXVlIGFuZCBhdHRlbXB0IHRvCi0JICogcmVtZXJnZSByZXF1ZXN0cywgb2Z0ZW4gdGhlIHBsdWdnaW5nIHdpbGwgbm90IGhhdmUgaGFkIHRpbWUKLQkgKiB0byBkbyB0aGlzIHByb3Blcmx5Ci0JICovCi0JYmxrX2F0dGVtcHRfcmVtZXJnZShkcml2ZS0+cXVldWUsIHJxKTsKLQogCWluZm8tPm5zZWN0b3JzX2J1ZmZlcmVkID0gMDsKIAogCS8qIHVzZSBkbWEsIGlmIHBvc3NpYmxlLiB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIG1vcmUsIHNpbmNlIHdlCkBAIC0yOTA1LDYgKzI4OTUsOCBAQAogCQlkZXZpbmZvLT5tYXNrIHw9IENEQ19DTE9TRV9UUkFZOwogCWlmICghQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+bW9fZHJpdmUpCiAJCWRldmluZm8tPm1hc2sgfD0gQ0RDX01PX0RSSVZFOworCWlmICghQ0RST01fQ09ORklHX0ZMQUdTKGRyaXZlKS0+cmFtKQorCQlkZXZpbmZvLT5tYXNrIHw9IENEQ19SQU07CiAKIAlkZXZpbmZvLT5kaXNrID0gaW5mby0+ZGlzazsKIAlyZXR1cm4gcmVnaXN0ZXJfY2Ryb20oZGV2aW5mbyk7CkBAIC0zMjY0LDkgKzMyNTYsOCBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgaWRlX2NkX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBpZGVfY2RfcmVtb3ZlKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0b19pZGVfZGV2aWNlKGRldik7CiAJc3RydWN0IGNkcm9tX2luZm8gKmluZm8gPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CiAKIAlpZGVfdW5yZWdpc3Rlcl9zdWJkcml2ZXIoZHJpdmUsIGluZm8tPmRyaXZlcik7CkBAIC0zMjc0LDggKzMyNjUsNiBAQAogCWRlbF9nZW5kaXNrKGluZm8tPmRpc2spOwogCiAJaWRlX2NkX3B1dChpbmZvKTsKLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBpZGVfY2RfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKQEAgLTMyOTksNyArMzI4OCw3IEBACiAJa2ZyZWUoaW5mbyk7CiB9CiAKLXN0YXRpYyBpbnQgaWRlX2NkX3Byb2JlKHN0cnVjdCBkZXZpY2UgKik7CitzdGF0aWMgaW50IGlkZV9jZF9wcm9iZShpZGVfZHJpdmVfdCAqKTsKIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBzdGF0aWMgaW50IHByb2NfaWRlY2RfcmVhZF9jYXBhY2l0eQpAQCAtMzMyNSw5ICszMzE0LDkgQEAKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkubmFtZQkJPSAiaWRlLWNkcm9tIiwKIAkJLmJ1cwkJPSAmaWRlX2J1c190eXBlLAotCQkucHJvYmUJCT0gaWRlX2NkX3Byb2JlLAotCQkucmVtb3ZlCQk9IGlkZV9jZF9yZW1vdmUsCiAJfSwKKwkucHJvYmUJCQk9IGlkZV9jZF9wcm9iZSwKKwkucmVtb3ZlCQkJPSBpZGVfY2RfcmVtb3ZlLAogCS52ZXJzaW9uCQk9IElERUNEX1ZFUlNJT04sCiAJLm1lZGlhCQkJPSBpZGVfY2Ryb20sCiAJLnN1cHBvcnRzX2RzY19vdmVybGFwCT0gMSwKQEAgLTM0MjEsOSArMzQxMCw4IEBACiBtb2R1bGVfcGFyYW0oaWdub3JlLCBjaGFycCwgMDQwMCk7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkFUQVBJIENELVJPTSBEcml2ZXIiKTsKIAotc3RhdGljIGludCBpZGVfY2RfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBpZGVfY2RfcHJvYmUoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRvX2lkZV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgY2Ryb21faW5mbyAqaW5mbzsKIAlzdHJ1Y3QgZ2VuZGlzayAqZzsKIAlzdHJ1Y3QgcmVxdWVzdF9zZW5zZSBzZW5zZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMgYi9kcml2ZXJzL2lkZS9pZGUtZGlzay5jCmluZGV4IDRiNDQxNzIuLmNhMjVmOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWRpc2suYwpAQCAtNDc3LDcgKzQ3Nyw3IEBACiAJICAgICAgICYmIGlkLT5sYmFfY2FwYWNpdHlfMjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGlkZWRpc2tfY2hlY2tfaHBhKGlkZV9kcml2ZV90ICpkcml2ZSkKK3N0YXRpYyB2b2lkIGlkZWRpc2tfY2hlY2tfaHBhKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAl1bnNpZ25lZCBsb25nIGxvbmcgY2FwYWNpdHksIHNldF9tYXg7CiAJaW50IGxiYTQ4ID0gaWRlZGlza19zdXBwb3J0c19sYmE0OChkcml2ZS0+aWQpOwpAQCAtOTk3LDkgKzk5Nyw4IEBACiAJCXByaW50ayhLRVJOX0lORk8gIiVzOiB3Y2FjaGUgZmx1c2ggZmFpbGVkIVxuIiwgZHJpdmUtPm5hbWUpOwogfQogCi1zdGF0aWMgaW50IGlkZV9kaXNrX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBpZGVfZGlza19yZW1vdmUoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRvX2lkZV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgaWRlX2Rpc2tfb2JqICppZGtwID0gZHJpdmUtPmRyaXZlcl9kYXRhOwogCXN0cnVjdCBnZW5kaXNrICpnID0gaWRrcC0+ZGlzazsKIApAQCAtMTAxMCw4ICsxMDA5LDYgQEAKIAlpZGVfY2FjaGVmbHVzaF9wKGRyaXZlKTsKIAogCWlkZV9kaXNrX3B1dChpZGtwKTsKLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBpZGVfZGlza19yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQpAQCAtMTAyNywxMiArMTAyNCwxMCBAQAogCWtmcmVlKGlka3ApOwogfQogCi1zdGF0aWMgaW50IGlkZV9kaXNrX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGlkZV9kaXNrX3Byb2JlKGlkZV9kcml2ZV90ICpkcml2ZSk7CiAKLXN0YXRpYyB2b2lkIGlkZV9kZXZpY2Vfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHZvaWQgaWRlX2RldmljZV9zaHV0ZG93bihpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2RyaXZlX3QgKmRyaXZlID0gY29udGFpbmVyX29mKGRldiwgaWRlX2RyaXZlX3QsIGdlbmRldik7Ci0KICNpZmRlZglDT05GSUdfQUxQSEEKIAkvKiBPbiBBbHBoYSwgaGFsdCg4KSBkb2Vzbid0IGFjdHVhbGx5IHR1cm4gdGhlIG1hY2hpbmUgb2ZmLAogCSAgIGl0IHB1dHMgeW91IGludG8gdGhlIHNvcnQgb2YgZmlybXdhcmUgbW9uaXRvci4gVHlwaWNhbGx5LApAQCAtMTA1NCw3ICsxMDQ5LDcgQEAKIAl9CiAKIAlwcmludGsoIlNodXRkb3duOiAlc1xuIiwgZHJpdmUtPm5hbWUpOwotCWRldi0+YnVzLT5zdXNwZW5kKGRldiwgUE1TR19TVVNQRU5EKTsKKwlkcml2ZS0+Z2VuZGV2LmJ1cy0+c3VzcGVuZCgmZHJpdmUtPmdlbmRldiwgUE1TR19TVVNQRU5EKTsKIH0KIAogc3RhdGljIGlkZV9kcml2ZXJfdCBpZGVkaXNrX2RyaXZlciA9IHsKQEAgLTEwNjIsMTAgKzEwNTcsMTAgQEAKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkubmFtZQkJPSAiaWRlLWRpc2siLAogCQkuYnVzCQk9ICZpZGVfYnVzX3R5cGUsCi0JCS5wcm9iZQkJPSBpZGVfZGlza19wcm9iZSwKLQkJLnJlbW92ZQkJPSBpZGVfZGlza19yZW1vdmUsCi0JCS5zaHV0ZG93bgk9IGlkZV9kZXZpY2Vfc2h1dGRvd24sCiAJfSwKKwkucHJvYmUJCQk9IGlkZV9kaXNrX3Byb2JlLAorCS5yZW1vdmUJCQk9IGlkZV9kaXNrX3JlbW92ZSwKKwkuc2h1dGRvd24JCT0gaWRlX2RldmljZV9zaHV0ZG93biwKIAkudmVyc2lvbgkJPSBJREVESVNLX1ZFUlNJT04sCiAJLm1lZGlhCQkJPSBpZGVfZGlzaywKIAkuc3VwcG9ydHNfZHNjX292ZXJsYXAJPSAwLApAQCAtMTEzMCw2ICsxMTI1LDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaWRlZGlza19nZXRnZW8oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8pCit7CisJc3RydWN0IGlkZV9kaXNrX29iaiAqaWRrcCA9IGlkZV9kaXNrX2coYmRldi0+YmRfZGlzayk7CisJaWRlX2RyaXZlX3QgKmRyaXZlID0gaWRrcC0+ZHJpdmU7CisKKwlnZW8tPmhlYWRzID0gZHJpdmUtPmJpb3NfaGVhZDsKKwlnZW8tPnNlY3RvcnMgPSBkcml2ZS0+Ymlvc19zZWN0OworCWdlby0+Y3lsaW5kZXJzID0gKHUxNilkcml2ZS0+Ymlvc19jeWw7IC8qIHRydW5jYXRlICovCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgaWRlZGlza19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewpAQCAtMTE2NCwxNSArMTE3MCwxNSBAQAogCS5vcGVuCQk9IGlkZWRpc2tfb3BlbiwKIAkucmVsZWFzZQk9IGlkZWRpc2tfcmVsZWFzZSwKIAkuaW9jdGwJCT0gaWRlZGlza19pb2N0bCwKKwkuZ2V0Z2VvCQk9IGlkZWRpc2tfZ2V0Z2VvLAogCS5tZWRpYV9jaGFuZ2VkCT0gaWRlZGlza19tZWRpYV9jaGFuZ2VkLAogCS5yZXZhbGlkYXRlX2Rpc2s9IGlkZWRpc2tfcmV2YWxpZGF0ZV9kaXNrCiB9OwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIkFUQSBESVNLIERyaXZlciIpOwogCi1zdGF0aWMgaW50IGlkZV9kaXNrX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgaWRlX2Rpc2tfcHJvYmUoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRvX2lkZV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgaWRlX2Rpc2tfb2JqICppZGtwOwogCXN0cnVjdCBnZW5kaXNrICpnOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMgYi9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMKaW5kZXggZmJhM2ZmZi4uMWY4ZGI5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYwpAQCAtMTg3MSw5ICsxODcxLDggQEAKIAlpZGVmbG9wcHlfYWRkX3NldHRpbmdzKGRyaXZlKTsKIH0KIAotc3RhdGljIGludCBpZGVfZmxvcHB5X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBpZGVfZmxvcHB5X3JlbW92ZShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2RyaXZlX3QgKmRyaXZlID0gdG9faWRlX2RldmljZShkZXYpOwogCWlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5ID0gZHJpdmUtPmRyaXZlcl9kYXRhOwogCXN0cnVjdCBnZW5kaXNrICpnID0gZmxvcHB5LT5kaXNrOwogCkBAIC0xODgyLDggKzE4ODEsNiBAQAogCWRlbF9nZW5kaXNrKGcpOwogCiAJaWRlX2Zsb3BweV9wdXQoZmxvcHB5KTsKLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBpZGVfZmxvcHB5X3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCkBAIC0xOTIyLDE2ICsxOTE5LDE2IEBACiAKICNlbmRpZgkvKiBDT05GSUdfUFJPQ19GUyAqLwogCi1zdGF0aWMgaW50IGlkZV9mbG9wcHlfcHJvYmUoc3RydWN0IGRldmljZSAqKTsKK3N0YXRpYyBpbnQgaWRlX2Zsb3BweV9wcm9iZShpZGVfZHJpdmVfdCAqKTsKIAogc3RhdGljIGlkZV9kcml2ZXJfdCBpZGVmbG9wcHlfZHJpdmVyID0gewogCS5nZW5fZHJpdmVyID0gewogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJCS5uYW1lCQk9ICJpZGUtZmxvcHB5IiwKIAkJLmJ1cwkJPSAmaWRlX2J1c190eXBlLAotCQkucHJvYmUJCT0gaWRlX2Zsb3BweV9wcm9iZSwKLQkJLnJlbW92ZQkJPSBpZGVfZmxvcHB5X3JlbW92ZSwKIAl9LAorCS5wcm9iZQkJCT0gaWRlX2Zsb3BweV9wcm9iZSwKKwkucmVtb3ZlCQkJPSBpZGVfZmxvcHB5X3JlbW92ZSwKIAkudmVyc2lvbgkJPSBJREVGTE9QUFlfVkVSU0lPTiwKIAkubWVkaWEJCQk9IGlkZV9mbG9wcHksCiAJLnN1cHBvcnRzX2RzY19vdmVybGFwCT0gMCwKQEAgLTIwMzEsNiArMjAyOCwxNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGlkZWZsb3BweV9nZXRnZW8oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8pCit7CisJc3RydWN0IGlkZV9mbG9wcHlfb2JqICpmbG9wcHkgPSBpZGVfZmxvcHB5X2coYmRldi0+YmRfZGlzayk7CisJaWRlX2RyaXZlX3QgKmRyaXZlID0gZmxvcHB5LT5kcml2ZTsKKworCWdlby0+aGVhZHMgPSBkcml2ZS0+Ymlvc19oZWFkOworCWdlby0+c2VjdG9ycyA9IGRyaXZlLT5iaW9zX3NlY3Q7CisJZ2VvLT5jeWxpbmRlcnMgPSAodTE2KWRyaXZlLT5iaW9zX2N5bDsgLyogdHJ1bmNhdGUgKi8KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBpZGVmbG9wcHlfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKQEAgLTIxMjAsMTMgKzIxMjgsMTMgQEAKIAkub3BlbgkJPSBpZGVmbG9wcHlfb3BlbiwKIAkucmVsZWFzZQk9IGlkZWZsb3BweV9yZWxlYXNlLAogCS5pb2N0bAkJPSBpZGVmbG9wcHlfaW9jdGwsCisJLmdldGdlbwkJPSBpZGVmbG9wcHlfZ2V0Z2VvLAogCS5tZWRpYV9jaGFuZ2VkCT0gaWRlZmxvcHB5X21lZGlhX2NoYW5nZWQsCiAJLnJldmFsaWRhdGVfZGlzaz0gaWRlZmxvcHB5X3JldmFsaWRhdGVfZGlzawogfTsKIAotc3RhdGljIGludCBpZGVfZmxvcHB5X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgaWRlX2Zsb3BweV9wcm9iZShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2RyaXZlX3QgKmRyaXZlID0gdG9faWRlX2RldmljZShkZXYpOwogCWlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5OwogCXN0cnVjdCBnZW5kaXNrICpnOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtaW8uYyBiL2RyaXZlcnMvaWRlL2lkZS1pby5jCmluZGV4IGI1ZGM2ZGYuLjhkNTBkZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1pby5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1pby5jCkBAIC04MywxNSArODMsMTIgQEAKIAogCWlmICghZW5kX3RoYXRfcmVxdWVzdF9maXJzdChycSwgdXB0b2RhdGUsIG5yX3NlY3RvcnMpKSB7CiAJCWFkZF9kaXNrX3JhbmRvbW5lc3MocnEtPnJxX2Rpc2spOwotCi0JCWlmIChibGtfcnFfdGFnZ2VkKHJxKSkKLQkJCWJsa19xdWV1ZV9lbmRfdGFnKGRyaXZlLT5xdWV1ZSwgcnEpOwotCiAJCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QocnEpOwogCQlIV0dST1VQKGRyaXZlKS0+cnEgPSBOVUxMOwogCQllbmRfdGhhdF9yZXF1ZXN0X2xhc3QocnEsIHVwdG9kYXRlKTsKIAkJcmV0ID0gMDsKIAl9CisKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChfX2lkZV9lbmRfcmVxdWVzdCk7CkBAIC0xMTMsNiArMTEwLDEwIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0ID0gMTsKIAorCS8qCisJICogcm9vbSBmb3IgbG9ja2luZyBpbXByb3ZlbWVudHMgaGVyZSwgdGhlIGNhbGxzIGJlbG93IGRvbid0CisJICogbmVlZCB0aGUgcXVldWUgbG9jayBoZWxkIGF0IGFsbAorCSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOwogCXJxID0gSFdHUk9VUChkcml2ZSktPnJxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtcHJvYmUuYyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCmluZGV4IDAyMTY3YTUuLmU3NDI1NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCkBAIC02NTUsNyArNjU1LDcgQEAKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gY29udGFpbmVyX29mKGRldiwgaWRlX2h3aWZfdCwgZ2VuZGV2KTsKIAotCXVwKCZod2lmLT5nZW5kZXZfcmVsX3NlbSk7CisJY29tcGxldGUoJmh3aWYtPmdlbmRldl9yZWxfY29tcCk7CiB9CiAKIHN0YXRpYyB2b2lkIGh3aWZfcmVnaXN0ZXIgKGlkZV9od2lmX3QgKmh3aWYpCkBAIC0xMzI1LDcgKzEzMjUsNyBAQAogCWRyaXZlLT5xdWV1ZSA9IE5VTEw7CiAJc3Bpbl91bmxvY2tfaXJxKCZpZGVfbG9jayk7CiAKLQl1cCgmZHJpdmUtPmdlbmRldl9yZWxfc2VtKTsKKwljb21wbGV0ZSgmZHJpdmUtPmdlbmRldl9yZWxfY29tcCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jIGIvZHJpdmVycy9pZGUvaWRlLXRhcGUuYwppbmRleCBmYWI5YjJiLi4wMTAxZDBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMKQEAgLTQ2ODIsOSArNDY4Miw4IEBACiAJaWRldGFwZV9hZGRfc2V0dGluZ3MoZHJpdmUpOwogfQogCi1zdGF0aWMgaW50IGlkZV90YXBlX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBpZGVfdGFwZV9yZW1vdmUoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRvX2lkZV9kZXZpY2UoZGV2KTsKIAlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKIAogCWlkZV91bnJlZ2lzdGVyX3N1YmRyaXZlcihkcml2ZSwgdGFwZS0+ZHJpdmVyKTsKQEAgLTQ2OTIsOCArNDY5MSw2IEBACiAJaWRlX3VucmVnaXN0ZXJfcmVnaW9uKHRhcGUtPmRpc2spOwogCiAJaWRlX3RhcGVfcHV0KHRhcGUpOwotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGlkZV90YXBlX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCkBAIC00NzQ1LDE2ICs0NzQyLDE2IEBACiAKICNlbmRpZgogCi1zdGF0aWMgaW50IGlkZV90YXBlX3Byb2JlKHN0cnVjdCBkZXZpY2UgKik7CitzdGF0aWMgaW50IGlkZV90YXBlX3Byb2JlKGlkZV9kcml2ZV90ICopOwogCiBzdGF0aWMgaWRlX2RyaXZlcl90IGlkZXRhcGVfZHJpdmVyID0gewogCS5nZW5fZHJpdmVyID0gewogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJCS5uYW1lCQk9ICJpZGUtdGFwZSIsCiAJCS5idXMJCT0gJmlkZV9idXNfdHlwZSwKLQkJLnByb2JlCQk9IGlkZV90YXBlX3Byb2JlLAotCQkucmVtb3ZlCQk9IGlkZV90YXBlX3JlbW92ZSwKIAl9LAorCS5wcm9iZQkJCT0gaWRlX3RhcGVfcHJvYmUsCisJLnJlbW92ZQkJCT0gaWRlX3RhcGVfcmVtb3ZlLAogCS52ZXJzaW9uCQk9IElERVRBUEVfVkVSU0lPTiwKIAkubWVkaWEJCQk9IGlkZV90YXBlLAogCS5zdXBwb3J0c19kc2Nfb3ZlcmxhcCAJPSAxLApAQCAtNDgyNSw5ICs0ODIyLDggQEAKIAkuaW9jdGwJCT0gaWRldGFwZV9pb2N0bCwKIH07CiAKLXN0YXRpYyBpbnQgaWRlX3RhcGVfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBpZGVfdGFwZV9wcm9iZShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2RyaXZlX3QgKmRyaXZlID0gdG9faWRlX2RldmljZShkZXYpOwogCWlkZXRhcGVfdGFwZV90ICp0YXBlOwogCXN0cnVjdCBnZW5kaXNrICpnOwogCWludCBtaW5vcjsKQEAgLTQ4ODMsOSArNDg3OSw5IEBACiAJaWRldGFwZV9zZXR1cChkcml2ZSwgdGFwZSwgbWlub3IpOwogCiAJY2xhc3NfZGV2aWNlX2NyZWF0ZShpZGV0YXBlX3N5c2ZzX2NsYXNzLCBOVUxMLAotCQkJTUtERVYoSURFVEFQRV9NQUpPUiwgbWlub3IpLCBkZXYsICIlcyIsIHRhcGUtPm5hbWUpOworCQkJTUtERVYoSURFVEFQRV9NQUpPUiwgbWlub3IpLCAmZHJpdmUtPmdlbmRldiwgIiVzIiwgdGFwZS0+bmFtZSk7CiAJY2xhc3NfZGV2aWNlX2NyZWF0ZShpZGV0YXBlX3N5c2ZzX2NsYXNzLCBOVUxMLAotCQkJTUtERVYoSURFVEFQRV9NQUpPUiwgbWlub3IgKyAxMjgpLCBkZXYsICJuJXMiLCB0YXBlLT5uYW1lKTsKKwkJCU1LREVWKElERVRBUEVfTUFKT1IsIG1pbm9yICsgMTI4KSwgJmRyaXZlLT5nZW5kZXYsICJuJXMiLCB0YXBlLT5uYW1lKTsKIAogCWRldmZzX21rX2NkZXYoTUtERVYoSFdJRihkcml2ZSktPm1ham9yLCBtaW5vciksCiAJCQlTX0lGQ0hSIHwgU19JUlVHTyB8IFNfSVdVR08sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtdGFza2ZpbGUuYyBiL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jCmluZGV4IDYyZWJlZmQuLjk4MzRkY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jCkBAIC0zMDgsNyArMzA4LDcgQEAKIAkJaWRlX3Bpb19zZWN0b3IoZHJpdmUsIHdyaXRlKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGlkZV9waW9fZGF0YWJsb2NrKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxLAorc3RhdGljIHZvaWQgaWRlX3Bpb19kYXRhYmxvY2soaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgd3JpdGUpCiB7CiAJaWYgKHJxLT5iaW8pCS8qIGZzIHJlcXVlc3QgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS5jIGIvZHJpdmVycy9pZGUvaWRlLmMKaW5kZXggNGI1MjRmNi4uYWZlYjAyYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS5jCkBAIC0yMjIsNyArMjIyLDcgQEAKIAlod2lmLT5td2RtYV9tYXNrID0gMHg4MDsJLyogZGlzYWJsZSBhbGwgbXdkbWEgKi8KIAlod2lmLT5zd2RtYV9tYXNrID0gMHg4MDsJLyogZGlzYWJsZSBhbGwgc3dkbWEgKi8KIAotCXNlbWFfaW5pdCgmaHdpZi0+Z2VuZGV2X3JlbF9zZW0sIDApOworCWluaXRfY29tcGxldGlvbigmaHdpZi0+Z2VuZGV2X3JlbF9jb21wKTsKIAogCWRlZmF1bHRfaHdpZl9pb3BzKGh3aWYpOwogCWRlZmF1bHRfaHdpZl90cmFuc3BvcnQoaHdpZik7CkBAIC0yNDUsNyArMjQ1LDcgQEAKIAkJZHJpdmUtPmlzX2ZsYXNoCQkJPSAwOwogCQlkcml2ZS0+dmRtYQkJCT0gMDsKIAkJSU5JVF9MSVNUX0hFQUQoJmRyaXZlLT5saXN0KTsKLQkJc2VtYV9pbml0KCZkcml2ZS0+Z2VuZGV2X3JlbF9zZW0sIDApOworCQlpbml0X2NvbXBsZXRpb24oJmRyaXZlLT5nZW5kZXZfcmVsX2NvbXApOwogCX0KIH0KIApAQCAtNjAyLDcgKzYwMiw3IEBACiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxKCZpZGVfbG9jayk7CiAJCWRldmljZV91bnJlZ2lzdGVyKCZkcml2ZS0+Z2VuZGV2KTsKLQkJZG93bigmZHJpdmUtPmdlbmRldl9yZWxfc2VtKTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmZHJpdmUtPmdlbmRldl9yZWxfY29tcCk7CiAJCXNwaW5fbG9ja19pcnEoJmlkZV9sb2NrKTsKIAl9CiAJaHdpZi0+cHJlc2VudCA9IDA7CkBAIC02NjIsNyArNjYyLDcgQEAKIAkvKiBNb3JlIG1lc3NlZCB1cCBsb2NraW5nIC4uLiAqLwogCXNwaW5fdW5sb2NrX2lycSgmaWRlX2xvY2spOwogCWRldmljZV91bnJlZ2lzdGVyKCZod2lmLT5nZW5kZXYpOwotCWRvd24oJmh3aWYtPmdlbmRldl9yZWxfc2VtKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZod2lmLT5nZW5kZXZfcmVsX2NvbXApOwogCiAJLyoKIAkgKiBSZW1vdmUgdXMgZnJvbSB0aGUga2VybmVsJ3Mga25vd2xlZGdlCkBAIC0xMjc4LDE5ICsxMjc4LDYgQEAKIAl1cCgmaWRlX3NldHRpbmdfc2VtKTsKIAogCXN3aXRjaCAoY21kKSB7Ci0JCWNhc2UgSERJT19HRVRHRU86Ci0JCXsKLQkJCXN0cnVjdCBoZF9nZW9tZXRyeSBnZW9tOwotCQkJaWYgKCFwIHx8IChkcml2ZS0+bWVkaWEgIT0gaWRlX2Rpc2sgJiYgZHJpdmUtPm1lZGlhICE9IGlkZV9mbG9wcHkpKSByZXR1cm4gLUVJTlZBTDsKLQkJCWdlb20uaGVhZHMgPSBkcml2ZS0+Ymlvc19oZWFkOwotCQkJZ2VvbS5zZWN0b3JzID0gZHJpdmUtPmJpb3Nfc2VjdDsKLQkJCWdlb20uY3lsaW5kZXJzID0gKHUxNilkcml2ZS0+Ymlvc19jeWw7IC8qIHRydW5jYXRlICovCi0JCQlnZW9tLnN0YXJ0ID0gZ2V0X3N0YXJ0X3NlY3QoYmRldik7Ci0JCQlpZiAoY29weV90b191c2VyKHAsICZnZW9tLCBzaXplb2Yoc3RydWN0IGhkX2dlb21ldHJ5KSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCiAJCWNhc2UgSERJT19PQlNPTEVURV9JREVOVElUWToKIAkJY2FzZSBIRElPX0dFVF9JREVOVElUWToKIAkJCWlmIChiZGV2ICE9IGJkZXYtPmJkX2NvbnRhaW5zKQpAQCAtMTk2MiwxMCArMTk0OSw0MSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGdlbmVyaWNfaWRlX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0b19pZGVfZGV2aWNlKGRldik7CisJaWRlX2RyaXZlcl90ICpkcnYgPSB0b19pZGVfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKworCXJldHVybiBkcnYtPnByb2JlID8gZHJ2LT5wcm9iZShkcml2ZSkgOiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGdlbmVyaWNfaWRlX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWRlX2RyaXZlX3QgKmRyaXZlID0gdG9faWRlX2RldmljZShkZXYpOworCWlkZV9kcml2ZXJfdCAqZHJ2ID0gdG9faWRlX2RyaXZlcihkZXYtPmRyaXZlcik7CisKKwlpZiAoZHJ2LT5yZW1vdmUpCisJCWRydi0+cmVtb3ZlKGRyaXZlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnZW5lcmljX2lkZV9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWRlX2RyaXZlX3QgKmRyaXZlID0gdG9faWRlX2RldmljZShkZXYpOworCWlkZV9kcml2ZXJfdCAqZHJ2ID0gdG9faWRlX2RyaXZlcihkZXYtPmRyaXZlcik7CisKKwlpZiAoZGV2LT5kcml2ZXIgJiYgZHJ2LT5zaHV0ZG93bikKKwkJZHJ2LT5zaHV0ZG93bihkcml2ZSk7Cit9CisKIHN0cnVjdCBidXNfdHlwZSBpZGVfYnVzX3R5cGUgPSB7CiAJLm5hbWUJCT0gImlkZSIsCiAJLm1hdGNoCQk9IGlkZV9idXNfbWF0Y2gsCiAJLnVldmVudAkJPSBpZGVfdWV2ZW50LAorCS5wcm9iZQkJPSBnZW5lcmljX2lkZV9wcm9iZSwKKwkucmVtb3ZlCQk9IGdlbmVyaWNfaWRlX3JlbW92ZSwKKwkuc2h1dGRvd24JPSBnZW5lcmljX2lkZV9zaHV0ZG93biwKIAkuZGV2X2F0dHJzCT0gaWRlX2Rldl9hdHRycywKIAkuc3VzcGVuZAk9IGdlbmVyaWNfaWRlX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBnZW5lcmljX2lkZV9yZXN1bWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9sZWdhY3kvaGQuYyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9oZC5jCmluZGV4IDI0MjAyOWMuLjY0MzlkZWM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9sZWdhY3kvaGQuYworKysgYi9kcml2ZXJzL2lkZS9sZWdhY3kvaGQuYwpAQCAtNjU4LDIyICs2NTgsMTQgQEAKIAllbmFibGVfaXJxKEhEX0lSUSk7CiB9CiAKLXN0YXRpYyBpbnQgaGRfaW9jdGwoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSwKLQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgaGRfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKQogewotCXN0cnVjdCBoZF9pX3N0cnVjdCAqZGlzayA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgaGRfZ2VvbWV0cnkgX191c2VyICpsb2MgPSAoc3RydWN0IGhkX2dlb21ldHJ5IF9fdXNlciAqKSBhcmc7Ci0Jc3RydWN0IGhkX2dlb21ldHJ5IGc7IAorCXN0cnVjdCBoZF9pX3N0cnVjdCAqZGlzayA9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKIAotCWlmIChjbWQgIT0gSERJT19HRVRHRU8pCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICghbG9jKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlnLmhlYWRzID0gZGlzay0+aGVhZDsKLQlnLnNlY3RvcnMgPSBkaXNrLT5zZWN0OwotCWcuY3lsaW5kZXJzID0gZGlzay0+Y3lsOwotCWcuc3RhcnQgPSBnZXRfc3RhcnRfc2VjdChpbm9kZS0+aV9iZGV2KTsKLQlyZXR1cm4gY29weV90b191c2VyKGxvYywgJmcsIHNpemVvZiBnKSA/IC1FRkFVTFQgOiAwOyAKKwlnZW8tPmhlYWRzID0gZGlzay0+aGVhZDsKKwlnZW8tPnNlY3RvcnMgPSBkaXNrLT5zZWN0OworCWdlby0+Y3lsaW5kZXJzID0gZGlzay0+Y3lsOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtNjk1LDcgKzY4Nyw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgaGRfZm9wcyA9IHsKLQkuaW9jdGwgPQloZF9pb2N0bCwKKwkuZ2V0Z2VvID0JaGRfZ2V0Z2VvLAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9wZGMyMDJ4eF9uZXcuYyBiL2RyaXZlcnMvaWRlL3BjaS9wZGMyMDJ4eF9uZXcuYwppbmRleCAyMTE2NDFhLi5mZTA2ZWJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvcGRjMjAyeHhfbmV3LmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL3BkYzIwMnh4X25ldy5jCkBAIC0zOSw3ICszOSw3IEBACiAKICNkZWZpbmUgUERDMjAyX0RFQlVHX0NBQkxFCTAKIAotY29uc3Qgc3RhdGljIGNoYXIgKnBkY19xdWlya19kcml2ZXNbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICpwZGNfcXVpcmtfZHJpdmVzW10gPSB7CiAJIlFVQU5UVU0gRklSRUJBTExsY3QwOCAwOCIsCiAJIlFVQU5UVU0gRklSRUJBTExQIEtBNi40IiwKIAkiUVVBTlRVTSBGSVJFQkFMTFAgS0E5LjEiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3NlcnZlcndvcmtzLmMgYi9kcml2ZXJzL2lkZS9wY2kvc2VydmVyd29ya3MuYwppbmRleCBmZjJlMjE3Li4wZDMwNzNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvc2VydmVyd29ya3MuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvc2VydmVyd29ya3MuYwpAQCAtNjksNyArNjksNyBAQAogc3RhdGljIHU4IHN2d2tzX3JhdGVtYXNrIChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldiAgICAgPSBIV0lGKGRyaXZlKS0+cGNpX2RldjsKLQl1OCBtb2RlOworCXU4IG1vZGUgPSAwOwogCiAJaWYgKCFzdndrc19yZXZpc2lvbikKIAkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZzdndrc19yZXZpc2lvbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvdmlhODJjeHh4LmMgYi9kcml2ZXJzL2lkZS9wY2kvdmlhODJjeHh4LmMKaW5kZXggODZmYjFlMC4uYzg1Yjg3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL3ZpYTgyY3h4eC5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS92aWE4MmN4eHguYwpAQCAtNDM5LDcgKzQzOSw3IEBACiAJaHdpZi0+c3BlZWRwcm9jID0gJnZpYV9zZXRfZHJpdmU7CiAKIAotI2lmIGRlZmluZWQoQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNKSAmJiBkZWZpbmVkKENPTkZJR19QUEMzMikKKyNpZiBkZWZpbmVkKENPTkZJR19QUENfQ0hSUCkgJiYgZGVmaW5lZChDT05GSUdfUFBDMzIpCiAJaWYoX21hY2hpbmUgPT0gX01BQ0hfY2hycCAmJiBfY2hycF90eXBlID09IF9DSFJQX1BlZ2Fzb3MpIHsKIAkJaHdpZi0+aXJxID0gaHdpZi0+Y2hhbm5lbCA/IDE1IDogMTQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcHBjL3BtYWMuYyBiL2RyaXZlcnMvaWRlL3BwYy9wbWFjLmMKaW5kZXggMTZiMjgzNS4uNTAxM2IxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcHBjL3BtYWMuYworKysgYi9kcml2ZXJzL2lkZS9wcGMvcG1hYy5jCkBAIC0xMjcxLDcgKzEyNzEsNyBAQAogcG1hY19pZGVfc2V0dXBfZGV2aWNlKHBtYWNfaWRlX2h3aWZfdCAqcG1pZiwgaWRlX2h3aWZfdCAqaHdpZikKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcG1pZi0+bm9kZTsKLQlpbnQgKmJpZHAsIGk7CisJaW50ICpiaWRwOwogCiAJcG1pZi0+Y2FibGVfODAgPSAwOwogCXBtaWYtPmJyb2tlbl9kbWEgPSBwbWlmLT5icm9rZW5fZG1hX3dhcm4gPSAwOwpAQCAtMTQzMCw3ICsxNDMwLDcgQEAKIAlwbWlmID0gJnBtYWNfaWRlW2ldOwogCWh3aWYgPSAmaWRlX2h3aWZzW2ldOwogCi0JaWYgKG1kZXYtPm9mZGV2Lm5vZGUtPm5fYWRkcnMgPT0gMCkgeworCWlmIChtYWNpb19yZXNvdXJjZV9jb3VudChtZGV2KSA9PSAwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImlkZSVkOiBubyBhZGRyZXNzIGZvciAlc1xuIiwKIAkJICAgICAgIGksIG1kZXYtPm9mZGV2Lm5vZGUtPmZ1bGxfbmFtZSk7CiAJCXJldHVybiAtRU5YSU87CkBAIC0xNjg2LDcgKzE2ODYsNyBAQAogI2Vsc2UKIAltYWNpb19yZWdpc3Rlcl9kcml2ZXIoJnBtYWNfaWRlX21hY2lvX2RyaXZlcik7CiAJcGNpX3JlZ2lzdGVyX2RyaXZlcigmcG1hY19pZGVfcGNpX2RyaXZlcik7Ci0jZW5kaWYJCisjZW5kaWYKIH0KIAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lERURNQV9QTUFDCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2FtZHRwLmMgYi9kcml2ZXJzL2llZWUxMzk0L2FtZHRwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ODk3NTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9hbWR0cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI5OCArMCwwIEBACi0vKiAtKi0gYy1iYXNpYy1vZmZzZXQ6IDggLSotCi0gKgotICogYW1kdHAuYyAtIEF1ZGlvIGFuZCBNdXNpYyBEYXRhIFRyYW5zbWlzc2lvbiBQcm90b2NvbCBEcml2ZXIKLSAqIENvcHlyaWdodCAoQykgMjAwMSBLcmlzdGlhbiBI+GdzYmVyZwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotLyogT1ZFUlZJRVcKLSAqIC0tLS0tLS0tCi0gKgotICogVGhlIEFNRFRQIGRyaXZlciBpcyBkZXNpZ25lZCB0byBleHBvc2UgdGhlIElFRUUxMzk0IGJ1cyBhcyBhCi0gKiByZWd1bGFyIE9TUyBzb3VuZGNhcmQsIGkuZS4geW91IGNhbiBsaW5rIC9kZXYvZHNwIHRvIC9kZXYvYW1kdHAgYW5kCi0gKiB0aGVuIHlvdXIgZmF2b3VyaXRlIE1QMyBwbGF5ZXIsIGdhbWUgb3Igd2hhdGV2ZXIgc291bmQgcHJvZ3JhbSB3aWxsCi0gKiBvdXRwdXQgdG8gYW4gSUVFRTEzOTQgaXNvY2hyb25vdXMgY2hhbm5lbC4gIFRoZSBzaWduYWwgZGVzdGluYXRpb24KLSAqIGNvdWxkIGJlIGEgc2V0IG9mIElFRUUxMzk0IGxvdWRzcGVha2VycyAoaWYgYW5kIHdoZW4gc3VjaCB0aGluZ3MKLSAqIGJlY29tZSBhdmFpbGFibGUpIG9yIGFuIGFtcGxpZmllciB3aXRoIElFRUUxMzk0IGlucHV0IChsaWtlIHRoZQotICogU29ueSBTVFItTFNBMSkuICBUaGUgZHJpdmVyIG9ubHkgaGFuZGxlcyB0aGUgYWN0dWFsIHN0cmVhbWluZywgc29tZQotICogY29ubmVjdGlvbiBtYW5hZ2VtZW50IGlzIGFsc28gcmVxdWlyZWQgZm9yIHRoaXMgdG8gYWN0dWFsbHkgd29yay4KLSAqIFRoYXQgaXMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBkcml2ZXIsIGFuZCBmdXJ0aGVybW9yZSBpdCBpcyBub3QKLSAqIHJlYWxseSBzdGFuZGFyZGl6ZWQgeWV0LgotICoKLSAqIFRoZSBBdWRpbyBhbmQgTXVzaWMgRGF0YSBUcmFubWlzc2lvbiBQcm90b2NvbCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy4xMzk0dGEub3JnL0Rvd25sb2FkL1RlY2hub2xvZ3kvU3BlY2lmaWNhdGlvbnMvMjAwMS9BTTIwRmluYWwtamYyLnBkZgotICoKLSAqCi0gKiBUT0RPCi0gKiAtLS0tCi0gKgotICogLSBXZSBzaG91bGQgYmUgYWJsZSB0byBjaGFuZ2UgaW5wdXQgc2FtcGxlIGZvcm1hdCBiZXR3ZWVuIExFL0JFLCBhcwotICogICB3ZSBhbHJlYWR5IHNoaWZ0IHRoZSBieXRlcyBhcm91bmQgd2hlbiB3ZSBjb25zdHJ1Y3QgdGhlIGlzbwotICogICBwYWNrZXRzLgotICoKLSAqIC0gRml4IERNQSBzdG9wIGFmdGVyIGJ1cyByZXNldCEKLSAqCi0gKiAtIENsZWFuIHVwIGlzbyBjb250ZXh0IGhhbmRsaW5nIGluIG9oY2kxMzk0LgotICoKLSAqCi0gKiBNQVlCRSBUT0RPCi0gKiAtLS0tLS0tLS0tCi0gKgotICogLSBSZWNlaXZlIGRhdGEgZm9yIGxvY2FsIHBsYXliYWNrIG9yIHJlY29yZGluZy4gIFBsYXliYWNrIHJlcXVpcmVzCi0gKiAgIHNvZnQgc3luY2luZyB3aXRoIHRoZSBzb3VuZCBjYXJkLgotICoKLSAqIC0gU2lnbmFsIHByb2Nlc3NpbmcsIGkuZS4gcmVjZWl2ZSBwYWNrZXRzLCBkbyBzb21lIHByb2Nlc3NpbmcsIGFuZAotICogICB0cmFuc21pdCB0aGVtIGFnYWluIHVzaW5nIHRoZSBzYW1lIHBhY2tldCBzdHJ1Y3R1cmUgYW5kIHRpbWVzdGFtcHMKLSAqICAgb2Zmc2V0IGJ5IHByb2Nlc3NpbmcgdGltZS4KLSAqCi0gKiAtIE1heWJlIG1ha2UgYW4gQUxTQSBpbnRlcmZhY2UsIHRoYXQgaXMsIGNyZWF0ZSBhIGZpbGVfb3BzCi0gKiAgIGltcGxlbWVudGF0aW9uIHRoYXQgcmVjb2duaXplcyBBTFNBIGlvY3RscyBhbmQgdXNlcyBkZWZhdWx0cyBmb3IKLSAqICAgdGhpbmdzIHRoYXQgY2FuJ3QgYmUgY29udHJvbGxlZCB0aHJvdWdoIEFMU0EgKGlzbyBjaGFubmVsKS4KLSAqCi0gKiAgIENoYW5nZXM6Ci0gKgotICogLSBBdWRpdCBjb3B5X2Zyb21fdXNlciBpbiBhbWR0cF93cml0ZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFuaWVsZSBCZWxsdWNjaSA8YmVsbHVjZGFAdGlzY2FsaS5pdD4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9jdGwzMi5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgotI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLQotI2luY2x1ZGUgImhvc3RzLmgiCi0jaW5jbHVkZSAiaGlnaGxldmVsLmgiCi0jaW5jbHVkZSAiaWVlZTEzOTQuaCIKLSNpbmNsdWRlICJpZWVlMTM5NF9jb3JlLmgiCi0jaW5jbHVkZSAib2hjaTEzOTQuaCIKLQotI2luY2x1ZGUgImFtZHRwLmgiCi0jaW5jbHVkZSAiY21wLmgiCi0KLSNkZWZpbmUgRk1UX0FNRFRQIDB4MTAKLSNkZWZpbmUgRkRGX0FNODI0IDB4MDAKLSNkZWZpbmUgRkRGX1NGQ18zMktIWiAgIDB4MDAKLSNkZWZpbmUgRkRGX1NGQ180NEsxSFogIDB4MDEKLSNkZWZpbmUgRkRGX1NGQ180OEtIWiAgIDB4MDIKLSNkZWZpbmUgRkRGX1NGQ184OEsySFogIDB4MDMKLSNkZWZpbmUgRkRGX1NGQ185NktIWiAgIDB4MDQKLSNkZWZpbmUgRkRGX1NGQ18xNzZLNEhaIDB4MDUKLSNkZWZpbmUgRkRGX1NGQ18xOTJLSFogIDB4MDYKLQotc3RydWN0IGRlc2NyaXB0b3JfYmxvY2sgewotCXN0cnVjdCBvdXRwdXRfbW9yZV9pbW1lZGlhdGUgewotCQl1MzIgY29udHJvbDsKLQkJdTMyIHBhZDA7Ci0JCXUzMiBza2lwOwotCQl1MzIgcGFkMTsKLQkJdTMyIGhlYWRlcls0XTsKLQl9IGhlYWRlcl9kZXNjOwotCi0Jc3RydWN0IG91dHB1dF9sYXN0IHsKLQkJdTMyIGNvbnRyb2w7Ci0JCXUzMiBkYXRhX2FkZHJlc3M7Ci0JCXUzMiBicmFuY2g7Ci0JCXUzMiBzdGF0dXM7Ci0JfSBwYXlsb2FkX2Rlc2M7Ci19OwotCi1zdHJ1Y3QgcGFja2V0IHsKLQlzdHJ1Y3QgZGVzY3JpcHRvcl9ibG9jayAqZGI7Ci0JZG1hX2FkZHJfdCBkYl9idXM7Ci0Jc3RydWN0IGlzb19wYWNrZXQgKnBheWxvYWQ7Ci0JZG1hX2FkZHJfdCBwYXlsb2FkX2J1czsKLX07Ci0KLSNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+Ci0KLSNpZiBkZWZpbmVkIF9fQklHX0VORElBTl9CSVRGSUVMRAotCi1zdHJ1Y3QgaXNvX3BhY2tldCB7Ci0JLyogRmlyc3QgcXVhZGxldCAqLwotCXVuc2lnbmVkIGludCBkYnMgICAgICA6IDg7Ci0JdW5zaWduZWQgaW50IGVvaDAgICAgIDogMjsKLQl1bnNpZ25lZCBpbnQgc2lkICAgICAgOiA2OwotCi0JdW5zaWduZWQgaW50IGRiYyAgICAgIDogODsKLQl1bnNpZ25lZCBpbnQgZm4gICAgICAgOiAyOwotCXVuc2lnbmVkIGludCBxcGMgICAgICA6IDM7Ci0JdW5zaWduZWQgaW50IHNwaCAgICAgIDogMTsKLQl1bnNpZ25lZCBpbnQgcmVzZXJ2ZWQgOiAyOwotCi0JLyogU2Vjb25kIHF1YWRsZXQgKi8KLQl1bnNpZ25lZCBpbnQgZmRmICAgICAgOiA4OwotCXVuc2lnbmVkIGludCBlb2gxICAgICA6IDI7Ci0JdW5zaWduZWQgaW50IGZtdCAgICAgIDogNjsKLQotCXVuc2lnbmVkIGludCBzeXQgICAgICA6IDE2OwotCi0gICAgICAgIHF1YWRsZXRfdCBkYXRhWzBdOwotfTsKLQotI2VsaWYgZGVmaW5lZCBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKLQotc3RydWN0IGlzb19wYWNrZXQgewotCS8qIEZpcnN0IHF1YWRsZXQgKi8KLQl1bnNpZ25lZCBpbnQgc2lkICAgICAgOiA2OwotCXVuc2lnbmVkIGludCBlb2gwICAgICA6IDI7Ci0JdW5zaWduZWQgaW50IGRicyAgICAgIDogODsKLQotCXVuc2lnbmVkIGludCByZXNlcnZlZCA6IDI7Ci0JdW5zaWduZWQgaW50IHNwaCAgICAgIDogMTsKLQl1bnNpZ25lZCBpbnQgcXBjICAgICAgOiAzOwotCXVuc2lnbmVkIGludCBmbiAgICAgICA6IDI7Ci0JdW5zaWduZWQgaW50IGRiYyAgICAgIDogODsKLQotCS8qIFNlY29uZCBxdWFkbGV0ICovCi0JdW5zaWduZWQgaW50IGZtdCAgICAgIDogNjsKLQl1bnNpZ25lZCBpbnQgZW9oMSAgICAgOiAyOwotCXVuc2lnbmVkIGludCBmZGYgICAgICA6IDg7Ci0KLQl1bnNpZ25lZCBpbnQgc3l0ICAgICAgOiAxNjsKLQotCXF1YWRsZXRfdCBkYXRhWzBdOwotfTsKLQotI2Vsc2UKLQotI2Vycm9yIFVua25vd24gYml0ZmllbGQgdHlwZQotCi0jZW5kaWYKLQotc3RydWN0IGZyYWN0aW9uIHsKLQlpbnQgaW50ZWdlcjsKLQlpbnQgbnVtZXJhdG9yOwotCWludCBkZW5vbWluYXRvcjsKLX07Ci0KLSNkZWZpbmUgUEFDS0VUX0xJU1RfU0laRSAyNTYKLSNkZWZpbmUgTUFYX1BBQ0tFVF9MSVNUUyA0Ci0KLXN0cnVjdCBwYWNrZXRfbGlzdCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaW5rOwotCWludCBsYXN0X2N5Y2xlX2NvdW50OwotCXN0cnVjdCBwYWNrZXQgcGFja2V0c1tQQUNLRVRfTElTVF9TSVpFXTsKLX07Ci0KLSNkZWZpbmUgQlVGRkVSX1NJWkUgMTI4Ci0KLS8qIFRoaXMgaW1wbGVtZW50cyBhIGNpcmN1bGFyIGJ1ZmZlciBmb3IgaW5jb21pbmcgc2FtcGxlcy4gKi8KLQotc3RydWN0IGJ1ZmZlciB7Ci0Jc2l6ZV90IGhlYWQsIHRhaWwsIGxlbmd0aCwgc2l6ZTsKLQl1bnNpZ25lZCBjaGFyIGRhdGFbMF07Ci19OwotCi1zdHJ1Y3Qgc3RyZWFtIHsKLQlpbnQgaXNvX2NoYW5uZWw7Ci0JaW50IGZvcm1hdDsKLQlpbnQgcmF0ZTsKLQlpbnQgZGltZW5zaW9uOwotCWludCBmZGY7Ci0JaW50IG1vZGU7Ci0JaW50IHNhbXBsZV9mb3JtYXQ7Ci0Jc3RydWN0IGNtcF9wY3IgKm9wY3I7Ci0KLQkvKiBJbnB1dCBzYW1wbGVzIGFyZSBjb3BpZWQgaGVyZS4gKi8KLQlzdHJ1Y3QgYnVmZmVyICppbnB1dDsKLQotCS8qIElTTyBQYWNrZXIgc3RhdGUgKi8KLQl1bnNpZ25lZCBjaGFyIGRiYzsKLQlzdHJ1Y3QgcGFja2V0X2xpc3QgKmN1cnJlbnRfcGFja2V0X2xpc3Q7Ci0JaW50IGN1cnJlbnRfcGFja2V0OwotCXN0cnVjdCBmcmFjdGlvbiByZWFkeV9zYW1wbGVzLCBzYW1wbGVzX3Blcl9jeWNsZTsKLQotCS8qIFdlIHVzZSB0aGVzZSB0byBnZW5lcmF0ZSBjb250cm9sIGJpdHMgd2hlbiB3ZSBhcmUgcGFja2luZwotCSAqIGllYzk1OCBkYXRhLgotCSAqLwotCWludCBpZWM5NThfZnJhbWVfY291bnQ7Ci0JaW50IGllYzk1OF9yYXRlX2NvZGU7Ci0KLQkvKiBUaGUgY3ljbGVfY291bnQgYW5kIGN5Y2xlX29mZnNldCBmaWVsZHMgYXJlIHVzZWQgZm9yIHRoZQotCSAqIHN5bmNocm9uaXphdGlvbiB0aW1lc3RhbXBzIChzeXQpIGluIHRoZSBjaXAgaGVhZGVyLiAgVGhleQotCSAqIGFyZSBpbmNyZW1lbnRlZCBieSBhdCBsZWFzdCBhIGN5Y2xlIGV2ZXJ5IHRpbWUgd2UgcHV0IGEKLQkgKiB0aW1lIHN0YW1wIGluIGEgcGFja2V0LiAgQXMgd2UgZG9uJ3QgdGltZSBzdGFtcCBhbGwKLQkgKiBwYWNrYWdlcywgY3ljbGVfY291bnQgaXNuJ3QgdXBkYXRlZCBpbiBldmVyeSBjeWNsZSwgYW5kCi0JICogc29tZXRpbWVzIGl0J3MgaW5jcmVtZW50ZWQgYnkgMi4gIFRodXMsIHdlIGhhdmUKLQkgKiBjeWNsZV9jb3VudDIsIHdoaWNoIGlzIHNpbXBseSBpbmNyZW1lbnRlZCBieSBvbmUgd2l0aCBlYWNoCi0JICogcGFja2V0LCBzbyB3ZSBjYW4gY29tcGFyZSBpdCB0byB0aGUgdHJhbnNtaXNzaW9uIHRpbWUKLQkgKiB3cml0dGVuIGJhY2sgaW4gdGhlIGRtYSBwcm9ncmFtcy4KLQkgKi8KLQlhdG9taWNfdCBjeWNsZV9jb3VudCwgY3ljbGVfY291bnQyOwotCXN0cnVjdCBmcmFjdGlvbiBjeWNsZV9vZmZzZXQsIHRpY2tzX3Blcl9zeXRfb2Zmc2V0OwotCWludCBzeXRfaW50ZXJ2YWw7Ci0JaW50IHN0YWxlX2NvdW50OwotCi0JLyogVGhlc2VzIGZpZWxkcyBjb250cm9sIHRoZSBzYW1wbGUgb3V0cHV0IHRvIHRoZSBETUEgZW5naW5lLgotCSAqIFRoZSBkbWFfcGFja2V0X2xpc3RzIGxpc3QgaG9sZHMgcGFja2V0IGxpc3RzIGN1cnJlbnRseQotCSAqIHF1ZXVlZCBmb3IgZG1hOyB0aGUgaGVhZCBvZiB0aGUgbGlzdCBpcyBjdXJyZW50bHkgYmVpbmcKLQkgKiBwcm9jZXNzZWQuICBUaGUgbGFzdCBwcm9ncmFtIGluIGEgcGFja2V0IGxpc3QgZ2VuZXJhdGVzIGFuCi0JICogaW50ZXJydXB0LCB3aGljaCByZW1vdmVzIHRoZSBoZWFkIGZyb20gZG1hX3BhY2tldF9saXN0cyBhbmQKLQkgKiBwdXRzIGl0IGJhY2sgb24gdGhlIGZyZWUgbGlzdC4KLQkgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGRtYV9wYWNrZXRfbGlzdHM7Ci0Jc3RydWN0IGxpc3RfaGVhZCBmcmVlX3BhY2tldF9saXN0czsKLSAgICAgICAgd2FpdF9xdWV1ZV9oZWFkX3QgcGFja2V0X2xpc3Rfd2FpdDsKLQlzcGlubG9ja190IHBhY2tldF9saXN0X2xvY2s7Ci0Jc3RydWN0IG9oY2kxMzk0X2lzb190YXNrbGV0IGlzb190YXNrbGV0OwotCXN0cnVjdCBwY2lfcG9vbCAqZGVzY3JpcHRvcl9wb29sLCAqcGFja2V0X3Bvb2w7Ci0KLQkvKiBTdHJlYW1zIGF0IGEgaG9zdCBjb250cm9sbGVyIGFyZSBjaGFpbmVkIHRocm91Z2ggdGhpcyBmaWVsZC4gKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7Ci0Jc3RydWN0IGFtZHRwX2hvc3QgKmhvc3Q7Ci19OwotCi1zdHJ1Y3QgYW1kdHBfaG9zdCB7Ci0Jc3RydWN0IGhwc2JfaG9zdCAqaG9zdDsKLQlzdHJ1Y3QgdGlfb2hjaSAqb2hjaTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHN0cmVhbV9saXN0OwotCXNwaW5sb2NrX3Qgc3RyZWFtX2xpc3RfbG9jazsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgYW1kdHBfaGlnaGxldmVsOwotCi0KLS8qIEZJWE1FOiBUaGlzIGRvZXNuJ3QgYmVsb25nIGhlcmUuLi4gKi8KLQotI2RlZmluZSBPSENJMTM5NF9DT05URVhUX0NZQ0xFX01BVENIIDB4ODAwMDAwMDAKLSNkZWZpbmUgT0hDSTEzOTRfQ09OVEVYVF9SVU4gICAgICAgICAweDAwMDA4MDAwCi0jZGVmaW5lIE9IQ0kxMzk0X0NPTlRFWFRfV0FLRSAgICAgICAgMHgwMDAwMTAwMAotI2RlZmluZSBPSENJMTM5NF9DT05URVhUX0RFQUQgICAgICAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgT0hDSTEzOTRfQ09OVEVYVF9BQ1RJVkUgICAgICAweDAwMDAwNDAwCi0KLXN0YXRpYyB2b2lkIG9oY2kxMzk0X3N0YXJ0X2l0X2N0eChzdHJ1Y3QgdGlfb2hjaSAqb2hjaSwgaW50IGN0eCwKLQkJCSAgIGRtYV9hZGRyX3QgZmlyc3RfY21kLCBpbnQgeiwgaW50IGN5Y2xlX21hdGNoKQotewotCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29YbWl0SW50TWFza1NldCwgMSA8PCBjdHgpOwotCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29YbWl0Q29tbWFuZFB0ciArIGN0eCAqIDE2LCBmaXJzdF9jbWQgfCB6KTsKLQlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSXNvWG1pdENvbnRleHRDb250cm9sQ2xlYXIgKyBjdHggKiAxNiwgfjApOwotCXdtYigpOwotCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29YbWl0Q29udGV4dENvbnRyb2xTZXQgKyBjdHggKiAxNiwKLQkJICBPSENJMTM5NF9DT05URVhUX0NZQ0xFX01BVENIIHwgKGN5Y2xlX21hdGNoIDw8IDE2KSB8Ci0JCSAgT0hDSTEzOTRfQ09OVEVYVF9SVU4pOwotfQotCi1zdGF0aWMgdm9pZCBvaGNpMTM5NF93YWtlX2l0X2N0eChzdHJ1Y3QgdGlfb2hjaSAqb2hjaSwgaW50IGN0eCkKLXsKLQlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSXNvWG1pdENvbnRleHRDb250cm9sU2V0ICsgY3R4ICogMTYsCi0JCSAgT0hDSTEzOTRfQ09OVEVYVF9XQUtFKTsKLX0KLQotc3RhdGljIHZvaWQgb2hjaTEzOTRfc3RvcF9pdF9jdHgoc3RydWN0IHRpX29oY2kgKm9oY2ksIGludCBjdHgsIGludCBzeW5jaHJvbm91cykKLXsKLQl1MzIgY29udHJvbDsKLQlpbnQgd2FpdDsKLQotCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29YbWl0SW50TWFza0NsZWFyLCAxIDw8IGN0eCk7Ci0JcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0lzb1htaXRDb250ZXh0Q29udHJvbENsZWFyICsgY3R4ICogMTYsCi0JCSAgT0hDSTEzOTRfQ09OVEVYVF9SVU4pOwotCXdtYigpOwotCi0JaWYgKHN5bmNocm9ub3VzKSB7Ci0JCWZvciAod2FpdCA9IDA7IHdhaXQgPCA1OyB3YWl0KyspIHsKLQkJCWNvbnRyb2wgPSByZWdfcmVhZChvaGNpLCBPSENJMTM5NF9Jc29YbWl0Q29udGV4dENvbnRyb2xTZXQgKyBjdHggKiAxNik7Ci0JCQlpZiAoKGNvbnRyb2wgJiBPSENJMTM5NF9DT05URVhUX0FDVElWRSkgPT0gMCkKLQkJCQlicmVhazsKLQotCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOwotCQl9Ci0JfQotfQotCi0vKiBOb3RlOiB3ZSBjYW4gdGVzdCBpZiBmcmVlX3BhY2tldF9saXN0cyBpcyBlbXB0eSB3aXRob3V0IGFxdWlyaW5nCi0gKiB0aGUgcGFja2V0X2xpc3RfbG9jay4gIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBvbmx5IGFkZHMgdG8gdGhlIGZyZWUKLSAqIGxpc3QsIHRoZXJlIGlzIG5vIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gdGVzdGluZyB0aGUgbGlzdCBub24tZW1wdHkKLSAqIGFuZCBhY3F1aXJpbmcgdGhlIGxvY2suCi0gKi8KLQotc3RhdGljIHN0cnVjdCBwYWNrZXRfbGlzdCAqc3RyZWFtX2dldF9mcmVlX3BhY2tldF9saXN0KHN0cnVjdCBzdHJlYW0gKnMpCi17Ci0Jc3RydWN0IHBhY2tldF9saXN0ICpwbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGxpc3RfZW1wdHkoJnMtPmZyZWVfcGFja2V0X2xpc3RzKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+cGFja2V0X2xpc3RfbG9jaywgZmxhZ3MpOwotCXBsID0gbGlzdF9lbnRyeShzLT5mcmVlX3BhY2tldF9saXN0cy5uZXh0LCBzdHJ1Y3QgcGFja2V0X2xpc3QsIGxpbmspOwotCWxpc3RfZGVsKCZwbC0+bGluayk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+cGFja2V0X2xpc3RfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHBsOwotfQotCi1zdGF0aWMgdm9pZCBzdHJlYW1fc3RhcnRfZG1hKHN0cnVjdCBzdHJlYW0gKnMsIHN0cnVjdCBwYWNrZXRfbGlzdCAqcGwpCi17Ci0JdTMyIHN5dF9jeWNsZSwgY3ljbGVfY291bnQsIHN0YXJ0X2N5Y2xlOwotCi0JY3ljbGVfY291bnQgPSByZWdfcmVhZChzLT5ob3N0LT5vaGNpLAotCQkJICAgICAgIE9IQ0kxMzk0X0lzb2Nocm9ub3VzQ3ljbGVUaW1lcikgPj4gMTI7Ci0Jc3l0X2N5Y2xlID0gKHBsLT5sYXN0X2N5Y2xlX2NvdW50IC0gUEFDS0VUX0xJU1RfU0laRSArIDEpICYgMHgwZjsKLQotCS8qIFdlIHByb2dyYW0gdGhlIERNQSBjb250cm9sbGVyIHRvIHN0YXJ0IHRyYW5zbWlzc2lvbiBhdAotCSAqIGxlYXN0IDE3IGN5Y2xlcyBmcm9tIG5vdyAtIHRoaXMgaGFwcGVucyB3aGVuIHRoZSBsb3dlciBmb3VyCi0JICogYml0cyBvZiBjeWNsZV9jb3VudCBpcyAweDBmIGFuZCBzeXRfY3ljbGUgaXMgMCwgaW4gdGhpcwotCSAqIGNhc2UgdGhlIHN0YXJ0IGN5Y2xlIGlzIGN5Y2xlX2NvdW50IC0gMTUgKyAzMi4gKi8KLQlzdGFydF9jeWNsZSA9IChjeWNsZV9jb3VudCAmIH4weDBmKSArIDMyICsgc3l0X2N5Y2xlOwotCWlmICgoc3RhcnRfY3ljbGUgJiAweDFmZmYpID49IDgwMDApCi0JCXN0YXJ0X2N5Y2xlID0gc3RhcnRfY3ljbGUgLSA4MDAwICsgMHgyMDAwOwotCi0Jb2hjaTEzOTRfc3RhcnRfaXRfY3R4KHMtPmhvc3QtPm9oY2ksIHMtPmlzb190YXNrbGV0LmNvbnRleHQsCi0JCQkgICAgICBwbC0+cGFja2V0c1swXS5kYl9idXMsIDMsCi0JCQkgICAgICBzdGFydF9jeWNsZSAmIDB4N2ZmZik7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0cmVhbV9wdXRfZG1hX3BhY2tldF9saXN0KHN0cnVjdCBzdHJlYW0gKnMsCi0JCQkJICAgICAgIHN0cnVjdCBwYWNrZXRfbGlzdCAqcGwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgcGFja2V0X2xpc3QgKnByZXY7Ci0KLQkvKiBSZW1lbWJlciB0aGUgY3ljbGVfY291bnQgdXNlZCBmb3IgdGltZXN0YW1waW5nIHRoZSBsYXN0IHBhY2tldC4gKi8KLQlwbC0+bGFzdF9jeWNsZV9jb3VudCA9IGF0b21pY19yZWFkKCZzLT5jeWNsZV9jb3VudDIpIC0gMTsKLQlwbC0+cGFja2V0c1tQQUNLRVRfTElTVF9TSVpFIC0gMV0uZGItPnBheWxvYWRfZGVzYy5icmFuY2ggPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnMtPnBhY2tldF9saXN0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZwbC0+bGluaywgJnMtPmRtYV9wYWNrZXRfbGlzdHMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPnBhY2tldF9saXN0X2xvY2ssIGZsYWdzKTsKLQotCXByZXYgPSBsaXN0X2VudHJ5KHBsLT5saW5rLnByZXYsIHN0cnVjdCBwYWNrZXRfbGlzdCwgbGluayk7Ci0JaWYgKHBsLT5saW5rLnByZXYgIT0gJnMtPmRtYV9wYWNrZXRfbGlzdHMpIHsKLQkJc3RydWN0IHBhY2tldCAqbGFzdCA9ICZwcmV2LT5wYWNrZXRzW1BBQ0tFVF9MSVNUX1NJWkUgLSAxXTsKLQkJbGFzdC0+ZGItPnBheWxvYWRfZGVzYy5icmFuY2ggPSBwbC0+cGFja2V0c1swXS5kYl9idXMgfCAzOwotCQlsYXN0LT5kYi0+aGVhZGVyX2Rlc2Muc2tpcCA9IHBsLT5wYWNrZXRzWzBdLmRiX2J1cyB8IDM7Ci0JCW9oY2kxMzk0X3dha2VfaXRfY3R4KHMtPmhvc3QtPm9oY2ksIHMtPmlzb190YXNrbGV0LmNvbnRleHQpOwotCX0KLQllbHNlCi0JCXN0cmVhbV9zdGFydF9kbWEocywgcGwpOwotfQotCi1zdGF0aWMgdm9pZCBzdHJlYW1fc2hpZnRfcGFja2V0X2xpc3RzKHVuc2lnbmVkIGxvbmcgbCkKLXsKLQlzdHJ1Y3Qgc3RyZWFtICpzID0gKHN0cnVjdCBzdHJlYW0gKikgbDsKLQlzdHJ1Y3QgcGFja2V0X2xpc3QgKnBsOwotCXN0cnVjdCBwYWNrZXQgKmxhc3Q7Ci0JaW50IGRpZmY7Ci0KLQlpZiAobGlzdF9lbXB0eSgmcy0+ZG1hX3BhY2tldF9saXN0cykpIHsKLQkJSFBTQl9FUlIoImVtcHR5IGRtYV9wYWNrZXRfbGlzdHMgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm47Ci0JfQotCi0JLyogTm93IHRoYXQgd2Uga25vdyB0aGUgbGlzdCBpcyBub24tZW1wdHksIHdlIGNhbiBnZXQgdGhlIGhlYWQKLQkgKiBvZiB0aGUgbGlzdCB3aXRob3V0IGxvY2tpbmcsIGJlY2F1c2UgdGhlIHByb2Nlc3MgY29udGV4dAotCSAqIG9ubHkgYWRkcyB0byB0aGUgdGFpbC4KLQkgKi8KLQlwbCA9IGxpc3RfZW50cnkocy0+ZG1hX3BhY2tldF9saXN0cy5uZXh0LCBzdHJ1Y3QgcGFja2V0X2xpc3QsIGxpbmspOwotCWxhc3QgPSAmcGwtPnBhY2tldHNbUEFDS0VUX0xJU1RfU0laRSAtIDFdOwotCi0JLyogVGhpcyBpcyB3ZWlyZC4uLiBpZiB3ZSBzdG9wIGRtYSBwcm9jZXNzaW5nIGluIHRoZSBtaWRkbGUgb2YKLQkgKiBhIHBhY2tldCBsaXN0LCB0aGUgZG1hIGNvbnRleHQgaW1tZWRpYXRlbHkgZ2VuZXJhdGVzIGFuCi0JICogaW50ZXJydXB0IGlmIHdlIGVuYWJsZSBpdCBhZ2FpbiBsYXRlci4gIFRoaXMgb25seSBoYXBwZW5zCi0JICogd2hlbiBhbWR0cF9yZWxlYXNlIGlzIGludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcgZm9yIGRtYSB0bwotCSAqIGNvbXBsZXRlLCB0aG91Z2guICBBbnl3YXksIHdlIGRldGVjdCB0aGlzIGJ5IHNlZWluZyB0aGF0Ci0JICogdGhlIHN0YXR1cyBvZiB0aGUgZG1hIGRlc2NyaXB0b3IgdGhhdCB3ZSBleHBlY3RlZCBhbgotCSAqIGludGVycnVwdCBmcm9tIGlzIHN0aWxsIDAuCi0JICovCi0JaWYgKGxhc3QtPmRiLT5wYXlsb2FkX2Rlc2Muc3RhdHVzID09IDApIHsKLQkJSFBTQl9JTkZPKCJ3ZWlyZCBpbnRlcnJ1cHQuLi4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIElmIHRoZSBsYXN0IGRlc2NyaXB0b3IgYmxvY2sgZG9lcyBub3Qgc3BlY2lmeSBhIGJyYW5jaAotCSAqIGFkZHJlc3MsIHdlIGhhdmUgYSBzYW1wbGUgdW5kZXJmbG93LgotCSAqLwotCWlmIChsYXN0LT5kYi0+cGF5bG9hZF9kZXNjLmJyYW5jaCA9PSAwKQotCQlIUFNCX0lORk8oIkZJWE1FOiBzYW1wbGUgdW5kZXJmbG93Li4uIik7Ci0KLQkvKiBIZXJlIHdlIGNoZWNrIHdoZW4gKHdoaWNoIGN5Y2xlKSB0aGUgbGFzdCBwYWNrZXQgd2FzIHNlbnQKLQkgKiBhbmQgY29tcGFyZSBpdCB0byB3aGF0IHRoZSBpc28gcGFja2VyIHdhcyB1c2luZyBhdCB0aGUKLQkgKiB0aW1lLiAgSWYgdGhlcmUgaXMgYSBtaXNtYXRjaCwgd2UgYWRqdXN0IHRoZSBjeWNsZSBjb3VudCBpbgotCSAqIHRoZSBpc28gcGFja2VyLiAgSG93ZXZlciwgdGhlcmUgYXJlIHN0aWxsIHVwIHRvCi0JICogTUFYX1BBQ0tFVF9MSVNUUyBwYWNrZXQgbGlzdHMgcXVldWVkIHdpdGggYmFkIHRpbWUgc3RhbXBzLAotCSAqIHNvIHdlIGRpc2FibGUgdGltZSBzdGFtcCBtb25pdG9yaW5nIGZvciB0aGUgbmV4dAotCSAqIE1BWF9QQUNLRVRfTElTVFMgcGFja2V0IGxpc3RzLgotCSAqLwotCWRpZmYgPSAobGFzdC0+ZGItPnBheWxvYWRfZGVzYy5zdGF0dXMgLSBwbC0+bGFzdF9jeWNsZV9jb3VudCkgJiAweGY7Ci0JaWYgKGRpZmYgPiAwICYmIHMtPnN0YWxlX2NvdW50ID09IDApIHsKLQkJYXRvbWljX2FkZChkaWZmLCAmcy0+Y3ljbGVfY291bnQpOwotCQlhdG9taWNfYWRkKGRpZmYsICZzLT5jeWNsZV9jb3VudDIpOwotCQlzLT5zdGFsZV9jb3VudCA9IE1BWF9QQUNLRVRfTElTVFM7Ci0JfQotCi0JaWYgKHMtPnN0YWxlX2NvdW50ID4gMCkKLQkJcy0+c3RhbGVfY291bnQtLTsKLQotCS8qIEZpbmFsbHksIHdlIG1vdmUgdGhlIHBhY2tldCBsaXN0IHRoYXQgd2FzIGp1c3QgcHJvY2Vzc2VkCi0JICogYmFjayB0byB0aGUgZnJlZSBsaXN0LCBhbmQgbm90aWZ5IGFueSB3YWl0ZXJzLgotCSAqLwotCXNwaW5fbG9jaygmcy0+cGFja2V0X2xpc3RfbG9jayk7Ci0JbGlzdF9kZWwoJnBsLT5saW5rKTsKLQlsaXN0X2FkZF90YWlsKCZwbC0+bGluaywgJnMtPmZyZWVfcGFja2V0X2xpc3RzKTsKLQlzcGluX3VubG9jaygmcy0+cGFja2V0X2xpc3RfbG9jayk7Ci0KLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnMtPnBhY2tldF9saXN0X3dhaXQpOwotfQotCi1zdGF0aWMgc3RydWN0IHBhY2tldCAqc3RyZWFtX2N1cnJlbnRfcGFja2V0KHN0cnVjdCBzdHJlYW0gKnMpCi17Ci0JaWYgKHMtPmN1cnJlbnRfcGFja2V0X2xpc3QgPT0gTlVMTCAmJgotCSAgICAocy0+Y3VycmVudF9wYWNrZXRfbGlzdCA9IHN0cmVhbV9nZXRfZnJlZV9wYWNrZXRfbGlzdChzKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gJnMtPmN1cnJlbnRfcGFja2V0X2xpc3QtPnBhY2tldHNbcy0+Y3VycmVudF9wYWNrZXRdOwotfQotCi1zdGF0aWMgdm9pZCBzdHJlYW1fcXVldWVfcGFja2V0KHN0cnVjdCBzdHJlYW0gKnMpCi17Ci0Jcy0+Y3VycmVudF9wYWNrZXQrKzsKLQlpZiAocy0+Y3VycmVudF9wYWNrZXQgPT0gUEFDS0VUX0xJU1RfU0laRSkgewotCQlzdHJlYW1fcHV0X2RtYV9wYWNrZXRfbGlzdChzLCBzLT5jdXJyZW50X3BhY2tldF9saXN0KTsKLQkJcy0+Y3VycmVudF9wYWNrZXRfbGlzdCA9IE5VTEw7Ci0JCXMtPmN1cnJlbnRfcGFja2V0ID0gMDsKLQl9Ci19Ci0KLS8qIEludGVnZXIgZnJhY3Rpb25hbCBtYXRoLiAgV2hlbiB3ZSB0cmFuc21pdCBhIDQ0azFIeiBzaWduYWwgd2UgbXVzdAotICogc2VuZCA1IDQxLzgwIHNhbXBsZXMgcGVyIGlzb2Nocm9ub3VzIGN5Y2xlLCBhcyB0aGVzZSBvY2N1ciA4MDAwCi0gKiB0aW1lcyBhIHNlY29uZC4gIE9mIGNvdXJzZSwgd2UgbXVzdCBzZW5kIGFuIGludGVncmFsIG51bWJlciBvZgotICogc2FtcGxlcyBpbiBhIHBhY2tldCwgc28gd2UgdXNlIHRoZSBpbnRlZ2VyIG1hdGggdG8gYWx0ZXJuYXRlCi0gKiBiZXR3ZWVuIHNlbmRpbmcgNSBhbmQgNiBzYW1wbGVzIHBlciBwYWNrZXQuCi0gKi8KLQotc3RhdGljIHZvaWQgZnJhY3Rpb25faW5pdChzdHJ1Y3QgZnJhY3Rpb24gKmYsIGludCBudW1lcmF0b3IsIGludCBkZW5vbWluYXRvcikKLXsKLQlmLT5pbnRlZ2VyID0gbnVtZXJhdG9yIC8gZGVub21pbmF0b3I7Ci0JZi0+bnVtZXJhdG9yID0gbnVtZXJhdG9yICUgZGVub21pbmF0b3I7Ci0JZi0+ZGVub21pbmF0b3IgPSBkZW5vbWluYXRvcjsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBmcmFjdGlvbl9hZGQoc3RydWN0IGZyYWN0aW9uICpkc3QsCi0JCQkJICAgIHN0cnVjdCBmcmFjdGlvbiAqc3JjMSwKLQkJCQkgICAgc3RydWN0IGZyYWN0aW9uICpzcmMyKQotewotCS8qIGFzc2VydDogc3JjMS0+ZGVub21pbmF0b3IgPT0gc3JjMi0+ZGVub21pbmF0b3IgKi8KLQotCWludCBzdW0sIGRlbm9tOwotCi0JLyogV2UgdXNlIHRoZXNlIHR3byBsb2NhbCB2YXJpYWJsZXMgdG8gYWxsb3cgZ2NjIHRvIG9wdGltaXplCi0JICogdGhlIGRpdmlzaW9uIGFuZCB0aGUgbW9kdWxvIGludG8gb25seSBvbmUgZGl2aXNpb24uICovCi0KLQlzdW0gPSBzcmMxLT5udW1lcmF0b3IgKyBzcmMyLT5udW1lcmF0b3I7Ci0JZGVub20gPSBzcmMxLT5kZW5vbWluYXRvcjsKLQlkc3QtPmludGVnZXIgPSBzcmMxLT5pbnRlZ2VyICsgc3JjMi0+aW50ZWdlciArIHN1bSAvIGRlbm9tOwotCWRzdC0+bnVtZXJhdG9yID0gc3VtICUgZGVub207Ci0JZHN0LT5kZW5vbWluYXRvciA9IGRlbm9tOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGZyYWN0aW9uX3N1Yl9pbnQoc3RydWN0IGZyYWN0aW9uICpkc3QsCi0JCQkJCXN0cnVjdCBmcmFjdGlvbiAqc3JjLCBpbnQgaW50ZWdlcikKLXsKLQlkc3QtPmludGVnZXIgPSBzcmMtPmludGVnZXIgLSBpbnRlZ2VyOwotCWRzdC0+bnVtZXJhdG9yID0gc3JjLT5udW1lcmF0b3I7Ci0JZHN0LT5kZW5vbWluYXRvciA9IHNyYy0+ZGVub21pbmF0b3I7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIGludCBmcmFjdGlvbl9mbG9vcihzdHJ1Y3QgZnJhY3Rpb24gKmZyYWMpCi17Ci0JcmV0dXJuIGZyYWMtPmludGVnZXI7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIGludCBmcmFjdGlvbl9jZWlsKHN0cnVjdCBmcmFjdGlvbiAqZnJhYykKLXsKLQlyZXR1cm4gZnJhYy0+aW50ZWdlciArIChmcmFjLT5udW1lcmF0b3IgPiAwID8gMSA6IDApOwotfQotCi1zdGF0aWMgdm9pZCBwYWNrZXRfaW5pdGlhbGl6ZShzdHJ1Y3QgcGFja2V0ICpwLCBzdHJ1Y3QgcGFja2V0ICpuZXh0KQotewotCS8qIEhlcmUgd2UgaW5pdGlhbGl6ZSB0aGUgZG1hIGRlc2NyaXB0b3IgYmxvY2sgZm9yCi0JICogdHJhbnNmZXJyaW5nIG9uZSBpc28gcGFja2V0LiAgV2UgdXNlIHR3byBkZXNjcmlwdG9ycyBwZXIKLQkgKiBwYWNrZXQ6IGFuIE9VVFBVVF9NT1JFX0lNTU1FRElBVEUgZGVzY3JpcHRvciBmb3IgdGhlCi0JICogSUVFRTEzOTQgaXNvIHBhY2tldCBoZWFkZXIgYW5kIGFuIE9VVFBVVF9MQVNUIGRlc2NyaXB0b3IKLQkgKiBmb3IgdGhlIHBheWxvYWQuCi0JICovCi0KLQlwLT5kYi0+aGVhZGVyX2Rlc2MuY29udHJvbCA9Ci0JCURNQV9DVExfT1VUUFVUX01PUkUgfCBETUFfQ1RMX0lNTUVESUFURSB8IDg7Ci0KLQlpZiAobmV4dCkgewotCQlwLT5kYi0+cGF5bG9hZF9kZXNjLmNvbnRyb2wgPQotCQkJRE1BX0NUTF9PVVRQVVRfTEFTVCB8IERNQV9DVExfQlJBTkNIOwotCQlwLT5kYi0+cGF5bG9hZF9kZXNjLmJyYW5jaCA9IG5leHQtPmRiX2J1cyB8IDM7Ci0JCXAtPmRiLT5oZWFkZXJfZGVzYy5za2lwID0gbmV4dC0+ZGJfYnVzIHwgMzsKLQl9Ci0JZWxzZSB7Ci0JCXAtPmRiLT5wYXlsb2FkX2Rlc2MuY29udHJvbCA9Ci0JCQlETUFfQ1RMX09VVFBVVF9MQVNUIHwgRE1BX0NUTF9CUkFOQ0ggfAotCQkJRE1BX0NUTF9VUERBVEUgfCBETUFfQ1RMX0lSUTsKLQkJcC0+ZGItPnBheWxvYWRfZGVzYy5icmFuY2ggPSAwOwotCQlwLT5kYi0+aGVhZGVyX2Rlc2Muc2tpcCA9IDA7Ci0JfQotCXAtPmRiLT5wYXlsb2FkX2Rlc2MuZGF0YV9hZGRyZXNzID0gcC0+cGF5bG9hZF9idXM7Ci0JcC0+ZGItPnBheWxvYWRfZGVzYy5zdGF0dXMgPSAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBhY2tldF9saXN0ICpwYWNrZXRfbGlzdF9hbGxvYyhzdHJ1Y3Qgc3RyZWFtICpzKQotewotCWludCBpOwotCXN0cnVjdCBwYWNrZXRfbGlzdCAqcGw7Ci0Jc3RydWN0IHBhY2tldCAqbmV4dDsKLQotCXBsID0ga21hbGxvYyhzaXplb2YgKnBsLCBTTEFCX0tFUk5FTCk7Ci0JaWYgKHBsID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JZm9yIChpID0gMDsgaSA8IFBBQ0tFVF9MSVNUX1NJWkU7IGkrKykgewotCQlzdHJ1Y3QgcGFja2V0ICpwID0gJnBsLT5wYWNrZXRzW2ldOwotCQlwLT5kYiA9IHBjaV9wb29sX2FsbG9jKHMtPmRlc2NyaXB0b3JfcG9vbCwgU0xBQl9LRVJORUwsCi0JCQkJICAgICAgICZwLT5kYl9idXMpOwotCQlwLT5wYXlsb2FkID0gcGNpX3Bvb2xfYWxsb2Mocy0+cGFja2V0X3Bvb2wsIFNMQUJfS0VSTkVMLAotCQkJCQkgICAgJnAtPnBheWxvYWRfYnVzKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUEFDS0VUX0xJU1RfU0laRTsgaSsrKSB7Ci0JCWlmIChpIDwgUEFDS0VUX0xJU1RfU0laRSAtIDEpCi0JCQluZXh0ID0gJnBsLT5wYWNrZXRzW2kgKyAxXTsKLQkJZWxzZQotCQkJbmV4dCA9IE5VTEw7Ci0JCXBhY2tldF9pbml0aWFsaXplKCZwbC0+cGFja2V0c1tpXSwgbmV4dCk7Ci0JfQotCi0JcmV0dXJuIHBsOwotfQotCi1zdGF0aWMgdm9pZCBwYWNrZXRfbGlzdF9mcmVlKHN0cnVjdCBwYWNrZXRfbGlzdCAqcGwsIHN0cnVjdCBzdHJlYW0gKnMpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUEFDS0VUX0xJU1RfU0laRTsgaSsrKSB7Ci0JCXN0cnVjdCBwYWNrZXQgKnAgPSAmcGwtPnBhY2tldHNbaV07Ci0JCXBjaV9wb29sX2ZyZWUocy0+ZGVzY3JpcHRvcl9wb29sLCBwLT5kYiwgcC0+ZGJfYnVzKTsKLQkJcGNpX3Bvb2xfZnJlZShzLT5wYWNrZXRfcG9vbCwgcC0+cGF5bG9hZCwgcC0+cGF5bG9hZF9idXMpOwotCX0KLQlrZnJlZShwbCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYnVmZmVyICpidWZmZXJfYWxsb2MoaW50IHNpemUpCi17Ci0Jc3RydWN0IGJ1ZmZlciAqYjsKLQotCWIgPSBrbWFsbG9jKHNpemVvZiAqYiArIHNpemUsIFNMQUJfS0VSTkVMKTsKLQlpZiAoYiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQliLT5oZWFkID0gMDsKLQliLT50YWlsID0gMDsKLQliLT5sZW5ndGggPSAwOwotCWItPnNpemUgPSBzaXplOwotCi0JcmV0dXJuIGI7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICpidWZmZXJfZ2V0X2J5dGVzKHN0cnVjdCBidWZmZXIgKmJ1ZmZlciwgaW50IHNpemUpCi17Ci0JdW5zaWduZWQgY2hhciAqcDsKLQotCWlmIChidWZmZXItPmhlYWQgKyBzaXplID4gYnVmZmVyLT5zaXplKQotCQlCVUcoKTsKLQotCXAgPSAmYnVmZmVyLT5kYXRhW2J1ZmZlci0+aGVhZF07Ci0JYnVmZmVyLT5oZWFkICs9IHNpemU7Ci0JaWYgKGJ1ZmZlci0+aGVhZCA9PSBidWZmZXItPnNpemUpCi0JCWJ1ZmZlci0+aGVhZCA9IDA7Ci0JYnVmZmVyLT5sZW5ndGggLT0gc2l6ZTsKLQotCXJldHVybiBwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqYnVmZmVyX3B1dF9ieXRlcyhzdHJ1Y3QgYnVmZmVyICpidWZmZXIsCi0JCQkJICAgICAgIHNpemVfdCBtYXgsIHNpemVfdCAqYWN0dWFsKQotewotCXNpemVfdCBsZW5ndGg7Ci0JdW5zaWduZWQgY2hhciAqcDsKLQotCXAgPSAmYnVmZmVyLT5kYXRhW2J1ZmZlci0+dGFpbF07Ci0JbGVuZ3RoID0gbWluKGJ1ZmZlci0+c2l6ZSAtIGJ1ZmZlci0+bGVuZ3RoLCBtYXgpOwotCWlmIChidWZmZXItPnRhaWwgKyBsZW5ndGggPCBidWZmZXItPnNpemUpIHsKLQkJKmFjdHVhbCA9IGxlbmd0aDsKLQkJYnVmZmVyLT50YWlsICs9IGxlbmd0aDsKLQl9Ci0JZWxzZSB7Ci0JCSphY3R1YWwgPSBidWZmZXItPnNpemUgLSBidWZmZXItPnRhaWw7Ci0JCSBidWZmZXItPnRhaWwgPSAwOwotCX0KLQotCWJ1ZmZlci0+bGVuZ3RoICs9ICphY3R1YWw7Ci0JcmV0dXJuIHA7Ci19Ci0KLXN0YXRpYyB1MzIgZ2V0X2llYzk1OF9oZWFkZXJfYml0cyhzdHJ1Y3Qgc3RyZWFtICpzLCBpbnQgc3ViX2ZyYW1lLCB1MzIgc2FtcGxlKQotewotCWludCBjc2ksIHBhcml0eSwgc2hpZnQ7Ci0JaW50IGJsb2NrX3N0YXJ0OwotCXUzMiBiaXRzOwotCi0Jc3dpdGNoIChzLT5pZWM5NThfZnJhbWVfY291bnQpIHsKLQljYXNlIDE6Ci0JCWNzaSA9IHMtPmZvcm1hdCA9PSBBTURUUF9GT1JNQVRfSUVDOTU4X0FDMzsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCWNhc2UgOToKLQkJY3NpID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSAyNCAuLi4gMjc6Ci0JCWNzaSA9IChzLT5pZWM5NThfcmF0ZV9jb2RlID4+ICgyNyAtIHMtPmllYzk1OF9mcmFtZV9jb3VudCkpICYgMHgwMTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJY3NpID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JYmxvY2tfc3RhcnQgPSAocy0+aWVjOTU4X2ZyYW1lX2NvdW50ID09IDAgJiYgc3ViX2ZyYW1lID09IDApOwotCi0JLyogVGhlIHBhcml0eSBiaXQgaXMgdGhlIHhvciBvZiB0aGUgc2FtcGxlIGJpdHMgYW5kIHRoZQotCSAqIGNoYW5uZWwgc3RhdHVzIGluZm8gYml0LiAqLwotCWZvciAoc2hpZnQgPSAxNiwgcGFyaXR5ID0gc2FtcGxlIF4gY3NpOyBzaGlmdCA+IDA7IHNoaWZ0ID4+PSAxKQotCQlwYXJpdHkgXj0gKHBhcml0eSA+PiBzaGlmdCk7Ci0KLQliaXRzID0gIChibG9ja19zdGFydCA8PCA1KSB8CQkvKiBCbG9jayBzdGFydCBiaXQgKi8KLQkJKChzdWJfZnJhbWUgPT0gMCkgPDwgNCkgfAkvKiBTdWJmcmFtZSBiaXQgKi8KLQkJKChwYXJpdHkgJiAxKSA8PCAzKSB8CQkvKiBQYXJpdHkgYml0ICovCi0JCShjc2kgPDwgMik7CQkJLyogQ2hhbm5lbCBzdGF0dXMgaW5mbyBiaXQgKi8KLQotCXJldHVybiBiaXRzOwotfQotCi1zdGF0aWMgdTMyIGdldF9oZWFkZXJfYml0cyhzdHJ1Y3Qgc3RyZWFtICpzLCBpbnQgc3ViX2ZyYW1lLCB1MzIgc2FtcGxlKQotewotCXN3aXRjaCAocy0+Zm9ybWF0KSB7Ci0JY2FzZSBBTURUUF9GT1JNQVRfSUVDOTU4X1BDTToKLQljYXNlIEFNRFRQX0ZPUk1BVF9JRUM5NThfQUMzOgotCQlyZXR1cm4gZ2V0X2llYzk1OF9oZWFkZXJfYml0cyhzLCBzdWJfZnJhbWUsIHNhbXBsZSk7Ci0KLQljYXNlIEFNRFRQX0ZPUk1BVF9SQVc6Ci0JCXJldHVybiAweDQwOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBmaWxsX3BheWxvYWRfbGUxNihzdHJ1Y3Qgc3RyZWFtICpzLCBxdWFkbGV0X3QgKmRhdGEsIGludCBuZXZlbnRzKQotewotCXF1YWRsZXRfdCAqZXZlbnQsIHNhbXBsZSwgYml0czsKLQl1bnNpZ25lZCBjaGFyICpwOwotCWludCBpLCBqOwotCi0JZm9yIChpID0gMCwgZXZlbnQgPSBkYXRhOyBpIDwgbmV2ZW50czsgaSsrKSB7Ci0KLQkJZm9yIChqID0gMDsgaiA8IHMtPmRpbWVuc2lvbjsgaisrKSB7Ci0JCQlwID0gYnVmZmVyX2dldF9ieXRlcyhzLT5pbnB1dCwgMik7Ci0JCQlzYW1wbGUgPSAocFsxXSA8PCAxNikgfCAocFswXSA8PCA4KTsKLQkJCWJpdHMgPSBnZXRfaGVhZGVyX2JpdHMocywgaiwgc2FtcGxlKTsKLQkJCWV2ZW50W2pdID0gY3B1X3RvX2JlMzIoKGJpdHMgPDwgMjQpIHwgc2FtcGxlKTsKLQkJfQotCi0JCWV2ZW50ICs9IHMtPmRpbWVuc2lvbjsKLQkJaWYgKCsrcy0+aWVjOTU4X2ZyYW1lX2NvdW50ID09IDE5MikKLQkJCXMtPmllYzk1OF9mcmFtZV9jb3VudCA9IDA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBmaWxsX3BhY2tldChzdHJ1Y3Qgc3RyZWFtICpzLCBzdHJ1Y3QgcGFja2V0ICpwYWNrZXQsIGludCBuZXZlbnRzKQotewotCWludCBzeXRfaW5kZXgsIHN5dCwgc2l6ZTsKLQl1MzIgY29udHJvbDsKLQotCXNpemUgPSAobmV2ZW50cyAqIHMtPmRpbWVuc2lvbiArIDIpICogc2l6ZW9mKHF1YWRsZXRfdCk7Ci0KLQkvKiBVcGRhdGUgRE1BIGRlc2NyaXB0b3JzICovCi0JcGFja2V0LT5kYi0+cGF5bG9hZF9kZXNjLnN0YXR1cyA9IDA7Ci0JY29udHJvbCA9IHBhY2tldC0+ZGItPnBheWxvYWRfZGVzYy5jb250cm9sICYgMHhmZmZmMDAwMDsKLQlwYWNrZXQtPmRiLT5wYXlsb2FkX2Rlc2MuY29udHJvbCA9IGNvbnRyb2wgfCBzaXplOwotCi0JLyogRmlsbCBJRUVFMTM5NCBoZWFkZXJzICovCi0JcGFja2V0LT5kYi0+aGVhZGVyX2Rlc2MuaGVhZGVyWzBdID0KLQkJKElFRUUxMzk0X1NQRUVEXzEwMCA8PCAxNikgfCAoMHgwMSA8PCAxNCkgfAotCQkocy0+aXNvX2NoYW5uZWwgPDwgOCkgfCAoVENPREVfSVNPX0RBVEEgPDwgNCk7Ci0JcGFja2V0LT5kYi0+aGVhZGVyX2Rlc2MuaGVhZGVyWzFdID0gc2l6ZSA8PCAxNjsKLQotCS8qIENhbGN1bGF0ZSBzeW5jaHJvbml6YXRpb24gdGltZXN0YW1wIChzeXQpLiBGaXJzdCB3ZQotCSAqIGRldGVybWluZSBzeXRfaW5kZXgsIHRoYXQgaXMsIHRoZSBpbmRleCBpbiB0aGUgcGFja2V0IG9mCi0JICogdGhlIHNhbXBsZSBmb3Igd2hpY2ggdGhlIHRpbWVzdGFtcCBpcyB2YWxpZC4gKi8KLQlzeXRfaW5kZXggPSAocy0+c3l0X2ludGVydmFsIC0gcy0+ZGJjKSAmIChzLT5zeXRfaW50ZXJ2YWwgLSAxKTsKLQlpZiAoc3l0X2luZGV4IDwgbmV2ZW50cykgewotCQlzeXQgPSAoKGF0b21pY19yZWFkKCZzLT5jeWNsZV9jb3VudCkgPDwgMTIpIHwKLQkJICAgICAgIHMtPmN5Y2xlX29mZnNldC5pbnRlZ2VyKSAmIDB4ZmZmZjsKLQkJZnJhY3Rpb25fYWRkKCZzLT5jeWNsZV9vZmZzZXQsCi0JCQkgICAgICZzLT5jeWNsZV9vZmZzZXQsICZzLT50aWNrc19wZXJfc3l0X29mZnNldCk7Ci0KLQkJLyogVGhpcyBuZXh0IGFkZGl0aW9uIHNob3VsZCBiZSBtb2R1bG8gODAwMCAoMHgxZjQwKSwKLQkJICogYnV0IHdlIG9ubHkgdXNlIHRoZSBsb3dlciA0IGJpdHMgb2YgY3ljbGVfY291bnQsIHNvCi0JCSAqIHdlIGRvbid0IG5lZWQgdGhlIG1vZHVsby4gKi8KLQkJYXRvbWljX2FkZChzLT5jeWNsZV9vZmZzZXQuaW50ZWdlciAvIDMwNzIsICZzLT5jeWNsZV9jb3VudCk7Ci0JCXMtPmN5Y2xlX29mZnNldC5pbnRlZ2VyICU9IDMwNzI7Ci0JfQotCWVsc2UKLQkJc3l0ID0gMHhmZmZmOwotCi0JYXRvbWljX2luYygmcy0+Y3ljbGVfY291bnQyKTsKLQotCS8qIEZpbGwgY2lwIGhlYWRlciAqLwotCXBhY2tldC0+cGF5bG9hZC0+ZW9oMCA9IDA7Ci0JcGFja2V0LT5wYXlsb2FkLT5zaWQgPSBzLT5ob3N0LT5ob3N0LT5ub2RlX2lkICYgMHgzZjsKLQlwYWNrZXQtPnBheWxvYWQtPmRicyA9IHMtPmRpbWVuc2lvbjsKLQlwYWNrZXQtPnBheWxvYWQtPmZuID0gMDsKLQlwYWNrZXQtPnBheWxvYWQtPnFwYyA9IDA7Ci0JcGFja2V0LT5wYXlsb2FkLT5zcGggPSAwOwotCXBhY2tldC0+cGF5bG9hZC0+cmVzZXJ2ZWQgPSAwOwotCXBhY2tldC0+cGF5bG9hZC0+ZGJjID0gcy0+ZGJjOwotCXBhY2tldC0+cGF5bG9hZC0+ZW9oMSA9IDI7Ci0JcGFja2V0LT5wYXlsb2FkLT5mbXQgPSBGTVRfQU1EVFA7Ci0JcGFja2V0LT5wYXlsb2FkLT5mZGYgPSBzLT5mZGY7Ci0JcGFja2V0LT5wYXlsb2FkLT5zeXQgPSBjcHVfdG9fYmUxNihzeXQpOwotCi0Jc3dpdGNoIChzLT5zYW1wbGVfZm9ybWF0KSB7Ci0JY2FzZSBBTURUUF9JTlBVVF9MRTE2OgotCQlmaWxsX3BheWxvYWRfbGUxNihzLCBwYWNrZXQtPnBheWxvYWQtPmRhdGEsIG5ldmVudHMpOwotCQlicmVhazsKLQl9Ci0KLQlzLT5kYmMgKz0gbmV2ZW50czsKLX0KLQotc3RhdGljIHZvaWQgc3RyZWFtX2ZsdXNoKHN0cnVjdCBzdHJlYW0gKnMpCi17Ci0Jc3RydWN0IHBhY2tldCAqcDsKLQlpbnQgbmV2ZW50czsKLQlzdHJ1Y3QgZnJhY3Rpb24gbmV4dDsKLQotCS8qIFRoZSBBTURUUCBzcGVjaWZpZXMgdHdvIHRyYW5zbWlzc2lvbiBtb2RlczogYmxvY2tpbmcgYW5kCi0JICogbm9uLWJsb2NraW5nLiAgSW4gYmxvY2tpbmcgbW9kZSB5b3UgYWx3YXlzIHRyYW5zZmVyCi0JICogc3l0X2ludGVydmFsIG9yIHplcm8gc2FtcGxlcywgd2hlcmVhcyBpbiBub24tYmxvY2tpbmcgbW9kZQotCSAqIHlvdSBzZW5kIGFzIG1hbnkgc2FtcGxlcyBhcyB5b3UgaGF2ZSBhdmFpbGFibGUgYXQgdHJhbnNmZXIKLQkgKiB0aW1lLgotCSAqCi0JICogVGhlIGZyYWN0aW9uIHNhbXBsZXNfcGVyX2N5Y2xlIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mCi0JICogc2FtcGxlcyB0aGF0IGJlY29tZSBhdmFpbGFibGUgcGVyIGN5Y2xlLiAgV2UgYWRkIHRoaXMgdG8KLQkgKiB0aGUgZnJhY3Rpb24gcmVhZHlfc2FtcGxlcywgd2hpY2ggc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YKLQkgKiBsZWZ0b3ZlciBzYW1wbGVzIGZyb20gdGhlIHByZXZpb3VzIHRyYW5zbWlzc2lvbi4gIFRoZSBzdW0sCi0JICogc3RvcmVkIGluIHRoZSBmcmFjdGlvbiBuZXh0LCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZgotCSAqIHNhbXBsZXMgYXZhaWxhYmxlIGZvciB0cmFuc21pc3Npb24sIGFuZCBmcm9tIHRoaXMgd2UKLQkgKiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIGFjdHVhbGx5IHRyYW5zbWl0LgotCSAqLwotCi0Jd2hpbGUgKDEpIHsKLQkJZnJhY3Rpb25fYWRkKCZuZXh0LCAmcy0+cmVhZHlfc2FtcGxlcywgJnMtPnNhbXBsZXNfcGVyX2N5Y2xlKTsKLQkJaWYgKHMtPm1vZGUgPT0gQU1EVFBfTU9ERV9CTE9DS0lORykgewotCQkJaWYgKGZyYWN0aW9uX2Zsb29yKCZuZXh0KSA+PSBzLT5zeXRfaW50ZXJ2YWwpCi0JCQkJbmV2ZW50cyA9IHMtPnN5dF9pbnRlcnZhbDsKLQkJCWVsc2UKLQkJCQluZXZlbnRzID0gMDsKLQkJfQotCQllbHNlCi0JCQluZXZlbnRzID0gZnJhY3Rpb25fZmxvb3IoJm5leHQpOwotCi0JCXAgPSBzdHJlYW1fY3VycmVudF9wYWNrZXQocyk7Ci0JCWlmIChzLT5pbnB1dC0+bGVuZ3RoIDwgbmV2ZW50cyAqIHMtPmRpbWVuc2lvbiAqIDIgfHwgcCA9PSBOVUxMKQotCQkJYnJlYWs7Ci0KLQkJZmlsbF9wYWNrZXQocywgcCwgbmV2ZW50cyk7Ci0JCXN0cmVhbV9xdWV1ZV9wYWNrZXQocyk7Ci0KLQkJLyogTm93IHRoYXQgd2UgaGF2ZSBzdWNjZXNzZnVsbHkgcXVldWVkIHRoZSBwYWNrZXQgZm9yCi0JCSAqIHRyYW5zbWlzc2lvbiwgd2UgdXBkYXRlIHRoZSBmcmFjdGlvbiByZWFkeV9zYW1wbGVzLiAqLwotCQlmcmFjdGlvbl9zdWJfaW50KCZzLT5yZWFkeV9zYW1wbGVzLCAmbmV4dCwgbmV2ZW50cyk7Ci0JfQotfQotCi1zdGF0aWMgaW50IHN0cmVhbV9hbGxvY19wYWNrZXRfbGlzdHMoc3RydWN0IHN0cmVhbSAqcykKLXsKLQlpbnQgbWF4X25ldmVudHMsIG1heF9wYWNrZXRfc2l6ZSwgaTsKLQotCWlmIChzLT5tb2RlID09IEFNRFRQX01PREVfQkxPQ0tJTkcpCi0JCW1heF9uZXZlbnRzID0gcy0+c3l0X2ludGVydmFsOwotCWVsc2UKLQkJbWF4X25ldmVudHMgPSBmcmFjdGlvbl9jZWlsKCZzLT5zYW1wbGVzX3Blcl9jeWNsZSk7Ci0KLQltYXhfcGFja2V0X3NpemUgPSBtYXhfbmV2ZW50cyAqIHMtPmRpbWVuc2lvbiAqIDQgKyA4OwotCXMtPnBhY2tldF9wb29sID0gcGNpX3Bvb2xfY3JlYXRlKCJwYWNrZXQgcG9vbCIsIHMtPmhvc3QtPm9oY2ktPmRldiwKLQkJCQkJIG1heF9wYWNrZXRfc2l6ZSwgMCwgMCk7Ci0KLQlpZiAocy0+cGFja2V0X3Bvb2wgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCi0JSU5JVF9MSVNUX0hFQUQoJnMtPmZyZWVfcGFja2V0X2xpc3RzKTsKLQlJTklUX0xJU1RfSEVBRCgmcy0+ZG1hX3BhY2tldF9saXN0cyk7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9QQUNLRVRfTElTVFM7IGkrKykgewotCQlzdHJ1Y3QgcGFja2V0X2xpc3QgKnBsID0gcGFja2V0X2xpc3RfYWxsb2Mocyk7Ci0JCWlmIChwbCA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JCWxpc3RfYWRkX3RhaWwoJnBsLT5saW5rLCAmcy0+ZnJlZV9wYWNrZXRfbGlzdHMpOwotCX0KLQotCXJldHVybiBpIDwgTUFYX1BBQ0tFVF9MSVNUUyA/IC0xIDogMDsKLX0KLQotc3RhdGljIHZvaWQgc3RyZWFtX2ZyZWVfcGFja2V0X2xpc3RzKHN0cnVjdCBzdHJlYW0gKnMpCi17Ci0Jc3RydWN0IHBhY2tldF9saXN0ICpwYWNrZXRfbCwgKnBhY2tldF9sX25leHQ7Ci0KLQlpZiAocy0+Y3VycmVudF9wYWNrZXRfbGlzdCAhPSBOVUxMKQotCQlwYWNrZXRfbGlzdF9mcmVlKHMtPmN1cnJlbnRfcGFja2V0X2xpc3QsIHMpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWNrZXRfbCwgcGFja2V0X2xfbmV4dCwgJnMtPmRtYV9wYWNrZXRfbGlzdHMsIGxpbmspCi0JCXBhY2tldF9saXN0X2ZyZWUocGFja2V0X2wsIHMpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWNrZXRfbCwgcGFja2V0X2xfbmV4dCwgJnMtPmZyZWVfcGFja2V0X2xpc3RzLCBsaW5rKQotCQlwYWNrZXRfbGlzdF9mcmVlKHBhY2tldF9sLCBzKTsKLQlpZiAocy0+cGFja2V0X3Bvb2wgIT0gTlVMTCkKLQkJcGNpX3Bvb2xfZGVzdHJveShzLT5wYWNrZXRfcG9vbCk7Ci0KLQlzLT5jdXJyZW50X3BhY2tldF9saXN0ID0gTlVMTDsKLQlJTklUX0xJU1RfSEVBRCgmcy0+ZnJlZV9wYWNrZXRfbGlzdHMpOwotCUlOSVRfTElTVF9IRUFEKCZzLT5kbWFfcGFja2V0X2xpc3RzKTsKLQlzLT5wYWNrZXRfcG9vbCA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIHBsdWdfdXBkYXRlKHN0cnVjdCBjbXBfcGNyICpwbHVnLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBzdHJlYW0gKnMgPSBkYXRhOwotCi0JSFBTQl9JTkZPKCJwbHVnIHVwZGF0ZTogcDJwX2NvdW50PSVkLCBjaGFubmVsPSVkIiwKLQkJICBwbHVnLT5wMnBfY291bnQsIHBsdWctPmNoYW5uZWwpOwotCXMtPmlzb19jaGFubmVsID0gcGx1Zy0+Y2hhbm5lbDsKLQlpZiAocGx1Zy0+cDJwX2NvdW50ID4gMCkgewotCQlzdHJ1Y3QgcGFja2V0X2xpc3QgKnBsOwotCi0JCXBsID0gbGlzdF9lbnRyeShzLT5kbWFfcGFja2V0X2xpc3RzLm5leHQsIHN0cnVjdCBwYWNrZXRfbGlzdCwgbGluayk7Ci0JCXN0cmVhbV9zdGFydF9kbWEocywgcGwpOwotCX0KLQllbHNlIHsKLQkJb2hjaTEzOTRfc3RvcF9pdF9jdHgocy0+aG9zdC0+b2hjaSwgcy0+aXNvX3Rhc2tsZXQuY29udGV4dCwgMCk7Ci0JfQotfQotCi1zdGF0aWMgaW50IHN0cmVhbV9jb25maWd1cmUoc3RydWN0IHN0cmVhbSAqcywgaW50IGNtZCwgc3RydWN0IGFtZHRwX2lvY3RsICpjZmcpCi17Ci0JY29uc3QgaW50IHRyYW5zZmVyX2RlbGF5ID0gOTAwMDsKLQotCWlmIChjZmctPmZvcm1hdCA8PSBBTURUUF9GT1JNQVRfSUVDOTU4X0FDMykKLQkJcy0+Zm9ybWF0ID0gY2ZnLT5mb3JtYXQ7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN3aXRjaCAoY2ZnLT5yYXRlKSB7Ci0JY2FzZSAzMjAwMDoKLQkJcy0+c3l0X2ludGVydmFsID0gODsKLQkJcy0+ZmRmID0gRkRGX1NGQ18zMktIWjsKLQkJcy0+aWVjOTU4X3JhdGVfY29kZSA9IDB4MGM7Ci0JCWJyZWFrOwotCWNhc2UgNDQxMDA6Ci0JCXMtPnN5dF9pbnRlcnZhbCA9IDg7Ci0JCXMtPmZkZiA9IEZERl9TRkNfNDRLMUhaOwotCQlzLT5pZWM5NThfcmF0ZV9jb2RlID0gMHgwMDsKLQkJYnJlYWs7Ci0JY2FzZSA0ODAwMDoKLQkJcy0+c3l0X2ludGVydmFsID0gODsKLQkJcy0+ZmRmID0gRkRGX1NGQ180OEtIWjsKLQkJcy0+aWVjOTU4X3JhdGVfY29kZSA9IDB4MDQ7Ci0JCWJyZWFrOwotCWNhc2UgODgyMDA6Ci0JCXMtPnN5dF9pbnRlcnZhbCA9IDE2OwotCQlzLT5mZGYgPSBGREZfU0ZDXzg4SzJIWjsKLQkJcy0+aWVjOTU4X3JhdGVfY29kZSA9IDB4MDA7Ci0JCWJyZWFrOwotCWNhc2UgOTYwMDA6Ci0JCXMtPnN5dF9pbnRlcnZhbCA9IDE2OwotCQlzLT5mZGYgPSBGREZfU0ZDXzk2S0haOwotCQlzLT5pZWM5NThfcmF0ZV9jb2RlID0gMHgwMDsKLQkJYnJlYWs7Ci0JY2FzZSAxNzY0MDA6Ci0JCXMtPnN5dF9pbnRlcnZhbCA9IDMyOwotCQlzLT5mZGYgPSBGREZfU0ZDXzE3Nks0SFo7Ci0JCXMtPmllYzk1OF9yYXRlX2NvZGUgPSAweDAwOwotCQlicmVhazsKLQljYXNlIDE5MjAwMDoKLQkJcy0+c3l0X2ludGVydmFsID0gMzI7Ci0JCXMtPmZkZiA9IEZERl9TRkNfMTkyS0haOwotCQlzLT5pZWM5NThfcmF0ZV9jb2RlID0gMHgwMDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzLT5yYXRlID0gY2ZnLT5yYXRlOwotCWZyYWN0aW9uX2luaXQoJnMtPnNhbXBsZXNfcGVyX2N5Y2xlLCBzLT5yYXRlLCA4MDAwKTsKLQlmcmFjdGlvbl9pbml0KCZzLT5yZWFkeV9zYW1wbGVzLCAwLCA4MDAwKTsKLQotCS8qIFRoZSB0aWNrc19wZXJfc3l0X29mZnNldCBpcyBpbml0aWFsaXplZCB0byB0aGUgbnVtYmVyIG9mCi0JICogdGlja3MgYmV0d2VlbiBzeXRfaW50ZXJ2YWwgZXZlbnRzLiAgVGhlIG51bWJlciBvZiB0aWNrcyBwZXIKLQkgKiBzZWNvbmQgaXMgMjQuNTc2ZTYsIHNvIHRoZSBudW1iZXIgb2YgdGlja3MgYmV0d2VlbgotCSAqIHN5dF9pbnRlcnZhbCBldmVudHMgaXMgMjQuNTc2ZTYgKiBzeXRfaW50ZXJ2YWwgLyByYXRlLgotCSAqLwotCWZyYWN0aW9uX2luaXQoJnMtPnRpY2tzX3Blcl9zeXRfb2Zmc2V0LAotCQkgICAgICAyNDU3NjAwMCAqIHMtPnN5dF9pbnRlcnZhbCwgcy0+cmF0ZSk7Ci0JZnJhY3Rpb25faW5pdCgmcy0+Y3ljbGVfb2Zmc2V0LCAodHJhbnNmZXJfZGVsYXkgJSAzMDcyKSAqIHMtPnJhdGUsIHMtPnJhdGUpOwotCWF0b21pY19zZXQoJnMtPmN5Y2xlX2NvdW50LCB0cmFuc2Zlcl9kZWxheSAvIDMwNzIpOwotCWF0b21pY19zZXQoJnMtPmN5Y2xlX2NvdW50MiwgMCk7Ci0KLQlzLT5tb2RlID0gY2ZnLT5tb2RlOwotCXMtPnNhbXBsZV9mb3JtYXQgPSBBTURUUF9JTlBVVF9MRTE2OwotCi0JLyogV2hlbiB1c2luZyB0aGUgQU04MjQgcmF3IHN1YmZvcm1hdCB3ZSBjYW4gc3RyZWFtIHNpZ25hbHMgb2YKLQkgKiBhbnkgZGltZW5zaW9uLiAgVGhlIElFQzk1OCBzdWJmb3JtYXQsIGhvd2V2ZXIsIG9ubHkKLQkgKiBzdXBwb3J0cyAyIGNoYW5uZWxzLgotCSAqLwotCWlmIChzLT5mb3JtYXQgPT0gQU1EVFBfRk9STUFUX1JBVyB8fCBjZmctPmRpbWVuc2lvbiA9PSAyKQotCQlzLT5kaW1lbnNpb24gPSBjZmctPmRpbWVuc2lvbjsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHMtPm9wY3IgIT0gTlVMTCkgewotCQljbXBfdW5yZWdpc3Rlcl9vcGNyKHMtPmhvc3QtPmhvc3QsIHMtPm9wY3IpOwotCQlzLT5vcGNyID0gTlVMTDsKLQl9Ci0KLQlzd2l0Y2goY21kKSB7Ci0JY2FzZSBBTURUUF9JT0NfUExVRzoKLQkJcy0+b3BjciA9IGNtcF9yZWdpc3Rlcl9vcGNyKHMtPmhvc3QtPmhvc3QsIGNmZy0+dS5wbHVnLAotCQkJCQkgICAvKnBheWxvYWQqLyAxMiwgcGx1Z191cGRhdGUsIHMpOwotCQlpZiAocy0+b3BjciA9PSBOVUxMKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXMtPmlzb19jaGFubmVsID0gcy0+b3Bjci0+Y2hhbm5lbDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFNRFRQX0lPQ19DSEFOTkVMOgotCQlpZiAoY2ZnLT51LmNoYW5uZWwgPj0gMCAmJiBjZmctPnUuY2hhbm5lbCA8IDY0KQotCQkJcy0+aXNvX2NoYW5uZWwgPSBjZmctPnUuY2hhbm5lbDsKLQkJZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQotCS8qIFRoZSBpb2N0bCBzZXR0aW5ncyB3ZXJlIGFsbCB2YWxpZCwgc28gd2UgcmVhbGxvYyB0aGUgcGFja2V0Ci0JICogbGlzdHMgdG8gbWFrZSBzdXJlIHRoZSBwYWNrZXQgc2l6ZSBpcyBiaWcgZW5vdWdoLgotCSAqLwotCWlmIChzLT5wYWNrZXRfcG9vbCAhPSBOVUxMKQotCQlzdHJlYW1fZnJlZV9wYWNrZXRfbGlzdHMocyk7Ci0KLQlpZiAoc3RyZWFtX2FsbG9jX3BhY2tldF9saXN0cyhzKSA8IDApIHsKLQkJc3RyZWFtX2ZyZWVfcGFja2V0X2xpc3RzKHMpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzdHJlYW0gKnN0cmVhbV9hbGxvYyhzdHJ1Y3QgYW1kdHBfaG9zdCAqaG9zdCkKLXsKLQlzdHJ1Y3Qgc3RyZWFtICpzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLSAgICAgICAgcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdHJlYW0pLCBTTEFCX0tFUk5FTCk7Ci0gICAgICAgIGlmIChzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAgICAgbWVtc2V0KHMsIDAsIHNpemVvZihzdHJ1Y3Qgc3RyZWFtKSk7Ci0Jcy0+aG9zdCA9IGhvc3Q7Ci0KLQlzLT5pbnB1dCA9IGJ1ZmZlcl9hbGxvYyhCVUZGRVJfU0laRSk7Ci0JaWYgKHMtPmlucHV0ID09IE5VTEwpIHsKLQkJa2ZyZWUocyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXMtPmRlc2NyaXB0b3JfcG9vbCA9IHBjaV9wb29sX2NyZWF0ZSgiZGVzY3JpcHRvciBwb29sIiwgaG9zdC0+b2hjaS0+ZGV2LAotCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgZGVzY3JpcHRvcl9ibG9jayksCi0JCQkJCSAgICAgMTYsIDApOwotCi0JaWYgKHMtPmRlc2NyaXB0b3JfcG9vbCA9PSBOVUxMKSB7Ci0JCWtmcmVlKHMtPmlucHV0KTsKLQkJa2ZyZWUocyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCUlOSVRfTElTVF9IRUFEKCZzLT5mcmVlX3BhY2tldF9saXN0cyk7Ci0JSU5JVF9MSVNUX0hFQUQoJnMtPmRtYV9wYWNrZXRfbGlzdHMpOwotCi0gICAgICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPnBhY2tldF9saXN0X3dhaXQpOwotICAgICAgICBzcGluX2xvY2tfaW5pdCgmcy0+cGFja2V0X2xpc3RfbG9jayk7Ci0KLQlvaGNpMTM5NF9pbml0X2lzb190YXNrbGV0KCZzLT5pc29fdGFza2xldCwgT0hDSV9JU09fVFJBTlNNSVQsCi0JCQkJICBzdHJlYW1fc2hpZnRfcGFja2V0X2xpc3RzLAotCQkJCSAgKHVuc2lnbmVkIGxvbmcpIHMpOwotCi0JaWYgKG9oY2kxMzk0X3JlZ2lzdGVyX2lzb190YXNrbGV0KGhvc3QtPm9oY2ksICZzLT5pc29fdGFza2xldCkgPCAwKSB7Ci0JCXBjaV9wb29sX2Rlc3Ryb3kocy0+ZGVzY3JpcHRvcl9wb29sKTsKLQkJa2ZyZWUocy0+aW5wdXQpOwotCQlrZnJlZShzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPnN0cmVhbV9saXN0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZzLT5saW5rLCAmaG9zdC0+c3RyZWFtX2xpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPnN0cmVhbV9saXN0X2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiBzOwotfQotCi1zdGF0aWMgdm9pZCBzdHJlYW1fZnJlZShzdHJ1Y3Qgc3RyZWFtICpzKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBTdG9wIHRoZSBETUEuICBXZSB3YWl0IGZvciB0aGUgZG1hIHBhY2tldCBsaXN0IHRvIGJlY29tZQotCSAqIGVtcHR5IGFuZCBsZXQgdGhlIGRtYSBjb250cm9sbGVyIHJ1biBvdXQgb2YgcHJvZ3JhbXMuICBUaGlzCi0JICogc2VlbXMgdG8gYmUgbW9yZSByZWxpYWJsZSB0aGFuIHN0b3BwaW5nIGl0IGRpcmVjdGx5LCBzaW5jZQotCSAqIHRoYXQgc29tZXRpbWVzIGdlbmVyYXRlcyBhbiBpdCB0cmFuc21pdCBpbnRlcnJ1cHQgaWYgd2UKLQkgKiBsYXRlciByZS1lbmFibGUgdGhlIGNvbnRleHQuCi0JICovCi0Jd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHMtPnBhY2tldF9saXN0X3dhaXQsCi0JCQkJIGxpc3RfZW1wdHkoJnMtPmRtYV9wYWNrZXRfbGlzdHMpKTsKLQotCW9oY2kxMzk0X3N0b3BfaXRfY3R4KHMtPmhvc3QtPm9oY2ksIHMtPmlzb190YXNrbGV0LmNvbnRleHQsIDEpOwotCW9oY2kxMzk0X3VucmVnaXN0ZXJfaXNvX3Rhc2tsZXQocy0+aG9zdC0+b2hjaSwgJnMtPmlzb190YXNrbGV0KTsKLQotCWlmIChzLT5vcGNyICE9IE5VTEwpCi0JCWNtcF91bnJlZ2lzdGVyX29wY3Iocy0+aG9zdC0+aG9zdCwgcy0+b3Bjcik7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+aG9zdC0+c3RyZWFtX2xpc3RfbG9jaywgZmxhZ3MpOwotCWxpc3RfZGVsKCZzLT5saW5rKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5ob3N0LT5zdHJlYW1fbGlzdF9sb2NrLCBmbGFncyk7Ci0KLQlrZnJlZShzLT5pbnB1dCk7Ci0KLQlzdHJlYW1fZnJlZV9wYWNrZXRfbGlzdHMocyk7Ci0JcGNpX3Bvb2xfZGVzdHJveShzLT5kZXNjcmlwdG9yX3Bvb2wpOwotCi0Ja2ZyZWUocyk7Ci19Ci0KLS8qIEZpbGUgb3BlcmF0aW9ucyAqLwotCi1zdGF0aWMgc3NpemVfdCBhbWR0cF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LAotCQkJICAgbG9mZl90ICpvZmZzZXRfaXNfaWdub3JlZCkKLXsKLQlzdHJ1Y3Qgc3RyZWFtICpzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGNoYXIgKnA7Ci0JaW50IGk7Ci0Jc2l6ZV90IGxlbmd0aDsKLQotCWlmIChzLT5wYWNrZXRfcG9vbCA9PSBOVUxMKQotCQlyZXR1cm4gLUVCQURGRDsKLQotCS8qIEZpbGwgdGhlIGNpcmN1bGFyIGJ1ZmZlciBmcm9tIHRoZSBpbnB1dCBidWZmZXIgYW5kIGNhbGwgdGhlCi0JICogaXNvIHBhY2tlciB3aGVuIHRoZSBidWZmZXIgaXMgZnVsbC4gIFRoZSBpc28gcGFja2VyIG1heQotCSAqIGxlYXZlIGJ5dGVzIGluIHRoZSBidWZmZXIgZm9yIHR3byByZWFzb25zOiBlaXRoZXIgdGhlCi0JICogcmVtYWluaW5nIGJ5dGVzIHdhc24ndCBlbm91Z2ggdG8gYnVpbGQgYSBuZXcgcGFja2V0LCBvcgotCSAqIHRoZXJlIHdlcmUgbm8gZnJlZSBwYWNrZXQgbGlzdHMuICBJbiB0aGUgZmlyc3QgY2FzZSB3ZQotCSAqIHJlLWZpbGwgdGhlIGJ1ZmZlciBhbmQgY2FsbCB0aGUgaXNvIHBhY2tlciBhZ2FpbiBvciByZXR1cm4KLQkgKiBpZiB3ZSB1c2VkIGFsbCB0aGUgZGF0YSBmcm9tIHVzZXJzcGFjZS4gIEluIHRoZSBzZWNvbmQKLQkgKiBjYXNlLCB0aGUgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlIHdpbGwgYmxvY2sgdW50aWwgdGhlIGlycQotCSAqIGhhbmRsZXIgZnJlZXMgYSBwYWNrZXQgbGlzdC4KLQkgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSArPSBsZW5ndGgpIHsKLQkJcCA9IGJ1ZmZlcl9wdXRfYnl0ZXMocy0+aW5wdXQsIGNvdW50IC0gaSwgJmxlbmd0aCk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihwLCBidWZmZXIgKyBpLCBsZW5ndGgpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmIChzLT5pbnB1dC0+bGVuZ3RoIDwgcy0+aW5wdXQtPnNpemUpCi0JCQljb250aW51ZTsKLQotCQlzdHJlYW1fZmx1c2gocyk7Ci0KLQkJaWYgKHMtPmN1cnJlbnRfcGFja2V0X2xpc3QgIT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKLQkJCXJldHVybiBpICsgbGVuZ3RoID4gMCA/IGkgKyBsZW5ndGggOiAtRUFHQUlOOwotCi0JCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocy0+cGFja2V0X2xpc3Rfd2FpdCwKLQkJCQkJICAgICAhbGlzdF9lbXB0eSgmcy0+ZnJlZV9wYWNrZXRfbGlzdHMpKSkKLQkJCXJldHVybiAtRUlOVFI7Ci0JfQotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgbG9uZyBhbWR0cF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHN0cmVhbSAqcyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYW1kdHBfaW9jdGwgY2ZnOwotCWludCBlcnI7Ci0JbG9ja19rZXJuZWwoKTsKLQlzd2l0Y2goY21kKQotCXsKLQljYXNlIEFNRFRQX0lPQ19QTFVHOgotCWNhc2UgQU1EVFBfSU9DX0NIQU5ORUw6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAoc3RydWN0IGFtZHRwX2lvY3RsIF9fdXNlciAqKSBhcmcsIHNpemVvZiBjZmcpKQotCQkJZXJyID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJZXJyID0gc3RyZWFtX2NvbmZpZ3VyZShzLCBjbWQsICZjZmcpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQl1bmxvY2tfa2VybmVsKCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBhbWR0cF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICpwdCkKLXsKLQlzdHJ1Y3Qgc3RyZWFtICpzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JcG9sbF93YWl0KGZpbGUsICZzLT5wYWNrZXRfbGlzdF93YWl0LCBwdCk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJnMtPmZyZWVfcGFja2V0X2xpc3RzKSkKLQkJcmV0dXJuIFBPTExPVVQgfCBQT0xMV1JOT1JNOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYW1kdHBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYW1kdHBfaG9zdCAqaG9zdDsKLQlpbnQgaSA9IGllZWUxMzk0X2ZpbGVfdG9faW5zdGFuY2UoZmlsZSk7Ci0KLQlob3N0ID0gaHBzYl9nZXRfaG9zdGluZm9fYnlrZXkoJmFtZHRwX2hpZ2hsZXZlbCwgaSk7Ci0JaWYgKGhvc3QgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBzdHJlYW1fYWxsb2MoaG9zdCk7Ci0JaWYgKGZpbGUtPnByaXZhdGVfZGF0YSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFtZHRwX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHN0cmVhbSAqcyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCXN0cmVhbV9mcmVlKHMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2RldiBhbWR0cF9jZGV2Owotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYW1kdHBfZm9wcyA9Ci17Ci0JLm93bmVyID0JVEhJU19NT0RVTEUsCi0JLndyaXRlID0JYW1kdHBfd3JpdGUsCi0JLnBvbGwgPQkJYW1kdHBfcG9sbCwKLQkudW5sb2NrZWRfaW9jdGwgPSBhbWR0cF9pb2N0bCwKLQkuY29tcGF0X2lvY3RsID0gYW1kdHBfaW9jdGwsIC8qIEFsbCBhbWR0cCBpb2N0bHMgYXJlIGNvbXBhdGlibGUgKi8KLQkub3BlbiA9CQlhbWR0cF9vcGVuLAotCS5yZWxlYXNlID0JYW1kdHBfcmVsZWFzZQotfTsKLQotLyogSUVFRTEzOTQgU3Vic3lzdGVtIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgdm9pZCBhbWR0cF9hZGRfaG9zdChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQotewotCXN0cnVjdCBhbWR0cF9ob3N0ICphaDsKLQlpbnQgbWlub3I7Ci0KLQlpZiAoc3RyY21wKGhvc3QtPmRyaXZlci0+bmFtZSwgT0hDSTEzOTRfRFJJVkVSX05BTUUpICE9IDApCi0JCXJldHVybjsKLQotCWFoID0gaHBzYl9jcmVhdGVfaG9zdGluZm8oJmFtZHRwX2hpZ2hsZXZlbCwgaG9zdCwgc2l6ZW9mKCphaCkpOwotCWlmICghYWgpIHsKLQkJSFBTQl9FUlIoImFtZHRwOiBVbmFibGUgYWJsZSB0byBhbGxvYyBob3N0aW5mbyIpOwotCQlyZXR1cm47Ci0JfQotCi0JYWgtPmhvc3QgPSBob3N0OwotCWFoLT5vaGNpID0gaG9zdC0+aG9zdGRhdGE7Ci0KLQlocHNiX3NldF9ob3N0aW5mb19rZXkoJmFtZHRwX2hpZ2hsZXZlbCwgaG9zdCwgYWgtPmhvc3QtPmlkKTsKLQotCW1pbm9yID0gSUVFRTEzOTRfTUlOT1JfQkxPQ0tfQU1EVFAgKiAxNiArIGFoLT5ob3N0LT5pZDsKLQotCUlOSVRfTElTVF9IRUFEKCZhaC0+c3RyZWFtX2xpc3QpOwotCXNwaW5fbG9ja19pbml0KCZhaC0+c3RyZWFtX2xpc3RfbG9jayk7Ci0KLQlkZXZmc19ta19jZGV2KE1LREVWKElFRUUxMzk0X01BSk9SLCBtaW5vciksCi0JCQlTX0lGQ0hSfFNfSVJVU1J8U19JV1VTUiwgImFtZHRwLyVkIiwgYWgtPmhvc3QtPmlkKTsKLX0KLQotc3RhdGljIHZvaWQgYW1kdHBfcmVtb3ZlX2hvc3Qoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKLXsKLQlzdHJ1Y3QgYW1kdHBfaG9zdCAqYWggPSBocHNiX2dldF9ob3N0aW5mbygmYW1kdHBfaGlnaGxldmVsLCBob3N0KTsKLQotCWlmIChhaCkKLQkJZGV2ZnNfcmVtb3ZlKCJhbWR0cC8lZCIsIGFoLT5ob3N0LT5pZCk7Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgYW1kdHBfaGlnaGxldmVsID0gewotCS5uYW1lID0JCSJhbWR0cCIsCi0JLmFkZF9ob3N0ID0JYW1kdHBfYWRkX2hvc3QsCi0JLnJlbW92ZV9ob3N0ID0JYW1kdHBfcmVtb3ZlX2hvc3QsCi19OwotCi0vKiBNb2R1bGUgaW50ZXJmYWNlICovCi0KLU1PRFVMRV9BVVRIT1IoIktyaXN0aWFuIEhvZ3NiZXJnIDxob2dzYmVyZ0B1c2Vycy5zZi5uZXQ+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgQXVkaW8gJiBNdXNpYyBEYXRhIFRyYW5zbWlzc2lvbiBQcm90b2NvbCAiCi0JCSAgICJvbiBPSENJIGJvYXJkcy4iKTsKLU1PRFVMRV9TVVBQT1JURURfREVWSUNFKCJhbWR0cCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgaW50IF9faW5pdCBhbWR0cF9pbml0X21vZHVsZSAodm9pZCkKLXsKLQljZGV2X2luaXQoJmFtZHRwX2NkZXYsICZhbWR0cF9mb3BzKTsKLQlhbWR0cF9jZGV2Lm93bmVyID0gVEhJU19NT0RVTEU7Ci0Ja29iamVjdF9zZXRfbmFtZSgmYW1kdHBfY2Rldi5rb2JqLCAiYW1kdHAiKTsKLQlpZiAoY2Rldl9hZGQoJmFtZHRwX2NkZXYsIElFRUUxMzk0X0FNRFRQX0RFViwgMTYpKSB7Ci0JCUhQU0JfRVJSKCJhbWR0cDogdW5hYmxlIHRvIGFkZCBjaGFyIGRldmljZSIpOwotIAkJcmV0dXJuIC1FSU87Ci0gCX0KLQotCWRldmZzX21rX2RpcigiYW1kdHAiKTsKLQotCWhwc2JfcmVnaXN0ZXJfaGlnaGxldmVsKCZhbWR0cF9oaWdobGV2ZWwpOwotCi0JSFBTQl9JTkZPKCJMb2FkZWQgQU1EVFAgZHJpdmVyIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGFtZHRwX2V4aXRfbW9kdWxlICh2b2lkKQotewotICAgICAgICBocHNiX3VucmVnaXN0ZXJfaGlnaGxldmVsKCZhbWR0cF9oaWdobGV2ZWwpOwotCWRldmZzX3JlbW92ZSgiYW1kdHAiKTsKLQljZGV2X2RlbCgmYW1kdHBfY2Rldik7Ci0KLQlIUFNCX0lORk8oIlVubG9hZGVkIEFNRFRQIGRyaXZlciIpOwotfQotCi1tb2R1bGVfaW5pdChhbWR0cF9pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChhbWR0cF9leGl0X21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2FtZHRwLmggYi9kcml2ZXJzL2llZWUxMzk0L2FtZHRwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMWYyOGUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9hbWR0cC5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyogLSotIGMtYmFzaWMtb2Zmc2V0OiA4IC0qLSAqLwotCi0jaWZuZGVmIF9fQU1EVFBfSAotI2RlZmluZSBfX0FNRFRQX0gKLQotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2luY2x1ZGUgImllZWUxMzk0LWlvY3RsLmgiCi0KLS8qIFRoZSB1c2Vyc3BhY2UgaW50ZXJmYWNlIGZvciB0aGUgQXVkaW8gJiBNdXNpYyBEYXRhIFRyYW5zbWlzc2lvbgotICogUHJvdG9jb2wgZHJpdmVyIGlzIHJlYWxseSBzaW1wbGUuIEZpcnN0LCBvcGVuIC9kZXYvYW1kdHAsIHVzZSB0aGUKLSAqIGlvY3RsIHRvIGNvbmZpZ3VyZSBmb3JtYXQsIHJhdGUsIGRpbWVuc2lvbiBhbmQgZWl0aGVyIHBsdWcgb3IKLSAqIGNoYW5uZWwsIHRoZW4gc3RhcnQgd3JpdGluZyBzYW1wbGVzLgotICoKLSAqIFRoZSBmb3JtYXRzIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyIGFyZSBsaXN0ZWQgYmVsb3cuCi0gKiBBTURUUF9GT1JNQVRfUkFXIGNvcnJlc3BvbmRzIHRvIHRoZSBBTTgyNCByYXcgZm9ybWF0LCB3aGljaCBjYW4KLSAqIGNhcnJ5IGFueSBudW1iZXIgb2YgY2hhbm5lbHMsIHNvIHVzZSB0aGlzIGlmIHlvdSdyZSBzdHJlYW1pbmcKLSAqIG11bHRpY2hhbm5lbCBhdWRpby4gIFRoZSBBTURUUF9GT1JNQVRfSUVDOTU4X1BDTSBjb3JyZXNwb25kcyB0byB0aGUKLSAqIEFNODI0IElFQzk1OCBlbmNhcHN1bGF0aW9uIHdpdGhvdXQgdGhlIElFQzk1OCBkYXRhIGJpdCBzZXQsIHVzaW5nCi0gKiBBTURUUF9GT1JNQVRfSUVDOTU4X0FDMyB3aWxsIHRyYW5zbWl0IHRoZSBzYW1wbGVzIHdpdGggdGhlIGRhdGEgYml0Ci0gKiBzZXQsIHN1aXRhYmxlIGZvciB0cmFuc21pdHRpbmcgY29tcHJlc3NlZCBBQy0zIGF1ZGlvLgotICoKLSAqIFRoZSByYXRlIGZpZWxkIHNwZWNpZmllcyB0aGUgdHJhbnNtaXNzaW9uIHJhdGU7IHN1cHBvcnRlZCB2YWx1ZXMKLSAqIGFyZSAzMjAwMCwgNDQxMDAsIDQ4MDAwLCA4ODIwMCwgOTYwMDAsIDE3NjQwMCBhbmQgMTkyMDAwLgotICoKLSAqIFRoZSBkaW1lbnNpb24gZmllbGQgc3BlY2lmaWVzIHRoZSBkaW1lbnNpb24gb2YgdGhlIHNpZ25hbCwgdGhhdCBpcywKLSAqIHRoZSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMuICBPbmx5IEFNRFRQX0ZPUk1BVF9SQVcgc3VwcG9ydHMKLSAqIHNldHRpbmdzIGdyZWF0ZXIgdGhhbiAyLgotICoKLSAqIFRoZSBtb2RlIGZpZWxkIHNwZWNpZmllcyB3aGljaCB0cmFuc21pc3Npb24gbW9kZSB0byB1c2UuIFRoZSBBTURUUAotICogc3BlY2lmaWVzIHR3byBkaWZmZXJlbnQgdHJhbnNtaXNzaW9uIG1vZGVzOiBibG9ja2luZyBhbmQKLSAqIG5vbi1ibG9ja2luZy4gIFRoZSBibG9ja2luZyB0cmFuc21pc3Npb24gbW9kZSBhbHdheXMgc2VuZCBhIGZpeGVkCi0gKiBudW1iZXIgb2Ygc2FtcGxlcywgdHlwaWNhbGx5IDgsIDE2IG9yIDMyLiAgVG8gZXhhY3RseSBtYXRjaCB0aGUKLSAqIHRyYW5zbWlzc2lvbiByYXRlLCB0aGUgZHJpdmVyIGFsdGVybmF0ZXMgYmV0d2VlbiBzZW5kaW5nIGVtcHR5IGFuZAotICogbm9uLWVtcHR5IHBhY2tldHMuICBJbiBub24tYmxvY2tpbmcgbW9kZSwgdGhlIGRyaXZlciB0cmFuc21pdHMgYXMKLSAqIHNtYWxsIHBhY2tldHMgYXMgcG9zc2libGUuICBGb3IgZXhhbXBsZSwgZm9yIGEgdHJhbnNtaXNzaW9uIHJhdGUgb2YKLSAqIDQ0MTAwSHosIHRoZSBkcml2ZXIgc2hvdWxkIHNlbmQgNSA0MS84MCBzYW1wbGVzIGluIGV2ZXJ5IGN5Y2xlLCBidXQKLSAqIHRoaXMgaXMgbm90IHBvc3NpYmxlIHNvIGluc3RlYWQgdGhlIGRyaXZlciBhbHRlcm5hdGVzIGJldHdlZW4KLSAqIHNlbmRpbmcgNSBhbmQgNiBzYW1wbGVzLgotICoKLSAqIFRoZSBsYXN0IHRoaW5nIHRvIHNwZWNpZnkgaXMgZWl0aGVyIHRoZSBpc29jaHJvbm91cyBjaGFubmVsIHRvIHVzZQotICogb3IgdGhlIG91dHB1dCBwbHVnIHRvIGNvbm5lY3QgdG8uICBJZiB5b3Uga25vdyB3aGF0IGNoYW5uZWwgdGhlCi0gKiBkZXN0aW5hdGlvbiBkZXZpY2Ugd2lsbCBsaXN0ZW4gb24sIHlvdSBjYW4gc3BlY2lmeSB0aGUgY2hhbm5lbAotICogZGlyZWN0bHkgYW5kIHVzZSB0aGUgQU1EVFBfSU9DX0NIQU5ORUwgaW9jdGwuICBIb3dldmVyLCBpZiB0aGUKLSAqIGRlc3RpbmF0aW9uIGRldmljZSBjaG9vc2VzIHRoZSBjaGFubmVsIGFuZCB1c2VzIHRoZSBJRUM2MTg4My0xIHBsdWcKLSAqIG1lY2hhbmlzbSwgeW91IGNhbiBzcGVjaWZ5IGFuIG91dHB1dCBwbHVnIHRvIGNvbm5lY3QgdG8uICBUaGUKLSAqIGRyaXZlciB3aWxsIHBpY2sgdXAgdGhlIGNoYW5uZWwgbnVtYmVyIGZyb20gdGhlIHBsdWcgb25jZSB0aGUKLSAqIGRlc3RpbmF0aW9uIGRldmljZSBsb2NrcyB0aGUgb3V0cHV0IHBsdWcgY29udHJvbCByZWdpc3Rlci4gIEluIHRoaXMKLSAqIGNhc2Ugc2V0IHRoZSBwbHVnIGZpZWxkIGFuZCB1c2UgdGhlIEFNRFRQX0lPQ19QTFVHIGlvY3RsLgotICoKLSAqIEhhdmluZyBjb25maWd1cmVkIHRoZSBpbnRlcmZhY2UsIHRoZSBkcml2ZXIgbm93IGFjY2VwdHMgd3JpdGVzIG9mCi0gKiByZWd1bGFyIDE2IGJpdCBzaWduZWQgbGl0dGxlIGVuZGlhbiBzYW1wbGVzLCB3aXRoIHRoZSBjaGFubmVscwotICogaW50ZXJsZWF2ZWQuICBGb3IgZXhhbXBsZSwgNCBjaGFubmVscyB3b3VsZCBsb29rIGxpa2U6Ci0gKgotICogICB8IHNhbXBsZSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNhbXBsZSAxICAgIC4uLgotICogICB8IGNoLiAwICAgICB8IGNoLiAxICAgICB8IGNoLiAyICAgICB8IGNoLiAzICAgICB8IGNoLiAwICAgICB8IC4uLgotICogICB8IGxzYiB8IG1zYiB8IGxzYiB8IG1zYiB8IGxzYiB8IG1zYiB8IGxzYiB8IG1zYiB8IGxzYiB8IG1zYiB8IC4uLgotICoKLSAqLwotCi1lbnVtIHsKLQlBTURUUF9GT1JNQVRfUkFXLAotCUFNRFRQX0ZPUk1BVF9JRUM5NThfUENNLAotCUFNRFRQX0ZPUk1BVF9JRUM5NThfQUMzCi19OwotCi1lbnVtIHsKLQlBTURUUF9NT0RFX0JMT0NLSU5HLAotCUFNRFRQX01PREVfTk9OX0JMT0NLSU5HLAotfTsKLQotZW51bSB7Ci0JQU1EVFBfSU5QVVRfTEUxNiwKLQlBTURUUF9JTlBVVF9CRTE2LAotfTsKLQotc3RydWN0IGFtZHRwX2lvY3RsIHsKLQlfX3UzMiBmb3JtYXQ7Ci0JX191MzIgcmF0ZTsKLQlfX3UzMiBkaW1lbnNpb247Ci0JX191MzIgbW9kZTsKLQl1bmlvbiB7IF9fdTMyIGNoYW5uZWw7IF9fdTMyIHBsdWc7IH0gdTsKLX07Ci0KLSNlbmRpZiAvKiBfX0FNRFRQX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvY21wLmMgYi9kcml2ZXJzL2llZWUxMzk0L2NtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWFlZDI2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvY21wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyogLSotIGMtYmFzaWMtb2Zmc2V0OiA4IC0qLQotICoKLSAqIGNtcC5jIC0gQ29ubmVjdGlvbiBNYW5hZ2VtZW50IFByb2NlZHVyZXMKLSAqIENvcHlyaWdodCAoQykgMjAwMSBLcmlzdGlhbiBI+GdzYmVyZwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotLyogVE9ETwotICogLS0tLQotICoKLSAqIC0gSW1wbGVtZW50IElFQzYxODgzLTEgb3V0cHV0IHBsdWdzIGFuZCBjb25uZWN0aW9uIG1hbmFnZW1lbnQuCi0gKiAgIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIHBhcnQgb2YgdGhlIGdlbmVyYWwgc3Vic3lzdGVtLCBhcyBpdCBjb3VsZAotICogICBiZSBzaGFyZWQgd2l0aCBkdjEzOTQuCi0gKgotICogLSBBZGQgSUVDNjE4ODMgdW5pdCBkaXJlY3Rvcnkgd2hlbiBsb2FkaW5nIHRoaXMgbW9kdWxlLiAgVGhpcwotICogICByZXF1aXJlcyBhIHJ1bi10aW1lIGNoYW5nZWFibGUgY29uZmlnIHJvbS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLSNpbmNsdWRlICJob3N0cy5oIgotI2luY2x1ZGUgImhpZ2hsZXZlbC5oIgotI2luY2x1ZGUgImllZWUxMzk0LmgiCi0jaW5jbHVkZSAiaWVlZTEzOTRfY29yZS5oIgotI2luY2x1ZGUgImNtcC5oIgotCi1zdHJ1Y3QgcGx1ZyB7Ci0JdW5pb24gewotCQlzdHJ1Y3QgY21wX3BjciBwY3I7Ci0JCXF1YWRsZXRfdCBxdWFkbGV0OwotCX0gdTsKLQl2b2lkICgqdXBkYXRlKShzdHJ1Y3QgY21wX3BjciAqcGx1Zywgdm9pZCAqZGF0YSk7Ci0Jdm9pZCAqZGF0YTsKLX07Ci0KLXN0cnVjdCBjbXBfaG9zdCB7Ci0Jc3RydWN0IGhwc2JfaG9zdCAqaG9zdDsKLQotCXVuaW9uIHsKLQkJc3RydWN0IGNtcF9tcHIgb21wcjsKLQkJcXVhZGxldF90IG9tcHJfcXVhZGxldDsKLQl9IHU7Ci0Jc3RydWN0IHBsdWcgb3BjclsyXTsKLQotCXVuaW9uIHsKLQkJc3RydWN0IGNtcF9tcHIgaW1wcjsKLQkJcXVhZGxldF90IGltcHJfcXVhZGxldDsKLQl9IHY7Ci0Jc3RydWN0IHBsdWcgaXBjclsyXTsKLX07Ci0KLWVudW0gewotCUNNUF9QMlBfQ09OTkVDVElPTiwKLQlDTVBfQkNfQ09OTkVDVElPTgotfTsKLQotI2RlZmluZSBDU1JfUENSX01BUCAgICAgIDB4OTAwCi0jZGVmaW5lIENTUl9QQ1JfTUFQX0VORCAgMHg5ZmMKLQotc3RhdGljIHN0cnVjdCBocHNiX2hpZ2hsZXZlbCBjbXBfaGlnaGxldmVsOwotCi1zdGF0aWMgdm9pZCBjbXBfYWRkX2hvc3Qoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCk7Ci1zdGF0aWMgdm9pZCBjbXBfaG9zdF9yZXNldChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKLXN0YXRpYyBpbnQgcGNyX3JlYWQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgcXVhZGxldF90ICpidWYsCi0JCSAgICB1NjQgYWRkciwgc2l6ZV90IGxlbmd0aCwgdTE2IGZsYWdzKTsKLXN0YXRpYyBpbnQgcGNyX2xvY2soc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgcXVhZGxldF90ICpzdG9yZSwKLQkJICAgIHU2NCBhZGRyLCBxdWFkbGV0X3QgZGF0YSwgcXVhZGxldF90IGFyZywgaW50IGV4dGNvZGUsIHUxNiBmbGFncyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgY21wX2hpZ2hsZXZlbCA9IHsKLQkubmFtZSA9CQkiY21wIiwKLQkuYWRkX2hvc3QgPQljbXBfYWRkX2hvc3QsCi0JLmhvc3RfcmVzZXQgPQljbXBfaG9zdF9yZXNldCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBwY3Jfb3BzID0gewotCS5yZWFkID0JcGNyX3JlYWQsCi0JLmxvY2sgPQlwY3JfbG9jaywKLX07Ci0KLQotc3RydWN0IGNtcF9wY3IgKgotY21wX3JlZ2lzdGVyX29wY3Ioc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG9wY3JfbnVtYmVyLCBpbnQgcGF5bG9hZCwKLQkJICB2b2lkICgqdXBkYXRlKShzdHJ1Y3QgY21wX3BjciAqcGNyLCB2b2lkICpkYXRhKSwKLQkJICB2b2lkICpkYXRhKQotewotCXN0cnVjdCBjbXBfaG9zdCAqY2g7Ci0Jc3RydWN0IHBsdWcgKnBsdWc7Ci0KLQljaCA9IGhwc2JfZ2V0X2hvc3RpbmZvKCZjbXBfaGlnaGxldmVsLCBob3N0KTsKLQotCWlmIChvcGNyX251bWJlciA+PSBjaC0+dS5vbXByLm5wbHVncyB8fAotCSAgICBjaC0+b3BjcltvcGNyX251bWJlcl0udXBkYXRlICE9IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JcGx1ZyA9ICZjaC0+b3BjcltvcGNyX251bWJlcl07Ci0JcGx1Zy0+dS5wY3Iub25saW5lID0gMTsKLQlwbHVnLT51LnBjci5iY2FzdF9jb3VudCA9IDA7Ci0JcGx1Zy0+dS5wY3IucDJwX2NvdW50ID0gMDsKLQlwbHVnLT51LnBjci5vdmVyaGVhZCA9IDA7Ci0JcGx1Zy0+dS5wY3IucGF5bG9hZCA9IHBheWxvYWQ7Ci0JcGx1Zy0+dXBkYXRlID0gdXBkYXRlOwotCXBsdWctPmRhdGEgPSBkYXRhOwotCi0JcmV0dXJuICZwbHVnLT51LnBjcjsKLX0KLQotdm9pZCBjbXBfdW5yZWdpc3Rlcl9vcGNyKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIHN0cnVjdCBjbXBfcGNyICpvcGNyKQotewotCXN0cnVjdCBjbXBfaG9zdCAqY2g7Ci0Jc3RydWN0IHBsdWcgKnBsdWc7Ci0KLQljaCA9IGhwc2JfZ2V0X2hvc3RpbmZvKCZjbXBfaGlnaGxldmVsLCBob3N0KTsKLQlwbHVnID0gKHN0cnVjdCBwbHVnICopb3BjcjsKLQlpZiAocGx1ZyAtIGNoLT5vcGNyID49IGNoLT51Lm9tcHIubnBsdWdzKSBCVUcoKTsKLQotCXBsdWctPnUucGNyLm9ubGluZSA9IDA7Ci0JcGx1Zy0+dXBkYXRlID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgcmVzZXRfcGx1Z3Moc3RydWN0IGNtcF9ob3N0ICpjaCkKLXsKLQlpbnQgaTsKLQotCWNoLT51Lm9tcHIubm9uX3BlcnNpc3RlbnRfZXh0ID0gMHhmZjsKLQlmb3IgKGkgPSAwOyBpIDwgY2gtPnUub21wci5ucGx1Z3M7IGkrKykgewotCQljaC0+b3BjcltpXS51LnBjci5iY2FzdF9jb3VudCA9IDA7Ci0JCWNoLT5vcGNyW2ldLnUucGNyLnAycF9jb3VudCA9IDA7Ci0JCWNoLT5vcGNyW2ldLnUucGNyLm92ZXJoZWFkID0gMDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGNtcF9hZGRfaG9zdChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQotewotCXN0cnVjdCBjbXBfaG9zdCAqY2ggPSBocHNiX2NyZWF0ZV9ob3N0aW5mbygmY21wX2hpZ2hsZXZlbCwgaG9zdCwgc2l6ZW9mICgqY2gpKTsKLQotCWlmIChjaCA9PSBOVUxMKSB7Ci0JCUhQU0JfRVJSKCJGYWlsZWQgdG8gYWxsb2NhdGUgY21wX2hvc3QiKTsKLQkJcmV0dXJuOwotCX0KLQotCWhwc2JfcmVnaXN0ZXJfYWRkcnNwYWNlKCZjbXBfaGlnaGxldmVsLCBob3N0LCAmcGNyX29wcywKLQkJCQlDU1JfUkVHSVNURVJfQkFTRSArIENTUl9QQ1JfTUFQLAotCQkJCUNTUl9SRUdJU1RFUl9CQVNFICsgQ1NSX1BDUl9NQVBfRU5EKTsKLQotCWNoLT5ob3N0ID0gaG9zdDsKLQljaC0+dS5vbXByLnJhdGUgPSBJRUVFMTM5NF9TUEVFRF8xMDA7Ci0JY2gtPnUub21wci5iY2FzdF9jaGFubmVsX2Jhc2UgPSA2MzsKLQljaC0+dS5vbXByLm5wbHVncyA9IDI7Ci0KLQlyZXNldF9wbHVncyhjaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNtcF9ob3N0X3Jlc2V0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCi17Ci0Jc3RydWN0IGNtcF9ob3N0ICpjaDsKLQotCWNoID0gaHBzYl9nZXRfaG9zdGluZm8oJmNtcF9oaWdobGV2ZWwsIGhvc3QpOwotCWlmIChjaCA9PSBOVUxMKSB7Ci0JCUhQU0JfRVJSKCJjbXA6IFRyaWVkIHRvIHJlc2V0IHVua25vd24gaG9zdCIpOwotCQlyZXR1cm47Ci0JfQotCi0JcmVzZXRfcGx1Z3MoY2gpOwotfQotCi1zdGF0aWMgaW50IHBjcl9yZWFkKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIHF1YWRsZXRfdCAqYnVmLAotCQkgICAgdTY0IGFkZHIsIHNpemVfdCBsZW5ndGgsIHUxNiBmbGFncykKLXsKLQlpbnQgY3NyYWRkciA9IGFkZHIgLSBDU1JfUkVHSVNURVJfQkFTRTsKLQlpbnQgcGx1ZzsKLQlzdHJ1Y3QgY21wX2hvc3QgKmNoOwotCi0JaWYgKGxlbmd0aCAhPSA0KQotCQlyZXR1cm4gUkNPREVfVFlQRV9FUlJPUjsKLQotCWNoID0gaHBzYl9nZXRfaG9zdGluZm8oJmNtcF9oaWdobGV2ZWwsIGhvc3QpOwotCWlmIChjc3JhZGRyID09IDB4OTAwKSB7Ci0JCSpidWYgPSBjcHVfdG9fYmUzMihjaC0+dS5vbXByX3F1YWRsZXQpOwotCQlyZXR1cm4gUkNPREVfQ09NUExFVEU7Ci0JfQotCWVsc2UgaWYgKGNzcmFkZHIgPCAweDkwNCArIGNoLT51Lm9tcHIubnBsdWdzICogNCkgewotCQlwbHVnID0gKGNzcmFkZHIgLSAweDkwNCkgLyA0OwotCQkqYnVmID0gY3B1X3RvX2JlMzIoY2gtPm9wY3JbcGx1Z10udS5xdWFkbGV0KTsKLQkJcmV0dXJuIFJDT0RFX0NPTVBMRVRFOwotCX0KLQllbHNlIGlmIChjc3JhZGRyIDwgMHg5ODApIHsKLQkJcmV0dXJuIFJDT0RFX0FERFJFU1NfRVJST1I7Ci0JfQotCWVsc2UgaWYgKGNzcmFkZHIgPT0gMHg5ODApIHsKLQkJKmJ1ZiA9IGNwdV90b19iZTMyKGNoLT52LmltcHJfcXVhZGxldCk7Ci0JCXJldHVybiBSQ09ERV9DT01QTEVURTsKLQl9Ci0JZWxzZSBpZiAoY3NyYWRkciA8IDB4OTg0ICsgY2gtPnYuaW1wci5ucGx1Z3MgKiA0KSB7Ci0JCXBsdWcgPSAoY3NyYWRkciAtIDB4OTg0KSAvIDQ7Ci0JCSpidWYgPSBjcHVfdG9fYmUzMihjaC0+aXBjcltwbHVnXS51LnF1YWRsZXQpOwotCQlyZXR1cm4gUkNPREVfQ09NUExFVEU7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIFJDT0RFX0FERFJFU1NfRVJST1I7Ci19Ci0KLXN0YXRpYyBpbnQgcGNyX2xvY2soc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgcXVhZGxldF90ICpzdG9yZSwKLQkJICAgIHU2NCBhZGRyLCBxdWFkbGV0X3QgZGF0YSwgcXVhZGxldF90IGFyZywgaW50IGV4dGNvZGUsIHUxNiBmbGFncykKLXsKLQlpbnQgY3NyYWRkciA9IGFkZHIgLSBDU1JfUkVHSVNURVJfQkFTRTsKLQlpbnQgcGx1ZzsKLQlzdHJ1Y3QgY21wX2hvc3QgKmNoOwotCi0JY2ggPSBocHNiX2dldF9ob3N0aW5mbygmY21wX2hpZ2hsZXZlbCwgaG9zdCk7Ci0KLQlpZiAoZXh0Y29kZSAhPSBFWFRDT0RFX0NPTVBBUkVfU1dBUCkKLQkJcmV0dXJuIFJDT0RFX1RZUEVfRVJST1I7Ci0KLQlpZiAoY3NyYWRkciA9PSAweDkwMCkgewotCQkvKiBGSVhNRTogSWdub3JlIHdyaXRlcyB0byBiaXRzIDMwLTMxIGFuZCAwLTcgKi8KLQkJKnN0b3JlID0gY3B1X3RvX2JlMzIoY2gtPnUub21wcl9xdWFkbGV0KTsKLQkJaWYgKGFyZyA9PSBjcHVfdG9fYmUzMihjaC0+dS5vbXByX3F1YWRsZXQpKQotCQkJY2gtPnUub21wcl9xdWFkbGV0ID0gYmUzMl90b19jcHUoZGF0YSk7Ci0KLQkJcmV0dXJuIFJDT0RFX0NPTVBMRVRFOwotCX0KLQlpZiAoY3NyYWRkciA8IDB4OTA0ICsgY2gtPnUub21wci5ucGx1Z3MgKiA0KSB7Ci0JCXBsdWcgPSAoY3NyYWRkciAtIDB4OTA0KSAvIDQ7Ci0JCSpzdG9yZSA9IGNwdV90b19iZTMyKGNoLT5vcGNyW3BsdWddLnUucXVhZGxldCk7Ci0KLQkJaWYgKGFyZyA9PSAqc3RvcmUpCi0JCQljaC0+b3BjcltwbHVnXS51LnF1YWRsZXQgPSBiZTMyX3RvX2NwdShkYXRhKTsKLQotCQlpZiAoYmUzMl90b19jcHUoKnN0b3JlKSAhPSBjaC0+b3BjcltwbHVnXS51LnF1YWRsZXQgJiYKLQkJICAgIGNoLT5vcGNyW3BsdWddLnVwZGF0ZSAhPSBOVUxMKQotCQkJY2gtPm9wY3JbcGx1Z10udXBkYXRlKCZjaC0+b3BjcltwbHVnXS51LnBjciwKLQkJCQkJICAgICAgY2gtPm9wY3JbcGx1Z10uZGF0YSk7Ci0KLQkJcmV0dXJuIFJDT0RFX0NPTVBMRVRFOwotCX0KLQllbHNlIGlmIChjc3JhZGRyIDwgMHg5ODApIHsKLQkJcmV0dXJuIFJDT0RFX0FERFJFU1NfRVJST1I7Ci0JfQotCWVsc2UgaWYgKGNzcmFkZHIgPT0gMHg5ODApIHsKLQkJLyogRklYTUU6IElnbm9yZSB3cml0ZXMgdG8gYml0cyAyNC0zMSBhbmQgMC03ICovCi0JCSpzdG9yZSA9IGNwdV90b19iZTMyKGNoLT51Lm9tcHJfcXVhZGxldCk7Ci0JCWlmIChhcmcgPT0gY3B1X3RvX2JlMzIoY2gtPnUub21wcl9xdWFkbGV0KSkKLQkJCWNoLT51Lm9tcHJfcXVhZGxldCA9IGJlMzJfdG9fY3B1KGRhdGEpOwotCi0JCXJldHVybiBSQ09ERV9DT01QTEVURTsKLQl9Ci0JZWxzZSBpZiAoY3NyYWRkciA8IDB4OTg0ICsgY2gtPnYuaW1wci5ucGx1Z3MgKiA0KSB7Ci0JCXBsdWcgPSAoY3NyYWRkciAtIDB4OTg0KSAvIDQ7Ci0JCSpzdG9yZSA9IGNwdV90b19iZTMyKGNoLT5pcGNyW3BsdWddLnUucXVhZGxldCk7Ci0KLQkJaWYgKGFyZyA9PSAqc3RvcmUpCi0JCQljaC0+aXBjcltwbHVnXS51LnF1YWRsZXQgPSBiZTMyX3RvX2NwdShkYXRhKTsKLQotCQlpZiAoYmUzMl90b19jcHUoKnN0b3JlKSAhPSBjaC0+aXBjcltwbHVnXS51LnF1YWRsZXQgJiYKLQkJICAgIGNoLT5pcGNyW3BsdWddLnVwZGF0ZSAhPSBOVUxMKQotCQkJY2gtPmlwY3JbcGx1Z10udXBkYXRlKCZjaC0+aXBjcltwbHVnXS51LnBjciwKLQkJCQkJICAgICAgY2gtPmlwY3JbcGx1Z10uZGF0YSk7Ci0KLQkJcmV0dXJuIFJDT0RFX0NPTVBMRVRFOwotCX0KLQllbHNlCi0JCXJldHVybiBSQ09ERV9BRERSRVNTX0VSUk9SOwotfQotCi0KLS8qIE1vZHVsZSBpbnRlcmZhY2UgKi8KLQotTU9EVUxFX0FVVEhPUigiS3Jpc3RpYW4gSG9nc2JlcmcgPGhvZ3NiZXJnQHVzZXJzLnNmLm5ldD4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQ29ubmVjdGlvbiBNYW5hZ2VtZW50IFByb2NlZHVyZXMgKENNUCkiKTsKLU1PRFVMRV9TVVBQT1JURURfREVWSUNFKCJjbXAiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotRVhQT1JUX1NZTUJPTChjbXBfcmVnaXN0ZXJfb3Bjcik7Ci1FWFBPUlRfU1lNQk9MKGNtcF91bnJlZ2lzdGVyX29wY3IpOwotCi1zdGF0aWMgaW50IF9faW5pdCBjbXBfaW5pdF9tb2R1bGUgKHZvaWQpCi17Ci0JaHBzYl9yZWdpc3Rlcl9oaWdobGV2ZWwgKCZjbXBfaGlnaGxldmVsKTsKLQotCUhQU0JfSU5GTygiTG9hZGVkIENNUCBkcml2ZXIiKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgY21wX2V4aXRfbW9kdWxlICh2b2lkKQotewotICAgICAgICBocHNiX3VucmVnaXN0ZXJfaGlnaGxldmVsKCZjbXBfaGlnaGxldmVsKTsKLQotCUhQU0JfSU5GTygiVW5sb2FkZWQgQ01QIGRyaXZlciIpOwotfQotCi1tb2R1bGVfaW5pdChjbXBfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQoY21wX2V4aXRfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvY21wLmggYi9kcml2ZXJzL2llZWUxMzk0L2NtcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTI4OGJmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvY21wLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jaWZuZGVmIF9fQ01QX0gKLSNkZWZpbmUgX19DTVBfSAotCi1zdHJ1Y3QgY21wX21wciB7Ci0JdTMyIG5wbHVnczo1OwotCXUzMiByZXNlcnZlZDozOwotCXUzMiBwZXJzaXN0ZW50X2V4dDo4OwotCXUzMiBub25fcGVyc2lzdGVudF9leHQ6ODsKLQl1MzIgYmNhc3RfY2hhbm5lbF9iYXNlOjY7Ci0JdTMyIHJhdGU6MjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBjbXBfcGNyIHsKLQl1MzIgcGF5bG9hZDoxMDsKLQl1MzIgb3ZlcmhlYWQ6NDsKLQl1MzIgc3BlZWQ6MjsKLQl1MzIgY2hhbm5lbDo2OwotCXUzMiByZXNlcnZlZDoyOwotCXUzMiBwMnBfY291bnQ6NjsKLQl1MzIgYmNhc3RfY291bnQ6MTsKLQl1MzIgb25saW5lOjE7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgY21wX3BjciAqY21wX3JlZ2lzdGVyX29wY3Ioc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IHBsdWcsCi0JCQkJICBpbnQgcGF5bG9hZCwKLQkJCQkgIHZvaWQgKCp1cGRhdGUpKHN0cnVjdCBjbXBfcGNyICpwbHVnLAotCQkJCQkJIHZvaWQgKmRhdGEpLAotCQkJCSAgdm9pZCAqZGF0YSk7Ci12b2lkIGNtcF91bnJlZ2lzdGVyX29wY3Ioc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgc3RydWN0IGNtcF9wY3IgKnBsdWcpOwotCi0jZW5kaWYgLyogX19DTVBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9kdjEzOTQuYyBiL2RyaXZlcnMvaWVlZTEzOTQvZHYxMzk0LmMKaW5kZXggMTk2ZGI3NC4uZWZlYWE5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9kdjEzOTQuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2R2MTM5NC5jCkBAIC0xMDgsNyArMTA4LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L3ZpZGVvMTM5NC5jIGIvZHJpdmVycy9pZWVlMTM5NC92aWRlbzEzOTQuYwppbmRleCA2MDg0NzliLi4zOWZiODgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L3ZpZGVvMTM5NC5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvdmlkZW8xMzk0LmMKQEAgLTQ4LDcgKzQ4LDYgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvY3RsMzIuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbS5jCmluZGV4IDAyMTEwZTAuLjI1MTRkZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY20uYwpAQCAtMzA4LDEwICszMDgsMTEgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CisJc3RhdGljIGludCBuZXh0X2lkOwogCiAJZG8gewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY20ubG9jaywgZmxhZ3MpOwotCQlyZXQgPSBpZHJfZ2V0X25ld19hYm92ZSgmY20ubG9jYWxfaWRfdGFibGUsIGNtX2lkX3ByaXYsIDEsCisJCXJldCA9IGlkcl9nZXRfbmV3X2Fib3ZlKCZjbS5sb2NhbF9pZF90YWJsZSwgY21faWRfcHJpdiwgbmV4dF9pZCsrLAogCQkJCQkoX19mb3JjZSBpbnQgKikgJmNtX2lkX3ByaXYtPmlkLmxvY2FsX2lkKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY20ubG9jaywgZmxhZ3MpOwogCX0gd2hpbGUoIChyZXQgPT0gLUVBR0FJTikgJiYgaWRyX3ByZV9nZXQoJmNtLmxvY2FsX2lkX3RhYmxlLCBHRlBfS0VSTkVMKSApOwpAQCAtNjg0LDYgKzY4NSwxMyBAQAogCQljbV9yZWplY3Rfc2lkcl9yZXEoY21faWRfcHJpdiwgSUJfU0lEUl9SRUpFQ1QpOwogCQlicmVhazsKIAljYXNlIElCX0NNX1JFUV9TRU5UOgorCQlpYl9jYW5jZWxfbWFkKGNtX2lkX3ByaXYtPmF2LnBvcnQtPm1hZF9hZ2VudCwgY21faWRfcHJpdi0+bXNnKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21faWRfcHJpdi0+bG9jaywgZmxhZ3MpOworCQlpYl9zZW5kX2NtX3JlaihjbV9pZCwgSUJfQ01fUkVKX1RJTUVPVVQsCisJCQkgICAgICAgJmNtX2lkX3ByaXYtPmF2LnBvcnQtPmNtX2Rldi0+Y2FfZ3VpZCwKKwkJCSAgICAgICBzaXplb2YgY21faWRfcHJpdi0+YXYucG9ydC0+Y21fZGV2LT5jYV9ndWlkLAorCQkJICAgICAgIE5VTEwsIDApOworCQlicmVhazsKIAljYXNlIElCX0NNX01SQV9SRVFfUkNWRDoKIAljYXNlIElCX0NNX1JFUF9TRU5UOgogCWNhc2UgSUJfQ01fTVJBX1JFUF9SQ1ZEOgpAQCAtNjk0LDEwICs3MDIsOCBAQAogCWNhc2UgSUJfQ01fUkVQX1JDVkQ6CiAJY2FzZSBJQl9DTV9NUkFfUkVQX1NFTlQ6CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtX2lkX3ByaXYtPmxvY2ssIGZsYWdzKTsKLQkJaWJfc2VuZF9jbV9yZWooY21faWQsIElCX0NNX1JFSl9USU1FT1VULAotCQkJICAgICAgICZjbV9pZF9wcml2LT5hdi5wb3J0LT5jbV9kZXYtPmNhX2d1aWQsCi0JCQkgICAgICAgc2l6ZW9mIGNtX2lkX3ByaXYtPmF2LnBvcnQtPmNtX2Rldi0+Y2FfZ3VpZCwKLQkJCSAgICAgICBOVUxMLCAwKTsKKwkJaWJfc2VuZF9jbV9yZWooY21faWQsIElCX0NNX1JFSl9DT05TVU1FUl9ERUZJTkVELAorCQkJICAgICAgIE5VTEwsIDAsIE5VTEwsIDApOwogCQlicmVhazsKIAljYXNlIElCX0NNX0VTVEFCTElTSEVEOgogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbV9pZF9wcml2LT5sb2NrLCBmbGFncyk7CkBAIC04NTAsNyArODU2LDcgQEAKIAkJICAgICAgIHBhcmFtLT5wcml2YXRlX2RhdGFfbGVuKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgY21fdmFsaWRhdGVfcmVxX3BhcmFtKHN0cnVjdCBpYl9jbV9yZXFfcGFyYW0gKnBhcmFtKQorc3RhdGljIGludCBjbV92YWxpZGF0ZV9yZXFfcGFyYW0oc3RydWN0IGliX2NtX3JlcV9wYXJhbSAqcGFyYW0pCiB7CiAJLyogcGVlci10by1wZWVyIG5vdCBzdXBwb3J0ZWQgKi8KIAlpZiAocGFyYW0tPnBlZXJfdG9fcGVlcikKQEAgLTk5OSw3ICsxMDA1LDcgQEAKIAkJIChiZTMyX3RvX2NwdShsb2NhbF9xcG4pID4gYmUzMl90b19jcHUocmVtb3RlX3FwbikpKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjbV9mb3JtYXRfcGF0aHNfZnJvbV9yZXEoc3RydWN0IGNtX3JlcV9tc2cgKnJlcV9tc2csCitzdGF0aWMgdm9pZCBjbV9mb3JtYXRfcGF0aHNfZnJvbV9yZXEoc3RydWN0IGNtX3JlcV9tc2cgKnJlcV9tc2csCiAJCQkJCSAgICBzdHJ1Y3QgaWJfc2FfcGF0aF9yZWMgKnByaW1hcnlfcGF0aCwKIAkJCQkJICAgIHN0cnVjdCBpYl9zYV9wYXRoX3JlYyAqYWx0X3BhdGgpCiB7CkBAIC0zMTU3LDIyICszMTYzLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woaWJfY21faW5pdF9xcF9hdHRyKTsKIAotc3RhdGljIF9fYmU2NCBjbV9nZXRfY2FfZ3VpZChzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UpCi17Ci0Jc3RydWN0IGliX2RldmljZV9hdHRyICpkZXZpY2VfYXR0cjsKLQlfX2JlNjQgZ3VpZDsKLQlpbnQgcmV0OwotCi0JZGV2aWNlX2F0dHIgPSBrbWFsbG9jKHNpemVvZiAqZGV2aWNlX2F0dHIsIEdGUF9LRVJORUwpOwotCWlmICghZGV2aWNlX2F0dHIpCi0JCXJldHVybiAwOwotCi0JcmV0ID0gaWJfcXVlcnlfZGV2aWNlKGRldmljZSwgZGV2aWNlX2F0dHIpOwotCWd1aWQgPSByZXQgPyAwIDogZGV2aWNlX2F0dHItPm5vZGVfZ3VpZDsKLQlrZnJlZShkZXZpY2VfYXR0cik7Ci0JcmV0dXJuIGd1aWQ7Ci19Ci0KIHN0YXRpYyB2b2lkIGNtX2FkZF9vbmUoc3RydWN0IGliX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBjbV9kZXZpY2UgKmNtX2RldjsKQEAgLTMxOTQsOSArMzE4NCw3IEBACiAJCXJldHVybjsKIAogCWNtX2Rldi0+ZGV2aWNlID0gZGV2aWNlOwotCWNtX2Rldi0+Y2FfZ3VpZCA9IGNtX2dldF9jYV9ndWlkKGRldmljZSk7Ci0JaWYgKCFjbV9kZXYtPmNhX2d1aWQpCi0JCWdvdG8gZXJyb3IxOworCWNtX2Rldi0+Y2FfZ3VpZCA9IGRldmljZS0+bm9kZV9ndWlkOwogCiAJc2V0X2JpdChJQl9NR01UX01FVEhPRF9TRU5ELCByZWdfcmVxLm1ldGhvZF9tYXNrKTsKIAlmb3IgKGkgPSAxOyBpIDw9IGRldmljZS0+cGh5c19wb3J0X2NudDsgaSsrKSB7CkBAIC0zMjExLDExICszMTk5LDExIEBACiAJCQkJCQkJY21fcmVjdl9oYW5kbGVyLAogCQkJCQkJCXBvcnQpOwogCQlpZiAoSVNfRVJSKHBvcnQtPm1hZF9hZ2VudCkpCi0JCQlnb3RvIGVycm9yMjsKKwkJCWdvdG8gZXJyb3IxOwogCiAJCXJldCA9IGliX21vZGlmeV9wb3J0KGRldmljZSwgaSwgMCwgJnBvcnRfbW9kaWZ5KTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3IzOworCQkJZ290byBlcnJvcjI7CiAJfQogCWliX3NldF9jbGllbnRfZGF0YShkZXZpY2UsICZjbV9jbGllbnQsIGNtX2Rldik7CiAKQEAgLTMyMjQsOSArMzIxMiw5IEBACiAJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmNtLmRldmljZV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuOwogCi1lcnJvcjM6Ci0JaWJfdW5yZWdpc3Rlcl9tYWRfYWdlbnQocG9ydC0+bWFkX2FnZW50KTsKIGVycm9yMjoKKwlpYl91bnJlZ2lzdGVyX21hZF9hZ2VudChwb3J0LT5tYWRfYWdlbnQpOworZXJyb3IxOgogCXBvcnRfbW9kaWZ5LnNldF9wb3J0X2NhcF9tYXNrID0gMDsKIAlwb3J0X21vZGlmeS5jbHJfcG9ydF9jYXBfbWFzayA9IElCX1BPUlRfQ01fU1VQOwogCXdoaWxlICgtLWkpIHsKQEAgLTMyMzQsNyArMzIyMiw2IEBACiAJCWliX21vZGlmeV9wb3J0KGRldmljZSwgcG9ydC0+cG9ydF9udW0sIDAsICZwb3J0X21vZGlmeSk7CiAJCWliX3VucmVnaXN0ZXJfbWFkX2FnZW50KHBvcnQtPm1hZF9hZ2VudCk7CiAJfQotZXJyb3IxOgogCWtmcmVlKGNtX2Rldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2RldmljZS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvZGV2aWNlLmMKaW5kZXggZTE2OWU3OS4uYjJmM2NiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvZGV2aWNlLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvZGV2aWNlLmMKQEAgLTM4LDggKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgImNvcmVfcHJpdi5oIgogCkBAIC01NywxMyArNTYsMTMgQEAKIHN0YXRpYyBMSVNUX0hFQUQoY2xpZW50X2xpc3QpOwogCiAvKgotICogZGV2aWNlX3NlbSBwcm90ZWN0cyBhY2Nlc3MgdG8gYm90aCBkZXZpY2VfbGlzdCBhbmQgY2xpZW50X2xpc3QuCisgKiBkZXZpY2VfbXV0ZXggcHJvdGVjdHMgYWNjZXNzIHRvIGJvdGggZGV2aWNlX2xpc3QgYW5kIGNsaWVudF9saXN0LgogICogVGhlcmUncyBubyByZWFsIHBvaW50IHRvIHVzaW5nIG11bHRpcGxlIGxvY2tzIG9yIHNvbWV0aGluZyBmYW5jaWVyCiAgKiBsaWtlIGFuIHJ3c2VtOiB3ZSBhbHdheXMgYWNjZXNzIGJvdGggbGlzdHMsIGFuZCB3ZSdyZSBhbHdheXMKICAqIG1vZGlmeWluZyBvbmUgbGlzdCBvciB0aGUgb3RoZXIgbGlzdC4gIEluIGFueSBjYXNlIHRoaXMgaXMgbm90IGEKICAqIGhvdCBwYXRoIHNvIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gdHJ5aW5nIHRvIG9wdGltaXplLgogICovCi1zdGF0aWMgREVDTEFSRV9NVVRFWChkZXZpY2Vfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgoZGV2aWNlX211dGV4KTsKIAogc3RhdGljIGludCBpYl9kZXZpY2VfY2hlY2tfbWFuZGF0b3J5KHN0cnVjdCBpYl9kZXZpY2UgKmRldmljZSkKIHsKQEAgLTIyMSw3ICsyMjAsNyBAQAogewogCWludCByZXQ7CiAKLQlkb3duKCZkZXZpY2Vfc2VtKTsKKwltdXRleF9sb2NrKCZkZXZpY2VfbXV0ZXgpOwogCiAJaWYgKHN0cmNocihkZXZpY2UtPm5hbWUsICclJykpIHsKIAkJcmV0ID0gYWxsb2NfbmFtZShkZXZpY2UtPm5hbWUpOwpAQCAtMjU5LDcgKzI1OCw3IEBACiAJfQogCiAgb3V0OgotCXVwKCZkZXZpY2Vfc2VtKTsKKwltdXRleF91bmxvY2soJmRldmljZV9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woaWJfcmVnaXN0ZXJfZGV2aWNlKTsKQEAgLTI3Niw3ICsyNzUsNyBAQAogCXN0cnVjdCBpYl9jbGllbnRfZGF0YSAqY29udGV4dCwgKnRtcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZG93bigmZGV2aWNlX3NlbSk7CisJbXV0ZXhfbG9jaygmZGV2aWNlX211dGV4KTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShjbGllbnQsICZjbGllbnRfbGlzdCwgbGlzdCkKIAkJaWYgKGNsaWVudC0+cmVtb3ZlKQpAQCAtMjg0LDcgKzI4Myw3IEBACiAKIAlsaXN0X2RlbCgmZGV2aWNlLT5jb3JlX2xpc3QpOwogCi0JdXAoJmRldmljZV9zZW0pOworCW11dGV4X3VubG9jaygmZGV2aWNlX211dGV4KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2UtPmNsaWVudF9kYXRhX2xvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY29udGV4dCwgdG1wLCAmZGV2aWNlLT5jbGllbnRfZGF0YV9saXN0LCBsaXN0KQpAQCAtMzEyLDE0ICszMTEsMTQgQEAKIHsKIAlzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2U7CiAKLQlkb3duKCZkZXZpY2Vfc2VtKTsKKwltdXRleF9sb2NrKCZkZXZpY2VfbXV0ZXgpOwogCiAJbGlzdF9hZGRfdGFpbCgmY2xpZW50LT5saXN0LCAmY2xpZW50X2xpc3QpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2aWNlLCAmZGV2aWNlX2xpc3QsIGNvcmVfbGlzdCkKIAkJaWYgKGNsaWVudC0+YWRkICYmICFhZGRfY2xpZW50X2NvbnRleHQoZGV2aWNlLCBjbGllbnQpKQogCQkJY2xpZW50LT5hZGQoZGV2aWNlKTsKIAotCXVwKCZkZXZpY2Vfc2VtKTsKKwltdXRleF91bmxvY2soJmRldmljZV9tdXRleCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMzOSw3ICszMzgsNyBAQAogCXN0cnVjdCBpYl9kZXZpY2UgKmRldmljZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZG93bigmZGV2aWNlX3NlbSk7CisJbXV0ZXhfbG9jaygmZGV2aWNlX211dGV4KTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2aWNlLCAmZGV2aWNlX2xpc3QsIGNvcmVfbGlzdCkgewogCQlpZiAoY2xpZW50LT5yZW1vdmUpCkBAIC0zNTUsNyArMzU0LDcgQEAKIAl9CiAJbGlzdF9kZWwoJmNsaWVudC0+bGlzdCk7CiAKLQl1cCgmZGV2aWNlX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZkZXZpY2VfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTChpYl91bnJlZ2lzdGVyX2NsaWVudCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3N5c2ZzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zeXNmcy5jCmluZGV4IDFmMTc0M2MuLjU5ODJkNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3N5c2ZzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc3lzZnMuYwpAQCAtNDQ1LDEzICs0NDUsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qCi0JICogSXQgbWlnaHQgYmUgbmljZSB0byBwYXNzIHRoZSBub2RlIEdVSUQgd2l0aCB0aGUgZXZlbnQsIGJ1dAotCSAqIHJpZ2h0IG5vdyB0aGUgb25seSB3YXkgdG8gZ2V0IGl0IGlzIHRvIHF1ZXJ5IHRoZSBkZXZpY2UKLQkgKiBwcm92aWRlciwgYW5kIHRoaXMgY2FuIGNyYXNoIGR1cmluZyBkZXZpY2UgcmVtb3ZhbCBiZWNhdXNlCi0JICogd2UgYXJlIHdpbGwgYmUgcnVubmluZyBhZnRlciBkcml2ZXIgcmVtb3ZhbCBoYXMgc3RhcnRlZC4KLQkgKiBXZSBjb3VsZCBhZGQgYSBub2RlX2d1aWQgZmllbGQgdG8gc3RydWN0IGliX2RldmljZSwgb3Igd2UKLQkgKiBjb3VsZCBqdXN0IGxldCB1c2Vyc3BhY2UgcmVhZCB0aGUgbm9kZSBHVUlEIGZyb20gc3lzZnMgd2hlbgotCSAqIGRldmljZXMgYXJlIGFkZGVkLgorCSAqIEl0IHdvdWxkIGJlIG5pY2UgdG8gcGFzcyB0aGUgbm9kZSBHVUlEIHdpdGggdGhlIGV2ZW50Li4uCiAJICovCiAKIAllbnZwW2ldID0gTlVMTDsKQEAgLTYyMywyMSArNjE3LDE1IEBACiBzdGF0aWMgc3NpemVfdCBzaG93X25vZGVfZ3VpZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGliX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGNkZXYsIHN0cnVjdCBpYl9kZXZpY2UsIGNsYXNzX2Rldik7Ci0Jc3RydWN0IGliX2RldmljZV9hdHRyIGF0dHI7Ci0Jc3NpemVfdCByZXQ7CiAKIAlpZiAoIWliZGV2X2lzX2FsaXZlKGRldikpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0ID0gaWJfcXVlcnlfZGV2aWNlKGRldiwgJmF0dHIpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KIAlyZXR1cm4gc3ByaW50ZihidWYsICIlMDR4OiUwNHg6JTA0eDolMDR4XG4iLAotCQkgICAgICAgYmUxNl90b19jcHUoKChfX2JlMTYgKikgJmF0dHIubm9kZV9ndWlkKVswXSksCi0JCSAgICAgICBiZTE2X3RvX2NwdSgoKF9fYmUxNiAqKSAmYXR0ci5ub2RlX2d1aWQpWzFdKSwKLQkJICAgICAgIGJlMTZfdG9fY3B1KCgoX19iZTE2ICopICZhdHRyLm5vZGVfZ3VpZClbMl0pLAotCQkgICAgICAgYmUxNl90b19jcHUoKChfX2JlMTYgKikgJmF0dHIubm9kZV9ndWlkKVszXSkpOworCQkgICAgICAgYmUxNl90b19jcHUoKChfX2JlMTYgKikgJmRldi0+bm9kZV9ndWlkKVswXSksCisJCSAgICAgICBiZTE2X3RvX2NwdSgoKF9fYmUxNiAqKSAmZGV2LT5ub2RlX2d1aWQpWzFdKSwKKwkJICAgICAgIGJlMTZfdG9fY3B1KCgoX19iZTE2ICopICZkZXYtPm5vZGVfZ3VpZClbMl0pLAorCQkgICAgICAgYmUxNl90b19jcHUoKChfX2JlMTYgKikgJmRldi0+bm9kZV9ndWlkKVszXSkpOwogfQogCiBzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIobm9kZV90eXBlLCBTX0lSVUdPLCBzaG93X25vZGVfdHlwZSwgTlVMTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jCmluZGV4IDZlMTU3ODcuLmU5NWM0MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTExMyw3ICsxMTQsNyBAQAogCS5yZW1vdmUgPSBpYl91Y21fcmVtb3ZlX29uZQogfTsKIAotc3RhdGljIERFQ0xBUkVfTVVURVgoY3R4X2lkX211dGV4KTsKK3N0YXRpYyBERUZJTkVfTVVURVgoY3R4X2lkX211dGV4KTsKIHN0YXRpYyBERUZJTkVfSURSKGN0eF9pZF90YWJsZSk7CiBzdGF0aWMgREVDTEFSRV9CSVRNQVAoZGV2X21hcCwgSUJfVUNNX01BWF9ERVZJQ0VTKTsKIApAQCAtMTIxLDcgKzEyMiw3IEBACiB7CiAJc3RydWN0IGliX3VjbV9jb250ZXh0ICpjdHg7CiAKLQlkb3duKCZjdHhfaWRfbXV0ZXgpOworCW11dGV4X2xvY2soJmN0eF9pZF9tdXRleCk7CiAJY3R4ID0gaWRyX2ZpbmQoJmN0eF9pZF90YWJsZSwgaWQpOwogCWlmICghY3R4KQogCQljdHggPSBFUlJfUFRSKC1FTk9FTlQpOwpAQCAtMTI5LDcgKzEzMCw3IEBACiAJCWN0eCA9IEVSUl9QVFIoLUVJTlZBTCk7CiAJZWxzZQogCQlhdG9taWNfaW5jKCZjdHgtPnJlZik7Ci0JdXAoJmN0eF9pZF9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZjdHhfaWRfbXV0ZXgpOwogCiAJcmV0dXJuIGN0eDsKIH0KQEAgLTE4Niw5ICsxODcsOSBAQAogCQlpZiAoIXJlc3VsdCkKIAkJCWdvdG8gZXJyb3I7CiAKLQkJZG93bigmY3R4X2lkX211dGV4KTsKKwkJbXV0ZXhfbG9jaygmY3R4X2lkX211dGV4KTsKIAkJcmVzdWx0ID0gaWRyX2dldF9uZXcoJmN0eF9pZF90YWJsZSwgY3R4LCAmY3R4LT5pZCk7Ci0JCXVwKCZjdHhfaWRfbXV0ZXgpOworCQltdXRleF91bmxvY2soJmN0eF9pZF9tdXRleCk7CiAJfSB3aGlsZSAocmVzdWx0ID09IC1FQUdBSU4pOwogCiAJaWYgKHJlc3VsdCkKQEAgLTU1MCw5ICs1NTEsOSBAQAogZXJyMjoKIAlpYl9kZXN0cm95X2NtX2lkKGN0eC0+Y21faWQpOwogZXJyMToKLQlkb3duKCZjdHhfaWRfbXV0ZXgpOworCW11dGV4X2xvY2soJmN0eF9pZF9tdXRleCk7CiAJaWRyX3JlbW92ZSgmY3R4X2lkX3RhYmxlLCBjdHgtPmlkKTsKLQl1cCgmY3R4X2lkX211dGV4KTsKKwltdXRleF91bmxvY2soJmN0eF9pZF9tdXRleCk7CiAJa2ZyZWUoY3R4KTsKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtNTcyLDcgKzU3Myw3IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGluYnVmLCBzaXplb2YoY21kKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JZG93bigmY3R4X2lkX211dGV4KTsKKwltdXRleF9sb2NrKCZjdHhfaWRfbXV0ZXgpOwogCWN0eCA9IGlkcl9maW5kKCZjdHhfaWRfdGFibGUsIGNtZC5pZCk7CiAJaWYgKCFjdHgpCiAJCWN0eCA9IEVSUl9QVFIoLUVOT0VOVCk7CkBAIC01ODAsNyArNTgxLDcgQEAKIAkJY3R4ID0gRVJSX1BUUigtRUlOVkFMKTsKIAllbHNlCiAJCWlkcl9yZW1vdmUoJmN0eF9pZF90YWJsZSwgY3R4LT5pZCk7Ci0JdXAoJmN0eF9pZF9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZjdHhfaWRfbXV0ZXgpOwogCiAJaWYgKElTX0VSUihjdHgpKQogCQlyZXR1cm4gUFRSX0VSUihjdHgpOwpAQCAtMTI4MCw5ICsxMjgxLDkgQEAKIAkJCQkgc3RydWN0IGliX3VjbV9jb250ZXh0LCBmaWxlX2xpc3QpOwogCQl1cCgmZmlsZS0+bXV0ZXgpOwogCi0JCWRvd24oJmN0eF9pZF9tdXRleCk7CisJCW11dGV4X2xvY2soJmN0eF9pZF9tdXRleCk7CiAJCWlkcl9yZW1vdmUoJmN0eF9pZF90YWJsZSwgY3R4LT5pZCk7Ci0JCXVwKCZjdHhfaWRfbXV0ZXgpOworCQltdXRleF91bmxvY2soJmN0eF9pZF9tdXRleCk7CiAKIAkJaWJfZGVzdHJveV9jbV9pZChjdHgtPmNtX2lkKTsKIAkJaWJfdWNtX2NsZWFudXBfZXZlbnRzKGN0eCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91c2VyX21hZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXNlcl9tYWQuYwppbmRleCBlYjdmNTI1Li5jOTA4ZGU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91c2VyX21hZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VzZXJfbWFkLmMKQEAgLTE5Nyw4ICsxOTcsOCBAQAogCQltZW1jcHkodGltZW91dC0+bWFkLmRhdGEsIHBhY2tldC0+bWFkLmRhdGEsCiAJCSAgICAgICBzaXplb2YgKHN0cnVjdCBpYl9tYWRfaGRyKSk7CiAKLQkJaWYgKCFxdWV1ZV9wYWNrZXQoZmlsZSwgYWdlbnQsIHRpbWVvdXQpKQotCQkJCXJldHVybjsKKwkJaWYgKHF1ZXVlX3BhY2tldChmaWxlLCBhZ2VudCwgdGltZW91dCkpCisJCQlrZnJlZSh0aW1lb3V0KTsKIAl9CiBvdXQ6CiAJa2ZyZWUocGFja2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJicy5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzLmgKaW5kZXggNzExNGUzZi4uZjdlZWNiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzLmgKQEAgLTQxLDYgKzQxLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8cmRtYS9pYl92ZXJicy5oPgogI2luY2x1ZGUgPHJkbWEvaWJfdXNlcl92ZXJicy5oPgpAQCAtODgsNyArODksNyBAQAogCiBzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgewogCXN0cnVjdCBrcmVmCQkJCXJlZjsKLQlzdHJ1Y3Qgc2VtYXBob3JlCQkJbXV0ZXg7CisJc3RydWN0IG11dGV4CQkJCW11dGV4OwogCXN0cnVjdCBpYl91dmVyYnNfZGV2aWNlCQkgICAgICAgKmRldmljZTsKIAlzdHJ1Y3QgaWJfdWNvbnRleHQJCSAgICAgICAqdWNvbnRleHQ7CiAJc3RydWN0IGliX2V2ZW50X2hhbmRsZXIJCQlldmVudF9oYW5kbGVyOwpAQCAtMTMxLDcgKzEzMiw3IEBACiAJdTMyCQkJYXN5bmNfZXZlbnRzX3JlcG9ydGVkOwogfTsKIAotZXh0ZXJuIHN0cnVjdCBzZW1hcGhvcmUgaWJfdXZlcmJzX2lkcl9tdXRleDsKK2V4dGVybiBzdHJ1Y3QgbXV0ZXggaWJfdXZlcmJzX2lkcl9tdXRleDsKIGV4dGVybiBzdHJ1Y3QgaWRyIGliX3V2ZXJic19wZF9pZHI7CiBleHRlcm4gc3RydWN0IGlkciBpYl91dmVyYnNfbXJfaWRyOwogZXh0ZXJuIHN0cnVjdCBpZHIgaWJfdXZlcmJzX213X2lkcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19jbWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19jbWQuYwppbmRleCBhNTdkMDIxLi40MDdiNjI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfY21kLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX2NtZC5jCkBAIC02Nyw3ICs2Nyw3IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JZG93bigmZmlsZS0+bXV0ZXgpOworCW11dGV4X2xvY2soJmZpbGUtPm11dGV4KTsKIAogCWlmIChmaWxlLT51Y29udGV4dCkgewogCQlyZXQgPSAtRUlOVkFMOwpAQCAtMTE5LDcgKzExOSw3IEBACiAKIAlmZF9pbnN0YWxsKHJlc3AuYXN5bmNfZmQsIGZpbHApOwogCi0JdXAoJmZpbGUtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmZpbGUtPm11dGV4KTsKIAogCXJldHVybiBpbl9sZW47CiAKQEAgLTEzMSw3ICsxMzEsNyBAQAogCWliZGV2LT5kZWFsbG9jX3Vjb250ZXh0KHVjb250ZXh0KTsKIAogZXJyOgotCXVwKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZmaWxlLT5tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTU3LDcgKzE1Nyw3IEBACiAJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CiAKIAlyZXNwLmZ3X3ZlciAJCSAgICAgICA9IGF0dHIuZndfdmVyOwotCXJlc3Aubm9kZV9ndWlkIAkJICAgICAgID0gYXR0ci5ub2RlX2d1aWQ7CisJcmVzcC5ub2RlX2d1aWQgCQkgICAgICAgPSBmaWxlLT5kZXZpY2UtPmliX2Rldi0+bm9kZV9ndWlkOwogCXJlc3Auc3lzX2ltYWdlX2d1aWQgCSAgICAgICA9IGF0dHIuc3lzX2ltYWdlX2d1aWQ7CiAJcmVzcC5tYXhfbXJfc2l6ZSAJICAgICAgID0gYXR0ci5tYXhfbXJfc2l6ZTsKIAlyZXNwLnBhZ2Vfc2l6ZV9jYXAgCSAgICAgICA9IGF0dHIucGFnZV9zaXplX2NhcDsKQEAgLTI5MCw3ICsyOTAsNyBAQAogCXBkLT51b2JqZWN0ID0gdW9iajsKIAlhdG9taWNfc2V0KCZwZC0+dXNlY250LCAwKTsKIAotCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X2xvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiByZXRyeToKIAlpZiAoIWlkcl9wcmVfZ2V0KCZpYl91dmVyYnNfcGRfaWRyLCBHRlBfS0VSTkVMKSkgewpAQCAtMzE0LDExICszMTQsMTEgQEAKIAkJZ290byBlcnJfaWRyOwogCX0KIAotCWRvd24oJmZpbGUtPm11dGV4KTsKKwltdXRleF9sb2NrKCZmaWxlLT5tdXRleCk7CiAJbGlzdF9hZGRfdGFpbCgmdW9iai0+bGlzdCwgJmZpbGUtPnVjb250ZXh0LT5wZF9saXN0KTsKLQl1cCgmZmlsZS0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmZmlsZS0+bXV0ZXgpOwogCi0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlyZXR1cm4gaW5fbGVuOwogCkBAIC0zMjYsNyArMzI2LDcgQEAKIAlpZHJfcmVtb3ZlKCZpYl91dmVyYnNfcGRfaWRyLCB1b2JqLT5pZCk7CiAKIGVycl91cDoKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAlpYl9kZWFsbG9jX3BkKHBkKTsKIAogZXJyOgpAQCAtMzQ2LDcgKzM0Niw3IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlwZCA9IGlkcl9maW5kKCZpYl91dmVyYnNfcGRfaWRyLCBjbWQucGRfaGFuZGxlKTsKIAlpZiAoIXBkIHx8IHBkLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KQpAQCAtMzYwLDE0ICszNjAsMTQgQEAKIAogCWlkcl9yZW1vdmUoJmliX3V2ZXJic19wZF9pZHIsIGNtZC5wZF9oYW5kbGUpOwogCi0JZG93bigmZmlsZS0+bXV0ZXgpOworCW11dGV4X2xvY2soJmZpbGUtPm11dGV4KTsKIAlsaXN0X2RlbCgmdW9iai0+bGlzdCk7Ci0JdXAoJmZpbGUtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmZpbGUtPm11dGV4KTsKIAogCWtmcmVlKHVvYmopOwogCiBvdXQ6Ci0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlyZXR1cm4gcmV0ID8gcmV0IDogaW5fbGVuOwogfQpAQCAtNDI2LDcgKzQyNiw3IEBACiAKIAlvYmotPnVtZW0udmlydF9iYXNlID0gY21kLmhjYV92YTsKIAotCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X2xvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcGQgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3BkX2lkciwgY21kLnBkX2hhbmRsZSk7CiAJaWYgKCFwZCB8fCBwZC0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkgewpAQCAtNDc2LDExICs0NzYsMTEgQEAKIAkJZ290byBlcnJfaWRyOwogCX0KIAotCWRvd24oJmZpbGUtPm11dGV4KTsKKwltdXRleF9sb2NrKCZmaWxlLT5tdXRleCk7CiAJbGlzdF9hZGRfdGFpbCgmb2JqLT51b2JqZWN0Lmxpc3QsICZmaWxlLT51Y29udGV4dC0+bXJfbGlzdCk7Ci0JdXAoJmZpbGUtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmZpbGUtPm11dGV4KTsKIAotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcmV0dXJuIGluX2xlbjsKIApAQCAtNDg5LDkgKzQ4OSwxMCBAQAogCiBlcnJfdW5yZWc6CiAJaWJfZGVyZWdfbXIobXIpOworCWF0b21pY19kZWMoJnBkLT51c2VjbnQpOwogCiBlcnJfdXA6Ci0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlpYl91bWVtX3JlbGVhc2UoZmlsZS0+ZGV2aWNlLT5pYl9kZXYsICZvYmotPnVtZW0pOwogCkBAIC01MTIsNyArNTEzLDcgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCW1yID0gaWRyX2ZpbmQoJmliX3V2ZXJic19tcl9pZHIsIGNtZC5tcl9oYW5kbGUpOwogCWlmICghbXIgfHwgbXItPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpCkBAIC01MjYsMTUgKzUyNywxNSBAQAogCiAJaWRyX3JlbW92ZSgmaWJfdXZlcmJzX21yX2lkciwgY21kLm1yX2hhbmRsZSk7CiAKLQlkb3duKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfbG9jaygmZmlsZS0+bXV0ZXgpOwogCWxpc3RfZGVsKCZtZW1vYmotPnVvYmplY3QubGlzdCk7Ci0JdXAoJmZpbGUtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmZpbGUtPm11dGV4KTsKIAogCWliX3VtZW1fcmVsZWFzZShmaWxlLT5kZXZpY2UtPmliX2RldiwgJm1lbW9iai0+dW1lbSk7CiAJa2ZyZWUobWVtb2JqKTsKIAogb3V0OgotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcmV0dXJuIHJldCA/IHJldCA6IGluX2xlbjsKIH0KQEAgLTU5MywxMyArNTk0LDE4IEBACiAJaWYgKGNtZC5jb21wX3ZlY3RvciA+PSBmaWxlLT5kZXZpY2UtPm51bV9jb21wX3ZlY3RvcnMpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGNtZC5jb21wX2NoYW5uZWwgPj0gMCkKLQkJZXZfZmlsZSA9IGliX3V2ZXJic19sb29rdXBfY29tcF9maWxlKGNtZC5jb21wX2NoYW5uZWwpOwotCiAJdW9iaiA9IGttYWxsb2Moc2l6ZW9mICp1b2JqLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVvYmopCiAJCXJldHVybiAtRU5PTUVNOwogCisJaWYgKGNtZC5jb21wX2NoYW5uZWwgPj0gMCkgeworCQlldl9maWxlID0gaWJfdXZlcmJzX2xvb2t1cF9jb21wX2ZpbGUoY21kLmNvbXBfY2hhbm5lbCk7CisJCWlmICghZXZfZmlsZSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCiAJdW9iai0+dW9iamVjdC51c2VyX2hhbmRsZSAgID0gY21kLnVzZXJfaGFuZGxlOwogCXVvYmotPnVvYmplY3QuY29udGV4dCAgICAgICA9IGZpbGUtPnVjb250ZXh0OwogCXVvYmotPnV2ZXJic19maWxlCSAgICA9IGZpbGU7CkBAIC02MjIsNyArNjI4LDcgQEAKIAljcS0+Y3FfY29udGV4dCAgICA9IGV2X2ZpbGU7CiAJYXRvbWljX3NldCgmY3EtPnVzZWNudCwgMCk7CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogcmV0cnk6CiAJaWYgKCFpZHJfcHJlX2dldCgmaWJfdXZlcmJzX2NxX2lkciwgR0ZQX0tFUk5FTCkpIHsKQEAgLTY0NywxMSArNjUzLDExIEBACiAJCWdvdG8gZXJyX2lkcjsKIAl9CiAKLQlkb3duKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfbG9jaygmZmlsZS0+bXV0ZXgpOwogCWxpc3RfYWRkX3RhaWwoJnVvYmotPnVvYmplY3QubGlzdCwgJmZpbGUtPnVjb250ZXh0LT5jcV9saXN0KTsKLQl1cCgmZmlsZS0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmZmlsZS0+bXV0ZXgpOwogCi0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlyZXR1cm4gaW5fbGVuOwogCkBAIC02NTksMTAgKzY2NSwxMiBAQAogCWlkcl9yZW1vdmUoJmliX3V2ZXJic19jcV9pZHIsIHVvYmotPnVvYmplY3QuaWQpOwogCiBlcnJfdXA6Ci0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAJaWJfZGVzdHJveV9jcShjcSk7CiAKIGVycjoKKwlpZiAoZXZfZmlsZSkKKwkJaWJfdXZlcmJzX3JlbGVhc2VfdWNxKGZpbGUsIGV2X2ZpbGUsIHVvYmopOwogCWtmcmVlKHVvYmopOwogCXJldHVybiByZXQ7CiB9CkBAIC02OTMsNyArNzAxLDcgQEAKIAkJZ290byBvdXRfd2M7CiAJfQogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAJY3EgPSBpZHJfZmluZCgmaWJfdXZlcmJzX2NxX2lkciwgY21kLmNxX2hhbmRsZSk7CiAJaWYgKCFjcSB8fCBjcS0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkgewogCQlyZXQgPSAtRUlOVkFMOwpAQCAtNzIzLDcgKzczMSw3IEBACiAJCXJldCA9IC1FRkFVTFQ7CiAKIG91dDoKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAlrZnJlZShyZXNwKTsKIAogb3V0X3djOgpAQCAtNzQyLDE0ICs3NTAsMTQgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAljcSA9IGlkcl9maW5kKCZpYl91dmVyYnNfY3FfaWRyLCBjbWQuY3FfaGFuZGxlKTsKIAlpZiAoY3EgJiYgY3EtPnVvYmplY3QtPmNvbnRleHQgPT0gZmlsZS0+dWNvbnRleHQpIHsKIAkJaWJfcmVxX25vdGlmeV9jcShjcSwgY21kLnNvbGljaXRlZF9vbmx5ID8KIAkJCQkJSUJfQ1FfU09MSUNJVEVEIDogSUJfQ1FfTkVYVF9DT01QKTsKIAkJcmV0ID0gaW5fbGVuOwogCX0KLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC03NzEsNyArNzc5LDcgQEAKIAogCW1lbXNldCgmcmVzcCwgMCwgc2l6ZW9mIHJlc3ApOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAljcSA9IGlkcl9maW5kKCZpYl91dmVyYnNfY3FfaWRyLCBjbWQuY3FfaGFuZGxlKTsKIAlpZiAoIWNxIHx8IGNxLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KQpAQCAtNzg3LDkgKzc5NSw5IEBACiAKIAlpZHJfcmVtb3ZlKCZpYl91dmVyYnNfY3FfaWRyLCBjbWQuY3FfaGFuZGxlKTsKIAotCWRvd24oJmZpbGUtPm11dGV4KTsKKwltdXRleF9sb2NrKCZmaWxlLT5tdXRleCk7CiAJbGlzdF9kZWwoJnVvYmotPnVvYmplY3QubGlzdCk7Ci0JdXAoJmZpbGUtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmZpbGUtPm11dGV4KTsKIAogCWliX3V2ZXJic19yZWxlYXNlX3VjcShmaWxlLCBldl9maWxlLCB1b2JqKTsKIApAQCAtODAzLDcgKzgxMSw3IEBACiAJCXJldCA9IC1FRkFVTFQ7CiAKIG91dDoKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXJldHVybiByZXQgPyByZXQgOiBpbl9sZW47CiB9CkBAIC04MzcsNyArODQ1LDcgQEAKIAlpZiAoIXVvYmopCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlwZCAgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3BkX2lkciwgY21kLnBkX2hhbmRsZSk7CiAJc2NxID0gaWRyX2ZpbmQoJmliX3V2ZXJic19jcV9pZHIsIGNtZC5zZW5kX2NxX2hhbmRsZSk7CkBAIC05MjIsMTEgKzkzMCwxMSBAQAogCQlnb3RvIGVycl9pZHI7CiAJfQogCi0JZG93bigmZmlsZS0+bXV0ZXgpOworCW11dGV4X2xvY2soJmZpbGUtPm11dGV4KTsKIAlsaXN0X2FkZF90YWlsKCZ1b2JqLT51ZXZlbnQudW9iamVjdC5saXN0LCAmZmlsZS0+dWNvbnRleHQtPnFwX2xpc3QpOwotCXVwKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZmaWxlLT5tdXRleCk7CiAKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXJldHVybiBpbl9sZW47CiAKQEAgLTkzNSw5ICs5NDMsMTQgQEAKIAogZXJyX2Rlc3Ryb3k6CiAJaWJfZGVzdHJveV9xcChxcCk7CisJYXRvbWljX2RlYygmcGQtPnVzZWNudCk7CisJYXRvbWljX2RlYygmYXR0ci5zZW5kX2NxLT51c2VjbnQpOworCWF0b21pY19kZWMoJmF0dHIucmVjdl9jcS0+dXNlY250KTsKKwlpZiAoYXR0ci5zcnEpCisJCWF0b21pY19kZWMoJmF0dHIuc3JxLT51c2VjbnQpOwogCiBlcnJfdXA6Ci0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlrZnJlZSh1b2JqKTsKIAlyZXR1cm4gcmV0OwpAQCAtOTU5LDcgKzk3Miw3IEBACiAJaWYgKCFhdHRyKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X2xvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcXAgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3FwX2lkciwgY21kLnFwX2hhbmRsZSk7CiAJaWYgKCFxcCB8fCBxcC0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkgewpAQCAtMTAyMCw3ICsxMDMzLDcgQEAKIAlyZXQgPSBpbl9sZW47CiAKIG91dDoKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAlrZnJlZShhdHRyKTsKIAogCXJldHVybiByZXQ7CkBAIC0xMDQxLDcgKzEwNTQsNyBAQAogCiAJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXFwID0gaWRyX2ZpbmQoJmliX3V2ZXJic19xcF9pZHIsIGNtZC5xcF9oYW5kbGUpOwogCWlmICghcXAgfHwgcXAtPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpCkBAIC0xMDYwLDkgKzEwNzMsOSBAQAogCiAJaWRyX3JlbW92ZSgmaWJfdXZlcmJzX3FwX2lkciwgY21kLnFwX2hhbmRsZSk7CiAKLQlkb3duKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfbG9jaygmZmlsZS0+bXV0ZXgpOwogCWxpc3RfZGVsKCZ1b2JqLT51ZXZlbnQudW9iamVjdC5saXN0KTsKLQl1cCgmZmlsZS0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmZmlsZS0+bXV0ZXgpOwogCiAJaWJfdXZlcmJzX3JlbGVhc2VfdWV2ZW50KGZpbGUsICZ1b2JqLT51ZXZlbnQpOwogCkBAIC0xMDc1LDcgKzEwODgsNyBAQAogCQlyZXQgPSAtRUZBVUxUOwogCiBvdXQ6Ci0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlyZXR1cm4gcmV0ID8gcmV0IDogaW5fbGVuOwogfQpAQCAtMTEwNiw3ICsxMTE5LDcgQEAKIAlpZiAoIXVzZXJfd3IpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlxcCA9IGlkcl9maW5kKCZpYl91dmVyYnNfcXBfaWRyLCBjbWQucXBfaGFuZGxlKTsKIAlpZiAoIXFwIHx8IHFwLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KQpAQCAtMTIxMSw3ICsxMjI0LDcgQEAKIAkJcmV0ID0gLUVGQVVMVDsKIAogb3V0OgotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJd2hpbGUgKHdyKSB7CiAJCW5leHQgPSB3ci0+bmV4dDsKQEAgLTEzMjgsNyArMTM0MSw3IEBACiAJaWYgKElTX0VSUih3cikpCiAJCXJldHVybiBQVFJfRVJSKHdyKTsKIAotCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X2xvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcXAgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3FwX2lkciwgY21kLnFwX2hhbmRsZSk7CiAJaWYgKCFxcCB8fCBxcC0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkKQEAgLTEzNDksNyArMTM2Miw3IEBACiAJCXJldCA9IC1FRkFVTFQ7CiAKIG91dDoKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXdoaWxlICh3cikgewogCQluZXh0ID0gd3ItPm5leHQ7CkBAIC0xMzc5LDcgKzEzOTIsNyBAQAogCWlmIChJU19FUlIod3IpKQogCQlyZXR1cm4gUFRSX0VSUih3cik7CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXNycSA9IGlkcl9maW5kKCZpYl91dmVyYnNfc3JxX2lkciwgY21kLnNycV9oYW5kbGUpOwogCWlmICghc3JxIHx8IHNycS0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkKQEAgLTE0MDAsNyArMTQxMyw3IEBACiAJCXJldCA9IC1FRkFVTFQ7CiAKIG91dDoKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXdoaWxlICh3cikgewogCQluZXh0ID0gd3ItPm5leHQ7CkBAIC0xNDMzLDcgKzE0NDYsNyBAQAogCWlmICghdW9iaikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF9sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXBkID0gaWRyX2ZpbmQoJmliX3V2ZXJic19wZF9pZHIsIGNtZC5wZF9oYW5kbGUpOwogCWlmICghcGQgfHwgcGQtPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpIHsKQEAgLTE0NDgsNiArMTQ2MSw3IEBACiAJYXR0ci5zbCAJICAgICAgID0gY21kLmF0dHIuc2w7CiAJYXR0ci5zcmNfcGF0aF9iaXRzICAgICA9IGNtZC5hdHRyLnNyY19wYXRoX2JpdHM7CiAJYXR0ci5zdGF0aWNfcmF0ZSAgICAgICA9IGNtZC5hdHRyLnN0YXRpY19yYXRlOworCWF0dHIuYWhfZmxhZ3MgICAgICAgICAgPSBjbWQuYXR0ci5pc19nbG9iYWwgPyBJQl9BSF9HUkggOiAwOwogCWF0dHIucG9ydF9udW0gCSAgICAgICA9IGNtZC5hdHRyLnBvcnRfbnVtOwogCWF0dHIuZ3JoLmZsb3dfbGFiZWwgICAgPSBjbWQuYXR0ci5ncmguZmxvd19sYWJlbDsKIAlhdHRyLmdyaC5zZ2lkX2luZGV4ICAgID0gY21kLmF0dHIuZ3JoLnNnaWRfaW5kZXg7CkBAIC0xNDg0LDExICsxNDk4LDExIEBACiAJCWdvdG8gZXJyX2lkcjsKIAl9CiAKLQlkb3duKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfbG9jaygmZmlsZS0+bXV0ZXgpOwogCWxpc3RfYWRkX3RhaWwoJnVvYmotPmxpc3QsICZmaWxlLT51Y29udGV4dC0+YWhfbGlzdCk7Ci0JdXAoJmZpbGUtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmZpbGUtPm11dGV4KTsKIAotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcmV0dXJuIGluX2xlbjsKIApAQCAtMTQ5OSw3ICsxNTEzLDcgQEAKIAlpYl9kZXN0cm95X2FoKGFoKTsKIAogZXJyX3VwOgotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJa2ZyZWUodW9iaik7CiAJcmV0dXJuIHJldDsKQEAgLTE1MTYsNyArMTUzMCw3IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlhaCA9IGlkcl9maW5kKCZpYl91dmVyYnNfYWhfaWRyLCBjbWQuYWhfaGFuZGxlKTsKIAlpZiAoIWFoIHx8IGFoLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KQpAQCAtMTUzMCwxNCArMTU0NCwxNCBAQAogCiAJaWRyX3JlbW92ZSgmaWJfdXZlcmJzX2FoX2lkciwgY21kLmFoX2hhbmRsZSk7CiAKLQlkb3duKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfbG9jaygmZmlsZS0+bXV0ZXgpOwogCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKLQl1cCgmZmlsZS0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmZmlsZS0+bXV0ZXgpOwogCiAJa2ZyZWUodW9iaik7CiAKIG91dDoKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXJldHVybiByZXQgPyByZXQgOiBpbl9sZW47CiB9CkBAIC0xNTU1LDcgKzE1NjksNyBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X2xvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcXAgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3FwX2lkciwgY21kLnFwX2hhbmRsZSk7CiAJaWYgKCFxcCB8fCBxcC0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkKQEAgLTE1ODgsNyArMTYwMiw3IEBACiAJCWtmcmVlKG1jYXN0KTsKIAogb3V0OgotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcmV0dXJuIHJldCA/IHJldCA6IGluX2xlbjsKIH0KQEAgLTE2MDYsNyArMTYyMCw3IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlxcCA9IGlkcl9maW5kKCZpYl91dmVyYnNfcXBfaWRyLCBjbWQucXBfaGFuZGxlKTsKIAlpZiAoIXFwIHx8IHFwLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KQpAQCAtMTYyNyw3ICsxNjQxLDcgQEAKIAkJfQogCiBvdXQ6Ci0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlyZXR1cm4gcmV0ID8gcmV0IDogaW5fbGVuOwogfQpAQCAtMTY1OSw3ICsxNjczLDcgQEAKIAlpZiAoIXVvYmopCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlwZCAgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3BkX2lkciwgY21kLnBkX2hhbmRsZSk7CiAKQEAgLTE3MTYsMTEgKzE3MzAsMTEgQEAKIAkJZ290byBlcnJfaWRyOwogCX0KIAotCWRvd24oJmZpbGUtPm11dGV4KTsKKwltdXRleF9sb2NrKCZmaWxlLT5tdXRleCk7CiAJbGlzdF9hZGRfdGFpbCgmdW9iai0+dW9iamVjdC5saXN0LCAmZmlsZS0+dWNvbnRleHQtPnNycV9saXN0KTsKLQl1cCgmZmlsZS0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmZmlsZS0+bXV0ZXgpOwogCi0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlyZXR1cm4gaW5fbGVuOwogCkBAIC0xNzI5LDkgKzE3NDMsMTAgQEAKIAogZXJyX2Rlc3Ryb3k6CiAJaWJfZGVzdHJveV9zcnEoc3JxKTsKKwlhdG9taWNfZGVjKCZwZC0+dXNlY250KTsKIAogZXJyX3VwOgotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJa2ZyZWUodW9iaik7CiAJcmV0dXJuIHJldDsKQEAgLTE3NDksNyArMTc2NCw3IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlzcnEgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3NycV9pZHIsIGNtZC5zcnFfaGFuZGxlKTsKIAlpZiAoIXNycSB8fCBzcnEtPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpIHsKQEAgLTE3NjMsNyArMTc3OCw3IEBACiAJcmV0ID0gaWJfbW9kaWZ5X3NycShzcnEsICZhdHRyLCBjbWQuYXR0cl9tYXNrKTsKIAogb3V0OgotCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKwltdXRleF91bmxvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJcmV0dXJuIHJldCA/IHJldCA6IGluX2xlbjsKIH0KQEAgLTE3ODEsNyArMTc5Niw3IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAltZW1zZXQoJnJlc3AsIDAsIHNpemVvZiByZXNwKTsKIApAQCAtMTc5Nyw5ICsxODEyLDkgQEAKIAogCWlkcl9yZW1vdmUoJmliX3V2ZXJic19zcnFfaWRyLCBjbWQuc3JxX2hhbmRsZSk7CiAKLQlkb3duKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfbG9jaygmZmlsZS0+bXV0ZXgpOwogCWxpc3RfZGVsKCZ1b2JqLT51b2JqZWN0Lmxpc3QpOwotCXVwKCZmaWxlLT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZmaWxlLT5tdXRleCk7CiAKIAlpYl91dmVyYnNfcmVsZWFzZV91ZXZlbnQoZmlsZSwgdW9iaik7CiAKQEAgLTE4MTIsNyArMTgyNyw3IEBACiAJCXJldCA9IC1FRkFVTFQ7CiAKIG91dDoKLQl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpYl91dmVyYnNfaWRyX211dGV4KTsKIAogCXJldHVybiByZXQgPyByZXQgOiBpbl9sZW47CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21haW4uYwppbmRleCA4MTczN2JkLi45NmVhNzliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYWluLmMKQEAgLTY2LDcgKzY2LDcgQEAKIAogc3RhdGljIHN0cnVjdCBjbGFzcyAqdXZlcmJzX2NsYXNzOwogCi1ERUNMQVJFX01VVEVYKGliX3V2ZXJic19pZHJfbXV0ZXgpOworREVGSU5FX01VVEVYKGliX3V2ZXJic19pZHJfbXV0ZXgpOwogREVGSU5FX0lEUihpYl91dmVyYnNfcGRfaWRyKTsKIERFRklORV9JRFIoaWJfdXZlcmJzX21yX2lkcik7CiBERUZJTkVfSURSKGliX3V2ZXJic19td19pZHIpOwpAQCAtMTgwLDcgKzE4MCw3IEBACiAJaWYgKCFjb250ZXh0KQogCQlyZXR1cm4gMDsKIAotCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X2xvY2soJmliX3V2ZXJic19pZHJfbXV0ZXgpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHVvYmosIHRtcCwgJmNvbnRleHQtPmFoX2xpc3QsIGxpc3QpIHsKIAkJc3RydWN0IGliX2FoICphaCA9IGlkcl9maW5kKCZpYl91dmVyYnNfYWhfaWRyLCB1b2JqLT5pZCk7CkBAIC0yNTAsNyArMjUwLDcgQEAKIAkJa2ZyZWUodW9iaik7CiAJfQogCi0JdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaWJfdXZlcmJzX2lkcl9tdXRleCk7CiAKIAlyZXR1cm4gY29udGV4dC0+ZGV2aWNlLT5kZWFsbG9jX3Vjb250ZXh0KGNvbnRleHQpOwogfQpAQCAtNjUzLDcgKzY1Myw3IEBACiAJZmlsZS0+dWNvbnRleHQJID0gTlVMTDsKIAlmaWxlLT5hc3luY19maWxlID0gTlVMTDsKIAlrcmVmX2luaXQoJmZpbGUtPnJlZik7Ci0JaW5pdF9NVVRFWCgmZmlsZS0+bXV0ZXgpOworCW11dGV4X2luaXQoJmZpbGUtPm11dGV4KTsKIAogCWZpbHAtPnByaXZhdGVfZGF0YSA9IGZpbGU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3ZlcmJzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS92ZXJicy5jCmluZGV4IDRjMTVlMTEuLmM4NTczNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3ZlcmJzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdmVyYnMuYwpAQCAtMTA3LDkgKzEwNyw5IEBACiAKIAlpZiAod2MtPndjX2ZsYWdzICYgSUJfV0NfR1JIKSB7CiAJCWFoX2F0dHIuYWhfZmxhZ3MgPSBJQl9BSF9HUkg7Ci0JCWFoX2F0dHIuZ3JoLmRnaWQgPSBncmgtPmRnaWQ7CisJCWFoX2F0dHIuZ3JoLmRnaWQgPSBncmgtPnNnaWQ7CiAKLQkJcmV0ID0gaWJfZmluZF9jYWNoZWRfZ2lkKHBkLT5kZXZpY2UsICZncmgtPnNnaWQsICZwb3J0X251bSwKKwkJcmV0ID0gaWJfZmluZF9jYWNoZWRfZ2lkKHBkLT5kZXZpY2UsICZncmgtPmRnaWQsICZwb3J0X251bSwKIAkJCQkJICZnaWRfaW5kZXgpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9hdi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2F2LmMKaW5kZXggMjJmZGM0NC4uYTE0ZWVkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2F2LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2F2LmMKQEAgLTE2Myw2ICsxNjMsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IG10aGNhX2FoX2dyaF9wcmVzZW50KHN0cnVjdCBtdGhjYV9haCAqYWgpCit7CisJcmV0dXJuICEhKGFoLT5hdi0+Z19zbGlkICYgMHg4MCk7Cit9CisKIGludCBtdGhjYV9yZWFkX2FoKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX2FoICphaCwKIAkJICBzdHJ1Y3QgaWJfdWRfaGVhZGVyICpoZWFkZXIpCiB7CkBAIC0xNzIsOCArMTc3LDcgQEAKIAloZWFkZXItPmxyaC5zZXJ2aWNlX2xldmVsICAgPSBiZTMyX3RvX2NwdShhaC0+YXYtPnNsX3RjbGFzc19mbG93bGFiZWwpID4+IDI4OwogCWhlYWRlci0+bHJoLmRlc3RpbmF0aW9uX2xpZCA9IGFoLT5hdi0+ZGxpZDsKIAloZWFkZXItPmxyaC5zb3VyY2VfbGlkICAgICAgPSBjcHVfdG9fYmUxNihhaC0+YXYtPmdfc2xpZCAmIDB4N2YpOwotCWlmIChhaC0+YXYtPmdfc2xpZCAmIDB4ODApIHsKLQkJaGVhZGVyLT5ncmhfcHJlc2VudCA9IDE7CisJaWYgKG10aGNhX2FoX2dyaF9wcmVzZW50KGFoKSkgewogCQloZWFkZXItPmdyaC50cmFmZmljX2NsYXNzID0KIAkJCShiZTMyX3RvX2NwdShhaC0+YXYtPnNsX3RjbGFzc19mbG93bGFiZWwpID4+IDIwKSAmIDB4ZmY7CiAJCWhlYWRlci0+Z3JoLmZsb3dfbGFiZWwgICAgPQpAQCAtMTg0LDggKzE4OCw2IEBACiAJCQkJICAmaGVhZGVyLT5ncmguc291cmNlX2dpZCk7CiAJCW1lbWNweShoZWFkZXItPmdyaC5kZXN0aW5hdGlvbl9naWQucmF3LAogCQkgICAgICAgYWgtPmF2LT5kZ2lkLCAxNik7Ci0JfSBlbHNlIHsKLQkJaGVhZGVyLT5ncmhfcHJlc2VudCA9IDA7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY21kLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY21kLmMKaW5kZXggOWVkMzQ1OC4uYmUxNzkxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NtZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jbWQuYwpAQCAtNjA2LDcgKzYwNiw3IEBACiAJCQllcnIgPSAtRUlOVkFMOwogCQkJZ290byBvdXQ7CiAJCX0KLQkJZm9yIChpID0gMDsgaSA8IG10aGNhX2ljbV9zaXplKCZpdGVyKSAvICgxIDw8IGxnKTsgKytpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBtdGhjYV9pY21fc2l6ZSgmaXRlcikgPj4gbGc7ICsraSkgewogCQkJaWYgKHZpcnQgIT0gLTEpIHsKIAkJCQlwYWdlc1tuZW50ICogMl0gPSBjcHVfdG9fYmU2NCh2aXJ0KTsKIAkJCQl2aXJ0ICs9IDEgPDwgbGc7CkBAIC03MjcsOCArNzI3LDggQEAKIAkJICogc3lzdGVtIHBhZ2VzIG5lZWRlZC4KIAkJICovCiAJCWRldi0+ZncuYXJiZWwuZndfcGFnZXMgPQotCQkJKGRldi0+ZncuYXJiZWwuZndfcGFnZXMgKyAoMSA8PCAoUEFHRV9TSElGVCAtIDEyKSkgLSAxKSA+PgotCQkJKFBBR0VfU0hJRlQgLSAxMik7CisJCQlBTElHTihkZXYtPmZ3LmFyYmVsLmZ3X3BhZ2VzLCBQQUdFX1NJWkUgPj4gMTIpID4+CisJCQkJKFBBR0VfU0hJRlQgLSAxMik7CiAKIAkJbXRoY2FfZGJnKGRldiwgIkNsZWFyIGludCBAICVsbHgsIEVRIGFybSBAICVsbHgsIEVRIHNldCBDSSBAICVsbHhcbiIsCiAJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIGRldi0+ZncuYXJiZWwuY2xyX2ludF9iYXNlLApAQCAtOTM3LDEwICs5MzcsNiBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCi0JTVRIQ0FfR0VUKGZpZWxkLCBvdXRib3gsIFFVRVJZX0RFVl9MSU1fTUFYX1NSUV9TWl9PRkZTRVQpOwotCWRldl9saW0tPm1heF9zcnFfc3ogPSAoMSA8PCBmaWVsZCkgLSAxOwotCU1USENBX0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9ERVZfTElNX01BWF9RUF9TWl9PRkZTRVQpOwotCWRldl9saW0tPm1heF9xcF9zeiA9ICgxIDw8IGZpZWxkKSAtIDE7CiAJTVRIQ0FfR0VUKGZpZWxkLCBvdXRib3gsIFFVRVJZX0RFVl9MSU1fUlNWRF9RUF9PRkZTRVQpOwogCWRldl9saW0tPnJlc2VydmVkX3FwcyA9IDEgPDwgKGZpZWxkICYgMHhmKTsKIAlNVEhDQV9HRVQoZmllbGQsIG91dGJveCwgUVVFUllfREVWX0xJTV9NQVhfUVBfT0ZGU0VUKTsKQEAgLTEwNTYsNiArMTA1MiwxMCBAQAogCW10aGNhX2RiZyhkZXYsICJGbGFnczogJTA4eFxuIiwgZGV2X2xpbS0+ZmxhZ3MpOwogCiAJaWYgKG10aGNhX2lzX21lbWZyZWUoZGV2KSkgeworCQlNVEhDQV9HRVQoZmllbGQsIG91dGJveCwgUVVFUllfREVWX0xJTV9NQVhfU1JRX1NaX09GRlNFVCk7CisJCWRldl9saW0tPm1heF9zcnFfc3ogPSAxIDw8IGZpZWxkOworCQlNVEhDQV9HRVQoZmllbGQsIG91dGJveCwgUVVFUllfREVWX0xJTV9NQVhfUVBfU1pfT0ZGU0VUKTsKKwkJZGV2X2xpbS0+bWF4X3FwX3N6ID0gMSA8PCBmaWVsZDsKIAkJTVRIQ0FfR0VUKGZpZWxkLCBvdXRib3gsIFFVRVJZX0RFVl9MSU1fUlNaX1NSUV9PRkZTRVQpOwogCQlkZXZfbGltLT5oY2EuYXJiZWwucmVzaXplX3NycSA9IGZpZWxkICYgMTsKIAkJTVRIQ0FfR0VUKGZpZWxkLCBvdXRib3gsIFFVRVJZX0RFVl9MSU1fTUFYX1NHX1JRX09GRlNFVCk7CkBAIC0xMDg3LDYgKzEwODcsMTAgQEAKIAkJbXRoY2FfZGJnKGRldiwgIk1heCBJQ00gc2l6ZSAlbGxkIE1CXG4iLAogCQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBkZXZfbGltLT5oY2EuYXJiZWwubWF4X2ljbV9zeiA+PiAyMCk7CiAJfSBlbHNlIHsKKwkJTVRIQ0FfR0VUKGZpZWxkLCBvdXRib3gsIFFVRVJZX0RFVl9MSU1fTUFYX1NSUV9TWl9PRkZTRVQpOworCQlkZXZfbGltLT5tYXhfc3JxX3N6ID0gKDEgPDwgZmllbGQpIC0gMTsKKwkJTVRIQ0FfR0VUKGZpZWxkLCBvdXRib3gsIFFVRVJZX0RFVl9MSU1fTUFYX1FQX1NaX09GRlNFVCk7CisJCWRldl9saW0tPm1heF9xcF9zeiA9ICgxIDw8IGZpZWxkKSAtIDE7CiAJCU1USENBX0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9ERVZfTElNX01BWF9BVl9PRkZTRVQpOwogCQlkZXZfbGltLT5oY2EudGF2b3IubWF4X2F2cyA9IDEgPDwgKGZpZWxkICYgMHgzZik7CiAJCWRldl9saW0tPm1wdF9lbnRyeV9zeiA9IE1USENBX01QVF9FTlRSWV9TSVpFOwpAQCAtMTQ0MSw2ICsxNDQ1LDcgQEAKIAkgKiBwYWdlcyBuZWVkZWQuCiAJICovCiAJKmF1eF9wYWdlcyA9ICgqYXV4X3BhZ2VzICsgKDEgPDwgKFBBR0VfU0hJRlQgLSAxMikpIC0gMSkgPj4gKFBBR0VfU0hJRlQgLSAxMik7CisJKmF1eF9wYWdlcyA9IEFMSUdOKCphdXhfcGFnZXMsIFBBR0VfU0laRSA+PiAxMikgPj4gKFBBR0VfU0hJRlQgLSAxMik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jcS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NxLmMKaW5kZXggNGE4YWRjZS4uOTZmMWE4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NxLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NxLmMKQEAgLTEyOCwxMiArMTI4LDEyIEBACiAJX19iZTMyIG15X3FwbjsKIAl1MzIgICAgcmVzZXJ2ZWQxWzNdOwogCXU4ICAgICBzeW5kcm9tZTsKLQl1OCAgICAgcmVzZXJ2ZWQyOworCXU4ICAgICB2ZW5kb3JfZXJyOwogCV9fYmUxNiBkYl9jbnQ7Ci0JdTMyICAgIHJlc2VydmVkMzsKKwl1MzIgICAgcmVzZXJ2ZWQyOwogCV9fYmUzMiB3cWU7CiAJdTggICAgIG9wY29kZTsKLQl1OCAgICAgcmVzZXJ2ZWQ0WzJdOworCXU4ICAgICByZXNlcnZlZDNbMl07CiAJdTggICAgIG93bmVyOwogfTsKIApAQCAtMjUzLDYgKzI1MywxNSBAQAogCQl3YWtlX3VwKCZjcS0+d2FpdCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3JlY3ZfY3FlKHN0cnVjdCBtdGhjYV9jcWUgKmNxZSkKK3sKKwlpZiAoKGNxZS0+b3Bjb2RlICYgTVRIQ0FfRVJST1JfQ1FFX09QQ09ERV9NQVNLKSA9PQorCSAgICBNVEhDQV9FUlJPUl9DUUVfT1BDT0RFX01BU0spCisJCXJldHVybiAhKGNxZS0+b3Bjb2RlICYgMHgwMSk7CisJZWxzZQorCQlyZXR1cm4gIShjcWUtPmlzX3NlbmQgJiAweDgwKTsKK30KKwogdm9pZCBtdGhjYV9jcV9jbGVhbihzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHUzMiBjcW4sIHUzMiBxcG4sCiAJCSAgICBzdHJ1Y3QgbXRoY2Ffc3JxICpzcnEpCiB7CkBAIC0yOTYsNyArMzA1LDcgQEAKIAl3aGlsZSAoKGludCkgLS1wcm9kX2luZGV4IC0gKGludCkgY3EtPmNvbnNfaW5kZXggPj0gMCkgewogCQljcWUgPSBnZXRfY3FlKGNxLCBwcm9kX2luZGV4ICYgY3EtPmliY3EuY3FlKTsKIAkJaWYgKGNxZS0+bXlfcXBuID09IGNwdV90b19iZTMyKHFwbikpIHsKLQkJCWlmIChzcnEpCisJCQlpZiAoc3JxICYmIGlzX3JlY3ZfY3FlKGNxZSkpCiAJCQkJbXRoY2FfZnJlZV9zcnFfd3FlKHNycSwgYmUzMl90b19jcHUoY3FlLT53cWUpKTsKIAkJCSsrbmZyZWVkOwogCQl9IGVsc2UgaWYgKG5mcmVlZCkKQEAgLTMzMyw4ICszNDIsOCBAQAogCX0KIAogCS8qCi0JICogRm9yIGNvbXBsZXRpb25zIGluIGVycm9yLCBvbmx5IHdvcmsgcmVxdWVzdCBJRCwgc3RhdHVzIChhbmQKLQkgKiBmcmVlZCByZXNvdXJjZSBjb3VudCBmb3IgUkQpIGhhdmUgdG8gYmUgc2V0LgorCSAqIEZvciBjb21wbGV0aW9ucyBpbiBlcnJvciwgb25seSB3b3JrIHJlcXVlc3QgSUQsIHN0YXR1cywgdmVuZG9yIGVycm9yCisJICogKGFuZCBmcmVlZCByZXNvdXJjZSBjb3VudCBmb3IgUkQpIGhhdmUgdG8gYmUgc2V0LgogCSAqLwogCXN3aXRjaCAoY3FlLT5zeW5kcm9tZSkgewogCWNhc2UgU1lORFJPTUVfTE9DQUxfTEVOR1RIX0VSUjoKQEAgLTM5Niw2ICs0MDUsOCBAQAogCQlicmVhazsKIAl9CiAKKwllbnRyeS0+dmVuZG9yX2VyciA9IGNxZS0+dmVuZG9yX2VycjsKKwogCS8qCiAJICogTWVtLWZyZWUgSENBcyBhbHdheXMgZ2VuZXJhdGUgb25lIENRRSBwZXIgV1FFLCBldmVuIGluIHRoZQogCSAqIGVycm9yIGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhlIGRvb3JiZWxsIGNvdW50LCBldGMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZGV2LmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZGV2LmgKaW5kZXggNDk3ZmY3OS4uYTEwNGFiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2Rldi5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9kZXYuaApAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAKICNpbmNsdWRlICJtdGhjYV9wcm92aWRlci5oIgpAQCAtNTE5LDYgKzUyMCw3IEBACiBpbnQgbXRoY2FfZGVzdHJveV9haChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9haCAqYWgpOwogaW50IG10aGNhX3JlYWRfYWgoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfYWggKmFoLAogCQkgIHN0cnVjdCBpYl91ZF9oZWFkZXIgKmhlYWRlcik7CitpbnQgbXRoY2FfYWhfZ3JoX3ByZXNlbnQoc3RydWN0IG10aGNhX2FoICphaCk7CiAKIGludCBtdGhjYV9tdWx0aWNhc3RfYXR0YWNoKHN0cnVjdCBpYl9xcCAqaWJxcCwgdW5pb24gaWJfZ2lkICpnaWQsIHUxNiBsaWQpOwogaW50IG10aGNhX211bHRpY2FzdF9kZXRhY2goc3RydWN0IGliX3FwICppYnFwLCB1bmlvbiBpYl9naWQgKmdpZCwgdTE2IGxpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZXEuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9lcS5jCmluZGV4IDM0ZDY4ZTUuLjJlYWJiMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9lcS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9lcS5jCkBAIC00NSw2ICs0NSw3IEBACiBlbnVtIHsKIAlNVEhDQV9OVU1fQVNZTkNfRVFFID0gMHg4MCwKIAlNVEhDQV9OVU1fQ01EX0VRRSAgID0gMHg4MCwKKwlNVEhDQV9OVU1fU1BBUkVfRVFFID0gMHg4MCwKIAlNVEhDQV9FUV9FTlRSWV9TSVpFID0gMHgyMAogfTsKIApAQCAtMjc3LDExICsyNzgsMTAgQEAKIHsKIAlzdHJ1Y3QgbXRoY2FfZXFlICplcWU7CiAJaW50IGRpc2FybV9jcW47Ci0JaW50ICBlcWVzX2ZvdW5kID0gMDsKKwlpbnQgZXFlc19mb3VuZCA9IDA7CisJaW50IHNldF9jaSA9IDA7CiAKIAl3aGlsZSAoKGVxZSA9IG5leHRfZXFlX3N3KGVxKSkpIHsKLQkJaW50IHNldF9jaSA9IDA7Ci0KIAkJLyoKIAkJICogTWFrZSBzdXJlIHdlIHJlYWQgRVEgZW50cnkgY29udGVudHMgYWZ0ZXIgd2UndmUKIAkJICogY2hlY2tlZCB0aGUgb3duZXJzaGlwIGJpdC4KQEAgLTM0NSwxMiArMzQ1LDYgQEAKIAkJCQkJYmUxNl90b19jcHUoZXFlLT5ldmVudC5jbWQudG9rZW4pLAogCQkJCQllcWUtPmV2ZW50LmNtZC5zdGF0dXMsCiAJCQkJCWJlNjRfdG9fY3B1KGVxZS0+ZXZlbnQuY21kLm91dF9wYXJhbSkpOwotCQkJLyoKLQkJCSAqIGNtZF9ldmVudCgpIG1heSBhZGQgbW9yZSBjb21tYW5kcy4KLQkJCSAqIFRoZSBjYXJkIHdpbGwgdGhpbmsgdGhlIHF1ZXVlIGhhcyBvdmVyZmxvd2VkIGlmCi0JCQkgKiB3ZSBkb24ndCB0ZWxsIGl0IHdlJ3ZlIGJlZW4gcHJvY2Vzc2luZyBldmVudHMuCi0JCQkgKi8KLQkJCXNldF9jaSA9IDE7CiAJCQlicmVhazsKIAogCQljYXNlIE1USENBX0VWRU5UX1RZUEVfUE9SVF9DSEFOR0U6CkBAIC0zODUsOCArMzc5LDE2IEBACiAJCXNldF9lcWVfaHcoZXFlKTsKIAkJKytlcS0+Y29uc19pbmRleDsKIAkJZXFlc19mb3VuZCA9IDE7CisJCSsrc2V0X2NpOwogCi0JCWlmICh1bmxpa2VseShzZXRfY2kpKSB7CisJCS8qCisJCSAqIFRoZSBIQ0Egd2lsbCB0aGluayB0aGUgcXVldWUgaGFzIG92ZXJmbG93ZWQgaWYgd2UKKwkJICogZG9uJ3QgdGVsbCBpdCB3ZSd2ZSBiZWVuIHByb2Nlc3NpbmcgZXZlbnRzLiAgV2UKKwkJICogY3JlYXRlIG91ciBFUXMgd2l0aCBNVEhDQV9OVU1fU1BBUkVfRVFFIGV4dHJhCisJCSAqIGVudHJpZXMsIHNvIHdlIG11c3QgdXBkYXRlIG91ciBjb25zdW1lciBpbmRleCBhdAorCQkgKiBsZWFzdCB0aGF0IG9mdGVuLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KHNldF9jaSA+PSBNVEhDQV9OVU1fU1BBUkVfRVFFKSkgewogCQkJLyoKIAkJCSAqIENvbmRpdGlvbmFsIG9uIGhjYV90eXBlIGlzIE9LIGhlcmUgYmVjYXVzZQogCQkJICogdGhpcyBpcyBhIHJhcmUgY2FzZSwgbm90IHRoZSBmYXN0IHBhdGguCkBAIC00ODQsOCArNDg2LDcgQEAKIAkJCQkgICAgIHU4IGludHIsCiAJCQkJICAgICBzdHJ1Y3QgbXRoY2FfZXEgKmVxKQogewotCWludCBucGFnZXMgPSAobmVudCAqIE1USENBX0VRX0VOVFJZX1NJWkUgKyBQQUdFX1NJWkUgLSAxKSAvCi0JCVBBR0VfU0laRTsKKwlpbnQgbnBhZ2VzOwogCXU2NCAqZG1hX2xpc3QgPSBOVUxMOwogCWRtYV9hZGRyX3QgdDsKIAlzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveDsKQEAgLTQ5Niw2ICs0OTcsNyBAQAogCiAJZXEtPmRldiAgPSBkZXY7CiAJZXEtPm5lbnQgPSByb3VuZHVwX3Bvd19vZl90d28obWF4KG5lbnQsIDIpKTsKKyAJbnBhZ2VzID0gQUxJR04oZXEtPm5lbnQgKiBNVEhDQV9FUV9FTlRSWV9TSVpFLCBQQUdFX1NJWkUpIC8gUEFHRV9TSVpFOwogCiAJZXEtPnBhZ2VfbGlzdCA9IGttYWxsb2MobnBhZ2VzICogc2l6ZW9mICplcS0+cGFnZV9saXN0LAogCQkJCUdGUF9LRVJORUwpOwpAQCAtODYyLDE5ICs4NjQsMTkgQEAKIAlpbnRyID0gKGRldi0+bXRoY2FfZmxhZ3MgJiBNVEhDQV9GTEFHX01TSSkgPwogCQkxMjggOiBkZXYtPmVxX3RhYmxlLmludGFfcGluOwogCi0JZXJyID0gbXRoY2FfY3JlYXRlX2VxKGRldiwgZGV2LT5saW1pdHMubnVtX2NxcywKKwllcnIgPSBtdGhjYV9jcmVhdGVfZXEoZGV2LCBkZXYtPmxpbWl0cy5udW1fY3FzICsgTVRIQ0FfTlVNX1NQQVJFX0VRRSwKIAkJCSAgICAgIChkZXYtPm10aGNhX2ZsYWdzICYgTVRIQ0FfRkxBR19NU0lfWCkgPyAxMjggOiBpbnRyLAogCQkJICAgICAgJmRldi0+ZXFfdGFibGUuZXFbTVRIQ0FfRVFfQ09NUF0pOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX291dF91bm1hcDsKIAotCWVyciA9IG10aGNhX2NyZWF0ZV9lcShkZXYsIE1USENBX05VTV9BU1lOQ19FUUUsCisJZXJyID0gbXRoY2FfY3JlYXRlX2VxKGRldiwgTVRIQ0FfTlVNX0FTWU5DX0VRRSArIE1USENBX05VTV9TUEFSRV9FUUUsCiAJCQkgICAgICAoZGV2LT5tdGhjYV9mbGFncyAmIE1USENBX0ZMQUdfTVNJX1gpID8gMTI5IDogaW50ciwKIAkJCSAgICAgICZkZXYtPmVxX3RhYmxlLmVxW01USENBX0VRX0FTWU5DXSk7CiAJaWYgKGVycikKIAkJZ290byBlcnJfb3V0X2NvbXA7CiAKLQllcnIgPSBtdGhjYV9jcmVhdGVfZXEoZGV2LCBNVEhDQV9OVU1fQ01EX0VRRSwKKwllcnIgPSBtdGhjYV9jcmVhdGVfZXEoZGV2LCBNVEhDQV9OVU1fQ01EX0VRRSArIE1USENBX05VTV9TUEFSRV9FUUUsCiAJCQkgICAgICAoZGV2LT5tdGhjYV9mbGFncyAmIE1USENBX0ZMQUdfTVNJX1gpID8gMTMwIDogaW50ciwKIAkJCSAgICAgICZkZXYtPmVxX3RhYmxlLmVxW01USENBX0VRX0NNRF0pOwogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21haW4uYwppbmRleCA2Zjk0YjI1Li44YjAwZDlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tYWluLmMKQEAgLTI2MSw2ICsyNjEsMTAgQEAKIAl9CiAKIAllcnIgPSBtdGhjYV9kZXZfbGltKG1kZXYsICZkZXZfbGltKTsKKwlpZiAoZXJyKSB7CisJCW10aGNhX2VycihtZGV2LCAiUVVFUllfREVWX0xJTSBjb21tYW5kIGZhaWxlZCwgYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfZGlzYWJsZTsKKwl9CiAKIAlwcm9maWxlID0gZGVmYXVsdF9wcm9maWxlOwogCXByb2ZpbGUubnVtX3VhciAgID0gZGV2X2xpbS51YXJfc2l6ZSAvIFBBR0VfU0laRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tY2cuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tY2cuYwppbmRleCAyZmM0NDlkLi43N2JjNmM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWNnLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21jZy5jCkBAIC0xMTEsNyArMTExLDggQEAKIAkJCWdvdG8gb3V0OwogCQlpZiAoc3RhdHVzKSB7CiAJCQltdGhjYV9lcnIoZGV2LCAiUkVBRF9NR00gcmV0dXJuZWQgc3RhdHVzICUwMnhcbiIsIHN0YXR1cyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKIAkJfQogCiAJCWlmICghbWVtY21wKG1nbS0+Z2lkLCB6ZXJvX2dpZCwgMTYpKSB7CkBAIC0xMjYsNyArMTI3LDcgQEAKIAkJCWdvdG8gb3V0OwogCiAJCSpwcmV2ID0gKmluZGV4OwotCQkqaW5kZXggPSBiZTMyX3RvX2NwdShtZ20tPm5leHRfZ2lkX2luZGV4KSA+PiA1OworCQkqaW5kZXggPSBiZTMyX3RvX2NwdShtZ20tPm5leHRfZ2lkX2luZGV4KSA+PiA2OwogCX0gd2hpbGUgKCppbmRleCk7CiAKIAkqaW5kZXggPSAtMTsKQEAgLTE1Myw4ICsxNTQsMTAgQEAKIAkJcmV0dXJuIFBUUl9FUlIobWFpbGJveCk7CiAJbWdtID0gbWFpbGJveC0+YnVmOwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5tY2dfdGFibGUuc2VtKSkKLQkJcmV0dXJuIC1FSU5UUjsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkZXYtPm1jZ190YWJsZS5zZW0pKSB7CisJCWVyciA9IC1FSU5UUjsKKwkJZ290byBlcnJfc2VtOworCX0KIAogCWVyciA9IGZpbmRfbWdtKGRldiwgZ2lkLT5yYXcsIG1haWxib3gsICZoYXNoLCAmcHJldiwgJmluZGV4KTsKIAlpZiAoZXJyKQpAQCAtMTgxLDkgKzE4NCw4IEBACiAJCQllcnIgPSAtRUlOVkFMOwogCQkJZ290byBvdXQ7CiAJCX0KLQorCQltZW1zZXQobWdtLCAwLCBzaXplb2YgKm1nbSk7CiAJCW1lbWNweShtZ20tPmdpZCwgZ2lkLT5yYXcsIDE2KTsKLQkJbWdtLT5uZXh0X2dpZF9pbmRleCA9IDA7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IE1USENBX1FQX1BFUl9NR007ICsraSkKQEAgLTIwOSw2ICsyMTEsNyBAQAogCWlmIChzdGF0dXMpIHsKIAkJbXRoY2FfZXJyKGRldiwgIldSSVRFX01HTSByZXR1cm5lZCBzdGF0dXMgJTAyeFxuIiwgc3RhdHVzKTsKIAkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CiAJfQogCiAJaWYgKCFsaW5rKQpAQCAtMjIzLDcgKzIyNiw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCW1nbS0+bmV4dF9naWRfaW5kZXggPSBjcHVfdG9fYmUzMihpbmRleCA8PCA1KTsKKwltZ20tPm5leHRfZ2lkX2luZGV4ID0gY3B1X3RvX2JlMzIoaW5kZXggPDwgNik7CiAKIAllcnIgPSBtdGhjYV9XUklURV9NR00oZGV2LCBwcmV2LCBtYWlsYm94LCAmc3RhdHVzKTsKIAlpZiAoZXJyKQpAQCAtMjM0LDcgKzIzNywxMiBAQAogCX0KIAogIG91dDoKKwlpZiAoZXJyICYmIGxpbmsgJiYgaW5kZXggIT0gLTEpIHsKKwkJQlVHX09OKGluZGV4IDwgZGV2LT5saW1pdHMubnVtX21nbXMpOworCQltdGhjYV9mcmVlKCZkZXYtPm1jZ190YWJsZS5hbGxvYywgaW5kZXgpOworCX0KIAl1cCgmZGV2LT5tY2dfdGFibGUuc2VtKTsKKyBlcnJfc2VtOgogCW10aGNhX2ZyZWVfbWFpbGJveChkZXYsIG1haWxib3gpOwogCXJldHVybiBlcnI7CiB9CkBAIC0yNTUsOCArMjYzLDEwIEBACiAJCXJldHVybiBQVFJfRVJSKG1haWxib3gpOwogCW1nbSA9IG1haWxib3gtPmJ1ZjsKIAotCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRldi0+bWNnX3RhYmxlLnNlbSkpCi0JCXJldHVybiAtRUlOVFI7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5tY2dfdGFibGUuc2VtKSkgeworCQllcnIgPSAtRUlOVFI7CisJCWdvdG8gZXJyX3NlbTsKKwl9CiAKIAllcnIgPSBmaW5kX21nbShkZXYsIGdpZC0+cmF3LCBtYWlsYm94LCAmaGFzaCwgJnByZXYsICZpbmRleCk7CiAJaWYgKGVycikKQEAgLTMwNSwxMyArMzE1LDExIEBACiAJaWYgKGkgIT0gMSkKIAkJZ290byBvdXQ7CiAKLQlnb3RvIG91dDsKLQogCWlmIChwcmV2ID09IC0xKSB7CiAJCS8qIFJlbW92ZSBlbnRyeSBmcm9tIE1HTSAqLwotCQlpZiAoYmUzMl90b19jcHUobWdtLT5uZXh0X2dpZF9pbmRleCkgPj4gNSkgewotCQkJZXJyID0gbXRoY2FfUkVBRF9NR00oZGV2LAotCQkJCQkgICAgIGJlMzJfdG9fY3B1KG1nbS0+bmV4dF9naWRfaW5kZXgpID4+IDUsCisJCWludCBhbWdtX2luZGV4X3RvX2ZyZWUgPSBiZTMyX3RvX2NwdShtZ20tPm5leHRfZ2lkX2luZGV4KSA+PiA2OworCQlpZiAoYW1nbV9pbmRleF90b19mcmVlKSB7CisJCQllcnIgPSBtdGhjYV9SRUFEX01HTShkZXYsIGFtZ21faW5kZXhfdG9fZnJlZSwKIAkJCQkJICAgICBtYWlsYm94LCAmc3RhdHVzKTsKIAkJCWlmIChlcnIpCiAJCQkJZ290byBvdXQ7CkBAIC0zMzIsOSArMzQwLDEzIEBACiAJCQllcnIgPSAtRUlOVkFMOwogCQkJZ290byBvdXQ7CiAJCX0KKwkJaWYgKGFtZ21faW5kZXhfdG9fZnJlZSkgeworCQkJQlVHX09OKGFtZ21faW5kZXhfdG9fZnJlZSA8IGRldi0+bGltaXRzLm51bV9tZ21zKTsKKwkJCW10aGNhX2ZyZWUoJmRldi0+bWNnX3RhYmxlLmFsbG9jLCBhbWdtX2luZGV4X3RvX2ZyZWUpOworCQl9CiAJfSBlbHNlIHsKIAkJLyogUmVtb3ZlIGVudHJ5IGZyb20gQU1HTSAqLwotCQlpbmRleCA9IGJlMzJfdG9fY3B1KG1nbS0+bmV4dF9naWRfaW5kZXgpID4+IDU7CisJCWludCBjdXJyX25leHRfaW5kZXggPSBiZTMyX3RvX2NwdShtZ20tPm5leHRfZ2lkX2luZGV4KSA+PiA2OwogCQllcnIgPSBtdGhjYV9SRUFEX01HTShkZXYsIHByZXYsIG1haWxib3gsICZzdGF0dXMpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CkBAIC0zNDQsNyArMzU2LDcgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJbWdtLT5uZXh0X2dpZF9pbmRleCA9IGNwdV90b19iZTMyKGluZGV4IDw8IDUpOworCQltZ20tPm5leHRfZ2lkX2luZGV4ID0gY3B1X3RvX2JlMzIoY3Vycl9uZXh0X2luZGV4IDw8IDYpOwogCiAJCWVyciA9IG10aGNhX1dSSVRFX01HTShkZXYsIHByZXYsIG1haWxib3gsICZzdGF0dXMpOwogCQlpZiAoZXJyKQpAQCAtMzU0LDEwICszNjYsMTMgQEAKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dDsKIAkJfQorCQlCVUdfT04oaW5kZXggPCBkZXYtPmxpbWl0cy5udW1fbWdtcyk7CisJCW10aGNhX2ZyZWUoJmRldi0+bWNnX3RhYmxlLmFsbG9jLCBpbmRleCk7CiAJfQogCiAgb3V0OgogCXVwKCZkZXYtPm1jZ190YWJsZS5zZW0pOworIGVycl9zZW06CiAJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTM2NSwxMSArMzgwLDEyIEBACiBpbnQgX19kZXZpbml0IG10aGNhX2luaXRfbWNnX3RhYmxlKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKIHsKIAlpbnQgZXJyOworCWludCB0YWJsZV9zaXplID0gZGV2LT5saW1pdHMubnVtX21nbXMgKyBkZXYtPmxpbWl0cy5udW1fYW1nbXM7CiAKIAllcnIgPSBtdGhjYV9hbGxvY19pbml0KCZkZXYtPm1jZ190YWJsZS5hbGxvYywKLQkJCSAgICAgICBkZXYtPmxpbWl0cy5udW1fYW1nbXMsCi0JCQkgICAgICAgZGV2LT5saW1pdHMubnVtX2FtZ21zIC0gMSwKLQkJCSAgICAgICAwKTsKKwkJCSAgICAgICB0YWJsZV9zaXplLAorCQkJICAgICAgIHRhYmxlX3NpemUgLSAxLAorCQkJICAgICAgIGRldi0+bGltaXRzLm51bV9tZ21zKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWVtZnJlZS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21lbWZyZWUuYwppbmRleCBkNzJmZTk1Li45ZmI5ODVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWVtZnJlZS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tZW1mcmVlLmMKQEAgLTIzMyw3ICsyMzMsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgY2h1bmstPm5wYWdlczsgKytpKSB7CiAJCQlpZiAoY2h1bmstPm1lbVtpXS5sZW5ndGggPj0gb2Zmc2V0KSB7CiAJCQkJcGFnZSA9IGNodW5rLT5tZW1baV0ucGFnZTsKLQkJCQlicmVhazsKKwkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCW9mZnNldCAtPSBjaHVuay0+bWVtW2ldLmxlbmd0aDsKIAkJfQpAQCAtNDg1LDYgKzQ4NSw4IEBACiAJCQlwdXRfcGFnZShkYl90YWItPnBhZ2VbaV0ubWVtLnBhZ2UpOwogCQl9CiAJfQorCisJa2ZyZWUoZGJfdGFiKTsKIH0KIAogaW50IG10aGNhX2FsbG9jX2RiKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgZW51bSBtdGhjYV9kYl90eXBlIHR5cGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcHJvdmlkZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5jCmluZGV4IDRjYzdlMjguLjQ4NGE3ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5jCkBAIC0zMyw3ICszMyw3IEBACiAgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiAgKiBTT0ZUV0FSRS4KICAqCi0gKiAkSWQ6IG10aGNhX3Byb3ZpZGVyLmMgMTM5NyAyMDA0LTEyLTI4IDA1OjA5OjAwWiByb2xhbmQgJAorICogJElkOiBtdGhjYV9wcm92aWRlci5jIDQ4NTkgMjAwNi0wMS0wOSAyMTo1NToxMFogcm9sYW5kICQKICAqLwogCiAjaW5jbHVkZSA8cmRtYS9pYl9zbWkuaD4KQEAgLTQ1LDYgKzQ1LDE0IEBACiAjaW5jbHVkZSAibXRoY2FfdXNlci5oIgogI2luY2x1ZGUgIm10aGNhX21lbWZyZWUuaCIKIAorc3RhdGljIHZvaWQgaW5pdF9xdWVyeV9tYWQoc3RydWN0IGliX3NtcCAqbWFkKQoreworCW1hZC0+YmFzZV92ZXJzaW9uICA9IDE7CisJbWFkLT5tZ210X2NsYXNzICAgID0gSUJfTUdNVF9DTEFTU19TVUJOX0xJRF9ST1VURUQ7CisJbWFkLT5jbGFzc192ZXJzaW9uID0gMTsKKwltYWQtPm1ldGhvZCAgICAJICAgPSBJQl9NR01UX01FVEhPRF9HRVQ7Cit9CisKIHN0YXRpYyBpbnQgbXRoY2FfcXVlcnlfZGV2aWNlKHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAogCQkJICAgICAgc3RydWN0IGliX2RldmljZV9hdHRyICpwcm9wcykKIHsKQEAgLTU1LDcgKzYzLDcgQEAKIAogCXU4IHN0YXR1czsKIAotCWluX21hZCAgPSBrbWFsbG9jKHNpemVvZiAqaW5fbWFkLCBHRlBfS0VSTkVMKTsKKwlpbl9tYWQgID0ga3phbGxvYyhzaXplb2YgKmluX21hZCwgR0ZQX0tFUk5FTCk7CiAJb3V0X21hZCA9IGttYWxsb2Moc2l6ZW9mICpvdXRfbWFkLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluX21hZCB8fCAhb3V0X21hZCkKIAkJZ290byBvdXQ7CkBAIC02NCwxMiArNzIsOCBAQAogCiAJcHJvcHMtPmZ3X3ZlciAgICAgICAgICAgICAgPSBtZGV2LT5md192ZXI7CiAKLQltZW1zZXQoaW5fbWFkLCAwLCBzaXplb2YgKmluX21hZCk7Ci0JaW5fbWFkLT5iYXNlX3ZlcnNpb24gICAgICAgPSAxOwotCWluX21hZC0+bWdtdF9jbGFzcyAgICAgCSAgID0gSUJfTUdNVF9DTEFTU19TVUJOX0xJRF9ST1VURUQ7Ci0JaW5fbWFkLT5jbGFzc192ZXJzaW9uICAJICAgPSAxOwotCWluX21hZC0+bWV0aG9kICAgICAgICAgCSAgID0gSUJfTUdNVF9NRVRIT0RfR0VUOwotCWluX21hZC0+YXR0cl9pZCAgIAkgICA9IElCX1NNUF9BVFRSX05PREVfSU5GTzsKKwlpbml0X3F1ZXJ5X21hZChpbl9tYWQpOworCWluX21hZC0+YXR0cl9pZCA9IElCX1NNUF9BVFRSX05PREVfSU5GTzsKIAogCWVyciA9IG10aGNhX01BRF9JRkMobWRldiwgMSwgMSwKIAkJCSAgICAxLCBOVUxMLCBOVUxMLCBpbl9tYWQsIG91dF9tYWQsCkBAIC04Nyw3ICs5MSw2IEBACiAJcHJvcHMtPnZlbmRvcl9wYXJ0X2lkICAgICAgPSBiZTE2X3RvX2NwdXAoKF9fYmUxNiAqKSAob3V0X21hZC0+ZGF0YSArIDMwKSk7CiAJcHJvcHMtPmh3X3ZlciAgICAgICAgICAgICAgPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKSAob3V0X21hZC0+ZGF0YSArIDMyKSk7CiAJbWVtY3B5KCZwcm9wcy0+c3lzX2ltYWdlX2d1aWQsIG91dF9tYWQtPmRhdGEgKyAgNCwgOCk7Ci0JbWVtY3B5KCZwcm9wcy0+bm9kZV9ndWlkLCAgICAgIG91dF9tYWQtPmRhdGEgKyAxMiwgOCk7CiAKIAlwcm9wcy0+bWF4X21yX3NpemUgICAgICAgICA9IH4wdWxsOwogCXByb3BzLT5wYWdlX3NpemVfY2FwICAgICAgID0gbWRldi0+bGltaXRzLnBhZ2Vfc2l6ZV9jYXA7CkBAIC0xMjgsMjAgKzEzMSwxNiBAQAogCWludCBlcnIgPSAtRU5PTUVNOwogCXU4IHN0YXR1czsKIAotCWluX21hZCAgPSBrbWFsbG9jKHNpemVvZiAqaW5fbWFkLCBHRlBfS0VSTkVMKTsKKwlpbl9tYWQgID0ga3phbGxvYyhzaXplb2YgKmluX21hZCwgR0ZQX0tFUk5FTCk7CiAJb3V0X21hZCA9IGttYWxsb2Moc2l6ZW9mICpvdXRfbWFkLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluX21hZCB8fCAhb3V0X21hZCkKIAkJZ290byBvdXQ7CiAKIAltZW1zZXQocHJvcHMsIDAsIHNpemVvZiAqcHJvcHMpOwogCi0JbWVtc2V0KGluX21hZCwgMCwgc2l6ZW9mICppbl9tYWQpOwotCWluX21hZC0+YmFzZV92ZXJzaW9uICAgICAgID0gMTsKLQlpbl9tYWQtPm1nbXRfY2xhc3MgICAgIAkgICA9IElCX01HTVRfQ0xBU1NfU1VCTl9MSURfUk9VVEVEOwotCWluX21hZC0+Y2xhc3NfdmVyc2lvbiAgCSAgID0gMTsKLQlpbl9tYWQtPm1ldGhvZCAgICAgICAgIAkgICA9IElCX01HTVRfTUVUSE9EX0dFVDsKLQlpbl9tYWQtPmF0dHJfaWQgICAJICAgPSBJQl9TTVBfQVRUUl9QT1JUX0lORk87Ci0JaW5fbWFkLT5hdHRyX21vZCAgICAgICAgICAgPSBjcHVfdG9fYmUzMihwb3J0KTsKKwlpbml0X3F1ZXJ5X21hZChpbl9tYWQpOworCWluX21hZC0+YXR0cl9pZCAgPSBJQl9TTVBfQVRUUl9QT1JUX0lORk87CisJaW5fbWFkLT5hdHRyX21vZCA9IGNwdV90b19iZTMyKHBvcnQpOwogCiAJZXJyID0gbXRoY2FfTUFEX0lGQyh0b19tZGV2KGliZGV2KSwgMSwgMSwKIAkJCSAgICBwb3J0LCBOVUxMLCBOVUxMLCBpbl9tYWQsIG91dF9tYWQsCkBAIC0yMjAsMTggKzIxOSwxNCBAQAogCWludCBlcnIgPSAtRU5PTUVNOwogCXU4IHN0YXR1czsKIAotCWluX21hZCAgPSBrbWFsbG9jKHNpemVvZiAqaW5fbWFkLCBHRlBfS0VSTkVMKTsKKwlpbl9tYWQgID0ga3phbGxvYyhzaXplb2YgKmluX21hZCwgR0ZQX0tFUk5FTCk7CiAJb3V0X21hZCA9IGttYWxsb2Moc2l6ZW9mICpvdXRfbWFkLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluX21hZCB8fCAhb3V0X21hZCkKIAkJZ290byBvdXQ7CiAKLQltZW1zZXQoaW5fbWFkLCAwLCBzaXplb2YgKmluX21hZCk7Ci0JaW5fbWFkLT5iYXNlX3ZlcnNpb24gICAgICAgPSAxOwotCWluX21hZC0+bWdtdF9jbGFzcyAgICAgCSAgID0gSUJfTUdNVF9DTEFTU19TVUJOX0xJRF9ST1VURUQ7Ci0JaW5fbWFkLT5jbGFzc192ZXJzaW9uICAJICAgPSAxOwotCWluX21hZC0+bWV0aG9kICAgICAgICAgCSAgID0gSUJfTUdNVF9NRVRIT0RfR0VUOwotCWluX21hZC0+YXR0cl9pZCAgIAkgICA9IElCX1NNUF9BVFRSX1BLRVlfVEFCTEU7Ci0JaW5fbWFkLT5hdHRyX21vZCAgICAgICAgICAgPSBjcHVfdG9fYmUzMihpbmRleCAvIDMyKTsKKwlpbml0X3F1ZXJ5X21hZChpbl9tYWQpOworCWluX21hZC0+YXR0cl9pZCAgPSBJQl9TTVBfQVRUUl9QS0VZX1RBQkxFOworCWluX21hZC0+YXR0cl9tb2QgPSBjcHVfdG9fYmUzMihpbmRleCAvIDMyKTsKIAogCWVyciA9IG10aGNhX01BRF9JRkModG9fbWRldihpYmRldiksIDEsIDEsCiAJCQkgICAgcG9ydCwgTlVMTCwgTlVMTCwgaW5fbWFkLCBvdXRfbWFkLApAQCAtMjU5LDE4ICsyNTQsMTQgQEAKIAlpbnQgZXJyID0gLUVOT01FTTsKIAl1OCBzdGF0dXM7CiAKLQlpbl9tYWQgID0ga21hbGxvYyhzaXplb2YgKmluX21hZCwgR0ZQX0tFUk5FTCk7CisJaW5fbWFkICA9IGt6YWxsb2Moc2l6ZW9mICppbl9tYWQsIEdGUF9LRVJORUwpOwogCW91dF9tYWQgPSBrbWFsbG9jKHNpemVvZiAqb3V0X21hZCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbl9tYWQgfHwgIW91dF9tYWQpCiAJCWdvdG8gb3V0OwogCi0JbWVtc2V0KGluX21hZCwgMCwgc2l6ZW9mICppbl9tYWQpOwotCWluX21hZC0+YmFzZV92ZXJzaW9uICAgICAgID0gMTsKLQlpbl9tYWQtPm1nbXRfY2xhc3MgICAgIAkgICA9IElCX01HTVRfQ0xBU1NfU1VCTl9MSURfUk9VVEVEOwotCWluX21hZC0+Y2xhc3NfdmVyc2lvbiAgCSAgID0gMTsKLQlpbl9tYWQtPm1ldGhvZCAgICAgICAgIAkgICA9IElCX01HTVRfTUVUSE9EX0dFVDsKLQlpbl9tYWQtPmF0dHJfaWQgICAJICAgPSBJQl9TTVBfQVRUUl9QT1JUX0lORk87Ci0JaW5fbWFkLT5hdHRyX21vZCAgICAgICAgICAgPSBjcHVfdG9fYmUzMihwb3J0KTsKKwlpbml0X3F1ZXJ5X21hZChpbl9tYWQpOworCWluX21hZC0+YXR0cl9pZCAgPSBJQl9TTVBfQVRUUl9QT1JUX0lORk87CisJaW5fbWFkLT5hdHRyX21vZCA9IGNwdV90b19iZTMyKHBvcnQpOwogCiAJZXJyID0gbXRoY2FfTUFEX0lGQyh0b19tZGV2KGliZGV2KSwgMSwgMSwKIAkJCSAgICBwb3J0LCBOVUxMLCBOVUxMLCBpbl9tYWQsIG91dF9tYWQsCkBAIC0yODQsMTMgKzI3NSw5IEBACiAKIAltZW1jcHkoZ2lkLT5yYXcsIG91dF9tYWQtPmRhdGEgKyA4LCA4KTsKIAotCW1lbXNldChpbl9tYWQsIDAsIHNpemVvZiAqaW5fbWFkKTsKLQlpbl9tYWQtPmJhc2VfdmVyc2lvbiAgICAgICA9IDE7Ci0JaW5fbWFkLT5tZ210X2NsYXNzICAgICAJICAgPSBJQl9NR01UX0NMQVNTX1NVQk5fTElEX1JPVVRFRDsKLQlpbl9tYWQtPmNsYXNzX3ZlcnNpb24gIAkgICA9IDE7Ci0JaW5fbWFkLT5tZXRob2QgICAgICAgICAJICAgPSBJQl9NR01UX01FVEhPRF9HRVQ7Ci0JaW5fbWFkLT5hdHRyX2lkICAgCSAgID0gSUJfU01QX0FUVFJfR1VJRF9JTkZPOwotCWluX21hZC0+YXR0cl9tb2QgICAgICAgICAgID0gY3B1X3RvX2JlMzIoaW5kZXggLyA4KTsKKwlpbml0X3F1ZXJ5X21hZChpbl9tYWQpOworCWluX21hZC0+YXR0cl9pZCAgPSBJQl9TTVBfQVRUUl9HVUlEX0lORk87CisJaW5fbWFkLT5hdHRyX21vZCA9IGNwdV90b19iZTMyKGluZGV4IC8gOCk7CiAKIAllcnIgPSBtdGhjYV9NQURfSUZDKHRvX21kZXYoaWJkZXYpLCAxLCAxLAogCQkJICAgIHBvcnQsIE5VTEwsIE5VTEwsIGluX21hZCwgb3V0X21hZCwKQEAgLTQ1OCw4ICs0NDUsMTAgQEAKIAlpZiAocGQtPnVvYmplY3QpIHsKIAkJY29udGV4dCA9IHRvX211Y29udGV4dChwZC0+dW9iamVjdC0+Y29udGV4dCk7CiAKLQkJaWYgKGliX2NvcHlfZnJvbV91ZGF0YSgmdWNtZCwgdWRhdGEsIHNpemVvZiB1Y21kKSkKLQkJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOworCQlpZiAoaWJfY29weV9mcm9tX3VkYXRhKCZ1Y21kLCB1ZGF0YSwgc2l6ZW9mIHVjbWQpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJZ290byBlcnJfZnJlZTsKKwkJfQogCiAJCWVyciA9IG10aGNhX21hcF91c2VyX2RiKHRvX21kZXYocGQtPmRldmljZSksICZjb250ZXh0LT51YXIsCiAJCQkJCWNvbnRleHQtPmRiX3RhYiwgdWNtZC5kYl9pbmRleCwKQEAgLTUzNSw4ICs1MjQsMTAgQEAKIAkJaWYgKHBkLT51b2JqZWN0KSB7CiAJCQljb250ZXh0ID0gdG9fbXVjb250ZXh0KHBkLT51b2JqZWN0LT5jb250ZXh0KTsKIAotCQkJaWYgKGliX2NvcHlfZnJvbV91ZGF0YSgmdWNtZCwgdWRhdGEsIHNpemVvZiB1Y21kKSkKKwkJCWlmIChpYl9jb3B5X2Zyb21fdWRhdGEoJnVjbWQsIHVkYXRhLCBzaXplb2YgdWNtZCkpIHsKKwkJCQlrZnJlZShxcCk7CiAJCQkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CisJCQl9CiAKIAkJCWVyciA9IG10aGNhX21hcF91c2VyX2RiKHRvX21kZXYocGQtPmRldmljZSksICZjb250ZXh0LT51YXIsCiAJCQkJCQljb250ZXh0LT5kYl90YWIsCkBAIC03ODMsMjQgKzc3NCwyMCBAQAogCWlmICgoKmlvdmFfc3RhcnQgJiB+UEFHRV9NQVNLKSAhPSAoYnVmZmVyX2xpc3RbMF0uYWRkciAmIH5QQUdFX01BU0spKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAotCWlmIChudW1fcGh5c19idWYgPiAxICYmCi0JICAgICgoYnVmZmVyX2xpc3RbMF0uYWRkciArIGJ1ZmZlcl9saXN0WzBdLnNpemUpICYgflBBR0VfTUFTSykpCi0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCiAJbWFzayA9IDA7CiAJdG90YWxfc2l6ZSA9IDA7CiAJZm9yIChpID0gMDsgaSA8IG51bV9waHlzX2J1ZjsgKytpKSB7Ci0JCWlmIChpICE9IDAgJiYgYnVmZmVyX2xpc3RbaV0uYWRkciAmIH5QQUdFX01BU0spCi0JCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQkJaWYgKGkgIT0gMCAmJiBpICE9IG51bV9waHlzX2J1ZiAtIDEgJiYKLQkJICAgIChidWZmZXJfbGlzdFtpXS5zaXplICYgflBBR0VfTUFTSykpCi0JCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwkJaWYgKGkgIT0gMCkKKwkJCW1hc2sgfD0gYnVmZmVyX2xpc3RbaV0uYWRkcjsKKwkJaWYgKGkgIT0gbnVtX3BoeXNfYnVmIC0gMSkKKwkJCW1hc2sgfD0gYnVmZmVyX2xpc3RbaV0uYWRkciArIGJ1ZmZlcl9saXN0W2ldLnNpemU7CiAKIAkJdG90YWxfc2l6ZSArPSBidWZmZXJfbGlzdFtpXS5zaXplOwotCQlpZiAoaSA+IDApCi0JCQltYXNrIHw9IGJ1ZmZlcl9saXN0W2ldLmFkZHI7CiAJfQogCisJaWYgKG1hc2sgJiB+UEFHRV9NQVNLKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwogCS8qIEZpbmQgbGFyZ2VzdCBwYWdlIHNoaWZ0IHdlIGNhbiB1c2UgdG8gY292ZXIgYnVmZmVycyAqLwogCWZvciAoc2hpZnQgPSBQQUdFX1NISUZUOyBzaGlmdCA8IDMxOyArK3NoaWZ0KQogCQlpZiAobnVtX3BoeXNfYnVmID4gMSkgewpAQCAtMTA3MCwxMSArMTA1Nyw0OCBAQAogCSZjbGFzc19kZXZpY2VfYXR0cl9ib2FyZF9pZAogfTsKIAorc3RhdGljIGludCBtdGhjYV9pbml0X25vZGVfZGF0YShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCit7CisJc3RydWN0IGliX3NtcCAqaW5fbWFkICA9IE5VTEw7CisJc3RydWN0IGliX3NtcCAqb3V0X21hZCA9IE5VTEw7CisJaW50IGVyciA9IC1FTk9NRU07CisJdTggc3RhdHVzOworCisJaW5fbWFkICA9IGt6YWxsb2Moc2l6ZW9mICppbl9tYWQsIEdGUF9LRVJORUwpOworCW91dF9tYWQgPSBrbWFsbG9jKHNpemVvZiAqb3V0X21hZCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbl9tYWQgfHwgIW91dF9tYWQpCisJCWdvdG8gb3V0OworCisJaW5pdF9xdWVyeV9tYWQoaW5fbWFkKTsKKwlpbl9tYWQtPmF0dHJfaWQgPSBJQl9TTVBfQVRUUl9OT0RFX0lORk87CisKKwllcnIgPSBtdGhjYV9NQURfSUZDKGRldiwgMSwgMSwKKwkJCSAgICAxLCBOVUxMLCBOVUxMLCBpbl9tYWQsIG91dF9tYWQsCisJCQkgICAgJnN0YXR1cyk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJaWYgKHN0YXR1cykgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1jcHkoJmRldi0+aWJfZGV2Lm5vZGVfZ3VpZCwgb3V0X21hZC0+ZGF0YSArIDEyLCA4KTsKKworb3V0OgorCWtmcmVlKGluX21hZCk7CisJa2ZyZWUob3V0X21hZCk7CisJcmV0dXJuIGVycjsKK30KKwogaW50IG10aGNhX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCiB7CiAJaW50IHJldDsKIAlpbnQgaTsKIAorCXJldCA9IG10aGNhX2luaXRfbm9kZV9kYXRhKGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCXN0cmxjcHkoZGV2LT5pYl9kZXYubmFtZSwgIm10aGNhJWQiLCBJQl9ERVZJQ0VfTkFNRV9NQVgpOwogCWRldi0+aWJfZGV2Lm93bmVyICAgICAgICAgICAgICAgID0gVEhJU19NT0RVTEU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9xcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMKaW5kZXggNzQ1MDU1MC4uZmJhNjA4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMKQEAgLTM4MywxMiArMzgzLDEwIEBACiAJCQkJW1VDXSAgPSAoSUJfUVBfQ1VSX1NUQVRFICAgICAgICAgICAgIHwKIAkJCQkJIElCX1FQX0FMVF9QQVRIICAgICAgICAgICAgICB8CiAJCQkJCSBJQl9RUF9BQ0NFU1NfRkxBR1MgICAgICAgICAgfAotCQkJCQkgSUJfUVBfUEtFWV9JTkRFWCAgICAgICAgICAgIHwKIAkJCQkJIElCX1FQX1BBVEhfTUlHX1NUQVRFKSwKIAkJCQlbUkNdICA9IChJQl9RUF9DVVJfU1RBVEUgICAgICAgICAgICAgfAogCQkJCQkgSUJfUVBfQUxUX1BBVEggICAgICAgICAgICAgIHwKIAkJCQkJIElCX1FQX0FDQ0VTU19GTEFHUyAgICAgICAgICB8Ci0JCQkJCSBJQl9RUF9QS0VZX0lOREVYICAgICAgICAgICAgfAogCQkJCQkgSUJfUVBfTUlOX1JOUl9USU1FUiAgICAgICAgIHwKIAkJCQkJIElCX1FQX1BBVEhfTUlHX1NUQVRFKSwKIAkJCQlbTUxYXSA9IChJQl9RUF9DVVJfU1RBVEUgICAgICAgICAgICAgfApAQCAtNDc2LDkgKzQ3NCw4IEBACiAJCQkub3B0X3BhcmFtID0gewogCQkJCVtVRF0gID0gKElCX1FQX0NVUl9TVEFURSAgICAgICAgICAgICB8CiAJCQkJCSBJQl9RUF9RS0VZKSwKLQkJCQlbVUNdICA9IElCX1FQX0NVUl9TVEFURSwKLQkJCQlbUkNdICA9IChJQl9RUF9DVVJfU1RBVEUgICAgICAgICAgICAgfAotCQkJCQkgSUJfUVBfTUlOX1JOUl9USU1FUiksCisJCQkJW1VDXSAgPSAoSUJfUVBfQ1VSX1NUQVRFICAgICAgICAgICAgIHwKKwkJCQkJIElCX1FQX0FDQ0VTU19GTEFHUyksCiAJCQkJW01MWF0gPSAoSUJfUVBfQ1VSX1NUQVRFICAgICAgICAgICAgIHwKIAkJCQkJIElCX1FQX1FLRVkpLAogCQkJfQpAQCAtNTIyLDYgKzUxOSw1NSBAQAogCQltdGhjYV93YXJuKGRldiwgIklOSVRfSUIgcmV0dXJuZWQgc3RhdHVzICUwMnguXG4iLCBzdGF0dXMpOwogfQogCitzdGF0aWMgX19iZTMyIGdldF9od19hY2Nlc3NfZmxhZ3Moc3RydWN0IG10aGNhX3FwICpxcCwgc3RydWN0IGliX3FwX2F0dHIgKmF0dHIsCisJCQkJICBpbnQgYXR0cl9tYXNrKQoreworCXU4IGRlc3RfcmRfYXRvbWljOworCXUzMiBhY2Nlc3NfZmxhZ3M7CisJdTMyIGh3X2FjY2Vzc19mbGFncyA9IDA7CisKKwlpZiAoYXR0cl9tYXNrICYgSUJfUVBfTUFYX0RFU1RfUkRfQVRPTUlDKQorCQlkZXN0X3JkX2F0b21pYyA9IGF0dHItPm1heF9kZXN0X3JkX2F0b21pYzsKKwllbHNlCisJCWRlc3RfcmRfYXRvbWljID0gcXAtPnJlc3BfZGVwdGg7CisKKwlpZiAoYXR0cl9tYXNrICYgSUJfUVBfQUNDRVNTX0ZMQUdTKQorCQlhY2Nlc3NfZmxhZ3MgPSBhdHRyLT5xcF9hY2Nlc3NfZmxhZ3M7CisJZWxzZQorCQlhY2Nlc3NfZmxhZ3MgPSBxcC0+YXRvbWljX3JkX2VuOworCisJaWYgKCFkZXN0X3JkX2F0b21pYykKKwkJYWNjZXNzX2ZsYWdzICY9IElCX0FDQ0VTU19SRU1PVEVfV1JJVEU7CisKKwlpZiAoYWNjZXNzX2ZsYWdzICYgSUJfQUNDRVNTX1JFTU9URV9SRUFEKQorCQlod19hY2Nlc3NfZmxhZ3MgfD0gTVRIQ0FfUVBfQklUX1JSRTsKKwlpZiAoYWNjZXNzX2ZsYWdzICYgSUJfQUNDRVNTX1JFTU9URV9BVE9NSUMpCisJCWh3X2FjY2Vzc19mbGFncyB8PSBNVEhDQV9RUF9CSVRfUkFFOworCWlmIChhY2Nlc3NfZmxhZ3MgJiBJQl9BQ0NFU1NfUkVNT1RFX1dSSVRFKQorCQlod19hY2Nlc3NfZmxhZ3MgfD0gTVRIQ0FfUVBfQklUX1JXRTsKKworCXJldHVybiBjcHVfdG9fYmUzMihod19hY2Nlc3NfZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBtdGhjYV9wYXRoX3NldChzdHJ1Y3QgaWJfYWhfYXR0ciAqYWgsIHN0cnVjdCBtdGhjYV9xcF9wYXRoICpwYXRoKQoreworCXBhdGgtPmdfbXlsbWMgICAgID0gYWgtPnNyY19wYXRoX2JpdHMgJiAweDdmOworCXBhdGgtPnJsaWQgICAgICAgID0gY3B1X3RvX2JlMTYoYWgtPmRsaWQpOworCXBhdGgtPnN0YXRpY19yYXRlID0gISFhaC0+c3RhdGljX3JhdGU7CisKKwlpZiAoYWgtPmFoX2ZsYWdzICYgSUJfQUhfR1JIKSB7CisJCXBhdGgtPmdfbXlsbWMgICB8PSAxIDw8IDc7CisJCXBhdGgtPm1naWRfaW5kZXggPSBhaC0+Z3JoLnNnaWRfaW5kZXg7CisJCXBhdGgtPmhvcF9saW1pdCAgPSBhaC0+Z3JoLmhvcF9saW1pdDsKKwkJcGF0aC0+c2xfdGNsYXNzX2Zsb3dsYWJlbCA9IAorCQkJY3B1X3RvX2JlMzIoKGFoLT5zbCA8PCAyOCkgICAgICAgICAgICAgICAgfAorCQkJCSAgICAoYWgtPmdyaC50cmFmZmljX2NsYXNzIDw8IDIwKSB8IAorCQkJCSAgICAoYWgtPmdyaC5mbG93X2xhYmVsKSk7CisJCW1lbWNweShwYXRoLT5yZ2lkLCBhaC0+Z3JoLmRnaWQucmF3LCAxNik7CisJfSBlbHNlCisJCXBhdGgtPnNsX3RjbGFzc19mbG93bGFiZWwgPSBjcHVfdG9fYmUzMihhaC0+c2wgPDwgMjgpOworfQorCiBpbnQgbXRoY2FfbW9kaWZ5X3FwKHN0cnVjdCBpYl9xcCAqaWJxcCwgc3RydWN0IGliX3FwX2F0dHIgKmF0dHIsIGludCBhdHRyX21hc2spCiB7CiAJc3RydWN0IG10aGNhX2RldiAqZGV2ID0gdG9fbWRldihpYnFwLT5kZXZpY2UpOwpAQCAtNTkxLDYgKzYzNywyNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoKGF0dHJfbWFzayAmIElCX1FQX1BPUlQpICYmCisJICAgIChhdHRyLT5wb3J0X251bSA9PSAwIHx8IGF0dHItPnBvcnRfbnVtID4gZGV2LT5saW1pdHMubnVtX3BvcnRzKSkgeworCQltdGhjYV9kYmcoZGV2LCAiUG9ydCBudW1iZXIgKCV1KSBpcyBpbnZhbGlkXG4iLCBhdHRyLT5wb3J0X251bSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChhdHRyX21hc2sgJiBJQl9RUF9NQVhfUVBfUkRfQVRPTUlDICYmCisJICAgIGF0dHItPm1heF9yZF9hdG9taWMgPiBkZXYtPmxpbWl0cy5tYXhfcXBfaW5pdF9yZG1hKSB7CisJCW10aGNhX2RiZyhkZXYsICJNYXggcmRtYV9hdG9taWMgYXMgaW5pdGlhdG9yICV1IHRvbyBsYXJnZSAobWF4IGlzICVkKVxuIiwKKwkJCSAgYXR0ci0+bWF4X3JkX2F0b21pYywgZGV2LT5saW1pdHMubWF4X3FwX2luaXRfcmRtYSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChhdHRyX21hc2sgJiBJQl9RUF9NQVhfREVTVF9SRF9BVE9NSUMgJiYKKwkgICAgYXR0ci0+bWF4X2Rlc3RfcmRfYXRvbWljID4gMSA8PCBkZXYtPnFwX3RhYmxlLnJkYl9zaGlmdCkgeworCQltdGhjYV9kYmcoZGV2LCAiTWF4IHJkbWFfYXRvbWljIGFzIHJlc3BvbmRlciAldSB0b28gbGFyZ2UgKG1heCAlZClcbiIsCisJCQkgIGF0dHItPm1heF9kZXN0X3JkX2F0b21pYywgMSA8PCBkZXYtPnFwX3RhYmxlLnJkYl9zaGlmdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCW1haWxib3ggPSBtdGhjYV9hbGxvY19tYWlsYm94KGRldiwgR0ZQX0tFUk5FTCk7CiAJaWYgKElTX0VSUihtYWlsYm94KSkKIAkJcmV0dXJuIFBUUl9FUlIobWFpbGJveCk7CkBAIC02NjUsMjggKzczMSwxNCBAQAogCX0KIAogCWlmIChhdHRyX21hc2sgJiBJQl9RUF9STlJfUkVUUlkpIHsKLQkJcXBfY29udGV4dC0+cHJpX3BhdGgucm5yX3JldHJ5ID0gYXR0ci0+cm5yX3JldHJ5IDw8IDU7Ci0JCXFwX3BhcmFtLT5vcHRfcGFyYW1fbWFzayB8PSBjcHVfdG9fYmUzMihNVEhDQV9RUF9PUFRQQVJfUk5SX1JFVFJZKTsKKwkJcXBfY29udGV4dC0+YWx0X3BhdGgucm5yX3JldHJ5ID0gcXBfY29udGV4dC0+cHJpX3BhdGgucm5yX3JldHJ5ID0KKwkJCWF0dHItPnJucl9yZXRyeSA8PCA1OworCQlxcF9wYXJhbS0+b3B0X3BhcmFtX21hc2sgfD0gY3B1X3RvX2JlMzIoTVRIQ0FfUVBfT1BUUEFSX1JOUl9SRVRSWSB8IAorCQkJCQkJCU1USENBX1FQX09QVFBBUl9BTFRfUk5SX1JFVFJZKTsKIAl9CiAKIAlpZiAoYXR0cl9tYXNrICYgSUJfUVBfQVYpIHsKLQkJcXBfY29udGV4dC0+cHJpX3BhdGguZ19teWxtYyAgICAgPSBhdHRyLT5haF9hdHRyLnNyY19wYXRoX2JpdHMgJiAweDdmOwotCQlxcF9jb250ZXh0LT5wcmlfcGF0aC5ybGlkICAgICAgICA9IGNwdV90b19iZTE2KGF0dHItPmFoX2F0dHIuZGxpZCk7Ci0JCXFwX2NvbnRleHQtPnByaV9wYXRoLnN0YXRpY19yYXRlID0gISFhdHRyLT5haF9hdHRyLnN0YXRpY19yYXRlOwotCQlpZiAoYXR0ci0+YWhfYXR0ci5haF9mbGFncyAmIElCX0FIX0dSSCkgewotCQkJcXBfY29udGV4dC0+cHJpX3BhdGguZ19teWxtYyB8PSAxIDw8IDc7Ci0JCQlxcF9jb250ZXh0LT5wcmlfcGF0aC5tZ2lkX2luZGV4ID0gYXR0ci0+YWhfYXR0ci5ncmguc2dpZF9pbmRleDsKLQkJCXFwX2NvbnRleHQtPnByaV9wYXRoLmhvcF9saW1pdCA9IGF0dHItPmFoX2F0dHIuZ3JoLmhvcF9saW1pdDsKLQkJCXFwX2NvbnRleHQtPnByaV9wYXRoLnNsX3RjbGFzc19mbG93bGFiZWwgPQotCQkJCWNwdV90b19iZTMyKChhdHRyLT5haF9hdHRyLnNsIDw8IDI4KSAgICAgICAgICAgICAgICB8Ci0JCQkJCSAgICAoYXR0ci0+YWhfYXR0ci5ncmgudHJhZmZpY19jbGFzcyA8PCAyMCkgfAotCQkJCQkgICAgKGF0dHItPmFoX2F0dHIuZ3JoLmZsb3dfbGFiZWwpKTsKLQkJCW1lbWNweShxcF9jb250ZXh0LT5wcmlfcGF0aC5yZ2lkLAotCQkJICAgICAgIGF0dHItPmFoX2F0dHIuZ3JoLmRnaWQucmF3LCAxNik7Ci0JCX0gZWxzZSB7Ci0JCQlxcF9jb250ZXh0LT5wcmlfcGF0aC5zbF90Y2xhc3NfZmxvd2xhYmVsID0KLQkJCQljcHVfdG9fYmUzMihhdHRyLT5haF9hdHRyLnNsIDw8IDI4KTsKLQkJfQorCQltdGhjYV9wYXRoX3NldCgmYXR0ci0+YWhfYXR0ciwgJnFwX2NvbnRleHQtPnByaV9wYXRoKTsKIAkJcXBfcGFyYW0tPm9wdF9wYXJhbV9tYXNrIHw9IGNwdV90b19iZTMyKE1USENBX1FQX09QVFBBUl9QUklNQVJZX0FERFJfUEFUSCk7CiAJfQogCkBAIC02OTUsNyArNzQ3LDE5IEBACiAJCXFwX3BhcmFtLT5vcHRfcGFyYW1fbWFzayB8PSBjcHVfdG9fYmUzMihNVEhDQV9RUF9PUFRQQVJfQUNLX1RJTUVPVVQpOwogCX0KIAotCS8qIFhYWCBhbHRfcGF0aCAqLworCWlmIChhdHRyX21hc2sgJiBJQl9RUF9BTFRfUEFUSCkgeworCQlpZiAoYXR0ci0+YWx0X3BvcnRfbnVtID09IDAgfHwgYXR0ci0+YWx0X3BvcnRfbnVtID4gZGV2LT5saW1pdHMubnVtX3BvcnRzKSB7CisJCQltdGhjYV9kYmcoZGV2LCAiQWx0ZXJuYXRlIHBvcnQgbnVtYmVyICgldSkgaXMgaW52YWxpZFxuIiwgCisJCQkJYXR0ci0+YWx0X3BvcnRfbnVtKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJbXRoY2FfcGF0aF9zZXQoJmF0dHItPmFsdF9haF9hdHRyLCAmcXBfY29udGV4dC0+YWx0X3BhdGgpOworCQlxcF9jb250ZXh0LT5hbHRfcGF0aC5wb3J0X3BrZXkgfD0gY3B1X3RvX2JlMzIoYXR0ci0+YWx0X3BrZXlfaW5kZXggfCAKKwkJCQkJCQkgICAgICBhdHRyLT5hbHRfcG9ydF9udW0gPDwgMjQpOworCQlxcF9jb250ZXh0LT5hbHRfcGF0aC5hY2t0byA9IGF0dHItPmFsdF90aW1lb3V0IDw8IDM7CisJCXFwX3BhcmFtLT5vcHRfcGFyYW1fbWFzayB8PSBjcHVfdG9fYmUzMihNVEhDQV9RUF9PUFRQQVJfQUxUX0FERFJfUEFUSCk7CisJfQogCiAJLyogbGVhdmUgcmRkIGFzIDAgKi8KIAlxcF9jb250ZXh0LT5wZCAgICAgICAgID0gY3B1X3RvX2JlMzIodG9fbXBkKGlicXAtPnBkKS0+cGRfbnVtKTsKQEAgLTcwMyw5ICs3NjcsNyBAQAogCXFwX2NvbnRleHQtPndxZV9sa2V5ICAgPSBjcHVfdG9fYmUzMihxcC0+bXIuaWJtci5sa2V5KTsKIAlxcF9jb250ZXh0LT5wYXJhbXMxICAgID0gY3B1X3RvX2JlMzIoKE1USENBX0FDS19SRVFfRlJFUSA8PCAyOCkgfAogCQkJCQkgICAgIChNVEhDQV9GTElHSFRfTElNSVQgPDwgMjQpIHwKLQkJCQkJICAgICBNVEhDQV9RUF9CSVRfU1JFICAgICAgICAgICB8Ci0JCQkJCSAgICAgTVRIQ0FfUVBfQklUX1NXRSAgICAgICAgICAgfAotCQkJCQkgICAgIE1USENBX1FQX0JJVF9TQUUpOworCQkJCQkgICAgIE1USENBX1FQX0JJVF9TV0UpOwogCWlmIChxcC0+c3FfcG9saWN5ID09IElCX1NJR05BTF9BTExfV1IpCiAJCXFwX2NvbnRleHQtPnBhcmFtczEgfD0gY3B1X3RvX2JlMzIoTVRIQ0FfUVBfQklUX1NTQyk7CiAJaWYgKGF0dHJfbWFzayAmIElCX1FQX1JFVFJZX0NOVCkgewpAQCAtNzE0LDkgKzc3NiwxMyBAQAogCX0KIAogCWlmIChhdHRyX21hc2sgJiBJQl9RUF9NQVhfUVBfUkRfQVRPTUlDKSB7Ci0JCXFwX2NvbnRleHQtPnBhcmFtczEgfD0gY3B1X3RvX2JlMzIobWluKGF0dHItPm1heF9yZF9hdG9taWMgPwotCQkJCQkJICAgICAgIGZmcyhhdHRyLT5tYXhfcmRfYXRvbWljKSAtIDEgOiAwLAotCQkJCQkJICAgICAgIDcpIDw8IDIxKTsKKwkJaWYgKGF0dHItPm1heF9yZF9hdG9taWMpIHsKKwkJCXFwX2NvbnRleHQtPnBhcmFtczEgfD0KKwkJCQljcHVfdG9fYmUzMihNVEhDQV9RUF9CSVRfU1JFIHwKKwkJCQkJICAgIE1USENBX1FQX0JJVF9TQUUpOworCQkJcXBfY29udGV4dC0+cGFyYW1zMSB8PQorCQkJCWNwdV90b19iZTMyKGZscyhhdHRyLT5tYXhfcmRfYXRvbWljIC0gMSkgPDwgMjEpOworCQl9CiAJCXFwX3BhcmFtLT5vcHRfcGFyYW1fbWFzayB8PSBjcHVfdG9fYmUzMihNVEhDQV9RUF9PUFRQQVJfU1JBX01BWCk7CiAJfQogCkBAIC03MjksNzEgKzc5NSwxOSBAQAogCQlxcF9jb250ZXh0LT5zbmRfZGJfaW5kZXggICA9IGNwdV90b19iZTMyKHFwLT5zcS5kYl9pbmRleCk7CiAJfQogCi0JaWYgKGF0dHJfbWFzayAmIElCX1FQX0FDQ0VTU19GTEFHUykgewotCQlxcF9jb250ZXh0LT5wYXJhbXMyIHw9Ci0JCQljcHVfdG9fYmUzMihhdHRyLT5xcF9hY2Nlc3NfZmxhZ3MgJiBJQl9BQ0NFU1NfUkVNT1RFX1dSSVRFID8KLQkJCQkgICAgTVRIQ0FfUVBfQklUX1JXRSA6IDApOwotCi0JCS8qCi0JCSAqIE9ubHkgZW5hYmxlIFJETUEgcmVhZHMgYW5kIGF0b21pY3MgaWYgd2UgaGF2ZQotCQkgKiByZXNwb25kZXIgcmVzb3VyY2VzIHNldCB0byBhIG5vbi16ZXJvIHZhbHVlLgotCQkgKi8KLQkJaWYgKHFwLT5yZXNwX2RlcHRoKSB7CisJaWYgKGF0dHJfbWFzayAmIElCX1FQX01BWF9ERVNUX1JEX0FUT01JQykgeworCQlpZiAoYXR0ci0+bWF4X2Rlc3RfcmRfYXRvbWljKQogCQkJcXBfY29udGV4dC0+cGFyYW1zMiB8PQotCQkJCWNwdV90b19iZTMyKGF0dHItPnFwX2FjY2Vzc19mbGFncyAmIElCX0FDQ0VTU19SRU1PVEVfUkVBRCA/Ci0JCQkJCSAgICBNVEhDQV9RUF9CSVRfUlJFIDogMCk7Ci0JCQlxcF9jb250ZXh0LT5wYXJhbXMyIHw9Ci0JCQkJY3B1X3RvX2JlMzIoYXR0ci0+cXBfYWNjZXNzX2ZsYWdzICYgSUJfQUNDRVNTX1JFTU9URV9BVE9NSUMgPwotCQkJCQkgICAgTVRIQ0FfUVBfQklUX1JBRSA6IDApOwotCQl9CisJCQkJY3B1X3RvX2JlMzIoZmxzKGF0dHItPm1heF9kZXN0X3JkX2F0b21pYyAtIDEpIDw8IDIxKTsKIAorCQlxcF9wYXJhbS0+b3B0X3BhcmFtX21hc2sgfD0gY3B1X3RvX2JlMzIoTVRIQ0FfUVBfT1BUUEFSX1JSQV9NQVgpOworCX0KKworCWlmIChhdHRyX21hc2sgJiAoSUJfUVBfQUNDRVNTX0ZMQUdTIHwgSUJfUVBfTUFYX0RFU1RfUkRfQVRPTUlDKSkgeworCQlxcF9jb250ZXh0LT5wYXJhbXMyICAgICAgfD0gZ2V0X2h3X2FjY2Vzc19mbGFncyhxcCwgYXR0ciwgYXR0cl9tYXNrKTsKIAkJcXBfcGFyYW0tPm9wdF9wYXJhbV9tYXNrIHw9IGNwdV90b19iZTMyKE1USENBX1FQX09QVFBBUl9SV0UgfAogCQkJCQkJCU1USENBX1FQX09QVFBBUl9SUkUgfAogCQkJCQkJCU1USENBX1FQX09QVFBBUl9SQUUpOwotCi0JCXFwLT5hdG9taWNfcmRfZW4gPSBhdHRyLT5xcF9hY2Nlc3NfZmxhZ3M7Ci0JfQotCi0JaWYgKGF0dHJfbWFzayAmIElCX1FQX01BWF9ERVNUX1JEX0FUT01JQykgewotCQl1OCBycmFfbWF4OwotCi0JCWlmIChxcC0+cmVzcF9kZXB0aCAmJiAhYXR0ci0+bWF4X2Rlc3RfcmRfYXRvbWljKSB7Ci0JCQkvKgotCQkJICogTG93ZXJpbmcgb3VyIHJlc3BvbmRlciByZXNvdXJjZXMgdG8gemVyby4KLQkJCSAqIFR1cm4gb2ZmIHJlYWRzIFJETUEgYW5kIGF0b21pY3MgYXMgcmVzcG9uZGVyLgotCQkJICogKFJSRS9SQUUgaW4gcGFyYW1zMiBhbHJlYWR5IHplcm8pCi0JCQkgKi8KLQkJCXFwX3BhcmFtLT5vcHRfcGFyYW1fbWFzayB8PSBjcHVfdG9fYmUzMihNVEhDQV9RUF9PUFRQQVJfUlJFIHwKLQkJCQkJCQkJTVRIQ0FfUVBfT1BUUEFSX1JBRSk7Ci0JCX0KLQotCQlpZiAoIXFwLT5yZXNwX2RlcHRoICYmIGF0dHItPm1heF9kZXN0X3JkX2F0b21pYykgewotCQkJLyoKLQkJCSAqIEluY3JlYXNpbmcgb3VyIHJlc3BvbmRlciByZXNvdXJjZXMgZnJvbQotCQkJICogemVyby4gIFR1cm4gb24gUkRNQSByZWFkcyBhbmQgYXRvbWljcyBhcwotCQkJICogYXBwcm9wcmlhdGUuCi0JCQkgKi8KLQkJCXFwX2NvbnRleHQtPnBhcmFtczIgfD0KLQkJCQljcHVfdG9fYmUzMihxcC0+YXRvbWljX3JkX2VuICYgSUJfQUNDRVNTX1JFTU9URV9SRUFEID8KLQkJCQkJICAgIE1USENBX1FQX0JJVF9SUkUgOiAwKTsKLQkJCXFwX2NvbnRleHQtPnBhcmFtczIgfD0KLQkJCQljcHVfdG9fYmUzMihxcC0+YXRvbWljX3JkX2VuICYgSUJfQUNDRVNTX1JFTU9URV9BVE9NSUMgPwotCQkJCQkgICAgTVRIQ0FfUVBfQklUX1JBRSA6IDApOwotCi0JCQlxcF9wYXJhbS0+b3B0X3BhcmFtX21hc2sgfD0gY3B1X3RvX2JlMzIoTVRIQ0FfUVBfT1BUUEFSX1JSRSB8Ci0JCQkJCQkJCU1USENBX1FQX09QVFBBUl9SQUUpOwotCQl9Ci0KLQkJZm9yIChycmFfbWF4ID0gMDsKLQkJICAgICAxIDw8IHJyYV9tYXggPCBhdHRyLT5tYXhfZGVzdF9yZF9hdG9taWMgJiYKLQkJCSAgICAgcnJhX21heCA8IGRldi0+cXBfdGFibGUucmRiX3NoaWZ0OwotCQkgICAgICsrcnJhX21heCkKLQkJCTsgLyogbm90aGluZyAqLwotCi0JCXFwX2NvbnRleHQtPnBhcmFtczIgICAgICB8PSBjcHVfdG9fYmUzMihycmFfbWF4IDw8IDIxKTsKLQkJcXBfcGFyYW0tPm9wdF9wYXJhbV9tYXNrIHw9IGNwdV90b19iZTMyKE1USENBX1FQX09QVFBBUl9SUkFfTUFYKTsKLQotCQlxcC0+cmVzcF9kZXB0aCA9IGF0dHItPm1heF9kZXN0X3JkX2F0b21pYzsKIAl9CiAKIAlxcF9jb250ZXh0LT5wYXJhbXMyIHw9IGNwdV90b19iZTMyKE1USENBX1FQX0JJVF9SU0MpOwpAQCAtODM1LDggKzg0OSwxMyBAQAogCQllcnIgPSAtRUlOVkFMOwogCX0KIAotCWlmICghZXJyKQorCWlmICghZXJyKSB7CiAJCXFwLT5zdGF0ZSA9IG5ld19zdGF0ZTsKKwkJaWYgKGF0dHJfbWFzayAmIElCX1FQX0FDQ0VTU19GTEFHUykKKwkJCXFwLT5hdG9taWNfcmRfZW4gPSBhdHRyLT5xcF9hY2Nlc3NfZmxhZ3M7CisJCWlmIChhdHRyX21hc2sgJiBJQl9RUF9NQVhfREVTVF9SRF9BVE9NSUMpCisJCQlxcC0+cmVzcF9kZXB0aCA9IGF0dHItPm1heF9kZXN0X3JkX2F0b21pYzsKKwl9CiAKIAltdGhjYV9mcmVlX21haWxib3goZGV2LCBtYWlsYm94KTsKIApAQCAtODg1LDE4ICs5MDQsMTMgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBtdGhjYV9hZGp1c3RfcXBfY2FwcyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsCi0JCQkJIHN0cnVjdCBtdGhjYV9wZCAqcGQsCi0JCQkJIHN0cnVjdCBtdGhjYV9xcCAqcXApCitzdGF0aWMgaW50IG10aGNhX21heF9kYXRhX3NpemUoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfcXAgKnFwLCBpbnQgZGVzY19zeikKIHsKLQlpbnQgbWF4X2RhdGFfc2l6ZTsKLQogCS8qCiAJICogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHNpemUgb2YgV1FFIHMvZyBzZWdtZW50cywgZXhjbHVkaW5nCiAJICogdGhlIG5leHQgc2VnbWVudCBhbmQgb3RoZXIgbm9uLWRhdGEgc2VnbWVudHMuCiAJICovCi0JbWF4X2RhdGFfc2l6ZSA9IG1pbihkZXYtPmxpbWl0cy5tYXhfZGVzY19zeiwgMSA8PCBxcC0+c3Eud3FlX3NoaWZ0KSAtCi0JCXNpemVvZiAoc3RydWN0IG10aGNhX25leHRfc2VnKTsKKwlpbnQgbWF4X2RhdGFfc2l6ZSA9IGRlc2Nfc3ogLSBzaXplb2YgKHN0cnVjdCBtdGhjYV9uZXh0X3NlZyk7CiAKIAlzd2l0Y2ggKHFwLT50cmFuc3BvcnQpIHsKIAljYXNlIE1MWDoKQEAgLTkxNSwxMSArOTI5LDI0IEBACiAJCWJyZWFrOwogCX0KIAorCXJldHVybiBtYXhfZGF0YV9zaXplOworfQorCitzdGF0aWMgaW5saW5lIGludCBtdGhjYV9tYXhfaW5saW5lX2RhdGEoc3RydWN0IG10aGNhX3BkICpwZCwgaW50IG1heF9kYXRhX3NpemUpCit7CiAJLyogV2UgZG9uJ3Qgc3VwcG9ydCBpbmxpbmUgZGF0YSBmb3Iga2VybmVsIFFQcyAoeWV0KS4gKi8KLQlpZiAoIXBkLT5pYnBkLnVvYmplY3QpCi0JCXFwLT5tYXhfaW5saW5lX2RhdGEgPSAwOwotICAgICAgICBlbHNlCi0JCXFwLT5tYXhfaW5saW5lX2RhdGEgPSBtYXhfZGF0YV9zaXplIC0gTVRIQ0FfSU5MSU5FX0hFQURFUl9TSVpFOworCXJldHVybiBwZC0+aWJwZC51b2JqZWN0ID8gbWF4X2RhdGFfc2l6ZSAtIE1USENBX0lOTElORV9IRUFERVJfU0laRSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIG10aGNhX2FkanVzdF9xcF9jYXBzKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKKwkJCQkgc3RydWN0IG10aGNhX3BkICpwZCwKKwkJCQkgc3RydWN0IG10aGNhX3FwICpxcCkKK3sKKwlpbnQgbWF4X2RhdGFfc2l6ZSA9IG10aGNhX21heF9kYXRhX3NpemUoZGV2LCBxcCwKKwkJCQkJCW1pbihkZXYtPmxpbWl0cy5tYXhfZGVzY19zeiwKKwkJCQkJCSAgICAxIDw8IHFwLT5zcS53cWVfc2hpZnQpKTsKKworCXFwLT5tYXhfaW5saW5lX2RhdGEgPSBtdGhjYV9tYXhfaW5saW5lX2RhdGEocGQsIG1heF9kYXRhX3NpemUpOwogCiAJcXAtPnNxLm1heF9ncyA9IG1pbl90KGludCwgZGV2LT5saW1pdHMubWF4X3NnLAogCQkJICAgICAgbWF4X2RhdGFfc2l6ZSAvIHNpemVvZiAoc3RydWN0IG10aGNhX2RhdGFfc2VnKSk7CkBAIC0xMTg2LDEzICsxMjEzLDIzIEBACiB9CiAKIHN0YXRpYyBpbnQgbXRoY2Ffc2V0X3FwX3NpemUoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgaWJfcXBfY2FwICpjYXAsCi0JCQkgICAgIHN0cnVjdCBtdGhjYV9xcCAqcXApCisJCQkgICAgIHN0cnVjdCBtdGhjYV9wZCAqcGQsIHN0cnVjdCBtdGhjYV9xcCAqcXApCiB7CisJaW50IG1heF9kYXRhX3NpemUgPSBtdGhjYV9tYXhfZGF0YV9zaXplKGRldiwgcXAsIGRldi0+bGltaXRzLm1heF9kZXNjX3N6KTsKKwogCS8qIFNhbml0eSBjaGVjayBRUCBzaXplIGJlZm9yZSBwcm9jZWVkaW5nICovCi0JaWYgKGNhcC0+bWF4X3NlbmRfd3IgID4gZGV2LT5saW1pdHMubWF4X3dxZXMgfHwKLQkgICAgY2FwLT5tYXhfcmVjdl93ciAgPiBkZXYtPmxpbWl0cy5tYXhfd3FlcyB8fAotCSAgICBjYXAtPm1heF9zZW5kX3NnZSA+IGRldi0+bGltaXRzLm1heF9zZyAgIHx8Ci0JICAgIGNhcC0+bWF4X3JlY3Zfc2dlID4gZGV2LT5saW1pdHMubWF4X3NnKQorCWlmIChjYXAtPm1heF9zZW5kX3dyICAJID4gZGV2LT5saW1pdHMubWF4X3dxZXMgfHwKKwkgICAgY2FwLT5tYXhfcmVjdl93ciAgCSA+IGRldi0+bGltaXRzLm1heF93cWVzIHx8CisJICAgIGNhcC0+bWF4X3NlbmRfc2dlIAkgPiBkZXYtPmxpbWl0cy5tYXhfc2cgICB8fAorCSAgICBjYXAtPm1heF9yZWN2X3NnZSAJID4gZGV2LT5saW1pdHMubWF4X3NnICAgfHwKKwkgICAgY2FwLT5tYXhfaW5saW5lX2RhdGEgPiBtdGhjYV9tYXhfaW5saW5lX2RhdGEocGQsIG1heF9kYXRhX3NpemUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogRm9yIE1MWCB0cmFuc3BvcnQgd2UgbmVlZCAyIGV4dHJhIFMvRyBlbnRyaWVzOgorCSAqIG9uZSBmb3IgdGhlIGhlYWRlciBhbmQgb25lIGZvciB0aGUgY2hlY2tzdW0gYXQgdGhlIGVuZAorCSAqLworCWlmIChxcC0+dHJhbnNwb3J0ID09IE1MWCAmJiBjYXAtPm1heF9yZWN2X3NnZSArIDIgPiBkZXYtPmxpbWl0cy5tYXhfc2cpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKG10aGNhX2lzX21lbWZyZWUoZGV2KSkgewpAQCAtMTIxMSwxNCArMTI0OCw2IEBACiAJCQkJICAgIE1USENBX0lOTElORV9DSFVOS19TSVpFKSAvCiAJCQkgICAgICBzaXplb2YgKHN0cnVjdCBtdGhjYV9kYXRhX3NlZykpOwogCi0JLyoKLQkgKiBGb3IgTUxYIHRyYW5zcG9ydCB3ZSBuZWVkIDIgZXh0cmEgUy9HIGVudHJpZXM6Ci0JICogb25lIGZvciB0aGUgaGVhZGVyIGFuZCBvbmUgZm9yIHRoZSBjaGVja3N1bSBhdCB0aGUgZW5kCi0JICovCi0JaWYgKChxcC0+dHJhbnNwb3J0ID09IE1MWCAmJiBxcC0+c3EubWF4X2dzICsgMiA+IGRldi0+bGltaXRzLm1heF9zZykgfHwKLQkgICAgcXAtPnNxLm1heF9ncyA+IGRldi0+bGltaXRzLm1heF9zZyB8fCBxcC0+cnEubWF4X2dzID4gZGV2LT5saW1pdHMubWF4X3NnKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCXJldHVybiAwOwogfQogCkBAIC0xMjMzLDcgKzEyNjIsNyBAQAogewogCWludCBlcnI7CiAKLQllcnIgPSBtdGhjYV9zZXRfcXBfc2l6ZShkZXYsIGNhcCwgcXApOworCWVyciA9IG10aGNhX3NldF9xcF9zaXplKGRldiwgY2FwLCBwZCwgcXApOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTEyNzYsNyArMTMwNSw3IEBACiAJdTMyIG1xcG4gPSBxcG4gKiAyICsgZGV2LT5xcF90YWJsZS5zcXBfc3RhcnQgKyBwb3J0IC0gMTsKIAlpbnQgZXJyOwogCi0JZXJyID0gbXRoY2Ffc2V0X3FwX3NpemUoZGV2LCBjYXAsICZzcXAtPnFwKTsKKwllcnIgPSBtdGhjYV9zZXRfcXBfc2l6ZShkZXYsIGNhcCwgcGQsICZzcXAtPnFwKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xNDA1LDcgKzE0MzQsNyBAQAogCXUxNiBwa2V5OwogCiAJaWJfdWRfaGVhZGVyX2luaXQoMjU2LCAvKiBhc3N1bWUgYSBNQUQgKi8KLQkJCSAgc3FwLT51ZF9oZWFkZXIuZ3JoX3ByZXNlbnQsCisJCQkgIG10aGNhX2FoX2dyaF9wcmVzZW50KHRvX21haCh3ci0+d3IudWQuYWgpKSwKIAkJCSAgJnNxcC0+dWRfaGVhZGVyKTsKIAogCWVyciA9IG10aGNhX3JlYWRfYWgoZGV2LCB0b19tYWgod3ItPndyLnVkLmFoKSwgJnNxcC0+dWRfaGVhZGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9zcnEuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9zcnEuYwppbmRleCBmN2QyMzQyLi5lN2UxNTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2Ffc3JxLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3NycS5jCkBAIC0yMDEsNyArMjAxLDcgQEAKIAlpZiAobXRoY2FfaXNfbWVtZnJlZShkZXYpKQogCQlzcnEtPm1heCA9IHJvdW5kdXBfcG93X29mX3R3byhzcnEtPm1heCArIDEpOwogCi0JZHMgPSBtaW4oNjRVTCwKKwlkcyA9IG1heCg2NFVMLAogCQkgcm91bmR1cF9wb3dfb2ZfdHdvKHNpemVvZiAoc3RydWN0IG10aGNhX25leHRfc2VnKSArCiAJCQkJICAgIHNycS0+bWF4X2dzICogc2l6ZW9mIChzdHJ1Y3QgbXRoY2FfZGF0YV9zZWcpKSk7CiAJc3JxLT53cWVfc2hpZnQgPSBsb25nX2xvZzIoZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYi5oIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYi5oCmluZGV4IDk5MjNhMTUuLmUwYTU0MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWIuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liLmgKQEAgLTQ1LDExICs0NSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9pbmZpbmliYW5kLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPG5ldC9uZWlnaGJvdXIuaD4KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAKICNpbmNsdWRlIDxyZG1hL2liX3ZlcmJzLmg+CiAjaW5jbHVkZSA8cmRtYS9pYl9wYWNrLmg+CkBAIC0xMjMsOCArMTIzLDggQEAKIAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzdHJ1Y3Qgc2VtYXBob3JlIG1jYXN0X211dGV4OwotCXN0cnVjdCBzZW1hcGhvcmUgdmxhbl9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXggbWNhc3RfbXV0ZXg7CisJc3RydWN0IG11dGV4IHZsYW5fbXV0ZXg7CiAKIAlzdHJ1Y3QgcmJfcm9vdCAgcGF0aF90cmVlOwogCXN0cnVjdCBsaXN0X2hlYWQgcGF0aF9saXN0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9pYi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9pYi5jCmluZGV4IDIzODg1ODAuLjg2YmNkZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2liLmMKQEAgLTUyLDcgKzUyLDcgQEAKIAogI2RlZmluZQlJUE9JQl9PUF9SRUNWCSgxdWwgPDwgMzEpCiAKLXN0YXRpYyBERUNMQVJFX01VVEVYKHBrZXlfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgocGtleV9tdXRleCk7CiAKIHN0cnVjdCBpcG9pYl9haCAqaXBvaWJfY3JlYXRlX2FoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJIHN0cnVjdCBpYl9wZCAqcGQsIHN0cnVjdCBpYl9haF9hdHRyICphdHRyKQpAQCAtNDQ1LDI1ICs0NDUsMTYgQEAKIAogCS8qIFNodXRkb3duIHRoZSBQX0tleSB0aHJlYWQgaWYgc3RpbGwgYWN0aXZlICovCiAJaWYgKCF0ZXN0X2JpdChJUE9JQl9QS0VZX0FTU0lHTkVELCAmcHJpdi0+ZmxhZ3MpKSB7Ci0JCWRvd24oJnBrZXlfc2VtKTsKKwkJbXV0ZXhfbG9jaygmcGtleV9tdXRleCk7CiAJCXNldF9iaXQoSVBPSUJfUEtFWV9TVE9QLCAmcHJpdi0+ZmxhZ3MpOwogCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5wa2V5X3Rhc2spOwotCQl1cCgmcGtleV9zZW0pOworCQltdXRleF91bmxvY2soJnBrZXlfbXV0ZXgpOwogCQlmbHVzaF93b3JrcXVldWUoaXBvaWJfd29ya3F1ZXVlKTsKIAl9CiAKIAlpcG9pYl9tY2FzdF9zdG9wX3RocmVhZChkZXYsIDEpOwotCi0JLyoKLQkgKiBGbHVzaCB0aGUgbXVsdGljYXN0IGdyb3VwcyBmaXJzdCBzbyB3ZSBzdG9wIGFueSBtdWx0aWNhc3Qgam9pbnMuIFRoZQotCSAqIGNvbXBsZXRpb24gdGhyZWFkIG1heSBoYXZlIGFscmVhZHkgZGllZCBhbmQgd2UgbWF5IGRlYWRsb2NrIHdhaXRpbmcKLQkgKiBmb3IgdGhlIGNvbXBsZXRpb24gdGhyZWFkIHRvIGZpbmlzaCBzb21lIG11bHRpY2FzdCBqb2lucy4KLQkgKi8KIAlpcG9pYl9tY2FzdF9kZXZfZmx1c2goZGV2KTsKIAotCS8qIERlbGV0ZSBicm9hZGNhc3QgYW5kIGxvY2FsIGFkZHJlc3NlcyBzaW5jZSB0aGV5IHdpbGwgYmUgcmVjcmVhdGVkICovCi0JaXBvaWJfbWNhc3RfZGV2X2Rvd24oZGV2KTsKLQogCWlwb2liX2ZsdXNoX3BhdGhzKGRldik7CiAKIAlyZXR1cm4gMDsKQEAgLTYwOCwxMyArNTk5LDEzIEBACiAJaWYgKHRlc3RfYml0KElQT0lCX0ZMQUdfQURNSU5fVVAsICZwcml2LT5mbGFncykpCiAJCWlwb2liX2liX2Rldl91cChkZXYpOwogCi0JZG93bigmcHJpdi0+dmxhbl9tdXRleCk7CisJbXV0ZXhfbG9jaygmcHJpdi0+dmxhbl9tdXRleCk7CiAKIAkvKiBGbHVzaCBhbnkgY2hpbGQgaW50ZXJmYWNlcyB0b28gKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNwcml2LCAmcHJpdi0+Y2hpbGRfaW50ZnMsIGxpc3QpCiAJCWlwb2liX2liX2Rldl9mbHVzaCgmY3ByaXYtPmRldik7CiAKLQl1cCgmcHJpdi0+dmxhbl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT52bGFuX211dGV4KTsKIH0KIAogdm9pZCBpcG9pYl9pYl9kZXZfY2xlYW51cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtNjI0LDkgKzYxNSw3IEBACiAJaXBvaWJfZGJnKHByaXYsICJjbGVhbmluZyB1cCBpYl9kZXZcbiIpOwogCiAJaXBvaWJfbWNhc3Rfc3RvcF90aHJlYWQoZGV2LCAxKTsKLQotCS8qIERlbGV0ZSB0aGUgYnJvYWRjYXN0IGFkZHJlc3MgYW5kIHRoZSBsb2NhbCBhZGRyZXNzICovCi0JaXBvaWJfbWNhc3RfZGV2X2Rvd24oZGV2KTsKKwlpcG9pYl9tY2FzdF9kZXZfZmx1c2goZGV2KTsKIAogCWlwb2liX3RyYW5zcG9ydF9kZXZfY2xlYW51cChkZXYpOwogfQpAQCAtNjYyLDEyICs2NTEsMTIgQEAKIAlpZiAodGVzdF9iaXQoSVBPSUJfUEtFWV9BU1NJR05FRCwgJnByaXYtPmZsYWdzKSkKIAkJaXBvaWJfb3BlbihkZXYpOwogCWVsc2UgewotCQlkb3duKCZwa2V5X3NlbSk7CisJCW11dGV4X2xvY2soJnBrZXlfbXV0ZXgpOwogCQlpZiAoIXRlc3RfYml0KElQT0lCX1BLRVlfU1RPUCwgJnByaXYtPmZsYWdzKSkKIAkJCXF1ZXVlX2RlbGF5ZWRfd29yayhpcG9pYl93b3JrcXVldWUsCiAJCQkJCSAgICZwcml2LT5wa2V5X3Rhc2ssCiAJCQkJCSAgIEhaKTsKLQkJdXAoJnBrZXlfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZwa2V5X211dGV4KTsKIAl9CiB9CiAKQEAgLTY4MSwxMiArNjcwLDEyIEBACiAKIAkvKiBQX0tleSB2YWx1ZSBub3QgYXNzaWduZWQgeWV0IC0gc3RhcnQgcG9sbGluZyAqLwogCWlmICghdGVzdF9iaXQoSVBPSUJfUEtFWV9BU1NJR05FRCwgJnByaXYtPmZsYWdzKSkgewotCQlkb3duKCZwa2V5X3NlbSk7CisJCW11dGV4X2xvY2soJnBrZXlfbXV0ZXgpOwogCQljbGVhcl9iaXQoSVBPSUJfUEtFWV9TVE9QLCAmcHJpdi0+ZmxhZ3MpOwogCQlxdWV1ZV9kZWxheWVkX3dvcmsoaXBvaWJfd29ya3F1ZXVlLAogCQkJCSAgICZwcml2LT5wa2V5X3Rhc2ssCiAJCQkJICAgSFopOwotCQl1cCgmcGtleV9zZW0pOworCQltdXRleF91bmxvY2soJnBrZXlfbXV0ZXgpOwogCQlyZXR1cm4gMTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKaW5kZXggNzgwMDA5Yy4uZmQzZjVjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCQlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKmNwcml2OwogCiAJCS8qIEJyaW5nIHVwIGFueSBjaGlsZCBpbnRlcmZhY2VzIHRvbyAqLwotCQlkb3duKCZwcml2LT52bGFuX211dGV4KTsKKwkJbXV0ZXhfbG9jaygmcHJpdi0+dmxhbl9tdXRleCk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoY3ByaXYsICZwcml2LT5jaGlsZF9pbnRmcywgbGlzdCkgewogCQkJaW50IGZsYWdzOwogCkBAIC0xMTUsNyArMTE1LDcgQEAKIAogCQkJZGV2X2NoYW5nZV9mbGFncyhjcHJpdi0+ZGV2LCBmbGFncyB8IElGRl9VUCk7CiAJCX0KLQkJdXAoJnByaXYtPnZsYW5fbXV0ZXgpOworCQltdXRleF91bmxvY2soJnByaXYtPnZsYW5fbXV0ZXgpOwogCX0KIAogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CkBAIC0xNDAsNyArMTQwLDcgQEAKIAkJc3RydWN0IGlwb2liX2Rldl9wcml2ICpjcHJpdjsKIAogCQkvKiBCcmluZyBkb3duIGFueSBjaGlsZCBpbnRlcmZhY2VzIHRvbyAqLwotCQlkb3duKCZwcml2LT52bGFuX211dGV4KTsKKwkJbXV0ZXhfbG9jaygmcHJpdi0+dmxhbl9tdXRleCk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoY3ByaXYsICZwcml2LT5jaGlsZF9pbnRmcywgbGlzdCkgewogCQkJaW50IGZsYWdzOwogCkBAIC0xNTAsNyArMTUwLDcgQEAKIAogCQkJZGV2X2NoYW5nZV9mbGFncyhjcHJpdi0+ZGV2LCBmbGFncyAmIH5JRkZfVVApOwogCQl9Ci0JCXVwKCZwcml2LT52bGFuX211dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZwcml2LT52bGFuX211dGV4KTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTg5Miw4ICs4OTIsOCBAQAogCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmcHJpdi0+dHhfbG9jayk7CiAKLQlpbml0X01VVEVYKCZwcml2LT5tY2FzdF9tdXRleCk7Ci0JaW5pdF9NVVRFWCgmcHJpdi0+dmxhbl9tdXRleCk7CisJbXV0ZXhfaW5pdCgmcHJpdi0+bWNhc3RfbXV0ZXgpOworCW11dGV4X2luaXQoJnByaXYtPnZsYW5fbXV0ZXgpOwogCiAJSU5JVF9MSVNUX0hFQUQoJnByaXYtPnBhdGhfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJnByaXYtPmNoaWxkX2ludGZzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbXVsdGljYXN0LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX211bHRpY2FzdC5jCmluZGV4IGVkMGMyZWEuLjk4MDM5ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbXVsdGljYXN0LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tdWx0aWNhc3QuYwpAQCAtNTUsNyArNTUsNyBAQAogCQkgIkVuYWJsZSBtdWx0aWNhc3QgZGVidWcgdHJhY2luZyBpZiA+IDAiKTsKICNlbmRpZgogCi1zdGF0aWMgREVDTEFSRV9NVVRFWChtY2FzdF9tdXRleCk7CitzdGF0aWMgREVGSU5FX01VVEVYKG1jYXN0X211dGV4KTsKIAogLyogVXNlZCBmb3IgYWxsIG11bHRpY2FzdCBqb2lucyAoYnJvYWRjYXN0LCBJUHY0IG1jYXN0IGFuZCBJUHY2IG1jYXN0KSAqLwogc3RydWN0IGlwb2liX21jYXN0IHsKQEAgLTk3LDggKzk3LDYgQEAKIAlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpcG9pYl9uZWlnaCAqbmVpZ2gsICp0bXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlMSVNUX0hFQUQoYWhfbGlzdCk7Ci0Jc3RydWN0IGlwb2liX2FoICphaCwgKnRhaDsKIAogCWlwb2liX2RiZ19tY2FzdChuZXRkZXZfcHJpdihkZXYpLAogCQkJImRlbGV0aW5nIG11bHRpY2FzdCBncm91cCAiIElQT0lCX0dJRF9GTVQgIlxuIiwKQEAgLTEwNyw4ICsxMDUsMTQgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5laWdoLCB0bXAsICZtY2FzdC0+bmVpZ2hfbGlzdCwgbGlzdCkgeworCQkvKgorCQkgKiBJdCdzIHNhZmUgdG8gY2FsbCBpcG9pYl9wdXRfYWgoKSBpbnNpZGUgcHJpdi0+bG9jaworCQkgKiBoZXJlLCBiZWNhdXNlIHdlIGtub3cgdGhhdCBtY2FzdC0+YWggd2lsbCBhbHdheXMKKwkJICogaG9sZCBvbmUgbW9yZSByZWZlcmVuY2UsIHNvIGlwb2liX3B1dF9haCgpIHdpbGwKKwkJICogbmV2ZXIgZG8gbW9yZSB0aGFuIGRlY3JlbWVudCB0aGUgcmVmIGNvdW50LgorCQkgKi8KIAkJaWYgKG5laWdoLT5haCkKLQkJCWxpc3RfYWRkX3RhaWwoJm5laWdoLT5haC0+bGlzdCwgJmFoX2xpc3QpOworCQkJaXBvaWJfcHV0X2FoKG5laWdoLT5haCk7CiAJCSp0b19pcG9pYl9uZWlnaChuZWlnaC0+bmVpZ2hib3VyKSA9IE5VTEw7CiAJCW5laWdoLT5uZWlnaGJvdXItPm9wcy0+ZGVzdHJ1Y3RvciA9IE5VTEw7CiAJCWtmcmVlKG5laWdoKTsKQEAgLTExNiw5ICsxMjAsNiBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGFoLCB0YWgsICZhaF9saXN0LCBsaXN0KQotCQlpcG9pYl9wdXRfYWgoYWgpOwotCiAJaWYgKG1jYXN0LT5haCkKIAkJaXBvaWJfcHV0X2FoKG1jYXN0LT5haCk7CiAKQEAgLTM4NCwxMCArMzg1LDEwIEBACiAKIAlpZiAoIXN0YXR1cyAmJiAhaXBvaWJfbWNhc3Rfam9pbl9maW5pc2gobWNhc3QsIG1jbWVtYmVyKSkgewogCQltY2FzdC0+YmFja29mZiA9IDE7Ci0JCWRvd24oJm1jYXN0X211dGV4KTsKKwkJbXV0ZXhfbG9jaygmbWNhc3RfbXV0ZXgpOwogCQlpZiAodGVzdF9iaXQoSVBPSUJfTUNBU1RfUlVOLCAmcHJpdi0+ZmxhZ3MpKQogCQkJcXVldWVfd29yayhpcG9pYl93b3JrcXVldWUsICZwcml2LT5tY2FzdF90YXNrKTsKLQkJdXAoJm1jYXN0X211dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZtY2FzdF9tdXRleCk7CiAJCWNvbXBsZXRlKCZtY2FzdC0+ZG9uZSk7CiAJCXJldHVybjsKIAl9CkBAIC00MTcsNyArNDE4LDcgQEAKIAogCW1jYXN0LT5xdWVyeSA9IE5VTEw7CiAKLQlkb3duKCZtY2FzdF9tdXRleCk7CisJbXV0ZXhfbG9jaygmbWNhc3RfbXV0ZXgpOwogCWlmICh0ZXN0X2JpdChJUE9JQl9NQ0FTVF9SVU4sICZwcml2LT5mbGFncykpIHsKIAkJaWYgKHN0YXR1cyA9PSAtRVRJTUVET1VUKQogCQkJcXVldWVfd29yayhpcG9pYl93b3JrcXVldWUsICZwcml2LT5tY2FzdF90YXNrKTsKQEAgLTQyNiw3ICs0MjcsNyBAQAogCQkJCQkgICBtY2FzdC0+YmFja29mZiAqIEhaKTsKIAl9IGVsc2UKIAkJY29tcGxldGUoJm1jYXN0LT5kb25lKTsKLQl1cCgmbWNhc3RfbXV0ZXgpOworCW11dGV4X3VubG9jaygmbWNhc3RfbXV0ZXgpOwogCiAJcmV0dXJuOwogfQpAQCAtNDgxLDEyICs0ODIsMTIgQEAKIAkJaWYgKG1jYXN0LT5iYWNrb2ZmID4gSVBPSUJfTUFYX0JBQ0tPRkZfU0VDT05EUykKIAkJCW1jYXN0LT5iYWNrb2ZmID0gSVBPSUJfTUFYX0JBQ0tPRkZfU0VDT05EUzsKIAotCQlkb3duKCZtY2FzdF9tdXRleCk7CisJCW11dGV4X2xvY2soJm1jYXN0X211dGV4KTsKIAkJaWYgKHRlc3RfYml0KElQT0lCX01DQVNUX1JVTiwgJnByaXYtPmZsYWdzKSkKIAkJCXF1ZXVlX2RlbGF5ZWRfd29yayhpcG9pYl93b3JrcXVldWUsCiAJCQkJCSAgICZwcml2LT5tY2FzdF90YXNrLAogCQkJCQkgICBtY2FzdC0+YmFja29mZiAqIEhaKTsKLQkJdXAoJm1jYXN0X211dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZtY2FzdF9tdXRleCk7CiAJfSBlbHNlCiAJCW1jYXN0LT5xdWVyeV9pZCA9IHJldDsKIH0KQEAgLTUxOSwxMSArNTIwLDExIEBACiAJCXByaXYtPmJyb2FkY2FzdCA9IGlwb2liX21jYXN0X2FsbG9jKGRldiwgMSk7CiAJCWlmICghcHJpdi0+YnJvYWRjYXN0KSB7CiAJCQlpcG9pYl93YXJuKHByaXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgYnJvYWRjYXN0IGdyb3VwXG4iKTsKLQkJCWRvd24oJm1jYXN0X211dGV4KTsKKwkJCW11dGV4X2xvY2soJm1jYXN0X211dGV4KTsKIAkJCWlmICh0ZXN0X2JpdChJUE9JQl9NQ0FTVF9SVU4sICZwcml2LT5mbGFncykpCiAJCQkJcXVldWVfZGVsYXllZF93b3JrKGlwb2liX3dvcmtxdWV1ZSwKIAkJCQkJCSAgICZwcml2LT5tY2FzdF90YXNrLCBIWik7Ci0JCQl1cCgmbWNhc3RfbXV0ZXgpOworCQkJbXV0ZXhfdW5sb2NrKCZtY2FzdF9tdXRleCk7CiAJCQlyZXR1cm47CiAJCX0KIApAQCAtNTc5LDEwICs1ODAsMTAgQEAKIAogCWlwb2liX2RiZ19tY2FzdChwcml2LCAic3RhcnRpbmcgbXVsdGljYXN0IHRocmVhZFxuIik7CiAKLQlkb3duKCZtY2FzdF9tdXRleCk7CisJbXV0ZXhfbG9jaygmbWNhc3RfbXV0ZXgpOwogCWlmICghdGVzdF9hbmRfc2V0X2JpdChJUE9JQl9NQ0FTVF9SVU4sICZwcml2LT5mbGFncykpCiAJCXF1ZXVlX3dvcmsoaXBvaWJfd29ya3F1ZXVlLCAmcHJpdi0+bWNhc3RfdGFzayk7Ci0JdXAoJm1jYXN0X211dGV4KTsKKwltdXRleF91bmxvY2soJm1jYXN0X211dGV4KTsKIAogCXJldHVybiAwOwogfQpAQCAtNTk0LDEwICs1OTUsMTAgQEAKIAogCWlwb2liX2RiZ19tY2FzdChwcml2LCAic3RvcHBpbmcgbXVsdGljYXN0IHRocmVhZFxuIik7CiAKLQlkb3duKCZtY2FzdF9tdXRleCk7CisJbXV0ZXhfbG9jaygmbWNhc3RfbXV0ZXgpOwogCWNsZWFyX2JpdChJUE9JQl9NQ0FTVF9SVU4sICZwcml2LT5mbGFncyk7CiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+bWNhc3RfdGFzayk7Ci0JdXAoJm1jYXN0X211dGV4KTsKKwltdXRleF91bmxvY2soJm1jYXN0X211dGV4KTsKIAogCWlmIChmbHVzaCkKIAkJZmx1c2hfd29ya3F1ZXVlKGlwb2liX3dvcmtxdWV1ZSk7CkBAIC03NDEsNDggKzc0MiwyMyBAQAogewogCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJTElTVF9IRUFEKHJlbW92ZV9saXN0KTsKLQlzdHJ1Y3QgaXBvaWJfbWNhc3QgKm1jYXN0LCAqdG1jYXN0LCAqbm1jYXN0OworCXN0cnVjdCBpcG9pYl9tY2FzdCAqbWNhc3QsICp0bWNhc3Q7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlwb2liX2RiZ19tY2FzdChwcml2LCAiZmx1c2hpbmcgbXVsdGljYXN0IGxpc3RcbiIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtY2FzdCwgdG1jYXN0LCAmcHJpdi0+bXVsdGljYXN0X2xpc3QsIGxpc3QpIHsKLQkJbm1jYXN0ID0gaXBvaWJfbWNhc3RfYWxsb2MoZGV2LCAwKTsKLQkJaWYgKG5tY2FzdCkgewotCQkJbm1jYXN0LT5mbGFncyA9Ci0JCQkJbWNhc3QtPmZsYWdzICYgKDEgPDwgSVBPSUJfTUNBU1RfRkxBR19TRU5ET05MWSk7Ci0KLQkJCW5tY2FzdC0+bWNtZW1iZXIubWdpZCA9IG1jYXN0LT5tY21lbWJlci5tZ2lkOwotCi0JCQkvKiBBZGQgdGhlIG5ldyBncm91cCBpbiBiZWZvcmUgdGhlIHRvLWJlLWRlc3Ryb3llZCBncm91cCAqLwotCQkJbGlzdF9hZGRfdGFpbCgmbm1jYXN0LT5saXN0LCAmbWNhc3QtPmxpc3QpOwotCQkJbGlzdF9kZWxfaW5pdCgmbWNhc3QtPmxpc3QpOwotCi0JCQlyYl9yZXBsYWNlX25vZGUoJm1jYXN0LT5yYl9ub2RlLCAmbm1jYXN0LT5yYl9ub2RlLAotCQkJCQkmcHJpdi0+bXVsdGljYXN0X3RyZWUpOwotCi0JCQlsaXN0X2FkZF90YWlsKCZtY2FzdC0+bGlzdCwgJnJlbW92ZV9saXN0KTsKLQkJfSBlbHNlIHsKLQkJCWlwb2liX3dhcm4ocHJpdiwgImNvdWxkIG5vdCByZWFsbG9jYXRlIG11bHRpY2FzdCBncm91cCAiCi0JCQkJICAgSVBPSUJfR0lEX0ZNVCAiXG4iLAotCQkJCSAgIElQT0lCX0dJRF9BUkcobWNhc3QtPm1jbWVtYmVyLm1naWQpKTsKLQkJfQorCQlsaXN0X2RlbCgmbWNhc3QtPmxpc3QpOworCQlyYl9lcmFzZSgmbWNhc3QtPnJiX25vZGUsICZwcml2LT5tdWx0aWNhc3RfdHJlZSk7CisJCWxpc3RfYWRkX3RhaWwoJm1jYXN0LT5saXN0LCAmcmVtb3ZlX2xpc3QpOwogCX0KIAogCWlmIChwcml2LT5icm9hZGNhc3QpIHsKLQkJbm1jYXN0ID0gaXBvaWJfbWNhc3RfYWxsb2MoZGV2LCAwKTsKLQkJaWYgKG5tY2FzdCkgewotCQkJbm1jYXN0LT5tY21lbWJlci5tZ2lkID0gcHJpdi0+YnJvYWRjYXN0LT5tY21lbWJlci5tZ2lkOwotCi0JCQlyYl9yZXBsYWNlX25vZGUoJnByaXYtPmJyb2FkY2FzdC0+cmJfbm9kZSwKLQkJCQkJJm5tY2FzdC0+cmJfbm9kZSwKLQkJCQkJJnByaXYtPm11bHRpY2FzdF90cmVlKTsKLQotCQkJbGlzdF9hZGRfdGFpbCgmcHJpdi0+YnJvYWRjYXN0LT5saXN0LCAmcmVtb3ZlX2xpc3QpOwotCQl9Ci0KLQkJcHJpdi0+YnJvYWRjYXN0ID0gbm1jYXN0OworIAkJcmJfZXJhc2UoJnByaXYtPmJyb2FkY2FzdC0+cmJfbm9kZSwgJnByaXYtPm11bHRpY2FzdF90cmVlKTsKKwkJbGlzdF9hZGRfdGFpbCgmcHJpdi0+YnJvYWRjYXN0LT5saXN0LCAmcmVtb3ZlX2xpc3QpOworCQlwcml2LT5icm9hZGNhc3QgPSBOVUxMOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKQEAgLTc5MywyNCArNzY5LDYgQEAKIAl9CiB9CiAKLXZvaWQgaXBvaWJfbWNhc3RfZGV2X2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBEZWxldGUgYnJvYWRjYXN0IHNpbmNlIGl0IHdpbGwgYmUgcmVjcmVhdGVkICovCi0JaWYgKHByaXYtPmJyb2FkY2FzdCkgewotCQlpcG9pYl9kYmdfbWNhc3QocHJpdiwgImRlbGV0aW5nIGJyb2FkY2FzdCBncm91cFxuIik7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJcmJfZXJhc2UoJnByaXYtPmJyb2FkY2FzdC0+cmJfbm9kZSwgJnByaXYtPm11bHRpY2FzdF90cmVlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQlpcG9pYl9tY2FzdF9sZWF2ZShkZXYsIHByaXYtPmJyb2FkY2FzdCk7Ci0JCWlwb2liX21jYXN0X2ZyZWUocHJpdi0+YnJvYWRjYXN0KTsKLQkJcHJpdi0+YnJvYWRjYXN0ID0gTlVMTDsKLQl9Ci19Ci0KIHZvaWQgaXBvaWJfbWNhc3RfcmVzdGFydF90YXNrKHZvaWQgKmRldl9wdHIpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9wdHI7CkBAIC04MjQsNyArNzgyLDggQEAKIAogCWlwb2liX21jYXN0X3N0b3BfdGhyZWFkKGRldiwgMCk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnhtaXRfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CiAKIAkvKgogCSAqIFVuZm9ydHVuYXRlbHksIHRoZSBuZXR3b3JraW5nIGNvcmUgb25seSBnaXZlcyB1cyBhIGxpc3Qgb2YgYWxsIG9mCkBAIC04OTYsNyArODU1LDkgQEAKIAkJCWxpc3RfYWRkX3RhaWwoJm1jYXN0LT5saXN0LCAmcmVtb3ZlX2xpc3QpOwogCQl9CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnhtaXRfbG9jaywgZmxhZ3MpOwogCiAJLyogV2UgaGF2ZSB0byBjYW5jZWwgb3V0c2lkZSBvZiB0aGUgc3BpbmxvY2sgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobWNhc3QsIHRtY2FzdCwgJnJlbW92ZV9saXN0LCBsaXN0KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX3ZlcmJzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX3ZlcmJzLmMKaW5kZXggZTgyOWUxMC4uZmFhZjEwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl92ZXJicy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfdmVyYnMuYwpAQCAtNjUsOSArNjUsOSBAQAogCX0KIAogCS8qIGF0dGFjaCBRUCB0byBtdWx0aWNhc3QgZ3JvdXAgKi8KLQlkb3duKCZwcml2LT5tY2FzdF9tdXRleCk7CisJbXV0ZXhfbG9jaygmcHJpdi0+bWNhc3RfbXV0ZXgpOwogCXJldCA9IGliX2F0dGFjaF9tY2FzdChwcml2LT5xcCwgbWdpZCwgbWxpZCk7Ci0JdXAoJnByaXYtPm1jYXN0X211dGV4KTsKKwltdXRleF91bmxvY2soJnByaXYtPm1jYXN0X211dGV4KTsKIAlpZiAocmV0KQogCQlpcG9pYl93YXJuKHByaXYsICJmYWlsZWQgdG8gYXR0YWNoIHRvIG11bHRpY2FzdCBncm91cCwgcmV0ID0gJWRcbiIsIHJldCk7CiAKQEAgLTgxLDkgKzgxLDkgQEAKIAlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCByZXQ7CiAKLQlkb3duKCZwcml2LT5tY2FzdF9tdXRleCk7CisJbXV0ZXhfbG9jaygmcHJpdi0+bWNhc3RfbXV0ZXgpOwogCXJldCA9IGliX2RldGFjaF9tY2FzdChwcml2LT5xcCwgbWdpZCwgbWxpZCk7Ci0JdXAoJnByaXYtPm1jYXN0X211dGV4KTsKKwltdXRleF91bmxvY2soJnByaXYtPm1jYXN0X211dGV4KTsKIAlpZiAocmV0KQogCQlpcG9pYl93YXJuKHByaXYsICJpYl9kZXRhY2hfbWNhc3QgZmFpbGVkIChyZXN1bHQgPSAlZClcbiIsIHJldCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfdmxhbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl92bGFuLmMKaW5kZXggZDI4MGIzNC4uNGNhMTc1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl92bGFuLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl92bGFuLmMKQEAgLTYzLDcgKzYzLDcgQEAKIAogCXBwcml2ID0gbmV0ZGV2X3ByaXYocGRldik7CiAKLQlkb3duKCZwcHJpdi0+dmxhbl9tdXRleCk7CisJbXV0ZXhfbG9jaygmcHByaXYtPnZsYW5fbXV0ZXgpOwogCiAJLyoKIAkgKiBGaXJzdCBlbnN1cmUgdGhpcyBpc24ndCBhIGR1cGxpY2F0ZS4gV2UgY2hlY2sgdGhlIHBhcmVudCBkZXZpY2UgYW5kCkBAIC0xMjQsNyArMTI0LDcgQEAKIAogCWxpc3RfYWRkX3RhaWwoJnByaXYtPmxpc3QsICZwcHJpdi0+Y2hpbGRfaW50ZnMpOwogCi0JdXAoJnBwcml2LT52bGFuX211dGV4KTsKKwltdXRleF91bmxvY2soJnBwcml2LT52bGFuX211dGV4KTsKIAogCXJldHVybiAwOwogCkBAIC0xMzksNyArMTM5LDcgQEAKIAlmcmVlX25ldGRldihwcml2LT5kZXYpOwogCiBlcnI6Ci0JdXAoJnBwcml2LT52bGFuX211dGV4KTsKKwltdXRleF91bmxvY2soJnBwcml2LT52bGFuX211dGV4KTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0xNTMsNyArMTUzLDcgQEAKIAogCXBwcml2ID0gbmV0ZGV2X3ByaXYocGRldik7CiAKLQlkb3duKCZwcHJpdi0+dmxhbl9tdXRleCk7CisJbXV0ZXhfbG9jaygmcHByaXYtPnZsYW5fbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwcml2LCB0cHJpdiwgJnBwcml2LT5jaGlsZF9pbnRmcywgbGlzdCkgewogCQlpZiAocHJpdi0+cGtleSA9PSBwa2V5KSB7CiAJCQl1bnJlZ2lzdGVyX25ldGRldihwcml2LT5kZXYpOwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQl1cCgmcHByaXYtPnZsYW5fbXV0ZXgpOworCW11dGV4X3VubG9jaygmcHByaXYtPnZsYW5fbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwL2liX3NycC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvaWJfc3JwLmMKaW5kZXggZWU5ZmUyMi4uMzEyMDdlNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwL2liX3NycC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwL2liX3NycC5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCkBAIC0xNTE1LDggKzE1MTYsNyBAQAogCiBzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIocG9ydCwgU19JUlVHTywgc2hvd19wb3J0LCBOVUxMKTsKIAotc3RhdGljIHN0cnVjdCBzcnBfaG9zdCAqc3JwX2FkZF9wb3J0KHN0cnVjdCBpYl9kZXZpY2UgKmRldmljZSwKLQkJCQkgICAgIF9fYmU2NCBub2RlX2d1aWQsIHU4IHBvcnQpCitzdGF0aWMgc3RydWN0IHNycF9ob3N0ICpzcnBfYWRkX3BvcnQoc3RydWN0IGliX2RldmljZSAqZGV2aWNlLCB1OCBwb3J0KQogewogCXN0cnVjdCBzcnBfaG9zdCAqaG9zdDsKIApAQCAtMTUzMSw3ICsxNTMxLDcgQEAKIAlob3N0LT5wb3J0ID0gcG9ydDsKIAogCWhvc3QtPmluaXRpYXRvcl9wb3J0X2lkWzddID0gcG9ydDsKLQltZW1jcHkoaG9zdC0+aW5pdGlhdG9yX3BvcnRfaWQgKyA4LCAmbm9kZV9ndWlkLCA4KTsKKwltZW1jcHkoaG9zdC0+aW5pdGlhdG9yX3BvcnRfaWQgKyA4LCAmZGV2aWNlLT5ub2RlX2d1aWQsIDgpOwogCiAJaG9zdC0+cGQgICA9IGliX2FsbG9jX3BkKGRldmljZSk7CiAJaWYgKElTX0VSUihob3N0LT5wZCkpCkBAIC0xNTc5LDIyICsxNTc5LDExIEBACiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqZGV2X2xpc3Q7CiAJc3RydWN0IHNycF9ob3N0ICpob3N0OwotCXN0cnVjdCBpYl9kZXZpY2VfYXR0ciAqZGV2X2F0dHI7CiAJaW50IHMsIGUsIHA7CiAKLQlkZXZfYXR0ciA9IGttYWxsb2Moc2l6ZW9mICpkZXZfYXR0ciwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXZfYXR0cikKLQkJcmV0dXJuOwotCi0JaWYgKGliX3F1ZXJ5X2RldmljZShkZXZpY2UsIGRldl9hdHRyKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiQ291bGRuJ3QgcXVlcnkgbm9kZSBHVUlEIGZvciAlcy5cbiIsCi0JCSAgICAgICBkZXZpY2UtPm5hbWUpOwotCQlnb3RvIG91dDsKLQl9Ci0KIAlkZXZfbGlzdCA9IGttYWxsb2Moc2l6ZW9mICpkZXZfbGlzdCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXZfbGlzdCkKLQkJZ290byBvdXQ7CisJCXJldHVybjsKIAogCUlOSVRfTElTVF9IRUFEKGRldl9saXN0KTsKIApAQCAtMTYwNywxNSArMTU5NiwxMiBAQAogCX0KIAogCWZvciAocCA9IHM7IHAgPD0gZTsgKytwKSB7Ci0JCWhvc3QgPSBzcnBfYWRkX3BvcnQoZGV2aWNlLCBkZXZfYXR0ci0+bm9kZV9ndWlkLCBwKTsKKwkJaG9zdCA9IHNycF9hZGRfcG9ydChkZXZpY2UsIHApOwogCQlpZiAoaG9zdCkKIAkJCWxpc3RfYWRkX3RhaWwoJmhvc3QtPmxpc3QsIGRldl9saXN0KTsKIAl9CiAKIAlpYl9zZXRfY2xpZW50X2RhdGEoZGV2aWNlLCAmc3JwX2NsaWVudCwgZGV2X2xpc3QpOwotCi1vdXQ6Ci0Ja2ZyZWUoZGV2X2F0dHIpOwogfQogCiBzdGF0aWMgdm9pZCBzcnBfcmVtb3ZlX29uZShzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2V2ZGV2LmMgYi9kcml2ZXJzL2lucHV0L2V2ZGV2LmMKaW5kZXggYTFlNjYwZS4uNzQ1OTc5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9ldmRldi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvZXZkZXYuYwpAQCAtMTQ2LDYgKzE0Niw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCisKIHN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQgewogCXN0cnVjdCBjb21wYXRfdGltZXZhbCB0aW1lOwogCV9fdTE2IHR5cGU7CkBAIC0xNTMsMTAgKzE1NCwxMiBAQAogCV9fczMyIHZhbHVlOwogfTsKIAorLyogTm90ZSB0byB0aGUgYXV0aG9yIG9mIHRoaXMgY29kZTogZGlkIGl0IGV2ZXIgb2NjdXIgdG8KKyAgIHlvdSB3aHkgdGhlIGlmZGVmcyBhcmUgbmVlZGVkPyBUaGluayBhYm91dCBpdCBhZ2Fpbi4gLUFLICovCiAjaWZkZWYgQ09ORklHX1g4Nl82NAotIyAgZGVmaW5lIENPTVBBVF9URVNUIHRlc3RfdGhyZWFkX2ZsYWcoVElGX0lBMzIpCisjICBkZWZpbmUgQ09NUEFUX1RFU1QgaXNfY29tcGF0X3Rhc2soKQogI2VsaWYgZGVmaW5lZChDT05GSUdfSUE2NCkKLSMgIGRlZmluZSBDT01QQVRfVEVTVCBJU19JQTMyX1BST0NFU1MoaWE2NF90YXNrX3JlZ3MoY3VycmVudCkpCisjICBkZWZpbmUgQ09NUEFUX1RFU1QgSVNfSUEzMl9QUk9DRVNTKHRhc2tfcHRfcmVncyhjdXJyZW50KSkKICNlbGlmIGRlZmluZWQoQ09ORklHX1MzOTApCiAjICBkZWZpbmUgQ09NUEFUX1RFU1QgdGVzdF90aHJlYWRfZmxhZyhUSUZfMzFCSVQpCiAjZWxpZiBkZWZpbmVkKENPTkZJR19NSVBTKQpAQCAtMTY1LDIyICsxNjgsODAgQEAKICMgIGRlZmluZSBDT01QQVRfVEVTVCB0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCkKICNlbmRpZgogCi1zdGF0aWMgc3NpemVfdCBldmRldl93cml0ZV9jb21wYXQoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCitzdGF0aWMgaW5saW5lIHNpemVfdCBldmRldl9ldmVudF9zaXplKHZvaWQpCiB7Ci0Jc3RydWN0IGV2ZGV2X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGlucHV0X2V2ZW50X2NvbXBhdCBldmVudDsKLQlpbnQgcmV0dmFsID0gMDsKKwlyZXR1cm4gQ09NUEFUX1RFU1QgPworCQlzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50X2NvbXBhdCkgOiBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KTsKK30KIAotCXdoaWxlIChyZXR2YWwgPCBjb3VudCkgewotCQlpZiAoY29weV9mcm9tX3VzZXIoJmV2ZW50LCBidWZmZXIgKyByZXR2YWwsIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0KSkpCitzdGF0aWMgaW50IGV2ZGV2X2V2ZW50X2Zyb21fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzdHJ1Y3QgaW5wdXRfZXZlbnQgKmV2ZW50KQoreworCWlmIChDT01QQVRfVEVTVCkgeworCQlzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0IGNvbXBhdF9ldmVudDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbXBhdF9ldmVudCwgYnVmZmVyLCBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50X2NvbXBhdCkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlucHV0X2V2ZW50KGxpc3QtPmV2ZGV2LT5oYW5kbGUuZGV2LCBldmVudC50eXBlLCBldmVudC5jb2RlLCBldmVudC52YWx1ZSk7Ci0JCXJldHZhbCArPSBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50X2NvbXBhdCk7CisKKwkJZXZlbnQtPnRpbWUudHZfc2VjID0gY29tcGF0X2V2ZW50LnRpbWUudHZfc2VjOworCQlldmVudC0+dGltZS50dl91c2VjID0gY29tcGF0X2V2ZW50LnRpbWUudHZfdXNlYzsKKwkJZXZlbnQtPnR5cGUgPSBjb21wYXRfZXZlbnQudHlwZTsKKwkJZXZlbnQtPmNvZGUgPSBjb21wYXRfZXZlbnQuY29kZTsKKwkJZXZlbnQtPnZhbHVlID0gY29tcGF0X2V2ZW50LnZhbHVlOworCisJfSBlbHNlIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGV2ZW50LCBidWZmZXIsIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCXJldHVybiByZXR2YWw7CisJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKKworc3RhdGljIGludCBldmRldl9ldmVudF90b191c2VyKGNoYXIgX191c2VyICpidWZmZXIsIGNvbnN0IHN0cnVjdCBpbnB1dF9ldmVudCAqZXZlbnQpCit7CisJaWYgKENPTVBBVF9URVNUKSB7CisJCXN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQgY29tcGF0X2V2ZW50OworCisJCWNvbXBhdF9ldmVudC50aW1lLnR2X3NlYyA9IGV2ZW50LT50aW1lLnR2X3NlYzsKKwkJY29tcGF0X2V2ZW50LnRpbWUudHZfdXNlYyA9IGV2ZW50LT50aW1lLnR2X3VzZWM7CisJCWNvbXBhdF9ldmVudC50eXBlID0gZXZlbnQtPnR5cGU7CisJCWNvbXBhdF9ldmVudC5jb2RlID0gZXZlbnQtPmNvZGU7CisJCWNvbXBhdF9ldmVudC52YWx1ZSA9IGV2ZW50LT52YWx1ZTsKKworCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgJmNvbXBhdF9ldmVudCwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJfSBlbHNlIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGV2ZW50LCBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSBzaXplX3QgZXZkZXZfZXZlbnRfc2l6ZSh2b2lkKQoreworCXJldHVybiBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KTsKK30KKworc3RhdGljIGludCBldmRldl9ldmVudF9mcm9tX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc3RydWN0IGlucHV0X2V2ZW50ICpldmVudCkKK3sKKwlpZiAoY29weV9mcm9tX3VzZXIoZXZlbnQsIGJ1ZmZlciwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV2ZGV2X2V2ZW50X3RvX3VzZXIoY2hhciBfX3VzZXIgKmJ1ZmZlciwgY29uc3Qgc3RydWN0IGlucHV0X2V2ZW50ICpldmVudCkKK3sKKwlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgZXZlbnQsIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19DT01QQVQgKi8KIAogc3RhdGljIHNzaXplX3QgZXZkZXZfd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CkBAIC0xODgsNzUgKzI0OSwyNiBAQAogCXN0cnVjdCBpbnB1dF9ldmVudCBldmVudDsKIAlpbnQgcmV0dmFsID0gMDsKIAotCWlmICghbGlzdC0+ZXZkZXYtPmV4aXN0KSByZXR1cm4gLUVOT0RFVjsKLQotI2lmZGVmIENPTkZJR19DT01QQVQKLQlpZiAoQ09NUEFUX1RFU1QpCi0JCXJldHVybiBldmRldl93cml0ZV9jb21wYXQoZmlsZSwgYnVmZmVyLCBjb3VudCwgcHBvcyk7Ci0jZW5kaWYKLQotCXdoaWxlIChyZXR2YWwgPCBjb3VudCkgewotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmZXZlbnQsIGJ1ZmZlciArIHJldHZhbCwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlucHV0X2V2ZW50KGxpc3QtPmV2ZGV2LT5oYW5kbGUuZGV2LCBldmVudC50eXBlLCBldmVudC5jb2RlLCBldmVudC52YWx1ZSk7Ci0JCXJldHZhbCArPSBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KTsKLQl9Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotc3RhdGljIHNzaXplX3QgZXZkZXZfcmVhZF9jb21wYXQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGV2ZGV2X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJldHZhbDsKLQotCWlmIChjb3VudCA8IHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAobGlzdC0+aGVhZCA9PSBsaXN0LT50YWlsICYmIGxpc3QtPmV2ZGV2LT5leGlzdCAmJiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCXJldHZhbCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShsaXN0LT5ldmRldi0+d2FpdCwKLQkJbGlzdC0+aGVhZCAhPSBsaXN0LT50YWlsIHx8ICghbGlzdC0+ZXZkZXYtPmV4aXN0KSk7Ci0KLQlpZiAocmV0dmFsKQotCQlyZXR1cm4gcmV0dmFsOwotCiAJaWYgKCFsaXN0LT5ldmRldi0+ZXhpc3QpCiAJCXJldHVybiAtRU5PREVWOwogCi0Jd2hpbGUgKGxpc3QtPmhlYWQgIT0gbGlzdC0+dGFpbCAmJiByZXR2YWwgKyBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50X2NvbXBhdCkgPD0gY291bnQpIHsKLQkJc3RydWN0IGlucHV0X2V2ZW50ICpldmVudCA9IChzdHJ1Y3QgaW5wdXRfZXZlbnQgKikgbGlzdC0+YnVmZmVyICsgbGlzdC0+dGFpbDsKLQkJc3RydWN0IGlucHV0X2V2ZW50X2NvbXBhdCBldmVudF9jb21wYXQ7Ci0JCWV2ZW50X2NvbXBhdC50aW1lLnR2X3NlYyA9IGV2ZW50LT50aW1lLnR2X3NlYzsKLQkJZXZlbnRfY29tcGF0LnRpbWUudHZfdXNlYyA9IGV2ZW50LT50aW1lLnR2X3VzZWM7Ci0JCWV2ZW50X2NvbXBhdC50eXBlID0gZXZlbnQtPnR5cGU7Ci0JCWV2ZW50X2NvbXBhdC5jb2RlID0gZXZlbnQtPmNvZGU7Ci0JCWV2ZW50X2NvbXBhdC52YWx1ZSA9IGV2ZW50LT52YWx1ZTsKKwl3aGlsZSAocmV0dmFsIDwgY291bnQpIHsKIAotCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciArIHJldHZhbCwgJmV2ZW50X2NvbXBhdCwKLQkJCXNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0KSkpIHJldHVybiAtRUZBVUxUOwotCQlsaXN0LT50YWlsID0gKGxpc3QtPnRhaWwgKyAxKSAmIChFVkRFVl9CVUZGRVJfU0laRSAtIDEpOwotCQlyZXR2YWwgKz0gc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQpOworCQlpZiAoZXZkZXZfZXZlbnRfZnJvbV91c2VyKGJ1ZmZlciArIHJldHZhbCwgJmV2ZW50KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpbnB1dF9ldmVudChsaXN0LT5ldmRldi0+aGFuZGxlLmRldiwgZXZlbnQudHlwZSwgZXZlbnQuY29kZSwgZXZlbnQudmFsdWUpOworCQlyZXR2YWwgKz0gZXZkZXZfZXZlbnRfc2l6ZSgpOwogCX0KIAogCXJldHVybiByZXR2YWw7CiB9Ci0jZW5kaWYKIAogc3RhdGljIHNzaXplX3QgZXZkZXZfcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgZXZkZXZfbGlzdCAqbGlzdCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlpbnQgcmV0dmFsOwogCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotCWlmIChDT01QQVRfVEVTVCkKLQkJcmV0dXJuIGV2ZGV2X3JlYWRfY29tcGF0KGZpbGUsIGJ1ZmZlciwgY291bnQsIHBwb3MpOwotI2VuZGlmCi0KLQlpZiAoY291bnQgPCBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KSkKKwlpZiAoY291bnQgPCBldmRldl9ldmVudF9zaXplKCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGxpc3QtPmhlYWQgPT0gbGlzdC0+dGFpbCAmJiBsaXN0LT5ldmRldi0+ZXhpc3QgJiYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKQEAgLTI3MSwxMSArMjgzLDE1IEBACiAJaWYgKCFsaXN0LT5ldmRldi0+ZXhpc3QpCiAJCXJldHVybiAtRU5PREVWOwogCi0Jd2hpbGUgKGxpc3QtPmhlYWQgIT0gbGlzdC0+dGFpbCAmJiByZXR2YWwgKyBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KSA8PSBjb3VudCkgewotCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciArIHJldHZhbCwgbGlzdC0+YnVmZmVyICsgbGlzdC0+dGFpbCwKLQkJCXNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpKSkgcmV0dXJuIC1FRkFVTFQ7CisJd2hpbGUgKGxpc3QtPmhlYWQgIT0gbGlzdC0+dGFpbCAmJiByZXR2YWwgKyBldmRldl9ldmVudF9zaXplKCkgPD0gY291bnQpIHsKKworCQlzdHJ1Y3QgaW5wdXRfZXZlbnQgKmV2ZW50ID0gKHN0cnVjdCBpbnB1dF9ldmVudCAqKSBsaXN0LT5idWZmZXIgKyBsaXN0LT50YWlsOworCisJCWlmIChldmRldl9ldmVudF90b191c2VyKGJ1ZmZlciArIHJldHZhbCwgZXZlbnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKIAkJbGlzdC0+dGFpbCA9IChsaXN0LT50YWlsICsgMSkgJiAoRVZERVZfQlVGRkVSX1NJWkUgLSAxKTsKLQkJcmV0dmFsICs9IHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpOworCQlyZXR2YWwgKz0gZXZkZXZfZXZlbnRfc2l6ZSgpOwogCX0KIAogCXJldHVybiByZXR2YWw7CkBAIC0yOTAsMTcgKzMwNiw5NSBAQAogCQkobGlzdC0+ZXZkZXYtPmV4aXN0ID8gMCA6IChQT0xMSFVQIHwgUE9MTEVSUikpOwogfQogCi1zdGF0aWMgbG9uZyBldmRldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCisjZGVmaW5lIEJJVFNfUEVSX0xPTkdfQ09NUEFUIChzaXplb2YoY29tcGF0X2xvbmdfdCkgKiA4KQorI2RlZmluZSBOQklUU19DT01QQVQoeCkgKCgoKHgpIC0gMSkgLyBCSVRTX1BFUl9MT05HX0NPTVBBVCkgKyAxKQorCisjaWZkZWYgX19CSUdfRU5ESUFOCitzdGF0aWMgaW50IGJpdHNfdG9fdXNlcih1bnNpZ25lZCBsb25nICpiaXRzLCB1bnNpZ25lZCBpbnQgbWF4Yml0LAorCQkJdW5zaWduZWQgaW50IG1heGxlbiwgdm9pZCBfX3VzZXIgKnAsIGludCBjb21wYXQpCit7CisJaW50IGxlbiwgaTsKKworCWlmIChjb21wYXQpIHsKKwkJbGVuID0gTkJJVFNfQ09NUEFUKG1heGJpdCkgKiBzaXplb2YoY29tcGF0X2xvbmdfdCk7CisJCWlmIChsZW4gPCBtYXhsZW4pCisJCQlsZW4gPSBtYXhsZW47CisKKwkJZm9yIChpID0gMDsgaSA8IGxlbiAvIHNpemVvZihjb21wYXRfbG9uZ190KTsgaSsrKQorCQkJaWYgKGNvcHlfdG9fdXNlcigoY29tcGF0X2xvbmdfdCBfX3VzZXIgKikgcCArIGksCisJCQkJCSAoY29tcGF0X2xvbmdfdCAqKSBiaXRzICsKKwkJCQkJCWkgKyAxIC0gKChpICUgMikgPDwgMSksCisJCQkJCSBzaXplb2YoY29tcGF0X2xvbmdfdCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCX0gZWxzZSB7CisJCWxlbiA9IE5CSVRTKG1heGJpdCkgKiBzaXplb2YobG9uZyk7CisJCWlmIChsZW4gPiBtYXhsZW4pCisJCQlsZW4gPSBtYXhsZW47CisKKwkJaWYgKGNvcHlfdG9fdXNlcihwLCBiaXRzLCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKyNlbHNlCitzdGF0aWMgaW50IGJpdHNfdG9fdXNlcih1bnNpZ25lZCBsb25nICpiaXRzLCB1bnNpZ25lZCBpbnQgbWF4Yml0LAorCQkJdW5zaWduZWQgaW50IG1heGxlbiwgdm9pZCBfX3VzZXIgKnAsIGludCBjb21wYXQpCit7CisJaW50IGxlbiA9IGNvbXBhdCA/CisJCQlOQklUU19DT01QQVQobWF4Yml0KSAqIHNpemVvZihjb21wYXRfbG9uZ190KSA6CisJCQlOQklUUyhtYXhiaXQpICogc2l6ZW9mKGxvbmcpOworCisJaWYgKGxlbiA+IG1heGxlbikKKwkJbGVuID0gbWF4bGVuOworCisJcmV0dXJuIGNvcHlfdG9fdXNlcihwLCBiaXRzLCBsZW4pID8gLUVGQVVMVCA6IGxlbjsKK30KKyNlbmRpZiAvKiBfX0JJR19FTkRJQU4gKi8KKworI2Vsc2UKKworc3RhdGljIGludCBiaXRzX3RvX3VzZXIodW5zaWduZWQgbG9uZyAqYml0cywgdW5zaWduZWQgaW50IG1heGJpdCwKKwkJCXVuc2lnbmVkIGludCBtYXhsZW4sIHZvaWQgX191c2VyICpwLCBpbnQgY29tcGF0KQoreworCWludCBsZW4gPSBOQklUUyhtYXhiaXQpICogc2l6ZW9mKGxvbmcpOworCisJaWYgKGxlbiA+IG1heGxlbikKKwkJbGVuID0gbWF4bGVuOworCisJcmV0dXJuIGNvcHlfdG9fdXNlcihwLCBiaXRzLCBsZW4pID8gLUVGQVVMVCA6IGxlbjsKK30KKworI2VuZGlmIC8qIENPTkZJR19DT01QQVQgKi8KKworc3RhdGljIGludCBzdHJfdG9fdXNlcihjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGludCBtYXhsZW4sIHZvaWQgX191c2VyICpwKQoreworCWludCBsZW47CisKKwlpZiAoIXN0cikKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlsZW4gPSBzdHJsZW4oc3RyKSArIDE7CisJaWYgKGxlbiA+IG1heGxlbikKKwkJbGVuID0gbWF4bGVuOworCisJcmV0dXJuIGNvcHlfdG9fdXNlcihwLCBzdHIsIGxlbikgPyAtRUZBVUxUIDogbGVuOworfQorCitzdGF0aWMgbG9uZyBldmRldl9pb2N0bF9oYW5kbGVyKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCXZvaWQgX191c2VyICpwLCBpbnQgY29tcGF0X21vZGUpCiB7CiAJc3RydWN0IGV2ZGV2X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGV2ZGV2ICpldmRldiA9IGxpc3QtPmV2ZGV2OwogCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IGV2ZGV2LT5oYW5kbGUuZGV2OwogCXN0cnVjdCBpbnB1dF9hYnNpbmZvIGFiczsKLQl2b2lkIF9fdXNlciAqcCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlpbnQgX191c2VyICppcCA9IChpbnQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKmlwID0gKGludCBfX3VzZXIgKilwOwogCWludCBpLCB0LCB1LCB2OwogCi0JaWYgKCFldmRldi0+ZXhpc3QpIHJldHVybiAtRU5PREVWOworCWlmICghZXZkZXYtPmV4aXN0KQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCXN3aXRjaCAoY21kKSB7CiAKQEAgLTMwOCwyNiArNDAyLDM5IEBACiAJCQlyZXR1cm4gcHV0X3VzZXIoRVZfVkVSU0lPTiwgaXApOwogCiAJCWNhc2UgRVZJT0NHSUQ6Ci0JCQlyZXR1cm4gY29weV90b191c2VyKHAsICZkZXYtPmlkLCBzaXplb2Yoc3RydWN0IGlucHV0X2lkKSkgPyAtRUZBVUxUIDogMDsKKwkJCWlmIChjb3B5X3RvX3VzZXIocCwgJmRldi0+aWQsIHNpemVvZihzdHJ1Y3QgaW5wdXRfaWQpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0dXJuIDA7CiAKIAkJY2FzZSBFVklPQ0dLRVlDT0RFOgotCQkJaWYgKGdldF91c2VyKHQsIGlwKSkgcmV0dXJuIC1FRkFVTFQ7Ci0JCQlpZiAodCA8IDAgfHwgdCA+PSBkZXYtPmtleWNvZGVtYXggfHwgIWRldi0+a2V5Y29kZXNpemUpIHJldHVybiAtRUlOVkFMOwotCQkJaWYgKHB1dF91c2VyKElOUFVUX0tFWUNPREUoZGV2LCB0KSwgaXAgKyAxKSkgcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoZ2V0X3VzZXIodCwgaXApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKHQgPCAwIHx8IHQgPj0gZGV2LT5rZXljb2RlbWF4IHx8ICFkZXYtPmtleWNvZGVzaXplKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKHB1dF91c2VyKElOUFVUX0tFWUNPREUoZGV2LCB0KSwgaXAgKyAxKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCXJldHVybiAwOwogCiAJCWNhc2UgRVZJT0NTS0VZQ09ERToKLQkJCWlmIChnZXRfdXNlcih0LCBpcCkpIHJldHVybiAtRUZBVUxUOwotCQkJaWYgKHQgPCAwIHx8IHQgPj0gZGV2LT5rZXljb2RlbWF4IHx8ICFkZXYtPmtleWNvZGVzaXplKSByZXR1cm4gLUVJTlZBTDsKLQkJCWlmIChnZXRfdXNlcih2LCBpcCArIDEpKSByZXR1cm4gLUVGQVVMVDsKLQkJCWlmICh2IDwgMCB8fCB2ID4gS0VZX01BWCkgcmV0dXJuIC1FSU5WQUw7Ci0JCQlpZiAoZGV2LT5rZXljb2Rlc2l6ZSA8IHNpemVvZih2KSAmJiAodiA+PiAoZGV2LT5rZXljb2Rlc2l6ZSAqIDgpKSkgcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoZ2V0X3VzZXIodCwgaXApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKHQgPCAwIHx8IHQgPj0gZGV2LT5rZXljb2RlbWF4IHx8ICFkZXYtPmtleWNvZGVzaXplKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKGdldF91c2VyKHYsIGlwICsgMSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAodiA8IDAgfHwgdiA+IEtFWV9NQVgpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoZGV2LT5rZXljb2Rlc2l6ZSA8IHNpemVvZih2KSAmJiAodiA+PiAoZGV2LT5rZXljb2Rlc2l6ZSAqIDgpKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwogCQkJdSA9IFNFVF9JTlBVVF9LRVlDT0RFKGRldiwgdCwgdik7CiAJCQljbGVhcl9iaXQodSwgZGV2LT5rZXliaXQpOwogCQkJc2V0X2JpdCh2LCBkZXYtPmtleWJpdCk7CiAJCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5rZXljb2RlbWF4OyBpKyspCi0JCQkJaWYgKElOUFVUX0tFWUNPREUoZGV2LGkpID09IHUpCisJCQkJaWYgKElOUFVUX0tFWUNPREUoZGV2LCBpKSA9PSB1KQogCQkJCQlzZXRfYml0KHUsIGRldi0+a2V5Yml0KTsKKwogCQkJcmV0dXJuIDA7CiAKIAkJY2FzZSBFVklPQ1NGRjoKQEAgLTMzOCwxNyArNDQ1LDE3IEBACiAJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZlZmZlY3QsIHAsIHNpemVvZihlZmZlY3QpKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQkJZXJyID0gZGV2LT51cGxvYWRfZWZmZWN0KGRldiwgJmVmZmVjdCk7Ci0JCQkJaWYgKHB1dF91c2VyKGVmZmVjdC5pZCwgJigoKHN0cnVjdCBmZl9lZmZlY3QgX191c2VyICopYXJnKS0+aWQpKSkKKwkJCQlpZiAocHV0X3VzZXIoZWZmZWN0LmlkLCAmKCgoc3RydWN0IGZmX2VmZmVjdCBfX3VzZXIgKilwKS0+aWQpKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQkJcmV0dXJuIGVycjsKLQkJCX0KLQkJCWVsc2UgcmV0dXJuIC1FTk9TWVM7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gLUVOT1NZUzsKIAogCQljYXNlIEVWSU9DUk1GRjoKLQkJCWlmIChkZXYtPmVyYXNlX2VmZmVjdCkgewotCQkJCXJldHVybiBkZXYtPmVyYXNlX2VmZmVjdChkZXYsIChpbnQpYXJnKTsKLQkJCX0KLQkJCWVsc2UgcmV0dXJuIC1FTk9TWVM7CisJCQlpZiAoIWRldi0+ZXJhc2VfZWZmZWN0KQorCQkJCXJldHVybiAtRU5PU1lTOworCisJCQlyZXR1cm4gZGV2LT5lcmFzZV9lZmZlY3QoZGV2LCAoaW50KSh1bnNpZ25lZCBsb25nKSBwKTsKIAogCQljYXNlIEVWSU9DR0VGRkVDVFM6CiAJCQlpZiAocHV0X3VzZXIoZGV2LT5mZl9lZmZlY3RzX21heCwgaXApKQpAQCAtMzU2LDcgKzQ2Myw3IEBACiAJCQlyZXR1cm4gMDsKIAogCQljYXNlIEVWSU9DR1JBQjoKLQkJCWlmIChhcmcpIHsKKwkJCWlmIChwKSB7CiAJCQkJaWYgKGV2ZGV2LT5ncmFiKQogCQkJCQlyZXR1cm4gLUVCVVNZOwogCQkJCWlmIChpbnB1dF9ncmFiX2RldmljZSgmZXZkZXYtPmhhbmRsZSkpCkBAIC0zOTUsNjIgKzUwMiwzMyBAQAogCQkJCQkJY2FzZSBFVl9TVzogIGJpdHMgPSBkZXYtPnN3Yml0OyAgbGVuID0gU1dfTUFYOyAgYnJlYWs7CiAJCQkJCQlkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKIAkJCQkJfQotCQkJCQlsZW4gPSBOQklUUyhsZW4pICogc2l6ZW9mKGxvbmcpOwotCQkJCQlpZiAobGVuID4gX0lPQ19TSVpFKGNtZCkpIGxlbiA9IF9JT0NfU0laRShjbWQpOwotCQkJCQlyZXR1cm4gY29weV90b191c2VyKHAsIGJpdHMsIGxlbikgPyAtRUZBVUxUIDogbGVuOworCQkJCQlyZXR1cm4gYml0c190b191c2VyKGJpdHMsIGxlbiwgX0lPQ19TSVpFKGNtZCksIHAsIGNvbXBhdF9tb2RlKTsKIAkJCQl9CiAKLQkJCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoRVZJT0NHS0VZKDApKSkgewotCQkJCQlpbnQgbGVuOwotCQkJCQlsZW4gPSBOQklUUyhLRVlfTUFYKSAqIHNpemVvZihsb25nKTsKLQkJCQkJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKSBsZW4gPSBfSU9DX1NJWkUoY21kKTsKLQkJCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihwLCBkZXYtPmtleSwgbGVuKSA/IC1FRkFVTFQgOiBsZW47Ci0JCQkJfQorCQkJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihFVklPQ0dLRVkoMCkpKQorCQkJCQlyZXR1cm4gYml0c190b191c2VyKGRldi0+a2V5LCBLRVlfTUFYLCBfSU9DX1NJWkUoY21kKSwKKwkJCQkJCQkgICAgcCwgY29tcGF0X21vZGUpOwogCi0JCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DR0xFRCgwKSkpIHsKLQkJCQkJaW50IGxlbjsKLQkJCQkJbGVuID0gTkJJVFMoTEVEX01BWCkgKiBzaXplb2YobG9uZyk7Ci0JCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7Ci0JCQkJCXJldHVybiBjb3B5X3RvX3VzZXIocCwgZGV2LT5sZWQsIGxlbikgPyAtRUZBVUxUIDogbGVuOwotCQkJCX0KKwkJCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoRVZJT0NHTEVEKDApKSkKKwkJCQkJcmV0dXJuIGJpdHNfdG9fdXNlcihkZXYtPmxlZCwgTEVEX01BWCwgX0lPQ19TSVpFKGNtZCksCisJCQkJCQkJICAgIHAsIGNvbXBhdF9tb2RlKTsKIAotCQkJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihFVklPQ0dTTkQoMCkpKSB7Ci0JCQkJCWludCBsZW47Ci0JCQkJCWxlbiA9IE5CSVRTKFNORF9NQVgpICogc2l6ZW9mKGxvbmcpOwotCQkJCQlpZiAobGVuID4gX0lPQ19TSVpFKGNtZCkpIGxlbiA9IF9JT0NfU0laRShjbWQpOwotCQkJCQlyZXR1cm4gY29weV90b191c2VyKHAsIGRldi0+c25kLCBsZW4pID8gLUVGQVVMVCA6IGxlbjsKLQkJCQl9CisJCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DR1NORCgwKSkpCisJCQkJCXJldHVybiBiaXRzX3RvX3VzZXIoZGV2LT5zbmQsIFNORF9NQVgsIF9JT0NfU0laRShjbWQpLAorCQkJCQkJCSAgICBwLCBjb21wYXRfbW9kZSk7CiAKLQkJCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoRVZJT0NHU1coMCkpKSB7Ci0JCQkJCWludCBsZW47Ci0JCQkJCWxlbiA9IE5CSVRTKFNXX01BWCkgKiBzaXplb2YobG9uZyk7Ci0JCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7Ci0JCQkJCXJldHVybiBjb3B5X3RvX3VzZXIocCwgZGV2LT5zdywgbGVuKSA/IC1FRkFVTFQgOiBsZW47Ci0JCQkJfQorCQkJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihFVklPQ0dTVygwKSkpCisJCQkJCXJldHVybiBiaXRzX3RvX3VzZXIoZGV2LT5zdywgU1dfTUFYLCBfSU9DX1NJWkUoY21kKSwKKwkJCQkJCQkgICAgcCwgY29tcGF0X21vZGUpOwogCi0JCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DR05BTUUoMCkpKSB7Ci0JCQkJCWludCBsZW47Ci0JCQkJCWlmICghZGV2LT5uYW1lKSByZXR1cm4gLUVOT0VOVDsKLQkJCQkJbGVuID0gc3RybGVuKGRldi0+bmFtZSkgKyAxOwotCQkJCQlpZiAobGVuID4gX0lPQ19TSVpFKGNtZCkpIGxlbiA9IF9JT0NfU0laRShjbWQpOwotCQkJCQlyZXR1cm4gY29weV90b191c2VyKHAsIGRldi0+bmFtZSwgbGVuKSA/IC1FRkFVTFQgOiBsZW47Ci0JCQkJfQorCQkJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihFVklPQ0dOQU1FKDApKSkKKwkJCQkJcmV0dXJuIHN0cl90b191c2VyKGRldi0+bmFtZSwgX0lPQ19TSVpFKGNtZCksIHApOwogCi0JCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DR1BIWVMoMCkpKSB7Ci0JCQkJCWludCBsZW47Ci0JCQkJCWlmICghZGV2LT5waHlzKSByZXR1cm4gLUVOT0VOVDsKLQkJCQkJbGVuID0gc3RybGVuKGRldi0+cGh5cykgKyAxOwotCQkJCQlpZiAobGVuID4gX0lPQ19TSVpFKGNtZCkpIGxlbiA9IF9JT0NfU0laRShjbWQpOwotCQkJCQlyZXR1cm4gY29weV90b191c2VyKHAsIGRldi0+cGh5cywgbGVuKSA/IC1FRkFVTFQgOiBsZW47Ci0JCQkJfQorCQkJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihFVklPQ0dQSFlTKDApKSkKKwkJCQkJcmV0dXJuIHN0cl90b191c2VyKGRldi0+cGh5cywgX0lPQ19TSVpFKGNtZCksIHApOwogCi0JCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DR1VOSVEoMCkpKSB7Ci0JCQkJCWludCBsZW47Ci0JCQkJCWlmICghZGV2LT51bmlxKSByZXR1cm4gLUVOT0VOVDsKLQkJCQkJbGVuID0gc3RybGVuKGRldi0+dW5pcSkgKyAxOwotCQkJCQlpZiAobGVuID4gX0lPQ19TSVpFKGNtZCkpIGxlbiA9IF9JT0NfU0laRShjbWQpOwotCQkJCQlyZXR1cm4gY29weV90b191c2VyKHAsIGRldi0+dW5pcSwgbGVuKSA/IC1FRkFVTFQgOiBsZW47Ci0JCQkJfQorCQkJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihFVklPQ0dVTklRKDApKSkKKwkJCQkJcmV0dXJuIHN0cl90b191c2VyKGRldi0+dW5pcSwgX0lPQ19TSVpFKGNtZCksIHApOwogCiAJCQkJaWYgKChfSU9DX05SKGNtZCkgJiB+QUJTX01BWCkgPT0gX0lPQ19OUihFVklPQ0dBQlMoMCkpKSB7CiAKQEAgLTQ5MiwxNTggKzU3MCwxNSBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCitzdGF0aWMgbG9uZyBldmRldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIGV2ZGV2X2lvY3RsX2hhbmRsZXIoZmlsZSwgY21kLCAodm9pZCBfX3VzZXIgKilhcmcsIDApOworfQorCiAjaWZkZWYgQ09ORklHX0NPTVBBVAotCi0jZGVmaW5lIEJJVFNfUEVSX0xPTkdfQ09NUEFUIChzaXplb2YoY29tcGF0X2xvbmdfdCkgKiA4KQotI2RlZmluZSBOQklUU19DT01QQVQoeCkgKCgoKHgpLTEpL0JJVFNfUEVSX0xPTkdfQ09NUEFUKSsxKQotI2RlZmluZSBPRkZfQ09NUEFUKHgpICAoKHgpJUJJVFNfUEVSX0xPTkdfQ09NUEFUKQotI2RlZmluZSBCSVRfQ09NUEFUKHgpICAoMVVMPDxPRkZfQ09NUEFUKHgpKQotI2RlZmluZSBMT05HX0NPTVBBVCh4KSAoKHgpL0JJVFNfUEVSX0xPTkdfQ09NUEFUKQotI2RlZmluZSB0ZXN0X2JpdF9jb21wYXQoYml0LCBhcnJheSkgKChhcnJheVtMT05HX0NPTVBBVChiaXQpXSA+PiBPRkZfQ09NUEFUKGJpdCkpICYgMSkKLQotI2lmZGVmIF9fQklHX0VORElBTgotI2RlZmluZSBiaXRfdG9fdXNlcihiaXQsIG1heCkgXAotZG8geyBcCi0JaW50IGk7IFwKLQlpbnQgbGVuID0gTkJJVFNfQ09NUEFUKChtYXgpKSAqIHNpemVvZihjb21wYXRfbG9uZ190KTsgXAotCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7IFwKLQlmb3IgKGkgPSAwOyBpIDwgbGVuIC8gc2l6ZW9mKGNvbXBhdF9sb25nX3QpOyBpKyspIFwKLQkJaWYgKGNvcHlfdG9fdXNlcigoY29tcGF0X2xvbmdfdCBfX3VzZXIgKikgcCArIGksIFwKLQkJCQkgKGNvbXBhdF9sb25nX3QqKSAoYml0KSArIGkgKyAxIC0gKChpICUgMikgPDwgMSksIFwKLQkJCQkgc2l6ZW9mKGNvbXBhdF9sb25nX3QpKSkgXAotCQkJcmV0dXJuIC1FRkFVTFQ7IFwKLQlyZXR1cm4gbGVuOyBcCi19IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgYml0X3RvX3VzZXIoYml0LCBtYXgpIFwKLWRvIHsgXAotCWludCBsZW4gPSBOQklUU19DT01QQVQoKG1heCkpICogc2l6ZW9mKGNvbXBhdF9sb25nX3QpOyBcCi0JaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKSBsZW4gPSBfSU9DX1NJWkUoY21kKTsgXAotCXJldHVybiBjb3B5X3RvX3VzZXIocCwgKGJpdCksIGxlbikgPyAtRUZBVUxUIDogbGVuOyBcCi19IHdoaWxlICgwKQotI2VuZGlmCi0KIHN0YXRpYyBsb25nIGV2ZGV2X2lvY3RsX2NvbXBhdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0Jc3RydWN0IGV2ZGV2X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGV2ZGV2ICpldmRldiA9IGxpc3QtPmV2ZGV2OwotCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IGV2ZGV2LT5oYW5kbGUuZGV2OwotCXN0cnVjdCBpbnB1dF9hYnNpbmZvIGFiczsKLQl2b2lkIF9fdXNlciAqcCA9IGNvbXBhdF9wdHIoYXJnKTsKLQotCWlmICghZXZkZXYtPmV4aXN0KSByZXR1cm4gLUVOT0RFVjsKLQotCXN3aXRjaCAoY21kKSB7Ci0KLQkJY2FzZSBFVklPQ0dWRVJTSU9OOgotCQljYXNlIEVWSU9DR0lEOgotCQljYXNlIEVWSU9DR0tFWUNPREU6Ci0JCWNhc2UgRVZJT0NTS0VZQ09ERToKLQkJY2FzZSBFVklPQ1NGRjoKLQkJY2FzZSBFVklPQ1JNRkY6Ci0JCWNhc2UgRVZJT0NHRUZGRUNUUzoKLQkJY2FzZSBFVklPQ0dSQUI6Ci0JCQlyZXR1cm4gZXZkZXZfaW9jdGwoZmlsZSwgY21kLCAodW5zaWduZWQgbG9uZykgcCk7Ci0KLQkJZGVmYXVsdDoKLQotCQkJaWYgKF9JT0NfVFlQRShjbWQpICE9ICdFJykKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJaWYgKF9JT0NfRElSKGNtZCkgPT0gX0lPQ19SRUFEKSB7Ci0KLQkJCQlpZiAoKF9JT0NfTlIoY21kKSAmIH5FVl9NQVgpID09IF9JT0NfTlIoRVZJT0NHQklUKDAsMCkpKSB7Ci0JCQkJCWxvbmcgKmJpdHM7Ci0JCQkJCWludCBtYXg7Ci0KLQkJCQkJc3dpdGNoIChfSU9DX05SKGNtZCkgJiBFVl9NQVgpIHsKLQkJCQkJCWNhc2UgICAgICAwOiBiaXRzID0gZGV2LT5ldmJpdDsgIG1heCA9IEVWX01BWDsgIGJyZWFrOwotCQkJCQkJY2FzZSBFVl9LRVk6IGJpdHMgPSBkZXYtPmtleWJpdDsgbWF4ID0gS0VZX01BWDsgYnJlYWs7Ci0JCQkJCQljYXNlIEVWX1JFTDogYml0cyA9IGRldi0+cmVsYml0OyBtYXggPSBSRUxfTUFYOyBicmVhazsKLQkJCQkJCWNhc2UgRVZfQUJTOiBiaXRzID0gZGV2LT5hYnNiaXQ7IG1heCA9IEFCU19NQVg7IGJyZWFrOwotCQkJCQkJY2FzZSBFVl9NU0M6IGJpdHMgPSBkZXYtPm1zY2JpdDsgbWF4ID0gTVNDX01BWDsgYnJlYWs7Ci0JCQkJCQljYXNlIEVWX0xFRDogYml0cyA9IGRldi0+bGVkYml0OyBtYXggPSBMRURfTUFYOyBicmVhazsKLQkJCQkJCWNhc2UgRVZfU05EOiBiaXRzID0gZGV2LT5zbmRiaXQ7IG1heCA9IFNORF9NQVg7IGJyZWFrOwotCQkJCQkJY2FzZSBFVl9GRjogIGJpdHMgPSBkZXYtPmZmYml0OyAgbWF4ID0gRkZfTUFYOyAgYnJlYWs7Ci0JCQkJCQljYXNlIEVWX1NXOiAgYml0cyA9IGRldi0+c3diaXQ7ICBtYXggPSBTV19NQVg7ICBicmVhazsKLQkJCQkJCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOwotCQkJCQl9Ci0JCQkJCWJpdF90b191c2VyKGJpdHMsIG1heCk7Ci0JCQkJfQotCi0JCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DR0tFWSgwKSkpCi0JCQkJCWJpdF90b191c2VyKGRldi0+a2V5LCBLRVlfTUFYKTsKLQotCQkJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihFVklPQ0dMRUQoMCkpKQotCQkJCQliaXRfdG9fdXNlcihkZXYtPmxlZCwgTEVEX01BWCk7Ci0KLQkJCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoRVZJT0NHU05EKDApKSkKLQkJCQkJYml0X3RvX3VzZXIoZGV2LT5zbmQsIFNORF9NQVgpOwotCi0JCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DR1NXKDApKSkKLQkJCQkJYml0X3RvX3VzZXIoZGV2LT5zdywgU1dfTUFYKTsKLQotCQkJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihFVklPQ0dOQU1FKDApKSkgewotCQkJCQlpbnQgbGVuOwotCQkJCQlpZiAoIWRldi0+bmFtZSkgcmV0dXJuIC1FTk9FTlQ7Ci0JCQkJCWxlbiA9IHN0cmxlbihkZXYtPm5hbWUpICsgMTsKLQkJCQkJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKSBsZW4gPSBfSU9DX1NJWkUoY21kKTsKLQkJCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihwLCBkZXYtPm5hbWUsIGxlbikgPyAtRUZBVUxUIDogbGVuOwotCQkJCX0KLQotCQkJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihFVklPQ0dQSFlTKDApKSkgewotCQkJCQlpbnQgbGVuOwotCQkJCQlpZiAoIWRldi0+cGh5cykgcmV0dXJuIC1FTk9FTlQ7Ci0JCQkJCWxlbiA9IHN0cmxlbihkZXYtPnBoeXMpICsgMTsKLQkJCQkJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKSBsZW4gPSBfSU9DX1NJWkUoY21kKTsKLQkJCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihwLCBkZXYtPnBoeXMsIGxlbikgPyAtRUZBVUxUIDogbGVuOwotCQkJCX0KLQotCQkJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihFVklPQ0dVTklRKDApKSkgewotCQkJCQlpbnQgbGVuOwotCQkJCQlpZiAoIWRldi0+dW5pcSkgcmV0dXJuIC1FTk9FTlQ7Ci0JCQkJCWxlbiA9IHN0cmxlbihkZXYtPnVuaXEpICsgMTsKLQkJCQkJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKSBsZW4gPSBfSU9DX1NJWkUoY21kKTsKLQkJCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihwLCBkZXYtPnVuaXEsIGxlbikgPyAtRUZBVUxUIDogbGVuOwotCQkJCX0KLQotCQkJCWlmICgoX0lPQ19OUihjbWQpICYgfkFCU19NQVgpID09IF9JT0NfTlIoRVZJT0NHQUJTKDApKSkgewotCi0JCQkJCWludCB0ID0gX0lPQ19OUihjbWQpICYgQUJTX01BWDsKLQotCQkJCQlhYnMudmFsdWUgPSBkZXYtPmFic1t0XTsKLQkJCQkJYWJzLm1pbmltdW0gPSBkZXYtPmFic21pblt0XTsKLQkJCQkJYWJzLm1heGltdW0gPSBkZXYtPmFic21heFt0XTsKLQkJCQkJYWJzLmZ1enogPSBkZXYtPmFic2Z1enpbdF07Ci0JCQkJCWFicy5mbGF0ID0gZGV2LT5hYnNmbGF0W3RdOwotCi0JCQkJCWlmIChjb3B5X3RvX3VzZXIocCwgJmFicywgc2l6ZW9mKHN0cnVjdCBpbnB1dF9hYnNpbmZvKSkpCi0JCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChfSU9DX0RJUihjbWQpID09IF9JT0NfV1JJVEUpIHsKLQotCQkJCWlmICgoX0lPQ19OUihjbWQpICYgfkFCU19NQVgpID09IF9JT0NfTlIoRVZJT0NTQUJTKDApKSkgewotCi0JCQkJCWludCB0ID0gX0lPQ19OUihjbWQpICYgQUJTX01BWDsKLQotCQkJCQlpZiAoY29weV9mcm9tX3VzZXIoJmFicywgcCwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9hYnNpbmZvKSkpCi0JCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJCQlkZXYtPmFic1t0XSA9IGFicy52YWx1ZTsKLQkJCQkJZGV2LT5hYnNtaW5bdF0gPSBhYnMubWluaW11bTsKLQkJCQkJZGV2LT5hYnNtYXhbdF0gPSBhYnMubWF4aW11bTsKLQkJCQkJZGV2LT5hYnNmdXp6W3RdID0gYWJzLmZ1eno7Ci0JCQkJCWRldi0+YWJzZmxhdFt0XSA9IGFicy5mbGF0OwotCi0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCX0KLQl9Ci0JcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGV2ZGV2X2lvY3RsX2hhbmRsZXIoZmlsZSwgY21kLCBjb21wYXRfcHRyKGFyZyksIDEpOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvS2NvbmZpZwppbmRleCA3NTI0YmQ3Li5kMjc5NDU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9LY29uZmlnCkBAIC01Miw1ICs1MiwxMiBAQAogY29uZmlnIEdBTUVQT1JUX0ZNODAxCiAJdHJpc3RhdGUgIkZvcnRlTWVkaWEgRk04MDEgZ2FtZXBvcnQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgRm9ydGVNZWRpYSBGTTgwMSBQQ0kgYXVkaW8gY29udHJvbGxlcgorCSAgKEFiaXQgQVUxMCwgR2VuaXVzIFNvdW5kIE1ha2VyLCBIUCBXb3Jrc3RhdGlvbiB6eDIwMDAsCisJICBhbmQgb3RoZXJzKSwgYW5kIHdhbnQgdG8gdXNlIGl0cyBnYW1lcG9ydC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZm04MDEtZ3AuCiAKIGVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMKaW5kZXggY2FhYzZkNi4uYjc2NWExNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZ2FtZXBvcnQuYworKysgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMKQEAgLTUwLDkgKzUwLDcgQEAKIAogc3RhdGljIExJU1RfSEVBRChnYW1lcG9ydF9saXN0KTsKIAotc3RhdGljIHN0cnVjdCBidXNfdHlwZSBnYW1lcG9ydF9idXMgPSB7Ci0JLm5hbWUgPQkiZ2FtZXBvcnQiLAotfTsKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgZ2FtZXBvcnRfYnVzOwogCiBzdGF0aWMgdm9pZCBnYW1lcG9ydF9hZGRfcG9ydChzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0KTsKIHN0YXRpYyB2b2lkIGdhbWVwb3J0X2Rlc3Ryb3lfcG9ydChzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0KTsKQEAgLTcwMywxMSArNzAxLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgZ2FtZXBvcnRfYnVzID0geworCS5uYW1lID0JImdhbWVwb3J0IiwKKwkucHJvYmUgPSBnYW1lcG9ydF9kcml2ZXJfcHJvYmUsCisJLnJlbW92ZSA9IGdhbWVwb3J0X2RyaXZlcl9yZW1vdmUsCit9OworCiB2b2lkIF9fZ2FtZXBvcnRfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBnYW1lcG9ydF9kcml2ZXIgKmRydiwgc3RydWN0IG1vZHVsZSAqb3duZXIpCiB7CiAJZHJ2LT5kcml2ZXIuYnVzID0gJmdhbWVwb3J0X2J1czsKLQlkcnYtPmRyaXZlci5wcm9iZSA9IGdhbWVwb3J0X2RyaXZlcl9wcm9iZTsKLQlkcnYtPmRyaXZlci5yZW1vdmUgPSBnYW1lcG9ydF9kcml2ZXJfcmVtb3ZlOwogCWdhbWVwb3J0X3F1ZXVlX2V2ZW50KGRydiwgb3duZXIsIEdBTUVQT1JUX1JFR0lTVEVSX0RSSVZFUik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvaW5wdXQuYyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQuYwppbmRleCBlZjU4MjRjLi40ZmUzZGEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2lucHV0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9pbnB1dC5jCkBAIC00NzcsOCArNDc3LDggQEAKIAogCWVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOwogCWlucHV0X2ZpbGVvcHMgPSAqZW50cnktPnByb2NfZm9wczsKKwlpbnB1dF9maWxlb3BzLnBvbGwgPSBpbnB1dF9kZXZpY2VzX3BvbGw7CiAJZW50cnktPnByb2NfZm9wcyA9ICZpbnB1dF9maWxlb3BzOwotCWVudHJ5LT5wcm9jX2ZvcHMtPnBvbGwgPSBpbnB1dF9kZXZpY2VzX3BvbGw7CiAKIAllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImhhbmRsZXJzIiwgMCwgcHJvY19idXNfaW5wdXRfZGlyLCBpbnB1dF9oYW5kbGVyc19yZWFkLCBOVUxMKTsKIAlpZiAoIWVudHJ5KQpAQCAtNTI4LDQwICs1MjgsNTYgQEAKIElOUFVUX0RFVl9TVFJJTkdfQVRUUl9TSE9XKHBoeXMpOwogSU5QVVRfREVWX1NUUklOR19BVFRSX1NIT1codW5pcSk7CiAKLXN0YXRpYyBpbnQgcHJpbnRfbW9kYWxpYXNfYml0cyhjaGFyICpidWYsIGNoYXIgcHJlZml4LCB1bnNpZ25lZCBsb25nICphcnIsCitzdGF0aWMgaW50IHByaW50X21vZGFsaWFzX2JpdHMoY2hhciAqYnVmLCBpbnQgc2l6ZSwgY2hhciBwcmVmaXgsIHVuc2lnbmVkIGxvbmcgKmFyciwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWluLCB1bnNpZ25lZCBpbnQgbWF4KQogewogCWludCBsZW4sIGk7CiAKLQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVjIiwgcHJlZml4KTsKKwlsZW4gPSBzbnByaW50ZihidWYsIHNpemUsICIlYyIsIHByZWZpeCk7CiAJZm9yIChpID0gbWluOyBpIDwgbWF4OyBpKyspCiAJCWlmIChhcnJbTE9ORyhpKV0gJiBCSVQoaSkpCi0JCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiJVgsIiwgaSk7CisJCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLCAiJVgsIiwgaSk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBwcmludF9tb2RhbGlhcyhjaGFyICpidWYsIGludCBzaXplLCBzdHJ1Y3QgaW5wdXRfZGV2ICppZCkKK3sKKwlpbnQgbGVuOworCisJbGVuID0gc25wcmludGYoYnVmLCBzaXplLCAiaW5wdXQ6YiUwNFh2JTA0WHAlMDRYZSUwNFgtIiwKKwkJICAgICAgIGlkLT5pZC5idXN0eXBlLAorCQkgICAgICAgaWQtPmlkLnZlbmRvciwKKwkJICAgICAgIGlkLT5pZC5wcm9kdWN0LAorCQkgICAgICAgaWQtPmlkLnZlcnNpb24pOworCisJbGVuICs9IHByaW50X21vZGFsaWFzX2JpdHMoYnVmICsgbGVuLCBzaXplIC0gbGVuLCAnZScsIGlkLT5ldmJpdCwKKwkJCQkgICAwLCBFVl9NQVgpOworCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwgJ2snLCBpZC0+a2V5Yml0LAorCQkJCSAgIEtFWV9NSU5fSU5URVJFU1RJTkcsIEtFWV9NQVgpOworCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwgJ3InLCBpZC0+cmVsYml0LAorCQkJCSAgIDAsIFJFTF9NQVgpOworCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwgJ2EnLCBpZC0+YWJzYml0LAorCQkJCSAgIDAsIEFCU19NQVgpOworCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwgJ20nLCBpZC0+bXNjYml0LAorCQkJCSAgIDAsIE1TQ19NQVgpOworCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwgJ2wnLCBpZC0+bGVkYml0LAorCQkJCSAgIDAsIExFRF9NQVgpOworCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwgJ3MnLCBpZC0+c25kYml0LAorCQkJCSAgIDAsIFNORF9NQVgpOworCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwgJ2YnLCBpZC0+ZmZiaXQsCisJCQkJICAgMCwgRkZfTUFYKTsKKwlsZW4gKz0gcHJpbnRfbW9kYWxpYXNfYml0cyhidWYgKyBsZW4sIHNpemUgLSBsZW4sICd3JywgaWQtPnN3Yml0LAorCQkJCSAgIDAsIFNXX01BWCk7CiAJcmV0dXJuIGxlbjsKIH0KIAogc3RhdGljIHNzaXplX3QgaW5wdXRfZGV2X3Nob3dfbW9kYWxpYXMoc3RydWN0IGNsYXNzX2RldmljZSAqZGV2LCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGlucHV0X2RldiAqaWQgPSB0b19pbnB1dF9kZXYoZGV2KTsKLQlzc2l6ZV90IGxlbiA9IDA7CisJc3NpemVfdCBsZW47CiAKLQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiaW5wdXQ6YiUwNFh2JTA0WHAlMDRYZSUwNFgtIiwKLQkJICAgICAgIGlkLT5pZC5idXN0eXBlLAotCQkgICAgICAgaWQtPmlkLnZlbmRvciwKLQkJICAgICAgIGlkLT5pZC5wcm9kdWN0LAotCQkgICAgICAgaWQtPmlkLnZlcnNpb24pOwotCi0JbGVuICs9IHByaW50X21vZGFsaWFzX2JpdHMoYnVmK2xlbiwgJ2UnLCBpZC0+ZXZiaXQsIDAsIEVWX01BWCk7Ci0JbGVuICs9IHByaW50X21vZGFsaWFzX2JpdHMoYnVmK2xlbiwgJ2snLCBpZC0+a2V5Yml0LAotCQkJCSAgIEtFWV9NSU5fSU5URVJFU1RJTkcsIEtFWV9NQVgpOwotCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZitsZW4sICdyJywgaWQtPnJlbGJpdCwgMCwgUkVMX01BWCk7Ci0JbGVuICs9IHByaW50X21vZGFsaWFzX2JpdHMoYnVmK2xlbiwgJ2EnLCBpZC0+YWJzYml0LCAwLCBBQlNfTUFYKTsKLQlsZW4gKz0gcHJpbnRfbW9kYWxpYXNfYml0cyhidWYrbGVuLCAnbScsIGlkLT5tc2NiaXQsIDAsIE1TQ19NQVgpOwotCWxlbiArPSBwcmludF9tb2RhbGlhc19iaXRzKGJ1ZitsZW4sICdsJywgaWQtPmxlZGJpdCwgMCwgTEVEX01BWCk7Ci0JbGVuICs9IHByaW50X21vZGFsaWFzX2JpdHMoYnVmK2xlbiwgJ3MnLCBpZC0+c25kYml0LCAwLCBTTkRfTUFYKTsKLQlsZW4gKz0gcHJpbnRfbW9kYWxpYXNfYml0cyhidWYrbGVuLCAnZicsIGlkLT5mZmJpdCwgMCwgRkZfTUFYKTsKLQlsZW4gKz0gcHJpbnRfbW9kYWxpYXNfYml0cyhidWYrbGVuLCAndycsIGlkLT5zd2JpdCwgMCwgU1dfTUFYKTsKLQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiXG4iKTsKKwlsZW4gPSBwcmludF9tb2RhbGlhcyhidWYsIFBBR0VfU0laRSwgaWQpOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFBBR0VfU0laRS1sZW4sICJcbiIpOwogCXJldHVybiBsZW47CiB9CiBzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIobW9kYWxpYXMsIFNfSVJVR08sIGlucHV0X2Rldl9zaG93X21vZGFsaWFzLCBOVUxMKTsKQEAgLTcyOCw4ICs3NDQsMTEgQEAKIAlpZiAodGVzdF9iaXQoRVZfU1csIGRldi0+ZXZiaXQpKQogCQlJTlBVVF9BRERfSE9UUExVR19CTV9WQVIoIlNXPSIsIGRldi0+c3diaXQsIFNXX01BWCk7CiAKLQllbnZwW2ldID0gTlVMTDsKKwllbnZwW2krK10gPSBidWZmZXIgKyBsZW47CisJbGVuICs9IHNucHJpbnRmKGJ1ZmZlciArIGxlbiwgYnVmZmVyX3NpemUgLSBsZW4sICJNT0RBTElBUz0iKTsKKwlsZW4gKz0gcHJpbnRfbW9kYWxpYXMoYnVmZmVyICsgbGVuLCBidWZmZXJfc2l6ZSAtIGxlbiwgZGV2KSArIDE7CiAKKwllbnZwW2ldID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hbWlqb3kuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYW1pam95LmMKaW5kZXggODU1OGE5OS4uZWM1NWEyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hbWlqb3kuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FtaWpveS5jCkBAIC02NCw4ICs2NCw4IEBACiAJCWlmIChhbWlqb3lbaV0pIHsKIAogCQkJc3dpdGNoIChpKSB7Ci0JCQkJY2FzZSAwOiBkYXRhID0gfmN1c3RvbS5qb3kwZGF0OyBidXR0b24gPSAofmNpYWEucHJhID4+IDYpICYgMTsgYnJlYWs7Ci0JCQkJY2FzZSAxOiBkYXRhID0gfmN1c3RvbS5qb3kxZGF0OyBidXR0b24gPSAofmNpYWEucHJhID4+IDcpICYgMTsgYnJlYWs7CisJCQkJY2FzZSAwOiBkYXRhID0gfmFtaWdhX2N1c3RvbS5qb3kwZGF0OyBidXR0b24gPSAofmNpYWEucHJhID4+IDYpICYgMTsgYnJlYWs7CisJCQkJY2FzZSAxOiBkYXRhID0gfmFtaWdhX2N1c3RvbS5qb3kxZGF0OyBidXR0b24gPSAofmNpYWEucHJhID4+IDcpICYgMTsgYnJlYWs7CiAJCQl9CiAKIAkJCWlucHV0X3JlZ3MoYW1pam95X2RldltpXSwgZnApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9ncmlwX21wLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dyaXBfbXAuYwppbmRleCA1MWE5MTIyLi42MjQzODk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dyaXBfbXAuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dyaXBfbXAuYwpAQCAtNTMsMTcgKzUzLDggQEAKIHN0cnVjdCBncmlwX21wIHsKIAlzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0OwogCXN0cnVjdCBncmlwX3BvcnQgKnBvcnRbR1JJUF9NQVhfUE9SVFNdOwotLy8Jc3RydWN0IGlucHV0X2RldiAqZGV2WzRdOwotLy8JaW50IG1vZGVbNF07Ci0vLwlpbnQgcmVnaXN0ZXJlZFs0XTsKIAlpbnQgcmVhZHM7CiAJaW50IGJhZHM7Ci0KLQkvKiBpbmRpdmlkdWFsIGdhbWVwYWQgc3RhdGVzICovCi0vLwlpbnQgYnV0dG9uc1s0XTsKLS8vCWludCB4YXhlc1s0XTsKLS8vCWludCB5YXhlc1s0XTsKLS8vCWludCBkaXJ0eVs0XTsgICAgIC8qIGhhcyB0aGUgc3RhdGUgYmVlbiB1cGRhdGVkPyAqLwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvS2NvbmZpZwppbmRleCA0YTkxNzc0Li4zYjBhYzNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9LY29uZmlnCkBAIC0xNDMsMTYgKzE0Myw2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzcGl0emtiZC4KIAotY29uZmlnIEtFWUJPQVJEX01BUExFCi0JdHJpc3RhdGUgIk1hcGxlIGJ1cyBrZXlib2FyZCIKLQlkZXBlbmRzIG9uIFNIX0RSRUFNQ0FTVCAmJiBNQVBMRQotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBEcmVhbUNhc3QgY29uc29sZSBydW5uaW5nIExpbnV4IGFuZCBoYXZlCi0JICBhIGtleWJvYXJkIGF0dGFjaGVkIHRvIGl0cyBNYXBsZSBidXMuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1hcGxlX2tleWIuCi0KIGNvbmZpZyBLRVlCT0FSRF9BTUlHQQogCXRyaXN0YXRlICJBbWlnYSBrZXlib2FyZCIKIAlkZXBlbmRzIG9uIEFNSUdBCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9NYWtlZmlsZQppbmRleCA5Y2UwYjg3Li42ZTBhZmJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvTWFrZWZpbGUKQEAgLTUsNyArNSw2IEBACiAjIEVhY2ggY29uZmlndXJhdGlvbiBvcHRpb24gZW5hYmxlcyBhIGxpc3Qgb2YgZmlsZXMuCiAKIG9iai0kKENPTkZJR19LRVlCT0FSRF9BVEtCRCkJCSs9IGF0a2JkLm8KLW9iai0kKENPTkZJR19LRVlCT0FSRF9NQVBMRSkJCSs9IG1hcGxlX2tleWIubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX1NVTktCRCkJCSs9IHN1bmtiZC5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfTEtLQkQpCQkrPSBsa2tiZC5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfWFRLQkQpCQkrPSB4dGtiZC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMKaW5kZXggYTAyNTZmOC4uZmZhY2Y2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYwpAQCAtMzIxLDcgKzMyMSw3IEBACiAJc3dpdGNoIChjb2RlKSB7CiAJCWNhc2UgQVRLQkRfUkVUX0JBVDoKIAkJCWF0a2JkLT5lbmFibGVkID0gMDsKLQkJCXNlcmlvX3Jlc2NhbihhdGtiZC0+cHMyZGV2LnNlcmlvKTsKKwkJCXNlcmlvX3JlY29ubmVjdChhdGtiZC0+cHMyZGV2LnNlcmlvKTsKIAkJCWdvdG8gb3V0OwogCQljYXNlIEFUS0JEX1JFVF9FTVVMMDoKIAkJCWF0a2JkLT5lbXVsID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvY29yZ2lrYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvY29yZ2lrYmQuYwppbmRleCA2NDY3MmQ0Li5lMzAxZWU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2Nvcmdpa2JkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9jb3JnaWtiZC5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAKICNpbmNsdWRlIDxhc20vYXJjaC9jb3JnaS5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CkBAIC0zNDMsMTAgKzM0Miw5IEBACiAJZm9yIChpID0gMDsgaSA8IENPUkdJX0tFWV9TRU5TRV9OVU07IGkrKykgewogCQlweGFfZ3Bpb19tb2RlKENPUkdJX0dQSU9fS0VZX1NFTlNFKGkpIHwgR1BJT19JTik7CiAJCWlmIChyZXF1ZXN0X2lycShDT1JHSV9JUlFfR1BJT19LRVlfU0VOU0UoaSksIGNvcmdpa2JkX2ludGVycnVwdCwKLQkJCQkJCVNBX0lOVEVSUlVQVCwgImNvcmdpa2JkIiwgY29yZ2lrYmQpKQorCQkJCVNBX0lOVEVSUlVQVCB8IFNBX1RSSUdHRVJfUklTSU5HLAorCQkJCSJjb3JnaWtiZCIsIGNvcmdpa2JkKSkKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNvcmdpa2JkOiBDYW4ndCBnZXQgSVJROiAlZCFcbiIsIGkpOwotCQllbHNlCi0JCQlzZXRfaXJxX3R5cGUoQ09SR0lfSVJRX0dQSU9fS0VZX1NFTlNFKGkpLElSUVRfUklTSU5HKTsKIAl9CiAKIAkvKiBTZXQgU3Ryb2JlIGxpbmVzIGFzIG91dHB1dHMgLSBzZXQgaGlnaCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zcGl0emtiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zcGl0emtiZC5jCmluZGV4IDZhMTVmZTMuLjgzOTk5ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvc3BpdHprYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3NwaXR6a2JkLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAogI2luY2x1ZGUgPGFzbS9hcmNoL3NwaXR6Lmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KQEAgLTQwNywxMCArNDA2LDkgQEAKIAlmb3IgKGkgPSAwOyBpIDwgU1BJVFpfS0VZX1NFTlNFX05VTTsgaSsrKSB7CiAJCXB4YV9ncGlvX21vZGUoc3BpdHpfc2Vuc2VzW2ldIHwgR1BJT19JTik7CiAJCWlmIChyZXF1ZXN0X2lycShJUlFfR1BJTyhzcGl0el9zZW5zZXNbaV0pLCBzcGl0emtiZF9pbnRlcnJ1cHQsCi0JCQkJCQlTQV9JTlRFUlJVUFQsICJTcGl0emtiZCBTZW5zZSIsIHNwaXR6a2JkKSkKKwkJCQlTQV9JTlRFUlJVUFR8U0FfVFJJR0dFUl9SSVNJTkcsCisJCQkJIlNwaXR6a2JkIFNlbnNlIiwgc3BpdHprYmQpKQogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic3BpdHprYmQ6IENhbid0IGdldCBTZW5zZSBJUlE6ICVkIVxuIiwgaSk7Ci0JCWVsc2UKLQkJCXNldF9pcnFfdHlwZShJUlFfR1BJTyhzcGl0el9zZW5zZXNbaV0pLElSUVRfUklTSU5HKTsKIAl9CiAKIAkvKiBTZXQgU3Ryb2JlIGxpbmVzIGFzIG91dHB1dHMgLSBzZXQgaGlnaCAqLwpAQCAtNDIyLDE1ICs0MjAsMTggQEAKIAlweGFfZ3Bpb19tb2RlKFNQSVRaX0dQSU9fU1dBIHwgR1BJT19JTik7CiAJcHhhX2dwaW9fbW9kZShTUElUWl9HUElPX1NXQiB8IEdQSU9fSU4pOwogCi0JcmVxdWVzdF9pcnEoU1BJVFpfSVJRX0dQSU9fU1lOQywgc3BpdHprYmRfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsICJTcGl0emtiZCBTeW5jIiwgc3BpdHprYmQpOwotCXJlcXVlc3RfaXJxKFNQSVRaX0lSUV9HUElPX09OX0tFWSwgc3BpdHprYmRfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsICJTcGl0emtiZCBQd3JPbiIsIHNwaXR6a2JkKTsKLQlyZXF1ZXN0X2lycShTUElUWl9JUlFfR1BJT19TV0EsIHNwaXR6a2JkX2hpbmdlX2lzciwgU0FfSU5URVJSVVBULCAiU3BpdHprYmQgU1dBIiwgc3BpdHprYmQpOwotCXJlcXVlc3RfaXJxKFNQSVRaX0lSUV9HUElPX1NXQiwgc3BpdHprYmRfaGluZ2VfaXNyLCBTQV9JTlRFUlJVUFQsICJTcGl0emtiZCBTV0IiLCBzcGl0emtiZCk7Ci0KLQlzZXRfaXJxX3R5cGUoU1BJVFpfSVJRX0dQSU9fU1lOQywgSVJRVF9CT1RIRURHRSk7Ci0Jc2V0X2lycV90eXBlKFNQSVRaX0lSUV9HUElPX09OX0tFWSwgSVJRVF9CT1RIRURHRSk7Ci0Jc2V0X2lycV90eXBlKFNQSVRaX0lSUV9HUElPX1NXQSwgSVJRVF9CT1RIRURHRSk7Ci0Jc2V0X2lycV90eXBlKFNQSVRaX0lSUV9HUElPX1NXQiwgSVJRVF9CT1RIRURHRSk7CisJcmVxdWVzdF9pcnEoU1BJVFpfSVJRX0dQSU9fU1lOQywgc3BpdHprYmRfaW50ZXJydXB0LAorCQkgICAgU0FfSU5URVJSVVBUIHwgU0FfVFJJR0dFUl9SSVNJTkcgfCBTQV9UUklHR0VSX0ZBTExJTkcsCisJCSAgICAiU3BpdHprYmQgU3luYyIsIHNwaXR6a2JkKTsKKwlyZXF1ZXN0X2lycShTUElUWl9JUlFfR1BJT19PTl9LRVksIHNwaXR6a2JkX2ludGVycnVwdCwKKwkJICAgIFNBX0lOVEVSUlVQVCB8IFNBX1RSSUdHRVJfUklTSU5HIHwgU0FfVFJJR0dFUl9GQUxMSU5HLAorCQkgICAgIlNwaXR6a2JkIFB3ck9uIiwgc3BpdHprYmQpOworCXJlcXVlc3RfaXJxKFNQSVRaX0lSUV9HUElPX1NXQSwgc3BpdHprYmRfaGluZ2VfaXNyLAorCQkgICAgU0FfSU5URVJSVVBUIHwgU0FfVFJJR0dFUl9SSVNJTkcgfCBTQV9UUklHR0VSX0ZBTExJTkcsCisJCSAgICAiU3BpdHprYmQgU1dBIiwgc3BpdHprYmQpOworCXJlcXVlc3RfaXJxKFNQSVRaX0lSUV9HUElPX1NXQiwgc3BpdHprYmRfaGluZ2VfaXNyLAorCQkgICAgU0FfSU5URVJSVVBUIHwgU0FfVFJJR0dFUl9SSVNJTkcgfCBTQV9UUklHR0VSX0ZBTExJTkcsCisJCSAgICAiU3BpdHprYmQgU1dCIiwgc3BpdHprYmQpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiaW5wdXQ6IFNwaXR6IEtleWJvYXJkIFJlZ2lzdGVyZWRcbiIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvaHBfc2RjX3J0Yy5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2hwX3NkY19ydGMuYwppbmRleCAxY2Q3NjU3Li4xYmU5NjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvaHBfc2RjX3J0Yy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9ocF9zZGNfcnRjLmMKQEAgLTYwLDggKzYwLDYgQEAKIAogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGhwX3NkY19ydGNfd2FpdCk7CiAKLXN0YXRpYyBsb2ZmX3QgaHBfc2RjX3J0Y19sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pOwotCiBzdGF0aWMgc3NpemVfdCBocF9zZGNfcnRjX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1ZiwKIAkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CiAKQEAgLTM4NywxMSArMzg1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGxvZmZfdCBocF9zZGNfcnRjX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKLXsKLSAgICAgICAgcmV0dXJuIC1FU1BJUEU7Ci19Ci0KIHN0YXRpYyBzc2l6ZV90IGhwX3NkY19ydGNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLAogCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKSB7CiAJc3NpemVfdCByZXR2YWw7CkBAIC02NzksNyArNjcyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaHBfc2RjX3J0Y19mb3BzID0gewogICAgICAgICAub3duZXIgPQlUSElTX01PRFVMRSwKLSAgICAgICAgLmxsc2VlayA9CWhwX3NkY19ydGNfbGxzZWVrLAorICAgICAgICAubGxzZWVrID0Jbm9fbGxzZWVrLAogICAgICAgICAucmVhZCA9CQlocF9zZGNfcnRjX3JlYWQsCiAgICAgICAgIC5wb2xsID0JCWhwX3NkY19ydGNfcG9sbCwKICAgICAgICAgLmlvY3RsID0JaHBfc2RjX3J0Y19pb2N0bCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9tNjhrc3Brci5jIGIvZHJpdmVycy9pbnB1dC9taXNjL202OGtzcGtyLmMKaW5kZXggMDQ0ODlhZC4uOGQ2YzM4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL202OGtzcGtyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL202OGtzcGtyLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCkBAIC0yNCw3ICsyNSw3IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIm02OGsgYmVlcGVyIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1zdGF0aWMgc3RydWN0IGlucHV0X2RldiAqbTY4a3Nwa3JfZGV2Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm02OGtzcGtyX3BsYXRmb3JtX2RldmljZTsKIAogc3RhdGljIGludCBtNjhrc3Brcl9ldmVudChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKQogewpAQCAtNDcsMzYgKzQ4LDEwMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBtNjhrc3Brcl9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtNjhrc3Brcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7Ci0gICAgICAgIGlmICghbWFjaF9iZWVwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIm02OGtzcGtyOiBubyBsb3dsZXZlbCBiZWVwIHN1cHBvcnRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLSAgICAgICAgfQorCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlpbnQgZXJyOwogCi0JbTY4a3Nwa3JfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7Ci0JaWYgKCFtNjhrc3Brcl9kZXYpCisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFpbnB1dF9kZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbTY4a3Nwa3JfZGV2LT5uYW1lID0gIm02OGsgYmVlcGVyIjsKLQltNjhrc3Brcl9kZXYtPnBoeXMgPSAibTY4ay9nZW5lcmljIjsKLQltNjhrc3Brcl9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKLQltNjhrc3Brcl9kZXYtPmlkLnZlbmRvciA9IDB4MDAxZjsKLQltNjhrc3Brcl9kZXYtPmlkLnByb2R1Y3QgPSAweDAwMDE7Ci0JbTY4a3Nwa3JfZGV2LT5pZC52ZXJzaW9uID0gMHgwMTAwOworCWlucHV0X2Rldi0+bmFtZSA9ICJtNjhrIGJlZXBlciI7CisJaW5wdXRfZGV2LT5waHlzID0gIm02OGsvZ2VuZXJpYyI7CisJaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7CisJaW5wdXRfZGV2LT5pZC52ZW5kb3IgID0gMHgwMDFmOworCWlucHV0X2Rldi0+aWQucHJvZHVjdCA9IDB4MDAwMTsKKwlpbnB1dF9kZXYtPmlkLnZlcnNpb24gPSAweDAxMDA7CisJaW5wdXRfZGV2LT5jZGV2LmRldiA9ICZkZXYtPmRldjsKIAotCW02OGtzcGtyX2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfU05EKTsKLQltNjhrc3Brcl9kZXYtPnNuZGJpdFswXSA9IEJJVChTTkRfQkVMTCkgfCBCSVQoU05EX1RPTkUpOwotCW02OGtzcGtyX2Rldi0+ZXZlbnQgPSBtNjhrc3Brcl9ldmVudDsKKwlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUKEVWX1NORCk7CisJaW5wdXRfZGV2LT5zbmRiaXRbMF0gPSBCSVQoU05EX0JFTEwpIHwgQklUKFNORF9UT05FKTsKKwlpbnB1dF9kZXYtPmV2ZW50ID0gbTY4a3Nwa3JfZXZlbnQ7CiAKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UobTY4a3Nwa3JfZGV2KTsKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKKwlpZiAoZXJyKSB7CisJCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisJCXJldHVybiBlcnI7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBpbnB1dF9kZXYpOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgX19kZXZleGl0IG02OGtzcGtyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKwkvKiB0dXJuIG9mZiB0aGUgc3BlYWtlciAqLworCW02OGtzcGtyX2V2ZW50KE5VTEwsIEVWX1NORCwgU05EX0JFTEwsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG02OGtzcGtyX3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwkvKiB0dXJuIG9mZiB0aGUgc3BlYWtlciAqLworCW02OGtzcGtyX2V2ZW50KE5VTEwsIEVWX1NORCwgU05EX0JFTEwsIDApOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtNjhrc3Brcl9wbGF0Zm9ybV9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gIm02OGtzcGtyIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gbTY4a3Nwa3JfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtNjhrc3Brcl9yZW1vdmUpLAorCS5zaHV0ZG93bgk9IG02OGtzcGtyX3NodXRkb3duLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbTY4a3Nwa3JfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlpZiAoIW1hY2hfYmVlcCkgeworCQlwcmludGsoS0VSTl9JTkZPICJtNjhrc3Brcjogbm8gbG93bGV2ZWwgYmVlcCBzdXBwb3J0XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisgICAgICAgIH0KKworCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbTY4a3Nwa3JfcGxhdGZvcm1fZHJpdmVyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJbTY4a3Nwa3JfcGxhdGZvcm1fZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJtNjhrc3BrciIsIC0xKTsKKwlpZiAoIW02OGtzcGtyX3BsYXRmb3JtX2RldmljZSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl91bnJlZ2lzdGVyX2RyaXZlcjsKKwl9CisKKwllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKG02OGtzcGtyX3BsYXRmb3JtX2RldmljZSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZV9kZXZpY2U7CisKKwlyZXR1cm4gMDsKKworIGVycl9mcmVlX2RldmljZToKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KG02OGtzcGtyX3BsYXRmb3JtX2RldmljZSk7CisgZXJyX3VucmVnaXN0ZXJfZHJpdmVyOgorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtNjhrc3Brcl9wbGF0Zm9ybV9kcml2ZXIpOworCisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIHZvaWQgX19leGl0IG02OGtzcGtyX2V4aXQodm9pZCkKIHsKLSAgICAgICAgaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UobTY4a3Nwa3JfZGV2KTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihtNjhrc3Brcl9wbGF0Zm9ybV9kZXZpY2UpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtNjhrc3Brcl9wbGF0Zm9ybV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChtNjhrc3Brcl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9wY3Nwa3IuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9wY3Nwa3IuYwppbmRleCA2OGFjOTdmLi4xZWY0NzdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvcGNzcGtyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL3Bjc3Brci5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtLzgyNTNwaXQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIApAQCAtMjMsOCArMjQsNyBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJQQyBTcGVha2VyIGJlZXBlciBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotc3RhdGljIHN0cnVjdCBpbnB1dF9kZXYgKnBjc3Brcl9kZXY7Ci0KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwY3Nwa3JfcGxhdGZvcm1fZGV2aWNlOwogc3RhdGljIERFRklORV9TUElOTE9DSyhpODI1M19iZWVwX2xvY2spOwogCiBzdGF0aWMgaW50IHBjc3Brcl9ldmVudChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKQpAQCAtNjQsOCArNjQsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgcGNzcGtyX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBjc3Brcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IGlucHV0X2RldiAqcGNzcGtyX2RldjsKKwlpbnQgZXJyOworCiAJcGNzcGtyX2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwogCWlmICghcGNzcGtyX2RldikKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC03NiwyMSArNzksOTIgQEAKIAlwY3Nwa3JfZGV2LT5pZC52ZW5kb3IgPSAweDAwMWY7CiAJcGNzcGtyX2Rldi0+aWQucHJvZHVjdCA9IDB4MDAwMTsKIAlwY3Nwa3JfZGV2LT5pZC52ZXJzaW9uID0gMHgwMTAwOworCXBjc3Brcl9kZXYtPmNkZXYuZGV2ID0gJmRldi0+ZGV2OwogCiAJcGNzcGtyX2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfU05EKTsKIAlwY3Nwa3JfZGV2LT5zbmRiaXRbMF0gPSBCSVQoU05EX0JFTEwpIHwgQklUKFNORF9UT05FKTsKIAlwY3Nwa3JfZGV2LT5ldmVudCA9IHBjc3Brcl9ldmVudDsKIAotCWlucHV0X3JlZ2lzdGVyX2RldmljZShwY3Nwa3JfZGV2KTsKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UocGNzcGtyX2Rldik7CisJaWYgKGVycikgeworCQlpbnB1dF9mcmVlX2RldmljZShwY3Nwa3JfZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIHBjc3Brcl9kZXYpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBwY3Nwa3JfZXhpdCh2b2lkKQorc3RhdGljIGludCBfX2RldmV4aXQgcGNzcGtyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7Ci0gICAgICAgIGlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHBjc3Brcl9kZXYpOworCXN0cnVjdCBpbnB1dF9kZXYgKnBjc3Brcl9kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UocGNzcGtyX2Rldik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKIAkvKiB0dXJuIG9mZiB0aGUgc3BlYWtlciAqLwogCXBjc3Brcl9ldmVudChOVUxMLCBFVl9TTkQsIFNORF9CRUxMLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjc3Brcl9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXBjc3Brcl9ldmVudChOVUxMLCBFVl9TTkQsIFNORF9CRUxMLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwY3Nwa3Jfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCS8qIHR1cm4gb2ZmIHRoZSBzcGVha2VyICovCisJcGNzcGtyX2V2ZW50KE5VTEwsIEVWX1NORCwgU05EX0JFTEwsIDApOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwY3Nwa3JfcGxhdGZvcm1fZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJwY3Nwa3IiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBwY3Nwa3JfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChwY3Nwa3JfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IHBjc3Brcl9zdXNwZW5kLAorCS5zaHV0ZG93bgk9IHBjc3Brcl9zaHV0ZG93biwKK307CisKKworc3RhdGljIGludCBfX2luaXQgcGNzcGtyX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwY3Nwa3JfcGxhdGZvcm1fZHJpdmVyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcGNzcGtyX3BsYXRmb3JtX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygicGNzcGtyIiwgLTEpOworCWlmICghcGNzcGtyX3BsYXRmb3JtX2RldmljZSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl91bnJlZ2lzdGVyX2RyaXZlcjsKKwl9CisKKwllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBjc3Brcl9wbGF0Zm9ybV9kZXZpY2UpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2ZyZWVfZGV2aWNlOworCisJcmV0dXJuIDA7CisKKyBlcnJfZnJlZV9kZXZpY2U6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChwY3Nwa3JfcGxhdGZvcm1fZGV2aWNlKTsKKyBlcnJfdW5yZWdpc3Rlcl9kcml2ZXI6CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBjc3Brcl9wbGF0Zm9ybV9kcml2ZXIpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBjc3Brcl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGNzcGtyX3BsYXRmb3JtX2RldmljZSk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBjc3Brcl9wbGF0Zm9ybV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChwY3Nwa3JfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2Mvc3BhcmNzcGtyLmMgYi9kcml2ZXJzL2lucHV0L21pc2Mvc3BhcmNzcGtyLmMKaW5kZXggMjlkOTdiMS4uZjBmZDJjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL3NwYXJjc3Brci5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9zcGFyY3Nwa3IuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9lYnVzLmg+CkBAIC0yMCwyMiArMjEsMTAgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiU3BhcmMgU3BlYWtlciBiZWVwZXIgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKK2NvbnN0IGNoYXIgKmJlZXBfbmFtZTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGJlZXBfaW9iYXNlOwotc3RhdGljIHN0cnVjdCBpbnB1dF9kZXYgKnNwYXJjc3Brcl9kZXY7Ci0KLURFRklORV9TUElOTE9DSyhiZWVwX2xvY2spOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9zcGFyY3Nwa3Jfc3RydWN0KHZvaWQpCi17Ci0Jc3BhcmNzcGtyX2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfU05EKTsKLQlzcGFyY3Nwa3JfZGV2LT5zbmRiaXRbMF0gPSBCSVQoU05EX0JFTEwpIHwgQklUKFNORF9UT05FKTsKLQotCXNwYXJjc3Brcl9kZXYtPnBoeXMgPSAic3BhcmMvaW5wdXQwIjsKLQlzcGFyY3Nwa3JfZGV2LT5pZC5idXN0eXBlID0gQlVTX0lTQTsKLQlzcGFyY3Nwa3JfZGV2LT5pZC52ZW5kb3IgPSAweDAwMWY7Ci0Jc3BhcmNzcGtyX2Rldi0+aWQucHJvZHVjdCA9IDB4MDAwMTsKLQlzcGFyY3Nwa3JfZGV2LT5pZC52ZXJzaW9uID0gMHgwMTAwOwotfQorc3RhdGljIGludCAoKmJlZXBfZXZlbnQpKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpOworc3RhdGljIERFRklORV9TUElOTE9DSyhiZWVwX2xvY2spOwogCiBzdGF0aWMgaW50IGVidXNfc3Brcl9ldmVudChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKQogewpAQCAtNTksMzkgKzQ4LDE2IEBACiAJLyogRUJVUyBzcGVha2VyIG9ubHkgaGFzIG9uL29mZiBzdGF0ZSwgdGhlIGZyZXF1ZW5jeSBkb2VzIG5vdAogCSAqIGFwcGVhciB0byBiZSBwcm9ncmFtbWFibGUuCiAJICovCi0JaWYgKGNvdW50KSB7Ci0JCWlmIChiZWVwX2lvYmFzZSAmIDB4MlVMKQotCQkJb3V0YigxLCBiZWVwX2lvYmFzZSk7Ci0JCWVsc2UKLQkJCW91dGwoMSwgYmVlcF9pb2Jhc2UpOwotCX0gZWxzZSB7Ci0JCWlmIChiZWVwX2lvYmFzZSAmIDB4MlVMKQotCQkJb3V0YigwLCBiZWVwX2lvYmFzZSk7Ci0JCWVsc2UKLQkJCW91dGwoMCwgYmVlcF9pb2Jhc2UpOwotCX0KKwlpZiAoYmVlcF9pb2Jhc2UgJiAweDJVTCkKKwkJb3V0YighIWNvdW50LCBiZWVwX2lvYmFzZSk7CisJZWxzZQorCQlvdXRsKCEhY291bnQsIGJlZXBfaW9iYXNlKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJlZXBfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGluaXRfZWJ1c19iZWVwKHN0cnVjdCBsaW51eF9lYnVzX2RldmljZSAqZWRldikKLXsKLQliZWVwX2lvYmFzZSA9IGVkZXYtPnJlc291cmNlWzBdLnN0YXJ0OwotCi0Jc3BhcmNzcGtyX2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwotCWlmICghc3BhcmNzcGtyX2RldikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzcGFyY3Nwa3JfZGV2LT5uYW1lID0gIlNwYXJjIEVCVVMgU3BlYWtlciI7Ci0Jc3BhcmNzcGtyX2Rldi0+ZXZlbnQgPSBlYnVzX3Nwa3JfZXZlbnQ7Ci0KLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoc3BhcmNzcGtyX2Rldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQogI2lmZGVmIENPTkZJR19TUEFSQzY0CiBzdGF0aWMgaW50IGlzYV9zcGtyX2V2ZW50KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpCiB7CkBAIC0xMjksMzAgKzk1LDEwMyBAQAogCiAJcmV0dXJuIDA7CiB9CisjZW5kaWYKIAotc3RhdGljIGludCBfX2luaXQgaW5pdF9pc2FfYmVlcChzdHJ1Y3Qgc3BhcmNfaXNhX2RldmljZSAqaXNhX2RldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNwYXJjc3Brcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7Ci0JYmVlcF9pb2Jhc2UgPSBpc2FfZGV2LT5yZXNvdXJjZS5zdGFydDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CisJaW50IGVycm9yOwogCi0Jc3BhcmNzcGtyX2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwotCWlmICghc3BhcmNzcGtyX2RldikKKwlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWlucHV0X2RldikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpbml0X3NwYXJjc3Brcl9zdHJ1Y3QoKTsKKwlpbnB1dF9kZXYtPm5hbWUgPSBiZWVwX25hbWU7CisJaW5wdXRfZGV2LT5waHlzID0gInNwYXJjL2lucHV0MCI7CisJaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX0lTQTsKKwlpbnB1dF9kZXYtPmlkLnZlbmRvciA9IDB4MDAxZjsKKwlpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSAweDAwMDE7CisJaW5wdXRfZGV2LT5pZC52ZXJzaW9uID0gMHgwMTAwOworCWlucHV0X2Rldi0+Y2Rldi5kZXYgPSAmZGV2LT5kZXY7CiAKLQlzcGFyY3Nwa3JfZGV2LT5uYW1lID0gIlNwYXJjIElTQSBTcGVha2VyIjsKLQlzcGFyY3Nwa3JfZGV2LT5ldmVudCA9IGlzYV9zcGtyX2V2ZW50OworCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfU05EKTsKKwlpbnB1dF9kZXYtPnNuZGJpdFswXSA9IEJJVChTTkRfQkVMTCkgfCBCSVQoU05EX1RPTkUpOwogCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHNwYXJjc3Brcl9kZXYpOworCWlucHV0X2Rldi0+ZXZlbnQgPSBiZWVwX2V2ZW50OworCisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgaW5wdXRfZGV2KTsKIAogCXJldHVybiAwOwogfQotI2VuZGlmCisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHNwYXJjc3Brcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisJLyogdHVybiBvZmYgdGhlIHNwZWFrZXIgKi8KKwliZWVwX2V2ZW50KE5VTEwsIEVWX1NORCwgU05EX0JFTEwsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNwYXJjc3Brcl9zaHV0ZG93bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJLyogdHVybiBvZmYgdGhlIHNwZWFrZXIgKi8KKwliZWVwX2V2ZW50KE5VTEwsIEVWX1NORCwgU05EX0JFTEwsIDApOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzcGFyY3Nwa3JfcGxhdGZvcm1fZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJzcGFyY3Nwa3IiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBzcGFyY3Nwa3JfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzcGFyY3Nwa3JfcmVtb3ZlKSwKKwkuc2h1dGRvd24JPSBzcGFyY3Nwa3Jfc2h1dGRvd24sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc3BhcmNzcGtyX3BsYXRmb3JtX2RldmljZTsKKworc3RhdGljIGludCBfX2luaXQgc3BhcmNzcGtyX2Rydl9pbml0KHZvaWQpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNwYXJjc3Brcl9wbGF0Zm9ybV9kcml2ZXIpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJc3BhcmNzcGtyX3BsYXRmb3JtX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic3BhcmNzcGtyIiwgLTEpOworCWlmICghc3BhcmNzcGtyX3BsYXRmb3JtX2RldmljZSkgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3VucmVnaXN0ZXJfZHJpdmVyOworCX0KKworCWVycm9yID0gcGxhdGZvcm1fZGV2aWNlX2FkZChzcGFyY3Nwa3JfcGxhdGZvcm1fZGV2aWNlKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyX2ZyZWVfZGV2aWNlOworCisJcmV0dXJuIDA7CisKKyBlcnJfZnJlZV9kZXZpY2U6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChzcGFyY3Nwa3JfcGxhdGZvcm1fZGV2aWNlKTsKKyBlcnJfdW5yZWdpc3Rlcl9kcml2ZXI6CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNwYXJjc3Brcl9wbGF0Zm9ybV9kcml2ZXIpOworCisJcmV0dXJuIGVycm9yOworfQogCiBzdGF0aWMgaW50IF9faW5pdCBzcGFyY3Nwa3JfaW5pdCh2b2lkKQogewogCXN0cnVjdCBsaW51eF9lYnVzICplYnVzOwotCXN0cnVjdCBsaW51eF9lYnVzX2RldmljZSAqZWRldiA9IE5VTEw7CisJc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlICplZGV2OwogI2lmZGVmIENPTkZJR19TUEFSQzY0CiAJc3RydWN0IHNwYXJjX2lzYV9icmlkZ2UgKmlzYV9icjsKIAlzdHJ1Y3Qgc3BhcmNfaXNhX2RldmljZSAqaXNhX2RldjsKQEAgLTE2MCw4ICsxOTksMTIgQEAKIAogCWZvcl9lYWNoX2VidXMoZWJ1cykgewogCQlmb3JfZWFjaF9lYnVzZGV2KGVkZXYsIGVidXMpIHsKLQkJCWlmICghc3RyY21wKGVkZXYtPnByb21fbmFtZSwgImJlZXAiKSkKLQkJCQlyZXR1cm4gaW5pdF9lYnVzX2JlZXAoZWRldik7CisJCQlpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25hbWUsICJiZWVwIikpIHsKKwkJCQliZWVwX25hbWUgPSAiU3BhcmMgRUJVUyBTcGVha2VyIjsKKwkJCQliZWVwX2V2ZW50ID0gZWJ1c19zcGtyX2V2ZW50OworCQkJCWJlZXBfaW9iYXNlID0gZWRldi0+cmVzb3VyY2VbMF0uc3RhcnQ7CisJCQkJcmV0dXJuIHNwYXJjc3Brcl9kcnZfaW5pdCgpOworCQkJfQogCQl9CiAJfQogI2lmZGVmIENPTkZJR19TUEFSQzY0CkBAIC0xNzAsOCArMjEzLDEyIEBACiAJCQkvKiBBIGhhY2ssIHRoZSBiZWVwIGRldmljZSdzIGJhc2UgbGl2ZXMgaW4KIAkJCSAqIHRoZSBETUEgaXNhIG5vZGUuCiAJCQkgKi8KLQkJCWlmICghc3RyY21wKGlzYV9kZXYtPnByb21fbmFtZSwgImRtYSIpKQotCQkJCXJldHVybiBpbml0X2lzYV9iZWVwKGlzYV9kZXYpOworCQkJaWYgKCFzdHJjbXAoaXNhX2Rldi0+cHJvbV9uYW1lLCAiZG1hIikpIHsKKwkJCQliZWVwX25hbWUgPSAiU3BhcmMgSVNBIFNwZWFrZXIiOworCQkJCWJlZXBfZXZlbnQgPSBpc2Ffc3Brcl9ldmVudCwKKwkJCQliZWVwX2lvYmFzZSA9IGlzYV9kZXYtPnJlc291cmNlLnN0YXJ0OworCQkJCXJldHVybiBzcGFyY3Nwa3JfZHJ2X2luaXQoKTsKKwkJCX0KIAkJfQogCX0KICNlbmRpZgpAQCAtMTgxLDcgKzIyOCw4IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzcGFyY3Nwa3JfZXhpdCh2b2lkKQogewotCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHNwYXJjc3Brcl9kZXYpOworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNwYXJjc3Brcl9wbGF0Zm9ybV9kZXZpY2UpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzcGFyY3Nwa3JfcGxhdGZvcm1fZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoc3BhcmNzcGtyX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL3dpc3Ryb25fYnRucy5jIGIvZHJpdmVycy9pbnB1dC9taXNjL3dpc3Ryb25fYnRucy5jCmluZGV4IGJhYzMwODUuLjRiNDE1ZDliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2Mvd2lzdHJvbl9idG5zLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL3dpc3Ryb25fYnRucy5jCkBAIC05MiwxMSArOTIsMTEgQEAKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCi1zdGF0aWMgc2l6ZV90IF9faW5pdCBsb2NhdGVfd2lzdHJvbl9iaW9zKHZvaWQgX19pb21lbSAqYmFzZSkKK3N0YXRpYyBzc2l6ZV90IF9faW5pdCBsb2NhdGVfd2lzdHJvbl9iaW9zKHZvaWQgX19pb21lbSAqYmFzZSkKIHsKIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBfX2luaXRkYXRhIHNpZ25hdHVyZVtdID0KIAkJeyAweDQyLCAweDIxLCAweDU1LCAweDMwIH07Ci0Jc2l6ZV90IG9mZnNldDsKKwlzc2l6ZV90IG9mZnNldDsKIAogCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgMHgxMDAwMDsgb2Zmc2V0ICs9IDB4MTApIHsKIAkJaWYgKGNoZWNrX3NpZ25hdHVyZShiYXNlICsgb2Zmc2V0LCBzaWduYXR1cmUsCkBAIC0xMDksNyArMTA5LDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IG1hcF9iaW9zKHZvaWQpCiB7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwotCXNpemVfdCBvZmZzZXQ7CisJc3NpemVfdCBvZmZzZXQ7CiAJdTMyIGVudHJ5X3BvaW50OwogCiAJYmFzZSA9IGlvcmVtYXAoMHhGMDAwMCwgMHgxMDAwMCk7IC8qIENhbid0IGZhaWwgKi8KQEAgLTE3NCw3ICsxNzQsNyBAQAogCXJldHVybiByZWdzLmVheDsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGJpb3NfYXR0YWNoKHZvaWQpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgYmlvc19hdHRhY2godm9pZCkKIHsKIAlzdHJ1Y3QgcmVncyByZWdzOwogCkBAIC0xOTQsNyArMTk0LDcgQEAKIAljYWxsX2Jpb3MoJnJlZ3MpOwogfQogCi1zdGF0aWMgdTggX19pbml0IGJpb3NfZ2V0X2Ntb3NfYWRkcmVzcyh2b2lkKQorc3RhdGljIHU4IF9fZGV2aW5pdCBiaW9zX2dldF9jbW9zX2FkZHJlc3Modm9pZCkKIHsKIAlzdHJ1Y3QgcmVncyByZWdzOwogCkBAIC0yMDYsNyArMjA2LDcgQEAKIAlyZXR1cm4gcmVncy5lY3g7CiB9CiAKLXN0YXRpYyB1MTYgX19pbml0IGJpb3NfZ2V0X2RlZmF1bHRfc2V0dGluZyh1OCBzdWJzeXMpCitzdGF0aWMgdTE2IF9fZGV2aW5pdCBiaW9zX2dldF9kZWZhdWx0X3NldHRpbmcodTggc3Vic3lzKQogewogCXN0cnVjdCByZWdzIHJlZ3M7CiAKQEAgLTI5Niw2ICsyOTYsMTYgQEAKIAl7IEtFX0VORCwgMCB9CiB9OwogCitzdGF0aWMgc3RydWN0IGtleV9lbnRyeSBrZXltYXBfYWNlcl90cmF2ZWxtYXRlXzI0MFtdID0geworCXsgS0VfS0VZLCAweDMxLCBLRVlfTUFJTCB9LAorCXsgS0VfS0VZLCAweDM2LCBLRVlfV1dXIH0sCisJeyBLRV9LRVksIDB4MTEsIEtFWV9QUk9HMSB9LAorCXsgS0VfS0VZLCAweDEyLCBLRVlfUFJPRzIgfSwKKwl7IEtFX0JMVUVUT09USCwgMHg0NCwgMCB9LAorCXsgS0VfV0lGSSwgMHgzMCwgMCB9LAorCXsgS0VfRU5ELCAwIH0KK307CisKIC8qCiAgKiBJZiB5b3VyIG1hY2hpbmUgaXMgbm90IGhlcmUgKHdoaWNoIGlzIGN1cnJlbnRseSByYXRoZXIgbGlrZWx5KSwgcGxlYXNlIHNlbmQKICAqIGEgbGlzdCBvZiBidXR0b25zIGFuZCB0aGVpciBrZXkgY29kZXMgKHJlcG9ydGVkIHdoZW4gbG9hZGluZyB0aGlzIG1vZHVsZQpAQCAtMzIwLDYgKzMzMCwxNSBAQAogCQl9LAogCQkuZHJpdmVyX2RhdGEgPSBrZXltYXBfYWNlcl9hc3BpcmVfMTUwMAogCX0sCisJeworCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKKwkJLmlkZW50ID0gIkFjZXIgVHJhdmVsTWF0ZSAyNDAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVHJhdmVsTWF0ZSAyNDAiKSwKKwkJfSwKKwkJLmRyaXZlcl9kYXRhID0ga2V5bWFwX2FjZXJfdHJhdmVsbWF0ZV8yNDAKKwl9LAogCXsgTlVMTCwgfQogfTsKIApAQCAtMzQ4LDcgKzM2Nyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CiAKLXN0YXRpYyBpbnQgX19pbml0IHNldHVwX2lucHV0X2Rldih2b2lkKQorc3RhdGljIGludCBfX2RldmluaXQgc2V0dXBfaW5wdXRfZGV2KHZvaWQpCiB7CiAJY29uc3Qgc3RydWN0IGtleV9lbnRyeSAqa2V5OwogCWludCBlcnJvcjsKQEAgLTQ0Nyw2ICs0NjYsNTIgQEAKIAltb2RfdGltZXIoJnBvbGxfdGltZXIsIGppZmZpZXMgKyBIWiAvIFBPTExfRlJFUVVFTkNZKTsKIH0KIAorc3RhdGljIGludCBfX2RldmluaXQgd2lzdHJvbl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJaW50IGVyciA9IHNldHVwX2lucHV0X2RldigpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwliaW9zX2F0dGFjaCgpOworCWNtb3NfYWRkcmVzcyA9IGJpb3NfZ2V0X2Ntb3NfYWRkcmVzcygpOworCisJaWYgKGhhdmVfd2lmaSkgeworCQl1MTYgd2lmaSA9IGJpb3NfZ2V0X2RlZmF1bHRfc2V0dGluZyhXSUZJKTsKKwkJaWYgKHdpZmkgJiAxKQorCQkJd2lmaV9lbmFibGVkID0gKHdpZmkgJiAyKSA/IDEgOiAwOworCQllbHNlCisJCQloYXZlX3dpZmkgPSAwOworCisJCWlmIChoYXZlX3dpZmkpCisJCQliaW9zX3NldF9zdGF0ZShXSUZJLCB3aWZpX2VuYWJsZWQpOworCX0KKworCWlmIChoYXZlX2JsdWV0b290aCkgeworCQl1MTYgYnQgPSBiaW9zX2dldF9kZWZhdWx0X3NldHRpbmcoQkxVRVRPT1RIKTsKKwkJaWYgKGJ0ICYgMSkKKwkJCWJsdWV0b290aF9lbmFibGVkID0gKGJ0ICYgMikgPyAxIDogMDsKKwkJZWxzZQorCQkJaGF2ZV9ibHVldG9vdGggPSAwOworCisJCWlmIChoYXZlX2JsdWV0b290aCkKKwkJCWJpb3Nfc2V0X3N0YXRlKEJMVUVUT09USCwgYmx1ZXRvb3RoX2VuYWJsZWQpOworCX0KKworCXBvbGxfYmlvcygxKTsgLyogRmx1c2ggc3RhbGUgZXZlbnQgcXVldWUgYW5kIGFybSB0aW1lciAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHdpc3Ryb25fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlkZWxfdGltZXJfc3luYygmcG9sbF90aW1lcik7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKKwliaW9zX2RldGFjaCgpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgd2lzdHJvbl9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCWRlbF90aW1lcl9zeW5jKCZwb2xsX3RpbWVyKTsKQEAgLTQ3MiwxMyArNTM3LDIwIEBACiAKIAlyZXR1cm4gMDsKIH0KKyNlbHNlCisjZGVmaW5lIHdpc3Ryb25fc3VzcGVuZAkJTlVMTAorI2RlZmluZSB3aXN0cm9uX3Jlc3VtZQkJTlVMTAorI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdpc3Ryb25fZHJpdmVyID0gewotCS5zdXNwZW5kCT0gd2lzdHJvbl9zdXNwZW5kLAotCS5yZXN1bWUJCT0gd2lzdHJvbl9yZXN1bWUsCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gIndpc3Ryb24tYmlvcyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCisJLnByb2JlCQk9IHdpc3Ryb25fcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh3aXN0cm9uX3JlbW92ZSksCisJLnN1c3BlbmQJPSB3aXN0cm9uX3N1c3BlbmQsCisJLnJlc3VtZQkJPSB3aXN0cm9uX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHdiX21vZHVsZV9pbml0KHZvaWQpCkBAIC00OTMsNTUgKzU2NSwyNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQliaW9zX2F0dGFjaCgpOwotCWNtb3NfYWRkcmVzcyA9IGJpb3NfZ2V0X2Ntb3NfYWRkcmVzcygpOwotCiAJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ3aXN0cm9uX2RyaXZlcik7CiAJaWYgKGVycikKLQkJZ290byBlcnJfZGV0YWNoX2Jpb3M7CisJCWdvdG8gZXJyX3VubWFwX2Jpb3M7CiAKLQl3aXN0cm9uX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoIndpc3Ryb24tYmlvcyIsIC0xLCBOVUxMLCAwKTsKLQlpZiAoSVNfRVJSKHdpc3Ryb25fZGV2aWNlKSkgewotCQllcnIgPSBQVFJfRVJSKHdpc3Ryb25fZGV2aWNlKTsKKwl3aXN0cm9uX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygid2lzdHJvbi1iaW9zIiwgLTEpOworCWlmICghd2lzdHJvbl9kZXZpY2UpIHsKKwkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfdW5yZWdpc3Rlcl9kcml2ZXI7CiAJfQogCi0JaWYgKGhhdmVfd2lmaSkgewotCQl1MTYgd2lmaSA9IGJpb3NfZ2V0X2RlZmF1bHRfc2V0dGluZyhXSUZJKTsKLQkJaWYgKHdpZmkgJiAxKQotCQkJd2lmaV9lbmFibGVkID0gKHdpZmkgJiAyKSA/IDEgOiAwOwotCQllbHNlCi0JCQloYXZlX3dpZmkgPSAwOwotCi0JCWlmIChoYXZlX3dpZmkpCi0JCQliaW9zX3NldF9zdGF0ZShXSUZJLCB3aWZpX2VuYWJsZWQpOwotCX0KLQotCWlmIChoYXZlX2JsdWV0b290aCkgewotCQl1MTYgYnQgPSBiaW9zX2dldF9kZWZhdWx0X3NldHRpbmcoQkxVRVRPT1RIKTsKLQkJaWYgKGJ0ICYgMSkKLQkJCWJsdWV0b290aF9lbmFibGVkID0gKGJ0ICYgMikgPyAxIDogMDsKLQkJZWxzZQotCQkJaGF2ZV9ibHVldG9vdGggPSAwOwotCi0JCWlmIChoYXZlX2JsdWV0b290aCkKLQkJCWJpb3Nfc2V0X3N0YXRlKEJMVUVUT09USCwgYmx1ZXRvb3RoX2VuYWJsZWQpOwotCX0KLQotCWVyciA9IHNldHVwX2lucHV0X2RldigpOworCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQod2lzdHJvbl9kZXZpY2UpOwogCWlmIChlcnIpCi0JCWdvdG8gZXJyX3VucmVnaXN0ZXJfZGV2aWNlOwotCi0JcG9sbF9iaW9zKDEpOyAvKiBGbHVzaCBzdGFsZSBldmVudCBxdWV1ZSBhbmQgYXJtIHRpbWVyICovCisJCWdvdG8gZXJyX2ZyZWVfZGV2aWNlOwogCiAJcmV0dXJuIDA7CiAKLSBlcnJfdW5yZWdpc3Rlcl9kZXZpY2U6Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIod2lzdHJvbl9kZXZpY2UpOworIGVycl9mcmVlX2RldmljZToKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KHdpc3Ryb25fZGV2aWNlKTsKICBlcnJfdW5yZWdpc3Rlcl9kcml2ZXI6CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJndpc3Ryb25fZHJpdmVyKTsKLSBlcnJfZGV0YWNoX2Jpb3M6Ci0JYmlvc19kZXRhY2goKTsKKyBlcnJfdW5tYXBfYmlvczoKIAl1bm1hcF9iaW9zKCk7CiAKIAlyZXR1cm4gZXJyOwpAQCAtNTQ5LDExICs1OTMsOCBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgd2JfbW9kdWxlX2V4aXQodm9pZCkKIHsKLQlkZWxfdGltZXJfc3luYygmcG9sbF90aW1lcik7Ci0JaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcih3aXN0cm9uX2RldmljZSk7CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJndpc3Ryb25fZHJpdmVyKTsKLQliaW9zX2RldGFjaCgpOwogCXVubWFwX2Jpb3MoKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9LY29uZmlnIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9LY29uZmlnCmluZGV4IDU3NGIxOGEuLmYxNWNjZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvS2NvbmZpZworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL0tjb25maWcKQEAgLTg2LDE2ICs4Niw2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwYzExMHBhZC4KIAotY29uZmlnIE1PVVNFX01BUExFCi0JdHJpc3RhdGUgIk1hcGxlIGJ1cyBtb3VzZSIKLQlkZXBlbmRzIG9uIFNIX0RSRUFNQ0FTVCAmJiBNQVBMRQotCWhlbHAKLQkgIFNheSBZIGlmIHlvdSBoYXZlIGEgRHJlYW1DYXN0IGNvbnNvbGUgYW5kIGEgbW91c2UgYXR0YWNoZWQgdG8KLQkgIGl0cyBNYXBsZSBidXMuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1hcGxlbW91c2UuCi0KIGNvbmZpZyBNT1VTRV9BTUlHQQogCXRyaXN0YXRlICJBbWlnYSBtb3VzZSIKIAlkZXBlbmRzIG9uIEFNSUdBCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9NYWtlZmlsZQppbmRleCA4MmIzMzBiLi4yMWExZGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvTWFrZWZpbGUKQEAgLTgsNyArOCw2IEBACiBvYmotJChDT05GSUdfTU9VU0VfUklTQ1BDKQkrPSBycGNtb3VzZS5vCiBvYmotJChDT05GSUdfTU9VU0VfSU5QT1JUKQkrPSBpbnBvcnQubwogb2JqLSQoQ09ORklHX01PVVNFX0xPR0lCTSkJKz0gbG9naWJtLm8KLW9iai0kKENPTkZJR19NT1VTRV9NQVBMRSkJKz0gbWFwbGVtb3VzZS5vCiBvYmotJChDT05GSUdfTU9VU0VfUEMxMTBQQUQpCSs9IHBjMTEwcGFkLm8KIG9iai0kKENPTkZJR19NT1VTRV9QUzIpCQkrPSBwc21vdXNlLm8KIG9iai0kKENPTkZJR19NT1VTRV9TRVJJQUwpCSs9IHNlcm1vdXNlLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9hbHBzLmMKaW5kZXggNGY0MWVjMy4uMjE0MTUwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9hbHBzLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9hbHBzLmMKQEAgLTQwLDYgKzQwLDcgQEAKIAl7IHsgMHgzMywgMHgwMiwgMHgwYSB9LAkweDg4LCAweGY4LCBBTFBTX09MRFBST1RPIH0sCQkvKiBVTUFYLTUzMFQgKi8KIAl7IHsgMHg1MywgMHgwMiwgMHgwYSB9LAkweGY4LCAweGY4LCAwIH0sCiAJeyB7IDB4NTMsIDB4MDIsIDB4MTQgfSwJMHhmOCwgMHhmOCwgMCB9LAorCXsgeyAweDYwLCAweDAzLCAweGM4IH0sIDB4ZjgsIDB4ZjgsIDAgfSwJCQkvKiBIUCB6ZTExMTUgKi8KIAl7IHsgMHg2MywgMHgwMiwgMHgwYSB9LAkweGY4LCAweGY4LCAwIH0sCiAJeyB7IDB4NjMsIDB4MDIsIDB4MTQgfSwJMHhmOCwgMHhmOCwgMCB9LAogCXsgeyAweDYzLCAweDAyLCAweDI4IH0sCTB4ZjgsIDB4ZjgsIEFMUFNfRldfQktfMiB9LAkJLyogRnVqaXRzdSBTaWVtZW5zIFM2MDEwICovCkBAIC0zNDcsNiArMzQ4LDQwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBhbHBzX3BvbGwoKSAtIHBvbGwgdGhlIHRvdWNocGFkIGZvciBjdXJyZW50IG1vdGlvbiBwYWNrZXQuCisgKiBVc2VkIGluIHJlc3luYy4KKyAqLworc3RhdGljIGludCBhbHBzX3BvbGwoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisJc3RydWN0IGFscHNfZGF0YSAqcHJpdiA9IHBzbW91c2UtPnByaXZhdGU7CisJdW5zaWduZWQgY2hhciBidWZbNl07CisJaW50IHBvbGxfZmFpbGVkOworCisJaWYgKHByaXYtPmktPmZsYWdzICYgQUxQU19QQVNTKQorCQlhbHBzX3Bhc3N0aHJvdWdoX21vZGUocHNtb3VzZSwgMSk7CisKKwlwb2xsX2ZhaWxlZCA9IHBzMl9jb21tYW5kKCZwc21vdXNlLT5wczJkZXYsIGJ1ZiwKKwkJCQkgIFBTTU9VU0VfQ01EX1BPTEwgfCAocHNtb3VzZS0+cGt0c2l6ZSA8PCA4KSkgPCAwOworCisJaWYgKHByaXYtPmktPmZsYWdzICYgQUxQU19QQVNTKQorCQlhbHBzX3Bhc3N0aHJvdWdoX21vZGUocHNtb3VzZSwgMCk7CisKKwlpZiAocG9sbF9mYWlsZWQgfHwgKGJ1ZlswXSAmIHByaXYtPmktPm1hc2swKSAhPSBwcml2LT5pLT5ieXRlMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKChwc21vdXNlLT5iYWRieXRlICYgMHhjOCkgPT0gMHgwOCkgeworLyoKKyAqIFBvbGwgdGhlIHRyYWNrIHN0aWNrIC4uLgorICovCisJCWlmIChwczJfY29tbWFuZCgmcHNtb3VzZS0+cHMyZGV2LCBidWYsIFBTTU9VU0VfQ01EX1BPTEwgfCAoMyA8PCA4KSkpCisJCQlyZXR1cm4gLTE7CisJfQorCisJbWVtY3B5KHBzbW91c2UtPnBhY2tldCwgYnVmLCBzaXplb2YoYnVmKSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgYWxwc19yZWNvbm5lY3Qoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCiB7CiAJc3RydWN0IGFscHNfZGF0YSAqcHJpdiA9IHBzbW91c2UtPnByaXZhdGU7CkBAIC00NTAsMTAgKzQ4NSwxNCBAQAogCWlucHV0X3JlZ2lzdGVyX2RldmljZShwcml2LT5kZXYyKTsKIAogCXBzbW91c2UtPnByb3RvY29sX2hhbmRsZXIgPSBhbHBzX3Byb2Nlc3NfYnl0ZTsKKwlwc21vdXNlLT5wb2xsID0gYWxwc19wb2xsOwogCXBzbW91c2UtPmRpc2Nvbm5lY3QgPSBhbHBzX2Rpc2Nvbm5lY3Q7CiAJcHNtb3VzZS0+cmVjb25uZWN0ID0gYWxwc19yZWNvbm5lY3Q7CiAJcHNtb3VzZS0+cGt0c2l6ZSA9IDY7CiAKKwkvKiBXZSBhcmUgaGF2aW5nIHRyb3VibGUgcmVzeW5jaW5nIEFMUFMgdG91Y2hwYWRzIHNvIGRpc2FibGUgaXQgZm9yIG5vdyAqLworCXBzbW91c2UtPnJlc3luY190aW1lID0gMDsKKwogCXJldHVybiAwOwogCiBpbml0X2ZhaWw6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2FtaW1vdXNlLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2FtaW1vdXNlLmMKaW5kZXggZDEzZDRjOC4uYzhiMmNjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9hbWltb3VzZS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvYW1pbW91c2UuYwpAQCAtNDEsNyArNDEsNyBAQAogCXVuc2lnbmVkIHNob3J0IGpveTBkYXQsIHBvdGdvcjsKIAlpbnQgbngsIG55LCBkeCwgZHk7CiAKLQlqb3kwZGF0ID0gY3VzdG9tLmpveTBkYXQ7CisJam95MGRhdCA9IGFtaWdhX2N1c3RvbS5qb3kwZGF0OwogCiAJbnggPSBqb3kwZGF0ICYgMHhmZjsKIAlueSA9IGpveTBkYXQgPj4gODsKQEAgLTU3LDcgKzU3LDcgQEAKIAlhbWltb3VzZV9sYXN0eCA9IG54OwogCWFtaW1vdXNlX2xhc3R5ID0gbnk7CiAKLQlwb3Rnb3IgPSBjdXN0b20ucG90Z29yOworCXBvdGdvciA9IGFtaWdhX2N1c3RvbS5wb3Rnb3I7CiAKIAlpbnB1dF9yZWdzKGFtaW1vdXNlX2RldiwgZnApOwogCkBAIC03Nyw3ICs3Nyw3IEBACiB7CiAJdW5zaWduZWQgc2hvcnQgam95MGRhdDsKIAotCWpveTBkYXQgPSBjdXN0b20uam95MGRhdDsKKwlqb3kwZGF0ID0gYW1pZ2FfY3VzdG9tLmpveTBkYXQ7CiAKIAlhbWltb3VzZV9sYXN0eCA9IGpveTBkYXQgJiAweGZmOwogCWFtaW1vdXNlX2xhc3R5ID0gam95MGRhdCA+PiA4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9saWZlYm9vay5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9saWZlYm9vay5jCmluZGV4IDU1OTkxNDIuLjVjY2MzZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvbGlmZWJvb2suYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2xpZmVib29rLmMKQEAgLTI3LDYgKzI3LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTElGRUJPT0sgQiBTZXJpZXMiKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgfSwKKyAgICAgICB7CisgICAgICAgICAgICAgICAuaWRlbnQgPSAiTGlmZWJvb2sgQjE0MiIsCisgICAgICAgICAgICAgICAubWF0Y2hlcyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJMaWZlQm9vayBCMTQyIiksCisgICAgICAgICAgICAgICB9LAorCisgICAgICAgfSwKICAgICAgICB7IH0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvbG9naXBzMnBwLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2lwczJwcC5jCmluZGV4IDMxYTU5ZjcuLmM4ODUyMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvbG9naXBzMnBwLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9sb2dpcHMycHAuYwpAQCAtMTE3LDcgKzExNyw3IEBACiAJaWYgKHBzbW91c2Vfc2xpY2VkX2NvbW1hbmQocHNtb3VzZSwgY29tbWFuZCkpCiAJCXJldHVybiAtMTsKIAotCWlmIChwczJfY29tbWFuZCgmcHNtb3VzZS0+cHMyZGV2LCBwYXJhbSwgUFNNT1VTRV9DTURfUE9MTCkpCisJaWYgKHBzMl9jb21tYW5kKCZwc21vdXNlLT5wczJkZXYsIHBhcmFtLCBQU01PVVNFX0NNRF9QT0xMIHwgMHgwMzAwKSkKIAkJcmV0dXJuIC0xOwogCiAJcmV0dXJuIDA7CkBAIC0yMjYsNyArMjI2LDkgQEAKIAkJeyA4MCwJUFMyUFBfS0lORF9XSEVFTCwJUFMyUFBfU0lERV9CVE4gfCBQUzJQUF9XSEVFTCB9LAogCQl7IDgxLAlQUzJQUF9LSU5EX1dIRUVMLAlQUzJQUF9XSEVFTCB9LAogCQl7IDgzLAlQUzJQUF9LSU5EX1dIRUVMLAlQUzJQUF9XSEVFTCB9LAorCQl7IDg1LAlQUzJQUF9LSU5EX1dIRUVMLAlQUzJQUF9XSEVFTCB9LAogCQl7IDg2LAlQUzJQUF9LSU5EX1dIRUVMLAlQUzJQUF9XSEVFTCB9LAorCQl7IDg3LAlQUzJQUF9LSU5EX1dIRUVMLAlQUzJQUF9XSEVFTCB9LAogCQl7IDg4LAlQUzJQUF9LSU5EX1dIRUVMLAlQUzJQUF9XSEVFTCB9LAogCQl7IDk2LAkwLAkJCTAgfSwKIAkJeyA5NywJUFMyUFBfS0lORF9UUDMsCQlQUzJQUF9XSEVFTCB8IFBTMlBQX0hXSEVFTCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9tYXBsZW1vdXNlLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL21hcGxlbW91c2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjViMzRmZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL21hcGxlbW91c2UuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICoJJElkOiBtYXBsZW1vdXNlLmMsdiAxLjIgMjAwNC8wMy8yMiAwMToxODoxNSBsZXRoYWwgRXhwICQKLSAqCVNFR0EgRHJlYW1jYXN0IG1vdXNlIGRyaXZlcgotICoJQmFzZWQgb24gZHJpdmVycy91c2IvdXNibW91c2UuYwotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9tYXBsZS5oPgotCi1NT0RVTEVfQVVUSE9SKCJZQUVHQVNISSBUYWtlc2hpIDx0QGtlc2hpLm9yZz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU0VHQSBEcmVhbWNhc3QgbW91c2UgZHJpdmVyIik7Ci0KLXN0YXRpYyB2b2lkIGRjX21vdXNlX2NhbGxiYWNrKHN0cnVjdCBtYXBsZXEgKm1xKQotewotCWludCBidXR0b25zLCByZWx4LCByZWx5LCByZWx6OwotCXN0cnVjdCBtYXBsZV9kZXZpY2UgKm1hcGxlZGV2ID0gbXEtPmRldjsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBtYXBsZWRldi0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGNoYXIgKnJlcyA9IG1xLT5yZWN2YnVmOwotCi0JYnV0dG9ucyA9IH5yZXNbOF07Ci0JcmVseCA9ICoodW5zaWduZWQgc2hvcnQgKikocmVzICsgMTIpIC0gNTEyOwotCXJlbHkgPSAqKHVuc2lnbmVkIHNob3J0ICopKHJlcyArIDE0KSAtIDUxMjsKLQlyZWx6ID0gKih1bnNpZ25lZCBzaG9ydCAqKShyZXMgKyAxNikgLSA1MTI7Ci0KLQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsICAgYnV0dG9ucyAmIDQpOwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTUlERExFLCBidXR0b25zICYgOSk7Ci0JaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9SSUdIVCwgIGJ1dHRvbnMgJiAyKTsKLQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1gsICAgICAgcmVseCk7Ci0JaW5wdXRfcmVwb3J0X3JlbChkZXYsIFJFTF9ZLCAgICAgIHJlbHkpOwotCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfV0hFRUwsICByZWx6KTsKLQlpbnB1dF9zeW5jKGRldik7Ci19Ci0KLXN0YXRpYyBpbnQgZGNfbW91c2VfY29ubmVjdChzdHJ1Y3QgbWFwbGVfZGV2aWNlICpkZXYpCi17Ci0JdW5zaWduZWQgbG9uZyBkYXRhID0gYmUzMl90b19jcHUoZGV2LT5kZXZpbmZvLmZ1bmN0aW9uX2RhdGFbMF0pOwotCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKLQotCWRldi0+cHJpdmF0ZV9kYXRhID0gaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7Ci0JaWYgKCFpbnB1dF9kZXYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZGV2LT5wcml2YXRlX2RhdGEgPSBpbnB1dF9kZXY7Ci0KLQlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUKEVWX0tFWSkgfCBCSVQoRVZfUkVMKTsKLQlpbnB1dF9kZXYtPmtleWJpdFtMT05HKEJUTl9NT1VTRSldID0gQklUKEJUTl9MRUZUKSB8IEJJVChCVE5fUklHSFQpIHwgQklUKEJUTl9NSURETEUpOwotCWlucHV0X2Rldi0+cmVsYml0WzBdID0gQklUKFJFTF9YKSB8IEJJVChSRUxfWSkgfCBCSVQoUkVMX1dIRUVMKTsKLQotCWlucHV0X2Rldi0+bmFtZSA9IGRldi0+cHJvZHVjdF9uYW1lOwotCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19NQVBMRTsKLQotCWlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOwotCi0JbWFwbGVfZ2V0Y29uZF9jYWxsYmFjayhkZXYsIGRjX21vdXNlX2NhbGxiYWNrLCAxLCBNQVBMRV9GVU5DX01PVVNFKTsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyB2b2lkIGRjX21vdXNlX2Rpc2Nvbm5lY3Qoc3RydWN0IG1hcGxlX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldiA9IGRldi0+cHJpdmF0ZV9kYXRhOwotCi0JaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKLX0KLQotCi1zdGF0aWMgc3RydWN0IG1hcGxlX2RyaXZlciBkY19tb3VzZV9kcml2ZXIgPSB7Ci0JLmZ1bmN0aW9uID0JTUFQTEVfRlVOQ19NT1VTRSwKLQkubmFtZSA9CQkiRHJlYW1jYXN0IG1vdXNlIiwKLQkuY29ubmVjdCA9CWRjX21vdXNlX2Nvbm5lY3QsCi0JLmRpc2Nvbm5lY3QgPQlkY19tb3VzZV9kaXNjb25uZWN0LAotfTsKLQotCi1zdGF0aWMgaW50IF9faW5pdCBkY19tb3VzZV9pbml0KHZvaWQpCi17Ci0JbWFwbGVfcmVnaXN0ZXJfZHJpdmVyKCZkY19tb3VzZV9kcml2ZXIpOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCBkY19tb3VzZV9leGl0KHZvaWQpCi17Ci0JbWFwbGVfdW5yZWdpc3Rlcl9kcml2ZXIoJmRjX21vdXNlX2RyaXZlcik7Ci19Ci0KLQotbW9kdWxlX2luaXQoZGNfbW91c2VfaW5pdCk7Ci1tb2R1bGVfZXhpdChkY19tb3VzZV9leGl0KTsKLQotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jCmluZGV4IDZlZTk5OTkuLjc2NjVmZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLWJhc2UuYwpAQCAtNTQsMTAgKzU0LDE0IEBACiBtb2R1bGVfcGFyYW1fbmFtZWQoc21hcnRzY3JvbGwsIHBzbW91c2Vfc21hcnRzY3JvbGwsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhzbWFydHNjcm9sbCwgIkxvZ2l0ZWNoIFNtYXJ0c2Nyb2xsIGF1dG9yZXBlYXQsIDEgPSBlbmFibGVkIChkZWZhdWx0KSwgMCA9IGRpc2FibGVkLiIpOwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHBzbW91c2VfcmVzZXRhZnRlcjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHNtb3VzZV9yZXNldGFmdGVyID0gNTsKIG1vZHVsZV9wYXJhbV9uYW1lZChyZXNldGFmdGVyLCBwc21vdXNlX3Jlc2V0YWZ0ZXIsIHVpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhyZXNldGFmdGVyLCAiUmVzZXQgZGV2aWNlIGFmdGVyIHNvIG1hbnkgYmFkIHBhY2tldHMgKDAgPSBuZXZlcikuIik7CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHNtb3VzZV9yZXN5bmNfdGltZSA9IDU7Cittb2R1bGVfcGFyYW1fbmFtZWQocmVzeW5jX3RpbWUsIHBzbW91c2VfcmVzeW5jX3RpbWUsIHVpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhyZXN5bmNfdGltZSwgIkhvdyBsb25nIGNhbiBtb3VzZSBzdGF5IGlkbGUgYmVmb3JlIGZvcmNpbmcgcmVzeW5jIChpbiBzZWNvbmRzLCAwID0gbmV2ZXIpLiIpOworCiBQU01PVVNFX0RFRklORV9BVFRSKHByb3RvY29sLCBTX0lXVVNSIHwgU19JUlVHTywKIAkJCU5VTEwsCiAJCQlwc21vdXNlX2F0dHJfc2hvd19wcm90b2NvbCwgcHNtb3VzZV9hdHRyX3NldF9wcm90b2NvbCk7CkBAIC03MCwxMiArNzQsMTYgQEAKIFBTTU9VU0VfREVGSU5FX0FUVFIocmVzZXRhZnRlciwgU19JV1VTUiB8IFNfSVJVR08sCiAJCQkodm9pZCAqKSBvZmZzZXRvZihzdHJ1Y3QgcHNtb3VzZSwgcmVzZXRhZnRlciksCiAJCQlwc21vdXNlX3Nob3dfaW50X2F0dHIsIHBzbW91c2Vfc2V0X2ludF9hdHRyKTsKK1BTTU9VU0VfREVGSU5FX0FUVFIocmVzeW5jX3RpbWUsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJKHZvaWQgKikgb2Zmc2V0b2Yoc3RydWN0IHBzbW91c2UsIHJlc3luY190aW1lKSwKKwkJCXBzbW91c2Vfc2hvd19pbnRfYXR0ciwgcHNtb3VzZV9zZXRfaW50X2F0dHIpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcHNtb3VzZV9hdHRyaWJ1dGVzW10gPSB7CiAJJnBzbW91c2VfYXR0cl9wcm90b2NvbC5kYXR0ci5hdHRyLAogCSZwc21vdXNlX2F0dHJfcmF0ZS5kYXR0ci5hdHRyLAogCSZwc21vdXNlX2F0dHJfcmVzb2x1dGlvbi5kYXR0ci5hdHRyLAogCSZwc21vdXNlX2F0dHJfcmVzZXRhZnRlci5kYXR0ci5hdHRyLAorCSZwc21vdXNlX2F0dHJfcmVzeW5jX3RpbWUuZGF0dHIuYXR0ciwKIAlOVUxMCiB9OwogCkBAIC05OCw2ICsxMDYsOCBAQAogICovCiBzdGF0aWMgREVDTEFSRV9NVVRFWChwc21vdXNlX3NlbSk7CiAKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqa3BzbW91c2VkX3dxOworCiBzdHJ1Y3QgcHNtb3VzZV9wcm90b2NvbCB7CiAJZW51bSBwc21vdXNlX3R5cGUgdHlwZTsKIAljaGFyICpuYW1lOwpAQCAtMTc4LDE1ICsxODgsNzkgQEAKIH0KIAogLyoKLSAqIHBzbW91c2VfaW50ZXJydXB0KCkgaGFuZGxlcyBpbmNvbWluZyBjaGFyYWN0ZXJzLCBlaXRoZXIgZ2F0aGVyaW5nIHRoZW0gaW50bwotICogcGFja2V0cyBvciBwYXNzaW5nIHRoZW0gdG8gdGhlIGNvbW1hbmQgcm91dGluZSBhcyBjb21tYW5kIG91dHB1dC4KKyAqIF9fcHNtb3VzZV9zZXRfc3RhdGUoKSBzZXRzIG5ldyBwc21vdXNlIHN0YXRlIGFuZCByZXNldHMgYWxsIGZsYWdzLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3BzbW91c2Vfc2V0X3N0YXRlKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBlbnVtIHBzbW91c2Vfc3RhdGUgbmV3X3N0YXRlKQoreworCXBzbW91c2UtPnN0YXRlID0gbmV3X3N0YXRlOworCXBzbW91c2UtPnBrdGNudCA9IHBzbW91c2UtPm91dF9vZl9zeW5jID0gMDsKKwlwc21vdXNlLT5wczJkZXYuZmxhZ3MgPSAwOworCXBzbW91c2UtPmxhc3QgPSBqaWZmaWVzOworfQorCisKKy8qCisgKiBwc21vdXNlX3NldF9zdGF0ZSgpIHNldHMgbmV3IHBzbW91c2Ugc3RhdGUgYW5kIHJlc2V0cyBhbGwgZmxhZ3MgYW5kCisgKiBjb3VudGVycyB3aGlsZSBob2xkaW5nIHNlcmlvIGxvY2sgc28gZmlnaHRpbmcgd2l0aCBpbnRlcnJ1cHQgaGFuZGxlcgorICogaXMgbm90IGEgY29uY2Vybi4KKyAqLworCitzdGF0aWMgdm9pZCBwc21vdXNlX3NldF9zdGF0ZShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgZW51bSBwc21vdXNlX3N0YXRlIG5ld19zdGF0ZSkKK3sKKwlzZXJpb19wYXVzZV9yeChwc21vdXNlLT5wczJkZXYuc2VyaW8pOworCV9fcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgbmV3X3N0YXRlKTsKKwlzZXJpb19jb250aW51ZV9yeChwc21vdXNlLT5wczJkZXYuc2VyaW8pOworfQorCisvKgorICogcHNtb3VzZV9oYW5kbGVfYnl0ZSgpIHByb2Nlc3NlcyBvbmUgYnl0ZSBvZiB0aGUgaW5wdXQgZGF0YSBzdHJlYW0KKyAqIGJ5IGNhbGxpbmcgY29ycmVzcG9uZGluZyBwcm90b2NvbCBoYW5kbGVyLgorICovCisKK3N0YXRpYyBpbnQgcHNtb3VzZV9oYW5kbGVfYnl0ZShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcHNtb3VzZV9yZXRfdCByYyA9IHBzbW91c2UtPnByb3RvY29sX2hhbmRsZXIocHNtb3VzZSwgcmVncyk7CisKKwlzd2l0Y2ggKHJjKSB7CisJCWNhc2UgUFNNT1VTRV9CQURfREFUQToKKwkJCWlmIChwc21vdXNlLT5zdGF0ZSA9PSBQU01PVVNFX0FDVElWQVRFRCkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInBzbW91c2UuYzogJXMgYXQgJXMgbG9zdCBzeW5jIGF0IGJ5dGUgJWRcbiIsCisJCQkJCXBzbW91c2UtPm5hbWUsIHBzbW91c2UtPnBoeXMsIHBzbW91c2UtPnBrdGNudCk7CisJCQkJaWYgKCsrcHNtb3VzZS0+b3V0X29mX3N5bmMgPT0gcHNtb3VzZS0+cmVzZXRhZnRlcikgeworCQkJCQlfX3BzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfSUdOT1JFKTsKKwkJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJwc21vdXNlLmM6IGlzc3VpbmcgcmVjb25uZWN0IHJlcXVlc3RcbiIpOworCQkJCQlzZXJpb19yZWNvbm5lY3QocHNtb3VzZS0+cHMyZGV2LnNlcmlvKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCX0KKwkJCXBzbW91c2UtPnBrdGNudCA9IDA7CisJCQlicmVhazsKKworCQljYXNlIFBTTU9VU0VfRlVMTF9QQUNLRVQ6CisJCQlwc21vdXNlLT5wa3RjbnQgPSAwOworCQkJaWYgKHBzbW91c2UtPm91dF9vZl9zeW5jKSB7CisJCQkJcHNtb3VzZS0+b3V0X29mX3N5bmMgPSAwOworCQkJCXByaW50ayhLRVJOX05PVElDRSAicHNtb3VzZS5jOiAlcyBhdCAlcyAtIGRyaXZlciByZXN5bmNoZWQuXG4iLAorCQkJCQlwc21vdXNlLT5uYW1lLCBwc21vdXNlLT5waHlzKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUFNNT1VTRV9HT09EX0RBVEE6CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwc21vdXNlX2ludGVycnVwdCgpIGhhbmRsZXMgaW5jb21pbmcgY2hhcmFjdGVycywgZWl0aGVyIHBhc3NpbmcgdGhlbQorICogZm9yIG5vcm1hbCBwcm9jZXNzaW5nIG9yIGdhdGhlcmluZyB0aGVtIGFzIGNvbW1hbmQgcmVzcG9uc2UuCiAgKi8KIAogc3RhdGljIGlycXJldHVybl90IHBzbW91c2VfaW50ZXJydXB0KHN0cnVjdCBzZXJpbyAqc2VyaW8sCiAJCXVuc2lnbmVkIGNoYXIgZGF0YSwgdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKLQlwc21vdXNlX3JldF90IHJjOwogCiAJaWYgKHBzbW91c2UtPnN0YXRlID09IFBTTU9VU0VfSUdOT1JFKQogCQlnb3RvIG91dDsKQEAgLTIwOCw2NyArMjgyLDU4IEBACiAJCWlmICAocHMyX2hhbmRsZV9yZXNwb25zZSgmcHNtb3VzZS0+cHMyZGV2LCBkYXRhKSkKIAkJCWdvdG8gb3V0OwogCi0JaWYgKHBzbW91c2UtPnN0YXRlID09IFBTTU9VU0VfSU5JVElBTElaSU5HKQorCWlmIChwc21vdXNlLT5zdGF0ZSA8PSBQU01PVVNFX1JFU1lOQ0lORykKIAkJZ290byBvdXQ7CiAKIAlpZiAocHNtb3VzZS0+c3RhdGUgPT0gUFNNT1VTRV9BQ1RJVkFURUQgJiYKIAkgICAgcHNtb3VzZS0+cGt0Y250ICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgcHNtb3VzZS0+bGFzdCArIEhaLzIpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInBzbW91c2UuYzogJXMgYXQgJXMgbG9zdCBzeW5jaHJvbml6YXRpb24sIHRocm93aW5nICVkIGJ5dGVzIGF3YXkuXG4iLAorCQlwcmludGsoS0VSTl9JTkZPICJwc21vdXNlLmM6ICVzIGF0ICVzIGxvc3Qgc3luY2hyb25pemF0aW9uLCB0aHJvd2luZyAlZCBieXRlcyBhd2F5LlxuIiwKIAkJICAgICAgIHBzbW91c2UtPm5hbWUsIHBzbW91c2UtPnBoeXMsIHBzbW91c2UtPnBrdGNudCk7Ci0JCXBzbW91c2UtPnBrdGNudCA9IDA7CisJCXBzbW91c2UtPmJhZGJ5dGUgPSBwc21vdXNlLT5wYWNrZXRbMF07CisJCV9fcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9SRVNZTkNJTkcpOworCQlxdWV1ZV93b3JrKGtwc21vdXNlZF93cSwgJnBzbW91c2UtPnJlc3luY193b3JrKTsKKwkJZ290byBvdXQ7CiAJfQogCi0JcHNtb3VzZS0+bGFzdCA9IGppZmZpZXM7CiAJcHNtb3VzZS0+cGFja2V0W3BzbW91c2UtPnBrdGNudCsrXSA9IGRhdGE7Ci0KLQlpZiAocHNtb3VzZS0+cGFja2V0WzBdID09IFBTTU9VU0VfUkVUX0JBVCkgeworLyoKKyAqIENoZWNrIGlmIHRoaXMgaXMgYSBuZXcgZGV2aWNlIGFubm91bmNlbWVudCAoMHhBQSAweDAwKQorICovCisJaWYgKHVubGlrZWx5KHBzbW91c2UtPnBhY2tldFswXSA9PSBQU01PVVNFX1JFVF9CQVQgJiYgcHNtb3VzZS0+cGt0Y250IDw9IDIpKSB7CiAJCWlmIChwc21vdXNlLT5wa3RjbnQgPT0gMSkKIAkJCWdvdG8gb3V0OwogCi0JCWlmIChwc21vdXNlLT5wa3RjbnQgPT0gMikgewotCQkJaWYgKHBzbW91c2UtPnBhY2tldFsxXSA9PSBQU01PVVNFX1JFVF9JRCkgewotCQkJCXBzbW91c2UtPnN0YXRlID0gUFNNT1VTRV9JR05PUkU7Ci0JCQkJc2VyaW9fcmVjb25uZWN0KHNlcmlvKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCWlmIChwc21vdXNlLT50eXBlID09IFBTTU9VU0VfU1lOQVBUSUNTKSB7Ci0JCQkJLyogbmVpdGhlciAweEFBIG5vciAweDAwIGFyZSB2YWxpZCBmaXJzdCBieXRlcwotCQkJCSAqIGZvciBhIHBhY2tldCBpbiBhYnNvbHV0ZSBtb2RlCi0JCQkJICovCi0JCQkJcHNtb3VzZS0+cGt0Y250ID0gMDsKLQkJCQlnb3RvIG91dDsKLQkJCX0KKwkJaWYgKHBzbW91c2UtPnBhY2tldFsxXSA9PSBQU01PVVNFX1JFVF9JRCkgeworCQkJX19wc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX0lHTk9SRSk7CisJCQlzZXJpb19yZWNvbm5lY3Qoc2VyaW8pOworCQkJZ290byBvdXQ7CiAJCX0KKy8qCisgKiBOb3QgYSBuZXcgZGV2aWNlLCB0cnkgcHJvY2Vzc2luZyBmaXJzdCBieXRlIG5vcm1hbGx5CisgKi8KKwkJcHNtb3VzZS0+cGt0Y250ID0gMTsKKwkJaWYgKHBzbW91c2VfaGFuZGxlX2J5dGUocHNtb3VzZSwgcmVncykpCisJCQlnb3RvIG91dDsKKworCQlwc21vdXNlLT5wYWNrZXRbcHNtb3VzZS0+cGt0Y250KytdID0gZGF0YTsKIAl9CiAKLQlyYyA9IHBzbW91c2UtPnByb3RvY29sX2hhbmRsZXIocHNtb3VzZSwgcmVncyk7Ci0KLQlzd2l0Y2ggKHJjKSB7Ci0JCWNhc2UgUFNNT1VTRV9CQURfREFUQToKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInBzbW91c2UuYzogJXMgYXQgJXMgbG9zdCBzeW5jIGF0IGJ5dGUgJWRcbiIsCi0JCQkJcHNtb3VzZS0+bmFtZSwgcHNtb3VzZS0+cGh5cywgcHNtb3VzZS0+cGt0Y250KTsKLQkJCXBzbW91c2UtPnBrdGNudCA9IDA7Ci0KLQkJCWlmICgrK3BzbW91c2UtPm91dF9vZl9zeW5jID09IHBzbW91c2UtPnJlc2V0YWZ0ZXIpIHsKLQkJCQlwc21vdXNlLT5zdGF0ZSA9IFBTTU9VU0VfSUdOT1JFOwotCQkJCXByaW50ayhLRVJOX05PVElDRSAicHNtb3VzZS5jOiBpc3N1aW5nIHJlY29ubmVjdCByZXF1ZXN0XG4iKTsKLQkJCQlzZXJpb19yZWNvbm5lY3QocHNtb3VzZS0+cHMyZGV2LnNlcmlvKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgUFNNT1VTRV9GVUxMX1BBQ0tFVDoKLQkJCXBzbW91c2UtPnBrdGNudCA9IDA7Ci0JCQlpZiAocHNtb3VzZS0+b3V0X29mX3N5bmMpIHsKLQkJCQlwc21vdXNlLT5vdXRfb2Zfc3luYyA9IDA7Ci0JCQkJcHJpbnRrKEtFUk5fTk9USUNFICJwc21vdXNlLmM6ICVzIGF0ICVzIC0gZHJpdmVyIHJlc3luY2hlZC5cbiIsCi0JCQkJCXBzbW91c2UtPm5hbWUsIHBzbW91c2UtPnBoeXMpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQU01PVVNFX0dPT0RfREFUQToKLQkJCWJyZWFrOworLyoKKyAqIFNlZSBpZiB3ZSBuZWVkIHRvIGZvcmNlIHJlc3luYyBiZWNhdXNlIG1vdXNlIHdhcyBpZGxlIGZvciB0b28gbG9uZworICovCisJaWYgKHBzbW91c2UtPnN0YXRlID09IFBTTU9VU0VfQUNUSVZBVEVEICYmCisJICAgIHBzbW91c2UtPnBrdGNudCA9PSAxICYmIHBzbW91c2UtPnJlc3luY190aW1lICYmCisJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgcHNtb3VzZS0+bGFzdCArIHBzbW91c2UtPnJlc3luY190aW1lICogSFopKSB7CisJCXBzbW91c2UtPmJhZGJ5dGUgPSBwc21vdXNlLT5wYWNrZXRbMF07CisJCV9fcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9SRVNZTkNJTkcpOworCQlxdWV1ZV93b3JrKGtwc21vdXNlZF93cSwgJnBzbW91c2UtPnJlc3luY193b3JrKTsKKwkJZ290byBvdXQ7CiAJfQotb3V0OgorCisJcHNtb3VzZS0+bGFzdCA9IGppZmZpZXM7CisJcHNtb3VzZV9oYW5kbGVfYnl0ZShwc21vdXNlLCByZWdzKTsKKworIG91dDoKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTUyNywxMSArNTkyLDE1IEBACiAJaWYgKG1heF9wcm90byA+IFBTTU9VU0VfSU1FWCAmJiBwczJwcF9pbml0KHBzbW91c2UsIHNldF9wcm9wZXJ0aWVzKSA9PSAwKQogCQlyZXR1cm4gUFNNT1VTRV9QUzJQUDsKIAorCWlmIChtYXhfcHJvdG8gPiBQU01PVVNFX0lNRVggJiYgdHJhY2twb2ludF9kZXRlY3QocHNtb3VzZSwgc2V0X3Byb3BlcnRpZXMpID09IDApCisJCXJldHVybiBQU01PVVNFX1RSQUNLUE9JTlQ7CisKIC8qCiAgKiBSZXNldCB0byBkZWZhdWx0cyBpbiBjYXNlIHRoZSBkZXZpY2UgZ290IGNvbmZ1c2VkIGJ5IGV4dGVuZGVkCi0gKiBwcm90b2NvbCBwcm9iZXMuCisgKiBwcm90b2NvbCBwcm9iZXMuIE5vdGUgdGhhdCB3ZSBkbyBmdWxsIHJlc2V0IGJlY3Vhc2Ugc29tZSBtaWNlCisgKiBwdXQgdGhlbXNlbHZlcyB0byBzbGVlcCB3aGVuIHNlZSBQU01PVVNFX1JFU0VUX0RJUy4KICAqLwotCXBzMl9jb21tYW5kKCZwc21vdXNlLT5wczJkZXYsIE5VTEwsIFBTTU9VU0VfQ01EX1JFU0VUX0RJUyk7CisJcHNtb3VzZV9yZXNldChwc21vdXNlKTsKIAogCWlmIChtYXhfcHJvdG8gPj0gUFNNT1VTRV9JTUVYICYmIGltX2V4cGxvcmVyX2RldGVjdChwc21vdXNlLCBzZXRfcHJvcGVydGllcykgPT0gMCkKIAkJcmV0dXJuIFBTTU9VU0VfSU1FWDsKQEAgLTU0MCwxMiArNjA5LDYgQEAKIAkJcmV0dXJuIFBTTU9VU0VfSU1QUzsKIAogLyoKLSAqIFRyeSB0byBpbml0aWFsaXplIHRoZSBJQk0gVHJhY2tQb2ludAotICovCi0JaWYgKG1heF9wcm90byA+IFBTTU9VU0VfSU1FWCAmJiB0cmFja3BvaW50X2RldGVjdChwc21vdXNlLCBzZXRfcHJvcGVydGllcykgPT0gMCkKLQkJcmV0dXJuIFBTTU9VU0VfVFJBQ0tQT0lOVDsKLQotLyoKICAqIE9rYXksIGFsbCBmYWlsZWQsIHdlIGhhdmUgYSBzdGFuZGFyZCBtb3VzZSBoZXJlLiBUaGUgbnVtYmVyIG9mIHRoZSBidXR0b25zCiAgKiBpcyBzdGlsbCBhIHF1ZXN0aW9uLCB0aG91Z2guIFdlIGFzc3VtZSAzLgogICovCkBAIC01NTksNyArNjIyLDYgQEAKICAqIGV4dGVuc2lvbnMuCiAgKi8KIAkJcHNtb3VzZV9yZXNldChwc21vdXNlKTsKLQkJcHMyX2NvbW1hbmQoJnBzbW91c2UtPnBzMmRldiwgTlVMTCwgUFNNT1VTRV9DTURfUkVTRVRfRElTKTsKIAl9CiAKIAlyZXR1cm4gUFNNT1VTRV9QUzI7CkBAIC03NTUsMjEgKzgxNyw2IEBACiB9CiAKIC8qCi0gKiBwc21vdXNlX3NldF9zdGF0ZSgpIHNldHMgbmV3IHBzbW91c2Ugc3RhdGUgYW5kIHJlc2V0cyBhbGwgZmxhZ3MgYW5kCi0gKiBjb3VudGVycyB3aGlsZSBob2xkaW5nIHNlcmlvIGxvY2sgc28gZmlnaHRpbmcgd2l0aCBpbnRlcnJ1cHQgaGFuZGxlcgotICogaXMgbm90IGEgY29uY2Vybi4KLSAqLwotCi1zdGF0aWMgdm9pZCBwc21vdXNlX3NldF9zdGF0ZShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgZW51bSBwc21vdXNlX3N0YXRlIG5ld19zdGF0ZSkKLXsKLQlzZXJpb19wYXVzZV9yeChwc21vdXNlLT5wczJkZXYuc2VyaW8pOwotCXBzbW91c2UtPnN0YXRlID0gbmV3X3N0YXRlOwotCXBzbW91c2UtPnBrdGNudCA9IHBzbW91c2UtPm91dF9vZl9zeW5jID0gMDsKLQlwc21vdXNlLT5wczJkZXYuZmxhZ3MgPSAwOwotCXNlcmlvX2NvbnRpbnVlX3J4KHBzbW91c2UtPnBzMmRldi5zZXJpbyk7Ci19Ci0KLS8qCiAgKiBwc21vdXNlX2FjdGl2YXRlKCkgZW5hYmxlcyB0aGUgbW91c2Ugc28gdGhhdCB3ZSBnZXQgbW90aW9uIHJlcG9ydHMgZnJvbSBpdC4KICAqLwogCkBAIC03OTcsNiArODQ0LDExMSBAQAogCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfQ01EX01PREUpOwogfQogCisvKgorICogcHNtb3VzZV9wb2xsKCkgLSBkZWZhdWx0IHBvbGwgaGFubGRlci4gRXZlcnlvbmUgZXhjZXB0IGZvciBBTFBTIHVzZXMgaXQuCisgKi8KKworc3RhdGljIGludCBwc21vdXNlX3BvbGwoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisJcmV0dXJuIHBzMl9jb21tYW5kKCZwc21vdXNlLT5wczJkZXYsIHBzbW91c2UtPnBhY2tldCwKKwkJCSAgIFBTTU9VU0VfQ01EX1BPTEwgfCAocHNtb3VzZS0+cGt0c2l6ZSA8PCA4KSk7Cit9CisKKworLyoKKyAqIHBzbW91c2VfcmVzeW5jKCkgYXR0ZW1wdHMgdG8gcmUtdmFsaWRhdGUgY3VycmVudCBwcm90b2NvbC4KKyAqLworCitzdGF0aWMgdm9pZCBwc21vdXNlX3Jlc3luYyh2b2lkICpwKQoreworCXN0cnVjdCBwc21vdXNlICpwc21vdXNlID0gcCwgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IHNlcmlvICpzZXJpbyA9IHBzbW91c2UtPnBzMmRldi5zZXJpbzsKKwlwc21vdXNlX3JldF90IHJjID0gUFNNT1VTRV9HT09EX0RBVEE7CisJaW50IGZhaWxlZCA9IDAsIGVuYWJsZWQgPSAwOworCWludCBpOworCisJZG93bigmcHNtb3VzZV9zZW0pOworCisJaWYgKHBzbW91c2UtPnN0YXRlICE9IFBTTU9VU0VfUkVTWU5DSU5HKQorCQlnb3RvIG91dDsKKworCWlmIChzZXJpby0+cGFyZW50ICYmIHNlcmlvLT5pZC50eXBlID09IFNFUklPX1BTX1BTVEhSVSkgeworCQlwYXJlbnQgPSBzZXJpb19nZXRfZHJ2ZGF0YShzZXJpby0+cGFyZW50KTsKKwkJcHNtb3VzZV9kZWFjdGl2YXRlKHBhcmVudCk7CisJfQorCisvKgorICogU29tZSBtaWNlIGRvbid0IEFDSyBjb21tYW5kcyBzZW50IHdoaWxlIHRoZXkgYXJlIGluIHRoZSBtaWRkbGUgb2YKKyAqIHRyYW5zbWl0dGluZyBtb3Rpb24gcGFja2V0LiBUbyBhdm9pZCBkZWxheSB3ZSB1c2UgcHMyX3NlbmRieXRlKCkKKyAqIGluc3RlYWQgb2YgcHMyX2NvbW1hbmQoKSB3aGljaCB3b3VsZCB3YWl0IGZvciAyMDBtcyBmb3IgYW4gQUNLCisgKiB0aGF0IG1heSBuZXZlciBjb21lLgorICogQXMgYW4gYWRkaXRpb25hbCBxdWlyayBBTFBTIHRvdWNocGFkcyBtYXkgbm90IG9ubHkgZm9yZ2V0IHRvIEFDSworICogZGlzYWJsZSBjb21tYW5kIGJ1dCB3aWxsIHN0b3AgcmVwb3J0aW5nIHRhcHMsIHNvIGlmIHdlIHNlZSB0aGF0CisgKiBtb3VzZSBhdCBsZWFzdCBvbmNlIEFDS3MgZGlzYWJsZSB3ZSB3aWxsIGRvIGZ1bGwgcmVjb25uZWN0IGlmIEFDSworICogaXMgbWlzc2luZy4KKyAqLworCXBzbW91c2UtPm51bV9yZXN5bmNzKys7CisKKwlpZiAocHMyX3NlbmRieXRlKCZwc21vdXNlLT5wczJkZXYsIFBTTU9VU0VfQ01EX0RJU0FCTEUsIDIwKSkgeworCQlpZiAocHNtb3VzZS0+bnVtX3Jlc3luY3MgPCAzIHx8IHBzbW91c2UtPmFja3NfZGlzYWJsZV9jb21tYW5kKQorCQkJZmFpbGVkID0gMTsKKwl9IGVsc2UKKwkJcHNtb3VzZS0+YWNrc19kaXNhYmxlX2NvbW1hbmQgPSAxOworCisvKgorICogUG9sbCB0aGUgbW91c2UuIElmIGl0IHdhcyByZXNldCB0aGUgcGFja2V0IHdpbGwgYmUgc2hvcnRlciB0aGFuCisgKiBwc21vdXNlLT5wa3RzaXplIGFuZCBwczJfY29tbWFuZCB3aWxsIGZhaWwuIFdlIGRvIG5vdCBleHBlY3QgYW5kCisgKiBkbyBub3QgaGFuZGxlIHNjZW5hcmlvIHdoZW4gbW91c2UgInVwZ3JhZGVzIiBpdHMgcHJvdG9jb2wgd2hpbGUKKyAqIGRpc2Nvbm5lY3RlZCBzaW5jZSBpdCB3b3VsZCByZXF1aXJlIGFkZGl0aW9uYWwgZGVsYXkuIElmIHdlIGV2ZXIKKyAqIHNlZSBhIG1vdXNlIHRoYXQgZG9lcyBpdCB3ZSdsbCBhZGp1c3QgdGhlIGNvZGUuCisgKi8KKwlpZiAoIWZhaWxlZCkgeworCQlpZiAocHNtb3VzZS0+cG9sbChwc21vdXNlKSkKKwkJCWZhaWxlZCA9IDE7CisJCWVsc2UgeworCQkJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9DTURfTU9ERSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgcHNtb3VzZS0+cGt0c2l6ZTsgaSsrKSB7CisJCQkJcHNtb3VzZS0+cGt0Y250Kys7CisJCQkJcmMgPSBwc21vdXNlLT5wcm90b2NvbF9oYW5kbGVyKHBzbW91c2UsIE5VTEwpOworCQkJCWlmIChyYyAhPSBQU01PVVNFX0dPT0RfREFUQSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocmMgIT0gUFNNT1VTRV9GVUxMX1BBQ0tFVCkKKwkJCQlmYWlsZWQgPSAxOworCQkJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9SRVNZTkNJTkcpOworCQl9CisJfQorLyoKKyAqIE5vdyB0cnkgdG8gZW5hYmxlIG1vdXNlLiBXZSB0cnkgdG8gZG8gdGhhdCBldmVuIGlmIHBvbGwgZmFpbGVkIGFuZCBhbHNvCisgKiByZXBlYXQgb3VyIGF0dGVtcHRzIDUgdGltZXMsIG90aGVyd2lzZSB3ZSBtYXkgYmUgbGVmdCBvdXQgd2l0aCBkaXNhYmxlZAorICogbW91c2UuCisgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCWlmICghcHMyX2NvbW1hbmQoJnBzbW91c2UtPnBzMmRldiwgTlVMTCwgUFNNT1VTRV9DTURfRU5BQkxFKSkgeworCQkJZW5hYmxlZCA9IDE7CisJCQlicmVhazsKKwkJfQorCQltc2xlZXAoMjAwKTsKKwl9CisKKwlpZiAoIWVuYWJsZWQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicHNtb3VzZS5jOiBmYWlsZWQgdG8gcmUtZW5hYmxlIG1vdXNlIG9uICVzXG4iLAorCQkJcHNtb3VzZS0+cHMyZGV2LnNlcmlvLT5waHlzKTsKKwkJZmFpbGVkID0gMTsKKwl9CisKKwlpZiAoZmFpbGVkKSB7CisJCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfSUdOT1JFKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicHNtb3VzZS5jOiByZXN5bmMgZmFpbGVkLCBpc3N1aW5nIHJlY29ubmVjdCByZXF1ZXN0XG4iKTsKKwkJc2VyaW9fcmVjb25uZWN0KHNlcmlvKTsKKwl9IGVsc2UKKwkJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9BQ1RJVkFURUQpOworCisJaWYgKHBhcmVudCkKKwkJcHNtb3VzZV9hY3RpdmF0ZShwYXJlbnQpOworIG91dDoKKwl1cCgmcHNtb3VzZV9zZW0pOworfQogCiAvKgogICogcHNtb3VzZV9jbGVhbnVwKCkgcmVzZXRzIHRoZSBtb3VzZSBpbnRvIHBvd2VyLW9uIHN0YXRlLgpAQCAtODI1LDYgKzk3NywxMSBAQAogCiAJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9DTURfTU9ERSk7CiAKKwkvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBhIHJlc3luYyBpbiBwcm9ncmVzcyAqLworCXVwKCZwc21vdXNlX3NlbSk7CisJZmx1c2hfd29ya3F1ZXVlKGtwc21vdXNlZF93cSk7CisJZG93bigmcHNtb3VzZV9zZW0pOworCiAJaWYgKHNlcmlvLT5wYXJlbnQgJiYgc2VyaW8tPmlkLnR5cGUgPT0gU0VSSU9fUFNfUFNUSFJVKSB7CiAJCXBhcmVudCA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvLT5wYXJlbnQpOwogCQlwc21vdXNlX2RlYWN0aXZhdGUocGFyZW50KTsKQEAgLTg2Miw2ICsxMDE5LDcgQEAKIAogCXBzbW91c2UtPnNldF9yYXRlID0gcHNtb3VzZV9zZXRfcmF0ZTsKIAlwc21vdXNlLT5zZXRfcmVzb2x1dGlvbiA9IHBzbW91c2Vfc2V0X3Jlc29sdXRpb247CisJcHNtb3VzZS0+cG9sbCA9IHBzbW91c2VfcG9sbDsKIAlwc21vdXNlLT5wcm90b2NvbF9oYW5kbGVyID0gcHNtb3VzZV9wcm9jZXNzX2J5dGU7CiAJcHNtb3VzZS0+cGt0c2l6ZSA9IDM7CiAKQEAgLTg3Nyw2ICsxMDM1LDIzIEBACiAJZWxzZQogCQlwc21vdXNlLT50eXBlID0gcHNtb3VzZV9leHRlbnNpb25zKHBzbW91c2UsIHBzbW91c2VfbWF4X3Byb3RvLCAxKTsKIAorCS8qCisJICogSWYgbW91c2UncyBwYWNrZXQgc2l6ZSBpcyAzIHRoZXJlIGlzIG5vIHBvaW50IGluIHBvbGxpbmcgdGhlCisJICogZGV2aWNlIGluIGhvcGVzIHRvIGRldGVjdCBwcm90b2NvbCByZXNldCAtIHdlIHdvbid0IGdldCBsZXNzCisJICogdGhhbiAzIGJ5dGVzIHJlc3BvbnNlIGFueWhvdy4KKwkgKi8KKwlpZiAocHNtb3VzZS0+cGt0c2l6ZSA9PSAzKQorCQlwc21vdXNlLT5yZXN5bmNfdGltZSA9IDA7CisKKwkvKgorCSAqIFNvbWUgc21hcnQgS1ZNcyBmYWtlIHJlc3BvbnNlIHRvIFBPTEwgY29tbWFuZCByZXR1cm5pbmcganVzdAorCSAqIDMgYnl0ZXMgYW5kIG1lc3NpbmcgdXAgb3VyIHJlc3luYyBsb2dpYywgc28gaWYgaW5pdGlhbCBwb2xsCisJICogZmFpbHMgd2Ugd29uJ3QgdHJ5IHBvbGxpbmcgdGhlIGRldmljZSBhbnltb3JlLiBIb3BlZnVsbHkKKwkgKiBzdWNoIEtWTSB3aWxsIG1haW50YWluIGluaXRpYWxseSBzZWxlY3RlZCBwcm90b2NvbC4KKwkgKi8KKwlpZiAocHNtb3VzZS0+cmVzeW5jX3RpbWUgJiYgcHNtb3VzZS0+cG9sbChwc21vdXNlKSkKKwkJcHNtb3VzZS0+cmVzeW5jX3RpbWUgPSAwOworCiAJc3ByaW50Zihwc21vdXNlLT5kZXZuYW1lLCAiJXMgJXMgJXMiLAogCQlwc21vdXNlX3Byb3RvY29sX2J5X3R5cGUocHNtb3VzZS0+dHlwZSktPm5hbWUsIHBzbW91c2UtPnZlbmRvciwgcHNtb3VzZS0+bmFtZSk7CiAKQEAgLTkxNyw2ICsxMDkyLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlwczJfaW5pdCgmcHNtb3VzZS0+cHMyZGV2LCBzZXJpbyk7CisJSU5JVF9XT1JLKCZwc21vdXNlLT5yZXN5bmNfd29yaywgcHNtb3VzZV9yZXN5bmMsIHBzbW91c2UpOwogCXBzbW91c2UtPmRldiA9IGlucHV0X2RldjsKIAlzcHJpbnRmKHBzbW91c2UtPnBoeXMsICIlcy9pbnB1dDAiLCBzZXJpby0+cGh5cyk7CiAKQEAgLTkzNyw2ICsxMTEzLDcgQEAKIAlwc21vdXNlLT5yYXRlID0gcHNtb3VzZV9yYXRlOwogCXBzbW91c2UtPnJlc29sdXRpb24gPSBwc21vdXNlX3Jlc29sdXRpb247CiAJcHNtb3VzZS0+cmVzZXRhZnRlciA9IHBzbW91c2VfcmVzZXRhZnRlcjsKKwlwc21vdXNlLT5yZXN5bmNfdGltZSA9IHBhcmVudCA/IDAgOiBwc21vdXNlX3Jlc3luY190aW1lOwogCXBzbW91c2UtPnNtYXJ0c2Nyb2xsID0gcHNtb3VzZV9zbWFydHNjcm9sbDsKIAogCXBzbW91c2Vfc3dpdGNoX3Byb3RvY29sKHBzbW91c2UsIE5VTEwpOwpAQCAtMTI4MSwxMyArMTQ1OCwyMSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBwc21vdXNlX2luaXQodm9pZCkKIHsKKwlrcHNtb3VzZWRfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgia3BzbW91c2VkIik7CisJaWYgKCFrcHNtb3VzZWRfd3EpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwc21vdXNlOiBmYWlsZWQgdG8gY3JlYXRlIGtwc21vdXNlZCB3b3JrcXVldWVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAlzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJnBzbW91c2VfZHJ2KTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcHNtb3VzZV9leGl0KHZvaWQpCiB7CiAJc2VyaW9fdW5yZWdpc3Rlcl9kcml2ZXIoJnBzbW91c2VfZHJ2KTsKKwlkZXN0cm95X3dvcmtxdWV1ZShrcHNtb3VzZWRfd3EpOwogfQogCiBtb2R1bGVfaW5pdChwc21vdXNlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLmggYi9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UuaAppbmRleCA3YzQxOTJiLi40ZDkxMDdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UuaAorKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UuaApAQCAtNyw3ICs3LDcgQEAKICNkZWZpbmUgUFNNT1VTRV9DTURfR0VUSU5GTwkweDAzZTkKICNkZWZpbmUgUFNNT1VTRV9DTURfU0VUU1RSRUFNCTB4MDBlYQogI2RlZmluZSBQU01PVVNFX0NNRF9TRVRQT0xMCTB4MDBmMAotI2RlZmluZSBQU01PVVNFX0NNRF9QT0xMCTB4MDNlYgorI2RlZmluZSBQU01PVVNFX0NNRF9QT0xMCTB4MDBlYgkvKiBjYWxsZXIgc2V0cyBudW1iZXIgb2YgYnl0ZXMgdG8gcmVjZWl2ZSAqLwogI2RlZmluZSBQU01PVVNFX0NNRF9HRVRJRAkweDAyZjIKICNkZWZpbmUgUFNNT1VTRV9DTURfU0VUUkFURQkweDEwZjMKICNkZWZpbmUgUFNNT1VTRV9DTURfRU5BQkxFCTB4MDBmNApAQCAtMjMsNiArMjMsNyBAQAogZW51bSBwc21vdXNlX3N0YXRlIHsKIAlQU01PVVNFX0lHTk9SRSwKIAlQU01PVVNFX0lOSVRJQUxJWklORywKKwlQU01PVVNFX1JFU1lOQ0lORywKIAlQU01PVVNFX0NNRF9NT0RFLAogCVBTTU9VU0VfQUNUSVZBVEVELAogfTsKQEAgLTM4LDE1ICszOSwxOSBAQAogCXZvaWQgKnByaXZhdGU7CiAJc3RydWN0IGlucHV0X2RldiAqZGV2OwogCXN0cnVjdCBwczJkZXYgcHMyZGV2OworCXN0cnVjdCB3b3JrX3N0cnVjdCByZXN5bmNfd29yazsKIAljaGFyICp2ZW5kb3I7CiAJY2hhciAqbmFtZTsKIAl1bnNpZ25lZCBjaGFyIHBhY2tldFs4XTsKKwl1bnNpZ25lZCBjaGFyIGJhZGJ5dGU7CiAJdW5zaWduZWQgY2hhciBwa3RjbnQ7CiAJdW5zaWduZWQgY2hhciBwa3RzaXplOwogCXVuc2lnbmVkIGNoYXIgdHlwZTsKKwl1bnNpZ25lZCBjaGFyIGFja3NfZGlzYWJsZV9jb21tYW5kOwogCXVuc2lnbmVkIGludCBtb2RlbDsKIAl1bnNpZ25lZCBsb25nIGxhc3Q7CiAJdW5zaWduZWQgbG9uZyBvdXRfb2Zfc3luYzsKKwl1bnNpZ25lZCBsb25nIG51bV9yZXN5bmNzOwogCWVudW0gcHNtb3VzZV9zdGF0ZSBzdGF0ZTsKIAljaGFyIGRldm5hbWVbNjRdOwogCWNoYXIgcGh5c1szMl07CkBAIC01NCw2ICs1OSw3IEBACiAJdW5zaWduZWQgaW50IHJhdGU7CiAJdW5zaWduZWQgaW50IHJlc29sdXRpb247CiAJdW5zaWduZWQgaW50IHJlc2V0YWZ0ZXI7CisJdW5zaWduZWQgaW50IHJlc3luY190aW1lOwogCXVuc2lnbmVkIGludCBzbWFydHNjcm9sbDsJLyogTG9naXRlY2ggb25seSAqLwogCiAJcHNtb3VzZV9yZXRfdCAoKnByb3RvY29sX2hhbmRsZXIpKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CkBAIC02Miw2ICs2OCw3IEBACiAKIAlpbnQgKCpyZWNvbm5lY3QpKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKTsKIAl2b2lkICgqZGlzY29ubmVjdCkoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpOworCWludCAoKnBvbGwpKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKTsKIAogCXZvaWQgKCpwdF9hY3RpdmF0ZSkoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpOwogCXZvaWQgKCpwdF9kZWFjdGl2YXRlKShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuYwppbmRleCA5N2NkZmQ2Li4yMDUxYmVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmMKQEAgLTY1Miw2ICs2NTIsOCBAQAogCXBzbW91c2UtPmRpc2Nvbm5lY3QgPSBzeW5hcHRpY3NfZGlzY29ubmVjdDsKIAlwc21vdXNlLT5yZWNvbm5lY3QgPSBzeW5hcHRpY3NfcmVjb25uZWN0OwogCXBzbW91c2UtPnBrdHNpemUgPSA2OworCS8qIFN5bmFwdGljcyBjYW4gdXN1YWxseSBzdGF5IGluIHN5bmMgd2l0aG91dCBleHRyYSBoZWxwICovCisJcHNtb3VzZS0+cmVzeW5jX3RpbWUgPSAwOwogCiAJaWYgKFNZTl9DQVBfUEFTU19USFJPVUdIKHByaXYtPmNhcGFiaWxpdGllcykpCiAJCXN5bmFwdGljc19wdF9jcmVhdGUocHNtb3VzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMgYi9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMKaW5kZXggMmQwYWY0NC4uODFmZDdhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZWRldi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2VkZXYuYwpAQCAtNDAsMTUgKzQwLDE1IEBACiAjZW5kaWYKIAogc3RhdGljIGludCB4cmVzID0gQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YOwotbW9kdWxlX3BhcmFtKHhyZXMsIHVpbnQsIDApOworbW9kdWxlX3BhcmFtKHhyZXMsIHVpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyh4cmVzLCAiSG9yaXpvbnRhbCBzY3JlZW4gcmVzb2x1dGlvbiIpOwogCiBzdGF0aWMgaW50IHlyZXMgPSBDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k7Ci1tb2R1bGVfcGFyYW0oeXJlcywgdWludCwgMCk7Cittb2R1bGVfcGFyYW0oeXJlcywgdWludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHlyZXMsICJWZXJ0aWNhbCBzY3JlZW4gcmVzb2x1dGlvbiIpOwogCiBzdGF0aWMgdW5zaWduZWQgdGFwX3RpbWUgPSAyMDA7Ci1tb2R1bGVfcGFyYW0odGFwX3RpbWUsIHVpbnQsIDApOworbW9kdWxlX3BhcmFtKHRhcF90aW1lLCB1aW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0ModGFwX3RpbWUsICJUYXAgdGltZSBmb3IgdG91Y2hwYWRzIGluIGFic29sdXRlIG1vZGUgKG1zZWNzKSIpOwogCiBzdHJ1Y3QgbW91c2VkZXZfaHdfZGF0YSB7CkBAIC0xNTUsNyArMTU1LDcgQEAKIAlzd2l0Y2ggKGNvZGUpIHsKIAkJY2FzZSBBQlNfWDoKIAkJCXNpemUgPSBkZXYtPmFic21heFtBQlNfWF0gLSBkZXYtPmFic21pbltBQlNfWF07Ci0JCQlpZiAoc2l6ZSA9PSAwKSBzaXplID0geHJlczsKKwkJCWlmIChzaXplID09IDApIHNpemUgPSB4cmVzID8gOiAxOwogCQkJaWYgKHZhbHVlID4gZGV2LT5hYnNtYXhbQUJTX1hdKSB2YWx1ZSA9IGRldi0+YWJzbWF4W0FCU19YXTsKIAkJCWlmICh2YWx1ZSA8IGRldi0+YWJzbWluW0FCU19YXSkgdmFsdWUgPSBkZXYtPmFic21pbltBQlNfWF07CiAJCQltb3VzZWRldi0+cGFja2V0LnggPSAoKHZhbHVlIC0gZGV2LT5hYnNtaW5bQUJTX1hdKSAqIHhyZXMpIC8gc2l6ZTsKQEAgLTE2NCw3ICsxNjQsNyBAQAogCiAJCWNhc2UgQUJTX1k6CiAJCQlzaXplID0gZGV2LT5hYnNtYXhbQUJTX1ldIC0gZGV2LT5hYnNtaW5bQUJTX1ldOwotCQkJaWYgKHNpemUgPT0gMCkgc2l6ZSA9IHlyZXM7CisJCQlpZiAoc2l6ZSA9PSAwKSBzaXplID0geXJlcyA/IDogMTsKIAkJCWlmICh2YWx1ZSA+IGRldi0+YWJzbWF4W0FCU19ZXSkgdmFsdWUgPSBkZXYtPmFic21heFtBQlNfWV07CiAJCQlpZiAodmFsdWUgPCBkZXYtPmFic21pbltBQlNfWV0pIHZhbHVlID0gZGV2LT5hYnNtaW5bQUJTX1ldOwogCQkJbW91c2VkZXYtPnBhY2tldC55ID0geXJlcyAtICgodmFsdWUgLSBkZXYtPmFic21pbltBQlNfWV0pICogeXJlcykgLyBzaXplOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9hbWJha21pLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2FtYmFrbWkuYwppbmRleCA5YjFhYjVlLi4zZGY1ZWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL2FtYmFrbWkuYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2FtYmFrbWkuYwpAQCAtMTksMTIgKzE5LDEyIEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL2ttaS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hbWJhLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2FtYmFfa21pLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CiAKICNkZWZpbmUgS01JX0JBU0UJKGttaS0+YmFzZSkKIApAQCAtNzIsMTMgKzcyLDkgQEAKIAl1bnNpZ25lZCBpbnQgZGl2aXNvcjsKIAlpbnQgcmV0OwogCi0JcmV0ID0gY2xrX3VzZShrbWktPmNsayk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KIAlyZXQgPSBjbGtfZW5hYmxlKGttaS0+Y2xrKTsKIAlpZiAocmV0KQotCQlnb3RvIGNsa191bnVzZTsKKwkJZ290byBvdXQ7CiAKIAlkaXZpc29yID0gY2xrX2dldF9yYXRlKGttaS0+Y2xrKSAvIDgwMDAwMDAgLSAxOwogCXdyaXRlYihkaXZpc29yLCBLTUlDTEtESVYpOwpAQCAtOTcsOCArOTMsNiBAQAogCiAgY2xrX2Rpc2FibGU6CiAJY2xrX2Rpc2FibGUoa21pLT5jbGspOwotIGNsa191bnVzZToKLQljbGtfdW51c2Uoa21pLT5jbGspOwogIG91dDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTExLDcgKzEwNSw2IEBACiAKIAlmcmVlX2lycShrbWktPmlycSwga21pKTsKIAljbGtfZGlzYWJsZShrbWktPmNsayk7Ci0JY2xrX3VudXNlKGttaS0+Y2xrKTsKIH0KIAogc3RhdGljIGludCBhbWJhX2ttaV9wcm9iZShzdHJ1Y3QgYW1iYV9kZXZpY2UgKmRldiwgdm9pZCAqaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2N0ODJjNzEwLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2N0ODJjNzEwLmMKaW5kZXggNGRhNmM4Ni4uMDk2YjZhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9jdDgyYzcxMC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vY3Q4MmM3MTAuYwpAQCAtMTU0LDcgKzE1NCw3IEBACiAgKiBTZWUgaWYgd2UgY2FuIGZpbmQgYSA4MkM3MTAgZGV2aWNlLiBSZWFkIG1vdXNlIGFkZHJlc3MuCiAgKi8KIAotc3RhdGljIGludCBfX2luaXQgY3Q4MmM3MTBfcHJvYmUodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGN0ODJjNzEwX2RldGVjdCh2b2lkKQogewogCW91dGJfcCgweDU1LCAweDJmYSk7CQkJCS8qIEFueSB2YWx1ZSBleGNlcHQgOSwgZmYgb3IgMzYgKi8KIAlvdXRiX3AoMHhhYSwgMHgzZmEpOwkJCQkvKiBJbnZlcnNlIG9mIDU1ICovCkBAIC0xNjMsNyArMTYzLDcgQEAKIAlvdXRiX3AoMHgxYiwgMHgyZmEpOwkJCQkvKiBJbnZlcnNlIG9mIGU0ICovCiAJb3V0Yl9wKDB4MGYsIDB4MzkwKTsJCQkJLyogV3JpdGUgaW5kZXggKi8KIAlpZiAoaW5iX3AoMHgzOTEpICE9IDB4ZTQpCQkJLyogQ29uZmlnIGFkZHJlc3MgZm91bmQ/ICovCi0JCXJldHVybiAtMTsJCQkJLyogTm86IG5vIDgyQzcxMCBoZXJlICovCisJCXJldHVybiAtRU5PREVWOwkJCQkvKiBObzogbm8gODJDNzEwIGhlcmUgKi8KIAogCW91dGJfcCgweDBkLCAweDM5MCk7CQkJCS8qIFdyaXRlIGluZGV4ICovCiAJY3Q4MmM3MTBfaW9yZXMuc3RhcnQgPSBpbmJfcCgweDM5MSkgPDwgMjsJLyogR2V0IG1vdXNlIEkvTyBhZGRyZXNzICovCkBAIC0xNzUsNTEgKzE3NSw4OCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNlcmlvICogX19pbml0IGN0ODJjNzEwX2FsbG9jYXRlX3BvcnQodm9pZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGN0ODJjNzEwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgc2VyaW8gKnNlcmlvOworCWN0ODJjNzEwX3BvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VyaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWN0ODJjNzEwX3BvcnQpCisJCXJldHVybiAtRU5PTUVNOwogCi0Jc2VyaW8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VyaW8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoc2VyaW8pIHsKLQkJbWVtc2V0KHNlcmlvLCAwLCBzaXplb2Yoc3RydWN0IHNlcmlvKSk7Ci0JCXNlcmlvLT5pZC50eXBlID0gU0VSSU9fODA0MjsKLQkJc2VyaW8tPm9wZW4gPSBjdDgyYzcxMF9vcGVuOwotCQlzZXJpby0+Y2xvc2UgPSBjdDgyYzcxMF9jbG9zZTsKLQkJc2VyaW8tPndyaXRlID0gY3Q4MmM3MTBfd3JpdGU7Ci0JCXNlcmlvLT5kZXYucGFyZW50ID0gJmN0ODJjNzEwX2RldmljZS0+ZGV2OwotCQlzdHJsY3B5KHNlcmlvLT5uYW1lLCAiQyZUIDgyYzcxMCBtb3VzZSBwb3J0Iiwgc2l6ZW9mKHNlcmlvLT5uYW1lKSk7Ci0JCXNucHJpbnRmKHNlcmlvLT5waHlzLCBzaXplb2Yoc2VyaW8tPnBoeXMpLCAiaXNhJTA0bHgvc2VyaW8wIiwgQ1Q4MkM3MTBfREFUQSk7Ci0JfQorCWN0ODJjNzEwX3BvcnQtPmlkLnR5cGUgPSBTRVJJT184MDQyOworCWN0ODJjNzEwX3BvcnQtPmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CisJY3Q4MmM3MTBfcG9ydC0+b3BlbiA9IGN0ODJjNzEwX29wZW47CisJY3Q4MmM3MTBfcG9ydC0+Y2xvc2UgPSBjdDgyYzcxMF9jbG9zZTsKKwljdDgyYzcxMF9wb3J0LT53cml0ZSA9IGN0ODJjNzEwX3dyaXRlOworCXN0cmxjcHkoY3Q4MmM3MTBfcG9ydC0+bmFtZSwgIkMmVCA4MmM3MTAgbW91c2UgcG9ydCIsCisJCXNpemVvZihjdDgyYzcxMF9wb3J0LT5uYW1lKSk7CisJc25wcmludGYoY3Q4MmM3MTBfcG9ydC0+cGh5cywgc2l6ZW9mKGN0ODJjNzEwX3BvcnQtPnBoeXMpLAorCQkgImlzYSUwNGx4L3NlcmlvMCIsIENUODJDNzEwX0RBVEEpOwogCi0JcmV0dXJuIHNlcmlvOworCXNlcmlvX3JlZ2lzdGVyX3BvcnQoY3Q4MmM3MTBfcG9ydCk7CisKKwlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBfX2RldmV4aXQgY3Q4MmM3MTBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzZXJpb191bnJlZ2lzdGVyX3BvcnQoY3Q4MmM3MTBfcG9ydCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY3Q4MmM3MTBfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJjdDgyYzcxMCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGN0ODJjNzEwX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoY3Q4MmM3MTBfcmVtb3ZlKSwKK307CisKKwogc3RhdGljIGludCBfX2luaXQgY3Q4MmM3MTBfaW5pdCh2b2lkKQogewotCWlmIChjdDgyYzcxMF9wcm9iZSgpKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlpbnQgZXJyb3I7CiAKLQljdDgyYzcxMF9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJjdDgyYzcxMCIsIC0xLCAmY3Q4MmM3MTBfaW9yZXMsIDEpOwotCWlmIChJU19FUlIoY3Q4MmM3MTBfZGV2aWNlKSkKLQkJcmV0dXJuIFBUUl9FUlIoY3Q4MmM3MTBfZGV2aWNlKTsKKwllcnJvciA9IGN0ODJjNzEwX2RldGVjdCgpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOwogCi0JaWYgKCEoY3Q4MmM3MTBfcG9ydCA9IGN0ODJjNzEwX2FsbG9jYXRlX3BvcnQoKSkpIHsKLQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoY3Q4MmM3MTBfZGV2aWNlKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJZXJyb3IgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmN0ODJjNzEwX2RyaXZlcik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwljdDgyYzcxMF9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoImN0ODJjNzEwIiwgLTEpOworCWlmICghY3Q4MmM3MTBfZGV2aWNlKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlcnJfdW5yZWdpc3Rlcl9kcml2ZXI7CiAJfQogCisJZXJyb3IgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhjdDgyYzcxMF9kZXZpY2UsICZjdDgyYzcxMF9pb3JlcywgMSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycl9mcmVlX2RldmljZTsKKworCWVycm9yID0gcGxhdGZvcm1fZGV2aWNlX2FkZChjdDgyYzcxMF9kZXZpY2UpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJfZnJlZV9kZXZpY2U7CisKIAlzZXJpb19yZWdpc3Rlcl9wb3J0KGN0ODJjNzEwX3BvcnQpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAic2VyaW86IEMmVCA4MmM3MTAgbW91c2UgcG9ydCBhdCAlI2x4IGlycSAlZFxuIiwKIAkJQ1Q4MkM3MTBfREFUQSwgQ1Q4MkM3MTBfSVJRKTsKIAogCXJldHVybiAwOworCisgZXJyX2ZyZWVfZGV2aWNlOgorCXBsYXRmb3JtX2RldmljZV9wdXQoY3Q4MmM3MTBfZGV2aWNlKTsKKyBlcnJfdW5yZWdpc3Rlcl9kcml2ZXI6CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmN0ODJjNzEwX2RyaXZlcik7CisJcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY3Q4MmM3MTBfZXhpdCh2b2lkKQogewotCXNlcmlvX3VucmVnaXN0ZXJfcG9ydChjdDgyYzcxMF9wb3J0KTsKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihjdDgyYzcxMF9kZXZpY2UpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjdDgyYzcxMF9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChjdDgyYzcxMF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIteDg2aWE2NGlvLmggYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXg4NmlhNjRpby5oCmluZGV4IDI3M2JiM2IuLmE0YzZmMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIteDg2aWE2NGlvLmgKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi14ODZpYTY0aW8uaApAQCAtODQsNiArODQsMTQgQEAKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9WRVJTSU9OLCAiREw3NjAiKSwKIAkJfSwKIAl9LAorCXsKKwkJLmlkZW50ID0gIk9RTyBNb2RlbCAwMSIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiT1FPIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlpFUFRPIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfVkVSU0lPTiwgIjAwIiksCisJCX0sCisJfSwKIAl7IH0KIH07CiAKQEAgLTE1OCw2ICsxNjYsMjAgQEAKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiU2VudGlhIiksCiAJCX0sCiAJfSwKKwl7CisJCS5pZGVudCA9ICJTaGFycCBBY3RpdXMgTU0yMCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU0hBUlAiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUEMtTU0yMCBTZXJpZXMiKSwKKwkJfSwKKwl9LAorCXsKKwkJLmlkZW50ID0gIlNvbnkgVmFpbyBGUy0xMTViIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJTb255IENvcnBvcmF0aW9uIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZHTi1GUzExNUIiKSwKKwkJfSwKKwl9LAogCXsgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi5jIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi5jCmluZGV4IGFjODZjMWQuLmE3ZDkxZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIuYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLmMKQEAgLTU3Miw3ICs1NzIsNyBAQAogICogTENTL1RlbGVncmFwaGljcy4KICAqLwogCi1zdGF0aWMgaW50IF9faW5pdCBpODA0Ml9jaGVja19tdXgodm9pZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGk4MDQyX2NoZWNrX211eCh2b2lkKQogewogCXVuc2lnbmVkIGNoYXIgbXV4X3ZlcnNpb247CiAKQEAgLTYwMCw3ICs2MDAsNyBAQAogICogdGhlIHByZXNlbmNlIG9mIGFuIEFVWCBpbnRlcmZhY2UuCiAgKi8KIAotc3RhdGljIGludCBfX2luaXQgaTgwNDJfY2hlY2tfYXV4KHZvaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpODA0Ml9jaGVja19hdXgodm9pZCkKIHsKIAl1bnNpZ25lZCBjaGFyIHBhcmFtOwogCXN0YXRpYyBpbnQgaTgwNDJfY2hlY2tfYXV4X2Nvb2tpZTsKQEAgLTY3OCw3ICs2NzgsNyBAQAogICogcmVnaXN0ZXJzIGl0LCBhbmQgcmVwb3J0cyB0byB0aGUgdXNlci4KICAqLwogCi1zdGF0aWMgaW50IF9faW5pdCBpODA0Ml9wb3J0X3JlZ2lzdGVyKHN0cnVjdCBpODA0Ml9wb3J0ICpwb3J0KQorc3RhdGljIGludCBfX2RldmluaXQgaTgwNDJfcG9ydF9yZWdpc3RlcihzdHJ1Y3QgaTgwNDJfcG9ydCAqcG9ydCkKIHsKIAlpODA0Ml9jdHIgJj0gfnBvcnQtPmRpc2FibGU7CiAKQEAgLTk1Niw3ICs5NTYsNiBAQAogCXBhbmljX2JsaW5rID0gaTgwNDJfcGFuaWNfYmxpbms7CiAKIAlyZXR1cm4gMDsKLQogfQogCiAvKgpAQCAtOTY5LDE2ICs5NjgsNyBAQAogCWk4MDQyX2NvbnRyb2xsZXJfY2xlYW51cCgpOwogfQogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpODA0Ml9kcml2ZXIgPSB7Ci0JLnN1c3BlbmQJPSBpODA0Ml9zdXNwZW5kLAotCS5yZXN1bWUJCT0gaTgwNDJfcmVzdW1lLAotCS5zaHV0ZG93bgk9IGk4MDQyX3NodXRkb3duLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJpODA0MiIsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGk4MDQyX2NyZWF0ZV9rYmRfcG9ydCh2b2lkKQorc3RhdGljIGludCBfX2RldmluaXQgaTgwNDJfY3JlYXRlX2tiZF9wb3J0KHZvaWQpCiB7CiAJc3RydWN0IHNlcmlvICpzZXJpbzsKIAlzdHJ1Y3QgaTgwNDJfcG9ydCAqcG9ydCA9ICZpODA0Ml9wb3J0c1tJODA0Ml9LQkRfUE9SVF9OT107CkBAIC0xMDAzLDcgKzk5Myw3IEBACiAJcmV0dXJuIGk4MDQyX3BvcnRfcmVnaXN0ZXIocG9ydCk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGk4MDQyX2NyZWF0ZV9hdXhfcG9ydCh2b2lkKQorc3RhdGljIGludCBfX2RldmluaXQgaTgwNDJfY3JlYXRlX2F1eF9wb3J0KHZvaWQpCiB7CiAJc3RydWN0IHNlcmlvICpzZXJpbzsKIAlzdHJ1Y3QgaTgwNDJfcG9ydCAqcG9ydCA9ICZpODA0Ml9wb3J0c1tJODA0Ml9BVVhfUE9SVF9OT107CkBAIC0xMDI4LDcgKzEwMTgsNyBAQAogCXJldHVybiBpODA0Ml9wb3J0X3JlZ2lzdGVyKHBvcnQpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBpODA0Ml9jcmVhdGVfbXV4X3BvcnQoaW50IGluZGV4KQorc3RhdGljIGludCBfX2RldmluaXQgaTgwNDJfY3JlYXRlX211eF9wb3J0KGludCBpbmRleCkKIHsKIAlzdHJ1Y3Qgc2VyaW8gKnNlcmlvOwogCXN0cnVjdCBpODA0Ml9wb3J0ICpwb3J0ID0gJmk4MDQyX3BvcnRzW0k4MDQyX01VWF9QT1JUX05PICsgaW5kZXhdOwpAQCAtMTA1NywzNyArMTA0NywxNiBAQAogCXJldHVybiBpODA0Ml9wb3J0X3JlZ2lzdGVyKHBvcnQpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBpODA0Ml9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpODA0Ml9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJaW50IGksIGhhdmVfcG9ydHMgPSAwOwogCWludCBlcnI7CiAKLQlkYmdfaW5pdCgpOwotCiAJaW5pdF90aW1lcigmaTgwNDJfdGltZXIpOwogCWk4MDQyX3RpbWVyLmZ1bmN0aW9uID0gaTgwNDJfdGltZXJfZnVuYzsKIAotCWVyciA9IGk4MDQyX3BsYXRmb3JtX2luaXQoKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaTgwNDJfcG9ydHNbSTgwNDJfQVVYX1BPUlRfTk9dLmlycSA9IEk4MDQyX0FVWF9JUlE7Ci0JaTgwNDJfcG9ydHNbSTgwNDJfS0JEX1BPUlRfTk9dLmlycSA9IEk4MDQyX0tCRF9JUlE7Ci0KLQlpZiAoaTgwNDJfY29udHJvbGxlcl9pbml0KCkpIHsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBlcnJfcGxhdGZvcm1fZXhpdDsKLQl9Ci0KLQllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmk4MDQyX2RyaXZlcik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfY29udHJvbGxlcl9jbGVhbnVwOwotCi0JaTgwNDJfcGxhdGZvcm1fZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiaTgwNDIiLCAtMSwgTlVMTCwgMCk7Ci0JaWYgKElTX0VSUihpODA0Ml9wbGF0Zm9ybV9kZXZpY2UpKSB7Ci0JCWVyciA9IFBUUl9FUlIoaTgwNDJfcGxhdGZvcm1fZGV2aWNlKTsKLQkJZ290byBlcnJfdW5yZWdpc3Rlcl9kcml2ZXI7Ci0JfQorCWlmIChpODA0Ml9jb250cm9sbGVyX2luaXQoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoIWk4MDQyX25vYXV4ICYmICFpODA0Ml9jaGVja19hdXgoKSkgewogCQlpZiAoIWk4MDQyX25vbXV4ICYmICFpODA0Ml9jaGVja19tdXgoKSkgewpAQCAtMTExMywzMCArMTA4MiwyMyBAQAogCiAJaWYgKCFoYXZlX3BvcnRzKSB7CiAJCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX3VucmVnaXN0ZXJfZGV2aWNlOworCQlnb3RvIGVycl9jb250cm9sbGVyX2NsZWFudXA7CiAJfQogCiAJbW9kX3RpbWVyKCZpODA0Ml90aW1lciwgamlmZmllcyArIEk4MDQyX1BPTExfUEVSSU9EKTsKLQogCXJldHVybiAwOwogCiAgZXJyX3VucmVnaXN0ZXJfcG9ydHM6CiAJZm9yIChpID0gMDsgaSA8IEk4MDQyX05VTV9QT1JUUzsgaSsrKQogCQlpZiAoaTgwNDJfcG9ydHNbaV0uc2VyaW8pCiAJCQlzZXJpb191bnJlZ2lzdGVyX3BvcnQoaTgwNDJfcG9ydHNbaV0uc2VyaW8pOwotIGVycl91bnJlZ2lzdGVyX2RldmljZToKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihpODA0Ml9wbGF0Zm9ybV9kZXZpY2UpOwotIGVycl91bnJlZ2lzdGVyX2RyaXZlcjoKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaTgwNDJfZHJpdmVyKTsKICBlcnJfY29udHJvbGxlcl9jbGVhbnVwOgogCWk4MDQyX2NvbnRyb2xsZXJfY2xlYW51cCgpOwotIGVycl9wbGF0Zm9ybV9leGl0OgotCWk4MDQyX3BsYXRmb3JtX2V4aXQoKTsKIAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBpODA0Ml9leGl0KHZvaWQpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBpODA0Ml9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewogCWludCBpOwogCkBAIC0xMTQ4LDYgKzExMTAsNjIgQEAKIAogCWRlbF90aW1lcl9zeW5jKCZpODA0Ml90aW1lcik7CiAKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaTgwNDJfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJpODA0MiIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGk4MDQyX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoaTgwNDJfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IGk4MDQyX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBpODA0Ml9yZXN1bWUsCisJLnNodXRkb3duCT0gaTgwNDJfc2h1dGRvd24sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpODA0Ml9pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCWRiZ19pbml0KCk7CisKKwllcnIgPSBpODA0Ml9wbGF0Zm9ybV9pbml0KCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWk4MDQyX3BvcnRzW0k4MDQyX0FVWF9QT1JUX05PXS5pcnEgPSBJODA0Ml9BVVhfSVJROworCWk4MDQyX3BvcnRzW0k4MDQyX0tCRF9QT1JUX05PXS5pcnEgPSBJODA0Ml9LQkRfSVJROworCisJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZpODA0Ml9kcml2ZXIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3BsYXRmb3JtX2V4aXQ7CisKKwlpODA0Ml9wbGF0Zm9ybV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoImk4MDQyIiwgLTEpOworCWlmICghaTgwNDJfcGxhdGZvcm1fZGV2aWNlKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3VucmVnaXN0ZXJfZHJpdmVyOworCX0KKworCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQoaTgwNDJfcGxhdGZvcm1fZGV2aWNlKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlX2RldmljZTsKKworCXJldHVybiAwOworCisgZXJyX2ZyZWVfZGV2aWNlOgorCXBsYXRmb3JtX2RldmljZV9wdXQoaTgwNDJfcGxhdGZvcm1fZGV2aWNlKTsKKyBlcnJfdW5yZWdpc3Rlcl9kcml2ZXI6CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmk4MDQyX2RyaXZlcik7CisgZXJyX3BsYXRmb3JtX2V4aXQ6CisJaTgwNDJfcGxhdGZvcm1fZXhpdCgpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGk4MDQyX2V4aXQodm9pZCkKK3sKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihpODA0Ml9wbGF0Zm9ybV9kZXZpY2UpOwogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZpODA0Ml9kcml2ZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL21hY2VwczIuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vbWFjZXBzMi5jCmluZGV4IGQ4NTdmNzAuLmYwOGE1ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vbWFjZXBzMi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vbWFjZXBzMi5jCkBAIC0xMTgsMTMgKzExOCwxMiBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3Qgc2VyaW8gKiBfX2luaXQgbWFjZXBzMl9hbGxvY2F0ZV9wb3J0KGludCBpZHgpCitzdGF0aWMgc3RydWN0IHNlcmlvICogX19kZXZpbml0IG1hY2VwczJfYWxsb2NhdGVfcG9ydChpbnQgaWR4KQogewogCXN0cnVjdCBzZXJpbyAqc2VyaW87CiAKLQlzZXJpbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXJpbyksIEdGUF9LRVJORUwpOworCXNlcmlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNlcmlvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNlcmlvKSB7Ci0JCW1lbXNldChzZXJpbywgMCwgc2l6ZW9mKHN0cnVjdCBzZXJpbykpOwogCQlzZXJpby0+aWQudHlwZQkJPSBTRVJJT184MDQyOwogCQlzZXJpby0+d3JpdGUJCT0gbWFjZXBzMl93cml0ZTsKIAkJc2VyaW8tPm9wZW4JCT0gbWFjZXBzMl9vcGVuOwpAQCAtMTM4LDI0ICsxMzcsMTMgQEAKIAlyZXR1cm4gc2VyaW87CiB9CiAKLQotc3RhdGljIGludCBfX2luaXQgbWFjZXBzMl9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtYWNlcHMyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKLQltYWNlcHMyX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoIm1hY2VwczIiLCAtMSwgTlVMTCwgMCk7Ci0JaWYgKElTX0VSUihtYWNlcHMyX2RldmljZSkpCi0JCXJldHVybiBQVFJfRVJSKG1hY2VwczJfZGV2aWNlKTsKLQotCXBvcnRfZGF0YVswXS5wb3J0ID0gJm1hY2UtPnBlcmlmLnBzMi5rZXliOwotCXBvcnRfZGF0YVswXS5pcnEgID0gTUFDRUlTQV9LRVlCX0lSUTsKLQlwb3J0X2RhdGFbMV0ucG9ydCA9ICZtYWNlLT5wZXJpZi5wczIubW91c2U7Ci0JcG9ydF9kYXRhWzFdLmlycSAgPSBNQUNFSVNBX01PVVNFX0lSUTsKLQogCW1hY2VwczJfcG9ydFswXSA9IG1hY2VwczJfYWxsb2NhdGVfcG9ydCgwKTsKIAltYWNlcHMyX3BvcnRbMV0gPSBtYWNlcHMyX2FsbG9jYXRlX3BvcnQoMSk7CiAJaWYgKCFtYWNlcHMyX3BvcnRbMF0gfHwgIW1hY2VwczJfcG9ydFsxXSkgewogCQlrZnJlZShtYWNlcHMyX3BvcnRbMF0pOwogCQlrZnJlZShtYWNlcHMyX3BvcnRbMV0pOwotCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihtYWNlcHMyX2RldmljZSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTY1LDExICsxNTMsNTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IG1hY2VwczJfZXhpdCh2b2lkKQorc3RhdGljIGludCBfX2RldmV4aXQgbWFjZXBzMl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewogCXNlcmlvX3VucmVnaXN0ZXJfcG9ydChtYWNlcHMyX3BvcnRbMF0pOwogCXNlcmlvX3VucmVnaXN0ZXJfcG9ydChtYWNlcHMyX3BvcnRbMV0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1hY2VwczJfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJtYWNlcHMyIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gbWFjZXBzMl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG1hY2VwczJfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1hY2VwczJfaW5pdCh2b2lkKQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtYWNlcHMyX2RyaXZlcik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwltYWNlcHMyX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygibWFjZXBzMiIsIC0xKTsKKwlpZiAoIW1hY2VwczJfZGV2aWNlKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlcnJfdW5yZWdpc3Rlcl9kcml2ZXI7CisJfQorCisJcG9ydF9kYXRhWzBdLnBvcnQgPSAmbWFjZS0+cGVyaWYucHMyLmtleWI7CisJcG9ydF9kYXRhWzBdLmlycSAgPSBNQUNFSVNBX0tFWUJfSVJROworCXBvcnRfZGF0YVsxXS5wb3J0ID0gJm1hY2UtPnBlcmlmLnBzMi5tb3VzZTsKKwlwb3J0X2RhdGFbMV0uaXJxICA9IE1BQ0VJU0FfTU9VU0VfSVJROworCisJZXJyb3IgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKG1hY2VwczJfZGV2aWNlKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyX2ZyZWVfZGV2aWNlOworCisJcmV0dXJuIDA7CisKKyBlcnJfZnJlZV9kZXZpY2U6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChtYWNlcHMyX2RldmljZSk7CisgZXJyX3VucmVnaXN0ZXJfZHJpdmVyOgorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtYWNlcHMyX2RyaXZlcik7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWFjZXBzMl9leGl0KHZvaWQpCit7CiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIobWFjZXBzMl9kZXZpY2UpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtYWNlcHMyX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KG1hY2VwczJfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL3E0MGtiZC5jIGIvZHJpdmVycy9pbnB1dC9zZXJpby9xNDBrYmQuYwppbmRleCBiNDRkMjU1Li5kMzgyN2M1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL3E0MGtiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vcTQwa2JkLmMKQEAgLTc1LDEzICs3NSwxMyBAQAogCiBzdGF0aWMgdm9pZCBxNDBrYmRfZmx1c2godm9pZCkKIHsKLSAJaW50IG1heHJlYWQgPSAxMDA7CisJaW50IG1heHJlYWQgPSAxMDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZxNDBrYmRfbG9jaywgZmxhZ3MpOwogCi0gCXdoaWxlIChtYXhyZWFkLS0gJiYgKFE0MF9JUlFfS0VZQl9NQVNLICYgbWFzdGVyX2luYihJTlRFUlJVUFRfUkVHKSkpCi0gCQltYXN0ZXJfaW5iKEtFWUNPREVfUkVHKTsKKwl3aGlsZSAobWF4cmVhZC0tICYmIChRNDBfSVJRX0tFWUJfTUFTSyAmIG1hc3Rlcl9pbmIoSU5URVJSVVBUX1JFRykpKQorCQltYXN0ZXJfaW5iKEtFWUNPREVfUkVHKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnE0MGtiZF9sb2NrLCBmbGFncyk7CiB9CkBAIC05NywxNCArOTcsMTQgQEAKIAogCWlmIChyZXF1ZXN0X2lycShRNDBfSVJRX0tFWUJPQVJELCBxNDBrYmRfaW50ZXJydXB0LCAwLCAicTQwa2JkIiwgTlVMTCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJxNDBrYmQuYzogQ2FuJ3QgZ2V0IGlycSAlZC5cbiIsIFE0MF9JUlFfS0VZQk9BUkQpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUJVU1k7CiAJfQogCi0gCS8qIG9mZiB3ZSBnbyAqLwotIAltYXN0ZXJfb3V0YigtMSwgS0VZQk9BUkRfVU5MT0NLX1JFRyk7Ci0gCW1hc3Rlcl9vdXRiKDEsIEtFWV9JUlFfRU5BQkxFX1JFRyk7CisJLyogb2ZmIHdlIGdvICovCisJbWFzdGVyX291dGIoLTEsIEtFWUJPQVJEX1VOTE9DS19SRUcpOworCW1hc3Rlcl9vdXRiKDEsIEtFWV9JUlFfRU5BQkxFX1JFRyk7CiAKLSAJcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHE0MGtiZF9jbG9zZShzdHJ1Y3Qgc2VyaW8gKnBvcnQpCkBAIC0xMTYsMzcgKzExNiwxOCBAQAogCXE0MGtiZF9mbHVzaCgpOwogfQogCi1zdGF0aWMgc3RydWN0IHNlcmlvICogX19pbml0IHE0MGtiZF9hbGxvY2F0ZV9wb3J0KHZvaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBxNDBrYmRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewotCXN0cnVjdCBzZXJpbyAqc2VyaW87Ci0KLQlzZXJpbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXJpbyksIEdGUF9LRVJORUwpOwotCWlmIChzZXJpbykgewotCQltZW1zZXQoc2VyaW8sIDAsIHNpemVvZihzdHJ1Y3Qgc2VyaW8pKTsKLQkJc2VyaW8tPmlkLnR5cGUJCT0gU0VSSU9fODA0MjsKLQkJc2VyaW8tPm9wZW4JCT0gcTQwa2JkX29wZW47Ci0JCXNlcmlvLT5jbG9zZQkJPSBxNDBrYmRfY2xvc2U7Ci0JCXNlcmlvLT5kZXYucGFyZW50CT0gJnE0MGtiZF9kZXZpY2UtPmRldjsKLQkJc3RybGNweShzZXJpby0+bmFtZSwgIlE0MCBLYmQgUG9ydCIsIHNpemVvZihzZXJpby0+bmFtZSkpOwotCQlzdHJsY3B5KHNlcmlvLT5waHlzLCAiUTQwIiwgc2l6ZW9mKHNlcmlvLT5waHlzKSk7Ci0JfQotCi0JcmV0dXJuIHNlcmlvOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBxNDBrYmRfaW5pdCh2b2lkKQotewotCWlmICghTUFDSF9JU19RNDApCi0JCXJldHVybiAtRUlPOwotCi0JcTQwa2JkX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInE0MGtiZCIsIC0xLCBOVUxMLCAwKTsKLQlpZiAoSVNfRVJSKHE0MGtiZF9kZXZpY2UpKQotCQlyZXR1cm4gUFRSX0VSUihxNDBrYmRfZGV2aWNlKTsKLQotCWlmICghKHE0MGtiZF9wb3J0ID0gcTQwa2JkX2FsbG9jYXRlX3BvcnQoKSkpIHsKLQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocTQwa2JkX2RldmljZSk7CisJcTQwa2JkX3BvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VyaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXE0MGtiZF9wb3J0KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CisKKwlxNDBrYmRfcG9ydC0+aWQudHlwZQk9IFNFUklPXzgwNDI7CisJcTQwa2JkX3BvcnQtPm9wZW4JPSBxNDBrYmRfb3BlbjsKKwlxNDBrYmRfcG9ydC0+Y2xvc2UJPSBxNDBrYmRfY2xvc2U7CisJcTQwa2JkX3BvcnQtPmRldi5wYXJlbnQJPSAmZGV2LT5kZXY7CisJc3RybGNweShxNDBrYmRfcG9ydC0+bmFtZSwgIlE0MCBLYmQgUG9ydCIsIHNpemVvZihxNDBrYmRfcG9ydC0+bmFtZSkpOworCXN0cmxjcHkocTQwa2JkX3BvcnQtPnBoeXMsICJRNDAiLCBzaXplb2YocTQwa2JkX3BvcnQtPnBoeXMpKTsKIAogCXNlcmlvX3JlZ2lzdGVyX3BvcnQocTQwa2JkX3BvcnQpOwogCXByaW50ayhLRVJOX0lORk8gInNlcmlvOiBRNDAga2JkIHJlZ2lzdGVyZWRcbiIpOwpAQCAtMTU0LDEwICsxMzUsNTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IHE0MGtiZF9leGl0KHZvaWQpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBxNDBrYmRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKIAlzZXJpb191bnJlZ2lzdGVyX3BvcnQocTQwa2JkX3BvcnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHE0MGtiZF9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInE0MGtiZCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHE0MGtiZF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHE0MGtiZF9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcTQwa2JkX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAoIU1BQ0hfSVNfUTQwKQorCQlyZXR1cm4gLUVJTzsKKworCWVycm9yID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZxNDBrYmRfZHJpdmVyKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXE0MGtiZF9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInE0MGtiZCIsIC0xKTsKKwlpZiAoIXE0MGtiZF9kZXZpY2UpCisJCWdvdG8gZXJyX3VucmVnaXN0ZXJfZHJpdmVyOworCisJZXJyb3IgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHE0MGtiZF9kZXZpY2UpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJfZnJlZV9kZXZpY2U7CisKKwlyZXR1cm4gMDsKKworIGVycl9mcmVlX2RldmljZToKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KHE0MGtiZF9kZXZpY2UpOworIGVycl91bnJlZ2lzdGVyX2RyaXZlcjoKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcTQwa2JkX2RyaXZlcik7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcTQwa2JkX2V4aXQodm9pZCkKK3sKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihxNDBrYmRfZGV2aWNlKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcTQwa2JkX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KHE0MGtiZF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2ExMTExcHMyLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3NhMTExMXBzMi5jCmluZGV4IDNmMGRmMzMuLmViZDk5NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2ExMTExcHMyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zYTExMTFwczIuYwpAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3NhMTExMS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jCmluZGV4IDhlNTMwY2MuLjJmNzY4MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvLmMKQEAgLTU5LDkgKzU5LDcgQEAKIAogc3RhdGljIExJU1RfSEVBRChzZXJpb19saXN0KTsKIAotc3RhdGljIHN0cnVjdCBidXNfdHlwZSBzZXJpb19idXMgPSB7Ci0JLm5hbWUgPQkic2VyaW8iLAotfTsKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgc2VyaW9fYnVzOwogCiBzdGF0aWMgdm9pZCBzZXJpb19hZGRfcG9ydChzdHJ1Y3Qgc2VyaW8gKnNlcmlvKTsKIHN0YXRpYyB2b2lkIHNlcmlvX2Rlc3Ryb3lfcG9ydChzdHJ1Y3Qgc2VyaW8gKnNlcmlvKTsKQEAgLTc1MCwxMSArNzQ4LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgc2VyaW9fYnVzID0geworCS5uYW1lID0JInNlcmlvIiwKKwkucHJvYmUgPSBzZXJpb19kcml2ZXJfcHJvYmUsCisJLnJlbW92ZSA9IHNlcmlvX2RyaXZlcl9yZW1vdmUsCit9OworCiB2b2lkIF9fc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBzZXJpb19kcml2ZXIgKmRydiwgc3RydWN0IG1vZHVsZSAqb3duZXIpCiB7CiAJZHJ2LT5kcml2ZXIuYnVzID0gJnNlcmlvX2J1czsKLQlkcnYtPmRyaXZlci5wcm9iZSA9IHNlcmlvX2RyaXZlcl9wcm9iZTsKLQlkcnYtPmRyaXZlci5yZW1vdmUgPSBzZXJpb19kcml2ZXJfcmVtb3ZlOwogCiAJc2VyaW9fcXVldWVfZXZlbnQoZHJ2LCBvd25lciwgU0VSSU9fUkVHSVNURVJfRFJJVkVSKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VycG9ydC5jIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJwb3J0LmMKaW5kZXggMWJkODhmYy4uNTRhNjgwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJwb3J0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJwb3J0LmMKQEAgLTk2LDYgKzk2LDcgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZXJwb3J0LT53YWl0KTsKIAogCXR0eS0+ZGlzY19kYXRhID0gc2VycG9ydDsKKwl0dHktPnJlY2VpdmVfcm9vbSA9IDI1NjsKIAlzZXRfYml0KFRUWV9ET19XUklURV9XQUtFVVAsICZ0dHktPmZsYWdzKTsKIAogCXJldHVybiAwOwpAQCAtMTQwLDE3ICsxNDEsNiBAQAogfQogCiAvKgotICogc2VycG9ydF9sZGlzY19yb29tKCkgcmVwb3J0cyBob3cgbXVjaCByb29tIHdlIGRvIGhhdmUgZm9yIHJlY2VpdmluZyBkYXRhLgotICogQWx0aG91Z2ggd2UgaW4gZmFjdCBoYXZlIGluZmluaXRlIHJvb20sIHdlIG5lZWQgdG8gc3BlY2lmeSBzb21lIHZhbHVlCi0gKiBoZXJlLCBhbmQgMjU2IHNlZW1zIHRvIGJlIHJlYXNvbmFibGUuCi0gKi8KLQotc3RhdGljIGludCBzZXJwb3J0X2xkaXNjX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlyZXR1cm4gMjU2OwotfQotCi0vKgogICogc2VycG9ydF9sZGlzY19yZWFkKCkganVzdCB3YWl0cyBpbmRlZmluaXRlbHkgaWYgZXZlcnl0aGluZyBnb2VzIHdlbGwuCiAgKiBIb3dldmVyLCB3aGVuIHRoZSBzZXJpbyBkcml2ZXIgY2xvc2VzIHRoZSBzZXJpbyBwb3J0LCBpdCBmaW5pc2hlcywKICAqIHJldHVybmluZyAwIGNoYXJhY3RlcnMuCkBAIC0yMzcsNyArMjI3LDYgQEAKIAkucmVhZCA9CQlzZXJwb3J0X2xkaXNjX3JlYWQsCiAJLmlvY3RsID0Jc2VycG9ydF9sZGlzY19pb2N0bCwKIAkucmVjZWl2ZV9idWYgPQlzZXJwb3J0X2xkaXNjX3JlY2VpdmUsCi0JLnJlY2VpdmVfcm9vbSA9CXNlcnBvcnRfbGRpc2Nfcm9vbSwKIAkud3JpdGVfd2FrZXVwID0Jc2VycG9ydF9sZGlzY193cml0ZV93YWtldXAKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZwppbmRleCAyMWQ1NWVkLi5iMWIxNGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9LY29uZmlnCkBAIC0xMSw2ICsxMSwxOSBAQAogCiBpZiBJTlBVVF9UT1VDSFNDUkVFTgogCitjb25maWcgVE9VQ0hTQ1JFRU5fQURTNzg0NgorCXRyaXN0YXRlICJBRFMgNzg0NiBiYXNlZCB0b3VjaHNjcmVlbnMiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIHRvdWNoc2NyZWVuIGludGVyZmFjZSB1c2luZyB0aGUKKwkgIEFEUzc4NDYgY29udHJvbGxlciwgYW5kIHlvdXIgYm9hcmQtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24KKwkgIGNvZGUgaW5jbHVkZXMgdGhhdCBpbiBpdHMgdGFibGUgb2YgU1BJIGRldmljZXMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4gKGJ1dCBpdCdzIHNhZmUgdG8gc2F5ICJZIikuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFkczc4NDYuCisKIGNvbmZpZyBUT1VDSFNDUkVFTl9CSVRTWQogCXRyaXN0YXRlICJDb21wYXEgaVBBUSBIMzYwMCAoQml0c3kpIHRvdWNoc2NyZWVuIgogCWRlcGVuZHMgb24gU0ExMTAwX0JJVFNZCkBAIC04NSw3ICs5OCw3IEBACiAKIGNvbmZpZyBUT1VDSFNDUkVFTl9IUDYwMAogCXRyaXN0YXRlICJIUCBKb3JuYWRhIDY4MC82OTAgdG91Y2hzY3JlZW4iCi0JZGVwZW5kcyBvbiBTSF9IUDYwMCAmJiBTSF9BREMKKwlkZXBlbmRzIG9uIFNIX0hQNlhYICYmIFNIX0FEQwogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBIUCBKb3JuYWRhIDY4MCBvciA2OTAgYW5kIHdhbnQgdG8KICAgICAgICAgICBzdXBwb3J0IHRoZSBidWlsdC1pbiB0b3VjaHNjcmVlbi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vTWFrZWZpbGUgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL01ha2VmaWxlCmluZGV4IDY4NDI4NjkuLjVlNTU1N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9NYWtlZmlsZQpAQCAtNCw2ICs0LDcgQEAKIAogIyBFYWNoIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGVuYWJsZXMgYSBsaXN0IG9mIGZpbGVzLgogCitvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fQURTNzg0NikJKz0gYWRzNzg0Ni5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fQklUU1kpCSs9IGgzNjAwX3RzX2lucHV0Lm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9DT1JHSSkJKz0gY29yZ2lfdHMubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX0dVTlpFKQkrPSBndW56ZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOGM2YTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYwpAQCAtMCwwICsxLDYyNSBAQAorLyoKKyAqIEFEUzc4NDYgYmFzZWQgdG91Y2hzY3JlZW4gYW5kIHNlbnNvciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBVc2luZyBjb2RlIGZyb206CisgKiAgLSBjb3JnaV90cy5jCisgKglDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBSaWNoYXJkIFB1cmRpZQorICogIC0gb21hcF90cy5baGNdLCBhZHM3ODQ2LmgsIHRzX29zay5jCisgKglDb3B5cmlnaHQgKEMpIDIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZQorICoJQ29weXJpZ2h0IChDKSAyMDA0IFRleGFzIEluc3RydW1lbnRzCisgKglDb3B5cmlnaHQgKEMpIDIwMDUgRGlyayBCZWhtZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL2Fkczc4NDYuaD4KKworI2lmZGVmCUNPTkZJR19BUk0KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2lmZGVmCUNPTkZJR19BUkNIX09NQVAKKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjZW5kaWYKKworI2Vsc2UKKyNkZWZpbmUJc2V0X2lycV90eXBlKGlycSx0eXBlKQlkb3t9d2hpbGUoMCkKKyNlbmRpZgorCisKKy8qCisgKiBUaGlzIGNvZGUgaGFzIGJlZW4gbGlnaHRseSB0ZXN0ZWQgb24gYW4gYWRzNzg0Ni4KKyAqIFN1cHBvcnQgZm9yIGFkczc4NDMgYW5kIGFkczc4NDUgaGFzIG9ubHkgYmVlbiBzdHViYmVkIGluLgorICoKKyAqIE5vdCB5ZXQgZG9uZTogIGludmVzdGlnYXRlIHRoZSB2YWx1ZXMgcmVwb3J0ZWQuICBBcmUgeC95L3ByZXNzdXJlCisgKiBldmVudCB2YWx1ZXMgc2FuZSBlbm91Z2ggZm9yIFgxMT8gIEhvdyBhY2N1cmF0ZSBhcmUgdGhlIHRlbXBlcmF0dXJlCisgKiBhbmQgdm9sdGFnZSByZWFkaW5ncz8gIChTeXN0ZW0tc3BlY2lmaWMgY2FsaWJyYXRpb24gc2hvdWxkIHN1cHBvcnQKKyAqIGFjY3VyYWN5IG9mIDAuMyBkZWdyZWVzIEM7IG90aGVyd2lzZSBpdCdzIDIuMCBkZWdyZWVzLikKKyAqCisgKiBhcHAgbm90ZSBzYmFhMDM2IHRhbGtzIGluIG1vcmUgZGV0YWlsIGFib3V0IGFjY3VyYXRlIHNhbXBsaW5nLi4uCisgKiB0aGF0IG91Z2h0IHRvIGhlbHAgaW4gc2l0dWF0aW9ucyBsaWtlIExDRHMgaW5kdWNpbmcgbm9pc2UgKHdoaWNoCisgKiBjYW4gYWxzbyBiZSBoZWxwZWQgYnkgdXNpbmcgc3luY2ggc2lnbmFscykgYW5kIG1vcmUgZ2VuZXJhbGx5LgorICovCisKKyNkZWZpbmUJVFNfUE9MTF9QRVJJT0QJbXNlY3NfdG9famlmZmllcygxMCkKKworc3RydWN0IHRzX2V2ZW50IHsKKwkvKiBGb3IgcG9ydGFiaWxpdHksIHdlIGNhbid0IHJlYWQgMTIgYml0IHZhbHVlcyB1c2luZyBTUEkgKHdoaWNoCisJICogd291bGQgbWFrZSB0aGUgY29udHJvbGxlciBkZWxpdmVyIHRoZW0gYXMgbmF0aXZlIGJ5dGVvcmRlciB1MTYKKwkgKiB3aXRoIG1zYnMgemVyb2VkKS4gIEluc3RlYWQsIHdlIHJlYWQgdGhlbSBhcyB0d28gOC1ieXRlIHZhbHVlcywKKwkgKiB3aGljaCBuZWVkIGJ5dGVzd2FwcGluZyB0aGVuIHJhbmdlIGFkanVzdG1lbnQuCisJICovCisJX19iZTE2IHg7CisJX19iZTE2IHk7CisJX19iZTE2IHoxLCB6MjsKK307CisKK3N0cnVjdCBhZHM3ODQ2IHsKKwlzdHJ1Y3QgaW5wdXRfZGV2CWlucHV0OworCWNoYXIJCQlwaHlzWzMyXTsKKworCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGk7CisJdTE2CQkJbW9kZWw7CisJdTE2CQkJdnJlZl9kZWxheV91c2VjczsKKwl1MTYJCQl4X3BsYXRlX29obXM7CisKKwlzdHJ1Y3QgdHNfZXZlbnQJCXRjOworCisJc3RydWN0IHNwaV90cmFuc2Zlcgl4ZmVyWzhdOworCXN0cnVjdCBzcGlfbWVzc2FnZQltc2c7CisKKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOwkJLyogUDogbG9jayAqLworCXVuc2lnbmVkCQlwZW5kb3duOjE7CS8qIFA6IGxvY2sgKi8KKwl1bnNpZ25lZAkJcGVuZGluZzoxOwkvKiBQOiBsb2NrICovCisvLyBGSVhNRSByZW1vdmUgImlycV9kaXNhYmxlZCIKKwl1bnNpZ25lZAkJaXJxX2Rpc2FibGVkOjE7CS8qIFA6IGxvY2sgKi8KK307CisKKy8qIGxlYXZlIGNoaXAgc2VsZWN0ZWQgd2hlbiB3ZSdyZSBkb25lLCBmb3IgcXVpY2tlciByZS1zZWxlY3Q/ICovCisjaWYJMAorI2RlZmluZQlDU19DSEFOR0UoeGZlcikJKCh4ZmVyKS5jc19jaGFuZ2UgPSAxKQorI2Vsc2UKKyNkZWZpbmUJQ1NfQ0hBTkdFKHhmZXIpCSgoeGZlcikuY3NfY2hhbmdlID0gMCkKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVGhlIEFEUzc4NDYgaGFzIHRvdWNoc2NyZWVuIGFuZCBvdGhlciBzZW5zb3JzLgorICogRWFybGllciBhZHM3ODR4IGNoaXBzIGFyZSBzb21ld2hhdCBjb21wYXRpYmxlLgorICovCisjZGVmaW5lCUFEU19TVEFSVAkJKDEgPDwgNykKKyNkZWZpbmUJQURTX0EyQTFBMF9kX3kJCSgxIDw8IDQpCS8qIGRpZmZlcmVudGlhbCAqLworI2RlZmluZQlBRFNfQTJBMUEwX2RfejEJCSgzIDw8IDQpCS8qIGRpZmZlcmVudGlhbCAqLworI2RlZmluZQlBRFNfQTJBMUEwX2RfejIJCSg0IDw8IDQpCS8qIGRpZmZlcmVudGlhbCAqLworI2RlZmluZQlBRFNfQTJBMUEwX2RfeAkJKDUgPDwgNCkJLyogZGlmZmVyZW50aWFsICovCisjZGVmaW5lCUFEU19BMkExQTBfdGVtcDAJKDAgPDwgNCkJLyogbm9uLWRpZmZlcmVudGlhbCAqLworI2RlZmluZQlBRFNfQTJBMUEwX3ZiYXR0CSgyIDw8IDQpCS8qIG5vbi1kaWZmZXJlbnRpYWwgKi8KKyNkZWZpbmUJQURTX0EyQTFBMF92YXV4CQkoNiA8PCA0KQkvKiBub24tZGlmZmVyZW50aWFsICovCisjZGVmaW5lCUFEU19BMkExQTBfdGVtcDEJKDcgPDwgNCkJLyogbm9uLWRpZmZlcmVudGlhbCAqLworI2RlZmluZQlBRFNfOF9CSVQJCSgxIDw8IDMpCisjZGVmaW5lCUFEU18xMl9CSVQJCSgwIDw8IDMpCisjZGVmaW5lCUFEU19TRVIJCQkoMSA8PCAyKQkvKiBub24tZGlmZmVyZW50aWFsICovCisjZGVmaW5lCUFEU19ERlIJCQkoMCA8PCAyKQkvKiBkaWZmZXJlbnRpYWwgKi8KKyNkZWZpbmUJQURTX1BEMTBfUERPV04JCSgwIDw8IDApCS8qIGxvd3Bvd2VyIG1vZGUgKyBwZW5pcnEgKi8KKyNkZWZpbmUJQURTX1BEMTBfQURDX09OCQkoMSA8PCAwKQkvKiBBREMgb24gKi8KKyNkZWZpbmUJQURTX1BEMTBfUkVGX09OCQkoMiA8PCAwKQkvKiB2UkVGIG9uICsgcGVuaXJxICovCisjZGVmaW5lCUFEU19QRDEwX0FMTF9PTgkJKDMgPDwgMCkJLyogQURDICsgdlJFRiBvbiAqLworCisjZGVmaW5lCU1BWF8xMkJJVAkoKDE8PDEyKS0xKQorCisvKiBsZWF2ZSBBREMgcG93ZXJlZCB1cCAoZGlzYWJsZXMgcGVuaXJxKSBiZXR3ZWVuIGRpZmZlcmVudGlhbCBzYW1wbGVzICovCisjZGVmaW5lCVJFQURfMTJCSVRfREZSKHgpIChBRFNfU1RBUlQgfCBBRFNfQTJBMUEwX2RfICMjIHggXAorCXwgQURTXzEyX0JJVCB8IEFEU19ERlIpCisKK3N0YXRpYyBjb25zdCB1OAlyZWFkX3kgID0gUkVBRF8xMkJJVF9ERlIoeSkgIHwgQURTX1BEMTBfQURDX09OOworc3RhdGljIGNvbnN0IHU4CXJlYWRfejEgPSBSRUFEXzEyQklUX0RGUih6MSkgfCBBRFNfUEQxMF9BRENfT047CitzdGF0aWMgY29uc3QgdTgJcmVhZF96MiA9IFJFQURfMTJCSVRfREZSKHoyKSB8IEFEU19QRDEwX0FEQ19PTjsKK3N0YXRpYyBjb25zdCB1OAlyZWFkX3ggID0gUkVBRF8xMkJJVF9ERlIoeCkgIHwgQURTX1BEMTBfUERPV047CS8qIExBU1QgKi8KKworLyogc2luZ2xlLWVuZGVkIHNhbXBsZXMgbmVlZCB0byBmaXJzdCBwb3dlciB1cCByZWZlcmVuY2Ugdm9sdGFnZTsKKyAqIHdlIGxlYXZlIGJvdGggQURDIGFuZCBWUkVGIHBvd2VyZWQKKyAqLworI2RlZmluZQlSRUFEXzEyQklUX1NFUih4KSAoQURTX1NUQVJUIHwgQURTX0EyQTFBMF8gIyMgeCBcCisJfCBBRFNfMTJfQklUIHwgQURTX1NFUikKKworc3RhdGljIGNvbnN0IHU4CXJlZl9vbiA9IFJFQURfMTJCSVRfREZSKHgpIHwgQURTX1BEMTBfQUxMX09OOworc3RhdGljIGNvbnN0IHU4CXJlZl9vZmYgPSBSRUFEXzEyQklUX0RGUih5KSB8IEFEU19QRDEwX1BET1dOOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIE5vbi10b3VjaHNjcmVlbiBzZW5zb3JzIG9ubHkgdXNlIHNpbmdsZS1lbmRlZCBjb252ZXJzaW9ucy4KKyAqLworCitzdHJ1Y3Qgc2VyX3JlcSB7CisJdTgJCQljb21tYW5kOworCXUxNgkJCXNjcmF0Y2g7CisJX19iZTE2CQkJc2FtcGxlOworCXN0cnVjdCBzcGlfbWVzc2FnZQltc2c7CisJc3RydWN0IHNwaV90cmFuc2Zlcgl4ZmVyWzZdOworfTsKKworc3RhdGljIGludCBhZHM3ODQ2X3JlYWQxMl9zZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjb21tYW5kKQoreworCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisJc3RydWN0IGFkczc4NDYJCSp0cyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzZXJfcmVxCQkqcmVxID0ga3phbGxvYyhzaXplb2YgKnJlcSwgU0xBQl9LRVJORUwpOworCWludAkJCXN0YXR1czsKKwlpbnQJCQlzYW1wbGU7CisJaW50IAkJCWk7CisKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlJTklUX0xJU1RfSEVBRCgmcmVxLT5tc2cudHJhbnNmZXJzKTsKKworCS8qIGFjdGl2YXRlIHJlZmVyZW5jZSwgc28gaXQgaGFzIHRpbWUgdG8gc2V0dGxlOyAqLworCXJlcS0+eGZlclswXS50eF9idWYgPSAmcmVmX29uOworCXJlcS0+eGZlclswXS5sZW4gPSAxOworCXJlcS0+eGZlclsxXS5yeF9idWYgPSAmcmVxLT5zY3JhdGNoOworCXJlcS0+eGZlclsxXS5sZW4gPSAyOworCisJLyoKKwkgKiBmb3IgZXh0ZXJuYWwgVlJFRiwgMCB1c2VjIChhbmQgYXNzdW1lIGl0J3MgYWx3YXlzIG9uKTsKKwkgKiBmb3IgMXVGLCB1c2UgODAwIHVzZWM7CisJICogbm8gY2FwLCAxMDAgdXNlYy4KKwkgKi8KKwlyZXEtPnhmZXJbMV0uZGVsYXlfdXNlY3MgPSB0cy0+dnJlZl9kZWxheV91c2VjczsKKworCS8qIHRha2Ugc2FtcGxlICovCisJcmVxLT5jb21tYW5kID0gKHU4KSBjb21tYW5kOworCXJlcS0+eGZlclsyXS50eF9idWYgPSAmcmVxLT5jb21tYW5kOworCXJlcS0+eGZlclsyXS5sZW4gPSAxOworCXJlcS0+eGZlclszXS5yeF9idWYgPSAmcmVxLT5zYW1wbGU7CisJcmVxLT54ZmVyWzNdLmxlbiA9IDI7CisKKwkvKiBSRVZJU0lUOiAgdGFrZSBhIGZldyBtb3JlIHNhbXBsZXMsIGFuZCBjb21wYXJlIC4uLiAqLworCisJLyogdHVybiBvZmYgcmVmZXJlbmNlICovCisJcmVxLT54ZmVyWzRdLnR4X2J1ZiA9ICZyZWZfb2ZmOworCXJlcS0+eGZlcls0XS5sZW4gPSAxOworCXJlcS0+eGZlcls1XS5yeF9idWYgPSAmcmVxLT5zY3JhdGNoOworCXJlcS0+eGZlcls1XS5sZW4gPSAyOworCisJQ1NfQ0hBTkdFKHJlcS0+eGZlcls1XSk7CisKKwkvKiBncm91cCBhbGwgdGhlIHRyYW5zZmVycyB0b2dldGhlciwgc28gd2UgY2FuJ3QgaW50ZXJmZXJlIHdpdGgKKwkgKiByZWFkaW5nIHRvdWNoc2NyZWVuIHN0YXRlOyBkaXNhYmxlIHBlbmlycSB3aGlsZSBzYW1wbGluZworCSAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZyZXEtPnhmZXJbaV0sICZyZXEtPm1zZyk7CisKKwlkaXNhYmxlX2lycShzcGktPmlycSk7CisJc3RhdHVzID0gc3BpX3N5bmMoc3BpLCAmcmVxLT5tc2cpOworCWVuYWJsZV9pcnEoc3BpLT5pcnEpOworCisJaWYgKHJlcS0+bXNnLnN0YXR1cykKKwkJc3RhdHVzID0gcmVxLT5tc2cuc3RhdHVzOworCXNhbXBsZSA9IGJlMTZfdG9fY3B1KHJlcS0+c2FtcGxlKTsKKwlzYW1wbGUgPSBzYW1wbGUgPj4gNDsKKwlrZnJlZShyZXEpOworCisJcmV0dXJuIHN0YXR1cyA/IHN0YXR1cyA6IHNhbXBsZTsKK30KKworI2RlZmluZSBTSE9XKG5hbWUpIHN0YXRpYyBzc2l6ZV90IFwKK25hbWUgIyMgX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCit7IFwKKwlzc2l6ZV90IHYgPSBhZHM3ODQ2X3JlYWQxMl9zZXIoZGV2LCBcCisJCQlSRUFEXzEyQklUX1NFUihuYW1lKSB8IEFEU19QRDEwX0FMTF9PTik7IFwKKwlpZiAodiA8IDApIFwKKwkJcmV0dXJuIHY7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgKHVuc2lnbmVkKSB2KTsgXAorfSBcCitzdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgbmFtZSAjIyBfc2hvdywgTlVMTCk7CisKK1NIT1codGVtcDApCitTSE9XKHRlbXAxKQorU0hPVyh2YXV4KQorU0hPVyh2YmF0dCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBQRU5JUlEgb25seSBraWNrcyB0aGUgdGltZXIuICBUaGUgdGltZXIgb25seSByZWlzc3VlcyB0aGUgU1BJIHRyYW5zZmVyLAorICogdG8gcmV0cmlldmUgdG91Y2hzY3JlZW4gc3RhdHVzLgorICoKKyAqIFRoZSBTUEkgdHJhbnNmZXIgY29tcGxldGlvbiBjYWxsYmFjayBkb2VzIHRoZSByZWFsIHdvcmsuICBJdCByZXBvcnRzCisgKiB0b3VjaHNjcmVlbiBldmVudHMgYW5kIHJlYWN0aXZhdGVzIHRoZSB0aW1lciAob3IgSVJRKSBhcyBhcHByb3ByaWF0ZS4KKyAqLworCitzdGF0aWMgdm9pZCBhZHM3ODQ2X3J4KHZvaWQgKmFkcykKK3sKKwlzdHJ1Y3QgYWRzNzg0NgkqdHMgPSBhZHM7CisJdW5zaWduZWQJUnQ7CisJdW5zaWduZWQJc3luYyA9IDA7CisJdTE2CQl4LCB5LCB6MSwgejI7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCS8qIGFkanVzdDogIDEyIGJpdCBzYW1wbGVzIChsZWZ0IGFsaWduZWQpLCBidWlsdCBmcm9tCisJICogdHdvIDggYml0IHZhbHVlcyB3cml0ZW4gbXNiLWZpcnN0LgorCSAqLworCXggPSBiZTE2X3RvX2NwdSh0cy0+dGMueCkgPj4gNDsKKwl5ID0gYmUxNl90b19jcHUodHMtPnRjLnkpID4+IDQ7CisJejEgPSBiZTE2X3RvX2NwdSh0cy0+dGMuejEpID4+IDQ7CisJejIgPSBiZTE2X3RvX2NwdSh0cy0+dGMuejIpID4+IDQ7CisKKwkvKiByYW5nZSBmaWx0ZXJpbmcgKi8KKwlpZiAoeCA9PSBNQVhfMTJCSVQpCisJCXggPSAwOworCisJaWYgKHggJiYgejEgJiYgdHMtPnNwaS0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID09IFBNX0VWRU5UX09OKSB7CisJCS8qIGNvbXB1dGUgdG91Y2ggcHJlc3N1cmUgcmVzaXN0YW5jZSB1c2luZyBlcXVhdGlvbiAjMiAqLworCQlSdCA9IHoyOworCQlSdCAtPSB6MTsKKwkJUnQgKj0geDsKKwkJUnQgKj0gdHMtPnhfcGxhdGVfb2htczsKKwkJUnQgLz0gejE7CisJCVJ0ID0gKFJ0ICsgMjA0NykgPj4gMTI7CisJfSBlbHNlCisJCVJ0ID0gMDsKKworCS8qIE5PVEU6ICAicGVuZG93biIgaXMgaW5mZXJyZWQgZnJvbSBwcmVzc3VyZTsgd2UgZG9uJ3QgcmVseSBvbgorCSAqIGJlaW5nIGFibGUgdG8gY2hlY2sgblBFTklSUSBzdGF0dXMsIG9yICJmcmllbmRseSIgdHJpZ2dlciBtb2RlcworCSAqIChib3RoLWVkZ2VzIGlzIG11Y2ggYmV0dGVyIHRoYW4ganVzdC1mYWxsaW5nIG9yIGxvdy1sZXZlbCkuCisJICoKKwkgKiBSRVZJU0lUOiAgc29tZSBib2FyZHMgbWF5IHJlcXVpcmUgcmVhZGluZyBuUEVOSVJROyBpdCdzCisJICogbmVlZGVkIG9uIDc4NDMuICBhbmQgNzg0NSByZWFkcyBwcmVzc3VyZSBkaWZmZXJlbnRseS4uLgorCSAqCisJICogUkVWSVNJVDogIHRoZSB0b3VjaHNjcmVlbiBtaWdodCBub3QgYmUgY29ubmVjdGVkOyB0aGlzIGNvZGUKKwkgKiB3b24ndCBub3RpY2UgdGhhdCwgZXZlbiBpZiBuUEVOSVJRIG5ldmVyIGZpcmVzIC4uLgorCSAqLworCWlmICghdHMtPnBlbmRvd24gJiYgUnQgIT0gMCkgeworCQlpbnB1dF9yZXBvcnRfa2V5KCZ0cy0+aW5wdXQsIEJUTl9UT1VDSCwgMSk7CisJCXN5bmMgPSAxOworCX0gZWxzZSBpZiAodHMtPnBlbmRvd24gJiYgUnQgPT0gMCkgeworCQlpbnB1dF9yZXBvcnRfa2V5KCZ0cy0+aW5wdXQsIEJUTl9UT1VDSCwgMCk7CisJCXN5bmMgPSAxOworCX0KKworCWlmIChSdCkgeworCQlpbnB1dF9yZXBvcnRfYWJzKCZ0cy0+aW5wdXQsIEFCU19YLCB4KTsKKwkJaW5wdXRfcmVwb3J0X2FicygmdHMtPmlucHV0LCBBQlNfWSwgeSk7CisJCWlucHV0X3JlcG9ydF9hYnMoJnRzLT5pbnB1dCwgQUJTX1BSRVNTVVJFLCBSdCk7CisJCXN5bmMgPSAxOworCX0KKwlpZiAoc3luYykKKwkJaW5wdXRfc3luYygmdHMtPmlucHV0KTsKKworI2lmZGVmCVZFUkJPU0UKKwlpZiAoUnQgfHwgdHMtPnBlbmRvd24pCisJCXByX2RlYnVnKCIlczogJWQvJWQvJWQlc1xuIiwgdHMtPnNwaS0+ZGV2LmJ1c19pZCwKKwkJCXgsIHksIFJ0LCBSdCA/ICIiIDogIiBVUCIpOworI2VuZGlmCisKKwkvKiBkb24ndCByZXRyaWdnZXIgd2hpbGUgd2UncmUgc3VzcGVuZGVkICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRzLT5sb2NrLCBmbGFncyk7CisKKwl0cy0+cGVuZG93biA9IChSdCAhPSAwKTsKKwl0cy0+cGVuZGluZyA9IDA7CisKKwlpZiAodHMtPnNwaS0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID09IFBNX0VWRU5UX09OKSB7CisJCWlmICh0cy0+cGVuZG93bikKKwkJCW1vZF90aW1lcigmdHMtPnRpbWVyLCBqaWZmaWVzICsgVFNfUE9MTF9QRVJJT0QpOworCQllbHNlIGlmICh0cy0+aXJxX2Rpc2FibGVkKSB7CisJCQl0cy0+aXJxX2Rpc2FibGVkID0gMDsKKwkJCWVuYWJsZV9pcnEodHMtPnNwaS0+aXJxKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRzLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFkczc4NDZfdGltZXIodW5zaWduZWQgbG9uZyBoYW5kbGUpCit7CisJc3RydWN0IGFkczc4NDYJKnRzID0gKHZvaWQgKiloYW5kbGU7CisJaW50CQlzdGF0dXMgPSAwOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIXRzLT5wZW5kaW5nKSB7CisJCXRzLT5wZW5kaW5nID0gMTsKKwkJaWYgKCF0cy0+aXJxX2Rpc2FibGVkKSB7CisJCQl0cy0+aXJxX2Rpc2FibGVkID0gMTsKKwkJCWRpc2FibGVfaXJxKHRzLT5zcGktPmlycSk7CisJCX0KKwkJc3RhdHVzID0gc3BpX2FzeW5jKHRzLT5zcGksICZ0cy0+bXNnKTsKKwkJaWYgKHN0YXR1cykKKwkJCWRldl9lcnIoJnRzLT5zcGktPmRldiwgInNwaV9hc3luYyAtLT4gJWRcbiIsCisJCQkJCXN0YXR1cyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRzLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhZHM3ODQ2X2lycShpbnQgaXJxLCB2b2lkICpoYW5kbGUsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWFkczc4NDZfdGltZXIoKHVuc2lnbmVkIGxvbmcpIGhhbmRsZSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludAorYWRzNzg0Nl9zdXNwZW5kKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQoreworCXN0cnVjdCBhZHM3ODQ2ICp0cyA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpLT5kZXYpOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHMtPmxvY2ssIGZsYWdzKTsKKworCXNwaS0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gbWVzc2FnZTsKKworCS8qIGFyZSB3ZSB3YWl0aW5nIGZvciBJUlEsIG9yIHBvbGxpbmc/ICovCisJaWYgKCF0cy0+cGVuZG93bikgeworCQlpZiAoIXRzLT5pcnFfZGlzYWJsZWQpIHsKKwkJCXRzLT5pcnFfZGlzYWJsZWQgPSAxOworCQkJZGlzYWJsZV9pcnEodHMtPnNwaS0+aXJxKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHBvbGxpbmc7IGZvcmNlIGEgZmluYWwgU1BJIGNvbXBsZXRpb247CisJCSAqIHRoYXQgd2lsbCBjbGVhbiB0aGluZ3MgdXAgbmVhdGx5CisJCSAqLworCQlpZiAoIXRzLT5wZW5kaW5nKQorCQkJbW9kX3RpbWVyKCZ0cy0+dGltZXIsIGppZmZpZXMpOworCisJCXdoaWxlICh0cy0+cGVuZG93biB8fCB0cy0+cGVuZGluZykgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHMtPmxvY2ssIGZsYWdzKTsKKwkJCXVkZWxheSgxMCk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHMtPmxvY2ssIGZsYWdzKTsKKwkJfQorCX0KKworCS8qIHdlIGtub3cgdGhlIGNoaXAncyBpbiBsb3dwb3dlciBtb2RlIHNpbmNlIHdlIGFsd2F5cworCSAqIGxlYXZlIGl0IHRoYXQgd2F5IGFmdGVyIGV2ZXJ5IHJlcXVlc3QKKwkgKi8KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRzLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRzNzg0Nl9yZXN1bWUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWRzNzg0NiAqdHMgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKworCXRzLT5pcnFfZGlzYWJsZWQgPSAwOworCWVuYWJsZV9pcnEodHMtPnNwaS0+aXJxKTsKKwlzcGktPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkczc4NDZfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWRzNzg0NgkJCSp0czsKKwlzdHJ1Y3QgYWRzNzg0Nl9wbGF0Zm9ybV9kYXRhCSpwZGF0YSA9IHNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHNwaV90cmFuc2ZlcgkJKng7CisJaW50CQkJCWk7CisKKwlpZiAoIXNwaS0+aXJxKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAibm8gSVJRP1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICghcGRhdGEpIHsKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhP1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIGRvbid0IGV4Y2VlZCBtYXggc3BlY2lmaWVkIHNhbXBsZSByYXRlICovCisJaWYgKHNwaS0+bWF4X3NwZWVkX2h6ID4gKDEyNTAwMCAqIDE2KSkgeworCQlkZXZfZGJnKCZzcGktPmRldiwgImYoc2FtcGxlKSAlZCBLSHo/XG4iLAorCQkJCShzcGktPm1heF9zcGVlZF9oei8xNikvMTAwMCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFdlJ2Qgc2V0IHRoZSB3b3Jkc2l6ZSB0byAxMiBiaXRzIC4uLiBleGNlcHQgdGhhdCBzb21lIGNvbnRyb2xsZXJzCisJICogd2lsbCB0aGVuIHRyZWF0IHRoZSA4IGJpdCBjb21tYW5kIHdvcmRzIGFzIDEyIGJpdHMgKGFuZCBkcm9wIHRoZQorCSAqIGZvdXIgTVNCcyBvZiB0aGUgMTIgYml0IHJlc3VsdCkuICBSZXN1bHQ6IGlucHV0cyBtdXN0IGJlIHNoaWZ0ZWQKKwkgKiB0byBkaXNjYXJkIHRoZSBmb3VyIGdhcmJhZ2UgTFNCcy4KKwkgKi8KKworCWlmICghKHRzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkczc4NDYpLCBHRlBfS0VSTkVMKSkpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgdHMpOworCisJdHMtPnNwaSA9IHNwaTsKKwlzcGktPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CisKKwlpbml0X3RpbWVyKCZ0cy0+dGltZXIpOworCXRzLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHRzOworCXRzLT50aW1lci5mdW5jdGlvbiA9IGFkczc4NDZfdGltZXI7CisKKwl0cy0+bW9kZWwgPSBwZGF0YS0+bW9kZWwgPyA6IDc4NDY7CisJdHMtPnZyZWZfZGVsYXlfdXNlY3MgPSBwZGF0YS0+dnJlZl9kZWxheV91c2VjcyA/IDogMTAwOworCXRzLT54X3BsYXRlX29obXMgPSBwZGF0YS0+eF9wbGF0ZV9vaG1zID8gOiA0MDA7CisKKwlpbml0X2lucHV0X2RldigmdHMtPmlucHV0KTsKKworCXRzLT5pbnB1dC5kZXYgPSAmc3BpLT5kZXY7CisJdHMtPmlucHV0Lm5hbWUgPSAiQURTNzg0eCBUb3VjaHNjcmVlbiI7CisJc25wcmludGYodHMtPnBoeXMsIHNpemVvZiB0cy0+cGh5cywgIiVzL2lucHV0MCIsIHNwaS0+ZGV2LmJ1c19pZCk7CisJdHMtPmlucHV0LnBoeXMgPSB0cy0+cGh5czsKKworCXRzLT5pbnB1dC5ldmJpdFswXSA9IEJJVChFVl9LRVkpIHwgQklUKEVWX0FCUyk7CisJdHMtPmlucHV0LmtleWJpdFtMT05HKEJUTl9UT1VDSCldID0gQklUKEJUTl9UT1VDSCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoJnRzLT5pbnB1dCwgQUJTX1gsCisJCQlwZGF0YS0+eF9taW4gPyA6IDAsCisJCQlwZGF0YS0+eF9tYXggPyA6IE1BWF8xMkJJVCwKKwkJCTAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKCZ0cy0+aW5wdXQsIEFCU19ZLAorCQkJcGRhdGEtPnlfbWluID8gOiAwLAorCQkJcGRhdGEtPnlfbWF4ID8gOiBNQVhfMTJCSVQsCisJCQkwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcygmdHMtPmlucHV0LCBBQlNfUFJFU1NVUkUsCisJCQlwZGF0YS0+cHJlc3N1cmVfbWluLCBwZGF0YS0+cHJlc3N1cmVfbWF4LCAwLCAwKTsKKworCWlucHV0X3JlZ2lzdGVyX2RldmljZSgmdHMtPmlucHV0KTsKKworCS8qIHNldCB1cCB0aGUgdHJhbnNmZXJzIHRvIHJlYWQgdG91Y2hzY3JlZW4gc3RhdGU7IHRoaXMgYXNzdW1lcyB3ZQorCSAqIHVzZSBmb3JtdWxhICMyIGZvciBwcmVzc3VyZSwgbm90ICMzLgorCSAqLworCXggPSB0cy0+eGZlcjsKKworCS8qIHktIHN0aWxsIG9uOyB0dXJuIG9uIG9ubHkgeSsgKGFuZCBBREMpICovCisJeC0+dHhfYnVmID0gJnJlYWRfeTsKKwl4LT5sZW4gPSAxOworCXgrKzsKKwl4LT5yeF9idWYgPSAmdHMtPnRjLnk7CisJeC0+bGVuID0gMjsKKwl4Kys7CisKKwkvKiB0dXJuIHkrIG9mZiwgeC0gb247IHdlJ2xsIHVzZSBmb3JtdWxhICMyICovCisJaWYgKHRzLT5tb2RlbCA9PSA3ODQ2KSB7CisJCXgtPnR4X2J1ZiA9ICZyZWFkX3oxOworCQl4LT5sZW4gPSAxOworCQl4Kys7CisJCXgtPnJ4X2J1ZiA9ICZ0cy0+dGMuejE7CisJCXgtPmxlbiA9IDI7CisJCXgrKzsKKworCQl4LT50eF9idWYgPSAmcmVhZF96MjsKKwkJeC0+bGVuID0gMTsKKwkJeCsrOworCQl4LT5yeF9idWYgPSAmdHMtPnRjLnoyOworCQl4LT5sZW4gPSAyOworCQl4Kys7CisJfQorCisJLyogdHVybiB5LSBvZmYsIHgrIG9uLCB0aGVuIGxlYXZlIGluIGxvd3Bvd2VyICovCisJeC0+dHhfYnVmID0gJnJlYWRfeDsKKwl4LT5sZW4gPSAxOworCXgrKzsKKwl4LT5yeF9idWYgPSAmdHMtPnRjLng7CisJeC0+bGVuID0gMjsKKwl4Kys7CisKKwlDU19DSEFOR0UoeFstMV0pOworCisJZm9yIChpID0gMDsgaSA8IHggLSB0cy0+eGZlcjsgaSsrKQorCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmdHMtPnhmZXJbaV0sICZ0cy0+bXNnKTsKKwl0cy0+bXNnLmNvbXBsZXRlID0gYWRzNzg0Nl9yeDsKKwl0cy0+bXNnLmNvbnRleHQgPSB0czsKKworCWlmIChyZXF1ZXN0X2lycShzcGktPmlycSwgYWRzNzg0Nl9pcnEsIFNBX1NBTVBMRV9SQU5ET00sCisJCQkJc3BpLT5kZXYuYnVzX2lkLCB0cykpIHsKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJpcnEgJWQgYnVzeT9cbiIsIHNwaS0+aXJxKTsKKwkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJnRzLT5pbnB1dCk7CisJCWtmcmVlKHRzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJc2V0X2lycV90eXBlKHNwaS0+aXJxLCBJUlFUX0ZBTExJTkcpOworCisJZGV2X2luZm8oJnNwaS0+ZGV2LCAidG91Y2hzY3JlZW4sIGlycSAlZFxuIiwgc3BpLT5pcnEpOworCisJLyogdGFrZSBhIGZpcnN0IHNhbXBsZSwgbGVhdmluZyBuUEVOSVJRIGFjdGl2ZTsgYXZvaWQKKwkgKiB0aGUgdG91Y2hzY3JlZW4sIGluIGNhc2UgaXQncyBub3QgY29ubmVjdGVkLgorCSAqLworCSh2b2lkKSBhZHM3ODQ2X3JlYWQxMl9zZXIoJnNwaS0+ZGV2LAorCQkJICBSRUFEXzEyQklUX1NFUih2YXV4KSB8IEFEU19QRDEwX0FMTF9PTik7CisKKwkvKiBhZHM3ODQzLzc4NDUgZG9uJ3QgaGF2ZSB0ZW1wZXJhdHVyZSBzZW5zb3JzLCBhbmQKKwkgKiB1c2UgdGhlIG90aGVyIHNlbnNvcnMgYSBiaXQgZGlmZmVyZW50bHkgdG9vCisJICovCisJaWYgKHRzLT5tb2RlbCA9PSA3ODQ2KSB7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl90ZW1wMCk7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl90ZW1wMSk7CisJfQorCWlmICh0cy0+bW9kZWwgIT0gNzg0NSkKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZzcGktPmRldiwgJmRldl9hdHRyX3ZiYXR0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfdmF1eCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWRzNzg0Nl9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWRzNzg0NgkJKnRzID0gZGV2X2dldF9kcnZkYXRhKCZzcGktPmRldik7CisKKwlhZHM3ODQ2X3N1c3BlbmQoc3BpLCBQTVNHX1NVU1BFTkQpOworCWZyZWVfaXJxKHRzLT5zcGktPmlycSwgdHMpOworCWlmICh0cy0+aXJxX2Rpc2FibGVkKQorCQllbmFibGVfaXJxKHRzLT5zcGktPmlycSk7CisKKwlpZiAodHMtPm1vZGVsID09IDc4NDYpIHsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZzcGktPmRldiwgJmRldl9hdHRyX3RlbXAwKTsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZzcGktPmRldiwgJmRldl9hdHRyX3RlbXAxKTsKKwl9CisJaWYgKHRzLT5tb2RlbCAhPSA3ODQ1KQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfdmJhdHQpOworCWRldmljZV9yZW1vdmVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl92YXV4KTsKKworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZ0cy0+aW5wdXQpOworCWtmcmVlKHRzKTsKKworCWRldl9kYmcoJnNwaS0+ZGV2LCAidW5yZWdpc3RlcmVkIHRvdWNoc2NyZWVuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkczc4NDZfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gImFkczc4NDYiLAorCQkuYnVzCT0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gYWRzNzg0Nl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFkczc4NDZfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IGFkczc4NDZfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGFkczc4NDZfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWRzNzg0Nl9pbml0KHZvaWQpCit7CisJLyogZ3JyLCBib2FyZC1zcGVjaWZpYyBpbml0IHNob3VsZCBzdGF5IG91dCBvZiBkcml2ZXJzISEgKi8KKworI2lmZGVmCUNPTkZJR19BUkNIX09NQVAKKwlpZiAobWFjaGluZV9pc19vbWFwX29zaygpKSB7CisJCS8qIEdQSU80ID0gUEVOSVJROyBHUElPNiA9IEJVU1kgKi8KKwkJb21hcF9yZXF1ZXN0X2dwaW8oNCk7CisJCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDQsIDEpOworCQlvbWFwX3JlcXVlc3RfZ3Bpbyg2KTsKKwkJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oNiwgMSk7CisJfQorCS8vIGFsc28gVEkgMTUxMCBJbm5vdmF0b3IsIGJpdGJhbmdpbmcgdGhyb3VnaCBGUEdBCisJLy8gYWxzbyBOb2tpYSA3NzAKKwkvLyBhbHNvIFBhbG0gVHVuZ3N0ZW4gVDIKKyNlbmRpZgorCisJLy8gUFhBOgorCS8vIGFsc28gRGVsbCBBeGltIFg1MAorCS8vIGFsc28gSFAgaVBhcSBIMTkxeC9IMTkyeC9INDE1eC9INDM1eAorCS8vIGFsc28gSW50ZWwgTHViYm9jayAoYWRkaXRpb25hbCB0byBVQ0IxNDAwOyBhcyB0ZW1wZXJhdHVyZSBzZW5zb3IpCisJLy8gYWxzbyBTaGFycCBaYXVydXMgQzd4eCwgQzh4eCAoY29yZ2kvc2hlcGVyZC9odXNreSkKKworCS8vIEF0bWVsIGF0OTFzYW05MjYxLUVLIHVzZXMgYWRzNzg0MworCisJLy8gYWxzbyB2YXJpb3VzIEFNRCBBdTF4MDAgZGV2ZWwgYm9hcmRzCisKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWRzNzg0Nl9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWRzNzg0Nl9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGFkczc4NDZfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWRzNzg0Nl9kcml2ZXIpOworCisjaWZkZWYJQ09ORklHX0FSQ0hfT01BUAorCWlmIChtYWNoaW5lX2lzX29tYXBfb3NrKCkpIHsKKwkJb21hcF9mcmVlX2dwaW8oNCk7CisJCW9tYXBfZnJlZV9ncGlvKDYpOworCX0KKyNlbmRpZgorCit9Cittb2R1bGVfZXhpdChhZHM3ODQ2X2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFEUzc4NDYgVG91Y2hTY3JlZW4gRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vYWN0MjAwMC9hY3QyMDAwLmggYi9kcml2ZXJzL2lzZG4vYWN0MjAwMC9hY3QyMDAwLmgKaW5kZXggYjA5MWQxYS4uZDRjNTA1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2FjdDIwMDAvYWN0MjAwMC5oCisrKyBiL2RyaXZlcnMvaXNkbi9hY3QyMDAwL2FjdDIwMDAuaApAQCAtMTgxLDE3ICsxODEsMTcgQEAKIAljaGFyIHJlZ25hbWVbMzVdOwkJLyogTmFtZSB1c2VkIGZvciByZXF1ZXN0X3JlZ2lvbiAgICAgKi8KIH0gYWN0MjAwMF9jYXJkOwogCi1leHRlcm4gX19pbmxpbmVfXyB2b2lkIGFjdDIwMDBfc2NoZWR1bGVfdHgoYWN0MjAwMF9jYXJkICpjYXJkKQorc3RhdGljIGlubGluZSB2b2lkIGFjdDIwMDBfc2NoZWR1bGVfdHgoYWN0MjAwMF9jYXJkICpjYXJkKQogewogICAgICAgICBzY2hlZHVsZV93b3JrKCZjYXJkLT5zbmRfdHEpOwogfQogCi1leHRlcm4gX19pbmxpbmVfXyB2b2lkIGFjdDIwMDBfc2NoZWR1bGVfcngoYWN0MjAwMF9jYXJkICpjYXJkKQorc3RhdGljIGlubGluZSB2b2lkIGFjdDIwMDBfc2NoZWR1bGVfcngoYWN0MjAwMF9jYXJkICpjYXJkKQogewogICAgICAgICBzY2hlZHVsZV93b3JrKCZjYXJkLT5yY3ZfdHEpOwogfQogCi1leHRlcm4gX19pbmxpbmVfXyB2b2lkIGFjdDIwMDBfc2NoZWR1bGVfcG9sbChhY3QyMDAwX2NhcmQgKmNhcmQpCitzdGF0aWMgaW5saW5lIHZvaWQgYWN0MjAwMF9zY2hlZHVsZV9wb2xsKGFjdDIwMDBfY2FyZCAqY2FyZCkKIHsKICAgICAgICAgc2NoZWR1bGVfd29yaygmY2FyZC0+cG9sbF90cSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vYWN0MjAwMC9jYXBpLmggYi9kcml2ZXJzL2lzZG4vYWN0MjAwMC9jYXBpLmgKaW5kZXggZjZkNWY1My4uNDlmNDUzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2FjdDIwMDAvY2FwaS5oCisrKyBiL2RyaXZlcnMvaXNkbi9hY3QyMDAwL2NhcGkuaApAQCAtNzgsMjkgKzc4LDI5IEBACiB0eXBlZGVmIHN0cnVjdCBhY3RjYXBpX21zbiB7CiAJX191OCBlYXo7CiAJX191OCBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiBNU04gICAgICAgICAgICAgICAgKi8KLQlfX3U4IG1zblsxNV0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotfSBhY3RjYXBpX21zbjsKKwlfX3U4IG1zblsxNV07Cit9ICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhY3RjYXBpX21zbjsKIAogdHlwZWRlZiBzdHJ1Y3QgYWN0Y2FwaV9kbHBkIHsKIAlfX3U4IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVuZ3RoIG9mIHN0cnVjdHVyZSAgICAgICAgICAqLwotCV9fdTE2IGRsZW4gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOyAvKiBEYXRhIExlbmd0aCAgICAgICAgICAgICAgICAgICovCi0JX191OCBsYWEgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOyAgIC8qIExpbmsgQWRkcmVzcyBBICAgICAgICAgICAgICAgKi8KKwlfX3UxNiBkbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGF0YSBMZW5ndGggICAgICAgICAgICAgICAgICAqLworCV9fdTggbGFhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMaW5rIEFkZHJlc3MgQSAgICAgICAgICAgICAgICovCiAJX191OCBsYWI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExpbmsgQWRkcmVzcyBCICAgICAgICAgICAgICAgKi8KIAlfX3U4IG1vZHVsbzsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9kdWxvIE1vZGUgICAgICAgICAgICAgICAgICAqLwogCV9fdTggd2luOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXaW5kb3cgc2l6ZSAgICAgICAgICAgICAgICAgICovCiAJX191OCB4aWRbMTAwXTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFhJRCBJbmZvcm1hdGlvbiAgICAgICAgICAgICAgKi8KLX0gYWN0Y2FwaV9kbHBkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhY3RjYXBpX2RscGQ7CiAKIHR5cGVkZWYgc3RydWN0IGFjdGNhcGlfbmNwZCB7CiAJX191OCAgIGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiBzdHJ1Y3R1cmUgICAgICAgICAgKi8KLQlfX3UxNiAgbGljIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQlfX3UxNiAgaGljIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQlfX3UxNiAgbHRjIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQlfX3UxNiAgaHRjIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQlfX3UxNiAgbG9jIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQlfX3UxNiAgaG9jIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQlfX3U4ICAgbW9kdWxvIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLX0gYWN0Y2FwaV9uY3BkOworCV9fdTE2ICBsaWM7CisJX191MTYgIGhpYzsKKwlfX3UxNiAgbHRjOworCV9fdTE2ICBodGM7CisJX191MTYgIGxvYzsKKwlfX3UxNiAgaG9jOworCV9fdTggICBtb2R1bG87Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGFjdGNhcGlfbmNwZDsKICNkZWZpbmUgYWN0Y2FwaV9uY3BpIGFjdGNhcGlfbmNwZAogCiAvKgpAQCAtMTY4LDE5ICsxNjgsMTkgQEAKIAkJCV9fdTE2IG1hbnVmX21zZzsKIAkJCV9fdTE2IGNvbnRyb2xsZXI7CiAJCQlhY3RjYXBpX21zbiBtc25tYXA7Ci0JCX0gbWFudWZhY3R1cmVyX3JlcV9tc247CisJCX0gX19hdHRyaWJ1dGUgKChwYWNrZWQpKSBtYW51ZmFjdHVyZXJfcmVxX21zbjsKIAkJLyogVE9ETzogVHJhY2VJbml0LXJlcS9jb25mL2luZC9yZXNwIGFuZAogCQkgKiAgICAgICBUcmFjZUR1bXAtcmVxL2NvbmYvaW5kL3Jlc3AKIAkJICovCiAJCXN0cnVjdCBjb25uZWN0X3JlcSB7CiAJCQlfX3U4ICBjb250cm9sbGVyOwogCQkJX191OCAgYmNoYW47Ci0JCQlfX3UzMiBpbmZvbWFzayBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJCQlfX3UzMiBpbmZvbWFzazsKIAkJCV9fdTggIHNpMTsKIAkJCV9fdTggIHNpMjsKIAkJCV9fdTggIGVhejsKIAkJCWFjdGNhcGlfYWRkciBhZGRyOwotCQl9IGNvbm5lY3RfcmVxOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBjb25uZWN0X3JlcTsKIAkJc3RydWN0IGNvbm5lY3RfY29uZiB7CiAJCQlfX3UxNiBwbGNpOwogCQkJX191MTYgaW5mbzsKQEAgLTE5Miw3ICsxOTIsNyBAQAogCQkJX191OCAgc2kyOwogCQkJX191OCAgZWF6OwogCQkJYWN0Y2FwaV9hZGRyIGFkZHI7Ci0JCX0gY29ubmVjdF9pbmQ7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGNvbm5lY3RfaW5kOwogCQlzdHJ1Y3QgY29ubmVjdF9yZXNwIHsKIAkJCV9fdTE2IHBsY2k7CiAJCQlfX3U4ICByZWplY3RjYXVzZTsKQEAgLTIwMCwxNCArMjAwLDE0IEBACiAJCXN0cnVjdCBjb25uZWN0X2FjdGl2ZV9pbmQgewogCQkJX191MTYgcGxjaTsKIAkJCWFjdGNhcGlfYWRkciBhZGRyOwotCQl9IGNvbm5lY3RfYWN0aXZlX2luZDsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgY29ubmVjdF9hY3RpdmVfaW5kOwogCQlzdHJ1Y3QgY29ubmVjdF9hY3RpdmVfcmVzcCB7CiAJCQlfX3UxNiBwbGNpOwogCQl9IGNvbm5lY3RfYWN0aXZlX3Jlc3A7CiAJCXN0cnVjdCBjb25uZWN0X2IzX3JlcSB7CiAJCQlfX3UxNiBwbGNpOwogCQkJYWN0Y2FwaV9uY3BpIG5jcGk7Ci0JCX0gY29ubmVjdF9iM19yZXE7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGNvbm5lY3RfYjNfcmVxOwogCQlzdHJ1Y3QgY29ubmVjdF9iM19jb25mIHsKIAkJCV9fdTE2IHBsY2k7CiAJCQlfX3UxNiBuY2NpOwpAQCAtMjE3LDEyICsyMTcsMTIgQEAKIAkJCV9fdTE2IG5jY2k7CiAJCQlfX3UxNiBwbGNpOwogCQkJYWN0Y2FwaV9uY3BpIG5jcGk7Ci0JCX0gY29ubmVjdF9iM19pbmQ7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGNvbm5lY3RfYjNfaW5kOwogCQlzdHJ1Y3QgY29ubmVjdF9iM19yZXNwIHsKIAkJCV9fdTE2IG5jY2k7CiAJCQlfX3U4ICByZWplY3RjYXVzZTsKLQkJCWFjdGNhcGlfbmNwaSBuY3BpIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQkJfSBjb25uZWN0X2IzX3Jlc3A7CisJCQlhY3RjYXBpX25jcGkgbmNwaTsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgY29ubmVjdF9iM19yZXNwOwogCQlzdHJ1Y3QgZGlzY29ubmVjdF9yZXEgewogCQkJX191MTYgcGxjaTsKIAkJCV9fdTggIGNhdXNlOwpAQCAtMjQxLDE0ICsyNDEsMTQgQEAKIAkJc3RydWN0IGNvbm5lY3RfYjNfYWN0aXZlX2luZCB7CiAJCQlfX3UxNiBuY2NpOwogCQkJYWN0Y2FwaV9uY3BpIG5jcGk7Ci0JCX0gY29ubmVjdF9iM19hY3RpdmVfaW5kOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBjb25uZWN0X2IzX2FjdGl2ZV9pbmQ7CiAJCXN0cnVjdCBjb25uZWN0X2IzX2FjdGl2ZV9yZXNwIHsKIAkJCV9fdTE2IG5jY2k7CiAJCX0gY29ubmVjdF9iM19hY3RpdmVfcmVzcDsKIAkJc3RydWN0IGRpc2Nvbm5lY3RfYjNfcmVxIHsKIAkJCV9fdTE2IG5jY2k7CiAJCQlhY3RjYXBpX25jcGkgbmNwaTsKLQkJfSBkaXNjb25uZWN0X2IzX3JlcTsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZGlzY29ubmVjdF9iM19yZXE7CiAJCXN0cnVjdCBkaXNjb25uZWN0X2IzX2NvbmYgewogCQkJX191MTYgbmNjaTsKIAkJCV9fdTE2IGluZm87CkBAIC0yNTcsNyArMjU3LDcgQEAKIAkJCV9fdTE2IG5jY2k7CiAJCQlfX3UxNiBpbmZvOwogCQkJYWN0Y2FwaV9uY3BpIG5jcGk7Ci0JCX0gZGlzY29ubmVjdF9iM19pbmQ7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGRpc2Nvbm5lY3RfYjNfaW5kOwogCQlzdHJ1Y3QgZGlzY29ubmVjdF9iM19yZXNwIHsKIAkJCV9fdTE2IG5jY2k7CiAJCX0gZGlzY29ubmVjdF9iM19yZXNwOwpAQCAtMjY1LDcgKzI2NSw3IEBACiAJCQlfX3UxNiBwbGNpOwogCQkJYWN0Y2FwaV9pbmZvbnIgbnI7CiAJCQlhY3RjYXBpX2luZm9lbCBlbDsKLQkJfSBpbmZvX2luZDsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgaW5mb19pbmQ7CiAJCXN0cnVjdCBpbmZvX3Jlc3AgewogCQkJX191MTYgcGxjaTsKIAkJfSBpbmZvX3Jlc3A7CkBAIC0yNzksOCArMjc5LDggQEAKIAkJc3RydWN0IHNlbGVjdF9iMl9wcm90b2NvbF9yZXEgewogCQkJX191MTYgcGxjaTsKIAkJCV9fdTggIHByb3RvY29sOwotCQkJYWN0Y2FwaV9kbHBkIGRscGQgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCQl9IHNlbGVjdF9iMl9wcm90b2NvbF9yZXE7CisJCQlhY3RjYXBpX2RscGQgZGxwZDsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgc2VsZWN0X2IyX3Byb3RvY29sX3JlcTsKIAkJc3RydWN0IHNlbGVjdF9iMl9wcm90b2NvbF9jb25mIHsKIAkJCV9fdTE2IHBsY2k7CiAJCQlfX3UxNiBpbmZvOwpAQCAtMjg4LDQ5ICsyODgsNDkgQEAKIAkJc3RydWN0IHNlbGVjdF9iM19wcm90b2NvbF9yZXEgewogCQkJX191MTYgcGxjaTsKIAkJCV9fdTggIHByb3RvY29sOwotCQkJYWN0Y2FwaV9uY3BkIG5jcGQgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCQl9IHNlbGVjdF9iM19wcm90b2NvbF9yZXE7CisJCQlhY3RjYXBpX25jcGQgbmNwZDsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgc2VsZWN0X2IzX3Byb3RvY29sX3JlcTsKIAkJc3RydWN0IHNlbGVjdF9iM19wcm90b2NvbF9jb25mIHsKIAkJCV9fdTE2IHBsY2k7CiAJCQlfX3UxNiBpbmZvOwogCQl9IHNlbGVjdF9iM19wcm90b2NvbF9jb25mOwogCQlzdHJ1Y3QgbGlzdGVuX3JlcSB7CiAJCQlfX3U4ICBjb250cm9sbGVyOwotCQkJX191MzIgaW5mb21hc2sgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOyAgCi0JCQlfX3UxNiBlYXptYXNrIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQkJCV9fdTE2IHNpbWFzayBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0JCX0gbGlzdGVuX3JlcTsKKwkJCV9fdTMyIGluZm9tYXNrOworCQkJX191MTYgZWF6bWFzazsKKwkJCV9fdTE2IHNpbWFzazsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbGlzdGVuX3JlcTsKIAkJc3RydWN0IGxpc3Rlbl9jb25mIHsKIAkJCV9fdTggIGNvbnRyb2xsZXI7Ci0JCQlfX3UxNiBpbmZvIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQkJfSBsaXN0ZW5fY29uZjsKKwkJCV9fdTE2IGluZm87CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGxpc3Rlbl9jb25mOwogCQlzdHJ1Y3QgZGF0YV9iM19yZXEgewogCQkJX191MTYgZmFrZW5jY2k7CiAJCQlfX3UxNiBkYXRhbGVuOwogCQkJX191MzIgdW51c2VkOwogCQkJX191OCAgYmxvY2tucjsKLQkJCV9fdTE2IGZsYWdzIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQkJfSBkYXRhX2IzX3JlcTsKKwkJCV9fdTE2IGZsYWdzOworCQl9IF9fYXR0cmlidXRlICgocGFja2VkKSkgZGF0YV9iM19yZXE7CiAJCXN0cnVjdCBkYXRhX2IzX2luZCB7CiAJCQlfX3UxNiBmYWtlbmNjaTsKIAkJCV9fdTE2IGRhdGFsZW47CiAJCQlfX3UzMiB1bnVzZWQ7CiAJCQlfX3U4ICBibG9ja25yOwotCQkJX191MTYgZmxhZ3MgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCQl9IGRhdGFfYjNfaW5kOworCQkJX191MTYgZmxhZ3M7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGRhdGFfYjNfaW5kOwogCQlzdHJ1Y3QgZGF0YV9iM19yZXNwIHsKIAkJCV9fdTE2IG5jY2k7CiAJCQlfX3U4ICBibG9ja25yOwotCQl9IGRhdGFfYjNfcmVzcDsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZGF0YV9iM19yZXNwOwogCQlzdHJ1Y3QgZGF0YV9iM19jb25mIHsKIAkJCV9fdTE2IG5jY2k7CiAJCQlfX3U4ICBibG9ja25yOwotCQkJX191MTYgaW5mbyBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0JCX0gZGF0YV9iM19jb25mOworCQkJX191MTYgaW5mbzsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZGF0YV9iM19jb25mOwogCX0gbXNnOwotfSBhY3RjYXBpX21zZzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGFjdGNhcGlfbXNnOwogCi1leHRlcm4gX19pbmxpbmVfXyB1bnNpZ25lZCBzaG9ydAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydAogYWN0Y2FwaV9uZXh0c21zZyhhY3QyMDAwX2NhcmQgKmNhcmQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGkuYyBiL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGkuYwppbmRleCAxMWFlMGZkLi42MjNhZGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpLmMKKysrIGIvZHJpdmVycy9pc2RuL2NhcGkvY2FwaS5jCkBAIC00NjMsOCArNDYzLDcgQEAKICNlbmRpZgogCQlnb3RvIGJhZDsKIAl9Ci0JaWYgKGxkLT5yZWNlaXZlX3Jvb20gJiYKLQkgICAgbGQtPnJlY2VpdmVfcm9vbShtcC0+dHR5KSA8IGRhdGFsZW4pIHsKKwlpZiAobXAtPnR0eS0+cmVjZWl2ZV9yb29tIDwgZGF0YWxlbikgewogI2lmIGRlZmluZWQoX0RFQlVHX0RBVEFGTE9XKSB8fCBkZWZpbmVkKF9ERUJVR19UVFlGVU5DUykKIAkJcHJpbnRrKEtFUk5fREVCVUcgImNhcGk6IG5vIHJvb20gaW4gdHR5XG4iKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2NhcGkvY2FwaWZzLmMgYi9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpZnMuYwppbmRleCA3YjU2NGMwLi4wYTM3YWRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpZnMuYworKysgYi9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpZnMuYwpAQCAtMTcsNiArMTcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JLyogY3VycmVudCAqLwogCisjaW5jbHVkZSAiY2FwaWZzLmgiCisKIE1PRFVMRV9ERVNDUklQVElPTigiQ0FQSTRMaW51eDogL2Rldi9jYXBpLyBmaWxlc3lzdGVtIik7CiBNT0RVTEVfQVVUSE9SKCJDYXJzdGVuIFBhZXRoIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CkBAIC0xMzYsNyArMTM4LDcgQEAKIHsKIAljaGFyIHNbMTBdOwogCXN0cnVjdCBkZW50cnkgKnJvb3QgPSBjYXBpZnNfcm9vdDsKLQlkb3duKCZyb290LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJcmV0dXJuIGxvb2t1cF9vbmVfbGVuKHMsIHJvb3QsIHNwcmludGYocywgIiVkIiwgbnVtKSk7CiB9CiAKQEAgLTE1Nyw3ICsxNTksNyBAQAogCWRlbnRyeSA9IGdldF9ub2RlKG51bWJlcik7CiAJaWYgKCFJU19FUlIoZGVudHJ5KSAmJiAhZGVudHJ5LT5kX2lub2RlKQogCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwotCXVwKCZjYXBpZnNfcm9vdC0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmY2FwaWZzX3Jvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOwogfQogCiB2b2lkIGNhcGlmc19mcmVlX25jY2kodW5zaWduZWQgaW50IG51bWJlcikKQEAgLTE3Myw3ICsxNzUsNyBAQAogCQl9CiAJCWRwdXQoZGVudHJ5KTsKIAl9Ci0JdXAoJmNhcGlmc19yb290LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjYXBpZnNfcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGNhcGlmc19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vb3NfNGJyaS5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL29zXzRicmkuYwppbmRleCBjY2NmYWJjLi4xMWU2ZjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vb3NfNGJyaS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9vc180YnJpLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlICJkaXZhX3BjaS5oIgogI2luY2x1ZGUgIm1pX3BjLmgiCiAjaW5jbHVkZSAiZHNydjRicmkuaCIKKyNpbmNsdWRlICJoZWxwZXJzLmgiCiAKIHN0YXRpYyB2b2lkICpkaXZhX3hkaUxvYWRGaWxlRmlsZSA9IE5VTEw7CiBzdGF0aWMgZHdvcmQgZGl2YV94ZGlMb2FkRmlsZUxlbmd0aCA9IDA7CkBAIC04MTUsNyArODE2LDcgQEAKIAlyZXR1cm4gKHJldCk7CiB9CiAKLXZvaWQgKnhkaUxvYWRGaWxlKGNoYXIgKkZpbGVOYW1lLCB1bnNpZ25lZCBsb25nICpGaWxlTGVuZ3RoLAordm9pZCAqeGRpTG9hZEZpbGUoY2hhciAqRmlsZU5hbWUsIGR3b3JkICpGaWxlTGVuZ3RoLAogCQkgIHVuc2lnbmVkIGxvbmcgbGltKQogewogCXZvaWQgKnJldCA9IGRpdmFfeGRpTG9hZEZpbGVGaWxlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL29zX2JyaS5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL29zX2JyaS5jCmluZGV4IDRjYzQ0YTUuLmYzMWJiYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9vc19icmkuYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vb3NfYnJpLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlICJkaXZhX3BjaS5oIgogI2luY2x1ZGUgIm1pX3BjLmgiCiAjaW5jbHVkZSAicGNfbWFpbnQuaCIKKyNpbmNsdWRlICJkc3J2X2JyaS5oIgogCiAvKgogKiogIElNUE9SVFMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9vc19wcmkuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9vc19wcmkuYwppbmRleCA4YWMyMDdmLi5hMjk2YTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vb3NfcHJpLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL29zX3ByaS5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSAicGNfbWFpbnQuaCIKICNpbmNsdWRlICJkc3BfdHN0LmgiCiAjaW5jbHVkZSAiZGl2YV9kbWEuaCIKKyNpbmNsdWRlICJkc3J2X3ByaS5oIgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgT1MgRGVwZW5kZW50IHBhcnQgb2YgWERJIGRyaXZlciBmb3IgRElWQSBQUkkgQWRhcHRlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L0tjb25maWcgYi9kcml2ZXJzL2lzZG4vaGlzYXgvS2NvbmZpZwppbmRleCBjODIxMDU5Li4wZWY1NjAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvS2NvbmZpZworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvS2NvbmZpZwpAQCAtMTEwLDcgKzExMCw3IEBACiAKIGNvbmZpZyBISVNBWF9URUxFU1BDSQogCWJvb2wgIlRlbGVzIFBDSSIKLQlkZXBlbmRzIG9uIFBDSSAmJiAoQlJPS0VOIHx8ICEoU1BBUkMgfHwgUFBDIHx8IFBBUklTQyB8fCBNNjhLKSkKKwlkZXBlbmRzIG9uIFBDSSAmJiAoQlJPS0VOIHx8ICEoU1BBUkMgfHwgUFBDIHx8IFBBUklTQyB8fCBNNjhLIHx8IEZSVikpCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIEhpU2F4IHN1cHBvcnQgZm9yIHRoZSBUZWxlcyBQQ0kuCiAJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9pc2RuL1JFQURNRS5IaVNheD4gb24gaG93IHRvIGNvbmZpZ3VyZSBpdC4KQEAgLTIzOCw3ICsyMzgsNyBAQAogCiBjb25maWcgSElTQVhfTkVUSkVUCiAJYm9vbCAiTkVUamV0IGNhcmQiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgKEJST0tFTiB8fCAhKFNQQVJDIHx8IFBQQyB8fCBQQVJJU0MgfHwgTTY4SykpCisJZGVwZW5kcyBvbiBQQ0kgJiYgKEJST0tFTiB8fCAhKFNQQVJDIHx8IFBQQyB8fCBQQVJJU0MgfHwgTTY4SyB8fCBGUlYpKQogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBIaVNheCBzdXBwb3J0IGZvciB0aGUgTmV0SmV0IGZyb20gVHJhdmVyc2UKIAkgIFRlY2hub2xvZ2llcy4KQEAgLTI0OSw3ICsyNDksNyBAQAogCiBjb25maWcgSElTQVhfTkVUSkVUX1UKIAlib29sICJORVRzcGlkZXIgVSBjYXJkIgotCWRlcGVuZHMgb24gUENJICYmIChCUk9LRU4gfHwgIShTUEFSQyB8fCBQUEMgfHwgUEFSSVNDIHx8IE02OEspKQorCWRlcGVuZHMgb24gUENJICYmIChCUk9LRU4gfHwgIShTUEFSQyB8fCBQUEMgfHwgUEFSSVNDIHx8IE02OEsgfHwgRlJWKSkKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgSGlTYXggc3VwcG9ydCBmb3IgdGhlIE5ldHNwaWRlciBVIGludGVyZmFjZSBJU0ROIGNhcmQKIAkgIGZyb20gVHJhdmVyc2UgVGVjaG5vbG9naWVzLgpAQCAtMzE3LDcgKzMxNyw3IEBACiAKIGNvbmZpZyBISVNBWF9IRkNfUENJCiAJYm9vbCAiSEZDIFBDSS1CdXMgY2FyZHMiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgKEJST0tFTiB8fCAhKFNQQVJDIHx8IFBQQyB8fCBQQVJJU0MgfHwgTTY4SykpCisJZGVwZW5kcyBvbiBQQ0kgJiYgKEJST0tFTiB8fCAhKFNQQVJDIHx8IFBQQyB8fCBQQVJJU0MgfHwgTTY4SyB8fCBGUlYpKQogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBIaVNheCBzdXBwb3J0IGZvciB0aGUgSEZDLVMgUENJIDJCRFMwIGJhc2VkIGNhcmRzLgogCkBAIC0zNDQsNyArMzQ0LDcgQEAKIAogY29uZmlnIEhJU0FYX0VOVEVSTk9XX1BDSQogCWJvb2wgIkZvcm11bGEtbiBlbnRlcjpub3cgUENJIGNhcmQiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgKEJST0tFTiB8fCAhKFNQQVJDIHx8IFBQQyB8fCBQQVJJU0MgfHwgTTY4SykpCisJZGVwZW5kcyBvbiBQQ0kgJiYgKEJST0tFTiB8fCAhKFNQQVJDIHx8IFBQQyB8fCBQQVJJU0MgfHwgTTY4SyB8fCBGUlYpKQogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBIaVNheCBzdXBwb3J0IGZvciB0aGUgRm9ybXVsYS1uIGVudGVyOm5vdyBQQ0kKIAkgIElTRE4gY2FyZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9hdm1fcGNpLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvYXZtX3BjaS5jCmluZGV4IDVkOGVlNzMuLjRhYmU1ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9hdm1fcGNpLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2F2bV9wY2kuYwpAQCAtMzU4LDcgKzM1OCw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyB2b2lkCiBIRExDX2lycShzdHJ1Y3QgQkNTdGF0ZSAqYmNzLCB1X2ludCBzdGF0KSB7CiAJaW50IGxlbjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2RpdmEuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9kaXZhLmMKaW5kZXggYjYyZDZiMy4uYjBmZjFjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2RpdmEuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvZGl2YS5jCkBAIC00NzYsNyArNDc2LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAorc3RhdGljIHZvaWQKIE1lbWhzY3hfaW50ZXJydXB0KHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgdV9jaGFyIHZhbCwgdV9jaGFyIGhzY3gpCiB7CiAJdV9jaGFyIHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGlzYXguaCBiL2RyaXZlcnMvaXNkbi9oaXNheC9oaXNheC5oCmluZGV4IDI2YzU0NWYuLjFiODVjZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9oaXNheC5oCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oaXNheC5oCkBAIC0zOTYsMTcgKzM5NiwxNyBAQAogCiBzdHJ1Y3QgaGRsY19zdGF0X3JlZyB7CiAjaWZkZWYgX19CSUdfRU5ESUFOCi0JdV9jaGFyIGZpbGwgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JdV9jaGFyIG1vZGUgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JdV9jaGFyIHhtbCAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JdV9jaGFyIGNtZCAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisJdV9jaGFyIGZpbGw7CisJdV9jaGFyIG1vZGU7CisJdV9jaGFyIHhtbDsKKwl1X2NoYXIgY21kOwogI2Vsc2UKLQl1X2NoYXIgY21kICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQl1X2NoYXIgeG1sICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQl1X2NoYXIgbW9kZSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQl1X2NoYXIgZmlsbCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwl1X2NoYXIgY21kOworCXVfY2hhciB4bWw7CisJdV9jaGFyIG1vZGU7CisJdV9jaGFyIGZpbGw7CiAjZW5kaWYKLX07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgaGRsY19odyB7CiAJdW5pb24gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2hpc2F4X2ZjcGNpcG5wLmggYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGlzYXhfZmNwY2lwbnAuaAppbmRleCBiZDhhMjJlLi4yMWZiY2VkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2hpc2F4X2ZjcGNpcG5wLmgKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2hpc2F4X2ZjcGNpcG5wLmgKQEAgLTEyLDE3ICsxMiwxNyBAQAogCiBzdHJ1Y3QgaGRsY19zdGF0X3JlZyB7CiAjaWZkZWYgX19CSUdfRU5ESUFOCi0JdV9jaGFyIGZpbGwgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JdV9jaGFyIG1vZGUgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JdV9jaGFyIHhtbCAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JdV9jaGFyIGNtZCAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisJdV9jaGFyIGZpbGw7CisJdV9jaGFyIG1vZGU7CisJdV9jaGFyIHhtbDsKKwl1X2NoYXIgY21kOwogI2Vsc2UKLQl1X2NoYXIgY21kICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQl1X2NoYXIgeG1sICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQl1X2NoYXIgbW9kZSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQl1X2NoYXIgZmlsbCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwl1X2NoYXIgY21kOworCXVfY2hhciB4bWw7CisJdV9jaGFyIG1vZGU7CisJdV9jaGFyIGZpbGw7CiAjZW5kaWYKLX07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgZnJpdHpfYmNzIHsKIAlzdHJ1Y3QgaGlzYXhfYl9pZiBiX2lmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2hzY3hfaXJxLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaHNjeF9pcnEuYwppbmRleCA1ZmU5ZDQyLi43YjFhZDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvaHNjeF9pcnEuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaHNjeF9pcnEuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyB2b2lkCiBoc2N4X2ludGVycnVwdChzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIHVfY2hhciB2YWwsIHVfY2hhciBoc2N4KQogewogCXVfY2hhciByOwpAQCAtMjIxLDcgKzIyMSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyB2b2lkCiBoc2N4X2ludF9tYWluKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgdV9jaGFyIHZhbCkKIHsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2phZGVfaXJxLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvamFkZV9pcnEuYwppbmRleCAwODU2MzQwLi4xZjIwMWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvamFkZV9pcnEuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvamFkZV9pcnEuYwpAQCAtMTEwLDcgKzExMCw3IEBACiB9CiAKIAotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogamFkZV9pbnRlcnJ1cHQoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzLCB1X2NoYXIgdmFsLCB1X2NoYXIgamFkZSkKIHsKIAl1X2NoYXIgcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb21tb24uYyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb21tb24uYwppbmRleCA0NjQzZGYwLi4yMjc1OWMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fY29tbW9uLmMKKysrIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2NvbW1vbi5jCkBAIC04NTcsNiArODU3LDExOCBAQAogCXJldHVybiBjb3VudDsKIH0KIAorLyoKKyAqIGlzZG5fcmVhZGJjaGFuX3R0eSgpIHRyaWVzIHRvIGdldCBkYXRhIGZyb20gdGhlIHJlYWQtcXVldWUuCisgKiBJdCBNVVNUIGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgb2ZmLgorICoKKyAqIEJlIGF3YXJlIHRoYXQgdGhpcyBpcyBub3QgYW4gYXRvbWljIG9wZXJhdGlvbiB3aGVuIHNsZWVwICE9IDAsIGV2ZW4gdGhvdWdoCisgKiBpbnRlcnJ1cHRzIGFyZSB0dXJuZWQgb2ZmISBXZWxsLCBsaWtlIHRoYXQgd2UgYXJlIGN1cnJlbnRseSBvbmx5IGNhbGxlZAorICogb24gYmVoYWxmIG9mIGEgcmVhZCBzeXN0ZW0gY2FsbCBvbiByYXcgZGV2aWNlIGZpbGVzICh3aGljaCBhcmUgZG9jdW1lbnRlZAorICogdG8gYmUgZGFuZ2Vyb3VzIGFuZCBmb3IgZm9yIGRlYnVnZ2luZyBwdXJwb3NlIG9ubHkpLiBUaGUgaW5vZGUgc2VtYXBob3JlCisgKiB0YWtlcyBjYXJlIHRoYXQgdGhpcyBpcyBub3QgY2FsbGVkIGZvciB0aGUgc2FtZSBtaW5vciBkZXZpY2UgbnVtYmVyIHdoaWxlCisgKiB3ZSBhcmUgc2xlZXBpbmcsIGJ1dCBhY2Nlc3MgaXMgbm90IHNlcmlhbGl6ZWQgYWdhaW5zdCBzaW11bHRhbmVvdXMgcmVhZCgpCisgKiBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIHR0eUkgZGV2aWNlLiBDYW4gb3RoZXIgdWdseSBldmVudHMsIGxpa2UgY2hhbmdlcworICogb2YgdGhlIG1hcHBpbmcgKGRpLGNoKTwtPm1pbm9yLCBoYXBwZW4gZHVyaW5nIHRoZSBzbGVlcD8gLS1oZQorICovCitpbnQKK2lzZG5fcmVhZGJjaGFuX3R0eShpbnQgZGksIGludCBjaGFubmVsLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgY2lzY29faGFjaykKK3sKKwlpbnQgY291bnQ7CisJaW50IGNvdW50X3B1bGw7CisJaW50IGNvdW50X3B1dDsKKwlpbnQgZGZsYWc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwljaGFyIGxhc3QgPSAwOworCWludCBsZW47CisKKwlpZiAoIWRldi0+ZHJ2W2RpXSkKKwkJcmV0dXJuIDA7CisJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmZGV2LT5kcnZbZGldLT5ycHF1ZXVlW2NoYW5uZWxdKSkKKwkJCXJldHVybiAwOworCisJbGVuID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBkZXYtPmRydltkaV0tPnJjdmNvdW50W2NoYW5uZWxdKTsKKwlpZihsZW4gPT0gMCkKKwkJcmV0dXJuIGxlbjsKKworCWNvdW50ID0gMDsKKwl3aGlsZSAobGVuKSB7CisJCWlmICghKHNrYiA9IHNrYl9wZWVrKCZkZXYtPmRydltkaV0tPnJwcXVldWVbY2hhbm5lbF0pKSkKKwkJCWJyZWFrOworI2lmZGVmIENPTkZJR19JU0ROX0FVRElPCisJCWlmIChJU0ROX0FVRElPX1NLQl9MT0NLKHNrYikpCisJCQlicmVhazsKKwkJSVNETl9BVURJT19TS0JfTE9DSyhza2IpID0gMTsKKwkJaWYgKChJU0ROX0FVRElPX1NLQl9ETEVDT1VOVChza2IpKSB8fCAoZGV2LT5kcnZbZGldLT5ETEVmbGFnICYgKDEgPDwgY2hhbm5lbCkpKSB7CisJCQljaGFyICpwID0gc2tiLT5kYXRhOworCQkJdW5zaWduZWQgbG9uZyBETEVtYXNrID0gKDEgPDwgY2hhbm5lbCk7CisKKwkJCWRmbGFnID0gMDsKKwkJCWNvdW50X3B1bGwgPSBjb3VudF9wdXQgPSAwOworCQkJd2hpbGUgKChjb3VudF9wdWxsIDwgc2tiLT5sZW4pICYmIChsZW4gPiAwKSkgeworCQkJCWxlbi0tOworCQkJCWlmIChkZXYtPmRydltkaV0tPkRMRWZsYWcgJiBETEVtYXNrKSB7CisJCQkJCWxhc3QgPSBETEU7CisJCQkJCWRldi0+ZHJ2W2RpXS0+RExFZmxhZyAmPSB+RExFbWFzazsKKwkJCQl9IGVsc2UgeworCQkJCQlsYXN0ID0gKnA7CisJCQkJCWlmIChsYXN0ID09IERMRSkgeworCQkJCQkJZGV2LT5kcnZbZGldLT5ETEVmbGFnIHw9IERMRW1hc2s7CisJCQkJCQkoSVNETl9BVURJT19TS0JfRExFQ09VTlQoc2tiKSktLTsKKwkJCQkJfQorCQkJCQlwKys7CisJCQkJCWNvdW50X3B1bGwrKzsKKwkJCQl9CisJCQkJY291bnRfcHV0Kys7CisJCQl9CisJCQlpZiAoY291bnRfcHVsbCA+PSBza2ItPmxlbikKKwkJCQlkZmxhZyA9IDE7CisJCX0gZWxzZSB7CisjZW5kaWYKKwkJCS8qIE5vIERMRSdzIGluIGJ1ZmYsIHNvIHNpbXBseSBjb3B5IGl0ICovCisJCQlkZmxhZyA9IDE7CisJCQlpZiAoKGNvdW50X3B1bGwgPSBza2ItPmxlbikgPiBsZW4pIHsKKwkJCQljb3VudF9wdWxsID0gbGVuOworCQkJCWRmbGFnID0gMDsKKwkJCX0KKwkJCWNvdW50X3B1dCA9IGNvdW50X3B1bGw7CisJCQlpZihjb3VudF9wdXQgPiAxKQorCQkJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBza2ItPmRhdGEsIGNvdW50X3B1dCAtIDEpOworCQkJbGFzdCA9IHNrYi0+ZGF0YVtjb3VudF9wdXRdIC0gMTsKKwkJCWxlbiAtPSBjb3VudF9wdXQ7CisjaWZkZWYgQ09ORklHX0lTRE5fQVVESU8KKwkJfQorI2VuZGlmCisJCWNvdW50ICs9IGNvdW50X3B1dDsKKwkJaWYgKGRmbGFnKSB7CisJCQkvKiBXZSBnb3QgYWxsIHRoZSBkYXRhIGluIHRoaXMgYnVmZi4KKwkJCSAqIE5vdyB3ZSBjYW4gZGVxdWV1ZSBpdC4KKwkJCSAqLworCQkJaWYoY2lzY29faGFjaykKKwkJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGxhc3QsIDB4RkYpOworCQkJZWxzZQorCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgbGFzdCwgVFRZX05PUk1BTCk7CisjaWZkZWYgQ09ORklHX0lTRE5fQVVESU8KKwkJCUlTRE5fQVVESU9fU0tCX0xPQ0soc2tiKSA9IDA7CisjZW5kaWYKKwkJCXNrYiA9IHNrYl9kZXF1ZXVlKCZkZXYtPmRydltkaV0tPnJwcXVldWVbY2hhbm5lbF0pOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQl9IGVsc2UgeworCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBsYXN0LCBUVFlfTk9STUFMKTsKKwkJCS8qIE5vdCB5ZXQgZW1wdGllZCB0aGlzIGJ1ZmYsIHNvIGl0CisJCQkgKiBtdXN0IHN0YXkgaW4gdGhlIHF1ZXVlLCBmb3IgZnVydGhlciBjYWxscworCQkJICogYnV0IHdlIHB1bGwgb2ZmIHRoZSBkYXRhIHdlIGdvdCB1bnRpbCBub3cuCisJCQkgKi8KKwkJCXNrYl9wdWxsKHNrYiwgY291bnRfcHVsbCk7CisjaWZkZWYgQ09ORklHX0lTRE5fQVVESU8KKwkJCUlTRE5fQVVESU9fU0tCX0xPQ0soc2tiKSA9IDA7CisjZW5kaWYKKwkJfQorCQlkZXYtPmRydltkaV0tPnJjdmNvdW50W2NoYW5uZWxdIC09IGNvdW50X3B1dDsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCisKIHN0YXRpYyBfX2lubGluZSBpbnQKIGlzZG5fbWlub3IyZHJ2KGludCBtaW5vcikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb21tb24uaCBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb21tb24uaAppbmRleCBlMjdlOWMzLi4wODI3MzVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fY29tbW9uLmgKKysrIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2NvbW1vbi5oCkBAIC0zNyw2ICszNyw3IEBACiBleHRlcm4gdm9pZCBpc2RuX3VuZXhjbHVzaXZlX2NoYW5uZWwoaW50IGRpLCBpbnQgY2gpOwogZXh0ZXJuIGludCAgaXNkbl9nZXRudW0oY2hhciAqKik7CiBleHRlcm4gaW50ICBpc2RuX3JlYWRiY2hhbihpbnQsIGludCwgdV9jaGFyICosIHVfY2hhciAqLCBpbnQsIHdhaXRfcXVldWVfaGVhZF90ICopOworZXh0ZXJuIGludCAgaXNkbl9yZWFkYmNoYW5fdHR5KGludCwgaW50LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBpbnQpOwogZXh0ZXJuIGludCAgaXNkbl9nZXRfZnJlZV9jaGFubmVsKGludCwgaW50LCBpbnQsIGludCwgaW50LCBjaGFyICopOwogZXh0ZXJuIGludCAgaXNkbl93cml0ZWJ1Zl9za2Jfc3R1YihpbnQsIGludCwgaW50LCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIGV4dGVybiBpbnQgIHJlZ2lzdGVyX2lzZG4oaXNkbl9pZiAqIGkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3R0eS5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3R0eS5jCmluZGV4IDhjNDA0YjQuLmYxOTBhOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl90dHkuYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fdHR5LmMKQEAgLTY0LDM3ICs2NCw0MiBAQAogCWludCBjOwogCWludCBsZW47CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwljaGFyIGxhc3Q7CiAKIAlpZiAoaW5mby0+b25saW5lKSB7CiAJCWlmICgodHR5ID0gaW5mby0+dHR5KSkgewogCQkJaWYgKGluZm8tPm1jciAmIFVBUlRfTUNSX1JUUykgewotCQkJCWMgPSBUVFlfRkxJUEJVRl9TSVpFIC0gdHR5LT5mbGlwLmNvdW50OwogCQkJCWxlbiA9IHNrYi0+bGVuCiAjaWZkZWYgQ09ORklHX0lTRE5fQVVESU8KIAkJCQkJKyBJU0ROX0FVRElPX1NLQl9ETEVDT1VOVChza2IpCiAjZW5kaWYKIAkJCQkJOworCisJCQkJYyA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgbGVuKTsKIAkJCQlpZiAoYyA+PSBsZW4pIHsKICNpZmRlZiBDT05GSUdfSVNETl9BVURJTwotCQkJCQlpZiAoSVNETl9BVURJT19TS0JfRExFQ09VTlQoc2tiKSkKLQkJCQkJCXdoaWxlIChza2ItPmxlbi0tKSB7CisJCQkJCWlmIChJU0ROX0FVRElPX1NLQl9ETEVDT1VOVChza2IpKSB7CisJCQkJCQlpbnQgbCA9IHNrYi0+bGVuOworCQkJCQkJdW5zaWduZWQgY2hhciAqZHAgPSBza2ItPmRhdGE7CisJCQkJCQl3aGlsZSAoLS1sKSB7CiAJCQkJCQkJaWYgKCpza2ItPmRhdGEgPT0gRExFKQogCQkJCQkJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIERMRSwgMCk7Ci0JCQkJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAqc2tiLT5kYXRhKyssIDApOworCQkJCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgKmRwKyssIDApOworCQkJCQkJfQorCQkJCQkJbGFzdCA9ICpkcDsKIAkJCQkJfSBlbHNlIHsKICNlbmRpZgotCQkJCQkJbWVtY3B5KHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIsCi0JCQkJCQkgICAgICAgc2tiLT5kYXRhLCBsZW4pOwotCQkJCQkJdHR5LT5mbGlwLmNvdW50ICs9IGxlbjsKLQkJCQkJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgKz0gbGVuOwotCQkJCQkJbWVtc2V0KHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIsIDAsIGxlbik7Ci0JCQkJCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyICs9IGxlbjsKKwkJCQkJCWlmKGxlbiA+IDEpCisJCQkJCQkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIHNrYi0+ZGF0YSwgbGVuIC0gMSk7CisJCQkJCQlsYXN0ID0gc2tiLT5kYXRhW2xlbiAtIDFdOwogI2lmZGVmIENPTkZJR19JU0ROX0FVRElPCiAJCQkJCX0KICNlbmRpZgogCQkJCQlpZiAoaW5mby0+ZW11Lm1kbXJlZ1tSRUdfQ1BQUF0gJiBCSVRfQ1BQUCkKLQkJCQkJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHJbbGVuIC0gMV0gPSAweGZmOwotCQkJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+ZmxpcC53b3JrLCAxKTsKKwkJCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgbGFzdCwgMHhGRik7CisJCQkJCWVsc2UKKwkJCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgbGFzdCwgVFRZX05PUk1BTCk7CisJCQkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiAJCQkJCWtmcmVlX3NrYihza2IpOwogCQkJCQlyZXR1cm4gMTsKIAkJCQl9CkBAIC0xMTQsNyArMTE5LDYgQEAKIAlpbnQgcmVzY2hlZCA9IDA7CiAJaW50IG1pZHg7CiAJaW50IGk7Ci0JaW50IGM7CiAJaW50IHI7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAltb2RlbV9pbmZvICppbmZvOwpAQCAtMTMxLDIwICsxMzUsMTMgQEAKICNlbmRpZgogCQkJCWlmICgodHR5ID0gaW5mby0+dHR5KSkgewogCQkJCQlpZiAoaW5mby0+bWNyICYgVUFSVF9NQ1JfUlRTKSB7Ci0JCQkJCQljID0gVFRZX0ZMSVBCVUZfU0laRSAtIHR0eS0+ZmxpcC5jb3VudDsKLQkJCQkJCWlmIChjID4gMCkgewotCQkJCQkJCXIgPSBpc2RuX3JlYWRiY2hhbihpbmZvLT5pc2RuX2RyaXZlciwgaW5mby0+aXNkbl9jaGFubmVsLAotCQkJCQkJCQkJICAgdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciwKLQkJCQkJCQkJCSAgIHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIsIGMsIE5VTEwpOwotCQkJCQkJCS8qIENJU0NPIEFzeW5jUFBQIEhhY2sgKi8KLQkJCQkJCQlpZiAoIShpbmZvLT5lbXUubWRtcmVnW1JFR19DUFBQXSAmIEJJVF9DUFBQKSkKLQkJCQkJCQkJbWVtc2V0KHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIsIDAsIHIpOwotCQkJCQkJCXR0eS0+ZmxpcC5jb3VudCArPSByOwotCQkJCQkJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgKz0gcjsKLQkJCQkJCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyICs9IHI7Ci0JCQkJCQkJaWYgKHIpCi0JCQkJCQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5mbGlwLndvcmssIDEpOwotCQkJCQkJfQorCQkJCQkJLyogQ0lTQ08gQXN5bmNQUFAgSGFjayAqLworCQkJCQkJaWYgKCEoaW5mby0+ZW11Lm1kbXJlZ1tSRUdfQ1BQUF0gJiBCSVRfQ1BQUCkpCisJCQkJCQkJciA9IGlzZG5fcmVhZGJjaGFuX3R0eShpbmZvLT5pc2RuX2RyaXZlciwgaW5mby0+aXNkbl9jaGFubmVsLCB0dHksIDApOworCQkJCQkJZWxzZQorCQkJCQkJCXIgPSBpc2RuX3JlYWRiY2hhbl90dHkoaW5mby0+aXNkbl9kcml2ZXIsIGluZm8tPmlzZG5fY2hhbm5lbCwgdHR5LCAxKTsKKwkJCQkJCWlmIChyKQorCQkJCQkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiAJCQkJCX0gZWxzZQogCQkJCQkJciA9IDE7CiAJCQkJfSBlbHNlCkBAIC0yNDksNyArMjQ2LDcgQEAKIAl9CiAjZW5kaWYKICNlbmRpZgotCS8qIFRyeSB0byBkZWxpdmVyIGRpcmVjdGx5IHZpYSB0dHktZmxpcC1idWYgaWYgcXVldWUgaXMgZW1wdHkgKi8KKwkvKiBUcnkgdG8gZGVsaXZlciBkaXJlY3RseSB2aWEgdHR5LWJ1ZiBpZiBxdWV1ZSBpcyBlbXB0eSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5yZWFkbG9jaywgZmxhZ3MpOwogCWlmIChza2JfcXVldWVfZW1wdHkoJmRldi0+ZHJ2W2RpXS0+cnBxdWV1ZVtjaGFubmVsXSkpCiAJCWlmIChpc2RuX3R0eV90cnlfcmVhZChpbmZvLCBza2IpKSB7CkBAIC01MzQsNyArNTMxLDcgQEAKIC8qIFRoZSBuZXh0IHJvdXRpbmUgaXMgY2FsbGVkIG9uY2UgZnJvbSB3aXRoaW4gdGltZXItaW50ZXJydXB0CiAgKiB0cmlnZ2VyZWQgd2l0aGluIGlzZG5fdHR5X21vZGVtX25jYXJyaWVyKCkuIEl0IGNhbGxzCiAgKiBpc2RuX3R0eV9tb2RlbV9yZXN1bHQoKSB0byBzdHVmZiBhICJOTyBDQVJSSUVSIiBNZXNzYWdlCi0gKiBpbnRvIHRoZSB0dHkncyBmbGlwLWJ1ZmZlci4KKyAqIGludG8gdGhlIHR0eSdzIGJ1ZmZlci4KICAqLwogc3RhdGljIHZvaWQKIGlzZG5fdHR5X21vZGVtX2RvX25jYXJyaWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKQEAgLTIzNDcsNiArMjM0NCw3IEBACiAJdV9sb25nIGZsYWdzOwogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwogCWNoYXIgKnNwID0gTlVMTDsKKwlpbnQgbCA9IHN0cmxlbihtc2cpOwogCiAJaWYgKCFtc2cpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiaXNkbl90dHk6IE51bGwtTWVzc2FnZSBpbiBpc2RuX3R0eV9hdF9jb3V0XG4iKTsKQEAgLTIzNTksMTYgKzIzNTcsMTYgQEAKIAkJcmV0dXJuOwogCX0KIAotCS8qIHVzZSBxdWV1ZSBpbnN0ZWFkIG9mIGRpcmVjdCBmbGlwLCBpZiBvbmxpbmUgYW5kICovCi0JLyogZGF0YSBpcyBpbiBxdWV1ZSBvciBmbGlwIGJ1ZmZlciBpcyBmdWxsICovCi0JaWYgKChpbmZvLT5vbmxpbmUpICYmICgoKHR0eS0+ZmxpcC5jb3VudCArIHN0cmxlbihtc2cpKSA+PSBUVFlfRkxJUEJVRl9TSVpFKSB8fAotCSAgICAoIXNrYl9xdWV1ZV9lbXB0eSgmZGV2LT5kcnZbaW5mby0+aXNkbl9kcml2ZXJdLT5ycHF1ZXVlW2luZm8tPmlzZG5fY2hhbm5lbF0pKSkpIHsKLQkJc2tiID0gYWxsb2Nfc2tiKHN0cmxlbihtc2cpLCBHRlBfQVRPTUlDKTsKKwkvKiB1c2UgcXVldWUgaW5zdGVhZCBvZiBkaXJlY3QsIGlmIG9ubGluZSBhbmQgKi8KKwkvKiBkYXRhIGlzIGluIHF1ZXVlIG9yIGJ1ZmZlciBpcyBmdWxsICovCisJaWYgKChpbmZvLT5vbmxpbmUgJiYgdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBsKSA8IGwpIHx8CisJICAgICghc2tiX3F1ZXVlX2VtcHR5KCZkZXYtPmRydltpbmZvLT5pc2RuX2RyaXZlcl0tPnJwcXVldWVbaW5mby0+aXNkbl9jaGFubmVsXSkpKSB7CisJCXNrYiA9IGFsbG9jX3NrYihsLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFza2IpIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnJlYWRsb2NrLCBmbGFncyk7CiAJCQlyZXR1cm47CiAJCX0KLQkJc3AgPSBza2JfcHV0KHNrYiwgc3RybGVuKG1zZykpOworCQlzcCA9IHNrYl9wdXQoc2tiLCBsKTsKICNpZmRlZiBDT05GSUdfSVNETl9BVURJTwogCQlJU0ROX0FVRElPX1NLQl9ETEVDT1VOVChza2IpID0gMDsKIAkJSVNETl9BVURJT19TS0JfTE9DSyhza2IpID0gMDsKQEAgLTIzOTIsOSArMjM5MCw4IEBACiAJCWlmIChza2IpIHsKIAkJCSpzcCsrID0gYzsKIAkJfSBlbHNlIHsKLQkJCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkKKwkJCWlmKHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgYywgVFRZX05PUk1BTCkgPT0gMCkKIAkJCQlicmVhazsKLQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgYywgMCk7CiAJCX0KIAl9CiAJaWYgKHNrYikgewpAQCAtMjQwMiwxMiArMjM5OSwxMiBAQAogCQlkZXYtPmRydltpbmZvLT5pc2RuX2RyaXZlcl0tPnJjdmNvdW50W2luZm8tPmlzZG5fY2hhbm5lbF0gKz0gc2tiLT5sZW47CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnJlYWRsb2NrLCBmbGFncyk7CiAJCS8qIFNjaGVkdWxlIGRlcXVldWluZyAqLwotCQlpZiAoKGRldi0+bW9kZW1wb2xsKSAmJiAoaW5mby0+cmN2c2NoZWQpKQorCQlpZiAoZGV2LT5tb2RlbXBvbGwgJiYgaW5mby0+cmN2c2NoZWQpCiAJCQlpc2RuX3RpbWVyX2N0cmwoSVNETl9USU1FUl9NT0RFTVJFQUQsIDEpOwogCiAJfSBlbHNlIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+cmVhZGxvY2ssIGZsYWdzKTsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yaywgMSk7CisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vc2MvY29tbWFuZC5jIGIvZHJpdmVycy9pc2RuL3NjL2NvbW1hbmQuYwppbmRleCAxOWYyZmNmLi5iNGIyNDMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vc2MvY29tbWFuZC5jCisrKyBiL2RyaXZlcnMvaXNkbi9zYy9jb21tYW5kLmMKQEAgLTQzLDcgKzQzLDYgQEAKICAgICAgICAgICAgICAgICBSc3BNZXNzYWdlICosIGludCk7CiBleHRlcm4gaW50IHNlbmRtZXNzYWdlKGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQgKik7Ci1leHRlcm4gaW5saW5lIHZvaWQgcHVsbHBob25lKGNoYXIgKiwgY2hhciAqKTsKIAogI2lmZGVmIERFQlVHCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvS2NvbmZpZyBiL2RyaXZlcnMvbWFjaW50b3NoL0tjb25maWcKaW5kZXggYTBlYTQ0Yy4uN2Q0YTBhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvS2NvbmZpZworKysgYi9kcml2ZXJzL21hY2ludG9zaC9LY29uZmlnCkBAIC0xNDksMTQgKzE0OSwxNCBAQAogCiBjb25maWcgVEhFUk1fV0lORFRVTk5FTAogCXRyaXN0YXRlICJTdXBwb3J0IGZvciB0aGVybWFsIG1hbmFnZW1lbnQgb24gV2luZHR1bm5lbCBHNHMiCi0JZGVwZW5kcyBvbiBJMkMgJiYgSTJDX0tFWVdFU1QgJiYgUFBDX1BNQUMgJiYgIVBQQ19QTUFDNjQKKwlkZXBlbmRzIG9uIEkyQyAmJiBJMkNfUE9XRVJNQUMgJiYgUFBDX1BNQUMgJiYgIVBQQ19QTUFDNjQKIAloZWxwCiAJICBUaGlzIGRyaXZlciBwcm92aWRlcyBzb21lIHRoZXJtb3N0YXQgYW5kIGZhbiBjb250cm9sIGZvciB0aGUgZGVza3RvcAogCSAgRzQgIldpbmR0dW5uZWwiCiAKIGNvbmZpZyBUSEVSTV9BRFQ3NDZYCiAJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIHRoZXJtYWwgbWdtbnQgb24gbGFwdG9wcyB3aXRoIEFEVCA3NDZ4IGNoaXBzZXQiCi0JZGVwZW5kcyBvbiBJMkMgJiYgSTJDX0tFWVdFU1QgJiYgUFBDX1BNQUMgJiYgIVBQQ19QTUFDNjQKKwlkZXBlbmRzIG9uIEkyQyAmJiBJMkNfUE9XRVJNQUMgJiYgUFBDX1BNQUMgJiYgIVBQQ19QTUFDNjQKIAloZWxwCiAJICBUaGlzIGRyaXZlciBwcm92aWRlcyBzb21lIHRoZXJtb3N0YXQgYW5kIGZhbiBjb250cm9sIGZvciB0aGUKICAgICAgICAgICBpQm9vayBHNCwgYW5kIHRoZSBBVEkgYmFzZWQgYWx1bWluaXVtIFBvd2VyQm9va3MsIGFsbG93aW5nIHNsaWdobHR5CkBAIC0xNjQsNyArMTY0LDcgQEAKIAogY29uZmlnIFRIRVJNX1BNNzIKIAl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgdGhlcm1hbCBtYW5hZ2VtZW50IG9uIFBvd2VyTWFjIEc1IgotCWRlcGVuZHMgb24gSTJDICYmIEkyQ19LRVlXRVNUICYmIFBQQ19QTUFDNjQKKwlkZXBlbmRzIG9uIEkyQyAmJiBJMkNfUE9XRVJNQUMgJiYgUFBDX1BNQUM2NAogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHRoZXJtb3N0YXQgYW5kIGZhbiBjb250cm9sIGZvciB0aGUgZGVza3RvcAogCSAgRzUgbWFjaGluZXMuIApAQCAtMTc1LDE0ICsxNzUsMTQgQEAKIGNvbmZpZyBXSU5ERkFSTV9QTTgxCiAJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIHRoZXJtYWwgbWFuYWdlbWVudCBvbiBpTWFjIEc1IgogCWRlcGVuZHMgb24gV0lOREZBUk0gJiYgSTJDICYmIENQVV9GUkVRX1BNQUM2NCAmJiBQTUFDX1NNVQotCXNlbGVjdCBJMkNfUE1BQ19TTVUKKwlzZWxlY3QgSTJDX1BPV0VSTUFDCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgdGhlcm1hbCBjb250cm9sIGZvciB0aGUgaU1hY0c1CiAKIGNvbmZpZyBXSU5ERkFSTV9QTTkxCiAJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIHRoZXJtYWwgbWFuYWdlbWVudCBvbiBQb3dlck1hYzksMSIKIAlkZXBlbmRzIG9uIFdJTkRGQVJNICYmIEkyQyAmJiBDUFVfRlJFUV9QTUFDNjQgJiYgUE1BQ19TTVUKLQlzZWxlY3QgSTJDX1BNQUNfU01VCisJc2VsZWN0IEkyQ19QT1dFUk1BQwogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHRoZXJtYWwgY29udHJvbCBmb3IgdGhlIFBvd2VyTWFjOSwxCiAgICAgICAgICAgd2hpY2ggaXMgdGhlIHJlY2VudCAoU01VIGJhc2VkKSBzaW5nbGUgQ1BVIGRlc2t0b3AgRzUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL2FkYi1pb3AuYyBiL2RyaXZlcnMvbWFjaW50b3NoL2FkYi1pb3AuYwppbmRleCA3MWFlYjkxLi5kNTZkNDAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9hZGItaW9wLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvYWRiLWlvcC5jCkBAIC0yMzksNyArMjM5LDcgQEAKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAotCXJlcS0+bmV4dCA9IDA7CisJcmVxLT5uZXh0ID0gTlVMTDsKIAlyZXEtPnNlbnQgPSAwOwogCXJlcS0+Y29tcGxldGUgPSAwOwogCXJlcS0+cmVwbHlfbGVuID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvLWFkYi5jIGIvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW8tYWRiLmMKaW5kZXggY2Y2YTZmMi4uMzE0ZmMwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW8tYWRiLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW8tYWRiLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KIAogc3RydWN0IHByZWcgewogCXVuc2lnbmVkIGNoYXIgcjsKQEAgLTg4LDI0ICs4OSwyNiBAQAogaW50IG1hY2lvX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmFkYnM7CisJc3RydWN0IHJlc291cmNlIHI7CiAKIAlhZGJzID0gZmluZF9jb21wYXRpYmxlX2RldmljZXMoImFkYiIsICJjaHJwLGFkYjAiKTsKIAlpZiAoYWRicyA9PSAwKQogCQlyZXR1cm4gLUVOWElPOwogCiAjaWYgMAotCXsgaW50IGk7CisJeyBpbnQgaSA9IDA7CiAKIAlwcmludGsoIm1hY2lvX2FkYl9pbml0OiBub2RlID0gJXAsIGFkZHJzID0iLCBhZGJzLT5ub2RlKTsKLQlmb3IgKGkgPSAwOyBpIDwgYWRicy0+bl9hZGRyczsgKytpKQotCQlwcmludGsoIiAleCgleCkiLCBhZGJzLT5hZGRyc1tpXS5hZGRyZXNzLCBhZGJzLT5hZGRyc1tpXS5zaXplKTsKKwl3aGlsZSghb2ZfYWRkcmVzc190b19yZXNvdXJjZShhZGJzLCBpLCAmcikpCisJCXByaW50aygiICV4KCV4KSIsIHIuc3RhcnQsIHIuZW5kIC0gci5zdGFydCk7CiAJcHJpbnRrKCIsIGludHJzID0iKTsKIAlmb3IgKGkgPSAwOyBpIDwgYWRicy0+bl9pbnRyczsgKytpKQogCQlwcmludGsoIiAleCIsIGFkYnMtPmludHJzW2ldLmxpbmUpOwogCXByaW50aygiXG4iKTsgfQogI2VuZGlmCi0JCi0JYWRiID0gaW9yZW1hcChhZGJzLT5hZGRycy0+YWRkcmVzcywgc2l6ZW9mKHN0cnVjdCBhZGJfcmVncykpOworCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKGFkYnMsIDAsICZyKSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlhZGIgPSBpb3JlbWFwKHIuc3RhcnQsIHNpemVvZihzdHJ1Y3QgYWRiX3JlZ3MpKTsKIAogCW91dF84KCZhZGItPmN0cmwuciwgMCk7CiAJb3V0XzgoJmFkYi0+aW50ci5yLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX2FzaWMuYyBiL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX2FzaWMuYwppbmRleCAyMjhlMTg1Li5lZDZkMzE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19hc2ljLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fYXNpYy5jCkBAIC0zLDYgKzMsMTMgQEAKICAqIGEgTWFjSU8gQVNJQy4gSW50ZXJmYWNlIHRvIG5ldyBkcml2ZXIgbW9kZWwgbW9zdGx5CiAgKiBzdG9sZW4gZnJvbSB0aGUgUENJIHZlcnNpb24uCiAgKiAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgQmVuLiBIZXJyZW5zY2htaWR0IChiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmcpCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgogICogVE9ETzoKICAqIAogICogIC0gRG9uJ3QgcHJvYmUgYmVsb3cgbWVkaWEgYmF5IGJ5IGRlZmF1bHQsIGJ1dCBpbnN0ZWFkIHByb3ZpZGUKQEAgLTIwNCw2ICsyMTEsOSBAQAogICAgICAgIC5uYW1lCT0gIm1hY2lvIiwKICAgICAgICAubWF0Y2gJPSBtYWNpb19idXNfbWF0Y2gsCiAgICAgICAgLnVldmVudCA9IG1hY2lvX3VldmVudCwKKyAgICAgICAucHJvYmUJPSBtYWNpb19kZXZpY2VfcHJvYmUsCisgICAgICAgLnJlbW92ZQk9IG1hY2lvX2RldmljZV9yZW1vdmUsCisgICAgICAgLnNodXRkb3duID0gbWFjaW9fZGV2aWNlX3NodXRkb3duLAogICAgICAgIC5zdXNwZW5kCT0gbWFjaW9fZGV2aWNlX3N1c3BlbmQsCiAgICAgICAgLnJlc3VtZQk9IG1hY2lvX2RldmljZV9yZXN1bWUsCiAgICAgICAgLmRldl9hdHRycyA9IG1hY2lvX2Rldl9hdHRycywKQEAgLTIxOCwxMiArMjI4LDE0IEBACiAKIAogLyoqCi0gKiBtYWNpb19yZWxlYXNlX2RldiAtIGZyZWUgYSBtYWNpbyBkZXZpY2Ugc3RydWN0dXJlIHdoZW4gYWxsIHVzZXJzIG9mIGl0IGFyZSBmaW5pc2hlZC4KKyAqIG1hY2lvX3JlbGVhc2VfZGV2IC0gZnJlZSBhIG1hY2lvIGRldmljZSBzdHJ1Y3R1cmUgd2hlbiBhbGwgdXNlcnMgb2YgaXQgYXJlCisgKiBmaW5pc2hlZC4KICAqIEBkZXY6IGRldmljZSB0aGF0J3MgYmVlbiBkaXNjb25uZWN0ZWQKICAqCi0gKiBXaWxsIGJlIGNhbGxlZCBvbmx5IGJ5IHRoZSBkZXZpY2UgY29yZSB3aGVuIGFsbCB1c2VycyBvZiB0aGlzIG1hY2lvIGRldmljZSBhcmUKLSAqIGRvbmUuIFRoaXMgY3VycmVudGx5IG1lYW5zIG5ldmVyIGFzIHdlIGRvbid0IGhvdCByZW1vdmUgYW55IG1hY2lvIGRldmljZSB5ZXQsCi0gKiB0aG91Z2ggdGhhdCB3aWxsIGhhcHBlbiB3aXRoIG1lZGlhYmF5IGJhc2VkIGRldmljZXMgaW4gYSBsYXRlciBpbXBsZW1lbnRhdGlvbi4KKyAqIFdpbGwgYmUgY2FsbGVkIG9ubHkgYnkgdGhlIGRldmljZSBjb3JlIHdoZW4gYWxsIHVzZXJzIG9mIHRoaXMgbWFjaW8gZGV2aWNlCisgKiBhcmUgZG9uZS4gVGhpcyBjdXJyZW50bHkgbWVhbnMgbmV2ZXIgYXMgd2UgZG9uJ3QgaG90IHJlbW92ZSBhbnkgbWFjaW8KKyAqIGRldmljZSB5ZXQsIHRob3VnaCB0aGF0IHdpbGwgaGFwcGVuIHdpdGggbWVkaWFiYXkgYmFzZWQgZGV2aWNlcyBpbiBhIGxhdGVyCisgKiBpbXBsZW1lbnRhdGlvbi4KICAqLwogc3RhdGljIHZvaWQgbWFjaW9fcmVsZWFzZV9kZXYoc3RydWN0IGRldmljZSAqZGV2KQogewpAQCAtMjQyLDQ5ICsyNTQsMTE0IEBACiAgKiBJZiB0aGlzIHJvdXRpbmUgcmV0dXJucyBub24tbnVsbCwgdGhlbiB0aGUgcmVzb3VyY2UgaXMgY29tcGxldGVseQogICogc2tpcHBlZC4KICAqLwotc3RhdGljIGludCBtYWNpb19yZXNvdXJjZV9xdWlya3Moc3RydWN0IGRldmljZV9ub2RlICpucCwgc3RydWN0IHJlc291cmNlICpyZXMsIGludCBpbmRleCkKK3N0YXRpYyBpbnQgbWFjaW9fcmVzb3VyY2VfcXVpcmtzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAorCQkJCSBpbnQgaW5kZXgpCiB7CiAJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgewogCQkvKiBHcmFuZCBDZW50cmFsIGhhcyB0b28gbGFyZ2UgcmVzb3VyY2UgMCBvbiBzb21lIG1hY2hpbmVzICovCi0JCWlmIChpbmRleCA9PSAwICYmICFzdHJjbXAobnAtPm5hbWUsICJnYyIpKSB7Ci0JCQlucC0+YWRkcnNbMF0uc2l6ZSA9IDB4MjAwMDA7CisJCWlmIChpbmRleCA9PSAwICYmICFzdHJjbXAobnAtPm5hbWUsICJnYyIpKQogCQkJcmVzLT5lbmQgPSByZXMtPnN0YXJ0ICsgMHgxZmZmZjsKLQkJfQorCiAJCS8qIEFpcnBvcnQgaGFzIGJvZ3VzIHJlc291cmNlIDIgKi8KIAkJaWYgKGluZGV4ID49IDIgJiYgIXN0cmNtcChucC0+bmFtZSwgInJhZGlvIikpCiAJCQlyZXR1cm4gMTsKKworI2lmbmRlZiBDT05GSUdfUFBDNjQKIAkJLyogREJETUFzIG1heSBoYXZlIGJvZ3VzIHNpemVzICovCi0JCWlmICgocmVzLT5zdGFydCAmIDB4MDAwMWYwMDApID09IDB4MDAwMDgwMDApIHsKLQkJCW5wLT5hZGRyc1tpbmRleF0uc2l6ZSA9IDB4MTAwOworCQlpZiAoKHJlcy0+c3RhcnQgJiAweDAwMDFmMDAwKSA9PSAweDAwMDA4MDAwKQogCQkJcmVzLT5lbmQgPSByZXMtPnN0YXJ0ICsgMHhmZjsKLQkJfQotCQkvKiBFU0NDIHBhcmVudCBlYXRzIGNoaWxkIHJlc291cmNlcy4gV2UgY291bGQgaGF2ZSBhZGRlZCBhIGxldmVsIG9mIGhpZXJhcmNoeSwKLQkJICogYnV0IEkgZG9uJ3QgcmVhbGx5IGZlZWwgdGhlIG5lZWQgZm9yIGl0ICovCisjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCisKKwkJLyogRVNDQyBwYXJlbnQgZWF0cyBjaGlsZCByZXNvdXJjZXMuIFdlIGNvdWxkIGhhdmUgYWRkZWQgYQorCQkgKiBsZXZlbCBvZiBoaWVyYXJjaHksIGJ1dCBJIGRvbid0IHJlYWxseSBmZWVsIHRoZSBuZWVkCisJCSAqIGZvciBpdAorCQkgKi8KIAkJaWYgKCFzdHJjbXAobnAtPm5hbWUsICJlc2NjIikpCiAJCQlyZXR1cm4gMTsKKwogCQkvKiBFU0NDIGhhcyBib2d1cyByZXNvdXJjZXMgPj0gMyAqLwotCQlpZiAoaW5kZXggPj0gMyAmJiAhKHN0cmNtcChucC0+bmFtZSwgImNoLWEiKSAmJiBzdHJjbXAobnAtPm5hbWUsICJjaC1iIikpKQorCQlpZiAoaW5kZXggPj0gMyAmJiAhKHN0cmNtcChucC0+bmFtZSwgImNoLWEiKSAmJgorCQkJCSAgICBzdHJjbXAobnAtPm5hbWUsICJjaC1iIikpKQogCQkJcmV0dXJuIDE7CisKIAkJLyogTWVkaWEgYmF5IGhhcyB0b28gbWFueSByZXNvdXJjZXMsIGtlZXAgb25seSBmaXJzdCBvbmUgKi8KIAkJaWYgKGluZGV4ID4gMCAmJiAhc3RyY21wKG5wLT5uYW1lLCAibWVkaWEtYmF5IikpCiAJCQlyZXR1cm4gMTsKKwogCQkvKiBTb21lIG9sZGVyIElERSByZXNvdXJjZXMgaGF2ZSBib2d1cyBzaXplcyAqLwogCQlpZiAoIShzdHJjbXAobnAtPm5hbWUsICJJREUiKSAmJiBzdHJjbXAobnAtPm5hbWUsICJBVEEiKSAmJgogCQkgICAgICBzdHJjbXAobnAtPnR5cGUsICJpZGUiKSAmJiBzdHJjbXAobnAtPnR5cGUsICJhdGEiKSkpIHsKLQkJCWlmIChpbmRleCA9PSAwICYmIG5wLT5hZGRyc1swXS5zaXplID4gMHgxMDAwKSB7Ci0JCQkJbnAtPmFkZHJzWzBdLnNpemUgPSAweDEwMDA7CisJCQlpZiAoaW5kZXggPT0gMCAmJiAocmVzLT5lbmQgLSByZXMtPnN0YXJ0KSA+IDB4ZmZmKQogCQkJCXJlcy0+ZW5kID0gcmVzLT5zdGFydCArIDB4ZmZmOwotCQkJfQotCQkJaWYgKGluZGV4ID09IDEgJiYgbnAtPmFkZHJzWzFdLnNpemUgPiAweDEwMCkgewotCQkJCW5wLT5hZGRyc1sxXS5zaXplID0gMHgxMDA7CisJCQlpZiAoaW5kZXggPT0gMSAmJiAocmVzLT5lbmQgLSByZXMtPnN0YXJ0KSA+IDB4ZmYpCiAJCQkJcmVzLT5lbmQgPSByZXMtPnN0YXJ0ICsgMHhmZjsKLQkJCX0KIAkJfQogCX0KIAlyZXR1cm4gMDsKIH0KIAogCitzdGF0aWMgdm9pZCBtYWNpb19zZXR1cF9pbnRlcnJ1cHRzKHN0cnVjdCBtYWNpb19kZXYgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZmRldi5ub2RlOworCWludCBpLGo7CisKKwkvKiBGb3Igbm93LCB3ZSB1c2UgcHJlLXBhcnNlZCBlbnRyaWVzIGluIHRoZSBkZXZpY2UtdHJlZSBmb3IKKwkgKiBpbnRlcnJ1cHQgcm91dGluZyBhbmQgYWRkcmVzc2VzLCBidXQgd2Ugc2hvdWxkIGNoYW5nZSB0aGF0CisJICogdG8gZHluYW1pY2FsbHkgcGFyc2VkIGVudHJpZXMgYW5kIHNvIGdldCByaWQgb2YgbW9zdCBvZiB0aGUKKwkgKiBjbHV0dGVyIGluIHN0cnVjdCBkZXZpY2Vfbm9kZQorCSAqLworCWZvciAoaSA9IGogPSAwOyBpIDwgbnAtPm5faW50cnM7IGkrKykgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZkZXYtPmludGVycnVwdFtqXTsKKworCQlpZiAoaiA+PSBNQUNJT19ERVZfQ09VTlRfSVJRUykKKwkJCWJyZWFrOworCQlyZXMtPnN0YXJ0ID0gbnAtPmludHJzW2ldLmxpbmU7CisJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX0lPOworCQlpZiAobnAtPmludHJzW2pdLnNlbnNlKQorCQkJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX0lSUV9MT1dMRVZFTDsKKwkJZWxzZQorCQkJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX0lSUV9ISUdIRURHRTsKKwkJcmVzLT5uYW1lID0gZGV2LT5vZmRldi5kZXYuYnVzX2lkOworCQlpZiAobWFjaW9fcmVzb3VyY2VfcXVpcmtzKG5wLCByZXMsIGkpKQorCQkJbWVtc2V0KHJlcywgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOworCQllbHNlCisJCQlqKys7CisJfQorCWRldi0+bl9pbnRlcnJ1cHRzID0gajsKK30KKworc3RhdGljIHZvaWQgbWFjaW9fc2V0dXBfcmVzb3VyY2VzKHN0cnVjdCBtYWNpb19kZXYgKmRldiwKKwkJCQkgIHN0cnVjdCByZXNvdXJjZSAqcGFyZW50X3JlcykKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZmRldi5ub2RlOworCXN0cnVjdCByZXNvdXJjZSByOworCWludCBpbmRleDsKKworCWZvciAoaW5kZXggPSAwOyBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCBpbmRleCwgJnIpID09IDA7IGluZGV4KyspIHsKKwkJc3RydWN0IHJlc291cmNlICpyZXMgPSAmZGV2LT5yZXNvdXJjZVtpbmRleF07CisJCWlmIChpbmRleCA+PSBNQUNJT19ERVZfQ09VTlRfUkVTT1VSQ0VTKQorCQkJYnJlYWs7CisJCSpyZXMgPSByOworCQlyZXMtPm5hbWUgPSBkZXYtPm9mZGV2LmRldi5idXNfaWQ7CisKKwkJaWYgKG1hY2lvX3Jlc291cmNlX3F1aXJrcyhucCwgcmVzLCBpbmRleCkpIHsKKwkJCW1lbXNldChyZXMsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIEN1cnJlbnRseSwgd2UgY29uc2lkZXIgZmFpbHVyZSBhcyBoYXJtbGVzcywgdGhpcyBtYXkKKwkJICogY2hhbmdlIGluIHRoZSBmdXR1cmUsIG9uY2UgSSd2ZSBmb3VuZCBhbGwgdGhlIGRldmljZQorCQkgKiB0cmVlIGJ1Z3MgaW4gb2xkZXIgbWFjaGluZXMgJiB3b3JrZWQgYXJvdW5kIHRoZW0KKwkJICovCisJCWlmIChpbnNlcnRfcmVzb3VyY2UocGFyZW50X3JlcywgcmVzKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgcmVxdWVzdCByZXNvdXJjZSAiCisJCQkgICAgICAgIiVkIGZvciBNYWNJTyBkZXZpY2UgJXNcbiIsCisJCQkgICAgICAgaW5kZXgsIGRldi0+b2ZkZXYuZGV2LmJ1c19pZCk7CisJCX0KKwl9CisJZGV2LT5uX3Jlc291cmNlcyA9IGluZGV4OworfQorCiAvKioKICAqIG1hY2lvX2FkZF9vbmVfZGV2aWNlIC0gQWRkIG9uZSBkZXZpY2UgZnJvbSBPRiBub2RlIHRvIHRoZSBkZXZpY2UgdHJlZQogICogQGNoaXA6IHBvaW50ZXIgdG8gdGhlIG1hY2lvX2NoaXAgaG9sZGluZyB0aGUgZGV2aWNlCkBAIC0yOTQsMTIgKzM3MSwxMyBAQAogICogV2hlbiBtZWRpYS1iYXkgaXMgY2hhbmdlZCB0byBob3Rzd2FwIGRyaXZlcnMsIHRoaXMgZnVuY3Rpb24gd2lsbAogICogYmUgZXhwb3NlZCB0byB0aGUgYmF5IGRyaXZlciBzb21lIHdheS4uLgogICovCi1zdGF0aWMgc3RydWN0IG1hY2lvX2RldiAqIG1hY2lvX2FkZF9vbmVfZGV2aWNlKHN0cnVjdCBtYWNpb19jaGlwICpjaGlwLCBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCi0JCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBzdHJ1Y3QgbWFjaW9fZGV2ICppbl9iYXksCitzdGF0aWMgc3RydWN0IG1hY2lvX2RldiAqIG1hY2lvX2FkZF9vbmVfZGV2aWNlKHN0cnVjdCBtYWNpb19jaGlwICpjaGlwLAorCQkJCQkgICAgICAgc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkJCQkgICAgICAgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJICAgICAgIHN0cnVjdCBtYWNpb19kZXYgKmluX2JheSwKIAkJCQkJICAgICAgIHN0cnVjdCByZXNvdXJjZSAqcGFyZW50X3JlcykKIHsKIAlzdHJ1Y3QgbWFjaW9fZGV2ICpkZXY7Ci0JaW50IGksIGo7CiAJdTMyICpyZWc7CiAJCiAJaWYgKG5wID09IE5VTEwpCkBAIC0zMjYsNyArNDA0LDggQEAKIAogCS8qIE1hY0lPIGl0c2VsZiBoYXMgYSBkaWZmZXJlbnQgcmVnLCB3ZSB1c2UgaXQncyBQQ0kgYmFzZSAqLwogCWlmIChucCA9PSBjaGlwLT5vZl9ub2RlKSB7Ci0JCXNwcmludGYoZGV2LT5vZmRldi5kZXYuYnVzX2lkLCAiJTFkLiUwOGx4OiUuKnMiLCBjaGlwLT5sYnVzLmluZGV4LAorCQlzcHJpbnRmKGRldi0+b2ZkZXYuZGV2LmJ1c19pZCwgIiUxZC4lMDhseDolLipzIiwKKwkJCWNoaXAtPmxidXMuaW5kZXgsCiAjaWZkZWYgQ09ORklHX1BDSQogCQkJcGNpX3Jlc291cmNlX3N0YXJ0KGNoaXAtPmxidXMucGRldiwgMCksCiAjZWxzZQpAQCAtMzM1LDU3ICs0MTQsMTYgQEAKIAkJCU1BWF9OT0RFX05BTUVfU0laRSwgbnAtPm5hbWUpOwogCX0gZWxzZSB7CiAJCXJlZyA9ICh1MzIgKilnZXRfcHJvcGVydHkobnAsICJyZWciLCBOVUxMKTsKLQkJc3ByaW50ZihkZXYtPm9mZGV2LmRldi5idXNfaWQsICIlMWQuJTA4eDolLipzIiwgY2hpcC0+bGJ1cy5pbmRleCwKKwkJc3ByaW50ZihkZXYtPm9mZGV2LmRldi5idXNfaWQsICIlMWQuJTA4eDolLipzIiwKKwkJCWNoaXAtPmxidXMuaW5kZXgsCiAJCQlyZWcgPyAqcmVnIDogMCwgTUFYX05PREVfTkFNRV9TSVpFLCBucC0+bmFtZSk7CiAJfQogCi0JLyogRm9yIG5vdywgd2UgdXNlIHByZS1wYXJzZWQgZW50cmllcyBpbiB0aGUgZGV2aWNlLXRyZWUgZm9yCi0JICogaW50ZXJydXB0IHJvdXRpbmcgYW5kIGFkZHJlc3NlcywgYnV0IHdlIHNob3VsZCBjaGFuZ2UgdGhhdAotCSAqIHRvIGR5bmFtaWNhbGx5IHBhcnNlZCBlbnRyaWVzIGFuZCBzbyBnZXQgcmlkIG9mIG1vc3Qgb2YgdGhlCi0JICogY2x1dHRlciBpbiBzdHJ1Y3QgZGV2aWNlX25vZGUKLQkgKi8KLQlmb3IgKGkgPSBqID0gMDsgaSA8IG5wLT5uX2ludHJzOyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpyZXMgPSAmZGV2LT5pbnRlcnJ1cHRbal07CisJLyogU2V0dXAgaW50ZXJydXB0cyAmIHJlc291cmNlcyAqLworCW1hY2lvX3NldHVwX2ludGVycnVwdHMoZGV2KTsKKwltYWNpb19zZXR1cF9yZXNvdXJjZXMoZGV2LCBwYXJlbnRfcmVzKTsKIAotCQlpZiAoaiA+PSBNQUNJT19ERVZfQ09VTlRfSVJRUykKLQkJCWJyZWFrOwotCQlyZXMtPnN0YXJ0ID0gbnAtPmludHJzW2ldLmxpbmU7Ci0JCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX0lPOwotCQlpZiAobnAtPmludHJzW2pdLnNlbnNlKQotCQkJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX0lSUV9MT1dMRVZFTDsKLQkJZWxzZQotCQkJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX0lSUV9ISUdIRURHRTsKLQkJcmVzLT5uYW1lID0gZGV2LT5vZmRldi5kZXYuYnVzX2lkOwotCQlpZiAobWFjaW9fcmVzb3VyY2VfcXVpcmtzKG5wLCByZXMsIGkpKQotCQkJbWVtc2V0KHJlcywgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwotCQllbHNlCi0JCQlqKys7Ci0JfQotCWRldi0+bl9pbnRlcnJ1cHRzID0gajsKLQlmb3IgKGkgPSBqID0gMDsgaSA8IG5wLT5uX2FkZHJzOyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpyZXMgPSAmZGV2LT5yZXNvdXJjZVtqXTsKLQkJCi0JCWlmIChqID49IE1BQ0lPX0RFVl9DT1VOVF9SRVNPVVJDRVMpCi0JCQlicmVhazsKLQkJcmVzLT5zdGFydCA9IG5wLT5hZGRyc1tpXS5hZGRyZXNzOwotCQlyZXMtPmVuZCA9IG5wLT5hZGRyc1tpXS5hZGRyZXNzICsgbnAtPmFkZHJzW2ldLnNpemUgLSAxOwotCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9NRU07Ci0JCXJlcy0+bmFtZSA9IGRldi0+b2ZkZXYuZGV2LmJ1c19pZDsKLQkJaWYgKG1hY2lvX3Jlc291cmNlX3F1aXJrcyhucCwgcmVzLCBpKSkKLQkJCW1lbXNldChyZXMsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKLQkJZWxzZSB7Ci0JCQlqKys7Ci0JCQkvKiBDdXJyZW50bHksIHdlIGNvbnNpZGVyIGZhaWx1cmUgYXMgaGFybWxlc3MsIHRoaXMgbWF5Ci0JCQkgKiBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwgb25jZSBJJ3ZlIGZvdW5kIGFsbCB0aGUgZGV2aWNlCi0JCQkgKiB0cmVlIGJ1Z3MgaW4gb2xkZXIgbWFjaGluZXMgJiB3b3JrZWQgYXJvdW5kIHRoZW0KLQkJCSAqLwotCQkJaWYgKGluc2VydF9yZXNvdXJjZShwYXJlbnRfcmVzLCByZXMpKQotICAgICAgIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCByZXF1ZXN0IHJlc291cmNlICVkIGZvciBNYWNJTyIKLQkJCQkgICAgICAgIiBkZXZpY2UgJXNcbiIsIGksIGRldi0+b2ZkZXYuZGV2LmJ1c19pZCk7Ci0JCX0KLQl9Ci0JZGV2LT5uX3Jlc291cmNlcyA9IGo7Ci0KKwkvKiBSZWdpc3RlciB3aXRoIGNvcmUgKi8KIAlpZiAob2ZfZGV2aWNlX3JlZ2lzdGVyKCZkZXYtPm9mZGV2KSAhPSAwKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHIm1hY2lvOiBkZXZpY2UgcmVnaXN0cmF0aW9uIGVycm9yIGZvciAlcyFcbiIsCiAJCSAgICAgICBkZXYtPm9mZGV2LmRldi5idXNfaWQpOwpAQCAtNDQyLDM2ICs0ODAsNDIgQEAKIAogCS8qIEZpcnN0IHNjYW4gMXN0IGxldmVsICovCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2dldF9uZXh0X2NoaWxkKHBub2RlLCBucCkpICE9IE5VTEw7KSB7Ci0JCWlmICghbWFjaW9fc2tpcF9kZXZpY2UobnApKSB7Ci0JCQlvZl9ub2RlX2dldChucCk7Ci0JCQltZGV2ID0gbWFjaW9fYWRkX29uZV9kZXZpY2UoY2hpcCwgJnJkZXYtPm9mZGV2LmRldiwgbnAsIE5VTEwsIHJvb3RfcmVzKTsKLQkJCWlmIChtZGV2ID09IE5VTEwpCi0JCQkJb2Zfbm9kZV9wdXQobnApOwotCQkJZWxzZSBpZiAoc3RybmNtcChucC0+bmFtZSwgIm1lZGlhLWJheSIsIDkpID09IDApCi0JCQkJbWJkZXYgPSBtZGV2OwotCQkJZWxzZSBpZiAoc3RybmNtcChucC0+bmFtZSwgImVzY2MiLCA0KSA9PSAwKQotCQkJCXNkZXYgPSBtZGV2OwotCQl9CisJCWlmIChtYWNpb19za2lwX2RldmljZShucCkpCisJCQljb250aW51ZTsKKwkJb2Zfbm9kZV9nZXQobnApOworCQltZGV2ID0gbWFjaW9fYWRkX29uZV9kZXZpY2UoY2hpcCwgJnJkZXYtPm9mZGV2LmRldiwgbnAsIE5VTEwsCisJCQkJCSAgICByb290X3Jlcyk7CisJCWlmIChtZGV2ID09IE5VTEwpCisJCQlvZl9ub2RlX3B1dChucCk7CisJCWVsc2UgaWYgKHN0cm5jbXAobnAtPm5hbWUsICJtZWRpYS1iYXkiLCA5KSA9PSAwKQorCQkJbWJkZXYgPSBtZGV2OworCQllbHNlIGlmIChzdHJuY21wKG5wLT5uYW1lLCAiZXNjYyIsIDQpID09IDApCisJCQlzZGV2ID0gbWRldjsKIAl9CiAKIAkvKiBBZGQgbWVkaWEgYmF5IGRldmljZXMgaWYgYW55ICovCiAJaWYgKG1iZGV2KQotCQlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZ2V0X25leHRfY2hpbGQobWJkZXYtPm9mZGV2Lm5vZGUsIG5wKSkgIT0gTlVMTDspCi0JCQlpZiAoIW1hY2lvX3NraXBfZGV2aWNlKG5wKSkgewotCQkJCW9mX25vZGVfZ2V0KG5wKTsKLQkJCQlpZiAobWFjaW9fYWRkX29uZV9kZXZpY2UoY2hpcCwgJm1iZGV2LT5vZmRldi5kZXYsIG5wLCBtYmRldiwKLQkJCQkJCQkgcm9vdF9yZXMpID09IE5VTEwpCi0JCQkJCW9mX25vZGVfcHV0KG5wKTsKLQkJCX0KKwkJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2dldF9uZXh0X2NoaWxkKG1iZGV2LT5vZmRldi5ub2RlLCBucCkpCisJCQkgICAgICE9IE5VTEw7KSB7CisJCQlpZiAobWFjaW9fc2tpcF9kZXZpY2UobnApKQorCQkJCWNvbnRpbnVlOworCQkJb2Zfbm9kZV9nZXQobnApOworCQkJaWYgKG1hY2lvX2FkZF9vbmVfZGV2aWNlKGNoaXAsICZtYmRldi0+b2ZkZXYuZGV2LCBucCwKKwkJCQkJCSBtYmRldiwgIHJvb3RfcmVzKSA9PSBOVUxMKQorCQkJCW9mX25vZGVfcHV0KG5wKTsKKwkJfQorCiAJLyogQWRkIHNlcmlhbCBwb3J0cyBpZiBhbnkgKi8KIAlpZiAoc2RldikgewotCQlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZ2V0X25leHRfY2hpbGQoc2Rldi0+b2ZkZXYubm9kZSwgbnApKSAhPSBOVUxMOykKLQkJCWlmICghbWFjaW9fc2tpcF9kZXZpY2UobnApKSB7Ci0JCQkJb2Zfbm9kZV9nZXQobnApOwotCQkJCWlmIChtYWNpb19hZGRfb25lX2RldmljZShjaGlwLCAmc2Rldi0+b2ZkZXYuZGV2LCBucCwgTlVMTCwKLQkJCQkJCQkgcm9vdF9yZXMpID09IE5VTEwpCi0JCQkJCW9mX25vZGVfcHV0KG5wKTsKLQkJCX0KKwkJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2dldF9uZXh0X2NoaWxkKHNkZXYtPm9mZGV2Lm5vZGUsIG5wKSkKKwkJCSAgICAgIT0gTlVMTDspIHsKKwkJCWlmIChtYWNpb19za2lwX2RldmljZShucCkpCisJCQkJY29udGludWU7CisJCQlvZl9ub2RlX2dldChucCk7CisJCQlpZiAobWFjaW9fYWRkX29uZV9kZXZpY2UoY2hpcCwgJnNkZXYtPm9mZGV2LmRldiwgbnAsCisJCQkJCQkgTlVMTCwgcm9vdF9yZXMpID09IE5VTEwpCisJCQkJb2Zfbm9kZV9wdXQobnApOworCQl9CiAJfQogfQogCkBAIC00ODcsOSArNTMxLDYgQEAKIAkvKiBpbml0aWFsaXplIGNvbW1vbiBkcml2ZXIgZmllbGRzICovCiAJZHJ2LT5kcml2ZXIubmFtZSA9IGRydi0+bmFtZTsKIAlkcnYtPmRyaXZlci5idXMgPSAmbWFjaW9fYnVzX3R5cGU7Ci0JZHJ2LT5kcml2ZXIucHJvYmUgPSBtYWNpb19kZXZpY2VfcHJvYmU7Ci0JZHJ2LT5kcml2ZXIucmVtb3ZlID0gbWFjaW9fZGV2aWNlX3JlbW92ZTsKLQlkcnYtPmRyaXZlci5zaHV0ZG93biA9IG1hY2lvX2RldmljZV9zaHV0ZG93bjsKIAogCS8qIHJlZ2lzdGVyIHdpdGggY29yZSAqLwogCWNvdW50ID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CkBAIC01MTksNyArNTYwLDggQEAKICAqCVJldHVybnMgMCBvbiBzdWNjZXNzLCBvciAlRUJVU1kgb24gZXJyb3IuICBBIHdhcm5pbmcKICAqCW1lc3NhZ2UgaXMgYWxzbyBwcmludGVkIG9uIGZhaWx1cmUuCiAgKi8KLWludCBtYWNpb19yZXF1ZXN0X3Jlc291cmNlKHN0cnVjdCBtYWNpb19kZXYgKmRldiwgaW50IHJlc291cmNlX25vLCBjb25zdCBjaGFyICpuYW1lKQoraW50IG1hY2lvX3JlcXVlc3RfcmVzb3VyY2Uoc3RydWN0IG1hY2lvX2RldiAqZGV2LCBpbnQgcmVzb3VyY2Vfbm8sCisJCQkgICBjb25zdCBjaGFyICpuYW1lKQogewogCWlmIChtYWNpb19yZXNvdXJjZV9sZW4oZGV2LCByZXNvdXJjZV9ubykgPT0gMCkKIAkJcmV0dXJuIDA7CkBAIC02MDYsMjAgKzY0OCwyMCBAQAogCWlmIChlbnQtPnZlbmRvciAhPSBQQ0lfVkVORE9SX0lEX0FQUExFKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCS8qIE5vdGUgcmVnYXJkaW5nIHJlZmNvdW50aW5nOiBXZSBhc3N1bWUgcGNpX2RldmljZV90b19PRl9ub2RlKCkgaXMgcG9ydGVkCi0JICogdG8gbmV3IE9GIEFQSXMgYW5kIHJldHVybnMgYSBub2RlIHdpdGggcmVmY291bnQgaW5jcmVtZW50ZWQuIFRoaXMgaXNuJ3QKLQkgKiB0aGUgY2FzZSB0b2RheSwgYnV0IG9uIHRoZSBvdGhlciBoYW5kIHBwYzMyIGRvZXNuJ3QgZG8gcmVmY291bnRpbmcuIFRoaXMKLQkgKiB3aWxsIGhhdmUgdG8gYmUgZml4ZWQgd2hlbiBnb2luZyB0byBwcGM2NC4gLS1CZW5ILgorCS8qIE5vdGUgcmVnYXJkaW5nIHJlZmNvdW50aW5nOiBXZSBhc3N1bWUgcGNpX2RldmljZV90b19PRl9ub2RlKCkgaXMKKwkgKiBwb3J0ZWQgdG8gbmV3IE9GIEFQSXMgYW5kIHJldHVybnMgYSBub2RlIHdpdGggcmVmY291bnQgaW5jcmVtZW50ZWQuCiAJICovCiAJbnAgPSBwY2lfZGV2aWNlX3RvX09GX25vZGUocGRldik7CiAJaWYgKG5wID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCi0JLyogVGhpcyBhc3N1bXB0aW9uIGlzIHdyb25nLCBmaXggdGhhdCBoZXJlIGZvciBub3cgdW50aWwgSSBmaXggdGhlIGFyY2ggKi8KKwkvKiBUaGUgYWJvdmUgYXNzdW1wdGlvbiBpcyB3cm9uZyAhISEKKwkgKiBmaXggdGhhdCBoZXJlIGZvciBub3cgdW50aWwgSSBmaXggdGhlIGFyY2ggY29kZQorCSAqLwogCW9mX25vZGVfZ2V0KG5wKTsKIAotCS8qIFdlIGFsc28gYXNzdW1lIHRoYXQgcG1hY19mZWF0dXJlIHdpbGwgaGF2ZSBkb25lIGEgZ2V0KCkgb24gbm9kZXMgc3RvcmVkCi0JICogaW4gdGhlIG1hY2lvIGNoaXBzIGFycmF5CisJLyogV2UgYWxzbyBhc3N1bWUgdGhhdCBwbWFjX2ZlYXR1cmUgd2lsbCBoYXZlIGRvbmUgYSBnZXQoKSBvbiBub2RlcworCSAqIHN0b3JlZCBpbiB0aGUgbWFjaW8gY2hpcHMgYXJyYXkKIAkgKi8KIAljaGlwID0gbWFjaW9fZmluZChucCwgbWFjaW9fdW5rbm93bik7CiAgICAgICAgCW9mX25vZGVfcHV0KG5wKTsKQEAgLTYzOSw5ICs2ODEsOSBAQAogCiAJLyoKIAkgKiBIQUNLIEFMRVJUOiBUaGUgV2FsbFN0cmVldCBQb3dlckJvb2sgYW5kIHNvbWUgT0hhcmUgYmFzZWQgbWFjaGluZXMKLQkgKiBoYXZlIDIgbWFjaW8gQVNJQ3MuIEkgbXVzdCBwcm9iZSB0aGUgIm1haW4iIG9uZSBmaXJzdCBvciBJREUgb3JkZXJpbmcKLQkgKiB3aWxsIGJlIGluY29ycmVjdC4gU28gSSBwdXQgb24gImhvbGQiIHRoZSBzZWNvbmQgb25lIHNpbmNlIGl0IHNlZW0gdG8KLQkgKiBhcHBlYXIgZmlyc3Qgb24gUENJCisJICogaGF2ZSAyIG1hY2lvIEFTSUNzLiBJIG11c3QgcHJvYmUgdGhlICJtYWluIiBvbmUgZmlyc3Qgb3IgSURFCisJICogb3JkZXJpbmcgd2lsbCBiZSBpbmNvcnJlY3QuIFNvIEkgcHV0IG9uICJob2xkIiB0aGUgc2Vjb25kIG9uZSBzaW5jZQorCSAqIGl0IHNlZW0gdG8gYXBwZWFyIGZpcnN0IG9uIFBDSQogCSAqLwogCWlmIChjaGlwLT50eXBlID09IG1hY2lvX2dhdHdpY2sgfHwgY2hpcC0+dHlwZSA9PSBtYWNpb19vaGFyZUlJKQogCQlpZiAobWFjaW9fY2hpcHNbMF0ubGJ1cy5wZGV2ID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL21lZGlhYmF5LmMgYi9kcml2ZXJzL21hY2ludG9zaC9tZWRpYWJheS5jCmluZGV4IGI4NTZiYjYuLjhkYmYyODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL21lZGlhYmF5LmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvbWVkaWFiYXkuYwpAQCAtNjQ3LDYgKzY0Nyw3IEBACiAJc3RydWN0IG1lZGlhX2JheV9pbmZvKiBiYXk7CiAJdTMyIF9faW9tZW0gKnJlZ2Jhc2U7CiAJc3RydWN0IGRldmljZV9ub2RlICpvZm5vZGU7CisJdW5zaWduZWQgbG9uZyBiYXNlOwogCWludCBpOwogCiAJb2Zub2RlID0gbWRldi0+b2ZkZXYubm9kZTsKQEAgLTY1NiwxMCArNjU3LDExIEBACiAJaWYgKG1hY2lvX3JlcXVlc3RfcmVzb3VyY2VzKG1kZXYsICJtZWRpYS1iYXkiKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAkvKiBNZWRpYSBiYXkgcmVnaXN0ZXJzIGFyZSBsb2NhdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICAgICAgICAqIG1hYy1pbyBjaGlwLCB3ZSBnZXQgdGhlIHBhcmVudCBhZGRyZXNzIGZvciBub3cgKGhybS4uLikKKyAgICAgICAgICogbWFjLWlvIGNoaXAsIGZvciBub3csIHdlIHRyaWNrIGFuZCBhbGlnbiBkb3duIHRoZSBmaXJzdAorCSAqIHJlc291cmNlIHBhc3NlZCBpbgogICAgICAgICAgKi8KLQlyZWdiYXNlID0gKHUzMiBfX2lvbWVtICopCi0JCWlvcmVtYXAob2Zub2RlLT5wYXJlbnQtPmFkZHJzWzBdLmFkZHJlc3MsIDB4MTAwKTsKKwliYXNlID0gbWFjaW9fcmVzb3VyY2Vfc3RhcnQobWRldiwgMCkgJiAweGZmZmYwMDAwdTsKKwlyZWdiYXNlID0gKHUzMiBfX2lvbWVtICopaW9yZW1hcChiYXNlLCAweDEwMCk7CiAJaWYgKHJlZ2Jhc2UgPT0gTlVMTCkgewogCQltYWNpb19yZWxlYXNlX3Jlc291cmNlcyhtZGV2KTsKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9zbXUuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3NtdS5jCmluZGV4IGU4Mzc4MjcuLmRiMmFlNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3NtdS5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3NtdS5jCkBAIC01Myw3ICs1Myw3IEBACiAjdW5kZWYgREVCVUdfU01VCiAKICNpZmRlZiBERUJVR19TTVUKLSNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pIGRvIHsgdWRiZ19wcmludGYoS0VSTl9ERUJVRyBmbXQgLCAjI2FyZ3MpOyB9IHdoaWxlICgwKQorI2RlZmluZSBEUFJJTlRLKGZtdCwgYXJncy4uLikgZG8geyBwcmludGsoS0VSTl9ERUJVRyBmbXQgLCAjI2FyZ3MpOyB9IHdoaWxlICgwKQogI2Vsc2UKICNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pIGRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgpAQCAtOTQsNiArOTQsOCBAQAogc3RhdGljIHN0cnVjdCBzbXVfZGV2aWNlCSpzbXU7CiBzdGF0aWMgREVDTEFSRV9NVVRFWChzbXVfcGFydF9hY2Nlc3MpOwogCitzdGF0aWMgdm9pZCBzbXVfaTJjX3JldHJ5KHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKIC8qCiAgKiBTTVUgZHJpdmVyIGxvdyBsZXZlbCBzdHVmZgogICovCkBAIC00NjksNyArNDcxLDYgQEAKIAlzbXUtPm9mX25vZGUgPSBucDsKIAlzbXUtPmRiX2lycSA9IE5PX0lSUTsKIAlzbXUtPm1zZ19pcnEgPSBOT19JUlE7Ci0JaW5pdF90aW1lcigmc211LT5pMmNfdGltZXIpOwogCiAJLyogc211X2NtZGJ1Zl9hYnMgaXMgaW4gdGhlIGxvdyAyRyBvZiBSQU0sIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYQogCSAqIDMyIGJpdHMgdmFsdWUgc2FmZWx5CkBAIC01NDQsNiArNTQ1LDEwIEBACiAJaWYgKCFzbXUpCiAJCXJldHVybiAwOwogCisJaW5pdF90aW1lcigmc211LT5pMmNfdGltZXIpOworCXNtdS0+aTJjX3RpbWVyLmZ1bmN0aW9uID0gc211X2kyY19yZXRyeTsKKwlzbXUtPmkyY190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpc211OworCiAJLyoKIAkgKiBUcnkgdG8gcmVxdWVzdCB0aGUgaW50ZXJydXB0cwogCSAqLwpAQCAtNTcwLDcgKzU3NSwxMCBAQAogCiAJcmV0dXJuIDA7CiB9Ci1hcmNoX2luaXRjYWxsKHNtdV9sYXRlX2luaXQpOworLyogVGhpcyBoYXMgdG8gYmUgYmVmb3JlIGFyY2hfaW5pdGNhbGwgYXMgdGhlIGxvdyBpMmMgc3R1ZmYgcmVsaWVzIG9uIHRoZQorICogYWJvdmUgaGF2aW5nIGJlZW4gZG9uZSBiZWZvcmUgd2UgcmVhY2ggYXJjaF9pbml0Y2FsbHMKKyAqLworY29yZV9pbml0Y2FsbChzbXVfbGF0ZV9pbml0KTsKIAogLyoKICAqIHN5c2ZzIHZpc2liaWxpdHkKQEAgLTU4MCwyMCArNTg4LDEwIEBACiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKIAotCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9nZXRfbmV4dF9jaGlsZChzbXUtPm9mX25vZGUsIG5wKSkgIT0gTlVMTDspIHsKLQkJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKG5wLCAic211LWkyYyIpKSB7Ci0JCQljaGFyIG5hbWVbMzJdOwotCQkJdTMyICpyZWcgPSAodTMyICopZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgTlVMTCk7Ci0KLQkJCWlmIChyZWcgPT0gTlVMTCkKLQkJCQljb250aW51ZTsKLQkJCXNwcmludGYobmFtZSwgInNtdS1pMmMtJTAyeCIsICpyZWcpOwotCQkJb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShucCwgbmFtZSwgJnNtdS0+b2ZfZGV2LT5kZXYpOwotCQl9CisJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2dldF9uZXh0X2NoaWxkKHNtdS0+b2Zfbm9kZSwgbnApKSAhPSBOVUxMOykKIAkJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKG5wLCAic211LXNlbnNvcnMiKSkKLQkJCW9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUobnAsICJzbXUtc2Vuc29ycyIsICZzbXUtPm9mX2Rldi0+ZGV2KTsKLQl9Ci0KKwkJCW9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUobnAsICJzbXUtc2Vuc29ycyIsCisJCQkJCQkgICZzbXUtPm9mX2Rldi0+ZGV2KTsKIH0KIAogc3RhdGljIERFQ0xBUkVfV09SSyhzbXVfZXhwb3NlX2NoaWxkc193b3JrLCBzbXVfZXhwb3NlX2NoaWxkcywgTlVMTCk7CkBAIC03MTIsMTMgKzcxMCwxMyBAQAogCiBzdGF0aWMgdm9pZCBzbXVfaTJjX3JldHJ5KHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3Qgc211X2kyY19jbWQJKmNtZCA9IChzdHJ1Y3Qgc211X2kyY19jbWQgKilkYXRhOworCXN0cnVjdCBzbXVfaTJjX2NtZAkqY21kID0gc211LT5jbWRfaTJjX2N1cjsKIAogCURQUklOVEsoIlNNVTogaTJjIGZhaWx1cmUsIHJlcXVldWluZy4uLlxuIik7CiAKIAkvKiByZXF1ZXVlIGNvbW1hbmQgc2ltcGx5IGJ5IHJlc2V0dGluZyByZXBseV9sZW4gKi8KIAljbWQtPnBkYXRhWzBdID0gMHhmZjsKLQljbWQtPnNjbWQucmVwbHlfbGVuID0gMHgxMDsKKwljbWQtPnNjbWQucmVwbHlfbGVuID0gc2l6ZW9mKGNtZC0+cGRhdGEpOwogCXNtdV9xdWV1ZV9jbWQoJmNtZC0+c2NtZCk7CiB9CiAKQEAgLTc0NywxMCArNzQ1LDggQEAKIAkgKi8KIAlpZiAoZmFpbCAmJiAtLWNtZC0+cmV0cmllcyA+IDApIHsKIAkJRFBSSU5USygiU01VOiBpMmMgZmFpbHVyZSwgc3RhcnRpbmcgdGltZXIuLi5cbiIpOwotCQlzbXUtPmkyY190aW1lci5mdW5jdGlvbiA9IHNtdV9pMmNfcmV0cnk7Ci0JCXNtdS0+aTJjX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyljbWQ7Ci0JCXNtdS0+aTJjX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1KTsKLQkJYWRkX3RpbWVyKCZzbXUtPmkyY190aW1lcik7CisJCUJVR19PTihjbWQgIT0gc211LT5jbWRfaTJjX2N1cik7CisJCW1vZF90aW1lcigmc211LT5pMmNfdGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUpKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNzY0LDcgKzc2MCw3IEBACiAKIAkvKiBPaywgaW5pdGlhbCBjb21tYW5kIGNvbXBsZXRlLCBub3cgcG9sbCBzdGF0dXMgKi8KIAlzY21kLT5yZXBseV9idWYgPSBjbWQtPnBkYXRhOwotCXNjbWQtPnJlcGx5X2xlbiA9IDB4MTA7CisJc2NtZC0+cmVwbHlfbGVuID0gc2l6ZW9mKGNtZC0+cGRhdGEpOwogCXNjbWQtPmRhdGFfYnVmID0gY21kLT5wZGF0YTsKIAlzY21kLT5kYXRhX2xlbiA9IDE7CiAJY21kLT5wZGF0YVswXSA9IDA7CkBAIC03ODYsNyArNzgyLDcgQEAKIAljbWQtPnNjbWQuZG9uZSA9IHNtdV9pMmNfbG93X2NvbXBsZXRpb247CiAJY21kLT5zY21kLm1pc2MgPSBjbWQ7CiAJY21kLT5zY21kLnJlcGx5X2J1ZiA9IGNtZC0+cGRhdGE7Ci0JY21kLT5zY21kLnJlcGx5X2xlbiA9IDB4MTA7CisJY21kLT5zY21kLnJlcGx5X2xlbiA9IHNpemVvZihjbWQtPnBkYXRhKTsKIAljbWQtPnNjbWQuZGF0YV9idWYgPSAodTggKikoY2hhciAqKSZjbWQtPmluZm87CiAJY21kLT5zY21kLnN0YXR1cyA9IDE7CiAJY21kLT5zdGFnZSA9IDA7CkBAIC05MDksMTAgKzkwNSwxMyBAQAogCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKIAogCS8qIEZpcnN0IHF1ZXJ5IHRoZSBwYXJ0aXRpb24gaW5mbyAqLworCURQUklOVEsoIlNNVTogUXVlcnkgcGFydGl0aW9uIGluZm9zIC4uLiAoaXJxPSVkKVxuIiwgc211LT5kYl9pcnEpOwogCXNtdV9xdWV1ZV9zaW1wbGUoJmNtZCwgU01VX0NNRF9QQVJUSVRJT05fQ09NTUFORCwgMiwKIAkJCSBzbXVfZG9uZV9jb21wbGV0ZSwgJmNvbXAsCiAJCQkgU01VX0NNRF9QQVJUSVRJT05fTEFURVNULCBpZCk7CiAJd2FpdF9mb3JfY29tcGxldGlvbigmY29tcCk7CisJRFBSSU5USygiU01VOiBkb25lLCBzdGF0dXM6ICVkLCByZXBseV9sZW46ICVkXG4iLAorCQljbWQuY21kLnN0YXR1cywgY21kLmNtZC5yZXBseV9sZW4pOwogCiAJLyogUGFydGl0aW9uIGRvZXNuJ3QgZXhpc3QgKG9yIG90aGVyIGVycm9yKSAqLwogCWlmIChjbWQuY21kLnN0YXR1cyAhPSAwIHx8IGNtZC5jbWQucmVwbHlfbGVuICE9IDYpCkBAIC05NzUsNiArOTc0LDggQEAKIAogCXNwcmludGYocG5hbWUsICJzZGItcGFydGl0aW9uLSUwMngiLCBpZCk7CiAKKwlEUFJJTlRLKCJzbXVfZ2V0X3NkYl9wYXJ0aXRpb24oJTAyeClcbiIsIGlkKTsKKwogCWlmIChpbnRlcnJ1cHRpYmxlKSB7CiAJCWludCByYzsKIAkJcmMgPSBkb3duX2ludGVycnVwdGlibGUoJnNtdV9wYXJ0X2FjY2Vzcyk7CkBAIC05ODYsNiArOTg3LDcgQEAKIAlwYXJ0ID0gKHN0cnVjdCBzbXVfc2RicF9oZWFkZXIgKilnZXRfcHJvcGVydHkoc211LT5vZl9ub2RlLAogCQkJCQkJICAgICAgcG5hbWUsIHNpemUpOwogCWlmIChwYXJ0ID09IE5VTEwpIHsKKwkJRFBSSU5USygidHJ5aW5nIHRvIGV4dHJhY3QgZnJvbSBTTVUgLi4uXG4iKTsKIAkJcGFydCA9IHNtdV9jcmVhdGVfc2RiX3BhcnRpdGlvbihpZCk7CiAJCWlmIChwYXJ0ICE9IE5VTEwgJiYgc2l6ZSkKIAkJCSpzaXplID0gcGFydC0+bGVuIDw8IDI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC90aGVybV9wbTcyLmMgYi9kcml2ZXJzL21hY2ludG9zaC90aGVybV9wbTcyLmMKaW5kZXggOGQwOTU4Yy4uNGY1MGVlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fcG03Mi5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3BtNzIuYwpAQCAtNjMwLDEyICs2MzAsMTIgQEAKIAlzcHJpbnRmKG5vZGVuYW1lLCAiL3UzQDAsZjgwMDAwMDAvaTJjQGY4MDAxMDAwL2NwdWlkQGElZCIsIGNwdSA/IDIgOiAwKTsKIAlucCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKG5vZGVuYW1lKTsKIAlpZiAobnAgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgInRoZXJtX3BtNzI6IEZhaWxlZCB0byByZXRyZWl2ZSBjcHVpZCBub2RlIGZyb20gZGV2aWNlLXRyZWVcbiIpOworCQlwcmludGsoS0VSTl9FUlIgInRoZXJtX3BtNzI6IEZhaWxlZCB0byByZXRyaWV2ZSBjcHVpZCBub2RlIGZyb20gZGV2aWNlLXRyZWVcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJZGF0YSA9ICh1OCAqKWdldF9wcm9wZXJ0eShucCwgImNwdWlkIiwgJmxlbik7CiAJaWYgKGRhdGEgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgInRoZXJtX3BtNzI6IEZhaWxlZCB0byByZXRyZWl2ZSBjcHVpZCBwcm9wZXJ0eSBmcm9tIGRldmljZS10cmVlXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0aGVybV9wbTcyOiBGYWlsZWQgdG8gcmV0cmlldmUgY3B1aWQgcHJvcGVydHkgZnJvbSBkZXZpY2UtdHJlZVxuIik7CiAJCW9mX25vZGVfcHV0KG5wKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLWN1ZGEuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1jdWRhLmMKaW5kZXggZDg0M2E2Yy4uMmQ5ZDc5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLWN1ZGEuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtY3VkYS5jCkBAIC0xMjcsMzkgKzEyNywzNCBAQAogI2VuZGlmIC8qIENPTkZJR19BREIgKi8KIAogI2lmZGVmIENPTkZJR19QUEMKLWludCBfX2luaXQKLWZpbmRfdmlhX2N1ZGEodm9pZCkKK2ludCBfX2luaXQgZmluZF92aWFfY3VkYSh2b2lkKQogewotICAgIGludCBlcnI7CiAgICAgc3RydWN0IGFkYl9yZXF1ZXN0IHJlcTsKKyAgICBwaHlzX2FkZHJfdCB0YWRkcjsKKyAgICB1MzIgKnJlZzsKKyAgICBpbnQgZXJyOwogCiAgICAgaWYgKHZpYXMgIT0gMCkKIAlyZXR1cm4gMTsKLSAgICB2aWFzID0gZmluZF9kZXZpY2VzKCJ2aWEtY3VkYSIpOworICAgIHZpYXMgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAidmlhLWN1ZGEiKTsKICAgICBpZiAodmlhcyA9PSAwKQogCXJldHVybiAwOwotICAgIGlmICh2aWFzLT5uZXh0ICE9IDApCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiV2FybmluZzogb25seSB1c2luZyAxc3QgdmlhLWN1ZGFcbiIpOwogCi0jaWYgMAotICAgIHsgaW50IGk7Ci0KLSAgICBwcmludGsoImZpbmRfdmlhX2N1ZGE6IG5vZGUgPSAlcCwgYWRkcnMgPSIsIHZpYXMtPm5vZGUpOwotICAgIGZvciAoaSA9IDA7IGkgPCB2aWFzLT5uX2FkZHJzOyArK2kpCi0JcHJpbnRrKCIgJXgoJXgpIiwgdmlhcy0+YWRkcnNbaV0uYWRkcmVzcywgdmlhcy0+YWRkcnNbaV0uc2l6ZSk7Ci0gICAgcHJpbnRrKCIsIGludHJzID0iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgdmlhcy0+bl9pbnRyczsgKytpKQotCXByaW50aygiICV4Iiwgdmlhcy0+aW50cnNbaV0ubGluZSk7Ci0gICAgcHJpbnRrKCJcbiIpOyB9Ci0jZW5kaWYKLQotICAgIGlmICh2aWFzLT5uX2FkZHJzICE9IDEgfHwgdmlhcy0+bl9pbnRycyAhPSAxKSB7Ci0JcHJpbnRrKEtFUk5fRVJSICJ2aWEtY3VkYTogZXhwZWN0aW5nIDEgYWRkcmVzcyAoJWQpIGFuZCAxIGludGVycnVwdCAoJWQpXG4iLAotCSAgICAgICB2aWFzLT5uX2FkZHJzLCB2aWFzLT5uX2ludHJzKTsKLQlpZiAodmlhcy0+bl9hZGRycyA8IDEgfHwgdmlhcy0+bl9pbnRycyA8IDEpCi0JICAgIHJldHVybiAwOworICAgIHJlZyA9ICh1MzIgKilnZXRfcHJvcGVydHkodmlhcywgInJlZyIsIE5VTEwpOworICAgIGlmIChyZWcgPT0gTlVMTCkgeworCSAgICBwcmludGsoS0VSTl9FUlIgInZpYS1jdWRhOiBObyBcInJlZ1wiIHByb3BlcnR5ICFcbiIpOworCSAgICBnb3RvIGZhaWw7CiAgICAgfQotICAgIHZpYSA9IGlvcmVtYXAodmlhcy0+YWRkcnMtPmFkZHJlc3MsIDB4MjAwMCk7CisgICAgdGFkZHIgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyh2aWFzLCByZWcpOworICAgIGlmICh0YWRkciA9PSAwKSB7CisJICAgIHByaW50ayhLRVJOX0VSUiAidmlhLWN1ZGE6IENhbid0IHRyYW5zbGF0ZSBhZGRyZXNzICFcbiIpOworCSAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIHZpYSA9IGlvcmVtYXAodGFkZHIsIDB4MjAwMCk7CisgICAgaWYgKHZpYSA9PSBOVUxMKSB7CisJICAgIHByaW50ayhLRVJOX0VSUiAidmlhLWN1ZGE6IENhbid0IG1hcCBhZGRyZXNzICFcbiIpOworCSAgICBnb3RvIGZhaWw7CisgICAgfQogCiAgICAgY3VkYV9zdGF0ZSA9IGlkbGU7CiAgICAgc3lzX2N0cmxlciA9IFNZU19DVFJMRVJfQ1VEQTsKQEAgLTE4NSw2ICsxODAsMTEgQEAKIAljdWRhX3BvbGwoKTsKIAogICAgIHJldHVybiAxOworCisgZmFpbDoKKyAgICBvZl9ub2RlX3B1dCh2aWFzKTsKKyAgICB2aWFzID0gTlVMTDsKKyAgICByZXR1cm4gMDsKIH0KICNlbmRpZiAvKiBDT05GSUdfUFBDICovCiAKQEAgLTE5MywxMCArMTkzLDYgQEAKICAgICBpZiAodmlhID09IE5VTEwpCiAJcmV0dXJuIC1FTk9ERVY7CiAKLSNpZmRlZiBDT05GSUdfUFBDCi0gICAgcmVxdWVzdF9PRl9yZXNvdXJjZSh2aWFzLCAwLCBOVUxMKTsKLSNlbmRpZgotCiAgICAgaWYgKHJlcXVlc3RfaXJxKENVREFfSVJRLCBjdWRhX2ludGVycnVwdCwgMCwgIkFEQiIsIGN1ZGFfaW50ZXJydXB0KSkgewogCXByaW50ayhLRVJOX0VSUiAiY3VkYV9pbml0OiBjYW4ndCBnZXQgaXJxICVkXG4iLCBDVURBX0lSUSk7CiAJcmV0dXJuIC1FQUdBSU47CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC92aWEtbWFjaWkuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1tYWNpaS5jCmluZGV4IGU5YTE1OWEuLjJhMmZmZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1tYWNpaS5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1tYWNpaS5jCkBAIC0yNjAsNyArMjYwLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCQotCXJlcS0+bmV4dCA9IDA7CisJcmVxLT5uZXh0ID0gTlVMTDsKIAlyZXEtPnNlbnQgPSAwOwogCXJlcS0+Y29tcGxldGUgPSAwOwogCXJlcS0+cmVwbHlfbGVuID0gMDsKQEAgLTI5NSw3ICsyOTUsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JaWYgKHZpYVtJRlJdICYgU1JfSU5UKSBtYWNpaV9pbnRlcnJ1cHQoMCwgMCwgMCk7CisJaWYgKHZpYVtJRlJdICYgU1JfSU5UKSBtYWNpaV9pbnRlcnJ1cHQoMCwgTlVMTCwgTlVMTCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC92aWEtbWFjaWlzaS5jIGIvZHJpdmVycy9tYWNpbnRvc2gvdmlhLW1hY2lpc2kuYwppbmRleCBhMTk2Njk3Li4wMTI5ZmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC92aWEtbWFjaWlzaS5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1tYWNpaXNpLmMKQEAgLTI5NCw2ICsyOTQsMjQgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJtYWNpaXNpX3NlbmRfcmVxdWVzdDogcG9sbCB0aW1lZCBvdXQhXG4iKTsKIH0KIAoraW50CittYWNpaXNpX3JlcXVlc3Qoc3RydWN0IGFkYl9yZXF1ZXN0ICpyZXEsIHZvaWQgKCpkb25lKShzdHJ1Y3QgYWRiX3JlcXVlc3QgKiksCisJICAgIGludCBuYnl0ZXMsIC4uLikKK3sKKwl2YV9saXN0IGxpc3Q7CisJaW50IGk7CisKKwlyZXEtPm5ieXRlcyA9IG5ieXRlczsKKwlyZXEtPmRvbmUgPSBkb25lOworCXJlcS0+cmVwbHlfZXhwZWN0ZWQgPSAwOworCXZhX3N0YXJ0KGxpc3QsIG5ieXRlcyk7CisJZm9yIChpID0gMDsgaSA8IG5ieXRlczsgaSsrKQorCQlyZXEtPmRhdGFbaSsrXSA9IHZhX2FyZyhsaXN0LCBpbnQpOworCXZhX2VuZChsaXN0KTsKKworCXJldHVybiBtYWNpaXNpX3NlbmRfcmVxdWVzdChyZXEsIDEpOworfQorCiAvKiBFbnF1ZXVlIGEgcmVxdWVzdCwgYW5kIHJ1biB0aGUgcXVldWUgaWYgcG9zc2libGUgKi8KIHN0YXRpYyBpbnQKIG1hY2lpc2lfd3JpdGUoc3RydWN0IGFkYl9yZXF1ZXN0KiByZXEpCkBAIC0zMDgsNyArMzI2LDcgQEAKIAkJcmVxLT5jb21wbGV0ZSA9IDE7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlyZXEtPm5leHQgPSAwOworCXJlcS0+bmV4dCA9IE5VTEw7CiAJcmVxLT5zZW50ID0gMDsKIAlyZXEtPmNvbXBsZXRlID0gMDsKIAlyZXEtPnJlcGx5X2xlbiA9IDA7CkBAIC00MDMsNyArNDIxLDcgQEAKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlpZiAodmlhW0lGUl0gJiBTUl9JTlQpIHsKLQkJbWFjaWlzaV9pbnRlcnJ1cHQoMCwgMCwgMCk7CisJCW1hY2lpc2lfaW50ZXJydXB0KDAsIE5VTEwsIE5VTEwpOwogCX0KIAllbHNlIC8qIGF2b2lkIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB0b28gcXVpY2tseSBpbiBhIGxvb3AgKi8KIAkJdWRlbGF5KEFEQl9ERUxBWSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LmMgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LmMKaW5kZXggNTY0MDQzNS4uNmViOTNlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUuYwpAQCAtNTUsNiArNTUsOCBAQAogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vcG1hY19mZWF0dXJlLmg+CisjaW5jbHVkZSA8YXNtL3BtYWNfcGZ1bmMuaD4KKyNpbmNsdWRlIDxhc20vcG1hY19sb3dfaTJjLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KQEAgLTE0Nyw2ICsxNDksNyBAQAogc3RhdGljIGludCBwbXVfa2luZCA9IFBNVV9VTktOT1dOOwogc3RhdGljIGludCBwbXVfZnVsbHlfaW5pdGVkID0gMDsKIHN0YXRpYyBpbnQgcG11X2hhc19hZGI7CitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpncGlvX25vZGU7CiBzdGF0aWMgdW5zaWduZWQgY2hhciBfX2lvbWVtICpncGlvX3JlZyA9IE5VTEw7CiBzdGF0aWMgaW50IGdwaW9faXJxID0gLTE7CiBzdGF0aWMgaW50IGdwaW9faXJxX2VuYWJsZWQgPSAtMTsKQEAgLTE1Nyw4ICsxNjAsOCBAQAogc3RhdGljIGludCBkcm9wX2ludGVycnVwdHM7CiAjaWYgZGVmaW5lZChDT05GSUdfUE0pICYmIGRlZmluZWQoQ09ORklHX1BQQzMyKQogc3RhdGljIGludCBvcHRpb25fbGlkX3dha2V1cCA9IDE7Ci1zdGF0aWMgaW50IHNsZWVwX2luX3Byb2dyZXNzOwogI2VuZGlmIC8qIENPTkZJR19QTSAmJiBDT05GSUdfUFBDMzIgKi8KK3N0YXRpYyBpbnQgc2xlZXBfaW5fcHJvZ3Jlc3M7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBhc3luY19yZXFfbG9ja3M7CiBzdGF0aWMgdW5zaWduZWQgaW50IHBtdV9pcnFfc3RhdHNbMTFdOwogCkBAIC0xOTYsNyArMTk5LDYgQEAKICNlbmRpZiAvKiBDT05GSUdfQURCICovCiAKIHN0YXRpYyBpbnQgaW5pdF9wbXUodm9pZCk7Ci1zdGF0aWMgaW50IHBtdV9xdWV1ZV9yZXF1ZXN0KHN0cnVjdCBhZGJfcmVxdWVzdCAqcmVxKTsKIHN0YXRpYyB2b2lkIHBtdV9zdGFydCh2b2lkKTsKIHN0YXRpYyBpcnFyZXR1cm5fdCB2aWFfcG11X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICphcmcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIHN0YXRpYyBpcnFyZXR1cm5fdCBncGlvMV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqYXJnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CkBAIC0yOTUsMjIgKzI5NywyNiBAQAogfTsKICNlbmRpZiAvKiBDT05GSUdfUE1BQ19CQUNLTElHSFQgKi8KIAotaW50Ci1maW5kX3ZpYV9wbXUodm9pZCkKK2ludCBfX2luaXQgZmluZF92aWFfcG11KHZvaWQpCiB7CisJdTY0IHRhZGRyOworCXUzMiAqcmVnOworCiAJaWYgKHZpYSAhPSAwKQogCQlyZXR1cm4gMTsKLQl2aWFzID0gZmluZF9kZXZpY2VzKCJ2aWEtcG11Iik7Ci0JaWYgKHZpYXMgPT0gMCkKKwl2aWFzID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInZpYS1wbXUiKTsKKwlpZiAodmlhcyA9PSBOVUxMKQogCQlyZXR1cm4gMDsKLQlpZiAodmlhcy0+bmV4dCAhPSAwKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJXYXJuaW5nOiBvbmx5IHVzaW5nIDFzdCB2aWEtcG11XG4iKTsKIAotCWlmICh2aWFzLT5uX2FkZHJzIDwgMSB8fCB2aWFzLT5uX2ludHJzIDwgMSkgewotCQlwcmludGsoS0VSTl9FUlIgInZpYS1wbXU6ICVkIGFkZHJlc3NlcywgJWQgaW50ZXJydXB0cyFcbiIsCi0JCSAgICAgICB2aWFzLT5uX2FkZHJzLCB2aWFzLT5uX2ludHJzKTsKLQkJaWYgKHZpYXMtPm5fYWRkcnMgPCAxIHx8IHZpYXMtPm5faW50cnMgPCAxKQotCQkJcmV0dXJuIDA7CisJcmVnID0gKHUzMiAqKWdldF9wcm9wZXJ0eSh2aWFzLCAicmVnIiwgTlVMTCk7CisJaWYgKHJlZyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAidmlhLXBtdTogTm8gXCJyZWdcIiBwcm9wZXJ0eSAhXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwl0YWRkciA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKHZpYXMsIHJlZyk7CisJaWYgKHRhZGRyID09IE9GX0JBRF9BRERSKSB7CisJCXByaW50ayhLRVJOX0VSUiAidmlhLXBtdTogQ2FuJ3QgdHJhbnNsYXRlIGFkZHJlc3MgIVxuIik7CisJCWdvdG8gZmFpbDsKIAl9CiAKIAlzcGluX2xvY2tfaW5pdCgmcG11X2xvY2spOwpAQCAtMzMxLDcgKzMzNyw4IEBACiAJCXBtdV9raW5kID0gUE1VX0hFQVRIUk9XX0JBU0VEOwogCWVsc2UgaWYgKGRldmljZV9pc19jb21wYXRpYmxlKHZpYXMtPnBhcmVudCwgIktleWxhcmdvIikKIAkJIHx8IGRldmljZV9pc19jb21wYXRpYmxlKHZpYXMtPnBhcmVudCwgIksyLUtleWxhcmdvIikpIHsKLQkJc3RydWN0IGRldmljZV9ub2RlICpncGlvLCAqZ3Bpb3A7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZ3Bpb3A7CisJCXU2NCBnYWRkciA9IE9GX0JBRF9BRERSOwogCiAJCXBtdV9raW5kID0gUE1VX0tFWUxBUkdPX0JBU0VEOwogCQlwbXVfaGFzX2FkYiA9IChmaW5kX3R5cGVfZGV2aWNlcygiYWRiIikgIT0gTlVMTCk7CkBAIC0zNDEsMTkgKzM0OCwyNCBAQAogCQkJCVBNVV9JTlRfVElDSyB8CiAJCQkJUE1VX0lOVF9FTlZJUk9OTUVOVDsKIAkJCi0JCWdwaW9wID0gZmluZF9kZXZpY2VzKCJncGlvIik7Ci0JCWlmIChncGlvcCAmJiBncGlvcC0+bl9hZGRycykgewotCQkJZ3Bpb19yZWcgPSBpb3JlbWFwKGdwaW9wLT5hZGRycy0+YWRkcmVzcywgMHgxMCk7Ci0JCQlncGlvID0gZmluZF9kZXZpY2VzKCJleHRpbnQtZ3BpbzEiKTsKLQkJCWlmIChncGlvID09IE5VTEwpCi0JCQkJZ3BpbyA9IGZpbmRfZGV2aWNlcygicG11LWludGVycnVwdCIpOwotCQkJaWYgKGdwaW8gJiYgZ3Bpby0+cGFyZW50ID09IGdwaW9wICYmIGdwaW8tPm5faW50cnMpCi0JCQkJZ3Bpb19pcnEgPSBncGlvLT5pbnRyc1swXS5saW5lOworCQlncGlvcCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJncGlvIik7CisJCWlmIChncGlvcCkgeworCQkJcmVnID0gKHUzMiAqKWdldF9wcm9wZXJ0eShncGlvcCwgInJlZyIsIE5VTEwpOworCQkJaWYgKHJlZykKKwkJCQlnYWRkciA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKGdwaW9wLCByZWcpOworCQkJaWYgKGdhZGRyICE9IE9GX0JBRF9BRERSKQorCQkJCWdwaW9fcmVnID0gaW9yZW1hcChnYWRkciwgMHgxMCk7CiAJCX0KKwkJaWYgKGdwaW9fcmVnID09IE5VTEwpCisJCQlwcmludGsoS0VSTl9FUlIgInZpYS1wbXU6IENhbid0IGZpbmQgR1BJTyByZWcgIVxuIik7CiAJfSBlbHNlCiAJCXBtdV9raW5kID0gUE1VX1VOS05PV047CiAKLQl2aWEgPSBpb3JlbWFwKHZpYXMtPmFkZHJzLT5hZGRyZXNzLCAweDIwMDApOworCXZpYSA9IGlvcmVtYXAodGFkZHIsIDB4MjAwMCk7CisJaWYgKHZpYSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAidmlhLXBtdTogQ2FuJ3QgbWFwIGFkZHJlc3MgIVxuIik7CisJCWdvdG8gZmFpbDsKKwl9CiAJCiAJb3V0XzgoJnZpYVtJRVJdLCBJRVJfQ0xSIHwgMHg3Zik7CS8qIGRpc2FibGUgYWxsIGludHJzICovCiAJb3V0XzgoJnZpYVtJRlJdLCAweDdmKTsJCQkvKiBjbGVhciBJRlIgKi8KQEAgLTM2NSwyMyArMzc3LDI1IEBACiAJCXJldHVybiAwOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gIlBNVSBkcml2ZXIgJWQgaW5pdGlhbGl6ZWQgZm9yICVzLCBmaXJtd2FyZTogJTAyeFxuIiwKKwlwcmludGsoS0VSTl9JTkZPICJQTVUgZHJpdmVyIHYlZCBpbml0aWFsaXplZCBmb3IgJXMsIGZpcm13YXJlOiAlMDJ4XG4iLAogCSAgICAgICBQTVVfRFJJVkVSX1ZFUlNJT04sIHBib29rX3R5cGVbcG11X2tpbmRdLCBwbXVfdmVyc2lvbik7CiAJICAgICAgIAogCXN5c19jdHJsZXIgPSBTWVNfQ1RSTEVSX1BNVTsKIAkKIAlyZXR1cm4gMTsKKyBmYWlsOgorCW9mX25vZGVfcHV0KHZpYXMpOworCXZpYXMgPSBOVUxMOworCXJldHVybiAwOwogfQogCiAjaWZkZWYgQ09ORklHX0FEQgotc3RhdGljIGludAotcG11X3Byb2JlKHZvaWQpCitzdGF0aWMgaW50IHBtdV9wcm9iZSh2b2lkKQogewogCXJldHVybiB2aWFzID09IE5VTEw/IC1FTk9ERVY6IDA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0Ci1wbXVfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgcG11X2luaXQodm9pZCkKIHsKIAlpZiAodmlhcyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTQwNSw3ICs0MTksNyBAQAogCWJyaWdodF9yZXFfMi5jb21wbGV0ZSA9IDE7CiAJYmF0dF9yZXEuY29tcGxldGUgPSAxOwogCi0jaWYgZGVmaW5lZChDT05GSUdfUFBDMzIpICYmICFkZWZpbmVkKENPTkZJR19QUENfTUVSR0UpCisjaWZuZGVmIENPTkZJR19QUENfTUVSR0UKIAlpZiAocG11X2tpbmQgPT0gUE1VX0tFWUxBUkdPX0JBU0VEKQogCQlvcGVucGljX3NldF9pcnFfcHJpb3JpdHkodmlhcy0+aW50cnNbMF0ubGluZSwKIAkJCQkJIE9QRU5QSUNfUFJJT1JJVFlfREVGQVVMVCArIDEpOwpAQCAtNDE4LDEwICs0MzIsMjIgQEAKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQogCi0JaWYgKHBtdV9raW5kID09IFBNVV9LRVlMQVJHT19CQVNFRCAmJiBncGlvX2lycSAhPSAtMSkgewotCQlpZiAocmVxdWVzdF9pcnEoZ3Bpb19pcnEsIGdwaW8xX2ludGVycnVwdCwgMCwgIkdQSU8xIEFEQiIsICh2b2lkICopMCkpCi0JCQlwcmludGsoS0VSTl9FUlIgInBtdTogY2FuJ3QgZ2V0IGlycSAlZCAoR1BJTzEpXG4iLCBncGlvX2lycSk7Ci0JCWdwaW9faXJxX2VuYWJsZWQgPSAxOworCWlmIChwbXVfa2luZCA9PSBQTVVfS0VZTEFSR09fQkFTRUQpIHsKKwkJZ3Bpb19ub2RlID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImV4dGludC1ncGlvMSIpOworCQlpZiAoZ3Bpb19ub2RlID09IE5VTEwpCisJCQlncGlvX25vZGUgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLAorCQkJCQkJCSAicG11LWludGVycnVwdCIpOworCQlpZiAoZ3Bpb19ub2RlICYmIGdwaW9fbm9kZS0+bl9pbnRycyA+IDApCisJCQlncGlvX2lycSA9IGdwaW9fbm9kZS0+aW50cnNbMF0ubGluZTsKKworCQlpZiAoZ3Bpb19pcnEgIT0gLTEpIHsKKwkJCWlmIChyZXF1ZXN0X2lycShncGlvX2lycSwgZ3BpbzFfaW50ZXJydXB0LCAwLAorCQkJCQkiR1BJTzEgQURCIiwgKHZvaWQgKikwKSkKKwkJCQlwcmludGsoS0VSTl9FUlIgInBtdTogY2FuJ3QgZ2V0IGlycSAlZCIKKwkJCQkgICAgICAgIiAoR1BJTzEpXG4iLCBncGlvX2lycSk7CisJCQllbHNlCisJCQkJZ3Bpb19pcnFfZW5hYmxlZCA9IDE7CisJCX0KIAl9CiAKIAkvKiBFbmFibGUgaW50ZXJydXB0cyAqLwpAQCAtNDU0LDkgKzQ4MCw2IEBACiAJaWYgKHZpYXMgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLSNpZm5kZWYgQ09ORklHX1BQQzY0Ci0JcmVxdWVzdF9PRl9yZXNvdXJjZSh2aWFzLCAwLCBOVUxMKTsKLSNlbmRpZgogI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAogCS8qIEVuYWJsZSBiYWNrbGlnaHQgKi8KIAlyZWdpc3Rlcl9iYWNrbGlnaHRfY29udHJvbGxlcigmcG11X2JhY2tsaWdodF9jb250cm9sbGVyLCBOVUxMLCAicG11Iik7CkBAIC0xMzcxLDcgKzEzOTQsNiBAQAogCQkJfQogCQkJcG11X2RvbmUocmVxKTsKIAkJfSBlbHNlIHsKLSNpZiBkZWZpbmVkKENPTkZJR19YTU9OKSAmJiAhZGVmaW5lZChDT05GSUdfUFBDNjQpCiAJCQlpZiAobGVuID09IDQgJiYgZGF0YVsxXSA9PSAweDJjKSB7CiAJCQkJZXh0ZXJuIGludCB4bW9uX3dhbnRzX2tleSwgeG1vbl9hZGJfa2V5Y29kZTsKIAkJCQlpZiAoeG1vbl93YW50c19rZXkpIHsKQEAgLTEzNzksNyArMTQwMSw2IEBACiAJCQkJCXJldHVybjsKIAkJCQl9CiAJCQl9Ci0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfWE1PTikgJiYgIWRlZmluZWQoQ09ORklHX1BQQzY0KSAqLwogI2lmZGVmIENPTkZJR19BREIKIAkJCS8qCiAJCQkgKiBYWFggT24gdGhlIFsyM100MDAgdGhlIFBNVSBnaXZlcyB1cyBhbiB1cApAQCAtMTc4MiwyNTggKzE4MDMsNiBAQAogCXJldHVybiB2aWEgIT0gMDsKIH0KIAotc3RydWN0IHBtdV9pMmNfaGRyIHsKLQl1OAlidXM7Ci0JdTgJbW9kZTsKLQl1OAlidXMyOwotCXU4CWFkZHJlc3M7Ci0JdTgJc3ViX2FkZHI7Ci0JdTgJY29tYl9hZGRyOwotCXU4CWNvdW50OwotfTsKLQotaW50Ci1wbXVfaTJjX2NvbWJpbmVkX3JlYWQoaW50IGJ1cywgaW50IGFkZHIsIGludCBzdWJhZGRyLCAgdTgqIGRhdGEsIGludCBsZW4pCi17Ci0Jc3RydWN0IGFkYl9yZXF1ZXN0CXJlcTsKLQlzdHJ1Y3QgcG11X2kyY19oZHIJKmhkciA9IChzdHJ1Y3QgcG11X2kyY19oZHIgKikmcmVxLmRhdGFbMV07Ci0JaW50IHJldHJ5OwotCWludCByYzsKLQotCWZvciAocmV0cnk9MDsgcmV0cnk8MTY7IHJldHJ5KyspIHsKLQkJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKLQotCQloZHItPmJ1cyA9IGJ1czsKLQkJaGRyLT5hZGRyZXNzID0gYWRkciAmIDB4ZmU7Ci0JCWhkci0+bW9kZSA9IFBNVV9JMkNfTU9ERV9DT01CSU5FRDsKLQkJaGRyLT5idXMyID0gMDsKLQkJaGRyLT5zdWJfYWRkciA9IHN1YmFkZHI7Ci0JCWhkci0+Y29tYl9hZGRyID0gYWRkciB8IDE7Ci0JCWhkci0+Y291bnQgPSBsZW47Ci0JCQotCQlyZXEubmJ5dGVzID0gc2l6ZW9mKHN0cnVjdCBwbXVfaTJjX2hkcikgKyAxOwotCQlyZXEucmVwbHlfZXhwZWN0ZWQgPSAwOwotCQlyZXEucmVwbHlfbGVuID0gMDsKLQkJcmVxLmRhdGFbMF0gPSBQTVVfSTJDX0NNRDsKLQkJcmVxLnJlcGx5WzBdID0gMHhmZjsKLQkJcmMgPSBwbXVfcXVldWVfcmVxdWVzdCgmcmVxKTsKLQkJaWYgKHJjKQotCQkJcmV0dXJuIHJjOwotCQl3aGlsZSghcmVxLmNvbXBsZXRlKQotCQkJcG11X3BvbGwoKTsKLQkJaWYgKHJlcS5yZXBseVswXSA9PSBQTVVfSTJDX1NUQVRVU19PSykKLQkJCWJyZWFrOwotCQltZGVsYXkoMTUpOwotCX0KLQlpZiAocmVxLnJlcGx5WzBdICE9IFBNVV9JMkNfU1RBVFVTX09LKQotCQlyZXR1cm4gLTE7Ci0KLQlmb3IgKHJldHJ5PTA7IHJldHJ5PDE2OyByZXRyeSsrKSB7Ci0JCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7Ci0KLQkJbWRlbGF5KDE1KTsKLQotCQloZHItPmJ1cyA9IFBNVV9JMkNfQlVTX1NUQVRVUzsKLQkJcmVxLnJlcGx5WzBdID0gMHhmZjsKLQkJCi0JCXJlcS5uYnl0ZXMgPSAyOwotCQlyZXEucmVwbHlfZXhwZWN0ZWQgPSAwOwotCQlyZXEucmVwbHlfbGVuID0gMDsKLQkJcmVxLmRhdGFbMF0gPSBQTVVfSTJDX0NNRDsKLQkJcmMgPSBwbXVfcXVldWVfcmVxdWVzdCgmcmVxKTsKLQkJaWYgKHJjKQotCQkJcmV0dXJuIHJjOwotCQl3aGlsZSghcmVxLmNvbXBsZXRlKQotCQkJcG11X3BvbGwoKTsKLQkJaWYgKHJlcS5yZXBseVswXSA9PSBQTVVfSTJDX1NUQVRVU19EQVRBUkVBRCkgewotCQkJbWVtY3B5KGRhdGEsICZyZXEucmVwbHlbMV0sIHJlcS5yZXBseV9sZW4gLSAxKTsKLQkJCXJldHVybiByZXEucmVwbHlfbGVuIC0gMTsKLQkJfQotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KLWludAotcG11X2kyY19zdGRzdWJfd3JpdGUoaW50IGJ1cywgaW50IGFkZHIsIGludCBzdWJhZGRyLCAgdTgqIGRhdGEsIGludCBsZW4pCi17Ci0Jc3RydWN0IGFkYl9yZXF1ZXN0CXJlcTsKLQlzdHJ1Y3QgcG11X2kyY19oZHIJKmhkciA9IChzdHJ1Y3QgcG11X2kyY19oZHIgKikmcmVxLmRhdGFbMV07Ci0JaW50IHJldHJ5OwotCWludCByYzsKLQotCWZvciAocmV0cnk9MDsgcmV0cnk8MTY7IHJldHJ5KyspIHsKLQkJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKLQotCQloZHItPmJ1cyA9IGJ1czsKLQkJaGRyLT5hZGRyZXNzID0gYWRkciAmIDB4ZmU7Ci0JCWhkci0+bW9kZSA9IFBNVV9JMkNfTU9ERV9TVERTVUI7Ci0JCWhkci0+YnVzMiA9IDA7Ci0JCWhkci0+c3ViX2FkZHIgPSBzdWJhZGRyOwotCQloZHItPmNvbWJfYWRkciA9IGFkZHIgJiAweGZlOwotCQloZHItPmNvdW50ID0gbGVuOwotCi0JCXJlcS5kYXRhWzBdID0gUE1VX0kyQ19DTUQ7Ci0JCW1lbWNweSgmcmVxLmRhdGFbc2l6ZW9mKHN0cnVjdCBwbXVfaTJjX2hkcikgKyAxXSwgZGF0YSwgbGVuKTsKLQkJcmVxLm5ieXRlcyA9IHNpemVvZihzdHJ1Y3QgcG11X2kyY19oZHIpICsgbGVuICsgMTsKLQkJcmVxLnJlcGx5X2V4cGVjdGVkID0gMDsKLQkJcmVxLnJlcGx5X2xlbiA9IDA7Ci0JCXJlcS5yZXBseVswXSA9IDB4ZmY7Ci0JCXJjID0gcG11X3F1ZXVlX3JlcXVlc3QoJnJlcSk7Ci0JCWlmIChyYykKLQkJCXJldHVybiByYzsKLQkJd2hpbGUoIXJlcS5jb21wbGV0ZSkKLQkJCXBtdV9wb2xsKCk7Ci0JCWlmIChyZXEucmVwbHlbMF0gPT0gUE1VX0kyQ19TVEFUVVNfT0spCi0JCQlicmVhazsKLQkJbWRlbGF5KDE1KTsKLQl9Ci0JaWYgKHJlcS5yZXBseVswXSAhPSBQTVVfSTJDX1NUQVRVU19PSykKLQkJcmV0dXJuIC0xOwotCi0JZm9yIChyZXRyeT0wOyByZXRyeTwxNjsgcmV0cnkrKykgewotCQltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOwotCi0JCW1kZWxheSgxNSk7Ci0KLQkJaGRyLT5idXMgPSBQTVVfSTJDX0JVU19TVEFUVVM7Ci0JCXJlcS5yZXBseVswXSA9IDB4ZmY7Ci0JCQotCQlyZXEubmJ5dGVzID0gMjsKLQkJcmVxLnJlcGx5X2V4cGVjdGVkID0gMDsKLQkJcmVxLnJlcGx5X2xlbiA9IDA7Ci0JCXJlcS5kYXRhWzBdID0gUE1VX0kyQ19DTUQ7Ci0JCXJjID0gcG11X3F1ZXVlX3JlcXVlc3QoJnJlcSk7Ci0JCWlmIChyYykKLQkJCXJldHVybiByYzsKLQkJd2hpbGUoIXJlcS5jb21wbGV0ZSkKLQkJCXBtdV9wb2xsKCk7Ci0JCWlmIChyZXEucmVwbHlbMF0gPT0gUE1VX0kyQ19TVEFUVVNfT0spCi0JCQlyZXR1cm4gbGVuOwotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KLWludAotcG11X2kyY19zaW1wbGVfcmVhZChpbnQgYnVzLCBpbnQgYWRkciwgIHU4KiBkYXRhLCBpbnQgbGVuKQotewotCXN0cnVjdCBhZGJfcmVxdWVzdAlyZXE7Ci0Jc3RydWN0IHBtdV9pMmNfaGRyCSpoZHIgPSAoc3RydWN0IHBtdV9pMmNfaGRyICopJnJlcS5kYXRhWzFdOwotCWludCByZXRyeTsKLQlpbnQgcmM7Ci0KLQlmb3IgKHJldHJ5PTA7IHJldHJ5PDE2OyByZXRyeSsrKSB7Ci0JCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7Ci0KLQkJaGRyLT5idXMgPSBidXM7Ci0JCWhkci0+YWRkcmVzcyA9IGFkZHIgfCAxOwotCQloZHItPm1vZGUgPSBQTVVfSTJDX01PREVfU0lNUExFOwotCQloZHItPmJ1czIgPSAwOwotCQloZHItPnN1Yl9hZGRyID0gMDsKLQkJaGRyLT5jb21iX2FkZHIgPSAwOwotCQloZHItPmNvdW50ID0gbGVuOwotCi0JCXJlcS5kYXRhWzBdID0gUE1VX0kyQ19DTUQ7Ci0JCXJlcS5uYnl0ZXMgPSBzaXplb2Yoc3RydWN0IHBtdV9pMmNfaGRyKSArIDE7Ci0JCXJlcS5yZXBseV9leHBlY3RlZCA9IDA7Ci0JCXJlcS5yZXBseV9sZW4gPSAwOwotCQlyZXEucmVwbHlbMF0gPSAweGZmOwotCQlyYyA9IHBtdV9xdWV1ZV9yZXF1ZXN0KCZyZXEpOwotCQlpZiAocmMpCi0JCQlyZXR1cm4gcmM7Ci0JCXdoaWxlKCFyZXEuY29tcGxldGUpCi0JCQlwbXVfcG9sbCgpOwotCQlpZiAocmVxLnJlcGx5WzBdID09IFBNVV9JMkNfU1RBVFVTX09LKQotCQkJYnJlYWs7Ci0JCW1kZWxheSgxNSk7Ci0JfQotCWlmIChyZXEucmVwbHlbMF0gIT0gUE1VX0kyQ19TVEFUVVNfT0spCi0JCXJldHVybiAtMTsKLQotCWZvciAocmV0cnk9MDsgcmV0cnk8MTY7IHJldHJ5KyspIHsKLQkJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKLQotCQltZGVsYXkoMTUpOwotCi0JCWhkci0+YnVzID0gUE1VX0kyQ19CVVNfU1RBVFVTOwotCQlyZXEucmVwbHlbMF0gPSAweGZmOwotCQkKLQkJcmVxLm5ieXRlcyA9IDI7Ci0JCXJlcS5yZXBseV9leHBlY3RlZCA9IDA7Ci0JCXJlcS5yZXBseV9sZW4gPSAwOwotCQlyZXEuZGF0YVswXSA9IFBNVV9JMkNfQ01EOwotCQlyYyA9IHBtdV9xdWV1ZV9yZXF1ZXN0KCZyZXEpOwotCQlpZiAocmMpCi0JCQlyZXR1cm4gcmM7Ci0JCXdoaWxlKCFyZXEuY29tcGxldGUpCi0JCQlwbXVfcG9sbCgpOwotCQlpZiAocmVxLnJlcGx5WzBdID09IFBNVV9JMkNfU1RBVFVTX0RBVEFSRUFEKSB7Ci0JCQltZW1jcHkoZGF0YSwgJnJlcS5yZXBseVsxXSwgcmVxLnJlcGx5X2xlbiAtIDEpOwotCQkJcmV0dXJuIHJlcS5yZXBseV9sZW4gLSAxOwotCQl9Ci0JfQotCXJldHVybiAtMTsKLX0KLQotaW50Ci1wbXVfaTJjX3NpbXBsZV93cml0ZShpbnQgYnVzLCBpbnQgYWRkciwgIHU4KiBkYXRhLCBpbnQgbGVuKQotewotCXN0cnVjdCBhZGJfcmVxdWVzdAlyZXE7Ci0Jc3RydWN0IHBtdV9pMmNfaGRyCSpoZHIgPSAoc3RydWN0IHBtdV9pMmNfaGRyICopJnJlcS5kYXRhWzFdOwotCWludCByZXRyeTsKLQlpbnQgcmM7Ci0KLQlmb3IgKHJldHJ5PTA7IHJldHJ5PDE2OyByZXRyeSsrKSB7Ci0JCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7Ci0KLQkJaGRyLT5idXMgPSBidXM7Ci0JCWhkci0+YWRkcmVzcyA9IGFkZHIgJiAweGZlOwotCQloZHItPm1vZGUgPSBQTVVfSTJDX01PREVfU0lNUExFOwotCQloZHItPmJ1czIgPSAwOwotCQloZHItPnN1Yl9hZGRyID0gMDsKLQkJaGRyLT5jb21iX2FkZHIgPSAwOwotCQloZHItPmNvdW50ID0gbGVuOwotCi0JCXJlcS5kYXRhWzBdID0gUE1VX0kyQ19DTUQ7Ci0JCW1lbWNweSgmcmVxLmRhdGFbc2l6ZW9mKHN0cnVjdCBwbXVfaTJjX2hkcikgKyAxXSwgZGF0YSwgbGVuKTsKLQkJcmVxLm5ieXRlcyA9IHNpemVvZihzdHJ1Y3QgcG11X2kyY19oZHIpICsgbGVuICsgMTsKLQkJcmVxLnJlcGx5X2V4cGVjdGVkID0gMDsKLQkJcmVxLnJlcGx5X2xlbiA9IDA7Ci0JCXJlcS5yZXBseVswXSA9IDB4ZmY7Ci0JCXJjID0gcG11X3F1ZXVlX3JlcXVlc3QoJnJlcSk7Ci0JCWlmIChyYykKLQkJCXJldHVybiByYzsKLQkJd2hpbGUoIXJlcS5jb21wbGV0ZSkKLQkJCXBtdV9wb2xsKCk7Ci0JCWlmIChyZXEucmVwbHlbMF0gPT0gUE1VX0kyQ19TVEFUVVNfT0spCi0JCQlicmVhazsKLQkJbWRlbGF5KDE1KTsKLQl9Ci0JaWYgKHJlcS5yZXBseVswXSAhPSBQTVVfSTJDX1NUQVRVU19PSykKLQkJcmV0dXJuIC0xOwotCi0JZm9yIChyZXRyeT0wOyByZXRyeTwxNjsgcmV0cnkrKykgewotCQltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOwotCi0JCW1kZWxheSgxNSk7Ci0KLQkJaGRyLT5idXMgPSBQTVVfSTJDX0JVU19TVEFUVVM7Ci0JCXJlcS5yZXBseVswXSA9IDB4ZmY7Ci0JCQotCQlyZXEubmJ5dGVzID0gMjsKLQkJcmVxLnJlcGx5X2V4cGVjdGVkID0gMDsKLQkJcmVxLnJlcGx5X2xlbiA9IDA7Ci0JCXJlcS5kYXRhWzBdID0gUE1VX0kyQ19DTUQ7Ci0JCXJjID0gcG11X3F1ZXVlX3JlcXVlc3QoJnJlcSk7Ci0JCWlmIChyYykKLQkJCXJldHVybiByYzsKLQkJd2hpbGUoIXJlcS5jb21wbGV0ZSkKLQkJCXBtdV9wb2xsKCk7Ci0JCWlmIChyZXEucmVwbHlbMF0gPT0gUE1VX0kyQ19TVEFUVVNfT0spCi0JCQlyZXR1cm4gbGVuOwotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KICNpZmRlZiBDT05GSUdfUE0KIAogc3RhdGljIExJU1RfSEVBRChzbGVlcF9ub3RpZmllcnMpOwpAQCAtMjMzOCw4ICsyMTA3LDkgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKLQkvKiBEaXNhYmxlIGNsb2NrIHNwcmVhZGluZyBvbiBzb21lIG1hY2hpbmVzICovCi0JcG1hY190d2Vha19jbG9ja19zcHJlYWRpbmcoMCk7CisJLyogQ2FsbCBwbGF0Zm9ybSBmdW5jdGlvbnMgbWFya2VkICJvbiBzbGVlcCIgKi8KKwlwbWFjX3BmdW5jX2kyY19zdXNwZW5kKCk7CisJcG1hY19wZnVuY19iYXNlX3N1c3BlbmQoKTsKIAogCS8qIFN0b3AgcHJlZW1wdGlvbiAqLwogCXByZWVtcHRfZGlzYWJsZSgpOwpAQCAtMjQxMSw4ICsyMTgxLDkgQEAKIAltZGVsYXkoMTApOwogCXByZWVtcHRfZW5hYmxlKCk7CiAKLQkvKiBSZS1lbmFibGUgY2xvY2sgc3ByZWFkaW5nIG9uIHNvbWUgbWFjaGluZXMgKi8KLQlwbWFjX3R3ZWFrX2Nsb2NrX3NwcmVhZGluZygxKTsKKwkvKiBDYWxsIHBsYXRmb3JtIGZ1bmN0aW9ucyBtYXJrZWQgIm9uIHdha2UiICovCisJcG1hY19wZnVuY19iYXNlX3Jlc3VtZSgpOworCXBtYWNfcGZ1bmNfaTJjX3Jlc3VtZSgpOwogCiAJLyogUmVzdW1lIGRldmljZXMgKi8KIAlkZXZpY2VfcmVzdW1lKCk7CkBAIC0zMTMwLDE2ICsyOTAxLDEzIEBACiBzdWJzeXNfaW5pdGNhbGwoaW5pdF9wbXVfc3lzZnMpOwogCiBFWFBPUlRfU1lNQk9MKHBtdV9yZXF1ZXN0KTsKK0VYUE9SVF9TWU1CT0wocG11X3F1ZXVlX3JlcXVlc3QpOwogRVhQT1JUX1NZTUJPTChwbXVfcG9sbCk7CiBFWFBPUlRfU1lNQk9MKHBtdV9wb2xsX2FkYik7CiBFWFBPUlRfU1lNQk9MKHBtdV93YWl0X2NvbXBsZXRlKTsKIEVYUE9SVF9TWU1CT0wocG11X3N1c3BlbmQpOwogRVhQT1JUX1NZTUJPTChwbXVfcmVzdW1lKTsKIEVYUE9SVF9TWU1CT0wocG11X3VubG9jayk7Ci1FWFBPUlRfU1lNQk9MKHBtdV9pMmNfY29tYmluZWRfcmVhZCk7Ci1FWFBPUlRfU1lNQk9MKHBtdV9pMmNfc3Rkc3ViX3dyaXRlKTsKLUVYUE9SVF9TWU1CT0wocG11X2kyY19zaW1wbGVfcmVhZCk7Ci1FWFBPUlRfU1lNQk9MKHBtdV9pMmNfc2ltcGxlX3dyaXRlKTsKICNpZiBkZWZpbmVkKENPTkZJR19QTSkgJiYgZGVmaW5lZChDT05GSUdfUFBDMzIpCiBFWFBPUlRfU1lNQk9MKHBtdV9lbmFibGVfaXJsZWQpOwogRVhQT1JUX1NZTUJPTChwbXVfYmF0dGVyeV9jb3VudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11NjhrLmMgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11NjhrLmMKaW5kZXggNmY4MGQ3Ni4uZjA4ZTUyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdTY4ay5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXU2OGsuYwpAQCAtNDkzLDcgKzQ5Myw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJlcS0+bmV4dCA9IDA7CisJcmVxLT5uZXh0ID0gTlVMTDsKIAlyZXEtPnNlbnQgPSAwOwogCXJlcS0+Y29tcGxldGUgPSAwOwogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKQEAgLTcxNyw3ICs3MTcsNyBAQAogCQkJCXByaW50ayhLRVJOX0VSUiAiUE1VOiBleHRyYSBBREIgcmVwbHlcbiIpOwogCQkJCXJldHVybjsKIAkJCX0KLQkJCXJlcV9hd2FpdGluZ19yZXBseSA9IDA7CisJCQlyZXFfYXdhaXRpbmdfcmVwbHkgPSBOVUxMOwogCQkJaWYgKGxlbiA8PSAyKQogCQkJCXJlcS0+cmVwbHlfbGVuID0gMDsKIAkJCWVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fbG03NV9zZW5zb3IuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX2xtNzVfc2Vuc29yLmMKaW5kZXggNTc0NjBlNC4uOTA2ZDNlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fbG03NV9zZW5zb3IuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9sbTc1X3NlbnNvci5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS9wbWFjX2xvd19pMmMuaD4KIAogI2luY2x1ZGUgIndpbmRmYXJtLmgiCiAKQEAgLTE1Nyw1MyArMTU4LDIxIEBACiAKIHN0YXRpYyBpbnQgd2ZfbG03NV9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQogewotCXU4IGJ1c19pZDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnNtdSwgKmJ1cywgKmRldjsKLQotCS8qIFdlIGN1cnJlbnRseSBvbmx5IGRlYWwgd2l0aCBMTTc1J3MgaGFuZ2luZyBvZmYgdGhlIFNNVQotCSAqIGkyYyBidXNzZXMuIElmIHdlIGV4dGVuZCB0aGF0IGRyaXZlciB0byBvdGhlci9vbGRlcgotCSAqIG1hY2hpbmVzLCB3ZSBzaG91bGQgc3BsaXQgdGhpcyBmdW5jdGlvbiBpbnRvIFNNVS1pMmMsCi0JICoga2V5d2VzdC1pMmMsIFBNVS1pMmMsIC4uLgotCSAqLworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqYnVzbm9kZSwgKmRldjsKKwlzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXM7CiAKIAlEQkcoIndmX2xtNzU6IGFkYXB0ZXIgJXMgZGV0ZWN0ZWRcbiIsIGFkYXB0ZXItPm5hbWUpOwogCi0JaWYgKHN0cm5jbXAoYWRhcHRlci0+bmFtZSwgInNtdS1pMmMtIiwgOCkgIT0gMCkKLQkJcmV0dXJuIDA7Ci0Jc211ID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgInNtdSIpOwotCWlmIChzbXUgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBMb29rIGZvciB0aGUgYnVzIGluIHRoZSBkZXZpY2UtdHJlZSAqLwotCWJ1c19pZCA9ICh1OClzaW1wbGVfc3RydG91bChhZGFwdGVyLT5uYW1lICsgOCwgTlVMTCwgMTYpOwotCi0JREJHKCJ3Zl9sbTc1OiBidXMgSUQgaXMgJXhcbiIsIGJ1c19pZCk7Ci0KLQkvKiBMb29rIGZvciBzZW5zb3JzIHN1YmRpciAqLwotCWZvciAoYnVzID0gTlVMTDsKLQkgICAgIChidXMgPSBvZl9nZXRfbmV4dF9jaGlsZChzbXUsIGJ1cykpICE9IE5VTEw7KSB7Ci0JCXUzMiAqcmVnOwotCi0JCWlmIChzdHJjbXAoYnVzLT5uYW1lLCAiaTJjIikpCi0JCQljb250aW51ZTsKLQkJcmVnID0gKHUzMiAqKWdldF9wcm9wZXJ0eShidXMsICJyZWciLCBOVUxMKTsKLQkJaWYgKHJlZyA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCWlmIChidXNfaWQgPT0gKnJlZykKLQkJCWJyZWFrOwotCX0KLQlvZl9ub2RlX3B1dChzbXUpOwotCWlmIChidXMgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3aW5kZmFybTogU01VIGkyYyBidXMgMHgleCBub3QgZm91bmQiCi0JCSAgICAgICAiIGluIGRldmljZS10cmVlICFcbiIsIGJ1c19pZCk7Ci0JCXJldHVybiAwOwotCX0KKwlidXMgPSBwbWFjX2kyY19hZGFwdGVyX3RvX2J1cyhhZGFwdGVyKTsKKwlpZiAoYnVzID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCWJ1c25vZGUgPSBwbWFjX2kyY19nZXRfYnVzX25vZGUoYnVzKTsKIAogCURCRygid2ZfbG03NTogYnVzIGZvdW5kLCBsb29raW5nIGZvciBkZXZpY2UuLi5cbiIpOwogCiAJLyogTm93IGxvb2sgZm9yIGxtNzUocykgaW4gdGhlcmUgKi8KIAlmb3IgKGRldiA9IE5VTEw7Ci0JICAgICAoZGV2ID0gb2ZfZ2V0X25leHRfY2hpbGQoYnVzLCBkZXYpKSAhPSBOVUxMOykgeworCSAgICAgKGRldiA9IG9mX2dldF9uZXh0X2NoaWxkKGJ1c25vZGUsIGRldikpICE9IE5VTEw7KSB7CiAJCWNvbnN0IGNoYXIgKmxvYyA9CiAJCQlnZXRfcHJvcGVydHkoZGV2LCAiaHdzZW5zb3ItbG9jYXRpb24iLCBOVUxMKTsKIAkJdTMyICpyZWcgPSAodTMyICopZ2V0X3Byb3BlcnR5KGRldiwgInJlZyIsIE5VTEwpOwpAQCAtMjE3LDkgKzE4Niw2IEBACiAJCWVsc2UgaWYgKGRldmljZV9pc19jb21wYXRpYmxlKGRldiwgImRzMTc3NSIpKQogCQkJd2ZfbG03NV9jcmVhdGUoYWRhcHRlciwgKnJlZywgMSwgbG9jKTsKIAl9Ci0KLQlvZl9ub2RlX3B1dChidXMpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3BtODEuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3BtODEuYwppbmRleCA4MGRkZjk3Li5lYjY5YTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9wbTgxLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fcG04MS5jCkBAIC0yNiw3ICsyNiw3IEBACiAgKiAgICAodHlwaWNhbGx5IHRoZSBkcml2ZSBmYW4pCiAgKiAgLSB0aGUgbWFpbiBjb250cm9sIChmaXJzdCBjb250cm9sKSBnZXRzIHRoZSB0YXJnZXQgdmFsdWUgc2NhbGVkIHdpdGgKICAqICAgIHRoZSBmaXJzdCBwYWlyIG9mIGZhY3RvcnMsIGFuZCBpcyB0aGVuIG1vZGlmaWVkIGFzIGJlbG93Ci0gKiAgLSB0aGUgdmFsdWUgb2YgdGhlIHRhcmdldCBvZiB0aGUgQ1BVIEZhbiBjb250cm9sIGxvb3AgaXMgcmV0cmVpdmVkLAorICogIC0gdGhlIHZhbHVlIG9mIHRoZSB0YXJnZXQgb2YgdGhlIENQVSBGYW4gY29udHJvbCBsb29wIGlzIHJldHJpZXZlZCwKICAqICAgIHNjYWxlZCB3aXRoIHRoZSBzZWNvbmQgcGFpciBvZiBmYWN0b3JzLCBhbmQgdGhlIG1heCBvZiB0aGF0IGFuZAogICogICAgdGhlIHNjYWxlZCB0YXJnZXQgaXMgYXBwbGllZCB0byB0aGUgbWFpbiBjb250cm9sLgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3NtdV9jb250cm9scy5jIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fc211X2NvbnRyb2xzLmMKaW5kZXggMmMzMTU4Yy4uNGQ4MTE2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fc211X2NvbnRyb2xzLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fc211X2NvbnRyb2xzLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fc211X3NlbnNvcnMuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3NtdV9zZW5zb3JzLmMKaW5kZXggYjU1OGNjMi4uMWEwMGQ5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fc211X3NlbnNvcnMuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9zbXVfc2Vuc29ycy5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYml0bWFwLmMgYi9kcml2ZXJzL21kL2JpdG1hcC5jCmluZGV4IDc2YTE4OWMuLmVhZTQ0NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYml0bWFwLmMKKysrIGIvZHJpdmVycy9tZC9iaXRtYXAuYwpAQCAtMjAwLDcgKzIwMCw3IEBACiAvKiBpZiBwYWdlIGlzIGNvbXBsZXRlbHkgZW1wdHksIHB1dCBpdCBiYWNrIG9uIHRoZSBmcmVlIGxpc3QsIG9yIGRlYWxsb2MgaXQgKi8KIC8qIGlmIHBhZ2Ugd2FzIGhpamFja2VkLCB1bm1hcmsgdGhlIGZsYWcgc28gaXQgbWlnaHQgZ2V0IGFsbG9jZWQgbmV4dCB0aW1lICovCiAvKiBOb3RlOiBsb2NrIHNob3VsZCBiZSBoZWxkIHdoZW4gY2FsbGluZyB0aGlzICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYml0bWFwX2NoZWNrZnJlZShzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHVuc2lnbmVkIGxvbmcgcGFnZSkKK3N0YXRpYyB2b2lkIGJpdG1hcF9jaGVja2ZyZWUoc3RydWN0IGJpdG1hcCAqYml0bWFwLCB1bnNpZ25lZCBsb25nIHBhZ2UpCiB7CiAJY2hhciAqcHRyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWNyeXB0LmMgYi9kcml2ZXJzL21kL2RtLWNyeXB0LmMKaW5kZXggYTYwMWE0Mi4uZTdhNjUwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1jcnlwdC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tY3J5cHQuYwpAQCAtMjI4LDcgKzIyOCw3IEBACiB9OwogCiAKLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW50CiBjcnlwdF9jb252ZXJ0X3NjYXR0ZXJsaXN0KHN0cnVjdCBjcnlwdF9jb25maWcgKmNjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKm91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICppbiwgdW5zaWduZWQgaW50IGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdyaXRlLCBzZWN0b3JfdCBzZWN0b3IpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWlvY3RsLmMgYi9kcml2ZXJzL21kL2RtLWlvY3RsLmMKaW5kZXggNTYxYmRhNS4uMTIzNTEzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1pb2N0bC5jCisrKyBiL2RyaXZlcnMvbWQvZG0taW9jdGwuYwpAQCAtNTk4LDcgKzU5OCw3IEBACiAvKgogICogQWx3YXlzIHVzZSBVVUlEIGZvciBsb29rdXBzIGlmIGl0J3MgcHJlc2VudCwgb3RoZXJ3aXNlIHVzZSBuYW1lIG9yIGRldi4KICAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgaGFzaF9jZWxsICpfX2ZpbmRfZGV2aWNlX2hhc2hfY2VsbChzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtKQorc3RhdGljIHN0cnVjdCBoYXNoX2NlbGwgKl9fZmluZF9kZXZpY2VfaGFzaF9jZWxsKHN0cnVjdCBkbV9pb2N0bCAqcGFyYW0pCiB7CiAJaWYgKCpwYXJhbS0+dXVpZCkKIAkJcmV0dXJuIF9fZ2V0X3V1aWRfY2VsbChwYXJhbS0+dXVpZCk7CkBAIC02MDgsNyArNjA4LDcgQEAKIAkJcmV0dXJuIGRtX2dldF9tZHB0cihodWdlX2RlY29kZV9kZXYocGFyYW0tPmRldikpOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBtYXBwZWRfZGV2aWNlICpmaW5kX2RldmljZShzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtKQorc3RhdGljIHN0cnVjdCBtYXBwZWRfZGV2aWNlICpmaW5kX2RldmljZShzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtKQogewogCXN0cnVjdCBoYXNoX2NlbGwgKmhjOwogCXN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXNuYXAuYyBiL2RyaXZlcnMvbWQvZG0tc25hcC5jCmluZGV4IDRiOWRkOGYuLjg3NzI3ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tc25hcC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tc25hcC5jCkBAIC02OTEsNyArNjkxLDcgQEAKIC8qCiAgKiBEaXNwYXRjaGVzIHRoZSBjb3B5IG9wZXJhdGlvbiB0byBrY29weWQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzdGFydF9jb3B5KHN0cnVjdCBwZW5kaW5nX2V4Y2VwdGlvbiAqcGUpCitzdGF0aWMgdm9pZCBzdGFydF9jb3B5KHN0cnVjdCBwZW5kaW5nX2V4Y2VwdGlvbiAqcGUpCiB7CiAJc3RydWN0IGRtX3NuYXBzaG90ICpzID0gcGUtPnNuYXA7CiAJc3RydWN0IGlvX3JlZ2lvbiBzcmMsIGRlc3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLmMgYi9kcml2ZXJzL21kL2RtLmMKaW5kZXggMGU0ODE1MS4uOGMxNjM1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS5jCisrKyBiL2RyaXZlcnMvbWQvZG0uYwpAQCAtMjkzLDcgKzI5Myw3IEBACiAgKiBEZWNyZW1lbnRzIHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgaW9zIHRoYXQgYSBiaW8gaGFzIGJlZW4KICAqIGNsb25lZCBpbnRvLCBjb21wbGV0aW5nIHRoZSBvcmlnaW5hbCBpbyBpZiBuZWNjLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZGVjX3BlbmRpbmcoc3RydWN0IGRtX2lvICppbywgaW50IGVycm9yKQorc3RhdGljIHZvaWQgZGVjX3BlbmRpbmcoc3RydWN0IGRtX2lvICppbywgaW50IGVycm9yKQogewogCWlmIChlcnJvcikKIAkJaW8tPmVycm9yID0gZXJyb3I7CkBAIC03NjgsNiArNzY4LDcgQEAKIAltZC0+cXVldWUtPmJhY2tpbmdfZGV2X2luZm8uY29uZ2VzdGVkX2ZuID0gZG1fYW55X2Nvbmdlc3RlZDsKIAltZC0+cXVldWUtPmJhY2tpbmdfZGV2X2luZm8uY29uZ2VzdGVkX2RhdGEgPSBtZDsKIAlibGtfcXVldWVfbWFrZV9yZXF1ZXN0KG1kLT5xdWV1ZSwgZG1fcmVxdWVzdCk7CisJYmxrX3F1ZXVlX2JvdW5jZV9saW1pdChtZC0+cXVldWUsIEJMS19CT1VOQ0VfQU5ZKTsKIAltZC0+cXVldWUtPnVucGx1Z19mbiA9IGRtX3VucGx1Z19hbGw7CiAJbWQtPnF1ZXVlLT5pc3N1ZV9mbHVzaF9mbiA9IGRtX2ZsdXNoX2FsbDsKIApAQCAtODM3LDkgKzgzOCw5IEBACiB7CiAJc2V0X2NhcGFjaXR5KG1kLT5kaXNrLCBzaXplKTsKIAotCWRvd24oJm1kLT5zdXNwZW5kZWRfYmRldi0+YmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZtZC0+c3VzcGVuZGVkX2JkZXYtPmJkX2lub2RlLT5pX211dGV4KTsKIAlpX3NpemVfd3JpdGUobWQtPnN1c3BlbmRlZF9iZGV2LT5iZF9pbm9kZSwgKGxvZmZfdClzaXplIDw8IFNFQ1RPUl9TSElGVCk7Ci0JdXAoJm1kLT5zdXNwZW5kZWRfYmRldi0+YmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJm1kLT5zdXNwZW5kZWRfYmRldi0+YmRfaW5vZGUtPmlfbXV0ZXgpOwogfQogCiBzdGF0aWMgaW50IF9fYmluZChzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQsIHN0cnVjdCBkbV90YWJsZSAqdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQva2NvcHlkLmMgYi9kcml2ZXJzL21kL2tjb3B5ZC5jCmluZGV4IGNhOTk5NzkuLjhiMzUxNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQva2NvcHlkLmMKKysrIGIvZHJpdmVycy9tZC9rY29weWQuYwpAQCAtOCw2ICs4LDcgQEAKICAqIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uLgogICovCiAKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQuYyBiL2RyaXZlcnMvbWQvbWQuYwppbmRleCAxYjc2ZmIyLi43MTQ1Y2QxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL21kLmMKKysrIGIvZHJpdmVycy9tZC9tZC5jCkBAIC0xMjM4LDYgKzEyMzgsNyBAQAogCW1ka19yZGV2X3QgKnNhbWVfcGRldjsKIAljaGFyIGJbQkRFVk5BTUVfU0laRV0sIGIyW0JERVZOQU1FX1NJWkVdOwogCXN0cnVjdCBrb2JqZWN0ICprbzsKKwljaGFyICpzOwogCiAJaWYgKHJkZXYtPm1kZGV2KSB7CiAJCU1EX0JVRygpOwpAQCAtMTI3Nyw2ICsxMjc4LDggQEAKIAliZGV2bmFtZShyZGV2LT5iZGV2LGIpOwogCWlmIChrb2JqZWN0X3NldF9uYW1lKCZyZGV2LT5rb2JqLCAiZGV2LSVzIiwgYikgPCAwKQogCQlyZXR1cm4gLUVOT01FTTsKKwl3aGlsZSAoIChzPXN0cmNocihyZGV2LT5rb2JqLmtfbmFtZSwgJy8nKSkgIT0gTlVMTCkKKwkJKnMgPSAnISc7CiAJCQkKIAlsaXN0X2FkZCgmcmRldi0+c2FtZV9zZXQsICZtZGRldi0+ZGlza3MpOwogCXJkZXYtPm1kZGV2ID0gbWRkZXY7CkBAIC0zMzkyLDYgKzMzOTUsNyBAQAogCW1kZGV2LT5jdGltZSAgICAgICAgID0gZ2V0X3NlY29uZHMoKTsKIAogCW1kZGV2LT5sZXZlbCAgICAgICAgID0gaW5mby0+bGV2ZWw7CisJbWRkZXYtPmNsZXZlbFswXSAgICAgPSAwOwogCW1kZGV2LT5zaXplICAgICAgICAgID0gaW5mby0+c2l6ZTsKIAltZGRldi0+cmFpZF9kaXNrcyAgICA9IGluZm8tPnJhaWRfZGlza3M7CiAJLyogZG9uJ3Qgc2V0IG1kX21pbm9yLCBpdCBpcyBkZXRlcm1pbmVkIGJ5IHdoaWNoIC9kZXYvbWQqIHdhcwpAQCAtMzQ2MCw5ICszNDY0LDkgQEAKIAogCQliZGV2ID0gYmRnZXRfZGlzayhtZGRldi0+Z2VuZGlzaywgMCk7CiAJCWlmIChiZGV2KSB7Ci0JCQlkb3duKCZiZGV2LT5iZF9pbm9kZS0+aV9zZW0pOworCQkJbXV0ZXhfbG9jaygmYmRldi0+YmRfaW5vZGUtPmlfbXV0ZXgpOwogCQkJaV9zaXplX3dyaXRlKGJkZXYtPmJkX2lub2RlLCBtZGRldi0+YXJyYXlfc2l6ZSA8PCAxMCk7Ci0JCQl1cCgmYmRldi0+YmRfaW5vZGUtPmlfc2VtKTsKKwkJCW11dGV4X3VubG9jaygmYmRldi0+YmRfaW5vZGUtPmlfbXV0ZXgpOwogCQkJYmRwdXQoYmRldik7CiAJCX0KIAl9CkBAIC0zNDg2LDkgKzM0OTAsOSBAQAogCiAJCWJkZXYgPSBiZGdldF9kaXNrKG1kZGV2LT5nZW5kaXNrLCAwKTsKIAkJaWYgKGJkZXYpIHsKLQkJCWRvd24oJmJkZXYtPmJkX2lub2RlLT5pX3NlbSk7CisJCQltdXRleF9sb2NrKCZiZGV2LT5iZF9pbm9kZS0+aV9tdXRleCk7CiAJCQlpX3NpemVfd3JpdGUoYmRldi0+YmRfaW5vZGUsIG1kZGV2LT5hcnJheV9zaXplIDw8IDEwKTsKLQkJCXVwKCZiZGV2LT5iZF9pbm9kZS0+aV9zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZiZGV2LT5iZF9pbm9kZS0+aV9tdXRleCk7CiAJCQliZHB1dChiZGV2KTsKIAkJfQogCX0KQEAgLTM1OTgsMTIgKzM2MDIsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtZF9nZXRnZW8oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8pCit7CisJbWRkZXZfdCAqbWRkZXYgPSBiZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisKKwlnZW8tPmhlYWRzID0gMjsKKwlnZW8tPnNlY3RvcnMgPSA0OworCWdlby0+Y3lsaW5kZXJzID0gZ2V0X2NhcGFjaXR5KG1kZGV2LT5nZW5kaXNrKSAvIDg7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbWRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlpbnQgZXJyID0gMDsKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlzdHJ1Y3QgaGRfZ2VvbWV0cnkgX191c2VyICpsb2MgPSBhcmdwOwogCW1kZGV2X3QgKm1kZGV2ID0gTlVMTDsKIAogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKQEAgLTM3NjUsMjQgKzM3NzgsNiBAQAogCSAqIDQgc2VjdG9ycyAod2l0aCBhIEJJRyBudW1iZXIgb2YgY3lsaW5kZXJzLi4uKS4gVGhpcyBkcml2ZXMKIAkgKiBkb3NmcyBqdXN0IG1hZC4uLiA7LSkKIAkgKi8KLQkJY2FzZSBIRElPX0dFVEdFTzoKLQkJCWlmICghbG9jKSB7Ci0JCQkJZXJyID0gLUVJTlZBTDsKLQkJCQlnb3RvIGFib3J0X3VubG9jazsKLQkJCX0KLQkJCWVyciA9IHB1dF91c2VyICgyLCAoY2hhciBfX3VzZXIgKikgJmxvYy0+aGVhZHMpOwotCQkJaWYgKGVycikKLQkJCQlnb3RvIGFib3J0X3VubG9jazsKLQkJCWVyciA9IHB1dF91c2VyICg0LCAoY2hhciBfX3VzZXIgKikgJmxvYy0+c2VjdG9ycyk7Ci0JCQlpZiAoZXJyKQotCQkJCWdvdG8gYWJvcnRfdW5sb2NrOwotCQkJZXJyID0gcHV0X3VzZXIoZ2V0X2NhcGFjaXR5KG1kZGV2LT5nZW5kaXNrKS84LAotCQkJCQkoc2hvcnQgX191c2VyICopICZsb2MtPmN5bGluZGVycyk7Ci0JCQlpZiAoZXJyKQotCQkJCWdvdG8gYWJvcnRfdW5sb2NrOwotCQkJZXJyID0gcHV0X3VzZXIgKGdldF9zdGFydF9zZWN0KGlub2RlLT5pX2JkZXYpLAotCQkJCQkJKGxvbmcgX191c2VyICopICZsb2MtPnN0YXJ0KTsKLQkJCWdvdG8gZG9uZV91bmxvY2s7CiAJfQogCiAJLyoKQEAgLTM5MTEsNiArMzkwNiw3IEBACiAJLm9wZW4JCT0gbWRfb3BlbiwKIAkucmVsZWFzZQk9IG1kX3JlbGVhc2UsCiAJLmlvY3RsCQk9IG1kX2lvY3RsLAorCS5nZXRnZW8JCT0gbWRfZ2V0Z2VvLAogCS5tZWRpYV9jaGFuZ2VkCT0gbWRfbWVkaWFfY2hhbmdlZCwKIAkucmV2YWxpZGF0ZV9kaXNrPSBtZF9yZXZhbGlkYXRlLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMgYi9kcml2ZXJzL21kL211bHRpcGF0aC5jCmluZGV4IGU2YWEzMDkuLjk2ZjdhZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMKKysrIGIvZHJpdmVycy9tZC9tdWx0aXBhdGguYwpAQCAtMzAzLDYgKzMwMyw3IEBACiBzdGF0aWMgaW50IG11bHRpcGF0aF9hZGRfZGlzayhtZGRldl90ICptZGRldiwgbWRrX3JkZXZfdCAqcmRldikKIHsKIAltdWx0aXBhdGhfY29uZl90ICpjb25mID0gbWRkZXYtPnByaXZhdGU7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7CiAJaW50IGZvdW5kID0gMDsKIAlpbnQgcGF0aDsKIAlzdHJ1Y3QgbXVsdGlwYXRoX2luZm8gKnA7CkBAIC0zMTEsOCArMzEyLDggQEAKIAogCWZvciAocGF0aD0wOyBwYXRoPG1kZGV2LT5yYWlkX2Rpc2tzOyBwYXRoKyspIAogCQlpZiAoKHA9Y29uZi0+bXVsdGlwYXRocytwYXRoKS0+cmRldiA9PSBOVUxMKSB7Ci0JCQlibGtfcXVldWVfc3RhY2tfbGltaXRzKG1kZGV2LT5xdWV1ZSwKLQkJCQkJICAgICAgIHJkZXYtPmJkZXYtPmJkX2Rpc2stPnF1ZXVlKTsKKwkJCXEgPSByZGV2LT5iZGV2LT5iZF9kaXNrLT5xdWV1ZTsKKwkJCWJsa19xdWV1ZV9zdGFja19saW1pdHMobWRkZXYtPnF1ZXVlLCBxKTsKIAogCQkvKiBhcyB3ZSBkb24ndCBob25vdXIgbWVyZ2VfYnZlY19mbiwgd2UgbXVzdCBuZXZlciByaXNrCiAJCSAqIHZpb2xhdGluZyBpdCwgc28gbGltaXQgLT5tYXhfc2VjdG9yIHRvIG9uZSBQQUdFLCBhcwpAQCAtMzIwLDcgKzMyMSw3IEBACiAJCSAqIChOb3RlOiBpdCBpcyB2ZXJ5IHVubGlrZWx5IHRoYXQgYSBkZXZpY2Ugd2l0aAogCQkgKiBtZXJnZV9idmVjX2ZuIHdpbGwgYmUgaW52b2x2ZWQgaW4gbXVsdGlwYXRoLikKIAkJICovCi0JCQlpZiAocmRldi0+YmRldi0+YmRfZGlzay0+cXVldWUtPm1lcmdlX2J2ZWNfZm4gJiYKKwkJCWlmIChxLT5tZXJnZV9idmVjX2ZuICYmCiAJCQkgICAgbWRkZXYtPnF1ZXVlLT5tYXhfc2VjdG9ycyA+IChQQUdFX1NJWkU+PjkpKQogCQkJCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhtZGRldi0+cXVldWUsIFBBR0VfU0laRT4+OSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDAuYyBiL2RyaXZlcnMvbWQvcmFpZDAuYwppbmRleCBhYmJjYTE1Li5kMDNmOTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQwLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMC5jCkBAIC0zMDYsOSArMzA2LDYgQEAKIAlwcmludGsoInJhaWQwIDogY29uZi0+aGFzaF9zcGFjaW5nIGlzICVsbHUgYmxvY2tzLlxuIiwKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZyljb25mLT5oYXNoX3NwYWNpbmcpOwogCXsKLSNpZiBfX0dOVUNfXyA8IDMKLQkJdm9sYXRpbGUKLSNlbmRpZgogCQlzZWN0b3JfdCBzID0gbWRkZXYtPmFycmF5X3NpemU7CiAJCXNlY3Rvcl90IHNwYWNlID0gY29uZi0+aGFzaF9zcGFjaW5nOwogCQlpbnQgcm91bmQ7CkBAIC00MzksOSArNDM2LDYgQEAKICAKIAogCXsKLSNpZiBfX0dOVUNfXyA8IDMKLQkJdm9sYXRpbGUKLSNlbmRpZgogCQlzZWN0b3JfdCB4ID0gYmxvY2sgPj4gY29uZi0+cHJlc2hpZnQ7CiAJCXNlY3Rvcl9kaXYoeCwgKHUzMiljb25mLT5oYXNoX3NwYWNpbmcpOwogCQl6b25lID0gY29uZi0+aGFzaF90YWJsZVt4XTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDEuYyBiL2RyaXZlcnMvbWQvcmFpZDEuYwppbmRleCBhMDZmZjkxLi5kMzlmNTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQxLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMS5jCkBAIC0xNzYsNyArMTc2LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3IxYmlvKHIxYmlvX3QgKnIxX2JpbykKK3N0YXRpYyB2b2lkIGZyZWVfcjFiaW8ocjFiaW9fdCAqcjFfYmlvKQogewogCWNvbmZfdCAqY29uZiA9IG1kZGV2X3RvX2NvbmYocjFfYmlvLT5tZGRldik7CiAKQEAgLTE5MCw3ICsxOTAsNyBAQAogCW1lbXBvb2xfZnJlZShyMV9iaW8sIGNvbmYtPnIxYmlvX3Bvb2wpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHV0X2J1ZihyMWJpb190ICpyMV9iaW8pCitzdGF0aWMgdm9pZCBwdXRfYnVmKHIxYmlvX3QgKnIxX2JpbykKIHsKIAljb25mX3QgKmNvbmYgPSBtZGRldl90b19jb25mKHIxX2Jpby0+bWRkZXYpOwogCWludCBpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkMTAuYyBiL2RyaXZlcnMvbWQvcmFpZDEwLmMKaW5kZXggOWU2NThlNS4uOTEzMGQwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMTAuYworKysgYi9kcml2ZXJzL21kL3JhaWQxMC5jCkBAIC0xNzYsNyArMTc2LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3IxMGJpbyhyMTBiaW9fdCAqcjEwX2JpbykKK3N0YXRpYyB2b2lkIGZyZWVfcjEwYmlvKHIxMGJpb190ICpyMTBfYmlvKQogewogCWNvbmZfdCAqY29uZiA9IG1kZGV2X3RvX2NvbmYocjEwX2Jpby0+bWRkZXYpOwogCkBAIC0xOTAsNyArMTkwLDcgQEAKIAltZW1wb29sX2ZyZWUocjEwX2JpbywgY29uZi0+cjEwYmlvX3Bvb2wpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHV0X2J1ZihyMTBiaW9fdCAqcjEwX2JpbykKK3N0YXRpYyB2b2lkIHB1dF9idWYocjEwYmlvX3QgKnIxMF9iaW8pCiB7CiAJY29uZl90ICpjb25mID0gbWRkZXZfdG9fY29uZihyMTBfYmlvLT5tZGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDUuYyBiL2RyaXZlcnMvbWQvcmFpZDUuYwppbmRleCA1NGY0YTk4Li4yNTk3NmJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQ1LmMKKysrIGIvZHJpdmVycy9tZC9yYWlkNS5jCkBAIC02OSw3ICs2OSw3IEBACiAKIHN0YXRpYyB2b2lkIHByaW50X3JhaWQ1X2NvbmYgKHJhaWQ1X2NvbmZfdCAqY29uZik7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3JlbGVhc2Vfc3RyaXBlKHJhaWQ1X2NvbmZfdCAqY29uZiwgc3RydWN0IHN0cmlwZV9oZWFkICpzaCkKK3N0YXRpYyB2b2lkIF9fcmVsZWFzZV9zdHJpcGUocmFpZDVfY29uZl90ICpjb25mLCBzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoKQogewogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZzaC0+Y291bnQpKSB7CiAJCWlmICghbGlzdF9lbXB0eSgmc2gtPmxydSkpCkBAIC0xMTgsNyArMTE4LDcgQEAKIAlobGlzdF9kZWxfaW5pdCgmc2gtPmhhc2gpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5zZXJ0X2hhc2gocmFpZDVfY29uZl90ICpjb25mLCBzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoKQorc3RhdGljIHZvaWQgaW5zZXJ0X2hhc2gocmFpZDVfY29uZl90ICpjb25mLCBzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoKQogewogCXN0cnVjdCBobGlzdF9oZWFkICpocCA9IHN0cmlwZV9oYXNoKGNvbmYsIHNoLT5zZWN0b3IpOwogCkBAIC0xNzgsNyArMTc4LDcgQEAKIAogc3RhdGljIHZvaWQgcmFpZDVfYnVpbGRfYmxvY2sgKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIGludCBpKTsKIAotc3RhdGljIGlubGluZSB2b2lkIGluaXRfc3RyaXBlKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIHNlY3Rvcl90IHNlY3RvciwgaW50IHBkX2lkeCkKK3N0YXRpYyB2b2lkIGluaXRfc3RyaXBlKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIHNlY3Rvcl90IHNlY3RvciwgaW50IHBkX2lkeCkKIHsKIAlyYWlkNV9jb25mX3QgKmNvbmYgPSBzaC0+cmFpZF9jb25mOwogCWludCBkaXNrcyA9IGNvbmYtPnJhaWRfZGlza3MsIGk7CkBAIC0xNDE1LDcgKzE0MTUsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHJhaWQ1X2FjdGl2YXRlX2RlbGF5ZWQocmFpZDVfY29uZl90ICpjb25mKQorc3RhdGljIHZvaWQgcmFpZDVfYWN0aXZhdGVfZGVsYXllZChyYWlkNV9jb25mX3QgKmNvbmYpCiB7CiAJaWYgKGF0b21pY19yZWFkKCZjb25mLT5wcmVyZWFkX2FjdGl2ZV9zdHJpcGVzKSA8IElPX1RIUkVTSE9MRCkgewogCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmNvbmYtPmRlbGF5ZWRfbGlzdCkpIHsKQEAgLTE0MzEsNyArMTQzMSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYWN0aXZhdGVfYml0X2RlbGF5KHJhaWQ1X2NvbmZfdCAqY29uZikKK3N0YXRpYyB2b2lkIGFjdGl2YXRlX2JpdF9kZWxheShyYWlkNV9jb25mX3QgKmNvbmYpCiB7CiAJLyogZGV2aWNlX2xvY2sgaXMgaGVsZCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDZtYWluLmMgYi9kcml2ZXJzL21kL3JhaWQ2bWFpbi5jCmluZGV4IDhjODIzZDYuLmY2MThhNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDZtYWluLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkNm1haW4uYwpAQCAtODgsNyArODgsNyBAQAogCiBzdGF0aWMgdm9pZCBwcmludF9yYWlkNl9jb25mIChyYWlkNl9jb25mX3QgKmNvbmYpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19yZWxlYXNlX3N0cmlwZShyYWlkNl9jb25mX3QgKmNvbmYsIHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gpCitzdGF0aWMgdm9pZCBfX3JlbGVhc2Vfc3RyaXBlKHJhaWQ2X2NvbmZfdCAqY29uZiwgc3RydWN0IHN0cmlwZV9oZWFkICpzaCkKIHsKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc2gtPmNvdW50KSkgewogCQlpZiAoIWxpc3RfZW1wdHkoJnNoLT5scnUpKQpAQCAtMTk3LDcgKzE5Nyw3IEBACiAKIHN0YXRpYyB2b2lkIHJhaWQ2X2J1aWxkX2Jsb2NrIChzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoLCBpbnQgaSk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X3N0cmlwZShzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoLCBzZWN0b3JfdCBzZWN0b3IsIGludCBwZF9pZHgpCitzdGF0aWMgdm9pZCBpbml0X3N0cmlwZShzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoLCBzZWN0b3JfdCBzZWN0b3IsIGludCBwZF9pZHgpCiB7CiAJcmFpZDZfY29uZl90ICpjb25mID0gc2gtPnJhaWRfY29uZjsKIAlpbnQgZGlza3MgPSBjb25mLT5yYWlkX2Rpc2tzLCBpOwpAQCAtMTU3Nyw3ICsxNTc3LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByYWlkNl9hY3RpdmF0ZV9kZWxheWVkKHJhaWQ2X2NvbmZfdCAqY29uZikKK3N0YXRpYyB2b2lkIHJhaWQ2X2FjdGl2YXRlX2RlbGF5ZWQocmFpZDZfY29uZl90ICpjb25mKQogewogCWlmIChhdG9taWNfcmVhZCgmY29uZi0+cHJlcmVhZF9hY3RpdmVfc3RyaXBlcykgPCBJT19USFJFU0hPTEQpIHsKIAkJd2hpbGUgKCFsaXN0X2VtcHR5KCZjb25mLT5kZWxheWVkX2xpc3QpKSB7CkBAIC0xNTkzLDcgKzE1OTMsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGFjdGl2YXRlX2JpdF9kZWxheShyYWlkNl9jb25mX3QgKmNvbmYpCitzdGF0aWMgdm9pZCBhY3RpdmF0ZV9iaXRfZGVsYXkocmFpZDZfY29uZl90ICpjb25mKQogewogCS8qIGRldmljZV9sb2NrIGlzIGhlbGQgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfY29yZS5jCmluZGV4IDI4OTlkMzQuLjA0YzE5MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfY29yZS5jCkBAIC0xMDksMTAgKzEwOSw5IEBACiAJc3RydWN0IHBhZ2UgKnBnOwogCWludCBpOwogCi0Jc2dsaXN0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSpucl9wYWdlcywgR0ZQX0tFUk5FTCk7CisJc2dsaXN0ID0ga2NhbGxvYyhucl9wYWdlcywgc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCksIEdGUF9LRVJORUwpOwogCWlmIChOVUxMID09IHNnbGlzdCkKIAkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KHNnbGlzdCwwLHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpKm5yX3BhZ2VzKTsKIAlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKywgdmlydCArPSBQQUdFX1NJWkUpIHsKIAkJcGcgPSB2bWFsbG9jX3RvX3BhZ2UodmlydCk7CiAJCWlmIChOVUxMID09IHBnKQpAQCAtMzA2LDE1ICszMDUsMTMgQEAKIAlzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldjsKIAlpbnQgZXJyID0gLUVOT01FTTsKIAotCWRldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzYWE3MTQ2X2RldiksIEdGUF9LRVJORUwpOworCS8qIGNsZWFyIG91dCBtZW0gZm9yIHN1cmUgKi8KKwlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2FhNzE0Nl9kZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldikgewogCQlFUlIoKCJvdXQgb2YgbWVtb3J5LlxuIikpOwogCQlnb3RvIG91dDsKIAl9CiAKLQkvKiBjbGVhciBvdXQgbWVtIGZvciBzdXJlICovCi0JbWVtc2V0KGRldiwgMHgwLCBzaXplb2Yoc3RydWN0IHNhYTcxNDZfZGV2KSk7Ci0KIAlERUJfRUUoKCJwY2k6JXBcbiIscGNpKSk7CiAKIAllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9mb3BzLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2ZvcHMuYwppbmRleCAwOWVjOTY0Li5mOGNmNzNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2ZvcHMuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2ZvcHMuYwpAQCAtMjM5LDEzICsyMzksMTIgQEAKIAl9CiAKIAkvKiBhbGxvY2F0ZSBwZXIgb3BlbiBkYXRhICovCi0JZmggPSBrbWFsbG9jKHNpemVvZigqZmgpLEdGUF9LRVJORUwpOworCWZoID0ga3phbGxvYyhzaXplb2YoKmZoKSxHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCA9PSBmaCkgewogCQlERUJfUygoImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBlciBvcGVuIGRhdGEuXG4iKSk7CiAJCXJlc3VsdCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KLQltZW1zZXQoZmgsMCxzaXplb2YoKmZoKSk7CiAKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKIAlmaC0+ZGV2ID0gZGV2OwpAQCAtMjUzLDcgKzI1MiwxMCBAQAogCiAJaWYoIGZoLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkUpIHsKIAkJREVCX1MoKCJpbml0aWFsaXppbmcgdmJpLi4uXG4iKSk7Ci0JCXJlc3VsdCA9IHNhYTcxNDZfdmJpX3VvcHMub3BlbihkZXYsZmlsZSk7CisJCWlmIChkZXYtPmV4dF92dl9kYXRhLT5jYXBhYmlsaXRpZXMgJiBWNEwyX0NBUF9WQklfQ0FQVFVSRSkKKwkJCXJlc3VsdCA9IHNhYTcxNDZfdmJpX3VvcHMub3BlbihkZXYsZmlsZSk7CisJCWlmIChkZXYtPmV4dF92dl9kYXRhLT52YmlfZm9wcy5vcGVuKQorCQkJZGV2LT5leHRfdnZfZGF0YS0+dmJpX2ZvcHMub3Blbihpbm9kZSwgZmlsZSk7CiAJfSBlbHNlIHsKIAkJREVCX1MoKCJpbml0aWFsaXppbmcgdmlkZW8uLi5cbiIpKTsKIAkJcmVzdWx0ID0gc2FhNzE0Nl92aWRlb191b3BzLm9wZW4oZGV2LGZpbGUpOwpAQCAtMjg5LDcgKzI5MSwxMCBAQAogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCiAJaWYoIGZoLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkUpIHsKLQkJc2FhNzE0Nl92YmlfdW9wcy5yZWxlYXNlKGRldixmaWxlKTsKKwkJaWYgKGRldi0+ZXh0X3Z2X2RhdGEtPmNhcGFiaWxpdGllcyAmIFY0TDJfQ0FQX1ZCSV9DQVBUVVJFKQorCQkJc2FhNzE0Nl92YmlfdW9wcy5yZWxlYXNlKGRldixmaWxlKTsKKwkJaWYgKGRldi0+ZXh0X3Z2X2RhdGEtPnZiaV9mb3BzLnJlbGVhc2UpCisJCQlkZXYtPmV4dF92dl9kYXRhLT52YmlfZm9wcy5yZWxlYXNlKGlub2RlLCBmaWxlKTsKIAl9IGVsc2UgewogCQlzYWE3MTQ2X3ZpZGVvX3VvcHMucmVsZWFzZShkZXYsZmlsZSk7CiAJfQpAQCAtMzMyLDYgKzMzNyw3IEBACiAJCUJVRygpOwogCQlyZXR1cm4gMDsKIAl9CisKIAlyZXR1cm4gdmlkZW9idWZfbW1hcF9tYXBwZXIocSx2bWEpOwogfQogCkBAIC0zODEsNyArMzg3LDEwIEBACiAJCX0KIAljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6IHsKIC8vCQlERUJfRUUoKCJWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOiBmaWxlOiVwLCBkYXRhOiVwLCBjb3VudDolbHVcbiIsIGZpbGUsIGRhdGEsICh1bnNpZ25lZCBsb25nKWNvdW50KSk7Ci0JCXJldHVybiBzYWE3MTQ2X3ZiaV91b3BzLnJlYWQoZmlsZSxkYXRhLGNvdW50LHBwb3MpOworCQlpZiAoZmgtPmRldi0+ZXh0X3Z2X2RhdGEtPmNhcGFiaWxpdGllcyAmIFY0TDJfQ0FQX1ZCSV9DQVBUVVJFKQorCQkJcmV0dXJuIHNhYTcxNDZfdmJpX3VvcHMucmVhZChmaWxlLGRhdGEsY291bnQscHBvcyk7CisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0zOTAsMTIgKzM5OSwzMSBAQAogCX0KIH0KIAorc3RhdGljIHNzaXplX3QgZm9wc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBzYWE3MTQ2X2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXN3aXRjaCAoZmgtPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOgorCQlpZiAoZmgtPmRldi0+ZXh0X3Z2X2RhdGEtPnZiaV9mb3BzLndyaXRlKQorCQkJcmV0dXJuIGZoLT5kZXYtPmV4dF92dl9kYXRhLT52YmlfZm9wcy53cml0ZShmaWxlLCBkYXRhLCBjb3VudCwgcHBvcyk7CisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZpZGVvX2ZvcHMgPQogewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbgkJPSBmb3BzX29wZW4sCiAJLnJlbGVhc2UJPSBmb3BzX3JlbGVhc2UsCiAJLnJlYWQJCT0gZm9wc19yZWFkLAorCS53cml0ZQkJPSBmb3BzX3dyaXRlLAogCS5wb2xsCQk9IGZvcHNfcG9sbCwKIAkubW1hcAkJPSBmb3BzX21tYXAsCiAJLmlvY3RsCQk9IGZvcHNfaW9jdGwsCkBAIC00MzUsMTIgKzQ2MywxMSBAQAogCiBpbnQgc2FhNzE0Nl92dl9pbml0KHN0cnVjdCBzYWE3MTQ2X2RldiogZGV2LCBzdHJ1Y3Qgc2FhNzE0Nl9leHRfdnYgKmV4dF92dikKIHsKLQlzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBrbWFsbG9jIChzaXplb2Yoc3RydWN0IHNhYTcxNDZfdnYpLEdGUF9LRVJORUwpOworCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGt6YWxsb2MgKHNpemVvZihzdHJ1Y3Qgc2FhNzE0Nl92diksR0ZQX0tFUk5FTCk7CiAJaWYoIE5VTEwgPT0gdnYgKSB7CiAJCUVSUigoIm91dCBvZiBtZW1vcnkuIGFib3J0aW5nLlxuIikpOwogCQlyZXR1cm4gLTE7CiAJfQotCW1lbXNldCh2diwgMHgwLCBzaXplb2YoKnZ2KSk7CiAKIAlERUJfRUUoKCJkZXY6JXBcbiIsZGV2KSk7CiAKQEAgLTQ2Nyw3ICs0OTQsOCBAQAogCW1lbXNldCh2di0+ZF9jbGlwcGluZy5jcHVfYWRkciwgMHgwLCBTQUE3MTQ2X0NMSVBQSU5HX01FTSk7CiAKIAlzYWE3MTQ2X3ZpZGVvX3VvcHMuaW5pdChkZXYsdnYpOwotCXNhYTcxNDZfdmJpX3VvcHMuaW5pdChkZXYsdnYpOworCWlmIChkZXYtPmV4dF92dl9kYXRhLT5jYXBhYmlsaXRpZXMgJiBWNEwyX0NBUF9WQklfQ0FQVFVSRSkKKwkJc2FhNzE0Nl92YmlfdW9wcy5pbml0KGRldix2dik7CiAKIAlkZXYtPnZ2X2RhdGEgPSB2djsKIAlkZXYtPnZ2X2NhbGxiYWNrID0gJnZ2X2NhbGxiYWNrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9obHAuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfaGxwLmMKaW5kZXggZWM1MmRmZi4uMzNiZWM4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9obHAuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2hscC5jCkBAIC01NjIsMTkgKzU2MiwyNiBAQAogCiAJaW50IGJfZGVwdGggPSB2di0+b3ZfZm10LT5kZXB0aDsKIAlpbnQgYl9icGwgPSB2di0+b3ZfZmIuZm10LmJ5dGVzcGVybGluZTsKLQl1MzIgYmFzZSA9ICh1MzIpdnYtPm92X2ZiLmJhc2U7CisJLyogVGhlIHVuc2lnbmVkIGxvbmcgY2FzdCBpcyB0byByZW1vdmUgYSA2NC1iaXQgY29tcGlsZSB3YXJuaW5nIHNpbmNlCisJICAgaXQgbG9va3MgbGlrZSBhIDY0LWJpdCBhZGRyZXNzIGlzIGNhc3QgdG8gYSAzMi1iaXQgdmFsdWUsIGV2ZW4KKwkgICB0aG91Z2ggdGhlIGJhc2UgcG9pbnRlciBpcyByZWFsbHkgYSAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzcyB0aGF0CisJICAgZ29lcyBpbnRvIGEgMzItYml0IERNQSByZWdpc3Rlci4KKwkgICBGSVhNRTogbWlnaHQgbm90IHdvcmsgb24gc29tZSA2NC1iaXQgcGxhdGZvcm1zLCBidXQgc2VlIHRoZSBGSVhNRQorCSAgIGluIHN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICh2aWRlb2RldjIuaCkgZm9yIHRoYXQuCisJICovCisJdTMyIGJhc2UgPSAodTMyKSh1bnNpZ25lZCBsb25nKXZ2LT5vdl9mYi5iYXNlOwogCiAJc3RydWN0CXNhYTcxNDZfdmlkZW9fZG1hIHZkbWExOwogCiAJLyogY2FsY3VsYXRlIG1lbW9yeSBvZmZzZXRzIGZvciBwaWN0dXJlLCBsb29rIGlmIHdlIHNoYWxsIHRvcC1kb3duLWZsaXAgKi8KIAl2ZG1hMS5waXRjaAk9IDIqYl9icGw7CiAJaWYgKCAwID09IHZ2LT52ZmxpcCApIHsKLQkJdmRtYTEuYmFzZV9ldmVuID0gKHUzMiliYXNlICsgKHdfeSAqICh2ZG1hMS5waXRjaC8yKSkgKyAod194ICogKGJfZGVwdGggLyA4KSk7CisJCXZkbWExLmJhc2VfZXZlbiA9IGJhc2UgKyAod195ICogKHZkbWExLnBpdGNoLzIpKSArICh3X3ggKiAoYl9kZXB0aCAvIDgpKTsKIAkJdmRtYTEuYmFzZV9vZGQgID0gdmRtYTEuYmFzZV9ldmVuICsgKHZkbWExLnBpdGNoIC8gMik7CiAJCXZkbWExLnByb3RfYWRkciA9IHZkbWExLmJhc2VfZXZlbiArICh3X2hlaWdodCAqICh2ZG1hMS5waXRjaCAvIDIpKTsKIAl9CiAJZWxzZSB7Ci0JCXZkbWExLmJhc2VfZXZlbiA9ICh1MzIpYmFzZSArICgod195K3dfaGVpZ2h0KSAqICh2ZG1hMS5waXRjaC8yKSkgKyAod194ICogKGJfZGVwdGggLyA4KSk7CisJCXZkbWExLmJhc2VfZXZlbiA9IGJhc2UgKyAoKHdfeSt3X2hlaWdodCkgKiAodmRtYTEucGl0Y2gvMikpICsgKHdfeCAqIChiX2RlcHRoIC8gOCkpOwogCQl2ZG1hMS5iYXNlX29kZCAgPSB2ZG1hMS5iYXNlX2V2ZW4gLSAodmRtYTEucGl0Y2ggLyAyKTsKIAkJdmRtYTEucHJvdF9hZGRyID0gdmRtYTEuYmFzZV9vZGQgLSAod19oZWlnaHQgKiAodmRtYTEucGl0Y2ggLyAyKSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92YmkuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfdmJpLmMKaW5kZXggMDYzOTg2ZS4uNDY4ZDNjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92YmkuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X3ZiaS5jCkBAIC01MDAsOSArNTAwLDkgQEAKIH0KIAogc3RydWN0IHNhYTcxNDZfdXNlX29wcyBzYWE3MTQ2X3ZiaV91b3BzID0gewotCS5pbml0IAkJPSB2YmlfaW5pdCwKLQkub3BlbiAJCT0gdmJpX29wZW4sCisJLmluaXQJCT0gdmJpX2luaXQsCisJLm9wZW4JCT0gdmJpX29wZW4sCiAJLnJlbGVhc2UJPSB2YmlfY2xvc2UsCiAJLmlycV9kb25lCT0gdmJpX2lycV9kb25lLAotCS5yZWFkIAkJPSB2YmlfcmVhZCwKKwkucmVhZAkJPSB2YmlfcmVhZCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X3ZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X3ZpZGVvLmMKaW5kZXggMWQ5NjEwMi4uN2ViYWM3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfdmlkZW8uYwpAQCAtMTUxLDggKzE1MSw4IEBACiAKIAlpZiAoVjRMMl9GSUVMRF9BTlkgPT0gZmllbGQpIHsKIAkJZmllbGQgPSAod2luLT53LmhlaWdodCA+IG1heGgvMikKLQkJICAgICAgICA/IFY0TDJfRklFTERfSU5URVJMQUNFRAotCQkgICAgICAgIDogVjRMMl9GSUVMRF9UT1A7CisJCQk/IFY0TDJfRklFTERfSU5URVJMQUNFRAorCQkJOiBWNEwyX0ZJRUxEX1RPUDsKIAkJfQogCXN3aXRjaCAoZmllbGQpIHsKIAljYXNlIFY0TDJfRklFTERfVE9QOgpAQCAtMTExNCwxMCArMTExNCw2IEBACiAJCXJldHVybiAwOwogCX0KIAljYXNlIFZJRElPQ19PVkVSTEFZOgotCi0KLQotCiAJewogCQlpbnQgb24gPSAqKGludCAqKWFyZzsKIAkJaW50IGVyciA9IDA7CkBAIC0xMzU5LDcgKzEzNTUsNiBAQAogCXNhYTcxNDZfYnVmZmVyX3F1ZXVlKGZoLT5kZXYsJnZ2LT52aWRlb19xLGJ1Zik7CiB9CiAKLQogc3RhdGljIHZvaWQgYnVmZmVyX3JlbGVhc2Uoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IHEtPnByaXZfZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1mZS10dW5lci5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWZlLXR1bmVyLmMKaW5kZXggMjFhOTA0NS4uMGI5NDBlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWZlLXR1bmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWZlLXR1bmVyLmMKQEAgLTI5OCw3ICsyOTgsNyBAQAogfQogCiBzdGF0aWMgaW50IGxnZHQzMzAzX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCi0JCSAgICAgICAgICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQorCQkJICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQogewogCXN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMgPSBmZS0+ZHZiLT5wcml2OwogCXU4IGJ1Zls0XTsKQEAgLTQ4NSwxMiArNDg1LDE2IEBACiAvKiB0cnkgdG8gZmlndXJlIG91dCB0aGUgZnJvbnRlbmQsIGVhY2ggY2FyZC9ib3ggY2FuIGhhdmUgb24gb2YgdGhlIGZvbGxvd2luZyBsaXN0ICovCiBpbnQgZmxleGNvcF9mcm9udGVuZF9pbml0KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMpCiB7CisJc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgKm9wczsKKwogCS8qIHRyeSB0aGUgc2t5IHYyLjYgKHN0djAyOTkvU2Ftc3VuZyB0Ym11MjQxMTIoc2wxOTM1KSkgKi8KIAlpZiAoKGZjLT5mZSA9IHN0djAyOTlfYXR0YWNoKCZzYW1zdW5nX3RibXUyNDExMl9jb25maWcsICZmYy0+aTJjX2FkYXApKSAhPSBOVUxMKSB7Ci0JCWZjLT5mZS0+b3BzLT5zZXRfdm9sdGFnZSA9IGZsZXhjb3Bfc2V0X3ZvbHRhZ2U7CisJCW9wcyA9IGZjLT5mZS0+b3BzOwogCi0JCWZjLT5mZV9zbGVlcCAgICAgICAgICAgICA9IGZjLT5mZS0+b3BzLT5zbGVlcDsKLQkJZmMtPmZlLT5vcHMtPnNsZWVwICAgICAgID0gZmxleGNvcF9zbGVlcDsKKwkJb3BzLT5zZXRfdm9sdGFnZSA9IGZsZXhjb3Bfc2V0X3ZvbHRhZ2U7CisKKwkJZmMtPmZlX3NsZWVwICAgICAgICAgICAgID0gb3BzLT5zbGVlcDsKKwkJb3BzLT5zbGVlcCAgICAgICAgICAgICAgID0gZmxleGNvcF9zbGVlcDsKIAogCQlmYy0+ZGV2X3R5cGUgICAgICAgICAgPSBGQ19TS1k7CiAJCWluZm8oImZvdW5kIHRoZSBzdHYwMjk5IGF0IGkyYyBhZGRyZXNzOiAweCUwMngiLHNhbXN1bmdfdGJtdTI0MTEyX2NvbmZpZy5kZW1vZF9hZGRyZXNzKTsKQEAgLTUyMiwxNSArNTI2LDE3IEBACiAJfSBlbHNlCiAJLyogdHJ5IHRoZSBza3kgdjIuMyAodnAzMTAvU2Ftc3VuZyB0YmR1MTgxMzIodHNhNTA1OSkpICovCiAJaWYgKChmYy0+ZmUgPSB2cDMxMF9hdHRhY2goJnNreXN0YXIyM19zYW1zdW5nX3RiZHUxODEzMl9jb25maWcsICZmYy0+aTJjX2FkYXApKSAhPSBOVUxMKSB7Ci0JCWZjLT5mZS0+b3BzLT5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gZmxleGNvcF9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kOwotCQlmYy0+ZmUtPm9wcy0+ZGlzZXFjX3NlbmRfYnVyc3QgICAgICA9IGZsZXhjb3BfZGlzZXFjX3NlbmRfYnVyc3Q7Ci0JCWZjLT5mZS0+b3BzLT5zZXRfdG9uZSAgICAgICAgICAgICAgID0gZmxleGNvcF9zZXRfdG9uZTsKLQkJZmMtPmZlLT5vcHMtPnNldF92b2x0YWdlICAgICAgICAgICAgPSBmbGV4Y29wX3NldF92b2x0YWdlOworCQlvcHMgPSBmYy0+ZmUtPm9wczsKIAotCQlmYy0+ZmVfc2xlZXAgICAgICAgICAgICAgICAgICAgICAgICA9IGZjLT5mZS0+b3BzLT5zbGVlcDsKLQkJZmMtPmZlLT5vcHMtPnNsZWVwICAgICAgICAgICAgICAgICAgPSBmbGV4Y29wX3NsZWVwOworCQlvcHMtPmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBmbGV4Y29wX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQ7CisJCW9wcy0+ZGlzZXFjX3NlbmRfYnVyc3QgICAgICA9IGZsZXhjb3BfZGlzZXFjX3NlbmRfYnVyc3Q7CisJCW9wcy0+c2V0X3RvbmUgICAgICAgICAgICAgICA9IGZsZXhjb3Bfc2V0X3RvbmU7CisJCW9wcy0+c2V0X3ZvbHRhZ2UgICAgICAgICAgICA9IGZsZXhjb3Bfc2V0X3ZvbHRhZ2U7CiAKLQkJZmMtPmRldl90eXBlICAgICAgICAgICAgICAgICAgICAgICAgPSBGQ19TS1lfT0xEOworCQlmYy0+ZmVfc2xlZXAgICAgICAgICAgICAgICAgPSBvcHMtPnNsZWVwOworCQlvcHMtPnNsZWVwICAgICAgICAgICAgICAgICAgPSBmbGV4Y29wX3NsZWVwOworCisJCWZjLT5kZXZfdHlwZSAgICAgICAgICAgICAgICA9IEZDX1NLWV9PTEQ7CiAJCWluZm8oImZvdW5kIHRoZSB2cDMxMCAoYWthIG10MzEyKSBhdCBpMmMgYWRkcmVzczogMHglMDJ4Iixza3lzdGFyMjNfc2Ftc3VuZ190YmR1MTgxMzJfY29uZmlnLmRlbW9kX2FkZHJlc3MpOwogCX0KIApAQCAtNTQwLDggKzU0Niw5IEBACiAJfSBlbHNlIHsKIAkJaWYgKGR2Yl9yZWdpc3Rlcl9mcm9udGVuZCgmZmMtPmR2Yl9hZGFwdGVyLCBmYy0+ZmUpKSB7CiAJCQllcnIoImZyb250ZW5kIHJlZ2lzdHJhdGlvbiBmYWlsZWQhIik7Ci0JCQlpZiAoZmMtPmZlLT5vcHMtPnJlbGVhc2UgIT0gTlVMTCkKLQkJCQlmYy0+ZmUtPm9wcy0+cmVsZWFzZShmYy0+ZmUpOworCQkJb3BzID0gZmMtPmZlLT5vcHM7CisJCQlpZiAob3BzLT5yZWxlYXNlICE9IE5VTEwpCisJCQkJb3BzLT5yZWxlYXNlKGZjLT5mZSk7CiAJCQlmYy0+ZmUgPSBOVUxMOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1yZWcuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1yZWcuaAppbmRleCAyM2NjNjQzLi4zMTUzZjk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcmVnLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXJlZy5oCkBAIC0zOSwxMSArMzksMTMgQEAKIC8qIEZsZXhDb3AgSUJJIFJlZ2lzdGVycyAqLwogI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQogCSNpbmNsdWRlICJmbGV4Y29wX2liaV92YWx1ZV9sZS5oIgotI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisjZWxzZQorI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQogCSNpbmNsdWRlICJmbGV4Y29wX2liaV92YWx1ZV9iZS5oIgogI2Vsc2UKIAkjZXJyb3Igbm8gZW5kaWFuIGRlZmluZWQKICNlbmRpZgorI2VuZGlmCiAKICNkZWZpbmUgZmNfZGF0YV9UYWdfSURfRFZCICAweDNlCiAjZGVmaW5lIGZjX2RhdGFfVGFnX0lEX0FUU0MgMHgzZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AuYwppbmRleCAxMjNlZDk2Li41NmJhNTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AuYwpAQCAtMjIwLDIwICsyMjAsMTggQEAKIHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmxleGNvcF9kZXZpY2Vfa21hbGxvYyhzaXplX3QgYnVzX3NwZWNpZmljX2xlbikKIHsKIAl2b2lkICpidXM7Ci0Jc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmbGV4Y29wX2RldmljZSksIEdGUF9LRVJORUwpOworCXN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZmxleGNvcF9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZjKSB7CiAJCWVycigibm8gbWVtb3J5Iik7CiAJCXJldHVybiBOVUxMOwogCX0KLQltZW1zZXQoZmMsIDAsIHNpemVvZihzdHJ1Y3QgZmxleGNvcF9kZXZpY2UpKTsKIAotCWJ1cyA9IGttYWxsb2MoYnVzX3NwZWNpZmljX2xlbiwgR0ZQX0tFUk5FTCk7CisJYnVzID0ga3phbGxvYyhidXNfc3BlY2lmaWNfbGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1cykgewogCQllcnIoIm5vIG1lbW9yeSIpOwogCQlrZnJlZShmYyk7CiAJCXJldHVybiBOVUxMOwogCX0KLQltZW1zZXQoYnVzLCAwLCBidXNfc3BlY2lmaWNfbGVuKTsKIAogCWZjLT5idXNfc3BlY2lmaWMgPSBidXM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2J0ODc4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9idDg3OC5jCmluZGV4IGYyOTU3MTQuLmEwNGJiNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2J0ODc4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvYnQ4NzguYwpAQCAtNTQyLDcgKzU0Miw3IEBACiAgICAgICAucmVtb3ZlCT0gYnQ4NzhfcmVtb3ZlLAogfTsKIAotc3RhdGljIGludCBidDg3OF9wY2lfZHJpdmVyX3JlZ2lzdGVyZWQgPSAwOworc3RhdGljIGludCBidDg3OF9wY2lfZHJpdmVyX3JlZ2lzdGVyZWQ7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogTW9kdWxlIG1hbmFnZW1lbnQgZnVuY3Rpb25zICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3QuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdC5jCmluZGV4IDg5NzdjN2EuLjNhMmZmMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdC5jCkBAIC0xMzQxLDMwICsxMzQxLDQwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHN0X3NldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQorc3RhdGljIGludCBkc3Rfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCQkJICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgbW9kZV9mbGFncywKKwkJCSAgICBpbnQgKmRlbGF5LAorCQkJICAgIGZlX3N0YXR1c190ICpzdGF0dXMpCiB7CiAJc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAotCWRzdF9zZXRfZnJlcShzdGF0ZSwgcC0+ZnJlcXVlbmN5KTsKLQlkcHJpbnRrKHZlcmJvc2UsIERTVF9ERUJVRywgMSwgIlNldCBGcmVxdWVuY3k9WyVkXSIsIHAtPmZyZXF1ZW5jeSk7CisJaWYgKHAgIT0gTlVMTCkgeworCQlkc3Rfc2V0X2ZyZXEoc3RhdGUsIHAtPmZyZXF1ZW5jeSk7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0RFQlVHLCAxLCAiU2V0IEZyZXF1ZW5jeT1bJWRdIiwgcC0+ZnJlcXVlbmN5KTsKIAotCWlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfU0FUKSB7Ci0JCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19PQlNfUkVHUykKLQkJCWRzdF9zZXRfaW52ZXJzaW9uKHN0YXRlLCBwLT5pbnZlcnNpb24pOwotCQlkc3Rfc2V0X2ZlYyhzdGF0ZSwgcC0+dS5xcHNrLmZlY19pbm5lcik7Ci0JCWRzdF9zZXRfc3ltYm9scmF0ZShzdGF0ZSwgcC0+dS5xcHNrLnN5bWJvbF9yYXRlKTsKLQkJZHN0X3NldF9wb2xhcml6YXRpb24oc3RhdGUpOwotCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9ERUJVRywgMSwgIlNldCBTeW1ib2xyYXRlPVslZF0iLCBwLT51LnFwc2suc3ltYm9sX3JhdGUpOworCQlpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1NBVCkgeworCQkJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX09CU19SRUdTKQorCQkJCWRzdF9zZXRfaW52ZXJzaW9uKHN0YXRlLCBwLT5pbnZlcnNpb24pOworCQkJZHN0X3NldF9mZWMoc3RhdGUsIHAtPnUucXBzay5mZWNfaW5uZXIpOworCQkJZHN0X3NldF9zeW1ib2xyYXRlKHN0YXRlLCBwLT51LnFwc2suc3ltYm9sX3JhdGUpOworCQkJZHN0X3NldF9wb2xhcml6YXRpb24oc3RhdGUpOworCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfREVCVUcsIDEsICJTZXQgU3ltYm9scmF0ZT1bJWRdIiwgcC0+dS5xcHNrLnN5bWJvbF9yYXRlKTsKIAotCX0gZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1RFUlIpCi0JCWRzdF9zZXRfYmFuZHdpZHRoKHN0YXRlLCBwLT51Lm9mZG0uYmFuZHdpZHRoKTsKLQllbHNlIGlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfQ0FCTEUpIHsKLQkJZHN0X3NldF9mZWMoc3RhdGUsIHAtPnUucWFtLmZlY19pbm5lcik7Ci0JCWRzdF9zZXRfc3ltYm9scmF0ZShzdGF0ZSwgcC0+dS5xYW0uc3ltYm9sX3JhdGUpOwotCQlkc3Rfc2V0X21vZHVsYXRpb24oc3RhdGUsIHAtPnUucWFtLm1vZHVsYXRpb24pOworCQl9IGVsc2UgaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19URVJSKQorCQkJZHN0X3NldF9iYW5kd2lkdGgoc3RhdGUsIHAtPnUub2ZkbS5iYW5kd2lkdGgpOworCQllbHNlIGlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfQ0FCTEUpIHsKKwkJCWRzdF9zZXRfZmVjKHN0YXRlLCBwLT51LnFhbS5mZWNfaW5uZXIpOworCQkJZHN0X3NldF9zeW1ib2xyYXRlKHN0YXRlLCBwLT51LnFhbS5zeW1ib2xfcmF0ZSk7CisJCQlkc3Rfc2V0X21vZHVsYXRpb24oc3RhdGUsIHAtPnUucWFtLm1vZHVsYXRpb24pOworCQl9CisJCWRzdF93cml0ZV90dW5hKGZlKTsKIAl9Ci0JZHN0X3dyaXRlX3R1bmEoZmUpOwogCisJaWYgKCEobW9kZV9mbGFncyAmIEZFX1RVTkVfTU9ERV9PTkVTSE9UKSkKKwkJZHN0X3JlYWRfc3RhdHVzKGZlLCBzdGF0dXMpOworCisJKmRlbGF5ID0gSFovMTA7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0NDUsNyArMTQ1NSw3IEBACiAKIAkucmVsZWFzZSA9IGRzdF9yZWxlYXNlLAogCS5pbml0ID0gZHN0X2luaXQsCi0JLnNldF9mcm9udGVuZCA9IGRzdF9zZXRfZnJvbnRlbmQsCisJLnR1bmUgPSBkc3Rfc2V0X2Zyb250ZW5kLAogCS5nZXRfZnJvbnRlbmQgPSBkc3RfZ2V0X2Zyb250ZW5kLAogCS5yZWFkX3N0YXR1cyA9IGRzdF9yZWFkX3N0YXR1cywKIAkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBkc3RfcmVhZF9zaWduYWxfc3RyZW5ndGgsCkBAIC0xNDY5LDcgKzE0NzksNyBAQAogCiAJLnJlbGVhc2UgPSBkc3RfcmVsZWFzZSwKIAkuaW5pdCA9IGRzdF9pbml0LAotCS5zZXRfZnJvbnRlbmQgPSBkc3Rfc2V0X2Zyb250ZW5kLAorCS50dW5lID0gZHN0X3NldF9mcm9udGVuZCwKIAkuZ2V0X2Zyb250ZW5kID0gZHN0X2dldF9mcm9udGVuZCwKIAkucmVhZF9zdGF0dXMgPSBkc3RfcmVhZF9zdGF0dXMsCiAJLnJlYWRfc2lnbmFsX3N0cmVuZ3RoID0gZHN0X3JlYWRfc2lnbmFsX3N0cmVuZ3RoLApAQCAtMTQ5Niw3ICsxNTA2LDcgQEAKIAogCS5yZWxlYXNlID0gZHN0X3JlbGVhc2UsCiAJLmluaXQgPSBkc3RfaW5pdCwKLQkuc2V0X2Zyb250ZW5kID0gZHN0X3NldF9mcm9udGVuZCwKKwkudHVuZSA9IGRzdF9zZXRfZnJvbnRlbmQsCiAJLmdldF9mcm9udGVuZCA9IGRzdF9nZXRfZnJvbnRlbmQsCiAJLnJlYWRfc3RhdHVzID0gZHN0X3JlYWRfc3RhdHVzLAogCS5yZWFkX3NpZ25hbF9zdHJlbmd0aCA9IGRzdF9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jYS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NhLmMKaW5kZXggMjIzOTY1MS4uYzY1MGI0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NhLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NhLmMKQEAgLTI4MywxNiArMjgzLDE3IEBACiAJCWh3X2J1ZmZlci0+bXNnWzRdID0gMHgwMzsKIAkJaHdfYnVmZmVyLT5tc2dbNV0gPSBsZW5ndGggJiAweGZmOwogCQlod19idWZmZXItPm1zZ1s2XSA9IDB4MDA7CisKIAkJLyoKIAkJICoJTmVlZCB0byBjb21wdXRlIGxlbmd0aCBmb3IgRU41MDIyMSBzZWN0aW9uIDguMy4yLCBmb3IgdGhlIHRpbWUgYmVpbmcKIAkJICoJYXNzdW1pbmcgOC4zLjIgaXMgbm90IGFwcGxpY2FibGUKIAkJICovCiAJCW1lbWNweSgmaHdfYnVmZmVyLT5tc2dbN10sICZwX2NhX21lc3NhZ2UtPm1zZ1s0XSwgbGVuZ3RoKTsKIAl9CisKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgaW50IHdyaXRlX3RvXzg4MjAoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBjYV9tc2cgKmh3X2J1ZmZlciwgdTggbGVuZ3RoLCB1OCByZXBseSkKIHsKIAlpZiAoKGRzdF9wdXRfY2koc3RhdGUsIGh3X2J1ZmZlci0+bXNnLCBsZW5ndGgsIGh3X2J1ZmZlci0+bXNnLCByZXBseSkpIDwgMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYwppbmRleCA3Nzk3N2U5Li5lYTI3YjE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYwpAQCAtNjAwLDcgKzYwMCw2IEBACiAJc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUgPSBOVUxMOwogCiAJc3dpdGNoKHR5cGUpIHsKLSNpZmRlZiBCVFRWX0JPQVJEX0RWSUNPX0RWQlRfTElURQogCWNhc2UgQlRUVl9CT0FSRF9EVklDT19EVkJUX0xJVEU6CiAJCWNhcmQtPmZlID0gbXQzNTJfYXR0YWNoKCZ0aG9tc29uX2R0dDc1NzlfY29uZmlnLCBjYXJkLT5pMmNfYWRhcHRlcik7CiAJCWlmIChjYXJkLT5mZSAhPSBOVUxMKSB7CkBAIC02MDgsMjIgKzYwNywxNSBAQAogCQkJY2FyZC0+ZmUtPm9wcy0+aW5mby5mcmVxdWVuY3lfbWF4ID0gODYyMDAwMDAwOwogCQl9CiAJCWJyZWFrOwotI2VuZGlmCiAKLSNpZmRlZiBCVFRWX0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfNV9MSVRFCiAJY2FzZSBCVFRWX0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfNV9MSVRFOgogCQlsZ2R0MzMweF9yZXNldChjYXJkKTsKIAkJY2FyZC0+ZmUgPSBsZ2R0MzMweF9hdHRhY2goJnRkdnNfdHVhNjAzNF9jb25maWcsIGNhcmQtPmkyY19hZGFwdGVyKTsKIAkJaWYgKGNhcmQtPmZlICE9IE5VTEwpCiAJCQlkcHJpbnRrICgiZHZiX2J0OHh4OiBsZ2R0MzMweCBkZXRlY3RlZFxuIik7CiAJCWJyZWFrOwotI2VuZGlmCiAKLSNpZmRlZiBCVFRWX0JPQVJEX1RXSU5IQU5fVlAzMDIxCi0JY2FzZSBCVFRWX0JPQVJEX1RXSU5IQU5fVlAzMDIxOgotI2Vsc2UKIAljYXNlIEJUVFZfQk9BUkRfTkVCVUxBX0RJR0lUVjoKLSNlbmRpZgogCQkvKgogCQkgKiBJdCBpcyBwb3NzaWJsZSB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgZnJvbnRlbmQgdXNpbmcgdGhlIEkyQyBidXMgKHNlZSB0aGUgTmVidWxhIFNESyk7CiAJCSAqIHRoaXMgd291bGQgYmUgYSBjbGVhbmVyIHNvbHV0aW9uIHRoYW4gdHJ5aW5nIGVhY2ggZnJvbnRlbmQgaW4gdHVybi4KQEAgLTc4NywxNyArNzc5LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHZiX2J0OHh4X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgZHZiX2J0OHh4X3Byb2JlKHN0cnVjdCBidHR2X3N1Yl9kZXZpY2UgKnN1YikKIHsKLQlzdHJ1Y3QgYnR0dl9zdWJfZGV2aWNlICpzdWIgPSB0b19idHR2X3N1Yl9kZXYoZGV2KTsKIAlzdHJ1Y3QgZHZiX2J0OHh4X2NhcmQgKmNhcmQ7CiAJc3RydWN0IHBjaV9kZXYqIGJ0dHZfcGNpX2RldjsKIAlpbnQgcmV0OwogCi0JaWYgKCEoY2FyZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkdmJfYnQ4eHhfY2FyZCksIEdGUF9LRVJORUwpKSkKKwlpZiAoIShjYXJkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGR2Yl9idDh4eF9jYXJkKSwgR0ZQX0tFUk5FTCkpKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW1lbXNldChjYXJkLCAwLCBzaXplb2YoKmNhcmQpKTsKIAlpbml0X01VVEVYKCZjYXJkLT5sb2NrKTsKIAljYXJkLT5idHR2X25yID0gc3ViLT5jb3JlLT5ucjsKIAlzdHJuY3B5KGNhcmQtPmNhcmRfbmFtZSwgc3ViLT5jb3JlLT5uYW1lLCBzaXplb2Yoc3ViLT5jb3JlLT5uYW1lKSk7CkBAIC04MTIsOSArODAyLDcgQEAKIAkJY2FyZC0+aXJxX2Vycl9pZ25vcmUgPSAwOwogCQlicmVhazsKIAotI2lmZGVmIEJUVFZfQk9BUkRfRFZJQ09fRFZCVF9MSVRFCiAJY2FzZSBCVFRWX0JPQVJEX0RWSUNPX0RWQlRfTElURToKLSNlbmRpZgogCQljYXJkLT5ncGlvX21vZGUgPSAweDA0MDBDMDYwOwogCQljYXJkLT5vcF9zeW5jX29yaW4gPSAwOwogCQljYXJkLT5pcnFfZXJyX2lnbm9yZSA9IDA7CkBAIC04MjMsMTkgKzgxMSwxMyBAQAogCQkgKiBEQV9BUFAocGFyYWxsZWwpICovCiAJCWJyZWFrOwogCi0jaWZkZWYgQlRUVl9CT0FSRF9EVklDT19GVVNJT05IRFRWXzVfTElURQogCWNhc2UgQlRUVl9CT0FSRF9EVklDT19GVVNJT05IRFRWXzVfTElURToKLSNlbmRpZgogCQljYXJkLT5ncGlvX21vZGUgPSAweDA0MDBjMDYwOwogCQljYXJkLT5vcF9zeW5jX29yaW4gPSBCVDg3OF9SSVNDX1NZTkNfTUFTSzsKIAkJY2FyZC0+aXJxX2Vycl9pZ25vcmUgPSBCVDg3OF9BRkJVUyB8IEJUODc4X0FGRFNSOwogCQlicmVhazsKIAotI2lmZGVmIEJUVFZfQk9BUkRfVFdJTkhBTl9WUDMwMjEKLQljYXNlIEJUVFZfQk9BUkRfVFdJTkhBTl9WUDMwMjE6Ci0jZWxzZQogCWNhc2UgQlRUVl9CT0FSRF9ORUJVTEFfRElHSVRWOgotI2VuZGlmCiAJY2FzZSBCVFRWX0JPQVJEX0FWRFZCVF83NjE6CiAJCWNhcmQtPmdwaW9fbW9kZSA9ICgxIDw8IDI2KSB8ICgxIDw8IDE0KSB8ICgxIDw8IDUpOwogCQljYXJkLT5vcF9zeW5jX29yaW4gPSAwOwpAQCAtOTA3LDEzICs4ODksMTMgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlkZXZfc2V0X2RydmRhdGEoZGV2LCBjYXJkKTsKKwlkZXZfc2V0X2RydmRhdGEoJnN1Yi0+ZGV2LCBjYXJkKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkdmJfYnQ4eHhfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGR2Yl9idDh4eF9yZW1vdmUoc3RydWN0IGJ0dHZfc3ViX2RldmljZSAqc3ViKQogewotCXN0cnVjdCBkdmJfYnQ4eHhfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBkdmJfYnQ4eHhfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YSgmc3ViLT5kZXYpOwogCiAJZHByaW50aygiZHZiX2J0OHh4OiB1bmxvYWRpbmcgY2FyZCVkXG4iLCBjYXJkLT5idHR2X25yKTsKIApAQCAtOTI5LDIxICs5MTEsMTkgQEAKIAlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZjYXJkLT5kdmJfYWRhcHRlcik7CiAKIAlrZnJlZShjYXJkKTsKLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IGJ0dHZfc3ViX2RyaXZlciBkcml2ZXIgPSB7CiAJLmRydiA9IHsKIAkJLm5hbWUJCT0gImR2Yi1idDh4eCIsCi0JCS5wcm9iZQkJPSBkdmJfYnQ4eHhfcHJvYmUsCi0JCS5yZW1vdmUJCT0gZHZiX2J0OHh4X3JlbW92ZSwKLQkJLyogRklYTUU6Ci0JCSAqIC5zaHV0ZG93bgk9IGR2Yl9idDh4eF9zaHV0ZG93biwKLQkJICogLnN1c3BlbmQJPSBkdmJfYnQ4eHhfc3VzcGVuZCwKLQkJICogLnJlc3VtZQk9IGR2Yl9idDh4eF9yZXN1bWUsCi0JCSAqLwogCX0sCisJLnByb2JlCQk9IGR2Yl9idDh4eF9wcm9iZSwKKwkucmVtb3ZlCQk9IGR2Yl9idDh4eF9yZW1vdmUsCisJLyogRklYTUU6CisJICogLnNodXRkb3duCT0gZHZiX2J0OHh4X3NodXRkb3duLAorCSAqIC5zdXNwZW5kCT0gZHZiX2J0OHh4X3N1c3BlbmQsCisJICogLnJlc3VtZQk9IGR2Yl9idDh4eF9yZXN1bWUsCisJICovCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBkdmJfYnQ4eHhfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvS2NvbmZpZwppbmRleCA3Y2Y0YzRhLi42MDE4ZmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvS2NvbmZpZwpAQCAtMjEsMzUgKzIxLDM1IEBACiBjb25maWcgRFZCX0NJTkVSR1lUMl9TVFJFQU1fVVJCX0NPVU5UCiAJaW50ICJOdW1iZXIgb2YgcXVldWVkIFVTQiBSZXF1ZXN0IEJsb2NrcyBmb3IgSGlnaHNwZWVkIFN0cmVhbSBUcmFuc2ZlcnMiCiAJZGVwZW5kcyBvbiBEVkJfQ0lORVJHWVQyX1RVTklORwotICAgICAgICBkZWZhdWx0ICIzMiIKKwlkZWZhdWx0ICIzMiIKIAloZWxwCiAJICBVU0IgUmVxdWVzdCBCbG9ja3MgZm9yIEhpZ2hzcGVlZCBTdHJlYW0gdHJhbnNmZXJzIGFyZSBzY2hlZHVsZWQgaW4KIAkgIGEgcXVldWUgZm9yIHRoZSBIb3N0IENvbnRyb2xsZXIuCiAKIAkgIFVzdWFsbHkgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYSBzYWZlIGNob2ljZS4KIAotCSAgWW91IG1heSBpbmNyZWFzZSB0aGlzIG51bWJlciBpZiB5b3UgYXJlIHVzaW5nIHRoaXMgZGV2aWNlIGluIGEgCi0JICBTZXJ2ZXIgRW52aXJvbm1lbnQgd2l0aCBtYW55IGhpZ2gtdHJhZmZpYyBVU0IgSGlnaHNwZWVkIGRldmljZXMgCisJICBZb3UgbWF5IGluY3JlYXNlIHRoaXMgbnVtYmVyIGlmIHlvdSBhcmUgdXNpbmcgdGhpcyBkZXZpY2UgaW4gYQorCSAgU2VydmVyIEVudmlyb25tZW50IHdpdGggbWFueSBoaWdoLXRyYWZmaWMgVVNCIEhpZ2hzcGVlZCBkZXZpY2VzCiAJICBzaGFyaW5nIHRoZSBzYW1lIFVTQiBidXMuCiAKIAogY29uZmlnIERWQl9DSU5FUkdZVDJfU1RSRUFNX0JVRl9TSVpFCiAJaW50ICJTaXplIG9mIFVSQiBTdHJlYW0gQnVmZmVycyBmb3IgSGlnaHNwZWVkIFRyYW5zZmVycyIKIAlkZXBlbmRzIG9uIERWQl9DSU5FUkdZVDJfVFVOSU5HCi0gICAgICAgIGRlZmF1bHQgIjUxMiIKKwlkZWZhdWx0ICI1MTIiCiAJaGVscAogCSAgU2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgbmF0aXZlIGJ1ZmZlciBzaXplIG9mIDUxMiBieXRlcy4KIAkgIERlZmF1bHQgdmFsdWUgaXMgYSBzYWZlIGNob2ljZS4KIAotCSAgWW91IG1heSBpbmNyZWFzZSB0aGlzIG51bWJlciBpZiB5b3UgYXJlIHVzaW5nIHRoaXMgZGV2aWNlIGluIGEgCi0JICBTZXJ2ZXIgRW52aXJvbm1lbnQgd2l0aCBtYW55IGhpZ2gtdHJhZmZpYyBVU0IgSGlnaHNwZWVkIGRldmljZXMgCisJICBZb3UgbWF5IGluY3JlYXNlIHRoaXMgbnVtYmVyIGlmIHlvdSBhcmUgdXNpbmcgdGhpcyBkZXZpY2UgaW4gYQorCSAgU2VydmVyIEVudmlyb25tZW50IHdpdGggbWFueSBoaWdoLXRyYWZmaWMgVVNCIEhpZ2hzcGVlZCBkZXZpY2VzCiAJICBzaGFyaW5nIHRoZSBzYW1lIFVTQiBidXMuCiAKIAogY29uZmlnIERWQl9DSU5FUkdZVDJfUVVFUllfSU5URVJWQUwKIAlpbnQgIlN0YXR1cyB1cGRhdGUgaW50ZXJ2YWwgW21pbGxpc2Vjb25kc10iCiAJZGVwZW5kcyBvbiBEVkJfQ0lORVJHWVQyX1RVTklORwotICAgICAgICBkZWZhdWx0ICIyNTAiCisJZGVmYXVsdCAiMjUwIgogCWhlbHAKIAkgIFRoaXMgaXMgdGhlIGludGVydmFsIGZvciBzdGF0dXMgcmVhZG91dHMgZnJvbSB0aGUgZGVtb2R1bGF0b3IuCiAJICBZb3UgbWF5IHRyeSBsb3dlciB2YWx1ZXMgaWYgeW91IG5lZWQgbW9yZSByZXNwb25zaXZlIHNpZ25hbCBxdWFsaXR5CkBAIC02NCw5ICs2NCw5IEBACiBjb25maWcgRFZCX0NJTkVSR1lUMl9FTkFCTEVfUkNfSU5QVVRfREVWSUNFCiAJYm9vbCAiUmVnaXN0ZXIgdGhlIG9uYm9hcmQgSVIgUmVtb3RlIENvbnRyb2wgUmVjZWl2ZXIgYXMgSW5wdXQgRGV2aWNlIgogCWRlcGVuZHMgb24gRFZCX0NJTkVSR1lUMl9UVU5JTkcKLSAgICAgICAgZGVmYXVsdCAieWVzIgorCWRlZmF1bHQgInllcyIKIAloZWxwCi0JICBFbmFibGUgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBvbmJvYXJkIEluZnJhcmVkIFJlbW90ZSAKKwkgIEVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIG9uYm9hcmQgSW5mcmFyZWQgUmVtb3RlCiAJICBDb250cm9sIFJlY2VpdmVyIGFzIExpbnV4LUlucHV0IGRldmljZS4KIAogCSAgUmlnaHQgbm93IG9ubHkgdGhlIGtleWNvZGUgdGFibGUgZm9yIHRoZSBkZWZhdWx0IFJlbW90ZSBDb250cm9sCkBAIC03Nyw3ICs3Nyw3IEBACiBjb25maWcgRFZCX0NJTkVSR1lUMl9SQ19RVUVSWV9JTlRFUlZBTAogCWludCAiSW5mcmFyZWQgUmVtb3RlIENvbnRyb2xsZXIgdXBkYXRlIGludGVydmFsIFttaWxsaXNlY29uZHNdIgogCWRlcGVuZHMgb24gRFZCX0NJTkVSR1lUMl9UVU5JTkcgJiYgRFZCX0NJTkVSR1lUMl9FTkFCTEVfUkNfSU5QVVRfREVWSUNFCi0gICAgICAgIGRlZmF1bHQgIjUwIgorCWRlZmF1bHQgIjUwIgogCWhlbHAKIAkgIElmIHlvdSBoYXZlIGEgdmVyeSBmYXN0LXJlcGVhdGluZyByZW1vdGUgY29udHJvbCB5b3UgY2FuIHRyeSBsb3dlcgogCSAgdmFsdWVzLCBmb3Igbm9ybWFsIGNvbnN1bWVyIHJlY2VpdmVycyB0aGUgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2NpbmVyZ3lUMi9jaW5lcmd5VDIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2NpbmVyZ3lUMi9jaW5lcmd5VDIuYwppbmRleCAxZDY5YmYwLi5jNGI0YzViIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvY2luZXJneVQyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL2NpbmVyZ3lUMi5jCkBAIC0xMzEsNiArMTMxLDggQEAKIAogCXdhaXRfcXVldWVfaGVhZF90IHBvbGxfd3E7CiAJaW50IHBlbmRpbmdfZmVfZXZlbnRzOworCWludCBkaXNjb25uZWN0X3BlbmRpbmc7CisJYXRvbWljX3QgaW51c2U7CiAKIAl2b2lkICpzdHJlYW1idWY7CiAJZG1hX2FkZHJfdCBzdHJlYW1idWZfZG1haGFuZGxlOwpAQCAtMzQzLDcgKzM0NSw3IEBACiAJc3RydWN0IGR2Yl9kZW11eCAqZGVtdXggPSBkdmJkbXhmZWVkLT5kZW11eDsKIAlzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSBkZW11eC0+cHJpdjsKIAotCWlmIChkb3duX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKKwlpZiAoY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcgfHwgZG93bl9pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKIAlpZiAoY2luZXJneXQyLT5zdHJlYW1pbmcgPT0gMCkKQEAgLTM1OSw3ICszNjEsNyBAQAogCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ID0gZHZiZG14ZmVlZC0+ZGVtdXg7CiAJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gZGVtdXgtPnByaXY7CiAKLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCisJaWYgKGNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nIHx8IGRvd25faW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCiAJaWYgKC0tY2luZXJneXQyLT5zdHJlYW1pbmcgPT0gMCkKQEAgLTQ3OSwyMyArNDgxLDM3IEBACiB7CiAJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSBkdmJkZXYtPnByaXY7Ci0JaW50IGVycjsKKwlpbnQgZXJyID0gLUVSRVNUQVJUU1lTOwogCi0JaWYgKChlcnIgPSBkdmJfZ2VuZXJpY19vcGVuKGlub2RlLCBmaWxlKSkpCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCisJaWYgKGNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nIHx8IGRvd25faW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCisJaWYgKChlcnIgPSBkdmJfZ2VuZXJpY19vcGVuKGlub2RlLCBmaWxlKSkpIHsKKwkJdXAoJmNpbmVyZ3l0Mi0+c2VtKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwogCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fQUNDTU9ERSkgIT0gT19SRE9OTFkpIHsKIAkJY2luZXJneXQyX3NsZWVwKGNpbmVyZ3l0MiwgMCk7CiAJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5xdWVyeV93b3JrLCBIWi8yKTsKIAl9CiAKKwlhdG9taWNfaW5jKCZjaW5lcmd5dDItPmludXNlKTsKKwogCXVwKCZjaW5lcmd5dDItPnNlbSk7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGNpbmVyZ3l0Ml91bnJlZ2lzdGVyKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikKK3sKKwlkdmJfdW5yZWdpc3Rlcl9kZXZpY2UoY2luZXJneXQyLT5mZWRldik7CisJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmY2luZXJneXQyLT5hZGFwdGVyKTsKKworCWNpbmVyZ3l0Ml9mcmVlX3N0cmVhbV91cmJzKGNpbmVyZ3l0Mik7CisJa2ZyZWUoY2luZXJneXQyKTsKK30KKwogc3RhdGljIGludCBjaW5lcmd5dDJfcmVsZWFzZSAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKQEAgLTUwNCw3ICs1MjAsNyBAQAogCWlmIChkb3duX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAotCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fQUNDTU9ERSkgIT0gT19SRE9OTFkpIHsKKwlpZiAoIWNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nICYmIChmaWxlLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSAhPSBPX1JET05MWSkgewogCQljYW5jZWxfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnF1ZXJ5X3dvcmspOwogCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCQljaW5lcmd5dDJfc2xlZXAoY2luZXJneXQyLCAxKTsKQEAgLTUxMiw2ICs1MjgsMTEgQEAKIAogCXVwKCZjaW5lcmd5dDItPnNlbSk7CiAKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmY2luZXJneXQyLT5pbnVzZSkgJiYgY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcpIHsKKwkJd2FybigiZGVsYXllZCB1bnJlZ2lzdGVyIGluIHJlbGVhc2UiKTsKKwkJY2luZXJneXQyX3VucmVnaXN0ZXIoY2luZXJneXQyKTsKKwl9CisKIAlyZXR1cm4gZHZiX2dlbmVyaWNfcmVsZWFzZShpbm9kZSwgZmlsZSk7CiB9CiAKQEAgLTUxOSw3ICs1NDAsMTQgQEAKIHsKIAlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IGR2YmRldi0+cHJpdjsKKworCWlmIChjaW5lcmd5dDItPmRpc2Nvbm5lY3RfcGVuZGluZyB8fCBkb3duX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwogCXBvbGxfd2FpdChmaWxlLCAmY2luZXJneXQyLT5wb2xsX3dxLCB3YWl0KTsKKworCXVwKCZjaW5lcmd5dDItPnNlbSk7CisKIAlyZXR1cm4gKFBPTExJTiB8IFBPTExSRE5PUk0gfCBQT0xMUFJJKTsKIH0KIApAQCAtNTY0LDEwICs1OTIsMTUgQEAKIAkJCQkoX191MTYgX191c2VyICopIGFyZyk7CiAKIAljYXNlIEZFX1JFQURfVU5DT1JSRUNURURfQkxPQ0tTOgotCQkvKiBVTkMgYXJlIGFscmVhZHkgY29udmVydGVkIHRvIGhvc3QgYnl0ZSBvcmRlci4uLiAqLwotCQlyZXR1cm4gcHV0X3VzZXIoc3RhdC0+dW5jb3JyZWN0ZWRfYmxvY2tfY291bnQsCi0JCQkJKF9fdTMyIF9fdXNlciAqKSBhcmcpOworCXsKKwkJdWludDMyX3QgdW5jX2NvdW50OwogCisJCXVuY19jb3VudCA9IHN0YXQtPnVuY29ycmVjdGVkX2Jsb2NrX2NvdW50OworCQlzdGF0LT51bmNvcnJlY3RlZF9ibG9ja19jb3VudCA9IDA7CisKKwkJLyogVU5DIGFyZSBhbHJlYWR5IGNvbnZlcnRlZCB0byBob3N0IGJ5dGUgb3JkZXIuLi4gKi8KKwkJcmV0dXJuIHB1dF91c2VyKHVuY19jb3VudCwoX191MzIgX191c2VyICopIGFyZyk7CisJfQogCWNhc2UgRkVfU0VUX0ZST05URU5EOgogCXsKIAkJc3RydWN0IGR2YnRfc2V0X3BhcmFtZXRlcnNfbXNnICpwYXJhbSA9ICZjaW5lcmd5dDItPnBhcmFtOwpAQCAtNTgwLDcgKzYxMyw3IEBACiAJCWlmIChjb3B5X2Zyb21fdXNlcigmcCwgKHZvaWQgIF9fdXNlciopIGFyZywgc2l6ZW9mKHApKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCi0JCWlmIChkb3duX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKKwkJaWYgKGNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nIHx8IGRvd25faW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQogCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogCQlwYXJhbS0+Y21kID0gQ0lORVJHWVQyX0VQMV9TRVRfVFVORVJfUEFSQU1FVEVSUzsKQEAgLTY5MSw3ICs3MjQsNyBAQAogCXN0cnVjdCBjaW5lcmd5dDJfcmNfZXZlbnQgcmNfZXZlbnRzWzEyXTsKIAlpbnQgbiwgbGVuLCBpOwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQorCWlmIChjaW5lcmd5dDItPmRpc2Nvbm5lY3RfcGVuZGluZyB8fCBkb3duX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKIAkJcmV0dXJuOwogCiAJbGVuID0gY2luZXJneXQyX2NvbW1hbmQoY2luZXJneXQyLCBidWYsIHNpemVvZihidWYpLApAQCAtNzg2LDcgKzgxOSw2IEBACiBzdGF0aWMgdm9pZCBjaW5lcmd5dDJfdW5yZWdpc3Rlcl9yYyhzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIpCiB7CiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5yY19xdWVyeV93b3JrKTsKLQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2KTsKIH0KIApAQCAtODE3LDcgKzg0OSw3IEBACiAJdWludDhfdCBsb2NrX2JpdHM7CiAJdWludDMyX3QgdW5jOwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQorCWlmIChjaW5lcmd5dDItPmRpc2Nvbm5lY3RfcGVuZGluZyB8fCBkb3duX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKIAkJcmV0dXJuOwogCiAJdW5jID0gcy0+dW5jb3JyZWN0ZWRfYmxvY2tfY291bnQ7CkBAIC05MTcsMjggKzk0OSwyNSBAQAogewogCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQotCQlyZXR1cm47CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAogCWNpbmVyZ3l0Ml91bnJlZ2lzdGVyX3JjKGNpbmVyZ3l0Mik7CiAKLQljaW5lcmd5dDItPmRlbXV4LmRteC5jbG9zZSgmY2luZXJneXQyLT5kZW11eC5kbXgpOwotCWR2Yl9uZXRfcmVsZWFzZSgmY2luZXJneXQyLT5kdmJuZXQpOwotCWR2Yl9kbXhkZXZfcmVsZWFzZSgmY2luZXJneXQyLT5kbXhkZXYpOwotCWR2Yl9kbXhfcmVsZWFzZSgmY2luZXJneXQyLT5kZW11eCk7Ci0JZHZiX3VucmVnaXN0ZXJfZGV2aWNlKGNpbmVyZ3l0Mi0+ZmVkZXYpOwotCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmNpbmVyZ3l0Mi0+YWRhcHRlcik7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5xdWVyeV93b3JrKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+cG9sbF93cSk7CiAKLQljaW5lcmd5dDJfZnJlZV9zdHJlYW1fdXJicyhjaW5lcmd5dDIpOwotCXVwKCZjaW5lcmd5dDItPnNlbSk7Ci0Ja2ZyZWUoY2luZXJneXQyKTsKKwljaW5lcmd5dDItPmRlbXV4LmRteC5jbG9zZSgmY2luZXJneXQyLT5kZW11eC5kbXgpOworCWNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nID0gMTsKKworCWlmICghYXRvbWljX3JlYWQoJmNpbmVyZ3l0Mi0+aW51c2UpKQorCQljaW5lcmd5dDJfdW5yZWdpc3RlcihjaW5lcmd5dDIpOwogfQogCiBzdGF0aWMgaW50IGNpbmVyZ3l0Ml9zdXNwZW5kIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQorCWlmIChjaW5lcmd5dDItPmRpc2Nvbm5lY3RfcGVuZGluZyB8fCBkb3duX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogCWlmIChzdGF0ZS5ldmVudCA+IFBNX0VWRU5UX09OKSB7CkBAIC05NjEsNyArOTkwLDcgQEAKIAlzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKIAlzdHJ1Y3QgZHZidF9zZXRfcGFyYW1ldGVyc19tc2cgKnBhcmFtID0gJmNpbmVyZ3l0Mi0+cGFyYW07CiAKLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCisJaWYgKGNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nIHx8IGRvd25faW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCiAJaWYgKCFjaW5lcmd5dDItPnNsZWVwaW5nKSB7CkBAIC0xMDE0LDQgKzEwNDMsMyBAQAogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJIb2xnZXIgV2FlY2h0bGVyLCBEYW5pZWwgTWFjayIpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvS2NvbmZpZwppbmRleCBhOWE3YjM0Li4xMmVlOTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL0tjb25maWcKQEAgLTUsNyArNSw3IEBACiAJaGVscAogCSAgRFZCIGNvcmUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGRldmljZSBoYW5kbGluZywgc29mdHdhcmUgZmFsbGJhY2tzIGV0Yy4KIAkgIFNheSBZIHdoZW4geW91IGhhdmUgYSBEVkIgY2FyZCBhbmQgd2FudCB0byB1c2UgaXQuIFNheSBZIGlmIHlvdXIgd2FudAotCSAgdG8gYnVpbGQgeW91ciBkcml2ZXJzIG91dHNpZGUgdGhlIGtlcm5lbCwgYnV0IG5lZWQgdGhlIERWQiBjb3JlLiBBbGwgCisJICB0byBidWlsZCB5b3VyIGRyaXZlcnMgb3V0c2lkZSB0aGUga2VybmVsLCBidXQgbmVlZCB0aGUgRFZCIGNvcmUuIEFsbAogCSAgaW4ta2VybmVsIGRyaXZlcnMgd2lsbCBzZWxlY3QgdGhpcyBhdXRvbWF0aWNhbGx5IGlmIG5lZWRlZC4KIAkgIElmIHVuc3VyZSBzYXkgTi4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9NYWtlZmlsZQppbmRleCBjNmJhYWMyLi43YWRiNTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9NYWtlZmlsZQpAQCAtMyw3ICszLDcgQEAKICMKIAogZHZiLWNvcmUtb2JqcyA9IGR2YmRldi5vIGRteGRldi5vIGR2Yl9kZW11eC5vIGR2Yl9maWx0ZXIubyBcCi0JICAgICAgICBkdmJfY2FfZW41MDIyMS5vIGR2Yl9mcm9udGVuZC5vIFwKKwkJZHZiX2NhX2VuNTAyMjEubyBkdmJfZnJvbnRlbmQubyBcCiAJCWR2Yl9uZXQubyBkdmJfcmluZ2J1ZmZlci5vCiAKIG9iai0kKENPTkZJR19EVkJfQ09SRSkgKz0gZHZiLWNvcmUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2NhX2VuNTAyMjEuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9jYV9lbjUwMjIxLmMKaW5kZXggNTk1NmMzNS4uMDAzNDdhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2NhX2VuNTAyMjEuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfY2FfZW41MDIyMS5jCkBAIC0xNjQ5LDIxICsxNjQ5LDE3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogaW5pdGlhbGlzZSB0aGUgc3lzdGVtIGRhdGEgKi8KLQlpZiAoKGNhID0KLQkgICAgIChzdHJ1Y3QgZHZiX2NhX3ByaXZhdGUgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGR2Yl9jYV9wcml2YXRlKSwKLQkJCQkJICAgICAgIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJaWYgKChjYSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkdmJfY2FfcHJpdmF0ZSksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3I7CiAJfQotCW1lbXNldChjYSwgMCwgc2l6ZW9mKHN0cnVjdCBkdmJfY2FfcHJpdmF0ZSkpOwogCWNhLT5wdWIgPSBwdWJjYTsKIAljYS0+ZmxhZ3MgPSBmbGFnczsKIAljYS0+c2xvdF9jb3VudCA9IHNsb3RfY291bnQ7Ci0JaWYgKChjYS0+c2xvdF9pbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGR2Yl9jYV9zbG90KSAqIHNsb3RfY291bnQsIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJaWYgKChjYS0+c2xvdF9pbmZvID0ga2NhbGxvYyhzbG90X2NvdW50LCBzaXplb2Yoc3RydWN0IGR2Yl9jYV9zbG90KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcjsKIAl9Ci0JbWVtc2V0KGNhLT5zbG90X2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgZHZiX2NhX3Nsb3QpICogc2xvdF9jb3VudCk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY2EtPndhaXRfcXVldWUpOwogCWNhLT50aHJlYWRfcGlkID0gMDsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYS0+dGhyZWFkX3F1ZXVlKTsKQEAgLTE3NDUsOSArMTc0MSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgY2EtPnNsb3RfY291bnQ7IGkrKykgewogCQlkdmJfY2FfZW41MDIyMV9zbG90X3NodXRkb3duKGNhLCBpKTsKLQkJaWYgKGNhLT5zbG90X2luZm9baV0ucnhfYnVmZmVyLmRhdGEgIT0gTlVMTCkgewotCQkJdmZyZWUoY2EtPnNsb3RfaW5mb1tpXS5yeF9idWZmZXIuZGF0YSk7Ci0JCX0KKwkJdmZyZWUoY2EtPnNsb3RfaW5mb1tpXS5yeF9idWZmZXIuZGF0YSk7CiAJfQogCWtmcmVlKGNhLT5zbG90X2luZm8pOwogCWR2Yl91bnJlZ2lzdGVyX2RldmljZShjYS0+ZHZiZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9maWx0ZXIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9maWx0ZXIuYwppbmRleCBjNDlmZDBiLi43NzIwMDNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZmlsdGVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2ZpbHRlci5jCkBAIC00MDksMTYgKzQwOSwxNiBAQAogCiAJaWYgKChpbmJ1Zls2XSAmIDB4YzApID09IDB4ODApeyAvKiBtcGVnMiAqLwogCQlpZiAoYnVmWzddICYgUFRTX09OTFkpCi0JCSAgICAgICAgcHRzID0gYnVmKzk7CisJCQlwdHMgPSBidWYrOTsKIAkJZWxzZSBwdHMgPSBOVUxMOwogCQlidWYgPSBpbmJ1ZiArIDkgKyBpbmJ1Zls4XTsKIAl9IGVsc2UgeyAgICAgICAgLyogbXBlZzEgKi8KIAkJZm9yIChidWYgPSBpbmJ1ZiArIDY7ICpidWYgPT0gMHhmZjsgYnVmKyspCi0JCSAgICAgICAgaWYgKGJ1ZiA9PSBpbmJ1ZiArIDYgKyAxNikgewotCQkgICAgICAgICAgICAgICAgYnJlYWs7Ci0JCSAgICAgICAgfQorCQkJaWYgKGJ1ZiA9PSBpbmJ1ZiArIDYgKyAxNikgeworCQkJCWJyZWFrOworCQkJfQogCQlpZiAoKCpidWYgJiAweGMwKSA9PSAweDQwKQotCQkgICAgICAgIGJ1ZiArPSAyOworCQkJYnVmICs9IDI7CiAJCXNraXAgPSBtcGVnMV9za2lwX3RhYmxlIFsqYnVmID4+IDRdOwogCQlpZiAoc2tpcCA9PSA1IHx8IHNraXAgPT0gMTApIHB0cyA9IGJ1ZjsKIAkJZWxzZSBwdHMgPSBOVUxMOwpAQCAtNTI5LDkgKzUyOSw5IEBACiAJcGljLT5waWN0dXJlX2hlYWRlciA9IDA7CiAJcGljLT5zZXF1ZW5jZV9oZWFkZXJfZGF0YQogCQk9ICggSU5JVF9IT1JJWk9OVEFMX1NJWkUgPDwgMjAgKQotCQkgICAgICAgIHwgKCBJTklUX1ZFUlRJQ0FMX1NJWkUgPDwgOCApCi0JCSAgICAgICAgfCAoIElOSVRfQVNQRUNUX1JBVElPIDw8IDQgKQotCQkgICAgICAgIHwgKCBJTklUX0ZSQU1FX1JBVEUgKTsKKwkJCXwgKCBJTklUX1ZFUlRJQ0FMX1NJWkUgPDwgOCApCisJCQl8ICggSU5JVF9BU1BFQ1RfUkFUSU8gPDwgNCApCisJCQl8ICggSU5JVF9GUkFNRV9SQVRFICk7CiAJcGljLT5tcGVnMV9mbGFnID0gMDsKIAlwaWMtPnZpbmZvLmhvcml6b250YWxfc2l6ZQogCQk9IElOSVRfRElTUF9IT1JJWk9OVEFMX1NJWkU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCmluZGV4IDk1ZWE1MDkuLjc3MWYzMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCkBAIC05Miw2ICs5Miw3IEBACiAKIHN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSB7CiAKKwkvKiB0aHJlYWQvZnJvbnRlbmQgdmFsdWVzICovCiAJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldjsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgcGFyYW1ldGVyczsKIAlzdHJ1Y3QgZHZiX2ZlX2V2ZW50cyBldmVudHM7CkBAIC0xMDAsMjAgKzEwMSwyNSBAQAogCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CiAJcGlkX3QgdGhyZWFkX3BpZDsKIAl1bnNpZ25lZCBsb25nIHJlbGVhc2VfamlmZmllczsKLQlpbnQgc3RhdGU7Ci0JaW50IGJlbmRpbmc7Ci0JaW50IGxuYl9kcmlmdDsKLQlpbnQgaW52ZXJzaW9uOwotCWludCBhdXRvX3N0ZXA7Ci0JaW50IGF1dG9fc3ViX3N0ZXA7Ci0JaW50IHN0YXJ0ZWRfYXV0b19zdGVwOwotCWludCBtaW5fZGVsYXk7Ci0JaW50IG1heF9kcmlmdDsKLQlpbnQgc3RlcF9zaXplOwotCWludCBleGl0OwotCWludCB3YWtldXA7CisJdW5zaWduZWQgaW50IGV4aXQ7CisJdW5zaWduZWQgaW50IHdha2V1cDsKIAlmZV9zdGF0dXNfdCBzdGF0dXM7Ci0JZmVfc2VjX3RvbmVfbW9kZV90IHRvbmU7CisJdW5zaWduZWQgbG9uZyB0dW5lX21vZGVfZmxhZ3M7CisJdW5zaWduZWQgaW50IGRlbGF5OworCisJLyogc3d6aWd6YWcgdmFsdWVzICovCisJdW5zaWduZWQgaW50IHN0YXRlOworCXVuc2lnbmVkIGludCBiZW5kaW5nOworCWludCBsbmJfZHJpZnQ7CisJdW5zaWduZWQgaW50IGludmVyc2lvbjsKKwl1bnNpZ25lZCBpbnQgYXV0b19zdGVwOworCXVuc2lnbmVkIGludCBhdXRvX3N1Yl9zdGVwOworCXVuc2lnbmVkIGludCBzdGFydGVkX2F1dG9fc3RlcDsKKwl1bnNpZ25lZCBpbnQgbWluX2RlbGF5OworCXVuc2lnbmVkIGludCBtYXhfZHJpZnQ7CisJdW5zaWduZWQgaW50IHN0ZXBfc2l6ZTsKKwlpbnQgcXVhbGl0eTsKKwl1bnNpZ25lZCBpbnQgY2hlY2tfd3JhcHBlZDsKIH07CiAKIApAQCAtMjA4LDIxICsyMTQsMjEgQEAKIAkJZmUtPm9wcy0+aW5pdChmZSk7CiB9CiAKLXN0YXRpYyB2b2lkIHVwZGF0ZV9kZWxheShpbnQgKnF1YWxpdHksIGludCAqZGVsYXksIGludCBtaW5fZGVsYXksIGludCBsb2NrZWQpCitzdGF0aWMgdm9pZCBkdmJfZnJvbnRlbmRfc3d6aWd6YWdfdXBkYXRlX2RlbGF5KHN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSAqZmVwcml2LCBpbnQgbG9ja2VkKQogewotCSAgICBpbnQgcTI7CisJaW50IHEyOwogCi0JICAgIGRwcmludGsgKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlkcHJpbnRrICgiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKLQkgICAgaWYgKGxvY2tlZCkKLQkJICAgICAgKCpxdWFsaXR5KSA9ICgqcXVhbGl0eSAqIDIyMCArIDM2KjI1NikgLyAyNTY7Ci0JICAgIGVsc2UKLQkJICAgICAgKCpxdWFsaXR5KSA9ICgqcXVhbGl0eSAqIDIyMCArIDApIC8gMjU2OworCWlmIChsb2NrZWQpCisJCShmZXByaXYtPnF1YWxpdHkpID0gKGZlcHJpdi0+cXVhbGl0eSAqIDIyMCArIDM2KjI1NikgLyAyNTY7CisJZWxzZQorCQkoZmVwcml2LT5xdWFsaXR5KSA9IChmZXByaXYtPnF1YWxpdHkgKiAyMjAgKyAwKSAvIDI1NjsKIAotCSAgICBxMiA9ICpxdWFsaXR5IC0gMTI4OwotCSAgICBxMiAqPSBxMjsKKwlxMiA9IGZlcHJpdi0+cXVhbGl0eSAtIDEyODsKKwlxMiAqPSBxMjsKIAotCSAgICAqZGVsYXkgPSBtaW5fZGVsYXkgKyBxMiAqIEhaIC8gKDEyOCoxMjgpOworCWZlcHJpdi0+ZGVsYXkgPSBmZXByaXYtPm1pbl9kZWxheSArIHEyICogSFogLyAoMTI4KjEyOCk7CiB9CiAKIC8qKgpAQCAtMjMyLDcgKzIzOCw3IEBACiAgKiBAcGFyYW0gY2hlY2tfd3JhcHBlZCBDaGVja3MgaWYgYW4gaXRlcmF0aW9uIGhhcyBjb21wbGV0ZWQuIERPIE5PVCBTRVQgT04gVEhFIEZJUlNUIEFUVEVNUFQKICAqIEByZXR1cm5zIE51bWJlciBvZiBjb21wbGV0ZSBpdGVyYXRpb25zIHRoYXQgaGF2ZSBiZWVuIHBlcmZvcm1lZC4KICAqLwotc3RhdGljIGludCBkdmJfZnJvbnRlbmRfYXV0b3R1bmUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBjaGVja193cmFwcGVkKQorc3RhdGljIGludCBkdmJfZnJvbnRlbmRfc3d6aWd6YWdfYXV0b3R1bmUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBjaGVja193cmFwcGVkKQogewogCWludCBhdXRvaW52ZXJzaW9uOwogCWludCByZWFkeSA9IDA7CkBAIC0zMjEsNiArMzI3LDEyOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBkdmJfZnJvbnRlbmRfc3d6aWd6YWcoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJZmVfc3RhdHVzX3QgczsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IGZlLT5mcm9udGVuZF9wcml2OworCisJLyogaWYgd2UndmUgZ290IG5vIHBhcmFtZXRlcnMsIGp1c3Qga2VlcCBpZGxpbmcgKi8KKwlpZiAoZmVwcml2LT5zdGF0ZSAmIEZFU1RBVEVfSURMRSkgeworCQlmZXByaXYtPmRlbGF5ID0gMypIWjsKKwkJZmVwcml2LT5xdWFsaXR5ID0gMDsKKwkJcmV0dXJuOworCX0KKworCS8qIGluIFNDQU4gbW9kZSwgd2UganVzdCBzZXQgdGhlIGZyb250ZW5kIHdoZW4gYXNrZWQgYW5kIGxlYXZlIGl0IGFsb25lICovCisJaWYgKGZlcHJpdi0+dHVuZV9tb2RlX2ZsYWdzICYgRkVfVFVORV9NT0RFX09ORVNIT1QpIHsKKwkJaWYgKGZlcHJpdi0+c3RhdGUgJiBGRVNUQVRFX1JFVFVORSkgeworCQkJaWYgKGZlLT5vcHMtPnNldF9mcm9udGVuZCkKKwkJCQlmZS0+b3BzLT5zZXRfZnJvbnRlbmQoZmUsICZmZXByaXYtPnBhcmFtZXRlcnMpOworCQkJZmVwcml2LT5zdGF0ZSA9IEZFU1RBVEVfVFVORUQ7CisJCX0KKwkJZmVwcml2LT5kZWxheSA9IDMqSFo7CisJCWZlcHJpdi0+cXVhbGl0eSA9IDA7CisJCXJldHVybjsKKwl9CisKKwkvKiBnZXQgdGhlIGZyb250ZW5kIHN0YXR1cyAqLworCWlmIChmZXByaXYtPnN0YXRlICYgRkVTVEFURV9SRVRVTkUpIHsKKwkJcyA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKGZlLT5vcHMtPnJlYWRfc3RhdHVzKQorCQkJZmUtPm9wcy0+cmVhZF9zdGF0dXMoZmUsICZzKTsKKwkJaWYgKHMgIT0gZmVwcml2LT5zdGF0dXMpIHsKKwkJCWR2Yl9mcm9udGVuZF9hZGRfZXZlbnQoZmUsIHMpOworCQkJZmVwcml2LT5zdGF0dXMgPSBzOworCQl9CisJfQorCisJLyogaWYgd2UncmUgbm90IHR1bmVkLCBhbmQgd2UgaGF2ZSBhIGxvY2ssIG1vdmUgdG8gdGhlIFRVTkVEIHN0YXRlICovCisJaWYgKChmZXByaXYtPnN0YXRlICYgRkVTVEFURV9XQUlURk9STE9DSykgJiYgKHMgJiBGRV9IQVNfTE9DSykpIHsKKwkJZHZiX2Zyb250ZW5kX3N3emlnemFnX3VwZGF0ZV9kZWxheShmZXByaXYsIHMgJiBGRV9IQVNfTE9DSyk7CisJCWZlcHJpdi0+c3RhdGUgPSBGRVNUQVRFX1RVTkVEOworCisJCS8qIGlmIHdlJ3JlIHR1bmVkLCB0aGVuIHdlIGhhdmUgZGV0ZXJtaW5lZCB0aGUgY29ycmVjdCBpbnZlcnNpb24gKi8KKwkJaWYgKCghKGZlLT5vcHMtPmluZm8uY2FwcyAmIEZFX0NBTl9JTlZFUlNJT05fQVVUTykpICYmCisJCSAgICAoZmVwcml2LT5wYXJhbWV0ZXJzLmludmVyc2lvbiA9PSBJTlZFUlNJT05fQVVUTykpIHsKKwkJCWZlcHJpdi0+cGFyYW1ldGVycy5pbnZlcnNpb24gPSBmZXByaXYtPmludmVyc2lvbjsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyogaWYgd2UgYXJlIHR1bmVkIGFscmVhZHksIGNoZWNrIHdlJ3JlIHN0aWxsIGxvY2tlZCAqLworCWlmIChmZXByaXYtPnN0YXRlICYgRkVTVEFURV9UVU5FRCkgeworCQlkdmJfZnJvbnRlbmRfc3d6aWd6YWdfdXBkYXRlX2RlbGF5KGZlcHJpdiwgcyAmIEZFX0hBU19MT0NLKTsKKworCQkvKiB3ZSdyZSB0dW5lZCwgYW5kIHRoZSBsb2NrIGlzIHN0aWxsIGdvb2QuLi4gKi8KKwkJaWYgKHMgJiBGRV9IQVNfTE9DSykgeworCQkJcmV0dXJuOworCQl9IGVsc2UgeyAvKiBpZiB3ZSBfV0VSRV8gdHVuZWQsIGJ1dCBub3cgZG9uJ3QgaGF2ZSBhIGxvY2sgKi8KKwkJCWZlcHJpdi0+c3RhdGUgPSBGRVNUQVRFX1pJR1pBR19GQVNUOworCQkJZmVwcml2LT5zdGFydGVkX2F1dG9fc3RlcCA9IGZlcHJpdi0+YXV0b19zdGVwOworCQkJZmVwcml2LT5jaGVja193cmFwcGVkID0gMDsKKwkJfQorCX0KKworCS8qIGRvbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nIGlmIHdlJ3JlIGluIHRoZSBMT1NUTE9DSyBzdGF0ZSwKKwkgKiB0aGUgZnJvbnRlbmQgaXMgc2V0IHRvIEZFX0NBTl9SRUNPVkVSLCBhbmQgdGhlIG1heF9kcmlmdCBpcyAwICovCisJaWYgKChmZXByaXYtPnN0YXRlICYgRkVTVEFURV9MT1NUTE9DSykgJiYKKwkgICAgKGZlLT5vcHMtPmluZm8uY2FwcyAmIEZFX0NBTl9SRUNPVkVSKSAmJiAoZmVwcml2LT5tYXhfZHJpZnQgPT0gMCkpIHsKKwkJZHZiX2Zyb250ZW5kX3N3emlnemFnX3VwZGF0ZV9kZWxheShmZXByaXYsIHMgJiBGRV9IQVNfTE9DSyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBkb24ndCBkbyBhbnl0aGluZyBpZiB3ZSdyZSBpbiB0aGUgRElTRVFDIHN0YXRlLCBzaW5jZSB0aGlzCisJICogbWlnaHQgYmUgc29tZW9uZSB3aXRoIGEgbW90b3JpemVkIGRpc2ggY29udHJvbGxlZCBieSBESVNFUUMuCisJICogSWYgaXRzIGFjdHVhbGx5IGEgcmUtdHVuZSwgdGhlcmUgd2lsbCBiZSBhIFNFVF9GUk9OVEVORCBzb29uIGVub3VnaC4JKi8KKwlpZiAoZmVwcml2LT5zdGF0ZSAmIEZFU1RBVEVfRElTRVFDKSB7CisJCWR2Yl9mcm9udGVuZF9zd3ppZ3phZ191cGRhdGVfZGVsYXkoZmVwcml2LCBzICYgRkVfSEFTX0xPQ0spOworCQlyZXR1cm47CisJfQorCisJLyogaWYgd2UncmUgaW4gdGhlIFJFVFVORSBzdGF0ZSwgc2V0IGV2ZXJ5dGhpbmcgdXAgZm9yIGEgYnJhbmQKKwkgKiBuZXcgc2Nhbiwga2VlcGluZyB0aGUgY3VycmVudCBpbnZlcnNpb24gc2V0dGluZywgYXMgdGhlIG5leHQKKwkgKiB0dW5lIGlzIF92ZXJ5XyBsaWtlbHkgdG8gcmVxdWlyZSB0aGUgc2FtZSAqLworCWlmIChmZXByaXYtPnN0YXRlICYgRkVTVEFURV9SRVRVTkUpIHsKKwkJZmVwcml2LT5sbmJfZHJpZnQgPSAwOworCQlmZXByaXYtPmF1dG9fc3RlcCA9IDA7CisJCWZlcHJpdi0+YXV0b19zdWJfc3RlcCA9IDA7CisJCWZlcHJpdi0+c3RhcnRlZF9hdXRvX3N0ZXAgPSAwOworCQlmZXByaXYtPmNoZWNrX3dyYXBwZWQgPSAwOworCX0KKworCS8qIGZhc3QgemlnemFnLiAqLworCWlmICgoZmVwcml2LT5zdGF0ZSAmIEZFU1RBVEVfU0VBUkNISU5HX0ZBU1QpIHx8IChmZXByaXYtPnN0YXRlICYgRkVTVEFURV9SRVRVTkUpKSB7CisJCWZlcHJpdi0+ZGVsYXkgPSBmZXByaXYtPm1pbl9kZWxheTsKKworCQkvKiBwZWZvcm0gYSB0dW5lICovCisJCWlmIChkdmJfZnJvbnRlbmRfc3d6aWd6YWdfYXV0b3R1bmUoZmUsIGZlcHJpdi0+Y2hlY2tfd3JhcHBlZCkpIHsKKwkJCS8qIE9LLCBpZiB3ZSd2ZSBydW4gb3V0IG9mIHRyaWFscyBhdCB0aGUgZmFzdCBzcGVlZC4KKwkJCSAqIERyb3AgYmFjayB0byBzbG93IGZvciB0aGUgX25leHRfIGF0dGVtcHQgKi8KKwkJCWZlcHJpdi0+c3RhdGUgPSBGRVNUQVRFX1NFQVJDSElOR19TTE9XOworCQkJZmVwcml2LT5zdGFydGVkX2F1dG9fc3RlcCA9IGZlcHJpdi0+YXV0b19zdGVwOworCQkJcmV0dXJuOworCQl9CisJCWZlcHJpdi0+Y2hlY2tfd3JhcHBlZCA9IDE7CisKKwkJLyogaWYgd2UndmUganVzdCByZXR1bmVkLCBlbnRlciB0aGUgWklHWkFHX0ZBU1Qgc3RhdGUuCisJCSAqIFRoaXMgZW5zdXJlcyB3ZSBjYW5ub3QgcmV0dXJuIGZyb20gYW4KKwkJICogRkVfU0VUX0ZST05URU5EIGlvY3RsIGJlZm9yZSB0aGUgZmlyc3QgZnJvbnRlbmQgdHVuZQorCQkgKiBvY2N1cnMgKi8KKwkJaWYgKGZlcHJpdi0+c3RhdGUgJiBGRVNUQVRFX1JFVFVORSkgeworCQkJZmVwcml2LT5zdGF0ZSA9IEZFU1RBVEVfVFVOSU5HX0ZBU1Q7CisJCX0KKwl9CisKKwkvKiBzbG93IHppZ3phZyAqLworCWlmIChmZXByaXYtPnN0YXRlICYgRkVTVEFURV9TRUFSQ0hJTkdfU0xPVykgeworCQlkdmJfZnJvbnRlbmRfc3d6aWd6YWdfdXBkYXRlX2RlbGF5KGZlcHJpdiwgcyAmIEZFX0hBU19MT0NLKTsKKworCQkvKiBOb3RlOiBkb24ndCBib3RoZXIgY2hlY2tpbmcgZm9yIHdyYXBwaW5nOyB3ZSBzdGF5IGluIHRoaXMKKwkJICogc3RhdGUgdW50aWwgd2UgZ2V0IGEgbG9jayAqLworCQlkdmJfZnJvbnRlbmRfc3d6aWd6YWdfYXV0b3R1bmUoZmUsIDApOworCX0KK30KKwogc3RhdGljIGludCBkdmJfZnJvbnRlbmRfaXNfZXhpdGluZyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IGZlLT5mcm9udGVuZF9wcml2OwpAQCAtMzMwLDcgKzQ1OSw3IEBACiAKIAlpZiAoZmVwcml2LT5kdmJkZXYtPndyaXRlcnMgPT0gMSkKIAkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZmVwcml2LT5yZWxlYXNlX2ppZmZpZXMgKwotCQkJCQlkdmJfc2h1dGRvd25fdGltZW91dCAqIEhaKSkKKwkJCQkgIGR2Yl9zaHV0ZG93bl90aW1lb3V0ICogSFopKQogCQkJcmV0dXJuIDE7CiAKIAlyZXR1cm4gMDsKQEAgLTM1NSwxOCArNDg0LDE0IEBACiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZmZXByaXYtPndhaXRfcXVldWUpOwogfQogCi0vKgotICogRklYTUU6IHVzZSBsaW51eC9rdGhyZWFkLmgKLSAqLwogc3RhdGljIGludCBkdmJfZnJvbnRlbmRfdGhyZWFkKHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUgPSBkYXRhOwogCXN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSAqZmVwcml2ID0gZmUtPmZyb250ZW5kX3ByaXY7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCWNoYXIgbmFtZSBbMTVdOwotCWludCBxdWFsaXR5ID0gMCwgZGVsYXkgPSAzKkhaOwogCWZlX3N0YXR1c190IHM7Ci0JaW50IGNoZWNrX3dyYXBwZWQgPSAwOworCXN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zOwogCiAJZHByaW50aygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTM3Nyw2ICs1MDIsOSBAQAogCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOwogCXVubG9ja19rZXJuZWwoKTsKIAorCWZlcHJpdi0+Y2hlY2tfd3JhcHBlZCA9IDA7CisJZmVwcml2LT5xdWFsaXR5ID0gMDsKKwlmZXByaXYtPmRlbGF5ID0gMypIWjsKIAlmZXByaXYtPnN0YXR1cyA9IDA7CiAJZHZiX2Zyb250ZW5kX2luaXQoZmUpOwogCWZlcHJpdi0+d2FrZXVwID0gMDsKQEAgLTM4Niw3ICs1MTQsNyBAQAogCiAJCXRpbWVvdXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChmZXByaXYtPndhaXRfcXVldWUsCiAJCQkJCQkJICAgZHZiX2Zyb250ZW5kX3Nob3VsZF93YWtldXAoZmUpLAotCQkJCQkJCSAgIGRlbGF5KTsKKwkJCQkJCQkgICBmZXByaXYtPmRlbGF5KTsKIAkJaWYgKDAgIT0gZHZiX2Zyb250ZW5kX2lzX2V4aXRpbmcoZmUpKSB7CiAJCQkvKiBnb3Qgc2lnbmFsIG9yIHF1aXR0aW5nICovCiAJCQlicmVhazsKQEAgLTM5NywxMDggKzUyNSwyMiBAQAogCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZmZXByaXYtPnNlbSkpCiAJCQlicmVhazsKIAotCQkvKiBpZiB3ZSd2ZSBnb3Qgbm8gcGFyYW1ldGVycywganVzdCBrZWVwIGlkbGluZyAqLwotCQlpZiAoZmVwcml2LT5zdGF0ZSAmIEZFU1RBVEVfSURMRSkgewotCQkJZGVsYXkgPSAzKkhaOwotCQkJcXVhbGl0eSA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQorCQkvKiBkbyBhbiBpdGVyYXRpb24gb2YgdGhlIHR1bmluZyBsb29wICovCisJCWlmIChmZS0+b3BzLT50dW5lKSB7CisJCQkvKiBoYXZlIHdlIGJlZW4gYXNrZWQgdG8gcmV0dW5lPyAqLworCQkJcGFyYW1zID0gTlVMTDsKKwkJCWlmIChmZXByaXYtPnN0YXRlICYgRkVTVEFURV9SRVRVTkUpIHsKKwkJCQlwYXJhbXMgPSAmZmVwcml2LT5wYXJhbWV0ZXJzOworCQkJCWZlcHJpdi0+c3RhdGUgPSBGRVNUQVRFX1RVTkVEOworCQkJfQogCi0JCS8qIGdldCB0aGUgZnJvbnRlbmQgc3RhdHVzICovCi0JCWlmIChmZXByaXYtPnN0YXRlICYgRkVTVEFURV9SRVRVTkUpIHsKLQkJCXMgPSAwOwotCQl9IGVsc2UgewotCQkJaWYgKGZlLT5vcHMtPnJlYWRfc3RhdHVzKQotCQkJCWZlLT5vcHMtPnJlYWRfc3RhdHVzKGZlLCAmcyk7CisJCQlmZS0+b3BzLT50dW5lKGZlLCBwYXJhbXMsIGZlcHJpdi0+dHVuZV9tb2RlX2ZsYWdzLCAmZmVwcml2LT5kZWxheSwgJnMpOwogCQkJaWYgKHMgIT0gZmVwcml2LT5zdGF0dXMpIHsKIAkJCQlkdmJfZnJvbnRlbmRfYWRkX2V2ZW50KGZlLCBzKTsKIAkJCQlmZXByaXYtPnN0YXR1cyA9IHM7CiAJCQl9Ci0JCX0KLQkJLyogaWYgd2UncmUgbm90IHR1bmVkLCBhbmQgd2UgaGF2ZSBhIGxvY2ssIG1vdmUgdG8gdGhlIFRVTkVEIHN0YXRlICovCi0JCWlmICgoZmVwcml2LT5zdGF0ZSAmIEZFU1RBVEVfV0FJVEZPUkxPQ0spICYmIChzICYgRkVfSEFTX0xPQ0spKSB7Ci0JCQl1cGRhdGVfZGVsYXkoJnF1YWxpdHksICZkZWxheSwgZmVwcml2LT5taW5fZGVsYXksIHMgJiBGRV9IQVNfTE9DSyk7Ci0JCQlmZXByaXYtPnN0YXRlID0gRkVTVEFURV9UVU5FRDsKLQotCQkJLyogaWYgd2UncmUgdHVuZWQsIHRoZW4gd2UgaGF2ZSBkZXRlcm1pbmVkIHRoZSBjb3JyZWN0IGludmVyc2lvbiAqLwotCQkJaWYgKCghKGZlLT5vcHMtPmluZm8uY2FwcyAmIEZFX0NBTl9JTlZFUlNJT05fQVVUTykpICYmCi0JCQkgICAgKGZlcHJpdi0+cGFyYW1ldGVycy5pbnZlcnNpb24gPT0gSU5WRVJTSU9OX0FVVE8pKSB7Ci0JCQkJZmVwcml2LT5wYXJhbWV0ZXJzLmludmVyc2lvbiA9IGZlcHJpdi0+aW52ZXJzaW9uOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBpZiB3ZSBhcmUgdHVuZWQgYWxyZWFkeSwgY2hlY2sgd2UncmUgc3RpbGwgbG9ja2VkICovCi0JCWlmIChmZXByaXYtPnN0YXRlICYgRkVTVEFURV9UVU5FRCkgewotCQkJdXBkYXRlX2RlbGF5KCZxdWFsaXR5LCAmZGVsYXksIGZlcHJpdi0+bWluX2RlbGF5LCBzICYgRkVfSEFTX0xPQ0spOwotCi0JCQkvKiB3ZSdyZSB0dW5lZCwgYW5kIHRoZSBsb2NrIGlzIHN0aWxsIGdvb2QuLi4gKi8KLQkJCWlmIChzICYgRkVfSEFTX0xPQ0spCi0JCQkJY29udGludWU7Ci0JCQllbHNlIHsgLyogaWYgd2UgX1dFUkVfIHR1bmVkLCBidXQgbm93IGRvbid0IGhhdmUgYSBsb2NrICovCi0JCQkJZmVwcml2LT5zdGF0ZSA9IEZFU1RBVEVfWklHWkFHX0ZBU1Q7Ci0JCQkJZmVwcml2LT5zdGFydGVkX2F1dG9fc3RlcCA9IGZlcHJpdi0+YXV0b19zdGVwOwotCQkJCWNoZWNrX3dyYXBwZWQgPSAwOwotCQkJfQotCQl9Ci0KLQkJLyogZG9uJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgaWYgd2UncmUgaW4gdGhlIExPU1RMT0NLIHN0YXRlLAotCQkgKiB0aGUgZnJvbnRlbmQgaXMgc2V0IHRvIEZFX0NBTl9SRUNPVkVSLCBhbmQgdGhlIG1heF9kcmlmdCBpcyAwICovCi0JCWlmICgoZmVwcml2LT5zdGF0ZSAmIEZFU1RBVEVfTE9TVExPQ0spICYmCi0JCSAgICAoZmUtPm9wcy0+aW5mby5jYXBzICYgRkVfQ0FOX1JFQ09WRVIpICYmIChmZXByaXYtPm1heF9kcmlmdCA9PSAwKSkgewotCQkJdXBkYXRlX2RlbGF5KCZxdWFsaXR5LCAmZGVsYXksIGZlcHJpdi0+bWluX2RlbGF5LCBzICYgRkVfSEFTX0xPQ0spOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBkb24ndCBkbyBhbnl0aGluZyBpZiB3ZSdyZSBpbiB0aGUgRElTRVFDIHN0YXRlLCBzaW5jZSB0aGlzCi0JCSAqIG1pZ2h0IGJlIHNvbWVvbmUgd2l0aCBhIG1vdG9yaXplZCBkaXNoIGNvbnRyb2xsZWQgYnkgRElTRVFDLgotCQkgKiBJZiBpdHMgYWN0dWFsbHkgYSByZS10dW5lLCB0aGVyZSB3aWxsIGJlIGEgU0VUX0ZST05URU5EIHNvb24gZW5vdWdoLgkqLwotCQlpZiAoZmVwcml2LT5zdGF0ZSAmIEZFU1RBVEVfRElTRVFDKSB7Ci0JCQl1cGRhdGVfZGVsYXkoJnF1YWxpdHksICZkZWxheSwgZmVwcml2LT5taW5fZGVsYXksIHMgJiBGRV9IQVNfTE9DSyk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIGlmIHdlJ3JlIGluIHRoZSBSRVRVTkUgc3RhdGUsIHNldCBldmVyeXRoaW5nIHVwIGZvciBhIGJyYW5kCi0JCSAqIG5ldyBzY2FuLCBrZWVwaW5nIHRoZSBjdXJyZW50IGludmVyc2lvbiBzZXR0aW5nLCBhcyB0aGUgbmV4dAotCQkgKiB0dW5lIGlzIF92ZXJ5XyBsaWtlbHkgdG8gcmVxdWlyZSB0aGUgc2FtZSAqLwotCQlpZiAoZmVwcml2LT5zdGF0ZSAmIEZFU1RBVEVfUkVUVU5FKSB7Ci0JCQlmZXByaXYtPmxuYl9kcmlmdCA9IDA7Ci0JCQlmZXByaXYtPmF1dG9fc3RlcCA9IDA7Ci0JCQlmZXByaXYtPmF1dG9fc3ViX3N0ZXAgPSAwOwotCQkJZmVwcml2LT5zdGFydGVkX2F1dG9fc3RlcCA9IDA7Ci0JCQljaGVja193cmFwcGVkID0gMDsKLQkJfQotCi0JCS8qIGZhc3QgemlnemFnLiAqLwotCQlpZiAoKGZlcHJpdi0+c3RhdGUgJiBGRVNUQVRFX1NFQVJDSElOR19GQVNUKSB8fCAoZmVwcml2LT5zdGF0ZSAmIEZFU1RBVEVfUkVUVU5FKSkgewotCQkJZGVsYXkgPSBmZXByaXYtPm1pbl9kZWxheTsKLQotCQkJLyogcGVmb3JtIGEgdHVuZSAqLwotCQkJaWYgKGR2Yl9mcm9udGVuZF9hdXRvdHVuZShmZSwgY2hlY2tfd3JhcHBlZCkpIHsKLQkJCQkvKiBPSywgaWYgd2UndmUgcnVuIG91dCBvZiB0cmlhbHMgYXQgdGhlIGZhc3Qgc3BlZWQuCi0JCQkJICogRHJvcCBiYWNrIHRvIHNsb3cgZm9yIHRoZSBfbmV4dF8gYXR0ZW1wdCAqLwotCQkJCWZlcHJpdi0+c3RhdGUgPSBGRVNUQVRFX1NFQVJDSElOR19TTE9XOwotCQkJCWZlcHJpdi0+c3RhcnRlZF9hdXRvX3N0ZXAgPSBmZXByaXYtPmF1dG9fc3RlcDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWNoZWNrX3dyYXBwZWQgPSAxOwotCi0JCQkvKiBpZiB3ZSd2ZSBqdXN0IHJldHVuZWQsIGVudGVyIHRoZSBaSUdaQUdfRkFTVCBzdGF0ZS4KLQkJCSAqIFRoaXMgZW5zdXJlcyB3ZSBjYW5ub3QgcmV0dXJuIGZyb20gYW4KLQkJCSAqIEZFX1NFVF9GUk9OVEVORCBpb2N0bCBiZWZvcmUgdGhlIGZpcnN0IGZyb250ZW5kIHR1bmUKLQkJCSAqIG9jY3VycyAqLwotCQkJaWYgKGZlcHJpdi0+c3RhdGUgJiBGRVNUQVRFX1JFVFVORSkgewotCQkJCWZlcHJpdi0+c3RhdGUgPSBGRVNUQVRFX1RVTklOR19GQVNUOwotCQkJfQotCQl9Ci0KLQkJLyogc2xvdyB6aWd6YWcgKi8KLQkJaWYgKGZlcHJpdi0+c3RhdGUgJiBGRVNUQVRFX1NFQVJDSElOR19TTE9XKSB7Ci0JCQl1cGRhdGVfZGVsYXkoJnF1YWxpdHksICZkZWxheSwgZmVwcml2LT5taW5fZGVsYXksIHMgJiBGRV9IQVNfTE9DSyk7Ci0KLQkJCS8qIE5vdGU6IGRvbid0IGJvdGhlciBjaGVja2luZyBmb3Igd3JhcHBpbmc7IHdlIHN0YXkgaW4gdGhpcwotCQkJICogc3RhdGUgdW50aWwgd2UgZ2V0IGEgbG9jayAqLwotCQkJZHZiX2Zyb250ZW5kX2F1dG90dW5lKGZlLCAwKTsKKwkJfSBlbHNlIHsKKwkJCWR2Yl9mcm9udGVuZF9zd3ppZ3phZyhmZSk7CiAJCX0KIAl9CiAKQEAgLTczMyw3ICs3NzUsNiBAQAogCQkJZXJyID0gZmUtPm9wcy0+c2V0X3RvbmUoZmUsIChmZV9zZWNfdG9uZV9tb2RlX3QpIHBhcmcpOwogCQkJZmVwcml2LT5zdGF0ZSA9IEZFU1RBVEVfRElTRVFDOwogCQkJZmVwcml2LT5zdGF0dXMgPSAwOwotCQkJZmVwcml2LT50b25lID0gKGZlX3NlY190b25lX21vZGVfdCkgcGFyZzsKIAkJfQogCQlicmVhazsKIApAQCAtNzQ3LDcgKzc4OCw3IEBACiAKIAljYXNlIEZFX0RJU0hORVRXT1JLX1NFTkRfTEVHQUNZX0NNRDoKIAkJaWYgKGZlLT5vcHMtPmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQpIHsKLQkJCWVyciA9IGZlLT5vcHMtPmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQoZmUsICh1bnNpZ25lZCBpbnQpIHBhcmcpOworCQkJZXJyID0gZmUtPm9wcy0+ZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZChmZSwgKHVuc2lnbmVkIGxvbmcpIHBhcmcpOwogCQkJZmVwcml2LT5zdGF0ZSA9IEZFU1RBVEVfRElTRVFDOwogCQkJZmVwcml2LT5zdGF0dXMgPSAwOwogCQl9IGVsc2UgaWYgKGZlLT5vcHMtPnNldF92b2x0YWdlKSB7CkBAIC03NjcsMTMgKzgwOCwxMyBAQAogCQkJICogaW5pdGlhbGl6YXRpb24sIHNvIHBhcmcgaXMgOCBiaXRzIGFuZCBkb2VzIG5vdAogCQkJICogaW5jbHVkZSB0aGUgaW5pdGlhbGl6YXRpb24gb3Igc3RhcnQgYml0CiAJCQkgKi8KLQkJCXVuc2lnbmVkIGludCBjbWQgPSAoKHVuc2lnbmVkIGludCkgcGFyZykgPDwgMTsKKwkJCXVuc2lnbmVkIGxvbmcgY21kID0gKCh1bnNpZ25lZCBsb25nKSBwYXJnKSA8PCAxOwogCQkJc3RydWN0IHRpbWV2YWwgbmV4dHRpbWU7CiAJCQlzdHJ1Y3QgdGltZXZhbCB0dlsxMF07CiAJCQlpbnQgaTsKIAkJCXU4IGxhc3QgPSAxOwogCQkJaWYgKGR2Yl9mcm9udGVuZF9kZWJ1ZykKLQkJCQlwcmludGsoIiVzIHN3aXRjaCBjb21tYW5kOiAweCUwNHhcbiIsIF9fRlVOQ1RJT05fXywgY21kKTsKKwkJCQlwcmludGsoIiVzIHN3aXRjaCBjb21tYW5kOiAweCUwNGx4XG4iLCBfX0ZVTkNUSU9OX18sIGNtZCk7CiAJCQlkb19nZXR0aW1lb2ZkYXkoJm5leHR0aW1lKTsKIAkJCWlmIChkdmJfZnJvbnRlbmRfZGVidWcpCiAJCQkJbWVtY3B5KCZ0dlswXSwgJm5leHR0aW1lLCBzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKQEAgLTgxNCw3ICs4NTUsNyBAQAogCiAJY2FzZSBGRV9FTkFCTEVfSElHSF9MTkJfVk9MVEFHRToKIAkJaWYgKGZlLT5vcHMtPmVuYWJsZV9oaWdoX2xuYl92b2x0YWdlKQotCQkJZXJyID0gZmUtPm9wcy0+ZW5hYmxlX2hpZ2hfbG5iX3ZvbHRhZ2UoZmUsIChpbnQpIHBhcmcpOworCQkJZXJyID0gZmUtPm9wcy0+ZW5hYmxlX2hpZ2hfbG5iX3ZvbHRhZ2UoZmUsIChsb25nKSBwYXJnKTsKIAkJYnJlYWs7CiAKIAljYXNlIEZFX1NFVF9GUk9OVEVORDogewpAQCAtODkxLDYgKzkzMiwxMCBAQAogCQkJZXJyID0gZmUtPm9wcy0+Z2V0X2Zyb250ZW5kKGZlLCAoc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKikgcGFyZyk7CiAJCX0KIAkJYnJlYWs7CisKKwljYXNlIEZFX1NFVF9GUk9OVEVORF9UVU5FX01PREU6CisJCWZlcHJpdi0+dHVuZV9tb2RlX2ZsYWdzID0gKHVuc2lnbmVkIGxvbmcpIHBhcmc7CisJCWJyZWFrOwogCX07CiAKIAl1cCAoJmZlcHJpdi0+c2VtKTsKQEAgLTkzMiw2ICs5NzcsOSBAQAogCiAJCS8qICBlbXB0eSBldmVudCBxdWV1ZSAqLwogCQlmZXByaXYtPmV2ZW50cy5ldmVudHIgPSBmZXByaXYtPmV2ZW50cy5ldmVudHcgPSAwOworCisJCS8qIG5vcm1hbCB0dW5lIG1vZGUgd2hlbiBvcGVuZWQgUi9XICovCisJCWZlcHJpdi0+dHVuZV9tb2RlX2ZsYWdzICY9IH5GRV9UVU5FX01PREVfT05FU0hPVDsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtOTc2LDEzICsxMDI0LDEyIEBACiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmZyb250ZW5kX211dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAotCWZlLT5mcm9udGVuZF9wcml2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CisJZmUtPmZyb250ZW5kX3ByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZmUtPmZyb250ZW5kX3ByaXYgPT0gTlVMTCkgewogCQl1cCgmZnJvbnRlbmRfbXV0ZXgpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJZmVwcml2ID0gZmUtPmZyb250ZW5kX3ByaXY7Ci0JbWVtc2V0KGZlLT5mcm9udGVuZF9wcml2LCAwLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9wcml2YXRlKSk7CiAKIAlpbml0X01VVEVYICgmZmVwcml2LT5zZW0pOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQgKCZmZXByaXYtPndhaXRfcXVldWUpOwpAQCAtOTkwLDcgKzEwMzcsNiBAQAogCWluaXRfTVVURVggKCZmZXByaXYtPmV2ZW50cy5zZW0pOwogCWZlLT5kdmIgPSBkdmI7CiAJZmVwcml2LT5pbnZlcnNpb24gPSBJTlZFUlNJT05fT0ZGOwotCWZlcHJpdi0+dG9uZSA9IFNFQ19UT05FX09GRjsKIAogCXByaW50ayAoIkRWQjogcmVnaXN0ZXJpbmcgZnJvbnRlbmQgJWkgKCVzKS4uLlxuIiwKIAkJZmUtPmR2Yi0+bnVtLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuaAppbmRleCAxZTA4NDBkLi43MGE2ZDE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuaApAQCAtNTgsMTAgKzU4LDE5IEBACiAJaW50ICgqaW5pdCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOwogCWludCAoKnNsZWVwKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7CiAKKwkvKiBpZiB0aGlzIGlzIHNldCwgaXQgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHN3emlnemFnICovCisJaW50ICgqdHVuZSkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCSAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcywKKwkJICAgIHVuc2lnbmVkIGludCBtb2RlX2ZsYWdzLAorCQkgICAgaW50ICpkZWxheSwKKwkJICAgIGZlX3N0YXR1c190ICpzdGF0dXMpOworCisJLyogdGhlc2UgdHdvIGFyZSBvbmx5IHVzZWQgZm9yIHRoZSBzd3ppZ3phZyBjb2RlICovCiAJaW50ICgqc2V0X2Zyb250ZW5kKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpOwotCWludCAoKmdldF9mcm9udGVuZCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKTsKIAlpbnQgKCpnZXRfdHVuZV9zZXR0aW5ncykoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyogc2V0dGluZ3MpOwogCisJaW50ICgqZ2V0X2Zyb250ZW5kKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpOworCiAJaW50ICgqcmVhZF9zdGF0dXMpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zdGF0dXNfdCogc3RhdHVzKTsKIAlpbnQgKCpyZWFkX2Jlcikoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiogYmVyKTsKIAlpbnQgKCpyZWFkX3NpZ25hbF9zdHJlbmd0aCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc3RyZW5ndGgpOwpAQCAtNzQsOCArODMsOSBAQAogCWludCAoKmRpc2VxY19zZW5kX2J1cnN0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX21pbmlfY21kX3QgbWluaWNtZCk7CiAJaW50ICgqc2V0X3RvbmUpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfdG9uZV9tb2RlX3QgdG9uZSk7CiAJaW50ICgqc2V0X3ZvbHRhZ2UpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfdm9sdGFnZV90IHZvbHRhZ2UpOwotCWludCAoKmVuYWJsZV9oaWdoX2xuYl92b2x0YWdlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IGFyZyk7Ci0JaW50ICgqZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHVuc2lnbmVkIGludCBjbWQpOworCWludCAoKmVuYWJsZV9oaWdoX2xuYl92b2x0YWdlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgbG9uZyBhcmcpOworCWludCAoKmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1bnNpZ25lZCBsb25nIGNtZCk7CisJaW50ICgqaTJjX2dhdGVfY3RybCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBlbmFibGUpOwogfTsKIAogI2RlZmluZSBNQVhfRVZFTlQgOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5jCmluZGV4IDg2YmJhODEuLjY3MTFlYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9uZXQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmMKQEAgLTEyMjIsNyArMTIyMiw3IEBACiAJcmV0dXJuIGlmX251bTsKIH0KIAotc3RhdGljIGludCBkdmJfbmV0X3JlbW92ZV9pZihzdHJ1Y3QgZHZiX25ldCAqZHZibmV0LCB1bnNpZ25lZCBpbnQgbnVtKQorc3RhdGljIGludCBkdmJfbmV0X3JlbW92ZV9pZihzdHJ1Y3QgZHZiX25ldCAqZHZibmV0LCB1bnNpZ25lZCBsb25nIG51bSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ID0gZHZibmV0LT5kZXZpY2VbbnVtXTsKIAlzdHJ1Y3QgZHZiX25ldF9wcml2ICpwcml2OwpAQCAtMTI5Niw5ICsxMjk2LDkgQEAKIAogCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCQlyZXR1cm4gLUVQRVJNOwotCQlpZiAoKHVuc2lnbmVkIGludCkgcGFyZyA+PSBEVkJfTkVUX0RFVklDRVNfTUFYKQorCQlpZiAoKHVuc2lnbmVkIGxvbmcpIHBhcmcgPj0gRFZCX05FVF9ERVZJQ0VTX01BWCkKIAkJCXJldHVybiAtRUlOVkFMOwotCQlyZXQgPSBkdmJfbmV0X3JlbW92ZV9pZihkdmJuZXQsICh1bnNpZ25lZCBpbnQpIHBhcmcpOworCQlyZXQgPSBkdmJfbmV0X3JlbW92ZV9pZihkdmJuZXQsICh1bnNpZ25lZCBsb25nKSBwYXJnKTsKIAkJaWYgKCFyZXQpCiAJCQltb2R1bGVfcHV0KGR2YmRldi0+YWRhcHRlci0+bW9kdWxlKTsKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9yaW5nYnVmZmVyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfcmluZ2J1ZmZlci5jCmluZGV4IDI4M2M2ZTkuLjc3YWQyNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9yaW5nYnVmZmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX3JpbmdidWZmZXIuYwpAQCAtMTEyLDEwICsxMTIsMTAgQEAKIAlzcGxpdCA9IChyYnVmLT5wcmVhZCArIGxlbiA+IHJidWYtPnNpemUpID8gcmJ1Zi0+c2l6ZSAtIHJidWYtPnByZWFkIDogMDsKIAlpZiAoc3BsaXQgPiAwKSB7CiAJCWlmICghdXNlcm1lbSkKLQkJICAgICAgICBtZW1jcHkoYnVmLCByYnVmLT5kYXRhK3JidWYtPnByZWFkLCBzcGxpdCk7CisJCQltZW1jcHkoYnVmLCByYnVmLT5kYXRhK3JidWYtPnByZWFkLCBzcGxpdCk7CiAJCWVsc2UKLQkJICAgICAgICBpZiAoY29weV90b191c2VyKGJ1ZiwgcmJ1Zi0+ZGF0YStyYnVmLT5wcmVhZCwgc3BsaXQpKQotCQkgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoY29weV90b191c2VyKGJ1ZiwgcmJ1Zi0+ZGF0YStyYnVmLT5wcmVhZCwgc3BsaXQpKQorCQkJCXJldHVybiAtRUZBVUxUOwogCQlidWYgKz0gc3BsaXQ7CiAJCXRvZG8gLT0gc3BsaXQ7CiAJCXJidWYtPnByZWFkID0gMDsKQEAgLTEyNCw3ICsxMjQsNyBAQAogCQltZW1jcHkoYnVmLCByYnVmLT5kYXRhK3JidWYtPnByZWFkLCB0b2RvKTsKIAllbHNlCiAJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCByYnVmLT5kYXRhK3JidWYtPnByZWFkLCB0b2RvKSkKLQkJICAgICAgICByZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAtRUZBVUxUOwogCiAJcmJ1Zi0+cHJlYWQgPSAocmJ1Zi0+cHJlYWQgKyB0b2RvKSAlIHJidWYtPnNpemU7CiAKQEAgLTE2Nyw3ICsxNjcsNyBAQAogfQogCiBzc2l6ZV90IGR2Yl9yaW5nYnVmZmVyX3BrdF9yZWFkKHN0cnVjdCBkdmJfcmluZ2J1ZmZlciAqcmJ1Ziwgc2l6ZV90IGlkeCwKLQkJICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIHU4KiBidWYsIHNpemVfdCBsZW4sIGludCB1c2VybWVtKQorCQkJCWludCBvZmZzZXQsIHU4KiBidWYsIHNpemVfdCBsZW4sIGludCB1c2VybWVtKQogewogCXNpemVfdCB0b2RvOwogCXNpemVfdCBzcGxpdDsKQEAgLTE4MywxMCArMTgzLDEwIEBACiAJc3BsaXQgPSAoKGlkeCArIGxlbikgPiByYnVmLT5zaXplKSA/IHJidWYtPnNpemUgLSBpZHggOiAwOwogCWlmIChzcGxpdCA+IDApIHsKIAkJaWYgKCF1c2VybWVtKQotCQkgICAgICAgIG1lbWNweShidWYsIHJidWYtPmRhdGEraWR4LCBzcGxpdCk7CisJCQltZW1jcHkoYnVmLCByYnVmLT5kYXRhK2lkeCwgc3BsaXQpOwogCQllbHNlCi0JCSAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihidWYsIHJidWYtPmRhdGEraWR4LCBzcGxpdCkpCi0JCSAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCByYnVmLT5kYXRhK2lkeCwgc3BsaXQpKQorCQkJCXJldHVybiAtRUZBVUxUOwogCQlidWYgKz0gc3BsaXQ7CiAJCXRvZG8gLT0gc3BsaXQ7CiAJCWlkeCA9IDA7CkBAIC0xOTUsNyArMTk1LDcgQEAKIAkJbWVtY3B5KGJ1ZiwgcmJ1Zi0+ZGF0YStpZHgsIHRvZG8pOwogCWVsc2UKIAkJaWYgKGNvcHlfdG9fdXNlcihidWYsIHJidWYtPmRhdGEraWR4LCB0b2RvKSkKLQkJICAgICAgICByZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAtRUZBVUxUOwogCiAJcmV0dXJuIGxlbjsKIH0KQEAgLTIwOSwxMiArMjA5LDEyIEBACiAJLy8gY2xlYW4gdXAgZGlzcG9zZWQgcGFja2V0cwogCXdoaWxlKGR2Yl9yaW5nYnVmZmVyX2F2YWlsKHJidWYpID4gRFZCX1JJTkdCVUZGRVJfUEtUSERSU0laRSkgewogCQlpZiAoRFZCX1JJTkdCVUZGRVJfUEVFSyhyYnVmLCAyKSA9PSBQS1RfRElTUE9TRUQpIHsKLQkJICAgICAgICBwa3RsZW4gPSBEVkJfUklOR0JVRkZFUl9QRUVLKHJidWYsIDApIDw8IDg7Ci0JCSAgICAgICAgcGt0bGVuIHw9IERWQl9SSU5HQlVGRkVSX1BFRUsocmJ1ZiwgMSk7Ci0JCSAgICAgICAgRFZCX1JJTkdCVUZGRVJfU0tJUChyYnVmLCBwa3RsZW4gKyBEVkJfUklOR0JVRkZFUl9QS1RIRFJTSVpFKTsKKwkJCXBrdGxlbiA9IERWQl9SSU5HQlVGRkVSX1BFRUsocmJ1ZiwgMCkgPDwgODsKKwkJCXBrdGxlbiB8PSBEVkJfUklOR0JVRkZFUl9QRUVLKHJidWYsIDEpOworCQkJRFZCX1JJTkdCVUZGRVJfU0tJUChyYnVmLCBwa3RsZW4gKyBEVkJfUklOR0JVRkZFUl9QS1RIRFJTSVpFKTsKIAkJfSBlbHNlIHsKLQkJICAgICAgICAvLyBmaXJzdCBwYWNrZXQgaXMgbm90IGRpc3Bvc2VkLCBzbyB3ZSBzdG9wIGNsZWFuaW5nIG5vdwotCQkgICAgICAgIGJyZWFrOworCQkJLy8gZmlyc3QgcGFja2V0IGlzIG5vdCBkaXNwb3NlZCwgc28gd2Ugc3RvcCBjbGVhbmluZyBub3cKKwkJCWJyZWFrOwogCQl9CiAJfQogfQpAQCAtMjQyLDggKzI0Miw4IEBACiAJCWN1cnBrdHN0YXR1cyA9IHJidWYtPmRhdGFbKGlkeCArIDIpICUgcmJ1Zi0+c2l6ZV07CiAKIAkJaWYgKGN1cnBrdHN0YXR1cyA9PSBQS1RfUkVBRFkpIHsKLQkJICAgICAgICAqcGt0bGVuID0gY3VycGt0bGVuOwotCQkgICAgICAgIHJldHVybiBpZHg7CisJCQkqcGt0bGVuID0gY3VycGt0bGVuOworCQkJcmV0dXJuIGlkeDsKIAkJfQogCiAJCWNvbnN1bWVkICs9IGN1cnBrdGxlbiArIERWQl9SSU5HQlVGRkVSX1BLVEhEUlNJWkU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfcmluZ2J1ZmZlci5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX3JpbmdidWZmZXIuaAppbmRleCBmYTQ3NmY2Li42ZDI1NjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfcmluZ2J1ZmZlci5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9yaW5nYnVmZmVyLmgKQEAgLTEwNiw3ICsxMDYsNyBAQAogKiogcmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgb3IgLUVGQVVMVAogKi8KIGV4dGVybiBzc2l6ZV90IGR2Yl9yaW5nYnVmZmVyX3JlYWQoc3RydWN0IGR2Yl9yaW5nYnVmZmVyICpyYnVmLCB1OCAqYnVmLAotCQkgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiwgaW50IHVzZXJtZW0pOworCQkJCSAgIHNpemVfdCBsZW4sIGludCB1c2VybWVtKTsKIAogCiAvKiB3cml0ZSByb3V0aW5lcyAmIG1hY3JvcyAqLwpAQCAtMTIxLDcgKzEyMSw3IEBACiAqKiByZXR1cm5zIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCBvciAtRUZBVUxUCiAqLwogZXh0ZXJuIHNzaXplX3QgZHZiX3JpbmdidWZmZXJfd3JpdGUoc3RydWN0IGR2Yl9yaW5nYnVmZmVyICpyYnVmLCBjb25zdCB1OCAqYnVmLAotCQkgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pOworCQkJCSAgICBzaXplX3QgbGVuKTsKIAogCiAvKioKQEAgLTEzMyw3ICsxMzMsNyBAQAogICogcmV0dXJucyBOdW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgb3IgLUVGQVVMVCwgLUVOT01FTSwgLUVWSU5BTC4KICAqLwogZXh0ZXJuIHNzaXplX3QgZHZiX3JpbmdidWZmZXJfcGt0X3dyaXRlKHN0cnVjdCBkdmJfcmluZ2J1ZmZlciAqcmJ1ZiwgdTgqIGJ1ZiwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbik7CisJCQkJCXNpemVfdCBsZW4pOwogCiAvKioKICAqIFJlYWQgZnJvbSBhIHBhY2tldCBpbiB0aGUgcmluZ2J1ZmZlci4gTm90ZTogdW5saWtlIGR2Yl9yaW5nYnVmZmVyX3JlYWQoKSwgdGhpcwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAgKiByZXR1cm5zIE51bWJlciBvZiBieXRlcyByZWFkLCBvciAtRUZBVUxULgogICovCiBleHRlcm4gc3NpemVfdCBkdmJfcmluZ2J1ZmZlcl9wa3RfcmVhZChzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgKnJidWYsIHNpemVfdCBpZHgsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgdTgqIGJ1Ziwgc2l6ZV90IGxlbiwgaW50IHVzZXJtZW0pOworCQkJCSAgICAgICBpbnQgb2Zmc2V0LCB1OCogYnVmLCBzaXplX3QgbGVuLCBpbnQgdXNlcm1lbSk7CiAKIC8qKgogICogRGlzcG9zZSBvZiBhIHBhY2tldCBpbiB0aGUgcmluZyBidWZmZXIuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5jCmluZGV4IGE0YWVlODYuLjU0ZjhiOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5jCkBAIC0zMyw3ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgImR2YmRldi5oIgogCiBzdGF0aWMgaW50IGR2YmRldl9kZWJ1ZzsKQEAgLTQ0LDcgKzQ0LDcgQEAKICNkZWZpbmUgZHByaW50ayBpZiAoZHZiZGV2X2RlYnVnKSBwcmludGsKIAogc3RhdGljIExJU1RfSEVBRChkdmJfYWRhcHRlcl9saXN0KTsKLXN0YXRpYyBERUNMQVJFX01VVEVYKGR2YmRldl9yZWdpc3Rlcl9sb2NrKTsKK3N0YXRpYyBERUZJTkVfTVVURVgoZHZiZGV2X3JlZ2lzdGVyX2xvY2spOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRuYW1lc1tdID0gewogCSJ2aWRlbyIsICJhdWRpbyIsICJzZWMiLCAiZnJvbnRlbmQiLCAiZGVtdXgiLCAiZHZyIiwgImNhIiwKQEAgLTkyLDEwICs5MiwxMCBAQAogCQlvbGRfZm9wcyA9IGZpbGUtPmZfb3A7CiAJCWZpbGUtPmZfb3AgPSBmb3BzX2dldChkdmJkZXYtPmZvcHMpOwogCQlpZihmaWxlLT5mX29wLT5vcGVuKQotCQkgICAgICAgIGVyciA9IGZpbGUtPmZfb3AtPm9wZW4oaW5vZGUsZmlsZSk7CisJCQllcnIgPSBmaWxlLT5mX29wLT5vcGVuKGlub2RlLGZpbGUpOwogCQlpZiAoZXJyKSB7Ci0JCSAgICAgICAgZm9wc19wdXQoZmlsZS0+Zl9vcCk7Ci0JCSAgICAgICAgZmlsZS0+Zl9vcCA9IGZvcHNfZ2V0KG9sZF9mb3BzKTsKKwkJCWZvcHNfcHV0KGZpbGUtPmZfb3ApOworCQkJZmlsZS0+Zl9vcCA9IGZvcHNfZ2V0KG9sZF9mb3BzKTsKIAkJfQogCQlmb3BzX3B1dChvbGRfZm9wcyk7CiAJCXJldHVybiBlcnI7CkBAIC0yMDIsMTEgKzIwMiwxMSBAQAogCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXY7CiAJaW50IGlkOwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmR2YmRldl9yZWdpc3Rlcl9sb2NrKSkKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkdmJkZXZfcmVnaXN0ZXJfbG9jaykpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKIAlpZiAoKGlkID0gZHZiZGV2X2dldF9mcmVlX2lkIChhZGFwLCB0eXBlKSkgPCAwKSB7Ci0JCXVwICgmZHZiZGV2X3JlZ2lzdGVyX2xvY2spOworCQltdXRleF91bmxvY2soJmR2YmRldl9yZWdpc3Rlcl9sb2NrKTsKIAkJKnBkdmJkZXYgPSBOVUxMOwogCQlwcmludGsgKCIlczogY291bGQgZ2V0IGZpbmQgZnJlZSBkZXZpY2UgaWQuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRU5GSUxFOwpAQCAtMjE1LDExICsyMTUsMTEgQEAKIAkqcGR2YmRldiA9IGR2YmRldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkdmJfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIWR2YmRldikgewotCQl1cCgmZHZiZGV2X3JlZ2lzdGVyX2xvY2spOworCQltdXRleF91bmxvY2soJmR2YmRldl9yZWdpc3Rlcl9sb2NrKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JdXAgKCZkdmJkZXZfcmVnaXN0ZXJfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZkdmJkZXZfcmVnaXN0ZXJfbG9jayk7CiAKIAltZW1jcHkoZHZiZGV2LCB0ZW1wbGF0ZSwgc2l6ZW9mKHN0cnVjdCBkdmJfZGV2aWNlKSk7CiAJZHZiZGV2LT50eXBlID0gdHlwZTsKQEAgLTI4OSwxMSArMjg5LDExIEBACiB7CiAJaW50IG51bTsKIAotCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZkdmJkZXZfcmVnaXN0ZXJfbG9jaykpCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZHZiZGV2X3JlZ2lzdGVyX2xvY2spKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCiAJaWYgKChudW0gPSBkdmJkZXZfZ2V0X2ZyZWVfYWRhcHRlcl9udW0gKCkpIDwgMCkgewotCQl1cCAoJmR2YmRldl9yZWdpc3Rlcl9sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZkdmJkZXZfcmVnaXN0ZXJfbG9jayk7CiAJCXJldHVybiAtRU5GSUxFOwogCX0KIApAQCAtMzA5LDcgKzMwOSw3IEBACiAKIAlsaXN0X2FkZF90YWlsICgmYWRhcC0+bGlzdF9oZWFkLCAmZHZiX2FkYXB0ZXJfbGlzdCk7CiAKLQl1cCAoJmR2YmRldl9yZWdpc3Rlcl9sb2NrKTsKKwltdXRleF91bmxvY2soJmR2YmRldl9yZWdpc3Rlcl9sb2NrKTsKIAogCXJldHVybiBudW07CiB9CkBAIC0zMjAsMTAgKzMyMCwxMCBAQAogewogCWRldmZzX3JlbW92ZSgiZHZiL2FkYXB0ZXIlZCIsIGFkYXAtPm51bSk7CiAKLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmZHZiZGV2X3JlZ2lzdGVyX2xvY2spKQorCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmR2YmRldl9yZWdpc3Rlcl9sb2NrKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAlsaXN0X2RlbCAoJmFkYXAtPmxpc3RfaGVhZCk7Ci0JdXAgKCZkdmJkZXZfcmVnaXN0ZXJfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZkdmJkZXZfcmVnaXN0ZXJfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIpOwpAQCAtMzU2LDE4ICszNTYsMTggQEAKIAljYXNlIF9JT0NfV1JJVEU6CiAJY2FzZSAoX0lPQ19XUklURSB8IF9JT0NfUkVBRCk6CiAJCWlmIChfSU9DX1NJWkUoY21kKSA8PSBzaXplb2Yoc2J1ZikpIHsKLQkJICAgICAgICBwYXJnID0gc2J1ZjsKKwkJCXBhcmcgPSBzYnVmOwogCQl9IGVsc2UgewotCQkgICAgICAgIC8qIHRvbyBiaWcgdG8gYWxsb2NhdGUgZnJvbSBzdGFjayAqLwotCQkgICAgICAgIG1idWYgPSBrbWFsbG9jKF9JT0NfU0laRShjbWQpLEdGUF9LRVJORUwpOwotCQkgICAgICAgIGlmIChOVUxMID09IG1idWYpCi0JCSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLQkJICAgICAgICBwYXJnID0gbWJ1ZjsKKwkJCS8qIHRvbyBiaWcgdG8gYWxsb2NhdGUgZnJvbSBzdGFjayAqLworCQkJbWJ1ZiA9IGttYWxsb2MoX0lPQ19TSVpFKGNtZCksR0ZQX0tFUk5FTCk7CisJCQlpZiAoTlVMTCA9PSBtYnVmKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJcGFyZyA9IG1idWY7CiAJCX0KIAogCQllcnIgPSAtRUZBVUxUOwogCQlpZiAoY29weV9mcm9tX3VzZXIocGFyZywgKHZvaWQgX191c2VyICopYXJnLCBfSU9DX1NJWkUoY21kKSkpCi0JCSAgICAgICAgZ290byBvdXQ7CisJCQlnb3RvIG91dDsKIAkJYnJlYWs7CiAJfQogCkBAIC0zODQsNyArMzg0LDcgQEAKIAljYXNlIF9JT0NfUkVBRDoKIAljYXNlIChfSU9DX1dSSVRFIHwgX0lPQ19SRUFEKToKIAkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIHBhcmcsIF9JT0NfU0laRShjbWQpKSkKLQkJICAgICAgICBlcnIgPSAtRUZBVUxUOworCQkJZXJyID0gLUVGQVVMVDsKIAkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5oCmluZGV4IDBjYzZlNGEuLjc0ZWQ1ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5oCkBAIC05Nyw3ICs5Nyw3IEBACiBnZW5lcmljX3VzZXJjb3B5KCkgIHNvbWVkYXkuLi4gKi8KIAogZXh0ZXJuIGludCBkdmJfdXNlcmNvcHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCSAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLAorCQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLAogCQkJICAgIGludCAoKmZ1bmMpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcKaW5kZXggNTRlMmIyOS4uOTBhNjlkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZwpAQCAtMzcsMTYgKzM3LDE2IEBACiAJICBEaUJjb20gKDxodHRwOi8vd3d3LmRpYmNvbS5mcj4pIGVxdWlwcGVkIHdpdGggYSBEaUIzMDAwTS1CIGRlbW9kdWxhdG9yLgogCiAJICBEZXZpY2VzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlcjoKLQkgICAgVHdpbmhhbkRUViBVU0ItVGVyIChWUDcwNDEpCi0JICAgIFR3aW5oYW5EVFYgTWFnaWMgQm94IChWUDcwNDFlKQotCSAgICBLV29ybGQvSmV0V2F5L0FEU1RlY2ggVi1TdHJlYW0gWFBFUlQgRFRWIC0gRFZCLVQgVVNCMS4xIGFuZCBVU0IyLjAKLQkgICAgSGFtYSBEVkItVCBVU0IxLjEtQm94Ci0JICAgIERpQmNvbSBVU0IxLjEgcmVmZXJlbmNlIGRldmljZXMgKG5vbi1wdWJsaWMpCi0JICAgIFVsdGltYSBFbGVjdHJvbmljL0FydGVjIFQxIFVTQiBUVkJPWAotCSAgICBDb21wcm8gVmlkZW9tYXRlIERWQi1VMjAwMCAtIERWQi1UIFVTQgotCSAgICBHcmFuZHRlYyBEVkItVCBVU0IKLQkgICAgQXZlcm1lZGlhIEF2ZXJUViBEVkJUIFVTQjEuMQogCSAgICBBcnRlYyBUMSBVU0IxLjEgYm94ZXMKKwkgICAgQXZlcm1lZGlhIEF2ZXJUViBEVkJUIFVTQjEuMQorCSAgICBDb21wcm8gVmlkZW9tYXRlIERWQi1VMjAwMCAtIERWQi1UIFVTQgorCSAgICBEaUJjb20gVVNCMS4xIHJlZmVyZW5jZSBkZXZpY2VzIChub24tcHVibGljKQorCSAgICBHcmFuZHRlYyBEVkItVCBVU0IKKwkgICAgSGFtYSBEVkItVCBVU0IxLjEtQm94CisJICAgIEtXb3JsZC9KZXRXYXkvQURTVGVjaCBWLVN0cmVhbSBYUEVSVCBEVFYgLSBEVkItVCBVU0IxLjEgYW5kIFVTQjIuMAorCSAgICBUd2luaGFuRFRWIE1hZ2ljIEJveCAoVlA3MDQxZSkKKwkgICAgVHdpbmhhbkRUViBVU0ItVGVyIChWUDcwNDEpCisJICAgIFVsdGltYSBFbGVjdHJvbmljL0FydGVjIFQxIFVTQiBUVkJPWAogCiAJICBUaGUgVlA3MDQxIHNlZW1zIHRvIGJlIGlkZW50aWNhbCB0byAiQ1RTIFBvcnRhYmxlIiAoQ2hpbmVzZQogCSAgVGVsZXZpc2lvbiBTeXN0ZW0pLgpAQCAtNTQsNiArNTQsMTIgQEAKIAkgIFNheSBZIGlmIHlvdSBvd24gc3VjaCBhIGRldmljZSBhbmQgd2FudCB0byB1c2UgaXQuIFlvdSBzaG91bGQgYnVpbGQgaXQgYXMKIAkgIGEgbW9kdWxlLgogCitjb25maWcgRFZCX1VTQl9ESUJVU0JfTUJfRkFVTFRZCisJYm9vbCAiU3VwcG9ydCBmYXVsdHkgVVNCIElEcyIKKwlkZXBlbmRzIG9uIERWQl9VU0JfRElCVVNCX01CCisJaGVscAorCSAgU3VwcG9ydCBmb3IgZmF1bHR5IFVTQiBJRHMgZHVlIHRvIGFuIGludmFsaWQgRUVQUk9NIG9uIHNvbWUgQXJ0ZWMgZGV2aWNlcy4KKwogY29uZmlnIERWQl9VU0JfRElCVVNCX01DCiAJdHJpc3RhdGUgIkRpQmNvbSBVU0IgRFZCLVQgZGV2aWNlcyAoYmFzZWQgb24gdGhlIERpQjMwMDBNLUMvUCkgKHNlZSBoZWxwIGZvciBkZXZpY2UgbGlzdCkiCiAJZGVwZW5kcyBvbiBEVkJfVVNCCkBAIC02Myw4ICs2OSw4IEBACiAJICBEaUJjb20gKDxodHRwOi8vd3d3LmRpYmNvbS5mcj4pIGVxdWlwcGVkIHdpdGggYSBEaUIzMDAwTS1DL1AgZGVtb2R1bGF0b3IuCiAKIAkgIERldmljZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyOgotCSAgICBEaUJjb20gVVNCMi4wIHJlZmVyZW5jZSBkZXZpY2VzIChub24tcHVibGljKQogCSAgICBBcnRlYyBUMSBVU0IyLjAgYm94ZXMKKwkgICAgRGlCY29tIFVTQjIuMCByZWZlcmVuY2UgZGV2aWNlcyAobm9uLXB1YmxpYykKIAogCSAgU2F5IFkgaWYgeW91IG93biBzdWNoIGEgZGV2aWNlIGFuZCB3YW50IHRvIHVzZSBpdC4gWW91IHNob3VsZCBidWlsZCBpdCBhcwogCSAgYSBtb2R1bGUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmMKaW5kZXggZDA1ZmFiMC4uYTdmYjA2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYwpAQCAtMTEsMTAgKzExLDExIEBACiAgKiBkZXNpZ24sIHNvIGl0IGNhbiBiZSByZXVzZWQgZm9yIHRoZSAiYW5hbG9ndWUtb25seSIgZGV2aWNlIChpZiBpdCB3aWxsCiAgKiBhcHBlYXIgYXQgYWxsKS4KICAqCi0gKiBUT0RPOiBjaGVjayBpZiB0aGUgY3gyNTg0MC1kcml2ZXIgKGZyb20gaXZ0dikgY2FuIGJlIHVzZWQgZm9yIHRoZSBhbmFsb2d1ZQotICogcGFydAorICogVE9ETzogVXNlIHRoZSBjeDI1ODQwLWRyaXZlciBmb3IgdGhlIGFuYWxvZ3VlIHBhcnQKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUgUGF0cmljayBCb2V0dGNoZXIgKHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGUpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTWljaGFlbCBLcnVma3kgKG1rcnVma3lAbTFrLm5ldCkKKyAqIENvcHlyaWdodCAoQykgMjAwNiBDaHJpcyBQYXNjb2UgKGMucGFzY29lQGl0ZWUudXEuZWR1LmF1KQogICoKICAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQpAQCAtMjUsNiArMjYsOSBAQAogI2luY2x1ZGUgImN4dXNiLmgiCiAKICNpbmNsdWRlICJjeDIyNzAyLmgiCisjaW5jbHVkZSAibGdkdDMzMHguaCIKKyNpbmNsdWRlICJtdDM1Mi5oIgorI2luY2x1ZGUgIm10MzUyX3ByaXYuaCIKIAogLyogZGVidWcgKi8KIGludCBkdmJfdXNiX2N4dXNiX2RlYnVnOwpAQCAtMTU2LDYgKzE2MCwxMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBjeHVzYl9yY19xdWVyeShzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHUzMiAqZXZlbnQsIGludCAqc3RhdGUpCit7CisJc3RydWN0IGR2Yl91c2JfcmNfa2V5ICprZXltYXAgPSBkLT5wcm9wcy5yY19rZXlfbWFwOworCXU4IGlyY29kZVs0XTsKKwlpbnQgaTsKKworCWN4dXNiX2N0cmxfbXNnKGQsIENNRF9HRVRfSVJfQ09ERSwgTlVMTCwgMCwgaXJjb2RlLCA0KTsKKworCSpldmVudCA9IDA7CisJKnN0YXRlID0gUkVNT1RFX05PX0tFWV9QUkVTU0VEOworCisJZm9yIChpID0gMDsgaSA8IGQtPnByb3BzLnJjX2tleV9tYXBfc2l6ZTsgaSsrKSB7CisJCWlmIChrZXltYXBbaV0uY3VzdG9tID09IGlyY29kZVsyXSAmJgorCQkgICAga2V5bWFwW2ldLmRhdGEgPT0gaXJjb2RlWzNdKSB7CisJCQkqZXZlbnQgPSBrZXltYXBbaV0uZXZlbnQ7CisJCQkqc3RhdGUgPSBSRU1PVEVfS0VZX1BSRVNTRUQ7CisKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBkdmJfdXNiX3JjX2tleSBkdmljb19tY2VfcmNfa2V5c1tdID0geworCXsgMHhmZSwgMHgwMiwgS0VZX1RWIH0sCisJeyAweGZlLCAweDBlLCBLRVlfTVAzIH0sCisJeyAweGZlLCAweDFhLCBLRVlfRFZEIH0sCisJeyAweGZlLCAweDFlLCBLRVlfRkFWT1JJVEVTIH0sCisJeyAweGZlLCAweDE2LCBLRVlfU0VUVVAgfSwKKwl7IDB4ZmUsIDB4NDYsIEtFWV9QT1dFUjIgfSwKKwl7IDB4ZmUsIDB4MGEsIEtFWV9FUEcgfSwKKwl7IDB4ZmUsIDB4NDksIEtFWV9CQUNLIH0sCisJeyAweGZlLCAweDRkLCBLRVlfTUVOVSB9LAorCXsgMHhmZSwgMHg1MSwgS0VZX1VQIH0sCisJeyAweGZlLCAweDViLCBLRVlfTEVGVCB9LAorCXsgMHhmZSwgMHg1ZiwgS0VZX1JJR0hUIH0sCisJeyAweGZlLCAweDUzLCBLRVlfRE9XTiB9LAorCXsgMHhmZSwgMHg1ZSwgS0VZX09LIH0sCisJeyAweGZlLCAweDU5LCBLRVlfSU5GTyB9LAorCXsgMHhmZSwgMHg1NSwgS0VZX1RBQiB9LAorCXsgMHhmZSwgMHgwZiwgS0VZX1BSRVZJT1VTU09ORyB9LC8qIFJlcGxheSAqLworCXsgMHhmZSwgMHgxMiwgS0VZX05FWFRTT05HIH0sCS8qIFNraXAgKi8KKwl7IDB4ZmUsIDB4NDIsIEtFWV9FTlRFUgkgfSwJLyogV2luZG93cy9TdGFydCAqLworCXsgMHhmZSwgMHgxNSwgS0VZX1ZPTFVNRVVQIH0sCisJeyAweGZlLCAweDA1LCBLRVlfVk9MVU1FRE9XTiB9LAorCXsgMHhmZSwgMHgxMSwgS0VZX0NIQU5ORUxVUCB9LAorCXsgMHhmZSwgMHgwOSwgS0VZX0NIQU5ORUxET1dOIH0sCisJeyAweGZlLCAweDUyLCBLRVlfQ0FNRVJBIH0sCisJeyAweGZlLCAweDVhLCBLRVlfVFVORVIgfSwJLyogTGl2ZSAqLworCXsgMHhmZSwgMHgxOSwgS0VZX09QRU4gfSwKKwl7IDB4ZmUsIDB4MGIsIEtFWV8xIH0sCisJeyAweGZlLCAweDE3LCBLRVlfMiB9LAorCXsgMHhmZSwgMHgxYiwgS0VZXzMgfSwKKwl7IDB4ZmUsIDB4MDcsIEtFWV80IH0sCisJeyAweGZlLCAweDUwLCBLRVlfNSB9LAorCXsgMHhmZSwgMHg1NCwgS0VZXzYgfSwKKwl7IDB4ZmUsIDB4NDgsIEtFWV83IH0sCisJeyAweGZlLCAweDRjLCBLRVlfOCB9LAorCXsgMHhmZSwgMHg1OCwgS0VZXzkgfSwKKwl7IDB4ZmUsIDB4MTMsIEtFWV9BTkdMRSB9LAkvKiBBc3BlY3QgKi8KKwl7IDB4ZmUsIDB4MDMsIEtFWV8wIH0sCisJeyAweGZlLCAweDFmLCBLRVlfWk9PTSB9LAorCXsgMHhmZSwgMHg0MywgS0VZX1JFV0lORCB9LAorCXsgMHhmZSwgMHg0NywgS0VZX1BMQVlQQVVTRSB9LAorCXsgMHhmZSwgMHg0ZiwgS0VZX0ZBU1RGT1JXQVJEIH0sCisJeyAweGZlLCAweDU3LCBLRVlfTVVURSB9LAorCXsgMHhmZSwgMHgwZCwgS0VZX1NUT1AgfSwKKwl7IDB4ZmUsIDB4MDEsIEtFWV9SRUNPUkQgfSwKKwl7IDB4ZmUsIDB4NGUsIEtFWV9QT1dFUiB9LAorfTsKKworc3RhdGljIGludCBjeHVzYl9kZWUxNjAxX2RlbW9kX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJc3RhdGljIHU4IGNsb2NrX2NvbmZpZyBbXSAgPSB7IENMT0NLX0NUTCwgIDB4MzgsIDB4MzggfTsKKwlzdGF0aWMgdTggcmVzZXQgW10gICAgICAgICA9IHsgUkVTRVQsICAgICAgMHg4MCB9OworCXN0YXRpYyB1OCBhZGNfY3RsXzFfY2ZnIFtdID0geyBBRENfQ1RMXzEsICAweDQwIH07CisJc3RhdGljIHU4IGFnY19jZmcgW10gICAgICAgPSB7IEFHQ19UQVJHRVQsIDB4MjgsIDB4MjAgfTsKKwlzdGF0aWMgdTggZ3BwX2N0bF9jZmcgW10gICA9IHsgR1BQX0NUTCwgICAgMHgzMyB9OworCXN0YXRpYyB1OCBjYXB0X3JhbmdlX2NmZ1tdID0geyBDQVBUX1JBTkdFLCAweDMyIH07CisKKwltdDM1Ml93cml0ZShmZSwgY2xvY2tfY29uZmlnLCAgIHNpemVvZihjbG9ja19jb25maWcpKTsKKwl1ZGVsYXkoMjAwKTsKKwltdDM1Ml93cml0ZShmZSwgcmVzZXQsICAgICAgICAgIHNpemVvZihyZXNldCkpOworCW10MzUyX3dyaXRlKGZlLCBhZGNfY3RsXzFfY2ZnLCAgc2l6ZW9mKGFkY19jdGxfMV9jZmcpKTsKKworCW10MzUyX3dyaXRlKGZlLCBhZ2NfY2ZnLCAgICAgICAgc2l6ZW9mKGFnY19jZmcpKTsKKwltdDM1Ml93cml0ZShmZSwgZ3BwX2N0bF9jZmcsICAgIHNpemVvZihncHBfY3RsX2NmZykpOworCW10MzUyX3dyaXRlKGZlLCBjYXB0X3JhbmdlX2NmZywgc2l6ZW9mKGNhcHRfcmFuZ2VfY2ZnKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeHVzYl9tdDM1Ml9kZW1vZF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQorewkvKiB1c2VkIGluIGJvdGggbGd6MjAxIGFuZCB0aDc1NzkgKi8KKwlzdGF0aWMgdTggY2xvY2tfY29uZmlnIFtdICA9IHsgQ0xPQ0tfQ1RMLCAgMHgzOCwgMHgzOSB9OworCXN0YXRpYyB1OCByZXNldCBbXSAgICAgICAgID0geyBSRVNFVCwgICAgICAweDgwIH07CisJc3RhdGljIHU4IGFkY19jdGxfMV9jZmcgW10gPSB7IEFEQ19DVExfMSwgIDB4NDAgfTsKKwlzdGF0aWMgdTggYWdjX2NmZyBbXSAgICAgICA9IHsgQUdDX1RBUkdFVCwgMHgyNCwgMHgyMCB9OworCXN0YXRpYyB1OCBncHBfY3RsX2NmZyBbXSAgID0geyBHUFBfQ1RMLCAgICAweDMzIH07CisJc3RhdGljIHU4IGNhcHRfcmFuZ2VfY2ZnW10gPSB7IENBUFRfUkFOR0UsIDB4MzIgfTsKKworCW10MzUyX3dyaXRlKGZlLCBjbG9ja19jb25maWcsICAgc2l6ZW9mKGNsb2NrX2NvbmZpZykpOworCXVkZWxheSgyMDApOworCW10MzUyX3dyaXRlKGZlLCByZXNldCwgICAgICAgICAgc2l6ZW9mKHJlc2V0KSk7CisJbXQzNTJfd3JpdGUoZmUsIGFkY19jdGxfMV9jZmcsICBzaXplb2YoYWRjX2N0bF8xX2NmZykpOworCisJbXQzNTJfd3JpdGUoZmUsIGFnY19jZmcsICAgICAgICBzaXplb2YoYWdjX2NmZykpOworCW10MzUyX3dyaXRlKGZlLCBncHBfY3RsX2NmZywgICAgc2l6ZW9mKGdwcF9jdGxfY2ZnKSk7CisJbXQzNTJfd3JpdGUoZmUsIGNhcHRfcmFuZ2VfY2ZnLCBzaXplb2YoY2FwdF9yYW5nZV9jZmcpKTsKKwlyZXR1cm4gMDsKK30KKwogc3RydWN0IGN4MjI3MDJfY29uZmlnIGN4dXNiX2N4MjI3MDJfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHg2MywKIApAQCAtMTY1LDE3ICsyODIsNjggQEAKIAkucGxsX3NldCAgPSBkdmJfdXNiX3BsbF9zZXRfaTJjLAogfTsKIAorc3RydWN0IGxnZHQzMzB4X2NvbmZpZyBjeHVzYl9sZ2R0MzMweF9jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDBlLAorCS5kZW1vZF9jaGlwICAgID0gTEdEVDMzMDMsCisJLnBsbF9zZXQgICAgICAgPSBkdmJfdXNiX3BsbF9zZXRfaTJjLAorfTsKKworc3RydWN0IG10MzUyX2NvbmZpZyBjeHVzYl9kZWUxNjAxX2NvbmZpZyA9IHsKKwkuZGVtb2RfYWRkcmVzcyA9IDB4MGYsCisJLmRlbW9kX2luaXQgICAgPSBjeHVzYl9kZWUxNjAxX2RlbW9kX2luaXQsCisJLnBsbF9zZXQgICAgICAgPSBkdmJfdXNiX3BsbF9zZXQsCit9OworCitzdHJ1Y3QgbXQzNTJfY29uZmlnIGN4dXNiX210MzUyX2NvbmZpZyA9IHsKKwkvKiB1c2VkIGluIGJvdGggbGd6MjAxIGFuZCB0aDc1NzkgKi8KKwkuZGVtb2RfYWRkcmVzcyA9IDB4MGYsCisJLmRlbW9kX2luaXQgICAgPSBjeHVzYl9tdDM1Ml9kZW1vZF9pbml0LAorCS5wbGxfc2V0ICAgICAgID0gZHZiX3VzYl9wbGxfc2V0LAorfTsKKwogLyogQ2FsbGJhY2tzIGZvciBEVkIgVVNCICovCi1zdGF0aWMgaW50IGN4dXNiX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCitzdGF0aWMgaW50IGN4dXNiX2ZtZDEyMTZtZV90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQogewogCXU4IGJwbGxbNF0gPSB7IDB4MGIsIDB4ZGMsIDB4OWMsIDB4YTAgfTsKIAlkLT5wbGxfYWRkciA9IDB4NjE7Ci0JbWVtY3B5KGQtPnBsbF9pbml0LGJwbGwsNCk7CisJbWVtY3B5KGQtPnBsbF9pbml0LCBicGxsLCA0KTsKIAlkLT5wbGxfZGVzYyA9ICZkdmJfcGxsX2ZtZDEyMTZtZTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjeHVzYl9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQorc3RhdGljIGludCBjeHVzYl9sZ2gwNjRmX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJdTggYnBsbFs0XSA9IHsgMHgwMCwgMHgwMCwgMHgxOCwgMHg1MCB9OworCS8qIGJwbGxbMl0gOiB1bnNldCBiaXQgMywgc2V0IGJpdHMgNCY1CisJICAgYnBsbFszXSA6IDB4NTAgLSBkaWdpdGFsLCAweDIwIC0gYW5hbG9nICovCisJZC0+cGxsX2FkZHIgPSAweDYxOworCW1lbWNweShkLT5wbGxfaW5pdCwgYnBsbCwgNCk7CisJZC0+cGxsX2Rlc2MgPSAmZHZiX3BsbF90ZHZzX3R1YTYwMzQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3h1c2JfZGVlMTYwMV90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCWQtPnBsbF9hZGRyID0gMHg2MTsKKwlkLT5wbGxfZGVzYyA9ICZkdmJfcGxsX3Rob21zb25fZHR0NzU3OTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeHVzYl9sZ3oyMDFfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlkLT5wbGxfYWRkciA9IDB4NjE7CisJZC0+cGxsX2Rlc2MgPSAmZHZiX3BsbF9sZ196MjAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4dXNiX2R0dDc1NzlfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlkLT5wbGxfYWRkciA9IDB4NjA7CisJZC0+cGxsX2Rlc2MgPSAmZHZiX3BsbF90aG9tc29uX2R0dDc1Nzk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3h1c2JfY3gyMjcwMl9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQogewogCXU4IGI7CiAJaWYgKHVzYl9zZXRfaW50ZXJmYWNlKGQtPnVkZXYsMCw2KSA8IDApCkBAIC0xODksMjIgKzM1NywxMDcgQEAKIAlyZXR1cm4gLUVJTzsKIH0KIAorc3RhdGljIGludCBjeHVzYl9sZ2R0MzMweF9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCWlmICh1c2Jfc2V0X2ludGVyZmFjZShkLT51ZGV2LDAsNykgPCAwKQorCQllcnIoInNldCBpbnRlcmZhY2UgZmFpbGVkIik7CisKKwljeHVzYl9jdHJsX21zZyhkLENNRF9ESUdJVEFMLCBOVUxMLCAwLCBOVUxMLCAwKTsKKworCWlmICgoZC0+ZmUgPSBsZ2R0MzMweF9hdHRhY2goJmN4dXNiX2xnZHQzMzB4X2NvbmZpZywgJmQtPmkyY19hZGFwKSkgIT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBjeHVzYl9tdDM1Ml9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQorewkvKiB1c2VkIGluIGJvdGggbGd6MjAxIGFuZCB0aDc1NzkgKi8KKwlpZiAodXNiX3NldF9pbnRlcmZhY2UoZC0+dWRldiwwLDApIDwgMCkKKwkJZXJyKCJzZXQgaW50ZXJmYWNlIGZhaWxlZCIpOworCisJY3h1c2JfY3RybF9tc2coZCxDTURfRElHSVRBTCwgTlVMTCwgMCwgTlVMTCwgMCk7CisKKwlpZiAoKGQtPmZlID0gbXQzNTJfYXR0YWNoKCZjeHVzYl9tdDM1Ml9jb25maWcsICZkLT5pMmNfYWRhcCkpICE9IE5VTEwpCisJCXJldHVybiAwOworCisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgY3h1c2JfZGVlMTYwMV9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCWlmICh1c2Jfc2V0X2ludGVyZmFjZShkLT51ZGV2LDAsMCkgPCAwKQorCQllcnIoInNldCBpbnRlcmZhY2UgZmFpbGVkIik7CisKKwljeHVzYl9jdHJsX21zZyhkLENNRF9ESUdJVEFMLCBOVUxMLCAwLCBOVUxMLCAwKTsKKworCWlmICgoZC0+ZmUgPSBtdDM1Ml9hdHRhY2goJmN4dXNiX2RlZTE2MDFfY29uZmlnLCAmZC0+aTJjX2FkYXApKSAhPSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAtRUlPOworfQorCisvKgorICogRFZpQ08gYmx1ZWJpcmQgZmlybXdhcmUgbmVlZHMgdGhlICJ3YXJtIiBwcm9kdWN0IElEIHRvIGJlIHBhdGNoZWQgaW50byB0aGUKKyAqIGZpcm13YXJlIGZpbGUgYmVmb3JlIGRvd25sb2FkLgorICovCisKKyNkZWZpbmUgQkxVRUJJUkRfMDFfSURfT0ZGU0VUIDY2MzgKK3N0YXRpYyBpbnQgYmx1ZWJpcmRfcGF0Y2hfZHZpY29fZmlybXdhcmVfZG93bmxvYWQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpCit7CisJaWYgKGZ3LT5zaXplIDwgQkxVRUJJUkRfMDFfSURfT0ZGU0VUICsgNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZnctPmRhdGFbQkxVRUJJUkRfMDFfSURfT0ZGU0VUXSA9PSAoVVNCX1ZJRF9EVklDTyAmIDB4ZmYpICYmCisJICAgIGZ3LT5kYXRhW0JMVUVCSVJEXzAxX0lEX09GRlNFVCArIDFdID09IFVTQl9WSURfRFZJQ08gPj4gOCkgeworCisJCS8qIEZJWE1FOiBhcmUgd2UgYWxsb3dlZCB0byBjaGFuZ2UgdGhlIGZ3LWRhdGEgPyAqLworCQlmdy0+ZGF0YVtCTFVFQklSRF8wMV9JRF9PRkZTRVQgKyAyXSA9IHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ICsgMTsKKwkJZnctPmRhdGFbQkxVRUJJUkRfMDFfSURfT0ZGU0VUICsgM10gPSB1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA+PiA4OworCisJCXJldHVybiB1c2JfY3lwcmVzc19sb2FkX2Zpcm13YXJlKHVkZXYsZncsQ1lQUkVTU19GWDIpOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCiAvKiBEVkIgVVNCIERyaXZlciBzdHVmZiAqLwotc3RhdGljIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgY3h1c2JfcHJvcGVydGllczsKK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzIGN4dXNiX21lZGlvbl9wcm9wZXJ0aWVzOworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgY3h1c2JfYmx1ZWJpcmRfbGdoMDY0Zl9wcm9wZXJ0aWVzOworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgY3h1c2JfYmx1ZWJpcmRfZGVlMTYwMV9wcm9wZXJ0aWVzOworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgY3h1c2JfYmx1ZWJpcmRfbGd6MjAxX3Byb3BlcnRpZXM7CitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyBjeHVzYl9ibHVlYmlyZF9kdHQ3NTc5X3Byb3BlcnRpZXM7CiAKIHN0YXRpYyBpbnQgY3h1c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCiAJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKLQlyZXR1cm4gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZjeHVzYl9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFLE5VTEwpOworCWlmIChkdmJfdXNiX2RldmljZV9pbml0KGludGYsJmN4dXNiX21lZGlvbl9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFLE5VTEwpID09IDAgfHwKKwkJZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZjeHVzYl9ibHVlYmlyZF9sZ2gwNjRmX3Byb3BlcnRpZXMsVEhJU19NT0RVTEUsTlVMTCkgPT0gMCB8fAorCQlkdmJfdXNiX2RldmljZV9pbml0KGludGYsJmN4dXNiX2JsdWViaXJkX2RlZTE2MDFfcHJvcGVydGllcyxUSElTX01PRFVMRSxOVUxMKSA9PSAwIHx8CisJCWR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwmY3h1c2JfYmx1ZWJpcmRfbGd6MjAxX3Byb3BlcnRpZXMsVEhJU19NT0RVTEUsTlVMTCkgPT0gMCB8fAorCQlkdmJfdXNiX2RldmljZV9pbml0KGludGYsJmN4dXNiX2JsdWViaXJkX2R0dDc1NzlfcHJvcGVydGllcyxUSElTX01PRFVMRSxOVUxMKSA9PSAwKSB7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOwogfQogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgY3h1c2JfdGFibGUgW10gPSB7CiAJCXsgVVNCX0RFVklDRShVU0JfVklEX01FRElPTiwgVVNCX1BJRF9NRURJT05fTUQ5NTcwMCkgfSwKKwkJeyBVU0JfREVWSUNFKFVTQl9WSURfRFZJQ08sIFVTQl9QSURfRFZJQ09fQkxVRUJJUkRfTEcwNjRGX0NPTEQpIH0sCisJCXsgVVNCX0RFVklDRShVU0JfVklEX0RWSUNPLCBVU0JfUElEX0RWSUNPX0JMVUVCSVJEX0xHMDY0Rl9XQVJNKSB9LAorCQl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9EVklDTywgVVNCX1BJRF9EVklDT19CTFVFQklSRF9ERUUxNjAxX0NPTEQpIH0sCisJCXsgVVNCX0RFVklDRShVU0JfVklEX0RWSUNPLCBVU0JfUElEX0RWSUNPX0JMVUVCSVJEX0RFRTE2MDFfV0FSTSkgfSwKKwkJeyBVU0JfREVWSUNFKFVTQl9WSURfRFZJQ08sIFVTQl9QSURfRFZJQ09fQkxVRUJJUkRfTEdaMjAxX0NPTEQpIH0sCisJCXsgVVNCX0RFVklDRShVU0JfVklEX0RWSUNPLCBVU0JfUElEX0RWSUNPX0JMVUVCSVJEX0xHWjIwMV9XQVJNKSB9LAorCQl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9EVklDTywgVVNCX1BJRF9EVklDT19CTFVFQklSRF9USDc1NzlfQ09MRCkgfSwKKwkJeyBVU0JfREVWSUNFKFVTQl9WSURfRFZJQ08sIFVTQl9QSURfRFZJQ09fQkxVRUJJUkRfVEg3NTc5X1dBUk0pIH0sCisJCXsgVVNCX0RFVklDRShVU0JfVklEX0RWSUNPLCBVU0JfUElEX0RJR0lUQUxOT1dfQkxVRUJJUkRfREVFMTYwMV9DT0xEKSB9LAorCQl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9EVklDTywgVVNCX1BJRF9ESUdJVEFMTk9XX0JMVUVCSVJEX0RFRTE2MDFfV0FSTSkgfSwKIAkJe30JCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSAodXNiLCBjeHVzYl90YWJsZSk7CiAKLXN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzIGN4dXNiX3Byb3BlcnRpZXMgPSB7CitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyBjeHVzYl9tZWRpb25fcHJvcGVydGllcyA9IHsKIAkuY2FwcyA9IERWQl9VU0JfSVNfQU5fSTJDX0FEQVBURVIsCiAKIAkudXNiX2N0cmwgPSBDWVBSRVNTX0ZYMiwKQEAgLTIxMyw4ICs0NjYsOCBAQAogCiAJLnN0cmVhbWluZ19jdHJsICAgPSBjeHVzYl9zdHJlYW1pbmdfY3RybCwKIAkucG93ZXJfY3RybCAgICAgICA9IGN4dXNiX3Bvd2VyX2N0cmwsCi0JLmZyb250ZW5kX2F0dGFjaCAgPSBjeHVzYl9mcm9udGVuZF9hdHRhY2gsCi0JLnR1bmVyX2F0dGFjaCAgICAgPSBjeHVzYl90dW5lcl9hdHRhY2gsCisJLmZyb250ZW5kX2F0dGFjaCAgPSBjeHVzYl9jeDIyNzAyX2Zyb250ZW5kX2F0dGFjaCwKKwkudHVuZXJfYXR0YWNoICAgICA9IGN4dXNiX2ZtZDEyMTZtZV90dW5lcl9hdHRhY2gsCiAKIAkuaTJjX2FsZ28gICAgICAgICA9ICZjeHVzYl9pMmNfYWxnbywKIApAQCAtMjQwLDYgKzQ5MywxNzUgQEAKIAl9CiB9OwogCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyBjeHVzYl9ibHVlYmlyZF9sZ2gwNjRmX3Byb3BlcnRpZXMgPSB7CisJLmNhcHMgPSBEVkJfVVNCX0lTX0FOX0kyQ19BREFQVEVSLAorCisJLnVzYl9jdHJsICAgICAgICAgID0gREVWSUNFX1NQRUNJRklDLAorCS5maXJtd2FyZSAgICAgICAgICA9ICJkdmItdXNiLWJsdWViaXJkLTAxLmZ3IiwKKwkuZG93bmxvYWRfZmlybXdhcmUgPSBibHVlYmlyZF9wYXRjaF9kdmljb19maXJtd2FyZV9kb3dubG9hZCwKKwkvKiB1c2UgdXNiIGFsdCBzZXR0aW5nIDAgZm9yIEVQNCB0cmFuc2ZlciAoZHZiLXQpLAorCSAgIHVzZSB1c2IgYWx0IHNldHRpbmcgNyBmb3IgRVAyIHRyYW5zZmVyIChhdHNjKSAqLworCisJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGN4dXNiX3N0YXRlKSwKKworCS5zdHJlYW1pbmdfY3RybCAgID0gY3h1c2Jfc3RyZWFtaW5nX2N0cmwsCisJLnBvd2VyX2N0cmwgICAgICAgPSBjeHVzYl9wb3dlcl9jdHJsLAorCS5mcm9udGVuZF9hdHRhY2ggID0gY3h1c2JfbGdkdDMzMHhfZnJvbnRlbmRfYXR0YWNoLAorCS50dW5lcl9hdHRhY2ggICAgID0gY3h1c2JfbGdoMDY0Zl90dW5lcl9hdHRhY2gsCisKKwkuaTJjX2FsZ28gICAgICAgICA9ICZjeHVzYl9pMmNfYWxnbywKKworCS5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCA9IDB4MDEsCisJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCS51cmIgPSB7CisJCS50eXBlID0gRFZCX1VTQl9CVUxLLAorCQkuY291bnQgPSA1LAorCQkuZW5kcG9pbnQgPSAweDAyLAorCQkudSA9IHsKKwkJCS5idWxrID0geworCQkJCS5idWZmZXJzaXplID0gODE5MiwKKwkJCX0KKwkJfQorCX0sCisKKwkubnVtX2RldmljZV9kZXNjcyA9IDEsCisJLmRldmljZXMgPSB7CisJCXsgICAiRFZpQ08gRnVzaW9uSERUVjUgVVNCIEdvbGQiLAorCQkJeyAmY3h1c2JfdGFibGVbMV0sIE5VTEwgfSwKKwkJCXsgJmN4dXNiX3RhYmxlWzJdLCBOVUxMIH0sCisJCX0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgY3h1c2JfYmx1ZWJpcmRfZGVlMTYwMV9wcm9wZXJ0aWVzID0geworCS5jYXBzID0gRFZCX1VTQl9JU19BTl9JMkNfQURBUFRFUiwKKworCS51c2JfY3RybCAgICAgICAgICA9IERFVklDRV9TUEVDSUZJQywKKwkuZmlybXdhcmUgICAgICAgICAgPSAiZHZiLXVzYi1ibHVlYmlyZC0wMS5mdyIsCisJLmRvd25sb2FkX2Zpcm13YXJlID0gYmx1ZWJpcmRfcGF0Y2hfZHZpY29fZmlybXdhcmVfZG93bmxvYWQsCisJLyogdXNlIHVzYiBhbHQgc2V0dGluZyAwIGZvciBFUDQgdHJhbnNmZXIgKGR2Yi10KSwKKwkgICB1c2UgdXNiIGFsdCBzZXR0aW5nIDcgZm9yIEVQMiB0cmFuc2ZlciAoYXRzYykgKi8KKworCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBjeHVzYl9zdGF0ZSksCisKKwkuc3RyZWFtaW5nX2N0cmwgICA9IGN4dXNiX3N0cmVhbWluZ19jdHJsLAorCS5wb3dlcl9jdHJsICAgICAgID0gY3h1c2JfcG93ZXJfY3RybCwKKwkuZnJvbnRlbmRfYXR0YWNoICA9IGN4dXNiX2RlZTE2MDFfZnJvbnRlbmRfYXR0YWNoLAorCS50dW5lcl9hdHRhY2ggICAgID0gY3h1c2JfZGVlMTYwMV90dW5lcl9hdHRhY2gsCisKKwkuaTJjX2FsZ28gICAgICAgICA9ICZjeHVzYl9pMmNfYWxnbywKKworCS5yY19pbnRlcnZhbCAgICAgID0gMTUwLAorCS5yY19rZXlfbWFwICAgICAgID0gZHZpY29fbWNlX3JjX2tleXMsCisJLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKGR2aWNvX21jZV9yY19rZXlzKSwKKwkucmNfcXVlcnkgICAgICAgICA9IGN4dXNiX3JjX3F1ZXJ5LAorCisJLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50ID0gMHgwMSwKKwkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCisJLnVyYiA9IHsKKwkJLnR5cGUgPSBEVkJfVVNCX0JVTEssCisJCS5jb3VudCA9IDUsCisJCS5lbmRwb2ludCA9IDB4MDQsCisJCS51ID0geworCQkJLmJ1bGsgPSB7CisJCQkJLmJ1ZmZlcnNpemUgPSA4MTkyLAorCQkJfQorCQl9CisJfSwKKworCS5udW1fZGV2aWNlX2Rlc2NzID0gMiwKKwkuZGV2aWNlcyA9IHsKKwkJeyAgICJEVmlDTyBGdXNpb25IRFRWIERWQi1UIER1YWwgVVNCIiwKKwkJCXsgJmN4dXNiX3RhYmxlWzNdLCBOVUxMIH0sCisJCQl7ICZjeHVzYl90YWJsZVs0XSwgTlVMTCB9LAorCQl9LAorCQl7ICAgIkRpZ2l0YWxOb3cgRFZCLVQgRHVhbCBVU0IiLAorCQkJeyAmY3h1c2JfdGFibGVbOV0sICBOVUxMIH0sCisJCQl7ICZjeHVzYl90YWJsZVsxMF0sIE5VTEwgfSwKKwkJfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyBjeHVzYl9ibHVlYmlyZF9sZ3oyMDFfcHJvcGVydGllcyA9IHsKKwkuY2FwcyA9IERWQl9VU0JfSVNfQU5fSTJDX0FEQVBURVIsCisKKwkudXNiX2N0cmwgICAgICAgICAgPSBERVZJQ0VfU1BFQ0lGSUMsCisJLmZpcm13YXJlICAgICAgICAgID0gImR2Yi11c2ItYmx1ZWJpcmQtMDEuZnciLAorCS5kb3dubG9hZF9maXJtd2FyZSA9IGJsdWViaXJkX3BhdGNoX2R2aWNvX2Zpcm13YXJlX2Rvd25sb2FkLAorCS8qIHVzZSB1c2IgYWx0IHNldHRpbmcgMCBmb3IgRVA0IHRyYW5zZmVyIChkdmItdCksCisJICAgdXNlIHVzYiBhbHQgc2V0dGluZyA3IGZvciBFUDIgdHJhbnNmZXIgKGF0c2MpICovCisKKwkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgY3h1c2Jfc3RhdGUpLAorCisJLnN0cmVhbWluZ19jdHJsICAgPSBjeHVzYl9zdHJlYW1pbmdfY3RybCwKKwkucG93ZXJfY3RybCAgICAgICA9IGN4dXNiX3Bvd2VyX2N0cmwsCisJLmZyb250ZW5kX2F0dGFjaCAgPSBjeHVzYl9tdDM1Ml9mcm9udGVuZF9hdHRhY2gsCisJLnR1bmVyX2F0dGFjaCAgICAgPSBjeHVzYl9sZ3oyMDFfdHVuZXJfYXR0YWNoLAorCisJLmkyY19hbGdvICAgICAgICAgPSAmY3h1c2JfaTJjX2FsZ28sCisKKwkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAweDAxLAorCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KKwkudXJiID0geworCQkudHlwZSA9IERWQl9VU0JfQlVMSywKKwkJLmNvdW50ID0gNSwKKwkJLmVuZHBvaW50ID0gMHgwNCwKKwkJLnUgPSB7CisJCQkuYnVsayA9IHsKKwkJCQkuYnVmZmVyc2l6ZSA9IDgxOTIsCisJCQl9CisJCX0KKwl9LAorCisJLm51bV9kZXZpY2VfZGVzY3MgPSAxLAorCS5kZXZpY2VzID0geworCQl7ICAgIkRWaUNPIEZ1c2lvbkhEVFYgRFZCLVQgVVNCIChMR1oyMDEpIiwKKwkJCXsgJmN4dXNiX3RhYmxlWzVdLCBOVUxMIH0sCisJCQl7ICZjeHVzYl90YWJsZVs2XSwgTlVMTCB9LAorCQl9LAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzIGN4dXNiX2JsdWViaXJkX2R0dDc1NzlfcHJvcGVydGllcyA9IHsKKwkuY2FwcyA9IERWQl9VU0JfSVNfQU5fSTJDX0FEQVBURVIsCisKKwkudXNiX2N0cmwgICAgICAgICAgPSBERVZJQ0VfU1BFQ0lGSUMsCisJLmZpcm13YXJlICAgICAgICAgID0gImR2Yi11c2ItYmx1ZWJpcmQtMDEuZnciLAorCS5kb3dubG9hZF9maXJtd2FyZSA9IGJsdWViaXJkX3BhdGNoX2R2aWNvX2Zpcm13YXJlX2Rvd25sb2FkLAorCS8qIHVzZSB1c2IgYWx0IHNldHRpbmcgMCBmb3IgRVA0IHRyYW5zZmVyIChkdmItdCksCisJICAgdXNlIHVzYiBhbHQgc2V0dGluZyA3IGZvciBFUDIgdHJhbnNmZXIgKGF0c2MpICovCisKKwkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgY3h1c2Jfc3RhdGUpLAorCisJLnN0cmVhbWluZ19jdHJsICAgPSBjeHVzYl9zdHJlYW1pbmdfY3RybCwKKwkucG93ZXJfY3RybCAgICAgICA9IGN4dXNiX3Bvd2VyX2N0cmwsCisJLmZyb250ZW5kX2F0dGFjaCAgPSBjeHVzYl9tdDM1Ml9mcm9udGVuZF9hdHRhY2gsCisJLnR1bmVyX2F0dGFjaCAgICAgPSBjeHVzYl9kdHQ3NTc5X3R1bmVyX2F0dGFjaCwKKworCS5pMmNfYWxnbyAgICAgICAgID0gJmN4dXNiX2kyY19hbGdvLAorCisJLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50ID0gMHgwMSwKKwkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCisJLnVyYiA9IHsKKwkJLnR5cGUgPSBEVkJfVVNCX0JVTEssCisJCS5jb3VudCA9IDUsCisJCS5lbmRwb2ludCA9IDB4MDQsCisJCS51ID0geworCQkJLmJ1bGsgPSB7CisJCQkJLmJ1ZmZlcnNpemUgPSA4MTkyLAorCQkJfQorCQl9CisJfSwKKworCS5udW1fZGV2aWNlX2Rlc2NzID0gMSwKKwkuZGV2aWNlcyA9IHsKKwkJeyAgICJEVmlDTyBGdXNpb25IRFRWIERWQi1UIFVTQiAoVEg3NTc5KSIsCisJCQl7ICZjeHVzYl90YWJsZVs3XSwgTlVMTCB9LAorCQkJeyAmY3h1c2JfdGFibGVbOF0sIE5VTEwgfSwKKwkJfSwKKwl9Cit9OworCiBzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgY3h1c2JfZHJpdmVyID0gewogCS5uYW1lCQk9ICJkdmJfdXNiX2N4dXNiIiwKIAkucHJvYmUJCT0gY3h1c2JfcHJvYmUsCkBAIC0yNjksNiArNjkxLDggQEAKIG1vZHVsZV9leGl0IChjeHVzYl9tb2R1bGVfZXhpdCk7CiAKIE1PRFVMRV9BVVRIT1IoIlBhdHJpY2sgQm9ldHRjaGVyIDxwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlPiIpOworTU9EVUxFX0FVVEhPUigiTWljaGFlbCBLcnVma3kgPG1rcnVma3lAbTFrLm5ldD4iKTsKK01PRFVMRV9BVVRIT1IoIkNocmlzIFBhc2NvZSA8Yy5wYXNjb2VAaXRlZS51cS5lZHUuYXU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgQ29uZXhhbnQgVVNCMi4wIGh5YnJpZCByZWZlcmVuY2UgZGVzaWduIik7CiBNT0RVTEVfVkVSU0lPTigiMS4wLWFscGhhIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmgKaW5kZXggMTM1YzJhOC4uMDg3Yzk5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuaApAQCAtMjEsNiArMjEsOCBAQAogI2RlZmluZSBDTURfU1RSRUFNSU5HX09OICAweDM2CiAjZGVmaW5lIENNRF9TVFJFQU1JTkdfT0ZGIDB4MzcKIAorI2RlZmluZSBDTURfR0VUX0lSX0NPREUgICAweDQ3CisKICNkZWZpbmUgQ01EX0FOQUxPRyAgICAgICAgMHg1MAogI2RlZmluZSBDTURfRElHSVRBTCAgICAgICAweDUxCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1iLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYi5jCmluZGV4IDUyYWMzZTUuLmRkNWExMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1iLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWIuYwpAQCAtNjUsMTEgKzY1LDExIEBACiAJCWQtPnR1bmVyX3Bhc3NfY3RybChkLT5mZSwwLG1zZ1swXS5hZGRyKTsKIAogCWlmIChiMlswXSA9PSAweGZlKSB7Ci0JCWluZm8oInRoaXMgZGV2aWNlIGhhcyB0aGUgVGhvbXNvbiBDYWJsZSBvbmJvYXJkLiBXaGljaCBpcyBkZWZhdWx0LiIpOworCQlpbmZvKCJUaGlzIGRldmljZSBoYXMgdGhlIFRob21zb24gQ2FibGUgb25ib2FyZC4gV2hpY2ggaXMgZGVmYXVsdC4iKTsKIAkJZGlidXNiX3Rob21zb25fdHVuZXJfYXR0YWNoKGQpOwogCX0gZWxzZSB7CiAJCXU4IGJwbGxbNF0gPSB7IDB4MGIsIDB4ZjUsIDB4ODUsIDB4YWIgfTsKLQkJaW5mbygidGhpcyBkZXZpY2UgaGFzIHRoZSBQYW5hc29uaWMgRU5WNzdIMTFENSBvbmJvYXJkLiIpOworCQlpbmZvKCJUaGlzIGRldmljZSBoYXMgdGhlIFBhbmFzb25pYyBFTlY3N0gxMUQ1IG9uYm9hcmQuIik7CiAJCWQtPnBsbF9hZGRyID0gMHg2MDsKIAkJbWVtY3B5KGQtPnBsbF9pbml0LGJwbGwsNCk7CiAJCWQtPnBsbF9kZXNjID0gJmR2Yl9wbGxfdGRhNjY1eDsKQEAgLTk4LDE1ICs5OCwxNSBAQAogCiAvKiBkbyBub3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgSUQgdGFibGUgKi8KIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkaWJ1c2JfZGliMzAwMG1iX3RhYmxlIFtdID0gewotLyogMDAgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfV0lERVZJRVcsCQlVU0JfUElEX0FWRVJNRURJQV9EVkJUX1VTQl9DT0xEKX0sCi0vKiAwMSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9XSURFVklFVywJCVVTQl9QSURfQVZFUk1FRElBX0RWQlRfVVNCX1dBUk0pfSwKKy8qIDAwICovCXsgVVNCX0RFVklDRShVU0JfVklEX1dJREVWSUVXLAkJVVNCX1BJRF9BVkVSTUVESUFfRFZCVF9VU0JfQ09MRCkgfSwKKy8qIDAxICovCXsgVVNCX0RFVklDRShVU0JfVklEX1dJREVWSUVXLAkJVVNCX1BJRF9BVkVSTUVESUFfRFZCVF9VU0JfV0FSTSkgfSwKIC8qIDAyICovCXsgVVNCX0RFVklDRShVU0JfVklEX0NPTVBSTywJCVVTQl9QSURfQ09NUFJPX0RWQlUyMDAwX0NPTEQpIH0sCiAvKiAwMyAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9DT01QUk8sCQlVU0JfUElEX0NPTVBST19EVkJVMjAwMF9XQVJNKSB9LAogLyogMDQgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfQ09NUFJPX1VOSywJVVNCX1BJRF9DT01QUk9fRFZCVTIwMDBfVU5LX0NPTEQpIH0sCiAvKiAwNSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9ESUJDT00sCQlVU0JfUElEX0RJQkNPTV9NT0QzMDAwX0NPTEQpIH0sCiAvKiAwNiAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9ESUJDT00sCQlVU0JfUElEX0RJQkNPTV9NT0QzMDAwX1dBUk0pIH0sCi0vKiAwNyAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9FTVBJQSwJCQlVU0JfUElEX0tXT1JMRF9WU1RSRUFNX0NPTEQpIH0sCi0vKiAwOCAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9FTVBJQSwJCQlVU0JfUElEX0tXT1JMRF9WU1RSRUFNX1dBUk0pIH0sCisvKiAwNyAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9FTVBJQSwJCVVTQl9QSURfS1dPUkxEX1ZTVFJFQU1fQ09MRCkgfSwKKy8qIDA4ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0VNUElBLAkJVVNCX1BJRF9LV09STERfVlNUUkVBTV9XQVJNKSB9LAogLyogMDkgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfR1JBTkRURUMsCQlVU0JfUElEX0dSQU5EVEVDX0RWQlRfVVNCX0NPTEQpIH0sCiAvKiAxMCAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9HUkFORFRFQywJCVVTQl9QSURfR1JBTkRURUNfRFZCVF9VU0JfV0FSTSkgfSwKIC8qIDExICovCXsgVVNCX0RFVklDRShVU0JfVklEX0dSQU5EVEVDLAkJVVNCX1BJRF9ESUJDT01fTU9EMzAwMF9DT0xEKSB9LApAQCAtMTE3LDI3ICsxMTcsMzQgQEAKIC8qIDE2ICovCXsgVVNCX0RFVklDRShVU0JfVklEX1ZJU0lPTlBMVVMsCVVTQl9QSURfVFdJTkhBTl9WUDcwNDFfV0FSTSkgfSwKIC8qIDE3ICovCXsgVVNCX0RFVklDRShVU0JfVklEX1RXSU5IQU4sCQlVU0JfUElEX1RXSU5IQU5fVlA3MDQxX0NPTEQpIH0sCiAvKiAxOCAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9UV0lOSEFOLAkJVVNCX1BJRF9UV0lOSEFOX1ZQNzA0MV9XQVJNKSB9LAotLyogMTkgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfVUxUSU1BX0VMRUNUUk9OSUMsIFVTQl9QSURfVUxUSU1BX1RWQk9YX0NPTEQpIH0sCi0vKiAyMCAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9VTFRJTUFfRUxFQ1RST05JQywgVVNCX1BJRF9VTFRJTUFfVFZCT1hfV0FSTSkgfSwKLS8qIDIxICovCXsgVVNCX0RFVklDRShVU0JfVklEX1VMVElNQV9FTEVDVFJPTklDLCBVU0JfUElEX1VMVElNQV9UVkJPWF9BTjIyMzVfQ09MRCkgfSwKLS8qIDIyICovCXsgVVNCX0RFVklDRShVU0JfVklEX1VMVElNQV9FTEVDVFJPTklDLCBVU0JfUElEX1VMVElNQV9UVkJPWF9BTjIyMzVfV0FSTSkgfSwKKy8qIDE5ICovCXsgVVNCX0RFVklDRShVU0JfVklEX1VMVElNQV9FTEVDVFJPTklDLAlVU0JfUElEX1VMVElNQV9UVkJPWF9DT0xEKSB9LAorLyogMjAgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfVUxUSU1BX0VMRUNUUk9OSUMsCVVTQl9QSURfVUxUSU1BX1RWQk9YX1dBUk0pIH0sCisvKiAyMSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9VTFRJTUFfRUxFQ1RST05JQywJVVNCX1BJRF9VTFRJTUFfVFZCT1hfQU4yMjM1X0NPTEQpIH0sCisvKiAyMiAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9VTFRJTUFfRUxFQ1RST05JQywJVVNCX1BJRF9VTFRJTUFfVFZCT1hfQU4yMjM1X1dBUk0pIH0sCiAvKiAyMyAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9BRFNURUNILAkJVVNCX1BJRF9BRFNURUNIX1VTQjJfQ09MRCkgfSwKIAogLyogZGV2aWNlIElEIHdpdGggZGVmYXVsdCBESUJVU0IyXzAtZmlybXdhcmUgYW5kIHdpdGggdGhlIGhhY2tlZCBmaXJtd2FyZSAqLwogLyogMjQgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfQURTVEVDSCwJCVVTQl9QSURfQURTVEVDSF9VU0IyX1dBUk0pIH0sCi0vKiAyNSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9LWUUsCQkJVVNCX1BJRF9LWUVfRFZCX1RfQ09MRCkgfSwKLS8qIDI2ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0tZRSwJCQlVU0JfUElEX0tZRV9EVkJfVF9XQVJNKSB9LAorLyogMjUgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfS1lFLAkJVVNCX1BJRF9LWUVfRFZCX1RfQ09MRCkgfSwKKy8qIDI2ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0tZRSwJCVVTQl9QSURfS1lFX0RWQl9UX1dBUk0pIH0sCiAKIC8qIDI3ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0tXT1JMRCwJCVVTQl9QSURfS1dPUkxEX1ZTVFJFQU1fQ09MRCkgfSwKIAotLyogMjggKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfVUxUSU1BX0VMRUNUUk9OSUMsCQlVU0JfUElEX1VMVElNQV9UVkJPWF9VU0IyX0NPTEQpIH0sCi0vKiAyOSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9VTFRJTUFfRUxFQ1RST05JQywJCVVTQl9QSURfVUxUSU1BX1RWQk9YX1VTQjJfV0FSTSkgfSwKKy8qIDI4ICovCXsgVVNCX0RFVklDRShVU0JfVklEX1VMVElNQV9FTEVDVFJPTklDLAlVU0JfUElEX1VMVElNQV9UVkJPWF9VU0IyX0NPTEQpIH0sCisvKiAyOSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9VTFRJTUFfRUxFQ1RST05JQywJVVNCX1BJRF9VTFRJTUFfVFZCT1hfVVNCMl9XQVJNKSB9LAogCi0vLyAjZGVmaW5lIERWQl9VU0JfRElCVVNCX01CX0ZBVUxUWV9VU0JfSURzCisvKgorICogWFhYOiBBcyBBcnRlYyBqdXN0ICdmb3Jnb3QnIHRvIHByb2dyYW0gdGhlIEVFUFJPTSBvbiBzb21lIEFydGVjIFQxIGRldmljZXMKKyAqICAgICAgd2UgZG9uJ3QgY2F0Y2ggdGhlc2UgZmF1bHR5IElEcyAobmFtZWx5ICdDeXByZXNzIEZYMSBVU0IgY29udHJvbGxlcicpIHRoYXQKKyAqICAgICAgaGF2ZSBiZWVuIGxlZnQgb24gdGhlIGRldmljZS4gSWYgeW91IGRvbid0IGhhdmUgc3VjaCBhIGRldmljZSBidXQgYW4gQXJ0ZWMKKyAqICAgICAgZGV2aWNlIHRoYXQncyBzdXBwb3NlZCB0byB3b3JrIHdpdGggdGhpcyBkcml2ZXIgYnV0IGlzIG5vdCBkZXRlY3RlZCBieSBpdCwKKyAqICAgICAgZnJlZSB0byBlbmFibGUgQ09ORklHX0RWQl9VU0JfRElCVVNCX01CX0ZBVUxUWSB2aWEgeW91ciBrZXJuZWwgY29uZmlnLgorICovCiAKLSNpZmRlZiBEVkJfVVNCX0RJQlVTQl9NQl9GQVVMVFlfVVNCX0lEcworI2lmZGVmIENPTkZJR19EVkJfVVNCX0RJQlVTQl9NQl9GQVVMVFkKIC8qIDMwICovCXsgVVNCX0RFVklDRShVU0JfVklEX0FOQ0hPUiwJCVVTQl9QSURfVUxUSU1BX1RWQk9YX0FOQ0hPUl9DT0xEKSB9LAogI2VuZGlmCisKIAkJCXsgfQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIGRpYnVzYl9kaWIzMDAwbWJfdGFibGUpOwpAQCAtMjU3LDcgKzI2NCw3IEBACiAJCX0KIAl9LAogCi0jaWZkZWYgRFZCX1VTQl9ESUJVU0JfTUJfRkFVTFRZX1VTQl9JRHMKKyNpZmRlZiBDT05GSUdfRFZCX1VTQl9ESUJVU0JfTUJfRkFVTFRZCiAJLm51bV9kZXZpY2VfZGVzY3MgPSAyLAogI2Vsc2UKIAkubnVtX2RldmljZV9kZXNjcyA9IDEsCkBAIC0yNjcsMTEgKzI3NCwxMiBAQAogCQkJeyAmZGlidXNiX2RpYjMwMDBtYl90YWJsZVsyMF0sIE5VTEwgfSwKIAkJCXsgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMjFdLCBOVUxMIH0sCiAJCX0sCi0jaWZkZWYgRFZCX1VTQl9ESUJVU0JfTUJfRkFVTFRZX1VTQl9JRHMKKyNpZmRlZiBDT05GSUdfRFZCX1VTQl9ESUJVU0JfTUJfRkFVTFRZCiAJCXsJIkFydGVjIFQxIFVTQjEuMSBUVkJPWCB3aXRoIEFOMjIzNSAoZmF1bHR5IFVTQiBJRHMpIiwKIAkJCXsgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMzBdLCBOVUxMIH0sCiAJCQl7IE5VTEwgfSwKIAkJfSwKKwkJeyBOVUxMIH0sCiAjZW5kaWYKIAl9CiB9OwpAQCAtMzIzLDYgKzMzMSw3IEBACiAJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzI3XSwgTlVMTCB9LAogCQkJeyBOVUxMIH0KIAkJfSwKKwkJeyBOVUxMIH0sCiAJfQogfTsKIApAQCAtMzY5LDYgKzM3OCw3IEBACiAJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzI4XSwgTlVMTCB9LAogCQkJeyAmZGlidXNiX2RpYjMwMDBtYl90YWJsZVsyOV0sIE5VTEwgfSwKIAkJfSwKKwkJeyBOVUxMIH0sCiAJfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWdpdHYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlnaXR2LmMKaW5kZXggNDUwNDE3YS4uZTZjNTVjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWdpdHYuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpZ2l0di5jCkBAIC0zMiw3ICszMiw3IEBACiAJc25kYnVmWzFdID0gdnY7CiAJc25kYnVmWzJdID0gd28gPyB3bGVuIDogcmxlbjsKIAotCWlmICghd28pIHsKKwlpZiAod28pIHsKIAkJbWVtY3B5KCZzbmRidWZbM10sd2J1Zix3bGVuKTsKIAkJZHZiX3VzYl9nZW5lcmljX3dyaXRlKGQsc25kYnVmLDcpOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUtZmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS1mZS5jCmluZGV4IDBhOTRlYzIuLmNkMjFkZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS1mZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS1mZS5jCkBAIC0xNTYsMTAgKzE1Niw5IEBACiAJc3RydWN0IGR0dDIwMHVfZmVfc3RhdGUqIHN0YXRlID0gTlVMTDsKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCi0Jc3RhdGUgPSAoc3RydWN0IGR0dDIwMHVfZmVfc3RhdGUqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZHR0MjAwdV9mZV9zdGF0ZSksIEdGUF9LRVJORUwpOworCXN0YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGR0dDIwMHVfZmVfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUgPT0gTlVMTCkKIAkJZ290byBlcnJvcjsKLQltZW1zZXQoc3RhdGUsMCxzaXplb2Yoc3RydWN0IGR0dDIwMHVfZmVfc3RhdGUpKTsKIAogCWRlYl9pbmZvKCJhdHRhY2hpbmcgZnJvbnRlbmQgZHR0MjAwdVxuIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LmMKaW5kZXggNmUyYmFjOC4uMTMwZWE3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LmMKQEAgLTE1MSw3ICsxNTEsNyBAQAogCQkgIC5jb2xkX2lkcyA9IHsgJmR0dDIwMHVfdXNiX3RhYmxlWzBdLCBOVUxMIH0sCiAJCSAgLndhcm1faWRzID0geyAmZHR0MjAwdV91c2JfdGFibGVbMV0sIE5VTEwgfSwKIAkJfSwKLQkJeyBOVUxMIH0sCisJCXsgMCB9LAogCX0KIH07CiAKQEAgLTE2MCw3ICsxNjAsNyBAQAogCS5waWRfZmlsdGVyX2NvdW50ID0gMTUsCiAKIAkudXNiX2N0cmwgPSBDWVBSRVNTX0ZYMiwKLQkuZmlybXdhcmUgPSAiZHZiLXVzYi13dDIyMHUtMDEuZnciLAorCS5maXJtd2FyZSA9ICJkdmItdXNiLXd0MjIwdS0wMi5mdyIsCiAKIAkucG93ZXJfY3RybCAgICAgID0gZHR0MjAwdV9wb3dlcl9jdHJsLAogCS5zdHJlYW1pbmdfY3RybCAgPSBkdHQyMDB1X3N0cmVhbWluZ19jdHJsLApAQCAtMTkyLDcgKzE5Miw3IEBACiAJCSAgLmNvbGRfaWRzID0geyAmZHR0MjAwdV91c2JfdGFibGVbMl0sIE5VTEwgfSwKIAkJICAud2FybV9pZHMgPSB7ICZkdHQyMDB1X3VzYl90YWJsZVszXSwgTlVMTCB9LAogCQl9LAotCQl7IE5VTEwgfSwKKwkJeyAwIH0sCiAJfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUuaAppbmRleCA2ZjFmMzA0Li4wMDViMGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUuaApAQCAtMTMsNiArMTMsNyBAQAogI2RlZmluZSBfRFZCX1VTQl9EVFQyMDBVX0hfCiAKICNkZWZpbmUgRFZCX1VTQl9MT0dfUFJFRklYICJkdHQyMDB1IgorCiAjaW5jbHVkZSAiZHZiLXVzYi5oIgogCiBleHRlcm4gaW50IGR2Yl91c2JfZHR0MjAwdV9kZWJ1ZzsKQEAgLTI1LDE1ICsyNiwxNSBAQAogICogIDg4IC0gbG9ja2luZyAyIGJ5dGVzICgweDgwIDB4NDAgPT0gbm8gc2lnbmFsLCAweDg5IDB4MjAgPT0gbmljZSBzaWduYWwpCiAgKi8KIAotI2RlZmluZSBHRVRfU1BFRUQgICAgICAgICAgICAweDAwCi0jZGVmaW5lIEdFVF9UVU5FX1NUQVRVUyAgICAgIDB4ODEKLSNkZWZpbmUgR0VUX1JDX0NPREUgICAgICAgICAgMHg4NAotI2RlZmluZSBHRVRfQ09ORklHVVJBVElPTiAgICAweDg4Ci0jZGVmaW5lIEdFVF9BR0MgICAgICAgICAgICAgIDB4ODkKLSNkZWZpbmUgR0VUX1NOUiAgICAgICAgICAgICAgMHg4YQotI2RlZmluZSBHRVRfVklUX0VSUl9DTlQgICAgICAweDhjCi0jZGVmaW5lIEdFVF9SU19FUlJfQ05UICAgICAgIDB4OGQKLSNkZWZpbmUgR0VUX1JTX1VOQ09SX0JMS19DTlQgMHg4ZQorI2RlZmluZSBHRVRfU1BFRUQJCTB4MDAKKyNkZWZpbmUgR0VUX1RVTkVfU1RBVFVTCQkweDgxCisjZGVmaW5lIEdFVF9SQ19DT0RFCQkweDg0CisjZGVmaW5lIEdFVF9DT05GSUdVUkFUSU9OCTB4ODgKKyNkZWZpbmUgR0VUX0FHQwkJCTB4ODkKKyNkZWZpbmUgR0VUX1NOUgkJCTB4OGEKKyNkZWZpbmUgR0VUX1ZJVF9FUlJfQ05UCQkweDhjCisjZGVmaW5lIEdFVF9SU19FUlJfQ05UCQkweDhkCisjZGVmaW5lIEdFVF9SU19VTkNPUl9CTEtfQ05UCTB4OGUKIAogLyogd3JpdGUKICAqICAwMSAtIGluaXQKQEAgLTQ0LDEyICs0NSwxMiBAQAogICogIDA4IC0gdHJhbnNmZXIgc3dpdGNoCiAgKi8KIAotI2RlZmluZSBTRVRfSU5JVCAgICAgICAgIDB4MDEKLSNkZWZpbmUgU0VUX1JGX0ZSRVEgICAgICAweDAyCi0jZGVmaW5lIFNFVF9CQU5EV0lEVEggICAgMHgwMwotI2RlZmluZSBTRVRfUElEX0ZJTFRFUiAgIDB4MDQKLSNkZWZpbmUgUkVTRVRfUElEX0ZJTFRFUiAweDA1Ci0jZGVmaW5lIFNFVF9TVFJFQU1JTkcgICAgMHgwOAorI2RlZmluZSBTRVRfSU5JVAkJMHgwMQorI2RlZmluZSBTRVRfUkZfRlJFUQkJMHgwMgorI2RlZmluZSBTRVRfQkFORFdJRFRICQkweDAzCisjZGVmaW5lIFNFVF9QSURfRklMVEVSCQkweDA0CisjZGVmaW5lIFJFU0VUX1BJRF9GSUxURVIJMHgwNQorI2RlZmluZSBTRVRfU1RSRUFNSU5HCQkweDA4CiAKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICogZHR0MjAwdV9mZV9hdHRhY2goc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWNvbW1vbi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWNvbW1vbi5oCmluZGV4IDczMDA0ODkuLmEzNDYwYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1jb21tb24uaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItY29tbW9uLmgKQEAgLTI0LDcgKzI0LDcgQEAKICNkZWZpbmUgZGViX21lbShhcmdzLi4uKSAgZHByaW50ayhkdmJfdXNiX2RlYnVnLDB4ODAsYXJncykKIAogLyogY29tbW9ubHkgdXNlZCAgbWV0aG9kcyAqLwotZXh0ZXJuIGludCB1c2JfY3lwcmVzc19sb2FkX2Zpcm13YXJlKHN0cnVjdCB1c2JfZGV2aWNlICosIGNvbnN0IGNoYXIgKiwgaW50KTsKK2V4dGVybiBpbnQgZHZiX3VzYl9kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgdXNiX2RldmljZSAqLCBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzICopOwogCiBleHRlcm4gaW50IGR2Yl91c2JfdXJiX3N1Ym1pdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKik7CiBleHRlcm4gaW50IGR2Yl91c2JfdXJiX2tpbGwoc3RydWN0IGR2Yl91c2JfZGV2aWNlICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWZpcm13YXJlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItZmlybXdhcmUuYwppbmRleCA1MjQ0ZTM5Li44NTM1ODk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItZmlybXdhcmUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItZmlybXdhcmUuYwpAQCAtOSw3ICs5LDYgQEAKICAqLwogI2luY2x1ZGUgImR2Yi11c2ItY29tbW9uLmgiCiAKLSNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogCiBzdHJ1Y3QgdXNiX2N5cHJlc3NfY29udHJvbGxlciB7CkBAIC0xOSw5ICsxOCwxMCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCB1c2JfY3lwcmVzc19jb250cm9sbGVyIGN5cHJlc3NbXSA9IHsKLQl7IC5pZCA9IENZUFJFU1NfQU4yMTM1LCAubmFtZSA9ICJDeXByZXNzIEFOMjEzNSIsIC5jcHVfY3NfcmVnaXN0ZXIgPSAweDdmOTIgfSwKLQl7IC5pZCA9IENZUFJFU1NfQU4yMjM1LCAubmFtZSA9ICJDeXByZXNzIEFOMjIzNSIsIC5jcHVfY3NfcmVnaXN0ZXIgPSAweDdmOTIgfSwKLQl7IC5pZCA9IENZUFJFU1NfRlgyLCAgICAubmFtZSA9ICJDeXByZXNzIEZYMiIsICAgIC5jcHVfY3NfcmVnaXN0ZXIgPSAweGU2MDAgfSwKKwl7IC5pZCA9IERFVklDRV9TUEVDSUZJQywgLm5hbWUgPSAiRGV2aWNlIHNwZWNpZmljIiwgLmNwdV9jc19yZWdpc3RlciA9IDAgfSwKKwl7IC5pZCA9IENZUFJFU1NfQU4yMTM1LCAgLm5hbWUgPSAiQ3lwcmVzcyBBTjIxMzUiLCAgLmNwdV9jc19yZWdpc3RlciA9IDB4N2Y5MiB9LAorCXsgLmlkID0gQ1lQUkVTU19BTjIyMzUsICAubmFtZSA9ICJDeXByZXNzIEFOMjIzNSIsICAuY3B1X2NzX3JlZ2lzdGVyID0gMHg3ZjkyIH0sCisJeyAuaWQgPSBDWVBSRVNTX0ZYMiwgICAgIC5uYW1lID0gIkN5cHJlc3MgRlgyIiwgICAgIC5jcHVfY3NfcmVnaXN0ZXIgPSAweGU2MDAgfSwKIH07CiAKIC8qCkBAIC0zMCw3MSArMzAsMTE3IEBACiBzdGF0aWMgaW50IHVzYl9jeXByZXNzX3dyaXRlbWVtKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LHUxNiBhZGRyLHU4ICpkYXRhLCB1OCBsZW4pCiB7CiAJcmV0dXJuIHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwwKSwKLQkJCTB4YTAsIFVTQl9UWVBFX1ZFTkRPUiwgYWRkciwgMHgwMCwgZGF0YSwgbGVuLCA1KkhaKTsKKwkJCTB4YTAsIFVTQl9UWVBFX1ZFTkRPUiwgYWRkciwgMHgwMCwgZGF0YSwgbGVuLCA1MDAwKTsKIH0KIAotaW50IHVzYl9jeXByZXNzX2xvYWRfZmlybXdhcmUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgdHlwZSkKK2ludCB1c2JfY3lwcmVzc19sb2FkX2Zpcm13YXJlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LCBpbnQgdHlwZSkKIHsKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3ID0gTlVMTDsKLQl1MTYgYWRkcjsKLQl1OCAqYiwqcDsKLQlpbnQgcmV0ID0gMCxpOworCXN0cnVjdCBoZXhsaW5lIGh4OworCXU4IHJlc2V0OworCWludCByZXQscG9zPTA7CiAKLQlpZiAoKHJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmaWxlbmFtZSwgJnVkZXYtPmRldikpICE9IDApIHsKLQkJZXJyKCJkaWQgbm90IGZpbmQgdGhlIGZpcm13YXJlIGZpbGUuICglcykgIgotCQkJIlBsZWFzZSBzZWUgbGludXgvRG9jdW1lbnRhdGlvbi9kdmIvIGZvciBtb3JlIGRldGFpbHMgb24gZmlybXdhcmUtcHJvYmxlbXMuIiwKLQkJCWZpbGVuYW1lKTsKKwkvKiBzdG9wIHRoZSBDUFUgKi8KKwlyZXNldCA9IDE7CisJaWYgKChyZXQgPSB1c2JfY3lwcmVzc193cml0ZW1lbSh1ZGV2LGN5cHJlc3NbdHlwZV0uY3B1X2NzX3JlZ2lzdGVyLCZyZXNldCwxKSkgIT0gMSkKKwkJZXJyKCJjb3VsZCBub3Qgc3RvcCB0aGUgVVNCIGNvbnRyb2xsZXIgQ1BVLiIpOworCisJd2hpbGUgKChyZXQgPSBkdmJfdXNiX2dldF9oZXhsaW5lKGZ3LCZoeCwmcG9zKSkgPiAwKSB7CisJCWRlYl9mdygid3JpdGluZyB0byBhZGRyZXNzIDB4JTA0eCAoYnVmZmVyOiAweCUwMnggJTAyeClcbiIsaHguYWRkcixoeC5sZW4saHguY2hrKTsKKwkJcmV0ID0gdXNiX2N5cHJlc3Nfd3JpdGVtZW0odWRldixoeC5hZGRyLGh4LmRhdGEsaHgubGVuKTsKKworCQlpZiAocmV0ICE9IGh4LmxlbikgeworCQkJZXJyKCJlcnJvciB3aGlsZSB0cmFuc2ZlcnJpbmcgZmlybXdhcmUgIgorCQkJCSIodHJhbnNmZXJyZWQgc2l6ZTogJWQsIGJsb2NrIHNpemU6ICVkKSIsCisJCQkJcmV0LGh4Lmxlbik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHJldCA8IDApIHsKKwkJZXJyKCJmaXJtd2FyZSBkb3dubG9hZCBmYWlsZWQgYXQgJWQgd2l0aCAlZCIscG9zLHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JaW5mbygiZG93bmxvYWRpbmcgZmlybXdhcmUgZnJvbSBmaWxlICclcycgdG8gdGhlICclcyciLGZpbGVuYW1lLGN5cHJlc3NbdHlwZV0ubmFtZSk7Ci0KLQlwID0ga21hbGxvYyhmdy0+c2l6ZSxHRlBfS0VSTkVMKTsKLQlpZiAocCAhPSBOVUxMKSB7Ci0JCXU4IHJlc2V0OwotCQkvKgotCQkgKiB5b3UgY2Fubm90IHVzZSB0aGUgZnctPmRhdGEgYXMgYnVmZmVyIGZvcgotCQkgKiB1c2JfY29udHJvbF9tc2csIGEgbmV3IGJ1ZmZlciBoYXMgdG8gYmUKLQkJICogY3JlYXRlZAotCQkgKi8KLQkJbWVtY3B5KHAsZnctPmRhdGEsZnctPnNpemUpOwotCi0JCS8qIHN0b3AgdGhlIENQVSAqLwotCQlyZXNldCA9IDE7Ci0JCWlmICgocmV0ID0gdXNiX2N5cHJlc3Nfd3JpdGVtZW0odWRldixjeXByZXNzW3R5cGVdLmNwdV9jc19yZWdpc3RlciwmcmVzZXQsMSkpICE9IDEpCi0JCQllcnIoImNvdWxkIG5vdCBzdG9wIHRoZSBVU0IgY29udHJvbGxlciBDUFUuIik7Ci0JCWZvcihpID0gMDsgcFtpKzNdID09IDAgJiYgaSA8IGZ3LT5zaXplOyApIHsKLQkJCWIgPSAodTggKikgJnBbaV07Ci0JCQlhZGRyID0gY3B1X3RvX2xlMTYoICooKHUxNiAqKSAmYlsxXSkgKTsKLQotCQkJZGViX2Z3KCJ3cml0aW5nIHRvIGFkZHJlc3MgMHglMDR4IChidWZmZXI6IDB4JTAyeCUwMngpXG4iLGFkZHIsYlsxXSxiWzJdKTsKLQotCQkJcmV0ID0gdXNiX2N5cHJlc3Nfd3JpdGVtZW0odWRldixhZGRyLCZiWzRdLGJbMF0pOwotCi0JCQlpZiAocmV0ICE9IGJbMF0pIHsKLQkJCQllcnIoImVycm9yIHdoaWxlIHRyYW5zZmVycmluZyBmaXJtd2FyZSAiCi0JCQkJCSIodHJhbnNmZXJyZWQgc2l6ZTogJWQsIGJsb2NrIHNpemU6ICVkKSIsCi0JCQkJCXJldCxiWzBdKTsKLQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaSArPSA1ICsgYlswXTsKLQkJfQotCQkvKiBsZW5ndGggaW4gcmV0ICovCi0JCWlmIChyZXQgPiAwKQotCQkJcmV0ID0gMDsKKwlpZiAocmV0ID09IDApIHsKIAkJLyogcmVzdGFydCB0aGUgQ1BVICovCiAJCXJlc2V0ID0gMDsKIAkJaWYgKHJldCB8fCB1c2JfY3lwcmVzc193cml0ZW1lbSh1ZGV2LGN5cHJlc3NbdHlwZV0uY3B1X2NzX3JlZ2lzdGVyLCZyZXNldCwxKSAhPSAxKSB7CiAJCQllcnIoImNvdWxkIG5vdCByZXN0YXJ0IHRoZSBVU0IgY29udHJvbGxlciBDUFUuIik7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQl9Ci0KLQkJa2ZyZWUocCk7Ci0JfSBlbHNlIHsKLQkJcmV0ID0gLUVOT01FTTsKLQl9Ci0JcmVsZWFzZV9maXJtd2FyZShmdyk7CisJfSBlbHNlCisJCXJldCA9IC1FSU87CiAKIAlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTCh1c2JfY3lwcmVzc19sb2FkX2Zpcm13YXJlKTsKKworaW50IGR2Yl91c2JfZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgKnByb3BzKQoreworCWludCByZXQ7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyA9IE5VTEw7CisKKwlpZiAoKHJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBwcm9wcy0+ZmlybXdhcmUsICZ1ZGV2LT5kZXYpKSAhPSAwKSB7CisJCWVycigiZGlkIG5vdCBmaW5kIHRoZSBmaXJtd2FyZSBmaWxlLiAoJXMpICIKKwkJCSJQbGVhc2Ugc2VlIGxpbnV4L0RvY3VtZW50YXRpb24vZHZiLyBmb3IgbW9yZSBkZXRhaWxzIG9uIGZpcm13YXJlLXByb2JsZW1zLiAoJWQpIiwKKwkJCXByb3BzLT5maXJtd2FyZSxyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWluZm8oImRvd25sb2FkaW5nIGZpcm13YXJlIGZyb20gZmlsZSAnJXMnIixwcm9wcy0+ZmlybXdhcmUpOworCisJc3dpdGNoIChwcm9wcy0+dXNiX2N0cmwpIHsKKwkJY2FzZSBDWVBSRVNTX0FOMjEzNToKKwkJY2FzZSBDWVBSRVNTX0FOMjIzNToKKwkJY2FzZSBDWVBSRVNTX0ZYMjoKKwkJCXJldCA9IHVzYl9jeXByZXNzX2xvYWRfZmlybXdhcmUodWRldiwgZncsIHByb3BzLT51c2JfY3RybCk7CisJCQlicmVhazsKKwkJY2FzZSBERVZJQ0VfU1BFQ0lGSUM6CisJCQlpZiAocHJvcHMtPmRvd25sb2FkX2Zpcm13YXJlKQorCQkJCXJldCA9IHByb3BzLT5kb3dubG9hZF9maXJtd2FyZSh1ZGV2LGZ3KTsKKwkJCWVsc2UgeworCQkJCWVycigiQlVHOiBkcml2ZXIgZGlkbid0IHNwZWNpZmllZCBhIGRvd25sb2FkX2Zpcm13YXJlLWNhbGxiYWNrLCBhbHRob3VnaCBpdCBjbGFpbXMgdG8gaGF2ZSBhIERFVklDRV9TUEVDSUZJQyBvbmUuIik7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCX0KKworCXJlbGVhc2VfZmlybXdhcmUoZncpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBkdmJfdXNiX2dldF9oZXhsaW5lKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsIHN0cnVjdCBoZXhsaW5lICpoeCwgaW50ICpwb3MpCit7CisJdTggKmIgPSAodTggKikgJmZ3LT5kYXRhWypwb3NdOworCWludCBkYXRhX29mZnMgPSA0OworCWlmICgqcG9zID49IGZ3LT5zaXplKQorCQlyZXR1cm4gMDsKKworCW1lbXNldChoeCwwLHNpemVvZihzdHJ1Y3QgaGV4bGluZSkpOworCisJaHgtPmxlbiAgPSBiWzBdOworCisJaWYgKCgqcG9zICsgaHgtPmxlbiArIDQpID49IGZ3LT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWh4LT5hZGRyID0gbGUxNl90b19jcHUoICooKHUxNiAqKSAmYlsxXSkgKTsKKwloeC0+dHlwZSA9IGJbM107CisKKwlpZiAoaHgtPnR5cGUgPT0gMHgwNCkgeworCQkvKiBiWzRdIGFuZCBiWzVdIGFyZSB0aGUgRXh0ZW5kZWQgbGluZWFyIGFkZHJlc3MgcmVjb3JkIGRhdGEgZmllbGQgKi8KKwkJaHgtPmFkZHIgfD0gKGJbNF0gPDwgMjQpIHwgKGJbNV0gPDwgMTYpOworLyoJCWh4LT5sZW4gLT0gMjsKKwkJZGF0YV9vZmZzICs9IDI7ICovCisJfQorCW1lbWNweShoeC0+ZGF0YSwmYltkYXRhX29mZnNdLGh4LT5sZW4pOworCWh4LT5jaGsgPSBiW2h4LT5sZW4gKyBkYXRhX29mZnNdOworCisJKnBvcyArPSBoeC0+bGVuICsgNTsKKworCXJldHVybiAqcG9zOworfQorRVhQT1JUX1NZTUJPTChkdmJfdXNiX2dldF9oZXhsaW5lKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWkyYy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWkyYy5jCmluZGV4IGRhOTcwOTQuLjliMjU0NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaTJjLmMKQEAgLTUyLDkgKzUyLDggQEAKIAlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gZC0+cGxsX2FkZHIsIC5mbGFncyA9IDAsIC5idWYgPSBkLT5wbGxfaW5pdCwgLmxlbiA9IDQgfTsKIAlpbnQgcmV0ID0gMDsKIAotCS8qIGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZSAqLwotCWlmIChkLT5wbGxfaW5pdFswXSA9PSAweDAwICYmIGQtPnBsbF9pbml0WzFdID09IDB4MDAgJiYKLQkJZC0+cGxsX2luaXRbMl0gPT0gMHgwMCAmJiBkLT5wbGxfaW5pdFszXSA9PSAweDAwKQorCS8qIGlmIHBsbF9kZXNjIGlzIG5vdCB1c2VkICovCisJaWYgKGQtPnBsbF9kZXNjID09IE5VTEwpCiAJCXJldHVybiAwOwogCiAJaWYgKGQtPnR1bmVyX3Bhc3NfY3RybCkKQEAgLTgwLDYgKzc5LDkgQEAKIHsKIAlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBmZS0+ZHZiLT5wcml2OwogCisJaWYgKGQtPnBsbF9kZXNjID09IE5VTEwpCisJCXJldHVybiAwOworCiAJZGViX3BsbCgicGxsIGFkZHI6ICV4LCBmcmVxOiAlZCAlcFxuIixkLT5wbGxfYWRkcixmZXAtPmZyZXF1ZW5jeSxkLT5wbGxfZGVzYyk7CiAKIAliWzBdID0gZC0+cGxsX2FkZHIgPDwgMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaAppbmRleCA2YmU5OWU1Li40YTFiOWU3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaApAQCAtODYsMTEgKzg2LDE3IEBACiAjZGVmaW5lIFVTQl9QSURfV0lOVFZfTk9WQV9UX1VTQjJfQ09MRAkJMHg5MzAwCiAjZGVmaW5lIFVTQl9QSURfV0lOVFZfTk9WQV9UX1VTQjJfV0FSTQkJMHg5MzAxCiAjZGVmaW5lIFVTQl9QSURfTkVCVUxBX0RJR0lUVgkJCQkweDAyMDEKLSNkZWZpbmUgVVNCX1BJRF9EVklDT19CTFVFQklSRF9MR1oyMDEJCTB4ZGIwMAotI2RlZmluZSBVU0JfUElEX0RWSUNPX0JMVUVCSVJEX1RINzU3OQkJMHhkYjEwCiAjZGVmaW5lIFVTQl9QSURfRFZJQ09fQkxVRUJJUkRfTEdEVAkJCTB4ZDgyMAotI2RlZmluZSBVU0JfUElEX0RWSUNPX0JMVUVCSVJEX0xHWjIwMV8xCQkweGRiMDEKLSNkZWZpbmUgVVNCX1BJRF9EVklDT19CTFVFQklSRF9USDc1NzlfMgkJMHhkYjExCisjZGVmaW5lIFVTQl9QSURfRFZJQ09fQkxVRUJJUkRfTEcwNjRGX0NPTEQJCTB4ZDUwMAorI2RlZmluZSBVU0JfUElEX0RWSUNPX0JMVUVCSVJEX0xHMDY0Rl9XQVJNCQkweGQ1MDEKKyNkZWZpbmUgVVNCX1BJRF9EVklDT19CTFVFQklSRF9MR1oyMDFfQ09MRAkJMHhkYjAwCisjZGVmaW5lIFVTQl9QSURfRFZJQ09fQkxVRUJJUkRfTEdaMjAxX1dBUk0JCTB4ZGIwMQorI2RlZmluZSBVU0JfUElEX0RWSUNPX0JMVUVCSVJEX1RINzU3OV9DT0xECQkweGRiMTAKKyNkZWZpbmUgVVNCX1BJRF9EVklDT19CTFVFQklSRF9USDc1NzlfV0FSTQkJMHhkYjExCisjZGVmaW5lIFVTQl9QSURfRFZJQ09fQkxVRUJJUkRfREVFMTYwMV9DT0xECQkweGRiNTAKKyNkZWZpbmUgVVNCX1BJRF9EVklDT19CTFVFQklSRF9ERUUxNjAxX1dBUk0JCTB4ZGI1MQorI2RlZmluZSBVU0JfUElEX0RJR0lUQUxOT1dfQkxVRUJJUkRfREVFMTYwMV9DT0xECTB4ZGI1NAorI2RlZmluZSBVU0JfUElEX0RJR0lUQUxOT1dfQkxVRUJJUkRfREVFMTYwMV9XQVJNCTB4ZGI1NQogI2RlZmluZSBVU0JfUElEX01FRElPTl9NRDk1NzAwCQkJCTB4MDkzMgogI2RlZmluZSBVU0JfUElEX0tZRV9EVkJfVF9DT0xECQkJCTB4NzAxZQogI2RlZmluZSBVU0JfUElEX0tZRV9EVkJfVF9XQVJNCQkJCTB4NzAxZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWluaXQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pbml0LmMKaW5kZXggZGQ4ZTBiOS4uNzE2ZjhiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWluaXQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaW5pdC5jCkBAIC0xMzgsNiArMTM4LDkgQEAKIAogCWludCByZXQgPSAtRU5PTUVNLGNvbGQ9MDsKIAorCWlmIChkdSAhPSBOVUxMKQorCQkqZHUgPSBOVUxMOworCiAJaWYgKChkZXNjID0gZHZiX3VzYl9maW5kX2RldmljZSh1ZGV2LHByb3BzLCZjb2xkKSkgPT0gTlVMTCkgewogCQlkZWJfZXJyKCJzb21ldGhpbmcgd2VudCB2ZXJ5IHdyb25nLCBkZXZpY2Ugd2FzIG5vdCBmb3VuZCBpbiBjdXJyZW50IGRldmljZSBsaXN0IC0gbGV0J3Mgc2VlIHdoYXQgY29tZXMgbmV4dC5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTE0NSwzOSArMTQ4LDM5IEBACiAKIAlpZiAoY29sZCkgewogCQlpbmZvKCJmb3VuZCBhICclcycgaW4gY29sZCBzdGF0ZSwgd2lsbCB0cnkgdG8gbG9hZCBhIGZpcm13YXJlIixkZXNjLT5uYW1lKTsKLQkJcmV0ID0gdXNiX2N5cHJlc3NfbG9hZF9maXJtd2FyZSh1ZGV2LHByb3BzLT5maXJtd2FyZSxwcm9wcy0+dXNiX2N0cmwpOwotCX0gZWxzZSB7Ci0JCWluZm8oImZvdW5kIGEgJyVzJyBpbiB3YXJtIHN0YXRlLiIsZGVzYy0+bmFtZSk7Ci0JCWQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UpLEdGUF9LRVJORUwpOwotCQlpZiAoZCA9PSBOVUxMKSB7Ci0JCQllcnIoIm5vIG1lbW9yeSBmb3IgJ3N0cnVjdCBkdmJfdXNiX2RldmljZSciKTsKKwkJcmV0ID0gZHZiX3VzYl9kb3dubG9hZF9maXJtd2FyZSh1ZGV2LHByb3BzKTsKKwkJaWYgKCFwcm9wcy0+bm9fcmVjb25uZWN0KQogCQkJcmV0dXJuIHJldDsKLQkJfQotCQltZW1zZXQoZCwwLHNpemVvZihzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UpKTsKLQotCQlkLT51ZGV2ID0gdWRldjsKLQkJbWVtY3B5KCZkLT5wcm9wcyxwcm9wcyxzaXplb2Yoc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcykpOwotCQlkLT5kZXNjID0gZGVzYzsKLQkJZC0+b3duZXIgPSBvd25lcjsKLQotCQlpZiAoZC0+cHJvcHMuc2l6ZV9vZl9wcml2ID4gMCkgewotCQkJZC0+cHJpdiA9IGttYWxsb2MoZC0+cHJvcHMuc2l6ZV9vZl9wcml2LEdGUF9LRVJORUwpOwotCQkJaWYgKGQtPnByaXYgPT0gTlVMTCkgewotCQkJCWVycigibm8gbWVtb3J5IGZvciBwcml2IGluICdzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UnIik7Ci0JCQkJa2ZyZWUoZCk7Ci0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl9Ci0JCQltZW1zZXQoZC0+cHJpdiwwLGQtPnByb3BzLnNpemVfb2ZfcHJpdik7Ci0JCX0KLQotCQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGQpOwotCi0JCWlmIChkdSAhPSBOVUxMKQotCQkJKmR1ID0gZDsKLQotCQlyZXQgPSBkdmJfdXNiX2luaXQoZCk7CiAJfQogCisJaW5mbygiZm91bmQgYSAnJXMnIGluIHdhcm0gc3RhdGUuIixkZXNjLT5uYW1lKTsKKwkJZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkdmJfdXNiX2RldmljZSksR0ZQX0tFUk5FTCk7CisJaWYgKGQgPT0gTlVMTCkgeworCQllcnIoIm5vIG1lbW9yeSBmb3IgJ3N0cnVjdCBkdmJfdXNiX2RldmljZSciKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkLT51ZGV2ID0gdWRldjsKKwltZW1jcHkoJmQtPnByb3BzLHByb3BzLHNpemVvZihzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzKSk7CisJZC0+ZGVzYyA9IGRlc2M7CisJZC0+b3duZXIgPSBvd25lcjsKKworCWlmIChkLT5wcm9wcy5zaXplX29mX3ByaXYgPiAwKSB7CisJCQlkLT5wcml2ID0ga3phbGxvYyhkLT5wcm9wcy5zaXplX29mX3ByaXYsR0ZQX0tFUk5FTCk7CisJCWlmIChkLT5wcml2ID09IE5VTEwpIHsKKwkJCWVycigibm8gbWVtb3J5IGZvciBwcml2IGluICdzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UnIik7CisJCQlrZnJlZShkKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBkKTsKKworCWlmIChkdSAhPSBOVUxMKQorCQkqZHUgPSBkOworCisJcmV0ID0gZHZiX3VzYl9pbml0KGQpOworCiAJaWYgKHJldCA9PSAwKQogCQlpbmZvKCIlcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgYW5kIGNvbm5lY3RlZC4iLGRlc2MtPm5hbWUpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi11cmIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi11cmIuYwppbmRleCAzNmI3MDQ4Li5lZTgyMTk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItdXJiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLXVyYi5jCkBAIC0xNzUsMTUgKzE3NSwxMyBAQAogCiAJZGViX21lbSgiYWxsIGluIGFsbCBJIHdpbGwgdXNlICVsdSBieXRlcyBmb3Igc3RyZWFtaW5nXG4iLG51bSpzaXplKTsKIAotCWlmICgoZC0+YnVmX2xpc3QgPSBrbWFsbG9jKG51bSpzaXplb2YodTggKiksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCWlmICgoZC0+YnVmX2xpc3QgPSBrY2FsbG9jKG51bSwgc2l6ZW9mKHU4ICopLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAoKGQtPmRtYV9hZGRyID0ga21hbGxvYyhudW0qc2l6ZW9mKGRtYV9hZGRyX3QpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgeworCWlmICgoZC0+ZG1hX2FkZHIgPSBrY2FsbG9jKG51bSwgc2l6ZW9mKGRtYV9hZGRyX3QpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgewogCQlrZnJlZShkLT5idWZfbGlzdCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQoZC0+YnVmX2xpc3QsMCxudW0qc2l6ZW9mKHU4ICopKTsKLQltZW1zZXQoZC0+ZG1hX2FkZHIsMCxudW0qc2l6ZW9mKGRtYV9hZGRyX3QpKTsKIAogCWQtPnN0YXRlIHw9IERWQl9VU0JfU1RBVEVfVVJCX0JVRjsKIApAQCAtMjg1LDEwICsyODMsOSBAQAogCXVzYl9jbGVhcl9oYWx0KGQtPnVkZXYsdXNiX3JjdmJ1bGtwaXBlKGQtPnVkZXYsZC0+cHJvcHMudXJiLmVuZHBvaW50KSk7CiAKIAkvKiBhbGxvY2F0ZSB0aGUgYXJyYXkgZm9yIHRoZSBkYXRhIHRyYW5zZmVyIFVSQnMgKi8KLQlkLT51cmJfbGlzdCA9IGttYWxsb2MoZC0+cHJvcHMudXJiLmNvdW50ICogc2l6ZW9mKHN0cnVjdCB1cmIgKiksR0ZQX0tFUk5FTCk7CisJZC0+dXJiX2xpc3QgPSBremFsbG9jKGQtPnByb3BzLnVyYi5jb3VudCAqIHNpemVvZihzdHJ1Y3QgdXJiICopLEdGUF9LRVJORUwpOwogCWlmIChkLT51cmJfbGlzdCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQoZC0+dXJiX2xpc3QsMCxkLT5wcm9wcy51cmIuY291bnQgKiBzaXplb2Yoc3RydWN0IHVyYiAqKSk7CiAJZC0+c3RhdGUgfD0gRFZCX1VTQl9TVEFURV9VUkJfTElTVDsKIAogCXN3aXRjaCAoZC0+cHJvcHMudXJiLnR5cGUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLmgKaW5kZXggYjRhMWE5OC4uZGQ1NjgzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLmgKQEAgLTEwLDggKzEwLDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KIAogI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgogI2luY2x1ZGUgImR2Yl9kZW11eC5oIgpAQCAtOTQsNyArOTQsMTEgQEAKICAqIEB1c2JfY3RybDogd2hpY2ggVVNCIGRldmljZS1zaWRlIGNvbnRyb2xsZXIgaXMgaW4gdXNlLiBOZWVkZWQgZm9yIGZpcm13YXJlCiAgKiAgZG93bmxvYWQuCiAgKiBAZmlybXdhcmU6IG5hbWUgb2YgdGhlIGZpcm13YXJlIGZpbGUuCi0gKgorICogQGRvd25sb2FkX2Zpcm13YXJlOiBjYWxsZWQgdG8gZG93bmxvYWQgdGhlIGZpcm13YXJlIHdoZW4gdGhlIHVzYl9jdHJsIGlzCisgKiAgREVWSUNFX1NQRUNJRklDLgorICogQG5vX3JlY29ubmVjdDogZGV2aWNlIGRvZXNuJ3QgZG8gYSByZWNvbm5lY3QgYWZ0ZXIgZG93bmxvYWRpbmcgdGhlIGZpcm13YXJlLAorICAgIHNvIGRvIHRoZSB3YXJtIGluaXRpYWxpemF0aW9uIHJpZ2h0IGFmdGVyIGl0CisKICAqIEBzaXplX29mX3ByaXY6IGhvdyBtYW55IGJ5dGVzIHNoYWxsIGJlIGFsbG9jYXRlZCBmb3IgdGhlIHByaXZhdGUgZmllbGQKICAqICBvZiBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UuCiAgKgpAQCAtMTQyLDExICsxNDYsMTQgQEAKIAlpbnQgY2FwczsKIAlpbnQgcGlkX2ZpbHRlcl9jb3VudDsKIAotI2RlZmluZSBDWVBSRVNTX0FOMjEzNSAgMAotI2RlZmluZSBDWVBSRVNTX0FOMjIzNSAgMQotI2RlZmluZSBDWVBSRVNTX0ZYMiAgICAgMgorI2RlZmluZSBERVZJQ0VfU1BFQ0lGSUMgMAorI2RlZmluZSBDWVBSRVNTX0FOMjEzNSAgMQorI2RlZmluZSBDWVBSRVNTX0FOMjIzNSAgMgorI2RlZmluZSBDWVBSRVNTX0ZYMiAgICAgMwogCWludCB1c2JfY3RybDsKLQljb25zdCBjaGFyICpmaXJtd2FyZTsKKwljb25zdCBjaGFyIGZpcm13YXJlW0ZJUk1XQVJFX05BTUVfTUFYXTsKKwlpbnQgKCpkb3dubG9hZF9maXJtd2FyZSkgKHN0cnVjdCB1c2JfZGV2aWNlICosIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKTsKKwlpbnQgbm9fcmVjb25uZWN0OwogCiAJaW50IHNpemVfb2ZfcHJpdjsKIApAQCAtMzI2LDUgKzMzMywxNSBAQAogZXh0ZXJuIGludCBkdmJfdXNiX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKiwgdThbXSk7CiBleHRlcm4gaW50IGR2Yl91c2JfcGxsX3NldF9pMmMoc3RydWN0IGR2Yl9mcm9udGVuZCAqLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKik7CiAKKy8qIGNvbW1vbmx5IHVzZWQgZmlybXdhcmUgZG93bmxvYWQgdHlwZXMgYW5kIGZ1bmN0aW9uICovCitzdHJ1Y3QgaGV4bGluZSB7CisJdTggbGVuOworCXUzMiBhZGRyOworCXU4IHR5cGU7CisJdTggZGF0YVsyNTVdOworCXU4IGNoazsKK307CitleHRlcm4gaW50IGR2Yl91c2JfZ2V0X2hleGxpbmUoY29uc3Qgc3RydWN0IGZpcm13YXJlICosIHN0cnVjdCBoZXhsaW5lICosIGludCAqKTsKK2V4dGVybiBpbnQgdXNiX2N5cHJlc3NfbG9hZF9maXJtd2FyZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgaW50IHR5cGUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2Ivbm92YS10LXVzYjIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2Ivbm92YS10LXVzYjIuYwppbmRleCBmYWM0OGZjLi40MTIwMzlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL25vdmEtdC11c2IyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ub3ZhLXQtdXNiMi5jCkBAIC0xMjksMTAgKzEyOSw2IEBACiAJCWRpYnVzYl9yZWFkX2VlcHJvbV9ieXRlKGQsaSwgJmIpOwogCiAJCW1hY1s1IC0gKGkgLSAxMzYpXSA9IGI7Ci0KLS8qCQlkZWJfZWUoIiUwMnggIixiKTsKLQkJaWYgKChpKzEpICUgMTYgPT0gMCkKLQkJCWRlYl9lZSgiXG4iKTsqLwogCX0KIAogCXJldHVybiAwOwpAQCAtMTUzLDcgKzE0OSw3IEBACiAvKiAwMSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9IQVVQUEFVR0UsICAgICBVU0JfUElEX1dJTlRWX05PVkFfVF9VU0IyX1dBUk0pIH0sCiAJCQl7IH0JCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwotTU9EVUxFX0RFVklDRV9UQUJMRSAodXNiLCBub3ZhX3RfdGFibGUpOworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIG5vdmFfdF90YWJsZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzIG5vdmFfdF9wcm9wZXJ0aWVzID0gewogCS5jYXBzID0gRFZCX1VTQl9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiB8IERWQl9VU0JfSVNfQU5fSTJDX0FEQVBURVIsCkBAIC0xOTgsNiArMTk0LDcgQEAKIAkJCXsgJm5vdmFfdF90YWJsZVswXSwgTlVMTCB9LAogCQkJeyAmbm92YV90X3RhYmxlWzFdLCBOVUxMIH0sCiAJCX0sCisJCXsgTlVMTCB9LAogCX0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDJ4LWZlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzAyeC1mZS5jCmluZGV4IDEwNGI1ZDAuLmI2ZDk1ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDJ4LWZlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwMngtZmUuYwpAQCAtMTkwLDcgKzE5MCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgdnA3MDJ4X2ZlX3NlbmRfZGlzZXFjX21zZyAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCi0JCQkgICAgICAgICAgICBzdHJ1Y3QgZHZiX2Rpc2VxY19tYXN0ZXJfY21kICptKQorCQkJCSAgICBzdHJ1Y3QgZHZiX2Rpc2VxY19tYXN0ZXJfY21kICptKQogewogCXN0cnVjdCB2cDcwMnhfZmVfc3RhdGUgKnN0ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdTggY21kWzhdLGlidWZbMTBdOwpAQCAtMjgxLDEwICsyODEsOSBAQAogCiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICogdnA3MDJ4X2ZlX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCiB7Ci0Jc3RydWN0IHZwNzAyeF9mZV9zdGF0ZSAqcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2cDcwMnhfZmVfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgdnA3MDJ4X2ZlX3N0YXRlICpzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZwNzAyeF9mZV9zdGF0ZSksIEdGUF9LRVJORUwpOwogCWlmIChzID09IE5VTEwpCiAJCWdvdG8gZXJyb3I7Ci0JbWVtc2V0KHMsMCxzaXplb2Yoc3RydWN0IHZwNzAyeF9mZV9zdGF0ZSkpOwogCiAJcy0+ZCA9IGQ7CiAJcy0+ZmUub3BzID0gJnZwNzAyeF9mZV9vcHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzAyeC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwMnguaAppbmRleCA0YTNlOGM3Li5hODA4ZDQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzAyeC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDJ4LmgKQEAgLTEzLDQ3ICsxMyw0NyBAQAogLyogY29tbWFuZHMgYXJlIHJlYWQgYW5kIHdyaXR0ZW4gd2l0aCBVU0IgY29udHJvbCBtZXNzYWdlcyAqLwogCiAvKiBjb25zZWN1dGl2ZSByZWFkL3dyaXRlIG9wZXJhdGlvbiAqLwotI2RlZmluZSBSRVFVRVNUX09VVCAgICAgICAweEIyCi0jZGVmaW5lIFJFUVVFU1RfSU4JCSAgMHhCMworI2RlZmluZSBSRVFVRVNUX09VVAkJMHhCMgorI2RlZmluZSBSRVFVRVNUX0lOCQkweEIzCiAKIC8qIHRoZSBvdXQtYnVmZmVyIG9mIHRoZXNlIGNvbnNlY3V0aXZlIG9wZXJhdGlvbnMgY29udGFpbiBzdWItY29tbWFuZHMgd2hlbiBiWzBdID0gMAogICogcmVxdWVzdDogMHhCMjsgaTogMDsgdjogMDsgYlswXSA9IDAsIGJbMV0gPSBzdWJjbWQsIGFkZGl0aW9uYWwgYnVmZmVyCiAgKiB0aGUgcmV0dXJuaW5nIGJ1ZmZlciBsb29rcyBhcyBmb2xsb3dzCiAgKiByZXF1ZXN0OiAweEIzOyBpOiAwOyB2OiAwOyBiWzBdID0gMHhCMywgYWRkaXRpb25hbCBidWZmZXIgKi8KIAotI2RlZmluZSBHRVRfVFVORVJfU1RBVFVTICAweDA1CisjZGVmaW5lIEdFVF9UVU5FUl9TVEFUVVMJMHgwNQogLyogYWRkaXRpb25hbCBpbiBidWZmZXI6CiAgKiAwICAgMSAgIDIgICAgMyAgICAgICAgICAgICAgNCAgIDUgICA2ICAgICAgICAgICAgICAgNyAgICAgICA4CiAgKiBOL0EgTi9BIDB4MDUgc2lnbmFsLXF1YWxpdHkgTi9BIE4vQSBzaWduYWwtc3RyZW5ndGggbG9jaz09MCBOL0EgKi8KIAotI2RlZmluZSBHRVRfU1lTVEVNX1NUUklORyAweDA2CisjZGVmaW5lIEdFVF9TWVNURU1fU1RSSU5HCTB4MDYKIC8qIGFkZGl0aW9uYWwgaW4gYnVmZmVyOgogICogMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4CiAgKiBOL0EgJ1UnICdTJyAnQicgJzcnICcwJyAnMicgJ1gnIE4vQSAqLwogCi0jZGVmaW5lIFNFVF9ESVNFUUNfQ01EICAgIDB4MDgKKyNkZWZpbmUgU0VUX0RJU0VRQ19DTUQJCTB4MDgKIC8qIGFkZGl0aW9uYWwgb3V0IGJ1ZmZlcjoKICAqIDAgICAgMSAgMiAgMyAgNAogICogbGVuICBYMSBYMiBYMyBYNAogICogYWRkaXRpb25hbCBpbiBidWZmZXI6CiAgKiAwICAgMSAyCi0gKiBOL0EgMCAwICAgYlsxXSA9PSBiWzJdID09IDAgLT4gc3VjY2VzcyBvdGhlcndpc2Ugbm90ICovCisgKiBOL0EgMCAwICAgYlsxXSA9PSBiWzJdID09IDAgLT4gc3VjY2VzcywgZmFpbHVyZSBvdGhlcndpc2UgKi8KIAotI2RlZmluZSBTRVRfTE5CX1BPV0VSICAgICAweDA5CisjZGVmaW5lIFNFVF9MTkJfUE9XRVIJCTB4MDkKIC8qIGFkZGl0aW9uYWwgb3V0IGJ1ZmZlcjoKICAqIDAgICAgMSAgICAyCiAgKiAweDAwIDB4ZmYgMSA9IG9uLCAwID0gb2ZmCiAgKiBhZGRpdGlvbmFsIGluIGJ1ZmZlcjoKICAqIDAgICAxIDIKLSAqIE4vQSAwIDAgICBiWzFdID09IGJbMl0gPT0gMCAtPiBzdWNjZXNzIG90aGVyd2lzZSBub3QgKi8KKyAqIE4vQSAwIDAgICBiWzFdID09IGJbMl0gPT0gMCAtPiBzdWNjZXNzIGZhaWx1cmUgb3RoZXJ3aXNlICovCiAKLSNkZWZpbmUgR0VUX01BQ19BRERSRVNTICAgMHgwQQorI2RlZmluZSBHRVRfTUFDX0FERFJFU1MJCTB4MEEKIC8qICNkZWZpbmUgR0VUX01BQ19BRERSRVNTICAgMHgwQiAqLwogLyogYWRkaXRpb25hbCBpbiBidWZmZXI6CiAgKiAwICAgMSAgIDIgICAgICAgICAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOAogICogTi9BIE4vQSAweDBBIG9yIDB4MEIgTUFDMCBNQUMxIE1BQzIgTUFDMyBNQUM0IE1BQzUgKi8KIAotI2RlZmluZSBTRVRfUElEX0ZJTFRFUiAgICAweDExCisjZGVmaW5lIFNFVF9QSURfRklMVEVSCQkweDExCiAvKiBhZGRpdGlvbmFsIGluIGJ1ZmZlcjoKICAqIDAgICAgICAgIDEgICAgICAgIC4uLiAxNCAgICAgICAxNSAgICAgICAxNgogICogUElEMF9NU0IgUElEMF9MU0IgLi4uIFBJRDdfTVNCIFBJRDdfTFNCIFBJRF9hY3RpdmUgKGJpdHMpICovCkBAIC02NCwzOSArNjQsMzggQEAKICAqIGZyZXEwIGZyZXExIGRpdnN0ZXAgc3JhdGUwIHNyYXRlMSBzcmF0ZTIgZmxhZyBjaGtzdW0KICAqLwogCi0KIC8qIG9uZSBkaXJlY3Rpb24gcmVxdWVzdHMgKi8KLSNkZWZpbmUgUkVBRF9SRU1PVEVfUkVRICAgICAgIDB4QjQKKyNkZWZpbmUgUkVBRF9SRU1PVEVfUkVRCQkweEI0CiAvKiBJTiAgaTogMDsgdjogMDsgYlswXSA9PSByZXF1ZXN0LCBiWzFdID09IGtleSAqLwogCi0jZGVmaW5lIFJFQURfUElEX05VTUJFUl9SRVEgICAweEI1CisjZGVmaW5lIFJFQURfUElEX05VTUJFUl9SRVEJMHhCNQogLyogSU4gIGk6IDA7IHY6IDA7IGJbMF0gPT0gcmVxdWVzdCwgYlsxXSA9PSAwLCBiWzJdID0gcGlkIG51bWJlciAqLwogCi0jZGVmaW5lIFdSSVRFX0VFUFJPTV9SRVEgICAgICAweEI2CisjZGVmaW5lIFdSSVRFX0VFUFJPTV9SRVEJMHhCNgogLyogT1VUIGk6IG9mZnNldDsgdjogdmFsdWUgdG8gd3JpdGU7IG5vIGV4dHJhIGJ1ZmZlciAqLwogCi0jZGVmaW5lIFJFQURfRUVQUk9NX1JFUSAgICAgICAweEI3CisjZGVmaW5lIFJFQURfRUVQUk9NX1JFUQkJMHhCNwogLyogSU4gIGk6IGJ1ZmZlcmxlbjsgdjogb2Zmc2V0OyBidWZmZXIgd2l0aCBidWZmZXJsZW4gYnl0ZXMgKi8KIAotI2RlZmluZSBSRUFEX1NUQVRVUyAgICAgICAgICAgMHhCOAorI2RlZmluZSBSRUFEX1NUQVRVUwkJMHhCOAogLyogSU4gIGk6IDA7IHY6IDA7IGJ1ZmZlcmxlbiAxMCAqLwogCi0jZGVmaW5lIFJFQURfVFVORVJfUkVHX1JFUSAgICAweEI5CisjZGVmaW5lIFJFQURfVFVORVJfUkVHX1JFUQkweEI5CiAvKiBJTiAgaTogMDsgdjogcmVnaXN0ZXI7IGJbMF0gPSB2YWx1ZSAqLwogCi0jZGVmaW5lIFJFQURfRlgyX1JFR19SRVEgICAgICAweEJBCisjZGVmaW5lIFJFQURfRlgyX1JFR19SRVEJMHhCQQogLyogSU4gIGk6IG9mZnNldDsgdjogMDsgYlswXSA9IHZhbHVlICovCiAKLSNkZWZpbmUgV1JJVEVfRlgyX1JFR19SRVEgICAgIDB4QkIKKyNkZWZpbmUgV1JJVEVfRlgyX1JFR19SRVEJMHhCQgogLyogT1VUIGk6IG9mZnNldDsgdjogdmFsdWUgdG8gd3JpdGU7IDEgYnl0ZSBleHRyYSBidWZmZXIgKi8KIAotI2RlZmluZSBTRVRfVFVORVJfUE9XRVJfUkVRICAgMHhCQworI2RlZmluZSBTRVRfVFVORVJfUE9XRVJfUkVRCTB4QkMKIC8qIElOICBpOiAwID0gcG93ZXIgb2ZmLCAxID0gcG93ZXIgb24gKi8KIAotI2RlZmluZSBXUklURV9UVU5FUl9SRUdfUkVRICAgMHhCRAorI2RlZmluZSBXUklURV9UVU5FUl9SRUdfUkVRCTB4QkQKIC8qIElOICBpOiByZWdpc3RlciwgdjogdmFsdWUgdG8gd3JpdGUsIG5vIGV4dHJhIGJ1ZmZlciAqLwogCi0jZGVmaW5lIFJFU0VUX1RVTkVSICAgICAgICAgICAweEJFCisjZGVmaW5lIFJFU0VUX1RVTkVSCQkweEJFCiAvKiBJTiAgaTogMCwgdjogMCwgbm8gZXh0cmEgYnVmZmVyICovCiAKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICogdnA3MDJ4X2ZlX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwNDUtZmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LWZlLmMKaW5kZXggODNmMWRlMS4uNTI0MmNjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwNDUtZmUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS1mZS5jCkBAIC0xNDUsMTAgKzE0NSw5IEBACiAKIHN0cnVjdCBkdmJfZnJvbnRlbmQgKiB2cDcwNDVfZmVfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKIHsKLQlzdHJ1Y3QgdnA3MDQ1X2ZlX3N0YXRlICpzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZwNzA0NV9mZV9zdGF0ZSksIEdGUF9LRVJORUwpOworCXN0cnVjdCB2cDcwNDVfZmVfc3RhdGUgKnMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdnA3MDQ1X2ZlX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHMgPT0gTlVMTCkKIAkJZ290byBlcnJvcjsKLQltZW1zZXQocywwLHNpemVvZihzdHJ1Y3QgdnA3MDQ1X2ZlX3N0YXRlKSk7CiAKIAlzLT5kID0gZDsKIAlzLT5mZS5vcHMgPSAmdnA3MDQ1X2ZlX29wczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS5jCmluZGV4IDM4MzUyMzUuLjAyODIwNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwNDUuYwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJCSAgLmNvbGRfaWRzID0geyAmdnA3MDQ1X3VzYl90YWJsZVsyXSwgTlVMTCB9LAogCQkgIC53YXJtX2lkcyA9IHsgJnZwNzA0NV91c2JfdGFibGVbM10sIE5VTEwgfSwKIAkJfSwKLQkJeyBOVUxMIH0sCisJCXsgMCB9LAogCX0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKaW5kZXggOGUyNjllMS4uZGIzYThiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKQEAgLTE2LDYgKzE2LDEyIEBACiAJaGVscAogCSAgQSBEVkItUyB0dW5lciBtb2R1bGUuIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgogCitjb25maWcgRFZCX0NYMjQxMjMKKwl0cmlzdGF0ZSAiQ29uZXhhbnQgQ1gyNDEyMyBiYXNlZCIKKwlkZXBlbmRzIG9uIERWQl9DT1JFCisJaGVscAorCSAgQSBEVkItUyB0dW5lciBtb2R1bGUuIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgorCiBjb25maWcgRFZCX1REQTgwODMKIAl0cmlzdGF0ZSAiUGhpbGlwcyBUREE4MDgzIGJhc2VkIgogCWRlcGVuZHMgb24gRFZCX0NPUkUKQEAgLTUwLDE4ICs1NiwxOSBAQAogCWRlcGVuZHMgb24gRFZCX0NPUkUKIAogY29uZmlnIERWQl9TUDg4NzAKLSAJdHJpc3RhdGUgIlNwYXNlIHNwODg3MCBiYXNlZCIKKwl0cmlzdGF0ZSAiU3Bhc2Ugc3A4ODcwIGJhc2VkIgogCWRlcGVuZHMgb24gRFZCX0NPUkUKIAlzZWxlY3QgRldfTE9BREVSCiAJaGVscAotIAkgIEEgRFZCLVQgdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyBmcm9udGVuZC4KKwkgIEEgRFZCLVQgdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyBmcm9udGVuZC4KIAogCSAgVGhpcyBkcml2ZXIgbmVlZHMgZXh0ZXJuYWwgZmlybXdhcmUuIFBsZWFzZSB1c2UgdGhlIGNvbW1hbmQKIAkgICI8a2VybmVsZGlyPi9Eb2N1bWVudGF0aW9uL2R2Yi9nZXRfZHZiX2Zpcm13YXJlIHNwODg3MCIgdG8KLQkgIGRvd25sb2FkL2V4dHJhY3QgaXQsIGFuZCB0aGVuIGNvcHkgaXQgdG8gL3Vzci9saWIvaG90cGx1Zy9maXJtd2FyZS4KKwkgIGRvd25sb2FkL2V4dHJhY3QgaXQsIGFuZCB0aGVuIGNvcHkgaXQgdG8gL3Vzci9saWIvaG90cGx1Zy9maXJtd2FyZQorCSAgb3IgL2xpYi9maXJtd2FyZSAoZGVwZW5kaW5nIG9uIGNvbmZpZ3VyYXRpb24gb2YgZmlybXdhcmUgaG90cGx1ZykuCiAKIGNvbmZpZyBEVkJfU1A4ODdYCi0gCXRyaXN0YXRlICJTcGFzZSBzcDg4N3ggYmFzZWQiCisJdHJpc3RhdGUgIlNwYXNlIHNwODg3eCBiYXNlZCIKIAlkZXBlbmRzIG9uIERWQl9DT1JFCiAJc2VsZWN0IEZXX0xPQURFUgogCWhlbHAKQEAgLTY5LDcgKzc2LDggQEAKIAogCSAgVGhpcyBkcml2ZXIgbmVlZHMgZXh0ZXJuYWwgZmlybXdhcmUuIFBsZWFzZSB1c2UgdGhlIGNvbW1hbmQKIAkgICI8a2VybmVsZGlyPi9Eb2N1bWVudGF0aW9uL2R2Yi9nZXRfZHZiX2Zpcm13YXJlIHNwODg3eCIgdG8KLQkgIGRvd25sb2FkL2V4dHJhY3QgaXQsIGFuZCB0aGVuIGNvcHkgaXQgdG8gL3Vzci9saWIvaG90cGx1Zy9maXJtd2FyZS4KKwkgIGRvd25sb2FkL2V4dHJhY3QgaXQsIGFuZCB0aGVuIGNvcHkgaXQgdG8gL3Vzci9saWIvaG90cGx1Zy9maXJtd2FyZQorCSAgb3IgL2xpYi9maXJtd2FyZSAoZGVwZW5kaW5nIG9uIGNvbmZpZ3VyYXRpb24gb2YgZmlybXdhcmUgaG90cGx1ZykuCiAKIGNvbmZpZyBEVkJfQ1gyMjcwMAogCXRyaXN0YXRlICJDb25leGFudCBDWDIyNzAwIGJhc2VkIgpAQCAtNzgsMTAgKzg2LDEwIEBACiAJICBBIERWQi1UIHR1bmVyIG1vZHVsZS4gU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCiAKIGNvbmZpZyBEVkJfQ1gyMjcwMgotIAl0cmlzdGF0ZSAiQ29uZXhhbnQgY3gyMjcwMiBkZW1vZHVsYXRvciAoT0ZETSkiCi0gCWRlcGVuZHMgb24gRFZCX0NPUkUKLSAJaGVscAotIAkgIEEgRFZCLVQgdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyBmcm9udGVuZC4KKwl0cmlzdGF0ZSAiQ29uZXhhbnQgY3gyMjcwMiBkZW1vZHVsYXRvciAoT0ZETSkiCisJZGVwZW5kcyBvbiBEVkJfQ09SRQorCWhlbHAKKwkgIEEgRFZCLVQgdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyBmcm9udGVuZC4KIAogY29uZmlnIERWQl9MNjQ3ODEKIAl0cmlzdGF0ZSAiTFNJIEw2NDc4MSIKQEAgLTk4LDggKzEwNiw5IEBACiAKIAkgIFRoaXMgZHJpdmVyIG5lZWRzIGV4dGVybmFsIGZpcm13YXJlLiBQbGVhc2UgdXNlIHRoZSBjb21tYW5kcwogCSAgIjxrZXJuZWxkaXI+L0RvY3VtZW50YXRpb24vZHZiL2dldF9kdmJfZmlybXdhcmUgdGRhMTAwNDUiLAotICAJICAiPGtlcm5lbGRpcj4vRG9jdW1lbnRhdGlvbi9kdmIvZ2V0X2R2Yl9maXJtd2FyZSB0ZGExMDA0NiIgdG8KLQkgIGRvd25sb2FkL2V4dHJhY3QgdGhlbSwgYW5kIHRoZW4gY29weSB0aGVtIHRvIC91c3IvbGliL2hvdHBsdWcvZmlybXdhcmUuCisJICAiPGtlcm5lbGRpcj4vRG9jdW1lbnRhdGlvbi9kdmIvZ2V0X2R2Yl9maXJtd2FyZSB0ZGExMDA0NiIgdG8KKwkgIGRvd25sb2FkL2V4dHJhY3QgdGhlbSwgYW5kIHRoZW4gY29weSB0aGVtIHRvIC91c3IvbGliL2hvdHBsdWcvZmlybXdhcmUKKwkgIG9yIC9saWIvZmlybXdhcmUgKGRlcGVuZGluZyBvbiBjb25maWd1cmF0aW9uIG9mIGZpcm13YXJlIGhvdHBsdWcpLgogCiBjb25maWcgRFZCX05YVDYwMDAKIAl0cmlzdGF0ZSAiTnh0V2F2ZSBDb21tdW5pY2F0aW9ucyBOWFQ2MDAwIGJhc2VkIgpAQCAtMTQwLDEzICsxNDksMTMgQEAKIAl0cmlzdGF0ZSAiVkxTSSBWRVMxODIwIGJhc2VkIgogCWRlcGVuZHMgb24gRFZCX0NPUkUKIAloZWxwCi0gCSAgQSBEVkItQyB0dW5lciBtb2R1bGUuIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgorCSAgQSBEVkItQyB0dW5lciBtb2R1bGUuIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgogCiBjb25maWcgRFZCX1REQTEwMDIxCiAJdHJpc3RhdGUgIlBoaWxpcHMgVERBMTAwMjEgYmFzZWQiCiAJZGVwZW5kcyBvbiBEVkJfQ09SRQogCWhlbHAKLSAJICBBIERWQi1DIHR1bmVyIG1vZHVsZS4gU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCisJICBBIERWQi1DIHR1bmVyIG1vZHVsZS4gU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCiAKIGNvbmZpZyBEVkJfU1RWMDI5NwogCXRyaXN0YXRlICJTVCBTVFYwMjk3IGJhc2VkIgpAQCAtMTY0LDYgKzE3MywxMSBAQAogCWhlbHAKIAkgIEFuIEFUU0MgOFZTQiB0dW5lciBtb2R1bGUuIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgogCisJICBUaGlzIGRyaXZlciBuZWVkcyBleHRlcm5hbCBmaXJtd2FyZS4gUGxlYXNlIHVzZSB0aGUgY29tbWFuZAorCSAgIjxrZXJuZWxkaXI+L0RvY3VtZW50YXRpb24vZHZiL2dldF9kdmJfZmlybXdhcmUgbnh0MjAwMiIgdG8KKwkgIGRvd25sb2FkL2V4dHJhY3QgaXQsIGFuZCB0aGVuIGNvcHkgaXQgdG8gL3Vzci9saWIvaG90cGx1Zy9maXJtd2FyZQorCSAgb3IgL2xpYi9maXJtd2FyZSAoZGVwZW5kaW5nIG9uIGNvbmZpZ3VyYXRpb24gb2YgZmlybXdhcmUgaG90cGx1ZykuCisKIGNvbmZpZyBEVkJfTlhUMjAwWAogCXRyaXN0YXRlICJOZXh0d2F2ZSBOWFQyMDAyL05YVDIwMDQgYmFzZWQiCiAJZGVwZW5kcyBvbiBEVkJfQ09SRQpAQCAtMTcyLDYgKzE4NiwxMiBAQAogCSAgQW4gQVRTQyA4VlNCIGFuZCBRQU02NC8yNTYgdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50CiAJICB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCiAKKwkgIFRoaXMgZHJpdmVyIG5lZWRzIGV4dGVybmFsIGZpcm13YXJlLiBQbGVhc2UgdXNlIHRoZSBjb21tYW5kcworCSAgIjxrZXJuZWxkaXI+L0RvY3VtZW50YXRpb24vZHZiL2dldF9kdmJfZmlybXdhcmUgbnh0MjAwMiIgYW5kCisJICAiPGtlcm5lbGRpcj4vRG9jdW1lbnRhdGlvbi9kdmIvZ2V0X2R2Yl9maXJtd2FyZSBueHQyMDA0IiB0bworCSAgZG93bmxvYWQvZXh0cmFjdCB0aGVtLCBhbmQgdGhlbiBjb3B5IHRoZW0gdG8gL3Vzci9saWIvaG90cGx1Zy9maXJtd2FyZQorCSAgb3IgL2xpYi9maXJtd2FyZSAoZGVwZW5kaW5nIG9uIGNvbmZpZ3VyYXRpb24gb2YgZmlybXdhcmUgaG90cGx1ZykuCisKIGNvbmZpZyBEVkJfT1I1MTIxMQogCXRyaXN0YXRlICJvcjUxMjExIGJhc2VkIChwY0hEVFYgSEQyMDAwIGNhcmQpIgogCWRlcGVuZHMgb24gRFZCX0NPUkUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9NYWtlZmlsZQppbmRleCBhOTg3NjBmLi42MTVlYzgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlCkBAIC0zMiwzICszMiw0IEBACiBvYmotJChDT05GSUdfRFZCX0JDTTM1MTApICs9IGJjbTM1MTAubwogb2JqLSQoQ09ORklHX0RWQl9TNUgxNDIwKSArPSBzNWgxNDIwLm8KIG9iai0kKENPTkZJR19EVkJfTEdEVDMzMFgpICs9IGxnZHQzMzB4Lm8KK29iai0kKENPTkZJR19EVkJfQ1gyNDEyMykgKz0gY3gyNDEyMy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYmNtMzUxMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2JjbTM1MTAuYwppbmRleCA4Y2ViOWEzLi5jYWFlZTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYmNtMzUxMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9iY20zNTEwLmMKQEAgLTI1NSw3ICsyNTUsNyBAQAogCWJjbTM1MTBfcmVnaXN0ZXJfdmFsdWUgYjsKIAlpbnQgcmV0OwogCi0JaWYgKChyZXQgPCBiY20zNTEwX3JlYWRCKHN0LDB4ZmEsJmIpKSA8IDApCisJaWYgKChyZXQgPSBiY20zNTEwX3JlYWRCKHN0LDB4ZmEsJmIpKSA8IDApCiAJCXJldHVybiByZXQ7CiAKIAliLkJFUkNUTF9mYS5SRVNZTkMgPSAwOyBiY20zNTEwX3dyaXRlQihzdCwweGZhLGIpOwpAQCAtNjIzLDEzICs2MjMsMTMgQEAKIAkJZXJyKCJjb3VsZCBub3QgbG9hZCBmaXJtd2FyZSAoJXMpOiAlZCIsQkNNMzUxMF9ERUZBVUxUX0ZJUk1XQVJFLHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQotCWRlYl9pbmZvKCJnb3QgZmlybXdhcmU6ICVkXG4iLGZ3LT5zaXplKTsKKwlkZWJfaW5mbygiZ290IGZpcm13YXJlOiAlemRcbiIsZnctPnNpemUpOwogCiAJYiA9IGZ3LT5kYXRhOwogCWZvciAoaSA9IDA7IGkgPCBmdy0+c2l6ZTspIHsKIAkJYWRkciA9IGxlMTZfdG9fY3B1KCAqKCAodTE2ICopJmJbaV0gKSApOwogCQlsZW4gID0gbGUxNl90b19jcHUoICooICh1MTYgKikmYltpKzJdICkgKTsKLQkJZGViX2luZm8oImZpcm13YXJlIGNodW5rLCBhZGRyOiAweCUwNHgsIGxlbjogMHglMDR4LCB0b3RhbCBsZW5ndGg6IDB4JTA0eFxuIixhZGRyLGxlbixmdy0+c2l6ZSk7CisJCWRlYl9pbmZvKCJmaXJtd2FyZSBjaHVuaywgYWRkcjogMHglMDR4LCBsZW46IDB4JTA0eCwgdG90YWwgbGVuZ3RoOiAweCUwNHp4XG4iLGFkZHIsbGVuLGZ3LT5zaXplKTsKIAkJaWYgKChyZXQgPSBiY20zNTEwX3dyaXRlX3JhbShzdCxhZGRyLCZiW2krNF0sbGVuKSkgPCAwKSB7CiAJCQllcnIoImZpcm13YXJlIGRvd25sb2FkIGZhaWxlZDogJWRcbiIscmV0KTsKIAkJCXJldHVybiByZXQ7CkBAIC03ODIsMTAgKzc4Miw5IEBACiAJYmNtMzUxMF9yZWdpc3Rlcl92YWx1ZSB2OwogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KLQlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBiY20zNTEwX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJc3RhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYmNtMzUxMF9zdGF0ZSksIEdGUF9LRVJORUwpOwogCWlmIChzdGF0ZSA9PSBOVUxMKQogCQlnb3RvIGVycm9yOwotCW1lbXNldChzdGF0ZSwwLHNpemVvZihzdHJ1Y3QgYmNtMzUxMF9zdGF0ZSkpOwogCiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMi5jCmluZGV4IDVkZTBlNmQzLi4wZmM4OTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmMKQEAgLTE5NSw2ICsxOTUsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBjeDIyNzAyX2kyY19nYXRlX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBlbmFibGUpCit7CisJc3RydWN0IGN4MjI3MDJfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJZHByaW50ayAoIiVzKCVkKVxuIiwgX19GVU5DVElPTl9fLCBlbmFibGUpOworCWlmIChlbmFibGUpCisJCXJldHVybiBjeDIyNzAyX3dyaXRlcmVnIChzdGF0ZSwgMHgwRCwgY3gyMjcwMl9yZWFkcmVnKHN0YXRlLCAweDBEKSAmIDB4ZmUpOworCWVsc2UKKwkJcmV0dXJuIGN4MjI3MDJfd3JpdGVyZWcgKHN0YXRlLCAweDBELCBjeDIyNzAyX3JlYWRyZWcoc3RhdGUsIDB4MEQpIHwgMSk7Cit9CisKIC8qIFRhbGsgdG8gdGhlIGRlbW9kLCBzZXQgdGhlIEZFQywgR1VBUkQsIFFBTSBzZXR0aW5ncyBldGMgKi8KIHN0YXRpYyBpbnQgY3gyMjcwMl9zZXRfdHBzIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQogewpAQCAtMjAyLDcgKzIxMiw3IEBACiAJc3RydWN0IGN4MjI3MDJfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAkvKiBzZXQgUExMICovCi0JY3gyMjcwMl93cml0ZXJlZyAoc3RhdGUsIDB4MEQsIGN4MjI3MDJfcmVhZHJlZyhzdGF0ZSwweDBEKSAmMHhmZSk7CisJY3gyMjcwMl9pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX3NldCkgewogCQlzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBwKTsKIAl9IGVsc2UgaWYgKHN0YXRlLT5jb25maWctPnBsbF9kZXNjKSB7CkBAIC0yMTYsNyArMjI2LDcgQEAKIAl9IGVsc2UgewogCQlCVUcoKTsKIAl9Ci0JY3gyMjcwMl93cml0ZXJlZyAoc3RhdGUsIDB4MEQsIGN4MjI3MDJfcmVhZHJlZyhzdGF0ZSwweDBEKSB8IDEpOworCWN4MjI3MDJfaTJjX2dhdGVfY3RybChmZSwgMCk7CiAKIAkvKiBzZXQgaW52ZXJzaW9uICovCiAJY3gyMjcwMl9zZXRfaW52ZXJzaW9uIChzdGF0ZSwgcC0+aW52ZXJzaW9uKTsKQEAgLTM0OSwxMSArMzU5LDEwIEBACiAJY3gyMjcwMl93cml0ZXJlZyAoc3RhdGUsIDB4ZjgsIChzdGF0ZS0+Y29uZmlnLT5vdXRwdXRfbW9kZSA8PCAxKSAmIDB4MDIpOwogCiAJLyogaW5pdCBQTEwgKi8KLQlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpIHsKLQkJY3gyMjcwMl93cml0ZXJlZyAoc3RhdGUsIDB4MEQsIGN4MjI3MDJfcmVhZHJlZyhzdGF0ZSwweDBEKSAmIDB4ZmUpOworCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdCkKIAkJc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQoZmUpOwotCQljeDIyNzAyX3dyaXRlcmVnIChzdGF0ZSwgMHgwRCwgY3gyMjcwMl9yZWFkcmVnKHN0YXRlLDB4MEQpIHwgMSk7Ci0JfQorCisJY3gyMjcwMl9pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTMxLDYgKzU0MCw3IEBACiAJLnJlYWRfc2lnbmFsX3N0cmVuZ3RoID0gY3gyMjcwMl9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKIAkucmVhZF9zbnIgPSBjeDIyNzAyX3JlYWRfc25yLAogCS5yZWFkX3VjYmxvY2tzID0gY3gyMjcwMl9yZWFkX3VjYmxvY2tzLAorCS5pMmNfZ2F0ZV9jdHJsID0gY3gyMjcwMl9pMmNfZ2F0ZV9jdHJsLAogfTsKIAogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEwLmMKaW5kZXggMGM0ZGI4MC4uZDE1ZDMyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMC5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogCiAjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCiAjaW5jbHVkZSAiY3gyNDExMC5oIgpAQCAtNTYsNyArNTUsNyBAQAogCiBzdGF0aWMgc3RydWN0IHt1OCByZWc7IHU4IGRhdGE7fSBjeDI0MTEwX3JlZ2RhdGFbXT0KIAkJICAgICAgLyogQ29tbWVudHMgYmVnaW5uaW5nIHdpdGggQCBkZW5vdGUgdGhpcyB2YWx1ZSBzaG91bGQKLQkJICAgICAgICAgYmUgdGhlIGRlZmF1bHQgKi8KKwkJCSBiZSB0aGUgZGVmYXVsdCAqLwogCXt7MHgwOSwweDAxfSwgLyogU29mdFJlc2V0QWxsICovCiAJIHsweDA5LDB4MDB9LCAvKiByZWxlYXNlIHJlc2V0ICovCiAJIHsweDAxLDB4ZTh9LCAvKiBNU0Igb2YgY29kZSByYXRlIDI3LjVNUy9zICovCkBAIC02NywyNiArNjYsMjYgQEAKIAkgezB4MDcsMHgwMX0sIC8qIEAgRmNsaywgaS5lLiBzYW1wbGluZyBjbG9jaywgNjBNSHogKi8KIAkgezB4MGEsMHgwMH0sIC8qIEAgcGFydGlhbCBjaGlwIGRpc2FibGVzLCBkbyBub3Qgc2V0ICovCiAJIHsweDBiLDB4MDF9LCAvKiBzZXQgb3V0cHV0IGNsb2NrIGluIGdhcHBlZCBtb2RlLCBzdGFydCBzaWduYWwgbG93Ci0JCSAgICAgICAgIGFjdGl2ZSBmb3IgZmlyc3QgYnl0ZSAqLworCQkJIGFjdGl2ZSBmb3IgZmlyc3QgYnl0ZSAqLwogCSB7MHgwYywweDExfSwgLyogbm8gcGFyaXR5IGJ5dGVzLCBsYXJnZSBob2xkIHRpbWUsIHNlcmlhbCBkYXRhIG91dCAqLwogCSB7MHgwZCwweDZmfSwgLyogQCBSUyBTeW5jL1Vuc3luYyB0aHJlc2hvbGRzICovCiAJIHsweDEwLDB4NDB9LCAvKiBjaGlwIGRvYyBpcyBtaXNsZWFkaW5nIGhlcmU6IHdyaXRlIGJpdCA2IGFzIDEKLQkJICAgICAgICAgdG8gYXZvaWQgc3RhcnRpbmcgdGhlIEJFUiBjb3VudGVyLiBSZXNldCB0aGUKLQkJICAgICAgICAgQ1JDIHRlc3QgYml0LiBGaW5pdGUgY291bnRpbmcgc2VsZWN0ZWQgKi8KKwkJCSB0byBhdm9pZCBzdGFydGluZyB0aGUgQkVSIGNvdW50ZXIuIFJlc2V0IHRoZQorCQkJIENSQyB0ZXN0IGJpdC4gRmluaXRlIGNvdW50aW5nIHNlbGVjdGVkICovCiAJIHsweDE1LDB4ZmZ9LCAvKiBAIHNpemUgb2YgdGhlIGxpbWl0ZWQgdGltZSB3aW5kb3cgZm9yIFJTIEJFUgotCQkgICAgICAgICBlc3RpbWF0aW9uLiBJdCBpcyA8dmFsdWU+KjI1NiBSUyBibG9ja3MsIHRoaXMKLQkJICAgICAgICAgZ2l2ZXMgYXBwcm94LiAyLjYgc2VjIGF0IDI3LjVNUy9zLCByYXRlIDMvNCAqLworCQkJIGVzdGltYXRpb24uIEl0IGlzIDx2YWx1ZT4qMjU2IFJTIGJsb2NrcywgdGhpcworCQkJIGdpdmVzIGFwcHJveC4gMi42IHNlYyBhdCAyNy41TVMvcywgcmF0ZSAzLzQgKi8KIAkgezB4MTYsMHgwMH0sIC8qIEAgZW5hYmxlIGFsbCBSUyBvdXRwdXQgcG9ydHMgKi8KIAkgezB4MTcsMHgwNH0sIC8qIEAgdGltZSB3aW5kb3cgYWxsb3dlZCBmb3IgdGhlIFJTIHRvIHN5bmMgKi8KIAkgezB4MTgsMHhhZX0sIC8qIEAgYWxsb3cgYWxsIHN0YW5kYXJkIERWQiBjb2RlIHJhdGVzIHRvIGJlIHNjYW5uZWQKLQkJICAgICAgICAgZm9yIGF1dG9tYXRpY2FsbHkgKi8KKwkJCSBmb3IgYXV0b21hdGljYWxseSAqLwogCQkgICAgICAvKiBsZWF2ZSB0aGUgY3VycmVudCBjb2RlIHJhdGUgYW5kIG5vcm1hbGl6YXRpb24KLQkJICAgICAgICAgcmVnaXN0ZXJzIGFzIHRoZXkgYXJlIGFmdGVyIHJlc2V0Li4uICovCisJCQkgcmVnaXN0ZXJzIGFzIHRoZXkgYXJlIGFmdGVyIHJlc2V0Li4uICovCiAJIHsweDIxLDB4MTB9LCAvKiBAIGR1cmluZyBBdXRvQWNxLCBzZWFyY2ggZWFjaCB2aXRlcmJpIHNldHRpbmcKLQkJICAgICAgICAgb25seSBvbmNlICovCisJCQkgb25seSBvbmNlICovCiAJIHsweDIzLDB4MTh9LCAvKiBAIHNpemUgb2YgdGhlIGxpbWl0ZWQgdGltZSB3aW5kb3cgZm9yIFZpdGVyYmkgQkVSCi0JCSAgICAgICAgIGVzdGltYXRpb24uIEl0IGlzIDx2YWx1ZT4qNjU1MzYgY2hhbm5lbCBiaXRzLCBpLmUuCi0JCSAgICAgICAgIGFwcHJveC4gMzhtcyBhdCAyNy41TVMvcywgcmF0ZSAzLzQgKi8KKwkJCSBlc3RpbWF0aW9uLiBJdCBpcyA8dmFsdWU+KjY1NTM2IGNoYW5uZWwgYml0cywgaS5lLgorCQkJIGFwcHJveC4gMzhtcyBhdCAyNy41TVMvcywgcmF0ZSAzLzQgKi8KIAkgezB4MjQsMHgyNH0sIC8qIGRvIG5vdCB0cmlnZ2VyIFZpdGVyYmkgQ1JDIHRlc3QuIEZpbml0ZSBjb3VudCB3aW5kb3cgKi8KIAkJICAgICAgLyogbGVhdmUgZnJvbnQtZW5kIEFHQyBwYXJhbWV0ZXJzIGF0IGRlZmF1bHQgdmFsdWVzICovCiAJCSAgICAgIC8qIGxlYXZlIGRlY2ltYXRpb24gQUdDIHBhcmFtZXRlcnMgYXQgZGVmYXVsdCB2YWx1ZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTIzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDEyMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NjFjNmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDEyMy5jCkBAIC0wLDAgKzEsODg5IEBACisvKgorICAgIENvbmV4YW50IGN4MjQxMjMvY3gyNDEwOSAtIERWQiBRUFNLIFNhdGVsbGl0ZSBkZW1vZC90dW5lciBkcml2ZXIKKworICAgIENvcHlyaWdodCAoQykgMjAwNSBTdGV2ZW4gVG90aCA8c3RvdGhAaGF1cHBhdWdlLmNvbT4KKworICAgIFN1cHBvcnQgZm9yIEtXb3JsZCBEVkItUyAxMDAgYnkgVmFkaW0gQ2F0YW5hIDxza3lzdGFyQG1vbGRvdmEuY2M+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKKyNpbmNsdWRlICJjeDI0MTIzLmgiCisKK3N0YXRpYyBpbnQgZGVidWc7CisjZGVmaW5lIGRwcmludGsoYXJncy4uLikgXAorCWRvIHsgXAorCQlpZiAoZGVidWcpIHByaW50ayAoS0VSTl9ERUJVRyAiY3gyNDEyMzogIiBhcmdzKTsgXAorCX0gd2hpbGUgKDApCisKK3N0cnVjdCBjeDI0MTIzX3N0YXRlCit7CisJc3RydWN0IGkyY19hZGFwdGVyKiBpMmM7CisJc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOworCWNvbnN0IHN0cnVjdCBjeDI0MTIzX2NvbmZpZyogY29uZmlnOworCisJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKKworCXUzMiBsYXN0YmVyOworCXUxNiBzbnI7CisJdTggIGxuYnJlZzsKKworCS8qIFNvbWUgUExMIHNwZWNpZmljcyBmb3IgdHVuaW5nICovCisJdTMyIFZDQWFyZzsKKwl1MzIgVkdBYXJnOworCXUzMiBiYW5kc2VsZWN0YXJnOworCXUzMiBwbGxhcmc7CisKKwkvKiBUaGUgRGVtb2QvVHVuZXIgY2FuJ3QgZWFzaWx5IHByb3ZpZGUgdGhlc2UsIHdlIGNhY2hlIHRoZW0gKi8KKwl1MzIgY3VycmVudGZyZXE7CisJdTMyIGN1cnJlbnRzeW1ib2xyYXRlOworfTsKKworLyogVmFyaW91cyB0dW5lciBkZWZhdWx0cyBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGZvciBhIGdpdmVuIHN5bWJvbCByYXRlIFNwcyAqLworc3RhdGljIHN0cnVjdAoreworCXUzMiBzeW1ib2xyYXRlX2xvdzsKKwl1MzIgc3ltYm9scmF0ZV9oaWdoOworCXUzMiBWQ0FzbG9wZTsKKwl1MzIgVkNBb2Zmc2V0OworCXUzMiBWR0Exb2Zmc2V0OworCXUzMiBWR0Eyb2Zmc2V0OworCXUzMiBWQ0Fwcm9nZGF0YTsKKwl1MzIgVkdBcHJvZ2RhdGE7Cit9IGN4MjQxMjNfQUdDX3ZhbHNbXSA9Cit7CisJeworCQkuc3ltYm9scmF0ZV9sb3cJCT0gMTAwMDAwMCwKKwkJLnN5bWJvbHJhdGVfaGlnaAk9IDQ5OTk5OTksCisJCS5WQ0FzbG9wZQkJPSAweDA3LAorCQkuVkNBb2Zmc2V0CQk9IDB4MGYsCisJCS5WR0Exb2Zmc2V0CQk9IDB4MWY4LAorCQkuVkdBMm9mZnNldAkJPSAweDFmOCwKKwkJLlZHQXByb2dkYXRhCQk9ICgyIDw8IDE4KSB8ICgweDFmOCA8PCA5KSB8IDB4MWY4LAorCQkuVkNBcHJvZ2RhdGEJCT0gKDQgPDwgMTgpIHwgKDB4MDcgPDwgOSkgfCAweDA3LAorCX0sCisJeworCQkuc3ltYm9scmF0ZV9sb3cJCT0gIDUwMDAwMDAsCisJCS5zeW1ib2xyYXRlX2hpZ2gJPSAxNDk5OTk5OSwKKwkJLlZDQXNsb3BlCQk9IDB4MWYsCisJCS5WQ0FvZmZzZXQJCT0gMHgxZiwKKwkJLlZHQTFvZmZzZXQJCT0gMHgxZTAsCisJCS5WR0Eyb2Zmc2V0CQk9IDB4MTgwLAorCQkuVkdBcHJvZ2RhdGEJCT0gKDIgPDwgMTgpIHwgKDB4MTgwIDw8IDkpIHwgMHgxZTAsCisJCS5WQ0Fwcm9nZGF0YQkJPSAoNCA8PCAxOCkgfCAoMHgwNyA8PCA5KSB8IDB4MWYsCisJfSwKKwl7CisJCS5zeW1ib2xyYXRlX2xvdwkJPSAxNTAwMDAwMCwKKwkJLnN5bWJvbHJhdGVfaGlnaAk9IDQ1MDAwMDAwLAorCQkuVkNBc2xvcGUJCT0gMHgzZiwKKwkJLlZDQW9mZnNldAkJPSAweDNmLAorCQkuVkdBMW9mZnNldAkJPSAweDE4MCwKKwkJLlZHQTJvZmZzZXQJCT0gMHgxMDAsCisJCS5WR0Fwcm9nZGF0YQkJPSAoMiA8PCAxOCkgfCAoMHgxMDAgPDwgOSkgfCAweDE4MCwKKwkJLlZDQXByb2dkYXRhCQk9ICg0IDw8IDE4KSB8ICgweDA3IDw8IDkpIHwgMHgzZiwKKwl9LAorfTsKKworLyoKKyAqIFZhcmlvdXMgdHVuZXIgZGVmYXVsdHMgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBmb3IgYSBnaXZlbiBmcmVxdWVuY3kga0h6LgorICogZml4bWU6IFRoZSBib3VuZHMgb24gdGhlIGJhbmRzIGRvIG5vdCBtYXRjaCB0aGUgZG9jIGluIHJlYWwgbGlmZS4KKyAqIGZpeG1lOiBTb21lIG9mIHRoZW0gaGF2ZSBiZWVuIG1vdmVkLCBvdGhlciBtaWdodCBuZWVkIGFkanVzdG1lbnQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QKK3sKKwl1MzIgZnJlcV9sb3c7CisJdTMyIGZyZXFfaGlnaDsKKwl1MzIgYmFuZHNlbGVjdDsKKwl1MzIgVkNPZGl2aWRlcjsKKwl1MzIgVkNPbnVtYmVyOworCXUzMiBwcm9nZGF0YTsKK30gY3gyNDEyM19iYW5kc2VsZWN0X3ZhbHNbXSA9Cit7CisJeworCQkuZnJlcV9sb3cJPSA5NTAwMDAsCisJCS5mcmVxX2hpZ2gJPSAxMDE4OTk5LAorCQkuYmFuZHNlbGVjdAk9IDB4NDAsCisJCS5WQ09kaXZpZGVyCT0gNCwKKwkJLlZDT251bWJlcgk9IDcsCisJCS5wcm9nZGF0YQk9ICgwIDw8IDE4KSB8ICgwIDw8IDkpIHwgMHg0MCwKKwl9LAorCXsKKwkJLmZyZXFfbG93CT0gMTAxOTAwMCwKKwkJLmZyZXFfaGlnaAk9IDEwNzQ5OTksCisJCS5iYW5kc2VsZWN0CT0gMHg4MCwKKwkJLlZDT2RpdmlkZXIJPSA0LAorCQkuVkNPbnVtYmVyCT0gOCwKKwkJLnByb2dkYXRhCT0gKDAgPDwgMTgpIHwgKDAgPDwgOSkgfCAweDgwLAorCX0sCisJeworCQkuZnJlcV9sb3cJPSAxMDc1MDAwLAorCQkuZnJlcV9oaWdoCT0gMTIyNzk5OSwKKwkJLmJhbmRzZWxlY3QJPSAweDAxLAorCQkuVkNPZGl2aWRlcgk9IDIsCisJCS5WQ09udW1iZXIJPSAxLAorCQkucHJvZ2RhdGEJPSAoMCA8PCAxOCkgfCAoMSA8PCA5KSB8IDB4MDEsCisJfSwKKwl7CisJCS5mcmVxX2xvdwk9IDEyMjgwMDAsCisJCS5mcmVxX2hpZ2gJPSAxMzQ5OTk5LAorCQkuYmFuZHNlbGVjdAk9IDB4MDIsCisJCS5WQ09kaXZpZGVyCT0gMiwKKwkJLlZDT251bWJlcgk9IDIsCisJCS5wcm9nZGF0YQk9ICgwIDw8IDE4KSB8ICgxIDw8IDkpIHwgMHgwMiwKKwl9LAorCXsKKwkJLmZyZXFfbG93CT0gMTM1MDAwMCwKKwkJLmZyZXFfaGlnaAk9IDE0ODE5OTksCisJCS5iYW5kc2VsZWN0CT0gMHgwNCwKKwkJLlZDT2RpdmlkZXIJPSAyLAorCQkuVkNPbnVtYmVyCT0gMywKKwkJLnByb2dkYXRhCT0gKDAgPDwgMTgpIHwgKDEgPDwgOSkgfCAweDA0LAorCX0sCisJeworCQkuZnJlcV9sb3cJPSAxNDgyMDAwLAorCQkuZnJlcV9oaWdoCT0gMTU5NTk5OSwKKwkJLmJhbmRzZWxlY3QJPSAweDA4LAorCQkuVkNPZGl2aWRlcgk9IDIsCisJCS5WQ09udW1iZXIJPSA0LAorCQkucHJvZ2RhdGEJPSAoMCA8PCAxOCkgfCAoMSA8PCA5KSB8IDB4MDgsCisJfSwKKwl7CisJCS5mcmVxX2xvdwk9IDE1OTYwMDAsCisJCS5mcmVxX2hpZ2gJPSAxNzE3OTk5LAorCQkuYmFuZHNlbGVjdAk9IDB4MTAsCisJCS5WQ09kaXZpZGVyCT0gMiwKKwkJLlZDT251bWJlcgk9IDUsCisJCS5wcm9nZGF0YQk9ICgwIDw8IDE4KSB8ICgxIDw8IDkpIHwgMHgxMCwKKwl9LAorCXsKKwkJLmZyZXFfbG93CT0gMTcxODAwMCwKKwkJLmZyZXFfaGlnaAk9IDE4NTU5OTksCisJCS5iYW5kc2VsZWN0CT0gMHgyMCwKKwkJLlZDT2RpdmlkZXIJPSAyLAorCQkuVkNPbnVtYmVyCT0gNiwKKwkJLnByb2dkYXRhCT0gKDAgPDwgMTgpIHwgKDEgPDwgOSkgfCAweDIwLAorCX0sCisJeworCQkuZnJlcV9sb3cJPSAxODU2MDAwLAorCQkuZnJlcV9oaWdoCT0gMjAzNTk5OSwKKwkJLmJhbmRzZWxlY3QJPSAweDQwLAorCQkuVkNPZGl2aWRlcgk9IDIsCisJCS5WQ09udW1iZXIJPSA3LAorCQkucHJvZ2RhdGEJPSAoMCA8PCAxOCkgfCAoMSA8PCA5KSB8IDB4NDAsCisJfSwKKwl7CisJCS5mcmVxX2xvdwk9IDIwMzYwMDAsCisJCS5mcmVxX2hpZ2gJPSAyMTQ5OTk5LAorCQkuYmFuZHNlbGVjdAk9IDB4ODAsCisJCS5WQ09kaXZpZGVyCT0gMiwKKwkJLlZDT251bWJlcgk9IDgsCisJCS5wcm9nZGF0YQk9ICgwIDw8IDE4KSB8ICgxIDw8IDkpIHwgMHg4MCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCB7CisJdTggcmVnOworCXU4IGRhdGE7Cit9IGN4MjQxMjNfcmVnZGF0YVtdID0KK3sKKwl7MHgwMCwgMHgwM30sIC8qIFJlc2V0IHN5c3RlbSAqLworCXsweDAwLCAweDAwfSwgLyogQ2xlYXIgcmVzZXQgKi8KKwl7MHgwMSwgMHgzYn0sIC8qIEFwcGx5IHNlbnNpYmxlIGRlZmF1bHRzLCBmcm9tIGFuIGkyYyBzbmlmZmVyICovCisJezB4MDMsIDB4MDd9LAorCXsweDA0LCAweDEwfSwKKwl7MHgwNSwgMHgwNH0sCisJezB4MDYsIDB4MzF9LAorCXsweDBkLCAweDAyfSwKKwl7MHgwZSwgMHgwM30sCisJezB4MGYsIDB4ZmV9LAorCXsweDEwLCAweDAxfSwKKwl7MHgxNCwgMHgwMX0sCisJezB4MTUsIDB4OTh9LAorCXsweDE2LCAweDAwfSwKKwl7MHgxNywgMHgwMX0sCisJezB4MWIsIDB4MDV9LAorCXsweDFjLCAweDgwfSwKKwl7MHgxZCwgMHgwMH0sCisJezB4MWUsIDB4MDB9LAorCXsweDIwLCAweDQxfSwKKwl7MHgyMSwgMHgxNX0sCisJezB4MjcsIDB4MTR9LAorCXsweDI4LCAweDQ2fSwKKwl7MHgyOSwgMHgwMH0sCisJezB4MmEsIDB4YjB9LAorCXsweDJiLCAweDczfSwKKwl7MHgyYywgMHgwMH0sCisJezB4MmQsIDB4MDB9LAorCXsweDJlLCAweDAwfSwKKwl7MHgyZiwgMHgwMH0sCisJezB4MzAsIDB4MDB9LAorCXsweDMxLCAweDAwfSwKKwl7MHgzMiwgMHg4Y30sCisJezB4MzMsIDB4MDB9LAorCXsweDM0LCAweDAwfSwKKwl7MHgzNSwgMHgwM30sCisJezB4MzYsIDB4MDJ9LAorCXsweDM3LCAweDNhfSwKKwl7MHgzYSwgMHgwMH0sCS8qIEVuYWJsZSBBR0MgYWNjdW11bGF0b3IgKi8KKwl7MHg0NCwgMHgwMH0sCisJezB4NDUsIDB4MDB9LAorCXsweDQ2LCAweDA1fSwKKwl7MHg1NiwgMHg0MX0sCisJezB4NTcsIDB4ZmZ9LAorCXsweDY3LCAweDgzfSwKK307CisKK3N0YXRpYyBpbnQgY3gyNDEyM193cml0ZXJlZyhzdHJ1Y3QgY3gyNDEyM19zdGF0ZSogc3RhdGUsIGludCByZWcsIGludCBkYXRhKQoreworCXU4IGJ1ZltdID0geyByZWcsIGRhdGEgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywgLmZsYWdzID0gMCwgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IDIgfTsKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZywgMSkpICE9IDEpIHsKKwkJcHJpbnRrKCIlczogd3JpdGVyZWcgZXJyb3IoZXJyID09ICVpLCByZWcgPT0gMHglMDJ4LCIKKwkJCSAiIGRhdGEgPT0gMHglMDJ4KVxuIiwgX19GVU5DVElPTl9fLCBlcnIsIHJlZywgZGF0YSk7CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4MjQxMjNfd3JpdGVsbmJyZWcoc3RydWN0IGN4MjQxMjNfc3RhdGUqIHN0YXRlLCBpbnQgcmVnLCBpbnQgZGF0YSkKK3sKKwl1OCBidWZbXSA9IHsgcmVnLCBkYXRhIH07CisJLyogZml4bWU6IHB1dCB0aGUgaW50ZXJzaWwgYWRkciBpbnQgdGhlIGNvbmZpZyAqLworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDA4LCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gMiB9OworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnLCAxKSkgIT0gMSkgeworCQlwcmludGsoIiVzOiB3cml0ZWxuYnJlZyBlcnJvciAoZXJyID09ICVpLCByZWcgPT0gMHglMDJ4LCIKKwkJCSAiIGRhdGEgPT0gMHglMDJ4KVxuIiwgX19GVU5DVElPTl9fLCBlcnIsIHJlZywgZGF0YSk7CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KKworCS8qIGNhY2hlIHRoZSB3cml0ZSwgbm8gd2F5IHRvIHJlYWQgYmFjayAqLworCXN0YXRlLT5sbmJyZWcgPSBkYXRhOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3gyNDEyM19yZWFkcmVnKHN0cnVjdCBjeDI0MTIzX3N0YXRlKiBzdGF0ZSwgdTggcmVnKQoreworCWludCByZXQ7CisJdTggYjBbXSA9IHsgcmVnIH07CisJdTggYjFbXSA9IHsgMCB9OworCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0geworCQl7IC5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywgLmZsYWdzID0gMCwgLmJ1ZiA9IGIwLCAubGVuID0gMSB9LAorCQl7IC5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywgLmZsYWdzID0gSTJDX01fUkQsIC5idWYgPSBiMSwgLmxlbiA9IDEgfQorCX07CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgbXNnLCAyKTsKKworCWlmIChyZXQgIT0gMikgeworCQlwcmludGsoIiVzOiByZWc9MHgleCAoZXJyb3I9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIHJlZywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gYjFbMF07Cit9CisKK3N0YXRpYyBpbnQgY3gyNDEyM19yZWFkbG5icmVnKHN0cnVjdCBjeDI0MTIzX3N0YXRlKiBzdGF0ZSwgdTggcmVnKQoreworCXJldHVybiBzdGF0ZS0+bG5icmVnOworfQorCitzdGF0aWMgaW50IGN4MjQxMjNfc2V0X2ludmVyc2lvbihzdHJ1Y3QgY3gyNDEyM19zdGF0ZSogc3RhdGUsIGZlX3NwZWN0cmFsX2ludmVyc2lvbl90IGludmVyc2lvbikKK3sKKwlzd2l0Y2ggKGludmVyc2lvbikgeworCWNhc2UgSU5WRVJTSU9OX09GRjoKKwkJY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgwZSwgY3gyNDEyM19yZWFkcmVnKHN0YXRlLCAweDBlKSAmIDB4N2YpOworCQljeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDEwLCBjeDI0MTIzX3JlYWRyZWcoc3RhdGUsIDB4MTApIHwgMHg4MCk7CisJCWJyZWFrOworCWNhc2UgSU5WRVJTSU9OX09OOgorCQljeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDBlLCBjeDI0MTIzX3JlYWRyZWcoc3RhdGUsIDB4MGUpIHwgMHg4MCk7CisJCWN4MjQxMjNfd3JpdGVyZWcoc3RhdGUsIDB4MTAsIGN4MjQxMjNfcmVhZHJlZyhzdGF0ZSwgMHgxMCkgfCAweDgwKTsKKwkJYnJlYWs7CisJY2FzZSBJTlZFUlNJT05fQVVUTzoKKwkJY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgxMCwgY3gyNDEyM19yZWFkcmVnKHN0YXRlLCAweDEwKSAmIDB4N2YpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeDI0MTIzX2dldF9pbnZlcnNpb24oc3RydWN0IGN4MjQxMjNfc3RhdGUqIHN0YXRlLCBmZV9zcGVjdHJhbF9pbnZlcnNpb25fdCAqaW52ZXJzaW9uKQoreworCXU4IHZhbDsKKworCXZhbCA9IGN4MjQxMjNfcmVhZHJlZyhzdGF0ZSwgMHgxYikgPj4gNzsKKworCWlmICh2YWwgPT0gMCkKKwkJKmludmVyc2lvbiA9IElOVkVSU0lPTl9PRkY7CisJZWxzZQorCQkqaW52ZXJzaW9uID0gSU5WRVJTSU9OX09OOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3gyNDEyM19zZXRfZmVjKHN0cnVjdCBjeDI0MTIzX3N0YXRlKiBzdGF0ZSwgZmVfY29kZV9yYXRlX3QgZmVjKQoreworCWlmICggKGZlYyA8IEZFQ19OT05FKSB8fCAoZmVjID4gRkVDX0FVVE8pICkKKwkJZmVjID0gRkVDX0FVVE87CisKKwkvKiBIYXJkd2FyZSBoYXMgNS8xMSBhbmQgMy81IGJ1dCBhcmUgbmV2ZXIgdW51c2VkICovCisJc3dpdGNoIChmZWMpIHsKKwljYXNlIEZFQ19OT05FOgorCQlyZXR1cm4gY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgwZiwgMHgwMSk7CisJY2FzZSBGRUNfMV8yOgorCQlyZXR1cm4gY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgwZiwgMHgwMik7CisJY2FzZSBGRUNfMl8zOgorCQlyZXR1cm4gY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgwZiwgMHgwNCk7CisJY2FzZSBGRUNfM180OgorCQlyZXR1cm4gY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgwZiwgMHgwOCk7CisJY2FzZSBGRUNfNV82OgorCQlyZXR1cm4gY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgwZiwgMHgyMCk7CisJY2FzZSBGRUNfN184OgorCQlyZXR1cm4gY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgwZiwgMHg4MCk7CisJY2FzZSBGRUNfQVVUTzoKKwkJcmV0dXJuIGN4MjQxMjNfd3JpdGVyZWcoc3RhdGUsIDB4MGYsIDB4YWUpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY3gyNDEyM19nZXRfZmVjKHN0cnVjdCBjeDI0MTIzX3N0YXRlKiBzdGF0ZSwgZmVfY29kZV9yYXRlX3QgKmZlYykKK3sKKwlpbnQgcmV0OworCXU4IHZhbDsKKworCXJldCA9IGN4MjQxMjNfcmVhZHJlZyAoc3RhdGUsIDB4MWIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXZhbCA9IHJldCAmIDB4MDc7CisJc3dpdGNoICh2YWwpIHsKKwljYXNlIDE6CisJCSpmZWMgPSBGRUNfMV8yOworCQlicmVhazsKKwljYXNlIDM6CisJCSpmZWMgPSBGRUNfMl8zOworCQlicmVhazsKKwljYXNlIDQ6CisJCSpmZWMgPSBGRUNfM180OworCQlicmVhazsKKwljYXNlIDU6CisJCSpmZWMgPSBGRUNfNF81OworCQlicmVhazsKKwljYXNlIDY6CisJCSpmZWMgPSBGRUNfNV82OworCQlicmVhazsKKwljYXNlIDc6CisJCSpmZWMgPSBGRUNfN184OworCQlicmVhazsKKwljYXNlIDI6CS8qICpmZWMgPSBGRUNfM181OyBicmVhazsgKi8KKwljYXNlIDA6CS8qICpmZWMgPSBGRUNfNV8xMTsgYnJlYWs7ICovCisJCSpmZWMgPSBGRUNfQVVUTzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJKmZlYyA9IEZFQ19OT05FOyAvLyBjYW4ndCBoYXBwZW4KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogZml4bWU6IFN5bWJvbCByYXRlcyA8IDNNU3BzIG1heSBub3Qgd29yayBiZWNhdXNlIG9mIHByZWNpc2lvbiBsb3NzICovCitzdGF0aWMgaW50IGN4MjQxMjNfc2V0X3N5bWJvbHJhdGUoc3RydWN0IGN4MjQxMjNfc3RhdGUqIHN0YXRlLCB1MzIgc3JhdGUpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IChzcmF0ZSAvIDExODUpICogMTAwOworCisJLyogQ29tcGVuc2F0ZSBmb3Igc2NhbGluZyB1cCwgYnkgcmVtb3ZpbmcgMTcgc3ltYm9scyBwZXIgMU1zcHMgKi8KKwl2YWwgPSB2YWwgLSAoMTcgKiAoc3JhdGUgLyAxMDAwMDAwKSk7CisKKwljeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDA4LCAodmFsID4+IDE2KSAmIDB4ZmYgKTsKKwljeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDA5LCAodmFsID4+ICA4KSAmIDB4ZmYgKTsKKwljeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDBhLCAodmFsICAgICAgKSAmIDB4ZmYgKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQmFzZWQgb24gdGhlIHJlcXVpcmVkIGZyZXF1ZW5jeSBhbmQgc3ltYm9scmF0ZSwgdGhlIHR1bmVyIEFHQyBoYXMgdG8gYmUgY29uZmlndXJlZAorICogYW5kIHRoZSBjb3JyZWN0IGJhbmQgc2VsZWN0ZWQuIENhbGN1bGF0ZSB0aG9zZSB2YWx1ZXMKKyAqLworc3RhdGljIGludCBjeDI0MTIzX3BsbF9jYWxjdWxhdGUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKK3sKKwlzdHJ1Y3QgY3gyNDEyM19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1MzIgbmRpdiA9IDAsIGFkaXYgPSAwLCB2Y29fZGl2ID0gMDsKKwlpbnQgaSA9IDA7CisKKwkvKiBEZWZhdWx0cyBmb3IgbG93IGZyZXEsIGxvdyByYXRlICovCisJc3RhdGUtPlZDQWFyZyA9IGN4MjQxMjNfQUdDX3ZhbHNbMF0uVkNBcHJvZ2RhdGE7CisJc3RhdGUtPlZHQWFyZyA9IGN4MjQxMjNfQUdDX3ZhbHNbMF0uVkdBcHJvZ2RhdGE7CisJc3RhdGUtPmJhbmRzZWxlY3RhcmcgPSBjeDI0MTIzX2JhbmRzZWxlY3RfdmFsc1swXS5wcm9nZGF0YTsKKwl2Y29fZGl2ID0gY3gyNDEyM19iYW5kc2VsZWN0X3ZhbHNbMF0uVkNPZGl2aWRlcjsKKworCS8qIEZvciB0aGUgZ2l2ZW4gc3ltYm9sZXJhdGUsIGRldGVybWluZSB0aGUgVkNBIGFuZCBWR0EgcHJvZ3JhbW1pbmcgYml0cyAqLworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoY3gyNDEyM19BR0NfdmFscykgLyBzaXplb2YoY3gyNDEyM19BR0NfdmFsc1swXSk7IGkrKykKKwl7CisJCWlmICgoY3gyNDEyM19BR0NfdmFsc1tpXS5zeW1ib2xyYXRlX2xvdyA8PSBwLT51LnFwc2suc3ltYm9sX3JhdGUpICYmCisJCQkJKGN4MjQxMjNfQUdDX3ZhbHNbaV0uc3ltYm9scmF0ZV9oaWdoID49IHAtPnUucXBzay5zeW1ib2xfcmF0ZSkgKSB7CisJCQlzdGF0ZS0+VkNBYXJnID0gY3gyNDEyM19BR0NfdmFsc1tpXS5WQ0Fwcm9nZGF0YTsKKwkJCXN0YXRlLT5WR0FhcmcgPSBjeDI0MTIzX0FHQ192YWxzW2ldLlZHQXByb2dkYXRhOworCQl9CisJfQorCisJLyogRm9yIHRoZSBnaXZlbiBmcmVxdWVuY3ksIGRldGVybWluZSB0aGUgYmFuZHNlbGVjdCBwcm9ncmFtbWluZyBiaXRzICovCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihjeDI0MTIzX2JhbmRzZWxlY3RfdmFscykgLyBzaXplb2YoY3gyNDEyM19iYW5kc2VsZWN0X3ZhbHNbMF0pOyBpKyspCisJeworCQlpZiAoKGN4MjQxMjNfYmFuZHNlbGVjdF92YWxzW2ldLmZyZXFfbG93IDw9IHAtPmZyZXF1ZW5jeSkgJiYKKwkJCQkoY3gyNDEyM19iYW5kc2VsZWN0X3ZhbHNbaV0uZnJlcV9oaWdoID49IHAtPmZyZXF1ZW5jeSkgKSB7CisJCQlzdGF0ZS0+YmFuZHNlbGVjdGFyZyA9IGN4MjQxMjNfYmFuZHNlbGVjdF92YWxzW2ldLnByb2dkYXRhOworCQkJdmNvX2RpdiA9IGN4MjQxMjNfYmFuZHNlbGVjdF92YWxzW2ldLlZDT2RpdmlkZXI7CisJCX0KKwl9CisKKwkvKiBEZXRlcm1pbmUgdGhlIE4vQSBkaXZpZGVycyBmb3IgdGhlIHJlcXVlc3RlZCBsYmFuZCBmcmVxIChpbiBrSHopLiAqLworCS8qIE5vdGU6IDEwMTExIChrSHopIGlzIHRoZSBDcnlzdGFsIEZyZXEgYW5kIGRpdmlkZXIgb2YgMTAuICovCisJbmRpdiA9ICggKChwLT5mcmVxdWVuY3kgKiB2Y29fZGl2KSAvICgxMDExMSAvIDEwKSAvIDIpIC8gMzIpICYgMHgxZmY7CisJYWRpdiA9ICggKChwLT5mcmVxdWVuY3kgKiB2Y29fZGl2KSAvICgxMDExMSAvIDEwKSAvIDIpICUgMzIpICYgMHgxZjsKKworCWlmIChhZGl2ID09IDApCisJCWFkaXYrKzsKKworCS8qIGRldGVybWluZSB0aGUgY29ycmVjdCBwbGwgZnJlcXVlbmN5IHZhbHVlcy4gKi8KKwkvKiBDb21tYW5kIDExLCByZWZkaXYgMTEsIGNwdW1wIHBvbGFyaXR5IDEsIGNwdW1wIGN1cnJlbnQgM21BIDEwLiAqLworCXN0YXRlLT5wbGxhcmcgPSAoMyA8PCAxOSkgfCAoMyA8PCAxNykgfCAoMSA8PCAxNikgfCAoMiA8PCAxNCk7CisJc3RhdGUtPnBsbGFyZyB8PSAobmRpdiA8PCA1KSB8IGFkaXY7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFR1bmVyIGRhdGEgaXMgMjEgYml0cyBsb25nLCBtdXN0IGJlIGxlZnQtYWxpZ25lZCBpbiBkYXRhLgorICogVHVuZXIgY3gyNDEwOSBpcyB3cml0dGVuIHRocm91Z2ggYSBkZWRpY2F0ZWQgM3dpcmUgaW50ZXJmYWNlIG9uIHRoZSBkZW1vZCBjaGlwLgorICovCitzdGF0aWMgaW50IGN4MjQxMjNfcGxsX3dyaXRlcmVnKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnAsIHUzMiBkYXRhKQoreworCXN0cnVjdCBjeDI0MTIzX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCS8qIGFsaWduIHRoZSAyMSBieXRlcyBpbnRvIHRvIGJpdDIzIGJvdW5kYXJ5ICovCisJZGF0YSA9IGRhdGEgPDwgMzsKKworCS8qIFJlc2V0IHRoZSBkZW1vZCBwbGwgd29yZCBsZW5ndGggdG8gMHgxNSBiaXRzICovCisJY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgyMSwgMHgxNSk7CisKKwkvKiB3cml0ZSB0aGUgbXNiIDggYml0cywgd2FpdCBmb3IgdGhlIHNlbmQgdG8gYmUgY29tcGxldGVkICovCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDQwKTsKKwljeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDIyLCAoZGF0YSA+PiAxNikgJiAweGZmKTsKKwl3aGlsZSAoKGN4MjQxMjNfcmVhZHJlZyhzdGF0ZSwgMHgyMCkgJiAweDQwKSA9PSAwKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlwcmludGsoIiVzOiAgZGVtb2R1bGF0b3IgaXMgbm90IHJlc3BvbmRpbmcsIHBvc3NpYmx5IGh1bmcsIGFib3J0aW5nLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtRVJFTU9URUlPOworCQl9CisJCW1zbGVlcCgxMCk7CisJfQorCisJLyogc2VuZCBhbm90aGVyIDggYnl0ZXMsIHdhaXQgZm9yIHRoZSBzZW5kIHRvIGJlIGNvbXBsZXRlZCAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg0MCk7CisJY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgyMiwgKGRhdGE+PjgpICYgMHhmZiApOworCXdoaWxlICgoY3gyNDEyM19yZWFkcmVnKHN0YXRlLCAweDIwKSAmIDB4NDApID09IDApIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCXByaW50aygiJXM6ICBkZW1vZHVsYXRvciBpcyBub3QgcmVzcG9uZGluZywgcG9zc2libHkgaHVuZywgYWJvcnRpbmcuXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC1FUkVNT1RFSU87CisJCX0KKwkJbXNsZWVwKDEwKTsKKwl9CisKKwkvKiBzZW5kIHRoZSBsb3dlciA1IGJpdHMgb2YgdGhpcyBieXRlLCBwYWRkZWQgd2l0aCAzIExCQiwgd2FpdCBmb3IgdGhlIHNlbmQgdG8gYmUgY29tcGxldGVkICovCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDQwKTsKKwljeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDIyLCAoZGF0YSkgJiAweGZmICk7CisJd2hpbGUgKChjeDI0MTIzX3JlYWRyZWcoc3RhdGUsIDB4MjApICYgMHg4MCkpIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCXByaW50aygiJXM6ICBkZW1vZHVsYXRvciBpcyBub3QgcmVzcG9uZGluZywgcG9zc2libHkgaHVuZywgYWJvcnRpbmcuXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC1FUkVNT1RFSU87CisJCX0KKwkJbXNsZWVwKDEwKTsKKwl9CisKKwkvKiBUcmlnZ2VyIHRoZSBkZW1vZCB0byBjb25maWd1cmUgdGhlIHR1bmVyICovCisJY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgyMCwgY3gyNDEyM19yZWFkcmVnKHN0YXRlLCAweDIwKSB8IDIpOworCWN4MjQxMjNfd3JpdGVyZWcoc3RhdGUsIDB4MjAsIGN4MjQxMjNfcmVhZHJlZyhzdGF0ZSwgMHgyMCkgJiAweGZkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4MjQxMjNfcGxsX3R1bmUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKK3sKKwlzdHJ1Y3QgY3gyNDEyM19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWlmIChjeDI0MTIzX3BsbF9jYWxjdWxhdGUoZmUsIHApICE9IDApIHsKKwkJcHJpbnRrKCIlczogY3gyNDEyM19wbGxfY2FsY3V0YXRlIGZhaWxlZFxuIixfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBXcml0ZSB0aGUgbmV3IFZDTy9WR0EgKi8KKwljeDI0MTIzX3BsbF93cml0ZXJlZyhmZSwgcCwgc3RhdGUtPlZDQWFyZyk7CisJY3gyNDEyM19wbGxfd3JpdGVyZWcoZmUsIHAsIHN0YXRlLT5WR0FhcmcpOworCisJLyogV3JpdGUgdGhlIG5ldyBiYW5kc2VsZWN0IGFuZCBwbGwgYXJncyAqLworCWN4MjQxMjNfcGxsX3dyaXRlcmVnKGZlLCBwLCBzdGF0ZS0+YmFuZHNlbGVjdGFyZyk7CisJY3gyNDEyM19wbGxfd3JpdGVyZWcoZmUsIHAsIHN0YXRlLT5wbGxhcmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3gyNDEyM19pbml0ZmUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJc3RydWN0IGN4MjQxMjNfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJaW50IGk7CisKKwkvKiBDb25maWd1cmUgdGhlIGRlbW9kIHRvIGEgZ29vZCBzZXQgb2YgZGVmYXVsdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGN4MjQxMjNfcmVnZGF0YSkgLyBzaXplb2YoY3gyNDEyM19yZWdkYXRhWzBdKTsgaSsrKQorCQljeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCBjeDI0MTIzX3JlZ2RhdGFbaV0ucmVnLCBjeDI0MTIzX3JlZ2RhdGFbaV0uZGF0YSk7CisKKwlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpCisJCXN0YXRlLT5jb25maWctPnBsbF9pbml0KGZlKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgTE5CIGZvciAxNFYgKi8KKwlpZiAoc3RhdGUtPmNvbmZpZy0+dXNlX2lzbDY0MjEpCisJCWN4MjQxMjNfd3JpdGVsbmJyZWcoc3RhdGUsIDB4MCwgMHgyYSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeDI0MTIzX3NldF92b2x0YWdlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfdm9sdGFnZV90IHZvbHRhZ2UpCit7CisJc3RydWN0IGN4MjQxMjNfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggdmFsOworCisJc3dpdGNoIChzdGF0ZS0+Y29uZmlnLT51c2VfaXNsNjQyMSkgeworCisJY2FzZSAxOgorCisJCXZhbCA9IGN4MjQxMjNfcmVhZGxuYnJlZyhzdGF0ZSwgMHgwKTsKKworCQlzd2l0Y2ggKHZvbHRhZ2UpIHsKKwkJY2FzZSBTRUNfVk9MVEFHRV8xMzoKKwkJCXJldHVybiBjeDI0MTIzX3dyaXRlbG5icmVnKHN0YXRlLCAweDAsIHZhbCAmIDB4MzIpOyAvKiBWIDEzdiAqLworCQljYXNlIFNFQ19WT0xUQUdFXzE4OgorCQkJcmV0dXJuIGN4MjQxMjNfd3JpdGVsbmJyZWcoc3RhdGUsIDB4MCwgdmFsIHwgMHgwNCk7IC8qIEggMTh2ICovCisJCWNhc2UgU0VDX1ZPTFRBR0VfT0ZGOgorCQkJcmV0dXJuIGN4MjQxMjNfd3JpdGVsbmJyZWcoc3RhdGUsIDB4MCwgdmFsICYgMHgzMCk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfTsKKworCWNhc2UgMDoKKworCQl2YWwgPSBjeDI0MTIzX3JlYWRyZWcoc3RhdGUsIDB4MjkpOworCisJCXN3aXRjaCAodm9sdGFnZSkgeworCQljYXNlIFNFQ19WT0xUQUdFXzEzOgorCQkJZHByaW50aygiJXM6IHNldHRpbmcgdm9sdGFnZSAxM1ZcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlpZiAoc3RhdGUtPmNvbmZpZy0+ZW5hYmxlX2xuYl92b2x0YWdlKQorCQkJCXN0YXRlLT5jb25maWctPmVuYWJsZV9sbmJfdm9sdGFnZShmZSwgMSk7CisJCQlyZXR1cm4gY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgyOSwgdmFsIHwgMHg4MCk7CisJCWNhc2UgU0VDX1ZPTFRBR0VfMTg6CisJCQlkcHJpbnRrKCIlczogc2V0dGluZyB2b2x0YWdlIDE4VlxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWlmIChzdGF0ZS0+Y29uZmlnLT5lbmFibGVfbG5iX3ZvbHRhZ2UpCisJCQkJc3RhdGUtPmNvbmZpZy0+ZW5hYmxlX2xuYl92b2x0YWdlKGZlLCAxKTsKKwkJCXJldHVybiBjeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDI5LCB2YWwgJiAweDdmKTsKKwkJY2FzZSBTRUNfVk9MVEFHRV9PRkY6CisJCQlkcHJpbnRrKCIlczogc2V0dGluZyB2b2x0YWdlIG9mZlxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWlmIChzdGF0ZS0+Y29uZmlnLT5lbmFibGVfbG5iX3ZvbHRhZ2UpCisJCQkJc3RhdGUtPmNvbmZpZy0+ZW5hYmxlX2xuYl92b2x0YWdlKGZlLCAwKTsKKwkJCXJldHVybiAwOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3gyNDEyM19zZW5kX2Rpc2VxY19tc2coc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJICAgc3RydWN0IGR2Yl9kaXNlcWNfbWFzdGVyX2NtZCAqY21kKQoreworCS8qIGZpeG1lOiBJbXBsZW1lbnQgZGlzZXFjICovCisJcHJpbnRrKCIlczogTm8gc3VwcG9ydCB5ZXRcbiIsX19GVU5DVElPTl9fKTsKKworCXJldHVybiAtRU5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbnQgY3gyNDEyM19yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc3RhdHVzX3QqIHN0YXR1cykKK3sKKwlzdHJ1Y3QgY3gyNDEyM19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWludCBzeW5jID0gY3gyNDEyM19yZWFkcmVnKHN0YXRlLCAweDE0KTsKKwlpbnQgbG9jayA9IGN4MjQxMjNfcmVhZHJlZyhzdGF0ZSwgMHgyMCk7CisKKwkqc3RhdHVzID0gMDsKKwlpZiAobG9jayAmIDB4MDEpCisJCSpzdGF0dXMgfD0gRkVfSEFTX0NBUlJJRVIgfCBGRV9IQVNfU0lHTkFMOworCWlmIChzeW5jICYgMHgwNCkKKwkJKnN0YXR1cyB8PSBGRV9IQVNfVklURVJCSTsKKwlpZiAoc3luYyAmIDB4MDgpCisJCSpzdGF0dXMgfD0gRkVfSEFTX0NBUlJJRVI7CisJaWYgKHN5bmMgJiAweDgwKQorCQkqc3RhdHVzIHw9IEZFX0hBU19TWU5DIHwgRkVfSEFTX0xPQ0s7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvbmZpZ3VyZWQgdG8gcmV0dXJuIHRoZSBtZWFzdXJlbWVudCBvZiBlcnJvcnMgaW4gYmxvY2tzLCBiZWNhdXNlIG5vIFVDQkxPQ0tTIHZhbHVlCisgKiBpcyBhdmFpbGFibGUsIHNvIHRoaXMgdmFsdWUgZG91YmxlcyB1cCB0byBzYXRpc2Z5IGJvdGggbWVhc3VyZW1lbnRzCisgKi8KK3N0YXRpYyBpbnQgY3gyNDEyM19yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiBiZXIpCit7CisJc3RydWN0IGN4MjQxMjNfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlzdGF0ZS0+bGFzdGJlciA9CisJCSgoY3gyNDEyM19yZWFkcmVnKHN0YXRlLCAweDFjKSAmIDB4M2YpIDw8IDE2KSB8CisJCShjeDI0MTIzX3JlYWRyZWcoc3RhdGUsIDB4MWQpIDw8IDggfAorCQljeDI0MTIzX3JlYWRyZWcoc3RhdGUsIDB4MWUpKTsKKworCS8qIERvIHRoZSBzaWduYWwgcXVhbGl0eSBwcm9jZXNzaW5nIGhlcmUsIGl0J3MgZGVyaXZlZCBmcm9tIHRoZSBCRVIuICovCisJLyogU2NhbGUgdGhlIEJFUiBmcm9tIGEgMjRiaXQgdG8gYSBTTlIgMTYgYml0IHdoZXJlIGhpZ2hlciA9IGJldHRlciAqLworCWlmIChzdGF0ZS0+bGFzdGJlciA8IDUwMDApCisJCXN0YXRlLT5zbnIgPSA2NTUqMTAwOworCWVsc2UgaWYgKCAoc3RhdGUtPmxhc3RiZXIgPj0gICA1MDAwKSAmJiAoc3RhdGUtPmxhc3RiZXIgPCAgNTUwMDApICkKKwkJc3RhdGUtPnNuciA9IDY1NSo5MDsKKwllbHNlIGlmICggKHN0YXRlLT5sYXN0YmVyID49ICA1NTAwMCkgJiYgKHN0YXRlLT5sYXN0YmVyIDwgMTUwMDAwKSApCisJCXN0YXRlLT5zbnIgPSA2NTUqODA7CisJZWxzZSBpZiAoIChzdGF0ZS0+bGFzdGJlciA+PSAxNTAwMDApICYmIChzdGF0ZS0+bGFzdGJlciA8IDI1MDAwMCkgKQorCQlzdGF0ZS0+c25yID0gNjU1KjcwOworCWVsc2UgaWYgKCAoc3RhdGUtPmxhc3RiZXIgPj0gMjUwMDAwKSAmJiAoc3RhdGUtPmxhc3RiZXIgPCA0NTAwMDApICkKKwkJc3RhdGUtPnNuciA9IDY1NSo2NTsKKwllbHNlCisJCXN0YXRlLT5zbnIgPSAwOworCisJKmJlciA9IHN0YXRlLT5sYXN0YmVyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3gyNDEyM19yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2KiBzaWduYWxfc3RyZW5ndGgpCit7CisJc3RydWN0IGN4MjQxMjNfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJKnNpZ25hbF9zdHJlbmd0aCA9IGN4MjQxMjNfcmVhZHJlZyhzdGF0ZSwgMHgzYikgPDwgODsgLyogbGFyZ2VyID0gYmV0dGVyICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeDI0MTIzX3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHNucikKK3sKKwlzdHJ1Y3QgY3gyNDEyM19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwkqc25yID0gc3RhdGUtPnNucjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4MjQxMjNfcmVhZF91Y2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiB1Y2Jsb2NrcykKK3sKKwlzdHJ1Y3QgY3gyNDEyM19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwkqdWNibG9ja3MgPSBzdGF0ZS0+bGFzdGJlcjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4MjQxMjNfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJc3RydWN0IGN4MjQxMjNfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlpZiAoc3RhdGUtPmNvbmZpZy0+c2V0X3RzX3BhcmFtcykKKwkJc3RhdGUtPmNvbmZpZy0+c2V0X3RzX3BhcmFtcyhmZSwgMCk7CisKKwlzdGF0ZS0+Y3VycmVudGZyZXE9cC0+ZnJlcXVlbmN5OworCXN0YXRlLT5jdXJyZW50c3ltYm9scmF0ZSA9IHAtPnUucXBzay5zeW1ib2xfcmF0ZTsKKworCWN4MjQxMjNfc2V0X2ludmVyc2lvbihzdGF0ZSwgcC0+aW52ZXJzaW9uKTsKKwljeDI0MTIzX3NldF9mZWMoc3RhdGUsIHAtPnUucXBzay5mZWNfaW5uZXIpOworCWN4MjQxMjNfc2V0X3N5bWJvbHJhdGUoc3RhdGUsIHAtPnUucXBzay5zeW1ib2xfcmF0ZSk7CisJY3gyNDEyM19wbGxfdHVuZShmZSwgcCk7CisKKwkvKiBFbmFibGUgYXV0b21hdGljIGFxdWlzaXRpb24gYW5kIHJlc2V0IGN5Y2xlICovCisJY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgwMywgKGN4MjQxMjNfcmVhZHJlZyhzdGF0ZSwgMHgwMykgfCAweDA3KSk7CisJY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgwMCwgMHgxMCk7CisJY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgwMCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeDI0MTIzX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQoreworCXN0cnVjdCBjeDI0MTIzX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJaWYgKGN4MjQxMjNfZ2V0X2ludmVyc2lvbihzdGF0ZSwgJnAtPmludmVyc2lvbikgIT0gMCkgeworCQlwcmludGsoIiVzOiBGYWlsZWQgdG8gZ2V0IGludmVyc2lvbiBzdGF0dXNcbiIsX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCWlmIChjeDI0MTIzX2dldF9mZWMoc3RhdGUsICZwLT51LnFwc2suZmVjX2lubmVyKSAhPSAwKSB7CisJCXByaW50aygiJXM6IEZhaWxlZCB0byBnZXQgZmVjIHN0YXR1c1xuIixfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisJcC0+ZnJlcXVlbmN5ID0gc3RhdGUtPmN1cnJlbnRmcmVxOworCXAtPnUucXBzay5zeW1ib2xfcmF0ZSA9IHN0YXRlLT5jdXJyZW50c3ltYm9scmF0ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4MjQxMjNfc2V0X3RvbmUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY190b25lX21vZGVfdCB0b25lKQoreworCXN0cnVjdCBjeDI0MTIzX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IHZhbDsKKworCXN3aXRjaCAoc3RhdGUtPmNvbmZpZy0+dXNlX2lzbDY0MjEpIHsKKwljYXNlIDE6CisKKwkJdmFsID0gY3gyNDEyM19yZWFkbG5icmVnKHN0YXRlLCAweDApOworCisJCXN3aXRjaCAodG9uZSkgeworCQljYXNlIFNFQ19UT05FX09OOgorCQkJcmV0dXJuIGN4MjQxMjNfd3JpdGVsbmJyZWcoc3RhdGUsIDB4MCwgdmFsIHwgMHgxMCk7CisJCWNhc2UgU0VDX1RPTkVfT0ZGOgorCQkJcmV0dXJuIGN4MjQxMjNfd3JpdGVsbmJyZWcoc3RhdGUsIDB4MCwgdmFsICYgMHgyZik7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoIiVzOiBDQVNFIHJlYWNoZWQgZGVmYXVsdCB3aXRoIHRvbmU9JWRcbiIsIF9fRlVOQ1RJT05fXywgdG9uZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJY2FzZSAwOgorCisJCXZhbCA9IGN4MjQxMjNfcmVhZHJlZyhzdGF0ZSwgMHgyOSk7CisKKwkJc3dpdGNoICh0b25lKSB7CisJCWNhc2UgU0VDX1RPTkVfT046CisJCQlkcHJpbnRrKCIlczogc2V0dGluZyB0b25lIG9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIGN4MjQxMjNfd3JpdGVyZWcoc3RhdGUsIDB4MjksIHZhbCB8IDB4MTApOworCQljYXNlIFNFQ19UT05FX09GRjoKKwkJCWRwcmludGsoIiVzOiBzZXR0aW5nIHRvbmUgb2ZmXG4iLF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgyOSwgdmFsICYgMHhlZik7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoIiVzOiBDQVNFIHJlYWNoZWQgZGVmYXVsdCB3aXRoIHRvbmU9JWRcbiIsIF9fRlVOQ1RJT05fXywgdG9uZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjeDI0MTIzX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJc3RydWN0IGN4MjQxMjNfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJZHByaW50aygiJXNcbiIsX19GVU5DVElPTl9fKTsKKwlrZnJlZShzdGF0ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBjeDI0MTIzX29wczsKKworc3RydWN0IGR2Yl9mcm9udGVuZCogY3gyNDEyM19hdHRhY2goY29uc3Qgc3RydWN0IGN4MjQxMjNfY29uZmlnKiBjb25maWcsCisJCQkJICAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKQoreworCXN0cnVjdCBjeDI0MTIzX3N0YXRlKiBzdGF0ZSA9IE5VTEw7CisJaW50IHJldDsKKworCWRwcmludGsoIiVzXG4iLF9fRlVOQ1RJT05fXyk7CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLworCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGN4MjQxMjNfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3RhdGUgPT0gTlVMTCkgeworCQlwcmludGsoIlVuYWJsZSB0byBrbWFsbG9jXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KKwlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOworCXN0YXRlLT5pMmMgPSBpMmM7CisJbWVtY3B5KCZzdGF0ZS0+b3BzLCAmY3gyNDEyM19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCXN0YXRlLT5sYXN0YmVyID0gMDsKKwlzdGF0ZS0+c25yID0gMDsKKwlzdGF0ZS0+bG5icmVnID0gMDsKKwlzdGF0ZS0+VkNBYXJnID0gMDsKKwlzdGF0ZS0+VkdBYXJnID0gMDsKKwlzdGF0ZS0+YmFuZHNlbGVjdGFyZyA9IDA7CisJc3RhdGUtPnBsbGFyZyA9IDA7CisJc3RhdGUtPmN1cnJlbnRmcmVxID0gMDsKKwlzdGF0ZS0+Y3VycmVudHN5bWJvbHJhdGUgPSAwOworCisJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCisJcmV0ID0gY3gyNDEyM19yZWFkcmVnKHN0YXRlLCAweDAwKTsKKwlpZiAoKHJldCAhPSAweGQxKSAmJiAocmV0ICE9IDB4ZTEpKSB7CisJCXByaW50aygiVmVyc2lvbiAhPSBkMSBvciBlMVxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLworCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOworCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOworCitlcnJvcjoKKwlrZnJlZShzdGF0ZSk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGN4MjQxMjNfb3BzID0geworCisJLmluZm8gPSB7CisJCS5uYW1lID0gIkNvbmV4YW50IENYMjQxMjMvQ1gyNDEwOSIsCisJCS50eXBlID0gRkVfUVBTSywKKwkJLmZyZXF1ZW5jeV9taW4gPSA5NTAwMDAsCisJCS5mcmVxdWVuY3lfbWF4ID0gMjE1MDAwMCwKKwkJLmZyZXF1ZW5jeV9zdGVwc2l6ZSA9IDEwMTEsIC8qIGtIeiBmb3IgUVBTSyBmcm9udGVuZHMgKi8KKwkJLmZyZXF1ZW5jeV90b2xlcmFuY2UgPSAyOTUwMCwKKwkJLnN5bWJvbF9yYXRlX21pbiA9IDEwMDAwMDAsCisJCS5zeW1ib2xfcmF0ZV9tYXggPSA0NTAwMDAwMCwKKwkJLmNhcHMgPSBGRV9DQU5fSU5WRVJTSU9OX0FVVE8gfAorCQkJRkVfQ0FOX0ZFQ18xXzIgfCBGRV9DQU5fRkVDXzJfMyB8IEZFX0NBTl9GRUNfM180IHwKKwkJCUZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ183XzggfCBGRV9DQU5fRkVDX0FVVE8gfAorCQkJRkVfQ0FOX1FQU0sgfCBGRV9DQU5fUkVDT1ZFUgorCX0sCisKKwkucmVsZWFzZSA9IGN4MjQxMjNfcmVsZWFzZSwKKworCS5pbml0ID0gY3gyNDEyM19pbml0ZmUsCisJLnNldF9mcm9udGVuZCA9IGN4MjQxMjNfc2V0X2Zyb250ZW5kLAorCS5nZXRfZnJvbnRlbmQgPSBjeDI0MTIzX2dldF9mcm9udGVuZCwKKwkucmVhZF9zdGF0dXMgPSBjeDI0MTIzX3JlYWRfc3RhdHVzLAorCS5yZWFkX2JlciA9IGN4MjQxMjNfcmVhZF9iZXIsCisJLnJlYWRfc2lnbmFsX3N0cmVuZ3RoID0gY3gyNDEyM19yZWFkX3NpZ25hbF9zdHJlbmd0aCwKKwkucmVhZF9zbnIgPSBjeDI0MTIzX3JlYWRfc25yLAorCS5yZWFkX3VjYmxvY2tzID0gY3gyNDEyM19yZWFkX3VjYmxvY2tzLAorCS5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gY3gyNDEyM19zZW5kX2Rpc2VxY19tc2csCisJLnNldF90b25lID0gY3gyNDEyM19zZXRfdG9uZSwKKwkuc2V0X3ZvbHRhZ2UgPSBjeDI0MTIzX3NldF92b2x0YWdlLAorfTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlR1cm4gb24vb2ZmIGZyb250ZW5kIGRlYnVnZ2luZyAoZGVmYXVsdDpvZmYpLiIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkRWQiBGcm9udGVuZCBtb2R1bGUgZm9yIENvbmV4YW50IGN4MjQxMjMvY3gyNDEwOSBoYXJkd2FyZSIpOworTU9EVUxFX0FVVEhPUigiU3RldmVuIFRvdGgiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworRVhQT1JUX1NZTUJPTChjeDI0MTIzX2F0dGFjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDEyMy5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMjMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzkyMmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMjMuaApAQCAtMCwwICsxLDUxIEBACisvKgorICAgIENvbmV4YW50IGN4MjQxMjMvY3gyNDEwOSAtIERWQiBRUFNLIFNhdGVsbGl0ZSBkZW1vZC90dW5lciBkcml2ZXIKKworICAgIENvcHlyaWdodCAoQykgMjAwNSBTdGV2ZW4gVG90aCA8c3RvdGhAaGF1cHBhdWdlLmNvbT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2lmbmRlZiBDWDI0MTIzX0gKKyNkZWZpbmUgQ1gyNDEyM19ICisKKyNpbmNsdWRlIDxsaW51eC9kdmIvZnJvbnRlbmQuaD4KKworc3RydWN0IGN4MjQxMjNfY29uZmlnCit7CisJLyogdGhlIGRlbW9kdWxhdG9yJ3MgaTJjIGFkZHJlc3MgKi8KKwl1OCBkZW1vZF9hZGRyZXNzOworCisJLyoKKwkgICBjYXJkcyBsaWtlIEhhdXBwYXVnZSBOb3ZhLVMgUGx1cy9Ob3ZhLVNFMiB1c2UgYW4gSW50ZXJzaWwgSVNMNjQyMSBjaGlwCisJICAgZm9yIExOQiBjb250cm9sLCB3aGlsZSBLV29ybGQgRFZCLVMgMTAwIHVzZSB0aGUgTE5CREMgYW5kIExOQlRvbmUgYml0cworCSAgIGZyb20gcmVnaXN0ZXIgMHgyOSBvZiB0aGUgQ1gyNDEyMyBkZW1vZHVsYXRvcgorCSovCisJaW50IHVzZV9pc2w2NDIxOworCisJLyogUExMIG1haW50ZW5hbmNlICovCisJaW50ICgqcGxsX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKKwlpbnQgKCpwbGxfc2V0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpOworCisJLyogTmVlZCB0byBzZXQgZGV2aWNlIHBhcmFtIGZvciBzdGFydF9kbWEgKi8KKwlpbnQgKCpzZXRfdHNfcGFyYW1zKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IGlzX3B1bmN0dXJlZCk7CisKKwl2b2lkICgqZW5hYmxlX2xuYl92b2x0YWdlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IG9uKTsKK307CisKK2V4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBjeDI0MTIzX2F0dGFjaChjb25zdCBzdHJ1Y3QgY3gyNDEyM19jb25maWcqIGNvbmZpZywKKwkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpOworCisjZW5kaWYgLyogQ1gyNDEyM19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1iLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1iLmMKaW5kZXggNmIwNTUzNi4uYWU1ODlhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWIuYwpAQCAtNzAwLDEwICs3MDAsOSBAQAogCXN0cnVjdCBkaWIzMDAwX3N0YXRlKiBzdGF0ZSA9IE5VTEw7CiAKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLwotCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRpYjMwMDBfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlzdGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkaWIzMDAwX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0YXRlID09IE5VTEwpCiAJCWdvdG8gZXJyb3I7Ci0JbWVtc2V0KHN0YXRlLDAsc2l6ZW9mKHN0cnVjdCBkaWIzMDAwX3N0YXRlKSk7CiAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+aTJjID0gaTJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYy5jCmluZGV4IGMwMjRmYWQuLjNiMzAzZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1jLmMKQEAgLTgzMiwxMCArODMyLDkgQEAKIAl1MTYgZGV2aWQ7CiAKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLwotCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRpYjMwMDBfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlzdGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkaWIzMDAwX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0YXRlID09IE5VTEwpCiAJCWdvdG8gZXJyb3I7Ci0JbWVtc2V0KHN0YXRlLDAsc2l6ZW9mKHN0cnVjdCBkaWIzMDAwX3N0YXRlKSk7CiAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+aTJjID0gaTJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmMKaW5kZXggZjg1N2I4Ni4uMWI5OTM0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5jCkBAIC0xMDcsMTggKzEwNywxOSBAQAogfTsKIEVYUE9SVF9TWU1CT0woZHZiX3BsbF9taWNyb3R1bmVfNDA0Mik7CiAKLXN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF90aG9tc29uX2R0dDc2MTEgPSB7Ci0JLm5hbWUgID0gIlRob21zb24gZHR0NzYxMSIsCi0JLm1pbiAgID0gIDQ0MDAwMDAwLAotCS5tYXggICA9IDk1ODAwMDAwMCwKK3N0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF90aG9tc29uX2R0dDc2MXggPSB7CisJLyogRFRUIDc2MTEgNzYxMUEgNzYxMiA3NjEzIDc2MTNBIDc2MTQgNzYxNSA3NjE1QSAqLworCS5uYW1lICA9ICJUaG9tc29uIGR0dDc2MXgiLAorCS5taW4gICA9ICA1NzAwMDAwMCwKKwkubWF4ICAgPSA4NjMwMDAwMDAsCiAJLmNvdW50ID0gMywKIAkuZW50cmllcyA9IHsKLQkJeyAxNTcyNTAwMDAsIDQ0MDAwMDAwLCA2MjUwMCwgMHg4ZSwgMHgzOSB9LAotCQl7IDQ1NDAwMDAwMCwgNDQwMDAwMDAsIDYyNTAwLCAweDhlLCAweDNhIH0sCisJCXsgMTQ3MDAwMDAwLCA0NDAwMDAwMCwgNjI1MDAsIDB4OGUsIDB4MzkgfSwKKwkJeyA0MTcwMDAwMDAsIDQ0MDAwMDAwLCA2MjUwMCwgMHg4ZSwgMHgzYSB9LAogCQl7IDk5OTk5OTk5OSwgNDQwMDAwMDAsIDYyNTAwLCAweDhlLCAweDNjIH0sCiAJfSwKIH07Ci1FWFBPUlRfU1lNQk9MKGR2Yl9wbGxfdGhvbXNvbl9kdHQ3NjExKTsKK0VYUE9SVF9TWU1CT0woZHZiX3BsbF90aG9tc29uX2R0dDc2MXgpOwogCiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdW5rbm93bl8xID0gewogCS5uYW1lICA9ICJ1bmtub3duIDEiLCAvKiB1c2VkIGJ5IGRudHYgbGl2ZSBkdmItdCAqLwpAQCAtMzMyLDcgKzMzMyw3IEBACiAJLm5hbWUgPSAiU2Ftc3VuZyBUQk1WMzAxMTFJTiIsCiAJLm1pbiA9IDU0MDAwMDAwLAogCS5tYXggPSA4NjAwMDAwMDAsCi0JLmNvdW50ID0gNCwKKwkuY291bnQgPSA2LAogCS5lbnRyaWVzID0gewogCQl7IDE3MjAwMDAwMCwgNDQwMDAwMDAsIDE2NjY2NiwgMHhiNCwgMHgwMSB9LAogCQl7IDIxNDAwMDAwMCwgNDQwMDAwMDAsIDE2NjY2NiwgMHhiNCwgMHgwMiB9LApAQCAtMzQ0LDYgKzM0NSwyMyBAQAogfTsKIEVYUE9SVF9TWU1CT0woZHZiX3BsbF90Ym12MzAxMTFpbik7CiAKKy8qCisgKiBQaGlsaXBzIFNEMTg3OCBUdW5lci4KKyAqLworc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3BoaWxpcHNfc2QxODc4X3RkYTgyNjEgPSB7CisJLm5hbWUgID0gIlBoaWxpcHMgU0QxODc4IiwKKwkubWluICAgPSAgOTUwMDAwLAorCS5tYXggICA9IDIxNTAwMDAsCisJLmNvdW50ID0gNCwKKwkuZW50cmllcyA9IHsKKwkJeyAxMjUwMDAwLCA0OTksIDUwMCwgMHhjNCwgMHgwMH0sCisJCXsgMTU1MDAwMCwgNDk5LCA1MDAsIDB4YzQsIDB4NDB9LAorCQl7IDIwNTAwMDAsIDQ5OSwgNTAwLCAweGM0LCAweDgwfSwKKwkJeyAyMTUwMDAwLCA0OTksIDUwMCwgMHhjNCwgMHhjMH0sCisJfSwKK307CitFWFBPUlRfU1lNQk9MKGR2Yl9wbGxfcGhpbGlwc19zZDE4NzhfdGRhODI2MSk7CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuaAppbmRleCA0OTdkMzFkLi5mNjgyYzA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmgKQEAgLTI1LDcgKzI1LDcgQEAKIGV4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdGhvbXNvbl9kdHQ3NjEwOwogZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF9sZ196MjAxOwogZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF9taWNyb3R1bmVfNDA0MjsKLWV4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdGhvbXNvbl9kdHQ3NjExOworZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF90aG9tc29uX2R0dDc2MXg7CiBleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3Vua25vd25fMTsKIAogZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF90dWE2MDEweHM7CkBAIC0zOSw2ICszOSw3IEBACiBleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3R1djEyMzZkOwogZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF90ZGh1MjsKIGV4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdGJtdjMwMTExaW47CitleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3BoaWxpcHNfc2QxODc4X3RkYTgyNjE7CiAKIGludCBkdmJfcGxsX2NvbmZpZ3VyZShzdHJ1Y3QgZHZiX3BsbF9kZXNjICpkZXNjLCB1OCAqYnVmLAogCQkgICAgICB1MzIgZnJlcSwgaW50IGJhbmR3aWR0aCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMweC5jCmluZGV4IGNiNTMwMTg2NS4uNDY5MWFjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzB4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzB4LmMKQEAgLTI3LDYgKzI3LDcgQEAKICAqICAgRFZpQ08gRnVzaW9uSERUViAzIEdvbGQtVAogICogICBEVmlDTyBGdXNpb25IRFRWIDUgR29sZAogICogICBEVmlDTyBGdXNpb25IRFRWIDUgTGl0ZQorICogICBEVmlDTyBGdXNpb25IRFRWIDUgVVNCIEdvbGQKICAqICAgQWlyMlBDL0FpclN0YXIgMiBBVFNDIDNyZCBnZW5lcmF0aW9uIChIRDUwMDApCiAgKgogICogVE9ETzoKQEAgLTQwMiw2ICs0MDMsOCBAQAogCQlzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBwYXJhbSk7CiAKIAkvKiBLZWVwIHRyYWNrIG9mIHRoZSBuZXcgZnJlcXVlbmN5ICovCisJLyogRklYTUUgdGhpcyBpcyB0aGUgd3Jvbmcgd2F5IHRvIGRvIHRoaXMuLi4gICAgICAgICAgICovCisJLyogVGhlIHR1bmVyIGlzIHNoYXJlZCB3aXRoIHRoZSB2aWRlbzRsaW51eCBhbmFsb2cgQVBJICovCiAJc3RhdGUtPmN1cnJlbnRfZnJlcXVlbmN5ID0gcGFyYW0tPmZyZXF1ZW5jeTsKIAogCWxnZHQzMzB4X1N3UmVzZXQoc3RhdGUpOwpAQCAtNzExLDEwICs3MTQsOSBAQAogCXU4IGJ1ZlsxXTsKIAogCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCi0Jc3RhdGUgPSAoc3RydWN0IGxnZHQzMzB4X3N0YXRlKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGxnZHQzMzB4X3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJc3RhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbGdkdDMzMHhfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUgPT0gTlVMTCkKIAkJZ290byBlcnJvcjsKLQltZW1zZXQoc3RhdGUsMCxzaXplb2YoKnN0YXRlKSk7CiAKIAkvKiBTZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzEyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzMTIuYwppbmRleCA4ZDY3MjI4Li5lYzRlNjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzMTIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzMTIuYwpAQCAtNTAxLDcgKzUwMSw4IEBACiAJY2FzZSBJRF9WUDMxMDoKIAkvLyBGb3Igbm93IHdlIHdpbGwgZG8gdGhpcyBvbmx5IGZvciB0aGUgVlAzMTAuCiAJLy8gSXQgc2hvdWxkIGJlIGJldHRlciBmb3IgdGhlIG10MzEyIGFzIHdlbGwsIGJ1dCB0dW5uaW5nIHdpbGwgYmUgc2xvd2VyLiBBQ0NKciAwOS8yOS8wMwotCQlpZiAoKHJldCA9IG10MzEyX3JlYWRyZWcoc3RhdGUsIENPTkZJRywgJmNvbmZpZ192YWwpIDwgMCkpCisJCXJldCA9IG10MzEyX3JlYWRyZWcoc3RhdGUsIENPTkZJRywgJmNvbmZpZ192YWwpOworCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAJCWlmIChwLT51LnFwc2suc3ltYm9sX3JhdGUgPj0gMzAwMDAwMDApIC8vTm90ZSB0aGF0IDMwTVMvcyBzaG91bGQgdXNlIDkwTUh6CiAJCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDM1Mi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzUyLmMKaW5kZXggZjBjNjEwZi4uYWFhZWM5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzUyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzUyLmMKQEAgLTUzNSw5ICs1MzUsOCBAQAogCXN0cnVjdCBtdDM1Ml9zdGF0ZSogc3RhdGUgPSBOVUxMOwogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KLQlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtdDM1Ml9zdGF0ZSksIEdGUF9LRVJORUwpOworCXN0YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG10MzUyX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0YXRlID09IE5VTEwpIGdvdG8gZXJyb3I7Ci0JbWVtc2V0KHN0YXRlLDAsc2l6ZW9mKCpzdGF0ZSkpOwogCiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmkyYyA9IGkyYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQyMDAyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0MjAwMi5jCmluZGV4IDUyYzQxNjAuLjRmMjYzZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQyMDAyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDIwMDIuYwpAQCAtMjIsNyArMjIsOCBAQAogLyoKICAqIFRoaXMgZHJpdmVyIG5lZWRzIGV4dGVybmFsIGZpcm13YXJlLiBQbGVhc2UgdXNlIHRoZSBjb21tYW5kCiAgKiAiPGtlcm5lbGRpcj4vRG9jdW1lbnRhdGlvbi9kdmIvZ2V0X2R2Yl9maXJtd2FyZSBueHQyMDAyIiB0bwotICogZG93bmxvYWQvZXh0cmFjdCBpdCwgYW5kIHRoZW4gY29weSBpdCB0byAvdXNyL2xpYi9ob3RwbHVnL2Zpcm13YXJlLgorICogZG93bmxvYWQvZXh0cmFjdCBpdCwgYW5kIHRoZW4gY29weSBpdCB0byAvdXNyL2xpYi9ob3RwbHVnL2Zpcm13YXJlCisgKiBvciAvbGliL2Zpcm13YXJlIChkZXBlbmRpbmcgb24gY29uZmlndXJhdGlvbiBvZiBmaXJtd2FyZSBob3RwbHVnKS4KICAqLwogI2RlZmluZSBOWFQyMDAyX0RFRkFVTFRfRklSTVdBUkUgImR2Yi1mZS1ueHQyMDAyLmZ3IgogI2RlZmluZSBDUkNfQ0NJVF9NQVNLIDB4MTAyMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDIwMHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQyMDB4LmMKaW5kZXggYWVhZmVmNC4uNzhkMmI5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDIwMHguYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0MjAweC5jCkBAIC0xMTEwLDEwICsxMTEwLDkgQEAKIAl1OCBidWYgW10gPSB7MCwwLDAsMCwwfTsKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCi0Jc3RhdGUgPSAoc3RydWN0IG54dDIwMHhfc3RhdGUqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgbnh0MjAweF9zdGF0ZSksIEdGUF9LRVJORUwpOworCXN0YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG54dDIwMHhfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUgPT0gTlVMTCkKIAkJZ290byBlcnJvcjsKLQltZW1zZXQoc3RhdGUsMCxzaXplb2YoKnN0YXRlKSk7CiAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDYwMDAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQ2MDAwLmMKaW5kZXggYTQ1OGEzYi4uYTE2ZWViYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDYwMDAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0NjAwMC5jCkBAIC01NzQsMTEgKzU3NCwxMSBAQAogCQkuc3ltYm9sX3JhdGVfbWF4ID0gOTM2MDAwMCwJLyogRklYTUUgKi8KIAkJLnN5bWJvbF9yYXRlX3RvbGVyYW5jZSA9IDQwMDAsCiAJCS5jYXBzID0gRkVfQ0FOX0ZFQ18xXzIgfCBGRV9DQU5fRkVDXzJfMyB8IEZFX0NBTl9GRUNfM180IHwKLQkJICAgICAgICBGRV9DQU5fRkVDXzRfNSB8IEZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ182XzcgfAotCQkgICAgICAgIEZFX0NBTl9GRUNfN184IHwgRkVfQ0FOX0ZFQ184XzkgfCBGRV9DQU5fRkVDX0FVVE8gfAotCQkgICAgICAgIEZFX0NBTl9RQU1fMTYgfCBGRV9DQU5fUUFNXzY0IHwgRkVfQ0FOX1FBTV9BVVRPIHwKLQkJICAgICAgICBGRV9DQU5fVFJBTlNNSVNTSU9OX01PREVfQVVUTyB8IEZFX0NBTl9HVUFSRF9JTlRFUlZBTF9BVVRPIHwKLQkJICAgICAgICBGRV9DQU5fSElFUkFSQ0hZX0FVVE8sCisJCQlGRV9DQU5fRkVDXzRfNSB8IEZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ182XzcgfAorCQkJRkVfQ0FOX0ZFQ183XzggfCBGRV9DQU5fRkVDXzhfOSB8IEZFX0NBTl9GRUNfQVVUTyB8CisJCQlGRV9DQU5fUUFNXzE2IHwgRkVfQ0FOX1FBTV82NCB8IEZFX0NBTl9RQU1fQVVUTyB8CisJCQlGRV9DQU5fVFJBTlNNSVNTSU9OX01PREVfQVVUTyB8IEZFX0NBTl9HVUFSRF9JTlRFUlZBTF9BVVRPIHwKKwkJCUZFX0NBTl9ISUVSQVJDSFlfQVVUTywKIAl9LAogCiAJLnJlbGVhc2UgPSBueHQ2MDAwX3JlbGVhc2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTIxMS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTEyMTEuYwppbmRleCA1MzFmNzYyLi43YzNhZWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTIxMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMjExLmMKQEAgLTI1LDcgKzI1LDggQEAKIC8qCiAgKiBUaGlzIGRyaXZlciBuZWVkcyBleHRlcm5hbCBmaXJtd2FyZS4gUGxlYXNlIHVzZSB0aGUgY29tbWFuZAogICogIjxrZXJuZWxkaXI+L0RvY3VtZW50YXRpb24vZHZiL2dldF9kdmJfZmlybXdhcmUgb3I1MTIxMSIgdG8KLSAqIGRvd25sb2FkL2V4dHJhY3QgaXQsIGFuZCB0aGVuIGNvcHkgaXQgdG8gL3Vzci9saWIvaG90cGx1Zy9maXJtd2FyZS4KKyAqIGRvd25sb2FkL2V4dHJhY3QgaXQsIGFuZCB0aGVuIGNvcHkgaXQgdG8gL3Vzci9saWIvaG90cGx1Zy9maXJtd2FyZQorICogb3IgL2xpYi9maXJtd2FyZSAoZGVwZW5kaW5nIG9uIGNvbmZpZ3VyYXRpb24gb2YgZmlybXdhcmUgaG90cGx1ZykuCiAgKi8KICNkZWZpbmUgT1I1MTIxMV9ERUZBVUxUX0ZJUk1XQVJFICJkdmItZmUtb3I1MTIxMS5mdyIKIApAQCAtMTEyLDcgKzExMyw3IEBACiAJdTggdHVkYXRhWzU4NV07CiAJaW50IGk7CiAKLQlkcHJpbnRrKCJGaXJtd2FyZSBpcyAlZCBieXRlc1xuIixmdy0+c2l6ZSk7CisJZHByaW50aygiRmlybXdhcmUgaXMgJXpkIGJ5dGVzXG4iLGZ3LT5zaXplKTsKIAogCS8qIEdldCBlcHJvbSBkYXRhICovCiAJdHVkYXRhWzBdID0gMTc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuYwppbmRleCAxODcxNTA5Li5kNjk0Nzc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDIwLmMKQEAgLTUyMSw4ICs1MjEsOCBAQAogCiAJCWNhc2UgRkVDXzNfNDoKIAkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzAsIDB4MDQpOwotCQkgICAgICAgIHM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIDB4MTIgfCBpbnZlcnNpb24pOwotCQkgICAgICAgIGJyZWFrOworCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxMiB8IGludmVyc2lvbik7CisJCQlicmVhazsKIAogCQljYXNlIEZFQ181XzY6CiAJCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMwLCAweDA4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zcDg4NzAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zcDg4NzAuYwppbmRleCBmYzA2Y2Q2Li43MzgyOWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODcwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3MC5jCkBAIC0yMiw3ICsyMiw4IEBACiAvKgogICogVGhpcyBkcml2ZXIgbmVlZHMgZXh0ZXJuYWwgZmlybXdhcmUuIFBsZWFzZSB1c2UgdGhlIGNvbW1hbmQKICAqICI8a2VybmVsZGlyPi9Eb2N1bWVudGF0aW9uL2R2Yi9nZXRfZHZiX2Zpcm13YXJlIGFscHNfdGRsYjciIHRvCi0gKiBkb3dubG9hZC9leHRyYWN0IGl0LCBhbmQgdGhlbiBjb3B5IGl0IHRvIC91c3IvbGliL2hvdHBsdWcvZmlybXdhcmUuCisgKiBkb3dubG9hZC9leHRyYWN0IGl0LCBhbmQgdGhlbiBjb3B5IGl0IHRvIC91c3IvbGliL2hvdHBsdWcvZmlybXdhcmUKKyAqIG9yIC9saWIvZmlybXdhcmUgKGRlcGVuZGluZyBvbiBjb25maWd1cmF0aW9uIG9mIGZpcm13YXJlIGhvdHBsdWcpLgogICovCiAjZGVmaW5lIFNQODg3MF9ERUZBVUxUX0ZJUk1XQVJFICJkdmItZmUtc3A4ODcwLmZ3IgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODd4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODd4LmMKaW5kZXggZTNiNjY1Ny4uZWI4YTYwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zcDg4N3guYwpAQCAtNSw3ICs1LDggQEAKIC8qCiAgKiBUaGlzIGRyaXZlciBuZWVkcyBleHRlcm5hbCBmaXJtd2FyZS4gUGxlYXNlIHVzZSB0aGUgY29tbWFuZAogICogIjxrZXJuZWxkaXI+L0RvY3VtZW50YXRpb24vZHZiL2dldF9kdmJfZmlybXdhcmUgc3A4ODd4IiB0bwotICogZG93bmxvYWQvZXh0cmFjdCBpdCwgYW5kIHRoZW4gY29weSBpdCB0byAvdXNyL2xpYi9ob3RwbHVnL2Zpcm13YXJlLgorICogZG93bmxvYWQvZXh0cmFjdCBpdCwgYW5kIHRoZW4gY29weSBpdCB0byAvdXNyL2xpYi9ob3RwbHVnL2Zpcm13YXJlCisgKiBvciAvbGliL2Zpcm13YXJlIChkZXBlbmRpbmcgb24gY29uZmlndXJhdGlvbiBvZiBmaXJtd2FyZSBob3RwbHVnKS4KICAqLwogI2RlZmluZSBTUDg4N1hfREVGQVVMVF9GSVJNV0FSRSAiZHZiLWZlLXNwODg3eC5mdyIKIApAQCAtNTgxLDcgKzU4Miw3IEBACiAJCS5jYXBzID0gRkVfQ0FOX0ZFQ18xXzIgfCBGRV9DQU5fRkVDXzJfMyB8IEZFX0NBTl9GRUNfM180IHwKIAkJCUZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ183XzggfCBGRV9DQU5fRkVDX0FVVE8gfAogCQkJRkVfQ0FOX1FQU0sgfCBGRV9DQU5fUUFNXzE2IHwgRkVfQ0FOX1FBTV82NCB8Ci0JCSAgICAgICAgRkVfQ0FOX1JFQ09WRVIKKwkJCUZFX0NBTl9SRUNPVkVSCiAJfSwKIAogCS5yZWxlYXNlID0gc3A4ODd4X3JlbGVhc2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5OS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTkuYwppbmRleCAxNzdkNzFkLi41YmNkMDBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5OS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmMKQEAgLTEzMSw2ICsxMzEsMTMgQEAKIAlyZXR1cm4gcmV0ID09IDIgPyAwIDogcmV0OwogfQogCitpbnQgc3R2MDI5OV9lbmFibGVfcGxsaTJjIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKK3sKKwlzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCXJldHVybiBzdHYwMjk5X3dyaXRlcmVnSShzdGF0ZSwgMHgwNSwgMHhiNSk7CS8qICBlbmFibGUgaTJjIHJlcGVhdGVyIG9uIHN0djAyOTkgICovCit9CisKIHN0YXRpYyBpbnQgc3R2MDI5OV9zZXRfRkVDIChzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUsIGZlX2NvZGVfcmF0ZV90IGZlYykKIHsKIAlkcHJpbnRrICgiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CkBAIC0zODcsNyArMzk0LDcgQEAKIAl9OwogfQogCi1zdGF0aWMgaW50IHN0djAyOTlfc2VuZF9sZWdhY3lfZGlzaF9jbWQgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIgY21kKQorc3RhdGljIGludCBzdHYwMjk5X3NlbmRfbGVnYWN5X2Rpc2hfY21kIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdW5zaWduZWQgbG9uZyBjbWQpCiB7CiAJc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdTggcmVnMHgwODsKQEAgLTQwNyw3ICs0MTQsNyBAQAogCiAJY21kID0gY21kIDw8IDE7CiAJaWYgKGRlYnVnX2xlZ2FjeV9kaXNoX3N3aXRjaCkKLQkJcHJpbnRrICgiJXMgc3dpdGNoIGNvbW1hbmQ6IDB4JTA0eFxuIixfX0ZVTkNUSU9OX18sIGNtZCk7CisJCXByaW50ayAoIiVzIHN3aXRjaCBjb21tYW5kOiAweCUwNGx4XG4iLF9fRlVOQ1RJT05fXywgY21kKTsKIAogCWRvX2dldHRpbWVvZmRheSAoJm5leHR0aW1lKTsKIAlpZiAoZGVidWdfbGVnYWN5X2Rpc2hfc3dpdGNoKQpAQCAtNzE3LDUgKzcyNCw2IEBACiAJICAgICAgIkFuZHJlYXMgT2JlcnJpdHRlciwgQW5kcmV3IGRlIFF1aW5jZXksIEtlbm5ldGggQWFmbPh5Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKK0VYUE9SVF9TWU1CT0woc3R2MDI5OV9lbmFibGVfcGxsaTJjKTsKIEVYUE9SVF9TWU1CT0woc3R2MDI5OV93cml0ZXJlZyk7CiBFWFBPUlRfU1lNQk9MKHN0djAyOTlfYXR0YWNoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5OS5oCmluZGV4IDlhZjNkNzEuLjMyYzg3YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTkuaApAQCAtOTQsNiArOTQsNyBAQAogfTsKIAogZXh0ZXJuIGludCBzdHYwMjk5X3dyaXRlcmVnIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTggcmVnLCB1OCBkYXRhKTsKK2V4dGVybiBpbnQgc3R2MDI5OV9lbmFibGVfcGxsaTJjIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7CiAKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBzdHYwMjk5X2F0dGFjaChjb25zdCBzdHJ1Y3Qgc3R2MDI5OV9jb25maWcqIGNvbmZpZywKIAkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDIxLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwMjEuYwppbmRleCA0MjVjZDE5Li4yMTI1NWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwMjEuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwMjEuYwpAQCAtOTUsNyArOTUsNyBAQAogCXU4IGIwIFtdID0geyByZWcgfTsKIAl1OCBiMSBbXSA9IHsgMCB9OwogCXN0cnVjdCBpMmNfbXNnIG1zZyBbXSA9IHsgeyAuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsIC5mbGFncyA9IDAsIC5idWYgPSBiMCwgLmxlbiA9IDEgfSwKLQkJICAgICAgICAgICAgICAgICAgeyAuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsIC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gYjEsIC5sZW4gPSAxIH0gfTsKKwkJCQkgIHsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLCAuZmxhZ3MgPSBJMkNfTV9SRCwgLmJ1ZiA9IGIxLCAubGVuID0gMSB9IH07CiAJaW50IHJldDsKIAogCXJldCA9IGkyY190cmFuc2ZlciAoc3RhdGUtPmkyYywgbXNnLCAyKTsKQEAgLTQzNCw3ICs0MzQsNyBAQAogCQkuZnJlcXVlbmN5X21heCA9IDg1ODAwMDAwMCwKIAkJLnN5bWJvbF9yYXRlX21pbiA9IChYSU4vMikvNjQsICAgICAvKiBTQUNMSy82NCA9PSAoWElOLzIpLzY0ICovCiAJCS5zeW1ib2xfcmF0ZV9tYXggPSAoWElOLzIpLzQsICAgICAgLyogU0FDTEsvNCAqLwotCSNpZiAwCisjaWYgMAogCQkuZnJlcXVlbmN5X3RvbGVyYW5jZSA9ID8/PywKIAkJLnN5bWJvbF9yYXRlX3RvbGVyYW5jZSA9ID8/PywgIC8qIHBwbSAqLyAgLyogPT0gOCUgKHNwZWMgcC4gNSkgKi8KIAkjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmMKaW5kZXggZGQwMmFmZi4uYzYzZTlhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmMKQEAgLTIzLDcgKzIzLDggQEAKICAqIFRoaXMgZHJpdmVyIG5lZWRzIGV4dGVybmFsIGZpcm13YXJlLiBQbGVhc2UgdXNlIHRoZSBjb21tYW5kcwogICogIjxrZXJuZWxkaXI+L0RvY3VtZW50YXRpb24vZHZiL2dldF9kdmJfZmlybXdhcmUgdGRhMTAwNDUiLAogICogIjxrZXJuZWxkaXI+L0RvY3VtZW50YXRpb24vZHZiL2dldF9kdmJfZmlybXdhcmUgdGRhMTAwNDYiIHRvCi0gKiBkb3dubG9hZC9leHRyYWN0IHRoZW0sIGFuZCB0aGVuIGNvcHkgdGhlbSB0byAvdXNyL2xpYi9ob3RwbHVnL2Zpcm13YXJlLgorICogZG93bmxvYWQvZXh0cmFjdCB0aGVtLCBhbmQgdGhlbiBjb3B5IHRoZW0gdG8gL3Vzci9saWIvaG90cGx1Zy9maXJtd2FyZQorICogb3IgL2xpYi9maXJtd2FyZSAoZGVwZW5kaW5nIG9uIGNvbmZpZ3VyYXRpb24gb2YgZmlybXdhcmUgaG90cGx1ZykuCiAgKi8KICNkZWZpbmUgVERBMTAwNDVfREVGQVVMVF9GSVJNV0FSRSAiZHZiLWZlLXRkYTEwMDQ1LmZ3IgogI2RlZmluZSBUREExMDA0Nl9ERUZBVUxUX0ZJUk1XQVJFICJkdmItZmUtdGRhMTAwNDYuZnciCkBAIC0yNzEsMzIgKzI3Miw1NyBAQAogc3RhdGljIGludCB0ZGExMDA0Nmhfc2V0X2JhbmR3aWR0aChzdHJ1Y3QgdGRhMTAwNHhfc3RhdGUgKnN0YXRlLAogCQkJCSAgIGZlX2JhbmR3aWR0aF90IGJhbmR3aWR0aCkKIHsKLQlzdGF0aWMgdTggYmFuZHdpZHRoXzZtaHpbXSA9IHsgMHg4MCwgMHgxNSwgMHhmZSwgMHhhYiwgMHg4ZSB9OwotCXN0YXRpYyB1OCBiYW5kd2lkdGhfN21oeltdID0geyAweDZlLCAweDAyLCAweDUzLCAweGM4LCAweDI1IH07Ci0Jc3RhdGljIHU4IGJhbmR3aWR0aF84bWh6W10gPSB7IDB4NjAsIDB4MTIsIDB4YTgsIDB4ZTQsIDB4YmQgfTsKKwlzdGF0aWMgdTggYmFuZHdpZHRoXzZtaHpfNTNNW10gPSB7IDB4N2IsIDB4MmUsIDB4MTEsIDB4ZjAsIDB4ZDIgfTsKKwlzdGF0aWMgdTggYmFuZHdpZHRoXzdtaHpfNTNNW10gPSB7IDB4NmEsIDB4MDIsIDB4NmEsIDB4NDMsIDB4OWYgfTsKKwlzdGF0aWMgdTggYmFuZHdpZHRoXzhtaHpfNTNNW10gPSB7IDB4NWMsIDB4MzIsIDB4YzIsIDB4OTYsIDB4NmQgfTsKIAorCXN0YXRpYyB1OCBiYW5kd2lkdGhfNm1oel80OE1bXSA9IHsgMHg3MCwgMHgwMiwgMHg0OSwgMHgyNCwgMHg5MiB9OworCXN0YXRpYyB1OCBiYW5kd2lkdGhfN21oel80OE1bXSA9IHsgMHg2MCwgMHgwMiwgMHhhYSwgMHhhYSwgMHhhYiB9OworCXN0YXRpYyB1OCBiYW5kd2lkdGhfOG1oel80OE1bXSA9IHsgMHg1NCwgMHgwMywgMHgwYywgMHgzMCwgMHhjMyB9OworCWludCB0ZGExMDA0Nl9jbGs1M207CisKKwlpZiAoKHN0YXRlLT5jb25maWctPmlmX2ZyZXEgPT0gVERBMTAwNDZfRlJFUV8wNDUpIHx8CisJICAgIChzdGF0ZS0+Y29uZmlnLT5pZl9mcmVxID09IFREQTEwMDQ2X0ZSRVFfMDUyKSkKKwkJdGRhMTAwNDZfY2xrNTNtID0gMDsKKwllbHNlCisJCXRkYTEwMDQ2X2NsazUzbSA9IDE7CiAJc3dpdGNoIChiYW5kd2lkdGgpIHsKIAljYXNlIEJBTkRXSURUSF82X01IWjoKLQkJdGRhMTAwNHhfd3JpdGVfYnVmKHN0YXRlLCBUREExMDA0NkhfVElNRV9XUkVGMSwgYmFuZHdpZHRoXzZtaHosIHNpemVvZihiYW5kd2lkdGhfNm1oeikpOworCQlpZiAodGRhMTAwNDZfY2xrNTNtKQorCQkJdGRhMTAwNHhfd3JpdGVfYnVmKHN0YXRlLCBUREExMDA0NkhfVElNRV9XUkVGMSwgYmFuZHdpZHRoXzZtaHpfNTNNLAorCQkJCQkJICBzaXplb2YoYmFuZHdpZHRoXzZtaHpfNTNNKSk7CisJCWVsc2UKKwkJCXRkYTEwMDR4X3dyaXRlX2J1ZihzdGF0ZSwgVERBMTAwNDZIX1RJTUVfV1JFRjEsIGJhbmR3aWR0aF82bWh6XzQ4TSwKKwkJCQkJCSAgc2l6ZW9mKGJhbmR3aWR0aF82bWh6XzQ4TSkpOwogCQlpZiAoc3RhdGUtPmNvbmZpZy0+aWZfZnJlcSA9PSBUREExMDA0Nl9GUkVRXzA0NSkgewotCQkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweDA5KTsKLQkJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX0xTQiwgMHg0Zik7CisJCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0ZSRVFfUEhZMl9NU0IsIDB4MGEpOworCQkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTFNCLCAweGFiKTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgQkFORFdJRFRIXzdfTUhaOgotCQl0ZGExMDA0eF93cml0ZV9idWYoc3RhdGUsIFREQTEwMDQ2SF9USU1FX1dSRUYxLCBiYW5kd2lkdGhfN21oeiwgc2l6ZW9mKGJhbmR3aWR0aF83bWh6KSk7CisJCWlmICh0ZGExMDA0Nl9jbGs1M20pCisJCQl0ZGExMDA0eF93cml0ZV9idWYoc3RhdGUsIFREQTEwMDQ2SF9USU1FX1dSRUYxLCBiYW5kd2lkdGhfN21oel81M00sCisJCQkJCQkgIHNpemVvZihiYW5kd2lkdGhfN21oel81M00pKTsKKwkJZWxzZQorCQkJdGRhMTAwNHhfd3JpdGVfYnVmKHN0YXRlLCBUREExMDA0NkhfVElNRV9XUkVGMSwgYmFuZHdpZHRoXzdtaHpfNDhNLAorCQkJCQkJICBzaXplb2YoYmFuZHdpZHRoXzdtaHpfNDhNKSk7CiAJCWlmIChzdGF0ZS0+Y29uZmlnLT5pZl9mcmVxID09IFREQTEwMDQ2X0ZSRVFfMDQ1KSB7Ci0JCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0ZSRVFfUEhZMl9NU0IsIDB4MGEpOwotCQkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTFNCLCAweDc5KTsKKwkJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX01TQiwgMHgwYyk7CisJCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0ZSRVFfUEhZMl9MU0IsIDB4MDApOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBCQU5EV0lEVEhfOF9NSFo6Ci0JCXRkYTEwMDR4X3dyaXRlX2J1ZihzdGF0ZSwgVERBMTAwNDZIX1RJTUVfV1JFRjEsIGJhbmR3aWR0aF84bWh6LCBzaXplb2YoYmFuZHdpZHRoXzhtaHopKTsKKwkJaWYgKHRkYTEwMDQ2X2NsazUzbSkKKwkJCXRkYTEwMDR4X3dyaXRlX2J1ZihzdGF0ZSwgVERBMTAwNDZIX1RJTUVfV1JFRjEsIGJhbmR3aWR0aF84bWh6XzUzTSwKKwkJCQkJCSAgc2l6ZW9mKGJhbmR3aWR0aF84bWh6XzUzTSkpOworCQllbHNlCisJCQl0ZGExMDA0eF93cml0ZV9idWYoc3RhdGUsIFREQTEwMDQ2SF9USU1FX1dSRUYxLCBiYW5kd2lkdGhfOG1oel80OE0sCisJCQkJCQkgIHNpemVvZihiYW5kd2lkdGhfOG1oel80OE0pKTsKIAkJaWYgKHN0YXRlLT5jb25maWctPmlmX2ZyZXEgPT0gVERBMTAwNDZfRlJFUV8wNDUpIHsKLQkJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX01TQiwgMHgwYik7Ci0JCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0ZSRVFfUEhZMl9MU0IsIDB4YTMpOworCQkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweDBkKTsKKwkJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX0xTQiwgMHg1NSk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTQxOCw5ICs0NDQsMjIgQEAKIHN0YXRpYyB2b2lkIHRkYTEwMDQ2X2luaXRfcGxscyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKIAlzdHJ1Y3QgdGRhMTAwNHhfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJaW50IHRkYTEwMDQ2X2NsazUzbTsKKworCWlmICgoc3RhdGUtPmNvbmZpZy0+aWZfZnJlcSA9PSBUREExMDA0Nl9GUkVRXzA0NSkgfHwKKwkgICAgKHN0YXRlLT5jb25maWctPmlmX2ZyZXEgPT0gVERBMTAwNDZfRlJFUV8wNTIpKQorCQl0ZGExMDA0Nl9jbGs1M20gPSAwOworCWVsc2UKKwkJdGRhMTAwNDZfY2xrNTNtID0gMTsKIAogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDEsIDB4ZjApOwotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDIsIDB4MGEpOyAvLyBQTEwgTSA9IDEwCisJaWYodGRhMTAwNDZfY2xrNTNtKSB7CisJCXByaW50ayhLRVJOX0lORk8gInRkYTEwMDR4OiBzZXR0aW5nIHVwIHBsbHMgZm9yIDUzTUh6IHNhbXBsaW5nIGNsb2NrXG4iKTsKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DT05GUExMMiwgMHgwOCk7IC8vIFBMTCBNID0gOAorCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gInRkYTEwMDR4OiBzZXR0aW5nIHVwIHBsbHMgZm9yIDQ4TUh6IHNhbXBsaW5nIGNsb2NrXG4iKTsKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DT05GUExMMiwgMHgwMyk7IC8vIFBMTCBNID0gMworCX0KIAlpZiAoc3RhdGUtPmNvbmZpZy0+eHRhbF9mcmVxID09IFREQTEwMDQ2X1hUQUxfNE0gKSB7CiAJCWRwcmludGsoIiVzOiBzZXR0aW5nIHVwIFBMTHMgZm9yIGEgNCBNSHogWHRhbFxuIiwgX19GVU5DVElPTl9fKTsKIAkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DT05GUExMMywgMCk7IC8vIFBMTCBQID0gTiA9IDAKQEAgLTQyOCwyNiArNDY3LDMyIEBACiAJCWRwcmludGsoIiVzOiBzZXR0aW5nIHVwIFBMTHMgZm9yIGEgMTYgTUh6IFh0YWxcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDMsIDMpOyAvLyBQTEwgUCA9IDAsIE4gPSAzCiAJfQotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9PRkZTRVQsIDk5KTsKKwlpZih0ZGExMDA0Nl9jbGs1M20pCisJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9PRkZTRVQsIDB4NjcpOworCWVsc2UKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX09GRlNFVCwgMHg3Mik7CisJLyogTm90ZSBjbG9jayBmcmVxdWVuY3kgaXMgaGFuZGxlZCBpbXBsaWNpdGx5ICovCiAJc3dpdGNoIChzdGF0ZS0+Y29uZmlnLT5pZl9mcmVxKSB7Ci0JY2FzZSBUREExMDA0Nl9GUkVRXzM2MTc6Ci0JCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX01TQiwgMHhkNCk7Ci0JCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX0xTQiwgMHgyYyk7Ci0JCWJyZWFrOwotCWNhc2UgVERBMTAwNDZfRlJFUV8zNjEzOgotCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0ZSRVFfUEhZMl9NU0IsIDB4ZDQpOwotCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0ZSRVFfUEhZMl9MU0IsIDB4MTMpOwotCQlicmVhazsKIAljYXNlIFREQTEwMDQ2X0ZSRVFfMDQ1OgotCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0ZSRVFfUEhZMl9NU0IsIDB4MGIpOwotCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0ZSRVFfUEhZMl9MU0IsIDB4YTMpOworCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0ZSRVFfUEhZMl9NU0IsIDB4MGMpOworCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0ZSRVFfUEhZMl9MU0IsIDB4MDApOwogCQlicmVhazsKIAljYXNlIFREQTEwMDQ2X0ZSRVFfMDUyOgotCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0ZSRVFfUEhZMl9NU0IsIDB4MGMpOwotCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0ZSRVFfUEhZMl9MU0IsIDB4MDYpOworCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0ZSRVFfUEhZMl9NU0IsIDB4MGQpOworCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0ZSRVFfUEhZMl9MU0IsIDB4YzcpOworCQlicmVhazsKKwljYXNlIFREQTEwMDQ2X0ZSRVFfMzYxNzoKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweGQ3KTsKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTFNCLCAweDU5KTsKKwkJYnJlYWs7CisJY2FzZSBUREExMDA0Nl9GUkVRXzM2MTM6CisJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX01TQiwgMHhkNyk7CisJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX0xTQiwgMHgzZik7CiAJCWJyZWFrOwogCX0KIAl0ZGExMDA0Nmhfc2V0X2JhbmR3aWR0aChzdGF0ZSwgQkFORFdJRFRIXzhfTUhaKTsgLy8gZGVmYXVsdCBiYW5kd2lkdGggOCBNSHoKKwkvKiBsZXQgdGhlIFBMTHMgc2V0dGxlICovCisJbXNsZWVwKDEyMCk7CiB9CiAKIHN0YXRpYyBpbnQgdGRhMTAwNDZfZnd1cGxvYWQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCkBAIC00NjIsMTMgKzUwNywxMyBAQAogCS8qIGxldCB0aGUgY2xvY2tzIHJlY292ZXIgZnJvbSBzbGVlcCAqLwogCW1zbGVlcCg1KTsKIAorCS8qIFRoZSBQTExzIG5lZWQgdG8gYmUgcmVwcm9ncmFtbWVkIGFmdGVyIHNsZWVwICovCisJdGRhMTAwNDZfaW5pdF9wbGxzKGZlKTsKKwogCS8qIGRvbid0IHJlLXVwbG9hZCB1bmxlc3MgbmVjZXNzYXJ5ICovCiAJaWYgKHRkYTEwMDR4X2NoZWNrX3VwbG9hZF9vayhzdGF0ZSkgPT0gMCkKIAkJcmV0dXJuIDA7CiAKLQkvKiBzZXQgcGFyYW1ldGVycyAqLwotCXRkYTEwMDQ2X2luaXRfcGxscyhmZSk7Ci0KIAlpZiAoc3RhdGUtPmNvbmZpZy0+cmVxdWVzdF9maXJtd2FyZSAhPSBOVUxMKSB7CiAJCS8qIHJlcXVlc3QgdGhlIGZpcm13YXJlLCB0aGlzIHdpbGwgYmxvY2sgdW50aWwgc29tZW9uZSB1cGxvYWRzIGl0ICovCiAJCXByaW50ayhLRVJOX0lORk8gInRkYTEwMDR4OiB3YWl0aW5nIGZvciBmaXJtd2FyZSB1cGxvYWQuLi5cbiIpOwpAQCAtNDg0LDcgKzUyOSw2IEBACiAJCQlyZXR1cm4gcmV0OwogCX0gZWxzZSB7CiAJCS8qIGJvb3QgZnJvbSBmaXJtd2FyZSBlZXByb20gKi8KLQkJLyogSGFjIE5vdGU6IHdlIG1pZ2h0IG5lZWQgdG8gZG8gc29tZSBHUElPIE1hZ2ljIGhlcmUgKi8KIAkJcHJpbnRrKEtFUk5fSU5GTyAidGRhMTAwNHg6IGJvb3RpbmcgZnJvbSBlZXByb21cbiIpOwogCQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzQsIDQsIDQpOwogCQltc2xlZXAoMzAwKTsKQEAgLTYwNiwxMCArNjUwLDkgQEAKIAogCS8vIHRkYSBzZXR1cAogCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDRYX0NPTkZDNCwgMHgyMCwgMCk7IC8vIGRpc2FibGUgRFNQIHdhdGNoZG9nIHRpbWVyCi0JdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDRYX0FVVE8sIDcpOyAvLyBzZWxlY3QgSFAgc3RyZWFtCi0JdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDRYX0NPTkZDMSwgOCk7IC8vIGRpc2FibGUgcHVsc2Uga2lsbGVyCisJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDRYX0FVVE8sIDB4ODcpOyAgICAvLyAxMDAgcHBtIGNyeXN0YWwsIHNlbGVjdCBIUCBzdHJlYW0KKwl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNFhfQ09ORkMxLCA4KTsgICAgICAvLyBkaXNhYmxlIHB1bHNlIGtpbGxlcgogCi0JdGRhMTAwNDZfaW5pdF9wbGxzKGZlKTsKIAlzd2l0Y2ggKHN0YXRlLT5jb25maWctPmFnY19jb25maWcpIHsKIAljYXNlIFREQTEwMDQ2X0FHQ19ERUZBVUxUOgogCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0FHQ19DT05GLCAweDAwKTsgLy8gQUdDIHNldHVwCkBAIC02MjYsMjUgKzY2OSwyMiBAQAogCWNhc2UgVERBMTAwNDZfQUdDX1REQTgyN1g6CiAJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0NPTkYsIDB4MDIpOyAgIC8vIEFHQyBzZXR1cAogCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0FHQ19USFIsIDB4NzApOyAgICAvLyBBR0MgVGhyZXNob2xkCi0JCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX1JFTk9STSwgMHgwRSk7IC8vIEdhaW4gUmVub3JtYWxpemUKLQkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DT05GX1BPTEFSSVRZLCAweDYwKTsgLy8gc2V0IEFHQyBwb2xhcml0aWVzCisJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX1JFTk9STSwgMHgwOCk7IC8vIEdhaW4gUmVub3JtYWxpemUKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DT05GX1BPTEFSSVRZLCAweDZhKTsgLy8gc2V0IEFHQyBwb2xhcml0aWVzCiAJCWJyZWFrOwogCX0KKwl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNFhfQ09ORkFEQzIsIDB4MzgpOwogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORl9UUklTVEFURTEsIDB4NjEpOyAvLyBUdXJuIGJvdGggQUdDIG91dHB1dHMgb24KIAl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0FHQ19UVU5fTUlOLCAwKTsJICAvLyB9CiAJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9BR0NfVFVOX01BWCwgMHhmZik7IC8vIH0gQUdDIG1pbi9tYXggdmFsdWVzCiAJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9BR0NfSUZfTUlOLCAwKTsJICAvLyB9CiAJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9BR0NfSUZfTUFYLCAweGZmKTsgIC8vIH0KLQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0FHQ19HQUlOUywgMSk7IC8vIElGIGdhaW4gMiwgVFVOIGdhaW4gMQorCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0dBSU5TLCAweDEyKTsgLy8gSUYgZ2FpbiAyLCBUVU4gZ2FpbiAxCiAJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DVkJFUl9DVFJMLCAweDFhKTsgLy8gMTBeNiBWQkVSIG1lYXN1cmVtZW50IGJpdHMKIAl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNFhfQ09ORl9UUzEsIDcpOyAvLyBNUEVHMiBpbnRlcmZhY2UgY29uZmlnCiAJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDRYX0NPTkZfVFMyLCAweGMwKTsgLy8gTVBFRzIgaW50ZXJmYWNlIGNvbmZpZwogCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIDB4M2EsIDB4ODAsIHN0YXRlLT5jb25maWctPmludmVydF9vY2xrIDw8IDcpOwogCi0JdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DT05GX1RSSVNUQVRFMiwgMHhlMSk7IC8vIHRyaXN0YXRlIHNldHVwCi0JdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9HUElPX09VVF9TRUwsIDB4Y2MpOyAvLyBHUElPIG91dHB1dCBjb25maWcKLQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0dQSU9fU0VMRUNULCA4KTsgLy8gR1BJTyBzZWxlY3QKLQogCXN0YXRlLT5pbml0aWFsaXNlZCA9IDE7CiAJcmV0dXJuIDA7CiB9CkBAIC02ODYsOSArNzI2LDkgQEAKIAogCS8vIFNldCBzdGFuZGFyZCBwYXJhbXMuLiBvciBwdXQgdGhlbSB0byBhdXRvCiAJaWYgKChmZV9wYXJhbXMtPnUub2ZkbS5jb2RlX3JhdGVfSFAgPT0gRkVDX0FVVE8pIHx8Ci0JICAgIChmZV9wYXJhbXMtPnUub2ZkbS5jb2RlX3JhdGVfTFAgPT0gRkVDX0FVVE8pIHx8Ci0JICAgIChmZV9wYXJhbXMtPnUub2ZkbS5jb25zdGVsbGF0aW9uID09IFFBTV9BVVRPKSB8fAotCSAgICAoZmVfcGFyYW1zLT51Lm9mZG0uaGllcmFyY2h5X2luZm9ybWF0aW9uID09IEhJRVJBUkNIWV9BVVRPKSkgeworCQkoZmVfcGFyYW1zLT51Lm9mZG0uY29kZV9yYXRlX0xQID09IEZFQ19BVVRPKSB8fAorCQkoZmVfcGFyYW1zLT51Lm9mZG0uY29uc3RlbGxhdGlvbiA9PSBRQU1fQVVUTykgfHwKKwkJKGZlX3BhcmFtcy0+dS5vZmRtLmhpZXJhcmNoeV9pbmZvcm1hdGlvbiA9PSBISUVSQVJDSFlfQVVUTykpIHsKIAkJdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNFhfQVVUTywgMSwgMSk7CS8vIGVuYWJsZSBhdXRvCiAJCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDRYX0lOX0NPTkYxLCAweDAzLCAwKTsJLy8gdHVybiBvZmYgY29uc3RlbGxhdGlvbiBiaXRzCiAJCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDRYX0lOX0NPTkYxLCAweDYwLCAwKTsJLy8gdHVybiBvZmYgaGllcmFyY2h5IGJpdHMKQEAgLTg1MSw2ICs4OTEsNyBAQAogc3RhdGljIGludCB0ZGExMDA0eF9nZXRfZmUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZmVfcGFyYW1zKQogewogCXN0cnVjdCB0ZGExMDA0eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwogCWRwcmludGsoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCiAJLy8gaW52ZXJzaW9uIHN0YXR1cwpAQCAtODc1LDE2ICs5MTYsMTggQEAKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwotCiAJY2FzZSBUREExMDA0WF9ERU1PRF9UREExMDA0NjoKIAkJc3dpdGNoICh0ZGExMDA0eF9yZWFkX2J5dGUoc3RhdGUsIFREQTEwMDQ2SF9USU1FX1dSRUYxKSkgewotCQljYXNlIDB4NjA6CisJCWNhc2UgMHg1YzoKKwkJY2FzZSAweDU0OgogCQkJZmVfcGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoID0gQkFORFdJRFRIXzhfTUhaOwogCQkJYnJlYWs7Ci0JCWNhc2UgMHg2ZToKKwkJY2FzZSAweDZhOgorCQljYXNlIDB4NjA6CiAJCQlmZV9wYXJhbXMtPnUub2ZkbS5iYW5kd2lkdGggPSBCQU5EV0lEVEhfN19NSFo7CiAJCQlicmVhazsKLQkJY2FzZSAweDgwOgorCQljYXNlIDB4N2I6CisJCWNhc2UgMHg3MDoKIAkJCWZlX3BhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCA9IEJBTkRXSURUSF82X01IWjsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9LY29uZmlnCmluZGV4IGYwMjg0MmIuLjg0ZjhmOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9LY29uZmlnCkBAIC04LDcgKzgsNyBAQAogCSAgU3VwcG9ydCBmb3IgUENJIGNhcmRzIGJhc2VkIG9uIHRoZSBQbHV0bzIgRlBHQSBsaWtlIHRoZSBTYXRlbGNvCiAJICBFYXN5d2F0Y2ggTW9iaWxlIFRlcnJlc3RyaWFsIERWQi1UIFJlY2VpdmVyLgogCi0gICAgICAgICAgU2luY2UgdGhlc2UgY2FyZHMgaGF2ZSBubyBNUEVHIGRlY29kZXIgb25ib2FyZCwgdGhleSB0cmFuc21pdAorCSAgU2luY2UgdGhlc2UgY2FyZHMgaGF2ZSBubyBNUEVHIGRlY29kZXIgb25ib2FyZCwgdGhleSB0cmFuc21pdAogCSAgb25seSBjb21wcmVzc2VkIE1QRUcgZGF0YSBvdmVyIHRoZSBQQ0kgYnVzLCBzbyB5b3UgbmVlZAogCSAgYW4gZXh0ZXJuYWwgc29mdHdhcmUgZGVjb2RlciB0byB3YXRjaCBUViBvbiB5b3VyIGNvbXB1dGVyLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvcGx1dG8yLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvcGx1dG8yLmMKaW5kZXggYmJlYmQxYy4uMWM1MzE2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvcGx1dG8yL3BsdXRvMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9wbHV0bzIuYwpAQCAtNTg0LDExICs1ODQsMTAgQEAKIAlzdHJ1Y3QgZG14X2RlbXV4ICpkbXg7CiAJaW50IHJldCA9IC1FTk9NRU07CiAKLQlwbHV0byA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbHV0byksIEdGUF9LRVJORUwpOworCXBsdXRvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBsdXRvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwbHV0bykKIAkJZ290byBvdXQ7CiAKLQltZW1zZXQocGx1dG8sIDAsIHNpemVvZihzdHJ1Y3QgcGx1dG8pKTsKIAlwbHV0by0+cGRldiA9IHBkZXY7CiAKIAlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9LY29uZmlnCmluZGV4IGZhNTAzNGE5Li41YjJhYWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL0tjb25maWcKQEAgLTE4LDkgKzE4LDEwIEBACiAJICBUaGlzIGRyaXZlciBvbmx5IHN1cHBvcnRzIHRoZSBmdWxsZmVhdHVyZWQgY2FyZHMgd2l0aAogCSAgb25ib2FyZCBNUEVHMiBkZWNvZGVyLgogCi0gICAgICAgICAgVGhpcyBkcml2ZXIgbmVlZHMgYW4gZXh0ZXJuYWwgZmlybXdhcmUuIFBsZWFzZSB1c2UgdGhlIHNjcmlwdAotICAgICAgICAgICI8a2VybmVsZGlyPi9Eb2N1bWVudGF0aW9uL2R2Yi9nZXRfZHZiX2Zpcm13YXJlIGF2NzExMCIgdG8KLSAgICAgICAgICBkb3dubG9hZC9leHRyYWN0IGl0LCBhbmQgdGhlbiBjb3B5IGl0IHRvIC91c3IvbGliL2hvdHBsdWcvZmlybXdhcmUuCisJICBUaGlzIGRyaXZlciBuZWVkcyBhbiBleHRlcm5hbCBmaXJtd2FyZS4gUGxlYXNlIHVzZSB0aGUgc2NyaXB0CisJICAiPGtlcm5lbGRpcj4vRG9jdW1lbnRhdGlvbi9kdmIvZ2V0X2R2Yl9maXJtd2FyZSBhdjcxMTAiIHRvCisJICBkb3dubG9hZC9leHRyYWN0IGl0LCBhbmQgdGhlbiBjb3B5IGl0IHRvIC91c3IvbGliL2hvdHBsdWcvZmlybXdhcmUKKwkgIG9yIC9saWIvZmlybXdhcmUgKGRlcGVuZGluZyBvbiBjb25maWd1cmF0aW9uIG9mIGZpcm13YXJlIGhvdHBsdWcpLgogCiAJICBTYXkgWSBpZiB5b3Ugb3duIHN1Y2ggYSBjYXJkIGFuZCB3YW50IHRvIHVzZSBpdC4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9NYWtlZmlsZQppbmRleCA4MjVhYjFjLi5hNjkwNzMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9NYWtlZmlsZQpAQCAtMTYsNyArMTYsNyBAQAogaG9zdHByb2dzLXkJOj0gZmR1bXAKIAogaWZkZWYgQ09ORklHX0RWQl9BVjcxMTBfRklSTVdBUkUKLSQob2JqKS9hdjcxMTAubzogJChvYmopL2ZkdW1wICQob2JqKS9hdjcxMTBfZmlybS5oIAorJChvYmopL2F2NzExMC5vOiAkKG9iaikvZmR1bXAgJChvYmopL2F2NzExMF9maXJtLmgKIAogJChvYmopL2F2NzExMF9maXJtLmg6CiAJJChvYmopL2ZkdW1wICQoQ09ORklHX0RWQl9BVjcxMTBfRklSTVdBUkVfRklMRSkgZHZiX3R0cGNpX2Z3ICRACmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5jCmluZGV4IDdkYWU5MWUuLjI3NDk0OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5jCkBAIC04MSw3ICs4MSw3IEBACiBzdGF0aWMgaW50IGh3X3NlY3Rpb25zOwogc3RhdGljIGludCByZ2Jfb247CiBzdGF0aWMgaW50IHZvbHVtZSA9IDI1NTsKLXN0YXRpYyBpbnQgYnVkZ2V0cGF0Y2ggPSAwOworc3RhdGljIGludCBidWRnZXRwYXRjaDsKIAogbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBhdjcxMTBfZGVidWcsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZGVidWcgbGV2ZWwgKGJpdG1hc2ssIGRlZmF1bHQgMCkiKTsKQEAgLTEwMyw3ICsxMDMsNyBAQAogCiBzdGF0aWMgdm9pZCByZXN0YXJ0X2ZlZWRzKHN0cnVjdCBhdjcxMTAgKmF2NzExMCk7CiAKLXN0YXRpYyBpbnQgYXY3MTEwX251bSA9IDA7CitzdGF0aWMgaW50IGF2NzExMF9udW07CiAKICNkZWZpbmUgRkVfRlVOQ19PVkVSUklERShmZV9mdW5jLCBhdjcxMTBfY29weSwgYXY3MTEwX2Z1bmMpIFwKIHtcCkBAIC0xMzMsNyArMTMzLDEzIEBACiAJLyogcmVtYWluaW5nIGluaXRzIGFjY29yZGluZyB0byBjYXJkIGFuZCBmcm9udGVuZCB0eXBlICovCiAJYXY3MTEwLT5hbmFsb2dfdHVuZXJfZmxhZ3MgPSAwOwogCWF2NzExMC0+Y3VycmVudF9pbnB1dCA9IDA7Ci0JaWYgKGkyY193cml0ZXJlZyhhdjcxMTAsIDB4MjAsIDB4MDAsIDB4MDApID09IDEpIHsKKwlpZiAoZGV2LT5wY2ktPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxM2MyICYmIGRldi0+cGNpLT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MDAwYSkgeworCQlwcmludGsoImR2Yi10dHBjaTogTVNQMzQxNSBhdWRpbyBEQUMgQCBjYXJkICVkXG4iLAorCQkJYXY3MTEwLT5kdmJfYWRhcHRlci5udW0pOworCQlhdjcxMTAtPmFkYWNfdHlwZSA9IERWQl9BREFDX01TUDM0eDU7CisJCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX0FVRElPREFDLCBBRFN3aXRjaCwgMSwgMCk7IC8vIFNQRElGIG9uCisJfQorCWVsc2UgaWYgKGkyY193cml0ZXJlZyhhdjcxMTAsIDB4MjAsIDB4MDAsIDB4MDApID09IDEpIHsKIAkJcHJpbnRrICgiZHZiLXR0cGNpOiBDcnlzdGFsIGF1ZGlvIERBQyBAIGNhcmQgJWQgZGV0ZWN0ZWRcbiIsCiAJCQlhdjcxMTAtPmR2Yl9hZGFwdGVyLm51bSk7CiAJCWF2NzExMC0+YWRhY190eXBlID0gRFZCX0FEQUNfQ1JZU1RBTDsKQEAgLTE1NiwxMCArMTYyLDEwIEBACiAJZWxzZSB7CiAJCWF2NzExMC0+YWRhY190eXBlID0gYWRhYzsKIAkJcHJpbnRrKCJkdmItdHRwY2k6IGFkYWMgdHlwZSBzZXQgdG8gJWQgQCBjYXJkICVkXG4iLAotCQkJYXY3MTEwLT5kdmJfYWRhcHRlci5udW0sIGF2NzExMC0+YWRhY190eXBlKTsKKwkJCWF2NzExMC0+YWRhY190eXBlLCBhdjcxMTAtPmR2Yl9hZGFwdGVyLm51bSk7CiAJfQogCi0JaWYgKGF2NzExMC0+YWRhY190eXBlID09IERWQl9BREFDX05PTkUgfHwgYXY3MTEwLT5hZGFjX3R5cGUgPT0gRFZCX0FEQUNfTVNQKSB7CisJaWYgKGF2NzExMC0+YWRhY190eXBlID09IERWQl9BREFDX05PTkUgfHwgYXY3MTEwLT5hZGFjX3R5cGUgPT0gRFZCX0FEQUNfTVNQMzR4MCkgewogCQkvLyBzd2l0Y2ggRFZCIFNDQVJUIG9uCiAJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX0FVRElPREFDLCBNYWluU3dpdGNoLCAxLCAwKTsKIAkJaWYgKHJldCA8IDApCkBAIC0xOTAsMTkgKzE5NiwxNyBAQAogCiAJYXY3MTEwX2Jvb3Rhcm0oYXY3MTEwKTsKIAltc2xlZXAoMTAwKTsKKworCWluaXRfYXY3MTEwX2F2KGF2NzExMCk7CisKKwkvKiBjYXJkLXNwZWNpZmljIHJlY292ZXJ5ICovCisJaWYgKGF2NzExMC0+cmVjb3ZlcikKKwkJYXY3MTEwLT5yZWNvdmVyKGF2NzExMCk7CisKIAlyZXN0YXJ0X2ZlZWRzKGF2NzExMCk7CiAJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUElERklMVEVSLCBTZXRJUiwgMSwgYXY3MTEwLT5pcl9jb25maWcpOwogfQogCi1zdGF0aWMgdm9pZCBhcm1fZXJyb3Ioc3RydWN0IGF2NzExMCAqYXY3MTEwKQotewotCWRwcmludGsoNCwgIiVwXG4iLGF2NzExMCk7Ci0KLQlhdjcxMTAtPmFybV9lcnJvcnMrKzsKLQlhdjcxMTAtPmFybV9yZWFkeSA9IDA7Ci0JcmVjb3Zlcl9hcm0oYXY3MTEwKTsKLX0KLQogc3RhdGljIHZvaWQgYXY3MTEwX2FybV9zeW5jKHN0cnVjdCBhdjcxMTAgKmF2NzExMCkKIHsKIAlhdjcxMTAtPmFybV9ybW1vZCA9IDE7CkBAIC0yNDAsMjYgKzI0NCwyMiBAQAogCiAJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmF2NzExMC0+ZGNvbWxvY2spKQogCQkJYnJlYWs7Ci0KIAkJbmV3bG9vcHMgPSByZGViaShhdjcxMTAsIERFQklOT1NXQVAsIFNUQVRVU19MT09QUywgMCwgMik7CiAJCXVwKCZhdjcxMTAtPmRjb21sb2NrKTsKIAotCQlpZiAobmV3bG9vcHMgPT0gYXY3MTEwLT5hcm1fbG9vcHMpIHsKKwkJaWYgKG5ld2xvb3BzID09IGF2NzExMC0+YXJtX2xvb3BzIHx8IGF2NzExMC0+YXJtX2Vycm9ycyA+IDMpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiZHZiLXR0cGNpOiBBUk0gY3Jhc2hlZCBAIGNhcmQgJWRcbiIsCiAJCQkgICAgICAgYXY3MTEwLT5kdmJfYWRhcHRlci5udW0pOwogCi0JCQlhcm1fZXJyb3IoYXY3MTEwKTsKLQkJCWF2NzcxMF9zZXRfdmlkZW9fbW9kZShhdjcxMTAsIHZpZG1vZGUpOwotCi0JCQlpbml0X2F2NzExMF9hdihhdjcxMTApOworCQkJcmVjb3Zlcl9hcm0oYXY3MTEwKTsKIAogCQkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYXY3MTEwLT5kY29tbG9jaykpCiAJCQkJYnJlYWs7Ci0KIAkJCW5ld2xvb3BzID0gcmRlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBTVEFUVVNfTE9PUFMsIDAsIDIpIC0gMTsKIAkJCXVwKCZhdjcxMTAtPmRjb21sb2NrKTsKIAkJfQogCQlhdjcxMTAtPmFybV9sb29wcyA9IG5ld2xvb3BzOworCQlhdjcxMTAtPmFybV9lcnJvcnMgPSAwOwogCX0KIAogCWF2NzExMC0+YXJtX3RocmVhZCA9IE5VTEw7CkBAIC01MTAsMTAgKzUxMCw2IEBACiAJCWl3ZGViaShhdjcxMTAsIERFQklOT1NXQVAsIFJYX0JVRkYsIDAsIDIpOwogCiAJCWF2NzExMC0+dmlkZW9fc2l6ZS5oID0gaF9hciAmIDB4ZmZmOwotCQlkcHJpbnRrKDgsICJHUElPMCBpcnE6IERBVEFfTVBFR19WSURFT19FVkVOVDogdy9oL2FyID0gJXUvJXUvJXVcbiIsCi0JCQlhdjcxMTAtPnZpZGVvX3NpemUudywKLQkJCWF2NzExMC0+dmlkZW9fc2l6ZS5oLAotCQkJYXY3MTEwLT52aWRlb19zaXplLmFzcGVjdF9yYXRpbyk7CiAKIAkJZXZlbnQudHlwZSA9IFZJREVPX0VWRU5UX1NJWkVfQ0hBTkdFRDsKIAkJZXZlbnQudS5zaXplLncgPSBhdjcxMTAtPnZpZGVvX3NpemUudzsKQEAgLTUzNSw2ICs1MzEsMTEgQEAKIAkJCWV2ZW50LnUuc2l6ZS5hc3BlY3RfcmF0aW8gPSBWSURFT19GT1JNQVRfNF8zOwogCQkJYXY3MTEwLT52aWRlb3N0YXRlLnZpZGVvX2Zvcm1hdCA9IFZJREVPX0ZPUk1BVF80XzM7CiAJCX0KKworCQlkcHJpbnRrKDgsICJHUElPMCBpcnE6IERBVEFfTVBFR19WSURFT19FVkVOVDogdy9oL2FyID0gJXUvJXUvJXVcbiIsCisJCQlhdjcxMTAtPnZpZGVvX3NpemUudywgYXY3MTEwLT52aWRlb19zaXplLmgsCisJCQlhdjcxMTAtPnZpZGVvX3NpemUuYXNwZWN0X3JhdGlvKTsKKwogCQlkdmJfdmlkZW9fYWRkX2V2ZW50KGF2NzExMCwgJmV2ZW50KTsKIAkJYnJlYWs7CiAJfQpAQCAtNzE0LDYgKzcxNSw4IEBACiBzdGF0aWMgaW5saW5lIGludCBTZXRQSURzKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTE2IHZwaWQsIHUxNiBhcGlkLCB1MTYgdHRwaWQsCiAJCQkgIHUxNiBzdWJwaWQsIHUxNiBwY3JwaWQpCiB7CisJdTE2IGFmbGFncyA9IDA7CisKIAlkcHJpbnRrKDQsICIlcFxuIiwgYXY3MTEwKTsKIAogCWlmICh2cGlkID09IDB4MWZmZiB8fCBhcGlkID09IDB4MWZmZiB8fApAQCAtNzI1LDggKzcyOCwxMSBAQAogCQlhdjcxMTAtPnBpZHNbRE1YX1BFU19QQ1JdID0gMDsKIAl9CiAKLQlyZXR1cm4gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUElERklMVEVSLCBNdWx0aVBJRCwgNSwKLQkJCSAgICAgcGNycGlkLCB2cGlkLCBhcGlkLCB0dHBpZCwgc3VicGlkKTsKKwlpZiAoYXY3MTEwLT5hdWRpb3N0YXRlLmJ5cGFzc19tb2RlKQorCQlhZmxhZ3MgfD0gMHg4MDAwOworCisJcmV0dXJuIGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1BJREZJTFRFUiwgTXVsdGlQSUQsIDYsCisJCQkgICAgIHBjcnBpZCwgdnBpZCwgYXBpZCwgdHRwaWQsIHN1YnBpZCwgYWZsYWdzKTsKIH0KIAogaW50IENoYW5nZVBJRHMoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MTYgdnBpZCwgdTE2IGFwaWQsIHUxNiB0dHBpZCwKQEAgLTEwNDMsNyArMTA0OSw3IEBACiAJc3RydWN0IGR2Yl9kZW11eCAqZHZiZG14ID0gJmF2NzExMC0+ZGVtdXg7CiAJc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkOwogCWludCBtb2RlOwotCWludCBpOworCWludCBpLCBqOwogCiAJZHByaW50ayg0LCAiJXBcbiIsIGF2NzExMCk7CiAKQEAgLTEwNTEsMTAgKzEwNTcsMjEgQEAKIAlhdjcxMTAtPnBsYXlpbmcgPSAwOwogCWF2NzExMC0+cmVjX21vZGUgPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IGR2YmRteC0+ZmlsdGVybnVtOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgZHZiZG14LT5mZWVkbnVtOyBpKyspIHsKIAkJZmVlZCA9ICZkdmJkbXgtPmZlZWRbaV07Ci0JCWlmIChmZWVkLT5zdGF0ZSA9PSBETVhfU1RBVEVfR08pCisJCWlmIChmZWVkLT5zdGF0ZSA9PSBETVhfU1RBVEVfR08pIHsKKwkJCWlmIChmZWVkLT50eXBlID09IERNWF9UWVBFX1NFQykgeworCQkJCWZvciAoaiA9IDA7IGogPCBkdmJkbXgtPmZpbHRlcm51bTsgaisrKSB7CisJCQkJCWlmIChkdmJkbXgtPmZpbHRlcltqXS50eXBlICE9IERNWF9UWVBFX1NFQykKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlpZiAoZHZiZG14LT5maWx0ZXJbal0uZmlsdGVyLnBhcmVudCAhPSAmZmVlZC0+ZmVlZC5zZWMpCisJCQkJCQljb250aW51ZTsKKwkJCQkJaWYgKGR2YmRteC0+ZmlsdGVyW2pdLnN0YXRlID09IERNWF9TVEFURV9HTykKKwkJCQkJCWR2YmRteC0+ZmlsdGVyW2pdLnN0YXRlID0gRE1YX1NUQVRFX1JFQURZOworCQkJCX0KKwkJCX0KIAkJCWF2NzExMF9zdGFydF9mZWVkKGZlZWQpOworCQl9CiAJfQogCiAJaWYgKG1vZGUpCkBAIC0xNDgzLDkgKzE1MDAsOSBAQAogCQlpZiAocmV0ID09IC1FTk9FTlQpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiZHZiLXR0cGNpOiBjb3VsZCBub3QgbG9hZCBmaXJtd2FyZSwiCiAJCQkgICAgICAgIiBmaWxlIG5vdCBmb3VuZDogZHZiLXR0cGNpLTAxLmZ3XG4iKTsKLQkJCXByaW50ayhLRVJOX0VSUiAiZHZiLXR0cGNpOiB1c3VhbGx5IHRoaXMgc2hvdWxkIGJlIGluIgotCQkJICAgICAgICIgL3Vzci9saWIvaG90cGx1Zy9maXJtd2FyZVxuIik7Ci0JCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogYW5kIGNhbiBiZSBkb3dubG9hZGVkIGhlcmUiCisJCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogdXN1YWxseSB0aGlzIHNob3VsZCBiZSBpbiAiCisJCQkgICAgICAgIi91c3IvbGliL2hvdHBsdWcvZmlybXdhcmUgb3IgL2xpYi9maXJtd2FyZVxuIik7CisJCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogYW5kIGNhbiBiZSBkb3dubG9hZGVkIGZyb20iCiAJCQkgICAgICAgIiBodHRwOi8vd3d3LmxpbnV4dHYub3JnL2Rvd25sb2FkL2R2Yi9maXJtd2FyZS9cbiIpOwogCQl9IGVsc2UKIAkJCXByaW50ayhLRVJOX0VSUiAiZHZiLXR0cGNpOiBjYW5ub3QgcmVxdWVzdCBmaXJtd2FyZSIKQEAgLTIxMTAsOCArMjEyNywxMCBAQAogCXN0cnVjdCBhdjcxMTAqIGF2NzExMCA9IGZlLT5kdmItPnByaXY7CiAKIAlpbnQgcmV0ID0gYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgMCk7Ci0JaWYgKCFyZXQpCisJaWYgKCFyZXQpIHsKKwkJYXY3MTEwLT5zYXZlZF9mZV9wYXJhbXMgPSAqcGFyYW1zOwogCQlyZXQgPSBhdjcxMTAtPmZlX3NldF9mcm9udGVuZChmZSwgcGFyYW1zKTsKKwl9CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjE1Myw4ICsyMTcyLDEwIEBACiAJc3RydWN0IGF2NzExMCogYXY3MTEwID0gZmUtPmR2Yi0+cHJpdjsKIAogCWludCByZXQgPSBhdjcxMTBfZmVfbG9ja19maXgoYXY3MTEwLCAwKTsKLQlpZiAoIXJldCkKKwlpZiAoIXJldCkgeworCQlhdjcxMTAtPnNhdmVkX21hc3Rlcl9jbWQgPSAqY21kOwogCQlyZXQgPSBhdjcxMTAtPmZlX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQoZmUsIGNtZCk7CisJfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIxNjMsOCArMjE4NCwxMCBAQAogCXN0cnVjdCBhdjcxMTAqIGF2NzExMCA9IGZlLT5kdmItPnByaXY7CiAKIAlpbnQgcmV0ID0gYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgMCk7Ci0JaWYgKCFyZXQpCisJaWYgKCFyZXQpIHsKKwkJYXY3MTEwLT5zYXZlZF9taW5pY21kID0gbWluaWNtZDsKIAkJcmV0ID0gYXY3MTEwLT5mZV9kaXNlcWNfc2VuZF9idXJzdChmZSwgbWluaWNtZCk7CisJfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIxNzMsOCArMjE5NiwxMCBAQAogCXN0cnVjdCBhdjcxMTAqIGF2NzExMCA9IGZlLT5kdmItPnByaXY7CiAKIAlpbnQgcmV0ID0gYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgMCk7Ci0JaWYgKCFyZXQpCisJaWYgKCFyZXQpIHsKKwkJYXY3MTEwLT5zYXZlZF90b25lID0gdG9uZTsKIAkJcmV0ID0gYXY3MTEwLT5mZV9zZXRfdG9uZShmZSwgdG9uZSk7CisJfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIxODMsMTIgKzIyMDgsMTQgQEAKIAlzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAgPSBmZS0+ZHZiLT5wcml2OwogCiAJaW50IHJldCA9IGF2NzExMF9mZV9sb2NrX2ZpeChhdjcxMTAsIDApOwotCWlmICghcmV0KQorCWlmICghcmV0KSB7CisJCWF2NzExMC0+c2F2ZWRfdm9sdGFnZSA9IHZvbHRhZ2U7CiAJCXJldCA9IGF2NzExMC0+ZmVfc2V0X3ZvbHRhZ2UoZmUsIHZvbHRhZ2UpOworCX0KIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGF2NzExMF9mZV9kaXNobmV0d29ya19zZW5kX2xlZ2FjeV9jb21tYW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1bnNpZ25lZCBpbnQgY21kKQorc3RhdGljIGludCBhdjcxMTBfZmVfZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdW5zaWduZWQgbG9uZyBjbWQpCiB7CiAJc3RydWN0IGF2NzExMCogYXY3MTEwID0gZmUtPmR2Yi0+cHJpdjsKIApAQCAtMjE5OCw2ICsyMjI1LDIzIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgZHZiX3NfcmVjb3ZlcihzdHJ1Y3QgYXY3MTEwKiBhdjcxMTApCit7CisJYXY3MTEwX2ZlX2luaXQoYXY3MTEwLT5mZSk7CisKKwlhdjcxMTBfZmVfc2V0X3ZvbHRhZ2UoYXY3MTEwLT5mZSwgYXY3MTEwLT5zYXZlZF92b2x0YWdlKTsKKwlpZiAoYXY3MTEwLT5zYXZlZF9tYXN0ZXJfY21kLm1zZ19sZW4pIHsKKwkJbXNsZWVwKDIwKTsKKwkJYXY3MTEwX2ZlX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQoYXY3MTEwLT5mZSwgJmF2NzExMC0+c2F2ZWRfbWFzdGVyX2NtZCk7CisJfQorCW1zbGVlcCgyMCk7CisJYXY3MTEwX2ZlX2Rpc2VxY19zZW5kX2J1cnN0KGF2NzExMC0+ZmUsIGF2NzExMC0+c2F2ZWRfbWluaWNtZCk7CisJbXNsZWVwKDIwKTsKKwlhdjcxMTBfZmVfc2V0X3RvbmUoYXY3MTEwLT5mZSwgYXY3MTEwLT5zYXZlZF90b25lKTsKKworCWF2NzExMF9mZV9zZXRfZnJvbnRlbmQoYXY3MTEwLT5mZSwgJmF2NzExMC0+c2F2ZWRfZmVfcGFyYW1zKTsKK30KKwogc3RhdGljIHU4IHJlYWRfcHdtKHN0cnVjdCBhdjcxMTAqIGF2NzExMCkKIHsKIAl1OCBiID0gMHhmZjsKQEAgLTIyMzUsNiArMjI3OSw3IEBACiAJCQkJYXY3MTEwLT5mZS0+b3BzLT5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gYXY3MTEwX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQ7CiAJCQkJYXY3MTEwLT5mZS0+b3BzLT5kaXNlcWNfc2VuZF9idXJzdCA9IGF2NzExMF9kaXNlcWNfc2VuZF9idXJzdDsKIAkJCQlhdjcxMTAtPmZlLT5vcHMtPnNldF90b25lID0gYXY3MTEwX3NldF90b25lOworCQkJCWF2NzExMC0+cmVjb3ZlciA9IGR2Yl9zX3JlY292ZXI7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTIyNDQsMTUgKzIyODksMTcgQEAKIAkJCQlhdjcxMTAtPmZlLT5vcHMtPmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBhdjcxMTBfZGlzZXFjX3NlbmRfbWFzdGVyX2NtZDsKIAkJCQlhdjcxMTAtPmZlLT5vcHMtPmRpc2VxY19zZW5kX2J1cnN0ID0gYXY3MTEwX2Rpc2VxY19zZW5kX2J1cnN0OwogCQkJCWF2NzExMC0+ZmUtPm9wcy0+c2V0X3RvbmUgPSBhdjcxMTBfc2V0X3RvbmU7CisJCQkJYXY3MTEwLT5yZWNvdmVyID0gZHZiX3NfcmVjb3ZlcjsKIAkJCQlicmVhazsKIAkJCX0KIAogCQkJLy8gVHJ5IHRoZSBncnVuZGlnIDI5NTA0LTQ1MQotCQkgICAgICAgIGF2NzExMC0+ZmUgPSB0ZGE4MDgzX2F0dGFjaCgmZ3J1bmRpZ18yOTUwNF80NTFfY29uZmlnLCAmYXY3MTEwLT5pMmNfYWRhcCk7CisJCQlhdjcxMTAtPmZlID0gdGRhODA4M19hdHRhY2goJmdydW5kaWdfMjk1MDRfNDUxX2NvbmZpZywgJmF2NzExMC0+aTJjX2FkYXApOwogCQkJaWYgKGF2NzExMC0+ZmUpIHsKIAkJCQlhdjcxMTAtPmZlLT5vcHMtPmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBhdjcxMTBfZGlzZXFjX3NlbmRfbWFzdGVyX2NtZDsKIAkJCQlhdjcxMTAtPmZlLT5vcHMtPmRpc2VxY19zZW5kX2J1cnN0ID0gYXY3MTEwX2Rpc2VxY19zZW5kX2J1cnN0OwogCQkJCWF2NzExMC0+ZmUtPm9wcy0+c2V0X3RvbmUgPSBhdjcxMTBfc2V0X3RvbmU7CisJCQkJYXY3MTEwLT5yZWNvdmVyID0gZHZiX3NfcmVjb3ZlcjsKIAkJCQlicmVhazsKIAkJCX0KIApAQCAtMjI3NCwxMiArMjMyMSwxMiBAQAogCQljYXNlIDB4MDAwMTogLy8gSGF1cHBhdWdlL1RUIE5leHVzLVQgcHJlbWl1bSByZXYxLlgKIAogCQkJLy8gQUxQUyBURExCNwotCQkgICAgICAgIGF2NzExMC0+ZmUgPSBzcDg4NzBfYXR0YWNoKCZhbHBzX3RkbGI3X2NvbmZpZywgJmF2NzExMC0+aTJjX2FkYXApOworCQkJYXY3MTEwLT5mZSA9IHNwODg3MF9hdHRhY2goJmFscHNfdGRsYjdfY29uZmlnLCAmYXY3MTEwLT5pMmNfYWRhcCk7CiAJCQlicmVhazsKIAogCQljYXNlIDB4MDAwMjogLy8gSGF1cHBhdWdlL1RUIERWQi1DIHByZW1pdW0gcmV2Mi5YCiAKLQkJICAgICAgICBhdjcxMTAtPmZlID0gdmVzMTgyMF9hdHRhY2goJmFscHNfdGRiZTJfY29uZmlnLCAmYXY3MTEwLT5pMmNfYWRhcCwgcmVhZF9wd20oYXY3MTEwKSk7CisJCQlhdjcxMTAtPmZlID0gdmVzMTgyMF9hdHRhY2goJmFscHNfdGRiZTJfY29uZmlnLCAmYXY3MTEwLT5pMmNfYWRhcCwgcmVhZF9wd20oYXY3MTEwKSk7CiAJCQlicmVhazsKIAogCQljYXNlIDB4MDAwNjogLyogRnVqaXRzdS1TaWVtZW5zIERWQi1TIHJldiAxLjYgKi8KQEAgLTIyODksNiArMjMzNiw3IEBACiAJCQkJYXY3MTEwLT5mZS0+b3BzLT5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gYXY3MTEwX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQ7CiAJCQkJYXY3MTEwLT5mZS0+b3BzLT5kaXNlcWNfc2VuZF9idXJzdCA9IGF2NzExMF9kaXNlcWNfc2VuZF9idXJzdDsKIAkJCQlhdjcxMTAtPmZlLT5vcHMtPnNldF90b25lID0gYXY3MTEwX3NldF90b25lOworCQkJCWF2NzExMC0+cmVjb3ZlciA9IGR2Yl9zX3JlY292ZXI7CiAJCQl9CiAJCQlicmVhazsKIApAQCAtMjMxNCw4ICsyMzYyLDExIEBACiAJCWNhc2UgMHgwMDBFOiAvKiBIYXVwcGF1Z2UvVFQgTmV4dXMtUyByZXYgMi4zICovCiAJCQkvKiBBTFBTIEJTQkUxICovCiAJCQlhdjcxMTAtPmZlID0gc3R2MDI5OV9hdHRhY2goJmFscHNfYnNiZTFfY29uZmlnLCAmYXY3MTEwLT5pMmNfYWRhcCk7Ci0JCQlpZiAoYXY3MTEwLT5mZSkKKwkJCWlmIChhdjcxMTAtPmZlKSB7CiAJCQkJYXY3MTEwLT5mZS0+b3BzLT5zZXRfdm9sdGFnZSA9IGxuYnAyMV9zZXRfdm9sdGFnZTsKKwkJCQlhdjcxMTAtPmZlLT5vcHMtPmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQgPSBOVUxMOworCQkJCWF2NzExMC0+cmVjb3ZlciA9IGR2Yl9zX3JlY292ZXI7CisJCQl9CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTI1MTQsMTQgKzI1NjUsMTIgQEAKIAl9CiAKIAkvKiBwcmVwYXJlIHRoZSBhdjcxMTAgZGV2aWNlIHN0cnVjdCAqLwotCWF2NzExMCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdjcxMTApLCBHRlBfS0VSTkVMKTsKKwlhdjcxMTAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXY3MTEwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhdjcxMTApIHsKIAkJZHByaW50aygxLCAib3V0IG9mIG1lbW9yeVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCW1lbXNldChhdjcxMTAsIDAsIHNpemVvZihzdHJ1Y3QgYXY3MTEwKSk7Ci0KIAlhdjcxMTAtPmNhcmRfbmFtZSA9IChjaGFyKikgcGNpX2V4dC0+ZXh0X3ByaXY7CiAJYXY3MTEwLT5kZXYgPSBkZXY7CiAJZGV2LT5leHRfcHJpdiA9IGF2NzExMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmgKaW5kZXggY2NlMDBlZi4uNmVhMzBkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmgKQEAgLTk4LDcgKzk4LDggQEAKIAlpbnQgYWRhY190eXBlOwkgICAgICAgLyogYXVkaW8gREFDIHR5cGUgKi8KICNkZWZpbmUgRFZCX0FEQUNfVEkJICAwCiAjZGVmaW5lIERWQl9BREFDX0NSWVNUQUwgIDEKLSNkZWZpbmUgRFZCX0FEQUNfTVNQCSAgMgorI2RlZmluZSBEVkJfQURBQ19NU1AzNHgwICAyCisjZGVmaW5lIERWQl9BREFDX01TUDM0eDUgIDMKICNkZWZpbmUgRFZCX0FEQUNfTk9ORQkgLTEKIAogCkBAIC0yMjgsNiArMjI5LDkgQEAKIAlzdHJ1Y3QgZHZiX3ZpZGVvX2V2ZW50cyAgdmlkZW9fZXZlbnRzOwogCXZpZGVvX3NpemVfdAkJIHZpZGVvX3NpemU7CiAKKwl1MTYJCQl3c3NNb2RlOworCXUxNgkJCXdzc0RhdGE7CisKIAl1MzIJCQlpcl9jb25maWc7CiAJdTMyCQkJaXJfY29tbWFuZDsKIAl2b2lkCQkJKCppcl9oYW5kbGVyKShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUzMiBpcmNvbSk7CkBAIC0yNDUsNiArMjQ5LDE1IEBACiAKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZTsKIAlmZV9zdGF0dXNfdCBmZV9zdGF0dXM7CisKKwkvKiBjcmFzaCByZWNvdmVyeSAqLworCXZvaWQJCQkJKCpyZWNvdmVyKShzdHJ1Y3QgYXY3MTEwKiBhdjcxMTApOworCXN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycwlzYXZlZF9mZV9wYXJhbXM7CisJZmVfc2VjX3ZvbHRhZ2VfdAkJc2F2ZWRfdm9sdGFnZTsKKwlmZV9zZWNfdG9uZV9tb2RlX3QJCXNhdmVkX3RvbmU7CisJc3RydWN0IGR2Yl9kaXNlcWNfbWFzdGVyX2NtZAlzYXZlZF9tYXN0ZXJfY21kOworCWZlX3NlY19taW5pX2NtZF90CQlzYXZlZF9taW5pY21kOworCiAJaW50ICgqZmVfaW5pdCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOwogCWludCAoKmZlX3JlYWRfc3RhdHVzKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc3RhdHVzX3QqIHN0YXR1cyk7CiAJaW50ICgqZmVfZGlzZXFjX3Jlc2V0X292ZXJsb2FkKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7CkBAIC0yNTIsNyArMjY1LDcgQEAKIAlpbnQgKCpmZV9kaXNlcWNfc2VuZF9idXJzdCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY19taW5pX2NtZF90IG1pbmljbWQpOwogCWludCAoKmZlX3NldF90b25lKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3RvbmVfbW9kZV90IHRvbmUpOwogCWludCAoKmZlX3NldF92b2x0YWdlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKTsKLQlpbnQgKCpmZV9kaXNobmV0d29ya19zZW5kX2xlZ2FjeV9jb21tYW5kKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdW5zaWduZWQgaW50IGNtZCk7CisJaW50ICgqZmVfZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHVuc2lnbmVkIGxvbmcgY21kKTsKIAlpbnQgKCpmZV9zZXRfZnJvbnRlbmQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcyk7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfYXYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9hdi5jCmluZGV4IDA2OTZhNWEuLjQwMGZhY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9hdi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9hdi5jCkBAIC0zMDksNyArMzA5LDcgQEAKIAkJaTJjX3dyaXRlcmVnKGF2NzExMCwgMHgyMCwgMHgwNCwgdm9scmlnaHQpOwogCQlyZXR1cm4gMDsKIAotCWNhc2UgRFZCX0FEQUNfTVNQOgorCWNhc2UgRFZCX0FEQUNfTVNQMzR4MDoKIAkJdm9sICA9ICh2b2xsZWZ0ID4gdm9scmlnaHQpID8gdm9sbGVmdCA6IHZvbHJpZ2h0OwogCQl2YWwJPSAodm9sICogMHg3MyAvIDI1NSkgPDwgODsKIAkJaWYgKHZvbCA+IDApCkBAIC0xMjU2LDcgKzEyNTYsOSBAQAogCQlicmVhazsKIAogCWNhc2UgQVVESU9fU0VUX0JZUEFTU19NT0RFOgotCQlyZXQgPSAtRUlOVkFMOworCQlpZiAoRldfVkVSU0lPTihhdjcxMTAtPmFybV9hcHApIDwgMHgyNjIxKQorCQkJcmV0ID0gLUVJTlZBTDsKKwkJYXY3MTEwLT5hdWRpb3N0YXRlLmJ5cGFzc19tb2RlID0gKGludClhcmc7CiAJCWJyZWFrOwogCiAJY2FzZSBBVURJT19DSEFOTkVMX1NFTEVDVDoKQEAgLTEyOTUsNyArMTI5NywxMSBAQAogCQlicmVhazsKIAogCWNhc2UgQVVESU9fR0VUX0NBUEFCSUxJVElFUzoKLQkJKihpbnQgKilwYXJnID0gQVVESU9fQ0FQX0xQQ00gfCBBVURJT19DQVBfTVAxIHwgQVVESU9fQ0FQX01QMjsKKwkJaWYgKEZXX1ZFUlNJT04oYXY3MTEwLT5hcm1fYXBwKSA8IDB4MjYyMSkKKwkJCSoodW5zaWduZWQgaW50ICopcGFyZyA9IEFVRElPX0NBUF9MUENNIHwgQVVESU9fQ0FQX01QMSB8IEFVRElPX0NBUF9NUDI7CisJCWVsc2UKKwkJCSoodW5zaWduZWQgaW50ICopcGFyZyA9IEFVRElPX0NBUF9MUENNIHwgQVVESU9fQ0FQX0RUUyB8IEFVRElPX0NBUF9BQzMgfAorCQkJCQkJQVVESU9fQ0FQX01QMSB8IEFVRElPX0NBUF9NUDI7CiAJCWJyZWFrOwogCiAJY2FzZSBBVURJT19DTEVBUl9CVUZGRVI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaHcuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9ody5jCmluZGV4IDg3MTA2ZTguLmIyZTYzZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9ody5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9ody5jCkBAIC0xNDYsNTIgKzE0Niw1MiBAQAogewogCWludCBpOwogCWludCBibG9ja3MsIHJlc3Q7Ci0JdTMyIGJhc2UsIGJvb3RibG9jayA9IEJPT1RfQkxPQ0s7CisJdTMyIGJhc2UsIGJvb3RibG9jayA9IEFWNzExMF9CT09UX0JMT0NLOwogCiAJZHByaW50ayg0LCAiJXBcbiIsIGF2NzExMCk7CiAKLQlibG9ja3MgPSBsZW4gLyBCT09UX01BWF9TSVpFOwotCXJlc3QgPSBsZW4gJSBCT09UX01BWF9TSVpFOworCWJsb2NrcyA9IGxlbiAvIEFWNzExMF9CT09UX01BWF9TSVpFOworCXJlc3QgPSBsZW4gJSBBVjcxMTBfQk9PVF9NQVhfU0laRTsKIAliYXNlID0gRFJBTV9TVEFSVF9DT0RFOwogCiAJZm9yIChpID0gMDsgaSA8IGJsb2NrczsgaSsrKSB7Ci0JCWlmICh3YWl0ZGViaShhdjcxMTAsIEJPT1RfU1RBVEUsIEJPT1RTVEFURV9CVUZGRVJfRU1QVFkpIDwgMCkgeworCQlpZiAod2FpdGRlYmkoYXY3MTEwLCBBVjcxMTBfQk9PVF9TVEFURSwgQk9PVFNUQVRFX0JVRkZFUl9FTVBUWSkgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogbG9hZF9kcmFtKCk6IHRpbWVvdXQgYXQgYmxvY2sgJWRcbiIsIGkpOwogCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCX0KIAkJZHByaW50ayg0LCAid3JpdGluZyBEUkFNIGJsb2NrICVkXG4iLCBpKTsKIAkJbXdkZWJpKGF2NzExMCwgREVCSVNXQUIsIGJvb3RibG9jaywKLQkJICAgICAgICgoY2hhciopZGF0YSkgKyBpICogQk9PVF9NQVhfU0laRSwgQk9PVF9NQVhfU0laRSk7CisJCSAgICAgICAoKGNoYXIqKWRhdGEpICsgaSAqIEFWNzExMF9CT09UX01BWF9TSVpFLCBBVjcxMTBfQk9PVF9NQVhfU0laRSk7CiAJCWJvb3RibG9jayBePSAweDE0MDA7Ci0JCWl3ZGViaShhdjcxMTAsIERFQklTV0FCLCBCT09UX0JBU0UsIHN3YWIzMihiYXNlKSwgNCk7Ci0JCWl3ZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEJPT1RfU0laRSwgQk9PVF9NQVhfU0laRSwgMik7Ci0JCWl3ZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEJPT1RfU1RBVEUsIEJPT1RTVEFURV9CVUZGRVJfRlVMTCwgMik7Ci0JCWJhc2UgKz0gQk9PVF9NQVhfU0laRTsKKwkJaXdkZWJpKGF2NzExMCwgREVCSVNXQUIsIEFWNzExMF9CT09UX0JBU0UsIHN3YWIzMihiYXNlKSwgNCk7CisJCWl3ZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEFWNzExMF9CT09UX1NJWkUsIEFWNzExMF9CT09UX01BWF9TSVpFLCAyKTsKKwkJaXdkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQVY3MTEwX0JPT1RfU1RBVEUsIEJPT1RTVEFURV9CVUZGRVJfRlVMTCwgMik7CisJCWJhc2UgKz0gQVY3MTEwX0JPT1RfTUFYX1NJWkU7CiAJfQogCiAJaWYgKHJlc3QgPiAwKSB7Ci0JCWlmICh3YWl0ZGViaShhdjcxMTAsIEJPT1RfU1RBVEUsIEJPT1RTVEFURV9CVUZGRVJfRU1QVFkpIDwgMCkgeworCQlpZiAod2FpdGRlYmkoYXY3MTEwLCBBVjcxMTBfQk9PVF9TVEFURSwgQk9PVFNUQVRFX0JVRkZFUl9FTVBUWSkgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogbG9hZF9kcmFtKCk6IHRpbWVvdXQgYXQgbGFzdCBibG9ja1xuIik7CiAJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQogCQlpZiAocmVzdCA+IDQpCiAJCQltd2RlYmkoYXY3MTEwLCBERUJJU1dBQiwgYm9vdGJsb2NrLAotCQkJICAgICAgICgoY2hhciopZGF0YSkgKyBpICogQk9PVF9NQVhfU0laRSwgcmVzdCk7CisJCQkgICAgICAgKChjaGFyKilkYXRhKSArIGkgKiBBVjcxMTBfQk9PVF9NQVhfU0laRSwgcmVzdCk7CiAJCWVsc2UKIAkJCW13ZGViaShhdjcxMTAsIERFQklTV0FCLCBib290YmxvY2ssCi0JCQkgICAgICAgKChjaGFyKilkYXRhKSArIGkgKiBCT09UX01BWF9TSVpFIC0gNCwgcmVzdCArIDQpOworCQkJICAgICAgICgoY2hhciopZGF0YSkgKyBpICogQVY3MTEwX0JPT1RfTUFYX1NJWkUgLSA0LCByZXN0ICsgNCk7CiAKLQkJaXdkZWJpKGF2NzExMCwgREVCSVNXQUIsIEJPT1RfQkFTRSwgc3dhYjMyKGJhc2UpLCA0KTsKLQkJaXdkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQk9PVF9TSVpFLCByZXN0LCAyKTsKLQkJaXdkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQk9PVF9TVEFURSwgQk9PVFNUQVRFX0JVRkZFUl9GVUxMLCAyKTsKKwkJaXdkZWJpKGF2NzExMCwgREVCSVNXQUIsIEFWNzExMF9CT09UX0JBU0UsIHN3YWIzMihiYXNlKSwgNCk7CisJCWl3ZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEFWNzExMF9CT09UX1NJWkUsIHJlc3QsIDIpOworCQlpd2RlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBBVjcxMTBfQk9PVF9TVEFURSwgQk9PVFNUQVRFX0JVRkZFUl9GVUxMLCAyKTsKIAl9Ci0JaWYgKHdhaXRkZWJpKGF2NzExMCwgQk9PVF9TVEFURSwgQk9PVFNUQVRFX0JVRkZFUl9FTVBUWSkgPCAwKSB7CisJaWYgKHdhaXRkZWJpKGF2NzExMCwgQVY3MTEwX0JPT1RfU1RBVEUsIEJPT1RTVEFURV9CVUZGRVJfRU1QVFkpIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogbG9hZF9kcmFtKCk6IHRpbWVvdXQgYWZ0ZXIgbGFzdCBibG9ja1xuIik7CiAJCXJldHVybiAtRVRJTUVET1VUOwogCX0KLQlpd2RlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBCT09UX1NJWkUsIDAsIDIpOwotCWl3ZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEJPT1RfU1RBVEUsIEJPT1RTVEFURV9CVUZGRVJfRlVMTCwgMik7Ci0JaWYgKHdhaXRkZWJpKGF2NzExMCwgQk9PVF9TVEFURSwgQk9PVFNUQVRFX0JPT1RfQ09NUExFVEUpIDwgMCkgeworCWl3ZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEFWNzExMF9CT09UX1NJWkUsIDAsIDIpOworCWl3ZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEFWNzExMF9CT09UX1NUQVRFLCBCT09UU1RBVEVfQlVGRkVSX0ZVTEwsIDIpOworCWlmICh3YWl0ZGViaShhdjcxMTAsIEFWNzExMF9CT09UX1NUQVRFLCBCT09UU1RBVEVfQVY3MTEwX0JPT1RfQ09NUExFVEUpIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogbG9hZF9kcmFtKCk6IGZpbmFsIGhhbmRzaGFrZSB0aW1lb3V0XG4iKTsKIAkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQpAQCAtMjMwLDYgKzIzMCw4IEBACiAKIAlkcHJpbnRrKDQsICIlcFxuIiwgYXY3MTEwKTsKIAorCWF2NzExMC0+YXJtX3JlYWR5ID0gMDsKKwogCXNhYTcxNDZfc2V0Z3BpbyhkZXYsIFJFU0VUX0xJTkUsIFNBQTcxNDZfR1BJT19PVVRMTyk7CiAKIAkvKiBEaXNhYmxlIERFQkkgYW5kIEdQSU8gaXJxICovCkBAIC0yNjAsNyArMjYyLDcgQEAKIAkvL3NhYTcxNDZfc2V0Z3BpbyhkZXYsIDMsIFNBQTcxNDZfR1BJT19JTlBVVCk7CiAKIAltd2RlYmkoYXY3MTEwLCBERUJJU1dBQiwgRFBSQU1fQkFTRSwgYm9vdGNvZGUsIHNpemVvZihib290Y29kZSkpOwotCWl3ZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEJPT1RfU1RBVEUsIEJPT1RTVEFURV9CVUZGRVJfRlVMTCwgMik7CisJaXdkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQVY3MTEwX0JPT1RfU1RBVEUsIEJPT1RTVEFURV9CVUZGRVJfRlVMTCwgMik7CiAKIAlpZiAoc2FhNzE0Nl93YWl0X2Zvcl9kZWJpX2RvbmUoYXY3MTEwLT5kZXYsIDEpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZHZiLXR0cGNpOiBhdjcxMTBfYm9vdGFybSgpOiAiCkBAIC0zNjEsNiArMzYzLDcgQEAKIAkJCWJyZWFrOwogCQlpZiAoZXJyKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogJXMoKTogdGltZW91dCB3YWl0aW5nIGZvciBDT01NQU5EIGlkbGVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlhdjcxMTAtPmFybV9lcnJvcnMrKzsKIAkJCXJldHVybiAtRVRJTUVET1VUOwogCQl9CiAJCW1zbGVlcCgxKTsKQEAgLTEyMDYsOSArMTIwOSw5IEBACiAJc3dpdGNoIChjYXAtPmNtZCkgewogCWNhc2UgT1NEX0NBUF9NRU1TSVpFOgogCQlpZiAoRldfNE1fU0RSQU0oYXY3MTEwLT5hcm1fYXBwKSkKLQkJICAgICAgICBjYXAtPnZhbCA9IDEwMDAwMDA7CisJCQljYXAtPnZhbCA9IDEwMDAwMDA7CiAJCWVsc2UKLQkJICAgICAgICBjYXAtPnZhbCA9IDkyMDAwOworCQkJY2FwLT52YWwgPSA5MjAwMDsKIAkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaHcuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9ody5oCmluZGV4IDJhNWU4N2IuLjRlMTczYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9ody5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9ody5oCkBAIC0xOCw3ICsxOCw3IEBACiB7CiAJQk9PVFNUQVRFX0JVRkZFUl9FTVBUWQk9IDAsCiAJQk9PVFNUQVRFX0JVRkZFUl9GVUxMCT0gMSwKLQlCT09UU1RBVEVfQk9PVF9DT01QTEVURQk9IDIKKwlCT09UU1RBVEVfQVY3MTEwX0JPT1RfQ09NUExFVEUJPSAyCiB9OwogCiBlbnVtIGF2NzExMF90eXBlX3JlY19wbGF5X2Zvcm1hdApAQCAtMTY3LDcgKzE2Nyw4IEBACiAJTG9hZFZpZENvZGUsCiAJU2V0TW9uaXRvclR5cGUsCiAJU2V0UGFuU2NhblR5cGUsCi0JU2V0RnJlZXplTW9kZQorCVNldEZyZWV6ZU1vZGUsCisJU2V0V1NTQ29uZmlnCiB9OwogCiBlbnVtIGF2NzExMF9yZWNfcGxheV9zdGF0ZSB7CkBAIC0yOTQsMTEgKzI5NSwxMSBAQAogI2RlZmluZQlEUFJBTV9CQVNFIDB4NDAwMAogCiAvKiBib290IHByb3RvY29sIGFyZWEgKi8KLSNkZWZpbmUgQk9PVF9TVEFURQkoRFBSQU1fQkFTRSArIDB4M0Y4KQotI2RlZmluZSBCT09UX1NJWkUJKERQUkFNX0JBU0UgKyAweDNGQSkKLSNkZWZpbmUgQk9PVF9CQVNFCShEUFJBTV9CQVNFICsgMHgzRkMpCi0jZGVmaW5lIEJPT1RfQkxPQ0sJKERQUkFNX0JBU0UgKyAweDQwMCkKLSNkZWZpbmUgQk9PVF9NQVhfU0laRQkweGMwMAorI2RlZmluZSBBVjcxMTBfQk9PVF9TVEFURQkoRFBSQU1fQkFTRSArIDB4M0Y4KQorI2RlZmluZSBBVjcxMTBfQk9PVF9TSVpFCShEUFJBTV9CQVNFICsgMHgzRkEpCisjZGVmaW5lIEFWNzExMF9CT09UX0JBU0UJKERQUkFNX0JBU0UgKyAweDNGQykKKyNkZWZpbmUgQVY3MTEwX0JPT1RfQkxPQ0sJKERQUkFNX0JBU0UgKyAweDQwMCkKKyNkZWZpbmUgQVY3MTEwX0JPT1RfTUFYX1NJWkUJMHhjMDAKIAogLyogZmlybXdhcmUgY29tbWFuZCBwcm90b2NvbCBhcmVhICovCiAjZGVmaW5lIElSUV9TVEFURQkoRFBSQU1fQkFTRSArIDB4MEY0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2lyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaXIuYwppbmRleCBmNWU1OWZjLi45MTM4MTMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaXIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaXIuYwpAQCAtMTcsNiArMTcsOCBAQAogc3RhdGljIHN0cnVjdCBhdjcxMTAgKmF2X2xpc3RbNF07CiBzdGF0aWMgc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwogCitzdGF0aWMgdTggZGVsYXlfdGltZXJfZmluaXNoZWQ7CisKIHN0YXRpYyB1MTYga2V5X21hcCBbMjU2XSA9IHsKIAlLRVlfMCwgS0VZXzEsIEtFWV8yLCBLRVlfMywgS0VZXzQsIEtFWV81LCBLRVlfNiwgS0VZXzcsCiAJS0VZXzgsIEtFWV85LCBLRVlfQkFDSywgMCwgS0VZX1BPV0VSLCBLRVlfTVVURSwgMCwgS0VZX0lORk8sCkBAIC0xMTIsMTMgKzExNCwxNiBAQAogCWlmICh0aW1lcl9wZW5kaW5nKCZrZXl1cF90aW1lcikpIHsKIAkJZGVsX3RpbWVyKCZrZXl1cF90aW1lcik7CiAJCWlmIChrZXl1cF90aW1lci5kYXRhICE9IGtleWNvZGUgfHwgbmV3X3RvZ2dsZSAhPSBvbGRfdG9nZ2xlKSB7CisJCQlkZWxheV90aW1lcl9maW5pc2hlZCA9IDA7CiAJCQlpbnB1dF9ldmVudChpbnB1dF9kZXYsIEVWX0tFWSwga2V5dXBfdGltZXIuZGF0YSwgISEwKTsKIAkJCWlucHV0X2V2ZW50KGlucHV0X2RldiwgRVZfS0VZLCBrZXljb2RlLCAhMCk7CiAJCX0gZWxzZQotCQkJaW5wdXRfZXZlbnQoaW5wdXRfZGV2LCBFVl9LRVksIGtleWNvZGUsIDIpOwotCi0JfSBlbHNlCisJCQlpZiAoZGVsYXlfdGltZXJfZmluaXNoZWQpCisJCQkJaW5wdXRfZXZlbnQoaW5wdXRfZGV2LCBFVl9LRVksIGtleWNvZGUsIDIpOworCX0gZWxzZSB7CisJCWRlbGF5X3RpbWVyX2ZpbmlzaGVkID0gMDsKIAkJaW5wdXRfZXZlbnQoaW5wdXRfZGV2LCBFVl9LRVksIGtleWNvZGUsICEwKTsKKwl9CiAKIAlrZXl1cF90aW1lci5leHBpcmVzID0gamlmZmllcyArIFVQX1RJTUVPVVQ7CiAJa2V5dXBfdGltZXIuZGF0YSA9IGtleWNvZGU7CkBAIC0xNDUsNyArMTUwLDggQEAKIAogc3RhdGljIHZvaWQgaW5wdXRfcmVwZWF0X2tleSh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0gICAgICAgLyogZHVtbXkgcm91dGluZSB0byBkaXNhYmxlIGF1dG9yZXBlYXQgaW4gdGhlIGlucHV0IGRyaXZlciAqLworCS8qIGNhbGxlZCBieSB0aGUgaW5wdXQgZHJpdmVyIGFmdGVyIHJlcFtSRVBfREVMQVldIG1zICovCisJZGVsYXlfdGltZXJfZmluaXNoZWQgPSAxOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF92NGwuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF92NGwuYwppbmRleCBiNWFlYTQxLi45NGNmMzhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfdjRsLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX3Y0bC5jCkBAIC00OTAsNiArNDkwLDU4IEBACiAJCWRwcmludGsoMiwgIlZJRElPQ19TX0FVRElPOiAlZFxuIiwgYS0+aW5kZXgpOwogCQlicmVhazsKIAl9CisJY2FzZSBWSURJT0NfR19TTElDRURfVkJJX0NBUDoKKwl7CisJCXN0cnVjdCB2NGwyX3NsaWNlZF92YmlfY2FwICpjYXAgPSBhcmc7CisJCWRwcmludGsoMiwgIlZJRElPQ19HX1NMSUNFRF9WQklfQ0FQXG4iKTsKKwkJbWVtc2V0KGNhcCwgMCwgc2l6ZW9mICpjYXApOworCQlpZiAoRldfVkVSU0lPTihhdjcxMTAtPmFybV9hcHApID49IDB4MjYyMykgeworCQkJY2FwLT5zZXJ2aWNlX3NldCA9IFY0TDJfU0xJQ0VEX1dTU182MjU7CisJCQljYXAtPnNlcnZpY2VfbGluZXNbMF1bMjNdID0gVjRMMl9TTElDRURfV1NTXzYyNTsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfR19GTVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYgPSBhcmc7CisJCWRwcmludGsoMiwgIlZJRElPQ19HX0ZNVDpcbiIpOworCQlpZiAoZi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfT1VUUFVUIHx8CisJCSAgICBGV19WRVJTSU9OKGF2NzExMC0+YXJtX2FwcCkgPCAweDI2MjMpCisJCQlyZXR1cm4gLUVBR0FJTjsgLyogaGFuZGxlZCBieSBjb3JlIGRyaXZlciAqLworCQltZW1zZXQoJmYtPmZtdC5zbGljZWQsIDAsIHNpemVvZiBmLT5mbXQuc2xpY2VkKTsKKwkJaWYgKGF2NzExMC0+d3NzTW9kZSkgeworCQkJZi0+Zm10LnNsaWNlZC5zZXJ2aWNlX3NldCA9IFY0TDJfU0xJQ0VEX1dTU182MjU7CisJCQlmLT5mbXQuc2xpY2VkLnNlcnZpY2VfbGluZXNbMF1bMjNdID0gVjRMMl9TTElDRURfV1NTXzYyNTsKKwkJCWYtPmZtdC5zbGljZWQuaW9fc2l6ZSA9IHNpemVvZiAoc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9kYXRhKTsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfU19GTVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYgPSBhcmc7CisJCWRwcmludGsoMiwgIlZJRElPQ19TX0ZNVFxuIik7CisJCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9PVVRQVVQgfHwKKwkJICAgIEZXX1ZFUlNJT04oYXY3MTEwLT5hcm1fYXBwKSA8IDB4MjYyMykKKwkJCXJldHVybiAtRUFHQUlOOyAvKiBoYW5kbGVkIGJ5IGNvcmUgZHJpdmVyICovCisJCWlmIChmLT5mbXQuc2xpY2VkLnNlcnZpY2Vfc2V0ICE9IFY0TDJfU0xJQ0VEX1dTU182MjUgJiYKKwkJICAgIGYtPmZtdC5zbGljZWQuc2VydmljZV9saW5lc1swXVsyM10gIT0gVjRMMl9TTElDRURfV1NTXzYyNSkgeworCQkJbWVtc2V0KCZmLT5mbXQuc2xpY2VkLCAwLCBzaXplb2YgZi0+Zm10LnNsaWNlZCk7CisJCQkvKiBXU1MgY29udHJvbGxlZCBieSBmaXJtd2FyZSAqLworCQkJYXY3MTEwLT53c3NNb2RlID0gMDsKKwkJCWF2NzExMC0+d3NzRGF0YSA9IDA7CisJCQlyZXR1cm4gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfRU5DT0RFUiwKKwkJCQkJICAgICBTZXRXU1NDb25maWcsIDEsIDApOworCQl9IGVsc2UgeworCQkJbWVtc2V0KCZmLT5mbXQuc2xpY2VkLCAwLCBzaXplb2YgZi0+Zm10LnNsaWNlZCk7CisJCQlmLT5mbXQuc2xpY2VkLnNlcnZpY2Vfc2V0ID0gVjRMMl9TTElDRURfV1NTXzYyNTsKKwkJCWYtPmZtdC5zbGljZWQuc2VydmljZV9saW5lc1swXVsyM10gPSBWNEwyX1NMSUNFRF9XU1NfNjI1OworCQkJZi0+Zm10LnNsaWNlZC5pb19zaXplID0gc2l6ZW9mIChzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2RhdGEpOworCQkJLyogV1NTIGNvbnRyb2xsZWQgYnkgdXNlcnNwYWNlICovCisJCQlhdjcxMTAtPndzc01vZGUgPSAxOworCQkJYXY3MTEwLT53c3NEYXRhID0gMDsKKwkJfQorCQlicmVhazsKKwl9CiAJZGVmYXVsdDoKIAkJcHJpbnRrKCJubyBzdWNoIGlvY3RsXG4iKTsKIAkJcmV0dXJuIC1FTk9JT0NUTENNRDsKQEAgLTQ5Nyw2ICs1NDksNDYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBhdjcxMTBfdmJpX3Jlc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzYWE3MTQ2X2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IGF2NzExMCAqYXY3MTEwID0gKHN0cnVjdCBhdjcxMTAqKSBkZXYtPmV4dF9wcml2OworCisJZHByaW50aygyLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJYXY3MTEwLT53c3NNb2RlID0gMDsKKwlhdjcxMTAtPndzc0RhdGEgPSAwOworCWlmIChGV19WRVJTSU9OKGF2NzExMC0+YXJtX2FwcCkgPCAweDI2MjMpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX0VOQ09ERVIsIFNldFdTU0NvbmZpZywgMSwgMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGF2NzExMF92Ymlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgc2FhNzE0Nl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCBhdjcxMTAgKmF2NzExMCA9IChzdHJ1Y3QgYXY3MTEwKikgZGV2LT5leHRfcHJpdjsKKwlzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2RhdGEgZDsKKwlpbnQgcmM7CisKKwlkcHJpbnRrKDIsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlpZiAoRldfVkVSU0lPTihhdjcxMTAtPmFybV9hcHApIDwgMHgyNjIzIHx8ICFhdjcxMTAtPndzc01vZGUgfHwgY291bnQgIT0gc2l6ZW9mIGQpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjb3B5X2Zyb21fdXNlcigmZCwgZGF0YSwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoKGQuaWQgIT0gMCAmJiBkLmlkICE9IFY0TDJfU0xJQ0VEX1dTU182MjUpIHx8IGQuZmllbGQgIT0gMCB8fCBkLmxpbmUgIT0gMjMpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChkLmlkKSB7CisJCWF2NzExMC0+d3NzRGF0YSA9ICgoZC5kYXRhWzFdIDw8IDgpICYgMHgzZjAwKSB8IGQuZGF0YVswXTsKKwkJcmMgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9FTkNPREVSLCBTZXRXU1NDb25maWcsCisJCQkJICAgMiwgMSwgYXY3MTEwLT53c3NEYXRhKTsKKwl9IGVsc2UgeworCQlhdjcxMTAtPndzc0RhdGEgPSAwOworCQlyYyA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX0VOQ09ERVIsIFNldFdTU0NvbmZpZywgMSwgMCk7CisJfQorCXJldHVybiAocmMgPCAwKSA/IHJjIDogY291bnQ7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJTklUSUFMSVpBVElPTgpAQCAtNTEyLDYgKzYwNCw5IEBACiAJeyBWSURJT0NfU19UVU5FUiwJU0FBNzE0Nl9FWENMVVNJVkUgfSwKIAl7IFZJRElPQ19HX0FVRElPLAlTQUE3MTQ2X0VYQ0xVU0lWRSB9LAogCXsgVklESU9DX1NfQVVESU8sCVNBQTcxNDZfRVhDTFVTSVZFIH0sCisJeyBWSURJT0NfR19TTElDRURfVkJJX0NBUCwgU0FBNzE0Nl9FWENMVVNJVkUgfSwKKwl7IFZJRElPQ19HX0ZNVCwJCVNBQTcxNDZfQkVGT1JFIH0sCisJeyBWSURJT0NfU19GTVQsCQlTQUE3MTQ2X0JFRk9SRSB9LAogCXsgMCwgMCB9CiB9OwogCkBAIC01ODcsNyArNjgyLDcgQEAKIAogCXByaW50aygiZHZiLXR0cGNpOiBEVkItQyBhbmFsb2cgbW9kdWxlIEAgY2FyZCAlZCBkZXRlY3RlZCwgaW5pdGlhbGl6aW5nIE1TUDM0MDBcbiIsCiAJCWF2NzExMC0+ZHZiX2FkYXB0ZXIubnVtKTsKLQlhdjcxMTAtPmFkYWNfdHlwZSA9IERWQl9BREFDX01TUDsKKwlhdjcxMTAtPmFkYWNfdHlwZSA9IERWQl9BREFDX01TUDM0eDA7CiAJbXNsZWVwKDEwMCk7IC8vIHRoZSBwcm9iaW5nIGFib3ZlIHJlc2V0cyB0aGUgbXNwLi4uCiAJbXNwX3JlYWRyZWcoYXY3MTEwLCBNU1BfUkRfRFNQLCAweDAwMWUsICZ2ZXJzaW9uMSk7CiAJbXNwX3JlYWRyZWcoYXY3MTEwLCBNU1BfUkRfRFNQLCAweDAwMWYsICZ2ZXJzaW9uMik7CkBAIC02OTIsMTIgKzc4NywxMSBAQAogCQlzYWE3MTQ2X3Z2X3JlbGVhc2UoZGV2KTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCWlmIChhdjcxMTAtPmFuYWxvZ190dW5lcl9mbGFncykgewotCQlpZiAoc2FhNzE0Nl9yZWdpc3Rlcl9kZXZpY2UoJmF2NzExMC0+dmJpX2RldiwgZGV2LCAiYXY3MTEwIiwgVkZMX1RZUEVfVkJJKSkgewotCQkJRVJSKCgiY2Fubm90IHJlZ2lzdGVyIHZiaSB2NGwyIGRldmljZS4gc2tpcHBpbmcuXG4iKSk7Ci0JCX0gZWxzZSB7CisJaWYgKHNhYTcxNDZfcmVnaXN0ZXJfZGV2aWNlKCZhdjcxMTAtPnZiaV9kZXYsIGRldiwgImF2NzExMCIsIFZGTF9UWVBFX1ZCSSkpIHsKKwkJRVJSKCgiY2Fubm90IHJlZ2lzdGVyIHZiaSB2NGwyIGRldmljZS4gc2tpcHBpbmcuXG4iKSk7CisJfSBlbHNlIHsKKwkJaWYgKGF2NzExMC0+YW5hbG9nX3R1bmVyX2ZsYWdzKQogCQkJYXY3MTEwLT5hbmFsb2dfdHVuZXJfZmxhZ3MgfD0gQU5BTE9HX1RVTkVSX1ZCSTsKLQkJfQogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTc3OCw3ICs4NzIsNyBAQAogc3RhdGljIHN0cnVjdCBzYWE3MTQ2X2V4dF92diBhdjcxMTBfdnZfZGF0YV9zdCA9IHsKIAkuaW5wdXRzCQk9IDEsCiAJLmF1ZGlvcwkJPSAxLAotCS5jYXBhYmlsaXRpZXMJPSAwLAorCS5jYXBhYmlsaXRpZXMJPSBWNEwyX0NBUF9TTElDRURfVkJJX09VVFBVVCwKIAkuZmxhZ3MJCT0gMCwKIAogCS5zdGRzCQk9ICZzdGFuZGFyZFswXSwKQEAgLTc4NywxMiArODgxLDE2IEBACiAKIAkuaW9jdGxzCQk9ICZpb2N0bHNbMF0sCiAJLmlvY3RsCQk9IGF2NzExMF9pb2N0bCwKKworCS52YmlfZm9wcy5vcGVuCT0gYXY3MTEwX3ZiaV9yZXNldCwKKwkudmJpX2ZvcHMucmVsZWFzZSA9IGF2NzExMF92YmlfcmVzZXQsCisJLnZiaV9mb3BzLndyaXRlCT0gYXY3MTEwX3ZiaV93cml0ZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2FhNzE0Nl9leHRfdnYgYXY3MTEwX3Z2X2RhdGFfYyA9IHsKIAkuaW5wdXRzCQk9IDEsCiAJLmF1ZGlvcwkJPSAxLAotCS5jYXBhYmlsaXRpZXMJPSBWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX1ZCSV9DQVBUVVJFLAorCS5jYXBhYmlsaXRpZXMJPSBWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX1ZCSV9DQVBUVVJFIHwgVjRMMl9DQVBfU0xJQ0VEX1ZCSV9PVVRQVVQsCiAJLmZsYWdzCQk9IFNBQTcxNDZfVVNFX1BPUlRfQl9GT1JfVkJJLAogCiAJLnN0ZHMJCT0gJnN0YW5kYXJkWzBdLApAQCAtODAxLDUgKzg5OSw5IEBACiAKIAkuaW9jdGxzCQk9ICZpb2N0bHNbMF0sCiAJLmlvY3RsCQk9IGF2NzExMF9pb2N0bCwKKworCS52YmlfZm9wcy5vcGVuCT0gYXY3MTEwX3ZiaV9yZXNldCwKKwkudmJpX2ZvcHMucmVsZWFzZSA9IGF2NzExMF92YmlfcmVzZXQsCisJLnZiaV9mb3BzLndyaXRlCT0gYXY3MTEwX3ZiaV93cml0ZSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKaW5kZXggOWY1MWJhZS4uMTQ2NWMwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlICJzdHYwMjk5LmgiCiAjaW5jbHVkZSAidGRhMTAwMjEuaCIKICNpbmNsdWRlICJ0ZGExMDA0eC5oIgorI2luY2x1ZGUgImR2Yi1wbGwuaCIKICNpbmNsdWRlIDxtZWRpYS9zYWE3MTQ2X3Z2Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KQEAgLTEyNyw3ICsxMjgsNyBAQAogCXNhYTcxNDZfc2V0Z3BpbyhidWRnZXRfYXYtPmJ1ZGdldC5kZXYsIDEsIFNBQTcxNDZfR1BJT19PVVRISSk7CiAJdWRlbGF5KDEpOwogCi0JcmVzdWx0ID0gdHRwY2lfYnVkZ2V0X2RlYmlyZWFkKCZidWRnZXRfYXYtPmJ1ZGdldCwgREVCSUNJQ0FNLCBhZGRyZXNzICYgMHhmZmYsIDEsIDAsIDApOworCXJlc3VsdCA9IHR0cGNpX2J1ZGdldF9kZWJpcmVhZCgmYnVkZ2V0X2F2LT5idWRnZXQsIERFQklDSUNBTSwgYWRkcmVzcyAmIDB4ZmZmLCAxLCAwLCAxKTsKIAogCWlmIChyZXN1bHQgPT0gLUVUSU1FRE9VVCkKIAkJYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyA9IDA7CkBAIC0xNDUsNyArMTQ2LDcgQEAKIAlzYWE3MTQ2X3NldGdwaW8oYnVkZ2V0X2F2LT5idWRnZXQuZGV2LCAxLCBTQUE3MTQ2X0dQSU9fT1VUSEkpOwogCXVkZWxheSgxKTsKIAotCXJlc3VsdCA9IHR0cGNpX2J1ZGdldF9kZWJpd3JpdGUoJmJ1ZGdldF9hdi0+YnVkZ2V0LCBERUJJQ0lDQU0sIGFkZHJlc3MgJiAweGZmZiwgMSwgdmFsdWUsIDAsIDApOworCXJlc3VsdCA9IHR0cGNpX2J1ZGdldF9kZWJpd3JpdGUoJmJ1ZGdldF9hdi0+YnVkZ2V0LCBERUJJQ0lDQU0sIGFkZHJlc3MgJiAweGZmZiwgMSwgdmFsdWUsIDAsIDEpOwogCiAJaWYgKHJlc3VsdCA9PSAtRVRJTUVET1VUKQogCQlidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID0gMDsKQEAgLTE5Miw3ICsxOTMsNyBAQAogewogCXN0cnVjdCBidWRnZXRfYXYgKmJ1ZGdldF9hdiA9IChzdHJ1Y3QgYnVkZ2V0X2F2ICopIGNhLT5kYXRhOwogCXN0cnVjdCBzYWE3MTQ2X2RldiAqc2FhID0gYnVkZ2V0X2F2LT5idWRnZXQuZGV2OwotCWludCB0aW1lb3V0ID0gNTAwOyAvLyA1IHNlY29uZHMgKDQuNC42IFJlYWR5KQorCWludCB0aW1lb3V0ID0gNTA7IC8vIDUgc2Vjb25kcyAoNC40LjYgUmVhZHkpCiAKIAlpZiAoc2xvdCAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI1NiwxOSArMjU3LDM3IEBACiB7CiAJc3RydWN0IGJ1ZGdldF9hdiAqYnVkZ2V0X2F2ID0gKHN0cnVjdCBidWRnZXRfYXYgKikgY2EtPmRhdGE7CiAJc3RydWN0IHNhYTcxNDZfZGV2ICpzYWEgPSBidWRnZXRfYXYtPmJ1ZGdldC5kZXY7CisJaW50IGNhbV9wcmVzZW50ID0gMDsKIAogCWlmIChzbG90ICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFidWRnZXRfYXYtPnNsb3Rfc3RhdHVzKSB7CisJaWYgKCFidWRnZXRfYXYtPnNsb3Rfc3RhdHVzKQorCXsKKwkJLy8gZmlyc3Qgb2YgYWxsIHRlc3QgdGhlIGNhcmQgZGV0ZWN0IGxpbmUKIAkJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMywgU0FBNzE0Nl9HUElPX0lOUFVUKTsKIAkJdWRlbGF5KDEpOwogCQlpZiAoc2FhNzE0Nl9yZWFkKHNhYSwgUFNSKSAmIE1BU0tfMDYpCiAJCXsKKwkJCWNhbV9wcmVzZW50ID0gMTsKKwkJfQorCQlzYWE3MTQ2X3NldGdwaW8oc2FhLCAzLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOworCisJCS8vIHRoYXQgaXMgdW5yZWxpYWJsZSBob3dldmVyLCBzbyB0cnkgYW5kIHJlYWQgZnJvbSBJTyBtZW1vcnkKKwkJaWYgKCFjYW1fcHJlc2VudCkKKwkJeworCQkJc2FhNzE0Nl9zZXRncGlvKGJ1ZGdldF9hdi0+YnVkZ2V0LmRldiwgMSwgU0FBNzE0Nl9HUElPX09VVExPKTsKKwkJCWlmICh0dHBjaV9idWRnZXRfZGViaXJlYWQoJmJ1ZGdldF9hdi0+YnVkZ2V0LCBERUJJQ0lDQU0sIDAsIDEsIDAsIDEpICE9IC1FVElNRURPVVQpCisJCQl7CisJCQkJY2FtX3ByZXNlbnQgPSAxOworCQkJfQorCQl9CisKKwkJLy8gZGlkIHdlIGZpbmQgc29tZXRoaW5nPworCQlpZiAoY2FtX3ByZXNlbnQpIHsKIAkJCXByaW50ayhLRVJOX0lORk8gImJ1ZGdldC1hdjogY2FtIGluc2VydGVkXG4iKTsKIAkJCWJ1ZGdldF9hdi0+c2xvdF9zdGF0dXMgPSAxOwogCQl9Ci0JCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDMsIFNBQTcxNDZfR1BJT19PVVRMTyk7CiAJfSBlbHNlIGlmICghb3BlbikgewogCQlzYWE3MTQ2X3NldGdwaW8oYnVkZ2V0X2F2LT5idWRnZXQuZGV2LCAxLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOwogCQlpZiAodHRwY2lfYnVkZ2V0X2RlYmlyZWFkKCZidWRnZXRfYXYtPmJ1ZGdldCwgREVCSUNJQ0FNLCAwLCAxLCAwLCAxKSA9PSAtRVRJTUVET1VUKQpAQCAtNDg0LDYgKzUwMywxNDAgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBNSU4yKGEsYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgTUlOMyhhLGIsYykgTUlOMihNSU4yKGEsYiksYykKKworc3RhdGljIGludCBwaGlsaXBzX3N1MTI3OHNoMl90dWE2MTAwX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAorCQkJCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwl1OCByZWcwIFsyXSA9IHsgMHgwMCwgMHgwMCB9OworCXU4IHJlZzEgWzRdID0geyAweDAxLCAweDAwLCAweDAwLCAweDAwIH07CisJdTggcmVnMiBbM10gPSB7IDB4MDIsIDB4MDAsIDB4MDAgfTsKKwlpbnQgX2ZiYW5kOworCWludCBmaXJzdF9aRjsKKwlpbnQgUiwgQSwgTiwgUCwgTTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7LmFkZHIgPSAweDYwLC5mbGFncyA9IDAsLmJ1ZiA9IE5VTEwsLmxlbiA9IDAgfTsKKwlpbnQgZnJlcSA9IHBhcmFtcy0+ZnJlcXVlbmN5OworCisJZmlyc3RfWkYgPSAoZnJlcSkgLyAxMDAwOworCisJaWYgKGFicyhNSU4yKGFicyhmaXJzdF9aRi0xMTkwKSxhYnMoZmlyc3RfWkYtMTc5MCkpKSA8CisJCSAgIGFicyhNSU4zKGFicyhmaXJzdF9aRi0xMjAyKSxhYnMoZmlyc3RfWkYtMTU0MiksYWJzKGZpcnN0X1pGLTE4OTApKSkpCisJCV9mYmFuZCA9IDI7CisJZWxzZQorCQlfZmJhbmQgPSAzOworCisJaWYgKF9mYmFuZCA9PSAyKSB7CisJCWlmICgoKGZpcnN0X1pGID49IDk1MCkgJiYgKGZpcnN0X1pGIDwgMTM1MCkpIHx8CisJCQkJICAgICgoZmlyc3RfWkYgPj0gMTQzMCkgJiYgKGZpcnN0X1pGIDwgMTk1MCkpKQorCQkJcmVnMFsxXSA9IDB4MDc7CisJCWVsc2UgaWYgKCgoZmlyc3RfWkYgPj0gMTM1MCkgJiYgKGZpcnN0X1pGIDwgMTQzMCkpIHx8CisJCQkJCSAoKGZpcnN0X1pGID49IDE5NTApICYmIChmaXJzdF9aRiA8IDIxNTApKSkKKwkJCXJlZzBbMV0gPSAweDBCOworCX0KKworCWlmKF9mYmFuZCA9PSAzKSB7CisJCWlmICgoKGZpcnN0X1pGID49IDk1MCkgJiYgKGZpcnN0X1pGIDwgMTM1MCkpIHx8CisJCQkJICAgICgoZmlyc3RfWkYgPj0gMTQ1NSkgJiYgKGZpcnN0X1pGIDwgMTk1MCkpKQorCQkJcmVnMFsxXSA9IDB4MDc7CisJCWVsc2UgaWYgKCgoZmlyc3RfWkYgPj0gMTM1MCkgJiYgKGZpcnN0X1pGIDwgMTQyMCkpIHx8CisJCQkJCSAoKGZpcnN0X1pGID49IDE5NTApICYmIChmaXJzdF9aRiA8IDIxNTApKSkKKwkJCXJlZzBbMV0gPSAweDBCOworCQllbHNlIGlmICgoZmlyc3RfWkYgPj0gMTQyMCkgJiYgKGZpcnN0X1pGIDwgMTQ1NSkpCisJCQlyZWcwWzFdID0gMHgwRjsKKwl9CisKKwlpZiAoZmlyc3RfWkYgPiAxNTI1KQorCQlyZWcxWzFdIHw9IDB4ODA7CisJZWxzZQorCQlyZWcxWzFdICY9IDB4N0Y7CisKKwlpZiAoX2ZiYW5kID09IDIpIHsKKwkJaWYgKGZpcnN0X1pGID4gMTQzMCkgeyAvKiAxNDMwTUhaICovCisJCQlyZWcxWzFdICY9IDB4Q0Y7IC8qIE4yICovCisJCQlyZWcyWzFdICY9IDB4Q0Y7IC8qIFIyICovCisJCQlyZWcyWzFdIHw9IDB4MTA7CisJCX0gZWxzZSB7CisJCQlyZWcxWzFdICY9IDB4Q0Y7IC8qIE4yICovCisJCQlyZWcxWzFdIHw9IDB4MjA7CisJCQlyZWcyWzFdICY9IDB4Q0Y7IC8qIFIyICovCisJCQlyZWcyWzFdIHw9IDB4MTA7CisJCX0KKwl9CisKKwlpZiAoX2ZiYW5kID09IDMpIHsKKwkJaWYgKChmaXJzdF9aRiA+PSAxNDU1KSAmJgorCQkJCSAgIChmaXJzdF9aRiA8IDE2MzApKSB7CisJCQlyZWcxWzFdICY9IDB4Q0Y7IC8qIE4yICovCisJCQlyZWcxWzFdIHw9IDB4MjA7CisJCQlyZWcyWzFdICY9IDB4Q0Y7IC8qIFIyICovCisJCQkJICAgfSBlbHNlIHsKKwkJCQkJICAgaWYgKGZpcnN0X1pGIDwgMTQ1NSkgeworCQkJCQkJICAgcmVnMVsxXSAmPSAweENGOyAvKiBOMiAqLworCQkJCQkJICAgcmVnMVsxXSB8PSAweDIwOworCQkJCQkJICAgcmVnMlsxXSAmPSAweENGOyAvKiBSMiAqLworCQkJCQkJICAgcmVnMlsxXSB8PSAweDEwOworCQkJCQkgICB9IGVsc2UgeworCQkJCQkJICAgaWYgKGZpcnN0X1pGID49IDE2MzApIHsKKwkJCQkJCQkgICByZWcxWzFdICY9IDB4Q0Y7IC8qIE4yICovCisJCQkJCQkJICAgcmVnMlsxXSAmPSAweENGOyAvKiBSMiAqLworCQkJCQkJCSAgIHJlZzJbMV0gfD0gMHgxMDsKKwkJCQkJCSAgIH0KKwkJCQkJICAgfQorCQkJCSAgIH0KKwl9CisKKwkvKiBzZXQgcG9ydHMsIGVuYWJsZSBQMCBmb3Igc3ltYm9sIHJhdGVzID4gNE1zL3MgKi8KKwlpZiAocGFyYW1zLT51LnFwc2suc3ltYm9sX3JhdGUgPj0gNDAwMDAwMCkKKwkJcmVnMVsxXSB8PSAweDBjOworCWVsc2UKKwkJcmVnMVsxXSB8PSAweDA0OworCisJcmVnMlsxXSB8PSAweDBjOworCisJUiA9IDY0OworCUEgPSA2NDsKKwlQID0gNjQ7CSAvLzMyCisKKwlNID0gKGZyZXEgKiBSKSAvIDQ7CQkvKiBpbiBNaHogKi8KKwlOID0gKE0gLSBBICogMTAwMCkgLyAoUCAqIDEwMDApOworCisJcmVnMVsxXSB8PSAoTiA+PiA5KSAmIDB4MDM7CisJcmVnMVsyXQkgPSAoTiA+PiAxKSAmIDB4ZmY7CisJcmVnMVszXQkgPSAoTiA8PCA3KSAmIDB4ODA7CisKKwlyZWcyWzFdIHw9IChSID4+IDgpICYgMHgwMzsKKwlyZWcyWzJdCSA9IFIgJiAweEZGOwkvKiBSICovCisKKwlyZWcxWzNdIHw9IEEgJiAweDdmOwkvKiBBICovCisKKwlpZiAoUCA9PSA2NCkKKwkJcmVnMVsxXSB8PSAweDQwOyAvKiBQcmVzY2FsZXIgNjQvNjUgKi8KKworCXJlZzBbMV0gfD0gMHgwMzsKKworCS8qIGFscmVhZHkgZW5hYmxlZCAtIGRvIG5vdCByZWVuYWJsZSBpMmMgcmVwZWF0ZXIgb3IgVFggZmFpbHMgKi8KKwltc2cuYnVmID0gcmVnMDsKKwltc2cubGVuID0gc2l6ZW9mKHJlZzApOworCWlmIChpMmNfdHJhbnNmZXIoaTJjLCAmbXNnLCAxKSAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKworCXN0djAyOTlfZW5hYmxlX3BsbGkyYyhmZSk7CisJbXNnLmJ1ZiA9IHJlZzE7CisJbXNnLmxlbiA9IHNpemVvZihyZWcxKTsKKwlpZiAoaTJjX3RyYW5zZmVyKGkyYywgJm1zZywgMSkgIT0gMSkKKwkJcmV0dXJuIC1FSU87CisKKwlzdHYwMjk5X2VuYWJsZV9wbGxpMmMoZmUpOworCW1zZy5idWYgPSByZWcyOworCW1zZy5sZW4gPSBzaXplb2YocmVnMik7CisJaWYgKGkyY190cmFuc2ZlcihpMmMsICZtc2csIDEpICE9IDEpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB1OCB0eXBob29uX2NpbmVyZ3kxMjAwc19pbml0dGFiW10gPSB7CiAJMHgwMSwgMHgxNSwKIAkweDAyLCAweDMwLApAQCAtNTUzLDYgKzcwNiwxOCBAQAogCS5wbGxfc2V0ID0gcGhpbGlwc19zdTEyNzhfdHlfY2lfcGxsX3NldCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc3R2MDI5OV9jb25maWcgY2luZXJneV8xMjAwc18xODk0XzAwMTBfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHg2OCwKKwkuaW5pdHRhYiA9IHR5cGhvb25fY2luZXJneTEyMDBzX2luaXR0YWIsCisJLm1jbGsgPSA4ODAwMDAwMFVMLAorCS5pbnZlcnQgPSAxLAorCS5za2lwX3JlaW5pdCA9IDAsCisJLmxvY2tfb3V0cHV0ID0gU1RWMDIyOV9MT0NLT1VUUFVUXzEsCisJLnZvbHQxM19vcDBfb3AxID0gU1RWMDI5OV9WT0xUMTNfT1AwLAorCS5taW5fZGVsYXlfbXMgPSAxMDAsCisJLnNldF9zeW1ib2xfcmF0ZSA9IHBoaWxpcHNfc3UxMjc4X3R5X2NpX3NldF9zeW1ib2xfcmF0ZSwKKwkucGxsX3NldCA9IHBoaWxpcHNfc3UxMjc4c2gyX3R1YTYxMDBfcGxsX3NldCwKK307CiAKIHN0YXRpYyBpbnQgcGhpbGlwc19jdTEyMTZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CkBAIC03MDAsOCArODY1LDExNyBAQAogCS5yZXF1ZXN0X2Zpcm13YXJlID0gcGhpbGlwc190dTEyMTZfcmVxdWVzdF9maXJtd2FyZSwKIH07CiAKK3N0YXRpYyB1OCBwaGlsaXBzX3NkMTg3OF9pbml0dGFiW10gPSB7CisJMHgwMSwgMHgxNSwKKwkweDAyLCAweDMwLAorCTB4MDMsIDB4MDAsCisJMHgwNCwgMHg3ZCwKKwkweDA1LCAweDM1LAorCTB4MDYsIDB4NDAsCisJMHgwNywgMHgwMCwKKwkweDA4LCAweDQzLAorCTB4MDksIDB4MDIsCisJMHgwQywgMHg1MSwKKwkweDBELCAweDgyLAorCTB4MEUsIDB4MjMsCisJMHgxMCwgMHgzZiwKKwkweDExLCAweDg0LAorCTB4MTIsIDB4YjksCisJMHgxNSwgMHhjOSwKKwkweDE2LCAweDE5LAorCTB4MTcsIDB4OGMsCisJMHgxOCwgMHg1OSwKKwkweDE5LCAweGY4LAorCTB4MWEsIDB4ZmUsCisJMHgxYywgMHg3ZiwKKwkweDFkLCAweDAwLAorCTB4MWUsIDB4MDAsCisJMHgxZiwgMHg1MCwKKwkweDIwLCAweDAwLAorCTB4MjEsIDB4MDAsCisJMHgyMiwgMHgwMCwKKwkweDIzLCAweDAwLAorCTB4MjgsIDB4MDAsCisJMHgyOSwgMHgyOCwKKwkweDJhLCAweDE0LAorCTB4MmIsIDB4MGYsCisJMHgyYywgMHgwOSwKKwkweDJkLCAweDA5LAorCTB4MzEsIDB4MWYsCisJMHgzMiwgMHgxOSwKKwkweDMzLCAweGZjLAorCTB4MzQsIDB4OTMsCisJMHhmZiwgMHhmZgorfTsKIAorc3RhdGljIGludCBwaGlsaXBzX3NkMTg3OF90ZGE4MjYxX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAorCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwl1OCAgICAgICAgICAgICAgYnVmWzRdOworCWludCAgICAgICAgICAgICByYzsKKwlzdHJ1Y3QgaTJjX21zZyAgdHVuZXJfbXNnID0gey5hZGRyPTB4NjAsLmZsYWdzPTAsLmJ1Zj1idWYsLmxlbj1zaXplb2YoYnVmKX07CiAKKwlpZigocGFyYW1zLT5mcmVxdWVuY3kgPCA5NTAwMDApIHx8IChwYXJhbXMtPmZyZXF1ZW5jeSA+IDIxNTAwMDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJjPWR2Yl9wbGxfY29uZmlndXJlKCZkdmJfcGxsX3BoaWxpcHNfc2QxODc4X3RkYTgyNjEsIGJ1ZiwKKwkJCXBhcmFtcy0+ZnJlcXVlbmN5LCAwKTsKKwlpZihyYyA8IDApIHJldHVybiByYzsKKworCWlmKGkyY190cmFuc2ZlcihpMmMsICZ0dW5lcl9tc2csIDEpICE9IDEpCisJCXJldHVybiAtRUlPOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGhpbGlwc19zZDE4NzhfY2lfc2V0X3N5bWJvbF9yYXRlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQl1MzIgc3JhdGUsIHUzMiByYXRpbykKK3sKKwl1OCBhY2xrID0gMDsKKwl1OCBiY2xrID0gMDsKKwl1OCBtMTsKKworCWFjbGsgPSAweGI1OworCWlmIChzcmF0ZSA8IDIwMDAwMDApCisJCWJjbGsgPSAweDg2OworCWVsc2UgaWYgKHNyYXRlIDwgNTAwMDAwMCkKKwkJYmNsayA9IDB4ODk7CisJZWxzZSBpZiAoc3JhdGUgPCAxNTAwMDAwMCkKKwkJYmNsayA9IDB4OGY7CisJZWxzZSBpZiAoc3JhdGUgPCA0NTAwMDAwMCkKKwkJYmNsayA9IDB4OTU7CisKKwltMSA9IDB4MTQ7CisJaWYgKHNyYXRlIDwgNDAwMDAwMCkKKwkJbTEgPSAweDEwOworCisJc3R2MDI5OV93cml0ZXJlZyhmZSwgMHgwZSwgMHgyMyk7CisJc3R2MDI5OV93cml0ZXJlZyhmZSwgMHgwZiwgMHg5NCk7CisJc3R2MDI5OV93cml0ZXJlZyhmZSwgMHgxMCwgMHgzOSk7CisJc3R2MDI5OV93cml0ZXJlZyhmZSwgMHgxMywgYWNsayk7CisJc3R2MDI5OV93cml0ZXJlZyhmZSwgMHgxNCwgYmNsayk7CisJc3R2MDI5OV93cml0ZXJlZyhmZSwgMHgxNSwgMHhjOSk7CisJc3R2MDI5OV93cml0ZXJlZyhmZSwgMHgxZiwgKHJhdGlvID4+IDE2KSAmIDB4ZmYpOworCXN0djAyOTlfd3JpdGVyZWcoZmUsIDB4MjAsIChyYXRpbyA+PiA4KSAmIDB4ZmYpOworCXN0djAyOTlfd3JpdGVyZWcoZmUsIDB4MjEsIChyYXRpbykgJiAweGYwKTsKKwlzdHYwMjk5X3dyaXRlcmVnKGZlLCAweDBmLCAweDgwIHwgbTEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3R2MDI5OV9jb25maWcgcGhpbGlwc19zZDE4NzhfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHg2OCwKKwkuaW5pdHRhYiA9IHBoaWxpcHNfc2QxODc4X2luaXR0YWIsCisJLm1jbGsgPSA4ODAwMDAwMFVMLAorCS5pbnZlcnQgPSAwLAorCS5za2lwX3JlaW5pdCA9IDAsCisJLmxvY2tfb3V0cHV0ID0gU1RWMDIyOV9MT0NLT1VUUFVUXzEsCisJLnZvbHQxM19vcDBfb3AxID0gU1RWMDI5OV9WT0xUMTNfT1AwLAorCS5taW5fZGVsYXlfbXMgPSAxMDAsCisJLnNldF9zeW1ib2xfcmF0ZSA9IHBoaWxpcHNfc2QxODc4X2NpX3NldF9zeW1ib2xfcmF0ZSwKKwkucGxsX3NldCA9IHBoaWxpcHNfc2QxODc4X3RkYTgyNjFfcGxsX3NldCwKK307CiAKIHN0YXRpYyB1OCByZWFkX3B3bShzdHJ1Y3QgYnVkZ2V0X2F2ICpidWRnZXRfYXYpCiB7CkBAIC03MjIsNyArOTk2LDEwIEBACiAjZGVmaW5lIFNVQklEX0RWQlNfS05DMV9QTFVTCTB4MDAxMQogI2RlZmluZSBTVUJJRF9EVkJTX1RZUEhPT04JMHg0ZjU2CiAjZGVmaW5lIFNVQklEX0RWQlNfQ0lORVJHWTEyMDAJMHgxMTU0CisjZGVmaW5lIFNVQklEX0RWQlNfQ1lORVJHWTEyMDBOIDB4MTE1NQogCisjZGVmaW5lIFNVQklEX0RWQlNfVFZfU1RBUgkweDAwMTQKKyNkZWZpbmUgU1VCSURfRFZCU19UVl9TVEFSX0NJCTB4MDAxNgogI2RlZmluZSBTVUJJRF9EVkJDX0tOQzEJCTB4MDAyMAogI2RlZmluZSBTVUJJRF9EVkJDX0tOQzFfUExVUwkweDAwMjEKICNkZWZpbmUgU1VCSURfRFZCQ19DSU5FUkdZMTIwMAkweDExNTYKQEAgLTc0OSw2ICsxMDI2LDIyIEBACiAJc3dpdGNoIChzYWEtPnBjaS0+c3Vic3lzdGVtX2RldmljZSkgewogCiAJY2FzZSBTVUJJRF9EVkJTX0tOQzE6CisJCWlmIChzYWEtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDE4OTQpIHsKKwkJCWZlID0gc3R2MDI5OV9hdHRhY2goJmNpbmVyZ3lfMTIwMHNfMTg5NF8wMDEwX2NvbmZpZywKKwkJCQkJICAgICAmYnVkZ2V0X2F2LT5idWRnZXQuaTJjX2FkYXApOworCQl9IGVsc2UgeworCQkJZmUgPSBzdHYwMjk5X2F0dGFjaCgmdHlwaG9vbl9jb25maWcsCisJCQkJCSAgICAgJmJ1ZGdldF9hdi0+YnVkZ2V0LmkyY19hZGFwKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU1VCSURfRFZCU19UVl9TVEFSOgorCWNhc2UgU1VCSURfRFZCU19UVl9TVEFSX0NJOgorCWNhc2UgU1VCSURfRFZCU19DWU5FUkdZMTIwME46CisJCWZlID0gc3R2MDI5OV9hdHRhY2goJnBoaWxpcHNfc2QxODc4X2NvbmZpZywKKwkJCQkmYnVkZ2V0X2F2LT5idWRnZXQuaTJjX2FkYXApOworCQlicmVhazsKKwogCWNhc2UgU1VCSURfRFZCU19LTkMxX1BMVVM6CiAJY2FzZSBTVUJJRF9EVkJTX1RZUEhPT046CiAJCWZlID0gc3R2MDI5OV9hdHRhY2goJnR5cGhvb25fY29uZmlnLApAQCAtODU0LDExICsxMTQ3LDkgQEAKIAogCWRwcmludGsoMiwgImRldjogJXBcbiIsIGRldik7CiAKLQlpZiAoIShidWRnZXRfYXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYnVkZ2V0X2F2KSwgR0ZQX0tFUk5FTCkpKQorCWlmICghKGJ1ZGdldF9hdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidWRnZXRfYXYpLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbWVtc2V0KGJ1ZGdldF9hdiwgMCwgc2l6ZW9mKHN0cnVjdCBidWRnZXRfYXYpKTsKLQogCWJ1ZGdldF9hdi0+aGFzX3NhYTcxMTMgPSAwOwogCWJ1ZGdldF9hdi0+YnVkZ2V0LmNpX3ByZXNlbnQgPSAwOwogCkBAIC05OTMsMjIgKzEyODQsMjggQEAKIE1BS0VfQlVER0VUX0lORk8oa25jMXMsICJLTkMxIERWQi1TIiwgQlVER0VUX0tOQzFTKTsKIE1BS0VfQlVER0VUX0lORk8oa25jMWMsICJLTkMxIERWQi1DIiwgQlVER0VUX0tOQzFDKTsKIE1BS0VfQlVER0VUX0lORk8oa25jMXQsICJLTkMxIERWQi1UIiwgQlVER0VUX0tOQzFUKTsKK01BS0VfQlVER0VUX0lORk8oa25jeHMsICJLTkMgVFYgU1RBUiBEVkItUyIsIEJVREdFVF9UVlNUQVIpOwogTUFLRV9CVURHRVRfSU5GTyhrbmMxc3AsICJLTkMxIERWQi1TIFBsdXMiLCBCVURHRVRfS05DMVNQKTsKIE1BS0VfQlVER0VUX0lORk8oa25jMWNwLCAiS05DMSBEVkItQyBQbHVzIiwgQlVER0VUX0tOQzFDUCk7CiBNQUtFX0JVREdFVF9JTkZPKGtuYzF0cCwgIktOQzEgRFZCLVQgUGx1cyIsIEJVREdFVF9LTkMxVFApOwogTUFLRV9CVURHRVRfSU5GTyhjaW4xMjAwcywgIlRlcnJhVGVjIENpbmVyZ3kgMTIwMCBEVkItUyIsIEJVREdFVF9DSU4xMjAwUyk7CitNQUtFX0JVREdFVF9JTkZPKGNpbjEyMDBzbiwgIlRlcnJhVGVjIENpbmVyZ3kgMTIwMCBEVkItUyIsIEJVREdFVF9DSU4xMjAwUyk7CiBNQUtFX0JVREdFVF9JTkZPKGNpbjEyMDBjLCAiVGVycmF0ZWMgQ2luZXJneSAxMjAwIERWQi1DIiwgQlVER0VUX0NJTjEyMDBDKTsKIE1BS0VfQlVER0VUX0lORk8oY2luMTIwMHQsICJUZXJyYXRlYyBDaW5lcmd5IDEyMDAgRFZCLVQiLCBCVURHRVRfQ0lOMTIwMFQpOwogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpX3RibFtdID0gewogCU1BS0VfRVhURU5TSU9OX1BDSShrbmMxcywgMHgxMTMxLCAweDRmNTYpLAogCU1BS0VfRVhURU5TSU9OX1BDSShrbmMxcywgMHgxMTMxLCAweDAwMTApLAorCU1BS0VfRVhURU5TSU9OX1BDSShrbmMxcywgMHgxODk0LCAweDAwMTApLAogCU1BS0VfRVhURU5TSU9OX1BDSShrbmMxc3AsIDB4MTEzMSwgMHgwMDExKSwKKwlNQUtFX0VYVEVOU0lPTl9QQ0koa25jeHMsIDB4MTg5NCwgMHgwMDE0KSwKKwlNQUtFX0VYVEVOU0lPTl9QQ0koa25jeHMsIDB4MTg5NCwgMHgwMDE2KSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0koa25jMWMsIDB4MTg5NCwgMHgwMDIwKSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0koa25jMWNwLCAweDE4OTQsIDB4MDAyMSksCiAJTUFLRV9FWFRFTlNJT05fUENJKGtuYzF0LCAweDE4OTQsIDB4MDAzMCksCiAJTUFLRV9FWFRFTlNJT05fUENJKGtuYzF0cCwgMHgxODk0LCAweDAwMzEpLAogCU1BS0VfRVhURU5TSU9OX1BDSShjaW4xMjAwcywgMHgxNTNiLCAweDExNTQpLAorCU1BS0VfRVhURU5TSU9OX1BDSShjaW4xMjAwc24sIDB4MTUzYiwgMHgxMTU1KSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0koY2luMTIwMGMsIDB4MTUzYiwgMHgxMTU2KSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0koY2luMTIwMHQsIDB4MTUzYiwgMHgxMTU3KSwKIAl7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY29yZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNvcmUuYwppbmRleCAwMTdmY2JjLi42MzNlNjhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jb3JlLmMKQEAgLTQwNCw5ICs0MDQsNyBAQAogCXRhc2tsZXRfaW5pdCgmYnVkZ2V0LT52cGVfdGFza2xldCwgdnBlaXJxLCAodW5zaWduZWQgbG9uZykgYnVkZ2V0KTsKIAogCS8qIGZyb250ZW5kIHBvd2VyIG9uICovCi0JaWYgKGJpLT50eXBlID09IEJVREdFVF9GU19BQ1RJVlkpCi0JCXNhYTcxNDZfc2V0Z3BpbyhkZXYsIDEsIFNBQTcxNDZfR1BJT19PVVRISSk7Ci0JZWxzZQorCWlmIChiaS0+dHlwZSAhPSBCVURHRVRfRlNfQUNUSVZZKQogCQlzYWE3MTQ2X3NldGdwaW8oZGV2LCAyLCBTQUE3MTQ2X0dQSU9fT1VUSEkpOwogCiAJaWYgKGJ1ZGdldF9yZWdpc3RlcihidWRnZXQpID09IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMKaW5kZXggZmFmZTY0MC4uMjM4Yzc3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMKQEAgLTExMiw2ICsxMTIsNyBAQAogICogICBSb3V0aW5lcyBmb3IgdGhlIEZ1aml0c3UgU2llbWVucyBBY3RpdnkgYnVkZ2V0IGNhcmQKICAqICAgMjIga0h6IHRvbmUgYW5kIERpU0VxQyBhcmUgaGFuZGxlZCBieSB0aGUgZnJvbnRlbmQuCiAgKiAgIFZvbHRhZ2UgbXVzdCBiZSBzZXQgaGVyZS4KKyAqICAgR1BJTyAxOiBMTkJQIEVOLCBHUElPIDI6IExOQlAgVlNFTAogICovCiBzdGF0aWMgaW50IFNldFZvbHRhZ2VfQWN0aXZ5IChzdHJ1Y3QgYnVkZ2V0ICpidWRnZXQsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSkKIHsKQEAgLTEyMSwxMSArMTIyLDE2IEBACiAKIAlzd2l0Y2ggKHZvbHRhZ2UpIHsKIAkJY2FzZSBTRUNfVk9MVEFHRV8xMzoKKwkJCXNhYTcxNDZfc2V0Z3BpbyhkZXYsIDEsIFNBQTcxNDZfR1BJT19PVVRISSk7CiAJCQlzYWE3MTQ2X3NldGdwaW8oZGV2LCAyLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOwogCQkJYnJlYWs7CiAJCWNhc2UgU0VDX1ZPTFRBR0VfMTg6CisJCQlzYWE3MTQ2X3NldGdwaW8oZGV2LCAxLCBTQUE3MTQ2X0dQSU9fT1VUSEkpOwogCQkJc2FhNzE0Nl9zZXRncGlvKGRldiwgMiwgU0FBNzE0Nl9HUElPX09VVEhJKTsKIAkJCWJyZWFrOworCQljYXNlIFNFQ19WT0xUQUdFX09GRjoKKwkJCXNhYTcxNDZfc2V0Z3BpbyhkZXYsIDEsIFNBQTcxNDZfR1BJT19PVVRMTyk7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTIwNiw3ICsyMTIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGxuYnAyMV9lbmFibGVfaGlnaF9sbmJfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IGFyZykKK3N0YXRpYyBpbnQgbG5icDIxX2VuYWJsZV9oaWdoX2xuYl92b2x0YWdlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgYnVkZ2V0KiBidWRnZXQgPSAoc3RydWN0IGJ1ZGdldCopIGZlLT5kdmItPnByaXY7CiAJdTggYnVmOwpAQCAtNTgwLDYgKzU4Niw3IEBACiAJCWlmIChidWRnZXQtPmR2Yl9mcm9udGVuZCkgewogCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy0+c2V0X3ZvbHRhZ2UgPSBsbmJwMjFfc2V0X3ZvbHRhZ2U7CiAJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLT5lbmFibGVfaGlnaF9sbmJfdm9sdGFnZSA9IGxuYnAyMV9lbmFibGVfaGlnaF9sbmJfdm9sdGFnZTsKKwkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQgPSBOVUxMOwogCQkJaWYgKGxuYnAyMV9pbml0KGJ1ZGdldCkpIHsKIAkJCQlwcmludGsoIiVzOiBObyBMTkJQMjEgZm91bmQhXG4iLCBfX0ZVTkNUSU9OX18pOwogCQkJCWdvdG8gZXJyb3Jfb3V0OwpAQCAtNjI0LDcgKzYzMSw3IEBACiAJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kID0gc3R2MDI5OV9hdHRhY2goJmFscHNfYnNydTZfY29uZmlnLCAmYnVkZ2V0LT5pMmNfYWRhcCk7CiAJCWlmIChidWRnZXQtPmR2Yl9mcm9udGVuZCkgewogCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy0+c2V0X3ZvbHRhZ2UgPSBzaWVtZW5zX2J1ZGdldF9zZXRfdm9sdGFnZTsKLQkJCWJyZWFrOworCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy0+ZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZCA9IE5VTEw7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTYzMiw3ICs2MzksNyBAQAogCQlidWRnZXQtPmR2Yl9mcm9udGVuZCA9IHRkYTgwODNfYXR0YWNoKCZncnVuZGlnXzI5NTA0XzQ1MV9jb25maWcsICZidWRnZXQtPmkyY19hZGFwKTsKIAkJaWYgKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kKSB7CiAJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLT5zZXRfdm9sdGFnZSA9IHNpZW1lbnNfYnVkZ2V0X3NldF92b2x0YWdlOwotCQkJYnJlYWs7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLT5kaXNobmV0d29ya19zZW5kX2xlZ2FjeV9jb21tYW5kID0gTlVMTDsKIAkJfQogCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmggYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuaAppbmRleCBjOGQ0OGNmLi5jN2JiNjNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuaApAQCAtOTUsNiArOTUsNyBAQAogI2RlZmluZSBCVURHRVRfS05DMVNQCQkgICAxMQogI2RlZmluZSBCVURHRVRfS05DMUNQCQkgICAxMgogI2RlZmluZSBCVURHRVRfS05DMVRQCQkgICAxMworI2RlZmluZSBCVURHRVRfVFZTVEFSCQkgICAxNAogCiAjZGVmaW5lIEJVREdFVF9WSURFT19QT1JUQSAgICAgICAgIDAKICNkZWZpbmUgQlVER0VUX1ZJREVPX1BPUlRCICAgICAgICAgMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvdHRwY2ktZWVwcm9tLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS90dHBjaS1lZXByb20uYwppbmRleCAxOGFhMjJiLi4xZjMxZTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS90dHBjaS1lZXByb20uYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS90dHBjaS1lZXByb20uYwpAQCAtMTMsNyArMTMsNyBAQAogICAgIEhvbGdlciBXYWVjaHRsZXIJQ29udmVyZ2VuY2UKIAogICAgIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIFJhbHBoIE1ldHpsZXIgPHJqa21AbWV0emxlcmJyb3MuZGU+Ci0JCSAgICAgICAgICAgIE1ldHpsZXIgQnJvdGhlcnMgU3lzdGVtZW50d2lja2x1bmcgR2JSCisJCQkgICAgTWV0emxlciBCcm90aGVycyBTeXN0ZW1lbnR3aWNrbHVuZyBHYlIKIAogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L0tjb25maWcKaW5kZXggYzZjMWQ0MS4uOTE0NTg3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L0tjb25maWcKQEAgLTEwLDcgKzEwLDcgQEAKIAkgIFN1cHBvcnQgZm9yIGV4dGVybmFsIFVTQiBhZGFwdGVycyBkZXNpZ25lZCBieSBUZWNobm90cmVuZCBhbmQKIAkgIHByb2R1Y2VkIGJ5IEhhdXBwYXVnZSwgc2hpcHBlZCB1bmRlciB0aGUgYnJhbmQgbmFtZSAnTm92YS1VU0InLgogCi0gICAgICAgICAgVGhlc2UgZGV2aWNlcyBkb24ndCBoYXZlIGEgTVBFRyBkZWNvZGVyIGJ1aWx0IGluLCBzbyB5b3UgbmVlZAorCSAgVGhlc2UgZGV2aWNlcyBkb24ndCBoYXZlIGEgTVBFRyBkZWNvZGVyIGJ1aWx0IGluLCBzbyB5b3UgbmVlZAogCSAgYW4gZXh0ZXJuYWwgc29mdHdhcmUgZGVjb2RlciB0byB3YXRjaCBUVi4KIAogCSAgU2F5IFkgaWYgeW91IG93biBzdWNoIGEgZGV2aWNlIGFuZCB3YW50IHRvIHVzZSBpdC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9kdmItdHR1c2ItYnVkZ2V0LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1idWRnZXQvZHZiLXR0dXNiLWJ1ZGdldC5jCmluZGV4IDEwNGRmNjEuLjVhMTNjNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9kdmItdHR1c2ItYnVkZ2V0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L2R2Yi10dHVzYi1idWRnZXQuYwpAQCAtMTQ4OSwxMSArMTQ4OSw5IEBACiAKIAlpZiAoaW50Zi0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyICE9IDEpIHJldHVybiAtRU5PREVWOwogCi0JaWYgKCEodHR1c2IgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHR1c2IpLCBHRlBfS0VSTkVMKSkpCisJaWYgKCEodHR1c2IgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHR1c2IpLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbWVtc2V0KHR0dXNiLCAwLCBzaXplb2Yoc3RydWN0IHR0dXNiKSk7Ci0KIAl0dHVzYi0+ZGV2ID0gdWRldjsKIAl0dHVzYi0+YyA9IDA7CiAJdHR1c2ItPm11eF9zdGF0ZSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy9LY29uZmlnCmluZGV4IGMzMzQ1MjYuLjgzNjExMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy9LY29uZmlnCkBAIC04LDE0ICs4LDE1IEBACiAJICBwcm9kdWNlZCBieSBIYXVwcGF1Z2UsIHNoaXBwZWQgdW5kZXIgdGhlIGJyYW5kIG5hbWUgJ0RFQzIwMDAtdCcKIAkgIGFuZCAnREVDMzAwMC1zJy4KIAotICAgICAgICAgIEV2ZW4gaWYgdGhlc2UgZGV2aWNlcyBoYXZlIGEgTVBFRyBkZWNvZGVyIGJ1aWx0IGluLCB0aGV5IHRyYW5zbWl0CisJICBFdmVuIGlmIHRoZXNlIGRldmljZXMgaGF2ZSBhIE1QRUcgZGVjb2RlciBidWlsdCBpbiwgdGhleSB0cmFuc21pdAogCSAgb25seSBjb21wcmVzc2VkIE1QRUcgZGF0YSBvdmVyIHRoZSBVU0IgYnVzLCBzbyB5b3UgbmVlZAogCSAgYW4gZXh0ZXJuYWwgc29mdHdhcmUgZGVjb2RlciB0byB3YXRjaCBUViBvbiB5b3VyIGNvbXB1dGVyLgogCi0gICAgICAgICAgVGhpcyBkcml2ZXIgbmVlZHMgZXh0ZXJuYWwgZmlybXdhcmUuIFBsZWFzZSB1c2UgdGhlIGNvbW1hbmRzCi0gICAgICAgICAgIjxrZXJuZWxkaXI+L0RvY3VtZW50YXRpb24vZHZiL2dldF9kdmJfZmlybXdhcmUgZGVjMjAwMHQiLAotICAgICAgICAgICI8a2VybmVsZGlyPi9Eb2N1bWVudGF0aW9uL2R2Yi9nZXRfZHZiX2Zpcm13YXJlIGRlYzI1NDB0IiwKLSAgICAgICAgICAiPGtlcm5lbGRpcj4vRG9jdW1lbnRhdGlvbi9kdmIvZ2V0X2R2Yl9maXJtd2FyZSBkZWMzMDAwcyIsCi0gICAgICAgICAgZG93bmxvYWQvZXh0cmFjdCB0aGVtLCBhbmQgdGhlbiBjb3B5IHRoZW0gdG8gL3Vzci9saWIvaG90cGx1Zy9maXJtd2FyZS4KKwkgIFRoaXMgZHJpdmVyIG5lZWRzIGV4dGVybmFsIGZpcm13YXJlLiBQbGVhc2UgdXNlIHRoZSBjb21tYW5kcworCSAgIjxrZXJuZWxkaXI+L0RvY3VtZW50YXRpb24vZHZiL2dldF9kdmJfZmlybXdhcmUgZGVjMjAwMHQiLAorCSAgIjxrZXJuZWxkaXI+L0RvY3VtZW50YXRpb24vZHZiL2dldF9kdmJfZmlybXdhcmUgZGVjMjU0MHQiLAorCSAgIjxrZXJuZWxkaXI+L0RvY3VtZW50YXRpb24vZHZiL2dldF9kdmJfZmlybXdhcmUgZGVjMzAwMHMiLAorCSAgZG93bmxvYWQvZXh0cmFjdCB0aGVtLCBhbmQgdGhlbiBjb3B5IHRoZW0gdG8gL3Vzci9saWIvaG90cGx1Zy9maXJtd2FyZQorCSAgb3IgL2xpYi9maXJtd2FyZSAoZGVwZW5kaW5nIG9uIGNvbmZpZ3VyYXRpb24gb2YgZmlybXdhcmUgaG90cGx1ZykuCiAKIAkgIFNheSBZIGlmIHlvdSBvd24gc3VjaCBhIGRldmljZSBhbmQgd2FudCB0byB1c2UgaXQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JfZGVjLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JfZGVjLmMKaW5kZXggOGFiYzIxOC4uZGY4MzExNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiX2RlYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYwpAQCAtMzY5LDcgKzM2OSw3IEBACiAKIHN0YXRpYyBpbnQgdHR1c2JfZGVjX2F1ZGlvX3BlczJ0c19jYih2b2lkICpwcml2LCB1bnNpZ25lZCBjaGFyICpkYXRhKQogewotCXN0cnVjdCB0dHVzYl9kZWMgKmRlYyA9IChzdHJ1Y3QgdHR1c2JfZGVjICopcHJpdjsKKwlzdHJ1Y3QgdHR1c2JfZGVjICpkZWMgPSBwcml2OwogCiAJZGVjLT5hdWRpb19maWx0ZXItPmZlZWQtPmNiLnRzKGRhdGEsIDE4OCwgTlVMTCwgMCwKIAkJCQkgICAgICAgJmRlYy0+YXVkaW9fZmlsdGVyLT5mZWVkLT5mZWVkLnRzLApAQCAtMzgwLDcgKzM4MCw3IEBACiAKIHN0YXRpYyBpbnQgdHR1c2JfZGVjX3ZpZGVvX3BlczJ0c19jYih2b2lkICpwcml2LCB1bnNpZ25lZCBjaGFyICpkYXRhKQogewotCXN0cnVjdCB0dHVzYl9kZWMgKmRlYyA9IChzdHJ1Y3QgdHR1c2JfZGVjICopcHJpdjsKKwlzdHJ1Y3QgdHR1c2JfZGVjICpkZWMgPSBwcml2OwogCiAJZGVjLT52aWRlb19maWx0ZXItPmZlZWQtPmNiLnRzKGRhdGEsIDE4OCwgTlVMTCwgMCwKIAkJCQkgICAgICAgJmRlYy0+dmlkZW9fZmlsdGVyLT5mZWVkLT5mZWVkLnRzLApAQCAtOTY1LDggKzk2NSw4IEBACiAKIAljYXNlIERNWF9UU19QRVNfVEVMRVRFWFQ6CiAJCWRlYy0+cGlkW0RNWF9QRVNfVEVMRVRFWFRdID0gZHZiZG14ZmVlZC0+cGlkOwotCQlkcHJpbnRrKCIgIHBlc190eXBlOiBETVhfVFNfUEVTX1RFTEVURVhUXG4iKTsKLQkJYnJlYWs7CisJCWRwcmludGsoIiAgcGVzX3R5cGU6IERNWF9UU19QRVNfVEVMRVRFWFQobm90IHN1cHBvcnRlZClcbiIpOworCQlyZXR1cm4gLUVOT1NZUzsKIAogCWNhc2UgRE1YX1RTX1BFU19QQ1I6CiAJCWRwcmludGsoIiAgcGVzX3R5cGU6IERNWF9UU19QRVNfUENSXG4iKTsKQEAgLTk3NSw4ICs5NzUsOCBAQAogCQlicmVhazsKIAogCWNhc2UgRE1YX1RTX1BFU19PVEhFUjoKLQkJZHByaW50aygiICBwZXNfdHlwZTogRE1YX1RTX1BFU19PVEhFUlxuIik7Ci0JCWJyZWFrOworCQlkcHJpbnRrKCIgIHBlc190eXBlOiBETVhfVFNfUEVTX09USEVSKG5vdCBzdXBwb3J0ZWQpXG4iKTsKKwkJcmV0dXJuIC1FTk9TWVM7CiAKIAlkZWZhdWx0OgogCQlkcHJpbnRrKCIgIHBlc190eXBlOiB1bmtub3duICglZClcbiIsIGR2YmRteGZlZWQtPnBlc190eXBlKTsKQEAgLTExODIsNyArMTE4Miw3IEBACiAJCSAgICAgKHVuc2lnbmVkIGxvbmcpZGVjKTsKIH0KIAotc3RhdGljIGludCB0dHVzYl9pbml0X3JjKHN0cnVjdCB0dHVzYl9kZWMgKmRlYykKK3N0YXRpYyBpbnQgdHR1c2JfaW5pdF9yYyggc3RydWN0IHR0dXNiX2RlYyAqZGVjKQogewogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKIAl1OCBiW10gPSB7IDB4MDAsIDB4MDEgfTsKQEAgLTEyMDMsMTMgKzEyMDMsMTIgQEAKIAlpbnB1dF9kZXYtPmtleWNvZGUgPSByY19rZXlzOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmNfa2V5cyk7IGkrKykKLQkJc2V0X2JpdChyY19rZXlzW2ldLCBpbnB1dF9kZXYtPmtleWJpdCk7CisJCSAgc2V0X2JpdChyY19rZXlzW2ldLCBpbnB1dF9kZXYtPmtleWJpdCk7CiAKIAlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKIAogCWlmICh1c2Jfc3VibWl0X3VyYihkZWMtPmlycV91cmIsIEdGUF9LRVJORUwpKQogCQlwcmludGsoIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWRcbiIsX19GVU5DVElPTl9fKTsKLQogCS8qIGVuYWJsZSBpcnEgcGlwZSAqLwogCXR0dXNiX2RlY19zZW5kX2NvbW1hbmQoZGVjLDB4YjAsc2l6ZW9mKGIpLGIsTlVMTCxOVUxMKTsKIApAQCAtMTM5NSw2ICsxMzk0LDcgQEAKIAkJCS8qIFdlIGNhbid0IHRydXN0IHRoZSBVU0IgSURzIHRoYXQgc29tZSBmaXJtd2FyZXMKIAkJCSAgIGdpdmUgdGhlIGJveCAqLwogCQkJc3dpdGNoIChtb2RlbCkgeworCQkJY2FzZSAweDAwMDcwMDAxOgogCQkJY2FzZSAweDAwMDcwMDA4OgogCQkJY2FzZSAweDAwMDcwMDBjOgogCQkJCXR0dXNiX2RlY19zZXRfbW9kZWwoZGVjLCBUVFVTQl9ERUMzMDAwUyk7CkBAIC0xNTg4LDcgKzE1ODgsNyBAQAogCQkJICAgaW50IHBhcmFtX2xlbmd0aCwgY29uc3QgdTggcGFyYW1zW10sCiAJCQkgICBpbnQgKnJlc3VsdF9sZW5ndGgsIHU4IGNtZF9yZXN1bHRbXSkKIHsKLQlzdHJ1Y3QgdHR1c2JfZGVjKiBkZWMgPSAoc3RydWN0IHR0dXNiX2RlYyopIGZlLT5kdmItPnByaXY7CisJc3RydWN0IHR0dXNiX2RlYyogZGVjID0gZmUtPmR2Yi0+cHJpdjsKIAlyZXR1cm4gdHR1c2JfZGVjX3NlbmRfY29tbWFuZChkZWMsIGNvbW1hbmQsIHBhcmFtX2xlbmd0aCwgcGFyYW1zLCByZXN1bHRfbGVuZ3RoLCBjbWRfcmVzdWx0KTsKIH0KIApAQCAtMTYwNiwxNSArMTYwNiwxMyBAQAogCiAJdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CiAKLQlpZiAoIShkZWMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHR1c2JfZGVjKSwgR0ZQX0tFUk5FTCkpKSB7CisJaWYgKCEoZGVjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHR0dXNiX2RlYyksIEdGUF9LRVJORUwpKSkgewogCQlwcmludGsoIiVzOiBjb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkuXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAl1c2Jfc2V0X2ludGZkYXRhKGludGYsICh2b2lkICopZGVjKTsKIAotCW1lbXNldChkZWMsIDAsIHNpemVvZihzdHJ1Y3QgdHR1c2JfZGVjKSk7Ci0KIAlzd2l0Y2ggKGxlMTZfdG9fY3B1KGlkLT5pZFByb2R1Y3QpKSB7CiAJY2FzZSAweDEwMDY6CiAJCXR0dXNiX2RlY19zZXRfbW9kZWwoZGVjLCBUVFVTQl9ERUMzMDAwUyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JkZWNmZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiZGVjZmUuYwppbmRleCA3MjVhZjNhLi5hNWE0NjE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JkZWNmZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYmRlY2ZlLmMKQEAgLTQyLDggKzQyLDM5IEBACiAKIHN0YXRpYyBpbnQgdHR1c2JkZWNmZV9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc3RhdHVzX3QqIHN0YXR1cykKIHsKLQkqc3RhdHVzID0gRkVfSEFTX1NJR05BTCB8IEZFX0hBU19WSVRFUkJJIHwKLQkJICBGRV9IQVNfU1lOQyB8IEZFX0hBU19DQVJSSUVSIHwgRkVfSEFTX0xPQ0s7CisJc3RydWN0IHR0dXNiZGVjZmVfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggYltdID0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkgICAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CisJdTggcmVzdWx0WzRdOworCWludCBsZW4sIHJldDsKKworCSpzdGF0dXM9MDsKKworCXJldD1zdGF0ZS0+Y29uZmlnLT5zZW5kX2NvbW1hbmQoZmUsIDB4NzMsIHNpemVvZihiKSwgYiwgJmxlbiwgcmVzdWx0KTsKKwlpZihyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZihsZW4gIT0gNCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmV4cGVjdGVkIHJlcGx5XG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzd2l0Y2gocmVzdWx0WzNdKSB7CisJCWNhc2UgMTogIC8qIG5vdCB0dW5lZCB5ZXQgKi8KKwkJY2FzZSAyOiAgLyogbm8gc2lnbmFsL25vIGxvY2sqLworCQkJYnJlYWs7CisJCWNhc2UgMzoJIC8qIHNpZ25hbCBmb3VuZCBhbmQgbG9ja2VkKi8KKwkJCSpzdGF0dXMgPSBGRV9IQVNfU0lHTkFMIHwgRkVfSEFTX1ZJVEVSQkkgfAorCQkJRkVfSEFTX1NZTkMgfCBGRV9IQVNfQ0FSUklFUiB8IEZFX0hBU19MT0NLOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCSpzdGF0dXMgPSBGRV9USU1FRE9VVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfaW5mbygiJXM6IHJldHVybmVkIHVua25vd24gdmFsdWU6ICVkXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgcmVzdWx0WzNdKTsKKwkJCXJldHVybiAtRUlPOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtNjQsNiArOTUsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB0dHVzYmRlY2ZlX2R2YnRfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJCXN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyogZmVzZXR0aW5ncykKK3sKKwkJZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gMTUwMDsKKwkJLyogRHJpZnQgY29tcGVuc2F0aW9uIG1ha2VzIG5vIHNlbnNlIGZvciBEVkItVCAqLworCQlmZXNldHRpbmdzLT5zdGVwX3NpemUgPSAwOworCQlmZXNldHRpbmdzLT5tYXhfZHJpZnQgPSAwOworCQlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCB0dHVzYmRlY2ZlX2R2YnNfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCiB7CiAJc3RydWN0IHR0dXNiZGVjZmVfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCB0dHVzYmRlY2ZlX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CkBAIC0yMTIsNiArMjUzLDggQEAKIAogCS5zZXRfZnJvbnRlbmQgPSB0dHVzYmRlY2ZlX2R2YnRfc2V0X2Zyb250ZW5kLAogCisJLmdldF90dW5lX3NldHRpbmdzID0gdHR1c2JkZWNmZV9kdmJ0X2dldF90dW5lX3NldHRpbmdzLAorCiAJLnJlYWRfc3RhdHVzID0gdHR1c2JkZWNmZV9yZWFkX3N0YXR1cywKIH07CiAKQEAgLTIyMywxMSArMjY2LDExIEBACiAJCS5mcmVxdWVuY3lfbWluCQk9IDk1MDAwMCwKIAkJLmZyZXF1ZW5jeV9tYXgJCT0gMjE1MDAwMCwKIAkJLmZyZXF1ZW5jeV9zdGVwc2l6ZQk9IDEyNSwKKwkJLnN5bWJvbF9yYXRlX21pbiAgICAgICAgPSAxMDAwMDAwLCAgLyogZ3Vlc3NlZCAqLworCQkuc3ltYm9sX3JhdGVfbWF4ICAgICAgICA9IDQ1MDAwMDAwLCAvKiBndWVzc2VkICovCiAJCS5jYXBzID0JRkVfQ0FOX0ZFQ18xXzIgfCBGRV9DQU5fRkVDXzJfMyB8IEZFX0NBTl9GRUNfM180IHwKIAkJCUZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ183XzggfCBGRV9DQU5fRkVDX0FVVE8gfAotCQkJRkVfQ0FOX1FBTV8xNiB8IEZFX0NBTl9RQU1fNjQgfCBGRV9DQU5fUUFNX0FVVE8gfAotCQkJRkVfQ0FOX1RSQU5TTUlTU0lPTl9NT0RFX0FVVE8gfCBGRV9DQU5fR1VBUkRfSU5URVJWQUxfQVVUTyB8Ci0JCQlGRV9DQU5fSElFUkFSQ0hZX0FVVE8sCisJCQlGRV9DQU5fUVBTSwogCX0sCiAKIAkucmVsZWFzZSA9IHR0dXNiZGVjZmVfcmVsZWFzZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vbWlyb3BjbTIwLXJhZGlvLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL21pcm9wY20yMC1yYWRpby5jCmluZGV4IGMyZWJlODcuLmRjMjkyZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vbWlyb3BjbTIwLXJhZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9taXJvcGNtMjAtcmFkaW8uYwpAQCAtMjIwLDYgKzIyMCw3IEBACiAJLm9wZW4gICAgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX29wZW4sCiAJLnJlbGVhc2UgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UsCiAJLmlvY3RsCQk9IHBjbTIwX2lvY3RsLAorCS5jb21wYXRfaW9jdGwJPSB2NGxfY29tcGF0X2lvY3RsMzIsCiAJLmxsc2VlayAgICAgICAgID0gbm9fbGxzZWVrLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1haW1zbGFiLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWFpbXNsYWIuYwppbmRleCA4NzdjNzcwLi45MTRkZWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWFpbXNsYWIuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWFpbXNsYWIuYwpAQCAtMjk5LDYgKzI5OSw3IEBACiAJLm9wZW4gICAgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX29wZW4sCiAJLnJlbGVhc2UgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UsCiAJLmlvY3RsCSAgICAgICAgPSBydF9pb2N0bCwKKwkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLAogCS5sbHNlZWsgICAgICAgICA9IG5vX2xsc2VlaywKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYXp0ZWNoLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWF6dGVjaC5jCmluZGV4IDUzMTlhOWMuLjUyM2JlODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYXp0ZWNoLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1henRlY2guYwpAQCAtMjU2LDYgKzI1Niw3IEBACiAJLm9wZW4gICAgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX29wZW4sCiAJLnJlbGVhc2UgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UsCiAJLmlvY3RsCQk9IGF6X2lvY3RsLAorCS5jb21wYXRfaW9jdGwJPSB2NGxfY29tcGF0X2lvY3RsMzIsCiAJLmxsc2VlayAgICAgICAgID0gbm9fbGxzZWVrLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1jYWRldC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1jYWRldC5jCmluZGV4IDliMDQwNjMuLmYxYjVhYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tY2FkZXQuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWNhZGV0LmMKQEAgLTQ5MCw2ICs0OTAsNyBAQAogCS5yZWxlYXNlICAgICAgIAk9IGNhZGV0X3JlbGVhc2UsCiAJLnJlYWQJCT0gY2FkZXRfcmVhZCwKIAkuaW9jdGwJCT0gY2FkZXRfaW9jdGwsCisJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKIAkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWdlbXRlay1wY2kuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLXBjaS5jCmluZGV4IDYzMGNjNzguLjhlNDk5YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLXBjaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLXBjaS5jCkBAIC0zMDEsNiArMzAxLDcgQEAKIAkub3BlbiAgICAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfb3BlbiwKIAkucmVsZWFzZSAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfcmVsZWFzZSwKIAkuaW9jdGwJCT0gZ2VtdGVrX3BjaV9pb2N0bCwKKwkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLAogCS5sbHNlZWsgICAgICAgICA9IG5vX2xsc2VlaywKIH07CiAKQEAgLTMxNywxMSArMzE4LDEwIEBACiAJc3RydWN0IGdlbXRla19wY2lfY2FyZCAqY2FyZDsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXZyYWRpbzsKIAotCWlmICggKGNhcmQgPSBrbWFsbG9jKCBzaXplb2YoIHN0cnVjdCBnZW10ZWtfcGNpX2NhcmQgKSwgR0ZQX0tFUk5FTCApKSA9PSBOVUxMICkgeworCWlmICggKGNhcmQgPSBremFsbG9jKCBzaXplb2YoIHN0cnVjdCBnZW10ZWtfcGNpX2NhcmQgKSwgR0ZQX0tFUk5FTCApKSA9PSBOVUxMICkgewogCQlwcmludGsoIEtFUk5fRVJSICJnZW10ZWtfcGNpOiBvdXQgb2YgbWVtb3J5XG4iICk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQoIGNhcmQsIDAsIHNpemVvZiggc3RydWN0IGdlbXRla19wY2lfY2FyZCApICk7CiAKIAlpZiAoIHBjaV9lbmFibGVfZGV2aWNlKCBwY2lfZGV2ICkgKSAKIAkJZ290byBlcnJfcGNpOwpAQCAtMzk0LDcgKzM5NCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGdlbXRla19wY2lfaW5pdF9tb2R1bGUoIHZvaWQgKQogewotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoICZnZW10ZWtfcGNpX2RyaXZlciApOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCAmZ2VtdGVrX3BjaV9kcml2ZXIgKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGdlbXRla19wY2lfY2xlYW51cF9tb2R1bGUoIHZvaWQgKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1nZW10ZWsuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLmMKaW5kZXggNjQxOGYwMy4uNDcxNzNiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1nZW10ZWsuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWdlbXRlay5jCkBAIC0yMzMsNiArMjMzLDcgQEAKIAkub3BlbiAgICAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfb3BlbiwKIAkucmVsZWFzZSAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfcmVsZWFzZSwKIAkuaW9jdGwJCT0gZ2VtdGVrX2lvY3RsLAorCS5jb21wYXRfaW9jdGwJPSB2NGxfY29tcGF0X2lvY3RsMzIsCiAJLmxsc2VlayAgICAgICAgID0gbm9fbGxzZWVrLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tYWVzdHJvLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1hZXN0cm8uYwppbmRleCBlNWUyMDIxLi4zNmM5ZjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1hZXN0cm8uYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1hZXN0cm8uYwpAQCAtMjcsMzQgKzI3LDMwIEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTgkiMC4wNCIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjAuMDUiCiAKLSNkZWZpbmUgUENJX1ZFTkRPUl9FU1MgICAgICAgICAgICAgICAgICAweDEyNUQKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9FU1NfRVNTMTk2OCAgICAgICAweDE5NjggICAgICAgICAgLyogTWFlc3RybyAyICAgICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfRVNTX0VTUzE5NzggICAgICAgMHgxOTc4ICAgICAgICAgIC8qIE1hZXN0cm8gMkUgICAqLwotCi0jZGVmaW5lIEdQSU9fREFUQSAgICAgICAweDYwICAgLyogcG9ydCBvZmZzZXQgZnJvbSBFU1NfSU9fQkFTRSAqLworI2RlZmluZSBHUElPX0RBVEEJMHg2MCAgIC8qIHBvcnQgb2Zmc2V0IGZyb20gRVNTX0lPX0JBU0UgKi8KIAogI2RlZmluZSBJT19NQVNLCQk0ICAgICAgLyogbWFzayAgICAgIHJlZ2lzdGVyIG9mZnNldCBmcm9tIEdQSU9fREFUQQogCQkJCWJpdHMgMT11bm1hc2sgd3JpdGUgdG8gZ2l2ZW4gYml0ICovCiAjZGVmaW5lIElPX0RJUgkJOCAgICAgIC8qIGRpcmVjdGlvbiByZWdpc3RlciBvZmZzZXQgZnJvbSBHUElPX0RBVEEKIAkJCQliaXRzIDAvMT1yZWFkL3dyaXRlIGRpcmVjdGlvbiAqLwogCi0jZGVmaW5lIEdQSU82ICAgICAgICAgICAweDAwNDAgLyogbWFzayBiaXRzIGZvciBHUElPIGxpbmVzICovCi0jZGVmaW5lIEdQSU83ICAgICAgICAgICAweDAwODAKLSNkZWZpbmUgR1BJTzggICAgICAgICAgIDB4MDEwMAotI2RlZmluZSBHUElPOSAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIEdQSU82CQkweDAwNDAgLyogbWFzayBiaXRzIGZvciBHUElPIGxpbmVzICovCisjZGVmaW5lIEdQSU83CQkweDAwODAKKyNkZWZpbmUgR1BJTzgJCTB4MDEwMAorI2RlZmluZSBHUElPOQkJMHgwMjAwCiAKLSNkZWZpbmUgU1RSX0RBVEEgICAgICAgIEdQSU82ICAvKiByYWRpbyBURUE1NzU3IHBpbnMgYW5kIEdQSU8gYml0cyAqLwotI2RlZmluZSBTVFJfQ0xLICAgICAgICAgR1BJTzcKLSNkZWZpbmUgU1RSX1dSRU4gICAgICAgIEdQSU84Ci0jZGVmaW5lIFNUUl9NT1NUICAgICAgICBHUElPOQorI2RlZmluZSBTVFJfREFUQQlHUElPNiAgLyogcmFkaW8gVEVBNTc1NyBwaW5zIGFuZCBHUElPIGJpdHMgKi8KKyNkZWZpbmUgU1RSX0NMSwkJR1BJTzcKKyNkZWZpbmUgU1RSX1dSRU4JR1BJTzgKKyNkZWZpbmUgU1RSX01PU1QJR1BJTzkKIAogI2RlZmluZSBGUkVRX0xPCQkgNTAqMTYwMDAKICNkZWZpbmUgRlJFUV9ISQkJMTUwKjE2MDAwCiAKLSNkZWZpbmUgRlJFUV9JRiAgICAgICAgIDE3MTIwMCAvKiAxMC43KjE2MDAwICAgKi8KLSNkZWZpbmUgRlJFUV9TVEVQICAgICAgIDIwMCAgICAvKiAxMi41KjE2ICAgICAgKi8KKyNkZWZpbmUgRlJFUV9JRgkJMTcxMjAwIC8qIDEwLjcqMTYwMDAgICAqLworI2RlZmluZSBGUkVRX1NURVAJMjAwICAgIC8qIDEyLjUqMTYgICAgICAqLwogCiAjZGVmaW5lIEZSRVEyQklUUyh4KQkoKCgodW5zaWduZWQgaW50KSh4KStGUkVRX0lGKyhGUkVRX1NURVA8PDEpKVwKIAkJCS8oRlJFUV9TVEVQPDwyKSk8PDIpIC8qICh4PT1mbWh6KjE2KjEwMDApIC0+IGJpdHMgKi8KQEAgLTY1LDM5ICs2MSw1OCBAQAogbW9kdWxlX3BhcmFtKHJhZGlvX25yLCBpbnQsIDApOwogCiBzdGF0aWMgaW50IHJhZGlvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgbWFlc3Ryb19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgdm9pZCBtYWVzdHJvX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBtYWVzdHJvX3JfcGNpX3RibFtdID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0VTUywgUENJX0RFVklDRV9JRF9FU1NfRVNTMTk2OCksCisJCS5jbGFzcyA9IFBDSV9DTEFTU19NVUxUSU1FRElBX0FVRElPIDw8IDgsCisJCS5jbGFzc19tYXNrID0gMHhmZmZmMDAgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9FU1MsIFBDSV9ERVZJQ0VfSURfRVNTX0VTUzE5NzgpLAorCQkuY2xhc3MgPSBQQ0lfQ0xBU1NfTVVMVElNRURJQV9BVURJTyA8PCA4LAorCQkuY2xhc3NfbWFzayA9IDB4ZmZmZjAwIH0sCisJeyAwIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbWFlc3Ryb19yX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbWFlc3Ryb19yX2RyaXZlciA9IHsKKwkubmFtZQkJPSAibWFlc3Ryb19yYWRpbyIsCisJLmlkX3RhYmxlCT0gbWFlc3Ryb19yX3BjaV90YmwsCisJLnByb2JlCQk9IG1hZXN0cm9fcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtYWVzdHJvX3JlbW92ZSksCit9OwogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtYWVzdHJvX2ZvcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5vcGVuICAgICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuLAogCS5yZWxlYXNlICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlLAogCS5pb2N0bAkJPSByYWRpb19pb2N0bCwKKwkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLAogCS5sbHNlZWsgICAgICAgICA9IG5vX2xsc2VlaywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIG1hZXN0cm9fcmFkaW89Ci17Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAorc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgbWFlc3Ryb19yYWRpbyA9IHsKIAkubmFtZQkJPSAiTWFlc3RybyByYWRpbyIsCiAJLnR5cGUJCT0gVklEX1RZUEVfVFVORVIsCiAJLmhhcmR3YXJlCT0gVklEX0hBUkRXQVJFX1NGMTZNSSwKLQkuZm9wcyAgICAgICAgICAgPSAmbWFlc3Ryb19mb3BzLAorCS5mb3BzCQk9ICZtYWVzdHJvX2ZvcHMsCiB9OwogCi1zdGF0aWMgc3RydWN0IHJhZGlvX2RldmljZQotewotCV9fdTE2CWlvLAkvKiBiYXNlIG9mIE1hZXN0cm8gY2FyZCByYWRpbyBpbyAoR1BJT19EQVRBKSovCitzdHJ1Y3QgcmFkaW9fZGV2aWNlIHsKKwl1MTYJaW8sCS8qIGJhc2Ugb2YgTWFlc3RybyBjYXJkIHJhZGlvIGlvIChHUElPX0RBVEEpKi8KIAkJbXV0ZWQsCS8qIFZJREVPX0FVRElPX01VVEUgKi8KIAkJc3RlcmVvLAkvKiBWSURFT19UVU5FUl9TVEVSRU9fT04gKi8JCiAJCXR1bmVkOwkvKiBzaWduYWwgc3RyZW5ndGggKDAgb3IgMHhmZmZmKSAqLwotCXN0cnVjdCAgc2VtYXBob3JlIGxvY2s7Ci19IHJhZGlvX3VuaXQgPSB7MCwgMCwgMCwgMCwgfTsKKwlzdHJ1Y3QJc2VtYXBob3JlIGxvY2s7Cit9OwogCi1zdGF0aWMgX191MzIgcmFkaW9fYml0c19nZXQoc3RydWN0IHJhZGlvX2RldmljZSAqZGV2KQorc3RhdGljIHUzMiByYWRpb19iaXRzX2dldChzdHJ1Y3QgcmFkaW9fZGV2aWNlICpkZXYpCiB7Ci0JcmVnaXN0ZXIgX191MTYgaW89ZGV2LT5pbywgbCwgcmRhdGE7Ci0JcmVnaXN0ZXIgX191MzIgZGF0YT0wOwotCV9fdTE2IG9tYXNrOworCXJlZ2lzdGVyIHUxNiBpbz1kZXYtPmlvLCBsLCByZGF0YTsKKwlyZWdpc3RlciB1MzIgZGF0YT0wOworCXUxNiBvbWFzazsKKwogCW9tYXNrID0gaW53KGlvICsgSU9fTUFTSyk7CiAJb3V0dyh+KFNUUl9DTEsgfCBTVFJfV1JFTiksIGlvICsgSU9fTUFTSyk7CiAJb3V0dygwLCBpbyk7CkBAIC0xMjAsMTcgKzEzNSwyMSBAQAogCQkJCWRhdGErKzsKIAkJdWRlbGF5KDIpOwogCX0KKwogCWlmKGRldi0+bXV0ZWQpCiAJCW91dHcoU1RSX1dSRU4sIGlvKTsKKwogCXVkZWxheSg0KTsKIAlvdXR3KG9tYXNrLCBpbyArIElPX01BU0spOworCiAJcmV0dXJuIGRhdGEgJiAweDNmZmU7CiB9CiAKLXN0YXRpYyB2b2lkIHJhZGlvX2JpdHNfc2V0KHN0cnVjdCByYWRpb19kZXZpY2UgKmRldiwgX191MzIgZGF0YSkKK3N0YXRpYyB2b2lkIHJhZGlvX2JpdHNfc2V0KHN0cnVjdCByYWRpb19kZXZpY2UgKmRldiwgdTMyIGRhdGEpCiB7Ci0JcmVnaXN0ZXIgX191MTYgaW89ZGV2LT5pbywgbCwgYml0czsKLQlfX3UxNiBvbWFzaywgb2RpcjsKKwlyZWdpc3RlciB1MTYgaW89ZGV2LT5pbywgbCwgYml0czsKKwl1MTYgb21hc2ssIG9kaXI7CisKIAlvbWFzayA9IGludyhpbyArIElPX01BU0spOwogCW9kaXIgID0gKGludyhpbyArIElPX0RJUikgJiB+U1RSX0RBVEEpIHwgKFNUUl9DTEsgfCBTVFJfV1JFTik7CiAJb3V0dyhvZGlyIHwgU1RSX0RBVEEsIGlvICsgSU9fRElSKTsKQEAgLTE0Niw4ICsxNjUsMTAgQEAKIAkJb3V0dyhiaXRzLCBpbyk7CQkJLyogTE8gbGV2ZWwgKi8KIAkJdWRlbGF5KDQpOwogCX0KKwogCWlmKCFkZXYtPm11dGVkKQogCQlvdXR3KDAsIGlvKTsKKwogCXVkZWxheSg0KTsKIAlvdXR3KG9tYXNrLCBpbyArIElPX01BU0spOwogCW91dHcob2RpciwgaW8gKyBJT19ESVIpOwpAQCAtMTU1LDE0MSArMTc2LDEwMyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCByYWRpb19mdW5jdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQorCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCByYWRpb19kZXZpY2UgKmNhcmQ9ZGV2LT5wcml2OwotCQotCXN3aXRjaChjbWQpIHsKLQkJY2FzZSBWSURJT0NHQ0FQOiB7Ci0JCQlzdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSAqdiA9IGFyZzsKLQkJCW1lbXNldCh2LDAsc2l6ZW9mKCp2KSk7Ci0JCQlzdHJjcHkodi0+bmFtZSwgIk1hZXN0cm8gcmFkaW8iKTsKLQkJCXYtPnR5cGU9VklEX1RZUEVfVFVORVI7Ci0JCQl2LT5jaGFubmVscz12LT5hdWRpb3M9MTsKKwlzdHJ1Y3QgcmFkaW9fZGV2aWNlICpjYXJkID0gdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWSURJT0NHQ0FQOiB7CisJCXN0cnVjdCB2aWRlb19jYXBhYmlsaXR5ICp2ID0gYXJnOworCQltZW1zZXQodiwgMCwgc2l6ZW9mKCp2KSk7CisJCXN0cmNweSh2LT5uYW1lLCAiTWFlc3RybyByYWRpbyIpOworCQl2LT50eXBlID0gVklEX1RZUEVfVFVORVI7CisJCXYtPmNoYW5uZWxzID0gdi0+YXVkaW9zID0gMTsKKwkJcmV0dXJuIDA7CisJfSBjYXNlIFZJRElPQ0dUVU5FUjogeworCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgKnYgPSBhcmc7CisJCWlmICh2LT50dW5lcikKKwkJCXJldHVybiAtRUlOVkFMOworCQkodm9pZClyYWRpb19iaXRzX2dldChjYXJkKTsKKwkJdi0+ZmxhZ3MgPSBWSURFT19UVU5FUl9MT1cgfCBjYXJkLT5zdGVyZW87CisJCXYtPnNpZ25hbCA9IGNhcmQtPnR1bmVkOworCQlzdHJjcHkodi0+bmFtZSwgIkZNIik7CisJCXYtPnJhbmdlbG93ID0gRlJFUV9MTzsKKwkJdi0+cmFuZ2VoaWdoID0gRlJFUV9ISTsKKwkJdi0+bW9kZSA9IFZJREVPX01PREVfQVVUTzsKKwkJcmV0dXJuIDA7CisJfSBjYXNlIFZJRElPQ1NUVU5FUjogeworCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgKnYgPSBhcmc7CisJCWlmICh2LT50dW5lciAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOworCX0gY2FzZSBWSURJT0NHRlJFUTogeworCQl1bnNpZ25lZCBsb25nICpmcmVxID0gYXJnOworCQkqZnJlcSA9IEJJVFMyRlJFUShyYWRpb19iaXRzX2dldChjYXJkKSk7CisJCXJldHVybiAwOworCX0gY2FzZSBWSURJT0NTRlJFUTogeworCQl1bnNpZ25lZCBsb25nICpmcmVxID0gYXJnOworCQlpZiAoKmZyZXEgPCBGUkVRX0xPIHx8ICpmcmVxID4gRlJFUV9ISSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyYWRpb19iaXRzX3NldChjYXJkLCBGUkVRMkJJVFMoKmZyZXEpKTsKKwkJcmV0dXJuIDA7CisJfSBjYXNlIFZJRElPQ0dBVURJTzogeworCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYgPSBhcmc7CisJCW1lbXNldCh2LCAwLCBzaXplb2YoKnYpKTsKKwkJc3RyY3B5KHYtPm5hbWUsICJSYWRpbyIpOworCQl2LT5mbGFncyA9IFZJREVPX0FVRElPX01VVEFCTEUgfCBjYXJkLT5tdXRlZDsKKwkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX1NURVJFTzsKKwkJcmV0dXJuIDA7CisJfSBjYXNlIFZJRElPQ1NBVURJTzogeworCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYgPSBhcmc7CisJCWlmICh2LT5hdWRpbykKKwkJCXJldHVybiAtRUlOVkFMOworCQl7CisJCQlyZWdpc3RlciB1MTYgaW8gPSBjYXJkLT5pbzsKKwkJCXJlZ2lzdGVyIHUxNiBvbWFzayA9IGludyhpbyArIElPX01BU0spOworCQkJb3V0dyh+U1RSX1dSRU4sIGlvICsgSU9fTUFTSyk7CisJCQlvdXR3KChjYXJkLT5tdXRlZCA9IHYtPmZsYWdzICYgVklERU9fQVVESU9fTVVURSkgPworCQkJCVNUUl9XUkVOIDogMCwgaW8pOworCQkJdWRlbGF5KDQpOworCQkJb3V0dyhvbWFzaywgaW8gKyBJT19NQVNLKTsKKwkJCW1zbGVlcCgxMjUpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJY2FzZSBWSURJT0NHVFVORVI6IHsKLQkJCXN0cnVjdCB2aWRlb190dW5lciAqdiA9IGFyZzsKLQkJCWlmKHYtPnR1bmVyKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJKHZvaWQpcmFkaW9fYml0c19nZXQoY2FyZCk7Ci0JCQl2LT5mbGFncyA9IFZJREVPX1RVTkVSX0xPVyB8IGNhcmQtPnN0ZXJlbzsKLQkJCXYtPnNpZ25hbCA9IGNhcmQtPnR1bmVkOwotCQkJc3RyY3B5KHYtPm5hbWUsICJGTSIpOwotCQkJdi0+cmFuZ2Vsb3cgPSBGUkVRX0xPOwotCQkJdi0+cmFuZ2VoaWdoID0gRlJFUV9ISTsKLQkJCXYtPm1vZGUgPSBWSURFT19NT0RFX0FVVE87Ci0JCSAgICAgICAgcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NTVFVORVI6IHsKLQkJCXN0cnVjdCB2aWRlb190dW5lciAqdiA9IGFyZzsKLQkJCWlmKHYtPnR1bmVyIT0wKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NHRlJFUTogewotCQkJdW5zaWduZWQgbG9uZyAqZnJlcSA9IGFyZzsKLQkJCSpmcmVxID0gQklUUzJGUkVRKHJhZGlvX2JpdHNfZ2V0KGNhcmQpKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DU0ZSRVE6IHsKLQkJCXVuc2lnbmVkIGxvbmcgKmZyZXEgPSBhcmc7Ci0JCQlpZiAoKmZyZXE8RlJFUV9MTyB8fCAqZnJlcT5GUkVRX0hJICkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCXJhZGlvX2JpdHNfc2V0KGNhcmQsIEZSRVEyQklUUygqZnJlcSkpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NHQVVESU86IHsJCi0JCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYgPSBhcmc7Ci0JCQltZW1zZXQodiwwLHNpemVvZigqdikpOwotCQkJc3RyY3B5KHYtPm5hbWUsICJSYWRpbyIpOwotCQkJdi0+ZmxhZ3M9VklERU9fQVVESU9fTVVUQUJMRSB8IGNhcmQtPm11dGVkOwotCQkJdi0+bW9kZT1WSURFT19TT1VORF9TVEVSRU87Ci0JCQlyZXR1cm4gMDsJCQotCQl9Ci0JCWNhc2UgVklESU9DU0FVRElPOiB7Ci0JCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYgPSBhcmc7Ci0JCQlpZih2LT5hdWRpbykKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCXsKLQkJCQlyZWdpc3RlciBfX3UxNiBpbz1jYXJkLT5pbzsKLQkJCQlyZWdpc3RlciBfX3UxNiBvbWFzayA9IGludyhpbyArIElPX01BU0spOwotCQkJCW91dHcoflNUUl9XUkVOLCBpbyArIElPX01BU0spOwotCQkJCW91dHcoKGNhcmQtPm11dGVkID0gdi0+ZmxhZ3MgJiBWSURFT19BVURJT19NVVRFKQotCQkJCSAgICAgPyBTVFJfV1JFTiA6IDAsIGlvKTsKLQkJCQl1ZGVsYXkoNCk7Ci0JCQkJb3V0dyhvbWFzaywgaW8gKyBJT19NQVNLKTsKLQkJCQltc2xlZXAoMTI1KTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCQljYXNlIFZJRElPQ0dVTklUOiB7Ci0JCQlzdHJ1Y3QgdmlkZW9fdW5pdCAqdiA9IGFyZzsKLQkJCXYtPnZpZGVvPVZJREVPX05PX1VOSVQ7Ci0JCQl2LT52Ymk9VklERU9fTk9fVU5JVDsKLQkJCXYtPnJhZGlvPWRldi0+bWlub3I7Ci0JCQl2LT5hdWRpbz0wOwotCQkJdi0+dGVsZXRleHQ9VklERU9fTk9fVU5JVDsKLQkJCXJldHVybiAwOwkJCi0JCX0KLQkJZGVmYXVsdDogcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9IGNhc2UgVklESU9DR1VOSVQ6IHsKKwkJc3RydWN0IHZpZGVvX3VuaXQgKnYgPSBhcmc7CisJCXYtPnZpZGVvID0gVklERU9fTk9fVU5JVDsKKwkJdi0+dmJpID0gVklERU9fTk9fVU5JVDsKKwkJdi0+cmFkaW8gPSBkZXYtPm1pbm9yOworCQl2LT5hdWRpbyA9IDA7CisJCXYtPnRlbGV0ZXh0ID0gVklERU9fTk9fVU5JVDsKKwkJcmV0dXJuIDA7CisJfSBkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogCX0KIH0KIAogc3RhdGljIGludCByYWRpb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHJhZGlvX2RldmljZSAqY2FyZD1kZXYtPnByaXY7CisJc3RydWN0IHJhZGlvX2RldmljZSAqY2FyZCA9IHZpZGVvX2dldF9kcnZkYXRhKGRldik7CiAJaW50IHJldDsKIAogCWRvd24oJmNhcmQtPmxvY2spOwogCXJldCA9IHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgcmFkaW9fZnVuY3Rpb24pOwogCXVwKCZjYXJkLT5sb2NrKTsKKwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBfX3UxNiByYWRpb19pbnN0YWxsKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpOwotCi1NT0RVTEVfQVVUSE9SKCJBZGFtIFRsYWxrYSwgYXRsa2FAcGcuZ2RhLnBsIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlJhZGlvIGRyaXZlciBmb3IgdGhlIE1hZXN0cm8gUENJIHNvdW5kIGNhcmQgcmFkaW8uIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtYWVzdHJvX3JhZGlvX2V4aXQodm9pZCkKK3N0YXRpYyB1MTYgX19kZXZpbml0IHJhZGlvX3Bvd2VyX29uKHN0cnVjdCByYWRpb19kZXZpY2UgKmRldikKIHsKLQl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmbWFlc3Ryb19yYWRpbyk7Ci19CisJcmVnaXN0ZXIgdTE2IGlvID0gZGV2LT5pbzsKKwlyZWdpc3RlciB1MzIgb2ZyZXE7CisJdTE2IG9tYXNrLCBvZGlyOwogCi1zdGF0aWMgaW50IF9faW5pdCBtYWVzdHJvX3JhZGlvX2luaXQodm9pZCkKLXsKLQlyZWdpc3RlciBfX3UxNiBmb3VuZD0wOwotCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBOVUxMOwotCXdoaWxlKCFmb3VuZCAmJiAocGNpZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfRVNTLCAKLQkJCQkJCSAgUENJX0RFVklDRV9JRF9FU1NfRVNTMTk2OCwKLQkJCQkJCSAgcGNpZGV2KSkpCi0JCWZvdW5kIHw9IHJhZGlvX2luc3RhbGwocGNpZGV2KTsKLQl3aGlsZSghZm91bmQgJiYgKHBjaWRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0VTUywKLQkJCQkJCSAgUENJX0RFVklDRV9JRF9FU1NfRVNTMTk3OCwgCi0JCQkJCQkgIHBjaWRldikpKQotCQlmb3VuZCB8PSByYWRpb19pbnN0YWxsKHBjaWRldik7Ci0JaWYoIWZvdW5kKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInJhZGlvLW1hZXN0cm86IG5vIGRldmljZXMgZm91bmQuXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXJldHVybiAwOwotfQotCi1tb2R1bGVfaW5pdChtYWVzdHJvX3JhZGlvX2luaXQpOwotbW9kdWxlX2V4aXQobWFlc3Ryb19yYWRpb19leGl0KTsKLQotc3RhdGljIGlubGluZSBfX3UxNiByYWRpb19wb3dlcl9vbihzdHJ1Y3QgcmFkaW9fZGV2aWNlICpkZXYpCi17Ci0JcmVnaXN0ZXIgX191MTYgaW89ZGV2LT5pbzsKLQlyZWdpc3RlciBfX3UzMiBvZnJlcTsKLQlfX3UxNiBvbWFzaywgb2RpcjsKIAlvbWFzayA9IGludyhpbyArIElPX01BU0spOwotCW9kaXIgID0gKGludyhpbyArIElPX0RJUikgJiB+U1RSX0RBVEEpIHwgKFNUUl9DTEsgfCBTVFJfV1JFTik7CisJb2RpciA9IChpbncoaW8gKyBJT19ESVIpICYgflNUUl9EQVRBKSB8IChTVFJfQ0xLIHwgU1RSX1dSRU4pOwogCW91dHcob2RpciAmIH5TVFJfV1JFTiwgaW8gKyBJT19ESVIpOwogCWRldi0+bXV0ZWQgPSBpbncoaW8pICYgU1RSX1dSRU4gPyAwIDogVklERU9fQVVESU9fTVVURTsKIAlvdXR3KG9kaXIsIGlvICsgSU9fRElSKTsKQEAgLTI5OCwzNSArMjgxLDEwMSBAQAogCXVkZWxheSgxNik7CiAJb3V0dyhvbWFzaywgaW8gKyBJT19NQVNLKTsKIAlvZnJlcSA9IHJhZGlvX2JpdHNfZ2V0KGRldik7Ci0JaWYoKG9mcmVxPEZSRVEyQklUUyhGUkVRX0xPKSkgfHwgKG9mcmVxPkZSRVEyQklUUyhGUkVRX0hJKSkpCisKKwlpZiAoKG9mcmVxIDwgRlJFUTJCSVRTKEZSRVFfTE8pKSB8fCAob2ZyZXEgPiBGUkVRMkJJVFMoRlJFUV9ISSkpKQogCQlvZnJlcSA9IEZSRVEyQklUUyhGUkVRX0xPKTsKIAlyYWRpb19iaXRzX3NldChkZXYsIG9mcmVxKTsKKwogCXJldHVybiAob2ZyZXEgPT0gcmFkaW9fYml0c19nZXQoZGV2KSk7CiB9CiAKLXN0YXRpYyBfX3UxNiByYWRpb19pbnN0YWxsKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtYWVzdHJvX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7Ci0JaWYoKChwY2lkZXYtPmNsYXNzID4+IDgpICYgMHhmZmZmKSAhPSBQQ0lfQ0xBU1NfTVVMVElNRURJQV9BVURJTykKLQkJcmV0dXJuIDA7Ci0JCi0JcmFkaW9fdW5pdC5pbyA9IHBjaWRldi0+cmVzb3VyY2VbMF0uc3RhcnQgKyBHUElPX0RBVEE7Ci0JbWFlc3Ryb19yYWRpby5wcml2ID0gJnJhZGlvX3VuaXQ7Ci0JaW5pdF9NVVRFWCgmcmFkaW9fdW5pdC5sb2NrKTsKLQkKLQlpZihyYWRpb19wb3dlcl9vbigmcmFkaW9fdW5pdCkpIHsKLQkJaWYodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZtYWVzdHJvX3JhZGlvLCBWRkxfVFlQRV9SQURJTywgcmFkaW9fbnIpPT0tMSkgewotCQkJcHJpbnRrKCJyYWRpby1tYWVzdHJvOiBjYW4ndCByZWdpc3RlciBkZXZpY2UhIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwcmludGsoS0VSTl9JTkZPICJyYWRpby1tYWVzdHJvOiB2ZXJzaW9uICIKLQkJICAgICAgIERSSVZFUl9WRVJTSU9OIAotCQkgICAgICAgIiB0aW1lICIgCi0JCSAgICAgICBfX1RJTUVfXyAiICAiCi0JCSAgICAgICBfX0RBVEVfXwotCQkgICAgICAgIlxuIik7Ci0JCXByaW50ayhLRVJOX0lORk8gInJhZGlvLW1hZXN0cm86IHJhZGlvIGNoaXAgaW5pdGlhbGl6ZWRcbiIpOwotCQlyZXR1cm4gMTsKLQl9IGVsc2UKLQkJcmV0dXJuIDA7ICAgCisJc3RydWN0IHJhZGlvX2RldmljZSAqcmFkaW9fdW5pdDsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICptYWVzdHJvX3JhZGlvX2luc3Q7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZW5hYmxpbmcgcGNpIGRldmljZSBmYWlsZWQhXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0dmFsID0gLUVOT01FTTsKKworCXJhZGlvX3VuaXQgPSBremFsbG9jKHNpemVvZigqcmFkaW9fdW5pdCksIEdGUF9LRVJORUwpOworCWlmIChyYWRpb191bml0ID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm90IGVub3VnaCBtZW1vcnlcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlyYWRpb191bml0LT5pbyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSArIEdQSU9fREFUQTsKKwlpbml0X01VVEVYKCZyYWRpb191bml0LT5sb2NrKTsKKworCW1hZXN0cm9fcmFkaW9faW5zdCA9IHZpZGVvX2RldmljZV9hbGxvYygpOworCWlmIChtYWVzdHJvX3JhZGlvX2luc3QgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJub3QgZW5vdWdoIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyZnI7CisJfQorCisJbWVtY3B5KG1hZXN0cm9fcmFkaW9faW5zdCwgJm1hZXN0cm9fcmFkaW8sIHNpemVvZihtYWVzdHJvX3JhZGlvKSk7CisJdmlkZW9fc2V0X2RydmRhdGEobWFlc3Ryb19yYWRpb19pbnN0LCByYWRpb191bml0KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgbWFlc3Ryb19yYWRpb19pbnN0KTsKKworCXJldHZhbCA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZShtYWVzdHJvX3JhZGlvX2luc3QsIFZGTF9UWVBFX1JBRElPLAorCQlyYWRpb19ucik7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsoS0VSTl9FUlIgImNhbid0IHJlZ2lzdGVyIHZpZGVvIGRldmljZSFcbiIpOworCQlnb3RvIGVycmZyMTsKKwl9CisKKwlpZiAoIXJhZGlvX3Bvd2VyX29uKHJhZGlvX3VuaXQpKSB7CisJCXJldHZhbCA9IC1FSU87CisJCWdvdG8gZXJydW5yOworCX0KKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJJVkVSX1ZFUlNJT04gIiB0aW1lICIgX19USU1FX18gIiAgIgorCQkgX19EQVRFX18gIlxuIik7CisJZGV2X2luZm8oJnBkZXYtPmRldiwgInJhZGlvIGNoaXAgaW5pdGlhbGl6ZWRcbiIpOworCisJcmV0dXJuIDA7CitlcnJ1bnI6CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UobWFlc3Ryb19yYWRpb19pbnN0KTsKK2VycmZyMToKKwlrZnJlZShtYWVzdHJvX3JhZGlvX2luc3QpOworZXJyZnI6CisJa2ZyZWUocmFkaW9fdW5pdCk7CitlcnI6CisJcmV0dXJuIHJldHZhbDsKKwogfQogCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgbWFlc3Ryb19yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHZkZXYpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBtYWVzdHJvX3JhZGlvX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmbWFlc3Ryb19yX2RyaXZlcik7CisKKwlpZiAocmV0dmFsKQorCQlwcmludGsoS0VSTl9FUlIgImVycm9yIGR1cmluZyByZWdpc3RyYXRpb24gcGNpIGRyaXZlclxuIik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWFlc3Ryb19yYWRpb19leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZtYWVzdHJvX3JfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobWFlc3Ryb19yYWRpb19pbml0KTsKK21vZHVsZV9leGl0KG1hZXN0cm9fcmFkaW9fZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkFkYW0gVGxhbGthLCBhdGxrYUBwZy5nZGEucGwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmFkaW8gZHJpdmVyIGZvciB0aGUgTWFlc3RybyBQQ0kgc291bmQgY2FyZCByYWRpby4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbWF4aXJhZGlvLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1heGlyYWRpby5jCmluZGV4IDAyZDM5YTUuLmM5NzVkZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbWF4aXJhZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tYXhpcmFkaW8uYwpAQCAtODAsNiArODAsNyBAQAogCS5vcGVuICAgICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuLAogCS5yZWxlYXNlICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlLAogCS5pb2N0bAkgICAgICAgID0gcmFkaW9faW9jdGwsCisJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKIAkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCiB9Owogc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgbWF4aXJhZGlvX3JhZGlvID0KQEAgLTMzNyw3ICszMzgsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBtYXhpcmFkaW9fcmFkaW9faW5pdCh2b2lkKQogewotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJm1heGlyYWRpb19kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZtYXhpcmFkaW9fZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IG1heGlyYWRpb19yYWRpb19leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXJ0cmFjazIuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tcnRyYWNrMi5jCmluZGV4IGIyMjU2ZDYuLjI4YTQ3YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tcnRyYWNrMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tcnRyYWNrMi5jCkBAIC0xOTksNiArMTk5LDcgQEAKIAkub3BlbiAgICAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfb3BlbiwKIAkucmVsZWFzZSAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfcmVsZWFzZSwKIAkuaW9jdGwJCT0gcnRfaW9jdGwsCisJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKIAkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNmMTZmbWkuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtaS5jCmluZGV4IDZmMDNjZTQuLjAyMjlmNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtaS5jCkBAIC0yMjUsNiArMjI1LDcgQEAKIAkub3BlbiAgICAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfb3BlbiwKIAkucmVsZWFzZSAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfcmVsZWFzZSwKIAkuaW9jdGwJCT0gZm1pX2lvY3RsLAorCS5jb21wYXRfaW9jdGwJPSB2NGxfY29tcGF0X2lvY3RsMzIsCiAJLmxsc2VlayAgICAgICAgID0gbm9fbGxzZWVrLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1yMi5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1yMi5jCmluZGV4IDcxOTcxZTkuLjA5OWZmYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtcjIuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNmMTZmbXIyLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIHN0YXRpYyBpbnQgcmFkaW9fbnIgPSAtMTsKIAogLyogaHcgcHJlY2lzaW9uIGlzIDEyLjUga0h6Ci0gKiBJdCBpcyBvbmx5IHVzZWZ1bGwgdG8gZ2l2ZSBmcmVxIGluIGludGVydmFsbCBvZiAyMDAgKD0wLjAxMjVNaHopLAorICogSXQgaXMgb25seSB1c2VmdWwgdG8gZ2l2ZSBmcmVxIGluIGludGVydmFsbCBvZiAyMDAgKD0wLjAxMjVNaHopLAogICogb3RoZXIgYml0cyB3aWxsIGJlIHRydW5jYXRlZAogICovCiAjZGVmaW5lIFJTRjE2X0VOQ09ERSh4KQkoKHgpLzIwMCs4NTYpCkBAIC0zNTYsNiArMzU2LDcgQEAKIAkub3BlbiAgICAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfb3BlbiwKIAkucmVsZWFzZSAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfcmVsZWFzZSwKIAkuaW9jdGwgICAgICAgICAgPSBmbXIyX2lvY3RsLAorCS5jb21wYXRfaW9jdGwJPSB2NGxfY29tcGF0X2lvY3RsMzIsCiAJLmxsc2VlayAgICAgICAgID0gbm9fbGxzZWVrLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZXJyYXRlYy5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZXJyYXRlYy5jCmluZGV4IGIwMzU3M2MuLmZjZmRlMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGVycmF0ZWMuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRlcnJhdGVjLmMKQEAgLTI3Niw2ICsyNzYsNyBAQAogCS5vcGVuICAgICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuLAogCS5yZWxlYXNlICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlLAogCS5pb2N0bAkJPSB0dF9pb2N0bCwKKwkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLAogCS5sbHNlZWsgICAgICAgICA9IG5vX2xsc2VlaywKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHJ1c3QuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHJ1c3QuYwppbmRleCBiMzAwYmVkLi41YTA5OWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRydXN0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10cnVzdC5jCkBAIC0yNTUsNiArMjU1LDcgQEAKIAkub3BlbiAgICAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfb3BlbiwKIAkucmVsZWFzZSAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfcmVsZWFzZSwKIAkuaW9jdGwJCT0gdHJfaW9jdGwsCisJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKIAkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXR5cGhvb24uYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHlwaG9vbi5jCmluZGV4IGYzMDRmM2MuLjhhYzlhOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHlwaG9vbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHlwaG9vbi5jCkBAIC0yNjEsNiArMjYxLDcgQEAKIAkub3BlbiAgICAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfb3BlbiwKIAkucmVsZWFzZSAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfcmVsZWFzZSwKIAkuaW9jdGwJCT0gdHlwaG9vbl9pb2N0bCwKKwkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLAogCS5sbHNlZWsgICAgICAgICA9IG5vX2xsc2VlaywKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tem9sdHJpeC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby16b2x0cml4LmMKaW5kZXggNGM2ZDZmYi4uZDU5MGU4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby16b2x0cml4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby16b2x0cml4LmMKQEAgLTMxMyw2ICszMTMsNyBAQAogCS5vcGVuICAgICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuLAogCS5yZWxlYXNlICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlLAogCS5pb2N0bAkJPSB6b2xfaW9jdGwsCisJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKIAkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKaW5kZXggZmM4N2VmYy4uZDgyYzhhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZwpAQCAtNyw2ICs3LDE1IEBACiAKIGNvbW1lbnQgIlZpZGVvIEFkYXB0ZXJzIgogCitjb25maWcgVklERU9fQURWX0RFQlVHCisJYm9vbCAiRW5hYmxlIGFkdmFuY2VkIGRlYnVnIGZ1bmN0aW9uYWxpdHkiCisJZGVwZW5kcyBvbiBWSURFT19ERVYKKwlkZWZhdWx0IG4KKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBhZHZhbmNlZCBkZWJ1Z2dpbmcgZnVuY3Rpb25hbGl0eSBvbiBzb21lCisJICBWNEwgZGV2aWNlcy4KKwkgIEluIGRvdWJ0LCBzYXkgTi4KKwogY29uZmlnIFZJREVPX0JUODQ4CiAJdHJpc3RhdGUgIkJUODQ4IFZpZGVvIEZvciBMaW51eCIKIAlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBQQ0kgJiYgSTJDCkBAIC0xNzQsNyArMTgzLDcgQEAKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgU3RyYWRpcyA0OjI6MiBNUEVHLTIgdmlkZW8KIAkgIGRyaXZlciBmb3IgUENJLiAgVGhlcmUgaXMgYSBwcm9kdWN0IHBhZ2UgYXQKLQkgIDxodHRwOi8vd3d3LnN0cmFkaXMuY29tL2RlY29kZXIuaHRtbD4uCisJICA8aHR0cDovL3d3dy5zdHJhZGlzLmNvbS8+LgogCiBjb25maWcgVklERU9fWk9SQU4KIAl0cmlzdGF0ZSAiWm9yYW4gWlIzNjA1Ny8zNjA2NyBWaWRlbyBGb3IgTGludXgiCkBAIC0zNDIsNiArMzUxLDYgQEAKIAlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCiAJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIGRyaXZlcnMgZm9yIFNBQTcxMTUsIFNBQTcxMjcgYW5kIENYMjU4NDAKLQkgIHZpZGVvICBkZWNvZGVycy4KKwkgIHZpZGVvIGRlY29kZXJzLgogCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZQppbmRleCA4MjA2MGY5Li5mYWY3MjgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUKQEAgLTMsMTUgKzMsMjAgQEAKICMKIAogYnR0di1vYmpzCTo9CWJ0dHYtZHJpdmVyLm8gYnR0di1jYXJkcy5vIGJ0dHYtaWYubyBcCi0JCQlidHR2LXJpc2MubyBidHR2LXZiaS5vIGJ0dHYtaTJjLm8gYnR0di1ncGlvLm8KKwkJCWJ0dHYtcmlzYy5vIGJ0dHYtdmJpLm8gYnR0di1pMmMubyBidHR2LWdwaW8ubyBcCisJCQlidHR2LWlucHV0Lm8KIHpvcmFuLW9ianMgICAgICA6PQl6cjM2MTIwLm8genIzNjEyMF9pMmMubyB6cjM2MTIwX21lbS5vCiB6cjM2MDY3LW9ianMJOj0Jem9yYW5fcHJvY2ZzLm8gem9yYW5fZGV2aWNlLm8gXAogCQkJem9yYW5fZHJpdmVyLm8gem9yYW5fY2FyZC5vCi10dW5lci1vYmpzCTo9CXR1bmVyLWNvcmUubyB0dW5lci1zaW1wbGUubyBtdDIweHgubyB0ZGE4MjkwLm8gdGVhNTc2Ny5vCi1vYmotJChDT05GSUdfVklERU9fREVWKSArPSB2aWRlb2Rldi5vIHY0bDItY29tbW9uLm8gdjRsMS1jb21wYXQubwordHVuZXItb2Jqcwk6PQl0dW5lci1jb3JlLm8gdHVuZXItdHlwZXMubyB0dW5lci1zaW1wbGUubyBcCisJCQltdDIweHgubyB0ZGE4MjkwLm8gdGVhNTc2Ny5vCisKK21zcDM0MDAtb2Jqcwk6PQltc3AzNDAwLWRyaXZlci5vIG1zcDM0MDAta3RocmVhZHMubworCitvYmotJChDT05GSUdfVklERU9fREVWKSArPSB2aWRlb2Rldi5vIHY0bDItY29tbW9uLm8gdjRsMS1jb21wYXQubyBjb21wYXRfaW9jdGwzMi5vCiAKIG9iai0kKENPTkZJR19WSURFT19CVDg0OCkgKz0gYnR0di5vIG1zcDM0MDAubyB0dmF1ZGlvLm8gXAotCXRkYTc0MzIubyB0ZGE5ODc1Lm8gaXIta2JkLWkyYy5vIGlyLWtiZC1ncGlvLm8KKwl0ZGE3NDMyLm8gdGRhOTg3NS5vIGlyLWtiZC1pMmMubwogb2JqLSQoQ09ORklHX1NPVU5EX1RWTUlYRVIpICs9IHR2bWl4ZXIubwogCiBvYmotJChDT05GSUdfVklERU9fWlIzNjEyMCkgKz0gem9yYW4ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9hZHY3MTcwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkdjcxNzAuYwppbmRleCBlNjEwMDNkLi40Y2UwN2FlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkdjcxNzAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkdjcxNzAuYwpAQCAtNDEzLDEwICs0MTMsOSBAQAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKIAkJcmV0dXJuIDA7CiAKLQljbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNsaWVudCA9PSAwKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQoY2xpZW50LCAwLCBzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKIAljbGllbnQtPmFkZHIgPSBhZGRyZXNzOwogCWNsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CiAJY2xpZW50LT5kcml2ZXIgPSAmaTJjX2RyaXZlcl9hZHY3MTcwOwpAQCAtNDMzLDEyICs0MzIsMTEgQEAKIAl9CiAJc3RybGNweShJMkNfTkFNRShjbGllbnQpLCBkbmFtZSwgc2l6ZW9mKEkyQ19OQU1FKGNsaWVudCkpKTsKIAotCWVuY29kZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWR2NzE3MCksIEdGUF9LRVJORUwpOworCWVuY29kZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWR2NzE3MCksIEdGUF9LRVJORUwpOwogCWlmIChlbmNvZGVyID09IE5VTEwpIHsKIAkJa2ZyZWUoY2xpZW50KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbXNldChlbmNvZGVyLCAwLCBzaXplb2Yoc3RydWN0IGFkdjcxNzApKTsKIAllbmNvZGVyLT5ub3JtID0gVklERU9fTU9ERV9OVFNDOwogCWVuY29kZXItPmlucHV0ID0gMDsKIAllbmNvZGVyLT5lbmFibGUgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9hZHY3MTc1LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkdjcxNzUuYwppbmRleCA2ZDk1MzZhLi40ZTIxOGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkdjcxNzUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkdjcxNzUuYwpAQCAtNDYzLDEwICs0NjMsOSBAQAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKIAkJcmV0dXJuIDA7CiAKLQljbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNsaWVudCA9PSAwKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQoY2xpZW50LCAwLCBzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKIAljbGllbnQtPmFkZHIgPSBhZGRyZXNzOwogCWNsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CiAJY2xpZW50LT5kcml2ZXIgPSAmaTJjX2RyaXZlcl9hZHY3MTc1OwpAQCAtNDgzLDEyICs0ODIsMTEgQEAKIAl9CiAJc3RybGNweShJMkNfTkFNRShjbGllbnQpLCBkbmFtZSwgc2l6ZW9mKEkyQ19OQU1FKGNsaWVudCkpKTsKIAotCWVuY29kZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWR2NzE3NSksIEdGUF9LRVJORUwpOworCWVuY29kZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWR2NzE3NSksIEdGUF9LRVJORUwpOwogCWlmIChlbmNvZGVyID09IE5VTEwpIHsKIAkJa2ZyZWUoY2xpZW50KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbXNldChlbmNvZGVyLCAwLCBzaXplb2Yoc3RydWN0IGFkdjcxNzUpKTsKIAllbmNvZGVyLT5ub3JtID0gVklERU9fTU9ERV9QQUw7CiAJZW5jb2Rlci0+aW5wdXQgPSAwOwogCWVuY29kZXItPmVuYWJsZSA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2Fydi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9hcnYuYwppbmRleCA4ODFjZGNiLi45OTRiNzVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2Fydi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXJ2LmMKQEAgLTEyOSw5ICsxMjksOSBAQAogc3RhdGljIGludCBmcmVxID0gREVGQVVMVF9GUkVROwkvKiBCQ0xLOiBhdmFpbGFibGUgNTAgb3IgNzAgKE1IeikgKi8KIHN0YXRpYyBpbnQgdmdhID0gMDsJCS8qIGRlZmF1bHQgbW9kZSgwOlFWR0EgbW9kZSwgb3RoZXI6VkdBIG1vZGUpICovCiBzdGF0aWMgaW50IHZnYV9pbnRlcmxhY2UgPSAwOwkvKiAwIGlzIG5vcm1hbCBtb2RlIGZvciwgZWxzZSBpbnRlcmxhY2UgbW9kZSAqLwotTU9EVUxFX1BBUk0oZnJlcSwgImkiKTsKLU1PRFVMRV9QQVJNKHZnYSwgImkiKTsKLU1PRFVMRV9QQVJNKHZnYV9pbnRlcmxhY2UsICJpIik7Cittb2R1bGVfcGFyYW0oZnJlcSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh2Z2EsIGludCwgMCk7Cittb2R1bGVfcGFyYW0odmdhX2ludGVybGFjZSwgaW50LCAwKTsKIAogc3RhdGljIGludCBhcl9pbml0aWFsaXplKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldik7CiAKQEAgLTc0OSw2ICs3NDksNyBAQAogCS5yZWxlYXNlCT0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UsCiAJLnJlYWQJCT0gYXJfcmVhZCwKIAkuaW9jdGwJCT0gYXJfaW9jdGwsCisJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKIAkubGxzZWVrCQk9IG5vX2xsc2VlaywKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4MTkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4MTkuYwppbmRleCA1NjBiOTk4Li5kNjQ0Nzc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODE5LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDgxOS5jCkBAIC01MjgsMjEgKzUyOCwxOCBAQAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKIAkJcmV0dXJuIDA7CiAKLQljbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNsaWVudCA9PSAwKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQoY2xpZW50LCAwLCBzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKIAljbGllbnQtPmFkZHIgPSBhZGRyZXNzOwogCWNsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CiAJY2xpZW50LT5kcml2ZXIgPSAmaTJjX2RyaXZlcl9idDgxOTsKIAotCWRlY29kZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYnQ4MTkpLCBHRlBfS0VSTkVMKTsKKwlkZWNvZGVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJ0ODE5KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRlY29kZXIgPT0gTlVMTCkgewogCQlrZnJlZShjbGllbnQpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0KLQltZW1zZXQoZGVjb2RlciwgMCwgc2l6ZW9mKHN0cnVjdCBidDgxOSkpOwogCWRlY29kZXItPm5vcm0gPSBWSURFT19NT0RFX05UU0M7CiAJZGVjb2Rlci0+aW5wdXQgPSAwOwogCWRlY29kZXItPmVuYWJsZSA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODMyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODMyLmMKaW5kZXggMWMzZmY1Zi4uY2M1NGI2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDgzMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4MzIuYwpAQCAtMzAsOCArMzAsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvY2hpcC5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisKICNpbmNsdWRlICJidHR2LmgiCiAjaW5jbHVkZSAiYnQ4MzIuaCIKIApAQCAtNDIsOSArNDMsMTAgQEAKIAkJCQkgICAgICAgSTJDX0NMSUVOVF9FTkQgfTsKIEkyQ19DTElFTlRfSU5TTU9EOwogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitpbnQgZGVidWc7ICAgIC8qIGRlYnVnIG91dHB1dCAqLworbW9kdWxlX3BhcmFtKGRlYnVnLCAgICAgICAgICAgIGludCwgMDY0NCk7CiAKLSNkZWZpbmUgZHByaW50ayAgICAgaWYgKGRlYnVnKSBwcmludGsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIGludCBidDgzMl9kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CiAKQEAgLTYxLDIzICs2MywyNiBAQAogCWludCBpLHJjOwogCWJ1ZlswXT0weDgwOyAvLyBzdGFydCBhdCByZWdpc3RlciAwIHdpdGggYXV0by1pbmNyZW1lbnQKIAlpZiAoMSAhPSAocmMgPSBpMmNfbWFzdGVyX3NlbmQoaTJjX2NsaWVudF9zLGJ1ZiwxKSkpCi0JCXByaW50aygiYnQ4MzI6IGkyYyBpL28gZXJyb3I6IHJjID09ICVkIChzaG91bGQgYmUgMSlcbiIscmMpOworCQl2NGxfZXJyKGkyY19jbGllbnRfcywiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSAxKVxuIixyYyk7CiAKIAlmb3IoaT0wO2k8NjU7aSsrKQogCQlidWZbaV09MDsKIAlpZiAoNjUgIT0gKHJjPWkyY19tYXN0ZXJfcmVjdihpMmNfY2xpZW50X3MsYnVmLDY1KSkpCi0JCXByaW50aygiYnQ4MzI6IGkyYyBpL28gZXJyb3I6IHJjID09ICVkIChzaG91bGQgYmUgNjUpXG4iLHJjKTsKKwkJdjRsX2VycihpMmNfY2xpZW50X3MsImkyYyBpL28gZXJyb3I6IHJjID09ICVkIChzaG91bGQgYmUgNjUpXG4iLHJjKTsKIAogCS8vIE5vdGU6IE9uIFJFQUQgdGhlIGZpcnN0IGJ5dGUgaXMgdGhlIGN1cnJlbnQgaW5kZXgKIAkvLyAgKGUuZy4gMHg4MCwgd2hhdCB3ZSBqdXN0IHdyb3RlKQogCi0JaWYoMSkgeworCWlmKGRlYnVnPjEpIHsKIAkJaW50IGk7Ci0JCXByaW50aygiQlQ4MzIgaGV4ZHVtcDpcbiIpOworCQl2NGxfZGJnKDIsIGRlYnVnLGkyY19jbGllbnRfcywiaGV4ZHVtcDoiKTsKIAkJZm9yKGk9MTtpPDY1O2krKykgewogCQkJaWYoaSE9MSkgewotCQkJICBpZigoKGktMSklOCk9PTApIHByaW50aygiICIpOwotCQkJICBpZigoKGktMSklMTYpPT0wKSBwcmludGsoIlxuIik7CisJCQkJaWYoKChpLTEpJTgpPT0wKSBwcmludGsoIiAiKTsKKwkJCQlpZigoKGktMSklMTYpPT0wKSB7CisJCQkJCXByaW50aygiXG4iKTsKKwkJCQkJdjRsX2RiZygyLCBkZWJ1ZyxpMmNfY2xpZW50X3MsImhleGR1bXA6Iik7CisJCQkJfQogCQkJfQogCQkJcHJpbnRrKCIgJTAyeCIsYnVmW2ldKTsKIAkJfQpAQCAtOTYsNTYgKzEwMSw1NiBAQAogCWJ0ODMyX2hleGR1bXAoaTJjX2NsaWVudF9zLGJ1Zik7CiAKIAlpZihidWZbMHg0MF0gIT0gMHgzMSkgewotCQlwcmludGsoImJ0ODMyOiB0aGlzIGkyYyBjaGlwIGlzIG5vIGJ0ODMyIChpZD0lMDJ4KS4gRGV0YWNoaW5nLlxuIixidWZbMHg0MF0pOworCQl2NGxfZXJyKGkyY19jbGllbnRfcywiVGhpcyBpMmMgY2hpcCBpcyBubyBidDgzMiAoaWQ9JTAyeCkuIERldGFjaGluZy5cbiIsYnVmWzB4NDBdKTsKIAkJa2ZyZWUoYnVmKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JcHJpbnRrKCJXcml0ZSAwIHRwIFZQU1RBVFVTXG4iKTsKKwl2NGxfZXJyKGkyY19jbGllbnRfcywiV3JpdGUgMCB0cCBWUFNUQVRVU1xuIik7CiAJYnVmWzBdPUJUODMyX1ZQX1NUQVRVUzsgLy8gUmVnLjUyCiAJYnVmWzFdPSAweDAwOwogCWlmICgyICE9IChyYyA9IGkyY19tYXN0ZXJfc2VuZChpMmNfY2xpZW50X3MsYnVmLDIpKSkKLQkJcHJpbnRrKCJidDgzMjogaTJjIGkvbyBlcnJvciBWUFM6IHJjID09ICVkIChzaG91bGQgYmUgMilcbiIscmMpOworCQl2NGxfZXJyKGkyY19jbGllbnRfcywiaTJjIGkvbyBlcnJvciBWUFM6IHJjID09ICVkIChzaG91bGQgYmUgMilcbiIscmMpOwogCiAJYnQ4MzJfaGV4ZHVtcChpMmNfY2xpZW50X3MsYnVmKTsKIAogCiAJLy8gTGVhdmUgbG93IHBvd2VyIG1vZGU6Ci0JcHJpbnRrKCJCdDgzMjogbGVhdmUgbG93IHBvd2VyIG1vZGUuXG4iKTsKKwl2NGxfZXJyKGkyY19jbGllbnRfcywibGVhdmUgbG93IHBvd2VyIG1vZGUuXG4iKTsKIAlidWZbMF09QlQ4MzJfQ0FNX1NFVFVQMDsgLy8weDM5IDU3CiAJYnVmWzFdPTB4MDg7CiAJaWYgKDIgIT0gKHJjID0gaTJjX21hc3Rlcl9zZW5kKGkyY19jbGllbnRfcyxidWYsMikpKQotCQlwcmludGsoImJ0ODMyOiBpMmMgaS9vIGVycm9yIExMUE06IHJjID09ICVkIChzaG91bGQgYmUgMilcbiIscmMpOworCQl2NGxfZXJyKGkyY19jbGllbnRfcywiaTJjIGkvbyBlcnJvciBMTFBNOiByYyA9PSAlZCAoc2hvdWxkIGJlIDIpXG4iLHJjKTsKIAogCWJ0ODMyX2hleGR1bXAoaTJjX2NsaWVudF9zLGJ1Zik7CiAKLQlwcmludGsoIldyaXRlIDAgdHAgVlBTVEFUVVNcbiIpOworCXY0bF9pbmZvKGkyY19jbGllbnRfcywiV3JpdGUgMCB0cCBWUFNUQVRVU1xuIik7CiAJYnVmWzBdPUJUODMyX1ZQX1NUQVRVUzsgLy8gUmVnLjUyCiAJYnVmWzFdPSAweDAwOwogCWlmICgyICE9IChyYyA9IGkyY19tYXN0ZXJfc2VuZChpMmNfY2xpZW50X3MsYnVmLDIpKSkKLQkJcHJpbnRrKCJidDgzMjogaTJjIGkvbyBlcnJvciBWUFM6IHJjID09ICVkIChzaG91bGQgYmUgMilcbiIscmMpOworCQl2NGxfZXJyKGkyY19jbGllbnRfcywiaTJjIGkvbyBlcnJvciBWUFM6IHJjID09ICVkIChzaG91bGQgYmUgMilcbiIscmMpOwogCiAJYnQ4MzJfaGV4ZHVtcChpMmNfY2xpZW50X3MsYnVmKTsKIAogCiAJLy8gRW5hYmxlIE91dHB1dAotCXByaW50aygiRW5hYmxlIE91dHB1dFxuIik7CisJdjRsX2luZm8oaTJjX2NsaWVudF9zLCJFbmFibGUgT3V0cHV0XG4iKTsKIAlidWZbMF09QlQ4MzJfVlBfQ09OVFJPTDE7IC8vIFJlZy40MAogCWJ1ZlsxXT0gMHgyNyAmICh+MHgwMSk7IC8vIERlZmF1bHQgfCAhc2tpcAogCWlmICgyICE9IChyYyA9IGkyY19tYXN0ZXJfc2VuZChpMmNfY2xpZW50X3MsYnVmLDIpKSkKLQkJcHJpbnRrKCJidDgzMjogaTJjIGkvbyBlcnJvciBFTzogcmMgPT0gJWQgKHNob3VsZCBiZSAyKVxuIixyYyk7CisJCXY0bF9lcnIoaTJjX2NsaWVudF9zLCJpMmMgaS9vIGVycm9yIEVPOiByYyA9PSAlZCAoc2hvdWxkIGJlIDIpXG4iLHJjKTsKIAogCWJ0ODMyX2hleGR1bXAoaTJjX2NsaWVudF9zLGJ1Zik7CiAKIAogCS8vIGZvciB0ZXN0aW5nIChldmVuIHdvcmtzIHdoZW4gbm8gY2FtZXJhIGF0dGFjaGVkKQotCXByaW50aygiYnQ4MzI6ICoqKiBHZW5lcmF0ZSBOVFNDIE0gQmFycyAqKioqKlxuIik7CisJdjRsX2luZm8oaTJjX2NsaWVudF9zLCIqKiogR2VuZXJhdGUgTlRTQyBNIEJhcnMgKioqKipcbiIpOwogCWJ1ZlswXT1CVDgzMl9WUF9URVNUQ09OVFJPTDA7IC8vIFJlZy4gNDIKIAlidWZbMV09MzsgLy8gR2VuZXJhdGUgTlRTQyBTeXN0ZW0gTSBiYXJzLCBHZW5lcmF0ZSBGcmFtZSB0aW1pbmcgaW50ZXJuYWxseQogCWlmICgyICE9IChyYyA9IGkyY19tYXN0ZXJfc2VuZChpMmNfY2xpZW50X3MsYnVmLDIpKSkKLQkJcHJpbnRrKCJidDgzMjogaTJjIGkvbyBlcnJvciBNQkFSOiByYyA9PSAlZCAoc2hvdWxkIGJlIDIpXG4iLHJjKTsKKwkJdjRsX2luZm8oaTJjX2NsaWVudF9zLCJpMmMgaS9vIGVycm9yIE1CQVI6IHJjID09ICVkIChzaG91bGQgYmUgMilcbiIscmMpOwogCi0JcHJpbnRrKCJCdDgzMjogQ2FtZXJhIFByZXNlbnQ6ICVzXG4iLAorCXY0bF9pbmZvKGkyY19jbGllbnRfcywiQ2FtZXJhIFByZXNlbnQ6ICVzXG4iLAogCQkoYnVmWzErQlQ4MzJfQ0FNX1NUQVRVU10gJiBCVDgzMl81Nl9DQU1FUkFfUFJFU0VOVCkgPyAieWVzIjoibm8iKTsKIAogCWJ0ODMyX2hleGR1bXAoaTJjX2NsaWVudF9zLGJ1Zik7CkBAIC0xNTksMjAgKzE2NCwxOCBAQAogewogCXN0cnVjdCBidDgzMiAqdDsKIAotCXByaW50aygiYnQ4MzJfYXR0YWNoXG4iKTsKLQogCWNsaWVudF90ZW1wbGF0ZS5hZGFwdGVyID0gYWRhcDsKIAljbGllbnRfdGVtcGxhdGUuYWRkciAgICA9IGFkZHI7CiAKLQlwcmludGsoImJ0ODMyOiBjaGlwIGZvdW5kIEAgMHgleFxuIiwgYWRkcjw8MSk7Ci0KLQlpZiAoTlVMTCA9PSAodCA9IGttYWxsb2Moc2l6ZW9mKCp0KSwgR0ZQX0tFUk5FTCkpKQorCWlmIChOVUxMID09ICh0ID0ga3phbGxvYyhzaXplb2YoKnQpLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbXNldCh0LDAsc2l6ZW9mKCp0KSk7CiAJdC0+Y2xpZW50ID0gY2xpZW50X3RlbXBsYXRlOwogCWkyY19zZXRfY2xpZW50ZGF0YSgmdC0+Y2xpZW50LCB0KTsKIAlpMmNfYXR0YWNoX2NsaWVudCgmdC0+Y2xpZW50KTsKIAorCXY0bF9pbmZvKCZ0LT5jbGllbnQsImNoaXAgZm91bmQgQCAweCV4XG4iLCBhZGRyPDwxKTsKKworCiAJaWYoISBidDgzMl9pbml0KCZ0LT5jbGllbnQpKSB7CiAJCWJ0ODMyX2RldGFjaCgmdC0+Y2xpZW50KTsKIAkJcmV0dXJuIC0xOwpAQCAtMTgzLDEzICsxODYsOCBAQAogCiBzdGF0aWMgaW50IGJ0ODMyX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKIHsKLSNpZmRlZiBJMkNfQ0xBU1NfVFZfQU5BTE9HCiAJaWYgKGFkYXAtPmNsYXNzICYgSTJDX0NMQVNTX1RWX0FOQUxPRykKIAkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCBidDgzMl9hdHRhY2gpOwotI2Vsc2UKLQlpZiAoYWRhcC0+aWQgPT0gSTJDX0hXX0JfQlQ4NDgpCi0JCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgYnQ4MzJfYXR0YWNoKTsKLSNlbmRpZgogCXJldHVybiAwOwogfQogCkBAIC0xOTcsNyArMTk1LDcgQEAKIHsKIAlzdHJ1Y3QgYnQ4MzIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAotCXByaW50aygiYnQ4MzI6IGRldGFjaC5cbiIpOworCXY0bF9pbmZvKCZ0LT5jbGllbnQsImRldHRhY2hcbiIpOwogCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CiAJa2ZyZWUodCk7CiAJcmV0dXJuIDA7CkBAIC0yMDgsNyArMjA2LDggQEAKIHsKIAlzdHJ1Y3QgYnQ4MzIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAotCXByaW50aygiYnQ4MzI6IGNvbW1hbmQgJXhcbiIsY21kKTsKKwlpZiAoZGVidWc+MSkKKwkJdjRsX2kyY19wcmludF9pb2N0bCgmdC0+Y2xpZW50LGNtZCk7CiAKIAlzd2l0Y2ggKGNtZCkgewogCQljYXNlIEJUODMyX0hFWERVTVA6IHsKQEAgLTIxOSw3ICsyMTgsNyBAQAogCQl9CiAJCWJyZWFrOwogCQljYXNlIEJUODMyX1JFQVRUQUNIOgotCQkJcHJpbnRrKCJidDgzMjogcmUtYXR0YWNoXG4iKTsKKwkJCXY0bF9pbmZvKCZ0LT5jbGllbnQsInJlLWF0dGFjaFxuIik7CiAJCQlpMmNfZGVsX2RyaXZlcigmZHJpdmVyKTsKIAkJCWkyY19hZGRfZHJpdmVyKCZkcml2ZXIpOwogCQlicmVhazsKQEAgLTIzMSw5ICsyMzAsOSBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lICAgPSAiaTJjIGJ0ODMyIGRyaXZlciIsCisJCS5uYW1lICAgPSAiYnQ4MzIiLAogCX0sCi0JLmlkICAgICAgICAgICAgID0gLTEsIC8qIEZJWE1FICovCisJLmlkICAgICAgICAgICAgID0gMCwgLyogRklYTUUgKi8KIAkuYXR0YWNoX2FkYXB0ZXIgPSBidDgzMl9wcm9iZSwKIAkuZGV0YWNoX2NsaWVudCAgPSBidDgzMl9kZXRhY2gsCiAJLmNvbW1hbmQgICAgICAgID0gYnQ4MzJfY29tbWFuZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4NTYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4NTYuYwppbmRleCA2MDUwODA2Li45MDliNTkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODU2LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDg1Ni5jCkBAIC0zMTYsMjEgKzMxNiwxOSBAQAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKIAkJcmV0dXJuIDA7CiAKLQljbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNsaWVudCA9PSAwKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQoY2xpZW50LCAwLCBzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKIAljbGllbnQtPmFkZHIgPSBhZGRyZXNzOwogCWNsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CiAJY2xpZW50LT5kcml2ZXIgPSAmaTJjX2RyaXZlcl9idDg1NjsKIAlzdHJsY3B5KEkyQ19OQU1FKGNsaWVudCksICJidDg1NiIsIHNpemVvZihJMkNfTkFNRShjbGllbnQpKSk7CiAKLQllbmNvZGVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGJ0ODU2KSwgR0ZQX0tFUk5FTCk7CisJZW5jb2RlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidDg1NiksIEdGUF9LRVJORUwpOwogCWlmIChlbmNvZGVyID09IE5VTEwpIHsKIAkJa2ZyZWUoY2xpZW50KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbXNldChlbmNvZGVyLCAwLCBzaXplb2Yoc3RydWN0IGJ0ODU2KSk7CiAJZW5jb2Rlci0+bm9ybSA9IFZJREVPX01PREVfTlRTQzsKIAllbmNvZGVyLT5lbmFibGUgPSAxOwogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGVuY29kZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idGN4LXJpc2MuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnRjeC1yaXNjLmMKaW5kZXggYTQ4ZGUzYy4uYjRhY2E3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idGN4LXJpc2MuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0Y3gtcmlzYy5jCkBAIC0zNyw3ICszNyw3IEBACiBNT0RVTEVfQVVUSE9SKCJHZXJkIEtub3JyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWcgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1ZzsKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsImRlYnVnIG1lc3NhZ2VzLCBkZWZhdWx0IGlzIDAgKG5vKSIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1jYXJkcy5jCmluZGV4IDAxMmJlNjMuLjk3NDlkNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1jYXJkcy5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlICJidHR2cC5oIgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAKIC8qIGZ3ZCBkZWNsICovCiBzdGF0aWMgdm9pZCBib290X21zcDM0eHgoc3RydWN0IGJ0dHYgKmJ0diwgaW50IHBpbik7CkBAIC05MSw4ICs5Miw4IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBwdnJfYm9vdChzdHJ1Y3QgYnR0diAqYnR2KTsKIAogLyogY29uZmlnIHZhcmlhYmxlcyAqLwotc3RhdGljIHVuc2lnbmVkIGludCB0cml0b24xPTA7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHZzZng9MDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHJpdG9uMTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdnNmeDsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbGF0ZW5jeSA9IFVOU0VUOwogaW50IG5vX292ZXJsYXk9LTE7CiAKQEAgLTEwNSw3ICsxMDYsNyBAQAogI2lmZGVmIE1PRFVMRQogc3RhdGljIHVuc2lnbmVkIGludCBhdXRvbG9hZCA9IDE7CiAjZWxzZQotc3RhdGljIHVuc2lnbmVkIGludCBhdXRvbG9hZCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGF1dG9sb2FkOwogI2VuZGlmCiBzdGF0aWMgdW5zaWduZWQgaW50IGdwaW9tYXNrID0gVU5TRVQ7CiBzdGF0aWMgdW5zaWduZWQgaW50IGF1ZGlvYWxsID0gVU5TRVQ7CkBAIC0yOTIsNiArMjkzLDkgQEAKIAkvKiBsaWtlbHkgYnJva2VuLCB2ZW5kb3IgaWQgZG9lc24ndCBtYXRjaCB0aGUgb3RoZXIgbWFnaWMgdmlld3MgLi4uCiAJICogeyAweGEwZmNhMDRmLCBCVFRWX0JPQVJEX01BR0lDVFZJRVcwNjMsICJHdWlsbGVtb3QgTWF4aSBUViBWaWRlbyAzIiB9LCAqLwogCisJLyogRHVwbGljYXRlIFBDSSBJRCwgcmVjb25maWd1cmUgZm9yIHRoaXMgYm9hcmQgZHVyaW5nIHRoZSBlZXByb20gcmVhZC4KKwkqIHsgMHgxM2ViMDA3MCwgQlRUVl9CT0FSRF9IQVVQUEFVR0VfSU1QQUNUVkNCLCAgIkhhdXBwYXVnZSBJbXBhY3RWQ0IiIH0sICovCisKIAkvKiBEVkIgY2FyZHMgKHVzaW5nIHBjaSBmdW5jdGlvbiAuMSBmb3IgbXBlZyBkYXRhIHhmZXIpICovCiAJeyAweDAxMDEwMDcxLCBCVFRWX0JPQVJEX05FQlVMQV9ESUdJVFYsICJOZWJ1bGEgRWxlY3Ryb25pY3MgRGlnaVRWIiB9LAogCXsgMHgwNzYxMTQ2MSwgQlRUVl9CT0FSRF9BVkRWQlRfNzYxLCAgICAiQXZlck1lZGlhIEF2ZXJUViBEVkItVCA3NjEiIH0sCkBAIC0zMTcsNyArMzIxLDcgQEAKIAkJLmF1ZGlvX2lucHV0cwk9IDEsCiAJCS50dW5lcgkJPSAwLAogCQkuc3ZocwkJPSAyLAotCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMH0sCisJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwIH0sCiAJCS50dW5lcl90eXBlCT0gLTEsCiAJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKQEAgLTMyOSw4ICszMzMsOCBAQAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gMiwKIAkJLmdwaW9tYXNrCT0gMTUsCi0JCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKLQkJLmF1ZGlvbXV4CT0geyAyLCAwLCAwLCAwLCAxMH0sCisJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCisJCS5hdWRpb211eAk9IHsgMiwgMCwgMCwgMCwgMTAgfSwKIAkJLm5lZWRzX3R2YXVkaW8JPSAxLAogCQkudHVuZXJfdHlwZQk9IC0xLAogCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCkBAIC0zNDMsOCArMzQ3LDggQEAKIAkJLnR1bmVyCQk9IDAsCiAJCS5zdmhzCQk9IDIsCiAJCS5ncGlvbWFzawk9IDcsCi0JCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKLQkJLmF1ZGlvbXV4CT0geyAwLCAxLCAyLCAzLCA0fSwKKwkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKKwkJLmF1ZGlvbXV4CT0geyAwLCAxLCAyLCAzLCA0IH0sCiAJCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkJLnR1bmVyX3R5cGUJPSAtMSwKIAkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULApAQCAtMzU3LDggKzM2MSw4IEBACiAJCS50dW5lcgkJPSAwLAogCQkuc3ZocwkJPSAyLAogCQkuZ3Bpb21hc2sJPSA3LAotCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCi0JCS5hdWRpb211eAk9IHsgNCwgMCwgMiwgMywgMX0sCisJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCisJCS5hdWRpb211eAk9IHsgNCwgMCwgMiwgMywgMSB9LAogCQkubm9fbXNwMzR4eAk9IDEsCiAJCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDLApAQCAtMzc2LDcgKzM4MCw3IEBACiAJCS50dW5lcgkJPSAtMSwKIAkJLnN2aHMJCT0gMiwKIAkJLmdwaW9tYXNrCT0gMCwKLQkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAorCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAogCQkuYXVkaW9tdXgJPSB7IDAgfSwKIAkJLm5lZWRzX3R2YXVkaW8JPSAwLAogCQkudHVuZXJfdHlwZQk9IDQsCkBAIC0zOTAsOCArMzk0LDggQEAKIAkJLnR1bmVyCQk9IDAsCiAJCS5zdmhzCQk9IDIsCiAJCS5ncGlvbWFzawk9IDMsCi0JCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwfSwKLQkJLmF1ZGlvbXV4CT0geyAwLCAxLCAwLCAxLCAzfSwKKwkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAgfSwKKwkJLmF1ZGlvbXV4CT0geyAwLCAxLCAwLCAxLCAzIH0sCiAJCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkJLnR1bmVyX3R5cGUJPSAtMSwKIAkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULApAQCAtNDAzLDkgKzQwNyw5IEBACiAJCS5hdWRpb19pbnB1dHMJPSAxLAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gMywKLQkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAorCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAogCQkuZ3Bpb21hc2sJPSAweDBmLAotCQkuYXVkaW9tdXgJPSB7IDB4MGMsIDB4MDQsIDB4MDgsIDB4MDQsIDB9LAorCQkuYXVkaW9tdXgJPSB7IDB4MGMsIDB4MDQsIDB4MDgsIDB4MDQsIDAgfSwKIAkJLyogICAgICAgICAgICAgICAgMHgwNCBmb3Igc29tZSBjYXJkcyA/PyAqLwogCQkubmVlZHNfdHZhdWRpbwk9IDEsCiAJCS50dW5lcl90eXBlCT0gLTEsCkBAIC00MjEsOCArNDI1LDggQEAKIAkJLnR1bmVyCQk9IC0xLAogCQkuc3ZocwkJPSAzLAogCQkuZ3Bpb21hc2sJPSAwLAotCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMCwgMH0sCi0JCS5hdWRpb211eAk9IHswIH0sCisJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwLCAwIH0sCisJCS5hdWRpb211eAk9IHsgMCB9LAogCQkubmVlZHNfdHZhdWRpbwk9IDEsCiAJCS50dW5lcl90eXBlCT0gLTEsCiAJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKQEAgLTQzNyw4ICs0NDEsOCBAQAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gMiwKIAkJLmdwaW9tYXNrCT0gMHhjMDAsCi0JCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKLQkJLmF1ZGlvbXV4CT0geyAwLCAweGMwMCwgMHg4MDAsIDB4NDAwLCAweGMwMCwgMH0sCisJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCisJCS5hdWRpb211eAk9IHsgMCwgMHhjMDAsIDB4ODAwLCAweDQwMCwgMHhjMDAsIDAgfSwKIAkJLm5lZWRzX3R2YXVkaW8JPSAxLAogCQkucGxsCQk9IFBMTF8yOCwKIAkJLnR1bmVyX3R5cGUJPSAtMSwKQEAgLTQ1Miw4ICs0NTYsOCBAQAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gMiwKIAkJLmdwaW9tYXNrCT0gMywKLQkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAotCQkuYXVkaW9tdXgJPSB7IDEsIDEsIDIsIDMsIDB9LAorCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAorCQkuYXVkaW9tdXgJPSB7IDEsIDEsIDIsIDMsIDAgfSwKIAkJLm5lZWRzX3R2YXVkaW8JPSAwLAogCQkucGxsCQk9IFBMTF8yOCwKIAkJLnR1bmVyX3R5cGUJPSBUVU5FUl9URU1JQ19QQUwsCkBAIC00NjcsOCArNDcxLDggQEAKIAkJLnR1bmVyCQk9IDAsCiAJCS5zdmhzCQk9IDIsCiAJCS5ncGlvbWFzawk9IDB4MGYsIC8qIG9sZDogNyAqLwotCQkubXV4c2VsCQk9IHsgMiwgMCwgMSwgMX0sCi0JCS5hdWRpb211eAk9IHsgMCwgMSwgMiwgMywgNH0sCisJCS5tdXhzZWwJCT0geyAyLCAwLCAxLCAxIH0sCisJCS5hdWRpb211eAk9IHsgMCwgMSwgMiwgMywgNCB9LAogCQkubmVlZHNfdHZhdWRpbwk9IDEsCiAJCS5wbGwJCT0gUExMXzI4LAogCQkudHVuZXJfdHlwZQk9IC0xLApAQCAtNDgyLDggKzQ4Niw4IEBACiAJCS50dW5lcgkJPSAwLAogCQkuc3ZocwkJPSAyLAogCQkuZ3Bpb21hc2sJPSAweDMwMTRmLAotCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCi0JCS5hdWRpb211eAk9IHsgMHgyMDAwMSwweDEwMDAxLCAwLCAwLDEwfSwKKwkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKKwkJLmF1ZGlvbXV4CT0geyAweDIwMDAxLDB4MTAwMDEsIDAsIDAsMTAgfSwKIAkJLm5lZWRzX3R2YXVkaW8JPSAxLAogCQkudHVuZXJfdHlwZQk9IC0xLAogCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCkBAIC00OTgsOCArNTAyLDggQEAKIAkJLnR1bmVyCQk9IDAsCiAJCS5zdmhzCQk9IDIsCiAJCS5ncGlvbWFzawk9IDE1LAotCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCi0JCS5hdWRpb211eAk9IHsgMTMsIDE0LCAxMSwgNywgMCwgMH0sCisJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCisJCS5hdWRpb211eAk9IHsgMTMsIDE0LCAxMSwgNywgMCwgMCB9LAogCQkubmVlZHNfdHZhdWRpbwk9IDEsCiAJCS50dW5lcl90eXBlCT0gLTEsCiAJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKQEAgLTUxMiw4ICs1MTYsOCBAQAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gMiwKIAkJLmdwaW9tYXNrCT0gMTUsCi0JCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKLQkJLmF1ZGlvbXV4CT0geyAxMywgMTQsIDExLCA3LCAwLCAwfSwKKwkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKKwkJLmF1ZGlvbXV4CT0geyAxMywgMTQsIDExLCA3LCAwLCAwIH0sCiAJCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkJLm1zcDM0eHhfYWx0ICAgID0gMSwKIAkJLnBsbAkJPSBQTExfMjgsCkBAIC01MzAsOCArNTM0LDggQEAKIAkJLnR1bmVyCQk9IDAsCiAJCS5zdmhzCQk9IDIsCiAJCS5ncGlvbWFzawk9IDcsCi0JCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKLQkJLmF1ZGlvbXV4CT0geyAwLCAyLCAxLCAzLCA0fSwgLyogb2xkOiB7IDAsIDEsIDIsIDMsIDR9ICovCisJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCisJCS5hdWRpb211eAk9IHsgMCwgMiwgMSwgMywgNCB9LCAvKiBvbGQ6IHswLCAxLCAyLCAzLCA0fSAqLwogCQkubmVlZHNfdHZhdWRpbwk9IDEsCiAJCS5wbGwJCT0gUExMXzI4LAogCQkudHVuZXJfdHlwZQk9IC0xLApAQCAtNTQ1LDggKzU0OSw4IEBACiAJCS50dW5lcgkJPSAwLAogCQkuc3ZocwkJPSAyLAogCQkuZ3Bpb21hc2sJPSAxNSwKLQkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAotCQkuYXVkaW9tdXgJPSB7MCAsIDAsIDEgLCAwLCAxMH0sCisJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCisJCS5hdWRpb211eAk9IHsgMCAsIDAsIDEgLCAwLCAxMCB9LAogCQkubmVlZHNfdHZhdWRpbwk9IDEsCiAJCS50dW5lcl90eXBlCT0gLTEsCiAJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKQEAgLTU2MSw3ICs1NjUsNyBAQAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gMiwKIAkJLmdwaW9tYXNrCT0gMHgwMWZlMDAsCi0JCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKKwkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKIAkjaWYgMAogCQkvKiBvbGQgKi8KIAkJLmF1ZGlvbXV4CT0geyAweDAxYzAwMCwgMCwgMHgwMTgwMDAsIDB4MDE0MDAwLCAweDAwMjAwMCwgMCB9LApAQCAtNTgwLDggKzU4NCw4IEBACiAJCS50dW5lcgkJPSAwLAogCQkuc3ZocwkJPSAyLAogCQkuZ3Bpb21hc2sJPSAweDgzMDBmOCwKLQkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEsMH0sCi0JCS5hdWRpb211eAk9IHsgMHg0ZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDd9LAorCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSwwIH0sCisJCS5hdWRpb211eAk9IHsgMHg0ZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcgfSwKIAkJLm5lZWRzX3R2YXVkaW8JPSAxLAogCQkudHVuZXJfdHlwZQk9IC0xLAogCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCkBAIC01OTYsOCArNjAwLDggQEAKIAkJLnR1bmVyCQk9IDAsCiAJCS5zdmhzCQk9IDIsCiAJCS5ncGlvbWFzawk9IDAsCi0JCS5tdXhzZWwJCT0gezIsIDMsIDEsIDF9LAotCQkuYXVkaW9tdXgJPSB7MSwgMCwgMCwgMCwgMH0sCisJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCisJCS5hdWRpb211eAk9IHsgMSwgMCwgMCwgMCwgMCB9LAogCQkubmVlZHNfdHZhdWRpbwk9IDEsCiAJCS50dW5lcl90eXBlCT0gLTEsCiAJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKQEAgLTYxMCw3ICs2MTQsNyBAQAogCQkudHVuZXIJCT0gLTEsCiAJCS5zdmhzCQk9IC0xLAogCQkuZ3Bpb21hc2sJPSAweDhkZmYwMCwKLQkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAorCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAogCQkuYXVkaW9tdXgJPSB7IDAgfSwKIAkJLm5vX21zcDM0eHgJPSAxLAogCQkudHVuZXJfdHlwZQk9IC0xLApAQCAtNjI1LDcgKzYyOSw3IEBACiAJCS5hdWRpb19pbnB1dHMJPSAzLAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gMiwKLQkJLm11eHNlbAkJPSB7MiwgMywgMSwgMX0sCisJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCiAJCS50dW5lcl90eXBlCT0gLTEsCiAJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKQEAgLTYzNyw4ICs2NDEsOCBAQAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gMiwKIAkJLmdwaW9tYXNrCT0gMHgxODAwLAotCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCi0JCS5hdWRpb211eAk9IHsgMCwgMHg4MDAsIDB4MTAwMCwgMHgxMDAwLCAweDE4MDB9LAorCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAorCQkuYXVkaW9tdXgJPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwIH0sCiAJCS5wbGwJCT0gUExMXzI4LAogCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMX0ksCiAJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKQEAgLTY1MSw4ICs2NTUsOCBAQAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gMiwKIAkJLmdwaW9tYXNrCT0gMHhjMDAsCi0JCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKLQkJLmF1ZGlvbXV4CT0gezAsIDEsIDB4ODAwLCAweDQwMCwgMHhjMDAsIDB9LAorCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAorCQkuYXVkaW9tdXgJPSB7IDAsIDEsIDB4ODAwLCAweDQwMCwgMHhjMDAsIDAgfSwKIAkJLm5lZWRzX3R2YXVkaW8JPSAxLAogCQkucGxsCQk9IFBMTF8yOCwKIAkJLnR1bmVyX3R5cGUJPSAtMSwKQEAgLTY4NCw4ICs2ODgsOCBAQAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gMiwKIAkJLmdwaW9tYXNrCT0gMHhlMDAsCi0JCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKLQkJLmF1ZGlvbXV4CT0gezB4NDAwLCAweDQwMCwgMHg0MDAsIDB4NDAwLCAweGMwMH0sCisJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCisJCS5hdWRpb211eAk9IHsweDQwMCwgMHg0MDAsIDB4NDAwLCAweDQwMCwgMHhjMDAgfSwKIAkJLm5lZWRzX3R2YXVkaW8JPSAxLAogCQkucGxsCQk9IFBMTF8yOCwKIAkJLnR1bmVyX3R5cGUJPSAtMSwKQEAgLTcwMCw4ICs3MDQsOCBAQAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gMiwKIAkJLmdwaW9tYXNrICAgICAgID0gMHgxZjBmZmYsCi0JCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKLQkJLmF1ZGlvbXV4ICAgICAgID0geyAweDIwMDAwLCAweDMwMDAwLCAweDEwMDAwLCAwLCAweDQwMDAwfSwKKwkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKKwkJLmF1ZGlvbXV4ICAgICAgID0geyAweDIwMDAwLCAweDMwMDAwLCAweDEwMDAwLCAwLCAweDQwMDAwIH0sCiAJCS5uZWVkc190dmF1ZGlvCT0gMCwKIAkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKIAkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULApAQCAtNzE1LDggKzcxOSw4IEBACiAJCS50dW5lcgkJPSAwLAogCQkuc3ZocwkJPSAzLAogCQkuZ3Bpb21hc2sJPSA3LAotCQkubXV4c2VsCQk9IHsgMiwgMCwgMSwgMX0sCi0JCS5hdWRpb211eAk9IHsgMCwgMSwgMiwgMywgNH0sCisJCS5tdXhzZWwJCT0geyAyLCAwLCAxLCAxIH0sCisJCS5hdWRpb211eAk9IHsgMCwgMSwgMiwgMywgNCB9LAogCQkubmVlZHNfdHZhdWRpbwk9IDEsCiAJCS50dW5lcl90eXBlCT0gLTEsCiAJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKQEAgLTcyOSw4ICs3MzMsOCBAQAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gMiwKIAkJLmdwaW9tYXNrCT0gMHgxODAwLAotCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCi0JCS5hdWRpb211eAk9IHsgMCwgMHg4MDAsIDB4MTAwMCwgMHgxMDAwLCAweDE4MDB9LAorCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAorCQkuYXVkaW9tdXgJPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwIH0sCiAJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1NFQ0FNLAogCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCkBAIC03NDUsOCArNzQ5LDggQEAKIAkJLnR1bmVyCQk9IDAsCiAJCS5zdmhzCQk9IDIsCiAJCS5ncGlvbWFzawk9IDB4MWYwZmZmLAotCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCi0JCS5hdWRpb211eAk9IHsgMHgyMDAwMCwgMHgzMDAwMCwgMHgxMDAwMCwgMHgwMDAwMCwgMHg0MDAwMH0sCisJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCisJCS5hdWRpb211eAk9IHsgMHgyMDAwMCwgMHgzMDAwMCwgMHgxMDAwMCwgMHgwMDAwMCwgMHg0MDAwMCB9LAogCQkubmVlZHNfdHZhdWRpbwk9IDAsCiAJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCiAJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKQEAgLTgwOCw3ICs4MTIsNyBAQAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gMiwKIAkJLmdwaW9tYXNrCT0gMHgxODAwLCAgLyogMHg4ZGZlMDAgKi8KLQkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAorCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAogCQkuYXVkaW9tdXgJPSB7IDAsIDB4MDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMCwgMCB9LAogCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJCS50dW5lcl90eXBlCT0gLTEsCkBAIC04MjIsNyArODI2LDcgQEAKIAkJLnR1bmVyCQk9IDAsCiAJCS5zdmhzCQk9IDMsCiAJCS5ncGlvbWFzawk9IDEsCi0JCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKKwkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKIAkJLmF1ZGlvbXV4CT0geyAxLCAwLCAwLCAwLCAwIH0sCiAJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKQEAgLTgzOCw3ICs4NDIsNyBAQAogCQkudHVuZXIJCT0gLTEsCiAJCS5zdmhzCQk9IDIsCiAJCS5ncGlvbWFzawk9IDAsCi0JCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKKwkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKIAkJLmF1ZGlvbXV4CT0geyAwIH0sCiAJCS5uZWVkc190dmF1ZGlvCT0gMCwKIAkJLnR1bmVyX3R5cGUJPSA0LApAQCAtODUyLDggKzg1Niw4IEBACiAJCS50dW5lcgkJPSAwLAogCQkuc3ZocwkJPSAyLAogCQkuZ3Bpb21hc2sJPSAweGZmZmYwMCwKLQkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAotCQkuYXVkaW9tdXgJPSB7IDB4NTAwLCAwLCAweDMwMCwgMHg5MDAsIDB4OTAwfSwKKwkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKKwkJLmF1ZGlvbXV4CT0geyAweDUwMCwgMCwgMHgzMDAsIDB4OTAwLCAweDkwMCB9LAogCQkubmVlZHNfdHZhdWRpbwk9IDEsCiAJCS5wbGwJCT0gUExMXzI4LAogCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLApAQCAtODY2LDcgKzg3MCw3IEBACiAJCS5hdWRpb19pbnB1dHMJPSAxLAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gMiwKLQkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEsIDB9LCAvKiBUViwgQ1ZpZCwgU1ZpZCwgQ1ZpZCBvdmVyIFNWaWQgY29ubmVjdG9yICovCisJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxLCAwIH0sIC8qIFRWLCBDVmlkLCBTVmlkLCBDVmlkIG92ZXIgU1ZpZCBjb25uZWN0b3IgKi8KIAkjaWYgMAogCQkuZ3Bpb21hc2sJPSAweGMzMzAwMCwKIAkJLmF1ZGlvbXV4CT0geyAweDQyMjAwMCwweDEwMDAsMHgwMDAwLDB4NjIwMDAwLDB4ODAwMDAwIH0sCkBAIC05MDIsOCArOTA2LDggQEAKIAkJLnR1bmVyCQk9IDAsCiAJCS5zdmhzCQk9IDIsCiAJCS5ncGlvbWFzawk9IDB4MTgwMCwKLQkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAotCQkuYXVkaW9tdXgJPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwfSwKKwkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKKwkJLmF1ZGlvbXV4CT0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMCB9LAogCQkucGxsCQk9IFBMTF8yOCwKIAkJLnR1bmVyX3R5cGUJPSAtMSwKIAkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULApAQCAtOTE4LDcgKzkyMiw3IEBACiAJCS50dW5lcgkJPSAwLAogCQkuc3ZocwkJPSAyLAogCQkuZ3Bpb21hc2sJPSAweDE4MDAsCi0JCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKKwkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKIAkJLmF1ZGlvbXV4CT0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMCwgMCB9LAogCQkucGxsCQk9IFBMTF8yOCwKIAkJLnR1bmVyX3R5cGUJPSAtMSwKQEAgLTk0OCw3ICs5NTIsNyBAQAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gMiwKIAkJLmdwaW9tYXNrCT0gMHg1NTFlMDAsCi0JCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwfSwKKwkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAgfSwKIAkJLmF1ZGlvbXV4CT0geyAweDU1MTQwMCwgMHg1NTEyMDAsIDAsIDAsIDB4NTUxYzAwLCAweDU1MTIwMCB9LAogCQkubmVlZHNfdHZhdWRpbwk9IDEsCiAJCS5wbGwJCT0gUExMXzI4LApAQCAtOTY0LDggKzk2OCw4IEBACiAJCS50dW5lcgkJPSAwLAogCQkuc3ZocwkJPSAyLAogCQkuZ3Bpb21hc2sJPSAweDAzMDAwRiwKLQkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAotCQkuYXVkaW9tdXgJPSB7IDIsIDB4ZDAwMDEsIDAsIDAsIDF9LAorCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAorCQkuYXVkaW9tdXgJPSB7IDIsIDB4ZDAwMDEsIDAsIDAsIDEgfSwKIAkJLm5lZWRzX3R2YXVkaW8JPSAwLAogCQkucGxsCQk9IFBMTF8yOCwKIAkJLnR1bmVyX3R5cGUJPSAtMSwKQEAgLTk4MSw4ICs5ODUsOCBAQAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gMiwKIAkJLmdwaW9tYXNrCT0gNywKLQkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAotCQkuYXVkaW9tdXgJPSB7IDQsIDAsIDIsIDMsIDF9LAorCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAorCQkuYXVkaW9tdXgJPSB7IDQsIDAsIDIsIDMsIDEgfSwKIAkJLm5vX21zcDM0eHgJPSAxLAogCQkubmVlZHNfdHZhdWRpbwk9IDEsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKQEAgLTk5OCw4ICsxMDAyLDggQEAKIAkJLnR1bmVyCQk9IDAsCiAJCS5zdmhzCQk9IDIsCiAJCS5ncGlvbWFzawk9IDE1LAotCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCi0JCS5hdWRpb211eAk9IHsgMTMsIDQsIDExLCA3LCAwLCAwfSwKKwkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKKwkJLmF1ZGlvbXV4CT0geyAxMywgNCwgMTEsIDcsIDAsIDAgfSwKIAkJLm5lZWRzX3R2YXVkaW8JPSAxLAogCQkucGxsCQk9IFBMTF8yOCwKIAkJLnR1bmVyX3R5cGUJPSAtMSwKQEAgLTEwMzEsOCArMTAzNSw4IEBACiAJCS50dW5lcgkJPSAwLAogCQkuc3ZocwkJPSAyLAogCQkuZ3Bpb21hc2sJPSAweGUwMGIsCi0JCS5tdXhzZWwJCT0gezIsIDMsIDEsIDF9LAotCQkuYXVkaW9tdXgJPSB7MHhmZjlmZjYsIDB4ZmY5ZmY2LCAweGZmMWZmNywgMCwgMHhmZjNmZmN9LAorCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAorCQkuYXVkaW9tdXgJPSB7IDB4ZmY5ZmY2LCAweGZmOWZmNiwgMHhmZjFmZjcsIDAsIDB4ZmYzZmZjIH0sCiAJCS5ub19tc3AzNHh4CT0gMSwKIAkJLnR1bmVyX3R5cGUJPSAtMSwKIAkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULApAQCAtMTA0Nyw4ICsxMDUxLDggQEAKIAkJLnR1bmVyCQk9IDAsCiAJCS5zdmhzCQk9IC0xLAogCQkuZ3Bpb21hc2sJPSAzLAotCQkubXV4c2VsCQk9IHsyLCAzLCAxLCAxfSwKLQkJLmF1ZGlvbXV4CT0gezEsIDEsIDAsIDIsIDN9LAorCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAorCQkuYXVkaW9tdXgJPSB7IDEsIDEsIDAsIDIsIDMgfSwKIAkJLm5vX21zcDM0eHgJPSAxLAogCQkucGxsCQk9IFBMTF9OT05FLAogCQkudHVuZXJfdHlwZQk9IC0xLApAQCAtMTA2Miw4ICsxMDY2LDggQEAKIAkJLnR1bmVyCQk9IC0xLAogCQkuc3ZocwkJPSAzLAogCQkuZ3Bpb21hc2sJPSAwLAotCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMCwgMH0sCi0JCS5hdWRpb211eAk9IHswIH0sCisJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwLCAwIH0sCisJCS5hdWRpb211eAk9IHsgMCB9LAogCQkubm9fbXNwMzR4eAk9IDEsCiAJCS5wbGwJCT0gUExMXzI4LAogCQkudHVuZXJfdHlwZQk9IC0xLApAQCAtMTA3Nyw4ICsxMDgxLDggQEAKIAkJLnR1bmVyCQk9IDAsCiAJCS5zdmhzCQk9IDIsCiAJCS5ncGlvbWFzawk9IDB4YmNmMDNmLAotCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCi0JCS5hdWRpb211eAk9IHsgMHhiYzgwM2YsIDB4YmM5MDNmLCAweGJjYjAzZiwgMCwgMHhiY2IwM2Z9LAorCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAorCQkuYXVkaW9tdXgJPSB7IDB4YmM4MDNmLCAweGJjOTAzZiwgMHhiY2IwM2YsIDAsIDB4YmNiMDNmIH0sCiAJCS5ub19tc3AzNHh4CT0gMSwKIAkJLnBsbAkJPSBQTExfMjgsCiAJCS50dW5lcl90eXBlCT0gMjEsCkBAIC0xMDkyLDcgKzEwOTYsNyBAQAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gMiwKIAkJLmdwaW9tYXNrCT0gMHg3MDAwMCwKLQkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAorCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAogCQkuYXVkaW9tdXgJPSB7IDB4MjAwMDAsIDB4MzAwMDAsIDB4MTAwMDAsIDAsIDB4NDAwMDAsIDB4MjAwMDAgfSwKIAkJLm5lZWRzX3R2YXVkaW8JPSAxLAogCQkubm9fbXNwMzR4eAk9IDEsCkBAIC0xMTExLDggKzExMTUsOCBAQAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gMiwKIAkJLmdwaW9tYXNrCT0gMTUsCi0JCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKLQkJLmF1ZGlvbXV4CT0gezIsMCwwLDAsMX0sCisJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCisJCS5hdWRpb211eAk9IHsyLDAsMCwwLDEgfSwKIAkJLm5lZWRzX3R2YXVkaW8JPSAxLAogCQkucGxsCQk9IFBMTF8yOCwKIAkJLnR1bmVyX3R5cGUJPSAtMSwKQEAgLTExMjYsOCArMTEzMCw4IEBACiAJCS50dW5lcgkJPSAwLAogCQkuc3ZocwkJPSAyLAogCQkuZ3Bpb21hc2sJPSAweDAxMGYwMCwKLQkJLm11eHNlbAkJPSB7MiwgMywgMCwgMH0sCi0JCS5hdWRpb211eAk9IHsweDEwMDAwLCAwLCAweDEwMDAwLCAwLCAwLCAwfSwKKwkJLm11eHNlbAkJPSB7MiwgMywgMCwgMCB9LAorCQkuYXVkaW9tdXgJPSB7MHgxMDAwMCwgMCwgMHgxMDAwMCwgMCwgMCwgMCB9LAogCQkubm9fbXNwMzR4eAk9IDEsCiAJCS5wbGwJCT0gUExMXzI4LAogCQkudHVuZXJfdHlwZQk9IFRVTkVSX0FMUFNfVFNIQzZfTlRTQywKQEAgLTExNjgsOCArMTE3Miw4IEBACiAJCS50dW5lciAgICAgICAgICA9IDAsCiAJCS5zdmhzICAgICAgICAgICA9IDIsCiAJCS5ncGlvbWFzayAgICAgICA9IDcsCi0JCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMCwgMSwgMX0sCi0JCS5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMywgNH0sCisJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMCwgMSwgMSB9LAorCQkuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDMsIDQgfSwKIAkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCQkudHVuZXJfdHlwZSAgICAgPSAtMSAvKiBUVU5FUl9BTFBTX1RNREgyX05UU0MgKi8sCiAJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKQEAgLTExODUsOCArMTE4OSw4IEBACiAJCS50dW5lciAgICAgICAgICA9IDAsCiAJCS5zdmhzICAgICAgICAgICA9IDMsCiAJCS5ncGlvbWFzayAgICAgICA9IDB4MDMwMDBGLAotCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCi0JCS5hdWRpb211eAk9IHsgMSwgMHhkMDAwMSwgMCwgMCwgMTB9LAorCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAorCQkuYXVkaW9tdXgJPSB7IDEsIDB4ZDAwMDEsIDAsIDAsIDEwIH0sCiAJCQkJLyogc291bmQgcGF0aCAoNSBzb3VyY2VzKToKIAkJCQlNVVgxIChtYXNrIDB4MDMpLCBFbmFibGUgUGluIDB4MDggKDA9ZW5hYmxlLCAxPWRpc2FibGUpCiAJCQkJCTA9IGV4dC4gQXVkaW8gSU4KQEAgLTEyMTEsNyArMTIxNSw3IEBACiAJCS50dW5lcgkJPSAwLAogCQkuc3ZocwkJPSAyLAogCQkuZ3Bpb21hc2sJPSAweDFjLAotCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCisJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCiAJCS5hdWRpb211eAk9IHsgMCwgMCwgMHgxMCwgOCwgNCB9LAogCQkubmVlZHNfdHZhdWRpbwk9IDEsCiAJCS5wbGwJCT0gUExMXzI4LApAQCAtMTIzMiw3ICsxMjM2LDcgQEAKIAkJLnR1bmVyCQk9IDAsCiAJCS5zdmhzCQk9IDIsCiAJCS5ncGlvbWFzawk9IDB4MThlMCwKLQkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAorCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAogCQkuYXVkaW9tdXgJPSB7IDB4MDAwMCwweDA4MDAsMHgxMDAwLDB4MTAwMCwweDE4ZTAgfSwKIAkJCS8qIEZvciBjYXJkcyB3aXRoIHRkYTk4MjAvdGRhOTgyMToKIAkJCQkweDAwMDA6IFR1bmVyIG5vcm1hbCBzdGVyZW8KQEAgLTEyNTIsOCArMTI1Niw4IEBACiAJCS50dW5lciAgICAgICAgICA9IDAsCiAJCS5zdmhzICAgICAgICAgICA9IDIsCiAJCS5ncGlvbWFzayAgICAgICA9IDB4RiwKLQkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKLQkJLmF1ZGlvbXV4ICAgICAgID0geyAyLCAwLCAwLCAwLCAxMH0sCisJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAorCQkuYXVkaW9tdXggICAgICAgPSB7IDIsIDAsIDAsIDAsIDEwIH0sCiAJCS5uZWVkc190dmF1ZGlvICA9IDAsCiAJCS5wbGwJCT0gUExMXzI4LAogCQkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDX1BBTCwKQEAgLTEyNzAsNyArMTI3NCw3IEBACiAJCS50dW5lciAgICAgICAgICA9IDAsCiAJCS5zdmhzICAgICAgICAgICA9IDIsCiAJCS5ncGlvbWFzayAgICAgICA9IDB4MTgwMCwKLQkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKKwkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCiAJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMHg4MDAsIDB4MTAwMCwgMHgxMDAwLCAweDE4MDAsIDAgfSwKIAkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCQkudHVuZXJfdHlwZSAgICAgPSA1LApAQCAtMTMyMCw4ICsxMzI0LDggQEAKIAkJLnR1bmVyCQk9IDAsCiAJCS5zdmhzCQk9IDIsCiAJCS5ncGlvbWFzayAgICAgICA9IDB4MDMwMDBGLAotCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMH0sCi0JCS5hdWRpb211eCAgICAgICA9IHsgMiwwLDAsMCwxIH0sCisJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwIH0sCisJCS5hdWRpb211eCAgICAgICA9IHsgMiwgMCwgMCwgMCwgMSB9LAogCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJCS50dW5lcl90eXBlCT0gMCwKIAkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULApAQCAtMTMzNyw4ICsxMzQxLDggQEAKIAkJLnR1bmVyCQk9IDAsCiAJCS5zdmhzCQk9IC0xLAogCQkuZ3Bpb21hc2sgICAgICAgPSAxMSwKLQkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKLQkJLmF1ZGlvbXV4ICAgICAgID0geyAyLCAwLCAwLCAxLCA4fSwKKwkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCisJCS5hdWRpb211eCAgICAgICA9IHsgMiwgMCwgMCwgMSwgOCB9LAogCQkucGxsICAgICAgICAgICAgPSBQTExfMzUsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTUlDX1BBTCwKIAkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULApAQCAtMTM1Miw3ICsxMzU2LDcgQEAKIAkJLnR1bmVyCQk9IC0xLAogCQkuc3ZocwkJPSAxLAogCQkuZ3Bpb21hc2sgICAgICAgPSAweEYsCi0JCS5tdXhzZWwJCT0geyAyLCAyfSwKKwkJLm11eHNlbAkJPSB7IDIsIDIgfSwKIAkJLmF1ZGlvbXV4ICAgICAgID0geyB9LAogCQkubm9fbXNwMzR4eCAgICAgPSAxLAogCQkubmVlZHNfdHZhdWRpbyAgPSAwLApAQCAtMTM3MSw4ICsxMzc1LDggQEAKIAkJLnR1bmVyICAgICAgICAgID0gMCwKIAkJLnN2aHMgICAgICAgICAgID0gMiwKIAkJLmdwaW9tYXNrICAgICAgID0gMHhGRiwKLQkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKLQkJLmF1ZGlvbXV4ICAgICAgID0geyAxLCAwLCA0LCA0LCA5fSwKKwkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCisJCS5hdWRpb211eCAgICAgICA9IHsgMSwgMCwgNCwgNCwgOSB9LAogCQkubmVlZHNfdHZhdWRpbyAgPSAwLAogCQkucGxsCQk9IFBMTF8yOCwKIAkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKQEAgLTEzODgsNyArMTM5Miw3IEBACiAJCS5zdmhzCQk9IDIsCiAJCS5ncGlvbWFzawk9IDB4ZjAzZiwKIAkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAgfSwKLQkJLmF1ZGlvbXV4CT0geyAweGJmZmUsIDAsIDB4YmZmZiwgMCwgMHhiZmZlfSwKKwkJLmF1ZGlvbXV4CT0geyAweGJmZmUsIDAsIDB4YmZmZiwgMCwgMHhiZmZlIH0sCiAJCS5wbGwJCT0gUExMXzI4LAogCQkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDXzQwMDZGTjVfTVVMVElfUEFMLAogCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCkBAIC0xNDA0LDggKzE0MDgsOCBAQAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gLTEsCiAJCS5ncGlvbWFzawk9IDEsCi0JCS5tdXhzZWwJCT0geyAyLCAzLCAwLCAxfSwKLQkJLmF1ZGlvbXV4CT0geyAwLCAwLCAxLCAwLCAwfSwKKwkJLm11eHNlbAkJPSB7IDIsIDMsIDAsIDEgfSwKKwkJLmF1ZGlvbXV4CT0geyAwLCAwLCAxLCAwLCAwIH0sCiAJCS5ub19tc3AzNHh4CT0gMSwKIAkJLnBsbAkJPSBQTExfMjgsCiAJCS50dW5lcl90eXBlCT0gVFVORVJfVEVNSUNfNDAwNkZONV9NVUxUSV9QQUwsCkBAIC0xNDIwLDcgKzE0MjQsNyBAQAogCQkudHVuZXIgICAgICAgICAgPSAwLAogCQkuc3ZocyAgICAgICAgICAgPSAyLAogCQkuZ3Bpb21hc2sJPSAweDE4ZTAsCi0JCS5tdXhzZWwJCT0geyAyLCAzLCAwLCAxfSwKKwkJLm11eHNlbAkJPSB7IDIsIDMsIDAsIDEgfSwKIAkJCQkvKiBSYWRpbyBjaGFuZ2VkIGZyb20gMWU4MCB0byAweDgwMCB0byBtYWtlCiAJCQkJRmx5VmlkZW8yMDAwUyBpbiAuaHUgaGFwcHkgKGdtKSovCiAJCQkJLyogLWRrLT8/Pzogc2V0IG11dGU9MHgxODAwIGZvciB0ZGE5ODc0aCBkYXVnaHRlcmJvYXJkICovCkBAIC0xNDQxLDggKzE0NDUsOCBAQAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gMiwKIAkJLmdwaW9tYXNrCT0gMHhmZmZmMDAsCi0JCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKLQkJLmF1ZGlvbXV4CT0geyAweDUwMCwgMHg1MDAsIDB4MzAwLCAweDkwMCwgMHg5MDB9LAorCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAorCQkuYXVkaW9tdXgJPSB7IDB4NTAwLCAweDUwMCwgMHgzMDAsIDB4OTAwLCAweDkwMCB9LAogCQkubmVlZHNfdHZhdWRpbwk9IDEsCiAJCS5wbGwJCT0gUExMXzI4LAogCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLApAQCAtMTQ1OCw4ICsxNDYyLDggQEAKIAkJLnR1bmVyICAgICAgICAgID0gMCwKIAkJLnN2aHMgICAgICAgICAgID0gMiwKIAkJLmdwaW9tYXNrICAgICAgID0gMHgwMTBmMDAsCi0JCS5tdXhzZWwgICAgICAgICA9IHsyLCAzLCAwLCAwfSwKLQkJLmF1ZGlvbXV4ICAgICAgID0gezB4MTAwMDAsIDAsIDB4MTAwMDAsIDAsIDAsIDB9LAorCQkubXV4c2VsICAgICAgICAgPSB7MiwgMywgMCwgMCB9LAorCQkuYXVkaW9tdXggICAgICAgPSB7MHgxMDAwMCwgMCwgMHgxMDAwMCwgMCwgMCwgMCB9LAogCQkubm9fbXNwMzR4eCAgICAgPSAxLAogCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1NIQVJQXzJVNUpGNTU0MF9OVFNDLApAQCAtMTQ4Myw3ICsxNDg3LDcgQEAKIAkJLmF1ZGlvbXV4ICAgICAgID0gezB4OTQ3ZmZmLCAweDk4N2ZmZiwweDk0N2ZmZiwweDk0N2ZmZiwgMHg5NDdmZmZ9LAogCQkvKiB0dnR1bmVyLCByYWRpbywgICBleHRlcm5hbCxpbnRlcm5hbCwgbXV0ZSwgIHN0ZXJlbwogCQkqIHR1bmVyLCBDb21wb3NpdCwgU1ZpZCwgQ29tcG9zaXQtb24tU3ZpZC1hZGFwdGVyICovCi0JCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMyAsMCAsMX0sCisJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMyAsMCAsMSB9LAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9NVDIwMzIsCiAJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKQEAgLTE1MTEsOCArMTUxNSw4IEBACiAJCS50dW5lciAgICAgICAgICA9IDAsCiAJCS5zdmhzICAgICAgICAgICA9IDIsCiAJCS5ncGlvbWFzayAgICAgICA9IDE1LAotCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAotCQkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDExLCA3LCAxMywgMH0sIC8qIFRWIGFuZCBSYWRpbyB3aXRoIHNhbWUgR1BJTyAhICovCisJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAorCQkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDExLCA3LCAxMywgMCB9LCAvKiBUViBhbmQgUmFkaW8gd2l0aCBzYW1lIEdQSU8gISAqLwogCQkubmVlZHNfdHZhdWRpbyAgPSAxLAogCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJCS50dW5lcl90eXBlICAgICA9IDI1LApAQCAtMTUzMyw3ICsxNTM3LDcgQEAKIAkJLmF1ZGlvX2lucHV0cyAgID0gMCwKIAkJLnR1bmVyCQk9IC0xLAogCQkuc3ZocwkJPSAyLAotCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sIC8qIEFWMSwgQVYyLCBTVkhTLCBDVmlkIGFkYXB0ZXIgb24gU1ZIUyAqLworCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LCAvKiBBVjEsIEFWMiwgU1ZIUywgQ1ZpZCBhZGFwdGVyIG9uIFNWSFMgKi8KIAkJLnBsbAkJPSBQTExfMjgsCiAJCS5ub19tc3AzNHh4CT0gMSwKIAkJLnR1bmVyX3R5cGUJPSBVTlNFVCwKQEAgLTE1NzksNyArMTU4Myw3IEBACiAJCS50dW5lciAgICAgICAgICA9IC0xLAogCQkuc3ZocyAgICAgICAgICAgPSA0LAogCQkuZ3Bpb21hc2sgICAgICAgPSAwLAotCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAsIDB9LAorCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAsIDAgfSwKIAkJLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCiAJCS5uZWVkc190dmF1ZGlvICA9IDAsCiAJCS50dW5lcl90eXBlICAgICA9IC0xLApAQCAtMTY5Miw3ICsxNjk2LDcgQEAKIAkJLm5hbWUgICAgICAgICAgID0gIkRTUCBEZXNpZ24gVENWSURFTyIsCiAJCS52aWRlb19pbnB1dHMgICA9IDQsCiAJCS5zdmhzICAgICAgICAgICA9IC0xLAotCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAorCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKIAkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKIAkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULApAQCAtMTcwNiw3ICsxNzEwLDcgQEAKIAkJLmF1ZGlvX2lucHV0cyAgID0gMSwKIAkJLnR1bmVyICAgICAgICAgID0gMCwKIAkJLnN2aHMgICAgICAgICAgID0gMiwKLQkJLm11eHNlbCAgICAgICAgID0geyAyLCAwLCAxLCAxfSwKKwkJLm11eHNlbCAgICAgICAgID0geyAyLCAwLCAxLCAxIH0sCiAJCS5uZWVkc190dmF1ZGlvICA9IDEsCiAJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkJLnR1bmVyX3R5cGUgICAgID0gLTEsCkBAIC0xNzIzLDcgKzE3MjcsNyBAQAogCQkudHVuZXIgICAgICAgICAgPSAwLAogCQkuc3ZocyAgICAgICAgICAgPSAyLAogCQkuZ3Bpb21hc2sgICAgICAgPSAweDBmMGY4MCwKLQkJLm11eHNlbCAgICAgICAgID0gezIsIDMsIDEsIDB9LAorCQkubXV4c2VsICAgICAgICAgPSB7MiwgMywgMSwgMCB9LAogCQkuYXVkaW9tdXggICAgICAgPSB7MHgwMzAwMDAsIDB4MDEwMDAwLCAwLCAwLCAweDAyMDAwMCwgMH0sCiAJCS5ub19tc3AzNHh4ICAgICA9IDEsCiAJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKQEAgLTE5NDAsNyArMTk0NCw3IEBACiAJCS5ub19tc3AzNHh4ICAgICA9IDEsCiAJCS5ub190ZGE5ODc1ICAgICA9IDEsCiAJCS5ub190ZGE3NDMyICAgICA9IDEsCi0JCS5tdXhzZWwgICAgICAgICA9IHsgMywgMCwgMSwgMn0sCisJCS5tdXhzZWwgICAgICAgICA9IHsgMywgMCwgMSwgMiB9LAogCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJCS5ub19ncGlvaXJxICAgICA9IDEsCiAJCS5oYXNfZHZiICAgICAgICA9IDEsCkBAIC0xOTUzLDcgKzE5NTcsNyBAQAogCQkuc3ZocyAgICAgICAgICAgPSAzLAogCQkuZ3Bpb21hc2sgICAgICAgPSAyLAogCQkvKiBUViwgQ29tcDEsIENvbXBvc2l0ZSBvdmVyIFNWSUQgY29uLCBTVklEICovCi0JCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCisJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAogCQkuYXVkaW9tdXggICAgICAgPSB7IDIsIDIsIDAsIDAsIDAgfSwKIAkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCQkuaGFzX3JhZGlvICAgICAgPSAxLApAQCAtMjA3MCw3ICsyMDc0LDcgQEAKIAkJLmF1ZGlvX2lucHV0cyAgID0gMSwKIAkJLnR1bmVyICAgICAgICAgID0gMCwKIAkJLnN2aHMgICAgICAgICAgID0gMiwKLQkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwgLyogVHVuZXIsIENWaWQsIFNWaWQsIENWaWQgb3ZlciBTVmlkIGNvbm5lY3RvciAqLworCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwgLyogVHVuZXIsIENWaWQsIFNWaWQsIENWaWQgb3ZlciBTVmlkIGNvbm5lY3RvciAqLwogCQkuZ3Bpb21hc2sgICAgICAgPSAwLAogCQkubm9fdGRhOTg3NSAgICAgPSAxLAogCQkubm9fdGRhNzQzMiAgICAgPSAxLApAQCAtMjEyNCw3ICsyMTI4LDcgQEAKIAkJLnZpZGVvX2lucHV0cyAgID0gMSwKIAkJLnR1bmVyICAgICAgICAgID0gLTEsCiAJCS5zdmhzICAgICAgICAgICA9IC0xLAotCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAorCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKIAkJLm5vX21zcDM0eHggICAgID0gMSwKIAkJLm5vX3RkYTk4NzUgICAgID0gMSwKIAkJLm5vX3RkYTc0MzIgICAgID0gMSwKQEAgLTIxMzYsNyArMjE0MCw2IEBACiAJCS5oYXNfcmVtb3RlCT0gMSwKIAkJLmdwaW9tYXNrCT0gMHgxYiwKIAkJLm5vX2dwaW9pcnEgICAgID0gMSwKLQkJLmFueV9pcnEJCT0gMSwKIAl9LAogCVtCVFRWX0JPQVJEX1BWMTQzXSA9IHsKIAkJLyogSm9yZ2UgQm9uY29tcHRlIC0gRFRJMiA8am9yZ2VAZHRpMi5uZXQ+ICovCkBAIC0yMTYzLDcgKzIxNjYsNyBAQAogCQkudHVuZXIgICAgICAgICAgPSAtMSwgLyogY2FyZCBoYXMgbm8gdHVuZXIgKi8KIAkJLnN2aHMgICAgICAgICAgID0gMywKIAkJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKLQkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKKwkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCiAJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwogCQkubmVlZHNfdHZhdWRpbyAgPSAxLAogCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCkBAIC0yMTc4LDcgKzIxODEsNyBAQAogCQkudHVuZXIgICAgICAgICAgPSAtMSwgLyogY2FyZCBoYXMgbm8gdHVuZXIgKi8KIAkJLnN2aHMgICAgICAgICAgID0gMywKIAkJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKLQkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKKwkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCiAJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwogCQkubmVlZHNfdHZhdWRpbyAgPSAxLAogCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCkBAIC0yMjY1LDcgKzIyNjgsNyBAQAogCQkuYXVkaW9faW5wdXRzICAgPSAxLAogCQkudHVuZXIgICAgICAgICAgPSAwLAogCQkuc3ZocyAgICAgICAgICAgPSAyLAotCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAorCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19BVFNDLAogCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCkBAIC0yMjg4LDcgKzIyOTEsNyBAQAogCQkuYXVkaW9faW5wdXRzICAgPSAwLAogCQkuc3ZocyAgICAgICAgICAgPSAxLAogCQkudHVuZXIgICAgICAgICAgPSAtMSwKLQkJLm11eHNlbCAgICAgICAgID0geyAzLCAxLCAxLCAzfSwgLyogVmlkIEluLCBTVmlkIEluLCBWaWQgb3ZlciBTVmlkIGluIGNvbm5lY3RvciAqLworCQkubXV4c2VsICAgICAgICAgPSB7IDMsIDEsIDEsIDMgfSwgLyogVmlkIEluLCBTVmlkIEluLCBWaWQgb3ZlciBTVmlkIGluIGNvbm5lY3RvciAqLwogCQkubm9fbXNwMzR4eCAgICAgPSAxLAogCQkubm9fdGRhOTg3NSAgICAgPSAxLAogCQkubm9fdGRhNzQzMiAgICAgPSAxLApAQCAtMjMwNCw4ICsyMzA3LDggQEAKIAkJLnR1bmVyICAgICAgICAgID0gMCwKIAkJLnN2aHMgICAgICAgICAgID0gMiwKIAkJLmdwaW9tYXNrICAgICAgID0gMywKLQkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKLQkJLmF1ZGlvbXV4ICAgICAgID0geyAxLCAxLCAxLCAxLCAwfSwKKwkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCisJCS5hdWRpb211eCAgICAgICA9IHsgMSwgMSwgMSwgMSwgMCB9LAogCQkubmVlZHNfdHZhdWRpbyAgPSAxLAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKIAkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULApAQCAtMjMyNCw3ICsyMzI3LDcgQEAKIAkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAogCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCi0JCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMiwgMiwgMn0sCisJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMiwgMiwgMiB9LAogCQkuZ3Bpb21hc2sgICAgICAgPSAweDNGLAogCQkubXV4c2VsX2hvb2sgICAgPSBndmMxMTAwX211eHNlbCwKIAl9LApAQCAtMjMzNSw4ICsyMzM4LDggQEAKIAkJLnR1bmVyICAgICAgICAgID0gMCwKIAkJLnN2aHMgICAgICAgICAgID0gMiwKIAkJLmdwaW9tYXNrICAgICAgID0gMHgwMDgwMDcsCi0JCS5tdXhzZWwgICAgICAgICA9IHsyLCAzLCAwLCAwfSwKLQkJLmF1ZGlvbXV4ICAgICAgID0gezAsIDAsIDAsIDAsIDB4MDAwMDAzLCAwfSwKKwkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAwLCAwIH0sCisJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMHgwMDAwMDMsIDAgfSwKIAkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKIAkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULApAQCAtMjM3MSw3ICsyMzc0LDcgQEAKIAkJLnN2aHMgICAgICAgICAgID0gMiwKIAkJLm5lZWRzX3R2YXVkaW8gID0gMCwKIAkJLmdwaW9tYXNrICAgICAgID0gMHg2OCwKLQkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxfSwKKwkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxIH0sCiAJCS5hdWRpb211eCAgICAgICA9IHsgMHg2OCwgMHg2OCwgMHg2MSwgMHg2MSwgMHgwMCB9LAogCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJfSwKQEAgLTI0MzAsNyArMjQzMyw3IEBACiAJCS5zdmhzICAgICAgICAgICA9IDIsCiAJCS5ncGlvbWFzayAgICAgICA9IDB4MDAwMDAwMGYsCiAJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMSwgMSB9LAotCQkuYXVkaW9tdXggICAgICAgPSB7IDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAorCQkuYXVkaW9tdXggICAgICAgPSB7IDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfVEVNSUNfUEFMLAogCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCkBAIC0yNDYzLDcgKzI0NjYsNyBAQAogCQkudmlkZW9faW5wdXRzICAgPSAyLAogCQkudHVuZXIgICAgICAgICAgPSAtMSwKIAkJLnN2aHMgICAgICAgICAgID0gMSwKLQkJLm11eHNlbCAgICAgICAgID0geyAzLCAxLCAyLCAwfSwgLyogQ29tcDAsIFMtVmlkZW8sID8sID8gKi8KKwkJLm11eHNlbCAgICAgICAgID0geyAzLCAxLCAyLCAwIH0sIC8qIENvbXAwLCBTLVZpZGVvLCA/LCA/ICovCiAJCS5ub19tc3AzNHh4ICAgICA9IDEsCiAJCS5ub190ZGE5ODc1ICAgICA9IDEsCiAJCS5ub190ZGE3NDMyICAgICA9IDEsCkBAIC0yNTIwLDggKzI1MjMsOCBAQAogCQkudHVuZXIgICAgICAgICAgPSAwLAogCQkuc3ZocyAgICAgICAgICAgPSAtMSwKIAkJLmdwaW9tYXNrICAgICAgID0gMHhGRiwKLQkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKLQkJLmF1ZGlvbXV4ICAgICAgID0geyAyLCAwLCAwLCAwLCAxMH0sCisJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAorCQkuYXVkaW9tdXggICAgICAgPSB7IDIsIDAsIDAsIDAsIDEwIH0sCiAJCS5uZWVkc190dmF1ZGlvICA9IDAsCiAJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCkBAIC0yNTU0LDggKzI1NTcsOCBAQAogCQkudHVuZXIgICAgICAgICAgPSAwLAogCQkuc3ZocyAgICAgICAgICAgPSAyLAogCQkuZ3Bpb21hc2sgICAgICAgPSAweDNmLAotCQkubXV4c2VsICAgICAgICAgPSB7MiwgMywgMSwgMH0sCi0JCS5hdWRpb211eCAgICAgICA9IHsweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxfSwKKwkJLm11eHNlbCAgICAgICAgID0gezIsIDMsIDEsIDAgfSwKKwkJLmF1ZGlvbXV4ICAgICAgID0gezB4MzEsIDB4MzEsIDB4MzEsIDB4MzEsIDB4MzEsIDB4MzEgfSwKIAkJLm5vX21zcDM0eHggICAgID0gMSwKIAkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKQEAgLTI1NzMsMTIgKzI1NzYsMTIgQEAKIAkJLmF1ZGlvX2lucHV0cyAgID0gMSwKIAkJLnR1bmVyICAgICAgICAgID0gMCwKIAkJLnN2aHMgICAgICAgICAgID0gMiwKLQkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKKwkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKIAkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAogCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwODAwNywKLQkJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAweDAwMDAwMSwwLDAsIDB9LAorCQkuYXVkaW9tdXggICAgICAgPSB7IDAsIDB4MDAwMDAxLDAsMCwgMCB9LAogCQkubmVlZHNfdHZhdWRpbyAgPSAxLAogCQkuaGFzX3JhZGlvICAgICAgPSAxLAogCX0sCkBAIC0yNjY5LDcgKzI2NzIsNyBAQAogCQkuYXVkaW9faW5wdXRzICAgPSAxLAogCQkudHVuZXIgICAgICAgICAgPSAwLAogCQkuc3ZocyAgICAgICAgICAgPSAyLAotCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAorCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKIAkJLnR1bmVyX3R5cGUgICAgID0gLTEsCiAJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKQEAgLTI3MDMsNyArMjcwNiw3IEBACiAJCS50dW5lcgkJPSAwLAogCQkuc3ZocwkJPSAyLAogCQkuZ3Bpb21hc2sJPSAweDAxZmUwMCwKLQkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAorCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAogCQkuYXVkaW9tdXggICAgICAgPSB7IDB4MDAxZTAwLCAwLCAweDAxODAwMCwgMHgwMTQwMDAsIDB4MDAyMDAwLCAwIH0sCiAJCS5uZWVkc190dmF1ZGlvCT0gMSwKIAkJLnBsbAkJPSBQTExfMjgsCkBAIC0yNzkxLDggKzI3OTQsOCBAQAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gMiwKIAkJLmdwaW9tYXNrCT0gMTUsCi0JCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKLQkJLmF1ZGlvbXV4CT0gezIsMCwwLDAsMX0sCisJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCisJCS5hdWRpb211eAk9IHsgMiwgMCwgMCwgMCwgMSB9LAogCQkubmVlZHNfdHZhdWRpbwk9IDEsCiAJCS5wbGwJCT0gUExMXzI4LAogCQkudHVuZXJfdHlwZQk9IDIsCkBAIC0yODA3LDggKzI4MTAsOCBAQAogCQkudHVuZXIJCT0gMCwKIAkJLnN2aHMJCT0gMiwKIAkJLmdwaW9tYXNrCT0gMHgxMDgwMDcsCi0JCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKLQkJLmF1ZGlvbXV4CT0geyAxMDAwMDAsIDEwMDAwMiwgMTAwMDAyLCAxMDAwMDB9LAorCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAorCQkuYXVkaW9tdXgJPSB7IDEwMDAwMCwgMTAwMDAyLCAxMDAwMDIsIDEwMDAwMCB9LAogCQkubm9fbXNwMzR4eAk9IDEsCiAJCS5ub190ZGE5ODc1ICAgICA9IDEsCiAJCS5ub190ZGE3NDMyICAgICA9IDEsCkBAIC0yODE3LDYgKzI4MjAsNDUgQEAKIAkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCQkuaGFzX3JhZGlvICAgICAgPSAxLAogCX0sCisJLyogLS0tLSBjYXJkIDB4OGYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCVtCVFRWX0JPQVJEX0hBVVBQQVVHRV9JTVBBQ1RWQ0JdID0geworCQkubmFtZQkJPSAiSGF1cHBhdWdlIEltcGFjdFZDQiAoYnQ4NzgpIiwKKwkJLnZpZGVvX2lucHV0cwk9IDQsCisJCS5hdWRpb19pbnB1dHMJPSAwLAorCQkudHVuZXIJCT0gLTEsCisJCS5zdmhzCQk9IC0xLAorCQkuZ3Bpb21hc2sJPSAweDBmLCAvKiBvbGQ6IDcgKi8KKwkJLm11eHNlbAkJPSB7IDAsIDEsIDMsIDIgfSwgLyogQ29tcG9zaXRlIDAtMyAqLworCQkubm9fbXNwMzR4eAk9IDEsCisJCS5ub190ZGE5ODc1ICAgICA9IDEsCisJCS5ub190ZGE3NDMyICAgICA9IDEsCisJCS50dW5lcl90eXBlCT0gLTEsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKKwl9LAorCVtCVFRWX0JPQVJEX01BQ0hUVl9NQUdJQ1RWXSA9IHsKKwkJLyogSnVsaWFuIENhbGFieSA8anVsaWFuLmNhbGFieUBnbWFpbC5jb20+CisJCSAqIFNsaWdodGx5IGRpZmZlcmVudCBmcm9tIG9yaWdpbmFsIE1hY2hUViBkZWZpbml0aW9uICgweDYwKQorCisJCSAqIEZJWE1FOiBSZWdTcHkgc2F5cyBncGlvbWFzayBzaG91bGQgYmUgIjB4MDAxYzgwMGYiLCBidXQgaXQKKwkJICogc3R1ZmZzIHVwIHJlbW90ZSBjaGlwLiBCdWcgaXMgYSBwaW4gb24gdGhlIGphZWNzIGlzIG5vdCBzZXQKKwkJICogcHJvcGVybHkgKG1ldGhpbmtzKSBjYXVzaW5nIG5vIGtleXVwIGJpdHMgYmVpbmcgc2V0ICovCisKKwkJLm5hbWUgICAgICAgICAgID0gIk1hZ2ljVFYiLCAvKiByZWJyYW5kZWQgTWFjaFRWICovCisJCS52aWRlb19pbnB1dHMgICA9IDMsCisJCS5hdWRpb19pbnB1dHMgICA9IDEsCisJCS50dW5lciAgICAgICAgICA9IDAsCisJCS5zdmhzICAgICAgICAgICA9IDIsCisJCS5ncGlvbWFzayAgICAgICA9IDcsCisJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAorCQkuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDMsIDQgfSwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfVEVNSUNfNDAwOUZSNV9QQUwsCisJCS50dW5lcl9hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKKwkJLmhhc19yYWRpbyAgICAgID0gMSwKKwkJLmhhc19yZW1vdGUgICAgID0gMSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBidHR2X251bV90dmNhcmRzID0gQVJSQVlfU0laRShidHR2X3R2Y2FyZHMpOwpAQCAtMzAzNywyNiArMzA3OSwzMyBAQAogCQlzd2l0Y2ggKGlkKSB7CiAJCWNhc2UgMToKIAkJCWluZm8gPSAiUEFMIC8gbW9ubyI7CisJCQlidHYtPnRkYTk4ODdfY29uZiA9IFREQTk4ODdfSU5URVJDQVJSSUVSOwogCQkJYnJlYWs7CiAJCWNhc2UgMjoKIAkJCWluZm8gPSAiUEFMK1NFQ0FNIC8gc3RlcmVvIjsKIAkJCWJ0di0+aGFzX3JhZGlvID0gMTsKKwkJCWJ0di0+dGRhOTg4N19jb25mID0gVERBOTg4N19RU1M7CiAJCQlicmVhazsKIAkJY2FzZSAzOgogCQkJaW5mbyA9ICJOVFNDIC8gc3RlcmVvIjsKIAkJCWJ0di0+aGFzX3JhZGlvID0gMTsKKwkJCWJ0di0+dGRhOTg4N19jb25mID0gVERBOTg4N19RU1M7CiAJCQlicmVhazsKIAkJY2FzZSA0OgogCQkJaW5mbyA9ICJQQUwrU0VDQU0gLyBtb25vIjsKKwkJCWJ0di0+dGRhOTg4N19jb25mID0gVERBOTg4N19RU1M7CiAJCQlicmVhazsKIAkJY2FzZSA1OgogCQkJaW5mbyA9ICJOVFNDIC8gbW9ubyI7CisJCQlidHYtPnRkYTk4ODdfY29uZiA9IFREQTk4ODdfSU5URVJDQVJSSUVSOwogCQkJYnJlYWs7CiAJCWNhc2UgNjoKIAkJCWluZm8gPSAiTlRTQyAvIHN0ZXJlbyI7CisJCQlidHYtPnRkYTk4ODdfY29uZiA9IFREQTk4ODdfSU5URVJDQVJSSUVSOwogCQkJYnJlYWs7CiAJCWNhc2UgNzoKIAkJCWluZm8gPSAiUEFMIC8gc3RlcmVvIjsKKwkJCWJ0di0+dGRhOTg4N19jb25mID0gVERBOTg4N19JTlRFUkNBUlJJRVI7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWluZm8gPSAib29wczogdW5rbm93biBjYXJkIjsKQEAgLTMwNjcsOCArMzExNiw3IEBACiAJCXByaW50ayhLRVJOX0lORk8KIAkJICAgICAgICJidHR2JWQ6IHBpbm5hY2xlL210OiBpZD0lZCBpbmZvPVwiJXNcIiByYWRpbz0lc1xuIiwKIAkJICAgICAgIGJ0di0+Yy5uciwgaWQsIGluZm8sIGJ0di0+aGFzX3JhZGlvID8gInllcyIgOiAibm8iKTsKLQkJYnR2LT50dW5lcl90eXBlICA9IDMzOwotCQlidHYtPnBpbm5hY2xlX2lkID0gaWQ7CisJCWJ0di0+dHVuZXJfdHlwZSA9IFRVTkVSX01UMjAzMjsKIAl9CiB9CiAKQEAgLTMzNzAsOSArMzQxOCw5IEBACiAJCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsIFRVTkVSX1NFVF9UWVBFX0FERFIsICZ0dW5fc2V0dXApOwogCX0KIAotCWlmIChidHYtPnBpbm5hY2xlX2lkICE9IFVOU0VUKSB7Ci0JCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsIEFVRENfQ09ORklHX1BJTk5BQ0xFLAotCQkJCQkJCSZidHYtPnBpbm5hY2xlX2lkKTsKKwlpZiAoYnR2LT50ZGE5ODg3X2NvbmYpIHsKKwkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0diwgVERBOTg4N19TRVRfQ09ORklHLAorCQkJCQkJCSZidHYtPnRkYTk4ODdfY29uZik7CiAJfQogCiAJYnR2LT5zdmhzID0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5zdmhzOwpAQCAtMzM4Nyw4ICszNDM1LDYgQEAKIAkJYnR2LT5oYXNfcmVtb3RlPTE7CiAJaWYgKCFidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5vX2dwaW9pcnEpCiAJCWJ0di0+Z3Bpb2lycT0xOwotCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmFueV9pcnEpCi0JCWJ0di0+YW55X2lycSA9IDE7CiAJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9faG9vaykKIAkJYnR2LT5hdWRpb19ob29rPWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9faG9vazsKIApAQCAtMzQyNCw3ICszNDcwLDcgQEAKIAogCS8qIHR1bmVyIG1vZHVsZXMgKi8KIAl0ZGE5ODg3ID0gMDsKLQlpZiAoYnR2LT5waW5uYWNsZV9pZCAhPSBVTlNFVCkKKwlpZiAoYnR2LT50ZGE5ODg3X2NvbmYpCiAJCXRkYTk4ODcgPSAxOwogCWlmICgwID09IHRkYTk4ODcgJiYgMCA9PSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmhhc19kdmIgJiYKIAkgICAgYnR0dl9JMkNSZWFkKGJ0diwgSTJDX1REQTk4ODcsICJUREE5ODg3IikgPj0wKQpAQCAtMzQ3MSw2ICszNTE3LDIxIEBACiAJdHZlZXByb21faGF1cHBhdWdlX2FuYWxvZygmYnR2LT5pMmNfY2xpZW50LCAmdHYsIGVlcHJvbV9kYXRhKTsKIAlidHYtPnR1bmVyX3R5cGUgPSB0di50dW5lcl90eXBlOwogCWJ0di0+aGFzX3JhZGlvICA9IHR2Lmhhc19yYWRpbzsKKworCXByaW50aygiYnR0diVkOiBIYXVwcGF1Z2UgZWVwcm9tIGluZGljYXRlcyBtb2RlbCMlZFxuIiwKKwkJYnR2LT5jLm5yLCB0di5tb2RlbCk7CisKKwkvKgorCSAqIFNvbWUgb2YgdGhlIDg3OCBib2FyZHMgaGF2ZSBkdXBsaWNhdGUgUENJIElEcy4gU3dpdGNoIHRoZSBib2FyZAorCSAqIHR5cGUgYmFzZWQgb24gbW9kZWwgIy4KKwkgKi8KKwlpZih0di5tb2RlbCA9PSA2NDkwMCkgeworCQlwcmludGsoImJ0dHYlZDogU3dpdGNoaW5nIGJvYXJkIHR5cGUgZnJvbSAlcyB0byAlc1xuIiwKKwkJCWJ0di0+Yy5uciwKKwkJCWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubmFtZSwKKwkJCWJ0dHZfdHZjYXJkc1tCVFRWX0JPQVJEX0hBVVBQQVVHRV9JTVBBQ1RWQ0JdLm5hbWUpOworCQlidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfSEFVUFBBVUdFX0lNUEFDVFZDQjsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgdGVycmF0ZWNfYWN0aXZlX3JhZGlvX3VwZ3JhZGUoc3RydWN0IGJ0dHYgKmJ0dikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1kcml2ZXIuYwppbmRleCAxZGRmOWJhLi5hYTRjNGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWRyaXZlci5jCkBAIC0zNCw2MCArMzQsNjAgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgImJ0dHZwLmgiCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKwogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKLSNpbmNsdWRlICJidHR2cC5oIgotCiAjaW5jbHVkZSAicmRzLmgiCiAKIAogdW5zaWduZWQgaW50IGJ0dHZfbnVtOwkJCS8qIG51bWJlciBvZiBCdDg0OHMgaW4gdXNlICovCiBzdHJ1Y3QgYnR0diBidHR2c1tCVFRWX01BWF07CiAKLXVuc2lnbmVkIGludCBidHR2X2RlYnVnID0gMDsKK3Vuc2lnbmVkIGludCBidHR2X2RlYnVnOwogdW5zaWduZWQgaW50IGJ0dHZfdmVyYm9zZSA9IDE7Ci11bnNpZ25lZCBpbnQgYnR0dl9ncGlvID0gMDsKK3Vuc2lnbmVkIGludCBidHR2X2dwaW87CiAKIC8qIGNvbmZpZyB2YXJpYWJsZXMgKi8KICNpZmRlZiBfX0JJR19FTkRJQU4KIHN0YXRpYyB1bnNpZ25lZCBpbnQgYmlnZW5kaWFuPTE7CiAjZWxzZQotc3RhdGljIHVuc2lnbmVkIGludCBiaWdlbmRpYW49MDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYmlnZW5kaWFuOwogI2VuZGlmCiBzdGF0aWMgdW5zaWduZWQgaW50IHJhZGlvW0JUVFZfTUFYXTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXJxX2RlYnVnID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXJxX2RlYnVnOwogc3RhdGljIHVuc2lnbmVkIGludCBnYnVmZmVycyA9IDg7CiBzdGF0aWMgdW5zaWduZWQgaW50IGdidWZzaXplID0gMHgyMDgwMDA7CiAKIHN0YXRpYyBpbnQgdmlkZW9fbnIgPSAtMTsKIHN0YXRpYyBpbnQgcmFkaW9fbnIgPSAtMTsKIHN0YXRpYyBpbnQgdmJpX25yID0gLTE7Ci1zdGF0aWMgaW50IGRlYnVnX2xhdGVuY3kgPSAwOworc3RhdGljIGludCBkZWJ1Z19sYXRlbmN5OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGZkc3IgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBmZHNyOwogCiAvKiBvcHRpb25zICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGNvbWJmaWx0ZXIgID0gMDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbHVtYWZpbHRlciAgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBjb21iZmlsdGVyOworc3RhdGljIHVuc2lnbmVkIGludCBsdW1hZmlsdGVyOwogc3RhdGljIHVuc2lnbmVkIGludCBhdXRvbXV0ZSAgICA9IDE7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNocm9tYV9hZ2MgID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2hyb21hX2FnYzsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYWRjX2NydXNoICAgPSAxOwogc3RhdGljIHVuc2lnbmVkIGludCB3aGl0ZWNydXNoX3VwcGVyID0gMHhDRjsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgd2hpdGVjcnVzaF9sb3dlciA9IDB4N0Y7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHZjcl9oYWNrICAgID0gMDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXJxX2lzd2l0Y2ggPSAwOworc3RhdGljIHVuc2lnbmVkIGludCB2Y3JfaGFjazsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXJxX2lzd2l0Y2g7CiBzdGF0aWMgdW5zaWduZWQgaW50IHV2X3JhdGlvICAgID0gNTA7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGZ1bGxfbHVtYV9yYW5nZSA9IDA7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvcmluZyAgICAgID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZnVsbF9sdW1hX3JhbmdlOworc3RhdGljIHVuc2lnbmVkIGludCBjb3Jpbmc7CiBleHRlcm4gaW50IG5vX292ZXJsYXk7CiAKIC8qIEFQSSBmZWF0dXJlcyAodHVybiBvbi9vZmYgc3R1ZmYgZm9yIHRlc3RpbmcpICovCiBzdGF0aWMgdW5zaWduZWQgaW50IHY0bDIgICAgICAgID0gMTsKIAotCiAvKiBpbnNtb2QgYXJncyAqLwogbW9kdWxlX3BhcmFtKGJ0dHZfdmVyYm9zZSwgICAgICBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKGJ0dHZfZ3BpbywgICAgICAgICBpbnQsIDA2NDQpOwpAQCAtMjEwLDYgKzIxMCw5IEBACiAJCS52ZGVsYXkgICAgICAgICA9IDB4MjAsCiAJCS52YmlwYWNrICAgICAgICA9IDI1NSwKIAkJLnNyYW0gICAgICAgICAgID0gMCwKKwkJLyogSVRVLVIgZnJhbWUgbGluZSBudW1iZXIgb2YgdGhlIGZpcnN0IFZCSSBsaW5lCisJCSAgIHdlIGNhbiBjYXB0dXJlLCBvZiB0aGUgZmlyc3QgYW5kIHNlY29uZCBmaWVsZC4gKi8KKwkJLnZiaXN0YXJ0CT0geyA3LDMyMCB9LAogCX0sewogCQkudjRsMl9pZCAgICAgICAgPSBWNEwyX1NURF9OVFNDX00sCiAJCS5uYW1lICAgICAgICAgICA9ICJOVFNDIiwKQEAgLTIyNiw2ICsyMjksNyBAQAogCQkudmRlbGF5ICAgICAgICAgPSAweDFhLAogCQkudmJpcGFjayAgICAgICAgPSAxNDQsCiAJCS5zcmFtICAgICAgICAgICA9IDEsCisJCS52YmlzdGFydAk9IHsgMTAsIDI3MyB9LAogCX0sewogCQkudjRsMl9pZCAgICAgICAgPSBWNEwyX1NURF9TRUNBTSwKIAkJLm5hbWUgICAgICAgICAgID0gIlNFQ0FNIiwKQEAgLTI0Miw2ICsyNDYsNyBAQAogCQkudmRlbGF5ICAgICAgICAgPSAweDIwLAogCQkudmJpcGFjayAgICAgICAgPSAyNTUsCiAJCS5zcmFtICAgICAgICAgICA9IDAsIC8qIGxpa2UgUEFMLCBjb3JyZWN0PyAqLworCQkudmJpc3RhcnQJPSB7IDcsIDMyMCB9LAogCX0sewogCQkudjRsMl9pZCAgICAgICAgPSBWNEwyX1NURF9QQUxfTmMsCiAJCS5uYW1lICAgICAgICAgICA9ICJQQUwtTmMiLApAQCAtMjU4LDYgKzI2Myw3IEBACiAJCS52ZGVsYXkgICAgICAgICA9IDB4MWEsCiAJCS52YmlwYWNrICAgICAgICA9IDE0NCwKIAkJLnNyYW0gICAgICAgICAgID0gLTEsCisJCS52YmlzdGFydAk9IHsgNywgMzIwIH0sCiAJfSx7CiAJCS52NGwyX2lkICAgICAgICA9IFY0TDJfU1REX1BBTF9NLAogCQkubmFtZSAgICAgICAgICAgPSAiUEFMLU0iLApAQCAtMjc0LDYgKzI4MCw3IEBACiAJCS52ZGVsYXkgICAgICAgICA9IDB4MWEsCiAJCS52YmlwYWNrICAgICAgICA9IDE0NCwKIAkJLnNyYW0gICAgICAgICAgID0gLTEsCisJCS52YmlzdGFydAk9IHsgMTAsIDI3MyB9LAogCX0sewogCQkudjRsMl9pZCAgICAgICAgPSBWNEwyX1NURF9QQUxfTiwKIAkJLm5hbWUgICAgICAgICAgID0gIlBBTC1OIiwKQEAgLTI5MCw2ICsyOTcsNyBAQAogCQkudmRlbGF5ICAgICAgICAgPSAweDIwLAogCQkudmJpcGFjayAgICAgICAgPSAxNDQsCiAJCS5zcmFtICAgICAgICAgICA9IC0xLAorCQkudmJpc3RhcnQJPSB7IDcsIDMyMH0sCiAJfSx7CiAJCS52NGwyX2lkICAgICAgICA9IFY0TDJfU1REX05UU0NfTV9KUCwKIAkJLm5hbWUgICAgICAgICAgID0gIk5UU0MtSlAiLApAQCAtMzA2LDYgKzMxNCw3IEBACiAJCS52ZGVsYXkgICAgICAgICA9IDB4MTYsCiAJCS52YmlwYWNrICAgICAgICA9IDE0NCwKIAkJLnNyYW0gICAgICAgICAgID0gLTEsCisJCS52YmlzdGFydAk9IHsxMCwgMjczfSwKIAl9LHsKIAkJLyogdGhhdCBvbmUgaG9wZWZ1bGx5IHdvcmtzIHdpdGggdGhlIHN0cmFuZ2UgdGltaW5nCiAJCSAqIHdoaWNoIHZpZGVvIHJlY29yZGVycyBwcm9kdWNlIHdoZW4gcGxheWluZyBhIE5UU0MKQEAgLTMyNiw2ICszMzUsNyBAQAogCQkudmJpcGFjayAgICAgICAgPSAyNTUsCiAJCS52dG90YWwgICAgICAgICA9IDUyNCwKIAkJLnNyYW0gICAgICAgICAgID0gLTEsCisJCS52YmlzdGFydAk9IHsgMTAsIDI3MyB9LAogCX0KIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEJUVFZfVFZOT1JNUyA9IEFSUkFZX1NJWkUoYnR0dl90dm5vcm1zKTsKQEAgLTY3NCwxNiArNjg0LDE2IEBACiAJCXJldHVybiAxOwogCiAJLyogaXMgaXQgZnJlZT8gKi8KLQlkb3duKCZidHYtPnJlc2xvY2spOworCW11dGV4X2xvY2soJmJ0di0+cmVzbG9jayk7CiAJaWYgKGJ0di0+cmVzb3VyY2VzICYgYml0KSB7CiAJCS8qIG5vLCBzb21lb25lIGVsc2UgdXNlcyBpdCAqLwotCQl1cCgmYnR2LT5yZXNsb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZidHYtPnJlc2xvY2spOwogCQlyZXR1cm4gMDsKIAl9CiAJLyogaXQncyBmcmVlLCBncmFiIGl0ICovCiAJZmgtPnJlc291cmNlcyAgfD0gYml0OwogCWJ0di0+cmVzb3VyY2VzIHw9IGJpdDsKLQl1cCgmYnR2LT5yZXNsb2NrKTsKKwltdXRleF91bmxvY2soJmJ0di0+cmVzbG9jayk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTcwNiwxMCArNzE2LDEwIEBACiAJCS8qIHRyeWluZyB0byBmcmVlIHJlc3NvdXJjZXMgbm90IGFsbG9jYXRlZCBieSB1cyAuLi4gKi8KIAkJcHJpbnRrKCJidHR2OiBCVUchIChidHJlcylcbiIpOwogCX0KLQlkb3duKCZidHYtPnJlc2xvY2spOworCW11dGV4X2xvY2soJmJ0di0+cmVzbG9jayk7CiAJZmgtPnJlc291cmNlcyAgJj0gfmJpdHM7CiAJYnR2LT5yZXNvdXJjZXMgJj0gfmJpdHM7Ci0JdXAoJmJ0di0+cmVzbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZidHYtPnJlc2xvY2spOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTUxMCwxNCArMTUyMCw2IEBACiAJLmJ1Zl9yZWxlYXNlICA9IGJ1ZmZlcl9yZWxlYXNlLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKnY0bDFfaW9jdGxzW10gPSB7Ci0JIj8iLCAiQ0dBUCIsICJHQ0hBTiIsICJTQ0hBTiIsICJHVFVORVIiLCAiU1RVTkVSIiwgIkdQSUNUIiwgIlNQSUNUIiwKLQkiQ0NBUFRVUkUiLCAiR1dJTiIsICJTV0lOIiwgIkdGQlVGIiwgIlNGQlVGIiwgIktFWSIsICJHRlJFUSIsCi0JIlNGUkVRIiwgIkdBVURJTyIsICJTQVVESU8iLCAiU1lOQyIsICJNQ0FQVFVSRSIsICJHTUJVRiIsICJHVU5JVCIsCi0JIkdDQVBUVVJFIiwgIlNDQVBUVVJFIiwgIlNQTEFZTU9ERSIsICJTV1JJVEVNT0RFIiwgIkdQTEFZSU5GTyIsCi0JIlNNSUNST0NPREUiLCAiR1ZCSUZNVCIsICJTVkJJRk1UIiB9OwotI2RlZmluZSBWNEwxX0lPQ1RMUyBBUlJBWV9TSVpFKHY0bDFfaW9jdGxzKQotCiBzdGF0aWMgaW50IGJ0dHZfY29tbW9uX2lvY3RscyhzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7CiAJc3dpdGNoIChjbWQpIHsKQEAgLTE1MzQsMTIgKzE1MzYsMTIgQEAKIAljYXNlIFZJRElPQ1NGUkVROgogCXsKIAkJdW5zaWduZWQgbG9uZyAqZnJlcSA9IGFyZzsKLQkJZG93bigmYnR2LT5sb2NrKTsKKwkJbXV0ZXhfbG9jaygmYnR2LT5sb2NrKTsKIAkJYnR2LT5mcmVxPSpmcmVxOwogCQlidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LFZJRElPQ1NGUkVRLGZyZXEpOwogCQlpZiAoYnR2LT5oYXNfbWF0Y2hib3ggJiYgYnR2LT5yYWRpb191c2VyKQogCQkJdGVhNTc1N19zZXRfZnJlcShidHYsKmZyZXEpOwotCQl1cCgmYnR2LT5sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZidHYtPmxvY2spOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE1NjksMTAgKzE1NzEsMTAgQEAKIAkJaWYgKHYtPm1vZGUgPj0gQlRUVl9UVk5PUk1TKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJZG93bigmYnR2LT5sb2NrKTsKKwkJbXV0ZXhfbG9jaygmYnR2LT5sb2NrKTsKIAkJc2V0X3R2bm9ybShidHYsdi0+bW9kZSk7CiAJCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsY21kLHYpOwotCQl1cCgmYnR2LT5sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZidHYtPmxvY2spOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE2MDksMTcgKzE2MTEsMTcgQEAKIAkJaWYgKHYtPm5vcm0gPj0gQlRUVl9UVk5PUk1TKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJZG93bigmYnR2LT5sb2NrKTsKKwkJbXV0ZXhfbG9jaygmYnR2LT5sb2NrKTsKIAkJaWYgKGNoYW5uZWwgPT0gYnR2LT5pbnB1dCAmJgogCQkgICAgdi0+bm9ybSA9PSBidHYtPnR2bm9ybSkgewogCQkJLyogbm90aGluZyB0byBkbyAqLwotCQkJdXAoJmJ0di0+bG9jayk7CisJCQltdXRleF91bmxvY2soJmJ0di0+bG9jayk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCiAJCWJ0di0+dHZub3JtID0gdi0+bm9ybTsKIAkJc2V0X2lucHV0KGJ0dix2LT5jaGFubmVsKTsKLQkJdXAoJmJ0di0+bG9jayk7CisJCW11dGV4X3VubG9jaygmYnR2LT5sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xNjMyLDE0ICsxNjM0LDE0IEBACiAJCXYtPmZsYWdzIHw9IFZJREVPX0FVRElPX01VVEFCTEU7CiAJCXYtPm1vZGUgID0gVklERU9fU09VTkRfTU9OTzsKIAotCQlkb3duKCZidHYtPmxvY2spOworCQltdXRleF9sb2NrKCZidHYtPmxvY2spOwogCQlidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LGNtZCx2KTsKIAogCQkvKiBjYXJkIHNwZWNpZmljIGhvb2tzICovCiAJCWlmIChidHYtPmF1ZGlvX2hvb2spCiAJCQlidHYtPmF1ZGlvX2hvb2soYnR2LHYsMCk7CiAKLQkJdXAoJmJ0di0+bG9jayk7CisJCW11dGV4X3VubG9jaygmYnR2LT5sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfQogCWNhc2UgVklESU9DU0FVRElPOgpAQCAtMTY1MCw3ICsxNjUyLDcgQEAKIAkJaWYgKGF1ZGlvID49IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9faW5wdXRzKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJZG93bigmYnR2LT5sb2NrKTsKKwkJbXV0ZXhfbG9jaygmYnR2LT5sb2NrKTsKIAkJYXVkaW9fbXV4KGJ0diwgKHYtPmZsYWdzJlZJREVPX0FVRElPX01VVEUpID8gQVVESU9fTVVURSA6IEFVRElPX1VOTVVURSk7CiAJCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsY21kLHYpOwogCkBAIC0xNjU4LDcgKzE2NjAsNyBAQAogCQlpZiAoYnR2LT5hdWRpb19ob29rKQogCQkJYnR2LT5hdWRpb19ob29rKGJ0dix2LDEpOwogCi0JCXVwKCZidHYtPmxvY2spOworCQltdXRleF91bmxvY2soJmJ0di0+bG9jayk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTY5MiwxMCArMTY5NCwxMCBAQAogCQlpZiAoaSA9PSBCVFRWX1RWTk9STVMpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlkb3duKCZidHYtPmxvY2spOworCQltdXRleF9sb2NrKCZidHYtPmxvY2spOwogCQlzZXRfdHZub3JtKGJ0dixpKTsKIAkJaTJjX3ZpZGlvY3NjaGFuKGJ0dik7Ci0JCXVwKCZidHYtPmxvY2spOworCQltdXRleF91bmxvY2soJmJ0di0+bG9jayk7CiAJCXJldHVybiAwOwogCX0KIAljYXNlIFZJRElPQ19RVUVSWVNURDoKQEAgLTE3NTMsOSArMTc1NSw5IEBACiAKIAkJaWYgKCppID4gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS52aWRlb19pbnB1dHMpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJZG93bigmYnR2LT5sb2NrKTsKKwkJbXV0ZXhfbG9jaygmYnR2LT5sb2NrKTsKIAkJc2V0X2lucHV0KGJ0diwqaSk7Ci0JCXVwKCZidHYtPmxvY2spOworCQltdXRleF91bmxvY2soJmJ0di0+bG9jayk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTc2Nyw3ICsxNzY5LDcgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQlpZiAoMCAhPSB0LT5pbmRleCkKIAkJCXJldHVybiAtRUlOVkFMOwotCQlkb3duKCZidHYtPmxvY2spOworCQltdXRleF9sb2NrKCZidHYtPmxvY2spOwogCQltZW1zZXQodCwwLHNpemVvZigqdCkpOwogCQlzdHJjcHkodC0+bmFtZSwgIlRlbGV2aXNpb24iKTsKIAkJdC0+dHlwZSAgICAgICA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOwpAQCAtMTgwMiw3ICsxODA0LDcgQEAKIAkJCX0KIAkJfQogCQkvKiBGSVhNRTogZmlsbCBjYXBhYmlsaXR5K2F1ZG1vZGUgKi8KLQkJdXAoJmJ0di0+bG9jayk7CisJCW11dGV4X3VubG9jaygmYnR2LT5sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfQogCWNhc2UgVklESU9DX1NfVFVORVI6CkBAIC0xODEzLDcgKzE4MTUsNyBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmICgwICE9IHQtPmluZGV4KQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWRvd24oJmJ0di0+bG9jayk7CisJCW11dGV4X2xvY2soJmJ0di0+bG9jayk7CiAJCXsKIAkJCXN0cnVjdCB2aWRlb19hdWRpbyB2YTsKIAkJCW1lbXNldCgmdmEsIDAsIHNpemVvZihzdHJ1Y3QgdmlkZW9fYXVkaW8pKTsKQEAgLTE4MzAsNyArMTgzMiw3IEBACiAJCQlpZiAoYnR2LT5hdWRpb19ob29rKQogCQkJCWJ0di0+YXVkaW9faG9vayhidHYsJnZhLDEpOwogCQl9Ci0JCXVwKCZidHYtPmxvY2spOworCQltdXRleF91bmxvY2soJmJ0di0+bG9jayk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTg1MSwxMiArMTg1MywxMiBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmICh1bmxpa2VseSAoZi0+dHlwZSAhPSBWNEwyX1RVTkVSX0FOQUxPR19UVikpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJZG93bigmYnR2LT5sb2NrKTsKKwkJbXV0ZXhfbG9jaygmYnR2LT5sb2NrKTsKIAkJYnR2LT5mcmVxID0gZi0+ZnJlcXVlbmN5OwogCQlidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LFZJRElPQ1NGUkVRLCZidHYtPmZyZXEpOwogCQlpZiAoYnR2LT5oYXNfbWF0Y2hib3ggJiYgYnR2LT5yYWRpb191c2VyKQogCQkJdGVhNTc1N19zZXRfZnJlcShidHYsYnR2LT5mcmVxKTsKLQkJdXAoJmJ0di0+bG9jayk7CisJCW11dGV4X3VubG9jaygmYnR2LT5sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfQogCWNhc2UgVklESU9DX0xPR19TVEFUVVM6CkBAIC0yMjA2LDIyICsyMjA4LDkgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXR2YWwgPSAwOwogCi0JaWYgKGJ0dHZfZGVidWcgPiAxKSB7Ci0JCXN3aXRjaCAoX0lPQ19UWVBFKGNtZCkpIHsKLQkJY2FzZSAndic6Ci0JCQlwcmludGsoImJ0dHYlZDogaW9jdGwgMHgleCAodjRsMSwgVklESU9DJXMpXG4iLAotCQkJICAgICAgIGJ0di0+Yy5uciwgY21kLCAoX0lPQ19OUihjbWQpIDwgVjRMMV9JT0NUTFMpID8KLQkJCSAgICAgICB2NGwxX2lvY3Rsc1tfSU9DX05SKGNtZCldIDogIj8/PyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1YnOgotCQkJcHJpbnRrKCJidHR2JWQ6IGlvY3RsIDB4JXggKHY0bDIsICVzKVxuIiwKLQkJCSAgICAgICBidHYtPmMubnIsIGNtZCwgIHY0bDJfaW9jdGxfbmFtZXNbX0lPQ19OUihjbWQpXSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByaW50aygiYnR0diVkOiBpb2N0bCAweCV4ICg/Pz8pXG4iLAotCQkJICAgICAgIGJ0di0+Yy5uciwgY21kKTsKLQkJfQotCX0KKwlpZiAoYnR0dl9kZWJ1ZyA+IDEpCisJCXY0bF9wcmludF9pb2N0bChidHYtPmMubmFtZSwgY21kKTsKKwogCWlmIChidHYtPmVycm9ycykKIAkJYnR0dl9yZWluaXRfYnQ4NDgoYnR2KTsKIApAQCAtMjU3MCwxMCArMjU1OSwxMCBAQAogCQlmbXQtPmNvdW50WzBdICAgICAgICAgPSBmbXQyLmZtdC52YmkuY291bnRbMF07CiAJCWZtdC0+c3RhcnRbMV0gICAgICAgICA9IGZtdDIuZm10LnZiaS5zdGFydFsxXTsKIAkJZm10LT5jb3VudFsxXSAgICAgICAgID0gZm10Mi5mbXQudmJpLmNvdW50WzFdOwotCQlpZiAoZm10Mi5mbXQudmJpLmZsYWdzICYgVkJJX1VOU1lOQykKLQkJCWZtdC0+ZmxhZ3MgICB8PSBWNEwyX1ZCSV9VTlNZTkM7Ci0JCWlmIChmbXQyLmZtdC52YmkuZmxhZ3MgJiBWQklfSU5URVJMQUNFRCkKLQkJCWZtdC0+ZmxhZ3MgICB8PSBWNEwyX1ZCSV9JTlRFUkxBQ0VEOworCQlpZiAoZm10Mi5mbXQudmJpLmZsYWdzICYgVjRMMl9WQklfVU5TWU5DKQorCQkJZm10LT5mbGFncyAgIHw9IFZCSV9VTlNZTkM7CisJCWlmIChmbXQyLmZtdC52YmkuZmxhZ3MgJiBWNEwyX1ZCSV9JTlRFUkxBQ0VEKQorCQkJZm10LT5mbGFncyAgIHw9IFZCSV9JTlRFUkxBQ0VEOwogCQlyZXR1cm4gMDsKIAl9CiAJY2FzZSBWSURJT0NTVkJJRk1UOgpAQCAtMzEyMCw2ICszMTA5LDcgQEAKIAkub3BlbgkgID0gYnR0dl9vcGVuLAogCS5yZWxlYXNlICA9IGJ0dHZfcmVsZWFzZSwKIAkuaW9jdGwJICA9IGJ0dHZfaW9jdGwsCisJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKIAkubGxzZWVrCSAgPSBub19sbHNlZWssCiAJLnJlYWQJICA9IGJ0dHZfcmVhZCwKIAkubW1hcAkgID0gYnR0dl9tbWFwLApAQCAtMzE2Niw3ICszMTU2LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlkcHJpbnRrKCJidHR2JWQ6IG9wZW4gY2FsbGVkIChyYWRpbylcbiIsYnR2LT5jLm5yKTsKLQlkb3duKCZidHYtPmxvY2spOworCW11dGV4X2xvY2soJmJ0di0+bG9jayk7CiAKIAlidHYtPnJhZGlvX3VzZXIrKzsKIApAQCAtMzE3NSw3ICszMTY1LDcgQEAKIAlidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LEFVRENfU0VUX1JBRElPLCZidHYtPnR1bmVyX3R5cGUpOwogCWF1ZGlvX211eChidHYsQVVESU9fUkFESU8pOwogCi0JdXAoJmJ0di0+bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZidHYtPmxvY2spOwogCXJldHVybiAwOwogfQogCkBAIC0zMjI5LDYgKzMyMTksNyBAQAogCWNhc2UgVklESU9DU0ZSRVE6CiAJY2FzZSBWSURJT0NHQVVESU86CiAJY2FzZSBWSURJT0NTQVVESU86CisJY2FzZSBWSURJT0NfTE9HX1NUQVRVUzoKIAkJcmV0dXJuIGJ0dHZfY29tbW9uX2lvY3RscyhidHYsY21kLGFyZyk7CiAKIAlkZWZhdWx0OgpAQCAtMzcwMSw4ICszNjkyLDggQEAKIAogCWJ0dj0oc3RydWN0IGJ0dHYgKilkZXZfaWQ7CiAKLQlpZiAoYnR2LT5hbnlfaXJxKQotCQloYW5kbGVkID0gYnR0dl9hbnlfaXJxKCZidHYtPmMpOworCWlmIChidHYtPmN1c3RvbV9pcnEpCisJCWhhbmRsZWQgPSBidHYtPmN1c3RvbV9pcnEoYnR2KTsKIAogCWNvdW50PTA7CiAJd2hpbGUgKDEpIHsKQEAgLTM3MzgsOSArMzcyOSw5IEBACiAJCWlmIChhc3RhdCZCVDg0OF9JTlRfVlNZTkMpCiAJCQlidHYtPmZpZWxkX2NvdW50Kys7CiAKLQkJaWYgKGFzdGF0ICYgQlQ4NDhfSU5UX0dQSU5UKSB7CisJCWlmICgoYXN0YXQgJiBCVDg0OF9JTlRfR1BJTlQpICYmIGJ0di0+cmVtb3RlKSB7CiAJCQl3YWtlX3VwKCZidHYtPmdwaW9xKTsKLQkJCWJ0dHZfZ3Bpb19pcnEoJmJ0di0+Yyk7CisJCQlidHR2X2lucHV0X2lycShidHYpOwogCQl9CiAKIAkJaWYgKGFzdGF0ICYgQlQ4NDhfSU5UX0kyQ0RPTkUpIHsKQEAgLTM5MjksOCArMzkyMCw4IEBACiAJc3ByaW50ZihidHYtPmMubmFtZSwiYnR0diVkIixidHYtPmMubnIpOwogCiAJLyogaW5pdGlhbGl6ZSBzdHJ1Y3RzIC8gZmlsbCBpbiBkZWZhdWx0cyAqLwotCWluaXRfTVVURVgoJmJ0di0+bG9jayk7Ci0JaW5pdF9NVVRFWCgmYnR2LT5yZXNsb2NrKTsKKwltdXRleF9pbml0KCZidHYtPmxvY2spOworCW11dGV4X2luaXQoJmJ0di0+cmVzbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmJ0di0+c19sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmYnR2LT5ncGlvX2xvY2spOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJ0di0+Z3Bpb3EpOwpAQCAtMzk0Niw3ICszOTM3LDYgQEAKIAogCWJ0di0+aTJjX3JjID0gLTE7CiAJYnR2LT50dW5lcl90eXBlICA9IFVOU0VUOwotCWJ0di0+cGlubmFjbGVfaWQgPSBVTlNFVDsKIAlidHYtPm5ld19pbnB1dCAgID0gVU5TRVQ7CiAJYnR2LT5oYXNfcmFkaW89cmFkaW9bYnR2LT5jLm5yXTsKIApAQCAtNDA2NSwxMSArNDA1NSwxMSBAQAogCX0KIAogCS8qIGFkZCBzdWJkZXZpY2VzICovCi0JaWYgKGJ0di0+aGFzX3JlbW90ZSkKLQkJYnR0dl9zdWJfYWRkX2RldmljZSgmYnR2LT5jLCAicmVtb3RlIik7CiAJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX2R2YikKIAkJYnR0dl9zdWJfYWRkX2RldmljZSgmYnR2LT5jLCAiZHZiIik7CiAKKwlidHR2X2lucHV0X2luaXQoYnR2KTsKKwogCS8qIGV2ZXJ5dGhpbmcgaXMgZmluZSAqLwogCWJ0dHZfbnVtKys7CiAJcmV0dXJuIDA7CkBAIC00MTA0LDYgKzQwOTQsNyBAQAogCS8qIHRlbGwgZ3BpbyBtb2R1bGVzIHdlIGFyZSBsZWF2aW5nIC4uLiAqLwogCWJ0di0+c2h1dGRvd249MTsKIAl3YWtlX3VwKCZidHYtPmdwaW9xKTsKKwlidHR2X2lucHV0X2ZpbmkoYnR2KTsKIAlidHR2X3N1Yl9kZWxfZGV2aWNlcygmYnR2LT5jKTsKIAogCS8qIHVucmVnaXN0ZXIgaTJjX2J1cyArIGlucHV0ICovCkBAIC00MjUzLDcgKzQyNDQsNyBAQAogCWJ0dHZfY2hlY2tfY2hpcHNldCgpOwogCiAJYnVzX3JlZ2lzdGVyKCZidHR2X3N1Yl9idXNfdHlwZSk7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmYnR0dl9wY2lfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYnR0dl9wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgYnR0dl9jbGVhbnVwX21vZHVsZSh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWdwaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1ncGlvLmMKaW5kZXggNjE2YTViNy4uYzRkNWUyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWdwaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtZ3Bpby5jCkBAIC00Nyw5ICs0NywyOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGJ0dHZfc3ViX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYnR0dl9zdWJfZGV2aWNlICpzZGV2ID0gdG9fYnR0dl9zdWJfZGV2KGRldik7CisJc3RydWN0IGJ0dHZfc3ViX2RyaXZlciAqc3ViID0gdG9fYnR0dl9zdWJfZHJ2KGRldi0+ZHJpdmVyKTsKKworCXJldHVybiBzdWItPnByb2JlID8gc3ViLT5wcm9iZShzZGV2KSA6IC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgYnR0dl9zdWJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYnR0dl9zdWJfZGV2aWNlICpzZGV2ID0gdG9fYnR0dl9zdWJfZGV2KGRldik7CisJc3RydWN0IGJ0dHZfc3ViX2RyaXZlciAqc3ViID0gdG9fYnR0dl9zdWJfZHJ2KGRldi0+ZHJpdmVyKTsKKworCWlmIChzdWItPnJlbW92ZSkKKwkJc3ViLT5yZW1vdmUoc2Rldik7CisJcmV0dXJuIDA7Cit9CisKIHN0cnVjdCBidXNfdHlwZSBidHR2X3N1Yl9idXNfdHlwZSA9IHsKLQkubmFtZSAgPSAiYnR0di1zdWIiLAotCS5tYXRjaCA9ICZidHR2X3N1Yl9idXNfbWF0Y2gsCisJLm5hbWUgICA9ICJidHR2LXN1YiIsCisJLm1hdGNoICA9ICZidHR2X3N1Yl9idXNfbWF0Y2gsCisJLnByb2JlICA9IGJ0dHZfc3ViX3Byb2JlLAorCS5yZW1vdmUgPSBidHR2X3N1Yl9yZW1vdmUsCiB9OwogRVhQT1JUX1NZTUJPTChidHR2X3N1Yl9idXNfdHlwZSk7CiAKQEAgLTY0LDEwICs4NCw5IEBACiAJc3RydWN0IGJ0dHZfc3ViX2RldmljZSAqc3ViOwogCWludCBlcnI7CiAKLQlzdWIgPSBrbWFsbG9jKHNpemVvZigqc3ViKSxHRlBfS0VSTkVMKTsKKwlzdWIgPSBremFsbG9jKHNpemVvZigqc3ViKSxHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCA9PSBzdWIpCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbXNldChzdWIsMCxzaXplb2YoKnN1YikpOwogCiAJc3ViLT5jb3JlICAgICAgICA9IGNvcmU7CiAJc3ViLT5kZXYucGFyZW50ICA9ICZjb3JlLT5wY2ktPmRldjsKQEAgLTExMywyNCArMTMyLDYgQEAKIAl9CiB9CiAKLWludCBidHR2X2FueV9pcnEoc3RydWN0IGJ0dHZfY29yZSAqY29yZSkKLXsKLQlzdHJ1Y3QgYnR0dl9zdWJfZHJpdmVyICpkcnY7Ci0Jc3RydWN0IGJ0dHZfc3ViX2RldmljZSAqZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07Ci0JaW50IGhhbmRsZWQgPSAwOwotCi0JbGlzdF9mb3JfZWFjaChpdGVtLCZjb3JlLT5zdWJzKSB7Ci0JCWRldiA9IGxpc3RfZW50cnkoaXRlbSxzdHJ1Y3QgYnR0dl9zdWJfZGV2aWNlLGxpc3QpOwotCQlkcnYgPSB0b19idHR2X3N1Yl9kcnYoZGV2LT5kZXYuZHJpdmVyKTsKLQkJaWYgKGRydiAmJiBkcnYtPmFueV9pcnEpIHsKLQkJCWlmIChkcnYtPmFueV9pcnEoZGV2KSkKLQkJCQloYW5kbGVkID0gMTsKLQkJfQotCX0KLQlyZXR1cm4gaGFuZGxlZDsKLX0KLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGV4dGVybmFsOiBzdWItZHJpdmVyIHJlZ2lzdGVyL3VucmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1pMmMuYwppbmRleCBkNjQxOGMwLi42MTRjMTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWkyYy5jCkBAIC0yOCwxMCArMjgsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgImJ0dHZwLmgiCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgYnR0dl9pMmNfYWxnb19iaXRfdGVtcGxhdGU7CiBzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIGJ0dHZfaTJjX2FkYXBfc3dfdGVtcGxhdGU7CkBAIC00MCw5ICs0MSw5IEBACiAKIHN0YXRpYyBpbnQgYXR0YWNoX2luZm9ybShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKIAotc3RhdGljIGludCBpMmNfZGVidWcgPSAwOwotc3RhdGljIGludCBpMmNfaHcgPSAwOwotc3RhdGljIGludCBpMmNfc2NhbiA9IDA7CitzdGF0aWMgaW50IGkyY19kZWJ1ZzsKK3N0YXRpYyBpbnQgaTJjX2h3Oworc3RhdGljIGludCBpMmNfc2NhbjsKIG1vZHVsZV9wYXJhbShpMmNfZGVidWcsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0oaTJjX2h3LCAgICBpbnQsIDA0NDQpOwogbW9kdWxlX3BhcmFtKGkyY19zY2FuLCAgaW50LCAwNDQ0KTsKQEAgLTEwNSwxMCArMTA2LDggQEAKIAogc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBidHR2X2kyY19hZGFwX3N3X3RlbXBsYXRlID0gewogCS5vd25lciAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLAotI2lmZGVmIEkyQ19DTEFTU19UVl9BTkFMT0cKIAkuY2xhc3MgICAgICAgICAgICAgPSBJMkNfQ0xBU1NfVFZfQU5BTE9HLAotI2VuZGlmCi0JLm5hbWUgICAgICAgICAgICAgID0gImJ0ODQ4IiwKKwkubmFtZSAgICAgICAgICAgICAgPSAiYnR0diIsCiAJLmlkICAgICAgICAgICAgICAgID0gSTJDX0hXX0JfQlQ4NDgsCiAJLmNsaWVudF9yZWdpc3RlciAgID0gYXR0YWNoX2luZm9ybSwKIH07CkBAIC0yNzUsMTAgKzI3NCw4IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIGJ0dHZfaTJjX2FkYXBfaHdfdGVtcGxhdGUgPSB7Ci0JLm93bmVyICAgICAgICAgPSBUSElTX01PRFVMRSwKLSNpZmRlZiBJMkNfQ0xBU1NfVFZfQU5BTE9HCisJLm93bmVyICAgICAgICAgICAgID0gVEhJU19NT0RVTEUsCiAJLmNsYXNzICAgICAgICAgPSBJMkNfQ0xBU1NfVFZfQU5BTE9HLAotI2VuZGlmCiAJLm5hbWUgICAgICAgICAgPSAiYnQ4NzgiLAogCS5pZCAgICAgICAgICAgID0gSTJDX0hXX0JfQlQ4NDggLyogRklYTUUgKi8sCiAJLmFsZ28gICAgICAgICAgPSAmYnR0dl9hbGdvLApAQCAtNDQxLDEyICs0MzgsMTAgQEAKIAlpMmNfc2V0X2FkYXBkYXRhKCZidHYtPmMuaTJjX2FkYXAsIGJ0dik7CiAJYnR2LT5pMmNfY2xpZW50LmFkYXB0ZXIgPSAmYnR2LT5jLmkyY19hZGFwOwogCi0jaWZkZWYgSTJDX0NMQVNTX1RWX0FOQUxPRwogCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5vX3ZpZGVvKQogCQlidHYtPmMuaTJjX2FkYXAuY2xhc3MgJj0gfkkyQ19DTEFTU19UVl9BTkFMT0c7CiAJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX2R2YikKIAkJYnR2LT5jLmkyY19hZGFwLmNsYXNzIHw9IEkyQ19DTEFTU19UVl9ESUdJVEFMOwotI2VuZGlmCiAKIAlpZiAoYnR2LT51c2VfaTJjX2h3KSB7CiAJCWJ0di0+aTJjX3JjID0gaTJjX2FkZF9hZGFwdGVyKCZidHYtPmMuaTJjX2FkYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtaW5wdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjFiMzZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWlucHV0LmMKQEAgLTAsMCArMSw2OTQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIEdlcmQgS25vcnIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBQYXZlbCBNYWNoZWsKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisKKyNpbmNsdWRlICJidHR2LmgiCisjaW5jbHVkZSAiYnR0dnAuaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfYXZlcm1lZGlhW0lSX0tFWVRBQl9TSVpFXSA9IHsKKwlbIDM0IF0gPSBLRVlfS1AwLAorCVsgNDAgXSA9IEtFWV9LUDEsCisJWyAyNCBdID0gS0VZX0tQMiwKKwlbIDU2IF0gPSBLRVlfS1AzLAorCVsgMzYgXSA9IEtFWV9LUDQsCisJWyAyMCBdID0gS0VZX0tQNSwKKwlbIDUyIF0gPSBLRVlfS1A2LAorCVsgNDQgXSA9IEtFWV9LUDcsCisJWyAyOCBdID0gS0VZX0tQOCwKKwlbIDYwIF0gPSBLRVlfS1A5LAorCisJWyA0OCBdID0gS0VZX0VKRUNUQ0QsICAgICAvLyBVbm1hcmtlZCBvbiBteSBjb250cm9sbGVyCisJWyAgMCBdID0gS0VZX1BPV0VSLAorCVsgMTggXSA9IEJUTl9MRUZULCAgICAgICAgLy8gRElTUExBWS9MCisJWyA1MCBdID0gQlROX1JJR0hULCAgICAgICAvLyBMT09QL1IKKwlbIDEwIF0gPSBLRVlfTVVURSwKKwlbIDM4IF0gPSBLRVlfUkVDT1JELAorCVsgMjIgXSA9IEtFWV9QQVVTRSwKKwlbIDU0IF0gPSBLRVlfU1RPUCwKKwlbIDMwIF0gPSBLRVlfVk9MVU1FRE9XTiwKKwlbIDYyIF0gPSBLRVlfVk9MVU1FVVAsCisKKwlbIDMyIF0gPSBLRVlfVFVORVIsICAgICAgIC8vIFRWL0ZNCisJWyAxNiBdID0gS0VZX0NELAorCVsgIDggXSA9IEtFWV9WSURFTywKKwlbICA0IF0gPSBLRVlfQVVESU8sCisJWyAxMiBdID0gS0VZX1pPT00sICAgICAgICAvLyBmdWxsIHNjcmVlbgorCVsgIDIgXSA9IEtFWV9JTkZPLCAgICAgICAgLy8gcHJldmlldworCVsgNDIgXSA9IEtFWV9TRUFSQ0gsICAgICAgLy8gYXV0b3NjYW4KKwlbIDI2IF0gPSBLRVlfU1RPUCwgICAgICAgIC8vIGZyZWV6ZQorCVsgNTggXSA9IEtFWV9SRUNPUkQsICAgICAgLy8gY2FwdHVyZQorCVsgIDYgXSA9IEtFWV9QTEFZLCAgICAgICAgLy8gdW5tYXJrZWQKKwlbIDQ2IF0gPSBLRVlfUkVELCAgICAgICAgIC8vIHVubWFya2VkCisJWyAxNCBdID0gS0VZX0dSRUVOLCAgICAgICAvLyB1bm1hcmtlZAorCisJWyAzMyBdID0gS0VZX1lFTExPVywgICAgICAvLyB1bm1hcmtlZAorCVsgMTcgXSA9IEtFWV9DSEFOTkVMRE9XTiwKKwlbIDQ5IF0gPSBLRVlfQ0hBTk5FTFVQLAorCVsgIDEgXSA9IEtFWV9CTFVFLCAgICAgICAgLy8gdW5tYXJrZWQKK307CisKKy8qIE1hdHQgSmVzc29uIDxkdmJAamVzc29uLmVjbGlwc2UuY28udWsgKi8KK3N0YXRpYyBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19hdmVybWVkaWFfZHZidFtJUl9LRVlUQUJfU0laRV0gPSB7CisJWyAweDI4IF0gPSBLRVlfS1AwLCAgICAgICAgIC8vJzAnIC8gJ2VudGVyJworCVsgMHgyMiBdID0gS0VZX0tQMSwgICAgICAgICAvLycxJworCVsgMHgxMiBdID0gS0VZX0tQMiwgICAgICAgICAvLycyJyAvICd1cCBhcnJvdycKKwlbIDB4MzIgXSA9IEtFWV9LUDMsICAgICAgICAgLy8nMycKKwlbIDB4MjQgXSA9IEtFWV9LUDQsICAgICAgICAgLy8nNCcgLyAnbGVmdCBhcnJvdycKKwlbIDB4MTQgXSA9IEtFWV9LUDUsICAgICAgICAgLy8nNScKKwlbIDB4MzQgXSA9IEtFWV9LUDYsICAgICAgICAgLy8nNicgLyAncmlnaHQgYXJyb3cnCisJWyAweDI2IF0gPSBLRVlfS1A3LCAgICAgICAgIC8vJzcnCisJWyAweDE2IF0gPSBLRVlfS1A4LCAgICAgICAgIC8vJzgnIC8gJ2Rvd24gYXJyb3cnCisJWyAweDM2IF0gPSBLRVlfS1A5LCAgICAgICAgIC8vJzknCisKKwlbIDB4MjAgXSA9IEtFWV9MSVNULCAgICAgICAgLy8gJ3NvdXJjZScKKwlbIDB4MTAgXSA9IEtFWV9URVhULCAgICAgICAgLy8gJ3RlbGV0ZXh0JworCVsgMHgwMCBdID0gS0VZX1BPV0VSLCAgICAgICAvLyAncG93ZXInCisJWyAweDA0IF0gPSBLRVlfQVVESU8sICAgICAgIC8vICdhdWRpbycKKwlbIDB4MDYgXSA9IEtFWV9aT09NLCAgICAgICAgLy8gJ2Z1bGwgc2NyZWVuJworCVsgMHgxOCBdID0gS0VZX1ZJREVPLCAgICAgICAvLyAnZGlzcGxheScKKwlbIDB4MzggXSA9IEtFWV9TRUFSQ0gsICAgICAgLy8gJ2xvb3AnCisJWyAweDA4IF0gPSBLRVlfSU5GTywgICAgICAgIC8vICdwcmV2aWV3JworCVsgMHgyYSBdID0gS0VZX1JFV0lORCwgICAgICAvLyAnYmFja3dhcmQgPDwnCisJWyAweDFhIF0gPSBLRVlfRkFTVEZPUldBUkQsIC8vICdmb3J3YXJkID4+JworCVsgMHgzYSBdID0gS0VZX1JFQ09SRCwgICAgICAvLyAnY2FwdHVyZScKKwlbIDB4MGEgXSA9IEtFWV9NVVRFLCAgICAgICAgLy8gJ211dGUnCisJWyAweDJjIF0gPSBLRVlfUkVDT1JELCAgICAgIC8vICdyZWNvcmQnCisJWyAweDFjIF0gPSBLRVlfUEFVU0UsICAgICAgIC8vICdwYXVzZScKKwlbIDB4M2MgXSA9IEtFWV9TVE9QLCAgICAgICAgLy8gJ3N0b3AnCisJWyAweDBjIF0gPSBLRVlfUExBWSwgICAgICAgIC8vICdwbGF5JworCVsgMHgyZSBdID0gS0VZX1JFRCwgICAgICAgICAvLyAncmVkJworCVsgMHgwMSBdID0gS0VZX0JMVUUsICAgICAgICAvLyAnYmx1ZScgLyAnY2FuY2VsJworCVsgMHgwZSBdID0gS0VZX1lFTExPVywgICAgICAvLyAneWVsbG93JyAvICdvaycKKwlbIDB4MjEgXSA9IEtFWV9HUkVFTiwgICAgICAgLy8gJ2dyZWVuJworCVsgMHgxMSBdID0gS0VZX0NIQU5ORUxET1dOLCAvLyAnY2hhbm5lbCAtJworCVsgMHgzMSBdID0gS0VZX0NIQU5ORUxVUCwgICAvLyAnY2hhbm5lbCArJworCVsgMHgxZSBdID0gS0VZX1ZPTFVNRURPV04sICAvLyAndm9sdW1lIC0nCisJWyAweDNlIF0gPSBLRVlfVk9MVU1FVVAsICAgIC8vICd2b2x1bWUgKycKK307CisKKy8qIEF0dGlsYSBLb25kb3JvcyA8YXR0aWxhLmtvbmRvcm9zQGNoZWxsby5odT4gKi8KK3N0YXRpYyBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19hcGFjX3ZpZXdjb21wW0lSX0tFWVRBQl9TSVpFXSA9IHsKKworCVsgIDEgXSA9IEtFWV9LUDEsCisJWyAgMiBdID0gS0VZX0tQMiwKKwlbICAzIF0gPSBLRVlfS1AzLAorCVsgIDQgXSA9IEtFWV9LUDQsCisJWyAgNSBdID0gS0VZX0tQNSwKKwlbICA2IF0gPSBLRVlfS1A2LAorCVsgIDcgXSA9IEtFWV9LUDcsCisJWyAgOCBdID0gS0VZX0tQOCwKKwlbICA5IF0gPSBLRVlfS1A5LAorCVsgIDAgXSA9IEtFWV9LUDAsCisJWyAyMyBdID0gS0VZX0xBU1QsICAgICAgICAvLyArMTAwCisJWyAxMCBdID0gS0VZX0xJU1QsICAgICAgICAvLyByZWNhbGwKKworCisJWyAyOCBdID0gS0VZX1RVTkVSLCAgICAgICAvLyBUVi9GTQorCVsgMjEgXSA9IEtFWV9TRUFSQ0gsICAgICAgLy8gc2NhbgorCVsgMTggXSA9IEtFWV9QT1dFUiwgICAgICAgLy8gcG93ZXIKKwlbIDMxIF0gPSBLRVlfVk9MVU1FRE9XTiwgIC8vIHZvbCB1cAorCVsgMjcgXSA9IEtFWV9WT0xVTUVVUCwgICAgLy8gdm9sIGRvd24KKwlbIDMwIF0gPSBLRVlfQ0hBTk5FTERPV04sIC8vIGNobiB1cAorCVsgMjYgXSA9IEtFWV9DSEFOTkVMVVAsICAgLy8gY2huIGRvd24KKworCVsgMTcgXSA9IEtFWV9WSURFTywgICAgICAgLy8gdmlkZW8KKwlbIDE1IF0gPSBLRVlfWk9PTSwgICAgICAgIC8vIGZ1bGwgc2NyZWVuCisJWyAxOSBdID0gS0VZX01VVEUsICAgICAgICAvLyBtdXRlL3VubXV0ZQorCVsgMTYgXSA9IEtFWV9URVhULCAgICAgICAgLy8gbWluCisKKwlbIDEzIF0gPSBLRVlfU1RPUCwgICAgICAgIC8vIGZyZWV6ZQorCVsgMTQgXSA9IEtFWV9SRUNPUkQsICAgICAgLy8gcmVjb3JkCisJWyAyOSBdID0gS0VZX1BMQVlQQVVTRSwgICAvLyBzdG9wCisJWyAyNSBdID0gS0VZX1BMQVksICAgICAgICAvLyBwbGF5CisKKwlbIDIyIF0gPSBLRVlfR09UTywgICAgICAgIC8vIG9zZAorCVsgMjAgXSA9IEtFWV9SRUZSRVNILCAgICAgLy8gZGVmYXVsdAorCVsgMTIgXSA9IEtFWV9LUFBMVVMsICAgICAgLy8gZmluZSB0dW5lID4+Pj4KKwlbIDI0IF0gPSBLRVlfS1BNSU5VUyAgICAgIC8vIGZpbmUgdHVuZSA8PDw8Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19jb25jZXB0cm9uaWNbSVJfS0VZVEFCX1NJWkVdID0geworCisJWyAzMCBdID0gS0VZX1BPV0VSLCAgICAgICAvLyBwb3dlcgorCVsgNyAgXSA9IEtFWV9NRURJQSwgICAgICAgLy8gc291cmNlCisJWyAyOCBdID0gS0VZX1NFQVJDSCwgICAgICAvLyBzY2FuCisKKy8qIEZJWE1FOiBkdXBsaWNhdGUga2V5Y29kZXM/CisgKgorICogVGhlc2UgZm91ciBrZXlzIHNlZW0gdG8gc2hhcmUgdGhlIHNhbWUgR1BJTyBhcyBDSCssIENILSwgPDw8IGFuZCA+Pj4KKyAqIFRoZSBHUElPIHZhbHVlcyBhcmUKKyAqIDYzOTdmYiBmb3IgYm90aCAiU2NhbiA8IiBhbmQgIkNIIC0iLAorICogNjM5ZmZiIGZvciAiU2NhbiA+IiBhbmQgIkNIKyIsCisgKiA2Mzg0ZmIgZm9yICJUdW5lIDwiIGFuZCAiPDw8IiwKKyAqIDYzOGNmYiBmb3IgIlR1bmUgPiIgYW5kICI+Pj4iLCByZWdhcmRsZXNzIG9mIHRoZSBtYXNrLgorICoKKyAqCVsgMjMgXSA9IEtFWV9CQUNLLCAgICAgICAgLy8gZm0gc2NhbiA8PAorICoJWyAzMSBdID0gS0VZX0ZPUldBUkQsICAgICAvLyBmbSBzY2FuID4+CisgKgorICoJWyA0ICBdID0gS0VZX0xFRlQsICAgICAgICAvLyBmbSB0dW5pbmcgPAorICoJWyAxMiBdID0gS0VZX1JJR0hULCAgICAgICAvLyBmbSB0dW5pbmcgPgorICoKKyAqIEZvciBub3csIHRoZXNlIGZvdXIga2V5cyBhcmUgZGlzYWJsZWQuIFByZXNzaW5nIHRoZW0gd2lsbCBnZW5lcmF0ZQorICogdGhlIENIKy9DSC0vPDw8Lz4+PiBldmVudHMKKyAqLworCisJWyAzICBdID0gS0VZX1RVTkVSLCAgICAgICAvLyBUVi9GTQorCisJWyAwICBdID0gS0VZX1JFQ09SRCwKKwlbIDggIF0gPSBLRVlfU1RPUCwKKwlbIDE3IF0gPSBLRVlfUExBWSwKKworCVsgMjYgXSA9IEtFWV9QTEFZUEFVU0UsICAgLy8gZnJlZXplCisJWyAyNSBdID0gS0VZX1pPT00sICAgICAgICAvLyB6b29tCisJWyAxNSBdID0gS0VZX1RFWFQsICAgICAgICAvLyBtaW4KKworCVsgMSAgXSA9IEtFWV9LUDEsCisJWyAxMSBdID0gS0VZX0tQMiwKKwlbIDI3IF0gPSBLRVlfS1AzLAorCVsgNSAgXSA9IEtFWV9LUDQsCisJWyA5ICBdID0gS0VZX0tQNSwKKwlbIDIxIF0gPSBLRVlfS1A2LAorCVsgNiAgXSA9IEtFWV9LUDcsCisJWyAxMCBdID0gS0VZX0tQOCwKKwlbIDE4IF0gPSBLRVlfS1A5LAorCVsgMiAgXSA9IEtFWV9LUDAsCisJWyAxNiBdID0gS0VZX0xBU1QsICAgICAgICAvLyArMTAwCisJWyAxOSBdID0gS0VZX0xJU1QsICAgICAgICAvLyByZWNhbGwKKworCVsgMzEgXSA9IEtFWV9DSEFOTkVMVVAsICAgLy8gY2huIGRvd24KKwlbIDIzIF0gPSBLRVlfQ0hBTk5FTERPV04sIC8vIGNobiB1cAorCVsgMjIgXSA9IEtFWV9WT0xVTUVVUCwgICAgLy8gdm9sIGRvd24KKwlbIDIwIF0gPSBLRVlfVk9MVU1FRE9XTiwgIC8vIHZvbCB1cAorCisJWyA0ICBdID0gS0VZX0tQTUlOVVMsICAgICAvLyA8PDwKKwlbIDE0IF0gPSBLRVlfU0VUVVAsICAgICAgIC8vIGZ1bmN0aW9uCisJWyAxMiBdID0gS0VZX0tQUExVUywgICAgICAvLyA+Pj4KKworCVsgMTMgXSA9IEtFWV9HT1RPLCAgICAgICAgLy8gbXRzCisJWyAyOSBdID0gS0VZX1JFRlJFU0gsICAgICAvLyByZXNldAorCVsgMjQgXSA9IEtFWV9NVVRFICAgICAgICAgLy8gbXV0ZS91bm11dGUKK307CisKK3N0YXRpYyBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19uZWJ1bGFbSVJfS0VZVEFCX1NJWkVdID0geworCVsweDAwXSA9IEtFWV9LUDAsCisJWzB4MDFdID0gS0VZX0tQMSwKKwlbMHgwMl0gPSBLRVlfS1AyLAorCVsweDAzXSA9IEtFWV9LUDMsCisJWzB4MDRdID0gS0VZX0tQNCwKKwlbMHgwNV0gPSBLRVlfS1A1LAorCVsweDA2XSA9IEtFWV9LUDYsCisJWzB4MDddID0gS0VZX0tQNywKKwlbMHgwOF0gPSBLRVlfS1A4LAorCVsweDA5XSA9IEtFWV9LUDksCisJWzB4MGFdID0gS0VZX1RWLAorCVsweDBiXSA9IEtFWV9BVVgsCisJWzB4MGNdID0gS0VZX0RWRCwKKwlbMHgwZF0gPSBLRVlfUE9XRVIsCisJWzB4MGVdID0gS0VZX01IUCwJLyogbGFiZWxsZWQgJ1BpY3R1cmUnICovCisJWzB4MGZdID0gS0VZX0FVRElPLAorCVsweDEwXSA9IEtFWV9JTkZPLAorCVsweDExXSA9IEtFWV9GMTMsCS8qIDE2OjkgKi8KKwlbMHgxMl0gPSBLRVlfRjE0LAkvKiAxNDo5ICovCisJWzB4MTNdID0gS0VZX0VQRywKKwlbMHgxNF0gPSBLRVlfRVhJVCwKKwlbMHgxNV0gPSBLRVlfTUVOVSwKKwlbMHgxNl0gPSBLRVlfVVAsCisJWzB4MTddID0gS0VZX0RPV04sCisJWzB4MThdID0gS0VZX0xFRlQsCisJWzB4MTldID0gS0VZX1JJR0hULAorCVsweDFhXSA9IEtFWV9FTlRFUiwKKwlbMHgxYl0gPSBLRVlfQ0hBTk5FTFVQLAorCVsweDFjXSA9IEtFWV9DSEFOTkVMRE9XTiwKKwlbMHgxZF0gPSBLRVlfVk9MVU1FVVAsCisJWzB4MWVdID0gS0VZX1ZPTFVNRURPV04sCisJWzB4MWZdID0gS0VZX1JFRCwKKwlbMHgyMF0gPSBLRVlfR1JFRU4sCisJWzB4MjFdID0gS0VZX1lFTExPVywKKwlbMHgyMl0gPSBLRVlfQkxVRSwKKwlbMHgyM10gPSBLRVlfU1VCVElUTEUsCisJWzB4MjRdID0gS0VZX0YxNSwJLyogQUQgKi8KKwlbMHgyNV0gPSBLRVlfVEVYVCwKKwlbMHgyNl0gPSBLRVlfTVVURSwKKwlbMHgyN10gPSBLRVlfUkVXSU5ELAorCVsweDI4XSA9IEtFWV9TVE9QLAorCVsweDI5XSA9IEtFWV9QTEFZLAorCVsweDJhXSA9IEtFWV9GQVNURk9SV0FSRCwKKwlbMHgyYl0gPSBLRVlfRjE2LAkvKiBjaGFwdGVyICovCisJWzB4MmNdID0gS0VZX1BBVVNFLAorCVsweDJkXSA9IEtFWV9QTEFZLAorCVsweDJlXSA9IEtFWV9SRUNPUkQsCisJWzB4MmZdID0gS0VZX0YxNywJLyogcGljdHVyZSBpbiBwaWN0dXJlICovCisJWzB4MzBdID0gS0VZX0tQUExVUywJLyogem9vbSBpbiAqLworCVsweDMxXSA9IEtFWV9LUE1JTlVTLAkvKiB6b29tIG91dCAqLworCVsweDMyXSA9IEtFWV9GMTgsCS8qIGNhcHR1cmUgKi8KKwlbMHgzM10gPSBLRVlfRjE5LAkvKiB3ZWIgKi8KKwlbMHgzNF0gPSBLRVlfRU1BSUwsCisJWzB4MzVdID0gS0VZX1BIT05FLAorCVsweDM2XSA9IEtFWV9QQworfTsKKworc3RhdGljIGludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsgICAgLyogZGVidWcgbGV2ZWwgKDAsMSwyKSAqLworc3RhdGljIGludCByZXBlYXRfZGVsYXkgPSA1MDA7Cittb2R1bGVfcGFyYW0ocmVwZWF0X2RlbGF5LCBpbnQsIDA2NDQpOworc3RhdGljIGludCByZXBlYXRfcGVyaW9kID0gMzM7Cittb2R1bGVfcGFyYW0ocmVwZWF0X3BlcmlvZCwgaW50LCAwNjQ0KTsKKworI2RlZmluZSBERVZOQU1FICJidHR2LWlucHV0IgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGlyX2hhbmRsZV9rZXkoc3RydWN0IGJ0dHYgKmJ0dikKK3sKKwlzdHJ1Y3QgYnR0dl9pciAqaXIgPSBidHYtPnJlbW90ZTsKKwl1MzIgZ3BpbyxkYXRhOworCisJLyogcmVhZCBncGlvIHZhbHVlICovCisJZ3BpbyA9IGJ0dHZfZ3Bpb19yZWFkKCZidHYtPmMpOworCWlmIChpci0+cG9sbGluZykgeworCQlpZiAoaXItPmxhc3RfZ3BpbyA9PSBncGlvKQorCQkJcmV0dXJuOworCQlpci0+bGFzdF9ncGlvID0gZ3BpbzsKKwl9CisKKwkvKiBleHRyYWN0IGRhdGEgKi8KKwlkYXRhID0gaXJfZXh0cmFjdF9iaXRzKGdwaW8sIGlyLT5tYXNrX2tleWNvZGUpOworCWRwcmludGsoS0VSTl9JTkZPIERFVk5BTUUgIjogaXJxIGdwaW89MHgleCBjb2RlPSVkIHwgJXMlcyVzXG4iLAorCQlncGlvLCBkYXRhLAorCQlpci0+cG9sbGluZyAgICAgICAgICAgICAgID8gInBvbGwiICA6ICJpcnEiLAorCQkoZ3BpbyAmIGlyLT5tYXNrX2tleWRvd24pID8gIiBkb3duIiA6ICIiLAorCQkoZ3BpbyAmIGlyLT5tYXNrX2tleXVwKSAgID8gIiB1cCIgICA6ICIiKTsKKworCWlmICgoaXItPm1hc2tfa2V5ZG93biAgJiYgICgwICE9IChncGlvICYgaXItPm1hc2tfa2V5ZG93bikpKSB8fAorCSAgICAoaXItPm1hc2tfa2V5dXAgICAgJiYgICgwID09IChncGlvICYgaXItPm1hc2tfa2V5dXApKSkpIHsKKwkJaXJfaW5wdXRfa2V5ZG93bihpci0+ZGV2LCZpci0+aXIsZGF0YSxkYXRhKTsKKwl9IGVsc2UgeworCQlpcl9pbnB1dF9ub2tleShpci0+ZGV2LCZpci0+aXIpOworCX0KKworfQorCit2b2lkIGJ0dHZfaW5wdXRfaXJxKHN0cnVjdCBidHR2ICpidHYpCit7CisJc3RydWN0IGJ0dHZfaXIgKmlyID0gYnR2LT5yZW1vdGU7CisKKwlpZiAoIWlyLT5wb2xsaW5nKQorCQlpcl9oYW5kbGVfa2V5KGJ0dik7Cit9CisKK3N0YXRpYyB2b2lkIGJ0dHZfaW5wdXRfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBidHR2ICpidHYgPSAoc3RydWN0IGJ0dHYqKWRhdGE7CisJc3RydWN0IGJ0dHZfaXIgKmlyID0gYnR2LT5yZW1vdGU7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJaXJfaGFuZGxlX2tleShidHYpOworCXRpbWVvdXQgPSBqaWZmaWVzICsgKGlyLT5wb2xsaW5nICogSFogLyAxMDAwKTsKKwltb2RfdGltZXIoJmlyLT50aW1lciwgdGltZW91dCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgcmM1X3JlbW90ZV9nYXAgPSA4ODU7Cittb2R1bGVfcGFyYW0ocmM1X3JlbW90ZV9nYXAsIGludCwgMDY0NCk7CitzdGF0aWMgaW50IHJjNV9rZXlfdGltZW91dCA9IDIwMDsKK21vZHVsZV9wYXJhbShyYzVfa2V5X3RpbWVvdXQsIGludCwgMDY0NCk7CisKKyNkZWZpbmUgUkM1X1NUQVJUKHgpCSgoKHgpPj4xMikmMykKKyNkZWZpbmUgUkM1X1RPR0dMRSh4KQkoKCh4KT4+MTEpJjEpCisjZGVmaW5lIFJDNV9BRERSKHgpCSgoKHgpPj42KSYzMSkKKyNkZWZpbmUgUkM1X0lOU1RSKHgpCSgoeCkmNjMpCisKKy8qIGRlY29kZSByYXcgYml0IHBhdHRlcm4gdG8gUkM1IGNvZGUgKi8KK3N0YXRpYyB1MzIgcmM1X2RlY29kZSh1bnNpZ25lZCBpbnQgY29kZSkKK3sKKwl1bnNpZ25lZCBpbnQgb3JnX2NvZGUgPSBjb2RlOworCXVuc2lnbmVkIGludCBwYWlyOworCXVuc2lnbmVkIGludCByYzUgPSAwOworCWludCBpOworCisJY29kZSA9IChjb2RlIDw8IDEpIHwgMTsKKwlmb3IgKGkgPSAwOyBpIDwgMTQ7ICsraSkgeworCQlwYWlyID0gY29kZSAmIDB4MzsKKwkJY29kZSA+Pj0gMjsKKworCQlyYzUgPDw9IDE7CisJCXN3aXRjaCAocGFpcikgeworCQljYXNlIDA6CisJCWNhc2UgMjoKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlyYzUgfD0gMTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlkcHJpbnRrKEtFUk5fV0FSTklORyAiYmFkIGNvZGU6ICV4XG4iLCBvcmdfY29kZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlkcHJpbnRrKEtFUk5fV0FSTklORyAiY29kZT0leCwgcmM1PSV4LCBzdGFydD0leCwgdG9nZ2xlPSV4LCBhZGRyZXNzPSV4LCAiCisJCSJpbnN0cj0leFxuIiwgcmM1LCBvcmdfY29kZSwgUkM1X1NUQVJUKHJjNSksCisJCVJDNV9UT0dHTEUocmM1KSwgUkM1X0FERFIocmM1KSwgUkM1X0lOU1RSKHJjNSkpOworCXJldHVybiByYzU7Cit9CisKK3N0YXRpYyBpbnQgYnR0dl9yYzVfaXJxKHN0cnVjdCBidHR2ICpidHYpCit7CisJc3RydWN0IGJ0dHZfaXIgKmlyID0gYnR2LT5yZW1vdGU7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJdTMyIGdwaW87CisJdTMyIGdhcDsKKwl1bnNpZ25lZCBsb25nIGN1cnJlbnRfamlmZmllcywgdGltZW91dDsKKworCS8qIHJlYWQgZ3BpbyBwb3J0ICovCisJZ3BpbyA9IGJ0dHZfZ3Bpb19yZWFkKCZidHYtPmMpOworCisJLyogcmVtb3RlIElSUT8gKi8KKwlpZiAoIShncGlvICYgMHgyMCkpCisJCXJldHVybiAwOworCisJLyogZ2V0IHRpbWUgb2YgYml0ICovCisJY3VycmVudF9qaWZmaWVzID0gamlmZmllczsKKwlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKworCS8qIGF2b2lkIG92ZXJmbG93IHdpdGggZ2FwID4xcyAqLworCWlmICh0di50dl9zZWMgLSBpci0+YmFzZV90aW1lLnR2X3NlYyA+IDEpIHsKKwkJZ2FwID0gMjAwMDAwOworCX0gZWxzZSB7CisJCWdhcCA9IDEwMDAwMDAgKiAodHYudHZfc2VjIC0gaXItPmJhc2VfdGltZS50dl9zZWMpICsKKwkJICAgIHR2LnR2X3VzZWMgLSBpci0+YmFzZV90aW1lLnR2X3VzZWM7CisJfQorCisJLyogYWN0aXZlIGNvZGUgPT4gYWRkIGJpdCAqLworCWlmIChpci0+YWN0aXZlKSB7CisJCS8qIG9ubHkgaWYgaW4gdGhlIGNvZGUgKG90aGVyd2lzZSBzcHVyaW91cyBJUlEgb3IgdGltZXIKKwkJICAgbGF0ZSkgKi8KKwkJaWYgKGlyLT5sYXN0X2JpdCA8IDI4KSB7CisJCQlpci0+bGFzdF9iaXQgPSAoZ2FwIC0gcmM1X3JlbW90ZV9nYXAgLyAyKSAvCisJCQkgICAgcmM1X3JlbW90ZV9nYXA7CisJCQlpci0+Y29kZSB8PSAxIDw8IGlyLT5sYXN0X2JpdDsKKwkJfQorCQkvKiBzdGFydGluZyBuZXcgY29kZSAqLworCX0gZWxzZSB7CisJCWlyLT5hY3RpdmUgPSAxOworCQlpci0+Y29kZSA9IDA7CisJCWlyLT5iYXNlX3RpbWUgPSB0djsKKwkJaXItPmxhc3RfYml0ID0gMDsKKworCQl0aW1lb3V0ID0gY3VycmVudF9qaWZmaWVzICsgKDUwMCArIDMwICogSFopIC8gMTAwMDsKKwkJbW9kX3RpbWVyKCZpci0+dGltZXJfZW5kLCB0aW1lb3V0KTsKKwl9CisKKwkvKiB0b2dnbGUgR1BJTyBwaW4gNCB0byByZXNldCB0aGUgaXJxICovCisJYnR0dl9ncGlvX3dyaXRlKCZidHYtPmMsIGdwaW8gJiB+KDEgPDwgNCkpOworCWJ0dHZfZ3Bpb193cml0ZSgmYnR2LT5jLCBncGlvIHwgKDEgPDwgNCkpOworCXJldHVybiAxOworfQorCisKK3N0YXRpYyB2b2lkIGJ0dHZfcmM1X3RpbWVyX2VuZCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGJ0dHZfaXIgKmlyID0gKHN0cnVjdCBidHR2X2lyICopZGF0YTsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwl1bnNpZ25lZCBsb25nIGN1cnJlbnRfamlmZmllcywgdGltZW91dDsKKwl1MzIgZ2FwOworCisJLyogZ2V0IHRpbWUgKi8KKwljdXJyZW50X2ppZmZpZXMgPSBqaWZmaWVzOworCWRvX2dldHRpbWVvZmRheSgmdHYpOworCisJLyogYXZvaWQgb3ZlcmZsb3cgd2l0aCBnYXAgPjFzICovCisJaWYgKHR2LnR2X3NlYyAtIGlyLT5iYXNlX3RpbWUudHZfc2VjID4gMSkgeworCQlnYXAgPSAyMDAwMDA7CisJfSBlbHNlIHsKKwkJZ2FwID0gMTAwMDAwMCAqICh0di50dl9zZWMgLSBpci0+YmFzZV90aW1lLnR2X3NlYykgKworCQkgICAgdHYudHZfdXNlYyAtIGlyLT5iYXNlX3RpbWUudHZfdXNlYzsKKwl9CisKKwkvKiBBbGxvdyBzb21lIHRpbW1lciBqaXR0ZXIgKFJDNSBpcyB+MjRtcyBhbnl3YXkgc28gdGhpcyBpcyBvaykgKi8KKwlpZiAoZ2FwIDwgMjgwMDApIHsKKwkJZHByaW50ayhLRVJOX1dBUk5JTkcgInNwdXJpb3VzIHRpbWVyX2VuZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpci0+YWN0aXZlID0gMDsKKwlpZiAoaXItPmxhc3RfYml0IDwgMjApIHsKKwkJLyogaWdub3JlIHNwdXJpb3VzIGNvZGVzIChjYXVzZWQgYnkgbGlnaHQvb3RoZXIgcmVtb3RlcykgKi8KKwkJZHByaW50ayhLRVJOX1dBUk5JTkcgInNob3J0IGNvZGU6ICV4XG4iLCBpci0+Y29kZSk7CisJfSBlbHNlIHsKKwkJdTMyIHJjNSA9IHJjNV9kZWNvZGUoaXItPmNvZGUpOworCisJCS8qIHR3byBzdGFydCBiaXRzPyAqLworCQlpZiAoUkM1X1NUQVJUKHJjNSkgIT0gMykgeworCQkJZHByaW50ayhLRVJOX1dBUk5JTkcgInJjNSBzdGFydCBiaXRzIGludmFsaWQ6ICV1XG4iLCBSQzVfU1RBUlQocmM1KSk7CisKKwkJCS8qIHJpZ2h0IGFkZHJlc3M/ICovCisJCX0gZWxzZSBpZiAoUkM1X0FERFIocmM1KSA9PSAweDApIHsKKwkJCXUzMiB0b2dnbGUgPSBSQzVfVE9HR0xFKHJjNSk7CisJCQl1MzIgaW5zdHIgPSBSQzVfSU5TVFIocmM1KTsKKworCQkJLyogR29vZCBjb2RlLCBkZWNpZGUgaWYgcmVwZWF0L3JlcHJlc3MgKi8KKwkJCWlmICh0b2dnbGUgIT0gUkM1X1RPR0dMRShpci0+bGFzdF9yYzUpIHx8CisJCQkgICAgaW5zdHIgIT0gUkM1X0lOU1RSKGlyLT5sYXN0X3JjNSkpIHsKKwkJCQlkcHJpbnRrKEtFUk5fV0FSTklORyAiaW5zdHJ1Y3Rpb24gJXgsIHRvZ2dsZSAleFxuIiwgaW5zdHIsCisJCQkJCXRvZ2dsZSk7CisJCQkJaXJfaW5wdXRfbm9rZXkoaXItPmRldiwgJmlyLT5pcik7CisJCQkJaXJfaW5wdXRfa2V5ZG93bihpci0+ZGV2LCAmaXItPmlyLCBpbnN0ciwKKwkJCQkJCSBpbnN0cik7CisJCQl9CisKKwkJCS8qIFNldC9yZXNldCBrZXktdXAgdGltZXIgKi8KKwkJCXRpbWVvdXQgPSBjdXJyZW50X2ppZmZpZXMgKyAoNTAwICsgcmM1X2tleV90aW1lb3V0CisJCQkJCQkgICAgICogSFopIC8gMTAwMDsKKwkJCW1vZF90aW1lcigmaXItPnRpbWVyX2tleXVwLCB0aW1lb3V0KTsKKworCQkJLyogU2F2ZSBjb2RlIGZvciByZXBlYXQgdGVzdCAqLworCQkJaXItPmxhc3RfcmM1ID0gcmM1OworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBidHR2X3JjNV90aW1lcl9rZXl1cCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGJ0dHZfaXIgKmlyID0gKHN0cnVjdCBidHR2X2lyICopZGF0YTsKKworCWRwcmludGsoS0VSTl9ERUJVRyAia2V5IHJlbGVhc2VkXG4iKTsKKwlpcl9pbnB1dF9ub2tleShpci0+ZGV2LCAmaXItPmlyKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgYnR0dl9pbnB1dF9pbml0KHN0cnVjdCBidHR2ICpidHYpCit7CisJc3RydWN0IGJ0dHZfaXIgKmlyOworCUlSX0tFWVRBQl9UWVBFICppcl9jb2RlcyA9IE5VTEw7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCWludCBpcl90eXBlID0gSVJfVFlQRV9PVEhFUjsKKworCWlmICghYnR2LT5oYXNfcmVtb3RlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlyID0ga3phbGxvYyhzaXplb2YoKmlyKSxHRlBfS0VSTkVMKTsKKwlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWlyIHx8ICFpbnB1dF9kZXYpIHsKKwkJa2ZyZWUoaXIpOworCQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGlyLDAsc2l6ZW9mKCppcikpOworCisJLyogZGV0ZWN0ICYgY29uZmlndXJlICovCisJc3dpdGNoIChidHYtPmMudHlwZSkgeworCWNhc2UgQlRUVl9CT0FSRF9BVkVSTUVESUE6CisJY2FzZSBCVFRWX0JPQVJEX0FWUEhPTkU5ODoKKwljYXNlIEJUVFZfQk9BUkRfQVZFUk1FRElBOTg6CisJCWlyX2NvZGVzICAgICAgICAgPSBpcl9jb2Rlc19hdmVybWVkaWE7CisJCWlyLT5tYXNrX2tleWNvZGUgPSAweGY4ODAwMDsKKwkJaXItPm1hc2tfa2V5ZG93biA9IDB4MDEwMDAwOworCQlpci0+cG9sbGluZyAgICAgID0gNTA7IC8vIG1zCisJCWJyZWFrOworCisJY2FzZSBCVFRWX0JPQVJEX0FWRFZCVF83NjE6CisJY2FzZSBCVFRWX0JPQVJEX0FWRFZCVF83NzE6CisJCWlyX2NvZGVzICAgICAgICAgPSBpcl9jb2Rlc19hdmVybWVkaWFfZHZidDsKKwkJaXItPm1hc2tfa2V5Y29kZSA9IDB4MGYwMGMwOworCQlpci0+bWFza19rZXlkb3duID0gMHgwMDAwMjA7CisJCWlyLT5wb2xsaW5nICAgICAgPSA1MDsgLy8gbXMKKwkJYnJlYWs7CisKKwljYXNlIEJUVFZfQk9BUkRfUFhFTFZXUExUVlBBSzoKKwkJaXJfY29kZXMgICAgICAgICA9IGlyX2NvZGVzX3BpeGVsdmlldzsKKwkJaXItPm1hc2tfa2V5Y29kZSA9IDB4MDAzZTAwOworCQlpci0+bWFza19rZXl1cCAgID0gMHgwMTAwMDA7CisJCWlyLT5wb2xsaW5nICAgICAgPSA1MDsgLy8gbXMKKwkJYnJlYWs7CisJY2FzZSBCVFRWX0JPQVJEX1BWX0JUODc4UF85QjoKKwljYXNlIEJUVFZfQk9BUkRfUFZfQlQ4NzhQX1BMVVM6CisJCWlyX2NvZGVzICAgICAgICAgPSBpcl9jb2Rlc19waXhlbHZpZXc7CisJCWlyLT5tYXNrX2tleWNvZGUgPSAweDAwMWYwMDsKKwkJaXItPm1hc2tfa2V5dXAgICA9IDB4MDA4MDAwOworCQlpci0+cG9sbGluZyAgICAgID0gNTA7IC8vIG1zCisJCWJyZWFrOworCisJY2FzZSBCVFRWX0JPQVJEX1dJTkZBU1QyMDAwOgorCQlpcl9jb2RlcyAgICAgICAgID0gaXJfY29kZXNfd2luZmFzdDsKKwkJaXItPm1hc2tfa2V5Y29kZSA9IDB4MWY4OworCQlicmVhazsKKwljYXNlIEJUVFZfQk9BUkRfTUFHSUNUVklFVzA2MToKKwljYXNlIEJUVFZfQk9BUkRfTUFHSUNUVklFVzA2MzoKKwkJaXJfY29kZXMgICAgICAgICA9IGlyX2NvZGVzX3dpbmZhc3Q7CisJCWlyLT5tYXNrX2tleWNvZGUgPSAweDAwMDhlMDAwOworCQlpci0+bWFza19rZXlkb3duID0gMHgwMDIwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBCVFRWX0JPQVJEX0FQQUNfVklFV0NPTVA6CisJCWlyX2NvZGVzICAgICAgICAgPSBpcl9jb2Rlc19hcGFjX3ZpZXdjb21wOworCQlpci0+bWFza19rZXljb2RlID0gMHgwMDFmMDA7CisJCWlyLT5tYXNrX2tleXVwICAgPSAweDAwODAwMDsKKwkJaXItPnBvbGxpbmcgICAgICA9IDUwOyAvLyBtcworCQlicmVhazsKKwljYXNlIEJUVFZfQk9BUkRfQ09OQ0VQVFJPTklDX0NUVkZNSTI6CisJCWlyX2NvZGVzICAgICAgICAgPSBpcl9jb2Rlc19jb25jZXB0cm9uaWM7CisJCWlyLT5tYXNrX2tleWNvZGUgPSAweDAwMUYwMDsKKwkJaXItPm1hc2tfa2V5dXAgICA9IDB4MDA2MDAwOworCQlpci0+cG9sbGluZyAgICAgID0gNTA7IC8vIG1zCisJCWJyZWFrOworCWNhc2UgQlRUVl9CT0FSRF9ORUJVTEFfRElHSVRWOgorCQlpcl9jb2RlcyA9IGlyX2NvZGVzX25lYnVsYTsKKwkJYnR2LT5jdXN0b21faXJxID0gYnR0dl9yYzVfaXJxOworCQlpci0+cmM1X2dwaW8gPSAxOworCQlicmVhazsKKwljYXNlIEJUVFZfQk9BUkRfTUFDSFRWX01BR0lDVFY6CisJCWlyX2NvZGVzICAgICAgICAgPSBpcl9jb2Rlc19hcGFjX3ZpZXdjb21wOworCQlpci0+bWFza19rZXljb2RlID0gMHgwMDFGMDA7CisJCWlyLT5tYXNrX2tleXVwICAgPSAweDAwNDAwMDsKKwkJaXItPnBvbGxpbmcgICAgICA9IDUwOyAvKiBtcyAqLworCQlicmVhazsKKwl9CisJaWYgKE5VTEwgPT0gaXJfY29kZXMpIHsKKwkJZHByaW50ayhLRVJOX0lORk8gIk9vb3BzOiBJUiBjb25maWcgZXJyb3IgW2NhcmQ9JWRdXG4iLGJ0di0+Yy50eXBlKTsKKwkJa2ZyZWUoaXIpOworCQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoaXItPnJjNV9ncGlvKSB7CisJCXUzMiBncGlvOworCSAgICAJLyogZW5hYmxlIHJlbW90ZSBpcnEgKi8KKwkJYnR0dl9ncGlvX2lub3V0KCZidHYtPmMsICgxIDw8IDQpLCAxIDw8IDQpOworCQlncGlvID0gYnR0dl9ncGlvX3JlYWQoJmJ0di0+Yyk7CisJCWJ0dHZfZ3Bpb193cml0ZSgmYnR2LT5jLCBncGlvICYgfigxIDw8IDQpKTsKKwkJYnR0dl9ncGlvX3dyaXRlKCZidHYtPmMsIGdwaW8gfCAoMSA8PCA0KSk7CisJfSBlbHNlIHsKKwkJLyogaW5pdCBoYXJkd2FyZS1zcGVjaWZpYyBzdHVmZiAqLworCQlidHR2X2dwaW9faW5vdXQoJmJ0di0+YywgaXItPm1hc2tfa2V5Y29kZSB8IGlyLT5tYXNrX2tleWRvd24sIDApOworCX0KKworCS8qIGluaXQgaW5wdXQgZGV2aWNlICovCisJaXItPmRldiA9IGlucHV0X2RldjsKKworCXNucHJpbnRmKGlyLT5uYW1lLCBzaXplb2YoaXItPm5hbWUpLCAiYnR0diBJUiAoY2FyZD0lZCkiLAorCQkgYnR2LT5jLnR5cGUpOworCXNucHJpbnRmKGlyLT5waHlzLCBzaXplb2YoaXItPnBoeXMpLCAicGNpLSVzL2lyMCIsCisJCSBwY2lfbmFtZShidHYtPmMucGNpKSk7CisKKwlpcl9pbnB1dF9pbml0KGlucHV0X2RldiwgJmlyLT5pciwgaXJfdHlwZSwgaXJfY29kZXMpOworCWlucHV0X2Rldi0+bmFtZSA9IGlyLT5uYW1lOworCWlucHV0X2Rldi0+cGh5cyA9IGlyLT5waHlzOworCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19QQ0k7CisJaW5wdXRfZGV2LT5pZC52ZXJzaW9uID0gMTsKKwlpZiAoYnR2LT5jLnBjaS0+c3Vic3lzdGVtX3ZlbmRvcikgeworCQlpbnB1dF9kZXYtPmlkLnZlbmRvciAgPSBidHYtPmMucGNpLT5zdWJzeXN0ZW1fdmVuZG9yOworCQlpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSBidHYtPmMucGNpLT5zdWJzeXN0ZW1fZGV2aWNlOworCX0gZWxzZSB7CisJCWlucHV0X2Rldi0+aWQudmVuZG9yICA9IGJ0di0+Yy5wY2ktPnZlbmRvcjsKKwkJaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gYnR2LT5jLnBjaS0+ZGV2aWNlOworCX0KKwlpbnB1dF9kZXYtPmNkZXYuZGV2ID0gJmJ0di0+Yy5wY2ktPmRldjsKKworCWJ0di0+cmVtb3RlID0gaXI7CisJaWYgKGlyLT5wb2xsaW5nKSB7CisJCWluaXRfdGltZXIoJmlyLT50aW1lcik7CisJCWlyLT50aW1lci5mdW5jdGlvbiA9IGJ0dHZfaW5wdXRfdGltZXI7CisJCWlyLT50aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKWJ0djsKKwkJaXItPnRpbWVyLmV4cGlyZXMgID0gamlmZmllcyArIEhaOworCQlhZGRfdGltZXIoJmlyLT50aW1lcik7CisJfSBlbHNlIGlmIChpci0+cmM1X2dwaW8pIHsKKwkJLyogc2V0IHRpbWVyX2VuZCBmb3IgY29kZSBjb21wbGV0aW9uICovCisJCWluaXRfdGltZXIoJmlyLT50aW1lcl9lbmQpOworCQlpci0+dGltZXJfZW5kLmZ1bmN0aW9uID0gYnR0dl9yYzVfdGltZXJfZW5kOworCQlpci0+dGltZXJfZW5kLmRhdGEgPSAodW5zaWduZWQgbG9uZylpcjsKKworCQlpbml0X3RpbWVyKCZpci0+dGltZXJfa2V5dXApOworCQlpci0+dGltZXJfa2V5dXAuZnVuY3Rpb24gPSBidHR2X3JjNV90aW1lcl9rZXl1cDsKKwkJaXItPnRpbWVyX2tleXVwLmRhdGEgPSAodW5zaWduZWQgbG9uZylpcjsKKwl9CisKKwkvKiBhbGwgZG9uZSAqLworCWlucHV0X3JlZ2lzdGVyX2RldmljZShidHYtPnJlbW90ZS0+ZGV2KTsKKwlwcmludGsoREVWTkFNRSAiOiAlcyBkZXRlY3RlZCBhdCAlc1xuIixpci0+bmFtZSxpci0+cGh5cyk7CisKKwkvKiB0aGUgcmVtb3RlIGlzbid0IGFzIGJvdW5jeSBhcyBhIGtleWJvYXJkICovCisJaXItPmRldi0+cmVwW1JFUF9ERUxBWV0gPSByZXBlYXRfZGVsYXk7CisJaXItPmRldi0+cmVwW1JFUF9QRVJJT0RdID0gcmVwZWF0X3BlcmlvZDsKKworCXJldHVybiAwOworfQorCit2b2lkIGJ0dHZfaW5wdXRfZmluaShzdHJ1Y3QgYnR0diAqYnR2KQoreworCWlmIChidHYtPnJlbW90ZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoYnR2LT5yZW1vdGUtPnBvbGxpbmcpIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmJ0di0+cmVtb3RlLT50aW1lcik7CisJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJfQorCisKKwlpZiAoYnR2LT5yZW1vdGUtPnJjNV9ncGlvKSB7CisJCXUzMiBncGlvOworCisJCWRlbF90aW1lcl9zeW5jKCZidHYtPnJlbW90ZS0+dGltZXJfZW5kKTsKKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCQlncGlvID0gYnR0dl9ncGlvX3JlYWQoJmJ0di0+Yyk7CisJCWJ0dHZfZ3Bpb193cml0ZSgmYnR2LT5jLCBncGlvICYgfigxIDw8IDQpKTsKKwl9CisKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShidHYtPnJlbW90ZS0+ZGV2KTsKKwlrZnJlZShidHYtPnJlbW90ZSk7CisJYnR2LT5yZW1vdGUgPSBOVUxMOworfQorCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtdmJpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtdmJpLmMKaW5kZXggZjRmNThjNi4uNzJhZmRkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LXZiaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di12YmkuYwpAQCAtMzEsNiArMzEsMTIgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlICJidHR2cC5oIgogCisvKiBPZmZzZXQgZnJvbSBsaW5lIHN5bmMgcHVsc2UgbGVhZGluZyBlZGdlICgwSCkgaW4gMSAvIHNhbXBsaW5nX3JhdGU6CisgICBidDh4OCAvSFJFU0VUIHB1bHNlIHN0YXJ0cyBhdCAwSCBhbmQgaGFzIGxlbmd0aCA2NCAvIGZDTEt4MSAoRXxPX1ZUQworICAgSFNGTVQgPSAwKS4gVkJJX0hERUxBWSAoYWx3YXlzIDApIGlzIGFuIG9mZnNldCBmcm9tIHRoZSB0cmFpbGluZyBlZGdlCisgICBvZiAvSFJFU0VUIGluIDEgLyBmQ0xLeDEsIGFuZCB0aGUgc2FtcGxpbmdfcmF0ZSB0dm5vcm0tPkZzYyBpcyBmQ0xLeDIuICovCisjZGVmaW5lIFZCSV9PRkZTRVQgKCg2NCArIDApICogMikKKwogI2RlZmluZSBWQklfREVGTElORVMgMTYKICNkZWZpbmUgVkJJX01BWExJTkVTIDMyCiAKQEAgLTE2Myw0MCArMTY5LDMwIEBACiB2b2lkIGJ0dHZfdmJpX3RyeV9mbXQoc3RydWN0IGJ0dHZfZmggKmZoLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7CiAJY29uc3Qgc3RydWN0IGJ0dHZfdHZub3JtICp0dm5vcm07Ci0JdTMyIHN0YXJ0MCxzdGFydDE7Ci0JczMyIGNvdW50MCxjb3VudDEsY291bnQ7CisJczY0IGNvdW50MCxjb3VudDEsY291bnQ7CiAKIAl0dm5vcm0gPSAmYnR0dl90dm5vcm1zW2ZoLT5idHYtPnR2bm9ybV07CiAJZi0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU7CiAJZi0+Zm10LnZiaS5zYW1wbGluZ19yYXRlICAgID0gdHZub3JtLT5Gc2M7CiAJZi0+Zm10LnZiaS5zYW1wbGVzX3Blcl9saW5lID0gMjA0ODsKIAlmLT5mbXQudmJpLnNhbXBsZV9mb3JtYXQgICAgPSBWNEwyX1BJWF9GTVRfR1JFWTsKLQlmLT5mbXQudmJpLm9mZnNldCAgICAgICAgICAgPSAyNDQ7CisJZi0+Zm10LnZiaS5vZmZzZXQgICAgICAgICAgID0gVkJJX09GRlNFVDsKIAlmLT5mbXQudmJpLmZsYWdzICAgICAgICAgICAgPSAwOwotCXN3aXRjaCAoZmgtPmJ0di0+dHZub3JtKSB7Ci0JY2FzZSAxOiAvKiBOVFNDICovCi0JCXN0YXJ0MCA9IDEwOwotCQlzdGFydDEgPSAyNzM7Ci0JCWJyZWFrOwotCWNhc2UgMDogLyogUEFMICovCi0JY2FzZSAyOiAvKiBTRUNBTSAqLwotCWRlZmF1bHQ6Ci0JCXN0YXJ0MCA9IDc7Ci0JCXN0YXJ0MSA9IDMyMDsKLQl9CiAKLQljb3VudDAgPSAoZi0+Zm10LnZiaS5zdGFydFswXSArIGYtPmZtdC52YmkuY291bnRbMF0pIC0gc3RhcnQwOwotCWNvdW50MSA9IChmLT5mbXQudmJpLnN0YXJ0WzFdICsgZi0+Zm10LnZiaS5jb3VudFsxXSkgLSBzdGFydDE7Ci0JY291bnQgID0gbWF4KGNvdW50MCxjb3VudDEpOwotCWlmIChjb3VudCA+IFZCSV9NQVhMSU5FUykKLQkJY291bnQgPSBWQklfTUFYTElORVM7Ci0JaWYgKGNvdW50IDwgMSkKLQkJY291bnQgPSAxOworCS8qIHM2NCB0byBwcmV2ZW50IG92ZXJmbG93LiAqLworCWNvdW50MCA9IChzNjQpIGYtPmZtdC52Ymkuc3RhcnRbMF0gKyBmLT5mbXQudmJpLmNvdW50WzBdCisJCS0gdHZub3JtLT52YmlzdGFydFswXTsKKwljb3VudDEgPSAoczY0KSBmLT5mbXQudmJpLnN0YXJ0WzFdICsgZi0+Zm10LnZiaS5jb3VudFsxXQorCQktIHR2bm9ybS0+dmJpc3RhcnRbMV07CisJY291bnQgID0gY2xhbXAgKG1heCAoY291bnQwLCBjb3VudDEpLCAxTEwsIChzNjQpIFZCSV9NQVhMSU5FUyk7CiAKLQlmLT5mbXQudmJpLnN0YXJ0WzBdID0gc3RhcnQwOwotCWYtPmZtdC52Ymkuc3RhcnRbMV0gPSBzdGFydDE7CisJZi0+Zm10LnZiaS5zdGFydFswXSA9IHR2bm9ybS0+dmJpc3RhcnRbMF07CisJZi0+Zm10LnZiaS5zdGFydFsxXSA9IHR2bm9ybS0+dmJpc3RhcnRbMV07CiAJZi0+Zm10LnZiaS5jb3VudFswXSA9IGNvdW50OwogCWYtPmZtdC52YmkuY291bnRbMV0gPSBjb3VudDsKKworCWYtPmZtdC52YmkucmVzZXJ2ZWRbMF0gPSAwOworCWYtPmZtdC52YmkucmVzZXJ2ZWRbMV0gPSAwOwogfQogCiB2b2lkIGJ0dHZfdmJpX2dldF9mbXQoc3RydWN0IGJ0dHZfZmggKmZoLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCkBAIC0yMDksMjEgKzIwNSwxMiBAQAogCWYtPmZtdC52Ymkuc2FtcGxpbmdfcmF0ZSAgICA9IHR2bm9ybS0+RnNjOwogCWYtPmZtdC52Ymkuc2FtcGxlc19wZXJfbGluZSA9IDIwNDg7CiAJZi0+Zm10LnZiaS5zYW1wbGVfZm9ybWF0ICAgID0gVjRMMl9QSVhfRk1UX0dSRVk7Ci0JZi0+Zm10LnZiaS5vZmZzZXQgICAgICAgICAgID0gMjQ0OworCWYtPmZtdC52Ymkub2Zmc2V0ICAgICAgICAgICA9IFZCSV9PRkZTRVQ7CisJZi0+Zm10LnZiaS5zdGFydFswXSAgICAgICAgID0gdHZub3JtLT52YmlzdGFydFswXTsKKwlmLT5mbXQudmJpLnN0YXJ0WzFdICAgICAgICAgPSB0dm5vcm0tPnZiaXN0YXJ0WzFdOwogCWYtPmZtdC52YmkuY291bnRbMF0gICAgICAgICA9IGZoLT5saW5lczsKIAlmLT5mbXQudmJpLmNvdW50WzFdICAgICAgICAgPSBmaC0+bGluZXM7CiAJZi0+Zm10LnZiaS5mbGFncyAgICAgICAgICAgID0gMDsKLQlzd2l0Y2ggKGZoLT5idHYtPnR2bm9ybSkgewotCWNhc2UgMTogLyogTlRTQyAqLwotCQlmLT5mbXQudmJpLnN0YXJ0WzBdID0gMTA7Ci0JCWYtPmZtdC52Ymkuc3RhcnRbMV0gPSAyNzM7Ci0JCWJyZWFrOwotCWNhc2UgMDogLyogUEFMICovCi0JY2FzZSAyOiAvKiBTRUNBTSAqLwotCWRlZmF1bHQ6Ci0JCWYtPmZtdC52Ymkuc3RhcnRbMF0gPSA3OwotCQlmLT5mbXQudmJpLnN0YXJ0WzFdID0gMzE5OwotCX0KIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LmgKaW5kZXggOTMyOThmMC4uOTkwOGM4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LmgKQEAgLTE2LDYgKzE2LDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bWVkaWEvaXItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvaXIta2JkLWkyYy5oPgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBleHBvcnRlZCBieSBidHR2LWNhcmRzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNjMsNiArMTY1LDggQEAKICNkZWZpbmUgQlRUVl9CT0FSRF9PU1BSRVk0NDAgICAgICAgICAgICAgICAweDhjCiAjZGVmaW5lIEJUVFZfQk9BUkRfQVNPVU5EX1NLWUVZRQkgICAweDhkCiAjZGVmaW5lIEJUVFZfQk9BUkRfU0FCUkVOVF9UVkZNICAgCSAgIDB4OGUKKyNkZWZpbmUgQlRUVl9CT0FSRF9IQVVQUEFVR0VfSU1QQUNUVkNCICAgICAweDhmCisjZGVmaW5lIEJUVFZfQk9BUkRfTUFDSFRWX01BR0lDVFYgICAgICAgICAgMHg5MAogCiAvKiBpMmMgYWRkcmVzcyBsaXN0ICovCiAjZGVmaW5lIEkyQ19UU0E1NTIyICAgICAgICAweGMyCkBAIC0yMTAsNiArMjE0LDM0IEBACiAKIHN0cnVjdCBidHR2OwogCisKK3N0cnVjdCBidHR2X2lyIHsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICAgICAgICAqZGV2OworCXN0cnVjdCBpcl9pbnB1dF9zdGF0ZSAgIGlyOworCWNoYXIgICAgICAgICAgICAgICAgICAgIG5hbWVbMzJdOworCWNoYXIgICAgICAgICAgICAgICAgICAgIHBoeXNbMzJdOworCisJLyogVXN1YWwgZ3BpbyBzaWduYWxsaW5nICovCisKKwl1MzIgICAgICAgICAgICAgICAgICAgICBtYXNrX2tleWNvZGU7CisJdTMyICAgICAgICAgICAgICAgICAgICAgbWFza19rZXlkb3duOworCXUzMiAgICAgICAgICAgICAgICAgICAgIG1hc2tfa2V5dXA7CisJdTMyICAgICAgICAgICAgICAgICAgICAgcG9sbGluZzsKKwl1MzIgICAgICAgICAgICAgICAgICAgICBsYXN0X2dwaW87CisJc3RydWN0IHdvcmtfc3RydWN0ICAgICAgd29yazsKKwlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgICB0aW1lcjsKKworCS8qIFJDNSBncGlvICovCisJdTMyIHJjNV9ncGlvOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyX2VuZDsJLyogdGltZXJfZW5kIGZvciBjb2RlIGNvbXBsZXRpb24gKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcl9rZXl1cDsJLyogdGltZXJfZW5kIGZvciBrZXkgcmVsZWFzZSAqLworCXUzMiBsYXN0X3JjNTsJCQkvKiBsYXN0IGdvb2QgcmM1IGNvZGUgKi8KKwl1MzIgbGFzdF9iaXQ7CQkJLyogbGFzdCByYXcgYml0IHNlZW4gKi8KKwl1MzIgY29kZTsJCQkvKiByYXcgY29kZSB1bmRlciBjb25zdHJ1Y3Rpb24gKi8KKwlzdHJ1Y3QgdGltZXZhbCBiYXNlX3RpbWU7CS8qIHRpbWUgb2YgbGFzdCBzZWVuIGNvZGUgKi8KKwlpbnQgYWN0aXZlOwkJCS8qIGJ1aWxkaW5nIHJhdyBjb2RlICovCit9OworCiBzdHJ1Y3QgdHZjYXJkCiB7CiAJY2hhciAqbmFtZTsKQEAgLTIzNSw3ICsyNjcsNiBAQAogCXVuc2lnbmVkIGludCBoYXNfZHZiOjE7CiAJdW5zaWduZWQgaW50IGhhc19yZW1vdGU6MTsKIAl1bnNpZ25lZCBpbnQgbm9fZ3Bpb2lycToxOwotCXVuc2lnbmVkIGludCBhbnlfaXJxOjE7CiAKIAkvKiBvdGhlciBzZXR0aW5ncyAqLwogCXVuc2lnbmVkIGludCBwbGw7CkBAIC0zMzQsOCArMzY1LDkgQEAKIHN0cnVjdCBidHR2X3N1Yl9kcml2ZXIgewogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICAgZHJ2OwogCWNoYXIgICAgICAgICAgICAgICAgICAgd2FudGVkW0JVU19JRF9TSVpFXTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICgqcHJvYmUpKHN0cnVjdCBidHR2X3N1Yl9kZXZpY2UgKnN1Yik7CisJdm9pZCAgICAgICAgICAgICAgICAgICAoKnJlbW92ZSkoc3RydWN0IGJ0dHZfc3ViX2RldmljZSAqc3ViKTsKIAl2b2lkICAgICAgICAgICAgICAgICAgICgqZ3Bpb19pcnEpKHN0cnVjdCBidHR2X3N1Yl9kZXZpY2UgKnN1Yik7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAoKmFueV9pcnEpKHN0cnVjdCBidHR2X3N1Yl9kZXZpY2UgKnN1Yik7CiB9OwogI2RlZmluZSB0b19idHR2X3N1Yl9kcnYoeCkgY29udGFpbmVyX29mKCh4KSwgc3RydWN0IGJ0dHZfc3ViX2RyaXZlciwgZHJ2KQogCkBAIC0zNjMsNiArMzk1LDEwIEBACiAJCQkgdW5zaWduZWQgY2hhciBiMiwgaW50IGJvdGgpOwogZXh0ZXJuIHZvaWQgYnR0dl9yZWFkZWUoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgY2hhciAqZWVkYXRhLCBpbnQgYWRkcik7CiAKK2V4dGVybiBpbnQgYnR0dl9pbnB1dF9pbml0KHN0cnVjdCBidHR2ICpkZXYpOworZXh0ZXJuIHZvaWQgYnR0dl9pbnB1dF9maW5pKHN0cnVjdCBidHR2ICpkZXYpOworZXh0ZXJuIHZvaWQgYnR0dl9pbnB1dF9pcnEoc3RydWN0IGJ0dHYgKmRldik7CisKICNlbmRpZiAvKiBfQlRUVl9IXyAqLwogLyoKICAqIExvY2FsIHZhcmlhYmxlczoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0dnAuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0dnAuaAppbmRleCAxZTZhNTYzLi45Y2I3MmYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHZwLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2cC5oCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKQEAgLTczLDYgKzc0LDggQEAKIAogI2RlZmluZSBVTlNFVCAoLTFVKQogCisjZGVmaW5lIGNsYW1wKHgsIGxvdywgaGlnaCkgbWluIChtYXggKGxvdywgeCksIGhpZ2gpCisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RydWN0IGJ0dHZfdHZub3JtIHsKQEAgLTg4LDYgKzkxLDkgQEAKIAl1OCAgICB2YmlwYWNrOwogCXUxNiAgIHZ0b3RhbDsKIAlpbnQgICBzcmFtOworCS8qIElUVS1SIGZyYW1lIGxpbmUgbnVtYmVyIG9mIHRoZSBmaXJzdCBWQkkgbGluZSB3ZSBjYW4KKwkgICBjYXB0dXJlLCBvZiB0aGUgZmlyc3QgYW5kIHNlY29uZCBmaWVsZC4gKi8KKwl1MTYgICB2YmlzdGFydFsyXTsKIH07CiBleHRlcm4gY29uc3Qgc3RydWN0IGJ0dHZfdHZub3JtIGJ0dHZfdHZub3Jtc1tdOwogCkBAIC0yMDksNyArMjE1LDYgQEAKIGludCBidHR2X3N1Yl9hZGRfZGV2aWNlKHN0cnVjdCBidHR2X2NvcmUgKmNvcmUsIGNoYXIgKm5hbWUpOwogaW50IGJ0dHZfc3ViX2RlbF9kZXZpY2VzKHN0cnVjdCBidHR2X2NvcmUgKmNvcmUpOwogdm9pZCBidHR2X2dwaW9faXJxKHN0cnVjdCBidHR2X2NvcmUgKmNvcmUpOwotaW50IGJ0dHZfYW55X2lycShzdHJ1Y3QgYnR0dl9jb3JlICpjb3JlKTsKIAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yNzAsMTIgKzI3NSwxMyBAQAogCS8qIGNhcmQgY29uZmlndXJhdGlvbiBpbmZvICovCiAJdW5zaWduZWQgaW50IGNhcmRpZDsgICAvKiBwY2kgc3Vic3lzdGVtIGlkIChidDg3OCBiYXNlZCBvbmVzKSAqLwogCXVuc2lnbmVkIGludCB0dW5lcl90eXBlOyAgLyogdHVuZXIgY2hpcCB0eXBlICovCi0JdW5zaWduZWQgaW50IHBpbm5hY2xlX2lkOworCXVuc2lnbmVkIGludCB0ZGE5ODg3X2NvbmY7CiAJdW5zaWduZWQgaW50IHN2aHM7CiAJc3RydWN0IGJ0dHZfcGxsX2luZm8gcGxsOwogCWludCB0cml0b24xOwogCWludCBncGlvaXJxOwotCWludCBhbnlfaXJxOworCWludCAoKmN1c3RvbV9pcnEpKHN0cnVjdCBidHR2ICpidHYpOworCiAJaW50IHVzZV9pMmNfaHc7CiAKIAkvKiBvbGQgZ3BpbyBpbnRlcmZhY2UgKi8KQEAgLTMwMCwxMyArMzA2LDEzIEBACiAKIAkvKiBpbmZyYXJlZCByZW1vdGUgKi8KIAlpbnQgaGFzX3JlbW90ZTsKLQlzdHJ1Y3QgYnR0dl9pbnB1dCAqcmVtb3RlOworCXN0cnVjdCBidHR2X2lyICpyZW1vdGU7CiAKIAkvKiBsb2NraW5nICovCiAJc3BpbmxvY2tfdCBzX2xvY2s7Ci0Jc3RydWN0IHNlbWFwaG9yZSBsb2NrOworCXN0cnVjdCBtdXRleCBsb2NrOwogCWludCByZXNvdXJjZXM7Ci0Jc3RydWN0IHNlbWFwaG9yZSByZXNsb2NrOworCXN0cnVjdCBtdXRleCByZXNsb2NrOwogI2lmZGVmIFZJRElPQ19HX1BSSU9SSVRZCiAJc3RydWN0IHY0bDJfcHJpb19zdGF0ZSBwcmlvOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J3LXFjYW0uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnctcWNhbS5jCmluZGV4IDAwNjVkMGMuLjZiYWQ5M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnctcWNhbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnctcWNhbS5jCkBAIC04NzUsNiArODc1LDcgQEAKIAkub3BlbiAgICAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfb3BlbiwKIAkucmVsZWFzZSAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfcmVsZWFzZSwKIAkuaW9jdGwgICAgICAgICAgPSBxY2FtX2lvY3RsLAorCS5jb21wYXRfaW9jdGwJPSB2NGxfY29tcGF0X2lvY3RsMzIsCiAJLnJlYWQJCT0gcWNhbV9yZWFkLAogCS5sbHNlZWsgICAgICAgICA9IG5vX2xsc2VlaywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2MtcWNhbS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jLXFjYW0uYwppbmRleCA3NTQ0MmVjLi45OTc2ZGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2MtcWNhbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYy1xY2FtLmMKQEAgLTY4Nyw2ICs2ODcsNyBAQAogCS5vcGVuICAgICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuLAogCS5yZWxlYXNlICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlLAogCS5pb2N0bCAgICAgICAgICA9IHFjYW1faW9jdGwsCisJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKIAkucmVhZAkJPSBxY2FtX3JlYWQsCiAJLmxsc2VlayAgICAgICAgID0gbm9fbGxzZWVrLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY29tcGF0X2lvY3RsMzIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY29tcGF0X2lvY3RsMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTdjMzJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jb21wYXRfaW9jdGwzMi5jCkBAIC0wLDAgKzEsODc5IEBACisvKgorICogaW9jdGwzMi5jOiBDb252ZXJzaW9uIGJldHdlZW4gMzJiaXQgYW5kIDY0Yml0IG5hdGl2ZSBpb2N0bHMuCisgKglTZXBhcmF0ZWQgZnJvbSBmcyBzdHVmZiBieSBBcm5kIEJlcmdtYW5uIDxhcm5kQGFybmRiLmRlPgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwICBKYWt1YiBKZWxpbmVrICAoamFrdWJAcmVkaGF0LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMTk5OCAgRWRkaWUgQy4gRG9zdCAgKGVjZEBza3luZXQuYmUpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiAgQW5kaSBLbGVlbiwgU3VTRSBMYWJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgICAgICAgUGF2ZWwgTWFjaGVrIChwYXZlbEBzdXNlLmN6KQorICogQ29weXJpZ2h0IChDKSAyMDA1ICAgICAgIFBoaWxpcHBlIERlIE11eXRlciAocGhkbUBtYWNxZWwuYmUpCisgKgorICogVGhlc2Ugcm91dGluZXMgbWFpbnRhaW4gYXJndW1lbnQgc2l6ZSBjb252ZXJzaW9uIGJldHdlZW4gMzJiaXQgYW5kIDY0Yml0CisgKiBpb2N0bHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCisKK3N0cnVjdCB2aWRlb190dW5lcjMyIHsKKwljb21wYXRfaW50X3QgdHVuZXI7CisJY2hhciBuYW1lWzMyXTsKKwljb21wYXRfdWxvbmdfdCByYW5nZWxvdywgcmFuZ2VoaWdoOworCXUzMiBmbGFnczsJLyogSXQgaXMgcmVhbGx5IHUzMiBpbiB2aWRlb2Rldi5oICovCisJdTE2IG1vZGUsIHNpZ25hbDsKK307CisKK3N0YXRpYyBpbnQgZ2V0X3ZpZGVvX3R1bmVyMzIoc3RydWN0IHZpZGVvX3R1bmVyICprcCwgc3RydWN0IHZpZGVvX3R1bmVyMzIgX191c2VyICp1cCkKK3sKKwlpZighYWNjZXNzX29rKFZFUklGWV9SRUFELCB1cCwgc2l6ZW9mKHN0cnVjdCB2aWRlb190dW5lcjMyKSkgfHwKKwkJZ2V0X3VzZXIoa3AtPnR1bmVyLCAmdXAtPnR1bmVyKSB8fAorCQljb3B5X2Zyb21fdXNlcihrcC0+bmFtZSwgdXAtPm5hbWUsIDMyKSB8fAorCQlnZXRfdXNlcihrcC0+cmFuZ2Vsb3csICZ1cC0+cmFuZ2Vsb3cpIHx8CisJCWdldF91c2VyKGtwLT5yYW5nZWhpZ2gsICZ1cC0+cmFuZ2VoaWdoKSB8fAorCQlnZXRfdXNlcihrcC0+ZmxhZ3MsICZ1cC0+ZmxhZ3MpIHx8CisJCWdldF91c2VyKGtwLT5tb2RlLCAmdXAtPm1vZGUpIHx8CisJCWdldF91c2VyKGtwLT5zaWduYWwsICZ1cC0+c2lnbmFsKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHV0X3ZpZGVvX3R1bmVyMzIoc3RydWN0IHZpZGVvX3R1bmVyICprcCwgc3RydWN0IHZpZGVvX3R1bmVyMzIgX191c2VyICp1cCkKK3sKKwlpZighYWNjZXNzX29rKFZFUklGWV9XUklURSwgdXAsIHNpemVvZihzdHJ1Y3QgdmlkZW9fdHVuZXIzMikpIHx8CisJCXB1dF91c2VyKGtwLT50dW5lciwgJnVwLT50dW5lcikgfHwKKwkJY29weV90b191c2VyKHVwLT5uYW1lLCBrcC0+bmFtZSwgMzIpIHx8CisJCXB1dF91c2VyKGtwLT5yYW5nZWxvdywgJnVwLT5yYW5nZWxvdykgfHwKKwkJcHV0X3VzZXIoa3AtPnJhbmdlaGlnaCwgJnVwLT5yYW5nZWhpZ2gpIHx8CisJCXB1dF91c2VyKGtwLT5mbGFncywgJnVwLT5mbGFncykgfHwKKwkJcHV0X3VzZXIoa3AtPm1vZGUsICZ1cC0+bW9kZSkgfHwKKwkJcHV0X3VzZXIoa3AtPnNpZ25hbCwgJnVwLT5zaWduYWwpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB2aWRlb19idWZmZXIzMiB7CisJY29tcGF0X2NhZGRyX3QgYmFzZTsKKwljb21wYXRfaW50X3QgaGVpZ2h0LCB3aWR0aCwgZGVwdGgsIGJ5dGVzcGVybGluZTsKK307CisKK3N0YXRpYyBpbnQgZ2V0X3ZpZGVvX2J1ZmZlcjMyKHN0cnVjdCB2aWRlb19idWZmZXIgKmtwLCBzdHJ1Y3QgdmlkZW9fYnVmZmVyMzIgX191c2VyICp1cCkKK3sKKwl1MzIgdG1wOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVwLCBzaXplb2Yoc3RydWN0IHZpZGVvX2J1ZmZlcjMyKSkgfHwKKwkJZ2V0X3VzZXIodG1wLCAmdXAtPmJhc2UpIHx8CisJCWdldF91c2VyKGtwLT5oZWlnaHQsICZ1cC0+aGVpZ2h0KSB8fAorCQlnZXRfdXNlcihrcC0+d2lkdGgsICZ1cC0+d2lkdGgpIHx8CisJCWdldF91c2VyKGtwLT5kZXB0aCwgJnVwLT5kZXB0aCkgfHwKKwkJZ2V0X3VzZXIoa3AtPmJ5dGVzcGVybGluZSwgJnVwLT5ieXRlc3BlcmxpbmUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBUaGlzIGlzIGFjdHVhbGx5IGEgcGh5c2ljYWwgYWRkcmVzcyBzdG9yZWQKKwkgKiBhcyBhIHZvaWQgcG9pbnRlci4KKwkgKi8KKwlrcC0+YmFzZSA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpIHRtcDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB1dF92aWRlb19idWZmZXIzMihzdHJ1Y3QgdmlkZW9fYnVmZmVyICprcCwgc3RydWN0IHZpZGVvX2J1ZmZlcjMyIF9fdXNlciAqdXApCit7CisJdTMyIHRtcCA9ICh1MzIpKCh1bnNpZ25lZCBsb25nKWtwLT5iYXNlKTsKKworCWlmKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1cCwgc2l6ZW9mKHN0cnVjdCB2aWRlb19idWZmZXIzMikpIHx8CisJCXB1dF91c2VyKHRtcCwgJnVwLT5iYXNlKSB8fAorCQlwdXRfdXNlcihrcC0+aGVpZ2h0LCAmdXAtPmhlaWdodCkgfHwKKwkJcHV0X3VzZXIoa3AtPndpZHRoLCAmdXAtPndpZHRoKSB8fAorCQlwdXRfdXNlcihrcC0+ZGVwdGgsICZ1cC0+ZGVwdGgpIHx8CisJCXB1dF91c2VyKGtwLT5ieXRlc3BlcmxpbmUsICZ1cC0+Ynl0ZXNwZXJsaW5lKSkKKwkJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgdmlkZW9fY2xpcDMyIHsKKwlzMzIgeCwgeSwgd2lkdGgsIGhlaWdodDsJLyogSXRzIHJlYWxseSBzMzIgaW4gdmlkZW9kZXYuaCAqLworCWNvbXBhdF9jYWRkcl90IG5leHQ7Cit9OworCitzdHJ1Y3QgdmlkZW9fd2luZG93MzIgeworCXUzMiB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjaHJvbWFrZXksIGZsYWdzOworCWNvbXBhdF9jYWRkcl90IGNsaXBzOworCWNvbXBhdF9pbnRfdCBjbGlwY291bnQ7Cit9OworCitzdGF0aWMgaW50IG5hdGl2ZV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJldCA9IC1FTk9JT0NUTENNRDsKKworCWlmIChmaWxlLT5mX29wLT51bmxvY2tlZF9pb2N0bCkKKwkJcmV0ID0gZmlsZS0+Zl9vcC0+dW5sb2NrZWRfaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCWVsc2UgaWYgKGZpbGUtPmZfb3AtPmlvY3RsKSB7CisJCWxvY2tfa2VybmVsKCk7CisJCXJldCA9IGZpbGUtPmZfb3AtPmlvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLCBjbWQsIGFyZyk7CisJCXVubG9ja19rZXJuZWwoKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qIFlvdSBnZXQgYmFjayBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgY2xpcHMuLi4gKi8KK3N0YXRpYyBpbnQgcHV0X3ZpZGVvX3dpbmRvdzMyKHN0cnVjdCB2aWRlb193aW5kb3cgKmtwLCBzdHJ1Y3QgdmlkZW9fd2luZG93MzIgX191c2VyICp1cCkKK3sKKwlpZighYWNjZXNzX29rKFZFUklGWV9XUklURSwgdXAsIHNpemVvZihzdHJ1Y3QgdmlkZW9fd2luZG93MzIpKSB8fAorCQlwdXRfdXNlcihrcC0+eCwgJnVwLT54KSB8fAorCQlwdXRfdXNlcihrcC0+eSwgJnVwLT55KSB8fAorCQlwdXRfdXNlcihrcC0+d2lkdGgsICZ1cC0+d2lkdGgpIHx8CisJCXB1dF91c2VyKGtwLT5oZWlnaHQsICZ1cC0+aGVpZ2h0KSB8fAorCQlwdXRfdXNlcihrcC0+Y2hyb21ha2V5LCAmdXAtPmNocm9tYWtleSkgfHwKKwkJcHV0X3VzZXIoa3AtPmZsYWdzLCAmdXAtPmZsYWdzKSB8fAorCQlwdXRfdXNlcihrcC0+Y2xpcGNvdW50LCAmdXAtPmNsaXBjb3VudCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHY0bDJfY2xpcDMyCit7CisJc3RydWN0IHY0bDJfcmVjdCAgICAgICAgYzsKKwljb21wYXRfY2FkZHJfdCAJCW5leHQ7Cit9OworCitzdHJ1Y3QgdjRsMl93aW5kb3czMgoreworCXN0cnVjdCB2NGwyX3JlY3QgICAgICAgIHc7CisJZW51bSB2NGwyX2ZpZWxkICAJZmllbGQ7CisJX191MzIJCQljaHJvbWFrZXk7CisJY29tcGF0X2NhZGRyX3QJCWNsaXBzOyAvKiBhY3R1YWxseSBzdHJ1Y3QgdjRsMl9jbGlwMzIgKiAqLworCV9fdTMyCQkJY2xpcGNvdW50OworCWNvbXBhdF9jYWRkcl90CQliaXRtYXA7Cit9OworCitzdGF0aWMgaW50IGdldF92NGwyX3dpbmRvdzMyKHN0cnVjdCB2NGwyX3dpbmRvdyAqa3AsIHN0cnVjdCB2NGwyX3dpbmRvdzMyIF9fdXNlciAqdXApCit7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfd2luZG93MzIpKSB8fAorCQljb3B5X2Zyb21fdXNlcigma3AtPncsICZ1cC0+dywgc2l6ZW9mKHVwLT53KSkgfHwKKwkJZ2V0X3VzZXIoa3AtPmZpZWxkLCAmdXAtPmZpZWxkKSB8fAorCQlnZXRfdXNlcihrcC0+Y2hyb21ha2V5LCAmdXAtPmNocm9tYWtleSkgfHwKKwkJZ2V0X3VzZXIoa3AtPmNsaXBjb3VudCwgJnVwLT5jbGlwY291bnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGtwLT5jbGlwY291bnQgPiAyMDQ4KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3AtPmNsaXBjb3VudCkgeworCQlzdHJ1Y3QgdjRsMl9jbGlwMzIgKnVjbGlwcyA9IGNvbXBhdF9wdHIodXAtPmNsaXBzKTsKKwkJc3RydWN0IHY0bDJfY2xpcCAqa2NsaXBzOworCQlpbnQgbiA9IGtwLT5jbGlwY291bnQ7CisKKwkJa2NsaXBzID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2UobiAqIHNpemVvZihzdHJ1Y3QgdjRsMl9jbGlwKSk7CisJCWtwLT5jbGlwcyA9IGtjbGlwczsKKwkJd2hpbGUgKC0tbiA+PSAwKSB7CisJCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgJnVjbGlwcy0+Yywgc2l6ZW9mKHVjbGlwcy0+YykpIHx8CisJCQkJY29weV9mcm9tX3VzZXIoJmtjbGlwcy0+YywgJnVjbGlwcy0+Yywgc2l6ZW9mKHVjbGlwcy0+YykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJa2NsaXBzLT5uZXh0ID0gbiA/IGtjbGlwcyArIDEgOiAwOworCQkJdWNsaXBzICs9IDE7CisJCQlrY2xpcHMgKz0gMTsKKwkJfQorCX0gZWxzZQorCQlrcC0+Y2xpcHMgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB1dF92NGwyX3dpbmRvdzMyKHN0cnVjdCB2NGwyX3dpbmRvdyAqa3AsIHN0cnVjdCB2NGwyX3dpbmRvdzMyIF9fdXNlciAqdXApCit7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3dpbmRvdzMyKSkgfHwKKwkJY29weV90b191c2VyKCZ1cC0+dywgJmtwLT53LCBzaXplb2YodXAtPncpKSB8fAorCQlwdXRfdXNlcihrcC0+ZmllbGQsICZ1cC0+ZmllbGQpIHx8CisJCXB1dF91c2VyKGtwLT5jaHJvbWFrZXksICZ1cC0+Y2hyb21ha2V5KSB8fAorCQlwdXRfdXNlcihrcC0+Y2xpcGNvdW50LCAmdXAtPmNsaXBjb3VudCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X3Y0bDJfcGl4X2Zvcm1hdChzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICprcCwgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBfX3VzZXIgKnVwKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQpKSB8fAorCQljb3B5X2Zyb21fdXNlcihrcCwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHV0X3Y0bDJfcGl4X2Zvcm1hdChzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICprcCwgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBfX3VzZXIgKnVwKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0KSkgfHwKKwkJY29weV90b191c2VyKHVwLCBrcCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfdjRsMl92YmlfZm9ybWF0KHN0cnVjdCB2NGwyX3ZiaV9mb3JtYXQgKmtwLCBzdHJ1Y3QgdjRsMl92YmlfZm9ybWF0IF9fdXNlciAqdXApCit7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfdmJpX2Zvcm1hdCkpIHx8CisJCWNvcHlfZnJvbV91c2VyKGtwLCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3ZiaV9mb3JtYXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBwdXRfdjRsMl92YmlfZm9ybWF0KHN0cnVjdCB2NGwyX3ZiaV9mb3JtYXQgKmtwLCBzdHJ1Y3QgdjRsMl92YmlfZm9ybWF0IF9fdXNlciAqdXApCit7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3ZiaV9mb3JtYXQpKSB8fAorCQljb3B5X3RvX3VzZXIodXAsIGtwLCBzaXplb2Yoc3RydWN0IHY0bDJfdmJpX2Zvcm1hdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB2NGwyX2Zvcm1hdDMyCit7CisJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7CisJdW5pb24KKwl7CisJCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQJcGl4OyAgLy8gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFCisJCXN0cnVjdCB2NGwyX3dpbmRvdzMyCXdpbjsgIC8vIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWQorCQlzdHJ1Y3QgdjRsMl92YmlfZm9ybWF0CXZiaTsgIC8vIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkUKKwkJX191OAlyYXdfZGF0YVsyMDBdOyAgICAgICAgLy8gdXNlci1kZWZpbmVkCisJfSBmbXQ7Cit9OworCitzdGF0aWMgaW50IGdldF92NGwyX2Zvcm1hdDMyKHN0cnVjdCB2NGwyX2Zvcm1hdCAqa3AsIHN0cnVjdCB2NGwyX2Zvcm1hdDMyIF9fdXNlciAqdXApCit7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfZm9ybWF0MzIpKSB8fAorCQkJZ2V0X3VzZXIoa3AtPnR5cGUsICZ1cC0+dHlwZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwlzd2l0Y2ggKGtwLT50eXBlKSB7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CisJCXJldHVybiBnZXRfdjRsMl9waXhfZm9ybWF0KCZrcC0+Zm10LnBpeCwgJnVwLT5mbXQucGl4KTsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKKwkJcmV0dXJuIGdldF92NGwyX3dpbmRvdzMyKCZrcC0+Zm10LndpbiwgJnVwLT5mbXQud2luKTsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6CisJCXJldHVybiBnZXRfdjRsMl92YmlfZm9ybWF0KCZrcC0+Zm10LnZiaSwgJnVwLT5mbXQudmJpKTsKKwlkZWZhdWx0OgorCQlwcmludGsoImNvbXBhdF9pb2N0bCA6IHVuZXhwZWN0ZWQgVklESU9DX0ZNVCB0eXBlICVkXG4iLAorCQkJCQkJCQlrcC0+dHlwZSk7CisJCXJldHVybiAtRU5YSU87CisJfQorfQorCitzdGF0aWMgaW50IHB1dF92NGwyX2Zvcm1hdDMyKHN0cnVjdCB2NGwyX2Zvcm1hdCAqa3AsIHN0cnVjdCB2NGwyX2Zvcm1hdDMyIF9fdXNlciAqdXApCit7CisJaWYoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfZm9ybWF0MzIpKSB8fAorCQlwdXRfdXNlcihrcC0+dHlwZSwgJnVwLT50eXBlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc3dpdGNoIChrcC0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQlyZXR1cm4gcHV0X3Y0bDJfcGl4X2Zvcm1hdCgma3AtPmZtdC5waXgsICZ1cC0+Zm10LnBpeCk7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJCXJldHVybiBwdXRfdjRsMl93aW5kb3czMigma3AtPmZtdC53aW4sICZ1cC0+Zm10Lndpbik7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOgorCQlyZXR1cm4gcHV0X3Y0bDJfdmJpX2Zvcm1hdCgma3AtPmZtdC52YmksICZ1cC0+Zm10LnZiaSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTlhJTzsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF92NGwyX3N0YW5kYXJkKHN0cnVjdCB2NGwyX3N0YW5kYXJkICprcCwgc3RydWN0IHY0bDJfc3RhbmRhcmQgX191c2VyICp1cCkKK3sKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9zdGFuZGFyZCkpIHx8CisJCWNvcHlfZnJvbV91c2VyKGtwLCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3N0YW5kYXJkKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW5saW5lIGludCBwdXRfdjRsMl9zdGFuZGFyZChzdHJ1Y3QgdjRsMl9zdGFuZGFyZCAqa3AsIHN0cnVjdCB2NGwyX3N0YW5kYXJkIF9fdXNlciAqdXApCit7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3N0YW5kYXJkKSkgfHwKKwkJY29weV90b191c2VyKHVwLCBrcCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3N0YW5kYXJkKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHY0bDJfc3RhbmRhcmQzMgoreworCV9fdTMyCQkgICAgIGluZGV4OworCV9fdTMyCQkgICAgIGlkWzJdOyAvKiBfX3U2NCB3b3VsZCBnZXQgdGhlIGFsaWdubWVudCB3cm9uZyAqLworCV9fdTgJCSAgICAgbmFtZVsyNF07CisJc3RydWN0IHY0bDJfZnJhY3QgICAgZnJhbWVwZXJpb2Q7IC8qIEZyYW1lcywgbm90IGZpZWxkcyAqLworCV9fdTMyCQkgICAgIGZyYW1lbGluZXM7CisJX191MzIJCSAgICAgcmVzZXJ2ZWRbNF07Cit9OworCitzdGF0aWMgaW50IGdldF92NGwyX3N0YW5kYXJkMzIoc3RydWN0IHY0bDJfc3RhbmRhcmQgKmtwLCBzdHJ1Y3QgdjRsMl9zdGFuZGFyZDMyIF9fdXNlciAqdXApCit7CisJLyogb3RoZXIgZmllbGRzIGFyZSBub3Qgc2V0IGJ5IHRoZSB1c2VyLCBub3IgdXNlZCBieSB0aGUgZHJpdmVyICovCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfc3RhbmRhcmQzMikpIHx8CisJCWdldF91c2VyKGtwLT5pbmRleCwgJnVwLT5pbmRleCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB1dF92NGwyX3N0YW5kYXJkMzIoc3RydWN0IHY0bDJfc3RhbmRhcmQgKmtwLCBzdHJ1Y3QgdjRsMl9zdGFuZGFyZDMyIF9fdXNlciAqdXApCit7CisJaWYoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfc3RhbmRhcmQzMikpIHx8CisJCXB1dF91c2VyKGtwLT5pbmRleCwgJnVwLT5pbmRleCkgfHwKKwkJY29weV90b191c2VyKHVwLT5pZCwgJmtwLT5pZCwgc2l6ZW9mKF9fdTY0KSkgfHwKKwkJY29weV90b191c2VyKHVwLT5uYW1lLCBrcC0+bmFtZSwgMjQpIHx8CisJCWNvcHlfdG9fdXNlcigmdXAtPmZyYW1lcGVyaW9kLCAma3AtPmZyYW1lcGVyaW9kLCBzaXplb2Yoa3AtPmZyYW1lcGVyaW9kKSkgfHwKKwkJcHV0X3VzZXIoa3AtPmZyYW1lbGluZXMsICZ1cC0+ZnJhbWVsaW5lcykgfHwKKwkJY29weV90b191c2VyKHVwLT5yZXNlcnZlZCwga3AtPnJlc2VydmVkLCA0ICogc2l6ZW9mKF9fdTMyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X3Y0bDJfdHVuZXIoc3RydWN0IHY0bDJfdHVuZXIgKmtwLCBzdHJ1Y3QgdjRsMl90dW5lciBfX3VzZXIgKnVwKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3R1bmVyKSkgfHwKKwkJY29weV9mcm9tX3VzZXIoa3AsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfdHVuZXIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHB1dF92NGwyX3R1bmVyKHN0cnVjdCB2NGwyX3R1bmVyICprcCwgc3RydWN0IHY0bDJfdHVuZXIgX191c2VyICp1cCkKK3sKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfdHVuZXIpKSB8fAorCQljb3B5X3RvX3VzZXIodXAsIGtwLCBzaXplb2Yoc3RydWN0IHY0bDJfdHVuZXIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgdjRsMl9idWZmZXIzMgoreworCV9fdTMyCQkJaW5kZXg7CisJZW51bSB2NGwyX2J1Zl90eXBlICAgICAgdHlwZTsKKwlfX3UzMgkJCWJ5dGVzdXNlZDsKKwlfX3UzMgkJCWZsYWdzOworCWVudW0gdjRsMl9maWVsZAkJZmllbGQ7CisJc3RydWN0IGNvbXBhdF90aW1ldmFsCXRpbWVzdGFtcDsKKwlzdHJ1Y3QgdjRsMl90aW1lY29kZQl0aW1lY29kZTsKKwlfX3UzMgkJCXNlcXVlbmNlOworCisJLyogbWVtb3J5IGxvY2F0aW9uICovCisJZW51bSB2NGwyX21lbW9yeSAgICAgICAgbWVtb3J5OworCXVuaW9uIHsKKwkJX191MzIgICAgICAgICAgIG9mZnNldDsKKwkJY29tcGF0X2xvbmdfdCAgIHVzZXJwdHI7CisJfSBtOworCV9fdTMyCQkJbGVuZ3RoOworCV9fdTMyCQkJaW5wdXQ7CisJX191MzIJCQlyZXNlcnZlZDsKK307CisKK3N0YXRpYyBpbnQgZ2V0X3Y0bDJfYnVmZmVyMzIoc3RydWN0IHY0bDJfYnVmZmVyICprcCwgc3RydWN0IHY0bDJfYnVmZmVyMzIgX191c2VyICp1cCkKK3sKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2J1ZmZlcjMyKSkgfHwKKwkJZ2V0X3VzZXIoa3AtPmluZGV4LCAmdXAtPmluZGV4KSB8fAorCQlnZXRfdXNlcihrcC0+dHlwZSwgJnVwLT50eXBlKSB8fAorCQlnZXRfdXNlcihrcC0+ZmxhZ3MsICZ1cC0+ZmxhZ3MpIHx8CisJCWdldF91c2VyKGtwLT5tZW1vcnksICZ1cC0+bWVtb3J5KSB8fAorCQlnZXRfdXNlcihrcC0+aW5wdXQsICZ1cC0+aW5wdXQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJc3dpdGNoKGtwLT5tZW1vcnkpIHsKKwljYXNlIFY0TDJfTUVNT1JZX01NQVA6CisJCWJyZWFrOworCWNhc2UgVjRMMl9NRU1PUllfVVNFUlBUUjoKKwkJeworCQl1bnNpZ25lZCBsb25nIHRtcCA9ICh1bnNpZ25lZCBsb25nKWNvbXBhdF9wdHIodXAtPm0udXNlcnB0cik7CisKKwkJaWYoZ2V0X3VzZXIoa3AtPmxlbmd0aCwgJnVwLT5sZW5ndGgpIHx8CisJCQlnZXRfdXNlcihrcC0+bS51c2VycHRyLCAmdG1wKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKwljYXNlIFY0TDJfTUVNT1JZX09WRVJMQVk6CisJCWlmKGdldF91c2VyKGtwLT5tLm9mZnNldCwgJnVwLT5tLm9mZnNldCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB1dF92NGwyX2J1ZmZlcjMyKHN0cnVjdCB2NGwyX2J1ZmZlciAqa3AsIHN0cnVjdCB2NGwyX2J1ZmZlcjMyIF9fdXNlciAqdXApCit7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2J1ZmZlcjMyKSkgfHwKKwkJcHV0X3VzZXIoa3AtPmluZGV4LCAmdXAtPmluZGV4KSB8fAorCQlwdXRfdXNlcihrcC0+dHlwZSwgJnVwLT50eXBlKSB8fAorCQlwdXRfdXNlcihrcC0+ZmxhZ3MsICZ1cC0+ZmxhZ3MpIHx8CisJCXB1dF91c2VyKGtwLT5tZW1vcnksICZ1cC0+bWVtb3J5KSB8fAorCQlwdXRfdXNlcihrcC0+aW5wdXQsICZ1cC0+aW5wdXQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJc3dpdGNoKGtwLT5tZW1vcnkpIHsKKwljYXNlIFY0TDJfTUVNT1JZX01NQVA6CisJCWlmIChwdXRfdXNlcihrcC0+bGVuZ3RoLCAmdXAtPmxlbmd0aCkgfHwKKwkJCXB1dF91c2VyKGtwLT5tLm9mZnNldCwgJnVwLT5tLm9mZnNldCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX01FTU9SWV9VU0VSUFRSOgorCQlpZiAocHV0X3VzZXIoa3AtPmxlbmd0aCwgJnVwLT5sZW5ndGgpIHx8CisJCQlwdXRfdXNlcihrcC0+bS51c2VycHRyLCAmdXAtPm0udXNlcnB0cikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX01FTU9SWV9PVkVSTEFZOgorCQlpZiAocHV0X3VzZXIoa3AtPm0ub2Zmc2V0LCAmdXAtPm0ub2Zmc2V0KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwl9CisJaWYgKHB1dF91c2VyKGtwLT5ieXRlc3VzZWQsICZ1cC0+Ynl0ZXN1c2VkKSB8fAorCQlwdXRfdXNlcihrcC0+ZmllbGQsICZ1cC0+ZmllbGQpIHx8CisJCXB1dF91c2VyKGtwLT50aW1lc3RhbXAudHZfc2VjLCAmdXAtPnRpbWVzdGFtcC50dl9zZWMpIHx8CisJCXB1dF91c2VyKGtwLT50aW1lc3RhbXAudHZfdXNlYywgJnVwLT50aW1lc3RhbXAudHZfdXNlYykgfHwKKwkJY29weV90b191c2VyKCZ1cC0+dGltZWNvZGUsICZrcC0+dGltZWNvZGUsIHNpemVvZihzdHJ1Y3QgdjRsMl90aW1lY29kZSkpIHx8CisJCXB1dF91c2VyKGtwLT5zZXF1ZW5jZSwgJnVwLT5zZXF1ZW5jZSkgfHwKKwkJcHV0X3VzZXIoa3AtPnJlc2VydmVkLCAmdXAtPnJlc2VydmVkKSkKKwkJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlcjMyCit7CisJX191MzIJCQljYXBhYmlsaXR5OworCV9fdTMyCQkJZmxhZ3M7CisJY29tcGF0X2NhZGRyX3QgCQliYXNlOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQJZm10OworfTsKKworc3RhdGljIGludCBnZXRfdjRsMl9mcmFtZWJ1ZmZlcjMyKHN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICprcCwgc3RydWN0IHY0bDJfZnJhbWVidWZmZXIzMiBfX3VzZXIgKnVwKQoreworCXUzMiB0bXA7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlcjMyKSkgfHwKKwkJZ2V0X3VzZXIodG1wLCAmdXAtPmJhc2UpIHx8CisJCWdldF91c2VyKGtwLT5jYXBhYmlsaXR5LCAmdXAtPmNhcGFiaWxpdHkpIHx8CisJCWdldF91c2VyKGtwLT5mbGFncywgJnVwLT5mbGFncykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwlrcC0+YmFzZSA9IGNvbXBhdF9wdHIodG1wKTsKKwlnZXRfdjRsMl9waXhfZm9ybWF0KCZrcC0+Zm10LCAmdXAtPmZtdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHV0X3Y0bDJfZnJhbWVidWZmZXIzMihzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqa3AsIHN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyMzIgX191c2VyICp1cCkKK3sKKwl1MzIgdG1wID0gKHUzMikoKHVuc2lnbmVkIGxvbmcpa3AtPmJhc2UpOworCisJaWYoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfZnJhbWVidWZmZXIzMikpIHx8CisJCXB1dF91c2VyKHRtcCwgJnVwLT5iYXNlKSB8fAorCQlwdXRfdXNlcihrcC0+Y2FwYWJpbGl0eSwgJnVwLT5jYXBhYmlsaXR5KSB8fAorCQlwdXRfdXNlcihrcC0+ZmxhZ3MsICZ1cC0+ZmxhZ3MpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJcHV0X3Y0bDJfcGl4X2Zvcm1hdCgma3AtPmZtdCwgJnVwLT5mbXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfdjRsMl9pbnB1dDMyKHN0cnVjdCB2NGwyX2lucHV0ICprcCwgc3RydWN0IHY0bDJfaW5wdXQgX191c2VyICp1cCkKK3sKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9pbnB1dCkgLSA0KSB8fAorCQljb3B5X2Zyb21fdXNlcihrcCwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9pbnB1dCkgLSA0KSkKKwkJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBwdXRfdjRsMl9pbnB1dDMyKHN0cnVjdCB2NGwyX2lucHV0ICprcCwgc3RydWN0IHY0bDJfaW5wdXQgX191c2VyICp1cCkKK3sKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfaW5wdXQpIC0gNCkgfHwKKwkJY29weV90b191c2VyKHVwLCBrcCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2lucHV0KSAtIDQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF92NGwyX2lucHV0KHN0cnVjdCB2NGwyX2lucHV0ICprcCwgc3RydWN0IHY0bDJfaW5wdXQgX191c2VyICp1cCkKK3sKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9pbnB1dCkpIHx8CisJCWNvcHlfZnJvbV91c2VyKGtwLCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2lucHV0KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHV0X3Y0bDJfaW5wdXQoc3RydWN0IHY0bDJfaW5wdXQgKmtwLCBzdHJ1Y3QgdjRsMl9pbnB1dCBfX3VzZXIgKnVwKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9pbnB1dCkpIHx8CisJCWNvcHlfdG9fdXNlcih1cCwga3AsIHNpemVvZihzdHJ1Y3QgdjRsMl9pbnB1dCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgVklESU9DR1RVTkVSMzIJCV9JT1dSKCd2Jyw0LCBzdHJ1Y3QgdmlkZW9fdHVuZXIzMikKKyNkZWZpbmUgVklESU9DU1RVTkVSMzIJCV9JT1coJ3YnLDUsIHN0cnVjdCB2aWRlb190dW5lcjMyKQorI2RlZmluZSBWSURJT0NHV0lOMzIJCV9JT1IoJ3YnLDksIHN0cnVjdCB2aWRlb193aW5kb3czMikKKyNkZWZpbmUgVklESU9DU1dJTjMyCQlfSU9XKCd2JywxMCwgc3RydWN0IHZpZGVvX3dpbmRvdzMyKQorI2RlZmluZSBWSURJT0NHRkJVRjMyCQlfSU9SKCd2JywxMSwgc3RydWN0IHZpZGVvX2J1ZmZlcjMyKQorI2RlZmluZSBWSURJT0NTRkJVRjMyCQlfSU9XKCd2JywxMiwgc3RydWN0IHZpZGVvX2J1ZmZlcjMyKQorI2RlZmluZSBWSURJT0NHRlJFUTMyCQlfSU9SKCd2JywxNCwgdTMyKQorI2RlZmluZSBWSURJT0NTRlJFUTMyCQlfSU9XKCd2JywxNSwgdTMyKQorCisvKiBWSURJT0NfRU5VTUlOUFVUMzIgaXMgVklESU9DX0VOVU1JTlBVVCBtaW51cyA0IGJ5dGVzIG9mIHBhZGRpbmcgYWxpZ25lbWVudCAqLworI2RlZmluZSBWSURJT0NfRU5VTUlOUFVUMzIJVklESU9DX0VOVU1JTlBVVCAtIF9JT0MoMCwgMCwgMCwgNCkKKyNkZWZpbmUgVklESU9DX0dfRk1UMzIJCV9JT1dSICgnVicsICA0LCBzdHJ1Y3QgdjRsMl9mb3JtYXQzMikKKyNkZWZpbmUgVklESU9DX1NfRk1UMzIJCV9JT1dSICgnVicsICA1LCBzdHJ1Y3QgdjRsMl9mb3JtYXQzMikKKyNkZWZpbmUgVklESU9DX1FVRVJZQlVGMzIJX0lPV1IgKCdWJywgIDksIHN0cnVjdCB2NGwyX2J1ZmZlcjMyKQorI2RlZmluZSBWSURJT0NfR19GQlVGMzIJCV9JT1IgICgnVicsIDEwLCBzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlcjMyKQorI2RlZmluZSBWSURJT0NfU19GQlVGMzIJCV9JT1cgICgnVicsIDExLCBzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlcjMyKQorLyogVklESU9DX09WRVJMQVkgaXMgbm93IF9JT1csIGJ1dCB3YXMgX0lPV1IgKi8KKyNkZWZpbmUgVklESU9DX09WRVJMQVkzMglfSU9XUiAoJ1YnLCAxNCwgY29tcGF0X2ludF90KQorI2RlZmluZSBWSURJT0NfUUJVRjMyCQlfSU9XUiAoJ1YnLCAxNSwgc3RydWN0IHY0bDJfYnVmZmVyMzIpCisjZGVmaW5lIFZJRElPQ19EUUJVRjMyCQlfSU9XUiAoJ1YnLCAxNywgc3RydWN0IHY0bDJfYnVmZmVyMzIpCisjZGVmaW5lIFZJRElPQ19TVFJFQU1PTjMyCV9JT1cgICgnVicsIDE4LCBjb21wYXRfaW50X3QpCisjZGVmaW5lIFZJRElPQ19TVFJFQU1PRkYzMglfSU9XICAoJ1YnLCAxOSwgY29tcGF0X2ludF90KQorI2RlZmluZSBWSURJT0NfRU5VTVNURDMyCV9JT1dSICgnVicsIDI1LCBzdHJ1Y3QgdjRsMl9zdGFuZGFyZDMyKQorLyogVklESU9DX1NfQ1RSTCBpcyBub3cgX0lPV1IsIGJ1dCB3YXMgX0lPVyAqLworI2RlZmluZSBWSURJT0NfU19DVFJMMzIJCV9JT1cgICgnVicsIDI4LCBzdHJ1Y3QgdjRsMl9jb250cm9sKQorI2RlZmluZSBWSURJT0NfR19JTlBVVDMyCV9JT1IgICgnVicsIDM4LCBjb21wYXRfaW50X3QpCisjZGVmaW5lIFZJRElPQ19TX0lOUFVUMzIJX0lPV1IgKCdWJywgMzksIGNvbXBhdF9pbnRfdCkKKyNkZWZpbmUgVklESU9DX1RSWV9GTVQzMiAgICAgIAlfSU9XUiAoJ1YnLCA2NCwgc3RydWN0IHY0bDJfZm9ybWF0MzIpCisKK2VudW0geworCU1heENsaXBzID0gKH4wVS1zaXplb2Yoc3RydWN0IHZpZGVvX3dpbmRvdykpL3NpemVvZihzdHJ1Y3QgdmlkZW9fY2xpcCkKK307CisKK3N0YXRpYyBpbnQgZG9fc2V0X3dpbmRvdyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHZpZGVvX3dpbmRvdzMyIF9fdXNlciAqdXAgPSBjb21wYXRfcHRyKGFyZyk7CisJc3RydWN0IHZpZGVvX3dpbmRvdyBfX3VzZXIgKnZ3OworCXN0cnVjdCB2aWRlb19jbGlwIF9fdXNlciAqcDsKKwlpbnQgbmNsaXBzOworCXUzMiBuOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVwLCBzaXplb2Yoc3RydWN0IHZpZGVvX3dpbmRvdzMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGdldF91c2VyKG5jbGlwcywgJnVwLT5jbGlwY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIFBlY3VsaWFyIGludGVyZmFjZS4uLiAqLworCWlmIChuY2xpcHMgPCAwKQorCQluY2xpcHMgPSBWSURFT19DTElQTUFQX1NJWkU7CisKKwlpZiAobmNsaXBzID4gTWF4Q2xpcHMpCisJCXJldHVybiAtRU5PTUVNOworCisJdncgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2Yoc3RydWN0IHZpZGVvX3dpbmRvdykgKworCQkJCSAgICBuY2xpcHMgKiBzaXplb2Yoc3RydWN0IHZpZGVvX2NsaXApKTsKKworCXAgPSBuY2xpcHMgPyAoc3RydWN0IHZpZGVvX2NsaXAgX191c2VyICopKHZ3ICsgMSkgOiBOVUxMOworCisJaWYgKGdldF91c2VyKG4sICZ1cC0+eCkgfHwgcHV0X3VzZXIobiwgJnZ3LT54KSB8fAorCSAgICBnZXRfdXNlcihuLCAmdXAtPnkpIHx8IHB1dF91c2VyKG4sICZ2dy0+eSkgfHwKKwkgICAgZ2V0X3VzZXIobiwgJnVwLT53aWR0aCkgfHwgcHV0X3VzZXIobiwgJnZ3LT53aWR0aCkgfHwKKwkgICAgZ2V0X3VzZXIobiwgJnVwLT5oZWlnaHQpIHx8IHB1dF91c2VyKG4sICZ2dy0+aGVpZ2h0KSB8fAorCSAgICBnZXRfdXNlcihuLCAmdXAtPmNocm9tYWtleSkgfHwgcHV0X3VzZXIobiwgJnZ3LT5jaHJvbWFrZXkpIHx8CisJICAgIGdldF91c2VyKG4sICZ1cC0+ZmxhZ3MpIHx8IHB1dF91c2VyKG4sICZ2dy0+ZmxhZ3MpIHx8CisJICAgIGdldF91c2VyKG4sICZ1cC0+Y2xpcGNvdW50KSB8fCBwdXRfdXNlcihuLCAmdnctPmNsaXBjb3VudCkgfHwKKwkgICAgZ2V0X3VzZXIobiwgJnVwLT5jbGlwcykgfHwgcHV0X3VzZXIocCwgJnZ3LT5jbGlwcykpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKG5jbGlwcykgeworCQlzdHJ1Y3QgdmlkZW9fY2xpcDMyIF9fdXNlciAqdSA9IGNvbXBhdF9wdHIobik7CisJCWludCBpOworCQlpZiAoIXUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZm9yIChpID0gMDsgaSA8IG5jbGlwczsgaSsrLCB1KyssIHArKykgeworCQkJczMyIHY7CisJCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdSwgc2l6ZW9mKHN0cnVjdCB2aWRlb19jbGlwMzIpKSB8fAorCQkJICAgICFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBwLCBzaXplb2Yoc3RydWN0IHZpZGVvX2NsaXAzMikpIHx8CisJCQkgICAgZ2V0X3VzZXIodiwgJnUtPngpIHx8CisJCQkgICAgcHV0X3VzZXIodiwgJnAtPngpIHx8CisJCQkgICAgZ2V0X3VzZXIodiwgJnUtPnkpIHx8CisJCQkgICAgcHV0X3VzZXIodiwgJnAtPnkpIHx8CisJCQkgICAgZ2V0X3VzZXIodiwgJnUtPndpZHRoKSB8fAorCQkJICAgIHB1dF91c2VyKHYsICZwLT53aWR0aCkgfHwKKwkJCSAgICBnZXRfdXNlcih2LCAmdS0+aGVpZ2h0KSB8fAorCQkJICAgIHB1dF91c2VyKHYsICZwLT5oZWlnaHQpIHx8CisJCQkgICAgcHV0X3VzZXIoTlVMTCwgJnAtPm5leHQpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCisJcmV0dXJuIG5hdGl2ZV9pb2N0bChmaWxlLCBWSURJT0NTV0lOLCAodW5zaWduZWQgbG9uZyl2dyk7Cit9CisKK3N0YXRpYyBpbnQgZG9fdmlkZW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuaW9uIHsKKwkJc3RydWN0IHZpZGVvX3R1bmVyIHZ0OworCQlzdHJ1Y3QgdmlkZW9fYnVmZmVyIHZiOworCQlzdHJ1Y3QgdmlkZW9fd2luZG93IHZ3OworCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgdjJmOworCQlzdHJ1Y3QgdjRsMl9idWZmZXIgdjJiOworCQlzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciB2MmZiOworCQlzdHJ1Y3QgdjRsMl9zdGFuZGFyZCB2MnM7CisJCXN0cnVjdCB2NGwyX2lucHV0IHYyaTsKKwkJc3RydWN0IHY0bDJfdHVuZXIgdjJ0OworCQl1bnNpZ25lZCBsb25nIHZ4OworCX0ga2FyZzsKKwl2b2lkIF9fdXNlciAqdXAgPSBjb21wYXRfcHRyKGFyZyk7CisJaW50IGNvbXBhdGlibGVfYXJnID0gMTsKKwlpbnQgZXJyID0gMDsKKwlpbnQgcmVhbGNtZCA9IGNtZDsKKworCS8qIEZpcnN0LCBjb252ZXJ0IHRoZSBjb21tYW5kLiAqLworCXN3aXRjaChjbWQpIHsKKwljYXNlIFZJRElPQ0dUVU5FUjMyOiBjbWQgPSBWSURJT0NHVFVORVI7IGJyZWFrOworCWNhc2UgVklESU9DU1RVTkVSMzI6IGNtZCA9IFZJRElPQ1NUVU5FUjsgYnJlYWs7CisJY2FzZSBWSURJT0NHV0lOMzI6IGNtZCA9IFZJRElPQ0dXSU47IGJyZWFrOworCWNhc2UgVklESU9DR0ZCVUYzMjogY21kID0gVklESU9DR0ZCVUY7IGJyZWFrOworCWNhc2UgVklESU9DU0ZCVUYzMjogY21kID0gVklESU9DU0ZCVUY7IGJyZWFrOworCWNhc2UgVklESU9DR0ZSRVEzMjogY21kID0gVklESU9DR0ZSRVE7IGJyZWFrOworCWNhc2UgVklESU9DU0ZSRVEzMjogY21kID0gVklESU9DU0ZSRVE7IGJyZWFrOworCWNhc2UgVklESU9DX0dfRk1UMzI6IGNtZCA9IFZJRElPQ19HX0ZNVDsgYnJlYWs7CisJY2FzZSBWSURJT0NfU19GTVQzMjogY21kID0gVklESU9DX1NfRk1UOyBicmVhazsKKwljYXNlIFZJRElPQ19RVUVSWUJVRjMyOiBjbWQgPSBWSURJT0NfUVVFUllCVUY7IGJyZWFrOworCWNhc2UgVklESU9DX1FCVUYzMjogY21kID0gVklESU9DX1FCVUY7IGJyZWFrOworCWNhc2UgVklESU9DX0RRQlVGMzI6IGNtZCA9IFZJRElPQ19EUUJVRjsgYnJlYWs7CisJY2FzZSBWSURJT0NfU1RSRUFNT04zMjogY21kID0gVklESU9DX1NUUkVBTU9OOyBicmVhazsKKwljYXNlIFZJRElPQ19TVFJFQU1PRkYzMjogY21kID0gVklESU9DX1NUUkVBTU9GRjsgYnJlYWs7CisJY2FzZSBWSURJT0NfR19GQlVGMzI6IGNtZCA9IFZJRElPQ19HX0ZCVUY7IGJyZWFrOworCWNhc2UgVklESU9DX1NfRkJVRjMyOiBjbWQgPSBWSURJT0NfU19GQlVGOyBicmVhazsKKwljYXNlIFZJRElPQ19PVkVSTEFZMzI6IGNtZCA9IFZJRElPQ19PVkVSTEFZOyBicmVhazsKKwljYXNlIFZJRElPQ19FTlVNU1REMzI6IHJlYWxjbWQgPSBWSURJT0NfRU5VTVNURDsgYnJlYWs7CisJY2FzZSBWSURJT0NfRU5VTUlOUFVUMzI6IHJlYWxjbWQgPSBWSURJT0NfRU5VTUlOUFVUOyBicmVhazsKKwljYXNlIFZJRElPQ19TX0NUUkwzMjogY21kID0gVklESU9DX1NfQ1RSTDsgYnJlYWs7CisJY2FzZSBWSURJT0NfR19JTlBVVDMyOiBjbWQgPSBWSURJT0NfR19JTlBVVDsgYnJlYWs7CisJY2FzZSBWSURJT0NfU19JTlBVVDMyOiBjbWQgPSBWSURJT0NfU19JTlBVVDsgYnJlYWs7CisJY2FzZSBWSURJT0NfVFJZX0ZNVDMyOiBjbWQgPSBWSURJT0NfVFJZX0ZNVDsgYnJlYWs7CisJfTsKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIFZJRElPQ1NUVU5FUjoKKwljYXNlIFZJRElPQ0dUVU5FUjoKKwkJZXJyID0gZ2V0X3ZpZGVvX3R1bmVyMzIoJmthcmcudnQsIHVwKTsKKwkJY29tcGF0aWJsZV9hcmcgPSAwOworCisJCWJyZWFrOworCisJY2FzZSBWSURJT0NTRkJVRjoKKwkJZXJyID0gZ2V0X3ZpZGVvX2J1ZmZlcjMyKCZrYXJnLnZiLCB1cCk7CisJCWNvbXBhdGlibGVfYXJnID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ1NGUkVROgorCWNhc2UgVklESU9DX1NfSU5QVVQ6CisJY2FzZSBWSURJT0NfT1ZFUkxBWToKKwljYXNlIFZJRElPQ19TVFJFQU1PTjoKKwljYXNlIFZJRElPQ19TVFJFQU1PRkY6CisJCWVyciA9IGdldF91c2VyKGthcmcudngsICh1MzIgX191c2VyICopdXApOworCQljb21wYXRpYmxlX2FyZyA9IDA7CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfU19GQlVGOgorCQllcnIgPSBnZXRfdjRsMl9mcmFtZWJ1ZmZlcjMyKCZrYXJnLnYyZmIsIHVwKTsKKwkJY29tcGF0aWJsZV9hcmcgPSAwOworCQlicmVhazsKKworCWNhc2UgVklESU9DX0dfRk1UOgorCWNhc2UgVklESU9DX1NfRk1UOgorCWNhc2UgVklESU9DX1RSWV9GTVQ6CisJCWVyciA9IGdldF92NGwyX2Zvcm1hdDMyKCZrYXJnLnYyZiwgdXApOworCQljb21wYXRpYmxlX2FyZyA9IDA7CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfUVVFUllCVUY6CisJY2FzZSBWSURJT0NfUUJVRjoKKwljYXNlIFZJRElPQ19EUUJVRjoKKwkJZXJyID0gZ2V0X3Y0bDJfYnVmZmVyMzIoJmthcmcudjJiLCB1cCk7CisJCWNvbXBhdGlibGVfYXJnID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19FTlVNU1REOgorCQllcnIgPSBnZXRfdjRsMl9zdGFuZGFyZCgma2FyZy52MnMsIHVwKTsKKwkJY29tcGF0aWJsZV9hcmcgPSAwOworCQlicmVhazsKKworCWNhc2UgVklESU9DX0VOVU1TVEQzMjoKKwkJZXJyID0gZ2V0X3Y0bDJfc3RhbmRhcmQzMigma2FyZy52MnMsIHVwKTsKKwkJY29tcGF0aWJsZV9hcmcgPSAwOworCQlicmVhazsKKworCWNhc2UgVklESU9DX0VOVU1JTlBVVDoKKwkJZXJyID0gZ2V0X3Y0bDJfaW5wdXQoJmthcmcudjJpLCB1cCk7CisJCWNvbXBhdGlibGVfYXJnID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19FTlVNSU5QVVQzMjoKKwkJZXJyID0gZ2V0X3Y0bDJfaW5wdXQzMigma2FyZy52MmksIHVwKTsKKwkJY29tcGF0aWJsZV9hcmcgPSAwOworCQlicmVhazsKKworCWNhc2UgVklESU9DX0dfVFVORVI6CisJY2FzZSBWSURJT0NfU19UVU5FUjoKKwkJZXJyID0gZ2V0X3Y0bDJfdHVuZXIoJmthcmcudjJ0LCB1cCk7CisJCWNvbXBhdGlibGVfYXJnID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ0dXSU46CisJY2FzZSBWSURJT0NHRkJVRjoKKwljYXNlIFZJRElPQ0dGUkVROgorCWNhc2UgVklESU9DX0dfRkJVRjoKKwljYXNlIFZJRElPQ19HX0lOUFVUOgorCQljb21wYXRpYmxlX2FyZyA9IDA7CisJfTsKKworCWlmKGVycikKKwkJZ290byBvdXQ7CisKKwlpZihjb21wYXRpYmxlX2FyZykKKwkJZXJyID0gbmF0aXZlX2lvY3RsKGZpbGUsIHJlYWxjbWQsICh1bnNpZ25lZCBsb25nKXVwKTsKKwllbHNlIHsKKwkJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOworCisJCXNldF9mcyhLRVJORUxfRFMpOworCQllcnIgPSBuYXRpdmVfaW9jdGwoZmlsZSwgcmVhbGNtZCwgKHVuc2lnbmVkIGxvbmcpJmthcmcpOworCQlzZXRfZnMob2xkX2ZzKTsKKwl9CisJaWYoZXJyID09IDApIHsKKwkJc3dpdGNoKGNtZCkgeworCQljYXNlIFZJRElPQ0dUVU5FUjoKKwkJCWVyciA9IHB1dF92aWRlb190dW5lcjMyKCZrYXJnLnZ0LCB1cCk7CisJCQlicmVhazsKKworCQljYXNlIFZJRElPQ0dXSU46CisJCQllcnIgPSBwdXRfdmlkZW9fd2luZG93MzIoJmthcmcudncsIHVwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVklESU9DR0ZCVUY6CisJCQllcnIgPSBwdXRfdmlkZW9fYnVmZmVyMzIoJmthcmcudmIsIHVwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVklESU9DX0dfRkJVRjoKKwkJCWVyciA9IHB1dF92NGwyX2ZyYW1lYnVmZmVyMzIoJmthcmcudjJmYiwgdXApOworCQkJYnJlYWs7CisKKwkJY2FzZSBWSURJT0NfR19GTVQ6CisJCWNhc2UgVklESU9DX1NfRk1UOgorCQljYXNlIFZJRElPQ19UUllfRk1UOgorCQkJZXJyID0gcHV0X3Y0bDJfZm9ybWF0MzIoJmthcmcudjJmLCB1cCk7CisJCQlicmVhazsKKworCQljYXNlIFZJRElPQ19RVUVSWUJVRjoKKwkJY2FzZSBWSURJT0NfUUJVRjoKKwkJY2FzZSBWSURJT0NfRFFCVUY6CisJCQllcnIgPSBwdXRfdjRsMl9idWZmZXIzMigma2FyZy52MmIsIHVwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVklESU9DX0VOVU1TVEQ6CisJCQllcnIgPSBwdXRfdjRsMl9zdGFuZGFyZCgma2FyZy52MnMsIHVwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVklESU9DX0VOVU1TVEQzMjoKKwkJCWVyciA9IHB1dF92NGwyX3N0YW5kYXJkMzIoJmthcmcudjJzLCB1cCk7CisJCQlicmVhazsKKworCQljYXNlIFZJRElPQ19HX1RVTkVSOgorCQljYXNlIFZJRElPQ19TX1RVTkVSOgorCQkJZXJyID0gcHV0X3Y0bDJfdHVuZXIoJmthcmcudjJ0LCB1cCk7CisJCQlicmVhazsKKworCQljYXNlIFZJRElPQ19FTlVNSU5QVVQ6CisJCQllcnIgPSBwdXRfdjRsMl9pbnB1dCgma2FyZy52MmksIHVwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVklESU9DX0VOVU1JTlBVVDMyOgorCQkJZXJyID0gcHV0X3Y0bDJfaW5wdXQzMigma2FyZy52MmksIHVwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVklESU9DR0ZSRVE6CisJCWNhc2UgVklESU9DX0dfSU5QVVQ6CisJCQllcnIgPSBwdXRfdXNlcigoKHUzMilrYXJnLnZ4KSwgKHUzMiBfX3VzZXIgKil1cCk7CisJCQlicmVhazsKKwkJfTsKKwl9CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworbG9uZyB2NGxfY29tcGF0X2lvY3RsMzIoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXQgPSAtRU5PSU9DVExDTUQ7CisKKwlpZiAoIWZpbGUtPmZfb3AtPmlvY3RsKQorCQlyZXR1cm4gcmV0OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFZJRElPQ1NXSU4zMjoKKwkJcmV0ID0gZG9fc2V0X3dpbmRvdyhmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgVklESU9DR1RVTkVSMzI6CisJY2FzZSBWSURJT0NTVFVORVIzMjoKKwljYXNlIFZJRElPQ0dXSU4zMjoKKwljYXNlIFZJRElPQ0dGQlVGMzI6CisJY2FzZSBWSURJT0NTRkJVRjMyOgorCWNhc2UgVklESU9DR0ZSRVEzMjoKKwljYXNlIFZJRElPQ1NGUkVRMzI6CisJY2FzZSBWSURJT0NfUVVFUllDQVA6CisJY2FzZSBWSURJT0NfRU5VTV9GTVQ6CisJY2FzZSBWSURJT0NfR19GTVQzMjoKKwljYXNlIFZJRElPQ19TX0ZNVDMyOgorCWNhc2UgVklESU9DX1JFUUJVRlM6CisJY2FzZSBWSURJT0NfUVVFUllCVUYzMjoKKwljYXNlIFZJRElPQ19HX0ZCVUYzMjoKKwljYXNlIFZJRElPQ19TX0ZCVUYzMjoKKwljYXNlIFZJRElPQ19PVkVSTEFZMzI6CisJY2FzZSBWSURJT0NfUUJVRjMyOgorCWNhc2UgVklESU9DX0RRQlVGMzI6CisJY2FzZSBWSURJT0NfU1RSRUFNT04zMjoKKwljYXNlIFZJRElPQ19TVFJFQU1PRkYzMjoKKwljYXNlIFZJRElPQ19HX1BBUk06CisJY2FzZSBWSURJT0NfR19TVEQ6CisJY2FzZSBWSURJT0NfU19TVEQ6CisJY2FzZSBWSURJT0NfR19UVU5FUjoKKwljYXNlIFZJRElPQ19TX1RVTkVSOgorCWNhc2UgVklESU9DX0VOVU1TVEQ6CisJY2FzZSBWSURJT0NfRU5VTVNURDMyOgorCWNhc2UgVklESU9DX0VOVU1JTlBVVDoKKwljYXNlIFZJRElPQ19FTlVNSU5QVVQzMjoKKwljYXNlIFZJRElPQ19HX0NUUkw6CisJY2FzZSBWSURJT0NfU19DVFJMMzI6CisJY2FzZSBWSURJT0NfUVVFUllDVFJMOgorCWNhc2UgVklESU9DX0dfSU5QVVQzMjoKKwljYXNlIFZJRElPQ19TX0lOUFVUMzI6CisJY2FzZSBWSURJT0NfVFJZX0ZNVDMyOgorCQlyZXQgPSBkb192aWRlb19pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCisJLyogTGl0dGxlIHYsIHRoZSB2aWRlbzRsaW51eCBpb2N0bHMgKGNvbmZsaWN0PykgKi8KKwljYXNlIFZJRElPQ0dDQVA6CisJY2FzZSBWSURJT0NHQ0hBTjoKKwljYXNlIFZJRElPQ1NDSEFOOgorCWNhc2UgVklESU9DR1BJQ1Q6CisJY2FzZSBWSURJT0NTUElDVDoKKwljYXNlIFZJRElPQ0NBUFRVUkU6CisJY2FzZSBWSURJT0NLRVk6CisJY2FzZSBWSURJT0NHQVVESU86CisJY2FzZSBWSURJT0NTQVVESU86CisJY2FzZSBWSURJT0NTWU5DOgorCWNhc2UgVklESU9DTUNBUFRVUkU6CisJY2FzZSBWSURJT0NHTUJVRjoKKwljYXNlIFZJRElPQ0dVTklUOgorCWNhc2UgVklESU9DR0NBUFRVUkU6CisJY2FzZSBWSURJT0NTQ0FQVFVSRToKKworCS8qIEJUVFYgc3BlY2lmaWMuLi4gKi8KKwljYXNlIF9JT1coJ3YnLCAgQkFTRV9WSURJT0NQUklWQVRFKzAsIGNoYXIgWzI1Nl0pOgorCWNhc2UgX0lPUigndicsICBCQVNFX1ZJRElPQ1BSSVZBVEUrMSwgY2hhciBbMjU2XSk6CisJY2FzZSBfSU9SKCd2JyAsIEJBU0VfVklESU9DUFJJVkFURSsyLCB1bnNpZ25lZCBpbnQpOgorCWNhc2UgX0lPVygndicgLCBCQVNFX1ZJRElPQ1BSSVZBVEUrMywgY2hhciBbMTZdKTogLyogc3RydWN0IGJ0dHZfcGxsX2luZm8gKi8KKwljYXNlIF9JT1IoJ3YnICwgQkFTRV9WSURJT0NQUklWQVRFKzQsIGludCk6CisJY2FzZSBfSU9SKCd2JyAsIEJBU0VfVklESU9DUFJJVkFURSs1LCBpbnQpOgorCWNhc2UgX0lPUigndicgLCBCQVNFX1ZJRElPQ1BSSVZBVEUrNiwgaW50KToKKwljYXNlIF9JT1IoJ3YnICwgQkFTRV9WSURJT0NQUklWQVRFKzcsIGludCk6CisJCXJldCA9IG5hdGl2ZV9pb2N0bChmaWxlLCBjbWQsICh1bnNpZ25lZCBsb25nKWNvbXBhdF9wdHIoYXJnKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXY0bF9wcmludF9pb2N0bCgiY29tcGF0X2lvY3RsMzIiLCBjbWQpOworCX0KKwlyZXR1cm4gcmV0OworfQorI2Vsc2UKK2xvbmcgdjRsX2NvbXBhdF9pb2N0bDMyKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOworfQorI2VuZGlmCitFWFBPUlRfU1lNQk9MX0dQTCh2NGxfY29tcGF0X2lvY3RsMzIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYS5jCmluZGV4IGI3ZWM5YmYuLjlmNTk1NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYS5jCkBAIC0zODA3LDYgKzM4MDcsNyBAQAogCS5yZWFkCQk9IGNwaWFfcmVhZCwKIAkubW1hcAkJPSBjcGlhX21tYXAsCiAJLmlvY3RsICAgICAgICAgID0gY3BpYV9pb2N0bCwKKwkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLAogCS5sbHNlZWsgICAgICAgICA9IG5vX2xsc2VlaywKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYV9wcC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3BwLmMKaW5kZXggNjg2MWQ0MC4uNzRjZmY2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3BwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3BwLmMKQEAgLTcwMiwxMiArNzAyLDExIEBACiAJCXJldHVybiAtRU5YSU87CiAJfQogCi0JY2FtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBwX2NhbV9lbnRyeSksIEdGUF9LRVJORUwpOworCWNhbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwcF9jYW1fZW50cnkpLCBHRlBfS0VSTkVMKTsKIAlpZiAoY2FtID09IE5VTEwpIHsKIAkJTE9HKCJmYWlsZWQgdG8gYWxsb2NhdGUgY2FtZXJhIHN0cnVjdHVyZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQoY2FtLDAsc2l6ZW9mKHN0cnVjdCBwcF9jYW1fZW50cnkpKTsKIAkKIAlwZGV2ID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UocG9ydCwgImNwaWFfcHAiLCBOVUxMLCBOVUxMLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBjYW0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3VzYi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3VzYi5jCmluZGV4IDE0MzljYjcuLjAzMjc1YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYV91c2IuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWFfdXNiLmMKQEAgLTQ5OSwxNCArNDk5LDEyIEBACiAKIAlwcmludGsoS0VSTl9JTkZPICJVU0IgQ1BpQSBjYW1lcmEgZm91bmRcbiIpOwogCi0JdWNwaWEgPSBrbWFsbG9jKHNpemVvZigqdWNwaWEpLCBHRlBfS0VSTkVMKTsKKwl1Y3BpYSA9IGt6YWxsb2Moc2l6ZW9mKCp1Y3BpYSksIEdGUF9LRVJORUwpOwogCWlmICghdWNwaWEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJjb3VsZG4ndCBrbWFsbG9jIGNwaWEgc3RydWN0XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JbWVtc2V0KHVjcGlhLCAwLCBzaXplb2YoKnVjcGlhKSk7Ci0KIAl1Y3BpYS0+ZGV2ID0gdWRldjsKIAl1Y3BpYS0+aWZhY2UgPSBpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZU51bWJlcjsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ1Y3BpYS0+d3Ffc3RyZWFtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3M1M2wzMmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3M1M2wzMmEuYwppbmRleCA2NDNlYWQxLi44NzM5YzY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NzNTNsMzJhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jczUzbDMyYS5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWlkLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2NoaXAuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogCiBNT0RVTEVfREVTQ1JJUFRJT04oImkyYyBkZXZpY2UgZHJpdmVyIGZvciBjczUzbDMyYSBBdWRpbyBBREMiKTsKIE1PRFVMRV9BVVRIT1IoIk1hcnRpbiBWYXVnaGFuIik7CkBAIC0zOSwyMSArMzksNiBAQAogCiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWdnaW5nIG1lc3NhZ2VzXG5cdFx0XHQwPU9mZiAoZGVmYXVsdCksIDE9T24iKTsKIAotI2RlZmluZSBjczUzbDMyYV9kYmcoZm10LCBhcmcuLi4pIFwKLQlkbyB7IFwKLQkJaWYgKGRlYnVnKSBcCi0JCQlwcmludGsoS0VSTl9JTkZPICIlcyBkZWJ1ZyAlZC0lMDR4OiAiIGZtdCwgXAotCQkJICAgICAgIGNsaWVudC0+ZHJpdmVyLT5kcml2ZXIubmFtZSwgXAotCQkJICAgICAgIGkyY19hZGFwdGVyX2lkKGNsaWVudC0+YWRhcHRlciksIGNsaWVudC0+YWRkciAsICMjIGFyZyk7IFwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIGNzNTNsMzJhX2VycihmbXQsIGFyZy4uLikgZG8geyBcCi0JcHJpbnRrKEtFUk5fRVJSICIlcyAlZC0lMDR4OiAiIGZtdCwgY2xpZW50LT5kcml2ZXItPmRyaXZlci5uYW1lLCBcCi0JCWkyY19hZGFwdGVyX2lkKGNsaWVudC0+YWRhcHRlciksIGNsaWVudC0+YWRkciAsICMjIGFyZyk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGNzNTNsMzJhX2luZm8oZm10LCBhcmcuLi4pIGRvIHsgXAotCXByaW50ayhLRVJOX0lORk8gIiVzICVkLSUwNHg6ICIgZm10LCBjbGllbnQtPmRyaXZlci0+ZHJpdmVyLm5hbWUsIFwKLQkJaTJjX2FkYXB0ZXJfaWQoY2xpZW50LT5hZGFwdGVyKSwgY2xpZW50LT5hZGRyICwgIyMgYXJnKTsgfSB3aGlsZSAoMCkKLQogc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgyMiA+PiAxLCBJMkNfQ0xJRU5UX0VORCB9OwogCiAKQEAgLTc0LDUwICs1OSw1OSBAQAogc3RhdGljIGludCBjczUzbDMyYV9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkgICAgdm9pZCAqYXJnKQogewotCWludCAqaW5wdXQgPSBhcmc7CisJc3RydWN0IHY0bDJfYXVkaW8gKmlucHV0ID0gYXJnOworCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7CiAKIAlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVEQ19TRVRfSU5QVVQ6Ci0JCXN3aXRjaCAoKmlucHV0KSB7Ci0JCWNhc2UgQVVESU9fVFVORVI6Ci0JCQljczUzbDMyYV93cml0ZShjbGllbnQsIDB4MDEsIDB4MDEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVVESU9fRVhURVJOOgotCQkJY3M1M2wzMmFfd3JpdGUoY2xpZW50LCAweDAxLCAweDIxKTsKLQkJCWJyZWFrOwotCQljYXNlIEFVRElPX01VVEU6Ci0JCQljczUzbDMyYV93cml0ZShjbGllbnQsIDB4MDMsIDB4RjApOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVVESU9fVU5NVVRFOgotCQkJY3M1M2wzMmFfd3JpdGUoY2xpZW50LCAweDAzLCAweDMwKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJY3M1M2wzMmFfZXJyKCJJbnZhbGlkIGlucHV0ICVkLlxuIiwgKmlucHV0KTsKKwljYXNlIFZJRElPQ19TX0FVRElPOgorCQkvKiBUaGVyZSBhcmUgMiBwaHlzaWNhbCBpbnB1dHMsIGJ1dCB0aGUgc2Vjb25kIGlucHV0IGNhbiBiZQorCQkgICBwbGFjZWQgaW4gdHdvIG1vZGVzLCB0aGUgZmlyc3QgbW9kZSBieXBhc3NlcyB0aGUgUEdBIChnYWluKSwKKwkJICAgdGhlIHNlY29uZCBnb2VzIHRocm91Z2ggdGhlIFBHQS4gSGVuY2UgdGhlcmUgYXJlIHRocmVlCisJCSAgIHBvc3NpYmxlIGlucHV0cyB0byBjaG9vc2UgZnJvbS4gKi8KKwkJaWYgKGlucHV0LT5pbmRleCA+IDIpIHsKKwkJCXY0bF9lcnIoY2xpZW50LCAiSW52YWxpZCBpbnB1dCAlZC5cbiIsIGlucHV0LT5pbmRleCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQorCQljczUzbDMyYV93cml0ZShjbGllbnQsIDB4MDEsIDB4MDEgKyAoaW5wdXQtPmluZGV4IDw8IDQpKTsKKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19HX0FVRElPOgorCQltZW1zZXQoaW5wdXQsIDAsIHNpemVvZigqaW5wdXQpKTsKKwkJaW5wdXQtPmluZGV4ID0gKGNzNTNsMzJhX3JlYWQoY2xpZW50LCAweDAxKSA+PiA0KSAmIDM7CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfR19DVFJMOgorCQlpZiAoY3RybC0+aWQgPT0gVjRMMl9DSURfQVVESU9fTVVURSkgeworCQkJY3RybC0+dmFsdWUgPSAoY3M1M2wzMmFfcmVhZChjbGllbnQsIDB4MDMpICYgMHhjMCkgIT0gMDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjdHJsLT5pZCAhPSBWNEwyX0NJRF9BVURJT19WT0xVTUUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY3RybC0+dmFsdWUgPSAoczgpY3M1M2wzMmFfcmVhZChjbGllbnQsIDB4MDQpOwogCQlicmVhazsKIAogCWNhc2UgVklESU9DX1NfQ1RSTDoKLQkJewotCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCA9IGFyZzsKLQotCQkJaWYgKGN0cmwtPmlkICE9IFY0TDJfQ0lEX0FVRElPX1ZPTFVNRSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWlmIChjdHJsLT52YWx1ZSA+IDEyIHx8IGN0cmwtPnZhbHVlIDwgLTkwKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJY3M1M2wzMmFfd3JpdGUoY2xpZW50LCAweDA0LCAodTgpIGN0cmwtPnZhbHVlKTsKLQkJCWNzNTNsMzJhX3dyaXRlKGNsaWVudCwgMHgwNSwgKHU4KSBjdHJsLT52YWx1ZSk7CisJCWlmIChjdHJsLT5pZCA9PSBWNEwyX0NJRF9BVURJT19NVVRFKSB7CisJCQljczUzbDMyYV93cml0ZShjbGllbnQsIDB4MDMsIGN0cmwtPnZhbHVlID8gMHhmMCA6IDB4MzApOwogCQkJYnJlYWs7CiAJCX0KKwkJaWYgKGN0cmwtPmlkICE9IFY0TDJfQ0lEX0FVRElPX1ZPTFVNRSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoY3RybC0+dmFsdWUgPiAxMiB8fCBjdHJsLT52YWx1ZSA8IC05NikKKwkJCXJldHVybiAtRUlOVkFMOworCQljczUzbDMyYV93cml0ZShjbGllbnQsIDB4MDQsICh1OCkgY3RybC0+dmFsdWUpOworCQljczUzbDMyYV93cml0ZShjbGllbnQsIDB4MDUsICh1OCkgY3RybC0+dmFsdWUpOworCQlicmVhazsKIAogCWNhc2UgVklESU9DX0xPR19TVEFUVVM6CiAJCXsKIAkJCXU4IHYgPSBjczUzbDMyYV9yZWFkKGNsaWVudCwgMHgwMSk7CiAJCQl1OCBtID0gY3M1M2wzMmFfcmVhZChjbGllbnQsIDB4MDMpOworCQkJczggdm9sID0gY3M1M2wzMmFfcmVhZChjbGllbnQsIDB4MDQpOwogCi0JCQljczUzbDMyYV9pbmZvKCJJbnB1dDogJXMlc1xuIiwKLQkJCQkgICAgICB2ID09IDB4MjEgPyAiZXh0ZXJuYWwgbGluZSBpbiIgOiAidHVuZXIiLAorCQkJdjRsX2luZm8oY2xpZW50LCAiSW5wdXQ6ICAlZCVzXG4iLCAodiA+PiA0KSAmIDMsCiAJCQkJICAgICAgKG0gJiAweEMwKSA/ICIgKG11dGVkKSIgOiAiIik7CisJCQl2NGxfaW5mbyhjbGllbnQsICJWb2x1bWU6ICVkIGRCXG4iLCB2b2wpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTQ3LDIyICsxNDEsMjEgQEAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCiAJCXJldHVybiAwOwogCi0JY2xpZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKKwljbGllbnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOwogCWlmIChjbGllbnQgPT0gMCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltZW1zZXQoY2xpZW50LCAwLCBzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKIAljbGllbnQtPmFkZHIgPSBhZGRyZXNzOwogCWNsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CiAJY2xpZW50LT5kcml2ZXIgPSAmaTJjX2RyaXZlcjsKIAlzbnByaW50ZihjbGllbnQtPm5hbWUsIHNpemVvZihjbGllbnQtPm5hbWUpIC0gMSwgImNzNTNsMzJhIik7CiAKLQljczUzbDMyYV9pbmZvKCJjaGlwIGZvdW5kIEAgMHgleCAoJXMpXG4iLCBhZGRyZXNzIDw8IDEsIGFkYXB0ZXItPm5hbWUpOworCXY0bF9pbmZvKGNsaWVudCwgImNoaXAgZm91bmQgQCAweCV4ICglcylcbiIsIGFkZHJlc3MgPDwgMSwgYWRhcHRlci0+bmFtZSk7CiAKIAlmb3IgKGkgPSAxOyBpIDw9IDc7IGkrKykgewogCQl1OCB2ID0gY3M1M2wzMmFfcmVhZChjbGllbnQsIGkpOwogCi0JCWNzNTNsMzJhX2RiZygiUmVhZCBSZWcgJWQgJTAyeFxuIiwgaSwgdik7CisJCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgIlJlYWQgUmVnICVkICUwMnhcbiIsIGksIHYpOwogCX0KIAogCS8qIFNldCBjczUzbDMyYSBpbnRlcm5hbCByZWdpc3RlciBmb3IgQWRhcHRlYyAyMDEwLzI0MTAgc2V0dXAgKi8KQEAgLTE4MCw3ICsxNzMsNyBAQAogCWZvciAoaSA9IDE7IGkgPD0gNzsgaSsrKSB7CiAJCXU4IHYgPSBjczUzbDMyYV9yZWFkKGNsaWVudCwgaSk7CiAKLQkJY3M1M2wzMmFfZGJnKCJSZWFkIFJlZyAlZCAlMDJ4XG4iLCBpLCB2KTsKKwkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiUmVhZCBSZWcgJWQgJTAyeFxuIiwgaSwgdik7CiAJfQogCiAJaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KTsKQEAgLTE5MCwxMSArMTgzLDcgQEAKIAogc3RhdGljIGludCBjczUzbDMyYV9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0jaWZkZWYgSTJDX0NMQVNTX1RWX0FOQUxPRwogCWlmIChhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19UVl9BTkFMT0cpCi0jZWxzZQotCWlmIChhZGFwdGVyLT5pZCA9PSBJMkNfSFdfQl9CVDg0OCkKLSNlbmRpZgogCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsIGNzNTNsMzJhX2F0dGFjaCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1hdWRpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtYXVkaW8uYwppbmRleCA3NDA5MDhmLi5jYjlhNzk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1hdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWF1ZGlvLmMKQEAgLTIzLDExICsyMywxMyBAQAogCiAjaW5jbHVkZSAiY3gyNTg0MC5oIgogCi1pbmxpbmUgc3RhdGljIGludCBzZXRfYXVkY2xrX2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCQkgZW51bSB2NGwyX2F1ZGlvX2Nsb2NrX2ZyZXEgZnJlcSkKK3N0YXRpYyBpbnQgc2V0X2F1ZGNsa19mcmVxKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUzMiBmcmVxKQogewogCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCisJaWYgKGZyZXEgIT0gMzIwMDAgJiYgZnJlcSAhPSA0NDEwMCAmJiBmcmVxICE9IDQ4MDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCS8qIGFzc2VydCBzb2Z0IHJlc2V0ICovCiAJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDgxMCwgfjB4MSwgMHgwMSk7CiAKQEAgLTM1LDEwICszNyw5IEBACiAJLyogU0FfTUNMS19TRUw9MSwgU0FfTUNMS19ESVY9MHgxMCAqLwogCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDEyNywgMHg1MCk7CiAKLQlzd2l0Y2ggKHN0YXRlLT5hdWRpb19pbnB1dCkgewotCWNhc2UgQVVESU9fVFVORVI6CisJaWYgKHN0YXRlLT5hdWRfaW5wdXQgIT0gQ1gyNTg0MF9BVURJT19TRVJJQUwpIHsKIAkJc3dpdGNoIChmcmVxKSB7Ci0JCWNhc2UgVjRMMl9BVURDTEtfMzJfS0haOgorCQljYXNlIDMyMDAwOgogCQkJLyogVklEX1BMTCBhbmQgQVVYX1BMTCAqLwogCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDEwOCwgMHgwZjA0MDYxMCk7CiAKQEAgLTUxLDcgKzUyLDcgQEAKIAkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MGMsIDB4N2ZmNzAxMDgpOwogCQkJYnJlYWs7CiAKLQkJY2FzZSBWNEwyX0FVRENMS180NDFfS0haOgorCQljYXNlIDQ0MTAwOgogCQkJLyogVklEX1BMTCBhbmQgQVVYX1BMTCAqLwogCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDEwOCwgMHgwZjA0MDkxMCk7CiAKQEAgLTY0LDcgKzY1LDcgQEAKIAkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MGMsIDB4NTk2ZDAxMDgpOwogCQkJYnJlYWs7CiAKLQkJY2FzZSBWNEwyX0FVRENMS180OF9LSFo6CisJCWNhc2UgNDgwMDA6CiAJCQkvKiBWSURfUExMIGFuZCBBVVhfUExMICovCiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTA4LCAweDBmMDQwYTEwKTsKIApAQCAtNzcsMTQgKzc4LDkgQEAKIAkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MGMsIDB4YWE0ZjAxMDgpOwogCQkJYnJlYWs7CiAJCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFVRElPX0VYVEVSTl8xOgotCWNhc2UgQVVESU9fRVhURVJOXzI6Ci0JY2FzZSBBVURJT19JTlRFUk46Ci0JY2FzZSBBVURJT19SQURJTzoKKwl9IGVsc2UgewogCQlzd2l0Y2ggKGZyZXEpIHsKLQkJY2FzZSBWNEwyX0FVRENMS18zMl9LSFo6CisJCWNhc2UgMzIwMDA6CiAJCQkvKiBWSURfUExMIGFuZCBBVVhfUExMICovCiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTA4LCAweDBmMDQwODFlKTsKIApAQCAtMTAzLDcgKzk5LDcgQEAKIAkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDEyNywgMHg1NCk7CiAJCQlicmVhazsKIAotCQljYXNlIFY0TDJfQVVEQ0xLXzQ0MV9LSFo6CisJCWNhc2UgNDQxMDA6CiAJCQkvKiBWSURfUExMIGFuZCBBVVhfUExMICovCiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTA4LCAweDBmMDQwOTE4KTsKIApAQCAtMTE5LDcgKzExNSw3IEBACiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTBjLCAweDg1NzMwMTA4KTsKIAkJCWJyZWFrOwogCi0JCWNhc2UgVjRMMl9BVURDTEtfNDhfS0haOgorCQljYXNlIDQ4MDAwOgogCQkJLyogVklEX1BMTCBhbmQgQVVYX1BMTCAqLwogCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDEwOCwgMHgwZjA0MGExOCk7CiAKQEAgLTEzNSw3ICsxMzEsNiBAQAogCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDkwYywgMHg1NTU1MDEwOCk7CiAJCQlicmVhazsKIAkJfQotCQlicmVhazsKIAl9CiAKIAkvKiBkZWFzc2VydCBzb2Z0IHJlc2V0ICovCkBAIC0xNDYsNTEgKzE0MSwzNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNldF9pbnB1dChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgYXVkaW9faW5wdXQpCit2b2lkIGN4MjU4NDBfYXVkaW9fc2V0X3BhdGgoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAotCWN4MjU4NDBfZGJnKCJzZXQgYXVkaW8gaW5wdXQgKCVkKVxuIiwgYXVkaW9faW5wdXQpOwotCiAJLyogc3RvcCBtaWNyb2NvbnRyb2xsZXIgKi8KIAljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4ODAzLCB+MHgxMCwgMCk7CiAKIAkvKiBNdXRlIGV2ZXJ5dGhpbmcgdG8gcHJldmVudCB0aGUgUEZGVCEgKi8KIAljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg4ZDMsIDB4MWYpOwogCi0Jc3dpdGNoIChhdWRpb19pbnB1dCkgewotCWNhc2UgQVVESU9fVFVORVI6Ci0JCS8qIFNldCBQYXRoMSB0byBBbmFsb2cgRGVtb2QgTWFpbiBDaGFubmVsICovCi0JCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg4ZDAsIDB4NzAzODA2MWYpOwotCi0JCS8qIFdoZW4gdGhlIG1pY3JvY29udHJvbGxlciBkZXRlY3RzIHRoZQotCQkgKiBhdWRpbyBmb3JtYXQsIGl0IHdpbGwgdW5tdXRlIHRoZSBsaW5lcyAqLwotCQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4ODAzLCB+MHgxMCwgMHgxMCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19FWFRFUk5fMToKLQljYXNlIEFVRElPX0VYVEVSTl8yOgotCWNhc2UgQVVESU9fSU5URVJOOgotCWNhc2UgQVVESU9fUkFESU86CisJaWYgKHN0YXRlLT5hdWRfaW5wdXQgPT0gQ1gyNTg0MF9BVURJT19TRVJJQUwpIHsKIAkJLyogU2V0IFBhdGgxIHRvIFNlcmlhbCBBdWRpbyBJbnB1dCAqLwogCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OGQwLCAweDEyMTAwMTAxKTsKIAogCQkvKiBUaGUgbWljcm9jb250cm9sbGVyIHNob3VsZCBub3QgYmUgc3RhcnRlZCBmb3IgdGhlCiAJCSAqIG5vbi10dW5lciBpbnB1dHM6IGF1dG9kZXRlY3Rpb24gaXMgc3BlY2lmaWMgZm9yCiAJCSAqIFRWIGF1ZGlvLiAqLwotCQlicmVhazsKKwl9IGVsc2UgeworCQkvKiBTZXQgUGF0aDEgdG8gQW5hbG9nIERlbW9kIE1haW4gQ2hhbm5lbCAqLworCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OGQwLCAweDcwMzgwNjFmKTsKIAotCWRlZmF1bHQ6Ci0JCWN4MjU4NDBfZGJnKCJJbnZhbGlkIGF1ZGlvIGlucHV0IHNlbGVjdGlvbiAlZFxuIiwgYXVkaW9faW5wdXQpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJLyogV2hlbiB0aGUgbWljcm9jb250cm9sbGVyIGRldGVjdHMgdGhlCisJCSAqIGF1ZGlvIGZvcm1hdCwgaXQgd2lsbCB1bm11dGUgdGhlIGxpbmVzICovCisJCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHg4MDMsIH4weDEwLCAweDEwKTsKIAl9CiAKLQlzdGF0ZS0+YXVkaW9faW5wdXQgPSBhdWRpb19pbnB1dDsKLQotCXJldHVybiBzZXRfYXVkY2xrX2ZyZXEoY2xpZW50LCBzdGF0ZS0+YXVkY2xrX2ZyZXEpOworCXNldF9hdWRjbGtfZnJlcShjbGllbnQsIHN0YXRlLT5hdWRjbGtfZnJlcSk7CiB9CiAKLWlubGluZSBzdGF0aWMgaW50IGdldF92b2x1bWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgZ2V0X3ZvbHVtZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCS8qIFZvbHVtZSBydW5zICsxOGRCIHRvIC05NmRCIGluIDEvMmRCIHN0ZXBzCiAJICogY2hhbmdlIHRvIGZpdCB0aGUgbXNwMzQwMCAtMTE0ZEIgdG8gKzEyZEIgcmFuZ2UgKi8KQEAgLTIwMSw3ICsxODEsNyBAQAogCXJldHVybiB2b2wgPDwgOTsKIH0KIAotaW5saW5lIHN0YXRpYyB2b2lkIHNldF92b2x1bWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHZvbHVtZSkKK3N0YXRpYyB2b2lkIHNldF92b2x1bWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHZvbHVtZSkKIHsKIAkvKiBGaXJzdCBjb252ZXJ0IHRoZSB2b2x1bWUgdG8gbXNwMzQwMCB2YWx1ZXMgKDAtMTI3KSAqLwogCWludCB2b2wgPSB2b2x1bWUgPj4gOTsKQEAgLTIxOCw3ICsxOTgsNyBAQAogCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDhkNCwgMjI4IC0gKHZvbCAqIDIpKTsKIH0KIAotaW5saW5lIHN0YXRpYyBpbnQgZ2V0X2Jhc3Moc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgZ2V0X2Jhc3Moc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAkvKiBiYXNzIGlzIDQ5IHN0ZXBzICsxMmRCIHRvIC0xMmRCICovCiAKQEAgLTIyOCwxMyArMjA4LDEzIEBACiAJcmV0dXJuIGJhc3M7CiB9CiAKLWlubGluZSBzdGF0aWMgdm9pZCBzZXRfYmFzcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgYmFzcykKK3N0YXRpYyB2b2lkIHNldF9iYXNzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBiYXNzKQogewogCS8qIFBBVEgxX0VRX0JBU1NfVk9MICovCiAJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDhkOSwgfjB4M2YsIDQ4IC0gKGJhc3MgKiA0OCAvIDB4ZmZmZikpOwogfQogCi1pbmxpbmUgc3RhdGljIGludCBnZXRfdHJlYmxlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IGdldF90cmVibGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAkvKiB0cmVibGUgaXMgNDkgc3RlcHMgKzEyZEIgdG8gLTEyZEIgKi8KIApAQCAtMjQ0LDEzICsyMjQsMTMgQEAKIAlyZXR1cm4gdHJlYmxlOwogfQogCi1pbmxpbmUgc3RhdGljIHZvaWQgc2V0X3RyZWJsZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgdHJlYmxlKQorc3RhdGljIHZvaWQgc2V0X3RyZWJsZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgdHJlYmxlKQogewogCS8qIFBBVEgxX0VRX1RSRUJMRV9WT0wgKi8KIAljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4OGRiLCB+MHgzZiwgNDggLSAodHJlYmxlICogNDggLyAweGZmZmYpKTsKIH0KIAotaW5saW5lIHN0YXRpYyBpbnQgZ2V0X2JhbGFuY2Uoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgZ2V0X2JhbGFuY2Uoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAkvKiBiYWxhbmNlIGlzIDcgYml0LCAwIHRvIC05NmRCICovCiAKQEAgLTI2NCw3ICsyNDQsNyBAQAogCXJldHVybiBiYWxhbmNlIDw8IDg7CiB9CiAKLWlubGluZSBzdGF0aWMgdm9pZCBzZXRfYmFsYW5jZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgYmFsYW5jZSkKK3N0YXRpYyB2b2lkIHNldF9iYWxhbmNlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBiYWxhbmNlKQogewogCWludCBiYWwgPSBiYWxhbmNlID4+IDg7CiAJaWYgKGJhbCA+IDB4ODApIHsKQEAgLTI4MCwxNyArMjYwLDE3IEBACiAJfQogfQogCi1pbmxpbmUgc3RhdGljIGludCBnZXRfbXV0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBnZXRfbXV0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCS8qIGNoZWNrIFNSQzFfTVVURV9FTiAqLwogCXJldHVybiBjeDI1ODQwX3JlYWQoY2xpZW50LCAweDhkMykgJiAweDIgPyAxIDogMDsKIH0KIAotaW5saW5lIHN0YXRpYyB2b2lkIHNldF9tdXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBtdXRlKQorc3RhdGljIHZvaWQgc2V0X211dGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IG11dGUpCiB7CiAJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKLQlpZiAoc3RhdGUtPmF1ZGlvX2lucHV0ID09IEFVRElPX1RVTkVSKSB7CisJaWYgKHN0YXRlLT5hdWRfaW5wdXQgIT0gQ1gyNTg0MF9BVURJT19TRVJJQUwpIHsKIAkJLyogTXVzdCB0dXJuIG9mZiBtaWNyb2NvbnRyb2xsZXIgaW4gb3JkZXIgdG8gbXV0ZSBzb3VuZC4KIAkJICogTm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgYmVzdCBtZXRob2QsIGJ1dCBpdCBkb2VzIHdvcmsuCiAJCSAqIElmIHRoZSBtaWNyb2NvbnRyb2xsZXIgaXMgcnVubmluZywgdGhlbiBpdCB3aWxsIHVuZG8gYW55CkBAIC0zMTQsMTAgKzI5NCw5IEBACiAJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCA9IGFyZzsKIAogCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURDX1NFVF9JTlBVVDoKLQkJcmV0dXJuIHNldF9pbnB1dChjbGllbnQsICooaW50ICopYXJnKTsKIAljYXNlIFZJRElPQ19JTlRfQVVESU9fQ0xPQ0tfRlJFUToKLQkJcmV0dXJuIHNldF9hdWRjbGtfZnJlcShjbGllbnQsICooZW51bSB2NGwyX2F1ZGlvX2Nsb2NrX2ZyZXEgKilhcmcpOworCQlyZXR1cm4gc2V0X2F1ZGNsa19mcmVxKGNsaWVudCwgKih1MzIgKilhcmcpOworCiAJY2FzZSBWSURJT0NfR19DVFJMOgogCQlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgpAQCAtMzM5LDYgKzMxOCw3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlicmVhazsKKwogCWNhc2UgVklESU9DX1NfQ1RSTDoKIAkJc3dpdGNoIChjdHJsLT5pZCkgewogCQljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKQEAgLTM2MCw2ICszNDAsNyBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1jb3JlLmMKaW5kZXggM2IwOWY0Ni4uYzY2YzJjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWNvcmUuYwpAQCAtNDMsMTEgKzQzLDExIEBACiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDg4ID4+IDEsIEkyQ19DTElFTlRfRU5EIH07CiAKIAotaW50IGN4MjU4NDBfZGVidWcgPSAwOworc3RhdGljIGludCBjeDI1ODQwX2RlYnVnOwogCi1tb2R1bGVfcGFyYW0oY3gyNTg0MF9kZWJ1ZywgYm9vbCwgMDY0NCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsY3gyNTg0MF9kZWJ1ZywgaW50LCAwNjQ0KTsKIAotTU9EVUxFX1BBUk1fREVTQyhjeDI1ODQwX2RlYnVnLCAiRGVidWdnaW5nIG1lc3NhZ2VzIFswPU9mZiAoZGVmYXVsdCkgMT1Pbl0iKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1Z2dpbmcgbWVzc2FnZXMgWzA9T2ZmIChkZWZhdWx0KSAxPU9uXSIpOwogCiBJMkNfQ0xJRU5UX0lOU01PRDsKIApAQCAtMTE1LDEzICsxMTUsMTMgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCBzZXRfaW5wdXQoc3RydWN0IGkyY19jbGllbnQgKiwgZW51bSBjeDI1ODQwX2lucHV0KTsKLXN0YXRpYyB2b2lkIGlucHV0X2NoYW5nZShzdHJ1Y3QgaTJjX2NsaWVudCAqKTsKK3N0YXRpYyBpbnQgc2V0X2lucHV0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGVudW0gY3gyNTg0MF92aWRlb19pbnB1dCB2aWRfaW5wdXQsCisJCQkJCQllbnVtIGN4MjU4NDBfYXVkaW9faW5wdXQgYXVkX2lucHV0KTsKIHN0YXRpYyB2b2lkIGxvZ19zdGF0dXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2RsbDEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyB2b2lkIGluaXRfZGxsMShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCS8qIFRoaXMgaXMgdGhlIEhhdXBwYXVnZSBzZXF1ZW5jZSB1c2VkIHRvCiAJICogaW5pdGlhbGl6ZSB0aGUgRGVsYXkgTG9jayBMb29wIDEgKEFEQyBETEwpLiAqLwpAQCAtMTM1LDcgKzEzNSw3IEBACiAJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4MTViLCAweDEwKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGluaXRfZGxsMihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIHZvaWQgaW5pdF9kbGwyKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJLyogVGhpcyBpcyB0aGUgSGF1cHBhdWdlIHNlcXVlbmNlIHVzZWQgdG8KIAkgKiBpbml0aWFsaXplIHRoZSBEZWxheSBMb2NrIExvb3AgMiAoQURDIERMTCkuICovCkBAIC0xOTUsMTAgKzE5NSw4IEBACiAJLyogQUM5NyBzaGlmdCAqLwogCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDhjZiwgMHgwZik7CiAKLQkvKiAocmUpc2V0IHZpZGVvIGlucHV0ICovCi0Jc2V0X2lucHV0KGNsaWVudCwgc3RhdGUtPmlucHV0KTsKLQkvKiAocmUpc2V0IGF1ZGlvIGlucHV0ICovCi0JY3gyNTg0MF9hdWRpbyhjbGllbnQsIEFVRENfU0VUX0lOUFVULCAmc3RhdGUtPmF1ZGlvX2lucHV0KTsKKwkvKiAocmUpc2V0IGlucHV0ICovCisJc2V0X2lucHV0KGNsaWVudCwgc3RhdGUtPnZpZF9pbnB1dCwgc3RhdGUtPmF1ZF9pbnB1dCk7CiAKIAkvKiBzdGFydCBtaWNyb2NvbnRyb2xsZXIgKi8KIAljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4ODAzLCB+MHgxMCwgMHgxMCk7CkBAIC0yMjMsNyArMjIxLDcgQEAKIAkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4ODBiLCAweDEwKTsKIAl9IGVsc2UgaWYgKHN0ZCAmIFY0TDJfU1REX05UU0MpIHsKIAkJLyogTlRTQyAqLwotCQlpZiAoc3RhdGUtPmNhcmR0eXBlID09IENBUkRUWVBFX1BWUjE1MF9XT1JLQVJPVU5EKSB7CisJCWlmIChzdGF0ZS0+cHZyMTUwX3dvcmthcm91bmQpIHsKIAkJCS8qIENlcnRhaW4gSGF1cHBhdWdlIFBWUjE1MCBtb2RlbHMgaGF2ZSBhIGhhcmR3YXJlIGJ1ZwogCQkJICAgdGhhdCBjYXVzZXMgYXVkaW8gdG8gZHJvcCBvdXQuIEZvciB0aGVzZSBtb2RlbHMgdGhlCiAJCQkgICBhdWRpbyBzdGFuZGFyZCBtdXN0IGJlIHNldCBleHBsaWNpdGx5LgpAQCAtMjU5LDcyICsyNTcsNjggQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgc2V0X2lucHV0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGVudW0gY3gyNTg0MF9pbnB1dCBpbnB1dCkKK3N0YXRpYyBpbnQgc2V0X2lucHV0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGVudW0gY3gyNTg0MF92aWRlb19pbnB1dCB2aWRfaW5wdXQsCisJCQkJCQllbnVtIGN4MjU4NDBfYXVkaW9faW5wdXQgYXVkX2lucHV0KQogewogCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXU4IGlzX2NvbXBvc2l0ZSA9ICh2aWRfaW5wdXQgPj0gQ1gyNTg0MF9DT01QT1NJVEUxICYmCisJCQkgICB2aWRfaW5wdXQgPD0gQ1gyNTg0MF9DT01QT1NJVEU4KTsKKwl1OCByZWc7CiAKLQljeDI1ODQwX2RiZygiZGVjb2RlciBzZXQgaW5wdXQgKCVkKVxuIiwgaW5wdXQpOworCXY0bF9kYmcoMSwgY3gyNTg0MF9kZWJ1ZywgY2xpZW50LCAiZGVjb2RlciBzZXQgdmlkZW8gaW5wdXQgJWQsIGF1ZGlvIGlucHV0ICVkXG4iLAorCQkJdmlkX2lucHV0LCBhdWRfaW5wdXQpOwogCi0Jc3dpdGNoIChpbnB1dCkgewotCWNhc2UgQ1gyNTg0MF9UVU5FUjoKLQkJY3gyNTg0MF9kYmcoIm5vdyBzZXR0aW5nIFR1bmVyIGlucHV0XG4iKTsKKwlpZiAoaXNfY29tcG9zaXRlKSB7CisJCXJlZyA9IDB4ZjAgKyAodmlkX2lucHV0IC0gQ1gyNTg0MF9DT01QT1NJVEUxKTsKKwl9IGVsc2UgeworCQlpbnQgbHVtYSA9IHZpZF9pbnB1dCAmIDB4ZjA7CisJCWludCBjaHJvbWEgPSB2aWRfaW5wdXQgJiAweGYwMDsKIAotCQlpZiAoc3RhdGUtPmNhcmR0eXBlID09IENBUkRUWVBFX1BWUjE1MCB8fAotCQkgICAgc3RhdGUtPmNhcmR0eXBlID09IENBUkRUWVBFX1BWUjE1MF9XT1JLQVJPVU5EKSB7Ci0JCQkvKiBDSF9TRUxfQURDMj0xICovCi0JCQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4MTAyLCB+MHgyLCAweDAyKTsKKwkJaWYgKCh2aWRfaW5wdXQgJiB+MHhmZjApIHx8CisJCSAgICBsdW1hIDwgQ1gyNTg0MF9TVklERU9fTFVNQTEgfHwgbHVtYSA+IENYMjU4NDBfU1ZJREVPX0xVTUE0IHx8CisJCSAgICBjaHJvbWEgPCBDWDI1ODQwX1NWSURFT19DSFJPTUE0IHx8IGNocm9tYSA+IENYMjU4NDBfU1ZJREVPX0NIUk9NQTgpIHsKKwkJCXY0bF9lcnIoY2xpZW50LCAiMHglMDR4IGlzIG5vdCBhIHZhbGlkIHZpZGVvIGlucHV0IVxuIiwgdmlkX2lucHV0KTsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0KLQkJLyogVmlkZW8gSW5wdXQgQ29udHJvbCAqLwotCQlpZiAoc3RhdGUtPmNhcmR0eXBlID09IENBUkRUWVBFX1BHNjAwKSB7Ci0JCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHgxMDMsIDB4MTEpOworCQlyZWcgPSAweGYwICsgKChsdW1hIC0gQ1gyNTg0MF9TVklERU9fTFVNQTEpID4+IDQpOworCQlpZiAoY2hyb21hID49IENYMjU4NDBfU1ZJREVPX0NIUk9NQTcpIHsKKwkJCXJlZyAmPSAweDNmOworCQkJcmVnIHw9IChjaHJvbWEgLSBDWDI1ODQwX1NWSURFT19DSFJPTUE3KSA+PiAyOwogCQl9IGVsc2UgewotCQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4MTAzLCAweDQ2KTsKKwkJCXJlZyAmPSAweGNmOworCQkJcmVnIHw9IChjaHJvbWEgLSBDWDI1ODQwX1NWSURFT19DSFJPTUE0KSA+PiA0OwogCQl9CisJfQogCi0JCS8qIElOUFVUX01PREU9MCAqLwotCQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4NDAxLCB+MHg2LCAweDAwKTsKKwlzd2l0Y2ggKGF1ZF9pbnB1dCkgeworCWNhc2UgQ1gyNTg0MF9BVURJT19TRVJJQUw6CisJCS8qIGRvIG5vdGhpbmcsIHVzZSBzZXJpYWwgYXVkaW8gaW5wdXQgKi8KIAkJYnJlYWs7Ci0KLQljYXNlIENYMjU4NDBfQ09NUE9TSVRFMDoKLQljYXNlIENYMjU4NDBfQ09NUE9TSVRFMToKLQkJY3gyNTg0MF9kYmcoIm5vdyBzZXR0aW5nIENvbXBvc2l0ZSBpbnB1dFxuIik7Ci0KLQkJLyogVmlkZW8gSW5wdXQgQ29udHJvbCAqLwotCQlpZiAoc3RhdGUtPmNhcmR0eXBlID09IENBUkRUWVBFX1BHNjAwKSB7Ci0JCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHgxMDMsIDB4MDApOwotCQl9IGVsc2UgewotCQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4MTAzLCAweDAyKTsKLQkJfQotCi0JCS8qIElOUFVUX01PREU9MCAqLwotCQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4NDAxLCB+MHg2LCAweDAwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENYMjU4NDBfU1ZJREVPMDoKLQljYXNlIENYMjU4NDBfU1ZJREVPMToKLQkJY3gyNTg0MF9kYmcoIm5vdyBzZXR0aW5nIFMtVmlkZW8gaW5wdXRcbiIpOwotCi0JCS8qIENIX1NFTF9BREMyPTAgKi8KLQkJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDEwMiwgfjB4MiwgMHgwMCk7Ci0KLQkJLyogVmlkZW8gSW5wdXQgQ29udHJvbCAqLwotCQlpZiAoc3RhdGUtPmNhcmR0eXBlID09IENBUkRUWVBFX1BHNjAwKSB7Ci0JCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHgxMDMsIDB4MDIpOwotCQl9IGVsc2UgewotCQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4MTAzLCAweDEwKTsKLQkJfQotCi0JCS8qIElOUFVUX01PREU9MSAqLwotCQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4NDAxLCB+MHg2LCAweDAyKTsKLQkJYnJlYWs7CisJY2FzZSBDWDI1ODQwX0FVRElPNDogcmVnICY9IH4weDMwOyBicmVhazsKKwljYXNlIENYMjU4NDBfQVVESU81OiByZWcgJj0gfjB4MzA7IHJlZyB8PSAweDEwOyBicmVhazsKKwljYXNlIENYMjU4NDBfQVVESU82OiByZWcgJj0gfjB4MzA7IHJlZyB8PSAweDIwOyBicmVhazsKKwljYXNlIENYMjU4NDBfQVVESU83OiByZWcgJj0gfjB4YzA7IGJyZWFrOworCWNhc2UgQ1gyNTg0MF9BVURJTzg6IHJlZyAmPSB+MHhjMDsgcmVnIHw9IDB4NDA7IGJyZWFrOwogCiAJZGVmYXVsdDoKLQkJY3gyNTg0MF9lcnIoIiVkIGlzIG5vdCBhIHZhbGlkIGlucHV0IVxuIiwgaW5wdXQpOworCQl2NGxfZXJyKGNsaWVudCwgIjB4JTA0eCBpcyBub3QgYSB2YWxpZCBhdWRpbyBpbnB1dCFcbiIsIGF1ZF9pbnB1dCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXN0YXRlLT5pbnB1dCA9IGlucHV0OworCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDEwMywgcmVnKTsKKwkvKiBTZXQgSU5QVVRfTU9ERSB0byBDb21wb3NpdGUgKDApIG9yIFMtVmlkZW8gKDEpICovCisJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDQwMSwgfjB4NiwgaXNfY29tcG9zaXRlID8gMCA6IDB4MDIpOworCS8qIFNldCBDSF9TRUxfQURDMiB0byAxIGlmIGlucHV0IGNvbWVzIGZyb20gQ0gzICovCisJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDEwMiwgfjB4MiwgKHJlZyAmIDB4ODApID09IDAgPyAyIDogMCk7CisJLyogU2V0IERVQUxfTU9ERV9BREMyIHRvIDEgaWYgaW5wdXQgY29tZXMgZnJvbSBib3RoIENIMiBhbmQgQ0gzICovCisJaWYgKChyZWcgJiAweGMwKSAhPSAweGMwICYmIChyZWcgJiAweDMwKSAhPSAweDMwKQorCQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4MTAyLCB+MHg0LCA0KTsKKwllbHNlCisJCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHgxMDIsIH4weDQsIDApOworCisJc3RhdGUtPnZpZF9pbnB1dCA9IHZpZF9pbnB1dDsKKwlzdGF0ZS0+YXVkX2lucHV0ID0gYXVkX2lucHV0OworCWN4MjU4NDBfYXVkaW9fc2V0X3BhdGgoY2xpZW50KTsKIAlpbnB1dF9jaGFuZ2UoY2xpZW50KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTM5NSwyMyArMzg5LDE0IEBACiAJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JY2FzZSBDWDI1ODQwX0NJRF9DQVJEVFlQRToKLQkJc3dpdGNoIChjdHJsLT52YWx1ZSkgewotCQljYXNlIENBUkRUWVBFX1BWUjE1MDoKLQkJY2FzZSBDQVJEVFlQRV9QVlIxNTBfV09SS0FST1VORDoKLQkJY2FzZSBDQVJEVFlQRV9QRzYwMDoKLQkJCXN0YXRlLT5jYXJkdHlwZSA9IGN0cmwtPnZhbHVlOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVSQU5HRTsKLQkJfQotCi0JCXNldF9pbnB1dChjbGllbnQsIHN0YXRlLT5pbnB1dCk7CisJY2FzZSBDWDI1ODQwX0NJRF9FTkFCTEVfUFZSMTUwX1dPUktBUk9VTkQ6CisJCXN0YXRlLT5wdnIxNTBfd29ya2Fyb3VuZCA9IGN0cmwtPnZhbHVlOworCQlzZXRfaW5wdXQoY2xpZW50LCBzdGF0ZS0+dmlkX2lucHV0LCBzdGF0ZS0+YXVkX2lucHV0KTsKIAkJYnJlYWs7CiAKIAljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CiAJCWlmIChjdHJsLT52YWx1ZSA8IDAgfHwgY3RybC0+dmFsdWUgPiAyNTUpIHsKLQkJCWN4MjU4NDBfZXJyKCJpbnZhbGlkIGJyaWdodG5lc3Mgc2V0dGluZyAlZFxuIiwKKwkJCXY0bF9lcnIoY2xpZW50LCAiaW52YWxpZCBicmlnaHRuZXNzIHNldHRpbmcgJWRcbiIsCiAJCQkJICAgIGN0cmwtPnZhbHVlKTsKIAkJCXJldHVybiAtRVJBTkdFOwogCQl9CkBAIC00MjEsNyArNDA2LDcgQEAKIAogCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CiAJCWlmIChjdHJsLT52YWx1ZSA8IDAgfHwgY3RybC0+dmFsdWUgPiAxMjcpIHsKLQkJCWN4MjU4NDBfZXJyKCJpbnZhbGlkIGNvbnRyYXN0IHNldHRpbmcgJWRcbiIsCisJCQl2NGxfZXJyKGNsaWVudCwgImludmFsaWQgY29udHJhc3Qgc2V0dGluZyAlZFxuIiwKIAkJCQkgICAgY3RybC0+dmFsdWUpOwogCQkJcmV0dXJuIC1FUkFOR0U7CiAJCX0KQEAgLTQzMSw3ICs0MTYsNyBAQAogCiAJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgogCQlpZiAoY3RybC0+dmFsdWUgPCAwIHx8IGN0cmwtPnZhbHVlID4gMTI3KSB7Ci0JCQljeDI1ODQwX2VycigiaW52YWxpZCBzYXR1cmF0aW9uIHNldHRpbmcgJWRcbiIsCisJCQl2NGxfZXJyKGNsaWVudCwgImludmFsaWQgc2F0dXJhdGlvbiBzZXR0aW5nICVkXG4iLAogCQkJCSAgICBjdHJsLT52YWx1ZSk7CiAJCQlyZXR1cm4gLUVSQU5HRTsKIAkJfQpAQCAtNDQyLDcgKzQyNyw3IEBACiAKIAljYXNlIFY0TDJfQ0lEX0hVRToKIAkJaWYgKGN0cmwtPnZhbHVlIDwgLTEyNyB8fCBjdHJsLT52YWx1ZSA+IDEyNykgewotCQkJY3gyNTg0MF9lcnIoImludmFsaWQgaHVlIHNldHRpbmcgJWRcbiIsIGN0cmwtPnZhbHVlKTsKKwkJCXY0bF9lcnIoY2xpZW50LCAiaW52YWxpZCBodWUgc2V0dGluZyAlZFxuIiwgY3RybC0+dmFsdWUpOwogCQkJcmV0dXJuIC1FUkFOR0U7CiAJCX0KIApAQCAtNDU1LDYgKzQ0MCw5IEBACiAJY2FzZSBWNEwyX0NJRF9BVURJT19CQUxBTkNFOgogCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKIAkJcmV0dXJuIGN4MjU4NDBfYXVkaW8oY2xpZW50LCBWSURJT0NfU19DVFJMLCBjdHJsKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXJldHVybiAwOwpAQCAtNDY1LDExICs0NTMsMTEgQEAKIAlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKLQljYXNlIENYMjU4NDBfQ0lEX0NBUkRUWVBFOgotCQljdHJsLT52YWx1ZSA9IHN0YXRlLT5jYXJkdHlwZTsKKwljYXNlIENYMjU4NDBfQ0lEX0VOQUJMRV9QVlIxNTBfV09SS0FST1VORDoKKwkJY3RybC0+dmFsdWUgPSBzdGF0ZS0+cHZyMTUwX3dvcmthcm91bmQ7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKLQkJY3RybC0+dmFsdWUgPSBjeDI1ODQwX3JlYWQoY2xpZW50LCAweDQxNCkgKyAxMjg7CisJCWN0cmwtPnZhbHVlID0gKHM4KWN4MjU4NDBfcmVhZChjbGllbnQsIDB4NDE0KSArIDEyODsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKIAkJY3RybC0+dmFsdWUgPSBjeDI1ODQwX3JlYWQoY2xpZW50LCAweDQxNSkgPj4gMTsKQEAgLTQ3OCw3ICs0NjYsNyBAQAogCQljdHJsLT52YWx1ZSA9IGN4MjU4NDBfcmVhZChjbGllbnQsIDB4NDIwKSA+PiAxOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0hVRToKLQkJY3RybC0+dmFsdWUgPSBjeDI1ODQwX3JlYWQoY2xpZW50LCAweDQyMik7CisJCWN0cmwtPnZhbHVlID0gKHM4KWN4MjU4NDBfcmVhZChjbGllbnQsIDB4NDIyKTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CiAJY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOgpAQCAtNTI3LDcgKzUxNSw3IEBACiAKIAkJaWYgKChwaXgtPndpZHRoICogMTYgPCBIc3JjKSB8fCAoSHNyYyA8IHBpeC0+d2lkdGgpIHx8CiAJCSAgICAoVmxpbmVzICogOCA8IFZzcmMpIHx8IChWc3JjIDwgVmxpbmVzKSkgewotCQkJY3gyNTg0MF9lcnIoIiVkeCVkIGlzIG5vdCBhIHZhbGlkIHNpemUhXG4iLAorCQkJdjRsX2VycihjbGllbnQsICIlZHglZCBpcyBub3QgYSB2YWxpZCBzaXplIVxuIiwKIAkJCQkgICAgcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQpOwogCQkJcmV0dXJuIC1FUkFOR0U7CiAJCX0KQEAgLTU0NSw3ICs1MzMsNyBAQAogCQllbHNlCiAJCQlmaWx0ZXIgPSAzOwogCi0JCWN4MjU4NDBfZGJnKCJkZWNvZGVyIHNldCBzaXplICVkeCVkIC0+IHNjYWxlICAldXgldVxuIiwKKwkJdjRsX2RiZygxLCBjeDI1ODQwX2RlYnVnLCBjbGllbnQsICJkZWNvZGVyIHNldCBzaXplICVkeCVkIC0+IHNjYWxlICAldXgldVxuIiwKIAkJCSAgICBwaXgtPndpZHRoLCBwaXgtPmhlaWdodCwgSFNDLCBWU0MpOwogCiAJCS8qIEhTQ0FMRT1IU0MgKi8KQEAgLTU3NCwxNyArNTYyLDk4IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgY3gyNTg0MF9xY3RybFtdID0geworCXsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9CUklHSFRORVNTLAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lICAgICAgICAgID0gIkJyaWdodG5lc3MiLAorCQkubWluaW11bSAgICAgICA9IDAsCisJCS5tYXhpbXVtICAgICAgID0gMjU1LAorCQkuc3RlcCAgICAgICAgICA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMTI4LAorCQkuZmxhZ3MgICAgICAgICA9IDAsCisJfSwgeworCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0NPTlRSQVNULAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lICAgICAgICAgID0gIkNvbnRyYXN0IiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDI1NSwKKwkJLnN0ZXAgICAgICAgICAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDY0LAorCQkuZmxhZ3MgICAgICAgICA9IDAsCisJfSwgeworCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX1NBVFVSQVRJT04sCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgICAgICAgICAgPSAiU2F0dXJhdGlvbiIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSAyNTUsCisJCS5zdGVwICAgICAgICAgID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSA2NCwKKwkJLmZsYWdzICAgICAgICAgPSAwLAorCX0sIHsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9IVUUsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgICAgICAgICAgPSAiSHVlIiwKKwkJLm1pbmltdW0gICAgICAgPSAtMTI4LAorCQkubWF4aW11bSAgICAgICA9IDEyNywKKwkJLnN0ZXAgICAgICAgICAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJCS5mbGFncyAJICAgICAgID0gMCwKKwl9LCB7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fVk9MVU1FLAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lICAgICAgICAgID0gIlZvbHVtZSIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSA2NTUzNSwKKwkJLnN0ZXAgICAgICAgICAgPSA2NTUzNS8xMDAsCisJCS5kZWZhdWx0X3ZhbHVlID0gNTg4ODAsCisJCS5mbGFncyAgICAgICAgID0gMCwKKwl9LCB7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fQkFMQU5DRSwKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICAgICAgICA9ICJCYWxhbmNlIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDY1NTM1LAorCQkuc3RlcCAgICAgICAgICA9IDY1NTM1LzEwMCwKKwkJLmRlZmF1bHRfdmFsdWUgPSAzMjc2OCwKKwkJLmZsYWdzICAgICAgICAgPSAwLAorCX0sIHsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19NVVRFLAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCS5uYW1lICAgICAgICAgID0gIk11dGUiLAorCQkubWluaW11bSAgICAgICA9IDAsCisJCS5tYXhpbXVtICAgICAgID0gMSwKKwkJLnN0ZXAgICAgICAgICAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDEsCisJCS5mbGFncyAgICAgICAgID0gMCwKKwl9LCB7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fQkFTUywKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICAgICAgICA9ICJCYXNzIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDY1NTM1LAorCQkuc3RlcCAgICAgICAgICA9IDY1NTM1LzEwMCwKKwkJLmRlZmF1bHRfdmFsdWUgPSAzMjc2OCwKKwl9LCB7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fVFJFQkxFLAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lICAgICAgICAgID0gIlRyZWJsZSIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSA2NTUzNSwKKwkJLnN0ZXAgICAgICAgICAgPSA2NTUzNS8xMDAsCisJCS5kZWZhdWx0X3ZhbHVlID0gMzI3NjgsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKIHN0YXRpYyBpbnQgY3gyNTg0MF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkgICB2b2lkICphcmcpCiB7CiAJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IHY0bDJfdHVuZXIgKnZ0ID0gYXJnOwotCWludCByZXN1bHQgPSAwOwogCiAJc3dpdGNoIChjbWQpIHsKLQljYXNlIDA6Ci0JCWJyZWFrOwotCiAjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwogCS8qIGlvY3RscyB0byBhbGxvdyBkaXJlY3QgYWNjZXNzIHRvIHRoZQogCSAqIGN4MjU4NDAgcmVnaXN0ZXJzIGZvciB0ZXN0aW5nICovCkBAIC02MTUsMTggKzY4NCwxNiBAQAogCQlyZXR1cm4gY3gyNTg0MF92YmkoY2xpZW50LCBjbWQsIGFyZyk7CiAKIAljYXNlIFZJRElPQ19JTlRfQVVESU9fQ0xPQ0tfRlJFUToKLQljYXNlIEFVRENfU0VUX0lOUFVUOgotCQlyZXN1bHQgPSBjeDI1ODQwX2F1ZGlvKGNsaWVudCwgY21kLCBhcmcpOwotCQlicmVhazsKKwkJcmV0dXJuIGN4MjU4NDBfYXVkaW8oY2xpZW50LCBjbWQsIGFyZyk7CiAKIAljYXNlIFZJRElPQ19TVFJFQU1PTjoKLQkJY3gyNTg0MF9kYmcoImVuYWJsZSBvdXRwdXRcbiIpOworCQl2NGxfZGJnKDEsIGN4MjU4NDBfZGVidWcsIGNsaWVudCwgImVuYWJsZSBvdXRwdXRcbiIpOwogCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHgxMTUsIDB4OGMpOwogCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHgxMTYsIDB4MDcpOwogCQlicmVhazsKIAogCWNhc2UgVklESU9DX1NUUkVBTU9GRjoKLQkJY3gyNTg0MF9kYmcoImRpc2FibGUgb3V0cHV0XG4iKTsKKwkJdjRsX2RiZygxLCBjeDI1ODQwX2RlYnVnLCBjbGllbnQsICJkaXNhYmxlIG91dHB1dFxuIik7CiAJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDExNSwgMHgwMCk7CiAJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDExNiwgMHgwMCk7CiAJCWJyZWFrOwpAQCAtNjM2LDI4ICs3MDMsNTggQEAKIAkJYnJlYWs7CiAKIAljYXNlIFZJRElPQ19HX0NUUkw6Ci0JCXJlc3VsdCA9IGdldF92NGxjdHJsKGNsaWVudCwgKHN0cnVjdCB2NGwyX2NvbnRyb2wgKilhcmcpOwotCQlicmVhazsKKwkJcmV0dXJuIGdldF92NGxjdHJsKGNsaWVudCwgKHN0cnVjdCB2NGwyX2NvbnRyb2wgKilhcmcpOwogCiAJY2FzZSBWSURJT0NfU19DVFJMOgotCQlyZXN1bHQgPSBzZXRfdjRsY3RybChjbGllbnQsIChzdHJ1Y3QgdjRsMl9jb250cm9sICopYXJnKTsKLQkJYnJlYWs7CisJCXJldHVybiBzZXRfdjRsY3RybChjbGllbnQsIChzdHJ1Y3QgdjRsMl9jb250cm9sICopYXJnKTsKKworCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKKwl7CisJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMgPSBhcmc7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGN4MjU4NDBfcWN0cmwpOyBpKyspCisJCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSBjeDI1ODQwX3FjdHJsW2ldLmlkKSB7CisJCQkJbWVtY3B5KHFjLCAmY3gyNTg0MF9xY3RybFtpXSwgc2l6ZW9mKCpxYykpOworCQkJCXJldHVybiAwOworCQkJfQorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAljYXNlIFZJRElPQ19HX1NURDoKIAkJKih2NGwyX3N0ZF9pZCAqKWFyZyA9IGN4MjU4NDBfZ2V0X3Y0bHN0ZChjbGllbnQpOwogCQlicmVhazsKIAogCWNhc2UgVklESU9DX1NfU1REOgotCQlyZXN1bHQgPSBzZXRfdjRsc3RkKGNsaWVudCwgKih2NGwyX3N0ZF9pZCAqKWFyZyk7CisJCXN0YXRlLT5yYWRpbyA9IDA7CisJCXJldHVybiBzZXRfdjRsc3RkKGNsaWVudCwgKih2NGwyX3N0ZF9pZCAqKWFyZyk7CisKKwljYXNlIEFVRENfU0VUX1JBRElPOgorCQlzdGF0ZS0+cmFkaW8gPSAxOwogCQlicmVhazsKIAogCWNhc2UgVklESU9DX0dfSU5QVVQ6Ci0JCSooaW50ICopYXJnID0gc3RhdGUtPmlucHV0OworCQkqKGludCAqKWFyZyA9IHN0YXRlLT52aWRfaW5wdXQ7CiAJCWJyZWFrOwogCiAJY2FzZSBWSURJT0NfU19JTlBVVDoKLQkJcmVzdWx0ID0gc2V0X2lucHV0KGNsaWVudCwgKihpbnQgKilhcmcpOworCQlyZXR1cm4gc2V0X2lucHV0KGNsaWVudCwgKihlbnVtIGN4MjU4NDBfdmlkZW9faW5wdXQgKilhcmcsIHN0YXRlLT5hdWRfaW5wdXQpOworCisJY2FzZSBWSURJT0NfU19BVURJTzoKKwl7CisJCXN0cnVjdCB2NGwyX2F1ZGlvICppbnB1dCA9IGFyZzsKKworCQlyZXR1cm4gc2V0X2lucHV0KGNsaWVudCwgc3RhdGUtPnZpZF9pbnB1dCwgaW5wdXQtPmluZGV4KTsKKwl9CisKKwljYXNlIFZJRElPQ19HX0FVRElPOgorCXsKKwkJc3RydWN0IHY0bDJfYXVkaW8gKmlucHV0ID0gYXJnOworCisJCW1lbXNldChpbnB1dCwgMCwgc2l6ZW9mKCppbnB1dCkpOworCQlpbnB1dC0+aW5kZXggPSBzdGF0ZS0+YXVkX2lucHV0OwogCQlicmVhazsKKwl9CiAKIAljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKIAkJaW5wdXRfY2hhbmdlKGNsaWVudCk7CkBAIC02NzAsNiArNzY3LDkgQEAKIAkJdTggdnByZXMgPSBjeDI1ODQwX3JlYWQoY2xpZW50LCAweDgwYSkgJiAweDEwOwogCQlpbnQgdmFsID0gMDsKIAorCQlpZiAoc3RhdGUtPnJhZGlvKQorCQkJYnJlYWs7CisKIAkJdnQtPmNhcGFiaWxpdHkgfD0KIAkJICAgIFY0TDJfVFVORVJfQ0FQX1NURVJFTyB8IFY0TDJfVFVORVJfQ0FQX0xBTkcxIHwKIAkJICAgIFY0TDJfVFVORVJfQ0FQX0xBTkcyIHwgVjRMMl9UVU5FUl9DQVBfU0FQOwpAQCAtNzI0LDEyICs4MjQsMTAgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFZJRElPQ19HX0ZNVDoKLQkJcmVzdWx0ID0gZ2V0X3Y0bGZtdChjbGllbnQsIChzdHJ1Y3QgdjRsMl9mb3JtYXQgKilhcmcpOwotCQlicmVhazsKKwkJcmV0dXJuIGdldF92NGxmbXQoY2xpZW50LCAoc3RydWN0IHY0bDJfZm9ybWF0ICopYXJnKTsKIAogCWNhc2UgVklESU9DX1NfRk1UOgotCQlyZXN1bHQgPSBzZXRfdjRsZm10KGNsaWVudCwgKHN0cnVjdCB2NGwyX2Zvcm1hdCAqKWFyZyk7Ci0JCWJyZWFrOworCQlyZXR1cm4gc2V0X3Y0bGZtdChjbGllbnQsIChzdHJ1Y3QgdjRsMl9mb3JtYXQgKilhcmcpOwogCiAJY2FzZSBWSURJT0NfSU5UX1JFU0VUOgogCQljeDI1ODQwX2luaXRpYWxpemUoY2xpZW50LCAwKTsKQEAgLTc0MSwxMSArODM5LDEwIEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJY3gyNTg0MF9lcnIoImludmFsaWQgaW9jdGwgJXhcbiIsIGNtZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC03NjUsMTcgKzg2MiwxNiBAQAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkKIAkJcmV0dXJuIDA7CiAKLQljbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNsaWVudCA9PSAwKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW1lbXNldChjbGllbnQsIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOwogCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CiAJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKIAljbGllbnQtPmRyaXZlciA9ICZpMmNfZHJpdmVyX2N4MjU4NDA7CiAJc25wcmludGYoY2xpZW50LT5uYW1lLCBzaXplb2YoY2xpZW50LT5uYW1lKSAtIDEsICJjeDI1ODQwIik7CiAKLQljeDI1ODQwX2RiZygiZGV0ZWN0aW5nIGN4MjU4NDAgY2xpZW50IG9uIGFkZHJlc3MgMHgleFxuIiwgYWRkcmVzcyA8PCAxKTsKKwl2NGxfZGJnKDEsIGN4MjU4NDBfZGVidWcsIGNsaWVudCwgImRldGVjdGluZyBjeDI1ODQwIGNsaWVudCBvbiBhZGRyZXNzIDB4JXhcbiIsIGFkZHJlc3MgPDwgMSk7CiAKIAlkZXZpY2VfaWQgPSBjeDI1ODQwX3JlYWQoY2xpZW50LCAweDEwMSkgPDwgODsKIAlkZXZpY2VfaWQgfD0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHgxMDApOwpAQCAtNzgzLDEyICs4NzksMTIgQEAKIAkvKiBUaGUgaGlnaCBieXRlIG9mIHRoZSBkZXZpY2UgSUQgc2hvdWxkIGJlCiAJICogMHg4NCBpZiBjaGlwIGlzIHByZXNlbnQgKi8KIAlpZiAoKGRldmljZV9pZCAmIDB4ZmYwMCkgIT0gMHg4NDAwKSB7Ci0JCWN4MjU4NDBfZGJnKCJjeDI1ODQwIG5vdCBmb3VuZFxuIik7CisJCXY0bF9kYmcoMSwgY3gyNTg0MF9kZWJ1ZywgY2xpZW50LCAiY3gyNTg0MCBub3QgZm91bmRcbiIpOwogCQlrZnJlZShjbGllbnQpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQljeDI1ODQwX2luZm8oImN4MjUlM3gtMiV4IGZvdW5kIEAgMHgleCAoJXMpXG4iLAorCXY0bF9pbmZvKGNsaWVudCwgImN4MjUlM3gtMiV4IGZvdW5kIEAgMHgleCAoJXMpXG4iLAogCQkgICAgKGRldmljZV9pZCAmIDB4ZmZmMCkgPj4gNCwKIAkJICAgIChkZXZpY2VfaWQgJiAweDBmKSA8IDMgPyAoZGV2aWNlX2lkICYgMHgwZikgKyAxIDogMywKIAkJICAgIGFkZHJlc3MgPDwgMSwgYWRhcHRlci0+bmFtZSk7CkBAIC04MDEsMTAgKzg5NywxMCBAQAogCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgc3RhdGUpOwogCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBjeDI1ODQwX3N0YXRlKSk7Ci0Jc3RhdGUtPmlucHV0ID0gQ1gyNTg0MF9UVU5FUjsKLQlzdGF0ZS0+YXVkY2xrX2ZyZXEgPSBWNEwyX0FVRENMS180OF9LSFo7Ci0Jc3RhdGUtPmF1ZGlvX2lucHV0ID0gQVVESU9fVFVORVI7Ci0Jc3RhdGUtPmNhcmR0eXBlID0gQ0FSRFRZUEVfUFZSMTUwOworCXN0YXRlLT52aWRfaW5wdXQgPSBDWDI1ODQwX0NPTVBPU0lURTc7CisJc3RhdGUtPmF1ZF9pbnB1dCA9IENYMjU4NDBfQVVESU84OworCXN0YXRlLT5hdWRjbGtfZnJlcSA9IDQ4MDAwOworCXN0YXRlLT5wdnIxNTBfd29ya2Fyb3VuZCA9IDA7CiAKIAljeDI1ODQwX2luaXRpYWxpemUoY2xpZW50LCAxKTsKIApAQCAtODE1LDExICs5MTEsNyBAQAogCiBzdGF0aWMgaW50IGN4MjU4NDBfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQogewotI2lmZGVmIEkyQ19DTEFTU19UVl9BTkFMT0cKIAlpZiAoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfVFZfQU5BTE9HKQotI2Vsc2UKLQlpZiAoYWRhcHRlci0+aWQgPT0gSTJDX0hXX0JfQlQ4NDgpCi0jZW5kaWYKIAkJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCAmY3gyNTg0MF9kZXRlY3RfY2xpZW50KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTg0Niw5ICs5MzgsNyBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gImN4MjU4NDAiLAogCX0sCi0KIAkuaWQgPSBJMkNfRFJJVkVSSURfQ1gyNTg0MCwKLQogCS5hdHRhY2hfYWRhcHRlciA9IGN4MjU4NDBfYXR0YWNoX2FkYXB0ZXIsCiAJLmRldGFjaF9jbGllbnQgPSBjeDI1ODQwX2RldGFjaF9jbGllbnQsCiAJLmNvbW1hbmQgPSBjeDI1ODQwX2NvbW1hbmQsCkBAIC04OTIsMTEgKzk4MiwxMyBAQAogCXU4IHByZWZfbW9kZSA9IGN4MjU4NDBfcmVhZChjbGllbnQsIDB4ODA5KTsKIAl1OCBhZmMwID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg4MGIpOwogCXU4IG11dGVfY3RsID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg4ZDMpOworCWludCB2aWRfaW5wdXQgPSBzdGF0ZS0+dmlkX2lucHV0OworCWludCBhdWRfaW5wdXQgPSBzdGF0ZS0+YXVkX2lucHV0OwogCWNoYXIgKnA7CiAKLQljeDI1ODQwX2luZm8oIlZpZGVvIHNpZ25hbDogICAgICAgICAgICAgICVzcHJlc2VudFxuIiwKKwl2NGxfaW5mbyhjbGllbnQsICJWaWRlbyBzaWduYWw6ICAgICAgICAgICAgICAlc3ByZXNlbnRcbiIsCiAJCSAgICAobWljcm9jdHJsX3ZpZGZtdCAmIDB4MTApID8gIiIgOiAibm90ICIpOwotCWN4MjU4NDBfaW5mbygiRGV0ZWN0ZWQgZm9ybWF0OiAgICAgICAgICAgJXNcbiIsCisJdjRsX2luZm8oY2xpZW50LCAiRGV0ZWN0ZWQgZm9ybWF0OiAgICAgICAgICAgJXNcbiIsCiAJCSAgICBmbXRfc3Ryc1tnZW5fc3RhdDEgJiAweGZdKTsKIAogCXN3aXRjaCAobW9kX2RldF9zdGF0MCkgewpAQCAtOTExLDcgKzEwMDMsNyBAQAogCWNhc2UgMHhmZTogcCA9ICJmb3JjZWQgbW9kZSI7IGJyZWFrOwogCWRlZmF1bHQ6IHAgPSAibm90IGRlZmluZWQiOwogCX0KLQljeDI1ODQwX2luZm8oIkRldGVjdGVkIGF1ZGlvIG1vZGU6ICAgICAgICVzXG4iLCBwKTsKKwl2NGxfaW5mbyhjbGllbnQsICJEZXRlY3RlZCBhdWRpbyBtb2RlOiAgICAgICAlc1xuIiwgcCk7CiAKIAlzd2l0Y2ggKG1vZF9kZXRfc3RhdDEpIHsKIAljYXNlIDB4MDA6IHAgPSAibm90IGRlZmluZWQiOyBicmVhazsKQEAgLTkzNywxMCArMTAyOSwxMCBAQAogCWNhc2UgMHhmZjogcCA9ICJubyBkZXRlY3RlZCBhdWRpbyBzdGFuZGFyZCI7IGJyZWFrOwogCWRlZmF1bHQ6IHAgPSAibm90IGRlZmluZWQiOwogCX0KLQljeDI1ODQwX2luZm8oIkRldGVjdGVkIGF1ZGlvIHN0YW5kYXJkOiAgICVzXG4iLCBwKTsKLQljeDI1ODQwX2luZm8oIkF1ZGlvIG11dGVkOiAgICAgICAgICAgICAgICVzXG4iLAorCXY0bF9pbmZvKGNsaWVudCwgIkRldGVjdGVkIGF1ZGlvIHN0YW5kYXJkOiAgICVzXG4iLCBwKTsKKwl2NGxfaW5mbyhjbGllbnQsICJBdWRpbyBtdXRlZDogICAgICAgICAgICAgICAlc1xuIiwKIAkJICAgIChtdXRlX2N0bCAmIDB4MikgPyAieWVzIiA6ICJubyIpOwotCWN4MjU4NDBfaW5mbygiQXVkaW8gbWljcm9jb250cm9sbGVyOiAgICAgJXNcbiIsCisJdjRsX2luZm8oY2xpZW50LCAiQXVkaW8gbWljcm9jb250cm9sbGVyOiAgICAgJXNcbiIsCiAJCSAgICAoZG93bmxvYWRfY3RsICYgMHgxMCkgPyAicnVubmluZyIgOiAic3RvcHBlZCIpOwogCiAJc3dpdGNoIChhdWRpb19jb25maWcgPj4gNCkgewpAQCAtOTYyLDcgKzEwNTQsNyBAQAogCWNhc2UgMHgwZjogcCA9ICJhdXRvbWF0aWMgZGV0ZWN0aW9uIjsgYnJlYWs7CiAJZGVmYXVsdDogcCA9ICJ1bmRlZmluZWQiOwogCX0KLQljeDI1ODQwX2luZm8oIkNvbmZpZ3VyZWQgYXVkaW8gc3RhbmRhcmQ6ICVzXG4iLCBwKTsKKwl2NGxfaW5mbyhjbGllbnQsICJDb25maWd1cmVkIGF1ZGlvIHN0YW5kYXJkOiAlc1xuIiwgcCk7CiAKIAlpZiAoKGF1ZGlvX2NvbmZpZyA+PiA0KSA8IDB4RikgewogCQlzd2l0Y2ggKGF1ZGlvX2NvbmZpZyAmIDB4RikgewpAQCAtOTc5LDcgKzEwNzEsNyBAQAogCQljYXNlIDB4MGE6IHAgPSAiU0FQIjsgYnJlYWs7CiAJCWRlZmF1bHQ6IHAgPSAidW5kZWZpbmVkIjsKIAkJfQotCQljeDI1ODQwX2luZm8oIkNvbmZpZ3VyZWQgYXVkaW8gbW9kZTogICAgICVzXG4iLCBwKTsKKwkJdjRsX2luZm8oY2xpZW50LCAiQ29uZmlndXJlZCBhdWRpbyBtb2RlOiAgICAgJXNcbiIsIHApOwogCX0gZWxzZSB7CiAJCXN3aXRjaCAoYXVkaW9fY29uZmlnICYgMHhGKSB7CiAJCWNhc2UgMHgwMDogcCA9ICJCRyI7IGJyZWFrOwpAQCAtOTk1LDMwICsxMDg3LDI3IEBACiAJCWNhc2UgMHgwZjogcCA9ICJhdXRvbWF0aWMgc3RhbmRhcmQgYW5kIG1vZGUgZGV0ZWN0aW9uIjsgYnJlYWs7CiAJCWRlZmF1bHQ6IHAgPSAidW5kZWZpbmVkIjsKIAkJfQotCQljeDI1ODQwX2luZm8oIkNvbmZpZ3VyZWQgYXVkaW8gc3lzdGVtOiAgICVzXG4iLCBwKTsKKwkJdjRsX2luZm8oY2xpZW50LCAiQ29uZmlndXJlZCBhdWRpbyBzeXN0ZW06ICAgJXNcbiIsIHApOwogCX0KIAotCWN4MjU4NDBfaW5mbygiU3BlY2lmaWVkIHN0YW5kYXJkOiAgICAgICAgJXNcbiIsCisJdjRsX2luZm8oY2xpZW50LCAiU3BlY2lmaWVkIHN0YW5kYXJkOiAgICAgICAgJXNcbiIsCiAJCSAgICB2aWRmbXRfc2VsID8gZm10X3N0cnNbdmlkZm10X3NlbF0gOiAiYXV0b21hdGljIGRldGVjdGlvbiIpOwogCi0Jc3dpdGNoIChzdGF0ZS0+aW5wdXQpIHsKLQljYXNlIENYMjU4NDBfQ09NUE9TSVRFMDogcCA9ICJDb21wb3NpdGUgMCI7IGJyZWFrOwotCWNhc2UgQ1gyNTg0MF9DT01QT1NJVEUxOiBwID0gIkNvbXBvc2l0ZSAxIjsgYnJlYWs7Ci0JY2FzZSBDWDI1ODQwX1NWSURFTzA6IHAgPSAiUy1WaWRlbyAwIjsgYnJlYWs7Ci0JY2FzZSBDWDI1ODQwX1NWSURFTzE6IHAgPSAiUy1WaWRlbyAxIjsgYnJlYWs7Ci0JY2FzZSBDWDI1ODQwX1RVTkVSOiBwID0gIlR1bmVyIjsgYnJlYWs7CisJaWYgKHZpZF9pbnB1dCA+PSBDWDI1ODQwX0NPTVBPU0lURTEgJiYKKwkgICAgdmlkX2lucHV0IDw9IENYMjU4NDBfQ09NUE9TSVRFOCkgeworCQl2NGxfaW5mbyhjbGllbnQsICJTcGVjaWZpZWQgdmlkZW8gaW5wdXQ6ICAgICBDb21wb3NpdGUgJWRcbiIsCisJCQl2aWRfaW5wdXQgLSBDWDI1ODQwX0NPTVBPU0lURTEgKyAxKTsKKwl9IGVsc2UgeworCQl2NGxfaW5mbyhjbGllbnQsICJTcGVjaWZpZWQgdmlkZW8gaW5wdXQ6ICAgICBTLVZpZGVvIChMdW1hIEluJWQsIENocm9tYSBJbiVkKVxuIiwKKwkJCSh2aWRfaW5wdXQgJiAweGYwKSA+PiA0LCAodmlkX2lucHV0ICYgMHhmMDApID4+IDgpOwogCX0KLQljeDI1ODQwX2luZm8oIlNwZWNpZmllZCBpbnB1dDogICAgICAgICAgICVzXG4iLCBwKTsKLQljeDI1ODQwX2luZm8oIlNwZWNpZmllZCBhdWRpbyBpbnB1dDogICAgICVzXG4iLAotCQkgICAgc3RhdGUtPmF1ZGlvX2lucHV0ID09IDAgPyAiVHVuZXIiIDogIkV4dGVybmFsIik7CisJaWYgKGF1ZF9pbnB1dCkgeworCQl2NGxfaW5mbyhjbGllbnQsICJTcGVjaWZpZWQgYXVkaW8gaW5wdXQ6ICAgICBUdW5lciAoSW4lZClcbiIsIGF1ZF9pbnB1dCk7CisJfSBlbHNlIHsKKwkJdjRsX2luZm8oY2xpZW50LCAiU3BlY2lmaWVkIGF1ZGlvIGlucHV0OiAgICAgRXh0ZXJuYWxcbiIpOworCX0KIAotCXN3aXRjaCAoc3RhdGUtPmF1ZGNsa19mcmVxKSB7Ci0JY2FzZSBWNEwyX0FVRENMS180NDFfS0haOiBwID0gIjQ0LjEga0h6IjsgYnJlYWs7Ci0JY2FzZSBWNEwyX0FVRENMS180OF9LSFo6IHAgPSAiNDgga0h6IjsgYnJlYWs7Ci0JY2FzZSBWNEwyX0FVRENMS18zMl9LSFo6IHAgPSAiMzIga0h6IjsgYnJlYWs7Ci0JZGVmYXVsdDogcCA9ICJ1bmRlZmluZWQiOwotCX0KLQljeDI1ODQwX2luZm8oIlNwZWNpZmllZCBhdWRpb2Nsb2NrIGZyZXE6ICVzXG4iLCBwKTsKKwl2NGxfaW5mbyhjbGllbnQsICJTcGVjaWZpZWQgYXVkaW9jbG9jayBmcmVxOiAlZCBIelxuIiwgc3RhdGUtPmF1ZGNsa19mcmVxKTsKIAogCXN3aXRjaCAocHJlZl9tb2RlICYgMHhmKSB7CiAJY2FzZSAwOiBwID0gIm1vbm8vbGFuZ3VhZ2UgQSI7IGJyZWFrOwpAQCAtMTAzMSw3ICsxMTIwLDcgQEAKIAljYXNlIDc6IHAgPSAibGFuZ3VhZ2UgQUIiOyBicmVhazsKIAlkZWZhdWx0OiBwID0gInVuZGVmaW5lZCI7CiAJfQotCWN4MjU4NDBfaW5mbygiUHJlZmVycmVkIGF1ZGlvIG1vZGU6ICAgICAgJXNcbiIsIHApOworCXY0bF9pbmZvKGNsaWVudCwgIlByZWZlcnJlZCBhdWRpbyBtb2RlOiAgICAgICVzXG4iLCBwKTsKIAogCWlmICgoYXVkaW9fY29uZmlnICYgMHhmKSA9PSAweGYpIHsKIAkJc3dpdGNoICgoYWZjMCA+PiAzKSAmIDB4MykgewpAQCAtMTA0MCw3ICsxMTI5LDcgQEAKIAkJY2FzZSAyOiBwID0gImF1dG9kZXRlY3QiOyBicmVhazsKIAkJZGVmYXVsdDogcCA9ICJ1bmRlZmluZWQiOwogCQl9Ci0JCWN4MjU4NDBfaW5mbygiU2VsZWN0ZWQgNjUgTUh6IGZvcm1hdDogICAgJXNcbiIsIHApOworCQl2NGxfaW5mbyhjbGllbnQsICJTZWxlY3RlZCA2NSBNSHogZm9ybWF0OiAgICAlc1xuIiwgcCk7CiAKIAkJc3dpdGNoIChhZmMwICYgMHg3KSB7CiAJCWNhc2UgMDogcCA9ICJjaHJvbWEiOyBicmVhazsKQEAgLTEwNTAsNiArMTEzOSw2IEBACiAJCWNhc2UgNDogcCA9ICJhdXRvZGV0ZWN0IjsgYnJlYWs7CiAJCWRlZmF1bHQ6IHAgPSAidW5kZWZpbmVkIjsKIAkJfQotCQljeDI1ODQwX2luZm8oIlNlbGVjdGVkIDQ1IE1IeiBmb3JtYXQ6ICAgICVzXG4iLCBwKTsKKwkJdjRsX2luZm8oY2xpZW50LCAiU2VsZWN0ZWQgNDUgTUh6IGZvcm1hdDogICAgJXNcbiIsIHApOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWZpcm13YXJlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1maXJtd2FyZS5jCmluZGV4IGRmOWQ1MGEuLmUxYTc4MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWZpcm13YXJlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtZmlybXdhcmUuYwpAQCAtMTUsNyArMTUsNiBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgogICovCiAKLQogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWJpdC5oPgpAQCAtMzgsNyArMzcsNyBAQAogTU9EVUxFX1BBUk1fREVTQyhmYXN0ZncsICJMb2FkIGZpcm13YXJlIGZhc3QgWzA9MTAwTUh6IDE9MzMzTUh6IChkZWZhdWx0KV0iKTsKIE1PRFVMRV9QQVJNX0RFU0MoZmlybXdhcmUsICJGaXJtd2FyZSBpbWFnZSBbZGVmYXVsdDogIiBGV0ZJTEUgIl0iKTsKIAotc3RhdGljIGlubGluZSB2b2lkIHNldF9pMmNfZGVsYXkoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGRlbGF5KQorc3RhdGljIHZvaWQgc2V0X2kyY19kZWxheShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgZGVsYXkpCiB7CiAJc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhICphbGdvZCA9IGNsaWVudC0+YWRhcHRlci0+YWxnb19kYXRhOwogCkBAIC01Miw3ICs1MSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc3RhcnRfZndfbG9hZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIHZvaWQgc3RhcnRfZndfbG9hZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCS8qIERMX0FERFJfTEI9MCBETF9BRERSX0hCPTAgKi8KIAljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg4MDAsIDB4MDApOwpAQCAtNjYsNyArNjUsNyBAQAogCQlzZXRfaTJjX2RlbGF5KGNsaWVudCwgMyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBlbmRfZndfbG9hZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIHZvaWQgZW5kX2Z3X2xvYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlpZiAoZmFzdGZ3KQogCQlzZXRfaTJjX2RlbGF5KGNsaWVudCwgMTApOwpAQCAtNzcsMzggKzc2LDQ3IEBACiAJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4ODAzLCAweDAzKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgY2hlY2tfZndfbG9hZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgc2l6ZSkKK3N0YXRpYyBpbnQgY2hlY2tfZndfbG9hZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgc2l6ZSkKIHsKIAkvKiBETF9BRERSX0hCIERMX0FERFJfTEIgKi8KIAlpbnQgcyA9IGN4MjU4NDBfcmVhZChjbGllbnQsIDB4ODAxKSA8PCA4OwogCXMgfD0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg4MDApOwogCiAJaWYgKHNpemUgIT0gcykgewotCQljeDI1ODQwX2VycigiZmlybXdhcmUgJXMgbG9hZCBmYWlsZWRcbiIsIGZpcm13YXJlKTsKKwkJdjRsX2VycihjbGllbnQsICJmaXJtd2FyZSAlcyBsb2FkIGZhaWxlZFxuIiwgZmlybXdhcmUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQljeDI1ODQwX2luZm8oImxvYWRlZCAlcyBmaXJtd2FyZSAoJWQgYnl0ZXMpXG4iLCBmaXJtd2FyZSwgc2l6ZSk7CisJdjRsX2luZm8oY2xpZW50LCAibG9hZGVkICVzIGZpcm13YXJlICglZCBieXRlcylcbiIsIGZpcm13YXJlLCBzaXplKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZndfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggKiBkYXRhLCBpbnQgc2l6ZSkKK3N0YXRpYyBpbnQgZndfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggKiBkYXRhLCBpbnQgc2l6ZSkKIHsKLQlpZiAoaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgZGF0YSwgc2l6ZSkgPCBzaXplKSB7CisJaW50IHNlbnQ7CisKKwlpZiAoKHNlbnQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBkYXRhLCBzaXplKSkgPCBzaXplKSB7CiAKIAkJaWYgKGZhc3RmdykgewotCQkJY3gyNTg0MF9lcnIoIjMzM01IeiBpMmMgZmlybXdhcmUgbG9hZCBmYWlsZWRcbiIpOworCQkJdjRsX2VycihjbGllbnQsICIzMzNNSHogaTJjIGZpcm13YXJlIGxvYWQgZmFpbGVkXG4iKTsKIAkJCWZhc3RmdyA9IDA7CiAJCQlzZXRfaTJjX2RlbGF5KGNsaWVudCwgMTApOwogCisJCQlpZiAoc2VudCA+IDIpIHsKKwkJCQl1MTYgZGxfYWRkciA9IGN4MjU4NDBfcmVhZChjbGllbnQsIDB4ODAxKSA8PCA4OworCQkJCWRsX2FkZHIgfD0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg4MDApOworCQkJCWRsX2FkZHIgLT0gc2VudCAtIDI7CisJCQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4ODAxLCBkbF9hZGRyID4+IDgpOworCQkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDgwMCwgZGxfYWRkciAmIDB4ZmYpOworCQkJfQorCiAJCQlpZiAoaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgZGF0YSwgc2l6ZSkgPCBzaXplKSB7Ci0JCQkJY3gyNTg0MF9lcnIKLQkJCQkgICAgKCIxMDBNSHogaTJjIGZpcm13YXJlIGxvYWQgZmFpbGVkXG4iKTsKKwkJCQl2NGxfZXJyKGNsaWVudCwgIjEwME1IeiBpMmMgZmlybXdhcmUgbG9hZCBmYWlsZWRcbiIpOwogCQkJCXJldHVybiAtRU5PU1lTOwogCQkJfQogCiAJCX0gZWxzZSB7Ci0JCQljeDI1ODQwX2VycigiZmlybXdhcmUgbG9hZCBpMmMgZmFpbHVyZVxuIik7CisJCQl2NGxfZXJyKGNsaWVudCwgImZpcm13YXJlIGxvYWQgaTJjIGZhaWx1cmVcbiIpOwogCQkJcmV0dXJuIC1FTk9TWVM7CiAJCX0KIApAQCAtMTI0LDcgKzEzMiw3IEBACiAJaW50IHNpemUsIHNlbmQsIHJldHZhbDsKIAogCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmdywgZmlybXdhcmUsIEZXREVWKGNsaWVudCkpICE9IDApIHsKLQkJY3gyNTg0MF9lcnIoInVuYWJsZSB0byBvcGVuIGZpcm13YXJlICVzXG4iLCBmaXJtd2FyZSk7CisJCXY0bF9lcnIoY2xpZW50LCAidW5hYmxlIHRvIG9wZW4gZmlybXdhcmUgJXNcbiIsIGZpcm13YXJlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC12YmkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLXZiaS5jCmluZGV4IDEzYmE0ZTEuLjA0ZDg3OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLXZiaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLXZiaS5jCkBAIC0yMiw3ICsyMiw3IEBACiAKICNpbmNsdWRlICJjeDI1ODQwLmgiCiAKLXN0YXRpYyBpbmxpbmUgaW50IG9kZF9wYXJpdHkodTggYykKK3N0YXRpYyBpbnQgb2RkX3Bhcml0eSh1OCBjKQogewogCWMgXj0gKGMgPj4gNCk7CiAJYyBePSAoYyA+PiAyKTsKQEAgLTMxLDcgKzMxLDcgQEAKIAlyZXR1cm4gYyAmIDE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGRlY29kZV92cHModTggKiBkc3QsIHU4ICogcCkKK3N0YXRpYyBpbnQgZGVjb2RlX3Zwcyh1OCAqIGRzdCwgdTggKiBwKQogewogCXN0YXRpYyBjb25zdCB1OCBiaXBoYXNlX3RibFtdID0gewogCQkweGYwLCAweDc4LCAweDcwLCAweGYwLCAweGI0LCAweDNjLCAweDM0LCAweGI0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLmgKaW5kZXggNDBhYTU5Zi4uZmQyMmYzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC5oCkBAIC0yNCw0OCArMjQsNjAgQEAKICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KIAotZXh0ZXJuIGludCBjeDI1ODQwX2RlYnVnOwotCi0jZGVmaW5lIGN4MjU4NDBfZGJnKGZtdCwgYXJnLi4uKSBkbyB7IGlmIChjeDI1ODQwX2RlYnVnKSBcCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXMgZGVidWcgJWQtJTA0eDogIiBmbXQsIFwKLQkgICAgICAgY2xpZW50LT5kcml2ZXItPmRyaXZlci5uYW1lLCBcCi0JICAgICAgIGkyY19hZGFwdGVyX2lkKGNsaWVudC0+YWRhcHRlciksIGNsaWVudC0+YWRkciAsICMjIGFyZyk7IH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgY3gyNTg0MF9lcnIoZm10LCBhcmcuLi4pIGRvIHsgXAotCXByaW50ayhLRVJOX0VSUiAiJXMgJWQtJTA0eDogIiBmbXQsIGNsaWVudC0+ZHJpdmVyLT5kcml2ZXIubmFtZSwgXAotCSAgICAgICBpMmNfYWRhcHRlcl9pZChjbGllbnQtPmFkYXB0ZXIpLCBjbGllbnQtPmFkZHIgLCAjIyBhcmcpOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIGN4MjU4NDBfaW5mbyhmbXQsIGFyZy4uLikgZG8geyBcCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXMgJWQtJTA0eDogIiBmbXQsIGNsaWVudC0+ZHJpdmVyLT5kcml2ZXIubmFtZSwgXAotCSAgICAgICBpMmNfYWRhcHRlcl9pZChjbGllbnQtPmFkYXB0ZXIpLCBjbGllbnQtPmFkZHIgLCAjIyBhcmcpOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIENYMjU4NDBfQ0lEX0NBUkRUWVBFIChWNEwyX0NJRF9QUklWQVRFX0JBU0UrMCkKLQotLyogVGhlIENBUkRUWVBFX1BWUjE1MF9XT1JLQVJPVU5EIGNhcmR0eXBlIGFjdGl2YXRlcyBhIHdvcmthcm91bmQgZm9yIGEKLSAgIGhhcmR3YXJlIGJ1ZyB0aGF0IGlzIHByZXNlbnQgaW4gUFZSMTUwIChhbmQgcG9zc2libGUgUFZSNTAwKSBjYXJkcyB0aGF0Ci0gICBoYXZlIGNlcnRhaW4gTlRTQyB0dW5lcnMgKHR2ZWVwcm9tIG1vZGVsIG51bWJlcnMgODUsIDk5IGFuZCAxMTIpLiBUaGUKKy8qIEVOQUJMRV9QVlIxNTBfV09SS0FST1VORCBhY3RpdmF0ZXMgYSB3b3JrYXJvdW5kIGZvciBhIGhhcmR3YXJlIGJ1ZyB0aGF0IGlzCisgICBwcmVzZW50IGluIEhhdXBwYXVnZSBQVlItMTUwIChhbmQgcG9zc2libHkgUFZSLTUwMCkgY2FyZHMgdGhhdCBoYXZlCisgICBjZXJ0YWluIE5UU0MgdHVuZXJzICh0dmVlcHJvbSB0dW5lciBtb2RlbCBudW1iZXJzIDg1LCA5OSBhbmQgMTEyKS4gVGhlCiAgICBhdWRpbyBhdXRvZGV0ZWN0IGZhaWxzIG9uIHNvbWUgY2hhbm5lbHMgZm9yIHRoZXNlIG1vZGVscyBhbmQgdGhlIHdvcmthcm91bmQKICAgIGlzIHRvIHNlbGVjdCB0aGUgYXVkaW8gc3RhbmRhcmQgZXhwbGljaXRseS4gTWFueSB0aGFua3MgdG8gSGF1cHBhdWdlIGZvcgogICAgcHJvdmlkaW5nIHRoaXMgaW5mb3JtYXRpb24uICovCi1lbnVtIGN4MjU4NDBfY2FyZHR5cGUgewotCUNBUkRUWVBFX1BWUjE1MCwKLQlDQVJEVFlQRV9QRzYwMCwKLQlDQVJEVFlQRV9QVlIxNTBfV09SS0FST1VORCwKKyNkZWZpbmUgQ1gyNTg0MF9DSURfRU5BQkxFX1BWUjE1MF9XT1JLQVJPVU5EIChWNEwyX0NJRF9QUklWQVRFX0JBU0UrMCkKKworZW51bSBjeDI1ODQwX3ZpZGVvX2lucHV0IHsKKwkvKiBDb21wb3NpdGUgdmlkZW8gaW5wdXRzIEluMS1JbjggKi8KKwlDWDI1ODQwX0NPTVBPU0lURTEgPSAxLAorCUNYMjU4NDBfQ09NUE9TSVRFMiwKKwlDWDI1ODQwX0NPTVBPU0lURTMsCisJQ1gyNTg0MF9DT01QT1NJVEU0LAorCUNYMjU4NDBfQ09NUE9TSVRFNSwKKwlDWDI1ODQwX0NPTVBPU0lURTYsCisJQ1gyNTg0MF9DT01QT1NJVEU3LAorCUNYMjU4NDBfQ09NUE9TSVRFOCwKKworCS8qIFMtVmlkZW8gaW5wdXRzIGNvbnNpc3Qgb2Ygb25lIGx1bWEgaW5wdXQgKEluMS1JbjQpIE9SZWQgd2l0aCBvbmUKKwkgICBjaHJvbWEgaW5wdXQgKEluNS1JbjgpICovCisJQ1gyNTg0MF9TVklERU9fTFVNQTEgPSAweDEwLAorCUNYMjU4NDBfU1ZJREVPX0xVTUEyID0gMHgyMCwKKwlDWDI1ODQwX1NWSURFT19MVU1BMyA9IDB4MzAsCisJQ1gyNTg0MF9TVklERU9fTFVNQTQgPSAweDQwLAorCUNYMjU4NDBfU1ZJREVPX0NIUk9NQTQgPSAweDQwMCwKKwlDWDI1ODQwX1NWSURFT19DSFJPTUE1ID0gMHg1MDAsCisJQ1gyNTg0MF9TVklERU9fQ0hST01BNiA9IDB4NjAwLAorCUNYMjU4NDBfU1ZJREVPX0NIUk9NQTcgPSAweDcwMCwKKwlDWDI1ODQwX1NWSURFT19DSFJPTUE4ID0gMHg4MDAsCisKKwkvKiBTLVZpZGVvIGFsaWFzZXMgZm9yIGNvbW1vbiBsdW1hL2Nocm9tYSBjb21iaW5hdGlvbnMgKi8KKwlDWDI1ODQwX1NWSURFTzEgPSAweDUxMCwKKwlDWDI1ODQwX1NWSURFTzIgPSAweDYyMCwKKwlDWDI1ODQwX1NWSURFTzMgPSAweDczMCwKKwlDWDI1ODQwX1NWSURFTzQgPSAweDg0MCwKIH07CiAKLWVudW0gY3gyNTg0MF9pbnB1dCB7Ci0JQ1gyNTg0MF9UVU5FUiwKLQlDWDI1ODQwX0NPTVBPU0lURTAsCi0JQ1gyNTg0MF9DT01QT1NJVEUxLAotCUNYMjU4NDBfU1ZJREVPMCwKLQlDWDI1ODQwX1NWSURFTzEKK2VudW0gY3gyNTg0MF9hdWRpb19pbnB1dCB7CisJLyogQXVkaW8gaW5wdXRzOiBzZXJpYWwgb3IgSW40LUluOCAqLworCUNYMjU4NDBfQVVESU9fU0VSSUFMLAorCUNYMjU4NDBfQVVESU80ID0gNCwKKwlDWDI1ODQwX0FVRElPNSwKKwlDWDI1ODQwX0FVRElPNiwKKwlDWDI1ODQwX0FVRElPNywKKwlDWDI1ODQwX0FVRElPOCwKIH07CiAKIHN0cnVjdCBjeDI1ODQwX3N0YXRlIHsKLQllbnVtIGN4MjU4NDBfY2FyZHR5cGUgY2FyZHR5cGU7Ci0JZW51bSBjeDI1ODQwX2lucHV0IGlucHV0OwotCWludCBhdWRpb19pbnB1dDsKLQllbnVtIHY0bDJfYXVkaW9fY2xvY2tfZnJlcSBhdWRjbGtfZnJlcTsKKwlpbnQgcHZyMTUwX3dvcmthcm91bmQ7CisJaW50IHJhZGlvOworCWVudW0gY3gyNTg0MF92aWRlb19pbnB1dCB2aWRfaW5wdXQ7CisJZW51bSBjeDI1ODQwX2F1ZGlvX2lucHV0IGF1ZF9pbnB1dDsKKwl1MzIgYXVkY2xrX2ZyZXE7CiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtODQsNiArOTYsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGN4MjU4NTAtYXVkaW8uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiBpbnQgY3gyNTg0MF9hdWRpbyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOwordm9pZCBjeDI1ODQwX2F1ZGlvX3NldF9wYXRoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogY3gyNTg1MC12YmkuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L0tjb25maWcKaW5kZXggODViYTQxMC4uNTMzMDg5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L0tjb25maWcKQEAgLTI5LDYgKzI5LDIwIEBACiAJICBZb3UgbXVzdCBhbHNvIHNlbGVjdCBvbmUgb3IgbW9yZSBEVkIvQVRTQyBkZW1vZHVsYXRvcnMuCiAJICBJZiB5b3UgYXJlIHVuc3VyZSB3aGljaCB5b3UgbmVlZCwgY2hvb3NlIGFsbCBvZiB0aGVtLgogCitjb25maWcgVklERU9fQ1g4OF9BTFNBCisJdHJpc3RhdGUgIkFMU0EgRE1BIGF1ZGlvIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSURFT19DWDg4ICYmIFNORCAmJiBFWFBFUklNRU5UQUwKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgdmlkZW80bGludXggZHJpdmVyIGZvciBkaXJlY3QgKERNQSkgYXVkaW8gb24KKwkgIENvbmV4YW50IDIzODh4IGJhc2VkIFRWIGNhcmRzLgorCSAgSXQgb25seSB3b3JrcyB3aXRoIGJvYXJkcyB3aXRoIGZ1bmN0aW9uIDAxIGVuYWJsZWQuCisJICBUbyBjaGVjayBpZiB5b3VyIGJvYXJkIHN1cHBvcnRzLCB1c2UgbHNwY2kgLW4uCisJICBJZiBzdXBwb3J0ZWQsIHlvdSBzaG91bGQgc2VlIDE0NzE6ODgwMSBvciAxNDcxOjg4MTEKKwkgIFBDSSBkZXZpY2UuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGN4ODgtYWxzYS4KKwogY29uZmlnIFZJREVPX0NYODhfRFZCX0FMTF9GUk9OVEVORFMKIAlib29sICJCdWlsZCBhbGwgc3VwcG9ydGVkIGZyb250ZW5kcyBmb3IgY3gyMzg4eCBiYXNlZCBUViBjYXJkcyIKIAlkZWZhdWx0IHkKQEAgLTM4LDYgKzUyLDcgQEAKIAlzZWxlY3QgRFZCX0NYMjI3MDIKIAlzZWxlY3QgRFZCX0xHRFQzMzBYCiAJc2VsZWN0IERWQl9OWFQyMDBYCisJc2VsZWN0IERWQl9DWDI0MTIzCiAJLS0taGVscC0tLQogCSAgVGhpcyBidWlsZHMgY3g4OC1kdmIgd2l0aCBhbGwgY3VycmVudGx5IHN1cHBvcnRlZCBmcm9udGVuZAogCSAgZGVtb2R1bGF0b3JzLiAgSWYgeW91IHdpc2ggdG8gdHdlYWsgeW91ciBjb25maWd1cmF0aW9uLCBhbmQKQEAgLTg5LDMgKzEwNCwxMiBAQAogCS0tLWhlbHAtLS0KIAkgIFRoaXMgYWRkcyBBVFNDIDhWU0IgYW5kIFFBTTY0LzI1NiBzdXBwb3J0IGZvciBjYXJkcyBiYXNlZCBvbiB0aGUKIAkgIENvbm5leGFudCAyMzg4eCBjaGlwIGFuZCB0aGUgTlhUMjAwMi9OWFQyMDA0IGRlbW9kdWxhdG9yLgorCitjb25maWcgVklERU9fQ1g4OF9EVkJfQ1gyNDEyMworCWJvb2wgIkNvbmV4YW50IENYMjQxMjMgRFZCLVMgU3VwcG9ydCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZJREVPX0NYODhfRFZCICYmICFWSURFT19DWDg4X0RWQl9BTExfRlJPTlRFTkRTCisJc2VsZWN0IERWQl9DWDI0MTIzCisJLS0taGVscC0tLQorCSAgVGhpcyBhZGRzIERWQi1TIHN1cHBvcnQgZm9yIGNhcmRzIGJhc2VkIG9uIHRoZQorCSAgQ29ubmV4YW50IDIzODh4IGNoaXAgYW5kIHRoZSBDWDI0MTIzIGRlbW9kdWxhdG9yLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L01ha2VmaWxlCmluZGV4IDU0NDAxYjAuLjZlNWVhYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvTWFrZWZpbGUKQEAgLTQsNyArNCw4IEBACiBjeDg4MDItb2Jqcwk6PSBjeDg4LW1wZWcubwogCiBvYmotJChDT05GSUdfVklERU9fQ1g4OCkgKz0gY3g4OHh4Lm8gY3g4ODAwLm8gY3g4ODAyLm8gY3g4OC1ibGFja2JpcmQubwotb2JqLSQoQ09ORklHX1ZJREVPX0NYODhfRFZCKSArPSBjeDg4LWR2Yi5vCitvYmotJChDT05GSUdfVklERU9fQ1g4OF9EVkIpICs9IGN4ODgtZHZiLm8gY3g4OC12cDMwNTQtaTJjLm8KK29iai0kKENPTkZJR19WSURFT19DWDg4X0FMU0EpICs9IGN4ODgtYWxzYS5vCiAKIEVYVFJBX0NGTEFHUyArPSAtSSQoc3JjKS8uLgogRVhUUkFfQ0ZMQUdTICs9IC1JJChzcmN0cmVlKS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQpAQCAtMTYsNSArMTcsNyBAQAogZXh0cmEtY2ZsYWdzLSQoQ09ORklHX0RWQl9MR0RUMzMwWCkgICs9IC1ESEFWRV9MR0RUMzMwWD0xCiBleHRyYS1jZmxhZ3MtJChDT05GSUdfRFZCX01UMzUyKSAgICAgKz0gLURIQVZFX01UMzUyPTEKIGV4dHJhLWNmbGFncy0kKENPTkZJR19EVkJfTlhUMjAwWCkgICArPSAtREhBVkVfTlhUMjAwWD0xCitleHRyYS1jZmxhZ3MtJChDT05GSUdfRFZCX0NYMjQxMjMpICAgKz0gLURIQVZFX0NYMjQxMjM9MQorZXh0cmEtY2ZsYWdzLSQoQ09ORklHX1ZJREVPX0NYODhfRFZCKSs9IC1ESEFWRV9WUDMwNTRfSTJDPTEKIAogRVhUUkFfQ0ZMQUdTICs9ICQoZXh0cmEtY2ZsYWdzLXkpICQoZXh0cmEtY2ZsYWdzLW0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1hbHNhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1hbHNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJlMzZhMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWFsc2EuYwpAQCAtMCwwICsxLDg0NyBAQAorLyoKKyAqCisgKiAgU3VwcG9ydCBmb3IgYXVkaW8gY2FwdHVyZQorICogIFBDSSBmdW5jdGlvbiAjMSBvZiB0aGUgY3gyMzg4eC4KKyAqCisgKiAgICAoYykgMjAwNSwyMDA2IFJpY2FyZG8gQ2VycXVlaXJhIDx2NGxAY2VycXVlaXJhLm9yZz4KKyAqICAgIChjKSAyMDA1IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBicnR1cmJvLmNvbS5icj4KKyAqICAgIEJhc2VkIG9uIGEgZHVtbXkgY3g4OCBtb2R1bGUgYnkgR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPgorICogICAgQmFzZWQgb24gZHVtbXkuYyBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworI2luY2x1ZGUgImN4ODguaCIKKyNpbmNsdWRlICJjeDg4LXJlZy5oIgorCisjZGVmaW5lIGRwcmludGsobGV2ZWwsZm10LCBhcmcuLi4pCWlmIChkZWJ1ZyA+PSBsZXZlbCkgXAorCXByaW50ayhLRVJOX0lORk8gIiVzLzE6ICIgZm10LCBjaGlwLT5jb3JlLT5uYW1lICwgIyMgYXJnKQorCisjZGVmaW5lIGRwcmludGtfY29yZShsZXZlbCxmbXQsIGFyZy4uLikJaWYgKGRlYnVnID49IGxldmVsKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzLzE6ICIgZm10LCBjaGlwLT5jb3JlLT5uYW1lICwgIyMgYXJnKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJRGF0YSB0eXBlIGRlY2xhcmF0aW9ucyAtIENhbiBiZSBtb2RlZCB0byBhIGhlYWRlciBmaWxlIGxhdGVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlc2UgY2FuIGJlIHJlcGxhY2VkIGFmdGVyIGRvbmUgKi8KKyNkZWZpbmUgTUlYRVJfQUREUl9MQVNUIE1BWF9DWDg4X0lOUFVUCisKK3N0cnVjdCBjeDg4X2F1ZGlvX2RldiB7CisJc3RydWN0IGN4ODhfY29yZSAgICAgICAgICAgKmNvcmU7CisJc3RydWN0IGN4ODhfZG1hcXVldWUgICAgICAgcTsKKworCS8qIHBjaSBpL28gKi8KKwlzdHJ1Y3QgcGNpX2RldiAgICAgICAgICAgICAqcGNpOworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgIHBjaV9yZXYscGNpX2xhdDsKKworCS8qIGF1ZGlvIGNvbnRyb2xzICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgaXJxOworCisJc25kX2NhcmRfdCAgICAgICAgICAgICAgICAgKmNhcmQ7CisKKwlzcGlubG9ja190ICAgICAgICAgICAgICAgICByZWdfbG9jazsKKworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIGRtYV9zaXplOworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIHBlcmlvZF9zaXplOworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIG51bV9wZXJpb2RzOworCisJc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiBkbWFfcmlzYzsKKworCWludCAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyX3ZvbHVtZVtNSVhFUl9BRERSX0xBU1QrMV1bMl07CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZV9zb3VyY2VbTUlYRVJfQUREUl9MQVNUKzFdWzJdOworCisJbG9uZyBpbnQgcmVhZF9jb3VudDsKKwlsb25nIGludCByZWFkX29mZnNldDsKKworCXN0cnVjdCBjeDg4X2J1ZmZlciAgICpidWY7CisKKwlsb25nIG9wZW5lZDsKKwlzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW07CisKK307Cit0eXBlZGVmIHN0cnVjdCBjeDg4X2F1ZGlvX2RldiBzbmRfY3g4OF9jYXJkX3Q7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJTW9kdWxlIGdsb2JhbCBzdGF0aWMgdmFycworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7CS8qIEluZGV4IDAtTUFYICovCitzdGF0aWMgY2hhciAqaWRbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9TVFI7CS8qIElEIGZvciB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IHsxLCBbMSAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMX07CitzdGF0aWMgc25kX2NhcmRfdCAqc25kX2N4ODhfY2FyZHNbU05EUlZfQ0FSRFNdOworCittb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlIGN4ODh4IHNvdW5kY2FyZC4gZGVmYXVsdCBlbmFibGVkLiIpOworCittb2R1bGVfcGFyYW1fYXJyYXkoaW5kZXgsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yIGN4ODh4IGNhcHR1cmUgaW50ZXJmYWNlKHMpLiIpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCQkJTW9kdWxlIG1hY3JvcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK01PRFVMRV9ERVNDUklQVElPTigiQUxTQSBkcml2ZXIgbW9kdWxlIGZvciBjeDIzODh4IGJhc2VkIFRWIGNhcmRzIik7CitNT0RVTEVfQVVUSE9SKCJSaWNhcmRvIENlcnF1ZWlyYSIpOworTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGJydHVyYm8uY29tLmJyPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7Q29uZXhhbnQsMjM4ODF9LCIKKwkJCSJ7e0NvbmV4YW50LDIzODgyfSwiCisJCQkie3tDb25leGFudCwyMzg4M30iKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWc7Cittb2R1bGVfcGFyYW0oZGVidWcsaW50LDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywiZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCQlNb2R1bGUgc3BlY2lmaWMgZnVudGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQk9BUkQgU3BlY2lmaWM6IFNldHMgYXVkaW8gRE1BCisgKi8KKworaW50IF9jeDg4X3N0YXJ0X2F1ZGlvX2RtYShzbmRfY3g4OF9jYXJkX3QgKmNoaXApCit7CisJc3RydWN0IGN4ODhfYnVmZmVyICAgKmJ1ZiA9IGNoaXAtPmJ1ZjsKKwlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlPWNoaXAtPmNvcmU7CisJc3RydWN0IHNyYW1fY2hhbm5lbCAqYXVkaW9fY2ggPSAmY3g4OF9zcmFtX2NoYW5uZWxzW1NSQU1fQ0gyNV07CisKKworCWRwcmludGsoMSwgIlN0YXJ0aW5nIGF1ZGlvIERNQSBmb3IgJWkgYnl0ZXMvbGluZSBhbmQgJWkgKCVpKSBsaW5lcyBhdCBhZGRyZXNzICUwOHhcbiIsYnVmLT5icGwsIGNoaXAtPm51bV9wZXJpb2RzLCBhdWRpb19jaC0+Zmlmb19zaXplIC8gYnVmLT5icGwsIGF1ZGlvX2NoLT5maWZvX3N0YXJ0KTsKKworCS8qIHNldHVwIGZpZm8gKyBmb3JtYXQgLSBvdXQgY2hhbm5lbCAqLworCWN4ODhfc3JhbV9jaGFubmVsX3NldHVwKGNoaXAtPmNvcmUsICZjeDg4X3NyYW1fY2hhbm5lbHNbU1JBTV9DSDI1XSwKKwkJCQlidWYtPmJwbCwgYnVmLT5yaXNjLmRtYSk7CisKKwkvKiBzZXRzIGJwbCBzaXplICovCisJY3hfd3JpdGUoTU9fQVVERF9MTkdUSCwgYnVmLT5icGwpOworCisJLyogcmVzZXQgY291bnRlciAqLworCWN4X3dyaXRlKE1PX0FVRERfR1BDTlRSTCxHUF9DT1VOVF9DT05UUk9MX1JFU0VUKTsKKworCWRwcmludGsoMSwiRW5hYmxpbmcgSVJRLCBzZXR0aW5nIG1hc2sgZnJvbSAweCV4IHRvIDB4JXhcbiIsY2hpcC0+Y29yZS0+cGNpX2lycW1hc2ssKGNoaXAtPmNvcmUtPnBjaV9pcnFtYXNrIHwgMHgwMikpOworCS8qIGVuYWJsZSBpcnFzICovCisJY3hfc2V0KE1PX1BDSV9JTlRNU0ssIGNoaXAtPmNvcmUtPnBjaV9pcnFtYXNrIHwgMHgwMik7CisKKworCS8qIEVuYWJsZXMgY29ycmVzcG9uZGluZyBiaXRzIGF0IEFVRF9JTlRfU1RBVCAqLworCWN4X3dyaXRlKE1PX0FVRF9JTlRNU0ssCisJCQkoMTw8MTYpfAorCQkJKDE8PDEyKXwKKwkJCSgxPDw0KXwKKwkJCSgxPDwwKQorCQkJKTsKKworCS8qIHN0YXJ0IGRtYSAqLworCWN4X3NldChNT19ERVZfQ05UUkwyLCAoMTw8NSkpOyAvKiBFbmFibGVzIFJpc2MgUHJvY2Vzc29yICovCisJY3hfc2V0KE1PX0FVRF9ETUFDTlRSTCwgMHgxMSk7IC8qIGF1ZGlvIGRvd25zdHJlYW0gRklGTyBhbmQgUklTQyBlbmFibGUgKi8KKworCWlmIChkZWJ1ZykKKwkJY3g4OF9zcmFtX2NoYW5uZWxfZHVtcChjaGlwLT5jb3JlLCAmY3g4OF9zcmFtX2NoYW5uZWxzW1NSQU1fQ0gyNV0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBCT0FSRCBTcGVjaWZpYzogUmVzZXRzIGF1ZGlvIERNQQorICovCitpbnQgX2N4ODhfc3RvcF9hdWRpb19kbWEoc25kX2N4ODhfY2FyZF90ICpjaGlwKQoreworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmU9Y2hpcC0+Y29yZTsKKwlkcHJpbnRrKDEsICJTdG9wcGluZyBhdWRpbyBETUFcbiIpOworCisJLyogc3RvcCBkbWEgKi8KKwljeF9jbGVhcihNT19BVURfRE1BQ05UUkwsIDB4MTEpOworCisJLyogZGlzYWJsZSBpcnFzICovCisJY3hfY2xlYXIoTU9fUENJX0lOVE1TSywgMHgwMik7CisJY3hfY2xlYXIoTU9fQVVEX0lOVE1TSywKKwkJCSgxPDwxNil8CisJCQkoMTw8MTIpfAorCQkJKDE8PDQpfAorCQkJKDE8PDApCisJCQkpOworCisJaWYgKGRlYnVnKQorCQljeDg4X3NyYW1fY2hhbm5lbF9kdW1wKGNoaXAtPmNvcmUsICZjeDg4X3NyYW1fY2hhbm5lbHNbU1JBTV9DSDI1XSk7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNQVhfSVJRX0xPT1AgMTAKKworLyoKKyAqIEJPQVJEIFNwZWNpZmljOiBJUlEgZG1hIGJpdHMKKyAqLworc3RhdGljIGNoYXIgKmN4ODhfYXVkX2lycXNbMzJdID0geworCSJkbl9yaXNjaTEiLCAidXBfcmlzY2kxIiwgInJkc19kbl9yaXNjMSIsIC8qIDAtMiAqLworCU5VTEwsCQkJCQkgIC8qIHJlc2VydmVkICovCisJImRuX3Jpc2NpMiIsICJ1cF9yaXNjaTIiLCAicmRzX2RuX3Jpc2MyIiwgLyogNC02ICovCisJTlVMTCwJCQkJCSAgLyogcmVzZXJ2ZWQgKi8KKwkiZG5mX29mIiwgInVwZl91ZiIsICJyZHNfZG5mX3VmIiwJICAvKiA4LTEwICovCisJTlVMTCwJCQkJCSAgLyogcmVzZXJ2ZWQgKi8KKwkiZG5fc3luYyIsICJ1cF9zeW5jIiwgInJkc19kbl9zeW5jIiwJICAvKiAxMi0xNCAqLworCU5VTEwsCQkJCQkgIC8qIHJlc2VydmVkICovCisJIm9wY19lcnIiLCAicGFyX2VyciIsICJyaXBfZXJyIiwJICAvKiAxNi0xOCAqLworCSJwY2lfYWJvcnQiLCAiYmVyX2lycSIsICJtY2hnX2lycSIJICAvKiAxOS0yMSAqLworfTsKKworLyoKKyAqIEJPQVJEIFNwZWNpZmljOiBUaHJlYXRzIElSUSBhdWRpbyBzcGVjaWZpYyBjYWxscworICovCitzdGF0aWMgdm9pZCBjeDg4MDFfYXVkX2lycShzbmRfY3g4OF9jYXJkX3QgKmNoaXApCit7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGNoaXAtPmNvcmU7CisJdTMyIHN0YXR1cywgbWFzazsKKwl1MzIgY291bnQ7CisKKwlzdGF0dXMgPSBjeF9yZWFkKE1PX0FVRF9JTlRTVEFUKTsKKwltYXNrICAgPSBjeF9yZWFkKE1PX0FVRF9JTlRNU0spOworCWlmICgwID09IChzdGF0dXMgJiBtYXNrKSkgeworCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCQlyZXR1cm47CisJfQorCWN4X3dyaXRlKE1PX0FVRF9JTlRTVEFULCBzdGF0dXMpOworCWlmIChkZWJ1ZyA+IDEgIHx8ICAoc3RhdHVzICYgbWFzayAmIH4weGZmKSkKKwkJY3g4OF9wcmludF9pcnFiaXRzKGNvcmUtPm5hbWUsICJpcnEgYXVkIiwKKwkJCQkgICBjeDg4X2F1ZF9pcnFzLCBzdGF0dXMsIG1hc2spOworCS8qIHJpc2Mgb3AgY29kZSBlcnJvciAqLworCWlmIChzdGF0dXMgJiAoMSA8PCAxNikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMvMDogYXVkaW8gcmlzYyBvcCBjb2RlIGVycm9yXG4iLGNvcmUtPm5hbWUpOworCQljeF9jbGVhcihNT19BVURfRE1BQ05UUkwsIDB4MTEpOworCQljeDg4X3NyYW1fY2hhbm5lbF9kdW1wKGNvcmUsICZjeDg4X3NyYW1fY2hhbm5lbHNbU1JBTV9DSDI1XSk7CisJfQorCisJLyogcmlzYzEgZG93bnN0cmVhbSAqLworCWlmIChzdGF0dXMgJiAweDAxKSB7CisJCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCQljb3VudCA9IGN4X3JlYWQoTU9fQVVERF9HUENOVCk7CisJCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJCWlmIChjaGlwLT5yZWFkX2NvdW50ID09IDApCisJCQljaGlwLT5yZWFkX2NvdW50ICs9IGNoaXAtPmRtYV9zaXplOworCX0KKworCWlmICAoY2hpcC0+cmVhZF9jb3VudCA+PSBjaGlwLT5wZXJpb2Rfc2l6ZSkgeworCQlkcHJpbnRrKDIsICJFbGFwc2luZyBwZXJpb2RcbiIpOworCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGNoaXAtPnN1YnN0cmVhbSk7CisJfQorCisJZHByaW50aygzLCJMZWF2aW5nIGF1ZGlvIElSUSBoYW5kbGVyLi4uXG4iKTsKKworCS8qIEZJWE1FOiBBbnkgb3RoZXIgc3RhdHVzIHNob3VsZCBkZXNlcnZlIGEgc3BlY2lhbCBoYW5kbGluZz8gKi8KK30KKworLyoKKyAqIEJPQVJEIFNwZWNpZmljOiBIYW5kbGVzIElSUSBjYWxscworICovCitzdGF0aWMgaXJxcmV0dXJuX3QgY3g4ODAxX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNuZF9jeDg4X2NhcmRfdCAqY2hpcCA9IGRldl9pZDsKKwlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gY2hpcC0+Y29yZTsKKwl1MzIgc3RhdHVzOworCWludCBsb29wLCBoYW5kbGVkID0gMDsKKworCWZvciAobG9vcCA9IDA7IGxvb3AgPCBNQVhfSVJRX0xPT1A7IGxvb3ArKykgeworCQlzdGF0dXMgPSBjeF9yZWFkKE1PX1BDSV9JTlRTVEFUKSAmIChjb3JlLT5wY2lfaXJxbWFzayB8IDB4MDIpOworCQlpZiAoMCA9PSBzdGF0dXMpCisJCQlnb3RvIG91dDsKKwkJZHByaW50ayggMywgImN4ODgwMV9pcnFcbiIgKTsKKwkJZHByaW50ayggMywgIiAgICBsb29wOiAlZC8lZFxuIiwgbG9vcCwgTUFYX0lSUV9MT09QICk7CisJCWRwcmludGsoIDMsICIgICAgc3RhdHVzOiAlZFxuIiwgc3RhdHVzICk7CisJCWhhbmRsZWQgPSAxOworCQljeF93cml0ZShNT19QQ0lfSU5UU1RBVCwgc3RhdHVzKTsKKworCQlpZiAoc3RhdHVzICYgMHgwMikKKwkJeworCQkJZHByaW50ayggMiwgIiAgICBBTFNBIElSUSBoYW5kbGluZ1xuIiApOworCQkJY3g4ODAxX2F1ZF9pcnEoY2hpcCk7CisJCX0KKwl9OworCisJaWYgKE1BWF9JUlFfTE9PUCA9PSBsb29wKSB7CisJCWRwcmludGsoIDAsICJjbGVhcmluZyBtYXNrXG4iICk7CisJCWRwcmludGsoMSwiJXMvMDogaXJxIGxvb3AgLS0gY2xlYXJpbmcgbWFza1xuIiwKKwkJICAgICAgIGNvcmUtPm5hbWUpOworCQljeF9jbGVhcihNT19QQ0lfSU5UTVNLLDB4MDIpOworCX0KKworIG91dDoKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCitzdGF0aWMgaW50IGRzcF9idWZmZXJfZnJlZShzbmRfY3g4OF9jYXJkX3QgKmNoaXApCit7CisJQlVHX09OKCFjaGlwLT5kbWFfc2l6ZSk7CisKKwlkcHJpbnRrKDIsIkZyZWVpbmcgYnVmZmVyXG4iKTsKKwl2aWRlb2J1Zl9kbWFfcGNpX3VubWFwKGNoaXAtPnBjaSwgJmNoaXAtPmRtYV9yaXNjKTsKKwl2aWRlb2J1Zl9kbWFfZnJlZSgmY2hpcC0+ZG1hX3Jpc2MpOworCWJ0Y3hfcmlzY21lbV9mcmVlKGNoaXAtPnBjaSwmY2hpcC0+YnVmLT5yaXNjKTsKKwlrZnJlZShjaGlwLT5idWYpOworCisJY2hpcC0+ZG1hX3NpemUgPSAwOworCisgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCQkJQUxTQSBQQ00gSW50ZXJmYWNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIERpZ2l0YWwgaGFyZHdhcmUgZGVmaW5pdGlvbgorICovCitzdGF0aWMgc25kX3BjbV9oYXJkd2FyZV90IHNuZF9jeDg4X2RpZ2l0YWxfaHcgPSB7CisJLmluZm8gPSBTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQlTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQsCisJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKworCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkucmF0ZV9taW4gPQkJNDgwMDAsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPSAxLAorCS5jaGFubmVsc19tYXggPSAyLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0gKDIqMjA0OCksCisJLnBlcmlvZF9ieXRlc19taW4gPSAyMDQ4LAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0gMjA0OCwKKwkucGVyaW9kc19taW4gPSAyLAorCS5wZXJpb2RzX21heCA9IDIsCit9OworCisvKgorICogYXVkaW8gcGNtIGNhcHR1cmUgcnVudGltZSBmcmVlCisgKi8KK3N0YXRpYyB2b2lkIHNuZF9jYXJkX2N4ODhfcnVudGltZV9mcmVlKHNuZF9wY21fcnVudGltZV90ICpydW50aW1lKQoreworfQorLyoKKyAqIGF1ZGlvIHBjbSBjYXB0dXJlIG9wZW4gY2FsbGJhY2sKKyAqLworc3RhdGljIGludCBzbmRfY3g4OF9wY21fb3BlbihzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJc25kX2N4ODhfY2FyZF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXNuZF9wY21fcnVudGltZV90ICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWludCBlcnI7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmY2hpcC0+b3BlbmVkKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBfZXJyb3I7CisKKwljaGlwLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisKKwljaGlwLT5yZWFkX2NvdW50ID0gMDsKKwljaGlwLT5yZWFkX29mZnNldCA9IDA7CisKKwlydW50aW1lLT5wcml2YXRlX2ZyZWUgPSBzbmRfY2FyZF9jeDg4X3J1bnRpbWVfZnJlZTsKKwlydW50aW1lLT5odyA9IHNuZF9jeDg4X2RpZ2l0YWxfaHc7CisKKwlyZXR1cm4gMDsKK19lcnJvcjoKKwlkcHJpbnRrKDEsIkVycm9yIG9wZW5pbmcgUENNIVxuIik7CisJY2xlYXJfYml0KDAsICZjaGlwLT5vcGVuZWQpOworCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIGF1ZGlvIGNsb3NlIGNhbGxiYWNrCisgKi8KK3N0YXRpYyBpbnQgc25kX2N4ODhfY2xvc2Uoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtKQoreworCXNuZF9jeDg4X2NhcmRfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWNsZWFyX2JpdCgwLCAmY2hpcC0+b3BlbmVkKTsKKwlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBod19wYXJhbXMgY2FsbGJhY2sKKyAqLworc3RhdGljIGludCBzbmRfY3g4OF9od19wYXJhbXMoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSwKKwkJCQkgc25kX3BjbV9od19wYXJhbXNfdCAqIGh3X3BhcmFtcykKK3sKKwlzbmRfY3g4OF9jYXJkX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IGN4ODhfYnVmZmVyICpidWY7CisKKwlpZiAoc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSkgeworCQlkc3BfYnVmZmVyX2ZyZWUoY2hpcCk7CisJCXN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEgPSBOVUxMOworCX0KKworCisJY2hpcC0+cGVyaW9kX3NpemUgPSBwYXJhbXNfcGVyaW9kX2J5dGVzKGh3X3BhcmFtcyk7CisJY2hpcC0+bnVtX3BlcmlvZHMgPSBwYXJhbXNfcGVyaW9kcyhod19wYXJhbXMpOworCWNoaXAtPmRtYV9zaXplID0gY2hpcC0+cGVyaW9kX3NpemUgKiBwYXJhbXNfcGVyaW9kcyhod19wYXJhbXMpOworCisJQlVHX09OKCFjaGlwLT5kbWFfc2l6ZSk7CisKKwlkcHJpbnRrKDEsIlNldHRpbmcgYnVmZmVyXG4iKTsKKworCWJ1ZiA9IGttYWxsb2Moc2l6ZW9mKCpidWYpLEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IGJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGJ1ZiwwLHNpemVvZigqYnVmKSk7CisKKworCWJ1Zi0+dmIubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKKwlidWYtPnZiLndpZHRoICA9IGNoaXAtPnBlcmlvZF9zaXplOworCWJ1Zi0+dmIuaGVpZ2h0ID0gY2hpcC0+bnVtX3BlcmlvZHM7CisJYnVmLT52Yi5zaXplICAgPSBjaGlwLT5kbWFfc2l6ZTsKKwlidWYtPnZiLmZpZWxkICA9IFY0TDJfRklFTERfTk9ORTsKKworCXZpZGVvYnVmX2RtYV9pbml0KCZidWYtPnZiLmRtYSk7CisJdmlkZW9idWZfZG1hX2luaXRfa2VybmVsKCZidWYtPnZiLmRtYSxQQ0lfRE1BX0ZST01ERVZJQ0UsCisJCQkoUEFHRV9BTElHTihidWYtPnZiLnNpemUpID4+IFBBR0VfU0hJRlQpKTsKKworCXZpZGVvYnVmX2RtYV9wY2lfbWFwKGNoaXAtPnBjaSwmYnVmLT52Yi5kbWEpOworCisKKwljeDg4X3Jpc2NfZGF0YWJ1ZmZlcihjaGlwLT5wY2ksICZidWYtPnJpc2MsCisJCQlidWYtPnZiLmRtYS5zZ2xpc3QsCisJCQlidWYtPnZiLndpZHRoLCBidWYtPnZiLmhlaWdodCk7CisKKwlidWYtPnJpc2Muam1wWzBdID0gY3B1X3RvX2xlMzIoUklTQ19KVU1QIHwgUklTQ19JUlExIHwgUklTQ19DTlRfSU5DKTsKKwlidWYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIoYnVmLT5yaXNjLmRtYSk7CisKKwlidWYtPnZiLnN0YXRlID0gU1RBVEVfUFJFUEFSRUQ7CisKKwlidWYtPmJwbCA9IGNoaXAtPnBlcmlvZF9zaXplOworCWNoaXAtPmJ1ZiA9IGJ1ZjsKKwljaGlwLT5kbWFfcmlzYyA9IGJ1Zi0+dmIuZG1hOworCisJZHByaW50aygxLCJCdWZmZXIgcmVhZHkgYXQgJXVcbiIsY2hpcC0+ZG1hX3Jpc2MubnJfcGFnZXMpOworCXN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEgPSBjaGlwLT5kbWFfcmlzYy52bWFsbG9jOworCXJldHVybiAwOworfQorCisvKgorICogaHcgZnJlZSBjYWxsYmFjaworICovCitzdGF0aWMgaW50IHNuZF9jeDg4X2h3X2ZyZWUoc25kX3BjbV9zdWJzdHJlYW1fdCAqIHN1YnN0cmVhbSkKK3sKKworCXNuZF9jeDg4X2NhcmRfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWlmIChzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhKSB7CisJCWRzcF9idWZmZXJfZnJlZShjaGlwKTsKKwkJc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwcmVwYXJlIGNhbGxiYWNrCisgKi8KK3N0YXRpYyBpbnQgc25kX2N4ODhfcHJlcGFyZShzbmRfcGNtX3N1YnN0cmVhbV90ICpzdWJzdHJlYW0pCit7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIHRyaWdnZXIgY2FsbGJhY2sKKyAqLworc3RhdGljIGludCBzbmRfY3g4OF9jYXJkX3RyaWdnZXIoc25kX3BjbV9zdWJzdHJlYW1fdCAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCXNuZF9jeDg4X2NhcmRfdCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCWVycj1fY3g4OF9zdGFydF9hdWRpb19kbWEoY2hpcCk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwkJZXJyPV9jeDg4X3N0b3BfYXVkaW9fZG1hKGNoaXApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnI9LUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBwb2ludGVyIGNhbGxiYWNrCisgKi8KK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfY3g4OF9wb2ludGVyKHNuZF9wY21fc3Vic3RyZWFtX3QgKnN1YnN0cmVhbSkKK3sKKwlzbmRfY3g4OF9jYXJkX3QgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc25kX3BjbV9ydW50aW1lX3QgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwlpZiAoY2hpcC0+cmVhZF9jb3VudCkgeworCQljaGlwLT5yZWFkX2NvdW50IC09IHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pOworCQljaGlwLT5yZWFkX29mZnNldCArPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKKwkJaWYgKGNoaXAtPnJlYWRfb2Zmc2V0ID09IGNoaXAtPmRtYV9zaXplKQorCQkJY2hpcC0+cmVhZF9vZmZzZXQgPSAwOworCX0KKworCWRwcmludGsoMiwgIlBvaW50ZXIgdGltZSwgd2lsbCByZXR1cm4gJWxpLCByZWFkICVsaVxuIixjaGlwLT5yZWFkX29mZnNldCxjaGlwLT5yZWFkX2NvdW50KTsKKwlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIGNoaXAtPnJlYWRfb2Zmc2V0KTsKKworfQorCisvKgorICogb3BlcmF0b3JzCisgKi8KK3N0YXRpYyBzbmRfcGNtX29wc190IHNuZF9jeDg4X3BjbV9vcHMgPSB7CisJLm9wZW4gPSBzbmRfY3g4OF9wY21fb3BlbiwKKwkuY2xvc2UgPSBzbmRfY3g4OF9jbG9zZSwKKwkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0gc25kX2N4ODhfaHdfcGFyYW1zLAorCS5od19mcmVlID0gc25kX2N4ODhfaHdfZnJlZSwKKwkucHJlcGFyZSA9IHNuZF9jeDg4X3ByZXBhcmUsCisJLnRyaWdnZXIgPSBzbmRfY3g4OF9jYXJkX3RyaWdnZXIsCisJLnBvaW50ZXIgPSBzbmRfY3g4OF9wb2ludGVyLAorfTsKKworLyoKKyAqIGNyZWF0ZSBhIFBDTSBkZXZpY2UKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgc25kX2N4ODhfcGNtKHNuZF9jeDg4X2NhcmRfdCAqY2hpcCwgaW50IGRldmljZSwgY2hhciAqbmFtZSkKK3sKKwlpbnQgZXJyOworCXNuZF9wY21fdCAqcGNtOworCisJZXJyID0gc25kX3BjbV9uZXcoY2hpcC0+Y2FyZCwgbmFtZSwgZGV2aWNlLCAwLCAxLCAmcGNtKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlwY20tPnByaXZhdGVfZGF0YSA9IGNoaXA7CisJc3RyY3B5KHBjbS0+bmFtZSwgbmFtZSk7CisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmc25kX2N4ODhfcGNtX29wcyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJCQlDT05UUk9MIElOVEVSRkFDRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHNuZF9jeDg4X2NhcHR1cmVfdm9sdW1lX2luZm8oc25kX2tjb250cm9sX3QgKmtjb250cm9sLCBzbmRfY3RsX2VsZW1faW5mb190ICppbmZvKQoreworCWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJaW5mby0+Y291bnQgPSAxOworCWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwlpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDB4M2Y7CisKKwlyZXR1cm4gMDsKK30KKworLyogT0sgLSBUT0RPOiB0ZXN0IGl0ICovCitzdGF0aWMgaW50IHNuZF9jeDg4X2NhcHR1cmVfdm9sdW1lX2dldChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp2YWx1ZSkKK3sKKwlzbmRfY3g4OF9jYXJkX3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZT1jaGlwLT5jb3JlOworCisJdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAweDNmIC0gKGN4X3JlYWQoQVVEX1ZPTF9DVEwpICYgMHgzZik7CisKKwlyZXR1cm4gMDsKK30KKworLyogT0sgLSBUT0RPOiB0ZXN0IGl0ICovCitzdGF0aWMgaW50IHNuZF9jeDg4X2NhcHR1cmVfdm9sdW1lX3B1dChzbmRfa2NvbnRyb2xfdCAqa2NvbnRyb2wsIHNuZF9jdGxfZWxlbV92YWx1ZV90ICp2YWx1ZSkKK3sKKwlzbmRfY3g4OF9jYXJkX3QgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZT1jaGlwLT5jb3JlOworCWludCB2OworCXUzMiBvbGRfY29udHJvbDsKKworCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKwlvbGRfY29udHJvbCA9IDB4M2YgLSAoY3hfcmVhZChBVURfVk9MX0NUTCkgJiAweDNmKTsKKwl2ID0gMHgzZiAtICh2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDB4M2YpOworCWN4X2FuZG9yKEFVRF9WT0xfQ1RMLCAweDNmLCB2KTsKKwlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKKworCXJldHVybiB2ICE9IG9sZF9jb250cm9sOworfQorCitzdGF0aWMgc25kX2tjb250cm9sX25ld190IHNuZF9jeDg4X2NhcHR1cmVfdm9sdW1lID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIkNhcHR1cmUgVm9sdW1lIiwKKwkuaW5mbyA9IHNuZF9jeDg4X2NhcHR1cmVfdm9sdW1lX2luZm8sCisJLmdldCA9IHNuZF9jeDg4X2NhcHR1cmVfdm9sdW1lX2dldCwKKwkucHV0ID0gc25kX2N4ODhfY2FwdHVyZV92b2x1bWVfcHV0LAorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJQmFzaWMgRmxvdyBmb3IgU291bmQgRGV2aWNlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBQQ0kgSUQgVGFibGUgLSAxNGYxOjg4MDEgYW5kIDE0ZjE6ODgxMSBtZWFucyBmdW5jdGlvbiAxOiBBdWRpbworICogT25seSBib2FyZHMgd2l0aCBlZXByb20gYW5kIGJ5dGUgMSBhdCBlZXByb209MSBoYXZlIGl0CisgKi8KKworc3RydWN0IHBjaV9kZXZpY2VfaWQgY3g4OF9hdWRpb19wY2lfdGJsW10gPSB7CisJezB4MTRmMSwweDg4MDEsUENJX0FOWV9JRCxQQ0lfQU5ZX0lELDAsMCwwfSwKKwl7MHgxNGYxLDB4ODgxMSxQQ0lfQU5ZX0lELFBDSV9BTllfSUQsMCwwLDB9LAorCXswLCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGN4ODhfYXVkaW9fcGNpX3RibCk7CisKKy8qCisgKiBDaGlwLXNwZWNpZmljIGRlc3RydWN0b3IKKyAqLworCitzdGF0aWMgaW50IHNuZF9jeDg4X2ZyZWUoc25kX2N4ODhfY2FyZF90ICpjaGlwKQoreworCisJaWYgKGNoaXAtPmlycSA+PSAwKXsKKwkJc3luY2hyb25pemVfaXJxKGNoaXAtPmlycSk7CisJCWZyZWVfaXJxKGNoaXAtPmlycSwgY2hpcCk7CisJfQorCisJY3g4OF9jb3JlX3B1dChjaGlwLT5jb3JlLGNoaXAtPnBjaSk7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvbXBvbmVudCBEZXN0cnVjdG9yCisgKi8KK3N0YXRpYyB2b2lkIHNuZF9jeDg4X2Rldl9mcmVlKHNuZF9jYXJkX3QgKiBjYXJkKQoreworCXNuZF9jeDg4X2NhcmRfdCAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKKworCXNuZF9jeDg4X2ZyZWUoY2hpcCk7Cit9CisKKworLyoKKyAqIEFsc2EgQ29uc3RydWN0b3IgLSBDb21wb25lbnQgcHJvYmUKKyAqLworCitzdGF0aWMgaW50IGRldm5vOworc3RhdGljIGludCBfX2RldmluaXQgc25kX2N4ODhfY3JlYXRlKHNuZF9jYXJkX3QgKmNhcmQsIHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJICAgIHNuZF9jeDg4X2NhcmRfdCAqKnJjaGlwKQoreworCXNuZF9jeDg4X2NhcmRfdCAgICpjaGlwOworCXN0cnVjdCBjeDg4X2NvcmUgICpjb3JlOworCWludCAgICAgICAgICAgICAgIGVycjsKKworCSpyY2hpcCA9IE5VTEw7CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcGNpX3NldF9tYXN0ZXIocGNpKTsKKworCWNoaXAgPSAoc25kX2N4ODhfY2FyZF90ICopIGNhcmQtPnByaXZhdGVfZGF0YTsKKworCWNvcmUgPSBjeDg4X2NvcmVfZ2V0KHBjaSk7CisKKwlpZiAoIXBjaV9kbWFfc3VwcG9ydGVkKHBjaSwweGZmZmZmZmZmKSkgeworCQlkcHJpbnRrKDAsICIlcy8xOiBPb3BzOiBubyAzMmJpdCBQQ0kgRE1BID8/P1xuIixjb3JlLT5uYW1lKTsKKwkJZXJyID0gLUVJTzsKKwkJY3g4OF9jb3JlX3B1dChjb3JlLHBjaSk7CisJCXJldHVybiBlcnI7CisJfQorCisKKwkvKiBwY2kgaW5pdCAqLworCWNoaXAtPmNhcmQgPSBjYXJkOworCWNoaXAtPnBjaSA9IHBjaTsKKwljaGlwLT5pcnEgPSAtMTsKKwlzcGluX2xvY2tfaW5pdCgmY2hpcC0+cmVnX2xvY2spOworCisJY3g4OF9yZXNldChjb3JlKTsKKwlpZiAoTlVMTCA9PSBjb3JlKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWtmcmVlIChjaGlwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJY2hpcC0+Y29yZSA9IGNvcmU7CisKKwkvKiBnZXQgaXJxICovCisJZXJyID0gcmVxdWVzdF9pcnEoY2hpcC0+cGNpLT5pcnEsIGN4ODgwMV9pcnEsCisJCQkgIFNBX1NISVJRIHwgU0FfSU5URVJSVVBULCBjaGlwLT5jb3JlLT5uYW1lLCBjaGlwKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkcHJpbnRrKDAsICIlczogY2FuJ3QgZ2V0IElSUSAlZFxuIiwKKwkJICAgICAgIGNoaXAtPmNvcmUtPm5hbWUsIGNoaXAtPnBjaS0+aXJxKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBwcmludCBwY2kgaW5mbyAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaSwgUENJX0NMQVNTX1JFVklTSU9OLCAmY2hpcC0+cGNpX3Jldik7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpLCBQQ0lfTEFURU5DWV9USU1FUiwgICZjaGlwLT5wY2lfbGF0KTsKKworCWRwcmludGsoMSwiQUxTQSAlcy8laTogZm91bmQgYXQgJXMsIHJldjogJWQsIGlycTogJWQsICIKKwkgICAgICAgImxhdGVuY3k6ICVkLCBtbWlvOiAweCVseFxuIiwgY29yZS0+bmFtZSwgZGV2bm8sCisJICAgICAgIHBjaV9uYW1lKHBjaSksIGNoaXAtPnBjaV9yZXYsIHBjaS0+aXJxLAorCSAgICAgICBjaGlwLT5wY2lfbGF0LHBjaV9yZXNvdXJjZV9zdGFydChwY2ksMCkpOworCisJY2hpcC0+aXJxID0gcGNpLT5pcnE7CisJc3luY2hyb25pemVfaXJxKGNoaXAtPmlycSk7CisKKwlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CisKKwkqcmNoaXAgPSBjaGlwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGN4ODhfYXVkaW9faW5pdGRldihzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCXNuZF9jYXJkX3QgICAgICAgKmNhcmQ7CisJc25kX2N4ODhfY2FyZF90ICAqY2hpcDsKKwlpbnQgICAgICAgICAgICAgIGVycjsKKworCWlmIChkZXZubyA+PSBTTkRSVl9DQVJEUykKKwkJcmV0dXJuICgtRU5PREVWKTsKKworCWlmICghZW5hYmxlW2Rldm5vXSkgeworCQkrK2Rldm5vOworCQlyZXR1cm4gKC1FTk9FTlQpOworCX0KKworCWNhcmQgPSBzbmRfY2FyZF9uZXcoaW5kZXhbZGV2bm9dLCBpZFtkZXZub10sIFRISVNfTU9EVUxFLCBzaXplb2Yoc25kX2N4ODhfY2FyZF90KSk7CisJaWYgKCFjYXJkKQorCQlyZXR1cm4gKC1FTk9NRU0pOworCisJY2FyZC0+cHJpdmF0ZV9mcmVlID0gc25kX2N4ODhfZGV2X2ZyZWU7CisKKwllcnIgPSBzbmRfY3g4OF9jcmVhdGUoY2FyZCwgcGNpLCAmY2hpcCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiAoZXJyKTsKKworCWVyciA9IHNuZF9jeDg4X3BjbShjaGlwLCAwLCAiQ1g4OCBEaWdpdGFsIik7CisKKwlpZiAoZXJyIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gKGVycik7CisJfQorCisJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfY3g4OF9jYXB0dXJlX3ZvbHVtZSwgY2hpcCkpOworCWlmIChlcnIgPCAwKSB7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCXJldHVybiAoZXJyKTsKKwl9CisKKwlzdHJjcHkgKGNhcmQtPmRyaXZlciwgIkNYODh4Iik7CisJc3ByaW50ZihjYXJkLT5zaG9ydG5hbWUsICJDb25leGFudCBDWCV4IiwgcGNpLT5kZXZpY2UpOworCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAlI2x4IiwKKwkJY2FyZC0+c2hvcnRuYW1lLCBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKSk7CisJc3RyY3B5IChjYXJkLT5taXhlcm5hbWUsICJDWDg4Iik7CisKKwlkcHJpbnRrICgwLCAiJXMvJWk6IEFMU0Egc3VwcG9ydCBmb3IgY3gyMzg4eCBib2FyZHNcbiIsCisJICAgICAgIGNhcmQtPmRyaXZlcixkZXZubyk7CisKKwllcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKKwlpZiAoZXJyIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gKGVycik7CisJfQorCXNuZF9jeDg4X2NhcmRzW2Rldm5vXSA9IGNhcmQ7CisKKwlwY2lfc2V0X2RydmRhdGEocGNpLGNhcmQpOworCisJZGV2bm8rKzsKKwlyZXR1cm4gMDsKK30KKy8qCisgKiBBTFNBIGRlc3RydWN0b3IKKyAqLworc3RhdGljIHZvaWQgX19kZXZleGl0IGN4ODhfYXVkaW9fZmluaWRldihzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCXN0cnVjdCBjeDg4X2F1ZGlvX2RldiAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2kpOworCisJc25kX2NhcmRfZnJlZSgodm9pZCAqKWNhcmQpOworCisJcGNpX3NldF9kcnZkYXRhKHBjaSwgTlVMTCk7CisKKwlkZXZuby0tOworfQorCisvKgorICogUENJIGRyaXZlciBkZWZpbml0aW9uCisgKi8KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGN4ODhfYXVkaW9fcGNpX2RyaXZlciA9IHsKKwkubmFtZSAgICAgPSAiY3g4OF9hdWRpbyIsCisJLmlkX3RhYmxlID0gY3g4OF9hdWRpb19wY2lfdGJsLAorCS5wcm9iZSAgICA9IGN4ODhfYXVkaW9faW5pdGRldiwKKwkucmVtb3ZlICAgPSBjeDg4X2F1ZGlvX2ZpbmlkZXYsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJCUxJTlVYIE1PRFVMRSBJTklUCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIG1vZHVsZSBpbml0CisgKi8KK3N0YXRpYyBpbnQgY3g4OF9hdWRpb19pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzg4eCBhbHNhIGRyaXZlciB2ZXJzaW9uICVkLiVkLiVkIGxvYWRlZFxuIiwKKwkgICAgICAgKENYODhfVkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4ZmYsCisJICAgICAgIChDWDg4X1ZFUlNJT05fQ09ERSA+PiAgOCkgJiAweGZmLAorCSAgICAgICBDWDg4X1ZFUlNJT05fQ09ERSAmIDB4ZmYpOworI2lmZGVmIFNOQVBTSE9UCisJcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzg4eDogc25hcHNob3QgZGF0ZSAlMDRkLSUwMmQtJTAyZFxuIiwKKwkgICAgICAgU05BUFNIT1QvMTAwMDAsIChTTkFQU0hPVC8xMDApJTEwMCwgU05BUFNIT1QlMTAwKTsKKyNlbmRpZgorCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZjeDg4X2F1ZGlvX3BjaV9kcml2ZXIpOworfQorCisvKgorICogbW9kdWxlIHJlbW92ZQorICovCitzdGF0aWMgdm9pZCBjeDg4X2F1ZGlvX2Zpbmkodm9pZCkKK3sKKworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmY3g4OF9hdWRpb19wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoY3g4OF9hdWRpb19pbml0KTsKK21vZHVsZV9leGl0KGN4ODhfYXVkaW9fZmluaSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1ibGFja2JpcmQuYwppbmRleCA3NGU1N2E1Li5hNTAyYTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1ibGFja2JpcmQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1ibGFja2JpcmQuYwpAQCAtMzIsMTAgKzMyLDEwIEBACiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KIAogI2luY2x1ZGUgImN4ODguaCIKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogCiBNT0RVTEVfREVTQ1JJUFRJT04oImRyaXZlciBmb3IgY3gyMzg4eC9jeDIzNDE2IGJhc2VkIG1wZWcgZW5jb2RlciBjYXJkcyIpOwotTU9EVUxFX0FVVEhPUigiSmVsbGUgRm9rcyA8amVsbGVAZm9rcy44bS5jb20+Iik7Ci1NT0RVTEVfQVVUSE9SKCJHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdIik7CitNT0RVTEVfQVVUSE9SKCJKZWxsZSBGb2tzIDxqZWxsZUBmb2tzLjhtLmNvbT4sIEdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4gW1N1U0UgTGFic10iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBtcGVnYnVmcyA9IDMyOwpAQCAtMTM3NSw3ICsxMzc1LDcgQEAKIAlzdHJ1Y3QgY3g4OF9jb3JlICAqY29yZSA9IGRldi0+Y29yZTsKIAogCWlmIChkZWJ1ZyA+IDEpCi0JCWN4ODhfcHJpbnRfaW9jdGwoY29yZS0+bmFtZSxjbWQpOworCQl2NGxfcHJpbnRfaW9jdGwoY29yZS0+bmFtZSxjbWQpOwogCiAJc3dpdGNoIChjbWQpIHsKIApAQCAtMTUzOSwxMCArMTUzOSw5IEBACiAJZHByaW50aygxLCJvcGVuIG1pbm9yPSVkXG4iLG1pbm9yKTsKIAogCS8qIGFsbG9jYXRlICsgaW5pdGlhbGl6ZSBwZXIgZmlsZWhhbmRsZSBkYXRhICovCi0JZmggPSBrbWFsbG9jKHNpemVvZigqZmgpLEdGUF9LRVJORUwpOworCWZoID0ga3phbGxvYyhzaXplb2YoKmZoKSxHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCA9PSBmaCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KGZoLDAsc2l6ZW9mKCpmaCkpOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZoOwogCWZoLT5kZXYgICAgICA9IGRldjsKIApAQCAtMTY3OCwxMCArMTY3Nyw5IEBACiAJCWdvdG8gZmFpbF9jb3JlOwogCiAJZXJyID0gLUVOT01FTTsKLQlkZXYgPSBrbWFsbG9jKHNpemVvZigqZGV2KSxHRlBfS0VSTkVMKTsKKwlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSxHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCA9PSBkZXYpCiAJCWdvdG8gZmFpbF9jb3JlOwotCW1lbXNldChkZXYsMCxzaXplb2YoKmRldikpOwogCWRldi0+cGNpID0gcGNpX2RldjsKIAlkZXYtPmNvcmUgPSBjb3JlOwogCWRldi0+d2lkdGggPSA3MjA7CkBAIC0xNjg5LDYgKzE2ODcsMTggQEAKIAltZW1jcHkoJmRldi0+cGFyYW1zLCZkZWZhdWx0X21wZWdfcGFyYW1zLHNpemVvZihkZWZhdWx0X21wZWdfcGFyYW1zKSk7CiAJbWVtY3B5KCZkZXYtPmRucl9wYXJhbXMsJmRlZmF1bHRfZG5yX3BhcmFtcyxzaXplb2YoZGVmYXVsdF9kbnJfcGFyYW1zKSk7CiAKKwlpZiAoY29yZS0+Ym9hcmQgPT0gQ1g4OF9CT0FSRF9IQVVQUEFVR0VfUk9TTFlOKSB7CisKKwkJaWYgKGNvcmUtPnR1bmVyX2Zvcm1hdHMgJiBWNEwyX1NURF81MjVfNjApIHsKKwkJCWRldi0+aGVpZ2h0ID0gNDgwOworCQkJZGV2LT5wYXJhbXMudmlfZnJhbWVfcmF0ZSA9IDMwOworCQl9IGVsc2UgeworCQkJZGV2LT5oZWlnaHQgPSA1NzY7CisJCQlkZXYtPnBhcmFtcy52aV9mcmFtZV9yYXRlID0gMjU7CisJCX0KKworCX0KKwogCWVyciA9IGN4ODgwMl9pbml0X2NvbW1vbihkZXYpOwogCWlmICgwICE9IGVycikKIAkJZ290byBmYWlsX2ZyZWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYwppbmRleCA5NTE3MDlhLi5hZDJmNTY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMKQEAgLTYxMSwxMiArNjExLDEyIEBACiAJCS5pbnB1dCAgICAgICAgICA9IHt7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgID0gMCwKLQkJCS5ncGlvMCAgPSAweGVkMTIsICAvKiBpbnRlcm5hbCBkZWNvZGVyICovCisJCQkuZ3BpbzAgID0gMHhlZDFhLAogCQkJLmdwaW8yICA9IDB4MDBmZiwKIAkJfSx7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0RFQlVHLAogCQkJLnZtdXggICA9IDAsCi0JCQkuZ3BpbzAgID0gMHhmZjAxLCAgLyogbW9ubyBmcm9tIHR1bmVyIGNoaXAgKi8KKwkJCS5ncGlvMCAgPSAweGZmMDEsCiAJCX0sewogCQkJLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICA9IDEsCkBAIC03MDgsNyArNzA4LDcgQEAKIAl9LAogCVtDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xEX1RdID0gewogCQkubmFtZSAgICAgICAgICAgPSAiRFZpQ08gRnVzaW9uSERUViAzIEdvbGQtVCIsCi0JCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RIT01TT05fRFRUNzYxMSwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfVEhPTVNPTl9EVFQ3NjFYLAogCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKIAkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCkBAIC04OTcsNiArODk3LDE1OCBAQAogCQkJLmdwaW8zICA9IDB4MDAwMCwKIAkJfX0sCiAJfSwKKwlbQ1g4OF9CT0FSRF9IQVVQUEFVR0VfTk9WQVNQTFVTX1MxXSA9IHsKKwkJLm5hbWUJCT0gIkhhdXBwYXVnZSBOb3ZhLVMtUGx1cyBEVkItUyIsCisJCS50dW5lcl90eXBlCT0gVFVORVJfQUJTRU5ULAorCQkucmFkaW9fdHlwZQk9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLmlucHV0CQk9IHt7CisJCQkudHlwZQk9IENYODhfVk1VWF9EVkIsCisJCQkudm11eAk9IDAsCisJCX0seworCQkJLnR5cGUJPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4CT0gMSwKKwkJfSx7CisJCQkudHlwZQk9IENYODhfVk1VWF9TVklERU8sCisJCQkudm11eAk9IDIsCisJCX19LAorCQkuZHZiCQk9IDEsCisJfSwKKwlbQ1g4OF9CT0FSRF9IQVVQUEFVR0VfTk9WQVNFMl9TMV0gPSB7CisJCS5uYW1lCQk9ICJIYXVwcGF1Z2UgTm92YS1TRTIgRFZCLVMiLAorCQkudHVuZXJfdHlwZQk9IFRVTkVSX0FCU0VOVCwKKwkJLnJhZGlvX3R5cGUJPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5pbnB1dAkJPSB7eworCQkJLnR5cGUJPSBDWDg4X1ZNVVhfRFZCLAorCQkJLnZtdXgJPSAwLAorCQl9fSwKKwkJLmR2YgkJPSAxLAorCX0sCisJW0NYODhfQk9BUkRfS1dPUkxEX0RWQlNfMTAwXSA9IHsKKwkJLm5hbWUJCT0gIktXb3JsZCBEVkItUyAxMDAiLAorCQkudHVuZXJfdHlwZQk9IFRVTkVSX0FCU0VOVCwKKwkJLnJhZGlvX3R5cGUJPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5pbnB1dAkJPSB7eworCQkJLnR5cGUJPSBDWDg4X1ZNVVhfRFZCLAorCQkJLnZtdXgJPSAwLAorCQl9LHsKKwkJCS50eXBlCT0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCisJCQkudm11eAk9IDEsCisJCX0seworCQkJLnR5cGUJPSBDWDg4X1ZNVVhfU1ZJREVPLAorCQkJLnZtdXgJPSAyLAorCQl9fSwKKwkJLmR2YgkJPSAxLAorCX0sCisJW0NYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjExMDBdID0geworCQkubmFtZQkJPSAiSGF1cHBhdWdlIFdpblRWLUhWUjExMDAgRFZCLVQvSHlicmlkIiwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GTUQxMjE2TUVfTUszLAorCQkucmFkaW9fdHlwZQk9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAorCQkuaW5wdXQJCT0ge3sKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKKwkJCS52bXV4ICAgPSAwLAorCQl9LHsKKwkJCS50eXBlCT0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCisJCQkudm11eAk9IDEsCisJCX0seworCQkJLnR5cGUJPSBDWDg4X1ZNVVhfU1ZJREVPLAorCQkJLnZtdXgJPSAyLAorCQl9fSwKKwkJLyogZml4bWU6IEFkZCByYWRpbyBzdXBwb3J0ICovCisJCS5kdmIJCT0gMSwKKwl9LAorCVtDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlIxMTAwTFBdID0geworCQkubmFtZQkJPSAiSGF1cHBhdWdlIFdpblRWLUhWUjExMDAgRFZCLVQvSHlicmlkIChMb3cgUHJvZmlsZSkiLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNRDEyMTZNRV9NSzMsCisJCS5yYWRpb190eXBlCT0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCisJCS5pbnB1dAkJPSB7eworCQkJLnR5cGUgICA9IENYODhfVk1VWF9URUxFVklTSU9OLAorCQkJLnZtdXggICA9IDAsCisJCX0seworCQkJLnR5cGUJPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4CT0gMSwKKwkJfX0sCisJCS8qIGZpeG1lOiBBZGQgcmFkaW8gc3VwcG9ydCAqLworCQkuZHZiCQk9IDEsCisJfSwKKwlbQ1g4OF9CT0FSRF9ETlRWX0xJVkVfRFZCX1RfUFJPXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gImRpZ2l0YWxub3cgRE5UViBMaXZlISBEVkItVCBQcm8iLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNRDEyMTZNRV9NSzMsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5UIHwgVERBOTg4N19QT1JUMV9BQ1RJVkUgfAorCQkJCSAgVERBOTg4N19QT1JUMl9BQ1RJVkUsCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eCAgID0gMCwKKwkJCS5ncGlvMCAgPSAweGY4MDgwOCwKKwkJfSx7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCisJCQkudm11eCAgID0gMSwKKwkJCS5ncGlvMAk9IDB4ZjgwODA4LAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAorCQkJLnZtdXggICA9IDIsCisJCQkuZ3BpbzAJPSAweGY4MDgwOCwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCSAudHlwZSAgPSBDWDg4X1JBRElPLAorCQkJIC5ncGlvMCA9IDB4ZjgwODA4LAorCQl9LAorCQkuZHZiICAgICAgICAgICAgPSAxLAorCX0sCisJW0NYODhfQk9BUkRfS1dPUkxEX0RWQl9UX0NYMjI3MDJdID0geworCQkvKiBLd29ybGQgVi1zdHJlYW0gWHBlcnQgRFZCLVQgd2l0aCBUaG9tc29uIHR1bmVyICovCisJCS8qIERUVCA3NTc5IENvbmV4YW50IENYMjI3MDItMTkgQ29uZXhhbnQgQ1gyMzg4eCAgKi8KKwkJLyogTWFuZW50aSBNYXJjbyA8bWFyY29fbWFuZW50aUBjb2xtYW4uaXQ+ICovCisJCS5uYW1lICAgICAgICAgICA9ICJLV29ybGQvVlN0cmVhbSBYUGVydCBEVkItVCB3aXRoIGN4MjI3MDIiLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BQlNFTlQsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLmlucHV0ICAgICAgICAgID0ge3sKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4ICAgPSAxLAorCQkJLmdwaW8wICA9IDB4MDcwMCwKKwkJCS5ncGlvMiAgPSAweDAxMDEsCisJCX0seworCQkJLnR5cGUgICA9IENYODhfVk1VWF9TVklERU8sCisJCQkudm11eCAgID0gMiwKKwkJCS5ncGlvMCAgPSAweDA3MDAsCisJCQkuZ3BpbzIgID0gMHgwMTAxLAorCQl9fSwKKwkJLmR2YiAgICAgICAgICAgID0gMSwKKwl9LAorCVtDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfRFZCX1RfRFVBTF0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJEVmlDTyBGdXNpb25IRFRWIERWQi1UIER1YWwgRGlnaXRhbCIsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwgLyogTm8gYW5hbG9nIHR1bmVyICovCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLmlucHV0ICAgICAgICAgID0ge3sKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4ICAgPSAxLAorCQkJLmdwaW8wICA9IDB4MDAwMDI3ZGYsCisJCSB9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAorCQkJLnZtdXggICA9IDIsCisJCQkuZ3BpbzAgID0gMHgwMDAwMjdkZiwKKwkJfX0sCisJCS5kdmIgICAgICAgICAgICA9IDEsCisJfSwKKwogfTsKIGNvbnN0IHVuc2lnbmVkIGludCBjeDg4X2Jjb3VudCA9IEFSUkFZX1NJWkUoY3g4OF9ib2FyZHMpOwogCkBAIC0xMDQ0LDYgKzExOTYsNTkgQEAKIAkJLnN1YnZlbmRvciA9IDB4MTQ2MSwKIAkJLnN1YmRldmljZSA9IDB4MDAwYSwKIAkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfQVZFUlRWXzMwMywKKwl9LHsKKwkJLnN1YnZlbmRvciA9IDB4MDA3MCwKKwkJLnN1YmRldmljZSA9IDB4OTIwMCwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfSEFVUFBBVUdFX05PVkFTRTJfUzEsCisJfSx7CisJCS5zdWJ2ZW5kb3IgPSAweDAwNzAsCisJCS5zdWJkZXZpY2UgPSAweDkyMDEsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9OT1ZBU1BMVVNfUzEsCisJfSx7CisJCS5zdWJ2ZW5kb3IgPSAweDAwNzAsCisJCS5zdWJkZXZpY2UgPSAweDkyMDIsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9OT1ZBU1BMVVNfUzEsCisJfSx7CisJCS5zdWJ2ZW5kb3IgPSAweDE3ZGUsCisJCS5zdWJkZXZpY2UgPSAweDA4YjIsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0tXT1JMRF9EVkJTXzEwMCwKKwl9LHsKKwkJLnN1YnZlbmRvciA9IDB4MDA3MCwKKwkJLnN1YmRldmljZSA9IDB4OTQwMCwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjExMDAsCisJfSx7CisJCS5zdWJ2ZW5kb3IgPSAweDAwNzAsCisJCS5zdWJkZXZpY2UgPSAweDk0MDIsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlIxMTAwLAorCX0seworCQkuc3VidmVuZG9yID0gMHgwMDcwLAorCQkuc3ViZGV2aWNlID0gMHg5ODAwLAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMTEwMExQLAorCX0seworCQkuc3VidmVuZG9yID0gMHgwMDcwLAorCQkuc3ViZGV2aWNlID0gMHg5ODAyLAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMTEwMExQLAorCX0seworCQkuc3VidmVuZG9yID0gMHgwMDcwLAorCQkuc3ViZGV2aWNlID0gMHg5MDAxLAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9IQVVQUEFVR0VfRFZCX1QxLAorCX0seworCQkuc3VidmVuZG9yID0gMHgxODIyLAorCQkuc3ViZGV2aWNlID0gMHgwMDI1LAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9ETlRWX0xJVkVfRFZCX1RfUFJPLAorCX0seworCQkuc3VidmVuZG9yID0gMHgxN2RlLAorCQkuc3ViZGV2aWNlID0gMHgwOGExLAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9LV09STERfRFZCX1RfQ1gyMjcwMiwKKwl9LHsKKwkJLnN1YnZlbmRvciA9IDB4MThhYywKKwkJLnN1YmRldmljZSA9IDB4ZGI1MCwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl9EVkJfVF9EVUFMLAorCX0seworCQkuc3VidmVuZG9yID0gMHgxOGFjLAorCQkuc3ViZGV2aWNlID0gMHhkYjExLAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX1BMVVMsCisJCS8qIFJlLWJyYW5kZWQgRFZpQ086IFVsdHJhVmlldyBEVkItVCBQbHVzICovCiAJfSwKIH07CiBjb25zdCB1bnNpZ25lZCBpbnQgY3g4OF9pZGNvdW50ID0gQVJSQVlfU0laRShjeDg4X3N1Ymlkcyk7CkBAIC0xMDc1LDIwICsxMjgwLDE5IEBACiAJICAgICAgIGNvcmUtPm5hbWUsIGNvcmUtPnR1bmVyX3R5cGUsIGVlcHJvbV9kYXRhWzBdKTsKIH0KIAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCiBzdGF0aWMgdm9pZCBoYXVwcGF1Z2VfZWVwcm9tKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIHU4ICplZXByb21fZGF0YSkKIHsKIAlzdHJ1Y3QgdHZlZXByb20gdHY7CiAKIAl0dmVlcHJvbV9oYXVwcGF1Z2VfYW5hbG9nKCZjb3JlLT5pMmNfY2xpZW50LCAmdHYsIGVlcHJvbV9kYXRhKTsKIAljb3JlLT50dW5lcl90eXBlID0gdHYudHVuZXJfdHlwZTsKKwljb3JlLT50dW5lcl9mb3JtYXRzID0gdHYudHVuZXJfZm9ybWF0czsKIAljb3JlLT5oYXNfcmFkaW8gID0gdHYuaGFzX3JhZGlvOwogCiAJLyogTWFrZSBzdXJlIHdlIHN1cHBvcnQgdGhlIGJvYXJkIG1vZGVsICovCiAJc3dpdGNoICh0di5tb2RlbCkKIAl7CisJY2FzZSAyODU1MjogLyogV2luVFYtUFZSICdSb3NseW4nIChObyBJUikgKi8KIAljYXNlIDkwMDAyOiAvKiBOb3ZhLVQtUENJICg5MDAyKSAqLwogCWNhc2UgOTIwMDE6IC8qIE5vdmEtUy1QbHVzIChWaWRlbyBhbmQgSVIpICovCiAJY2FzZSA5MjAwMjogLyogTm92YS1TLVBsdXMgKFZpZGVvIGFuZCBJUikgKi8KQEAgLTEwOTYsNyArMTMwMCw5IEBACiAJY2FzZSA5MDUwMDogLyogTm92YS1ULVBDSSAob2VtKSAqLwogCWNhc2UgOTA1MDE6IC8qIE5vdmEtVC1QQ0kgKG9lbS9JUikgKi8KIAljYXNlIDkyMDAwOiAvKiBOb3ZhLVNFMiAoT0VNLCBObyBWaWRlbyBvciBJUikgKi8KLQorCWNhc2UgOTQwMDk6IC8qIFdpblRWLUhWUjExMDAgKFZpZGVvIGFuZCBJUiBSZXRhaWwpICovCisJY2FzZSA5NDUwMTogLyogV2luVFYtSFZSMTEwMCAoVmlkZW8gYW5kIElSIE9FTSkgKi8KKwljYXNlIDk4NTU5OiAvKiBXaW5UVi1IVlIxMTAwTFAgKFZpZGVvIG5vIElSLCBSZXRhaWwgLSBMb3cgUHJvZmlsZSkgKi8KIAkJLyoga25vd24gKi8KIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTEyMTEsMTIgKzE0MTcsMjEgQEAKIAkJaWYgKDAgPT0gY29yZS0+aTJjX3JjKQogCQkJbGVhZHRla19lZXByb20oY29yZSxlZXByb20pOwogCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX05PVkFTUExVU19TMToKKwljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX05PVkFTRTJfUzE6CiAJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9EVkJfVDE6CisJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlIxMTAwOgorCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMTEwMExQOgogCQlpZiAoMCA9PSBjb3JlLT5pMmNfcmMpCiAJCQloYXVwcGF1Z2VfZWVwcm9tKGNvcmUsZWVwcm9tKTsKIAkJYnJlYWs7CisJY2FzZSBDWDg4X0JPQVJEX0tXT1JMRF9EVkJTXzEwMDoKKwkJY3hfd3JpdGUoTU9fR1AwX0lPLCAweDAwMDAwN2Y4KTsKKwkJY3hfd3JpdGUoTU9fR1AxX0lPLCAweDAwMDAwMDAxKTsKKwkJYnJlYWs7CiAJY2FzZSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfRFZCX1QxOgogCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX1BMVVM6CisJY2FzZSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfRFZCX1RfRFVBTDoKIAkJLyogR1BJTzA6MCBpcyBob29rZWQgdG8gbXQzNTIgcmVzZXQgcGluICovCiAJCWN4X3NldChNT19HUDBfSU8sIDB4MDAwMDAxMDEpOwogCQljeF9jbGVhcihNT19HUDBfSU8sIDB4MDAwMDAwMDEpOwpAQCAtMTIzMiw2ICsxNDQ3LDkgQEAKIAkJY3hfY2xlYXIoTU9fR1AwX0lPLCAweDAwMDAwMDA3KTsKIAkJY3hfc2V0KE1PX0dQMl9JTywgMHgwMDAwMDEwMSk7CiAJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9ETlRWX0xJVkVfRFZCX1RfUFJPOgorCQljeF93cml0ZShNT19HUDBfSU8sIDB4MDAwODA4MDgpOworCQlicmVhazsKIAljYXNlIENYODhfQk9BUkRfQVRJX0hEVFZXT05ERVI6CiAJCWlmICgwID09IGNvcmUtPmkyY19yYykgewogCQkJLyogZW5hYmxlIHR1bmVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMKaW5kZXggYmI2ZWI1NC4uOGQ2ZDZhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNvcmUuYwpAQCAtMzIsOCArMzIsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlICJjeDg4LmgiCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJ2NGwyIGRyaXZlciBtb2R1bGUgZm9yIGN4MjM4OHggYmFzZWQgVFYgY2FyZHMiKTsKIE1PRFVMRV9BVVRIT1IoIkdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4gW1N1U0UgTGFic10iKTsKQEAgLTc0LDYyICs3Niw4IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgY3g4OF9kZXZjb3VudDsKIHN0YXRpYyBMSVNUX0hFQUQoY3g4OF9kZXZsaXN0KTsKLXN0YXRpYyBERUNMQVJFX01VVEVYKGRldmxpc3QpOworc3RhdGljIERFRklORV9NVVRFWChkZXZsaXN0KTsKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBkZWJ1ZyBoZWxwIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKnY0bDFfaW9jdGxzW10gPSB7Ci0JIjAiLCAiQ0dBUCIsICJHQ0hBTiIsICJTQ0hBTiIsICJHVFVORVIiLCAiU1RVTkVSIiwgIkdQSUNUIiwgIlNQSUNUIiwKLQkiQ0NBUFRVUkUiLCAiR1dJTiIsICJTV0lOIiwgIkdGQlVGIiwgIlNGQlVGIiwgIktFWSIsICJHRlJFUSIsCi0JIlNGUkVRIiwgIkdBVURJTyIsICJTQVVESU8iLCAiU1lOQyIsICJNQ0FQVFVSRSIsICJHTUJVRiIsICJHVU5JVCIsCi0JIkdDQVBUVVJFIiwgIlNDQVBUVVJFIiwgIlNQTEFZTU9ERSIsICJTV1JJVEVNT0RFIiwgIkdQTEFZSU5GTyIsCi0JIlNNSUNST0NPREUiLCAiR1ZCSUZNVCIsICJTVkJJRk1UIiB9OwotI2RlZmluZSBWNEwxX0lPQ1RMUyBBUlJBWV9TSVpFKHY0bDFfaW9jdGxzKQotCi1zdGF0aWMgY29uc3QgY2hhciAqdjRsMl9pb2N0bHNbXSA9IHsKLQkiUVVFUllDQVAiLCAiMSIsICJFTlVNX1BJWEZNVCIsICJFTlVNX0ZCVUZGTVQiLCAiR19GTVQiLCAiU19GTVQiLAotCSJHX0NPTVAiLCAiU19DT01QIiwgIlJFUUJVRlMiLCAiUVVFUllCVUYiLCAiR19GQlVGIiwgIlNfRkJVRiIsCi0JIkdfV0lOIiwgIlNfV0lOIiwgIlBSRVZJRVciLCAiUUJVRiIsICIxNiIsICJEUUJVRiIsICJTVFJFQU1PTiIsCi0JIlNUUkVBTU9GRiIsICJHX1BFUkYiLCAiR19QQVJNIiwgIlNfUEFSTSIsICJHX1NURCIsICJTX1NURCIsCi0JIkVOVU1TVEQiLCAiRU5VTUlOUFVUIiwgIkdfQ1RSTCIsICJTX0NUUkwiLCAiR19UVU5FUiIsICJTX1RVTkVSIiwKLQkiR19GUkVRIiwgIlNfRlJFUSIsICJHX0FVRElPIiwgIlNfQVVESU8iLCAiMzUiLCAiUVVFUllDVFJMIiwKLQkiUVVFUllNRU5VIiwgIkdfSU5QVVQiLCAiU19JTlBVVCIsICJFTlVNQ1ZUIiwgIjQxIiwgIjQyIiwgIjQzIiwKLQkiNDQiLCAiNDUiLCAgIkdfT1VUUFVUIiwgIlNfT1VUUFVUIiwgIkVOVU1PVVRQVVQiLCAiR19BVURPVVQiLAotCSJTX0FVRE9VVCIsICJFTlVNRlgiLCAiR19FRkZFQ1QiLCAiU19FRkZFQ1QiLCAiR19NT0RVTEFUT1IiLAotCSJTX01PRFVMQVRPUiIKLX07Ci0jZGVmaW5lIFY0TDJfSU9DVExTIEFSUkFZX1NJWkUodjRsMl9pb2N0bHMpCi0KLXZvaWQgY3g4OF9wcmludF9pb2N0bChjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgY21kKQotewotCWNoYXIgKmRpcjsKLQotCXN3aXRjaCAoX0lPQ19ESVIoY21kKSkgewotCWNhc2UgX0lPQ19OT05FOiAgICAgICAgICAgICAgZGlyID0gIi0tIjsgYnJlYWs7Ci0JY2FzZSBfSU9DX1JFQUQ6ICAgICAgICAgICAgICBkaXIgPSAici0iOyBicmVhazsKLQljYXNlIF9JT0NfV1JJVEU6ICAgICAgICAgICAgIGRpciA9ICItdyI7IGJyZWFrOwotCWNhc2UgX0lPQ19SRUFEIHwgX0lPQ19XUklURTogZGlyID0gInJ3IjsgYnJlYWs7Ci0JZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICBkaXIgPSAiPz8iOyBicmVhazsKLQl9Ci0Jc3dpdGNoIChfSU9DX1RZUEUoY21kKSkgewotCWNhc2UgJ3YnOgotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlvY3RsIDB4JTA4eCAodjRsMSwgJXMsIFZJRElPQyVzKVxuIiwKLQkJICAgICAgIG5hbWUsIGNtZCwgZGlyLCAoX0lPQ19OUihjbWQpIDwgVjRMMV9JT0NUTFMpID8KLQkJICAgICAgIHY0bDFfaW9jdGxzW19JT0NfTlIoY21kKV0gOiAiPz8/Iik7Ci0JCWJyZWFrOwotCWNhc2UgJ1YnOgotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlvY3RsIDB4JTA4eCAodjRsMiwgJXMsIFZJRElPQ18lcylcbiIsCi0JCSAgICAgICBuYW1lLCBjbWQsIGRpciwgKF9JT0NfTlIoY21kKSA8IFY0TDJfSU9DVExTKSA/Ci0JCSAgICAgICB2NGwyX2lvY3Rsc1tfSU9DX05SKGNtZCldIDogIj8/PyIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlvY3RsIDB4JTA4eCAoPz8/LCAlcywgIyVkKVxuIiwKLQkJICAgICAgIG5hbWUsIGNtZCwgZGlyLCBfSU9DX05SKGNtZCkpOwotCX0KLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAjZGVmaW5lIE5PX1NZTkNfTElORSAoLTFVKQogCiBzdGF0aWMgdTMyKiBjeDg4X3Jpc2NfZmllbGQodTMyICpycCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCkBAIC0yOTEsOSArMjM5LDkgQEAKICAqICAgIGNoYW5uZWwgIDIyICAgICh1IHZpZGVvKSAgLSAgMi4wawogICogICAgY2hhbm5lbCAgMjMgICAgKHYgdmlkZW8pICAtICAyLjBrCiAgKiAgICBjaGFubmVsICAyNCAgICAodmJpKSAgICAgIC0gIDQuMGsKLSAqICAgIGNoYW5uZWxzIDI1KzI2IChhdWRpbykgICAgLSAgMC41aworICogICAgY2hhbm5lbHMgMjUrMjYgKGF1ZGlvKSAgICAtICA0LjBrCiAgKiAgICBjaGFubmVsICAyOCAgICAobXBlZykgICAgIC0gIDQuMGsKLSAqICAgIFRPVEFMICAgICAgICAgICAgICAgICAgICAgPSAyNS41aworICogICAgVE9UQUwgICAgICAgICAgICAgICAgICAgICA9IDI5LjBrCiAgKgogICogRXZlcnkgY2hhbm5lbCBoYXMgMTYwIGJ5dGVzIGNvbnRyb2wgZGF0YSAoNjQgYnl0ZXMgaW5zdHJ1Y3Rpb24KICAqIHF1ZXVlIGFuZCA2IENEVCBlbnRyaWVzKSwgd2hpY2ggaXMgY2xvc2UgdG8gMmsgdG90YWwuCkBAIC0zNTksNyArMzA3LDcgQEAKIAkJLmN0cmxfc3RhcnQgPSAweDE4MDY4MCwKIAkJLmNkdCAgICAgICAgPSAweDE4MDY4MCArIDY0LAogCQkuZmlmb19zdGFydCA9IDB4MTg1NDAwLAotCQkuZmlmb19zaXplICA9IDB4MDAwMjAwLAorCQkuZmlmb19zaXplICA9IDB4MDAxMDAwLAogCQkucHRyMV9yZWcgICA9IE1PX0RNQTI1X1BUUjEsCiAJCS5wdHIyX3JlZyAgID0gTU9fRE1BMjVfUFRSMiwKIAkJLmNudDFfcmVnICAgPSBNT19ETUEyNV9DTlQxLApAQCAtMzcxLDcgKzMxOSw3IEBACiAJCS5jdHJsX3N0YXJ0ID0gMHgxODA3MjAsCiAJCS5jZHQgICAgICAgID0gMHgxODA2ODAgKyA2NCwgIC8qIHNhbWUgYXMgYXVkaW8gSU4gKi8KIAkJLmZpZm9fc3RhcnQgPSAweDE4NTQwMCwgICAgICAgLyogc2FtZSBhcyBhdWRpbyBJTiAqLwotCQkuZmlmb19zaXplICA9IDB4MDAwMjAwLCAgICAgICAvKiBzYW1lIGFzIGF1ZGlvIElOICovCisJCS5maWZvX3NpemUgID0gMHgwMDEwMDAsICAgICAgIC8qIHNhbWUgYXMgYXVkaW8gSU4gKi8KIAkJLnB0cjFfcmVnICAgPSBNT19ETUEyNl9QVFIxLAogCQkucHRyMl9yZWcgICA9IE1PX0RNQTI2X1BUUjIsCiAJCS5jbnQxX3JlZyAgID0gTU9fRE1BMjZfQ05UMSwKQEAgLTM4Miw3ICszMzAsNyBAQAogCQkuY21kc19zdGFydCA9IDB4MTgwMjAwLAogCQkuY3RybF9zdGFydCA9IDB4MTgwN0MwLAogCQkuY2R0ICAgICAgICA9IDB4MTgwN0MwICsgNjQsCi0JCS5maWZvX3N0YXJ0ID0gMHgxODU2MDAsCisJCS5maWZvX3N0YXJ0ID0gMHgxODY0MDAsCiAJCS5maWZvX3NpemUgID0gMHgwMDEwMDAsCiAJCS5wdHIxX3JlZyAgID0gTU9fRE1BMjhfUFRSMSwKIAkJLnB0cjJfcmVnICAgPSBNT19ETUEyOF9QVFIyLApAQCAtODQ4LDcgKzc5Niw2IEBACiAKIAkvKiBzdGFydCBkbWEgKi8KIAljeF93cml0ZShNT19BVURfRE1BQ05UUkwsIDB4MDAwMyk7IC8qIFVwIGFuZCBEb3duIGZpZm8gZW5hYmxlICovCi0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA5MCw3ICsxMDM3LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICppdGVtOwogCWludCBpOwogCi0JZG93bigmZGV2bGlzdCk7CisJbXV0ZXhfbG9jaygmZGV2bGlzdCk7CiAJbGlzdF9mb3JfZWFjaChpdGVtLCZjeDg4X2Rldmxpc3QpIHsKIAkJY29yZSA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IGN4ODhfY29yZSwgZGV2bGlzdCk7CiAJCWlmIChwY2ktPmJ1cy0+bnVtYmVyICE9IGNvcmUtPnBjaV9idXMpCkBAIC0xMTAxLDE0ICsxMDQ4LDEzIEBACiAJCWlmICgwICE9IGdldF9yZXNzb3VyY2VzKGNvcmUscGNpKSkKIAkJCWdvdG8gZmFpbF91bmxvY2s7CiAJCWF0b21pY19pbmMoJmNvcmUtPnJlZmNvdW50KTsKLQkJdXAoJmRldmxpc3QpOworCQltdXRleF91bmxvY2soJmRldmxpc3QpOwogCQlyZXR1cm4gY29yZTsKIAl9Ci0JY29yZSA9IGttYWxsb2Moc2l6ZW9mKCpjb3JlKSxHRlBfS0VSTkVMKTsKKwljb3JlID0ga3phbGxvYyhzaXplb2YoKmNvcmUpLEdGUF9LRVJORUwpOwogCWlmIChOVUxMID09IGNvcmUpCiAJCWdvdG8gZmFpbF91bmxvY2s7CiAKLQltZW1zZXQoY29yZSwwLHNpemVvZigqY29yZSkpOwogCWF0b21pY19pbmMoJmNvcmUtPnJlZmNvdW50KTsKIAljb3JlLT5wY2lfYnVzICA9IHBjaS0+YnVzLT5udW1iZXI7CiAJY29yZS0+cGNpX3Nsb3QgPSBQQ0lfU0xPVChwY2ktPmRldmZuKTsKQEAgLTExNzcsMTMgKzExMjMsMTMgQEAKIAljeDg4X2NhcmRfc2V0dXAoY29yZSk7CiAJY3g4OF9pcl9pbml0KGNvcmUscGNpKTsKIAotCXVwKCZkZXZsaXN0KTsKKwltdXRleF91bmxvY2soJmRldmxpc3QpOwogCXJldHVybiBjb3JlOwogCiBmYWlsX2ZyZWU6CiAJa2ZyZWUoY29yZSk7CiBmYWlsX3VubG9jazoKLQl1cCgmZGV2bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZkZXZsaXN0KTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMTE5NSwyMCArMTE0MSwxOSBAQAogCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmY29yZS0+cmVmY291bnQpKQogCQlyZXR1cm47CiAKLQlkb3duKCZkZXZsaXN0KTsKKwltdXRleF9sb2NrKCZkZXZsaXN0KTsKIAljeDg4X2lyX2ZpbmkoY29yZSk7CiAJaWYgKDAgPT0gY29yZS0+aTJjX3JjKQogCQlpMmNfYml0X2RlbF9idXMoJmNvcmUtPmkyY19hZGFwKTsKIAlsaXN0X2RlbCgmY29yZS0+ZGV2bGlzdCk7CiAJaW91bm1hcChjb3JlLT5sbW1pbyk7CiAJY3g4OF9kZXZjb3VudC0tOwotCXVwKCZkZXZsaXN0KTsKKwltdXRleF91bmxvY2soJmRldmxpc3QpOwogCWtmcmVlKGNvcmUpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotRVhQT1JUX1NZTUJPTChjeDg4X3ByaW50X2lvY3RsKTsKIEVYUE9SVF9TWU1CT0woY3g4OF9wcmludF9pcnFiaXRzKTsKIAogRVhQT1JUX1NZTUJPTChjeDg4X2NvcmVfaXJxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKaW5kZXggOTllYTk1NS4uZTQ4YWEzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKQEAgLTMsNyArMyw3IEBACiAgKiBkZXZpY2UgZHJpdmVyIGZvciBDb25leGFudCAyMzg4eCBiYXNlZCBUViBjYXJkcwogICogTVBFRyBUcmFuc3BvcnQgU3RyZWFtIChEVkIpIHJvdXRpbmVzCiAgKgotICogKGMpIDIwMDQgQ2hyaXMgUGFzY29lIDxjLnBhc2NvZUBpdGVlLnVxLmVkdS5hdT4KKyAqIChjKSAyMDA0LCAyMDA1IENocmlzIFBhc2NvZSA8Yy5wYXNjb2VAaXRlZS51cS5lZHUuYXU+CiAgKiAoYykgMjAwNCBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdCiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0zMSwxMCArMzEsMTQgQEAKIAogI2luY2x1ZGUgImN4ODguaCIKICNpbmNsdWRlICJkdmItcGxsLmgiCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KIAogI2lmZGVmIEhBVkVfTVQzNTIKICMgaW5jbHVkZSAibXQzNTIuaCIKICMgaW5jbHVkZSAibXQzNTJfcHJpdi5oIgorIyBpZmRlZiBIQVZFX1ZQMzA1NF9JMkMKKyMgIGluY2x1ZGUgImN4ODgtdnAzMDU0LWkyYy5oIgorIyBlbmRpZgogI2VuZGlmCiAjaWZkZWYgSEFWRV9DWDIyNzAyCiAjIGluY2x1ZGUgImN4MjI3MDIuaCIKQEAgLTQ4LDYgKzUyLDkgQEAKICNpZmRlZiBIQVZFX05YVDIwMFgKICMgaW5jbHVkZSAibnh0MjAweC5oIgogI2VuZGlmCisjaWZkZWYgSEFWRV9DWDI0MTIzCisjIGluY2x1ZGUgImN4MjQxMjMuaCIKKyNlbmRpZgogCiBNT0RVTEVfREVTQ1JJUFRJT04oImRyaXZlciBmb3IgY3gyMzg4eCBiYXNlZCBEVkIgY2FyZHMiKTsKIE1PRFVMRV9BVVRIT1IoIkNocmlzIFBhc2NvZSA8Yy5wYXNjb2VAaXRlZS51cS5lZHUuYXU+Iik7CkBAIC0xMjUsNiArMTMyLDI3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZHZpY29fZHVhbF9kZW1vZF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0YXRpYyB1OCBjbG9ja19jb25maWcgW10gID0geyBDTE9DS19DVEwsICAweDM4LCAweDM4IH07CisJc3RhdGljIHU4IHJlc2V0IFtdICAgICAgICAgPSB7IFJFU0VULCAgICAgIDB4ODAgfTsKKwlzdGF0aWMgdTggYWRjX2N0bF8xX2NmZyBbXSA9IHsgQURDX0NUTF8xLCAgMHg0MCB9OworCXN0YXRpYyB1OCBhZ2NfY2ZnIFtdICAgICAgID0geyBBR0NfVEFSR0VULCAweDI4LCAweDIwIH07CisJc3RhdGljIHU4IGdwcF9jdGxfY2ZnIFtdICAgPSB7IEdQUF9DVEwsICAgIDB4MzMgfTsKKwlzdGF0aWMgdTggY2FwdF9yYW5nZV9jZmdbXSA9IHsgQ0FQVF9SQU5HRSwgMHgzMiB9OworCisJbXQzNTJfd3JpdGUoZmUsIGNsb2NrX2NvbmZpZywgICBzaXplb2YoY2xvY2tfY29uZmlnKSk7CisJdWRlbGF5KDIwMCk7CisJbXQzNTJfd3JpdGUoZmUsIHJlc2V0LCAgICAgICAgICBzaXplb2YocmVzZXQpKTsKKwltdDM1Ml93cml0ZShmZSwgYWRjX2N0bF8xX2NmZywgIHNpemVvZihhZGNfY3RsXzFfY2ZnKSk7CisKKwltdDM1Ml93cml0ZShmZSwgYWdjX2NmZywgICAgICAgIHNpemVvZihhZ2NfY2ZnKSk7CisJbXQzNTJfd3JpdGUoZmUsIGdwcF9jdGxfY2ZnLCAgICBzaXplb2YoZ3BwX2N0bF9jZmcpKTsKKwltdDM1Ml93cml0ZShmZSwgY2FwdF9yYW5nZV9jZmcsIHNpemVvZihjYXB0X3JhbmdlX2NmZykpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZG50dl9saXZlX2R2YnRfZGVtb2RfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKIAlzdGF0aWMgdTggY2xvY2tfY29uZmlnIFtdICA9IHsgMHg4OSwgMHgzOCwgMHgzOSB9OwpAQCAtMTcyLDYgKzIwMCw5OCBAQAogCS5kZW1vZF9pbml0ICAgID0gZG50dl9saXZlX2R2YnRfZGVtb2RfaW5pdCwKIAkucGxsX3NldCAgICAgICA9IG10MzUyX3BsbF9zZXQsCiB9OworCitzdGF0aWMgc3RydWN0IG10MzUyX2NvbmZpZyBkdmljb19mdXNpb25oZHR2X2R1YWwgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDBGLAorCS5kZW1vZF9pbml0ICAgID0gZHZpY29fZHVhbF9kZW1vZF9pbml0LAorCS5wbGxfc2V0ICAgICAgID0gbXQzNTJfcGxsX3NldCwKK307CisKKyNpZmRlZiBIQVZFX1ZQMzA1NF9JMkMKK3N0YXRpYyBpbnQgZG50dl9saXZlX2R2YnRfcHJvX2RlbW9kX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJc3RhdGljIHU4IGNsb2NrX2NvbmZpZyBbXSAgPSB7IDB4ODksIDB4MzgsIDB4MzggfTsKKwlzdGF0aWMgdTggcmVzZXQgW10gICAgICAgICA9IHsgMHg1MCwgMHg4MCB9OworCXN0YXRpYyB1OCBhZGNfY3RsXzFfY2ZnIFtdID0geyAweDhFLCAweDQwIH07CisJc3RhdGljIHU4IGFnY19jZmcgW10gICAgICAgPSB7IDB4NjcsIDB4MTAsIDB4MjAsIDB4MDAsIDB4RkYsIDB4RkYsCisJCQkJICAgICAgIDB4MDAsIDB4RkYsIDB4MDAsIDB4NDAsIDB4NDAgfTsKKwlzdGF0aWMgdTggZG50dl9leHRyYVtdICAgICA9IHsgMHhCNSwgMHg3QSB9OworCXN0YXRpYyB1OCBjYXB0X3JhbmdlX2NmZ1tdID0geyAweDc1LCAweDMyIH07CisKKwltdDM1Ml93cml0ZShmZSwgY2xvY2tfY29uZmlnLCAgIHNpemVvZihjbG9ja19jb25maWcpKTsKKwl1ZGVsYXkoMjAwMCk7CisJbXQzNTJfd3JpdGUoZmUsIHJlc2V0LCAgICAgICAgICBzaXplb2YocmVzZXQpKTsKKwltdDM1Ml93cml0ZShmZSwgYWRjX2N0bF8xX2NmZywgIHNpemVvZihhZGNfY3RsXzFfY2ZnKSk7CisKKwltdDM1Ml93cml0ZShmZSwgYWdjX2NmZywgICAgICAgIHNpemVvZihhZ2NfY2ZnKSk7CisJdWRlbGF5KDIwMDApOworCW10MzUyX3dyaXRlKGZlLCBkbnR2X2V4dHJhLCAgICAgc2l6ZW9mKGRudHZfZXh0cmEpKTsKKwltdDM1Ml93cml0ZShmZSwgY2FwdF9yYW5nZV9jZmcsIHNpemVvZihjYXB0X3JhbmdlX2NmZykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGhpbGlwc19mbWQxMjE2X3BsbF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXY9IGZlLT5kdmItPnByaXY7CisKKwkvKiB0aGlzIG1lc3NhZ2UgaXMgdG8gc2V0IHVwIEFUQyBhbmQgQUxDICovCisJc3RhdGljIHU4IGZtZDEyMTZfaW5pdFtdID0geyAweDBiLCAweGRjLCAweDljLCAweGEwIH07CisJc3RydWN0IGkyY19tc2cgbXNnID0KKwkJeyAuYWRkciA9IGRldi0+Y29yZS0+cGxsX2FkZHIsIC5mbGFncyA9IDAsCisJCSAgLmJ1ZiA9IGZtZDEyMTZfaW5pdCwgLmxlbiA9IHNpemVvZihmbWQxMjE2X2luaXQpIH07CisJaW50IGVycjsKKworCWlmICgoZXJyID0gaTJjX3RyYW5zZmVyKCZkZXYtPmNvcmUtPmkyY19hZGFwLCAmbXNnLCAxKSkgIT0gMSkgeworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWVsc2UKKwkJCXJldHVybiAtRVJFTU9URUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRudHZfbGl2ZV9kdmJ0X3Byb19wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCQkJCSAgICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zLAorCQkJCSAgICAgIHU4KiBwbGxidWYpCit7CisJc3RydWN0IGN4ODgwMl9kZXYgKmRldj0gZmUtPmR2Yi0+cHJpdjsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPQorCQl7IC5hZGRyID0gZGV2LT5jb3JlLT5wbGxfYWRkciwgLmZsYWdzID0gMCwKKwkJICAuYnVmID0gcGxsYnVmKzEsIC5sZW4gPSA0IH07CisJaW50IGVycjsKKworCS8qIFN3aXRjaCBQTEwgdG8gRFZCIG1vZGUgKi8KKwllcnIgPSBwaGlsaXBzX2ZtZDEyMTZfcGxsX2luaXQoZmUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBUdW5lIFBMTCAqLworCXBsbGJ1ZlswXSA9IGRldi0+Y29yZS0+cGxsX2FkZHIgPDwgMTsKKwlkdmJfcGxsX2NvbmZpZ3VyZShkZXYtPmNvcmUtPnBsbF9kZXNjLCBwbGxidWYrMSwKKwkJCSAgcGFyYW1zLT5mcmVxdWVuY3ksCisJCQkgIHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCk7CisJaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIoJmRldi0+Y29yZS0+aTJjX2FkYXAsICZtc2csIDEpKSAhPSAxKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImN4ODgtZHZiOiAlcyBlcnJvciAiCisJCQkgICAiKGFkZHIgJTAyeCA8LSAlMDJ4LCBlcnIgPSAlaSlcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHBsbGJ1ZlswXSwgcGxsYnVmWzFdLCBlcnIpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWVsc2UKKwkJCXJldHVybiAtRVJFTU9URUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG10MzUyX2NvbmZpZyBkbnR2X2xpdmVfZHZidF9wcm9fY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHgwZiwKKwkubm9fdHVuZXIgICAgICA9IDEsCisJLmRlbW9kX2luaXQgICAgPSBkbnR2X2xpdmVfZHZidF9wcm9fZGVtb2RfaW5pdCwKKwkucGxsX3NldCAgICAgICA9IGRudHZfbGl2ZV9kdmJ0X3Byb19wbGxfc2V0LAorfTsKKyNlbmRpZgogI2VuZGlmCiAKICNpZmRlZiBIQVZFX0NYMjI3MDIKQEAgLTE4OCw2ICszMDgsMTIgQEAKIAkucGxsX2FkZHJlc3MgICA9IDB4NjEsCiAJLnBsbF9kZXNjICAgICAgPSAmZHZiX3BsbF90aG9tc29uX2R0dDc1OXgsCiB9Oworc3RhdGljIHN0cnVjdCBjeDIyNzAyX2NvbmZpZyBoYXVwcGF1Z2VfaHZyMTEwMF9jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDYzLAorCS5vdXRwdXRfbW9kZSAgID0gQ1gyMjcwMl9TRVJJQUxfT1VUUFVULAorCS5wbGxfYWRkcmVzcyAgID0gMHg2MSwKKwkucGxsX2Rlc2MgICAgICA9ICZkdmJfcGxsX2ZtZDEyMTZtZSwKK307CiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfT1I1MTEzMgpAQCAtMzE0LDYgKzQ0MCw0MCBAQAogfTsKICNlbmRpZgogCisjaWZkZWYgSEFWRV9DWDI0MTIzCitzdGF0aWMgaW50IGN4MjQxMjNfc2V0X3RzX3BhcmFtKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCWludCBpc19wdW5jdHVyZWQpCit7CisJc3RydWN0IGN4ODgwMl9kZXYgKmRldj0gZmUtPmR2Yi0+cHJpdjsKKwlkZXYtPnRzX2dlbl9jbnRybCA9IDB4MjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY3gyNDEyM19lbmFibGVfbG5iX3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBvbikKK3sKKwlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2PSBmZS0+ZHZiLT5wcml2OworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CisKKwlpZiAob24pCisJCWN4X3dyaXRlKE1PX0dQMF9JTywgMHgwMDAwMDZmOSk7CisJZWxzZQorCQljeF93cml0ZShNT19HUDBfSU8sIDB4MDAwMDA2ZkIpOworfQorCitzdGF0aWMgc3RydWN0IGN4MjQxMjNfY29uZmlnIGhhdXBwYXVnZV9ub3Zhc19jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MJCT0gMHg1NSwKKwkudXNlX2lzbDY0MjEJCT0gMSwKKwkuc2V0X3RzX3BhcmFtcwkJPSBjeDI0MTIzX3NldF90c19wYXJhbSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3gyNDEyM19jb25maWcga3dvcmxkX2R2YnNfMTAwX2NvbmZpZyA9IHsKKwkuZGVtb2RfYWRkcmVzcwkJPSAweDE1LAorCS51c2VfaXNsNjQyMQkJPSAwLAorCS5zZXRfdHNfcGFyYW1zCQk9IGN4MjQxMjNfc2V0X3RzX3BhcmFtLAorCS5lbmFibGVfbG5iX3ZvbHRhZ2UJPSBjeDI0MTIzX2VuYWJsZV9sbmJfdm9sdGFnZSwKK307CisjZW5kaWYKKwogc3RhdGljIGludCBkdmJfcmVnaXN0ZXIoc3RydWN0IGN4ODgwMl9kZXYgKmRldikKIHsKIAkvKiBpbml0IHN0cnVjdCB2aWRlb2J1Zl9kdmIgKi8KQEAgLTMyOSwxMCArNDg5LDE2IEBACiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZXzE0MDBfRFZCX1QxOgogCWNhc2UgQ1g4OF9CT0FSRF9DT05FWEFOVF9EVkJfVDE6CisJY2FzZSBDWDg4X0JPQVJEX0tXT1JMRF9EVkJfVF9DWDIyNzAyOgogCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjEwMDA6CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gY3gyMjcwMl9hdHRhY2goJmNvbm5leGFudF9yZWZib2FyZF9jb25maWcsCiAJCQkJCQkgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CiAJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMTEwMDoKKwljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjExMDBMUDoKKwkJZGV2LT5kdmIuZnJvbnRlbmQgPSBjeDIyNzAyX2F0dGFjaCgmaGF1cHBhdWdlX2h2cjExMDBfY29uZmlnLAorCQkJCQkJICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOworCQlicmVhazsKICNlbmRpZgogI2lmZGVmIEhBVkVfTVQzNTIKIAljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl9EVkJfVDE6CkBAIC0zNTUsNiArNTIxLDI0IEBACiAJCWRldi0+ZHZiLmZyb250ZW5kID0gbXQzNTJfYXR0YWNoKCZkbnR2X2xpdmVfZHZidF9jb25maWcsCiAJCQkJCQkgJmRldi0+Y29yZS0+aTJjX2FkYXApOwogCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfRE5UVl9MSVZFX0RWQl9UX1BSTzoKKyNpZmRlZiBIQVZFX1ZQMzA1NF9JMkMKKwkJZGV2LT5jb3JlLT5wbGxfYWRkciA9IDB4NjE7CisJCWRldi0+Y29yZS0+cGxsX2Rlc2MgPSAmZHZiX3BsbF9mbWQxMjE2bWU7CisJCWRldi0+ZHZiLmZyb250ZW5kID0gbXQzNTJfYXR0YWNoKCZkbnR2X2xpdmVfZHZidF9wcm9fY29uZmlnLAorCQkJJigoc3RydWN0IHZwMzA1NF9pMmNfc3RhdGUgKilkZXYtPmNhcmRfcHJpdiktPmFkYXApOworI2Vsc2UKKwkJcHJpbnRrKCIlczogYnVpbHQgd2l0aG91dCB2cDMwNTQgc3VwcG9ydFxuIiwgZGV2LT5jb3JlLT5uYW1lKTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl9EVkJfVF9EVUFMOgorCQkvKiBUaGUgdGluIGJveCBzYXlzIERFRTE2MDEsIGJ1dCBpdCBzZWVtcyB0byBiZSBEVFQ3NTc5CisJCSAqIGNvbXBhdGlibGUsIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgTVQzNTIgQUdDIGdhaW4uICovCisJCWRldi0+Y29yZS0+cGxsX2FkZHIgPSAweDYxOworCQlkZXYtPmNvcmUtPnBsbF9kZXNjID0gJmR2Yl9wbGxfdGhvbXNvbl9kdHQ3NTc5OworCQlkZXYtPmR2Yi5mcm9udGVuZCA9IG10MzUyX2F0dGFjaCgmZHZpY29fZnVzaW9uaGR0dl9kdWFsLAorCQkJCQkJICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBIQVZFX09SNTExMzIKIAljYXNlIENYODhfQk9BUkRfUENIRFRWX0hEMzAwMDoKQEAgLTM5Myw3ICs1NzcsNyBAQAogCQljeF9zZXQoTU9fR1AwX0lPLCA5KTsKIAkJbWRlbGF5KDIwMCk7CiAJCWRldi0+Y29yZS0+cGxsX2FkZHIgPSAweDYxOwotCQlkZXYtPmNvcmUtPnBsbF9kZXNjID0gJmR2Yl9wbGxfdGhvbXNvbl9kdHQ3NjExOworCQlkZXYtPmNvcmUtPnBsbF9kZXNjID0gJmR2Yl9wbGxfdGhvbXNvbl9kdHQ3NjF4OwogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGxnZHQzMzB4X2F0dGFjaCgmZnVzaW9uaGR0dl8zX2dvbGQsCiAJCQkJCQkgICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOwogCQl9CkBAIC00MjEsNiArNjA1LDE3IEBACiAJCQkJCQkgJmRldi0+Y29yZS0+aTJjX2FkYXApOwogCQlicmVhazsKICNlbmRpZgorI2lmZGVmIEhBVkVfQ1gyNDEyMworCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfTk9WQVNQTFVTX1MxOgorCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfTk9WQVNFMl9TMToKKwkJZGV2LT5kdmIuZnJvbnRlbmQgPSBjeDI0MTIzX2F0dGFjaCgmaGF1cHBhdWdlX25vdmFzX2NvbmZpZywKKwkJCSZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJYnJlYWs7CisJY2FzZSBDWDg4X0JPQVJEX0tXT1JMRF9EVkJTXzEwMDoKKwkJZGV2LT5kdmIuZnJvbnRlbmQgPSBjeDI0MTIzX2F0dGFjaCgma3dvcmxkX2R2YnNfMTAwX2NvbmZpZywKKwkJCSZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJYnJlYWs7CisjZW5kaWYKIAlkZWZhdWx0OgogCQlwcmludGsoIiVzOiBUaGUgZnJvbnRlbmQgb2YgeW91ciBEVkIvQVRTQyBjYXJkIGlzbid0IHN1cHBvcnRlZCB5ZXRcbiIsCiAJCSAgICAgICBkZXYtPmNvcmUtPm5hbWUpOwpAQCAtNDYyLDEwICs2NTcsOSBAQAogCQlnb3RvIGZhaWxfY29yZTsKIAogCWVyciA9IC1FTk9NRU07Ci0JZGV2ID0ga21hbGxvYyhzaXplb2YoKmRldiksR0ZQX0tFUk5FTCk7CisJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksR0ZQX0tFUk5FTCk7CiAJaWYgKE5VTEwgPT0gZGV2KQogCQlnb3RvIGZhaWxfY29yZTsKLQltZW1zZXQoZGV2LDAsc2l6ZW9mKCpkZXYpKTsKIAlkZXYtPnBjaSA9IHBjaV9kZXY7CiAJZGV2LT5jb3JlID0gY29yZTsKIApAQCAtNDczLDYgKzY2NywxMiBAQAogCWlmICgwICE9IGVycikKIAkJZ290byBmYWlsX2ZyZWU7CiAKKyNpZmRlZiBIQVZFX1ZQMzA1NF9JMkMKKwllcnIgPSB2cDMwNTRfaTJjX3Byb2JlKGRldik7CisJaWYgKDAgIT0gZXJyKQorCQlnb3RvIGZhaWxfZnJlZTsKKyNlbmRpZgorCiAJLyogZHZiIHN0dWZmICovCiAJcHJpbnRrKCIlcy8yOiBjeDIzODh4IGJhc2VkIGR2YiBjYXJkXG4iLCBjb3JlLT5uYW1lKTsKIAl2aWRlb2J1Zl9xdWV1ZV9pbml0KCZkZXYtPmR2Yi5kdmJxLCAmZHZiX3FvcHMsCkBAIC00ODQsNiArNjg0LDkgQEAKIAllcnIgPSBkdmJfcmVnaXN0ZXIoZGV2KTsKIAlpZiAoMCAhPSBlcnIpCiAJCWdvdG8gZmFpbF9maW5pOworCisJLyogTWFpbnRhaW4gYSByZWZlcmVuY2UgdG8gY3g4OC12aWRlbyBjYW4gcXVlcnkgdGhlIDg4MDIgZGV2aWNlLiAqLworCWNvcmUtPmR2YmRldiA9IGRldjsKIAlyZXR1cm4gMDsKIAogIGZhaWxfZmluaToKQEAgLTQ5OSw5ICs3MDIsMTYgQEAKIHsKIAlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOwogCisJLyogRGVzdHJveSBhbnkgODgwMiByZWZlcmVuY2UuICovCisJZGV2LT5jb3JlLT5kdmJkZXYgPSBOVUxMOworCiAJLyogZHZiICovCiAJdmlkZW9idWZfZHZiX3VucmVnaXN0ZXIoJmRldi0+ZHZiKTsKIAorI2lmZGVmIEhBVkVfVlAzMDU0X0kyQworCXZwMzA1NF9pMmNfcmVtb3ZlKGRldik7CisjZW5kaWYKKwogCS8qIGNvbW1vbiAqLwogCWN4ODgwMl9maW5pX2NvbW1vbihkZXYpOwogCWN4ODhfY29yZV9wdXQoZGV2LT5jb3JlLGRldi0+cGNpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMKaW5kZXggNGE4ZmIxNi4uZjcyMDkwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgImN4ODguaCIKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogCiBzdGF0aWMgdW5zaWduZWQgaW50IGkyY19kZWJ1ZyA9IDA7CiBtb2R1bGVfcGFyYW0oaTJjX2RlYnVnLCBpbnQsIDA2NDQpOwpAQCAtMTM1LDcgKzEzNiwxNyBAQAogewogCWlmICgwICE9IGNvcmUtPmkyY19yYykKIAkJcmV0dXJuOwotCWkyY19jbGllbnRzX2NvbW1hbmQoJmNvcmUtPmkyY19hZGFwLCBjbWQsIGFyZyk7CisKKwlpZiAoY29yZS0+ZHZiZGV2KSB7CisJCWlmIChjb3JlLT5kdmJkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLT5pMmNfZ2F0ZV9jdHJsKQorCQkJY29yZS0+ZHZiZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy0+aTJjX2dhdGVfY3RybChjb3JlLT5kdmJkZXYtPmR2Yi5mcm9udGVuZCwgMSk7CisKKwkJaTJjX2NsaWVudHNfY29tbWFuZCgmY29yZS0+aTJjX2FkYXAsIGNtZCwgYXJnKTsKKworCQlpZiAoY29yZS0+ZHZiZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy0+aTJjX2dhdGVfY3RybCkKKwkJCWNvcmUtPmR2YmRldi0+ZHZiLmZyb250ZW5kLT5vcHMtPmkyY19nYXRlX2N0cmwoY29yZS0+ZHZiZGV2LT5kdmIuZnJvbnRlbmQsIDApOworCX0gZWxzZQorCQlpMmNfY2xpZW50c19jb21tYW5kKCZjb3JlLT5pMmNfYWRhcCwgY21kLCBhcmcpOwogfQogCiBzdGF0aWMgc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGN4ODgwMF9pMmNfYWxnb190ZW1wbGF0ZSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jCmluZGV4IDQ2MTAxOWQuLmRhMmFkNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaW5wdXQuYwpAQCAtNSw3ICs1LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMgUGF2ZWwgTWFjaGVrCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgR2VyZCBLbm9ycgotICogQ29weXJpZ2h0IChjKSAyMDA0IENocmlzIFBhc2NvZQorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IENocmlzIFBhc2NvZQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjksOSArMjksOCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9pci1jb21tb24uaD4KLQogI2luY2x1ZGUgImN4ODguaCIKKyNpbmNsdWRlIDxtZWRpYS9pci1jb21tb24uaD4KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0yNTgsNiArMjU3LDExNCBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKKy8qIEFWRVJUViBTVFVESU8gMzAzIFJlbW90ZSAqLworc3RhdGljIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2F2ZXJ0dl8zMDNbSVJfS0VZVEFCX1NJWkVdID0geworCVsgMHgyYSBdID0gS0VZX0tQMSwKKwlbIDB4MzIgXSA9IEtFWV9LUDIsCisJWyAweDNhIF0gPSBLRVlfS1AzLAorCVsgMHg0YSBdID0gS0VZX0tQNCwKKwlbIDB4NTIgXSA9IEtFWV9LUDUsCisJWyAweDVhIF0gPSBLRVlfS1A2LAorCVsgMHg2YSBdID0gS0VZX0tQNywKKwlbIDB4NzIgXSA9IEtFWV9LUDgsCisJWyAweDdhIF0gPSBLRVlfS1A5LAorCVsgMHgwZSBdID0gS0VZX0tQMCwKKworCVsgMHgwMiBdID0gS0VZX1BPV0VSLAorCVsgMHgyMiBdID0gS0VZX1ZJREVPLAorCVsgMHg0MiBdID0gS0VZX0FVRElPLAorCVsgMHg2MiBdID0gS0VZX1pPT00sCisJWyAweDBhIF0gPSBLRVlfVFYsCisJWyAweDEyIF0gPSBLRVlfQ0QsCisJWyAweDFhIF0gPSBLRVlfVEVYVCwKKworCVsgMHgxNiBdID0gS0VZX1NVQlRJVExFLAorCVsgMHgxZSBdID0gS0VZX1JFV0lORCwKKwlbIDB4MDYgXSA9IEtFWV9QUklOVCwKKworCVsgMHgyZSBdID0gS0VZX1NFQVJDSCwKKwlbIDB4MzYgXSA9IEtFWV9TTEVFUCwKKwlbIDB4M2UgXSA9IEtFWV9TSFVGRkxFLAorCVsgMHgyNiBdID0gS0VZX01VVEUsCisKKwlbIDB4NGUgXSA9IEtFWV9SRUNPUkQsCisJWyAweDU2IF0gPSBLRVlfUEFVU0UsCisJWyAweDVlIF0gPSBLRVlfU1RPUCwKKwlbIDB4NDYgXSA9IEtFWV9QTEFZLAorCisJWyAweDZlIF0gPSBLRVlfUkVELAorCVsgMHgwYiBdID0gS0VZX0dSRUVOLAorCVsgMHg2NiBdID0gS0VZX1lFTExPVywKKwlbIDB4MDMgXSA9IEtFWV9CTFVFLAorCisJWyAweDc2IF0gPSBLRVlfTEVGVCwKKwlbIDB4N2UgXSA9IEtFWV9SSUdIVCwKKwlbIDB4MTMgXSA9IEtFWV9ET1dOLAorCVsgMHgxYiBdID0gS0VZX1VQLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBEaWdpdGFsTm93IEROVFYgTGl2ZSEgRFZCLVQgUHJvIFJlbW90ZSAqLworc3RhdGljIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2RudHZfbGl2ZV9kdmJ0X3Byb1tJUl9LRVlUQUJfU0laRV0gPSB7CisJWyAweDE2IF0gPSBLRVlfUE9XRVIsCisJWyAweDViIF0gPSBLRVlfSE9NRSwKKworCVsgMHg1NSBdID0gS0VZX1RWLAkJLyogbGl2ZSB0diAqLworCVsgMHg1OCBdID0gS0VZX1RVTkVSLAkJLyogZGlnaXRhbCBSYWRpbyAqLworCVsgMHg1YSBdID0gS0VZX1JBRElPLAkJLyogRk0gcmFkaW8gKi8KKwlbIDB4NTkgXSA9IEtFWV9EVkQsCQkvKiBkdmQgbWVudSAqLworCVsgMHgwMyBdID0gS0VZXzEsCisJWyAweDAxIF0gPSBLRVlfMiwKKwlbIDB4MDYgXSA9IEtFWV8zLAorCVsgMHgwOSBdID0gS0VZXzQsCisJWyAweDFkIF0gPSBLRVlfNSwKKwlbIDB4MWYgXSA9IEtFWV82LAorCVsgMHgwZCBdID0gS0VZXzcsCisJWyAweDE5IF0gPSBLRVlfOCwKKwlbIDB4MWIgXSA9IEtFWV85LAorCVsgMHgwYyBdID0gS0VZX0NBTkNFTCwKKwlbIDB4MTUgXSA9IEtFWV8wLAorCVsgMHg0YSBdID0gS0VZX0NMRUFSLAorCVsgMHgxMyBdID0gS0VZX0JBQ0ssCisJWyAweDAwIF0gPSBLRVlfVEFCLAorCVsgMHg0YiBdID0gS0VZX1VQLAorCVsgMHg0ZSBdID0gS0VZX0xFRlQsCisJWyAweDRmIF0gPSBLRVlfT0ssCisJWyAweDUyIF0gPSBLRVlfUklHSFQsCisJWyAweDUxIF0gPSBLRVlfRE9XTiwKKwlbIDB4MWUgXSA9IEtFWV9WT0xVTUVVUCwKKwlbIDB4MGEgXSA9IEtFWV9WT0xVTUVET1dOLAorCVsgMHgwMiBdID0gS0VZX0NIQU5ORUxET1dOLAorCVsgMHgwNSBdID0gS0VZX0NIQU5ORUxVUCwKKwlbIDB4MTEgXSA9IEtFWV9SRUNPUkQsCisJWyAweDE0IF0gPSBLRVlfUExBWSwKKwlbIDB4NGMgXSA9IEtFWV9QQVVTRSwKKwlbIDB4MWEgXSA9IEtFWV9TVE9QLAorCVsgMHg0MCBdID0gS0VZX1JFV0lORCwKKwlbIDB4MTIgXSA9IEtFWV9GQVNURk9SV0FSRCwKKwlbIDB4NDEgXSA9IEtFWV9QUkVWSU9VU1NPTkcsCS8qIHJlcGxheSB8PCAqLworCVsgMHg0MiBdID0gS0VZX05FWFRTT05HLAkvKiBza2lwID58ICovCisJWyAweDU0IF0gPSBLRVlfQ0FNRVJBLAkJLyogY2FwdHVyZSAqLworCVsgMHg1MCBdID0gS0VZX0xBTkdVQUdFLAkvKiBzYXAgKi8KKwlbIDB4NDcgXSA9IEtFWV9UVjIsCQkvKiBwaXAgKi8KKwlbIDB4NGQgXSA9IEtFWV9TQ1JFRU4sCisJWyAweDQzIF0gPSBLRVlfU1VCVElUTEUsCisJWyAweDEwIF0gPSBLRVlfTVVURSwKKwlbIDB4NDkgXSA9IEtFWV9BVURJTywJCS8qIGwvciAqLworCVsgMHgwNyBdID0gS0VZX1NMRUVQLAorCVsgMHgwOCBdID0gS0VZX1ZJREVPLAkJLyogYS92ICovCisJWyAweDBlIF0gPSBLRVlfUFJFVklPVVMsCS8qIHJlY2FsbCAqLworCVsgMHg0NSBdID0gS0VZX1pPT00sCQkvKiB6b29tICsgKi8KKwlbIDB4NDYgXSA9IEtFWV9BTkdMRSwJCS8qIHpvb20gLSAqLworCVsgMHg1NiBdID0gS0VZX1JFRCwKKwlbIDB4NTcgXSA9IEtFWV9HUkVFTiwKKwlbIDB4NWMgXSA9IEtFWV9ZRUxMT1csCisJWyAweDVkIF0gPSBLRVlfQkxVRSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwogc3RydWN0IGN4ODhfSVIgewogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmU7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CkBAIC0yNjYsNyArMzczLDcgQEAKIAljaGFyIHBoeXNbMzJdOwogCiAJLyogc2FtcGxlIGZyb20gZ3BpbyBwaW4gMTYgKi8KLQlpbnQgc2FtcGxpbmc7CisJdTMyIHNhbXBsaW5nOwogCXUzMiBzYW1wbGVzWzE2XTsKIAlpbnQgc2NvdW50OwogCXVuc2lnbmVkIGxvbmcgcmVsZWFzZTsKQEAgLTM4NCwxMCArNDkxLDEzIEBACiAJY2FzZSBDWDg4X0JPQVJEX1RFUlJBVEVDX0NJTkVSR1lfMTQwMF9EVkJfVDE6CiAJCWlyX2NvZGVzID0gaXJfY29kZXNfY2luZXJneV8xNDAwOwogCQlpcl90eXBlID0gSVJfVFlQRV9QRDsKLQkJaXItPnNhbXBsaW5nID0gMTsKKwkJaXItPnNhbXBsaW5nID0gMHhlYjA0OyAvKiBhZGRyZXNzICovCiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0U6CiAJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9EVkJfVDE6CisJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9OT1ZBU0UyX1MxOgorCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfTk9WQVNQTFVTX1MxOgorCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMTEwMDoKIAkJaXJfY29kZXMgPSBpcl9jb2Rlc19oYXVwcGF1Z2VfbmV3OwogCQlpcl90eXBlID0gSVJfVFlQRV9SQzU7CiAJCWlyLT5zYW1wbGluZyA9IDE7CkBAIC00MjcsNiArNTM3LDE5IEBACiAJCWlyLT5tYXNrX2tleXVwID0gMHg0MDsKIAkJaXItPnBvbGxpbmcgPSAxOyAvKiBtcyAqLwogCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfQVZFUlRWXzMwMzoKKwljYXNlIENYODhfQk9BUkRfQVZFUlRWX1NUVURJT18zMDM6CisJCWlyX2NvZGVzICAgICAgICAgPSBpcl9jb2Rlc19hdmVydHZfMzAzOworCQlpci0+Z3Bpb19hZGRyICAgID0gTU9fR1AyX0lPOworCQlpci0+bWFza19rZXljb2RlID0gMHhmYjsKKwkJaXItPm1hc2tfa2V5ZG93biA9IDB4MDI7CisJCWlyLT5wb2xsaW5nICAgICAgPSA1MDsgLyogbXMgKi8KKwkJYnJlYWs7CisJY2FzZSBDWDg4X0JPQVJEX0ROVFZfTElWRV9EVkJfVF9QUk86CisJCWlyX2NvZGVzID0gaXJfY29kZXNfZG50dl9saXZlX2R2YnRfcHJvOworCQlpcl90eXBlID0gSVJfVFlQRV9QRDsKKwkJaXItPnNhbXBsaW5nID0gMHhmZjAwOyAvKiBhZGRyZXNzICovCisJCWJyZWFrOwogCX0KIAogCWlmIChOVUxMID09IGlyX2NvZGVzKSB7CkBAIC00ODQsNiArNjA3LDEwIEBACiAJaWYgKE5VTEwgPT0gaXIpCiAJCXJldHVybiAwOwogCisJaWYgKGlyLT5zYW1wbGluZykgeworCQljeF93cml0ZShNT19ERFNDRkdfSU8sIDB4MCk7CisJCWNvcmUtPnBjaV9pcnFtYXNrICY9IH4oMSA8PCAxOCk7CisJfQogCWlmIChpci0+cG9sbGluZykgewogCQlkZWxfdGltZXIoJmlyLT50aW1lcik7CiAJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CkBAIC01MzUsNiArNjYyLDcgQEAKIAkvKiBkZWNvZGUgaXQgKi8KIAlzd2l0Y2ggKGNvcmUtPmJvYXJkKSB7CiAJY2FzZSBDWDg4X0JPQVJEX1RFUlJBVEVDX0NJTkVSR1lfMTQwMF9EVkJfVDE6CisJY2FzZSBDWDg4X0JPQVJEX0ROVFZfTElWRV9EVkJfVF9QUk86CiAJCWlyY29kZSA9IGlyX2RlY29kZV9wdWxzZWRpc3RhbmNlKGlyLT5zYW1wbGVzLCBpci0+c2NvdW50LCAxLCA0KTsKIAogCQlpZiAoaXJjb2RlID09IDB4ZmZmZmZmZmYpIHsgLyogZGVjb2RpbmcgZXJyb3IgKi8KQEAgLTU1MCw3ICs2NzgsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoKGlyY29kZSAmIDB4ZmZmZikgIT0gMHhlYjA0KSB7IC8qIHdyb25nIGFkZHJlc3MgKi8KKwkJaWYgKChpcmNvZGUgJiAweGZmZmYpICE9IChpci0+c2FtcGxpbmcgJiAweGZmZmYpKSB7IC8qIHdyb25nIGFkZHJlc3MgKi8KIAkJCWlyX2RwcmludGsoInB1bHNlIGRpc3RhbmNlIGRlY29kZWQgd3JvbmcgYWRkcmVzc1xuIik7CiAJCQlicmVhazsKIAkJfQpAQCAtNTY3LDYgKzY5NSw5IEBACiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0U6CiAJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9EVkJfVDE6CisJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9OT1ZBU0UyX1MxOgorCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfTk9WQVNQTFVTX1MxOgorCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMTEwMDoKIAkJaXJjb2RlID0gaXJfZGVjb2RlX2JpcGhhc2UoaXItPnNhbXBsZXMsIGlyLT5zY291bnQsIDUsIDcpOwogCQlpcl9kcHJpbnRrKCJiaXBoYXNlIGRlY29kZWQ6ICV4XG4iLCBpcmNvZGUpOwogCQlpZiAoKGlyY29kZSAmIDB4ZmZmZmYwMDApICE9IDB4MzAwMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYwppbmRleCAzNWU2ZDBjLi5jNzljYzFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jCkBAIC03OCw2ICs3OCwxMSBAQAogCQljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl81X0dPTEQ6CiAJCQljeF93cml0ZShUU19TT1BfU1RBVCwgMTw8MTMpOwogCQkJYnJlYWs7CisJCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfTk9WQVNQTFVTX1MxOgorCQljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX05PVkFTRTJfUzE6CisJCQljeF93cml0ZShNT19QSU5NVVhfSU8sIDB4ODgpOyAvKiBFbmFibGUgTVBFRyBwYXJhbGxlbCBJTyBhbmQgdmlkZW8gc2lnbmFsIHBpbnMgKi8KKwkJCXVkZWxheSgxMDApOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQljeF93cml0ZShUU19TT1BfU1RBVCwgMHgwMCk7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXR2YXVkaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXR2YXVkaW8uYwppbmRleCBhMWIxMjBjLi5kYThkOTdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC10dmF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdHZhdWRpby5jCkBAIC02MCw2ICs2MCwxMSBAQAogbW9kdWxlX3BhcmFtKGF1ZGlvX2RlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhhdWRpb19kZWJ1ZywgImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBbYXVkaW9dIik7CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWx3YXlzX2FuYWxvZyA9IDA7Cittb2R1bGVfcGFyYW0oYWx3YXlzX2FuYWxvZyxpbnQsMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGFsd2F5c19hbmFsb2csImZvcmNlIGFuYWxvZyBhdWRpbyBvdXQiKTsKKworCiAjZGVmaW5lIGRwcmludGsoZm10LCBhcmcuLi4pCWlmIChhdWRpb19kZWJ1ZykgXAogCXByaW50ayhLRVJOX0RFQlVHICIlcy8wOiAiIGZtdCwgY29yZS0+bmFtZSAsICMjIGFyZykKIApAQCAtMTMyLDE0ICsxMzcsMjIgQEAKIHsKIAl1MzIgdm9sdW1lOwogCisjaWZuZGVmIFVTSU5HX0NYODhfQUxTQQogCS8qIHJlc3RhcnQgZG1hOyBUaGlzIGF2b2lkcyBidXp6IGluIE5JQ0FNIGFuZCBpcyBnb29kIGluIG90aGVycyAgKi8KIAljeDg4X3N0b3BfYXVkaW9fZG1hKGNvcmUpOworI2VuZGlmCiAJY3hfd3JpdGUoQVVEX1JBVEVfVEhSRVNfRE1ELCAweDAwMDAwMEMwKTsKKyNpZm5kZWYgVVNJTkdfQ1g4OF9BTFNBCiAJY3g4OF9zdGFydF9hdWRpb19kbWEoY29yZSk7CisjZW5kaWYKIAogCWlmIChjeDg4X2JvYXJkc1tjb3JlLT5ib2FyZF0uYmxhY2tiaXJkKSB7CiAJCS8qIHNldHMgc291bmQgaW5wdXQgZnJvbSBleHRlcm5hbCBhZGMgKi8KLQkJY3hfc2V0KEFVRF9DVEwsIEVOX0kyU0lOX0VOQUJMRSk7CisJCWlmIChjb3JlLT5ib2FyZCA9PSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9ST1NMWU4pCisJCQljeF9jbGVhcihBVURfQ1RMLCBFTl9JMlNJTl9FTkFCTEUpOworCQllbHNlCisJCQljeF9zZXQoQVVEX0NUTCwgRU5fSTJTSU5fRU5BQkxFKTsKKwogCQljeF93cml0ZShBVURfSTJTSU5QVVRDTlRMLCA0KTsKIAkJY3hfd3JpdGUoQVVEX0JBVURSQVRFLCAxKTsKIAkJLyogJ3Bhc3MtdGhydSBtb2RlJzogdGhpcyBlbmFibGVzIHRoZSBpMnMgb3V0cHV0IHRvIHRoZSBtcGVnIGVuY29kZXIgKi8KQEAgLTE0Nyw3ICsxNjAsOCBAQAogCQljeF93cml0ZShBVURfSTJTT1VUUFVUQ05UTCwgMSk7CiAJCWN4X3dyaXRlKEFVRF9JMlNDTlRMLCAwKTsKIAkJLyogY3hfd3JpdGUoQVVEX0FQQl9JTl9SQVRFX0FESiwgMCk7ICovCi0JfSBlbHNlIHsKKwl9CisJaWYgKChhbHdheXNfYW5hbG9nKSB8fCAoIWN4ODhfYm9hcmRzW2NvcmUtPmJvYXJkXS5ibGFja2JpcmQpKSB7CiAJCWN0bCB8PSBFTl9EQUNfRU5BQkxFOwogCQljeF93cml0ZShBVURfQ1RMLCBjdGwpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jCmluZGV4IDI0YTQ4ZjguLjA3MzQ5NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogCiAjaW5jbHVkZSAiY3g4OC5oIgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAKIC8qIEluY2x1ZGUgVjRMMSBzcGVjaWZpYyBmdW5jdGlvbnMuIFNob3VsZCBiZSByZW1vdmVkIHNvb24gKi8KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgpAQCAtMjQwLDcgKzI0MSw3IEBACiAJCQkubWluaW11bSAgICAgICA9IDAsCiAJCQkubWF4aW11bSAgICAgICA9IDB4ZmYsCiAJCQkuc3RlcCAgICAgICAgICA9IDEsCi0JCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4M2YsCiAJCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCiAJCX0sCiAJCS5vZmYgICAgICAgICAgICAgICAgICAgPSAwLApAQCAtMjcxLDcgKzI3Miw3IEBACiAJCQkubWluaW11bSAgICAgICA9IDAsCiAJCQkubWF4aW11bSAgICAgICA9IDB4ZmYsCiAJCQkuc3RlcCAgICAgICAgICA9IDEsCi0JCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4N2YsCiAJCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCiAJCX0sCiAJCS5vZmYgICAgICAgICAgICAgICAgICAgPSAwLApAQCAtMjg1LDYgKzI4Niw3IEBACiAJCQkubmFtZSAgICAgICAgICA9ICJNdXRlIiwKIAkJCS5taW5pbXVtICAgICAgID0gMCwKIAkJCS5tYXhpbXVtICAgICAgID0gMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMSwKIAkJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKIAkJfSwKIAkJLnJlZyAgICAgICAgICAgICAgICAgICA9IEFVRF9WT0xfQ1RMLApAQCAtMjk4LDcgKzMwMCw3IEBACiAJCQkubWluaW11bSAgICAgICA9IDAsCiAJCQkubWF4aW11bSAgICAgICA9IDB4M2YsCiAJCQkuc3RlcCAgICAgICAgICA9IDEsCi0JCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MWYsCiAJCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCiAJCX0sCiAJCS5yZWcgICAgICAgICAgICAgICAgICAgPSBBVURfVk9MX0NUTCwKQEAgLTc0OCwxMCArNzUwLDkgQEAKIAkJbWlub3IscmFkaW8sdjRsMl90eXBlX25hbWVzW3R5cGVdKTsKIAogCS8qIGFsbG9jYXRlICsgaW5pdGlhbGl6ZSBwZXIgZmlsZWhhbmRsZSBkYXRhICovCi0JZmggPSBrbWFsbG9jKHNpemVvZigqZmgpLEdGUF9LRVJORUwpOworCWZoID0ga3phbGxvYyhzaXplb2YoKmZoKSxHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCA9PSBmaCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KGZoLDAsc2l6ZW9mKCpmaCkpOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZoOwogCWZoLT5kZXYgICAgICA9IGRldjsKIAlmaC0+cmFkaW8gICAgPSByYWRpbzsKQEAgLTkxNyw2ICs5MTgsOSBAQAogCQljdGwtPnZhbHVlID0gKCh2YWx1ZSArIChjLT5vZmYgPDwgYy0+c2hpZnQpKSAmIGMtPm1hc2spID4+IGMtPnNoaWZ0OwogCQlicmVhazsKIAl9CisJcHJpbnRrKCJnZXRfY29udHJvbCBpZD0weCVYIHJlZz0weCUwMnggdmFsPTB4JTAyeCAobWFzayAweCUwMngpJXNcbiIsCisJCQkJCWN0bC0+aWQsIGMtPnJlZywgY3RsLT52YWx1ZSwKKwkJCQkJYy0+bWFzaywgYy0+c3JlZyA/ICIgW3NoYWRvd2VkXSIgOiAiIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTkyNSwxMyArOTI5LDEzIEBACiB7CiAJLyogc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsgKi8KIAlzdHJ1Y3QgY3g4OF9jdHJsICpjID0gTlVMTDsKLQl1MzIgdl9zYXRfdmFsdWU7Ci0JdTMyIHZhbHVlOworCXUzMiB2YWx1ZSxtYXNrOwogCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IENYODgwMF9DVExTOyBpKyspCi0JCWlmIChjeDg4MDBfY3Rsc1tpXS52LmlkID09IGN0bC0+aWQpCisJZm9yIChpID0gMDsgaSA8IENYODgwMF9DVExTOyBpKyspIHsKKwkJaWYgKGN4ODgwMF9jdGxzW2ldLnYuaWQgPT0gY3RsLT5pZCkgewogCQkJYyA9ICZjeDg4MDBfY3Rsc1tpXTsKKwkJfQorCX0KIAlpZiAoTlVMTCA9PSBjKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtOTM5LDYgKzk0Myw3IEBACiAJCWN0bC0+dmFsdWUgPSBjLT52Lm1pbmltdW07CiAJaWYgKGN0bC0+dmFsdWUgPiBjLT52Lm1heGltdW0pCiAJCWN0bC0+dmFsdWUgPSBjLT52Lm1heGltdW07CisJbWFzaz1jLT5tYXNrOwogCXN3aXRjaCAoY3RsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRToKIAkJdmFsdWUgPSAoY3RsLT52YWx1ZSA8IDB4NDApID8gKDB4NDAgLSBjdGwtPnZhbHVlKSA6IGN0bC0+dmFsdWU7CkBAIC05NDgsNTYgKzk1Myw0NCBAQAogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CiAJCS8qIHNwZWNpYWwgdl9zYXQgaGFuZGxpbmcgKi8KLQkJdl9zYXRfdmFsdWUgPSBjdGwtPnZhbHVlIC0gKDB4N2YgLSAweDVhKTsKLQkJaWYgKHZfc2F0X3ZhbHVlID4gMHhmZikKLQkJCXZfc2F0X3ZhbHVlID0gMHhmZjsKLQkJaWYgKHZfc2F0X3ZhbHVlIDwgMHgwMCkKLQkJCXZfc2F0X3ZhbHVlID0gMHgwMDsKLQkJY3hfYW5kb3IoTU9fVVZfU0FUVVJBVElPTiwgMHhmZjAwLCB2X3NhdF92YWx1ZSA8PCA4KTsKLQkJLyogZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQgcm91dGUgZm9yIHVfc2F0ICovCisKKwkJdmFsdWUgPSAoKGN0bC0+dmFsdWUgLSBjLT5vZmYpIDw8IGMtPnNoaWZ0KSAmIGMtPm1hc2s7CisKKwkJaWYgKGNvcmUtPnR2bm9ybS0+aWQgJiBWNEwyX1NURF9TRUNBTSkgeworCQkJLyogRm9yIFNFQ0FNLCBib3RoIFUgYW5kIFYgc2F0IHNob3VsZCBiZSBlcXVhbCAqLworCQkJdmFsdWU9dmFsdWU8PDh8dmFsdWU7CisJCX0gZWxzZSB7CisJCQkvKiBLZWVwcyBVIFNhdHVyYXRpb24gcHJvcG9ydGlvbmFsIHRvIFYgU2F0ICovCisJCQl2YWx1ZT0odmFsdWUqMHg1YSkvMHg3Zjw8OHx2YWx1ZTsKKwkJfQorCQltYXNrPTB4ZmZmZjsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJdmFsdWUgPSAoKGN0bC0+dmFsdWUgLSBjLT5vZmYpIDw8IGMtPnNoaWZ0KSAmIGMtPm1hc2s7CiAJCWJyZWFrOwogCX0KLQlkcHJpbnRrKDEsInNldF9jb250cm9sIGlkPTB4JVggcmVnPTB4JXggdmFsPTB4JXglc1xuIiwKLQkJY3RsLT5pZCwgYy0+cmVnLCB2YWx1ZSwgYy0+c3JlZyA/ICIgW3NoYWRvd2VkXSIgOiAiIik7CisJcHJpbnRrKCJzZXRfY29udHJvbCBpZD0weCVYIHJlZz0weCUwMnggdmFsPTB4JTAyeCAobWFzayAweCUwMngpJXNcbiIsCisJCQkJCWN0bC0+aWQsIGMtPnJlZywgdmFsdWUsCisJCQkJCW1hc2ssIGMtPnNyZWcgPyAiIFtzaGFkb3dlZF0iIDogIiIpOwogCWlmIChjLT5zcmVnKSB7Ci0JCWN4X3NhbmRvcihjLT5zcmVnLCBjLT5yZWcsIGMtPm1hc2ssIHZhbHVlKTsKKwkJY3hfc2FuZG9yKGMtPnNyZWcsIGMtPnJlZywgbWFzaywgdmFsdWUpOwogCX0gZWxzZSB7Ci0JCWN4X2FuZG9yKGMtPnJlZywgYy0+bWFzaywgdmFsdWUpOworCQljeF9hbmRvcihjLT5yZWcsIG1hc2ssIHZhbHVlKTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLS8qIHN0YXRpYyB2b2lkIGluaXRfY29udHJvbHMoc3RydWN0IGN4ODgwMF9kZXYgKmRldikgKi8KIHN0YXRpYyB2b2lkIGluaXRfY29udHJvbHMoc3RydWN0IGN4ODhfY29yZSAqY29yZSkKIHsKLQlzdGF0aWMgc3RydWN0IHY0bDJfY29udHJvbCBtdXRlID0gewotCQkuaWQgICAgPSBWNEwyX0NJRF9BVURJT19NVVRFLAotCQkudmFsdWUgPSAxLAotCX07Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX2NvbnRyb2wgdm9sdW1lID0gewotCQkuaWQgICAgPSBWNEwyX0NJRF9BVURJT19WT0xVTUUsCi0JCS52YWx1ZSA9IDB4M2YsCi0JfTsKLQlzdGF0aWMgc3RydWN0IHY0bDJfY29udHJvbCBodWUgPSB7Ci0JCS5pZCAgICA9IFY0TDJfQ0lEX0hVRSwKLQkJLnZhbHVlID0gMHg4MCwKLQl9OwotCXN0YXRpYyBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyYXN0ID0gewotCQkuaWQgICAgPSBWNEwyX0NJRF9DT05UUkFTVCwKLQkJLnZhbHVlID0gMHg4MCwKLQl9OwotCXN0YXRpYyBzdHJ1Y3QgdjRsMl9jb250cm9sIGJyaWdodG5lc3MgPSB7Ci0JCS5pZCAgICA9IFY0TDJfQ0lEX0JSSUdIVE5FU1MsCi0JCS52YWx1ZSA9IDB4ODAsCi0JfTsKKwlzdHJ1Y3QgdjRsMl9jb250cm9sIGN0cmw7CisJaW50IGk7CiAKLQlzZXRfY29udHJvbChjb3JlLCZtdXRlKTsKLQlzZXRfY29udHJvbChjb3JlLCZ2b2x1bWUpOwotCXNldF9jb250cm9sKGNvcmUsJmh1ZSk7Ci0Jc2V0X2NvbnRyb2woY29yZSwmY29udHJhc3QpOwotCXNldF9jb250cm9sKGNvcmUsJmJyaWdodG5lc3MpOworCWZvciAoaSA9IDA7IGkgPCBDWDg4MDBfQ1RMUzsgaSsrKSB7CisJCWN0cmwuaWQ9Y3g4ODAwX2N0bHNbaV0udi5pZDsKKwkJY3RybC52YWx1ZT1jeDg4MDBfY3Rsc1tpXS52LmRlZmF1bHRfdmFsdWUKKwkJCQkrY3g4ODAwX2N0bHNbaV0ub2ZmOworCQlzZXRfY29udHJvbChjb3JlLCAmY3RybCk7CisJfQogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTExMjUsNyArMTExOCw3IEBACiAJaW50IGVycjsKIAogCWlmICh2aWRlb19kZWJ1ZyA+IDEpCi0JCWN4ODhfcHJpbnRfaW9jdGwoY29yZS0+bmFtZSxjbWQpOworCQl2NGxfcHJpbnRfaW9jdGwoY29yZS0+bmFtZSxjbWQpOwogCXN3aXRjaCAoY21kKSB7CiAKIAkvKiAtLS0gY2FwYWJpbGl0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTI2MSw3ICsxMjU0LDcgQEAKIAogCWRwcmludGsoIDEsICJDT1JFIElPQ1RMOiAweCV4XG4iLCBjbWQgKTsKIAlpZiAodmlkZW9fZGVidWcgPiAxKQotCQljeDg4X3ByaW50X2lvY3RsKGNvcmUtPm5hbWUsY21kKTsKKwkJdjRsX3ByaW50X2lvY3RsKGNvcmUtPm5hbWUsY21kKTsKIAogCXN3aXRjaCAoY21kKSB7CiAJLyogLS0tLS0tLS0tLSB0diBub3JtcyAtLS0tLS0tLS0tICovCkBAIC0xNDgxLDcgKzE0NzQsNyBAQAogCXN0cnVjdCBjeDg4X2NvcmUgICpjb3JlID0gZGV2LT5jb3JlOwogCiAJaWYgKHZpZGVvX2RlYnVnID4gMSkKLQkJY3g4OF9wcmludF9pb2N0bChjb3JlLT5uYW1lLGNtZCk7CisJCXY0bF9wcmludF9pb2N0bChjb3JlLT5uYW1lLGNtZCk7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgVklESU9DX1FVRVJZQ0FQOgpAQCAtMTc0MCw2ICsxNzMzLDcgQEAKIAkucG9sbCAgICAgICAgICA9IHZpZGVvX3BvbGwsCiAJLm1tYXAJICAgICAgID0gdmlkZW9fbW1hcCwKIAkuaW9jdGwJICAgICAgID0gdmlkZW9faW9jdGwsCisJLmNvbXBhdF9pb2N0bCAgPSB2NGxfY29tcGF0X2lvY3RsMzIsCiAJLmxsc2VlayAgICAgICAgPSBub19sbHNlZWssCiB9OwogCkBAIC0xNzY3LDYgKzE3NjEsNyBAQAogCS5vcGVuICAgICAgICAgID0gdmlkZW9fb3BlbiwKIAkucmVsZWFzZSAgICAgICA9IHZpZGVvX3JlbGVhc2UsCiAJLmlvY3RsICAgICAgICAgPSByYWRpb19pb2N0bCwKKwkuY29tcGF0X2lvY3RsICA9IHY0bF9jb21wYXRfaW9jdGwzMiwKIAkubGxzZWVrICAgICAgICA9IG5vX2xsc2VlaywKIH07CiAKQEAgLTE4MTMsMTAgKzE4MDgsOSBAQAogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmU7CiAJaW50IGVycjsKIAotCWRldiA9IGttYWxsb2Moc2l6ZW9mKCpkZXYpLEdGUF9LRVJORUwpOworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLEdGUF9LRVJORUwpOwogCWlmIChOVUxMID09IGRldikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KGRldiwwLHNpemVvZigqZGV2KSk7CiAKIAkvKiBwY2kgaW5pdCAqLwogCWRldi0+cGNpID0gcGNpX2RldjsKQEAgLTE5MjgsOCArMTkyMiw4IEBACiAKIAkvKiBpbml0aWFsIGRldmljZSBjb25maWd1cmF0aW9uICovCiAJZG93bigmY29yZS0+bG9jayk7Ci0JaW5pdF9jb250cm9scyhjb3JlKTsKIAljeDg4X3NldF90dm5vcm0oY29yZSx0dm5vcm1zKTsKKwlpbml0X2NvbnRyb2xzKGNvcmUpOwogCXZpZGVvX211eChjb3JlLDApOwogCXVwKCZjb3JlLT5sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdnAzMDU0LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdnAzMDU0LWkyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MWE3NTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12cDMwNTQtaTJjLmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisKKyAgICBjeDg4LXZwMzA1NC1pMmMuYyAgLS0gIHN1cHBvcnQgZm9yIHRoZSBzZWNvbmRhcnkgSTJDIGJ1cyBvZiB0aGUKKwkJCSAgIEROVFYgTGl2ZSEgRFZCLVQgUHJvIChWUC0zMDU0KSwgd2lyZWQgYXM6CisJCQkgICBHUElPWzBdIC0+IFNDTCwgR1BJT1sxXSAtPiBTREEKKworICAgIChjKSAyMDA1IENocmlzIFBhc2NvZSA8Yy5wYXNjb2VAaXRlZS51cS5lZHUuYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJjeDg4LmgiCisjaW5jbHVkZSAiY3g4OC12cDMwNTQtaTJjLmgiCisKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJkcml2ZXIgZm9yIGN4MjM4OHggVlAzMDU0IGRlc2lnbiIpOworTU9EVUxFX0FVVEhPUigiQ2hyaXMgUGFzY29lIDxjLnBhc2NvZUBpdGVlLnVxLmVkdS5hdT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgdnAzMDU0X2JpdF9zZXRzY2wodm9pZCAqZGF0YSwgaW50IHN0YXRlKQoreworCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXYgPSBkYXRhOworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CisJc3RydWN0IHZwMzA1NF9pMmNfc3RhdGUgKnZwMzA1NF9pMmMgPSBkZXYtPmNhcmRfcHJpdjsKKworCWlmIChzdGF0ZSkgeworCQl2cDMwNTRfaTJjLT5zdGF0ZSB8PSAgMHgwMDAxOwkvKiBTQ0wgaGlnaCAqLworCQl2cDMwNTRfaTJjLT5zdGF0ZSAmPSB+MHgwMTAwOwkvKiBleHRlcm5hbCBwdWxsdXAgKi8KKwl9IGVsc2UgeworCQl2cDMwNTRfaTJjLT5zdGF0ZSAmPSB+MHgwMDAxOwkvKiBTQ0wgbG93ICovCisJCXZwMzA1NF9pMmMtPnN0YXRlIHw9ICAweDAxMDA7CS8qIGRyaXZlIHBpbiAqLworCX0KKwljeF93cml0ZShNT19HUDBfSU8sIDB4MDEwMDAwIHwgdnAzMDU0X2kyYy0+c3RhdGUpOworCWN4X3JlYWQoTU9fR1AwX0lPKTsKK30KKworc3RhdGljIHZvaWQgdnAzMDU0X2JpdF9zZXRzZGEodm9pZCAqZGF0YSwgaW50IHN0YXRlKQoreworCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXYgPSBkYXRhOworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CisJc3RydWN0IHZwMzA1NF9pMmNfc3RhdGUgKnZwMzA1NF9pMmMgPSBkZXYtPmNhcmRfcHJpdjsKKworCWlmIChzdGF0ZSkgeworCQl2cDMwNTRfaTJjLT5zdGF0ZSB8PSAgMHgwMDAyOwkvKiBTREEgaGlnaCAqLworCQl2cDMwNTRfaTJjLT5zdGF0ZSAmPSB+MHgwMjAwOwkvKiB0cmlzdGF0ZSBwaW4gKi8KKwl9IGVsc2UgeworCQl2cDMwNTRfaTJjLT5zdGF0ZSAmPSB+MHgwMDAyOwkvKiBTREEgbG93ICovCisJCXZwMzA1NF9pMmMtPnN0YXRlIHw9ICAweDAyMDA7CS8qIGRyaXZlIHBpbiAqLworCX0KKwljeF93cml0ZShNT19HUDBfSU8sIDB4MDIwMDAwIHwgdnAzMDU0X2kyYy0+c3RhdGUpOworCWN4X3JlYWQoTU9fR1AwX0lPKTsKK30KKworc3RhdGljIGludCB2cDMwNTRfYml0X2dldHNjbCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXYgPSBkYXRhOworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CisJdTMyIHN0YXRlOworCisJc3RhdGUgPSBjeF9yZWFkKE1PX0dQMF9JTyk7CisJcmV0dXJuIChzdGF0ZSAmIDB4MDEpID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgdnAzMDU0X2JpdF9nZXRzZGEodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOworCXUzMiBzdGF0ZTsKKworCXN0YXRlID0gY3hfcmVhZChNT19HUDBfSU8pOworCXJldHVybiAoc3RhdGUgJiAweDAyKSA/IDEgOiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIHZwMzA1NF9pMmNfYWxnb190ZW1wbGF0ZSA9IHsKKwkuc2V0c2RhICA9IHZwMzA1NF9iaXRfc2V0c2RhLAorCS5zZXRzY2wgID0gdnAzMDU0X2JpdF9zZXRzY2wsCisJLmdldHNkYSAgPSB2cDMwNTRfYml0X2dldHNkYSwKKwkuZ2V0c2NsICA9IHZwMzA1NF9iaXRfZ2V0c2NsLAorCS51ZGVsYXkgID0gMTYsCisJLm1kZWxheSAgPSAxMCwKKwkudGltZW91dCA9IDIwMCwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgdnAzMDU0X2kyY19hZGFwX3RlbXBsYXRlID0geworCS5uYW1lICAgICAgICAgICAgICA9ICJjeDIzODh4IiwKKwkub3duZXIgICAgICAgICAgICAgPSBUSElTX01PRFVMRSwKKwkuaWQgICAgICAgICAgICAgICAgPSBJMkNfSFdfQl9DWDIzODh4LAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IHZwMzA1NF9pMmNfY2xpZW50X3RlbXBsYXRlID0geworCS5uYW1lCT0gIlZQLTMwNTQiLAorfTsKKworaW50IHZwMzA1NF9pMmNfcHJvYmUoc3RydWN0IGN4ODgwMl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOworCXN0cnVjdCB2cDMwNTRfaTJjX3N0YXRlICp2cDMwNTRfaTJjOworCWludCByYzsKKworCWlmIChjb3JlLT5ib2FyZCAhPSBDWDg4X0JPQVJEX0ROVFZfTElWRV9EVkJfVF9QUk8pCisJCXJldHVybiAwOworCisJZGV2LT5jYXJkX3ByaXYgPSBremFsbG9jKHNpemVvZigqdnAzMDU0X2kyYyksIEdGUF9LRVJORUwpOworCWlmIChkZXYtPmNhcmRfcHJpdiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwl2cDMwNTRfaTJjID0gZGV2LT5jYXJkX3ByaXY7CisKKwltZW1jcHkoJnZwMzA1NF9pMmMtPmFkYXAsICZ2cDMwNTRfaTJjX2FkYXBfdGVtcGxhdGUsCisJICAgICAgIHNpemVvZih2cDMwNTRfaTJjLT5hZGFwKSk7CisJbWVtY3B5KCZ2cDMwNTRfaTJjLT5hbGdvLCAmdnAzMDU0X2kyY19hbGdvX3RlbXBsYXRlLAorCSAgICAgICBzaXplb2YodnAzMDU0X2kyYy0+YWxnbykpOworCW1lbWNweSgmdnAzMDU0X2kyYy0+Y2xpZW50LCAmdnAzMDU0X2kyY19jbGllbnRfdGVtcGxhdGUsCisJICAgICAgIHNpemVvZih2cDMwNTRfaTJjLT5jbGllbnQpKTsKKworCXZwMzA1NF9pMmMtPmFkYXAuY2xhc3MgfD0gSTJDX0NMQVNTX1RWX0RJR0lUQUw7CisKKwl2cDMwNTRfaTJjLT5hZGFwLmRldi5wYXJlbnQgPSAmZGV2LT5wY2ktPmRldjsKKwlzdHJsY3B5KHZwMzA1NF9pMmMtPmFkYXAubmFtZSwgY29yZS0+bmFtZSwKKwkJc2l6ZW9mKHZwMzA1NF9pMmMtPmFkYXAubmFtZSkpOworCXZwMzA1NF9pMmMtPmFsZ28uZGF0YSA9IGRldjsKKwlpMmNfc2V0X2FkYXBkYXRhKCZ2cDMwNTRfaTJjLT5hZGFwLCBkZXYpOworCXZwMzA1NF9pMmMtPmFkYXAuYWxnb19kYXRhID0gJnZwMzA1NF9pMmMtPmFsZ287CisJdnAzMDU0X2kyYy0+Y2xpZW50LmFkYXB0ZXIgPSAmdnAzMDU0X2kyYy0+YWRhcDsKKworCXZwMzA1NF9iaXRfc2V0c2NsKGRldiwxKTsKKwl2cDMwNTRfYml0X3NldHNkYShkZXYsMSk7CisKKwlyYyA9IGkyY19iaXRfYWRkX2J1cygmdnAzMDU0X2kyYy0+YWRhcCk7CisJaWYgKDAgIT0gcmMpIHsKKwkJcHJpbnRrKCIlczogdnAzMDU0X2kyYyByZWdpc3RlciBGQUlMRURcbiIsIGNvcmUtPm5hbWUpOworCisJCWtmcmVlKGRldi0+Y2FyZF9wcml2KTsKKwkJZGV2LT5jYXJkX3ByaXYgPSBOVUxMOworCX0KKworCXJldHVybiByYzsKK30KKwordm9pZCB2cDMwNTRfaTJjX3JlbW92ZShzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQoreworCXN0cnVjdCB2cDMwNTRfaTJjX3N0YXRlICp2cDMwNTRfaTJjID0gZGV2LT5jYXJkX3ByaXY7CisKKwlpZiAodnAzMDU0X2kyYyA9PSBOVUxMIHx8CisJICAgIGRldi0+Y29yZS0+Ym9hcmQgIT0gQ1g4OF9CT0FSRF9ETlRWX0xJVkVfRFZCX1RfUFJPKQorCQlyZXR1cm47CisKKwlpMmNfYml0X2RlbF9idXMoJnZwMzA1NF9pMmMtPmFkYXApOworCWtmcmVlKHZwMzA1NF9pMmMpOworfQorCitFWFBPUlRfU1lNQk9MKHZwMzA1NF9pMmNfcHJvYmUpOworRVhQT1JUX1NZTUJPTCh2cDMwNTRfaTJjX3JlbW92ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12cDMwNTQtaTJjLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12cDMwNTQtaTJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhMGEwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZwMzA1NC1pMmMuaApAQCAtMCwwICsxLDM1IEBACisvKgorCisgICAgY3g4OC12cDMwNTQtaTJjLmggIC0tICBzdXBwb3J0IGZvciB0aGUgc2Vjb25kYXJ5IEkyQyBidXMgb2YgdGhlCisJCQkgICBETlRWIExpdmUhIERWQi1UIFBybyAoVlAtMzA1NCksIHdpcmVkIGFzOgorCQkJICAgR1BJT1swXSAtPiBTQ0wsIEdQSU9bMV0gLT4gU0RBCisKKyAgICAoYykgMjAwNSBDaHJpcyBQYXNjb2UgPGMucGFzY29lQGl0ZWUudXEuZWR1LmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdHJ1Y3QgdnAzMDU0X2kyY19zdGF0ZSB7CisJc3RydWN0IGkyY19hZGFwdGVyICAgICAgICAgYWRhcDsKKwlzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgICBhbGdvOworCXN0cnVjdCBpMmNfY2xpZW50ICAgICAgICAgIGNsaWVudDsKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitpbnQgIHZwMzA1NF9pMmNfcHJvYmUoc3RydWN0IGN4ODgwMl9kZXYgKmRldik7Cit2b2lkIHZwMzA1NF9pMmNfcmVtb3ZlKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKaW5kZXggNzdiZWFmYy4uZTlmZDU1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oCkBAIC0xNzksNiArMTc5LDE0IEBACiAjZGVmaW5lIENYODhfQk9BUkRfQVRJX0hEVFZXT05ERVIgICAgICAgICAgMzQKICNkZWZpbmUgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjEwMDAgICAgICAgICAzNQogI2RlZmluZSBDWDg4X0JPQVJEX0FWRVJUVl8zMDMgICAgICAgICAgICAgIDM2CisjZGVmaW5lIENYODhfQk9BUkRfSEFVUFBBVUdFX05PVkFTUExVU19TMSAgMzcKKyNkZWZpbmUgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfTk9WQVNFMl9TMSAgICAzOAorI2RlZmluZSBDWDg4X0JPQVJEX0tXT1JMRF9EVkJTXzEwMCAgICAgICAgIDM5CisjZGVmaW5lIENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjExMDAgICAgICAgNDAKKyNkZWZpbmUgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMTEwMExQICAgICA0MQorI2RlZmluZSBDWDg4X0JPQVJEX0ROVFZfTElWRV9EVkJfVF9QUk8gICAgIDQyCisjZGVmaW5lIENYODhfQk9BUkRfS1dPUkxEX0RWQl9UX0NYMjI3MDIgICAgNDMKKyNkZWZpbmUgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX0RVQUwgNDQKIAogZW51bSBjeDg4X2l0eXBlIHsKIAlDWDg4X1ZNVVhfQ09NUE9TSVRFMSA9IDEsCkBAIC0yODAsNiArMjg4LDkgQEAKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICB0ZGE5ODg3X2NvbmY7CiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgaGFzX3JhZGlvOwogCisJLyogU3VwcG9ydGVkIFY0TCBfU1REXyB0dW5lciBmb3JtYXRzICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgdHVuZXJfZm9ybWF0czsKKwogCS8qIGNvbmZpZyBpbmZvIC0tIGR2YiAqLwogCXN0cnVjdCBkdmJfcGxsX2Rlc2MgICAgICAgICpwbGxfZGVzYzsKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBwbGxfYWRkcjsKQEAgLTMwMSw2ICszMTIsOSBAQAogCiAJLyogdmFyaW91cyB2NGwgY29udHJvbHMgKi8KIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICBmcmVxOworCisJLyogY3g4OC12aWRlbyBuZWVkcyB0byBhY2Nlc3MgY3g4ODAyIGZvciBoeWJyaWQgdHVuZXIgcGxsIGFjY2Vzcy4gKi8KKwlzdHJ1Y3QgY3g4ODAyX2RldiAgICAgICAgICAqZHZiZGV2OwogfTsKIAogc3RydWN0IGN4ODgwMF9kZXY7CkBAIC00MTEsNiArNDI1LDggQEAKIAlzdHJ1Y3QgdmlkZW9idWZfZHZiICAgICAgICBkdmI7CiAJdm9pZCogICAgICAgICAgICAgICAgICAgICAgZmVfaGFuZGxlOwogCWludCAgICAgICAgICAgICAgICAgICAgICAgICgqZmVfcmVsZWFzZSkodm9pZCAqaGFuZGxlKTsKKworCXZvaWQJCQkgICAqY2FyZF9wcml2OwogCS8qIGZvciBzd2l0Y2hpbmcgbW9kdWxhdGlvbiB0eXBlcyAqLwogCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgIHRzX2dlbl9jbnRybDsKIApAQCAtNDQ3LDcgKzQ2Myw2IEBACiAKIGV4dGVybiB2b2lkIGN4ODhfcHJpbnRfaXJxYml0cyhjaGFyICpuYW1lLCBjaGFyICp0YWcsIGNoYXIgKipzdHJpbmdzLAogCQkJICAgICAgIHUzMiBiaXRzLCB1MzIgbWFzayk7Ci1leHRlcm4gdm9pZCBjeDg4X3ByaW50X2lvY3RsKGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBjbWQpOwogCiBleHRlcm4gaW50IGN4ODhfY29yZV9pcnEoc3RydWN0IGN4ODhfY29yZSAqY29yZSwgdTMyIHN0YXR1cyk7CiBleHRlcm4gdm9pZCBjeDg4X3dha2V1cChzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kcGM3MTQ2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RwYzcxNDYuYwppbmRleCBkYTk0ODExLi4yODMxYmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RwYzcxNDYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RwYzcxNDYuYwpAQCAtOTQsMTIgKzk0LDExIEBACiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICppdGVtOwogCi0JZHBjID0gKHN0cnVjdCBkcGMqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkcGMpLCBHRlBfS0VSTkVMKTsKKwlkcGMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHBjKSwgR0ZQX0tFUk5FTCk7CiAJaWYoIE5VTEwgPT0gZHBjICkgewogCQlwcmludGsoImRwY192NGwyLm86IGRwY19wcm9iZTogbm90IGVub3VnaCBrZXJuZWwgbWVtb3J5LlxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQoZHBjLCAweDAsIHNpemVvZihzdHJ1Y3QgZHBjKSk7CQogCiAJLyogRklYTUU6IGVuYWJsZSBpMmMtcG9ydCBwaW5zLCB2aWRlby1wb3J0LXBpbnMKIAkgICB2aWRlbyBwb3J0IHBpbnMgc2hvdWxkIGJlIGVuYWJsZWQgaGVyZSA/ISAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYwppbmRleCA1Nzc3OWU2Li41OGY3YjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9jaGlwLmg+CiAjaW5jbHVkZSA8bWVkaWEvdHZlZXByb20uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgIm1zcDM0MDAuaCIKIAogI2luY2x1ZGUgImVtMjh4eC5oIgpAQCAtMjYxLDcgKzI2Miw2IEBACiAJLyogcmVxdWVzdCBzb21lIG1vZHVsZXMgKi8KIAlpZiAoZGV2LT5tb2RlbCA9PSBFTTI4MjBfQk9BUkRfSEFVUFBBVUdFX1dJTlRWX1VTQl8yKSB7CiAJCXN0cnVjdCB0dmVlcHJvbSB0djsKLQkJc3RydWN0IHY0bDJfYXVkaW9vdXQgYW87CiAjaWZkZWYgQ09ORklHX01PRFVMRVMKIAkJcmVxdWVzdF9tb2R1bGUoInR2ZWVwcm9tIik7CiAJCXJlcXVlc3RfbW9kdWxlKCJpci1rYmQtaTJjIik7CkBAIC0yNzQsMTIgKzI3NCw4IEBACiAKIAkJZGV2LT50dW5lcl90eXBlPSB0di50dW5lcl90eXBlOwogCQlpZiAodHYuYXVkaW9fcHJvY2Vzc29yID09IEFVRElPX0NISVBfTVNQMzRYWCkgeworCQkJZGV2LT5pMnNfc3BlZWQ9MjA0ODAwMDsKIAkJCWRldi0+aGFzX21zcDM0eHg9MTsKLQkJCW1lbXNldCAoJmFvLDAsc2l6ZW9mKGFvKSk7Ci0KLQkJCWFvLmluZGV4PTI7Ci0JCQlhby5tb2RlPVY0TDJfQVVETU9ERV8zMkJJVFM7Ci0JCQllbTI4eHhfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFZJRElPQ19TX0FVRE9VVCwgJmFvKTsKIAkJfSBlbHNlCiAJCQlkZXYtPmhhc19tc3AzNHh4PTA7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jb3JlLmMKaW5kZXggMGNmZTc1NC4uZGZmMzg5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY29yZS5jCkBAIC0zMiw3ICszMiw3IEBACiAKIC8qICNkZWZpbmUgRU5BQkxFX0RFQlVHX0lTT0NfRlJBTUVTICovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29yZV9kZWJ1ZzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29yZV9kZWJ1ZyA9IDA7CiBtb2R1bGVfcGFyYW0oY29yZV9kZWJ1ZyxpbnQsMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGNvcmVfZGVidWcsImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBbY29yZV0iKTsKIApAQCAtNDEsNyArNDEsNyBAQAogCQlwcmludGsoS0VSTl9JTkZPICIlcyAlcyA6ImZtdCwgXAogCQkJIGRldi0+bmFtZSwgX19GVU5DVElPTl9fICwgIyNhcmcpOyB9IHdoaWxlICgwKQogCi1zdGF0aWMgdW5zaWduZWQgaW50IHJlZ19kZWJ1ZzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVnX2RlYnVnID0gMDsKIG1vZHVsZV9wYXJhbShyZWdfZGVidWcsaW50LDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhyZWdfZGVidWcsImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBbVVJCIHJlZ10iKTsKIApAQCAtNTAsNyArNTAsNyBAQAogCQlwcmludGsoS0VSTl9JTkZPICIlcyAlcyA6ImZtdCwgXAogCQkJIGRldi0+bmFtZSwgX19GVU5DVElPTl9fICwgIyNhcmcpOyB9IHdoaWxlICgwKQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGlzb2NfZGVidWc7CitzdGF0aWMgdW5zaWduZWQgaW50IGlzb2NfZGVidWcgPSAwOwogbW9kdWxlX3BhcmFtKGlzb2NfZGVidWcsaW50LDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpc29jX2RlYnVnLCJlbmFibGUgZGVidWcgbWVzc2FnZXMgW2lzb2MgdHJhbnNmZXJzXSIpOwogCkBAIC02Myw1OSArNjMsNiBAQAogbW9kdWxlX3BhcmFtKGFsdCwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYWx0LCAiYWx0ZXJuYXRlIHNldHRpbmcgdG8gdXNlIGZvciB2aWRlbyBlbmRwb2ludCIpOwogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIGRlYnVnIGhlbHAgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqdjRsMV9pb2N0bHNbXSA9IHsKLQkiMCIsICJDR0FQIiwgIkdDSEFOIiwgIlNDSEFOIiwgIkdUVU5FUiIsICJTVFVORVIiLCAiR1BJQ1QiLCAiU1BJQ1QiLAotCSJDQ0FQVFVSRSIsICJHV0lOIiwgIlNXSU4iLCAiR0ZCVUYiLCAiU0ZCVUYiLCAiS0VZIiwgIkdGUkVRIiwKLQkiU0ZSRVEiLCAiR0FVRElPIiwgIlNBVURJTyIsICJTWU5DIiwgIk1DQVBUVVJFIiwgIkdNQlVGIiwgIkdVTklUIiwKLQkiR0NBUFRVUkUiLCAiU0NBUFRVUkUiLCAiU1BMQVlNT0RFIiwgIlNXUklURU1PREUiLCAiR1BMQVlJTkZPIiwKLQkiU01JQ1JPQ09ERSIsICJHVkJJRk1UIiwgIlNWQklGTVQiIH07Ci0jZGVmaW5lIFY0TDFfSU9DVExTIEFSUkFZX1NJWkUodjRsMV9pb2N0bHMpCi0KLXN0YXRpYyBjb25zdCBjaGFyICp2NGwyX2lvY3Rsc1tdID0gewotCSJRVUVSWUNBUCIsICIxIiwgIkVOVU1fUElYRk1UIiwgIkVOVU1fRkJVRkZNVCIsICJHX0ZNVCIsICJTX0ZNVCIsCi0JIkdfQ09NUCIsICJTX0NPTVAiLCAiUkVRQlVGUyIsICJRVUVSWUJVRiIsICJHX0ZCVUYiLCAiU19GQlVGIiwKLQkiR19XSU4iLCAiU19XSU4iLCAiUFJFVklFVyIsICJRQlVGIiwgIjE2IiwgIkRRQlVGIiwgIlNUUkVBTU9OIiwKLQkiU1RSRUFNT0ZGIiwgIkdfUEVSRiIsICJHX1BBUk0iLCAiU19QQVJNIiwgIkdfU1REIiwgIlNfU1REIiwKLQkiRU5VTVNURCIsICJFTlVNSU5QVVQiLCAiR19DVFJMIiwgIlNfQ1RSTCIsICJHX1RVTkVSIiwgIlNfVFVORVIiLAotCSJHX0ZSRVEiLCAiU19GUkVRIiwgIkdfQVVESU8iLCAiU19BVURJTyIsICIzNSIsICJRVUVSWUNUUkwiLAotCSJRVUVSWU1FTlUiLCAiR19JTlBVVCIsICJTX0lOUFVUIiwgIkVOVU1DVlQiLCAiNDEiLCAiNDIiLCAiNDMiLAotCSI0NCIsICI0NSIsICAiR19PVVRQVVQiLCAiU19PVVRQVVQiLCAiRU5VTU9VVFBVVCIsICJHX0FVRE9VVCIsCi0JIlNfQVVET1VUIiwgIkVOVU1GWCIsICJHX0VGRkVDVCIsICJTX0VGRkVDVCIsICJHX01PRFVMQVRPUiIsCi0JIlNfTU9EVUxBVE9SIgotfTsKLSNkZWZpbmUgVjRMMl9JT0NUTFMgQVJSQVlfU0laRSh2NGwyX2lvY3RscykKLQotdm9pZCBlbTI4eHhfcHJpbnRfaW9jdGwoY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IGNtZCkKLXsKLQljaGFyICpkaXI7Ci0KLQlzd2l0Y2ggKF9JT0NfRElSKGNtZCkpIHsKLQljYXNlIF9JT0NfTk9ORTogICAgICAgICAgICAgIGRpciA9ICItLSI7IGJyZWFrOwotCWNhc2UgX0lPQ19SRUFEOiAgICAgICAgICAgICAgZGlyID0gInItIjsgYnJlYWs7Ci0JY2FzZSBfSU9DX1dSSVRFOiAgICAgICAgICAgICBkaXIgPSAiLXciOyBicmVhazsKLQljYXNlIF9JT0NfUkVBRCB8IF9JT0NfV1JJVEU6IGRpciA9ICJydyI7IGJyZWFrOwotCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgZGlyID0gIj8/IjsgYnJlYWs7Ci0JfQotCXN3aXRjaCAoX0lPQ19UWVBFKGNtZCkpIHsKLQljYXNlICd2JzoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpb2N0bCAweCUwOHggKHY0bDEsICVzLCBWSURJT0MlcylcbiIsCi0JCSAgICAgICBuYW1lLCBjbWQsIGRpciwgKF9JT0NfTlIoY21kKSA8IFY0TDFfSU9DVExTKSA/Ci0JCSAgICAgICB2NGwxX2lvY3Rsc1tfSU9DX05SKGNtZCldIDogIj8/PyIpOwotCQlicmVhazsKLQljYXNlICdWJzoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpb2N0bCAweCUwOHggKHY0bDIsICVzLCBWSURJT0NfJXMpXG4iLAotCQkgICAgICAgbmFtZSwgY21kLCBkaXIsIChfSU9DX05SKGNtZCkgPCBWNEwyX0lPQ1RMUykgPwotCQkgICAgICAgdjRsMl9pb2N0bHNbX0lPQ19OUihjbWQpXSA6ICI/Pz8iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpb2N0bCAweCUwOHggKD8/PywgJXMsICMlZClcbiIsCi0JCSAgICAgICBuYW1lLCBjbWQsIGRpciwgX0lPQ19OUihjbWQpKTsKLQl9Ci19Ci0KIAogLyoKICAqIGVtMjh4eF9yZXF1ZXN0X2J1ZmZlcnMoKQpAQCAtMTI2LDcgKzczLDcgQEAKIAljb25zdCBzaXplX3QgaW1hZ2VzaXplID0gUEFHRV9BTElHTihkZXYtPmZyYW1lX3NpemUpOwkvKm5lZWRzIHRvIGJlIHBhZ2UgYWxpZ25lZCBjYXVzZSB0aGUgYnVmZmVycyBjYW4gYmUgbWFwcGVkIGluZGl2aWR1YWxseSEgKi8KIAl2b2lkICpidWZmID0gTlVMTDsKIAl1MzIgaTsKLQllbTI4eHhfY29yZWRiZygicmVxdWVzdGVkICVpIGJ1ZmZlcnMgd2l0aCBzaXplICV6ZCIsIGNvdW50LCBpbWFnZXNpemUpOworCWVtMjh4eF9jb3JlZGJnKCJyZXF1ZXN0ZWQgJWkgYnVmZmVycyB3aXRoIHNpemUgJXppIiwgY291bnQsIGltYWdlc2l6ZSk7CiAJaWYgKGNvdW50ID4gRU0yOFhYX05VTV9GUkFNRVMpCiAJCWNvdW50ID0gRU0yOFhYX05VTV9GUkFNRVM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pMmMuYwppbmRleCBkMTRiY2Y0Li4wNTkxYTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWkyYy5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdmlkZW9fZGVjb2Rlci5oPgogCiAjaW5jbHVkZSAiZW0yOHh4LmgiCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNDg2LDkgKzQ4Nyw3IEBACiAJLmluY191c2UgPSBpbmNfdXNlLAogCS5kZWNfdXNlID0gZGVjX3VzZSwKICNlbmRpZgotI2lmZGVmIEkyQ19DTEFTU19UVl9BTkFMT0cKIAkuY2xhc3MgPSBJMkNfQ0xBU1NfVFZfQU5BTE9HLAotI2VuZGlmCiAJLm5hbWUgPSAiZW0yOHh4IiwKIAkuaWQgPSBJMkNfSFdfQl9FTTI4WFgsCiAJLmFsZ28gPSAmZW0yOHh4X2FsZ28sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCmluZGV4IDliOTRmNzcuLjMwZGZhNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCkBAIC03Niw2ICs3Niw1OCBAQAogCVsgMHg0MCBdID0gS0VZX1pPT00sCiB9OwogCitzdGF0aWMgSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfZW1fcGlubmFjbGVfdXNiW0lSX0tFWVRBQl9TSVpFXSA9IHsKKwlbIDB4M2EgXSA9IEtFWV9LUDAsCisJWyAweDMxIF0gPSBLRVlfS1AxLAorCVsgMHgzMiBdID0gS0VZX0tQMiwKKwlbIDB4MzMgXSA9IEtFWV9LUDMsCisJWyAweDM0IF0gPSBLRVlfS1A0LAorCVsgMHgzNSBdID0gS0VZX0tQNSwKKwlbIDB4MzYgXSA9IEtFWV9LUDYsCisJWyAweDM3IF0gPSBLRVlfS1A3LAorCVsgMHgzOCBdID0gS0VZX0tQOCwKKwlbIDB4MzkgXSA9IEtFWV9LUDksCisKKwlbIDB4MmYgXSA9IEtFWV9QT1dFUiwKKworCVsgMHgyZSBdID0gS0VZX1AsCisJWyAweDFmIF0gPSBLRVlfTCwKKwlbIDB4MmIgXSA9IEtFWV9JLAorCisJWyAweDJkIF0gPSBLRVlfWk9PTSwKKwlbIDB4MWUgXSA9IEtFWV9aT09NLAorCVsgMHgxYiBdID0gS0VZX1ZPTFVNRVVQLAorCVsgMHgwZiBdID0gS0VZX1ZPTFVNRURPV04sCisJWyAweDE3IF0gPSBLRVlfQ0hBTk5FTFVQLAorCVsgMHgxYyBdID0gS0VZX0NIQU5ORUxET1dOLAorCVsgMHgyNSBdID0gS0VZX0lORk8sCisKKwlbIDB4M2MgXSA9IEtFWV9NVVRFLAorCisJWyAweDNkIF0gPSBLRVlfTEVGVCwKKwlbIDB4M2IgXSA9IEtFWV9SSUdIVCwKKworCVsgMHgzZiBdID0gS0VZX1VQLAorCVsgMHgzZSBdID0gS0VZX0RPV04sCisJWyAweDFhIF0gPSBLRVlfUEFVU0UsCisKKwlbIDB4MWQgXSA9IEtFWV9NRU5VLAorCVsgMHgxOSBdID0gS0VZX1BMQVksCisJWyAweDE2IF0gPSBLRVlfUkVXSU5ELAorCVsgMHgxMyBdID0gS0VZX0ZPUldBUkQsCisJWyAweDE1IF0gPSBLRVlfUEFVU0UsCisJWyAweDBlIF0gPSBLRVlfUkVXSU5ELAorCVsgMHgwZCBdID0gS0VZX1BMQVksCisJWyAweDBiIF0gPSBLRVlfU1RPUCwKKwlbIDB4MDcgXSA9IEtFWV9GT1JXQVJELAorCVsgMHgyNyBdID0gS0VZX1JFQ09SRCwKKwlbIDB4MjYgXSA9IEtFWV9UVU5FUiwKKwlbIDB4MjkgXSA9IEtFWV9URVhULAorCVsgMHgyYSBdID0gS0VZX01FRElBLAorCVsgMHgxOCBdID0gS0VZX0VQRywKKwlbIDB4MjcgXSA9IEtFWV9SRUNPUkQsCit9OworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgaW50IGdldF9rZXlfdGVycmF0ZWMoc3RydWN0IElSX2kyYyAqaXIsIHUzMiAqaXJfa2V5LCB1MzIgKmlyX3JhdykKQEAgLTEzOCw2ICsxOTAsMjggQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIGludCBnZXRfa2V5X3Bpbm5hY2xlX3VzYihzdHJ1Y3QgSVJfaTJjICppciwgdTMyICppcl9rZXksIHUzMiAqaXJfcmF3KQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzNdOworCisJLyogcG9sbCBJUiBjaGlwICovCisKKwlpZiAoMyAhPSBpMmNfbWFzdGVyX3JlY3YoJmlyLT5jLGJ1ZiwzKSkgeworCQlkcHJpbnRrKCJyZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZHByaW50aygia2V5ICUwMnhcbiIsIGJ1ZlsyXSYweDNmKTsKKwlpZiAoYnVmWzBdIT0weDAwKXsKKwkJcmV0dXJuIDA7CisJfQorCisJKmlyX2tleSA9IGJ1ZlsyXSYweDNmOworCSppcl9yYXcgPSBidWZbMl0mMHgzZjsKKworCXJldHVybiAxOworfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogdm9pZCBlbTI4eHhfc2V0X2lyKHN0cnVjdCBlbTI4eHggKiBkZXYsc3RydWN0IElSX2kyYyAqaXIpCiB7CkBAIC0xNTksNiArMjMzLDkgQEAKIAkJc25wcmludGYoaXItPmMubmFtZSwgc2l6ZW9mKGlyLT5jLm5hbWUpLCAiaTJjIElSIChFTTI4WFggVGVycmF0ZWMpIik7CiAJCWJyZWFrOwogCWNhc2UgKEVNMjgyMF9CT0FSRF9QSU5OQUNMRV9VU0JfMik6CisJCWlyLT5pcl9jb2RlcyA9IGlyX2NvZGVzX2VtX3Bpbm5hY2xlX3VzYjsKKwkJaXItPmdldF9rZXkgPSBnZXRfa2V5X3Bpbm5hY2xlX3VzYjsKKwkJc25wcmludGYoaXItPmMubmFtZSwgc2l6ZW9mKGlyLT5jLm5hbWUpLCAiaTJjIElSIChFTTI4WFggUGlubmFjbGUgUENUVikiKTsKIAkJYnJlYWs7CiAJY2FzZSAoRU0yODIwX0JPQVJEX0hBVVBQQVVHRV9XSU5UVl9VU0JfMik6CiAJCWlyLT5pcl9jb2RlcyA9IGlyX2NvZGVzX2hhdXBwYXVnZV9uZXc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC12aWRlby5jCmluZGV4IDNhNTYxMjAuLmVlYTMwNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC12aWRlby5jCkBAIC0yOSw5ICsyOSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgImVtMjh4eC5oIgogI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KIAogI2RlZmluZSBEUklWRVJfQVVUSE9SICJMdWRvdmljbyBDYXZlZG9uIDxjYXZlZG9uQHNzc3VwLml0PiwgIiBcCiAJCSAgICAgICJNYXJrdXMgUmVjaGJlcmdlciA8bXJlY2hiZXJnZXJAZ21haWwuY29tPiwgIiBcCkBAIC0xMDYsOCArMTA4LDMyIEBACiAjZGVmaW5lIFRWTk9STVMgQVJSQVlfU0laRSh0dm5vcm1zKQogCiAvKiBzdXBwb3J0ZWQgY29udHJvbHMgKi8KKy8qIENvbW1vbiB0byBhbGwgYm9hcmRzICovCiBzdGF0aWMgc3RydWN0IHY0bDJfcXVlcnljdHJsIGVtMjh4eF9xY3RybFtdID0gewogCXsKKwkJLmlkID0gVjRMMl9DSURfQVVESU9fVk9MVU1FLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIlZvbHVtZSIsCisJCS5taW5pbXVtID0gMHgwLAorCQkubWF4aW11bSA9IDB4MWYsCisJCS5zdGVwID0gMHgxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDB4MWYsCisJCS5mbGFncyA9IDAsCisJfSx7CisJCS5pZCA9IFY0TDJfQ0lEX0FVRElPX01VVEUsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJLm5hbWUgPSAiTXV0ZSIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwkJLmZsYWdzID0gMCwKKwl9Cit9OworCisvKiBGSVhNRTogVGhlc2UgYXJlIHNwZWNpZmljIHRvIHNhYTcxMXggLSBzaG91bGQgYmUgbW92ZWQgdG8gaXRzIGNvZGUgKi8KK3N0YXRpYyBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgc2FhNzExeF9xY3RybFtdID0geworCXsKIAkJLmlkID0gVjRMMl9DSURfQlJJR0hUTkVTUywKIAkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAogCQkubmFtZSA9ICJCcmlnaHRuZXNzIiwKQEAgLTEzNSwyNCArMTYxLDYgQEAKIAkJLmRlZmF1bHRfdmFsdWUgPSAweDEwLAogCQkuZmxhZ3MgPSAwLAogCX0sewotCQkuaWQgPSBWNEwyX0NJRF9BVURJT19WT0xVTUUsCi0JCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUgPSAiVm9sdW1lIiwKLQkJLm1pbmltdW0gPSAweDAsCi0JCS5tYXhpbXVtID0gMHgxZiwKLQkJLnN0ZXAgPSAweDEsCi0JCS5kZWZhdWx0X3ZhbHVlID0gMHgxZiwKLQkJLmZsYWdzID0gMCwKLQl9LHsKLQkJLmlkID0gVjRMMl9DSURfQVVESU9fTVVURSwKLQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZSA9ICJNdXRlIiwKLQkJLm1pbmltdW0gPSAwLAotCQkubWF4aW11bSA9IDEsCi0JCS5zdGVwID0gMSwKLQkJLmRlZmF1bHRfdmFsdWUgPSAxLAotCQkuZmxhZ3MgPSAwLAotCX0sewogCQkuaWQgPSBWNEwyX0NJRF9SRURfQkFMQU5DRSwKIAkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAogCQkubmFtZSA9ICJSZWQgY2hyb21hIGJhbGFuY2UiLApAQCAtMTc5LDEyICsxODcsMTIgQEAKIAkJLnN0ZXAgPSAweDEsCiAJCS5kZWZhdWx0X3ZhbHVlID0gMHgyMCwKIAkJLmZsYWdzID0gMCwKLQkgfQorCX0KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBlbTI4eHhfdXNiX2RyaXZlcjsKIAotc3RhdGljIERFQ0xBUkVfTVVURVgoZW0yOHh4X3N5c2ZzX2xvY2spOworc3RhdGljIERFRklORV9NVVRFWChlbTI4eHhfc3lzZnNfbG9jayk7CiBzdGF0aWMgREVDTEFSRV9SV1NFTShlbTI4eHhfZGlzY29ubmVjdCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKiogIHY0bDIgaW50ZXJmYWNlICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yODAsNiArMjg4LDggQEAKIAllbTI4eHhfdmlkZW9kYmcoIlNldHRpbmcgaW5wdXQgaW5kZXg9JWQsIHZtdXg9JWQsIGFtdXg9JWRcbiIsaW5kZXgsaW5wdXQsZGV2LT5jdGxfYWlucHV0KTsKIAogCWlmIChkZXYtPmhhc19tc3AzNHh4KSB7CisJCWlmIChkZXYtPmkyc19zcGVlZCkKKwkJCWVtMjh4eF9pMmNfY2FsbF9jbGllbnRzKGRldiwgVklESU9DX0lOVF9JMlNfQ0xPQ0tfRlJFUSwgJmRldi0+aTJzX3NwZWVkKTsKIAkJZW0yOHh4X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfU19BVURJTywgJmRldi0+Y3RsX2FpbnB1dCk7CiAJCWFpbnB1dCA9IEVNMjhYWF9BVURJT19TUkNfVFVORVI7CiAJCWVtMjh4eF9hdWRpb19zb3VyY2UoZGV2LCBhaW5wdXQpOwpAQCAtMzg1LDcgKzM5NSw3IEBACiAqLwogc3RhdGljIHZvaWQgZW0yOHh4X3JlbGVhc2VfcmVzb3VyY2VzKHN0cnVjdCBlbTI4eHggKmRldikKIHsKLQlkb3duKCZlbTI4eHhfc3lzZnNfbG9jayk7CisJbXV0ZXhfbG9jaygmZW0yOHh4X3N5c2ZzX2xvY2spOwogCiAJZW0yOHh4X2luZm8oIlY0TDIgZGV2aWNlIC9kZXYvdmlkZW8lZCBkZXJlZ2lzdGVyZWRcbiIsCiAJCSAgICBkZXYtPnZkZXYtPm1pbm9yKTsKQEAgLTM5NCw3ICs0MDQsNyBAQAogLyoJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT52YmlfZGV2KTsgKi8KIAllbTI4eHhfaTJjX3VucmVnaXN0ZXIoZGV2KTsKIAl1c2JfcHV0X2RldihkZXYtPnVkZXYpOwotCXVwKCZlbTI4eHhfc3lzZnNfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZlbTI4eHhfc3lzZnNfbG9jayk7CiB9CiAKIC8qCkBAIC02NzQsNyArNjg0LDYgQEAKICAqLwogc3RhdGljIGludCBlbTI4eHhfZ2V0X2N0cmwoc3RydWN0IGVtMjh4eCAqZGV2LCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewotCXMzMiB0bXA7CiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKIAkJY3RybC0+dmFsdWUgPSBkZXYtPm11dGU7CkBAIC02ODIsNiArNjkxLDE2IEBACiAJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CiAJCWN0cmwtPnZhbHVlID0gZGV2LT52b2x1bWU7CiAJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworLypGSVhNRTogc2hvdWxkIGJlIG1vdmVkIHRvIHNhYTcxMXggKi8KK3N0YXRpYyBpbnQgc2FhNzExeF9nZXRfY3RybChzdHJ1Y3QgZW0yOHh4ICpkZXYsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJczMyIHRtcDsKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgogCQlpZiAoKHRtcCA9IGVtMjh4eF9icmlnaHRuZXNzX2dldChkZXYpKSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKQEAgLTczMSw2ICs3NTAsMTUgQEAKIAljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKIAkJZGV2LT52b2x1bWUgPSBjdHJsLT52YWx1ZTsKIAkJcmV0dXJuIGVtMjh4eF9hdWRpb19hbmFsb2dfc2V0KGRldik7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCisvKkZJWE1FOiBzaG91bGQgYmUgbW92ZWQgdG8gc2FhNzExeCAqLworc3RhdGljIGludCBzYWE3MTF4X3NldF9jdHJsKHN0cnVjdCBlbTI4eHggKmRldiwgY29uc3Qgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgogCQlyZXR1cm4gZW0yOHh4X2JyaWdodG5lc3Nfc2V0KGRldiwgY3RybC0+dmFsdWUpOwogCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CkBAIC05OTQsMTQgKzEwMjIsMzQgQEAKIAljYXNlIFZJRElPQ19RVUVSWUNUUkw6CiAJCXsKIAkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMgPSBhcmc7Ci0JCQl1OCBpLCBuOwotCQkJbiA9IHNpemVvZihlbTI4eHhfcWN0cmwpIC8gc2l6ZW9mKGVtMjh4eF9xY3RybFswXSk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotCQkJCWlmIChxYy0+aWQgJiYgcWMtPmlkID09IGVtMjh4eF9xY3RybFtpXS5pZCkgewotCQkJCQltZW1jcHkocWMsICYoZW0yOHh4X3FjdHJsW2ldKSwKKwkJCWludCBpLCBpZD1xYy0+aWQ7CisKKwkJCW1lbXNldChxYywwLHNpemVvZigqcWMpKTsKKwkJCXFjLT5pZD1pZDsKKworCQkJaWYgKCFkZXYtPmhhc19tc3AzNHh4KSB7CisJCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZW0yOHh4X3FjdHJsKTsgaSsrKSB7CisJCQkJCWlmIChxYy0+aWQgJiYgcWMtPmlkID09IGVtMjh4eF9xY3RybFtpXS5pZCkgeworCQkJCQkJbWVtY3B5KHFjLCAmKGVtMjh4eF9xY3RybFtpXSksCisJCQkJCQlzaXplb2YoKnFjKSk7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChkZXYtPmRlY29kZXIgPT0gRU0yOFhYX1RWUDUxNTApIHsKKwkJCQllbTI4eHhfaTJjX2NhbGxfY2xpZW50cyhkZXYsY21kLHFjKTsKKwkJCQlpZiAocWMtPnR5cGUpCisJCQkJCXJldHVybiAwOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzYWE3MTF4X3FjdHJsKTsgaSsrKSB7CisJCQkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gc2FhNzExeF9xY3RybFtpXS5pZCkgeworCQkJCQltZW1jcHkocWMsICYoc2FhNzExeF9xY3RybFtpXSksCiAJCQkJCSAgICAgICBzaXplb2YoKnFjKSk7CiAJCQkJCXJldHVybiAwOwogCQkJCX0KKwkJCX0KIAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTEwMDksMjkgKzEwNTcsNjQgQEAKIAljYXNlIFZJRElPQ19HX0NUUkw6CiAJCXsKIAkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7CisJCQlpbnQgcmV0dmFsPS1FSU5WQUw7CiAKKwkJCWlmICghZGV2LT5oYXNfbXNwMzR4eCkKKwkJCQlyZXR2YWw9ZW0yOHh4X2dldF9jdHJsKGRldiwgY3RybCk7CisJCQlpZiAocmV0dmFsPT0tRUlOVkFMKSB7CisJCQkJaWYgKGRldi0+ZGVjb2RlciA9PSBFTTI4WFhfVFZQNTE1MCkgeworCQkJCQllbTI4eHhfaTJjX2NhbGxfY2xpZW50cyhkZXYsY21kLGFyZyk7CisJCQkJCXJldHVybiAwOworCQkJCX0KIAotCQkJcmV0dXJuIGVtMjh4eF9nZXRfY3RybChkZXYsIGN0cmwpOworCQkJCXJldHVybiBzYWE3MTF4X2dldF9jdHJsKGRldiwgY3RybCk7CisJCQl9IGVsc2UgcmV0dXJuIHJldHZhbDsKIAkJfQogCi0JY2FzZSBWSURJT0NfU19DVFJMX09MRDoJLyogPz8/ICovCiAJY2FzZSBWSURJT0NfU19DVFJMOgogCQl7CiAJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsID0gYXJnOwotCQkJdTggaSwgbjsKKwkJCXU4IGk7CiAKLQotCQkJbiA9IHNpemVvZihlbTI4eHhfcWN0cmwpIC8gc2l6ZW9mKGVtMjh4eF9xY3RybFswXSk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotCQkJCWlmIChjdHJsLT5pZCA9PSBlbTI4eHhfcWN0cmxbaV0uaWQpIHsKLQkJCQkJaWYgKGN0cmwtPnZhbHVlIDwKLQkJCQkJICAgIGVtMjh4eF9xY3RybFtpXS5taW5pbXVtCi0JCQkJCSAgICB8fCBjdHJsLT52YWx1ZSA+Ci0JCQkJCSAgICBlbTI4eHhfcWN0cmxbaV0ubWF4aW11bSkKLQkJCQkJCXJldHVybiAtRVJBTkdFOwotCi0JCQkJCXJldHVybiBlbTI4eHhfc2V0X2N0cmwoZGV2LCBjdHJsKTsKKwkJCWlmICghZGV2LT5oYXNfbXNwMzR4eCl7CisJCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZW0yOHh4X3FjdHJsKTsgaSsrKSB7CisJCQkJCWlmIChjdHJsLT5pZCA9PSBlbTI4eHhfcWN0cmxbaV0uaWQpIHsKKwkJCQkJCWlmIChjdHJsLT52YWx1ZSA8CisJCQkJCQllbTI4eHhfcWN0cmxbaV0ubWluaW11bQorCQkJCQkJfHwgY3RybC0+dmFsdWUgPgorCQkJCQkJZW0yOHh4X3FjdHJsW2ldLm1heGltdW0pCisJCQkJCQkJcmV0dXJuIC1FUkFOR0U7CisJCQkJCQlyZXR1cm4gZW0yOHh4X3NldF9jdHJsKGRldiwgY3RybCk7CisJCQkJCX0KIAkJCQl9CisJCQl9CisKKwkJCWlmIChkZXYtPmRlY29kZXIgPT0gRU0yOFhYX1RWUDUxNTApIHsKKwkJCQllbTI4eHhfaTJjX2NhbGxfY2xpZW50cyhkZXYsY21kLGFyZyk7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgaWYgKCFkZXYtPmhhc19tc3AzNHh4KSB7CisJCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZW0yOHh4X3FjdHJsKTsgaSsrKSB7CisJCQkJCWlmIChjdHJsLT5pZCA9PSBlbTI4eHhfcWN0cmxbaV0uaWQpIHsKKwkJCQkJCWlmIChjdHJsLT52YWx1ZSA8CisJCQkJCQllbTI4eHhfcWN0cmxbaV0ubWluaW11bQorCQkJCQkJfHwgY3RybC0+dmFsdWUgPgorCQkJCQkJZW0yOHh4X3FjdHJsW2ldLm1heGltdW0pCisJCQkJCQkJcmV0dXJuIC1FUkFOR0U7CisJCQkJCQlyZXR1cm4gZW0yOHh4X3NldF9jdHJsKGRldiwgY3RybCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2FhNzExeF9xY3RybCk7IGkrKykgeworCQkJCQlpZiAoY3RybC0+aWQgPT0gc2FhNzExeF9xY3RybFtpXS5pZCkgeworCQkJCQkJaWYgKGN0cmwtPnZhbHVlIDwKKwkJCQkJCXNhYTcxMXhfcWN0cmxbaV0ubWluaW11bQorCQkJCQkJfHwgY3RybC0+dmFsdWUgPgorCQkJCQkJc2FhNzExeF9xY3RybFtpXS5tYXhpbXVtKQorCQkJCQkJCXJldHVybiAtRVJBTkdFOworCQkJCQkJcmV0dXJuIHNhYTcxMXhfc2V0X2N0cmwoZGV2LCBjdHJsKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIApAQCAtMTE4Nyw3ICsxMjcwLDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAodmlkZW9fZGVidWcgPiAxKQotCQllbTI4eHhfcHJpbnRfaW9jdGwoZGV2LT5uYW1lLGNtZCk7CisJCXY0bF9wcmludF9pb2N0bChkZXYtPm5hbWUsY21kKTsKIAogCXN3aXRjaCAoY21kKSB7CiAKQEAgLTE1NjQsNiArMTY0Nyw4IEBACiAJLnBvbGwgPSBlbTI4eHhfdjRsMl9wb2xsLAogCS5tbWFwID0gZW0yOHh4X3Y0bDJfbW1hcCwKIAkubGxzZWVrID0gbm9fbGxzZWVrLAorCS5jb21wYXRfaW9jdGwgICA9IHY0bF9jb21wYXRfaW9jdGwzMiwKKwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHVzYiBpbnRlcmZhY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNzc3LDEyICsxODYyLDExIEBACiAJfQogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbml0aWFsaXplIGl0ICovCi0JZGV2ID0ga21hbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZGV2ID09IE5VTEwpIHsKIAkJZW0yOHh4X2VycihEUklWRVJfTkFNRSAiOiBvdXQgb2YgbWVtb3J5IVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQoZGV2LCAwLCBzaXplb2YoKmRldikpOwogCiAJLyogY29tcHV0ZSBhbHRlcm5hdGUgbWF4IHBhY2tldCBzaXplcyAqLwogCXVpZiA9IHVkZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlWzBdOwpAQCAtMTg0OCw5ICsxOTMyLDEyIEBACiAJc3RydWN0IGVtMjh4eCAqZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKIAorLypGSVhNRTogSVIgc2hvdWxkIGJlIGRpc2Nvbm5lY3RlZCAqLworCiAJaWYgKCFkZXYpCiAJCXJldHVybjsKIAorCiAJZG93bl93cml0ZSgmZW0yOHh4X2Rpc2Nvbm5lY3QpOwogCiAJZG93bigmZGV2LT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LmgKaW5kZXggNWM3YTQxYy4uMzNkZTlkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICAgZW0yOHh4LWNhcmRzLmMgLSBkcml2ZXIgZm9yIEVtcGlhIEVNMjgwMC9FTTI4MjAvMjg0MCBVU0IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzCisgICBlbTI4eHguaCAtIGRyaXZlciBmb3IgRW1waWEgRU0yODAwL0VNMjgyMC8yODQwIFVTQiB2aWRlbyBjYXB0dXJlIGRldmljZXMKIAogICAgQ29weXJpZ2h0IChDKSAyMDA1IE1hcmt1cyBSZWNoYmVyZ2VyIDxtcmVjaGJlcmdlckBnbWFpbC5jb20+CiAJCSAgICAgIEx1ZG92aWNvIENhdmVkb24gPGNhdmVkb25Ac3NzdXAuaXQ+CkBAIC0yMTYsNiArMjE2LDggQEAKIAl1bnNpZ25lZCBpbnQgaGFzX21zcDM0eHg6MTsKIAl1bnNpZ25lZCBpbnQgaGFzX3RkYTk4ODc6MTsKIAorCXUzMiBpMnNfc3BlZWQ7CQkvKiBJMlMgc3BlZWQgZm9yIGF1ZGlvIGRpZ2l0YWwgc3RyZWFtICovCisKIAllbnVtIGVtMjh4eF9kZWNvZGVyIGRlY29kZXI7CiAKIAlpbnQgdHVuZXJfdHlwZTsJCS8qIHR5cGUgb2YgdGhlIHR1bmVyICovCkBAIC0yOTMsOCArMjk1LDYgQEAKIAogLyogUHJvdmlkZWQgYnkgZW0yOHh4LWNvcmUuYyAqLwogCi12b2lkIGVtMjh4eF9wcmludF9pb2N0bChjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgY21kKTsKLQogdTMyIGVtMjh4eF9yZXF1ZXN0X2J1ZmZlcnMoc3RydWN0IGVtMjh4eCAqZGV2LCB1MzIgY291bnQpOwogdm9pZCBlbTI4eHhfcXVldWVfdW51c2VkZnJhbWVzKHN0cnVjdCBlbTI4eHggKmRldik7CiB2b2lkIGVtMjh4eF9yZWxlYXNlX2J1ZmZlcnMoc3RydWN0IGVtMjh4eCAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGV4aXVtX2dlbWluaS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9oZXhpdW1fZ2VtaW5pLmMKaW5kZXggYzliMDBlYS4uZTdiYmViMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9oZXhpdW1fZ2VtaW5pLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9oZXhpdW1fZ2VtaW5pLmMKQEAgLTI0MCwxMiArMjQwLDExIEBACiAKIAlERUJfRUUoKCIuXG4iKSk7CiAKLQloZXhpdW0gPSAoc3RydWN0IGhleGl1bSAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGV4aXVtKSwgR0ZQX0tFUk5FTCk7CisJaGV4aXVtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhleGl1bSksIEdGUF9LRVJORUwpOwogCWlmIChOVUxMID09IGhleGl1bSkgewogCQlwcmludGsoImhleGl1bV9nZW1pbmk6IG5vdCBlbm91Z2gga2VybmVsIG1lbW9yeSBpbiBoZXhpdW1fYXR0YWNoKCkuXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbXNldChoZXhpdW0sIDB4MCwgc2l6ZW9mKHN0cnVjdCBoZXhpdW0pKTsKIAlkZXYtPmV4dF9wcml2ID0gaGV4aXVtOwogCiAJLyogZW5hYmxlIGkyYy1wb3J0IHBpbnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGV4aXVtX29yaW9uLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2hleGl1bV9vcmlvbi5jCmluZGV4IDQyYTk0MTQuLjBiNmMyMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGV4aXVtX29yaW9uLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9oZXhpdW1fb3Jpb24uYwpAQCAtMjI0LDEyICsyMjQsMTEgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JaGV4aXVtID0gKHN0cnVjdCBoZXhpdW0gKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGhleGl1bSksIEdGUF9LRVJORUwpOworCWhleGl1bSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoZXhpdW0pLCBHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCA9PSBoZXhpdW0pIHsKIAkJcHJpbnRrKCJoZXhpdW1fb3Jpb246IGhleGl1bV9wcm9iZTogbm90IGVub3VnaCBrZXJuZWwgbWVtb3J5LlxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQoaGV4aXVtLCAweDAsIHNpemVvZihzdHJ1Y3QgaGV4aXVtKSk7CiAKIAkvKiBlbmFibGUgaTJjLXBvcnQgcGlucyAqLwogCXNhYTcxNDZfd3JpdGUoZGV2LCBNQzEsIChNQVNLXzA4IHwgTUFTS18yNCB8IE1BU0tfMTAgfCBNQVNLXzI2KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2luZHljYW0uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaW5keWNhbS5jCmluZGV4IGJiNWNiZWMuLjc0MjBiNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaW5keWNhbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaW5keWNhbS5jCkBAIC0yODksMTggKzI4OSwxNSBAQAogCXByaW50ayhLRVJOX0lORk8gIlNHSSBJbmR5Q2FtIGRyaXZlciB2ZXJzaW9uICVzXG4iLAogCSAgICAgICBJTkRZQ0FNX01PRFVMRV9WRVJTSU9OKTsKIAotCWNsaWVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJY2xpZW50ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNsaWVudCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JY2FtZXJhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGluZHljYW0pLCBHRlBfS0VSTkVMKTsKKwljYW1lcmEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW5keWNhbSksIEdGUF9LRVJORUwpOwogCWlmICghY2FtZXJhKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X2ZyZWVfY2xpZW50OwogCX0KIAotCW1lbXNldChjbGllbnQsIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOwotCW1lbXNldChjYW1lcmEsIDAsIHNpemVvZihzdHJ1Y3QgaW5keWNhbSkpOwotCiAJY2xpZW50LT5hZGRyID0gYWRkcjsKIAljbGllbnQtPmFkYXB0ZXIgPSBhZGFwOwogCWNsaWVudC0+ZHJpdmVyID0gJmkyY19kcml2ZXJfaW5keWNhbTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXIta2JkLWdwaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXIta2JkLWdwaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUxMzg1ZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1ncGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NjggKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgR2VyZCBLbm9ycgotICogQ29weXJpZ2h0IChjKSAyMDAzIFBhdmVsIE1hY2hlawotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLQotI2luY2x1ZGUgPG1lZGlhL2lyLWNvbW1vbi5oPgotCi0jaW5jbHVkZSAiYnR0di5oIgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19hdmVybWVkaWFbSVJfS0VZVEFCX1NJWkVdID0gewotCVsgMzQgXSA9IEtFWV9LUDAsCi0JWyA0MCBdID0gS0VZX0tQMSwKLQlbIDI0IF0gPSBLRVlfS1AyLAotCVsgNTYgXSA9IEtFWV9LUDMsCi0JWyAzNiBdID0gS0VZX0tQNCwKLQlbIDIwIF0gPSBLRVlfS1A1LAotCVsgNTIgXSA9IEtFWV9LUDYsCi0JWyA0NCBdID0gS0VZX0tQNywKLQlbIDI4IF0gPSBLRVlfS1A4LAotCVsgNjAgXSA9IEtFWV9LUDksCi0KLQlbIDQ4IF0gPSBLRVlfRUpFQ1RDRCwgICAgIC8vIFVubWFya2VkIG9uIG15IGNvbnRyb2xsZXIKLQlbICAwIF0gPSBLRVlfUE9XRVIsCi0JWyAxOCBdID0gQlROX0xFRlQsICAgICAgICAvLyBESVNQTEFZL0wKLQlbIDUwIF0gPSBCVE5fUklHSFQsICAgICAgIC8vIExPT1AvUgotCVsgMTAgXSA9IEtFWV9NVVRFLAotCVsgMzggXSA9IEtFWV9SRUNPUkQsCi0JWyAyMiBdID0gS0VZX1BBVVNFLAotCVsgNTQgXSA9IEtFWV9TVE9QLAotCVsgMzAgXSA9IEtFWV9WT0xVTUVET1dOLAotCVsgNjIgXSA9IEtFWV9WT0xVTUVVUCwKLQotCVsgMzIgXSA9IEtFWV9UVU5FUiwgICAgICAgLy8gVFYvRk0KLQlbIDE2IF0gPSBLRVlfQ0QsCi0JWyAgOCBdID0gS0VZX1ZJREVPLAotCVsgIDQgXSA9IEtFWV9BVURJTywKLQlbIDEyIF0gPSBLRVlfWk9PTSwgICAgICAgIC8vIGZ1bGwgc2NyZWVuCi0JWyAgMiBdID0gS0VZX0lORk8sICAgICAgICAvLyBwcmV2aWV3Ci0JWyA0MiBdID0gS0VZX1NFQVJDSCwgICAgICAvLyBhdXRvc2NhbgotCVsgMjYgXSA9IEtFWV9TVE9QLCAgICAgICAgLy8gZnJlZXplCi0JWyA1OCBdID0gS0VZX1JFQ09SRCwgICAgICAvLyBjYXB0dXJlCi0JWyAgNiBdID0gS0VZX1BMQVksICAgICAgICAvLyB1bm1hcmtlZAotCVsgNDYgXSA9IEtFWV9SRUQsICAgICAgICAgLy8gdW5tYXJrZWQKLQlbIDE0IF0gPSBLRVlfR1JFRU4sICAgICAgIC8vIHVubWFya2VkCi0KLQlbIDMzIF0gPSBLRVlfWUVMTE9XLCAgICAgIC8vIHVubWFya2VkCi0JWyAxNyBdID0gS0VZX0NIQU5ORUxET1dOLAotCVsgNDkgXSA9IEtFWV9DSEFOTkVMVVAsCi0JWyAgMSBdID0gS0VZX0JMVUUsICAgICAgICAvLyB1bm1hcmtlZAotfTsKLQotLyogTWF0dCBKZXNzb24gPGR2YkBqZXNzb24uZWNsaXBzZS5jby51ayAqLwotc3RhdGljIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2F2ZXJtZWRpYV9kdmJ0W0lSX0tFWVRBQl9TSVpFXSA9IHsKLQlbIDB4MjggXSA9IEtFWV9LUDAsICAgICAgICAgLy8nMCcgLyAnZW50ZXInCi0JWyAweDIyIF0gPSBLRVlfS1AxLCAgICAgICAgIC8vJzEnCi0JWyAweDEyIF0gPSBLRVlfS1AyLCAgICAgICAgIC8vJzInIC8gJ3VwIGFycm93JwotCVsgMHgzMiBdID0gS0VZX0tQMywgICAgICAgICAvLyczJwotCVsgMHgyNCBdID0gS0VZX0tQNCwgICAgICAgICAvLyc0JyAvICdsZWZ0IGFycm93JwotCVsgMHgxNCBdID0gS0VZX0tQNSwgICAgICAgICAvLyc1JwotCVsgMHgzNCBdID0gS0VZX0tQNiwgICAgICAgICAvLyc2JyAvICdyaWdodCBhcnJvdycKLQlbIDB4MjYgXSA9IEtFWV9LUDcsICAgICAgICAgLy8nNycKLQlbIDB4MTYgXSA9IEtFWV9LUDgsICAgICAgICAgLy8nOCcgLyAnZG93biBhcnJvdycKLQlbIDB4MzYgXSA9IEtFWV9LUDksICAgICAgICAgLy8nOScKLQotCVsgMHgyMCBdID0gS0VZX0xJU1QsICAgICAgICAvLyAnc291cmNlJwotCVsgMHgxMCBdID0gS0VZX1RFWFQsICAgICAgICAvLyAndGVsZXRleHQnCi0JWyAweDAwIF0gPSBLRVlfUE9XRVIsICAgICAgIC8vICdwb3dlcicKLQlbIDB4MDQgXSA9IEtFWV9BVURJTywgICAgICAgLy8gJ2F1ZGlvJwotCVsgMHgwNiBdID0gS0VZX1pPT00sICAgICAgICAvLyAnZnVsbCBzY3JlZW4nCi0JWyAweDE4IF0gPSBLRVlfVklERU8sICAgICAgIC8vICdkaXNwbGF5JwotCVsgMHgzOCBdID0gS0VZX1NFQVJDSCwgICAgICAvLyAnbG9vcCcKLQlbIDB4MDggXSA9IEtFWV9JTkZPLCAgICAgICAgLy8gJ3ByZXZpZXcnCi0JWyAweDJhIF0gPSBLRVlfUkVXSU5ELCAgICAgIC8vICdiYWNrd2FyZCA8PCcKLQlbIDB4MWEgXSA9IEtFWV9GQVNURk9SV0FSRCwgLy8gJ2ZvcndhcmQgPj4nCi0JWyAweDNhIF0gPSBLRVlfUkVDT1JELCAgICAgIC8vICdjYXB0dXJlJwotCVsgMHgwYSBdID0gS0VZX01VVEUsICAgICAgICAvLyAnbXV0ZScKLQlbIDB4MmMgXSA9IEtFWV9SRUNPUkQsICAgICAgLy8gJ3JlY29yZCcKLQlbIDB4MWMgXSA9IEtFWV9QQVVTRSwgICAgICAgLy8gJ3BhdXNlJwotCVsgMHgzYyBdID0gS0VZX1NUT1AsICAgICAgICAvLyAnc3RvcCcKLQlbIDB4MGMgXSA9IEtFWV9QTEFZLCAgICAgICAgLy8gJ3BsYXknCi0JWyAweDJlIF0gPSBLRVlfUkVELCAgICAgICAgIC8vICdyZWQnCi0JWyAweDAxIF0gPSBLRVlfQkxVRSwgICAgICAgIC8vICdibHVlJyAvICdjYW5jZWwnCi0JWyAweDBlIF0gPSBLRVlfWUVMTE9XLCAgICAgIC8vICd5ZWxsb3cnIC8gJ29rJwotCVsgMHgyMSBdID0gS0VZX0dSRUVOLCAgICAgICAvLyAnZ3JlZW4nCi0JWyAweDExIF0gPSBLRVlfQ0hBTk5FTERPV04sIC8vICdjaGFubmVsIC0nCi0JWyAweDMxIF0gPSBLRVlfQ0hBTk5FTFVQLCAgIC8vICdjaGFubmVsICsnCi0JWyAweDFlIF0gPSBLRVlfVk9MVU1FRE9XTiwgIC8vICd2b2x1bWUgLScKLQlbIDB4M2UgXSA9IEtFWV9WT0xVTUVVUCwgICAgLy8gJ3ZvbHVtZSArJwotfTsKLQotLyogQXR0aWxhIEtvbmRvcm9zIDxhdHRpbGEua29uZG9yb3NAY2hlbGxvLmh1PiAqLwotc3RhdGljIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2FwYWNfdmlld2NvbXBbSVJfS0VZVEFCX1NJWkVdID0gewotCi0JWyAgMSBdID0gS0VZX0tQMSwKLQlbICAyIF0gPSBLRVlfS1AyLAotCVsgIDMgXSA9IEtFWV9LUDMsCi0JWyAgNCBdID0gS0VZX0tQNCwKLQlbICA1IF0gPSBLRVlfS1A1LAotCVsgIDYgXSA9IEtFWV9LUDYsCi0JWyAgNyBdID0gS0VZX0tQNywKLQlbICA4IF0gPSBLRVlfS1A4LAotCVsgIDkgXSA9IEtFWV9LUDksCi0JWyAgMCBdID0gS0VZX0tQMCwKLQlbIDIzIF0gPSBLRVlfTEFTVCwgICAgICAgIC8vICsxMDAKLQlbIDEwIF0gPSBLRVlfTElTVCwgICAgICAgIC8vIHJlY2FsbAotCi0KLQlbIDI4IF0gPSBLRVlfVFVORVIsICAgICAgIC8vIFRWL0ZNCi0JWyAyMSBdID0gS0VZX1NFQVJDSCwgICAgICAvLyBzY2FuCi0JWyAxOCBdID0gS0VZX1BPV0VSLCAgICAgICAvLyBwb3dlcgotCVsgMzEgXSA9IEtFWV9WT0xVTUVET1dOLCAgLy8gdm9sIHVwCi0JWyAyNyBdID0gS0VZX1ZPTFVNRVVQLCAgICAvLyB2b2wgZG93bgotCVsgMzAgXSA9IEtFWV9DSEFOTkVMRE9XTiwgLy8gY2huIHVwCi0JWyAyNiBdID0gS0VZX0NIQU5ORUxVUCwgICAvLyBjaG4gZG93bgotCi0JWyAxNyBdID0gS0VZX1ZJREVPLCAgICAgICAvLyB2aWRlbwotCVsgMTUgXSA9IEtFWV9aT09NLCAgICAgICAgLy8gZnVsbCBzY3JlZW4KLQlbIDE5IF0gPSBLRVlfTVVURSwgICAgICAgIC8vIG11dGUvdW5tdXRlCi0JWyAxNiBdID0gS0VZX1RFWFQsICAgICAgICAvLyBtaW4KLQotCVsgMTMgXSA9IEtFWV9TVE9QLCAgICAgICAgLy8gZnJlZXplCi0JWyAxNCBdID0gS0VZX1JFQ09SRCwgICAgICAvLyByZWNvcmQKLQlbIDI5IF0gPSBLRVlfUExBWVBBVVNFLCAgIC8vIHN0b3AKLQlbIDI1IF0gPSBLRVlfUExBWSwgICAgICAgIC8vIHBsYXkKLQotCVsgMjIgXSA9IEtFWV9HT1RPLCAgICAgICAgLy8gb3NkCi0JWyAyMCBdID0gS0VZX1JFRlJFU0gsICAgICAvLyBkZWZhdWx0Ci0JWyAxMiBdID0gS0VZX0tQUExVUywgICAgICAvLyBmaW5lIHR1bmUgPj4+PgotCVsgMjQgXSA9IEtFWV9LUE1JTlVTICAgICAgLy8gZmluZSB0dW5lIDw8PDwKLX07Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogUmljYXJkbyBDZXJxdWVpcmEgPHY0bEBjZXJxdWVpcmEub3JnPiAqLwotLyogV2VpcmQgbWF0Y2hpbmcsIHNpbmNlIHRoZSByZW1vdGUgaGFzICJ1bmNvbW1vbiIga2V5cyAqLwotCi1zdGF0aWMgSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfY29uY2VwdHJvbmljW0lSX0tFWVRBQl9TSVpFXSA9IHsKLQotCVsgMzAgXSA9IEtFWV9QT1dFUiwgICAgICAgLy8gcG93ZXIKLQlbIDcgIF0gPSBLRVlfTUVESUEsICAgICAgIC8vIHNvdXJjZQotCVsgMjggXSA9IEtFWV9TRUFSQ0gsICAgICAgLy8gc2NhbgotCi0vKiBGSVhNRTogZHVwbGljYXRlIGtleWNvZGVzPwotICoKLSAqIFRoZXNlIGZvdXIga2V5cyBzZWVtIHRvIHNoYXJlIHRoZSBzYW1lIEdQSU8gYXMgQ0grLCBDSC0sIDw8PCBhbmQgPj4+Ci0gKiBUaGUgR1BJTyB2YWx1ZXMgYXJlCi0gKiA2Mzk3ZmIgZm9yIGJvdGggIlNjYW4gPCIgYW5kICJDSCAtIiwKLSAqIDYzOWZmYiBmb3IgIlNjYW4gPiIgYW5kICJDSCsiLAotICogNjM4NGZiIGZvciAiVHVuZSA8IiBhbmQgIjw8PCIsCi0gKiA2MzhjZmIgZm9yICJUdW5lID4iIGFuZCAiPj4+IiwgcmVnYXJkbGVzcyBvZiB0aGUgbWFzay4KLSAqCi0gKglbIDIzIF0gPSBLRVlfQkFDSywgICAgICAgIC8vIGZtIHNjYW4gPDwKLSAqCVsgMzEgXSA9IEtFWV9GT1JXQVJELCAgICAgLy8gZm0gc2NhbiA+PgotICoKLSAqCVsgNCAgXSA9IEtFWV9MRUZULCAgICAgICAgLy8gZm0gdHVuaW5nIDwKLSAqCVsgMTIgXSA9IEtFWV9SSUdIVCwgICAgICAgLy8gZm0gdHVuaW5nID4KLSAqCi0gKiBGb3Igbm93LCB0aGVzZSBmb3VyIGtleXMgYXJlIGRpc2FibGVkLiBQcmVzc2luZyB0aGVtIHdpbGwgZ2VuZXJhdGUKLSAqIHRoZSBDSCsvQ0gtLzw8PC8+Pj4gZXZlbnRzCi0gKi8KLQotCVsgMyAgXSA9IEtFWV9UVU5FUiwgICAgICAgLy8gVFYvRk0KLQotCVsgMCAgXSA9IEtFWV9SRUNPUkQsCi0JWyA4ICBdID0gS0VZX1NUT1AsCi0JWyAxNyBdID0gS0VZX1BMQVksCi0KLQlbIDI2IF0gPSBLRVlfUExBWVBBVVNFLCAgIC8vIGZyZWV6ZQotCVsgMjUgXSA9IEtFWV9aT09NLCAgICAgICAgLy8gem9vbQotCVsgMTUgXSA9IEtFWV9URVhULCAgICAgICAgLy8gbWluCi0KLQlbIDEgIF0gPSBLRVlfS1AxLAotCVsgMTEgXSA9IEtFWV9LUDIsCi0JWyAyNyBdID0gS0VZX0tQMywKLQlbIDUgIF0gPSBLRVlfS1A0LAotCVsgOSAgXSA9IEtFWV9LUDUsCi0JWyAyMSBdID0gS0VZX0tQNiwKLQlbIDYgIF0gPSBLRVlfS1A3LAotCVsgMTAgXSA9IEtFWV9LUDgsCi0JWyAxOCBdID0gS0VZX0tQOSwKLQlbIDIgIF0gPSBLRVlfS1AwLAotCVsgMTYgXSA9IEtFWV9MQVNULCAgICAgICAgLy8gKzEwMAotCVsgMTkgXSA9IEtFWV9MSVNULCAgICAgICAgLy8gcmVjYWxsCi0KLQlbIDMxIF0gPSBLRVlfQ0hBTk5FTFVQLCAgIC8vIGNobiBkb3duCi0JWyAyMyBdID0gS0VZX0NIQU5ORUxET1dOLCAvLyBjaG4gdXAKLQlbIDIyIF0gPSBLRVlfVk9MVU1FVVAsICAgIC8vIHZvbCBkb3duCi0JWyAyMCBdID0gS0VZX1ZPTFVNRURPV04sICAvLyB2b2wgdXAKLQotCVsgNCAgXSA9IEtFWV9LUE1JTlVTLCAgICAgLy8gPDw8Ci0JWyAxNCBdID0gS0VZX1NFVFVQLCAgICAgICAvLyBmdW5jdGlvbgotCVsgMTIgXSA9IEtFWV9LUFBMVVMsICAgICAgLy8gPj4+Ci0KLQlbIDEzIF0gPSBLRVlfR09UTywgICAgICAgIC8vIG10cwotCVsgMjkgXSA9IEtFWV9SRUZSRVNILCAgICAgLy8gcmVzZXQKLQlbIDI0IF0gPSBLRVlfTVVURSAgICAgICAgIC8vIG11dGUvdW5tdXRlCi19OwotCi1zdGF0aWMgSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfbmVidWxhW0lSX0tFWVRBQl9TSVpFXSA9IHsKLQlbMHgwMF0gPSBLRVlfS1AwLAotCVsweDAxXSA9IEtFWV9LUDEsCi0JWzB4MDJdID0gS0VZX0tQMiwKLQlbMHgwM10gPSBLRVlfS1AzLAotCVsweDA0XSA9IEtFWV9LUDQsCi0JWzB4MDVdID0gS0VZX0tQNSwKLQlbMHgwNl0gPSBLRVlfS1A2LAotCVsweDA3XSA9IEtFWV9LUDcsCi0JWzB4MDhdID0gS0VZX0tQOCwKLQlbMHgwOV0gPSBLRVlfS1A5LAotCVsweDBhXSA9IEtFWV9UViwKLQlbMHgwYl0gPSBLRVlfQVVYLAotCVsweDBjXSA9IEtFWV9EVkQsCi0JWzB4MGRdID0gS0VZX1BPV0VSLAotCVsweDBlXSA9IEtFWV9NSFAsCS8qIGxhYmVsbGVkICdQaWN0dXJlJyAqLwotCVsweDBmXSA9IEtFWV9BVURJTywKLQlbMHgxMF0gPSBLRVlfSU5GTywKLQlbMHgxMV0gPSBLRVlfRjEzLAkvKiAxNjo5ICovCi0JWzB4MTJdID0gS0VZX0YxNCwJLyogMTQ6OSAqLwotCVsweDEzXSA9IEtFWV9FUEcsCi0JWzB4MTRdID0gS0VZX0VYSVQsCi0JWzB4MTVdID0gS0VZX01FTlUsCi0JWzB4MTZdID0gS0VZX1VQLAotCVsweDE3XSA9IEtFWV9ET1dOLAotCVsweDE4XSA9IEtFWV9MRUZULAotCVsweDE5XSA9IEtFWV9SSUdIVCwKLQlbMHgxYV0gPSBLRVlfRU5URVIsCi0JWzB4MWJdID0gS0VZX0NIQU5ORUxVUCwKLQlbMHgxY10gPSBLRVlfQ0hBTk5FTERPV04sCi0JWzB4MWRdID0gS0VZX1ZPTFVNRVVQLAotCVsweDFlXSA9IEtFWV9WT0xVTUVET1dOLAotCVsweDFmXSA9IEtFWV9SRUQsCi0JWzB4MjBdID0gS0VZX0dSRUVOLAotCVsweDIxXSA9IEtFWV9ZRUxMT1csCi0JWzB4MjJdID0gS0VZX0JMVUUsCi0JWzB4MjNdID0gS0VZX1NVQlRJVExFLAotCVsweDI0XSA9IEtFWV9GMTUsCS8qIEFEICovCi0JWzB4MjVdID0gS0VZX1RFWFQsCi0JWzB4MjZdID0gS0VZX01VVEUsCi0JWzB4MjddID0gS0VZX1JFV0lORCwKLQlbMHgyOF0gPSBLRVlfU1RPUCwKLQlbMHgyOV0gPSBLRVlfUExBWSwKLQlbMHgyYV0gPSBLRVlfRkFTVEZPUldBUkQsCi0JWzB4MmJdID0gS0VZX0YxNiwJLyogY2hhcHRlciAqLwotCVsweDJjXSA9IEtFWV9QQVVTRSwKLQlbMHgyZF0gPSBLRVlfUExBWSwKLQlbMHgyZV0gPSBLRVlfUkVDT1JELAotCVsweDJmXSA9IEtFWV9GMTcsCS8qIHBpY3R1cmUgaW4gcGljdHVyZSAqLwotCVsweDMwXSA9IEtFWV9LUFBMVVMsCS8qIHpvb20gaW4gKi8KLQlbMHgzMV0gPSBLRVlfS1BNSU5VUywJLyogem9vbSBvdXQgKi8KLQlbMHgzMl0gPSBLRVlfRjE4LAkvKiBjYXB0dXJlICovCi0JWzB4MzNdID0gS0VZX0YxOSwJLyogd2ViICovCi0JWzB4MzRdID0gS0VZX0VNQUlMLAotCVsweDM1XSA9IEtFWV9QSE9ORSwKLQlbMHgzNl0gPSBLRVlfUEMKLX07Ci0KLXN0cnVjdCBJUiB7Ci0Jc3RydWN0IGJ0dHZfc3ViX2RldmljZSAgKnN1YjsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICAgICAgICAqaW5wdXQ7Ci0Jc3RydWN0IGlyX2lucHV0X3N0YXRlICAgaXI7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgbmFtZVszMl07Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgcGh5c1szMl07Ci0KLQkvKiBVc3VhbCBncGlvIHNpZ25hbGxpbmcgKi8KLQotCXUzMiAgICAgICAgICAgICAgICAgICAgIG1hc2tfa2V5Y29kZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICBtYXNrX2tleWRvd247Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgbWFza19rZXl1cDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICBwb2xsaW5nOwotCXUzMiAgICAgICAgICAgICAgICAgICAgIGxhc3RfZ3BpbzsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgICB3b3JrOwotCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgIHRpbWVyOwotCi0JLyogUkM1IGdwaW8gKi8KLQl1MzIgcmM1X2dwaW87Ci0Jc3RydWN0IHRpbWVyX2xpc3QgdGltZXJfZW5kOwkvKiB0aW1lcl9lbmQgZm9yIGNvZGUgY29tcGxldGlvbiAqLwotCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyX2tleXVwOwkvKiB0aW1lcl9lbmQgZm9yIGtleSByZWxlYXNlICovCi0JdTMyIGxhc3RfcmM1OwkJCS8qIGxhc3QgZ29vZCByYzUgY29kZSAqLwotCXUzMiBsYXN0X2JpdDsJCQkvKiBsYXN0IHJhdyBiaXQgc2VlbiAqLwotCXUzMiBjb2RlOwkJCS8qIHJhdyBjb2RlIHVuZGVyIGNvbnN0cnVjdGlvbiAqLwotCXN0cnVjdCB0aW1ldmFsIGJhc2VfdGltZTsJLyogdGltZSBvZiBsYXN0IHNlZW4gY29kZSAqLwotCWludCBhY3RpdmU7CQkJLyogYnVpbGRpbmcgcmF3IGNvZGUgKi8KLX07Ci0KLXN0YXRpYyBpbnQgZGVidWc7Ci1tb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7ICAgIC8qIGRlYnVnIGxldmVsICgwLDEsMikgKi8KLXN0YXRpYyBpbnQgcmVwZWF0X2RlbGF5ID0gNTAwOwotbW9kdWxlX3BhcmFtKHJlcGVhdF9kZWxheSwgaW50LCAwNjQ0KTsKLXN0YXRpYyBpbnQgcmVwZWF0X3BlcmlvZCA9IDMzOwotbW9kdWxlX3BhcmFtKHJlcGVhdF9wZXJpb2QsIGludCwgMDY0NCk7Ci0KLSNkZWZpbmUgREVWTkFNRSAiaXIta2JkLWdwaW8iCi0jZGVmaW5lIGRwcmludGsoZm10LCBhcmcuLi4pCWlmIChkZWJ1ZykgXAotCXByaW50ayhLRVJOX0RFQlVHIERFVk5BTUUgIjogIiBmbXQgLCAjIyBhcmcpCi0KLXN0YXRpYyB2b2lkIGlyX2lycShzdHJ1Y3QgYnR0dl9zdWJfZGV2aWNlICpzdWIpOwotc3RhdGljIGludCBpcl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotc3RhdGljIGludCBpcl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KTsKLQotc3RhdGljIHN0cnVjdCBidHR2X3N1Yl9kcml2ZXIgZHJpdmVyID0gewotCS5kcnYgPSB7Ci0JCS5uYW1lCT0gREVWTkFNRSwKLQkJLnByb2JlCT0gaXJfcHJvYmUsCi0JCS5yZW1vdmUJPSBpcl9yZW1vdmUsCi0JfSwKLQkuZ3Bpb19pcnEgCT0gaXJfaXJxLAotfTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgdm9pZCBpcl9oYW5kbGVfa2V5KHN0cnVjdCBJUiAqaXIpCi17Ci0JdTMyIGdwaW8sZGF0YTsKLQotCS8qIHJlYWQgZ3BpbyB2YWx1ZSAqLwotCWdwaW8gPSBidHR2X2dwaW9fcmVhZChpci0+c3ViLT5jb3JlKTsKLQlpZiAoaXItPnBvbGxpbmcpIHsKLQkJaWYgKGlyLT5sYXN0X2dwaW8gPT0gZ3BpbykKLQkJCXJldHVybjsKLQkJaXItPmxhc3RfZ3BpbyA9IGdwaW87Ci0JfQotCi0JLyogZXh0cmFjdCBkYXRhICovCi0JZGF0YSA9IGlyX2V4dHJhY3RfYml0cyhncGlvLCBpci0+bWFza19rZXljb2RlKTsKLQlkcHJpbnRrKERFVk5BTUUgIjogaXJxIGdwaW89MHgleCBjb2RlPSVkIHwgJXMlcyVzXG4iLAotCQlncGlvLCBkYXRhLAotCQlpci0+cG9sbGluZyAgICAgICAgICAgICAgID8gInBvbGwiICA6ICJpcnEiLAotCQkoZ3BpbyAmIGlyLT5tYXNrX2tleWRvd24pID8gIiBkb3duIiA6ICIiLAotCQkoZ3BpbyAmIGlyLT5tYXNrX2tleXVwKSAgID8gIiB1cCIgICA6ICIiKTsKLQotCWlmIChpci0+bWFza19rZXlkb3duKSB7Ci0JCS8qIGJpdCBzZXQgb24ga2V5ZG93biAqLwotCQlpZiAoZ3BpbyAmIGlyLT5tYXNrX2tleWRvd24pIHsKLQkJCWlyX2lucHV0X2tleWRvd24oaXItPmlucHV0LCAmaXItPmlyLCBkYXRhLCBkYXRhKTsKLQkJfSBlbHNlIHsKLQkJCWlyX2lucHV0X25va2V5KGlyLT5pbnB1dCwgJmlyLT5pcik7Ci0JCX0KLQotCX0gZWxzZSBpZiAoaXItPm1hc2tfa2V5dXApIHsKLQkJLyogYml0IGNsZWFyZWQgb24ga2V5ZG93biAqLwotCQlpZiAoMCA9PSAoZ3BpbyAmIGlyLT5tYXNrX2tleXVwKSkgewotCQkJaXJfaW5wdXRfa2V5ZG93bihpci0+aW5wdXQsICZpci0+aXIsIGRhdGEsIGRhdGEpOwotCQl9IGVsc2UgewotCQkJaXJfaW5wdXRfbm9rZXkoaXItPmlucHV0LCAmaXItPmlyKTsKLQkJfQotCi0JfSBlbHNlIHsKLQkJLyogY2FuJ3QgZGlzdHVyZ2lzc2gga2V5ZG93bi91cCA6LS8gKi8KLQkJaXJfaW5wdXRfa2V5ZG93bihpci0+aW5wdXQsICZpci0+aXIsIGRhdGEsIGRhdGEpOwotCQlpcl9pbnB1dF9ub2tleShpci0+aW5wdXQsICZpci0+aXIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgaXJfaXJxKHN0cnVjdCBidHR2X3N1Yl9kZXZpY2UgKnN1YikKLXsKLQlzdHJ1Y3QgSVIgKmlyID0gZGV2X2dldF9kcnZkYXRhKCZzdWItPmRldik7Ci0KLQlpZiAoIWlyLT5wb2xsaW5nKQotCQlpcl9oYW5kbGVfa2V5KGlyKTsKLX0KLQotc3RhdGljIHZvaWQgaXJfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBJUiAqaXIgPSAoc3RydWN0IElSKilkYXRhOwotCi0Jc2NoZWR1bGVfd29yaygmaXItPndvcmspOwotfQotCi1zdGF0aWMgdm9pZCBpcl93b3JrKHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IElSICppciA9IGRhdGE7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCi0JaXJfaGFuZGxlX2tleShpcik7Ci0JdGltZW91dCA9IGppZmZpZXMgKyAoaXItPnBvbGxpbmcgKiBIWiAvIDEwMDApOwotCW1vZF90aW1lcigmaXItPnRpbWVyLCB0aW1lb3V0KTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCByYzVfcmVtb3RlX2dhcCA9IDg4NTsKLW1vZHVsZV9wYXJhbShyYzVfcmVtb3RlX2dhcCwgaW50LCAwNjQ0KTsKLXN0YXRpYyBpbnQgcmM1X2tleV90aW1lb3V0ID0gMjAwOwotbW9kdWxlX3BhcmFtKHJjNV9rZXlfdGltZW91dCwgaW50LCAwNjQ0KTsKLQotI2RlZmluZSBSQzVfU1RBUlQoeCkJKCgoeCk+PjEyKSYzKQotI2RlZmluZSBSQzVfVE9HR0xFKHgpCSgoKHgpPj4xMSkmMSkKLSNkZWZpbmUgUkM1X0FERFIoeCkJKCgoeCk+PjYpJjMxKQotI2RlZmluZSBSQzVfSU5TVFIoeCkJKCh4KSY2MykKLQotLyogZGVjb2RlIHJhdyBiaXQgcGF0dGVybiB0byBSQzUgY29kZSAqLwotc3RhdGljIHUzMiByYzVfZGVjb2RlKHVuc2lnbmVkIGludCBjb2RlKQotewotCXVuc2lnbmVkIGludCBvcmdfY29kZSA9IGNvZGU7Ci0JdW5zaWduZWQgaW50IHBhaXI7Ci0JdW5zaWduZWQgaW50IHJjNSA9IDA7Ci0JaW50IGk7Ci0KLQljb2RlID0gKGNvZGUgPDwgMSkgfCAxOwotCWZvciAoaSA9IDA7IGkgPCAxNDsgKytpKSB7Ci0JCXBhaXIgPSBjb2RlICYgMHgzOwotCQljb2RlID4+PSAyOwotCi0JCXJjNSA8PD0gMTsKLQkJc3dpdGNoIChwYWlyKSB7Ci0JCWNhc2UgMDoKLQkJY2FzZSAyOgotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXJjNSB8PSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCWRwcmludGsoImJhZCBjb2RlOiAleFxuIiwgb3JnX2NvZGUpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JZHByaW50aygiY29kZT0leCwgcmM1PSV4LCBzdGFydD0leCwgdG9nZ2xlPSV4LCBhZGRyZXNzPSV4LCAiCi0JCSJpbnN0cj0leFxuIiwgcmM1LCBvcmdfY29kZSwgUkM1X1NUQVJUKHJjNSksCi0JCVJDNV9UT0dHTEUocmM1KSwgUkM1X0FERFIocmM1KSwgUkM1X0lOU1RSKHJjNSkpOwotCXJldHVybiByYzU7Ci19Ci0KLXN0YXRpYyBpbnQgaXJfcmM1X2lycShzdHJ1Y3QgYnR0dl9zdWJfZGV2aWNlICpzdWIpCi17Ci0Jc3RydWN0IElSICppciA9IGRldl9nZXRfZHJ2ZGF0YSgmc3ViLT5kZXYpOwotCXN0cnVjdCB0aW1ldmFsIHR2OwotCXUzMiBncGlvOwotCXUzMiBnYXA7Ci0JdW5zaWduZWQgbG9uZyBjdXJyZW50X2ppZmZpZXMsIHRpbWVvdXQ7Ci0KLQkvKiByZWFkIGdwaW8gcG9ydCAqLwotCWdwaW8gPSBidHR2X2dwaW9fcmVhZChpci0+c3ViLT5jb3JlKTsKLQotCS8qIHJlbW90ZSBJUlE/ICovCi0JaWYgKCEoZ3BpbyAmIDB4MjApKQotCQlyZXR1cm4gMDsKLQotCS8qIGdldCB0aW1lIG9mIGJpdCAqLwotCWN1cnJlbnRfamlmZmllcyA9IGppZmZpZXM7Ci0JZG9fZ2V0dGltZW9mZGF5KCZ0dik7Ci0KLQkvKiBhdm9pZCBvdmVyZmxvdyB3aXRoIGdhcCA+MXMgKi8KLQlpZiAodHYudHZfc2VjIC0gaXItPmJhc2VfdGltZS50dl9zZWMgPiAxKSB7Ci0JCWdhcCA9IDIwMDAwMDsKLQl9IGVsc2UgewotCQlnYXAgPSAxMDAwMDAwICogKHR2LnR2X3NlYyAtIGlyLT5iYXNlX3RpbWUudHZfc2VjKSArCi0JCSAgICB0di50dl91c2VjIC0gaXItPmJhc2VfdGltZS50dl91c2VjOwotCX0KLQotCS8qIGFjdGl2ZSBjb2RlID0+IGFkZCBiaXQgKi8KLQlpZiAoaXItPmFjdGl2ZSkgewotCQkvKiBvbmx5IGlmIGluIHRoZSBjb2RlIChvdGhlcndpc2Ugc3B1cmlvdXMgSVJRIG9yIHRpbWVyCi0JCSAgIGxhdGUpICovCi0JCWlmIChpci0+bGFzdF9iaXQgPCAyOCkgewotCQkJaXItPmxhc3RfYml0ID0gKGdhcCAtIHJjNV9yZW1vdGVfZ2FwIC8gMikgLwotCQkJICAgIHJjNV9yZW1vdGVfZ2FwOwotCQkJaXItPmNvZGUgfD0gMSA8PCBpci0+bGFzdF9iaXQ7Ci0JCX0KLQkJLyogc3RhcnRpbmcgbmV3IGNvZGUgKi8KLQl9IGVsc2UgewotCQlpci0+YWN0aXZlID0gMTsKLQkJaXItPmNvZGUgPSAwOwotCQlpci0+YmFzZV90aW1lID0gdHY7Ci0JCWlyLT5sYXN0X2JpdCA9IDA7Ci0KLQkJdGltZW91dCA9IGN1cnJlbnRfamlmZmllcyArICg1MDAgKyAzMCAqIEhaKSAvIDEwMDA7Ci0JCW1vZF90aW1lcigmaXItPnRpbWVyX2VuZCwgdGltZW91dCk7Ci0JfQotCi0JLyogdG9nZ2xlIEdQSU8gcGluIDQgdG8gcmVzZXQgdGhlIGlycSAqLwotCWJ0dHZfZ3Bpb193cml0ZShpci0+c3ViLT5jb3JlLCBncGlvICYgfigxIDw8IDQpKTsKLQlidHR2X2dwaW9fd3JpdGUoaXItPnN1Yi0+Y29yZSwgZ3BpbyB8ICgxIDw8IDQpKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgaXJfcmM1X3RpbWVyX2VuZCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IElSICppciA9IChzdHJ1Y3QgSVIgKilkYXRhOwotCXN0cnVjdCB0aW1ldmFsIHR2OwotCXVuc2lnbmVkIGxvbmcgY3VycmVudF9qaWZmaWVzLCB0aW1lb3V0OwotCXUzMiBnYXA7Ci0KLQkvKiBnZXQgdGltZSAqLwotCWN1cnJlbnRfamlmZmllcyA9IGppZmZpZXM7Ci0JZG9fZ2V0dGltZW9mZGF5KCZ0dik7Ci0KLQkvKiBhdm9pZCBvdmVyZmxvdyB3aXRoIGdhcCA+MXMgKi8KLQlpZiAodHYudHZfc2VjIC0gaXItPmJhc2VfdGltZS50dl9zZWMgPiAxKSB7Ci0JCWdhcCA9IDIwMDAwMDsKLQl9IGVsc2UgewotCQlnYXAgPSAxMDAwMDAwICogKHR2LnR2X3NlYyAtIGlyLT5iYXNlX3RpbWUudHZfc2VjKSArCi0JCSAgICB0di50dl91c2VjIC0gaXItPmJhc2VfdGltZS50dl91c2VjOwotCX0KLQotCS8qIEFsbG93IHNvbWUgdGltbWVyIGppdHRlciAoUkM1IGlzIH4yNG1zIGFueXdheSBzbyB0aGlzIGlzIG9rKSAqLwotCWlmIChnYXAgPCAyODAwMCkgewotCQlkcHJpbnRrKCJzcHVyaW91cyB0aW1lcl9lbmRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaXItPmFjdGl2ZSA9IDA7Ci0JaWYgKGlyLT5sYXN0X2JpdCA8IDIwKSB7Ci0JCS8qIGlnbm9yZSBzcHVyaW91cyBjb2RlcyAoY2F1c2VkIGJ5IGxpZ2h0L290aGVyIHJlbW90ZXMpICovCi0JCWRwcmludGsoInNob3J0IGNvZGU6ICV4XG4iLCBpci0+Y29kZSk7Ci0JfSBlbHNlIHsKLQkJdTMyIHJjNSA9IHJjNV9kZWNvZGUoaXItPmNvZGUpOwotCi0JCS8qIHR3byBzdGFydCBiaXRzPyAqLwotCQlpZiAoUkM1X1NUQVJUKHJjNSkgIT0gMykgewotCQkJZHByaW50aygicmM1IHN0YXJ0IGJpdHMgaW52YWxpZDogJXVcbiIsIFJDNV9TVEFSVChyYzUpKTsKLQotCQkJLyogcmlnaHQgYWRkcmVzcz8gKi8KLQkJfSBlbHNlIGlmIChSQzVfQUREUihyYzUpID09IDB4MCkgewotCQkJdTMyIHRvZ2dsZSA9IFJDNV9UT0dHTEUocmM1KTsKLQkJCXUzMiBpbnN0ciA9IFJDNV9JTlNUUihyYzUpOwotCi0JCQkvKiBHb29kIGNvZGUsIGRlY2lkZSBpZiByZXBlYXQvcmVwcmVzcyAqLwotCQkJaWYgKHRvZ2dsZSAhPSBSQzVfVE9HR0xFKGlyLT5sYXN0X3JjNSkgfHwKLQkJCSAgICBpbnN0ciAhPSBSQzVfSU5TVFIoaXItPmxhc3RfcmM1KSkgewotCQkJCWRwcmludGsoImluc3RydWN0aW9uICV4LCB0b2dnbGUgJXhcbiIsIGluc3RyLAotCQkJCQl0b2dnbGUpOwotCQkJCWlyX2lucHV0X25va2V5KGlyLT5pbnB1dCwgJmlyLT5pcik7Ci0JCQkJaXJfaW5wdXRfa2V5ZG93bihpci0+aW5wdXQsICZpci0+aXIsIGluc3RyLAotCQkJCQkJIGluc3RyKTsKLQkJCX0KLQotCQkJLyogU2V0L3Jlc2V0IGtleS11cCB0aW1lciAqLwotCQkJdGltZW91dCA9IGN1cnJlbnRfamlmZmllcyArICg1MDAgKyByYzVfa2V5X3RpbWVvdXQKLQkJCQkJCSAgICAgKiBIWikgLyAxMDAwOwotCQkJbW9kX3RpbWVyKCZpci0+dGltZXJfa2V5dXAsIHRpbWVvdXQpOwotCi0JCQkvKiBTYXZlIGNvZGUgZm9yIHJlcGVhdCB0ZXN0ICovCi0JCQlpci0+bGFzdF9yYzUgPSByYzU7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGlyX3JjNV90aW1lcl9rZXl1cCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IElSICppciA9IChzdHJ1Y3QgSVIgKilkYXRhOwotCi0JZHByaW50aygia2V5IHJlbGVhc2VkXG4iKTsKLQlpcl9pbnB1dF9ub2tleShpci0+aW5wdXQsICZpci0+aXIpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBpbnQgaXJfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBidHR2X3N1Yl9kZXZpY2UgKnN1YiA9IHRvX2J0dHZfc3ViX2RldihkZXYpOwotCXN0cnVjdCBJUiAqaXI7Ci0Jc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwotCUlSX0tFWVRBQl9UWVBFICppcl9jb2RlcyA9IE5VTEw7Ci0JaW50IGlyX3R5cGUgPSBJUl9UWVBFX09USEVSOwotCi0JaXIgPSBremFsbG9jKHNpemVvZigqaXIpLCBHRlBfS0VSTkVMKTsKLQlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKLQlpZiAoIWlyIHx8ICFpbnB1dF9kZXYpIHsKLQkJa2ZyZWUoaXIpOwotCQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKiBkZXRlY3QgJiBjb25maWd1cmUgKi8KLQlzd2l0Y2ggKHN1Yi0+Y29yZS0+dHlwZSkgewotCWNhc2UgQlRUVl9CT0FSRF9BVkVSTUVESUE6Ci0JY2FzZSBCVFRWX0JPQVJEX0FWUEhPTkU5ODoKLQljYXNlIEJUVFZfQk9BUkRfQVZFUk1FRElBOTg6Ci0JCWlyX2NvZGVzICAgICAgICAgPSBpcl9jb2Rlc19hdmVybWVkaWE7Ci0JCWlyLT5tYXNrX2tleWNvZGUgPSAweGY4ODAwMDsKLQkJaXItPm1hc2tfa2V5ZG93biA9IDB4MDEwMDAwOwotCQlpci0+cG9sbGluZyAgICAgID0gNTA7IC8vIG1zCi0JCWJyZWFrOwotCi0JY2FzZSBCVFRWX0JPQVJEX0FWRFZCVF83NjE6Ci0JY2FzZSBCVFRWX0JPQVJEX0FWRFZCVF83NzE6Ci0JCWlyX2NvZGVzICAgICAgICAgPSBpcl9jb2Rlc19hdmVybWVkaWFfZHZidDsKLQkJaXItPm1hc2tfa2V5Y29kZSA9IDB4MGYwMGMwOwotCQlpci0+bWFza19rZXlkb3duID0gMHgwMDAwMjA7Ci0JCWlyLT5wb2xsaW5nICAgICAgPSA1MDsgLy8gbXMKLQkJYnJlYWs7Ci0KLQljYXNlIEJUVFZfQk9BUkRfUFhFTFZXUExUVlBBSzoKLQkJaXJfY29kZXMgICAgICAgICA9IGlyX2NvZGVzX3BpeGVsdmlldzsKLQkJaXItPm1hc2tfa2V5Y29kZSA9IDB4MDAzZTAwOwotCQlpci0+bWFza19rZXl1cCAgID0gMHgwMTAwMDA7Ci0JCWlyLT5wb2xsaW5nICAgICAgPSA1MDsgLy8gbXMKLQkJYnJlYWs7Ci0JY2FzZSBCVFRWX0JPQVJEX1BWX0JUODc4UF85QjoKLQljYXNlIEJUVFZfQk9BUkRfUFZfQlQ4NzhQX1BMVVM6Ci0JCWlyX2NvZGVzICAgICAgICAgPSBpcl9jb2Rlc19waXhlbHZpZXc7Ci0JCWlyLT5tYXNrX2tleWNvZGUgPSAweDAwMWYwMDsKLQkJaXItPm1hc2tfa2V5dXAgICA9IDB4MDA4MDAwOwotCQlpci0+cG9sbGluZyAgICAgID0gNTA7IC8vIG1zCi0JCWJyZWFrOwotCi0JY2FzZSBCVFRWX0JPQVJEX1dJTkZBU1QyMDAwOgotCQlpcl9jb2RlcyAgICAgICAgID0gaXJfY29kZXNfd2luZmFzdDsKLQkJaXItPm1hc2tfa2V5Y29kZSA9IDB4MWY4OwotCQlicmVhazsKLQljYXNlIEJUVFZfQk9BUkRfTUFHSUNUVklFVzA2MToKLQljYXNlIEJUVFZfQk9BUkRfTUFHSUNUVklFVzA2MzoKLQkJaXJfY29kZXMgICAgICAgICA9IGlyX2NvZGVzX3dpbmZhc3Q7Ci0JCWlyLT5tYXNrX2tleWNvZGUgPSAweDAwMDhlMDAwOwotCQlpci0+bWFza19rZXlkb3duID0gMHgwMDIwMDAwMDsKLQkJYnJlYWs7Ci0JY2FzZSBCVFRWX0JPQVJEX0FQQUNfVklFV0NPTVA6Ci0JCWlyX2NvZGVzICAgICAgICAgPSBpcl9jb2Rlc19hcGFjX3ZpZXdjb21wOwotCQlpci0+bWFza19rZXljb2RlID0gMHgwMDFmMDA7Ci0JCWlyLT5tYXNrX2tleXVwICAgPSAweDAwODAwMDsKLQkJaXItPnBvbGxpbmcgICAgICA9IDUwOyAvLyBtcwotCQlicmVhazsKLQljYXNlIEJUVFZfQk9BUkRfQ09OQ0VQVFJPTklDX0NUVkZNSTI6Ci0JCWlyX2NvZGVzICAgICAgICAgPSBpcl9jb2Rlc19jb25jZXB0cm9uaWM7Ci0JCWlyLT5tYXNrX2tleWNvZGUgPSAweDAwMUYwMDsKLQkJaXItPm1hc2tfa2V5dXAgICA9IDB4MDA2MDAwOwotCQlpci0+cG9sbGluZyAgICAgID0gNTA7IC8vIG1zCi0JCWJyZWFrOwotCWNhc2UgQlRUVl9CT0FSRF9ORUJVTEFfRElHSVRWOgotCQlpcl9jb2RlcyA9IGlyX2NvZGVzX25lYnVsYTsKLQkJZHJpdmVyLmFueV9pcnEgPSBpcl9yYzVfaXJxOwotCQlkcml2ZXIuZ3Bpb19pcnEgPSBOVUxMOwotCQlpci0+cmM1X2dwaW8gPSAxOwotCQlicmVhazsKLQl9Ci0JaWYgKE5VTEwgPT0gaXJfY29kZXMpIHsKLQkJa2ZyZWUoaXIpOwotCQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAoaXItPnJjNV9ncGlvKSB7Ci0JCXUzMiBncGlvOwotCSAgICAJLyogZW5hYmxlIHJlbW90ZSBpcnEgKi8KLQkJYnR0dl9ncGlvX2lub3V0KHN1Yi0+Y29yZSwgKDEgPDwgNCksIDEgPDwgNCk7Ci0JCWdwaW8gPSBidHR2X2dwaW9fcmVhZChzdWItPmNvcmUpOwotCQlidHR2X2dwaW9fd3JpdGUoc3ViLT5jb3JlLCBncGlvICYgfigxIDw8IDQpKTsKLQkJYnR0dl9ncGlvX3dyaXRlKHN1Yi0+Y29yZSwgZ3BpbyB8ICgxIDw8IDQpKTsKLQl9IGVsc2UgewotCQkvKiBpbml0IGhhcmR3YXJlLXNwZWNpZmljIHN0dWZmICovCi0JCWJ0dHZfZ3Bpb19pbm91dChzdWItPmNvcmUsIGlyLT5tYXNrX2tleWNvZGUgfCBpci0+bWFza19rZXlkb3duLCAwKTsKLQl9Ci0KLQkvKiBpbml0IGlucHV0IGRldmljZSAqLwotCXNucHJpbnRmKGlyLT5uYW1lLCBzaXplb2YoaXItPm5hbWUpLCAiYnR0diBJUiAoY2FyZD0lZCkiLAotCQkgc3ViLT5jb3JlLT50eXBlKTsKLQlzbnByaW50Zihpci0+cGh5cywgc2l6ZW9mKGlyLT5waHlzKSwgInBjaS0lcy9pcjAiLAotCQkgcGNpX25hbWUoc3ViLT5jb3JlLT5wY2kpKTsKLQotCWlyX2lucHV0X2luaXQoaW5wdXRfZGV2LCAmaXItPmlyLCBpcl90eXBlLCBpcl9jb2Rlcyk7Ci0JaW5wdXRfZGV2LT5uYW1lID0gaXItPm5hbWU7Ci0JaW5wdXRfZGV2LT5waHlzID0gaXItPnBoeXM7Ci0JaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX1BDSTsKLQlpbnB1dF9kZXYtPmlkLnZlcnNpb24gPSAxOwotCWlmIChzdWItPmNvcmUtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvcikgewotCQlpbnB1dF9kZXYtPmlkLnZlbmRvciAgPSBzdWItPmNvcmUtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvcjsKLQkJaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gc3ViLT5jb3JlLT5wY2ktPnN1YnN5c3RlbV9kZXZpY2U7Ci0JfSBlbHNlIHsKLQkJaW5wdXRfZGV2LT5pZC52ZW5kb3IgID0gc3ViLT5jb3JlLT5wY2ktPnZlbmRvcjsKLQkJaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gc3ViLT5jb3JlLT5wY2ktPmRldmljZTsKLQl9Ci0JaW5wdXRfZGV2LT5jZGV2LmRldiA9ICZzdWItPmNvcmUtPnBjaS0+ZGV2OwotCi0JaXItPmlucHV0ID0gaW5wdXRfZGV2OwotCWlyLT5zdWIgPSBzdWI7Ci0KLQlpZiAoaXItPnBvbGxpbmcpIHsKLQkJSU5JVF9XT1JLKCZpci0+d29yaywgaXJfd29yaywgaXIpOwotCQlpbml0X3RpbWVyKCZpci0+dGltZXIpOwotCQlpci0+dGltZXIuZnVuY3Rpb24gPSBpcl90aW1lcjsKLQkJaXItPnRpbWVyLmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpaXI7Ci0JCXNjaGVkdWxlX3dvcmsoJmlyLT53b3JrKTsKLQl9IGVsc2UgaWYgKGlyLT5yYzVfZ3BpbykgewotCQkvKiBzZXQgdGltZXJfZW5kIGZvciBjb2RlIGNvbXBsZXRpb24gKi8KLQkJaW5pdF90aW1lcigmaXItPnRpbWVyX2VuZCk7Ci0JCWlyLT50aW1lcl9lbmQuZnVuY3Rpb24gPSBpcl9yYzVfdGltZXJfZW5kOwotCQlpci0+dGltZXJfZW5kLmRhdGEgPSAodW5zaWduZWQgbG9uZylpcjsKLQotCQlpbml0X3RpbWVyKCZpci0+dGltZXJfa2V5dXApOwotCQlpci0+dGltZXJfa2V5dXAuZnVuY3Rpb24gPSBpcl9yYzVfdGltZXJfa2V5dXA7Ci0JCWlyLT50aW1lcl9rZXl1cC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaXI7Ci0JfQotCi0JLyogYWxsIGRvbmUgKi8KLQlkZXZfc2V0X2RydmRhdGEoZGV2LCBpcik7Ci0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlyLT5pbnB1dCk7Ci0KLQkvKiB0aGUgcmVtb3RlIGlzbid0IGFzIGJvdW5jeSBhcyBhIGtleWJvYXJkICovCi0JaXItPmlucHV0LT5yZXBbUkVQX0RFTEFZXSA9IHJlcGVhdF9kZWxheTsKLQlpci0+aW5wdXQtPnJlcFtSRVBfUEVSSU9EXSA9IHJlcGVhdF9wZXJpb2Q7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpcl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBJUiAqaXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCWlmIChpci0+cG9sbGluZykgewotCQlkZWxfdGltZXIoJmlyLT50aW1lcik7Ci0JCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0JfQotCi0JaWYgKGlyLT5yYzVfZ3BpbykgewotCQl1MzIgZ3BpbzsKLQotCQlkZWxfdGltZXIoJmlyLT50aW1lcl9lbmQpOwotCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwotCi0JCWdwaW8gPSBidHR2X2dwaW9fcmVhZChpci0+c3ViLT5jb3JlKTsKLQkJYnR0dl9ncGlvX3dyaXRlKGlyLT5zdWItPmNvcmUsIGdwaW8gJiB+KDEgPDwgNCkpOwotCX0KLQotCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGlyLT5pbnB1dCk7Ci0Ja2ZyZWUoaXIpOwotCXJldHVybiAwOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLU1PRFVMRV9BVVRIT1IoIkdlcmQgS25vcnIsIFBhdmVsIE1hY2hlayIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJpbnB1dCBkcml2ZXIgZm9yIGJ0OHg4IGdwaW8gSVIgcmVtb3RlIGNvbnRyb2xzIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyBpbnQgaXJfaW5pdCh2b2lkKQotewotCXJldHVybiBidHR2X3N1Yl9yZWdpc3RlcigmZHJpdmVyLCAicmVtb3RlIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGlyX2Zpbmkodm9pZCkKLXsKLQlidHR2X3N1Yl91bnJlZ2lzdGVyKCZkcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChpcl9pbml0KTsKLW1vZHVsZV9leGl0KGlyX2ZpbmkpOwotCi0KLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWJhc2ljLW9mZnNldDogOAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXIta2JkLWkyYy5jCmluZGV4IDNjYzFkNmEuLjU4YjBlNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXIta2JkLWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXIta2JkLWkyYy5jCkBAIC0yNzksNyArMjc5LDcgQEAKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZSAgID0gImlyIHJlbW90ZSBrYmQgZHJpdmVyIiwKKwkJLm5hbWUgICA9ICJpci1rYmQtaTJjIiwKIAl9LAogCS5pZCAgICAgICAgICAgICA9IEkyQ19EUklWRVJJRF9JTkZSQVJFRCwKIAkuYXR0YWNoX2FkYXB0ZXIgPSBpcl9wcm9iZSwKQEAgLTMwNCwxOCArMzA0LDIwIEBACiAJaXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgSVJfaTJjKSxHRlBfS0VSTkVMKTsKIAlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKIAlpZiAoIWlyIHx8ICFpbnB1dF9kZXYpIHsKLQkJa2ZyZWUoaXIpOwogCQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCQlrZnJlZShpcik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KKwltZW1zZXQoaXIsMCxzaXplb2YoKmlyKSk7CiAKIAlpci0+YyA9IGNsaWVudF90ZW1wbGF0ZTsKIAlpci0+aW5wdXQgPSBpbnB1dF9kZXY7CiAKLQlpMmNfc2V0X2NsaWVudGRhdGEoJmlyLT5jLCBpcik7CiAJaXItPmMuYWRhcHRlciA9IGFkYXA7CiAJaXItPmMuYWRkciAgICA9IGFkZHI7CiAKKwlpMmNfc2V0X2NsaWVudGRhdGEoJmlyLT5jLCBpcik7CisKIAlzd2l0Y2goYWRkcikgewogCWNhc2UgMHg2NDoKIAkJbmFtZSAgICAgICAgPSAiUGl4ZWx2aWV3IjsKQEAgLTM3OCwxMyArMzgwLDE1IEBACiAJCSBpci0+Yy5kZXYuYnVzX2lkKTsKIAogCS8qIGluaXQgKyByZWdpc3RlciBpbnB1dCBkZXZpY2UgKi8KLQlpcl9pbnB1dF9pbml0KGlucHV0X2RldiwgJmlyLT5pciwgaXJfdHlwZSwgaXJfY29kZXMpOwotCWlucHV0X2Rldi0+aWQuYnVzdHlwZQk9IEJVU19JMkM7Ci0JaW5wdXRfZGV2LT5uYW1lCQk9IGlyLT5jLm5hbWU7Ci0JaW5wdXRfZGV2LT5waHlzCQk9IGlyLT5waHlzOworCWlyX2lucHV0X2luaXQoaW5wdXRfZGV2LCZpci0+aXIsaXJfdHlwZSxpci0+aXJfY29kZXMpOworCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19JMkM7CisJaW5wdXRfZGV2LT5uYW1lICAgICAgID0gaXItPmMubmFtZTsKKwlpbnB1dF9kZXYtPnBoeXMgICAgICAgPSBpci0+cGh5czsKIAogCS8qIHJlZ2lzdGVyIGV2ZW50IGRldmljZSAqLwogCWlucHV0X3JlZ2lzdGVyX2RldmljZShpci0+aW5wdXQpOworCXByaW50ayhERVZOQU1FICI6ICVzIGRldGVjdGVkIGF0ICVzIFslc11cbiIsCisJICAgICAgIGlyLT5pbnB1dC0+bmFtZSxpci0+aW5wdXQtPnBoeXMsYWRhcC0+bmFtZSk7CiAKIAkvKiBzdGFydCBwb2xsaW5nIHZpYSBldmVudGQgKi8KIAlJTklUX1dPUksoJmlyLT53b3JrLCBpcl93b3JrLCBpcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21leWUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWV5ZS5jCmluZGV4IDNmMmE4ODIuLjI4Njk0NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWV5ZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWV5ZS5jCkBAIC0xNzU0LDYgKzE3NTQsNyBAQAogCS5yZWxlYXNlCT0gbWV5ZV9yZWxlYXNlLAogCS5tbWFwCQk9IG1leWVfbW1hcCwKIAkuaW9jdGwJCT0gbWV5ZV9pb2N0bCwKKwkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLAogCS5wb2xsCQk9IG1leWVfcG9sbCwKIAkubGxzZWVrCQk9IG5vX2xsc2VlaywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAtZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAtZHJpdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllZDM2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1kcml2ZXIuYwpAQCAtMCwwICsxLDEyNzQgQEAKKy8qCisgKiBQcm9ncmFtbWluZyB0aGUgbXNweDR4eCBzb3VuZCBwcm9jZXNzb3IgZmFtaWx5CisgKgorICogKGMpIDE5OTctMjAwMSBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+CisgKgorICogd2hhdCB3b3JrcyBhbmQgd2hhdCBkb2Vzbid0OgorICoKKyAqICBBTS1Nb25vCisgKiAgICAgIFN1cHBvcnQgZm9yIEhhdXBwYXVnZSBjYXJkcyBhZGRlZCAoZGVjb2RpbmcgaGFuZGxlZCBieSB0dW5lcikgYWRkZWQgYnkKKyAqICAgICAgRnJlZGVyaWMgQ3JvemF0IDxmY3JvemF0QG1haWwuZG90Y29tLmZyPgorICoKKyAqICBGTS1Nb25vCisgKiAgICAgIHNob3VsZCB3b3JrLiBUaGUgc3RlcmVvIG1vZGVzIGFyZSBiYWNrd2FyZCBjb21wYXRpYmxlIHRvIEZNLW1vbm8sCisgKiAgICAgIHRoZXJlZm9yZSBGTS1Nb25vIHNob3VsZCBiZSBhbGx3YXlzIGF2YWlsYWJsZS4KKyAqCisgKiAgRk0tU3RlcmVvIChCL0csIHVzZWQgaW4gZ2VybWFueSkKKyAqICAgICAgc2hvdWxkIHdvcmssIHdpdGggYXV0b2RldGVjdAorICoKKyAqICBGTS1TdGVyZW8gKHNhdGVsbGl0ZSkKKyAqICAgICAgc2hvdWxkIHdvcmssIG5vIGF1dG9kZXRlY3QgKGkuZS4gZGVmYXVsdCBpcyBtb25vLCBidXQgeW91IGNhbgorICogICAgICBzd2l0Y2ggdG8gc3RlcmVvIC0tIHVudGVzdGVkKQorICoKKyAqICBOSUNBTSAoQi9HLCBMICwgdXNlZCBpbiBVSywgU2NhbmRpbmF2aWEsIFNwYWluIGFuZCBGcmFuY2UpCisgKiAgICAgIHNob3VsZCB3b3JrLCB3aXRoIGF1dG9kZXRlY3QuIFN1cHBvcnQgZm9yIE5JQ0FNIHdhcyBhZGRlZCBieQorICogICAgICBQZWtrYSBQaWV0aWthaW5lbiA8cHBAbmV0cHBsLmZpPgorICoKKyAqIFRPRE86CisgKiAgIC0gYmV0dGVyIFNBVCBzdXBwb3J0CisgKgorICogOTgwNjIzICBUaG9tYXMgU2FpbGVyIChzYWlsZXJAaWZlLmVlLmV0aHouY2gpCisgKiAgICAgICAgIHVzaW5nIHNvdW5kY29yZSBpbnN0ZWFkIG9mIE9TUworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvY2hpcC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSAibXNwMzQwMC5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK01PRFVMRV9ERVNDUklQVElPTigiZGV2aWNlIGRyaXZlciBmb3IgbXNwMzR4eCBUViBzb3VuZCBwcm9jZXNzb3IiKTsKK01PRFVMRV9BVVRIT1IoIkdlcmQgS25vcnIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogbW9kdWxlIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyBpbnQgb3Btb2RlICAgPSBPUE1PREVfQVVUTzsKK2ludCBtc3BfZGVidWc7CQkgLyogbXNwX2RlYnVnIG91dHB1dCAqLworaW50IG1zcF9vbmNlOwkJIC8qIG5vIGNvbnRpbm91cyBzdGVyZW8gbW9uaXRvcmluZyAqLworaW50IG1zcF9hbXNvdW5kOwkgLyogaGFyZC13aXJlIEFNIHNvdW5kIGF0IDYuNSBIeiAoZnJhbmNlKSwKKwkJCSAgICB0aGUgYXV0b3NjYW4gc2VlbXMgd29yayB3ZWxsIG9ubHkgd2l0aCBGTS4uLiAqLworaW50IG1zcF9zdGFuZGFyZCA9IDE7ICAgIC8qIE92ZXJyaWRlIGF1dG8gZGV0ZWN0IG9mIGF1ZGlvIG1zcF9zdGFuZGFyZCwgaWYgbmVlZGVkLiAqLworaW50IG1zcF9kb2xieTsKKworaW50IG1zcF9zdGVyZW9fdGhyZXNoID0gMHgxOTA7IC8qIGEyIHRocmVzaG9sZCBmb3Igc3RlcmVvL2JpbGluZ3VhbAorCQkJCQkobXNwMzR4eGcgb25seSkgMHgwMGEwLTB4MDNjMCAqLworCisvKiByZWFkLW9ubHkgKi8KK21vZHVsZV9wYXJhbShvcG1vZGUsICAgICAgICAgICBpbnQsIDA0NDQpOworCisvKiByZWFkLXdyaXRlICovCittb2R1bGVfcGFyYW1fbmFtZWQob25jZSxtc3Bfb25jZSwgICAgICAgICAgICAgICAgICAgICAgYm9vbCwgMDY0NCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsbXNwX2RlYnVnLCAgICAgICAgICAgICAgICAgICAgaW50LCAgMDY0NCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoc3RlcmVvX3RocmVzaG9sZCxtc3Bfc3RlcmVvX3RocmVzaCwgaW50LCAgMDY0NCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoc3RhbmRhcmQsbXNwX3N0YW5kYXJkLCAgICAgICAgICAgICAgaW50LCAgMDY0NCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoYW1zb3VuZCxtc3BfYW1zb3VuZCwgICAgICAgICAgICAgICAgYm9vbCwgMDY0NCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoZG9sYnksbXNwX2RvbGJ5LCAgICAgICAgICAgICAgICAgICAgYm9vbCwgMDY0NCk7CisKK01PRFVMRV9QQVJNX0RFU0Mob3Btb2RlLCAiRm9yY2VzIGEgTVNQMzQwMCBvcG1vZGUuIDA9TWFudWFsLCAxPUF1dG9kZXRlY3QsIDI9QXV0b2RldGVjdCBhbmQgYXV0b3NlbGVjdCIpOworTU9EVUxFX1BBUk1fREVTQyhvbmNlLCAiTm8gY29udGludW91cyBzdGVyZW8gbW9uaXRvcmluZyIpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBbMC0zXSIpOworTU9EVUxFX1BBUk1fREVTQyhzdGVyZW9fdGhyZXNob2xkLCAiU2V0cyBzaWduYWwgdGhyZXNob2xkIHRvIGFjdGl2YXRlIHN0ZXJlbyIpOworTU9EVUxFX1BBUk1fREVTQyhzdGFuZGFyZCwgIlNwZWNpZnkgYXVkaW8gc3RhbmRhcmQ6IDMyID0gTlRTQywgNjQgPSByYWRpbywgRGVmYXVsdDogQXV0b2RldGVjdCIpOworTU9EVUxFX1BBUk1fREVTQyhhbXNvdW5kLCAiSGFyZHdpcmUgQU0gc291bmQgYXQgNi41SHogKEZyYW5jZSksIEZNIGNhbiBhdXRvc2NhbiIpOworTU9EVUxFX1BBUk1fREVTQyhkb2xieSwgIkFjdGl2YXRlcyBEb2xieSBwcm9jZXNzc2luZyIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGNvbnRyb2wgc3ViYWRkcmVzcyAqLworI2RlZmluZSBJMkNfTVNQX0NPTlRST0wgMHgwMAorLyogZGVtb2R1bGF0b3IgdW5pdCBzdWJhZGRyZXNzICovCisjZGVmaW5lIEkyQ19NU1BfREVNICAgICAweDEwCisvKiBEU1AgdW5pdCBzdWJhZGRyZXNzICovCisjZGVmaW5lIEkyQ19NU1BfRFNQICAgICAweDEyCisKKy8qIEFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDgwID4+IDEsIDB4ODggPj4gMSwgSTJDX0NMSUVOVF9FTkQgfTsKK0kyQ19DTElFTlRfSU5TTU9EOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZnVuY3Rpb25zIGZvciB0YWxraW5nIHRvIHRoZSBNU1AzNDAwQyBTb3VuZCBwcm9jZXNzb3IgICAgICAgICAgICAgICAgICAgKi8KKworaW50IG1zcF9yZXNldChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCS8qIHJlc2V0IGFuZCByZWFkIHJldmlzaW9uIGNvZGUgKi8KKwlzdGF0aWMgdTggcmVzZXRfb2ZmWzNdID0geyBJMkNfTVNQX0NPTlRST0wsIDB4ODAsIDB4MDAgfTsKKwlzdGF0aWMgdTggcmVzZXRfb25bM10gID0geyBJMkNfTVNQX0NPTlRST0wsIDB4MDAsIDB4MDAgfTsKKwlzdGF0aWMgdTggd3JpdGVbM10gICAgID0geyBJMkNfTVNQX0RTUCArIDEsIDB4MDAsIDB4MWUgfTsKKwl1OCByZWFkWzJdOworCXN0cnVjdCBpMmNfbXNnIHJlc2V0WzJdID0geworCQl7IGNsaWVudC0+YWRkciwgSTJDX01fSUdOT1JFX05BSywgMywgcmVzZXRfb2ZmIH0sCisJCXsgY2xpZW50LT5hZGRyLCBJMkNfTV9JR05PUkVfTkFLLCAzLCByZXNldF9vbiAgfSwKKwl9OworCXN0cnVjdCBpMmNfbXNnIHRlc3RbMl0gPSB7CisJCXsgY2xpZW50LT5hZGRyLCAwLCAgICAgICAgMywgd3JpdGUgfSwKKwkJeyBjbGllbnQtPmFkZHIsIEkyQ19NX1JELCAyLCByZWFkICB9LAorCX07CisKKwl2NGxfZGJnKDMsIG1zcF9kZWJ1ZywgY2xpZW50LCAibXNwX3Jlc2V0XG4iKTsKKwlpZiAoaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgJnJlc2V0WzBdLCAxKSAhPSAxIHx8CisJICAgIGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsICZyZXNldFsxXSwgMSkgIT0gMSB8fAorCSAgICBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCB0ZXN0LCAyKSAhPSAyKSB7CisJCXY0bF9lcnIoY2xpZW50LCAiY2hpcCByZXNldCBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zcF9yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBkZXYsIGludCBhZGRyKQoreworCWludCBlcnIsIHJldHZhbDsKKwl1OCB3cml0ZVszXTsKKwl1OCByZWFkWzJdOworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbMl0gPSB7CisJCXsgY2xpZW50LT5hZGRyLCAwLCAgICAgICAgMywgd3JpdGUgfSwKKwkJeyBjbGllbnQtPmFkZHIsIEkyQ19NX1JELCAyLCByZWFkICB9CisJfTsKKworCXdyaXRlWzBdID0gZGV2ICsgMTsKKwl3cml0ZVsxXSA9IGFkZHIgPj4gODsKKwl3cml0ZVsyXSA9IGFkZHIgJiAweGZmOworCisJZm9yIChlcnIgPSAwOyBlcnIgPCAzOyBlcnIrKykgeworCQlpZiAoaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNncywgMikgPT0gMikKKwkJCWJyZWFrOworCQl2NGxfd2FybihjbGllbnQsICJJL08gZXJyb3IgIyVkIChyZWFkIDB4JTAyeC8weCUwMngpXG4iLCBlcnIsCisJCSAgICAgICBkZXYsIGFkZHIpOworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwkJc2NoZWR1bGVfdGltZW91dChtc2Vjc190b19qaWZmaWVzKDEwKSk7CisJfQorCWlmIChlcnIgPT0gMykgeworCQl2NGxfd2FybihjbGllbnQsICJnaXZpbmcgdXAsIHJlc2V0dGluZyBjaGlwLiBTb3VuZCB3aWxsIGdvIG9mZiwgc29ycnkgZm9sa3MgOi18XG4iKTsKKwkJbXNwX3Jlc2V0KGNsaWVudCk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dmFsID0gcmVhZFswXSA8PCA4IHwgcmVhZFsxXTsKKwl2NGxfZGJnKDMsIG1zcF9kZWJ1ZywgY2xpZW50LCAibXNwX3JlYWQoMHgleCwgMHgleCk6IDB4JXhcbiIsIGRldiwgYWRkciwgcmV0dmFsKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgbXNwX3JlYWRfZGVtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBhZGRyKQoreworCXJldHVybiBtc3BfcmVhZChjbGllbnQsIEkyQ19NU1BfREVNLCBhZGRyKTsKK30KKworaW50IG1zcF9yZWFkX2RzcChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgYWRkcikKK3sKKwlyZXR1cm4gbXNwX3JlYWQoY2xpZW50LCBJMkNfTVNQX0RTUCwgYWRkcik7Cit9CisKK3N0YXRpYyBpbnQgbXNwX3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBkZXYsIGludCBhZGRyLCBpbnQgdmFsKQoreworCWludCBlcnI7CisJdTggYnVmZmVyWzVdOworCisJYnVmZmVyWzBdID0gZGV2OworCWJ1ZmZlclsxXSA9IGFkZHIgPj4gODsKKwlidWZmZXJbMl0gPSBhZGRyICYgIDB4ZmY7CisJYnVmZmVyWzNdID0gdmFsICA+PiA4OworCWJ1ZmZlcls0XSA9IHZhbCAgJiAgMHhmZjsKKworCXY0bF9kYmcoMywgbXNwX2RlYnVnLCBjbGllbnQsICJtc3Bfd3JpdGUoMHgleCwgMHgleCwgMHgleClcbiIsIGRldiwgYWRkciwgdmFsKTsKKwlmb3IgKGVyciA9IDA7IGVyciA8IDM7IGVycisrKSB7CisJCWlmIChpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWZmZXIsIDUpID09IDUpCisJCQlicmVhazsKKwkJdjRsX3dhcm4oY2xpZW50LCAiSS9PIGVycm9yICMlZCAod3JpdGUgMHglMDJ4LzB4JTAyeClcbiIsIGVyciwKKwkJICAgICAgIGRldiwgYWRkcik7CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQlzY2hlZHVsZV90aW1lb3V0KG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKKwl9CisJaWYgKGVyciA9PSAzKSB7CisJCXY0bF93YXJuKGNsaWVudCwgImdpdmluZyB1cCwgcmVzZXR0aW5nIGNoaXAuIFNvdW5kIHdpbGwgZ28gb2ZmLCBzb3JyeSBmb2xrcyA6LXxcbiIpOworCQltc3BfcmVzZXQoY2xpZW50KTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IG1zcF93cml0ZV9kZW0oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGFkZHIsIGludCB2YWwpCit7CisJcmV0dXJuIG1zcF93cml0ZShjbGllbnQsIEkyQ19NU1BfREVNLCBhZGRyLCB2YWwpOworfQorCitpbnQgbXNwX3dyaXRlX2RzcChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgYWRkciwgaW50IHZhbCkKK3sKKwlyZXR1cm4gbXNwX3dyaXRlKGNsaWVudCwgSTJDX01TUF9EU1AsIGFkZHIsIHZhbCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqIGJpdHMgIDkgIDggIDUgLSBTQ0FSVCBEU1AgaW5wdXQgU2VsZWN0OgorICogICAgICAgMCAgMCAgMCAtIFNDQVJUIDEgdG8gRFNQIGlucHV0IChyZXNldCBwb3NpdGlvbikKKyAqICAgICAgIDAgIDEgIDAgLSBNT05PIHRvIERTUCBpbnB1dAorICogICAgICAgMSAgMCAgMCAtIFNDQVJUIDIgdG8gRFNQIGlucHV0CisgKiAgICAgICAxICAxICAxIC0gTXV0ZSBEU1AgaW5wdXQKKyAqCisgKiBiaXRzIDExIDEwICA2IC0gU0NBUlQgMSBPdXRwdXQgU2VsZWN0OgorICogICAgICAgMCAgMCAgMCAtIHVuZGVmaW5lZCAocmVzZXQgcG9zaXRpb24pCisgKiAgICAgICAwICAxICAwIC0gU0NBUlQgMiBJbnB1dCB0byBTQ0FSVCAxIE91dHB1dCAoZm9yIGRldmljZXMgd2l0aCAyIFNDQVJUUykKKyAqICAgICAgIDEgIDAgIDAgLSBNT05PIGlucHV0IHRvIFNDQVJUIDEgT3V0cHV0CisgKiAgICAgICAxICAxICAwIC0gU0NBUlQgMSBEQSB0byBTQ0FSVCAxIE91dHB1dAorICogICAgICAgMCAgMCAgMSAtIFNDQVJUIDIgREEgdG8gU0NBUlQgMSBPdXRwdXQKKyAqICAgICAgIDAgIDEgIDEgLSBTQ0FSVCAxIElucHV0IHRvIFNDQVJUIDEgT3V0cHV0CisgKiAgICAgICAxICAxICAxIC0gTXV0ZSBTQ0FSVCAxIE91dHB1dAorICoKKyAqIGJpdHMgMTMgMTIgIDcgLSBTQ0FSVCAyIE91dHB1dCBTZWxlY3QgKGZvciBkZXZpY2VzIHdpdGggMiBPdXRwdXQgU0NBUlQpOgorICogICAgICAgMCAgMCAgMCAtIFNDQVJUIDEgREEgdG8gU0NBUlQgMiBPdXRwdXQgKHJlc2V0IHBvc2l0aW9uKQorICogICAgICAgMCAgMSAgMCAtIFNDQVJUIDEgSW5wdXQgdG8gU0NBUlQgMiBPdXRwdXQKKyAqICAgICAgIDEgIDAgIDAgLSBNT05PIGlucHV0IHRvIFNDQVJUIDIgT3V0cHV0CisgKiAgICAgICAwICAwICAxIC0gU0NBUlQgMiBEQSB0byBTQ0FSVCAyIE91dHB1dAorICogICAgICAgMCAgMSAgMSAtIFNDQVJUIDIgSW5wdXQgdG8gU0NBUlQgMiBPdXRwdXQKKyAqICAgICAgIDEgIDEgIDAgLSBNdXRlIFNDQVJUIDIgT3V0cHV0CisgKgorICogQml0cyA0IHRvIDAgc2hvdWxkIGJlIHplcm8uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHNjYXJ0c1szXVs5XSA9IHsKKwkvKiBNQVNLICAgIElOMSAgICAgSU4yICAgICBJTjFfREEgIElOMl9EQSAgSU4zICAgICBJTjQgICAgIE1PTk8gICAgTVVURSAgICovCisJLyogU0NBUlQgRFNQIElucHV0IHNlbGVjdCAqLworCXsgMHgwMzIwLCAweDAwMDAsIDB4MDIwMCwgLTEsICAgICAtMSwgICAgIDB4MDMwMCwgMHgwMDIwLCAweDAxMDAsIDB4MDMyMCB9LAorCS8qIFNDQVJUMSBPdXRwdXQgc2VsZWN0ICovCisJeyAweDBjNDAsIDB4MDQ0MCwgMHgwNDAwLCAweDBjMDAsIDB4MDA0MCwgMHgwMDAwLCAweDA4NDAsIDB4MDgwMCwgMHgwYzQwIH0sCisJLyogU0NBUlQyIE91dHB1dCBzZWxlY3QgKi8KKwl7IDB4MzA4MCwgMHgxMDAwLCAweDEwODAsIDB4MDAwMCwgMHgwMDgwLCAweDIwODAsIDB4MzA4MCwgMHgyMDAwLCAweDMwMDAgfSwKK307CisKK3N0YXRpYyBjaGFyICpzY2FydF9uYW1lc1tdID0geworCSJtYXNrIiwgImluMSIsICJpbjIiLCAiaW4xIGRhIiwgImluMiBkYSIsICJpbjMiLCAiaW40IiwgIm1vbm8iLCAibXV0ZSIKK307CisKK3ZvaWQgbXNwX3NldF9zY2FydChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgaW4sIGludCBvdXQpCit7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXN0YXRlLT5pbl9zY2FydD1pbjsKKworCWlmIChpbiA+PSAxICYmIGluIDw9IDggJiYgb3V0ID49IDAgJiYgb3V0IDw9IDIpIHsKKwkJaWYgKC0xID09IHNjYXJ0c1tvdXRdW2luXSkKKwkJCXJldHVybjsKKworCQlzdGF0ZS0+YWNiICY9IH5zY2FydHNbb3V0XVtTQ0FSVF9NQVNLXTsKKwkJc3RhdGUtPmFjYiB8PSAgc2NhcnRzW291dF1baW5dOworCX0gZWxzZQorCQlzdGF0ZS0+YWNiID0gMHhmNjA7IC8qIE11dGUgSW5wdXQgYW5kIFNDQVJUIDEgT3V0cHV0ICovCisKKwl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAic2NhcnQgc3dpdGNoOiAlcyA9PiAlZCAoQUNCPTB4JTA0eClcbiIsCisJCQkJCQlzY2FydF9uYW1lc1tpbl0sIG91dCwgc3RhdGUtPmFjYik7CisJbXNwX3dyaXRlX2RzcChjbGllbnQsIDB4MTMsIHN0YXRlLT5hY2IpOworCisJLyogU2V0cyBJMlMgc3BlZWQgMCA9IDEuMDI0IE1icHMsIDEgPSAyLjA0OCBNYnBzICovCisJbXNwX3dyaXRlX2RlbShjbGllbnQsIDB4NDAsIHN0YXRlLT5pMnNfbW9kZSk7Cit9CisKK3ZvaWQgbXNwX3NldF9tdXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJtdXRlIGF1ZGlvXG4iKTsKKwltc3Bfd3JpdGVfZHNwKGNsaWVudCwgMHgwMDAwLCAwKTsKKwltc3Bfd3JpdGVfZHNwKGNsaWVudCwgMHgwMDA3LCAxKTsKKwlpZiAoc3RhdGUtPmhhc19zY2FydDJfb3V0X3ZvbHVtZSkKKwkJbXNwX3dyaXRlX2RzcChjbGllbnQsIDB4MDA0MCwgMSk7CisJaWYgKHN0YXRlLT5oYXNfaGVhZHBob25lcykKKwkJbXNwX3dyaXRlX2RzcChjbGllbnQsIDB4MDAwNiwgMCk7Cit9CisKK3ZvaWQgbXNwX3NldF9hdWRpbyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGJhbCA9IDAsIGJhc3MsIHRyZWJsZSwgbG91ZG5lc3M7CisJaW50IHZhbCA9IDA7CisKKwlpZiAoIXN0YXRlLT5tdXRlZCkKKwkJdmFsID0gKHN0YXRlLT52b2x1bWUgKiAweDdmIC8gNjU1MzUpIDw8IDg7CisKKwl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAibXV0ZT0lcyB2b2x1bWU9JWRcbiIsCisJCXN0YXRlLT5tdXRlZCA/ICJvbiIgOiAib2ZmIiwgc3RhdGUtPnZvbHVtZSk7CisKKwltc3Bfd3JpdGVfZHNwKGNsaWVudCwgMHgwMDAwLCB2YWwpOworCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDAwMDcsIHN0YXRlLT5tdXRlZCA/IDB4MSA6ICh2YWwgfCAweDEpKTsKKwlpZiAoc3RhdGUtPmhhc19zY2FydDJfb3V0X3ZvbHVtZSkKKwkJbXNwX3dyaXRlX2RzcChjbGllbnQsIDB4MDA0MCwgc3RhdGUtPm11dGVkID8gMHgxIDogKHZhbCB8IDB4MSkpOworCWlmIChzdGF0ZS0+aGFzX2hlYWRwaG9uZXMpCisJCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDAwMDYsIHZhbCk7CisJaWYgKCFzdGF0ZS0+aGFzX3NvdW5kX3Byb2Nlc3NpbmcpCisJCXJldHVybjsKKworCWlmICh2YWwpCisJCWJhbCA9ICh1OCkoKHN0YXRlLT5iYWxhbmNlIC8gMjU2KSAtIDEyOCk7CisJYmFzcyA9ICgoc3RhdGUtPmJhc3MgLSAzMjc2OCkgKiAweDYwIC8gNjU1MzUpIDw8IDg7CisJdHJlYmxlID0gKChzdGF0ZS0+dHJlYmxlIC0gMzI3NjgpICogMHg2MCAvIDY1NTM1KSA8PCA4OworCWxvdWRuZXNzID0gc3RhdGUtPmxvdWRuZXNzID8gKCg1ICogNCkgPDwgOCkgOiAwOworCisJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgImJhbGFuY2U9JWQgYmFzcz0lZCB0cmVibGU9JWQgbG91ZG5lc3M9JWRcbiIsCisJCXN0YXRlLT5iYWxhbmNlLCBzdGF0ZS0+YmFzcywgc3RhdGUtPnRyZWJsZSwgc3RhdGUtPmxvdWRuZXNzKTsKKworCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDAwMDEsIGJhbCA8PCA4KTsKKwltc3Bfd3JpdGVfZHNwKGNsaWVudCwgMHgwMDAyLCBiYXNzKTsKKwltc3Bfd3JpdGVfZHNwKGNsaWVudCwgMHgwMDAzLCB0cmVibGUpOworCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDAwMDQsIGxvdWRuZXNzKTsKKwlpZiAoIXN0YXRlLT5oYXNfaGVhZHBob25lcykKKwkJcmV0dXJuOworCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDAwMzAsIGJhbCA8PCA4KTsKKwltc3Bfd3JpdGVfZHNwKGNsaWVudCwgMHgwMDMxLCBiYXNzKTsKKwltc3Bfd3JpdGVfZHNwKGNsaWVudCwgMHgwMDMyLCB0cmVibGUpOworCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDAwMzMsIGxvdWRuZXNzKTsKK30KKworaW50IG1zcF9tb2R1cyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpZiAoc3RhdGUtPnJhZGlvKSB7CisJCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJ2aWRlbyBtb2RlIHNlbGVjdGVkIHRvIFJhZGlvXG4iKTsKKwkJcmV0dXJuIDB4MDAwMzsKKwl9CisKKwlpZiAoc3RhdGUtPnY0bDJfc3RkICYgVjRMMl9TVERfUEFMKSB7CisJCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJ2aWRlbyBtb2RlIHNlbGVjdGVkIHRvIFBBTFxuIik7CisKKyNpZiAxCisJCS8qIGV4cGVyaW1lbnRhbDogbm90IHN1cmUgdGhpcyB3b3JrcyB3aXRoIGFsbCBjaGlwIHZlcnNpb25zICovCisJCXJldHVybiAweDcwMDM7CisjZWxzZQorCQkvKiBwcmV2aW91cyB2YWx1ZSwgdHJ5IHRoaXMgaWYgaXQgYnJlYWtzIC4uLiAqLworCQlyZXR1cm4gMHgxMDAzOworI2VuZGlmCisJfQorCWlmIChzdGF0ZS0+djRsMl9zdGQgJiBWNEwyX1NURF9OVFNDKSB7CisJCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJ2aWRlbyBtb2RlIHNlbGVjdGVkIHRvIE5UU0NcbiIpOworCQlyZXR1cm4gMHgyMDAzOworCX0KKwlpZiAoc3RhdGUtPnY0bDJfc3RkICYgVjRMMl9TVERfU0VDQU0pIHsKKwkJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgInZpZGVvIG1vZGUgc2VsZWN0ZWQgdG8gU0VDQU1cbiIpOworCQlyZXR1cm4gMHgwMDAzOworCX0KKwlyZXR1cm4gMHgwMDAzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCitzdGF0aWMgdm9pZCBtc3Bfd2FrZV90aHJlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaWYgKE5VTEwgPT0gc3RhdGUtPmt0aHJlYWQpCisJCXJldHVybjsKKwltc3Bfc2V0X211dGUoY2xpZW50KTsKKwlzdGF0ZS0+d2F0Y2hfc3RlcmVvID0gMDsKKwlzdGF0ZS0+cmVzdGFydCA9IDE7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+d3EpOworfQorCitpbnQgbXNwX3NsZWVwKHN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlLCBpbnQgdGltZW91dCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCWFkZF93YWl0X3F1ZXVlKCZzdGF0ZS0+d3EsICZ3YWl0KTsKKwlpZiAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQlpZiAodGltZW91dCA8IDApIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZSgpOworCQl9IGVsc2UgeworCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlCisJCQkJCQkobXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSk7CisJCX0KKwl9CisKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmc3RhdGUtPndxLCAmd2FpdCk7CisJdHJ5X3RvX2ZyZWV6ZSgpOworCXJldHVybiBzdGF0ZS0+cmVzdGFydDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgbXNwX21vZGVfdjRsMl90b192NGwxKGludCByeHN1YmNoYW5zKQoreworCWludCBtb2RlID0gMDsKKworCWlmIChyeHN1YmNoYW5zICYgVjRMMl9UVU5FUl9TVUJfU1RFUkVPKQorCQltb2RlIHw9IFZJREVPX1NPVU5EX1NURVJFTzsKKwlpZiAocnhzdWJjaGFucyAmIFY0TDJfVFVORVJfU1VCX0xBTkcyKQorCQltb2RlIHw9IFZJREVPX1NPVU5EX0xBTkcyOworCWlmIChyeHN1YmNoYW5zICYgVjRMMl9UVU5FUl9TVUJfTEFORzEpCisJCW1vZGUgfD0gVklERU9fU09VTkRfTEFORzE7CisJaWYgKG1vZGUgPT0gMCkKKwkJbW9kZSB8PSBWSURFT19TT1VORF9NT05POworCXJldHVybiBtb2RlOworfQorCitzdGF0aWMgaW50IG1zcF9tb2RlX3Y0bDFfdG9fdjRsMihpbnQgbW9kZSkKK3sKKwlpZiAobW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykKKwkJcmV0dXJuIFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CisJaWYgKG1vZGUgJiBWSURFT19TT1VORF9MQU5HMikKKwkJcmV0dXJuIFY0TDJfVFVORVJfTU9ERV9MQU5HMjsKKwlpZiAobW9kZSAmIFZJREVPX1NPVU5EX0xBTkcxKQorCQlyZXR1cm4gVjRMMl9UVU5FUl9NT0RFX0xBTkcxOworCXJldHVybiBWNEwyX1RVTkVSX01PREVfTU9OTzsKK30KKworc3RhdGljIHZvaWQgbXNwX2FueV9kZXRlY3Rfc3RlcmVvKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlzd2l0Y2ggKHN0YXRlLT5vcG1vZGUpIHsKKwljYXNlIE9QTU9ERV9NQU5VQUw6CisJY2FzZSBPUE1PREVfQVVUT0RFVEVDVDoKKwkJYXV0b2RldGVjdF9zdGVyZW8oY2xpZW50KTsKKwkJYnJlYWs7CisJY2FzZSBPUE1PREVfQVVUT1NFTEVDVDoKKwkJbXNwMzR4eGdfZGV0ZWN0X3N0ZXJlbyhjbGllbnQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgbXNwX3FjdHJsX3N0ZFtdID0geworCXsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19WT0xVTUUsCisJCS5uYW1lICAgICAgICAgID0gIlZvbHVtZSIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSA2NTUzNSwKKwkJLnN0ZXAgICAgICAgICAgPSA2NTUzNS8xMDAsCisJCS5kZWZhdWx0X3ZhbHVlID0gNTg4ODAsCisJCS5mbGFncyAgICAgICAgID0gMCwKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCX0seworCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0FVRElPX01VVEUsCisJCS5uYW1lICAgICAgICAgID0gIk11dGUiLAorCQkubWluaW11bSAgICAgICA9IDAsCisJCS5tYXhpbXVtICAgICAgID0gMSwKKwkJLnN0ZXAgICAgICAgICAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDEsCisJCS5mbGFncyAgICAgICAgID0gMCwKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHY0bDJfcXVlcnljdHJsIG1zcF9xY3RybF9zb3VuZF9wcm9jZXNzaW5nW10gPSB7CisJeworCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0UsCisJCS5uYW1lICAgICAgICAgID0gIkJhbGFuY2UiLAorCQkubWluaW11bSAgICAgICA9IDAsCisJCS5tYXhpbXVtICAgICAgID0gNjU1MzUsCisJCS5zdGVwICAgICAgICAgID0gNjU1MzUvMTAwLAorCQkuZGVmYXVsdF92YWx1ZSA9IDMyNzY4LAorCQkuZmxhZ3MgICAgICAgICA9IDAsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwl9LHsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19CQVNTLAorCQkubmFtZSAgICAgICAgICA9ICJCYXNzIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDY1NTM1LAorCQkuc3RlcCAgICAgICAgICA9IDY1NTM1LzEwMCwKKwkJLmRlZmF1bHRfdmFsdWUgPSAzMjc2OCwKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCX0seworCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0FVRElPX1RSRUJMRSwKKwkJLm5hbWUgICAgICAgICAgPSAiVHJlYmxlIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDY1NTM1LAorCQkuc3RlcCAgICAgICAgICA9IDY1NTM1LzEwMCwKKwkJLmRlZmF1bHRfdmFsdWUgPSAzMjc2OCwKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCX0seworCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0FVRElPX0xPVURORVNTLAorCQkubmFtZSAgICAgICAgICA9ICJMb3VkbmVzcyIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSAxLAorCQkuc3RlcCAgICAgICAgICA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwkJLmZsYWdzICAgICAgICAgPSAwLAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJfSwKK307CisKKworc3RhdGljIHZvaWQgbXNwX2FueV9zZXRfYXVkbW9kZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgYXVkbW9kZSkKK3sKKwlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJc3dpdGNoIChzdGF0ZS0+b3Btb2RlKSB7CisJY2FzZSBPUE1PREVfTUFOVUFMOgorCWNhc2UgT1BNT0RFX0FVVE9ERVRFQ1Q6CisJCXN0YXRlLT53YXRjaF9zdGVyZW8gPSAwOworCQltc3AzNDAwY19zZXRzdGVyZW8oY2xpZW50LCBhdWRtb2RlKTsKKwkJYnJlYWs7CisJY2FzZSBPUE1PREVfQVVUT1NFTEVDVDoKKwkJbXNwMzR4eGdfc2V0X2F1ZG1vZGUoY2xpZW50LCBhdWRtb2RlKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IG1zcF9nZXRfY3RybChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CisJCWN0cmwtPnZhbHVlID0gc3RhdGUtPnZvbHVtZTsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CisJCWN0cmwtPnZhbHVlID0gc3RhdGUtPm11dGVkOworCQlicmVhazsKKworCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRToKKwkJaWYgKCFzdGF0ZS0+aGFzX3NvdW5kX3Byb2Nlc3NpbmcpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY3RybC0+dmFsdWUgPSBzdGF0ZS0+YmFsYW5jZTsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0JBU1M6CisJCWlmICghc3RhdGUtPmhhc19zb3VuZF9wcm9jZXNzaW5nKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWN0cmwtPnZhbHVlID0gc3RhdGUtPmJhc3M7CisJCWJyZWFrOworCisJY2FzZSBWNEwyX0NJRF9BVURJT19UUkVCTEU6CisJCWlmICghc3RhdGUtPmhhc19zb3VuZF9wcm9jZXNzaW5nKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWN0cmwtPnZhbHVlID0gc3RhdGUtPnRyZWJsZTsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0xPVURORVNTOgorCQlpZiAoIXN0YXRlLT5oYXNfc291bmRfcHJvY2Vzc2luZykKKwkJCXJldHVybiAtRUlOVkFMOworCQljdHJsLT52YWx1ZSA9IHN0YXRlLT5sb3VkbmVzczsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNwX3NldF9jdHJsKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKKwkJc3RhdGUtPnZvbHVtZSA9IGN0cmwtPnZhbHVlOworCQlpZiAoc3RhdGUtPnZvbHVtZSA9PSAwKQorCQkJc3RhdGUtPmJhbGFuY2UgPSAzMjc2ODsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CisJCWlmIChjdHJsLT52YWx1ZSA8IDAgfHwgY3RybC0+dmFsdWUgPj0gMikKKwkJCXJldHVybiAtRVJBTkdFOworCQlzdGF0ZS0+bXV0ZWQgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0JBU1M6CisJCWlmICghc3RhdGUtPmhhc19zb3VuZF9wcm9jZXNzaW5nKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXN0YXRlLT5iYXNzID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBWNEwyX0NJRF9BVURJT19UUkVCTEU6CisJCWlmICghc3RhdGUtPmhhc19zb3VuZF9wcm9jZXNzaW5nKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXN0YXRlLT50cmVibGUgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0xPVURORVNTOgorCQlpZiAoIXN0YXRlLT5oYXNfc291bmRfcHJvY2Vzc2luZykKKwkJCXJldHVybiAtRUlOVkFMOworCQlzdGF0ZS0+bG91ZG5lc3MgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0U6CisJCWlmICghc3RhdGUtPmhhc19zb3VuZF9wcm9jZXNzaW5nKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXN0YXRlLT5iYWxhbmNlID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1zcF9zZXRfYXVkaW8oY2xpZW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc3BfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1MTYgKnNhcmcgPSBhcmc7CisJaW50IHNjYXJ0ID0gMDsKKworCWlmIChtc3BfZGVidWcgPj0gMikKKwkJdjRsX2kyY19wcmludF9pb2N0bChjbGllbnQsIGNtZCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVEQ19TRVRfSU5QVVQ6CisJCWlmICgqc2FyZyA9PSBzdGF0ZS0+aW5wdXQpCisJCQlicmVhazsKKwkJc3RhdGUtPmlucHV0ID0gKnNhcmc7CisJCXN3aXRjaCAoKnNhcmcpIHsKKwkJY2FzZSBBVURJT19SQURJTzoKKwkJCS8qIEhhdXBwYXVnZSB1c2VzIElOMiBmb3IgdGhlIHJhZGlvICovCisJCQlzdGF0ZS0+bW9kZSA9IE1TUF9NT0RFX0ZNX1JBRElPOworCQkJc2NhcnQgICAgICAgPSBTQ0FSVF9JTjI7CisJCQlicmVhazsKKwkJY2FzZSBBVURJT19FWFRFUk5fMToKKwkJCS8qIElOMSBpcyBvZnRlbiB1c2VkIGZvciBleHRlcm5hbCBpbnB1dCAuLi4gKi8KKwkJCXN0YXRlLT5tb2RlID0gTVNQX01PREVfRVhURVJOOworCQkJc2NhcnQgICAgICAgPSBTQ0FSVF9JTjE7CisJCQlicmVhazsKKwkJY2FzZSBBVURJT19FWFRFUk5fMjoKKwkJCS8qIC4uLiBzb21ldGltZXMgaXQgaXMgSU4yIHRocm91Z2ggOykgKi8KKwkJCXN0YXRlLT5tb2RlID0gTVNQX01PREVfRVhURVJOOworCQkJc2NhcnQgICAgICAgPSBTQ0FSVF9JTjI7CisJCQlicmVhazsKKwkJY2FzZSBBVURJT19UVU5FUjoKKwkJCXN0YXRlLT5tb2RlID0gLTE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmICgqc2FyZyAmIEFVRElPX01VVEUpCisJCQkJbXNwX3NldF9zY2FydChjbGllbnQsIFNDQVJUX01VVEUsIDApOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHNjYXJ0KSB7CisJCQlzdGF0ZS0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKKwkJCXN0YXRlLT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKKwkJCW1zcF9zZXRfc2NhcnQoY2xpZW50LCBzY2FydCwgMCk7CisJCQltc3Bfd3JpdGVfZHNwKGNsaWVudCwgMHgwMDBkLCAweDE5MDApOworCQkJaWYgKHN0YXRlLT5vcG1vZGUgIT0gT1BNT0RFX0FVVE9TRUxFQ1QpCisJCQkJbXNwMzQwMGNfc2V0c3RlcmVvKGNsaWVudCwgc3RhdGUtPmF1ZG1vZGUpOworCQl9CisJCW1zcF93YWtlX3RocmVhZChjbGllbnQpOworCQlicmVhazsKKworCWNhc2UgQVVEQ19TRVRfUkFESU86CisJCWlmIChzdGF0ZS0+cmFkaW8pCisJCQlyZXR1cm4gMDsKKwkJc3RhdGUtPnJhZGlvID0gMTsKKwkJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgInN3aXRjaGluZyB0byByYWRpbyBtb2RlXG4iKTsKKwkJc3RhdGUtPndhdGNoX3N0ZXJlbyA9IDA7CisJCXN3aXRjaCAoc3RhdGUtPm9wbW9kZSkgeworCQljYXNlIE9QTU9ERV9NQU5VQUw6CisJCQkvKiBzZXQgbXNwMzQwMCB0byBGTSByYWRpbyBtb2RlICovCisJCQltc3AzNDAwY19zZXRtb2RlKGNsaWVudCwgTVNQX01PREVfRk1fUkFESU8pOworCQkJbXNwMzQwMGNfc2V0Y2FycmllcihjbGllbnQsIE1TUF9DQVJSSUVSKDEwLjcpLAorCQkJCQkgICAgTVNQX0NBUlJJRVIoMTAuNykpOworCQkJbXNwX3NldF9hdWRpbyhjbGllbnQpOworCQkJYnJlYWs7CisJCWNhc2UgT1BNT0RFX0FVVE9ERVRFQ1Q6CisJCWNhc2UgT1BNT0RFX0FVVE9TRUxFQ1Q6CisJCQkvKiB0aGUgdGhyZWFkIHdpbGwgZG8gZm9yIHVzICovCisJCQltc3Bfd2FrZV90aHJlYWQoY2xpZW50KTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJLyogLS0tIHY0bCBpb2N0bHMgLS0tICovCisJLyogdGFrZSBjYXJlOiBidHR2IGRvZXMgdXNlcnNwYWNlIGNvcHlpbmcsIHdlJ2xsIGdldCBhCisJICAga2VybmVsIHBvaW50ZXIgaGVyZS4uLiAqLworCWNhc2UgVklESU9DR0FVRElPOgorCXsKKwkJc3RydWN0IHZpZGVvX2F1ZGlvICp2YSA9IGFyZzsKKworCQl2YS0+ZmxhZ3MgfD0gVklERU9fQVVESU9fVk9MVU1FIHwgVklERU9fQVVESU9fTVVUQUJMRTsKKwkJaWYgKHN0YXRlLT5oYXNfc291bmRfcHJvY2Vzc2luZykKKwkJCXZhLT5mbGFncyB8PSBWSURFT19BVURJT19CQUxBTkNFIHwKKwkJCQlWSURFT19BVURJT19CQVNTIHwKKwkJCQlWSURFT19BVURJT19UUkVCTEU7CisJCWlmIChzdGF0ZS0+bXV0ZWQpCisJCQl2YS0+ZmxhZ3MgfD0gVklERU9fQVVESU9fTVVURTsKKwkJdmEtPnZvbHVtZSA9IHN0YXRlLT52b2x1bWU7CisJCXZhLT5iYWxhbmNlID0gc3RhdGUtPnZvbHVtZSA/IHN0YXRlLT5iYWxhbmNlIDogMzI3Njg7CisJCXZhLT5iYXNzID0gc3RhdGUtPmJhc3M7CisJCXZhLT50cmVibGUgPSBzdGF0ZS0+dHJlYmxlOworCisJCWlmIChzdGF0ZS0+cmFkaW8pCisJCQlicmVhazsKKwkJaWYgKHN0YXRlLT5vcG1vZGUgPT0gT1BNT0RFX0FVVE9TRUxFQ1QpCisJCQltc3BfYW55X2RldGVjdF9zdGVyZW8oY2xpZW50KTsKKwkJdmEtPm1vZGUgPSBtc3BfbW9kZV92NGwyX3RvX3Y0bDEoc3RhdGUtPnJ4c3ViY2hhbnMpOworCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ1NBVURJTzoKKwl7CisJCXN0cnVjdCB2aWRlb19hdWRpbyAqdmEgPSBhcmc7CisKKwkJc3RhdGUtPm11dGVkID0gKHZhLT5mbGFncyAmIFZJREVPX0FVRElPX01VVEUpOworCQlzdGF0ZS0+dm9sdW1lID0gdmEtPnZvbHVtZTsKKwkJc3RhdGUtPmJhbGFuY2UgPSB2YS0+YmFsYW5jZTsKKwkJc3RhdGUtPmJhc3MgPSB2YS0+YmFzczsKKwkJc3RhdGUtPnRyZWJsZSA9IHZhLT50cmVibGU7CisJCW1zcF9zZXRfYXVkaW8oY2xpZW50KTsKKworCQlpZiAodmEtPm1vZGUgIT0gMCAmJiBzdGF0ZS0+cmFkaW8gPT0gMCkKKwkJCW1zcF9hbnlfc2V0X2F1ZG1vZGUoY2xpZW50LCBtc3BfbW9kZV92NGwxX3RvX3Y0bDIodmEtPm1vZGUpKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NTQ0hBTjoKKwl7CisJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2YyA9IGFyZzsKKwkJaW50IHVwZGF0ZSA9IDA7CisJCXY0bDJfc3RkX2lkIHN0ZDsKKworCQlpZiAoc3RhdGUtPnJhZGlvKQorCQkJdXBkYXRlID0gMTsKKwkJc3RhdGUtPnJhZGlvID0gMDsKKwkJaWYgKHZjLT5ub3JtID09IFZJREVPX01PREVfUEFMKQorCQkJc3RkID0gVjRMMl9TVERfUEFMOworCQllbHNlIGlmICh2Yy0+bm9ybSA9PSBWSURFT19NT0RFX1NFQ0FNKQorCQkJc3RkID0gVjRMMl9TVERfU0VDQU07CisJCWVsc2UKKwkJCXN0ZCA9IFY0TDJfU1REX05UU0M7CisJCWlmIChzdGQgIT0gc3RhdGUtPnY0bDJfc3RkKSB7CisJCQlzdGF0ZS0+djRsMl9zdGQgPSBzdGQ7CisJCQl1cGRhdGUgPSAxOworCQl9CisJCWlmICh1cGRhdGUpCisJCQltc3Bfd2FrZV90aHJlYWQoY2xpZW50KTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NTRlJFUToKKwljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKKwl7CisJCS8qIG5ldyBjaGFubmVsIC0tIGtpY2sgYXVkaW8gY2FycmllciBzY2FuICovCisJCW1zcF93YWtlX3RocmVhZChjbGllbnQpOworCQlicmVhazsKKwl9CisKKwkvKiBtc3AzNHh4IHNwZWNpZmljICovCisJY2FzZSBNU1BfU0VUX01BVFJJWDoKKwl7CisJCXN0cnVjdCBtc3BfbWF0cml4ICptc3BtID0gYXJnOworCisJCW1zcF9zZXRfc2NhcnQoY2xpZW50LCBtc3BtLT5pbnB1dCwgbXNwbS0+b3V0cHV0KTsKKwkJYnJlYWs7CisJfQorCisJLyogLS0tIHY0bDIgaW9jdGxzIC0tLSAqLworCWNhc2UgVklESU9DX1NfU1REOgorCXsKKwkJdjRsMl9zdGRfaWQgKmlkID0gYXJnOworCQlpbnQgdXBkYXRlID0gc3RhdGUtPnJhZGlvIHx8IHN0YXRlLT52NGwyX3N0ZCAhPSAqaWQ7CisKKwkJc3RhdGUtPnY0bDJfc3RkID0gKmlkOworCQlzdGF0ZS0+cmFkaW8gPSAwOworCQlpZiAodXBkYXRlKQorCQkJbXNwX3dha2VfdGhyZWFkKGNsaWVudCk7CisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DX0VOVU1JTlBVVDoKKwl7CisJCXN0cnVjdCB2NGwyX2lucHV0ICppID0gYXJnOworCisJCWlmIChpLT5pbmRleCAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaS0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9UVU5FUjsKKwkJc3dpdGNoIChpLT5pbmRleCkgeworCQljYXNlIEFVRElPX1JBRElPOgorCQkJc3RyY3B5KGktPm5hbWUsICJSYWRpbyIpOworCQkJYnJlYWs7CisJCWNhc2UgQVVESU9fRVhURVJOXzE6CisJCQlzdHJjcHkoaS0+bmFtZSwgIkV4dGVybiAxIik7CisJCQlicmVhazsKKwkJY2FzZSBBVURJT19FWFRFUk5fMjoKKwkJCXN0cmNweShpLT5uYW1lLCAiRXh0ZXJuIDIiKTsKKwkJCWJyZWFrOworCQljYXNlIEFVRElPX1RVTkVSOgorCQkJc3RyY3B5KGktPm5hbWUsICJUZWxldmlzaW9uIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DX0dfQVVESU86CisJeworCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYSA9IGFyZzsKKworCQltZW1zZXQoYSwgMCwgc2l6ZW9mKCphKSk7CisKKwkJc3dpdGNoIChhLT5pbmRleCkgeworCQljYXNlIEFVRElPX1JBRElPOgorCQkJc3RyY3B5KGEtPm5hbWUsICJSYWRpbyIpOworCQkJYnJlYWs7CisJCWNhc2UgQVVESU9fRVhURVJOXzE6CisJCQlzdHJjcHkoYS0+bmFtZSwgIkV4dGVybiAxIik7CisJCQlicmVhazsKKwkJY2FzZSBBVURJT19FWFRFUk5fMjoKKwkJCXN0cmNweShhLT5uYW1lLCAiRXh0ZXJuIDIiKTsKKwkJCWJyZWFrOworCQljYXNlIEFVRElPX1RVTkVSOgorCQkJc3RyY3B5KGEtPm5hbWUsICJUZWxldmlzaW9uIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJbXNwX2FueV9kZXRlY3Rfc3RlcmVvKGNsaWVudCk7CisJCWlmIChzdGF0ZS0+YXVkbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfU1RFUkVPKSB7CisJCQlhLT5jYXBhYmlsaXR5ID0gVjRMMl9BVURDQVBfU1RFUkVPOworCQl9CisKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NfU19BVURJTzoKKwl7CisJCXN0cnVjdCB2NGwyX2F1ZGlvICpzYXJnID0gYXJnOworCisJCXN3aXRjaCAoc2FyZy0+aW5kZXgpIHsKKwkJY2FzZSBBVURJT19SQURJTzoKKwkJCS8qIEhhdXBwYXVnZSB1c2VzIElOMiBmb3IgdGhlIHJhZGlvICovCisJCQlzdGF0ZS0+bW9kZSA9IE1TUF9NT0RFX0ZNX1JBRElPOworCQkJc2NhcnQgICAgICAgPSBTQ0FSVF9JTjI7CisJCQlicmVhazsKKwkJY2FzZSBBVURJT19FWFRFUk5fMToKKwkJCS8qIElOMSBpcyBvZnRlbiB1c2VkIGZvciBleHRlcm5hbCBpbnB1dCAuLi4gKi8KKwkJCXN0YXRlLT5tb2RlID0gTVNQX01PREVfRVhURVJOOworCQkJc2NhcnQgICAgICAgPSBTQ0FSVF9JTjE7CisJCQlicmVhazsKKwkJY2FzZSBBVURJT19FWFRFUk5fMjoKKwkJCS8qIC4uLiBzb21ldGltZXMgaXQgaXMgSU4yIHRocm91Z2ggOykgKi8KKwkJCXN0YXRlLT5tb2RlID0gTVNQX01PREVfRVhURVJOOworCQkJc2NhcnQgICAgICAgPSBTQ0FSVF9JTjI7CisJCQlicmVhazsKKwkJY2FzZSBBVURJT19UVU5FUjoKKwkJCXN0YXRlLT5tb2RlID0gLTE7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc2NhcnQpIHsKKwkJCXN0YXRlLT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfU1RFUkVPOworCQkJc3RhdGUtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOworCQkJbXNwX3NldF9zY2FydChjbGllbnQsIHNjYXJ0LCAwKTsKKwkJCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDAwMGQsIDB4MTkwMCk7CisJCX0KKwkJaWYgKHNhcmctPmNhcGFiaWxpdHkgPT0gVjRMMl9BVURDQVBfU1RFUkVPKSB7CisJCQlzdGF0ZS0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CisJCX0gZWxzZSB7CisJCQlzdGF0ZS0+YXVkbW9kZSAmPSB+VjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKKwkJfQorCQltc3BfYW55X3NldF9hdWRtb2RlKGNsaWVudCwgc3RhdGUtPmF1ZG1vZGUpOworCQltc3Bfd2FrZV90aHJlYWQoY2xpZW50KTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NfR19UVU5FUjoKKwl7CisJCXN0cnVjdCB2NGwyX3R1bmVyICp2dCA9IGFyZzsKKworCQlpZiAoc3RhdGUtPnJhZGlvKQorCQkJYnJlYWs7CisJCWlmIChzdGF0ZS0+b3Btb2RlID09IE9QTU9ERV9BVVRPU0VMRUNUKQorCQkJbXNwX2FueV9kZXRlY3Rfc3RlcmVvKGNsaWVudCk7CisJCXZ0LT5hdWRtb2RlICAgID0gc3RhdGUtPmF1ZG1vZGU7CisJCXZ0LT5yeHN1YmNoYW5zID0gc3RhdGUtPnJ4c3ViY2hhbnM7CisJCXZ0LT5jYXBhYmlsaXR5ID0gVjRMMl9UVU5FUl9DQVBfU1RFUkVPIHwKKwkJCVY0TDJfVFVORVJfQ0FQX0xBTkcxIHwgVjRMMl9UVU5FUl9DQVBfTEFORzI7CisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DX1NfVFVORVI6CisJeworCQlzdHJ1Y3QgdjRsMl90dW5lciAqdnQgPSAoc3RydWN0IHY0bDJfdHVuZXIgKilhcmc7CisKKwkJaWYgKHN0YXRlLT5yYWRpbykKKwkJCWJyZWFrOworCQkvKiBvbmx5IHNldCBhdWRtb2RlICovCisJCWlmICh2dC0+YXVkbW9kZSAhPSAtMSAmJiB2dC0+YXVkbW9kZSAhPSAwKQorCQkJbXNwX2FueV9zZXRfYXVkbW9kZShjbGllbnQsIHZ0LT5hdWRtb2RlKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NfR19BVURPVVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9hdWRpb291dCAqYSA9IChzdHJ1Y3QgdjRsMl9hdWRpb291dCAqKWFyZzsKKwkJaW50IGlkeCA9IGEtPmluZGV4OworCisJCW1lbXNldChhLCAwLCBzaXplb2YoKmEpKTsKKworCQlzd2l0Y2ggKGlkeCkgeworCQljYXNlIDA6CisJCQlzdHJjcHkoYS0+bmFtZSwgIlNjYXJ0MSBPdXQiKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzdHJjcHkoYS0+bmFtZSwgIlNjYXJ0MiBPdXQiKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlzdHJjcHkoYS0+bmFtZSwgIkkyUyBPdXQiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisKKwl9CisKKwljYXNlIFZJRElPQ19TX0FVRE9VVDoKKwl7CisJCXN0cnVjdCB2NGwyX2F1ZGlvb3V0ICphID0gKHN0cnVjdCB2NGwyX2F1ZGlvb3V0ICopYXJnOworCisJCWlmIChhLT5pbmRleCA8IDAgfHwgYS0+aW5kZXggPiAyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgIlNldHRpbmcgYXVkaW8gb3V0IG9uIG1zcDM0eHggdG8gaW5wdXQgJWlcbiIsIGEtPmluZGV4KTsKKwkJbXNwX3NldF9zY2FydChjbGllbnQsIHN0YXRlLT5pbl9zY2FydCwgYS0+aW5kZXggKyAxKTsKKworCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ19JTlRfSTJTX0NMT0NLX0ZSRVE6CisJeworCQl1MzIgKmEgPSAodTMyICopYXJnOworCisJCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJTZXR0aW5nIEkyUyBzcGVlZCB0byAlZFxuIiwgKmEpOworCisJCXN3aXRjaCAoKmEpIHsKKwkJCWNhc2UgMTAyNDAwMDoKKwkJCQlzdGF0ZS0+aTJzX21vZGUgPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSAyMDQ4MDAwOgorCQkJCXN0YXRlLT5pMnNfbW9kZSA9IDE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKKwl7CisJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMgPSBhcmc7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1zcF9xY3RybF9zdGQpOyBpKyspCisJCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSBtc3BfcWN0cmxfc3RkW2ldLmlkKSB7CisJCQkJbWVtY3B5KHFjLCAmbXNwX3FjdHJsX3N0ZFtpXSwgc2l6ZW9mKCpxYykpOworCQkJCXJldHVybiAwOworCQkJfQorCQlpZiAoIXN0YXRlLT5oYXNfc291bmRfcHJvY2Vzc2luZykKKwkJCXJldHVybiAtRUlOVkFMOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtc3BfcWN0cmxfc291bmRfcHJvY2Vzc2luZyk7IGkrKykKKwkJCWlmIChxYy0+aWQgJiYgcWMtPmlkID09IG1zcF9xY3RybF9zb3VuZF9wcm9jZXNzaW5nW2ldLmlkKSB7CisJCQkJbWVtY3B5KHFjLCAmbXNwX3FjdHJsX3NvdW5kX3Byb2Nlc3NpbmdbaV0sIHNpemVvZigqcWMpKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2FzZSBWSURJT0NfR19DVFJMOgorCQlyZXR1cm4gbXNwX2dldF9jdHJsKGNsaWVudCwgYXJnKTsKKworCWNhc2UgVklESU9DX1NfQ1RSTDoKKwkJcmV0dXJuIG1zcF9zZXRfY3RybChjbGllbnQsIGFyZyk7CisKKwljYXNlIFZJRElPQ19MT0dfU1RBVFVTOgorCXsKKwkJY29uc3QgY2hhciAqcDsKKworCQlpZiAoc3RhdGUtPm9wbW9kZSA9PSBPUE1PREVfQVVUT1NFTEVDVCkKKwkJCW1zcF9hbnlfZGV0ZWN0X3N0ZXJlbyhjbGllbnQpOworCQl2NGxfaW5mbyhjbGllbnQsICIlcyByZXYxID0gMHglMDR4IHJldjIgPSAweCUwNHhcbiIsCisJCQkJY2xpZW50LT5uYW1lLCBzdGF0ZS0+cmV2MSwgc3RhdGUtPnJldjIpOworCQl2NGxfaW5mbyhjbGllbnQsICJBdWRpbzogICAgdm9sdW1lICVkJXNcbiIsCisJCQkJc3RhdGUtPnZvbHVtZSwgc3RhdGUtPm11dGVkID8gIiAobXV0ZWQpIiA6ICIiKTsKKwkJaWYgKHN0YXRlLT5oYXNfc291bmRfcHJvY2Vzc2luZykgeworCQkJdjRsX2luZm8oY2xpZW50LCAiQXVkaW86ICAgIGJhbGFuY2UgJWQgYmFzcyAlZCB0cmVibGUgJWQgbG91ZG5lc3MgJXNcbiIsCisJCQkJCXN0YXRlLT5iYWxhbmNlLCBzdGF0ZS0+YmFzcywgc3RhdGUtPnRyZWJsZSwKKwkJCQkJc3RhdGUtPmxvdWRuZXNzID8gIm9uIiA6ICJvZmYiKTsKKwkJfQorCQlzd2l0Y2ggKHN0YXRlLT5tb2RlKSB7CisJCWNhc2UgTVNQX01PREVfQU1fREVURUNUOiBwID0gIkFNIChmb3IgY2FycmllciBkZXRlY3QpIjsgYnJlYWs7CisJCWNhc2UgTVNQX01PREVfRk1fUkFESU86IHAgPSAiRk0gUmFkaW8iOyBicmVhazsKKwkJY2FzZSBNU1BfTU9ERV9GTV9URVJSQTogcCA9ICJUZXJyZXN0aWFsIEZNLW1vbm8gKyBGTS1zdGVyZW8iOyBicmVhazsKKwkJY2FzZSBNU1BfTU9ERV9GTV9TQVQ6IHAgPSAiU2F0ZWxsaXRlIEZNLW1vbm8iOyBicmVhazsKKwkJY2FzZSBNU1BfTU9ERV9GTV9OSUNBTTE6IHAgPSAiTklDQU0vRk0gKEIvRywgRC9LKSI7IGJyZWFrOworCQljYXNlIE1TUF9NT0RFX0ZNX05JQ0FNMjogcCA9ICJOSUNBTS9GTSAoSSkiOyBicmVhazsKKwkJY2FzZSBNU1BfTU9ERV9BTV9OSUNBTTogcCA9ICJOSUNBTS9BTSAoTCkiOyBicmVhazsKKwkJY2FzZSBNU1BfTU9ERV9CVFNDOiBwID0gIkJUU0MiOyBicmVhazsKKwkJY2FzZSBNU1BfTU9ERV9FWFRFUk46IHAgPSAiRXh0ZXJuYWwgaW5wdXQiOyBicmVhazsKKwkJZGVmYXVsdDogcCA9ICJ1bmtub3duIjsgYnJlYWs7CisJCX0KKwkJaWYgKHN0YXRlLT5vcG1vZGUgPT0gT1BNT0RFX01BTlVBTCkgeworCQkJdjRsX2luZm8oY2xpZW50LCAiTW9kZTogICAgICVzICglcyVzKVxuIiwgcCwKKwkJCQkoc3RhdGUtPnJ4c3ViY2hhbnMgJiBWNEwyX1RVTkVSX1NVQl9TVEVSRU8pID8gInN0ZXJlbyIgOiAibW9ubyIsCisJCQkJKHN0YXRlLT5yeHN1YmNoYW5zICYgVjRMMl9UVU5FUl9TVUJfTEFORzIpID8gIiwgZHVhbCIgOiAiIik7CisJCX0gZWxzZSB7CisJCQl2NGxfaW5mbyhjbGllbnQsICJNb2RlOiAgICAgJXNcbiIsIHApOworCQkJdjRsX2luZm8oY2xpZW50LCAiU3RhbmRhcmQ6ICVzICglcyVzKVxuIiwKKwkJCQltc3Bfc3RhbmRhcmRfc3RkX25hbWUoc3RhdGUtPnN0ZCksCisJCQkJKHN0YXRlLT5yeHN1YmNoYW5zICYgVjRMMl9UVU5FUl9TVUJfU1RFUkVPKSA/ICJzdGVyZW8iIDogIm1vbm8iLAorCQkJCShzdGF0ZS0+cnhzdWJjaGFucyAmIFY0TDJfVFVORVJfU1VCX0xBTkcyKSA/ICIsIGR1YWwiIDogIiIpOworCQl9CisJCXY0bF9pbmZvKGNsaWVudCwgIkFDQjogICAgICAweCUwNHhcbiIsIHN0YXRlLT5hY2IpOworCQlicmVhazsKKwl9CisKKwlkZWZhdWx0OgorCQkvKiB1bmtub3duICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc3Bfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICogZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBpMmNfY2xpZW50LCBkZXYpOworCisJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgInN1c3BlbmRcbiIpOworCW1zcF9yZXNldChjbGllbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zcF9yZXN1bWUoc3RydWN0IGRldmljZSAqIGRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGkyY19jbGllbnQsIGRldik7CisKKwl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAicmVzdW1lXG4iKTsKKwltc3Bfd2FrZV90aHJlYWQoY2xpZW50KTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGkyY19kcml2ZXI7CisKK3N0YXRpYyBpbnQgbXNwX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlOworCWludCAoKnRocmVhZF9mdW5jKSh2b2lkICpkYXRhKSA9IE5VTEw7CisJaW50IG1zcF9oYXJkOworCWludCBtc3BfZmFtaWx5OworCWludCBtc3BfcmV2aXNpb247CisJaW50IG1zcF9wcm9kdWN0LCBtc3BfcHJvZF9oaSwgbXNwX3Byb2RfbG87CisJaW50IG1zcF9yb207CisKKwljbGllbnQgPSBrbWFsbG9jKHNpemVvZigqY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNsaWVudCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoY2xpZW50LCAwLCBzaXplb2YoKmNsaWVudCkpOworCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwljbGllbnQtPmRyaXZlciA9ICZpMmNfZHJpdmVyOworCXNucHJpbnRmKGNsaWVudC0+bmFtZSwgc2l6ZW9mKGNsaWVudC0+bmFtZSkgLSAxLCAibXNwMzQwMCIpOworCisJaWYgKG1zcF9yZXNldChjbGllbnQpID09IC0xKSB7CisJCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJtc3AzNDAwIG5vdCBmb3VuZFxuIik7CisJCWtmcmVlKGNsaWVudCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKCpzdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzdGF0ZSA9PSBOVUxMKSB7CisJCWtmcmVlKGNsaWVudCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBzdGF0ZSk7CisKKwltZW1zZXQoc3RhdGUsIDAsIHNpemVvZigqc3RhdGUpKTsKKwlzdGF0ZS0+djRsMl9zdGQgPSBWNEwyX1NURF9OVFNDOworCXN0YXRlLT52b2x1bWUgPSA1ODg4MDsJLyogMGRiIGdhaW4gKi8KKwlzdGF0ZS0+YmFsYW5jZSA9IDMyNzY4OwkvKiAwZGIgZ2FpbiAqLworCXN0YXRlLT5iYXNzID0gMzI3Njg7CisJc3RhdGUtPnRyZWJsZSA9IDMyNzY4OworCXN0YXRlLT5sb3VkbmVzcyA9IDA7CisJc3RhdGUtPmlucHV0ID0gLTE7CisJc3RhdGUtPm11dGVkID0gMDsKKwlzdGF0ZS0+aTJzX21vZGUgPSAwOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN0YXRlLT53cSk7CisKKwlzdGF0ZS0+cmV2MSA9IG1zcF9yZWFkX2RzcChjbGllbnQsIDB4MWUpOworCWlmIChzdGF0ZS0+cmV2MSAhPSAtMSkKKwkJc3RhdGUtPnJldjIgPSBtc3BfcmVhZF9kc3AoY2xpZW50LCAweDFmKTsKKwl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAicmV2MT0weCUwNHgsIHJldjI9MHglMDR4XG4iLCBzdGF0ZS0+cmV2MSwgc3RhdGUtPnJldjIpOworCWlmIChzdGF0ZS0+cmV2MSA9PSAtMSB8fCAoc3RhdGUtPnJldjEgPT0gMCAmJiBzdGF0ZS0+cmV2MiA9PSAwKSkgeworCQl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAibm90IGFuIG1zcDM0MDAgKGNhbm5vdCByZWFkIGNoaXAgdmVyc2lvbilcbiIpOworCQlrZnJlZShzdGF0ZSk7CisJCWtmcmVlKGNsaWVudCk7CisJCXJldHVybiAtMTsKKwl9CisKKwltc3Bfc2V0X2F1ZGlvKGNsaWVudCk7CisKKwltc3BfZmFtaWx5ID0gKChzdGF0ZS0+cmV2MSA+PiA0KSAmIDB4MGYpICsgMzsKKwltc3BfcHJvZHVjdCA9IChzdGF0ZS0+cmV2MiA+PiA4KSAmIDB4ZmY7CisJbXNwX3Byb2RfaGkgPSBtc3BfcHJvZHVjdCAvIDEwOworCW1zcF9wcm9kX2xvID0gbXNwX3Byb2R1Y3QgJSAxMDsKKwltc3BfcmV2aXNpb24gPSAoc3RhdGUtPnJldjEgJiAweDBmKSArICdAJzsKKwltc3BfaGFyZCA9ICgoc3RhdGUtPnJldjEgPj4gOCkgJiAweGZmKSArICdAJzsKKwltc3Bfcm9tID0gc3RhdGUtPnJldjIgJiAweDFmOworCXNucHJpbnRmKGNsaWVudC0+bmFtZSwgc2l6ZW9mKGNsaWVudC0+bmFtZSksICJNU1AlZDQlMDJkJWMtJWMlZCIsCisJCQltc3BfZmFtaWx5LCBtc3BfcHJvZHVjdCwKKwkJCW1zcF9yZXZpc2lvbiwgbXNwX2hhcmQsIG1zcF9yb20pOworCisJLyogSGFzIE5JQ0FNIHN1cHBvcnQ6IGFsbCBtc3B4NDF4IGFuZCBtc3B4NDV4IHByb2R1Y3RzIGhhdmUgTklDQU0gKi8KKwlzdGF0ZS0+aGFzX25pY2FtID0gbXNwX3Byb2RfaGkgPT0gMSB8fCBtc3BfcHJvZF9oaSA9PSA1OworCS8qIEhhcyByYWRpbyBzdXBwb3J0OiB3YXMgYWRkZWQgd2l0aCByZXZpc2lvbiBHICovCisJc3RhdGUtPmhhc19yYWRpbyA9IG1zcF9yZXZpc2lvbiA+PSAnRyc7CisJLyogSGFzIGhlYWRwaG9uZXMgb3V0cHV0OiBub3QgZm9yIHN0cmlwcGVkIGRvd24gcHJvZHVjdHMgKi8KKwlzdGF0ZS0+aGFzX2hlYWRwaG9uZXMgPSBtc3BfcHJvZF9sbyA8IDU7CisJLyogSGFzIHNjYXJ0NCBpbnB1dDogbm90IGluIHByZSBEIHJldmlzaW9ucywgbm90IGluIHN0cmlwcGVkIEQgcmV2cyAqLworCXN0YXRlLT5oYXNfc2NhcnQ0ID0gbXNwX2ZhbWlseSA+PSA0IHx8IChtc3BfcmV2aXNpb24gPj0gJ0QnICYmIG1zcF9wcm9kX2xvIDwgNSk7CisJLyogSGFzIHNjYXJ0MiBhbmQgc2NhcnQzIGlucHV0cyBhbmQgc2NhcnQyIG91dHB1dDogbm90IGluIHN0cmlwcGVkCisJICAgZG93biBwcm9kdWN0cyBvZiB0aGUgJzMnIGZhbWlseSAqLworCXN0YXRlLT5oYXNfc2NhcnQyM19pbl9zY2FydDJfb3V0ID0gbXNwX2ZhbWlseSA+PSA0IHx8IG1zcF9wcm9kX2xvIDwgNTsKKwkvKiBIYXMgc2NhcnQyIGEgdm9sdW1lIGNvbnRyb2w/IE5vdCBpbiBwcmUtRCByZXZpc2lvbnMuICovCisJc3RhdGUtPmhhc19zY2FydDJfb3V0X3ZvbHVtZSA9IG1zcF9yZXZpc2lvbiA+ICdDJyAmJiBzdGF0ZS0+aGFzX3NjYXJ0MjNfaW5fc2NhcnQyX291dDsKKwkvKiBIYXMgYSBjb25maWd1cmFibGUgaTJzIG91dD8gKi8KKwlzdGF0ZS0+aGFzX2kyc19jb25mID0gbXNwX3JldmlzaW9uID49ICdHJyAmJiBtc3BfcHJvZF9sbyA8IDc7CisJLyogSGFzIHN1Yndvb2ZlciBvdXRwdXQ6IG5vdCBpbiBwcmUtRCByZXZzIGFuZCBub3QgaW4gc3RyaXBwZWQgZG93biBwcm9kdWN0cyAqLworCXN0YXRlLT5oYXNfc3Vid29vZmVyID0gbXNwX3JldmlzaW9uID49ICdEJyAmJiBtc3BfcHJvZF9sbyA8IDU7CisJLyogSGFzIHNvdW5kcHJvY2Vzc2luZyAoYmFzcy90cmVibGUvYmFsYW5jZS9sb3VkbmVzcy9lcXVhbGl6ZXIpOiBub3QgaW4KKwkgICBzdHJpcHBlZCBkb3duIHByb2R1Y3RzICovCisJc3RhdGUtPmhhc19zb3VuZF9wcm9jZXNzaW5nID0gbXNwX3Byb2RfbG8gPCA3OworCS8qIEhhcyBWaXJ0dWFsIERvbGJ5IFN1cnJvdW5kOiBvbmx5IGluIG1zcDM0eDEgKi8KKwlzdGF0ZS0+aGFzX3ZpcnR1YWxfZG9sYnlfc3Vycm91bmQgPSBtc3BfcmV2aXNpb24gPT0gJ0cnICYmIG1zcF9wcm9kX2xvID09IDE7CisJLyogSGFzIFZpcnR1YWwgRG9sYnkgU3Vycm91bmQgJiBEb2xieSBQcm8gTG9naWM6IG9ubHkgaW4gbXNwMzR4MiAqLworCXN0YXRlLT5oYXNfZG9sYnlfcHJvX2xvZ2ljID0gbXNwX3JldmlzaW9uID09ICdHJyAmJiBtc3BfcHJvZF9sbyA9PSAyOworCisJc3RhdGUtPm9wbW9kZSA9IG9wbW9kZTsKKwlpZiAoc3RhdGUtPm9wbW9kZSA9PSBPUE1PREVfQVVUTykgeworCQkvKiBNU1AgcmV2aXNpb24gRyBhbmQgdXAgaGF2ZSBib3RoIGF1dG9kZXRlY3QgYW5kIGF1dG9zZWxlY3QgKi8KKwkJaWYgKG1zcF9yZXZpc2lvbiA+PSAnRycpCisJCQlzdGF0ZS0+b3Btb2RlID0gT1BNT0RFX0FVVE9TRUxFQ1Q7CisJCS8qIE1TUCByZXZpc2lvbiBEIGFuZCB1cCBoYXZlIGF1dG9kZXRlY3QgKi8KKwkJZWxzZSBpZiAobXNwX3JldmlzaW9uID49ICdEJykKKwkJCXN0YXRlLT5vcG1vZGUgPSBPUE1PREVfQVVUT0RFVEVDVDsKKwkJZWxzZQorCQkJc3RhdGUtPm9wbW9kZSA9IE9QTU9ERV9NQU5VQUw7CisJfQorCisJLyogaGVsbG8gd29ybGQgOi0pICovCisJdjRsX2luZm8oY2xpZW50LCAiJXMgZm91bmQgQCAweCV4ICglcylcbiIsIGNsaWVudC0+bmFtZSwgYWRkcmVzcyA8PCAxLCBhZGFwdGVyLT5uYW1lKTsKKwl2NGxfaW5mbyhjbGllbnQsICIlcyAiLCBjbGllbnQtPm5hbWUpOworCWlmIChzdGF0ZS0+aGFzX25pY2FtICYmIHN0YXRlLT5oYXNfcmFkaW8pCisJCXByaW50aygic3VwcG9ydHMgbmljYW0gYW5kIHJhZGlvLCAiKTsKKwllbHNlIGlmIChzdGF0ZS0+aGFzX25pY2FtKQorCQlwcmludGsoInN1cHBvcnRzIG5pY2FtLCAiKTsKKwllbHNlIGlmIChzdGF0ZS0+aGFzX3JhZGlvKQorCQlwcmludGsoInN1cHBvcnRzIHJhZGlvLCAiKTsKKwlwcmludGsoIm1vZGUgaXMgIik7CisKKwkvKiB2ZXJzaW9uLXNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCisJc3dpdGNoIChzdGF0ZS0+b3Btb2RlKSB7CisJY2FzZSBPUE1PREVfTUFOVUFMOgorCQlwcmludGsoIm1hbnVhbCIpOworCQl0aHJlYWRfZnVuYyA9IG1zcDM0MDBjX3RocmVhZDsKKwkJYnJlYWs7CisJY2FzZSBPUE1PREVfQVVUT0RFVEVDVDoKKwkJcHJpbnRrKCJhdXRvZGV0ZWN0Iik7CisJCXRocmVhZF9mdW5jID0gbXNwMzQxMGRfdGhyZWFkOworCQlicmVhazsKKwljYXNlIE9QTU9ERV9BVVRPU0VMRUNUOgorCQlwcmludGsoImF1dG9kZXRlY3QgYW5kIGF1dG9zZWxlY3QiKTsKKwkJdGhyZWFkX2Z1bmMgPSBtc3AzNHh4Z190aHJlYWQ7CisJCWJyZWFrOworCX0KKwlwcmludGsoIlxuIik7CisKKwkvKiBzdGFydHVwIGNvbnRyb2wgdGhyZWFkIGlmIG5lZWRlZCAqLworCWlmICh0aHJlYWRfZnVuYykgeworCQlzdGF0ZS0+a3RocmVhZCA9IGt0aHJlYWRfcnVuKHRocmVhZF9mdW5jLCBjbGllbnQsICJtc3AzNHh4Iik7CisKKwkJaWYgKHN0YXRlLT5rdGhyZWFkID09IE5VTEwpCisJCQl2NGxfd2FybihjbGllbnQsICJrZXJuZWxfdGhyZWFkKCkgZmFpbGVkXG4iKTsKKwkJbXNwX3dha2VfdGhyZWFkKGNsaWVudCk7CisJfQorCisJLyogZG9uZSAqLworCWkyY19hdHRhY2hfY2xpZW50KGNsaWVudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc3BfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmIChhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19UVl9BTkFMT0cpCisJCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgbXNwX2F0dGFjaCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNwX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGVycjsKKworCS8qIHNodXRkb3duIGNvbnRyb2wgdGhyZWFkICovCisJaWYgKHN0YXRlLT5rdGhyZWFkKSB7CisJCXN0YXRlLT5yZXN0YXJ0ID0gMTsKKwkJa3RocmVhZF9zdG9wKHN0YXRlLT5rdGhyZWFkKTsKKwl9CisJbXNwX3Jlc2V0KGNsaWVudCk7CisKKwllcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworCWlmIChlcnIpIHsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlrZnJlZShzdGF0ZSk7CisJa2ZyZWUoY2xpZW50KTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogaTJjIGltcGxlbWVudGF0aW9uICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaTJjX2RyaXZlciA9IHsKKwkuaWQgICAgICAgICAgICAgPSBJMkNfRFJJVkVSSURfTVNQMzQwMCwKKwkuYXR0YWNoX2FkYXB0ZXIgPSBtc3BfcHJvYmUsCisJLmRldGFjaF9jbGllbnQgID0gbXNwX2RldGFjaCwKKwkuY29tbWFuZCAgICAgICAgPSBtc3BfY29tbWFuZCwKKwkuZHJpdmVyID0geworCQkubmFtZSAgICA9ICJtc3AzNDAwIiwKKwkJLnN1c3BlbmQgPSBtc3Bfc3VzcGVuZCwKKwkJLnJlc3VtZSAgPSBtc3BfcmVzdW1lLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtc3AzNDAwX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZpMmNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1zcDM0MDBfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmaTJjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG1zcDM0MDBfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQobXNwMzQwMF9jbGVhbnVwX21vZHVsZSk7CisKKy8qCisgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWt0aHJlYWRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAta3RocmVhZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDcyYzNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWt0aHJlYWRzLmMKQEAgLTAsMCArMSwxMDEwIEBACisvKgorICogUHJvZ3JhbW1pbmcgdGhlIG1zcHg0eHggc291bmQgcHJvY2Vzc29yIGZhbWlseQorICoKKyAqIChjKSAxOTk3LTIwMDEgR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvY2hpcC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSAibXNwMzQwMC5oIgorCisvKiB0aGlzIG9uZSB1c2VzIHRoZSBhdXRvbWF0aWMgc291bmQgc3RhbmRhcmQgZGV0ZWN0aW9uIG9mIG5ld2VyIG1zcDM0eHgKKyAgIGNoaXAgdmVyc2lvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWludCByZXR2YWw7CisJaW50IG1haW4sIHNlY29uZDsKKwljaGFyICpuYW1lOworfSBtc3Bfc3RkbGlzdFtdID0geworCXsgMHgwMDAwLCAwLCAwLCAiY291bGQgbm90IGRldGVjdCBzb3VuZCBzdGFuZGFyZCIgfSwKKwl7IDB4MDAwMSwgMCwgMCwgImF1dG9kZXRlY3Qgc3RhcnQiIH0sCisJeyAweDAwMDIsIE1TUF9DQVJSSUVSKDQuNSksIE1TUF9DQVJSSUVSKDQuNzIpLCAiNC41LzQuNzIgIE0gRHVhbCBGTS1TdGVyZW8iIH0sCisJeyAweDAwMDMsIE1TUF9DQVJSSUVSKDUuNSksIE1TUF9DQVJSSUVSKDUuNzQyMTg3NSksICI1LjUvNS43NCAgQi9HIER1YWwgRk0tU3RlcmVvIiB9LAorCXsgMHgwMDA0LCBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig2LjI1NzgxMjUpLCAiNi41LzYuMjUgIEQvSzEgRHVhbCBGTS1TdGVyZW8iIH0sCisJeyAweDAwMDUsIE1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDYuNzQyMTg3NSksICI2LjUvNi43NCAgRC9LMiBEdWFsIEZNLVN0ZXJlbyIgfSwKKwl7IDB4MDAwNiwgTVNQX0NBUlJJRVIoNi41KSwgTVNQX0NBUlJJRVIoNi41KSwgIjYuNSAgRC9LIEZNLU1vbm8gKEhERVYzKSIgfSwKKwl7IDB4MDAwOCwgTVNQX0NBUlJJRVIoNS41KSwgTVNQX0NBUlJJRVIoNS44NSksICI1LjUvNS44NSAgQi9HIE5JQ0FNIEZNIiB9LAorCXsgMHgwMDA5LCBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig1Ljg1KSwgIjYuNS81Ljg1ICBMIE5JQ0FNIEFNIiB9LAorCXsgMHgwMDBhLCBNU1BfQ0FSUklFUig2LjApLCBNU1BfQ0FSUklFUig2LjU1KSwgIjYuMC82LjU1ICBJIE5JQ0FNIEZNIiB9LAorCXsgMHgwMDBiLCBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig1Ljg1KSwgIjYuNS81Ljg1ICBEL0sgTklDQU0gRk0iIH0sCisJeyAweDAwMGMsIE1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDUuODUpLCAiNi41LzUuODUgIEQvSyBOSUNBTSBGTSAoSERFVjIpIiB9LAorCXsgMHgwMDIwLCBNU1BfQ0FSUklFUig0LjUpLCBNU1BfQ0FSUklFUig0LjUpLCAiNC41ICBNIEJUU0MtU3RlcmVvIiB9LAorCXsgMHgwMDIxLCBNU1BfQ0FSUklFUig0LjUpLCBNU1BfQ0FSUklFUig0LjUpLCAiNC41ICBNIEJUU0MtTW9ubyArIFNBUCIgfSwKKwl7IDB4MDAzMCwgTVNQX0NBUlJJRVIoNC41KSwgTVNQX0NBUlJJRVIoNC41KSwgIjQuNSAgTSBFSUEtSiBKYXBhbiBTdGVyZW8iIH0sCisJeyAweDAwNDAsIE1TUF9DQVJSSUVSKDEwLjcpLCBNU1BfQ0FSUklFUigxMC43KSwgIjEwLjcgIEZNLVN0ZXJlbyBSYWRpbyIgfSwKKwl7IDB4MDA1MCwgTVNQX0NBUlJJRVIoNi41KSwgTVNQX0NBUlJJRVIoNi41KSwgIjYuNSAgU0FULU1vbm8iIH0sCisJeyAweDAwNTEsIE1TUF9DQVJSSUVSKDcuMDIpLCBNU1BfQ0FSUklFUig3LjIwKSwgIjcuMDIvNy4yMCAgU0FULVN0ZXJlbyIgfSwKKwl7IDB4MDA2MCwgTVNQX0NBUlJJRVIoNy4yKSwgTVNQX0NBUlJJRVIoNy4yKSwgIjcuMiAgU0FUIEFEUiIgfSwKKwl7ICAgICAtMSwgMCwgMCwgTlVMTCB9LCAvKiBFT0YgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgbXNwMzQwMGNfaW5pdF9kYXRhX2RlbSB7CisJaW50IGZpcjFbNl07CisJaW50IGZpcjJbNl07CisJaW50IGNkbzE7CisJaW50IGNkbzI7CisJaW50IGFkX2N2OworCWludCBtb2RlX3JlZzsKKwlpbnQgZHNwX3NyYzsKKwlpbnQgZHNwX21hdHJpeDsKK30gbXNwMzQwMGNfaW5pdF9kYXRhW10gPSB7CisJewkvKiBBTSAoZm9yIGNhcnJpZXIgZGV0ZWN0IC8gbXNwMzQwMCkgKi8KKwkJezc1LCAxOSwgMzYsIDM1LCAzOSwgNDB9LAorCQl7NzUsIDE5LCAzNiwgMzUsIDM5LCA0MH0sCisJCU1TUF9DQVJSSUVSKDUuNSksIE1TUF9DQVJSSUVSKDUuNSksCisJCTB4MDBkMCwgMHgwNTAwLCAweDAwMjAsIDB4MzAwMAorCX0sewkvKiBBTSAoZm9yIGNhcnJpZXIgZGV0ZWN0IC8gbXNwMzQxMCkgKi8KKwkJey0xLCAtMSwgLTgsIDIsIDU5LCAxMjZ9LAorCQl7LTEsIC0xLCAtOCwgMiwgNTksIDEyNn0sCisJCU1TUF9DQVJSSUVSKDUuNSksIE1TUF9DQVJSSUVSKDUuNSksCisJCTB4MDBkMCwgMHgwMTAwLCAweDAwMjAsIDB4MzAwMAorCX0sewkvKiBGTSBSYWRpbyAqLworCQl7LTgsIC04LCA0LCA2LCA3OCwgMTA3fSwKKwkJey04LCAtOCwgNCwgNiwgNzgsIDEwN30sCisJCU1TUF9DQVJSSUVSKDEwLjcpLCBNU1BfQ0FSUklFUigxMC43KSwKKwkJMHgwMGQwLCAweDA0ODAsIDB4MDAyMCwgMHgzMDAwCisJfSx7CS8qIFRlcnJlc3RpYWwgRk0tbW9ubyArIEZNLXN0ZXJlbyAqLworCQl7MywgMTgsIDI3LCA0OCwgNjYsIDcyfSwKKwkJezMsIDE4LCAyNywgNDgsIDY2LCA3Mn0sCisJCU1TUF9DQVJSSUVSKDUuNSksIE1TUF9DQVJSSUVSKDUuNSksCisJCTB4MDBkMCwgMHgwNDgwLCAweDAwMzAsIDB4MzAwMAorCX0sewkvKiBTYXQgRk0tbW9ubyAqLworCQl7IDEsIDksIDE0LCAyNCwgMzMsIDM3fSwKKwkJeyAzLCAxOCwgMjcsIDQ4LCA2NiwgNzJ9LAorCQlNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig2LjUpLAorCQkweDAwYzYsIDB4MDQ4MCwgMHgwMDAwLCAweDMwMDAKKwl9LHsJLyogTklDQU0vRk0gLS0gIEIvRyAoNS41LzUuODUpLCBEL0sgKDYuNS81Ljg1KSAqLworCQl7LTIsIC04LCAtMTAsIDEwLCA1MCwgODZ9LAorCQl7MywgMTgsIDI3LCA0OCwgNjYsIDcyfSwKKwkJTVNQX0NBUlJJRVIoNS41KSwgTVNQX0NBUlJJRVIoNS41KSwKKwkJMHgwMGQwLCAweDAwNDAsIDB4MDEyMCwgMHgzMDAwCisJfSx7CS8qIE5JQ0FNL0ZNIC0tIEkgKDYuMC82LjU1MikgKi8KKwkJezIsIDQsIC02LCAtNCwgNDAsIDk0fSwKKwkJezMsIDE4LCAyNywgNDgsIDY2LCA3Mn0sCisJCU1TUF9DQVJSSUVSKDYuMCksIE1TUF9DQVJSSUVSKDYuMCksCisJCTB4MDBkMCwgMHgwMDQwLCAweDAxMjAsIDB4MzAwMAorCX0sewkvKiBOSUNBTS9BTSAtLSBMICg2LjUvNS44NSkgKi8KKwkJey0yLCAtOCwgLTEwLCAxMCwgNTAsIDg2fSwKKwkJey00LCAtMTIsIC05LCAyMywgNzksIDEyNn0sCisJCU1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDYuNSksCisJCTB4MDBjNiwgMHgwMTQwLCAweDAxMjAsIDB4N2MwMworCX0sCit9OworCitzdHJ1Y3QgbXNwMzQwMGNfY2Fycmllcl9kZXRlY3QgeworCWludCAgIGNkbzsKKwljaGFyICpuYW1lOworfTsKKworc3RhdGljIHN0cnVjdCBtc3AzNDAwY19jYXJyaWVyX2RldGVjdCBtc3AzNDAwY19jYXJyaWVyX2RldGVjdF9tYWluW10gPSB7CisJLyogbWFpbiBjYXJyaWVyICovCisJeyBNU1BfQ0FSUklFUig0LjUpLCAgICAgICAgIjQuNSAgIE5UU0MiICAgICAgICAgICAgICAgICAgIH0sCisJeyBNU1BfQ0FSUklFUig1LjUpLCAgICAgICAgIjUuNSAgIFBBTCBCL0ciICAgICAgICAgICAgICAgIH0sCisJeyBNU1BfQ0FSUklFUig2LjApLCAgICAgICAgIjYuMCAgIFBBTCBJIiAgICAgICAgICAgICAgICAgIH0sCisJeyBNU1BfQ0FSUklFUig2LjUpLCAgICAgICAgIjYuNSAgIFBBTCBEL0sgKyBTQVQgKyBTRUNBTSIgIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgbXNwMzQwMGNfY2Fycmllcl9kZXRlY3QgbXNwMzQwMGNfY2Fycmllcl9kZXRlY3RfNTVbXSA9IHsKKwkvKiBQQUwgQi9HICovCisJeyBNU1BfQ0FSUklFUig1Ljc0MjE4NzUpLCAgIjUuNzQyIFBBTCBCL0cgRk0tc3RlcmVvIiAgICAgfSwKKwl7IE1TUF9DQVJSSUVSKDUuODUpLCAgICAgICAiNS44NSAgUEFMIEIvRyBOSUNBTSIgICAgICAgICB9Cit9OworCitzdGF0aWMgc3RydWN0IG1zcDM0MDBjX2NhcnJpZXJfZGV0ZWN0IG1zcDM0MDBjX2NhcnJpZXJfZGV0ZWN0XzY1W10gPSB7CisJLyogUEFMIFNBVCAvIFNFQ0FNICovCisJeyBNU1BfQ0FSUklFUig1Ljg1KSwgICAgICAgIjUuODUgIFBBTCBEL0sgKyBTRUNBTSBOSUNBTSIgfSwKKwl7IE1TUF9DQVJSSUVSKDYuMjU3ODEyNSksICAiNi4yNSAgUEFMIEQvSzEgRk0tc3RlcmVvIiB9LAorCXsgTVNQX0NBUlJJRVIoNi43NDIxODc1KSwgICI2Ljc0ICBQQUwgRC9LMiBGTS1zdGVyZW8iIH0sCisJeyBNU1BfQ0FSUklFUig3LjAyKSwgICAgICAgIjcuMDIgIFBBTCBTQVQgRk0tc3RlcmVvIHMvYiIgfSwKKwl7IE1TUF9DQVJSSUVSKDcuMjApLCAgICAgICAiNy4yMCAgUEFMIFNBVCBGTS1zdGVyZW8gcyIgICB9LAorCXsgTVNQX0NBUlJJRVIoNy4zOCksICAgICAgICI3LjM4ICBQQUwgU0FUIEZNLXN0ZXJlbyBiIiAgIH0sCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworY29uc3QgY2hhciAqbXNwX3N0YW5kYXJkX3N0ZF9uYW1lKGludCBzdGQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBtc3Bfc3RkbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwkJaWYgKG1zcF9zdGRsaXN0W2ldLnJldHZhbCA9PSBzdGQpCisJCQlyZXR1cm4gbXNwX3N0ZGxpc3RbaV0ubmFtZTsKKwlyZXR1cm4gInVua25vd24iOworfQorCit2b2lkIG1zcDM0MDBjX3NldGNhcnJpZXIoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGNkbzEsIGludCBjZG8yKQoreworCW1zcF93cml0ZV9kZW0oY2xpZW50LCAweDAwOTMsIGNkbzEgJiAweGZmZik7CisJbXNwX3dyaXRlX2RlbShjbGllbnQsIDB4MDA5YiwgY2RvMSA+PiAxMik7CisJbXNwX3dyaXRlX2RlbShjbGllbnQsIDB4MDBhMywgY2RvMiAmIDB4ZmZmKTsKKwltc3Bfd3JpdGVfZGVtKGNsaWVudCwgMHgwMGFiLCBjZG8yID4+IDEyKTsKKwltc3Bfd3JpdGVfZGVtKGNsaWVudCwgMHgwMDU2LCAwKTsgLypMT0FEX1JFR18xLzIqLworfQorCit2b2lkIG1zcDM0MDBjX3NldG1vZGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHR5cGUpCit7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgaTsKKworCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJzZXRtb2RlOiAlZFxuIiwgdHlwZSk7CisJc3RhdGUtPm1vZGUgICAgICAgPSB0eXBlOworCXN0YXRlLT5hdWRtb2RlICAgID0gVjRMMl9UVU5FUl9NT0RFX01PTk87CisJc3RhdGUtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05POworCisJbXNwX3dyaXRlX2RlbShjbGllbnQsIDB4MDBiYiwgbXNwMzQwMGNfaW5pdF9kYXRhW3R5cGVdLmFkX2N2KTsKKworCWZvciAoaSA9IDU7IGkgPj0gMDsgaS0tKSAgICAgICAgICAgICAgIC8qIGZpciAxICovCisJCW1zcF93cml0ZV9kZW0oY2xpZW50LCAweDAwMDEsIG1zcDM0MDBjX2luaXRfZGF0YVt0eXBlXS5maXIxW2ldKTsKKworCW1zcF93cml0ZV9kZW0oY2xpZW50LCAweDAwMDUsIDB4MDAwNCk7IC8qIGZpciAyICovCisJbXNwX3dyaXRlX2RlbShjbGllbnQsIDB4MDAwNSwgMHgwMDQwKTsKKwltc3Bfd3JpdGVfZGVtKGNsaWVudCwgMHgwMDA1LCAweDAwMDApOworCWZvciAoaSA9IDU7IGkgPj0gMDsgaS0tKQorCQltc3Bfd3JpdGVfZGVtKGNsaWVudCwgMHgwMDA1LCBtc3AzNDAwY19pbml0X2RhdGFbdHlwZV0uZmlyMltpXSk7CisKKwltc3Bfd3JpdGVfZGVtKGNsaWVudCwgMHgwMDgzLCBtc3AzNDAwY19pbml0X2RhdGFbdHlwZV0ubW9kZV9yZWcpOworCisJbXNwMzQwMGNfc2V0Y2FycmllcihjbGllbnQsIG1zcDM0MDBjX2luaXRfZGF0YVt0eXBlXS5jZG8xLAorCQkJICAgIG1zcDM0MDBjX2luaXRfZGF0YVt0eXBlXS5jZG8yKTsKKworCW1zcF93cml0ZV9kZW0oY2xpZW50LCAweDAwNTYsIDApOyAvKkxPQURfUkVHXzEvMiovCisKKwlpZiAobXNwX2RvbGJ5KSB7CisJCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDAwMDgsIDB4MDUyMCk7IC8qIEkyUzEgKi8KKwkJbXNwX3dyaXRlX2RzcChjbGllbnQsIDB4MDAwOSwgMHgwNjIwKTsgLyogSTJTMiAqLworCQltc3Bfd3JpdGVfZHNwKGNsaWVudCwgMHgwMDBiLCBtc3AzNDAwY19pbml0X2RhdGFbdHlwZV0uZHNwX3NyYyk7CisJfSBlbHNlIHsKKwkJbXNwX3dyaXRlX2RzcChjbGllbnQsIDB4MDAwOCwgbXNwMzQwMGNfaW5pdF9kYXRhW3R5cGVdLmRzcF9zcmMpOworCQltc3Bfd3JpdGVfZHNwKGNsaWVudCwgMHgwMDA5LCBtc3AzNDAwY19pbml0X2RhdGFbdHlwZV0uZHNwX3NyYyk7CisJCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDAwMGIsIG1zcDM0MDBjX2luaXRfZGF0YVt0eXBlXS5kc3Bfc3JjKTsKKwl9CisJbXNwX3dyaXRlX2RzcChjbGllbnQsIDB4MDAwYSwgbXNwMzQwMGNfaW5pdF9kYXRhW3R5cGVdLmRzcF9zcmMpOworCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDAwMGUsIG1zcDM0MDBjX2luaXRfZGF0YVt0eXBlXS5kc3BfbWF0cml4KTsKKworCWlmIChzdGF0ZS0+aGFzX25pY2FtKSB7CisJCS8qIG5pY2FtIHByZXNjYWxlICovCisJCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDAwMTAsIDB4NWEwMCk7IC8qIHdhczogMHgzMDAwICovCisJfQorfQorCisvKiB0dXJuIG9uL29mZiBuaWNhbSArIHN0ZXJlbyAqLwordm9pZCBtc3AzNDAwY19zZXRzdGVyZW8oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IG1vZGUpCit7CisJc3RhdGljIGNoYXIgKnN0cm1vZGVbXSA9IHsgIm1vbm8iLCAic3RlcmVvIiwgImxhbmcyIiwgImxhbmcxIiB9OworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IG5pY2FtID0gMDsJCS8qIGNoYW5uZWwgc291cmNlOiBGTS9BTSBvciBuaWNhbSAqLworCWludCBzcmMgPSAwOworCisJaWYgKHN0YXRlLT5vcG1vZGUgPT0gT1BNT0RFX0FVVE9TRUxFQ1QpIHsKKwkJLyogdGhpcyBtZXRob2Qgd291bGQgYnJlYWsgZXZlcnl0aGluZywgbGV0J3MgbWFrZSBzdXJlCisJCSAqIGl0J3MgbmV2ZXIgY2FsbGVkCisJCSAqLworCQl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAic2V0c3RlcmVvIGNhbGxlZCB3aXRoIG1vZGU9JWQgaW5zdGVhZCBvZiBzZXRfc291cmNlIChpZ25vcmVkKVxuIiwKKwkJICAgICBtb2RlKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHN3aXRjaCBkZW1vZHVsYXRvciAqLworCXN3aXRjaCAoc3RhdGUtPm1vZGUpIHsKKwljYXNlIE1TUF9NT0RFX0ZNX1RFUlJBOgorCQl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAiRk0gc2V0c3RlcmVvOiAlc1xuIiwgc3RybW9kZVttb2RlXSk7CisJCW1zcDM0MDBjX3NldGNhcnJpZXIoY2xpZW50LCBzdGF0ZS0+c2Vjb25kLCBzdGF0ZS0+bWFpbik7CisJCXN3aXRjaCAobW9kZSkgeworCQljYXNlIFY0TDJfVFVORVJfTU9ERV9TVEVSRU86CisJCQltc3Bfd3JpdGVfZHNwKGNsaWVudCwgMHgwMDBlLCAweDMwMDEpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX01PTk86CisJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcxOgorCQljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMjoKKwkJCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDAwMGUsIDB4MzAwMCk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIE1TUF9NT0RFX0ZNX1NBVDoKKwkJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgIlNBVCBzZXRzdGVyZW86ICVzXG4iLCBzdHJtb2RlW21vZGVdKTsKKwkJc3dpdGNoIChtb2RlKSB7CisJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX01PTk86CisJCQltc3AzNDAwY19zZXRjYXJyaWVyKGNsaWVudCwgTVNQX0NBUlJJRVIoNi41KSwgTVNQX0NBUlJJRVIoNi41KSk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOgorCQkJbXNwMzQwMGNfc2V0Y2FycmllcihjbGllbnQsIE1TUF9DQVJSSUVSKDcuMiksIE1TUF9DQVJSSUVSKDcuMDIpKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMToKKwkJCW1zcDM0MDBjX3NldGNhcnJpZXIoY2xpZW50LCBNU1BfQ0FSUklFUig3LjM4KSwgTVNQX0NBUlJJRVIoNy4wMikpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcyOgorCQkJbXNwMzQwMGNfc2V0Y2FycmllcihjbGllbnQsIE1TUF9DQVJSSUVSKDcuMzgpLCBNU1BfQ0FSUklFUig3LjAyKSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIE1TUF9NT0RFX0ZNX05JQ0FNMToKKwljYXNlIE1TUF9NT0RFX0ZNX05JQ0FNMjoKKwljYXNlIE1TUF9NT0RFX0FNX05JQ0FNOgorCQl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAiTklDQU0gc2V0c3RlcmVvOiAlc1xuIixzdHJtb2RlW21vZGVdKTsKKwkJbXNwMzQwMGNfc2V0Y2FycmllcihjbGllbnQsc3RhdGUtPnNlY29uZCxzdGF0ZS0+bWFpbik7CisJCWlmIChzdGF0ZS0+bmljYW1fb24pCisJCQluaWNhbT0weDAxMDA7CisJCWJyZWFrOworCWNhc2UgTVNQX01PREVfQlRTQzoKKwkJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgIkJUU0Mgc2V0c3RlcmVvOiAlc1xuIixzdHJtb2RlW21vZGVdKTsKKwkJbmljYW09MHgwMzAwOworCQlicmVhazsKKwljYXNlIE1TUF9NT0RFX0VYVEVSTjoKKwkJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgImV4dGVybiBzZXRzdGVyZW86ICVzXG4iLHN0cm1vZGVbbW9kZV0pOworCQluaWNhbSA9IDB4MDIwMDsKKwkJYnJlYWs7CisJY2FzZSBNU1BfTU9ERV9GTV9SQURJTzoKKwkJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgIkZNLVJhZGlvIHNldHN0ZXJlbzogJXNcbiIsc3RybW9kZVttb2RlXSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJtb25vIHNldHN0ZXJlb1xuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBzd2l0Y2ggYXVkaW8gKi8KKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIFY0TDJfVFVORVJfTU9ERV9TVEVSRU86CisJCXNyYyA9IDB4MDAyMCB8IG5pY2FtOworCQlicmVhazsKKwljYXNlIFY0TDJfVFVORVJfTU9ERV9NT05POgorCQlpZiAoc3RhdGUtPm1vZGUgPT0gTVNQX01PREVfQU1fTklDQU0pIHsKKwkJCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJzd2l0Y2hpbmcgdG8gQU0gbW9ub1xuIik7CisJCQkvKiBBTSBtb25vIGRlY29kaW5nIGlzIGhhbmRsZWQgYnkgdHVuZXIsIG5vdCBNU1AgY2hpcCAqLworCQkJLyogU0NBUlQgc3dpdGNoaW5nIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkJCW1zcF9zZXRfc2NhcnQoY2xpZW50LCBTQ0FSVF9NT05PLCAwKTsKKwkJCXNyYyA9IDB4MDIwMDsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzE6CisJCXNyYyA9IDB4MDAwMCB8IG5pY2FtOworCQlicmVhazsKKwljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMjoKKwkJc3JjID0gMHgwMDEwIHwgbmljYW07CisJCWJyZWFrOworCX0KKwl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAic2V0c3RlcmVvIGZpbmFsIHNvdXJjZS9tYXRyaXggPSAweCV4XG4iLCBzcmMpOworCisJaWYgKG1zcF9kb2xieSkgeworCQltc3Bfd3JpdGVfZHNwKGNsaWVudCwgMHgwMDA4LCAweDA1MjApOworCQltc3Bfd3JpdGVfZHNwKGNsaWVudCwgMHgwMDA5LCAweDA2MjApOworCQltc3Bfd3JpdGVfZHNwKGNsaWVudCwgMHgwMDBhLCBzcmMpOworCQltc3Bfd3JpdGVfZHNwKGNsaWVudCwgMHgwMDBiLCBzcmMpOworCX0gZWxzZSB7CisJCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDAwMDgsIHNyYyk7CisJCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDAwMDksIHNyYyk7CisJCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDAwMGEsIHNyYyk7CisJCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDAwMGIsIHNyYyk7CisJCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDAwMGMsIHNyYyk7CisJCWlmIChzdGF0ZS0+aGFzX3NjYXJ0MjNfaW5fc2NhcnQyX291dCkKKwkJCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDAwNDEsIHNyYyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBtc3AzNDAwY19wcmludF9tb2RlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlmIChzdGF0ZS0+bWFpbiA9PSBzdGF0ZS0+c2Vjb25kKSB7CisJCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJtb25vIHNvdW5kIGNhcnJpZXI6ICVkLiUwM2QgTUh6XG4iLAorCQkgICAgICAgc3RhdGUtPm1haW4gLyA5MTAwMDAsIChzdGF0ZS0+bWFpbiAvIDkxMCkgJSAxMDAwKTsKKwl9IGVsc2UgeworCQl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAibWFpbiBzb3VuZCBjYXJyaWVyOiAlZC4lMDNkIE1IelxuIiwKKwkJICAgICAgIHN0YXRlLT5tYWluIC8gOTEwMDAwLCAoc3RhdGUtPm1haW4gLyA5MTApICUgMTAwMCk7CisJfQorCWlmIChzdGF0ZS0+bW9kZSA9PSBNU1BfTU9ERV9GTV9OSUNBTTEgfHwgc3RhdGUtPm1vZGUgPT0gTVNQX01PREVfRk1fTklDQU0yKQorCQl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAiTklDQU0vRk0gY2FycmllciAgOiAlZC4lMDNkIE1IelxuIiwKKwkJICAgICAgIHN0YXRlLT5zZWNvbmQgLyA5MTAwMDAsIChzdGF0ZS0+c2Vjb25kLzkxMCkgJSAxMDAwKTsKKwlpZiAoc3RhdGUtPm1vZGUgPT0gTVNQX01PREVfQU1fTklDQU0pCisJCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJOSUNBTS9BTSBjYXJyaWVyICA6ICVkLiUwM2QgTUh6XG4iLAorCQkgICAgICAgc3RhdGUtPnNlY29uZCAvIDkxMDAwMCwgKHN0YXRlLT5zZWNvbmQgLyA5MTApICUgMTAwMCk7CisJaWYgKHN0YXRlLT5tb2RlID09IE1TUF9NT0RFX0ZNX1RFUlJBICYmIHN0YXRlLT5tYWluICE9IHN0YXRlLT5zZWNvbmQpIHsKKwkJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgIkZNLXN0ZXJlbyBjYXJyaWVyIDogJWQuJTAzZCBNSHpcbiIsCisJCSAgICAgICBzdGF0ZS0+c2Vjb25kIC8gOTEwMDAwLCAoc3RhdGUtPnNlY29uZCAvIDkxMCkgJSAxMDAwKTsKKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludCBhdXRvZGV0ZWN0X3N0ZXJlbyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbDsKKwlpbnQgcnhzdWJjaGFucyA9IHN0YXRlLT5yeHN1YmNoYW5zOworCWludCBuZXduaWNhbSAgID0gc3RhdGUtPm5pY2FtX29uOworCWludCB1cGRhdGUgPSAwOworCisJc3dpdGNoIChzdGF0ZS0+bW9kZSkgeworCWNhc2UgTVNQX01PREVfRk1fVEVSUkE6CisJCXZhbCA9IG1zcF9yZWFkX2RzcChjbGllbnQsIDB4MTgpOworCQlpZiAodmFsID4gMzI3NjcpCisJCQl2YWwgLT0gNjU1MzY7CisJCXY0bF9kYmcoMiwgbXNwX2RlYnVnLCBjbGllbnQsICJzdGVyZW8gZGV0ZWN0IHJlZ2lzdGVyOiAlZFxuIiwgdmFsKTsKKwkJaWYgKHZhbCA+IDQwOTYpIHsKKwkJCXJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9TVEVSRU8gfCBWNEwyX1RVTkVSX1NVQl9NT05POworCQl9IGVsc2UgaWYgKHZhbCA8IC00MDk2KSB7CisJCQlyeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTEFORzEgfCBWNEwyX1RVTkVSX1NVQl9MQU5HMjsKKwkJfSBlbHNlIHsKKwkJCXJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05POworCQl9CisJCW5ld25pY2FtID0gMDsKKwkJYnJlYWs7CisJY2FzZSBNU1BfTU9ERV9GTV9OSUNBTTE6CisJY2FzZSBNU1BfTU9ERV9GTV9OSUNBTTI6CisJY2FzZSBNU1BfTU9ERV9BTV9OSUNBTToKKwkJdmFsID0gbXNwX3JlYWRfZGVtKGNsaWVudCwgMHgyMyk7CisJCXY0bF9kYmcoMiwgbXNwX2RlYnVnLCBjbGllbnQsICJuaWNhbSBzeW5jPSVkLCBtb2RlPSVkXG4iLAorCQkJdmFsICYgMSwgKHZhbCAmIDB4MWUpID4+IDEpOworCisJCWlmICh2YWwgJiAxKSB7CisJCQkvKiBuaWNhbSBzeW5jZWQgKi8KKwkJCXN3aXRjaCAoKHZhbCAmIDB4MWUpID4+IDEpICB7CisJCQljYXNlIDA6CisJCQljYXNlIDg6CisJCQkJcnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCWNhc2UgOToKKwkJCQlyeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTworCQkJCQl8IFY0TDJfVFVORVJfU1VCX0xBTkcxOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJY2FzZSAxMDoKKwkJCQlyeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTworCQkJCQl8IFY0TDJfVFVORVJfU1VCX0xBTkcxCisJCQkJCXwgVjRMMl9UVU5FUl9TVUJfTEFORzI7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05POworCQkJCWJyZWFrOworCQkJfQorCQkJbmV3bmljYW0gPSAxOworCQl9IGVsc2UgeworCQkJbmV3bmljYW0gPSAwOworCQkJcnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX01PTk87CisJCX0KKwkJYnJlYWs7CisJY2FzZSBNU1BfTU9ERV9CVFNDOgorCQl2YWwgPSBtc3BfcmVhZF9kZW0oY2xpZW50LCAweDIwMCk7CisJCXY0bF9kYmcoMiwgbXNwX2RlYnVnLCBjbGllbnQsICJzdGF0dXM9MHgleCAocHJpPSVzLCBzZWM9JXMsICVzJXMlcylcbiIsCisJCQl2YWwsCisJCQkodmFsICYgMHgwMDAyKSA/ICJubyIgICAgIDogInllcyIsCisJCQkodmFsICYgMHgwMDA0KSA/ICJubyIgICAgIDogInllcyIsCisJCQkodmFsICYgMHgwMDQwKSA/ICJzdGVyZW8iIDogIm1vbm8iLAorCQkJKHZhbCAmIDB4MDA4MCkgPyAiLCBuaWNhbSAybmQgbW9ubyIgOiAiIiwKKwkJCSh2YWwgJiAweDAxMDApID8gIiwgYmlsaW5ndWFsL1NBUCIgIDogIiIpOworCQlyeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwkJaWYgKHZhbCAmIDB4MDA0MCkgcnhzdWJjaGFucyB8PSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87CisJCWlmICh2YWwgJiAweDAxMDApIHJ4c3ViY2hhbnMgfD0gVjRMMl9UVU5FUl9TVUJfTEFORzE7CisJCWJyZWFrOworCX0KKwlpZiAocnhzdWJjaGFucyAhPSBzdGF0ZS0+cnhzdWJjaGFucykgeworCQl1cGRhdGUgPSAxOworCQl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAid2F0Y2g6IHJ4c3ViY2hhbnMgJWQgPT4gJWRcbiIsCisJCQlzdGF0ZS0+cnhzdWJjaGFucyxyeHN1YmNoYW5zKTsKKwkJc3RhdGUtPnJ4c3ViY2hhbnMgPSByeHN1YmNoYW5zOworCX0KKwlpZiAobmV3bmljYW0gIT0gc3RhdGUtPm5pY2FtX29uKSB7CisJCXVwZGF0ZSA9IDE7CisJCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJ3YXRjaDogbmljYW0gJWQgPT4gJWRcbiIsCisJCQlzdGF0ZS0+bmljYW1fb24sbmV3bmljYW0pOworCQlzdGF0ZS0+bmljYW1fb24gPSBuZXduaWNhbTsKKwl9CisJcmV0dXJuIHVwZGF0ZTsKK30KKworLyoKKyAqIEEga2VybmVsIHRocmVhZCBmb3IgbXNwMzQwMCBjb250cm9sIC0tIHdlIGRvbid0IHdhbnQgdG8gYmxvY2sgdGhlCisgKiBpbiB0aGUgaW9jdGwgd2hpbGUgZG9pbmcgdGhlIHNvdW5kIGNhcnJpZXIgJiBzdGVyZW8gZGV0ZWN0CisgKi8KKy8qIHN0ZXJlby9tdWx0aWxhbmcgbW9uaXRvcmluZyAqLworc3RhdGljIHZvaWQgd2F0Y2hfc3RlcmVvKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlmIChhdXRvZGV0ZWN0X3N0ZXJlbyhjbGllbnQpKSB7CisJCWlmIChzdGF0ZS0+cnhzdWJjaGFucyAmIFY0TDJfVFVORVJfU1VCX1NURVJFTykKKwkJCW1zcDM0MDBjX3NldHN0ZXJlbyhjbGllbnQsIFY0TDJfVFVORVJfTU9ERV9TVEVSRU8pOworCQllbHNlIGlmIChzdGF0ZS0+cnhzdWJjaGFucyAmIFY0TDJfVFVORVJfU1VCX0xBTkcxKQorCQkJbXNwMzQwMGNfc2V0c3RlcmVvKGNsaWVudCwgVjRMMl9UVU5FUl9NT0RFX0xBTkcxKTsKKwkJZWxzZQorCQkJbXNwMzQwMGNfc2V0c3RlcmVvKGNsaWVudCwgVjRMMl9UVU5FUl9NT0RFX01PTk8pOworCX0KKworCWlmIChtc3Bfb25jZSkKKwkJc3RhdGUtPndhdGNoX3N0ZXJlbyA9IDA7Cit9CisKK2ludCBtc3AzNDAwY190aHJlYWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YTsKKwlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtc3AzNDAwY19jYXJyaWVyX2RldGVjdCAqY2Q7CisJaW50IGNvdW50LCBtYXgxLG1heDIsdmFsMSx2YWwyLCB2YWwsdGhpczsKKworCisJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgIm1zcDM0MDAgZGFlbW9uIHN0YXJ0ZWRcbiIpOworCWZvciAoOzspIHsKKwkJdjRsX2RiZygyLCBtc3BfZGVidWcsIGNsaWVudCwgIm1zcDM0MDAgdGhyZWFkOiBzbGVlcFxuIik7CisJCW1zcF9zbGVlcChzdGF0ZSwgLTEpOworCQl2NGxfZGJnKDIsIG1zcF9kZWJ1ZywgY2xpZW50LCAibXNwMzQwMCB0aHJlYWQ6IHdha2V1cFxuIik7CisKKwlyZXN0YXJ0OgorCQl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAidGhyZWFkOiByZXN0YXJ0IHNjYW5cbiIpOworCQlzdGF0ZS0+cmVzdGFydCA9IDA7CisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJCQlicmVhazsKKworCQlpZiAoc3RhdGUtPnJhZGlvIHx8IE1TUF9NT0RFX0VYVEVSTiA9PSBzdGF0ZS0+bW9kZSkgeworCQkJLyogbm8gY2FycmllciBzY2FuLCBqdXN0IHVubXV0ZSAqLworCQkJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgInRocmVhZDogbm8gY2FycmllciBzY2FuXG4iKTsKKwkJCW1zcF9zZXRfYXVkaW8oY2xpZW50KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogbXV0ZSAqLworCQltc3Bfc2V0X211dGUoY2xpZW50KTsKKwkJbXNwMzQwMGNfc2V0bW9kZShjbGllbnQsIE1TUF9NT0RFX0FNX0RFVEVDVCAvKiArMSAqLyApOworCQl2YWwxID0gdmFsMiA9IDA7CisJCW1heDEgPSBtYXgyID0gLTE7CisJCXN0YXRlLT53YXRjaF9zdGVyZW8gPSAwOworCisJCS8qIHNvbWUgdGltZSBmb3IgdGhlIHR1bmVyIHRvIHN5bmMgKi8KKwkJaWYgKG1zcF9zbGVlcChzdGF0ZSwyMDApKQorCQkJZ290byByZXN0YXJ0OworCisJCS8qIGNhcnJpZXIgZGV0ZWN0IHBhc3MgIzEgLS0gbWFpbiBjYXJyaWVyICovCisJCWNkID0gbXNwMzQwMGNfY2Fycmllcl9kZXRlY3RfbWFpbjsKKwkJY291bnQgPSBBUlJBWV9TSVpFKG1zcDM0MDBjX2NhcnJpZXJfZGV0ZWN0X21haW4pOworCisJCWlmIChtc3BfYW1zb3VuZCAmJiAoc3RhdGUtPnY0bDJfc3RkICYgVjRMMl9TVERfU0VDQU0pKSB7CisJCQkvKiBhdXRvZGV0ZWN0IGRvZXNuJ3Qgd29yayB3ZWxsIHdpdGggQU0gLi4uICovCisJCQltYXgxID0gMzsKKwkJCWNvdW50ID0gMDsKKwkJCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJBTSBzb3VuZCBvdmVycmlkZVxuIik7CisJCX0KKworCQlmb3IgKHRoaXMgPSAwOyB0aGlzIDwgY291bnQ7IHRoaXMrKykgeworCQkJbXNwMzQwMGNfc2V0Y2FycmllcihjbGllbnQsIGNkW3RoaXNdLmNkbyxjZFt0aGlzXS5jZG8pOworCQkJaWYgKG1zcF9zbGVlcChzdGF0ZSwxMDApKQorCQkJCWdvdG8gcmVzdGFydDsKKwkJCXZhbCA9IG1zcF9yZWFkX2RzcChjbGllbnQsIDB4MWIpOworCQkJaWYgKHZhbCA+IDMyNzY3KQorCQkJCXZhbCAtPSA2NTUzNjsKKwkJCWlmICh2YWwxIDwgdmFsKQorCQkJCXZhbDEgPSB2YWwsIG1heDEgPSB0aGlzOworCQkJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgImNhcnJpZXIxIHZhbDogJTVkIC8gJXNcbiIsIHZhbCxjZFt0aGlzXS5uYW1lKTsKKwkJfQorCisJCS8qIGNhcnJpZXIgZGV0ZWN0IHBhc3MgIzIgLS0gc2Vjb25kIChzdGVyZW8pIGNhcnJpZXIgKi8KKwkJc3dpdGNoIChtYXgxKSB7CisJCWNhc2UgMTogLyogNS41ICovCisJCQljZCA9IG1zcDM0MDBjX2NhcnJpZXJfZGV0ZWN0XzU1OworCQkJY291bnQgPSBBUlJBWV9TSVpFKG1zcDM0MDBjX2NhcnJpZXJfZGV0ZWN0XzU1KTsKKwkJCWJyZWFrOworCQljYXNlIDM6IC8qIDYuNSAqLworCQkJY2QgPSBtc3AzNDAwY19jYXJyaWVyX2RldGVjdF82NTsKKwkJCWNvdW50ID0gQVJSQVlfU0laRShtc3AzNDAwY19jYXJyaWVyX2RldGVjdF82NSk7CisJCQlicmVhazsKKwkJY2FzZSAwOiAvKiA0LjUgKi8KKwkJY2FzZSAyOiAvKiA2LjAgKi8KKwkJZGVmYXVsdDoKKwkJCWNkID0gTlVMTDsKKwkJCWNvdW50ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG1zcF9hbXNvdW5kICYmIChzdGF0ZS0+djRsMl9zdGQgJiBWNEwyX1NURF9TRUNBTSkpIHsKKwkJCS8qIGF1dG9kZXRlY3QgZG9lc24ndCB3b3JrIHdlbGwgd2l0aCBBTSAuLi4gKi8KKwkJCWNkID0gTlVMTDsKKwkJCWNvdW50ID0gMDsKKwkJCW1heDIgPSAwOworCQl9CisJCWZvciAodGhpcyA9IDA7IHRoaXMgPCBjb3VudDsgdGhpcysrKSB7CisJCQltc3AzNDAwY19zZXRjYXJyaWVyKGNsaWVudCwgY2RbdGhpc10uY2RvLGNkW3RoaXNdLmNkbyk7CisJCQlpZiAobXNwX3NsZWVwKHN0YXRlLDEwMCkpCisJCQkJZ290byByZXN0YXJ0OworCQkJdmFsID0gbXNwX3JlYWRfZHNwKGNsaWVudCwgMHgxYik7CisJCQlpZiAodmFsID4gMzI3NjcpCisJCQkJdmFsIC09IDY1NTM2OworCQkJaWYgKHZhbDIgPCB2YWwpCisJCQkJdmFsMiA9IHZhbCwgbWF4MiA9IHRoaXM7CisJCQl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAiY2FycmllcjIgdmFsOiAlNWQgLyAlc1xuIiwgdmFsLGNkW3RoaXNdLm5hbWUpOworCQl9CisKKwkJLyogcHJvZ3JhbSB0aGUgbXNwMzQwMCBhY2NvcmRpbmcgdG8gdGhlIHJlc3VsdHMgKi8KKwkJc3RhdGUtPm1haW4gICA9IG1zcDM0MDBjX2NhcnJpZXJfZGV0ZWN0X21haW5bbWF4MV0uY2RvOworCQlzd2l0Y2ggKG1heDEpIHsKKwkJY2FzZSAxOiAvKiA1LjUgKi8KKwkJCWlmIChtYXgyID09IDApIHsKKwkJCQkvKiBCL0cgRk0tc3RlcmVvICovCisJCQkJc3RhdGUtPnNlY29uZCA9IG1zcDM0MDBjX2NhcnJpZXJfZGV0ZWN0XzU1W21heDJdLmNkbzsKKwkJCQltc3AzNDAwY19zZXRtb2RlKGNsaWVudCwgTVNQX01PREVfRk1fVEVSUkEpOworCQkJCXN0YXRlLT5uaWNhbV9vbiA9IDA7CisJCQkJbXNwMzQwMGNfc2V0c3RlcmVvKGNsaWVudCwgVjRMMl9UVU5FUl9NT0RFX01PTk8pOworCQkJCXN0YXRlLT53YXRjaF9zdGVyZW8gPSAxOworCQkJfSBlbHNlIGlmIChtYXgyID09IDEgJiYgc3RhdGUtPmhhc19uaWNhbSkgeworCQkJCS8qIEIvRyBOSUNBTSAqLworCQkJCXN0YXRlLT5zZWNvbmQgPSBtc3AzNDAwY19jYXJyaWVyX2RldGVjdF81NVttYXgyXS5jZG87CisJCQkJbXNwMzQwMGNfc2V0bW9kZShjbGllbnQsIE1TUF9NT0RFX0ZNX05JQ0FNMSk7CisJCQkJc3RhdGUtPm5pY2FtX29uID0gMTsKKwkJCQltc3AzNDAwY19zZXRjYXJyaWVyKGNsaWVudCwgc3RhdGUtPnNlY29uZCwgc3RhdGUtPm1haW4pOworCQkJCXN0YXRlLT53YXRjaF9zdGVyZW8gPSAxOworCQkJfSBlbHNlIHsKKwkJCQlnb3RvIG5vX3NlY29uZDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDI6IC8qIDYuMCAqLworCQkJLyogUEFMIEkgTklDQU0gKi8KKwkJCXN0YXRlLT5zZWNvbmQgPSBNU1BfQ0FSUklFUig2LjU1Mik7CisJCQltc3AzNDAwY19zZXRtb2RlKGNsaWVudCwgTVNQX01PREVfRk1fTklDQU0yKTsKKwkJCXN0YXRlLT5uaWNhbV9vbiA9IDE7CisJCQltc3AzNDAwY19zZXRjYXJyaWVyKGNsaWVudCwgc3RhdGUtPnNlY29uZCwgc3RhdGUtPm1haW4pOworCQkJc3RhdGUtPndhdGNoX3N0ZXJlbyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAzOiAvKiA2LjUgKi8KKwkJCWlmIChtYXgyID09IDEgfHwgbWF4MiA9PSAyKSB7CisJCQkJLyogRC9LIEZNLXN0ZXJlbyAqLworCQkJCXN0YXRlLT5zZWNvbmQgPSBtc3AzNDAwY19jYXJyaWVyX2RldGVjdF82NVttYXgyXS5jZG87CisJCQkJbXNwMzQwMGNfc2V0bW9kZShjbGllbnQsIE1TUF9NT0RFX0ZNX1RFUlJBKTsKKwkJCQlzdGF0ZS0+bmljYW1fb24gPSAwOworCQkJCW1zcDM0MDBjX3NldHN0ZXJlbyhjbGllbnQsIFY0TDJfVFVORVJfTU9ERV9NT05PKTsKKwkJCQlzdGF0ZS0+d2F0Y2hfc3RlcmVvID0gMTsKKwkJCX0gZWxzZSBpZiAobWF4MiA9PSAwICYmIChzdGF0ZS0+djRsMl9zdGQgJiBWNEwyX1NURF9TRUNBTSkpIHsKKwkJCQkvKiBMIE5JQ0FNIG9yIEFNLW1vbm8gKi8KKwkJCQlzdGF0ZS0+c2Vjb25kID0gbXNwMzQwMGNfY2Fycmllcl9kZXRlY3RfNjVbbWF4Ml0uY2RvOworCQkJCW1zcDM0MDBjX3NldG1vZGUoY2xpZW50LCBNU1BfTU9ERV9BTV9OSUNBTSk7CisJCQkJc3RhdGUtPm5pY2FtX29uID0gMDsKKwkJCQltc3AzNDAwY19zZXRzdGVyZW8oY2xpZW50LCBWNEwyX1RVTkVSX01PREVfTU9OTyk7CisJCQkJbXNwMzQwMGNfc2V0Y2FycmllcihjbGllbnQsIHN0YXRlLT5zZWNvbmQsIHN0YXRlLT5tYWluKTsKKwkJCQkvKiB2b2x1bWUgcHJlc2NhbGUgZm9yIFNDQVJUIChBTSBtb25vIGlucHV0KSAqLworCQkJCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDAwMGQsIDB4MTkwMCk7CisJCQkJc3RhdGUtPndhdGNoX3N0ZXJlbyA9IDE7CisJCQl9IGVsc2UgaWYgKG1heDIgPT0gMCAmJiBzdGF0ZS0+aGFzX25pY2FtKSB7CisJCQkJLyogRC9LIE5JQ0FNICovCisJCQkJc3RhdGUtPnNlY29uZCA9IG1zcDM0MDBjX2NhcnJpZXJfZGV0ZWN0XzY1W21heDJdLmNkbzsKKwkJCQltc3AzNDAwY19zZXRtb2RlKGNsaWVudCwgTVNQX01PREVfRk1fTklDQU0xKTsKKwkJCQlzdGF0ZS0+bmljYW1fb24gPSAxOworCQkJCW1zcDM0MDBjX3NldGNhcnJpZXIoY2xpZW50LCBzdGF0ZS0+c2Vjb25kLCBzdGF0ZS0+bWFpbik7CisJCQkJc3RhdGUtPndhdGNoX3N0ZXJlbyA9IDE7CisJCQl9IGVsc2UgeworCQkJCWdvdG8gbm9fc2Vjb25kOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMDogLyogNC41ICovCisJCWRlZmF1bHQ6CisJCW5vX3NlY29uZDoKKwkJCXN0YXRlLT5zZWNvbmQgPSBtc3AzNDAwY19jYXJyaWVyX2RldGVjdF9tYWluW21heDFdLmNkbzsKKwkJCW1zcDM0MDBjX3NldG1vZGUoY2xpZW50LCBNU1BfTU9ERV9GTV9URVJSQSk7CisJCQlzdGF0ZS0+bmljYW1fb24gPSAwOworCQkJbXNwMzQwMGNfc2V0Y2FycmllcihjbGllbnQsIHN0YXRlLT5zZWNvbmQsIHN0YXRlLT5tYWluKTsKKwkJCXN0YXRlLT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwkJCW1zcDM0MDBjX3NldHN0ZXJlbyhjbGllbnQsIFY0TDJfVFVORVJfTU9ERV9NT05PKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogdW5tdXRlICovCisJCW1zcF9zZXRfYXVkaW8oY2xpZW50KTsKKworCQlpZiAobXNwX2RlYnVnKQorCQkJbXNwMzQwMGNfcHJpbnRfbW9kZShjbGllbnQpOworCisJCS8qIG1vbml0b3IgdHYgYXVkaW8gbW9kZSAqLworCQl3aGlsZSAoc3RhdGUtPndhdGNoX3N0ZXJlbykgeworCQkJaWYgKG1zcF9zbGVlcChzdGF0ZSw1MDAwKSkKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQl3YXRjaF9zdGVyZW8oY2xpZW50KTsKKwkJfQorCX0KKwl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAidGhyZWFkOiBleGl0XG4iKTsKKwlyZXR1cm4gMDsKK30KKworCitpbnQgbXNwMzQxMGRfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGE7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsLCBpLCBzdGQ7CisKKwl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAibXNwMzQxMCBkYWVtb24gc3RhcnRlZFxuIik7CisKKwlmb3IgKDs7KSB7CisJCXY0bF9kYmcoMiwgbXNwX2RlYnVnLCBjbGllbnQsICJtc3AzNDEwIHRocmVhZDogc2xlZXBcbiIpOworCQltc3Bfc2xlZXAoc3RhdGUsLTEpOworCQl2NGxfZGJnKDIsIG1zcF9kZWJ1ZywgY2xpZW50LCAibXNwMzQxMCB0aHJlYWQ6IHdha2V1cFxuIik7CisKKwlyZXN0YXJ0OgorCQl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAidGhyZWFkOiByZXN0YXJ0IHNjYW5cbiIpOworCQlzdGF0ZS0+cmVzdGFydCA9IDA7CisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJCQlicmVhazsKKworCQlpZiAoc3RhdGUtPm1vZGUgPT0gTVNQX01PREVfRVhURVJOKSB7CisJCQkvKiBubyBjYXJyaWVyIHNjYW4gbmVlZGVkLCBqdXN0IHVubXV0ZSAqLworCQkJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgInRocmVhZDogbm8gY2FycmllciBzY2FuXG4iKTsKKwkJCW1zcF9zZXRfYXVkaW8oY2xpZW50KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogcHV0IGludG8gc2FuZSBzdGF0ZSAoYW5kIG11dGUpICovCisJCW1zcF9yZXNldChjbGllbnQpOworCisJCS8qIHNvbWUgdGltZSBmb3IgdGhlIHR1bmVyIHRvIHN5bmMgKi8KKwkJaWYgKG1zcF9zbGVlcChzdGF0ZSwyMDApKQorCQkJZ290byByZXN0YXJ0OworCisJCS8qIHN0YXJ0IGF1dG9kZXRlY3QgKi8KKwkJaWYgKHN0YXRlLT5yYWRpbykKKwkJCXN0ZCA9IDB4NDA7CisJCWVsc2UKKwkJCXN0ZCA9IChzdGF0ZS0+djRsMl9zdGQgJiBWNEwyX1NURF9OVFNDKSA/IDB4MjAgOiAxOworCQlzdGF0ZS0+d2F0Y2hfc3RlcmVvID0gMDsKKworCQlpZiAobXNwX2RlYnVnKQorCQkJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgInNldHRpbmcgc3RhbmRhcmQ6ICVzICgweCUwNHgpXG4iLAorCQkJICAgICAgIG1zcF9zdGFuZGFyZF9zdGRfbmFtZShzdGQpLCBzdGQpOworCisJCWlmIChzdGQgIT0gMSkgeworCQkJLyogcHJvZ3JhbW1lZCBzb21lIHNwZWNpZmljIG1vZGUgKi8KKwkJCXZhbCA9IHN0ZDsKKwkJfSBlbHNlIHsKKwkJCS8qIHRyaWdnZXJlZCBhdXRvZGV0ZWN0ICovCisJCQltc3Bfd3JpdGVfZGVtKGNsaWVudCwgMHgyMCwgc3RkKTsKKwkJCWZvciAoOzspIHsKKwkJCQlpZiAobXNwX3NsZWVwKHN0YXRlLCAxMDApKQorCQkJCQlnb3RvIHJlc3RhcnQ7CisKKwkJCQkvKiBjaGVjayByZXN1bHRzICovCisJCQkJdmFsID0gbXNwX3JlYWRfZGVtKGNsaWVudCwgMHg3ZSk7CisJCQkJaWYgKHZhbCA8IDB4MDdmZikKKwkJCQkJYnJlYWs7CisJCQkJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgImRldGVjdGlvbiBzdGlsbCBpbiBwcm9ncmVzc1xuIik7CisJCQl9CisJCX0KKwkJZm9yIChpID0gMDsgbXNwX3N0ZGxpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisJCQlpZiAobXNwX3N0ZGxpc3RbaV0ucmV0dmFsID09IHZhbCkKKwkJCQlicmVhazsKKwkJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgImN1cnJlbnQgc3RhbmRhcmQ6ICVzICgweCUwNHgpXG4iLAorCQkJbXNwX3N0YW5kYXJkX3N0ZF9uYW1lKHZhbCksIHZhbCk7CisJCXN0YXRlLT5tYWluICAgPSBtc3Bfc3RkbGlzdFtpXS5tYWluOworCQlzdGF0ZS0+c2Vjb25kID0gbXNwX3N0ZGxpc3RbaV0uc2Vjb25kOworCQlzdGF0ZS0+c3RkID0gdmFsOworCisJCWlmIChtc3BfYW1zb3VuZCAmJiAhc3RhdGUtPnJhZGlvICYmIChzdGF0ZS0+djRsMl9zdGQgJiBWNEwyX1NURF9TRUNBTSkgJiYKKwkJCQkodmFsICE9IDB4MDAwOSkpIHsKKwkJCS8qIGF1dG9kZXRlY3Rpb24gaGFzIGZhaWxlZCwgbGV0IGJhY2t1cCAqLworCQkJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgImF1dG9kZXRlY3Rpb24gZmFpbGVkLCIKKwkJCQkiIHN3aXRjaGluZyB0byBiYWNrdXAgc3RhbmRhcmQ6ICVzICgweCUwNHgpXG4iLAorCQkJCW1zcF9zdGRsaXN0WzhdLm5hbWUgPyBtc3Bfc3RkbGlzdFs4XS5uYW1lIDogInVua25vd24iLHZhbCk7CisJCQl2YWwgPSAweDAwMDk7CisJCQltc3Bfd3JpdGVfZGVtKGNsaWVudCwgMHgyMCwgdmFsKTsKKwkJfQorCisJCS8qIHNldCB2YXJpb3VzIHByZXNjYWxlcyAqLworCQltc3Bfd3JpdGVfZHNwKGNsaWVudCwgMHgwZCwgMHgxOTAwKTsgLyogc2NhcnQgKi8KKwkJbXNwX3dyaXRlX2RzcChjbGllbnQsIDB4MGUsIDB4MjQwMyk7IC8qIEZNICovCisJCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDEwLCAweDVhMDApOyAvKiBuaWNhbSAqLworCisJCS8qIHNldCBzdGVyZW8gKi8KKwkJc3dpdGNoICh2YWwpIHsKKwkJY2FzZSAweDAwMDg6IC8qIEIvRyBOSUNBTSAqLworCQljYXNlIDB4MDAwYTogLyogSSBOSUNBTSAqLworCQkJaWYgKHZhbCA9PSAweDAwMDgpCisJCQkJc3RhdGUtPm1vZGUgPSBNU1BfTU9ERV9GTV9OSUNBTTE7CisJCQllbHNlCisJCQkJc3RhdGUtPm1vZGUgPSBNU1BfTU9ERV9GTV9OSUNBTTI7CisJCQkvKiBqdXN0IHR1cm4gb24gc3RlcmVvICovCisJCQlzdGF0ZS0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKKwkJCXN0YXRlLT5uaWNhbV9vbiA9IDE7CisJCQlzdGF0ZS0+d2F0Y2hfc3RlcmVvID0gMTsKKwkJCW1zcDM0MDBjX3NldHN0ZXJlbyhjbGllbnQsVjRMMl9UVU5FUl9NT0RFX1NURVJFTyk7CisJCQlicmVhazsKKwkJY2FzZSAweDAwMDk6CisJCQlzdGF0ZS0+bW9kZSA9IE1TUF9NT0RFX0FNX05JQ0FNOworCQkJc3RhdGUtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05POworCQkJc3RhdGUtPm5pY2FtX29uID0gMTsKKwkJCW1zcDM0MDBjX3NldHN0ZXJlbyhjbGllbnQsVjRMMl9UVU5FUl9NT0RFX01PTk8pOworCQkJc3RhdGUtPndhdGNoX3N0ZXJlbyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAweDAwMjA6IC8qIEJUU0MgKi8KKwkJCS8qIGp1c3QgdHVybiBvbiBzdGVyZW8gKi8KKwkJCXN0YXRlLT5tb2RlID0gTVNQX01PREVfQlRTQzsKKwkJCXN0YXRlLT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfU1RFUkVPOworCQkJc3RhdGUtPm5pY2FtX29uID0gMDsKKwkJCXN0YXRlLT53YXRjaF9zdGVyZW8gPSAxOworCQkJbXNwMzQwMGNfc2V0c3RlcmVvKGNsaWVudCxWNEwyX1RVTkVSX01PREVfU1RFUkVPKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDA0MDogLyogRk0gcmFkaW8gKi8KKwkJCXN0YXRlLT5tb2RlID0gTVNQX01PREVfRk1fUkFESU87CisJCQlzdGF0ZS0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKKwkJCXN0YXRlLT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKKwkJCXN0YXRlLT5uaWNhbV9vbiA9IDA7CisJCQlzdGF0ZS0+d2F0Y2hfc3RlcmVvID0gMDsKKwkJCS8qIG5vdCBuZWVkZWQgaW4gdGhlb3J5IGlmIHdlIGhhdmUgcmFkaW8sIGJ1dAorCQkJICAgc2hvcnQgcHJvZ3JhbW1pbmcgZW5hYmxlcyBjYXJyaWVyIG11dGUgKi8KKwkJCW1zcDM0MDBjX3NldG1vZGUoY2xpZW50LCBNU1BfTU9ERV9GTV9SQURJTyk7CisJCQltc3AzNDAwY19zZXRjYXJyaWVyKGNsaWVudCwgTVNQX0NBUlJJRVIoMTAuNyksCisJCQkJCSAgICBNU1BfQ0FSUklFUigxMC43KSk7CisJCQkvKiBzY2FydCByb3V0aW5nICovCisJCQltc3Bfc2V0X3NjYXJ0KGNsaWVudCxTQ0FSVF9JTjIsMCk7CisJCQkvKiBtc3AzNHh4IGRvZXMgcmFkaW8gZGVjb2RpbmcgKi8KKwkJCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDA4LCAweDAwMjApOworCQkJbXNwX3dyaXRlX2RzcChjbGllbnQsIDB4MDksIDB4MDAyMCk7CisJCQltc3Bfd3JpdGVfZHNwKGNsaWVudCwgMHgwYiwgMHgwMDIwKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDAwMzoKKwkJY2FzZSAweDAwMDQ6CisJCWNhc2UgMHgwMDA1OgorCQkJc3RhdGUtPm1vZGUgPSBNU1BfTU9ERV9GTV9URVJSQTsKKwkJCXN0YXRlLT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwkJCXN0YXRlLT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX01PTk87CisJCQlzdGF0ZS0+bmljYW1fb24gPSAwOworCQkJc3RhdGUtPndhdGNoX3N0ZXJlbyA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCS8qIHVubXV0ZSwgcmVzdG9yZSBtaXNjIHJlZ2lzdGVycyAqLworCQltc3Bfc2V0X2F1ZGlvKGNsaWVudCk7CisJCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDEzLCBzdGF0ZS0+YWNiKTsKKwkJaWYgKHN0YXRlLT5oYXNfaTJzX2NvbmYpCisJCQltc3Bfd3JpdGVfZGVtKGNsaWVudCwgMHg0MCwgc3RhdGUtPmkyc19tb2RlKTsKKworCQkvKiBtb25pdG9yIHR2IGF1ZGlvIG1vZGUgKi8KKwkJd2hpbGUgKHN0YXRlLT53YXRjaF9zdGVyZW8pIHsKKwkJCWlmIChtc3Bfc2xlZXAoc3RhdGUsNTAwMCkpCisJCQkJZ290byByZXN0YXJ0OworCQkJd2F0Y2hfc3RlcmVvKGNsaWVudCk7CisJCX0KKwl9CisJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgInRocmVhZDogZXhpdFxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIG1zcDM0eHhHICsgKGF1dG9zZWxlY3Qgbm8tdGhyZWFkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiB0aGlzIG9uZSB1c2VzIGJvdGggYXV0b21hdGljIHN0YW5kYXJkIGRldGVjdGlvbiBhbmQgYXV0b21hdGljIHNvdW5kICAgICAqLworLyogc2VsZWN0IHdoaWNoIGFyZSBhdmFpbGFibGUgaW4gdGhlIG5ld2VyIEcgdmVyc2lvbnMgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHN0cnVjdCBtc3A6IG9ubHkgbm9ybSwgYWNiIGFuZCBzb3VyY2UgYXJlIHJlYWxseSB1c2VkIGluIHRoaXMgbW9kZSAgICAgICovCisKKy8qIHNldCB0aGUgc2FtZSAnc291cmNlJyBmb3IgdGhlIGxvdWRzcGVha2VyLCBzY2FydCBhbmQgcXVhc2ktcGVhayBkZXRlY3RvcgorICogdGhlIHZhbHVlIGZvciBzb3VyY2UgaXMgdGhlIHNhbWUgYXMgYml0IDE1Ojggb2YgRFNQIHJlZ2lzdGVycyAweDA4LAorICogMHgwYSBhbmQgMHgwYzogMD1tb25vLCAxPXN0ZXJlbyBvciBBfEIsIDI9U0NBUlQsIDM9c3RlcmVvIG9yIEEsIDQ9c3RlcmVvIG9yIEIKKyAqCisgKiB0aGlzIGZ1bmN0aW9uIHJlcGxhY2VzIG1zcDM0MDBjX3NldHN0ZXJlbworICovCitzdGF0aWMgdm9pZCBtc3AzNHh4Z19zZXRfc291cmNlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBzb3VyY2UpCit7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCS8qIGZpeCBtYXRyaXggbW9kZSB0byBzdGVyZW8gYW5kIGxldCB0aGUgbXNwIGNob29zZSB3aGF0CisJICogdG8gb3V0cHV0IGFjY29yZGluZyB0byAnc291cmNlJywgYXMgcmVjb21tZW5kZWQKKwkgKiBmb3IgTU9OTyAoc291cmNlPT0wKSBkb3dubWl4aW5nIHNldCBiaXRbNzowXSB0byAweDMwCisJICovCisJaW50IHZhbHVlID0gKHNvdXJjZSAmIDB4MDcpIDw8IDggfCAoc291cmNlID09IDAgPyAweDMwIDogMHgyMCk7CisKKwl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAic2V0IHNvdXJjZSB0byAlZCAoMHgleClcbiIsIHNvdXJjZSwgdmFsdWUpOworCS8qIExvdWRzcGVha2VyIE91dHB1dCAqLworCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDA4LCB2YWx1ZSk7CisJLyogU0NBUlQxIERBIE91dHB1dCAqLworCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDBhLCB2YWx1ZSk7CisJLyogUXVhc2ktcGVhayBkZXRlY3RvciAqLworCW1zcF93cml0ZV9kc3AoY2xpZW50LCAweDBjLCB2YWx1ZSk7CisJLyoKKwkgKiBzZXQgaWRlbnRpZmljYXRpb24gdGhyZXNob2xkLiBQZXJzb25hbGx5LCBJCisJICogSSBzZXQgaXQgdG8gYSBoaWdoZXIgdmFsdWUgdGhhdCB0aGUgZGVmYXVsdAorCSAqIG9mIDB4MTkwIHRvIGlnbm9yZSBub2lzeSBzdGVyZW8gc2lnbmFscy4KKwkgKiB0aGlzIG5lZWRzIHR1bmluZy4gKHJlY29tbWVuZGVkIHJhbmdlIDB4MDBhMC0weDAzYzApCisJICogMHg3ZjAgPSBmb3JjZWQgbW9ubyBtb2RlCisJICovCisJLyogYTIgdGhyZXNob2xkIGZvciBzdGVyZW8vYmlsaW5ndWFsICovCisJbXNwX3dyaXRlX2RlbShjbGllbnQsIDB4MjIsIG1zcF9zdGVyZW9fdGhyZXNoKTsKKwlzdGF0ZS0+c291cmNlID0gc291cmNlOworfQorCisvKiAocmUtKWluaXRpYWxpemUgdGhlIG1zcDM0eHhnLCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbm9ybSBpbiBzdGF0ZS0+bm9ybQorICogcmV0dXJuIDAgaWYgaXQgd29ya2VkLCAtMSBpZiBpdCBmYWlsZWQKKyAqLworc3RhdGljIGludCBtc3AzNHh4Z19yZXNldChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IG1vZHVzLCBzdGQ7CisKKwlpZiAobXNwX3Jlc2V0KGNsaWVudCkpCisJCXJldHVybiAtMTsKKworCS8qIG1ha2Ugc3VyZSB0aGF0IGlucHV0L291dHB1dCBpcyBtdXRlZCAocGFyYW5vaWQgbW9kZSkgKi8KKwkvKiBBQ0IsIG11dGUgRFNQIGlucHV0LCBtdXRlIFNDQVJUIDEgKi8KKwlpZiAobXNwX3dyaXRlX2RzcChjbGllbnQsIDB4MTMsIDB4MGYyMCkpCisJCXJldHVybiAtMTsKKworCWlmIChzdGF0ZS0+aGFzX2kyc19jb25mKQorCQltc3Bfd3JpdGVfZGVtKGNsaWVudCwgMHg0MCwgc3RhdGUtPmkyc19tb2RlKTsKKworCS8qIHN0ZXAtYnktc3RlcCBpbml0aWFsaXNhdGlvbiwgYXMgZGVzY3JpYmVkIGluIHRoZSBtYW51YWwgKi8KKwltb2R1cyA9IG1zcF9tb2R1cyhjbGllbnQpOworCWlmIChzdGF0ZS0+cmFkaW8pCisJCXN0ZCA9IDB4NDA7CisJZWxzZQorCQlzdGQgPSAoc3RhdGUtPnY0bDJfc3RkICYgVjRMMl9TVERfTlRTQykgPyAweDIwIDogMTsKKwltb2R1cyAmPSB+MHgwMzsgLyogU1RBVFVTX0NIQU5HRSA9IDAgKi8KKwltb2R1cyB8PSAweDAxOyAgLyogQVVUT01BVElDX1NPVU5EX0RFVEVDVElPTiA9IDEgKi8KKwlpZiAobXNwX3dyaXRlX2RlbShjbGllbnQsIDB4MzAsIG1vZHVzKSkKKwkJcmV0dXJuIC0xOworCWlmIChtc3Bfd3JpdGVfZGVtKGNsaWVudCwgMHgyMCwgc3RkKSkKKwkJcmV0dXJuIC0xOworCisJLyogd3JpdGUgdGhlIGRzcHMgdGhhdCBtYXkgaGF2ZSBhbiBpbmZsdWVuY2Ugb24KKwkgICBzdGFuZGFyZC9hdWRpbyBhdXRvZGV0ZWN0aW9uIHJpZ2h0IG5vdyAqLworCW1zcDM0eHhnX3NldF9zb3VyY2UoY2xpZW50LCBzdGF0ZS0+c291cmNlKTsKKworCS8qIEFNL0ZNIFByZXNjYWxlIFsxNTo4XSA3NWtoeiBkZXZpYXRpb24gKi8KKwlpZiAobXNwX3dyaXRlX2RzcChjbGllbnQsIDB4MGUsIDB4MzAwMCkpCisJCXJldHVybiAtMTsKKworCS8qIE5JQ0FNIFByZXNjYWxlIDlkYiBnYWluIChhcyByZWNvbW1lbmRlZCkgKi8KKwlpZiAobXNwX3dyaXRlX2RzcChjbGllbnQsIDB4MTAsIDB4NWEwMCkpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitpbnQgbXNwMzR4eGdfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGE7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsLCBzdGQsIGk7CisKKwl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAibXNwMzR4eGcgZGFlbW9uIHN0YXJ0ZWRcbiIpOworCisJc3RhdGUtPnNvdXJjZSA9IDE7IC8qIGRlZmF1bHQgKi8KKwlmb3IgKDs7KSB7CisJCXY0bF9kYmcoMiwgbXNwX2RlYnVnLCBjbGllbnQsICJtc3AzNHh4ZyB0aHJlYWQ6IHNsZWVwXG4iKTsKKwkJbXNwX3NsZWVwKHN0YXRlLCAtMSk7CisJCXY0bF9kYmcoMiwgbXNwX2RlYnVnLCBjbGllbnQsICJtc3AzNHh4ZyB0aHJlYWQ6IHdha2V1cFxuIik7CisKKwlyZXN0YXJ0OgorCQl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAidGhyZWFkOiByZXN0YXJ0IHNjYW5cbiIpOworCQlzdGF0ZS0+cmVzdGFydCA9IDA7CisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJCQlicmVhazsKKworCQkvKiBzZXR1cCB0aGUgY2hpcCovCisJCW1zcDM0eHhnX3Jlc2V0KGNsaWVudCk7CisJCXN0ZCA9IG1zcF9zdGFuZGFyZDsKKwkJaWYgKHN0ZCAhPSAweDAxKQorCQkJZ290byB1bm11dGU7CisKKwkJLyogd2F0Y2ggYXV0b2RldGVjdCAqLworCQl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAidHJpZ2dlcmVkIGF1dG9kZXRlY3QsIHdhaXRpbmcgZm9yIHJlc3VsdFxuIik7CisJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCQlpZiAobXNwX3NsZWVwKHN0YXRlLCAxMDApKQorCQkJCWdvdG8gcmVzdGFydDsKKworCQkJLyogY2hlY2sgcmVzdWx0cyAqLworCQkJdmFsID0gbXNwX3JlYWRfZGVtKGNsaWVudCwgMHg3ZSk7CisJCQlpZiAodmFsIDwgMHgwN2ZmKSB7CisJCQkJc3RkID0gdmFsOworCQkJCWJyZWFrOworCQkJfQorCQkJdjRsX2RiZygyLCBtc3BfZGVidWcsIGNsaWVudCwgImRldGVjdGlvbiBzdGlsbCBpbiBwcm9ncmVzc1xuIik7CisJCX0KKwkJaWYgKHN0ZCA9PSAxKSB7CisJCQl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAiZGV0ZWN0aW9uIHN0aWxsIGluIHByb2dyZXNzIGFmdGVyIDEwIHRyaWVzLiBnaXZpbmcgdXAuXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwl1bm11dGU6CisJCXN0YXRlLT5zdGQgPSBzdGQ7CisJCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJjdXJyZW50IHN0YW5kYXJkOiAlcyAoMHglMDR4KVxuIiwKKwkJCW1zcF9zdGFuZGFyZF9zdGRfbmFtZShzdGQpLCBzdGQpOworCisJCS8qIHVubXV0ZTogZGlzcGF0Y2ggc291bmQgdG8gc2NhcnQgb3V0cHV0LCBzZXQgc2NhcnQgdm9sdW1lICovCisJCW1zcF9zZXRfYXVkaW8oY2xpZW50KTsKKworCQkvKiByZXN0b3JlIEFDQiAqLworCQlpZiAobXNwX3dyaXRlX2RzcChjbGllbnQsIDB4MTMsIHN0YXRlLT5hY2IpKQorCQkJcmV0dXJuIC0xOworCisJCW1zcF93cml0ZV9kZW0oY2xpZW50LCAweDQwLCBzdGF0ZS0+aTJzX21vZGUpOworCX0KKwl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAidGhyZWFkOiBleGl0XG4iKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtc3AzNHh4Z19kZXRlY3Rfc3RlcmVvKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWludCBzdGF0dXMgPSBtc3BfcmVhZF9kZW0oY2xpZW50LCAweDAyMDApOworCWludCBpc19iaWxpbmd1YWwgPSBzdGF0dXMgJiAweDEwMDsKKwlpbnQgaXNfc3RlcmVvID0gc3RhdHVzICYgMHg0MDsKKworCXN0YXRlLT5yeHN1YmNoYW5zID0gMDsKKwlpZiAoaXNfc3RlcmVvKQorCQlzdGF0ZS0+cnhzdWJjaGFucyB8PSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87CisJZWxzZQorCQlzdGF0ZS0+cnhzdWJjaGFucyB8PSBWNEwyX1RVTkVSX1NVQl9NT05POworCWlmIChpc19iaWxpbmd1YWwpIHsKKwkJc3RhdGUtPnJ4c3ViY2hhbnMgfD0gVjRMMl9UVU5FUl9TVUJfTEFORzEgfCBWNEwyX1RVTkVSX1NVQl9MQU5HMjsKKwkJLyogSSdtIHN1cHBvc2VkIHRvIGNoZWNrIHdoZXRoZXIgaXQncyBTQVAgb3Igbm90CisJCSAqIGFuZCBzZXQgb25seSBMQU5HMi9TQVAgaW4gdGhpcyBjYXNlLiBZZXQsIHRoZSBNU1AKKwkJICogZG9lcyBhIGxvdCBvZiB3b3JrIHRvIGhpZGUgdGhpcyBhbmQgaGFuZGxlIGV2ZXJ5dGhpbmcKKwkJICogdGhlIHNhbWUgd2F5LiBJIGRvbid0IHdhbnQgdG8gd29yayBhcm91bmQgaXQgc28gdW5sZXNzCisJCSAqIHRoaXMgaXMgYSBwcm9ibGVtLCBJJ2xsIGhhbmRsZSBTQVAganVzdCBsaWtlIGxhbmcxL2xhbmcyLgorCQkgKi8KKwl9CisJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgInN0YXR1cz0weCV4LCBzdGVyZW89JWQsIGJpbGluZ3VhbD0lZCAtPiByeHN1YmNoYW5zPSVkXG4iLAorCQlzdGF0dXMsIGlzX3N0ZXJlbywgaXNfYmlsaW5ndWFsLCBzdGF0ZS0+cnhzdWJjaGFucyk7Cit9CisKK3ZvaWQgbXNwMzR4eGdfc2V0X2F1ZG1vZGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGF1ZG1vZGUpCit7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgc291cmNlOworCisJc3dpdGNoIChhdWRtb2RlKSB7CisJY2FzZSBWNEwyX1RVTkVSX01PREVfTU9OTzoKKwkJc291cmNlID0gMDsgLyogbW9ubyBvbmx5ICovCisJCWJyZWFrOworCWNhc2UgVjRMMl9UVU5FUl9NT0RFX1NURVJFTzoKKwkJc291cmNlID0gMTsgLyogc3RlcmVvIG9yIEF8Qiwgc2VlIGNvbW1lbnQgaW4gbXNwMzR4eGdfZ2V0X3Y0bDJfc3RlcmVvKCkgKi8KKwkJLyogcHJvYmxlbTogdGhhdCBjb3VsZCBhbHNvIG1lYW4gMiAoc2NhcnQgaW5wdXQpICovCisJCWJyZWFrOworCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcxOgorCQlzb3VyY2UgPSAzOyAvKiBzdGVyZW8gb3IgQSAqLworCQlicmVhazsKKwljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMjoKKwkJc291cmNlID0gNDsgLyogc3RlcmVvIG9yIEIgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYXVkbW9kZSA9IDA7CisJCXNvdXJjZSAgPSAxOworCQlicmVhazsKKwl9CisJc3RhdGUtPmF1ZG1vZGUgPSBhdWRtb2RlOworCW1zcDM0eHhnX3NldF9zb3VyY2UoY2xpZW50LCBzb3VyY2UpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODMyNTNlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIyOSArMCwwIEBACi0vKgotICogcHJvZ3JhbW1pbmcgdGhlIG1zcDM0KiBzb3VuZCBwcm9jZXNzb3IgZmFtaWx5Ci0gKgotICogKGMpIDE5OTctMjAwMSBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+Ci0gKgotICogd2hhdCB3b3JrcyBhbmQgd2hhdCBkb2Vzbid0OgotICoKLSAqICBBTS1Nb25vCi0gKiAgICAgIFN1cHBvcnQgZm9yIEhhdXBwYXVnZSBjYXJkcyBhZGRlZCAoZGVjb2RpbmcgaGFuZGxlZCBieSB0dW5lcikgYWRkZWQgYnkKLSAqICAgICAgRnJlZGVyaWMgQ3JvemF0IDxmY3JvemF0QG1haWwuZG90Y29tLmZyPgotICoKLSAqICBGTS1Nb25vCi0gKiAgICAgIHNob3VsZCB3b3JrLiBUaGUgc3RlcmVvIG1vZGVzIGFyZSBiYWNrd2FyZCBjb21wYXRpYmxlIHRvIEZNLW1vbm8sCi0gKiAgICAgIHRoZXJlZm9yZSBGTS1Nb25vIHNob3VsZCBiZSBhbGx3YXlzIGF2YWlsYWJsZS4KLSAqCi0gKiAgRk0tU3RlcmVvIChCL0csIHVzZWQgaW4gZ2VybWFueSkKLSAqICAgICAgc2hvdWxkIHdvcmssIHdpdGggYXV0b2RldGVjdAotICoKLSAqICBGTS1TdGVyZW8gKHNhdGVsbGl0ZSkKLSAqICAgICAgc2hvdWxkIHdvcmssIG5vIGF1dG9kZXRlY3QgKGkuZS4gZGVmYXVsdCBpcyBtb25vLCBidXQgeW91IGNhbgotICogICAgICBzd2l0Y2ggdG8gc3RlcmVvIC0tIHVudGVzdGVkKQotICoKLSAqICBOSUNBTSAoQi9HLCBMICwgdXNlZCBpbiBVSywgU2NhbmRpbmF2aWEsIFNwYWluIGFuZCBGcmFuY2UpCi0gKiAgICAgIHNob3VsZCB3b3JrLCB3aXRoIGF1dG9kZXRlY3QuIFN1cHBvcnQgZm9yIE5JQ0FNIHdhcyBhZGRlZCBieQotICogICAgICBQZWtrYSBQaWV0aWthaW5lbiA8cHBAbmV0cHBsLmZpPgotICoKLSAqCi0gKiBUT0RPOgotICogICAtIGJldHRlciBTQVQgc3VwcG9ydAotICoKLSAqCi0gKiA5ODA2MjMgIFRob21hcyBTYWlsZXIgKHNhaWxlckBpZmUuZWUuZXRoei5jaCkKLSAqICAgICAgICAgdXNpbmcgc291bmRjb3JlIGluc3RlYWQgb2YgT1NTCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KLSNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvY2hpcC5oPgotI2luY2x1ZGUgIm1zcDM0MDAuaCIKLQotI2RlZmluZSBtc3AzNDAwX2RiZyhmbXQsIGFyZy4uLikgXAotCWRvIHsgXAotCQlpZiAoZGVidWcpIFwKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzIGRlYnVnICVkLSUwNHg6ICIgZm10LCBcCi0JCQkgICAgICAgY2xpZW50LT5kcml2ZXItPmRyaXZlci5uYW1lLCBcCi0JCQkgICAgICAgaTJjX2FkYXB0ZXJfaWQoY2xpZW50LT5hZGFwdGVyKSwgY2xpZW50LT5hZGRyICwgIyMgYXJnKTsgXAotCX0gd2hpbGUgKDApCi0KLS8qIE1lZGl1bSB2b2x1bWUgZGVidWcuICovCi0jZGVmaW5lIG1zcDM0MDBfZGJnX21lZGl1bXZvbChmbXQsIGFyZy4uLikgXAotCWRvIHsgXAotCQlpZiAoZGVidWcgPj0gMikgXAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgZGVidWcgJWQtJTA0eDogIiBmbXQsIFwKLQkJCQljbGllbnQtPmRyaXZlci0+ZHJpdmVyLm5hbWUsIFwKLQkJCQlpMmNfYWRhcHRlcl9pZChjbGllbnQtPmFkYXB0ZXIpLCBjbGllbnQtPmFkZHIgLCAjIyBhcmcpOyBcCi0JfSB3aGlsZSAoMCkKLQotLyogSGlnaCB2b2x1bWUgZGVidWcuIFVzZSB3aXRoIGNhcmUuICovCi0jZGVmaW5lIG1zcDM0MDBfZGJnX2hpZ2h2b2woZm10LCBhcmcuLi4pIFwKLQlkbyB7IFwKLQkJaWYgKGRlYnVnID49IDE2KSBcCi0JCQlwcmludGsoS0VSTl9JTkZPICIlcyBkZWJ1ZyAlZC0lMDR4OiAiIGZtdCwgXAotCQkJCWNsaWVudC0+ZHJpdmVyLT5kcml2ZXIubmFtZSwgXAotCQkJCWkyY19hZGFwdGVyX2lkKGNsaWVudC0+YWRhcHRlciksIGNsaWVudC0+YWRkciAsICMjIGFyZyk7IFwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIG1zcDM0MDBfZXJyKGZtdCwgYXJnLi4uKSBkbyB7IFwKLQlwcmludGsoS0VSTl9FUlIgIiVzICVkLSUwNHg6ICIgZm10LCBjbGllbnQtPmRyaXZlci0+ZHJpdmVyLm5hbWUsIFwKLQkJaTJjX2FkYXB0ZXJfaWQoY2xpZW50LT5hZGFwdGVyKSwgY2xpZW50LT5hZGRyICwgIyMgYXJnKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgbXNwMzQwMF93YXJuKGZtdCwgYXJnLi4uKSBkbyB7IFwKLQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyAlZC0lMDR4OiAiIGZtdCwgY2xpZW50LT5kcml2ZXItPmRyaXZlci5uYW1lLCBcCi0JCWkyY19hZGFwdGVyX2lkKGNsaWVudC0+YWRhcHRlciksIGNsaWVudC0+YWRkciAsICMjIGFyZyk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIG1zcDM0MDBfaW5mbyhmbXQsIGFyZy4uLikgZG8geyBcCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXMgJWQtJTA0eDogIiBmbXQsIGNsaWVudC0+ZHJpdmVyLT5kcml2ZXIubmFtZSwgXAotCQlpMmNfYWRhcHRlcl9pZChjbGllbnQtPmFkYXB0ZXIpLCBjbGllbnQtPmFkZHIgLCAjIyBhcmcpOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIE9QTU9ERV9BVVRPICAgIC0xCi0jZGVmaW5lIE9QTU9ERV9NQU5VQUwgICAwCi0jZGVmaW5lIE9QTU9ERV9TSU1QTEUgICAxICAgLyogdXNlIHNob3J0IHByb2dyYW1taW5nICg+PSBtc3AzNDEwIG9ubHkpICovCi0jZGVmaW5lIE9QTU9ERV9TSU1QTEVSICAyICAgLyogdXNlIHNob3J0ZXIgcHJvZ3JhbW1pbmcgKD49IG1zcDM0eHhHKSAgICovCi0KLS8qIGluc21vZCBwYXJhbWV0ZXJzICovCi1zdGF0aWMgaW50IG9wbW9kZSAgID0gT1BNT0RFX0FVVE87Ci1zdGF0aWMgaW50IGRlYnVnICAgID0gMDsgICAgLyogZGVidWcgb3V0cHV0ICovCi1zdGF0aWMgaW50IG9uY2UgICAgID0gMDsgICAgLyogbm8gY29udGlub3VzIHN0ZXJlbyBtb25pdG9yaW5nICovCi1zdGF0aWMgaW50IGFtc291bmQgID0gMDsgICAgLyogaGFyZC13aXJlIEFNIHNvdW5kIGF0IDYuNSBIeiAoZnJhbmNlKSwKLQkJCSAgICAgICB0aGUgYXV0b3NjYW4gc2VlbXMgd29yayB3ZWxsIG9ubHkgd2l0aCBGTS4uLiAqLwotc3RhdGljIGludCBzdGFuZGFyZCA9IDE7ICAgIC8qIE92ZXJyaWRlIGF1dG8gZGV0ZWN0IG9mIGF1ZGlvIHN0YW5kYXJkLCBpZiBuZWVkZWQuICovCi1zdGF0aWMgaW50IGRvbGJ5ICAgID0gMDsKLQotc3RhdGljIGludCBzdGVyZW9fdGhyZXNob2xkID0gMHgxOTA7IC8qIGEyIHRocmVzaG9sZCBmb3Igc3RlcmVvL2JpbGluZ3VhbAotCQkJCQkobXNwMzR4eGcgb25seSkgMHgwMGEwLTB4MDNjMCAqLwotI2RlZmluZSBERlBfQ09VTlQgMHg0MQotc3RhdGljIGNvbnN0IGludCBibF9kZnBbXSA9IHsKLQkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA2LCAweDA4LCAweDA5LCAweDBhLAotCTB4MGIsIDB4MGQsIDB4MGUsIDB4MTAKLX07Ci0KLSNkZWZpbmUgSVNfTVNQMzRYWF9HKG1zcCkgKChtc3ApLT5vcG1vZGU9PTIpCi0KLXN0cnVjdCBtc3AzNDAwYyB7Ci0JaW50IHJldjEscmV2MjsKLQotCWludCBvcG1vZGU7Ci0JaW50IG5pY2FtOwotCWludCBtb2RlOwotCWludCBub3JtOwotCWludCBzdGVyZW87Ci0JaW50IG5pY2FtX29uOwotCWludCBhY2I7Ci0JaW50IGluX3NjYXJ0OwotCWludCBpMnNfbW9kZTsKLQlpbnQgbWFpbiwgc2Vjb25kOwkvKiBzb3VuZCBjYXJyaWVyICovCi0JaW50IGlucHV0OwotCWludCBzb3VyY2U7ICAgICAgICAgICAgIC8qIHNlZSBtc3AzNHh4Z19zZXRfc291cmNlICovCi0KLQkvKiB2NGwyICovCi0JaW50IGF1ZG1vZGU7Ci0JaW50IHJ4c3ViY2hhbnM7Ci0KLQlpbnQgbXV0ZWQ7Ci0JaW50IGxlZnQsIHJpZ2h0OwkvKiB2b2x1bWUgKi8KLQlpbnQgYmFzcywgdHJlYmxlOwotCi0JLyogc2hhZG93IHJlZ2lzdGVyIHNldCAqLwotCWludCBkZnBfcmVnc1tERlBfQ09VTlRdOwotCi0JLyogdGhyZWFkICovCi0Jc3RydWN0IHRhc2tfc3RydWN0ICAgKmt0aHJlYWQ7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgICAgd3E7Ci0JaW50ICAgICAgICAgICAgICAgICAgcmVzdGFydDoxOwotCWludCAgICAgICAgICAgICAgICAgIHdhdGNoX3N0ZXJlbzoxOwotfTsKLQotI2RlZmluZSBNSU4oYSxiKSAoKChhKT4oYikpPyhiKTooYSkpCi0jZGVmaW5lIE1BWChhLGIpICgoKGEpPihiKSk/KGEpOihiKSkKLSNkZWZpbmUgSEFWRV9OSUNBTShtc3ApICAgKCgobXNwLT5yZXYyPj44KSAmIDB4ZmYpICE9IDAwKQotI2RlZmluZSBIQVZFX1NJTVBMRShtc3ApICAoKG1zcC0+cmV2MSAgICAgICYgMHhmZikgPj0gJ0QnLSdAJykKLSNkZWZpbmUgSEFWRV9TSU1QTEVSKG1zcCkgKChtc3AtPnJldjEgICAgICAmIDB4ZmYpID49ICdHJy0nQCcpCi0jZGVmaW5lIEhBVkVfUkFESU8obXNwKSAgICgobXNwLT5yZXYxICAgICAgJiAweGZmKSA+PSAnRyctJ0AnKQotCi0jZGVmaW5lIFZJREVPX01PREVfUkFESU8gMTYgICAgICAvKiBub3JtIG1hZ2ljIGZvciByYWRpbyBtb2RlICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogcmVhZC1vbmx5ICovCi1tb2R1bGVfcGFyYW0ob3Btb2RlLCAgICAgICAgICAgaW50LCAwNDQ0KTsKLQotLyogcmVhZC13cml0ZSAqLwotbW9kdWxlX3BhcmFtKG9uY2UsICAgICAgICAgICAgIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0oZGVidWcsICAgICAgICAgICAgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShzdGVyZW9fdGhyZXNob2xkLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHN0YW5kYXJkLCAgICAgICAgIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0oYW1zb3VuZCwgICAgICAgICAgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShkb2xieSwgICAgICAgICAgICBpbnQsIDA2NDQpOwotCi1NT0RVTEVfUEFSTV9ERVNDKG9wbW9kZSwgIkZvcmNlcyBhIE1TUDM0MDAgb3Btb2RlLiAwPU1hbnVhbCwgMT1TaW1wbGUsIDI9U2ltcGxlciIpOwotTU9EVUxFX1BBUk1fREVTQyhvbmNlLCAiTm8gY29udGludW91cyBzdGVyZW8gbW9uaXRvcmluZyIpOwotTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyIpOwotTU9EVUxFX1BBUk1fREVTQyhzdGVyZW9fdGhyZXNob2xkLCAiU2V0cyBzaWduYWwgdGhyZXNob2xkIHRvIGFjdGl2YXRlIHN0ZXJlbyIpOwotTU9EVUxFX1BBUk1fREVTQyhzdGFuZGFyZCwgIlNwZWNpZnkgYXVkaW8gc3RhbmRhcmQ6IDMyID0gTlRTQywgNjQgPSByYWRpbywgRGVmYXVsdDogQXV0b2RldGVjdCIpOwotTU9EVUxFX1BBUk1fREVTQyhhbXNvdW5kLCAiSGFyZHdpcmUgQU0gc291bmQgYXQgNi41SHogKEZyYW5jZSksIEZNIGNhbiBhdXRvc2NhbiIpOwotTU9EVUxFX1BBUk1fREVTQyhkb2xieSwgIkFjdGl2YXRlcyBEb2xieSBwcm9jZXNzc2luZyIpOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNkZWZpbmUgSTJDX01TUDM0MDBDICAgICAgIDB4ODAKLSNkZWZpbmUgSTJDX01TUDM0MDBDX0FMVCAgIDB4ODgKLQotI2RlZmluZSBJMkNfTVNQMzQwMENfREVNICAgMHgxMAotI2RlZmluZSBJMkNfTVNQMzQwMENfREZQICAgMHgxMgotCi0vKiBBZGRyZXNzZXMgdG8gc2NhbiAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsKLQlJMkNfTVNQMzQwMEMgICAgICA+PiAxLAotCUkyQ19NU1AzNDAwQ19BTFQgID4+IDEsCi0JSTJDX0NMSUVOVF9FTkQKLX07Ci1JMkNfQ0xJRU5UX0lOU01PRDsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJkZXZpY2UgZHJpdmVyIGZvciBtc3AzNHh4IFRWIHNvdW5kIHByb2Nlc3NvciIpOwotTU9EVUxFX0FVVEhPUigiR2VyZCBLbm9yciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogZnVuY3Rpb25zIGZvciB0YWxraW5nIHRvIHRoZSBNU1AzNDAwQyBTb3VuZCBwcm9jZXNzb3IgICAgICAgICAgICAgICAgICAgKi8KLQotc3RhdGljIGludCBtc3AzNDAwY19yZXNldChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCS8qIHJlc2V0IGFuZCByZWFkIHJldmlzaW9uIGNvZGUgKi8KLQlzdGF0aWMgY2hhciByZXNldF9vZmZbM10gPSB7IDB4MDAsIDB4ODAsIDB4MDAgfTsKLQlzdGF0aWMgY2hhciByZXNldF9vblszXSAgPSB7IDB4MDAsIDB4MDAsIDB4MDAgfTsKLQlzdGF0aWMgY2hhciB3cml0ZVszXSAgICAgPSB7IEkyQ19NU1AzNDAwQ19ERlAgKyAxLCAweDAwLCAweDFlIH07Ci0JY2hhciByZWFkWzJdOwotCXN0cnVjdCBpMmNfbXNnIHJlc2V0WzJdID0gewotCQl7IGNsaWVudC0+YWRkciwgSTJDX01fSUdOT1JFX05BSywgMywgcmVzZXRfb2ZmIH0sCi0JCXsgY2xpZW50LT5hZGRyLCBJMkNfTV9JR05PUkVfTkFLLCAzLCByZXNldF9vbiAgfSwKLQl9OwotCXN0cnVjdCBpMmNfbXNnIHRlc3RbMl0gPSB7Ci0JCXsgY2xpZW50LT5hZGRyLCAwLCAgICAgICAgMywgd3JpdGUgfSwKLQkJeyBjbGllbnQtPmFkZHIsIEkyQ19NX1JELCAyLCByZWFkICB9LAotCX07Ci0KLQltc3AzNDAwX2RiZ19oaWdodm9sKCJtc3AzNDAwY19yZXNldFxuIik7Ci0JaWYgKCAoMSAhPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCZyZXNldFswXSwxKSkgfHwKLQkgICAgICgxICE9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsJnJlc2V0WzFdLDEpKSB8fAotCSAgICAgKDIgIT0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlcix0ZXN0LDIpKSApIHsKLQkJbXNwMzQwMF9lcnIoImNoaXAgcmVzZXQgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc3AzNDAwY19yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBkZXYsIGludCBhZGRyKQotewotCWludCBlcnIscmV0dmFsOwotCi0JdW5zaWduZWQgY2hhciB3cml0ZVszXTsKLQl1bnNpZ25lZCBjaGFyIHJlYWRbMl07Ci0Jc3RydWN0IGkyY19tc2cgbXNnc1syXSA9IHsKLQkJeyBjbGllbnQtPmFkZHIsIDAsICAgICAgICAzLCB3cml0ZSB9LAotCQl7IGNsaWVudC0+YWRkciwgSTJDX01fUkQsIDIsIHJlYWQgIH0KLQl9OwotCi0Jd3JpdGVbMF0gPSBkZXYrMTsKLQl3cml0ZVsxXSA9IGFkZHIgPj4gODsKLQl3cml0ZVsyXSA9IGFkZHIgJiAweGZmOwotCi0JZm9yIChlcnIgPSAwOyBlcnIgPCAzOykgewotCQlpZiAoMiA9PSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLG1zZ3MsMikpCi0JCQlicmVhazsKLQkJZXJyKys7Ci0JCW1zcDM0MDBfd2FybigiSS9PIGVycm9yICMlZCAocmVhZCAweCUwMngvMHglMDJ4KVxuIiwgZXJyLAotCQkgICAgICAgZGV2LCBhZGRyKTsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlX3RpbWVvdXQobXNlY3NfdG9famlmZmllcygxMCkpOwotCX0KLQlpZiAoMyA9PSBlcnIpIHsKLQkJbXNwMzQwMF93YXJuKCJnaXZpbmcgdXAsIHJlc2V0dGluZyBjaGlwLiBTb3VuZCB3aWxsIGdvIG9mZiwgc29ycnkgZm9sa3MgOi18XG4iKTsKLQkJbXNwMzQwMGNfcmVzZXQoY2xpZW50KTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR2YWwgPSByZWFkWzBdIDw8IDggfCByZWFkWzFdOwotCW1zcDM0MDBfZGJnX2hpZ2h2b2woIm1zcDM0MDBjX3JlYWQoMHgleCwgMHgleCk6IDB4JXhcbiIsIGRldiwgYWRkciwgcmV0dmFsKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IG1zcDM0MDBjX3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBkZXYsIGludCBhZGRyLCBpbnQgdmFsKQotewotCWludCBlcnI7Ci0JdW5zaWduZWQgY2hhciBidWZmZXJbNV07Ci0KLQlidWZmZXJbMF0gPSBkZXY7Ci0JYnVmZmVyWzFdID0gYWRkciA+PiA4OwotCWJ1ZmZlclsyXSA9IGFkZHIgJiAgMHhmZjsKLQlidWZmZXJbM10gPSB2YWwgID4+IDg7Ci0JYnVmZmVyWzRdID0gdmFsICAmICAweGZmOwotCi0JbXNwMzQwMF9kYmdfaGlnaHZvbCgibXNwMzQwMGNfd3JpdGUoMHgleCwgMHgleCwgMHgleClcbiIsIGRldiwgYWRkciwgdmFsKTsKLQlmb3IgKGVyciA9IDA7IGVyciA8IDM7KSB7Ci0JCWlmICg1ID09IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZmZlciwgNSkpCi0JCQlicmVhazsKLQkJZXJyKys7Ci0JCW1zcDM0MDBfd2FybigiSS9PIGVycm9yICMlZCAod3JpdGUgMHglMDJ4LzB4JTAyeClcbiIsIGVyciwKLQkJICAgICAgIGRldiwgYWRkcik7Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQlzY2hlZHVsZV90aW1lb3V0KG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKLQl9Ci0JaWYgKDMgPT0gZXJyKSB7Ci0JCW1zcDM0MDBfd2FybigiZ2l2aW5nIHVwLCByZXNldGluZyBjaGlwLiBTb3VuZCB3aWxsIGdvIG9mZiwgc29ycnkgZm9sa3MgOi18XG4iKTsKLQkJbXNwMzQwMGNfcmVzZXQoY2xpZW50KTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIFRoaXMgbWFjcm8gaXMgYWxsb3dlZCBmb3IgKmNvbnN0YW50cyogb25seSwgZ2NjIG11c3QgY2FsY3VsYXRlIGl0Ci0gICBhdCBjb21waWxlIHRpbWUuICBSZW1lbWJlciAtLSBubyBmbG9hdHMgaW4ga2VybmVsIG1vZGUgKi8KLSNkZWZpbmUgTVNQX0NBUlJJRVIoZnJlcSkgKChpbnQpKChmbG9hdCkoZnJlcS8xOC40MzIpKigxPDwyNCkpKQotCi0jZGVmaW5lIE1TUF9NT0RFX0FNX0RFVEVDVCAgIDAKLSNkZWZpbmUgTVNQX01PREVfRk1fUkFESU8gICAgMgotI2RlZmluZSBNU1BfTU9ERV9GTV9URVJSQSAgICAzCi0jZGVmaW5lIE1TUF9NT0RFX0ZNX1NBVCAgICAgIDQKLSNkZWZpbmUgTVNQX01PREVfRk1fTklDQU0xICAgNQotI2RlZmluZSBNU1BfTU9ERV9GTV9OSUNBTTIgICA2Ci0jZGVmaW5lIE1TUF9NT0RFX0FNX05JQ0FNICAgIDcKLSNkZWZpbmUgTVNQX01PREVfQlRTQyAgICAgICAgOAotI2RlZmluZSBNU1BfTU9ERV9FWFRFUk4gICAgICA5Ci0KLXN0YXRpYyBzdHJ1Y3QgTVNQX0lOSVRfREFUQV9ERU0gewotCWludCBmaXIxWzZdOwotCWludCBmaXIyWzZdOwotCWludCBjZG8xOwotCWludCBjZG8yOwotCWludCBhZF9jdjsKLQlpbnQgbW9kZV9yZWc7Ci0JaW50IGRmcF9zcmM7Ci0JaW50IGRmcF9tYXRyaXg7Ci19IG1zcF9pbml0X2RhdGFbXSA9IHsKLQl7CS8qIEFNIChmb3IgY2FycmllciBkZXRlY3QgLyBtc3AzNDAwKSAqLwotCQl7NzUsIDE5LCAzNiwgMzUsIDM5LCA0MH0sCi0JCXs3NSwgMTksIDM2LCAzNSwgMzksIDQwfSwKLQkJTVNQX0NBUlJJRVIoNS41KSwgTVNQX0NBUlJJRVIoNS41KSwKLQkJMHgwMGQwLCAweDA1MDAsIDB4MDAyMCwgMHgzMDAwCi0JfSx7CS8qIEFNIChmb3IgY2FycmllciBkZXRlY3QgLyBtc3AzNDEwKSAqLwotCQl7LTEsIC0xLCAtOCwgMiwgNTksIDEyNn0sCi0JCXstMSwgLTEsIC04LCAyLCA1OSwgMTI2fSwKLQkJTVNQX0NBUlJJRVIoNS41KSwgTVNQX0NBUlJJRVIoNS41KSwKLQkJMHgwMGQwLCAweDAxMDAsIDB4MDAyMCwgMHgzMDAwCi0JfSx7CS8qIEZNIFJhZGlvICovCi0JCXstOCwgLTgsIDQsIDYsIDc4LCAxMDd9LAotCQl7LTgsIC04LCA0LCA2LCA3OCwgMTA3fSwKLQkJTVNQX0NBUlJJRVIoMTAuNyksIE1TUF9DQVJSSUVSKDEwLjcpLAotCQkweDAwZDAsIDB4MDQ4MCwgMHgwMDIwLCAweDMwMDAKLQl9LHsJLyogVGVycmVzdGlhbCBGTS1tb25vICsgRk0tc3RlcmVvICovCi0JCXszLCAxOCwgMjcsIDQ4LCA2NiwgNzJ9LAotCQl7MywgMTgsIDI3LCA0OCwgNjYsIDcyfSwKLQkJTVNQX0NBUlJJRVIoNS41KSwgTVNQX0NBUlJJRVIoNS41KSwKLQkJMHgwMGQwLCAweDA0ODAsIDB4MDAzMCwgMHgzMDAwCi0JfSx7CS8qIFNhdCBGTS1tb25vICovCi0JCXsgMSwgOSwgMTQsIDI0LCAzMywgMzd9LAotCQl7IDMsIDE4LCAyNywgNDgsIDY2LCA3Mn0sCi0JCU1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDYuNSksCi0JCTB4MDBjNiwgMHgwNDgwLCAweDAwMDAsIDB4MzAwMAotCX0sewkvKiBOSUNBTS9GTSAtLSAgQi9HICg1LjUvNS44NSksIEQvSyAoNi41LzUuODUpICovCi0JCXstMiwgLTgsIC0xMCwgMTAsIDUwLCA4Nn0sCi0JCXszLCAxOCwgMjcsIDQ4LCA2NiwgNzJ9LAotCQlNU1BfQ0FSUklFUig1LjUpLCBNU1BfQ0FSUklFUig1LjUpLAotCQkweDAwZDAsIDB4MDA0MCwgMHgwMTIwLCAweDMwMDAKLQl9LHsJLyogTklDQU0vRk0gLS0gSSAoNi4wLzYuNTUyKSAqLwotCQl7MiwgNCwgLTYsIC00LCA0MCwgOTR9LAotCQl7MywgMTgsIDI3LCA0OCwgNjYsIDcyfSwKLQkJTVNQX0NBUlJJRVIoNi4wKSwgTVNQX0NBUlJJRVIoNi4wKSwKLQkJMHgwMGQwLCAweDAwNDAsIDB4MDEyMCwgMHgzMDAwCi0JfSx7CS8qIE5JQ0FNL0FNIC0tIEwgKDYuNS81Ljg1KSAqLwotCQl7LTIsIC04LCAtMTAsIDEwLCA1MCwgODZ9LAotCQl7LTQsIC0xMiwgLTksIDIzLCA3OSwgMTI2fSwKLQkJTVNQX0NBUlJJRVIoNi41KSwgTVNQX0NBUlJJRVIoNi41KSwKLQkJMHgwMGM2LCAweDAxNDAsIDB4MDEyMCwgMHg3YzAzCi0JfSwKLX07Ci0KLXN0cnVjdCBDQVJSSUVSX0RFVEVDVCB7Ci0JaW50ICAgY2RvOwotCWNoYXIgKm5hbWU7Ci19OwotCi1zdGF0aWMgc3RydWN0IENBUlJJRVJfREVURUNUIGNhcnJpZXJfZGV0ZWN0X21haW5bXSA9IHsKLQkvKiBtYWluIGNhcnJpZXIgKi8KLQl7IE1TUF9DQVJSSUVSKDQuNSksICAgICAgICAiNC41ICAgTlRTQyIgICAgICAgICAgICAgICAgICAgfSwKLQl7IE1TUF9DQVJSSUVSKDUuNSksICAgICAgICAiNS41ICAgUEFMIEIvRyIgICAgICAgICAgICAgICAgfSwKLQl7IE1TUF9DQVJSSUVSKDYuMCksICAgICAgICAiNi4wICAgUEFMIEkiICAgICAgICAgICAgICAgICAgfSwKLQl7IE1TUF9DQVJSSUVSKDYuNSksICAgICAgICAiNi41ICAgUEFMIEQvSyArIFNBVCArIFNFQ0FNIiAgfQotfTsKLQotc3RhdGljIHN0cnVjdCBDQVJSSUVSX0RFVEVDVCBjYXJyaWVyX2RldGVjdF81NVtdID0gewotCS8qIFBBTCBCL0cgKi8KLQl7IE1TUF9DQVJSSUVSKDUuNzQyMTg3NSksICAiNS43NDIgUEFMIEIvRyBGTS1zdGVyZW8iICAgICB9LAotCXsgTVNQX0NBUlJJRVIoNS44NSksICAgICAgICI1Ljg1ICBQQUwgQi9HIE5JQ0FNIiAgICAgICAgIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgQ0FSUklFUl9ERVRFQ1QgY2Fycmllcl9kZXRlY3RfNjVbXSA9IHsKLQkvKiBQQUwgU0FUIC8gU0VDQU0gKi8KLQl7IE1TUF9DQVJSSUVSKDUuODUpLCAgICAgICAiNS44NSAgUEFMIEQvSyArIFNFQ0FNIE5JQ0FNIiB9LAotCXsgTVNQX0NBUlJJRVIoNi4yNTc4MTI1KSwgICI2LjI1ICBQQUwgRC9LMSBGTS1zdGVyZW8iIH0sCi0JeyBNU1BfQ0FSUklFUig2Ljc0MjE4NzUpLCAgIjYuNzQgIFBBTCBEL0syIEZNLXN0ZXJlbyIgfSwKLQl7IE1TUF9DQVJSSUVSKDcuMDIpLCAgICAgICAiNy4wMiAgUEFMIFNBVCBGTS1zdGVyZW8gcy9iIiB9LAotCXsgTVNQX0NBUlJJRVIoNy4yMCksICAgICAgICI3LjIwICBQQUwgU0FUIEZNLXN0ZXJlbyBzIiAgIH0sCi0JeyBNU1BfQ0FSUklFUig3LjM4KSwgICAgICAgIjcuMzggIFBBTCBTQVQgRk0tc3RlcmVvIGIiICAgfSwKLX07Ci0KLSNkZWZpbmUgQ0FSUklFUl9DT1VOVCh4KSAoc2l6ZW9mKHgpL3NpemVvZihzdHJ1Y3QgQ0FSUklFUl9ERVRFQ1QpKQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCi0gKiBiaXRzICA5ICA4ICA1IC0gU0NBUlQgRFNQIGlucHV0IFNlbGVjdDoKLSAqICAgICAgIDAgIDAgIDAgLSBTQ0FSVCAxIHRvIERTUCBpbnB1dCAocmVzZXQgcG9zaXRpb24pCi0gKiAgICAgICAwICAxICAwIC0gTU9OTyB0byBEU1AgaW5wdXQKLSAqICAgICAgIDEgIDAgIDAgLSBTQ0FSVCAyIHRvIERTUCBpbnB1dAotICogICAgICAgMSAgMSAgMSAtIE11dGUgRFNQIGlucHV0Ci0gKgotICogYml0cyAxMSAxMCAgNiAtIFNDQVJUIDEgT3V0cHV0IFNlbGVjdDoKLSAqICAgICAgIDAgIDAgIDAgLSB1bmRlZmluZWQgKHJlc2V0IHBvc2l0aW9uKQotICogICAgICAgMCAgMSAgMCAtIFNDQVJUIDIgSW5wdXQgdG8gU0NBUlQgMSBPdXRwdXQgKGZvciBkZXZpY2VzIHdpdGggMiBTQ0FSVFMpCi0gKiAgICAgICAxICAwICAwIC0gTU9OTyBpbnB1dCB0byBTQ0FSVCAxIE91dHB1dAotICogICAgICAgMSAgMSAgMCAtIFNDQVJUIDEgREEgdG8gU0NBUlQgMSBPdXRwdXQKLSAqICAgICAgIDAgIDAgIDEgLSBTQ0FSVCAyIERBIHRvIFNDQVJUIDEgT3V0cHV0Ci0gKiAgICAgICAwICAxICAxIC0gU0NBUlQgMSBJbnB1dCB0byBTQ0FSVCAxIE91dHB1dAotICogICAgICAgMSAgMSAgMSAtIE11dGUgU0NBUlQgMSBPdXRwdXQKLSAqCi0gKiBiaXRzIDEzIDEyICA3IC0gU0NBUlQgMiBPdXRwdXQgU2VsZWN0IChmb3IgZGV2aWNlcyB3aXRoIDIgT3V0cHV0IFNDQVJUKToKLSAqICAgICAgIDAgIDAgIDAgLSBTQ0FSVCAxIERBIHRvIFNDQVJUIDIgT3V0cHV0IChyZXNldCBwb3NpdGlvbikKLSAqICAgICAgIDAgIDEgIDAgLSBTQ0FSVCAxIElucHV0IHRvIFNDQVJUIDIgT3V0cHV0Ci0gKiAgICAgICAxICAwICAwIC0gTU9OTyBpbnB1dCB0byBTQ0FSVCAyIE91dHB1dAotICogICAgICAgMCAgMCAgMSAtIFNDQVJUIDIgREEgdG8gU0NBUlQgMiBPdXRwdXQKLSAqICAgICAgIDAgIDEgIDEgLSBTQ0FSVCAyIElucHV0IHRvIFNDQVJUIDIgT3V0cHV0Ci0gKiAgICAgICAxICAxICAwIC0gTXV0ZSBTQ0FSVCAyIE91dHB1dAotICoKLSAqIEJpdHMgNCB0byAwIHNob3VsZCBiZSB6ZXJvLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIGludCBzY2FydHNbM11bOV0gPSB7Ci0JLyogTUFTSyAgICBJTjEgICAgIElOMiAgICAgSU4xX0RBICBJTjJfREEgIElOMyAgICAgSU40ICAgICBNT05PICAgIE1VVEUgICAqLwotCS8qIFNDQVJUIERTUCBJbnB1dCBzZWxlY3QgKi8KLQl7IDB4MDMyMCwgMHgwMDAwLCAweDAyMDAsIC0xLCAgICAgLTEsICAgICAweDAzMDAsIDB4MDAyMCwgMHgwMTAwLCAweDAzMjAgfSwKLQkvKiBTQ0FSVDEgT3V0cHV0IHNlbGVjdCAqLwotCXsgMHgwYzQwLCAweDA0NDAsIDB4MDQwMCwgMHgwYzAwLCAweDAwNDAsIDB4MDAwMCwgMHgwODQwLCAweDA4MDAsIDB4MGM0MCB9LAotCS8qIFNDQVJUMiBPdXRwdXQgc2VsZWN0ICovCi0JeyAweDMwODAsIDB4MTAwMCwgMHgxMDgwLCAweDAwMDAsIDB4MDA4MCwgMHgyMDgwLCAweDMwODAsIDB4MjAwMCwgMHgzMDAwIH0sCi19OwotCi1zdGF0aWMgY2hhciAqc2NhcnRfbmFtZXNbXSA9IHsKLQkibWFzayIsICJpbjEiLCAiaW4yIiwgImluMSBkYSIsICJpbjIgZGEiLCAiaW4zIiwgImluNCIsICJtb25vIiwgIm11dGUiCi19OwotCi1zdGF0aWMgdm9pZCBtc3AzNDAwY19zZXRfc2NhcnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGluLCBpbnQgb3V0KQotewotCXN0cnVjdCBtc3AzNDAwYyAqbXNwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQltc3AtPmluX3NjYXJ0PWluOwotCi0JaWYgKGluID49IDEgJiYgaW4gPD0gOCAmJiBvdXQgPj0gMCAmJiBvdXQgPD0gMikgewotCQlpZiAoLTEgPT0gc2NhcnRzW291dF1baW5dKQotCQkJcmV0dXJuOwotCi0JCW1zcC0+YWNiICY9IH5zY2FydHNbb3V0XVtTQ0FSVF9NQVNLXTsKLQkJbXNwLT5hY2IgfD0gIHNjYXJ0c1tvdXRdW2luXTsKLQl9IGVsc2UKLQkJbXNwLT5hY2IgPSAweGY2MDsgLyogTXV0ZSBJbnB1dCBhbmQgU0NBUlQgMSBPdXRwdXQgKi8KLQotCW1zcDM0MDBfZGJnKCJzY2FydCBzd2l0Y2g6ICVzID0+ICVkIChBQ0I9MHglMDR4KVxuIiwKLQkJCQkJCXNjYXJ0X25hbWVzW2luXSwgb3V0LCBtc3AtPmFjYik7Ci0JbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MTMsIG1zcC0+YWNiKTsKLQotCS8qIFNldHMgSTJTIHNwZWVkIDAgPSAxLjAyNCBNYnBzLCAxID0gMi4wNDggTWJwcyAqLwotCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREVNLCAweDQwLCBtc3AtPmkyc19tb2RlKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyB2b2lkIG1zcDM0MDBjX3NldGNhcnJpZXIoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGNkbzEsIGludCBjZG8yKQotewotCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREVNLCAweDAwOTMsIGNkbzEgJiAweGZmZik7Ci0JbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERU0sIDB4MDA5YiwgY2RvMSA+PiAxMik7Ci0JbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERU0sIDB4MDBhMywgY2RvMiAmIDB4ZmZmKTsKLQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RFTSwgMHgwMGFiLCBjZG8yID4+IDEyKTsKLQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RFTSwgMHgwMDU2LCAwKTsgLypMT0FEX1JFR18xLzIqLwotfQotCi1zdGF0aWMgdm9pZCBtc3AzNDAwY19zZXR2b2x1bWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCSAgICAgICBpbnQgbXV0ZWQsIGludCBsZWZ0LCBpbnQgcmlnaHQpCi0gewotCWludCB2b2wgPSAwLCB2YWwgPSAwLCBiYWxhbmNlID0gMDsKLQotCWlmICghbXV0ZWQpIHsKLQkJLyogMHg3ZiBpbnN0ZWFkIGlmIDB4NzMgaGVyZSBoYXMgc291bmQgcXVhbGl0eSBpc3N1ZXMsCi0JCSAqIHByb2JhYmx5IGR1ZSB0byBvdmVybW9kdWxhdGlvbiArIGNsaXBwaW5nIC4uLiAqLwotCQl2b2wgPSAobGVmdCA+IHJpZ2h0KSA/IGxlZnQgOiByaWdodDsKLQkJdmFsID0gKHZvbCAqIDB4NzMgLyA2NTUzNSkgPDwgODsKLQl9Ci0JaWYgKHZvbCA+IDApIHsKLQkJYmFsYW5jZSA9ICgocmlnaHQgLSBsZWZ0KSAqIDEyNykgLyB2b2w7Ci0JfQotCi0JbXNwMzQwMF9kYmcoInNldHZvbHVtZTogbXV0ZT0lcyAlZDolZCAgdj0weCUwMnggYj0weCUwMnhcbiIsCi0JCW11dGVkID8gIm9uIiA6ICJvZmYiLCBsZWZ0LCByaWdodCwgdmFsID4+IDgsIGJhbGFuY2UpOwotCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDAwMDAsIHZhbCk7IC8qIGxvdWRzcGVha2VyICovCi0JbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDAwNiwgdmFsKTsgLyogaGVhZHBob25lcyAgKi8KLQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDA3LAotCQkJCQltdXRlZCA/IDB4MSA6ICh2YWwgfCAweDEpKTsKLQltc3AzNDAwY193cml0ZShjbGllbnQsIEkyQ19NU1AzNDAwQ19ERlAsIDB4MDAwMSwgYmFsYW5jZSA8PCA4KTsKLX0KLQotc3RhdGljIHZvaWQgbXNwMzQwMGNfc2V0YmFzcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgYmFzcykKLXsKLQlpbnQgdmFsID0gKChiYXNzLTMyNzY4KSAqIDB4NjAgLyA2NTUzNSkgPDwgODsKLQotCW1zcDM0MDBfZGJnKCJzZXRiYXNzOiAlZCAweCUwMnhcbiIsIGJhc3MsIHZhbCA+PiA4KTsKLQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDAyLCB2YWwpOyAvKiBsb3Vkc3BlYWtlciAqLwotfQotCi1zdGF0aWMgdm9pZCBtc3AzNDAwY19zZXR0cmVibGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHRyZWJsZSkKLXsKLQlpbnQgdmFsID0gKCh0cmVibGUtMzI3NjgpICogMHg2MCAvIDY1NTM1KSA8PCA4OwotCi0JbXNwMzQwMF9kYmcoInNldHRyZWJsZTogJWQgMHglMDJ4XG4iLHRyZWJsZSwgdmFsPj44KTsKLQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDAzLCB2YWwpOyAvKiBsb3Vkc3BlYWtlciAqLwotfQotCi1zdGF0aWMgdm9pZCBtc3AzNDAwY19zZXRtb2RlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCB0eXBlKQotewotCXN0cnVjdCBtc3AzNDAwYyAqbXNwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JaW50IGk7Ci0KLQltc3AzNDAwX2RiZygic2V0bW9kZTogJWRcbiIsdHlwZSk7Ci0JbXNwLT5tb2RlICAgICAgID0gdHlwZTsKLQltc3AtPmF1ZG1vZGUgICAgPSBWNEwyX1RVTkVSX01PREVfTU9OTzsKLQltc3AtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05POwotCi0JbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERU0sIDB4MDBiYiwgICAgICAgICAgLyogYWRfY3YgKi8KLQkJICAgICAgIG1zcF9pbml0X2RhdGFbdHlwZV0uYWRfY3YpOwotCi0JZm9yIChpID0gNTsgaSA+PSAwOyBpLS0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXIgMSAqLwotCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RFTSwgMHgwMDAxLAotCQkJICAgICAgIG1zcF9pbml0X2RhdGFbdHlwZV0uZmlyMVtpXSk7Ci0KLQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RFTSwgMHgwMDA1LCAweDAwMDQpOyAvKiBmaXIgMiAqLwotCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREVNLCAweDAwMDUsIDB4MDA0MCk7Ci0JbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERU0sIDB4MDAwNSwgMHgwMDAwKTsKLQlmb3IgKGkgPSA1OyBpID49IDA7IGktLSkKLQkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERU0sIDB4MDAwNSwKLQkJCSAgICAgICBtc3BfaW5pdF9kYXRhW3R5cGVdLmZpcjJbaV0pOwotCi0JbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERU0sIDB4MDA4MywgICAgIC8qIE1PREVfUkVHICovCi0JCSAgICAgICBtc3BfaW5pdF9kYXRhW3R5cGVdLm1vZGVfcmVnKTsKLQotCW1zcDM0MDBjX3NldGNhcnJpZXIoY2xpZW50LCBtc3BfaW5pdF9kYXRhW3R5cGVdLmNkbzEsCi0JCQkgICAgbXNwX2luaXRfZGF0YVt0eXBlXS5jZG8yKTsKLQotCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREVNLCAweDAwNTYsIDApOyAvKkxPQURfUkVHXzEvMiovCi0KLQlpZiAoZG9sYnkpIHsKLQkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDAwOCwKLQkJCSAgICAgICAweDA1MjApOyAvKiBJMlMxICovCi0JCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDAwMDksCi0JCQkgICAgICAgMHgwNjIwKTsgLyogSTJTMiAqLwotCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDBiLAotCQkJICAgICAgIG1zcF9pbml0X2RhdGFbdHlwZV0uZGZwX3NyYyk7Ci0JfSBlbHNlIHsKLQkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDAwOCwKLQkJCSAgICAgICBtc3BfaW5pdF9kYXRhW3R5cGVdLmRmcF9zcmMpOwotCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDA5LAotCQkJICAgICAgIG1zcF9pbml0X2RhdGFbdHlwZV0uZGZwX3NyYyk7Ci0JCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDAwMGIsCi0JCQkgICAgICAgbXNwX2luaXRfZGF0YVt0eXBlXS5kZnBfc3JjKTsKLQl9Ci0JbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDAwYSwKLQkJICAgICAgIG1zcF9pbml0X2RhdGFbdHlwZV0uZGZwX3NyYyk7Ci0JbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDAwZSwKLQkJICAgICAgIG1zcF9pbml0X2RhdGFbdHlwZV0uZGZwX21hdHJpeCk7Ci0KLQlpZiAoSEFWRV9OSUNBTShtc3ApKSB7Ci0JCS8qIG5pY2FtIHByZXNjYWxlICovCi0JCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDAwMTAsIDB4NWEwMCk7IC8qIHdhczogMHgzMDAwICovCi0JfQotfQotCi0vKiBnaXZlbiBhIGJpdG1hc2sgb2YgVklERU9fU09VTkRfWFhYIHJldHVybnMgdGhlICJiZXN0IiBpbiB0aGUgYml0bWFzayAqLwotc3RhdGljIGludCBiZXN0X3ZpZGVvX3NvdW5kKGludCByeHN1YmNoYW5zKQotewotCWlmIChyeHN1YmNoYW5zICYgVjRMMl9UVU5FUl9TVUJfU1RFUkVPKQotCQlyZXR1cm4gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKLQlpZiAocnhzdWJjaGFucyAmIFY0TDJfVFVORVJfU1VCX0xBTkcxKQotCQlyZXR1cm4gVjRMMl9UVU5FUl9NT0RFX0xBTkcxOwotCWlmIChyeHN1YmNoYW5zICYgVjRMMl9UVU5FUl9TVUJfTEFORzIpCi0JCXJldHVybiBWNEwyX1RVTkVSX01PREVfTEFORzI7Ci0JcmV0dXJuIFY0TDJfVFVORVJfTU9ERV9NT05POwotfQotCi0vKiB0dXJuIG9uL29mZiBuaWNhbSArIHN0ZXJlbyAqLwotc3RhdGljIHZvaWQgbXNwMzQwMGNfc2V0c3RlcmVvKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBtb2RlKQotewotCXN0YXRpYyBjaGFyICpzdHJtb2RlW10gPSB7ICIwIiwgIm1vbm8iLCAic3RlcmVvIiwgIjMiLAotCQkibGFuZzEiLCAiNSIsICI2IiwgIjciLCAibGFuZzIiCi0JfTsKLQlzdHJ1Y3QgbXNwMzQwMGMgKm1zcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCWludCBuaWNhbSA9IDA7CQkvKiBjaGFubmVsIHNvdXJjZTogRk0vQU0gb3IgbmljYW0gKi8KLQlpbnQgc3JjID0gMDsKLQotCWlmIChJU19NU1AzNFhYX0cobXNwKSkgewotCQkvKiB0aGlzIG1ldGhvZCB3b3VsZCBicmVhayBldmVyeXRoaW5nLCBsZXQncyBtYWtlIHN1cmUKLQkJICogaXQncyBuZXZlciBjYWxsZWQKLQkJICovCi0JCW1zcDM0MDBfZGJnCi0JCSAgICAoIkRFQlVHIFdBUk5JTkcgc2V0c3RlcmVvIGNhbGxlZCB3aXRoIG1vZGU9JWQgaW5zdGVhZCBvZiBzZXRfc291cmNlIChpZ25vcmVkKVxuIiwKLQkJICAgICBtb2RlKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIHN3aXRjaCBkZW1vZHVsYXRvciAqLwotCXN3aXRjaCAobXNwLT5tb2RlKSB7Ci0JY2FzZSBNU1BfTU9ERV9GTV9URVJSQToKLQkJbXNwMzQwMF9kYmcoIkZNIHNldHN0ZXJlbzogJXNcbiIsIHN0cm1vZGVbbW9kZV0pOwotCQltc3AzNDAwY19zZXRjYXJyaWVyKGNsaWVudCxtc3AtPnNlY29uZCxtc3AtPm1haW4pOwotCQlzd2l0Y2ggKG1vZGUpIHsKLQkJY2FzZSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOgotCQkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDAwZSwgMHgzMDAxKTsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfVFVORVJfTU9ERV9NT05POgotCQljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMToKLQkJY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzI6Ci0JCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDBlLCAweDMwMDApOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBNU1BfTU9ERV9GTV9TQVQ6Ci0JCW1zcDM0MDBfZGJnKCJTQVQgc2V0c3RlcmVvOiAlc1xuIiwgc3RybW9kZVttb2RlXSk7Ci0JCXN3aXRjaCAobW9kZSkgewotCQljYXNlIFY0TDJfVFVORVJfTU9ERV9NT05POgotCQkJbXNwMzQwMGNfc2V0Y2FycmllcihjbGllbnQsIE1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDYuNSkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9UVU5FUl9NT0RFX1NURVJFTzoKLQkJCW1zcDM0MDBjX3NldGNhcnJpZXIoY2xpZW50LCBNU1BfQ0FSUklFUig3LjIpLCBNU1BfQ0FSUklFUig3LjAyKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzE6Ci0JCQltc3AzNDAwY19zZXRjYXJyaWVyKGNsaWVudCwgTVNQX0NBUlJJRVIoNy4zOCksIE1TUF9DQVJSSUVSKDcuMDIpKTsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMjoKLQkJCW1zcDM0MDBjX3NldGNhcnJpZXIoY2xpZW50LCBNU1BfQ0FSUklFUig3LjM4KSwgTVNQX0NBUlJJRVIoNy4wMikpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBNU1BfTU9ERV9GTV9OSUNBTTE6Ci0JY2FzZSBNU1BfTU9ERV9GTV9OSUNBTTI6Ci0JY2FzZSBNU1BfTU9ERV9BTV9OSUNBTToKLQkJbXNwMzQwMF9kYmcoIk5JQ0FNIHNldHN0ZXJlbzogJXNcbiIsc3RybW9kZVttb2RlXSk7Ci0JCW1zcDM0MDBjX3NldGNhcnJpZXIoY2xpZW50LG1zcC0+c2Vjb25kLG1zcC0+bWFpbik7Ci0JCWlmIChtc3AtPm5pY2FtX29uKQotCQkJbmljYW09MHgwMTAwOwotCQlicmVhazsKLQljYXNlIE1TUF9NT0RFX0JUU0M6Ci0JCW1zcDM0MDBfZGJnKCJCVFNDIHNldHN0ZXJlbzogJXNcbiIsc3RybW9kZVttb2RlXSk7Ci0JCW5pY2FtPTB4MDMwMDsKLQkJYnJlYWs7Ci0JY2FzZSBNU1BfTU9ERV9FWFRFUk46Ci0JCW1zcDM0MDBfZGJnKCJleHRlcm4gc2V0c3RlcmVvOiAlc1xuIixzdHJtb2RlW21vZGVdKTsKLQkJbmljYW0gPSAweDAyMDA7Ci0JCWJyZWFrOwotCWNhc2UgTVNQX01PREVfRk1fUkFESU86Ci0JCW1zcDM0MDBfZGJnKCJGTS1SYWRpbyBzZXRzdGVyZW86ICVzXG4iLHN0cm1vZGVbbW9kZV0pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQltc3AzNDAwX2RiZygibW9ubyBzZXRzdGVyZW9cbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogc3dpdGNoIGF1ZGlvICovCi0Jc3dpdGNoIChiZXN0X3ZpZGVvX3NvdW5kKG1vZGUpKSB7Ci0JY2FzZSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOgotCQlzcmMgPSAweDAwMjAgfCBuaWNhbTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX1RVTkVSX01PREVfTU9OTzoKLQkJaWYgKG1zcC0+bW9kZSA9PSBNU1BfTU9ERV9BTV9OSUNBTSkgewotCQkJbXNwMzQwMF9kYmcoInN3aXRjaGluZyB0byBBTSBtb25vXG4iKTsKLQkJCS8qIEFNIG1vbm8gZGVjb2RpbmcgaXMgaGFuZGxlZCBieSB0dW5lciwgbm90IE1TUCBjaGlwICovCi0JCQkvKiBTQ0FSVCBzd2l0Y2hpbmcgY29udHJvbCByZWdpc3RlciAqLwotCQkJbXNwMzQwMGNfc2V0X3NjYXJ0KGNsaWVudCxTQ0FSVF9NT05PLDApOwotCQkJc3JjID0gMHgwMjAwOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMToKLQkJc3JjID0gMHgwMDAwIHwgbmljYW07Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcyOgotCQlzcmMgPSAweDAwMTAgfCBuaWNhbTsKLQkJYnJlYWs7Ci0JfQotCW1zcDM0MDBfZGJnKCJzZXRzdGVyZW8gZmluYWwgc291cmNlL21hdHJpeCA9IDB4JXhcbiIsIHNyYyk7Ci0KLQlpZiAoZG9sYnkpIHsKLQkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDAwOCwweDA1MjApOwotCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDA5LDB4MDYyMCk7Ci0JCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDAwMGEsc3JjKTsKLQkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDAwYixzcmMpOwotCX0gZWxzZSB7Ci0JCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDAwMDgsc3JjKTsKLQkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDAwOSxzcmMpOwotCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDBhLHNyYyk7Ci0JCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDAwMGIsc3JjKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1tc3AzNDAwY19wcmludF9tb2RlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IG1zcDM0MDBjICptc3AgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCWlmIChtc3AtPm1haW4gPT0gbXNwLT5zZWNvbmQpIHsKLQkJbXNwMzQwMF9kYmcoIm1vbm8gc291bmQgY2FycmllcjogJWQuJTAzZCBNSHpcbiIsCi0JCSAgICAgICBtc3AtPm1haW4vOTEwMDAwLChtc3AtPm1haW4vOTEwKSUxMDAwKTsKLQl9IGVsc2UgewotCQltc3AzNDAwX2RiZygibWFpbiBzb3VuZCBjYXJyaWVyOiAlZC4lMDNkIE1IelxuIiwKLQkJICAgICAgIG1zcC0+bWFpbi85MTAwMDAsKG1zcC0+bWFpbi85MTApJTEwMDApOwotCX0KLQlpZiAobXNwLT5tb2RlID09IE1TUF9NT0RFX0ZNX05JQ0FNMSB8fCBtc3AtPm1vZGUgPT0gTVNQX01PREVfRk1fTklDQU0yKQotCQltc3AzNDAwX2RiZygiTklDQU0vRk0gY2FycmllciAgIDogJWQuJTAzZCBNSHpcbiIsCi0JCSAgICAgICBtc3AtPnNlY29uZC85MTAwMDAsKG1zcC0+c2Vjb25kLzkxMCklMTAwMCk7Ci0JaWYgKG1zcC0+bW9kZSA9PSBNU1BfTU9ERV9BTV9OSUNBTSkKLQkJbXNwMzQwMF9kYmcoIk5JQ0FNL0FNIGNhcnJpZXIgICA6ICVkLiUwM2QgTUh6XG4iLAotCQkgICAgICAgbXNwLT5zZWNvbmQvOTEwMDAwLChtc3AtPnNlY29uZC85MTApJTEwMDApOwotCWlmIChtc3AtPm1vZGUgPT0gTVNQX01PREVfRk1fVEVSUkEgJiYKLQkgICAgbXNwLT5tYWluICE9IG1zcC0+c2Vjb25kKSB7Ci0JCW1zcDM0MDBfZGJnKCJGTS1zdGVyZW8gY2FycmllciA6ICVkLiUwM2QgTUh6XG4iLAotCQkgICAgICAgbXNwLT5zZWNvbmQvOTEwMDAwLChtc3AtPnNlY29uZC85MTApJTEwMDApOwotCX0KLX0KLQotI2RlZmluZSBNU1AzNDAwX01BWCA0Ci1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgKm1zcHNbTVNQMzQwMF9NQVhdOwotc3RhdGljIHZvaWQgbXNwMzQwMGNfcmVzdG9yZV9kZnAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgbXNwMzQwMGMgKm1zcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IERGUF9DT1VOVDsgaSsrKSB7Ci0JCWlmICgtMSA9PSBtc3AtPmRmcF9yZWdzW2ldKQotCQkJY29udGludWU7Ci0JCW1zcDM0MDBjX3dyaXRlKGNsaWVudCwgSTJDX01TUDM0MDBDX0RGUCwgaSwgbXNwLT5kZnBfcmVnc1tpXSk7Ci0JfQotfQotCi0vKiBpZiB0aGUgZGZwX3JlZ3MgaXMgc2V0LCBzZXQgd2hhdCdzIGluIHRoZXJlLiBPdGhlcndpc2UsIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSAqLwotc3RhdGljIGludCBtc3AzNDAwY193cml0ZV9kZnBfd2l0aF9kZWZhdWx0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkJCWludCBhZGRyLCBpbnQgZGVmYXVsdF92YWx1ZSkKLXsKLQlzdHJ1Y3QgbXNwMzQwMGMgKm1zcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCWludCB2YWx1ZSA9IGRlZmF1bHRfdmFsdWU7Ci0JaWYgKGFkZHIgPCBERlBfQ09VTlQgJiYgLTEgIT0gbXNwLT5kZnBfcmVnc1thZGRyXSkKLQkJdmFsdWUgPSBtc3AtPmRmcF9yZWdzW2FkZHJdOwotCXJldHVybiBtc3AzNDAwY193cml0ZShjbGllbnQsIEkyQ19NU1AzNDAwQ19ERlAsIGFkZHIsIHZhbHVlKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RydWN0IFJFR0lTVEVSX0RVTVAgewotCWludCAgIGFkZHI7Ci0JY2hhciAqbmFtZTsKLX07Ci0KLXN0cnVjdCBSRUdJU1RFUl9EVU1QIGQxW10gPSB7Ci0JezB4MDA3ZSwgImF1dG9kZXRlY3QifSwKLQl7MHgwMDIzLCAiQ19BRF9CSVRTICJ9LAotCXsweDAwMzgsICJBRERfQklUUyAgIn0sCi0JezB4MDAzZSwgIkNJQl9CSVRTICAifSwKLQl7MHgwMDU3LCAiRVJST1JfUkFURSJ9LAotfTsKLQotc3RhdGljIGludCBhdXRvZGV0ZWN0X3N0ZXJlbyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBtc3AzNDAwYyAqbXNwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JaW50IHZhbDsKLQlpbnQgcnhzdWJjaGFucyA9IG1zcC0+cnhzdWJjaGFuczsKLQlpbnQgbmV3bmljYW0gICA9IG1zcC0+bmljYW1fb247Ci0JaW50IHVwZGF0ZSA9IDA7Ci0KLQlzd2l0Y2ggKG1zcC0+bW9kZSkgewotCWNhc2UgTVNQX01PREVfRk1fVEVSUkE6Ci0JCXZhbCA9IG1zcDM0MDBjX3JlYWQoY2xpZW50LCBJMkNfTVNQMzQwMENfREZQLCAweDE4KTsKLQkJaWYgKHZhbCA+IDMyNzY3KQotCQkJdmFsIC09IDY1NTM2OwotCQltc3AzNDAwX2RiZygic3RlcmVvIGRldGVjdCByZWdpc3RlcjogJWRcbiIsdmFsKTsKLQkJaWYgKHZhbCA+IDQwOTYpIHsKLQkJCXJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9TVEVSRU8gfCBWNEwyX1RVTkVSX1NVQl9NT05POwotCQl9IGVsc2UgaWYgKHZhbCA8IC00MDk2KSB7Ci0JCQlyeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTEFORzEgfCBWNEwyX1RVTkVSX1NVQl9MQU5HMjsKLQkJfSBlbHNlIHsKLQkJCXJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05POwotCQl9Ci0JCW5ld25pY2FtID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBNU1BfTU9ERV9GTV9OSUNBTTE6Ci0JY2FzZSBNU1BfTU9ERV9GTV9OSUNBTTI6Ci0JY2FzZSBNU1BfTU9ERV9BTV9OSUNBTToKLQkJdmFsID0gbXNwMzQwMGNfcmVhZChjbGllbnQsIEkyQ19NU1AzNDAwQ19ERU0sIDB4MjMpOwotCQltc3AzNDAwX2RiZygibmljYW0gc3luYz0lZCwgbW9kZT0lZFxuIiwKLQkJCXZhbCAmIDEsICh2YWwgJiAweDFlKSA+PiAxKTsKLQotCQlpZiAodmFsICYgMSkgewotCQkJLyogbmljYW0gc3luY2VkICovCi0JCQlzd2l0Y2ggKCh2YWwgJiAweDFlKSA+PiAxKSAgewotCQkJY2FzZSAwOgotCQkJY2FzZSA4OgotCQkJCXJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQljYXNlIDk6Ci0JCQkJcnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX01PTk8KLQkJCQkJfCBWNEwyX1RVTkVSX1NVQl9MQU5HMTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCWNhc2UgMTA6Ci0JCQkJcnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX01PTk8KLQkJCQkJfCBWNEwyX1RVTkVSX1NVQl9MQU5HMQotCQkJCQl8IFY0TDJfVFVORVJfU1VCX0xBTkcyOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCW5ld25pY2FtPTE7Ci0JCX0gZWxzZSB7Ci0JCQluZXduaWNhbSA9IDA7Ci0JCQlyeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKLQkJfQotCQlicmVhazsKLQljYXNlIE1TUF9NT0RFX0JUU0M6Ci0JCXZhbCA9IG1zcDM0MDBjX3JlYWQoY2xpZW50LCBJMkNfTVNQMzQwMENfREVNLCAweDIwMCk7Ci0JCW1zcDM0MDBfZGJnKCJzdGF0dXM9MHgleCAocHJpPSVzLCBzZWM9JXMsICVzJXMlcylcbiIsCi0JCQl2YWwsCi0JCQkodmFsICYgMHgwMDAyKSA/ICJubyIgICAgIDogInllcyIsCi0JCQkodmFsICYgMHgwMDA0KSA/ICJubyIgICAgIDogInllcyIsCi0JCQkodmFsICYgMHgwMDQwKSA/ICJzdGVyZW8iIDogIm1vbm8iLAotCQkJKHZhbCAmIDB4MDA4MCkgPyAiLCBuaWNhbSAybmQgbW9ubyIgOiAiIiwKLQkJCSh2YWwgJiAweDAxMDApID8gIiwgYmlsaW5ndWFsL1NBUCIgIDogIiIpOwotCQlyeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKLQkJaWYgKHZhbCAmIDB4MDA0MCkgcnhzdWJjaGFucyB8PSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87Ci0JCWlmICh2YWwgJiAweDAxMDApIHJ4c3ViY2hhbnMgfD0gVjRMMl9UVU5FUl9TVUJfTEFORzE7Ci0JCWJyZWFrOwotCX0KLQlpZiAocnhzdWJjaGFucyAhPSBtc3AtPnJ4c3ViY2hhbnMpIHsKLQkJdXBkYXRlID0gMTsKLQkJbXNwMzQwMF9kYmcoIndhdGNoOiByeHN1YmNoYW5zICVkID0+ICVkXG4iLAotCQkJbXNwLT5yeHN1YmNoYW5zLHJ4c3ViY2hhbnMpOwotCQltc3AtPnJ4c3ViY2hhbnMgPSByeHN1YmNoYW5zOwotCX0KLQlpZiAobmV3bmljYW0gIT0gbXNwLT5uaWNhbV9vbikgewotCQl1cGRhdGUgPSAxOwotCQltc3AzNDAwX2RiZygid2F0Y2g6IG5pY2FtICVkID0+ICVkXG4iLAotCQkJbXNwLT5uaWNhbV9vbixuZXduaWNhbSk7Ci0JCW1zcC0+bmljYW1fb24gPSBuZXduaWNhbTsKLQl9Ci0JcmV0dXJuIHVwZGF0ZTsKLX0KLQotLyoKLSAqIEEga2VybmVsIHRocmVhZCBmb3IgbXNwMzQwMCBjb250cm9sIC0tIHdlIGRvbid0IHdhbnQgdG8gYmxvY2sgdGhlCi0gKiBpbiB0aGUgaW9jdGwgd2hpbGUgZG9pbmcgdGhlIHNvdW5kIGNhcnJpZXIgJiBzdGVyZW8gZGV0ZWN0Ci0gKi8KLQotc3RhdGljIGludCBtc3AzNHh4X3NsZWVwKHN0cnVjdCBtc3AzNDAwYyAqbXNwLCBpbnQgdGltZW91dCkKLXsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQotCWFkZF93YWl0X3F1ZXVlKCZtc3AtPndxLCAmd2FpdCk7Ci0JaWYgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKLQkJaWYgKHRpbWVvdXQgPCAwKSB7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJc2NoZWR1bGUoKTsKLQkJfSBlbHNlIHsKLQkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZQotCQkJCQkJKG1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpOwotCQl9Ci0JfQotCi0JcmVtb3ZlX3dhaXRfcXVldWUoJm1zcC0+d3EsICZ3YWl0KTsKLQl0cnlfdG9fZnJlZXplKCk7Ci0JcmV0dXJuIG1zcC0+cmVzdGFydDsKLX0KLQotLyogc3RlcmVvL211bHRpbGFuZyBtb25pdG9yaW5nICovCi1zdGF0aWMgdm9pZCB3YXRjaF9zdGVyZW8oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgbXNwMzQwMGMgKm1zcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0JaWYgKGF1dG9kZXRlY3Rfc3RlcmVvKGNsaWVudCkpIHsKLQkJaWYgKG1zcC0+c3RlcmVvICYgVjRMMl9UVU5FUl9NT0RFX1NURVJFTykKLQkJCW1zcDM0MDBjX3NldHN0ZXJlbyhjbGllbnQsIFY0TDJfVFVORVJfTU9ERV9TVEVSRU8pOwotCQllbHNlIGlmIChtc3AtPnN0ZXJlbyAmIFZJREVPX1NPVU5EX0xBTkcxKQotCQkJbXNwMzQwMGNfc2V0c3RlcmVvKGNsaWVudCwgVjRMMl9UVU5FUl9NT0RFX0xBTkcxKTsKLQkJZWxzZQotCQkJbXNwMzQwMGNfc2V0c3RlcmVvKGNsaWVudCwgVjRMMl9UVU5FUl9NT0RFX01PTk8pOwotCX0KLQotCWlmIChvbmNlKQotCQltc3AtPndhdGNoX3N0ZXJlbyA9IDA7Ci19Ci0KLQotc3RhdGljIGludCBtc3AzNDAwY190aHJlYWQodm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YTsKLQlzdHJ1Y3QgbXNwMzQwMGMgKm1zcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCXN0cnVjdCBDQVJSSUVSX0RFVEVDVCAqY2Q7Ci0JaW50IGNvdW50LCBtYXgxLG1heDIsdmFsMSx2YWwyLCB2YWwsdGhpczsKLQotCi0JbXNwMzQwMF9pbmZvKCJtc3AzNDAwIGRhZW1vbiBzdGFydGVkXG4iKTsKLQlmb3IgKDs7KSB7Ci0JCW1zcDM0MDBfZGJnX21lZGl1bXZvbCgibXNwMzQwMCB0aHJlYWQ6IHNsZWVwXG4iKTsKLQkJbXNwMzR4eF9zbGVlcChtc3AsLTEpOwotCQltc3AzNDAwX2RiZ19tZWRpdW12b2woIm1zcDM0MDAgdGhyZWFkOiB3YWtldXBcbiIpOwotCi0JcmVzdGFydDoKLQkJbXNwMzQwMF9kYmcoInRocmVhZDogcmVzdGFydCBzY2FuXG4iKTsKLQkJbXNwLT5yZXN0YXJ0ID0gMDsKLQkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKLQkJCWJyZWFrOwotCi0JCWlmIChWSURFT19NT0RFX1JBRElPID09IG1zcC0+bm9ybSB8fAotCQkgICAgTVNQX01PREVfRVhURVJOICA9PSBtc3AtPm1vZGUpIHsKLQkJCS8qIG5vIGNhcnJpZXIgc2NhbiwganVzdCB1bm11dGUgKi8KLQkJCW1zcDM0MDBfaW5mbygidGhyZWFkOiBubyBjYXJyaWVyIHNjYW5cbiIpOwotCQkJbXNwMzQwMGNfc2V0dm9sdW1lKGNsaWVudCwgbXNwLT5tdXRlZCwgbXNwLT5sZWZ0LCBtc3AtPnJpZ2h0KTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogbXV0ZSAqLwotCQltc3AzNDAwY19zZXR2b2x1bWUoY2xpZW50LCBtc3AtPm11dGVkLCAwLCAwKTsKLQkJbXNwMzQwMGNfc2V0bW9kZShjbGllbnQsIE1TUF9NT0RFX0FNX0RFVEVDVCAvKiArMSAqLyApOwotCQl2YWwxID0gdmFsMiA9IDA7Ci0JCW1heDEgPSBtYXgyID0gLTE7Ci0JCW1zcC0+d2F0Y2hfc3RlcmVvID0gMDsKLQotCQkvKiBzb21lIHRpbWUgZm9yIHRoZSB0dW5lciB0byBzeW5jICovCi0JCWlmIChtc3AzNHh4X3NsZWVwKG1zcCwyMDApKQotCQkJZ290byByZXN0YXJ0OwotCi0JCS8qIGNhcnJpZXIgZGV0ZWN0IHBhc3MgIzEgLS0gbWFpbiBjYXJyaWVyICovCi0JCWNkID0gY2Fycmllcl9kZXRlY3RfbWFpbjsKLQkJY291bnQgPSBDQVJSSUVSX0NPVU5UKGNhcnJpZXJfZGV0ZWN0X21haW4pOwotCi0JCWlmIChhbXNvdW5kICYmIChtc3AtPm5vcm0gPT0gVklERU9fTU9ERV9TRUNBTSkpIHsKLQkJCS8qIGF1dG9kZXRlY3QgZG9lc24ndCB3b3JrIHdlbGwgd2l0aCBBTSAuLi4gKi8KLQkJCW1heDEgPSAzOwotCQkJY291bnQgPSAwOwotCQkJbXNwMzQwMF9kYmcoIkFNIHNvdW5kIG92ZXJyaWRlXG4iKTsKLQkJfQotCi0JCWZvciAodGhpcyA9IDA7IHRoaXMgPCBjb3VudDsgdGhpcysrKSB7Ci0JCQltc3AzNDAwY19zZXRjYXJyaWVyKGNsaWVudCwgY2RbdGhpc10uY2RvLGNkW3RoaXNdLmNkbyk7Ci0JCQlpZiAobXNwMzR4eF9zbGVlcChtc3AsMTAwKSkKLQkJCQlnb3RvIHJlc3RhcnQ7Ci0JCQl2YWwgPSBtc3AzNDAwY19yZWFkKGNsaWVudCwgSTJDX01TUDM0MDBDX0RGUCwgMHgxYik7Ci0JCQlpZiAodmFsID4gMzI3NjcpCi0JCQkJdmFsIC09IDY1NTM2OwotCQkJaWYgKHZhbDEgPCB2YWwpCi0JCQkJdmFsMSA9IHZhbCwgbWF4MSA9IHRoaXM7Ci0JCQltc3AzNDAwX2RiZygiY2FycmllcjEgdmFsOiAlNWQgLyAlc1xuIiwgdmFsLGNkW3RoaXNdLm5hbWUpOwotCQl9Ci0KLQkJLyogY2FycmllciBkZXRlY3QgcGFzcyAjMiAtLSBzZWNvbmQgKHN0ZXJlbykgY2FycmllciAqLwotCQlzd2l0Y2ggKG1heDEpIHsKLQkJY2FzZSAxOiAvKiA1LjUgKi8KLQkJCWNkID0gY2Fycmllcl9kZXRlY3RfNTU7Ci0JCQljb3VudCA9IENBUlJJRVJfQ09VTlQoY2Fycmllcl9kZXRlY3RfNTUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzogLyogNi41ICovCi0JCQljZCA9IGNhcnJpZXJfZGV0ZWN0XzY1OwotCQkJY291bnQgPSBDQVJSSUVSX0NPVU5UKGNhcnJpZXJfZGV0ZWN0XzY1KTsKLQkJCWJyZWFrOwotCQljYXNlIDA6IC8qIDQuNSAqLwotCQljYXNlIDI6IC8qIDYuMCAqLwotCQlkZWZhdWx0OgotCQkJY2QgPSBOVUxMOwotCQkJY291bnQgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoYW1zb3VuZCAmJiAobXNwLT5ub3JtID09IFZJREVPX01PREVfU0VDQU0pKSB7Ci0JCQkvKiBhdXRvZGV0ZWN0IGRvZXNuJ3Qgd29yayB3ZWxsIHdpdGggQU0gLi4uICovCi0JCQljZCA9IE5VTEw7Ci0JCQljb3VudCA9IDA7Ci0JCQltYXgyID0gMDsKLQkJfQotCQlmb3IgKHRoaXMgPSAwOyB0aGlzIDwgY291bnQ7IHRoaXMrKykgewotCQkJbXNwMzQwMGNfc2V0Y2FycmllcihjbGllbnQsIGNkW3RoaXNdLmNkbyxjZFt0aGlzXS5jZG8pOwotCQkJaWYgKG1zcDM0eHhfc2xlZXAobXNwLDEwMCkpCi0JCQkJZ290byByZXN0YXJ0OwotCQkJdmFsID0gbXNwMzQwMGNfcmVhZChjbGllbnQsIEkyQ19NU1AzNDAwQ19ERlAsIDB4MWIpOwotCQkJaWYgKHZhbCA+IDMyNzY3KQotCQkJCXZhbCAtPSA2NTUzNjsKLQkJCWlmICh2YWwyIDwgdmFsKQotCQkJCXZhbDIgPSB2YWwsIG1heDIgPSB0aGlzOwotCQkJbXNwMzQwMF9kYmcoImNhcnJpZXIyIHZhbDogJTVkIC8gJXNcbiIsIHZhbCxjZFt0aGlzXS5uYW1lKTsKLQkJfQotCi0JCS8qIHByb2dyYW1tIHRoZSBtc3AzNDAwIGFjY29yZGluZyB0byB0aGUgcmVzdWx0cyAqLwotCQltc3AtPm1haW4gICA9IGNhcnJpZXJfZGV0ZWN0X21haW5bbWF4MV0uY2RvOwotCQlzd2l0Y2ggKG1heDEpIHsKLQkJY2FzZSAxOiAvKiA1LjUgKi8KLQkJCWlmIChtYXgyID09IDApIHsKLQkJCQkvKiBCL0cgRk0tc3RlcmVvICovCi0JCQkJbXNwLT5zZWNvbmQgPSBjYXJyaWVyX2RldGVjdF81NVttYXgyXS5jZG87Ci0JCQkJbXNwMzQwMGNfc2V0bW9kZShjbGllbnQsIE1TUF9NT0RFX0ZNX1RFUlJBKTsKLQkJCQltc3AtPm5pY2FtX29uID0gMDsKLQkJCQltc3AzNDAwY19zZXRzdGVyZW8oY2xpZW50LCBWNEwyX1RVTkVSX01PREVfTU9OTyk7Ci0JCQkJbXNwLT53YXRjaF9zdGVyZW8gPSAxOwotCQkJfSBlbHNlIGlmIChtYXgyID09IDEgJiYgSEFWRV9OSUNBTShtc3ApKSB7Ci0JCQkJLyogQi9HIE5JQ0FNICovCi0JCQkJbXNwLT5zZWNvbmQgPSBjYXJyaWVyX2RldGVjdF81NVttYXgyXS5jZG87Ci0JCQkJbXNwMzQwMGNfc2V0bW9kZShjbGllbnQsIE1TUF9NT0RFX0ZNX05JQ0FNMSk7Ci0JCQkJbXNwLT5uaWNhbV9vbiA9IDE7Ci0JCQkJbXNwMzQwMGNfc2V0Y2FycmllcihjbGllbnQsIG1zcC0+c2Vjb25kLCBtc3AtPm1haW4pOwotCQkJCW1zcC0+d2F0Y2hfc3RlcmVvID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJZ290byBub19zZWNvbmQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAyOiAvKiA2LjAgKi8KLQkJCS8qIFBBTCBJIE5JQ0FNICovCi0JCQltc3AtPnNlY29uZCA9IE1TUF9DQVJSSUVSKDYuNTUyKTsKLQkJCW1zcDM0MDBjX3NldG1vZGUoY2xpZW50LCBNU1BfTU9ERV9GTV9OSUNBTTIpOwotCQkJbXNwLT5uaWNhbV9vbiA9IDE7Ci0JCQltc3AzNDAwY19zZXRjYXJyaWVyKGNsaWVudCwgbXNwLT5zZWNvbmQsIG1zcC0+bWFpbik7Ci0JCQltc3AtPndhdGNoX3N0ZXJlbyA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAzOiAvKiA2LjUgKi8KLQkJCWlmIChtYXgyID09IDEgfHwgbWF4MiA9PSAyKSB7Ci0JCQkJLyogRC9LIEZNLXN0ZXJlbyAqLwotCQkJCW1zcC0+c2Vjb25kID0gY2Fycmllcl9kZXRlY3RfNjVbbWF4Ml0uY2RvOwotCQkJCW1zcDM0MDBjX3NldG1vZGUoY2xpZW50LCBNU1BfTU9ERV9GTV9URVJSQSk7Ci0JCQkJbXNwLT5uaWNhbV9vbiA9IDA7Ci0JCQkJbXNwMzQwMGNfc2V0c3RlcmVvKGNsaWVudCwgVjRMMl9UVU5FUl9NT0RFX01PTk8pOwotCQkJCW1zcC0+d2F0Y2hfc3RlcmVvID0gMTsKLQkJCX0gZWxzZSBpZiAobWF4MiA9PSAwICYmCi0JCQkJICAgbXNwLT5ub3JtID09IFZJREVPX01PREVfU0VDQU0pIHsKLQkJCQkvKiBMIE5JQ0FNIG9yIEFNLW1vbm8gKi8KLQkJCQltc3AtPnNlY29uZCA9IGNhcnJpZXJfZGV0ZWN0XzY1W21heDJdLmNkbzsKLQkJCQltc3AzNDAwY19zZXRtb2RlKGNsaWVudCwgTVNQX01PREVfQU1fTklDQU0pOwotCQkJCW1zcC0+bmljYW1fb24gPSAwOwotCQkJCW1zcDM0MDBjX3NldHN0ZXJlbyhjbGllbnQsIFY0TDJfVFVORVJfTU9ERV9NT05PKTsKLQkJCQltc3AzNDAwY19zZXRjYXJyaWVyKGNsaWVudCwgbXNwLT5zZWNvbmQsIG1zcC0+bWFpbik7Ci0JCQkJLyogdm9sdW1lIHByZXNjYWxlIGZvciBTQ0FSVCAoQU0gbW9ubyBpbnB1dCkgKi8KLQkJCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDBkLCAweDE5MDApOwotCQkJCW1zcC0+d2F0Y2hfc3RlcmVvID0gMTsKLQkJCX0gZWxzZSBpZiAobWF4MiA9PSAwICYmIEhBVkVfTklDQU0obXNwKSkgewotCQkJCS8qIEQvSyBOSUNBTSAqLwotCQkJCW1zcC0+c2Vjb25kID0gY2Fycmllcl9kZXRlY3RfNjVbbWF4Ml0uY2RvOwotCQkJCW1zcDM0MDBjX3NldG1vZGUoY2xpZW50LCBNU1BfTU9ERV9GTV9OSUNBTTEpOwotCQkJCW1zcC0+bmljYW1fb24gPSAxOwotCQkJCW1zcDM0MDBjX3NldGNhcnJpZXIoY2xpZW50LCBtc3AtPnNlY29uZCwgbXNwLT5tYWluKTsKLQkJCQltc3AtPndhdGNoX3N0ZXJlbyA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCWdvdG8gbm9fc2Vjb25kOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMDogLyogNC41ICovCi0JCWRlZmF1bHQ6Ci0JCW5vX3NlY29uZDoKLQkJCW1zcC0+c2Vjb25kID0gY2Fycmllcl9kZXRlY3RfbWFpblttYXgxXS5jZG87Ci0JCQltc3AzNDAwY19zZXRtb2RlKGNsaWVudCwgTVNQX01PREVfRk1fVEVSUkEpOwotCQkJbXNwLT5uaWNhbV9vbiA9IDA7Ci0JCQltc3AzNDAwY19zZXRjYXJyaWVyKGNsaWVudCwgbXNwLT5zZWNvbmQsIG1zcC0+bWFpbik7Ci0JCQltc3AtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05POwotCQkJbXNwMzQwMGNfc2V0c3RlcmVvKGNsaWVudCwgVjRMMl9UVU5FUl9NT0RFX01PTk8pOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiB1bm11dGUgKi8KLQkJbXNwMzQwMGNfc2V0dm9sdW1lKGNsaWVudCwgbXNwLT5tdXRlZCwgbXNwLT5sZWZ0LCBtc3AtPnJpZ2h0KTsKLQkJbXNwMzQwMGNfcmVzdG9yZV9kZnAoY2xpZW50KTsKLQotCQlpZiAoZGVidWcpCi0JCQltc3AzNDAwY19wcmludF9tb2RlKGNsaWVudCk7Ci0KLQkJLyogbW9uaXRvciB0diBhdWRpbyBtb2RlICovCi0JCXdoaWxlIChtc3AtPndhdGNoX3N0ZXJlbykgewotCQkJaWYgKG1zcDM0eHhfc2xlZXAobXNwLDUwMDApKQotCQkJCWdvdG8gcmVzdGFydDsKLQkJCXdhdGNoX3N0ZXJlbyhjbGllbnQpOwotCQl9Ci0JfQotCW1zcDM0MDBfZGJnKCJ0aHJlYWQ6IGV4aXRcbiIpOwotCXJldHVybiAwOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogdGhpcyBvbmUgdXNlcyB0aGUgYXV0b21hdGljIHNvdW5kIHN0YW5kYXJkIGRldGVjdGlvbiBvZiBuZXdlciAgICAgICAgICAgKi8KLS8qIG1zcDM0eHggY2hpcCB2ZXJzaW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLXN0YXRpYyBzdHJ1Y3QgTU9ERVMgewotCWludCByZXR2YWw7Ci0JaW50IG1haW4sIHNlY29uZDsKLQljaGFyICpuYW1lOwotfSBtb2RlbGlzdFtdID0gewotCXsgMHgwMDAwLCAwLCAwLCAiRVJST1IiIH0sCi0JeyAweDAwMDEsIDAsIDAsICJhdXRvZGV0ZWN0IHN0YXJ0IiB9LAotCXsgMHgwMDAyLCBNU1BfQ0FSUklFUig0LjUpLCBNU1BfQ0FSUklFUig0LjcyKSwgIjQuNS80LjcyICBNIER1YWwgRk0tU3RlcmVvIiB9LAotCXsgMHgwMDAzLCBNU1BfQ0FSUklFUig1LjUpLCBNU1BfQ0FSUklFUig1Ljc0MjE4NzUpLCAiNS41LzUuNzQgIEIvRyBEdWFsIEZNLVN0ZXJlbyIgfSwKLQl7IDB4MDAwNCwgTVNQX0NBUlJJRVIoNi41KSwgTVNQX0NBUlJJRVIoNi4yNTc4MTI1KSwgIjYuNS82LjI1ICBEL0sxIER1YWwgRk0tU3RlcmVvIiB9LAotCXsgMHgwMDA1LCBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig2Ljc0MjE4NzUpLCAiNi41LzYuNzQgIEQvSzIgRHVhbCBGTS1TdGVyZW8iIH0sCi0JeyAweDAwMDYsIE1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDYuNSksICI2LjUgIEQvSyBGTS1Nb25vIChIREVWMykiIH0sCi0JeyAweDAwMDgsIE1TUF9DQVJSSUVSKDUuNSksIE1TUF9DQVJSSUVSKDUuODUpLCAiNS41LzUuODUgIEIvRyBOSUNBTSBGTSIgfSwKLQl7IDB4MDAwOSwgTVNQX0NBUlJJRVIoNi41KSwgTVNQX0NBUlJJRVIoNS44NSksICI2LjUvNS44NSAgTCBOSUNBTSBBTSIgfSwKLQl7IDB4MDAwYSwgTVNQX0NBUlJJRVIoNi4wKSwgTVNQX0NBUlJJRVIoNi41NSksICI2LjAvNi41NSAgSSBOSUNBTSBGTSIgfSwKLQl7IDB4MDAwYiwgTVNQX0NBUlJJRVIoNi41KSwgTVNQX0NBUlJJRVIoNS44NSksICI2LjUvNS44NSAgRC9LIE5JQ0FNIEZNIiB9LAotCXsgMHgwMDBjLCBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig1Ljg1KSwgIjYuNS81Ljg1ICBEL0sgTklDQU0gRk0gKEhERVYyKSIgfSwKLQl7IDB4MDAyMCwgTVNQX0NBUlJJRVIoNC41KSwgTVNQX0NBUlJJRVIoNC41KSwgIjQuNSAgTSBCVFNDLVN0ZXJlbyIgfSwKLQl7IDB4MDAyMSwgTVNQX0NBUlJJRVIoNC41KSwgTVNQX0NBUlJJRVIoNC41KSwgIjQuNSAgTSBCVFNDLU1vbm8gKyBTQVAiIH0sCi0JeyAweDAwMzAsIE1TUF9DQVJSSUVSKDQuNSksIE1TUF9DQVJSSUVSKDQuNSksICI0LjUgIE0gRUlBLUogSmFwYW4gU3RlcmVvIiB9LAotCXsgMHgwMDQwLCBNU1BfQ0FSUklFUigxMC43KSwgTVNQX0NBUlJJRVIoMTAuNyksICIxMC43ICBGTS1TdGVyZW8gUmFkaW8iIH0sCi0JeyAweDAwNTAsIE1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDYuNSksICI2LjUgIFNBVC1Nb25vIiB9LAotCXsgMHgwMDUxLCBNU1BfQ0FSUklFUig3LjAyKSwgTVNQX0NBUlJJRVIoNy4yMCksICI3LjAyLzcuMjAgIFNBVC1TdGVyZW8iIH0sCi0JeyAweDAwNjAsIE1TUF9DQVJSSUVSKDcuMiksIE1TUF9DQVJSSUVSKDcuMiksICI3LjIgIFNBVCBBRFIiIH0sCi0JeyAgICAgLTEsIDAsIDAsIE5VTEwgfSwgLyogRU9GICovCi19OwotCi1zdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKm1zcDM0eHhfc3RhbmRhcmRfbW9kZV9uYW1lKGludCBtb2RlKQotewotCWludCBpOwotCWZvciAoaSA9IDA7IG1vZGVsaXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQotCQlpZiAobW9kZWxpc3RbaV0ucmV0dmFsID09IG1vZGUpCi0JCQlyZXR1cm4gbW9kZWxpc3RbaV0ubmFtZTsKLQlyZXR1cm4gInVua25vd24iOwotfQotCi1zdGF0aWMgaW50IG1zcDM0eHhfbW9kdXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IG5vcm0pCi17Ci0Jc3dpdGNoIChub3JtKSB7Ci0JY2FzZSBWSURFT19NT0RFX1BBTDoKLQkJbXNwMzQwMF9kYmcoInZpZGVvIG1vZGUgc2VsZWN0ZWQgdG8gUEFMXG4iKTsKLQotI2lmIDEKLQkJLyogZXhwZXJpbWVudGFsOiBub3Qgc3VyZSB0aGlzIHdvcmtzIHdpdGggYWxsIGNoaXAgdmVyc2lvbnMgKi8KLQkJcmV0dXJuIDB4NzAwMzsKLSNlbHNlCi0JCS8qIHByZXZpb3VzIHZhbHVlLCB0cnkgdGhpcyBpZiBpdCBicmVha3MgLi4uICovCi0JCXJldHVybiAweDEwMDM7Ci0jZW5kaWYKLQljYXNlIFZJREVPX01PREVfTlRTQzogIC8qIEJUU0MgKi8KLQkJbXNwMzQwMF9kYmcoInZpZGVvIG1vZGUgc2VsZWN0ZWQgdG8gTlRTQ1xuIik7Ci0JCXJldHVybiAweDIwMDM7Ci0JY2FzZSBWSURFT19NT0RFX1NFQ0FNOgotCQltc3AzNDAwX2RiZygidmlkZW8gbW9kZSBzZWxlY3RlZCB0byBTRUNBTVxuIik7Ci0JCXJldHVybiAweDAwMDM7Ci0JY2FzZSBWSURFT19NT0RFX1JBRElPOgotCQltc3AzNDAwX2RiZygidmlkZW8gbW9kZSBzZWxlY3RlZCB0byBSYWRpb1xuIik7Ci0JCXJldHVybiAweDAwMDM7Ci0JY2FzZSBWSURFT19NT0RFX0FVVE86Ci0JCW1zcDM0MDBfZGJnKCJ2aWRlbyBtb2RlIHNlbGVjdGVkIHRvIEF1dG9cbiIpOwotCQlyZXR1cm4gMHgyMDAzOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAweDAwMDM7Ci0JfQotfQotCi1zdGF0aWMgaW50IG1zcDM0eHhfc3RhbmRhcmQoaW50IG5vcm0pCi17Ci0Jc3dpdGNoIChub3JtKSB7Ci0JY2FzZSBWSURFT19NT0RFX1BBTDoKLQkJcmV0dXJuIDE7Ci0JY2FzZSBWSURFT19NT0RFX05UU0M6ICAvKiBCVFNDICovCi0JCXJldHVybiAweDAwMjA7Ci0JY2FzZSBWSURFT19NT0RFX1NFQ0FNOgotCQlyZXR1cm4gMTsKLQljYXNlIFZJREVPX01PREVfUkFESU86Ci0JCXJldHVybiAweDAwNDA7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIDE7Ci0JfQotfQotCi1zdGF0aWMgaW50IG1zcDM0MTBkX3RocmVhZCh2b2lkICpkYXRhKQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhOwotCXN0cnVjdCBtc3AzNDAwYyAqbXNwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JaW50IG1vZGUsdmFsLGksc3RkOwotCi0JbXNwMzQwMF9pbmZvKCJtc3AzNDEwIGRhZW1vbiBzdGFydGVkXG4iKTsKLQotCWZvciAoOzspIHsKLQkJbXNwMzQwMF9kYmdfbWVkaXVtdm9sKCJtc3AzNDEwIHRocmVhZDogc2xlZXBcbiIpOwotCQltc3AzNHh4X3NsZWVwKG1zcCwtMSk7Ci0JCW1zcDM0MDBfZGJnX21lZGl1bXZvbCgibXNwMzQxMCB0aHJlYWQ6IHdha2V1cFxuIik7Ci0KLQlyZXN0YXJ0OgotCQltc3AzNDAwX2RiZygidGhyZWFkOiByZXN0YXJ0IHNjYW5cbiIpOwotCQltc3AtPnJlc3RhcnQgPSAwOwotCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQotCQkJYnJlYWs7Ci0KLQkJaWYgKG1zcC0+bW9kZSA9PSBNU1BfTU9ERV9FWFRFUk4pIHsKLQkJCS8qIG5vIGNhcnJpZXIgc2NhbiBuZWVkZWQsIGp1c3QgdW5tdXRlICovCi0JCQltc3AzNDAwX2RiZygidGhyZWFkOiBubyBjYXJyaWVyIHNjYW5cbiIpOwotCQltc3AzNDAwY19zZXR2b2x1bWUoY2xpZW50LCBtc3AtPm11dGVkLCBtc3AtPmxlZnQsIG1zcC0+cmlnaHQpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBwdXQgaW50byBzYW5lIHN0YXRlIChhbmQgbXV0ZSkgKi8KLQkJbXNwMzQwMGNfcmVzZXQoY2xpZW50KTsKLQotCQkvKiBzb21lIHRpbWUgZm9yIHRoZSB0dW5lciB0byBzeW5jICovCi0JCWlmIChtc3AzNHh4X3NsZWVwKG1zcCwyMDApKQotCQkJZ290byByZXN0YXJ0OwotCi0JCS8qIHN0YXJ0IGF1dG9kZXRlY3QgKi8KLQkJbW9kZSA9IG1zcDM0eHhfbW9kdXMoY2xpZW50LCBtc3AtPm5vcm0pOwotCQlzdGQgID0gbXNwMzR4eF9zdGFuZGFyZChtc3AtPm5vcm0pOwotCQltc3AzNDAwY193cml0ZShjbGllbnQsIEkyQ19NU1AzNDAwQ19ERU0sIDB4MzAsIG1vZGUpOwotCQltc3AzNDAwY193cml0ZShjbGllbnQsIEkyQ19NU1AzNDAwQ19ERU0sIDB4MjAsIHN0ZCk7Ci0JCW1zcC0+d2F0Y2hfc3RlcmVvID0gMDsKLQotCQlpZiAoZGVidWcpCi0JCQltc3AzNDAwX2RiZygic2V0dGluZyBtb2RlOiAlcyAoMHglMDR4KVxuIiwKLQkJCSAgICAgICBtc3AzNHh4X3N0YW5kYXJkX21vZGVfbmFtZShzdGQpICxzdGQpOwotCi0JCWlmIChzdGQgIT0gMSkgewotCQkJLyogcHJvZ3JhbW1lZCBzb21lIHNwZWNpZmljIG1vZGUgKi8KLQkJCXZhbCA9IHN0ZDsKLQkJfSBlbHNlIHsKLQkJCS8qIHRyaWdnZXJlZCBhdXRvZGV0ZWN0ICovCi0JCQlmb3IgKDs7KSB7Ci0JCQkJaWYgKG1zcDM0eHhfc2xlZXAobXNwLDEwMCkpCi0JCQkJCWdvdG8gcmVzdGFydDsKLQotCQkJCS8qIGNoZWNrIHJlc3VsdHMgKi8KLQkJCQl2YWwgPSBtc3AzNDAwY19yZWFkKGNsaWVudCwgSTJDX01TUDM0MDBDX0RFTSwgMHg3ZSk7Ci0JCQkJaWYgKHZhbCA8IDB4MDdmZikKLQkJCQkJYnJlYWs7Ci0JCQkJbXNwMzQwMF9kYmcoImRldGVjdGlvbiBzdGlsbCBpbiBwcm9ncmVzc1xuIik7Ci0JCQl9Ci0JCX0KLQkJZm9yIChpID0gMDsgbW9kZWxpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCi0JCQlpZiAobW9kZWxpc3RbaV0ucmV0dmFsID09IHZhbCkKLQkJCQlicmVhazsKLQkJbXNwMzQwMF9kYmcoImN1cnJlbnQgbW9kZTogJXMgKDB4JTA0eClcbiIsCi0JCQltb2RlbGlzdFtpXS5uYW1lID8gbW9kZWxpc3RbaV0ubmFtZSA6ICJ1bmtub3duIiwKLQkJCXZhbCk7Ci0JCW1zcC0+bWFpbiAgID0gbW9kZWxpc3RbaV0ubWFpbjsKLQkJbXNwLT5zZWNvbmQgPSBtb2RlbGlzdFtpXS5zZWNvbmQ7Ci0KLQkJaWYgKGFtc291bmQgJiYgKG1zcC0+bm9ybSA9PSBWSURFT19NT0RFX1NFQ0FNKSAmJiAodmFsICE9IDB4MDAwOSkpIHsKLQkJCS8qIGF1dG9kZXRlY3Rpb24gaGFzIGZhaWxlZCwgbGV0IGJhY2t1cCAqLwotCQkJbXNwMzQwMF9kYmcoImF1dG9kZXRlY3Rpb24gZmFpbGVkLCIKLQkJCQkiIHN3aXRjaGluZyB0byBiYWNrdXAgbW9kZTogJXMgKDB4JTA0eClcbiIsCi0JCQkJbW9kZWxpc3RbOF0ubmFtZSA/IG1vZGVsaXN0WzhdLm5hbWUgOiAidW5rbm93biIsdmFsKTsKLQkJCXZhbCA9IDB4MDAwOTsKLQkJCW1zcDM0MDBjX3dyaXRlKGNsaWVudCwgSTJDX01TUDM0MDBDX0RFTSwgMHgyMCwgdmFsKTsKLQkJfQotCi0JCS8qIHNldCB2YXJpb3VzIHByZXNjYWxlcyAqLwotCQltc3AzNDAwY193cml0ZShjbGllbnQsIEkyQ19NU1AzNDAwQ19ERlAsIDB4MGQsIDB4MTkwMCk7IC8qIHNjYXJ0ICovCi0JCW1zcDM0MDBjX3dyaXRlKGNsaWVudCwgSTJDX01TUDM0MDBDX0RGUCwgMHgwZSwgMHgyNDAzKTsgLyogRk0gKi8KLQkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LCBJMkNfTVNQMzQwMENfREZQLCAweDEwLCAweDVhMDApOyAvKiBuaWNhbSAqLwotCi0JCS8qIHNldCBzdGVyZW8gKi8KLQkJc3dpdGNoICh2YWwpIHsKLQkJY2FzZSAweDAwMDg6IC8qIEIvRyBOSUNBTSAqLwotCQljYXNlIDB4MDAwYTogLyogSSBOSUNBTSAqLwotCQkJaWYgKHZhbCA9PSAweDAwMDgpCi0JCQkJbXNwLT5tb2RlID0gTVNQX01PREVfRk1fTklDQU0xOwotCQkJZWxzZQotCQkJCW1zcC0+bW9kZSA9IE1TUF9NT0RFX0ZNX05JQ0FNMjsKLQkJCS8qIGp1c3QgdHVybiBvbiBzdGVyZW8gKi8KLQkJCW1zcC0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKLQkJCW1zcC0+bmljYW1fb24gPSAxOwotCQkJbXNwLT53YXRjaF9zdGVyZW8gPSAxOwotCQkJbXNwMzQwMGNfc2V0c3RlcmVvKGNsaWVudCxWNEwyX1RVTkVSX01PREVfU1RFUkVPKTsKLQkJCWJyZWFrOwotCQljYXNlIDB4MDAwOToKLQkJCW1zcC0+bW9kZSA9IE1TUF9NT0RFX0FNX05JQ0FNOwotCQkJbXNwLT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKLQkJCW1zcC0+bmljYW1fb24gPSAxOwotCQkJbXNwMzQwMGNfc2V0c3RlcmVvKGNsaWVudCxWNEwyX1RVTkVSX01PREVfTU9OTyk7Ci0JCQltc3AtPndhdGNoX3N0ZXJlbyA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAweDAwMjA6IC8qIEJUU0MgKi8KLQkJCS8qIGp1c3QgdHVybiBvbiBzdGVyZW8gKi8KLQkJCW1zcC0+bW9kZSA9IE1TUF9NT0RFX0JUU0M7Ci0JCQltc3AtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87Ci0JCQltc3AtPm5pY2FtX29uID0gMDsKLQkJCW1zcC0+d2F0Y2hfc3RlcmVvID0gMTsKLQkJCW1zcDM0MDBjX3NldHN0ZXJlbyhjbGllbnQsVjRMMl9UVU5FUl9NT0RFX1NURVJFTyk7Ci0JCQlicmVhazsKLQkJY2FzZSAweDAwNDA6IC8qIEZNIHJhZGlvICovCi0JCQltc3AtPm1vZGUgICA9IE1TUF9NT0RFX0ZNX1JBRElPOwotCQkJbXNwLT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfU1RFUkVPOwotCQkJbXNwLT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKLQkJCW1zcC0+bmljYW1fb24gPSAwOwotCQkJbXNwLT53YXRjaF9zdGVyZW8gPSAwOwotCQkJLyogbm90IG5lZWRlZCBpbiB0aGVvcnkgaWYgSEFWRV9SQURJTygpLCBidXQKLQkJCSAgIHNob3J0IHByb2dyYW1taW5nIGVuYWJsZXMgY2FycmllciBtdXRlICovCi0JCQltc3AzNDAwY19zZXRtb2RlKGNsaWVudCxNU1BfTU9ERV9GTV9SQURJTyk7Ci0JCQltc3AzNDAwY19zZXRjYXJyaWVyKGNsaWVudCwgTVNQX0NBUlJJRVIoMTAuNyksCi0JCQkJCSAgICBNU1BfQ0FSUklFUigxMC43KSk7Ci0JCQkvKiBzY2FydCByb3V0aW5nICovCi0JCQltc3AzNDAwY19zZXRfc2NhcnQoY2xpZW50LFNDQVJUX0lOMiwwKTsKLQkJCS8qIG1zcDM0eHggZG9lcyByYWRpbyBkZWNvZGluZyAqLwotCQkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDgsIDB4MDAyMCk7Ci0JCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwOSwgMHgwMDIwKTsKLQkJCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDBiLCAweDAwMjApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgwMDAzOgotCQljYXNlIDB4MDAwNDoKLQkJY2FzZSAweDAwMDU6Ci0JCQltc3AtPm1vZGUgICA9IE1TUF9NT0RFX0ZNX1RFUlJBOwotCQkJbXNwLT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKLQkJCW1zcC0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9NT05POwotCQkJbXNwLT5uaWNhbV9vbiA9IDA7Ci0JCQltc3AtPndhdGNoX3N0ZXJlbyA9IDE7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIHVubXV0ZSwgcmVzdG9yZSBtaXNjIHJlZ2lzdGVycyAqLwotCQltc3AzNDAwY19zZXRiYXNzKGNsaWVudCwgbXNwLT5iYXNzKTsKLQkJbXNwMzQwMGNfc2V0dHJlYmxlKGNsaWVudCwgbXNwLT50cmVibGUpOwotCQltc3AzNDAwY19zZXR2b2x1bWUoY2xpZW50LCBtc3AtPm11dGVkLCBtc3AtPmxlZnQsIG1zcC0+cmlnaHQpOwotCQltc3AzNDAwY193cml0ZShjbGllbnQsIEkyQ19NU1AzNDAwQ19ERlAsIDB4MTMsIG1zcC0+YWNiKTsKLQkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERU0sIDB4NDAsIG1zcC0+aTJzX21vZGUpOwotCQltc3AzNDAwY19yZXN0b3JlX2RmcChjbGllbnQpOwotCi0JCS8qIG1vbml0b3IgdHYgYXVkaW8gbW9kZSAqLwotCQl3aGlsZSAobXNwLT53YXRjaF9zdGVyZW8pIHsKLQkJCWlmIChtc3AzNHh4X3NsZWVwKG1zcCw1MDAwKSkKLQkJCQlnb3RvIHJlc3RhcnQ7Ci0JCQl3YXRjaF9zdGVyZW8oY2xpZW50KTsKLQkJfQotCX0KLQltc3AzNDAwX2RiZygidGhyZWFkOiBleGl0XG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIG1zcDM0eHhHICsgKHNpbXBsZXIgbm8tdGhyZWFkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiB0aGlzIG9uZSB1c2VzIGJvdGggYXV0b21hdGljIHN0YW5kYXJkIGRldGVjdGlvbiBhbmQgYXV0b21hdGljIHNvdW5kICAgICAqLwotLyogc2VsZWN0IHdoaWNoIGFyZSBhdmFpbGFibGUgaW4gdGhlIG5ld2VyIEcgdmVyc2lvbnMgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIHN0cnVjdCBtc3A6IG9ubHkgbm9ybSwgYWNiIGFuZCBzb3VyY2UgYXJlIHJlYWxseSB1c2VkIGluIHRoaXMgbW9kZSAgICAgICovCi0KLXN0YXRpYyB2b2lkIG1zcDM0eHhnX3NldF9zb3VyY2Uoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHNvdXJjZSk7Ci0KLS8qIChyZS0paW5pdGlhbGl6ZSB0aGUgbXNwMzR4eGcsIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBub3JtIGluIG1zcC0+bm9ybQotICogcmV0dXJuIDAgaWYgaXQgd29ya2VkLCAtMSBpZiBpdCBmYWlsZWQKLSAqLwotc3RhdGljIGludCBtc3AzNHh4Z19yZXNldChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBtc3AzNDAwYyAqbXNwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JaW50IG1vZHVzLHN0ZDsKLQotCWlmIChtc3AzNDAwY19yZXNldChjbGllbnQpKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBtYWtlIHN1cmUgdGhhdCBpbnB1dC9vdXRwdXQgaXMgbXV0ZWQgKHBhcmFub2lkIG1vZGUpICovCi0JaWYgKG1zcDM0MDBjX3dyaXRlKGNsaWVudCwKLQkJCSAgIEkyQ19NU1AzNDAwQ19ERlAsCi0JCQkgICAweDEzLCAvKiBBQ0IgKi8KLQkJCSAgIDB4MGYyMCAvKiBtdXRlIERTUCBpbnB1dCwgbXV0ZSBTQ0FSVCAxICovKSkKLQkJcmV0dXJuIC0xOwotCi0JbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERU0sIDB4NDAsIG1zcC0+aTJzX21vZGUpOwotCi0JLyogc3RlcC1ieS1zdGVwIGluaXRpYWxpc2F0aW9uLCBhcyBkZXNjcmliZWQgaW4gdGhlIG1hbnVhbCAqLwotCW1vZHVzID0gbXNwMzR4eF9tb2R1cyhjbGllbnQsIG1zcC0+bm9ybSk7Ci0Jc3RkICAgPSBtc3AzNHh4X3N0YW5kYXJkKG1zcC0+bm9ybSk7Ci0JbW9kdXMgJj0gfjB4MDM7IC8qIFNUQVRVU19DSEFOR0U9MCAqLwotCW1vZHVzIHw9IDB4MDE7ICAvKiBBVVRPTUFUSUNfU09VTkRfREVURUNUSU9OPTEgKi8KLQlpZiAobXNwMzQwMGNfd3JpdGUoY2xpZW50LAotCQkJICAgSTJDX01TUDM0MDBDX0RFTSwKLQkJCSAgIDB4MzAvKk1PRFVTKi8sCi0JCQkgICBtb2R1cykpCi0JCXJldHVybiAtMTsKLQlpZiAobXNwMzQwMGNfd3JpdGUoY2xpZW50LAotCQkJICAgSTJDX01TUDM0MDBDX0RFTSwKLQkJCSAgIDB4MjAvKnN0YW5kYXJkKi8sCi0JCQkgICBzdGQpKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiB3cml0ZSB0aGUgZGZwcyB0aGF0IG1heSBoYXZlIGFuIGluZmx1ZW5jZSBvbgotCSAgIHN0YW5kYXJkL2F1ZGlvIGF1dG9kZXRlY3Rpb24gcmlnaHQgbm93ICovCi0JbXNwMzR4eGdfc2V0X3NvdXJjZShjbGllbnQsIG1zcC0+c291cmNlKTsKLQotCWlmIChtc3AzNDAwY193cml0ZV9kZnBfd2l0aF9kZWZhdWx0KGNsaWVudCwgMHgwZSwJLyogQU0vRk0gUHJlc2NhbGUgKi8KLQkJCQkJICAgIDB4MzAwMAotCQkJCQkgICAgLyogZGVmYXVsdDogWzE1OjhdIDc1a2h6IGRldmlhdGlvbiAqLwotCSAgICApKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAobXNwMzQwMGNfd3JpdGVfZGZwX3dpdGhfZGVmYXVsdChjbGllbnQsIDB4MTAsCS8qIE5JQ0FNIFByZXNjYWxlICovCi0JCQkJCSAgICAweDVhMDAKLQkJCQkJICAgIC8qIGRlZmF1bHQ6IDlkYiBnYWluIChhcyByZWNvbW1lbmRlZCkgKi8KLQkgICAgKSkKLQkJcmV0dXJuIC0xOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNwMzR4eGdfdGhyZWFkKHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGE7Ci0Jc3RydWN0IG1zcDM0MDBjICptc3AgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlpbnQgdmFsLCBzdGQsIGk7Ci0KLQltc3AzNDAwX2luZm8oIm1zcDM0eHhnIGRhZW1vbiBzdGFydGVkXG4iKTsKLQotCW1zcC0+c291cmNlID0gMTsgLyogZGVmYXVsdCAqLwotCWZvciAoOzspIHsKLQkJbXNwMzQwMF9kYmdfbWVkaXVtdm9sKCJtc3AzNHh4ZyB0aHJlYWQ6IHNsZWVwXG4iKTsKLQkJbXNwMzR4eF9zbGVlcChtc3AsLTEpOwotCQltc3AzNDAwX2RiZ19tZWRpdW12b2woIm1zcDM0eHhnIHRocmVhZDogd2FrZXVwXG4iKTsKLQotCXJlc3RhcnQ6Ci0JCW1zcDM0MDBfZGJnKCJ0aHJlYWQ6IHJlc3RhcnQgc2NhblxuIik7Ci0JCW1zcC0+cmVzdGFydCA9IDA7Ci0JCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCi0JCQlicmVhazsKLQotCQkvKiBzZXR1cCB0aGUgY2hpcCovCi0JCW1zcDM0eHhnX3Jlc2V0KGNsaWVudCk7Ci0JCXN0ZCA9IHN0YW5kYXJkOwotCQlpZiAoc3RkICE9IDB4MDEpCi0JCQlnb3RvIHVubXV0ZTsKLQotCQkvKiB3YXRjaCBhdXRvZGV0ZWN0ICovCi0JCW1zcDM0MDBfZGJnKCJ0cmlnZ2VyZWQgYXV0b2RldGVjdCwgd2FpdGluZyBmb3IgcmVzdWx0XG4iKTsKLQkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCWlmIChtc3AzNHh4X3NsZWVwKG1zcCwxMDApKQotCQkJCWdvdG8gcmVzdGFydDsKLQotCQkJLyogY2hlY2sgcmVzdWx0cyAqLwotCQkJdmFsID0gbXNwMzQwMGNfcmVhZChjbGllbnQsIEkyQ19NU1AzNDAwQ19ERU0sIDB4N2UpOwotCQkJaWYgKHZhbCA8IDB4MDdmZikgewotCQkJCXN0ZCA9IHZhbDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCW1zcDM0MDBfZGJnKCJkZXRlY3Rpb24gc3RpbGwgaW4gcHJvZ3Jlc3NcbiIpOwotCQl9Ci0JCWlmICgweDAxID09IHN0ZCkgewotCQkJbXNwMzQwMF9kYmcoImRldGVjdGlvbiBzdGlsbCBpbiBwcm9ncmVzcyBhZnRlciAxMCB0cmllcy4gZ2l2aW5nIHVwLlxuIik7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JdW5tdXRlOgotCQltc3AzNDAwX2RiZygiY3VycmVudCBtb2RlOiAlcyAoMHglMDR4KVxuIiwKLQkJCW1zcDM0eHhfc3RhbmRhcmRfbW9kZV9uYW1lKHN0ZCksIHN0ZCk7Ci0KLQkJLyogdW5tdXRlOiBkaXNwYXRjaCBzb3VuZCB0byBzY2FydCBvdXRwdXQsIHNldCBzY2FydCB2b2x1bWUgKi8KLQkJbXNwMzQwMF9kYmcoInVubXV0ZVxuIik7Ci0KLQkJbXNwMzQwMGNfc2V0YmFzcyhjbGllbnQsIG1zcC0+YmFzcyk7Ci0JCW1zcDM0MDBjX3NldHRyZWJsZShjbGllbnQsIG1zcC0+dHJlYmxlKTsKLQkJbXNwMzQwMGNfc2V0dm9sdW1lKGNsaWVudCwgbXNwLT5tdXRlZCwgbXNwLT5sZWZ0LCBtc3AtPnJpZ2h0KTsKLQotCQkvKiByZXN0b3JlIEFDQiAqLwotCQlpZiAobXNwMzQwMGNfd3JpdGUoY2xpZW50LAotCQkJCSAgIEkyQ19NU1AzNDAwQ19ERlAsCi0JCQkJICAgMHgxMywgLyogQUNCICovCi0JCQkJICAgbXNwLT5hY2IpKQotCQkJcmV0dXJuIC0xOwotCi0JCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREVNLCAweDQwLCBtc3AtPmkyc19tb2RlKTsKLQl9Ci0JbXNwMzQwMF9kYmcoInRocmVhZDogZXhpdFxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIHNldCB0aGUgc2FtZSAnc291cmNlJyBmb3IgdGhlIGxvdWRzcGVha2VyLCBzY2FydCBhbmQgcXVhc2ktcGVhayBkZXRlY3RvcgotICogdGhlIHZhbHVlIGZvciBzb3VyY2UgaXMgdGhlIHNhbWUgYXMgYml0IDE1Ojggb2YgREZQIHJlZ2lzdGVycyAweDA4LAotICogMHgwYSBhbmQgMHgwYzogMD1tb25vLCAxPXN0ZXJlbyBvciBBfEIsIDI9U0NBUlQsIDM9c3RlcmVvIG9yIEEsIDQ9c3RlcmVvIG9yIEIKLSAqCi0gKiB0aGlzIGZ1bmN0aW9uIHJlcGxhY2VzIG1zcDM0MDBjX3NldHN0ZXJlbwotICovCi1zdGF0aWMgdm9pZCBtc3AzNHh4Z19zZXRfc291cmNlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBzb3VyY2UpCi17Ci0Jc3RydWN0IG1zcDM0MDBjICptc3AgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCS8qIGZpeCBtYXRyaXggbW9kZSB0byBzdGVyZW8gYW5kIGxldCB0aGUgbXNwIGNob29zZSB3aGF0Ci0JICogdG8gb3V0cHV0IGFjY29yZGluZyB0byAnc291cmNlJywgYXMgcmVjb21tZW5kZWQKLQkgKiBmb3IgTU9OTyAoc291cmNlPT0wKSBkb3dubWl4aW5nIHNldCBiaXRbNzowXSB0byAweDMwCi0JICovCi0JaW50IHZhbHVlID0gKHNvdXJjZSYweDA3KTw8OHwoc291cmNlPT0wID8gMHgzMDoweDIwKTsKLQltc3AzNDAwX2RiZygic2V0IHNvdXJjZSB0byAlZCAoMHgleClcbiIsIHNvdXJjZSwgdmFsdWUpOwotCW1zcDM0MDBjX3dyaXRlKGNsaWVudCwKLQkJICAgICAgIEkyQ19NU1AzNDAwQ19ERlAsCi0JCSAgICAgICAweDA4LCAvKiBMb3Vkc3BlYWtlciBPdXRwdXQgKi8KLQkJICAgICAgIHZhbHVlKTsKLQltc3AzNDAwY193cml0ZShjbGllbnQsCi0JCSAgICAgICBJMkNfTVNQMzQwMENfREZQLAotCQkgICAgICAgMHgwYSwgLyogU0NBUlQxIERBIE91dHB1dCAqLwotCQkgICAgICAgdmFsdWUpOwotCW1zcDM0MDBjX3dyaXRlKGNsaWVudCwKLQkJICAgICAgIEkyQ19NU1AzNDAwQ19ERlAsCi0JCSAgICAgICAweDBjLCAvKiBRdWFzaS1wZWFrIGRldGVjdG9yICovCi0JCSAgICAgICB2YWx1ZSk7Ci0JLyoKLQkgKiBzZXQgaWRlbnRpZmljYXRpb24gdGhyZXNob2xkLiBQZXJzb25hbGx5LCBJCi0JICogSSBzZXQgaXQgdG8gYSBoaWdoZXIgdmFsdWUgdGhhdCB0aGUgZGVmYXVsdAotCSAqIG9mIDB4MTkwIHRvIGlnbm9yZSBub2lzeSBzdGVyZW8gc2lnbmFscy4KLQkgKiB0aGlzIG5lZWRzIHR1bmluZy4gKHJlY29tbWVuZGVkIHJhbmdlIDB4MDBhMC0weDAzYzApCi0JICogMHg3ZjAgPSBmb3JjZWQgbW9ubyBtb2RlCi0JICovCi0JbXNwMzQwMGNfd3JpdGUoY2xpZW50LAotCQkgICAgICAgSTJDX01TUDM0MDBDX0RFTSwKLQkJICAgICAgIDB4MjIsIC8qIGEyIHRocmVzaG9sZCBmb3Igc3RlcmVvL2JpbGluZ3VhbCAqLwotCQkgICAgICAgc3RlcmVvX3RocmVzaG9sZCk7Ci0JbXNwLT5zb3VyY2U9c291cmNlOwotfQotCi1zdGF0aWMgdm9pZCBtc3AzNHh4Z19kZXRlY3Rfc3RlcmVvKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IG1zcDM0MDBjICptc3AgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCWludCBzdGF0dXMgPSBtc3AzNDAwY19yZWFkKGNsaWVudCwKLQkJCQkgICBJMkNfTVNQMzQwMENfREVNLAotCQkJCSAgIDB4MDIwMCAvKiBTVEFUVVMgKi8pOwotCWludCBpc19iaWxpbmd1YWwgPSBzdGF0dXMmMHgxMDA7Ci0JaW50IGlzX3N0ZXJlbyA9IHN0YXR1cyYweDQwOwotCi0JbXNwLT5yeHN1YmNoYW5zID0gMDsKLQlpZiAoaXNfc3RlcmVvKQotCQltc3AtPnJ4c3ViY2hhbnMgfD0gVjRMMl9UVU5FUl9TVUJfU1RFUkVPOwotCWVsc2UKLQkJbXNwLT5yeHN1YmNoYW5zIHw9IFY0TDJfVFVORVJfU1VCX01PTk87Ci0JaWYgKGlzX2JpbGluZ3VhbCkgewotCQltc3AtPnJ4c3ViY2hhbnMgfD0gVjRMMl9UVU5FUl9TVUJfTEFORzF8VjRMMl9UVU5FUl9TVUJfTEFORzI7Ci0JCS8qIEknbSBzdXBwb3NlZCB0byBjaGVjayB3aGV0aGVyIGl0J3MgU0FQIG9yIG5vdAotCQkgKiBhbmQgc2V0IG9ubHkgTEFORzIvU0FQIGluIHRoaXMgY2FzZS4gWWV0LCB0aGUgTVNQCi0JCSAqIGRvZXMgYSBsb3Qgb2Ygd29yayB0byBoaWRlIHRoaXMgYW5kIGhhbmRsZSBldmVyeXRoaW5nCi0JCSAqIHRoZSBzYW1lIHdheS4gSSBkb24ndCB3YW50IHRvIHdvcmsgYXJvdW5kIGl0IHNvIHVubGVzcwotCQkgKiB0aGlzIGlzIGEgcHJvYmxlbSwgSSdsbCBoYW5kbGUgU0FQIGp1c3QgbGlrZSBsYW5nMS9sYW5nMi4KLQkJICovCi0JfQotCW1zcDM0MDBfZGJnKCJzdGF0dXM9MHgleCwgc3RlcmVvPSVkLCBiaWxpbmd1YWw9JWQgLT4gcnhzdWJjaGFucz0lZFxuIiwKLQkJc3RhdHVzLCBpc19zdGVyZW8sIGlzX2JpbGluZ3VhbCwgbXNwLT5yeHN1YmNoYW5zKTsKLX0KLQotc3RhdGljIHZvaWQgbXNwMzR4eGdfc2V0X2F1ZG1vZGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGF1ZG1vZGUpCi17Ci0Jc3RydWN0IG1zcDM0MDBjICptc3AgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlpbnQgc291cmNlOwotCi0Jc3dpdGNoIChhdWRtb2RlKSB7Ci0JY2FzZSBWNEwyX1RVTkVSX01PREVfTU9OTzoKLQkJc291cmNlPTA7IC8qIG1vbm8gb25seSAqLwotCQlicmVhazsKLQljYXNlIFY0TDJfVFVORVJfTU9ERV9TVEVSRU86Ci0JCXNvdXJjZT0xOyAvKiBzdGVyZW8gb3IgQXxCLCBzZWUgY29tbWVudCBpbiBtc3AzNHh4Z19nZXRfdjRsMl9zdGVyZW8oKSAqLwotCQkvKiBwcm9ibGVtOiB0aGF0IGNvdWxkIGFsc28gbWVhbiAyIChzY2FydCBpbnB1dCkgKi8KLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzE6Ci0JCXNvdXJjZT0zOyAvKiBzdGVyZW8gb3IgQSAqLwotCQlicmVhazsKLQljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMjoKLQkJc291cmNlPTQ7IC8qIHN0ZXJlbyBvciBCICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWF1ZG1vZGUgPSAwOwotCQlzb3VyY2UgID0gMTsKLQkJYnJlYWs7Ci0JfQotCW1zcC0+YXVkbW9kZSA9IGF1ZG1vZGU7Ci0JbXNwMzR4eGdfc2V0X3NvdXJjZShjbGllbnQsIHNvdXJjZSk7Ci19Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIGludCBtc3BfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IGFkZHIsIGludCBraW5kKTsKLXN0YXRpYyBpbnQgbXNwX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKLXN0YXRpYyBpbnQgbXNwX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCk7Ci1zdGF0aWMgaW50IG1zcF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7Ci0KLXN0YXRpYyBpbnQgbXNwX3N1c3BlbmQoc3RydWN0IGRldmljZSAqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLXN0YXRpYyBpbnQgbXNwX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICogZGV2KTsKLQotc3RhdGljIHZvaWQgbXNwX3dha2VfdGhyZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyID0gewotCS5pZCAgICAgICAgICAgICA9IEkyQ19EUklWRVJJRF9NU1AzNDAwLAotCS5hdHRhY2hfYWRhcHRlciA9IG1zcF9wcm9iZSwKLQkuZGV0YWNoX2NsaWVudCAgPSBtc3BfZGV0YWNoLAotCS5jb21tYW5kICAgICAgICA9IG1zcF9jb21tYW5kLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lICAgID0gImkyYyBtc3AzNDAwIGRyaXZlciIsCi0JCS5zdXNwZW5kID0gbXNwX3N1c3BlbmQsCi0JCS5yZXN1bWUgID0gbXNwX3Jlc3VtZSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9Ci17Ci0JLm5hbWUgICAgICA9ICIodW5zZXQpIiwKLQkuZHJpdmVyICAgID0gJmRyaXZlciwKLX07Ci0KLXN0YXRpYyBpbnQgbXNwX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCkKLXsKLQlzdHJ1Y3QgbXNwMzQwMGMgKm1zcDsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gJmNsaWVudF90ZW1wbGF0ZTsKLQlpbnQgKCp0aHJlYWRfZnVuYykodm9pZCAqZGF0YSkgPSBOVUxMOwotCWludCBpOwotCi0JY2xpZW50X3RlbXBsYXRlLmFkYXB0ZXIgPSBhZGFwOwotCWNsaWVudF90ZW1wbGF0ZS5hZGRyID0gYWRkcjsKLQotCWlmICgtMSA9PSBtc3AzNDAwY19yZXNldCgmY2xpZW50X3RlbXBsYXRlKSkgewotCQltc3AzNDAwX2RiZygibm8gY2hpcCBmb3VuZFxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoTlVMTCA9PSAoY2xpZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLEdGUF9LRVJORUwpKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtY3B5KGNsaWVudCwmY2xpZW50X3RlbXBsYXRlLHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOwotCWlmIChOVUxMID09IChtc3AgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXNwMzQwMGMpLEdGUF9LRVJORUwpKSkgewotCQlrZnJlZShjbGllbnQpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQltZW1zZXQobXNwLDAsc2l6ZW9mKHN0cnVjdCBtc3AzNDAwYykpOwotCW1zcC0+bm9ybSA9IFZJREVPX01PREVfTlRTQzsKLQltc3AtPmxlZnQgPSA1ODg4MDsJLyogMGRiIGdhaW4gKi8KLQltc3AtPnJpZ2h0ID0gNTg4ODA7CS8qIDBkYiBnYWluICovCi0JbXNwLT5iYXNzID0gMzI3Njg7Ci0JbXNwLT50cmVibGUgPSAzMjc2ODsKLQltc3AtPmlucHV0ID0gLTE7Ci0JbXNwLT5tdXRlZCA9IDA7Ci0JbXNwLT5pMnNfbW9kZSA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IERGUF9DT1VOVDsgaSsrKQotCQltc3AtPmRmcF9yZWdzW2ldID0gLTE7Ci0KLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBtc3ApOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1zcC0+d3EpOwotCi0JaWYgKC0xID09IG1zcDM0MDBjX3Jlc2V0KGNsaWVudCkpIHsKLQkJa2ZyZWUobXNwKTsKLQkJa2ZyZWUoY2xpZW50KTsKLQkJbXNwMzQwMF9kYmcoIm5vIGNoaXAgZm91bmRcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JbXNwLT5yZXYxID0gbXNwMzQwMGNfcmVhZChjbGllbnQsIEkyQ19NU1AzNDAwQ19ERlAsIDB4MWUpOwotCWlmICgtMSAhPSBtc3AtPnJldjEpCi0JCW1zcC0+cmV2MiA9IG1zcDM0MDBjX3JlYWQoY2xpZW50LCBJMkNfTVNQMzQwMENfREZQLCAweDFmKTsKLQlpZiAoKC0xID09IG1zcC0+cmV2MSkgfHwgKDAgPT0gbXNwLT5yZXYxICYmIDAgPT0gbXNwLT5yZXYyKSkgewotCQlrZnJlZShtc3ApOwotCQlrZnJlZShjbGllbnQpOwotCQltc3AzNDAwX2RiZygiZXJyb3Igd2hpbGUgcmVhZGluZyBjaGlwIHZlcnNpb25cbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW1zcDM0MDBfZGJnKCJyZXYxPTB4JTA0eCwgcmV2Mj0weCUwNHhcbiIsIG1zcC0+cmV2MSwgbXNwLT5yZXYyKTsKLQotCW1zcDM0MDBjX3NldHZvbHVtZShjbGllbnQsIG1zcC0+bXV0ZWQsIG1zcC0+bGVmdCwgbXNwLT5yaWdodCk7Ci0KLQlzbnByaW50ZihjbGllbnQtPm5hbWUsIHNpemVvZihjbGllbnQtPm5hbWUpLCAiTVNQJWM0JTAyZCVjLSVjJWQiLAotCQkgKChtc3AtPnJldjE+PjQpJjB4MGYpICsgJzMnLAotCQkgKG1zcC0+cmV2Mj4+OCkmMHhmZiwgKG1zcC0+cmV2MSYweDBmKSsnQCcsCi0JCSAoKG1zcC0+cmV2MT4+OCkmMHhmZikrJ0AnLCBtc3AtPnJldjImMHgxZik7Ci0KLQltc3AtPm9wbW9kZSA9IG9wbW9kZTsKLQlpZiAoT1BNT0RFX0FVVE8gPT0gbXNwLT5vcG1vZGUpIHsKLQkJaWYgKEhBVkVfU0lNUExFUihtc3ApKQotCQkJbXNwLT5vcG1vZGUgPSBPUE1PREVfU0lNUExFUjsKLQkJZWxzZSBpZiAoSEFWRV9TSU1QTEUobXNwKSkKLQkJCW1zcC0+b3Btb2RlID0gT1BNT0RFX1NJTVBMRTsKLQkJZWxzZQotCQkJbXNwLT5vcG1vZGUgPSBPUE1PREVfTUFOVUFMOwotCX0KLQotCS8qIGhlbGxvIHdvcmxkIDotKSAqLwotCW1zcDM0MDBfaW5mbygiY2hpcD0lcyIsIGNsaWVudC0+bmFtZSk7Ci0JaWYgKEhBVkVfTklDQU0obXNwKSkKLQkJcHJpbnRrKCIgK25pY2FtIik7Ci0JaWYgKEhBVkVfU0lNUExFKG1zcCkpCi0JCXByaW50aygiICtzaW1wbGUiKTsKLQlpZiAoSEFWRV9TSU1QTEVSKG1zcCkpCi0JCXByaW50aygiICtzaW1wbGVyIik7Ci0JaWYgKEhBVkVfUkFESU8obXNwKSkKLQkJcHJpbnRrKCIgK3JhZGlvIik7Ci0KLQkvKiB2ZXJzaW9uLXNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCi0Jc3dpdGNoIChtc3AtPm9wbW9kZSkgewotCWNhc2UgT1BNT0RFX01BTlVBTDoKLQkJcHJpbnRrKCIgbW9kZT1tYW51YWwiKTsKLQkJdGhyZWFkX2Z1bmMgPSBtc3AzNDAwY190aHJlYWQ7Ci0JCWJyZWFrOwotCWNhc2UgT1BNT0RFX1NJTVBMRToKLQkJcHJpbnRrKCIgbW9kZT1zaW1wbGUiKTsKLQkJdGhyZWFkX2Z1bmMgPSBtc3AzNDEwZF90aHJlYWQ7Ci0JCWJyZWFrOwotCWNhc2UgT1BNT0RFX1NJTVBMRVI6Ci0JCXByaW50aygiIG1vZGU9c2ltcGxlciIpOwotCQl0aHJlYWRfZnVuYyA9IG1zcDM0eHhnX3RocmVhZDsKLQkJYnJlYWs7Ci0JfQotCXByaW50aygiXG4iKTsKLQotCS8qIHN0YXJ0dXAgY29udHJvbCB0aHJlYWQgaWYgbmVlZGVkICovCi0JaWYgKHRocmVhZF9mdW5jKSB7Ci0JCW1zcC0+a3RocmVhZCA9IGt0aHJlYWRfcnVuKHRocmVhZF9mdW5jLCBjbGllbnQsICJtc3AzNHh4Iik7Ci0KLQkJaWYgKE5VTEwgPT0gbXNwLT5rdGhyZWFkKQotCQkJbXNwMzQwMF93YXJuKCJrZXJuZWxfdGhyZWFkKCkgZmFpbGVkXG4iKTsKLQkJbXNwX3dha2VfdGhyZWFkKGNsaWVudCk7Ci0JfQotCi0JLyogZG9uZSAqLwotCWkyY19hdHRhY2hfY2xpZW50KGNsaWVudCk7Ci0KLQkvKiB1cGRhdGUgb3VyIG93biBhcnJheSAqLwotCWZvciAoaSA9IDA7IGkgPCBNU1AzNDAwX01BWDsgaSsrKSB7Ci0JCWlmIChOVUxMID09IG1zcHNbaV0pIHsKLQkJCW1zcHNbaV0gPSBjbGllbnQ7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zcF9kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgbXNwMzQwMGMgKm1zcCAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlpbnQgaTsKLQotCS8qIHNodXRkb3duIGNvbnRyb2wgdGhyZWFkICovCi0JaWYgKG1zcC0+a3RocmVhZCkgewotCQltc3AtPnJlc3RhcnQgPSAxOwotCQlrdGhyZWFkX3N0b3AobXNwLT5rdGhyZWFkKTsKLQl9Ci0JbXNwMzQwMGNfcmVzZXQoY2xpZW50KTsKLQotCS8qIHVwZGF0ZSBvdXIgb3duIGFycmF5ICovCi0JZm9yIChpID0gMDsgaSA8IE1TUDM0MDBfTUFYOyBpKyspIHsKLQkJaWYgKGNsaWVudCA9PSBtc3BzW2ldKSB7Ci0JCQltc3BzW2ldID0gTlVMTDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKLQotCWtmcmVlKG1zcCk7Ci0Ja2ZyZWUoY2xpZW50KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc3BfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQotewotCWlmIChhZGFwLT5jbGFzcyAmIEkyQ19DTEFTU19UVl9BTkFMT0cpCi0JCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgbXNwX2F0dGFjaCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zcF93YWtlX3RocmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBtc3AzNDAwYyAqbXNwICA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0JaWYgKE5VTEwgPT0gbXNwLT5rdGhyZWFkKQotCQlyZXR1cm47Ci0JbXNwMzQwMGNfc2V0dm9sdW1lKGNsaWVudCxtc3AtPm11dGVkLDAsMCk7Ci0JbXNwLT53YXRjaF9zdGVyZW8gPSAwOwotCW1zcC0+cmVzdGFydCA9IDE7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZtc3AtPndxKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIGludCBtb2RlX3Y0bDJfdG9fdjRsMShpbnQgcnhzdWJjaGFucykKLXsKLQlpbnQgbW9kZSA9IDA7Ci0KLQlpZiAocnhzdWJjaGFucyAmIFY0TDJfVFVORVJfU1VCX1NURVJFTykKLQkJbW9kZSB8PSBWSURFT19TT1VORF9TVEVSRU87Ci0JaWYgKHJ4c3ViY2hhbnMgJiBWNEwyX1RVTkVSX1NVQl9MQU5HMikKLQkJbW9kZSB8PSBWSURFT19TT1VORF9MQU5HMjsKLQlpZiAocnhzdWJjaGFucyAmIFY0TDJfVFVORVJfU1VCX0xBTkcxKQotCQltb2RlIHw9IFZJREVPX1NPVU5EX0xBTkcxOwotCWlmICgwID09IG1vZGUpCi0JCW1vZGUgfD0gVklERU9fU09VTkRfTU9OTzsKLQlyZXR1cm4gbW9kZTsKLX0KLQotc3RhdGljIGludCBtb2RlX3Y0bDFfdG9fdjRsMihpbnQgbW9kZSkKLXsKLQlpZiAobW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykKLQkJcmV0dXJuIFY0TDJfVFVORVJfTU9ERV9TVEVSRU87Ci0JaWYgKG1vZGUgJiBWSURFT19TT1VORF9MQU5HMikKLQkJcmV0dXJuIFY0TDJfVFVORVJfTU9ERV9MQU5HMjsKLQlpZiAobW9kZSAmIFZJREVPX1NPVU5EX0xBTkcxKQotCQlyZXR1cm4gVjRMMl9UVU5FUl9NT0RFX0xBTkcxOwotCXJldHVybiBWNEwyX1RVTkVSX01PREVfTU9OTzsKLX0KLQotc3RhdGljIHZvaWQgbXNwX2FueV9kZXRlY3Rfc3RlcmVvKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IG1zcDM0MDBjICptc3AgID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQlzd2l0Y2ggKG1zcC0+b3Btb2RlKSB7Ci0JY2FzZSBPUE1PREVfTUFOVUFMOgotCWNhc2UgT1BNT0RFX1NJTVBMRToKLQkJYXV0b2RldGVjdF9zdGVyZW8oY2xpZW50KTsKLQkJYnJlYWs7Ci0JY2FzZSBPUE1PREVfU0lNUExFUjoKLQkJbXNwMzR4eGdfZGV0ZWN0X3N0ZXJlbyhjbGllbnQpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG1zcF9hbnlfc2V0X2F1ZG1vZGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGF1ZG1vZGUpCi17Ci0Jc3RydWN0IG1zcDM0MDBjICptc3AgID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQlzd2l0Y2ggKG1zcC0+b3Btb2RlKSB7Ci0JY2FzZSBPUE1PREVfTUFOVUFMOgotCWNhc2UgT1BNT0RFX1NJTVBMRToKLQkJbXNwLT53YXRjaF9zdGVyZW8gPSAwOwotCQltc3AzNDAwY19zZXRzdGVyZW8oY2xpZW50LCBhdWRtb2RlKTsKLQkJYnJlYWs7Ci0JY2FzZSBPUE1PREVfU0lNUExFUjoKLQkJbXNwMzR4eGdfc2V0X2F1ZG1vZGUoY2xpZW50LCBhdWRtb2RlKTsKLQkJYnJlYWs7Ci0JfQotfQotCi0KLXN0YXRpYyBpbnQgbXNwX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCXN0cnVjdCBtc3AzNDAwYyAqbXNwICA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCV9fdTE2ICAgICAgICAgICAqc2FyZyA9IGFyZzsKLQlpbnQgc2NhcnQgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQotCWNhc2UgQVVEQ19TRVRfSU5QVVQ6Ci0JCW1zcDM0MDBfZGJnKCJBVURDX1NFVF9JTlBVVCglZClcbiIsKnNhcmcpOwotCi0JCWlmICgqc2FyZyA9PSBtc3AtPmlucHV0KQotCQkJYnJlYWs7Ci0JCW1zcC0+aW5wdXQgPSAqc2FyZzsKLQkJc3dpdGNoICgqc2FyZykgewotCQljYXNlIEFVRElPX1JBRElPOgotCQkJLyogSGF1cHBhdWdlIHVzZXMgSU4yIGZvciB0aGUgcmFkaW8gKi8KLQkJCW1zcC0+bW9kZSAgID0gTVNQX01PREVfRk1fUkFESU87Ci0JCQlzY2FydCAgICAgICA9IFNDQVJUX0lOMjsKLQkJCWJyZWFrOwotCQljYXNlIEFVRElPX0VYVEVSTl8xOgotCQkJLyogSU4xIGlzIG9mdGVuIHVzZWQgZm9yIGV4dGVybmFsIGlucHV0IC4uLiAqLwotCQkJbXNwLT5tb2RlICAgPSBNU1BfTU9ERV9FWFRFUk47Ci0JCQlzY2FydCAgICAgICA9IFNDQVJUX0lOMTsKLQkJCWJyZWFrOwotCQljYXNlIEFVRElPX0VYVEVSTl8yOgotCQkJLyogLi4uIHNvbWV0aW1lcyBpdCBpcyBJTjIgdGhyb3VnaCA7KSAqLwotCQkJbXNwLT5tb2RlICAgPSBNU1BfTU9ERV9FWFRFUk47Ci0JCQlzY2FydCAgICAgICA9IFNDQVJUX0lOMjsKLQkJCWJyZWFrOwotCQljYXNlIEFVRElPX1RVTkVSOgotCQkJbXNwLT5tb2RlICAgPSAtMTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaWYgKCpzYXJnICYgQVVESU9fTVVURSkKLQkJCQltc3AzNDAwY19zZXRfc2NhcnQoY2xpZW50LFNDQVJUX01VVEUsMCk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoc2NhcnQpIHsKLQkJCW1zcC0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKLQkJCW1zcC0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87Ci0JCQltc3AzNDAwY19zZXRfc2NhcnQoY2xpZW50LHNjYXJ0LDApOwotCQkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsMHgwMDBkLDB4MTkwMCk7Ci0JCQlpZiAobXNwLT5vcG1vZGUgIT0gT1BNT0RFX1NJTVBMRVIpCi0JCQkJbXNwMzQwMGNfc2V0c3RlcmVvKGNsaWVudCwgbXNwLT5hdWRtb2RlKTsKLQkJfQotCQltc3Bfd2FrZV90aHJlYWQoY2xpZW50KTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRENfU0VUX1JBRElPOgotCQltc3AzNDAwX2RiZygiQVVEQ19TRVRfUkFESU9cbiIpOwotCQltc3AtPm5vcm0gPSBWSURFT19NT0RFX1JBRElPOwotCQltc3AzNDAwX2RiZygic3dpdGNoaW5nIHRvIHJhZGlvIG1vZGVcbiIpOwotCQltc3AtPndhdGNoX3N0ZXJlbyA9IDA7Ci0JCXN3aXRjaCAobXNwLT5vcG1vZGUpIHsKLQkJY2FzZSBPUE1PREVfTUFOVUFMOgotCQkJLyogc2V0IG1zcDM0MDAgdG8gRk0gcmFkaW8gbW9kZSAqLwotCQkJbXNwMzQwMGNfc2V0bW9kZShjbGllbnQsTVNQX01PREVfRk1fUkFESU8pOwotCQkJbXNwMzQwMGNfc2V0Y2FycmllcihjbGllbnQsIE1TUF9DQVJSSUVSKDEwLjcpLAotCQkJCQkgICAgTVNQX0NBUlJJRVIoMTAuNykpOwotCQkJbXNwMzQwMGNfc2V0dm9sdW1lKGNsaWVudCwgbXNwLT5tdXRlZCwgbXNwLT5sZWZ0LCBtc3AtPnJpZ2h0KTsKLQkJCWJyZWFrOwotCQljYXNlIE9QTU9ERV9TSU1QTEU6Ci0JCWNhc2UgT1BNT0RFX1NJTVBMRVI6Ci0JCQkvKiB0aGUgdGhyZWFkIHdpbGwgZG8gZm9yIHVzICovCi0JCQltc3Bfd2FrZV90aHJlYWQoY2xpZW50KTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCQkvKiB3b3JrLWluLXByb2dyZXNzOiAgaG9vayB0byBjb250cm9sIHRoZSBERlAgcmVnaXN0ZXJzICovCi0JY2FzZSBNU1BfU0VUX0RGUFJFRzoKLQl7Ci0JCXN0cnVjdCBtc3BfZGZwcmVnICpyID0gYXJnOwotCQlpbnQgaTsKLQotCQlpZiAoci0+cmVnIDwgMCB8fCByLT5yZWcgPj0gREZQX0NPVU5UKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoYmxfZGZwKSAvIHNpemVvZihpbnQpOyBpKyspCi0JCQlpZiAoci0+cmVnID09IGJsX2RmcFtpXSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJbXNwLT5kZnBfcmVnc1tyLT5yZWddID0gci0+dmFsdWU7Ci0JCW1zcDM0MDBjX3dyaXRlKGNsaWVudCwgSTJDX01TUDM0MDBDX0RGUCwgci0+cmVnLCByLT52YWx1ZSk7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIE1TUF9HRVRfREZQUkVHOgotCXsKLQkJc3RydWN0IG1zcF9kZnByZWcgKnIgPSBhcmc7Ci0KLQkJaWYgKHItPnJlZyA8IDAgfHwgci0+cmVnID49IERGUF9DT1VOVCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyLT52YWx1ZSA9IG1zcDM0MDBjX3JlYWQoY2xpZW50LCBJMkNfTVNQMzQwMENfREZQLCByLT5yZWcpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiAtLS0gdjRsIGlvY3RscyAtLS0gKi8KLQkvKiB0YWtlIGNhcmU6IGJ0dHYgZG9lcyB1c2Vyc3BhY2UgY29weWluZywgd2UnbGwgZ2V0IGEKLQkgICBrZXJuZWwgcG9pbnRlciBoZXJlLi4uICovCi0JY2FzZSBWSURJT0NHQVVESU86Ci0JewotCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnZhID0gYXJnOwotCi0JCW1zcDM0MDBfZGJnKCJWSURJT0NHQVVESU9cbiIpOwotCQl2YS0+ZmxhZ3MgfD0gVklERU9fQVVESU9fVk9MVU1FIHwKLQkJCVZJREVPX0FVRElPX0JBU1MgfAotCQkJVklERU9fQVVESU9fVFJFQkxFIHwKLQkJCVZJREVPX0FVRElPX01VVEFCTEU7Ci0JCWlmIChtc3AtPm11dGVkKQotCQkJdmEtPmZsYWdzIHw9IFZJREVPX0FVRElPX01VVEU7Ci0KLQkJaWYgKG1zcC0+bXV0ZWQpCi0JCQl2YS0+ZmxhZ3MgfD0gVklERU9fQVVESU9fTVVURTsKLQkJdmEtPnZvbHVtZSA9IE1BWChtc3AtPmxlZnQsIG1zcC0+cmlnaHQpOwotCQl2YS0+YmFsYW5jZSA9ICgzMjc2OCAqIE1JTihtc3AtPmxlZnQsIG1zcC0+cmlnaHQpKSAvCi0JCSAgICAodmEtPnZvbHVtZSA/IHZhLT52b2x1bWUgOiAxKTsKLQkJdmEtPmJhbGFuY2UgPSAobXNwLT5sZWZ0IDwgbXNwLT5yaWdodCkgPwotCQkgICAgKDY1NTM1IC0gdmEtPmJhbGFuY2UpIDogdmEtPmJhbGFuY2U7Ci0JCWlmICgwID09IHZhLT52b2x1bWUpCi0JCQl2YS0+YmFsYW5jZSA9IDMyNzY4OwotCQl2YS0+YmFzcyA9IG1zcC0+YmFzczsKLQkJdmEtPnRyZWJsZSA9IG1zcC0+dHJlYmxlOwotCi0JCW1zcF9hbnlfZGV0ZWN0X3N0ZXJlbyhjbGllbnQpOwotCQl2YS0+bW9kZSA9IG1vZGVfdjRsMl90b192NGwxKG1zcC0+cnhzdWJjaGFucyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIFZJRElPQ1NBVURJTzoKLQl7Ci0JCXN0cnVjdCB2aWRlb19hdWRpbyAqdmEgPSBhcmc7Ci0KLQkJbXNwMzQwMF9kYmcoIlZJRElPQ1NBVURJT1xuIik7Ci0JCW1zcC0+bXV0ZWQgPSAodmEtPmZsYWdzICYgVklERU9fQVVESU9fTVVURSk7Ci0JCW1zcC0+bGVmdCA9IChNSU4oNjU1MzYgLSB2YS0+YmFsYW5jZSwgMzI3NjgpICoKLQkJCSAgICAgdmEtPnZvbHVtZSkgLyAzMjc2ODsKLQkJbXNwLT5yaWdodCA9IChNSU4odmEtPmJhbGFuY2UsIDMyNzY4KSAqIHZhLT52b2x1bWUpIC8gMzI3Njg7Ci0JCW1zcC0+YmFzcyA9IHZhLT5iYXNzOwotCQltc3AtPnRyZWJsZSA9IHZhLT50cmVibGU7Ci0JCW1zcDM0MDBfZGJnKCJWSURJT0NTQVVESU8gc2V0dGluZyB2YS0+dm9sdW1lIHRvICVkXG4iLAotCQkJdmEtPnZvbHVtZSk7Ci0JCW1zcDM0MDBfZGJnKCJWSURJT0NTQVVESU8gc2V0dGluZyB2YS0+YmFsYW5jZSB0byAlZFxuIiwKLQkJCXZhLT5iYWxhbmNlKTsKLQkJbXNwMzQwMF9kYmcoIlZJRElPQ1NBVURJTyBzZXR0aW5nIHZhLT5mbGFncyB0byAlZFxuIiwKLQkJCXZhLT5mbGFncyk7Ci0JCW1zcDM0MDBfZGJnKCJWSURJT0NTQVVESU8gc2V0dGluZyBtc3AtPmxlZnQgdG8gJWRcbiIsCi0JCQltc3AtPmxlZnQpOwotCQltc3AzNDAwX2RiZygiVklESU9DU0FVRElPIHNldHRpbmcgbXNwLT5yaWdodCB0byAlZFxuIiwKLQkJCW1zcC0+cmlnaHQpOwotCQltc3AzNDAwX2RiZygiVklESU9DU0FVRElPIHNldHRpbmcgbXNwLT5iYXNzIHRvICVkXG4iLAotCQkJbXNwLT5iYXNzKTsKLQkJbXNwMzQwMF9kYmcoIlZJRElPQ1NBVURJTyBzZXR0aW5nIG1zcC0+dHJlYmxlIHRvICVkXG4iLAotCQkJbXNwLT50cmVibGUpOwotCQltc3AzNDAwX2RiZygiVklESU9DU0FVRElPIHNldHRpbmcgbXNwLT5tb2RlIHRvICVkXG4iLAotCQkJbXNwLT5tb2RlKTsKLQkJbXNwMzQwMGNfc2V0dm9sdW1lKGNsaWVudCwgbXNwLT5tdXRlZCwgbXNwLT5sZWZ0LCBtc3AtPnJpZ2h0KTsKLQkJbXNwMzQwMGNfc2V0YmFzcyhjbGllbnQsIG1zcC0+YmFzcyk7Ci0JCW1zcDM0MDBjX3NldHRyZWJsZShjbGllbnQsIG1zcC0+dHJlYmxlKTsKLQotCQlpZiAodmEtPm1vZGUgIT0gMCAmJiBtc3AtPm5vcm0gIT0gVklERU9fTU9ERV9SQURJTykKLQkJCW1zcF9hbnlfc2V0X2F1ZG1vZGUoY2xpZW50LG1vZGVfdjRsMV90b192NGwyKHZhLT5tb2RlKSk7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgVklESU9DU0NIQU46Ci0JewotCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAqdmMgPSBhcmc7Ci0KLQkJbXNwMzQwMF9kYmcoIlZJRElPQ1NDSEFOIChub3JtPSVkKVxuIix2Yy0+bm9ybSk7Ci0JCW1zcC0+bm9ybSA9IHZjLT5ub3JtOwotCQltc3Bfd2FrZV90aHJlYWQoY2xpZW50KTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBWSURJT0NTRlJFUToKLQljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKLQl7Ci0JCS8qIG5ldyBjaGFubmVsIC0tIGtpY2sgYXVkaW8gY2FycmllciBzY2FuICovCi0JCW1zcDM0MDBfZGJnKCJWSURJT0NTRlJFUVxuIik7Ci0JCW1zcF93YWtlX3RocmVhZChjbGllbnQpOwotCQlicmVhazsKLQl9Ci0KLQkvKiBtc3AzNHh4IHNwZWNpZmljICovCi0JY2FzZSBNU1BfU0VUX01BVFJJWDoKLQl7Ci0JCXN0cnVjdCBtc3BfbWF0cml4ICptc3BtID0gYXJnOwotCi0JCW1zcDM0MDBfZGJnKCJNU1BfU0VUX01BVFJJWFxuIik7Ci0JCW1zcDM0MDBjX3NldF9zY2FydChjbGllbnQsIG1zcG0tPmlucHV0LCBtc3BtLT5vdXRwdXQpOwotCQlicmVhazsKLQl9Ci0KLQkvKiAtLS0gdjRsMiBpb2N0bHMgLS0tICovCi0JY2FzZSBWSURJT0NfU19TVEQ6Ci0JewotCQl2NGwyX3N0ZF9pZCAqaWQgPSBhcmc7Ci0KLQkJLypGSVhNRTogdXNlIFY0TDIgbW9kZSBmbGFncyBvbiBtc3AzNDAwIGluc3RlYWQgb2YgVjRMMSovCi0JCWlmICgqaWQgJiBWNEwyX1NURF9QQUwpIHsKLQkJCW1zcC0+bm9ybT1WSURFT19NT0RFX1BBTDsKLQkJfSBlbHNlIGlmICgqaWQgJiBWNEwyX1NURF9TRUNBTSkgewotCQkJbXNwLT5ub3JtPVZJREVPX01PREVfU0VDQU07Ci0JCX0gZWxzZSB7Ci0JCQltc3AtPm5vcm09VklERU9fTU9ERV9OVFNDOwotCQl9Ci0KLQkJbXNwX3dha2VfdGhyZWFkKGNsaWVudCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWNhc2UgVklESU9DX0VOVU1JTlBVVDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2lucHV0ICppID0gYXJnOwotCi0JCWlmIChpLT5pbmRleCAhPSAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaS0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9UVU5FUjsKLQkJc3dpdGNoIChpLT5pbmRleCkgewotCQljYXNlIEFVRElPX1JBRElPOgotCQkJc3RyY3B5KGktPm5hbWUsIlJhZGlvIik7Ci0JCQlicmVhazsKLQkJY2FzZSBBVURJT19FWFRFUk5fMToKLQkJCXN0cmNweShpLT5uYW1lLCJFeHRlcm4gMSIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVVESU9fRVhURVJOXzI6Ci0JCQlzdHJjcHkoaS0+bmFtZSwiRXh0ZXJuIDIiKTsKLQkJCWJyZWFrOwotCQljYXNlIEFVRElPX1RVTkVSOgotCQkJc3RyY3B5KGktPm5hbWUsIlRlbGV2aXNpb24iKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JY2FzZSBWSURJT0NfR19BVURJTzoKLQl7Ci0JCXN0cnVjdCB2NGwyX2F1ZGlvICphID0gYXJnOwotCi0JCW1lbXNldChhLDAsc2l6ZW9mKCphKSk7Ci0KLQkJc3dpdGNoIChhLT5pbmRleCkgewotCQljYXNlIEFVRElPX1JBRElPOgotCQkJc3RyY3B5KGEtPm5hbWUsIlJhZGlvIik7Ci0JCQlicmVhazsKLQkJY2FzZSBBVURJT19FWFRFUk5fMToKLQkJCXN0cmNweShhLT5uYW1lLCJFeHRlcm4gMSIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVVESU9fRVhURVJOXzI6Ci0JCQlzdHJjcHkoYS0+bmFtZSwiRXh0ZXJuIDIiKTsKLQkJCWJyZWFrOwotCQljYXNlIEFVRElPX1RVTkVSOgotCQkJc3RyY3B5KGEtPm5hbWUsIlRlbGV2aXNpb24iKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQltc3BfYW55X2RldGVjdF9zdGVyZW8oY2xpZW50KTsKLQkJaWYgKG1zcC0+YXVkbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfU1RFUkVPKSB7Ci0JCQlhLT5jYXBhYmlsaXR5PVY0TDJfQVVEQ0FQX1NURVJFTzsKLQkJfQotCi0JCWJyZWFrOwotCX0KLQljYXNlIFZJRElPQ19TX0FVRElPOgotCXsKLQkJc3RydWN0IHY0bDJfYXVkaW8gKnNhcmcgPSBhcmc7Ci0KLQkJc3dpdGNoIChzYXJnLT5pbmRleCkgewotCQljYXNlIEFVRElPX1JBRElPOgotCQkJLyogSGF1cHBhdWdlIHVzZXMgSU4yIGZvciB0aGUgcmFkaW8gKi8KLQkJCW1zcC0+bW9kZSAgID0gTVNQX01PREVfRk1fUkFESU87Ci0JCQlzY2FydCAgICAgICA9IFNDQVJUX0lOMjsKLQkJCWJyZWFrOwotCQljYXNlIEFVRElPX0VYVEVSTl8xOgotCQkJLyogSU4xIGlzIG9mdGVuIHVzZWQgZm9yIGV4dGVybmFsIGlucHV0IC4uLiAqLwotCQkJbXNwLT5tb2RlICAgPSBNU1BfTU9ERV9FWFRFUk47Ci0JCQlzY2FydCAgICAgICA9IFNDQVJUX0lOMTsKLQkJCWJyZWFrOwotCQljYXNlIEFVRElPX0VYVEVSTl8yOgotCQkJLyogLi4uIHNvbWV0aW1lcyBpdCBpcyBJTjIgdGhyb3VnaCA7KSAqLwotCQkJbXNwLT5tb2RlICAgPSBNU1BfTU9ERV9FWFRFUk47Ci0JCQlzY2FydCAgICAgICA9IFNDQVJUX0lOMjsKLQkJCWJyZWFrOwotCQljYXNlIEFVRElPX1RVTkVSOgotCQkJbXNwLT5tb2RlICAgPSAtMTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChzY2FydCkgewotCQkJbXNwLT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfU1RFUkVPOwotCQkJbXNwLT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKLQkJCW1zcDM0MDBjX3NldF9zY2FydChjbGllbnQsc2NhcnQsMCk7Ci0JCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwweDAwMGQsMHgxOTAwKTsKLQkJfQotCQlpZiAoc2FyZy0+Y2FwYWJpbGl0eT09VjRMMl9BVURDQVBfU1RFUkVPKSB7Ci0JCQltc3AtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOwotCQl9IGVsc2UgewotCQkJbXNwLT5hdWRtb2RlICY9IH5WNEwyX1RVTkVSX01PREVfU1RFUkVPOwotCQl9Ci0JCW1zcF9hbnlfc2V0X2F1ZG1vZGUoY2xpZW50LCBtc3AtPmF1ZG1vZGUpOwotCQltc3Bfd2FrZV90aHJlYWQoY2xpZW50KTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX0dfVFVORVI6Ci0JewotCQlzdHJ1Y3QgdjRsMl90dW5lciAqdnQgPSBhcmc7Ci0KLQkJbXNwX2FueV9kZXRlY3Rfc3RlcmVvKGNsaWVudCk7Ci0JCXZ0LT5hdWRtb2RlICAgID0gbXNwLT5hdWRtb2RlOwotCQl2dC0+cnhzdWJjaGFucyA9IG1zcC0+cnhzdWJjaGFuczsKLQkJdnQtPmNhcGFiaWxpdHkgPSBWNEwyX1RVTkVSX0NBUF9TVEVSRU8gfAotCQkJVjRMMl9UVU5FUl9DQVBfTEFORzF8Ci0JCQlWNEwyX1RVTkVSX0NBUF9MQU5HMjsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX1NfVFVORVI6Ci0JewotCQlzdHJ1Y3QgdjRsMl90dW5lciAqdnQ9KHN0cnVjdCB2NGwyX3R1bmVyICopYXJnOwotCi0JCS8qIG9ubHkgc2V0IGF1ZG1vZGUgKi8KLQkJaWYgKHZ0LT5hdWRtb2RlICE9IC0xICYmIHZ0LT5hdWRtb2RlICE9IDApCi0JCQltc3BfYW55X3NldF9hdWRtb2RlKGNsaWVudCwgdnQtPmF1ZG1vZGUpOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIFZJRElPQ19HX0FVRE9VVDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2F1ZGlvb3V0ICphPShzdHJ1Y3QgdjRsMl9hdWRpb291dCAqKWFyZzsKLQkJaW50IGlkeD1hLT5pbmRleDsKLQotCQltZW1zZXQoYSwwLHNpemVvZigqYSkpOwotCi0JCXN3aXRjaCAoaWR4KSB7Ci0JCWNhc2UgMDoKLQkJCXN0cmNweShhLT5uYW1lLCJTY2FydDEgT3V0Iik7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJc3RyY3B5KGEtPm5hbWUsIlNjYXJ0MiBPdXQiKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlzdHJjcHkoYS0+bmFtZSwiSTJTIE91dCIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQotCX0KLQljYXNlIFZJRElPQ19TX0FVRE9VVDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2F1ZGlvb3V0ICphPShzdHJ1Y3QgdjRsMl9hdWRpb291dCAqKWFyZzsKLQotCQlpZiAoYS0+aW5kZXg8MHx8YS0+aW5kZXg+MikKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWlmIChhLT5pbmRleD09MikgewotCQkJaWYgKGEtPm1vZGUgPT0gVjRMMl9BVURNT0RFXzMyQklUUykKLQkJCQltc3AtPmkyc19tb2RlPTE7Ci0JCQllbHNlCi0JCQkJbXNwLT5pMnNfbW9kZT0wOwotCQl9Ci0JCW1zcDM0MDBfZGJnKCJTZXR0aW5nIGF1ZGlvIG91dCBvbiBtc3AzNHh4IHRvIGlucHV0ICVpLCBtb2RlICVpXG4iLAotCQkJCQkJYS0+aW5kZXgsbXNwLT5pMnNfbW9kZSk7Ci0JCW1zcDM0MDBjX3NldF9zY2FydChjbGllbnQsbXNwLT5pbl9zY2FydCxhLT5pbmRleCsxKTsKLQotCQlicmVhazsKLQl9Ci0KLQlkZWZhdWx0OgotCQkvKiBub3RoaW5nICovCi0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc3Bfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICogZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBpMmNfY2xpZW50LCBkZXYpOwotCi0JbXNwMzQwMF9kYmcoIm1zcDM0eHg6IHN1c3BlbmRcbiIpOwotCW1zcDM0MDBjX3Jlc2V0KGNsaWVudCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNwX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICogZGV2KQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgaTJjX2NsaWVudCwgZGV2KTsKLQotCW1zcDM0MDBfZGJnKCJtc3AzNHh4OiByZXN1bWVcbiIpOwotCW1zcF93YWtlX3RocmVhZChjbGllbnQpOwotCXJldHVybiAwOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBtc3AzNDAwX2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZkcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXNwMzQwMF9jbGVhbnVwX21vZHVsZSh2b2lkKQotewotCWkyY19kZWxfZHJpdmVyKCZkcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChtc3AzNDAwX2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KG1zcDM0MDBfY2xlYW51cF9tb2R1bGUpOwotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLmgKaW5kZXggMmQ5ZmY0MC4uYTlhYzU3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLmgKQEAgLTYsMjEgKzYsMTkgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdHJ1Y3QgbXNwX2RmcHJlZyB7Ci0gICAgaW50IHJlZzsKLSAgICBpbnQgdmFsdWU7Ci19OworLyogVGhpcyBtYWNybyBpcyBhbGxvd2VkIGZvciAqY29uc3RhbnRzKiBvbmx5LCBnY2MgbXVzdCBjYWxjdWxhdGUgaXQKKyAgIGF0IGNvbXBpbGUgdGltZS4gIFJlbWVtYmVyIC0tIG5vIGZsb2F0cyBpbiBrZXJuZWwgbW9kZSAqLworI2RlZmluZSBNU1BfQ0FSUklFUihmcmVxKSAoKGludCkoKGZsb2F0KShmcmVxIC8gMTguNDMyKSAqICgxIDw8IDI0KSkpCiAKLXN0cnVjdCBtc3BfbWF0cml4IHsKLSAgaW50IGlucHV0OwotICBpbnQgb3V0cHV0OwotfTsKLQotI2RlZmluZSBNU1BfU0VUX0RGUFJFRyAgICAgX0lPVygnbScsMTUsc3RydWN0IG1zcF9kZnByZWcpCi0jZGVmaW5lIE1TUF9HRVRfREZQUkVHICAgICBfSU9XKCdtJywxNixzdHJ1Y3QgbXNwX2RmcHJlZykKLQotLyogaW9jdGwgZm9yIE1TUF9TRVRfTUFUUklYIHdpbGwgaGF2ZSB0byBiZSByZWdpc3RlcmVkICovCi0jZGVmaW5lIE1TUF9TRVRfTUFUUklYICAgICBfSU9XKCdtJywxNyxzdHJ1Y3QgbXNwX21hdHJpeCkKKyNkZWZpbmUgTVNQX01PREVfQU1fREVURUNUICAgMAorI2RlZmluZSBNU1BfTU9ERV9GTV9SQURJTyAgICAyCisjZGVmaW5lIE1TUF9NT0RFX0ZNX1RFUlJBICAgIDMKKyNkZWZpbmUgTVNQX01PREVfRk1fU0FUICAgICAgNAorI2RlZmluZSBNU1BfTU9ERV9GTV9OSUNBTTEgICA1CisjZGVmaW5lIE1TUF9NT0RFX0ZNX05JQ0FNMiAgIDYKKyNkZWZpbmUgTVNQX01PREVfQU1fTklDQU0gICAgNworI2RlZmluZSBNU1BfTU9ERV9CVFNDICAgICAgICA4CisjZGVmaW5lIE1TUF9NT0RFX0VYVEVSTiAgICAgIDkKIAogI2RlZmluZSBTQ0FSVF9NQVNLICAgIDAKICNkZWZpbmUgU0NBUlRfSU4xICAgICAxCkBAIC0zNiw0ICszNCw4NCBAQAogI2RlZmluZSBTQ0FSVDFfT1VUICAgIDEKICNkZWZpbmUgU0NBUlQyX09VVCAgICAyCiAKKyNkZWZpbmUgT1BNT0RFX0FVVE8gICAgICAgLTEKKyNkZWZpbmUgT1BNT0RFX01BTlVBTCAgICAgIDAKKyNkZWZpbmUgT1BNT0RFX0FVVE9ERVRFQ1QgIDEgICAvKiB1c2UgYXV0b2RldGVjdCAoPj0gbXNwMzQxMCBvbmx5KSAqLworI2RlZmluZSBPUE1PREVfQVVUT1NFTEVDVCAgMiAgIC8qIHVzZSBhdXRvZGV0ZWN0ICYgYXV0b3NlbGVjdCAoPj0gbXNwMzR4eEcpICAgKi8KKworLyogbW9kdWxlIHBhcmFtZXRlcnMgKi8KK2V4dGVybiBpbnQgbXNwX2RlYnVnOworZXh0ZXJuIGludCBtc3Bfb25jZTsKK2V4dGVybiBpbnQgbXNwX2Ftc291bmQ7CitleHRlcm4gaW50IG1zcF9zdGFuZGFyZDsKK2V4dGVybiBpbnQgbXNwX2RvbGJ5OworZXh0ZXJuIGludCBtc3Bfc3RlcmVvX3RocmVzaDsKKworc3RydWN0IG1zcF9zdGF0ZSB7CisJaW50IHJldjEsIHJldjI7CisJdTggaGFzX25pY2FtOworCXU4IGhhc19yYWRpbzsKKwl1OCBoYXNfaGVhZHBob25lczsKKwl1OCBoYXNfbnRzY19qcF9kX2szOworCXU4IGhhc19zY2FydDQ7CisJdTggaGFzX3NjYXJ0MjNfaW5fc2NhcnQyX291dDsKKwl1OCBoYXNfc2NhcnQyX291dF92b2x1bWU7CisJdTggaGFzX2kyc19jb25mOworCXU4IGhhc19zdWJ3b29mZXI7CisJdTggaGFzX3NvdW5kX3Byb2Nlc3Npbmc7CisJdTggaGFzX3ZpcnR1YWxfZG9sYnlfc3Vycm91bmQ7CisJdTggaGFzX2RvbGJ5X3Byb19sb2dpYzsKKworCWludCByYWRpbzsKKwlpbnQgb3Btb2RlOworCWludCBzdGQ7CisJaW50IG1vZGU7CisJdjRsMl9zdGRfaWQgdjRsMl9zdGQ7CisJaW50IG5pY2FtX29uOworCWludCBhY2I7CisJaW50IGluX3NjYXJ0OworCWludCBpMnNfbW9kZTsKKwlpbnQgbWFpbiwgc2Vjb25kOwkvKiBzb3VuZCBjYXJyaWVyICovCisJaW50IGlucHV0OworCWludCBzb3VyY2U7ICAgICAgICAgICAgIC8qIHNlZSBtc3AzNHh4Z19zZXRfc291cmNlICovCisKKwkvKiB2NGwyICovCisJaW50IGF1ZG1vZGU7CisJaW50IHJ4c3ViY2hhbnM7CisKKwlpbnQgdm9sdW1lLCBtdXRlZDsKKwlpbnQgYmFsYW5jZSwgbG91ZG5lc3M7CisJaW50IGJhc3MsIHRyZWJsZTsKKworCS8qIHRocmVhZCAqLworCXN0cnVjdCB0YXNrX3N0cnVjdCAgICprdGhyZWFkOworCXdhaXRfcXVldWVfaGVhZF90ICAgIHdxOworCWludCAgICAgICAgICAgICAgICAgIHJlc3RhcnQ6MTsKKwlpbnQgICAgICAgICAgICAgICAgICB3YXRjaF9zdGVyZW86MTsKK307CisKKy8qIG1zcDM0MDAtZHJpdmVyLmMgKi8KK2ludCBtc3Bfd3JpdGVfZGVtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBhZGRyLCBpbnQgdmFsKTsKK2ludCBtc3Bfd3JpdGVfZHNwKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBhZGRyLCBpbnQgdmFsKTsKK2ludCBtc3BfcmVhZF9kZW0oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGFkZHIpOworaW50IG1zcF9yZWFkX2RzcChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgYWRkcik7CitpbnQgbXNwX3Jlc2V0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwordm9pZCBtc3Bfc2V0X3NjYXJ0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBpbiwgaW50IG91dCk7Cit2b2lkIG1zcF9zZXRfbXV0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3ZvaWQgbXNwX3NldF9hdWRpbyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK2ludCBtc3BfbW9kdXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitpbnQgbXNwX3NsZWVwKHN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlLCBpbnQgdGltZW91dCk7CisKKy8qIG1zcDM0MDAta3RocmVhZHMuYyAqLworY29uc3QgY2hhciAqbXNwX3N0YW5kYXJkX3N0ZF9uYW1lKGludCBzdGQpOwordm9pZCBtc3AzNDAwY19zZXRjYXJyaWVyKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBjZG8xLCBpbnQgY2RvMik7Cit2b2lkIG1zcDM0MDBjX3NldG1vZGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHR5cGUpOwordm9pZCBtc3AzNDAwY19zZXRzdGVyZW8oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IG1vZGUpOworaW50IGF1dG9kZXRlY3Rfc3RlcmVvKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworaW50IG1zcDM0MDBjX3RocmVhZCh2b2lkICpkYXRhKTsKK2ludCBtc3AzNDEwZF90aHJlYWQodm9pZCAqZGF0YSk7CitpbnQgbXNwMzR4eGdfdGhyZWFkKHZvaWQgKmRhdGEpOwordm9pZCBtc3AzNHh4Z19kZXRlY3Rfc3RlcmVvKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwordm9pZCBtc3AzNHh4Z19zZXRfYXVkbW9kZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgYXVkbW9kZSk7CisKICNlbmRpZiAvKiBNU1AzNDAwX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQyMHh4LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210MjB4eC5jCmluZGV4IDIxODAwMTguLmM3YzlmM2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210MjB4eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQyMHh4LmMKQEAgLTIwLDYgKzIwLDkgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcmFkaW9fYW50ZW5uYSA9IDA7CiBtb2R1bGVfcGFyYW0ocmFkaW9fYW50ZW5uYSwgICAgIGludCwgMDY0NCk7CiAKKy8qIGZyb20gdHVuZXItY29yZS5jICovCitleHRlcm4gaW50IHR1bmVyX2RlYnVnOworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKICNkZWZpbmUgTVQyMDMyIDB4MDQKQEAgLTM1MCw4ICszNTMsOCBAQAogCX0gd2hpbGUgKHhvayAhPSAxICk7CiAJdC0+eG9nYz14b2djOwogCi0JdC0+dHZfZnJlcSAgICA9IG10MjAzMl9zZXRfdHZfZnJlcTsKLQl0LT5yYWRpb19mcmVxID0gbXQyMDMyX3NldF9yYWRpb19mcmVxOworCXQtPnNldF90dl9mcmVxICAgID0gbXQyMDMyX3NldF90dl9mcmVxOworCXQtPnNldF9yYWRpb19mcmVxID0gbXQyMDMyX3NldF9yYWRpb19mcmVxOwogCXJldHVybigxKTsKIH0KIApAQCAtNDc4LDggKzQ4MSw4IEBACiAJaTJjX21hc3Rlcl9yZWN2KGMsYnVmLDEpOwogCiAJdHVuZXJfZGJnKCJtdDIwNTA6IHNybyBpcyAleFxuIixidWZbMF0pOwotCXQtPnR2X2ZyZXEgICAgPSBtdDIwNTBfc2V0X3R2X2ZyZXE7Ci0JdC0+cmFkaW9fZnJlcSA9IG10MjA1MF9zZXRfcmFkaW9fZnJlcTsKKwl0LT5zZXRfdHZfZnJlcSAgICA9IG10MjA1MF9zZXRfdHZfZnJlcTsKKwl0LT5zZXRfcmFkaW9fZnJlcSA9IG10MjA1MF9zZXRfcmFkaW9fZnJlcTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDkxLDkgKzQ5NCwxNiBAQAogCWludCBjb21wYW55X2NvZGU7CiAKIAltZW1zZXQoYnVmLDAsc2l6ZW9mKGJ1ZikpOwotCXQtPnR2X2ZyZXEgICAgPSBOVUxMOwotCXQtPnJhZGlvX2ZyZXEgPSBOVUxMOworCXQtPnNldF90dl9mcmVxICAgID0gTlVMTDsKKwl0LT5zZXRfcmFkaW9fZnJlcSA9IE5VTEw7CiAJdC0+c3RhbmRieSAgICA9IE5VTEw7CisJaWYgKHQtPnN0ZCAmIFY0TDJfU1REXzUyNV82MCkgeworCQl0dW5lcl9kYmcoInBpbm5hY2xlIG50c2NcbiIpOworCQl0LT5yYWRpb19pZjIgPSA0MTMwMCAqIDEwMDA7CisJfSBlbHNlIHsKKwkJdHVuZXJfZGJnKCJwaW5uYWNsZSBwYWxcbiIpOworCQl0LT5yYWRpb19pZjIgPSAzMzMwMCAqIDEwMDA7CisJfQogCW5hbWUgPSAidW5rbm93biI7CiAKIAlpMmNfbWFzdGVyX3NlbmQoYyxidWYsMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL214Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9teGIuYwppbmRleCBkMDQ3OTNmLi44NDE2Y2VmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL214Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXhiLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zYWE3MTQ2X3Z2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KIAogI2luY2x1ZGUgIm14Yi5oIgogI2luY2x1ZGUgInRlYTY0MTVjLmgiCkBAIC0xNzYsMTIgKzE3NywxMSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlteGIgPSAoc3RydWN0IG14Yiopa21hbGxvYyhzaXplb2Yoc3RydWN0IG14YiksIEdGUF9LRVJORUwpOworCW14YiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBteGIpLCBHRlBfS0VSTkVMKTsKIAlpZiggTlVMTCA9PSBteGIgKSB7CiAJCURFQl9EKCgibm90IGVub3VnaCBrZXJuZWwgbWVtb3J5LlxuIikpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtc2V0KG14YiwgMHgwLCBzaXplb2Yoc3RydWN0IG14YikpOwkKIAogCW14Yi0+aTJjX2FkYXB0ZXIgPSAoc3RydWN0IGkyY19hZGFwdGVyKSB7CiAJCS5jbGFzcyA9IEkyQ19DTEFTU19UVl9BTkFMT0csCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdjZ4MjAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292NngyMC5jCmluZGV4IGIzZjRkMjYuLmMwNDEzMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292NngyMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292NngyMC5jCkBAIC0xNzgsMTAgKzE3OCw5IEBACiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwogCi0Jb3YtPnNwcml2ID0gcyA9IGttYWxsb2Moc2l6ZW9mICpzLCBHRlBfS0VSTkVMKTsKKwlvdi0+c3ByaXYgPSBzID0ga3phbGxvYyhzaXplb2YgKnMsIEdGUF9LRVJORUwpOwogCWlmICghcykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KHMsIDAsIHNpemVvZiAqcyk7CiAKIAlzLT5hdXRvX2JydCA9IDE7CiAJcy0+YXV0b19leHAgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3Y2eDMwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdjZ4MzAuYwppbmRleCA2ZWFiNDU4Li43M2I5NGY1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3Y2eDMwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3Y2eDMwLmMKQEAgLTE0MSwxMCArMTQxLDkgQEAKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CiAKLQlvdi0+c3ByaXYgPSBzID0ga21hbGxvYyhzaXplb2YgKnMsIEdGUF9LRVJORUwpOworCW92LT5zcHJpdiA9IHMgPSBremFsbG9jKHNpemVvZiAqcywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQocywgMCwgc2l6ZW9mICpzKTsKIAogCXMtPmF1dG9fYnJ0ID0gMTsKIAlzLT5hdXRvX2V4cCA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdjc2YmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292NzZiZS5jCmluZGV4IDI5YmJkYzAuLjExZjZiZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292NzZiZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292NzZiZS5jCkBAIC0xMDUsMTAgKzEwNSw5IEBACiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwogCi0Jb3YtPnNwcml2ID0gcyA9IGttYWxsb2Moc2l6ZW9mICpzLCBHRlBfS0VSTkVMKTsKKwlvdi0+c3ByaXYgPSBzID0ga3phbGxvYyhzaXplb2YgKnMsIEdGUF9LRVJORUwpOwogCWlmICghcykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KHMsIDAsIHNpemVvZiAqcyk7CiAKIAlzLT5hdXRvX2JydCA9IDE7CiAJcy0+YXV0b19leHAgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3Y3eDEwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdjd4MTAuYwppbmRleCA2YzM4M2Q0Li41MjA2ZTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdjd4MTAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdjd4MTAuYwpAQCAtMTE1LDEwICsxMTUsOSBAQAogCWlmIChyYyA8IDApCiAJCXJldHVybiByYzsKIAotCW92LT5zcHJpdiA9IHMgPSBrbWFsbG9jKHNpemVvZiAqcywgR0ZQX0tFUk5FTCk7CisJb3YtPnNwcml2ID0gcyA9IGt6YWxsb2Moc2l6ZW9mICpzLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXMpCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbXNldChzLCAwLCBzaXplb2YgKnMpOwogCiAJcy0+YXV0b19icnQgPSAxOwogCXMtPmF1dG9fZXhwID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292N3gyMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3Y3eDIwLmMKaW5kZXggM2M4YzQ4Zi4uOGUyNmFlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3Y3eDIwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3Y3eDIwLmMKQEAgLTIzMiwxMCArMjMyLDkgQEAKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CiAKLQlvdi0+c3ByaXYgPSBzID0ga21hbGxvYyhzaXplb2YgKnMsIEdGUF9LRVJORUwpOworCW92LT5zcHJpdiA9IHMgPSBremFsbG9jKHNpemVvZiAqcywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQocywgMCwgc2l6ZW9mICpzKTsKIAogCXMtPmF1dG9fYnJ0ID0gMTsKIAlzLT5hdXRvX2V4cCA9IERGTF9BVVRPX0VYUDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292Y2FtY2hpcF9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdmNhbWNoaXBfY29yZS5jCmluZGV4IDQyOGYxYmIuLmU3NmI1M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292Y2FtY2hpcF9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3ZjYW1jaGlwX2NvcmUuYwpAQCAtMzE2LDEyICszMTYsMTEgQEAKIAljLT5hZGFwdGVyID0gYWRhcDsKIAlzdHJjcHkoYy0+bmFtZSwgIk9WPz8/PyIpOwogCi0Jb3YgPSBrbWFsbG9jKHNpemVvZiAqb3YsIEdGUF9LRVJORUwpOworCW92ID0ga3phbGxvYyhzaXplb2YgKm92LCBHRlBfS0VSTkVMKTsKIAlpZiAoIW92KSB7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBub19vdjsKIAl9Ci0JbWVtc2V0KG92LCAwLCBzaXplb2YgKm92KTsKIAlpMmNfc2V0X2NsaWVudGRhdGEoYywgb3YpOwogCiAJcmMgPSBvdmNhbWNoaXBfZGV0ZWN0KGMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wbGFuYi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wbGFuYi5jCmluZGV4IGIxOWMzMzQuLmYzZmMzNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcGxhbmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3BsYW5iLmMKQEAgLTc2LDkgKzc2LDkgQEAKIHN0YXRpYyBpbnQgZGVmX25vcm0gPSBQTEFOQl9ERUZfTk9STTsJLyogZGVmYXVsdCBub3JtICovCiBzdGF0aWMgaW50IHZpZGVvX25yID0gLTE7CiAKLU1PRFVMRV9QQVJNKGRlZl9ub3JtLCAiaSIpOworbW9kdWxlX3BhcmFtKGRlZl9ub3JtLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhkZWZfbm9ybSwgIkRlZmF1bHQgc3RhcnR1cCBub3JtICgwPVBBTCwgMT1OVFNDLCAyPVNFQ0FNKSIpOwotTU9EVUxFX1BBUk0odmlkZW9fbnIsImkiKTsKK21vZHVsZV9wYXJhbSh2aWRlb19uciwgaW50LCAwKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Btcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wbXMuYwppbmRleCAyNTA0MjA3Li45ZTY0NDg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Btcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcG1zLmMKQEAgLTg4Myw2ICs4ODMsNyBAQAogCS5vcGVuICAgICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuLAogCS5yZWxlYXNlICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlLAogCS5pb2N0bCAgICAgICAgICA9IHBtc19pb2N0bCwKKwkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLAogCS5yZWFkICAgICAgICAgICA9IHBtc19yZWFkLAogCS5sbHNlZWsgICAgICAgICA9IG5vX2xsc2VlaywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTUyNDZhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTUyNDZhLmMKaW5kZXggMGFhOWU3Mi4uMmNlMDEwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE1MjQ2YS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNTI0NmEuYwpAQCAtODMsMTMgKzgzLDEyIEBACiAJY2xpZW50X3RlbXBsYXRlLmFkYXB0ZXIgPSBhZGFwOwogCWNsaWVudF90ZW1wbGF0ZS5hZGRyID0gYWRkcjsKIAltZW1jcHkoY2xpZW50LCAmY2xpZW50X3RlbXBsYXRlLCBzaXplb2YoKmNsaWVudCkpOwotCXQgPSBrbWFsbG9jKHNpemVvZigqdCksIEdGUF9LRVJORUwpOworCXQgPSBremFsbG9jKHNpemVvZigqdCksIEdGUF9LRVJORUwpOwogCWlmKHQ9PU5VTEwpCiAJewogCQlrZnJlZShjbGllbnQpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtc2V0KHQsIDAsIHNpemVvZigqdCkpOwogCXN0cmxjcHkoY2xpZW50LT5uYW1lLCBJRl9OQU1FLCBJMkNfTkFNRV9TSVpFKTsKIAlpbml0X01VVEVYKCZ0LT5sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE1MjQ5LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTUyNDkuYwppbmRleCBhNTFjN2JkOS4uNTY5NGViNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE1MjQ5LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE1MjQ5LmMKQEAgLTE1MSwxMyArMTUxLDEyIEBACiAgICAgICAgIGNsaWVudF90ZW1wbGF0ZS5hZGFwdGVyID0gYWRhcDsKICAgICAgICAgY2xpZW50X3RlbXBsYXRlLmFkZHIgPSBhZGRyOwogCW1lbWNweShjbGllbnQsICZjbGllbnRfdGVtcGxhdGUsIHNpemVvZigqY2xpZW50KSk7Ci0JdCA9IGttYWxsb2Moc2l6ZW9mKCp0KSwgR0ZQX0tFUk5FTCk7CisJdCA9IGt6YWxsb2Moc2l6ZW9mKCp0KSwgR0ZQX0tFUk5FTCk7CiAJaWYodD09TlVMTCkKIAl7CiAJCWtmcmVlKGNsaWVudCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQodCwgMCwgc2l6ZW9mKCp0KSk7CiAJc3RybGNweShjbGllbnQtPm5hbWUsIElGX05BTUUsIEkyQ19OQU1FX1NJWkUpOwogCWluaXRfTVVURVgoJnQtPmxvY2spOwogCQpAQCAtMTY1LDcgKzE2NCw3IEBACiAJICoJTm93IGNyZWF0ZSBhIHZpZGVvNGxpbnV4IGRldmljZQogCSAqLwogCSAKLQl2ZCA9IChzdHJ1Y3QgdmlkZW9fZGV2aWNlICopa21hbGxvYyhzaXplb2Yoc3RydWN0IHZpZGVvX2RldmljZSksIEdGUF9LRVJORUwpOworCXZkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZpZGVvX2RldmljZSksIEdGUF9LRVJORUwpOwogCWlmKHZkPT1OVUxMKQogCXsKIAkJa2ZyZWUodCk7CkBAIC03MDIsNiArNzAxLDcgQEAKIAkub3BlbgkJPSBzYWE1MjQ5X29wZW4sCiAJLnJlbGVhc2UgICAgICAgCT0gc2FhNTI0OV9yZWxlYXNlLAogCS5pb2N0bCAgICAgICAgICA9IHNhYTUyNDlfaW9jdGwsCisJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKIAkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTY1ODguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNjU4OC5jCmluZGV4IGQ2MGE3ODMuLmQxNzM5NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNjU4OC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNjU4OC5jCkBAIC01MCwxNSArNTAsMTUgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcGx2bCA9IDA7CiBzdGF0aWMgdW5zaWduZWQgaW50IGJ1ZmJsb2NrcyA9IDEwMDsKIAotTU9EVUxFX1BBUk0oZGVidWcsICJpIik7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIik7Ci1NT0RVTEVfUEFSTSh4dGFsLCAiaSIpOworbW9kdWxlX3BhcmFtKHh0YWwsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHh0YWwsICJzZWxlY3Qgb3NjaWxsYXRvciBmcmVxdWVuY3kgKDAuLjMpLCBkZWZhdWx0IDAiKTsKLU1PRFVMRV9QQVJNKHJiZHMsICJpIik7Cittb2R1bGVfcGFyYW0ocmJkcywgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MocmJkcywgInNlbGVjdCBtb2RlLCAwPVJEUywgMT1SQkRTLCBkZWZhdWx0IDAiKTsKLU1PRFVMRV9QQVJNKHBsdmwsICJpIik7Cittb2R1bGVfcGFyYW0ocGx2bCwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MocGx2bCwgInNlbGVjdCBwYXVzZSBsZXZlbCAoMC4uMyksIGRlZmF1bHQgMCIpOwotTU9EVUxFX1BBUk0oYnVmYmxvY2tzLCAiaSIpOworbW9kdWxlX3BhcmFtKGJ1ZmJsb2NrcywgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoYnVmYmxvY2tzLCAibnVtYmVyIG9mIGJ1ZmZlcmVkIGJsb2NrcywgZGVmYXVsdCAxMDAiKTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJ2NGwyIGRyaXZlciBtb2R1bGUgZm9yIFNBQTY1ODggUkRTIGRlY29kZXIiKTsKQEAgLTQyNywxOCArNDI3LDggQEAKIAogc3RhdGljIGludCBzYWE2NTg4X3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKIHsKLSNpZmRlZiBJMkNfQ0xBU1NfVFZfQU5BTE9HCiAJaWYgKGFkYXAtPmNsYXNzICYgSTJDX0NMQVNTX1RWX0FOQUxPRykKIAkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCBzYWE2NTg4X2F0dGFjaCk7Ci0jZWxzZQotCXN3aXRjaCAoYWRhcC0+aWQpIHsKLQljYXNlIEkyQ19IV19CX0JUODQ4OgotCWNhc2UgSTJDX0hXX0JfUklWQToKLQljYXNlIEkyQ19IV19TQUE3MTM0OgotCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHNhYTY1ODhfYXR0YWNoKTsKLQkJYnJlYWs7Ci0JfQotI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ5Niw3ICs0ODYsNyBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImkyYyBzYWE2NTg4IGRyaXZlciIsCisJCS5uYW1lID0gInNhYTY1ODgiLAogCX0sCiAJLmlkID0gLTEsCQkvKiBGSVhNRSAqLwogCS5hdHRhY2hfYWRhcHRlciA9IHNhYTY1ODhfcHJvYmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExMC5jCmluZGV4IDYxOWZmMGIuLjdiYjg1YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExMC5jCkBAIC00OTQsMjEgKzQ5NCwxOSBAQAogCSAgICAgSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFIHwgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURV9EQVRBKSkKIAkJcmV0dXJuIDA7CiAKLQljbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNsaWVudCA9PSAwKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQoY2xpZW50LCAwLCBzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKIAljbGllbnQtPmFkZHIgPSBhZGRyZXNzOwogCWNsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CiAJY2xpZW50LT5kcml2ZXIgPSAmaTJjX2RyaXZlcl9zYWE3MTEwOwogCXN0cmxjcHkoSTJDX05BTUUoY2xpZW50KSwgInNhYTcxMTAiLCBzaXplb2YoSTJDX05BTUUoY2xpZW50KSkpOwogCi0JZGVjb2RlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzYWE3MTEwKSwgR0ZQX0tFUk5FTCk7CisJZGVjb2RlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzYWE3MTEwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRlY29kZXIgPT0gMCkgewogCQlrZnJlZShjbGllbnQpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtc2V0KGRlY29kZXIsIDAsIHNpemVvZihzdHJ1Y3Qgc2FhNzExMCkpOwogCWRlY29kZXItPm5vcm0gPSBWSURFT19NT0RFX1BBTDsKIAlkZWNvZGVyLT5pbnB1dCA9IDA7CiAJZGVjb2Rlci0+ZW5hYmxlID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTExLmMKaW5kZXggYWNhZWVlNS4uOGMwNjU5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTExLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTExLmMKQEAgLTUxMSwyMSArNTExLDE5IEBACiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQogCQlyZXR1cm4gMDsKIAotCWNsaWVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJY2xpZW50ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoY2xpZW50ID09IDApCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbXNldChjbGllbnQsIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOwogCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CiAJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKIAljbGllbnQtPmRyaXZlciA9ICZpMmNfZHJpdmVyX3NhYTcxMTE7CiAJc3RybGNweShJMkNfTkFNRShjbGllbnQpLCAic2FhNzExMSIsIHNpemVvZihJMkNfTkFNRShjbGllbnQpKSk7CiAKLQlkZWNvZGVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNhYTcxMTEpLCBHRlBfS0VSTkVMKTsKKwlkZWNvZGVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNhYTcxMTEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZGVjb2RlciA9PSBOVUxMKSB7CiAJCWtmcmVlKGNsaWVudCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQoZGVjb2RlciwgMCwgc2l6ZW9mKHN0cnVjdCBzYWE3MTExKSk7CiAJZGVjb2Rlci0+bm9ybSA9IFZJREVPX01PREVfTlRTQzsKIAlkZWNvZGVyLT5pbnB1dCA9IDA7CiAJZGVjb2Rlci0+ZW5hYmxlID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExNC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE0LmMKaW5kZXggYjdhYzAxMi4uZmQwYTRiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE0LmMKQEAgLTg1MiwyMSArODUyLDE5IEBACiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQogCQlyZXR1cm4gMDsKIAotCWNsaWVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJY2xpZW50ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoY2xpZW50ID09IDApCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbXNldChjbGllbnQsIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOwogCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CiAJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKIAljbGllbnQtPmRyaXZlciA9ICZpMmNfZHJpdmVyX3NhYTcxMTQ7CiAJc3RybGNweShJMkNfTkFNRShjbGllbnQpLCAic2FhNzExNCIsIHNpemVvZihJMkNfTkFNRShjbGllbnQpKSk7CiAKLQlkZWNvZGVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNhYTcxMTQpLCBHRlBfS0VSTkVMKTsKKwlkZWNvZGVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNhYTcxMTQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZGVjb2RlciA9PSBOVUxMKSB7CiAJCWtmcmVlKGNsaWVudCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQoZGVjb2RlciwgMCwgc2l6ZW9mKHN0cnVjdCBzYWE3MTE0KSk7CiAJZGVjb2Rlci0+bm9ybSA9IFZJREVPX01PREVfTlRTQzsKIAlkZWNvZGVyLT5pbnB1dCA9IC0xOwogCWRlY29kZXItPmVuYWJsZSA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExNS5jCmluZGV4IDI5ZTI4YzcuLjA0OGQwMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExNS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExNS5jCkBAIC0zOSwzMSArMzksMTggQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvY2hpcC5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogCiBNT0RVTEVfREVTQ1JJUFRJT04oIlBoaWxpcHMgU0FBNzExNC9TQUE3MTE1IHZpZGVvIGRlY29kZXIgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJNYXhpbSBZZXZ0eXVzaGtpbiwgS2V2aW4gVGhheWVyLCBDaHJpcyBLZW5uZWR5LCBIYW5zIFZlcmt1aWwiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogc3RhdGljIGludCBkZWJ1ZyA9IDA7Ci1tb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0oZGVidWcsIGJvb2wsIDA2NDQpOwogCiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgKDAtMSkiKTsKIAotI2RlZmluZSBzYWE3MTE1X2RiZyhmbXQsYXJnLi4uKSBcCi0JZG8geyBcCi0JCWlmIChkZWJ1ZykgXAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgZGVidWcgJWQtJTA0eDogIiBmbXQsIFwKLQkJCSAgICAgICBjbGllbnQtPmRyaXZlci0+ZHJpdmVyLm5hbWUsIFwKLQkJCSAgICAgICBpMmNfYWRhcHRlcl9pZChjbGllbnQtPmFkYXB0ZXIpLCBjbGllbnQtPmFkZHIgLCAjIyBhcmcpOyBcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBzYWE3MTE1X2VycihmbXQsIGFyZy4uLikgZG8geyBcCi0JcHJpbnRrKEtFUk5fRVJSICIlcyAlZC0lMDR4OiAiIGZtdCwgY2xpZW50LT5kcml2ZXItPmRyaXZlci5uYW1lLCBcCi0JICAgICAgIGkyY19hZGFwdGVyX2lkKGNsaWVudC0+YWRhcHRlciksIGNsaWVudC0+YWRkciAsICMjIGFyZyk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHNhYTcxMTVfaW5mbyhmbXQsIGFyZy4uLikgZG8geyBcCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXMgJWQtJTA0eDogIiBmbXQsIGNsaWVudC0+ZHJpdmVyLT5kcml2ZXIubmFtZSwgXAotCSAgICAgICBpMmNfYWRhcHRlcl9pZChjbGllbnQtPmFkYXB0ZXIpLCBjbGllbnQtPmFkZHIgLCAjIyBhcmcpOyB9IHdoaWxlICgwKQotCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDQyID4+IDEsIDB4NDAgPj4gMSwgSTJDX0NMSUVOVF9FTkQgfTsKIAogCkBAIC03MywxMiArNjAsMTMgQEAKIAl2NGwyX3N0ZF9pZCBzdGQ7CiAJaW50IGlucHV0OwogCWludCBlbmFibGU7CisJaW50IHJhZGlvOwogCWludCBicmlnaHQ7CiAJaW50IGNvbnRyYXN0OwogCWludCBodWU7CiAJaW50IHNhdDsKIAllbnVtIHY0bDJfY2hpcF9pZGVudCBpZGVudDsKLQllbnVtIHY0bDJfYXVkaW9fY2xvY2tfZnJlcSBhdWRjbGtfZnJlcTsKKwl1MzIgYXVkY2xrX2ZyZXE7CiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNDY5LDgwICs0NTcsNiBAQAogCTB4MDAsIDB4MDAKIH07CiAKLS8qID09PT09PT09PT09PT09IFNBQTc3MTUgQVVESU8gc2V0dGluZ3MgPT09PT09PT09PT09PSAqLwotCi0vKiA0OC4wIGtIeiAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc2FhNzExNV9jZmdfNDhfYXVkaW9bXSA9IHsKLQkweDM0LCAweGNlLAotCTB4MzUsIDB4ZmIsCi0JMHgzNiwgMHgzMCwKLQkweDAwLCAweDAwCi19OwotCi0vKiA0NC4xIGtIeiAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc2FhNzExNV9jZmdfNDQxX2F1ZGlvW10gPSB7Ci0JMHgzNCwgMHhmMiwKLQkweDM1LCAweDAwLAotCTB4MzYsIDB4MmQsCi0JMHgwMCwgMHgwMAotfTsKLQotLyogMzIuMCBrSHogKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHNhYTcxMTVfY2ZnXzMyX2F1ZGlvW10gPSB7Ci0JMHgzNCwgMHhkZiwKLQkweDM1LCAweGE3LAotCTB4MzYsIDB4MjAsCi0JMHgwMCwgMHgwMAotfTsKLQotLyogNDguMCBrSHogNjBoeiAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc2FhNzExNV9jZmdfNjBoel80OF9hdWRpb1tdID0gewotCTB4MzAsIDB4Y2QsCi0JMHgzMSwgMHgyMCwKLQkweDMyLCAweDAzLAotCTB4MDAsIDB4MDAKLX07Ci0KLS8qIDQ4LjAga0h6IDUwaHogKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHNhYTcxMTVfY2ZnXzUwaHpfNDhfYXVkaW9bXSA9IHsKLQkweDMwLCAweDAwLAotCTB4MzEsIDB4YzAsCi0JMHgzMiwgMHgwMywKLQkweDAwLCAweDAwCi19OwotCi0vKiA0NC4xIGtIeiA2MGh6ICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzYWE3MTE1X2NmZ182MGh6XzQ0MV9hdWRpb1tdID0gewotCTB4MzAsIDB4YmMsCi0JMHgzMSwgMHhkZiwKLQkweDMyLCAweDAyLAotCTB4MDAsIDB4MDAKLX07Ci0KLS8qIDQ0LjEga0h6IDUwaHogKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHNhYTcxMTVfY2ZnXzUwaHpfNDQxX2F1ZGlvW10gPSB7Ci0JMHgzMCwgMHgwMCwKLQkweDMxLCAweDcyLAotCTB4MzIsIDB4MDMsCi0JMHgwMCwgMHgwMAotfTsKLQotLyogMzIuMCBrSHogNjBoeiAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc2FhNzExNV9jZmdfNjBoel8zMl9hdWRpb1tdID0gewotCTB4MzAsIDB4ZGUsCi0JMHgzMSwgMHgxNSwKLQkweDMyLCAweDAyLAotCTB4MDAsIDB4MDAKLX07Ci0KLS8qIDMyLjAga0h6IDUwaHogKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHNhYTcxMTVfY2ZnXzUwaHpfMzJfYXVkaW9bXSA9IHsKLQkweDMwLCAweDAwLAotCTB4MzEsIDB4ODAsCi0JMHgzMiwgMHgwMiwKLQkweDAwLCAweDAwCi19OwotCiBzdGF0aWMgaW50IHNhYTcxMTVfb2RkX3Bhcml0eSh1OCBjKQogewogCWMgXj0gKGMgPj4gNCk7CkBAIC02MjcsNDAgKzU0MSwzOCBAQAogfQogCiAKLXN0YXRpYyBpbnQgc2FhNzExNV9zZXRfYXVkaW9fY2xvY2tfZnJlcShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBlbnVtIHY0bDJfYXVkaW9fY2xvY2tfZnJlcSBmcmVxKQorc3RhdGljIGludCBzYWE3MTE1X3NldF9hdWRpb19jbG9ja19mcmVxKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUzMiBmcmVxKQogewogCXN0cnVjdCBzYWE3MTE1X3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXUzMiBhY3BmOworCXUzMiBhY25pOworCXUzMiBoejsKKwl1NjQgZjsKIAotCXNhYTcxMTVfZGJnKCJzZXQgYXVkaW8gY2xvY2sgZnJlcTogJWRcbiIsIGZyZXEpOwotCXN3aXRjaCAoZnJlcSkgewotCQljYXNlIFY0TDJfQVVEQ0xLXzMyX0tIWjoKLQkJCXNhYTcxMTVfd3JpdGVyZWdzKGNsaWVudCwgc2FhNzExNV9jZmdfMzJfYXVkaW8pOwotCQkJaWYgKHN0YXRlLT5zdGQgJiBWNEwyX1NURF81MjVfNjApIHsKLQkJCQlzYWE3MTE1X3dyaXRlcmVncyhjbGllbnQsIHNhYTcxMTVfY2ZnXzYwaHpfMzJfYXVkaW8pOwotCQkJfSBlbHNlIHsKLQkJCQlzYWE3MTE1X3dyaXRlcmVncyhjbGllbnQsIHNhYTcxMTVfY2ZnXzUwaHpfMzJfYXVkaW8pOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9BVURDTEtfNDQxX0tIWjoKLQkJCXNhYTcxMTVfd3JpdGVyZWdzKGNsaWVudCwgc2FhNzExNV9jZmdfNDQxX2F1ZGlvKTsKLQkJCWlmIChzdGF0ZS0+c3RkICYgVjRMMl9TVERfNTI1XzYwKSB7Ci0JCQkJc2FhNzExNV93cml0ZXJlZ3MoY2xpZW50LCBzYWE3MTE1X2NmZ182MGh6XzQ0MV9hdWRpbyk7Ci0JCQl9IGVsc2UgewotCQkJCXNhYTcxMTVfd3JpdGVyZWdzKGNsaWVudCwgc2FhNzExNV9jZmdfNTBoel80NDFfYXVkaW8pOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9BVURDTEtfNDhfS0haOgotCQkJc2FhNzExNV93cml0ZXJlZ3MoY2xpZW50LCBzYWE3MTE1X2NmZ180OF9hdWRpbyk7Ci0JCQlpZiAoc3RhdGUtPnN0ZCAmIFY0TDJfU1REXzUyNV82MCkgewotCQkJCXNhYTcxMTVfd3JpdGVyZWdzKGNsaWVudCwgc2FhNzExNV9jZmdfNjBoel80OF9hdWRpbyk7Ci0JCQl9IGVsc2UgewotCQkJCXNhYTcxMTVfd3JpdGVyZWdzKGNsaWVudCwgc2FhNzExNV9jZmdfNTBoel80OF9hdWRpbyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNhYTcxMTVfZGJnKCJpbnZhbGlkIGF1ZGlvIHNldHRpbmcgJWRcbiIsIGZyZXEpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgInNldCBhdWRpbyBjbG9jayBmcmVxOiAlZFxuIiwgZnJlcSk7CisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlpZiAoZnJlcSA8IDMyMDAwIHx8IGZyZXEgPiA0ODAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBoeiBpcyB0aGUgcmVmcmVzaCByYXRlIHRpbWVzIDEwMCAqLworCWh6ID0gKHN0YXRlLT5zdGQgJiBWNEwyX1NURF81MjVfNjApID8gNTk5NCA6IDUwMDA7CisJLyogYWNwZiA9ICgyNTYgKiBmcmVxKSAvIGZpZWxkX2ZyZXF1ZW5jeSA9PSAoMjU2ICogMTAwICogZnJlcSkgLyBoeiAqLworCWFjcGYgPSAoMjU2MDAgKiBmcmVxKSAvIGh6OworCS8qIGFjbmkgPSAoMjU2ICogZnJlcSAqIDJeMjMpIC8gY3J5c3RhbF9mcmVxdWVuY3kgPQorCQkgIChmcmVxICogMl4oOCsyMykpIC8gY3J5c3RhbF9mcmVxdWVuY3kgPQorCQkgIChmcmVxIDw8IDMxKSAvIDMyLjExIE1IeiAqLworCWYgPSBmcmVxOworCWYgPSBmIDw8IDMxOworCWRvX2RpdihmLCAzMjExMDAwMCk7CisJYWNuaSA9IGY7CisKKwlzYWE3MTE1X3dyaXRlKGNsaWVudCwgMHgzMCwgYWNwZiAmIDB4ZmYpOworCXNhYTcxMTVfd3JpdGUoY2xpZW50LCAweDMxLCAoYWNwZiA+PiA4KSAmIDB4ZmYpOworCXNhYTcxMTVfd3JpdGUoY2xpZW50LCAweDMyLCAoYWNwZiA+PiAxNikgJiAweDAzKTsKKwlzYWE3MTE1X3dyaXRlKGNsaWVudCwgMHgzNCwgYWNuaSAmIDB4ZmYpOworCXNhYTcxMTVfd3JpdGUoY2xpZW50LCAweDM1LCAoYWNuaSA+PiA4KSAmIDB4ZmYpOworCXNhYTcxMTVfd3JpdGUoY2xpZW50LCAweDM2LCAoYWNuaSA+PiAxNikgJiAweDNmKTsKIAlzdGF0ZS0+YXVkY2xrX2ZyZXEgPSBmcmVxOwogCXJldHVybiAwOwogfQpAQCAtNjcyLDcgKzU4NCw3IEBACiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKIAkJaWYgKGN0cmwtPnZhbHVlIDwgMCB8fCBjdHJsLT52YWx1ZSA+IDI1NSkgewotCQkJc2FhNzExNV9lcnIoImludmFsaWQgYnJpZ2h0bmVzcyBzZXR0aW5nICVkXG4iLCBjdHJsLT52YWx1ZSk7CisJCQl2NGxfZXJyKGNsaWVudCwgImludmFsaWQgYnJpZ2h0bmVzcyBzZXR0aW5nICVkXG4iLCBjdHJsLT52YWx1ZSk7CiAJCQlyZXR1cm4gLUVSQU5HRTsKIAkJfQogCkBAIC02ODIsNyArNTk0LDcgQEAKIAogCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CiAJCWlmIChjdHJsLT52YWx1ZSA8IDAgfHwgY3RybC0+dmFsdWUgPiAxMjcpIHsKLQkJCXNhYTcxMTVfZXJyKCJpbnZhbGlkIGNvbnRyYXN0IHNldHRpbmcgJWRcbiIsIGN0cmwtPnZhbHVlKTsKKwkJCXY0bF9lcnIoY2xpZW50LCAiaW52YWxpZCBjb250cmFzdCBzZXR0aW5nICVkXG4iLCBjdHJsLT52YWx1ZSk7CiAJCQlyZXR1cm4gLUVSQU5HRTsKIAkJfQogCkBAIC02OTIsNyArNjA0LDcgQEAKIAogCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKIAkJaWYgKGN0cmwtPnZhbHVlIDwgMCB8fCBjdHJsLT52YWx1ZSA+IDEyNykgewotCQkJc2FhNzExNV9lcnIoImludmFsaWQgc2F0dXJhdGlvbiBzZXR0aW5nICVkXG4iLCBjdHJsLT52YWx1ZSk7CisJCQl2NGxfZXJyKGNsaWVudCwgImludmFsaWQgc2F0dXJhdGlvbiBzZXR0aW5nICVkXG4iLCBjdHJsLT52YWx1ZSk7CiAJCQlyZXR1cm4gLUVSQU5HRTsKIAkJfQogCkBAIC03MDIsMTMgKzYxNCwxNiBAQAogCiAJY2FzZSBWNEwyX0NJRF9IVUU6CiAJCWlmIChjdHJsLT52YWx1ZSA8IC0xMjcgfHwgY3RybC0+dmFsdWUgPiAxMjcpIHsKLQkJCXNhYTcxMTVfZXJyKCJpbnZhbGlkIGh1ZSBzZXR0aW5nICVkXG4iLCBjdHJsLT52YWx1ZSk7CisJCQl2NGxfZXJyKGNsaWVudCwgImludmFsaWQgaHVlIHNldHRpbmcgJWRcbiIsIGN0cmwtPnZhbHVlKTsKIAkJCXJldHVybiAtRVJBTkdFOwogCQl9CiAKIAkJc3RhdGUtPmh1ZSA9IGN0cmwtPnZhbHVlOwogCQlzYWE3MTE1X3dyaXRlKGNsaWVudCwgMHgwZCwgc3RhdGUtPmh1ZSk7CiAJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC03NDMsMTIgKzY1OCwyMiBAQAogCXN0cnVjdCBzYWE3MTE1X3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCWludCB0YXNrYiA9IHNhYTcxMTVfcmVhZChjbGllbnQsIDB4ODApICYgMHgxMDsKIAorCS8qIFByZXZlbnQgdW5uZWNlc3Nhcnkgc3RhbmRhcmQgY2hhbmdlcy4gRHVyaW5nIGEgc3RhbmRhcmQKKwkgICBjaGFuZ2UgdGhlIEktUG9ydCBpcyB0ZW1wb3JhcmlseSBkaXNhYmxlZC4gQW55IGRldmljZXMKKwkgICByZWFkaW5nIGZyb20gdGhhdCBwb3J0IGNhbiBnZXQgY29uZnVzZWQuCisJICAgTm90ZSB0aGF0IFZJRElPQ19TX1NURCBpcyBhbHNvIHVzZWQgdG8gc3dpdGNoIGZyb20KKwkgICByYWRpbyB0byBUViBtb2RlLCBzbyBpZiBhIFZJRElPQ19TX1NURCBpcyBicm9hZGNhc3QgdG8KKwkgICBhbGwgSTJDIGRldmljZXMgdGhlbiB5b3UgZG8gbm90IHdhbnQgdG8gaGF2ZSBhbiB1bndhbnRlZAorCSAgIHNpZGUtZWZmZWN0IGhlcmUuICovCisJaWYgKHN0ZCA9PSBzdGF0ZS0+c3RkKQorCQlyZXR1cm47CisKIAkvLyBUaGlzIHdvcmtzIGZvciBOVFNDLU0sIFNFQ0FNLUwgYW5kIHRoZSA1MEh6IFBBTCB2YXJpYW50cy4KIAlpZiAoc3RkICYgVjRMMl9TVERfNTI1XzYwKSB7Ci0JCXNhYTcxMTVfZGJnKCJkZWNvZGVyIHNldCBzdGFuZGFyZCA2MCBIelxuIik7CisJCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgImRlY29kZXIgc2V0IHN0YW5kYXJkIDYwIEh6XG4iKTsKIAkJc2FhNzExNV93cml0ZXJlZ3MoY2xpZW50LCBzYWE3MTE1X2NmZ182MGh6X3ZpZGVvKTsKIAl9IGVsc2UgewotCQlzYWE3MTE1X2RiZygiZGVjb2RlciBzZXQgc3RhbmRhcmQgNTAgSHpcbiIpOworCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJkZWNvZGVyIHNldCBzdGFuZGFyZCA1MCBIelxuIik7CiAJCXNhYTcxMTVfd3JpdGVyZWdzKGNsaWVudCwgc2FhNzExNV9jZmdfNTBoel92aWRlbyk7CiAJfQogCkBAIC03NzMsMjQgKzY5OCwxNyBAQAogc3RhdGljIHZvaWQgc2FhNzExNV9sb2dfc3RhdHVzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IHNhYTcxMTVfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JY2hhciAqYXVkZnJlcSA9ICJ1bmRlZmluZWQiOwogCWludCByZWcxZSwgcmVnMWY7CiAJaW50IHNpZ25hbE9rOwogCWludCB2Y3I7CiAKLQlzd2l0Y2ggKHN0YXRlLT5hdWRjbGtfZnJlcSkgewotCQljYXNlIFY0TDJfQVVEQ0xLXzMyX0tIWjogIGF1ZGZyZXEgPSAiMzIga0h6IjsgYnJlYWs7Ci0JCWNhc2UgVjRMMl9BVURDTEtfNDQxX0tIWjogYXVkZnJlcSA9ICI0NC4xIGtIeiI7IGJyZWFrOwotCQljYXNlIFY0TDJfQVVEQ0xLXzQ4X0tIWjogIGF1ZGZyZXEgPSAiNDgga0h6IjsgYnJlYWs7Ci0JfQotCi0Jc2FhNzExNV9pbmZvKCJBdWRpbyBmcmVxdWVuY3k6ICVzXG4iLCBhdWRmcmVxKTsKKwl2NGxfaW5mbyhjbGllbnQsICJBdWRpbyBmcmVxdWVuY3k6ICVkIEh6XG4iLCBzdGF0ZS0+YXVkY2xrX2ZyZXEpOwogCWlmIChjbGllbnQtPm5hbWVbNl0gPT0gJzQnKSB7CiAJCS8qIHN0YXR1cyBmb3IgdGhlIHNhYTcxMTQgKi8KIAkJcmVnMWYgPSBzYWE3MTE1X3JlYWQoY2xpZW50LCAweDFmKTsKIAkJc2lnbmFsT2sgPSAocmVnMWYgJiAweGMxKSA9PSAweDgxOwotCQlzYWE3MTE1X2luZm8oIlZpZGVvIHNpZ25hbDogICAgJXNcbiIsIHNpZ25hbE9rID8gIm9rIiA6ICJiYWQiKTsKLQkJc2FhNzExNV9pbmZvKCJGcmVxdWVuY3k6ICAgICAgICVzXG4iLCAocmVnMWYgJiAweDIwKSA/ICI2MEh6IiA6ICI1MEh6Iik7CisJCXY0bF9pbmZvKGNsaWVudCwgIlZpZGVvIHNpZ25hbDogICAgJXNcbiIsIHNpZ25hbE9rID8gIm9rIiA6ICJiYWQiKTsKKwkJdjRsX2luZm8oY2xpZW50LCAiRnJlcXVlbmN5OiAgICAgICAlc1xuIiwgKHJlZzFmICYgMHgyMCkgPyAiNjAgSHoiIDogIjUwIEh6Iik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTgwMSwyMSArNzE5LDI2IEBACiAJc2lnbmFsT2sgPSAocmVnMWYgJiAweGMxKSA9PSAweDgxICYmIChyZWcxZSAmIDB4YzApID09IDB4ODA7CiAJdmNyID0gIShyZWcxZiAmIDB4MTApOwogCi0Jc2FhNzExNV9pbmZvKCJWaWRlbyBzaWduYWw6ICAgICVzXG4iLCBzaWduYWxPayA/ICh2Y3IgPyAiVkNSIiA6ICJicm9hZGNhc3QvRFZEIikgOiAiYmFkIik7Ci0Jc2FhNzExNV9pbmZvKCJGcmVxdWVuY3k6ICAgICAgICVzXG4iLCAocmVnMWYgJiAweDIwKSA/ICI2MEh6IiA6ICI1MEh6Iik7CisJaWYgKHN0YXRlLT5pbnB1dCA+PSA2KSB7CisJCXY0bF9pbmZvKGNsaWVudCwgIklucHV0OiAgICAgICAgICAgUy1WaWRlbyAlZFxuIiwgc3RhdGUtPmlucHV0IC0gNik7CisJfSBlbHNlIHsKKwkJdjRsX2luZm8oY2xpZW50LCAiSW5wdXQ6ICAgICAgICAgICBDb21wb3NpdGUgJWRcbiIsIHN0YXRlLT5pbnB1dCk7CisJfQorCXY0bF9pbmZvKGNsaWVudCwgIlZpZGVvIHNpZ25hbDogICAgJXNcbiIsIHNpZ25hbE9rID8gKHZjciA/ICJWQ1IiIDogImJyb2FkY2FzdC9EVkQiKSA6ICJiYWQiKTsKKwl2NGxfaW5mbyhjbGllbnQsICJGcmVxdWVuY3k6ICAgICAgICVzXG4iLCAocmVnMWYgJiAweDIwKSA/ICI2MCBIeiIgOiAiNTAgSHoiKTsKIAogCXN3aXRjaCAocmVnMWUgJiAweDAzKSB7CiAJCWNhc2UgMToKLQkJCXNhYTcxMTVfaW5mbygiRGV0ZWN0ZWQgZm9ybWF0OiBOVFNDXG4iKTsKKwkJCXY0bF9pbmZvKGNsaWVudCwgIkRldGVjdGVkIGZvcm1hdDogTlRTQ1xuIik7CiAJCQlicmVhazsKIAkJY2FzZSAyOgotCQkJc2FhNzExNV9pbmZvKCJEZXRlY3RlZCBmb3JtYXQ6IFBBTFxuIik7CisJCQl2NGxfaW5mbyhjbGllbnQsICJEZXRlY3RlZCBmb3JtYXQ6IFBBTFxuIik7CiAJCQlicmVhazsKIAkJY2FzZSAzOgotCQkJc2FhNzExNV9pbmZvKCJEZXRlY3RlZCBmb3JtYXQ6IFNFQ0FNXG4iKTsKKwkJCXY0bF9pbmZvKGNsaWVudCwgIkRldGVjdGVkIGZvcm1hdDogU0VDQU1cbiIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlzYWE3MTE1X2luZm8oIkRldGVjdGVkIGZvcm1hdDogQlcvTm8gY29sb3JcbiIpOworCQkJdjRsX2luZm8oY2xpZW50LCAiRGV0ZWN0ZWQgZm9ybWF0OiBCVy9ObyBjb2xvclxuIik7CiAJCQlicmVhazsKIAl9CiB9CkBAIC05NDAsNyArODYzLDcgQEAKIAogCXBpeCA9ICYoZm10LT5mbXQucGl4KTsKIAotCXNhYTcxMTVfZGJnKCJkZWNvZGVyIHNldCBzaXplXG4iKTsKKwl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJkZWNvZGVyIHNldCBzaXplXG4iKTsKIAogCS8qIEZJWE1FIG5lZWQgYmV0dGVyIGJvdW5kcyBjaGVja2luZyBoZXJlICovCiAJaWYgKChwaXgtPndpZHRoIDwgMSkgfHwgKHBpeC0+d2lkdGggPiAxNDQwKSkKQEAgLTk2Niw3ICs4ODksNyBAQAogCQlIUFNDID0gSFBTQyA/IEhQU0MgOiAxOwogCQlIRlNDID0gKGludCkoKDEwMjQgKiA3MjApIC8gKEhQU0MgKiBwaXgtPndpZHRoKSk7CiAKLQkJc2FhNzExNV9kYmcoIkhwc2M6IDB4JTA1eCwgSGZzYzogMHglMDV4XG4iLCBIUFNDLCBIRlNDKTsKKwkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiSHBzYzogMHglMDV4LCBIZnNjOiAweCUwNXhcbiIsIEhQU0MsIEhGU0MpOwogCQkvKiBGSVhNRSBoYXJkY29kZXMgdG8gIlRhc2sgQiIKIAkJICogd3JpdGUgSCBwcmVzY2FsZXIgaW50ZWdlciAqLwogCQlzYWE3MTE1X3dyaXRlKGNsaWVudCwgMHhkMCwgKHU4KSAoSFBTQyAmIDB4M2YpKTsKQEAgLTk4MCwxMCArOTAzLDEwIEBACiAJCXNhYTcxMTVfd3JpdGUoY2xpZW50LCAweERELCAodTgpICgoSEZTQyA+PiA5KSAmIDB4ZmYpKTsKIAl9IGVsc2UgewogCQlpZiAoaXNfNTBoeikgewotCQkJc2FhNzExNV9kYmcoIlNldHRpbmcgZnVsbCA1MGh6IHdpZHRoXG4iKTsKKwkJCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgIlNldHRpbmcgZnVsbCA1MGh6IHdpZHRoXG4iKTsKIAkJCXNhYTcxMTVfd3JpdGVyZWdzKGNsaWVudCwgc2FhNzExNV9jZmdfNTBoel9mdWxscmVzX3gpOwogCQl9IGVsc2UgewotCQkJc2FhNzExNV9kYmcoIlNldHRpbmcgZnVsbCA2MGh6IHdpZHRoXG4iKTsKKwkJCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgIlNldHRpbmcgZnVsbCA2MGh6IHdpZHRoXG4iKTsKIAkJCXNhYTcxMTVfd3JpdGVyZWdzKGNsaWVudCwgc2FhNzExNV9jZmdfNjBoel9mdWxscmVzX3gpOwogCQl9CiAJfQpAQCAtOTkyLDcgKzkxNSw3IEBACiAKIAlpZiAocGl4LT5oZWlnaHQgIT0gVnNyYykgewogCQlWU0NZID0gKGludCkoKDEwMjQgKiBWc3JjKSAvIHBpeC0+aGVpZ2h0KTsKLQkJc2FhNzExNV9kYmcoIlZzcmM6ICVkLCBWc2N5OiAweCUwNXhcbiIsIFZzcmMsIFZTQ1kpOworCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJWc3JjOiAlZCwgVnNjeTogMHglMDV4XG4iLCBWc3JjLCBWU0NZKTsKIAogCQkvKiBDb3JyZWN0IENvbnRyYXN0IGFuZCBMdW1pbmFuY2UgKi8KIAkJc2FhNzExNV93cml0ZShjbGllbnQsIDB4ZDUsICh1OCkgKDY0ICogMTAyNCAvIFZTQ1kpKTsKQEAgLTEwMDYsMTAgKzkyOSwxMCBAQAogCQlzYWE3MTE1X3dyaXRlKGNsaWVudCwgMHhlMywgKHU4KSAoKFZTQ1kgPj4gOCkgJiAweGZmKSk7CiAJfSBlbHNlIHsKIAkJaWYgKGlzXzUwaHopIHsKLQkJCXNhYTcxMTVfZGJnKCJTZXR0aW5nIGZ1bGwgNTBIeiBoZWlnaHRcbiIpOworCQkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiU2V0dGluZyBmdWxsIDUwSHogaGVpZ2h0XG4iKTsKIAkJCXNhYTcxMTVfd3JpdGVyZWdzKGNsaWVudCwgc2FhNzExNV9jZmdfNTBoel9mdWxscmVzX3kpOwogCQl9IGVsc2UgewotCQkJc2FhNzExNV9kYmcoIlNldHRpbmcgZnVsbCA2MGh6IGhlaWdodFxuIik7CisJCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJTZXR0aW5nIGZ1bGwgNjBoeiBoZWlnaHRcbiIpOwogCQkJc2FhNzExNV93cml0ZXJlZ3MoY2xpZW50LCBzYWE3MTE1X2NmZ182MGh6X2Z1bGxyZXNfeSk7CiAJCX0KIAl9CkBAIC0xMDg5LDYgKzEwMTIsNDggQEAKIAogLyogPT09PT09PT09PT09IFNBQTcxMTUgQVVESU8gc2V0dGluZ3MgKGVuZCkgPT09PT09PT09PT09PSAqLwogCitzdGF0aWMgc3RydWN0IHY0bDJfcXVlcnljdHJsIHNhYTcxMTVfcWN0cmxbXSA9IHsKKwl7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQlJJR0hUTkVTUywKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICAgICAgICA9ICJCcmlnaHRuZXNzIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDI1NSwKKwkJLnN0ZXAgICAgICAgICAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDEyOCwKKwkJLmZsYWdzICAgICAgICAgPSAwLAorCX0sIHsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9DT05UUkFTVCwKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICAgICAgICA9ICJDb250cmFzdCIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSAyNTUsCisJCS5zdGVwICAgICAgICAgID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSA2NCwKKwkJLmZsYWdzICAgICAgICAgPSAwLAorCX0sIHsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9TQVRVUkFUSU9OLAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lICAgICAgICAgID0gIlNhdHVyYXRpb24iLAorCQkubWluaW11bSAgICAgICA9IDAsCisJCS5tYXhpbXVtICAgICAgID0gMjU1LAorCQkuc3RlcCAgICAgICAgICA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gNjQsCisJCS5mbGFncyAgICAgICAgID0gMCwKKwl9LCB7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfSFVFLAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lICAgICAgICAgID0gIkh1ZSIsCisJCS5taW5pbXVtICAgICAgID0gLTEyOCwKKwkJLm1heGltdW0gICAgICAgPSAxMjcsCisJCS5zdGVwICAgICAgICAgID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCQkuZmxhZ3MgCSAgICAgICA9IDAsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKIHN0YXRpYyBpbnQgc2FhNzExNV9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3Qgc2FhNzExNV9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKQEAgLTExMDMsMTYgKzEwNjgsMTggQEAKIAkJcmV0dXJuIHNhYTcxMTVfZ2V0X3Y0bGZtdChjbGllbnQsIChzdHJ1Y3QgdjRsMl9mb3JtYXQgKilhcmcpOwogCiAJY2FzZSBWSURJT0NfSU5UX0FVRElPX0NMT0NLX0ZSRVE6Ci0JCXJldHVybiBzYWE3MTE1X3NldF9hdWRpb19jbG9ja19mcmVxKGNsaWVudCwgKihlbnVtIHY0bDJfYXVkaW9fY2xvY2tfZnJlcSAqKWFyZyk7CisJCXJldHVybiBzYWE3MTE1X3NldF9hdWRpb19jbG9ja19mcmVxKGNsaWVudCwgKih1MzIgKilhcmcpOwogCiAJY2FzZSBWSURJT0NfR19UVU5FUjoKIAl7CiAJCXN0cnVjdCB2NGwyX3R1bmVyICp2dCA9IGFyZzsKIAkJaW50IHN0YXR1czsKIAorCQlpZiAoc3RhdGUtPnJhZGlvKQorCQkJYnJlYWs7CiAJCXN0YXR1cyA9IHNhYTcxMTVfcmVhZChjbGllbnQsIDB4MWYpOwogCi0JCXNhYTcxMTVfZGJnKCJzdGF0dXM6IDB4JTAyeFxuIiwgc3RhdHVzKTsKKwkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAic3RhdHVzOiAweCUwMnhcbiIsIHN0YXR1cyk7CiAJCXZ0LT5zaWduYWwgPSAoKHN0YXR1cyAmICgxIDw8IDYpKSA9PSAwKSA/IDB4ZmZmZiA6IDB4MDsKIAkJYnJlYWs7CiAJfQpAQCAtMTEyNywyMCArMTA5NCwzOCBAQAogCWNhc2UgVklESU9DX1NfQ1RSTDoKIAkJcmV0dXJuIHNhYTcxMTVfc2V0X3Y0bGN0cmwoY2xpZW50LCAoc3RydWN0IHY0bDJfY29udHJvbCAqKWFyZyk7CiAKKwljYXNlIFZJRElPQ19RVUVSWUNUUkw6CisJeworCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjID0gYXJnOworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzYWE3MTE1X3FjdHJsKTsgaSsrKQorCQkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gc2FhNzExNV9xY3RybFtpXS5pZCkgeworCQkJCW1lbWNweShxYywgJnNhYTcxMTVfcWN0cmxbaV0sIHNpemVvZigqcWMpKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJY2FzZSBWSURJT0NfR19TVEQ6CiAJCSoodjRsMl9zdGRfaWQgKilhcmcgPSBzYWE3MTE1X2dldF92NGxzdGQoY2xpZW50KTsKIAkJYnJlYWs7CiAKIAljYXNlIFZJRElPQ19TX1NURDoKKwkJc3RhdGUtPnJhZGlvID0gMDsKIAkJc2FhNzExNV9zZXRfdjRsc3RkKGNsaWVudCwgKih2NGwyX3N0ZF9pZCAqKWFyZyk7CiAJCWJyZWFrOwogCisJY2FzZSBBVURDX1NFVF9SQURJTzoKKwkJc3RhdGUtPnJhZGlvID0gMTsKKwkJYnJlYWs7CisKIAljYXNlIFZJRElPQ19HX0lOUFVUOgogCQkqKGludCAqKWFyZyA9IHN0YXRlLT5pbnB1dDsKIAkJYnJlYWs7CiAKIAljYXNlIFZJRElPQ19TX0lOUFVUOgotCQlzYWE3MTE1X2RiZygiZGVjb2RlciBzZXQgaW5wdXQgJWRcbiIsICppYXJnKTsKKwkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiZGVjb2RlciBzZXQgaW5wdXQgJWRcbiIsICppYXJnKTsKIAkJLyogaW5wdXRzIGZyb20gMC05IGFyZSBhdmFpbGFibGUgKi8KIAkJaWYgKCppYXJnIDwgMCB8fCAqaWFyZyA+IDkpIHsKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtMTE0OCw3ICsxMTMzLDcgQEAKIAogCQlpZiAoc3RhdGUtPmlucHV0ID09ICppYXJnKQogCQkJYnJlYWs7Ci0JCXNhYTcxMTVfZGJnKCJub3cgc2V0dGluZyAlcyBpbnB1dFxuIiwKKwkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAibm93IHNldHRpbmcgJXMgaW5wdXRcbiIsCiAJCQkqaWFyZyA+PSA2ID8gIlMtVmlkZW8iIDogIkNvbXBvc2l0ZSIpOwogCQlzdGF0ZS0+aW5wdXQgPSAqaWFyZzsKIApAQCAtMTE2NSw3ICsxMTUwLDcgQEAKIAogCWNhc2UgVklESU9DX1NUUkVBTU9OOgogCWNhc2UgVklESU9DX1NUUkVBTU9GRjoKLQkJc2FhNzExNV9kYmcoIiVzIG91dHB1dFxuIiwKKwkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiJXMgb3V0cHV0XG4iLAogCQkJKGNtZCA9PSBWSURJT0NfU1RSRUFNT04pID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOwogCiAJCWlmIChzdGF0ZS0+ZW5hYmxlICE9IChjbWQgPT0gVklESU9DX1NUUkVBTU9OKSkgewpAQCAtMTE3OSw3ICsxMTY0LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFZJRElPQ19JTlRfUkVTRVQ6Ci0JCXNhYTcxMTVfZGJnKCJkZWNvZGVyIFJFU0VUXG4iKTsKKwkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiZGVjb2RlciBSRVNFVFxuIik7CiAJCXNhYTcxMTVfd3JpdGVyZWdzKGNsaWVudCwgc2FhNzExNV9jZmdfcmVzZXRfc2NhbGVyKTsKIAkJYnJlYWs7CiAKQEAgLTEyNjQsNDcgKzEyNDksNDYgQEAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCiAJCXJldHVybiAwOwogCi0JY2xpZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKKwljbGllbnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOwogCWlmIChjbGllbnQgPT0gMCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KGNsaWVudCwgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CiAJY2xpZW50LT5hZGRyID0gYWRkcmVzczsKIAljbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOwogCWNsaWVudC0+ZHJpdmVyID0gJmkyY19kcml2ZXJfc2FhNzExNTsKIAlzbnByaW50ZihjbGllbnQtPm5hbWUsIHNpemVvZihjbGllbnQtPm5hbWUpIC0gMSwgInNhYTcxMTUiKTsKIAotCXNhYTcxMTVfZGJnKCJkZXRlY3Rpbmcgc2FhNzExNSBjbGllbnQgb24gYWRkcmVzcyAweCV4XG4iLCBhZGRyZXNzIDw8IDEpOworCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgImRldGVjdGluZyBzYWE3MTE1IGNsaWVudCBvbiBhZGRyZXNzIDB4JXhcbiIsIGFkZHJlc3MgPDwgMSk7CiAKIAlzYWE3MTE1X3dyaXRlKGNsaWVudCwgMCwgNSk7CiAJY2hpcF9pZCA9IHNhYTcxMTVfcmVhZChjbGllbnQsIDApICYgMHgwZjsKIAlpZiAoY2hpcF9pZCAhPSA0ICYmIGNoaXBfaWQgIT0gNSkgewotCQlzYWE3MTE1X2RiZygic2FhNzExNSBub3QgZm91bmRcbiIpOworCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJzYWE3MTE1IG5vdCBmb3VuZFxuIik7CiAJCWtmcmVlKGNsaWVudCk7CiAJCXJldHVybiAwOwogCX0KIAlpZiAoY2hpcF9pZCA9PSA0KSB7CiAJCXNucHJpbnRmKGNsaWVudC0+bmFtZSwgc2l6ZW9mKGNsaWVudC0+bmFtZSkgLSAxLCAic2FhNzExNCIpOwogCX0KLQlzYWE3MTE1X2luZm8oInNhYTcxMSVkIGZvdW5kIEAgMHgleCAoJXMpXG4iLCBjaGlwX2lkLCBhZGRyZXNzIDw8IDEsIGFkYXB0ZXItPm5hbWUpOworCXY0bF9pbmZvKGNsaWVudCwgInNhYTcxMSVkIGZvdW5kIEAgMHgleCAoJXMpXG4iLCBjaGlwX2lkLCBhZGRyZXNzIDw8IDEsIGFkYXB0ZXItPm5hbWUpOwogCi0Jc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2FhNzExNV9zdGF0ZSksIEdGUF9LRVJORUwpOworCXN0YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNhYTcxMTVfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBzdGF0ZSk7CiAJaWYgKHN0YXRlID09IE5VTEwpIHsKIAkJa2ZyZWUoY2xpZW50KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBzYWE3MTE1X3N0YXRlKSk7CiAJc3RhdGUtPnN0ZCA9IFY0TDJfU1REX05UU0M7CiAJc3RhdGUtPmlucHV0ID0gLTE7CiAJc3RhdGUtPmVuYWJsZSA9IDE7CisJc3RhdGUtPnJhZGlvID0gMDsKIAlzdGF0ZS0+YnJpZ2h0ID0gMTI4OwogCXN0YXRlLT5jb250cmFzdCA9IDY0OwogCXN0YXRlLT5odWUgPSAwOwogCXN0YXRlLT5zYXQgPSA2NDsKIAlzdGF0ZS0+aWRlbnQgPSAoY2hpcF9pZCA9PSA0KSA/IFY0TDJfSURFTlRfU0FBNzExNCA6IFY0TDJfSURFTlRfU0FBNzExNTsKLQlzdGF0ZS0+YXVkY2xrX2ZyZXEgPSBWNEwyX0FVRENMS180OF9LSFo7CisJc3RhdGUtPmF1ZGNsa19mcmVxID0gNDgwMDA7CiAKLQlzYWE3MTE1X2RiZygid3JpdGluZyBpbml0IHZhbHVlc1xuIik7CisJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAid3JpdGluZyBpbml0IHZhbHVlc1xuIik7CiAKIAkvKiBpbml0IHRvIDYwaHovNDhraHogKi8KIAlzYWE3MTE1X3dyaXRlcmVncyhjbGllbnQsIHNhYTcxMTVfaW5pdF9hdXRvX2lucHV0KTsKQEAgLTEzMTIsMTMgKzEyOTYsMTIgQEAKIAlzYWE3MTE1X3dyaXRlcmVncyhjbGllbnQsIHNhYTcxMTVfY2ZnXzYwaHpfZnVsbHJlc194KTsKIAlzYWE3MTE1X3dyaXRlcmVncyhjbGllbnQsIHNhYTcxMTVfY2ZnXzYwaHpfZnVsbHJlc195KTsKIAlzYWE3MTE1X3dyaXRlcmVncyhjbGllbnQsIHNhYTcxMTVfY2ZnXzYwaHpfdmlkZW8pOwotCXNhYTcxMTVfd3JpdGVyZWdzKGNsaWVudCwgc2FhNzExNV9jZmdfNDhfYXVkaW8pOwotCXNhYTcxMTVfd3JpdGVyZWdzKGNsaWVudCwgc2FhNzExNV9jZmdfNjBoel80OF9hdWRpbyk7CisJc2FhNzExNV9zZXRfYXVkaW9fY2xvY2tfZnJlcShjbGllbnQsIHN0YXRlLT5hdWRjbGtfZnJlcSk7CiAJc2FhNzExNV93cml0ZXJlZ3MoY2xpZW50LCBzYWE3MTE1X2NmZ19yZXNldF9zY2FsZXIpOwogCiAJaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KTsKIAotCXNhYTcxMTVfZGJnKCJzdGF0dXM6ICgxRSkgMHglMDJ4LCAoMUYpIDB4JTAyeFxuIiwKKwl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJzdGF0dXM6ICgxRSkgMHglMDJ4LCAoMUYpIDB4JTAyeFxuIiwKIAkJc2FhNzExNV9yZWFkKGNsaWVudCwgMHgxZSksIHNhYTcxMTVfcmVhZChjbGllbnQsIDB4MWYpKTsKIAogCXJldHVybiAwOwpAQCAtMTMyNiwxMSArMTMwOSw3IEBACiAKIHN0YXRpYyBpbnQgc2FhNzExNV9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0jaWZkZWYgSTJDX0NMQVNTX1RWX0FOQUxPRwogCWlmIChhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19UVl9BTkFMT0cpCi0jZWxzZQotCWlmIChhZGFwdGVyLT5pZCA9PSBJMkNfSFdfQl9CVDg0OCkKLSNlbmRpZgogCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsICZzYWE3MTE1X2F0dGFjaCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMXguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExeC5jCmluZGV4IDgwMDg1MzcuLjZjMTYxZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExeC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExeC5jCkBAIC01Miw3ICs1Miw3IEBACiAjaW5jbHVkZSA8bGludXgvdmlkZW9fZGVjb2Rlci5oPgogCiBzdGF0aWMgaW50IGRlYnVnID0gMDsKLU1PRFVMRV9QQVJNKGRlYnVnLCAiaSIpOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIiBTZXQgdGhlIGRlZmF1bHQgRGVidWcgbGV2ZWwuICBEZWZhdWx0OiAwIChPZmYpIC0gKDAtMSkiKTsKIAogCkBAIC00ODcsMjAgKzQ4NywxOCBAQAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKIAkJcmV0dXJuIDA7CiAKLQljbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNsaWVudCA9PSAwKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQoY2xpZW50LCAwLCBzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKIAljbGllbnQtPmFkZHIgPSBhZGRyZXNzOwogCWNsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CiAJY2xpZW50LT5kcml2ZXIgPSAmaTJjX2RyaXZlcl9zYWE3MTF4OwogCXN0cmxjcHkoSTJDX05BTUUoY2xpZW50KSwgInNhYTcxMXgiLCBzaXplb2YoSTJDX05BTUUoY2xpZW50KSkpOwotCWRlY29kZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2FhNzExeCksIEdGUF9LRVJORUwpOworCWRlY29kZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2FhNzExeCksIEdGUF9LRVJORUwpOwogCWlmIChkZWNvZGVyID09IE5VTEwpIHsKIAkJa2ZyZWUoY2xpZW50KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbXNldChkZWNvZGVyLCAwLCBzaXplb2Yoc3RydWN0IHNhYTcxMXgpKTsKIAlkZWNvZGVyLT5ub3JtID0gVklERU9fTU9ERV9OVFNDOwogCWRlY29kZXItPmlucHV0ID0gMDsKIAlkZWNvZGVyLT5lbmFibGUgPSAxOwpAQCAtNTY3LDkgKzU2NSw3IEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAic2FhNzExeCIsCiAJfSwKLQogCS5pZCA9IEkyQ19EUklWRVJJRF9TQUE3MTFYLAotCiAJLmF0dGFjaF9hZGFwdGVyID0gc2FhNzExeF9hdHRhY2hfYWRhcHRlciwKIAkuZGV0YWNoX2NsaWVudCA9IHNhYTcxMXhfZGV0YWNoX2NsaWVudCwKIAkuY29tbWFuZCA9IHNhYTcxMXhfY29tbWFuZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEyNy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTI3LmMKaW5kZXggYmNhNmVkMC4uOTkyYzcxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTI3LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTI3LmMKQEAgLTY2LDMwICs2Niw2IEBACiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZGVidWcgbGV2ZWwgKDAtMikiKTsKIE1PRFVMRV9QQVJNX0RFU0ModGVzdF9pbWFnZSwgInRlc3RfaW1hZ2UgKDAtMSkiKTsKIAotI2RlZmluZSBzYWE3MTI3X2RiZyhmbXQsIGFyZy4uLikgXAotCWRvIHsgXAotCQlpZiAoZGVidWcgPj0gMSkgXAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgZGVidWcgJWQtJTA0eDogIiBmbXQsIFwKLQkJCSAgICAgICBjbGllbnQtPmRyaXZlci0+ZHJpdmVyLm5hbWUsIFwKLQkJCSAgICAgICBpMmNfYWRhcHRlcl9pZChjbGllbnQtPmFkYXB0ZXIpLCBjbGllbnQtPmFkZHIgLCAjIyBhcmcpOyBcCi0JfSB3aGlsZSAoMCkKLQotLyogSGlnaCB2b2x1bWUgZGVidWcuIFVzZSB3aXRoIGNhcmUuICovCi0jZGVmaW5lIHNhYTcxMjdfZGJnX2hpZ2h2b2woZm10LCBhcmcuLi4pIFwKLQlkbyB7IFwKLQkJaWYgKGRlYnVnID09IDIpIFwKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzIGRlYnVnICVkLSUwNHg6ICIgZm10LCBcCi0JCQkgICAgICAgY2xpZW50LT5kcml2ZXItPmRyaXZlci5uYW1lLCBcCi0JCQkgICAgICAgaTJjX2FkYXB0ZXJfaWQoY2xpZW50LT5hZGFwdGVyKSwgY2xpZW50LT5hZGRyICwgIyMgYXJnKTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgc2FhNzEyN19lcnIoZm10LCBhcmcuLi4pIGRvIHsgXAotCXByaW50ayhLRVJOX0VSUiAiJXMgJWQtJTA0eDogIiBmbXQsIGNsaWVudC0+ZHJpdmVyLT5kcml2ZXIubmFtZSwgXAotCSAgICAgICBpMmNfYWRhcHRlcl9pZChjbGllbnQtPmFkYXB0ZXIpLCBjbGllbnQtPmFkZHIgLCAjIyBhcmcpOyB9IHdoaWxlICgwKQotI2RlZmluZSBzYWE3MTI3X2luZm8oZm10LCBhcmcuLi4pIGRvIHsgXAotCXByaW50ayhLRVJOX0lORk8gIiVzICVkLSUwNHg6ICIgZm10LCBjbGllbnQtPmRyaXZlci0+ZHJpdmVyLm5hbWUsIFwKLQkgICAgICAgaTJjX2FkYXB0ZXJfaWQoY2xpZW50LT5hZGFwdGVyKSwgY2xpZW50LT5hZGRyICwgIyMgYXJnKTsgfSB3aGlsZSAoMCkKLQogc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHg4OCA+PiAxLCBJMkNfQ0xJRU5UX0VORCB9OwogCiAKQEAgLTMzNiw3ICszMTIsNyBAQAogCQlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsKSA9PSAwKQogCQkJcmV0dXJuIDA7CiAJfQotCXNhYTcxMjdfZXJyKCJJMkMgV3JpdGUgUHJvYmxlbVxuIik7CisJdjRsX2VycihjbGllbnQsICJJMkMgV3JpdGUgUHJvYmxlbVxuIik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0zNjIsNyArMzM4LDcgQEAKIAlpZiAoZW5hYmxlICYmIChkYXRhLT5maWVsZCAhPSAwIHx8IGRhdGEtPmxpbmUgIT0gMTYpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoc3RhdGUtPnZwc19lbmFibGUgIT0gZW5hYmxlKSB7Ci0JCXNhYTcxMjdfZGJnKCJUdXJuIFZQUyBTaWduYWwgJXNcbiIsIGVuYWJsZSA/ICJvbiIgOiAib2ZmIik7CisJCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgIlR1cm4gVlBTIFNpZ25hbCAlc1xuIiwgZW5hYmxlID8gIm9uIiA6ICJvZmYiKTsKIAkJc2FhNzEyN193cml0ZShjbGllbnQsIDB4NTQsIGVuYWJsZSA8PCA3KTsKIAkJc3RhdGUtPnZwc19lbmFibGUgPSBlbmFibGU7CiAJfQpAQCAtMzc0LDcgKzM1MCw3IEBACiAJc3RhdGUtPnZwc19kYXRhWzJdID0gZGF0YS0+ZGF0YVsxMV07CiAJc3RhdGUtPnZwc19kYXRhWzNdID0gZGF0YS0+ZGF0YVsxMl07CiAJc3RhdGUtPnZwc19kYXRhWzRdID0gZGF0YS0+ZGF0YVsxM107Ci0Jc2FhNzEyN19kYmcoIlNldCBWUFMgZGF0YSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiU2V0IFZQUyBkYXRhICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKIAkJc3RhdGUtPnZwc19kYXRhWzBdLCBzdGF0ZS0+dnBzX2RhdGFbMV0sCiAJCXN0YXRlLT52cHNfZGF0YVsyXSwgc3RhdGUtPnZwc19kYXRhWzNdLAogCQlzdGF0ZS0+dnBzX2RhdGFbNF0pOwpAQCAtMzk3LDcgKzM3Myw3IEBACiAJaWYgKGVuYWJsZSAmJiAoZGF0YS0+ZmllbGQgIT0gMCB8fCBkYXRhLT5saW5lICE9IDIxKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHN0YXRlLT5jY19lbmFibGUgIT0gZW5hYmxlKSB7Ci0JCXNhYTcxMjdfZGJnKCJUdXJuIENDICVzXG4iLCBlbmFibGUgPyAib24iIDogIm9mZiIpOworCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJUdXJuIENDICVzXG4iLCBlbmFibGUgPyAib24iIDogIm9mZiIpOwogCQlzYWE3MTI3X3dyaXRlKGNsaWVudCwgU0FBNzEyN19SRUdfQ0xPU0VEX0NBUFRJT04sCiAJCQkJKHN0YXRlLT54ZHNfZW5hYmxlIDw8IDcpIHwgKGVuYWJsZSA8PCA2KSB8IDB4MTEpOwogCQlzdGF0ZS0+Y2NfZW5hYmxlID0gZW5hYmxlOwpAQCAtNDA1LDcgKzM4MSw3IEBACiAJaWYgKCFlbmFibGUpCiAJCXJldHVybiAwOwogCi0Jc2FhNzEyN19kYmdfaGlnaHZvbCgiQ0MgZGF0YTogJTA0eFxuIiwgY2MpOworCXY0bF9kYmcoMiwgZGVidWcsIGNsaWVudCwgIkNDIGRhdGE6ICUwNHhcbiIsIGNjKTsKIAlzYWE3MTI3X3dyaXRlKGNsaWVudCwgU0FBNzEyN19SRUdfTElORV8yMV9PRERfMCwgY2MgJiAweGZmKTsKIAlzYWE3MTI3X3dyaXRlKGNsaWVudCwgU0FBNzEyN19SRUdfTElORV8yMV9PRERfMSwgY2MgPj4gOCk7CiAJc3RhdGUtPmNjX2RhdGEgPSBjYzsKQEAgLTQyMyw3ICszOTksNyBAQAogCWlmIChlbmFibGUgJiYgKGRhdGEtPmZpZWxkICE9IDEgfHwgZGF0YS0+bGluZSAhPSAyMSkpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChzdGF0ZS0+eGRzX2VuYWJsZSAhPSBlbmFibGUpIHsKLQkJc2FhNzEyN19kYmcoIlR1cm4gWERTICVzXG4iLCBlbmFibGUgPyAib24iIDogIm9mZiIpOworCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJUdXJuIFhEUyAlc1xuIiwgZW5hYmxlID8gIm9uIiA6ICJvZmYiKTsKIAkJc2FhNzEyN193cml0ZShjbGllbnQsIFNBQTcxMjdfUkVHX0NMT1NFRF9DQVBUSU9OLAogCQkJCShlbmFibGUgPDwgNykgfCAoc3RhdGUtPmNjX2VuYWJsZSA8PCA2KSB8IDB4MTEpOwogCQlzdGF0ZS0+eGRzX2VuYWJsZSA9IGVuYWJsZTsKQEAgLTQzMSw3ICs0MDcsNyBAQAogCWlmICghZW5hYmxlKQogCQlyZXR1cm4gMDsKIAotCXNhYTcxMjdfZGJnX2hpZ2h2b2woIlhEUyBkYXRhOiAlMDR4XG4iLCB4ZHMpOworCXY0bF9kYmcoMiwgZGVidWcsIGNsaWVudCwgIlhEUyBkYXRhOiAlMDR4XG4iLCB4ZHMpOwogCXNhYTcxMjdfd3JpdGUoY2xpZW50LCBTQUE3MTI3X1JFR19MSU5FXzIxX0VWRU5fMCwgeGRzICYgMHhmZik7CiAJc2FhNzEyN193cml0ZShjbGllbnQsIFNBQTcxMjdfUkVHX0xJTkVfMjFfRVZFTl8xLCB4ZHMgPj4gOCk7CiAJc3RhdGUtPnhkc19kYXRhID0geGRzOwpAQCAtNDQ4LDcgKzQyNCw3IEBACiAJaWYgKGVuYWJsZSAmJiAoZGF0YS0+ZmllbGQgIT0gMCB8fCBkYXRhLT5saW5lICE9IDIzKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHN0YXRlLT53c3NfZW5hYmxlICE9IGVuYWJsZSkgewotCQlzYWE3MTI3X2RiZygiVHVybiBXU1MgJXNcbiIsIGVuYWJsZSA/ICJvbiIgOiAib2ZmIik7CisJCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgIlR1cm4gV1NTICVzXG4iLCBlbmFibGUgPyAib24iIDogIm9mZiIpOwogCQlzYWE3MTI3X3dyaXRlKGNsaWVudCwgMHgyNywgZW5hYmxlIDw8IDcpOwogCQlzdGF0ZS0+d3NzX2VuYWJsZSA9IGVuYWJsZTsKIAl9CkBAIC00NTcsNyArNDMzLDcgQEAKIAogCXNhYTcxMjdfd3JpdGUoY2xpZW50LCAweDI2LCBkYXRhLT5kYXRhWzBdKTsKIAlzYWE3MTI3X3dyaXRlKGNsaWVudCwgMHgyNywgMHg4MCB8IChkYXRhLT5kYXRhWzFdICYgMHgzZikpOwotCXNhYTcxMjdfZGJnKCJXU1MgbW9kZTogJXNcbiIsIHdzc19zdHJzW2RhdGEtPmRhdGFbMF0gJiAweGZdKTsKKwl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJXU1MgbW9kZTogJXNcbiIsIHdzc19zdHJzW2RhdGEtPmRhdGFbMF0gJiAweGZdKTsKIAlzdGF0ZS0+d3NzX21vZGUgPSAoZGF0YS0+ZGF0YVsxXSAmIDB4M2YpIDw8IDggfCBkYXRhLT5kYXRhWzBdOwogCXJldHVybiAwOwogfQpAQCAtNDY5LDExICs0NDUsMTEgQEAKIAlzdHJ1Y3Qgc2FhNzEyN19zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAogCWlmIChlbmFibGUpIHsKLQkJc2FhNzEyN19kYmcoIkVuYWJsZSBWaWRlbyBPdXRwdXRcbiIpOworCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJFbmFibGUgVmlkZW8gT3V0cHV0XG4iKTsKIAkJc2FhNzEyN193cml0ZShjbGllbnQsIDB4MmQsIHN0YXRlLT5yZWdfMmQpOwogCQlzYWE3MTI3X3dyaXRlKGNsaWVudCwgMHg2MSwgc3RhdGUtPnJlZ182MSk7CiAJfSBlbHNlIHsKLQkJc2FhNzEyN19kYmcoIkRpc2FibGUgVmlkZW8gT3V0cHV0XG4iKTsKKwkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiRGlzYWJsZSBWaWRlbyBPdXRwdXRcbiIpOwogCQlzYWE3MTI3X3dyaXRlKGNsaWVudCwgMHgyZCwgKHN0YXRlLT5yZWdfMmQgJiAweGYwKSk7CiAJCXNhYTcxMjdfd3JpdGUoY2xpZW50LCAweDYxLCAoc3RhdGUtPnJlZ182MSB8IDB4YzApKTsKIAl9CkBAIC00ODksMTEgKzQ2NSwxMSBAQAogCWNvbnN0IHN0cnVjdCBpMmNfcmVnX3ZhbHVlICppbml0dGFiOwogCiAJaWYgKHN0ZCAmIFY0TDJfU1REXzUyNV82MCkgewotCQlzYWE3MTI3X2RiZygiU2VsZWN0aW5nIDYwIEh6IHZpZGVvIFN0YW5kYXJkXG4iKTsKKwkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiU2VsZWN0aW5nIDYwIEh6IHZpZGVvIFN0YW5kYXJkXG4iKTsKIAkJaW5pdHRhYiA9IHNhYTcxMjdfaW5pdF9jb25maWdfNjBoejsKIAkJc3RhdGUtPnJlZ182MSA9IFNBQTcxMjdfNjBIWl9EQUNfQ09OVFJPTDsKIAl9IGVsc2UgewotCQlzYWE3MTI3X2RiZygiU2VsZWN0aW5nIDUwIEh6IHZpZGVvIFN0YW5kYXJkXG4iKTsKKwkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiU2VsZWN0aW5nIDUwIEh6IHZpZGVvIFN0YW5kYXJkXG4iKTsKIAkJaW5pdHRhYiA9IHNhYTcxMjdfaW5pdF9jb25maWdfNTBoejsKIAkJc3RhdGUtPnJlZ182MSA9IFNBQTcxMjdfNTBIWl9EQUNfQ09OVFJPTDsKIAl9CkBAIC01NDQsNyArNTIwLDcgQEAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0Jc2FhNzEyN19kYmcoIlNlbGVjdGluZyAlcyBvdXRwdXQgdHlwZVxuIiwgb3V0cHV0X3N0cnNbb3V0cHV0XSk7CisJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiU2VsZWN0aW5nICVzIG91dHB1dCB0eXBlXG4iLCBvdXRwdXRfc3Ryc1tvdXRwdXRdKTsKIAogCS8qIENvbmZpZ3VyZSBFbmNvZGVyICovCiAJc2FhNzEyN193cml0ZShjbGllbnQsIDB4MmQsIHN0YXRlLT5yZWdfMmQpOwpAQCAtNTYxLDEyICs1MzcsMTIgQEAKIAogCXN3aXRjaCAoaW5wdXQpIHsKIAljYXNlIFNBQTcxMjdfSU5QVVRfVFlQRV9OT1JNQUw6CS8qIGF2aWEgKi8KLQkJc2FhNzEyN19kYmcoIlNlbGVjdGluZyBOb3JtYWwgRW5jb2RlciBJbnB1dFxuIik7CisJCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgIlNlbGVjdGluZyBOb3JtYWwgRW5jb2RlciBJbnB1dFxuIik7CiAJCXN0YXRlLT5yZWdfM2FfY2IgPSAwOwogCQlicmVhazsKIAogCWNhc2UgU0FBNzEyN19JTlBVVF9UWVBFX1RFU1RfSU1BR0U6CS8qIGNvbG9yIGJhciAqLwotCQlzYWE3MTI3X2RiZygiU2VsZWN0aW5nIENvbG9yIEJhciBnZW5lcmF0b3JcbiIpOworCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJTZWxlY3RpbmcgQ29sb3IgQmFyIGdlbmVyYXRvclxuIik7CiAJCXN0YXRlLT5yZWdfM2FfY2IgPSAweDgwOwogCQlicmVhazsKIApAQCAtNjMzLDE0ICs2MDksMTQgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFZJRElPQ19MT0dfU1RBVFVTOgotCQlzYWE3MTI3X2luZm8oIlN0YW5kYXJkOiAlc1xuIiwgKHN0YXRlLT5zdGQgJiBWNEwyX1NURF81MjVfNjApID8gIjYwIEh6IiA6ICI1MCBIeiIpOwotCQlzYWE3MTI3X2luZm8oIklucHV0OiAgICAlc1xuIiwgc3RhdGUtPmlucHV0X3R5cGUgPyAgImNvbG9yIGJhcnMiIDogIm5vcm1hbCIpOwotCQlzYWE3MTI3X2luZm8oIk91dHB1dDogICAlc1xuIiwgc3RhdGUtPnZpZGVvX2VuYWJsZSA/CisJCXY0bF9pbmZvKGNsaWVudCwgIlN0YW5kYXJkOiAlc1xuIiwgKHN0YXRlLT5zdGQgJiBWNEwyX1NURF81MjVfNjApID8gIjYwIEh6IiA6ICI1MCBIeiIpOworCQl2NGxfaW5mbyhjbGllbnQsICJJbnB1dDogICAgJXNcbiIsIHN0YXRlLT5pbnB1dF90eXBlID8gICJjb2xvciBiYXJzIiA6ICJub3JtYWwiKTsKKwkJdjRsX2luZm8oY2xpZW50LCAiT3V0cHV0OiAgICVzXG4iLCBzdGF0ZS0+dmlkZW9fZW5hYmxlID8KIAkJCW91dHB1dF9zdHJzW3N0YXRlLT5vdXRwdXRfdHlwZV0gOiAiZGlzYWJsZWQiKTsKLQkJc2FhNzEyN19pbmZvKCJXU1M6ICAgICAgJXNcbiIsIHN0YXRlLT53c3NfZW5hYmxlID8KKwkJdjRsX2luZm8oY2xpZW50LCAiV1NTOiAgICAgICVzXG4iLCBzdGF0ZS0+d3NzX2VuYWJsZSA/CiAJCQl3c3Nfc3Ryc1tzdGF0ZS0+d3NzX21vZGVdIDogImRpc2FibGVkIik7Ci0JCXNhYTcxMjdfaW5mbygiVlBTOiAgICAgICVzXG4iLCBzdGF0ZS0+dnBzX2VuYWJsZSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwotCQlzYWE3MTI3X2luZm8oIkNDOiAgICAgICAlc1xuIiwgc3RhdGUtPmNjX2VuYWJsZSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCQl2NGxfaW5mbyhjbGllbnQsICJWUFM6ICAgICAgJXNcbiIsIHN0YXRlLT52cHNfZW5hYmxlID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJCXY0bF9pbmZvKGNsaWVudCwgIkNDOiAgICAgICAlc1xuIiwgc3RhdGUtPmNjX2VuYWJsZSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwogCQlicmVhazsKIAogI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKQEAgLTcxMywxNyArNjg5LDE2IEBACiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQogCQlyZXR1cm4gMDsKIAotCWNsaWVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJY2xpZW50ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoY2xpZW50ID09IDApCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbWVtc2V0KGNsaWVudCwgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CiAJY2xpZW50LT5hZGRyID0gYWRkcmVzczsKIAljbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOwogCWNsaWVudC0+ZHJpdmVyID0gJmkyY19kcml2ZXJfc2FhNzEyNzsKIAlzbnByaW50ZihjbGllbnQtPm5hbWUsIHNpemVvZihjbGllbnQtPm5hbWUpIC0gMSwgInNhYTcxMjciKTsKIAotCXNhYTcxMjdfZGJnKCJkZXRlY3Rpbmcgc2FhNzEyNyBjbGllbnQgb24gYWRkcmVzcyAweCV4XG4iLCBhZGRyZXNzIDw8IDEpOworCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgImRldGVjdGluZyBzYWE3MTI3IGNsaWVudCBvbiBhZGRyZXNzIDB4JXhcbiIsIGFkZHJlc3MgPDwgMSk7CiAKIAkvKiBGaXJzdCB0ZXN0IHJlZ2lzdGVyIDA6IEJpdHMgNS03IGFyZSBhIHZlcnNpb24gSUQgKHNob3VsZCBiZSAwKSwKIAkgICBhbmQgYml0IDIgc2hvdWxkIGFsc28gYmUgMC4KQEAgLTczMiwxMSArNzA3LDExIEBACiAJICAgMHgxZCBhZnRlciBhIHJlc2V0IGFuZCBub3QgZXhwZWN0ZWQgdG8gZXZlciBjaGFuZ2UuICovCiAJaWYgKChzYWE3MTI3X3JlYWQoY2xpZW50LCAwKSAmIDB4ZTQpICE9IDAgfHwKIAkJCShzYWE3MTI3X3JlYWQoY2xpZW50LCAweDI5KSAmIDB4M2YpICE9IDB4MWQpIHsKLQkJc2FhNzEyN19kYmcoInNhYTcxMjcgbm90IGZvdW5kXG4iKTsKKwkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAic2FhNzEyNyBub3QgZm91bmRcbiIpOwogCQlrZnJlZShjbGllbnQpOwogCQlyZXR1cm4gMDsKIAl9Ci0Jc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2FhNzEyN19zdGF0ZSksIEdGUF9LRVJORUwpOworCXN0YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNhYTcxMjdfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAogCWlmIChzdGF0ZSA9PSBOVUxMKSB7CiAJCWtmcmVlKGNsaWVudCk7CkBAIC03NDQsMTEgKzcxOSwxMCBAQAogCX0KIAogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHN0YXRlKTsKLQltZW1zZXQoc3RhdGUsIDAsIHNpemVvZihzdHJ1Y3Qgc2FhNzEyN19zdGF0ZSkpOwogCiAJLyogQ29uZmlndXJlIEVuY29kZXIgKi8KIAotCXNhYTcxMjdfZGJnKCJDb25maWd1cmluZyBlbmNvZGVyXG4iKTsKKwl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJDb25maWd1cmluZyBlbmNvZGVyXG4iKTsKIAlzYWE3MTI3X3dyaXRlX2luaXR0YWIoY2xpZW50LCBzYWE3MTI3X2luaXRfY29uZmlnX2NvbW1vbik7CiAJc2FhNzEyN19zZXRfc3RkKGNsaWVudCwgVjRMMl9TVERfTlRTQyk7CiAJc2FhNzEyN19zZXRfb3V0cHV0X3R5cGUoY2xpZW50LCBTQUE3MTI3X09VVFBVVF9UWVBFX0JPVEgpOwpAQCAtNzY5LDEyICs3NDMsMTIgQEAKIAlyZWFkX3Jlc3VsdCA9IHNhYTcxMjdfcmVhZChjbGllbnQsIFNBQTcxMjlfUkVHX0ZBREVfS0VZX0NPTDIpOwogCXNhYTcxMjdfd3JpdGUoY2xpZW50LCBTQUE3MTI5X1JFR19GQURFX0tFWV9DT0wyLCAweGFhKTsKIAlpZiAoc2FhNzEyN19yZWFkKGNsaWVudCwgU0FBNzEyOV9SRUdfRkFERV9LRVlfQ09MMikgPT0gMHhhYSkgewotCQlzYWE3MTI3X2luZm8oInNhYTcxMjkgZm91bmQgQCAweCV4ICglcylcbiIsIGFkZHJlc3MgPDwgMSwgYWRhcHRlci0+bmFtZSk7CisJCXY0bF9pbmZvKGNsaWVudCwgInNhYTcxMjkgZm91bmQgQCAweCV4ICglcylcbiIsIGFkZHJlc3MgPDwgMSwgYWRhcHRlci0+bmFtZSk7CiAJCXNhYTcxMjdfd3JpdGUoY2xpZW50LCBTQUE3MTI5X1JFR19GQURFX0tFWV9DT0wyLCByZWFkX3Jlc3VsdCk7CiAJCXNhYTcxMjdfd3JpdGVfaW5pdHRhYihjbGllbnQsIHNhYTcxMjlfaW5pdF9jb25maWdfZXh0cmEpOwogCQlzdGF0ZS0+aWRlbnQgPSBWNEwyX0lERU5UX1NBQTcxMjk7CiAJfSBlbHNlIHsKLQkJc2FhNzEyN19pbmZvKCJzYWE3MTI3IGZvdW5kIEAgMHgleCAoJXMpXG4iLCBhZGRyZXNzIDw8IDEsIGFkYXB0ZXItPm5hbWUpOworCQl2NGxfaW5mbyhjbGllbnQsICJzYWE3MTI3IGZvdW5kIEAgMHgleCAoJXMpXG4iLCBhZGRyZXNzIDw8IDEsIGFkYXB0ZXItPm5hbWUpOwogCQlzdGF0ZS0+aWRlbnQgPSBWNEwyX0lERU5UX1NBQTcxMjc7CiAJfQogCkBAIC03ODcsMTEgKzc2MSw3IEBACiAKIHN0YXRpYyBpbnQgc2FhNzEyN19wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0jaWZkZWYgSTJDX0NMQVNTX1RWX0FOQUxPRwogCWlmIChhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19UVl9BTkFMT0cpCi0jZWxzZQotCWlmIChhZGFwdGVyLT5pZCA9PSBJMkNfSFdfQl9CVDg0OCkKLSNlbmRpZgogCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsIHNhYTcxMjdfYXR0YWNoKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L0tjb25maWcKaW5kZXggOGE1YzNlNy4uODY2NzFhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L0tjb25maWcKQEAgLTE1LDcgKzE1LDcgQEAKIGNvbmZpZyBWSURFT19TQUE3MTM0X0FMU0EKIAl0cmlzdGF0ZSAiUGhpbGlwcyBTQUE3MTM0IERNQSBhdWRpbyBzdXBwb3J0IgogCWRlcGVuZHMgb24gVklERU9fU0FBNzEzNCAmJiBTTkQKLQlzZWxlY3QgU05EX1BDTV9PU1MKKwlzZWxlY3QgU05EX1BDTQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgaXMgYSB2aWRlbzRsaW51eCBkcml2ZXIgZm9yIGRpcmVjdCAoRE1BKSBhdWRpbyBpbgogCSAgUGhpbGlwcyBTQUE3MTN4IGJhc2VkIFRWIGNhcmRzIHVzaW5nIEFMU0EKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE2NzUyaHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE2NzUyaHMuYwppbmRleCA0NjE1YTk4Li4wZTBiYTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNjc1MmhzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTY3NTJocy5jCkBAIC05LDcgKzksOCBAQAogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KIApAQCAtNTA5LDExICs1MTAsOSBAQAogewogCXN0cnVjdCBzYWE2NzUyaHNfc3RhdGUgKmg7CiAKLQlwcmludGsoInNhYTY3NTJoczogY2hpcCBmb3VuZCBAIDB4JXhcbiIsIGFkZHI8PDEpOwogCi0JaWYgKE5VTEwgPT0gKGggPSBrbWFsbG9jKHNpemVvZigqaCksIEdGUF9LRVJORUwpKSkKKwlpZiAoTlVMTCA9PSAoaCA9IGt6YWxsb2Moc2l6ZW9mKCpoKSwgR0ZQX0tFUk5FTCkpKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQoaCwwLHNpemVvZigqaCkpOwogCWgtPmNsaWVudCA9IGNsaWVudF90ZW1wbGF0ZTsKIAloLT5wYXJhbXMgPSBwYXJhbV9kZWZhdWx0czsKIAloLT5jbGllbnQuYWRhcHRlciA9IGFkYXA7CkBAIC01MjUsNiArNTI0LDggQEAKIAlpMmNfc2V0X2NsaWVudGRhdGEoJmgtPmNsaWVudCwgaCk7CiAJaTJjX2F0dGFjaF9jbGllbnQoJmgtPmNsaWVudCk7CiAKKwl2NGxfaW5mbygmaC0+Y2xpZW50LCJzYWE2NzUyaHM6IGNoaXAgZm91bmQgQCAweCV4XG4iLCBhZGRyPDwxKTsKKwogCXJldHVybiAwOwogfQogCkBAIC01OTgsNyArNTk5LDcgQEAKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZSAgID0gImkyYyBzYWE2NzUyaHMgTVBFRyBlbmNvZGVyIiwKKwkJLm5hbWUgICA9ICJzYWE2NzUyaHMiLAogCX0sCiAJLmlkICAgICAgICAgICAgID0gSTJDX0RSSVZFUklEX1NBQTY3NTJIUywKIAkuYXR0YWNoX2FkYXB0ZXIgPSBzYWE2NzUyaHNfcHJvYmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1hbHNhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1hbHNhLmMKaW5kZXggYWRlMDVmNy4uYTdhNmFiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtYWxzYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWFsc2EuYwpAQCAtMjAsMTMgKzIwLDEzIEBACiAgKgogICovCiAKLSNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMKaW5kZXggNjcyZmIyMC4uYzY0NzE4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jCkBAIC0yNSw2ICsyNSw3IEBACiAKICNpbmNsdWRlICJzYWE3MTM0LXJlZy5oIgogI2luY2x1ZGUgInNhYTcxMzQuaCIKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogCiAvKiBjb21tbHkgdXNlZCBzdHJpbmdzICovCiBzdGF0aWMgY2hhciBuYW1lX211dGVbXSAgICA9ICJtdXRlIjsKQEAgLTE2NjUsNyArMTY2Niw3IEBACiAJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAogCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKLQkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5UIHwgVERBOTg4N19JTlRFUkNBUlJJRVIsCisJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCB8IFREQTk4ODdfSU5URVJDQVJSSUVSIHwgVERBOTg4N19QT1JUMl9BQ1RJVkUsCiAJCS5tcGVnICAgICAgICAgICA9IFNBQTcxMzRfTVBFR19EVkIsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHYsCkBAIC0yNTE0LDYgKzI1MTUsNyBAQAogCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLm1wZWcgICAgICAgICAgID0gU0FBNzEzNF9NUEVHX0RWQiwKKwkJLmdwaW9tYXNrICAgICAgID0gMSA8PCAyMSwKIAkJLmlucHV0cyA9IHt7CiAJCQkubmFtZSAgID0gbmFtZV90diwKIAkJCS52bXV4ICAgPSAxLApAQCAtMjUyOCw2ICsyNTMwLDExIEBACiAJCQkudm11eCAgID0gOCwKIAkJCS5hbXV4ICAgPSBMSU5FMSwKIAkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lICAgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggICA9IFRWLAorCQkJLmdwaW8gICA9IDB4MDIwMDAwMCwKKwkJfSwKIAl9LAogCVtTQUE3MTM0X0JPQVJEX01TSV9UVkFUQU5ZV0hFUkVfUExVU10gPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJNU0kgVFZAQW55d2hlcmUgcGx1cyIsCkBAIC0yNTU1LDYgKzI1NjIsNjkgQEAKIAkJCS5hbXV4ICAgPSBMSU5FMSwKIAkJfSwKIAl9LAorCVtTQUE3MTM0X0JPQVJEX0NJTkVSR1kyNTBQQ0ldID0geworCQkvKiByZW1vdGUtY29udHJvbCBkb2VzIG5vdCB3b3JrLiBUaGUgc2lnbmFsIGFib3V0IGEKKwkJICAga2V5IHByZXNzIGNvbWVzIGluIHZpYSBncGlvLCBidXQgdGhlIGtleSBjb2RlCisJCSAgIGRvZXNuJ3QuIE5laXRoZXIgZG9lcyBpdCBoYXZlIGFuIGkyYyByZW1vdGUgY29udHJvbAorCQkgICBpbnRlcmZhY2UuICovCisJCS5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBDaW5lcmd5IDI1MCBQQ0kgVFYiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLmdwaW9tYXNrICAgICAgID0gMHg4MDIwMDAwMCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywgIC8qIE5PVCB0ZXN0ZWQgKi8KKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSAgID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ICAgPSBMSU5FMSwKKwkJCS5ncGlvICAgPSAweDAyMDAwMDAsCisJCX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9GTFlEVkJfVFJJT10gPSB7CisJCS8qIExpZmVWaWV3IExSMzE5IEZseURWQiBUcmlvICovCisJCS8qIFBldGVyIE1pc3NlbCA8cGV0ZXIubWlzc2VsQG9ubGluZWhvbWUuZGU+ICovCisJCS5uYW1lICAgICAgICAgICA9ICJMaWZlVmlldyBGbHlEVkIgVHJpbyIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVERBODI5MCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkuZ3Bpb21hc2sJPSAweDAwMjAwMDAwLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAkvKiBBbmFsb2cgYnJvYWRjYXN0L2NhYmxlIFRWICovCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IFRWLAorCQkJLmdwaW8gPSAweDIwMDAwMCwJLyogR1BJTzIxPUhpZ2ggZm9yIFRWIGlucHV0ICovCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywJLyogUy1WaWRlbyBzaWduYWwgb24gUy1WaWRlbyBpbnB1dCAqLworCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCS8qIENvbXBvc2l0ZSBzaWduYWwgb24gUy1WaWRlbyBpbnB1dCAqLworCQkJLnZtdXggPSAwLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDIsCS8qIENvbXBvc2l0ZSBpbnB1dCAqLworCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ID0gVFYsCisJCQkuZ3BpbyA9IDB4MDAwMDAwLAkvKiBHUElPMjE9TG93IGZvciBGTSByYWRpbyBhbnRlbm5hICovCisJCX0sCisJfSwKIH07CiAKIGNvbnN0IHVuc2lnbmVkIGludCBzYWE3MTM0X2Jjb3VudCA9IEFSUkFZX1NJWkUoc2FhNzEzNF9ib2FyZHMpOwpAQCAtMjg5NSw2ICsyOTY1LDEyIEBACiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKIAkJLnN1YnZlbmRvciAgICA9IDB4MTQyMSwKKwkJLnN1YmRldmljZSAgICA9IDB4MDM1MSwJCS8qIFBDSSB2ZXJzaW9uLCBuZXcgcmV2aXNpb24gKi8KKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQURTX0lOU1RBTlRfVFYsCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKKwkJLnN1YnZlbmRvciAgICA9IDB4MTQyMSwKIAkJLnN1YmRldmljZSAgICA9IDB4MDM3MCwJCS8qIGNhcmRidXMgdmVyc2lvbiAqLwogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BRFNfSU5TVEFOVF9UViwKIAl9LHsKQEAgLTMwMDIsNiArMzA3OCwxOCBAQAogCQkuc3ViZGV2aWNlICAgID0gMHg2MjMxLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9NU0lfVFZBVEFOWVdIRVJFX1BMVVMsCiAJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKKwkJLnN1YnZlbmRvciAgICA9IDB4MTUzYiwKKwkJLnN1YmRldmljZSAgICA9IDB4MTE2MCwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQ0lORVJHWTI1MFBDSSwKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAkvKiBTQUEgNzEzMUUgKi8KKwkJLnN1YnZlbmRvciAgICA9IDB4NTE2OCwKKwkJLnN1YmRldmljZSAgICA9IDB4MDMxOSwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZRFZCX1RSSU8sCisJfSx7CiAJCS8qIC0tLSBib2FyZHMgd2l0aG91dCBlZXByb20gKyBzdWJzeXN0ZW0gSUQgLS0tICovCiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKQEAgLTMwOTAsNiArMzE3OCw3IEBACiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9HT18wMDdfRk06CiAvKiAgICAgIGNhc2UgU0FBNzEzNF9CT0FSRF9TQUJSRU5UX1NCVFRWRk06ICAqLyAvKiBub3QgZmluaXNoZWQgeWV0ICovCiAJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9QVlI6CisJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9HT0xEX1BMVVM6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9HT0xEX1BMVVNJSToKIAljYXNlIFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX0RWQlRfMzAwOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfRFZCVF8yMDA6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMKaW5kZXggMjNkODc0Ny4uMDI4OTA0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNvcmUuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSAic2FhNzEzNC1yZWcuaCIKICNpbmNsdWRlICJzYWE3MTM0LmgiCkBAIC04NCw3ICs4NSw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKHR1bmVyLCAgICAidHVuZXIgdHlwZSIpOwogTU9EVUxFX1BBUk1fREVTQyhjYXJkLCAgICAgImNhcmQgdHlwZSIpOwogCi1zdGF0aWMgREVDTEFSRV9NVVRFWChkZXZsaXN0X2xvY2spOworc3RhdGljIERFRklORV9NVVRFWChkZXZsaXN0X2xvY2spOwogTElTVF9IRUFEKHNhYTcxMzRfZGV2bGlzdCk7CiBzdGF0aWMgTElTVF9IRUFEKG1vcHNfbGlzdCk7CiBzdGF0aWMgdW5zaWduZWQgaW50IHNhYTcxMzRfZGV2Y291bnQ7CkBAIC05NSw3NyArOTYsNiBAQAogI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJnLi4uKQlpZiAoY29yZV9kZWJ1ZykgXAogCXByaW50ayhLRVJOX0RFQlVHICIlcy9jb3JlOiAiIGZtdCwgZGV2LT5uYW1lICwgIyMgYXJnKQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIGRlYnVnIGhlbHAgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqdjRsMV9pb2N0bHNbXSA9IHsKLQkiMCIsICJHQ0FQIiwgIkdDSEFOIiwgIlNDSEFOIiwgIkdUVU5FUiIsICJTVFVORVIiLCAiR1BJQ1QiLCAiU1BJQ1QiLAotCSJDQ0FQVFVSRSIsICJHV0lOIiwgIlNXSU4iLCAiR0ZCVUYiLCAiU0ZCVUYiLCAiS0VZIiwgIkdGUkVRIiwKLQkiU0ZSRVEiLCAiR0FVRElPIiwgIlNBVURJTyIsICJTWU5DIiwgIk1DQVBUVVJFIiwgIkdNQlVGIiwgIkdVTklUIiwKLQkiR0NBUFRVUkUiLCAiU0NBUFRVUkUiLCAiU1BMQVlNT0RFIiwgIlNXUklURU1PREUiLCAiR1BMQVlJTkZPIiwKLQkiU01JQ1JPQ09ERSIsICJHVkJJRk1UIiwgIlNWQklGTVQiIH07Ci0jZGVmaW5lIFY0TDFfSU9DVExTIEFSUkFZX1NJWkUodjRsMV9pb2N0bHMpCi0KLXN0YXRpYyBjb25zdCBjaGFyICp2NGwyX2lvY3Rsc1tdID0gewotCSJRVUVSWUNBUCIsICIxIiwgIkVOVU1fUElYRk1UIiwgIkVOVU1fRkJVRkZNVCIsICJHX0ZNVCIsICJTX0ZNVCIsCi0JIkdfQ09NUCIsICJTX0NPTVAiLCAiUkVRQlVGUyIsICJRVUVSWUJVRiIsICJHX0ZCVUYiLCAiU19GQlVGIiwKLQkiR19XSU4iLCAiU19XSU4iLCAiUFJFVklFVyIsICJRQlVGIiwgIjE2IiwgIkRRQlVGIiwgIlNUUkVBTU9OIiwKLQkiU1RSRUFNT0ZGIiwgIkdfUEVSRiIsICJHX1BBUk0iLCAiU19QQVJNIiwgIkdfU1REIiwgIlNfU1REIiwKLQkiRU5VTVNURCIsICJFTlVNSU5QVVQiLCAiR19DVFJMIiwgIlNfQ1RSTCIsICJHX1RVTkVSIiwgIlNfVFVORVIiLAotCSJHX0ZSRVEiLCAiU19GUkVRIiwgIkdfQVVESU8iLCAiU19BVURJTyIsICIzNSIsICJRVUVSWUNUUkwiLAotCSJRVUVSWU1FTlUiLCAiR19JTlBVVCIsICJTX0lOUFVUIiwgIkVOVU1DVlQiLCAiNDEiLCAiNDIiLCAiNDMiLAotCSI0NCIsICI0NSIsICAiR19PVVRQVVQiLCAiU19PVVRQVVQiLCAiRU5VTU9VVFBVVCIsICJHX0FVRE9VVCIsCi0JIlNfQVVET1VUIiwgIkVOVU1GWCIsICJHX0VGRkVDVCIsICJTX0VGRkVDVCIsICJHX01PRFVMQVRPUiIsCi0JIlNfTU9EVUxBVE9SIgotfTsKLSNkZWZpbmUgVjRMMl9JT0NUTFMgQVJSQVlfU0laRSh2NGwyX2lvY3RscykKLQotc3RhdGljIGNvbnN0IGNoYXIgKm9zc3BjbV9pb2N0bHNbXSA9IHsKLQkiUkVTRVQiLCAiU1lOQyIsICJTUEVFRCIsICJTVEVSRU8iLCAiR0VUQkxLU0laRSIsICJTRVRGTVQiLAotCSJDSEFOTkVMUyIsICI/IiwgIlBPU1QiLCAiU1VCRElWSURFIiwgIlNFVEZSQUdNRU5UIiwgIkdFVEZNVFMiLAotCSJHRVRPU1BBQ0UiLCAiR0VUSVNQQUNFIiwgIk5PTkJMT0NLIiwgIkdFVENBUFMiLCAiR0VUL1NFVFRSSUdHRVIiLAotCSJHRVRJUFRSIiwgIkdFVE9QVFIiLCAiTUFQSU5CVUYiLCAiTUFQT1VUQlVGIiwgIlNFVFNZTkNSTyIsCi0JIlNFVERVUExFWCIsICJHRVRPREVMQVkiCi19OwotI2RlZmluZSBPU1NQQ01fSU9DVExTIEFSUkFZX1NJWkUodjRsMl9pb2N0bHMpCi0KLXZvaWQgc2FhNzEzNF9wcmludF9pb2N0bChjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgY21kKQotewotCWNoYXIgKmRpcjsKLQotCXN3aXRjaCAoX0lPQ19ESVIoY21kKSkgewotCWNhc2UgX0lPQ19OT05FOiAgICAgICAgICAgICAgZGlyID0gIi0tIjsgYnJlYWs7Ci0JY2FzZSBfSU9DX1JFQUQ6ICAgICAgICAgICAgICBkaXIgPSAici0iOyBicmVhazsKLQljYXNlIF9JT0NfV1JJVEU6ICAgICAgICAgICAgIGRpciA9ICItdyI7IGJyZWFrOwotCWNhc2UgX0lPQ19SRUFEIHwgX0lPQ19XUklURTogZGlyID0gInJ3IjsgYnJlYWs7Ci0JZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICBkaXIgPSAiPz8iOyBicmVhazsKLQl9Ci0Jc3dpdGNoIChfSU9DX1RZUEUoY21kKSkgewotCWNhc2UgJ3YnOgotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlvY3RsIDB4JTA4eCAodjRsMSwgJXMsIFZJRElPQyVzKVxuIiwKLQkJICAgICAgIG5hbWUsIGNtZCwgZGlyLCAoX0lPQ19OUihjbWQpIDwgVjRMMV9JT0NUTFMpID8KLQkJICAgICAgIHY0bDFfaW9jdGxzW19JT0NfTlIoY21kKV0gOiAiPz8/Iik7Ci0JCWJyZWFrOwotCWNhc2UgJ1YnOgotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlvY3RsIDB4JTA4eCAodjRsMiwgJXMsIFZJRElPQ18lcylcbiIsCi0JCSAgICAgICBuYW1lLCBjbWQsIGRpciwgKF9JT0NfTlIoY21kKSA8IFY0TDJfSU9DVExTKSA/Ci0JCSAgICAgICB2NGwyX2lvY3Rsc1tfSU9DX05SKGNtZCldIDogIj8/PyIpOwotCQlicmVhazsKLQljYXNlICdQJzoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpb2N0bCAweCUwOHggKG9zcyBkc3AsICVzLCBTTkRDVExfRFNQXyVzKVxuIiwKLQkJICAgICAgIG5hbWUsIGNtZCwgZGlyLCAoX0lPQ19OUihjbWQpIDwgT1NTUENNX0lPQ1RMUykgPwotCQkgICAgICAgb3NzcGNtX2lvY3Rsc1tfSU9DX05SKGNtZCldIDogIj8/PyIpOwotCQlicmVhazsKLQljYXNlICdNJzoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpb2N0bCAweCUwOHggKG9zcyBtaXhlciwgJXMsICMlZClcbiIsCi0JCSAgICAgICBuYW1lLCBjbWQsIGRpciwgX0lPQ19OUihjbWQpKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpb2N0bCAweCUwOHggKD8/PywgJXMsICMlZClcbiIsCi0JCSAgICAgICBuYW1lLCBjbWQsIGRpciwgX0lPQ19OUihjbWQpKTsKLQl9Ci19Ci0KIHZvaWQgc2FhNzEzNF90cmFja19ncGlvKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBjaGFyICptc2cpCiB7CiAJdW5zaWduZWQgbG9uZyBtb2RlLHN0YXR1czsKQEAgLTYxMCwxMSArNTQwLDM4IEBACiAJCSAgICBjYXJkX2hhc19tcGVnKGRldikpCiAJCQlzYWE3MTM0X2lycV90c19kb25lKGRldixzdGF0dXMpOwogCi0JCWlmICgocmVwb3J0ICYgKFNBQTcxMzRfSVJRX1JFUE9SVF9HUElPMTYgfAotCQkJICAgICAgIFNBQTcxMzRfSVJRX1JFUE9SVF9HUElPMTgpKSAmJgotCQkgICAgZGV2LT5yZW1vdGUpCi0JCQlzYWE3MTM0X2lucHV0X2lycShkZXYpOworCQlpZiAocmVwb3J0ICYgU0FBNzEzNF9JUlFfUkVQT1JUX0dQSU8xNikgeworCQkJc3dpdGNoIChkZXYtPmhhc19yZW1vdGUpIHsKKwkJCQljYXNlIFNBQTcxMzRfUkVNT1RFX0dQSU86CisJCQkJCWlmICAoZGV2LT5yZW1vdGUtPm1hc2tfa2V5ZG93biAmIDB4MTAwMDApIHsKKwkJCQkJCXNhYTcxMzRfaW5wdXRfaXJxKGRldik7CisJCQkJCX0KKwkJCQkJYnJlYWs7CiAKKwkJCQljYXNlIFNBQTcxMzRfUkVNT1RFX0kyQzoKKwkJCQkJYnJlYWs7CQkJLyogRklYTUU6IGludm9rZSBJMkMgZ2V0X2tleSgpICovCisKKwkJCQlkZWZhdWx0OgkJCS8qIEdQSU8xNiBub3QgdXNlZCBieSBJUiByZW1vdGUgKi8KKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAocmVwb3J0ICYgU0FBNzEzNF9JUlFfUkVQT1JUX0dQSU8xOCkgeworCQkJc3dpdGNoIChkZXYtPmhhc19yZW1vdGUpIHsKKwkJCQljYXNlIFNBQTcxMzRfUkVNT1RFX0dQSU86CisJCQkJCWlmICgoZGV2LT5yZW1vdGUtPm1hc2tfa2V5ZG93biAmIDB4NDAwMDApIHx8CisJCQkJCSAgICAoZGV2LT5yZW1vdGUtPm1hc2tfa2V5dXAgJiAweDQwMDAwKSkgeworCQkJCQkJc2FhNzEzNF9pbnB1dF9pcnEoZGV2KTsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWNhc2UgU0FBNzEzNF9SRU1PVEVfSTJDOgorCQkJCQlicmVhazsJCQkvKiBGSVhNRTogaW52b2tlIEkyQyBnZXRfa2V5KCkgKi8KKworCQkJCWRlZmF1bHQ6CQkJLyogR1BJTzE4IG5vdCB1c2VkIGJ5IElSIHJlbW90ZSAqLworCQkJCQlicmVhazsKKwkJCX0KKwkJfQogCX0KIAogCWlmICgxMCA9PSBsb29wKSB7CkBAIC02MjQsMTMgKzU4MSwxNiBAQAogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMvaXJxOiBsb29waW5nIC0tICIKIAkJCSAgICAgICAiY2xlYXJpbmcgUEUgKHBhcml0eSBlcnJvciEpIGVuYWJsZSBiaXRcbiIsZGV2LT5uYW1lKTsKIAkJCXNhYV9jbGVhcmwoU0FBNzEzNF9JUlEyLFNBQTcxMzRfSVJRMl9JTlRFX1BFKTsKLQkJfSBlbHNlIGlmIChyZXBvcnQgJiAoU0FBNzEzNF9JUlFfUkVQT1JUX0dQSU8xNiB8Ci0JCQkJICAgICBTQUE3MTM0X0lSUV9SRVBPUlRfR1BJTzE4KSkgewotCQkJLyogZGlzYWJsZSBncGlvIElSUXMgKi8KKwkJfSBlbHNlIGlmIChyZXBvcnQgJiBTQUE3MTM0X0lSUV9SRVBPUlRfR1BJTzE2KSB7CisJCQkvKiBkaXNhYmxlIGdwaW8xNiBJUlEgKi8KIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzL2lycTogbG9vcGluZyAtLSAiCi0JCQkgICAgICAgImNsZWFyaW5nIEdQSU8gZW5hYmxlIGJpdHNcbiIsZGV2LT5uYW1lKTsKLQkJCXNhYV9jbGVhcmwoU0FBNzEzNF9JUlEyLCAoU0FBNzEzNF9JUlEyX0lOVEVfR1BJTzE2IHwKLQkJCQkJCSAgU0FBNzEzNF9JUlEyX0lOVEVfR1BJTzE4KSk7CisJCQkgICAgICAgImNsZWFyaW5nIEdQSU8xNiBlbmFibGUgYml0XG4iLGRldi0+bmFtZSk7CisJCQlzYWFfY2xlYXJsKFNBQTcxMzRfSVJRMiwgU0FBNzEzNF9JUlEyX0lOVEVfR1BJTzE2KTsKKwkJfSBlbHNlIGlmIChyZXBvcnQgJiBTQUE3MTM0X0lSUV9SRVBPUlRfR1BJTzE4KSB7CisJCQkvKiBkaXNhYmxlIGdwaW8xOCBJUlFzICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcy9pcnE6IGxvb3BpbmcgLS0gIgorCQkJICAgICAgICJjbGVhcmluZyBHUElPMTggZW5hYmxlIGJpdFxuIixkZXYtPm5hbWUpOworCQkJc2FhX2NsZWFybChTQUE3MTM0X0lSUTIsIFNBQTcxMzRfSVJRMl9JTlRFX0dQSU8xOCk7CiAJCX0gZWxzZSB7CiAJCQkvKiBkaXNhYmxlIGFsbCBpcnFzICovCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcy9pcnE6IGxvb3BpbmcgLS0gIgpAQCAtNzExLDEwICs2NzEsMTQgQEAKIAkJU0FBNzEzNF9JUlEyX0lOVEVfUEUgICAgICB8CiAJCVNBQTcxMzRfSVJRMl9JTlRFX0FSOwogCi0JaWYgKGRldi0+aGFzX3JlbW90ZSA9PSBTQUE3MTM0X1JFTU9URV9HUElPKQotCQlpcnEyX21hc2sgfD0gKFNBQTcxMzRfSVJRMl9JTlRFX0dQSU8xOCAgfAotCQkJICAgICAgU0FBNzEzNF9JUlEyX0lOVEVfR1BJTzE4QSB8Ci0JCQkgICAgICBTQUE3MTM0X0lSUTJfSU5URV9HUElPMTYgICk7CisJaWYgKGRldi0+aGFzX3JlbW90ZSA9PSBTQUE3MTM0X1JFTU9URV9HUElPKSB7CisJCWlmIChkZXYtPnJlbW90ZS0+bWFza19rZXlkb3duICYgMHgxMDAwMCkKKwkJCWlycTJfbWFzayB8PSBTQUE3MTM0X0lSUTJfSU5URV9HUElPMTY7CisJCWVsc2UgaWYgKGRldi0+cmVtb3RlLT5tYXNrX2tleWRvd24gJiAweDQwMDAwKQorCQkJaXJxMl9tYXNrIHw9IFNBQTcxMzRfSVJRMl9JTlRFX0dQSU8xODsKKwkJZWxzZSBpZiAoZGV2LT5yZW1vdGUtPm1hc2tfa2V5dXAgJiAweDQwMDAwKQorCQkJaXJxMl9tYXNrIHw9IFNBQTcxMzRfSVJRMl9JTlRFX0dQSU8xOEE7CisJfQogCiAJc2FhX3dyaXRlbChTQUE3MTM0X0lSUTEsIDApOwogCXNhYV93cml0ZWwoU0FBNzEzNF9JUlEyLCBpcnEyX21hc2spOwpAQCAtODQwLDEwICs4MDQsOSBAQAogCXN0cnVjdCBzYWE3MTM0X21wZWdfb3BzICptb3BzOwogCWludCBlcnI7CiAKLQlkZXYgPSBrbWFsbG9jKHNpemVvZigqZGV2KSxHRlBfS0VSTkVMKTsKKwlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSxHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCA9PSBkZXYpCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbXNldChkZXYsMCxzaXplb2YoKmRldikpOwogCiAJLyogcGNpIGluaXQgKi8KIAlkZXYtPnBjaSA9IHBjaV9kZXY7CkBAIC0xMDA3LDEzICs5NzAsMTMgQEAKIAlwY2lfc2V0X2RydmRhdGEocGNpX2RldixkZXYpOwogCXNhYTcxMzRfZGV2Y291bnQrKzsKIAotCWRvd24oJmRldmxpc3RfbG9jayk7CisJbXV0ZXhfbG9jaygmZGV2bGlzdF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoKGl0ZW0sJm1vcHNfbGlzdCkgewogCQltb3BzID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3Qgc2FhNzEzNF9tcGVnX29wcywgbmV4dCk7CiAJCW1wZWdfb3BzX2F0dGFjaChtb3BzLCBkZXYpOwogCX0KIAlsaXN0X2FkZF90YWlsKCZkZXYtPmRldmxpc3QsJnNhYTcxMzRfZGV2bGlzdCk7Ci0JdXAoJmRldmxpc3RfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZkZXZsaXN0X2xvY2spOwogCiAJLyogY2hlY2sgZm9yIHNpZ25hbCAqLwogCXNhYTcxMzRfaXJxX3ZpZGVvX2ludGwoZGV2KTsKQEAgLTEwNjksMTMgKzEwMzIsMTMgQEAKIAlzYWE3MTM0X2h3ZmluaShkZXYpOwogCiAJLyogdW5yZWdpc3RlciAqLwotCWRvd24oJmRldmxpc3RfbG9jayk7CisJbXV0ZXhfbG9jaygmZGV2bGlzdF9sb2NrKTsKIAlsaXN0X2RlbCgmZGV2LT5kZXZsaXN0KTsKIAlsaXN0X2Zvcl9lYWNoKGl0ZW0sJm1vcHNfbGlzdCkgewogCQltb3BzID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3Qgc2FhNzEzNF9tcGVnX29wcywgbmV4dCk7CiAJCW1wZWdfb3BzX2RldGFjaChtb3BzLCBkZXYpOwogCX0KLQl1cCgmZGV2bGlzdF9sb2NrKTsKKwltdXRleF91bmxvY2soJmRldmxpc3RfbG9jayk7CiAJc2FhNzEzNF9kZXZjb3VudC0tOwogCiAJc2FhNzEzNF9pMmNfdW5yZWdpc3RlcihkZXYpOwpAQCAtMTEwOSwxMyArMTA3MiwxMyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CiAJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXY7CiAKLQlkb3duKCZkZXZsaXN0X2xvY2spOworCW11dGV4X2xvY2soJmRldmxpc3RfbG9jayk7CiAJbGlzdF9mb3JfZWFjaChpdGVtLCZzYWE3MTM0X2Rldmxpc3QpIHsKIAkJZGV2ID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3Qgc2FhNzEzNF9kZXYsIGRldmxpc3QpOwogCQltcGVnX29wc19hdHRhY2gob3BzLCBkZXYpOwogCX0KIAlsaXN0X2FkZF90YWlsKCZvcHMtPm5leHQsJm1vcHNfbGlzdCk7Ci0JdXAoJmRldmxpc3RfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZkZXZsaXN0X2xvY2spOwogCXJldHVybiAwOwogfQogCkBAIC0xMTI0LDEzICsxMDg3LDEzIEBACiAJc3RydWN0IGxpc3RfaGVhZCAqaXRlbTsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldjsKIAotCWRvd24oJmRldmxpc3RfbG9jayk7CisJbXV0ZXhfbG9jaygmZGV2bGlzdF9sb2NrKTsKIAlsaXN0X2RlbCgmb3BzLT5uZXh0KTsKIAlsaXN0X2Zvcl9lYWNoKGl0ZW0sJnNhYTcxMzRfZGV2bGlzdCkgewogCQlkZXYgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBzYWE3MTM0X2RldiwgZGV2bGlzdCk7CiAJCW1wZWdfb3BzX2RldGFjaChvcHMsIGRldik7CiAJfQotCXVwKCZkZXZsaXN0X2xvY2spOworCW11dGV4X3VubG9jaygmZGV2bGlzdF9sb2NrKTsKIH0KIAogRVhQT1JUX1NZTUJPTChzYWE3MTM0X3RzX3JlZ2lzdGVyKTsKQEAgLTExNTYsNyArMTExOSw3IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAic2FhNzEzMC8zNDogc25hcHNob3QgZGF0ZSAlMDRkLSUwMmQtJTAyZFxuIiwKIAkgICAgICAgU05BUFNIT1QvMTAwMDAsIChTTkFQU0hPVC8xMDApJTEwMCwgU05BUFNIT1QlMTAwKTsKICNlbmRpZgotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnNhYTcxMzRfcGNpX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnNhYTcxMzRfcGNpX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIHNhYTcxMzRfZmluaSh2b2lkKQpAQCAtMTE3Myw3ICsxMTM2LDYgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotRVhQT1JUX1NZTUJPTChzYWE3MTM0X3ByaW50X2lvY3RsKTsKIEVYUE9SVF9TWU1CT0woc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKTsKIEVYUE9SVF9TWU1CT0woc2FhNzEzNF9kZXZsaXN0KTsKIEVYUE9SVF9TWU1CT0woc2FhNzEzNF9ib2FyZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYwppbmRleCBlMDE2NDgwLi4zOTlmOTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYwpAQCAtMzEsNiArMzEsNyBAQAogCiAjaW5jbHVkZSAic2FhNzEzNC1yZWcuaCIKICNpbmNsdWRlICJzYWE3MTM0LmgiCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KIAogI2lmZGVmIEhBVkVfTVQzNTIKICMgaW5jbHVkZSAibXQzNTIuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYwppbmRleCA1NzVmM2U4Li5iZDRjMzg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1lbXByZXNzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZW1wcmVzcy5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSAic2FhNzEzNC5oIgogCiAjaW5jbHVkZSA8bWVkaWEvc2FhNjc1MmhzLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTE2Myw3ICsxNjQsNyBAQAogCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCiAJaWYgKGRlYnVnID4gMSkKLQkJc2FhNzEzNF9wcmludF9pb2N0bChkZXYtPm5hbWUsY21kKTsKKwkJdjRsX3ByaW50X2lvY3RsKGRldi0+bmFtZSxjbWQpOwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBWSURJT0NfUVVFUllDQVA6CiAJewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pMmMuYwppbmRleCAxNzkyZDAzLi42MTYyNTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pMmMuYwpAQCAtMzAsNiArMzAsNyBAQAogCiAjaW5jbHVkZSAic2FhNzEzNC1yZWcuaCIKICNpbmNsdWRlICJzYWE3MTM0LmgiCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMzkwLDkgKzM5MSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgc2FhNzEzNF9hZGFwX3RlbXBsYXRlID0gewogCS5vd25lciAgICAgICAgID0gVEhJU19NT0RVTEUsCi0jaWZkZWYgSTJDX0NMQVNTX1RWX0FOQUxPRwogCS5jbGFzcyAgICAgICAgID0gSTJDX0NMQVNTX1RWX0FOQUxPRywKLSNlbmRpZgogCS5uYW1lICAgICAgICAgID0gInNhYTcxMzQiLAogCS5pZCAgICAgICAgICAgID0gSTJDX0hXX1NBQTcxMzQsCiAJLmFsZ28gICAgICAgICAgPSAmc2FhNzEzNF9hbGdvLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWlucHV0LmMKaW5kZXggYWI3NWNhNS4uODJkMjhjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jCkBAIC01NiwyMyArNTYsMjMgQEAKIAlbICAgMTIgXSA9IEtFWV9LUDgsCiAJWyAgIDEzIF0gPSBLRVlfS1A5LAogCi0JWyAgIDE0IF0gPSBLRVlfVFVORVIsICAgICAgICAvLyBBaXIvQ2FibGUKKwlbICAgMTQgXSA9IEtFWV9NT0RFLCAgICAgICAgIC8vIEFpci9DYWJsZQogCVsgICAxNyBdID0gS0VZX1ZJREVPLCAgICAgICAgLy8gVmlkZW8KIAlbICAgMjEgXSA9IEtFWV9BVURJTywgICAgICAgIC8vIEF1ZGlvCi0JWyAgICAwIF0gPSBLRVlfUE9XRVIsICAgICAgICAvLyBQb3ZlcgorCVsgICAgMCBdID0gS0VZX1BPV0VSLCAgICAgICAgLy8gUG93ZXIKKwlbICAgMjQgXSA9IEtFWV9UVU5FUiwgICAgICAgIC8vIEFWIFNvdXJjZQogCVsgICAgMiBdID0gS0VZX1pPT00sICAgICAgICAgLy8gRnVsbHNjcmVlbgorCVsgICAyNiBdID0gS0VZX0xBTkdVQUdFLCAgICAgLy8gU3RlcmVvCiAJWyAgIDI3IF0gPSBLRVlfTVVURSwgICAgICAgICAvLyBNdXRlCi0JWyAgIDIwIF0gPSBLRVlfVk9MVU1FVVAsCi0JWyAgIDIzIF0gPSBLRVlfVk9MVU1FRE9XTiwKKwlbICAgMjAgXSA9IEtFWV9WT0xVTUVVUCwgICAgIC8vIFZvbHVtZSArCisJWyAgIDIzIF0gPSBLRVlfVk9MVU1FRE9XTiwgICAvLyBWb2x1bWUgLQogCVsgICAxOCBdID0gS0VZX0NIQU5ORUxVUCwgICAgLy8gQ2hhbm5lbCArCiAJWyAgIDE5IF0gPSBLRVlfQ0hBTk5FTERPV04sICAvLyBDaGFubmVsIC0KLQlbICAgIDYgXSA9IEtFWV9BR0FJTiwgICAgICAgIC8vIFJlY2FsCi0JWyAgIDE2IF0gPSBLRVlfS1BFTlRFUiwgICAgICAvLyBFbnRlcgotCi0JWyAgIDI2IF0gPSBLRVlfRjIyLCAgICAgICAgICAvLyBTdGVyZW8KLQlbICAgMjQgXSA9IEtFWV9FRElULCAgICAgICAgIC8vIEFWIFNvdXJjZQorCVsgICAgNiBdID0gS0VZX0FHQUlOLCAgICAgICAgLy8gUmVjYWxsCisJWyAgIDE2IF0gPSBLRVlfRU5URVIsICAgICAgLy8gRW50ZXIKIH07CiAKKwogc3RhdGljIElSX0tFWVRBQl9UWVBFIGNpbmVyZ3lfY29kZXNbSVJfS0VZVEFCX1NJWkVdID0gewogCVsgICAgMCBdID0gS0VZX0tQMCwKIAlbICAgIDEgXSA9IEtFWV9LUDEsCkBAIC01NDMsMTIgKzU0MywyMiBAQAogCWRwcmludGsoImJ1aWxkX2tleSBncGlvPTB4JXggbWFzaz0weCV4IGRhdGE9JWRcbiIsCiAJCWdwaW8sIGlyLT5tYXNrX2tleWNvZGUsIGRhdGEpOwogCi0JaWYgKChpci0+bWFza19rZXlkb3duICAmJiAgKDAgIT0gKGdwaW8gJiBpci0+bWFza19rZXlkb3duKSkpIHx8Ci0JICAgIChpci0+bWFza19rZXl1cCAgICAmJiAgKDAgPT0gKGdwaW8gJiBpci0+bWFza19rZXl1cCkpKSkgewotCQlpcl9pbnB1dF9rZXlkb3duKGlyLT5kZXYsICZpci0+aXIsIGRhdGEsIGRhdGEpOwotCX0gZWxzZSB7Ci0JCWlyX2lucHV0X25va2V5KGlyLT5kZXYsICZpci0+aXIpOworCWlmIChpci0+cG9sbGluZykgeworCQlpZiAoKGlyLT5tYXNrX2tleWRvd24gICYmICAoMCAhPSAoZ3BpbyAmIGlyLT5tYXNrX2tleWRvd24pKSkgfHwKKwkJICAgIChpci0+bWFza19rZXl1cCAgICAmJiAgKDAgPT0gKGdwaW8gJiBpci0+bWFza19rZXl1cCkpKSkgeworCQkJaXJfaW5wdXRfa2V5ZG93bihpci0+ZGV2LCAmaXItPmlyLCBkYXRhLCBkYXRhKTsKKwkJfSBlbHNlIHsKKwkJCWlyX2lucHV0X25va2V5KGlyLT5kZXYsICZpci0+aXIpOworCQl9CiAJfQorCWVsc2UgewkvKiBJUlEgZHJpdmVuIG1vZGUgLSBoYW5kbGUga2V5IHByZXNzIGFuZCByZWxlYXNlIGluIG9uZSBnbyAqLworCQlpZiAoKGlyLT5tYXNrX2tleWRvd24gICYmICAoMCAhPSAoZ3BpbyAmIGlyLT5tYXNrX2tleWRvd24pKSkgfHwKKwkJICAgIChpci0+bWFza19rZXl1cCAgICAmJiAgKDAgPT0gKGdwaW8gJiBpci0+bWFza19rZXl1cCkpKSkgeworCQkJaXJfaW5wdXRfa2V5ZG93bihpci0+ZGV2LCAmaXItPmlyLCBkYXRhLCBkYXRhKTsKKwkJCWlyX2lucHV0X25va2V5KGlyLT5kZXYsICZpci0+aXIpOworCQl9CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY4Niw2ICs2OTYsNyBAQAogCQlwb2xsaW5nCSAgICAgPSA1MDsgLy8gbXMKIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9QVlI6CisJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9HT0xEX1BMVVM6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9HT0xEX1BMVVNJSToKIAkJaXJfY29kZXMgICAgID0gdmlkZW9tYXRlX3R2X3B2cl9jb2RlczsKIAkJbWFza19rZXljb2RlID0gMHgwMDAwM0Y7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1vc3MuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LW9zcy5jCmluZGV4IDhiYWRkMmEuLjc0NDhlMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LW9zcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LW9zcy5jCkBAIC0zNzMsNiArMzczLDQyIEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpvc3NwY21faW9jdGxzW10gPSB7CisJIlJFU0VUIiwgIlNZTkMiLCAiU1BFRUQiLCAiU1RFUkVPIiwgIkdFVEJMS1NJWkUiLCAiU0VURk1UIiwKKwkiQ0hBTk5FTFMiLCAiPyIsICJQT1NUIiwgIlNVQkRJVklERSIsICJTRVRGUkFHTUVOVCIsICJHRVRGTVRTIiwKKwkiR0VUT1NQQUNFIiwgIkdFVElTUEFDRSIsICJOT05CTE9DSyIsICJHRVRDQVBTIiwgIkdFVC9TRVRUUklHR0VSIiwKKwkiR0VUSVBUUiIsICJHRVRPUFRSIiwgIk1BUElOQlVGIiwgIk1BUE9VVEJVRiIsICJTRVRTWU5DUk8iLAorCSJTRVREVVBMRVgiLCAiR0VUT0RFTEFZIgorfTsKKyNkZWZpbmUgT1NTUENNX0lPQ1RMUyBBUlJBWV9TSVpFKG9zc3BjbV9pb2N0bHMpCisKK3N0YXRpYyB2b2lkIHNhYTcxMzRfb3NzX3ByaW50X2lvY3RsKGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBjbWQpCit7CisJY2hhciAqZGlyOworCisJc3dpdGNoIChfSU9DX0RJUihjbWQpKSB7CisJY2FzZSBfSU9DX05PTkU6ICAgICAgICAgICAgICBkaXIgPSAiLS0iOyBicmVhazsKKwljYXNlIF9JT0NfUkVBRDogICAgICAgICAgICAgIGRpciA9ICJyLSI7IGJyZWFrOworCWNhc2UgX0lPQ19XUklURTogICAgICAgICAgICAgZGlyID0gIi13IjsgYnJlYWs7CisJY2FzZSBfSU9DX1JFQUQgfCBfSU9DX1dSSVRFOiBkaXIgPSAicnciOyBicmVhazsKKwlkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgIGRpciA9ICI/PyI7IGJyZWFrOworCX0KKwlzd2l0Y2ggKF9JT0NfVFlQRShjbWQpKSB7CisJY2FzZSAnUCc6CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaW9jdGwgMHglMDh4IChvc3MgZHNwLCAlcywgU05EQ1RMX0RTUF8lcylcbiIsCisJCSAgICAgICBuYW1lLCBjbWQsIGRpciwgKF9JT0NfTlIoY21kKSA8IE9TU1BDTV9JT0NUTFMpID8KKwkJICAgICAgIG9zc3BjbV9pb2N0bHNbX0lPQ19OUihjbWQpXSA6ICI/Pz8iKTsKKwkJYnJlYWs7CisJY2FzZSAnTSc6CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaW9jdGwgMHglMDh4IChvc3MgbWl4ZXIsICVzLCAjJWQpXG4iLAorCQkgICAgICAgbmFtZSwgY21kLCBkaXIsIF9JT0NfTlIoY21kKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaW9jdGwgMHglMDh4ICg/Pz8sICVzLCAjJWQpXG4iLAorCQkgICAgICAgbmFtZSwgY21kLCBkaXIsIF9JT0NfTlIoY21kKSk7CisJfQorfQorCiBzdGF0aWMgaW50IGRzcF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKQEAgLTM4Miw3ICs0MTgsNyBAQAogCWludCB2YWwgPSAwOwogCiAJaWYgKGRlYnVnID4gMSkKLQkJc2FhNzEzNF9wcmludF9pb2N0bChkZXYtPm5hbWUsY21kKTsKKwkJc2FhNzEzNF9vc3NfcHJpbnRfaW9jdGwoZGV2LT5uYW1lLGNtZCk7CiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIE9TU19HRVRWRVJTSU9OOgogCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgcCk7CkBAIC02NzgsNyArNzE0LDcgQEAKIAlpbnQgX191c2VyICpwID0gYXJncDsKIAogCWlmIChkZWJ1ZyA+IDEpCi0JCXNhYTcxMzRfcHJpbnRfaW9jdGwoZGV2LT5uYW1lLGNtZCk7CisJCXNhYTcxMzRfb3NzX3ByaW50X2lvY3RsKGRldi0+bmFtZSxjbWQpOwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBPU1NfR0VUVkVSU0lPTjoKIAkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdHZhdWRpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdHZhdWRpby5jCmluZGV4IDkzMjY4NDIuLmFmYTRkY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXR2YXVkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC10dmF1ZGlvLmMKQEAgLTE4MCw4ICsxODAsOCBAQAogCXNhYV93cml0ZWIoU0FBNzEzNF9BVURJT19DTE9DSzAsICAgICAgY2xvY2sgICAgICAgICYgMHhmZik7CiAJc2FhX3dyaXRlYihTQUE3MTM0X0FVRElPX0NMT0NLMSwgICAgIChjbG9jayA+PiAgOCkgJiAweGZmKTsKIAlzYWFfd3JpdGViKFNBQTcxMzRfQVVESU9fQ0xPQ0syLCAgICAgKGNsb2NrID4+IDE2KSAmIDB4ZmYpOwotCS8vIGZyYW1lIGxvY2tlZCBhdWRpbyB3YXMgcmVwb3J0ZWQgbm90IHRvIGJlIHJlbGlhYmxlCi0Jc2FhX3dyaXRlYihTQUE3MTM0X0FVRElPX1BMTF9DVFJMLCAgIDB4MDIpOworCS8qIGZyYW1lIGxvY2tlZCBhdWRpbyBpcyBtYW5kYXRvcnkgZm9yIE5JQ0FNICovCisJc2FhX3dyaXRlYihTQUE3MTM0X0FVRElPX1BMTF9DVFJMLCAgIDB4MDEpOwogCiAJc2FhX3dyaXRlYihTQUE3MTM0X05JQ0FNX0VSUk9SX0xPVywgIDB4MTQpOwogCXNhYV93cml0ZWIoU0FBNzEzNF9OSUNBTV9FUlJPUl9ISUdILCAweDUwKTsKQEAgLTgwOSw3ICs4MDksMTIgQEAKIAkJCWRwcmludGsoImRkZXAgb3ZlcnJpZGU6ICVzXG4iLHN0ZHJlc1thdWRpb19kZGVwXSk7CiAJCX0gZWxzZSBpZiAoJmNhcmQoZGV2KS5yYWRpbyA9PSBkZXYtPmlucHV0KSB7CiAJCQlkcHJpbnRrKCJGTSBSYWRpb1xuIik7Ci0JCQlub3JtcyA9ICgweDBmIDw8IDIpIHwgMHgwMTsKKwkJCWlmIChkZXYtPnR1bmVyX3R5cGUgPT0gVFVORVJfUEhJTElQU19UREE4MjkwKSB7CisJCQkJbm9ybXMgPSAoMHgxMSA8PCAyKSB8IDB4MDE7CisJCQkJc2FhX2RzcF93cml0ZWwoZGV2LCAweDQyYyA+PiAyLCAweDcyOTU1NSk7CisJCQl9IGVsc2UgeworCQkJCW5vcm1zID0gKDB4MGYgPDwgMikgfCAweDAxOworCQkJfQogCQl9IGVsc2UgewogCQkJLyogKGxldCBjaGlwKSBzY2FuIGZvciBzb3VuZCBjYXJyaWVyICovCiAJCQlub3JtcyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdmlkZW8uYwppbmRleCA0NWM4NTJkLi5lOTc0MjZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZpZGVvLmMKQEAgLTI5LDYgKzI5LDcgQEAKIAogI2luY2x1ZGUgInNhYTcxMzQtcmVnLmgiCiAjaW5jbHVkZSAic2FhNzEzNC5oIgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAKIC8qIEluY2x1ZGUgVjRMMSBzcGVjaWZpYyBmdW5jdGlvbnMuIFNob3VsZCBiZSByZW1vdmVkIHNvb24gKi8KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgpAQCAtMTI2MywxMCArMTI2NCw5IEBACiAJCXY0bDJfdHlwZV9uYW1lc1t0eXBlXSk7CiAKIAkvKiBhbGxvY2F0ZSArIGluaXRpYWxpemUgcGVyIGZpbGVoYW5kbGUgZGF0YSAqLwotCWZoID0ga21hbGxvYyhzaXplb2YoKmZoKSxHRlBfS0VSTkVMKTsKKwlmaCA9IGt6YWxsb2Moc2l6ZW9mKCpmaCksR0ZQX0tFUk5FTCk7CiAJaWYgKE5VTEwgPT0gZmgpCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbXNldChmaCwwLHNpemVvZigqZmgpKTsKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKIAlmaC0+ZGV2ICAgICAgPSBkZXY7CiAJZmgtPnJhZGlvICAgID0gcmFkaW87CkBAIC0xNjg5LDcgKzE2ODksNyBAQAogCWludCBlcnI7CiAKIAlpZiAodmlkZW9fZGVidWcgPiAxKQotCQlzYWE3MTM0X3ByaW50X2lvY3RsKGRldi0+bmFtZSxjbWQpOworCQl2NGxfcHJpbnRfaW9jdGwoZGV2LT5uYW1lLGNtZCk7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgVklESU9DX1NfQ1RSTDoKQEAgLTIxNDIsNyArMjE0Miw3IEBACiAJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaC0+ZGV2OwogCiAJaWYgKHZpZGVvX2RlYnVnID4gMSkKLQkJc2FhNzEzNF9wcmludF9pb2N0bChkZXYtPm5hbWUsY21kKTsKKwkJdjRsX3ByaW50X2lvY3RsKGRldi0+bmFtZSxjbWQpOwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBWSURJT0NfUVVFUllDQVA6CiAJewpAQCAtMjI2Miw2ICsyMjYyLDcgQEAKIAkucG9sbCAgICAgPSB2aWRlb19wb2xsLAogCS5tbWFwCSAgPSB2aWRlb19tbWFwLAogCS5pb2N0bAkgID0gdmlkZW9faW9jdGwsCisJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKIAkubGxzZWVrICAgPSBub19sbHNlZWssCiB9OwogCkBAIC0yMjcxLDYgKzIyNzIsNyBAQAogCS5vcGVuCSAgPSB2aWRlb19vcGVuLAogCS5yZWxlYXNlICA9IHZpZGVvX3JlbGVhc2UsCiAJLmlvY3RsCSAgPSByYWRpb19pb2N0bCwKKwkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLAogCS5sbHNlZWsgICA9IG5vX2xsc2VlaywKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oCmluZGV4IGFkZDQ5ZGIuLmU3MGVhZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaApAQCAtMzcsNiArMzcsOSBAQAogI2luY2x1ZGUgPG1lZGlhL2lyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL2lyLWtiZC1pMmMuaD4KICNpbmNsdWRlIDxtZWRpYS92aWRlby1idWYuaD4KKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8bWVkaWEvdmlkZW8tYnVmLWR2Yi5oPgogCiAjaWZuZGVmIFRSVUUKQEAgLTQ3LDEwICs1MCw2IEBACiAjZW5kaWYKICNkZWZpbmUgVU5TRVQgKC0xVSkKIAotI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgotI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGVudW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKQEAgLTIwOSw2ICsyMDgsOCBAQAogI2RlZmluZSBTQUE3MTM0X0JPQVJEX0FTVVNURUtfRElHSU1BVFJJWF9UViA4MAogI2RlZmluZSBTQUE3MTM0X0JPQVJEX1BISUxJUFNfVElHRVIgIDgxCiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfTVNJX1RWQVRBTllXSEVSRV9QTFVTICA4MgorI2RlZmluZSBTQUE3MTM0X0JPQVJEX0NJTkVSR1kyNTBQQ0kgODMKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9GTFlEVkJfVFJJTyA4NAogCiAjZGVmaW5lIFNBQTcxMzRfTUFYQk9BUkRTIDgKICNkZWZpbmUgU0FBNzEzNF9JTlBVVF9NQVggOApAQCAtNTQ2LDcgKzU0Nyw2IEBACiAKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkICBzYWE3MTM0X2Rldmxpc3Q7CiAKLXZvaWQgc2FhNzEzNF9wcmludF9pb2N0bChjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgY21kKTsKIHZvaWQgc2FhNzEzNF90cmFja19ncGlvKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBjaGFyICptc2cpOwogCiAjZGVmaW5lIFNBQTcxMzRfUEdUQUJMRV9TSVpFIDQwOTYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE0Ni5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTQ2LmgKaW5kZXggZjMwNWVjOC4uNzU2OTYzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTQ2LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTQ2LmgKQEAgLTczLDcgKzczLDYgQEAKICAgICAgICAgdW5zaWduZWQgaW50IG5yOwogCXVuc2lnbmVkIGxvbmcgaXJxOyAgICAgICAgICAvKiBJUlEgdXNlZCBieSBTQUE3MTQ2IGNhcmQgKi8KIAl1bnNpZ25lZCBzaG9ydCBpZDsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2OwogCXVuc2lnbmVkIGNoYXIgcmV2aXNpb247CiAJdW5zaWduZWQgY2hhciBib2FyZGNmZ1s2NF07CS8qIDY0IGJ5dGVzIG9mIGNvbmZpZyBmcm9tIGVlcHJvbSAqLwogCXVuc2lnbmVkIGxvbmcgc2FhNzE0Nl9hZHI7ICAgLyogYnVzIGFkZHJlc3Mgb2YgSU8gbWVtIGZyb20gUENJIEJJT1MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE4NS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTg1LmMKaW5kZXggZjcyYTlmNy4uM2VkMGVkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTg1LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTg1LmMKQEAgLTQwOCwyMSArNDA4LDE5IEBACiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQogCQlyZXR1cm4gMDsKIAotCWNsaWVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJY2xpZW50ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoY2xpZW50ID09IDApCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbXNldChjbGllbnQsIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOwogCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CiAJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKIAljbGllbnQtPmRyaXZlciA9ICZpMmNfZHJpdmVyX3NhYTcxODU7CiAJc3RybGNweShJMkNfTkFNRShjbGllbnQpLCAic2FhNzE4NSIsIHNpemVvZihJMkNfTkFNRShjbGllbnQpKSk7CiAKLQllbmNvZGVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNhYTcxODUpLCBHRlBfS0VSTkVMKTsKKwllbmNvZGVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNhYTcxODUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZW5jb2RlciA9PSBOVUxMKSB7CiAJCWtmcmVlKGNsaWVudCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQoZW5jb2RlciwgMCwgc2l6ZW9mKHN0cnVjdCBzYWE3MTg1KSk7CiAJZW5jb2Rlci0+bm9ybSA9IFZJREVPX01PREVfTlRTQzsKIAllbmNvZGVyLT5lbmFibGUgPSAxOwogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGVuY29kZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTkxLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxOTEuYwppbmRleCA0MWY2ZjA1Li43NDZjYWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxOTEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxOTEuYwpAQCAtNTcxLDE4ICs1NzEsMTUgQEAKIAlwcmludGsoS0VSTl9JTkZPICJQaGlsaXBzIFNBQTcxOTEgZHJpdmVyIHZlcnNpb24gJXNcbiIsCiAJICAgICAgIFNBQTcxOTFfTU9EVUxFX1ZFUlNJT04pOwogCi0JY2xpZW50ID0ga21hbGxvYyhzaXplb2YoKmNsaWVudCksIEdGUF9LRVJORUwpOworCWNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKCpjbGllbnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNsaWVudCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JZGVjb2RlciA9IGttYWxsb2Moc2l6ZW9mKCpkZWNvZGVyKSwgR0ZQX0tFUk5FTCk7CisJZGVjb2RlciA9IGt6YWxsb2Moc2l6ZW9mKCpkZWNvZGVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZWNvZGVyKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X2ZyZWVfY2xpZW50OwogCX0KIAotCW1lbXNldChjbGllbnQsIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOwotCW1lbXNldChkZWNvZGVyLCAwLCBzaXplb2Yoc3RydWN0IHNhYTcxOTEpKTsKLQogCWNsaWVudC0+YWRkciA9IGFkZHI7CiAJY2xpZW50LT5hZGFwdGVyID0gYWRhcDsKIAljbGllbnQtPmRyaXZlciA9ICZpMmNfZHJpdmVyX3NhYTcxOTE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0cmFkaXMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3RyYWRpcy5jCmluZGV4IGQ0NDk3ZGIuLjU0ZmMzMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3RyYWRpcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3RyYWRpcy5jCkBAIC00OSw5ICs0OSw5IEBACiAjaW5jbHVkZSAic2FhNzEyMS5oIgogI2luY2x1ZGUgImNzODQyMC5oIgogCi0jZGVmaW5lIERFQlVHKHgpIAkJLyogZGVidWcgZHJpdmVyICovCi0jdW5kZWYgIElERUJVRwkgCQkvKiBkZWJ1ZyBpcnEgaGFuZGxlciAqLwotI3VuZGVmICBNREVCVUcJIAkJLyogZGVidWcgbWVtb3J5IG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgREVCVUcoeCkJCS8qIGRlYnVnIGRyaXZlciAqLworI3VuZGVmICBJREVCVUcJCQkvKiBkZWJ1ZyBpcnEgaGFuZGxlciAqLworI3VuZGVmICBNREVCVUcJCQkvKiBkZWJ1ZyBtZW1vcnkgbWFuYWdlbWVudCAqLwogCiAjZGVmaW5lIFNBQTcxNDZfTUFYIDYKIApAQCAtNjMsNyArNjMsNiBAQAogbW9kdWxlX3BhcmFtKHZpZGVvX25yLCBpbnQsIDApOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi0KICNkZWZpbmUgbkRlYk5vcm1hbAkweDAwNDgwMDAwCiAjZGVmaW5lIG5EZWJOb0luYwkweDAwNDgwMDAwCiAjZGVmaW5lIG5EZWJWaWRlbwkweGQwNDgwMDAwCkBAIC05OSw3ICs5OCwxMiBAQAogCiAjaWZkZWYgVVNFX1JFU0NVRV9FRVBST01fU0RNMjc1CiBzdGF0aWMgdW5zaWduZWQgY2hhciByZXNjdWVfZWVwcm9tWzY0XSA9IHsKLTB4MDAsMHgwMSwweDA0LDB4MTMsMHgyNiwweDBmLDB4MTAsMHgwMCwweDAwLDB4MDAsMHg0MywweDYzLDB4MjIsMHgwMSwweDI5LDB4MTUsMHg3MywweDAwLDB4MWYsICdkJywgJ2UnLCAnYycsICd4JywgJ2wnLCAnZCcsICd2JywgJ2EnLDB4MDIsMHgwMCwweDAxLDB4MDAsMHhjYywweGE0LDB4NjMsMHgwOSwweGUyLDB4MTAsMHgwMCwweDBhLDB4MDAsMHgwMiwweDAyLCAnZCcsICdlJywgJ2MnLCAneCcsICdsJywgJ2EnLDB4MDAsMHgwMCwweDQyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgwMCwgMHgwMSwgMHgwNCwgMHgxMywgMHgyNiwgMHgwZiwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MywgMHg2MywKKwkweDIyLCAweDAxLCAweDI5LCAweDE1LCAweDczLCAweDAwLCAweDFmLCAgJ2QnLCAgJ2UnLCAgJ2MnLCAgJ3gnLCAgJ2wnLAorCSAnZCcsICAndicsICAnYScsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4Y2MsIDB4YTQsIDB4NjMsIDB4MDksIDB4ZTIsCisJMHgxMCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMiwgMHgwMiwgICdkJywgICdlJywgICdjJywgICd4JywgICdsJywgICdhJywKKwkweDAwLCAweDAwLCAweDQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiB9OwogI2VuZGlmCiAKQEAgLTE0MCwxNyArMTQ0LDE4IEBACiAKIAlpZiAoc2FhcmVhZChTQUE3MTQ2X0kyQ19TVEFUVVMpICYgMHgzYykKIAkJSTJDV2lwZShzYWEpOwotCWZvciAoaSA9IDA7IGkgPCAxMDAwICYmCi0JICAgICAoc2FhcmVhZChTQUE3MTQ2X0kyQ19TVEFUVVMpICYgU0FBNzE0Nl9JMkNfQlVTWSk7IGkrKykKKwlmb3IgKGkgPSAwOworCQlpIDwgMTAwMCAmJiAoc2FhcmVhZChTQUE3MTQ2X0kyQ19TVEFUVVMpICYgU0FBNzE0Nl9JMkNfQlVTWSk7CisJCWkrKykKIAkJc2NoZWR1bGUoKTsKIAlpZiAoaSA9PSAxMDAwKQogCQlJMkNXaXBlKHNhYSk7CiAJaWYgKGRvc3ViKQogCQlzYWF3cml0ZSgoKGFkZHIgJiAweGZlKSA8PCAyNCkgfCAoKChhZGRyIHwgMSkgJiAweGZmKSA8PCA4KSB8Ci0JCSAgKChzdWJhZGRyICYgMHhmZikgPDwgMTYpIHwgMHhlZCwgU0FBNzE0Nl9JMkNfVFJBTlNGRVIpOworCQkJKChzdWJhZGRyICYgMHhmZikgPDwgMTYpIHwgMHhlZCwgU0FBNzE0Nl9JMkNfVFJBTlNGRVIpOwogCWVsc2UKIAkJc2Fhd3JpdGUoKChhZGRyICYgMHhmZSkgPDwgMjQpIHwgKCgoYWRkciB8IDEpICYgMHhmZikgPDwgMTYpIHwKLQkJCSAweGYxLCBTQUE3MTQ2X0kyQ19UUkFOU0ZFUik7CisJCQkweGYxLCBTQUE3MTQ2X0kyQ19UUkFOU0ZFUik7CiAJc2Fhd3JpdGUoKFNBQTcxNDZfTUMyX1VQTERfSTJDIDw8IDE2KSB8CiAJCSBTQUE3MTQ2X01DMl9VUExEX0kyQywgU0FBNzE0Nl9NQzIpOwogCS8qIHdhaXQgZm9yIGkyYyByZWdpc3RlcnMgdG8gYmUgcHJvZ3JhbW1lZCAqLwpAQCAtMTYzLDcgKzE2OCw3IEBACiAJCXNjaGVkdWxlKCk7CiAJaWYgKHNhYXJlYWQoU0FBNzE0Nl9JMkNfU1RBVFVTKSAmIFNBQTcxNDZfSTJDX0VSUikKIAkJcmV0dXJuIC0xOwotCWlmIChpID09IDEwMDApIAorCWlmIChpID09IDEwMDApCiAJCXByaW50aygiaTJjIHNldHVwIHJlYWQgdGltZW91dFxuIik7CiAJc2Fhd3JpdGUoMHg0MSwgU0FBNzE0Nl9JMkNfVFJBTlNGRVIpOwogCXNhYXdyaXRlKChTQUE3MTQ2X01DMl9VUExEX0kyQyA8PCAxNikgfApAQCAtMTc4LDcgKzE4Myw3IEBACiAJCXNjaGVkdWxlKCk7CiAJaWYgKHNhYXJlYWQoU0FBNzE0Nl9JMkNfVFJBTlNGRVIpICYgU0FBNzE0Nl9JMkNfRVJSKQogCQlyZXR1cm4gLTE7Ci0JaWYgKGkgPT0gMTAwMCkgCisJaWYgKGkgPT0gMTAwMCkKIAkJcHJpbnRrKCJpMmMgcmVhZCB0aW1lb3V0XG4iKTsKIAlyZXR1cm4gKChzYWFyZWFkKFNBQTcxNDZfSTJDX1RSQU5TRkVSKSA+PiAyNCkgJiAweGZmKTsKIH0KQEAgLTIxMywyMCArMjE4LDIyIEBACiB7CiAJaW50IGk7CiAKLQlERUJVRyhwcmludGsoS0VSTl9ERUJVRyAic3RyYWRpcyVkOiBpMmM6IGRldmljZSBmb3VuZD0lMDJ4XG4iLCBzYWEtPm5yLCBpZCkpOwotCWlmIChpZCA9PSAweGEwKQl7IC8qIHdlIGhhdmUgcmV2MiBvciBsYXRlciBib2FyZCwgZmlsbCBpbiBpbmZvICovCisJREVCVUcocHJpbnRrKEtFUk5fREVCVUcgInN0cmFkaXMlZDogaTJjOiBkZXZpY2UgZm91bmQ9JTAyeFxuIiwgc2FhLT5uciwKKwkJaWQpKTsKKwlpZiAoaWQgPT0gMHhhMCkgewkvKiB3ZSBoYXZlIHJldjIgb3IgbGF0ZXIgYm9hcmQsIGZpbGwgaW4gaW5mbyAqLwogCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKIAkJCXNhYS0+Ym9hcmRjZmdbaV0gPSBJMkNSZWFkKHNhYSwgMHhhMCwgaSwgMSk7CiAjaWZkZWYgVVNFX1JFU0NVRV9FRVBST01fU0RNMjc1CiAJCWlmIChzYWEtPmJvYXJkY2ZnWzBdICE9IDApIHsKLQkJCXByaW50aygic3RyYWRpcyVkOiBXQVJOSU5HOiBFRVBST00gU1RPUkVEIFZBTFVFUyBIQVZFIEJFRU4gSUdOT1JFRFxuIiwgc2FhLT5ucik7CisJCQlwcmludGsoInN0cmFkaXMlZDogV0FSTklORzogRUVQUk9NIFNUT1JFRCBWQUxVRVMgSEFWRSAiCisJCQkJIkJFRU4gSUdOT1JFRFxuIiwgc2FhLT5ucik7CiAJCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKIAkJCQlzYWEtPmJvYXJkY2ZnW2ldID0gcmVzY3VlX2VlcHJvbVtpXTsKIAkJfQogI2VuZGlmCiAJCXByaW50aygic3RyYWRpcyVkOiBjb25maWcgPSIsIHNhYS0+bnIpOwogCQlmb3IgKGkgPSAwOyBpIDwgNTE7IGkrKykgewotCQkJcHJpbnRrKCIgJTAyeCIsc2FhLT5ib2FyZGNmZ1tpXSk7CisJCQlwcmludGsoIiAlMDJ4Iiwgc2FhLT5ib2FyZGNmZ1tpXSk7CiAJCX0KIAkJcHJpbnRrKCJcbiIpOwogCX0KQEAgLTI1NCwxNyArMjYxLDE5IEBACiAJZm9yIChpID0gMDsgaSA8IDUwMDAwMCAmJgogCSAgICAgKHNhYXJlYWQoU0FBNzE0Nl9QU1IpICYgU0FBNzE0Nl9QU1JfREVCSV9TKTsgaSsrKQogCQlzYWFyZWFkKFNBQTcxNDZfTUMyKTsKKwogCWlmIChpID4gZGViaXdhaXRfbWF4d2FpdCkKIAkJcHJpbnRrKCJ3YWl0LWZvci1kZWJpLWRvbmUgbWF4d2FpdDogJWRcbiIsCiAJCQlkZWJpd2FpdF9tYXh3YWl0ID0gaSk7Ci0JCisKIAlpZiAoaSA9PSA1MDAwMDApCiAJCXJldHVybiAtMTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGRlYml3cml0ZShzdHJ1Y3Qgc2FhNzE0NiAqc2FhLCB1MzIgY29uZmlnLCBpbnQgYWRkciwKLQkJICAgICAgdTMyIHZhbCwgaW50IGNvdW50KQorCXUzMiB2YWwsIGludCBjb3VudCkKIHsKIAl1MzIgY21kOwogCWlmIChjb3VudCA8PSAwIHx8IGNvdW50ID4gMzI3NjQpCkBAIC0zMDksNDEgKzMxOCw2IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotI2lmIDAgLyogdW51c2VkICovCi0vKiBNVVNUIGJlIGEgbXVsdGlwbGUgb2YgOCBieXRlcyBhbmQgOC1ieXRlIGFsaWduZWQgYW5kIDwgMzI3NjggYnl0ZXMgKi8KLS8qIGRhdGEgY29waWVkIGludG8gc2FhLT5kbWFkZWJpIGJ1ZmZlciwgY2FsbGVyIG11c3QgcmUtZW5hYmxlIGludGVycnVwdHMgKi8KLXN0YXRpYyB2b2lkIGlibV9ibG9ja19kcmFtX3JlYWQoc3RydWN0IHNhYTcxNDYgKnNhYSwgaW50IGFkZHJlc3MsIGludCBieXRlcykKLXsKLQlpbnQgaSwgajsKLQl1MzIgKmJ1ZjsKLQlidWYgPSAodTMyICopIHNhYS0+ZG1hZGViaTsKLQlpZiAoYnl0ZXMgPiAweDcwMDApCi0JCWJ5dGVzID0gMHg3MDAwOwotCXNhYXdyaXRlKDAsIFNBQTcxNDZfSUVSKTsJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0JZm9yIChpPTA7IGkgPCAxMDAwMCAmJgotCQkoZGViaXJlYWQoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfRFJBTV9DTURfU1RBVCwgMikKLQkJJiAweDgwMDApOyBpKyspCi0JCXNhYXJlYWQoU0FBNzE0Nl9NQzIpOwotCWlmIChpID09IDEwMDAwKQotCQlwcmludGsoS0VSTl9FUlIgInN0cmFkaXMlZDogZHJhbV9idXN5IG5ldmVyIGNsZWFyZWRcbiIsCi0JCQlzYWEtPm5yKTsKLQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfU1JDX0FERFIsIChhZGRyZXNzPDwxNikgfAotCQkoYWRkcmVzcz4+MTYpLCA0KTsKLQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfQkxPQ0tfU0laRSwgYnl0ZXMsIDIpOwotCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9DTURfU1RBVCwgMHg4YTEwLCAyKTsKLQlmb3IgKGogPSAwOyBqIDwgYnl0ZXMvNDsgaisrKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCAxMDAwMCAmJgotCQkJKCEoZGViaXJlYWQoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfRFJBTV9DTURfU1RBVCwgMikKLQkJCSYgMHg0MDAwKSk7IGkrKykKLQkJCXNhYXJlYWQoU0FBNzE0Nl9NQzIpOwotCQlpZiAoaSA9PSAxMDAwMCkKLQkJCXByaW50ayhLRVJOX0VSUiAic3RyYWRpcyVkOiBkcmFtX3JlYWR5IG5ldmVyIHNldFxuIiwKLQkJCQlzYWEtPm5yKTsKLQkJYnVmW2pdID0gZGViaXJlYWQoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfRFJBTV9EQVRBLCA0KTsKLQl9Ci19Ci0jZW5kaWYgLyogdW51c2VkICovCi0KIHN0YXRpYyB2b2lkIGRvX2lycV9zZW5kX2RhdGEoc3RydWN0IHNhYTcxNDYgKnNhYSkKIHsKIAlpbnQgc3BsaXQsIGF1ZGJ5dGVzLCB2aWRieXRlczsKQEAgLTM2NSwxNiArMzM5LDE1IEBACiAJCXJldHVybjsKIAl9CiAJLyogaWYgYXQgbGVhc3QgMSBibG9jayBhdWRpbyB3YWl0aW5nIGFuZCBhdWRpbyBmaWZvIGlzbid0IGZ1bGwgKi8KLQlpZiAoYXVkYnl0ZXMgPj0gMjA0OCAmJiAoZGViaXJlYWQoc2FhLCBkZWJOb3JtYWwsCi0JCUlCTV9NUDJfQVVEX0ZJRk8sIDIpICYgMHhmZikgPCA2MCkgeworCWlmIChhdWRieXRlcyA+PSAyMDQ4ICYmIChkZWJpcmVhZChzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9BVURfRklGTywgMikKKwkJCSYgMHhmZikgPCA2MCkgewogCQlpZiAoc2FhLT5hdWRoZWFkID4gc2FhLT5hdWR0YWlsKQogCQkJc3BsaXQgPSA2NTUzNiAtIHNhYS0+YXVkaGVhZDsKIAkJZWxzZQogCQkJc3BsaXQgPSAwOwogCQlhdWRieXRlcyA9IDIwNDg7CiAJCWlmIChzcGxpdCA+IDAgJiYgc3BsaXQgPCAyMDQ4KSB7Ci0JCQltZW1jcHkoc2FhLT5kbWFkZWJpLCBzYWEtPmF1ZGJ1ZiArIHNhYS0+YXVkaGVhZCwKLQkJCQlzcGxpdCk7CisJCQltZW1jcHkoc2FhLT5kbWFkZWJpLCBzYWEtPmF1ZGJ1ZiArIHNhYS0+YXVkaGVhZCwgc3BsaXQpOwogCQkJc2FhLT5hdWRoZWFkID0gMDsKIAkJCWF1ZGJ5dGVzIC09IHNwbGl0OwogCQl9IGVsc2UKQEAgLTM4MywyMCArMzU2LDE5IEBACiAJCQlhdWRieXRlcyk7CiAJCXNhYS0+YXVkaGVhZCArPSBhdWRieXRlczsKIAkJc2FhLT5hdWRoZWFkICY9IDB4ZmZmZjsKLQkJZGViaXdyaXRlKHNhYSwgZGViQXVkaW8sIChOZXdDYXJkPyBJQk1fTVAyX0FVRF9GSUZPIDoKLQkJCSAgSUJNX01QMl9BVURfRklGT1cpLCAwLCAyMDQ4KTsKKwkJZGViaXdyaXRlKHNhYSwgZGViQXVkaW8sIChOZXdDYXJkID8gSUJNX01QMl9BVURfRklGTyA6CisJCQlJQk1fTVAyX0FVRF9GSUZPVyksIDAsIDIwNDgpOwogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNhYS0+YXVkcSk7Ci0JLyogaWYgYXQgbGVhc3QgMSBibG9jayB2aWRlbyB3YWl0aW5nIGFuZCB2aWRlbyBmaWZvIGlzbid0IGZ1bGwgKi8KKwkJLyogaWYgYXQgbGVhc3QgMSBibG9jayB2aWRlbyB3YWl0aW5nIGFuZCB2aWRlbyBmaWZvIGlzbid0IGZ1bGwgKi8KIAl9IGVsc2UgaWYgKHZpZGJ5dGVzID49IDMwNzIwICYmIChkZWJpcmVhZChzYWEsIGRlYk5vcm1hbCwKLQkJSUJNX01QMl9GSUZPLCAyKSkgPCAxNjM4NCkgeworCQkJCQkJICBJQk1fTVAyX0ZJRk8sIDIpKSA8IDE2Mzg0KSB7CiAJCWlmIChzYWEtPnZpZGhlYWQgPiBzYWEtPnZpZHRhaWwpCiAJCQlzcGxpdCA9IDUyNDI4OCAtIHNhYS0+dmlkaGVhZDsKIAkJZWxzZQogCQkJc3BsaXQgPSAwOwogCQl2aWRieXRlcyA9IDMwNzIwOwogCQlpZiAoc3BsaXQgPiAwICYmIHNwbGl0IDwgMzA3MjApIHsKLQkJCW1lbWNweShzYWEtPmRtYWRlYmksIHNhYS0+dmlkYnVmICsgc2FhLT52aWRoZWFkLAotCQkJCXNwbGl0KTsKKwkJCW1lbWNweShzYWEtPmRtYWRlYmksIHNhYS0+dmlkYnVmICsgc2FhLT52aWRoZWFkLCBzcGxpdCk7CiAJCQlzYWEtPnZpZGhlYWQgPSAwOwogCQkJdmlkYnl0ZXMgLT0gc3BsaXQ7CiAJCX0gZWxzZQpAQCAtNDA2LDcgKzM3OCw3IEBACiAJCXNhYS0+dmlkaGVhZCArPSB2aWRieXRlczsKIAkJc2FhLT52aWRoZWFkICY9IDB4N2ZmZmY7CiAJCWRlYml3cml0ZShzYWEsIGRlYlZpZGVvLCAoTmV3Q2FyZCA/IElCTV9NUDJfRklGTyA6Ci0JCQkgIElCTV9NUDJfRklGT1cpLCAwLCAzMDcyMCk7CisJCQkJCSAgSUJNX01QMl9GSUZPVyksIDAsIDMwNzIwKTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzYWEtPnZpZHEpOwogCX0KIAlzYWF3cml0ZShTQUE3MTQ2X1BTUl9ERUJJX1MgfCBTQUE3MTQ2X1BTUl9QSU4xLCBTQUE3MTQ2X0lFUik7CkBAIC00MTgsMTAgKzM5MCwxMCBAQAogCWlmIChzaXplID4gMzA3MjApCiAJCXNpemUgPSAzMDcyMDsKIAkvKiBlbnN1cmUgc29tZSBtdWx0aXBsZSBvZiA4IGJ5dGVzIGlzIHRyYW5zZmVycmVkICovCi0Jc2l6ZSA9IDggKiAoKHNpemUgKyA4KT4+Myk7CisJc2l6ZSA9IDggKiAoKHNpemUgKyA4KSA+PiAzKTsKIAlpZiAoc2l6ZSkgewogCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfT1NEX0FERFIsCi0JCQkgIChzYWEtPm9zZGhlYWQ+PjMpLCAyKTsKKwkJCSAgKHNhYS0+b3NkaGVhZCA+PiAzKSwgMik7CiAJCW1lbWNweShzYWEtPmRtYWRlYmksICZzYWEtPm9zZGJ1ZltzYWEtPm9zZGhlYWRdLCBzaXplKTsKIAkJc2FhLT5vc2RoZWFkICs9IHNpemU7CiAJCS8qIGJsb2NrIHRyYW5zZmVyIG9mIG5leHQgOCBieXRlcyB0byB+MzJrIGJ5dGVzICovCkBAIC00MzUsNyArNDA3LDcgQEAKIAogc3RhdGljIGlycXJldHVybl90IHNhYTcxNDZfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IHNhYTcxNDYgKnNhYSA9IChzdHJ1Y3Qgc2FhNzE0NiAqKSBkZXZfaWQ7CisJc3RydWN0IHNhYTcxNDYgKnNhYSA9IGRldl9pZDsKIAl1MzIgc3RhdCwgYXN0YXQ7CiAJaW50IGNvdW50OwogCWludCBoYW5kbGVkID0gMDsKQEAgLTQ4NCw3ICs0NTYsNyBAQAogCQkJCXNhYS0+dmlkaW5mby52X3NpemUgPSA0ODA7CiAjaWYgMAogCQkJCWlmIChzYWEtPmVuZG1hcmtoZWFkICE9IHNhYS0+ZW5kbWFya3RhaWwpIHsKLQkJCQkJc2FhLT5hdWRoZWFkID0gCisJCQkJCXNhYS0+YXVkaGVhZCA9CiAJCQkJCQlzYWEtPmVuZG1hcmtbc2FhLT5lbmRtYXJraGVhZF07CiAJCQkJCXNhYS0+ZW5kbWFya2hlYWQrKzsKIAkJCQkJaWYgKHNhYS0+ZW5kbWFya2hlYWQgPj0gTUFYX01BUktTKQpAQCAtNDk0LDcgKzQ2Niw3IEBACiAJCQl9CiAJCQlpZiAoaXN0YXQgJiAweDQwMDApIHsJLyogU2VxdWVuY2UgRXJyb3IgQ29kZSAqLwogCQkJCWlmIChzYWEtPmVuZG1hcmtoZWFkICE9IHNhYS0+ZW5kbWFya3RhaWwpIHsKLQkJCQkJc2FhLT5hdWRoZWFkID0gCisJCQkJCXNhYS0+YXVkaGVhZCA9CiAJCQkJCQlzYWEtPmVuZG1hcmtbc2FhLT5lbmRtYXJraGVhZF07CiAJCQkJCXNhYS0+ZW5kbWFya2hlYWQrKzsKIAkJCQkJaWYgKHNhYS0+ZW5kbWFya2hlYWQgPj0gTUFYX01BUktTKQpAQCAtNjEzLDcgKzU4NSw3IEBACiAJaW50IGk7CiAKIAlpZiAoY2hhaW4pCi0JCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9DT01NQU5ELCAoY29tbWFuZCA8PCAxKSB8IDEsIDIpOworCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfQ09NTUFORCwgKGNvbW1hbmQgPDwgMSl8IDEsMik7CiAJZWxzZQogCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfQ09NTUFORCwgY29tbWFuZCA8PCAxLCAyKTsKIAlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfQ01EX0RBVEEsIGRhdGEsIDIpOwpAQCAtNjYzLDExICs2MzUsOSBAQAogCWVsc2UKIAkJc2VxdWVuY2UgPSBtb2RlODQyMGNvbjsKIAlmb3IgKGkgPSAwOyBpIDwgSU5JVDg0MjBMRU47IGkrKykKLQkJSTJDV3JpdGUoc2FhLCAweDIwLCBpbml0ODQyMFtpICogMl0sCi0JCQkgaW5pdDg0MjBbaSAqIDIgKyAxXSwgMik7CisJCUkyQ1dyaXRlKHNhYSwgMHgyMCwgaW5pdDg0MjBbaSAqIDJdLCBpbml0ODQyMFtpICogMiArIDFdLCAyKTsKIAlmb3IgKGkgPSAwOyBpIDwgTU9ERTg0MjBMRU47IGkrKykKLQkJSTJDV3JpdGUoc2FhLCAweDIwLCBzZXF1ZW5jZVtpICogMl0sCi0JCQkgc2VxdWVuY2VbaSAqIDIgKyAxXSwgMik7CisJCUkyQ1dyaXRlKHNhYSwgMHgyMCwgc2VxdWVuY2VbaSAqIDJdLCBzZXF1ZW5jZVtpICogMiArIDFdLCAyKTsKIAlwcmludGsoInN0cmFkaXMlZDogQ1M4NDIwIGluaXRpYWxpemVkXG4iLCBzYWEtPm5yKTsKIH0KIApAQCAtNjgzLDM1ICs2NTMsMzYgQEAKIAkvKiBpbml0aWFsaXplIFBBTC9OVFNDIHZpZGVvIGVuY29kZXIgKi8KIAlmb3IgKGkgPSAwOyBpIDwgSU5JVDcxMjFMRU47IGkrKykgewogCQlpZiAoTmV3Q2FyZCkgewkvKiBoYW5kbGUgbmV3IGNhcmQgZW5jb2RlciBkaWZmZXJlbmNlcyAqLwotCQkJaWYgKHNlcXVlbmNlW2kqMl0gPT0gMHgzYSkKKwkJCWlmIChzZXF1ZW5jZVtpICogMl0gPT0gMHgzYSkKIAkJCQlJMkNXcml0ZShzYWEsIDB4ODgsIDB4M2EsIDB4MTMsIDIpOwotCQkJZWxzZSBpZiAoc2VxdWVuY2VbaSoyXSA9PSAweDZiKQorCQkJZWxzZSBpZiAoc2VxdWVuY2VbaSAqIDJdID09IDB4NmIpCiAJCQkJSTJDV3JpdGUoc2FhLCAweDg4LCAweDZiLCAweDIwLCAyKTsKLQkJCWVsc2UgaWYgKHNlcXVlbmNlW2kqMl0gPT0gMHg2YykKKwkJCWVsc2UgaWYgKHNlcXVlbmNlW2kgKiAyXSA9PSAweDZjKQogCQkJCUkyQ1dyaXRlKHNhYSwgMHg4OCwgMHg2YywKIAkJCQkJIGRvcGFsID8gMHgwOSA6IDB4ZjUsIDIpOwotCQkJZWxzZSBpZiAoc2VxdWVuY2VbaSoyXSA9PSAweDZkKQorCQkJZWxzZSBpZiAoc2VxdWVuY2VbaSAqIDJdID09IDB4NmQpCiAJCQkJSTJDV3JpdGUoc2FhLCAweDg4LCAweDZkLAogCQkJCQkgZG9wYWwgPyAweDIwIDogMHgwMCwgMik7Ci0JCQllbHNlIGlmIChzZXF1ZW5jZVtpKjJdID09IDB4N2EpCisJCQllbHNlIGlmIChzZXF1ZW5jZVtpICogMl0gPT0gMHg3YSkKIAkJCQlJMkNXcml0ZShzYWEsIDB4ODgsIDB4N2EsCiAJCQkJCSBkb3BhbCA/IChQQUxGaXJzdEFjdGl2ZSAtIDEpIDoKIAkJCQkJIChOVFNDRmlyc3RBY3RpdmUgLSA0KSwgMik7Ci0JCQllbHNlIGlmIChzZXF1ZW5jZVtpKjJdID09IDB4N2IpCisJCQllbHNlIGlmIChzZXF1ZW5jZVtpICogMl0gPT0gMHg3YikKIAkJCQlJMkNXcml0ZShzYWEsIDB4ODgsIDB4N2IsCiAJCQkJCSBkb3BhbCA/IFBBTExhc3RBY3RpdmUgOgogCQkJCQkgTlRTQ0xhc3RBY3RpdmUsIDIpOwotCQkJZWxzZSBJMkNXcml0ZShzYWEsIDB4ODgsIHNlcXVlbmNlW2kgKiAyXSwKLQkJCQkgc2VxdWVuY2VbaSAqIDIgKyAxXSwgMik7CisJCQllbHNlCisJCQkJSTJDV3JpdGUoc2FhLCAweDg4LCBzZXF1ZW5jZVtpICogMl0sCisJCQkJCSBzZXF1ZW5jZVtpICogMiArIDFdLCAyKTsKIAkJfSBlbHNlIHsKLQkJCWlmIChzZXF1ZW5jZVtpKjJdID09IDB4NmIgJiYgbW9kKQotCQkJCUkyQ1dyaXRlKHNhYSwgMHg4OCwgMHg2YiwgCi0JCQkJCShzZXF1ZW5jZVtpICogMiArIDFdIF4gMHgwOSksIDIpOwotCQkJZWxzZSBpZiAoc2VxdWVuY2VbaSoyXSA9PSAweDdhKQorCQkJaWYgKHNlcXVlbmNlW2kgKiAyXSA9PSAweDZiICYmIG1vZCkKKwkJCQlJMkNXcml0ZShzYWEsIDB4ODgsIDB4NmIsCisJCQkJCSAoc2VxdWVuY2VbaSAqIDIgKyAxXSBeIDB4MDkpLCAyKTsKKwkJCWVsc2UgaWYgKHNlcXVlbmNlW2kgKiAyXSA9PSAweDdhKQogCQkJCUkyQ1dyaXRlKHNhYSwgMHg4OCwgMHg3YSwKIAkJCQkJIGRvcGFsID8gKFBBTEZpcnN0QWN0aXZlIC0gMSkgOgogCQkJCQkgKE5UU0NGaXJzdEFjdGl2ZSAtIDQpLCAyKTsKLQkJCWVsc2UgaWYgKHNlcXVlbmNlW2kqMl0gPT0gMHg3YikKKwkJCWVsc2UgaWYgKHNlcXVlbmNlW2kgKiAyXSA9PSAweDdiKQogCQkJCUkyQ1dyaXRlKHNhYSwgMHg4OCwgMHg3YiwKIAkJCQkJIGRvcGFsID8gUEFMTGFzdEFjdGl2ZSA6CiAJCQkJCSBOVFNDTGFzdEFjdGl2ZSwgMik7CkBAIC03MzUsNyArNzA2LDggQEAKIAluQ29kZSA9IG5vZmZzZXQgKyAweDEwMDsKIAlpZiAobkNvZGUgPT0gMSkKIAkJbkNvZGUgPSAweDQwMTsKLQllbHNlIGlmIChuQ29kZSA8IDEpIG5Db2RlID0gMHg0MDAgKyBQaXhlbHNQZXJMaW5lICsgbkNvZGU7CisJZWxzZSBpZiAobkNvZGUgPCAxKQorCQluQ29kZSA9IDB4NDAwICsgUGl4ZWxzUGVyTGluZSArIG5Db2RlOwogCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgWElMSU5YX0dMREVMQVksIG5Db2RlLCAyKTsKIH0KIApAQCAtNzQ1LDMzICs3MTcsMzEgQEAKIAlzYWEtPmJvYXJkY2ZnWzJdID0gbW9kZTsKIAkvKiBkbyBub3QgYWRqdXN0IGFuYWxvZyB2aWRlbyBwYXJhbWV0ZXJzIGhlcmUsIHVzZSBzYWE3MTIxIGluaXQgKi8KIAkvKiB5b3Ugd2lsbCBhZmZlY3QgdGhlIFNESSBvdXRwdXQgb24gdGhlIG5ldyBjYXJkICovCi0JaWYgKG1vZGUgPT0gVklERU9fTU9ERV9QQUwpIHsJCS8qIFBBTCAqLworCWlmIChtb2RlID09IFZJREVPX01PREVfUEFMKSB7CS8qIFBBTCAqLwogCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIFhJTElOWF9DVEwwLCAweDA4MDgsIDIpOwogCQltZGVsYXkoNTApOwogCQlzYWF3cml0ZSgweDAxMjAwMmMwLCBTQUE3MTQ2X05VTV9MSU5FX0JZVEUxKTsKIAkJaWYgKE5ld0NhcmQpIHsKLQkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9ESVNQX01PREUsCi0JCQkJICAweGUxMDAsIDIpOworCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX0RJU1BfTU9ERSwgMHhlMTAwLCAyKTsKIAkJCW1kZWxheSg1MCk7CiAJCX0KIAkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX0RJU1BfTU9ERSwKLQkJCSAgTmV3Q2FyZCA/IDB4ZTUwMDogMHg2NTAwLCAyKTsKKwkJCSAgTmV3Q2FyZCA/IDB4ZTUwMCA6IDB4NjUwMCwgMik7CiAJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9ESVNQX0RMWSwKIAkJCSAgKDEgPDwgOCkgfAotCQkJICAoTmV3Q2FyZCA/IFBBTEZpcnN0QWN0aXZlIDogUEFMRmlyc3RBY3RpdmUtNiksIDIpOworCQkJICAoTmV3Q2FyZCA/IFBBTEZpcnN0QWN0aXZlIDogUEFMRmlyc3RBY3RpdmUgLSA2KSwgMik7CiAJfSBlbHNlIHsJCS8qIE5UU0MgKi8KIAkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBYSUxJTlhfQ1RMMCwgMHgwODAwLCAyKTsKIAkJbWRlbGF5KDUwKTsKIAkJc2Fhd3JpdGUoMHgwMGYwMDJjMCwgU0FBNzE0Nl9OVU1fTElORV9CWVRFMSk7CiAJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9ESVNQX01PREUsCi0JCQkgIE5ld0NhcmQgPyAweGUxMDA6IDB4NjEwMCwgMik7CisJCQkgIE5ld0NhcmQgPyAweGUxMDAgOiAweDYxMDAsIDIpOwogCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfRElTUF9ETFksCiAJCQkgICgxIDw8IDgpIHwKLQkJCSAgKE5ld0NhcmQgPyBOVFNDRmlyc3RBY3RpdmUgOiBOVFNDRmlyc3RBY3RpdmUtNiksIDIpOworCQkJICAoTmV3Q2FyZCA/IE5UU0NGaXJzdEFjdGl2ZSA6IE5UU0NGaXJzdEFjdGl2ZSAtIDYpLCAyKTsKIAl9CiB9CiAKLQogLyogSW50aWFsaXplIGJpdG1hbmdsZXIgdG8gbWFwIGZyb20gYSBieXRlIHZhbHVlIHRvIHRoZSBtYW5nbGVkIHdvcmQgdGhhdAogICogbXVzdCBiZSBvdXRwdXQgdG8gcHJvZ3JhbSB0aGUgWGlsaW54IHBhcnQgdGhyb3VnaCB0aGUgREVCSSBwb3J0LgogICogWGlsaW54IERhdGEgQml0LT5ERUJJIEJpdDogMC0+MTUgMS0+NyAyLT42IDMtPjEyIDQtPjExIDUtPjIgNi0+MSA3LT4wCkBAIC03OTksNDMgKzc2OSw0MSBAQAogCWZvciAobnVtID0gMDsgbnVtIDwgc2FhX251bTsgbnVtKyspIHsKIAkJc2FhID0gJnNhYTcxNDZzW251bV07CiAJCWlmIChzYWEtPmJvYXJkY2ZnWzBdID4gMjApCi0JCQkJY29udGludWU7CS8qIGNhcmQgd2FzIHByb2dyYW1tZWQgKi8KKwkJCWNvbnRpbnVlOwkvKiBjYXJkIHdhcyBwcm9ncmFtbWVkICovCiAJCWxvYWR0d28gPSAoc2FhLT5ib2FyZGNmZ1sxOF0gJiAweDEwKTsKIAkJaWYgKCFOZXdDYXJkKQkvKiB3ZSBoYXZlIGFuIG9sZCBib2FyZCAqLwogCQkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotCQkJICAgIGJpdG1hbmdsZXJbaV0gPSAoKGkgJiAweDAxKSA8PCAxNSkgfAotCQkJCSgoaSAmIDB4MDIpIDw8IDYpIHwgKChpICYgMHgwNCkgPDwgNCkgfAotCQkJCSgoaSAmIDB4MDgpIDw8IDkpIHwgKChpICYgMHgxMCkgPDwgNykgfAotCQkJCSgoaSAmIDB4MjApID4+IDMpIHwgKChpICYgMHg0MCkgPj4gNSkgfAotCQkJCSgoaSAmIDB4ODApID4+IDcpOwotCQllbHNlCS8qIGVsc2Ugd2UgaGF2ZSBhIG5ldyBib2FyZCAqLworCQkJCWJpdG1hbmdsZXJbaV0gPSAoKGkgJiAweDAxKSA8PCAxNSkgfAorCQkJCQkoKGkgJiAweDAyKSA8PCA2KSB8ICgoaSAmIDB4MDQpIDw8IDQpIHwKKwkJCQkJKChpICYgMHgwOCkgPDwgOSkgfCAoKGkgJiAweDEwKSA8PCA3KSB8CisJCQkJCSgoaSAmIDB4MjApID4+IDMpIHwgKChpICYgMHg0MCkgPj4gNSkgfAorCQkJCQkoKGkgJiAweDgwKSA+PiA3KTsKKwkJZWxzZQkJLyogZWxzZSB3ZSBoYXZlIGEgbmV3IGJvYXJkICovCiAJCQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0JCQkgICAgYml0bWFuZ2xlcltpXSA9ICgoaSAmIDB4MDEpIDw8IDcpIHwKLQkJCQkoKGkgJiAweDAyKSA8PCA1KSB8ICgoaSAmIDB4MDQpIDw8IDMpIHwKLQkJCQkoKGkgJiAweDA4KSA8PCAxKSB8ICgoaSAmIDB4MTApID4+IDEpIHwKLQkJCQkoKGkgJiAweDIwKSA+PiAzKSB8ICgoaSAmIDB4NDApID4+IDUpIHwKLQkJCQkoKGkgJiAweDgwKSA+PiA3KTsKKwkJCQliaXRtYW5nbGVyW2ldID0gKChpICYgMHgwMSkgPDwgNykgfAorCQkJCQkoKGkgJiAweDAyKSA8PCA1KSB8ICgoaSAmIDB4MDQpIDw8IDMpIHwKKwkJCQkJKChpICYgMHgwOCkgPDwgMSkgfCAoKGkgJiAweDEwKSA+PiAxKSB8CisJCQkJCSgoaSAmIDB4MjApID4+IDMpIHwgKChpICYgMHg0MCkgPj4gNSkgfAorCQkJCQkoKGkgJiAweDgwKSA+PiA3KTsKIAogCQlkbWFidWYgPSAodTE2ICopIHNhYS0+ZG1hZGViaTsKIAkJbmV3ZG1hID0gKHU4ICopIHNhYS0+ZG1hZGViaTsKIAkJaWYgKE5ld0NhcmQpIHsJLyogU0RNMnh4eCAqLwogCQkJaWYgKCFzdHJuY21wKGJpdGRhdGEtPmxvYWR3aGF0LCAiZGVjb2RlcjIiLCA4KSkKIAkJCQljb250aW51ZTsJLyogZnBnYSBub3QgZm9yIHRoaXMgY2FyZCAqLwotCQkJaWYgKCFzdHJuY21wKCZzYWEtPmJvYXJkY2ZnWzQyXSwKLQkJCQkgICAgIGJpdGRhdGEtPmxvYWR3aGF0LCA4KSkgeworCQkJaWYgKCFzdHJuY21wKCZzYWEtPmJvYXJkY2ZnWzQyXSwgYml0ZGF0YS0+bG9hZHdoYXQsIDgpKQogCQkJCWxvYWRmaWxlID0gMTsKLQkJCX0gZWxzZSBpZiAobG9hZHR3byAmJiAhc3RybmNtcCgmc2FhLT5ib2FyZGNmZ1sxOV0sCi0JCQkJICAgYml0ZGF0YS0+bG9hZHdoYXQsIDgpKSB7CisJCQllbHNlIGlmIChsb2FkdHdvICYmICFzdHJuY21wKCZzYWEtPmJvYXJkY2ZnWzE5XSwKKwkJCQkgICAgICAgYml0ZGF0YS0+bG9hZHdoYXQsIDgpKQogCQkJCWxvYWRmaWxlID0gMjsKLQkJCX0gZWxzZSBpZiAoIXNhYS0+Ym9hcmRjZmdbNDJdICYmCS8qIHNwZWNpYWwgKi8KLQkJCQkgICAhc3RybmNtcCgiZGVjeGwiLCBiaXRkYXRhLT5sb2Fkd2hhdCwgOCkpIHsKLQkJCQlsb2FkZmlsZSA9IDE7Ci0JCQl9IGVsc2UKKwkJCWVsc2UgaWYgKCFzYWEtPmJvYXJkY2ZnWzQyXSAmJiAhc3RybmNtcCgiZGVjeGwiLAorCQkJCQliaXRkYXRhLT5sb2Fkd2hhdCwgOCkpCisJCQkJbG9hZGZpbGUgPSAxOwkvKiBzcGVjaWFsICovCisJCQllbHNlCiAJCQkJY29udGludWU7CS8qIGZwZ2Egbm90IGZvciB0aGlzIGNhcmQgKi8KLQkJCWlmIChsb2FkZmlsZSAhPSAxICYmIGxvYWRmaWxlICE9IDIpIHsKKwkJCWlmIChsb2FkZmlsZSAhPSAxICYmIGxvYWRmaWxlICE9IDIpCiAJCQkJY29udGludWU7CS8qIHNraXAgdG8gbmV4dCBjYXJkICovCi0JCQl9Ci0JCQlpZiAoc2FhLT5ib2FyZGNmZ1swXSAmJiBsb2FkZmlsZSA9PSAxICkKKwkJCWlmIChzYWEtPmJvYXJkY2ZnWzBdICYmIGxvYWRmaWxlID09IDEpCiAJCQkJY29udGludWU7CS8qIHNraXAgdG8gbmV4dCBjYXJkICovCiAJCQlpZiAoc2FhLT5ib2FyZGNmZ1swXSAhPSAxICYmIGxvYWRmaWxlID09IDIpCiAJCQkJY29udGludWU7CS8qIHNraXAgdG8gbmV4dCBjYXJkICovCkBAIC04NzAsOCArODM4LDkgQEAKIAkJLyogUmVsZWFzZSBYaWxpbnggSU5JVCBzaWduYWwgKFdTMikgKi8KIAkJc2Fhd3JpdGUoMHgwMDAwMDAwMCwgU0FBNzE0Nl9HUElPX0NUUkwpOwogCQkvKiBXYWl0IGZvciB0aGUgSU5JVCB0byBnbyBIaWdoICovCi0JCWZvciAoaSA9IDA7IGkgPCAxMDAwMCAmJgotCQkgICAgICEoc2FhcmVhZChTQUE3MTQ2X1BTUikgJiBTQUE3MTQ2X1BTUl9QSU4yKTsgaSsrKQorCQlmb3IgKGkgPSAwOworCQkJaSA8IDEwMDAwICYmICEoc2FhcmVhZChTQUE3MTQ2X1BTUikgJiBTQUE3MTQ2X1BTUl9QSU4yKTsKKwkJCWkrKykKIAkJCXNjaGVkdWxlKCk7CiAJCWlmIChpID09IDEwMDApIHsKIAkJCXByaW50ayhLRVJOX0lORk8gInN0cmFkaXMlZDogbm8gZnBnYSBJTklUXG4iLCBzYWEtPm5yKTsKQEAgLTg4MSwxNyArODUwLDEzIEBACiAJCWlmIChOZXdDYXJkKSB7CiAJCQlmb3IgKGkgPSBzdGFydGluZGV4OyBpIDwgYml0ZGF0YS0+ZGF0YXNpemU7IGkrKykKIAkJCQluZXdkbWFbaSAtIHN0YXJ0aW5kZXhdID0KLQkJCQkJYml0bWFuZ2xlcltiaXRkYXRhLT5kYXRhW2ldXTsKKwkJCQkgICAgYml0bWFuZ2xlcltiaXRkYXRhLT5kYXRhW2ldXTsKIAkJCWRlYml3cml0ZShzYWEsIDB4MDE0MjAwMDAsIDAsIDAsCiAJCQkJKChiaXRkYXRhLT5kYXRhc2l6ZSAtIHN0YXJ0aW5kZXgpICsgNSkpOwotCQkJaWYgKGxvYWR0d28pIHsKLQkJCQlpZiAobG9hZGZpbGUgPT0gMSkgewotCQkJCQlwcmludGsoInN0cmFkaXMlZDogIgotCQkJCQkJImF3YWl0aW5nIDJuZCBGUEdBIGJpdGZpbGVcbiIsCi0JCQkJCQlzYWEtPm5yKTsKLQkJCQkJY29udGludWU7CS8qIHNraXAgdG8gbmV4dCBjYXJkICovCi0JCQkJfQotCisJCQlpZiAobG9hZHR3byAmJiBsb2FkZmlsZSA9PSAxKSB7CisJCQkJcHJpbnRrKCJzdHJhZGlzJWQ6IGF3YWl0aW5nIDJuZCBGUEdBIGJpdGZpbGVcbiIsCisJCQkJICAgICAgIHNhYS0+bnIpOworCQkJCWNvbnRpbnVlOwkvKiBza2lwIHRvIG5leHQgY2FyZCAqLwogCQkJfQogCQl9IGVsc2UgewogCQkJZm9yIChpID0gc3RhcnRpbmRleDsgaSA8IGJpdGRhdGEtPmRhdGFzaXplOyBpKyspCkBAIC05MDAsOCArODY1LDkgQEAKIAkJCWRlYml3cml0ZShzYWEsIDB4MDE0YTAwMDAsIDAsIDAsCiAJCQkJKChiaXRkYXRhLT5kYXRhc2l6ZSAtIHN0YXJ0aW5kZXgpICsgNSkgKiAyKTsKIAkJfQotCQlmb3IgKGkgPSAwOyBpIDwgMTAwMCAmJgotCQkgICAgICEoc2FhcmVhZChTQUE3MTQ2X1BTUikgJiBTQUE3MTQ2X1BTUl9QSU4yKTsgaSsrKQorCQlmb3IgKGkgPSAwOworCQkJaSA8IDEwMDAgJiYgIShzYWFyZWFkKFNBQTcxNDZfUFNSKSAmIFNBQTcxNDZfUFNSX1BJTjIpOworCQkJaSsrKQogCQkJc2NoZWR1bGUoKTsKIAkJaWYgKGkgPT0gMTAwMCkgewogCQkJcHJpbnRrKEtFUk5fSU5GTyAic3RyYWRpcyVkOiBGUEdBIGxvYWQgZmFpbGVkXG4iLApAQCAtOTI1LDE0ICs4OTEsMTQgQEAKIAkJCS8qIG11dGUgQ1MzMzEwICovCiAJCQlpZiAoSGF2ZUNTMzMxMCkKIAkJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIFhJTElOWF9DUzMzMTBfQ01QTFQsCi0JCQkJCSAgMCwgMik7CisJCQkJCTAsIDIpOwogCQkJLyogc2V0IFZYQ08gdG8gUFdNIG1vZGUsIHJlbGVhc2UgcmVzZXQsIGJsYW5rIG9uICovCiAJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIFhJTElOWF9DVEwwLCAweGZmYzQsIDIpOwogCQkJbWRlbGF5KDEwKTsKIAkJCS8qIHVubXV0ZSBDUzMzMTAgKi8KIAkJCWlmIChIYXZlQ1MzMzEwKQogCQkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgWElMSU5YX0NUTDAsCi0JCQkJCSAgMHgyMDIwLCAyKTsKKwkJCQkJMHgyMDIwLCAyKTsKIAkJfQogCQkvKiBzZXQgc291cmNlIEJsYWNrICovCiAJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgWElMSU5YX0NUTDAsIDB4MTcwNywgMik7CkBAIC05NTgsMTAgKzkyNCwxMCBAQAogCQkJLyogd2UgbXVzdCBpbml0IENTODQyMCBmaXJzdCBzaW5jZSByZXYgYiBwdWxscyBpMnMgKi8KIAkJCS8qIG1hc3RlciBjbG9jayBsb3cgYW5kIENTNDM0MSBuZWVkcyBpMnMgbWFzdGVyIHRvICovCiAJCQkvKiBydW4gdGhlIGkyYyBwb3J0LiAqLwotCQkJaWYgKEhhdmVDUzg0MjApIHsKKwkJCWlmIChIYXZlQ1M4NDIwKQogCQkJCS8qIDA9Y29uc3VtZXIsIDE9cHJvICovCiAJCQkJaW5pdGlhbGl6ZV9jczg0MjAoc2FhLCAwKTsKLQkJCX0KKwogCQkJbWRlbGF5KDUpOwogCQkJaWYgKEhhdmVDUzQzNDEpCiAJCQkJaW5pdGlhbGl6ZV9jczQzNDEoc2FhKTsKQEAgLTk4MSw2ICs5NDcsNyBAQAogCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIFhJTElOWF9DVEwwLCAweDgwODAsIDIpOwogI2VuZGlmCiAJfQorCiAJcmV0dXJuIGZhaWx1cmU7CiB9CiAKQEAgLTEwMjEsMTAgKzk4OCwxMCBAQAogCQkvKiB3ZSBtdXN0IGluaXQgQ1M4NDIwIGZpcnN0IHNpbmNlIHJldiBiIHB1bGxzIGkycyAqLwogCQkvKiBtYXN0ZXIgY2xvY2sgbG93IGFuZCBDUzQzNDEgbmVlZHMgaTJzIG1hc3RlciB0byAqLwogCQkvKiBydW4gdGhlIGkyYyBwb3J0LiAqLwotCQlpZiAoSGF2ZUNTODQyMCkgeworCQlpZiAoSGF2ZUNTODQyMCkKIAkJCS8qIDA9Y29uc3VtZXIsIDE9cHJvICovCiAJCQlpbml0aWFsaXplX2NzODQyMChzYWEsIDEpOwotCQl9CisKIAkJbWRlbGF5KDUpOwogCQlpZiAoSGF2ZUNTNDM0MSkKIAkJCWluaXRpYWxpemVfY3M0MzQxKHNhYSk7CkBAIC0xMDM5LDEyICsxMDA2LDEyIEBACiAJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX09TRF9TSVpFLCAweDIwMDAsIDIpOwogCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9BVURfQ1RMLCAweDQ1NTIsIDIpOwogCWlmIChpYm1fc2VuZF9jb21tYW5kKHNhYSwgSUJNX01QMl9DT05GSUdfREVDT0RFUiwKLQkJKENoaXBDb250cm9sID09IDB4NDMgPyAweGU4MDAgOiAweGUwMDApLCAxKSkgeworCQkJKENoaXBDb250cm9sID09IDB4NDMgPyAweGU4MDAgOiAweGUwMDApLCAxKSkgewogCQlwcmludGsoS0VSTl9FUlIgInN0cmFkaXMlZDogSUJNIGNvbmZpZyBmYWlsZWRcbiIsIHNhYS0+bnIpOwogCX0KIAlpZiAoSGF2ZUNTMzMxMCkgewogCQlpbnQgaSA9IENTMzMxME1heEx2bDsKLQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBYSUxJTlhfQ1MzMzEwX0NNUExULCAoKGk8PDgpfGkpLCAyKTsKKwkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBYSUxJTlhfQ1MzMzEwX0NNUExULCAoKGkgPDwgOCl8IGkpLDIpOwogCX0KIAkvKiBzdGFydCB2aWRlbyBkZWNvZGVyICovCiAJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX0NISVBfQ09OVFJPTCwgQ2hpcENvbnRyb2wsIDIpOwpAQCAtMTA1Nyw2ICsxMDI0LDcgQEAKIAkvKiBjbGVhciBwZW5kaW5nIGludGVycnVwdHMgKi8KIAlkZWJpcmVhZChzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9IT1NUX0lOVCwgMik7CiAJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBYSUxJTlhfQ1RMMCwgMHgxNzExLCAyKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMDcwLDggKzEwMzgsOCBAQAogCQlzYWEgPSAmc2FhNzE0NnNbbnVtXTsKIAkJLyogY2hlY2sgdGhhdCBGUEdBIGlzIGxvYWRlZCAqLwogCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfT1NEX1NJWkUsIDB4YTU1YSwgMik7Ci0JCWlmICgoaSA9IGRlYmlyZWFkKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX09TRF9TSVpFLCAyKSkgIT0KLQkJICAgICAweGE1NWEpIHsKKwkJaSA9IGRlYmlyZWFkKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX09TRF9TSVpFLCAyKTsKKwkJaWYgKGkgIT0gMHhhNTVhKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPICJzdHJhZGlzJWQ6ICUwNHggIT0gMHhhNTVhXG4iLAogCQkJCXNhYS0+bnIsIGkpOwogI2lmIDAKQEAgLTEwODIsMTcgKzEwNTAsMTcgQEAKIAkJCWlmIChzYWEtPmJvYXJkY2ZnWzBdID4gMjcpCiAJCQkJY29udGludWU7CS8qIHNraXAgdG8gbmV4dCBjYXJkICovCiAJCQkvKiBsb2FkIHZpZGVvIGNvbnRyb2wgc3RvcmUgKi8KLQkJCXNhYS0+Ym9hcmRjZmdbMV0gPSAweDEzOyAgLyogbm8tc3luYyBkZWZhdWx0ICovCisJCQlzYWEtPmJvYXJkY2ZnWzFdID0gMHgxMzsJLyogbm8tc3luYyBkZWZhdWx0ICovCiAJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfV1JfUFJPVCwgMSwgMik7CiAJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfUFJPQ19JQUREUiwgMCwgMik7CiAJCQlmb3IgKGkgPSAwOyBpIDwgbWljcm9jb2RlLT5kYXRhc2l6ZSAvIDI7IGkrKykKIAkJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfUFJPQ19JREFUQSwKIAkJCQkJKG1pY3JvY29kZS0+ZGF0YVtpICogMl0gPDwgOCkgfAotCQkJCQkgbWljcm9jb2RlLT5kYXRhW2kgKiAyICsgMV0sIDIpOworCQkJCQltaWNyb2NvZGUtPmRhdGFbaSAqIDIgKyAxXSwgMik7CiAJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfUFJPQ19JQUREUiwgMCwgMik7CiAJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfV1JfUFJPVCwgMCwgMik7CiAJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfQ0hJUF9DT05UUk9MLAotCQkJCSAgQ2hpcENvbnRyb2wsIDIpOworCQkJCUNoaXBDb250cm9sLCAyKTsKIAkJCXNhYS0+Ym9hcmRjZmdbMF0gPSAyODsKIAkJfQogCQlpZiAoIXN0cm5jbXAobWljcm9jb2RlLT5sb2Fkd2hhdCwgImRlY29kZXIuYXVkIiwgMTEpKSB7CkBAIC0xMTA5LDM0ICsxMDc3LDMyIEBACiAJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfT1NEX1NJWkUsIDB4MjAwMCwgMik7CiAJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfQVVEX0NUTCwgMHg0NTUyLCAyKTsKIAkJCWlmIChpYm1fc2VuZF9jb21tYW5kKHNhYSwgSUJNX01QMl9DT05GSUdfREVDT0RFUiwKLQkJCSAgICAweGUwMDAsIDEpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICJzdHJhZGlzJWQ6IElCTSBjb25maWcgZmFpbGVkXG4iLAotCQkJCSAgICAgICBzYWEtPm5yKTsKKwkJCQkJMHhlMDAwLCAxKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAic3RyYWRpcyVkOiBJQk0gY29uZmlnICIKKwkJCQkJImZhaWxlZFxuIiwgc2FhLT5ucik7CiAJCQkJcmV0dXJuIC0xOwogCQkJfQogCQkJLyogc2V0IFBXTSB0byBjZW50ZXIgdmFsdWUgKi8KIAkJCWlmIChOZXdDYXJkKSB7CiAJCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBYSUxJTlhfUFdNLAotCQkJCQkgIHNhYS0+Ym9hcmRjZmdbMTRdICsKLQkJCQkJICAoc2FhLT5ib2FyZGNmZ1sxM108PDgpLCAyKTsKKwkJCQkJc2FhLT5ib2FyZGNmZ1sxNF0gKworCQkJCQkoc2FhLT5ib2FyZGNmZ1sxM10gPDwgOCksIDIpOwogCQkJfSBlbHNlCi0JCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBYSUxJTlhfUFdNLAotCQkJCQkgIDB4NDYsIDIpOworCQkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgWElMSU5YX1BXTSwgMHg0NiwgMik7CisKIAkJCWlmIChIYXZlQ1MzMzEwKSB7CiAJCQkJaSA9IENTMzMxME1heEx2bDsKLQkJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsCi0JCQkJCVhJTElOWF9DUzMzMTBfQ01QTFQsICgoaTw8OCl8aSksIDIpOworCQkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgWElMSU5YX0NTMzMxMF9DTVBMVCwKKwkJCQkJKGkgPDwgOCkgfCBpLCAyKTsKIAkJCX0KLQkJCXByaW50ayhLRVJOX0lORk8KLQkJCSAgICAgICAic3RyYWRpcyVkOiBJQk0gTVBFR0NEJWQgSW5pdGlhbGl6ZWRcbiIsCi0JCQkgICAgICAgc2FhLT5uciwgMTggKyAoZGViaXJlYWQoc2FhLCBkZWJOb3JtYWwsCi0JCQkgICAgICAgSUJNX01QMl9DSElQX0NPTlRST0wsIDIpID4+IDEyKSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJzdHJhZGlzJWQ6IElCTSBNUEVHQ0QlZCBJbml0ZWRcbiIsCisJCQkJc2FhLT5uciwgMTggKyAoZGViaXJlYWQoc2FhLCBkZWJOb3JtYWwsCisJCQkJSUJNX01QMl9DSElQX0NPTlRST0wsIDIpID4+IDEyKSk7CiAJCQkvKiBzdGFydCB2aWRlbyBkZWNvZGVyICovCiAJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfQ0hJUF9DT05UUk9MLAogCQkJCUNoaXBDb250cm9sLCAyKTsKLQkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9SQl9USFJFU0hPTEQsCi0JCQkJMHg0MDM3LCAyKTsJLyogMjU2ayB2aWQsIDM1MjAgYnl0ZXMgYXVkICovCisJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfUkJfVEhSRVNIT0xELCAweDQwMzcsCisJCQkJMik7CS8qIDI1NmsgdmlkLCAzNTIwIGJ5dGVzIGF1ZCAqLwogCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX0FVRF9DVEwsIDB4NDU3MywgMik7CiAJCQlpYm1fc2VuZF9jb21tYW5kKHNhYSwgSUJNX01QMl9QTEFZLCAwLCAwKTsKIAkJCS8qIGVuYWJsZSBidWZmZXIgdGhyZXNob2xkIGlycSAqLwpAQCAtMTE0OSw1MiArMTExNSw0OCBAQAogCQkJc2FhLT5ib2FyZGNmZ1swXSA9IDM3OwogCQl9CiAJfQorCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1MzIgcGFsZXR0ZTJmbXRbXSA9Ci17CQkJCS8qIHNvbWUgb2YgdGhlc2UgWVVWIHRyYW5zbGF0aW9ucyBhcmUgd3JvbmcgKi8KLSAgMHhmZmZmZmZmZiwgMHg4NjAwMDAwMCwgMHg4NzAwMDAwMCwgMHg4MDAwMDAwMCwgMHg4MTAwMDAwLCAweDgyMDAwMDAwLAotICAweDgzMDAwMDAwLCAweDAwMDAwMDAwLCAweDAzMDAwMDAwLCAweDAzMDAwMDAwLCAweDBhMDAwMDAsIDB4MDMwMDAwMDAsCi0gIDB4MDYwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDMwMDAwMDAsIDB4MGEwMDAwMDAsIDB4MDMwMDAwMAorc3RhdGljIHUzMiBwYWxldHRlMmZtdFtdID0gewkvKiBzb21lIG9mIHRoZXNlIFlVViB0cmFuc2xhdGlvbnMgYXJlIHdyb25nICovCisJMHhmZmZmZmZmZiwgMHg4NjAwMDAwMCwgMHg4NzAwMDAwMCwgMHg4MDAwMDAwMCwgMHg4MTAwMDAwLCAweDgyMDAwMDAwLAorCTB4ODMwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDMwMDAwMDAsIDB4MDMwMDAwMDAsIDB4MGEwMDAwMCwgMHgwMzAwMDAwMCwKKwkweDA2MDAwMDAwLCAweDAwMDAwMDAwLCAweDAzMDAwMDAwLCAweDBhMDAwMDAwLCAweDAzMDAwMDAKIH07Ci1zdGF0aWMgaW50IGJwcDJmbXRbNF0gPQoteworc3RhdGljIGludCBicHAyZm10WzRdID0gewogCVZJREVPX1BBTEVUVEVfSEkyNDAsIFZJREVPX1BBTEVUVEVfUkdCNTY1LCBWSURFT19QQUxFVFRFX1JHQjI0LAogCVZJREVPX1BBTEVUVEVfUkdCMzIKIH07CiAKIC8qIEkgd2lzaCBJIGNvdWxkIGZpbmQgYSBmb3JtdWxhIHRvIGNhbGN1bGF0ZSB0aGVzZS4uLiAqLwotc3RhdGljIHUzMiBoX3ByZXNjYWxlWzY0XSA9Ci17Ci0gIDB4MTAwMDAwMDAsIDB4MTgwNDAyMDIsIDB4MTgwODAwMDAsIDB4MzgwYzA2MDYsIDB4MzgxMDAyMDQsIDB4MzgxNDA4MDgsCi0gIDB4MzgxODAwMDAsIDB4MzgxYzAwMDAsIDB4MzgyMDE2MWMsIDB4MzgyNDJhM2IsIDB4MzgyODEyMzAsIDB4MzgyYzQ0NjAsCi0gIDB4MzgzMDEwNDAsIDB4MzgzNDAwODAsIDB4MzgzODAwMDAsIDB4MzgzYzAwMDAsIDB4Mzg0MGZlZmUsIDB4Mzg0NGVlOWYsCi0gIDB4Mzg0OGVlOWYsIDB4Mzg0Y2VlOWYsIDB4Mzg1MGVlOWYsIDB4Mzg1NDJhM2IsIDB4Mzg1ODEyMzAsIDB4Mzg1YzAwMDAsCi0gIDB4Mzg2MDAwMDAsIDB4Mzg2NDAwMDAsIDB4Mzg2ODAwMDAsIDB4Mzg2YzAwMDAsIDB4Mzg3MDAwMDAsIDB4Mzg3NDAwMDAsCi0gIDB4Mzg3ODAwMDAsIDB4Mzg3YzAwMDAsIDB4MzA4MDAwMDAsIDB4Mzg4NDAwMDAsIDB4Mzg4ODAwMDAsIDB4Mzg4YzAwMDAsCi0gIDB4Mzg5MDAwMDAsIDB4Mzg5NDAwMDAsIDB4Mzg5ODAwMDAsIDB4Mzg5YzAwMDAsIDB4MzhhMDAwMDAsIDB4MzhhNDAwMDAsCi0gIDB4MzhhODAwMDAsIDB4MzhhYzAwMDAsIDB4MzhiMDAwMDAsIDB4MzhiNDAwMDAsIDB4MzhiODAwMDAsIDB4MzhiYzAwMDAsCi0gIDB4MzhjMDAwMDAsIDB4MzhjNDAwMDAsIDB4MzhjODAwMDAsIDB4MzhjYzAwMDAsIDB4MzhkMDAwMDAsIDB4MzhkNDAwMDAsCi0gIDB4MzhkODAwMDAsIDB4MzhkYzAwMDAsIDB4MzhlMDAwMDAsIDB4MzhlNDAwMDAsIDB4MzhlODAwMDAsIDB4MzhlYzAwMDAsCi0gIDB4MzhmMDAwMDAsIDB4MzhmNDAwMDAsIDB4MzhmODAwMDAsIDB4MzhmYzAwMDAsCitzdGF0aWMgdTMyIGhfcHJlc2NhbGVbNjRdID0geworCTB4MTAwMDAwMDAsIDB4MTgwNDAyMDIsIDB4MTgwODAwMDAsIDB4MzgwYzA2MDYsIDB4MzgxMDAyMDQsIDB4MzgxNDA4MDgsCisJMHgzODE4MDAwMCwgMHgzODFjMDAwMCwgMHgzODIwMTYxYywgMHgzODI0MmEzYiwgMHgzODI4MTIzMCwgMHgzODJjNDQ2MCwKKwkweDM4MzAxMDQwLCAweDM4MzQwMDgwLCAweDM4MzgwMDAwLCAweDM4M2MwMDAwLCAweDM4NDBmZWZlLCAweDM4NDRlZTlmLAorCTB4Mzg0OGVlOWYsIDB4Mzg0Y2VlOWYsIDB4Mzg1MGVlOWYsIDB4Mzg1NDJhM2IsIDB4Mzg1ODEyMzAsIDB4Mzg1YzAwMDAsCisJMHgzODYwMDAwMCwgMHgzODY0MDAwMCwgMHgzODY4MDAwMCwgMHgzODZjMDAwMCwgMHgzODcwMDAwMCwgMHgzODc0MDAwMCwKKwkweDM4NzgwMDAwLCAweDM4N2MwMDAwLCAweDMwODAwMDAwLCAweDM4ODQwMDAwLCAweDM4ODgwMDAwLCAweDM4OGMwMDAwLAorCTB4Mzg5MDAwMDAsIDB4Mzg5NDAwMDAsIDB4Mzg5ODAwMDAsIDB4Mzg5YzAwMDAsIDB4MzhhMDAwMDAsIDB4MzhhNDAwMDAsCisJMHgzOGE4MDAwMCwgMHgzOGFjMDAwMCwgMHgzOGIwMDAwMCwgMHgzOGI0MDAwMCwgMHgzOGI4MDAwMCwgMHgzOGJjMDAwMCwKKwkweDM4YzAwMDAwLCAweDM4YzQwMDAwLCAweDM4YzgwMDAwLCAweDM4Y2MwMDAwLCAweDM4ZDAwMDAwLCAweDM4ZDQwMDAwLAorCTB4MzhkODAwMDAsIDB4MzhkYzAwMDAsIDB4MzhlMDAwMDAsIDB4MzhlNDAwMDAsIDB4MzhlODAwMDAsIDB4MzhlYzAwMDAsCisJMHgzOGYwMDAwMCwgMHgzOGY0MDAwMCwgMHgzOGY4MDAwMCwgMHgzOGZjMDAwMCwKIH07Ci1zdGF0aWMgdTMyIHZfZ2Fpbls2NF0gPQotewotICAweDAxNjAwMGZmLCAweDAxNjEwMGZmLCAweDAxNjEwMGZmLCAweDAxNjIwMGZmLCAweDAxNjIwMGZmLCAweDAxNjIwMGZmLAotICAweDAxNjIwMGZmLCAweDAxNjMwMGZmLCAweDAxNjMwMGZmLCAweDAxNjMwMGZmLCAweDAxNjMwMGZmLCAweDAxNjMwMGZmLAotICAweDAxNjMwMGZmLCAweDAxNjMwMGZmLCAweDAxNjMwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLAotICAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLAotICAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLAotICAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLAotICAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLAotICAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLAotICAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLAotICAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLAotICAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLAorc3RhdGljIHUzMiB2X2dhaW5bNjRdID0geworCTB4MDE2MDAwZmYsIDB4MDE2MTAwZmYsIDB4MDE2MTAwZmYsIDB4MDE2MjAwZmYsIDB4MDE2MjAwZmYsIDB4MDE2MjAwZmYsCisJMHgwMTYyMDBmZiwgMHgwMTYzMDBmZiwgMHgwMTYzMDBmZiwgMHgwMTYzMDBmZiwgMHgwMTYzMDBmZiwgMHgwMTYzMDBmZiwKKwkweDAxNjMwMGZmLCAweDAxNjMwMGZmLCAweDAxNjMwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLAorCTB4MDE2NDAwZmYsIDB4MDE2NDAwZmYsIDB4MDE2NDAwZmYsIDB4MDE2NDAwZmYsIDB4MDE2NDAwZmYsIDB4MDE2NDAwZmYsCisJMHgwMTY0MDBmZiwgMHgwMTY0MDBmZiwgMHgwMTY0MDBmZiwgMHgwMTY0MDBmZiwgMHgwMTY0MDBmZiwgMHgwMTY0MDBmZiwKKwkweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLAorCTB4MDE2NDAwZmYsIDB4MDE2NDAwZmYsIDB4MDE2NDAwZmYsIDB4MDE2NDAwZmYsIDB4MDE2NDAwZmYsIDB4MDE2NDAwZmYsCisJMHgwMTY0MDBmZiwgMHgwMTY0MDBmZiwgMHgwMTY0MDBmZiwgMHgwMTY0MDBmZiwgMHgwMTY0MDBmZiwgMHgwMTY0MDBmZiwKKwkweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLCAweDAxNjQwMGZmLAorCTB4MDE2NDAwZmYsIDB4MDE2NDAwZmYsIDB4MDE2NDAwZmYsIDB4MDE2NDAwZmYsIDB4MDE2NDAwZmYsIDB4MDE2NDAwZmYsCisJMHgwMTY0MDBmZiwgMHgwMTY0MDBmZiwgMHgwMTY0MDBmZiwgMHgwMTY0MDBmZiwKIH07CiAKLQogc3RhdGljIHZvaWQgc2FhNzE0Nl9zZXRfd2luc2l6ZShzdHJ1Y3Qgc2FhNzE0NiAqc2FhKQogewogCXUzMiBmb3JtYXQ7CkBAIC0xMjA5LDI0ICsxMTcxLDIzIEBACiAJc2Fhd3JpdGUoc2FhLT53aW4udmlkYWRyICsgc2FhLT53aW4uYnBsICogc2FhLT53aW4uc2hlaWdodCwKIAkJIFNBQTcxNDZfUFJPVF9BRERSMSk7CiAJc2Fhd3JpdGUoMCwgU0FBNzE0Nl9QQUdFMSk7Ci0Jc2Fhd3JpdGUoZm9ybWF0fDB4NjAsIFNBQTcxNDZfQ0xJUF9GT1JNQVRfQ1RSTCk7CisJc2Fhd3JpdGUoZm9ybWF0IHwgMHg2MCwgU0FBNzE0Nl9DTElQX0ZPUk1BVF9DVFJMKTsKIAlvZmZzZXQgPSAoNzA0IC8gKHNhYS0+d2luLndpZHRoIC0gMSkpICYgMHgzZjsKIAlzYWF3cml0ZShoX3ByZXNjYWxlW29mZnNldF0sIFNBQTcxNDZfSFBTX0hfUFJFU0NBTEUpOwogCW9mZnNldCA9ICg3MjA4OTYgLyBzYWEtPndpbi53aWR0aCkgLyAob2Zmc2V0ICsgMSk7Ci0Jc2Fhd3JpdGUoKG9mZnNldDw8MTIpfDB4MGMsIFNBQTcxNDZfSFBTX0hfU0NBTEUpOworCXNhYXdyaXRlKChvZmZzZXQgPDwgMTIpIHwgMHgwYywgU0FBNzE0Nl9IUFNfSF9TQ0FMRSk7CiAJaWYgKEN1cnJlbnRNb2RlID09IFZJREVPX01PREVfTlRTQykgewotCQl5YWNsID0gLyooNDgwIC8gc2FhLT53aW4uaGVpZ2h0IC0gMSkgJiAweDNmKi8gMDsKKwkJeWFjbCA9IC8qKDQ4MCAvIHNhYS0+d2luLmhlaWdodCAtIDEpICYgMHgzZiAqLyAwOwogCQl5c2NpID0gMTAyNCAtIChzYWEtPndpbi5oZWlnaHQgKiAxMDI0IC8gNDgwKTsKIAl9IGVsc2UgewotCQl5YWNsID0gLyooNTc2IC8gc2FhLT53aW4uaGVpZ2h0IC0gMSkgJiAweDNmKi8gMDsKKwkJeWFjbCA9IC8qKDU3NiAvIHNhYS0+d2luLmhlaWdodCAtIDEpICYgMHgzZiAqLyAwOwogCQl5c2NpID0gMTAyNCAtIChzYWEtPndpbi5oZWlnaHQgKiAxMDI0IC8gNTc2KTsKIAl9Ci0Jc2Fhd3JpdGUoKDE8PDMxKXwoeXNjaTw8MjEpfCh5YWNsPDwxNSksIFNBQTcxNDZfSFBTX1ZfU0NBTEUpOworCXNhYXdyaXRlKCgxIDw8IDMxKSB8ICh5c2NpIDw8IDIxKSB8ICh5YWNsIDw8IDE1KSwgU0FBNzE0Nl9IUFNfVl9TQ0FMRSk7CiAJc2Fhd3JpdGUodl9nYWluW3lhY2xdLCBTQUE3MTQ2X0hQU19WX0dBSU4pOwogCXNhYXdyaXRlKCgoU0FBNzE0Nl9NQzJfVVBMRF9ETUExIHwgU0FBNzE0Nl9NQzJfVVBMRF9IUFNfViB8Ci0JCSAgIFNBQTcxNDZfTUMyX1VQTERfSFBTX0gpIDw8IDE2KSB8IChTQUE3MTQ2X01DMl9VUExEX0RNQTEgfAotCQkgICBTQUE3MTQ2X01DMl9VUExEX0hQU19WIHwgU0FBNzE0Nl9NQzJfVVBMRF9IUFNfSCksCi0JCSAgIFNBQTcxNDZfTUMyKTsKKwkJU0FBNzE0Nl9NQzJfVVBMRF9IUFNfSCkgPDwgMTYpIHwgKFNBQTcxNDZfTUMyX1VQTERfRE1BMSB8CisJCVNBQTcxNDZfTUMyX1VQTERfSFBTX1YgfCBTQUE3MTQ2X01DMl9VUExEX0hQU19IKSwgU0FBNzE0Nl9NQzIpOwogfQogCiAvKiBjbGlwX2RyYXdfcmVjdGFuZ2xlKGNtLHgseSx3LGgpIC0tIGhhbmRsZSBjbGlwcGluZyBhbiBhcmVhCkBAIC0xMjYxLDggKzEyMjIsOCBAQAogCXN0YXJ0d29yZCA9ICh4ID4+IDUpOwogCWVuZHdvcmQgPSAoKHggKyB3KSA+PiA1KTsKIAliaXRzbGVmdCA9ICgweGZmZmZmZmZmID4+ICh4ICYgMzEpKTsKLQliaXRzcmlnaHQgPSAoMHhmZmZmZmZmZiA8PCAofigoeCArIHcpIC0gKGVuZHdvcmQ8PDUpKSkpOwotCXRlbXAgPSAmY2xpcG1hcFsoeTw8NSkgKyBzdGFydHdvcmRdOworCWJpdHNyaWdodCA9ICgweGZmZmZmZmZmIDw8ICh+KCh4ICsgdykgLSAoZW5kd29yZCA8PCA1KSkpKTsKKwl0ZW1wID0gJmNsaXBtYXBbKHkgPDwgNSkgKyBzdGFydHdvcmRdOwogCXcgPSBlbmR3b3JkIC0gc3RhcnR3b3JkOwogCWlmICghdykgewogCQliaXRzbGVmdCB8PSBiaXRzcmlnaHQ7CkBAIC0xMjg3LDEzICsxMjQ4LDEzIEBACiAJdTMyICpjbGlwbWFwOwogCiAJY2xpcG1hcCA9IHNhYS0+ZG1hdmlkMjsKLQlpZigod2lkdGg9c2FhLT53aW4ud2lkdGgpPjEwMjMpCi0JCXdpZHRoID0gMTAyMzsJCS8qIHNhbml0eSBjaGVjayAqLwotCWlmKChoZWlnaHQ9c2FhLT53aW4uaGVpZ2h0KT42NDApCi0JCWhlaWdodCA9IDYzOTsJCS8qIHNhbml0eSBjaGVjayAqLwotCWlmIChuY3IgPiAwKSB7CS8qIHJlY3RhbmdsZXMgcGFzZWQgKi8KKwlpZiAoKHdpZHRoID0gc2FhLT53aW4ud2lkdGgpID4gMTAyMykKKwkJd2lkdGggPSAxMDIzOwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlpZiAoKGhlaWdodCA9IHNhYS0+d2luLmhlaWdodCkgPiA2NDApCisJCWhlaWdodCA9IDYzOTsJLyogc2FuaXR5IGNoZWNrICovCisJaWYgKG5jciA+IDApIHsJCS8qIHJlY3RhbmdsZXMgcGFzZWQgKi8KIAkJLyogY29udmVydCByZWN0YW5ndWxhciBjbGlwcyB0byBhIGJpdG1hcCAqLwotCQltZW1zZXQoY2xpcG1hcCwgMCwgVklERU9fQ0xJUE1BUF9TSVpFKTsgLyogY2xlYXIgbWFwICovCisJCW1lbXNldChjbGlwbWFwLCAwLCBWSURFT19DTElQTUFQX1NJWkUpOwkvKiBjbGVhciBtYXAgKi8KIAkJZm9yIChpID0gMDsgaSA8IG5jcjsgaSsrKQogCQkJY2xpcF9kcmF3X3JlY3RhbmdsZShjbGlwbWFwLCBjcltpXS54LCBjcltpXS55LAogCQkJCWNyW2ldLndpZHRoLCBjcltpXS5oZWlnaHQpOwpAQCAtMTMwMSwxNCArMTI2MiwxNSBAQAogCS8qIGNsaXAgYWdhaW5zdCB2aWV3aW5nIHdpbmRvdyBBTkQgc2NyZWVuIAogCSAgIHNvIHdlIGRvIG5vdCBoYXZlIHRvIHJlbHkgb24gdGhlIHVzZXIgcHJvZ3JhbQogCSAqLwotCWNsaXBfZHJhd19yZWN0YW5nbGUoY2xpcG1hcCwoc2FhLT53aW4ueCt3aWR0aD5zYWEtPndpbi5zd2lkdGgpID8KLQkJKHNhYS0+d2luLnN3aWR0aC1zYWEtPndpbi54KSA6IHdpZHRoLCAwLCAxMDI0LCA3NjgpOwotCWNsaXBfZHJhd19yZWN0YW5nbGUoY2xpcG1hcCwwLChzYWEtPndpbi55K2hlaWdodD5zYWEtPndpbi5zaGVpZ2h0KSA/Ci0JCShzYWEtPndpbi5zaGVpZ2h0LXNhYS0+d2luLnkpIDogaGVpZ2h0LDEwMjQsNzY4KTsKLQlpZiAoc2FhLT53aW4ueDwwKQotCQljbGlwX2RyYXdfcmVjdGFuZ2xlKGNsaXBtYXAsIDAsIDAsIC0oc2FhLT53aW4ueCksIDc2OCk7Ci0JaWYgKHNhYS0+d2luLnk8MCkKLQkJY2xpcF9kcmF3X3JlY3RhbmdsZShjbGlwbWFwLCAwLCAwLCAxMDI0LCAtKHNhYS0+d2luLnkpKTsKKwljbGlwX2RyYXdfcmVjdGFuZ2xlKGNsaXBtYXAsIChzYWEtPndpbi54ICsgd2lkdGggPiBzYWEtPndpbi5zd2lkdGgpID8KKwkJKHNhYS0+d2luLnN3aWR0aCAtIHNhYS0+d2luLngpIDogd2lkdGgsIDAsIDEwMjQsIDc2OCk7CisJY2xpcF9kcmF3X3JlY3RhbmdsZShjbGlwbWFwLCAwLAorCQkoc2FhLT53aW4ueSArIGhlaWdodCA+IHNhYS0+d2luLnNoZWlnaHQpID8KKwkJKHNhYS0+d2luLnNoZWlnaHQgLSBzYWEtPndpbi55KSA6IGhlaWdodCwgMTAyNCwgNzY4KTsKKwlpZiAoc2FhLT53aW4ueCA8IDApCisJCWNsaXBfZHJhd19yZWN0YW5nbGUoY2xpcG1hcCwgMCwgMCwgLXNhYS0+d2luLngsIDc2OCk7CisJaWYgKHNhYS0+d2luLnkgPCAwKQorCQljbGlwX2RyYXdfcmVjdGFuZ2xlKGNsaXBtYXAsIDAsIDAsIDEwMjQsIC1zYWEtPndpbi55KTsKIH0KIAogc3RhdGljIGludCBzYWFfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCkBAIC0xMzIyLDExICsxMjg0LDkgQEAKIAkJewogCQkJc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgYjsKIAkJCXN0cmNweShiLm5hbWUsIHNhYS0+dmlkZW9fZGV2Lm5hbWUpOwotCQkJYi50eXBlID0gVklEX1RZUEVfQ0FQVFVSRSB8Ci0JCQkgICAgVklEX1RZUEVfT1ZFUkxBWSB8Ci0JCQkgICAgVklEX1RZUEVfQ0xJUFBJTkcgfAotCQkJICAgIFZJRF9UWVBFX0ZSQU1FUkFNIHwKLQkJCSAgICBWSURfVFlQRV9TQ0FMRVM7CisJCQliLnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFIHwgVklEX1RZUEVfT1ZFUkxBWSB8CisJCQkJVklEX1RZUEVfQ0xJUFBJTkcgfCBWSURfVFlQRV9GUkFNRVJBTSB8CisJCQkJVklEX1RZUEVfU0NBTEVTOwogCQkJYi5jaGFubmVscyA9IDE7CiAJCQliLmF1ZGlvcyA9IDE7CiAJCQliLm1heHdpZHRoID0gNzY4OwpAQCAtMTM2MywxNyArMTMyMywxOCBAQAogCQkJaWYgKHAucGFsZXR0ZSA8IHNpemVvZihwYWxldHRlMmZtdCkgLyBzaXplb2YodTMyKSkgewogCQkJCWZvcm1hdCA9IHBhbGV0dGUyZm10W3AucGFsZXR0ZV07CiAJCQkJc2FhLT53aW4uY29sb3JfZm10ID0gZm9ybWF0OwotCQkJCXNhYXdyaXRlKGZvcm1hdHwweDYwLCBTQUE3MTQ2X0NMSVBfRk9STUFUX0NUUkwpOworCQkJCXNhYXdyaXRlKGZvcm1hdCB8IDB4NjAsCisJCQkJCVNBQTcxNDZfQ0xJUF9GT1JNQVRfQ1RSTCk7CiAJCQl9CiAJCQlzYWF3cml0ZSgoKHAuYnJpZ2h0bmVzcyAmIDB4ZmYwMCkgPDwgMTYpIHwKLQkJCQkgKChwLmNvbnRyYXN0ICYgMHhmZTAwKSA8PCA3KSB8Ci0JCQkgICAgICgocC5jb2xvdXIgJiAweGZlMDApID4+IDkpLCBTQUE3MTQ2X0JDU19DVFJMKTsKKwkJCQkoKHAuY29udHJhc3QgJiAweGZlMDApIDw8IDcpIHwKKwkJCQkoKHAuY29sb3VyICYgMHhmZTAwKSA+PiA5KSwgU0FBNzE0Nl9CQ1NfQ1RSTCk7CiAJCQlzYWEtPnBpY3R1cmUgPSBwOwogCQkJLyogdXBsb2FkIGNoYW5nZWQgcmVnaXN0ZXJzICovCiAJCQlzYWF3cml0ZSgoKFNBQTcxNDZfTUMyX1VQTERfSFBTX0ggfAotCQkJCSBTQUE3MTQ2X01DMl9VUExEX0hQU19WKSA8PCAxNikgfAotCQkJCVNBQTcxNDZfTUMyX1VQTERfSFBTX0ggfCBTQUE3MTQ2X01DMl9VUExEX0hQU19WLAotCQkJCSBTQUE3MTQ2X01DMik7CisJCQkJU0FBNzE0Nl9NQzJfVVBMRF9IUFNfVikgPDwgMTYpIHwKKwkJCQlTQUE3MTQ2X01DMl9VUExEX0hQU19IIHwKKwkJCQlTQUE3MTQ2X01DMl9VUExEX0hQU19WLCBTQUE3MTQ2X01DMik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCWNhc2UgVklESU9DU1dJTjoKQEAgLTEzODQsMTEgKzEzNDUsMTQgQEAKIAkJCWlmIChjb3B5X2Zyb21fdXNlcigmdncsIGFyZywgc2l6ZW9mKHZ3KSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJCWlmICh2dy5mbGFncyB8fCB2dy53aWR0aCA8IDE2IHx8IHZ3LmhlaWdodCA8IDE2KSB7CS8qIHN0b3AgY2FwdHVyZSAqLwotCQkJCXNhYXdyaXRlKChTQUE3MTQ2X01DMV9UUl9FXzEgPDwgMTYpLCBTQUE3MTQ2X01DMSk7CisJCQkvKiBzdG9wIGNhcHR1cmUgKi8KKwkJCWlmICh2dy5mbGFncyB8fCB2dy53aWR0aCA8IDE2IHx8IHZ3LmhlaWdodCA8IDE2KSB7CisJCQkJc2Fhd3JpdGUoKFNBQTcxNDZfTUMxX1RSX0VfMSA8PCAxNiksCisJCQkJCVNBQTcxNDZfTUMxKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KLQkJCWlmIChzYWEtPndpbi5icHAgPCA0KSB7CQkvKiAzMi1iaXQgYWxpZ24gc3RhcnQgYW5kIGFkanVzdCB3aWR0aCAqLworCQkJLyogMzItYml0IGFsaWduIHN0YXJ0IGFuZCBhZGp1c3Qgd2lkdGggKi8KKwkJCWlmIChzYWEtPndpbi5icHAgPCA0KSB7CiAJCQkJaW50IGkgPSB2dy54OwogCQkJCXZ3LnggPSAodncueCArIDMpICYgfjM7CiAJCQkJaSA9IHZ3LnggLSBpOwpAQCAtMTQxNywyMyArMTM4MSwyNCBAQAogCQkJICovCiAJCQlpZiAodncuY2xpcGNvdW50IDwgMCkgewogCQkJCWlmIChjb3B5X2Zyb21fdXNlcihzYWEtPmRtYXZpZDIsIHZ3LmNsaXBzLAotCQkJCQkJICAgVklERU9fQ0xJUE1BUF9TSVpFKSkKKwkJCQkJCVZJREVPX0NMSVBNQVBfU0laRSkpCiAJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotCQkJZWxzZSBpZiAodncuY2xpcGNvdW50ID4gMTYzODQpIHsKKwkJCX0gZWxzZSBpZiAodncuY2xpcGNvdW50ID4gMTYzODQpIHsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0gZWxzZSBpZiAodncuY2xpcGNvdW50ID4gMCkgewotCQkJCWlmICgodmNwID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IHZpZGVvX2NsaXApICoKLQkJCQkJICAgICAgICAodncuY2xpcGNvdW50KSkpID09IE5VTEwpCi0JCQkJCSByZXR1cm4gLUVOT01FTTsKKwkJCQl2Y3AgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgdmlkZW9fY2xpcCkgKgorCQkJCQl2dy5jbGlwY291bnQpOworCQkJCWlmICh2Y3AgPT0gTlVMTCkKKwkJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQkJaWYgKGNvcHlfZnJvbV91c2VyKHZjcCwgdncuY2xpcHMsCi0JCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgdmlkZW9fY2xpcCkgKgotCQkJCQkJICAgdncuY2xpcGNvdW50KSkgeworCQkJCQkJc2l6ZW9mKHN0cnVjdCB2aWRlb19jbGlwKSAqCisJCQkJCQl2dy5jbGlwY291bnQpKSB7CiAJCQkJCXZmcmVlKHZjcCk7CiAJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCX0KIAkJCX0gZWxzZQkvKiBub3RoaW5nIGNsaXBwZWQgKi8KIAkJCQltZW1zZXQoc2FhLT5kbWF2aWQyLCAwLCBWSURFT19DTElQTUFQX1NJWkUpOworCiAJCQltYWtlX2NsaXBfdGFiKHNhYSwgdmNwLCB2dy5jbGlwY291bnQpOwogCQkJaWYgKHZ3LmNsaXBjb3VudCA+IDApCiAJCQkJdmZyZWUodmNwKTsKQEAgLTE0NjYsMjEgKzE0MzEsMjEgQEAKIAkJCWlmICh2ID09IDApIHsKIAkJCQlzYWEtPmNhcCAmPSB+MTsKIAkJCQlzYWF3cml0ZSgoU0FBNzE0Nl9NQzFfVFJfRV8xIDw8IDE2KSwKLQkJCQkJIFNBQTcxNDZfTUMxKTsKKwkJCQkJU0FBNzE0Nl9NQzEpOwogCQkJfSBlbHNlIHsKIAkJCQlpZiAoc2FhLT53aW4udmlkYWRyID09IDAgfHwgc2FhLT53aW4ud2lkdGggPT0gMAotCQkJCSAgICB8fCBzYWEtPndpbi5oZWlnaHQgPT0gMCkKKwkJCQkJCXx8IHNhYS0+d2luLmhlaWdodCA9PSAwKQogCQkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCQlzYWEtPmNhcCB8PSAxOwogCQkJCXNhYXdyaXRlKChTQUE3MTQ2X01DMV9UUl9FXzEgPDwgMTYpIHwgMHhmZmZmLAotCQkJCQkgU0FBNzE0Nl9NQzEpOworCQkJCQlTQUE3MTQ2X01DMSk7CiAJCQl9CiAJCQlyZXR1cm4gMDsKIAkJfQogCWNhc2UgVklESU9DR0ZCVUY6CiAJCXsKIAkJCXN0cnVjdCB2aWRlb19idWZmZXIgdjsKLQkJCXYuYmFzZSA9ICh2b2lkICopIHNhYS0+d2luLnZpZGFkcjsKKwkJCXYuYmFzZSA9ICh2b2lkICopc2FhLT53aW4udmlkYWRyOwogCQkJdi5oZWlnaHQgPSBzYWEtPndpbi5zaGVpZ2h0OwogCQkJdi53aWR0aCA9IHNhYS0+d2luLnN3aWR0aDsKIAkJCXYuZGVwdGggPSBzYWEtPndpbi5kZXB0aDsKQEAgLTE0OTgsMTkgKzE0NjMsMjAgQEAKIAkJCWlmIChjb3B5X2Zyb21fdXNlcigmdiwgYXJnLCBzaXplb2YodikpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJaWYgKHYuZGVwdGggIT0gOCAmJiB2LmRlcHRoICE9IDE1ICYmIHYuZGVwdGggIT0gMTYgJiYKLQkJCXYuZGVwdGggIT0gMjQgJiYgdi5kZXB0aCAhPSAzMiAmJiB2LndpZHRoID4gMTYgJiYKKwkJCSAgICB2LmRlcHRoICE9IDI0ICYmIHYuZGVwdGggIT0gMzIgJiYgdi53aWR0aCA+IDE2ICYmCiAJCQkgICAgdi5oZWlnaHQgPiAxNiAmJiB2LmJ5dGVzcGVybGluZSA+IDE2KQogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJaWYgKHYuYmFzZSkKLQkJCQlzYWEtPndpbi52aWRhZHIgPSAodW5zaWduZWQgbG9uZykgdi5iYXNlOworCQkJCXNhYS0+d2luLnZpZGFkciA9ICh1bnNpZ25lZCBsb25nKXYuYmFzZTsKIAkJCXNhYS0+d2luLnNoZWlnaHQgPSB2LmhlaWdodDsKIAkJCXNhYS0+d2luLnN3aWR0aCA9IHYud2lkdGg7CiAJCQlzYWEtPndpbi5icHAgPSAoKHYuZGVwdGggKyA3KSAmIDB4MzgpIC8gODsKIAkJCXNhYS0+d2luLmRlcHRoID0gdi5kZXB0aDsKIAkJCXNhYS0+d2luLmJwbCA9IHYuYnl0ZXNwZXJsaW5lOwogCi0JCQlERUJVRyhwcmludGsoIkRpc3BsYXkgYXQgJXAgaXMgJWQgYnkgJWQsIGJ5dGVkZXB0aCAlZCwgYnBsICVkXG4iLAotCQkJCSAgICAgdi5iYXNlLCB2LndpZHRoLCB2LmhlaWdodCwgc2FhLT53aW4uYnBwLCBzYWEtPndpbi5icGwpKTsKKwkJCURFQlVHKHByaW50aygiRGlzcGxheSBhdCAlcCBpcyAlZCBieSAlZCwgYnl0ZWRlcHRoICVkLCAiCisJCQkJCSJicGwgJWRcbiIsIHYuYmFzZSwgdi53aWR0aCwgdi5oZWlnaHQsCisJCQkJCXNhYS0+d2luLmJwcCwgc2FhLT53aW4uYnBsKSk7CiAJCQlzYWE3MTQ2X3NldF93aW5zaXplKHNhYSk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMTUzOCwyMSArMTUwNCwxOCBAQAogCQkJaW50IGk7CiAJCQlpZiAoY29weV9mcm9tX3VzZXIoJnYsIGFyZywgc2l6ZW9mKHYpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWkgPSAofih2LnZvbHVtZT4+OCkpJjB4ZmY7CisJCQlpID0gKH4odi52b2x1bWUgPj4gOCkpICYgMHhmZjsKIAkJCWlmICghSGF2ZUNTNDM0MSkgewotCQkJCWlmICh2LmZsYWdzICYgVklERU9fQVVESU9fTVVURSkgeworCQkJCWlmICh2LmZsYWdzICYgVklERU9fQVVESU9fTVVURSkKIAkJCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLAotCQkJCQkJSUJNX01QMl9GUk5UX0FUVEVOLAotCQkJCQkJMHhmZmZmLCAyKTsKLQkJCQl9CisJCQkJCQlJQk1fTVAyX0ZSTlRfQVRURU4sIDB4ZmZmZiwgMik7CiAJCQkJaWYgKCEodi5mbGFncyAmIFZJREVPX0FVRElPX01VVEUpKQogCQkJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsCi0JCQkJCQlJQk1fTVAyX0ZSTlRfQVRURU4sCi0JCQkJCQkgIDB4MDAwMCwgMik7CisJCQkJCQlJQk1fTVAyX0ZSTlRfQVRURU4sIDB4MDAwMCwgMik7CiAJCQkJaWYgKHYuZmxhZ3MgJiBWSURFT19BVURJT19WT0xVTUUpCiAJCQkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwKIAkJCQkJCUlCTV9NUDJfRlJOVF9BVFRFTiwKLQkJCQkJCShpPDw4KXxpLCAyKTsKKwkJCQkJCShpIDw8IDgpIHwgaSwgMik7CiAJCQl9IGVsc2UgewogCQkJCWlmICh2LmZsYWdzICYgVklERU9fQVVESU9fTVVURSkKIAkJCQkJY3M0MzQxX3NldGxldmVsKHNhYSwgMHhmZiwgMHhmZik7CkBAIC0xNTgwLDE2MyArMTU0MywxMzggQEAKIAljYXNlIFZJRElPQ1NQTEFZTU9ERToKIAkJewogCQkJc3RydWN0IHZpZGVvX3BsYXlfbW9kZSBwbW9kZTsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSAmcG1vZGUsIGFyZywKLQkJCQlzaXplb2Yoc3RydWN0IHZpZGVvX3BsYXlfbW9kZSkpKQorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJnBtb2RlLCBhcmcsCisJCQkJCXNpemVvZihzdHJ1Y3QgdmlkZW9fcGxheV9tb2RlKSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQlzd2l0Y2ggKHBtb2RlLm1vZGUpIHsKLQkJCQljYXNlIFZJRF9QTEFZX1ZJRF9PVVRfTU9ERToKLQkJCQkJaWYgKHBtb2RlLnAxICE9IFZJREVPX01PREVfTlRTQyAmJgorCQkJY2FzZSBWSURfUExBWV9WSURfT1VUX01PREU6CisJCQkJaWYgKHBtb2RlLnAxICE9IFZJREVPX01PREVfTlRTQyAmJgogCQkJCQkJcG1vZGUucDEgIT0gVklERU9fTU9ERV9QQUwpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCXNldF9vdXRfZm9ybWF0KHNhYSwgcG1vZGUucDEpOworCQkJCXJldHVybiAwOworCQkJY2FzZSBWSURfUExBWV9HRU5MT0NLOgorCQkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgWElMSU5YX0NUTDAsCisJCQkJCXBtb2RlLnAxID8gMHg4MDAwIDogMHg4MDgwLCAyKTsKKwkJCQlpZiAoTmV3Q2FyZCkKKwkJCQkJc2V0X2dlbmxvY2tfb2Zmc2V0KHNhYSwgcG1vZGUucDIpOworCQkJCXJldHVybiAwOworCQkJY2FzZSBWSURfUExBWV9OT1JNQUw6CisJCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLAorCQkJCQlJQk1fTVAyX0NISVBfQ09OVFJPTCwgQ2hpcENvbnRyb2wsIDIpOworCQkJCWlibV9zZW5kX2NvbW1hbmQoc2FhLCBJQk1fTVAyX1BMQVksIDAsIDApOworCQkJCXNhYS0+cGxheW1vZGUgPSBwbW9kZS5tb2RlOworCQkJCXJldHVybiAwOworCQkJY2FzZSBWSURfUExBWV9QQVVTRToKKwkJCQkvKiBJQk0gcmVtb3ZlZCB0aGUgUEFVU0UgY29tbWFuZCAqLworCQkJCS8qIHRoZXkgc2F5IHVzZSBTSU5HTEVfRlJBTUUgbm93ICovCisJCQljYXNlIFZJRF9QTEFZX1NJTkdMRV9GUkFNRToKKwkJCQlpYm1fc2VuZF9jb21tYW5kKHNhYSwgSUJNX01QMl9TSU5HTEVfRlJBTUUsMCwwKTsKKwkJCQlpZiAoc2FhLT5wbGF5bW9kZSA9PSBwbW9kZS5tb2RlKSB7CisJCQkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwKKwkJCQkJCUlCTV9NUDJfQ0hJUF9DT05UUk9MLAorCQkJCQkJQ2hpcENvbnRyb2wsIDIpOworCQkJCX0KKwkJCQlzYWEtPnBsYXltb2RlID0gcG1vZGUubW9kZTsKKwkJCQlyZXR1cm4gMDsKKwkJCWNhc2UgVklEX1BMQVlfRkFTVF9GT1JXQVJEOgorCQkJCWlibV9zZW5kX2NvbW1hbmQoc2FhLCBJQk1fTVAyX0ZBU1RfRk9SV0FSRCwwLDApOworCQkJCXNhYS0+cGxheW1vZGUgPSBwbW9kZS5tb2RlOworCQkJCXJldHVybiAwOworCQkJY2FzZSBWSURfUExBWV9TTE9XX01PVElPTjoKKwkJCQlpYm1fc2VuZF9jb21tYW5kKHNhYSwgSUJNX01QMl9TTE9XX01PVElPTiwKKwkJCQkJcG1vZGUucDEsIDApOworCQkJCXNhYS0+cGxheW1vZGUgPSBwbW9kZS5tb2RlOworCQkJCXJldHVybiAwOworCQkJY2FzZSBWSURfUExBWV9JTU1FRElBVEVfTk9STUFMOgorCQkJCS8qIGVuc3VyZSB0cmFuc2ZlcnMgcmVzdW1lICovCisJCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLAorCQkJCQlJQk1fTVAyX0NISVBfQ09OVFJPTCwgQ2hpcENvbnRyb2wsIDIpOworCQkJCWlibV9zZW5kX2NvbW1hbmQoc2FhLCBJQk1fTVAyX0lNRURfTk9STV9QTEFZLAorCQkJCQkwLCAwKTsKKwkJCQlzYWEtPnBsYXltb2RlID0gVklEX1BMQVlfTk9STUFMOworCQkJCXJldHVybiAwOworCQkJY2FzZSBWSURfUExBWV9TV0lUQ0hfQ0hBTk5FTFM6CisJCQkJc2FhLT5hdWRoZWFkID0gc2FhLT5hdWR0YWlsID0gMDsKKwkJCQlzYWEtPnZpZGhlYWQgPSBzYWEtPnZpZHRhaWwgPSAwOworCQkJCWlibV9zZW5kX2NvbW1hbmQoc2FhLCBJQk1fTVAyX0ZSRUVaRV9GUkFNRSwwLDEpOworCQkJCWlibV9zZW5kX2NvbW1hbmQoc2FhLCBJQk1fTVAyX1JFU0VUX0FVRF9SQVRFLAorCQkJCQkwLCAxKTsKKwkJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsIElCTV9NUDJfQ0hJUF9DT05UUk9MLAorCQkJCQkwLCAyKTsKKwkJCQlpYm1fc2VuZF9jb21tYW5kKHNhYSwgSUJNX01QMl9DSEFOTkVMX1NXSVRDSCwKKwkJCQkJMCwgMSk7CisJCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLCBJQk1fTVAyX0NISVBfQ09OVFJPTCwKKwkJCQkJQ2hpcENvbnRyb2wsIDIpOworCQkJCWlibV9zZW5kX2NvbW1hbmQoc2FhLCBJQk1fTVAyX1BMQVksIDAsIDApOworCQkJCXNhYS0+cGxheW1vZGUgPSBWSURfUExBWV9OT1JNQUw7CisJCQkJcmV0dXJuIDA7CisJCQljYXNlIFZJRF9QTEFZX0ZSRUVaRV9GUkFNRToKKwkJCQlpYm1fc2VuZF9jb21tYW5kKHNhYSwgSUJNX01QMl9GUkVFWkVfRlJBTUUsMCwwKTsKKwkJCQlzYWEtPnBsYXltb2RlID0gcG1vZGUubW9kZTsKKwkJCQlyZXR1cm4gMDsKKwkJCWNhc2UgVklEX1BMQVlfU1RJTExfTU9ERToKKwkJCQlpYm1fc2VuZF9jb21tYW5kKHNhYSwgSUJNX01QMl9TRVRfU1RJTExfTU9ERSwKKwkJCQkJMCwgMCk7CisJCQkJc2FhLT5wbGF5bW9kZSA9IHBtb2RlLm1vZGU7CisJCQkJcmV0dXJuIDA7CisJCQljYXNlIFZJRF9QTEFZX01BU1RFUl9NT0RFOgorCQkJCWlmIChwbW9kZS5wMSA9PSBWSURfUExBWV9NQVNURVJfTk9ORSkKKwkJCQkJc2FhLT5ib2FyZGNmZ1sxXSA9IDB4MTM7CisJCQkJZWxzZSBpZiAocG1vZGUucDEgPT0gVklEX1BMQVlfTUFTVEVSX1ZJREVPKQorCQkJCQlzYWEtPmJvYXJkY2ZnWzFdID0gMHgyMzsKKwkJCQllbHNlIGlmIChwbW9kZS5wMSA9PSBWSURfUExBWV9NQVNURVJfQVVESU8pCisJCQkJCXNhYS0+Ym9hcmRjZmdbMV0gPSAweDQzOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLAorCQkJCQkgIElCTV9NUDJfQ0hJUF9DT05UUk9MLCBDaGlwQ29udHJvbCwgMik7CisJCQkJcmV0dXJuIDA7CisJCQljYXNlIFZJRF9QTEFZX0FDVElWRV9TQ0FOTElORVM6CisJCQkJaWYgKEN1cnJlbnRNb2RlID09IFZJREVPX01PREVfUEFMKSB7CisJCQkJCWlmIChwbW9kZS5wMSA8IDEgfHwgcG1vZGUucDIgPiA2MjUpCiAJCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQkJc2V0X291dF9mb3JtYXQoc2FhLCBwbW9kZS5wMSk7Ci0JCQkJCXJldHVybiAwOwotCQkJCWNhc2UgVklEX1BMQVlfR0VOTE9DSzoKLQkJCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLAotCQkJCQkJICBYSUxJTlhfQ1RMMCwKLQkJCQkJCSAgKHBtb2RlLnAxID8gMHg4MDAwIDogMHg4MDgwKSwKLQkJCQkJCSAgMik7Ci0JCQkJCWlmIChOZXdDYXJkKQotCQkJCQkJc2V0X2dlbmxvY2tfb2Zmc2V0KHNhYSwKLQkJCQkJCQlwbW9kZS5wMik7Ci0JCQkJCXJldHVybiAwOwotCQkJCWNhc2UgVklEX1BMQVlfTk9STUFMOgotCQkJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsCi0JCQkJCQlJQk1fTVAyX0NISVBfQ09OVFJPTCwKLQkJCQkJCUNoaXBDb250cm9sLCAyKTsKLQkJCQkJaWJtX3NlbmRfY29tbWFuZChzYWEsCi0JCQkJCQlJQk1fTVAyX1BMQVksIDAsIDApOwotCQkJCQlzYWEtPnBsYXltb2RlID0gcG1vZGUubW9kZTsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJY2FzZSBWSURfUExBWV9QQVVTRToKLQkJCQkJLyogSUJNIHJlbW92ZWQgdGhlIFBBVVNFIGNvbW1hbmQgKi8KLQkJCQkJLyogdGhleSBzYXkgdXNlIFNJTkdMRV9GUkFNRSBub3cgKi8KLQkJCQljYXNlIFZJRF9QTEFZX1NJTkdMRV9GUkFNRToKLQkJCQkJaWJtX3NlbmRfY29tbWFuZChzYWEsCi0JCQkJCQkJSUJNX01QMl9TSU5HTEVfRlJBTUUsCi0JCQkJCQkJMCwgMCk7Ci0JCQkJCWlmIChzYWEtPnBsYXltb2RlID09IHBtb2RlLm1vZGUpIHsKLQkJCQkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwKLQkJCQkJCQlJQk1fTVAyX0NISVBfQ09OVFJPTCwKLQkJCQkJCQlDaGlwQ29udHJvbCwgMik7Ci0JCQkJCX0KLQkJCQkJc2FhLT5wbGF5bW9kZSA9IHBtb2RlLm1vZGU7Ci0JCQkJCXJldHVybiAwOwotCQkJCWNhc2UgVklEX1BMQVlfRkFTVF9GT1JXQVJEOgotCQkJCQlpYm1fc2VuZF9jb21tYW5kKHNhYSwKLQkJCQkJCUlCTV9NUDJfRkFTVF9GT1JXQVJELCAwLCAwKTsKLQkJCQkJc2FhLT5wbGF5bW9kZSA9IHBtb2RlLm1vZGU7Ci0JCQkJCXJldHVybiAwOwotCQkJCWNhc2UgVklEX1BMQVlfU0xPV19NT1RJT046Ci0JCQkJCWlibV9zZW5kX2NvbW1hbmQoc2FhLAotCQkJCQkJSUJNX01QMl9TTE9XX01PVElPTiwKLQkJCQkJCXBtb2RlLnAxLCAwKTsKLQkJCQkJc2FhLT5wbGF5bW9kZSA9IHBtb2RlLm1vZGU7Ci0JCQkJCXJldHVybiAwOwotCQkJCWNhc2UgVklEX1BMQVlfSU1NRURJQVRFX05PUk1BTDoKLQkJCQkJLyogZW5zdXJlIHRyYW5zZmVycyByZXN1bWUgKi8KLQkJCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLAotCQkJCQkJSUJNX01QMl9DSElQX0NPTlRST0wsCi0JCQkJCQlDaGlwQ29udHJvbCwgMik7Ci0JCQkJCWlibV9zZW5kX2NvbW1hbmQoc2FhLAotCQkJCQkJSUJNX01QMl9JTUVEX05PUk1fUExBWSwgMCwgMCk7Ci0JCQkJCXNhYS0+cGxheW1vZGUgPSBWSURfUExBWV9OT1JNQUw7Ci0JCQkJCXJldHVybiAwOwotCQkJCWNhc2UgVklEX1BMQVlfU1dJVENIX0NIQU5ORUxTOgotCQkJCQlzYWEtPmF1ZGhlYWQgPSBzYWEtPmF1ZHRhaWwgPSAwOwotCQkJCQlzYWEtPnZpZGhlYWQgPSBzYWEtPnZpZHRhaWwgPSAwOwotCQkJCQlpYm1fc2VuZF9jb21tYW5kKHNhYSwKLQkJCQkJCUlCTV9NUDJfRlJFRVpFX0ZSQU1FLCAwLCAxKTsKLQkJCQkJaWJtX3NlbmRfY29tbWFuZChzYWEsCi0JCQkJCQlJQk1fTVAyX1JFU0VUX0FVRF9SQVRFLCAwLCAxKTsKLQkJCQkJZGViaXdyaXRlKHNhYSwgZGViTm9ybWFsLAotCQkJCQkJSUJNX01QMl9DSElQX0NPTlRST0wsIDAsIDIpOwotCQkJCQlpYm1fc2VuZF9jb21tYW5kKHNhYSwKLQkJCQkJCUlCTV9NUDJfQ0hBTk5FTF9TV0lUQ0gsIDAsIDEpOwotCQkJCQlkZWJpd3JpdGUoc2FhLCBkZWJOb3JtYWwsCi0JCQkJCQlJQk1fTVAyX0NISVBfQ09OVFJPTCwKLQkJCQkJCUNoaXBDb250cm9sLCAyKTsKLQkJCQkJaWJtX3NlbmRfY29tbWFuZChzYWEsCi0JCQkJCQlJQk1fTVAyX1BMQVksIDAsIDApOwotCQkJCQlzYWEtPnBsYXltb2RlID0gVklEX1BMQVlfTk9STUFMOwotCQkJCQlyZXR1cm4gMDsKLQkJCQljYXNlIFZJRF9QTEFZX0ZSRUVaRV9GUkFNRToKLQkJCQkJaWJtX3NlbmRfY29tbWFuZChzYWEsCi0JCQkJCQlJQk1fTVAyX0ZSRUVaRV9GUkFNRSwgMCwgMCk7Ci0JCQkJCXNhYS0+cGxheW1vZGUgPSBwbW9kZS5tb2RlOwotCQkJCQlyZXR1cm4gMDsKLQkJCQljYXNlIFZJRF9QTEFZX1NUSUxMX01PREU6Ci0JCQkJCWlibV9zZW5kX2NvbW1hbmQoc2FhLAotCQkJCQkJSUJNX01QMl9TRVRfU1RJTExfTU9ERSwgMCwgMCk7Ci0JCQkJCXNhYS0+cGxheW1vZGUgPSBwbW9kZS5tb2RlOwotCQkJCQlyZXR1cm4gMDsKLQkJCQljYXNlIFZJRF9QTEFZX01BU1RFUl9NT0RFOgotCQkJCQlpZiAocG1vZGUucDEgPT0gVklEX1BMQVlfTUFTVEVSX05PTkUpCi0JCQkJCQlzYWEtPmJvYXJkY2ZnWzFdID0gMHgxMzsKLQkJCQkJZWxzZSBpZiAocG1vZGUucDEgPT0KLQkJCQkJCVZJRF9QTEFZX01BU1RFUl9WSURFTykKLQkJCQkJCXNhYS0+Ym9hcmRjZmdbMV0gPSAweDIzOwotCQkJCQllbHNlIGlmIChwbW9kZS5wMSA9PQotCQkJCQkJVklEX1BMQVlfTUFTVEVSX0FVRElPKQotCQkJCQkJc2FhLT5ib2FyZGNmZ1sxXSA9IDB4NDM7Ci0JCQkJCWVsc2UKKwkJCQkJc2FhLT5ib2FyZGNmZ1s1XSA9IHBtb2RlLnAxOworCQkJCQlzYWEtPmJvYXJkY2ZnWzU1XSA9IChwbW9kZS5wMSArCisJCQkJCQkocG1vZGUucDIgLyAyKSAtIDEpICYgMHhmZjsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAocG1vZGUucDEgPCA0IHx8IHBtb2RlLnAyID4gNTI1KQogCQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwKLQkJCQkJCUlCTV9NUDJfQ0hJUF9DT05UUk9MLAotCQkJCQkJQ2hpcENvbnRyb2wsIDIpOwotCQkJCQlyZXR1cm4gMDsKLQkJCQljYXNlIFZJRF9QTEFZX0FDVElWRV9TQ0FOTElORVM6Ci0JCQkJCWlmIChDdXJyZW50TW9kZSA9PSBWSURFT19NT0RFX1BBTCkgewotCQkJCQkJaWYgKHBtb2RlLnAxIDwgMSB8fAotCQkJCQkJCXBtb2RlLnAyID4gNjI1KQotCQkJCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCQkJc2FhLT5ib2FyZGNmZ1s1XSA9IHBtb2RlLnAxOwotCQkJCQkJc2FhLT5ib2FyZGNmZ1s1NV0gPSAocG1vZGUucDEgKwotCQkJCQkJCShwbW9kZS5wMi8yKSAtIDEpICYJCi0JCQkJCQkJMHhmZjsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChwbW9kZS5wMSA8IDQgfHwKLQkJCQkJCQlwbW9kZS5wMiA+IDUyNSkKLQkJCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQkJCXNhYS0+Ym9hcmRjZmdbNF0gPSBwbW9kZS5wMTsKLQkJCQkJCXNhYS0+Ym9hcmRjZmdbNTRdID0gKHBtb2RlLnAxICsKLQkJCQkJCQkocG1vZGUucDIvMikgLSA0KSAmCi0JCQkJCQkJMHhmZjsKLQkJCQkJfQotCQkJCQlzZXRfb3V0X2Zvcm1hdChzYWEsIEN1cnJlbnRNb2RlKTsKLQkJCQljYXNlIFZJRF9QTEFZX1JFU0VUOgotCQkJCQlyZXR1cm4gZG9faWJtX3Jlc2V0KHNhYSk7Ci0JCQkJY2FzZSBWSURfUExBWV9FTkRfTUFSSzoKLQkJCQkJaWYgKHNhYS0+ZW5kbWFya3RhaWwgPCAgCi0JCQkJCQlzYWEtPmVuZG1hcmtoZWFkKSB7Ci0JCQkJCQlpZiAoc2FhLT5lbmRtYXJraGVhZCAtCisJCQkJCXNhYS0+Ym9hcmRjZmdbNF0gPSBwbW9kZS5wMTsKKwkJCQkJc2FhLT5ib2FyZGNmZ1s1NF0gPSAocG1vZGUucDEgKworCQkJCQkJKHBtb2RlLnAyIC8gMikgLSA0KSAmIDB4ZmY7CisJCQkJfQorCQkJCXNldF9vdXRfZm9ybWF0KHNhYSwgQ3VycmVudE1vZGUpOworCQkJY2FzZSBWSURfUExBWV9SRVNFVDoKKwkJCQlyZXR1cm4gZG9faWJtX3Jlc2V0KHNhYSk7CisJCQljYXNlIFZJRF9QTEFZX0VORF9NQVJLOgorCQkJCWlmIChzYWEtPmVuZG1hcmt0YWlsIDwgc2FhLT5lbmRtYXJraGVhZCkgeworCQkJCQlpZiAoc2FhLT5lbmRtYXJraGVhZCAtCiAJCQkJCQkJc2FhLT5lbmRtYXJrdGFpbCA8IDIpCi0JCQkJCQkJcmV0dXJuIC1FTk9TUEM7Ci0JCQkJCX0gZWxzZSBpZiAoc2FhLT5lbmRtYXJraGVhZCA8PQotCQkJCQkJc2FhLT5lbmRtYXJrdGFpbCkgewotCQkJCQkJaWYgKHNhYS0+ZW5kbWFya3RhaWwgLQotCQkJCQkJCXNhYS0+ZW5kbWFya2hlYWQgPgotCQkJCQkJCShNQVhfTUFSS1MgLSAyKSkKLQkJCQkJCQlyZXR1cm4gLUVOT1NQQzsKLQkJCQkJfSBlbHNlCiAJCQkJCQlyZXR1cm4gLUVOT1NQQzsKLQkJCQkJc2FhLT5lbmRtYXJrW3NhYS0+ZW5kbWFya3RhaWxdID0KLQkJCQkJCXNhYS0+YXVkdGFpbDsKLQkJCQkJc2FhLT5lbmRtYXJrdGFpbCsrOwotCQkJCQlpZiAoc2FhLT5lbmRtYXJrdGFpbCA+PSBNQVhfTUFSS1MpCi0JCQkJCQlzYWEtPmVuZG1hcmt0YWlsID0gMDsKKwkJCQl9IGVsc2UgaWYgKHNhYS0+ZW5kbWFya2hlYWQgPD1zYWEtPmVuZG1hcmt0YWlsKXsKKwkJCQkJaWYgKHNhYS0+ZW5kbWFya3RhaWwgLSBzYWEtPmVuZG1hcmtoZWFkCisJCQkJCQkJPiAoTUFYX01BUktTIC0gMikpCisJCQkJCQlyZXR1cm4gLUVOT1NQQzsKKwkJCQl9IGVsc2UKKwkJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQkJc2FhLT5lbmRtYXJrW3NhYS0+ZW5kbWFya3RhaWxdID0gc2FhLT5hdWR0YWlsOworCQkJCXNhYS0+ZW5kbWFya3RhaWwrKzsKKwkJCQlpZiAoc2FhLT5lbmRtYXJrdGFpbCA+PSBNQVhfTUFSS1MpCisJCQkJCXNhYS0+ZW5kbWFya3RhaWwgPSAwOwogCQkJfQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAljYXNlIFZJRElPQ1NXUklURU1PREU6CiAJCXsKIAkJCWludCBtb2RlOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopICZtb2RlLCBhcmcsIHNpemVvZihpbnQpKSkKLQkJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmbW9kZSwgYXJnLCBzaXplb2YoaW50KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQlpZiAobW9kZSA9PSBWSURfV1JJVEVfTVBFR19BVUQgfHwKLQkJCSAgICBtb2RlID09IFZJRF9XUklURV9NUEVHX1ZJRCB8fAotCQkJICAgIG1vZGUgPT0gVklEX1dSSVRFX0NDIHx8Ci0JCQkgICAgbW9kZSA9PSBWSURfV1JJVEVfVFRYIHx8Ci0JCQkgICAgbW9kZSA9PSBWSURfV1JJVEVfT1NEKSB7CisJCQkJCW1vZGUgPT0gVklEX1dSSVRFX01QRUdfVklEIHx8CisJCQkJCW1vZGUgPT0gVklEX1dSSVRFX0NDIHx8CisJCQkJCW1vZGUgPT0gVklEX1dSSVRFX1RUWCB8fAorCQkJCQltb2RlID09IFZJRF9XUklURV9PU0QpIHsKIAkJCQlzYWEtPndyaXRlbW9kZSA9IG1vZGU7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CkBAIC0xNzUwLDcgKzE2ODgsNyBAQAogCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ1Y29kZSwgYXJnLCBzaXplb2YodWNvZGUpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCWlmICh1Y29kZS5kYXRhc2l6ZSA+IDY1NTM2IHx8IHVjb2RlLmRhdGFzaXplIDwgMTAyNCB8fAotCQkJICAgIHN0cm5jbXAodWNvZGUubG9hZHdoYXQsICJkZWMiLCAzKSkKKwkJCQkJc3RybmNtcCh1Y29kZS5sb2Fkd2hhdCwgImRlYyIsIDMpKQogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJaWYgKCh1ZGF0YSA9IHZtYWxsb2ModWNvZGUuZGF0YXNpemUpKSA9PSBOVUxMKQogCQkJCXJldHVybiAtRU5PTUVNOwpAQCAtMTc1OSw4ICsxNjk3LDggQEAKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCX0KIAkJCXVjb2RlLmRhdGEgPSB1ZGF0YTsKLQkJCWlmICghc3RybmNtcCh1Y29kZS5sb2Fkd2hhdCwgImRlY29kZXIuYXVkIiwgMTEpCi0JCQkJfHwgIXN0cm5jbXAodWNvZGUubG9hZHdoYXQsICJkZWNvZGVyLnZpZCIsIDExKSkKKwkJCWlmICghc3RybmNtcCh1Y29kZS5sb2Fkd2hhdCwgImRlY29kZXIuYXVkIiwgMTEpIHx8CisJCQkJIXN0cm5jbXAodWNvZGUubG9hZHdoYXQsICJkZWNvZGVyLnZpZCIsIDExKSkKIAkJCQlpID0gaW5pdGlhbGl6ZV9pYm1tcGVnMigmdWNvZGUpOwogCQkJZWxzZQogCQkJCWkgPSBpbml0aWFsaXplX2ZwZ2EoJnVjb2RlKTsKQEAgLTE4MDUsMTQgKzE3NDMsMTQgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2FhX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3N0YXRpYyBzc2l6ZV90IHNhYV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwlzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCiB7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNhYV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3N0YXRpYyBzc2l6ZV90IHNhYV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsCisJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQogewogCXN0cnVjdCBzYWE3MTQ2ICpzYWEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgbG9uZyB0b2RvID0gY291bnQ7CkBAIC0xODIzLDIwICsxNzYxLDIyIEBACiAJCWlmIChzYWEtPndyaXRlbW9kZSA9PSBWSURfV1JJVEVfTVBFR19BVUQpIHsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZzYWEtPmxvY2ssIGZsYWdzKTsKIAkJCWlmIChzYWEtPmF1ZGhlYWQgPD0gc2FhLT5hdWR0YWlsKQotCQkJCWJsb2Nrc2l6ZSA9IDY1NTM2LShzYWEtPmF1ZHRhaWwgLSBzYWEtPmF1ZGhlYWQpOworCQkJCWJsb2Nrc2l6ZSA9IDY1NTM2IC0KKwkJCQkJKHNhYS0+YXVkdGFpbCAtIHNhYS0+YXVkaGVhZCk7CiAJCQllbHNlCiAJCQkJYmxvY2tzaXplID0gc2FhLT5hdWRoZWFkIC0gc2FhLT5hdWR0YWlsOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2FhLT5sb2NrLCBmbGFncyk7CiAJCQlpZiAoYmxvY2tzaXplIDwgMTYzODQpIHsKIAkJCQlzYWF3cml0ZShTQUE3MTQ2X1BTUl9ERUJJX1MgfAotCQkJCQkgU0FBNzE0Nl9QU1JfUElOMSwgU0FBNzE0Nl9JRVIpOworCQkJCQlTQUE3MTQ2X1BTUl9QSU4xLCBTQUE3MTQ2X0lFUik7CiAJCQkJc2Fhd3JpdGUoU0FBNzE0Nl9QU1JfUElOMSwgU0FBNzE0Nl9QU1IpOwogCQkJCS8qIHdhaXQgZm9yIGJ1ZmZlciBzcGFjZSB0byBvcGVuICovCiAJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmc2FhLT5hdWRxKTsKIAkJCX0KIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZzYWEtPmxvY2ssIGZsYWdzKTsKIAkJCWlmIChzYWEtPmF1ZGhlYWQgPD0gc2FhLT5hdWR0YWlsKSB7Ci0JCQkJYmxvY2tzaXplID0gNjU1MzYtKHNhYS0+YXVkdGFpbCAtIHNhYS0+YXVkaGVhZCk7CisJCQkJYmxvY2tzaXplID0gNjU1MzYgLQorCQkJCQkoc2FhLT5hdWR0YWlsIC0gc2FhLT5hdWRoZWFkKTsKIAkJCQlzcGxpdCA9IDY1NTM2IC0gc2FhLT5hdWR0YWlsOwogCQkJfSBlbHNlIHsKIAkJCQlibG9ja3NpemUgPSBzYWEtPmF1ZGhlYWQgLSBzYWEtPmF1ZHRhaWw7CkBAIC0xODUxLDcgKzE3OTEsNyBAQAogCQkJCXJldHVybiAtRU5PU1BDOwogCQkJaWYgKHNwbGl0IDwgYmxvY2tzaXplKSB7CiAJCQkJaWYgKGNvcHlfZnJvbV91c2VyKHNhYS0+YXVkYnVmICsKLQkJCQkJc2FhLT5hdWR0YWlsLCBidWYsIHNwbGl0KSkgCisJCQkJCQlzYWEtPmF1ZHRhaWwsIGJ1Ziwgc3BsaXQpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCQlidWYgKz0gc3BsaXQ7CiAJCQkJdG9kbyAtPSBzcGxpdDsKQEAgLTE4NTksNyArMTc5OSw3IEBACiAJCQkJc2FhLT5hdWR0YWlsID0gMDsKIAkJCX0KIAkJCWlmIChjb3B5X2Zyb21fdXNlcihzYWEtPmF1ZGJ1ZiArIHNhYS0+YXVkdGFpbCwgYnVmLAotCQkJCWJsb2Nrc2l6ZSkpIAorCQkJCQlibG9ja3NpemUpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJc2FhLT5hdWR0YWlsICs9IGJsb2Nrc2l6ZTsKIAkJCXRvZG8gLT0gYmxvY2tzaXplOwpAQCAtMTg2OCwyMCArMTgwOCwyMiBAQAogCQl9IGVsc2UgaWYgKHNhYS0+d3JpdGVtb2RlID09IFZJRF9XUklURV9NUEVHX1ZJRCkgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNhYS0+bG9jaywgZmxhZ3MpOwogCQkJaWYgKHNhYS0+dmlkaGVhZCA8PSBzYWEtPnZpZHRhaWwpCi0JCQkJYmxvY2tzaXplPTUyNDI4OC0oc2FhLT52aWR0YWlsIC0gc2FhLT52aWRoZWFkKTsKKwkJCQlibG9ja3NpemUgPSA1MjQyODggLQorCQkJCQkoc2FhLT52aWR0YWlsIC0gc2FhLT52aWRoZWFkKTsKIAkJCWVsc2UKIAkJCQlibG9ja3NpemUgPSBzYWEtPnZpZGhlYWQgLSBzYWEtPnZpZHRhaWw7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYWEtPmxvY2ssIGZsYWdzKTsKIAkJCWlmIChibG9ja3NpemUgPCA2NTUzNikgewogCQkJCXNhYXdyaXRlKFNBQTcxNDZfUFNSX0RFQklfUyB8Ci0JCQkJCSBTQUE3MTQ2X1BTUl9QSU4xLCBTQUE3MTQ2X0lFUik7CisJCQkJCVNBQTcxNDZfUFNSX1BJTjEsIFNBQTcxNDZfSUVSKTsKIAkJCQlzYWF3cml0ZShTQUE3MTQ2X1BTUl9QSU4xLCBTQUE3MTQ2X1BTUik7CiAJCQkJLyogd2FpdCBmb3IgYnVmZmVyIHNwYWNlIHRvIG9wZW4gKi8KIAkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZzYWEtPnZpZHEpOwogCQkJfQogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNhYS0+bG9jaywgZmxhZ3MpOwogCQkJaWYgKHNhYS0+dmlkaGVhZCA8PSBzYWEtPnZpZHRhaWwpIHsKLQkJCQlibG9ja3NpemU9NTI0Mjg4LShzYWEtPnZpZHRhaWwgLSBzYWEtPnZpZGhlYWQpOworCQkJCWJsb2Nrc2l6ZSA9IDUyNDI4OCAtCisJCQkJCShzYWEtPnZpZHRhaWwgLSBzYWEtPnZpZGhlYWQpOwogCQkJCXNwbGl0ID0gNTI0Mjg4IC0gc2FhLT52aWR0YWlsOwogCQkJfSBlbHNlIHsKIAkJCQlibG9ja3NpemUgPSBzYWEtPnZpZGhlYWQgLSBzYWEtPnZpZHRhaWw7CkBAIC0xODk2LDcgKzE4MzgsNyBAQAogCQkJCXJldHVybiAtRU5PU1BDOwogCQkJaWYgKHNwbGl0IDwgYmxvY2tzaXplKSB7CiAJCQkJaWYgKGNvcHlfZnJvbV91c2VyKHNhYS0+dmlkYnVmICsKLQkJCQkJc2FhLT52aWR0YWlsLCBidWYsIHNwbGl0KSkgCisJCQkJCQlzYWEtPnZpZHRhaWwsIGJ1Ziwgc3BsaXQpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCQlidWYgKz0gc3BsaXQ7CiAJCQkJdG9kbyAtPSBzcGxpdDsKQEAgLTE5MDQsNyArMTg0Niw3IEBACiAJCQkJc2FhLT52aWR0YWlsID0gMDsKIAkJCX0KIAkJCWlmIChjb3B5X2Zyb21fdXNlcihzYWEtPnZpZGJ1ZiArIHNhYS0+dmlkdGFpbCwgYnVmLAotCQkJCWJsb2Nrc2l6ZSkpIAorCQkJCQlibG9ja3NpemUpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJc2FhLT52aWR0YWlsICs9IGJsb2Nrc2l6ZTsKIAkJCXRvZG8gLT0gYmxvY2tzaXplOwpAQCAtMTkyMiw4ICsxODY0LDggQEAKIAkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9PU0RfTElOS19BRERSLCAwLCAyKTsKIAkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9NQVNLMCwgMHhjMDBkLCAyKTsKIAkJCWRlYml3cml0ZShzYWEsIGRlYk5vcm1hbCwgSUJNX01QMl9ESVNQX01PREUsCi0JCQkJICBkZWJpcmVhZChzYWEsIGRlYk5vcm1hbCwKLQkJCQkgIElCTV9NUDJfRElTUF9NT0RFLCAyKSB8IDEsIDIpOworCQkJCWRlYmlyZWFkKHNhYSwgZGViTm9ybWFsLAorCQkJCQlJQk1fTVAyX0RJU1BfTU9ERSwgMikgfCAxLCAyKTsKIAkJCS8qIHRyaWdnZXIgb3NkIGRhdGEgdHJhbnNmZXIgKi8KIAkJCXNhYXdyaXRlKFNBQTcxNDZfUFNSX0RFQklfUyB8CiAJCQkJIFNBQTcxNDZfUFNSX1BJTjEsIFNBQTcxNDZfSUVSKTsKQEAgLTE5MzUsMjEgKzE4NzcsMTEgQEAKIAogc3RhdGljIGludCBzYWFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3Qgc2FhNzE0NiAqc2FhID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwotCWludCBpOworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBzYWE3MTQ2ICpzYWEgPSBjb250YWluZXJfb2YodmRldiwgc3RydWN0IHNhYTcxNDYsIHZpZGVvX2Rldik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgU0FBNzE0Nl9NQVg7IGkrKykgewotCQlpZiAoc2FhNzE0NnNbaV0udmlkZW9fZGV2Lm1pbm9yID09IG1pbm9yKSB7Ci0JCQlzYWEgPSAmc2FhNzE0NnNbaV07Ci0JCX0KLQl9Ci0JaWYgKHNhYSA9PSBOVUxMKSB7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBzYWE7CiAKLQkvL3NhYS0+dmlkZW9fZGV2LmJ1c3kgPSAwOyAvKiBvbGQgaGFjayB0byBzdXBwb3J0IG11bHRpcGxlIG9wZW4gKi8KIAlzYWEtPnVzZXIrKzsKIAlpZiAoc2FhLT51c2VyID4gMSkKIAkJcmV0dXJuIDA7CS8qIGRldmljZSBvcGVuIGFscmVhZHksIGRvbid0IHJlc2V0ICovCkBAIC0xOTYxLDQyICsxODkzLDM5IEBACiB7CiAJc3RydWN0IHNhYTcxNDYgKnNhYSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzYWEtPnVzZXItLTsKLQkvL3NhYS0+dmlkZW9fZGV2LmJ1c3kgPSAwOyAvKiBvbGQgaGFjayB0byBzdXBwb3J0IG11bHRpcGxlIG9wZW4gKi8KKwogCWlmIChzYWEtPnVzZXIgPiAwKQkvKiBzdGlsbCBzb21lb25lIHVzaW5nIGRldmljZSAqLwogCQlyZXR1cm4gMDsKIAlzYWF3cml0ZSgweDAwN2YwMDAwLCBTQUE3MTQ2X01DMSk7CS8qIHN0b3AgYWxsIG92ZXJsYXkgZG1hICovCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNhYV9mb3BzID0KLXsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gc2FhX29wZW4sCi0JLnJlbGVhc2UJPSBzYWFfcmVsZWFzZSwKLQkuaW9jdGwJCT0gc2FhX2lvY3RsLAotCS5yZWFkCQk9IHNhYV9yZWFkLAotCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAotCS53cml0ZQkJPSBzYWFfd3JpdGUsCi0JLm1tYXAJCT0gc2FhX21tYXAsCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzYWFfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IHNhYV9vcGVuLAorCS5yZWxlYXNlID0gc2FhX3JlbGVhc2UsCisJLmlvY3RsID0gc2FhX2lvY3RsLAorCS5jb21wYXRfaW9jdGwgPSB2NGxfY29tcGF0X2lvY3RsMzIsCisJLnJlYWQgPSBzYWFfcmVhZCwKKwkubGxzZWVrID0gbm9fbGxzZWVrLAorCS53cml0ZSA9IHNhYV93cml0ZSwKKwkubW1hcCA9IHNhYV9tbWFwLAogfTsKIAogLyogdGVtcGxhdGUgZm9yIHZpZGVvX2RldmljZS1zdHJ1Y3R1cmUgKi8KLXN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHNhYV90ZW1wbGF0ZSA9Ci17Ci0JLm5hbWUJCT0gIlNBQTcxNDZBIiwKLQkudHlwZQkJPSBWSURfVFlQRV9DQVBUVVJFIHwgVklEX1RZUEVfT1ZFUkxBWSwKLQkuaGFyZHdhcmUJPSBWSURfSEFSRFdBUkVfU0FBNzE0NiwKLQkuZm9wcwkJPSAmc2FhX2ZvcHMsCi0JLm1pbm9yCQk9IC0xLAorc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2Ugc2FhX3RlbXBsYXRlID0geworCS5uYW1lID0gIlNBQTcxNDZBIiwKKwkudHlwZSA9IFZJRF9UWVBFX0NBUFRVUkUgfCBWSURfVFlQRV9PVkVSTEFZLAorCS5oYXJkd2FyZSA9IFZJRF9IQVJEV0FSRV9TQUE3MTQ2LAorCS5mb3BzID0gJnNhYV9mb3BzLAorCS5taW5vciA9IC0xLAogfTsKIAotc3RhdGljIGludCBjb25maWd1cmVfc2FhNzE0NihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbnVtKQorc3RhdGljIGludCBfX2RldmluaXQgY29uZmlndXJlX3NhYTcxNDYoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBudW0pCiB7Ci0JaW50IHJlc3VsdDsKLQlzdHJ1Y3Qgc2FhNzE0NiAqc2FhOworCWludCByZXR2YWw7CisJc3RydWN0IHNhYTcxNDYgKnNhYSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCXNhYSA9ICZzYWE3MTQ2c1tudW1dOwotCQogCXNhYS0+ZW5kbWFya2hlYWQgPSBzYWEtPmVuZG1hcmt0YWlsID0gMDsKIAlzYWEtPndpbi54ID0gc2FhLT53aW4ueSA9IDA7CiAJc2FhLT53aW4ud2lkdGggPSBzYWEtPndpbi5jcm9wd2lkdGggPSA3MjA7CkBAIC0yMDEyLDcgKzE5NDEsNiBAQAogCXNhYS0+cGljdHVyZS5jb250cmFzdCA9IDM4NzY4OwogCXNhYS0+cGljdHVyZS5jb2xvdXIgPSAzMjc2ODsKIAlzYWEtPmNhcCA9IDA7Ci0Jc2FhLT5kZXYgPSBkZXY7CiAJc2FhLT5uciA9IG51bTsKIAlzYWEtPnBsYXltb2RlID0gVklEX1BMQVlfTk9STUFMOwogCW1lbXNldChzYWEtPmJvYXJkY2ZnLCAwLCA2NCk7CS8qIGNsZWFyIGJvYXJkIGNvbmZpZyBhcmVhICovCkBAIC0yMDMyLDQ1ICsxOTYwLDU5IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmc2FhLT52aWRxKTsKIAlzcGluX2xvY2tfaW5pdCgmc2FhLT5sb2NrKTsKIAotCWlmIChwY2lfZW5hYmxlX2RldmljZShkZXYpKQotCQlyZXR1cm4gLUVJTzsKLQkKLQlzYWEtPmlkID0gZGV2LT5kZXZpY2U7Ci0Jc2FhLT5pcnEgPSBkZXYtPmlycTsKKwlyZXR2YWwgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVkOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQhXG4iLCBudW0pOworCQlnb3RvIGVycjsKKwl9CisKKwlzYWEtPmlkID0gcGRldi0+ZGV2aWNlOworCXNhYS0+aXJxID0gcGRldi0+aXJxOwogCXNhYS0+dmlkZW9fZGV2Lm1pbm9yID0gLTE7Ci0Jc2FhLT5zYWE3MTQ2X2FkciA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApOwotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmc2FhLT5yZXZpc2lvbik7CisJc2FhLT5zYWE3MTQ2X2FkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZzYWEtPnJldmlzaW9uKTsKIAogCXNhYS0+c2FhNzE0Nl9tZW0gPSBpb3JlbWFwKHNhYS0+c2FhNzE0Nl9hZHIsIDB4MjAwKTsKLQlpZiAoIXNhYS0+c2FhNzE0Nl9tZW0pCi0JCXJldHVybiAtRUlPOworCWlmIChzYWEtPnNhYTcxNDZfbWVtID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJWQ6IGlvcmVtYXAgZmFpbGVkIVxuIiwgbnVtKTsKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBlcnI7CisJfQogCiAJbWVtY3B5KCZzYWEtPnZpZGVvX2RldiwgJnNhYV90ZW1wbGF0ZSwgc2l6ZW9mKHNhYV90ZW1wbGF0ZSkpOwogCXNhYXdyaXRlKDAsIFNBQTcxNDZfSUVSKTsJLyogdHVybiBvZmYgYWxsIGludGVycnVwdHMgKi8KLQlyZXN1bHQgPSByZXF1ZXN0X2lycShzYWEtPmlycSwgc2FhNzE0Nl9pcnEsCi0JCSAgICAgICBTQV9TSElSUSB8IFNBX0lOVEVSUlVQVCwgInN0cmFkaXMiLCAodm9pZCAqKSBzYWEpOwotCWlmIChyZXN1bHQgPT0gLUVJTlZBTCkKLQkJcHJpbnRrKEtFUk5fRVJSICJzdHJhZGlzJWQ6IEJhZCBpcnEgbnVtYmVyIG9yIGhhbmRsZXJcbiIsCi0JCSAgICAgICBudW0pOwotCWlmIChyZXN1bHQgPT0gLUVCVVNZKQotCQlwcmludGsoS0VSTl9FUlIgInN0cmFkaXMlZDogSVJRICVsZCBidXN5LCBjaGFuZ2UgeW91ciBQblAiCi0JCSAgICAgICAiIGNvbmZpZyBpbiBCSU9TXG4iLCBudW0sIHNhYS0+aXJxKTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlpb3VubWFwKHNhYS0+c2FhNzE0Nl9tZW0pOwotCQlyZXR1cm4gcmVzdWx0OworCisJcmV0dmFsID0gcmVxdWVzdF9pcnEoc2FhLT5pcnEsIHNhYTcxNDZfaXJxLCBTQV9TSElSUSB8IFNBX0lOVEVSUlVQVCwKKwkJInN0cmFkaXMiLCBzYWEpOworCWlmIChyZXR2YWwgPT0gLUVJTlZBTCkKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJWQ6IEJhZCBpcnEgbnVtYmVyIG9yIGhhbmRsZXJcbiIsIG51bSk7CisJZWxzZSBpZiAocmV0dmFsID09IC1FQlVTWSkKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJWQ6IElSUSAlbGQgYnVzeSwgY2hhbmdlIHlvdXIgUG5QIGNvbmZpZyAiCisJCQkiaW4gQklPU1xuIiwgbnVtLCBzYWEtPmlycSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gZXJyaW87CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwlyZXR2YWwgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJnNhYS0+dmlkZW9fZGV2LCBWRkxfVFlQRV9HUkFCQkVSLAorCQl2aWRlb19ucik7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJWQ6IGVycm9yIGluIHJlZ2lzdGVyaW5nIHZpZGVvIGRldmljZSFcbiIsCisJCQludW0pOworCQlnb3RvIGVycmlvOwogCX0KLQlwY2lfc2V0X21hc3RlcihkZXYpOwotCWlmICh2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJnNhYS0+dmlkZW9fZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCB2aWRlb19ucikgPCAwKSB7Ci0JCWlvdW5tYXAoc2FhLT5zYWE3MTQ2X21lbSk7Ci0JCXJldHVybiAtMTsKLQl9CisKIAlyZXR1cm4gMDsKK2VycmlvOgorCWlvdW5tYXAoc2FhLT5zYWE3MTQ2X21lbSk7CitlcnI6CisJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIGludCBpbml0X3NhYTcxNDYoaW50IGkpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpbml0X3NhYTcxNDYoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0Jc3RydWN0IHNhYTcxNDYgKnNhYSA9ICZzYWE3MTQ2c1tpXTsKKwlzdHJ1Y3Qgc2FhNzE0NiAqc2FhID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCisJbWVtc2V0KHNhYSwgMCwgc2l6ZW9mKCpzYWEpKTsKIAlzYWEtPnVzZXIgPSAwOwogCS8qIHJlc2V0IHRoZSBzYWE3MTQ2ICovCiAJc2Fhd3JpdGUoMHhmZmZmMDAwMCwgU0FBNzE0Nl9NQzEpOwpAQCAtMjA4OCwyMyArMjAzMCwyMyBAQAogCXNhYXdyaXRlKDB4MDAwMDAwMDAsIFNBQTcxNDZfREQxX1NUUkVBTV9BKTsKIAlzYWF3cml0ZSgweDAwMDAwMDAwLCBTQUE3MTQ2X0JSU19DVFJMKTsKIAlzYWF3cml0ZSgweDgwNDAwMDQwLCBTQUE3MTQ2X0JDU19DVFJMKTsKLQlzYWF3cml0ZSgweDAwMDBlMDAwIC8qfCAoMTw8MjkpKi8sIFNBQTcxNDZfSFBTX0NUUkwpOworCXNhYXdyaXRlKDB4MDAwMGUwMDAgLyp8ICgxPDwyOSkgKi8gLCBTQUE3MTQ2X0hQU19DVFJMKTsKIAlzYWF3cml0ZSgweDAwMDAwMDYwLCBTQUE3MTQ2X0NMSVBfRk9STUFUX0NUUkwpOwogCXNhYXdyaXRlKDB4MDAwMDAwMDAsIFNBQTcxNDZfQUNPTjEpOwogCXNhYXdyaXRlKDB4MDAwMDAwMDAsIFNBQTcxNDZfQUNPTjIpOwogCXNhYXdyaXRlKDB4MDAwMDA2MDAsIFNBQTcxNDZfSTJDX1NUQVRVUyk7CiAJc2Fhd3JpdGUoKChTQUE3MTQ2X01DMl9VUExEX0QxX0IgfCBTQUE3MTQ2X01DMl9VUExEX0QxX0EgfAotCQkgICBTQUE3MTQ2X01DMl9VUExEX0JSUyB8IFNBQTcxNDZfTUMyX1VQTERfSFBTX0ggfAotCQkgICBTQUE3MTQ2X01DMl9VUExEX0hQU19WIHwgU0FBNzE0Nl9NQzJfVVBMRF9ETUEyIHwKLQkgICBTQUE3MTQ2X01DMl9VUExEX0RNQTEgfCBTQUE3MTQ2X01DMl9VUExEX0kyQykgPDwgMTYpIHwgMHhmZmZmLAotCQkgU0FBNzE0Nl9NQzIpOworCQlTQUE3MTQ2X01DMl9VUExEX0JSUyB8IFNBQTcxNDZfTUMyX1VQTERfSFBTX0ggfAorCQlTQUE3MTQ2X01DMl9VUExEX0hQU19WIHwgU0FBNzE0Nl9NQzJfVVBMRF9ETUEyIHwKKwkJU0FBNzE0Nl9NQzJfVVBMRF9ETUExIHwgU0FBNzE0Nl9NQzJfVVBMRF9JMkMpIDw8IDE2KSB8IDB4ZmZmZiwKKwkJU0FBNzE0Nl9NQzIpOwogCS8qIHNldHVwIGFyYml0cmF0aW9uIGNvbnRyb2wgcmVnaXN0ZXJzICovCiAJc2Fhd3JpdGUoMHgxNDEyMTIxYSwgU0FBNzE0Nl9QQ0lfQlRfVjEpOwogCiAJLyogYWxsb2NhdGUgMzJrIGRtYSBidWZmZXIgKyA0ayBmb3IgcGFnZSB0YWJsZSAqLwogCWlmICgoc2FhLT5kbWFkZWJpID0ga21hbGxvYygzMjc2OCArIDQwOTYsIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic3RyYWRpcyVkOiBkZWJpIGttYWxsb2MgZmFpbGVkXG4iLCBpKTsKLQkJcmV0dXJuIC0xOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlZDogZGViaSBrbWFsbG9jIGZhaWxlZFxuIiwgc2FhLT5ucik7CisJCWdvdG8gZXJyOwogCX0KICNpZiAwCiAJc2FhLT5wYWdlZGViaSA9IHNhYS0+ZG1hZGViaSArIDMyNzY4OwkvKiB0b3AgNGsgaXMgZm9yIG1tdSAqLwpAQCAtMjExNCwxMzMgKzIwNTYsMTYyIEBACiAjZW5kaWYKIAlzYWEtPmF1ZGhlYWQgPSBzYWEtPnZpZGhlYWQgPSBzYWEtPm9zZGhlYWQgPSAwOwogCXNhYS0+YXVkdGFpbCA9IHNhYS0+dmlkdGFpbCA9IHNhYS0+b3NkdGFpbCA9IDA7Ci0JaWYgKHNhYS0+dmlkYnVmID09IE5VTEwpCi0JCWlmICgoc2FhLT52aWRidWYgPSB2bWFsbG9jKDUyNDI4OCkpID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAic3RyYWRpcyVkOiBtYWxsb2MgZmFpbGVkXG4iLCBzYWEtPm5yKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JaWYgKHNhYS0+YXVkYnVmID09IE5VTEwpCi0JCWlmICgoc2FhLT5hdWRidWYgPSB2bWFsbG9jKDY1NTM2KSkgPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJzdHJhZGlzJWQ6IG1hbGxvYyBmYWlsZWRcbiIsIHNhYS0+bnIpOwotCQkJdmZyZWUoc2FhLT52aWRidWYpOwotCQkJc2FhLT52aWRidWYgPSBOVUxMOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQlpZiAoc2FhLT5vc2RidWYgPT0gTlVMTCkKLQkJaWYgKChzYWEtPm9zZGJ1ZiA9IHZtYWxsb2MoMTMxMDcyKSkgPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJzdHJhZGlzJWQ6IG1hbGxvYyBmYWlsZWRcbiIsIHNhYS0+bnIpOwotCQkJdmZyZWUoc2FhLT52aWRidWYpOwotCQkJdmZyZWUoc2FhLT5hdWRidWYpOwotCQkJc2FhLT52aWRidWYgPSBzYWEtPmF1ZGJ1ZiA9IE5VTEw7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCS8qIGFsbG9jYXRlIDgxOTIwIGJ5dGUgYnVmZmVyIGZvciBjbGlwcGluZyAqLwotCWlmICgoc2FhLT5kbWF2aWQyID0ga21hbGxvYyhWSURFT19DTElQTUFQX1NJWkUsIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic3RyYWRpcyVkOiBjbGlwIGttYWxsb2MgZmFpbGVkXG4iLCBzYWEtPm5yKTsKLQkJdmZyZWUoc2FhLT52aWRidWYpOwotCQl2ZnJlZShzYWEtPmF1ZGJ1Zik7Ci0JCXZmcmVlKHNhYS0+b3NkYnVmKTsKLQkJc2FhLT52aWRidWYgPSBzYWEtPmF1ZGJ1ZiA9IHNhYS0+b3NkYnVmID0gTlVMTDsKLQkJc2FhLT5kbWF2aWQyID0gTlVMTDsKLQkJcmV0dXJuIC0xOworCWlmIChzYWEtPnZpZGJ1ZiA9PSBOVUxMICYmIChzYWEtPnZpZGJ1ZiA9IHZtYWxsb2MoNTI0Mjg4KSkgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlZDogbWFsbG9jIGZhaWxlZFxuIiwgc2FhLT5ucik7CisJCWdvdG8gZXJyOwogCX0KLQltZW1zZXQoc2FhLT5kbWF2aWQyLCAweDAwLCBWSURFT19DTElQTUFQX1NJWkUpOwkvKiBjbGlwIGV2ZXJ5dGhpbmcgKi8KKwlpZiAoc2FhLT5hdWRidWYgPT0gTlVMTCAmJiAoc2FhLT5hdWRidWYgPSB2bWFsbG9jKDY1NTM2KSkgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlZDogbWFsbG9jIGZhaWxlZFxuIiwgc2FhLT5ucik7CisJCWdvdG8gZXJydmlkOworCX0KKwlpZiAoc2FhLT5vc2RidWYgPT0gTlVMTCAmJiAoc2FhLT5vc2RidWYgPSB2bWFsbG9jKDEzMTA3MikpID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJWQ6IG1hbGxvYyBmYWlsZWRcbiIsIHNhYS0+bnIpOworCQlnb3RvIGVycmF1ZDsKKwl9CisJLyogYWxsb2NhdGUgODE5MjAgYnl0ZSBidWZmZXIgZm9yIGNsaXBwaW5nICovCisJaWYgKChzYWEtPmRtYXZpZDIgPSBremFsbG9jKFZJREVPX0NMSVBNQVBfU0laRSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJWQ6IGNsaXAga21hbGxvYyBmYWlsZWRcbiIsIHNhYS0+bnIpOworCQlnb3RvIGVycm9zZDsKKwl9CiAJLyogc2V0dXAgY2xpcHBpbmcgcmVnaXN0ZXJzICovCiAJc2Fhd3JpdGUodmlydF90b19idXMoc2FhLT5kbWF2aWQyKSwgU0FBNzE0Nl9CQVNFX0VWRU4yKTsKIAlzYWF3cml0ZSh2aXJ0X3RvX2J1cyhzYWEtPmRtYXZpZDIpICsgMTI4LCBTQUE3MTQ2X0JBU0VfT0REMik7CiAJc2Fhd3JpdGUodmlydF90b19idXMoc2FhLT5kbWF2aWQyKSArIFZJREVPX0NMSVBNQVBfU0laRSwKLQkJU0FBNzE0Nl9QUk9UX0FERFIyKTsKKwkJIFNBQTcxNDZfUFJPVF9BRERSMik7CiAJc2Fhd3JpdGUoMjU2LCBTQUE3MTQ2X1BJVENIMik7Ci0Jc2Fhd3JpdGUoNCwgU0FBNzE0Nl9QQUdFMik7IC8qIGRtYSBkaXJlY3Rpb246IHJlYWQsIG5vIGJ5dGVzd2FwICovCisJc2Fhd3JpdGUoNCwgU0FBNzE0Nl9QQUdFMik7CS8qIGRtYSBkaXJlY3Rpb246IHJlYWQsIG5vIGJ5dGVzd2FwICovCiAJc2Fhd3JpdGUoKChTQUE3MTQ2X01DMl9VUExEX0RNQTIpIDw8IDE2KSB8IFNBQTcxNDZfTUMyX1VQTERfRE1BMiwKIAkJIFNBQTcxNDZfTUMyKTsKIAlJMkNCdXNTY2FuKHNhYSk7CisKIAlyZXR1cm4gMDsKK2Vycm9zZDoKKwl2ZnJlZShzYWEtPm9zZGJ1Zik7CisJc2FhLT5vc2RidWYgPSBOVUxMOworZXJyYXVkOgorCXZmcmVlKHNhYS0+YXVkYnVmKTsKKwlzYWEtPmF1ZGJ1ZiA9IE5VTEw7CitlcnJ2aWQ6CisJdmZyZWUoc2FhLT52aWRidWYpOworCXNhYS0+dmlkYnVmID0gTlVMTDsKK2VycjoKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAotc3RhdGljIHZvaWQgcmVsZWFzZV9zYWEodm9pZCkKK3N0YXRpYyB2b2lkIHN0cmFkaXNfcmVsZWFzZV9zYWEoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJdTggY29tbWFuZDsKLQlpbnQgaTsKLQlzdHJ1Y3Qgc2FhNzE0NiAqc2FhOworCXN0cnVjdCBzYWE3MTQ2ICpzYWEgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgc2FhX251bTsgaSsrKSB7Ci0JCXNhYSA9ICZzYWE3MTQ2c1tpXTsKKwkvKiB0dXJuIG9mZiBhbGwgY2FwdHVyaW5nLCBETUEgYW5kIElSUXMgKi8KKwlzYWF3cml0ZSgweGZmZmYwMDAwLCBTQUE3MTQ2X01DMSk7CS8qIHJlc2V0IGNoaXAgKi8KKwlzYWF3cml0ZSgwLCBTQUE3MTQ2X01DMik7CisJc2Fhd3JpdGUoMCwgU0FBNzE0Nl9JRVIpOworCXNhYXdyaXRlKDB4ZmZmZmZmZmZVTCwgU0FBNzE0Nl9JU1IpOwogCi0JCS8qIHR1cm4gb2ZmIGFsbCBjYXB0dXJpbmcsIERNQSBhbmQgSVJRcyAqLwotCQlzYWF3cml0ZSgweGZmZmYwMDAwLCBTQUE3MTQ2X01DMSk7CS8qIHJlc2V0IGNoaXAgKi8KLQkJc2Fhd3JpdGUoMCwgU0FBNzE0Nl9NQzIpOwotCQlzYWF3cml0ZSgwLCBTQUE3MTQ2X0lFUik7Ci0JCXNhYXdyaXRlKDB4ZmZmZmZmZmZVTCwgU0FBNzE0Nl9JU1IpOworCS8qIGRpc2FibGUgUENJIGJ1cy1tYXN0ZXJpbmcgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ09NTUFORCwgJmNvbW1hbmQpOworCWNvbW1hbmQgJj0gflBDSV9DT01NQU5EX01BU1RFUjsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0NPTU1BTkQsIGNvbW1hbmQpOwogCi0JCS8qIGRpc2FibGUgUENJIGJ1cy1tYXN0ZXJpbmcgKi8KLQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoc2FhLT5kZXYsIFBDSV9DT01NQU5ELCAmY29tbWFuZCk7Ci0JCWNvbW1hbmQgJj0gflBDSV9DT01NQU5EX01BU1RFUjsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHNhYS0+ZGV2LCBQQ0lfQ09NTUFORCwgY29tbWFuZCk7Ci0KLQkJLyogdW5tYXAgYW5kIGZyZWUgbWVtb3J5ICovCi0JCXNhYS0+YXVkaGVhZCA9IHNhYS0+YXVkdGFpbCA9IHNhYS0+b3NkaGVhZCA9IDA7Ci0JCXNhYS0+dmlkaGVhZCA9IHNhYS0+dmlkdGFpbCA9IHNhYS0+b3NkdGFpbCA9IDA7Ci0JCXZmcmVlKHNhYS0+dmlkYnVmKTsKLQkJdmZyZWUoc2FhLT5hdWRidWYpOwotCQl2ZnJlZShzYWEtPm9zZGJ1Zik7Ci0JCWtmcmVlKHNhYS0+ZG1hdmlkMik7Ci0JCXNhYS0+YXVkYnVmID0gc2FhLT52aWRidWYgPSBzYWEtPm9zZGJ1ZiA9IE5VTEw7Ci0JCXNhYS0+ZG1hdmlkMiA9IE5VTEw7Ci0JCWtmcmVlKHNhYS0+ZG1hZGViaSk7Ci0JCWtmcmVlKHNhYS0+ZG1hdmlkMSk7Ci0JCWtmcmVlKHNhYS0+ZG1hdmlkMyk7Ci0JCWtmcmVlKHNhYS0+ZG1hYTFpbik7Ci0JCWtmcmVlKHNhYS0+ZG1hYTFvdXQpOwotCQlrZnJlZShzYWEtPmRtYWEyaW4pOwotCQlrZnJlZShzYWEtPmRtYWEyb3V0KTsKLQkJa2ZyZWUoc2FhLT5kbWFSUFMxKTsKLQkJa2ZyZWUoc2FhLT5kbWFSUFMyKTsKLQkJZnJlZV9pcnEoc2FhLT5pcnEsIHNhYSk7Ci0JCWlmIChzYWEtPnNhYTcxNDZfbWVtKQotCQkJaW91bm1hcChzYWEtPnNhYTcxNDZfbWVtKTsKLQkJaWYgKHNhYS0+dmlkZW9fZGV2Lm1pbm9yICE9IC0xKQotCQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJnNhYS0+dmlkZW9fZGV2KTsKLQl9CisJLyogdW5tYXAgYW5kIGZyZWUgbWVtb3J5ICovCisJc2FhLT5hdWRoZWFkID0gc2FhLT5hdWR0YWlsID0gc2FhLT5vc2RoZWFkID0gMDsKKwlzYWEtPnZpZGhlYWQgPSBzYWEtPnZpZHRhaWwgPSBzYWEtPm9zZHRhaWwgPSAwOworCXZmcmVlKHNhYS0+dmlkYnVmKTsKKwl2ZnJlZShzYWEtPmF1ZGJ1Zik7CisJdmZyZWUoc2FhLT5vc2RidWYpOworCWtmcmVlKHNhYS0+ZG1hdmlkMik7CisJc2FhLT5hdWRidWYgPSBzYWEtPnZpZGJ1ZiA9IHNhYS0+b3NkYnVmID0gTlVMTDsKKwlzYWEtPmRtYXZpZDIgPSBOVUxMOworCWtmcmVlKHNhYS0+ZG1hZGViaSk7CisJa2ZyZWUoc2FhLT5kbWF2aWQxKTsKKwlrZnJlZShzYWEtPmRtYXZpZDMpOworCWtmcmVlKHNhYS0+ZG1hYTFpbik7CisJa2ZyZWUoc2FhLT5kbWFhMW91dCk7CisJa2ZyZWUoc2FhLT5kbWFhMmluKTsKKwlrZnJlZShzYWEtPmRtYWEyb3V0KTsKKwlrZnJlZShzYWEtPmRtYVJQUzEpOworCWtmcmVlKHNhYS0+ZG1hUlBTMik7CisJZnJlZV9pcnEoc2FhLT5pcnEsIHNhYSk7CisJaWYgKHNhYS0+c2FhNzE0Nl9tZW0pCisJCWlvdW5tYXAoc2FhLT5zYWE3MTQ2X21lbSk7CisJaWYgKHNhYS0+dmlkZW9fZGV2Lm1pbm9yICE9IC0xKQorCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmc2FhLT52aWRlb19kZXYpOwogfQogCi0KLXN0YXRpYyBpbnQgX19pbml0IHN0cmFkaXNfaW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHN0cmFkaXNfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKLQlpbnQgcmVzdWx0ID0gMCwgaTsKKwlpbnQgcmV0dmFsID0gLUVJTlZBTDsKKworCWlmIChzYWFfbnVtID49IFNBQTcxNDZfTUFYKQorCQlnb3RvIGVycjsKKworCWlmICghcGRldi0+c3Vic3lzdGVtX3ZlbmRvcikKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVkOiByZXYxIGRlY29kZXJcbiIsIHNhYV9udW0pOworCWVsc2UKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVkOiBTRE0yeHggZm91bmRcbiIsIHNhYV9udW0pOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsICZzYWE3MTQ2c1tzYWFfbnVtXSk7CisKKwlyZXR2YWwgPSBjb25maWd1cmVfc2FhNzE0NihwZGV2LCBzYWFfbnVtKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVkOiBlcnJvciBpbiBjb25maWd1cmluZ1xuIiwgc2FhX251bSk7CisJCWdvdG8gZXJyOworCX0KKworCWlmIChpbml0X3NhYTcxNDYocGRldikgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVkOiBlcnJvciBpbiBpbml0aWFsaXphdGlvblxuIiwgc2FhX251bSk7CisJCXJldHZhbCA9IC1FSU87CisJCWdvdG8gZXJycmVsOworCX0KKworCXNhYV9udW0rKzsKKworCXJldHVybiAwOworZXJycmVsOgorCXN0cmFkaXNfcmVsZWFzZV9zYWEocGRldik7CitlcnI6CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHN0cmFkaXNfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cmFkaXNfcmVsZWFzZV9zYWEocGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzdHJhZGlzX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9QSElMSVBTLCBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzE0NikgfSwKKwl7IDAgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHN0cmFkaXNfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzdHJhZGlzX2RyaXZlciA9IHsKKwkubmFtZSA9ICJzdHJhZGlzIiwKKwkuaWRfdGFibGUgPSBzdHJhZGlzX3BjaV90YmwsCisJLnByb2JlID0gc3RyYWRpc19wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aoc3RyYWRpc19yZW1vdmUpCit9OworCitpbnQgX19pbml0IHN0cmFkaXNfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CiAKIAlzYWFfbnVtID0gMDsKIAotCXdoaWxlICgoZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfUEhJTElQUywgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxNDYsIGRldikpKSB7Ci0JCWlmICghZGV2LT5zdWJzeXN0ZW1fdmVuZG9yKQotCQkJcHJpbnRrKEtFUk5fSU5GTyAic3RyYWRpcyVkOiByZXYxIGRlY29kZXJcbiIsIHNhYV9udW0pOwotCQllbHNlCi0JCQlwcmludGsoS0VSTl9JTkZPICJzdHJhZGlzJWQ6IFNETTJ4eCBmb3VuZFxuIiwgc2FhX251bSk7IAotCQlyZXN1bHQgPSBjb25maWd1cmVfc2FhNzE0NihkZXYsIHNhYV9udW0rKyk7Ci0JCWlmIChyZXN1bHQpCi0JCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlpZiAoc2FhX251bSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAic3RyYWRpczogJWQgY2FyZChzKSBmb3VuZC5cbiIsIHNhYV9udW0pOwotCWVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZm9yIChpID0gMDsgaSA8IHNhYV9udW07IGkrKykKLQkJaWYgKGluaXRfc2FhNzE0NihpKSA8IDApIHsKLQkJCXJlbGVhc2Vfc2FhKCk7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCXJldHVybiAwOworCXJldHZhbCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnN0cmFkaXNfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQlwcmludGsoS0VSTl9FUlIgInN0cmFkaXM6IFVuYWJsZSB0byByZWdpc3RlciBwY2kgZHJpdmVyLlxuIik7CisKKwlyZXR1cm4gcmV0dmFsOwogfQogCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzdHJhZGlzX2V4aXQgKHZvaWQpCit2b2lkIF9fZXhpdCBzdHJhZGlzX2V4aXQodm9pZCkKIHsKLQlyZWxlYXNlX3NhYSgpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc3RyYWRpc19kcml2ZXIpOwogCXByaW50ayhLRVJOX0lORk8gInN0cmFkaXM6IG1vZHVsZSBjbGVhbnVwIGNvbXBsZXRlXG4iKTsKIH0KIAotCiBtb2R1bGVfaW5pdChzdHJhZGlzX2luaXQpOwogbW9kdWxlX2V4aXQoc3RyYWRpc19leGl0KTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE3NDMyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTc0MzIuYwppbmRleCA1NDljOTkyLi5mYzNkNTgyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE3NDMyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE3NDMyLmMKQEAgLTUwLDYgKzUwLDcgQEAKIAogI2luY2x1ZGUgImJ0dHYuaCIKICNpbmNsdWRlIDxtZWRpYS9hdWRpb2NoaXAuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogCiAjaWZuZGVmIFZJREVPX0FVRElPX0JBTEFOQ0UKICMgZGVmaW5lIFZJREVPX0FVRElPX0JBTEFOQ0UgMzIKQEAgLTkwLDkgKzkxLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXI7CiBzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlOwogCi0jZGVmaW5lIGRwcmludGsgIGlmIChkZWJ1ZykgcHJpbnRrCi0jZGVmaW5lIGQycHJpbnRrIGlmIChkZWJ1ZyA+IDEpIHByaW50awotCiAvKiBUaGUgVERBNzQzMiBpcyBtYWRlIGJ5IFNUUy1UaG9tcHNvbgogICogaHR0cDovL3d3dy5zdC5jb20KICAqIGh0dHA6Ly91cy5zdC5jb20vc3RvbmxpbmUvYm9va3MvcGRmL2RvY3MvNDA1Ni5wZGYKQEAgLTIyOSwxMiArMjI3LDEyIEBACiBzdGF0aWMgaW50IHRkYTc0MzJfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHN1YmFkZHIsIGludCB2YWwpCiB7CiAJdW5zaWduZWQgY2hhciBidWZmZXJbMl07Ci0JZDJwcmludGsoInRkYTc0MzI6IEluIHRkYTc0MzJfd3JpdGVcbiIpOwotCWRwcmludGsoInRkYTc0MzI6IFdyaXRpbmcgJWQgMHgleFxuIiwgc3ViYWRkciwgdmFsKTsKKwl2NGxfZGJnKDIsIGRlYnVnLGNsaWVudCwiSW4gdGRhNzQzMl93cml0ZVxuIik7CisJdjRsX2RiZygxLCBkZWJ1ZyxjbGllbnQsIldyaXRpbmcgJWQgMHgleFxuIiwgc3ViYWRkciwgdmFsKTsKIAlidWZmZXJbMF0gPSBzdWJhZGRyOwogCWJ1ZmZlclsxXSA9IHZhbDsKIAlpZiAoMiAhPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LGJ1ZmZlciwyKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0ZGE3NDMyOiBJL08gZXJyb3IsIHRyeWluZyAod3JpdGUgJWQgMHgleClcbiIsCisJCXY0bF9lcnIoY2xpZW50LCJJL08gZXJyb3IsIHRyeWluZyAod3JpdGUgJWQgMHgleClcbiIsCiAJCSAgICAgICBzdWJhZGRyLCB2YWwpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMjQ3LDkgKzI0NSw5IEBACiB7CiAJc3RydWN0IHRkYTc0MzIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAl1bnNpZ25lZCBjaGFyIGJ1ZlsxNl07Ci0JZDJwcmludGsoInRkYTc0MzI6IEluIHRkYTc0MzJfc2V0XG4iKTsKKwl2NGxfZGJnKDIsIGRlYnVnLGNsaWVudCwiSW4gdGRhNzQzMl9zZXRcbiIpOwogCi0JZHByaW50ayhLRVJOX0lORk8KKwl2NGxfZGJnKDEsIGRlYnVnLGNsaWVudCwKIAkJInRkYTc0MzI6IDc0MzJfc2V0KDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4KVxuIiwKIAkJdC0+aW5wdXQsdC0+dm9sdW1lLHQtPmJhc3MsdC0+dHJlYmxlLHQtPmxmLHQtPmxyLHQtPnJmLHQtPnJyLHQtPmxvdWQpOwogCWJ1ZlswXSAgPSBUREE3NDMyX0lOOwpAQCAtMjYzLDcgKzI2MSw3IEBACiAJYnVmWzhdICA9IHQtPnJyOwogCWJ1Zls5XSAgPSB0LT5sb3VkOwogCWlmICgxMCAhPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LGJ1ZiwxMCkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAidGRhNzQzMjogSS9PIGVycm9yLCB0cnlpbmcgdGRhNzQzMl9zZXRcbiIpOworCQl2NGxfZXJyKGNsaWVudCwiSS9PIGVycm9yLCB0cnlpbmcgdGRhNzQzMl9zZXRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0yNzMsNyArMjcxLDcgQEAKIHN0YXRpYyB2b2lkIGRvX3RkYTc0MzJfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCB0ZGE3NDMyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JZDJwcmludGsoInRkYTc0MzI6IEluIHRkYTc0MzJfaW5pdFxuIik7CisJdjRsX2RiZygyLCBkZWJ1ZyxjbGllbnQsIkluIHRkYTc0MzJfaW5pdFxuIik7CiAKIAl0LT5pbnB1dCAgPSBUREE3NDMyX1NURVJFT19JTiB8ICAvKiBNYWluIChzdGVyZW8pIGlucHV0ICAgKi8KIAkJICAgIFREQTc0MzJfQkFTU19TWU0gIHwgIC8qIFN5bW1ldHJpYyBiYXNzIGN1dCAgICAqLwpAQCAtMzAxLDEyICsyOTksMTAgQEAKIHsKIAlzdHJ1Y3QgdGRhNzQzMiAqdDsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwotCWQycHJpbnRrKCJ0ZGE3NDMyOiBJbiB0ZGE3NDMyX2F0dGFjaFxuIik7CiAKLQl0ID0ga21hbGxvYyhzaXplb2YgKnQsR0ZQX0tFUk5FTCk7CisJdCA9IGt6YWxsb2Moc2l6ZW9mICp0LEdGUF9LRVJORUwpOwogCWlmICghdCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KHQsMCxzaXplb2YgKnQpOwogCiAJY2xpZW50ID0gJnQtPmM7CiAJbWVtY3B5KGNsaWVudCwmY2xpZW50X3RlbXBsYXRlLHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOwpAQCAtMzE1LDIxICszMTEsMTYgQEAKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCB0KTsKIAogCWRvX3RkYTc0MzJfaW5pdChjbGllbnQpOwotCXByaW50ayhLRVJOX0lORk8gInRkYTc0MzI6IGluaXRcbiIpOwotCiAJaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KTsKKworCXY0bF9pbmZvKGNsaWVudCwgImNoaXAgZm91bmQgQCAweCV4ICglcylcbiIsIGFkZHIgPDwgMSwgYWRhcC0+bmFtZSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdGRhNzQzMl9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCiB7Ci0jaWZkZWYgSTJDX0NMQVNTX1RWX0FOQUxPRwogCWlmIChhZGFwLT5jbGFzcyAmIEkyQ19DTEFTU19UVl9BTkFMT0cpCiAJCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgdGRhNzQzMl9hdHRhY2gpOwotI2Vsc2UKLQlpZiAoYWRhcC0+aWQgPT0gSTJDX0hXX0JfQlQ4NDgpCi0JCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgdGRhNzQzMl9hdHRhY2gpOwotI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM0OCw3ICszMzksOSBAQAogCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCB0ZGE3NDMyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JZDJwcmludGsoInRkYTc0MzI6IEluIHRkYTc0MzJfY29tbWFuZFxuIik7CisJdjRsX2RiZygyLCBkZWJ1ZyxjbGllbnQsIkluIHRkYTc0MzJfY29tbWFuZFxuIik7CisJaWYgKGRlYnVnPjEpCisJCXY0bF9pMmNfcHJpbnRfaW9jdGwoY2xpZW50LGNtZCk7CiAKIAlzd2l0Y2ggKGNtZCkgewogCS8qIC0tLSB2NGwgaW9jdGxzIC0tLSAqLwpAQCAtMzU5LDcgKzM1Miw2IEBACiAJY2FzZSBWSURJT0NHQVVESU86CiAJewogCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnZhID0gYXJnOwotCQlkcHJpbnRrKCJ0ZGE3NDMyOiBWSURJT0NHQVVESU9cbiIpOwogCiAJCXZhLT5mbGFncyB8PSBWSURFT19BVURJT19WT0xVTUUgfAogCQkJVklERU9fQVVESU9fQkFTUyB8CkBAIC00MTQsNyArNDA2LDYgQEAKIAljYXNlIFZJRElPQ1NBVURJTzoKIAl7CiAJCXN0cnVjdCB2aWRlb19hdWRpbyAqdmEgPSBhcmc7Ci0JCWRwcmludGsoInRkYTc0MzI6IFZJREVPQ1NBVURJT1xuIik7CiAKIAkJaWYodmEtPmZsYWdzICYgVklERU9fQVVESU9fVk9MVU1FKXsKIAkJCWlmKCFtYXh2b2wpeyAvKiBtYXggKzIwZGIgKi8KQEAgLTQ5MCwxMSArNDgxLDYgQEAKIAogCX0gLyogZW5kIG9mIFZJREVPQ1NBVURJTyBjYXNlICovCiAKLQlkZWZhdWx0OiAvKiBOb3QgVklERU9DR0FVRElPIG9yIFZJREVPQ1NBVURJTyAqLwotCi0JCS8qIG5vdGhpbmcgKi8KLQkJZDJwcmludGsoInRkYTc0MzI6IERlZmF1bHRcbiIpOwotCiAJfSAvKiBlbmQgb2YgKGNtZCkgc3dpdGNoICovCiAKIAlyZXR1cm4gMDsKQEAgLTUwMiw3ICs0ODgsNyBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lICAgID0gImkyYyB0ZGE3NDMyIGRyaXZlciIsCisJCS5uYW1lICAgID0gInRkYTc0MzIiLAogCX0sCiAJLmlkICAgICAgICAgICAgICA9IEkyQ19EUklWRVJJRF9UREE3NDMyLAogCS5hdHRhY2hfYWRhcHRlciAgPSB0ZGE3NDMyX3Byb2JlLApAQCAtNTE5LDcgKzUwNSw3IEBACiBzdGF0aWMgaW50IF9faW5pdCB0ZGE3NDMyX2luaXQodm9pZCkKIHsKIAlpZiAoIChsb3VkbmVzcyA8IDApIHx8IChsb3VkbmVzcyA+IDE1KSApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0ZGE3NDMyOiBsb3VkbmVzcyBwYXJhbWV0ZXIgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDE1XG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJsb3VkbmVzcyBwYXJhbWV0ZXIgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDE1XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTgyOTAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhODI5MC5jCmluZGV4IDYxZDk0ZGQuLjdiNGZiMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhODI5MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhODI5MC5jCkBAIC0zOTgsMTQgKzM5OCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jZGVmaW5lIFY0TDJfU1REX01OCShWNEwyX1NURF9QQUxfTXxWNEwyX1NURF9QQUxfTnxWNEwyX1NURF9QQUxfTmN8VjRMMl9TVERfTlRTQykKLSNkZWZpbmUgVjRMMl9TVERfQgkoVjRMMl9TVERfUEFMX0J8VjRMMl9TVERfUEFMX0IxfFY0TDJfU1REX1NFQ0FNX0IpCi0jZGVmaW5lIFY0TDJfU1REX0dICShWNEwyX1NURF9QQUxfR3xWNEwyX1NURF9QQUxfSHxWNEwyX1NURF9TRUNBTV9HfFY0TDJfU1REX1NFQ0FNX0gpCi0jZGVmaW5lIFY0TDJfU1REX0RLCShWNEwyX1NURF9QQUxfREt8VjRMMl9TVERfU0VDQU1fREspCi0KIHN0YXRpYyB2b2lkIHNldF9hdWRpbyhzdHJ1Y3QgdHVuZXIgKnQpCiB7CiAJY2hhciogbW9kZTsKQEAgLTU3Myw4ICs1NjcsOCBAQAogCX0KIAl0dW5lcl9pbmZvKCJ0dW5lcjogdHlwZSBzZXQgdG8gJXNcbiIsIGMtPm5hbWUpOwogCi0JdC0+dHZfZnJlcSAgICA9IHNldF90dl9mcmVxOwotCXQtPnJhZGlvX2ZyZXEgPSBzZXRfcmFkaW9fZnJlcTsKKwl0LT5zZXRfdHZfZnJlcSAgICA9IHNldF90dl9mcmVxOworCXQtPnNldF9yYWRpb19mcmVxID0gc2V0X3JhZGlvX2ZyZXE7CiAJdC0+aGFzX3NpZ25hbCA9IGhhc19zaWduYWw7CiAJdC0+c3RhbmRieSA9IHN0YW5kYnk7CiAJdC0+dGRhODI3eF9scHNlbCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4NzUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jCmluZGV4IDljM2VjZjcuLmVmOThjNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jCkBAIC0yMzIsMTAgKzIzMiw5IEBACiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAlkcHJpbnRrKCJJbiB0ZGE5ODc1X2F0dGFjaFxuIik7CiAKLQl0ID0ga21hbGxvYyhzaXplb2YgKnQsR0ZQX0tFUk5FTCk7CisJdCA9IGt6YWxsb2Moc2l6ZW9mICp0LEdGUF9LRVJORUwpOwogCWlmICghdCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KHQsMCxzaXplb2YgKnQpOwogCiAJY2xpZW50ID0gJnQtPmM7CiAJbWVtY3B5KGNsaWVudCwmY2xpZW50X3RlbXBsYXRlLHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOwpAQCAtMjU3LDEzICsyNTYsOCBAQAogCiBzdGF0aWMgaW50IHRkYTk4NzVfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQogewotI2lmZGVmIEkyQ19DTEFTU19UVl9BTkFMT0cKIAlpZiAoYWRhcC0+Y2xhc3MgJiBJMkNfQ0xBU1NfVFZfQU5BTE9HKQogCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHRkYTk4NzVfYXR0YWNoKTsKLSNlbHNlCi0JaWYgKGFkYXAtPmlkID09IEkyQ19IV19CX0JUODQ4KQotCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHRkYTk4NzVfYXR0YWNoKTsKLSNlbmRpZgogCXJldHVybiAwOwogfQogCkBAIC0zNzMsNyArMzY3LDcgQEAKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZSAgID0gImkyYyB0ZGE5ODc1IGRyaXZlciIsCisJCS5uYW1lICAgPSAidGRhOTg3NSIsCiAJfSwKIAkuaWQgICAgICAgICAgICAgPSBJMkNfRFJJVkVSSURfVERBOTg3NSwKIAkuYXR0YWNoX2FkYXB0ZXIgPSB0ZGE5ODc1X3Byb2JlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODg3LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4ODcuYwppbmRleCA3MTY1YTFiLi41ODE1NjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4ODcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4ODcuYwpAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvY2hpcC5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KIAogCkBAIC01Nyw3ICs1Nyw2IEBACiAJdjRsMl9zdGRfaWQgICAgICAgIHN0ZDsKIAllbnVtIHR1bmVyX21vZGUgICAgbW9kZTsKIAl1bnNpZ25lZCBpbnQgICAgICAgY29uZmlnOwotCXVuc2lnbmVkIGludCAgICAgICBwaW5uYWNsZV9pZDsKIAl1bnNpZ25lZCBpbnQgICAgICAgdXNpbmdfdjRsMjsKIAl1bnNpZ25lZCBpbnQgCSAgIHJhZGlvX21vZGU7CiAJdW5zaWduZWQgY2hhciAJICAgZGF0YVs0XTsKQEAgLTExNSw2ICsxMTQsOSBAQAogI2RlZmluZSBjQXVkaW9HYWluMCAgICAgICAgICAgICAweDAwICAgIC8vIGJpdCBjNwogI2RlZmluZSBjQXVkaW9HYWluNiAgICAgICAgICAgICAweDgwICAgIC8vIGJpdCBjNwogCisjZGVmaW5lIGNUb3BNYXNrICAgICAgICAgICAgICAgIDB4MWYgICAgLy8gYml0IGMwOjQKKyNkZWZpbmUgY1RvcFBhbFNlY2FtRGVmYXVsdAkweDE0IAkvLyBiaXQgYzA6NAorI2RlZmluZSBjVG9wTnRzY1JhZGlvRGVmYXVsdCAJMHgxMCAJLy8gYml0IGMwOjQKIAogLy8vLyB0aGlyZCByZWcgKGUpCiAjZGVmaW5lIGNBdWRpb0lGXzRfNSAgICAgICAgICAgICAweDAwICAgIC8vIGJpdCBlMDoxCkBAIC0xNDYsMTMgKzE0OCwxNSBAQAogCiBzdGF0aWMgc3RydWN0IHR2bm9ybSB0dm5vcm1zW10gPSB7CiAJewotCQkuc3RkICAgPSBWNEwyX1NURF9QQUxfQkcsCi0JCS5uYW1lICA9ICJQQUwtQkciLAorCQkuc3RkICAgPSBWNEwyX1NURF9QQUxfQkcgfCBWNEwyX1NURF9QQUxfSCB8IFY0TDJfU1REX1BBTF9OLAorCQkubmFtZSAgPSAiUEFMLUJHSE4iLAogCQkuYiAgICAgPSAoIGNOZWdhdGl2ZUZtVFYgIHwKIAkJCSAgIGNRU1MgICAgICAgICAgICksCiAJCS5jICAgICA9ICggY0RlZW1waGFzaXNPTiAgfAotCQkJICAgY0RlZW1waGFzaXM1MCAgKSwKLQkJLmUgICAgID0gKCBjQXVkaW9JRl81XzUgICB8CisJCQkgICBjRGVlbXBoYXNpczUwICB8CisJCQkgICBjVG9wUGFsU2VjYW1EZWZhdWx0KSwKKwkJLmUgICAgID0gKCBjR2F0aW5nXzM2ICAgICB8CisJCQkgICBjQXVkaW9JRl81XzUgICB8CiAJCQkgICBjVmlkZW9JRl8zOF85MCApLAogCX0sewogCQkuc3RkICAgPSBWNEwyX1NURF9QQUxfSSwKQEAgLTE2MCw4ICsxNjQsMTAgQEAKIAkJLmIgICAgID0gKCBjTmVnYXRpdmVGbVRWICB8CiAJCQkgICBjUVNTICAgICAgICAgICApLAogCQkuYyAgICAgPSAoIGNEZWVtcGhhc2lzT04gIHwKLQkJCSAgIGNEZWVtcGhhc2lzNTAgICksCi0JCS5lICAgICA9ICggY0F1ZGlvSUZfNl8wICAgfAorCQkJICAgY0RlZW1waGFzaXM1MCAgfAorCQkJICAgY1RvcFBhbFNlY2FtRGVmYXVsdCksCisJCS5lICAgICA9ICggY0dhdGluZ18zNiAgICAgfAorCQkJICAgY0F1ZGlvSUZfNl8wICAgfAogCQkJICAgY1ZpZGVvSUZfMzhfOTAgKSwKIAl9LHsKIAkJLnN0ZCAgID0gVjRMMl9TVERfUEFMX0RLLApAQCAtMTY5LDUyICsxNzUsODAgQEAKIAkJLmIgICAgID0gKCBjTmVnYXRpdmVGbVRWICB8CiAJCQkgICBjUVNTICAgICAgICAgICApLAogCQkuYyAgICAgPSAoIGNEZWVtcGhhc2lzT04gIHwKLQkJCSAgIGNEZWVtcGhhc2lzNTAgICksCi0JCS5lICAgICA9ICggY0F1ZGlvSUZfNl81ICAgfAotCQkJICAgY1ZpZGVvSUZfMzhfMDAgKSwKKwkJCSAgIGNEZWVtcGhhc2lzNTAgIHwKKwkJCSAgIGNUb3BQYWxTZWNhbURlZmF1bHQpLAorCQkuZSAgICAgPSAoIGNHYXRpbmdfMzYgICAgIHwKKwkJCSAgIGNBdWRpb0lGXzZfNSAgIHwKKwkJCSAgIGNWaWRlb0lGXzM4XzkwICksCiAJfSx7Ci0JCS5zdGQgICA9IFY0TDJfU1REX1BBTF9NIHwgVjRMMl9TVERfUEFMX04sCi0JCS5uYW1lICA9ICJQQUwtTS9OIiwKKwkJLnN0ZCAgID0gVjRMMl9TVERfUEFMX00gfCBWNEwyX1NURF9QQUxfTmMsCisJCS5uYW1lICA9ICJQQUwtTS9OYyIsCiAJCS5iICAgICA9ICggY05lZ2F0aXZlRm1UViAgfAogCQkJICAgY1FTUyAgICAgICAgICAgKSwKIAkJLmMgICAgID0gKCBjRGVlbXBoYXNpc09OICB8Ci0JCQkgICBjRGVlbXBoYXNpczc1ICApLAotCQkuZSAgICAgPSAoIGNBdWRpb0lGXzRfNSAgIHwKKwkJCSAgIGNEZWVtcGhhc2lzNzUgIHwKKwkJCSAgIGNUb3BOdHNjUmFkaW9EZWZhdWx0KSwKKwkJLmUgICAgID0gKCBjR2F0aW5nXzM2ICAgICB8CisJCQkgICBjQXVkaW9JRl80XzUgICB8CiAJCQkgICBjVmlkZW9JRl80NV83NSApLAogCX0seworCQkuc3RkICAgPSBWNEwyX1NURF9TRUNBTV9CIHwgVjRMMl9TVERfU0VDQU1fRyB8IFY0TDJfU1REX1NFQ0FNX0gsCisJCS5uYW1lICA9ICJTRUNBTS1CR0giLAorCQkuYiAgICAgPSAoIGNQb3NpdGl2ZUFtVFYgIHwKKwkJCSAgIGNRU1MgICAgICAgICAgICksCisJCS5jICAgICA9ICggY1RvcFBhbFNlY2FtRGVmYXVsdCksCisJCS5lICAgICA9ICggY0dhdGluZ18zNgkgIHwKKwkJCSAgIGNBdWRpb0lGXzVfNSAgIHwKKwkJCSAgIGNWaWRlb0lGXzM4XzkwICksCisJfSx7CiAJCS5zdGQgICA9IFY0TDJfU1REX1NFQ0FNX0wsCiAJCS5uYW1lICA9ICJTRUNBTS1MIiwKIAkJLmIgICAgID0gKCBjUG9zaXRpdmVBbVRWICB8CiAJCQkgICBjUVNTICAgICAgICAgICApLAorCQkuYyAgICAgPSAoIGNUb3BQYWxTZWNhbURlZmF1bHQpLAogCQkuZSAgICAgPSAoIGNHYXRpbmdfMzYJICB8CiAJCQkgICBjQXVkaW9JRl82XzUgICB8CiAJCQkgICBjVmlkZW9JRl8zOF85MCApLAogCX0seworCQkuc3RkICAgPSBWNEwyX1NURF9TRUNBTV9MQywKKwkJLm5hbWUgID0gIlNFQ0FNLUwnIiwKKwkJLmIgICAgID0gKCBjT3V0cHV0UG9ydDJJbmFjdGl2ZSB8CisJCQkgICBjUG9zaXRpdmVBbVRWICB8CisJCQkgICBjUVNTICAgICAgICAgICApLAorCQkuYyAgICAgPSAoIGNUb3BQYWxTZWNhbURlZmF1bHQpLAorCQkuZSAgICAgPSAoIGNHYXRpbmdfMzYJICB8CisJCQkgICBjQXVkaW9JRl82XzUgICB8CisJCQkgICBjVmlkZW9JRl8zM185MCApLAorCX0sewogCQkuc3RkICAgPSBWNEwyX1NURF9TRUNBTV9ESywKIAkJLm5hbWUgID0gIlNFQ0FNLURLIiwKIAkJLmIgICAgID0gKCBjTmVnYXRpdmVGbVRWICB8CiAJCQkgICBjUVNTICAgICAgICAgICApLAogCQkuYyAgICAgPSAoIGNEZWVtcGhhc2lzT04gIHwKLQkJCSAgIGNEZWVtcGhhc2lzNTAgICksCi0JCS5lICAgICA9ICggY0F1ZGlvSUZfNl81ICAgfAotCQkJICAgY1ZpZGVvSUZfMzhfMDAgKSwKKwkJCSAgIGNEZWVtcGhhc2lzNTAgIHwKKwkJCSAgIGNUb3BQYWxTZWNhbURlZmF1bHQpLAorCQkuZSAgICAgPSAoIGNHYXRpbmdfMzYgICAgIHwKKwkJCSAgIGNBdWRpb0lGXzZfNSAgIHwKKwkJCSAgIGNWaWRlb0lGXzM4XzkwICksCiAJfSx7CiAJCS5zdGQgICA9IFY0TDJfU1REX05UU0NfTSwKIAkJLm5hbWUgID0gIk5UU0MtTSIsCiAJCS5iICAgICA9ICggY05lZ2F0aXZlRm1UViAgfAogCQkJICAgY1FTUyAgICAgICAgICAgKSwKIAkJLmMgICAgID0gKCBjRGVlbXBoYXNpc09OICB8Ci0JCQkgICBjRGVlbXBoYXNpczc1ICApLAorCQkJICAgY0RlZW1waGFzaXM3NSAgfAorCQkJICAgY1RvcE50c2NSYWRpb0RlZmF1bHQpLAogCQkuZSAgICAgPSAoIGNHYXRpbmdfMzYgICAgIHwKIAkJCSAgIGNBdWRpb0lGXzRfNSAgIHwKIAkJCSAgIGNWaWRlb0lGXzQ1Xzc1ICksCiAJfSx7CiAJCS5zdGQgICA9IFY0TDJfU1REX05UU0NfTV9KUCwKLQkJLm5hbWUgID0gIk5UU0MtSlAiLAorCQkubmFtZSAgPSAiTlRTQy1NLUpQIiwKIAkJLmIgICAgID0gKCBjTmVnYXRpdmVGbVRWICB8CiAJCQkgICBjUVNTICAgICAgICAgICApLAogCQkuYyAgICAgPSAoIGNEZWVtcGhhc2lzT04gIHwKLQkJCSAgIGNEZWVtcGhhc2lzNTAgICksCisJCQkgICBjRGVlbXBoYXNpczUwICB8CisJCQkgICBjVG9wTnRzY1JhZGlvRGVmYXVsdCksCiAJCS5lICAgICA9ICggY0dhdGluZ18zNiAgICAgfAogCQkJICAgY0F1ZGlvSUZfNF81ICAgfAogCQkJICAgY1ZpZGVvSUZfNThfNzUgKSwKQEAgLTIyNiw4ICsyNjAsMTAgQEAKIAkuYiAgICA9ICggY0ZtUmFkaW8gICAgICAgfAogCQkgIGNRU1MgICAgICAgICAgICksCiAJLmMgICAgPSAoIGNEZWVtcGhhc2lzT0ZGIHwKLQkJICBjQXVkaW9HYWluNiApLAotCS5lICAgID0gKCBjQXVkaW9JRl81XzUgICB8CisJCSAgY0F1ZGlvR2FpbjYgICAgfAorCQkgIGNUb3BOdHNjUmFkaW9EZWZhdWx0KSwKKwkuZSAgICA9ICggY1R1bmVyR2FpbkxvdyAgfAorCQkgIGNBdWRpb0lGXzVfNSAgIHwKIAkJICBjUmFkaW9JRl8zOF85MCApLAogfTsKIApAQCAtMjM2LDggKzI3MiwxMCBAQAogCS5iICAgID0gKCBjRm1SYWRpbyAgICAgICB8CiAJCSAgY1FTUyAgICAgICAgICAgKSwKIAkuYyAgICA9ICggY0RlZW1waGFzaXNPTiAgfAotCQkgIGNEZWVtcGhhc2lzNTApLAotCS5lICAgID0gKCBjQXVkaW9JRl81XzUgICB8CisJCSAgY0RlZW1waGFzaXM3NSAgfAorCQkgIGNUb3BOdHNjUmFkaW9EZWZhdWx0KSwKKwkuZSAgICA9ICggY1R1bmVyR2FpbkxvdyAgfAorCQkgIGNBdWRpb0lGXzVfNSAgIHwKIAkJICBjUmFkaW9JRl8zOF85MCApLAogfTsKIApAQCAtNDAwLDcgKzQzOCw4IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHBvcnQxICA9IFVOU0VUOwogc3RhdGljIHVuc2lnbmVkIGludCBwb3J0MiAgPSBVTlNFVDsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcXNzICAgID0gVU5TRVQ7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGFkanVzdCA9IDB4MTA7CitzdGF0aWMgdW5zaWduZWQgaW50IGFkanVzdCA9IFVOU0VUOworCiBtb2R1bGVfcGFyYW0ocG9ydDEsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocG9ydDIsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocXNzLCBpbnQsIDA2NDQpOwpAQCAtNDI4LDggKzQ2NywxMCBAQAogCQkJYnVmWzFdICY9IH5jUVNTOwogCX0KIAotCWlmIChhZGp1c3QgPj0gMHgwMCAmJiBhZGp1c3QgPCAweDIwKQorCWlmIChhZGp1c3QgPj0gMHgwMCAmJiBhZGp1c3QgPCAweDIwKSB7CisJCWJ1ZlsyXSAmPSB+Y1RvcE1hc2s7CiAJCWJ1ZlsyXSB8PSBhZGp1c3Q7CisJfQogCXJldHVybiAwOwogfQogCkBAIC00NjUsNiArNTA2LDEwIEBACiAJCQlicmVhazsKIAkJfQogCX0KKwlpZiAodC0+Y29uZmlnICYgVERBOTg4N19UT1BfU0VUKSB7CisJCWJ1ZlsyXSAmPSB+Y1RvcE1hc2s7CisJCWJ1ZlsyXSB8PSAodC0+Y29uZmlnID4+IDgpICYgY1RvcE1hc2s7CisJfQogCWlmICgodC0+Y29uZmlnICYgVERBOTg4N19JTlRFUkNBUlJJRVJfTlRTQykgJiYgKHQtPnN0ZCAmIFY0TDJfU1REX05UU0MpKQogCQlidWZbMV0gJj0gfmNRU1M7CiAJcmV0dXJuIDA7CkBAIC00NzIsMzggKzUxNywxMyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgdGRhOTg4N19zZXRfcGlubmFjbGUoc3RydWN0IHRkYTk4ODcgKnQsIGNoYXIgKmJ1ZikKLXsKLQl1bnNpZ25lZCBpbnQgYkNhcnJpZXJNb2RlID0gVU5TRVQ7CitzdGF0aWMgY2hhciBwYWxbXSA9ICItLSI7CitzdGF0aWMgY2hhciBzZWNhbVtdID0gIi0tIjsKK3N0YXRpYyBjaGFyIG50c2NbXSA9ICItIjsKIAotCWlmICh0LT5zdGQgJiBWNEwyX1NURF82MjVfNTApIHsKLQkJaWYgKCgxID09IHQtPnBpbm5hY2xlX2lkKSB8fCAoNyA9PSB0LT5waW5uYWNsZV9pZCkpIHsKLQkJCWJDYXJyaWVyTW9kZSA9IGNJbnRlcmNhcnJpZXI7Ci0JCX0gZWxzZSB7Ci0JCQliQ2Fycmllck1vZGUgPSBjUVNTOwotCQl9Ci0JfQotCWlmICh0LT5zdGQgJiBWNEwyX1NURF81MjVfNjApIHsKLQkJaWYgKCg1ID09IHQtPnBpbm5hY2xlX2lkKSB8fCAoNiA9PSB0LT5waW5uYWNsZV9pZCkpIHsKLQkJCWJDYXJyaWVyTW9kZSA9IGNJbnRlcmNhcnJpZXI7Ci0JCX0gZWxzZSB7Ci0JCQliQ2Fycmllck1vZGUgPSBjUVNTOwotCQl9Ci0JfQotCi0JaWYgKGJDYXJyaWVyTW9kZSAhPSBVTlNFVCkgewotCQlidWZbMV0gJj0gfjB4MDQ7Ci0JCWJ1ZlsxXSB8PSBiQ2Fycmllck1vZGU7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBjaGFyIHBhbFtdID0gIi0iOwogbW9kdWxlX3BhcmFtX3N0cmluZyhwYWwsIHBhbCwgc2l6ZW9mKHBhbCksIDA2NDQpOwotc3RhdGljIGNoYXIgc2VjYW1bXSA9ICItIjsKIG1vZHVsZV9wYXJhbV9zdHJpbmcoc2VjYW0sIHNlY2FtLCBzaXplb2Yoc2VjYW0pLCAwNjQ0KTsKK21vZHVsZV9wYXJhbV9zdHJpbmcobnRzYywgbnRzYywgc2l6ZW9mKG50c2MpLCAwNjQ0KTsKIAogc3RhdGljIGludCB0ZGE5ODg3X2ZpeHVwX3N0ZChzdHJ1Y3QgdGRhOTg4NyAqdCkKIHsKQEAgLTUxNCw4ICs1MzQsMTcgQEAKIAkJY2FzZSAnQic6CiAJCWNhc2UgJ2cnOgogCQljYXNlICdHJzoKLQkJCXRkYTk4ODdfZGJnKCJpbnNtb2QgZml4dXA6IFBBTCA9PiBQQUwtQkdcbiIpOwotCQkJdC0+c3RkID0gVjRMMl9TVERfUEFMX0JHOworCQljYXNlICdoJzoKKwkJY2FzZSAnSCc6CisJCWNhc2UgJ24nOgorCQljYXNlICdOJzoKKwkJCWlmIChwYWxbMV0gPT0gJ2MnIHx8IHBhbFsxXSA9PSAnQycpIHsKKwkJCQl0ZGE5ODg3X2RiZygiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLU5jXG4iKTsKKwkJCQl0LT5zdGQgPSBWNEwyX1NURF9QQUxfTmM7CisJCQl9IGVsc2UgeworCQkJCXRkYTk4ODdfZGJnKCJpbnNtb2QgZml4dXA6IFBBTCA9PiBQQUwtQkdITlxuIik7CisJCQkJdC0+c3RkID0gVjRMMl9TVERfUEFMX0JHIHwgVjRMMl9TVERfUEFMX0ggfCBWNEwyX1NURF9QQUxfTjsKKwkJCX0KIAkJCWJyZWFrOwogCQljYXNlICdpJzoKIAkJY2FzZSAnSSc6CkBAIC01MjksNiArNTU4LDExIEBACiAJCQl0ZGE5ODg3X2RiZygiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLURLXG4iKTsKIAkJCXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9ESzsKIAkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJY2FzZSAnTSc6CisJCQl0ZGE5ODg3X2RiZygiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLU1cbiIpOworCQkJdC0+c3RkID0gVjRMMl9TVERfUEFMX007CisJCQlicmVhazsKIAkJY2FzZSAnLSc6CiAJCQkvKiBkZWZhdWx0IHBhcmFtZXRlciwgZG8gbm90aGluZyAqLwogCQkJYnJlYWs7CkBAIC01MzksNiArNTczLDE1IEBACiAJfQogCWlmICgodC0+c3RkICYgVjRMMl9TVERfU0VDQU0pID09IFY0TDJfU1REX1NFQ0FNKSB7CiAJCXN3aXRjaCAoc2VjYW1bMF0pIHsKKwkJY2FzZSAnYic6CisJCWNhc2UgJ0InOgorCQljYXNlICdnJzoKKwkJY2FzZSAnRyc6CisJCWNhc2UgJ2gnOgorCQljYXNlICdIJzoKKwkJCXRkYTk4ODdfZGJnKCJpbnNtb2QgZml4dXA6IFNFQ0FNID0+IFNFQ0FNLUJHSFxuIik7CisJCQl0LT5zdGQgPSBWNEwyX1NURF9TRUNBTV9CIHwgVjRMMl9TVERfU0VDQU1fRyB8IFY0TDJfU1REX1NFQ0FNX0g7CisJCQlicmVhazsKIAkJY2FzZSAnZCc6CiAJCWNhc2UgJ0QnOgogCQljYXNlICdrJzoKQEAgLTU0OCw4ICs1OTEsMTMgQEAKIAkJCWJyZWFrOwogCQljYXNlICdsJzoKIAkJY2FzZSAnTCc6Ci0JCQl0ZGE5ODg3X2RiZygiaW5zbW9kIGZpeHVwOiBTRUNBTSA9PiBTRUNBTS1MXG4iKTsKLQkJCXQtPnN0ZCA9IFY0TDJfU1REX1NFQ0FNX0w7CisJCQlpZiAoc2VjYW1bMV0gPT0gJ2MnIHx8IHNlY2FtWzFdID09ICdDJykgeworCQkJCXRkYTk4ODdfZGJnKCJpbnNtb2QgZml4dXA6IFNFQ0FNID0+IFNFQ0FNLUwnXG4iKTsKKwkJCQl0LT5zdGQgPSBWNEwyX1NURF9TRUNBTV9MQzsKKwkJCX0gZWxzZSB7CisJCQkJdGRhOTg4N19kYmcoImluc21vZCBmaXh1cDogU0VDQU0gPT4gU0VDQU0tTFxuIik7CisJCQkJdC0+c3RkID0gVjRMMl9TVERfU0VDQU1fTDsKKwkJCX0KIAkJCWJyZWFrOwogCQljYXNlICctJzoKIAkJCS8qIGRlZmF1bHQgcGFyYW1ldGVyLCBkbyBub3RoaW5nICovCkBAIC01NTksNiArNjA3LDI2IEBACiAJCQlicmVhazsKIAkJfQogCX0KKwlpZiAoKHQtPnN0ZCAmIFY0TDJfU1REX05UU0MpID09IFY0TDJfU1REX05UU0MpIHsKKwkJc3dpdGNoIChudHNjWzBdKSB7CisJCWNhc2UgJ20nOgorCQljYXNlICdNJzoKKwkJCXRkYTk4ODdfZGJnKCJpbnNtb2QgZml4dXA6IE5UU0MgPT4gTlRTQy1NXG4iKTsKKwkJCXQtPnN0ZCA9IFY0TDJfU1REX05UU0NfTTsKKwkJCWJyZWFrOworCQljYXNlICdqJzoKKwkJY2FzZSAnSic6CisJCQl0ZGE5ODg3X2RiZygiaW5zbW9kIGZpeHVwOiBOVFNDID0+IE5UU0NfTV9KUFxuIik7CisJCQl0LT5zdGQgPSBWNEwyX1NURF9OVFNDX01fSlA7CisJCQlicmVhazsKKwkJY2FzZSAnLSc6CisJCQkvKiBkZWZhdWx0IHBhcmFtZXRlciwgZG8gbm90aGluZyAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0ZGE5ODg3X2luZm8oIm50c2M9IGFyZ3VtZW50IG5vdCByZWNvZ25pc2VkXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQogCXJldHVybiAwOwogfQogCkBAIC01ODEsMTIgKzY0OSwyMiBAQAogCW1lbXNldCh0LT5kYXRhLDAsc2l6ZW9mKHQtPmRhdGEpKTsKIAl0ZGE5ODg3X3NldF90dm5vcm0odCx0LT5kYXRhKTsKIAorCS8qIEEgbm90ZSBvbiB0aGUgcG9ydCBzZXR0aW5nczoKKwkgICBUaGVzZSBzZXR0aW5ncyB0ZW5kIHRvIGRlcGVuZCBvbiB0aGUgc3BlY2lmaWNzIG9mIHRoZSBib2FyZC4KKwkgICBCeSBkZWZhdWx0IHRoZXkgYXJlIHNldCB0byBpbmFjdGl2ZSAoYml0IHZhbHVlIDEpIGJ5IHRoaXMgZHJpdmVyLAorCSAgIG92ZXJ3cml0aW5nIGFueSBjaGFuZ2VzIG1hZGUgYnkgdGhlIHR2bm9ybS4gVGhpcyBtZWFucyB0aGF0IGl0CisJICAgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBtb2R1bGUgdXNpbmcgdGhlIHRkYTk4ODcgdG8gc2V0CisJICAgdGhlc2UgdmFsdWVzIGluIGNhc2Ugb2YgY2hhbmdlcyBpbiB0aGUgdHZub3JtLgorCSAgIEluIG1hbnkgY2FzZXMgcG9ydCAyIHNob3VsZCBiZSBtYWRlIGFjdGl2ZSAoMCkgd2hlbiBzZWxlY3RpbmcKKwkgICBTRUNBTS1MLCBhbmQgcG9ydCAyIHNob3VsZCByZW1haW4gaW5hY3RpdmUgKDEpIGZvciBTRUNBTS1MJy4KKworCSAgIEZvciB0aGUgb3RoZXIgc3RhbmRhcmRzIHRoZSB0ZGE5ODg3IGFwcGxpY2F0aW9uIG5vdGUgc2F5cyB0aGF0CisJICAgdGhlIHBvcnRzIHNob3VsZCBiZSBzZXQgdG8gYWN0aXZlICgwKSwgYnV0LCBhZ2FpbiwgdGhhdCBtYXkKKwkgICBkaWZmZXIgZGVwZW5kaW5nIG9uIHRoZSBwcmVjaXNlIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24uCisJICovCiAJdC0+ZGF0YVsxXSB8PSBjT3V0cHV0UG9ydDFJbmFjdGl2ZTsKIAl0LT5kYXRhWzFdIHw9IGNPdXRwdXRQb3J0MkluYWN0aXZlOwogCi0JaWYgKFVOU0VUICE9IHQtPnBpbm5hY2xlX2lkKSB7Ci0JCXRkYTk4ODdfc2V0X3Bpbm5hY2xlKHQsdC0+ZGF0YSk7Ci0JfQogCXRkYTk4ODdfc2V0X2NvbmZpZyh0LHQtPmRhdGEpOwogCXRkYTk4ODdfc2V0X2luc21vZCh0LHQtPmRhdGEpOwogCkBAIC01OTQsNyArNjcyLDYgQEAKIAkJdC0+ZGF0YVsxXSB8PSBjRm9yY2VkTXV0ZUF1ZGlvT047CiAJfQogCi0KIAl0ZGE5ODg3X2RiZygid3JpdGluZzogYj0weCUwMnggYz0weCUwMnggZT0weCUwMnhcbiIsCiAJCXQtPmRhdGFbMV0sdC0+ZGF0YVsyXSx0LT5kYXRhWzNdKTsKIAlpZiAoZGVidWcgPiAxKQpAQCAtNjE5LDEzICs2OTYsMTEgQEAKIAljbGllbnRfdGVtcGxhdGUuYWRhcHRlciA9IGFkYXA7CiAJY2xpZW50X3RlbXBsYXRlLmFkZHIgICAgPSBhZGRyOwogCi0JaWYgKE5VTEwgPT0gKHQgPSBrbWFsbG9jKHNpemVvZigqdCksIEdGUF9LRVJORUwpKSkKKwlpZiAoTlVMTCA9PSAodCA9IGt6YWxsb2Moc2l6ZW9mKCp0KSwgR0ZQX0tFUk5FTCkpKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQodCwwLHNpemVvZigqdCkpOwogCiAJdC0+Y2xpZW50ICAgICAgPSBjbGllbnRfdGVtcGxhdGU7CiAJdC0+c3RkICAgICAgICAgPSAwOwotCXQtPnBpbm5hY2xlX2lkID0gVU5TRVQ7CiAJdC0+cmFkaW9fbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CiAKIAl0ZGE5ODg3X2luZm8oImNoaXAgZm91bmQgQCAweCV4ICglcylcbiIsIGFkZHI8PDEsIGFkYXAtPm5hbWUpOwpAQCAtNjM4LDE4ICs3MTMsOCBAQAogCiBzdGF0aWMgaW50IHRkYTk4ODdfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQogewotI2lmZGVmIEkyQ19DTEFTU19UVl9BTkFMT0cKIAlpZiAoYWRhcC0+Y2xhc3MgJiBJMkNfQ0xBU1NfVFZfQU5BTE9HKQogCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHRkYTk4ODdfYXR0YWNoKTsKLSNlbHNlCi0Jc3dpdGNoIChhZGFwLT5pZCkgewotCWNhc2UgSTJDX0hXX0JfQlQ4NDg6Ci0JY2FzZSBJMkNfSFdfQl9SSVZBOgotCWNhc2UgSTJDX0hXX1NBQTcxMzQ6Ci0JCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgdGRhOTg4N19hdHRhY2gpOwotCQlicmVhazsKLQl9Ci0jZW5kaWYKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjg5LDE0ICs3NTQsNiBAQAogCQl0ZGE5ODg3X2NvbmZpZ3VyZSh0KTsKIAkJYnJlYWs7CiAJfQotCWNhc2UgQVVEQ19DT05GSUdfUElOTkFDTEU6Ci0JewotCQlpbnQgKmkgPSBhcmc7Ci0KLQkJdC0+cGlubmFjbGVfaWQgPSAqaTsKLQkJdGRhOTg4N19jb25maWd1cmUodCk7Ci0JCWJyZWFrOwotCX0KIAljYXNlIFREQTk4ODdfU0VUX0NPTkZJRzoKIAl7CiAJCWludCAqaSA9IGFyZzsKQEAgLTc4Nyw3ICs4NDQsNyBAQAogCX0KIAljYXNlIFZJRElPQ19MT0dfU1RBVFVTOgogCXsKLQkJdGRhOTg4N19pbmZvKCJEYXRhIGJ5dGVzOiBiPSUwMnggYz0lMDJ4IGU9JTAyeFxuIiwgdC0+ZGF0YVsxXSwgdC0+ZGF0YVsyXSwgdC0+ZGF0YVszXSk7CisJCXRkYTk4ODdfaW5mbygiRGF0YSBieXRlczogYj0weCUwMnggYz0weCUwMnggZT0weCUwMnhcbiIsIHQtPmRhdGFbMV0sIHQtPmRhdGFbMl0sIHQtPmRhdGFbM10pOwogCQlicmVhazsKIAl9CiAJZGVmYXVsdDoKQEAgLTgyNCw3ICs4ODEsNyBAQAogCS5kZXRhY2hfY2xpZW50ICA9IHRkYTk4ODdfZGV0YWNoLAogCS5jb21tYW5kICAgICAgICA9IHRkYTk4ODdfY29tbWFuZCwKIAkuZHJpdmVyID0gewotCQkubmFtZSAgICA9ICJpMmMgdGRhOTg4NyBkcml2ZXIiLAorCQkubmFtZSAgICA9ICJ0ZGE5ODg3IiwKIAkJLnN1c3BlbmQgPSB0ZGE5ODg3X3N1c3BlbmQsCiAJCS5yZXN1bWUgID0gdGRhOTg4N19yZXN1bWUsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGVhNTc2Ny5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZWE1NzY3LmMKaW5kZXggYTkzNzVlZi4uYzJiOThmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90ZWE1NzY3LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZWE1NzY3LmMKQEAgLTE3LDYgKzE3LDkgQEAKIAogI2RlZmluZSBQUkVGSVggIlRFQTU3NjcgIgogCisvKiBmcm9tIHR1bmVyLWNvcmUuYyAqLworZXh0ZXJuIGludCB0dW5lcl9kZWJ1ZzsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01OSw3ICs2Miw3IEBACiAKICNkZWZpbmUgVEVBNTc2N19QT1JUMV9ISUdICTB4MDEKIAotLyogRm9ydGggcmVnaXN0ZXIgKi8KKy8qIEZvdXJ0aCByZWdpc3RlciAqLwogI2RlZmluZSBURUE1NzY3X1BPUlQyX0hJR0gJMHg4MAogLyogQ2hpcHMgc3RvcHMgd29ya2luZy4gT25seSBJMkMgYnVzIHJlbWFpbnMgb24gKi8KICNkZWZpbmUgVEVBNTc2N19TVERCWQkJMHg0MApAQCAtODIsNyArODUsNyBAQAogLyogSWYgYWN0aXZhdGUgUE9SVCAxIGluZGljYXRlcyBTRUFSQ0ggb3IgZWxzZSBpdCBpcyB1c2VkIGFzIFBPUlQxICovCiAjZGVmaW5lIFRFQTU3NjdfU1JDSF9JTkQJMHgwMQogCi0vKiBGaXZldGggcmVnaXN0ZXIgKi8KKy8qIEZpZnRoIHJlZ2lzdGVyICovCiAKIC8qIEJ5IGFjdGl2YXRpbmcsIGl0IHdpbGwgdXNlIFh0YWwgYXQgMTMgTUh6IGFzIHJlZmVyZW5jZSBmb3IgZGl2aWRlciAqLwogI2RlZmluZSBURUE1NzY3X1BMTFJFRl9FTkFCTEUJMHg4MApAQCAtMTA2LDEzICsxMDksMTMgQEAKICNkZWZpbmUgVEVBNTc2N19TVEVSRU9fTUFTSwkweDgwCiAjZGVmaW5lIFRFQTU3NjdfSUZfQ05UUl9NQVNLCTB4N2YKIAotLyogRm91ciByZWdpc3RlciAqLworLyogRm91cnRoIHJlZ2lzdGVyICovCiAjZGVmaW5lIFRFQTU3NjdfQURDX0xFVkVMX01BU0sJMHhmMAogCiAvKiBzaG91bGQgYmUgMCAqLwogI2RlZmluZSBURUE1NzY3X0NISVBfSURfTUFTSwkweDBmCiAKLS8qIEZpdmV0aCByZWdpc3RlciAqLworLyogRmlmdGggcmVnaXN0ZXIgKi8KIC8qIFJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyAqLwogI2RlZmluZSBURUE1NzY3X1JFU0VSVkVEX01BU0sJMHhmZgogCkBAIC0yMTcsMTkgKzIyMCwxOSBAQAogCQl0dW5lcl9kYmcgKCJURUE1NzY3IHJhZGlvIEhJR0ggTE8gaW5qZWN0IHh0YWwgQCAxMyBNSHpcbiIpOwogCQlidWZmZXJbMl0gfD0gVEVBNTc2N19ISUdIX0xPX0lOSkVDVDsKIAkJYnVmZmVyWzRdIHw9IFRFQTU3NjdfUExMUkVGX0VOQUJMRTsKLQkJZGl2ID0gKGZycSAqIDQwMDAgLyAxNiArIDcwMDAwMCArIDIyNTAwMCArIDI1MDAwKSAvIDUwMDAwOworCQlkaXYgPSAoZnJxICogKDQwMDAgLyAxNikgKyA3MDAwMDAgKyAyMjUwMDAgKyAyNTAwMCkgLyA1MDAwMDsKIAkJYnJlYWs7CiAJY2FzZSBURUE1NzY3X0xPV19MT18xM01IejoKIAkJdHVuZXJfZGJnICgiVEVBNTc2NyByYWRpbyBMT1cgTE8gaW5qZWN0IHh0YWwgQCAxMyBNSHpcbiIpOwogCiAJCWJ1ZmZlcls0XSB8PSBURUE1NzY3X1BMTFJFRl9FTkFCTEU7Ci0JCWRpdiA9IChmcnEgKiA0MDAwIC8gMTYgLSA3MDAwMDAgLSAyMjUwMDAgKyAyNTAwMCkgLyA1MDAwMDsKKwkJZGl2ID0gKGZycSAqICg0MDAwIC8gMTYpIC0gNzAwMDAwIC0gMjI1MDAwICsgMjUwMDApIC8gNTAwMDA7CiAJCWJyZWFrOwogCWNhc2UgVEVBNTc2N19MT1dfTE9fMzI3Njg6CiAJCXR1bmVyX2RiZyAoIlRFQTU3NjcgcmFkaW8gTE9XIExPIGluamVjdCB4dGFsIEAgMzIsNzY4IE1IelxuIik7CiAJCWJ1ZmZlclszXSB8PSBURUE1NzY3X1hUQUxfMzI3Njg7CiAJCS8qIGNvbnN0IDcwMD00MDAwKjE3NSBLaHogLSB0byBhZGp1c3QgZnJlcSB0byByaWdodCB2YWx1ZSAqLwotCQlkaXYgPSAoKGZycSAqIDQwMDAgLyAxNiAtIDcwMDAwMCAtIDIyNTAwMCkgKyAxNjM4NCkgPj4gMTU7CisJCWRpdiA9ICgoZnJxICogKDQwMDAgLyAxNikgLSA3MDAwMDAgLSAyMjUwMDApICsgMTYzODQpID4+IDE1OwogCQlicmVhazsKIAljYXNlIFRFQTU3NjdfSElHSF9MT18zMjc2ODoKIAlkZWZhdWx0OgpAQCAtMjY0LDcgKzI2Nyw3IEBACiAJaWYgKDUgIT0gKHJjID0gaTJjX21hc3Rlcl9yZWN2KGMsIGJ1ZmZlciwgNSkpKQogCQl0dW5lcl93YXJuKCJpMmMgaS9vIGVycm9yOiByYyA9PSAlZCAoc2hvdWxkIGJlIDUpXG4iLCByYyk7CiAKLQlyZXR1cm4gKChidWZmZXJbM10gJiBURUE1NzY3X0FEQ19MRVZFTF9NQVNLKSA8PCAoMTMgLSA0KSk7CisJcmV0dXJuICgoYnVmZmVyWzNdICYgVEVBNTc2N19BRENfTEVWRUxfTUFTSykgPDwgOCk7CiB9CiAKIHN0YXRpYyBpbnQgdGVhNTc2N19zdGVyZW8oc3RydWN0IGkyY19jbGllbnQgKmMpCkBAIC0zNDcsOCArMzUwLDggQEAKIAl0dW5lcl9pbmZvKCJ0eXBlIHNldCB0byAlZCAoJXMpXG4iLCB0LT50eXBlLCAiUGhpbGlwcyBURUE1NzY3SE4gRk0gUmFkaW8iKTsKIAlzdHJsY3B5KGMtPm5hbWUsICJ0ZWE1NzY3Iiwgc2l6ZW9mKGMtPm5hbWUpKTsKIAotCXQtPnR2X2ZyZXEgPSBzZXRfdHZfZnJlcTsKLQl0LT5yYWRpb19mcmVxID0gc2V0X3JhZGlvX2ZyZXE7CisJdC0+c2V0X3R2X2ZyZXEgPSBzZXRfdHZfZnJlcTsKKwl0LT5zZXRfcmFkaW9fZnJlcSA9IHNldF9yYWRpb19mcmVxOwogCXQtPmhhc19zaWduYWwgPSB0ZWE1NzY3X3NpZ25hbDsKIAl0LT5pc19zdGVyZW8gPSB0ZWE1NzY3X3N0ZXJlbzsKIAl0LT5zdGFuZGJ5ID0gdGVhNTc2N19zdGFuZGJ5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZWE2NDIwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTY0MjAuYwppbmRleCBjNGJhMzc0Li40ZGNiYTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTY0MjAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTY0MjAuYwpAQCAtOTksMTEgKzk5LDEwIEBACiAJfQogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBjbGllbnQgc3RydWN0dXJlICovCi0JY2xpZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKKwljbGllbnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOwogCWlmICgwID09IGNsaWVudCkgewogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtc2V0KGNsaWVudCwgMHgwLCBzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKIAogCS8qIGZpbGwgY2xpZW50IHN0cnVjdHVyZSAqLwogCW1lbWNweShjbGllbnQsICZjbGllbnRfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci0zMDM2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLTMwMzYuYwppbmRleCBkOTdmNjY4Li5jNGE3OGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLTMwMzYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLTMwMzYuYwpAQCAtMTkzLDggKzE5Myw3IEBACiBzdGF0aWMgaW50IF9faW5pdAogdHVuZXIzMDM2X2luaXQodm9pZCkKIHsKLQlpMmNfYWRkX2RyaXZlcigmaTJjX2RyaXZlcl90dW5lcik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZpMmNfZHJpdmVyX3R1bmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCmluZGV4IGMxM2M3YjkuLjI5OTViMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCkBAIC0yMCwxMCArMjAsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2NoaXAuaD4KIAotI2luY2x1ZGUgIm1zcDM0MDAuaCIKLQogI2RlZmluZSBVTlNFVCAoLTFVKQogCiAvKiBzdGFuZGFyZCBpMmMgaW5zbW9kIG9wdGlvbnMgKi8KQEAgLTM4LDIxICszNywzMCBAQAogCiAvKiBpbnNtb2Qgb3B0aW9ucyB1c2VkIGF0IGluaXQgdGltZSA9PiByZWFkL29ubHkgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgYWRkciA9IDA7Ci1tb2R1bGVfcGFyYW0oYWRkciwgaW50LCAwNDQ0KTsKLQogc3RhdGljIHVuc2lnbmVkIGludCBub19hdXRvZGV0ZWN0ID0gMDsKLW1vZHVsZV9wYXJhbShub19hdXRvZGV0ZWN0LCBpbnQsIDA0NDQpOwotCiBzdGF0aWMgdW5zaWduZWQgaW50IHNob3dfaTJjID0gMDsKLW1vZHVsZV9wYXJhbShzaG93X2kyYywgaW50LCAwNDQ0KTsKIAogLyogaW5zbW9kIG9wdGlvbnMgdXNlZCBhdCBydW50aW1lID0+IHJlYWQvd3JpdGUgKi8KLXVuc2lnbmVkIGludCB0dW5lcl9kZWJ1ZyA9IDA7Ci1tb2R1bGVfcGFyYW0odHVuZXJfZGVidWcsIGludCwgMDY0NCk7CitzdGF0aWMgdW5zaWduZWQgaW50IHR1bmVyX2RlYnVnX29sZCA9IDA7CitpbnQgdHVuZXJfZGVidWcgPSAwOwogCiBzdGF0aWMgdW5zaWduZWQgaW50IHR2X3JhbmdlWzJdID0geyA0NCwgOTU4IH07CiBzdGF0aWMgdW5zaWduZWQgaW50IHJhZGlvX3JhbmdlWzJdID0geyA2NSwgMTA4IH07CiAKK3N0YXRpYyBjaGFyIHBhbFtdID0gIi0tIjsKK3N0YXRpYyBjaGFyIHNlY2FtW10gPSAiLS0iOworc3RhdGljIGNoYXIgbnRzY1tdID0gIi0iOworCisKK21vZHVsZV9wYXJhbShhZGRyLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKG5vX2F1dG9kZXRlY3QsIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oc2hvd19pMmMsIGludCwgMDQ0NCk7CisvKiBOb3RlOiB0dW5lcl9kZWJ1ZyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gMi42LjE3ICovCittb2R1bGVfcGFyYW1fbmFtZWQodHVuZXJfZGVidWcsdHVuZXJfZGVidWdfb2xkLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLHR1bmVyX2RlYnVnLCBpbnQsIDA2NDQpOworbW9kdWxlX3BhcmFtX3N0cmluZyhwYWwsIHBhbCwgc2l6ZW9mKHBhbCksIDA2NDQpOworbW9kdWxlX3BhcmFtX3N0cmluZyhzZWNhbSwgc2VjYW0sIHNpemVvZihzZWNhbSksIDA2NDQpOworbW9kdWxlX3BhcmFtX3N0cmluZyhudHNjLCBudHNjLCBzaXplb2YobnRzYyksIDA2NDQpOwogbW9kdWxlX3BhcmFtX2FycmF5KHR2X3JhbmdlLCBpbnQsIE5VTEwsIDA2NDQpOwogbW9kdWxlX3BhcmFtX2FycmF5KHJhZGlvX3JhbmdlLCBpbnQsIE5VTEwsIDA2NDQpOwogCkBAIC03NCw3ICs4Miw3IEBACiAJCXR1bmVyX3dhcm4gKCJ0dW5lciB0eXBlIG5vdCBzZXRcbiIpOwogCQlyZXR1cm47CiAJfQotCWlmIChOVUxMID09IHQtPnR2X2ZyZXEpIHsKKwlpZiAoTlVMTCA9PSB0LT5zZXRfdHZfZnJlcSkgewogCQl0dW5lcl93YXJuICgiVHVuZXIgaGFzIG5vIHdheSB0byBzZXQgdHYgZnJlcVxuIik7CiAJCXJldHVybjsKIAl9CkBAIC04Miw4ICs5MCwxNCBAQAogCQl0dW5lcl9kYmcgKCJUViBmcmVxICglZC4lMDJkKSBvdXQgb2YgcmFuZ2UgKCVkLSVkKVxuIiwKIAkJCSAgIGZyZXEgLyAxNiwgZnJlcSAlIDE2ICogMTAwIC8gMTYsIHR2X3JhbmdlWzBdLAogCQkJICAgdHZfcmFuZ2VbMV0pOworCQkvKiBWNEwyIHNwZWM6IGlmIHRoZSBmcmVxIGlzIG5vdCBwb3NzaWJsZSB0aGVuIHRoZSBjbG9zZXN0CisJCSAgIHBvc3NpYmxlIHZhbHVlIHNob3VsZCBiZSBzZWxlY3RlZCAqLworCQlpZiAoZnJlcSA8IHR2X3JhbmdlWzBdICogMTYpCisJCQlmcmVxID0gdHZfcmFuZ2VbMF0gKiAxNjsKKwkJZWxzZQorCQkJZnJlcSA9IHR2X3JhbmdlWzFdICogMTY7CiAJfQotCXQtPnR2X2ZyZXEoYywgZnJlcSk7CisJdC0+c2V0X3R2X2ZyZXEoYywgZnJlcSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNldF9yYWRpb19mcmVxKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgZnJlcSkKQEAgLTk0LDE4ICsxMDgsMjMgQEAKIAkJdHVuZXJfd2FybiAoInR1bmVyIHR5cGUgbm90IHNldFxuIik7CiAJCXJldHVybjsKIAl9Ci0JaWYgKE5VTEwgPT0gdC0+cmFkaW9fZnJlcSkgeworCWlmIChOVUxMID09IHQtPnNldF9yYWRpb19mcmVxKSB7CiAJCXR1bmVyX3dhcm4gKCJ0dW5lciBoYXMgbm8gd2F5IHRvIHNldCByYWRpbyBmcmVxdWVuY3lcbiIpOwogCQlyZXR1cm47CiAJfQotCWlmIChmcmVxIDw9IHJhZGlvX3JhbmdlWzBdICogMTYwMDAgfHwgZnJlcSA+PSByYWRpb19yYW5nZVsxXSAqIDE2MDAwKSB7CisJaWYgKGZyZXEgPCByYWRpb19yYW5nZVswXSAqIDE2MDAwIHx8IGZyZXEgPiByYWRpb19yYW5nZVsxXSAqIDE2MDAwKSB7CiAJCXR1bmVyX2RiZyAoInJhZGlvIGZyZXEgKCVkLiUwMmQpIG91dCBvZiByYW5nZSAoJWQtJWQpXG4iLAogCQkJICAgZnJlcSAvIDE2MDAwLCBmcmVxICUgMTYwMDAgKiAxMDAgLyAxNjAwMCwKIAkJCSAgIHJhZGlvX3JhbmdlWzBdLCByYWRpb19yYW5nZVsxXSk7CisJCS8qIFY0TDIgc3BlYzogaWYgdGhlIGZyZXEgaXMgbm90IHBvc3NpYmxlIHRoZW4gdGhlIGNsb3Nlc3QKKwkJICAgcG9zc2libGUgdmFsdWUgc2hvdWxkIGJlIHNlbGVjdGVkICovCisJCWlmIChmcmVxIDwgcmFkaW9fcmFuZ2VbMF0gKiAxNjAwMCkKKwkJCWZyZXEgPSByYWRpb19yYW5nZVswXSAqIDE2MDAwOworCQllbHNlCisJCQlmcmVxID0gcmFkaW9fcmFuZ2VbMV0gKiAxNjAwMDsKIAl9CiAKLQl0LT5yYWRpb19mcmVxKGMsIGZyZXEpOwotCXJldHVybjsKKwl0LT5zZXRfcmFkaW9fZnJlcShjLCBmcmVxKTsKIH0KIAogc3RhdGljIHZvaWQgc2V0X2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGxvbmcgZnJlcSkKQEAgLTExNywxNSArMTM2LDE2IEBACiAJCXR1bmVyX2RiZygicmFkaW8gZnJlcSBzZXQgdG8gJWx1LiUwMmx1XG4iLAogCQkJICBmcmVxIC8gMTYwMDAsIGZyZXEgJSAxNjAwMCAqIDEwMCAvIDE2MDAwKTsKIAkJc2V0X3JhZGlvX2ZyZXEoYywgZnJlcSk7CisJCXQtPnJhZGlvX2ZyZXEgPSBmcmVxOwogCQlicmVhazsKIAljYXNlIFY0TDJfVFVORVJfQU5BTE9HX1RWOgogCWNhc2UgVjRMMl9UVU5FUl9ESUdJVEFMX1RWOgogCQl0dW5lcl9kYmcoInR2IGZyZXEgc2V0IHRvICVsdS4lMDJsdVxuIiwKIAkJCSAgZnJlcSAvIDE2LCBmcmVxICUgMTYgKiAxMDAgLyAxNik7CiAJCXNldF90dl9mcmVxKGMsIGZyZXEpOworCQl0LT50dl9mcmVxID0gZnJlcTsKIAkJYnJlYWs7CiAJfQotCXQtPmZyZXEgPSBmcmVxOwogfQogCiBzdGF0aWMgdm9pZCBzZXRfdHlwZShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IHR5cGUsCkBAIC0yMDQsNyArMjI0LDcgQEAKIAlpZiAodC0+bW9kZV9tYXNrID09IFRfVU5JTklUSUFMSVpFRCkKIAkJdC0+bW9kZV9tYXNrID0gbmV3X21vZGVfbWFzazsKIAotCXNldF9mcmVxKGMsIHQtPmZyZXEpOworCXNldF9mcmVxKGMsIChWNEwyX1RVTkVSX1JBRElPID09IHQtPm1vZGUpID8gdC0+cmFkaW9fZnJlcSA6IHQtPnR2X2ZyZXEpOwogCXR1bmVyX2RiZygiJXMgJXMgSTJDIGFkZHIgMHglMDJ4IHdpdGggdHlwZSAlZCB1c2VkIGZvciAweCUwMnhcbiIsCiAJCSAgYy0+YWRhcHRlci0+bmFtZSwgYy0+ZHJpdmVyLT5kcml2ZXIubmFtZSwgYy0+YWRkciA8PCAxLCB0eXBlLAogCQkgIHQtPm1vZGVfbWFzayk7CkBAIC0yNDksMTEgKzI2OSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjaGFyIHBhbFtdID0gIi0iOwotbW9kdWxlX3BhcmFtX3N0cmluZyhwYWwsIHBhbCwgc2l6ZW9mKHBhbCksIDA2NDQpOwotc3RhdGljIGNoYXIgc2VjYW1bXSA9ICItLSI7Ci1tb2R1bGVfcGFyYW1fc3RyaW5nKHNlY2FtLCBzZWNhbSwgc2l6ZW9mKHNlY2FtKSwgMDY0NCk7Ci0KIC8qIGdldCBtb3JlIHByZWNpc2Ugbm9ybSBpbmZvIGZyb20gaW5zbW9kIG9wdGlvbiAqLwogc3RhdGljIGludCB0dW5lcl9maXh1cF9zdGQoc3RydWN0IHR1bmVyICp0KQogewpAQCAtMjg1LDggKzMwMCwxMyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgJ04nOgogCQljYXNlICduJzoKLQkJCXR1bmVyX2RiZyAoImluc21vZCBmaXh1cDogUEFMID0+IFBBTC1OXG4iKTsKLQkJCXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9OOworCQkJaWYgKHBhbFsxXSA9PSAnYycgfHwgcGFsWzFdID09ICdDJykgeworCQkJCXR1bmVyX2RiZygiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLU5jXG4iKTsKKwkJCQl0LT5zdGQgPSBWNEwyX1NURF9QQUxfTmM7CisJCQl9IGVsc2UgeworCQkJCXR1bmVyX2RiZyAoImluc21vZCBmaXh1cDogUEFMID0+IFBBTC1OXG4iKTsKKwkJCQl0LT5zdGQgPSBWNEwyX1NURF9QQUxfTjsKKwkJCX0KIAkJCWJyZWFrOwogCQljYXNlICctJzoKIAkJCS8qIGRlZmF1bHQgcGFyYW1ldGVyLCBkbyBub3RoaW5nICovCkBAIC0yOTgsNiArMzE4LDE1IEBACiAJfQogCWlmICgodC0+c3RkICYgVjRMMl9TVERfU0VDQU0pID09IFY0TDJfU1REX1NFQ0FNKSB7CiAJCXN3aXRjaCAoc2VjYW1bMF0pIHsKKwkJY2FzZSAnYic6CisJCWNhc2UgJ0InOgorCQljYXNlICdnJzoKKwkJY2FzZSAnRyc6CisJCWNhc2UgJ2gnOgorCQljYXNlICdIJzoKKwkJCXR1bmVyX2RiZygiaW5zbW9kIGZpeHVwOiBTRUNBTSA9PiBTRUNBTS1CR0hcbiIpOworCQkJdC0+c3RkID0gVjRMMl9TVERfU0VDQU1fQiB8IFY0TDJfU1REX1NFQ0FNX0cgfCBWNEwyX1NURF9TRUNBTV9IOworCQkJYnJlYWs7CiAJCWNhc2UgJ2QnOgogCQljYXNlICdEJzoKIAkJY2FzZSAnayc6CkBAIC0zMjQsOSArMzUzLDYwIEBACiAJCX0KIAl9CiAKKwlpZiAoKHQtPnN0ZCAmIFY0TDJfU1REX05UU0MpID09IFY0TDJfU1REX05UU0MpIHsKKwkJc3dpdGNoIChudHNjWzBdKSB7CisJCWNhc2UgJ20nOgorCQljYXNlICdNJzoKKwkJCXR1bmVyX2RiZygiaW5zbW9kIGZpeHVwOiBOVFNDID0+IE5UU0MtTVxuIik7CisJCQl0LT5zdGQgPSBWNEwyX1NURF9OVFNDX007CisJCQlicmVhazsKKwkJY2FzZSAnaic6CisJCWNhc2UgJ0onOgorCQkJdHVuZXJfZGJnKCJpbnNtb2QgZml4dXA6IE5UU0MgPT4gTlRTQ19NX0pQXG4iKTsKKwkJCXQtPnN0ZCA9IFY0TDJfU1REX05UU0NfTV9KUDsKKwkJCWJyZWFrOworCQljYXNlICctJzoKKwkJCS8qIGRlZmF1bHQgcGFyYW1ldGVyLCBkbyBub3RoaW5nICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXR1bmVyX2luZm8oIm50c2M9IGFyZ3VtZW50IG5vdCByZWNvZ25pc2VkXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCB0dW5lcl9zdGF0dXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIGZyZXEsIGZyZXFfZnJhY3Rpb247CisJY29uc3QgY2hhciAqcDsKKworCXN3aXRjaCAodC0+bW9kZSkgeworCQljYXNlIFY0TDJfVFVORVJfUkFESU86IAkgICAgcCA9ICJyYWRpbyI7IGJyZWFrOworCQljYXNlIFY0TDJfVFVORVJfQU5BTE9HX1RWOiAgcCA9ICJhbmFsb2cgVFYiOyBicmVhazsKKwkJY2FzZSBWNEwyX1RVTkVSX0RJR0lUQUxfVFY6IHAgPSAiZGlnaXRhbCBUViI7IGJyZWFrOworCQlkZWZhdWx0OiBwID0gInVuZGVmaW5lZCI7IGJyZWFrOworCX0KKwlpZiAodC0+bW9kZSA9PSBWNEwyX1RVTkVSX1JBRElPKSB7CisJCWZyZXEgPSB0LT5yYWRpb19mcmVxIC8gMTYwMDA7CisJCWZyZXFfZnJhY3Rpb24gPSAodC0+cmFkaW9fZnJlcSAlIDE2MDAwKSAqIDEwMCAvIDE2MDAwOworCX0gZWxzZSB7CisJCWZyZXEgPSB0LT50dl9mcmVxIC8gMTY7CisJCWZyZXFfZnJhY3Rpb24gPSAodC0+dHZfZnJlcSAlIDE2KSAqIDEwMCAvIDE2OworCX0KKwl0dW5lcl9pbmZvKCJUdW5lciBtb2RlOiAgICAgICVzXG4iLCBwKTsKKwl0dW5lcl9pbmZvKCJGcmVxdWVuY3k6ICAgICAgICVsdS4lMDJsdSBNSHpcbiIsIGZyZXEsIGZyZXFfZnJhY3Rpb24pOworCXR1bmVyX2luZm8oIlN0YW5kYXJkOiAgICAgICAgMHglMDhsbHhcbiIsIHQtPnN0ZCk7CisJaWYgKHQtPm1vZGUgPT0gVjRMMl9UVU5FUl9SQURJTykgeworCQlpZiAodC0+aGFzX3NpZ25hbCkgeworCQkJdHVuZXJfaW5mbygiU2lnbmFsIHN0cmVuZ3RoOiAlZFxuIiwgdC0+aGFzX3NpZ25hbChjbGllbnQpKTsKKwkJfQorCQlpZiAodC0+aXNfc3RlcmVvKSB7CisJCQl0dW5lcl9pbmZvKCJTdGVyZW86ICAgICAgICAgICVzXG4iLCB0LT5pc19zdGVyZW8oY2xpZW50KSA/ICJ5ZXMiIDogIm5vIik7CisJCX0KKwl9Cit9CiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qIHN0YXRpYyB2YXIgVXNlZCBvbmx5IGluIHR1bmVyX2F0dGFjaCBhbmQgdHVuZXJfcHJvYmUgKi8KQEAgLTM0MiwxNiArNDIyLDIwIEBACiAJY2xpZW50X3RlbXBsYXRlLmFkYXB0ZXIgPSBhZGFwOwogCWNsaWVudF90ZW1wbGF0ZS5hZGRyID0gYWRkcjsKIAotCXQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHVuZXIpLCBHRlBfS0VSTkVMKTsKKwl0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHR1bmVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKE5VTEwgPT0gdCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KHQsIDAsIHNpemVvZihzdHJ1Y3QgdHVuZXIpKTsKIAltZW1jcHkoJnQtPmkyYywgJmNsaWVudF90ZW1wbGF0ZSwgc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CiAJaTJjX3NldF9jbGllbnRkYXRhKCZ0LT5pMmMsIHQpOwogCXQtPnR5cGUgPSBVTlNFVDsKIAl0LT5yYWRpb19pZjIgPSAxMDcwMCAqIDEwMDA7CS8qIDEwLjdNSHogLSBGTSByYWRpbyAqLwogCXQtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOwogCXQtPm1vZGVfbWFzayA9IFRfVU5JTklUSUFMSVpFRDsKKwlpZiAodHVuZXJfZGVidWdfb2xkKSB7CisJCXR1bmVyX2RlYnVnID0gdHVuZXJfZGVidWdfb2xkOworCQlwcmludGsoS0VSTl9FUlIgInR1bmVyOiB0dW5lcl9kZWJ1ZyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gMi42LjE3LlxuIik7CisJCXByaW50ayhLRVJOX0VSUiAidHVuZXI6IHVzZSB0aGUgZGVidWcgb3B0aW9uIGluc3RlYWQuXG4iKTsKKwl9CiAKIAlpZiAoc2hvd19pMmMpIHsKIAkJdW5zaWduZWQgY2hhciBidWZmZXJbMTZdOwpAQCAtMzg0LDcgKzQ2OCw3IEBACiAJCQkJdC0+dHlwZSA9IFRVTkVSX1RFQTU3Njc7CiAJCQkJdC0+bW9kZV9tYXNrID0gVF9SQURJTzsKIAkJCQl0LT5tb2RlID0gVF9TVEFOREJZOwotCQkJCXQtPmZyZXEgPSA4Ny41ICogMTY7IC8qIFNldHMgZnJlcSB0byBGTSByYW5nZSAqLworCQkJCXQtPnJhZGlvX2ZyZXEgPSA4Ny41ICogMTYwMDA7IC8qIFNldHMgZnJlcSB0byBGTSByYW5nZSAqLwogCQkJCWRlZmF1bHRfbW9kZV9tYXNrICY9IH5UX1JBRElPOwogCiAJCQkJZ290byByZWdpc3Rlcl9jbGllbnQ7CkBAIC0zOTcsNyArNDgxLDggQEAKIAlpZiAoZGVmYXVsdF9tb2RlX21hc2sgIT0gVF9VTklOSVRJQUxJWkVEKSB7CiAJCXR1bmVyX2RiZyAoIlNldHRpbmcgbW9kZV9tYXNrIHRvIDB4JTAyeFxuIiwgZGVmYXVsdF9tb2RlX21hc2spOwogCQl0LT5tb2RlX21hc2sgPSBkZWZhdWx0X21vZGVfbWFzazsKLQkJdC0+ZnJlcSA9IDQwMCAqIDE2OyAvKiBTZXRzIGZyZXEgdG8gVkhGIEhpZ2ggKi8KKwkJdC0+dHZfZnJlcSA9IDQwMCAqIDE2OyAvKiBTZXRzIGZyZXEgdG8gVkhGIEhpZ2ggKi8KKwkJdC0+cmFkaW9fZnJlcSA9IDg3LjUgKiAxNjAwMDsgLyogU2V0cyBmcmVxIHRvIEZNIHJhbmdlICovCiAJCWRlZmF1bHRfbW9kZV9tYXNrID0gVF9VTklOSVRJQUxJWkVEOwogCX0KIApAQCAtNDc4LDcgKzU2Myw5IEBACiBzdGF0aWMgaW50IHR1bmVyX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCXVuc2lnbmVkIGludCAqaWFyZyA9IChpbnQgKilhcmc7CisKKwlpZiAodHVuZXJfZGVidWc+MSkKKwkJdjRsX2kyY19wcmludF9pb2N0bCgmKHQtPmkyYyksY21kKTsKIAogCXN3aXRjaCAoY21kKSB7CiAJLyogLS0tIGNvbmZpZ3VyYXRpb24gLS0tICovCkBAIC00OTEsMjcgKzU3OCwxNyBAQAogCQlzZXRfYWRkcihjbGllbnQsIChzdHJ1Y3QgdHVuZXJfc2V0dXAgKilhcmcpOwogCQlicmVhazsKIAljYXNlIEFVRENfU0VUX1JBRElPOgotCQlzZXRfbW9kZShjbGllbnQsdCxWNEwyX1RVTkVSX1JBRElPLCAiQVVEQ19TRVRfUkFESU8iKTsKKwkJaWYgKHNldF9tb2RlKGNsaWVudCwgdCwgVjRMMl9UVU5FUl9SQURJTywgIkFVRENfU0VUX1JBRElPIikKKwkJCQk9PSBFSU5WQUwpCisJCQlyZXR1cm4gMDsKKwkJaWYgKHQtPnJhZGlvX2ZyZXEpCisJCQlzZXRfZnJlcShjbGllbnQsIHQtPnJhZGlvX2ZyZXEpOwogCQlicmVhazsKIAljYXNlIFRVTkVSX1NFVF9TVEFOREJZOgotCQl7Ci0JCQlpZiAoY2hlY2tfbW9kZSh0LCAiVFVORVJfU0VUX1NUQU5EQlkiKSA9PSBFSU5WQUwpCi0JCQkJcmV0dXJuIDA7Ci0JCQlpZiAodC0+c3RhbmRieSkKLQkJCQl0LT5zdGFuZGJ5IChjbGllbnQpOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRENfQ09ORklHX1BJTk5BQ0xFOgotCQlzd2l0Y2ggKCppYXJnKSB7Ci0JCWNhc2UgMjoKLQkJCXR1bmVyX2RiZygicGlubmFjbGUgcGFsXG4iKTsKLQkJCXQtPnJhZGlvX2lmMiA9IDMzMzAwICogMTAwMDsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQl0dW5lcl9kYmcoInBpbm5hY2xlIG50c2NcbiIpOwotCQkJdC0+cmFkaW9faWYyID0gNDEzMDAgKiAxMDAwOwotCQkJYnJlYWs7Ci0JCX0KKwkJaWYgKGNoZWNrX21vZGUodCwgIlRVTkVSX1NFVF9TVEFOREJZIikgPT0gRUlOVkFMKQorCQkJcmV0dXJuIDA7CisJCWlmICh0LT5zdGFuZGJ5KQorCQkJdC0+c3RhbmRieSAoY2xpZW50KTsKIAkJYnJlYWs7CiAJY2FzZSBWSURJT0NTQVVESU86CiAJCWlmIChjaGVja19tb2RlKHQsICJWSURJT0NTQVVESU8iKSA9PSBFSU5WQUwpCkBAIC01MjEsMTAgKzU5OCw2IEBACiAKIAkJLyogU2hvdWxkIGJlIGltcGxlbWVudGVkLCBzaW5jZSBidHR2IGNhbGxzIGl0ICovCiAJCXR1bmVyX2RiZygiVklESU9DU0FVRElPIG5vdCBpbXBsZW1lbnRlZC5cbiIpOwotCi0JCWJyZWFrOwotCWNhc2UgTVNQX1NFVF9NQVRSSVg6Ci0JY2FzZSBUREE5ODg3X1NFVF9DT05GSUc6CiAJCWJyZWFrOwogCS8qIC0tLSB2NGwgaW9jdGxzIC0tLSAqLwogCS8qIHRha2UgY2FyZTogYnR0diBkb2VzIHVzZXJzcGFjZSBjb3B5aW5nLCB3ZSdsbCBnZXQgYQpAQCAtNTUwLDggKzYyMyw4IEBACiAJCQlpZiAodmMtPm5vcm0gPCBBUlJBWV9TSVpFKG1hcCkpCiAJCQkJdC0+c3RkID0gbWFwW3ZjLT5ub3JtXTsKIAkJCXR1bmVyX2ZpeHVwX3N0ZCh0KTsKLQkJCWlmICh0LT5mcmVxKQotCQkJCXNldF90dl9mcmVxKGNsaWVudCwgdC0+ZnJlcSk7CisJCQlpZiAodC0+dHZfZnJlcSkKKwkJCQlzZXRfdHZfZnJlcShjbGllbnQsIHQtPnR2X2ZyZXEpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAljYXNlIFZJRElPQ1NGUkVROgpAQCAtNjI1LDE1ICs2OTgsMTQgQEAKIAogCQkJdC0+c3RkID0gKmlkOwogCQkJdHVuZXJfZml4dXBfc3RkKHQpOwotCQkJaWYgKHQtPmZyZXEpCi0JCQkJc2V0X2ZyZXEoY2xpZW50LCB0LT5mcmVxKTsKKwkJCWlmICh0LT50dl9mcmVxKQorCQkJCXNldF9mcmVxKGNsaWVudCwgdC0+dHZfZnJlcSk7CiAJCQlicmVhazsKIAkJfQogCWNhc2UgVklESU9DX1NfRlJFUVVFTkNZOgogCQl7CiAJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7CiAKLQkJCXQtPmZyZXEgPSBmLT5mcmVxdWVuY3k7CiAJCQlzd2l0Y2hfdjRsMigpOwogCQkJaWYgKFY0TDJfVFVORVJfUkFESU8gPT0gZi0+dHlwZSAmJgogCQkJICAgIFY0TDJfVFVORVJfUkFESU8gIT0gdC0+bW9kZSkgewpAQCAtNjQxLDcgKzcxMyw3IEBACiAJCQkJCSAgICA9PSBFSU5WQUwpCiAJCQkJCXJldHVybiAwOwogCQkJfQotCQkJc2V0X2ZyZXEoY2xpZW50LHQtPmZyZXEpOworCQkJc2V0X2ZyZXEoY2xpZW50LGYtPmZyZXF1ZW5jeSk7CiAKIAkJCWJyZWFrOwogCQl9CkBAIC02NTMsNyArNzI1LDggQEAKIAkJCQlyZXR1cm4gMDsKIAkJCXN3aXRjaF92NGwyKCk7CiAJCQlmLT50eXBlID0gdC0+bW9kZTsKLQkJCWYtPmZyZXF1ZW5jeSA9IHQtPmZyZXE7CisJCQlmLT5mcmVxdWVuY3kgPSAoVjRMMl9UVU5FUl9SQURJTyA9PSB0LT5tb2RlKSA/CisJCQkJdC0+cmFkaW9fZnJlcSA6IHQtPnR2X2ZyZXE7CiAJCQlicmVhazsKIAkJfQogCWNhc2UgVklESU9DX0dfVFVORVI6CkBAIC03MDQsMTQgKzc3NywxMiBAQAogCiAJCQlpZiAoVjRMMl9UVU5FUl9SQURJTyA9PSB0LT5tb2RlKSB7CiAJCQkJdC0+YXVkbW9kZSA9IHR1bmVyLT5hdWRtb2RlOwotCQkJCXNldF9yYWRpb19mcmVxKGNsaWVudCwgdC0+ZnJlcSk7CisJCQkJc2V0X3JhZGlvX2ZyZXEoY2xpZW50LCB0LT5yYWRpb19mcmVxKTsKIAkJCX0KIAkJCWJyZWFrOwogCQl9Ci0JZGVmYXVsdDoKLQkJdHVuZXJfZGJnKCJVbmltcGxlbWVudGVkIElPQ1RMIDB4JTA4eChkaXI9JWQsdHA9JyVjJyxucj0lZCxzej0lZClcbiIsCi0JCQkJCSBjbWQsIF9JT0NfRElSKGNtZCksIF9JT0NfVFlQRShjbWQpLAotCQkJCQlfSU9DX05SKGNtZCksIF9JT0NfU0laRShjbWQpKTsKKwljYXNlIFZJRElPQ19MT0dfU1RBVFVTOgorCQl0dW5lcl9zdGF0dXMoY2xpZW50KTsKIAkJYnJlYWs7CiAJfQogCkBAIC03MzQsOCArODA1LDEzIEBACiAJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhIChjKTsKIAogCXR1bmVyX2RiZyAoInJlc3VtZVxuIik7Ci0JaWYgKHQtPmZyZXEpCi0JCXNldF9mcmVxKGMsIHQtPmZyZXEpOworCWlmIChWNEwyX1RVTkVSX1JBRElPID09IHQtPm1vZGUpIHsKKwkJaWYgKHQtPnJhZGlvX2ZyZXEpCisJCQlzZXRfZnJlcShjLCB0LT5yYWRpb19mcmVxKTsKKwl9IGVsc2UgeworCQlpZiAodC0+dHZfZnJlcSkKKwkJCXNldF9mcmVxKGMsIHQtPnR2X2ZyZXEpOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNzQ3LDEwICs4MjMsMTAgQEAKIAkuZGV0YWNoX2NsaWVudCA9IHR1bmVyX2RldGFjaCwKIAkuY29tbWFuZCA9IHR1bmVyX2NvbW1hbmQsCiAJLmRyaXZlciA9IHsKLQkJICAgLm5hbWUgPSAidHVuZXIiLAotCQkgICAuc3VzcGVuZCA9IHR1bmVyX3N1c3BlbmQsCi0JCSAgIC5yZXN1bWUgPSB0dW5lcl9yZXN1bWUsCi0JCSAgIH0sCisJCS5uYW1lICAgID0gInR1bmVyIiwKKwkJLnN1c3BlbmQgPSB0dW5lcl9zdXNwZW5kLAorCQkucmVzdW1lICA9IHR1bmVyX3Jlc3VtZSwKKwl9LAogfTsKIHN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPSB7CiAJLm5hbWUgPSAiKHR1bmVyIHVuc2V0KSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLXNpbXBsZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1zaW1wbGUuYwppbmRleCBlMGM5ZmRiLi4zNzk3N2ZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLXNpbXBsZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItc2ltcGxlLmMKQEAgLTgsNiArOCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KIAorc3RhdGljIGludCBvZmZzZXQgPSAwOworbW9kdWxlX3BhcmFtKG9mZnNldCwgaW50LCAwNjY2KTsKK01PRFVMRV9QQVJNX0RFU0Mob2Zmc2V0LCJBbGxvd3MgdG8gc3BlY2lmeSBhbiBvZmZzZXQgZm9yIHR1bmVyIik7CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogLyogdHYgc3RhbmRhcmQgc2VsZWN0aW9uIGZvciBUZW1pYyA0MDQ2IEZNNQpAQCAtNzUsMTg4ICs3OSwxNiBAQAogI2RlZmluZSBUVU5FUl9QTExfTE9DS0VEICAgMHg0MAogI2RlZmluZSBUVU5FUl9TVEVSRU9fTUszICAgMHgwNAogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0cnVjdCB0dW5lcnR5cGUKLXsKLQljaGFyICpuYW1lOwotCXVuc2lnbmVkIGNoYXIgVmVuZG9yOwotCXVuc2lnbmVkIGNoYXIgVHlwZTsKLQotCXVuc2lnbmVkIHNob3J0IHRocmVzaDE7ICAvKiAgYmFuZCBzd2l0Y2ggVkhGX0xPIDw9PiBWSEZfSEkgICovCi0JdW5zaWduZWQgc2hvcnQgdGhyZXNoMjsgIC8qICBiYW5kIHN3aXRjaCBWSEZfSEkgPD0+IFVIRiAgICAgKi8KLQl1bnNpZ25lZCBjaGFyIFZIRl9MOwotCXVuc2lnbmVkIGNoYXIgVkhGX0g7Ci0JdW5zaWduZWQgY2hhciBVSEY7Ci0JdW5zaWduZWQgY2hhciBjb25maWc7Ci0JdW5zaWduZWQgc2hvcnQgSUZQQ29mZjsgLyogNjIyLjQ9MTYqMzguOTAgTUh6IFBBTCwKLQkJCQkgICA3MzIgID0xNio0NS43NSBOVFNDaSwKLQkJCQkgICA5NDAgID0xNio1OC43NSBOVFNDLUphcGFuCi0JCQkJICAgNzA0ICA9MTYqNDQgICAgQVRTQyAqLwotfTsKLQotLyoKLSAqCVRoZSBmbG9hdHMgaW4gdGhlIHR1bmVyIHN0cnVjdCBhcmUgY29tcHV0ZWQgYXQgY29tcGlsZSB0aW1lCi0gKglieSBnY2MgYW5kIGNhc3QgYmFjayB0byBpbnRlZ2Vycy4gVGh1cyB3ZSBkb24ndCB2aW9sYXRlIHRoZQotICoJIm5vIGZsb2F0IGluIGtlcm5lbCIgcnVsZS4KKyNkZWZpbmUgVFVORVJfUEFSQU1fQU5BTE9HIDAgIC8qIHRvIGJlIHJlbW92ZWQgKi8KKy8qIEZJWE1FOgorICogUmlnaHQgbm93LCBhbGwgdHVuZXJzIGFyZSB1c2luZyB0aGUgZmlyc3QgdHVuZXJfcGFyYW1zW10gYXJyYXkgZWxlbWVudAorICogZm9yIGFuYWxvZyBtb2RlLiBJbiB0aGUgZnV0dXJlLCB3ZSB3aWxsIGJlIG1lcmdpbmcgc2ltaWxhciB0dW5lcgorICogZGVmaW5pdGlvbnMgdG9nZXRoZXIsIHN1Y2ggdGhhdCBlYWNoIHR1bmVyIGRlZmluaXRpb24gd2lsbCBoYXZlIGEKKyAqIHR1bmVyX3BhcmFtcyBzdHJ1Y3QgZm9yIGVhY2ggYXZhaWxhYmxlIHZpZGVvIHN0YW5kYXJkLiBBdCB0aGF0IHBvaW50LAorICogVFVORVJfUEFSQU1fQU5BTE9HIHdpbGwgYmUgcmVtb3ZlZCwgYW5kIHRoZSB0dW5lcl9wYXJhbXNbXSBhcnJheQorICogZWxlbWVudCB3aWxsIGJlIGNob3NlbiBiYXNlZCBvbiB0aGUgdmlkZW8gc3RhbmRhcmQgaW4gdXNlLgorICoKICAqLwotc3RhdGljIHN0cnVjdCB0dW5lcnR5cGUgdHVuZXJzW10gPSB7Ci0JLyogMC05ICovCi0JeyAiVGVtaWMgUEFMICg0MDAyIEZINSkiLCBURU1JQywgUEFMLAotCSAgMTYqMTQwLjI1LDE2KjQ2My4yNSwweDAyLDB4MDQsMHgwMSwweDhlLDYyM30sCi0JeyAiUGhpbGlwcyBQQUxfSSAoRkkxMjQ2IGFuZCBjb21wYXRpYmxlcykiLCBQaGlsaXBzLCBQQUxfSSwKLQkgIDE2KjE0MC4yNSwxNio0NjMuMjUsMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAotCXsgIlBoaWxpcHMgTlRTQyAoRkkxMjM2LEZNMTIzNiBhbmQgY29tcGF0aWJsZXMpIiwgUGhpbGlwcywgTlRTQywKLQkgIDE2KjE1Ny4yNSwxNio0NTEuMjUsMHhBMCwweDkwLDB4MzAsMHg4ZSw3MzJ9LAotCXsgIlBoaWxpcHMgKFNFQ0FNK1BBTF9CRykgKEZJMTIxNk1GLCBGTTEyMTZNRiwgRlIxMjE2TUYpIiwgUGhpbGlwcywgU0VDQU0sCi0JICAxNioxNjguMjUsMTYqNDQ3LjI1LDB4QTcsMHg5NywweDM3LDB4OGUsNjIzfSwKLQl7ICJOb1R1bmVyIiwgTm9UdW5lciwgTk9UVU5FUiwKLQkgIDAsMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LAotCXsgIlBoaWxpcHMgUEFMX0JHIChGSTEyMTYgYW5kIGNvbXBhdGlibGVzKSIsIFBoaWxpcHMsIFBBTCwKLQkgIDE2KjE2OC4yNSwxNio0NDcuMjUsMHhBMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAotCXsgIlRlbWljIE5UU0MgKDQwMzIgRlk1KSIsIFRFTUlDLCBOVFNDLAotCSAgMTYqMTU3LjI1LDE2KjQ2My4yNSwweDAyLDB4MDQsMHgwMSwweDhlLDczMn0sCi0JeyAiVGVtaWMgUEFMX0kgKDQwNjIgRlk1KSIsIFRFTUlDLCBQQUxfSSwKLQkgIDE2KjE3MC4wMCwxNio0NTAuMDAsMHgwMiwweDA0LDB4MDEsMHg4ZSw2MjN9LAotCXsgIlRlbWljIE5UU0MgKDQwMzYgRlk1KSIsIFRFTUlDLCBOVFNDLAotCSAgMTYqMTU3LjI1LDE2KjQ2My4yNSwweGEwLDB4OTAsMHgzMCwweDhlLDczMn0sCi0JeyAiQWxwcyBIU0JIMSIsIFRFTUlDLCBOVFNDLAotCSAgMTYqMTM3LjI1LDE2KjM4NS4yNSwweDAxLDB4MDIsMHgwOCwweDhlLDczMn0sCi0KLQkvKiAxMC0xOSAqLwotCXsgIkFscHMgVFNCRTEiLCBURU1JQywgUEFMLAotCSAgMTYqMTM3LjI1LDE2KjM4NS4yNSwweDAxLDB4MDIsMHgwOCwweDhlLDczMn0sCi0JeyAiQWxwcyBUU0JCNSIsIEFscHMsIFBBTF9JLCAvKiB0ZXN0ZWQgKFVLIFVIRikgd2l0aCBNb2R1bGFydGVjaCBNTTIwNSAqLwotCSAgMTYqMTMzLjI1LDE2KjM1MS4yNSwweDAxLDB4MDIsMHgwOCwweDhlLDYzMn0sCi0JeyAiQWxwcyBUU0JFNSIsIEFscHMsIFBBTCwgLyogdW50ZXN0ZWQgLSBkYXRhIHNoZWV0IGd1ZXNzLiBPbmx5IElGIGRpZmZlcnMuICovCi0JICAxNioxMzMuMjUsMTYqMzUxLjI1LDB4MDEsMHgwMiwweDA4LDB4OGUsNjIyfSwKLQl7ICJBbHBzIFRTQkM1IiwgQWxwcywgUEFMLCAvKiB1bnRlc3RlZCAtIGRhdGEgc2hlZXQgZ3Vlc3MuIE9ubHkgSUYgZGlmZmVycy4gKi8KLQkgIDE2KjEzMy4yNSwxNiozNTEuMjUsMHgwMSwweDAyLDB4MDgsMHg4ZSw2MDh9LAotCXsgIlRlbWljIFBBTF9CRyAoNDAwNkZINSkiLCBURU1JQywgUEFMLAotCSAgMTYqMTcwLjAwLDE2KjQ1MC4wMCwweGEwLDB4OTAsMHgzMCwweDhlLDYyM30sCi0JeyAiQWxwcyBUU0NINiIsIEFscHMsIE5UU0MsCi0JICAxNioxMzcuMjUsMTYqMzg1LjI1LDB4MTQsMHgxMiwweDExLDB4OGUsNzMyfSwKLQl7ICJUZW1pYyBQQUxfREsgKDQwMTYgRlk1KSIsIFRFTUlDLCBQQUwsCi0JICAxNioxNjguMjUsMTYqNDU2LjI1LDB4YTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKLQl7ICJQaGlsaXBzIE5UU0NfTSAoTUsyKSIsIFBoaWxpcHMsIE5UU0MsCi0JICAxNioxNjAuMDAsMTYqNDU0LjAwLDB4YTAsMHg5MCwweDMwLDB4OGUsNzMyfSwKLQl7ICJUZW1pYyBQQUxfSSAoNDA2NiBGWTUpIiwgVEVNSUMsIFBBTF9JLAotCSAgMTYqMTY5LjAwLCAxNio0NTQuMDAsIDB4YTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKLQl7ICJUZW1pYyBQQUwqIGF1dG8gKDQwMDYgRk41KSIsIFRFTUlDLCBQQUwsCi0JICAxNioxNjkuMDAsIDE2KjQ1NC4wMCwgMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAotCi0JLyogMjAtMjkgKi8KLQl7ICJUZW1pYyBQQUxfQkcgKDQwMDkgRlI1KSBvciBQQUxfSSAoNDA2OSBGUjUpIiwgVEVNSUMsIFBBTCwKLQkgIDE2KjE0MS4wMCwgMTYqNDY0LjAwLCAweGEwLDB4OTAsMHgzMCwweDhlLDYyM30sCi0JeyAiVGVtaWMgTlRTQyAoNDAzOSBGUjUpIiwgVEVNSUMsIE5UU0MsCi0JICAxNioxNTguMDAsIDE2KjQ1My4wMCwgMHhhMCwweDkwLDB4MzAsMHg4ZSw3MzJ9LAotCXsgIlRlbWljIFBBTC9TRUNBTSBtdWx0aSAoNDA0NiBGTTUpIiwgVEVNSUMsIFBBTCwKLQkgIDE2KjE2OS4wMCwgMTYqNDU0LjAwLCAweGEwLDB4OTAsMHgzMCwweDhlLDYyM30sCi0JeyAiUGhpbGlwcyBQQUxfREsgKEZJMTI1NiBhbmQgY29tcGF0aWJsZXMpIiwgUGhpbGlwcywgUEFMLAotCSAgMTYqMTcwLjAwLDE2KjQ1MC4wMCwweGEwLDB4OTAsMHgzMCwweDhlLDYyM30sCi0JeyAiUGhpbGlwcyBQQUwvU0VDQU0gbXVsdGkgKEZRMTIxNk1FKSIsIFBoaWxpcHMsIFBBTCwKLQkgIDE2KjE3MC4wMCwxNio0NTAuMDAsMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAotCXsgIkxHIFBBTF9JK0ZNIChUQVBDLUkwMDFEKSIsIExHSU5OT1RFSywgUEFMX0ksCi0JICAxNioxNzAuMDAsMTYqNDUwLjAwLDB4YTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKLQl7ICJMRyBQQUxfSSAoVEFQQy1JNzAxRCkiLCBMR0lOTk9URUssIFBBTF9JLAotCSAgMTYqMTcwLjAwLDE2KjQ1MC4wMCwweGEwLDB4OTAsMHgzMCwweDhlLDYyM30sCi0JeyAiTEcgTlRTQytGTSAoVFBJOE5TUjAxRikiLCBMR0lOTk9URUssIE5UU0MsCi0JICAxNioyMTAuMDAsMTYqNDk3LjAwLDB4YTAsMHg5MCwweDMwLDB4OGUsNzMyfSwKLQl7ICJMRyBQQUxfQkcrRk0gKFRQSThQU0IwMUQpIiwgTEdJTk5PVEVLLCBQQUwsCi0JICAxNioxNzAuMDAsMTYqNDUwLjAwLDB4YTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKLQl7ICJMRyBQQUxfQkcgKFRQSThQU0IxMUQpIiwgTEdJTk5PVEVLLCBQQUwsCi0JICAxNioxNzAuMDAsMTYqNDUwLjAwLDB4YTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKLQotCS8qIDMwLTM5ICovCi0JeyAiVGVtaWMgUEFMKiBhdXRvICsgRk0gKDQwMDkgRk41KSIsIFRFTUlDLCBQQUwsCi0JICAxNioxNDEuMDAsIDE2KjQ2NC4wMCwgMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAotCXsgIlNIQVJQIE5UU0NfSlAgKDJVNUpGNTU0MCkiLCBTSEFSUCwgTlRTQywgLyogOTQwPTE2KjU4Ljc1IE5UU0NASmFwYW4gKi8KLQkgIDE2KjEzNy4yNSwxNiozMTcuMjUsMHgwMSwweDAyLDB4MDgsMHg4ZSw5NDAgfSwKLQl7ICJTYW1zdW5nIFBBTCBUQ1BNOTA5MVBEMjciLCBTYW1zdW5nLCBQQUwsIC8qIGZyb20gc291cmNlZm9yZ2UgdjN0diAqLwotCSAgMTYqMTY5LDE2KjQ2NCwweEEwLDB4OTAsMHgzMCwweDhlLDYyM30sCi0JeyAiTVQyMHh4IHVuaXZlcnNhbCIsIE1pY3JvdHVuZSwgUEFMfE5UU0MsCi0JICAvKiBzZWUgbXQyMHh4LmMgZm9yIGRldGFpbHMgKi8gfSwKLQl7ICJUZW1pYyBQQUxfQkcgKDQxMDYgRkg1KSIsIFRFTUlDLCBQQUwsCi0JICAxNioxNDEuMDAsIDE2KjQ2NC4wMCwgMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAotCXsgIlRlbWljIFBBTF9ESy9TRUNBTV9MICg0MDEyIEZZNSkiLCBURU1JQywgUEFMLAotCSAgMTYqMTQwLjI1LCAxNio0NjMuMjUsIDB4MDIsMHgwNCwweDAxLDB4OGUsNjIzfSwKLQl7ICJUZW1pYyBOVFNDICg0MTM2IEZZNSkiLCBURU1JQywgTlRTQywKLQkgIDE2KjE1OC4wMCwgMTYqNDUzLjAwLCAweGEwLDB4OTAsMHgzMCwweDhlLDczMn0sCi0JeyAiTEcgUEFMIChuZXdlciBUQVBDIHNlcmllcykiLCBMR0lOTk9URUssIFBBTCwKLQkgIDE2KjE3MC4wMCwgMTYqNDUwLjAwLCAweDAxLDB4MDIsMHgwOCwweDhlLDYyM30sCi0JeyAiUGhpbGlwcyBQQUwvU0VDQU0gbXVsdGkgKEZNMTIxNk1FIE1LMykiLCBQaGlsaXBzLCBQQUwsCi0JICAxNioxNTguMDAsMTYqNDQyLjAwLDB4MDEsMHgwMiwweDA0LDB4OGUsNjIzIH0sCi0JeyAiTEcgTlRTQyAobmV3ZXIgVEFQQyBzZXJpZXMpIiwgTEdJTk5PVEVLLCBOVFNDLAotCSAgMTYqMTcwLjAwLCAxNio0NTAuMDAsIDB4MDEsMHgwMiwweDA4LDB4OGUsNzMyfSwKLQotCS8qIDQwLTQ5ICovCi0JeyAiSElUQUNISSBWNy1KMTgwQVQiLCBISVRBQ0hJLCBOVFNDLAotCSAgMTYqMTcwLjAwLCAxNio0NTAuMDAsIDB4MDEsMHgwMiwweDA4LDB4OGUsOTQwIH0sCi0JeyAiUGhpbGlwcyBQQUxfTUsgKEZJMTIxNiBNSykiLCBQaGlsaXBzLCBQQUwsCi0JICAxNioxNDAuMjUsMTYqNDYzLjI1LDB4MDEsMHhjMiwweGNmLDB4OGUsNjIzfSwKLQl7ICJQaGlsaXBzIDEyMzZEIEFUU0MvTlRTQyBkYXVsIGluIiwgUGhpbGlwcywgQVRTQywKLQkgIDE2KjE1Ny4yNSwxNio0NTQuMDAsMHhhMCwweDkwLDB4MzAsMHg4ZSw3MzJ9LAotCXsgIlBoaWxpcHMgTlRTQyBNSzMgKEZNMTIzNk1LMyBvciBGTTEyMzYvRikiLCBQaGlsaXBzLCBOVFNDLAotCSAgMTYqMTYwLjAwLDE2KjQ0Mi4wMCwweDAxLDB4MDIsMHgwNCwweDhlLDczMn0sCi0JeyAiUGhpbGlwcyA0IGluIDEgKEFUSSBUViBXb25kZXIgUHJvL0NvbmV4YW50KSIsIFBoaWxpcHMsIE5UU0MsCi0JICAxNioxNjAuMDAsMTYqNDQyLjAwLDB4MDEsMHgwMiwweDA0LDB4OGUsNzMyfSwKLQl7ICJNaWNyb3R1bmUgNDA0OSBGTTUiLCBNaWNyb3R1bmUsIFBBTCwKLQkgIDE2KjE0MS4wMCwxNio0NjQuMDAsMHhhMCwweDkwLDB4MzAsMHg4ZSw2MjN9LAotCXsgIlBhbmFzb25pYyBWUDI3cy9FTkdFNDMyNEQiLCBQYW5hc29uaWMsIE5UU0MsCi0JICAxNioxNjAuMDAsMTYqNDU0LjAwLDB4MDEsMHgwMiwweDA4LDB4Y2UsOTQwfSwKLQl7ICJMRyBOVFNDIChUQVBFIHNlcmllcykiLCBMR0lOTk9URUssIE5UU0MsCi0JICAxNioxNjAuMDAsMTYqNDQyLjAwLDB4MDEsMHgwMiwweDA0LDB4OGUsNzMyIH0sCi0JeyAiVGVubmEgVE5GIDg4MzEgQkdGRikiLCBQaGlsaXBzLCBQQUwsCi0JICAxNioxNjEuMjUsMTYqNDYzLjI1LDB4YTAsMHg5MCwweDMwLDB4OGUsNjIzfSwKLQl7ICJNaWNyb3R1bmUgNDA0MiBGSTUgQVRTQy9OVFNDIGR1YWwgaW4iLCBNaWNyb3R1bmUsIE5UU0MsCi0JICAxNioxNjIuMDAsMTYqNDU3LjAwLDB4YTIsMHg5NCwweDMxLDB4OGUsNzMyfSwKLQotCS8qIDUwLTU5ICovCi0JeyAiVENMIDIwMDJOIiwgVENMLCBOVFNDLAotCSAgMTYqMTcyLjAwLDE2KjQ0OC4wMCwweDAxLDB4MDIsMHgwOCwweDhlLDczMn0sCi0JeyAiUGhpbGlwcyBQQUwvU0VDQU1fRCAoRk0gMTI1NiBJLUgzKSIsIFBoaWxpcHMsIFBBTCwKLQkgIDE2KjE2MC4wMCwxNio0NDIuMDAsMHgwMSwweDAyLDB4MDQsMHg4ZSw2MjMgfSwKLQl7ICJUaG9tc29uIEREVCA3NjEwIChBVFNDL05UU0MpIiwgVEhPTVNPTiwgQVRTQywKLQkgIDE2KjE1Ny4yNSwxNio0NTQuMDAsMHgzOSwweDNhLDB4M2MsMHg4ZSw3MzJ9LAotCXsgIlBoaWxpcHMgRlExMjg2IiwgUGhpbGlwcywgTlRTQywKLQkgIDE2KjE2MC4wMCwxNio0NTQuMDAsMHg0MSwweDQyLDB4MDQsMHg4ZSw5NDB9LCAvKiBVSEYgYmFuZCB1bnRlc3RlZCAqLwotCXsgInRkYTgyOTArNzUiLCBQaGlsaXBzLCBQQUx8TlRTQywKLQkgIC8qIHNlZSB0ZGE4MjkwLmMgZm9yIGRldGFpbHMgKi8gfSwKLQl7ICJUQ0wgMjAwMk1CIiwgVENMLCBQQUwsCi0JICAxNioxNzAuMDAsIDE2KjQ1MC4wMCwgMHgwMSwweDAyLDB4MDgsMHhjZSw2MjN9LAotCXsgIlBoaWxpcHMgUEFML1NFQ0FNIG11bHRpIChGUTEyMTZBTUUgTUs0KSIsIFBoaWxpcHMsIFBBTCwKLQkgIDE2KjE2MC4wMCwxNio0NDIuMDAsMHgwMSwweDAyLDB4MDQsMHhjZSw2MjMgfSwKLQl7ICJQaGlsaXBzIEZRMTIzNkEgTUs0IiwgUGhpbGlwcywgTlRTQywKLQkgIDE2KjE2MC4wMCwxNio0NDIuMDAsMHgwMSwweDAyLDB4MDQsMHg4ZSw3MzIgfSwKLQl7ICJZbWVjIFRWaXNpb24gVFZGLTg1MzFNRi84ODMxTUYvODczMU1GIiwgUGhpbGlwcywgTlRTQywKLQkgIDE2KjE2MC4wMCwxNio0NTQuMDAsMHhhMCwweDkwLDB4MzAsMHg4ZSw3MzJ9LAotCXsgIlltZWMgVFZpc2lvbiBUVkYtNTUzM01GIiwgUGhpbGlwcywgTlRTQywKLQkgIDE2KjE2MC4wMCwxNio0NTQuMDAsMHgwMSwweDAyLDB4MDQsMHg4ZSw3MzJ9LAotCi0JLyogNjAtNjkgKi8KLQl7ICJUaG9tc29uIEREVCA3NjExIChBVFNDL05UU0MpIiwgVEhPTVNPTiwgQVRTQywKLQkgIDE2KjE1Ny4yNSwxNio0NTQuMDAsMHgzOSwweDNhLDB4M2MsMHg4ZSw3MzJ9LAotCXsgIlRlbmEgVE5GOTUzMy1EL0lGL1RORjk1MzMtQi9ERiIsIFBoaWxpcHMsIFBBTCwKLQkgIDE2KjE2MC4yNSwxNio0NjQuMjUsMHgwMSwweDAyLDB4MDQsMHg4ZSw2MjN9LAotCXsgIlBoaWxpcHMgVEVBNTc2N0hOIEZNIFJhZGlvIiwgUGhpbGlwcywgUkFESU8sCi0JICAvKiBzZWUgdGVhNTc2Ny5jIGZvciBkZXRhaWxzICovfSwKLQl7ICJQaGlsaXBzIEZNRDEyMTZNRSBNSzMgSHlicmlkIFR1bmVyIiwgUGhpbGlwcywgUEFMLAotCSAgMTYqMTYwLjAwLDE2KjQ0Mi4wMCwweDUxLDB4NTIsMHg1NCwweDg2LDYyMyB9LAotCXsgIkxHIFREVlMtSDA2MkYvVFVBNjAzNCIsIExHSU5OT1RFSywgQVRTQywKLQkgIDE2KjE2MC4wMCwxNio0NTUuMDAsMHgwMSwweDAyLDB4MDQsMHg4ZSw3MzJ9LAotCXsgIlltZWMgVFZGNjZUNS1CL0RGRiIsIFBoaWxpcHMsIFBBTCwKLQkgIDE2KjE2MC4yNSwxNio0NjQuMjUsMHgwMSwweDAyLDB4MDgsMHg4ZSw2MjN9LAotCXsgIkxHIE5UU0MgKFRBTE4gbWluaSBzZXJpZXMpIiwgTEdJTk5PVEVLLCBOVFNDLAotCSAgMTYqMTM3LjI1LDE2KjM3My4yNSwweDAxLDB4MDIsMHgwOCwweDhlLDczMiB9LAotCXsgIlBoaWxpcHMgVEQxMzE2IEh5YnJpZCBUdW5lciIsIFBoaWxpcHMsIFBBTCwKLQkgIDE2KjE2MC4wMCwxNio0NDIuMDAsMHhhMSwweGEyLDB4YTQsMHhjOCw2MjMgfSwKLQl7ICJQaGlsaXBzIFRVVjEyMzZEIEFUU0MvTlRTQyBkdWFsIGluIiwgUGhpbGlwcywgQVRTQywKLQkgIDE2KjE1Ny4yNSwxNio0NTQuMDAsMHgwMSwweDAyLDB4MDQsMHhjZSw3MzIgfSwKLQl7ICJUZW5hIFRORiA1MzM1IE1GIiwgUGhpbGlwcywgTlRTQywKLQkgIDE2KjE1Ny4yNSwxNio0NTQuMDAsMHgwMSwweDAyLDB4MDQsMHg4ZSw3MzIgfSwKLX07Ci0KLXVuc2lnbmVkIGNvbnN0IGludCB0dW5lcl9jb3VudCA9IEFSUkFZX1NJWkUodHVuZXJzKTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0zMDQsMjEgKzEzNiwyNyBAQAogCXU4IGNvbmZpZywgdHVuZXJhZGRyOwogCXUxNiBkaXY7CiAJc3RydWN0IHR1bmVydHlwZSAqdHVuOwotCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzRdOwotCWludCByYzsKKwl1OCBidWZmZXJbNF07CisJaW50IHJjLCBJRlBDb2ZmLCBpLCBqOwogCiAJdHVuID0gJnR1bmVyc1t0LT50eXBlXTsKLQlpZiAoZnJlcSA8IHR1bi0+dGhyZXNoMSkgewotCQljb25maWcgPSB0dW4tPlZIRl9MOwotCQl0dW5lcl9kYmcoInR2OiBWSEYgbG93cmFuZ2VcbiIpOwotCX0gZWxzZSBpZiAoZnJlcSA8IHR1bi0+dGhyZXNoMikgewotCQljb25maWcgPSB0dW4tPlZIRl9IOwotCQl0dW5lcl9kYmcoInR2OiBWSEYgaGlnaCByYW5nZVxuIik7Ci0JfSBlbHNlIHsKLQkJY29uZmlnID0gdHVuLT5VSEY7Ci0JCXR1bmVyX2RiZygidHY6IFVIRiByYW5nZVxuIik7Ci0JfQorCWogPSBUVU5FUl9QQVJBTV9BTkFMT0c7CiAKKwlmb3IgKGkgPSAwOyBpIDwgdHVuLT5wYXJhbXNbal0uY291bnQ7IGkrKykgeworCQlpZiAoZnJlcSA+IHR1bi0+cGFyYW1zW2pdLnJhbmdlc1tpXS5saW1pdCkKKwkJCWNvbnRpbnVlOworCQlicmVhazsKKwl9CisJaWYgKGkgPT0gdHVuLT5wYXJhbXNbal0uY291bnQpIHsKKwkJdHVuZXJfZGJnKCJUViBmcmVxdWVuY3kgb3V0IG9mIHJhbmdlICglZCA+ICVkKSIsCisJCQkJZnJlcSwgdHVuLT5wYXJhbXNbal0ucmFuZ2VzW2kgLSAxXS5saW1pdCk7CisJCWZyZXEgPSB0dW4tPnBhcmFtc1tqXS5yYW5nZXNbLS1pXS5saW1pdDsKKwl9CisJY29uZmlnID0gdHVuLT5wYXJhbXNbal0ucmFuZ2VzW2ldLmNiOworCS8qICBpID09IDAgLT4gVkhGX0xPICAqLworCS8qICBpID09IDEgLT4gVkhGX0hJICAqLworCS8qICBpID09IDIgLT4gVUhGICAgICAqLworCXR1bmVyX2RiZygidHY6IHJhbmdlICVkXG4iLGkpOwogCiAJLyogdHYgbm9ybSBzcGVjaWZpYyBzdHVmZiBmb3IgbXVsdGktbm9ybSB0dW5lcnMgKi8KIAlzd2l0Y2ggKHQtPnR5cGUpIHsKQEAgLTM3Nyw3ICsyMTUsNyBAQAogCiAJY2FzZSBUVU5FUl9NSUNST1RVTkVfNDA0MkZJNToKIAkJLyogU2V0IHRoZSBjaGFyZ2UgcHVtcCBmb3IgZmFzdCB0dW5pbmcgKi8KLQkJdHVuLT5jb25maWcgfD0gVFVORVJfQ0hBUkdFX1BVTVA7CisJCXR1bi0+cGFyYW1zW2pdLmNvbmZpZyB8PSBUVU5FUl9DSEFSR0VfUFVNUDsKIAkJYnJlYWs7CiAKIAljYXNlIFRVTkVSX1BISUxJUFNfVFVWMTIzNkQ6CkBAIC00MDYsMzIgKzI0NCw0OSBAQAogCQlicmVhazsKIAl9CiAKLQkvKgotCSAqIFBoaWxpcHMgRkkxMjE2TUsyIHJlbWFyayBmcm9tIHNwZWNpZmljYXRpb24gOgotCSAqIGZvciBjaGFubmVsIHNlbGVjdGlvbiBpbnZvbHZpbmcgYmFuZCBzd2l0Y2hpbmcsIGFuZCB0byBlbnN1cmUKLQkgKiBzbW9vdGggdHVuaW5nIHRvIHRoZSBkZXNpcmVkIGNoYW5uZWwgd2l0aG91dCBjYXVzaW5nCi0JICogdW5uZWNlc3NhcnkgY2hhcmdlIHB1bXAgYWN0aW9uLCBpdCBpcyByZWNvbW1lbmRlZCB0byBjb25zaWRlcgotCSAqIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gd2FudGVkIGNoYW5uZWwgZnJlcXVlbmN5IGFuZCB0aGUKLQkgKiBjdXJyZW50IGNoYW5uZWwgZnJlcXVlbmN5LiAgVW5uZWNlc3NhcnkgY2hhcmdlIHB1bXAgYWN0aW9uCi0JICogd2lsbCByZXN1bHQgaW4gdmVyeSBsb3cgdHVuaW5nIHZvbHRhZ2Ugd2hpY2ggbWF5IGRyaXZlIHRoZQotCSAqIG9zY2lsbGF0b3IgdG8gZXh0cmVtZSBjb25kaXRpb25zLgotCSAqCi0JICogUHJvZ2ZvdTogc3BlY2lmaWNhdGlvbiBzYXlzIHRvIHNlbmQgY29uZmlnIGRhdGEgYmVmb3JlCi0JICogZnJlcXVlbmN5IGluIGNhc2UgKHdhbnRlZCBmcmVxdWVuY3kgPCBjdXJyZW50IGZyZXF1ZW5jeSkuCi0JICovCisJLyogSUZQQ29mZiA9IFZpZGVvIEludGVybWVkaWF0ZSBGcmVxdWVuY3kgLSBWaWY6CisJCTk0MCAgPTE2KjU4Ljc1ICBOVFNDL0ogKEphcGFuKQorCQk3MzIgID0xNio0NS43NSAgTS9OIFNURAorCQk3MDQgID0xNio0NCAgICAgQVRTQyAoYXQgRFZCIGNvZGUpCisJCTYzMiAgPTE2KjM5LjUwICBJIFUuSy4KKwkJNjIyLjQ9MTYqMzguOTAgIEIvRyBEL0sgSSwgTCBTVEQKKwkJNTkyICA9MTYqMzcuMDAgIEQgQ2hpbmEKKwkJNTkwICA9MTYuMzYuODc1IEIgQXVzdHJhbGlhCisJCTU0My4yPTE2KjMzLjk1ICBMJyBTVEQKKwkJMTcxLjI9MTYqMTAuNzAgIEZNIFJhZGlvIChhdCBzZXRfcmFkaW9fZnJlcSkKKwkqLwogCi0JZGl2PWZyZXEgKyB0dW4tPklGUENvZmY7Ci0JaWYgKHQtPnR5cGUgPT0gVFVORVJfUEhJTElQU19TRUNBTSAmJiBmcmVxIDwgdC0+ZnJlcSkgewotCQlidWZmZXJbMF0gPSB0dW4tPmNvbmZpZzsKKwlpZiAodC0+c3RkID09IFY0TDJfU1REX05UU0NfTV9KUCkgeworCQlJRlBDb2ZmID0gOTQwOworCX0gZWxzZSBpZiAoKHQtPnN0ZCAmIFY0TDJfU1REX01OKSAmJgorCQkgICEodC0+c3RkICYgflY0TDJfU1REX01OKSkgeworCQlJRlBDb2ZmID0gNzMyOworCX0gZWxzZSBpZiAodC0+c3RkID09IFY0TDJfU1REX1NFQ0FNX0xDKSB7CisJCUlGUENvZmYgPSA1NDM7CisJfSBlbHNlIHsKKwkJSUZQQ29mZiA9IDYyMzsKKwl9CisKKwlkaXY9ZnJlcSArIElGUENvZmYgKyBvZmZzZXQ7CisKKwl0dW5lcl9kYmcoIkZyZXE9ICVkLiUwMmQgTUh6LCBWX0lGPSVkLiUwMmQgTUh6LCBPZmZzZXQ9JWQuJTAyZCBNSHosIGRpdj0lMGRcbiIsCisJCQkJCWZyZXEgLyAxNiwgZnJlcSAlIDE2ICogMTAwIC8gMTYsCisJCQkJCUlGUENvZmYgLyAxNiwgSUZQQ29mZiAlIDE2ICogMTAwIC8gMTYsCisJCQkJCW9mZnNldCAvIDE2LCBvZmZzZXQgJSAxNiAqIDEwMCAvIDE2LAorCQkJCQlkaXYpOworCisJaWYgKHR1bmVyc1t0LT50eXBlXS5wYXJhbXMtPmNiX2ZpcnN0X2lmX2xvd2VyX2ZyZXEgJiYgZGl2IDwgdC0+bGFzdF9kaXYpIHsKKwkJYnVmZmVyWzBdID0gdHVuLT5wYXJhbXNbal0uY29uZmlnOwogCQlidWZmZXJbMV0gPSBjb25maWc7CiAJCWJ1ZmZlclsyXSA9IChkaXY+PjgpICYgMHg3ZjsKIAkJYnVmZmVyWzNdID0gZGl2ICAgICAgJiAweGZmOwogCX0gZWxzZSB7CiAJCWJ1ZmZlclswXSA9IChkaXY+PjgpICYgMHg3ZjsKIAkJYnVmZmVyWzFdID0gZGl2ICAgICAgJiAweGZmOwotCQlidWZmZXJbMl0gPSB0dW4tPmNvbmZpZzsKKwkJYnVmZmVyWzJdID0gdHVuLT5wYXJhbXNbal0uY29uZmlnOwogCQlidWZmZXJbM10gPSBjb25maWc7CiAJfQorCXQtPmxhc3RfZGl2ID0gZGl2OwogCXR1bmVyX2RiZygidHYgMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4XG4iLAogCQkgIGJ1ZmZlclswXSxidWZmZXJbMV0sYnVmZmVyWzJdLGJ1ZmZlclszXSk7CiAKQEAgLTQ1NywxMCArMzEyLDEwIEBACiAJCX0KIAogCQkvKiBTZXQgdGhlIGNoYXJnZSBwdW1wIGZvciBvcHRpbWl6ZWQgcGhhc2Ugbm9pc2UgZmlndXJlICovCi0JCXR1bi0+Y29uZmlnICY9IH5UVU5FUl9DSEFSR0VfUFVNUDsKKwkJdHVuLT5wYXJhbXNbal0uY29uZmlnICY9IH5UVU5FUl9DSEFSR0VfUFVNUDsKIAkJYnVmZmVyWzBdID0gKGRpdj4+OCkgJiAweDdmOwogCQlidWZmZXJbMV0gPSBkaXYgICAgICAmIDB4ZmY7Ci0JCWJ1ZmZlclsyXSA9IHR1bi0+Y29uZmlnOworCQlidWZmZXJbMl0gPSB0dW4tPnBhcmFtc1tqXS5jb25maWc7CiAJCWJ1ZmZlclszXSA9IGNvbmZpZzsKIAkJdHVuZXJfZGJnKCJ0diAweCUwMnggMHglMDJ4IDB4JTAyeCAweCUwMnhcbiIsCiAJCSAgICAgICBidWZmZXJbMF0sYnVmZmVyWzFdLGJ1ZmZlclsyXSxidWZmZXJbM10pOwpAQCAtNDc0LDEzICszMjksMTUgQEAKIHsKIAlzdHJ1Y3QgdHVuZXJ0eXBlICp0dW47CiAJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwotCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzRdOwotCXVuc2lnbmVkIGRpdjsKLQlpbnQgcmM7CisJdTggYnVmZmVyWzRdOworCXUxNiBkaXY7CisJaW50IHJjLCBqOwogCiAJdHVuID0gJnR1bmVyc1t0LT50eXBlXTsKKwlqID0gVFVORVJfUEFSQU1fQU5BTE9HOworCiAJZGl2ID0gKDIwICogZnJlcSAvIDE2MDAwKSArIChpbnQpKDIwKjEwLjcpOyAvKiBJRiAxMC43IE1IeiAqLwotCWJ1ZmZlclsyXSA9ICh0dW4tPmNvbmZpZyAmIH5UVU5FUl9SQVRJT19NQVNLKSB8IFRVTkVSX1JBVElPX1NFTEVDVF81MDsgLyogNTAga0h6IHN0ZXAgKi8KKwlidWZmZXJbMl0gPSAodHVuLT5wYXJhbXNbal0uY29uZmlnICYgflRVTkVSX1JBVElPX01BU0spIHwgVFVORVJfUkFUSU9fU0VMRUNUXzUwOyAvKiA1MCBrSHogc3RlcCAqLwogCiAJc3dpdGNoICh0LT50eXBlKSB7CiAJY2FzZSBUVU5FUl9URU5BXzk1MzNfREk6CkBAIC01MDksOSArMzY2LDE5IEBACiAJfQogCWJ1ZmZlclswXSA9IChkaXY+PjgpICYgMHg3ZjsKIAlidWZmZXJbMV0gPSBkaXYgICAgICAmIDB4ZmY7CisJaWYgKHR1bmVyc1t0LT50eXBlXS5wYXJhbXMtPmNiX2ZpcnN0X2lmX2xvd2VyX2ZyZXEgJiYgZGl2IDwgdC0+bGFzdF9kaXYpIHsKKwkJYnVmZmVyWzBdID0gYnVmZmVyWzJdOworCQlidWZmZXJbMV0gPSBidWZmZXJbM107CisJCWJ1ZmZlclsyXSA9IChkaXY+PjgpICYgMHg3ZjsKKwkJYnVmZmVyWzNdID0gZGl2ICAgICAgJiAweGZmOworCX0gZWxzZSB7CisJCWJ1ZmZlclswXSA9IChkaXY+PjgpICYgMHg3ZjsKKwkJYnVmZmVyWzFdID0gZGl2ICAgICAgJiAweGZmOworCX0KIAogCXR1bmVyX2RiZygicmFkaW8gMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4XG4iLAogCSAgICAgICBidWZmZXJbMF0sYnVmZmVyWzFdLGJ1ZmZlclsyXSxidWZmZXJbM10pOworCXQtPmxhc3RfZGl2ID0gZGl2OwogCiAJaWYgKDQgIT0gKHJjID0gaTJjX21hc3Rlcl9zZW5kKGMsYnVmZmVyLDQpKSkKIAkJdHVuZXJfd2FybigiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSA0KVxuIixyYyk7CkBAIC01MjUsMTAgKzM5MiwxMCBAQAogCQkgICB0LT50eXBlLCB0dW5lcnNbdC0+dHlwZV0ubmFtZSk7CiAJc3RybGNweShjLT5uYW1lLCB0dW5lcnNbdC0+dHlwZV0ubmFtZSwgc2l6ZW9mKGMtPm5hbWUpKTsKIAotCXQtPnR2X2ZyZXEgICAgPSBkZWZhdWx0X3NldF90dl9mcmVxOwotCXQtPnJhZGlvX2ZyZXEgPSBkZWZhdWx0X3NldF9yYWRpb19mcmVxOworCXQtPnNldF90dl9mcmVxID0gZGVmYXVsdF9zZXRfdHZfZnJlcTsKKwl0LT5zZXRfcmFkaW9fZnJlcSA9IGRlZmF1bHRfc2V0X3JhZGlvX2ZyZXE7CiAJdC0+aGFzX3NpZ25hbCA9IHR1bmVyX3NpZ25hbDsKLQl0LT5pc19zdGVyZW8gID0gdHVuZXJfc3RlcmVvOworCXQtPmlzX3N0ZXJlbyA9IHR1bmVyX3N0ZXJlbzsKIAl0LT5zdGFuZGJ5ID0gTlVMTDsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci10eXBlcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci10eXBlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZTc4MTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLXR5cGVzLmMKQEAgLTAsMCArMSwxNDA2IEBACisvKgorICoKKyAqIGkyYyB0diB0dW5lciBjaGlwIGRldmljZSB0eXBlIGRhdGFiYXNlLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS90dW5lci10eXBlcy5oPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKglUaGUgZmxvYXRzIGluIHRoZSB0dW5lciBzdHJ1Y3QgYXJlIGNvbXB1dGVkIGF0IGNvbXBpbGUgdGltZQorICoJYnkgZ2NjIGFuZCBjYXN0IGJhY2sgdG8gaW50ZWdlcnMuIFRodXMgd2UgZG9uJ3QgdmlvbGF0ZSB0aGUKKyAqCSJubyBmbG9hdCBpbiBrZXJuZWwiIHJ1bGUuCisgKgorICoJQSB0dW5lcl9yYW5nZSBtYXkgYmUgcmVmZXJlbmNlZCBieSBtdWx0aXBsZSB0dW5lcl9wYXJhbXMgc3RydWN0cy4KKyAqCVRoZXJlIGFyZSBtYW55IGR1cGxpY2F0ZXMgaW4gaGVyZS4gUmV1c2luZyB0dW5lcl9yYW5nZSBzdHJ1Y3RzLAorICoJcmF0aGVyIHRoYW4gZGVmaW5pbmcgbmV3IG9uZXMgZm9yIGVhY2ggdHVuZXIsIHdpbGwgY3V0IGRvd24gb24KKyAqCW1lbW9yeSB1c2FnZSwgYW5kIGlzIHByZWZlcnJlZCB3aGVuIHBvc3NpYmxlLgorICoKKyAqCUVhY2ggdHVuZXJfcGFyYW1zIGFycmF5IG1heSBjb250YWluIG9uZSBvciBtb3JlIGVsZW1lbnRzLCBvbmUKKyAqCWZvciBlYWNoIHZpZGVvIHN0YW5kYXJkLgorICoKKyAqCUZJWE1FOiBTb21lIHR1bmVyX3JhbmdlIGRlZmluaXRpb25zIGFyZSBkdXBsaWNhdGVkLCBhbmQKKyAqCXNob3VsZCBiZSBlbGltaW5hdGVkLgorICoKKyAqCUZJWE1FOiB0dW5lcnR5cGUgc3RydWN0IGNvbnRhaW5zIGFuIGVsZW1lbnQsIGhhc190ZGE5ODh4LgorICoJV2UgbXVzdCBzZXQgdGhpcyBmb3IgYWxsIHR1bmVydHlwZXMgdGhhdCBjb250YWluIGEgdGRhOTg4eAorICoJY2hpcCwgYW5kIHRoZW4gd2UgY2FuIHJlbW92ZSB0aGlzIHNldHRpbmcgZnJvbSB0aGUgdmFyaW91cworICoJY2FyZCBzdHJ1Y3RzLgorICovCisKKy8qIDAtOSAqLworLyogLS0tLS0tLS0tLS0tIFRVTkVSX1RFTUlDX1BBTCAtIFRFTUlDIFBBTCAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9yYW5nZSB0dW5lcl90ZW1pY19wYWxfcmFuZ2VzW10gPSB7CisJeyAxNiAqIDE0MC4yNSAvKk1IeiovLCAweDAyLCB9LAorCXsgMTYgKiA0NjMuMjUgLypNSHoqLywgMHgwNCwgfSwKKwl7IDE2ICogOTk5Ljk5ICAgICAgICAsIDB4MDEsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl90ZW1pY19wYWxfcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9QQUwsCisJCS5yYW5nZXMgPSB0dW5lcl90ZW1pY19wYWxfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl90ZW1pY19wYWxfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9QSElMSVBTX1BBTF9JIC0gUGhpbGlwcyBQQUxfSSAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9yYW5nZSB0dW5lcl9waGlsaXBzX3BhbF9pX3Jhbmdlc1tdID0geworCXsgMTYgKiAxNDAuMjUgLypNSHoqLywgMHhhMCwgfSwKKwl7IDE2ICogNDYzLjI1IC8qTUh6Ki8sIDB4OTAsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweDMwLCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfcGhpbGlwc19wYWxfaV9wYXJhbXNbXSA9IHsKKwl7CisJCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX1BBTCwKKwkJLnJhbmdlcyA9IHR1bmVyX3BoaWxpcHNfcGFsX2lfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl9waGlsaXBzX3BhbF9pX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfUEhJTElQU19OVFNDIC0gUGhpbGlwcyBOVFNDIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3JhbmdlIHR1bmVyX3BoaWxpcHNfbnRzY19yYW5nZXNbXSA9IHsKKwl7IDE2ICogMTU3LjI1IC8qTUh6Ki8sIDB4YTAsIH0sCisJeyAxNiAqIDQ1MS4yNSAvKk1IeiovLCAweDkwLCB9LAorCXsgMTYgKiA5OTkuOTkgICAgICAgICwgMHgzMCwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcGFyYW1zIHR1bmVyX3BoaWxpcHNfbnRzY19wYXJhbXNbXSA9IHsKKwl7CisJCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX05UU0MsCisJCS5yYW5nZXMgPSB0dW5lcl9waGlsaXBzX250c2NfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl9waGlsaXBzX250c2NfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJCS5jYl9maXJzdF9pZl9sb3dlcl9mcmVxID0gMSwKKwl9LAorfTsKKworLyogLS0tLS0tLS0tLS0tIFRVTkVSX1BISUxJUFNfU0VDQU0gLSBQaGlsaXBzIFNFQ0FNIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3JhbmdlIHR1bmVyX3BoaWxpcHNfc2VjYW1fcmFuZ2VzW10gPSB7CisJeyAxNiAqIDE2OC4yNSAvKk1IeiovLCAweGE3LCB9LAorCXsgMTYgKiA0NDcuMjUgLypNSHoqLywgMHg5NywgfSwKKwl7IDE2ICogOTk5Ljk5ICAgICAgICAsIDB4MzcsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl9waGlsaXBzX3NlY2FtX3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfU0VDQU0sCisJCS5yYW5nZXMgPSB0dW5lcl9waGlsaXBzX3NlY2FtX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfcGhpbGlwc19zZWNhbV9yYW5nZXMpLAorCQkuY29uZmlnID0gMHg4ZSwKKwkJLmNiX2ZpcnN0X2lmX2xvd2VyX2ZyZXEgPSAxLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfUEhJTElQU19QQUwgLSBQaGlsaXBzIFBBTCAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9yYW5nZSB0dW5lcl9waGlsaXBzX3BhbF9yYW5nZXNbXSA9IHsKKwl7IDE2ICogMTY4LjI1IC8qTUh6Ki8sIDB4YTAsIH0sCisJeyAxNiAqIDQ0Ny4yNSAvKk1IeiovLCAweDkwLCB9LAorCXsgMTYgKiA5OTkuOTkgICAgICAgICwgMHgzMCwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcGFyYW1zIHR1bmVyX3BoaWxpcHNfcGFsX3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfUEFMLAorCQkucmFuZ2VzID0gdHVuZXJfcGhpbGlwc19wYWxfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl9waGlsaXBzX3BhbF9yYW5nZXMpLAorCQkuY29uZmlnID0gMHg4ZSwKKwkJLmNiX2ZpcnN0X2lmX2xvd2VyX2ZyZXEgPSAxLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfVEVNSUNfTlRTQyAtIFRFTUlDIE5UU0MgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcmFuZ2UgdHVuZXJfdGVtaWNfbnRzY19yYW5nZXNbXSA9IHsKKwl7IDE2ICogMTU3LjI1IC8qTUh6Ki8sIDB4MDIsIH0sCisJeyAxNiAqIDQ2My4yNSAvKk1IeiovLCAweDA0LCB9LAorCXsgMTYgKiA5OTkuOTkgICAgICAgICwgMHgwMSwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcGFyYW1zIHR1bmVyX3RlbWljX250c2NfcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9OVFNDLAorCQkucmFuZ2VzID0gdHVuZXJfdGVtaWNfbnRzY19yYW5nZXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX3RlbWljX250c2NfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9URU1JQ19QQUxfSSAtIFRFTUlDIFBBTF9JIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3JhbmdlIHR1bmVyX3RlbWljX3BhbF9pX3Jhbmdlc1tdID0geworCXsgMTYgKiAxNzAuMDAgLypNSHoqLywgMHgwMiwgfSwKKwl7IDE2ICogNDUwLjAwIC8qTUh6Ki8sIDB4MDQsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweDAxLCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfdGVtaWNfcGFsX2lfcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9QQUwsCisJCS5yYW5nZXMgPSB0dW5lcl90ZW1pY19wYWxfaV9yYW5nZXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX3RlbWljX3BhbF9pX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfVEVNSUNfNDAzNkZZNV9OVFNDIC0gVEVNSUMgTlRTQyAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9yYW5nZSB0dW5lcl90ZW1pY180MDM2Znk1X250c2NfcmFuZ2VzW10gPSB7CisJeyAxNiAqIDE1Ny4yNSAvKk1IeiovLCAweGEwLCB9LAorCXsgMTYgKiA0NjMuMjUgLypNSHoqLywgMHg5MCwgfSwKKwl7IDE2ICogOTk5Ljk5ICAgICAgICAsIDB4MzAsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl90ZW1pY180MDM2Znk1X250c2NfcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9OVFNDLAorCQkucmFuZ2VzID0gdHVuZXJfdGVtaWNfNDAzNmZ5NV9udHNjX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfdGVtaWNfNDAzNmZ5NV9udHNjX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfQUxQU19UU0JIMV9OVFNDIC0gVEVNSUMgTlRTQyAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9yYW5nZSB0dW5lcl9hbHBzX3RzYl8xX3Jhbmdlc1tdID0geworCXsgMTYgKiAxMzcuMjUgLypNSHoqLywgMHgwMSwgfSwKKwl7IDE2ICogMzg1LjI1IC8qTUh6Ki8sIDB4MDIsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweDA4LCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfYWxwc190c2JoMV9udHNjX3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfTlRTQywKKwkJLnJhbmdlcyA9IHR1bmVyX2FscHNfdHNiXzFfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl9hbHBzX3RzYl8xX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAxMC0xOSAqLworLyogLS0tLS0tLS0tLS0tIFRVTkVSX0FMUFNfVFNCRTFfUEFMIC0gVEVNSUMgUEFMIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl9hbHBzX3RzYl8xX3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfUEFMLAorCQkucmFuZ2VzID0gdHVuZXJfYWxwc190c2JfMV9yYW5nZXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX2FscHNfdHNiXzFfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9BTFBTX1RTQkI1X1BBTF9JIC0gQWxwcyBQQUxfSSAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9yYW5nZSB0dW5lcl9hbHBzX3RzYl81X3BhbF9yYW5nZXNbXSA9IHsKKwl7IDE2ICogMTMzLjI1IC8qTUh6Ki8sIDB4MDEsIH0sCisJeyAxNiAqIDM1MS4yNSAvKk1IeiovLCAweDAyLCB9LAorCXsgMTYgKiA5OTkuOTkgICAgICAgICwgMHgwOCwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcGFyYW1zIHR1bmVyX2FscHNfdHNiYjVfcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9QQUwsCisJCS5yYW5nZXMgPSB0dW5lcl9hbHBzX3RzYl81X3BhbF9yYW5nZXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX2FscHNfdHNiXzVfcGFsX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfQUxQU19UU0JFNV9QQUwgLSBBbHBzIFBBTCAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfYWxwc190c2JlNV9wYXJhbXNbXSA9IHsKKwl7CisJCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX1BBTCwKKwkJLnJhbmdlcyA9IHR1bmVyX2FscHNfdHNiXzVfcGFsX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfYWxwc190c2JfNV9wYWxfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9BTFBTX1RTQkM1X1BBTCAtIEFscHMgUEFMIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl9hbHBzX3RzYmM1X3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfUEFMLAorCQkucmFuZ2VzID0gdHVuZXJfYWxwc190c2JfNV9wYWxfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl9hbHBzX3RzYl81X3BhbF9yYW5nZXMpLAorCQkuY29uZmlnID0gMHg4ZSwKKwl9LAorfTsKKworLyogLS0tLS0tLS0tLS0tIFRVTkVSX1RFTUlDXzQwMDZGSDVfUEFMIC0gVEVNSUMgUEFMIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3JhbmdlIHR1bmVyX3RlbWljXzQwMDZmaDVfcGFsX3Jhbmdlc1tdID0geworCXsgMTYgKiAxNzAuMDAgLypNSHoqLywgMHhhMCwgfSwKKwl7IDE2ICogNDUwLjAwIC8qTUh6Ki8sIDB4OTAsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweDMwLCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfdGVtaWNfNDAwNmZoNV9wYXJhbXNbXSA9IHsKKwl7CisJCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX1BBTCwKKwkJLnJhbmdlcyA9IHR1bmVyX3RlbWljXzQwMDZmaDVfcGFsX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfdGVtaWNfNDAwNmZoNV9wYWxfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9BTFBTX1RTSEM2X05UU0MgLSBBbHBzIE5UU0MgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcmFuZ2UgdHVuZXJfYWxwc190c2hjNl9udHNjX3Jhbmdlc1tdID0geworCXsgMTYgKiAxMzcuMjUgLypNSHoqLywgMHgxNCwgfSwKKwl7IDE2ICogMzg1LjI1IC8qTUh6Ki8sIDB4MTIsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweDExLCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfYWxwc190c2hjNl9wYXJhbXNbXSA9IHsKKwl7CisJCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX05UU0MsCisJCS5yYW5nZXMgPSB0dW5lcl9hbHBzX3RzaGM2X250c2NfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl9hbHBzX3RzaGM2X250c2NfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9URU1JQ19QQUxfREsgLSBURU1JQyBQQUwgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcmFuZ2UgdHVuZXJfdGVtaWNfcGFsX2RrX3Jhbmdlc1tdID0geworCXsgMTYgKiAxNjguMjUgLypNSHoqLywgMHhhMCwgfSwKKwl7IDE2ICogNDU2LjI1IC8qTUh6Ki8sIDB4OTAsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweDMwLCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfdGVtaWNfcGFsX2RrX3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfUEFMLAorCQkucmFuZ2VzID0gdHVuZXJfdGVtaWNfcGFsX2RrX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfdGVtaWNfcGFsX2RrX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfUEhJTElQU19OVFNDX00gLSBQaGlsaXBzIE5UU0MgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcmFuZ2UgdHVuZXJfcGhpbGlwc19udHNjX21fcmFuZ2VzW10gPSB7CisJeyAxNiAqIDE2MC4wMCAvKk1IeiovLCAweGEwLCB9LAorCXsgMTYgKiA0NTQuMDAgLypNSHoqLywgMHg5MCwgfSwKKwl7IDE2ICogOTk5Ljk5ICAgICAgICAsIDB4MzAsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl9waGlsaXBzX250c2NfbV9wYXJhbXNbXSA9IHsKKwl7CisJCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX05UU0MsCisJCS5yYW5nZXMgPSB0dW5lcl9waGlsaXBzX250c2NfbV9yYW5nZXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX3BoaWxpcHNfbnRzY19tX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfVEVNSUNfNDA2NkZZNV9QQUxfSSAtIFRFTUlDIFBBTF9JIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3JhbmdlIHR1bmVyX3RlbWljXzQweDZmXzVfcGFsX3Jhbmdlc1tdID0geworCXsgMTYgKiAxNjkuMDAgLypNSHoqLywgMHhhMCwgfSwKKwl7IDE2ICogNDU0LjAwIC8qTUh6Ki8sIDB4OTAsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweDMwLCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfdGVtaWNfNDA2NmZ5NV9wYWxfaV9wYXJhbXNbXSA9IHsKKwl7CisJCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX1BBTCwKKwkJLnJhbmdlcyA9IHR1bmVyX3RlbWljXzQweDZmXzVfcGFsX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfdGVtaWNfNDB4NmZfNV9wYWxfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9URU1JQ180MDA2Rk41X01VTFRJX1BBTCAtIFRFTUlDIFBBTCAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfdGVtaWNfNDAwNmZuNV9tdWx0aV9wYXJhbXNbXSA9IHsKKwl7CisJCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX1BBTCwKKwkJLnJhbmdlcyA9IHR1bmVyX3RlbWljXzQweDZmXzVfcGFsX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfdGVtaWNfNDB4NmZfNV9wYWxfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJfSwKK307CisKKy8qIDIwLTI5ICovCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfVEVNSUNfNDAwOUZSNV9QQUwgLSBURU1JQyBQQUwgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcmFuZ2UgdHVuZXJfdGVtaWNfNDAwOWZfNV9wYWxfcmFuZ2VzW10gPSB7CisJeyAxNiAqIDE0MS4wMCAvKk1IeiovLCAweGEwLCB9LAorCXsgMTYgKiA0NjQuMDAgLypNSHoqLywgMHg5MCwgfSwKKwl7IDE2ICogOTk5Ljk5ICAgICAgICAsIDB4MzAsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl90ZW1pY180MDA5Zl81X3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfUEFMLAorCQkucmFuZ2VzID0gdHVuZXJfdGVtaWNfNDAwOWZfNV9wYWxfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl90ZW1pY180MDA5Zl81X3BhbF9yYW5nZXMpLAorCQkuY29uZmlnID0gMHg4ZSwKKwl9LAorfTsKKworLyogLS0tLS0tLS0tLS0tIFRVTkVSX1RFTUlDXzQwMzlGUjVfTlRTQyAtIFRFTUlDIE5UU0MgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcmFuZ2UgdHVuZXJfdGVtaWNfNDAzOWZyNV9udHNjX3Jhbmdlc1tdID0geworCXsgMTYgKiAxNTguMDAgLypNSHoqLywgMHhhMCwgfSwKKwl7IDE2ICogNDUzLjAwIC8qTUh6Ki8sIDB4OTAsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweDMwLCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfdGVtaWNfNDAzOWZyNV9wYXJhbXNbXSA9IHsKKwl7CisJCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX05UU0MsCisJCS5yYW5nZXMgPSB0dW5lcl90ZW1pY180MDM5ZnI1X250c2NfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl90ZW1pY180MDM5ZnI1X250c2NfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9URU1JQ180MDQ2Rk01IC0gVEVNSUMgUEFMIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3JhbmdlIHR1bmVyX3RlbWljXzQwNDZmbTVfcGFsX3Jhbmdlc1tdID0geworCXsgMTYgKiAxNjkuMDAgLypNSHoqLywgMHhhMCwgfSwKKwl7IDE2ICogNDU0LjAwIC8qTUh6Ki8sIDB4OTAsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweDMwLCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfdGVtaWNfNDA0NmZtNV9wYXJhbXNbXSA9IHsKKwl7CisJCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX1BBTCwKKwkJLnJhbmdlcyA9IHR1bmVyX3RlbWljXzQwNDZmbTVfcGFsX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfdGVtaWNfNDA0NmZtNV9wYWxfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9QSElMSVBTX1BBTF9ESyAtIFBoaWxpcHMgUEFMIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3JhbmdlIHR1bmVyX2xnX3BhbF9yYW5nZXNbXSA9IHsKKwl7IDE2ICogMTcwLjAwIC8qTUh6Ki8sIDB4YTAsIH0sCisJeyAxNiAqIDQ1MC4wMCAvKk1IeiovLCAweDkwLCB9LAorCXsgMTYgKiA5OTkuOTkgICAgICAgICwgMHgzMCwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcGFyYW1zIHR1bmVyX3BoaWxpcHNfcGFsX2RrX3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfUEFMLAorCQkucmFuZ2VzID0gdHVuZXJfbGdfcGFsX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfbGdfcGFsX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfUEhJTElQU19GUTEyMTZNRSAtIFBoaWxpcHMgUEFMIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl9waGlsaXBzX2ZxMTIxNm1lX3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfUEFMLAorCQkucmFuZ2VzID0gdHVuZXJfbGdfcGFsX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfbGdfcGFsX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfTEdfUEFMX0lfRk0gLSBMR0lOTk9URUsgUEFMX0kgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcGFyYW1zIHR1bmVyX2xnX3BhbF9pX2ZtX3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfUEFMLAorCQkucmFuZ2VzID0gdHVuZXJfbGdfcGFsX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfbGdfcGFsX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfTEdfUEFMX0kgLSBMR0lOTk9URUsgUEFMX0kgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcGFyYW1zIHR1bmVyX2xnX3BhbF9pX3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfUEFMLAorCQkucmFuZ2VzID0gdHVuZXJfbGdfcGFsX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfbGdfcGFsX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfTEdfTlRTQ19GTSAtIExHSU5OT1RFSyBOVFNDIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3JhbmdlIHR1bmVyX2xnX250c2NfZm1fcmFuZ2VzW10gPSB7CisJeyAxNiAqIDIxMC4wMCAvKk1IeiovLCAweGEwLCB9LAorCXsgMTYgKiA0OTcuMDAgLypNSHoqLywgMHg5MCwgfSwKKwl7IDE2ICogOTk5Ljk5ICAgICAgICAsIDB4MzAsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl9sZ19udHNjX2ZtX3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfTlRTQywKKwkJLnJhbmdlcyA9IHR1bmVyX2xnX250c2NfZm1fcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl9sZ19udHNjX2ZtX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfTEdfUEFMX0ZNIC0gTEdJTk5PVEVLIFBBTCAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfbGdfcGFsX2ZtX3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfUEFMLAorCQkucmFuZ2VzID0gdHVuZXJfbGdfcGFsX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfbGdfcGFsX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfTEdfUEFMIC0gTEdJTk5PVEVLIFBBTCAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfbGdfcGFsX3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfUEFMLAorCQkucmFuZ2VzID0gdHVuZXJfbGdfcGFsX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfbGdfcGFsX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAzMC0zOSAqLworLyogLS0tLS0tLS0tLS0tIFRVTkVSX1RFTUlDXzQwMDlGTjVfTVVMVElfUEFMX0ZNIC0gVEVNSUMgUEFMIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl90ZW1pY180MDA5X2ZuNV9tdWx0aV9wYWxfZm1fcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9QQUwsCisJCS5yYW5nZXMgPSB0dW5lcl90ZW1pY180MDA5Zl81X3BhbF9yYW5nZXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX3RlbWljXzQwMDlmXzVfcGFsX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfU0hBUlBfMlU1SkY1NTQwX05UU0MgLSBTSEFSUCBOVFNDIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3JhbmdlIHR1bmVyX3NoYXJwXzJ1NWpmNTU0MF9udHNjX3Jhbmdlc1tdID0geworCXsgMTYgKiAxMzcuMjUgLypNSHoqLywgMHgwMSwgfSwKKwl7IDE2ICogMzE3LjI1IC8qTUh6Ki8sIDB4MDIsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweDA4LCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfc2hhcnBfMnU1amY1NTQwX3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfTlRTQywKKwkJLnJhbmdlcyA9IHR1bmVyX3NoYXJwXzJ1NWpmNTU0MF9udHNjX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfc2hhcnBfMnU1amY1NTQwX250c2NfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9TYW1zdW5nX1BBTF9UQ1BNOTA5MVBEMjcgLSBTYW1zdW5nIFBBTCAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9yYW5nZSB0dW5lcl9zYW1zdW5nX3BhbF90Y3BtOTA5MXBkMjdfcmFuZ2VzW10gPSB7CisJeyAxNiAqIDE2OSAvKk1IeiovLCAweGEwLCB9LAorCXsgMTYgKiA0NjQgLypNSHoqLywgMHg5MCwgfSwKKwl7IDE2ICogOTk5Ljk5ICAgICAsIDB4MzAsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl9zYW1zdW5nX3BhbF90Y3BtOTA5MXBkMjdfcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9QQUwsCisJCS5yYW5nZXMgPSB0dW5lcl9zYW1zdW5nX3BhbF90Y3BtOTA5MXBkMjdfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl9zYW1zdW5nX3BhbF90Y3BtOTA5MXBkMjdfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9URU1JQ180MTA2Rkg1IC0gVEVNSUMgUEFMIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl90ZW1pY180MTA2Zmg1X3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfUEFMLAorCQkucmFuZ2VzID0gdHVuZXJfdGVtaWNfNDAwOWZfNV9wYWxfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl90ZW1pY180MDA5Zl81X3BhbF9yYW5nZXMpLAorCQkuY29uZmlnID0gMHg4ZSwKKwl9LAorfTsKKworLyogLS0tLS0tLS0tLS0tIFRVTkVSX1RFTUlDXzQwMTJGWTUgLSBURU1JQyBQQUwgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcmFuZ2UgdHVuZXJfdGVtaWNfNDAxMmZ5NV9wYWxfcmFuZ2VzW10gPSB7CisJeyAxNiAqIDE0MC4yNSAvKk1IeiovLCAweDAyLCB9LAorCXsgMTYgKiA0NjMuMjUgLypNSHoqLywgMHgwNCwgfSwKKwl7IDE2ICogOTk5Ljk5ICAgICAgICAsIDB4MDEsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl90ZW1pY180MDEyZnk1X3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfUEFMLAorCQkucmFuZ2VzID0gdHVuZXJfdGVtaWNfNDAxMmZ5NV9wYWxfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl90ZW1pY180MDEyZnk1X3BhbF9yYW5nZXMpLAorCQkuY29uZmlnID0gMHg4ZSwKKwl9LAorfTsKKworLyogLS0tLS0tLS0tLS0tIFRVTkVSX1RFTUlDXzQxMzZGWTUgLSBURU1JQyBOVFNDIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3JhbmdlIHR1bmVyX3RlbWljXzQxMzZfZnk1X250c2NfcmFuZ2VzW10gPSB7CisJeyAxNiAqIDE1OC4wMCAvKk1IeiovLCAweGEwLCB9LAorCXsgMTYgKiA0NTMuMDAgLypNSHoqLywgMHg5MCwgfSwKKwl7IDE2ICogOTk5Ljk5ICAgICAgICAsIDB4MzAsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl90ZW1pY180MTM2X2Z5NV9wYXJhbXNbXSA9IHsKKwl7CisJCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX05UU0MsCisJCS5yYW5nZXMgPSB0dW5lcl90ZW1pY180MTM2X2Z5NV9udHNjX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfdGVtaWNfNDEzNl9meTVfbnRzY19yYW5nZXMpLAorCQkuY29uZmlnID0gMHg4ZSwKKwl9LAorfTsKKworLyogLS0tLS0tLS0tLS0tIFRVTkVSX0xHX1BBTF9ORVdfVEFQQyAtIExHSU5OT1RFSyBQQUwgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcmFuZ2UgdHVuZXJfbGdfbmV3X3RhcGNfcmFuZ2VzW10gPSB7CisJeyAxNiAqIDE3MC4wMCAvKk1IeiovLCAweDAxLCB9LAorCXsgMTYgKiA0NTAuMDAgLypNSHoqLywgMHgwMiwgfSwKKwl7IDE2ICogOTk5Ljk5ICAgICAgICAsIDB4MDgsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl9sZ19wYWxfbmV3X3RhcGNfcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9QQUwsCisJCS5yYW5nZXMgPSB0dW5lcl9sZ19uZXdfdGFwY19yYW5nZXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX2xnX25ld190YXBjX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMgLSBQaGlsaXBzIFBBTCAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9yYW5nZSB0dW5lcl9mbTEyMTZtZV9tazNfcGFsX3Jhbmdlc1tdID0geworCXsgMTYgKiAxNTguMDAgLypNSHoqLywgMHgwMSwgfSwKKwl7IDE2ICogNDQyLjAwIC8qTUh6Ki8sIDB4MDIsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweDA0LCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfZm0xMjE2bWVfbWszX3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfUEFMLAorCQkucmFuZ2VzID0gdHVuZXJfZm0xMjE2bWVfbWszX3BhbF9yYW5nZXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX2ZtMTIxNm1lX21rM19wYWxfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJCS5jYl9maXJzdF9pZl9sb3dlcl9mcmVxID0gMSwKKwl9LAorfTsKKworLyogLS0tLS0tLS0tLS0tIFRVTkVSX0xHX05UU0NfTkVXX1RBUEMgLSBMR0lOTk9URUsgTlRTQyAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfbGdfbnRzY19uZXdfdGFwY19wYXJhbXNbXSA9IHsKKwl7CisJCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX05UU0MsCisJCS5yYW5nZXMgPSB0dW5lcl9sZ19uZXdfdGFwY19yYW5nZXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX2xnX25ld190YXBjX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiA0MC00OSAqLworLyogLS0tLS0tLS0tLS0tIFRVTkVSX0hJVEFDSElfTlRTQyAtIEhJVEFDSEkgTlRTQyAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfaGl0YWNoaV9udHNjX3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfTlRTQywKKwkJLnJhbmdlcyA9IHR1bmVyX2xnX25ld190YXBjX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfbGdfbmV3X3RhcGNfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9QSElMSVBTX1BBTF9NSyAtIFBoaWxpcHMgUEFMIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3JhbmdlIHR1bmVyX3BoaWxpcHNfcGFsX21rX3BhbF9yYW5nZXNbXSA9IHsKKwl7IDE2ICogMTQwLjI1IC8qTUh6Ki8sIDB4MDEsIH0sCisJeyAxNiAqIDQ2My4yNSAvKk1IeiovLCAweGMyLCB9LAorCXsgMTYgKiA5OTkuOTkgICAgICAgICwgMHhjZiwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcGFyYW1zIHR1bmVyX3BoaWxpcHNfcGFsX21rX3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfUEFMLAorCQkucmFuZ2VzID0gdHVuZXJfcGhpbGlwc19wYWxfbWtfcGFsX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfcGhpbGlwc19wYWxfbWtfcGFsX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfUEhJTElQU19BVFNDIC0gUGhpbGlwcyBBVFNDIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3JhbmdlIHR1bmVyX3BoaWxpcHNfYXRzY19yYW5nZXNbXSA9IHsKKwl7IDE2ICogMTU3LjI1IC8qTUh6Ki8sIDB4YTAsIH0sCisJeyAxNiAqIDQ1NC4wMCAvKk1IeiovLCAweDkwLCB9LAorCXsgMTYgKiA5OTkuOTkgICAgICAgICwgMHgzMCwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcGFyYW1zIHR1bmVyX3BoaWxpcHNfYXRzY19wYXJhbXNbXSA9IHsKKwl7CisJCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX05UU0MsCisJCS5yYW5nZXMgPSB0dW5lcl9waGlsaXBzX2F0c2NfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl9waGlsaXBzX2F0c2NfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9QSElMSVBTX0ZNMTIzNl9NSzMgLSBQaGlsaXBzIE5UU0MgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcmFuZ2UgdHVuZXJfZm0xMjM2X21rM19udHNjX3Jhbmdlc1tdID0geworCXsgMTYgKiAxNjAuMDAgLypNSHoqLywgMHgwMSwgfSwKKwl7IDE2ICogNDQyLjAwIC8qTUh6Ki8sIDB4MDIsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweDA0LCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfZm0xMjM2X21rM19wYXJhbXNbXSA9IHsKKwl7CisJCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX05UU0MsCisJCS5yYW5nZXMgPSB0dW5lcl9mbTEyMzZfbWszX250c2NfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl9mbTEyMzZfbWszX250c2NfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJCS5jYl9maXJzdF9pZl9sb3dlcl9mcmVxID0gMSwKKwl9LAorfTsKKworLyogLS0tLS0tLS0tLS0tIFRVTkVSX1BISUxJUFNfNElOMSAtIFBoaWxpcHMgTlRTQyAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9yYW5nZSB0dW5lcl9waGlsaXBzXzRpbjFfbnRzY19yYW5nZXNbXSA9IHsKKwl7IDE2ICogMTYwLjAwIC8qTUh6Ki8sIDB4MDEsIH0sCisJeyAxNiAqIDQ0Mi4wMCAvKk1IeiovLCAweDAyLCB9LAorCXsgMTYgKiA5OTkuOTkgICAgICAgICwgMHgwNCwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcGFyYW1zIHR1bmVyX3BoaWxpcHNfNGluMV9wYXJhbXNbXSA9IHsKKwl7CisJCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX05UU0MsCisJCS5yYW5nZXMgPSB0dW5lcl9waGlsaXBzXzRpbjFfbnRzY19yYW5nZXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX3BoaWxpcHNfNGluMV9udHNjX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfTUlDUk9UVU5FXzQwNDlGTTUgLSBNaWNyb3R1bmUgUEFMIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl9taWNyb3R1bmVfNDA0OV9mbTVfcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9QQUwsCisJCS5yYW5nZXMgPSB0dW5lcl90ZW1pY180MDA5Zl81X3BhbF9yYW5nZXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX3RlbWljXzQwMDlmXzVfcGFsX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfUEFOQVNPTklDX1ZQMjcgLSBQYW5hc29uaWMgTlRTQyAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9yYW5nZSB0dW5lcl9wYW5hc29uaWNfdnAyN19udHNjX3Jhbmdlc1tdID0geworCXsgMTYgKiAxNjAuMDAgLypNSHoqLywgMHgwMSwgfSwKKwl7IDE2ICogNDU0LjAwIC8qTUh6Ki8sIDB4MDIsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweDA4LCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfcGFuYXNvbmljX3ZwMjdfcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9OVFNDLAorCQkucmFuZ2VzID0gdHVuZXJfcGFuYXNvbmljX3ZwMjdfbnRzY19yYW5nZXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX3BhbmFzb25pY192cDI3X250c2NfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4Y2UsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9MR19OVFNDX1RBUEUgLSBMR0lOTk9URUsgTlRTQyAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9yYW5nZSB0dW5lcl9sZ19udHNjX3RhcGVfcmFuZ2VzW10gPSB7CisJeyAxNiAqIDE2MC4wMCAvKk1IeiovLCAweDAxLCB9LAorCXsgMTYgKiA0NDIuMDAgLypNSHoqLywgMHgwMiwgfSwKKwl7IDE2ICogOTk5Ljk5ICAgICAgICAsIDB4MDQsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl9sZ19udHNjX3RhcGVfcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9OVFNDLAorCQkucmFuZ2VzID0gdHVuZXJfbGdfbnRzY190YXBlX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfbGdfbnRzY190YXBlX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfVE5GXzg4MzFCR0ZGIC0gUGhpbGlwcyBQQUwgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcmFuZ2UgdHVuZXJfdG5mXzg4MzFiZ2ZmX3BhbF9yYW5nZXNbXSA9IHsKKwl7IDE2ICogMTYxLjI1IC8qTUh6Ki8sIDB4YTAsIH0sCisJeyAxNiAqIDQ2My4yNSAvKk1IeiovLCAweDkwLCB9LAorCXsgMTYgKiA5OTkuOTkgICAgICAgICwgMHgzMCwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcGFyYW1zIHR1bmVyX3RuZl84ODMxYmdmZl9wYXJhbXNbXSA9IHsKKwl7CisJCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX1BBTCwKKwkJLnJhbmdlcyA9IHR1bmVyX3RuZl84ODMxYmdmZl9wYWxfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl90bmZfODgzMWJnZmZfcGFsX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfTUlDUk9UVU5FXzQwNDJGSTUgLSBNaWNyb3R1bmUgTlRTQyAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9yYW5nZSB0dW5lcl9taWNyb3R1bmVfNDA0MmZpNV9udHNjX3Jhbmdlc1tdID0geworCXsgMTYgKiAxNjIuMDAgLypNSHoqLywgMHhhMiwgfSwKKwl7IDE2ICogNDU3LjAwIC8qTUh6Ki8sIDB4OTQsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweDMxLCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfbWljcm90dW5lXzQwNDJmaTVfcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9OVFNDLAorCQkucmFuZ2VzID0gdHVuZXJfbWljcm90dW5lXzQwNDJmaTVfbnRzY19yYW5nZXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX21pY3JvdHVuZV80MDQyZmk1X250c2NfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJfSwKK307CisKKy8qIDUwLTU5ICovCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfVENMXzIwMDJOIC0gVENMIE5UU0MgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcmFuZ2UgdHVuZXJfdGNsXzIwMDJuX250c2NfcmFuZ2VzW10gPSB7CisJeyAxNiAqIDE3Mi4wMCAvKk1IeiovLCAweDAxLCB9LAorCXsgMTYgKiA0NDguMDAgLypNSHoqLywgMHgwMiwgfSwKKwl7IDE2ICogOTk5Ljk5ICAgICAgICAsIDB4MDgsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl90Y2xfMjAwMm5fcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9OVFNDLAorCQkucmFuZ2VzID0gdHVuZXJfdGNsXzIwMDJuX250c2NfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl90Y2xfMjAwMm5fbnRzY19yYW5nZXMpLAorCQkuY29uZmlnID0gMHg4ZSwKKwkJLmNiX2ZpcnN0X2lmX2xvd2VyX2ZyZXEgPSAxLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfUEhJTElQU19GTTEyNTZfSUgzIC0gUGhpbGlwcyBQQUwgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcmFuZ2UgdHVuZXJfcGhpbGlwc19mbTEyNTZfaWgzX3BhbF9yYW5nZXNbXSA9IHsKKwl7IDE2ICogMTYwLjAwIC8qTUh6Ki8sIDB4MDEsIH0sCisJeyAxNiAqIDQ0Mi4wMCAvKk1IeiovLCAweDAyLCB9LAorCXsgMTYgKiA5OTkuOTkgICAgICAgICwgMHgwNCwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcGFyYW1zIHR1bmVyX3BoaWxpcHNfZm0xMjU2X2loM19wYXJhbXNbXSA9IHsKKwl7CisJCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX1BBTCwKKwkJLnJhbmdlcyA9IHR1bmVyX3BoaWxpcHNfZm0xMjU2X2loM19wYWxfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl9waGlsaXBzX2ZtMTI1Nl9paDNfcGFsX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfVEhPTVNPTl9EVFQ3NjEwIC0gVEhPTVNPTiBBVFNDIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3JhbmdlIHR1bmVyX3Rob21zb25fZHR0NzYxMF9udHNjX3Jhbmdlc1tdID0geworCXsgMTYgKiAxNTcuMjUgLypNSHoqLywgMHgzOSwgfSwKKwl7IDE2ICogNDU0LjAwIC8qTUh6Ki8sIDB4M2EsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweDNjLCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfdGhvbXNvbl9kdHQ3NjEwX3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfTlRTQywKKwkJLnJhbmdlcyA9IHR1bmVyX3Rob21zb25fZHR0NzYxMF9udHNjX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfdGhvbXNvbl9kdHQ3NjEwX250c2NfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9QSElMSVBTX0ZRMTI4NiAtIFBoaWxpcHMgTlRTQyAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9yYW5nZSB0dW5lcl9waGlsaXBzX2ZxMTI4Nl9udHNjX3Jhbmdlc1tdID0geworCXsgMTYgKiAxNjAuMDAgLypNSHoqLywgMHg0MSwgfSwKKwl7IDE2ICogNDU0LjAwIC8qTUh6Ki8sIDB4NDIsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweDA0LCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfcGhpbGlwc19mcTEyODZfcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9OVFNDLAorCQkucmFuZ2VzID0gdHVuZXJfcGhpbGlwc19mcTEyODZfbnRzY19yYW5nZXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX3BoaWxpcHNfZnExMjg2X250c2NfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9UQ0xfMjAwMk1CIC0gVENMIFBBTCAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9yYW5nZSB0dW5lcl90Y2xfMjAwMm1iX3BhbF9yYW5nZXNbXSA9IHsKKwl7IDE2ICogMTcwLjAwIC8qTUh6Ki8sIDB4MDEsIH0sCisJeyAxNiAqIDQ1MC4wMCAvKk1IeiovLCAweDAyLCB9LAorCXsgMTYgKiA5OTkuOTkgICAgICAgICwgMHgwOCwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcGFyYW1zIHR1bmVyX3RjbF8yMDAybWJfcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9QQUwsCisJCS5yYW5nZXMgPSB0dW5lcl90Y2xfMjAwMm1iX3BhbF9yYW5nZXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX3RjbF8yMDAybWJfcGFsX3JhbmdlcyksCisJCS5jb25maWcgPSAweGNlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfUEhJTElQU19GUTEyMTZBTUVfTUs0IC0gUGhpbGlwcyBQQUwgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcmFuZ2UgdHVuZXJfcGhpbGlwc19mcTEyXzZhX19fbWs0X3Jhbmdlc1tdID0geworCXsgMTYgKiAxNjAuMDAgLypNSHoqLywgMHgwMSwgfSwKKwl7IDE2ICogNDQyLjAwIC8qTUh6Ki8sIDB4MDIsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweDA0LCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfcGhpbGlwc19mcTEyMTZhbWVfbWs0X3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfUEFMLAorCQkucmFuZ2VzID0gdHVuZXJfcGhpbGlwc19mcTEyXzZhX19fbWs0X3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfcGhpbGlwc19mcTEyXzZhX19fbWs0X3JhbmdlcyksCisJCS5jb25maWcgPSAweGNlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfUEhJTElQU19GUTEyMzZBX01LNCAtIFBoaWxpcHMgTlRTQyAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfcGhpbGlwc19mcTEyMzZhX21rNF9wYXJhbXNbXSA9IHsKKwl7CisJCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX05UU0MsCisJCS5yYW5nZXMgPSB0dW5lcl9waGlsaXBzX2ZxMTJfNmFfX19tazRfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl9waGlsaXBzX2ZxMTJfNmFfX19tazRfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9ZTUVDX1RWRl84NTMxTUYgLSBQaGlsaXBzIE5UU0MgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcmFuZ2UgdHVuZXJfeW1lY190dmZfODUzMW1mX250c2NfcmFuZ2VzW10gPSB7CisJeyAxNiAqIDE2MC4wMCAvKk1IeiovLCAweGEwLCB9LAorCXsgMTYgKiA0NTQuMDAgLypNSHoqLywgMHg5MCwgfSwKKwl7IDE2ICogOTk5Ljk5ICAgICAgICAsIDB4MzAsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl95bWVjX3R2Zl84NTMxbWZfcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9OVFNDLAorCQkucmFuZ2VzID0gdHVuZXJfeW1lY190dmZfODUzMW1mX250c2NfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl95bWVjX3R2Zl84NTMxbWZfbnRzY19yYW5nZXMpLAorCQkuY29uZmlnID0gMHg4ZSwKKwl9LAorfTsKKworLyogLS0tLS0tLS0tLS0tIFRVTkVSX1lNRUNfVFZGXzU1MzNNRiAtIFBoaWxpcHMgTlRTQyAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9yYW5nZSB0dW5lcl95bWVjX3R2Zl81NTMzbWZfbnRzY19yYW5nZXNbXSA9IHsKKwl7IDE2ICogMTYwLjAwIC8qTUh6Ki8sIDB4MDEsIH0sCisJeyAxNiAqIDQ1NC4wMCAvKk1IeiovLCAweDAyLCB9LAorCXsgMTYgKiA5OTkuOTkgICAgICAgICwgMHgwNCwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcGFyYW1zIHR1bmVyX3ltZWNfdHZmXzU1MzNtZl9wYXJhbXNbXSA9IHsKKwl7CisJCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX05UU0MsCisJCS5yYW5nZXMgPSB0dW5lcl95bWVjX3R2Zl81NTMzbWZfbnRzY19yYW5nZXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX3ltZWNfdHZmXzU1MzNtZl9udHNjX3JhbmdlcyksCisJCS5jb25maWcgPSAweDhlLAorCX0sCit9OworCisvKiA2MC02OSAqLworLyogLS0tLS0tLS0tLS0tIFRVTkVSX1RIT01TT05fRFRUNzYxWCAtIFRIT01TT04gQVRTQyAtLS0tLS0tLS0tLS0gKi8KKy8qIERUVCA3NjExIDc2MTFBIDc2MTIgNzYxMyA3NjEzQSA3NjE0IDc2MTUgNzYxNUEgKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9yYW5nZSB0dW5lcl90aG9tc29uX2R0dDc2MXhfbnRzY19yYW5nZXNbXSA9IHsKKwl7IDE2ICogMTQ1LjI1IC8qTUh6Ki8sIDB4MzksIH0sCisJeyAxNiAqIDQxNS4yNSAvKk1IeiovLCAweDNhLCB9LAorCXsgMTYgKiA5OTkuOTkgICAgICAgICwgMHgzYywgfSwKK307CisKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfdGhvbXNvbl9kdHQ3NjF4X3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfTlRTQywKKwkJLnJhbmdlcyA9IHR1bmVyX3Rob21zb25fZHR0NzYxeF9udHNjX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfdGhvbXNvbl9kdHQ3NjF4X250c2NfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9URU5BXzk1MzNfREkgLSBQaGlsaXBzIFBBTCAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9yYW5nZSB0dW5lcl90dW5lcl90ZW5hXzk1MzNfZGlfcGFsX3Jhbmdlc1tdID0geworCXsgMTYgKiAxNjAuMjUgLypNSHoqLywgMHgwMSwgfSwKKwl7IDE2ICogNDY0LjI1IC8qTUh6Ki8sIDB4MDIsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweDA0LCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfdGVuYV85NTMzX2RpX3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfUEFMLAorCQkucmFuZ2VzID0gdHVuZXJfdHVuZXJfdGVuYV85NTMzX2RpX3BhbF9yYW5nZXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX3R1bmVyX3RlbmFfOTUzM19kaV9wYWxfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4OGUsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9QSElMSVBTX0ZNRDEyMTZNRV9NSzMgLSBQaGlsaXBzIFBBTCAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9yYW5nZSB0dW5lcl9waGlsaXBzX2ZtZDEyMTZtZV9tazNfcGFsX3Jhbmdlc1tdID0geworCXsgMTYgKiAxNjAuMDAgLypNSHoqLywgMHg1MSwgfSwKKwl7IDE2ICogNDQyLjAwIC8qTUh6Ki8sIDB4NTIsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweDU0LCB9LAorfTsKKworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl90dW5lcl9waGlsaXBzX2ZtZDEyMTZtZV9tazNfcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9QQUwsCisJCS5yYW5nZXMgPSB0dW5lcl9waGlsaXBzX2ZtZDEyMTZtZV9tazNfcGFsX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfcGhpbGlwc19mbWQxMjE2bWVfbWszX3BhbF9yYW5nZXMpLAorCQkuY29uZmlnID0gMHg4NiwKKwl9LAorfTsKKworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfTEdfVERWU19IMDYyRiAtIElORklORU9OIEFUU0MgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcmFuZ2UgdHVuZXJfdHVhNjAzNF9udHNjX3Jhbmdlc1tdID0geworCXsgMTYgKiAxNjAuMDAgLypNSHoqLywgMHgwMSB9LAorCXsgMTYgKiA0NTUuMDAgLypNSHoqLywgMHgwMiB9LAorCXsgMTYgKiA5OTkuOTkgICAgICAgICwgMHgwNCB9LAorfTsKKworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl90dWE2MDM0X3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfTlRTQywKKwkJLnJhbmdlcyA9IHR1bmVyX3R1YTYwMzRfbnRzY19yYW5nZXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX3R1YTYwMzRfbnRzY19yYW5nZXMpLAorCQkuY29uZmlnID0gMHg4ZSwKKwl9LAorfTsKKworLyogLS0tLS0tLS0tLS0tIFRVTkVSX1lNRUNfVFZGNjZUNV9CX0RGRiAtIFBoaWxpcHMgUEFMIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3JhbmdlIHR1bmVyX3ltZWNfdHZmNjZ0NV9iX2RmZl9wYWxfcmFuZ2VzW10gPSB7CisJeyAxNiAqIDE2MC4yNSAvKk1IeiovLCAweDAxLCB9LAorCXsgMTYgKiA0NjQuMjUgLypNSHoqLywgMHgwMiwgfSwKKwl7IDE2ICogOTk5Ljk5ICAgICAgICAsIDB4MDgsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl95bWVjX3R2ZjY2dDVfYl9kZmZfcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9QQUwsCisJCS5yYW5nZXMgPSB0dW5lcl95bWVjX3R2ZjY2dDVfYl9kZmZfcGFsX3JhbmdlcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfeW1lY190dmY2NnQ1X2JfZGZmX3BhbF9yYW5nZXMpLAorCQkuY29uZmlnID0gMHg4ZSwKKwl9LAorfTsKKworLyogLS0tLS0tLS0tLS0tIFRVTkVSX0xHX05UU0NfVEFMTl9NSU5JIC0gTEdJTk5PVEVLIE5UU0MgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcmFuZ2UgdHVuZXJfbGdfdGFsbl9taW5pX250c2NfcmFuZ2VzW10gPSB7CisJeyAxNiAqIDEzNy4yNSAvKk1IeiovLCAweDAxLCB9LAorCXsgMTYgKiAzNzMuMjUgLypNSHoqLywgMHgwMiwgfSwKKwl7IDE2ICogOTk5Ljk5ICAgICAgICAsIDB4MDgsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl9sZ190YWxuX21pbmlfcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9OVFNDLAorCQkucmFuZ2VzID0gdHVuZXJfbGdfdGFsbl9taW5pX250c2NfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl9sZ190YWxuX21pbmlfbnRzY19yYW5nZXMpLAorCQkuY29uZmlnID0gMHg4ZSwKKwl9LAorfTsKKworLyogLS0tLS0tLS0tLS0tIFRVTkVSX1BISUxJUFNfVEQxMzE2IC0gUGhpbGlwcyBQQUwgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcmFuZ2UgdHVuZXJfcGhpbGlwc190ZDEzMTZfcGFsX3Jhbmdlc1tdID0geworCXsgMTYgKiAxNjAuMDAgLypNSHoqLywgMHhhMSwgfSwKKwl7IDE2ICogNDQyLjAwIC8qTUh6Ki8sIDB4YTIsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweGE0LCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfcGhpbGlwc190ZDEzMTZfcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9QQUwsCisJCS5yYW5nZXMgPSB0dW5lcl9waGlsaXBzX3RkMTMxNl9wYWxfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl9waGlsaXBzX3RkMTMxNl9wYWxfcmFuZ2VzKSwKKwkJLmNvbmZpZyA9IDB4YzgsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9QSElMSVBTX1RVVjEyMzZEIC0gUGhpbGlwcyBBVFNDIC0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR1bmVyX3JhbmdlIHR1bmVyX3R1djEyMzZkX250c2NfcmFuZ2VzW10gPSB7CisJeyAxNiAqIDE1Ny4yNSAvKk1IeiovLCAweDAxLCB9LAorCXsgMTYgKiA0NTQuMDAgLypNSHoqLywgMHgwMiwgfSwKKwl7IDE2ICogOTk5Ljk5ICAgICAgICAsIDB4MDQsIH0sCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcGFyYW1zIHR1bmVyX3R1bmVyX3R1djEyMzZkX3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfTlRTQywKKwkJLnJhbmdlcyA9IHR1bmVyX3R1djEyMzZkX250c2NfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl90dXYxMjM2ZF9udHNjX3JhbmdlcyksCisJCS5jb25maWcgPSAweGNlLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0gVFVORVJfVE5GXzUzMzVNRiAtIFBoaWxpcHMgTlRTQyAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9yYW5nZSB0dW5lcl90bmZfNTMzNW1mX250c2NfcmFuZ2VzW10gPSB7CisJeyAxNiAqIDE1Ny4yNSAvKk1IeiovLCAweDAxLCB9LAorCXsgMTYgKiA0NTQuMDAgLypNSHoqLywgMHgwMiwgfSwKKwl7IDE2ICogOTk5Ljk5ICAgICAgICAsIDB4MDQsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl90bmZfNTMzNW1mX3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfTlRTQywKKwkJLnJhbmdlcyA9IHR1bmVyX3RuZl81MzM1bWZfbnRzY19yYW5nZXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX3RuZl81MzM1bWZfbnRzY19yYW5nZXMpLAorCQkuY29uZmlnID0gMHg4ZSwKKwl9LAorfTsKKworLyogNzAtNzkgKi8KKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9TQU1TVU5HX1RDUE5fMjEyMVAzMEEgLSBTYW1zdW5nIE5UU0MgLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHVuZXJfcmFuZ2UgdHVuZXJfc2Ftc3VuZ190Y3BuXzIxMjFwMzBhX250c2NfcmFuZ2VzW10gPSB7CisJeyAxNiAqIDE3NS43NSAvKk1IeiovLCAweDAxLCB9LAorCXsgMTYgKiA0MTAuMjUgLypNSHoqLywgMHgwMiwgfSwKKwl7IDE2ICogOTk5Ljk5ICAgICAgICAsIDB4MDgsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl9zYW1zdW5nX3RjcG5fMjEyMXAzMGFfcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9OVFNDLAorCQkucmFuZ2VzID0gdHVuZXJfc2Ftc3VuZ190Y3BuXzIxMjFwMzBhX250c2NfcmFuZ2VzLAorCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl9zYW1zdW5nX3RjcG5fMjEyMXAzMGFfbnRzY19yYW5nZXMpLAorCQkuY29uZmlnID0gMHhjZSwKKwl9LAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCB0dW5lcnR5cGUgdHVuZXJzW10gPSB7CisJLyogMC05ICovCisJW1RVTkVSX1RFTUlDX1BBTF0gPSB7IC8qIFRFTUlDIFBBTCAqLworCQkubmFtZSAgID0gIlRlbWljIFBBTCAoNDAwMiBGSDUpIiwKKwkJLnBhcmFtcyA9IHR1bmVyX3RlbWljX3BhbF9wYXJhbXMsCisJfSwKKwlbVFVORVJfUEhJTElQU19QQUxfSV0gPSB7IC8qIFBoaWxpcHMgUEFMX0kgKi8KKwkJLm5hbWUgICA9ICJQaGlsaXBzIFBBTF9JIChGSTEyNDYgYW5kIGNvbXBhdGlibGVzKSIsCisJCS5wYXJhbXMgPSB0dW5lcl9waGlsaXBzX3BhbF9pX3BhcmFtcywKKwl9LAorCVtUVU5FUl9QSElMSVBTX05UU0NdID0geyAvKiBQaGlsaXBzIE5UU0MgKi8KKwkJLm5hbWUgICA9ICJQaGlsaXBzIE5UU0MgKEZJMTIzNixGTTEyMzYgYW5kIGNvbXBhdGlibGVzKSIsCisJCS5wYXJhbXMgPSB0dW5lcl9waGlsaXBzX250c2NfcGFyYW1zLAorCX0sCisJW1RVTkVSX1BISUxJUFNfU0VDQU1dID0geyAvKiBQaGlsaXBzIFNFQ0FNICovCisJCS5uYW1lICAgPSAiUGhpbGlwcyAoU0VDQU0rUEFMX0JHKSAoRkkxMjE2TUYsIEZNMTIxNk1GLCBGUjEyMTZNRikiLAorCQkucGFyYW1zID0gdHVuZXJfcGhpbGlwc19zZWNhbV9wYXJhbXMsCisJfSwKKwlbVFVORVJfQUJTRU5UXSA9IHsgLyogVHVuZXIgQWJzZW50ICovCisJCS5uYW1lICAgPSAiTm9UdW5lciIsCisJfSwKKwlbVFVORVJfUEhJTElQU19QQUxdID0geyAvKiBQaGlsaXBzIFBBTCAqLworCQkubmFtZSAgID0gIlBoaWxpcHMgUEFMX0JHIChGSTEyMTYgYW5kIGNvbXBhdGlibGVzKSIsCisJCS5wYXJhbXMgPSB0dW5lcl9waGlsaXBzX3BhbF9wYXJhbXMsCisJfSwKKwlbVFVORVJfVEVNSUNfTlRTQ10gPSB7IC8qIFRFTUlDIE5UU0MgKi8KKwkJLm5hbWUgICA9ICJUZW1pYyBOVFNDICg0MDMyIEZZNSkiLAorCQkucGFyYW1zID0gdHVuZXJfdGVtaWNfbnRzY19wYXJhbXMsCisJfSwKKwlbVFVORVJfVEVNSUNfUEFMX0ldID0geyAvKiBURU1JQyBQQUxfSSAqLworCQkubmFtZSAgID0gIlRlbWljIFBBTF9JICg0MDYyIEZZNSkiLAorCQkucGFyYW1zID0gdHVuZXJfdGVtaWNfcGFsX2lfcGFyYW1zLAorCX0sCisJW1RVTkVSX1RFTUlDXzQwMzZGWTVfTlRTQ10gPSB7IC8qIFRFTUlDIE5UU0MgKi8KKwkJLm5hbWUgICA9ICJUZW1pYyBOVFNDICg0MDM2IEZZNSkiLAorCQkucGFyYW1zID0gdHVuZXJfdGVtaWNfNDAzNmZ5NV9udHNjX3BhcmFtcywKKwl9LAorCVtUVU5FUl9BTFBTX1RTQkgxX05UU0NdID0geyAvKiBURU1JQyBOVFNDICovCisJCS5uYW1lICAgPSAiQWxwcyBIU0JIMSIsCisJCS5wYXJhbXMgPSB0dW5lcl9hbHBzX3RzYmgxX250c2NfcGFyYW1zLAorCX0sCisKKwkvKiAxMC0xOSAqLworCVtUVU5FUl9BTFBTX1RTQkUxX1BBTF0gPSB7IC8qIFRFTUlDIFBBTCAqLworCQkubmFtZSAgID0gIkFscHMgVFNCRTEiLAorCQkucGFyYW1zID0gdHVuZXJfYWxwc190c2JfMV9wYXJhbXMsCisJfSwKKwlbVFVORVJfQUxQU19UU0JCNV9QQUxfSV0gPSB7IC8qIEFscHMgUEFMX0kgKi8KKwkJLm5hbWUgICA9ICJBbHBzIFRTQkI1IiwKKwkJLnBhcmFtcyA9IHR1bmVyX2FscHNfdHNiYjVfcGFyYW1zLAorCX0sCisJW1RVTkVSX0FMUFNfVFNCRTVfUEFMXSA9IHsgLyogQWxwcyBQQUwgKi8KKwkJLm5hbWUgICA9ICJBbHBzIFRTQkU1IiwKKwkJLnBhcmFtcyA9IHR1bmVyX2FscHNfdHNiZTVfcGFyYW1zLAorCX0sCisJW1RVTkVSX0FMUFNfVFNCQzVfUEFMXSA9IHsgLyogQWxwcyBQQUwgKi8KKwkJLm5hbWUgICA9ICJBbHBzIFRTQkM1IiwKKwkJLnBhcmFtcyA9IHR1bmVyX2FscHNfdHNiYzVfcGFyYW1zLAorCX0sCisJW1RVTkVSX1RFTUlDXzQwMDZGSDVfUEFMXSA9IHsgLyogVEVNSUMgUEFMICovCisJCS5uYW1lICAgPSAiVGVtaWMgUEFMX0JHICg0MDA2Rkg1KSIsCisJCS5wYXJhbXMgPSB0dW5lcl90ZW1pY180MDA2Zmg1X3BhcmFtcywKKwl9LAorCVtUVU5FUl9BTFBTX1RTSEM2X05UU0NdID0geyAvKiBBbHBzIE5UU0MgKi8KKwkJLm5hbWUgICA9ICJBbHBzIFRTQ0g2IiwKKwkJLnBhcmFtcyA9IHR1bmVyX2FscHNfdHNoYzZfcGFyYW1zLAorCX0sCisJW1RVTkVSX1RFTUlDX1BBTF9ES10gPSB7IC8qIFRFTUlDIFBBTCAqLworCQkubmFtZSAgID0gIlRlbWljIFBBTF9ESyAoNDAxNiBGWTUpIiwKKwkJLnBhcmFtcyA9IHR1bmVyX3RlbWljX3BhbF9ka19wYXJhbXMsCisJfSwKKwlbVFVORVJfUEhJTElQU19OVFNDX01dID0geyAvKiBQaGlsaXBzIE5UU0MgKi8KKwkJLm5hbWUgICA9ICJQaGlsaXBzIE5UU0NfTSAoTUsyKSIsCisJCS5wYXJhbXMgPSB0dW5lcl9waGlsaXBzX250c2NfbV9wYXJhbXMsCisJfSwKKwlbVFVORVJfVEVNSUNfNDA2NkZZNV9QQUxfSV0gPSB7IC8qIFRFTUlDIFBBTF9JICovCisJCS5uYW1lICAgPSAiVGVtaWMgUEFMX0kgKDQwNjYgRlk1KSIsCisJCS5wYXJhbXMgPSB0dW5lcl90ZW1pY180MDY2Znk1X3BhbF9pX3BhcmFtcywKKwl9LAorCVtUVU5FUl9URU1JQ180MDA2Rk41X01VTFRJX1BBTF0gPSB7IC8qIFRFTUlDIFBBTCAqLworCQkubmFtZSAgID0gIlRlbWljIFBBTCogYXV0byAoNDAwNiBGTjUpIiwKKwkJLnBhcmFtcyA9IHR1bmVyX3RlbWljXzQwMDZmbjVfbXVsdGlfcGFyYW1zLAorCX0sCisKKwkvKiAyMC0yOSAqLworCVtUVU5FUl9URU1JQ180MDA5RlI1X1BBTF0gPSB7IC8qIFRFTUlDIFBBTCAqLworCQkubmFtZSAgID0gIlRlbWljIFBBTF9CRyAoNDAwOSBGUjUpIG9yIFBBTF9JICg0MDY5IEZSNSkiLAorCQkucGFyYW1zID0gdHVuZXJfdGVtaWNfNDAwOWZfNV9wYXJhbXMsCisJfSwKKwlbVFVORVJfVEVNSUNfNDAzOUZSNV9OVFNDXSA9IHsgLyogVEVNSUMgTlRTQyAqLworCQkubmFtZSAgID0gIlRlbWljIE5UU0MgKDQwMzkgRlI1KSIsCisJCS5wYXJhbXMgPSB0dW5lcl90ZW1pY180MDM5ZnI1X3BhcmFtcywKKwl9LAorCVtUVU5FUl9URU1JQ180MDQ2Rk01XSA9IHsgLyogVEVNSUMgUEFMICovCisJCS5uYW1lICAgPSAiVGVtaWMgUEFML1NFQ0FNIG11bHRpICg0MDQ2IEZNNSkiLAorCQkucGFyYW1zID0gdHVuZXJfdGVtaWNfNDA0NmZtNV9wYXJhbXMsCisJfSwKKwlbVFVORVJfUEhJTElQU19QQUxfREtdID0geyAvKiBQaGlsaXBzIFBBTCAqLworCQkubmFtZSAgID0gIlBoaWxpcHMgUEFMX0RLIChGSTEyNTYgYW5kIGNvbXBhdGlibGVzKSIsCisJCS5wYXJhbXMgPSB0dW5lcl9waGlsaXBzX3BhbF9ka19wYXJhbXMsCisJfSwKKwlbVFVORVJfUEhJTElQU19GUTEyMTZNRV0gPSB7IC8qIFBoaWxpcHMgUEFMICovCisJCS5uYW1lICAgPSAiUGhpbGlwcyBQQUwvU0VDQU0gbXVsdGkgKEZRMTIxNk1FKSIsCisJCS5wYXJhbXMgPSB0dW5lcl9waGlsaXBzX2ZxMTIxNm1lX3BhcmFtcywKKwl9LAorCVtUVU5FUl9MR19QQUxfSV9GTV0gPSB7IC8qIExHSU5OT1RFSyBQQUxfSSAqLworCQkubmFtZSAgID0gIkxHIFBBTF9JK0ZNIChUQVBDLUkwMDFEKSIsCisJCS5wYXJhbXMgPSB0dW5lcl9sZ19wYWxfaV9mbV9wYXJhbXMsCisJfSwKKwlbVFVORVJfTEdfUEFMX0ldID0geyAvKiBMR0lOTk9URUsgUEFMX0kgKi8KKwkJLm5hbWUgICA9ICJMRyBQQUxfSSAoVEFQQy1JNzAxRCkiLAorCQkucGFyYW1zID0gdHVuZXJfbGdfcGFsX2lfcGFyYW1zLAorCX0sCisJW1RVTkVSX0xHX05UU0NfRk1dID0geyAvKiBMR0lOTk9URUsgTlRTQyAqLworCQkubmFtZSAgID0gIkxHIE5UU0MrRk0gKFRQSThOU1IwMUYpIiwKKwkJLnBhcmFtcyA9IHR1bmVyX2xnX250c2NfZm1fcGFyYW1zLAorCX0sCisJW1RVTkVSX0xHX1BBTF9GTV0gPSB7IC8qIExHSU5OT1RFSyBQQUwgKi8KKwkJLm5hbWUgICA9ICJMRyBQQUxfQkcrRk0gKFRQSThQU0IwMUQpIiwKKwkJLnBhcmFtcyA9IHR1bmVyX2xnX3BhbF9mbV9wYXJhbXMsCisJfSwKKwlbVFVORVJfTEdfUEFMXSA9IHsgLyogTEdJTk5PVEVLIFBBTCAqLworCQkubmFtZSAgID0gIkxHIFBBTF9CRyAoVFBJOFBTQjExRCkiLAorCQkucGFyYW1zID0gdHVuZXJfbGdfcGFsX3BhcmFtcywKKwl9LAorCisJLyogMzAtMzkgKi8KKwlbVFVORVJfVEVNSUNfNDAwOUZONV9NVUxUSV9QQUxfRk1dID0geyAvKiBURU1JQyBQQUwgKi8KKwkJLm5hbWUgICA9ICJUZW1pYyBQQUwqIGF1dG8gKyBGTSAoNDAwOSBGTjUpIiwKKwkJLnBhcmFtcyA9IHR1bmVyX3RlbWljXzQwMDlfZm41X211bHRpX3BhbF9mbV9wYXJhbXMsCisJfSwKKwlbVFVORVJfU0hBUlBfMlU1SkY1NTQwX05UU0NdID0geyAvKiBTSEFSUCBOVFNDICovCisJCS5uYW1lICAgPSAiU0hBUlAgTlRTQ19KUCAoMlU1SkY1NTQwKSIsCisJCS5wYXJhbXMgPSB0dW5lcl9zaGFycF8ydTVqZjU1NDBfcGFyYW1zLAorCX0sCisJW1RVTkVSX1NhbXN1bmdfUEFMX1RDUE05MDkxUEQyN10gPSB7IC8qIFNhbXN1bmcgUEFMICovCisJCS5uYW1lICAgPSAiU2Ftc3VuZyBQQUwgVENQTTkwOTFQRDI3IiwKKwkJLnBhcmFtcyA9IHR1bmVyX3NhbXN1bmdfcGFsX3RjcG05MDkxcGQyN19wYXJhbXMsCisJfSwKKwlbVFVORVJfTVQyMDMyXSA9IHsgLyogTWljcm90dW5lIFBBTHxOVFNDICovCisJCS5uYW1lICAgPSAiTVQyMHh4IHVuaXZlcnNhbCIsCisJCS8qIHNlZSBtdDIweHguYyBmb3IgZGV0YWlscyAqLyB9LAorCVtUVU5FUl9URU1JQ180MTA2Rkg1XSA9IHsgLyogVEVNSUMgUEFMICovCisJCS5uYW1lICAgPSAiVGVtaWMgUEFMX0JHICg0MTA2IEZINSkiLAorCQkucGFyYW1zID0gdHVuZXJfdGVtaWNfNDEwNmZoNV9wYXJhbXMsCisJfSwKKwlbVFVORVJfVEVNSUNfNDAxMkZZNV0gPSB7IC8qIFRFTUlDIFBBTCAqLworCQkubmFtZSAgID0gIlRlbWljIFBBTF9ESy9TRUNBTV9MICg0MDEyIEZZNSkiLAorCQkucGFyYW1zID0gdHVuZXJfdGVtaWNfNDAxMmZ5NV9wYXJhbXMsCisJfSwKKwlbVFVORVJfVEVNSUNfNDEzNkZZNV0gPSB7IC8qIFRFTUlDIE5UU0MgKi8KKwkJLm5hbWUgICA9ICJUZW1pYyBOVFNDICg0MTM2IEZZNSkiLAorCQkucGFyYW1zID0gdHVuZXJfdGVtaWNfNDEzNl9meTVfcGFyYW1zLAorCX0sCisJW1RVTkVSX0xHX1BBTF9ORVdfVEFQQ10gPSB7IC8qIExHSU5OT1RFSyBQQUwgKi8KKwkJLm5hbWUgICA9ICJMRyBQQUwgKG5ld2VyIFRBUEMgc2VyaWVzKSIsCisJCS5wYXJhbXMgPSB0dW5lcl9sZ19wYWxfbmV3X3RhcGNfcGFyYW1zLAorCX0sCisJW1RVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszXSA9IHsgLyogUGhpbGlwcyBQQUwgKi8KKwkJLm5hbWUgICA9ICJQaGlsaXBzIFBBTC9TRUNBTSBtdWx0aSAoRk0xMjE2TUUgTUszKSIsCisJCS5wYXJhbXMgPSB0dW5lcl9mbTEyMTZtZV9tazNfcGFyYW1zLAorCX0sCisJW1RVTkVSX0xHX05UU0NfTkVXX1RBUENdID0geyAvKiBMR0lOTk9URUsgTlRTQyAqLworCQkubmFtZSAgID0gIkxHIE5UU0MgKG5ld2VyIFRBUEMgc2VyaWVzKSIsCisJCS5wYXJhbXMgPSB0dW5lcl9sZ19udHNjX25ld190YXBjX3BhcmFtcywKKwl9LAorCisJLyogNDAtNDkgKi8KKwlbVFVORVJfSElUQUNISV9OVFNDXSA9IHsgLyogSElUQUNISSBOVFNDICovCisJCS5uYW1lICAgPSAiSElUQUNISSBWNy1KMTgwQVQiLAorCQkucGFyYW1zID0gdHVuZXJfaGl0YWNoaV9udHNjX3BhcmFtcywKKwl9LAorCVtUVU5FUl9QSElMSVBTX1BBTF9NS10gPSB7IC8qIFBoaWxpcHMgUEFMICovCisJCS5uYW1lICAgPSAiUGhpbGlwcyBQQUxfTUsgKEZJMTIxNiBNSykiLAorCQkucGFyYW1zID0gdHVuZXJfcGhpbGlwc19wYWxfbWtfcGFyYW1zLAorCX0sCisJW1RVTkVSX1BISUxJUFNfQVRTQ10gPSB7IC8qIFBoaWxpcHMgQVRTQyAqLworCQkubmFtZSAgID0gIlBoaWxpcHMgMTIzNkQgQVRTQy9OVFNDIGR1YWwgaW4iLAorCQkucGFyYW1zID0gdHVuZXJfcGhpbGlwc19hdHNjX3BhcmFtcywKKwl9LAorCVtUVU5FUl9QSElMSVBTX0ZNMTIzNl9NSzNdID0geyAvKiBQaGlsaXBzIE5UU0MgKi8KKwkJLm5hbWUgICA9ICJQaGlsaXBzIE5UU0MgTUszIChGTTEyMzZNSzMgb3IgRk0xMjM2L0YpIiwKKwkJLnBhcmFtcyA9IHR1bmVyX2ZtMTIzNl9tazNfcGFyYW1zLAorCX0sCisJW1RVTkVSX1BISUxJUFNfNElOMV0gPSB7IC8qIFBoaWxpcHMgTlRTQyAqLworCQkubmFtZSAgID0gIlBoaWxpcHMgNCBpbiAxIChBVEkgVFYgV29uZGVyIFByby9Db25leGFudCkiLAorCQkucGFyYW1zID0gdHVuZXJfcGhpbGlwc180aW4xX3BhcmFtcywKKwl9LAorCVtUVU5FUl9NSUNST1RVTkVfNDA0OUZNNV0gPSB7IC8qIE1pY3JvdHVuZSBQQUwgKi8KKwkJLm5hbWUgICA9ICJNaWNyb3R1bmUgNDA0OSBGTTUiLAorCQkucGFyYW1zID0gdHVuZXJfbWljcm90dW5lXzQwNDlfZm01X3BhcmFtcywKKwl9LAorCVtUVU5FUl9QQU5BU09OSUNfVlAyN10gPSB7IC8qIFBhbmFzb25pYyBOVFNDICovCisJCS5uYW1lICAgPSAiUGFuYXNvbmljIFZQMjdzL0VOR0U0MzI0RCIsCisJCS5wYXJhbXMgPSB0dW5lcl9wYW5hc29uaWNfdnAyN19wYXJhbXMsCisJfSwKKwlbVFVORVJfTEdfTlRTQ19UQVBFXSA9IHsgLyogTEdJTk5PVEVLIE5UU0MgKi8KKwkJLm5hbWUgICA9ICJMRyBOVFNDIChUQVBFIHNlcmllcykiLAorCQkucGFyYW1zID0gdHVuZXJfbGdfbnRzY190YXBlX3BhcmFtcywKKwl9LAorCVtUVU5FUl9UTkZfODgzMUJHRkZdID0geyAvKiBQaGlsaXBzIFBBTCAqLworCQkubmFtZSAgID0gIlRlbm5hIFRORiA4ODMxIEJHRkYpIiwKKwkJLnBhcmFtcyA9IHR1bmVyX3RuZl84ODMxYmdmZl9wYXJhbXMsCisJfSwKKwlbVFVORVJfTUlDUk9UVU5FXzQwNDJGSTVdID0geyAvKiBNaWNyb3R1bmUgTlRTQyAqLworCQkubmFtZSAgID0gIk1pY3JvdHVuZSA0MDQyIEZJNSBBVFNDL05UU0MgZHVhbCBpbiIsCisJCS5wYXJhbXMgPSB0dW5lcl9taWNyb3R1bmVfNDA0MmZpNV9wYXJhbXMsCisJfSwKKworCS8qIDUwLTU5ICovCisJW1RVTkVSX1RDTF8yMDAyTl0gPSB7IC8qIFRDTCBOVFNDICovCisJCS5uYW1lICAgPSAiVENMIDIwMDJOIiwKKwkJLnBhcmFtcyA9IHR1bmVyX3RjbF8yMDAybl9wYXJhbXMsCisJfSwKKwlbVFVORVJfUEhJTElQU19GTTEyNTZfSUgzXSA9IHsgLyogUGhpbGlwcyBQQUwgKi8KKwkJLm5hbWUgICA9ICJQaGlsaXBzIFBBTC9TRUNBTV9EIChGTSAxMjU2IEktSDMpIiwKKwkJLnBhcmFtcyA9IHR1bmVyX3BoaWxpcHNfZm0xMjU2X2loM19wYXJhbXMsCisJfSwKKwlbVFVORVJfVEhPTVNPTl9EVFQ3NjEwXSA9IHsgLyogVEhPTVNPTiBBVFNDICovCisJCS5uYW1lICAgPSAiVGhvbXNvbiBEVFQgNzYxMCAoQVRTQy9OVFNDKSIsCisJCS5wYXJhbXMgPSB0dW5lcl90aG9tc29uX2R0dDc2MTBfcGFyYW1zLAorCX0sCisJW1RVTkVSX1BISUxJUFNfRlExMjg2XSA9IHsgLyogUGhpbGlwcyBOVFNDICovCisJCS5uYW1lICAgPSAiUGhpbGlwcyBGUTEyODYiLAorCQkucGFyYW1zID0gdHVuZXJfcGhpbGlwc19mcTEyODZfcGFyYW1zLAorCX0sCisJW1RVTkVSX1BISUxJUFNfVERBODI5MF0gPSB7IC8qIFBoaWxpcHMgUEFMfE5UU0MgKi8KKwkJLm5hbWUgICA9ICJ0ZGE4MjkwKzc1IiwKKwkJLyogc2VlIHRkYTgyOTAuYyBmb3IgZGV0YWlscyAqLyB9LAorCVtUVU5FUl9UQ0xfMjAwMk1CXSA9IHsgLyogVENMIFBBTCAqLworCQkubmFtZSAgID0gIlRDTCAyMDAyTUIiLAorCQkucGFyYW1zID0gdHVuZXJfdGNsXzIwMDJtYl9wYXJhbXMsCisJfSwKKwlbVFVORVJfUEhJTElQU19GUTEyMTZBTUVfTUs0XSA9IHsgLyogUGhpbGlwcyBQQUwgKi8KKwkJLm5hbWUgICA9ICJQaGlsaXBzIFBBTC9TRUNBTSBtdWx0aSAoRlExMjE2QU1FIE1LNCkiLAorCQkucGFyYW1zID0gdHVuZXJfcGhpbGlwc19mcTEyMTZhbWVfbWs0X3BhcmFtcywKKwl9LAorCVtUVU5FUl9QSElMSVBTX0ZRMTIzNkFfTUs0XSA9IHsgLyogUGhpbGlwcyBOVFNDICovCisJCS5uYW1lICAgPSAiUGhpbGlwcyBGUTEyMzZBIE1LNCIsCisJCS5wYXJhbXMgPSB0dW5lcl9waGlsaXBzX2ZxMTIzNmFfbWs0X3BhcmFtcywKKwl9LAorCVtUVU5FUl9ZTUVDX1RWRl84NTMxTUZdID0geyAvKiBQaGlsaXBzIE5UU0MgKi8KKwkJLm5hbWUgICA9ICJZbWVjIFRWaXNpb24gVFZGLTg1MzFNRi84ODMxTUYvODczMU1GIiwKKwkJLnBhcmFtcyA9IHR1bmVyX3ltZWNfdHZmXzg1MzFtZl9wYXJhbXMsCisJfSwKKwlbVFVORVJfWU1FQ19UVkZfNTUzM01GXSA9IHsgLyogUGhpbGlwcyBOVFNDICovCisJCS5uYW1lICAgPSAiWW1lYyBUVmlzaW9uIFRWRi01NTMzTUYiLAorCQkucGFyYW1zID0gdHVuZXJfeW1lY190dmZfNTUzM21mX3BhcmFtcywKKwl9LAorCisJLyogNjAtNjkgKi8KKwlbVFVORVJfVEhPTVNPTl9EVFQ3NjFYXSA9IHsgLyogVEhPTVNPTiBBVFNDICovCisJCS8qIERUVCA3NjExIDc2MTFBIDc2MTIgNzYxMyA3NjEzQSA3NjE0IDc2MTUgNzYxNUEgKi8KKwkJLm5hbWUgICA9ICJUaG9tc29uIERUVCA3NjFYIChBVFNDL05UU0MpIiwKKwkJLnBhcmFtcyA9IHR1bmVyX3Rob21zb25fZHR0NzYxeF9wYXJhbXMsCisJfSwKKwlbVFVORVJfVEVOQV85NTMzX0RJXSA9IHsgLyogUGhpbGlwcyBQQUwgKi8KKwkJLm5hbWUgICA9ICJUZW5hIFRORjk1MzMtRC9JRi9UTkY5NTMzLUIvREYiLAorCQkucGFyYW1zID0gdHVuZXJfdGVuYV85NTMzX2RpX3BhcmFtcywKKwl9LAorCVtUVU5FUl9URUE1NzY3XSA9IHsgLyogUGhpbGlwcyBSQURJTyAqLworCQkubmFtZSAgID0gIlBoaWxpcHMgVEVBNTc2N0hOIEZNIFJhZGlvIiwKKwkJLyogc2VlIHRlYTU3NjcuYyBmb3IgZGV0YWlscyAqLworCX0sCisJW1RVTkVSX1BISUxJUFNfRk1EMTIxNk1FX01LM10gPSB7IC8qIFBoaWxpcHMgUEFMICovCisJCS5uYW1lICAgPSAiUGhpbGlwcyBGTUQxMjE2TUUgTUszIEh5YnJpZCBUdW5lciIsCisJCS5wYXJhbXMgPSB0dW5lcl90dW5lcl9waGlsaXBzX2ZtZDEyMTZtZV9tazNfcGFyYW1zLAorCX0sCisJW1RVTkVSX0xHX1REVlNfSDA2MkZdID0geyAvKiBMR0lOTk9URUsgQVRTQyAqLworCQkubmFtZSAgID0gIkxHIFREVlMtSDA2MkYvVFVBNjAzNCIsCisJCS5wYXJhbXMgPSB0dW5lcl90dWE2MDM0X3BhcmFtcywKKwl9LAorCVtUVU5FUl9ZTUVDX1RWRjY2VDVfQl9ERkZdID0geyAvKiBQaGlsaXBzIFBBTCAqLworCQkubmFtZSAgID0gIlltZWMgVFZGNjZUNS1CL0RGRiIsCisJCS5wYXJhbXMgPSB0dW5lcl95bWVjX3R2ZjY2dDVfYl9kZmZfcGFyYW1zLAorCX0sCisJW1RVTkVSX0xHX05UU0NfVEFMTl9NSU5JXSA9IHsgLyogTEdJTk5PVEVLIE5UU0MgKi8KKwkJLm5hbWUgICA9ICJMRyBOVFNDIChUQUxOIG1pbmkgc2VyaWVzKSIsCisJCS5wYXJhbXMgPSB0dW5lcl9sZ190YWxuX21pbmlfcGFyYW1zLAorCX0sCisJW1RVTkVSX1BISUxJUFNfVEQxMzE2XSA9IHsgLyogUGhpbGlwcyBQQUwgKi8KKwkJLm5hbWUgICA9ICJQaGlsaXBzIFREMTMxNiBIeWJyaWQgVHVuZXIiLAorCQkucGFyYW1zID0gdHVuZXJfcGhpbGlwc190ZDEzMTZfcGFyYW1zLAorCX0sCisJW1RVTkVSX1BISUxJUFNfVFVWMTIzNkRdID0geyAvKiBQaGlsaXBzIEFUU0MgKi8KKwkJLm5hbWUgICA9ICJQaGlsaXBzIFRVVjEyMzZEIEFUU0MvTlRTQyBkdWFsIGluIiwKKwkJLnBhcmFtcyA9IHR1bmVyX3R1bmVyX3R1djEyMzZkX3BhcmFtcywKKwl9LAorCVtUVU5FUl9UTkZfNTMzNU1GXSA9IHsgLyogUGhpbGlwcyBOVFNDICovCisJCS5uYW1lICAgPSAiVGVuYSBUTkYgNTMzNSBNRiIsCisJCS5wYXJhbXMgPSB0dW5lcl90bmZfNTMzNW1mX3BhcmFtcywKKwl9LAorCisJLyogNzAtNzkgKi8KKwlbVFVORVJfU0FNU1VOR19UQ1BOXzIxMjFQMzBBXSA9IHsgLyogU2Ftc3VuZyBOVFNDICovCisJCS5uYW1lICAgPSAiU2Ftc3VuZyBUQ1BOIDIxMjFQMzBBIiwKKwkJLnBhcmFtcyA9IHR1bmVyX3NhbXN1bmdfdGNwbl8yMTIxcDMwYV9wYXJhbXMsCisJfSwKK307CisKK3Vuc2lnbmVkIGNvbnN0IGludCB0dW5lcl9jb3VudCA9IEFSUkFZX1NJWkUodHVuZXJzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKaW5kZXggMDI5MmM1YS4uNmQwM2I5YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KIAogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvY2hpcC5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAKICNpbmNsdWRlICJ0dmF1ZGlvLmgiCiAKQEAgLTQ2LDE3ICs0Nyw2IEBACiAKICNkZWZpbmUgVU5TRVQgICAgKC0xVSkKIAotI2RlZmluZSB0dmF1ZGlvX2luZm8oZm10LCBhcmcuLi4pIGRvIHtcCi0JcHJpbnRrKEtFUk5fSU5GTyAidHZhdWRpbyAlZC0lMDR4OiAiIGZtdCwgXAotCQkJY2hpcC0+Yy5hZGFwdGVyLT5uciwgY2hpcC0+Yy5hZGRyICwgIyNhcmcpOyB9IHdoaWxlICgwKQotI2RlZmluZSB0dmF1ZGlvX3dhcm4oZm10LCBhcmcuLi4pIGRvIHtcCi0JcHJpbnRrKEtFUk5fV0FSTklORyAidHZhdWRpbyAlZC0lMDR4OiAiIGZtdCwgXAotCQkJY2hpcC0+Yy5hZGFwdGVyLT5uciwgY2hpcC0+Yy5hZGRyICwgIyNhcmcpOyB9IHdoaWxlICgwKQotI2RlZmluZSB0dmF1ZGlvX2RiZyhmbXQsIGFyZy4uLikgZG8ge1wKLQlpZiAoZGVidWcpIFwKLQkJcHJpbnRrKEtFUk5fSU5GTyAidHZhdWRpbyAlZC0lMDR4OiAiIGZtdCwgXAotCQkJY2hpcC0+Yy5hZGFwdGVyLT5uciwgY2hpcC0+Yy5hZGRyICwgIyNhcmcpOyB9IHdoaWxlICgwKQotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBvdXIgc3RydWN0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKQEAgLTEzMSw3ICsxMjEsNyBAQAogCS8qIGN1cnJlbnQgc2V0dGluZ3MgKi8KIAlfX3UxNiBsZWZ0LHJpZ2h0LHRyZWJsZSxiYXNzLG1vZGU7CiAJaW50IHByZXZtb2RlOwotCWludCBub3JtOworCWludCByYWRpbzsKIAogCS8qIHRocmVhZCAqLwogCXBpZF90ICAgICAgICAgICAgICAgIHRwaWQ7CkBAIC0xNDIsOCArMTMyLDYgQEAKIAlpbnQgICAgICAgICAgICAgICAgICB3YXRjaF9zdGVyZW87CiB9OwogCi0jZGVmaW5lIFZJREVPX01PREVfUkFESU8gMTYgICAgICAvKiBub3JtIG1hZ2ljIGZvciByYWRpbyBtb2RlICovCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGkyYyBhZGRyZXNzZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApAQCAtMTcxLDIzICsxNTksMjMgQEAKIAl1bnNpZ25lZCBjaGFyIGJ1ZmZlclsyXTsKIAogCWlmICgtMSA9PSBzdWJhZGRyKSB7Ci0JCXR2YXVkaW9fZGJnKCIlczogY2hpcF93cml0ZTogMHgleFxuIiwKKwkJdjRsX2RiZygxLCBkZWJ1ZywgJmNoaXAtPmMsICIlczogY2hpcF93cml0ZTogMHgleFxuIiwKIAkJCWNoaXAtPmMubmFtZSwgdmFsKTsKIAkJY2hpcC0+c2hhZG93LmJ5dGVzWzFdID0gdmFsOwogCQlidWZmZXJbMF0gPSB2YWw7CiAJCWlmICgxICE9IGkyY19tYXN0ZXJfc2VuZCgmY2hpcC0+YyxidWZmZXIsMSkpIHsKLQkJCXR2YXVkaW9fd2FybigiJXM6IEkvTyBlcnJvciAod3JpdGUgMHgleClcbiIsCisJCQl2NGxfd2FybigmY2hpcC0+YywgIiVzOiBJL08gZXJyb3IgKHdyaXRlIDB4JXgpXG4iLAogCQkJCWNoaXAtPmMubmFtZSwgdmFsKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCX0gZWxzZSB7Ci0JCXR2YXVkaW9fZGJnKCIlczogY2hpcF93cml0ZTogcmVnJWQ9MHgleFxuIiwKKwkJdjRsX2RiZygxLCBkZWJ1ZywgJmNoaXAtPmMsICIlczogY2hpcF93cml0ZTogcmVnJWQ9MHgleFxuIiwKIAkJCWNoaXAtPmMubmFtZSwgc3ViYWRkciwgdmFsKTsKIAkJY2hpcC0+c2hhZG93LmJ5dGVzW3N1YmFkZHIrMV0gPSB2YWw7CiAJCWJ1ZmZlclswXSA9IHN1YmFkZHI7CiAJCWJ1ZmZlclsxXSA9IHZhbDsKIAkJaWYgKDIgIT0gaTJjX21hc3Rlcl9zZW5kKCZjaGlwLT5jLGJ1ZmZlciwyKSkgewotCQkJdHZhdWRpb193YXJuKCIlczogSS9PIGVycm9yICh3cml0ZSByZWclZD0weCV4KVxuIiwKKwkJCXY0bF93YXJuKCZjaGlwLT5jLCAiJXM6IEkvTyBlcnJvciAod3JpdGUgcmVnJWQ9MHgleClcbiIsCiAJCQljaGlwLT5jLm5hbWUsIHN1YmFkZHIsIHZhbCk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KQEAgLTIxMiwxMSArMjAwLDExIEBACiAJdW5zaWduZWQgY2hhciBidWZmZXI7CiAKIAlpZiAoMSAhPSBpMmNfbWFzdGVyX3JlY3YoJmNoaXAtPmMsJmJ1ZmZlciwxKSkgewotCQl0dmF1ZGlvX3dhcm4oIiVzOiBJL08gZXJyb3IgKHJlYWQpXG4iLAorCQl2NGxfd2FybigmY2hpcC0+YywgIiVzOiBJL08gZXJyb3IgKHJlYWQpXG4iLAogCQljaGlwLT5jLm5hbWUpOwogCQlyZXR1cm4gLTE7CiAJfQotCXR2YXVkaW9fZGJnKCIlczogY2hpcF9yZWFkOiAweCV4XG4iLGNoaXAtPmMubmFtZSwgYnVmZmVyKTsKKwl2NGxfZGJnKDEsIGRlYnVnLCAmY2hpcC0+YywgIiVzOiBjaGlwX3JlYWQ6IDB4JXhcbiIsY2hpcC0+Yy5uYW1lLCBidWZmZXIpOwogCXJldHVybiBidWZmZXI7CiB9CiAKQEAgLTIzMSwxMCArMjE5LDEwIEBACiAJd3JpdGVbMF0gPSBzdWJhZGRyOwogCiAJaWYgKDIgIT0gaTJjX3RyYW5zZmVyKGNoaXAtPmMuYWRhcHRlcixtc2dzLDIpKSB7Ci0JCXR2YXVkaW9fd2FybigiJXM6IEkvTyBlcnJvciAocmVhZDIpXG4iLCBjaGlwLT5jLm5hbWUpOworCQl2NGxfd2FybigmY2hpcC0+YywgIiVzOiBJL08gZXJyb3IgKHJlYWQyKVxuIiwgY2hpcC0+Yy5uYW1lKTsKIAkJcmV0dXJuIC0xOwogCX0KLQl0dmF1ZGlvX2RiZygiJXM6IGNoaXBfcmVhZDI6IHJlZyVkPTB4JXhcbiIsCisJdjRsX2RiZygxLCBkZWJ1ZywgJmNoaXAtPmMsICIlczogY2hpcF9yZWFkMjogcmVnJWQ9MHgleFxuIiwKIAkJY2hpcC0+Yy5uYW1lLCBzdWJhZGRyLHJlYWRbMF0pOwogCXJldHVybiByZWFkWzBdOwogfQpAQCAtMjQ3LDcgKzIzNSw3IEBACiAJCXJldHVybiAwOwogCiAJLyogdXBkYXRlIG91ciBzaGFkb3cgcmVnaXN0ZXIgc2V0OyBwcmludCBieXRlcyBpZiAoZGVidWcgPiAwKSAqLwotCXR2YXVkaW9fZGJnKCIlczogY2hpcF9jbWQoJXMpOiByZWc9JWQsIGRhdGE6IiwKKwl2NGxfZGJnKDEsIGRlYnVnLCAmY2hpcC0+YywgIiVzOiBjaGlwX2NtZCglcyk6IHJlZz0lZCwgZGF0YToiLAogCQljaGlwLT5jLm5hbWUsIG5hbWUsY21kLT5ieXRlc1swXSk7CiAJZm9yIChpID0gMTsgaSA8IGNtZC0+Y291bnQ7IGkrKykgewogCQlpZiAoZGVidWcpCkBAIC0yNTksNyArMjQ3LDcgQEAKIAogCS8qIHNlbmQgZGF0YSB0byB0aGUgY2hpcCAqLwogCWlmIChjbWQtPmNvdW50ICE9IGkyY19tYXN0ZXJfc2VuZCgmY2hpcC0+YyxjbWQtPmJ5dGVzLGNtZC0+Y291bnQpKSB7Ci0JCXR2YXVkaW9fd2FybigiJXM6IEkvTyBlcnJvciAoJXMpXG4iLCBjaGlwLT5jLm5hbWUsIG5hbWUpOworCQl2NGxfd2FybigmY2hpcC0+YywgIiVzOiBJL08gZXJyb3IgKCVzKVxuIiwgY2hpcC0+Yy5uYW1lLCBuYW1lKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlyZXR1cm4gMDsKQEAgLTI4Niw3ICsyNzQsNyBAQAogCiAJZGFlbW9uaXplKCIlcyIsIGNoaXAtPmMubmFtZSk7CiAJYWxsb3dfc2lnbmFsKFNJR1RFUk0pOwotCXR2YXVkaW9fZGJnKCIlczogdGhyZWFkIHN0YXJ0ZWRcbiIsIGNoaXAtPmMubmFtZSk7CisJdjRsX2RiZygxLCBkZWJ1ZywgJmNoaXAtPmMsICIlczogdGhyZWFkIHN0YXJ0ZWRcbiIsIGNoaXAtPmMubmFtZSk7CiAKIAlmb3IgKDs7KSB7CiAJCWFkZF93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOwpAQCAtMjk4LDEwICsyODYsMTAgQEAKIAkJdHJ5X3RvX2ZyZWV6ZSgpOwogCQlpZiAoY2hpcC0+ZG9uZSB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCWJyZWFrOwotCQl0dmF1ZGlvX2RiZygiJXM6IHRocmVhZCB3YWtldXBcbiIsIGNoaXAtPmMubmFtZSk7CisJCXY0bF9kYmcoMSwgZGVidWcsICZjaGlwLT5jLCAiJXM6IHRocmVhZCB3YWtldXBcbiIsIGNoaXAtPmMubmFtZSk7CiAKIAkJLyogZG9uJ3QgZG8gYW55dGhpbmcgZm9yIHJhZGlvIG9yIGlmIG1vZGUgIT0gYXV0byAqLwotCQlpZiAoY2hpcC0+bm9ybSA9PSBWSURFT19NT0RFX1JBRElPIHx8IGNoaXAtPm1vZGUgIT0gMCkKKwkJaWYgKGNoaXAtPnJhZGlvIHx8IGNoaXAtPm1vZGUgIT0gMCkKIAkJCWNvbnRpbnVlOwogCiAJCS8qIGhhdmUgYSBsb29rIHdoYXQncyBnb2luZyBvbiAqLwpAQCAtMzExLDcgKzI5OSw3IEBACiAJCW1vZF90aW1lcigmY2hpcC0+d3QsIGppZmZpZXMrMipIWik7CiAJfQogCi0JdHZhdWRpb19kYmcoIiVzOiB0aHJlYWQgZXhpdGluZ1xuIiwgY2hpcC0+Yy5uYW1lKTsKKwl2NGxfZGJnKDEsIGRlYnVnLCAmY2hpcC0+YywgIiVzOiB0aHJlYWQgZXhpdGluZ1xuIiwgY2hpcC0+Yy5uYW1lKTsKIAljb21wbGV0ZV9hbmRfZXhpdCgmY2hpcC0+dGV4aXQsIDApOwogCXJldHVybiAwOwogfQpAQCAtMzI0LDcgKzMxMiw3IEBACiAJaWYgKG1vZGUgPT0gY2hpcC0+cHJldm1vZGUpCiAJcmV0dXJuOwogCi0JdHZhdWRpb19kYmcoIiVzOiB0aHJlYWQgY2hlY2ttb2RlXG4iLCBjaGlwLT5jLm5hbWUpOworCXY0bF9kYmcoMSwgZGVidWcsICZjaGlwLT5jLCAiJXM6IHRocmVhZCBjaGVja21vZGVcbiIsIGNoaXAtPmMubmFtZSk7CiAJY2hpcC0+cHJldm1vZGUgPSBtb2RlOwogCiAJaWYgKG1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCkBAIC0zNzEsNyArMzU5LDcgQEAKIAlpZiAodmFsICYgVERBOTg0MF9TVF9TVEVSRU8pCiAJCW1vZGUgfD0gVklERU9fU09VTkRfU1RFUkVPOwogCi0JdHZhdWRpb19kYmcgKCJ0ZGE5ODQwX2dldG1vZGUoKTogcmF3IGNoaXAgcmVhZDogJWQsIHJldHVybjogJWRcbiIsCisJdjRsX2RiZygxLCBkZWJ1ZywgJmNoaXAtPmMsICJ0ZGE5ODQwX2dldG1vZGUoKTogcmF3IGNoaXAgcmVhZDogJWQsIHJldHVybjogJWRcbiIsCiAJCXZhbCwgbW9kZSk7CiAJcmV0dXJuIG1vZGU7CiB9CkBAIC02NjcsNyArNjU1LDcgQEAKIAkJbW9kZSB8PSBWSURFT19TT1VORF9TVEVSRU87CiAJaWYgKHZhbCAmIFREQTk4NzNfRFVBTCkKIAkJbW9kZSB8PSBWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOwotCXR2YXVkaW9fZGJnICgidGRhOTg3M19nZXRtb2RlKCk6IHJhdyBjaGlwIHJlYWQ6ICVkLCByZXR1cm46ICVkXG4iLAorCXY0bF9kYmcoMSwgZGVidWcsICZjaGlwLT5jLCAidGRhOTg3M19nZXRtb2RlKCk6IHJhdyBjaGlwIHJlYWQ6ICVkLCByZXR1cm46ICVkXG4iLAogCQl2YWwsIG1vZGUpOwogCXJldHVybiBtb2RlOwogfQpAQCAtNjc4LDEyICs2NjYsMTIgQEAKIAkvKglpbnQgYWRqX2RhdGEgPSBjaGlwLT5zaGFkb3cuYnl0ZXNbVERBOTg3M19BRCsxXSA7ICovCiAKIAlpZiAoKHN3X2RhdGEgJiBUREE5ODczX0lOUF9NQVNLKSAhPSBUREE5ODczX0lOVEVSTkFMKSB7Ci0JCXR2YXVkaW9fZGJnKCJ0ZGE5ODczX3NldG1vZGUoKTogZXh0ZXJuYWwgaW5wdXRcbiIpOworCQl2NGxfZGJnKDEsIGRlYnVnLCAmY2hpcC0+YywgInRkYTk4NzNfc2V0bW9kZSgpOiBleHRlcm5hbCBpbnB1dFxuIik7CiAJCXJldHVybjsKIAl9CiAKLQl0dmF1ZGlvX2RiZygidGRhOTg3M19zZXRtb2RlKCk6IGNoaXAtPnNoYWRvdy5ieXRlc1slZF0gPSAlZFxuIiwgVERBOTg3M19TVysxLCBjaGlwLT5zaGFkb3cuYnl0ZXNbVERBOTg3M19TVysxXSk7Ci0JdHZhdWRpb19kYmcoInRkYTk4NzNfc2V0bW9kZSgpOiBzd19kYXRhICA9ICVkXG4iLCBzd19kYXRhKTsKKwl2NGxfZGJnKDEsIGRlYnVnLCAmY2hpcC0+YywgInRkYTk4NzNfc2V0bW9kZSgpOiBjaGlwLT5zaGFkb3cuYnl0ZXNbJWRdID0gJWRcbiIsIFREQTk4NzNfU1crMSwgY2hpcC0+c2hhZG93LmJ5dGVzW1REQTk4NzNfU1crMV0pOworCXY0bF9kYmcoMSwgZGVidWcsICZjaGlwLT5jLCAidGRhOTg3M19zZXRtb2RlKCk6IHN3X2RhdGEgID0gJWRcbiIsIHN3X2RhdGEpOwogCiAJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBWSURFT19TT1VORF9NT05POgpAQCAtNzA0LDcgKzY5Miw3IEBACiAJfQogCiAJY2hpcF93cml0ZShjaGlwLCBUREE5ODczX1NXLCBzd19kYXRhKTsKLQl0dmF1ZGlvX2RiZygidGRhOTg3M19zZXRtb2RlKCk6IHJlcS4gbW9kZSAlZDsgY2hpcF93cml0ZTogJWRcbiIsCisJdjRsX2RiZygxLCBkZWJ1ZywgJmNoaXAtPmMsICJ0ZGE5ODczX3NldG1vZGUoKTogcmVxLiBtb2RlICVkOyBjaGlwX3dyaXRlOiAlZFxuIiwKIAkJbW9kZSwgc3dfZGF0YSk7CiB9CiAKQEAgLTg0Myw3ICs4MzEsNyBAQAogCQljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX1NEQUNPU1IsICh0ZGE5ODc0YV9tb2RlKSA/IDB4ODE6MHg4MCk7CiAJCWNoaXBfd3JpdGUoY2hpcCwgVERBOTg3NEFfQU9TUiwgMHgwMCk7IC8qIG9yIDB4MTAgKi8KIAl9Ci0JdHZhdWRpb19kYmcoInRkYTk4NzRhX3NldHVwKCk6ICVzIFsweCUwMlhdLlxuIiwKKwl2NGxfZGJnKDEsIGRlYnVnLCAmY2hpcC0+YywgInRkYTk4NzRhX3NldHVwKCk6ICVzIFsweCUwMlhdLlxuIiwKIAkJdGRhOTg3NGFfbW9kZWxpc3RbdGRhOTg3NGFfU1REXS5uYW1lLHRkYTk4NzRhX1NURCk7CiAJcmV0dXJuIDE7CiB9CkBAIC04ODYsNyArODc0LDcgQEAKIAkJCW1vZGUgfD0gVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKIAl9CiAKLQl0dmF1ZGlvX2RiZygidGRhOTg3NGFfZ2V0bW9kZSgpOiBEU1I9MHglWCwgTlNSPTB4JVgsIE5FQ1I9MHglWCwgcmV0dXJuOiAlZC5cbiIsCisJdjRsX2RiZygxLCBkZWJ1ZywgJmNoaXAtPmMsICJ0ZGE5ODc0YV9nZXRtb2RlKCk6IERTUj0weCVYLCBOU1I9MHglWCwgTkVDUj0weCVYLCByZXR1cm46ICVkLlxuIiwKIAkJIGRzciwgbnNyLCBuZWNyLCBtb2RlKTsKIAlyZXR1cm4gbW9kZTsKIH0KQEAgLTkzMiw3ICs5MjAsNyBAQAogCQljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX0FPU1IsIGFvc3IpOwogCQljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX01EQUNPU1IsIG1kYWNvc3IpOwogCi0JCXR2YXVkaW9fZGJnKCJ0ZGE5ODc0YV9zZXRtb2RlKCk6IHJlcS4gbW9kZSAlZDsgQU9TUj0weCVYLCBNREFDT1NSPTB4JVguXG4iLAorCQl2NGxfZGJnKDEsIGRlYnVnLCAmY2hpcC0+YywgInRkYTk4NzRhX3NldG1vZGUoKTogcmVxLiBtb2RlICVkOyBBT1NSPTB4JVgsIE1EQUNPU1I9MHglWC5cbiIsCiAJCQltb2RlLCBhb3NyLCBtZGFjb3NyKTsKIAogCX0gZWxzZSB7IC8qIGRpYyA9PSAweDA3ICovCkBAIC05NjcsNyArOTU1LDcgQEAKIAkJY2hpcF93cml0ZShjaGlwLCBUREE5ODc0QV9GTU1SLCBmbW1yKTsKIAkJY2hpcF93cml0ZShjaGlwLCBUREE5ODc0QV9BT1NSLCBhb3NyKTsKIAotCQl0dmF1ZGlvX2RiZygidGRhOTg3NGFfc2V0bW9kZSgpOiByZXEuIG1vZGUgJWQ7IEZNTVI9MHglWCwgQU9TUj0weCVYLlxuIiwKKwkJdjRsX2RiZygxLCBkZWJ1ZywgJmNoaXAtPmMsICJ0ZGE5ODc0YV9zZXRtb2RlKCk6IHJlcS4gbW9kZSAlZDsgRk1NUj0weCVYLCBBT1NSPTB4JVguXG4iLAogCQkJbW9kZSwgZm1tciwgYW9zcik7CiAJfQogfQpAQCAtOTgxLDEwICs5NjksMTAgQEAKIAlpZigtMSA9PSAoc2ljID0gY2hpcF9yZWFkMihjaGlwLFREQTk4NzRBX1NJQykpKQogCQlyZXR1cm4gMDsKIAotCXR2YXVkaW9fZGJnKCJ0ZGE5ODc0YV9jaGVja2l0KCk6IERJQz0weCVYLCBTSUM9MHglWC5cbiIsIGRpYywgc2ljKTsKKwl2NGxfZGJnKDEsIGRlYnVnLCAmY2hpcC0+YywgInRkYTk4NzRhX2NoZWNraXQoKTogRElDPTB4JVgsIFNJQz0weCVYLlxuIiwgZGljLCBzaWMpOwogCiAJaWYoKGRpYyA9PSAweDExKXx8KGRpYyA9PSAweDA3KSkgewotCQl0dmF1ZGlvX2luZm8oImZvdW5kIHRkYTk4NzQlcy5cbiIsIChkaWMgPT0gMHgxMSkgPyAiYSI6ImgiKTsKKwkJdjRsX2luZm8oJmNoaXAtPmMsICJmb3VuZCB0ZGE5ODc0JXMuXG4iLCAoZGljID09IDB4MTEpID8gImEiOiJoIik7CiAJCXRkYTk4NzRhX2RpYyA9IGRpYzsJLyogcmVtZW1iZXIgZGV2aWNlIGlkLiAqLwogCQlyZXR1cm4gMTsKIAl9CkBAIC0xMTk2LDcgKzExODQsNyBAQAogCX1lbHNlIGlmICghKHZhbCAmIFRBODg3NFpfQjApKXsKIAkJbW9kZSB8PSBWSURFT19TT1VORF9TVEVSRU87CiAJfQotCS8qIHR2YXVkaW9fZGJnICgidGE4ODc0el9nZXRtb2RlKCk6IHJhdyBjaGlwIHJlYWQ6IDB4JTAyeCwgcmV0dXJuOiAweCUwMnhcbiIsIHZhbCwgbW9kZSk7ICovCisJLyogdjRsX2RiZygxLCBkZWJ1ZywgJmNoaXAtPmMsICJ0YTg4NzR6X2dldG1vZGUoKTogcmF3IGNoaXAgcmVhZDogMHglMDJ4LCByZXR1cm46IDB4JTAyeFxuIiwgdmFsLCBtb2RlKTsgKi8KIAlyZXR1cm4gbW9kZTsKIH0KIApAQCAtMTIwOSw3ICsxMTk3LDcgQEAKIHsKIAlpbnQgdXBkYXRlID0gMTsKIAlhdWRpb2NtZCAqdCA9IE5VTEw7Ci0JdHZhdWRpb19kYmcoInRhODg3NHpfc2V0bW9kZSgpOiBtb2RlOiAweCUwMnhcbiIsIG1vZGUpOworCXY0bF9kYmcoMSwgZGVidWcsICZjaGlwLT5jLCAidGE4ODc0el9zZXRtb2RlKCk6IG1vZGU6IDB4JTAyeFxuIiwgbW9kZSk7CiAKIAlzd2l0Y2gobW9kZSl7CiAJY2FzZSBWSURFT19TT1VORF9NT05POgpAQCAtMTQ4MCwxNyArMTQ2OCwxNiBAQAogCXN0cnVjdCBDSElQU1RBVEUgKmNoaXA7CiAJc3RydWN0IENISVBERVNDICAqZGVzYzsKIAotCWNoaXAgPSBrbWFsbG9jKHNpemVvZigqY2hpcCksR0ZQX0tFUk5FTCk7CisJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKCpjaGlwKSxHRlBfS0VSTkVMKTsKIAlpZiAoIWNoaXApCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbXNldChjaGlwLDAsc2l6ZW9mKCpjaGlwKSk7CiAJbWVtY3B5KCZjaGlwLT5jLCZjbGllbnRfdGVtcGxhdGUsc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CiAJY2hpcC0+Yy5hZGFwdGVyID0gYWRhcDsKIAljaGlwLT5jLmFkZHIgPSBhZGRyOwogCWkyY19zZXRfY2xpZW50ZGF0YSgmY2hpcC0+YywgY2hpcCk7CiAKIAkvKiBmaW5kIGRlc2NyaXB0aW9uIGZvciB0aGUgY2hpcCAqLwotCXR2YXVkaW9fZGJnKCJjaGlwIGZvdW5kIEAgMHgleFxuIiwgYWRkcjw8MSk7CisJdjRsX2RiZygxLCBkZWJ1ZywgJmNoaXAtPmMsICJjaGlwIGZvdW5kIEAgMHgleFxuIiwgYWRkcjw8MSk7CiAJZm9yIChkZXNjID0gY2hpcGxpc3Q7IGRlc2MtPm5hbWUgIT0gTlVMTDsgZGVzYysrKSB7CiAJCWlmICgwID09ICooZGVzYy0+aW5zbW9kb3B0KSkKIAkJCWNvbnRpbnVlOwpAQCAtMTUwMiwxMiArMTQ4OSwxMiBAQAogCQlicmVhazsKIAl9CiAJaWYgKGRlc2MtPm5hbWUgPT0gTlVMTCkgewotCQl0dmF1ZGlvX2RiZygibm8gbWF0Y2hpbmcgY2hpcCBkZXNjcmlwdGlvbiBmb3VuZFxuIik7CisJCXY0bF9kYmcoMSwgZGVidWcsICZjaGlwLT5jLCAibm8gbWF0Y2hpbmcgY2hpcCBkZXNjcmlwdGlvbiBmb3VuZFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KLQl0dmF1ZGlvX2luZm8oIiVzIGZvdW5kIEAgMHgleCAoJXMpXG4iLCBkZXNjLT5uYW1lLCBhZGRyPDwxLCBhZGFwLT5uYW1lKTsKKwl2NGxfaW5mbygmY2hpcC0+YywgIiVzIGZvdW5kIEAgMHgleCAoJXMpXG4iLCBkZXNjLT5uYW1lLCBhZGRyPDwxLCBhZGFwLT5uYW1lKTsKIAlpZiAoZGVzYy0+ZmxhZ3MpIHsKLQkJdHZhdWRpb19kYmcoIm1hdGNoZXM6JXMlcyVzLlxuIiwKKwkJdjRsX2RiZygxLCBkZWJ1ZywgJmNoaXAtPmMsICJtYXRjaGVzOiVzJXMlcy5cbiIsCiAJCQkoZGVzYy0+ZmxhZ3MgJiBDSElQX0hBU19WT0xVTUUpICAgICA/ICIgdm9sdW1lIiAgICAgIDogIiIsCiAJCQkoZGVzYy0+ZmxhZ3MgJiBDSElQX0hBU19CQVNTVFJFQkxFKSA/ICIgYmFzcy90cmVibGUiIDogIiIsCiAJCQkoZGVzYy0+ZmxhZ3MgJiBDSElQX0hBU19JTlBVVFNFTCkgICA/ICIgYXVkaW9tdXgiICAgIDogIiIpOwpAQCAtMTU1MCw3ICsxNTM3LDcgQEAKIAkJaW5pdF9jb21wbGV0aW9uKCZjaGlwLT50ZXhpdCk7CiAJCWNoaXAtPnRwaWQgPSBrZXJuZWxfdGhyZWFkKGNoaXBfdGhyZWFkLCh2b2lkICopY2hpcCwwKTsKIAkJaWYgKGNoaXAtPnRwaWQgPCAwKQotCQkJdHZhdWRpb193YXJuKCIlczoga2VybmVsX3RocmVhZCgpIGZhaWxlZFxuIiwKKwkJCXY0bF93YXJuKCZjaGlwLT5jLCAiJXM6IGtlcm5lbF90aHJlYWQoKSBmYWlsZWRcbiIsCiAJCQkgICAgICAgY2hpcC0+Yy5uYW1lKTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaGlwLT53cSk7CiAJfQpAQCAtMTU2MywxNyArMTU1MCw4IEBACiAJICAgYmVjYXVzZSBkZWRpY2F0ZWQgZHJpdmVycyBhcmUgdXNlZCAqLwogCWlmICgoYWRhcC0+aWQgPT0gSTJDX0hXX1NBQTcxNDYpKQogCQlyZXR1cm4gMDsKLSNpZmRlZiBJMkNfQ0xBU1NfVFZfQU5BTE9HCiAJaWYgKGFkYXAtPmNsYXNzICYgSTJDX0NMQVNTX1RWX0FOQUxPRykKIAkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCBjaGlwX2F0dGFjaCk7Ci0jZWxzZQotCXN3aXRjaCAoYWRhcC0+aWQpIHsKLQljYXNlIEkyQ19IV19CX0JUODQ4OgotCWNhc2UgSTJDX0hXX0JfUklWQToKLQljYXNlIEkyQ19IV19TQUE3MTM0OgotCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIGNoaXBfYXR0YWNoKTsKLQl9Ci0jZW5kaWYKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTYwNCw3ICsxNTgyLDcgQEAKIAlzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IENISVBERVNDICAqZGVzYyA9IGNoaXBsaXN0ICsgY2hpcC0+dHlwZTsKIAotCXR2YXVkaW9fZGJnKCIlczogY2hpcF9jb21tYW5kIDB4JXhcbiIsIGNoaXAtPmMubmFtZSwgY21kKTsKKwl2NGxfZGJnKDEsIGRlYnVnLCAmY2hpcC0+YywgIiVzOiBjaGlwX2NvbW1hbmQgMHgleFxuIiwgY2hpcC0+Yy5uYW1lLCBjbWQpOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIEFVRENfU0VUX0lOUFVUOgpAQCAtMTYxNyw3ICsxNTk1LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEFVRENfU0VUX1JBRElPOgotCQljaGlwLT5ub3JtID0gVklERU9fTU9ERV9SQURJTzsKKwkJY2hpcC0+cmFkaW8gPSAxOwogCQljaGlwLT53YXRjaF9zdGVyZW8gPSAwOwogCQkvKiBkZWxfdGltZXIoJmNoaXAtPnd0KTsgKi8KIAkJYnJlYWs7CkBAIC0xNjQzLDcgKzE2MjEsNyBAQAogCQkJdmEtPmJhc3MgICA9IGNoaXAtPmJhc3M7CiAJCQl2YS0+dHJlYmxlID0gY2hpcC0+dHJlYmxlOwogCQl9Ci0JCWlmIChjaGlwLT5ub3JtICE9IFZJREVPX01PREVfUkFESU8pIHsKKwkJaWYgKCFjaGlwLT5yYWRpbykgewogCQkJaWYgKGRlc2MtPmdldG1vZGUpCiAJCQkJdmEtPm1vZGUgPSBkZXNjLT5nZXRtb2RlKGNoaXApOwogCQkJZWxzZQpAQCAtMTY3OCwxNSArMTY1Niw4MCBAQAogCQl9CiAJCWJyZWFrOwogCX0KLQljYXNlIFZJRElPQ1NDSEFOOgotCXsKLQkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnZjID0gYXJnOwogCi0JCWNoaXAtPm5vcm0gPSB2Yy0+bm9ybTsKKwljYXNlIFZJRElPQ19TX1RVTkVSOgorCXsKKwkJc3RydWN0IHY0bDJfdHVuZXIgKnZ0ID0gYXJnOworCQlpbnQgbW9kZSA9IDA7CisKKwkJc3dpdGNoICh2dC0+YXVkbW9kZSkgeworCQljYXNlIFY0TDJfVFVORVJfTU9ERV9NT05POgorCQkJbW9kZSA9IFZJREVPX1NPVU5EX01PTk87CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOgorCQkJbW9kZSA9IFZJREVPX1NPVU5EX1NURVJFTzsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMToKKwkJCW1vZGUgPSBWSURFT19TT1VORF9MQU5HMTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMjoKKwkJCW1vZGUgPSBWSURFT19TT1VORF9MQU5HMjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZGVzYy0+c2V0bW9kZSAmJiBtb2RlKSB7CisJCQljaGlwLT53YXRjaF9zdGVyZW8gPSAwOworCQkJLyogZGVsX3RpbWVyKCZjaGlwLT53dCk7ICovCisJCQljaGlwLT5tb2RlID0gbW9kZTsKKwkJCWRlc2MtPnNldG1vZGUoY2hpcCwgbW9kZSk7CisJCX0KIAkJYnJlYWs7CiAJfQotCWNhc2UgVklESU9DU0ZSRVE6CisKKwljYXNlIFZJRElPQ19HX1RVTkVSOgogCXsKKwkJc3RydWN0IHY0bDJfdHVuZXIgKnZ0ID0gYXJnOworCQlpbnQgbW9kZSA9IFZJREVPX1NPVU5EX01PTk87CisKKwkJaWYgKGNoaXAtPnJhZGlvKQorCQkJYnJlYWs7CisJCXZ0LT5hdWRtb2RlID0gMDsKKwkJdnQtPnJ4c3ViY2hhbnMgPSAwOworCQl2dC0+Y2FwYWJpbGl0eSA9IFY0TDJfVFVORVJfQ0FQX1NURVJFTyB8CisJCQlWNEwyX1RVTkVSX0NBUF9MQU5HMSB8IFY0TDJfVFVORVJfQ0FQX0xBTkcyOworCisJCWlmIChkZXNjLT5nZXRtb2RlKQorCQkJbW9kZSA9IGRlc2MtPmdldG1vZGUoY2hpcCk7CisKKwkJaWYgKG1vZGUgJiBWSURFT19TT1VORF9NT05PKQorCQkJdnQtPnJ4c3ViY2hhbnMgfD0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwkJaWYgKG1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCisJCQl2dC0+cnhzdWJjaGFucyB8PSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87CisJCWlmIChtb2RlICYgVklERU9fU09VTkRfTEFORzEpCisJCQl2dC0+cnhzdWJjaGFucyB8PSBWNEwyX1RVTkVSX1NVQl9MQU5HMSB8CisJCQkJCSAgVjRMMl9UVU5FUl9TVUJfTEFORzI7CisKKwkJbW9kZSA9IGNoaXAtPm1vZGU7CisJCWlmIChtb2RlICYgVklERU9fU09VTkRfTU9OTykKKwkJCXZ0LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX01PTk87CisJCWlmIChtb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQorCQkJdnQtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOworCQlpZiAobW9kZSAmIFZJREVPX1NPVU5EX0xBTkcxKQorCQkJdnQtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfTEFORzE7CisJCWlmIChtb2RlICYgVklERU9fU09VTkRfTEFORzIpCisJCQl2dC0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9MQU5HMjsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NTQ0hBTjoKKwljYXNlIFZJRElPQ19TX1NURDoKKwkJY2hpcC0+cmFkaW8gPSAwOworCQlicmVhazsKKworCWNhc2UgVklESU9DU0ZSRVE6CisJY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6CiAJCWNoaXAtPm1vZGUgPSAwOyAvKiBhdXRvbWF0aWMgKi8KIAkJaWYgKGRlc2MtPmNoZWNrbW9kZSkgewogCQkJZGVzYy0+c2V0bW9kZShjaGlwLFZJREVPX1NPVU5EX01PTk8pOwpAQCAtMTY5NSwxNSArMTczOCwxNCBAQAogCQkJbW9kX3RpbWVyKCZjaGlwLT53dCwgamlmZmllcysyKkhaKTsKIAkJCS8qIHRoZSB0aHJlYWQgd2lsbCBjYWxsIGNoZWNrbW9kZSgpIGxhdGVyICovCiAJCX0KLQl9CisJCWJyZWFrOwogCX0KIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lICAgID0gImdlbmVyaWMgaTJjIGF1ZGlvIGRyaXZlciIsCisJCS5uYW1lICAgID0gInR2YXVkaW8iLAogCX0sCiAJLmlkICAgICAgICAgICAgICA9IEkyQ19EUklWRVJJRF9UVkFVRElPLAogCS5hdHRhY2hfYWRhcHRlciAgPSBjaGlwX3Byb2JlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dmVlcHJvbS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmVlcHJvbS5jCmluZGV4IDhhYzRjYjguLjU4MjU1MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZlZXByb20uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2ZWVwcm9tLmMKQEAgLTQwLDYgKzQwLDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdHZlZXByb20uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvY2hpcC5oPgogCiBNT0RVTEVfREVTQ1JJUFRJT04oImkyYyBIYXVwcGF1Z2UgZWVwcm9tIGRlY29kZXIgZHJpdmVyIik7CkBAIC01MiwyMSArNTMsMTkgQEAKIAogI2RlZmluZSBTVFJNKGFycmF5LGkpIChpIDwgc2l6ZW9mKGFycmF5KS9zaXplb2YoY2hhciopID8gYXJyYXlbaV0gOiAidW5rbm93biIpCiAKLSNkZWZpbmUgdHZlZXByb21faW5mbyhmbXQsIGFyZy4uLikgZG8ge1wKLQlwcmludGsoS0VSTl9JTkZPICJ0dmVlcHJvbSAlZC0lMDR4OiAiIGZtdCwgXAotCQkJYy0+YWRhcHRlci0+bnIsIGMtPmFkZHIgLCAjI2FyZyk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHR2ZWVwcm9tX3dhcm4oZm10LCBhcmcuLi4pIGRvIHtcCi0JcHJpbnRrKEtFUk5fV0FSTklORyAidHZlZXByb20gJWQtJTA0eDogIiBmbXQsIFwKLQkJCWMtPmFkYXB0ZXItPm5yLCBjLT5hZGRyICwgIyNhcmcpOyB9IHdoaWxlICgwKQotI2RlZmluZSB0dmVlcHJvbV9kYmcoZm10LCBhcmcuLi4pIGRvIHtcCisjZGVmaW5lIHR2ZWVwcm9tX2luZm8oZm10LCBhcmcuLi4pIFwKKwl2NGxfcHJpbnRrKEtFUk5fSU5GTywgInR2ZWVwcm9tIiwgYy0+YWRhcHRlciwgYy0+YWRkciwgZm10ICwgIyMgYXJnKQorI2RlZmluZSB0dmVlcHJvbV93YXJuKGZtdCwgYXJnLi4uKSBcCisJdjRsX3ByaW50ayhLRVJOX1dBUk5JTkcsICJ0dmVlcHJvbSIsIGMtPmFkYXB0ZXIsIGMtPmFkZHIsIGZtdCAsICMjIGFyZykKKyNkZWZpbmUgdHZlZXByb21fZGJnKGZtdCwgYXJnLi4uKSBkbyB7IFwKIAlpZiAoZGVidWcpIFwKLQkJcHJpbnRrKEtFUk5fSU5GTyAidHZlZXByb20gJWQtJTA0eDogIiBmbXQsIFwKLQkJCWMtPmFkYXB0ZXItPm5yLCBjLT5hZGRyICwgIyNhcmcpOyB9IHdoaWxlICgwKQorCQl2NGxfcHJpbnRrKEtFUk5fREVCVUcsICJ0dmVlcHJvbSIsIGMtPmFkYXB0ZXIsIGMtPmFkZHIsIGZtdCAsICMjIGFyZyk7IFwKKwl9IHdoaWxlICgwKQogCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBzb21lIGhhdXBwYXVnZSBzcGVjaWZpYyBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCisvKgorICogVGhlIEhhdXBwYXVnZSBlZXByb20gdXNlcyBhbiA4Yml0IGZpZWxkIHRvIGRldGVybWluZSB3aGljaAorICogdHVuZXIgZm9ybWF0cyB0aGUgdHVuZXIgc3VwcG9ydHMuCisgKi8KIHN0YXRpYyBzdHJ1Y3QgSEFVUFBBVUdFX1RVTkVSX0ZNVAogewogCWludAlpZDsKQEAgLTc0LDE0ICs3MywxNCBAQAogfQogaGF1cHBhdWdlX3R1bmVyX2ZtdFtdID0KIHsKLQl7IDB4MDAwMDAwMDAsICIgdW5rbm93bjEiIH0sCi0JeyAweDAwMDAwMDAwLCAiIHVua25vd24yIiB9LAotCXsgMHgwMDAwMDAwNywgIiBQQUwoQi9HKSIgfSwKLQl7IDB4MDAwMDEwMDAsICIgTlRTQyhNKSIgfSwKLQl7IDB4MDAwMDAwMTAsICIgUEFMKEkpIiB9LAotCXsgMHgwMDQwMDAwMCwgIiBTRUNBTShML0wnKSIgfSwKLQl7IDB4MDAwMDBlMDAsICIgUEFMKEQvSykiIH0sCi0JeyAweDAzMDAwMDAwLCAiIEFUU0MvRFZCIERpZ2l0YWwiIH0sCisJeyBWNEwyX1NURF9VTktOT1dOLCIgVU5LTk9XTiIgfSwKKwl7IFY0TDJfU1REX1VOS05PV04sIiBGTSIgfSwKKwl7IFY0TDJfU1REX1BBTF9CRywgIiBQQUwoQi9HKSIgfSwKKwl7IFY0TDJfU1REX05UU0NfTSwgIiBOVFNDKE0pIiB9LAorCXsgVjRMMl9TVERfUEFMX0ksICAiIFBBTChJKSIgfSwKKwl7IFY0TDJfU1REX1NFQ0FNX0wsIiBTRUNBTShML0wnKSIgfSwKKwl7IFY0TDJfU1REX1BBTF9ESywgIiBQQUwoRC9EMS9LKSIgfSwKKwl7IFY0TDJfU1REX0FUU0MsICAgIiBBVFNDL0RWQiBEaWdpdGFsIiB9LAogfTsKIAogLyogVGhpcyBpcyB0aGUgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIHR1bmVycy4gTWFueSB0aGFua3MgdG8gSGF1cHBhdWdlIGZvcgpAQCAtMTkxLDcgKzE5MCw3IEBACiAJeyBUVU5FUl9MR19QQUxfTkVXX1RBUEMsICJUQ0wgMjAwMk1JIDMifSwKIAl7IFRVTkVSX1RDTF8yMDAyTiwgICAgICJUQ0wgMjAwMk4gNkEifSwKIAl7IFRVTkVSX1BISUxJUFNfRk0xMjM2X01LMywgIlBoaWxpcHMgRlExMjM2IE1LMyJ9LAotCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlNhbXN1bmcgVENQTiAyMTIxUDMwQSJ9LAorCXsgVFVORVJfU0FNU1VOR19UQ1BOXzIxMjFQMzBBLCAiU2Ftc3VuZyBUQ1BOIDIxMjFQMzBBIn0sCiAJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiU2Ftc3VuZyBUQ1BFIDQxMjFQMzBBIn0sCiAJeyBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMywgIlRDTCBNRlBFMDUgMiJ9LAogCS8qIDkwLTk5ICovCkBAIC0zODcsNyArMzg2LDcgQEAKIAlpZiAoKGVlcHJvbV9kYXRhWzBdID09IDB4MWEpICYmIChlZXByb21fZGF0YVsxXSA9PSAweGViKSAmJgogCQkJKGVlcHJvbV9kYXRhWzJdID09IDB4NjcpICYmIChlZXByb21fZGF0YVszXSA9PSAweDk1KSkKIAkJc3RhcnQ9MHhhMDsgLyogR2VuZXJpYyBlbTI4eHggb2Zmc2V0ICovCi0JZWxzZSBpZiAoKChlZXByb21fZGF0YVswXSAmIDB4ZjApID09IDB4MTApICYmCisJZWxzZSBpZiAoKChlZXByb21fZGF0YVswXSAmIDB4ZTEpID09IDB4MDEpICYmCiAJCQkJCShlZXByb21fZGF0YVsxXSA9PSAweDAwKSAmJgogCQkJCQkoZWVwcm9tX2RhdGFbMl0gPT0gMHgwMCkgJiYKIAkJCQkJKGVlcHJvbV9kYXRhWzhdID09IDB4ODQpKQpAQCAtNzIwLDggKzcxOSw3IEBACiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgMDoKLQkJYnVmID0ga21hbGxvYygyNTYsR0ZQX0tFUk5FTCk7Ci0JCW1lbXNldChidWYsMCwyNTYpOworCQlidWYgPSBremFsbG9jKDI1NixHRlBfS0VSTkVMKTsKIAkJdHZlZXByb21fcmVhZChjbGllbnQsYnVmLDI1Nik7CiAJCXR2ZWVwcm9tX2hhdXBwYXVnZV9hbmFsb2coY2xpZW50LCAmZWVwcm9tLGJ1Zik7CiAJCWtmcmVlKGJ1Zik7CkBAIC03NDQsMTAgKzc0Miw5IEBACiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAotCWNsaWVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJY2xpZW50ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCA9PSBjbGllbnQpCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbXNldChjbGllbnQsIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOwogCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CiAJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKIAljbGllbnQtPmRyaXZlciA9ICZpMmNfZHJpdmVyX3R2ZWVwcm9tOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dm1peGVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2bWl4ZXIuYwppbmRleCBlODM3ZjlmLi45ZTg2Y2FlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2bWl4ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2bWl4ZXIuYwpAQCAtMjI3LDEzICsyMjcsOSBAQAogfQogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyID0gewotI2lmZGVmIEkyQ19QRUMKIAkuZHJpdmVyID0gewotCQkubmFtZSAgICA9ICJ0diBjYXJkIG1peGVyIGRyaXZlciIsCisJCS5uYW1lICAgID0gInR2bWl4ZXIiLAogCX0sCi0jZWxzZQotCS5uYW1lICAgICAgICAgICAgPSAidHYgY2FyZCBtaXhlciBkcml2ZXIiLAotI2VuZGlmCiAJLmlkICAgICAgICAgICAgICA9IEkyQ19EUklWRVJJRF9UVk1JWEVSLAogCS5kZXRhY2hfYWRhcHRlciAgPSB0dm1peGVyX2FkYXB0ZXJzLAogCS5hdHRhY2hfYWRhcHRlciAgPSB0dm1peGVyX2FkYXB0ZXJzLApAQCAtMjY3LDIyICsyNjMsOCBAQAogCXN0cnVjdCB2aWRlb19hdWRpbyB2YTsKIAlpbnQgaSxtaW5vcjsKIAotI2lmZGVmIEkyQ19DTEFTU19UVl9BTkFMT0cKIAlpZiAoIShjbGllbnQtPmFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX1RWX0FOQUxPRykpCiAJCXJldHVybiAtMTsKLSNlbHNlCi0JLyogVFYgY2FyZCA/Pz8gKi8KLQlzd2l0Y2ggKGNsaWVudC0+YWRhcHRlci0+aWQpIHsKLQljYXNlIEkyQ19IV19TTUJVU19WT09ET08zOgotCWNhc2UgSTJDX0hXX0JfQlQ4NDg6Ci0JY2FzZSBJMkNfSFdfQl9SSVZBOgotCQkvKiBvaywgaGF2ZSBhIGxvb2sgLi4uICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIGlnbm9yZSB0aGF0IG9uZSAqLwotCQlyZXR1cm4gLTE7Ci0JfQotI2VuZGlmCiAKIAkvKiB1bnJlZ2lzdGVyID8/ICovCiAJZm9yIChpID0gMDsgaSA8IERFVl9NQVg7IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dnA1MTUwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNTAuYwppbmRleCBhNjA0NDJlLi5mYWQ5ZWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNTAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNTAuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9fZGVjb2Rlci5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAKICNpbmNsdWRlICJ0dnA1MTUwX3JlZy5oIgogCkBAIC0yOCwzMyArMjksMzggQEAKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbCAoMC0xKSIpOwogCi0jZGVmaW5lIGRwcmludGsobnVtLCBmb3JtYXQsIGFyZ3MuLi4pIFwKKyNkZWZpbmUgdHZwNTE1MF9pbmZvKGZtdCwgYXJnLi4uKSBkbyB7IFwKKwlwcmludGsoS0VSTl9JTkZPICIlcyAlZC0lMDR4OiAiIGZtdCwgYy0+ZHJpdmVyLT5kcml2ZXIubmFtZSwgXAorCSAgICAgICBpMmNfYWRhcHRlcl9pZChjLT5hZGFwdGVyKSwgYy0+YWRkciAsICMjIGFyZyk7IH0gd2hpbGUgKDApCisjZGVmaW5lIHR2cDUxNTBfZGJnKG51bSwgZm10LCBhcmcuLi4pIFwKIAlkbyB7IFwKIAkJaWYgKGRlYnVnID49IG51bSkgXAotCQkJcHJpbnRrKGZvcm1hdCwgIyNhcmdzKTsgXAotCX0gd2hpbGUgKDApCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgZGVidWcgJWQtJTA0eDogIiBmbXQsXAorCQkJCWMtPmRyaXZlci0+ZHJpdmVyLm5hbWUsIFwKKwkJCQlpMmNfYWRhcHRlcl9pZChjLT5hZGFwdGVyKSwgXAorCQkJCWMtPmFkZHIgLCAjIyBhcmcpOyB9IHdoaWxlICgwKQogCiAvKiBzdXBwb3J0ZWQgY29udHJvbHMgKi8KIHN0YXRpYyBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgdHZwNTE1MF9xY3RybFtdID0gewogCXsKLQkgLmlkID0gVjRMMl9DSURfQlJJR0hUTkVTUywKLQkgLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCSAubmFtZSA9ICJCcmlnaHRuZXNzIiwKLQkgLm1pbmltdW0gPSAwLAotCSAubWF4aW11bSA9IDI1NSwKLQkgLnN0ZXAgPSAxLAotCSAuZGVmYXVsdF92YWx1ZSA9IDAsCi0JIC5mbGFncyA9IDAsCi0JIH0sIHsKLQkgICAgIC5pZCA9IFY0TDJfQ0lEX0NPTlRSQVNULAotCSAgICAgLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCSAgICAgLm5hbWUgPSAiQ29udHJhc3QiLAotCSAgICAgLm1pbmltdW0gPSAwLAotCSAgICAgLm1heGltdW0gPSAyNTUsCi0JICAgICAuc3RlcCA9IDB4MSwKLQkgICAgIC5kZWZhdWx0X3ZhbHVlID0gMHgxMCwKLQkgICAgIC5mbGFncyA9IDAsCi0JICAgICB9LCB7CisJCS5pZCA9IFY0TDJfQ0lEX0JSSUdIVE5FU1MsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgPSAiQnJpZ2h0bmVzcyIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAyNTUsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCQkuZmxhZ3MgPSAwLAorCX0sIHsKKwkJLmlkID0gVjRMMl9DSURfQ09OVFJBU1QsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgPSAiQ29udHJhc3QiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMjU1LAorCQkuc3RlcCA9IDB4MSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAweDEwLAorCQkuZmxhZ3MgPSAwLAorCX0sIHsKIAkJIC5pZCA9IFY0TDJfQ0lEX1NBVFVSQVRJT04sCiAJCSAudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCiAJCSAubmFtZSA9ICJTYXR1cmF0aW9uIiwKQEAgLTYzLDE2ICs2OSwxNiBAQAogCQkgLnN0ZXAgPSAweDEsCiAJCSAuZGVmYXVsdF92YWx1ZSA9IDB4MTAsCiAJCSAuZmxhZ3MgPSAwLAotCQkgfSwgewotCQkgICAgIC5pZCA9IFY0TDJfQ0lEX0hVRSwKLQkJICAgICAudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCSAgICAgLm5hbWUgPSAiSHVlIiwKLQkJICAgICAubWluaW11bSA9IC0xMjgsCi0JCSAgICAgLm1heGltdW0gPSAxMjcsCi0JCSAgICAgLnN0ZXAgPSAweDEsCi0JCSAgICAgLmRlZmF1bHRfdmFsdWUgPSAweDEwLAotCQkgICAgIC5mbGFncyA9IDAsCi0JCSAgICAgfQorCX0sIHsKKwkJLmlkID0gVjRMMl9DSURfSFVFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIkh1ZSIsCisJCS5taW5pbXVtID0gLTEyOCwKKwkJLm1heGltdW0gPSAxMjcsCisJCS5zdGVwID0gMHgxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDB4MTAsCisJCS5mbGFncyA9IDAsCisJfQogfTsKIAogc3RydWN0IHR2cDUxNTAgewpAQCAtODcsMTkgKzkzLDIxIEBACiAJaW50IHNhdDsKIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50IHR2cDUxNTBfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgY2hhciBhZGRyKQorc3RhdGljIGludCB0dnA1MTUwX3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGNoYXIgYWRkcikKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxXTsKIAlpbnQgcmM7CiAKIAlidWZmZXJbMF0gPSBhZGRyOwogCWlmICgxICE9IChyYyA9IGkyY19tYXN0ZXJfc2VuZChjLCBidWZmZXIsIDEpKSkKLQkJZHByaW50aygwLCAiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSAxKVxuIiwgcmMpOworCQl0dnA1MTUwX2RiZygwLCAiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSAxKVxuIiwgcmMpOwogCiAJbXNsZWVwKDEwKTsKIAogCWlmICgxICE9IChyYyA9IGkyY19tYXN0ZXJfcmVjdihjLCBidWZmZXIsIDEpKSkKLQkJZHByaW50aygwLCAiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSAxKVxuIiwgcmMpOworCQl0dnA1MTUwX2RiZygwLCAiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSAxKVxuIiwgcmMpOworCisJdHZwNTE1MF9kYmcoMiwgInR2cDUxNTA6IHJlYWQgMHglMDJ4ID0gMHglMDJ4XG4iLCBhZGRyLCBidWZmZXJbMF0pOwogCiAJcmV0dXJuIChidWZmZXJbMF0pOwogfQpAQCAtMTA5LDEzICsxMTcsMTIgQEAKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZmZlclsyXTsKIAlpbnQgcmM7Ci0vKglzdHJ1Y3QgdHZwNTE1MCAqY29yZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsgKi8KIAogCWJ1ZmZlclswXSA9IGFkZHI7CiAJYnVmZmVyWzFdID0gdmFsdWU7Ci0JZHByaW50aygxLCAidHZwNTE1MDogd3JpdGluZyAweCUwMnggMHglMDJ4XG4iLCBidWZmZXJbMF0sIGJ1ZmZlclsxXSk7CisJdHZwNTE1MF9kYmcoMiwgInR2cDUxNTA6IHdyaXRpbmcgMHglMDJ4IDB4JTAyeFxuIiwgYnVmZmVyWzBdLCBidWZmZXJbMV0pOwogCWlmICgyICE9IChyYyA9IGkyY19tYXN0ZXJfc2VuZChjLCBidWZmZXIsIDIpKSkKLQkJZHByaW50aygwLCAiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSAyKVxuIiwgcmMpOworCQl0dnA1MTUwX2RiZygwLCAiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSAyKVxuIiwgcmMpOwogfQogCiBzdGF0aWMgdm9pZCBkdW1wX3JlZyhzdHJ1Y3QgaTJjX2NsaWVudCAqYykKQEAgLTQzNyw0OCArNDQ0LDM0NiBAQAogc3RhdGljIGlubGluZSB2b2lkIHR2cDUxNTBfc2VsbXV4KHN0cnVjdCBpMmNfY2xpZW50ICpjLAogCQkJCSAgZW51bSB0dnA1MTUwX2lucHV0IGlucHV0KQogeworCWludCBvcG1vZGU9MDsKKwogCXN0cnVjdCB0dnA1MTUwICpkZWNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwogCiAJaWYgKCFkZWNvZGVyLT5lbmFibGUpCiAJCWlucHV0IHw9IFRWUDUxNTBfQkxBQ0tfU0NSRUVOOwogCisJc3dpdGNoIChpbnB1dCkgeworCWNhc2UgVFZQNTE1MF9BTkFMT0dfQ0gwOgorCWNhc2UgVFZQNTE1MF9BTkFMT0dfQ0gxOgorCQlvcG1vZGU9MHgzMDsJCS8qIFRWIE1vZGUgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJb3Btb2RlPTA7CQkvKiBBdXRvIE1vZGUgKi8KKwkJYnJlYWs7CisJfQorCisJdHZwNTE1MF93cml0ZShjLCBUVlA1MTUwX09QX01PREVfQ1RMLCBvcG1vZGUpOwogCXR2cDUxNTBfd3JpdGUoYywgVFZQNTE1MF9WRF9JTl9TUkNfU0VMXzEsIGlucHV0KTsKIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB0dnA1MTUwX3Jlc2V0KHN0cnVjdCBpMmNfY2xpZW50ICpjKQorc3RydWN0IGkyY19yZWdfdmFsdWUgeworCXVuc2lnbmVkIGNoYXIgcmVnOworCXVuc2lnbmVkIGNoYXIgdmFsdWU7Cit9OworCisvKiBEZWZhdWx0IHZhbHVlcyBhcyBzdWdlc3RlZCBhdCBUVlA1MTUwQU0xIGRhdGFzaGVldCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfcmVnX3ZhbHVlIHR2cDUxNTBfaW5pdF9kZWZhdWx0W10gPSB7CisJeyAvKiAweDAwICovCisJCVRWUDUxNTBfVkRfSU5fU1JDX1NFTF8xLDB4MDAKKwl9LAorCXsgLyogMHgwMSAqLworCQlUVlA1MTUwX0FOQUxfQ0hMX0NUTCwweDE1CisJfSwKKwl7IC8qIDB4MDIgKi8KKwkJVFZQNTE1MF9PUF9NT0RFX0NUTCwweDAwCisJfSwKKwl7IC8qIDB4MDMgKi8KKwkJVFZQNTE1MF9NSVNDX0NUTCwweDAxCisJfSwKKwl7IC8qIDB4MDYgKi8KKwkJVFZQNTE1MF9DT0xPUl9LSUxfVEhTSF9DVEwsMHgxMAorCX0sCisJeyAvKiAweDA3ICovCisJCVRWUDUxNTBfTFVNQV9QUk9DX0NUTF8xLDB4NjAKKwl9LAorCXsgLyogMHgwOCAqLworCQlUVlA1MTUwX0xVTUFfUFJPQ19DVExfMiwweDAwCisJfSwKKwl7IC8qIDB4MDkgKi8KKwkJVFZQNTE1MF9CUklHSFRfQ1RMLDB4ODAKKwl9LAorCXsgLyogMHgwYSAqLworCQlUVlA1MTUwX1NBVFVSQVRJT05fQ1RMLDB4ODAKKwl9LAorCXsgLyogMHgwYiAqLworCQlUVlA1MTUwX0hVRV9DVEwsMHgwMAorCX0sCisJeyAvKiAweDBjICovCisJCVRWUDUxNTBfQ09OVFJBU1RfQ1RMLDB4ODAKKwl9LAorCXsgLyogMHgwZCAqLworCQlUVlA1MTUwX0RBVEFfUkFURV9TRUwsMHg0NworCX0sCisJeyAvKiAweDBlICovCisJCVRWUDUxNTBfTFVNQV9QUk9DX0NUTF8zLDB4MDAKKwl9LAorCXsgLyogMHgwZiAqLworCQlUVlA1MTUwX0NPTkZfU0hBUkVEX1BJTiwweDA4CisJfSwKKwl7IC8qIDB4MTEgKi8KKwkJVFZQNTE1MF9BQ1RfVkRfQ1JPUF9TVF9NU0IsMHgwMAorCX0sCisJeyAvKiAweDEyICovCisJCVRWUDUxNTBfQUNUX1ZEX0NST1BfU1RfTFNCLDB4MDAKKwl9LAorCXsgLyogMHgxMyAqLworCQlUVlA1MTUwX0FDVF9WRF9DUk9QX1NUUF9NU0IsMHgwMAorCX0sCisJeyAvKiAweDE0ICovCisJCVRWUDUxNTBfQUNUX1ZEX0NST1BfU1RQX0xTQiwweDAwCisJfSwKKwl7IC8qIDB4MTUgKi8KKwkJVFZQNTE1MF9HRU5MT0NLLDB4MDEKKwl9LAorCXsgLyogMHgxNiAqLworCQlUVlA1MTUwX0hPUklaX1NZTkNfU1RBUlQsMHg4MAorCX0sCisJeyAvKiAweDE4ICovCisJCVRWUDUxNTBfVkVSVF9CTEFOS0lOR19TVEFSVCwweDAwCisJfSwKKwl7IC8qIDB4MTkgKi8KKwkJVFZQNTE1MF9WRVJUX0JMQU5LSU5HX1NUT1AsMHgwMAorCX0sCisJeyAvKiAweDFhICovCisJCVRWUDUxNTBfQ0hST01BX1BST0NfQ1RMXzEsMHgwYworCX0sCisJeyAvKiAweDFiICovCisJCVRWUDUxNTBfQ0hST01BX1BST0NfQ1RMXzIsMHgxNAorCX0sCisJeyAvKiAweDFjICovCisJCVRWUDUxNTBfSU5UX1JFU0VUX1JFR19CLDB4MDAKKwl9LAorCXsgLyogMHgxZCAqLworCQlUVlA1MTUwX0lOVF9FTkFCTEVfUkVHX0IsMHgwMAorCX0sCisJeyAvKiAweDFlICovCisJCVRWUDUxNTBfSU5UVF9DT05GSUdfUkVHX0IsMHgwMAorCX0sCisJeyAvKiAweDI4ICovCisJCVRWUDUxNTBfVklERU9fU1RELDB4MDAKKwl9LAorCXsgLyogMHgyZSAqLworCQlUVlA1MTUwX01BQ1JPVklTSU9OX09OX0NUUiwweDBmCisJfSwKKwl7IC8qIDB4MmYgKi8KKwkJVFZQNTE1MF9NQUNST1ZJU0lPTl9PRkZfQ1RSLDB4MDEKKwl9LAorCXsgLyogMHhiYiAqLworCQlUVlA1MTUwX1RFTEVURVhUX0ZJTF9FTkEsMHgwMAorCX0sCisJeyAvKiAweGMwICovCisJCVRWUDUxNTBfSU5UX1NUQVRVU19SRUdfQSwweDAwCisJfSwKKwl7IC8qIDB4YzEgKi8KKwkJVFZQNTE1MF9JTlRfRU5BQkxFX1JFR19BLDB4MDAKKwl9LAorCXsgLyogMHhjMiAqLworCQlUVlA1MTUwX0lOVF9DT05GLDB4MDQKKwl9LAorCXsgLyogMHhjOCAqLworCQlUVlA1MTUwX0ZJRk9fSU5UX1RIUkVTSE9MRCwweDgwCisJfSwKKwl7IC8qIDB4YzkgKi8KKwkJVFZQNTE1MF9GSUZPX1JFU0VULDB4MDAKKwl9LAorCXsgLyogMHhjYSAqLworCQlUVlA1MTUwX0xJTkVfTlVNQkVSX0lOVCwweDAwCisJfSwKKwl7IC8qIDB4Y2IgKi8KKwkJVFZQNTE1MF9QSVhfQUxJR05fUkVHX0xPVywweDRlCisJfSwKKwl7IC8qIDB4Y2MgKi8KKwkJVFZQNTE1MF9QSVhfQUxJR05fUkVHX0hJR0gsMHgwMAorCX0sCisJeyAvKiAweGNkICovCisJCVRWUDUxNTBfRklGT19PVVRfQ1RSTCwweDAxCisJfSwKKwl7IC8qIDB4Y2YgKi8KKwkJVFZQNTE1MF9GVUxMX0ZJRUxEX0VOQV8xLDB4MDAKKwl9LAorCXsgLyogMHhkMCAqLworCQlUVlA1MTUwX0ZVTExfRklFTERfRU5BXzIsMHgwMAorCX0sCisJeyAvKiAweGZjICovCisJCVRWUDUxNTBfRlVMTF9GSUVMRF9NT0RFX1JFRywweDdmCisJfSwKKwl7IC8qIGVuZCBvZiBkYXRhICovCisJCTB4ZmYsMHhmZgorCX0KK307CisKKy8qIERlZmF1bHQgdmFsdWVzIGFzIHN1Z2VzdGVkIGF0IFRWUDUxNTBBTTEgZGF0YXNoZWV0ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19yZWdfdmFsdWUgdHZwNTE1MF9pbml0X2VuYWJsZVtdID0geworCXsKKwkJVFZQNTE1MF9DT05GX1NIQVJFRF9QSU4sIDIKKwl9LHsJLyogQXV0b21hdGljIG9mZnNldCBhbmQgQUdDIGVuYWJsZWQgKi8KKwkJVFZQNTE1MF9BTkFMX0NITF9DVEwsIDB4MTUKKwl9LHsJLyogQWN0aXZhdGUgWUNyQ2Igb3V0cHV0IDB4OSBvciAweGQgPyAqLworCQlUVlA1MTUwX01JU0NfQ1RMLCAweDZmCisJfSx7CS8qIEFjdGl2YXRlcyB2aWRlbyBzdGQgYXV0b2RldGVjdGlvbiBmb3IgYWxsIHN0YW5kYXJkcyAqLworCQlUVlA1MTUwX0FVVE9TV19NU0ssIDB4MAorCX0sewkvKiBEZWZhdWx0IGZvcm1hdDogMHg0Ny4gRm9yIDQ6MjoyOiAweDQwICovCisJCVRWUDUxNTBfREFUQV9SQVRFX1NFTCwgMHg0NworCX0seworCQlUVlA1MTUwX0NIUk9NQV9QUk9DX0NUTF8xLCAweDBjCisJfSx7CisJCVRWUDUxNTBfQ0hST01BX1BST0NfQ1RMXzIsIDB4NTQKKwl9LHsJLyogTm9uIGRvY3VtZW50ZWQsIGJ1dCBpbml0aWFsaXplZCBvbiBXaW5UViBVU0IyICovCisJCTB4MjcsIDB4MjAKKwl9LHsKKwkJMHhmZiwweGZmCisJfQorfTsKKworc3RydWN0IGkyY192YmlfcmFtX3ZhbHVlIHsKKwl1MTYgcmVnOworCXVuc2lnbmVkIGNoYXIgdmFsdWVzWzI2XTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX3ZiaV9yYW1fdmFsdWUgdmJpX3JhbV9kZWZhdWx0W10gPQoreworCXsweDAxMCwgLyogV1NUIFNFQ0FNIDYgKi8KKwkJeyAweGFhLCAweGFhLCAweGZmLCAweGZmICwgMHhlNywgMHgyZSwgMHgyMCwgMHgyNiwgMHhlNiwgMHhiNCwgMHgwZSwgMHgwLCAweDAsIDB4MCwgMHgxMCwgMHgwIH0KKwl9LAorCXsweDAzMCwgLyogV1NUIFBBTCBCIDYgKi8KKwkJeyAweGFhLCAweGFhLCAweGZmLCAweGZmICwgMHgyNywgMHgyZSwgMHgyMCwgMHgyYiwgMHhhNiwgMHg3MiwgMHgxMCwgMHgwLCAweDAsIDB4MCwgMHgxMCwgMHgwIH0KKwl9LAorCXsweDA1MCwgLyogV1NUIFBBTCBDIDYgKi8KKwkJeyAweGFhLCAweGFhLCAweGZmLCAweGZmICwgMHhlNywgMHgyZSwgMHgyMCwgMHgyMiwgMHhhNiwgMHg5OCwgMHgwZCwgMHgwLCAweDAsIDB4MCwgMHgxMCwgMHgwIH0KKwl9LAorCXsweDA3MCwgLyogV1NUIE5UU0MgNiAqLworCQl7IDB4YWEsIDB4YWEsIDB4ZmYsIDB4ZmYgLCAweDI3LCAweDJlLCAweDIwLCAweDIzLCAweDY5LCAweDkzLCAweDBkLCAweDAsIDB4MCwgMHgwLCAweDEwLCAweDAgfQorCX0sCisJezB4MDkwLCAvKiBOQUJUUywgTlRTQyA2ICovCisJCXsgMHhhYSwgMHhhYSwgMHhmZiwgMHhmZiAsIDB4ZTcsIDB4MmUsIDB4MjAsIDB4MjIsIDB4NjksIDB4OTMsIDB4MGQsIDB4MCwgMHgwLCAweDAsIDB4MTUsIDB4MCB9CisJfSwKKwl7MHgwYjAsIC8qIE5BQlRTLCBOVFNDLUogNiAqLworCQl7IDB4YWEsIDB4YWEsIDB4ZmYsIDB4ZmYgLCAweGE3LCAweDJlLCAweDIwLCAweDIzLCAweDY5LCAweDkzLCAweDBkLCAweDAsIDB4MCwgMHgwLCAweDEwLCAweDAgfQorCX0sCisJezB4MGQwLCAvKiBDQywgUEFML1NFQ0FNIDYgKi8KKwkJeyAweGFhLCAweDJhLCAweGZmLCAweDNmICwgMHgwNCwgMHg1MSwgMHg2ZSwgMHgwMiwgMHhhNiwgMHg3YiwgMHgwOSwgMHgwLCAweDAsIDB4MCwgMHgyNywgMHgwIH0KKwl9LAorCXsweDBmMCwgLyogQ0MsIE5UU0MgNiAqLworCQl7IDB4YWEsIDB4MmEsIDB4ZmYsIDB4M2YgLCAweDA0LCAweDUxLCAweDZlLCAweDAyLCAweDY5LCAweDhjLCAweDA5LCAweDAsIDB4MCwgMHgwLCAweDI3LCAweDAgfQorCX0sCisJezB4MTEwLCAvKiBXU1MsIFBBTC9TRUNBTSA2ICovCisJCXsgMHg1YiwgMHg1NSwgMHhjNSwgMHhmZiAsIDB4MCwgMHg3MSwgMHg2ZSwgMHg0MiwgMHhhNiwgMHhjZCwgMHgwZiwgMHgwLCAweDAsIDB4MCwgMHgzYSwgMHgwIH0KKwl9LAorCXsweDEzMCwgLyogV1NTLCBOVFNDIEMgKi8KKwkJeyAweDM4LCAweDAwLCAweDNmLCAweDAwICwgMHgwLCAweDcxLCAweDZlLCAweDQzLCAweDY5LCAweDdjLCAweDA4LCAweDAsIDB4MCwgMHgwLCAweDM5LCAweDAgfQorCX0sCisJezB4MTUwLCAvKiBWSVRDLCBQQUwvU0VDQU0gNiAqLworCQl7IDB4MCwgMHgwLCAweDAsIDB4MCAsIDB4MCwgMHg4ZiwgMHg2ZCwgMHg0OSwgMHhhNiwgMHg4NSwgMHgwOCwgMHgwLCAweDAsIDB4MCwgMHg0YywgMHgwIH0KKwl9LAorCXsweDE3MCwgLyogVklUQywgTlRTQyA2ICovCisJCXsgMHgwLCAweDAsIDB4MCwgMHgwICwgMHgwLCAweDhmLCAweDZkLCAweDQ5LCAweDY5LCAweDk0LCAweDA4LCAweDAsIDB4MCwgMHgwLCAweDRjLCAweDAgfQorCX0sCisJeyAodTE2KS0xIH0KK307CisKK3N0YXRpYyBpbnQgdHZwNTE1MF93cml0ZV9pbml0dGFiKHN0cnVjdCBpMmNfY2xpZW50ICpjLAorCQkJCSBjb25zdCBzdHJ1Y3QgaTJjX3JlZ192YWx1ZSAqcmVncykKK3sKKwl3aGlsZSAocmVncy0+cmVnICE9IDB4ZmYpIHsKKwkJdHZwNTE1MF93cml0ZShjLCByZWdzLT5yZWcsIHJlZ3MtPnZhbHVlKTsKKwkJcmVncysrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dnA1MTUwX3ZkcF9pbml0KHN0cnVjdCBpMmNfY2xpZW50ICpjLAorCQkJCSBjb25zdCBzdHJ1Y3QgaTJjX3ZiaV9yYW1fdmFsdWUgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBEaXNhYmxlIEZ1bGwgRmllbGQgKi8KKwl0dnA1MTUwX3dyaXRlKGMsIFRWUDUxNTBfRlVMTF9GSUVMRF9FTkFfMSwgMCk7CisKKwkvKiBCZWZvcmUgcHJvZ3JhbW1pbmcsIExpbmUgbW9kZSBzaG91bGQgYmUgYXQgMHhmZiAqLworCWZvciAoaT1UVlA1MTUwX0ZVTExfRklFTERfRU5BXzI7IGk8PVRWUDUxNTBfTElORV9NT0RFX1JFR180NDsgaSsrKQorCQl0dnA1MTUwX3dyaXRlKGMsIGksIDB4ZmYpOworCisJLyogTG9hZCBSYW0gVGFibGUgKi8KKwl3aGlsZSAocmVncy0+cmVnICE9ICh1MTYpLTEgKSB7CisJCXR2cDUxNTBfd3JpdGUoYywgVFZQNTE1MF9DT05GX1JBTV9BRERSX0hJR0gscmVncy0+cmVnPj44KTsKKwkJdHZwNTE1MF93cml0ZShjLCBUVlA1MTUwX0NPTkZfUkFNX0FERFJfTE9XLHJlZ3MtPnJlZyk7CisKKwkJZm9yIChpPTA7aTwxNjtpKyspCisJCQl0dnA1MTUwX3dyaXRlKGMsIFRWUDUxNTBfVkRQX0NPTkZfUkFNX0RBVEEscmVncy0+dmFsdWVzW2ldKTsKKworCQlyZWdzKys7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR2cDUxNTBfc2V0X3N0ZChzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdjRsMl9zdGRfaWQgc3RkKQogewogCXN0cnVjdCB0dnA1MTUwICpkZWNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCWludCBmbXQ9MDsKIAotCXR2cDUxNTBfd3JpdGUoYywgVFZQNTE1MF9DT05GX1NIQVJFRF9QSU4sIDIpOworCWRlY29kZXItPm5vcm09c3RkOwogCi0JLyogQXV0b21hdGljIG9mZnNldCBhbmQgQUdDIGVuYWJsZWQgKi8KLQl0dnA1MTUwX3dyaXRlKGMsIFRWUDUxNTBfQU5BTF9DSExfQ1RMLCAweDE1KTsKKwkvKiBGaXJzdCB0ZXN0cyBzaG91bGQgYmUgYWdhaW5zdCBzcGVjaWZpYyBzdGQgKi8KIAotCS8qIE5vcm1hbCBPcGVyYXRpb24gKi8KLS8vICAgICAgdHZwNTE1MF93cml0ZShjLCBUVlA1MTUwX09QX01PREVfQ1RMLCAweDAwKTsKKwlpZiAoc3RkID09IFY0TDJfU1REX0FMTCkgeworCQlmbXQ9MDsJLyogQXV0b2RldGVjdCBtb2RlICovCisJfSBlbHNlIGlmIChzdGQgJiBWNEwyX1NURF9OVFNDXzQ0MykgeworCQlmbXQ9MHhhOworCX0gZWxzZSBpZiAoc3RkICYgVjRMMl9TVERfUEFMX00pIHsKKwkJZm10PTB4NjsKKwl9IGVsc2UgaWYgKHN0ZCAmIChWNEwyX1NURF9QQUxfTnwgVjRMMl9TVERfUEFMX05jKSkgeworCQlmbXQ9MHg4OworCX0gZWxzZSB7CisJCS8qIFRoZW4sIHRlc3QgYWdhaW5zdCBnZW5lcmljIG9uZXMgKi8KKwkJaWYgKHN0ZCAmIFY0TDJfU1REX05UU0MpIHsKKwkJCWZtdD0weDI7CisJCX0gZWxzZSBpZiAoc3RkICYgVjRMMl9TVERfUEFMKSB7CisJCQlmbXQ9MHg0OworCQl9IGVsc2UgaWYgKHN0ZCAmIFY0TDJfU1REX1NFQ0FNKSB7CisJCQlmbXQ9MHhjOworCQl9CisJfQogCi0JLyogQWN0aXZhdGUgWUNyQ2Igb3V0cHV0IDB4OSBvciAweGQgPyAqLwotCXR2cDUxNTBfd3JpdGUoYywgVFZQNTE1MF9NSVNDX0NUTCwgMHg2Zik7CisJdHZwNTE1MF9kYmcoMSwiU2V0IHZpZGVvIHN0ZCByZWdpc3RlciB0byAlZC5cbiIsZm10KTsKKwl0dnA1MTUwX3dyaXRlKGMsIFRWUDUxNTBfVklERU9fU1RELCBmbXQpOwogCi0JLyogQWN0aXZhdGVzIHZpZGVvIHN0ZCBhdXRvZGV0ZWN0aW9uIGZvciBhbGwgc3RhbmRhcmRzICovCi0JdHZwNTE1MF93cml0ZShjLCBUVlA1MTUwX0FVVE9TV19NU0ssIDB4MCk7CisJcmV0dXJuIDA7Cit9CiAKLQkvKiBEZWZhdWx0IGZvcm1hdDogMHg0NywgNDoyOjI6IDB4NDAgKi8KLQl0dnA1MTUwX3dyaXRlKGMsIFRWUDUxNTBfREFUQV9SQVRFX1NFTCwgMHg0Nyk7CitzdGF0aWMgaW5saW5lIHZvaWQgdHZwNTE1MF9yZXNldChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3sKKwl1OCB0eXBlLCB2ZXJfNjU2LCBtc2JfaWQsIGxzYl9pZCwgbXNiX3JvbSwgbHNiX3JvbTsKKwlzdHJ1Y3QgdHZwNTE1MCAqZGVjb2RlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKIAorCXR5cGU9dHZwNTE1MF9yZWFkKGMsVFZQNTE1MF9BVVRPU1dfTVNLKTsKKwltc2JfaWQ9dHZwNTE1MF9yZWFkKGMsVFZQNTE1MF9NU0JfREVWX0lEKTsKKwlsc2JfaWQ9dHZwNTE1MF9yZWFkKGMsVFZQNTE1MF9MU0JfREVWX0lEKTsKKwltc2Jfcm9tPXR2cDUxNTBfcmVhZChjLFRWUDUxNTBfUk9NX01BSk9SX1ZFUik7CisJbHNiX3JvbT10dnA1MTUwX3JlYWQoYyxUVlA1MTUwX1JPTV9NSU5PUl9WRVIpOworCisJaWYgKHR5cGU9PTB4ZGMpIHsKKwkJdmVyXzY1Nj10dnA1MTUwX3JlYWQoYyxUVlA1MTUwX1JFVl9TRUxFQ1QpOworCQl0dnA1MTUwX2luZm8oInR2cCUwMnglMDJ4YW0xIGRldGVjdGVkIDY1NiB2ZXJzaW9uIGlzICVkLlxuIixtc2JfaWQsIGxzYl9pZCx2ZXJfNjU2KTsKKwl9IGVsc2UgaWYgKHR5cGU9PTB4ZmMpIHsKKwkJdHZwNTE1MF9pbmZvKCJ0dnAlMDJ4JTAyeGEgZGV0ZWN0ZWQuXG4iLG1zYl9pZCwgbHNiX2lkKTsKKwl9IGVsc2UgeworCQl0dnA1MTUwX2luZm8oInVua25vd24gdHZwJTAyeCUwMnggY2hpcCBkZXRlY3RlZCglZCkuXG4iLG1zYl9pZCxsc2JfaWQsdHlwZSk7CisJfQorCXR2cDUxNTBfaW5mbygiUm9tIHZlciBpcyAlZC4lZFxuIixtc2Jfcm9tLGxzYl9yb20pOworCisJLyogSW5pdGlhbGl6ZXMgVFZQNTE1MCB0byBpdHMgZGVmYXVsdCB2YWx1ZXMgKi8KKwl0dnA1MTUwX3dyaXRlX2luaXR0YWIoYywgdHZwNTE1MF9pbml0X2RlZmF1bHQpOworCisJLyogSW5pdGlhbGl6ZXMgVkRQIHJlZ2lzdGVycyAqLworCXR2cDUxNTBfdmRwX2luaXQoYywgdmJpX3JhbV9kZWZhdWx0KTsKKworCS8qIFNlbGVjdHMgZGVjb2RlciBpbnB1dCAqLwogCXR2cDUxNTBfc2VsbXV4KGMsIGRlY29kZXItPmlucHV0KTsKIAotCXR2cDUxNTBfd3JpdGUoYywgVFZQNTE1MF9DSFJPTUFfUFJPQ19DVExfMSwgMHgwYyk7Ci0JdHZwNTE1MF93cml0ZShjLCBUVlA1MTUwX0NIUk9NQV9QUk9DX0NUTF8yLCAweDU0KTsKKwkvKiBJbml0aWFsaXplcyBUVlA1MTUwIHRvIHN0cmVhbSBlbmFibGVkIHZhbHVlcyAqLworCXR2cDUxNTBfd3JpdGVfaW5pdHRhYihjLCB0dnA1MTUwX2luaXRfZW5hYmxlKTsKIAotCXR2cDUxNTBfd3JpdGUoYywgMHgyNywgMHgyMCk7CS8qID8/Pz8/Pz8/Pz8gKi8KLQotCXR2cDUxNTBfd3JpdGUoYywgVFZQNTE1MF9WSURFT19TVEQsIDB4MCk7CS8qIEF1dG8gc3dpdGNoICovCi0KKwkvKiBJbml0aWFsaXplIGltYWdlIHByZWZlcmVuY2VzICovCiAJdHZwNTE1MF93cml0ZShjLCBUVlA1MTUwX0JSSUdIVF9DVEwsIGRlY29kZXItPmJyaWdodCA+PiA4KTsKIAl0dnA1MTUwX3dyaXRlKGMsIFRWUDUxNTBfQ09OVFJBU1RfQ1RMLCBkZWNvZGVyLT5jb250cmFzdCA+PiA4KTsKIAl0dnA1MTUwX3dyaXRlKGMsIFRWUDUxNTBfU0FUVVJBVElPTl9DVEwsIGRlY29kZXItPmNvbnRyYXN0ID4+IDgpOwogCXR2cDUxNTBfd3JpdGUoYywgVFZQNTE1MF9IVUVfQ1RMLCAoZGVjb2Rlci0+aHVlIC0gMzI3NjgpID4+IDgpOworCisJdHZwNTE1MF9zZXRfc3RkKGMsIGRlY29kZXItPm5vcm0pOwogfTsKIAogc3RhdGljIGludCB0dnA1MTUwX2dldF9jdHJsKHN0cnVjdCBpMmNfY2xpZW50ICpjLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQpAQCAtNDk4LDkgKzgwMyw4IEBACiAJY2FzZSBWNEwyX0NJRF9IVUU6CiAJCWN0cmwtPnZhbHVlID0gdHZwNTE1MF9yZWFkKGMsIFRWUDUxNTBfSFVFX0NUTCk7CiAJCXJldHVybiAwOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwogCX0KKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIGludCB0dnA1MTUwX3NldF9jdHJsKHN0cnVjdCBpMmNfY2xpZW50ICpjLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQpAQCAtNTIwLDI4ICs4MjQsNTkgQEAKIAljYXNlIFY0TDJfQ0lEX0hVRToKIAkJdHZwNTE1MF93cml0ZShjLCBUVlA1MTUwX0hVRV9DVEwsIGN0cmwtPnZhbHVlKTsKIAkJcmV0dXJuIDA7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCXJldHVybiAtRUlOVkFMOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCQkJSTJDIENvbW1hbmQKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCB0dnA1MTUwX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKK3N0YXRpYyBpbnQgdHZwNTE1MF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjLAogCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewotCXN0cnVjdCB0dnA1MTUwICpkZWNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHR2cDUxNTAgKmRlY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CiAKIAlzd2l0Y2ggKGNtZCkgewogCiAJY2FzZSAwOgorCWNhc2UgVklESU9DX0lOVF9SRVNFVDoKIAljYXNlIERFQ09ERVJfSU5JVDoKLQkJdHZwNTE1MF9yZXNldChjbGllbnQpOworCQl0dnA1MTUwX3Jlc2V0KGMpOworCQlicmVhazsKKwljYXNlIFZJRElPQ19TX1NURDoKKwkJaWYgKGRlY29kZXItPm5vcm0gPT0gKih2NGwyX3N0ZF9pZCAqKWFyZykKKwkJCWJyZWFrOworCQlyZXR1cm4gdHZwNTE1MF9zZXRfc3RkKGMsICoodjRsMl9zdGRfaWQgKilhcmcpOworCWNhc2UgVklESU9DX0dfU1REOgorCQkqKHY0bDJfc3RkX2lkICopYXJnID0gZGVjb2Rlci0+bm9ybTsKIAkJYnJlYWs7CiAKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCisJY2FzZSBWSURJT0NfSU5UX0dfUkVHSVNURVI6CisJeworCQlzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVnID0gYXJnOworCisJCWlmIChyZWctPmkyY19pZCAhPSBJMkNfRFJJVkVSSURfVFZQNTE1MCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZWctPnZhbCA9IHR2cDUxNTBfcmVhZChjLCByZWctPnJlZyAmIDB4ZmYpOworCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ19JTlRfU19SRUdJU1RFUjoKKwl7CisJCXN0cnVjdCB2NGwyX3JlZ2lzdGVyICpyZWcgPSBhcmc7CisKKwkJaWYgKHJlZy0+aTJjX2lkICE9IEkyQ19EUklWRVJJRF9UVlA1MTUwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCXR2cDUxNTBfd3JpdGUoYywgcmVnLT5yZWcgJiAweGZmLCByZWctPnZhbCAmIDB4ZmYpOworCQlicmVhazsKKwl9CisjZW5kaWYKKwogCWNhc2UgREVDT0RFUl9EVU1QOgotCQlkdW1wX3JlZyhjbGllbnQpOworCQlkdW1wX3JlZyhjKTsKIAkJYnJlYWs7CiAKIAljYXNlIERFQ09ERVJfR0VUX0NBUEFCSUxJVElFUzoKQEAgLTYwMCw3ICs5MzUsNyBAQAogCQkJfQogCiAJCQlkZWNvZGVyLT5pbnB1dCA9ICppYXJnOwotCQkJdHZwNTE1MF9zZWxtdXgoY2xpZW50LCBkZWNvZGVyLT5pbnB1dCk7CisJCQl0dnA1MTUwX3NlbG11eChjLCBkZWNvZGVyLT5pbnB1dCk7CiAKIAkJCWJyZWFrOwogCQl9CkBAIC02MjAsMTkgKzk1NSwxOCBAQAogCiAJCQlkZWNvZGVyLT5lbmFibGUgPSAoKmlhcmcgIT0gMCk7CiAKLQkJCXR2cDUxNTBfc2VsbXV4KGNsaWVudCwgZGVjb2Rlci0+aW5wdXQpOworCQkJdHZwNTE1MF9zZWxtdXgoYywgZGVjb2Rlci0+aW5wdXQpOwogCiAJCQlicmVhazsKIAkJfQogCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKIAkJewogCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYyA9IGFyZzsKLQkJCXU4IGksIG47CisJCQlpbnQgaTsKIAotCQkJZHByaW50aygxLCBLRVJOX0RFQlVHICJWSURJT0NfUVVFUllDVFJMIik7CisJCQl0dnA1MTUwX2RiZygxLCAiVklESU9DX1FVRVJZQ1RSTCBjYWxsZWRcbiIpOwogCi0JCQluID0gc2l6ZW9mKHR2cDUxNTBfcWN0cmwpIC8gc2l6ZW9mKHR2cDUxNTBfcWN0cmxbMF0pOwotCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHR2cDUxNTBfcWN0cmwpOyBpKyspCiAJCQkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gdHZwNTE1MF9xY3RybFtpXS5pZCkgewogCQkJCQltZW1jcHkocWMsICYodHZwNTE1MF9xY3RybFtpXSksCiAJCQkJCSAgICAgICBzaXplb2YoKnFjKSk7CkBAIC02NDQsMTYgKzk3OCwxNCBAQAogCWNhc2UgVklESU9DX0dfQ1RSTDoKIAkJewogCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCA9IGFyZzsKLQkJCWRwcmludGsoMSwgS0VSTl9ERUJVRyAiVklESU9DX0dfQ1RSTCIpOworCQkJdHZwNTE1MF9kYmcoMSwgIlZJRElPQ19HX0NUUkwgY2FsbGVkXG4iKTsKIAotCQkJcmV0dXJuIHR2cDUxNTBfZ2V0X2N0cmwoY2xpZW50LCBjdHJsKTsKKwkJCXJldHVybiB0dnA1MTUwX2dldF9jdHJsKGMsIGN0cmwpOwogCQl9Ci0JY2FzZSBWSURJT0NfU19DVFJMX09MRDoJLyogPz8/ICovCiAJY2FzZSBWSURJT0NfU19DVFJMOgogCQl7CiAJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsID0gYXJnOwogCQkJdTggaSwgbjsKLQkJCWRwcmludGsoMSwgS0VSTl9ERUJVRyAiVklESU9DX1NfQ1RSTCIpOwogCQkJbiA9IHNpemVvZih0dnA1MTUwX3FjdHJsKSAvIHNpemVvZih0dnA1MTUwX3FjdHJsWzBdKTsKIAkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCiAJCQkJaWYgKGN0cmwtPmlkID09IHR2cDUxNTBfcWN0cmxbaV0uaWQpIHsKQEAgLTY2MiwxMSArOTk0LDEwIEBACiAJCQkJCSAgICB8fCBjdHJsLT52YWx1ZSA+CiAJCQkJCSAgICB0dnA1MTUwX3FjdHJsW2ldLm1heGltdW0pCiAJCQkJCQlyZXR1cm4gLUVSQU5HRTsKLQkJCQkJZHByaW50aygxLAotCQkJCQkJS0VSTl9ERUJVRwotCQkJCQkJIlZJRElPQ19TX0NUUkw6IGlkPSVkLCB2YWx1ZT0lZCIsCisJCQkJCXR2cDUxNTBfZGJnKDEsCisJCQkJCQkiVklESU9DX1NfQ1RSTDogaWQ9JWQsIHZhbHVlPSVkXG4iLAogCQkJCQkJY3RybC0+aWQsIGN0cmwtPnZhbHVlKTsKLQkJCQkJcmV0dXJuIHR2cDUxNTBfc2V0X2N0cmwoY2xpZW50LCBjdHJsKTsKKwkJCQkJcmV0dXJuIHR2cDUxNTBfc2V0X2N0cmwoYywgY3RybCk7CiAJCQkJfQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTY3NywyNSArMTAwOCwyNSBAQAogCQkJaWYgKGRlY29kZXItPmJyaWdodCAhPSBwaWMtPmJyaWdodG5lc3MpIHsKIAkJCQkvKiBXZSB3YW50IDAgdG8gMjU1IHdlIGdldCAwLTY1NTM1ICovCiAJCQkJZGVjb2Rlci0+YnJpZ2h0ID0gcGljLT5icmlnaHRuZXNzOwotCQkJCXR2cDUxNTBfd3JpdGUoY2xpZW50LCBUVlA1MTUwX0JSSUdIVF9DVEwsCisJCQkJdHZwNTE1MF93cml0ZShjLCBUVlA1MTUwX0JSSUdIVF9DVEwsCiAJCQkJCSAgICAgIGRlY29kZXItPmJyaWdodCA+PiA4KTsKIAkJCX0KIAkJCWlmIChkZWNvZGVyLT5jb250cmFzdCAhPSBwaWMtPmNvbnRyYXN0KSB7CiAJCQkJLyogV2Ugd2FudCAwIHRvIDI1NSB3ZSBnZXQgMC02NTUzNSAqLwogCQkJCWRlY29kZXItPmNvbnRyYXN0ID0gcGljLT5jb250cmFzdDsKLQkJCQl0dnA1MTUwX3dyaXRlKGNsaWVudCwgVFZQNTE1MF9DT05UUkFTVF9DVEwsCisJCQkJdHZwNTE1MF93cml0ZShjLCBUVlA1MTUwX0NPTlRSQVNUX0NUTCwKIAkJCQkJICAgICAgZGVjb2Rlci0+Y29udHJhc3QgPj4gOCk7CiAJCQl9CiAJCQlpZiAoZGVjb2Rlci0+c2F0ICE9IHBpYy0+Y29sb3VyKSB7CiAJCQkJLyogV2Ugd2FudCAwIHRvIDI1NSB3ZSBnZXQgMC02NTUzNSAqLwogCQkJCWRlY29kZXItPnNhdCA9IHBpYy0+Y29sb3VyOwotCQkJCXR2cDUxNTBfd3JpdGUoY2xpZW50LCBUVlA1MTUwX1NBVFVSQVRJT05fQ1RMLAorCQkJCXR2cDUxNTBfd3JpdGUoYywgVFZQNTE1MF9TQVRVUkFUSU9OX0NUTCwKIAkJCQkJICAgICAgZGVjb2Rlci0+Y29udHJhc3QgPj4gOCk7CiAJCQl9CiAJCQlpZiAoZGVjb2Rlci0+aHVlICE9IHBpYy0+aHVlKSB7CiAJCQkJLyogV2Ugd2FudCAtMTI4IHRvIDEyNyB3ZSBnZXQgMC02NTUzNSAqLwogCQkJCWRlY29kZXItPmh1ZSA9IHBpYy0+aHVlOwotCQkJCXR2cDUxNTBfd3JpdGUoY2xpZW50LCBUVlA1MTUwX0hVRV9DVEwsCisJCQkJdHZwNTE1MF93cml0ZShjLCBUVlA1MTUwX0hVRV9DVEwsCiAJCQkJCSAgICAgIChkZWNvZGVyLT5odWUgLSAzMjc2OCkgPj4gOCk7CiAJCQl9CiAJCQlicmVhazsKQEAgLTcyMCwxMiArMTA1MSwxMiBAQAogc3RhdGljIGludCB0dnA1MTUwX2RldGVjdF9jbGllbnQoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLAogCQkJCSBpbnQgYWRkcmVzcywgaW50IGtpbmQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqYzsKIAlzdHJ1Y3QgdHZwNTE1MCAqY29yZTsKIAlpbnQgcnY7CiAKLQlkcHJpbnRrKDEsCi0JCUtFUk5fSU5GTworCWlmIChkZWJ1ZykKKwkJcHJpbnRrKCBLRVJOX0lORk8KIAkJInR2cDUxNTAuYzogZGV0ZWN0aW5nIHR2cDUxNTAgY2xpZW50IG9uIGFkZHJlc3MgMHgleFxuIiwKIAkJYWRkcmVzcyA8PCAxKTsKIApAQCAtNzM4LDIyICsxMDY5LDIxIEBACiAJICAgICBJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEUgfCBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEEpKQogCQlyZXR1cm4gMDsKIAotCWNsaWVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGNsaWVudCA9PSAwKQorCWMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWlmIChjID09IDApCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbWNweShjbGllbnQsICZjbGllbnRfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOworCW1lbWNweShjLCAmY2xpZW50X3RlbXBsYXRlLCBzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKIAotCWNvcmUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHZwNTE1MCksIEdGUF9LRVJORUwpOworCWNvcmUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHZwNTE1MCksIEdGUF9LRVJORUwpOwogCWlmIChjb3JlID09IDApIHsKLQkJa2ZyZWUoY2xpZW50KTsKKwkJa2ZyZWUoYyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQoY29yZSwgMCwgc2l6ZW9mKHN0cnVjdCB0dnA1MTUwKSk7Ci0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgY29yZSk7CisJaTJjX3NldF9jbGllbnRkYXRhKGMsIGNvcmUpOwogCi0JcnYgPSBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpOworCXJ2ID0gaTJjX2F0dGFjaF9jbGllbnQoYyk7CiAKLQljb3JlLT5ub3JtID0gVklERU9fTU9ERV9BVVRPOworCWNvcmUtPm5vcm0gPSBWNEwyX1NURF9BTEw7CiAJY29yZS0+aW5wdXQgPSAyOwogCWNvcmUtPmVuYWJsZSA9IDE7CiAJY29yZS0+YnJpZ2h0ID0gMzI3Njg7CkBAIC03NjIsMzcgKzEwOTIsNDEgQEAKIAljb3JlLT5zYXQgPSAzMjc2ODsKIAogCWlmIChydikgewotCQlrZnJlZShjbGllbnQpOworCQlrZnJlZShjKTsKIAkJa2ZyZWUoY29yZSk7CiAJCXJldHVybiBydjsKIAl9CiAKIAlpZiAoZGVidWcgPiAxKQotCQlkdW1wX3JlZyhjbGllbnQpOworCQlkdW1wX3JlZyhjKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB0dnA1MTUwX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlkcHJpbnRrKDEsCi0JCUtFUk5fSU5GTworCWlmIChkZWJ1ZykKKwkJcHJpbnRrKCBLRVJOX0lORk8KIAkJInR2cDUxNTAuYzogc3RhcnRpbmcgcHJvYmUgZm9yIGFkYXB0ZXIgJXMgKDB4JXgpXG4iLAogCQlhZGFwdGVyLT5uYW1lLCBhZGFwdGVyLT5pZCk7CiAJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCAmdHZwNTE1MF9kZXRlY3RfY2xpZW50KTsKIH0KIAotc3RhdGljIGludCB0dnA1MTUwX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgdHZwNTE1MF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjKQogewotCXN0cnVjdCB0dnA1MTUwICpkZWNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHR2cDUxNTAgKmRlY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CiAJaW50IGVycjsKIAotCWVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJdHZwNTE1MF9kYmcoMSwKKwkJInR2cDUxNTAuYzogcmVtb3ZpbmcgdHZwNTE1MCBhZGFwdGVyIG9uIGFkZHJlc3MgMHgleFxuIiwKKwkJYy0+YWRkciA8PCAxKTsKKworCWVyciA9IGkyY19kZXRhY2hfY2xpZW50KGMpOwogCWlmIChlcnIpIHsKIAkJcmV0dXJuIGVycjsKIAl9CiAKIAlrZnJlZShkZWNvZGVyKTsKLQlrZnJlZShjbGllbnQpOworCWtmcmVlKGMpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04MDMsOSArMTEzNyw3IEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAidHZwNTE1MCIsCiAJfSwKLQotCS8qIEZJWE1FICovCi0JLmlkID0gSTJDX0RSSVZFUklEX1NBQTcxMTAsCisJLmlkID0gSTJDX0RSSVZFUklEX1RWUDUxNTAsCiAKIAkuYXR0YWNoX2FkYXB0ZXIgPSB0dnA1MTUwX2F0dGFjaF9hZGFwdGVyLAogCS5kZXRhY2hfY2xpZW50ID0gdHZwNTE1MF9kZXRhY2hfY2xpZW50LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwxLWNvbXBhdC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwxLWNvbXBhdC5jCmluZGV4IDQxMzQ1NDkuLjQ3NGEyOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMS1jb21wYXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDEtY29tcGF0LmMKQEAgLTMwNSw5ICszMDUsOCBAQAogCXsKIAkJc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgKmNhcCA9IGFyZzsKIAotCQljYXAyID0ga21hbGxvYyhzaXplb2YoKmNhcDIpLEdGUF9LRVJORUwpOworCQljYXAyID0ga3phbGxvYyhzaXplb2YoKmNhcDIpLEdGUF9LRVJORUwpOwogCQltZW1zZXQoY2FwLCAwLCBzaXplb2YoKmNhcCkpOwotCQltZW1zZXQoY2FwMiwgMCwgc2l6ZW9mKCpjYXAyKSk7CiAJCW1lbXNldCgmZmJ1ZjIsIDAsIHNpemVvZihmYnVmMikpOwogCiAJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX1FVRVJZQ0FQLCBjYXAyKTsKQEAgLTQyMiw5ICs0MjEsOCBAQAogCXsKIAkJc3RydWN0IHZpZGVvX3dpbmRvdwkqd2luID0gYXJnOwogCi0JCWZtdDIgPSBrbWFsbG9jKHNpemVvZigqZm10MiksR0ZQX0tFUk5FTCk7CisJCWZtdDIgPSBremFsbG9jKHNpemVvZigqZm10MiksR0ZQX0tFUk5FTCk7CiAJCW1lbXNldCh3aW4sMCxzaXplb2YoKndpbikpOwotCQltZW1zZXQoZm10MiwwLHNpemVvZigqZm10MikpOwogCiAJCWZtdDItPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk7CiAJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX0dfRk1ULCBmbXQyKTsKQEAgLTQ2MSw4ICs0NTksNyBAQAogCQlzdHJ1Y3QgdmlkZW9fd2luZG93CSp3aW4gPSBhcmc7CiAJCWludCBlcnIxLGVycjI7CiAKLQkJZm10MiA9IGttYWxsb2Moc2l6ZW9mKCpmbXQyKSxHRlBfS0VSTkVMKTsKLQkJbWVtc2V0KGZtdDIsMCxzaXplb2YoKmZtdDIpKTsKKwkJZm10MiA9IGt6YWxsb2Moc2l6ZW9mKCpmbXQyKSxHRlBfS0VSTkVMKTsKIAkJZm10Mi0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKIAkJZHJ2KGlub2RlLCBmaWxlLCBWSURJT0NfU1RSRUFNT0ZGLCAmZm10Mi0+dHlwZSk7CiAJCWVycjEgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19HX0ZNVCwgZm10Mik7CkBAIC01OTUsOCArNTkyLDcgQEAKIAkJcGljdC0+d2hpdGVuZXNzID0gZ2V0X3Y0bF9jb250cm9sKGlub2RlLCBmaWxlLAogCQkJCQkJICBWNEwyX0NJRF9XSElURU5FU1MsIGRydik7CiAKLQkJZm10MiA9IGttYWxsb2Moc2l6ZW9mKCpmbXQyKSxHRlBfS0VSTkVMKTsKLQkJbWVtc2V0KGZtdDIsMCxzaXplb2YoKmZtdDIpKTsKKwkJZm10MiA9IGt6YWxsb2Moc2l6ZW9mKCpmbXQyKSxHRlBfS0VSTkVMKTsKIAkJZm10Mi0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKIAkJZXJyID0gZHJ2KGlub2RlLCBmaWxlLCBWSURJT0NfR19GTVQsIGZtdDIpOwogCQlpZiAoZXJyIDwgMCkgewpAQCAtNjIyLDggKzYxOCw3IEBACiAJCXNldF92NGxfY29udHJvbChpbm9kZSwgZmlsZSwKIAkJCQlWNEwyX0NJRF9XSElURU5FU1MsIHBpY3QtPndoaXRlbmVzcywgZHJ2KTsKIAotCQlmbXQyID0ga21hbGxvYyhzaXplb2YoKmZtdDIpLEdGUF9LRVJORUwpOwotCQltZW1zZXQoZm10MiwwLHNpemVvZigqZm10MikpOworCQlmbXQyID0ga3phbGxvYyhzaXplb2YoKmZtdDIpLEdGUF9LRVJORUwpOwogCQlmbXQyLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwogCQllcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19HX0ZNVCwgZm10Mik7CiAJCWlmIChlcnIgPCAwKQpAQCAtODQ2LDkgKzg0MSw4IEBACiAJewogCQlzdHJ1Y3QgdmlkZW9fbW1hcAkqbW0gPSBhcmc7CiAKLQkJZm10MiA9IGttYWxsb2Moc2l6ZW9mKCpmbXQyKSxHRlBfS0VSTkVMKTsKKwkJZm10MiA9IGt6YWxsb2Moc2l6ZW9mKCpmbXQyKSxHRlBfS0VSTkVMKTsKIAkJbWVtc2V0KCZidWYyLDAsc2l6ZW9mKGJ1ZjIpKTsKLQkJbWVtc2V0KGZtdDIsMCxzaXplb2YoKmZtdDIpKTsKIAogCQlmbXQyLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwogCQllcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19HX0ZNVCwgZm10Mik7CkBAIC05NDIsOCArOTM2LDcgQEAKIAl7CiAJCXN0cnVjdCB2YmlfZm9ybWF0ICAgICAgKmZtdCA9IGFyZzsKIAotCQlmbXQyID0ga21hbGxvYyhzaXplb2YoKmZtdDIpLEdGUF9LRVJORUwpOwotCQltZW1zZXQoZm10MiwgMCwgc2l6ZW9mKCpmbXQyKSk7CisJCWZtdDIgPSBremFsbG9jKHNpemVvZigqZm10MiksR0ZQX0tFUk5FTCk7CiAJCWZtdDItPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOwogCiAJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX0dfRk1ULCBmbXQyKTsKQEAgLTk1MSw2ICs5NDQsMTAgQEAKIAkJCWRwcmludGsoIlZJRElPQ0dWQklGTVQgLyBWSURJT0NfR19GTVQ6ICVkXG4iLCBlcnIpOwogCQkJYnJlYWs7CiAJCX0KKwkJaWYgKGZtdDItPmZtdC52Ymkuc2FtcGxlX2Zvcm1hdCAhPSBWNEwyX1BJWF9GTVRfR1JFWSkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CiAJCW1lbXNldChmbXQsIDAsIHNpemVvZigqZm10KSk7CiAJCWZtdC0+c2FtcGxlc19wZXJfbGluZSA9IGZtdDItPmZtdC52Ymkuc2FtcGxlc19wZXJfbGluZTsKIAkJZm10LT5zYW1wbGluZ19yYXRlICAgID0gZm10Mi0+Zm10LnZiaS5zYW1wbGluZ19yYXRlOwpAQCAtOTY2LDggKzk2MywxMiBAQAogCXsKIAkJc3RydWN0IHZiaV9mb3JtYXQgICAgICAqZm10ID0gYXJnOwogCi0JCWZtdDIgPSBrbWFsbG9jKHNpemVvZigqZm10MiksR0ZQX0tFUk5FTCk7Ci0JCW1lbXNldChmbXQyLCAwLCBzaXplb2YoKmZtdDIpKTsKKwkJaWYgKFZJREVPX1BBTEVUVEVfUkFXICE9IGZtdC0+c2FtcGxlX2Zvcm1hdCkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJZm10MiA9IGt6YWxsb2Moc2l6ZW9mKCpmbXQyKSxHRlBfS0VSTkVMKTsKIAogCQlmbXQyLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRTsKIAkJZm10Mi0+Zm10LnZiaS5zYW1wbGVzX3Blcl9saW5lID0gZm10LT5zYW1wbGVzX3Blcl9saW5lOwpAQCAtOTg2LDcgKzk4Nyw3IEBACiAKIAkJaWYgKGZtdDItPmZtdC52Ymkuc2FtcGxlc19wZXJfbGluZSAhPSBmbXQtPnNhbXBsZXNfcGVyX2xpbmUgfHwKIAkJICAgIGZtdDItPmZtdC52Ymkuc2FtcGxpbmdfcmF0ZSAgICAhPSBmbXQtPnNhbXBsaW5nX3JhdGUgICAgfHwKLQkJICAgIFZJREVPX1BBTEVUVEVfUkFXICAgICAgICAgICAgICAhPSBmbXQtPnNhbXBsZV9mb3JtYXQgICAgfHwKKwkJICAgIGZtdDItPmZtdC52Ymkuc2FtcGxlX2Zvcm1hdCAgICAhPSBWNEwyX1BJWF9GTVRfR1JFWSAgICAgfHwKIAkJICAgIGZtdDItPmZtdC52Ymkuc3RhcnRbMF0gICAgICAgICAhPSBmbXQtPnN0YXJ0WzBdICAgICAgICAgfHwKIAkJICAgIGZtdDItPmZtdC52YmkuY291bnRbMF0gICAgICAgICAhPSBmbXQtPmNvdW50WzBdICAgICAgICAgfHwKIAkJICAgIGZtdDItPmZtdC52Ymkuc3RhcnRbMV0gICAgICAgICAhPSBmbXQtPnN0YXJ0WzFdICAgICAgICAgfHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21tb24uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21tb24uYwppbmRleCA1OTdiOGRiLi5jZDJjNDQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tbW9uLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbW1vbi5jCkBAIC01OCw2ICs1OCw4IEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KIAogI2lmZGVmIENPTkZJR19LTU9ECiAjaW5jbHVkZSA8bGludXgva21vZC5oPgpAQCAtMTkwLDU3ICsxOTIsMTc1IEBACiAJW1Y0TDJfQlVGX1RZUEVfVkJJX09VVFBVVF0gICAgPSAidmJpLW91dCIsCiB9OwogCi1jaGFyICp2NGwyX2lvY3RsX25hbWVzWzI1Nl0gPSB7Ci0jaWYgX19HTlVDX18gPj0gMwotCVswIC4uLiAyNTVdICAgICAgICAgICAgICAgICAgICAgID0gIlVOS05PV04iLAotI2VuZGlmCi0JW19JT0NfTlIoVklESU9DX1FVRVJZQ0FQKV0gICAgICAgPSAiVklESU9DX1FVRVJZQ0FQIiwKLQlbX0lPQ19OUihWSURJT0NfUkVTRVJWRUQpXSAgICAgICA9ICJWSURJT0NfUkVTRVJWRUQiLAotCVtfSU9DX05SKFZJRElPQ19FTlVNX0ZNVCldICAgICAgID0gIlZJRElPQ19FTlVNX0ZNVCIsCi0JW19JT0NfTlIoVklESU9DX0dfRk1UKV0gICAgICAgICAgPSAiVklESU9DX0dfRk1UIiwKLQlbX0lPQ19OUihWSURJT0NfU19GTVQpXSAgICAgICAgICA9ICJWSURJT0NfU19GTVQiLAotCVtfSU9DX05SKFZJRElPQ19SRVFCVUZTKV0gICAgICAgID0gIlZJRElPQ19SRVFCVUZTIiwKLQlbX0lPQ19OUihWSURJT0NfUVVFUllCVUYpXSAgICAgICA9ICJWSURJT0NfUVVFUllCVUYiLAotCVtfSU9DX05SKFZJRElPQ19HX0ZCVUYpXSAgICAgICAgID0gIlZJRElPQ19HX0ZCVUYiLAotCVtfSU9DX05SKFZJRElPQ19TX0ZCVUYpXSAgICAgICAgID0gIlZJRElPQ19TX0ZCVUYiLAotCVtfSU9DX05SKFZJRElPQ19PVkVSTEFZKV0gICAgICAgID0gIlZJRElPQ19PVkVSTEFZIiwKLQlbX0lPQ19OUihWSURJT0NfUUJVRildICAgICAgICAgICA9ICJWSURJT0NfUUJVRiIsCi0JW19JT0NfTlIoVklESU9DX0RRQlVGKV0gICAgICAgICAgPSAiVklESU9DX0RRQlVGIiwKLQlbX0lPQ19OUihWSURJT0NfU1RSRUFNT04pXSAgICAgICA9ICJWSURJT0NfU1RSRUFNT04iLAotCVtfSU9DX05SKFZJRElPQ19TVFJFQU1PRkYpXSAgICAgID0gIlZJRElPQ19TVFJFQU1PRkYiLAotCVtfSU9DX05SKFZJRElPQ19HX1BBUk0pXSAgICAgICAgID0gIlZJRElPQ19HX1BBUk0iLAotCVtfSU9DX05SKFZJRElPQ19TX1BBUk0pXSAgICAgICAgID0gIlZJRElPQ19TX1BBUk0iLAotCVtfSU9DX05SKFZJRElPQ19HX1NURCldICAgICAgICAgID0gIlZJRElPQ19HX1NURCIsCi0JW19JT0NfTlIoVklESU9DX1NfU1REKV0gICAgICAgICAgPSAiVklESU9DX1NfU1REIiwKLQlbX0lPQ19OUihWSURJT0NfRU5VTVNURCldICAgICAgICA9ICJWSURJT0NfRU5VTVNURCIsCi0JW19JT0NfTlIoVklESU9DX0VOVU1JTlBVVCldICAgICAgPSAiVklESU9DX0VOVU1JTlBVVCIsCi0JW19JT0NfTlIoVklESU9DX0dfQ1RSTCldICAgICAgICAgPSAiVklESU9DX0dfQ1RSTCIsCi0JW19JT0NfTlIoVklESU9DX1NfQ1RSTCldICAgICAgICAgPSAiVklESU9DX1NfQ1RSTCIsCi0JW19JT0NfTlIoVklESU9DX0dfVFVORVIpXSAgICAgICAgPSAiVklESU9DX0dfVFVORVIiLAotCVtfSU9DX05SKFZJRElPQ19TX1RVTkVSKV0gICAgICAgID0gIlZJRElPQ19TX1RVTkVSIiwKLQlbX0lPQ19OUihWSURJT0NfR19BVURJTyldICAgICAgICA9ICJWSURJT0NfR19BVURJTyIsCi0JW19JT0NfTlIoVklESU9DX1NfQVVESU8pXSAgICAgICAgPSAiVklESU9DX1NfQVVESU8iLAotCVtfSU9DX05SKFZJRElPQ19RVUVSWUNUUkwpXSAgICAgID0gIlZJRElPQ19RVUVSWUNUUkwiLAotCVtfSU9DX05SKFZJRElPQ19RVUVSWU1FTlUpXSAgICAgID0gIlZJRElPQ19RVUVSWU1FTlUiLAotCVtfSU9DX05SKFZJRElPQ19HX0lOUFVUKV0gICAgICAgID0gIlZJRElPQ19HX0lOUFVUIiwKLQlbX0lPQ19OUihWSURJT0NfU19JTlBVVCldICAgICAgICA9ICJWSURJT0NfU19JTlBVVCIsCi0JW19JT0NfTlIoVklESU9DX0dfT1VUUFVUKV0gICAgICAgPSAiVklESU9DX0dfT1VUUFVUIiwKLQlbX0lPQ19OUihWSURJT0NfU19PVVRQVVQpXSAgICAgICA9ICJWSURJT0NfU19PVVRQVVQiLAotCVtfSU9DX05SKFZJRElPQ19FTlVNT1VUUFVUKV0gICAgID0gIlZJRElPQ19FTlVNT1VUUFVUIiwKLQlbX0lPQ19OUihWSURJT0NfR19BVURPVVQpXSAgICAgICA9ICJWSURJT0NfR19BVURPVVQiLAotCVtfSU9DX05SKFZJRElPQ19TX0FVRE9VVCldICAgICAgID0gIlZJRElPQ19TX0FVRE9VVCIsCi0JW19JT0NfTlIoVklESU9DX0dfTU9EVUxBVE9SKV0gICAgPSAiVklESU9DX0dfTU9EVUxBVE9SIiwKLQlbX0lPQ19OUihWSURJT0NfU19NT0RVTEFUT1IpXSAgICA9ICJWSURJT0NfU19NT0RVTEFUT1IiLAotCVtfSU9DX05SKFZJRElPQ19HX0ZSRVFVRU5DWSldICAgID0gIlZJRElPQ19HX0ZSRVFVRU5DWSIsCi0JW19JT0NfTlIoVklESU9DX1NfRlJFUVVFTkNZKV0gICAgPSAiVklESU9DX1NfRlJFUVVFTkNZIiwKLQlbX0lPQ19OUihWSURJT0NfQ1JPUENBUCldICAgICAgICA9ICJWSURJT0NfQ1JPUENBUCIsCi0JW19JT0NfTlIoVklESU9DX0dfQ1JPUCldICAgICAgICAgPSAiVklESU9DX0dfQ1JPUCIsCi0JW19JT0NfTlIoVklESU9DX1NfQ1JPUCldICAgICAgICAgPSAiVklESU9DX1NfQ1JPUCIsCi0JW19JT0NfTlIoVklESU9DX0dfSlBFR0NPTVApXSAgICAgPSAiVklESU9DX0dfSlBFR0NPTVAiLAotCVtfSU9DX05SKFZJRElPQ19TX0pQRUdDT01QKV0gICAgID0gIlZJRElPQ19TX0pQRUdDT01QIiwKLQlbX0lPQ19OUihWSURJT0NfUVVFUllTVEQpXSAgICAgICA9ICJWSURJT0NfUVVFUllTVEQiLAotCVtfSU9DX05SKFZJRElPQ19UUllfRk1UKV0gICAgICAgID0gIlZJRElPQ19UUllfRk1UIiwKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZGVidWcgaGVscCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZmRlZiBIQVZFX1Y0TDEKK3N0YXRpYyBjb25zdCBjaGFyICp2NGwxX2lvY3Rsc1tdID0geworCVtfSU9DX05SKFZJRElPQ0dDQVApXSAgICAgICA9ICJWSURJT0NHQ0FQIiwKKwlbX0lPQ19OUihWSURJT0NHQ0hBTildICAgICAgPSAiVklESU9DR0NIQU4iLAorCVtfSU9DX05SKFZJRElPQ1NDSEFOKV0gICAgICA9ICJWSURJT0NTQ0hBTiIsCisJW19JT0NfTlIoVklESU9DR1RVTkVSKV0gICAgID0gIlZJRElPQ0dUVU5FUiIsCisJW19JT0NfTlIoVklESU9DU1RVTkVSKV0gICAgID0gIlZJRElPQ1NUVU5FUiIsCisJW19JT0NfTlIoVklESU9DR1BJQ1QpXSAgICAgID0gIlZJRElPQ0dQSUNUIiwKKwlbX0lPQ19OUihWSURJT0NTUElDVCldICAgICAgPSAiVklESU9DU1BJQ1QiLAorCVtfSU9DX05SKFZJRElPQ0NBUFRVUkUpXSAgICA9ICJWSURJT0NDQVBUVVJFIiwKKwlbX0lPQ19OUihWSURJT0NHV0lOKV0gICAgICAgPSAiVklESU9DR1dJTiIsCisJW19JT0NfTlIoVklESU9DU1dJTildICAgICAgID0gIlZJRElPQ1NXSU4iLAorCVtfSU9DX05SKFZJRElPQ0dGQlVGKV0gICAgICA9ICJWSURJT0NHRkJVRiIsCisJW19JT0NfTlIoVklESU9DU0ZCVUYpXSAgICAgID0gIlZJRElPQ1NGQlVGIiwKKwlbX0lPQ19OUihWSURJT0NLRVkpXSAgICAgICAgPSAiVklESU9DS0VZIiwKKwlbX0lPQ19OUihWSURJT0NHRlJFUSldICAgICAgPSAiVklESU9DR0ZSRVEiLAorCVtfSU9DX05SKFZJRElPQ1NGUkVRKV0gICAgICA9ICJWSURJT0NTRlJFUSIsCisJW19JT0NfTlIoVklESU9DR0FVRElPKV0gICAgID0gIlZJRElPQ0dBVURJTyIsCisJW19JT0NfTlIoVklESU9DU0FVRElPKV0gICAgID0gIlZJRElPQ1NBVURJTyIsCisJW19JT0NfTlIoVklESU9DU1lOQyldICAgICAgID0gIlZJRElPQ1NZTkMiLAorCVtfSU9DX05SKFZJRElPQ01DQVBUVVJFKV0gICA9ICJWSURJT0NNQ0FQVFVSRSIsCisJW19JT0NfTlIoVklESU9DR01CVUYpXSAgICAgID0gIlZJRElPQ0dNQlVGIiwKKwlbX0lPQ19OUihWSURJT0NHVU5JVCldICAgICAgPSAiVklESU9DR1VOSVQiLAorCVtfSU9DX05SKFZJRElPQ0dDQVBUVVJFKV0gICA9ICJWSURJT0NHQ0FQVFVSRSIsCisJW19JT0NfTlIoVklESU9DU0NBUFRVUkUpXSAgID0gIlZJRElPQ1NDQVBUVVJFIiwKKwlbX0lPQ19OUihWSURJT0NTUExBWU1PREUpXSAgPSAiVklESU9DU1BMQVlNT0RFIiwKKwlbX0lPQ19OUihWSURJT0NTV1JJVEVNT0RFKV0gPSAiVklESU9DU1dSSVRFTU9ERSIsCisJW19JT0NfTlIoVklESU9DR1BMQVlJTkZPKV0gID0gIlZJRElPQ0dQTEFZSU5GTyIsCisJW19JT0NfTlIoVklESU9DU01JQ1JPQ09ERSldID0gIlZJRElPQ1NNSUNST0NPREUiLAorCVtfSU9DX05SKFZJRElPQ0dWQklGTVQpXSAgICA9ICJWSURJT0NHVkJJRk1UIiwKKwlbX0lPQ19OUihWSURJT0NTVkJJRk1UKV0gICAgPSAiVklESU9DU1ZCSUZNVCIKIH07CisjZGVmaW5lIFY0TDFfSU9DVExTIEFSUkFZX1NJWkUodjRsMV9pb2N0bHMpCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgKnY0bDJfaW9jdGxzW10gPSB7CisJW19JT0NfTlIoVklESU9DX1FVRVJZQ0FQKV0gICAgICAgICA9ICJWSURJT0NfUVVFUllDQVAiLAorCVtfSU9DX05SKFZJRElPQ19SRVNFUlZFRCldICAgICAgICAgPSAiVklESU9DX1JFU0VSVkVEIiwKKwlbX0lPQ19OUihWSURJT0NfRU5VTV9GTVQpXSAgICAgICAgID0gIlZJRElPQ19FTlVNX0ZNVCIsCisJW19JT0NfTlIoVklESU9DX0dfRk1UKV0gICAgICAgICAgICA9ICJWSURJT0NfR19GTVQiLAorCVtfSU9DX05SKFZJRElPQ19TX0ZNVCldICAgICAgICAgICAgPSAiVklESU9DX1NfRk1UIiwKKwlbX0lPQ19OUihWSURJT0NfR19NUEVHQ09NUCldICAgICAgID0gIlZJRElPQ19HX01QRUdDT01QIiwKKwlbX0lPQ19OUihWSURJT0NfU19NUEVHQ09NUCldICAgICAgID0gIlZJRElPQ19TX01QRUdDT01QIiwKKwlbX0lPQ19OUihWSURJT0NfUkVRQlVGUyldICAgICAgICAgID0gIlZJRElPQ19SRVFCVUZTIiwKKwlbX0lPQ19OUihWSURJT0NfUVVFUllCVUYpXSAgICAgICAgID0gIlZJRElPQ19RVUVSWUJVRiIsCisJW19JT0NfTlIoVklESU9DX0dfRkJVRildICAgICAgICAgICA9ICJWSURJT0NfR19GQlVGIiwKKwlbX0lPQ19OUihWSURJT0NfU19GQlVGKV0gICAgICAgICAgID0gIlZJRElPQ19TX0ZCVUYiLAorCVtfSU9DX05SKFZJRElPQ19PVkVSTEFZKV0gICAgICAgICAgPSAiVklESU9DX09WRVJMQVkiLAorCVtfSU9DX05SKFZJRElPQ19RQlVGKV0gICAgICAgICAgICAgPSAiVklESU9DX1FCVUYiLAorCVtfSU9DX05SKFZJRElPQ19EUUJVRildICAgICAgICAgICAgPSAiVklESU9DX0RRQlVGIiwKKwlbX0lPQ19OUihWSURJT0NfU1RSRUFNT04pXSAgICAgICAgID0gIlZJRElPQ19TVFJFQU1PTiIsCisJW19JT0NfTlIoVklESU9DX1NUUkVBTU9GRildICAgICAgICA9ICJWSURJT0NfU1RSRUFNT0ZGIiwKKwlbX0lPQ19OUihWSURJT0NfR19QQVJNKV0gICAgICAgICAgID0gIlZJRElPQ19HX1BBUk0iLAorCVtfSU9DX05SKFZJRElPQ19TX1BBUk0pXSAgICAgICAgICAgPSAiVklESU9DX1NfUEFSTSIsCisJW19JT0NfTlIoVklESU9DX0dfU1REKV0gICAgICAgICAgICA9ICJWSURJT0NfR19TVEQiLAorCVtfSU9DX05SKFZJRElPQ19TX1NURCldICAgICAgICAgICAgPSAiVklESU9DX1NfU1REIiwKKwlbX0lPQ19OUihWSURJT0NfRU5VTVNURCldICAgICAgICAgID0gIlZJRElPQ19FTlVNU1REIiwKKwlbX0lPQ19OUihWSURJT0NfRU5VTUlOUFVUKV0gICAgICAgID0gIlZJRElPQ19FTlVNSU5QVVQiLAorCVtfSU9DX05SKFZJRElPQ19HX0NUUkwpXSAgICAgICAgICAgPSAiVklESU9DX0dfQ1RSTCIsCisJW19JT0NfTlIoVklESU9DX1NfQ1RSTCldICAgICAgICAgICA9ICJWSURJT0NfU19DVFJMIiwKKwlbX0lPQ19OUihWSURJT0NfR19UVU5FUildICAgICAgICAgID0gIlZJRElPQ19HX1RVTkVSIiwKKwlbX0lPQ19OUihWSURJT0NfU19UVU5FUildICAgICAgICAgID0gIlZJRElPQ19TX1RVTkVSIiwKKwlbX0lPQ19OUihWSURJT0NfR19BVURJTyldICAgICAgICAgID0gIlZJRElPQ19HX0FVRElPIiwKKwlbX0lPQ19OUihWSURJT0NfU19BVURJTyldICAgICAgICAgID0gIlZJRElPQ19TX0FVRElPIiwKKwlbX0lPQ19OUihWSURJT0NfUVVFUllDVFJMKV0gICAgICAgID0gIlZJRElPQ19RVUVSWUNUUkwiLAorCVtfSU9DX05SKFZJRElPQ19RVUVSWU1FTlUpXSAgICAgICAgPSAiVklESU9DX1FVRVJZTUVOVSIsCisJW19JT0NfTlIoVklESU9DX0dfSU5QVVQpXSAgICAgICAgICA9ICJWSURJT0NfR19JTlBVVCIsCisJW19JT0NfTlIoVklESU9DX1NfSU5QVVQpXSAgICAgICAgICA9ICJWSURJT0NfU19JTlBVVCIsCisJW19JT0NfTlIoVklESU9DX0dfT1VUUFVUKV0gICAgICAgICA9ICJWSURJT0NfR19PVVRQVVQiLAorCVtfSU9DX05SKFZJRElPQ19TX09VVFBVVCldICAgICAgICAgPSAiVklESU9DX1NfT1VUUFVUIiwKKwlbX0lPQ19OUihWSURJT0NfRU5VTU9VVFBVVCldICAgICAgID0gIlZJRElPQ19FTlVNT1VUUFVUIiwKKwlbX0lPQ19OUihWSURJT0NfR19BVURPVVQpXSAgICAgICAgID0gIlZJRElPQ19HX0FVRE9VVCIsCisJW19JT0NfTlIoVklESU9DX1NfQVVET1VUKV0gICAgICAgICA9ICJWSURJT0NfU19BVURPVVQiLAorCVtfSU9DX05SKFZJRElPQ19HX01PRFVMQVRPUildICAgICAgPSAiVklESU9DX0dfTU9EVUxBVE9SIiwKKwlbX0lPQ19OUihWSURJT0NfU19NT0RVTEFUT1IpXSAgICAgID0gIlZJRElPQ19TX01PRFVMQVRPUiIsCisJW19JT0NfTlIoVklESU9DX0dfRlJFUVVFTkNZKV0gICAgICA9ICJWSURJT0NfR19GUkVRVUVOQ1kiLAorCVtfSU9DX05SKFZJRElPQ19TX0ZSRVFVRU5DWSldICAgICAgPSAiVklESU9DX1NfRlJFUVVFTkNZIiwKKwlbX0lPQ19OUihWSURJT0NfQ1JPUENBUCldICAgICAgICAgID0gIlZJRElPQ19DUk9QQ0FQIiwKKwlbX0lPQ19OUihWSURJT0NfR19DUk9QKV0gICAgICAgICAgID0gIlZJRElPQ19HX0NST1AiLAorCVtfSU9DX05SKFZJRElPQ19TX0NST1ApXSAgICAgICAgICAgPSAiVklESU9DX1NfQ1JPUCIsCisJW19JT0NfTlIoVklESU9DX0dfSlBFR0NPTVApXSAgICAgICA9ICJWSURJT0NfR19KUEVHQ09NUCIsCisJW19JT0NfTlIoVklESU9DX1NfSlBFR0NPTVApXSAgICAgICA9ICJWSURJT0NfU19KUEVHQ09NUCIsCisJW19JT0NfTlIoVklESU9DX1FVRVJZU1REKV0gICAgICAgICA9ICJWSURJT0NfUVVFUllTVEQiLAorCVtfSU9DX05SKFZJRElPQ19UUllfRk1UKV0gICAgICAgICAgPSAiVklESU9DX1RSWV9GTVQiLAorCVtfSU9DX05SKFZJRElPQ19FTlVNQVVESU8pXSAgICAgICAgPSAiVklESU9DX0VOVU1BVURJTyIsCisJW19JT0NfTlIoVklESU9DX0VOVU1BVURPVVQpXSAgICAgICA9ICJWSURJT0NfRU5VTUFVRE9VVCIsCisJW19JT0NfTlIoVklESU9DX0dfUFJJT1JJVFkpXSAgICAgICA9ICJWSURJT0NfR19QUklPUklUWSIsCisJW19JT0NfTlIoVklESU9DX1NfUFJJT1JJVFkpXSAgICAgICA9ICJWSURJT0NfU19QUklPUklUWSIsCisjaWYgMQorCVtfSU9DX05SKFZJRElPQ19HX1NMSUNFRF9WQklfQ0FQKV0gPSAiVklESU9DX0dfU0xJQ0VEX1ZCSV9DQVAiLAorI2VuZGlmCisJW19JT0NfTlIoVklESU9DX0xPR19TVEFUVVMpXSAgICAgICA9ICJWSURJT0NfTE9HX1NUQVRVUyIKK307CisjZGVmaW5lIFY0TDJfSU9DVExTIEFSUkFZX1NJWkUodjRsMl9pb2N0bHMpCisKK3N0YXRpYyBjb25zdCBjaGFyICp2NGwyX2ludF9pb2N0bHNbXSA9IHsKKyNpZmRlZiBIQVZFX1ZJREVPX0RFQ09ERVIKKwlbX0lPQ19OUihERUNPREVSX0dFVF9DQVBBQklMSVRJRVMpXSAgICA9ICJERUNPREVSX0dFVF9DQVBBQklMSVRJRVMiLAorCVtfSU9DX05SKERFQ09ERVJfR0VUX1NUQVRVUyldICAgICAgICAgID0gIkRFQ09ERVJfR0VUX1NUQVRVUyIsCisJW19JT0NfTlIoREVDT0RFUl9TRVRfTk9STSldICAgICAgICAgICAgPSAiREVDT0RFUl9TRVRfTk9STSIsCisJW19JT0NfTlIoREVDT0RFUl9TRVRfSU5QVVQpXSAgICAgICAgICAgPSAiREVDT0RFUl9TRVRfSU5QVVQiLAorCVtfSU9DX05SKERFQ09ERVJfU0VUX09VVFBVVCldICAgICAgICAgID0gIkRFQ09ERVJfU0VUX09VVFBVVCIsCisJW19JT0NfTlIoREVDT0RFUl9FTkFCTEVfT1VUUFVUKV0gICAgICAgPSAiREVDT0RFUl9FTkFCTEVfT1VUUFVUIiwKKwlbX0lPQ19OUihERUNPREVSX1NFVF9QSUNUVVJFKV0gICAgICAgICA9ICJERUNPREVSX1NFVF9QSUNUVVJFIiwKKwlbX0lPQ19OUihERUNPREVSX1NFVF9HUElPKV0gICAgICAgICAgICA9ICJERUNPREVSX1NFVF9HUElPIiwKKwlbX0lPQ19OUihERUNPREVSX0lOSVQpXSAgICAgICAgICAgICAgICA9ICJERUNPREVSX0lOSVQiLAorCVtfSU9DX05SKERFQ09ERVJfU0VUX1ZCSV9CWVBBU1MpXSAgICAgID0gIkRFQ09ERVJfU0VUX1ZCSV9CWVBBU1MiLAorCVtfSU9DX05SKERFQ09ERVJfRFVNUCldICAgICAgICAgICAgICAgID0gIkRFQ09ERVJfRFVNUCIsCisjZW5kaWYKKwlbX0lPQ19OUihBVURDX1NFVF9SQURJTyldICAgICAgICAgICAgICA9ICJBVURDX1NFVF9SQURJTyIsCisJW19JT0NfTlIoQVVEQ19TRVRfSU5QVVQpXSAgICAgICAgICAgICAgPSAiQVVEQ19TRVRfSU5QVVQiLAorCVtfSU9DX05SKE1TUF9TRVRfTUFUUklYKV0gICAgICAgICAgICAgID0gIk1TUF9TRVRfTUFUUklYIiwKKworCVtfSU9DX05SKFRVTkVSX1NFVF9UWVBFX0FERFIpXSAgICAgICAgID0gIlRVTkVSX1NFVF9UWVBFX0FERFIiLAorCVtfSU9DX05SKFRVTkVSX1NFVF9TVEFOREJZKV0gICAgICAgICAgID0gIlRVTkVSX1NFVF9TVEFOREJZIiwKKwlbX0lPQ19OUihUREE5ODg3X1NFVF9DT05GSUcpXSAgICAgICAgICA9ICJUREE5ODg3X1NFVF9DT05GSUciLAorCisJW19JT0NfTlIoVklESU9DX0lOVF9TX1JFR0lTVEVSKV0gICAgICAgPSAiVklESU9DX0lOVF9TX1JFR0lTVEVSIiwKKwlbX0lPQ19OUihWSURJT0NfSU5UX0dfUkVHSVNURVIpXSAgICAgICA9ICJWSURJT0NfSU5UX0dfUkVHSVNURVIiLAorCVtfSU9DX05SKFZJRElPQ19JTlRfUkVTRVQpXSAgICAgICAgICAgID0gIlZJRElPQ19JTlRfUkVTRVQiLAorCVtfSU9DX05SKFZJRElPQ19JTlRfQVVESU9fQ0xPQ0tfRlJFUSldID0gIlZJRElPQ19JTlRfQVVESU9fQ0xPQ0tfRlJFUSIsCisJW19JT0NfTlIoVklESU9DX0lOVF9ERUNPREVfVkJJX0xJTkUpXSAgPSAiVklESU9DX0lOVF9ERUNPREVfVkJJX0xJTkUiLAorCVtfSU9DX05SKFZJRElPQ19JTlRfU19WQklfREFUQSldICAgICAgID0gIlZJRElPQ19JTlRfU19WQklfREFUQSIsCisJW19JT0NfTlIoVklESU9DX0lOVF9HX1ZCSV9EQVRBKV0gICAgICAgPSAiVklESU9DX0lOVF9HX1ZCSV9EQVRBIiwKKwlbX0lPQ19OUihWSURJT0NfSU5UX0dfQ0hJUF9JREVOVCldICAgICA9ICJWSURJT0NfSU5UX0dfQ0hJUF9JREVOVCIsCisJW19JT0NfTlIoVklESU9DX0lOVF9JMlNfQ0xPQ0tfRlJFUSldICAgPSAiVklESU9DX0lOVF9JMlNfQ0xPQ0tfRlJFUSIKK307CisjZGVmaW5lIFY0TDJfSU5UX0lPQ1RMUyBBUlJBWV9TSVpFKHY0bDJfaW50X2lvY3RscykKKworLyogQ29tbW9uIGlvY3RsIGRlYnVnIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5CisgICBleHRlcm5hbCBpb2N0bCBtZXNzYWdlcyBhcyB3ZWxsIGFzIGludGVybmFsIFY0TCBpb2N0bCAqLwordm9pZCB2NGxfcHJpbnRrX2lvY3RsKHVuc2lnbmVkIGludCBjbWQpCit7CisJY2hhciAqZGlyOworCisJc3dpdGNoIChfSU9DX0RJUihjbWQpKSB7CisJY2FzZSBfSU9DX05PTkU6ICAgICAgICAgICAgICBkaXIgPSAiLS0iOyBicmVhazsKKwljYXNlIF9JT0NfUkVBRDogICAgICAgICAgICAgIGRpciA9ICJyLSI7IGJyZWFrOworCWNhc2UgX0lPQ19XUklURTogICAgICAgICAgICAgZGlyID0gIi13IjsgYnJlYWs7CisJY2FzZSBfSU9DX1JFQUQgfCBfSU9DX1dSSVRFOiBkaXIgPSAicnciOyBicmVhazsKKwlkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgIGRpciA9ICIqRVJSKiI7IGJyZWFrOworCX0KKwlzd2l0Y2ggKF9JT0NfVFlQRShjbWQpKSB7CisJY2FzZSAnZCc6CisJCXByaW50aygidjRsMl9pbnQgaW9jdGwgJXMsIGRpcj0lcyAoMHglMDh4KVxuIiwKKwkJICAgICAgIChfSU9DX05SKGNtZCkgPCBWNEwyX0lOVF9JT0NUTFMpID8KKwkJICAgICAgIHY0bDJfaW50X2lvY3Rsc1tfSU9DX05SKGNtZCldIDogIlVOS05PV04iLCBkaXIsIGNtZCk7CisJCWJyZWFrOworI2lmZGVmIEhBVkVfVjRMMQorCWNhc2UgJ3YnOgorCQlwcmludGsoInY0bDEgaW9jdGwgJXMsIGRpcj0lcyAoMHglMDh4KVxuIiwKKwkJICAgICAgIChfSU9DX05SKGNtZCkgPCBWNEwxX0lPQ1RMUykgPworCQkgICAgICAgdjRsMV9pb2N0bHNbX0lPQ19OUihjbWQpXSA6ICJVTktOT1dOIiwgZGlyLCBjbWQpOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgJ1YnOgorCQlwcmludGsoInY0bDIgaW9jdGwgJXMsIGRpcj0lcyAoMHglMDh4KVxuIiwKKwkJICAgICAgIChfSU9DX05SKGNtZCkgPCBWNEwyX0lPQ1RMUykgPworCQkgICAgICAgdjRsMl9pb2N0bHNbX0lPQ19OUihjbWQpXSA6ICJVTktOT1dOIiwgZGlyLCBjbWQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygidW5rbm93biBpb2N0bCAnJWMnLCBkaXI9JXMsICMlZCAoMHglMDh4KVxuIiwKKwkJICAgICAgIF9JT0NfVFlQRShjbWQpLCBkaXIsIF9JT0NfTlIoY21kKSwgY21kKTsKKwl9Cit9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTI1NSw3ICszNzUsNyBAQAogCiBFWFBPUlRfU1lNQk9MKHY0bDJfZmllbGRfbmFtZXMpOwogRVhQT1JUX1NZTUJPTCh2NGwyX3R5cGVfbmFtZXMpOwotRVhQT1JUX1NZTUJPTCh2NGwyX2lvY3RsX25hbWVzKTsKK0VYUE9SVF9TWU1CT0wodjRsX3ByaW50a19pb2N0bCk7CiAKIC8qCiAgKiBMb2NhbCB2YXJpYWJsZXM6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYuYwppbmRleCA5YTZiZjI4Li45ZWY0Nzc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW8tYnVmLmMKQEAgLTUyLDEwICs1Miw5IEBACiAJc3RydWN0IHBhZ2UgKnBnOwogCWludCBpOwogCi0Jc2dsaXN0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSpucl9wYWdlcywgR0ZQX0tFUk5FTCk7CisJc2dsaXN0ID0ga2NhbGxvYyhucl9wYWdlcywgc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCksIEdGUF9LRVJORUwpOwogCWlmIChOVUxMID09IHNnbGlzdCkKIAkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KHNnbGlzdCwwLHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpKm5yX3BhZ2VzKTsKIAlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKywgdmlydCArPSBQQUdFX1NJWkUpIHsKIAkJcGcgPSB2bWFsbG9jX3RvX3BhZ2UodmlydCk7CiAJCWlmIChOVUxMID09IHBnKQpAQCAtODAsMTAgKzc5LDkgQEAKIAogCWlmIChOVUxMID09IHBhZ2VzWzBdKQogCQlyZXR1cm4gTlVMTDsKLQlzZ2xpc3QgPSBrbWFsbG9jKHNpemVvZigqc2dsaXN0KSAqIG5yX3BhZ2VzLCBHRlBfS0VSTkVMKTsKKwlzZ2xpc3QgPSBrY2FsbG9jKG5yX3BhZ2VzLCBzaXplb2YoKnNnbGlzdCksIEdGUF9LRVJORUwpOwogCWlmIChOVUxMID09IHNnbGlzdCkKIAkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KHNnbGlzdCwgMCwgc2l6ZW9mKCpzZ2xpc3QpICogbnJfcGFnZXMpOwogCiAJaWYgKE5VTEwgPT0gcGFnZXNbMF0pCiAJCWdvdG8gbm9wYWdlOwpAQCAtMjg0LDkgKzI4Miw4IEBACiB7CiAJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmI7CiAKLQl2YiA9IGttYWxsb2Moc2l6ZSxHRlBfS0VSTkVMKTsKKwl2YiA9IGt6YWxsb2Moc2l6ZSxHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCAhPSB2YikgewotCQltZW1zZXQodmIsMCxzaXplKTsKIAkJdmlkZW9idWZfZG1hX2luaXQoJnZiLT5kbWEpOwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2Yi0+ZG9uZSk7CiAJCXZiLT5tYWdpYyAgICAgPSBNQUdJQ19CVUZGRVI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvY29kZWMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9jb2RlYy5jCmluZGV4IDgzOWRiNjIuLjhmMjcxZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9jb2RlYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9jb2RlYy5jCkBAIC0xMjQsMTcgKzEyNCwxMyBAQAogCQkJaWYgKHJlcyA9PSAwKSB7CiAJCQkJZHByaW50aygzLCAidmlkZW9jb2RlY19hdHRhY2ggJyVzJ1xuIiwKIAkJCQkJY29kZWMtPm5hbWUpOwotCQkJCXB0ciA9IChzdHJ1Y3QgYXR0YWNoZWRfbGlzdCAqKQotCQkJCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXR0YWNoZWRfbGlzdCksCi0JCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJCQlwdHIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXR0YWNoZWRfbGlzdCksIEdGUF9LRVJORUwpOwogCQkJCWlmICghcHRyKSB7CiAJCQkJCWRwcmludGsoMSwKIAkJCQkJCUtFUk5fRVJSCiAJCQkJCQkidmlkZW9jb2RlY19hdHRhY2g6IG5vIG1lbW9yeVxuIik7CiAJCQkJCWdvdG8gb3V0X2tmcmVlOwogCQkJCX0KLQkJCQltZW1zZXQocHRyLCAwLAotCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGF0dGFjaGVkX2xpc3QpKTsKIAkJCQlwdHItPmNvZGVjID0gY29kZWM7CiAKIAkJCQlhID0gaC0+bGlzdDsKQEAgLTI0OSwxNCArMjQ1LDExIEBACiAJCSJ2aWRlb2NvZGVjOiByZWdpc3RlciAnJXMnLCB0eXBlOiAleCwgZmxhZ3MgJWx4LCBtYWdpYyAlbHhcbiIsCiAJCWNvZGVjLT5uYW1lLCBjb2RlYy0+dHlwZSwgY29kZWMtPmZsYWdzLCBjb2RlYy0+bWFnaWMpOwogCi0JcHRyID0KLQkgICAgKHN0cnVjdCBjb2RlY19saXN0ICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb2RlY19saXN0KSwKLQkJCQkJICBHRlBfS0VSTkVMKTsKKwlwdHIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY29kZWNfbGlzdCksIEdGUF9LRVJORUwpOwogCWlmICghcHRyKSB7CiAJCWRwcmludGsoMSwgS0VSTl9FUlIgInZpZGVvY29kZWNfcmVnaXN0ZXI6IG5vIG1lbW9yeVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQocHRyLCAwLCBzaXplb2Yoc3RydWN0IGNvZGVjX2xpc3QpKTsKIAlwdHItPmNvZGVjID0gY29kZWM7CiAKIAlpZiAoIWgpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9kZXYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9kZXYuYwppbmRleCA2ZGU1YjAwLi4wNzg4ODBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2Rldi5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KIApAQCAtNTIsMTAgKzUxLDcgQEAKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQ7CiAKLQl2ZmQgPSBrbWFsbG9jKHNpemVvZigqdmZkKSxHRlBfS0VSTkVMKTsKLQlpZiAoTlVMTCA9PSB2ZmQpCi0JCXJldHVybiBOVUxMOwotCW1lbXNldCh2ZmQsMCxzaXplb2YoKnZmZCkpOworCXZmZCA9IGt6YWxsb2Moc2l6ZW9mKCp2ZmQpLEdGUF9LRVJORUwpOwogCXJldHVybiB2ZmQ7CiB9CiAKQEAgLTY4LDcgKzY0LDggQEAKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQgPSBjb250YWluZXJfb2YoY2QsIHN0cnVjdCB2aWRlb19kZXZpY2UsIGNsYXNzX2Rldik7CiAKLSNpZiAxIC8qIG5lZWRlZCB1bnRpbCBhbGwgZHJpdmVycyBhcmUgZml4ZWQgKi8KKyNpZiAxCisJLyogbmVlZGVkIHVudGlsIGFsbCBkcml2ZXJzIGFyZSBmaXhlZCAqLwogCWlmICghdmZkLT5yZWxlYXNlKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTg1LDcgKzgyLDcgQEAKICAqLwogCiBzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSAqdmlkZW9fZGV2aWNlW1ZJREVPX05VTV9ERVZJQ0VTXTsKLXN0YXRpYyBERUNMQVJFX01VVEVYKHZpZGVvZGV2X2xvY2spOworc3RhdGljIERFRklORV9NVVRFWCh2aWRlb2Rldl9sb2NrKTsKIAogc3RydWN0IHZpZGVvX2RldmljZSogdmlkZW9fZGV2ZGF0YShzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKQEAgLTEwNCwxNSArMTAxLDE1IEBACiAKIAlpZihtaW5vcj49VklERU9fTlVNX0RFVklDRVMpCiAJCXJldHVybiAtRU5PREVWOwotCWRvd24oJnZpZGVvZGV2X2xvY2spOworCW11dGV4X2xvY2soJnZpZGVvZGV2X2xvY2spOwogCXZmbD12aWRlb19kZXZpY2VbbWlub3JdOwogCWlmKHZmbD09TlVMTCkgewotCQl1cCgmdmlkZW9kZXZfbG9jayk7CisJCW11dGV4X3VubG9jaygmdmlkZW9kZXZfbG9jayk7CiAJCXJlcXVlc3RfbW9kdWxlKCJjaGFyLW1ham9yLSVkLSVkIiwgVklERU9fTUFKT1IsIG1pbm9yKTsKLQkJZG93bigmdmlkZW9kZXZfbG9jayk7CisJCW11dGV4X2xvY2soJnZpZGVvZGV2X2xvY2spOwogCQl2Zmw9dmlkZW9fZGV2aWNlW21pbm9yXTsKIAkJaWYgKHZmbD09TlVMTCkgewotCQkJdXAoJnZpZGVvZGV2X2xvY2spOworCQkJbXV0ZXhfdW5sb2NrKCZ2aWRlb2Rldl9sb2NrKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJfQpAQCAtMTI1LDcgKzEyMiw3IEBACiAJCWZpbGUtPmZfb3AgPSBmb3BzX2dldChvbGRfZm9wcyk7CiAJfQogCWZvcHNfcHV0KG9sZF9mb3BzKTsKLQl1cCgmdmlkZW9kZXZfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZ2aWRlb2Rldl9sb2NrKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0zMDYsMTIgKzMwMywxMiBAQAogCX0KIAogCS8qIHBpY2sgYSBtaW5vciBudW1iZXIgKi8KLQlkb3duKCZ2aWRlb2Rldl9sb2NrKTsKKwltdXRleF9sb2NrKCZ2aWRlb2Rldl9sb2NrKTsKIAlpZiAobnIgPj0gMCAgJiYgIG5yIDwgZW5kLWJhc2UpIHsKIAkJLyogdXNlIHRoZSBvbmUgdGhlIGRyaXZlciBhc2tlZCBmb3IgKi8KIAkJaSA9IGJhc2UrbnI7CiAJCWlmIChOVUxMICE9IHZpZGVvX2RldmljZVtpXSkgewotCQkJdXAoJnZpZGVvZGV2X2xvY2spOworCQkJbXV0ZXhfdW5sb2NrKCZ2aWRlb2Rldl9sb2NrKTsKIAkJCXJldHVybiAtRU5GSUxFOwogCQl9CiAJfSBlbHNlIHsKQEAgLTMyMCwxMyArMzE3LDEzIEBACiAJCQlpZiAoTlVMTCA9PSB2aWRlb19kZXZpY2VbaV0pCiAJCQkJYnJlYWs7CiAJCWlmIChpID09IGVuZCkgewotCQkJdXAoJnZpZGVvZGV2X2xvY2spOworCQkJbXV0ZXhfdW5sb2NrKCZ2aWRlb2Rldl9sb2NrKTsKIAkJCXJldHVybiAtRU5GSUxFOwogCQl9CiAJfQogCXZpZGVvX2RldmljZVtpXT12ZmQ7CiAJdmZkLT5taW5vcj1pOwotCXVwKCZ2aWRlb2Rldl9sb2NrKTsKKwltdXRleF91bmxvY2soJnZpZGVvZGV2X2xvY2spOwogCiAJc3ByaW50Zih2ZmQtPmRldmZzX25hbWUsICJ2NGwvJXMlZCIsIG5hbWVfYmFzZSwgaSAtIGJhc2UpOwogCWRldmZzX21rX2NkZXYoTUtERVYoVklERU9fTUFKT1IsIHZmZC0+bWlub3IpLApAQCAtMzM4LDEzICszMzUsMTQgQEAKIAlpZiAodmZkLT5kZXYpCiAJCXZmZC0+Y2xhc3NfZGV2LmRldiA9IHZmZC0+ZGV2OwogCXZmZC0+Y2xhc3NfZGV2LmNsYXNzICAgICAgID0gJnZpZGVvX2NsYXNzOwotCXZmZC0+Y2xhc3NfZGV2LmRldnQgICAgICAgPSBNS0RFVihWSURFT19NQUpPUiwgdmZkLT5taW5vcik7CisJdmZkLT5jbGFzc19kZXYuZGV2dCAgICAgICAgPSBNS0RFVihWSURFT19NQUpPUiwgdmZkLT5taW5vcik7CiAJc3RybGNweSh2ZmQtPmNsYXNzX2Rldi5jbGFzc19pZCwgdmZkLT5kZXZmc19uYW1lICsgNCwgQlVTX0lEX1NJWkUpOwogCWNsYXNzX2RldmljZV9yZWdpc3RlcigmdmZkLT5jbGFzc19kZXYpOwogCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZSgmdmZkLT5jbGFzc19kZXYsCi0JCQkJICZjbGFzc19kZXZpY2VfYXR0cl9uYW1lKTsKKwkJCQkmY2xhc3NfZGV2aWNlX2F0dHJfbmFtZSk7CiAKLSNpZiAxIC8qIG5lZWRlZCB1bnRpbCBhbGwgZHJpdmVycyBhcmUgZml4ZWQgKi8KKyNpZiAxCisJLyogbmVlZGVkIHVudGlsIGFsbCBkcml2ZXJzIGFyZSBmaXhlZCAqLwogCWlmICghdmZkLT5yZWxlYXNlKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICJ2aWRlb2RldjogXCIlc1wiIGhhcyBubyByZWxlYXNlIGNhbGxiYWNrLiAiCiAJCSAgICAgICAiUGxlYXNlIGZpeCB5b3VyIGRyaXZlciBmb3IgcHJvcGVyIHN5c2ZzIHN1cHBvcnQsIHNlZSAiCkBAIC0zNjMsMTQgKzM2MSwxNCBAQAogCiB2b2lkIHZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCkKIHsKLQlkb3duKCZ2aWRlb2Rldl9sb2NrKTsKKwltdXRleF9sb2NrKCZ2aWRlb2Rldl9sb2NrKTsKIAlpZih2aWRlb19kZXZpY2VbdmZkLT5taW5vcl0hPXZmZCkKIAkJcGFuaWMoInZpZGVvZGV2OiBiYWQgdW5yZWdpc3RlciIpOwogCiAJZGV2ZnNfcmVtb3ZlKHZmZC0+ZGV2ZnNfbmFtZSk7CiAJdmlkZW9fZGV2aWNlW3ZmZC0+bWlub3JdPU5VTEw7CiAJY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoJnZmZC0+Y2xhc3NfZGV2KTsKLQl1cCgmdmlkZW9kZXZfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZ2aWRlb2Rldl9sb2NrKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmluby5jCmluZGV4IDcxYjI4ZTkuLmM4ZmQ4MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmluby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmluby5jCkBAIC00NDk5LDEzICs0NDk5LDExIEBACiAJZG1hX2FkZHJfdCBkbWFfZHVtbXlfYWRkcmVzczsKIAlpbnQgaTsKIAotCXZpbm9fZHJ2ZGF0YSA9IChzdHJ1Y3Qgdmlub19zZXR0aW5ncyAqKQotCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdmlub19zZXR0aW5ncyksIEdGUF9LRVJORUwpOworCXZpbm9fZHJ2ZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2aW5vX3NldHRpbmdzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF2aW5vX2RydmRhdGEpIHsKIAkJdmlub19tb2R1bGVfY2xlYW51cCh2aW5vX2luaXRfc3RhZ2UpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtc2V0KHZpbm9fZHJ2ZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCB2aW5vX3NldHRpbmdzKSk7CiAJdmlub19pbml0X3N0YWdlKys7CiAKIAkvKiBjcmVhdGUgYSBkdW1teSBkbWEgZGVzY3JpcHRvciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92cHgzMjIwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZweDMyMjAuYwppbmRleCA4ZGNlZThiLi5kMGExZTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZweDMyMjAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZweDMyMjAuYwpAQCAtNjIxLDEzICs2MjEsMTEgQEAKIAkgICAgKGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8IEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSkpCiAJCXJldHVybiAwOwogCi0JY2xpZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKKwljbGllbnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOwogCWlmIChjbGllbnQgPT0gTlVMTCkgewogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQltZW1zZXQoY2xpZW50LCAwLCBzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKLQogCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CiAJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKIAljbGllbnQtPmRyaXZlciA9ICZ2cHgzMjIwX2kyY19kcml2ZXI7CkBAIC02NzUsMTIgKzY3MywxMSBAQAogCQkJc2l6ZW9mKEkyQ19OQU1FKGNsaWVudCkpKTsKIAl9CiAKLQlkZWNvZGVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZweDMyMjApLCBHRlBfS0VSTkVMKTsKKwlkZWNvZGVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZweDMyMjApLCBHRlBfS0VSTkVMKTsKIAlpZiAoZGVjb2RlciA9PSBOVUxMKSB7CiAJCWtmcmVlKGNsaWVudCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQoZGVjb2RlciwgMCwgc2l6ZW9mKHN0cnVjdCB2cHgzMjIwKSk7CiAJZGVjb2Rlci0+bm9ybSA9IFZJREVPX01PREVfUEFMOwogCWRlY29kZXItPmlucHV0ID0gMDsKIAlkZWNvZGVyLT5lbmFibGUgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby93OTk2Ni5jIGIvZHJpdmVycy9tZWRpYS92aWRlby93OTk2Ni5jCmluZGV4IGMzMThiYTMuLmI3YjBhZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdzk5NjYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3c5OTY2LmMKQEAgLTE4Nyw2ICsxODcsNyBAQAogCS5vcGVuICAgICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuLAogCS5yZWxlYXNlICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlLAogCS5pb2N0bCAgICAgICAgICA9IHc5OTY2X3Y0bF9pb2N0bCwKKwkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLAogCS5yZWFkICAgICAgICAgICA9IHc5OTY2X3Y0bF9yZWFkLAogCS5sbHNlZWsgICAgICAgICA9IG5vX2xsc2VlaywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3dtODc3NS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby93bTg3NzUuYwppbmRleCBiYmZkNTVjLi44Y2I2NGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3dtODc3NS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vd204Nzc1LmMKQEAgLTI1LDcgKzI1LDYgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKLQogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KQEAgLTMzLDIwICszMiwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy1pZC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9jaGlwLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJ3bTg3NzUgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJVbGYgRWtsdW5kLCBIYW5zIFZlcmt1aWwiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotI2RlZmluZSB3bTg3NzVfZXJyKGZtdCwgYXJnLi4uKSBkbyB7IFwKLQlwcmludGsoS0VSTl9FUlIgIiVzICVkLSUwNHg6ICIgZm10LCBjbGllbnQtPmRyaXZlci0+ZHJpdmVyLm5hbWUsIFwKLQkgICAgICAgaTJjX2FkYXB0ZXJfaWQoY2xpZW50LT5hZGFwdGVyKSwgY2xpZW50LT5hZGRyICwgIyMgYXJnKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgd204Nzc1X2luZm8oZm10LCBhcmcuLi4pIGRvIHsgXAotCXByaW50ayhLRVJOX0lORk8gIiVzICVkLSUwNHg6ICIgZm10LCBjbGllbnQtPmRyaXZlci0+ZHJpdmVyLm5hbWUsIFwKLQkgICAgICAgaTJjX2FkYXB0ZXJfaWQoY2xpZW50LT5hZGFwdGVyKSwgY2xpZW50LT5hZGRyICwgIyMgYXJnKTsgfSB3aGlsZSAoMCkKLQotCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDM2ID4+IDEsIEkyQ19DTElFTlRfRU5EIH07CiAKIApAQCAtNzAsNyArNjEsNyBAQAogCWludCBpOwogCiAJaWYgKHJlZyA8IDAgfHwgcmVnID49IFRPVF9SRUdTKSB7Ci0JCXdtODc3NV9lcnIoIkludmFsaWQgcmVnaXN0ZXIgUiVkXG4iLCByZWcpOworCQl2NGxfZXJyKGNsaWVudCwgIkludmFsaWQgcmVnaXN0ZXIgUiVkXG4iLCByZWcpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC04MCw3ICs3MSw3IEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KLQl3bTg3NzVfZXJyKCJJMkM6IGNhbm5vdCB3cml0ZSAlMDN4IHRvIHJlZ2lzdGVyIFIlZFxuIiwgdmFsLCByZWcpOworCXY0bF9lcnIoY2xpZW50LCAiSTJDOiBjYW5ub3Qgd3JpdGUgJTAzeCB0byByZWdpc3RlciBSJWRcbiIsIHZhbCwgcmVnKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTg4LDM4ICs3OSw1MyBAQAogCQkJICB2b2lkICphcmcpCiB7CiAJc3RydWN0IHdtODc3NV9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlpbnQgKmlucHV0ID0gYXJnOworCXN0cnVjdCB2NGwyX2F1ZGlvICppbnB1dCA9IGFyZzsKKwlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsID0gYXJnOwogCiAJc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRENfU0VUX0lOUFVUOgorCWNhc2UgVklESU9DX1NfQVVESU86CisJCS8qIFRoZXJlIGFyZSA0IGlucHV0cyBhbmQgb25lIG91dHB1dC4gWmVybyBvciBtb3JlIGlucHV0cworCQkgICBhcmUgbXVsdGlwbGV4ZWQgdG9nZXRoZXIgdG8gdGhlIG91dHB1dC4gSGVuY2UgdGhlcmUgYXJlCisJCSAgIDE2IGNvbWJpbmF0aW9ucy4KKwkJICAgSWYgb25seSBvbmUgaW5wdXQgaXMgYWN0aXZlICh0aGUgbm9ybWFsIGNhc2UpIHRoZW4gdGhlCisJCSAgIGlucHV0IHZhbHVlcyAxLCAyLCA0IG9yIDggc2hvdWxkIGJlIHVzZWQuICovCisJCWlmIChpbnB1dC0+aW5kZXggPiAxNSkgeworCQkJdjRsX2VycihjbGllbnQsICJJbnZhbGlkIGlucHV0ICVkLlxuIiwgaW5wdXQtPmluZGV4KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXN0YXRlLT5pbnB1dCA9IGlucHV0LT5pbmRleDsKKwkJaWYgKHN0YXRlLT5tdXRlZCkKKwkJCWJyZWFrOwogCQl3bTg3NzVfd3JpdGUoY2xpZW50LCBSMjEsIDB4MGMwKTsKIAkJd204Nzc1X3dyaXRlKGNsaWVudCwgUjE0LCAweDFkNCk7CiAJCXdtODc3NV93cml0ZShjbGllbnQsIFIxNSwgMHgxZDQpOworCQl3bTg3NzVfd3JpdGUoY2xpZW50LCBSMjEsIDB4MTAwICsgc3RhdGUtPmlucHV0KTsKKwkJYnJlYWs7CiAKLQkJaWYgKCppbnB1dCA9PSBBVURJT19SQURJTykgewotCQkJd204Nzc1X3dyaXRlKGNsaWVudCwgUjIxLCAweDEwOCk7Ci0JCQlzdGF0ZS0+aW5wdXQgPSA4OwotCQkJc3RhdGUtPm11dGVkID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICgqaW5wdXQgPT0gQVVESU9fTVVURSkgewotCQkJc3RhdGUtPm11dGVkID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICgqaW5wdXQgPT0gQVVESU9fVU5NVVRFKSB7CisJY2FzZSBWSURJT0NfR19BVURJTzoKKwkJbWVtc2V0KGlucHV0LCAwLCBzaXplb2YoKmlucHV0KSk7CisJCWlucHV0LT5pbmRleCA9IHN0YXRlLT5pbnB1dDsKKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19HX0NUUkw6CisJCWlmIChjdHJsLT5pZCAhPSBWNEwyX0NJRF9BVURJT19NVVRFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWN0cmwtPnZhbHVlID0gc3RhdGUtPm11dGVkOworCQlicmVhazsKKworCWNhc2UgVklESU9DX1NfQ1RSTDoKKwkJaWYgKGN0cmwtPmlkICE9IFY0TDJfQ0lEX0FVRElPX01VVEUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3RhdGUtPm11dGVkID0gY3RybC0+dmFsdWU7CisJCXdtODc3NV93cml0ZShjbGllbnQsIFIyMSwgMHgwYzApOworCQl3bTg3NzVfd3JpdGUoY2xpZW50LCBSMTQsIDB4MWQ0KTsKKwkJd204Nzc1X3dyaXRlKGNsaWVudCwgUjE1LCAweDFkNCk7CisJCWlmICghc3RhdGUtPm11dGVkKQogCQkJd204Nzc1X3dyaXRlKGNsaWVudCwgUjIxLCAweDEwMCArIHN0YXRlLT5pbnB1dCk7Ci0JCQlzdGF0ZS0+bXV0ZWQgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogQWxsIG90aGVyIGlucHV0cy4uLiAqLwotCQl3bTg3NzVfd3JpdGUoY2xpZW50LCBSMjEsIDB4MTAyKTsKLQkJc3RhdGUtPmlucHV0ID0gMjsKLQkJc3RhdGUtPm11dGVkID0gMDsKIAkJYnJlYWs7CiAKIAljYXNlIFZJRElPQ19MT0dfU1RBVFVTOgotCQl3bTg3NzVfaW5mbygiSW5wdXQ6ICVzJXNcbiIsCi0JCQkgICAgc3RhdGUtPmlucHV0ID09IDggPyAicmFkaW8iIDogImRlZmF1bHQiLAorCQl2NGxfaW5mbyhjbGllbnQsICJJbnB1dDogJWQlc1xuIiwgc3RhdGUtPmlucHV0LAogCQkJICAgIHN0YXRlLT5tdXRlZCA/ICIgKG11dGVkKSIgOiAiIik7CiAJCWJyZWFrOwogCkBAIC0xNjAsMTcgKzE2NiwxNiBAQAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKIAkJcmV0dXJuIDA7CiAKLQljbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNsaWVudCA9PSAwKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW1lbXNldChjbGllbnQsIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOwogCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CiAJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKIAljbGllbnQtPmRyaXZlciA9ICZpMmNfZHJpdmVyOwogCXNucHJpbnRmKGNsaWVudC0+bmFtZSwgc2l6ZW9mKGNsaWVudC0+bmFtZSkgLSAxLCAid204Nzc1Iik7CiAKLQl3bTg3NzVfaW5mbygiY2hpcCBmb3VuZCBAIDB4JXggKCVzKVxuIiwgYWRkcmVzcyA8PCAxLCBhZGFwdGVyLT5uYW1lKTsKKwl2NGxfaW5mbyhjbGllbnQsICJjaGlwIGZvdW5kIEAgMHgleCAoJXMpXG4iLCBhZGRyZXNzIDw8IDEsIGFkYXB0ZXItPm5hbWUpOwogCiAJc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgd204Nzc1X3N0YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0YXRlID09IE5VTEwpIHsKQEAgLTIwNiwxMSArMjExLDcgQEAKIAogc3RhdGljIGludCB3bTg3NzVfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQogewotI2lmZGVmIEkyQ19DTEFTU19UVl9BTkFMT0cKIAlpZiAoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfVFZfQU5BTE9HKQotI2Vsc2UKLQlpZiAoYWRhcHRlci0+aWQgPT0gSTJDX0hXX0JfQlQ4NDgpCi0jZW5kaWYKIAkJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCB3bTg3NzVfYXR0YWNoKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTIzNSwxMiArMjM2LDEwIEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAid204Nzc1IiwKIAl9LAotCi0JLmlkID0gSTJDX0RSSVZFUklEX1dNODc3NSwKLQorCS5pZCAgICAgICAgICAgICA9IEkyQ19EUklWRVJJRF9XTTg3NzUsCiAJLmF0dGFjaF9hZGFwdGVyID0gd204Nzc1X3Byb2JlLAotCS5kZXRhY2hfY2xpZW50ID0gd204Nzc1X2RldGFjaCwKLQkuY29tbWFuZCA9IHdtODc3NV9jb21tYW5kLAorCS5kZXRhY2hfY2xpZW50ICA9IHdtODc3NV9kZXRhY2gsCisJLmNvbW1hbmQgICAgICAgID0gd204Nzc1X2NvbW1hbmQsCiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fY2FyZC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9jYXJkLmMKaW5kZXggMzlhMGQyMy4uMjQ2ZTY3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9jYXJkLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9jYXJkLmMKQEAgLTk5NSw3ICs5OTUsNyBAQAogc3RhdGljIGludCBfX2RldmluaXQKIHpyMzYwNTdfaW5pdCAoc3RydWN0IHpvcmFuICp6cikKIHsKLQl1bnNpZ25lZCBsb25nIG1lbTsKKwl1MzIgKm1lbTsKIAl2b2lkICp2ZGV2OwogCXVuc2lnbmVkIG1lbV9uZWVkZWQ7CiAJaW50IGo7CkBAIC0xMDUwLDcgKzEwNTAsNyBAQAogCS8qIGFsbG9jYXRlIG1lbW9yeSAqYmVmb3JlKiBkb2luZyBhbnl0aGluZyB0byB0aGUgaGFyZHdhcmUKIAkgKiBpbiBjYXNlIGFsbG9jYXRpb24gZmFpbHMgKi8KIAltZW1fbmVlZGVkID0gQlVaX05VTV9TVEFUX0NPTSAqIDQ7Ci0JbWVtID0gKHVuc2lnbmVkIGxvbmcpIGttYWxsb2MobWVtX25lZWRlZCwgR0ZQX0tFUk5FTCk7CisJbWVtID0ga3phbGxvYyhtZW1fbmVlZGVkLCBHRlBfS0VSTkVMKTsKIAl2ZGV2ID0gKHZvaWQgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IHZpZGVvX2RldmljZSksIEdGUF9LRVJORUwpOwogCWlmICghbWVtIHx8ICF2ZGV2KSB7CiAJCWRwcmludGsoMSwKQEAgLTEwNTgsMTEgKzEwNTgsMTAgQEAKIAkJCSIlczogenIzNjA1N19pbml0KCkgLSBrbWFsbG9jIChTVEFUX0NPTSkgZmFpbGVkXG4iLAogCQkJWlJfREVWTkFNRSh6cikpOwogCQlrZnJlZSh2ZGV2KTsKLQkJa2ZyZWUoKHZvaWQgKiltZW0pOworCQlrZnJlZShtZW0pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtc2V0KCh2b2lkICopIG1lbSwgMCwgbWVtX25lZWRlZCk7Ci0JenItPnN0YXRfY29tID0gKHUzMiAqKSBtZW07CisJenItPnN0YXRfY29tID0gbWVtOwogCWZvciAoaiA9IDA7IGogPCBCVVpfTlVNX1NUQVRfQ09NOyBqKyspIHsKIAkJenItPnN0YXRfY29tW2pdID0gMTsJLyogbWFyayBhcyB1bmF2YWlsYWJsZSB0byB6cjM2MDU3ICovCiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fZHJpdmVyLmMKaW5kZXggNDAzNGYxYi4uNDg1NTUzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9kcml2ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2RyaXZlci5jCkBAIC0xMzQ1LDcgKzEzNDUsNyBAQAogCQlaUl9ERVZOQU1FKHpyKSwgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCB6ci0+dXNlcik7CiAKIAkvKiBub3csIGNyZWF0ZSB0aGUgb3BlbigpLXNwZWNpZmljIGZpbGVfb3BzIHN0cnVjdCAqLwotCWZoID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHpvcmFuX2ZoKSwgR0ZQX0tFUk5FTCk7CisJZmggPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgem9yYW5fZmgpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZoKSB7CiAJCWRwcmludGsoMSwKIAkJCUtFUk5fRVJSCkBAIC0xMzU0LDcgKzEzNTQsNiBAQAogCQlyZXMgPSAtRU5PTUVNOwogCQlnb3RvIG9wZW5fdW5sb2NrX2FuZF9yZXR1cm47CiAJfQotCW1lbXNldChmaCwgMCwgc2l6ZW9mKHN0cnVjdCB6b3Jhbl9maCkpOwogCS8qIHVzZWQgdG8gYmUgQlVaX01BWF9XSURUSC9IRUlHSFQsIGJ1dCB0aGF0IGdpdmVzIG92ZXJmbG93cwogCSAqIG9uIG5vcm0tY2hhbmdlISAqLwogCWZoLT5vdmVybGF5X21hc2sgPQpAQCAtNDY3OCw2ICs0Njc3LDcgQEAKIAkub3BlbiA9IHpvcmFuX29wZW4sCiAJLnJlbGVhc2UgPSB6b3Jhbl9jbG9zZSwKIAkuaW9jdGwgPSB6b3Jhbl9pb2N0bCwKKwkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLAogCS5sbHNlZWsgPSBub19sbHNlZWssCiAJLnJlYWQgPSB6b3Jhbl9yZWFkLAogCS53cml0ZSA9IHpvcmFuX3dyaXRlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96cjM2MDE2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYwMTYuYwppbmRleCA0ZWQ4OTg1Li4xMDEzMGVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYwMTYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYwMTYuYwpAQCAtNDUxLDEyICs0NTEsMTEgQEAKIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQogCS8vbWVtIHN0cnVjdHVyZSBpbml0Ci0JY29kZWMtPmRhdGEgPSBwdHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgenIzNjAxNiksIEdGUF9LRVJORUwpOworCWNvZGVjLT5kYXRhID0gcHRyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHpyMzYwMTYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCA9PSBwdHIpIHsKIAkJZHByaW50aygxLCBLRVJOX0VSUiAienIzNjAxNjogQ2FuJ3QgZ2V0IGVub3VnaCBtZW1vcnkhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbXNldChwdHIsIDAsIHNpemVvZihzdHJ1Y3QgenIzNjAxNikpOwogCiAJc25wcmludGYocHRyLT5uYW1lLCBzaXplb2YocHRyLT5uYW1lKSwgInpyMzYwMTZbJWRdIiwKIAkJIHpyMzYwMTZfY29kZWNzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjA1MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96cjM2MDUwLmMKaW5kZXggMDE0NDU3Ni4uYmQwY2QyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96cjM2MDUwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96cjM2MDUwLmMKQEAgLTgxMywxMiArODEzLDExIEBACiAJCXJldHVybiAtRU5PU1BDOwogCX0KIAkvL21lbSBzdHJ1Y3R1cmUgaW5pdAotCWNvZGVjLT5kYXRhID0gcHRyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHpyMzYwNTApLCBHRlBfS0VSTkVMKTsKKwljb2RlYy0+ZGF0YSA9IHB0ciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB6cjM2MDUwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKE5VTEwgPT0gcHRyKSB7CiAJCWRwcmludGsoMSwgS0VSTl9FUlIgInpyMzYwNTA6IENhbid0IGdldCBlbm91Z2ggbWVtb3J5IVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQocHRyLCAwLCBzaXplb2Yoc3RydWN0IHpyMzYwNTApKTsKIAogCXNucHJpbnRmKHB0ci0+bmFtZSwgc2l6ZW9mKHB0ci0+bmFtZSksICJ6cjM2MDUwWyVkXSIsCiAJCSB6cjM2MDUwX2NvZGVjcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYwNjAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjA2MC5jCmluZGV4IDEyOTc0NGEuLjI4ZmEzMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjA2MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjA2MC5jCkBAIC05MTksMTIgKzkxOSwxMSBAQAogCQlyZXR1cm4gLUVOT1NQQzsKIAl9CiAJLy9tZW0gc3RydWN0dXJlIGluaXQKLQljb2RlYy0+ZGF0YSA9IHB0ciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB6cjM2MDYwKSwgR0ZQX0tFUk5FTCk7CisJY29kZWMtPmRhdGEgPSBwdHIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgenIzNjA2MCksIEdGUF9LRVJORUwpOwogCWlmIChOVUxMID09IHB0cikgewogCQlkcHJpbnRrKDEsIEtFUk5fRVJSICJ6cjM2MDYwOiBDYW4ndCBnZXQgZW5vdWdoIG1lbW9yeSFcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtc2V0KHB0ciwgMCwgc2l6ZW9mKHN0cnVjdCB6cjM2MDYwKSk7CiAKIAlzbnByaW50ZihwdHItPm5hbWUsIHNpemVvZihwdHItPm5hbWUpLCAienIzNjA2MFslZF0iLAogCQkgenIzNjA2MF9jb2RlY3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96cjM2MTIwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjAuYwppbmRleCAwNzI4NjgxLi5kNGM2MzNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjAuYwpAQCAtMTQ5MCw2ICsxNDkwLDcgQEAKIAkud3JpdGUJCT0gem9yYW5fd3JpdGUsCiAJLnBvbGwJCT0gem9yYW5fcG9sbCwKIAkuaW9jdGwJCT0gem9yYW5faW9jdGwsCisJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKIAkubW1hcAkJPSB6b3Jhbl9tbWFwLAogCS5taW5vcgkJPSAtMSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL0tjb25maWcgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL0tjb25maWcKaW5kZXggMTg4M2QyMi4uZTY3Y2YxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vS2NvbmZpZwpAQCAtMjMsNiArMjMsNyBAQAogCXRyaXN0YXRlICJGdXNpb24gTVBUIFNjc2lIb3N0IGRyaXZlcnMgZm9yIEZDIgogCWRlcGVuZHMgb24gUENJICYmIFNDU0kKIAlzZWxlY3QgRlVTSU9OCisJc2VsZWN0IFNDU0lfRkNfQVRUUlMKIAktLS1oZWxwLS0tCiAJICBTQ1NJIEhPU1Qgc3VwcG9ydCBmb3IgYSBGaWJlciBDaGFubmVsIGhvc3QgYWRhcHRlcnMuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waS5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpLmgKaW5kZXggYjYxZTNkMS4uMDJjZGM4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpLmgKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpLmgKQEAgLTYsNyArNiw3IEBACiAgKiAgICAgICAgICBUaXRsZTogIE1QSSBNZXNzYWdlIGluZGVwZW5kZW50IHN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zCiAgKiAgQ3JlYXRpb24gRGF0ZTogIEp1bHkgMjcsIDIwMDAKICAqCi0gKiAgICBtcGkuaCBWZXJzaW9uOiAgMDEuMDUuMDgKKyAqICAgIG1waS5oIFZlcnNpb246ICAwMS4wNS4xMAogICoKICAqICBWZXJzaW9uIEhpc3RvcnkKICAqICAtLS0tLS0tLS0tLS0tLS0KQEAgLTc0LDYgKzc0LDggQEAKICAqICAwNi0yNC0wNSAgMDEuMDUuMDggIEFkZGVkIGZ1bmN0aW9uIGNvZGVzIGZvciBTQ1NJIElPIDMyIGFuZAogICogICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0QXNzaXN0RXh0ZW5kZWQgcmVxdWVzdHMuCiAgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBFRURQIElPQ1N0YXR1cyBjb2Rlcy4KKyAqICAwOC0wMy0wNSAgMDEuMDUuMDkgIEJ1bXBlZCBNUElfSEVBREVSX1ZFUlNJT05fVU5JVC4KKyAqICAwOC0zMC0wNSAgMDEuMDUuMTAgIEFkZGVkIDIgbmV3IElPQ1N0YXR1cyBjb2RlcyBmb3IgVGFyZ2V0LgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIApAQCAtMTA0LDcgKzEwNiw3IEBACiAvKiBOb3RlOiBUaGUgbWFqb3IgdmVyc2lvbnMgb2YgMHhlMCB0aHJvdWdoIDB4ZmYgYXJlIHJlc2VydmVkICovCiAKIC8qIHZlcnNpb25pbmcgZm9yIHRoaXMgTVBJIGhlYWRlciBzZXQgKi8KLSNkZWZpbmUgTVBJX0hFQURFUl9WRVJTSU9OX1VOSVQgICAgICAgICAgICAgKDB4MEEpCisjZGVmaW5lIE1QSV9IRUFERVJfVkVSU0lPTl9VTklUICAgICAgICAgICAgICgweDBDKQogI2RlZmluZSBNUElfSEVBREVSX1ZFUlNJT05fREVWICAgICAgICAgICAgICAoMHgwMCkKICNkZWZpbmUgTVBJX0hFQURFUl9WRVJTSU9OX1VOSVRfTUFTSyAgICAgICAgKDB4RkYwMCkKICNkZWZpbmUgTVBJX0hFQURFUl9WRVJTSU9OX1VOSVRfU0hJRlQgICAgICAgKDgpCkBAIC03MTEsNiArNzEzLDggQEAKICNkZWZpbmUgTVBJX0lPQ1NUQVRVU19UQVJHRVRfREFUQV9PRkZTRVRfRVJST1IgICAoMHgwMDZEKQogI2RlZmluZSBNUElfSU9DU1RBVFVTX1RBUkdFVF9UT09fTVVDSF9XUklURV9EQVRBICgweDAwNkUpCiAjZGVmaW5lIE1QSV9JT0NTVEFUVVNfVEFSR0VUX0lVX1RPT19TSE9SVCAgICAgICAgKDB4MDA2RikKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19UQVJHRVRfQUNLX05BS19USU1FT1VUICAgICAoMHgwMDcwKQorI2RlZmluZSBNUElfSU9DU1RBVFVTX1RBUkdFVF9OQUtfUkVDRUlWRUQgICAgICAgICgweDAwNzEpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogIEFkZGl0aW9uYWwgRkNQIHRhcmdldCB2YWx1ZXMgKG9ic29sZXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC03NDUsNyArNzQ5LDcgQEAKICNkZWZpbmUgTVBJX0lPQ1NUQVRVU19MQU5fQ0FOQ0VMRUQgICAgICAgICAgICAgICgweDAwODcpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogIFNlcmlhbCBBdHRhY2hlZCBTQ1NJIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXJpYWwgQXR0YWNoZWQgU0NTSSB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNkZWZpbmUgTVBJX0lPQ1NUQVRVU19TQVNfU01QX1JFUVVFU1RfRkFJTEVEICAgICgweDAwOTApCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfY25mZy5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2NuZmcuaAppbmRleCBkODMzOTg5Li5iMWJlY2VjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfY25mZy5oCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9jbmZnLmgKQEAgLTYsNyArNiw3IEBACiAgKiAgICAgICAgICBUaXRsZTogIE1QSSBDb25maWcgbWVzc2FnZSwgc3RydWN0dXJlcywgYW5kIFBhZ2VzCiAgKiAgQ3JlYXRpb24gRGF0ZTogIEp1bHkgMjcsIDIwMDAKICAqCi0gKiAgICBtcGlfY25mZy5oIFZlcnNpb246ICAwMS4wNS4wOQorICogICAgbXBpX2NuZmcuaCBWZXJzaW9uOiAgMDEuMDUuMTEKICAqCiAgKiAgVmVyc2lvbiBIaXN0b3J5CiAgKiAgLS0tLS0tLS0tLS0tLS0tCkBAIC0yNDksNiArMjQ5LDIzIEBACiAgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBPd25lckRldkhhbmRsZSBhbmQgRmxhZ3MgZmllbGQgdG8gU0FTIFBIWSBQYWdlIDAuCiAgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBJT0MgR1BJTyBGbGFncyBkZWZpbmUgdG8gU0FTIEVuY2xvc3VyZSBQYWdlIDAuCiAgKiAgICAgICAgICAgICAgICAgICAgICBGaXhlZCB0aGUgdmFsdWUgZm9yIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX0RFVl9TQVRBX1NVUFBPUlQuCisgKiAgMDgtMDMtMDUgIDAxLjA1LjEwICBSZW1vdmVkIElTRGF0YVNjcnViUmF0ZSBhbmQgSVNSZXN5bmNSYXRlIGZyb20KKyAqICAgICAgICAgICAgICAgICAgICAgIE1hbnVmYWN0dXJpbmcgUGFnZSA0LgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJX0lPVU5JVFBBR0UxX1NBVEFfV1JJVEVfQ0FDSEVfRElTQUJMRSBiaXQuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBOdW1EZXZzUGVyRW5jbG9zdXJlIGZpZWxkIHRvIFNBUyBJTyBVbml0IHBhZ2UgMi4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSV9TQVNfSU9VTklUMl9GTEFHU19IT1NUX0FTU0lHTkVEX1BIWVNfTUFQCisgKiAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBFbmNsb3N1cmVIYW5kbGUgZmllbGQgdG8gU0FTIEV4cGFuZGVyIHBhZ2UgMC4KKyAqICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgcmVkdW5kYW50IE51bVRhYmxlRW50cmllc1Byb2cgZmllbGQgZnJvbSBTQVMKKyAqICAgICAgICAgICAgICAgICAgICAgIEV4cGFuZGVyIFBhZ2UgMS4KKyAqICAwOC0zMC0wNSAgMDEuMDUuMTEgIEFkZGVkIERldmljZUlEIGZvciBGQzk0OUUgYW5kIGNoYW5nZWQgdGhlIERldmljZUlEIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgU0FTMTA3OC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIG1vcmUgZGVmaW5lcyBmb3IgTWFudWZhY3R1cmluZyBQYWdlIDQgRmxhZ3MgZmllbGQuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBtb3JlIGRlZmluZXMgZm9yIElPQ1NldHRpbmdzIGFuZCBhZGRlZAorICogICAgICAgICAgICAgICAgICAgICAgRXhwYW5kZXJTcGludXAgZmllbGQgdG8gQmlvcyBQYWdlIDEuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBwb3N0cG9uZSBTQVRBIEluaXQgYml0IHRvIFNBUyBJTyBVbml0IFBhZ2UgMQorICogICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEZsYWdzLgorICogICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlZCBMb2dFbnRyeSBmb3JtYXQgZm9yIExvZyBQYWdlIDAuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCkBAIC00OTQsNyArNTExLDcgQEAKICNkZWZpbmUgTVBJX01BTlVGQUNUUEFHRV9ERVZJQ0VJRF9GQzkyOVggICAgICAgICAgICAoMHgwNjI2KQogI2RlZmluZSBNUElfTUFOVUZBQ1RQQUdFX0RFVklDRUlEX0ZDOTM5WCAgICAgICAgICAgICgweDA2NDIpCiAjZGVmaW5lIE1QSV9NQU5VRkFDVFBBR0VfREVWSUNFSURfRkM5NDlYICAgICAgICAgICAgKDB4MDY0MCkKLSNkZWZpbmUgTVBJX01BTlVGQUNUUEFHRV9ERVZJQ0VJRF9GQzk0OUVTICAgICAgICAgICAoMHgwNjQ2KQorI2RlZmluZSBNUElfTUFOVUZBQ1RQQUdFX0RFVklDRUlEX0ZDOTQ5RSAgICAgICAgICAgICgweDA2NDYpCiAvKiBTQ1NJICovCiAjZGVmaW5lIE1QSV9NQU5VRkFDVFBBR0VfREVWSURfNTNDMTAzMCAgICAgICAgICAgICAgKDB4MDAzMCkKICNkZWZpbmUgTVBJX01BTlVGQUNUUEFHRV9ERVZJRF81M0MxMDMwWkMgICAgICAgICAgICAoMHgwMDMxKQpAQCAtNTEwLDcgKzUyNyw3IEBACiAjZGVmaW5lIE1QSV9NQU5VRkFDVFBBR0VfREVWSURfU0FTMTA2NkUgICAgICAgICAgICAgKDB4MDA1QSkKICNkZWZpbmUgTVBJX01BTlVGQUNUUEFHRV9ERVZJRF9TQVMxMDY4ICAgICAgICAgICAgICAoMHgwMDU0KQogI2RlZmluZSBNUElfTUFOVUZBQ1RQQUdFX0RFVklEX1NBUzEwNjhFICAgICAgICAgICAgICgweDAwNTgpCi0jZGVmaW5lIE1QSV9NQU5VRkFDVFBBR0VfREVWSURfU0FTMTA3OCAgICAgICAgICAgICAgKDB4MDA2MCkKKyNkZWZpbmUgTVBJX01BTlVGQUNUUEFHRV9ERVZJRF9TQVMxMDc4ICAgICAgICAgICAgICAoMHgwMDYyKQogCiAKIHR5cGVkZWYgc3RydWN0IF9DT05GSUdfUEFHRV9NQU5VRkFDVFVSSU5HXzAKQEAgLTYwMiw5ICs2MTksNyBAQAogICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1Wb2x1bWVTZXR0aW5nczsgICAvKiA1MGggKi8KICAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgLyogNTRoICovCiAgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgIC8qIDU4aCAqLwotICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEYXRhU2NydWJSYXRlOyAgICAvKiA1Q2ggKi8KLSAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTUmVzeW5jUmF0ZTsgICAgICAgLyogNURoICovCi0gICAgVTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDU7ICAgICAgICAgIC8qIDVFaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ1OyAgICAgICAgICAvKiA1Q2ggKi8KICAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNRURhdGFTY3J1YlJhdGU7ICAgLyogNjBoICovCiAgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUVSZXN5bmNSYXRlOyAgICAgIC8qIDYxaCAqLwogICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ2OyAgICAgICAgICAvKiA2MmggKi8KQEAgLTYxNiw5ICs2MzEsMTQgQEAKIH0gQ09ORklHX1BBR0VfTUFOVUZBQ1RVUklOR180LCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfTUFOVUZBQ1RVUklOR180LAogICBNYW51ZmFjdHVyaW5nUGFnZTRfdCwgTVBJX1BPSU5URVIgcE1hbnVmYWN0dXJpbmdQYWdlNF90OwogCi0jZGVmaW5lIE1QSV9NQU5VRkFDVFVSSU5HNF9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfTUFOVUZBQ1RVUklORzRfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAoMHgwMykKIAogLyogZGVmaW5lcyBmb3IgdGhlIEZsYWdzIGZpZWxkICovCisjZGVmaW5lIE1QSV9NQU5QQUdFNF9JTUVfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICgweDIwKQorI2RlZmluZSBNUElfTUFOUEFHRTRfSU1fRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxMCkKKyNkZWZpbmUgTVBJX01BTlBBR0U0X0lTX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1QSV9NQU5QQUdFNF9JUl9NT0RFUEFHRThfRElTQUJMRSAgICAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBNUElfTUFOUEFHRTRfSU1fUkVTWU5DX0NBQ0hFX0VOQUJMRSAgICAgICAgICAgICAoMHgwMikKICNkZWZpbmUgTVBJX01BTlBBR0U0X0lSX05PX01JWF9TQVNfU0FUQSAgICAgICAgICAgICAgICAgKDB4MDEpCiAKIApAQCAtNjY5LDcgKzY4OSw3IEBACiB9IENPTkZJR19QQUdFX0lPX1VOSVRfMSwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX0lPX1VOSVRfMSwKICAgSU9Vbml0UGFnZTFfdCwgTVBJX1BPSU5URVIgcElPVW5pdFBhZ2UxX3Q7CiAKLSNkZWZpbmUgTVBJX0lPVU5JVFBBR0UxX1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSV9JT1VOSVRQQUdFMV9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICgweDAyKQogCiAvKiBJTyBVbml0IFBhZ2UgMSBGbGFncyBkZWZpbmVzICovCiAjZGVmaW5lIE1QSV9JT1VOSVRQQUdFMV9NVUxUSV9GVU5DVElPTiAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwKQpAQCAtNjgxLDcgKzcwMSw3IEBACiAjZGVmaW5lIE1QSV9JT1VOSVRQQUdFMV9ESVNBQkxFX0lSICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDQwKQogI2RlZmluZSBNUElfSU9VTklUUEFHRTFfRk9SQ0VfMzIgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDA4MCkKICNkZWZpbmUgTVBJX0lPVU5JVFBBR0UxX05BVElWRV9DT01NQU5EX1FfRElTQUJMRSAgICAgICAgKDB4MDAwMDAxMDApCi0KKyNkZWZpbmUgTVBJX0lPVU5JVFBBR0UxX1NBVEFfV1JJVEVfQ0FDSEVfRElTQUJMRSAgICAgICAgKDB4MDAwMDAyMDApCiAKIHR5cGVkZWYgc3RydWN0IF9NUElfQURBUFRFUl9JTkZPCiB7CkBAIC05NjgsNyArOTg4LDggQEAKICAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMENoICovCiAgICAgVTMyICAgICAgICAgICAgICAgICAgICAgRGV2aWNlU2V0dGluZ3M7ICAgICAgICAgICAgIC8qIDEwaCAqLwogICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIE51bWJlck9mRGV2aWNlczsgICAgICAgICAgICAvKiAxNGggKi8KLSAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgLyogMTZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRXhwYW5kZXJTcGludXA7ICAgICAgICAgICAgIC8qIDE2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAxN2ggKi8KICAgICBVMTYgICAgICAgICAgICAgICAgICAgICBJT1RpbWVvdXRCbG9ja0RldmljZXNOb25STTsgLyogMThoICovCiAgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSU9UaW1lb3V0U2VxdWVudGlhbDsgICAgICAgIC8qIDFBaCAqLwogICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIElPVGltZW91dE90aGVyOyAgICAgICAgICAgICAvKiAxQ2ggKi8KQEAgLTk3Niw3ICs5OTcsNyBAQAogfSBDT05GSUdfUEFHRV9CSU9TXzEsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9CSU9TXzEsCiAgIEJJT1NQYWdlMV90LCBNUElfUE9JTlRFUiBwQklPU1BhZ2UxX3Q7CiAKLSNkZWZpbmUgTVBJX0JJT1NQQUdFMV9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9CSU9TUEFHRTFfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICgweDAzKQogCiAvKiB2YWx1ZXMgZm9yIHRoZSBCaW9zT3B0aW9ucyBmaWVsZCAqLwogI2RlZmluZSBNUElfQklPU1BBR0UxX09QVElPTlNfU1BJX0VOQUJMRSAgICAgICAgICAgICAgICAoMHgwMDAwMDQwMCkKQEAgLTk4NSw4ICsxMDA2LDE1IEBACiAjZGVmaW5lIE1QSV9CSU9TUEFHRTFfT1BUSU9OU19ESVNBQkxFX0JJT1MgICAgICAgICAgICAgICgweDAwMDAwMDAxKQogCiAvKiB2YWx1ZXMgZm9yIHRoZSBJT0NTZXR0aW5ncyBmaWVsZCAqLworI2RlZmluZSBNUElfQklPU1BBR0UxX0lPQ1NFVF9NQVNLX0lOSVRJQUxfU1BJTlVQX0RFTEFZICAoMHgwRjAwMDAwMCkKKyNkZWZpbmUgTVBJX0JJT1NQQUdFMV9JT0NTRVRfU0hJRlRfSU5JVElBTF9TUElOVVBfREVMQVkgKDI0KQorCiAjZGVmaW5lIE1QSV9CSU9TUEFHRTFfSU9DU0VUX01BU0tfUE9SVF9FTkFCTEVfREVMQVkgICAgICgweDAwRjAwMDAwKQogI2RlZmluZSBNUElfQklPU1BBR0UxX0lPQ1NFVF9TSElGVF9QT1JUX0VOQUJMRV9ERUxBWSAgICAoMjApCisKKyNkZWZpbmUgTVBJX0JJT1NQQUdFMV9JT0NTRVRfQVVUT19QT1JUX0VOQUJMRSAgICAgICAgICAgKDB4MDAwODAwMDApCisjZGVmaW5lIE1QSV9CSU9TUEFHRTFfSU9DU0VUX0RJUkVDVF9BVFRBQ0hfU1BJTlVQX01PREUgICgweDAwMDQwMDAwKQorCiAjZGVmaW5lIE1QSV9CSU9TUEFHRTFfSU9DU0VUX01BU0tfQk9PVF9QUkVGRVJFTkNFICAgICAgICgweDAwMDMwMDAwKQogI2RlZmluZSBNUElfQklPU1BBR0UxX0lPQ1NFVF9FTkNMT1NVUkVfU0xPVF9CT09UICAgICAgICAoMHgwMDAwMDAwMCkKICNkZWZpbmUgTVBJX0JJT1NQQUdFMV9JT0NTRVRfU0FTX0FERFJFU1NfQk9PVCAgICAgICAgICAgKDB4MDAwMTAwMDApCkBAIC0xMDE2LDYgKzEwNDQsMTEgQEAKICNkZWZpbmUgTVBJX0JJT1NQQUdFMV9ERVZTRVRfRElTQUJMRV9OT05fUk1fTFVOICAgICAgICAgKDB4MDAwMDAwMDIpCiAjZGVmaW5lIE1QSV9CSU9TUEFHRTFfREVWU0VUX0RJU0FCTEVfT1RIRVJfTFVOICAgICAgICAgICgweDAwMDAwMDAxKQogCisvKiBkZWZpbmVzIGZvciB0aGUgRXhwYW5kZXJTcGludXAgZmllbGQgKi8KKyNkZWZpbmUgTVBJX0JJT1NQQUdFMV9FWFBTUElOVVBfTUFTS19NQVhfVEFSR0VUICAgICAgICAgKDB4RjApCisjZGVmaW5lIE1QSV9CSU9TUEFHRTFfRVhQU1BJTlVQX1NISUZUX01BWF9UQVJHRVQgICAgICAgICg0KQorI2RlZmluZSBNUElfQklPU1BBR0UxX0VYUFNQSU5VUF9NQVNLX0RFTEFZICAgICAgICAgICAgICAoMHgwRikKKwogdHlwZWRlZiBzdHJ1Y3QgX01QSV9CT09UX0RFVklDRV9BREFQVEVSX09SREVSCiB7CiAgICAgVTMyICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLwpAQCAtMTIzMywxMyArMTI2NiwxMyBAQAogCiAjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9TSElGVF9NSU5fU1lOQ19QRVJJT0QgICAgICg4KQogI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMF9DQVBfR0VUX01JTl9TWU5DX1BFUklPRChDYXApICAgICAgXAotICAgICggICgoQ2FwKSAmIE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9NQVNLX01JTl9TWU5DX1BFUklPRCkgXAorICAgICggICgoQ2FwKSAmIE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9NSU5fU1lOQ19QRVJJT0RfTUFTSykgXAogICAgID4+IE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9TSElGVF9NSU5fU1lOQ19QRVJJT0QgICAgICAgICAgXAogICAgICkKICNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTBfQ0FQX01BWF9TWU5DX09GRlNFVF9NQVNLICAgICAgKDB4MDBGRjAwMDApCiAjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9TSElGVF9NQVhfU1lOQ19PRkZTRVQgICAgICgxNikKICNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTBfQ0FQX0dFVF9NQVhfU1lOQ19PRkZTRVQoQ2FwKSAgICAgIFwKLSAgICAoICAoKENhcCkgJiBNUElfU0NTSVBPUlRQQUdFMF9DQVBfTUFTS19NQVhfU1lOQ19PRkZTRVQpIFwKKyAgICAoICAoKENhcCkgJiBNUElfU0NTSVBPUlRQQUdFMF9DQVBfTUFYX1NZTkNfT0ZGU0VUX01BU0spIFwKICAgICA+PiBNUElfU0NTSVBPUlRQQUdFMF9DQVBfU0hJRlRfTUFYX1NZTkNfT0ZGU0VUICAgICAgICAgIFwKICAgICApCiAjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9JRFAgICAgICAgICAgICAgICAgICAgICAgICgweDA4MDAwMDAwKQpAQCAtMjM3MCw0NyArMjQwMyw0OCBAQAogfSBDT05GSUdfUEFHRV9TQVNfSU9fVU5JVF8xLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfU0FTX0lPX1VOSVRfMSwKICAgU2FzSU9Vbml0UGFnZTFfdCwgTVBJX1BPSU5URVIgcFNhc0lPVW5pdFBhZ2UxX3Q7CiAKLSNkZWZpbmUgTVBJX1NBU0lPVU5JVFBBR0UxX1BBR0VWRVJTSU9OICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9TQVNJT1VOSVRQQUdFMV9QQUdFVkVSU0lPTiAgICAgICgweDA1KQogCiAvKiB2YWx1ZXMgZm9yIFNBUyBJTyBVbml0IFBhZ2UgMSBDb250cm9sRmxhZ3MgKi8KLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfREVWSUNFX1NFTEZfVEVTVCAgICAgICAgKDB4ODAwMCkKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfU0FUQV8zXzBfTUFYICAgICAgICAgICAgKDB4NDAwMCkKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfU0FUQV8xXzVfTUFYICAgICAgICAgICAgKDB4MjAwMCkKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfU0FUQV9TV19QUkVTRVJWRSAgICAgICAgKDB4MTAwMCkKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfRElTQUJMRV9TQVNfSEFTSCAgICAgICAgKDB4MDgwMCkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfREVWSUNFX1NFTEZfVEVTVCAgICAgICAgICAgICgweDgwMDApCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX1NBVEFfM18wX01BWCAgICAgICAgICAgICAgICAoMHg0MDAwKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9TQVRBXzFfNV9NQVggICAgICAgICAgICAgICAgKDB4MjAwMCkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfU0FUQV9TV19QUkVTRVJWRSAgICAgICAgICAgICgweDEwMDApCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX0RJU0FCTEVfU0FTX0hBU0ggICAgICAgICAgICAoMHgwODAwKQogCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX01BU0tfREVWX1NVUFBPUlQgICAgICAgICgweDA2MDApCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX1NISUZUX0RFVl9TVVBQT1JUICAgICAgICg5KQotI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9ERVZfU1VQUE9SVF9CT1RIICAgICAgICAoMHgwMCkKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfREVWX1NBU19TVVBQT1JUICAgICAgICAgKDB4MDEpCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX0RFVl9TQVRBX1NVUFBPUlQgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9NQVNLX0RFVl9TVVBQT1JUICAgICAgICAgICAgKDB4MDYwMCkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfU0hJRlRfREVWX1NVUFBPUlQgICAgICAgICAgICg5KQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9ERVZfU1VQUE9SVF9CT1RIICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX0RFVl9TQVNfU1VQUE9SVCAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfREVWX1NBVEFfU1VQUE9SVCAgICAgICAgICAgICgweDAyKQogCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX1NBVEFfNDhCSVRfTEJBX1JFUVVJUkVEICgweDAwODApCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX1NBVEFfU01BUlRfUkVRVUlSRUQgICAgICgweDAwNDApCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX1NBVEFfTkNRX1JFUVVJUkVEICAgICAgICgweDAwMjApCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX1NBVEFfRlVBX1JFUVVJUkVEICAgICAgICgweDAwMTApCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX1BIWV9FTkFCTEVfT1JERVJfSElHSCAgICgweDAwMDgpCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX1NVQlRSQUNUSVZFX0lMTEVHQUwgICAgICgweDAwMDQpCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX0ZJUlNUX0xWTF9ESVNDX09OTFkgICAgICgweDAwMDIpCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX0NMRUFSX0FGRklMSUFUSU9OICAgICAgICgweDAwMDEpCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX1BPU1RQT05FX1NBVEFfSU5JVCAgICAgICAgICAoMHgwMTAwKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9TQVRBXzQ4QklUX0xCQV9SRVFVSVJFRCAgICAgKDB4MDA4MCkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfU0FUQV9TTUFSVF9SRVFVSVJFRCAgICAgICAgICgweDAwNDApCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX1NBVEFfTkNRX1JFUVVJUkVEICAgICAgICAgICAoMHgwMDIwKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9TQVRBX0ZVQV9SRVFVSVJFRCAgICAgICAgICAgKDB4MDAxMCkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfUEhZX0VOQUJMRV9PUkRFUl9ISUdIICAgICAgICgweDAwMDgpCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9DT05UUk9MX1NVQlRSQUNUSVZFX0lMTEVHQUwgICAgICAgICAoMHgwMDA0KQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfQ09OVFJPTF9GSVJTVF9MVkxfRElTQ19PTkxZICAgICAgICAgKDB4MDAwMikKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfQ0xFQVJfQUZGSUxJQVRJT04gICAgICAgICAgICgweDAwMDEpCiAKIC8qIHZhbHVlcyBmb3IgU0FTIElPIFVuaXQgUGFnZSAxIFBvcnRGbGFncyAqLwotI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfUE9SVF9GTEFHU18wX1RBUkdFVF9JT0NfTlVNICAgICAoMHgwMCkKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX1BPUlRfRkxBR1NfMV9UQVJHRVRfSU9DX05VTSAgICAgKDB4MDQpCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9QT1JUX0ZMQUdTX0FVVE9fUE9SVF9DT05GSUcgICAgICgweDAxKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfUE9SVF9GTEFHU18wX1RBUkdFVF9JT0NfTlVNICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9QT1JUX0ZMQUdTXzFfVEFSR0VUX0lPQ19OVU0gICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX1BPUlRfRkxBR1NfQVVUT19QT1JUX0NPTkZJRyAgICAgICAgICgweDAxKQogCiAvKiB2YWx1ZXMgZm9yIFNBUyBJTyBVbml0IFBhZ2UgMCBQaHlGbGFncyAqLwotI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfUEhZX0ZMQUdTX1BIWV9ESVNBQkxFICAgICAgICAgICAoMHgwNCkKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX1BIWV9GTEFHU19UWF9JTlZFUlQgICAgICAgICAgICAgKDB4MDIpCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9QSFlfRkxBR1NfUlhfSU5WRVJUICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfUEhZX0ZMQUdTX1BIWV9ESVNBQkxFICAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9QSFlfRkxBR1NfVFhfSU5WRVJUICAgICAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX1BIWV9GTEFHU19SWF9JTlZFUlQgICAgICAgICAgICAgICAgICgweDAxKQogCiAvKiB2YWx1ZXMgZm9yIFNBUyBJTyBVbml0IFBhZ2UgMCBNYXhNaW5MaW5rUmF0ZSAqLwotI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfTUFYX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAoMHhGMCkKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX01BWF9SQVRFXzFfNSAgICAgICAgICAgICAgICAgICAgKDB4ODApCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9NQVhfUkFURV8zXzAgICAgICAgICAgICAgICAgICAgICgweDkwKQotI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfTUlOX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAoMHgwRikKLSNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX01JTl9SQVRFXzFfNSAgICAgICAgICAgICAgICAgICAgKDB4MDgpCi0jZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9NSU5fUkFURV8zXzAgICAgICAgICAgICAgICAgICAgICgweDA5KQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfTUFYX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgKDB4RjApCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9NQVhfUkFURV8xXzUgICAgICAgICAgICAgICAgICAgICAgICAoMHg4MCkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX01BWF9SQVRFXzNfMCAgICAgICAgICAgICAgICAgICAgICAgICgweDkwKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfTUlOX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgKDB4MEYpCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9NSU5fUkFURV8xXzUgICAgICAgICAgICAgICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX01JTl9SQVRFXzNfMCAgICAgICAgICAgICAgICAgICAgICAgICgweDA5KQogCiAvKiBzZWUgbXBpX3Nhcy5oIGZvciB2YWx1ZXMgZm9yIFNBUyBJTyBVbml0IFBhZ2UgMSBDb250cm9sbGVyUGh5RGV2aWNlSW5mbyB2YWx1ZXMgKi8KIApAQCAtMjQxOCwxNiArMjQ1MiwxOCBAQAogdHlwZWRlZiBzdHJ1Y3QgX0NPTkZJR19QQUdFX1NBU19JT19VTklUXzIKIHsKICAgICBDT05GSUdfRVhURU5ERURfUEFHRV9IRUFERVIgICAgICAgICBIZWFkZXI7ICAgICAgICAgICAgICAgICAvKiAwMGggKi8KLSAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAvKiAwOGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1EZXZzUGVyRW5jbG9zdXJlOyAgICAvKiAwOGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAvKiAwOWggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAvKiAwQWggKi8KICAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhQZXJzaXN0ZW50SURzOyAgICAgICAvKiAwQ2ggKi8KICAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1QZXJzaXN0ZW50SURzVXNlZDsgICAvKiAwRWggKi8KICAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXM7ICAgICAgICAgICAgICAgICAvKiAxMGggKi8KICAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnczsgICAgICAgICAgICAgICAgICAvKiAxMWggKi8KLSAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhOdW1QaHlzaWNhbE1hcHBlZElEczsvKiAxMmggKi8gICAgICAgICAgICAgIC8qIDEyaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heE51bVBoeXNpY2FsTWFwcGVkSURzOy8qIDEyaCAqLwogfSBDT05GSUdfUEFHRV9TQVNfSU9fVU5JVF8yLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfU0FTX0lPX1VOSVRfMiwKICAgU2FzSU9Vbml0UGFnZTJfdCwgTVBJX1BPSU5URVIgcFNhc0lPVW5pdFBhZ2UyX3Q7CiAKLSNkZWZpbmUgTVBJX1NBU0lPVU5JVFBBR0UyX1BBR0VWRVJTSU9OICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9TQVNJT1VOSVRQQUdFMl9QQUdFVkVSU0lPTiAgICAgICgweDA1KQogCiAvKiB2YWx1ZXMgZm9yIFNBUyBJTyBVbml0IFBhZ2UgMiBTdGF0dXMgZmllbGQgKi8KICNkZWZpbmUgTVBJX1NBU19JT1VOSVQyX1NUQVRVU19ESVNBQkxFRF9QRVJTSVNURU5UX01BUFBJTkdTICgweDAyKQpAQCAtMjQ0MSw2ICsyNDc3LDcgQEAKICNkZWZpbmUgTVBJX1NBU19JT1VOSVQyX0ZMQUdTX05PX1BIWVNfTUFQICAgICAgICAgICAgICAgICAgICgweDAwKQogI2RlZmluZSBNUElfU0FTX0lPVU5JVDJfRkxBR1NfRElSRUNUX0FUVEFDSF9QSFlTX01BUCAgICAgICAgKDB4MDEpCiAjZGVmaW5lIE1QSV9TQVNfSU9VTklUMl9GTEFHU19FTkNMT1NVUkVfU0xPVF9QSFlTX01BUCAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQyX0ZMQUdTX0hPU1RfQVNTSUdORURfUEhZU19NQVAgICAgICAgICgweDA3KQogCiAjZGVmaW5lIE1QSV9TQVNfSU9VTklUMl9GTEFHU19SRVNFUlZFX0lEXzBfRk9SX0JPT1QgICAgICAgICAoMHgxMCkKICNkZWZpbmUgTVBJX1NBU19JT1VOSVQyX0ZMQUdTX0RBX1NUQVJUSU5HX1NMT1QgICAgICAgICAgICAgICgweDIwKQpAQCAtMjQ3Myw3ICsyNTEwLDcgQEAKICAgICBDT05GSUdfRVhURU5ERURfUEFHRV9IRUFERVIgICAgICAgICBIZWFkZXI7ICAgICAgICAgICAgICAgICAvKiAwMGggKi8KICAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaHlzaWNhbFBvcnQ7ICAgICAgICAgICAvKiAwOGggKi8KICAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAvKiAwOWggKi8KLSAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAvKiAwQWggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNsb3N1cmVIYW5kbGU7ICAgICAgICAvKiAwQWggKi8KICAgICBVNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQVNBZGRyZXNzOyAgICAgICAgICAgICAvKiAwQ2ggKi8KICAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNjb3ZlcnlTdGF0dXM7ICAgICAgICAvKiAxNGggKi8KICAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZIYW5kbGU7ICAgICAgICAgICAgICAvKiAxOGggKi8KQEAgLTI0ODcsNyArMjUyNCw3IEBACiB9IENPTkZJR19QQUdFX1NBU19FWFBBTkRFUl8wLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfU0FTX0VYUEFOREVSXzAsCiAgIFNhc0V4cGFuZGVyUGFnZTBfdCwgTVBJX1BPSU5URVIgcFNhc0V4cGFuZGVyUGFnZTBfdDsKIAotI2RlZmluZSBNUElfU0FTRVhQQU5ERVIwX1BBR0VWRVJTSU9OICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJX1NBU0VYUEFOREVSMF9QQUdFVkVSU0lPTiAgICAgICAgKDB4MDMpCiAKIC8qIHZhbHVlcyBmb3IgU0FTIEV4cGFuZGVyIFBhZ2UgMCBEaXNjb3ZlcnlTdGF0dXMgZmllbGQgKi8KICNkZWZpbmUgTVBJX1NBU19FWFBBTkRFUjBfRFNfTE9PUF9ERVRFQ1RFRCAgICAgICAgICAgICAgKDB4MDAwMDAwMDEpCkBAIC0yNTI3LDkgKzI1NjQsOSBAQAogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBOZWdvdGlhdGVkTGlua1JhdGU7ICAgICAvKiAxRmggKi8KICAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgUGh5SWRlbnRpZmllcjsgICAgICAgICAgLyogMjBoICovCiAgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaGVkUGh5SWRlbnRpZmllcjsgIC8qIDIxaCAqLwotICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1UYWJsZUVudHJpZXNQcm9nOyAgICAvKiAyMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAgICAgLyogMjJoICovCiAgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvdmVyeUluZm87ICAgICAgICAgIC8qIDIzaCAqLwotICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAvKiAyNGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ0OyAgICAgICAgICAgICAgLyogMjRoICovCiB9IENPTkZJR19QQUdFX1NBU19FWFBBTkRFUl8xLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfU0FTX0VYUEFOREVSXzEsCiAgIFNhc0V4cGFuZGVyUGFnZTFfdCwgTVBJX1BPSU5URVIgcFNhc0V4cGFuZGVyUGFnZTFfdDsKIApAQCAtMjc2NiwxNiArMjgwMywxNSBAQAogI2RlZmluZSBNUElfTE9HXzBfTlVNX0xPR19FTlRSSUVTICAgICAgICAoMSkKICNlbmRpZgogCi0jZGVmaW5lIE1QSV9MT0dfMF9MT0dfREFUQV9MRU5HVEggICAgICAgICgyMCkKKyNkZWZpbmUgTVBJX0xPR18wX0xPR19EQVRBX0xFTkdUSCAgICAgICAgKDB4MUMpCiAKIHR5cGVkZWYgc3RydWN0IF9NUElfTE9HXzBfRU5UUlkKIHsKLSAgICBVNjQgICAgICAgICBXV0lEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KLSAgICBVMzIgICAgICAgICBUaW1lU3RhbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwOGggKi8KLSAgICBVMzIgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwQ2ggKi8KLSAgICBVMTYgICAgICAgICBMb2dTZXF1ZW5jZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMGggKi8KLSAgICBVMTYgICAgICAgICBMb2dFbnRyeVF1YWxpZmllcjsgICAgICAgICAgICAgICAgICAvKiAxMmggKi8KLSAgICBVOCAgICAgICAgICBMb2dEYXRhW01QSV9MT0dfMF9MT0dfREFUQV9MRU5HVEhdOyAvKiAxNGggKi8KKyAgICBVMzIgICAgICAgICBUaW1lU3RhbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVMzIgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVMTYgICAgICAgICBMb2dTZXF1ZW5jZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiAwOGggKi8KKyAgICBVMTYgICAgICAgICBMb2dFbnRyeVF1YWxpZmllcjsgICAgICAgICAgICAgICAgICAvKiAwQWggKi8KKyAgICBVOCAgICAgICAgICBMb2dEYXRhW01QSV9MT0dfMF9MT0dfREFUQV9MRU5HVEhdOyAvKiAwQ2ggKi8KIH0gTVBJX0xPR18wX0VOVFJZLCBNUElfUE9JTlRFUiBQVFJfTVBJX0xPR18wX0VOVFJZLAogICBNcGlMb2cwRW50cnlfdCwgTVBJX1BPSU5URVIgcE1waUxvZzBFbnRyeV90OwogCkBAIC0yNzk0LDcgKzI4MzAsNyBAQAogfSBDT05GSUdfUEFHRV9MT0dfMCwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX0xPR18wLAogICBMb2dQYWdlMF90LCBNUElfUE9JTlRFUiBwTG9nUGFnZTBfdDsKIAotI2RlZmluZSBNUElfTE9HXzBfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX0xPR18wX1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgKDB4MDEpCiAKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaGlzdG9yeS50eHQgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaGlzdG9yeS50eHQKaW5kZXggMWEzMGVmMS4uNGE1ZjhkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2hpc3RvcnkudHh0CisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9oaXN0b3J5LnR4dApAQCAtNiwyNSArNiwyNSBAQAogIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IExTSSBMb2dpYyBDb3Jwb3JhdGlvbi4KIAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEhlYWRlciBTZXQgUmVsZWFzZSBWZXJzaW9uOiAgICAwMS4wNS4xMAotIEhlYWRlciBTZXQgUmVsZWFzZSBEYXRlOiAgICAgICAwMy0xMS0wNQorIEhlYWRlciBTZXQgUmVsZWFzZSBWZXJzaW9uOiAgICAwMS4wNS4xMgorIEhlYWRlciBTZXQgUmVsZWFzZSBEYXRlOiAgICAgICAwOC0zMC0wNQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgRmlsZW5hbWUgICAgICAgICAgICAgICBDdXJyZW50IHZlcnNpb24gICAgIFByaW9yIHZlcnNpb24KICAtLS0tLS0tLS0tICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLSAgICAgLS0tLS0tLS0tLS0tLQotIG1waS5oICAgICAgICAgICAgICAgICAgMDEuMDUuMDggICAgICAgICAgICAwMS4wNS4wNwotIG1waV9pb2MuaCAgICAgICAgICAgICAgMDEuMDUuMDkgICAgICAgICAgICAwMS4wNS4wOAotIG1waV9jbmZnLmggICAgICAgICAgICAgMDEuMDUuMDkgICAgICAgICAgICAwMS4wNS4wOAotIG1waV9pbml0LmggICAgICAgICAgICAgMDEuMDUuMDUgICAgICAgICAgICAwMS4wNS4wNAotIG1waV90YXJnLmggICAgICAgICAgICAgMDEuMDUuMDUgICAgICAgICAgICAwMS4wNS4wNAorIG1waS5oICAgICAgICAgICAgICAgICAgMDEuMDUuMTAgICAgICAgICAgICAwMS4wNS4wOQorIG1waV9pb2MuaCAgICAgICAgICAgICAgMDEuMDUuMTAgICAgICAgICAgICAwMS4wNS4wOQorIG1waV9jbmZnLmggICAgICAgICAgICAgMDEuMDUuMTEgICAgICAgICAgICAwMS4wNS4xMAorIG1waV9pbml0LmggICAgICAgICAgICAgMDEuMDUuMDYgICAgICAgICAgICAwMS4wNS4wNgorIG1waV90YXJnLmggICAgICAgICAgICAgMDEuMDUuMDUgICAgICAgICAgICAwMS4wNS4wNQogIG1waV9mYy5oICAgICAgICAgICAgICAgMDEuMDUuMDEgICAgICAgICAgICAwMS4wNS4wMQogIG1waV9sYW4uaCAgICAgICAgICAgICAgMDEuMDUuMDEgICAgICAgICAgICAwMS4wNS4wMQogIG1waV9yYWlkLmggICAgICAgICAgICAgMDEuMDUuMDIgICAgICAgICAgICAwMS4wNS4wMgogIG1waV90b29sLmggICAgICAgICAgICAgMDEuMDUuMDMgICAgICAgICAgICAwMS4wNS4wMwogIG1waV9pbmIuaCAgICAgICAgICAgICAgMDEuMDUuMDEgICAgICAgICAgICAwMS4wNS4wMQotIG1waV9zYXMuaCAgICAgICAgICAgICAgMDEuMDUuMDEgICAgICAgICAgICAwMS4wNS4wMQotIG1waV90eXBlLmggICAgICAgICAgICAgMDEuMDUuMDEgICAgICAgICAgICAwMS4wNS4wMQotIG1waV9oaXN0b3J5LnR4dCAgICAgICAgMDEuMDUuMDkgICAgICAgICAgICAwMS4wNS4wOQorIG1waV9zYXMuaCAgICAgICAgICAgICAgMDEuMDUuMDIgICAgICAgICAgICAwMS4wNS4wMQorIG1waV90eXBlLmggICAgICAgICAgICAgMDEuMDUuMDIgICAgICAgICAgICAwMS4wNS4wMQorIG1waV9oaXN0b3J5LnR4dCAgICAgICAgMDEuMDUuMTIgICAgICAgICAgICAwMS4wNS4xMQogCiAKICAqICBEYXRlICAgICAgVmVyc2lvbiAgIERlc2NyaXB0aW9uCkBAIC05MSw2ICs5MSw4IEBACiAgKiAgMDYtMjQtMDUgIDAxLjA1LjA4ICBBZGRlZCBmdW5jdGlvbiBjb2RlcyBmb3IgU0NTSSBJTyAzMiBhbmQKICAqICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEFzc2lzdEV4dGVuZGVkIHJlcXVlc3RzLgogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgRUVEUCBJT0NTdGF0dXMgY29kZXMuCisgKiAgMDgtMDMtMDUgIDAxLjA1LjA5ICBCdW1wZWQgTVBJX0hFQURFUl9WRVJTSU9OX1VOSVQuCisgKiAgMDgtMzAtMDUgIDAxLjA1LjEwICBBZGRlZCAyIG5ldyBJT0NTdGF0dXMgY29kZXMgZm9yIFRhcmdldC4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBtcGlfaW9jLmgKQEAgLTE2NCw2ICsxNjYsMTAgQEAKICAqICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgSU9DRmFjdHMgUmVwbHkgRUVEUCBDYXBhYmlsaXR5IGJpdC4KICAqICAwNi0yNC0wNSAgMDEuMDUuMDkgIEFkZGVkIDUgbmV3IElPQ0ZhY3RzIFJlcGx5IElPQ0NhcGFiaWxpdGllcyBiaXRzLgogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTWF4IFNBVEEgVGFyZ2V0cyB0byBTQVMgRGlzY292ZXJ5IEVycm9yIGV2ZW50LgorICogIDA4LTMwLTA1ICAwMS4wNS4xMCAgQWRkZWQgNCBuZXcgZXZlbnRzIGFuZCB0aGVpciBldmVudCBkYXRhIHN0cnVjdHVyZXMuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBuZXcgUmVhc29uQ29kZSB2YWx1ZSBmb3IgU0FTIERldmljZSBTdGF0dXMgQ2hhbmdlCisgKiAgICAgICAgICAgICAgICAgICAgICBldmVudC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIG5ldyBmYW1pbHkgY29kZSBmb3IgRkM5NDlFLgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIG1waV9jbmZnLmgKQEAgLTQwMiw2ICs0MDgsMjMgQEAKICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE93bmVyRGV2SGFuZGxlIGFuZCBGbGFncyBmaWVsZCB0byBTQVMgUEhZIFBhZ2UgMC4KICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIElPQyBHUElPIEZsYWdzIGRlZmluZSB0byBTQVMgRW5jbG9zdXJlIFBhZ2UgMC4KICAqICAgICAgICAgICAgICAgICAgICAgIEZpeGVkIHRoZSB2YWx1ZSBmb3IgTVBJX1NBU19JT1VOSVQxX0NPTlRST0xfREVWX1NBVEFfU1VQUE9SVC4KKyAqICAwOC0wMy0wNSAgMDEuMDUuMTAgIFJlbW92ZWQgSVNEYXRhU2NydWJSYXRlIGFuZCBJU1Jlc3luY1JhdGUgZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgTWFudWZhY3R1cmluZyBQYWdlIDQuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNUElfSU9VTklUUEFHRTFfU0FUQV9XUklURV9DQUNIRV9ESVNBQkxFIGJpdC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE51bURldnNQZXJFbmNsb3N1cmUgZmllbGQgdG8gU0FTIElPIFVuaXQgcGFnZSAyLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJX1NBU19JT1VOSVQyX0ZMQUdTX0hPU1RfQVNTSUdORURfUEhZU19NQVAKKyAqICAgICAgICAgICAgICAgICAgICAgIGRlZmluZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIEVuY2xvc3VyZUhhbmRsZSBmaWVsZCB0byBTQVMgRXhwYW5kZXIgcGFnZSAwLgorICogICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlZCByZWR1bmRhbnQgTnVtVGFibGVFbnRyaWVzUHJvZyBmaWVsZCBmcm9tIFNBUworICogICAgICAgICAgICAgICAgICAgICAgRXhwYW5kZXIgUGFnZSAxLgorICogIDA4LTMwLTA1ICAwMS4wNS4xMSAgQWRkZWQgRGV2aWNlSUQgZm9yIEZDOTQ5RSBhbmQgY2hhbmdlZCB0aGUgRGV2aWNlSUQgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICBTQVMxMDc4LgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgbW9yZSBkZWZpbmVzIGZvciBNYW51ZmFjdHVyaW5nIFBhZ2UgNCBGbGFncyBmaWVsZC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIG1vcmUgZGVmaW5lcyBmb3IgSU9DU2V0dGluZ3MgYW5kIGFkZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICBFeHBhbmRlclNwaW51cCBmaWVsZCB0byBCaW9zIFBhZ2UgMS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIHBvc3Rwb25lIFNBVEEgSW5pdCBiaXQgdG8gU0FTIElPIFVuaXQgUGFnZSAxCisgKiAgICAgICAgICAgICAgICAgICAgICBDb250cm9sRmxhZ3MuCisgKiAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkIExvZ0VudHJ5IGZvcm1hdCBmb3IgTG9nIFBhZ2UgMC4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBtcGlfaW5pdC5oCkBAIC00NDIsNiArNDY1LDggQEAKICAqICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NpbmcuCiAgKiAgMDYtMjQtMDUgIDAxLjA1LjA1ICBBZGRlZCBTQ1NJIElPIDMyIHN0cnVjdHVyZXMgYW5kIGRlZmluZXMuCiAgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBmb3VyIG5ldyBkZWZpbmVzIGZvciBTRVAgU2xvdFN0YXR1cy4KKyAqICAwOC0wMy0wNSAgMDEuMDUuMDYgIEZpeGVkIHNvbWUgTVBJX1NDU0lJTzMyX01TR0ZMR1NfIGRlZmluZXMgdG8gbWFrZSB0aGVtCisgKiAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUgaW4gdGhlIGZpcnN0IDMyIGNoYXJhY3RlcnMuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogbXBpX3RhcmcuaApAQCAtNTgyLDYgKzYwNyw5IEBACiAKIG1waV9zYXMuaAogICogIDA4LTE5LTA0ICAwMS4wNS4wMSAgT3JpZ2luYWwgcmVsZWFzZS4KKyAqICAwOC0zMC0wNSAgMDEuMDUuMDIgIEFkZGVkIERldmljZUluZm8gYml0IGZvciBTRVAuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBQcmltRmxhZ3MgYW5kIFByaW1pdGl2ZSBmaWVsZCB0byBTQVMgSU8gVW5pdAorICogICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByZXF1ZXN0LCBhbmQgYWRkZWQgYSBuZXcgb3BlcmF0aW9uIGNvZGUuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogbXBpX3R5cGUuaApAQCAtNTkyLDI0ICs2MjAsMjUgQEAKICAqICAwOC0wOC0wMSAgMDEuMDIuMDEgIE9yaWdpbmFsIHJlbGVhc2UgZm9yIHYxLjIgd29yay4KICAqICAwNS0xMS0wNCAgMDEuMDMuMDEgIE9yaWdpbmFsIHJlbGVhc2UgZm9yIE1QSSB2MS4zLgogICogIDA4LTE5LTA0ICAwMS4wNS4wMSAgT3JpZ2luYWwgcmVsZWFzZSBmb3IgTVBJIHYxLjUuCisgKiAgMDgtMzAtMDUgIDAxLjA1LjAyICBBZGRlZCBQb3dlclBDIG9wdGlvbiB0byAjaWZkZWYncy4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBtcGlfaGlzdG9yeS50eHQgICAgICAgICBQYXJ0cyBsaXN0IGhpc3RvcnkKIAotRmlsZW5hbWUgICAgMDEuMDUuMTAgIDAxLjA1LjA5Ci0tLS0tLS0tLS0tICAtLS0tLS0tLSAgLS0tLS0tLS0KLW1waS5oICAgICAgIDAxLjA1LjA4ICAwMS4wNS4wNwotbXBpX2lvYy5oICAgMDEuMDUuMDkgIDAxLjA1LjA4Ci1tcGlfY25mZy5oICAwMS4wNS4wOSAgMDEuMDUuMDgKLW1waV9pbml0LmggIDAxLjA1LjA1ICAwMS4wNS4wNAotbXBpX3RhcmcuaCAgMDEuMDUuMDUgIDAxLjA1LjA0Ci1tcGlfZmMuaCAgICAwMS4wNS4wMSAgMDEuMDUuMDEKLW1waV9sYW4uaCAgIDAxLjA1LjAxICAwMS4wNS4wMQotbXBpX3JhaWQuaCAgMDEuMDUuMDIgIDAxLjA1LjAyCi1tcGlfdG9vbC5oICAwMS4wNS4wMyAgMDEuMDUuMDMKLW1waV9pbmIuaCAgIDAxLjA1LjAxICAwMS4wNS4wMQotbXBpX3Nhcy5oICAgMDEuMDUuMDEgIDAxLjA1LjAxCi1tcGlfdHlwZS5oICAwMS4wNS4wMSAgMDEuMDUuMDEKK0ZpbGVuYW1lICAgIDAxLjA1LjEyICAwMS4wNS4xMSAgMDEuMDUuMTAgIDAxLjA1LjA5CistLS0tLS0tLS0tICAtLS0tLS0tLSAgLS0tLS0tLS0gIC0tLS0tLS0tICAtLS0tLS0tLQorbXBpLmggICAgICAgMDEuMDUuMTAgIDAxLjA1LjA5ICAwMS4wNS4wOCAgMDEuMDUuMDcKK21waV9pb2MuaCAgIDAxLjA1LjEwICAwMS4wNS4wOSAgMDEuMDUuMDkgIDAxLjA1LjA4CittcGlfY25mZy5oICAwMS4wNS4xMSAgMDEuMDUuMTAgIDAxLjA1LjA5ICAwMS4wNS4wOAorbXBpX2luaXQuaCAgMDEuMDUuMDYgIDAxLjA1LjA2ICAwMS4wNS4wNSAgMDEuMDUuMDQKK21waV90YXJnLmggIDAxLjA1LjA1ICAwMS4wNS4wNSAgMDEuMDUuMDUgIDAxLjA1LjA0CittcGlfZmMuaCAgICAwMS4wNS4wMSAgMDEuMDUuMDEgIDAxLjA1LjAxICAwMS4wNS4wMQorbXBpX2xhbi5oICAgMDEuMDUuMDEgIDAxLjA1LjAxICAwMS4wNS4wMSAgMDEuMDUuMDEKK21waV9yYWlkLmggIDAxLjA1LjAyICAwMS4wNS4wMiAgMDEuMDUuMDIgIDAxLjA1LjAyCittcGlfdG9vbC5oICAwMS4wNS4wMyAgMDEuMDUuMDMgIDAxLjA1LjAzICAwMS4wNS4wMworbXBpX2luYi5oICAgMDEuMDUuMDEgIDAxLjA1LjAxICAwMS4wNS4wMSAgMDEuMDUuMDEKK21waV9zYXMuaCAgIDAxLjA1LjAyICAwMS4wNS4wMSAgMDEuMDUuMDEgIDAxLjA1LjAxCittcGlfdHlwZS5oICAwMS4wNS4wMiAgMDEuMDUuMDEgIDAxLjA1LjAxICAwMS4wNS4wMQogCiBGaWxlbmFtZSAgICAwMS4wNS4wOCAgIDAxLjA1LjA3ICAgMDEuMDUuMDYgICAwMS4wNS4wNSAgIDAxLjA1LjA0ICAgMDEuMDUuMDMKIC0tLS0tLS0tLS0gIC0tLS0tLS0tICAgLS0tLS0tLS0gICAtLS0tLS0tLSAgIC0tLS0tLS0tICAgLS0tLS0tLS0gICAtLS0tLS0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2luaXQuaCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9pbml0LmgKaW5kZXggZDVhZjc1YS4uNjg5NDFmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2luaXQuaAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaW5pdC5oCkBAIC02LDcgKzYsNyBAQAogICogICAgICAgICAgVGl0bGU6ICBNUEkgaW5pdGlhdG9yIG1vZGUgbWVzc2FnZXMgYW5kIHN0cnVjdHVyZXMKICAqICBDcmVhdGlvbiBEYXRlOiAgSnVuZSA4LCAyMDAwCiAgKgotICogICAgbXBpX2luaXQuaCBWZXJzaW9uOiAgMDEuMDUuMDUKKyAqICAgIG1waV9pbml0LmggVmVyc2lvbjogIDAxLjA1LjA2CiAgKgogICogIFZlcnNpb24gSGlzdG9yeQogICogIC0tLS0tLS0tLS0tLS0tLQpAQCAtNTAsNiArNTAsOCBAQAogICogICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2luZy4KICAqICAwNi0yNC0wNSAgMDEuMDUuMDUgIEFkZGVkIFNDU0kgSU8gMzIgc3RydWN0dXJlcyBhbmQgZGVmaW5lcy4KICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGZvdXIgbmV3IGRlZmluZXMgZm9yIFNFUCBTbG90U3RhdHVzLgorICogIDA4LTAzLTA1ICAwMS4wNS4wNiAgRml4ZWQgc29tZSBNUElfU0NTSUlPMzJfTVNHRkxHU18gZGVmaW5lcyB0byBtYWtlIHRoZW0KKyAqICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZSBpbiB0aGUgZmlyc3QgMzIgY2hhcmFjdGVycy4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTI5MCw4ICsyOTIsOCBAQAogCiAvKiBTQ1NJIElPIDMyIE1zZ0ZsYWdzIGJpdHMgKi8KICNkZWZpbmUgTVBJX1NDU0lJTzMyX01TR0ZMR1NfU0VOU0VfV0lEVEggICAgICAgICAgICAgICAgKDB4MDEpCi0jZGVmaW5lIE1QSV9TQ1NJSU8zMl9NU0dGTEdTX1NFTlNFX1dJRFRIXzMyICAgICAgICAgICAgICgweDAwKQotI2RlZmluZSBNUElfU0NTSUlPMzJfTVNHRkxHU19TRU5TRV9XSURUSF82NCAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX1NDU0lJTzMyX01TR0ZMR1NfMzJfU0VOU0VfV0lEVEggICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSV9TQ1NJSU8zMl9NU0dGTEdTXzY0X1NFTlNFX1dJRFRIICAgICAgICAgICAgICgweDAxKQogCiAjZGVmaW5lIE1QSV9TQ1NJSU8zMl9NU0dGTEdTX1NFTlNFX0xPQ0FUSU9OICAgICAgICAgICAgICgweDAyKQogI2RlZmluZSBNUElfU0NTSUlPMzJfTVNHRkxHU19TRU5TRV9MT0NfSE9TVCAgICAgICAgICAgICAoMHgwMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9pb2MuaCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9pb2MuaAppbmRleCA5M2I3MGUyLi4yYzVmNDNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaW9jLmgKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2lvYy5oCkBAIC02LDcgKzYsNyBAQAogICogICAgICAgICAgVGl0bGU6ICBNUEkgSU9DLCBQb3J0LCBFdmVudCwgRlcgRG93bmxvYWQsIGFuZCBGVyBVcGxvYWQgbWVzc2FnZXMKICAqICBDcmVhdGlvbiBEYXRlOiAgQXVndXN0IDExLCAyMDAwCiAgKgotICogICAgbXBpX2lvYy5oIFZlcnNpb246ICAwMS4wNS4wOQorICogICAgbXBpX2lvYy5oIFZlcnNpb246ICAwMS4wNS4xMAogICoKICAqICBWZXJzaW9uIEhpc3RvcnkKICAqICAtLS0tLS0tLS0tLS0tLS0KQEAgLTgzLDYgKzgzLDEwIEBACiAgKiAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVkIElPQ0ZhY3RzIFJlcGx5IEVFRFAgQ2FwYWJpbGl0eSBiaXQuCiAgKiAgMDYtMjQtMDUgIDAxLjA1LjA5ICBBZGRlZCA1IG5ldyBJT0NGYWN0cyBSZXBseSBJT0NDYXBhYmlsaXRpZXMgYml0cy4KICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1heCBTQVRBIFRhcmdldHMgdG8gU0FTIERpc2NvdmVyeSBFcnJvciBldmVudC4KKyAqICAwOC0zMC0wNSAgMDEuMDUuMTAgIEFkZGVkIDQgbmV3IGV2ZW50cyBhbmQgdGhlaXIgZXZlbnQgZGF0YSBzdHJ1Y3R1cmVzLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgbmV3IFJlYXNvbkNvZGUgdmFsdWUgZm9yIFNBUyBEZXZpY2UgU3RhdHVzIENoYW5nZQorICogICAgICAgICAgICAgICAgICAgICAgZXZlbnQuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBuZXcgZmFtaWx5IGNvZGUgZm9yIEZDOTQ5RS4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTQ2NCw2ICs0NjgsMTAgQEAKICNkZWZpbmUgTVBJX0VWRU5UX1BFUlNJU1RFTlRfVEFCTEVfRlVMTCAgICAgKDB4MDAwMDAwMTEpCiAjZGVmaW5lIE1QSV9FVkVOVF9TQVNfUEhZX0xJTktfU1RBVFVTICAgICAgICgweDAwMDAwMDEyKQogI2RlZmluZSBNUElfRVZFTlRfU0FTX0RJU0NPVkVSWV9FUlJPUiAgICAgICAoMHgwMDAwMDAxMykKKyNkZWZpbmUgTVBJX0VWRU5UX0lSX1JFU1lOQ19VUERBVEUgICAgICAgICAgKDB4MDAwMDAwMTQpCisjZGVmaW5lIE1QSV9FVkVOVF9JUjIgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDE1KQorI2RlZmluZSBNUElfRVZFTlRfU0FTX0RJU0NPVkVSWSAgICAgICAgICAgICAoMHgwMDAwMDAxNikKKyNkZWZpbmUgTVBJX0VWRU5UX0xPR19FTlRSWV9BRERFRCAgICAgICAgICAgKDB4MDAwMDAwMjEpCiAKIC8qIEFja1JlcXVpcmVkIGZpZWxkIHZhbHVlcyAqLwogCkBAIC00ODAsNiArNDg4LDI5IEBACiB9IEVWRU5UX0RBVEFfRVZFTlRfQ0hBTkdFLCBNUElfUE9JTlRFUiBQVFJfRVZFTlRfREFUQV9FVkVOVF9DSEFOR0UsCiAgIEV2ZW50RGF0YUV2ZW50Q2hhbmdlX3QsIE1QSV9QT0lOVEVSIHBFdmVudERhdGFFdmVudENoYW5nZV90OwogCisvKiBMb2dFbnRyeUFkZGVkIEV2ZW50IGRhdGEgKi8KKworLyogdGhpcyBzdHJ1Y3R1cmUgbWF0Y2hlcyBNUElfTE9HXzBfRU5UUlkgaW4gbXBpX2NuZmcuaCAqLworI2RlZmluZSBNUElfRVZFTlRfREFUQV9MT0dfRU5UUllfREFUQV9MRU5HVEggICAgKDB4MUMpCit0eXBlZGVmIHN0cnVjdCBfRVZFTlRfREFUQV9MT0dfRU5UUlkKK3sKKyAgICBVMzIgICAgICAgICBUaW1lU3RhbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVMzIgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVMTYgICAgICAgICBMb2dTZXF1ZW5jZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiAwOGggKi8KKyAgICBVMTYgICAgICAgICBMb2dFbnRyeVF1YWxpZmllcjsgICAgICAgICAgICAgICAgICAvKiAwQWggKi8KKyAgICBVOCAgICAgICAgICBMb2dEYXRhW01QSV9FVkVOVF9EQVRBX0xPR19FTlRSWV9EQVRBX0xFTkdUSF07IC8qIDBDaCAqLworfSBFVkVOVF9EQVRBX0xPR19FTlRSWSwgTVBJX1BPSU5URVIgUFRSX0VWRU5UX0RBVEFfTE9HX0VOVFJZLAorICBNcGlFdmVudERhdGFMb2dFbnRyeV90LCBNUElfUE9JTlRFUiBwTXBpRXZlbnREYXRhTG9nRW50cnlfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX0VWRU5UX0RBVEFfTE9HX0VOVFJZX0FEREVECit7CisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgTG9nU2VxdWVuY2U7ICAgICAgICAgICAgLyogMDBoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgLyogMDRoICovCisgICAgRVZFTlRfREFUQV9MT0dfRU5UUlkgICAgTG9nRW50cnk7ICAgICAgICAgICAgICAgLyogMDhoICovCit9IEVWRU5UX0RBVEFfTE9HX0VOVFJZX0FEREVELCBNUElfUE9JTlRFUiBQVFJfRVZFTlRfREFUQV9MT0dfRU5UUllfQURERUQsCisgIE1waUV2ZW50RGF0YUxvZ0VudHJ5QWRkZWRfdCwgTVBJX1BPSU5URVIgcE1waUV2ZW50RGF0YUxvZ0VudHJ5QWRkZWRfdDsKKwogLyogU0NTSSBFdmVudCBkYXRhIGZvciBQb3J0LCBCdXMgYW5kIERldmljZSBmb3JtcyAqLwogCiB0eXBlZGVmIHN0cnVjdCBfRVZFTlRfREFUQV9TQ1NJCkBAIC01MzgsNiArNTY5LDcgQEAKICNkZWZpbmUgTVBJX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19TTUFSVF9EQVRBICAgICAgICAgICAgKDB4MDUpCiAjZGVmaW5lIE1QSV9FVkVOVF9TQVNfREVWX1NUQVRfUkNfTk9fUEVSU0lTVF9BRERFRCAgICAgICgweDA2KQogI2RlZmluZSBNUElfRVZFTlRfU0FTX0RFVl9TVEFUX1JDX1VOU1VQUE9SVEVEICAgICAgICAgICAoMHgwNykKKyNkZWZpbmUgTVBJX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19JTlRFUk5BTF9ERVZJQ0VfUkVTRVQgKDB4MDgpCiAKIAogLyogU0NTSSBFdmVudCBkYXRhIGZvciBRdWV1ZSBGdWxsIGV2ZW50ICovCkBAIC01NzksNiArNjExLDc5IEBACiAjZGVmaW5lIE1QSV9FVkVOVF9SQUlEX1JDX1NNQVJUX0RBVEEgICAgICAgICAgICAgICAgICAgICgweDBBKQogI2RlZmluZSBNUElfRVZFTlRfUkFJRF9SQ19SRVBMQUNFX0FDVElPTl9TVEFSVEVEICAgICAgICAoMHgwQikKIAorCisvKiBNUEkgSW50ZWdyYXRlZCBSQUlEIFJlc3luYyBVcGRhdGUgRXZlbnQgZGF0YSAqLworCit0eXBlZGVmIHN0cnVjdCBfTVBJX0VWRU5UX0RBVEFfSVJfUkVTWU5DX1VQREFURQoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZUlEOyAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVCdXM7ICAgICAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzeW5jQ29tcGxldGU7ICAgICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgLyogMDRoICovCit9IE1QSV9FVkVOVF9EQVRBX0lSX1JFU1lOQ19VUERBVEUsCisgIE1QSV9QT0lOVEVSIFBUUl9NUElfRVZFTlRfREFUQV9JUl9SRVNZTkNfVVBEQVRFLAorICBNcGlFdmVudERhdGFJclJlc3luY1VwZGF0ZV90LCBNUElfUE9JTlRFUiBwTXBpRXZlbnREYXRhSXJSZXN5bmNVcGRhdGVfdDsKKworLyogTVBJIElSMiBFdmVudCBkYXRhICovCisKKy8qIE1QSV9MRF9TVEFURSBvciBNUElfUERfU1RBVEUgKi8KK3R5cGVkZWYgc3RydWN0IF9JUjJfU1RBVEVfQ0hBTkdFRAoreworICAgIFUxNiAgICAgICAgICAgICAgICAgUHJldmlvdXNTdGF0ZTsgIC8qIDAwaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgTmV3U3RhdGU7ICAgICAgIC8qIDAyaCAqLworfSBJUjJfU1RBVEVfQ0hBTkdFRCwgTVBJX1BPSU5URVIgUFRSX0lSMl9TVEFURV9DSEFOR0VEOworCit0eXBlZGVmIHN0cnVjdCBfSVIyX1BEX0lORk8KK3sKKyAgICBVMTYgICAgICAgICAgICAgICAgIERldmljZUhhbmRsZTsgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgVHJ1bmNFbmNsb3N1cmVIYW5kbGU7ICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICBUcnVuY2F0ZWRTbG90OyAgICAgICAgICAvKiAwM2ggKi8KK30gSVIyX1BEX0lORk8sIE1QSV9QT0lOVEVSIFBUUl9JUjJfUERfSU5GTzsKKwordHlwZWRlZiB1bmlvbiBfTVBJX0lSMl9SQ19FVkVOVF9EQVRBCit7CisgICAgSVIyX1NUQVRFX0NIQU5HRUQgICBTdGF0ZUNoYW5nZWQ7CisgICAgVTMyICAgICAgICAgICAgICAgICBMYmE7CisgICAgSVIyX1BEX0lORk8gICAgICAgICBQZEluZm87Cit9IE1QSV9JUjJfUkNfRVZFTlRfREFUQSwgTVBJX1BPSU5URVIgUFRSX01QSV9JUjJfUkNfRVZFTlRfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgX01QSV9FVkVOVF9EQVRBX0lSMgoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFRhcmdldElEOyAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBCdXM7ICAgICAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVhc29uQ29kZTsgICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFBoeXNEaXNrTnVtOyAgICAgICAgICAvKiAwM2ggKi8KKyAgICBNUElfSVIyX1JDX0VWRU5UX0RBVEEgICBJUjJFdmVudERhdGE7ICAgICAgICAgLyogMDRoICovCit9IE1QSV9FVkVOVF9EQVRBX0lSMiwgTVBJX1BPSU5URVIgUFRSX01QSV9FVkVOVF9EQVRBX0lSMiwKKyAgTXBpRXZlbnREYXRhSVIyX3QsIE1QSV9QT0lOVEVSIHBNcGlFdmVudERhdGFJUjJfdDsKKworLyogTVBJIElSMiBFdmVudCBkYXRhIFJlYXNvbkNvZGUgdmFsdWVzICovCisjZGVmaW5lIE1QSV9FVkVOVF9JUjJfUkNfTERfU1RBVEVfQ0hBTkdFRCAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSV9FVkVOVF9JUjJfUkNfUERfU1RBVEVfQ0hBTkdFRCAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9FVkVOVF9JUjJfUkNfQkFEX0JMT0NLX1RBQkxFX0ZVTEwgICAgICAgKDB4MDMpCisjZGVmaW5lIE1QSV9FVkVOVF9JUjJfUkNfUERfSU5TRVJURUQgICAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9FVkVOVF9JUjJfUkNfUERfUkVNT1ZFRCAgICAgICAgICAgICAgICAgKDB4MDUpCisjZGVmaW5lIE1QSV9FVkVOVF9JUjJfUkNfRk9SRUlHTl9DRkdfREVURUNURUQgICAgICAgKDB4MDYpCisjZGVmaW5lIE1QSV9FVkVOVF9JUjJfUkNfUkVCVUlMRF9NRURJVU1fRVJST1IgICAgICAgKDB4MDcpCisKKy8qIGRlZmluZXMgZm9yIGxvZ2ljYWwgZGlzayBzdGF0ZXMgKi8KKyNkZWZpbmUgTVBJX0xEX1NUQVRFX09QVElNQUwgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX0xEX1NUQVRFX0RFR1JBREVEICAgICAgICAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX0xEX1NUQVRFX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJX0xEX1NUQVRFX01JU1NJTkcgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMykKKyNkZWZpbmUgTVBJX0xEX1NUQVRFX09GRkxJTkUgICAgICAgICAgICAgICAgICAgICAgICAoMHgwNCkKKworLyogZGVmaW5lcyBmb3IgcGh5c2ljYWwgZGlzayBzdGF0ZXMgKi8KKyNkZWZpbmUgTVBJX1BEX1NUQVRFX09OTElORSAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX1BEX1NUQVRFX01JU1NJTkcgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX1BEX1NUQVRFX05PVF9DT01QQVRJQkxFICAgICAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJX1BEX1NUQVRFX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMykKKyNkZWZpbmUgTVBJX1BEX1NUQVRFX0lOSVRJQUxJWklORyAgICAgICAgICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTVBJX1BEX1NUQVRFX09GRkxJTkVfQVRfSE9TVF9SRVFVRVNUICAgICAgICAoMHgwNSkKKyNkZWZpbmUgTVBJX1BEX1NUQVRFX0ZBSUxFRF9BVF9IT1NUX1JFUVVFU1QgICAgICAgICAoMHgwNikKKyNkZWZpbmUgTVBJX1BEX1NUQVRFX09GRkxJTkVfRk9SX0FOT1RIRVJfUkVBU09OICAgICAoMHhGRikKKwogLyogTVBJIExpbmsgU3RhdHVzIENoYW5nZSBFdmVudCBkYXRhICovCiAKIHR5cGVkZWYgc3RydWN0IF9FVkVOVF9EQVRBX0xJTktfU1RBVFVTCkBAIC02NjAsNiArNzY1LDIwIEBACiAjZGVmaW5lIE1QSV9FVkVOVF9TQVNfUExTX0xSX1JBVEVfMV81ICAgICAgICAgICAgICAgICAgICAgICAoMHgwOCkKICNkZWZpbmUgTVBJX0VWRU5UX1NBU19QTFNfTFJfUkFURV8zXzAgICAgICAgICAgICAgICAgICAgICAgICgweDA5KQogCisvKiBTQVMgRGlzY292ZXJ5IEV2ZW50IGRhdGEgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX0VWRU5UX0RBVEFfU0FTX0RJU0NPVkVSWQoreworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIERpc2NvdmVyeVN0YXR1czsgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMDRoICovCit9IEVWRU5UX0RBVEFfU0FTX0RJU0NPVkVSWSwgTVBJX1BPSU5URVIgUFRSX0VWRU5UX0RBVEFfU0FTX0RJU0NPVkVSWSwKKyAgRXZlbnREYXRhU2FzRGlzY292ZXJ5X3QsIE1QSV9QT0lOVEVSIHBFdmVudERhdGFTYXNEaXNjb3ZlcnlfdDsKKworI2RlZmluZSBNUElfRVZFTlRfU0FTX0RTQ1ZSWV9DT01QTEVURSAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIE1QSV9FVkVOVF9TQVNfRFNDVlJZX0lOX1BST0dSRVNTICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgTVBJX0VWRU5UX1NBU19EU0NWUllfUEhZX0JJVFNfTUFTSyAgICAgICAgICAgICAgICAgICgweEZGRkYwMDAwKQorI2RlZmluZSBNUElfRVZFTlRfU0FTX0RTQ1ZSWV9QSFlfQklUU19TSElGVCAgICAgICAgICAgICAgICAgKDE2KQorCiAvKiBTQVMgRGlzY292ZXJ5IEVycnJvciBFdmVudCBkYXRhICovCiAKIHR5cGVkZWYgc3RydWN0IF9FVkVOVF9EQVRBX0RJU0NPVkVSWV9FUlJPUgpAQCAtODY5LDYgKzk4OCw3IEBACiAjZGVmaW5lIE1QSV9GV19IRUFERVJfUElEX0ZBTUlMWV85MTlYTF9GQyAgICAgICAoMHgwMDAzKSAvKiA5MTlYTCBhbmQgOTI5WEwgKi8KICNkZWZpbmUgTVBJX0ZXX0hFQURFUl9QSURfRkFNSUxZXzkzOVhfRkMgICAgICAgICgweDAwMDQpIC8qIDkzOVggYW5kIDk0OVggICAqLwogI2RlZmluZSBNUElfRldfSEVBREVSX1BJRF9GQU1JTFlfOTU5X0ZDICAgICAgICAgKDB4MDAwNSkKKyNkZWZpbmUgTVBJX0ZXX0hFQURFUl9QSURfRkFNSUxZXzk0OUVfRkMgICAgICAgICgweDAwMDYpCiAvKiBTQVMgKi8KICNkZWZpbmUgTVBJX0ZXX0hFQURFUl9QSURfRkFNSUxZXzEwNjRfU0FTICAgICAgICgweDAwMDEpCiAjZGVmaW5lIE1QSV9GV19IRUFERVJfUElEX0ZBTUlMWV8xMDY4X1NBUyAgICAgICAoMHgwMDAyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2xvZ19mYy5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2xvZ19mYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOThkNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfbG9nX2ZjLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBMU0kgTG9naWMgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIE5BTUU6ICAgICAgICAgICBmY19sb2cuaAorICogIFNVTU1BUlk6ICAgICAgICBNUEkgSW9jTG9nSW5mbyBkZWZpbml0aW9ucyBmb3IgdGhlIFNZTUZDOXh4IGNoaXBzCisgKiAgREVTQ1JJUFRJT046ICAgIENvbnRhaW5zIHRoZSBlbnVtZXJhdGVkIGxpc3Qgb2YgdmFsdWVzIHRoYXQgbWF5IGJlIHJldHVybmVkCisgKiAgICAgICAgICAgICAgICAgIGluIHRoZSBJT0NMb2dJbmZvIGZpZWxkIG9mIGEgTVBJIERlZmF1bHQgUmVwbHkgTWVzc2FnZS4KKyAqCisgKiAgQ1JFQVRJT04gREFURTogIDYvMDIvMjAwMAorICogIElEOiAgICAgICAgICAgICAkSWQ6IGZjX2xvZy5oLHYgNC42IDIwMDEvMDcvMjYgMTQ6NDE6MzMgc3NjaHJlbW0gRXhwICQKKyAqLworCisKKy8qCisgKiBNcGlJb2NMb2dJbmZvX3QgZW51bQorICoKKyAqIFRoZXNlIDMyIGJpdCB2YWx1ZXMgYXJlIHVzZWQgaW4gdGhlIElPQ0xvZ0luZm8gZmllbGQgb2YgdGhlIE1QSSByZXBseQorICogbWVzc2FnZXMuCisgKiBUaGUgdmFsdWUgaXMgMHhhYmNjY2NjYyB3aGVyZQorICogICAgICAgICAgYSA9IFRoZSB0eXBlIG9mIGxvZyBpbmZvIGFzIHBlciB0aGUgTVBJIHNwZWMuIFNpbmNlIHRoZXNlIGNvZGVzIGFyZQorICogICAgICAgICAgICAgIGFsbCBmb3IgRmlicmUgQ2hhbm5lbCB0aGlzIHZhbHVlIHdpbGwgYWx3YXlzIGJlIDIuCisgKiAgICAgICAgICBiID0gU3BlY2lmaWVzIGEgc3ViY2xhc3Mgb2YgdGhlIGZpcm13YXJlIHdoZXJlCisgKiAgICAgICAgICAgICAgICAgIDAgPSBGQ1AgSW5pdGlhdG9yCisgKiAgICAgICAgICAgICAgICAgIDEgPSBGQ1AgVGFyZ2V0CisgKiAgICAgICAgICAgICAgICAgIDIgPSBMQU4KKyAqICAgICAgICAgICAgICAgICAgMyA9IE1QSSBNZXNzYWdlIExheWVyCisgKiAgICAgICAgICAgICAgICAgIDQgPSBGQyBMaW5rCisgKiAgICAgICAgICAgICAgICAgIDUgPSBDb250ZXh0IE1hbmFnZXIKKyAqICAgICAgICAgICAgICAgICAgNiA9IEludmFsaWQgRmllbGQgT2Zmc2V0CisgKiAgICAgICAgICAgICAgICAgIDcgPSBTdGF0ZSBDaGFuZ2UgSW5mbworICogICAgICAgICAgICAgICAgICBhbGwgb3RoZXJzIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQorICogICAgICAgICAgYyA9IEEgc3BlY2lmaWMgdmFsdWUgd2l0aGluIHRoZSBzdWJjbGFzcy4KKyAqCisgKiBOT1RFOiBBbnkgbmV3IHZhbHVlcyBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGVuZCBvZiBlYWNoIHN1YmNsYXNzIHNvIHRoYXQgdGhlCisgKiAgICAgICBjb2RlcyByZW1haW4gY29uc2lzdGVudCBhY3Jvc3MgZmlybXdhcmUgcmVsZWFzZXMuCisgKi8KK3R5cGVkZWYgZW51bSBfTXBpSW9jTG9nSW5mb0ZjCit7CisgICAgTVBJX0lPQ0xPR0lORk9fRkNfSU5JVF9CQVNFICAgICAgICAgICAgICAgICAgICAgPSAweDIwMDAwMDAwLAorICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0lOSVRfRVJST1JfT1VUX09GX09SREVSX0ZSQU1FID0gMHgyMDAwMDAwMSwgLyogcmVjZWl2ZWQgYW4gb3V0IG9mIG9yZGVyIGZyYW1lIC0gdW5zdXBwb3J0ZWQgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19JTklUX0VSUk9SX0JBRF9TVEFSVF9PRl9GUkFNRSA9IDB4MjAwMDAwMDIsIC8qIEJhZCBSeCBGcmFtZSwgYmFkIHN0YXJ0IG9mIGZyYW1lIHByaW1hdGl2ZSAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0lOSVRfRVJST1JfQkFEX0VORF9PRl9GUkFNRSAgID0gMHgyMDAwMDAwMywgLyogQmFkIFJ4IEZyYW1lLCBiYWQgZW5kIG9mIGZyYW1lIHByaW1hdGl2ZSAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0lOSVRfRVJST1JfT1ZFUl9SVU4gICAgICAgICAgID0gMHgyMDAwMDAwNCwgLyogQmFkIFJ4IEZyYW1lLCBvdmVycnVuICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfSU5JVF9FUlJPUl9SWF9PVEhFUiAgICAgICAgICAgPSAweDIwMDAwMDA1LCAvKiBPdGhlciBlcnJvcnMgY2F1Z2h0IGJ5IElPQyB3aGljaCByZXF1aXJlIHJldHJpZXMgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19JTklUX0VSUk9SX1NVQlBST0NfREVBRCAgICAgICA9IDB4MjAwMDAwMDYsIC8qIE1haW4gcHJvY2Vzc29yIGNvdWxkIG5vdCBpbml0aWFsaXplIHN1Yi1wcm9jZXNzb3IgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19JTklUX0VSUk9SX1JYX09WRVJSVU4gICAgICAgICA9IDB4MjAwMDAwMDcsIC8qIFNjYXR0ZXIgR2F0aGVyIG92ZXJydW4gICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfSU5JVF9FUlJPUl9SWF9CQURfU1RBVFVTICAgICAgPSAweDIwMDAwMDA4LCAvKiBSZWNlaXZlciBkZXRlY3RlZCBjb250ZXh0IG1pc21hdGNoIHZpYSBpbnZhbGlkIGhlYWRlciAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0lOSVRfRVJST1JfUlhfVU5FWFBFQ1RFRF9GUkFNRT0gMHgyMDAwMDAwOSwgLyogQ3R4TWdyIGRldGVjdGVkIHVuc3VwcG9ydGVkIGZyYW1lIHR5cGUgICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfSU5JVF9FUlJPUl9MSU5LX0ZBSUxVUkUgICAgICAgPSAweDIwMDAwMDBBLCAvKiBMaW5rIGZhaWx1cmUgb2NjdXJyZWQgICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfSU5JVF9FUlJPUl9UWF9USU1FT1VUICAgICAgICAgPSAweDIwMDAwMDBCLCAvKiBUcmFuc21pdHRlciB0aW1lb3V0IGVycm9yICovCisKKyAgICBNUElfSU9DTE9HSU5GT19GQ19UQVJHRVRfQkFTRSAgICAgICAgICAgICAgICAgICA9IDB4MjEwMDAwMDAsCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfVEFSR0VUX05PX1BESVNDICAgICAgICAgICAgICAgPSAweDIxMDAwMDAxLCAvKiBub3Qgc2VudCBiZWNhdXNlIHdlIGFyZSB3YWl0aW5nIGZvciBhIFBESVNDIGZyb20gdGhlIGluaXRpYXRvciAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX1RBUkdFVF9OT19MT0dJTiAgICAgICAgICAgICAgID0gMHgyMTAwMDAwMiwgLyogbm90IHNlbnQgYmVjYXVzZSB3ZSBhcmUgbm90IGxvZ2dlZCBpbiB0byB0aGUgcmVtb3RlIG5vZGUgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19UQVJHRVRfRE9BUl9LSUxMRURfQllfTElQICAgICA9IDB4MjEwMDAwMDMsIC8qIERhdGEgT3V0LCBBdXRvIFJlc3BvbnNlLCBub3Qgc2VudCBkdWUgdG8gYSBMSVAgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19UQVJHRVRfRElBUl9LSUxMRURfQllfTElQICAgICA9IDB4MjEwMDAwMDQsIC8qIERhdGEgSW4sIEF1dG8gUmVzcG9uc2UsIG5vdCBzZW50IGR1ZSB0byBhIExJUCAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX1RBUkdFVF9ESUFSX01JU1NJTkdfREFUQSAgICAgID0gMHgyMTAwMDAwNSwgLyogRGF0YSBJbiwgQXV0byBSZXNwb25zZSwgbWlzc2luZyBkYXRhIGZyYW1lcyAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX1RBUkdFVF9ET05SX0tJTExFRF9CWV9MSVAgICAgID0gMHgyMTAwMDAwNiwgLyogRGF0YSBPdXQsIE5vIFJlc3BvbnNlLCBub3Qgc2VudCBkdWUgdG8gYSBMSVAgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19UQVJHRVRfV1JTUF9LSUxMRURfQllfTElQICAgICA9IDB4MjEwMDAwMDcsIC8qIEF1dG8tcmVzcG9uc2UgYWZ0ZXIgYSB3cml0ZSBub3Qgc2VudCBkdWUgdG8gYSBMSVAgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19UQVJHRVRfRElOUl9LSUxMRURfQllfTElQICAgICA9IDB4MjEwMDAwMDgsIC8qIERhdGEgSW4sIE5vIFJlc3BvbnNlLCBub3QgY29tcGxldGVkIGR1ZSB0byBhIExJUCAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX1RBUkdFVF9ESU5SX01JU1NJTkdfREFUQSAgICAgID0gMHgyMTAwMDAwOSwgLyogRGF0YSBJbiwgTm8gUmVzcG9uc2UsIG1pc3NpbmcgZGF0YSBmcmFtZXMgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19UQVJHRVRfTVJTUF9LSUxMRURfQllfTElQICAgICA9IDB4MjEwMDAwMGEsIC8qIE1hbnVhbCBSZXNwb25zZSBub3Qgc2VudCBkdWUgdG8gYSBMSVAgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19UQVJHRVRfTk9fQ0xBU1NfMyAgICAgICAgICAgICA9IDB4MjEwMDAwMGIsIC8qIG5vdCBzZW50IGJlY2F1c2UgcmVtb3RlIG5vZGUgZG9lcyBub3Qgc3VwcG9ydCBDbGFzcyAzICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfVEFSR0VUX0xPR0lOX05PVF9WQUxJRCAgICAgICAgPSAweDIxMDAwMDBjLCAvKiBub3Qgc2VudCBiZWNhdXNlIGxvZ2luIHRvIHJlbW90ZSBub2RlIG5vdCB2YWxpZGF0ZWQgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19UQVJHRVRfRlJPTV9PVVRCT1VORCAgICAgICAgICA9IDB4MjEwMDAwMGUsIC8qIGNsZWFyZWQgZnJvbSB0aGUgb3V0Ym91bmQgcXVldWUgYWZ0ZXIgYSBsb2dvdXQgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19UQVJHRVRfV0FJVElOR19GT1JfREFUQV9JTiAgICA9IDB4MjEwMDAwMGYsIC8qIGNsZWFyZWQgd2FpdGluZyBmb3IgZGF0YSBhZnRlciBhIGxvZ291dCAqLworCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfTEFOX0JBU0UgICAgICAgICAgICAgICAgICAgICAgPSAweDIyMDAwMDAwLAorICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0xBTl9UUkFOU19TR0xfTUlTU0lORyAgICAgICAgID0gMHgyMjAwMDAwMSwgLyogVHJhbnNhY3Rpb24gQ29udGV4dCBTZ2wgTWlzc2luZyAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0xBTl9UUkFOU19XUk9OR19QTEFDRSAgICAgICAgID0gMHgyMjAwMDAwMiwgLyogVHJhbnNhY3Rpb24gQ29udGV4dCBmb3VuZCBiZWZvcmUgYW4gRU9CICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfTEFOX1RSQU5TX1JFU19CSVRTX1NFVCAgICAgICAgPSAweDIyMDAwMDAzLCAvKiBUcmFuc2FjdGlvbiBDb250ZXh0IHZhbHVlIGhhcyByZXNlcnZlZCBiaXRzIHNldCAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0xBTl9XUk9OR19TR0xfRkxBRyAgICAgICAgICAgID0gMHgyMjAwMDAwNCwgLyogSW52YWxpZCBTR0wgRmxhZ3MgKi8KKworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX01TR19CQVNFICAgICAgICAgICAgICAgICAgICAgID0gMHgyMzAwMDAwMCwKKworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0xJTktfQkFTRSAgICAgICAgICAgICAgICAgICAgID0gMHgyNDAwMDAwMCwKKyAgICBNUElfSU9DTE9HSU5GT19GQ19MSU5LX0xPT1BfSU5JVF9USU1FT1VUICAgICAgICA9IDB4MjQwMDAwMDEsIC8qIExvb3AgaW5pdGlhbGl6YXRpb24gdGltZWQgb3V0ICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfTElOS19BTFJFQURZX0lOSVRJQUxJWkVEICAgICAgPSAweDI0MDAwMDAyLCAvKiBBbm90aGVyIHN5c3RlbSBjb250cm9sbGVyIGFscmVhZHkgaW5pdGlhbGl6ZWQgdGhlIGxvb3AgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19MSU5LX0xJTktfTk9UX0VTVEFCTElTSEVEICAgICA9IDB4MjQwMDAwMDMsIC8qIE5vdCBzeW5jaHJvbml6ZWQgdG8gc2lnbmFsIG9yIHN0aWxsIG5lZ290aWF0aW5nIChwb3NzaWJsZSBjYWJsZSBwcm9ibGVtKSAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0xJTktfQ1JDX0VSUk9SICAgICAgICAgICAgICAgID0gMHgyNDAwMDAwNCwgLyogQ1JDIGNoZWNrIGRldGVjdGVkIGVycm9yIG9uIHJlY2VpdmVkIGZyYW1lICovCisKKyAgICBNUElfSU9DTE9HSU5GT19GQ19DVFhfQkFTRSAgICAgICAgICAgICAgICAgICAgICA9IDB4MjUwMDAwMDAsCisKKyAgICBNUElfSU9DTE9HSU5GT19GQ19JTlZBTElEX0ZJRUxEX0JZVEVfT0ZGU0VUICAgICA9IDB4MjYwMDAwMDAsIC8qIFRoZSBsb3dlciAyNCBiaXRzIGdpdmUgdGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBmaWVsZCBpbiB0aGUgcmVxdWVzdCBtZXNzYWdlIHRoYXQgaXMgaW52YWxpZCAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0lOVkFMSURfRklFTERfTUFYX09GRlNFVCAgICAgID0gMHgyNmZmZmZmZiwKKworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX1NUQVRFX0NIQU5HRSAgICAgICAgICAgICAgICAgID0gMHgyNzAwMDAwMCAgLyogVGhlIGxvd2VyIDI0IGJpdHMgZ2l2ZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGNvbmNlcm5pbmcgc3RhdGUgY2hhbmdlICovCisKK30gTXBpSW9jTG9nSW5mb0ZjX3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfbG9nX3Nhcy5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2xvZ19zYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjU5ZDFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2xvZ19zYXMuaApAQCAtMCwwICsxLDE2MiBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgQ29weXJpZ2h0IDIwMDMgTFNJIExvZ2ljIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgVGhpcyBmaWxlIGlzIGNvbmZpZGVudGlhbCBhbmQgYSB0cmFkZSBzZWNyZXQgb2YgTFNJIExvZ2ljLiAgVGhlICAgICAgICAqCisgKiAgcmVjZWlwdCBvZiBvciBwb3NzZXNzaW9uIG9mIHRoaXMgZmlsZSBkb2VzIG5vdCBjb252ZXkgYW55IHJpZ2h0cyB0byAgICAqCisgKiAgcmVwcm9kdWNlIG9yIGRpc2Nsb3NlIGl0cyBjb250ZW50cyBvciB0byBtYW51ZmFjdHVyZSwgdXNlLCBvciBzZWxsICAgICAqCisgKiAgYW55dGhpbmcgaXQgbWF5IGRlc2NyaWJlLCBpbiB3aG9sZSwgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgc3BlY2lmaWMgICAqCisgKiAgd3JpdHRlbiBjb25zZW50IG9mIExTSSBMb2dpYyBDb3Jwb3JhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICAgICAgIE5hbWU6ICBpb3BpSW9jTG9nSW5mby5oCisgKiAgICAgICAgICBUaXRsZTogIFNBUyBGaXJtd2FyZSBJT1AgSW50ZXJmYWNlIElPQyBMb2cgSW5mbyBEZWZpbml0aW9ucworICogICAgIFByb2dyYW1tZXI6ICBHdXkgS2VuZGFsbAorICogIENyZWF0aW9uIERhdGU6ICBTZXB0ZW1iZXIgMjQsIDIwMDMKKyAqCisgKiAgVmVyc2lvbiBIaXN0b3J5CisgKiAgLS0tLS0tLS0tLS0tLS0tCisgKgorICogIExhc3QgVXBkYXRlZAorICogIC0tLS0tLS0tLS0tLS0KKyAqICBWZXJzaW9uICAgICAgICAgJXZlcnNpb246IDIyICUKKyAqICBEYXRlIFVwZGF0ZWQgICAgJWRhdGVfbW9kaWZpZWQ6ICUKKyAqICBQcm9ncmFtbWVyICAgICAgJWNyZWF0ZWRfYnk6IG5wZXJ1Y2NhICUKKyAqCisgKiAgRGF0ZSAgICAgIFdobyAgIERlc2NyaXB0aW9uCisgKiAgLS0tLS0tLS0gIC0tLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAwOS8yNC8wMyAgR1dLICAgSW5pdGlhbCB2ZXJzaW9uCisgKgorICoKKyAqIERlc2NyaXB0aW9uCisgKiAtLS0tLS0tLS0tLS0KKyAqIFRoaXMgaW5jbHVkZSBmaWxlIGNvbnRhaW5zIFNBUyBmaXJtd2FyZSBpbnRlcmZhY2UgSU9DIExvZyBJbmZvIGNvZGVzCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBJT1BJX0lPQ0xPR0lORk9fSF9JTkNMVURFRAorI2RlZmluZSBJT1BJX0lPQ0xPR0lORk9fSF9JTkNMVURFRAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIElPQyBMT0dJTkZPIGRlZmluZXMsIDB4MDAwMDAwMDAgLSAweDBGRkZGRkZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRm9ybWF0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQml0cyAzMS0yODogTVBJX0lPQ0xPR0lORk9fVFlQRV9TQVMgKDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBCaXRzIDI3LTI0OiBJT0NfTE9HSU5GT19PUklHSU5BVE9SOiAwPUlPUCwgMT1QTCwgMj1JUiAgICAgICAgICAgICAgICovCisvKiAgICAgIEJpdHMgMjMtMTY6IExPR0lORk9fQ09ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQml0cyAxNS0wOiAgTE9HSU5GT19DT0RFIFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSU9DX0xPR0lORk9fT1JJR0lOQVRPUiBkZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSU9DX0xPR0lORk9fT1JJR0lOQVRPUl9JT1AgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIElPQ19MT0dJTkZPX09SSUdJTkFUT1JfUEwgICAgICAgICAgICAgICAgICAgICAgICgweDAxMDAwMDAwKQorI2RlZmluZSBJT0NfTE9HSU5GT19PUklHSU5BVE9SX0lSICAgICAgICAgICAgICAgICAgICAgICAoMHgwMjAwMDAwMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBMT0dJTkZPX0NPREUgZGVmaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBJT0NfTE9HSU5GT19DT0RFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMEZGMDAwMCkKKyNkZWZpbmUgSU9DX0xPR0lORk9fQ09ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgKDE2KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIElPUCBMT0dJTkZPX0NPREUgZGVmaW5lcywgdmFsaWQgaWYgSU9DX0xPR0lORk9fT1JJR0lOQVRPUiA9IElPUCAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElPUF9MT0dJTkZPX0NPREVfSU5WQUxJRF9TQVNfQUREUkVTUyAgICAgICAgICAgICgweDAwMDEwMDAwKQorI2RlZmluZSBJT1BfTE9HSU5GT19DT0RFX1VOVVNFRDIgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAyMDAwMCkKKyNkZWZpbmUgSU9QX0xPR0lORk9fQ09ERV9DT05GSUdfSU5WQUxJRF9QQUdFICAgICAgICAgICAgKDB4MDAwMzAwMDApCisjZGVmaW5lIElPUF9MT0dJTkZPX0NPREVfQ09ORklHX0lOVkFMSURfUEFHRV9SVCAgICAgICAgICgweDAwMDMwMTAwKSAvKiBSb3V0ZSBUYWJsZSBFbnRyeSBub3QgZm91bmQgKi8KKyNkZWZpbmUgSU9QX0xPR0lORk9fQ09ERV9DT05GSUdfSU5WQUxJRF9QQUdFX1BOICAgICAgICAgKDB4MDAwMzAyMDApIC8qIEludmFsaWQgUGFnZSBOdW1iZXIgKi8KKyNkZWZpbmUgSU9QX0xPR0lORk9fQ09ERV9DT05GSUdfSU5WQUxJRF9QQUdFX0ZPUk0gICAgICAgKDB4MDAwMzAzMDApIC8qIEludmFsaWQgRk9STSAqLworI2RlZmluZSBJT1BfTE9HSU5GT19DT0RFX0NPTkZJR19JTlZBTElEX1BBR0VfUFQgICAgICAgICAoMHgwMDAzMDQwMCkgLyogSW52YWxpZCBQYWdlIFR5cGUgKi8KKyNkZWZpbmUgSU9QX0xPR0lORk9fQ09ERV9DT05GSUdfSU5WQUxJRF9QQUdFX0ROTSAgICAgICAgKDB4MDAwMzA1MDApIC8qIERldmljZSBOb3QgTWFwcGVkICovCisjZGVmaW5lIElPUF9MT0dJTkZPX0NPREVfQ09ORklHX0lOVkFMSURfUEFHRV9QRVJTSVNUICAgICgweDAwMDMwNjAwKSAvKiBQZXJzaXN0ZW50IFBhZ2Ugbm90IGZvdW5kICovCisjZGVmaW5lIElPUF9MT0dJTkZPX0NPREVfQ09ORklHX0lOVkFMSURfUEFHRV9ERUZBVUxUICAgICgweDAwMDMwNzAwKSAvKiBEZWZhdWx0IFBhZ2Ugbm90IGZvdW5kICovCisjZGVmaW5lIElPUF9MT0dJTkZPX0NPREVfVEFTS19URVJNSU5BVEVEICAgICAgICAgICAgICAgICgweDAwMDUwMDAwKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUEwgTE9HSU5GT19DT0RFIGRlZmluZXMsIHZhbGlkIGlmIElPQ19MT0dJTkZPX09SSUdJTkFUT1IgPSBQTCAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX09QRU5fRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDEwMDAwKQorI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfSU5WQUxJRF9TR0wgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMjAwMDApCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9XUk9OR19SRUxfT0ZGX09SX0ZSQU1FX0xFTkdUSCAgICAgICAoMHgwMDAzMDAwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX0ZSQU1FX1hGRVJfRVJST1IgICAgICAgICAgICAgICAgICAgICgweDAwMDQwMDAwKQorI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfVFhfRk1fQ09OTkVDVEVEX0xPVyAgICAgICAgICAgICAgICAgKDB4MDAwNTAwMDApCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9TQVRBX05PTl9OQ1FfUldfRVJSX0JJVF9TRVQgICAgICAgICAoMHgwMDA2MDAwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX1NBVEFfUkVBRF9MT0dfUkVDRUlWRV9EQVRBX0VSUiAgICAgICgweDAwMDcwMDAwKQorI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfU0FUQV9OQ1FfRkFJTF9BTExfQ01EU19BRlRSX0VSUiAgICAgKDB4MDAwODAwMDApCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9TQVRBX0VSUl9JTl9SQ1ZfU0VUX0RFVl9CSVRfRklTICAgICAoMHgwMDA5MDAwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX1JYX0ZNX0lOVkFMSURfTUVTU0FHRSAgICAgICAgICAgICAgICgweDAwMEEwMDAwKQorI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfUlhfQ1RYX01FU1NBR0VfVkFMSURfRVJST1IgICAgICAgICAgKDB4MDAwQjAwMDApCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9SWF9GTV9DVVJSRU5UX0ZSQU1FX0VSUk9SICAgICAgICAgICAoMHgwMDBDMDAwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX1NBVEFfTElOS19ET1dOICAgICAgICAgICAgICAgICAgICAgICgweDAwMEQwMDAwKQorI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfRElTQ09WRVJZX1NBVEFfSU5JVF9XX0lPUyAgICAgICAgICAgKDB4MDAwRTAwMDApCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9DT05GSUdfSU5WQUxJRF9QQUdFICAgICAgICAgICAgICAgICAoMHgwMDBGMDAwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX0NPTkZJR19JTlZBTElEX1BBR0VfUFQgICAgICAgICAgICAgICgweDAwMEYwMTAwKSAvKiBJbnZhbGlkIFBhZ2UgVHlwZSAqLworI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfQ09ORklHX0lOVkFMSURfUEFHRV9OVU1fUEhZUyAgICAgICAgKDB4MDAwRjAyMDApIC8qIEludmFsaWQgTnVtYmVyIG9mIFBoeXMgKi8KKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX0NPTkZJR19JTlZBTElEX1BBR0VfTk9UX0lNUCAgICAgICAgICgweDAwMEYwMzAwKSAvKiBDYXNlIE5vdCBIYW5kbGVkICovCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9DT05GSUdfSU5WQUxJRF9QQUdFX05PX0RFViAgICAgICAgICAoMHgwMDBGMDQwMCkgLyogTm8gRGV2aWNlIEZvdW5kICovCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9DT05GSUdfSU5WQUxJRF9QQUdFX0ZPUk0gICAgICAgICAgICAoMHgwMDBGMDUwMCkgLyogSW52YWxpZCBGT1JNICovCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9DT05GSUdfSU5WQUxJRF9QQUdFX1BIWSAgICAgICAgICAgICAoMHgwMDBGMDYwMCkgLyogSW52YWxpZCBQaHkgKi8KKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX0NPTkZJR19JTlZBTElEX1BBR0VfTk9fT1dORVIgICAgICAgICgweDAwMEYwNzAwKSAvKiBObyBPd25lciBGb3VuZCAqLworI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfRFNDVlJZX1NBVEFfSU5JVF9USU1FT1VUICAgICAgICAgICAgKDB4MDAxMDAwMDApCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDExMDAwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX0FCT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMTIwMDAwKQorI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfSU9fTk9UX1lFVF9FWEVDVVRFRCAgICAgICAgICAgICAgICAgKDB4MDAxMzAwMDApCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9JT19FWEVDVVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDE0MDAwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19TVUJfQ09ERV9PUEVOX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMTAwKQorI2RlZmluZSBQTF9MT0dJTkZPX1NVQl9DT0RFX0lOVkFMSURfU0dMICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAyMDApCisjZGVmaW5lIFBMX0xPR0lORk9fU1VCX0NPREVfV1JPTkdfUkVMX09GRl9PUl9GUkFNRV9MRU5HVEggICAoMHgwMDAwMDMwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19TVUJfQ09ERV9GUkFNRV9YRkVSX0VSUk9SICAgICAgICAgICAgICAgICgweDAwMDAwNDAwKQorI2RlZmluZSBQTF9MT0dJTkZPX1NVQl9DT0RFX1RYX0ZNX0NPTk5FQ1RFRF9MT1cgICAgICAgICAgICAgKDB4MDAwMDA1MDApCisjZGVmaW5lIFBMX0xPR0lORk9fU1VCX0NPREVfU0FUQV9OT05fTkNRX1JXX0VSUl9CSVRfU0VUICAgICAoMHgwMDAwMDYwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19TVUJfQ09ERV9TQVRBX1JFQURfTE9HX1JFQ0VJVkVfREFUQV9FUlIgICgweDAwMDAwNzAwKQorI2RlZmluZSBQTF9MT0dJTkZPX1NVQl9DT0RFX1NBVEFfTkNRX0ZBSUxfQUxMX0NNRFNfQUZUUl9FUlIgKDB4MDAwMDA4MDApCisjZGVmaW5lIFBMX0xPR0lORk9fU1VCX0NPREVfU0FUQV9FUlJfSU5fUkNWX1NFVF9ERVZfQklUX0ZJUyAoMHgwMDAwMDkwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19TVUJfQ09ERV9SWF9GTV9JTlZBTElEX01FU1NBR0UgICAgICAgICAgICgweDAwMDAwQTAwKQorI2RlZmluZSBQTF9MT0dJTkZPX1NVQl9DT0RFX1JYX0NUWF9NRVNTQUdFX1ZBTElEX0VSUk9SICAgICAgKDB4MDAwMDBCMDApCisjZGVmaW5lIFBMX0xPR0lORk9fU1VCX0NPREVfUlhfRk1fQ1VSUkVOVF9GUkFNRV9FUlJPUiAgICAgICAoMHgwMDAwMEMwMCkKKyNkZWZpbmUgUExfTE9HSU5GT19TVUJfQ09ERV9TQVRBX0xJTktfRE9XTiAgICAgICAgICAgICAgICAgICgweDAwMDAwRDAwKQorI2RlZmluZSBQTF9MT0dJTkZPX1NVQl9DT0RFX0RJU0NPVkVSWV9TQVRBX0lOSVRfV19JT1MgICAgICAgKDB4MDAwMDBFMDApCisjZGVmaW5lIFBMX0xPR0lORk9fU1VCX0NPREVfRFNDVlJZX1NBVEFfSU5JVF9USU1FT1VUICAgICAgICAoMHgwMDAwMTAwMCkKKworCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9FTkNMX01HTVRfU01QX0ZSQU1FX0ZBSUxVUkUgICAgICAgICAoMHgwMDIwMDAwMCkgLyogQ2FuJ3QgZ2V0IFNNUCBGcmFtZSAqLworI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfRU5DTF9NR01UX1NNUF9SRUFEX0VSUk9SICAgICAgICAgICAgKDB4MDAyMDAwMDEpIC8qIEVycm9yIG9jY3VyZWQgb24gU01QIFJlYWQgKi8KKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX0VOQ0xfTUdNVF9TTVBfV1JJVEVfRVJST1IgICAgICAgICAgICgweDAwMjAwMDAyKSAvKiBFcnJvciBvY2N1cmVkIG9uIFNNUCBXcml0ZSAqLworI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfRU5DTF9NR01UX05PVF9TVVBQT1JURURfT05fRU5DTCAgICAgKDB4MDAyMDAwMDQpIC8qIEVuY2wgTWdtdCBzZXJ2aWNlcyBub3QgYXZhaWxhYmxlIGZvciB0aGlzIFdXSUQgKi8KKyNkZWZpbmUgUExfTE9HSU5GT19DT0RFX0VOQ0xfTUdNVF9BRERSX01PREVfTk9UX1NVUFBPUlRFRCAgICgweDAwMjAwMDA1KSAvKiBBZGRyZXNzIE1vZGUgbm90IHN1cHBvcmVkICovCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9FTkNMX01HTVRfQkFEX1NMT1RfTlVNICAgICAgICAgICAgICAoMHgwMDIwMDAwNikgLyogSW52YWxpZCBTbG90IE51bWJlciBpbiBTRVAgTXNnICovCisjZGVmaW5lIFBMX0xPR0lORk9fQ09ERV9FTkNMX01HTVRfU0dQSU9fTk9UX1BSRVNFTlQgICAgICAgICAoMHgwMDIwMDAwNykgLyogU0dQSU8gbm90IHByZXNlbnQvZW5hYmxlZCAqLworCisjZGVmaW5lIFBMX0xPR0lORk9fREFfU0VQX05PVF9QUkVTRU5UICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDIwMDEwMCkgLyogU0VQIG5vdCBwcmVzZW50IHdoZW4gbXNnIHJlY2VpdmVkICovCisjZGVmaW5lIFBMX0xPR0lORk9fREFfU0VQX1NJTkdMRV9USFJFQURfRVJST1IgICAgICAgICAgICAgICAoMHgwMDIwMDEwMSkgLyogQ2FuIG9ubHkgYWNjZXB0IDEgbXNnIGF0IGEgdGltZSAqLworI2RlZmluZSBQTF9MT0dJTkZPX0RBX1NFUF9JU1RXSV9JTlRSX0lOX0lETEVfU1RBVEUgICAgICAgICAgKDB4MDAyMDAxMDIpIC8qIElTVFdJIGludGVycnVwdCByZWN2ZC4gd2hpbGUgSURMRSAqLworI2RlZmluZSBQTF9MT0dJTkZPX0RBX1NFUF9SRUNFSVZFRF9OQUNLX0ZST01fU0xBVkUgICAgICAgICAgKDB4MDAyMDAxMDMpIC8qIFNFUCBOQUNLJ2QsIGl0IGlzIGJ1c3kgKi8KKyNkZWZpbmUgUExfTE9HSU5GT19EQV9TRVBfQkFEX1NUQVRVU19IRFJfQ0hLU1VNICAgICAgICAgICAgICgweDAwMjAwMTA0KSAvKiBTRVAgc3RvcHBlZCBvciBzZW50IGJhZCBjaGtzdW0gaW4gSGRyICovCisjZGVmaW5lIFBMX0xPR0lORk9fREFfU0VQX1VOU1VQUE9SVEVEX1NDU0lfU1RBVFVTXzEgICAgICAgICAoMHgwMDIwMDEwNSkgLyogU0VQIHJldHVybmVkIHVua25vd24gc2NzaSBzdGF0dXMgKi8KKyNkZWZpbmUgUExfTE9HSU5GT19EQV9TRVBfVU5TVVBQT1JURURfU0NTSV9TVEFUVVNfMiAgICAgICAgICgweDAwMjAwMTA2KSAvKiBTRVAgcmV0dXJuZWQgdW5rbm93biBzY3NpIHN0YXR1cyAqLworI2RlZmluZSBQTF9MT0dJTkZPX0RBX1NFUF9DSEtTVU1fRVJST1JfQUZURVJfU1RPUCAgICAgICAgICAgKDB4MDAyMDAxMDcpIC8qIFNFUCByZXR1cm5lZCBiYWQgY2hrc3VtIGFmdGVyIFNUT1AgKi8KKyNkZWZpbmUgUExfTE9HSU5GT19EQV9TRVBfQ0hLU1VNX0VSUk9SX0FGVEVSX1NUT1BfR0VUREFUQSAgICgweDAwMjAwMTA4KSAvKiBTRVAgcmV0dXJuZWQgYmFkIGNoa3N1bSBhZnRlciBTVE9QIHdoaWxlIGdldHRpbiBkYXRhKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIElSIExPR0lORk9fQ09ERSBkZWZpbmVzLCB2YWxpZCBpZiBJT0NfTE9HSU5GT19PUklHSU5BVE9SID0gSVIgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElSX0xPR0lORk9fQ09ERV9VTlVTRUQxICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDEwMDAwKQorI2RlZmluZSBJUl9MT0dJTkZPX0NPREVfVU5VU0VEMiAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAyMDAwMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZWZpbmVzIGZvciBjb252aWVuZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBJT0NfTE9HSU5GT19QUkVGSVhfSU9QICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1QSV9JT0NMT0dJTkZPX1RZUEVfU0FTIDw8IE1QSV9JT0NMT0dJTkZPX1RZUEVfU0hJRlQpIHwgSU9DX0xPR0lORk9fT1JJR0lOQVRPUl9JT1ApCisjZGVmaW5lIElPQ19MT0dJTkZPX1BSRUZJWF9QTCAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTVBJX0lPQ0xPR0lORk9fVFlQRV9TQVMgPDwgTVBJX0lPQ0xPR0lORk9fVFlQRV9TSElGVCkgfCBJT0NfTE9HSU5GT19PUklHSU5BVE9SX1BMKQorI2RlZmluZSBJT0NfTE9HSU5GT19QUkVGSVhfSVIgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1QSV9JT0NMT0dJTkZPX1RZUEVfU0FTIDw8IE1QSV9JT0NMT0dJTkZPX1RZUEVfU0hJRlQpIHwgSU9DX0xPR0lORk9fT1JJR0lOQVRPUl9JUikKKworI2VuZGlmIC8qIGVuZCBvZiBmaWxlICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9zYXMuaCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9zYXMuaAppbmRleCAyMzBmYTY5Li43MDUxNDg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfc2FzLmgKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX3Nhcy5oCkBAIC02LDcgKzYsNyBAQAogICogICAgICAgICAgVGl0bGU6ICBNUEkgU2VyaWFsIEF0dGFjaGVkIFNDU0kgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMKICAqICBDcmVhdGlvbiBEYXRlOiAgQXVndXN0IDE5LCAyMDA0CiAgKgotICogICAgbXBpX3Nhcy5oIFZlcnNpb246ICAwMS4wNS4wMQorICogICAgbXBpX3Nhcy5oIFZlcnNpb246ICAwMS4wNS4wMgogICoKICAqICBWZXJzaW9uIEhpc3RvcnkKICAqICAtLS0tLS0tLS0tLS0tLS0KQEAgLTE0LDYgKzE0LDkgQEAKICAqICBEYXRlICAgICAgVmVyc2lvbiAgIERlc2NyaXB0aW9uCiAgKiAgLS0tLS0tLS0gIC0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqICAwOC0xOS0wNCAgMDEuMDUuMDEgIE9yaWdpbmFsIHJlbGVhc2UuCisgKiAgMDgtMzAtMDUgIDAxLjA1LjAyICBBZGRlZCBEZXZpY2VJbmZvIGJpdCBmb3IgU0VQLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgUHJpbUZsYWdzIGFuZCBQcmltaXRpdmUgZmllbGQgdG8gU0FTIElPIFVuaXQKKyAqICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmVxdWVzdCwgYW5kIGFkZGVkIGEgbmV3IG9wZXJhdGlvbiBjb2RlLgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIApAQCAtNTEsNiArNTQsNyBAQAogICogVmFsdWVzIGZvciB0aGUgU0FTIERldmljZUluZm8gZmllbGQgdXNlZCBpbiBTQVMgRGV2aWNlIFN0YXR1cyBDaGFuZ2UgRXZlbnQKICAqIGRhdGEgYW5kIFNBUyBJTyBVbml0IENvbmZpZ3VyYXRpb24gcGFnZXMuCiAgKi8KKyNkZWZpbmUgTVBJX1NBU19ERVZJQ0VfSU5GT19TRVAgICAgICAgICAgICAgICAgICgweDAwMDA0MDAwKQogI2RlZmluZSBNUElfU0FTX0RFVklDRV9JTkZPX0FUQVBJX0RFVklDRSAgICAgICAgKDB4MDAwMDIwMDApCiAjZGVmaW5lIE1QSV9TQVNfREVWSUNFX0lORk9fTFNJX0RFVklDRSAgICAgICAgICAoMHgwMDAwMTAwMCkKICNkZWZpbmUgTVBJX1NBU19ERVZJQ0VfSU5GT19ESVJFQ1RfQVRUQUNIICAgICAgICgweDAwMDAwODAwKQpAQCAtMjEyLDIwICsyMTYsMjYgQEAKICAgICBVOCAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJRDsgICAgICAgICAgIC8qIDBDaCAqLwogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEJ1czsgICAgICAgICAgICAgICAgLyogMERoICovCiAgICAgVTggICAgICAgICAgICAgICAgICAgICAgUGh5TnVtOyAgICAgICAgICAgICAvKiAwRWggKi8KLSAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgIC8qIDBGaCAqLwotICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNTsgICAgICAgICAgLyogMTBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUHJpbUZsYWdzOyAgICAgICAgICAvKiAwRmggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBQcmltaXRpdmU7ICAgICAgICAgIC8qIDEwaCAqLwogICAgIFU2NCAgICAgICAgICAgICAgICAgICAgIFNBU0FkZHJlc3M7ICAgICAgICAgLyogMTRoICovCi0gICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ2OyAgICAgICAgICAvKiAxQ2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgIC8qIDFDaCAqLwogfSBNU0dfU0FTX0lPVU5JVF9DT05UUk9MX1JFUVVFU1QsIE1QSV9QT0lOVEVSIFBUUl9NU0dfU0FTX0lPVU5JVF9DT05UUk9MX1JFUVVFU1QsCiAgIFNhc0lvVW5pdENvbnRyb2xSZXF1ZXN0X3QsIE1QSV9QT0lOVEVSIHBTYXNJb1VuaXRDb250cm9sUmVxdWVzdF90OwogCiAvKiB2YWx1ZXMgZm9yIHRoZSBPcGVyYXRpb24gZmllbGQgKi8KLSNkZWZpbmUgTVBJX1NBU19PUF9DTEVBUl9OT1RfUFJFU0VOVCAgICAgICAgICAgICAoMHgwMSkKLSNkZWZpbmUgTVBJX1NBU19PUF9DTEVBUl9BTExfUEVSU0lTVEVOVCAgICAgICAgICAoMHgwMikKLSNkZWZpbmUgTVBJX1NBU19PUF9QSFlfTElOS19SRVNFVCAgICAgICAgICAgICAgICAoMHgwNikKLSNkZWZpbmUgTVBJX1NBU19PUF9QSFlfSEFSRF9SRVNFVCAgICAgICAgICAgICAgICAoMHgwNykKLSNkZWZpbmUgTVBJX1NBU19PUF9QSFlfQ0xFQVJfRVJST1JfTE9HICAgICAgICAgICAoMHgwOCkKLSNkZWZpbmUgTVBJX1NBU19PUF9NQVBfQ1VSUkVOVCAgICAgICAgICAgICAgICAgICAoMHgwOSkKKyNkZWZpbmUgTVBJX1NBU19PUF9DTEVBUl9OT1RfUFJFU0VOVCAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfU0FTX09QX0NMRUFSX0FMTF9QRVJTSVNURU5UICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9TQVNfT1BfUEhZX0xJTktfUkVTRVQgICAgICAgICAgICAgICAoMHgwNikKKyNkZWZpbmUgTVBJX1NBU19PUF9QSFlfSEFSRF9SRVNFVCAgICAgICAgICAgICAgICgweDA3KQorI2RlZmluZSBNUElfU0FTX09QX1BIWV9DTEVBUl9FUlJPUl9MT0cgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1QSV9TQVNfT1BfTUFQX0NVUlJFTlQgICAgICAgICAgICAgICAgICAoMHgwOSkKKyNkZWZpbmUgTVBJX1NBU19PUF9TRU5EX1BSSU1JVElWRSAgICAgICAgICAgICAgICgweDBBKQorCisvKiB2YWx1ZXMgZm9yIHRoZSBQcmltRmxhZ3MgZmllbGQgKi8KKyNkZWZpbmUgTVBJX1NBU19QUklNRkxBR1NfU0lOR0xFICAgICAgICAgICAgICAgICgweDA4KQorI2RlZmluZSBNUElfU0FTX1BSSU1GTEFHU19UUklQTEUgICAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9TQVNfUFJJTUZMQUdTX1JFRFVOREFOVCAgICAgICAgICAgICAoMHgwMSkKIAogCiAvKiBTQVMgSU8gVW5pdCBDb250cm9sIFJlcGx5ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCmluZGV4IDUzNzgzNjAuLmQ4OTBiMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCkBAIC0xNDgsNyArMTQ4LDYgQEAKIHN0YXRpYyBpbnQJV2FpdEZvckRvb3JiZWxsSW50KE1QVF9BREFQVEVSICppb2MsIGludCBob3dsb25nLCBpbnQgc2xlZXBGbGFnKTsKIHN0YXRpYyBpbnQJV2FpdEZvckRvb3JiZWxsUmVwbHkoTVBUX0FEQVBURVIgKmlvYywgaW50IGhvd2xvbmcsIGludCBzbGVlcEZsYWcpOwogc3RhdGljIGludAlHZXRMYW5Db25maWdQYWdlcyhNUFRfQURBUFRFUiAqaW9jKTsKLXN0YXRpYyBpbnQJR2V0RmNQb3J0UGFnZTAoTVBUX0FEQVBURVIgKmlvYywgaW50IHBvcnRudW0pOwogc3RhdGljIGludAlHZXRJb1VuaXRQYWdlMihNUFRfQURBUFRFUiAqaW9jKTsKIGludAkJbXB0YmFzZV9zYXNfcGVyc2lzdF9vcGVyYXRpb24oTVBUX0FEQVBURVIgKmlvYywgdTggcGVyc2lzdF9vcGNvZGUpOwogc3RhdGljIGludAltcHRfR2V0U2NzaVBvcnRTZXR0aW5ncyhNUFRfQURBUFRFUiAqaW9jLCBpbnQgcG9ydG51bSk7CkBAIC0xMjMyLDEyICsxMjMxLDExIEBACiAJCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTQogCQkJIjogTm90IHVzaW5nIDY0IGJpdCBjb25zaXN0ZW50IG1hc2tcbiIpKTsKIAotCWlvYyA9IGttYWxsb2Moc2l6ZW9mKE1QVF9BREFQVEVSKSwgR0ZQX0FUT01JQyk7CisJaW9jID0ga3phbGxvYyhzaXplb2YoTVBUX0FEQVBURVIpLCBHRlBfQVRPTUlDKTsKIAlpZiAoaW9jID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIE1ZTkFNICI6IEVSUk9SIC0gSW5zdWZmaWNpZW50IG1lbW9yeSB0byBhZGQgYWRhcHRlciFcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtc2V0KGlvYywgMCwgc2l6ZW9mKE1QVF9BREFQVEVSKSk7CiAJaW9jLT5hbGxvY190b3RhbCA9IHNpemVvZihNUFRfQURBUFRFUik7CiAJaW9jLT5yZXFfc3ogPSBNUFRfREVGQVVMVF9GUkFNRV9TSVpFOwkJLyogYXZvaWQgZGl2IGJ5IHplcm8hICovCiAJaW9jLT5yZXBseV9zeiA9IE1QVF9SRVBMWV9GUkFNRV9TSVpFOwpAQCAtMTI0NSw2ICsxMjQzLDggQEAKIAlpb2MtPnBjaWRldiA9IHBkZXY7CiAJaW9jLT5kaWFnUGVuZGluZyA9IDA7CiAJc3Bpbl9sb2NrX2luaXQoJmlvYy0+ZGlhZ0xvY2spOworCXNwaW5fbG9ja19pbml0KCZpb2MtPmZjX3Jlc2Nhbl93b3JrX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZpb2MtPmZjX3Jwb3J0X2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZpb2MtPmluaXRpYWxpemluZ19oYmFfbG9jayk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBldmVudCBsb2dnaW5nLgpAQCAtMTI2OCw2ICsxMjY4LDEwIEBACiAJICovCiAJSU5JVF9MSVNUX0hFQUQoJmlvYy0+Y29uZmlnUSk7CiAKKwkvKiBJbml0aWFsaXplIHRoZSBmYyBycG9ydCBsaXN0IGhlYWQuCisJICovCisJSU5JVF9MSVNUX0hFQUQoJmlvYy0+ZmNfcnBvcnRzKTsKKwogCS8qIEZpbmQgbG9va3VwIHNsb3QuICovCiAJSU5JVF9MSVNUX0hFQUQoJmlvYy0+bGlzdCk7CiAJaW9jLT5pZCA9IG1wdF9pZHMrKzsKQEAgLTEzNzQsNiArMTM3OCwxMCBAQAogCQlpb2MtPmJ1c190eXBlID0gRkM7CiAJCWlvYy0+ZXJyYXRhX2ZsYWdfMTA2NCA9IDE7CiAJfQorCWVsc2UgaWYgKHBkZXYtPmRldmljZSA9PSBNUElfTUFOVUZBQ1RQQUdFX0RFVklDRUlEX0ZDOTQ5RSkgeworCQlpb2MtPnByb2RfbmFtZSA9ICJMU0lGQzk0OUUiOworCQlpb2MtPmJ1c190eXBlID0gRkM7CisJfQogCWVsc2UgaWYgKHBkZXYtPmRldmljZSA9PSBNUElfTUFOVUZBQ1RQQUdFX0RFVklEXzUzQzEwMzApIHsKIAkJaW9jLT5wcm9kX25hbWUgPSAiTFNJNTNDMTAzMCI7CiAJCWlvYy0+YnVzX3R5cGUgPSBTUEk7CkBAIC0xNjIyLDcgKzE2MzAsNyBAQAogCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCiAJLyogZW5hYmxlIGludGVycnVwdHMgKi8KLQlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+SW50TWFzaywgfihNUElfSElNX1JJTSkpOworCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5JbnRNYXNrLCBNUElfSElNX0RJTSk7CiAJaW9jLT5hY3RpdmUgPSAxOwogCiAJLyogRi9XIG5vdCBydW5uaW5nICovCkBAIC0xNzE1LDcgKzE3MjMsNyBAQAogCQkJCS8qIChyZSlFbmFibGUgYWx0LUlPQyEgKHJlcGx5IGludGVycnVwdCwgRnJlZVEpICovCiAJCQkJZHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IGFsdC0lcyByZXBseSBpcnEgcmUtZW5hYmxlZFxuIiwKIAkJCQkJCWlvYy0+YWx0X2lvYy0+bmFtZSkpOwotCQkJCUNISVBSRUdfV1JJVEUzMigmaW9jLT5hbHRfaW9jLT5jaGlwLT5JbnRNYXNrLCB+KE1QSV9ISU1fUklNKSk7CisJCQkJQ0hJUFJFR19XUklURTMyKCZpb2MtPmFsdF9pb2MtPmNoaXAtPkludE1hc2ssIE1QSV9ISU1fRElNKTsKIAkJCQlpb2MtPmFsdF9pb2MtPmFjdGl2ZSA9IDE7CiAJCQl9CiAKQEAgLTE4MzEsNyArMTgzOSw3IEBACiAKIAlpZiAocmV0ID09IDApIHsKIAkJLyogRW5hYmxlISAocmVwbHkgaW50ZXJydXB0KSAqLwotCQlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+SW50TWFzaywgfihNUElfSElNX1JJTSkpOworCQlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+SW50TWFzaywgTVBJX0hJTV9ESU0pOwogCQlpb2MtPmFjdGl2ZSA9IDE7CiAJfQogCkBAIC0xODM5LDcgKzE4NDcsNyBAQAogCQkvKiAocmUpRW5hYmxlIGFsdC1JT0MhIChyZXBseSBpbnRlcnJ1cHQpICovCiAJCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogYWx0LSVzIHJlcGx5IGlycSByZS1lbmFibGVkXG4iLAogCQkJCWlvYy0+YWx0X2lvYy0+bmFtZSkpOwotCQlDSElQUkVHX1dSSVRFMzIoJmlvYy0+YWx0X2lvYy0+Y2hpcC0+SW50TWFzaywgfihNUElfSElNX1JJTSkpOworCQlDSElQUkVHX1dSSVRFMzIoJmlvYy0+YWx0X2lvYy0+Y2hpcC0+SW50TWFzaywgTVBJX0hJTV9ESU0pOwogCQlpb2MtPmFsdF9pb2MtPmFjdGl2ZSA9IDE7CiAJfQogCkBAIC0xODgwLDcgKzE4ODgsNyBAQAogCQkJICogIChGQ1BvcnRQYWdlMF90IHN0dWZmKQogCQkJICovCiAJCQlmb3IgKGlpPTA7IGlpIDwgaW9jLT5mYWN0cy5OdW1iZXJPZlBvcnRzOyBpaSsrKSB7Ci0JCQkJKHZvaWQpIEdldEZjUG9ydFBhZ2UwKGlvYywgaWkpOworCQkJCSh2b2lkKSBtcHRiYXNlX0dldEZjUG9ydFBhZ2UwKGlvYywgaWkpOwogCQkJfQogCiAJCQlpZiAoKGlvYy0+cGZhY3RzWzBdLlByb3RvY29sRmxhZ3MgJiBNUElfUE9SVEZBQ1RTX1BST1RPQ09MX0xBTikgJiYKQEAgLTQxOTksNyArNDIwNyw3IEBACiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KIC8qCi0gKglHZXRGY1BvcnRQYWdlMCAtIEZldGNoIEZDUG9ydCBjb25maWcgUGFnZTAuCisgKgltcHRiYXNlX0dldEZjUG9ydFBhZ2UwIC0gRmV0Y2ggRkNQb3J0IGNvbmZpZyBQYWdlMC4KICAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCiAgKglAcG9ydG51bTogSU9DIFBvcnQgbnVtYmVyCiAgKgpAQCAtNDIwOSw4ICs0MjE3LDggQEAKICAqCQktRUFHQUlOIGlmIG5vIG1zZyBmcmFtZXMgY3VycmVudGx5IGF2YWlsYWJsZQogICoJCS1FRkFVTFQgZm9yIG5vbi1zdWNjZXNzZnVsIHJlcGx5IG9yIG5vIHJlcGx5ICh0aW1lb3V0KQogICovCi1zdGF0aWMgaW50Ci1HZXRGY1BvcnRQYWdlMChNUFRfQURBUFRFUiAqaW9jLCBpbnQgcG9ydG51bSkKK2ludAorbXB0YmFzZV9HZXRGY1BvcnRQYWdlMChNUFRfQURBUFRFUiAqaW9jLCBpbnQgcG9ydG51bSkKIHsKIAlDb25maWdQYWdlSGVhZGVyX3QJIGhkcjsKIAlDT05GSUdQQVJNUwkJIGNmZzsKQEAgLTQyMjAsNiArNDIyOCw4IEBACiAJaW50CQkJIGRhdGFfc3o7CiAJaW50CQkJIGNvcHlfc3o7CiAJaW50CQkJIHJjOworCWludAkJCSBjb3VudCA9IDQwMDsKKwogCiAJLyogR2V0IEZDUG9ydCBQYWdlIDAgaGVhZGVyICovCiAJaGRyLlBhZ2VWZXJzaW9uID0gMDsKQEAgLTQyNDMsNiArNDI1Myw4IEBACiAJcmMgPSAtRU5PTUVNOwogCXBwYWdlMF9hbGxvYyA9IChGQ1BvcnRQYWdlMF90ICopIHBjaV9hbGxvY19jb25zaXN0ZW50KGlvYy0+cGNpZGV2LCBkYXRhX3N6LCAmcGFnZTBfZG1hKTsKIAlpZiAocHBhZ2UwX2FsbG9jKSB7CisKKyB0cnlfYWdhaW46CiAJCW1lbXNldCgodTggKilwcGFnZTBfYWxsb2MsIDAsIGRhdGFfc3opOwogCQljZmcucGh5c0FkZHIgPSBwYWdlMF9kbWE7CiAJCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX1JFQURfQ1VSUkVOVDsKQEAgLTQyNzQsNiArNDI4NiwxOSBAQAogCQkJcHAwZGVzdC0+RGlzY292ZXJlZFBvcnRzQ291bnQgPSBsZTMyX3RvX2NwdShwcDBkZXN0LT5EaXNjb3ZlcmVkUG9ydHNDb3VudCk7CiAJCQlwcDBkZXN0LT5NYXhJbml0aWF0b3JzID0gbGUzMl90b19jcHUocHAwZGVzdC0+TWF4SW5pdGlhdG9ycyk7CiAKKwkJCS8qCisJCQkgKiBpZiBzdGlsbCBkb2luZyBkaXNjb3ZlcnksCisJCQkgKiBoYW5nIGxvb3NlIGEgd2hpbGUgdW50aWwgZmluaXNoZWQKKwkJCSAqLworCQkJaWYgKHBwMGRlc3QtPlBvcnRTdGF0ZSA9PSBNUElfRkNQT1JUUEFHRTBfUE9SVFNUQVRFX1VOS05PV04pIHsKKwkJCQlpZiAoY291bnQtLSA+IDApIHsKKwkJCQkJbXNsZWVwX2ludGVycnVwdGlibGUoMTAwKTsKKwkJCQkJZ290byB0cnlfYWdhaW47CisJCQkJfQorCQkJCXByaW50ayhNWUlPQ19zX0lORk9fRk1UICJGaXJtd2FyZSBkaXNjb3Zlcnkgbm90IgorCQkJCQkJCSIgY29tcGxldGUuXG4iLAorCQkJCQkJaW9jLT5uYW1lKTsKKwkJCX0KIAkJfQogCiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaW9jLT5wY2lkZXYsIGRhdGFfc3osICh1OCAqKSBwcGFnZTBfYWxsb2MsIHBhZ2UwX2RtYSk7CkBAIC02MzU4LDYgKzYzODMsNyBAQAogRVhQT1JUX1NZTUJPTChtcHRfZnJlZV9md19tZW1vcnkpOwogRVhQT1JUX1NZTUJPTChtcHRiYXNlX3Nhc19wZXJzaXN0X29wZXJhdGlvbik7CiBFWFBPUlRfU1lNQk9MKG1wdF9hbHRfaW9jX3dhaXQpOworRVhQT1JUX1NZTUJPTChtcHRiYXNlX0dldEZjUG9ydFBhZ2UwKTsKIAogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuaCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5oCmluZGV4IDZjNDhkMWYuLjQ3MDUzYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5oCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5oCkBAIC03Niw4ICs3Niw4IEBACiAjZGVmaW5lIENPUFlSSUdIVAkiQ29weXJpZ2h0IChjKSAxOTk5LTIwMDUgIiBNT0RVTEVBVVRIT1IKICNlbmRpZgogCi0jZGVmaW5lIE1QVF9MSU5VWF9WRVJTSU9OX0NPTU1PTgkiMy4wMy4wNSIKLSNkZWZpbmUgTVBUX0xJTlVYX1BBQ0tBR0VfTkFNRQkJIkAoIyltcHRsaW51eC0zLjAzLjA1IgorI2RlZmluZSBNUFRfTElOVVhfVkVSU0lPTl9DT01NT04JIjMuMDMuMDYiCisjZGVmaW5lIE1QVF9MSU5VWF9QQUNLQUdFX05BTUUJCSJAKCMpbXB0bGludXgtMy4wMy4wNiIKICNkZWZpbmUgV0hBVF9NQUdJQ19TVFJJTkcJCSJAIiAiKCIgIiMiICIpIgogCiAjZGVmaW5lIHNob3dfbXB0bW9kX3ZlcihzLHZlcikgIFwKQEAgLTQxMyw3ICs0MTMsNyBAQAogCXU4CQkJIHN0YXR1czsJLyogY3VycmVudCBjb21tYW5kIHN0YXR1cyAqLwogCXU4CQkJIHJlc2V0OwkJLyogMSBpZiBidXMgcmVzZXQgYWxsb3dlZCAqLwogCXU4CQkJIHRhcmdldDsJLyogdGFyZ2V0IGZvciByZXNldCAqLwotCXN0cnVjdCBzZW1hcGhvcmUJIHNlbV9pb2M7CisJc3RydWN0IG11dGV4CQkgaW9jdGxfbXV0ZXg7CiB9IE1QVF9JT0NUTDsKIAogI2RlZmluZSBNUFRfU0FTX01HTVRfU1RBVFVTX1JGX1ZBTElECTB4MDIJLyogVGhlIFJlcGx5IEZyYW1lIGlzIFZBTElEICovCkBAIC00MjEsNyArNDIxLDcgQEAKICNkZWZpbmUgTVBUX1NBU19NR01UX1NUQVRVU19UTV9GQUlMRUQJMHg0MAkvKiBVc2VyIFRNIHJlcXVlc3QgZmFpbGVkICovCiAKIHR5cGVkZWYgc3RydWN0IF9NUFRfU0FTX01HTVQgewotCXN0cnVjdCBzZW1hcGhvcmUJIG11dGV4OworCXN0cnVjdCBtdXRleAkJIG11dGV4OwogCXN0cnVjdCBjb21wbGV0aW9uCSBkb25lOwogCXU4CQkJIHJlcGx5W01QVF9ERUZBVUxUX0ZSQU1FX1NJWkVdOyAvKiByZXBseSBmcmFtZSBkYXRhICovCiAJdTgJCQkgc3RhdHVzOwkvKiBjdXJyZW50IGNvbW1hbmQgc3RhdHVzICovCkBAIC00OTksNiArNDk5LDIyIEBACiAJaW50CQkgaXNSYWlkOwkJLyogYml0IGZpZWxkLCAxIGlmIFJBSUQgKi8KIH1SYWlkQ2ZnRGF0YTsKIAorI2RlZmluZSBNUFRfUlBPUlRfSU5GT19GTEFHU19SRUdJU1RFUkVECTB4MDEJLyogcnBvcnQgcmVnaXN0ZXJlZCAqLworI2RlZmluZSBNUFRfUlBPUlRfSU5GT19GTEFHU19NSVNTSU5HCTB4MDIJLyogbWlzc2luZyBmcm9tIERldlBhZ2UwIHNjYW4gKi8KKyNkZWZpbmUgTVBUX1JQT1JUX0lORk9fRkxBR1NfTUFQUEVEX1ZERVYgMHgwNAkvKiB0YXJnZXQgbWFwcGVkIGluIHZkZXYgKi8KKworLyoKKyAqIGRhdGEgYWxsb2NhdGVkIGZvciBlYWNoIGZjIHJwb3J0IGRldmljZQorICovCitzdHJ1Y3QgbXB0ZmNfcnBvcnRfaW5mbworeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0OworCVZpcnREZXZpY2UJKnZkZXY7CisJRkNEZXZpY2VQYWdlMF90IHBnMDsKKwl1OAkJZmxhZ3M7Cit9OworCiAvKgogICogIEFkYXB0ZXIgU3RydWN0dXJlIC0gcGNpX2RldiBzcGVjaWZpYy4gTWF4aW11bTogTVBUX01BWF9BREFQVEVSUwogICovCkBAIC02MTIsNyArNjI4LDE2IEBACiAJc3RydWN0IGxpc3RfaGVhZAkgbGlzdDsKIAlzdHJ1Y3QgbmV0X2RldmljZQkqbmV0ZGV2OwogCXN0cnVjdCBsaXN0X2hlYWQJIHNhc190b3BvbG9neTsKKwlzdHJ1Y3QgbXV0ZXgJCSBzYXNfdG9wb2xvZ3lfbXV0ZXg7CiAJTVBUX1NBU19NR01UCQkgc2FzX21nbXQ7CisJaW50CQkJIG51bV9wb3J0czsKKworCXN0cnVjdCBsaXN0X2hlYWQJIGZjX3Jwb3J0czsKKwlzcGlubG9ja190CQkgZmNfcnBvcnRfbG9jazsgLyogbGlzdCBhbmQgcmkgZmxhZ3MgKi8KKwlzcGlubG9ja190CQkgZmNfcmVzY2FuX3dvcmtfbG9jazsKKwlpbnQJCQkgZmNfcmVzY2FuX3dvcmtfY291bnQ7CisJc3RydWN0IHdvcmtfc3RydWN0CSBmY19yZXNjYW5fd29yazsKKwogfSBNUFRfQURBUFRFUjsKIAogLyoKQEAgLTk5OSw2ICsxMDI0LDcgQEAKIGV4dGVybiBpbnQJIG1wdF9maW5kSW1Wb2x1bWVzKE1QVF9BREFQVEVSICppb2MpOwogZXh0ZXJuIGludAkgbXB0X3JlYWRfaW9jX3BnXzMoTVBUX0FEQVBURVIgKmlvYyk7CiBleHRlcm4gaW50CSBtcHRiYXNlX3Nhc19wZXJzaXN0X29wZXJhdGlvbihNUFRfQURBUFRFUiAqaW9jLCB1OCBwZXJzaXN0X29wY29kZSk7CitleHRlcm4gaW50CSBtcHRiYXNlX0dldEZjUG9ydFBhZ2UwKE1QVF9BREFQVEVSICppb2MsIGludCBwb3J0bnVtKTsKIGV4dGVybiBpbnQJIG1wdF9hbHRfaW9jX3dhaXQoTVBUX0FEQVBURVIgKmlvYyk7CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGN0bC5jIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRjdGwuYwppbmRleCA5NTlkMmM1OS4uYmRmNzA5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRjdGwuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGN0bC5jCkBAIC0xNzcsMTAgKzE3NywxMCBAQAogCWRjdGxwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOjptcHRjdGxfc3lzY2FsbF9kb3duKCVwLCVkKSBjYWxsZWRcbiIsIGlvYywgbm9uYmxvY2spKTsKIAogCWlmIChub25ibG9jaykgewotCQlpZiAoZG93bl90cnlsb2NrKCZpb2MtPmlvY3RsLT5zZW1faW9jKSkKKwkJaWYgKCFtdXRleF90cnlsb2NrKCZpb2MtPmlvY3RsLT5pb2N0bF9tdXRleCkpCiAJCQlyYyA9IC1FQUdBSU47CiAJfSBlbHNlIHsKLQkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmaW9jLT5pb2N0bC0+c2VtX2lvYykpCisJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmlvYy0+aW9jdGwtPmlvY3RsX211dGV4KSkKIAkJCXJjID0gLUVSRVNUQVJUU1lTOwogCX0KIAlkY3RscHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjo6bXB0Y3RsX3N5c2NhbGxfZG93biByZXR1cm4gJWRcbiIsIHJjKSk7CkBAIC01NTcsNyArNTU3LDcgQEAKIAllbHNlCiAJCXJldCA9IC1FSU5WQUw7CiAKLQl1cCgmaW9jcC0+aW9jdGwtPnNlbV9pb2MpOworCW11dGV4X3VubG9jaygmaW9jcC0+aW9jdGwtPmlvY3RsX211dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yNTg1LDggKzI1ODUsNiBAQAogCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCi0jaW5jbHVkZSA8bGludXgvaW9jdGwzMi5oPgotCiBzdGF0aWMgaW50CiBjb21wYXRfbXB0Znd4ZmVyX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkJdW5zaWduZWQgbG9uZyBhcmcpCkBAIC0yNjIxLDcgKzI2MTksNyBAQAogCiAJcmV0ID0gbXB0Y3RsX2RvX2Z3X2Rvd25sb2FkKGtmdy5pb2NudW0sIGtmdy5idWZwLCBrZncuZndsZW4pOwogCi0JdXAoJmlvY3AtPmlvY3RsLT5zZW1faW9jKTsKKwltdXRleF91bmxvY2soJmlvY3AtPmlvY3RsLT5pb2N0bF9tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjY3NSw3ICsyNjczLDcgQEAKIAkgKi8KIAlyZXQgPSBtcHRjdGxfZG9fbXB0X2NvbW1hbmQgKGthcmcsICZ1YXJnLT5NRik7CiAKLQl1cCgmaW9jcC0+aW9jdGwtPnNlbV9pb2MpOworCW11dGV4X3VubG9jaygmaW9jcC0+aW9jdGwtPmlvY3RsX211dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yNzQ1LDcgKzI3NDMsNyBAQAogCW1lbXNldChtZW0sIDAsIHN6KTsKIAlpb2MtPmlvY3RsID0gKE1QVF9JT0NUTCAqKSBtZW07CiAJaW9jLT5pb2N0bC0+aW9jID0gaW9jOwotCXNlbWFfaW5pdCgmaW9jLT5pb2N0bC0+c2VtX2lvYywgMSk7CisJbXV0ZXhfaW5pdCgmaW9jLT5pb2N0bC0+aW9jdGxfbXV0ZXgpOwogCXJldHVybiAwOwogCiBvdXRfZmFpbDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0ZmMuYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0ZmMuYwppbmRleCBiYTYxZTE4Li5iMTAyYzc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGZjLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRmYy5jCkBAIC01NSwxMiArNTUsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4JLyogbm90aWZpZXIgY29kZSAqLwogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvc29ydC5oPgogCiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oPgogCiAjaW5jbHVkZSAibXB0YmFzZS5oIgogI2luY2x1ZGUgIm1wdHNjc2loLmgiCkBAIC03OSwxOSArODEsMzQgQEAKIG1vZHVsZV9wYXJhbShtcHRfcHFfZmlsdGVyLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhtcHRfcHFfZmlsdGVyLCAiIEVuYWJsZSBwZXJpcGhlcmFsIHF1YWxpZmllciBmaWx0ZXI6IGVuYWJsZT0xICAoZGVmYXVsdD0wKSIpOwogCisjZGVmaW5lIE1QVEZDX0RFVl9MT1NTX1RNTyAoNjApCitzdGF0aWMgaW50IG1wdGZjX2Rldl9sb3NzX3RtbyA9IE1QVEZDX0RFVl9MT1NTX1RNTzsJLyogcmVhc29uYWJsZSBkZWZhdWx0ICovCittb2R1bGVfcGFyYW0obXB0ZmNfZGV2X2xvc3NfdG1vLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtcHRmY19kZXZfbG9zc190bW8sICIgSW5pdGlhbCB0aW1lIHRoZSBkcml2ZXIgcHJvZ3JhbXMgdGhlICIKKyAgICAJCQkJICAgICAiIHRyYW5zcG9ydCB0byB3YWl0IGZvciBhbiBycG9ydCB0byAiCisJCQkJICAgICAiIHJldHVybiBmb2xsb3dpbmcgYSBkZXZpY2UgbG9zcyBldmVudC4iCisJCQkJICAgICAiICBEZWZhdWx0PTYwLiIpOworCiBzdGF0aWMgaW50CW1wdGZjRG9uZUN0eCA9IC0xOwogc3RhdGljIGludAltcHRmY1Rhc2tDdHggPSAtMTsKIHN0YXRpYyBpbnQJbXB0ZmNJbnRlcm5hbEN0eCA9IC0xOyAvKiBVc2VkIG9ubHkgZm9yIGludGVybmFsIGNvbW1hbmRzICovCiAKK2ludCBtcHRmY19zbGF2ZV9hbGxvYyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgaW50IG1wdGZjX3FjbWQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsCisgICAgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpOworCitzdGF0aWMgdm9pZCBtcHRmY19zZXRfcnBvcnRfbG9zc190bW8oc3RydWN0IGZjX3Jwb3J0ICpycG9ydCwgdWludDMyX3QgdGltZW91dCk7CitzdGF0aWMgdm9pZCBfX2RldmV4aXQgbXB0ZmNfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKwogc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgbXB0ZmNfZHJpdmVyX3RlbXBsYXRlID0gewogCS5tb2R1bGUJCQkJPSBUSElTX01PRFVMRSwKIAkucHJvY19uYW1lCQkJPSAibXB0ZmMiLAogCS5wcm9jX2luZm8JCQk9IG1wdHNjc2loX3Byb2NfaW5mbywKIAkubmFtZQkJCQk9ICJNUFQgRkMgSG9zdCIsCiAJLmluZm8JCQkJPSBtcHRzY3NpaF9pbmZvLAotCS5xdWV1ZWNvbW1hbmQJCQk9IG1wdHNjc2loX3FjbWQsCisJLnF1ZXVlY29tbWFuZAkJCT0gbXB0ZmNfcWNtZCwKIAkudGFyZ2V0X2FsbG9jCQkJPSBtcHRzY3NpaF90YXJnZXRfYWxsb2MsCi0JLnNsYXZlX2FsbG9jCQkJPSBtcHRzY3NpaF9zbGF2ZV9hbGxvYywKKwkuc2xhdmVfYWxsb2MJCQk9IG1wdGZjX3NsYXZlX2FsbG9jLAogCS5zbGF2ZV9jb25maWd1cmUJCT0gbXB0c2NzaWhfc2xhdmVfY29uZmlndXJlLAogCS50YXJnZXRfZGVzdHJveQkJCT0gbXB0c2NzaWhfdGFyZ2V0X2Rlc3Ryb3ksCiAJLnNsYXZlX2Rlc3Ryb3kJCQk9IG1wdHNjc2loX3NsYXZlX2Rlc3Ryb3ksCkBAIC0xMjgsMTkgKzE0NSw0NzggQEAKIAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAogCXsgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTFNJX0ZDOTQ5WCwKIAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCXsgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTFNJX0ZDOTQ5RVMsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKIAl7MH0JLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbXB0ZmNfcGNpX3RhYmxlKTsKIAotLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotLyoKLSAqCW1wdGZjX3Byb2JlIC0gSW5zdGFsbHMgc2NzaSBkZXZpY2VzIHBlciBidXMuCi0gKglAcGRldjogUG9pbnRlciB0byBwY2lfZGV2IHN0cnVjdHVyZQotICoKLSAqCVJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUuCi0gKgorc3RhdGljIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqbXB0ZmNfdHJhbnNwb3J0X3RlbXBsYXRlID0gTlVMTDsKKworc3RydWN0IGZjX2Z1bmN0aW9uX3RlbXBsYXRlIG1wdGZjX3RyYW5zcG9ydF9mdW5jdGlvbnMgPSB7CisJLmRkX2ZjcnBvcnRfc2l6ZSA9IDgsCisJLnNob3dfaG9zdF9ub2RlX25hbWUgPSAxLAorCS5zaG93X2hvc3RfcG9ydF9uYW1lID0gMSwKKwkuc2hvd19ob3N0X3N1cHBvcnRlZF9jbGFzc2VzID0gMSwKKwkuc2hvd19ob3N0X3BvcnRfaWQgPSAxLAorCS5zaG93X3Jwb3J0X3N1cHBvcnRlZF9jbGFzc2VzID0gMSwKKwkuc2hvd19zdGFyZ2V0X25vZGVfbmFtZSA9IDEsCisJLnNob3dfc3RhcmdldF9wb3J0X25hbWUgPSAxLAorCS5zaG93X3N0YXJnZXRfcG9ydF9pZCA9IDEsCisJLnNldF9ycG9ydF9kZXZfbG9zc190bW8gPSBtcHRmY19zZXRfcnBvcnRfbG9zc190bW8sCisJLnNob3dfcnBvcnRfZGV2X2xvc3NfdG1vID0gMSwKKworfTsKKworLyogRklYTUUhIHZhbHVlcyBjb250cm9sbGluZyBmaXJtd2FyZSBSRVNDQU4gZXZlbnQKKyAqIG5lZWQgdG8gYmUgc2V0IGxvdyB0byBhbGxvdyBkZXZfbG9zc190bW8gdG8KKyAqIHdvcmsgYXMgZXhwZWN0ZWQuICBDdXJyZW50bHksIGZpcm13YXJlIGRvZXNuJ3QKKyAqIG5vdGlmeSBkcml2ZXIgb2YgUkVTQ0FOIGV2ZW50IHVudGlsIHNvbWUgbnVtYmVyCisgKiBvZiBzZWNvbmRzIGVsYXBzZS4gIFRoaXMgdmFsdWUgY2FuIGJlIHNldCB2aWEKKyAqIGxzaXV0aWwuCiAgKi8KK3N0YXRpYyB2b2lkCittcHRmY19zZXRfcnBvcnRfbG9zc190bW8oc3RydWN0IGZjX3Jwb3J0ICpycG9ydCwgdWludDMyX3QgdGltZW91dCkKK3sKKwlpZiAodGltZW91dCA+IDApCisJCXJwb3J0LT5kZXZfbG9zc190bW8gPSB0aW1lb3V0OworCWVsc2UKKwkJcnBvcnQtPmRldl9sb3NzX3RtbyA9IG1wdGZjX2Rldl9sb3NzX3RtbzsKK30KKworc3RhdGljIGludAorbXB0ZmNfRmNEZXZQYWdlMF9jbXBfZnVuYyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCUZDRGV2aWNlUGFnZTBfdCAqKmFhID0gKEZDRGV2aWNlUGFnZTBfdCAqKilhOworCUZDRGV2aWNlUGFnZTBfdCAqKmJiID0gKEZDRGV2aWNlUGFnZTBfdCAqKiliOworCisJaWYgKCgqYWEpLT5DdXJyZW50QnVzID09ICgqYmIpLT5DdXJyZW50QnVzKSB7CisJCWlmICgoKmFhKS0+Q3VycmVudFRhcmdldElEID09ICgqYmIpLT5DdXJyZW50VGFyZ2V0SUQpCisJCQlyZXR1cm4gMDsKKwkJaWYgKCgqYWEpLT5DdXJyZW50VGFyZ2V0SUQgPCAoKmJiKS0+Q3VycmVudFRhcmdldElEKQorCQkJcmV0dXJuIC0xOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKCgqYWEpLT5DdXJyZW50QnVzIDwgKCpiYiktPkN1cnJlbnRCdXMpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorbXB0ZmNfR2V0RmNEZXZQYWdlMChNUFRfQURBUFRFUiAqaW9jLCBpbnQgaW9jX3BvcnQsCisJdm9pZCgqZnVuYykoTVBUX0FEQVBURVIgKmlvYyxpbnQgY2hhbm5lbCwgRkNEZXZpY2VQYWdlMF90ICphcmcpKQoreworCUNvbmZpZ1BhZ2VIZWFkZXJfdAkgaGRyOworCUNPTkZJR1BBUk1TCQkgY2ZnOworCUZDRGV2aWNlUGFnZTBfdAkJKnBwYWdlMF9hbGxvYywgKmZjOworCWRtYV9hZGRyX3QJCSBwYWdlMF9kbWE7CisJaW50CQkJIGRhdGFfc3o7CisJaW50CQkJIGlpOworCisJRkNEZXZpY2VQYWdlMF90CQkqcDBfYXJyYXk9TlVMTCwgKnBfcDA7CisJRkNEZXZpY2VQYWdlMF90CQkqKnBwMF9hcnJheT1OVUxMLCAqKnBfcHAwOworCisJaW50CQkJIHJjID0gLUVOT01FTTsKKwlVMzIJCQkgcG9ydF9pZCA9IDB4ZmZmZmZmOworCWludAkJCSBudW1fdGFyZyA9IDA7CisJaW50CQkJIG1heF9idXMgPSBpb2MtPmZhY3RzLk1heEJ1c2VzOworCWludAkJCSBtYXhfdGFyZyA9IGlvYy0+ZmFjdHMuTWF4RGV2aWNlczsKKworCWlmIChtYXhfYnVzID09IDAgfHwgbWF4X3RhcmcgPT0gMCkKKwkJZ290byBvdXQ7CisKKwlkYXRhX3N6ID0gc2l6ZW9mKEZDRGV2aWNlUGFnZTBfdCkgKiBtYXhfYnVzICogbWF4X3Rhcmc7CisJcF9wMCA9IHAwX2FycmF5ID0gIGt6YWxsb2MoZGF0YV9zeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwMF9hcnJheSkKKwkJZ290byBvdXQ7CisKKwlkYXRhX3N6ID0gc2l6ZW9mKEZDRGV2aWNlUGFnZTBfdCAqKSAqIG1heF9idXMgKiBtYXhfdGFyZzsKKwlwX3BwMCA9IHBwMF9hcnJheSA9IGt6YWxsb2MoZGF0YV9zeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcDBfYXJyYXkpCisJCWdvdG8gb3V0OworCisJZG8geworCQkvKiBHZXQgRkMgRGV2aWNlIFBhZ2UgMCBoZWFkZXIgKi8KKwkJaGRyLlBhZ2VWZXJzaW9uID0gMDsKKwkJaGRyLlBhZ2VMZW5ndGggPSAwOworCQloZHIuUGFnZU51bWJlciA9IDA7CisJCWhkci5QYWdlVHlwZSA9IE1QSV9DT05GSUdfUEFHRVRZUEVfRkNfREVWSUNFOworCQljZmcuY2ZnaGRyLmhkciA9ICZoZHI7CisJCWNmZy5waHlzQWRkciA9IC0xOworCQljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9IRUFERVI7CisJCWNmZy5kaXIgPSAwOworCQljZmcucGFnZUFkZHIgPSBwb3J0X2lkOworCQljZmcudGltZW91dCA9IDA7CisKKwkJaWYgKChyYyA9IG1wdF9jb25maWcoaW9jLCAmY2ZnKSkgIT0gMCkKKwkJCWJyZWFrOworCisJCWlmIChoZHIuUGFnZUxlbmd0aCA8PSAwKQorCQkJYnJlYWs7CisKKwkJZGF0YV9zeiA9IGhkci5QYWdlTGVuZ3RoICogNDsKKwkJcHBhZ2UwX2FsbG9jID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaW9jLT5wY2lkZXYsIGRhdGFfc3osCisJCSAgICAJCQkJCSZwYWdlMF9kbWEpOworCQlyYyA9IC1FTk9NRU07CisJCWlmICghcHBhZ2UwX2FsbG9jKQorCQkJYnJlYWs7CisKKwkJY2ZnLnBoeXNBZGRyID0gcGFnZTBfZG1hOworCQljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9SRUFEX0NVUlJFTlQ7CisKKwkJaWYgKChyYyA9IG1wdF9jb25maWcoaW9jLCAmY2ZnKSkgPT0gMCkgeworCQkJcHBhZ2UwX2FsbG9jLT5Qb3J0SWRlbnRpZmllciA9CisJCQkJbGUzMl90b19jcHUocHBhZ2UwX2FsbG9jLT5Qb3J0SWRlbnRpZmllcik7CisKKwkJCXBwYWdlMF9hbGxvYy0+V1dOTi5Mb3cgPQorCQkJCWxlMzJfdG9fY3B1KHBwYWdlMF9hbGxvYy0+V1dOTi5Mb3cpOworCisJCQlwcGFnZTBfYWxsb2MtPldXTk4uSGlnaCA9CisJCQkJbGUzMl90b19jcHUocHBhZ2UwX2FsbG9jLT5XV05OLkhpZ2gpOworCisJCQlwcGFnZTBfYWxsb2MtPldXUE4uTG93ID0KKwkJCQlsZTMyX3RvX2NwdShwcGFnZTBfYWxsb2MtPldXUE4uTG93KTsKKworCQkJcHBhZ2UwX2FsbG9jLT5XV1BOLkhpZ2ggPQorCQkJCWxlMzJfdG9fY3B1KHBwYWdlMF9hbGxvYy0+V1dQTi5IaWdoKTsKKworCQkJcHBhZ2UwX2FsbG9jLT5CQkNyZWRpdCA9CisJCQkJbGUxNl90b19jcHUocHBhZ2UwX2FsbG9jLT5CQkNyZWRpdCk7CisKKwkJCXBwYWdlMF9hbGxvYy0+TWF4UnhGcmFtZVNpemUgPQorCQkJCWxlMTZfdG9fY3B1KHBwYWdlMF9hbGxvYy0+TWF4UnhGcmFtZVNpemUpOworCisJCQlwb3J0X2lkID0gcHBhZ2UwX2FsbG9jLT5Qb3J0SWRlbnRpZmllcjsKKwkJCW51bV90YXJnKys7CisJCQkqcF9wMCA9ICpwcGFnZTBfYWxsb2M7CS8qIHNhdmUgZGF0YSAqLworCQkJKnBfcHAwKysgPSBwX3AwKys7CS8qIHNhdmUgYWRkciAqLworCQl9CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaW9jLT5wY2lkZXYsIGRhdGFfc3osCisJCSAgICAJCQkodTggKikgcHBhZ2UwX2FsbG9jLCBwYWdlMF9kbWEpOworCQlpZiAocmMgIT0gMCkKKwkJCWJyZWFrOworCisJfSB3aGlsZSAocG9ydF9pZCA8PSAweGZmMDAwMCk7CisKKwlpZiAobnVtX3RhcmcpIHsKKwkJLyogc29ydCBhcnJheSAqLworCQlpZiAobnVtX3RhcmcgPiAxKQorCQkJc29ydCAocHAwX2FycmF5LCBudW1fdGFyZywgc2l6ZW9mKEZDRGV2aWNlUGFnZTBfdCAqKSwKKwkJCQltcHRmY19GY0RldlBhZ2UwX2NtcF9mdW5jLCBOVUxMKTsKKwkJLyogY2FsbCBjYWxsZXIncyBmdW5jIGZvciBlYWNoIHRhcmcgKi8KKwkJZm9yIChpaSA9IDA7IGlpIDwgbnVtX3Rhcmc7ICBpaSsrKSB7CisJCQlmYyA9ICoocHAwX2FycmF5K2lpKTsKKwkJCWZ1bmMoaW9jLCBpb2NfcG9ydCwgZmMpOworCQl9CisJfQorCisgb3V0OgorCWlmIChwcDBfYXJyYXkpCisJCWtmcmVlKHBwMF9hcnJheSk7CisJaWYgKHAwX2FycmF5KQorCQlrZnJlZShwMF9hcnJheSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CittcHRmY19nZW5lcmF0ZV9ycG9ydF9pZHMoRkNEZXZpY2VQYWdlMF90ICpwZzAsIHN0cnVjdCBmY19ycG9ydF9pZGVudGlmaWVycyAqcmlkKQoreworCS8qIG5vdCBjdXJyZW50bHkgdXNhYmxlICovCisJaWYgKHBnMC0+RmxhZ3MgJiAoTVBJX0ZDX0RFVklDRV9QQUdFMF9GTEFHU19QTE9HSV9JTlZBTElEIHwKKwkJCSAgTVBJX0ZDX0RFVklDRV9QQUdFMF9GTEFHU19QUkxJX0lOVkFMSUQpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIShwZzAtPkZsYWdzICYgTVBJX0ZDX0RFVklDRV9QQUdFMF9GTEFHU19UQVJHRVRJRF9CVVNfVkFMSUQpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIShwZzAtPlByb3RvY29sICYgTVBJX0ZDX0RFVklDRV9QQUdFMF9QUk9UX0ZDUF9UQVJHRVQpKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIGJvYXJkIGRhdGEgc3RydWN0dXJlIGFscmVhZHkgbm9ybWFsaXplZCB0byBwbGF0Zm9ybSBlbmRpYW5uZXNzCisJICogc2hpZnRlZCB0byBhdm9pZCB1bmFsaWduZWQgYWNjZXNzIG9uIDY0IGJpdCBhcmNoaXRlY3R1cmUKKwkgKi8KKwlyaWQtPm5vZGVfbmFtZSA9ICgodTY0KXBnMC0+V1dOTi5IaWdoKSA8PCAzMiB8ICh1NjQpcGcwLT5XV05OLkxvdzsKKwlyaWQtPnBvcnRfbmFtZSA9ICgodTY0KXBnMC0+V1dQTi5IaWdoKSA8PCAzMiB8ICh1NjQpcGcwLT5XV1BOLkxvdzsKKwlyaWQtPnBvcnRfaWQgPSAgIHBnMC0+UG9ydElkZW50aWZpZXI7CisJcmlkLT5yb2xlcyA9IEZDX1JQT1JUX1JPTEVfVU5LTk9XTjsKKwlyaWQtPnJvbGVzIHw9IEZDX1JQT1JUX1JPTEVfRkNQX1RBUkdFVDsKKwlpZiAocGcwLT5Qcm90b2NvbCAmIE1QSV9GQ19ERVZJQ0VfUEFHRTBfUFJPVF9GQ1BfSU5JVElBVE9SKQorCQlyaWQtPnJvbGVzIHw9IEZDX1JQT1JUX1JPTEVfRkNQX0lOSVRJQVRPUjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbXB0ZmNfcmVnaXN0ZXJfZGV2KE1QVF9BREFQVEVSICppb2MsIGludCBjaGFubmVsLCBGQ0RldmljZVBhZ2UwX3QgKnBnMCkKK3sKKwlzdHJ1Y3QgZmNfcnBvcnRfaWRlbnRpZmllcnMgcnBvcnRfaWRzOworCXN0cnVjdCBmY19ycG9ydAkJKnJwb3J0OworCXN0cnVjdCBtcHRmY19ycG9ydF9pbmZvCSpyaTsKKwlpbnQJCQltYXRjaCA9IDA7CisJdTY0CQkJcG9ydF9uYW1lOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisJaWYgKG1wdGZjX2dlbmVyYXRlX3Jwb3J0X2lkcyhwZzAsICZycG9ydF9pZHMpIDwgMCkKKwkJcmV0dXJuOworCisJLyogc2NhbiBsaXN0IGxvb2tpbmcgZm9yIGEgbWF0Y2ggKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5mY19ycG9ydF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyaSwgJmlvYy0+ZmNfcnBvcnRzLCBsaXN0KSB7CisJCXBvcnRfbmFtZSA9ICh1NjQpcmktPnBnMC5XV1BOLkhpZ2ggPDwgMzIgfCAodTY0KXJpLT5wZzAuV1dQTi5Mb3c7CisJCWlmIChwb3J0X25hbWUgPT0gcnBvcnRfaWRzLnBvcnRfbmFtZSkgewkvKiBtYXRjaCAqLworCQkJbGlzdF9tb3ZlX3RhaWwoJnJpLT5saXN0LCAmaW9jLT5mY19ycG9ydHMpOworCQkJbWF0Y2ggPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFtYXRjaCkgewkvKiBhbGxvY2F0ZSBvbmUgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5mY19ycG9ydF9sb2NrLCBmbGFncyk7CisJCXJpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1wdGZjX3Jwb3J0X2luZm8pLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFyaSkKKwkJCXJldHVybjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+ZmNfcnBvcnRfbG9jaywgZmxhZ3MpOworCQlsaXN0X2FkZF90YWlsKCZyaS0+bGlzdCwgJmlvYy0+ZmNfcnBvcnRzKTsKKwl9CisKKwlyaS0+cGcwID0gKnBnMDsJLyogYWRkL3VwZGF0ZSBwZzAgZGF0YSAqLworCXJpLT5mbGFncyAmPSB+TVBUX1JQT1JUX0lORk9fRkxBR1NfTUlTU0lORzsKKworCWlmICghKHJpLT5mbGFncyAmIE1QVF9SUE9SVF9JTkZPX0ZMQUdTX1JFR0lTVEVSRUQpKSB7CisJCXJpLT5mbGFncyB8PSBNUFRfUlBPUlRfSU5GT19GTEFHU19SRUdJU1RFUkVEOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPmZjX3Jwb3J0X2xvY2ssIGZsYWdzKTsKKwkJcnBvcnQgPSBmY19yZW1vdGVfcG9ydF9hZGQoaW9jLT5zaCxjaGFubmVsLCAmcnBvcnRfaWRzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+ZmNfcnBvcnRfbG9jaywgZmxhZ3MpOworCQlpZiAocnBvcnQpIHsKKwkJCWlmICgqKChzdHJ1Y3QgbXB0ZmNfcnBvcnRfaW5mbyAqKilycG9ydC0+ZGRfZGF0YSkgIT0gcmkpIHsKKwkJCQlyaS0+ZmxhZ3MgJj0gfk1QVF9SUE9SVF9JTkZPX0ZMQUdTX01BUFBFRF9WREVWOworCQkJCXJpLT52ZGV2ID0gTlVMTDsKKwkJCQlyaS0+cnBvcnQgPSBycG9ydDsKKwkJCQkqKChzdHJ1Y3QgbXB0ZmNfcnBvcnRfaW5mbyAqKilycG9ydC0+ZGRfZGF0YSkgPSByaTsKKwkJCX0KKwkJCXJwb3J0LT5kZXZfbG9zc190bW8gPSBtcHRmY19kZXZfbG9zc190bW87CisJCQkvKgorCQkJICogaWYgYWxyZWFkeSBtYXBwZWQsIHJlbWFwIGhlcmUuICBJZiBub3QgbWFwcGVkLAorCQkJICogc2xhdmVfYWxsb2Mgd2lsbCBhbGxvY2F0ZSB2ZGV2IGFuZCBtYXAKKwkJCSAqLworCQkJaWYgKHJpLT5mbGFncyAmIE1QVF9SUE9SVF9JTkZPX0ZMQUdTX01BUFBFRF9WREVWKSB7CisJCQkJcmktPnZkZXYtPnRhcmdldF9pZCA9IHJpLT5wZzAuQ3VycmVudFRhcmdldElEOworCQkJCXJpLT52ZGV2LT5idXNfaWQgPSByaS0+cGcwLkN1cnJlbnRCdXM7CisJCQkJcmktPnZkZXYtPnZ0YXJnZXQtPnRhcmdldF9pZCA9IHJpLT52ZGV2LT50YXJnZXRfaWQ7CisJCQkJcmktPnZkZXYtPnZ0YXJnZXQtPmJ1c19pZCA9IHJpLT52ZGV2LT5idXNfaWQ7CisJCQl9CisJCQkjaWZkZWYgTVBUX0RFQlVHCisJCQlwcmludGsgKCJtcHRmY19yZWdfZGV2LiVkOiAleCwgJWxseCAvICVsbHgsIHRpZCAlZCwgIgorCQkJCSJycG9ydCB0aWQgJWQsIHRtbyAlZFxuIiwKKwkJCQkJaW9jLT5zaC0+aG9zdF9ubywKKwkJCQkJcGcwLT5Qb3J0SWRlbnRpZmllciwKKwkJCQkJcGcwLT5XV05OLAorCQkJCQlwZzAtPldXUE4sCisJCQkJCXBnMC0+Q3VycmVudFRhcmdldElELAorCQkJCQlyaS0+cnBvcnQtPnNjc2lfdGFyZ2V0X2lkLAorCQkJCQlyaS0+cnBvcnQtPmRldl9sb3NzX3Rtbyk7CisJCQkjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCWxpc3RfZGVsKCZyaS0+bGlzdCk7CisJCQlrZnJlZShyaSk7CisJCQlyaSA9IE5VTEw7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5mY19ycG9ydF9sb2NrLGZsYWdzKTsKKworfQorCisvKgorICoJT1MgZW50cnkgcG9pbnQgdG8gYWxsb3cgaG9zdCBkcml2ZXIgdG8gYWxsb2MgbWVtb3J5CisgKglmb3IgZWFjaCBzY3NpIGRldmljZS4gQ2FsbGVkIG9uY2UgcGVyIGRldmljZSB0aGUgYnVzIHNjYW4uCisgKglSZXR1cm4gbm9uLXplcm8gaWYgYWxsb2NhdGlvbiBmYWlscy4KKyAqCUluaXQgbWVtb3J5IG9uY2UgcGVyIExVTi4KKyAqLworaW50CittcHRmY19zbGF2ZV9hbGxvYyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJTVBUX1NDU0lfSE9TVAkJKmhkOworCVZpcnRUYXJnZXQJCSp2dGFyZ2V0OworCVZpcnREZXZpY2UJCSp2ZGV2OworCXN0cnVjdCBzY3NpX3RhcmdldAkqc3RhcmdldDsKKwlzdHJ1Y3QgZmNfcnBvcnQJCSpycG9ydDsKKwlzdHJ1Y3QgbXB0ZmNfcnBvcnRfaW5mbyAqcmk7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKworCXJwb3J0ID0gc3RhcmdldF90b19ycG9ydChzY3NpX3RhcmdldChzZGV2KSk7CisKKwlpZiAoIXJwb3J0IHx8IGZjX3JlbW90ZV9wb3J0X2Noa3JlYWR5KHJwb3J0KSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCWhkID0gKE1QVF9TQ1NJX0hPU1QgKilzZGV2LT5ob3N0LT5ob3N0ZGF0YTsKKworCXZkZXYgPSBrbWFsbG9jKHNpemVvZihWaXJ0RGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2ZGV2KSB7CisJCXByaW50ayhNWUlPQ19zX0VSUl9GTVQgInNsYXZlX2FsbG9jIGttYWxsb2MoJXpkKSBGQUlMRUQhXG4iLAorCQkJCWhkLT5pb2MtPm5hbWUsIHNpemVvZihWaXJ0RGV2aWNlKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQodmRldiwgMCwgc2l6ZW9mKFZpcnREZXZpY2UpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoZC0+aW9jLT5mY19ycG9ydF9sb2NrLGZsYWdzKTsKKworCWlmICghKHJpID0gKigoc3RydWN0IG1wdGZjX3Jwb3J0X2luZm8gKiopcnBvcnQtPmRkX2RhdGEpKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoZC0+aW9jLT5mY19ycG9ydF9sb2NrLGZsYWdzKTsKKwkJa2ZyZWUodmRldik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXNkZXYtPmhvc3RkYXRhID0gdmRldjsKKwlzdGFyZ2V0ID0gc2NzaV90YXJnZXQoc2Rldik7CisJdnRhcmdldCA9IHN0YXJnZXQtPmhvc3RkYXRhOworCWlmICh2dGFyZ2V0LT5udW1fbHVucyA9PSAwKSB7CisJCXZ0YXJnZXQtPnRmbGFncyA9IE1QVF9UQVJHRVRfRkxBR1NfUV9ZRVMgfAorCQkgICAgCQkgIE1QVF9UQVJHRVRfRkxBR1NfVkFMSURfSU5RVUlSWTsKKwkJaGQtPlRhcmdldHNbc2Rldi0+aWRdID0gdnRhcmdldDsKKwl9CisKKwl2dGFyZ2V0LT50YXJnZXRfaWQgPSB2ZGV2LT50YXJnZXRfaWQ7CisJdnRhcmdldC0+YnVzX2lkID0gdmRldi0+YnVzX2lkOworCisJdmRldi0+dnRhcmdldCA9IHZ0YXJnZXQ7CisJdmRldi0+aW9jX2lkID0gaGQtPmlvYy0+aWQ7CisJdmRldi0+bHVuID0gc2Rldi0+bHVuOworCXZkZXYtPnRhcmdldF9pZCA9IHJpLT5wZzAuQ3VycmVudFRhcmdldElEOworCXZkZXYtPmJ1c19pZCA9IHJpLT5wZzAuQ3VycmVudEJ1czsKKworCXJpLT5mbGFncyB8PSBNUFRfUlBPUlRfSU5GT19GTEFHU19NQVBQRURfVkRFVjsKKwlyaS0+dmRldiA9IHZkZXY7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoZC0+aW9jLT5mY19ycG9ydF9sb2NrLGZsYWdzKTsKKworCXZ0YXJnZXQtPm51bV9sdW5zKys7CisKKyNpZmRlZiBNUFRfREVCVUcKKwlwcmludGsgKCJtcHRmY19zbHZfYWxsb2MuJWQ6IG51bV9sdW5zICVkLCBzZGV2LmlkICVkLCAiCisJICAgICAgICAiQ3VycmVudFRhcmdldElEICVkLCAleCAlbGx4ICVsbHhcbiIsCisJCQlzZGV2LT5ob3N0LT5ob3N0X25vLAorCQkJdnRhcmdldC0+bnVtX2x1bnMsCisJCQlzZGV2LT5pZCwgcmktPnBnMC5DdXJyZW50VGFyZ2V0SUQsCisJCQlyaS0+cGcwLlBvcnRJZGVudGlmaWVyLCByaS0+cGcwLldXUE4sIHJpLT5wZzAuV1dOTik7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CittcHRmY19xY21kKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3QgZmNfcnBvcnQJKnJwb3J0ID0gc3RhcmdldF90b19ycG9ydChzY3NpX3RhcmdldChTQ3BudC0+ZGV2aWNlKSk7CisJaW50CQllcnI7CisKKwllcnIgPSBmY19yZW1vdGVfcG9ydF9jaGtyZWFkeShycG9ydCk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJU0NwbnQtPnJlc3VsdCA9IGVycjsKKwkJZG9uZShTQ3BudCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gbXB0c2NzaWhfcWNtZChTQ3BudCxkb25lKTsKK30KKworc3RhdGljIHZvaWQKK21wdGZjX2luaXRfaG9zdF9hdHRyKE1QVF9BREFQVEVSICppb2MsaW50IHBvcnRudW0pCit7CisJdW5zaWduZWQgY2xhc3MgPSAwLCBjb3MgPSAwOworCisJLyogZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGFzIG9ubHkgb25lIHNjc2kgKGZjKSBob3N0IHdhcyBhbGxvY2F0ZWQgKi8KKwlpZiAocG9ydG51bSAhPSAwKQorCQlyZXR1cm47CisKKwljbGFzcyA9IGlvYy0+ZmNfcG9ydF9wYWdlMFtwb3J0bnVtXS5TdXBwb3J0ZWRTZXJ2aWNlQ2xhc3M7CisJaWYgKGNsYXNzICYgTVBJX0ZDUE9SVFBBR0UwX1NVUFBPUlRfQ0xBU1NfMSkKKwkJY29zIHw9IEZDX0NPU19DTEFTUzE7CisJaWYgKGNsYXNzICYgTVBJX0ZDUE9SVFBBR0UwX1NVUFBPUlRfQ0xBU1NfMikKKwkJY29zIHw9IEZDX0NPU19DTEFTUzI7CisJaWYgKGNsYXNzICYgTVBJX0ZDUE9SVFBBR0UwX1NVUFBPUlRfQ0xBU1NfMykKKwkJY29zIHw9IEZDX0NPU19DTEFTUzM7CisKKwlmY19ob3N0X25vZGVfbmFtZShpb2MtPnNoKSA9CisJICAgIAkodTY0KWlvYy0+ZmNfcG9ydF9wYWdlMFtwb3J0bnVtXS5XV05OLkhpZ2ggPDwgMzIKKwkJICAgIHwgKHU2NClpb2MtPmZjX3BvcnRfcGFnZTBbcG9ydG51bV0uV1dOTi5Mb3c7CisKKwlmY19ob3N0X3BvcnRfbmFtZShpb2MtPnNoKSA9CisJICAgIAkodTY0KWlvYy0+ZmNfcG9ydF9wYWdlMFtwb3J0bnVtXS5XV1BOLkhpZ2ggPDwgMzIKKwkJICAgIHwgKHU2NClpb2MtPmZjX3BvcnRfcGFnZTBbcG9ydG51bV0uV1dQTi5Mb3c7CisKKwlmY19ob3N0X3BvcnRfaWQoaW9jLT5zaCkgPSBpb2MtPmZjX3BvcnRfcGFnZTBbcG9ydG51bV0uUG9ydElkZW50aWZpZXI7CisKKwlmY19ob3N0X3N1cHBvcnRlZF9jbGFzc2VzKGlvYy0+c2gpID0gY29zOworCisJZmNfaG9zdF90Z3RpZF9iaW5kX3R5cGUoaW9jLT5zaCkgPSBGQ19UR1RJRF9CSU5EX0JZX1dXUE47Cit9CisKK3N0YXRpYyB2b2lkCittcHRmY19yZXNjYW5fZGV2aWNlcyh2b2lkICphcmcpCit7CisJTVBUX0FEQVBURVIJCSppb2MgPSAoTVBUX0FEQVBURVIgKilhcmc7CisJaW50CQkJaWk7CisJaW50CQkJd29ya190b19kbzsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlzdHJ1Y3QgbXB0ZmNfcnBvcnRfaW5mbyAqcmk7CisKKwlkbyB7CisJCS8qIHN0YXJ0IGJ5IHRhZ2dpbmcgYWxsIHBvcnRzIGFzIG1pc3NpbmcgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+ZmNfcnBvcnRfbG9jayxmbGFncyk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmksICZpb2MtPmZjX3Jwb3J0cywgbGlzdCkgeworCQkJaWYgKHJpLT5mbGFncyAmIE1QVF9SUE9SVF9JTkZPX0ZMQUdTX1JFR0lTVEVSRUQpIHsKKwkJCQlyaS0+ZmxhZ3MgfD0gTVBUX1JQT1JUX0lORk9fRkxBR1NfTUlTU0lORzsKKwkJCX0KKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPmZjX3Jwb3J0X2xvY2ssZmxhZ3MpOworCisJCS8qCisJCSAqIG5vdyByZXNjYW4gZGV2aWNlcyBrbm93biB0byBhZGFwdGVyLAorCQkgKiB3aWxsIHJlcmVnaXN0ZXIgZXhpc3RpbmcgcnBvcnRzCisJCSAqLworCQlmb3IgKGlpPTA7IGlpIDwgaW9jLT5mYWN0cy5OdW1iZXJPZlBvcnRzOyBpaSsrKSB7CisJCQkodm9pZCkgbXB0YmFzZV9HZXRGY1BvcnRQYWdlMChpb2MsIGlpKTsKKwkJCW1wdGZjX2luaXRfaG9zdF9hdHRyKGlvYyxpaSk7CS8qIHJlZnJlc2ggKi8KKwkJCW1wdGZjX0dldEZjRGV2UGFnZTAoaW9jLGlpLG1wdGZjX3JlZ2lzdGVyX2Rldik7CisJCX0KKworCQkvKiBkZWxldGUgZGV2aWNlcyBzdGlsbCBtaXNzaW5nICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPmZjX3Jwb3J0X2xvY2ssIGZsYWdzKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyaSwgJmlvYy0+ZmNfcnBvcnRzLCBsaXN0KSB7CisJCQkvKiBpZiBuZXdseSBtaXNzaW5nLCBkZWxldGUgaXQgKi8KKwkJCWlmICgocmktPmZsYWdzICYgKE1QVF9SUE9SVF9JTkZPX0ZMQUdTX1JFR0lTVEVSRUQgfAorCQkJCQkgIE1QVF9SUE9SVF9JTkZPX0ZMQUdTX01JU1NJTkcpKQorCQkJICA9PSAoTVBUX1JQT1JUX0lORk9fRkxBR1NfUkVHSVNURVJFRCB8CisJCQkgICAgICBNUFRfUlBPUlRfSU5GT19GTEFHU19NSVNTSU5HKSkgeworCisJCQkJcmktPmZsYWdzICY9IH4oTVBUX1JQT1JUX0lORk9fRkxBR1NfUkVHSVNURVJFRHwKKwkJCQkJICAgICAgIE1QVF9SUE9SVF9JTkZPX0ZMQUdTX01JU1NJTkcpOworCQkJCWZjX3JlbW90ZV9wb3J0X2RlbGV0ZShyaS0+cnBvcnQpOworCQkJCS8qCisJCQkJICogcmVtb3RlIHBvcnQgbm90IHJlYWxseSBkZWxldGVkICdjYXVzZQorCQkJCSAqIGJpbmRpbmcgaXMgYnkgV1dQTiBhbmQgZHJpdmVyIG9ubHkKKwkJCQkgKiByZWdpc3RlcnMgRkNQX1RBUkdFVHMKKwkJCQkgKi8KKwkJCQkjaWZkZWYgTVBUX0RFQlVHCisJCQkJcHJpbnRrICgibXB0ZmNfcmVzY2FuLiVkOiAlbGx4IGRlbGV0ZWRcbiIsCisJCQkJCWlvYy0+c2gtPmhvc3Rfbm8sIHJpLT5wZzAuV1dQTik7CisJCQkJI2VuZGlmCisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5mY19ycG9ydF9sb2NrLGZsYWdzKTsKKworCQkvKgorCQkgKiBhbGxvdyBtdWx0aXBsZSBwYXNzZXMgYXMgdGFyZ2V0IHN0YXRlCisJCSAqIG1pZ2h0IGhhdmUgY2hhbmdlZCBkdXJpbmcgc2NhbgorCQkgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+ZmNfcmVzY2FuX3dvcmtfbG9jaywgZmxhZ3MpOworCQlpZiAoaW9jLT5mY19yZXNjYW5fd29ya19jb3VudCA+IDIpIAkvKiBvbmx5IG5lZWQgb25lIG1vcmUgKi8KKwkJCWlvYy0+ZmNfcmVzY2FuX3dvcmtfY291bnQgPSAyOworCQl3b3JrX3RvX2RvID0gLS1pb2MtPmZjX3Jlc2Nhbl93b3JrX2NvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPmZjX3Jlc2Nhbl93b3JrX2xvY2ssIGZsYWdzKTsKKwl9IHdoaWxlICh3b3JrX3RvX2RvKTsKK30KKwogc3RhdGljIGludAogbXB0ZmNfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKQEAgLTE0OCwxNyArNjI0LDE2IEBACiAJTVBUX1NDU0lfSE9TVAkJKmhkOwogCU1QVF9BREFQVEVSIAkJKmlvYzsKIAl1bnNpZ25lZCBsb25nCQkgZmxhZ3M7Ci0JaW50CQkJIHN6LCBpaTsKKwlpbnQJCQkgaWk7CiAJaW50CQkJIG51bVNHRSA9IDA7CiAJaW50CQkJIHNjYWxlOwogCWludAkJCSBpb2NfY2FwOwotCXU4CQkJKm1lbTsKIAlpbnQJCQllcnJvcj0wOwogCWludAkJCXI7Ci0JCQorCiAJaWYgKChyID0gbXB0X2F0dGFjaChwZGV2LGlkKSkgIT0gMCkKIAkJcmV0dXJuIHI7Ci0JCisKIAlpb2MgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJaW9jLT5Eb25lQ3R4ID0gbXB0ZmNEb25lQ3R4OwogCWlvYy0+VGFza0N0eCA9IG1wdGZjVGFza0N0eDsKQEAgLTE5NCw3ICs2NjksNyBAQAogCQlwcmludGsoTVlJT0Nfc19XQVJOX0ZNVAogCQkJIlNraXBwaW5nIGlvYz0lcCBiZWNhdXNlIFNDU0kgSW5pdGlhdG9yIG1vZGUgaXMgTk9UIGVuYWJsZWQhXG4iLAogCQkJaW9jLT5uYW1lLCBpb2MpOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJc2ggPSBzY3NpX2hvc3RfYWxsb2MoJm1wdGZjX2RyaXZlcl90ZW1wbGF0ZSwgc2l6ZW9mKE1QVF9TQ1NJX0hPU1QpKTsKQEAgLTIwNyw2ICs2ODIsOCBAQAogCQlnb3RvIG91dF9tcHRmY19wcm9iZTsKICAgICAgICAgfQogCisJSU5JVF9XT1JLKCZpb2MtPmZjX3Jlc2Nhbl93b3JrLCBtcHRmY19yZXNjYW5fZGV2aWNlcywodm9pZCAqKWlvYyk7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5GcmVlUWxvY2ssIGZsYWdzKTsKIAogCS8qIEF0dGFjaCB0aGUgU0NTSSBIb3N0IHRvIHRoZSBJT0Mgc3RydWN0dXJlCkBAIC0yNjgsMzYgKzc0NSwyNyBAQAogCS8qIFNDU0kgbmVlZHMgc2NzaV9jbW5kIGxvb2t1cCB0YWJsZSEKIAkgKiAod2l0aCBzaXplIGVxdWFsIHRvIHJlcV9kZXB0aCpQdHJTeiEpCiAJICovCi0Jc3ogPSBpb2MtPnJlcV9kZXB0aCAqIHNpemVvZih2b2lkICopOwotCW1lbSA9IGttYWxsb2Moc3osIEdGUF9BVE9NSUMpOwotCWlmIChtZW0gPT0gTlVMTCkgeworCWhkLT5TY3NpTG9va3VwID0ga2NhbGxvYyhpb2MtPnJlcV9kZXB0aCwgc2l6ZW9mKHZvaWQgKiksIEdGUF9BVE9NSUMpOworCWlmICghaGQtPlNjc2lMb29rdXApIHsKIAkJZXJyb3IgPSAtRU5PTUVNOwogCQlnb3RvIG91dF9tcHRmY19wcm9iZTsKIAl9CiAKLQltZW1zZXQobWVtLCAwLCBzeik7Ci0JaGQtPlNjc2lMb29rdXAgPSAoc3RydWN0IHNjc2lfY21uZCAqKikgbWVtOwotCi0JZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2NzaUxvb2t1cCBAICVwLCBzej0lZFxuIiwKLQkJIGlvYy0+bmFtZSwgaGQtPlNjc2lMb29rdXAsIHN6KSk7CisJZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2NzaUxvb2t1cCBAICVwXG4iLAorCQkgaW9jLT5uYW1lLCBoZC0+U2NzaUxvb2t1cCkpOwogCiAJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZGV2aWNlIHN0cnVjdHVyZXMuCiAJICogQSBub24tTnVsbCBwb2ludGVyIGF0IGFuIG9mZnNldAogCSAqIGluZGljYXRlcyBhIGRldmljZSBleGlzdHMuCiAJICogbWF4X2lkID0gMSArIG1heGltdW0gaWQgKGhvc3RzLmgpCiAJICovCi0Jc3ogPSBzaC0+bWF4X2lkICogc2l6ZW9mKHZvaWQgKik7Ci0JbWVtID0ga21hbGxvYyhzeiwgR0ZQX0FUT01JQyk7Ci0JaWYgKG1lbSA9PSBOVUxMKSB7CisJaGQtPlRhcmdldHMgPSBrY2FsbG9jKHNoLT5tYXhfaWQsIHNpemVvZih2b2lkICopLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWhkLT5UYXJnZXRzKSB7CiAJCWVycm9yID0gLUVOT01FTTsKIAkJZ290byBvdXRfbXB0ZmNfcHJvYmU7CiAJfQogCi0JbWVtc2V0KG1lbSwgMCwgc3opOwotCWhkLT5UYXJnZXRzID0gKFZpcnRUYXJnZXQgKiopIG1lbTsKLQotCWRwcmludGsoKEtFUk5fSU5GTwotCSAgIiAgdmRldiBAICVwLCBzej0lZFxuIiwgaGQtPlRhcmdldHMsIHN6KSk7CisJZHByaW50aygoS0VSTl9JTkZPICIgIHZkZXYgQCAlcFxuIiwgaGQtPlRhcmdldHMpKTsKIAogCS8qIENsZWFyIHRoZSBUTSBmbGFncwogCSAqLwpAQCAtMzMyLDYgKzgwMCw3IEBACiAJaGQtPnNjYW5kdl93YWl0X2RvbmUgPSAwOwogCWhkLT5sYXN0X3F1ZXVlX2Z1bGwgPSAwOwogCisJc2gtPnRyYW5zcG9ydHQgPSBtcHRmY190cmFuc3BvcnRfdGVtcGxhdGU7CiAJZXJyb3IgPSBzY3NpX2FkZF9ob3N0IChzaCwgJmlvYy0+cGNpZGV2LT5kZXYpOwogCWlmKGVycm9yKSB7CiAJCWRwcmludGsoKEtFUk5fRVJSIE1ZTkFNCkBAIC0zMzksNyArODA4LDExIEBACiAJCWdvdG8gb3V0X21wdGZjX3Byb2JlOwogCX0KIAotCXNjc2lfc2Nhbl9ob3N0KHNoKTsKKwlmb3IgKGlpPTA7IGlpIDwgaW9jLT5mYWN0cy5OdW1iZXJPZlBvcnRzOyBpaSsrKSB7CisJCW1wdGZjX2luaXRfaG9zdF9hdHRyKGlvYyxpaSk7CisJCW1wdGZjX0dldEZjRGV2UGFnZTAoaW9jLGlpLG1wdGZjX3JlZ2lzdGVyX2Rldik7CisJfQorCiAJcmV0dXJuIDA7CiAKIG91dF9tcHRmY19wcm9iZToKQEAgLTM1Miw3ICs4MjUsNyBAQAogCS5uYW1lCQk9ICJtcHRmYyIsCiAJLmlkX3RhYmxlCT0gbXB0ZmNfcGNpX3RhYmxlLAogCS5wcm9iZQkJPSBtcHRmY19wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG1wdHNjc2loX3JlbW92ZSksCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtcHRmY19yZW1vdmUpLAogCS5zaHV0ZG93bgk9IG1wdHNjc2loX3NodXRkb3duLAogI2lmZGVmIENPTkZJR19QTQogCS5zdXNwZW5kCT0gbXB0c2NzaWhfc3VzcGVuZCwKQEAgLTM3MCw5ICs4NDMsMjAgQEAKIHN0YXRpYyBpbnQgX19pbml0CiBtcHRmY19pbml0KHZvaWQpCiB7CisJaW50IGVycm9yOwogCiAJc2hvd19tcHRtb2RfdmVyKG15X05BTUUsIG15X1ZFUlNJT04pOwogCisJLyogc2FuaXR5IGNoZWNrIG1vZHVsZSBwYXJhbWV0ZXIgKi8KKwlpZiAobXB0ZmNfZGV2X2xvc3NfdG1vID09IDApCisJCW1wdGZjX2Rldl9sb3NzX3RtbyA9IE1QVEZDX0RFVl9MT1NTX1RNTzsKKworCW1wdGZjX3RyYW5zcG9ydF90ZW1wbGF0ZSA9CisJCWZjX2F0dGFjaF90cmFuc3BvcnQoJm1wdGZjX3RyYW5zcG9ydF9mdW5jdGlvbnMpOworCisJaWYgKCFtcHRmY190cmFuc3BvcnRfdGVtcGxhdGUpCisJCXJldHVybiAtRU5PREVWOworCiAJbXB0ZmNEb25lQ3R4ID0gbXB0X3JlZ2lzdGVyKG1wdHNjc2loX2lvX2RvbmUsIE1QVEZDX0RSSVZFUik7CiAJbXB0ZmNUYXNrQ3R4ID0gbXB0X3JlZ2lzdGVyKG1wdHNjc2loX3Rhc2ttZ210X2NvbXBsZXRlLCBNUFRGQ19EUklWRVIpOwogCW1wdGZjSW50ZXJuYWxDdHggPSBtcHRfcmVnaXN0ZXIobXB0c2NzaWhfc2NhbmR2X2NvbXBsZXRlLCBNUFRGQ19EUklWRVIpOwpAQCAtMzg3LDcgKzg3MSwzMyBAQAogCQkgICI6IFJlZ2lzdGVyZWQgZm9yIElPQyByZXNldCBub3RpZmljYXRpb25zXG4iKSk7CiAJfQogCi0JcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJm1wdGZjX2RyaXZlcik7CisJZXJyb3IgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZtcHRmY19kcml2ZXIpOworCWlmIChlcnJvcikgeworCQlmY19yZWxlYXNlX3RyYW5zcG9ydChtcHRmY190cmFuc3BvcnRfdGVtcGxhdGUpOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoqCisgKgltcHRmY19yZW1vdmUgLSBSZW1vdmVkIGZjIGluZnJhc3RydWN0dXJlIGZvciBkZXZpY2VzCisgKglAcGRldjogUG9pbnRlciB0byBwY2lfZGV2IHN0cnVjdHVyZQorICoKKyAqLworc3RhdGljIHZvaWQgX19kZXZleGl0IG1wdGZjX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlNUFRfQURBUFRFUiAqaW9jID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBtcHRmY19ycG9ydF9pbmZvICpwLCAqbjsKKworCWZjX3JlbW92ZV9ob3N0KGlvYy0+c2gpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHAsIG4sICZpb2MtPmZjX3Jwb3J0cywgbGlzdCkgeworCQlsaXN0X2RlbCgmcC0+bGlzdCk7CisJCWtmcmVlKHApOworCX0KKworCW1wdHNjc2loX3JlbW92ZShwZGV2KTsKIH0KIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwpAQCAtNDAwLDcgKzkxMCw4IEBACiBtcHRmY19leGl0KHZvaWQpCiB7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZtcHRmY19kcml2ZXIpOwotCQorCWZjX3JlbGVhc2VfdHJhbnNwb3J0KG1wdGZjX3RyYW5zcG9ydF90ZW1wbGF0ZSk7CisKIAltcHRfcmVzZXRfZGVyZWdpc3RlcihtcHRmY0RvbmVDdHgpOwogCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTQogCSAgIjogRGVyZWdpc3RlcmVkIGZvciBJT0MgcmVzZXQgbm90aWZpY2F0aW9uc1xuIikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRsYW4uYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0bGFuLmMKaW5kZXggMDE0MDg1ZC4uNzNmNTk1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRsYW4uYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGxhbi5jCkBAIC00MTEsMTQgKzQxMSwxMiBAQAogCQlnb3RvIG91dDsKIAlwcml2LT5tcHRfdHhmaWR4X3RhaWwgPSAtMTsKIAotCXByaXYtPlNlbmRDdGwgPSBrbWFsbG9jKHByaXYtPnR4X21heF9vdXQgKiBzaXplb2Yoc3RydWN0IEJ1ZmZlckNvbnRyb2wpLAorCXByaXYtPlNlbmRDdGwgPSBrY2FsbG9jKHByaXYtPnR4X21heF9vdXQsIHNpemVvZihzdHJ1Y3QgQnVmZmVyQ29udHJvbCksCiAJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKHByaXYtPlNlbmRDdGwgPT0gTlVMTCkKIAkJZ290byBvdXRfbXB0X3R4ZmlkeDsKLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+dHhfbWF4X291dDsgaSsrKSB7Ci0JCW1lbXNldCgmcHJpdi0+U2VuZEN0bFtpXSwgMCwgc2l6ZW9mKHN0cnVjdCBCdWZmZXJDb250cm9sKSk7CisJZm9yIChpID0gMDsgaSA8IHByaXYtPnR4X21heF9vdXQ7IGkrKykKIAkJcHJpdi0+bXB0X3R4ZmlkeFsrK3ByaXYtPm1wdF90eGZpZHhfdGFpbF0gPSBpOwotCX0KIAogCWRscHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIkBsbzogRmluaXNoZWQgaW5pdGlhbGl6aW5nIFNlbmRDdGxcbiIpKTsKIApAQCAtNDI4LDE1ICs0MjYsMTMgQEAKIAkJZ290byBvdXRfU2VuZEN0bDsKIAlwcml2LT5tcHRfcnhmaWR4X3RhaWwgPSAtMTsKIAotCXByaXYtPlJjdkN0bCA9IGttYWxsb2MocHJpdi0+bWF4X2J1Y2tldHNfb3V0ICoKLQkJCQkJCXNpemVvZihzdHJ1Y3QgQnVmZmVyQ29udHJvbCksCisJcHJpdi0+UmN2Q3RsID0ga2NhbGxvYyhwcml2LT5tYXhfYnVja2V0c19vdXQsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBCdWZmZXJDb250cm9sKSwKIAkJCSAgICAgICBHRlBfS0VSTkVMKTsKIAlpZiAocHJpdi0+UmN2Q3RsID09IE5VTEwpCiAJCWdvdG8gb3V0X21wdF9yeGZpZHg7Ci0JZm9yIChpID0gMDsgaSA8IHByaXYtPm1heF9idWNrZXRzX291dDsgaSsrKSB7Ci0JCW1lbXNldCgmcHJpdi0+UmN2Q3RsW2ldLCAwLCBzaXplb2Yoc3RydWN0IEJ1ZmZlckNvbnRyb2wpKTsKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+bWF4X2J1Y2tldHNfb3V0OyBpKyspCiAJCXByaXYtPm1wdF9yeGZpZHhbKytwcml2LT5tcHRfcnhmaWR4X3RhaWxdID0gaTsKLQl9CiAKIC8qKi8JZGxwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiL2xvOiB0eGZpZHggY29udGFpbnMgLSAiKSk7CiAvKiovCWZvciAoaSA9IDA7IGkgPCBwcml2LT50eF9tYXhfb3V0OyBpKyspCkBAIC04NDgsNyArODQ0LDcgQEAKIH0KIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogbXB0X2xhbl93YWtlX3Bvc3RfYnVja2V0c190YXNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwcmlvcml0eSkKIC8qCiAgKiBAcHJpb3JpdHk6IDAgPSBwdXQgaXQgb24gdGhlIHRpbWVyIHF1ZXVlLCAxID0gcHV0IGl0IG9uIHRoZSBpbW1lZGlhdGUgcXVldWUKQEAgLTg3MCw3ICs4NjYsNyBAQAogfQogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGludAogbXB0X2xhbl9yZWNlaXZlX3NrYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBtcHRfbGFuX3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNhcy5jIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzYXMuYwppbmRleCAxN2U5NzU3ZS4uNWEwNmQ4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzYXMuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNhcy5jCkBAIC01LDcgKzUsNyBAQAogICoKICAqICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSBMU0kgTG9naWMgQ29ycG9yYXRpb24KICAqICAobWFpbHRvOm1wdF9saW51eF9kZXZlbG9wZXJAbHNpbC5jb20pCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA1IERlbGwKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBEZWxsCiAgKi8KIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KIC8qCkBAIC04Niw2ICs4NiwyNCBAQAogc3RhdGljIGludAltcHRzYXNNZ210Q3R4ID0gLTE7CiAKIAorZW51bSBtcHRzYXNfaG90cGx1Z19hY3Rpb24geworCU1QVFNBU19BRERfREVWSUNFLAorCU1QVFNBU19ERUxfREVWSUNFLAorfTsKKworc3RydWN0IG1wdHNhc19ob3RwbHVnX2V2ZW50IHsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKKwlNUFRfQURBUFRFUgkJKmlvYzsKKwllbnVtIG1wdHNhc19ob3RwbHVnX2FjdGlvbiBldmVudF90eXBlOworCXU2NAkJCXNhc19hZGRyZXNzOworCXUzMgkJCWNoYW5uZWw7CisJdTMyCQkJaWQ7CisJdTMyCQkJZGV2aWNlX2luZm87CisJdTE2CQkJaGFuZGxlOworCXUxNgkJCXBhcmVudF9oYW5kbGU7CisJdTgJCQlwaHlfaWQ7Cit9OworCiAvKgogICogU0FTIHRvcG9sb2d5IHN0cnVjdHVyZXMKICAqCkBAIC05OSw4ICsxMTcsOCBAQAogCXU4CXBoeV9pZDsJCS8qIHBoeSBudW1iZXIgb2YgcGFyZW50IGRldmljZSAqLwogCXU4CXBvcnRfaWQ7CS8qIHNhcyBwaHlzaWNhbCBwb3J0IHRoaXMgZGV2aWNlCiAJCQkJICAgaXMgYXNzb2MnZCB3aXRoICovCi0JdTgJdGFyZ2V0OwkJLyogbG9naWNhbCB0YXJnZXQgaWQgb2YgdGhpcyBkZXZpY2UgKi8KLQl1OAlidXM7CQkvKiBsb2dpY2FsIGJ1cyBudW1iZXIgb2YgdGhpcyBkZXZpY2UgKi8KKwl1OAlpZDsJCS8qIGxvZ2ljYWwgdGFyZ2V0IGlkIG9mIHRoaXMgZGV2aWNlICovCisJdTgJY2hhbm5lbDsJLyogbG9naWNhbCBidXMgbnVtYmVyIG9mIHRoaXMgZGV2aWNlICovCiAJdTY0CXNhc19hZGRyZXNzOyAgICAvKiBXV04gb2YgdGhpcyBkZXZpY2UsCiAJCQkJICAgU0FUQSBpcyBhc3NpZ25lZCBieSBIQkEsZXhwYW5kZXIgKi8KIAl1MzIJZGV2aWNlX2luZm87CS8qIGJpdGZpZWxkIGRldGFpbGVkIGluZm8gYWJvdXQgdGhpcyBkZXZpY2UgKi8KQEAgLTExNCw2ICsxMzIsNyBAQAogCXU4CXByb2dyYW1tZWRfbGlua19yYXRlOwkvKiBwcm9ncmFtbWVkIG1heC9taW4gcGh5IGxpbmsgcmF0ZSAqLwogCXN0cnVjdCBtcHRzYXNfZGV2aW5mbyBpZGVudGlmeTsJLyogcG9pbnQgdG8gcGh5IGRldmljZSBpbmZvICovCiAJc3RydWN0IG1wdHNhc19kZXZpbmZvIGF0dGFjaGVkOwkvKiBwb2ludCB0byBhdHRhY2hlZCBkZXZpY2UgaW5mbyAqLworCXN0cnVjdCBzYXNfcGh5ICpwaHk7CiAJc3RydWN0IHNhc19ycGh5ICpycGh5OwogfTsKIApAQCAtMjM5LDEzICsyNTgsMTIgQEAKIAlzdHJ1Y3Qgc2NzaV90YXJnZXQgCSpzdGFyZ2V0OwogCWludCBpOwogCi0JdmRldiA9IGttYWxsb2Moc2l6ZW9mKFZpcnREZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwl2ZGV2ID0ga3phbGxvYyhzaXplb2YoVmlydERldmljZSksIEdGUF9LRVJORUwpOwogCWlmICghdmRldikgewogCQlwcmludGsoTVlJT0Nfc19FUlJfRk1UICJzbGF2ZV9hbGxvYyBrbWFsbG9jKCV6ZCkgRkFJTEVEIVxuIiwKIAkJCQloZC0+aW9jLT5uYW1lLCBzaXplb2YoVmlydERldmljZSkpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtc2V0KHZkZXYsIDAsIHNpemVvZihWaXJ0RGV2aWNlKSk7CiAJdmRldi0+aW9jX2lkID0gaGQtPmlvYy0+aWQ7CiAJc2Rldi0+aG9zdGRhdGEgPSB2ZGV2OwogCXN0YXJnZXQgPSBzY3NpX3RhcmdldChzZGV2KTsKQEAgLTI1NiwxOSArMjc0LDMyIEBACiAJCWhkLT5UYXJnZXRzW3NkZXYtPmlkXSA9IHZ0YXJnZXQ7CiAJfQogCisJLyoKKwkgIFJBSUQgdm9sdW1lcyBwbGFjZWQgYmV5b25kIHRoZSBsYXN0IGV4cGVjdGVkIHBvcnQuCisJKi8KKwlpZiAoc2Rldi0+Y2hhbm5lbCA9PSBoZC0+aW9jLT5udW1fcG9ydHMpIHsKKwkJdmRldi0+dGFyZ2V0X2lkID0gc2Rldi0+aWQ7CisJCXZkZXYtPmJ1c19pZCA9IDA7CisJCXZkZXYtPmx1biA9IDA7CisJCWdvdG8gb3V0OworCX0KKwogCXJwaHkgPSBkZXZfdG9fcnBoeShzZGV2LT5zZGV2X3RhcmdldC0+ZGV2LnBhcmVudCk7CisJbXV0ZXhfbG9jaygmaGQtPmlvYy0+c2FzX3RvcG9sb2d5X211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZoZC0+aW9jLT5zYXNfdG9wb2xvZ3ksIGxpc3QpIHsKIAkJZm9yIChpID0gMDsgaSA8IHAtPm51bV9waHlzOyBpKyspIHsKIAkJCWlmIChwLT5waHlfaW5mb1tpXS5hdHRhY2hlZC5zYXNfYWRkcmVzcyA9PQogCQkJCQlycGh5LT5pZGVudGlmeS5zYXNfYWRkcmVzcykgewogCQkJCXZkZXYtPnRhcmdldF9pZCA9Ci0JCQkJCXAtPnBoeV9pbmZvW2ldLmF0dGFjaGVkLnRhcmdldDsKLQkJCQl2ZGV2LT5idXNfaWQgPSBwLT5waHlfaW5mb1tpXS5hdHRhY2hlZC5idXM7CisJCQkJCXAtPnBoeV9pbmZvW2ldLmF0dGFjaGVkLmlkOworCQkJCXZkZXYtPmJ1c19pZCA9IHAtPnBoeV9pbmZvW2ldLmF0dGFjaGVkLmNoYW5uZWw7CiAJCQkJdmRldi0+bHVuID0gc2Rldi0+bHVuOworIAltdXRleF91bmxvY2soJmhkLT5pb2MtPnNhc190b3BvbG9neV9tdXRleCk7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCX0KIAl9CisJbXV0ZXhfdW5sb2NrKCZoZC0+aW9jLT5zYXNfdG9wb2xvZ3lfbXV0ZXgpOwogCiAJcHJpbnRrKCJObyBtYXRjaGluZyBTQVMgZGV2aWNlIGZvdW5kISFcbiIpOwogCWtmcmVlKHZkZXYpOwpAQCAtMjgyLDYgKzMxMyw0MiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZAorbXB0c2FzX3NsYXZlX2Rlc3Ryb3koc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBzZGV2LT5ob3N0OworCU1QVF9TQ1NJX0hPU1QgKmhkID0gKE1QVF9TQ1NJX0hPU1QgKilob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3Qgc2FzX3JwaHkgKnJwaHk7CisJc3RydWN0IG1wdHNhc19wb3J0aW5mbyAqcDsKKwlpbnQgaTsKKworCS8qCisJICogSGFuZGxlIGhvdHBsdWcgcmVtb3ZhbCBjYXNlLgorCSAqIFdlIG5lZWQgdG8gY2xlYXIgb3V0IGF0dGFjaGVkIGRhdGEgc3RydWN0dXJlLgorCSAqLworCXJwaHkgPSBkZXZfdG9fcnBoeShzZGV2LT5zZGV2X3RhcmdldC0+ZGV2LnBhcmVudCk7CisKKwltdXRleF9sb2NrKCZoZC0+aW9jLT5zYXNfdG9wb2xvZ3lfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmhkLT5pb2MtPnNhc190b3BvbG9neSwgbGlzdCkgeworCQlmb3IgKGkgPSAwOyBpIDwgcC0+bnVtX3BoeXM7IGkrKykgeworCQkJaWYgKHAtPnBoeV9pbmZvW2ldLmF0dGFjaGVkLnNhc19hZGRyZXNzID09CisJCQkJCXJwaHktPmlkZW50aWZ5LnNhc19hZGRyZXNzKSB7CisJCQkJbWVtc2V0KCZwLT5waHlfaW5mb1tpXS5hdHRhY2hlZCwgMCwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBtcHRzYXNfZGV2aW5mbykpOworCQkJCXAtPnBoeV9pbmZvW2ldLnJwaHkgPSBOVUxMOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJfQorCisgb3V0OgorCW11dGV4X3VubG9jaygmaGQtPmlvYy0+c2FzX3RvcG9sb2d5X211dGV4KTsKKwkvKgorCSAqIFRPRE86IElzc3VlIHRhcmdldCByZXNldCB0byBmbHVzaCBmaXJtd2FyZSBvdXRzdGFuZGluZyBjb21tYW5kcy4KKwkgKi8KKwltcHRzY3NpaF9zbGF2ZV9kZXN0cm95KHNkZXYpOworfQorCiBzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBtcHRzYXNfZHJpdmVyX3RlbXBsYXRlID0gewogCS5tb2R1bGUJCQkJPSBUSElTX01PRFVMRSwKIAkucHJvY19uYW1lCQkJPSAibXB0c2FzIiwKQEAgLTI5Myw3ICszNjAsNyBAQAogCS5zbGF2ZV9hbGxvYwkJCT0gbXB0c2FzX3NsYXZlX2FsbG9jLAogCS5zbGF2ZV9jb25maWd1cmUJCT0gbXB0c2NzaWhfc2xhdmVfY29uZmlndXJlLAogCS50YXJnZXRfZGVzdHJveQkJCT0gbXB0c2NzaWhfdGFyZ2V0X2Rlc3Ryb3ksCi0JLnNsYXZlX2Rlc3Ryb3kJCQk9IG1wdHNjc2loX3NsYXZlX2Rlc3Ryb3ksCisJLnNsYXZlX2Rlc3Ryb3kJCQk9IG1wdHNhc19zbGF2ZV9kZXN0cm95LAogCS5jaGFuZ2VfcXVldWVfZGVwdGggCQk9IG1wdHNjc2loX2NoYW5nZV9xdWV1ZV9kZXB0aCwKIAkuZWhfYWJvcnRfaGFuZGxlcgkJPSBtcHRzY3NpaF9hYm9ydCwKIAkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIJPSBtcHRzY3NpaF9kZXZfcmVzZXQsCkBAIC0zOTksNyArNDY2LDcgQEAKIAlpZiAocGh5LT5pZGVudGlmeS50YXJnZXRfcG9ydF9wcm90b2NvbHMgJiBTQVNfUFJPVE9DT0xfU01QKQogCQlyZXR1cm4gLUVOWElPOwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmaW9jLT5zYXNfbWdtdC5tdXRleCkpCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmaW9jLT5zYXNfbWdtdC5tdXRleCkpCiAJCWdvdG8gb3V0OwogCiAJbWYgPSBtcHRfZ2V0X21zZ19mcmFtZShtcHRzYXNNZ210Q3R4LCBpb2MpOwpAQCAtNDUwLDcgKzUxNyw3IEBACiAJZXJyb3IgPSAwOwogCiAgb3V0X3VubG9jazoKLQl1cCgmaW9jLT5zYXNfbWdtdC5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZpb2MtPnNhc19tZ210Lm11dGV4KTsKICBvdXQ6CiAJcmV0dXJuIGVycm9yOwogfQpAQCAtNjQ5LDggKzcxNiw4IEBACiAJZGV2aWNlX2luZm8tPmhhbmRsZSA9IGxlMTZfdG9fY3B1KGJ1ZmZlci0+RGV2SGFuZGxlKTsKIAlkZXZpY2VfaW5mby0+cGh5X2lkID0gYnVmZmVyLT5QaHlOdW07CiAJZGV2aWNlX2luZm8tPnBvcnRfaWQgPSBidWZmZXItPlBoeXNpY2FsUG9ydDsKLQlkZXZpY2VfaW5mby0+dGFyZ2V0ID0gYnVmZmVyLT5UYXJnZXRJRDsKLQlkZXZpY2VfaW5mby0+YnVzID0gYnVmZmVyLT5CdXM7CisJZGV2aWNlX2luZm8tPmlkID0gYnVmZmVyLT5UYXJnZXRJRDsKKwlkZXZpY2VfaW5mby0+Y2hhbm5lbCA9IGJ1ZmZlci0+QnVzOwogCW1lbWNweSgmc2FzX2FkZHJlc3MsICZidWZmZXItPlNBU0FkZHJlc3MsIHNpemVvZihfX2xlNjQpKTsKIAlkZXZpY2VfaW5mby0+c2FzX2FkZHJlc3MgPSBsZTY0X3RvX2NwdShzYXNfYWRkcmVzcyk7CiAJZGV2aWNlX2luZm8tPmRldmljZV9pbmZvID0KQEAgLTg1OCwzNiArOTI1LDM2IEBACiBzdGF0aWMgaW50IG1wdHNhc19wcm9iZV9vbmVfcGh5KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IG1wdHNhc19waHlpbmZvICpwaHlfaW5mbywgaW50IGluZGV4LCBpbnQgbG9jYWwpCiB7Ci0Jc3RydWN0IHNhc19waHkgKnBvcnQ7CisJc3RydWN0IHNhc19waHkgKnBoeTsKIAlpbnQgZXJyb3I7CiAKLQlwb3J0ID0gc2FzX3BoeV9hbGxvYyhkZXYsIGluZGV4KTsKLQlpZiAoIXBvcnQpCisJcGh5ID0gc2FzX3BoeV9hbGxvYyhkZXYsIGluZGV4KTsKKwlpZiAoIXBoeSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlwb3J0LT5wb3J0X2lkZW50aWZpZXIgPSBwaHlfaW5mby0+cG9ydF9pZDsKLQltcHRzYXNfcGFyc2VfZGV2aWNlX2luZm8oJnBvcnQtPmlkZW50aWZ5LCAmcGh5X2luZm8tPmlkZW50aWZ5KTsKKwlwaHktPnBvcnRfaWRlbnRpZmllciA9IHBoeV9pbmZvLT5wb3J0X2lkOworCW1wdHNhc19wYXJzZV9kZXZpY2VfaW5mbygmcGh5LT5pZGVudGlmeSwgJnBoeV9pbmZvLT5pZGVudGlmeSk7CiAKIAkvKgogCSAqIFNldCBOZWdvdGlhdGVkIGxpbmsgcmF0ZS4KIAkgKi8KIAlzd2l0Y2ggKHBoeV9pbmZvLT5uZWdvdGlhdGVkX2xpbmtfcmF0ZSkgewogCWNhc2UgTVBJX1NBU19JT1VOSVQwX1JBVEVfUEhZX0RJU0FCTEVEOgotCQlwb3J0LT5uZWdvdGlhdGVkX2xpbmtyYXRlID0gU0FTX1BIWV9ESVNBQkxFRDsKKwkJcGh5LT5uZWdvdGlhdGVkX2xpbmtyYXRlID0gU0FTX1BIWV9ESVNBQkxFRDsKIAkJYnJlYWs7CiAJY2FzZSBNUElfU0FTX0lPVU5JVDBfUkFURV9GQUlMRURfU1BFRURfTkVHT1RJQVRJT046Ci0JCXBvcnQtPm5lZ290aWF0ZWRfbGlua3JhdGUgPSBTQVNfTElOS19SQVRFX0ZBSUxFRDsKKwkJcGh5LT5uZWdvdGlhdGVkX2xpbmtyYXRlID0gU0FTX0xJTktfUkFURV9GQUlMRUQ7CiAJCWJyZWFrOwogCWNhc2UgTVBJX1NBU19JT1VOSVQwX1JBVEVfMV81OgotCQlwb3J0LT5uZWdvdGlhdGVkX2xpbmtyYXRlID0gU0FTX0xJTktfUkFURV8xXzVfR0JQUzsKKwkJcGh5LT5uZWdvdGlhdGVkX2xpbmtyYXRlID0gU0FTX0xJTktfUkFURV8xXzVfR0JQUzsKIAkJYnJlYWs7CiAJY2FzZSBNUElfU0FTX0lPVU5JVDBfUkFURV8zXzA6Ci0JCXBvcnQtPm5lZ290aWF0ZWRfbGlua3JhdGUgPSBTQVNfTElOS19SQVRFXzNfMF9HQlBTOworCQlwaHktPm5lZ290aWF0ZWRfbGlua3JhdGUgPSBTQVNfTElOS19SQVRFXzNfMF9HQlBTOwogCQlicmVhazsKIAljYXNlIE1QSV9TQVNfSU9VTklUMF9SQVRFX1NBVEFfT09CX0NPTVBMRVRFOgogCWNhc2UgTVBJX1NBU19JT1VOSVQwX1JBVEVfVU5LTk9XTjoKIAlkZWZhdWx0OgotCQlwb3J0LT5uZWdvdGlhdGVkX2xpbmtyYXRlID0gU0FTX0xJTktfUkFURV9VTktOT1dOOworCQlwaHktPm5lZ290aWF0ZWRfbGlua3JhdGUgPSBTQVNfTElOS19SQVRFX1VOS05PV047CiAJCWJyZWFrOwogCX0KIApAQCAtODk2LDEwICs5NjMsMTAgQEAKIAkgKi8KIAlzd2l0Y2ggKHBoeV9pbmZvLT5od19saW5rX3JhdGUgJiBNUElfU0FTX1BIWTBfUFJBVEVfTUFYX1JBVEVfTUFTSykgewogCWNhc2UgTVBJX1NBU19QSFkwX0hXUkFURV9NQVhfUkFURV8xXzU6Ci0JCXBvcnQtPm1heGltdW1fbGlua3JhdGVfaHcgPSBTQVNfTElOS19SQVRFXzFfNV9HQlBTOworCQlwaHktPm1heGltdW1fbGlua3JhdGVfaHcgPSBTQVNfTElOS19SQVRFXzFfNV9HQlBTOwogCQlicmVhazsKIAljYXNlIE1QSV9TQVNfUEhZMF9QUkFURV9NQVhfUkFURV8zXzA6Ci0JCXBvcnQtPm1heGltdW1fbGlua3JhdGVfaHcgPSBTQVNfTElOS19SQVRFXzNfMF9HQlBTOworCQlwaHktPm1heGltdW1fbGlua3JhdGVfaHcgPSBTQVNfTElOS19SQVRFXzNfMF9HQlBTOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTkxMSwxMCArOTc4LDEwIEBACiAJc3dpdGNoIChwaHlfaW5mby0+cHJvZ3JhbW1lZF9saW5rX3JhdGUgJgogCQkJTVBJX1NBU19QSFkwX1BSQVRFX01BWF9SQVRFX01BU0spIHsKIAljYXNlIE1QSV9TQVNfUEhZMF9QUkFURV9NQVhfUkFURV8xXzU6Ci0JCXBvcnQtPm1heGltdW1fbGlua3JhdGUgPSBTQVNfTElOS19SQVRFXzFfNV9HQlBTOworCQlwaHktPm1heGltdW1fbGlua3JhdGUgPSBTQVNfTElOS19SQVRFXzFfNV9HQlBTOwogCQlicmVhazsKIAljYXNlIE1QSV9TQVNfUEhZMF9QUkFURV9NQVhfUkFURV8zXzA6Ci0JCXBvcnQtPm1heGltdW1fbGlua3JhdGUgPSBTQVNfTElOS19SQVRFXzNfMF9HQlBTOworCQlwaHktPm1heGltdW1fbGlua3JhdGUgPSBTQVNfTElOS19SQVRFXzNfMF9HQlBTOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTkyNSwxMCArOTkyLDEwIEBACiAJICovCiAJc3dpdGNoIChwaHlfaW5mby0+aHdfbGlua19yYXRlICYgTVBJX1NBU19QSFkwX0hXUkFURV9NSU5fUkFURV9NQVNLKSB7CiAJY2FzZSBNUElfU0FTX1BIWTBfSFdSQVRFX01JTl9SQVRFXzFfNToKLQkJcG9ydC0+bWluaW11bV9saW5rcmF0ZV9odyA9IFNBU19MSU5LX1JBVEVfMV81X0dCUFM7CisJCXBoeS0+bWluaW11bV9saW5rcmF0ZV9odyA9IFNBU19MSU5LX1JBVEVfMV81X0dCUFM7CiAJCWJyZWFrOwogCWNhc2UgTVBJX1NBU19QSFkwX1BSQVRFX01JTl9SQVRFXzNfMDoKLQkJcG9ydC0+bWluaW11bV9saW5rcmF0ZV9odyA9IFNBU19MSU5LX1JBVEVfM18wX0dCUFM7CisJCXBoeS0+bWluaW11bV9saW5rcmF0ZV9odyA9IFNBU19MSU5LX1JBVEVfM18wX0dCUFM7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtOTQwLDI4ICsxMDA3LDI5IEBACiAJc3dpdGNoIChwaHlfaW5mby0+cHJvZ3JhbW1lZF9saW5rX3JhdGUgJgogCQkJTVBJX1NBU19QSFkwX1BSQVRFX01JTl9SQVRFX01BU0spIHsKIAljYXNlIE1QSV9TQVNfUEhZMF9QUkFURV9NSU5fUkFURV8xXzU6Ci0JCXBvcnQtPm1pbmltdW1fbGlua3JhdGUgPSBTQVNfTElOS19SQVRFXzFfNV9HQlBTOworCQlwaHktPm1pbmltdW1fbGlua3JhdGUgPSBTQVNfTElOS19SQVRFXzFfNV9HQlBTOwogCQlicmVhazsKIAljYXNlIE1QSV9TQVNfUEhZMF9QUkFURV9NSU5fUkFURV8zXzA6Ci0JCXBvcnQtPm1pbmltdW1fbGlua3JhdGUgPSBTQVNfTElOS19SQVRFXzNfMF9HQlBTOworCQlwaHktPm1pbmltdW1fbGlua3JhdGUgPSBTQVNfTElOS19SQVRFXzNfMF9HQlBTOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CiAKIAlpZiAobG9jYWwpCi0JCXBvcnQtPmxvY2FsX2F0dGFjaGVkID0gMTsKKwkJcGh5LT5sb2NhbF9hdHRhY2hlZCA9IDE7CiAKLQllcnJvciA9IHNhc19waHlfYWRkKHBvcnQpOworCWVycm9yID0gc2FzX3BoeV9hZGQocGh5KTsKIAlpZiAoZXJyb3IpIHsKLQkJc2FzX3BoeV9mcmVlKHBvcnQpOworCQlzYXNfcGh5X2ZyZWUocGh5KTsKIAkJcmV0dXJuIGVycm9yOwogCX0KKwlwaHlfaW5mby0+cGh5ID0gcGh5OwogCiAJaWYgKHBoeV9pbmZvLT5hdHRhY2hlZC5oYW5kbGUpIHsKIAkJc3RydWN0IHNhc19ycGh5ICpycGh5OwogCi0JCXJwaHkgPSBzYXNfcnBoeV9hbGxvYyhwb3J0KTsKKwkJcnBoeSA9IHNhc19ycGh5X2FsbG9jKHBoeSk7CiAJCWlmICghcnBoeSkKIAkJCXJldHVybiAwOyAvKiBub24tZmF0YWw6IGFuIHJwaHkgY2FuIGJlIGFkZGVkIGxhdGVyICovCiAKQEAgLTk4NSwxNiArMTA1MywxOSBAQAogCXUzMiBoYW5kbGUgPSAweEZGRkY7CiAJaW50IGVycm9yID0gLUVOT01FTSwgaTsKIAotCXBvcnRfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCpwb3J0X2luZm8pLCBHRlBfS0VSTkVMKTsKKwlwb3J0X2luZm8gPSBremFsbG9jKHNpemVvZigqcG9ydF9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwb3J0X2luZm8pCiAJCWdvdG8gb3V0OwotCW1lbXNldChwb3J0X2luZm8sIDAsIHNpemVvZigqcG9ydF9pbmZvKSk7CiAKIAllcnJvciA9IG1wdHNhc19zYXNfaW9fdW5pdF9wZzAoaW9jLCBwb3J0X2luZm8pOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfZnJlZV9wb3J0X2luZm87CiAKKwlpb2MtPm51bV9wb3J0cyA9IHBvcnRfaW5mby0+bnVtX3BoeXM7CisJbXV0ZXhfbG9jaygmaW9jLT5zYXNfdG9wb2xvZ3lfbXV0ZXgpOwogCWxpc3RfYWRkX3RhaWwoJnBvcnRfaW5mby0+bGlzdCwgJmlvYy0+c2FzX3RvcG9sb2d5KTsKKwltdXRleF91bmxvY2soJmlvYy0+c2FzX3RvcG9sb2d5X211dGV4KTsKKwogCWZvciAoaSA9IDA7IGkgPCBwb3J0X2luZm8tPm51bV9waHlzOyBpKyspIHsKIAkJbXB0c2FzX3Nhc19waHlfcGcwKGlvYywgJnBvcnRfaW5mby0+cGh5X2luZm9baV0sCiAJCQkoTVBJX1NBU19QSFlfUEdBRF9GT1JNX1BIWV9OVU1CRVIgPDwKQEAgLTEwMzQsMTAgKzExMDUsOSBAQAogCXN0cnVjdCBtcHRzYXNfcG9ydGluZm8gKnBvcnRfaW5mbywgKnA7CiAJaW50IGVycm9yID0gLUVOT01FTSwgaSwgajsKIAotCXBvcnRfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCpwb3J0X2luZm8pLCBHRlBfS0VSTkVMKTsKKwlwb3J0X2luZm8gPSBremFsbG9jKHNpemVvZigqcG9ydF9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwb3J0X2luZm8pCiAJCWdvdG8gb3V0OwotCW1lbXNldChwb3J0X2luZm8sIDAsIHNpemVvZigqcG9ydF9pbmZvKSk7CiAKIAllcnJvciA9IG1wdHNhc19zYXNfZXhwYW5kZXJfcGcwKGlvYywgcG9ydF9pbmZvLAogCQkoTVBJX1NBU19FWFBBTkRfUEdBRF9GT1JNX0dFVF9ORVhUX0hBTkRMRSA8PApAQCAtMTA0Nyw3ICsxMTE3LDEwIEBACiAKIAkqaGFuZGxlID0gcG9ydF9pbmZvLT5oYW5kbGU7CiAKKwltdXRleF9sb2NrKCZpb2MtPnNhc190b3BvbG9neV9tdXRleCk7CiAJbGlzdF9hZGRfdGFpbCgmcG9ydF9pbmZvLT5saXN0LCAmaW9jLT5zYXNfdG9wb2xvZ3kpOworCW11dGV4X3VubG9jaygmaW9jLT5zYXNfdG9wb2xvZ3lfbXV0ZXgpOworCiAJZm9yIChpID0gMDsgaSA8IHBvcnRfaW5mby0+bnVtX3BoeXM7IGkrKykgewogCQlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQ7CiAKQEAgLTEwNzksNiArMTE1Miw3IEBACiAJCSAqIEhCQSBwaHlzLgogCQkgKi8KIAkJcGFyZW50ID0gJmlvYy0+c2gtPnNob3N0X2dlbmRldjsKKwkJbXV0ZXhfbG9jaygmaW9jLT5zYXNfdG9wb2xvZ3lfbXV0ZXgpOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZpb2MtPnNhc190b3BvbG9neSwgbGlzdCkgewogCQkJZm9yIChqID0gMDsgaiA8IHAtPm51bV9waHlzOyBqKyspIHsKIAkJCQlpZiAocG9ydF9pbmZvLT5waHlfaW5mb1tpXS5pZGVudGlmeS5oYW5kbGUgPT0KQEAgLTEwODYsNiArMTE2MCw3IEBACiAJCQkJCXBhcmVudCA9ICZwLT5waHlfaW5mb1tqXS5ycGh5LT5kZXY7CiAJCQl9CiAJCX0KKwkJbXV0ZXhfdW5sb2NrKCZpb2MtPnNhc190b3BvbG9neV9tdXRleCk7CiAKIAkJbXB0c2FzX3Byb2JlX29uZV9waHkocGFyZW50LCAmcG9ydF9pbmZvLT5waHlfaW5mb1tpXSwKIAkJCQkgICAgICppbmRleCwgMCk7CkBAIC0xMTExLDYgKzExODYsMjExIEBACiAJCTsKIH0KIAorc3RhdGljIHN0cnVjdCBtcHRzYXNfcGh5aW5mbyAqCittcHRzYXNfZmluZF9waHlpbmZvX2J5X3BhcmVudChNUFRfQURBUFRFUiAqaW9jLCB1MTYgcGFyZW50X2hhbmRsZSwgdTggcGh5X2lkKQoreworCXN0cnVjdCBtcHRzYXNfcG9ydGluZm8gKnBvcnRfaW5mbzsKKwlzdHJ1Y3QgbXB0c2FzX2RldmluZm8gZGV2aWNlX2luZm87CisJc3RydWN0IG1wdHNhc19waHlpbmZvICpwaHlfaW5mbyA9IE5VTEw7CisJaW50IGksIGVycm9yOworCisJLyoKKwkgKiBSZXRyaWV2ZSB0aGUgcGFyZW50IHNhc19hZGRyZXNzCisJICovCisJZXJyb3IgPSBtcHRzYXNfc2FzX2RldmljZV9wZzAoaW9jLCAmZGV2aWNlX2luZm8sCisJCShNUElfU0FTX0RFVklDRV9QR0FEX0ZPUk1fSEFORExFIDw8CisJCSBNUElfU0FTX0RFVklDRV9QR0FEX0ZPUk1fU0hJRlQpLAorCQlwYXJlbnRfaGFuZGxlKTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKCJtcHRzYXM6IGZhaWxlZCB0byByZXRyaWV2ZSBkZXZpY2UgcGFnZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogVGhlIHBoeV9pbmZvIHN0cnVjdHVyZXMgYXJlIG5ldmVyIGRlYWxsb2NhdGVkIGR1cmluZyBsaWZldGltZSBvZgorCSAqIGEgaG9zdCwgc28gdGhlIGNvZGUgYmVsb3cgaXMgc2FmZSB3aXRob3V0IGFkZGl0aW9uYWwgcmVmY291bnRpbmcuCisJICovCisJbXV0ZXhfbG9jaygmaW9jLT5zYXNfdG9wb2xvZ3lfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydF9pbmZvLCAmaW9jLT5zYXNfdG9wb2xvZ3ksIGxpc3QpIHsKKwkJZm9yIChpID0gMDsgaSA8IHBvcnRfaW5mby0+bnVtX3BoeXM7IGkrKykgeworCQkJaWYgKHBvcnRfaW5mby0+cGh5X2luZm9baV0uaWRlbnRpZnkuc2FzX2FkZHJlc3MgPT0KKwkJCSAgICBkZXZpY2VfaW5mby5zYXNfYWRkcmVzcyAmJgorCQkJICAgIHBvcnRfaW5mby0+cGh5X2luZm9baV0ucGh5X2lkID09IHBoeV9pZCkgeworCQkJCXBoeV9pbmZvID0gJnBvcnRfaW5mby0+cGh5X2luZm9baV07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZpb2MtPnNhc190b3BvbG9neV9tdXRleCk7CisKKwlyZXR1cm4gcGh5X2luZm87Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXB0c2FzX3BoeWluZm8gKgorbXB0c2FzX2ZpbmRfcGh5aW5mb19ieV9oYW5kbGUoTVBUX0FEQVBURVIgKmlvYywgdTE2IGhhbmRsZSkKK3sKKwlzdHJ1Y3QgbXB0c2FzX3BvcnRpbmZvICpwb3J0X2luZm87CisJc3RydWN0IG1wdHNhc19waHlpbmZvICpwaHlfaW5mbyA9IE5VTEw7CisJaW50IGk7CisKKwkvKgorCSAqIFRoZSBwaHlfaW5mbyBzdHJ1Y3R1cmVzIGFyZSBuZXZlciBkZWFsbG9jYXRlZCBkdXJpbmcgbGlmZXRpbWUgb2YKKwkgKiBhIGhvc3QsIHNvIHRoZSBjb2RlIGJlbG93IGlzIHNhZmUgd2l0aG91dCBhZGRpdGlvbmFsIHJlZmNvdW50aW5nLgorCSAqLworCW11dGV4X2xvY2soJmlvYy0+c2FzX3RvcG9sb2d5X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnRfaW5mbywgJmlvYy0+c2FzX3RvcG9sb2d5LCBsaXN0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBwb3J0X2luZm8tPm51bV9waHlzOyBpKyspIHsKKwkJCWlmIChwb3J0X2luZm8tPnBoeV9pbmZvW2ldLmF0dGFjaGVkLmhhbmRsZSA9PSBoYW5kbGUpIHsKKwkJCQlwaHlfaW5mbyA9ICZwb3J0X2luZm8tPnBoeV9pbmZvW2ldOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCW11dGV4X3VubG9jaygmaW9jLT5zYXNfdG9wb2xvZ3lfbXV0ZXgpOworCisJcmV0dXJuIHBoeV9pbmZvOworfQorCitzdGF0aWMgdm9pZAorbXB0c2FzX2hvdHBsdWdfd29yayh2b2lkICphcmcpCit7CisJc3RydWN0IG1wdHNhc19ob3RwbHVnX2V2ZW50ICpldiA9IGFyZzsKKwlNUFRfQURBUFRFUiAqaW9jID0gZXYtPmlvYzsKKwlzdHJ1Y3QgbXB0c2FzX3BoeWluZm8gKnBoeV9pbmZvOworCXN0cnVjdCBzYXNfcnBoeSAqcnBoeTsKKwljaGFyICpkcyA9IE5VTEw7CisKKwlpZiAoZXYtPmRldmljZV9pbmZvICYgTVBJX1NBU19ERVZJQ0VfSU5GT19TU1BfVEFSR0VUKQorCQlkcyA9ICJzc3AiOworCWlmIChldi0+ZGV2aWNlX2luZm8gJiBNUElfU0FTX0RFVklDRV9JTkZPX1NUUF9UQVJHRVQpCisJCWRzID0gInN0cCI7CisJaWYgKGV2LT5kZXZpY2VfaW5mbyAmIE1QSV9TQVNfREVWSUNFX0lORk9fU0FUQV9ERVZJQ0UpCisJCWRzID0gInNhdGEiOworCisJc3dpdGNoIChldi0+ZXZlbnRfdHlwZSkgeworCWNhc2UgTVBUU0FTX0RFTF9ERVZJQ0U6CisJCXByaW50ayhNWUlPQ19zX0lORk9fRk1UCisJCSAgICAgICAicmVtb3ZpbmcgJXMgZGV2aWNlLCBjaGFubmVsICVkLCBpZCAlZCwgcGh5ICVkXG4iLAorCQkgICAgICAgaW9jLT5uYW1lLCBkcywgZXYtPmNoYW5uZWwsIGV2LT5pZCwgZXYtPnBoeV9pZCk7CisKKwkJcGh5X2luZm8gPSBtcHRzYXNfZmluZF9waHlpbmZvX2J5X2hhbmRsZShpb2MsIGV2LT5oYW5kbGUpOworCQlpZiAoIXBoeV9pbmZvKSB7CisJCQlwcmludGsoIm1wdHNhczogcmVtb3ZlIGV2ZW50IGZvciBub24tZXhpc3RhbnQgUEhZLlxuIik7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChwaHlfaW5mby0+cnBoeSkgeworCQkJc2FzX3JwaHlfZGVsZXRlKHBoeV9pbmZvLT5ycGh5KTsKKwkJCXBoeV9pbmZvLT5ycGh5ID0gTlVMTDsKKwkJfQorCQlicmVhazsKKwljYXNlIE1QVFNBU19BRERfREVWSUNFOgorCQlwcmludGsoTVlJT0Nfc19JTkZPX0ZNVAorCQkgICAgICAgImF0dGFjaGluZyAlcyBkZXZpY2UsIGNoYW5uZWwgJWQsIGlkICVkLCBwaHkgJWRcbiIsCisJCSAgICAgICBpb2MtPm5hbWUsIGRzLCBldi0+Y2hhbm5lbCwgZXYtPmlkLCBldi0+cGh5X2lkKTsKKworCQlwaHlfaW5mbyA9IG1wdHNhc19maW5kX3BoeWluZm9fYnlfcGFyZW50KGlvYywKKwkJCQlldi0+cGFyZW50X2hhbmRsZSwgZXYtPnBoeV9pZCk7CisJCWlmICghcGh5X2luZm8pIHsKKwkJCXByaW50aygibXB0c2FzOiBhZGQgZXZlbnQgZm9yIG5vbi1leGlzdGFudCBQSFkuXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHBoeV9pbmZvLT5ycGh5KSB7CisJCQlwcmludGsoIm1wdHNhczogdHJ5aW5nIHRvIGFkZCBleGlzdGluZyBkZXZpY2UuXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogZmlsbCBhdHRhY2hlZCBpbmZvICovCisJCXBoeV9pbmZvLT5hdHRhY2hlZC5oYW5kbGUgPSBldi0+aGFuZGxlOworCQlwaHlfaW5mby0+YXR0YWNoZWQucGh5X2lkID0gZXYtPnBoeV9pZDsKKwkJcGh5X2luZm8tPmF0dGFjaGVkLnBvcnRfaWQgPSBwaHlfaW5mby0+aWRlbnRpZnkucG9ydF9pZDsKKwkJcGh5X2luZm8tPmF0dGFjaGVkLmlkID0gZXYtPmlkOworCQlwaHlfaW5mby0+YXR0YWNoZWQuY2hhbm5lbCA9IGV2LT5jaGFubmVsOworCQlwaHlfaW5mby0+YXR0YWNoZWQuc2FzX2FkZHJlc3MgPSBldi0+c2FzX2FkZHJlc3M7CisJCXBoeV9pbmZvLT5hdHRhY2hlZC5kZXZpY2VfaW5mbyA9IGV2LT5kZXZpY2VfaW5mbzsKKworCQlycGh5ID0gc2FzX3JwaHlfYWxsb2MocGh5X2luZm8tPnBoeSk7CisJCWlmICghcnBoeSkKKwkJCWJyZWFrOyAvKiBub24tZmF0YWw6IGFuIHJwaHkgY2FuIGJlIGFkZGVkIGxhdGVyICovCisKKwkJbXB0c2FzX3BhcnNlX2RldmljZV9pbmZvKCZycGh5LT5pZGVudGlmeSwgJnBoeV9pbmZvLT5hdHRhY2hlZCk7CisJCWlmIChzYXNfcnBoeV9hZGQocnBoeSkpIHsKKwkJCXNhc19ycGh5X2ZyZWUocnBoeSk7CisJCQlicmVhazsKKwkJfQorCisJCXBoeV9pbmZvLT5ycGh5ID0gcnBoeTsKKwkJYnJlYWs7CisJfQorCisJa2ZyZWUoZXYpOworfQorCitzdGF0aWMgdm9pZAorbXB0c2NzaWhfc2VuZF9zYXNfZXZlbnQoTVBUX0FEQVBURVIgKmlvYywKKwkJRVZFTlRfREFUQV9TQVNfREVWSUNFX1NUQVRVU19DSEFOR0UgKnNhc19ldmVudF9kYXRhKQoreworCXN0cnVjdCBtcHRzYXNfaG90cGx1Z19ldmVudCAqZXY7CisJdTMyIGRldmljZV9pbmZvID0gbGUzMl90b19jcHUoc2FzX2V2ZW50X2RhdGEtPkRldmljZUluZm8pOworCV9fbGU2NCBzYXNfYWRkcmVzczsKKworCWlmICgoZGV2aWNlX2luZm8gJgorCSAgICAgKE1QSV9TQVNfREVWSUNFX0lORk9fU1NQX1RBUkdFVCB8CisJICAgICAgTVBJX1NBU19ERVZJQ0VfSU5GT19TVFBfVEFSR0VUIHwKKwkgICAgICBNUElfU0FTX0RFVklDRV9JTkZPX1NBVEFfREVWSUNFICkpID09IDApCisJCXJldHVybjsKKworCWlmICgoc2FzX2V2ZW50X2RhdGEtPlJlYXNvbkNvZGUgJgorCSAgICAgKE1QSV9FVkVOVF9TQVNfREVWX1NUQVRfUkNfQURERUQgfAorCSAgICAgIE1QSV9FVkVOVF9TQVNfREVWX1NUQVRfUkNfTk9UX1JFU1BPTkRJTkcpKSA9PSAwKQorCQlyZXR1cm47CisKKwlldiA9IGttYWxsb2Moc2l6ZW9mKCpldiksIEdGUF9BVE9NSUMpOworCWlmICghZXYpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibXB0c2FzOiBsb3N0IGhvdHBsdWcgZXZlbnRcbiIpOworCQlyZXR1cm47CisJfQorCisKKwlJTklUX1dPUksoJmV2LT53b3JrLCBtcHRzYXNfaG90cGx1Z193b3JrLCBldik7CisJZXYtPmlvYyA9IGlvYzsKKwlldi0+aGFuZGxlID0gbGUxNl90b19jcHUoc2FzX2V2ZW50X2RhdGEtPkRldkhhbmRsZSk7CisJZXYtPnBhcmVudF9oYW5kbGUgPSBsZTE2X3RvX2NwdShzYXNfZXZlbnRfZGF0YS0+UGFyZW50RGV2SGFuZGxlKTsKKwlldi0+Y2hhbm5lbCA9IHNhc19ldmVudF9kYXRhLT5CdXM7CisJZXYtPmlkID0gc2FzX2V2ZW50X2RhdGEtPlRhcmdldElEOworCWV2LT5waHlfaWQgPSBzYXNfZXZlbnRfZGF0YS0+UGh5TnVtOworCW1lbWNweSgmc2FzX2FkZHJlc3MsICZzYXNfZXZlbnRfZGF0YS0+U0FTQWRkcmVzcywgc2l6ZW9mKF9fbGU2NCkpOworCWV2LT5zYXNfYWRkcmVzcyA9IGxlNjRfdG9fY3B1KHNhc19hZGRyZXNzKTsKKwlldi0+ZGV2aWNlX2luZm8gPSBkZXZpY2VfaW5mbzsKKworCWlmIChzYXNfZXZlbnRfZGF0YS0+UmVhc29uQ29kZSAmIE1QSV9FVkVOVF9TQVNfREVWX1NUQVRfUkNfQURERUQpCisJCWV2LT5ldmVudF90eXBlID0gTVBUU0FTX0FERF9ERVZJQ0U7CisJZWxzZQorCQlldi0+ZXZlbnRfdHlwZSA9IE1QVFNBU19ERUxfREVWSUNFOworCisJc2NoZWR1bGVfd29yaygmZXYtPndvcmspOworfQorCitzdGF0aWMgaW50CittcHRzYXNfZXZlbnRfcHJvY2VzcyhNUFRfQURBUFRFUiAqaW9jLCBFdmVudE5vdGlmaWNhdGlvblJlcGx5X3QgKnJlcGx5KQoreworCXU4IGV2ZW50ID0gbGUzMl90b19jcHUocmVwbHktPkV2ZW50KSAmIDB4RkY7CisKKwlpZiAoIWlvYy0+c2gpCisJCXJldHVybiAxOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTVBJX0VWRU5UX1NBU19ERVZJQ0VfU1RBVFVTX0NIQU5HRToKKwkJbXB0c2NzaWhfc2VuZF9zYXNfZXZlbnQoaW9jLAorCQkJKEVWRU5UX0RBVEFfU0FTX0RFVklDRV9TVEFUVVNfQ0hBTkdFICopcmVwbHktPkRhdGEpOworCQlyZXR1cm4gMTsJCS8qIGN1cnJlbnRseSBtZWFucyBub3RoaW5nIHJlYWxseSAqLworCisJZGVmYXVsdDoKKwkJcmV0dXJuIG1wdHNjc2loX2V2ZW50X3Byb2Nlc3MoaW9jLCByZXBseSk7CisJfQorfQorCiBzdGF0aWMgaW50CiBtcHRzYXNfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKQEAgLTExMTgsMTEgKzEzOTgsMTAgQEAKIAlNUFRfU0NTSV9IT1NUCQkqaGQ7CiAJTVBUX0FEQVBURVIgCQkqaW9jOwogCXVuc2lnbmVkIGxvbmcJCSBmbGFnczsKLQlpbnQJCQkgc3osIGlpOworCWludAkJCSBpaTsKIAlpbnQJCQkgbnVtU0dFID0gMDsKIAlpbnQJCQkgc2NhbGU7CiAJaW50CQkJIGlvY19jYXA7Ci0JdTgJCQkqbWVtOwogCWludAkJCWVycm9yPTA7CiAJaW50CQkJcjsKIApAQCAtMTIwMyw3ICsxNDgyLDkgQEAKIAlzaC0+dW5pcXVlX2lkID0gaW9jLT5pZDsKIAogCUlOSVRfTElTVF9IRUFEKCZpb2MtPnNhc190b3BvbG9neSk7Ci0JaW5pdF9NVVRFWCgmaW9jLT5zYXNfbWdtdC5tdXRleCk7CisJbXV0ZXhfaW5pdCgmaW9jLT5zYXNfdG9wb2xvZ3lfbXV0ZXgpOworCisJbXV0ZXhfaW5pdCgmaW9jLT5zYXNfbWdtdC5tdXRleCk7CiAJaW5pdF9jb21wbGV0aW9uKCZpb2MtPnNhc19tZ210LmRvbmUpOwogCiAJLyogVmVyaWZ5IHRoYXQgd2Ugd29uJ3QgZXhjZWVkIHRoZSBtYXhpbXVtCkBAIC0xMjQ0LDM2ICsxNTI1LDI3IEBACiAJLyogU0NTSSBuZWVkcyBzY3NpX2NtbmQgbG9va3VwIHRhYmxlIQogCSAqICh3aXRoIHNpemUgZXF1YWwgdG8gcmVxX2RlcHRoKlB0clN6ISkKIAkgKi8KLQlzeiA9IGlvYy0+cmVxX2RlcHRoICogc2l6ZW9mKHZvaWQgKik7Ci0JbWVtID0ga21hbGxvYyhzeiwgR0ZQX0FUT01JQyk7Ci0JaWYgKG1lbSA9PSBOVUxMKSB7CisJaGQtPlNjc2lMb29rdXAgPSBrY2FsbG9jKGlvYy0+cmVxX2RlcHRoLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFoZC0+U2NzaUxvb2t1cCkgewogCQllcnJvciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X21wdHNhc19wcm9iZTsKIAl9CiAKLQltZW1zZXQobWVtLCAwLCBzeik7Ci0JaGQtPlNjc2lMb29rdXAgPSAoc3RydWN0IHNjc2lfY21uZCAqKikgbWVtOwotCi0JZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2NzaUxvb2t1cCBAICVwLCBzej0lZFxuIiwKLQkJIGlvYy0+bmFtZSwgaGQtPlNjc2lMb29rdXAsIHN6KSk7CisJZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2NzaUxvb2t1cCBAICVwXG4iLAorCQkgaW9jLT5uYW1lLCBoZC0+U2NzaUxvb2t1cCkpOwogCiAJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZGV2aWNlIHN0cnVjdHVyZXMuCiAJICogQSBub24tTnVsbCBwb2ludGVyIGF0IGFuIG9mZnNldAogCSAqIGluZGljYXRlcyBhIGRldmljZSBleGlzdHMuCiAJICogbWF4X2lkID0gMSArIG1heGltdW0gaWQgKGhvc3RzLmgpCiAJICovCi0Jc3ogPSBzaC0+bWF4X2lkICogc2l6ZW9mKHZvaWQgKik7Ci0JbWVtID0ga21hbGxvYyhzeiwgR0ZQX0FUT01JQyk7Ci0JaWYgKG1lbSA9PSBOVUxMKSB7CisJaGQtPlRhcmdldHMgPSBrY2FsbG9jKHNoLT5tYXhfaWQsIHNpemVvZih2b2lkICopLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWhkLT5UYXJnZXRzKSB7CiAJCWVycm9yID0gLUVOT01FTTsKIAkJZ290byBvdXRfbXB0c2FzX3Byb2JlOwogCX0KIAotCW1lbXNldChtZW0sIDAsIHN6KTsKLQloZC0+VGFyZ2V0cyA9IChWaXJ0VGFyZ2V0ICoqKSBtZW07Ci0KLQlkcHJpbnRrKChLRVJOX0lORk8KLQkgICIgIHZ0YXJnZXQgQCAlcCwgc3o9JWRcbiIsIGhkLT5UYXJnZXRzLCBzeikpOworCWRwcmludGsoKEtFUk5fSU5GTyAiICB2dGFyZ2V0IEAgJXBcbiIsIGhkLT5UYXJnZXRzKSk7CiAKIAkvKiBDbGVhciB0aGUgVE0gZmxhZ3MKIAkgKi8KQEAgLTEzMjQsNiArMTU5NiwyMCBAQAogCiAJbXB0c2FzX3NjYW5fc2FzX3RvcG9sb2d5KGlvYyk7CiAKKwkvKgorCSAgUmVwb3J0aW5nIFJBSUQgdm9sdW1lcy4KKwkqLworCWlmICghaW9jLT5yYWlkX2RhdGEucElvY1BnMikKKwkJcmV0dXJuIDA7CisJaWYgKCFpb2MtPnJhaWRfZGF0YS5wSW9jUGcyLT5OdW1BY3RpdmVWb2x1bWVzKQorCQlyZXR1cm4gMDsKKwlmb3IgKGlpPTA7aWk8aW9jLT5yYWlkX2RhdGEucElvY1BnMi0+TnVtQWN0aXZlVm9sdW1lcztpaSsrKSB7CisJCXNjc2lfYWRkX2RldmljZShzaCwKKwkJCWlvYy0+bnVtX3BvcnRzLAorCQkJaW9jLT5yYWlkX2RhdGEucElvY1BnMi0+UmFpZFZvbHVtZVtpaV0uVm9sdW1lSUQsCisJCQkwKTsKKwl9CisKIAlyZXR1cm4gMDsKIAogb3V0X21wdHNhc19wcm9iZToKQEAgLTEzMzksMTAgKzE2MjUsMTIgQEAKIAogCXNhc19yZW1vdmVfaG9zdChpb2MtPnNoKTsKIAorCW11dGV4X2xvY2soJmlvYy0+c2FzX3RvcG9sb2d5X211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocCwgbiwgJmlvYy0+c2FzX3RvcG9sb2d5LCBsaXN0KSB7CiAJCWxpc3RfZGVsKCZwLT5saXN0KTsKIAkJa2ZyZWUocCk7CiAJfQorCW11dGV4X3VubG9jaygmaW9jLT5zYXNfdG9wb2xvZ3lfbXV0ZXgpOwogCiAJbXB0c2NzaWhfcmVtb3ZlKHBkZXYpOwogfQpAQCAtMTM5Myw3ICsxNjgxLDcgQEAKIAkJbXB0X3JlZ2lzdGVyKG1wdHNjc2loX3NjYW5kdl9jb21wbGV0ZSwgTVBUU0FTX0RSSVZFUik7CiAJbXB0c2FzTWdtdEN0eCA9IG1wdF9yZWdpc3RlcihtcHRzYXNfbWdtdF9kb25lLCBNUFRTQVNfRFJJVkVSKTsKIAotCWlmIChtcHRfZXZlbnRfcmVnaXN0ZXIobXB0c2FzRG9uZUN0eCwgbXB0c2NzaWhfZXZlbnRfcHJvY2VzcykgPT0gMCkgeworCWlmIChtcHRfZXZlbnRfcmVnaXN0ZXIobXB0c2FzRG9uZUN0eCwgbXB0c2FzX2V2ZW50X3Byb2Nlc3MpID09IDApIHsKIAkJZGV2dHByaW50aygoS0VSTl9JTkZPIE1ZTkFNCiAJCSAgIjogUmVnaXN0ZXJlZCBmb3IgSU9DIGV2ZW50IG5vdGlmaWNhdGlvbnNcbiIpKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMKaW5kZXggOTNhMTZmYS4uY2RhYzU1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYwpAQCAtODkzLDYgKzg5Myw3IEBACiAgKgkJd2hlbiBhIGx1biBpcyBkaXNhYmxlIGJ5IG1pZC1sYXllci4KICAqCQlEbyBOT1QgYWNjZXNzIHRoZSByZWZlcmVuY2VkIHNjc2lfY21uZCBzdHJ1Y3R1cmUgb3IKICAqCQltZW1iZXJzLiBXaWxsIGNhdXNlIGVpdGhlciBhIHBhZ2luZyBvciBOVUxMIHB0ciBlcnJvci4KKyAqCQkoQlVULCBCVVQsIEJVVCwgdGhlIGNvZGUgZG9lcyByZWZlcmVuY2UgaXQhIC0gbWRyKQogICogICAgICBAaGQ6IFBvaW50ZXIgdG8gYSBTQ1NJIEhPU1Qgc3RydWN0dXJlCiAgKglAdmRldmljZTogcGVyIGRldmljZSBwcml2YXRlIGRhdGEKICAqCkBAIC0yMTYyLDEwICsyMTYzLDkgQEAKIHsKIAlWaXJ0VGFyZ2V0CQkqdnRhcmdldDsKIAotCXZ0YXJnZXQgPSBrbWFsbG9jKHNpemVvZihWaXJ0VGFyZ2V0KSwgR0ZQX0tFUk5FTCk7CisJdnRhcmdldCA9IGt6YWxsb2Moc2l6ZW9mKFZpcnRUYXJnZXQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXZ0YXJnZXQpCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbXNldCh2dGFyZ2V0LCAwLCBzaXplb2YoVmlydFRhcmdldCkpOwogCXN0YXJnZXQtPmhvc3RkYXRhID0gdnRhcmdldDsKIAlyZXR1cm4gMDsKIH0KQEAgLTIxODUsMTQgKzIxODUsMTMgQEAKIAlWaXJ0RGV2aWNlCQkqdmRldjsKIAlzdHJ1Y3Qgc2NzaV90YXJnZXQgCSpzdGFyZ2V0OwogCi0JdmRldiA9IGttYWxsb2Moc2l6ZW9mKFZpcnREZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwl2ZGV2ID0ga3phbGxvYyhzaXplb2YoVmlydERldmljZSksIEdGUF9LRVJORUwpOwogCWlmICghdmRldikgewogCQlwcmludGsoTVlJT0Nfc19FUlJfRk1UICJzbGF2ZV9hbGxvYyBrbWFsbG9jKCV6ZCkgRkFJTEVEIVxuIiwKIAkJCQloZC0+aW9jLT5uYW1lLCBzaXplb2YoVmlydERldmljZSkpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQltZW1zZXQodmRldiwgMCwgc2l6ZW9mKFZpcnREZXZpY2UpKTsKIAl2ZGV2LT5pb2NfaWQgPSBoZC0+aW9jLT5pZDsKIAl2ZGV2LT50YXJnZXRfaWQgPSBzZGV2LT5pZDsKIAl2ZGV2LT5idXNfaWQgPSBzZGV2LT5jaGFubmVsOwpAQCAtMjU1OSwxMyArMjU1OCwyNSBAQAogCQkJaGQtPmNtZFB0ciA9IE5VTEw7CiAJCX0KIAotCQkvKiA3LiBTZXQgZmxhZyB0byBmb3JjZSBEViBhbmQgcmUtcmVhZCBJT0MgUGFnZSAzCisJCS8qIDcuIFNQSTogU2V0IGZsYWcgdG8gZm9yY2UgRFYgYW5kIHJlLXJlYWQgSU9DIFBhZ2UgMwogCQkgKi8KIAkJaWYgKGlvYy0+YnVzX3R5cGUgPT0gU1BJKSB7CiAJCQlpb2MtPnNwaV9kYXRhLmZvcmNlRHYgPSBNUFRfU0NTSUNGR19ORUVEX0RWIHwgTVBUX1NDU0lDRkdfUkVMT0FEX0lPQ19QRzM7CiAJCQlkZHZ0cHJpbnRrKCgiU2V0IHJlbG9hZCBJT0MgUGczIEZsYWdcbiIpKTsKIAkJfQogCisJCS8qIDcuIEZDOiBSZXNjYW4gZm9yIGJsb2NrZWQgcnBvcnRzIHdoaWNoIG1pZ2h0IGhhdmUgcmV0dXJuZWQuCisJCSAqLworCQllbHNlIGlmIChpb2MtPmJ1c190eXBlID09IEZDKSB7CisJCQlpbnQgd29ya19jb3VudDsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPmZjX3Jlc2Nhbl93b3JrX2xvY2ssIGZsYWdzKTsKKwkJCXdvcmtfY291bnQgPSArK2lvYy0+ZmNfcmVzY2FuX3dvcmtfY291bnQ7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPmZjX3Jlc2Nhbl93b3JrX2xvY2ssIGZsYWdzKTsKKwkJCWlmICh3b3JrX2NvdW50ID09IDEpCisJCQkJc2NoZWR1bGVfd29yaygmaW9jLT5mY19yZXNjYW5fd29yayk7CisJCX0KIAkJZHRtcHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJQb3N0LVJlc2V0IGNvbXBsZXRlLlxuIiwgaW9jLT5uYW1lKSk7CiAKIAl9CkBAIC0yNTg5LDYgKzI2MDAsOCBAQAogewogCU1QVF9TQ1NJX0hPU1QgKmhkOwogCXU4IGV2ZW50ID0gbGUzMl90b19jcHUocEV2UmVwbHktPkV2ZW50KSAmIDB4RkY7CisJaW50IHdvcmtfY291bnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWRldnRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIk1QVCBldmVudCAoPSUwMlhoKSByb3V0ZWQgdG8gU0NTSSBob3N0IGRyaXZlciFcbiIsCiAJCQlpb2MtPm5hbWUsIGV2ZW50KSk7CkBAIC0yNjEwLDExICsyNjIzLDE4IEBACiAJCS8qIEZJWE1FISAqLwogCQlicmVhazsKIAorCWNhc2UgTVBJX0VWRU5UX1JFU0NBTjoJCQkJLyogMDYgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+ZmNfcmVzY2FuX3dvcmtfbG9jaywgZmxhZ3MpOworCQl3b3JrX2NvdW50ID0gKytpb2MtPmZjX3Jlc2Nhbl93b3JrX2NvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPmZjX3Jlc2Nhbl93b3JrX2xvY2ssIGZsYWdzKTsKKwkJaWYgKHdvcmtfY291bnQgPT0gMSkKKwkJCXNjaGVkdWxlX3dvcmsoJmlvYy0+ZmNfcmVzY2FuX3dvcmspOworCQlicmVhazsKKwogCQkvKgogCQkgKiAgQ0hFQ0tNRSEgRG9uJ3QgdGhpbmsgd2UgbmVlZCB0byBkbwogCQkgKiAgYW55dGhpbmcgZm9yIHRoZXNlLCBidXQuLi4KIAkJICovCi0JY2FzZSBNUElfRVZFTlRfUkVTQ0FOOgkJCQkvKiAwNiAqLwogCWNhc2UgTVBJX0VWRU5UX0xJTktfU1RBVFVTX0NIQU5HRToJCS8qIDA3ICovCiAJY2FzZSBNUElfRVZFTlRfTE9PUF9TVEFURV9DSEFOR0U6CQkvKiAwOCAqLwogCQkvKgpAQCAtMzk1NCw4ICszOTc0LDYgQEAKIAogLyogU2VhcmNoIElPQyBwYWdlIDMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgaGlkZGVuIHBoeXNpY2FsIGRpc2sKICAqLwotLyogU2VhcmNoIElPQyBwYWdlIDMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgaGlkZGVuIHBoeXNpY2FsIGRpc2sKLSAqLwogc3RhdGljIGludAogbXB0c2NzaWhfaXNfcGh5c19kaXNrKE1QVF9BREFQVEVSICppb2MsIGludCBpZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c3BpLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNwaS5jCmluZGV4IGNlMzMyYTYuLjdkY2UyOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c3BpLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzcGkuYwpAQCAtMTU4LDExICsxNTgsMTAgQEAKIAlNUFRfU0NTSV9IT1NUCQkqaGQ7CiAJTVBUX0FEQVBURVIgCQkqaW9jOwogCXVuc2lnbmVkIGxvbmcJCSBmbGFnczsKLQlpbnQJCQkgc3osIGlpOworCWludAkJCSBpaTsKIAlpbnQJCQkgbnVtU0dFID0gMDsKIAlpbnQJCQkgc2NhbGU7CiAJaW50CQkJIGlvY19jYXA7Ci0JdTgJCQkqbWVtOwogCWludAkJCWVycm9yPTA7CiAJaW50CQkJcjsKIApAQCAtMjg4LDM2ICsyODcsMjcgQEAKIAkvKiBTQ1NJIG5lZWRzIHNjc2lfY21uZCBsb29rdXAgdGFibGUhCiAJICogKHdpdGggc2l6ZSBlcXVhbCB0byByZXFfZGVwdGgqUHRyU3ohKQogCSAqLwotCXN6ID0gaW9jLT5yZXFfZGVwdGggKiBzaXplb2Yodm9pZCAqKTsKLQltZW0gPSBrbWFsbG9jKHN6LCBHRlBfQVRPTUlDKTsKLQlpZiAobWVtID09IE5VTEwpIHsKKwloZC0+U2NzaUxvb2t1cCA9IGtjYWxsb2MoaW9jLT5yZXFfZGVwdGgsIHNpemVvZih2b2lkICopLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWhkLT5TY3NpTG9va3VwKSB7CiAJCWVycm9yID0gLUVOT01FTTsKIAkJZ290byBvdXRfbXB0c3BpX3Byb2JlOwogCX0KIAotCW1lbXNldChtZW0sIDAsIHN6KTsKLQloZC0+U2NzaUxvb2t1cCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICoqKSBtZW07Ci0KLQlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJTY3NpTG9va3VwIEAgJXAsIHN6PSVkXG4iLAotCQkgaW9jLT5uYW1lLCBoZC0+U2NzaUxvb2t1cCwgc3opKTsKKwlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJTY3NpTG9va3VwIEAgJXBcbiIsCisJCSBpb2MtPm5hbWUsIGhkLT5TY3NpTG9va3VwKSk7CiAKIAkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBkZXZpY2Ugc3RydWN0dXJlcy4KIAkgKiBBIG5vbi1OdWxsIHBvaW50ZXIgYXQgYW4gb2Zmc2V0CiAJICogaW5kaWNhdGVzIGEgZGV2aWNlIGV4aXN0cy4KIAkgKiBtYXhfaWQgPSAxICsgbWF4aW11bSBpZCAoaG9zdHMuaCkKIAkgKi8KLQlzeiA9IHNoLT5tYXhfaWQgKiBzaXplb2Yodm9pZCAqKTsKLQltZW0gPSBrbWFsbG9jKHN6LCBHRlBfQVRPTUlDKTsKLQlpZiAobWVtID09IE5VTEwpIHsKKwloZC0+VGFyZ2V0cyA9IGtjYWxsb2Moc2gtPm1heF9pZCwgc2l6ZW9mKHZvaWQgKiksIEdGUF9BVE9NSUMpOworCWlmICghaGQtPlRhcmdldHMpIHsKIAkJZXJyb3IgPSAtRU5PTUVNOwogCQlnb3RvIG91dF9tcHRzcGlfcHJvYmU7CiAJfQogCi0JbWVtc2V0KG1lbSwgMCwgc3opOwotCWhkLT5UYXJnZXRzID0gKFZpcnRUYXJnZXQgKiopIG1lbTsKLQotCWRwcmludGsoKEtFUk5fSU5GTwotCSAgIiAgdmRldiBAICVwLCBzej0lZFxuIiwgaGQtPlRhcmdldHMsIHN6KSk7CisJZHByaW50aygoS0VSTl9JTkZPICIgIHZkZXYgQCAlcFxuIiwgaGQtPlRhcmdldHMpKTsKIAogCS8qIENsZWFyIHRoZSBUTSBmbGFncwogCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9SRUFETUUuaW9jdGwgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL1JFQURNRS5pb2N0bAppbmRleCA3M2RkMDg0Li42NWMwYzQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL1JFQURNRS5pb2N0bAorKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL1JFQURNRS5pb2N0bApAQCAtMTg1LDcgKzE4NSw3IEBACiAgICAgICBFTk9NRU0gICAgICBLZXJuZWwgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IKIAogICAgQSByZXR1cm4gdmFsdWUgb2YgMCBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIHZhbHVlIHdhcyBhY3R1YWxseQotICAgcHJvcGVybHkgcmV0cmVpdmVkLiAgVGhlIHVzZXIgc2hvdWxkIGNoZWNrIHRoZSByZXN1bHQgbGlzdCAKKyAgIHByb3Blcmx5IHJldHJpZXZlZC4gIFRoZSB1c2VyIHNob3VsZCBjaGVjayB0aGUgcmVzdWx0IGxpc3QgCiAgICB0byBkZXRlcm1pbmUgdGhlIHNwZWNpZmljIHN0YXR1cyBvZiB0aGUgdHJhbnNhY3Rpb24uCiAKIFZJSUkuIERvd25sb2FkaW5nIFNvZnR3YXJlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fYmxvY2suYwppbmRleCA1YjFmZWJlLi5iMDlmYjYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmMKQEAgLTY2Miw2ICs2NjIsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBpMm9fYmxvY2tfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKQoreworCWkyb19ibG9ja19iaW9zcGFyYW0oZ2V0X2NhcGFjaXR5KGJkZXYtPmJkX2Rpc2spLAorCQkJICAgICZnZW8tPmN5bGluZGVycywgJmdlby0+aGVhZHMsICZnZW8tPnNlY3RvcnMpOworCXJldHVybiAwOworfQorCiAvKioKICAqCWkyb19ibG9ja19pb2N0bCAtIElzc3VlIGRldmljZSBzcGVjaWZpYyBpb2N0bCBjYWxscy4KICAqCUBjbWQ6IGlvY3RsIGNvbW1hbmQKQEAgLTY3Niw3ICs2ODMsNiBAQAogewogCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzazsKIAlzdHJ1Y3QgaTJvX2Jsb2NrX2RldmljZSAqZGV2ID0gZGlzay0+cHJpdmF0ZV9kYXRhOwotCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCiAJLyogQW55b25lIGNhcGFibGUgb2YgdGhpcyBzeXNjYWxsIGNhbiBkbyAqcmVhbCBiYWQqIHRoaW5ncyAqLwogCkBAIC02ODQsMTUgKzY5MCw2IEBACiAJCXJldHVybiAtRVBFUk07CiAKIAlzd2l0Y2ggKGNtZCkgewotCWNhc2UgSERJT19HRVRHRU86Ci0JCXsKLQkJCXN0cnVjdCBoZF9nZW9tZXRyeSBnOwotCQkJaTJvX2Jsb2NrX2Jpb3NwYXJhbShnZXRfY2FwYWNpdHkoZGlzayksCi0JCQkJCSAgICAmZy5jeWxpbmRlcnMsICZnLmhlYWRzLCAmZy5zZWN0b3JzKTsKLQkJCWcuc3RhcnQgPSBnZXRfc3RhcnRfc2VjdChpbm9kZS0+aV9iZGV2KTsKLQkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmcsIHNpemVvZihnKSkgPyAtRUZBVUxUIDogMDsKLQkJfQotCiAJY2FzZSBCTEtJMk9HUlNUUkFUOgogCQlyZXR1cm4gcHV0X3VzZXIoZGV2LT5yY2FjaGUsIChpbnQgX191c2VyICopYXJnKTsKIAljYXNlIEJMS0kyT0dXU1RSQVQ6CkBAIC05NjIsNiArOTU5LDcgQEAKIAkub3BlbiA9IGkyb19ibG9ja19vcGVuLAogCS5yZWxlYXNlID0gaTJvX2Jsb2NrX3JlbGVhc2UsCiAJLmlvY3RsID0gaTJvX2Jsb2NrX2lvY3RsLAorCS5nZXRnZW8gPSBpMm9fYmxvY2tfZ2V0Z2VvLAogCS5tZWRpYV9jaGFuZ2VkID0gaTJvX2Jsb2NrX21lZGlhX2NoYW5nZWQKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vcGNpLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL3BjaS5jCmluZGV4IGM1YjY1NmMuLmQ2OThkNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vcGNpLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9wY2kuYwpAQCAtODgsMTEgKzg4LDYgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwogCWludCBpOwogCi0JaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgT1NNX0RFU0NSSVBUSU9OKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkZXZpY2UgYWxyZWFkeSBjbGFpbWVkXG4iLCBjLT5uYW1lKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCiAJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewogCQkvKiBTa2lwIEkvTyBzcGFjZXMgKi8KIAkJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIGkpICYgSU9SRVNPVVJDRV9JTykpIHsKQEAgLTMxOSw2ICszMTQsMTEgQEAKIAkJcmV0dXJuIHJjOwogCX0KIAorCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIE9TTV9ERVNDUklQVElPTikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpMm86IGRldmljZSBhbHJlYWR5IGNsYWltZWRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKIAlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiaTJvOiBubyBzdWl0YWJsZSBETUEgZm91bmQgZm9yICVzXG4iLAogCQkgICAgICAgcGNpX25hbWUocGRldikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvbWNwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL21jcC1jb3JlLmMKaW5kZXggNTViYTIzMC4uNzVmNDAxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvbWNwLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC9tY3AtY29yZS5jCkBAIC03Nyw2ICs3Nyw4IEBACiBzdGF0aWMgc3RydWN0IGJ1c190eXBlIG1jcF9idXNfdHlwZSA9IHsKIAkubmFtZQkJPSAibWNwIiwKIAkubWF0Y2gJCT0gbWNwX2J1c19tYXRjaCwKKwkucHJvYmUJCT0gbWNwX2J1c19wcm9iZSwKKwkucmVtb3ZlCQk9IG1jcF9idXNfcmVtb3ZlLAogCS5zdXNwZW5kCT0gbWNwX2J1c19zdXNwZW5kLAogCS5yZXN1bWUJCT0gbWNwX2J1c19yZXN1bWUsCiB9OwpAQCAtMjI3LDggKzIyOSw2IEBACiBpbnQgbWNwX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgbWNwX2RyaXZlciAqbWNwZHJ2KQogewogCW1jcGRydi0+ZHJ2LmJ1cyA9ICZtY3BfYnVzX3R5cGU7Ci0JbWNwZHJ2LT5kcnYucHJvYmUgPSBtY3BfYnVzX3Byb2JlOwotCW1jcGRydi0+ZHJ2LnJlbW92ZSA9IG1jcF9idXNfcmVtb3ZlOwogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJm1jcGRydi0+ZHJ2KTsKIH0KIEVYUE9SVF9TWU1CT0wobWNwX2RyaXZlcl9yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC91Y2IxeDAwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3VjYjF4MDAtY29yZS5jCmluZGV4IGUzMzVkNTQuLmFmZjgzZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3VjYjF4MDAtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL3VjYjF4MDAtY29yZS5jCkBAIC0yNCwxNCArMjQsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgogCiAjaW5jbHVkZSAidWNiMXgwMC5oIgogCi1zdGF0aWMgREVDTEFSRV9NVVRFWCh1Y2IxeDAwX3NlbSk7CitzdGF0aWMgREVGSU5FX01VVEVYKHVjYjF4MDBfbXV0ZXgpOwogc3RhdGljIExJU1RfSEVBRCh1Y2IxeDAwX2RyaXZlcnMpOwogc3RhdGljIExJU1RfSEVBRCh1Y2IxeDAwX2RldmljZXMpOwogCkBAIC01MDcsMTQgKzUwNywxNCBAQAogCQlnb3RvIGVycl9mcmVlOwogCX0KIAotCXJldCA9IHJlcXVlc3RfaXJxKHVjYi0+aXJxLCB1Y2IxeDAwX2lycSwgMCwgIlVDQjF4MDAiLCB1Y2IpOworCXJldCA9IHJlcXVlc3RfaXJxKHVjYi0+aXJxLCB1Y2IxeDAwX2lycSwgU0FfVFJJR0dFUl9SSVNJTkcsCisJCQkgICJVQ0IxeDAwIiwgdWNiKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAidWNiMXgwMDogdW5hYmxlIHRvIGdyYWIgaXJxJWQ6ICVkXG4iLAogCQkJdWNiLT5pcnEsIHJldCk7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCi0Jc2V0X2lycV90eXBlKHVjYi0+aXJxLCBJUlFUX1JJU0lORyk7CiAJbWNwX3NldF9kcnZkYXRhKG1jcCwgdWNiKTsKIAogCXJldCA9IGNsYXNzX2RldmljZV9yZWdpc3RlcigmdWNiLT5jZGV2KTsKQEAgLTUyMiwxMiArNTIyLDEyIEBACiAJCWdvdG8gZXJyX2lycTsKIAogCUlOSVRfTElTVF9IRUFEKCZ1Y2ItPmRldnMpOwotCWRvd24oJnVjYjF4MDBfc2VtKTsKKwltdXRleF9sb2NrKCZ1Y2IxeDAwX211dGV4KTsKIAlsaXN0X2FkZCgmdWNiLT5ub2RlLCAmdWNiMXgwMF9kZXZpY2VzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRydiwgJnVjYjF4MDBfZHJpdmVycywgbm9kZSkgewogCQl1Y2IxeDAwX2FkZF9kZXYodWNiLCBkcnYpOwogCX0KLQl1cCgmdWNiMXgwMF9zZW0pOworCW11dGV4X3VubG9jaygmdWNiMXgwMF9tdXRleCk7CiAJZ290byBvdXQ7CiAKICBlcnJfaXJxOgpAQCAtNTQ1LDEzICs1NDUsMTMgQEAKIAlzdHJ1Y3QgdWNiMXgwMCAqdWNiID0gbWNwX2dldF9kcnZkYXRhKG1jcCk7CiAJc3RydWN0IGxpc3RfaGVhZCAqbCwgKm47CiAKLQlkb3duKCZ1Y2IxeDAwX3NlbSk7CisJbXV0ZXhfbG9jaygmdWNiMXgwMF9tdXRleCk7CiAJbGlzdF9kZWwoJnVjYi0+bm9kZSk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKGwsIG4sICZ1Y2ItPmRldnMpIHsKIAkJc3RydWN0IHVjYjF4MDBfZGV2ICpkZXYgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCB1Y2IxeDAwX2RldiwgZGV2X25vZGUpOwogCQl1Y2IxeDAwX3JlbW92ZV9kZXYoZGV2KTsKIAl9Ci0JdXAoJnVjYjF4MDBfc2VtKTsKKwltdXRleF91bmxvY2soJnVjYjF4MDBfbXV0ZXgpOwogCiAJZnJlZV9pcnEodWNiLT5pcnEsIHVjYik7CiAJY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoJnVjYi0+Y2Rldik7CkBAIC01NjIsMTIgKzU2MiwxMiBAQAogCXN0cnVjdCB1Y2IxeDAwICp1Y2I7CiAKIAlJTklUX0xJU1RfSEVBRCgmZHJ2LT5kZXZzKTsKLQlkb3duKCZ1Y2IxeDAwX3NlbSk7CisJbXV0ZXhfbG9jaygmdWNiMXgwMF9tdXRleCk7CiAJbGlzdF9hZGQoJmRydi0+bm9kZSwgJnVjYjF4MDBfZHJpdmVycyk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh1Y2IsICZ1Y2IxeDAwX2RldmljZXMsIG5vZGUpIHsKIAkJdWNiMXgwMF9hZGRfZGV2KHVjYiwgZHJ2KTsKIAl9Ci0JdXAoJnVjYjF4MDBfc2VtKTsKKwltdXRleF91bmxvY2soJnVjYjF4MDBfbXV0ZXgpOwogCXJldHVybiAwOwogfQogCkBAIC01NzUsMTMgKzU3NSwxMyBAQAogewogCXN0cnVjdCBsaXN0X2hlYWQgKm4sICpsOwogCi0JZG93bigmdWNiMXgwMF9zZW0pOworCW11dGV4X2xvY2soJnVjYjF4MDBfbXV0ZXgpOwogCWxpc3RfZGVsKCZkcnYtPm5vZGUpOwogCWxpc3RfZm9yX2VhY2hfc2FmZShsLCBuLCAmZHJ2LT5kZXZzKSB7CiAJCXN0cnVjdCB1Y2IxeDAwX2RldiAqZGV2ID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgdWNiMXgwMF9kZXYsIGRydl9ub2RlKTsKIAkJdWNiMXgwMF9yZW1vdmVfZGV2KGRldik7CiAJfQotCXVwKCZ1Y2IxeDAwX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZ1Y2IxeDAwX211dGV4KTsKIH0KIAogc3RhdGljIGludCB1Y2IxeDAwX3N1c3BlbmQoc3RydWN0IG1jcCAqbWNwLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCkBAIC01ODksMTIgKzU4OSwxMiBAQAogCXN0cnVjdCB1Y2IxeDAwICp1Y2IgPSBtY3BfZ2V0X2RydmRhdGEobWNwKTsKIAlzdHJ1Y3QgdWNiMXgwMF9kZXYgKmRldjsKIAotCWRvd24oJnVjYjF4MDBfc2VtKTsKKwltdXRleF9sb2NrKCZ1Y2IxeDAwX211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJnVjYi0+ZGV2cywgZGV2X25vZGUpIHsKIAkJaWYgKGRldi0+ZHJ2LT5zdXNwZW5kKQogCQkJZGV2LT5kcnYtPnN1c3BlbmQoZGV2LCBzdGF0ZSk7CiAJfQotCXVwKCZ1Y2IxeDAwX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZ1Y2IxeDAwX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjAzLDEyICs2MDMsMTIgQEAKIAlzdHJ1Y3QgdWNiMXgwMCAqdWNiID0gbWNwX2dldF9kcnZkYXRhKG1jcCk7CiAJc3RydWN0IHVjYjF4MDBfZGV2ICpkZXY7CiAKLQlkb3duKCZ1Y2IxeDAwX3NlbSk7CisJbXV0ZXhfbG9jaygmdWNiMXgwMF9tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZ1Y2ItPmRldnMsIGRldl9ub2RlKSB7CiAJCWlmIChkZXYtPmRydi0+cmVzdW1lKQogCQkJZGV2LT5kcnYtPnJlc3VtZShkZXYpOwogCX0KLQl1cCgmdWNiMXgwMF9zZW0pOworCW11dGV4X3VubG9jaygmdWNiMXgwMF9tdXRleCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3VjYjF4MDAtdHMuYyBiL2RyaXZlcnMvbWZkL3VjYjF4MDAtdHMuYwppbmRleCA1NTEwNjFjLi43OWZkMDYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC91Y2IxeDAwLXRzLmMKKysrIGIvZHJpdmVycy9tZmQvdWNiMXgwMC10cy5jCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaWJtYXNtL2libWFzbS5oIGIvZHJpdmVycy9taXNjL2libWFzbS9pYm1hc20uaAppbmRleCBkN2UyMGEzLi4xY2VmMjM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaWJtYXNtL2libWFzbS5oCisrKyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vaWJtYXNtLmgKQEAgLTE0MSw4ICsxNDEsOCBAQAogfTsKIAogc3RydWN0IGlibWFzbV9yZW1vdGUgewotCXN0cnVjdCBpbnB1dF9kZXYga2V5YmRfZGV2OwotCXN0cnVjdCBpbnB1dF9kZXYgbW91c2VfZGV2OworCXN0cnVjdCBpbnB1dF9kZXYgKmtleWJkX2RldjsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICptb3VzZV9kZXY7CiB9OwogCiBzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgewpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJY2hhcgkJCWRpcm5hbWVbSUJNQVNNX05BTUVfU0laRV07CiAJY2hhcgkJCWRldm5hbWVbSUJNQVNNX05BTUVfU0laRV07CiAJdW5zaWduZWQgaW50CQludW1iZXI7Ci0Jc3RydWN0IGlibWFzbV9yZW1vdGUJKnJlbW90ZTsKKwlzdHJ1Y3QgaWJtYXNtX3JlbW90ZQlyZW1vdGU7CiAJaW50CQkJc2VyaWFsX2xpbmU7CiAJc3RydWN0IGRldmljZQkJKmRldjsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaWJtYXNtL3JlbW90ZS5jIGIvZHJpdmVycy9taXNjL2libWFzbS9yZW1vdGUuYwppbmRleCBkM2M0OGQyLi4wZjllM2FhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaWJtYXNtL3JlbW90ZS5jCisrKyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vcmVtb3RlLmMKQEAgLTIwMyw5ICsyMDMsOSBAQAogCiAJCXByaW50X2lucHV0KCZpbnB1dCk7CiAJCWlmIChpbnB1dC50eXBlID09IElOUFVUX1RZUEVfTU9VU0UpIHsKLQkJCXNlbmRfbW91c2VfZXZlbnQoJnNwLT5yZW1vdGUtPm1vdXNlX2RldiwgcmVncywgJmlucHV0KTsKKwkJCXNlbmRfbW91c2VfZXZlbnQoc3AtPnJlbW90ZS5tb3VzZV9kZXYsIHJlZ3MsICZpbnB1dCk7CiAJCX0gZWxzZSBpZiAoaW5wdXQudHlwZSA9PSBJTlBVVF9UWVBFX0tFWUJPQVJEKSB7Ci0JCQlzZW5kX2tleWJvYXJkX2V2ZW50KCZzcC0+cmVtb3RlLT5rZXliZF9kZXYsIHJlZ3MsICZpbnB1dCk7CisJCQlzZW5kX2tleWJvYXJkX2V2ZW50KHNwLT5yZW1vdGUua2V5YmRfZGV2LCByZWdzLCAmaW5wdXQpOwogCQl9IGVsc2UKIAkJCWJyZWFrOwogCkBAIC0yMTcsNTYgKzIxNyw3MSBAQAogaW50IGlibWFzbV9pbml0X3JlbW90ZV9pbnB1dF9kZXYoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCkKIHsKIAkvKiBzZXQgdXAgdGhlIG1vdXNlIGlucHV0IGRldmljZSAqLwotCXN0cnVjdCBpYm1hc21fcmVtb3RlICpyZW1vdGU7CisJc3RydWN0IGlucHV0X2RldiAqbW91c2VfZGV2LCAqa2V5YmRfZGV2OwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihzcC0+ZGV2KTsKKwlpbnQgZXJyb3IgPSAtRU5PTUVNOwogCWludCBpOwogCi0Jc3AtPnJlbW90ZSA9IHJlbW90ZSA9IGttYWxsb2Moc2l6ZW9mKCpyZW1vdGUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJlbW90ZSkKLQkJcmV0dXJuIC1FTk9NRU07CisJc3AtPnJlbW90ZS5tb3VzZV9kZXYgPSBtb3VzZV9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlzcC0+cmVtb3RlLmtleWJkX2RldiA9IGtleWJkX2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwogCi0JbWVtc2V0KHJlbW90ZSwgMCwgc2l6ZW9mKCpyZW1vdGUpKTsKKwlpZiAoIW1vdXNlX2RldiB8fCAha2V5YmRfZGV2KQorCQlnb3RvIGVycl9mcmVlX2RldmljZXM7CiAKLQlyZW1vdGUtPm1vdXNlX2Rldi5wcml2YXRlID0gcmVtb3RlOwotCWluaXRfaW5wdXRfZGV2KCZyZW1vdGUtPm1vdXNlX2Rldik7Ci0JcmVtb3RlLT5tb3VzZV9kZXYuaWQudmVuZG9yID0gcGRldi0+dmVuZG9yOwotCXJlbW90ZS0+bW91c2VfZGV2LmlkLnByb2R1Y3QgPSBwZGV2LT5kZXZpY2U7Ci0JcmVtb3RlLT5tb3VzZV9kZXYuZXZiaXRbMF0gID0gQklUKEVWX0tFWSkgfCBCSVQoRVZfQUJTKTsKLQlyZW1vdGUtPm1vdXNlX2Rldi5rZXliaXRbTE9ORyhCVE5fTU9VU0UpXSA9IEJJVChCVE5fTEVGVCkgfAorCW1vdXNlX2Rldi0+aWQuYnVzdHlwZSA9IEJVU19QQ0k7CisJbW91c2VfZGV2LT5pZC52ZW5kb3IgPSBwZGV2LT52ZW5kb3I7CisJbW91c2VfZGV2LT5pZC5wcm9kdWN0ID0gcGRldi0+ZGV2aWNlOworCW1vdXNlX2Rldi0+aWQudmVyc2lvbiA9IDE7CisJbW91c2VfZGV2LT5ldmJpdFswXSAgPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9BQlMpOworCW1vdXNlX2Rldi0+a2V5Yml0W0xPTkcoQlROX01PVVNFKV0gPSBCSVQoQlROX0xFRlQpIHwKIAkJQklUKEJUTl9SSUdIVCkgfCBCSVQoQlROX01JRERMRSk7Ci0Jc2V0X2JpdChCVE5fVE9VQ0gsIHJlbW90ZS0+bW91c2VfZGV2LmtleWJpdCk7Ci0JcmVtb3RlLT5tb3VzZV9kZXYubmFtZSA9IHJlbW90ZV9tb3VzZV9uYW1lOwotCWlucHV0X3NldF9hYnNfcGFyYW1zKCZyZW1vdGUtPm1vdXNlX2RldiwgQUJTX1gsIDAsIHhtYXgsIDAsIDApOwotCWlucHV0X3NldF9hYnNfcGFyYW1zKCZyZW1vdGUtPm1vdXNlX2RldiwgQUJTX1ksIDAsIHltYXgsIDAsIDApOworCXNldF9iaXQoQlROX1RPVUNILCBtb3VzZV9kZXYtPmtleWJpdCk7CisJbW91c2VfZGV2LT5uYW1lID0gcmVtb3RlX21vdXNlX25hbWU7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMobW91c2VfZGV2LCBBQlNfWCwgMCwgeG1heCwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMobW91c2VfZGV2LCBBQlNfWSwgMCwgeW1heCwgMCwgMCk7CiAKLQlyZW1vdGUtPmtleWJkX2Rldi5wcml2YXRlID0gcmVtb3RlOwotCWluaXRfaW5wdXRfZGV2KCZyZW1vdGUtPmtleWJkX2Rldik7Ci0JcmVtb3RlLT5rZXliZF9kZXYuaWQudmVuZG9yID0gcGRldi0+dmVuZG9yOwotCXJlbW90ZS0+a2V5YmRfZGV2LmlkLnByb2R1Y3QgPSBwZGV2LT5kZXZpY2U7Ci0JcmVtb3RlLT5rZXliZF9kZXYuZXZiaXRbMF0gID0gQklUKEVWX0tFWSk7Ci0JcmVtb3RlLT5rZXliZF9kZXYubmFtZSA9IHJlbW90ZV9rZXliZF9uYW1lOworCW1vdXNlX2Rldi0+aWQuYnVzdHlwZSA9IEJVU19QQ0k7CisJa2V5YmRfZGV2LT5pZC52ZW5kb3IgPSBwZGV2LT52ZW5kb3I7CisJa2V5YmRfZGV2LT5pZC5wcm9kdWN0ID0gcGRldi0+ZGV2aWNlOworCW1vdXNlX2Rldi0+aWQudmVyc2lvbiA9IDI7CisJa2V5YmRfZGV2LT5ldmJpdFswXSAgPSBCSVQoRVZfS0VZKTsKKwlrZXliZF9kZXYtPm5hbWUgPSByZW1vdGVfa2V5YmRfbmFtZTsKIAotCWZvciAoaT0wOyBpPFhMQVRFX1NJWkU7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBYTEFURV9TSVpFOyBpKyspIHsKIAkJaWYgKHhsYXRlX2hpZ2hbaV0pCi0JCQlzZXRfYml0KHhsYXRlX2hpZ2hbaV0sIHJlbW90ZS0+a2V5YmRfZGV2LmtleWJpdCk7CisJCQlzZXRfYml0KHhsYXRlX2hpZ2hbaV0sIGtleWJkX2Rldi0+a2V5Yml0KTsKIAkJaWYgKHhsYXRlW2ldKQotCQkJc2V0X2JpdCh4bGF0ZVtpXSwgcmVtb3RlLT5rZXliZF9kZXYua2V5Yml0KTsKKwkJCXNldF9iaXQoeGxhdGVbaV0sIGtleWJkX2Rldi0+a2V5Yml0KTsKIAl9CiAKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJnJlbW90ZS0+bW91c2VfZGV2KTsKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJnJlbW90ZS0+a2V5YmRfZGV2KTsKKwllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShtb3VzZV9kZXYpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJfZnJlZV9kZXZpY2VzOworCisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoa2V5YmRfZGV2KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyX3VucmVnaXN0ZXJfbW91c2VfZGV2OworCiAJZW5hYmxlX21vdXNlX2ludGVycnVwdHMoc3ApOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiaWJtYXNtIHJlbW90ZSByZXNwb25kaW5nIHRvIGV2ZW50cyBvbiBSU0EgY2FyZCAlZFxuIiwgc3AtPm51bWJlcik7CiAKIAlyZXR1cm4gMDsKKworIGVycl91bnJlZ2lzdGVyX21vdXNlX2RldjoKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShtb3VzZV9kZXYpOworCW1vdXNlX2RldiA9IE5VTEw7IC8qIHNvIHdlIGRvbid0IHRyeSB0byBmcmVlIGl0IGFnYWluIGJlbG93ICovCisgZXJyX2ZyZWVfZGV2aWNlczoKKwlpbnB1dF9mcmVlX2RldmljZShtb3VzZV9kZXYpOworCWlucHV0X2ZyZWVfZGV2aWNlKGtleWJkX2Rldik7CisKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIHZvaWQgaWJtYXNtX2ZyZWVfcmVtb3RlX2lucHV0X2RldihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKQogewogCWRpc2FibGVfbW91c2VfaW50ZXJydXB0cyhzcCk7Ci0JaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJnNwLT5yZW1vdGUtPmtleWJkX2Rldik7Ci0JaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJnNwLT5yZW1vdGUtPm1vdXNlX2Rldik7Ci0Ja2ZyZWUoc3AtPnJlbW90ZSk7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uoc3AtPnJlbW90ZS5tb3VzZV9kZXYpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHNwLT5yZW1vdGUua2V5YmRfZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvbW1jLmMgYi9kcml2ZXJzL21tYy9tbWMuYwppbmRleCBlYjQxMzkxLi5iZmNhNWMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9tbWMuYworKysgYi9kcml2ZXJzL21tYy9tbWMuYwpAQCAtNDk1LDYgKzQ5NSw3IEBACiAKIAkJY2FzZSAyOiAvKiBNTUMgdjIuMCAtIHYyLjIgKi8KIAkJY2FzZSAzOiAvKiBNTUMgdjMuMSAtIHYzLjMgKi8KKwkJY2FzZSA0OiAvKiBNTUMgdjQgKi8KIAkJCWNhcmQtPmNpZC5tYW5maWQJPSBVTlNUVUZGX0JJVFMocmVzcCwgMTIwLCA4KTsKIAkJCWNhcmQtPmNpZC5vZW1pZAkJPSBVTlNUVUZGX0JJVFMocmVzcCwgMTA0LCAxNik7CiAJCQljYXJkLT5jaWQucHJvZF9uYW1lWzBdCT0gVU5TVFVGRl9CSVRTKHJlc3AsIDk2LCA4KTsKQEAgLTU1MCw2ICs1NTEsMTEgQEAKIAkJY3NkLT5jYXBhY2l0eQkgID0gKDEgKyBtKSA8PCAoZSArIDIpOwogCiAJCWNzZC0+cmVhZF9ibGtiaXRzID0gVU5TVFVGRl9CSVRTKHJlc3AsIDgwLCA0KTsKKwkJY3NkLT5yZWFkX3BhcnRpYWwgPSBVTlNUVUZGX0JJVFMocmVzcCwgNzksIDEpOworCQljc2QtPndyaXRlX21pc2FsaWduID0gVU5TVFVGRl9CSVRTKHJlc3AsIDc4LCAxKTsKKwkJY3NkLT5yZWFkX21pc2FsaWduID0gVU5TVFVGRl9CSVRTKHJlc3AsIDc3LCAxKTsKKwkJY3NkLT53cml0ZV9ibGtiaXRzID0gVU5TVFVGRl9CSVRTKHJlc3AsIDIyLCA0KTsKKwkJY3NkLT53cml0ZV9wYXJ0aWFsID0gVU5TVFVGRl9CSVRTKHJlc3AsIDIxLCAxKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBXZSBvbmx5IHVuZGVyc3RhbmQgQ1NEIHN0cnVjdHVyZSB2MS4xIGFuZCB2MS4yLgpAQCAtNTc5LDYgKzU4NSwxMSBAQAogCQljc2QtPmNhcGFjaXR5CSAgPSAoMSArIG0pIDw8IChlICsgMik7CiAKIAkJY3NkLT5yZWFkX2Jsa2JpdHMgPSBVTlNUVUZGX0JJVFMocmVzcCwgODAsIDQpOworCQljc2QtPnJlYWRfcGFydGlhbCA9IFVOU1RVRkZfQklUUyhyZXNwLCA3OSwgMSk7CisJCWNzZC0+d3JpdGVfbWlzYWxpZ24gPSBVTlNUVUZGX0JJVFMocmVzcCwgNzgsIDEpOworCQljc2QtPnJlYWRfbWlzYWxpZ24gPSBVTlNUVUZGX0JJVFMocmVzcCwgNzcsIDEpOworCQljc2QtPndyaXRlX2Jsa2JpdHMgPSBVTlNUVUZGX0JJVFMocmVzcCwgMjIsIDQpOworCQljc2QtPndyaXRlX3BhcnRpYWwgPSBVTlNUVUZGX0JJVFMocmVzcCwgMjEsIDEpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvbW1jX2Jsb2NrLmMgYi9kcml2ZXJzL21tYy9tbWNfYmxvY2suYwppbmRleCA4ZTM4MGMxLi41YjAxNGMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9tbWNfYmxvY2suYworKysgYi9kcml2ZXJzL21tYy9tbWNfYmxvY2suYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9wcm90b2NvbC5oPgpAQCAtNTQsNDEgKzU1LDM2IEBACiAKIAl1bnNpZ25lZCBpbnQJdXNhZ2U7CiAJdW5zaWduZWQgaW50CWJsb2NrX2JpdHM7CisJdW5zaWduZWQgaW50CXJlYWRfb25seTsKIH07CiAKLXN0YXRpYyBERUNMQVJFX01VVEVYKG9wZW5fbG9jayk7CitzdGF0aWMgREVGSU5FX01VVEVYKG9wZW5fbG9jayk7CiAKIHN0YXRpYyBzdHJ1Y3QgbW1jX2Jsa19kYXRhICptbWNfYmxrX2dldChzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKIHsKIAlzdHJ1Y3QgbW1jX2Jsa19kYXRhICptZDsKIAotCWRvd24oJm9wZW5fbG9jayk7CisJbXV0ZXhfbG9jaygmb3Blbl9sb2NrKTsKIAltZCA9IGRpc2stPnByaXZhdGVfZGF0YTsKIAlpZiAobWQgJiYgbWQtPnVzYWdlID09IDApCiAJCW1kID0gTlVMTDsKIAlpZiAobWQpCiAJCW1kLT51c2FnZSsrOwotCXVwKCZvcGVuX2xvY2spOworCW11dGV4X3VubG9jaygmb3Blbl9sb2NrKTsKIAogCXJldHVybiBtZDsKIH0KIAogc3RhdGljIHZvaWQgbW1jX2Jsa19wdXQoc3RydWN0IG1tY19ibGtfZGF0YSAqbWQpCiB7Ci0JZG93bigmb3Blbl9sb2NrKTsKKwltdXRleF9sb2NrKCZvcGVuX2xvY2spOwogCW1kLT51c2FnZS0tOwogCWlmIChtZC0+dXNhZ2UgPT0gMCkgewogCQlwdXRfZGlzayhtZC0+ZGlzayk7CiAJCW1tY19jbGVhbnVwX3F1ZXVlKCZtZC0+cXVldWUpOwogCQlrZnJlZShtZCk7CiAJfQotCXVwKCZvcGVuX2xvY2spOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBtbWNfYmxrX3JlYWRvbmx5KHN0cnVjdCBtbWNfY2FyZCAqY2FyZCkKLXsKLQlyZXR1cm4gbW1jX2NhcmRfcmVhZG9ubHkoY2FyZCkgfHwKLQkgICAgICAgIShjYXJkLT5jc2QuY21kY2xhc3MgJiBDQ0NfQkxPQ0tfV1JJVEUpOworCW11dGV4X3VubG9jaygmb3Blbl9sb2NrKTsKIH0KIAogc3RhdGljIGludCBtbWNfYmxrX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCkBAIC0xMDIsOCArOTgsNyBAQAogCQkJY2hlY2tfZGlza19jaGFuZ2UoaW5vZGUtPmlfYmRldik7CiAJCXJldCA9IDA7CiAKLQkJaWYgKChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCW1tY19ibGtfcmVhZG9ubHkobWQtPnF1ZXVlLmNhcmQpKQorCQlpZiAoKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiBtZC0+cmVhZF9vbmx5KQogCQkJcmV0ID0gLUVST0ZTOwogCX0KIApAQCAtMTE5LDMxICsxMTQsMTggQEAKIH0KIAogc3RhdGljIGludAotbW1jX2Jsa19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCittbWNfYmxrX2dldGdlbyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbykKIHsKLQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gaW5vZGUtPmlfYmRldjsKLQotCWlmIChjbWQgPT0gSERJT19HRVRHRU8pIHsKLQkJc3RydWN0IGhkX2dlb21ldHJ5IGdlbzsKLQotCQltZW1zZXQoJmdlbywgMCwgc2l6ZW9mKHN0cnVjdCBoZF9nZW9tZXRyeSkpOwotCi0JCWdlby5jeWxpbmRlcnMJPSBnZXRfY2FwYWNpdHkoYmRldi0+YmRfZGlzaykgLyAoNCAqIDE2KTsKLQkJZ2VvLmhlYWRzCT0gNDsKLQkJZ2VvLnNlY3RvcnMJPSAxNjsKLQkJZ2VvLnN0YXJ0CT0gZ2V0X3N0YXJ0X3NlY3QoYmRldik7Ci0KLQkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZnZW8sIHNpemVvZihnZW8pKQotCQkJPyAtRUZBVUxUIDogMDsKLQl9Ci0KLQlyZXR1cm4gLUVOT1RUWTsKKwlnZW8tPmN5bGluZGVycyA9IGdldF9jYXBhY2l0eShiZGV2LT5iZF9kaXNrKSAvICg0ICogMTYpOworCWdlby0+aGVhZHMgPSA0OworCWdlby0+c2VjdG9ycyA9IDE2OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIG1tY19iZG9wcyA9IHsKIAkub3BlbgkJCT0gbW1jX2Jsa19vcGVuLAogCS5yZWxlYXNlCQk9IG1tY19ibGtfcmVsZWFzZSwKLQkuaW9jdGwJCQk9IG1tY19ibGtfaW9jdGwsCisJLmdldGdlbwkJCT0gbW1jX2Jsa19nZXRnZW8sCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIH07CiAKQEAgLTIwNiw3ICsxODgsMTMgQEAKIAkJCWJycS5kYXRhLmZsYWdzIHw9IE1NQ19EQVRBX1dSSVRFOwogCQkJYnJxLmRhdGEuYmxvY2tzID0gMTsKIAkJfQotCQlicnEubXJxLnN0b3AgPSBicnEuZGF0YS5ibG9ja3MgPiAxID8gJmJycS5zdG9wIDogTlVMTDsKKworCQlpZiAoYnJxLmRhdGEuYmxvY2tzID4gMSkgeworCQkJYnJxLmRhdGEuZmxhZ3MgfD0gTU1DX0RBVEFfTVVMVEk7CisJCQlicnEubXJxLnN0b3AgPSAmYnJxLnN0b3A7CisJCX0gZWxzZSB7CisJCQlicnEubXJxLnN0b3AgPSBOVUxMOworCQl9CiAKIAkJYnJxLmRhdGEuc2cgPSBtcS0+c2c7CiAJCWJycS5kYXRhLnNnX2xlbiA9IGJsa19ycV9tYXBfc2cocmVxLT5xLCByZXEsIGJycS5kYXRhLnNnKTsKQEAgLTI5OSw2ICsyODcsMTIgQEAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgZGV2X3VzZVtNTUNfTlVNX01JTk9SUy8oOCpzaXplb2YodW5zaWduZWQgbG9uZykpXTsKIAorc3RhdGljIGlubGluZSBpbnQgbW1jX2Jsa19yZWFkb25seShzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCit7CisJcmV0dXJuIG1tY19jYXJkX3JlYWRvbmx5KGNhcmQpIHx8CisJICAgICAgICEoY2FyZC0+Y3NkLmNtZGNsYXNzICYgQ0NDX0JMT0NLX1dSSVRFKTsKK30KKwogc3RhdGljIHN0cnVjdCBtbWNfYmxrX2RhdGEgKm1tY19ibGtfYWxsb2Moc3RydWN0IG1tY19jYXJkICpjYXJkKQogewogCXN0cnVjdCBtbWNfYmxrX2RhdGEgKm1kOwpAQCAtMzEwLDY0ICszMDQsMTIxIEBACiAJX19zZXRfYml0KGRldmlkeCwgZGV2X3VzZSk7CiAKIAltZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtbWNfYmxrX2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAobWQpIHsKLQkJbWVtc2V0KG1kLCAwLCBzaXplb2Yoc3RydWN0IG1tY19ibGtfZGF0YSkpOwotCi0JCW1kLT5kaXNrID0gYWxsb2NfZGlzaygxIDw8IE1NQ19TSElGVCk7Ci0JCWlmIChtZC0+ZGlzayA9PSBOVUxMKSB7Ci0JCQlrZnJlZShtZCk7Ci0JCQltZCA9IEVSUl9QVFIoLUVOT01FTSk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCXNwaW5fbG9ja19pbml0KCZtZC0+bG9jayk7Ci0JCW1kLT51c2FnZSA9IDE7Ci0KLQkJcmV0ID0gbW1jX2luaXRfcXVldWUoJm1kLT5xdWV1ZSwgY2FyZCwgJm1kLT5sb2NrKTsKLQkJaWYgKHJldCkgewotCQkJcHV0X2Rpc2sobWQtPmRpc2spOwotCQkJa2ZyZWUobWQpOwotCQkJbWQgPSBFUlJfUFRSKHJldCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQltZC0+cXVldWUucHJlcF9mbiA9IG1tY19ibGtfcHJlcF9ycTsKLQkJbWQtPnF1ZXVlLmlzc3VlX2ZuID0gbW1jX2Jsa19pc3N1ZV9ycTsKLQkJbWQtPnF1ZXVlLmRhdGEgPSBtZDsKLQotCQltZC0+ZGlzay0+bWFqb3IJPSBtYWpvcjsKLQkJbWQtPmRpc2stPmZpcnN0X21pbm9yID0gZGV2aWR4IDw8IE1NQ19TSElGVDsKLQkJbWQtPmRpc2stPmZvcHMgPSAmbW1jX2Jkb3BzOwotCQltZC0+ZGlzay0+cHJpdmF0ZV9kYXRhID0gbWQ7Ci0JCW1kLT5kaXNrLT5xdWV1ZSA9IG1kLT5xdWV1ZS5xdWV1ZTsKLQkJbWQtPmRpc2stPmRyaXZlcmZzX2RldiA9ICZjYXJkLT5kZXY7Ci0KLQkJLyoKLQkJICogQXMgZGlzY3Vzc2VkIG9uIGxrbWwsIEdFTkhEX0ZMX1JFTU9WQUJMRSBzaG91bGQ6Ci0JCSAqCi0JCSAqIC0gYmUgc2V0IGZvciByZW1vdmFibGUgbWVkaWEgd2l0aCBwZXJtYW5lbnQgYmxvY2sgZGV2aWNlcwotCQkgKiAtIGJlIHVuc2V0IGZvciByZW1vdmFibGUgYmxvY2sgZGV2aWNlcyB3aXRoIHBlcm1hbmVudCBtZWRpYQotCQkgKgotCQkgKiBTaW5jZSBNTUMgYmxvY2sgZGV2aWNlcyBjbGVhcmx5IGZhbGwgdW5kZXIgdGhlIHNlY29uZAotCQkgKiBjYXNlLCB3ZSBkbyBub3Qgc2V0IEdFTkhEX0ZMX1JFTU9WQUJMRS4gIFVzZXJzcGFjZQotCQkgKiBzaG91bGQgdXNlIHRoZSBibG9jayBkZXZpY2UgY3JlYXRpb24vZGVzdHJ1Y3Rpb24gaG90cGx1ZwotCQkgKiBtZXNzYWdlcyB0byB0ZWxsIHdoZW4gdGhlIGNhcmQgaXMgcHJlc2VudC4KLQkJICovCi0KLQkJc3ByaW50ZihtZC0+ZGlzay0+ZGlza19uYW1lLCAibW1jYmxrJWQiLCBkZXZpZHgpOwotCQlzcHJpbnRmKG1kLT5kaXNrLT5kZXZmc19uYW1lLCAibW1jL2JsayVkIiwgZGV2aWR4KTsKLQotCQltZC0+YmxvY2tfYml0cyA9IGNhcmQtPmNzZC5yZWFkX2Jsa2JpdHM7Ci0KLQkJYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUobWQtPnF1ZXVlLnF1ZXVlLCAxIDw8IG1kLT5ibG9ja19iaXRzKTsKLQotCQkvKgotCQkgKiBUaGUgQ1NEIGNhcGFjaXR5IGZpZWxkIGlzIGluIHVuaXRzIG9mIHJlYWRfYmxrYml0cy4KLQkJICogc2V0X2NhcGFjaXR5IHRha2VzIHVuaXRzIG9mIDUxMiBieXRlcy4KLQkJICovCi0JCXNldF9jYXBhY2l0eShtZC0+ZGlzaywgY2FyZC0+Y3NkLmNhcGFjaXR5IDw8IChjYXJkLT5jc2QucmVhZF9ibGtiaXRzIC0gOSkpOworCWlmICghbWQpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CiAJfQotIG91dDoKKworCW1lbXNldChtZCwgMCwgc2l6ZW9mKHN0cnVjdCBtbWNfYmxrX2RhdGEpKTsKKworCS8qCisJICogU2V0IHRoZSByZWFkLW9ubHkgc3RhdHVzIGJhc2VkIG9uIHRoZSBzdXBwb3J0ZWQgY29tbWFuZHMKKwkgKiBhbmQgdGhlIHdyaXRlIHByb3RlY3Qgc3dpdGNoLgorCSAqLworCW1kLT5yZWFkX29ubHkgPSBtbWNfYmxrX3JlYWRvbmx5KGNhcmQpOworCisJLyoKKwkgKiBGaWd1cmUgb3V0IGEgd29ya2FibGUgYmxvY2sgc2l6ZS4gIE1NQyBjYXJkcyBoYXZlOgorCSAqICAtIHR3byBibG9jayBzaXplcywgb25lIGZvciByZWFkIGFuZCBvbmUgZm9yIHdyaXRlLgorCSAqICAtIG1heSBzdXBwb3J0IHBhcnRpYWwgcmVhZHMgYW5kL29yIHdyaXRlcworCSAqICAgIChhbGxvd3MgYmxvY2sgc2l6ZXMgc21hbGxlciB0aGFuIHNwZWNpZmllZCkKKwkgKi8KKwltZC0+YmxvY2tfYml0cyA9IGNhcmQtPmNzZC5yZWFkX2Jsa2JpdHM7CisJaWYgKGNhcmQtPmNzZC53cml0ZV9ibGtiaXRzICE9IGNhcmQtPmNzZC5yZWFkX2Jsa2JpdHMpIHsKKwkJaWYgKGNhcmQtPmNzZC53cml0ZV9ibGtiaXRzIDwgY2FyZC0+Y3NkLnJlYWRfYmxrYml0cyAmJgorCQkgICAgY2FyZC0+Y3NkLnJlYWRfcGFydGlhbCkgeworCQkJLyoKKwkJCSAqIHdyaXRlIGJsb2NrIHNpemUgaXMgc21hbGxlciB0aGFuIHJlYWQgYmxvY2sKKwkJCSAqIHNpemUsIGJ1dCB3ZSBzdXBwb3J0IHBhcnRpYWwgcmVhZHMsIHNvIGNob29zZQorCQkJICogdGhlIHNtYWxsZXIgd3JpdGUgYmxvY2sgc2l6ZS4KKwkJCSAqLworCQkJbWQtPmJsb2NrX2JpdHMgPSBjYXJkLT5jc2Qud3JpdGVfYmxrYml0czsKKwkJfSBlbHNlIGlmIChjYXJkLT5jc2Qud3JpdGVfYmxrYml0cyA+IGNhcmQtPmNzZC5yZWFkX2Jsa2JpdHMgJiYKKwkJCSAgIGNhcmQtPmNzZC53cml0ZV9wYXJ0aWFsKSB7CisJCQkvKgorCQkJICogcmVhZCBibG9jayBzaXplIGlzIHNtYWxsZXIgdGhhbiB3cml0ZSBibG9jaworCQkJICogc2l6ZSwgYnV0IHdlIHN1cHBvcnQgcGFydGlhbCB3cml0ZXMuICBVc2UgcmVhZAorCQkJICogYmxvY2sgc2l6ZS4KKwkJCSAqLworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFdlIGRvbid0IHN1cHBvcnQgdGhpcyBjb25maWd1cmF0aW9uIGZvciB3cml0ZXMuCisJCQkgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBzZWxlY3QgYmxvY2sgc2l6ZSBmb3IgIgorCQkJCSJ3cml0aW5nIChyYiV1IHdiJXUgcnAldSB3cCV1KVxuIiwKKwkJCQltZC0+ZGlzay0+ZGlza19uYW1lLAorCQkJCTEgPDwgY2FyZC0+Y3NkLnJlYWRfYmxrYml0cywKKwkJCQkxIDw8IGNhcmQtPmNzZC53cml0ZV9ibGtiaXRzLAorCQkJCWNhcmQtPmNzZC5yZWFkX3BhcnRpYWwsCisJCQkJY2FyZC0+Y3NkLndyaXRlX3BhcnRpYWwpOworCQkJbWQtPnJlYWRfb25seSA9IDE7CisJCX0KKwl9CisKKwkvKgorCSAqIFJlZnVzZSB0byBhbGxvdyBibG9jayBzaXplcyBzbWFsbGVyIHRoYW4gNTEyIGJ5dGVzLgorCSAqLworCWlmIChtZC0+YmxvY2tfYml0cyA8IDkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHN1cHBvcnQgYmxvY2sgc2l6ZSAldVxuIiwKKwkJCW1tY19jYXJkX2lkKGNhcmQpLCAxIDw8IG1kLT5ibG9ja19iaXRzKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfa2ZyZWU7CisJfQorCisJbWQtPmRpc2sgPSBhbGxvY19kaXNrKDEgPDwgTU1DX1NISUZUKTsKKwlpZiAobWQtPmRpc2sgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9rZnJlZTsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmbWQtPmxvY2spOworCW1kLT51c2FnZSA9IDE7CisKKwlyZXQgPSBtbWNfaW5pdF9xdWV1ZSgmbWQtPnF1ZXVlLCBjYXJkLCAmbWQtPmxvY2spOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3B1dGRpc2s7CisKKwltZC0+cXVldWUucHJlcF9mbiA9IG1tY19ibGtfcHJlcF9ycTsKKwltZC0+cXVldWUuaXNzdWVfZm4gPSBtbWNfYmxrX2lzc3VlX3JxOworCW1kLT5xdWV1ZS5kYXRhID0gbWQ7CisKKwltZC0+ZGlzay0+bWFqb3IJPSBtYWpvcjsKKwltZC0+ZGlzay0+Zmlyc3RfbWlub3IgPSBkZXZpZHggPDwgTU1DX1NISUZUOworCW1kLT5kaXNrLT5mb3BzID0gJm1tY19iZG9wczsKKwltZC0+ZGlzay0+cHJpdmF0ZV9kYXRhID0gbWQ7CisJbWQtPmRpc2stPnF1ZXVlID0gbWQtPnF1ZXVlLnF1ZXVlOworCW1kLT5kaXNrLT5kcml2ZXJmc19kZXYgPSAmY2FyZC0+ZGV2OworCisJLyoKKwkgKiBBcyBkaXNjdXNzZWQgb24gbGttbCwgR0VOSERfRkxfUkVNT1ZBQkxFIHNob3VsZDoKKwkgKgorCSAqIC0gYmUgc2V0IGZvciByZW1vdmFibGUgbWVkaWEgd2l0aCBwZXJtYW5lbnQgYmxvY2sgZGV2aWNlcworCSAqIC0gYmUgdW5zZXQgZm9yIHJlbW92YWJsZSBibG9jayBkZXZpY2VzIHdpdGggcGVybWFuZW50IG1lZGlhCisJICoKKwkgKiBTaW5jZSBNTUMgYmxvY2sgZGV2aWNlcyBjbGVhcmx5IGZhbGwgdW5kZXIgdGhlIHNlY29uZAorCSAqIGNhc2UsIHdlIGRvIG5vdCBzZXQgR0VOSERfRkxfUkVNT1ZBQkxFLiAgVXNlcnNwYWNlCisJICogc2hvdWxkIHVzZSB0aGUgYmxvY2sgZGV2aWNlIGNyZWF0aW9uL2Rlc3RydWN0aW9uIGhvdHBsdWcKKwkgKiBtZXNzYWdlcyB0byB0ZWxsIHdoZW4gdGhlIGNhcmQgaXMgcHJlc2VudC4KKwkgKi8KKworCXNwcmludGYobWQtPmRpc2stPmRpc2tfbmFtZSwgIm1tY2JsayVkIiwgZGV2aWR4KTsKKwlzcHJpbnRmKG1kLT5kaXNrLT5kZXZmc19uYW1lLCAibW1jL2JsayVkIiwgZGV2aWR4KTsKKworCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKG1kLT5xdWV1ZS5xdWV1ZSwgMSA8PCBtZC0+YmxvY2tfYml0cyk7CisKKwkvKgorCSAqIFRoZSBDU0QgY2FwYWNpdHkgZmllbGQgaXMgaW4gdW5pdHMgb2YgcmVhZF9ibGtiaXRzLgorCSAqIHNldF9jYXBhY2l0eSB0YWtlcyB1bml0cyBvZiA1MTIgYnl0ZXMuCisJICovCisJc2V0X2NhcGFjaXR5KG1kLT5kaXNrLCBjYXJkLT5jc2QuY2FwYWNpdHkgPDwgKGNhcmQtPmNzZC5yZWFkX2Jsa2JpdHMgLSA5KSk7CiAJcmV0dXJuIG1kOworCisgZXJyX3B1dGRpc2s6CisJcHV0X2Rpc2sobWQtPmRpc2spOworIGVycl9rZnJlZToKKwlrZnJlZShtZCk7Cisgb3V0OgorCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTQwMywxMiArNDU0LDYgQEAKIAlpZiAoIShjYXJkLT5jc2QuY21kY2xhc3MgJiBDQ0NfQkxPQ0tfUkVBRCkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKGNhcmQtPmNzZC5yZWFkX2Jsa2JpdHMgPCA5KSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByZWFkIGJsb2Nrc2l6ZSB0b28gc21hbGwgKCV1KVxuIiwKLQkJCW1tY19jYXJkX2lkKGNhcmQpLCAxIDw8IGNhcmQtPmNzZC5yZWFkX2Jsa2JpdHMpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KIAltZCA9IG1tY19ibGtfYWxsb2MoY2FyZCk7CiAJaWYgKElTX0VSUihtZCkpCiAJCXJldHVybiBQVFJfRVJSKG1kKTsKQEAgLTQxNyw5ICs0NjIsMTAgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyAlcyAlbHVLaUIgJXNcbiIsCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzICVzICVsbHVLaUIgJXNcbiIsCiAJCW1kLT5kaXNrLT5kaXNrX25hbWUsIG1tY19jYXJkX2lkKGNhcmQpLCBtbWNfY2FyZF9uYW1lKGNhcmQpLAotCQlnZXRfY2FwYWNpdHkobWQtPmRpc2spID4+IDEsIG1tY19ibGtfcmVhZG9ubHkoY2FyZCk/IihybykiOiIiKTsKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZykoZ2V0X2NhcGFjaXR5KG1kLT5kaXNrKSA+PiAxKSwKKwkJbWQtPnJlYWRfb25seSA/ICIocm8pIiA6ICIiKTsKIAogCW1tY19zZXRfZHJ2ZGF0YShjYXJkLCBtZCk7CiAJYWRkX2Rpc2sobWQtPmRpc2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvbW1jX3N5c2ZzLmMgYi9kcml2ZXJzL21tYy9tbWNfc3lzZnMuYwppbmRleCBlYzcwMTY2Li5hMmEzNWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9tbWNfc3lzZnMuYworKysgYi9kcml2ZXJzL21tYy9tbWNfc3lzZnMuYwpAQCAtMTM2LDE3ICsxMzYsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgbW1jX2J1c190eXBlID0gewotCS5uYW1lCQk9ICJtbWMiLAotCS5kZXZfYXR0cnMJPSBtbWNfZGV2X2F0dHJzLAotCS5tYXRjaAkJPSBtbWNfYnVzX21hdGNoLAotCS51ZXZlbnQJCT0gbW1jX2J1c191ZXZlbnQsCi0JLnN1c3BlbmQJPSBtbWNfYnVzX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBtbWNfYnVzX3Jlc3VtZSwKLX07Ci0KLQotc3RhdGljIGludCBtbWNfZHJ2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgbW1jX2J1c19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG1tY19kcml2ZXIgKmRydiA9IHRvX21tY19kcml2ZXIoZGV2LT5kcml2ZXIpOwogCXN0cnVjdCBtbWNfY2FyZCAqY2FyZCA9IGRldl90b19tbWNfY2FyZChkZXYpOwpAQCAtMTU0LDcgKzE0NCw3IEBACiAJcmV0dXJuIGRydi0+cHJvYmUoY2FyZCk7CiB9CiAKLXN0YXRpYyBpbnQgbW1jX2Rydl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBtbWNfYnVzX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG1tY19kcml2ZXIgKmRydiA9IHRvX21tY19kcml2ZXIoZGV2LT5kcml2ZXIpOwogCXN0cnVjdCBtbWNfY2FyZCAqY2FyZCA9IGRldl90b19tbWNfY2FyZChkZXYpOwpAQCAtMTY0LDYgKzE1NCwxNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGJ1c190eXBlIG1tY19idXNfdHlwZSA9IHsKKwkubmFtZQkJPSAibW1jIiwKKwkuZGV2X2F0dHJzCT0gbW1jX2Rldl9hdHRycywKKwkubWF0Y2gJCT0gbW1jX2J1c19tYXRjaCwKKwkudWV2ZW50CQk9IG1tY19idXNfdWV2ZW50LAorCS5wcm9iZQkJPSBtbWNfYnVzX3Byb2JlLAorCS5yZW1vdmUJCT0gbW1jX2J1c19yZW1vdmUsCisJLnN1c3BlbmQJPSBtbWNfYnVzX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBtbWNfYnVzX3Jlc3VtZSwKK307CiAKIC8qKgogICoJbW1jX3JlZ2lzdGVyX2RyaXZlciAtIHJlZ2lzdGVyIGEgbWVkaWEgZHJpdmVyCkBAIC0xNzIsOCArMTcyLDYgQEAKIGludCBtbWNfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBtbWNfZHJpdmVyICpkcnYpCiB7CiAJZHJ2LT5kcnYuYnVzID0gJm1tY19idXNfdHlwZTsKLQlkcnYtPmRydi5wcm9iZSA9IG1tY19kcnZfcHJvYmU7Ci0JZHJ2LT5kcnYucmVtb3ZlID0gbW1jX2Rydl9yZW1vdmU7CiAJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcnYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9tbWNpLmMgYi9kcml2ZXJzL21tYy9tbWNpLmMKaW5kZXggMTY2YzliMC4uNjM0ZWY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvbW1jaS5jCisrKyBiL2RyaXZlcnMvbW1jL21tY2kuYwpAQCAtMTksMTMgKzE5LDE0IEBACiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KIAorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8YXNtL3NpemVzLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2FtYmEuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tbWMuaD4KIAogI2luY2x1ZGUgIm1tY2kuaCIKQEAgLTE1Nyw2ICsxNTgsMTMgQEAKIAkJZWxzZSBpZiAoc3RhdHVzICYgKE1DSV9UWFVOREVSUlVOfE1DSV9SWE9WRVJSVU4pKQogCQkJZGF0YS0+ZXJyb3IgPSBNTUNfRVJSX0ZJRk87CiAJCXN0YXR1cyB8PSBNQ0lfREFUQUVORDsKKworCQkvKgorCQkgKiBXZSBoaXQgYW4gZXJyb3IgY29uZGl0aW9uLiAgRW5zdXJlIHRoYXQgYW55IGRhdGEKKwkJICogcGFydGlhbGx5IHdyaXR0ZW4gdG8gYSBwYWdlIGlzIHByb3Blcmx5IGNvaGVyZW50LgorCQkgKi8KKwkJaWYgKGhvc3QtPnNnX2xlbiAmJiBkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1JFQUQpCisJCQlmbHVzaF9kY2FjaGVfcGFnZShob3N0LT5zZ19wdHItPnBhZ2UpOwogCX0KIAlpZiAoc3RhdHVzICYgTUNJX0RBVEFFTkQpIHsKIAkJbW1jaV9zdG9wX2RhdGEoaG9zdCk7CkBAIC0yOTIsNyArMzAwLDcgQEAKIAkJLyoKIAkJICogVW5tYXAgdGhlIGJ1ZmZlci4KIAkJICovCi0JCW1tY2lfa3VubWFwX2F0b21pYyhob3N0LCAmZmxhZ3MpOworCQltbWNpX2t1bm1hcF9hdG9taWMoaG9zdCwgYnVmZmVyLCAmZmxhZ3MpOwogCiAJCWhvc3QtPnNnX29mZiArPSBsZW47CiAJCWhvc3QtPnNpemUgLT0gbGVuOwpAQCAtMzAxLDYgKzMwOSwxMyBAQAogCQlpZiAocmVtYWluKQogCQkJYnJlYWs7CiAKKwkJLyoKKwkJICogSWYgd2Ugd2VyZSByZWFkaW5nLCBhbmQgd2UgaGF2ZSBjb21wbGV0ZWQgdGhpcworCQkgKiBwYWdlLCBlbnN1cmUgdGhhdCB0aGUgZGF0YSBjYWNoZSBpcyBjb2hlcmVudC4KKwkJICovCisJCWlmIChzdGF0dXMgJiBNQ0lfUlhBQ1RJVkUpCisJCQlmbHVzaF9kY2FjaGVfcGFnZShob3N0LT5zZ19wdHItPnBhZ2UpOworCiAJCWlmICghbW1jaV9uZXh0X3NnKGhvc3QpKQogCQkJYnJlYWs7CiAKQEAgLTQ3OSwxMyArNDk0LDkgQEAKIAkJZ290byBob3N0X2ZyZWU7CiAJfQogCi0JcmV0ID0gY2xrX3VzZShob3N0LT5jbGspOwotCWlmIChyZXQpCi0JCWdvdG8gY2xrX2ZyZWU7Ci0KIAlyZXQgPSBjbGtfZW5hYmxlKGhvc3QtPmNsayk7CiAJaWYgKHJldCkKLQkJZ290byBjbGtfdW51c2U7CisJCWdvdG8gY2xrX2ZyZWU7CiAKIAlob3N0LT5wbGF0ID0gcGxhdDsKIAlob3N0LT5tY2xrID0gY2xrX2dldF9yYXRlKGhvc3QtPmNsayk7CkBAIC01NTgsOCArNTY5LDYgQEAKIAlpb3VubWFwKGhvc3QtPmJhc2UpOwogIGNsa19kaXNhYmxlOgogCWNsa19kaXNhYmxlKGhvc3QtPmNsayk7Ci0gY2xrX3VudXNlOgotCWNsa191bnVzZShob3N0LT5jbGspOwogIGNsa19mcmVlOgogCWNsa19wdXQoaG9zdC0+Y2xrKTsKICBob3N0X2ZyZWU6CkBAIC01OTQsNyArNjAzLDYgQEAKIAogCQlpb3VubWFwKGhvc3QtPmJhc2UpOwogCQljbGtfZGlzYWJsZShob3N0LT5jbGspOwotCQljbGtfdW51c2UoaG9zdC0+Y2xrKTsKIAkJY2xrX3B1dChob3N0LT5jbGspOwogCiAJCW1tY19mcmVlX2hvc3QobW1jKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL21tY2kuaCBiL2RyaXZlcnMvbW1jL21tY2kuaAppbmRleCA0NTg5YmJkLi42ZDdlYWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9tbWNpLmgKKysrIGIvZHJpdmVycy9tbWMvbW1jaS5oCkBAIC0xNzIsOCArMTcyLDggQEAKIAlyZXR1cm4ga21hcF9hdG9taWMoc2ctPnBhZ2UsIEtNX0JJT19TUkNfSVJRKSArIHNnLT5vZmZzZXQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBtbWNpX2t1bm1hcF9hdG9taWMoc3RydWN0IG1tY2lfaG9zdCAqaG9zdCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCitzdGF0aWMgaW5saW5lIHZvaWQgbW1jaV9rdW5tYXBfYXRvbWljKHN0cnVjdCBtbWNpX2hvc3QgKmhvc3QsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCiB7Ci0Ja3VubWFwX2F0b21pYyhob3N0LT5zZ19wdHItPnBhZ2UsIEtNX0JJT19TUkNfSVJRKTsKKwlrdW5tYXBfYXRvbWljKGJ1ZmZlciwgS01fQklPX1NSQ19JUlEpOwogCWxvY2FsX2lycV9yZXN0b3JlKCpmbGFncyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy93YnNkLmMgYi9kcml2ZXJzL21tYy93YnNkLmMKaW5kZXggYzdlYjdjMi4uZjI1NzU3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvd2JzZC5jCisrKyBiL2RyaXZlcnMvbW1jL3dic2QuYwpAQCAtOTAsNyArOTAsNyBAQAogICogQmFzaWMgZnVuY3Rpb25zCiAgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHdic2RfdW5sb2NrX2NvbmZpZyhzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0KQorc3RhdGljIGlubGluZSB2b2lkIHdic2RfdW5sb2NrX2NvbmZpZyhzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0KQogewogCUJVR19PTihob3N0LT5jb25maWcgPT0gMCk7CiAKQEAgLTk4LDE0ICs5OCwxNCBAQAogCW91dGIoaG9zdC0+dW5sb2NrX2NvZGUsIGhvc3QtPmNvbmZpZyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB3YnNkX2xvY2tfY29uZmlnKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QpCitzdGF0aWMgaW5saW5lIHZvaWQgd2JzZF9sb2NrX2NvbmZpZyhzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0KQogewogCUJVR19PTihob3N0LT5jb25maWcgPT0gMCk7CiAKIAlvdXRiKExPQ0tfQ09ERSwgaG9zdC0+Y29uZmlnKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHdic2Rfd3JpdGVfY29uZmlnKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QsIHU4IHJlZywgdTggdmFsdWUpCitzdGF0aWMgaW5saW5lIHZvaWQgd2JzZF93cml0ZV9jb25maWcoc3RydWN0IHdic2RfaG9zdCAqaG9zdCwgdTggcmVnLCB1OCB2YWx1ZSkKIHsKIAlCVUdfT04oaG9zdC0+Y29uZmlnID09IDApOwogCkBAIC0xMTMsNyArMTEzLDcgQEAKIAlvdXRiKHZhbHVlLCBob3N0LT5jb25maWcgKyAxKTsKIH0KIAotc3RhdGljIGlubGluZSB1OCB3YnNkX3JlYWRfY29uZmlnKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QsIHU4IHJlZykKK3N0YXRpYyBpbmxpbmUgdTggd2JzZF9yZWFkX2NvbmZpZyhzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0LCB1OCByZWcpCiB7CiAJQlVHX09OKGhvc3QtPmNvbmZpZyA9PSAwKTsKIApAQCAtMTIxLDEzICsxMjEsMTMgQEAKIAlyZXR1cm4gaW5iKGhvc3QtPmNvbmZpZyArIDEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgd2JzZF93cml0ZV9pbmRleChzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0LCB1OCBpbmRleCwgdTggdmFsdWUpCitzdGF0aWMgaW5saW5lIHZvaWQgd2JzZF93cml0ZV9pbmRleChzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0LCB1OCBpbmRleCwgdTggdmFsdWUpCiB7CiAJb3V0YihpbmRleCwgaG9zdC0+YmFzZSArIFdCU0RfSURYUik7CiAJb3V0Yih2YWx1ZSwgaG9zdC0+YmFzZSArIFdCU0RfREFUQVIpOwogfQogCi1zdGF0aWMgaW5saW5lIHU4IHdic2RfcmVhZF9pbmRleChzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0LCB1OCBpbmRleCkKK3N0YXRpYyBpbmxpbmUgdTggd2JzZF9yZWFkX2luZGV4KHN0cnVjdCB3YnNkX2hvc3QgKmhvc3QsIHU4IGluZGV4KQogewogCW91dGIoaW5kZXgsIGhvc3QtPmJhc2UgKyBXQlNEX0lEWFIpOwogCXJldHVybiBpbmIoaG9zdC0+YmFzZSArIFdCU0RfREFUQVIpOwpAQCAtMTM3LDcgKzEzNyw3IEBACiAgKiBDb21tb24gcm91dGluZXMKICAqLwogCi1zdGF0aWMgdm9pZCB3YnNkX2luaXRfZGV2aWNlKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QpCitzdGF0aWMgdm9pZCB3YnNkX2luaXRfZGV2aWNlKHN0cnVjdCB3YnNkX2hvc3QgKmhvc3QpCiB7CiAJdTggc2V0dXAsIGllcjsKIApAQCAtMTk3LDcgKzE5Nyw3IEBACiAJaW5iKGhvc3QtPmJhc2UgKyBXQlNEX0lTUik7CiB9CiAKLXN0YXRpYyB2b2lkIHdic2RfcmVzZXQoc3RydWN0IHdic2RfaG9zdCogaG9zdCkKK3N0YXRpYyB2b2lkIHdic2RfcmVzZXQoc3RydWN0IHdic2RfaG9zdCAqaG9zdCkKIHsKIAl1OCBzZXR1cDsKIApAQCAtMjExLDE0ICsyMTEsMTMgQEAKIAl3YnNkX3dyaXRlX2luZGV4KGhvc3QsIFdCU0RfSURYX1NFVFVQLCBzZXR1cCk7CiB9CiAKLXN0YXRpYyB2b2lkIHdic2RfcmVxdWVzdF9lbmQoc3RydWN0IHdic2RfaG9zdCogaG9zdCwgc3RydWN0IG1tY19yZXF1ZXN0KiBtcnEpCitzdGF0aWMgdm9pZCB3YnNkX3JlcXVlc3RfZW5kKHN0cnVjdCB3YnNkX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQogewogCXVuc2lnbmVkIGxvbmcgZG1hZmxhZ3M7CiAKIAlEQkdGKCJFbmRpbmcgcmVxdWVzdCwgY21kICgleClcbiIsIG1ycS0+Y21kLT5vcGNvZGUpOwogCi0JaWYgKGhvc3QtPmRtYSA+PSAwKQotCXsKKwlpZiAoaG9zdC0+ZG1hID49IDApIHsKIAkJLyoKIAkJICogUmVsZWFzZSBJU0EgRE1BIGNvbnRyb2xsZXIuCiAJCSAqLwpAQCAtMjQ3LDcgKzI0Niw3IEBACiAgKiBTY2F0dGVyL2dhdGhlciBmdW5jdGlvbnMKICAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgd2JzZF9pbml0X3NnKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QsIHN0cnVjdCBtbWNfZGF0YSogZGF0YSkKK3N0YXRpYyBpbmxpbmUgdm9pZCB3YnNkX2luaXRfc2coc3RydWN0IHdic2RfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19kYXRhICpkYXRhKQogewogCS8qCiAJICogR2V0IGluZm8uIGFib3V0IFNHIGxpc3QgZnJvbSBkYXRhIHN0cnVjdHVyZS4KQEAgLTI1OSw3ICsyNTgsNyBAQAogCWhvc3QtPnJlbWFpbiA9IGhvc3QtPmN1cl9zZy0+bGVuZ3RoOwogfQogCi1zdGF0aWMgaW5saW5lIGludCB3YnNkX25leHRfc2coc3RydWN0IHdic2RfaG9zdCogaG9zdCkKK3N0YXRpYyBpbmxpbmUgaW50IHdic2RfbmV4dF9zZyhzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0KQogewogCS8qCiAJICogU2tpcCB0byBuZXh0IFNHIGVudHJ5LgpAQCAtMjcwLDMzICsyNjksMzIgQEAKIAkvKgogCSAqIEFueSBlbnRyaWVzIGxlZnQ/CiAJICovCi0JaWYgKGhvc3QtPm51bV9zZyA+IDApCi0JICB7Ci0JICAgIGhvc3QtPm9mZnNldCA9IDA7Ci0JICAgIGhvc3QtPnJlbWFpbiA9IGhvc3QtPmN1cl9zZy0+bGVuZ3RoOwotCSAgfQorCWlmIChob3N0LT5udW1fc2cgPiAwKSB7CisJCWhvc3QtPm9mZnNldCA9IDA7CisJCWhvc3QtPnJlbWFpbiA9IGhvc3QtPmN1cl9zZy0+bGVuZ3RoOworCX0KIAogCXJldHVybiBob3N0LT5udW1fc2c7CiB9CiAKLXN0YXRpYyBpbmxpbmUgY2hhciogd2JzZF9rbWFwX3NnKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QpCitzdGF0aWMgaW5saW5lIGNoYXIgKndic2Rfa21hcF9zZyhzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0KQogewogCWhvc3QtPm1hcHBlZF9zZyA9IGttYXBfYXRvbWljKGhvc3QtPmN1cl9zZy0+cGFnZSwgS01fQklPX1NSQ19JUlEpICsKIAkJaG9zdC0+Y3VyX3NnLT5vZmZzZXQ7CiAJcmV0dXJuIGhvc3QtPm1hcHBlZF9zZzsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHdic2Rfa3VubWFwX3NnKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QpCitzdGF0aWMgaW5saW5lIHZvaWQgd2JzZF9rdW5tYXBfc2coc3RydWN0IHdic2RfaG9zdCAqaG9zdCkKIHsKIAlrdW5tYXBfYXRvbWljKGhvc3QtPm1hcHBlZF9zZywgS01fQklPX1NSQ19JUlEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgd2JzZF9zZ190b19kbWEoc3RydWN0IHdic2RfaG9zdCogaG9zdCwgc3RydWN0IG1tY19kYXRhKiBkYXRhKQorc3RhdGljIGlubGluZSB2b2lkIHdic2Rfc2dfdG9fZG1hKHN0cnVjdCB3YnNkX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKIHsKIAl1bnNpZ25lZCBpbnQgbGVuLCBpLCBzaXplOwotCXN0cnVjdCBzY2F0dGVybGlzdCogc2c7Ci0JY2hhciogZG1hYnVmID0gaG9zdC0+ZG1hX2J1ZmZlcjsKLQljaGFyKiBzZ2J1ZjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWNoYXIgKmRtYWJ1ZiA9IGhvc3QtPmRtYV9idWZmZXI7CisJY2hhciAqc2didWY7CiAKIAlzaXplID0gaG9zdC0+c2l6ZTsKIApAQCAtMzA4LDggKzMwNiw3IEBACiAJICogYmUgdGhlIGVudGlyZSBsaXN0IHRob3VnaCBzbyBtYWtlIHN1cmUgdGhhdAogCSAqIHdlIGRvIG5vdCB0cmFuc2ZlciB0b28gbXVjaC4KIAkgKi8KLQlmb3IgKGkgPSAwO2kgPCBsZW47aSsrKQotCXsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKIAkJc2didWYgPSBrbWFwX2F0b21pYyhzZ1tpXS5wYWdlLCBLTV9CSU9fU1JDX0lSUSkgKyBzZ1tpXS5vZmZzZXQ7CiAJCWlmIChzaXplIDwgc2dbaV0ubGVuZ3RoKQogCQkJbWVtY3B5KGRtYWJ1Ziwgc2didWYsIHNpemUpOwpAQCAtMzM3LDEyICszMzQsMTIgQEAKIAlob3N0LT5zaXplIC09IHNpemU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB3YnNkX2RtYV90b19zZyhzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0LCBzdHJ1Y3QgbW1jX2RhdGEqIGRhdGEpCitzdGF0aWMgaW5saW5lIHZvaWQgd2JzZF9kbWFfdG9fc2coc3RydWN0IHdic2RfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19kYXRhICpkYXRhKQogewogCXVuc2lnbmVkIGludCBsZW4sIGksIHNpemU7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0KiBzZzsKLQljaGFyKiBkbWFidWYgPSBob3N0LT5kbWFfYnVmZmVyOwotCWNoYXIqIHNnYnVmOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJY2hhciAqZG1hYnVmID0gaG9zdC0+ZG1hX2J1ZmZlcjsKKwljaGFyICpzZ2J1ZjsKIAogCXNpemUgPSBob3N0LT5zaXplOwogCkBAIC0zNTQsOCArMzUxLDcgQEAKIAkgKiBiZSB0aGUgZW50aXJlIGxpc3QgdGhvdWdoIHNvIG1ha2Ugc3VyZSB0aGF0CiAJICogd2UgZG8gbm90IHRyYW5zZmVyIHRvbyBtdWNoLgogCSAqLwotCWZvciAoaSA9IDA7aSA8IGxlbjtpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogCQlzZ2J1ZiA9IGttYXBfYXRvbWljKHNnW2ldLnBhZ2UsIEtNX0JJT19TUkNfSVJRKSArIHNnW2ldLm9mZnNldDsKIAkJaWYgKHNpemUgPCBzZ1tpXS5sZW5ndGgpCiAJCQltZW1jcHkoc2didWYsIGRtYWJ1Ziwgc2l6ZSk7CkBAIC0zODcsNDYgKzM4MywzOCBAQAogICogQ29tbWFuZCBoYW5kbGluZwogICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB3YnNkX2dldF9zaG9ydF9yZXBseShzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0LAotCXN0cnVjdCBtbWNfY29tbWFuZCogY21kKQorc3RhdGljIGlubGluZSB2b2lkIHdic2RfZ2V0X3Nob3J0X3JlcGx5KHN0cnVjdCB3YnNkX2hvc3QgKmhvc3QsCisJCQkJCXN0cnVjdCBtbWNfY29tbWFuZCAqY21kKQogewogCS8qCiAJICogQ29ycmVjdCByZXNwb25zZSB0eXBlPwogCSAqLwotCWlmICh3YnNkX3JlYWRfaW5kZXgoaG9zdCwgV0JTRF9JRFhfUlNQTEVOKSAhPSBXQlNEX1JTUF9TSE9SVCkKLQl7CisJaWYgKHdic2RfcmVhZF9pbmRleChob3N0LCBXQlNEX0lEWF9SU1BMRU4pICE9IFdCU0RfUlNQX1NIT1JUKSB7CiAJCWNtZC0+ZXJyb3IgPSBNTUNfRVJSX0lOVkFMSUQ7CiAJCXJldHVybjsKIAl9CiAKLQljbWQtPnJlc3BbMF0gPQotCQl3YnNkX3JlYWRfaW5kZXgoaG9zdCwgV0JTRF9JRFhfUkVTUDEyKSA8PCAyNDsKLQljbWQtPnJlc3BbMF0gfD0KLQkJd2JzZF9yZWFkX2luZGV4KGhvc3QsIFdCU0RfSURYX1JFU1AxMykgPDwgMTY7Ci0JY21kLT5yZXNwWzBdIHw9Ci0JCXdic2RfcmVhZF9pbmRleChob3N0LCBXQlNEX0lEWF9SRVNQMTQpIDw8IDg7Ci0JY21kLT5yZXNwWzBdIHw9Ci0JCXdic2RfcmVhZF9pbmRleChob3N0LCBXQlNEX0lEWF9SRVNQMTUpIDw8IDA7Ci0JY21kLT5yZXNwWzFdID0KLQkJd2JzZF9yZWFkX2luZGV4KGhvc3QsIFdCU0RfSURYX1JFU1AxNikgPDwgMjQ7CisJY21kLT5yZXNwWzBdICA9IHdic2RfcmVhZF9pbmRleChob3N0LCBXQlNEX0lEWF9SRVNQMTIpIDw8IDI0OworCWNtZC0+cmVzcFswXSB8PSB3YnNkX3JlYWRfaW5kZXgoaG9zdCwgV0JTRF9JRFhfUkVTUDEzKSA8PCAxNjsKKwljbWQtPnJlc3BbMF0gfD0gd2JzZF9yZWFkX2luZGV4KGhvc3QsIFdCU0RfSURYX1JFU1AxNCkgPDwgODsKKwljbWQtPnJlc3BbMF0gfD0gd2JzZF9yZWFkX2luZGV4KGhvc3QsIFdCU0RfSURYX1JFU1AxNSkgPDwgMDsKKwljbWQtPnJlc3BbMV0gID0gd2JzZF9yZWFkX2luZGV4KGhvc3QsIFdCU0RfSURYX1JFU1AxNikgPDwgMjQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB3YnNkX2dldF9sb25nX3JlcGx5KHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QsCi0Jc3RydWN0IG1tY19jb21tYW5kKiBjbWQpCitzdGF0aWMgaW5saW5lIHZvaWQgd2JzZF9nZXRfbG9uZ19yZXBseShzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0LAorCXN0cnVjdCBtbWNfY29tbWFuZCAqY21kKQogewogCWludCBpOwogCiAJLyoKIAkgKiBDb3JyZWN0IHJlc3BvbnNlIHR5cGU/CiAJICovCi0JaWYgKHdic2RfcmVhZF9pbmRleChob3N0LCBXQlNEX0lEWF9SU1BMRU4pICE9IFdCU0RfUlNQX0xPTkcpCi0JeworCWlmICh3YnNkX3JlYWRfaW5kZXgoaG9zdCwgV0JTRF9JRFhfUlNQTEVOKSAhPSBXQlNEX1JTUF9MT05HKSB7CiAJCWNtZC0+ZXJyb3IgPSBNTUNfRVJSX0lOVkFMSUQ7CiAJCXJldHVybjsKIAl9CiAKLQlmb3IgKGkgPSAwO2kgPCA0O2krKykKLQl7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQljbWQtPnJlc3BbaV0gPQogCQkJd2JzZF9yZWFkX2luZGV4KGhvc3QsIFdCU0RfSURYX1JFU1AxICsgaSAqIDQpIDw8IDI0OwogCQljbWQtPnJlc3BbaV0gfD0KQEAgLTQzOCw3ICs0MjYsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgd2JzZF9zZW5kX2NvbW1hbmQoc3RydWN0IHdic2RfaG9zdCogaG9zdCwgc3RydWN0IG1tY19jb21tYW5kKiBjbWQpCitzdGF0aWMgdm9pZCB3YnNkX3NlbmRfY29tbWFuZChzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCkKIHsKIAlpbnQgaTsKIAl1OCBzdGF0dXMsIGlzcjsKQEAgLTQ1Niw3ICs0NDQsNyBAQAogCSAqIFNlbmQgdGhlIGNvbW1hbmQgKENSQyBjYWxjdWxhdGVkIGJ5IGhvc3QpLgogCSAqLwogCW91dGIoY21kLT5vcGNvZGUsIGhvc3QtPmJhc2UgKyBXQlNEX0NNRFIpOwotCWZvciAoaSA9IDM7aSA+PSAwO2ktLSkKKwlmb3IgKGkgPSAzOyBpID49IDA7IGktLSkKIAkJb3V0YigoY21kLT5hcmcgPj4gKGkgKiA4KSkgJiAweGZmLCBob3N0LT5iYXNlICsgV0JTRF9DTURSKTsKIAogCWNtZC0+ZXJyb3IgPSBNTUNfRVJSX05PTkU7CkBAIC00NzEsOCArNDU5LDcgQEAKIAkvKgogCSAqIERvIHdlIGV4cGVjdCBhIHJlcGx5PwogCSAqLwotCWlmICgoY21kLT5mbGFncyAmIE1NQ19SU1BfTUFTSykgIT0gTU1DX1JTUF9OT05FKQotCXsKKwlpZiAoKGNtZC0+ZmxhZ3MgJiBNTUNfUlNQX01BU0spICE9IE1NQ19SU1BfTk9ORSkgewogCQkvKgogCQkgKiBSZWFkIGJhY2sgc3RhdHVzLgogCQkgKi8KQEAgLTQ4OCw4ICs0NzUsNyBAQAogCQllbHNlIGlmICgoY21kLT5mbGFncyAmIE1NQ19SU1BfQ1JDKSAmJiAoaXNyICYgV0JTRF9JTlRfQ1JDKSkKIAkJCWNtZC0+ZXJyb3IgPSBNTUNfRVJSX0JBRENSQzsKIAkJLyogQWxsIG9rICovCi0JCWVsc2UKLQkJeworCQllbHNlIHsKIAkJCWlmICgoY21kLT5mbGFncyAmIE1NQ19SU1BfTUFTSykgPT0gTU1DX1JTUF9TSE9SVCkKIAkJCQl3YnNkX2dldF9zaG9ydF9yZXBseShob3N0LCBjbWQpOwogCQkJZWxzZQpAQCAtNTA0LDEwICs0OTAsMTAgQEAKICAqIERhdGEgZnVuY3Rpb25zCiAgKi8KIAotc3RhdGljIHZvaWQgd2JzZF9lbXB0eV9maWZvKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QpCitzdGF0aWMgdm9pZCB3YnNkX2VtcHR5X2ZpZm8oc3RydWN0IHdic2RfaG9zdCAqaG9zdCkKIHsKLQlzdHJ1Y3QgbW1jX2RhdGEqIGRhdGEgPSBob3N0LT5tcnEtPmNtZC0+ZGF0YTsKLQljaGFyKiBidWZmZXI7CisJc3RydWN0IG1tY19kYXRhICpkYXRhID0gaG9zdC0+bXJxLT5jbWQtPmRhdGE7CisJY2hhciAqYnVmZmVyOwogCWludCBpLCBmc3IsIGZpZm87CiAKIAkvKgpAQCAtNTIyLDggKzUwOCw3IEBACiAJICogRHJhaW4gdGhlIGZpZm8uIFRoaXMgaGFzIGEgdGVuZGVuY3kgdG8gbG9vcCBsb25nZXIKIAkgKiB0aGFuIHRoZSBGSUZPIGxlbmd0aCAodXN1YWxseSBvbmUgYmxvY2spLgogCSAqLwotCXdoaWxlICghKChmc3IgPSBpbmIoaG9zdC0+YmFzZSArIFdCU0RfRlNSKSkgJiBXQlNEX0ZJRk9fRU1QVFkpKQotCXsKKwl3aGlsZSAoISgoZnNyID0gaW5iKGhvc3QtPmJhc2UgKyBXQlNEX0ZTUikpICYgV0JTRF9GSUZPX0VNUFRZKSkgewogCQkvKgogCQkgKiBUaGUgc2l6ZSBmaWVsZCBpbiB0aGUgRlNSIGlzIGJyb2tlbiBzbyB3ZSBoYXZlIHRvCiAJCSAqIGRvIHNvbWUgZ3Vlc3NpbmcuCkBAIC01MzUsOCArNTIwLDcgQEAKIAkJZWxzZQogCQkJZmlmbyA9IDE7CiAKLQkJZm9yIChpID0gMDtpIDwgZmlmbztpKyspCi0JCXsKKwkJZm9yIChpID0gMDsgaSA8IGZpZm87IGkrKykgewogCQkJKmJ1ZmZlciA9IGluYihob3N0LT5iYXNlICsgV0JTRF9ERlIpOwogCQkJYnVmZmVyKys7CiAJCQlob3N0LT5vZmZzZXQrKzsKQEAgLTU0Nyw4ICs1MzEsNyBAQAogCQkJLyoKIAkJCSAqIFRyYW5zZmVyIGRvbmU/CiAJCQkgKi8KLQkJCWlmIChkYXRhLT5ieXRlc194ZmVyZWQgPT0gaG9zdC0+c2l6ZSkKLQkJCXsKKwkJCWlmIChkYXRhLT5ieXRlc194ZmVyZWQgPT0gaG9zdC0+c2l6ZSkgewogCQkJCXdic2Rfa3VubWFwX3NnKGhvc3QpOwogCQkJCXJldHVybjsKIAkJCX0KQEAgLTU1NiwxNSArNTM5LDEzIEBACiAJCQkvKgogCQkJICogRW5kIG9mIHNjYXR0ZXIgbGlzdCBlbnRyeT8KIAkJCSAqLwotCQkJaWYgKGhvc3QtPnJlbWFpbiA9PSAwKQotCQkJeworCQkJaWYgKGhvc3QtPnJlbWFpbiA9PSAwKSB7CiAJCQkJd2JzZF9rdW5tYXBfc2coaG9zdCk7CiAKIAkJCQkvKgogCQkJCSAqIEdldCBuZXh0IGVudHJ5LiBDaGVjayBpZiBsYXN0LgogCQkJCSAqLwotCQkJCWlmICghd2JzZF9uZXh0X3NnKGhvc3QpKQotCQkJCXsKKwkJCQlpZiAoIXdic2RfbmV4dF9zZyhob3N0KSkgewogCQkJCQkvKgogCQkJCQkgKiBXZSBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBwb2ludC4KIAkJCQkJICogSXQgbWVhbnMgdGhhdCB3ZSdyZSB0cnlpbmcgdG8KQEAgLTU5NCwxMCArNTc1LDEwIEBACiAJCXRhc2tsZXRfc2NoZWR1bGUoJmhvc3QtPmZpZm9fdGFza2xldCk7CiB9CiAKLXN0YXRpYyB2b2lkIHdic2RfZmlsbF9maWZvKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QpCitzdGF0aWMgdm9pZCB3YnNkX2ZpbGxfZmlmbyhzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0KQogewotCXN0cnVjdCBtbWNfZGF0YSogZGF0YSA9IGhvc3QtPm1ycS0+Y21kLT5kYXRhOwotCWNoYXIqIGJ1ZmZlcjsKKwlzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEgPSBob3N0LT5tcnEtPmNtZC0+ZGF0YTsKKwljaGFyICpidWZmZXI7CiAJaW50IGksIGZzciwgZmlmbzsKIAogCS8qCkBAIC02MTMsOCArNTk0LDcgQEAKIAkgKiBGaWxsIHRoZSBmaWZvLiBUaGlzIGhhcyBhIHRlbmRlbmN5IHRvIGxvb3AgbG9uZ2VyCiAJICogdGhhbiB0aGUgRklGTyBsZW5ndGggKHVzdWFsbHkgb25lIGJsb2NrKS4KIAkgKi8KLQl3aGlsZSAoISgoZnNyID0gaW5iKGhvc3QtPmJhc2UgKyBXQlNEX0ZTUikpICYgV0JTRF9GSUZPX0ZVTEwpKQotCXsKKwl3aGlsZSAoISgoZnNyID0gaW5iKGhvc3QtPmJhc2UgKyBXQlNEX0ZTUikpICYgV0JTRF9GSUZPX0ZVTEwpKSB7CiAJCS8qCiAJCSAqIFRoZSBzaXplIGZpZWxkIGluIHRoZSBGU1IgaXMgYnJva2VuIHNvIHdlIGhhdmUgdG8KIAkJICogZG8gc29tZSBndWVzc2luZy4KQEAgLTYyNiw4ICs2MDYsNyBAQAogCQllbHNlCiAJCQlmaWZvID0gMTU7CiAKLQkJZm9yIChpID0gMTY7aSA+IGZpZm87aS0tKQotCQl7CisJCWZvciAoaSA9IDE2OyBpID4gZmlmbzsgaS0tKSB7CiAJCQlvdXRiKCpidWZmZXIsIGhvc3QtPmJhc2UgKyBXQlNEX0RGUik7CiAJCQlidWZmZXIrKzsKIAkJCWhvc3QtPm9mZnNldCsrOwpAQCAtNjM4LDggKzYxNyw3IEBACiAJCQkvKgogCQkJICogVHJhbnNmZXIgZG9uZT8KIAkJCSAqLwotCQkJaWYgKGRhdGEtPmJ5dGVzX3hmZXJlZCA9PSBob3N0LT5zaXplKQotCQkJeworCQkJaWYgKGRhdGEtPmJ5dGVzX3hmZXJlZCA9PSBob3N0LT5zaXplKSB7CiAJCQkJd2JzZF9rdW5tYXBfc2coaG9zdCk7CiAJCQkJcmV0dXJuOwogCQkJfQpAQCAtNjQ3LDE1ICs2MjUsMTMgQEAKIAkJCS8qCiAJCQkgKiBFbmQgb2Ygc2NhdHRlciBsaXN0IGVudHJ5PwogCQkJICovCi0JCQlpZiAoaG9zdC0+cmVtYWluID09IDApCi0JCQl7CisJCQlpZiAoaG9zdC0+cmVtYWluID09IDApIHsKIAkJCQl3YnNkX2t1bm1hcF9zZyhob3N0KTsKIAogCQkJCS8qCiAJCQkJICogR2V0IG5leHQgZW50cnkuIENoZWNrIGlmIGxhc3QuCiAJCQkJICovCi0JCQkJaWYgKCF3YnNkX25leHRfc2coaG9zdCkpCi0JCQkJeworCQkJCWlmICghd2JzZF9uZXh0X3NnKGhvc3QpKSB7CiAJCQkJCS8qCiAJCQkJCSAqIFdlIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIHBvaW50LgogCQkJCQkgKiBJdCBtZWFucyB0aGF0IHdlJ3JlIHRyeWluZyB0bwpAQCAtNjg0LDcgKzY2MCw3IEBACiAJdGFza2xldF9zY2hlZHVsZSgmaG9zdC0+Zmlmb190YXNrbGV0KTsKIH0KIAotc3RhdGljIHZvaWQgd2JzZF9wcmVwYXJlX2RhdGEoc3RydWN0IHdic2RfaG9zdCogaG9zdCwgc3RydWN0IG1tY19kYXRhKiBkYXRhKQorc3RhdGljIHZvaWQgd2JzZF9wcmVwYXJlX2RhdGEoc3RydWN0IHdic2RfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19kYXRhICpkYXRhKQogewogCXUxNiBibGtzaXplOwogCXU4IHNldHVwOwpAQCAtNzA2LDggKzY4MiwxMCBAQAogCSAqLwogCWlmIChkYXRhLT50aW1lb3V0X25zID4gMTI3MDAwMDAwKQogCQl3YnNkX3dyaXRlX2luZGV4KGhvc3QsIFdCU0RfSURYX1RBQUMsIDEyNyk7Ci0JZWxzZQotCQl3YnNkX3dyaXRlX2luZGV4KGhvc3QsIFdCU0RfSURYX1RBQUMsIGRhdGEtPnRpbWVvdXRfbnMvMTAwMDAwMCk7CisJZWxzZSB7CisJCXdic2Rfd3JpdGVfaW5kZXgoaG9zdCwgV0JTRF9JRFhfVEFBQywKKwkJCWRhdGEtPnRpbWVvdXRfbnMgLyAxMDAwMDAwKTsKKwl9CiAKIAlpZiAoZGF0YS0+dGltZW91dF9jbGtzID4gMjU1KQogCQl3YnNkX3dyaXRlX2luZGV4KGhvc3QsIFdCU0RfSURYX05TQUMsIDI1NSk7CkBAIC03MjIsMjMgKzcwMCwxOCBAQAogCSAqIFNwYWNlIGZvciBDUkMgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgc2l6ZS4KIAkgKiBUd28gYnl0ZXMgYXJlIG5lZWRlZCBmb3IgZWFjaCBkYXRhIGxpbmUuCiAJICovCi0JaWYgKGhvc3QtPmJ1c193aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzEpCi0JeworCWlmIChob3N0LT5idXNfd2lkdGggPT0gTU1DX0JVU19XSURUSF8xKSB7CiAJCWJsa3NpemUgPSAoMSA8PCBkYXRhLT5ibGtzel9iaXRzKSArIDI7CiAKIAkJd2JzZF93cml0ZV9pbmRleChob3N0LCBXQlNEX0lEWF9QQlNNU0IsIChibGtzaXplID4+IDQpICYgMHhGMCk7CiAJCXdic2Rfd3JpdGVfaW5kZXgoaG9zdCwgV0JTRF9JRFhfUEJTTFNCLCBibGtzaXplICYgMHhGRik7Ci0JfQotCWVsc2UgaWYgKGhvc3QtPmJ1c193aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzQpCi0JeworCX0gZWxzZSBpZiAoaG9zdC0+YnVzX3dpZHRoID09IE1NQ19CVVNfV0lEVEhfNCkgewogCQlibGtzaXplID0gKDEgPDwgZGF0YS0+Ymxrc3pfYml0cykgKyAyICogNDsKIAotCQl3YnNkX3dyaXRlX2luZGV4KGhvc3QsIFdCU0RfSURYX1BCU01TQiwgKChibGtzaXplID4+IDQpICYgMHhGMCkKLQkJCXwgV0JTRF9EQVRBX1dJRFRIKTsKKwkJd2JzZF93cml0ZV9pbmRleChob3N0LCBXQlNEX0lEWF9QQlNNU0IsCisJCQkoKGJsa3NpemUgPj4gNCkgJiAweEYwKSB8IFdCU0RfREFUQV9XSURUSCk7CiAJCXdic2Rfd3JpdGVfaW5kZXgoaG9zdCwgV0JTRF9JRFhfUEJTTFNCLCBibGtzaXplICYgMHhGRik7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJZGF0YS0+ZXJyb3IgPSBNTUNfRVJSX0lOVkFMSUQ7CiAJCXJldHVybjsKIAl9CkBAIC03NTUsMTQgKzcyOCwxMiBAQAogCS8qCiAJICogRE1BIHRyYW5zZmVyPwogCSAqLwotCWlmIChob3N0LT5kbWEgPj0gMCkKLQl7CisJaWYgKGhvc3QtPmRtYSA+PSAwKSB7CiAJCS8qCiAJCSAqIFRoZSBidWZmZXIgZm9yIERNQSBpcyBvbmx5IDY0IGtCLgogCQkgKi8KIAkJQlVHX09OKGhvc3QtPnNpemUgPiAweDEwMDAwKTsKLQkJaWYgKGhvc3QtPnNpemUgPiAweDEwMDAwKQotCQl7CisJCWlmIChob3N0LT5zaXplID4gMHgxMDAwMCkgewogCQkJZGF0YS0+ZXJyb3IgPSBNTUNfRVJSX0lOVkFMSUQ7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTc5NCw5ICs3NjUsNyBAQAogCQkgKiBFbmFibGUgRE1BIG9uIHRoZSBob3N0LgogCQkgKi8KIAkJd2JzZF93cml0ZV9pbmRleChob3N0LCBXQlNEX0lEWF9ETUEsIFdCU0RfRE1BX0VOQUJMRSk7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJLyoKIAkJICogVGhpcyBmbGFnIGlzIHVzZWQgdG8ga2VlcCBwcmludGsKIAkJICogb3V0cHV0IHRvIGEgbWluaW11bS4KQEAgLTgxNywxMyArNzg2LDEwIEBACiAJCSAqIFNldCB1cCBGSUZPIHRocmVzaG9sZCBsZXZlbHMgKGFuZCBmaWxsCiAJCSAqIGJ1ZmZlciBpZiBkb2luZyBhIHdyaXRlKS4KIAkJICovCi0JCWlmIChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1JFQUQpCi0JCXsKKwkJaWYgKGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfUkVBRCkgewogCQkJd2JzZF93cml0ZV9pbmRleChob3N0LCBXQlNEX0lEWF9GSUZPRU4sCiAJCQkJV0JTRF9GSUZPRU5fRlVMTCB8IDgpOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJd2JzZF93cml0ZV9pbmRleChob3N0LCBXQlNEX0lEWF9GSUZPRU4sCiAJCQkJV0JTRF9GSUZPRU5fRU1QVFkgfCA4KTsKIAkJCXdic2RfZmlsbF9maWZvKGhvc3QpOwpAQCAtODMzLDcgKzc5OSw3IEBACiAJZGF0YS0+ZXJyb3IgPSBNTUNfRVJSX05PTkU7CiB9CiAKLXN0YXRpYyB2b2lkIHdic2RfZmluaXNoX2RhdGEoc3RydWN0IHdic2RfaG9zdCogaG9zdCwgc3RydWN0IG1tY19kYXRhKiBkYXRhKQorc3RhdGljIHZvaWQgd2JzZF9maW5pc2hfZGF0YShzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEpCiB7CiAJdW5zaWduZWQgbG9uZyBkbWFmbGFnczsKIAlpbnQgY291bnQ7CkBAIC04NTEsMTYgKzgxNywxNCBAQAogCSAqIFdhaXQgZm9yIHRoZSBjb250cm9sbGVyIHRvIGxlYXZlIGRhdGEKIAkgKiB0cmFuc2ZlciBzdGF0ZS4KIAkgKi8KLQlkbwotCXsKKwlkbyB7CiAJCXN0YXR1cyA9IHdic2RfcmVhZF9pbmRleChob3N0LCBXQlNEX0lEWF9TVEFUVVMpOwogCX0gd2hpbGUgKHN0YXR1cyAmIChXQlNEX0JMT0NLX1JFQUQgfCBXQlNEX0JMT0NLX1dSSVRFKSk7CiAKIAkvKgogCSAqIERNQSB0cmFuc2Zlcj8KIAkgKi8KLQlpZiAoaG9zdC0+ZG1hID49IDApCi0JeworCWlmIChob3N0LT5kbWEgPj0gMCkgewogCQkvKgogCQkgKiBEaXNhYmxlIERNQSBvbiB0aGUgaG9zdC4KIAkJICovCkBAIC04NzgsMTYgKzg0MiwxMyBAQAogCQkvKgogCQkgKiBBbnkgbGVmdG92ZXIgZGF0YT8KIAkJICovCi0JCWlmIChjb3VudCkKLQkJeworCQlpZiAoY291bnQpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEluY29tcGxldGUgRE1BIHRyYW5zZmVyLiAiCiAJCQkJIiVkIGJ5dGVzIGxlZnQuXG4iLAogCQkJCW1tY19ob3N0bmFtZShob3N0LT5tbWMpLCBjb3VudCk7CiAKIAkJCWRhdGEtPmVycm9yID0gTU1DX0VSUl9GQUlMRUQ7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQkvKgogCQkJICogVHJhbnNmZXIgZGF0YSBmcm9tIERNQSBidWZmZXIgdG8KIAkJCSAqIFNHIGxpc3QuCkBAIC05MTAsMTAgKzg3MSwxMCBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIHdic2RfcmVxdWVzdChzdHJ1Y3QgbW1jX2hvc3QqIG1tYywgc3RydWN0IG1tY19yZXF1ZXN0KiBtcnEpCitzdGF0aWMgdm9pZCB3YnNkX3JlcXVlc3Qoc3RydWN0IG1tY19ob3N0ICptbWMsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQogewotCXN0cnVjdCB3YnNkX2hvc3QqIGhvc3QgPSBtbWNfcHJpdihtbWMpOwotCXN0cnVjdCBtbWNfY29tbWFuZCogY21kOworCXN0cnVjdCB3YnNkX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOworCXN0cnVjdCBtbWNfY29tbWFuZCAqY21kOwogCiAJLyoKIAkgKiBEaXNhYmxlIHRhc2tsZXRzIHRvIGF2b2lkIGEgZGVhZGxvY2suCkBAIC05MzAsOCArODkxLDcgQEAKIAkgKiBJZiB0aGVyZSBpcyBubyBjYXJkIGluIHRoZSBzbG90IHRoZW4KIAkgKiB0aW1lb3V0IGltbWVkaWF0bHkuCiAJICovCi0JaWYgKCEoaG9zdC0+ZmxhZ3MgJiBXQlNEX0ZDQVJEX1BSRVNFTlQpKQotCXsKKwlpZiAoIShob3N0LT5mbGFncyAmIFdCU0RfRkNBUkRfUFJFU0VOVCkpIHsKIAkJY21kLT5lcnJvciA9IE1NQ19FUlJfVElNRU9VVDsKIAkJZ290byBkb25lOwogCX0KQEAgLTkzOSw4ICs4OTksNyBAQAogCS8qCiAJICogRG9lcyB0aGUgcmVxdWVzdCBpbmNsdWRlIGRhdGE/CiAJICovCi0JaWYgKGNtZC0+ZGF0YSkKLQl7CisJaWYgKGNtZC0+ZGF0YSkgewogCQl3YnNkX3ByZXBhcmVfZGF0YShob3N0LCBjbWQtPmRhdGEpOwogCiAJCWlmIChjbWQtPmRhdGEtPmVycm9yICE9IE1NQ19FUlJfTk9ORSkKQEAgLTk1NCw4ICs5MTMsNyBAQAogCSAqIHdpbGwgYmUgZmluaXNoZWQgYWZ0ZXIgdGhlIGRhdGEgaGFzCiAJICogdHJhbnNmZXJlZC4KIAkgKi8KLQlpZiAoY21kLT5kYXRhICYmIChjbWQtPmVycm9yID09IE1NQ19FUlJfTk9ORSkpCi0JeworCWlmIChjbWQtPmRhdGEgJiYgKGNtZC0+ZXJyb3IgPT0gTU1DX0VSUl9OT05FKSkgewogCQkvKgogCQkgKiBEaXJ0eSBmaXggZm9yIGhhcmR3YXJlIGJ1Zy4KIAkJICovCkBAIC05NzMsMTQgKzkzMSwxNCBAQAogCXNwaW5fdW5sb2NrX2JoKCZob3N0LT5sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgd2JzZF9zZXRfaW9zKHN0cnVjdCBtbWNfaG9zdCogbW1jLCBzdHJ1Y3QgbW1jX2lvcyogaW9zKQorc3RhdGljIHZvaWQgd2JzZF9zZXRfaW9zKHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBzdHJ1Y3QgbW1jX2lvcyAqaW9zKQogewotCXN0cnVjdCB3YnNkX2hvc3QqIGhvc3QgPSBtbWNfcHJpdihtbWMpOworCXN0cnVjdCB3YnNkX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOwogCXU4IGNsaywgc2V0dXAsIHB3cjsKIAogCURCR0YoImNsb2NrICV1SHogYnVzbW9kZSAldSBwb3dlcm1vZGUgJXUgY3MgJXUgVmRkICV1IHdpZHRoICV1XG4iLAotCSAgICAgaW9zLT5jbG9jaywgaW9zLT5idXNfbW9kZSwgaW9zLT5wb3dlcl9tb2RlLCBpb3MtPmNoaXBfc2VsZWN0LAotCSAgICAgaW9zLT52ZGQsIGlvcy0+YnVzX3dpZHRoKTsKKwkJaW9zLT5jbG9jaywgaW9zLT5idXNfbW9kZSwgaW9zLT5wb3dlcl9tb2RlLCBpb3MtPmNoaXBfc2VsZWN0LAorCQlpb3MtPnZkZCwgaW9zLT5idXNfd2lkdGgpOwogCiAJc3Bpbl9sb2NrX2JoKCZob3N0LT5sb2NrKTsKIApAQCAtMTAwNCw4ICs5NjIsNyBAQAogCSAqIE9ubHkgd3JpdGUgdG8gdGhlIGNsb2NrIHJlZ2lzdGVyIHdoZW4KIAkgKiB0aGVyZSBpcyBhbiBhY3R1YWwgY2hhbmdlLgogCSAqLwotCWlmIChjbGsgIT0gaG9zdC0+Y2xrKQotCXsKKwlpZiAoY2xrICE9IGhvc3QtPmNsaykgewogCQl3YnNkX3dyaXRlX2luZGV4KGhvc3QsIFdCU0RfSURYX0NMSywgY2xrKTsKIAkJaG9zdC0+Y2xrID0gY2xrOwogCX0KQEAgLTEwMTMsOCArOTcwLDcgQEAKIAkvKgogCSAqIFBvd2VyIHVwIGNhcmQuCiAJICovCi0JaWYgKGlvcy0+cG93ZXJfbW9kZSAhPSBNTUNfUE9XRVJfT0ZGKQotCXsKKwlpZiAoaW9zLT5wb3dlcl9tb2RlICE9IE1NQ19QT1dFUl9PRkYpIHsKIAkJcHdyID0gaW5iKGhvc3QtPmJhc2UgKyBXQlNEX0NTUik7CiAJCXB3ciAmPSB+V0JTRF9QT1dFUl9OOwogCQlvdXRiKHB3ciwgaG9zdC0+YmFzZSArIFdCU0RfQ1NSKTsKQEAgLTEwMjYsMjMgKzk4MiwxOSBAQAogCSAqIHRoYXQgbmVlZHMgdG8gYmUgZGlzYWJsZWQuCiAJICovCiAJc2V0dXAgPSB3YnNkX3JlYWRfaW5kZXgoaG9zdCwgV0JTRF9JRFhfU0VUVVApOwotCWlmIChpb3MtPmNoaXBfc2VsZWN0ID09IE1NQ19DU19ISUdIKQotCXsKKwlpZiAoaW9zLT5jaGlwX3NlbGVjdCA9PSBNTUNfQ1NfSElHSCkgewogCQlCVUdfT04oaW9zLT5idXNfd2lkdGggIT0gTU1DX0JVU19XSURUSF8xKTsKIAkJc2V0dXAgfD0gV0JTRF9EQVQzX0g7CiAJCWhvc3QtPmZsYWdzIHw9IFdCU0RfRklHTk9SRV9ERVRFQ1Q7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChzZXR1cCAmIFdCU0RfREFUM19IKQotCQl7CisJfSBlbHNlIHsKKwkJaWYgKHNldHVwICYgV0JTRF9EQVQzX0gpIHsKIAkJCXNldHVwICY9IH5XQlNEX0RBVDNfSDsKIAogCQkJLyoKIAkJCSAqIFdlIGNhbm5vdCByZXN1bWUgY2FyZCBkZXRlY3Rpb24gaW1tZWRpYXRseQogCQkJICogYmVjYXVzZSBvZiBjYXBhY2l0YW5jZSBhbmQgZGVsYXlzIGluIHRoZSBjaGlwLgogCQkJICovCi0JCQltb2RfdGltZXIoJmhvc3QtPmlnbm9yZV90aW1lciwgamlmZmllcyArIEhaLzEwMCk7CisJCQltb2RfdGltZXIoJmhvc3QtPmlnbm9yZV90aW1lciwgamlmZmllcyArIEhaIC8gMTAwKTsKIAkJfQogCX0KIAl3YnNkX3dyaXRlX2luZGV4KGhvc3QsIFdCU0RfSURYX1NFVFVQLCBzZXR1cCk7CkBAIC0xMDU2LDkgKzEwMDgsOSBAQAogCXNwaW5fdW5sb2NrX2JoKCZob3N0LT5sb2NrKTsKIH0KIAotc3RhdGljIGludCB3YnNkX2dldF9ybyhzdHJ1Y3QgbW1jX2hvc3QqIG1tYykKK3N0YXRpYyBpbnQgd2JzZF9nZXRfcm8oc3RydWN0IG1tY19ob3N0ICptbWMpCiB7Ci0Jc3RydWN0IHdic2RfaG9zdCogaG9zdCA9IG1tY19wcml2KG1tYyk7CisJc3RydWN0IHdic2RfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CiAJdTggY3NyOwogCiAJc3Bpbl9sb2NrX2JoKCZob3N0LT5sb2NrKTsKQEAgLTEwOTYsNyArMTA0OCw3IEBACiAKIHN0YXRpYyB2b2lkIHdic2RfcmVzZXRfaWdub3JlKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0ID0gKHN0cnVjdCB3YnNkX2hvc3QqKWRhdGE7CisJc3RydWN0IHdic2RfaG9zdCAqaG9zdCA9IChzdHJ1Y3Qgd2JzZF9ob3N0ICopZGF0YTsKIAogCUJVR19PTihob3N0ID09IE5VTEwpOwogCkBAIC0xMTE5LDcgKzEwNzEsNyBAQAogICogVGFza2xldHMKICAqLwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBtbWNfZGF0YSogd2JzZF9nZXRfZGF0YShzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0KQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbW1jX2RhdGEgKndic2RfZ2V0X2RhdGEoc3RydWN0IHdic2RfaG9zdCAqaG9zdCkKIHsKIAlXQVJOX09OKCFob3N0LT5tcnEpOwogCWlmICghaG9zdC0+bXJxKQpAQCAtMTEzOCwxNCArMTA5MCwxMyBAQAogCiBzdGF0aWMgdm9pZCB3YnNkX3Rhc2tsZXRfY2FyZCh1bnNpZ25lZCBsb25nIHBhcmFtKQogewotCXN0cnVjdCB3YnNkX2hvc3QqIGhvc3QgPSAoc3RydWN0IHdic2RfaG9zdCopcGFyYW07CisJc3RydWN0IHdic2RfaG9zdCAqaG9zdCA9IChzdHJ1Y3Qgd2JzZF9ob3N0ICopcGFyYW07CiAJdTggY3NyOwogCWludCBkZWxheSA9IC0xOwogCiAJc3Bpbl9sb2NrKCZob3N0LT5sb2NrKTsKIAotCWlmIChob3N0LT5mbGFncyAmIFdCU0RfRklHTk9SRV9ERVRFQ1QpCi0JeworCWlmIChob3N0LT5mbGFncyAmIFdCU0RfRklHTk9SRV9ERVRFQ1QpIHsKIAkJc3Bpbl91bmxvY2soJmhvc3QtPmxvY2spOwogCQlyZXR1cm47CiAJfQpAQCAtMTE1MywyMyArMTEwNCwxOCBAQAogCWNzciA9IGluYihob3N0LT5iYXNlICsgV0JTRF9DU1IpOwogCVdBUk5fT04oY3NyID09IDB4ZmYpOwogCi0JaWYgKGNzciAmIFdCU0RfQ0FSRFBSRVNFTlQpCi0JewotCQlpZiAoIShob3N0LT5mbGFncyAmIFdCU0RfRkNBUkRfUFJFU0VOVCkpCi0JCXsKKwlpZiAoY3NyICYgV0JTRF9DQVJEUFJFU0VOVCkgeworCQlpZiAoIShob3N0LT5mbGFncyAmIFdCU0RfRkNBUkRfUFJFU0VOVCkpIHsKIAkJCURCRygiQ2FyZCBpbnNlcnRlZFxuIik7CiAJCQlob3N0LT5mbGFncyB8PSBXQlNEX0ZDQVJEX1BSRVNFTlQ7CiAKIAkJCWRlbGF5ID0gNTAwOwogCQl9Ci0JfQotCWVsc2UgaWYgKGhvc3QtPmZsYWdzICYgV0JTRF9GQ0FSRF9QUkVTRU5UKQotCXsKKwl9IGVsc2UgaWYgKGhvc3QtPmZsYWdzICYgV0JTRF9GQ0FSRF9QUkVTRU5UKSB7CiAJCURCRygiQ2FyZCByZW1vdmVkXG4iKTsKIAkJaG9zdC0+ZmxhZ3MgJj0gfldCU0RfRkNBUkRfUFJFU0VOVDsKIAotCQlpZiAoaG9zdC0+bXJxKQotCQl7CisJCWlmIChob3N0LT5tcnEpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhcmQgcmVtb3ZlZCBkdXJpbmcgdHJhbnNmZXIhXG4iLAogCQkJCW1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKIAkJCXdic2RfcmVzZXQoaG9zdCk7CkBAIC0xMTkzLDggKzExMzksOCBAQAogCiBzdGF0aWMgdm9pZCB3YnNkX3Rhc2tsZXRfZmlmbyh1bnNpZ25lZCBsb25nIHBhcmFtKQogewotCXN0cnVjdCB3YnNkX2hvc3QqIGhvc3QgPSAoc3RydWN0IHdic2RfaG9zdCopcGFyYW07Ci0Jc3RydWN0IG1tY19kYXRhKiBkYXRhOworCXN0cnVjdCB3YnNkX2hvc3QgKmhvc3QgPSAoc3RydWN0IHdic2RfaG9zdCAqKXBhcmFtOworCXN0cnVjdCBtbWNfZGF0YSAqZGF0YTsKIAogCXNwaW5fbG9jaygmaG9zdC0+bG9jayk7CiAKQEAgLTEyMTMsOCArMTE1OSw3IEBACiAJLyoKIAkgKiBEb25lPwogCSAqLwotCWlmIChob3N0LT5zaXplID09IGRhdGEtPmJ5dGVzX3hmZXJlZCkKLQl7CisJaWYgKGhvc3QtPnNpemUgPT0gZGF0YS0+Ynl0ZXNfeGZlcmVkKSB7CiAJCXdic2Rfd3JpdGVfaW5kZXgoaG9zdCwgV0JTRF9JRFhfRklGT0VOLCAwKTsKIAkJdGFza2xldF9zY2hlZHVsZSgmaG9zdC0+ZmluaXNoX3Rhc2tsZXQpOwogCX0KQEAgLTEyMjUsOCArMTE3MCw4IEBACiAKIHN0YXRpYyB2b2lkIHdic2RfdGFza2xldF9jcmModW5zaWduZWQgbG9uZyBwYXJhbSkKIHsKLQlzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0ID0gKHN0cnVjdCB3YnNkX2hvc3QqKXBhcmFtOwotCXN0cnVjdCBtbWNfZGF0YSogZGF0YTsKKwlzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0ID0gKHN0cnVjdCB3YnNkX2hvc3QgKilwYXJhbTsKKwlzdHJ1Y3QgbW1jX2RhdGEgKmRhdGE7CiAKIAlzcGluX2xvY2soJmhvc3QtPmxvY2spOwogCkBAIC0xMjQ5LDggKzExOTQsOCBAQAogCiBzdGF0aWMgdm9pZCB3YnNkX3Rhc2tsZXRfdGltZW91dCh1bnNpZ25lZCBsb25nIHBhcmFtKQogewotCXN0cnVjdCB3YnNkX2hvc3QqIGhvc3QgPSAoc3RydWN0IHdic2RfaG9zdCopcGFyYW07Ci0Jc3RydWN0IG1tY19kYXRhKiBkYXRhOworCXN0cnVjdCB3YnNkX2hvc3QgKmhvc3QgPSAoc3RydWN0IHdic2RfaG9zdCAqKXBhcmFtOworCXN0cnVjdCBtbWNfZGF0YSAqZGF0YTsKIAogCXNwaW5fbG9jaygmaG9zdC0+bG9jayk7CiAKQEAgLTEyNzMsOCArMTIxOCw4IEBACiAKIHN0YXRpYyB2b2lkIHdic2RfdGFza2xldF9maW5pc2godW5zaWduZWQgbG9uZyBwYXJhbSkKIHsKLQlzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0ID0gKHN0cnVjdCB3YnNkX2hvc3QqKXBhcmFtOwotCXN0cnVjdCBtbWNfZGF0YSogZGF0YTsKKwlzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0ID0gKHN0cnVjdCB3YnNkX2hvc3QgKilwYXJhbTsKKwlzdHJ1Y3QgbW1jX2RhdGEgKmRhdGE7CiAKIAlzcGluX2xvY2soJmhvc3QtPmxvY2spOwogCkBAIC0xMjk0LDE0ICsxMjM5LDEzIEBACiAKIHN0YXRpYyB2b2lkIHdic2RfdGFza2xldF9ibG9jayh1bnNpZ25lZCBsb25nIHBhcmFtKQogewotCXN0cnVjdCB3YnNkX2hvc3QqIGhvc3QgPSAoc3RydWN0IHdic2RfaG9zdCopcGFyYW07Ci0Jc3RydWN0IG1tY19kYXRhKiBkYXRhOworCXN0cnVjdCB3YnNkX2hvc3QgKmhvc3QgPSAoc3RydWN0IHdic2RfaG9zdCAqKXBhcmFtOworCXN0cnVjdCBtbWNfZGF0YSAqZGF0YTsKIAogCXNwaW5fbG9jaygmaG9zdC0+bG9jayk7CiAKIAlpZiAoKHdic2RfcmVhZF9pbmRleChob3N0LCBXQlNEX0lEWF9DUkNTVEFUVVMpICYgV0JTRF9DUkNfTUFTSykgIT0KLQkJV0JTRF9DUkNfT0spCi0JeworCQlXQlNEX0NSQ19PSykgewogCQlkYXRhID0gd2JzZF9nZXRfZGF0YShob3N0KTsKIAkJaWYgKCFkYXRhKQogCQkJZ290byBlbmQ7CkBAIC0xMzIzLDcgKzEyNjcsNyBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3Qgd2JzZF9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0ID0gZGV2X2lkOworCXN0cnVjdCB3YnNkX2hvc3QgKmhvc3QgPSBkZXZfaWQ7CiAJaW50IGlzcjsKIAogCWlzciA9IGluYihob3N0LT5iYXNlICsgV0JTRF9JU1IpOwpAQCAtMTM2NSwxMCArMTMwOSwxMCBAQAogICogQWxsb2NhdGUvZnJlZSBNTUMgc3RydWN0dXJlLgogICovCiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHdic2RfYWxsb2NfbW1jKHN0cnVjdCBkZXZpY2UqIGRldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IHdic2RfYWxsb2NfbW1jKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgbW1jX2hvc3QqIG1tYzsKLQlzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0OworCXN0cnVjdCBtbWNfaG9zdCAqbW1jOworCXN0cnVjdCB3YnNkX2hvc3QgKmhvc3Q7CiAKIAkvKgogCSAqIEFsbG9jYXRlIE1NQyBzdHJ1Y3R1cmUuCkBAIC0xMzg4LDcgKzEzMzIsNyBAQAogCW1tYy0+b3BzID0gJndic2Rfb3BzOwogCW1tYy0+Zl9taW4gPSAzNzUwMDA7CiAJbW1jLT5mX21heCA9IDI0MDAwMDAwOwotCW1tYy0+b2NyX2F2YWlsID0gTU1DX1ZERF8zMl8zM3xNTUNfVkREXzMzXzM0OworCW1tYy0+b2NyX2F2YWlsID0gTU1DX1ZERF8zMl8zMyB8IE1NQ19WRERfMzNfMzQ7CiAJbW1jLT5jYXBzID0gTU1DX0NBUF80X0JJVF9EQVRBOwogCiAJc3Bpbl9sb2NrX2luaXQoJmhvc3QtPmxvY2spOwpAQCAtMTQyNCwxMCArMTM2OCwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgd2JzZF9mcmVlX21tYyhzdHJ1Y3QgZGV2aWNlKiBkZXYpCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgd2JzZF9mcmVlX21tYyhzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG1tY19ob3N0KiBtbWM7Ci0Jc3RydWN0IHdic2RfaG9zdCogaG9zdDsKKwlzdHJ1Y3QgbW1jX2hvc3QgKm1tYzsKKwlzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0OwogCiAJbW1jID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaWYgKCFtbWMpCkBAIC0xNDQ3LDcgKzEzOTEsNyBAQAogICogU2NhbiBmb3Iga25vd24gY2hpcCBpZDpzCiAgKi8KIAotc3RhdGljIGludCBfX2RldmluaXQgd2JzZF9zY2FuKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QpCitzdGF0aWMgaW50IF9fZGV2aW5pdCB3YnNkX3NjYW4oc3RydWN0IHdic2RfaG9zdCAqaG9zdCkKIHsKIAlpbnQgaSwgaiwgazsKIAlpbnQgaWQ7CkBAIC0xNDU2LDEzICsxNDAwLDExIEBACiAJICogSXRlcmF0ZSB0aHJvdWdoIGFsbCBwb3J0cywgYWxsIGNvZGVzIHRvCiAJICogZmluZCBoYXJkd2FyZSB0aGF0IGlzIGluIG91ciBrbm93biBsaXN0LgogCSAqLwotCWZvciAoaSA9IDA7aSA8IHNpemVvZihjb25maWdfcG9ydHMpL3NpemVvZihpbnQpO2krKykKLQl7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29uZmlnX3BvcnRzKTsgaSsrKSB7CiAJCWlmICghcmVxdWVzdF9yZWdpb24oY29uZmlnX3BvcnRzW2ldLCAyLCBEUklWRVJfTkFNRSkpCiAJCQljb250aW51ZTsKIAotCQlmb3IgKGogPSAwO2ogPCBzaXplb2YodW5sb2NrX2NvZGVzKS9zaXplb2YoaW50KTtqKyspCi0JCXsKKwkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUodW5sb2NrX2NvZGVzKTsgaisrKSB7CiAJCQlpZCA9IDB4RkZGRjsKIAogCQkJaG9zdC0+Y29uZmlnID0gY29uZmlnX3BvcnRzW2ldOwpAQCAtMTQ3OCwxOCArMTQyMCwxNSBAQAogCiAJCQl3YnNkX2xvY2tfY29uZmlnKGhvc3QpOwogCi0JCQlmb3IgKGsgPSAwO2sgPCBzaXplb2YodmFsaWRfaWRzKS9zaXplb2YoaW50KTtrKyspCi0JCQl7Ci0JCQkJaWYgKGlkID09IHZhbGlkX2lkc1trXSkKLQkJCQl7CisJCQlmb3IgKGsgPSAwOyBrIDwgQVJSQVlfU0laRSh2YWxpZF9pZHMpOyBrKyspIHsKKwkJCQlpZiAoaWQgPT0gdmFsaWRfaWRzW2tdKSB7CiAJCQkJCWhvc3QtPmNoaXBfaWQgPSBpZDsKIAogCQkJCQlyZXR1cm4gMDsKIAkJCQl9CiAJCQl9CiAKLQkJCWlmIChpZCAhPSAweEZGRkYpCi0JCQl7CisJCQlpZiAoaWQgIT0gMHhGRkZGKSB7CiAJCQkJREJHKCJVbmtub3duIGhhcmR3YXJlIChpZCAleCkgZm91bmQgYXQgJXhcbiIsCiAJCQkJCWlkLCBjb25maWdfcG9ydHNbaV0pOwogCQkJfQpAQCAtMTUwOCw3ICsxNDQ3LDcgQEAKICAqIEFsbG9jYXRlL2ZyZWUgaW8gcG9ydCByYW5nZXMKICAqLwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCB3YnNkX3JlcXVlc3RfcmVnaW9uKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QsIGludCBiYXNlKQorc3RhdGljIGludCBfX2RldmluaXQgd2JzZF9yZXF1ZXN0X3JlZ2lvbihzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0LCBpbnQgYmFzZSkKIHsKIAlpZiAoaW8gJiAweDcpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTUyMSw3ICsxNDYwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgX19kZXZleGl0IHdic2RfcmVsZWFzZV9yZWdpb25zKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QpCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgd2JzZF9yZWxlYXNlX3JlZ2lvbnMoc3RydWN0IHdic2RfaG9zdCAqaG9zdCkKIHsKIAlpZiAoaG9zdC0+YmFzZSkKIAkJcmVsZWFzZV9yZWdpb24oaG9zdC0+YmFzZSwgOCk7CkBAIC0xNTM4LDcgKzE0NzcsNyBAQAogICogQWxsb2NhdGUvZnJlZSBETUEgcG9ydCBhbmQgYnVmZmVyCiAgKi8KIAotc3RhdGljIHZvaWQgX19kZXZpbml0IHdic2RfcmVxdWVzdF9kbWEoc3RydWN0IHdic2RfaG9zdCogaG9zdCwgaW50IGRtYSkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB3YnNkX3JlcXVlc3RfZG1hKHN0cnVjdCB3YnNkX2hvc3QgKmhvc3QsIGludCBkbWEpCiB7CiAJaWYgKGRtYSA8IDApCiAJCXJldHVybjsKQEAgLTE1ODIsOCArMTUyMSw4IEBACiAJICovCiAJQlVHX09OKDEpOwogCi0JZG1hX3VubWFwX3NpbmdsZShob3N0LT5tbWMtPmRldiwgaG9zdC0+ZG1hX2FkZHIsIFdCU0RfRE1BX1NJWkUsCi0JCURNQV9CSURJUkVDVElPTkFMKTsKKwlkbWFfdW5tYXBfc2luZ2xlKGhvc3QtPm1tYy0+ZGV2LCBob3N0LT5kbWFfYWRkciwKKwkJV0JTRF9ETUFfU0laRSwgRE1BX0JJRElSRUNUSU9OQUwpOwogCWhvc3QtPmRtYV9hZGRyID0gKGRtYV9hZGRyX3QpTlVMTDsKIAogCWtmcmVlKGhvc3QtPmRtYV9idWZmZXIpOwpAQCAtMTU5NywxMSArMTUzNiwxMiBAQAogCQkiRmFsbGluZyBiYWNrIG9uIEZJRk8uXG4iLCBkbWEpOwogfQogCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgd2JzZF9yZWxlYXNlX2RtYShzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0KQorc3RhdGljIHZvaWQgX19kZXZleGl0IHdic2RfcmVsZWFzZV9kbWEoc3RydWN0IHdic2RfaG9zdCAqaG9zdCkKIHsKLQlpZiAoaG9zdC0+ZG1hX2FkZHIpCi0JCWRtYV91bm1hcF9zaW5nbGUoaG9zdC0+bW1jLT5kZXYsIGhvc3QtPmRtYV9hZGRyLCBXQlNEX0RNQV9TSVpFLAotCQkJRE1BX0JJRElSRUNUSU9OQUwpOworCWlmIChob3N0LT5kbWFfYWRkcikgeworCQlkbWFfdW5tYXBfc2luZ2xlKGhvc3QtPm1tYy0+ZGV2LCBob3N0LT5kbWFfYWRkciwKKwkJCVdCU0RfRE1BX1NJWkUsIERNQV9CSURJUkVDVElPTkFMKTsKKwl9CiAJa2ZyZWUoaG9zdC0+ZG1hX2J1ZmZlcik7CiAJaWYgKGhvc3QtPmRtYSA+PSAwKQogCQlmcmVlX2RtYShob3N0LT5kbWEpOwpAQCAtMTYxNSw3ICsxNTU1LDcgQEAKICAqIEFsbG9jYXRlL2ZyZWUgSVJRLgogICovCiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHdic2RfcmVxdWVzdF9pcnEoc3RydWN0IHdic2RfaG9zdCogaG9zdCwgaW50IGlycSkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHdic2RfcmVxdWVzdF9pcnEoc3RydWN0IHdic2RfaG9zdCAqaG9zdCwgaW50IGlycSkKIHsKIAlpbnQgcmV0OwogCkBAIC0xNjMyLDE3ICsxNTcyLDIzIEBACiAJLyoKIAkgKiBTZXQgdXAgdGFza2xldHMuCiAJICovCi0JdGFza2xldF9pbml0KCZob3N0LT5jYXJkX3Rhc2tsZXQsIHdic2RfdGFza2xldF9jYXJkLCAodW5zaWduZWQgbG9uZylob3N0KTsKLQl0YXNrbGV0X2luaXQoJmhvc3QtPmZpZm9fdGFza2xldCwgd2JzZF90YXNrbGV0X2ZpZm8sICh1bnNpZ25lZCBsb25nKWhvc3QpOwotCXRhc2tsZXRfaW5pdCgmaG9zdC0+Y3JjX3Rhc2tsZXQsIHdic2RfdGFza2xldF9jcmMsICh1bnNpZ25lZCBsb25nKWhvc3QpOwotCXRhc2tsZXRfaW5pdCgmaG9zdC0+dGltZW91dF90YXNrbGV0LCB3YnNkX3Rhc2tsZXRfdGltZW91dCwgKHVuc2lnbmVkIGxvbmcpaG9zdCk7Ci0JdGFza2xldF9pbml0KCZob3N0LT5maW5pc2hfdGFza2xldCwgd2JzZF90YXNrbGV0X2ZpbmlzaCwgKHVuc2lnbmVkIGxvbmcpaG9zdCk7Ci0JdGFza2xldF9pbml0KCZob3N0LT5ibG9ja190YXNrbGV0LCB3YnNkX3Rhc2tsZXRfYmxvY2ssICh1bnNpZ25lZCBsb25nKWhvc3QpOworCXRhc2tsZXRfaW5pdCgmaG9zdC0+Y2FyZF90YXNrbGV0LCB3YnNkX3Rhc2tsZXRfY2FyZCwKKwkJCSh1bnNpZ25lZCBsb25nKWhvc3QpOworCXRhc2tsZXRfaW5pdCgmaG9zdC0+Zmlmb190YXNrbGV0LCB3YnNkX3Rhc2tsZXRfZmlmbywKKwkJCSh1bnNpZ25lZCBsb25nKWhvc3QpOworCXRhc2tsZXRfaW5pdCgmaG9zdC0+Y3JjX3Rhc2tsZXQsIHdic2RfdGFza2xldF9jcmMsCisJCQkodW5zaWduZWQgbG9uZylob3N0KTsKKwl0YXNrbGV0X2luaXQoJmhvc3QtPnRpbWVvdXRfdGFza2xldCwgd2JzZF90YXNrbGV0X3RpbWVvdXQsCisJCQkodW5zaWduZWQgbG9uZylob3N0KTsKKwl0YXNrbGV0X2luaXQoJmhvc3QtPmZpbmlzaF90YXNrbGV0LCB3YnNkX3Rhc2tsZXRfZmluaXNoLAorCQkJKHVuc2lnbmVkIGxvbmcpaG9zdCk7CisJdGFza2xldF9pbml0KCZob3N0LT5ibG9ja190YXNrbGV0LCB3YnNkX3Rhc2tsZXRfYmxvY2ssCisJCQkodW5zaWduZWQgbG9uZylob3N0KTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgd2JzZF9yZWxlYXNlX2lycShzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0KQorc3RhdGljIHZvaWQgX19kZXZleGl0IHdic2RfcmVsZWFzZV9pcnEoc3RydWN0IHdic2RfaG9zdCAqaG9zdCkKIHsKIAlpZiAoIWhvc3QtPmlycSkKIAkJcmV0dXJuOwpAQCAtMTY2Myw3ICsxNjA5LDcgQEAKICAqIEFsbG9jYXRlIGFsbCByZXNvdXJjZXMgZm9yIHRoZSBob3N0LgogICovCiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHdic2RfcmVxdWVzdF9yZXNvdXJjZXMoc3RydWN0IHdic2RfaG9zdCogaG9zdCwKK3N0YXRpYyBpbnQgX19kZXZpbml0IHdic2RfcmVxdWVzdF9yZXNvdXJjZXMoc3RydWN0IHdic2RfaG9zdCAqaG9zdCwKIAlpbnQgYmFzZSwgaW50IGlycSwgaW50IGRtYSkKIHsKIAlpbnQgcmV0OwpAQCAtMTY5NCw3ICsxNjQwLDcgQEAKICAqIFJlbGVhc2UgYWxsIHJlc291cmNlcyBmb3IgdGhlIGhvc3QuCiAgKi8KIAotc3RhdGljIHZvaWQgX19kZXZleGl0IHdic2RfcmVsZWFzZV9yZXNvdXJjZXMoc3RydWN0IHdic2RfaG9zdCogaG9zdCkKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB3YnNkX3JlbGVhc2VfcmVzb3VyY2VzKHN0cnVjdCB3YnNkX2hvc3QgKmhvc3QpCiB7CiAJd2JzZF9yZWxlYXNlX2RtYShob3N0KTsKIAl3YnNkX3JlbGVhc2VfaXJxKGhvc3QpOwpAQCAtMTcwNSw3ICsxNjUxLDcgQEAKICAqIENvbmZpZ3VyZSB0aGUgcmVzb3VyY2VzIHRoZSBjaGlwIHNob3VsZCB1c2UuCiAgKi8KIAotc3RhdGljIHZvaWQgd2JzZF9jaGlwX2NvbmZpZyhzdHJ1Y3Qgd2JzZF9ob3N0KiBob3N0KQorc3RhdGljIHZvaWQgd2JzZF9jaGlwX2NvbmZpZyhzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0KQogewogCXdic2RfdW5sb2NrX2NvbmZpZyhob3N0KTsKIApAQCAtMTc0OSw3ICsxNjk1LDcgQEAKICAqIENoZWNrIHRoYXQgY29uZmlndXJlZCByZXNvdXJjZXMgYXJlIGNvcnJlY3QuCiAgKi8KIAotc3RhdGljIGludCB3YnNkX2NoaXBfdmFsaWRhdGUoc3RydWN0IHdic2RfaG9zdCogaG9zdCkKK3N0YXRpYyBpbnQgd2JzZF9jaGlwX3ZhbGlkYXRlKHN0cnVjdCB3YnNkX2hvc3QgKmhvc3QpCiB7CiAJaW50IGJhc2UsIGlycSwgZG1hOwogCkBAIC0xNzg5LDcgKzE3MzUsNyBAQAogICogUG93ZXJzIGRvd24gdGhlIFNEIGZ1bmN0aW9uCiAgKi8KIAotc3RhdGljIHZvaWQgd2JzZF9jaGlwX3Bvd2Vyb2ZmKHN0cnVjdCB3YnNkX2hvc3QqIGhvc3QpCitzdGF0aWMgdm9pZCB3YnNkX2NoaXBfcG93ZXJvZmYoc3RydWN0IHdic2RfaG9zdCAqaG9zdCkKIHsKIAl3YnNkX3VubG9ja19jb25maWcoaG9zdCk7CiAKQEAgLTE4MDUsMTEgKzE3NTEsMTEgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCB3YnNkX2luaXQoc3RydWN0IGRldmljZSogZGV2LCBpbnQgYmFzZSwgaW50IGlycSwgaW50IGRtYSwKK3N0YXRpYyBpbnQgX19kZXZpbml0IHdic2RfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBiYXNlLCBpbnQgaXJxLCBpbnQgZG1hLAogCWludCBwbnApCiB7Ci0Jc3RydWN0IHdic2RfaG9zdCogaG9zdCA9IE5VTEw7Ci0Jc3RydWN0IG1tY19ob3N0KiBtbWMgPSBOVUxMOworCXN0cnVjdCB3YnNkX2hvc3QgKmhvc3QgPSBOVUxMOworCXN0cnVjdCBtbWNfaG9zdCAqbW1jID0gTlVMTDsKIAlpbnQgcmV0OwogCiAJcmV0ID0gd2JzZF9hbGxvY19tbWMoZGV2KTsKQEAgLTE4MjMsMTYgKzE3NjksMTIgQEAKIAkgKiBTY2FuIGZvciBoYXJkd2FyZS4KIAkgKi8KIAlyZXQgPSB3YnNkX3NjYW4oaG9zdCk7Ci0JaWYgKHJldCkKLQl7Ci0JCWlmIChwbnAgJiYgKHJldCA9PSAtRU5PREVWKSkKLQkJeworCWlmIChyZXQpIHsKKwkJaWYgKHBucCAmJiAocmV0ID09IC1FTk9ERVYpKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSSVZFUl9OQU1FCiAJCQkJIjogVW5hYmxlIHRvIGNvbmZpcm0gZGV2aWNlIHByZXNlbmNlLiBZb3UgbWF5ICIKIAkJCQkiZXhwZXJpZW5jZSBsb2NrLXVwcy5cbiIpOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJd2JzZF9mcmVlX21tYyhkZXYpOwogCQkJcmV0dXJuIHJldDsKIAkJfQpAQCAtMTg0Miw4ICsxNzg0LDcgQEAKIAkgKiBSZXF1ZXN0IHJlc291cmNlcy4KIAkgKi8KIAlyZXQgPSB3YnNkX3JlcXVlc3RfcmVzb3VyY2VzKGhvc3QsIGlvLCBpcnEsIGRtYSk7Ci0JaWYgKHJldCkKLQl7CisJaWYgKHJldCkgewogCQl3YnNkX3JlbGVhc2VfcmVzb3VyY2VzKGhvc3QpOwogCQl3YnNkX2ZyZWVfbW1jKGRldik7CiAJCXJldHVybiByZXQ7CkBAIC0xODUyLDE4ICsxNzkzLDE1IEBACiAJLyoKIAkgKiBTZWUgaWYgY2hpcCBuZWVkcyB0byBiZSBjb25maWd1cmVkLgogCSAqLwotCWlmIChwbnApCi0JewotCQlpZiAoKGhvc3QtPmNvbmZpZyAhPSAwKSAmJiAhd2JzZF9jaGlwX3ZhbGlkYXRlKGhvc3QpKQotCQl7CisJaWYgKHBucCkgeworCQlpZiAoKGhvc3QtPmNvbmZpZyAhPSAwKSAmJiAhd2JzZF9jaGlwX3ZhbGlkYXRlKGhvc3QpKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSSVZFUl9OQU1FCiAJCQkJIjogUG5QIGFjdGl2ZSBidXQgY2hpcCBub3QgY29uZmlndXJlZCEgIgogCQkJCSJZb3UgcHJvYmFibHkgaGF2ZSBhIGJ1Z2d5IEJJT1MuICIKIAkJCQkiQ29uZmlndXJpbmcgY2hpcCBtYW51YWxseS5cbiIpOwogCQkJd2JzZF9jaGlwX2NvbmZpZyhob3N0KTsKIAkJfQotCX0KLQllbHNlCisJfSBlbHNlCiAJCXdic2RfY2hpcF9jb25maWcoaG9zdCk7CiAKIAkvKgpAQCAtMTg3MSw4ICsxODA5LDcgQEAKIAkgKiBOb3QgdGVzdGVkLgogCSAqLwogI2lmZGVmIENPTkZJR19QTQotCWlmIChob3N0LT5jb25maWcpCi0JeworCWlmIChob3N0LT5jb25maWcpIHsKIAkJd2JzZF91bmxvY2tfY29uZmlnKGhvc3QpOwogCQl3YnNkX3dyaXRlX2NvbmZpZyhob3N0LCBXQlNEX0NPTkZfUE1FLCAweEEwKTsKIAkJd2JzZF9sb2NrX2NvbmZpZyhob3N0KTsKQEAgLTE5MDUsMTAgKzE4NDIsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgX19kZXZleGl0IHdic2Rfc2h1dGRvd24oc3RydWN0IGRldmljZSogZGV2LCBpbnQgcG5wKQorc3RhdGljIHZvaWQgX19kZXZleGl0IHdic2Rfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2LCBpbnQgcG5wKQogewotCXN0cnVjdCBtbWNfaG9zdCogbW1jID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IHdic2RfaG9zdCogaG9zdDsKKwlzdHJ1Y3QgbW1jX2hvc3QgKm1tYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB3YnNkX2hvc3QgKmhvc3Q7CiAKIAlpZiAoIW1tYykKIAkJcmV0dXJuOwpAQCAtMTkzMiwxMiArMTg2OSwxMiBAQAogICogTm9uLVBuUAogICovCiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHdic2RfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSogZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgd2JzZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIHdic2RfaW5pdCgmZGV2LT5kZXYsIGlvLCBpcnEsIGRtYSwgMCk7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IHdic2RfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UqIGRldikKK3N0YXRpYyBpbnQgX19kZXZleGl0IHdic2RfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKIAl3YnNkX3NodXRkb3duKCZkZXYtPmRldiwgMCk7CiAKQEAgLTE5NTEsNyArMTg4OCw3IEBACiAjaWZkZWYgQ09ORklHX1BOUAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdAotd2JzZF9wbnBfcHJvYmUoc3RydWN0IHBucF9kZXYgKiBwbnBkZXYsIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkICpkZXZfaWQpCit3YnNkX3BucF9wcm9iZShzdHJ1Y3QgcG5wX2RldiAqcG5wZGV2LCBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCAqZGV2X2lkKQogewogCWludCBpbywgaXJxLCBkbWE7CiAKQEAgLTE5NzAsNyArMTkwNyw3IEBACiAJcmV0dXJuIHdic2RfaW5pdCgmcG5wZGV2LT5kZXYsIGlvLCBpcnEsIGRtYSwgMSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCB3YnNkX3BucF9yZW1vdmUoc3RydWN0IHBucF9kZXYgKiBkZXYpCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgd2JzZF9wbnBfcmVtb3ZlKHN0cnVjdCBwbnBfZGV2ICpkZXYpCiB7CiAJd2JzZF9zaHV0ZG93bigmZGV2LT5kZXYsIDEpOwogfQpAQCAtMTk4MywzNyArMTkyMCw1NCBAQAogCiAjaWZkZWYgQ09ORklHX1BNCiAKLXN0YXRpYyBpbnQgd2JzZF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCB3YnNkX3N1c3BlbmQoc3RydWN0IHdic2RfaG9zdCAqaG9zdCwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCUJVR19PTihob3N0ID09IE5VTEwpOworCisJcmV0dXJuIG1tY19zdXNwZW5kX2hvc3QoaG9zdC0+bW1jLCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgd2JzZF9yZXN1bWUoc3RydWN0IHdic2RfaG9zdCAqaG9zdCkKK3sKKwlCVUdfT04oaG9zdCA9PSBOVUxMKTsKKworCXdic2RfaW5pdF9kZXZpY2UoaG9zdCk7CisKKwlyZXR1cm4gbW1jX3Jlc3VtZV9ob3N0KGhvc3QtPm1tYyk7Cit9CisKK3N0YXRpYyBpbnQgd2JzZF9wbGF0Zm9ybV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKKwkJCQkgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBtbWNfaG9zdCAqbW1jID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0OwogCWludCByZXQ7CiAKLQlpZiAoIW1tYykKKwlpZiAobW1jID09IE5VTEwpCiAJCXJldHVybiAwOwogCi0JREJHKCJTdXNwZW5kaW5nLi4uXG4iKTsKLQotCXJldCA9IG1tY19zdXNwZW5kX2hvc3QobW1jLCBzdGF0ZSk7Ci0JaWYgKCFyZXQpCi0JCXJldHVybiByZXQ7CisJREJHRigiU3VzcGVuZGluZy4uLlxuIik7CiAKIAlob3N0ID0gbW1jX3ByaXYobW1jKTsKIAorCXJldCA9IHdic2Rfc3VzcGVuZChob3N0LCBzdGF0ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCXdic2RfY2hpcF9wb3dlcm9mZihob3N0KTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdic2RfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgd2JzZF9wbGF0Zm9ybV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBtbWNfaG9zdCAqbW1jID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0OwogCi0JaWYgKCFtbWMpCisJaWYgKG1tYyA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIAotCURCRygiUmVzdW1pbmcuLi5cbiIpOworCURCR0YoIlJlc3VtaW5nLi4uXG4iKTsKIAogCWhvc3QgPSBtbWNfcHJpdihtbWMpOwogCkBAIC0yMDI0LDE1ICsxOTc4LDY4IEBACiAJICovCiAJbWRlbGF5KDUpOwogCi0Jd2JzZF9pbml0X2RldmljZShob3N0KTsKLQotCXJldHVybiBtbWNfcmVzdW1lX2hvc3QobW1jKTsKKwlyZXR1cm4gd2JzZF9yZXN1bWUoaG9zdCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE5QCisKK3N0YXRpYyBpbnQgd2JzZF9wbnBfc3VzcGVuZChzdHJ1Y3QgcG5wX2RldiAqcG5wX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBtbWNfaG9zdCAqbW1jID0gZGV2X2dldF9kcnZkYXRhKCZwbnBfZGV2LT5kZXYpOworCXN0cnVjdCB3YnNkX2hvc3QgKmhvc3Q7CisKKwlpZiAobW1jID09IE5VTEwpCisJCXJldHVybiAwOworCisJREJHRigiU3VzcGVuZGluZy4uLlxuIik7CisKKwlob3N0ID0gbW1jX3ByaXYobW1jKTsKKworCXJldHVybiB3YnNkX3N1c3BlbmQoaG9zdCwgc3RhdGUpOworfQorCitzdGF0aWMgaW50IHdic2RfcG5wX3Jlc3VtZShzdHJ1Y3QgcG5wX2RldiAqcG5wX2RldikKK3sKKwlzdHJ1Y3QgbW1jX2hvc3QgKm1tYyA9IGRldl9nZXRfZHJ2ZGF0YSgmcG5wX2Rldi0+ZGV2KTsKKwlzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0OworCisJaWYgKG1tYyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCURCR0YoIlJlc3VtaW5nLi4uXG4iKTsKKworCWhvc3QgPSBtbWNfcHJpdihtbWMpOworCisJLyoKKwkgKiBTZWUgaWYgY2hpcCBuZWVkcyB0byBiZSBjb25maWd1cmVkLgorCSAqLworCWlmIChob3N0LT5jb25maWcgIT0gMCkgeworCQlpZiAoIXdic2RfY2hpcF92YWxpZGF0ZShob3N0KSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUklWRVJfTkFNRQorCQkJCSI6IFBuUCBhY3RpdmUgYnV0IGNoaXAgbm90IGNvbmZpZ3VyZWQhICIKKwkJCQkiWW91IHByb2JhYmx5IGhhdmUgYSBidWdneSBCSU9TLiAiCisJCQkJIkNvbmZpZ3VyaW5nIGNoaXAgbWFudWFsbHkuXG4iKTsKKwkJCXdic2RfY2hpcF9jb25maWcoaG9zdCk7CisJCX0KKwl9CisKKwkvKgorCSAqIEFsbG93IGRldmljZSB0byBpbml0aWFsaXNlIGl0c2VsZiBwcm9wZXJseS4KKwkgKi8KKwltZGVsYXkoNSk7CisKKwlyZXR1cm4gd2JzZF9yZXN1bWUoaG9zdCk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE5QICovCisKICNlbHNlIC8qIENPTkZJR19QTSAqLwogCi0jZGVmaW5lIHdic2Rfc3VzcGVuZCBOVUxMCi0jZGVmaW5lIHdic2RfcmVzdW1lIE5VTEwKKyNkZWZpbmUgd2JzZF9wbGF0Zm9ybV9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgd2JzZF9wbGF0Zm9ybV9yZXN1bWUgTlVMTAorCisjZGVmaW5lIHdic2RfcG5wX3N1c3BlbmQgTlVMTAorI2RlZmluZSB3YnNkX3BucF9yZXN1bWUgTlVMTAogCiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKQEAgLTIwNDIsOCArMjA0OSw4IEBACiAJLnByb2JlCQk9IHdic2RfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh3YnNkX3JlbW92ZSksCiAKLQkuc3VzcGVuZAk9IHdic2Rfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHdic2RfcmVzdW1lLAorCS5zdXNwZW5kCT0gd2JzZF9wbGF0Zm9ybV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gd2JzZF9wbGF0Zm9ybV9yZXN1bWUsCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gRFJJVkVSX05BTUUsCiAJfSwKQEAgLTIwNTYsNiArMjA2Myw5IEBACiAJLmlkX3RhYmxlCT0gcG5wX2Rldl90YWJsZSwKIAkucHJvYmUJCT0gd2JzZF9wbnBfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh3YnNkX3BucF9yZW1vdmUpLAorCisJLnN1c3BlbmQJPSB3YnNkX3BucF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gd2JzZF9wbnBfcmVzdW1lLAogfTsKIAogI2VuZGlmIC8qIENPTkZJR19QTlAgKi8KQEAgLTIwNzUsMjUgKzIwODUsMzAgQEAKIAogI2lmZGVmIENPTkZJR19QTlAKIAotCWlmICghbm9wbnApCi0JeworCWlmICghbm9wbnApIHsKIAkJcmVzdWx0ID0gcG5wX3JlZ2lzdGVyX2RyaXZlcigmd2JzZF9wbnBfZHJpdmVyKTsKIAkJaWYgKHJlc3VsdCA8IDApCiAJCQlyZXR1cm4gcmVzdWx0OwogCX0KLQogI2VuZGlmIC8qIENPTkZJR19QTlAgKi8KIAotCWlmIChub3BucCkKLQl7CisJaWYgKG5vcG5wKSB7CiAJCXJlc3VsdCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmd2JzZF9kcml2ZXIpOwogCQlpZiAocmVzdWx0IDwgMCkKIAkJCXJldHVybiByZXN1bHQ7CiAKLQkJd2JzZF9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKERSSVZFUl9OQU1FLCAtMSwKLQkJCU5VTEwsIDApOwotCQlpZiAoSVNfRVJSKHdic2RfZGV2aWNlKSkKLQkJCXJldHVybiBQVFJfRVJSKHdic2RfZGV2aWNlKTsKKwkJd2JzZF9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRFJJVkVSX05BTUUsIC0xKTsKKwkJaWYgKCF3YnNkX2RldmljZSkgeworCQkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJndic2RfZHJpdmVyKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJcmVzdWx0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZCh3YnNkX2RldmljZSk7CisJCWlmIChyZXN1bHQpIHsKKwkJCXBsYXRmb3JtX2RldmljZV9wdXQod2JzZF9kZXZpY2UpOworCQkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJndic2RfZHJpdmVyKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTIxMDgsOCArMjEyMyw3IEBACiAKICNlbmRpZiAvKiBDT05GSUdfUE5QICovCiAKLQlpZiAobm9wbnApCi0JeworCWlmIChub3BucCkgewogCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcih3YnNkX2RldmljZSk7CiAKIAkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJndic2RfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NoaXBzL0tjb25maWcgYi9kcml2ZXJzL210ZC9jaGlwcy9LY29uZmlnCmluZGV4IGVhZmEyM2YuLmVmZmEwZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2NoaXBzL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvY2hpcHMvS2NvbmZpZwpAQCAtMzEsNiArMzEsNyBAQAogCiBjb25maWcgTVREX0dFTl9QUk9CRQogCXRyaXN0YXRlCisJc2VsZWN0IE9CU09MRVRFX0lOVEVSTU9EVUxFCiAKIGNvbmZpZyBNVERfQ0ZJX0FEVl9PUFRJT05TCiAJYm9vbCAiRmxhc2ggY2hpcCBkcml2ZXIgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIgpAQCAtMjU5LDcgKzI2MCw3IEBACiAJICB3aXRoIHRoaXMgZHJpdmVyIHdpbGwgcmV0dXJuIC1FTk9ERVYgdXBvbiBhY2Nlc3MuCiAKIGNvbmZpZyBNVERfT0JTT0xFVEVfQ0hJUFMKLQlkZXBlbmRzIG9uIE1URCAmJiBCUk9LRU4KKwlkZXBlbmRzIG9uIE1URAogCWJvb2wgIk9sZGVyICh0aGVvcmV0aWNhbGx5IG9ic29sZXRlZCBub3cpIGRyaXZlcnMgZm9yIG5vbi1DRkkgY2hpcHMiCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZG9lcyBub3QgZW5hYmxlIGFueSBjb2RlIGRpcmVjdGx5LCBidXQgd2lsbCBhbGxvdyB5b3UgdG8KQEAgLTI3Miw3ICsyNzMsNyBAQAogCiBjb25maWcgTVREX0FNRFNURAogCXRyaXN0YXRlICJBTUQgY29tcGF0aWJsZSBmbGFzaCBjaGlwIHN1cHBvcnQgKG5vbi1DRkkpIgotCWRlcGVuZHMgb24gTVREICYmIE1URF9PQlNPTEVURV9DSElQUworCWRlcGVuZHMgb24gTVREICYmIE1URF9PQlNPTEVURV9DSElQUyAmJiBCUk9LRU4KIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIGZsYXNoIGNoaXBzIHVzaW5nIEFNRC1jb21wYXRpYmxlCiAJICBjb21tYW5kcywgaW5jbHVkaW5nIHNvbWUgd2hpY2ggYXJlIG5vdCBDRkktY29tcGF0aWJsZSBhbmQgaGVuY2UKQEAgLTI5MCw3ICsyOTEsNyBAQAogCiBjb25maWcgTVREX0pFREVDCiAJdHJpc3RhdGUgIkpFREVDIGRldmljZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gTVREICYmIE1URF9PQlNPTEVURV9DSElQUworCWRlcGVuZHMgb24gTVREICYmIE1URF9PQlNPTEVURV9DSElQUyAmJiBCUk9LRU4KIAloZWxwCiAJICBFbmFibGUgb2xkZXIgb2xkZXIgSkVERUMgZmxhc2ggaW50ZXJmYWNlIGRldmljZXMgZm9yIHNlbGYKIAkgIHByb2dyYW1taW5nIGZsYXNoLiAgSXQgaXMgY29tbW9ubHkgdXNlZCBpbiBvbGRlciBBTUQgY2hpcHMuICBJdCBpcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9LY29uZmlnIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9LY29uZmlnCmluZGV4IDlhMmFhNDAuLmRkNjI4Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL0tjb25maWcKQEAgLTQ3LDYgKzQ3LDIyIEBACiAJICBhY2NlbGVyYXRvci4gIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBERUNzdGF0aW9uIDUwMDAvMngwIG9yIGEKIAkgIERFQ3N5c3RlbSA1OTAwIGVxdWlwcGVkIHdpdGggc3VjaCBhIG1vZHVsZS4KIAorY29uZmlnIE1URF9EQVRBRkxBU0gKKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgQVQ0NXh4eCBEYXRhRmxhc2giCisJZGVwZW5kcyBvbiBNVEQgJiYgU1BJX01BU1RFUiAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgYWNjZXNzIHRvIEFUNDV4eHggRGF0YUZsYXNoIGNoaXBzLCB1c2luZyBTUEkuCisJICBTb21ldGltZXMgRGF0YUZsYXNoIGNoaXBzIGFyZSBwYWNrYWdlZCBpbnNpZGUgTU1DLWZvcm1hdAorCSAgY2FyZHM7IGF0IHRoaXMgd3JpdGluZywgdGhlIE1NQyBzdGFjayB3b24ndCBoYW5kbGUgdGhvc2UuCisKK2NvbmZpZyBNVERfTTI1UDgwCisJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIE0yNSBTUEkgRmxhc2giCisJZGVwZW5kcyBvbiBNVEQgJiYgU1BJX01BU1RFUiAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgYWNjZXNzIHRvIFNUIE0yNVA4MCBhbmQgc2ltaWxhciBTUEkgZmxhc2ggY2hpcHMsCisJICB1c2VkIGZvciBwcm9ncmFtIGFuZCBkYXRhIHN0b3JhZ2UuICBTZXQgdXAgeW91ciBzcGkgZGV2aWNlcworCSAgd2l0aCB0aGUgcmlnaHQgYm9hcmQtc3BlY2lmaWMgcGxhdGZvcm0gZGF0YS4KKwogY29uZmlnIE1URF9TTFJBTQogCXRyaXN0YXRlICJVbmNhY2hlZCBzeXN0ZW0gUkFNIgogCWRlcGVuZHMgb24gTVRECkBAIC0yMDIsNiArMjE4LDcgQEAKIGNvbmZpZyBNVERfRE9DUFJPQkUKIAl0cmlzdGF0ZQogCXNlbGVjdCBNVERfRE9DRUNDCisJc2VsZWN0IE9CU09MRVRFX0lOVEVSTU9EVUxFCiAKIGNvbmZpZyBNVERfRE9DRUNDCiAJdHJpc3RhdGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvTWFrZWZpbGUgYi9kcml2ZXJzL210ZC9kZXZpY2VzL01ha2VmaWxlCmluZGV4IGUzOGRiMzQuLjdjNWVkMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9NYWtlZmlsZQpAQCAtMjMsMyArMjMsNSBAQAogb2JqLSQoQ09ORklHX01URF9MQVJUKQkJKz0gbGFydC5vCiBvYmotJChDT05GSUdfTVREX0JMS01URCkJKz0gYmxrbXRkLm8KIG9iai0kKENPTkZJR19NVERfQkxPQ0syTVREKQkrPSBibG9jazJtdGQubworb2JqLSQoQ09ORklHX01URF9EQVRBRkxBU0gpCSs9IG10ZF9kYXRhZmxhc2gubworb2JqLSQoQ09ORklHX01URF9NMjVQODApCSs9IG0yNXA4MC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL2RvYzIwMDAuYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jMjAwMC5jCmluZGV4IGJlNWU4OGIuLmU0MzQ1Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jMjAwMC5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jMjAwMC5jCkBAIC0xMzgsNyArMTM4LDcgQEAKICAgIGJ5cGFzcyB0aGUgaW50ZXJuYWwgcGlwZWxpbmUuIEVhY2ggb2YgNCBkZWxheSBjeWNsZXMgKHJlYWQgZnJvbSB0aGUgTk9QIHJlZ2lzdGVyKSBpcwogICAgcmVxdWlyZWQgYWZ0ZXIgd3JpdGluZyB0byBDRFNOIENvbnRyb2wgcmVnaXN0ZXIsIHNlZSBTb2Z0d2FyZSBSZXF1aXJlbWVudCAxMS40IGl0ZW0gMy4gKi8KIAotc3RhdGljIGlubGluZSBpbnQgRG9DX0NvbW1hbmQoc3RydWN0IERpc2tPbkNoaXAgKmRvYywgdW5zaWduZWQgY2hhciBjb21tYW5kLAorc3RhdGljIGludCBEb0NfQ29tbWFuZChzdHJ1Y3QgRGlza09uQ2hpcCAqZG9jLCB1bnNpZ25lZCBjaGFyIGNvbW1hbmQsCiAJCQkgICAgICB1bnNpZ25lZCBjaGFyIHh0cmFmbGFncykKIHsKIAl2b2lkIF9faW9tZW0gKmRvY3B0ciA9IGRvYy0+dmlydGFkcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jMjAwMS5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAxLmMKaW5kZXggZmNiMjhhNi4uNjgxYTljNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAxLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAxLmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogICAgd2l0aCB0aGUgaW50ZXJuYWwgcGlwZWxpbmUuIEVhY2ggb2YgNCBkZWxheSBjeWNsZXMgKHJlYWQgZnJvbSB0aGUgTk9QIHJlZ2lzdGVyKSBpcwogICAgcmVxdWlyZWQgYWZ0ZXIgd3JpdGluZyB0byBDRFNOIENvbnRyb2wgcmVnaXN0ZXIsIHNlZSBTb2Z0d2FyZSBSZXF1aXJlbWVudCAxMS40IGl0ZW0gMy4gKi8KIAotc3RhdGljIGlubGluZSB2b2lkIERvQ19Db21tYW5kKHZvaWQgX19pb21lbSAqIGRvY3B0ciwgdW5zaWduZWQgY2hhciBjb21tYW5kLAorc3RhdGljIHZvaWQgRG9DX0NvbW1hbmQodm9pZCBfX2lvbWVtICogZG9jcHRyLCB1bnNpZ25lZCBjaGFyIGNvbW1hbmQsCiAJCQkgICAgICAgdW5zaWduZWQgY2hhciB4dHJhZmxhZ3MpCiB7CiAJLyogQXNzZXJ0IHRoZSBDTEUgKENvbW1hbmQgTGF0Y2ggRW5hYmxlKSBsaW5lIHRvIHRoZSBmbGFzaCBjaGlwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL2RvYzIwMDFwbHVzLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL2RvYzIwMDFwbHVzLmMKaW5kZXggMDU5NWNjNy4uNWY1N2YyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAxcGx1cy5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jMjAwMXBsdXMuYwpAQCAtMTE4LDcgKzExOCw3IEBACiAvKiBEb0NfQ29tbWFuZDogU2VuZCBhIGZsYXNoIGNvbW1hbmQgdG8gdGhlIGZsYXNoIGNoaXAgdGhyb3VnaCB0aGUgRmxhc2gKICAqIGNvbW1hbmQgcmVnaXN0ZXIuIE5lZWQgMiBXcml0ZSBQaXBlbGluZSBUZXJtaW5hdGVzIHRvIGNvbXBsZXRlIHNlbmQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBEb0NfQ29tbWFuZCh2b2lkIF9faW9tZW0gKiBkb2NwdHIsIHVuc2lnbmVkIGNoYXIgY29tbWFuZCwKK3N0YXRpYyB2b2lkIERvQ19Db21tYW5kKHZvaWQgX19pb21lbSAqIGRvY3B0ciwgdW5zaWduZWQgY2hhciBjb21tYW5kLAogCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgeHRyYWZsYWdzKQogewogCVdyaXRlRE9DKGNvbW1hbmQsIGRvY3B0ciwgTXBsdXNfRmxhc2hDbWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9tMjVwODAuYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbTI1cDgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVmMjQwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbTI1cDgwLmMKQEAgLTAsMCArMSw1ODIgQEAKKy8qCisgKiBNVEQgU1BJIGRyaXZlciBmb3IgU1QgTTI1UHh4IGZsYXNoIGNoaXBzCisgKgorICogQXV0aG9yOiBNaWtlIExhdmVuZGVyLCBtaWtlQHN0ZXJvaWRtaWNyb3MuY29tCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBJbnRlYyBBdXRvbWF0aW9uIEluYy4KKyAqCisgKiBTb21lIHBhcnRzIGFyZSBiYXNlZCBvbiBsYXJ0LmMgYnkgQWJyYWhhbSBWYW4gRGVyIE1lcndlCisgKgorICogQ2xlYW5lZCB1cCBhbmQgZ2VuZXJhbGl6ZWQgYmFzZWQgb24gbXRkX2RhdGFmbGFzaC5jCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL2ZsYXNoLmg+CisKKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKworLyogTk9URTogQVQgMjVGIGFuZCBTU1QgMjVMRiBzZXJpZXMgYXJlIHZlcnkgc2ltaWxhciwKKyAqIGJ1dCBjb21tYW5kcyBmb3Igc2VjdG9yIGVyYXNlIGFuZCBjaGlwIGlkIGRpZmZlci4uLgorICovCisKKyNkZWZpbmUgRkxBU0hfUEFHRVNJWkUJCTI1NgorCisvKiBGbGFzaCBvcGNvZGVzLiAqLworI2RlZmluZQlPUENPREVfV1JFTgkJNgkvKiBXcml0ZSBlbmFibGUgKi8KKyNkZWZpbmUJT1BDT0RFX1JEU1IJCTUJLyogUmVhZCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJT1BDT0RFX1JFQUQJCTMJLyogUmVhZCBkYXRhIGJ5dGVzICovCisjZGVmaW5lCU9QQ09ERV9QUAkJMgkvKiBQYWdlIHByb2dyYW0gKi8KKyNkZWZpbmUJT1BDT0RFX1NFCQkweGQ4CS8qIFNlY3RvciBlcmFzZSAqLworI2RlZmluZQlPUENPREVfUkVTCQkweGFiCS8qIFJlYWQgRWxlY3Ryb25pYyBTaWduYXR1cmUgKi8KKyNkZWZpbmUJT1BDT0RFX1JESUQJCTB4OWYJLyogUmVhZCBKRURFQyBJRCAqLworCisvKiBTdGF0dXMgUmVnaXN0ZXIgYml0cy4gKi8KKyNkZWZpbmUJU1JfV0lQCQkJMQkvKiBXcml0ZSBpbiBwcm9ncmVzcyAqLworI2RlZmluZQlTUl9XRUwJCQkyCS8qIFdyaXRlIGVuYWJsZSBsYXRjaCAqLworI2RlZmluZQlTUl9CUDAJCQk0CS8qIEJsb2NrIHByb3RlY3QgMCAqLworI2RlZmluZQlTUl9CUDEJCQk4CS8qIEJsb2NrIHByb3RlY3QgMSAqLworI2RlZmluZQlTUl9CUDIJCQkweDEwCS8qIEJsb2NrIHByb3RlY3QgMiAqLworI2RlZmluZQlTUl9TUldECQkJMHg4MAkvKiBTUiB3cml0ZSBwcm90ZWN0ICovCisKKy8qIERlZmluZSBtYXggdGltZXMgdG8gY2hlY2sgc3RhdHVzIHJlZ2lzdGVyIGJlZm9yZSB3ZSBnaXZlIHVwLiAqLworI2RlZmluZQlNQVhfUkVBRFlfV0FJVF9DT1VOVAkxMDAwMDAKKworCisjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCisjZGVmaW5lCW10ZF9oYXNfcGFydGl0aW9ucygpCSgxKQorI2Vsc2UKKyNkZWZpbmUJbXRkX2hhc19wYXJ0aXRpb25zKCkJKDApCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBtMjVwIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpOworCXN0cnVjdCBzZW1hcGhvcmUJbG9jazsKKwlzdHJ1Y3QgbXRkX2luZm8JCW10ZDsKKwl1bnNpZ25lZAkJcGFydGl0aW9uZWQ7CisJdTgJCQljb21tYW5kWzRdOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbTI1cCAqbXRkX3RvX20yNXAoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihtdGQsIHN0cnVjdCBtMjVwLCBtdGQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEludGVybmFsIGhlbHBlciBmdW5jdGlvbnMKKyAqLworCisvKgorICogUmVhZCB0aGUgc3RhdHVzIHJlZ2lzdGVyLCByZXR1cm5pbmcgaXRzIHZhbHVlIGluIHRoZSBsb2NhdGlvbgorICogUmV0dXJuIHRoZSBzdGF0dXMgcmVnaXN0ZXIgdmFsdWUuCisgKiBSZXR1cm5zIG5lZ2F0aXZlIGlmIGVycm9yIG9jY3VycmVkLgorICovCitzdGF0aWMgaW50IHJlYWRfc3Ioc3RydWN0IG0yNXAgKmZsYXNoKQoreworCXNzaXplX3QgcmV0dmFsOworCXU4IGNvZGUgPSBPUENPREVfUkRTUjsKKwl1OCB2YWw7CisKKwlyZXR2YWwgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKGZsYXNoLT5zcGksICZjb2RlLCAxLCAmdmFsLCAxKTsKKworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRldl9lcnIoJmZsYXNoLT5zcGktPmRldiwgImVycm9yICVkIHJlYWRpbmcgU1JcbiIsCisJCQkJKGludCkgcmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlyZXR1cm4gdmFsOworfQorCisKKy8qCisgKiBTZXQgd3JpdGUgZW5hYmxlIGxhdGNoIHdpdGggV3JpdGUgRW5hYmxlIGNvbW1hbmQuCisgKiBSZXR1cm5zIG5lZ2F0aXZlIGlmIGVycm9yIG9jY3VycmVkLgorICovCitzdGF0aWMgaW5saW5lIGludCB3cml0ZV9lbmFibGUoc3RydWN0IG0yNXAgKmZsYXNoKQoreworCXU4CWNvZGUgPSBPUENPREVfV1JFTjsKKworCXJldHVybiBzcGlfd3JpdGVfdGhlbl9yZWFkKGZsYXNoLT5zcGksICZjb2RlLCAxLCBOVUxMLCAwKTsKK30KKworCisvKgorICogU2VydmljZSByb3V0aW5lIHRvIHJlYWQgc3RhdHVzIHJlZ2lzdGVyIHVudGlsIHJlYWR5LCBvciB0aW1lb3V0IG9jY3Vycy4KKyAqIFJldHVybnMgbm9uLXplcm8gaWYgZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgd2FpdF90aWxsX3JlYWR5KHN0cnVjdCBtMjVwICpmbGFzaCkKK3sKKwlpbnQgY291bnQ7CisJaW50IHNyOworCisJLyogb25lIGNoaXAgZ3VhcmFudGVlcyBtYXggNSBtc2VjIHdhaXQgaGVyZSBhZnRlciBwYWdlIHdyaXRlcywKKwkgKiBidXQgcG90ZW50aWFsbHkgdGhyZWUgc2Vjb25kcyAoISkgYWZ0ZXIgcGFnZSBlcmFzZS4KKwkgKi8KKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBNQVhfUkVBRFlfV0FJVF9DT1VOVDsgY291bnQrKykgeworCQlpZiAoKHNyID0gcmVhZF9zcihmbGFzaCkpIDwgMCkKKwkJCWJyZWFrOworCQllbHNlIGlmICghKHNyICYgU1JfV0lQKSkKKwkJCXJldHVybiAwOworCisJCS8qIFJFVklTSVQgc29tZXRpbWVzIHNsZWVwaW5nIHdvdWxkIGJlIGJlc3QgKi8KKwl9CisKKwlyZXR1cm4gMTsKK30KKworCisvKgorICogRXJhc2Ugb25lIHNlY3RvciBvZiBmbGFzaCBtZW1vcnkgYXQgb2Zmc2V0IGBgb2Zmc2V0Jycgd2hpY2ggaXMgYW55CisgKiBhZGRyZXNzIHdpdGhpbiB0aGUgc2VjdG9yIHdoaWNoIHNob3VsZCBiZSBlcmFzZWQuCisgKgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBlcmFzZV9zZWN0b3Ioc3RydWN0IG0yNXAgKmZsYXNoLCB1MzIgb2Zmc2V0KQoreworCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICIlczogJXMgYXQgMHglMDh4XG4iLCBmbGFzaC0+c3BpLT5kZXYuYnVzX2lkLAorCQkJX19GVU5DVElPTl9fLCBvZmZzZXQpOworCisJLyogV2FpdCB1bnRpbCBmaW5pc2hlZCBwcmV2aW91cyB3cml0ZSBjb21tYW5kLiAqLworCWlmICh3YWl0X3RpbGxfcmVhZHkoZmxhc2gpKQorCQlyZXR1cm4gMTsKKworCS8qIFNlbmQgd3JpdGUgZW5hYmxlLCB0aGVuIGVyYXNlIGNvbW1hbmRzLiAqLworCXdyaXRlX2VuYWJsZShmbGFzaCk7CisKKwkvKiBTZXQgdXAgY29tbWFuZCBidWZmZXIuICovCisJZmxhc2gtPmNvbW1hbmRbMF0gPSBPUENPREVfU0U7CisJZmxhc2gtPmNvbW1hbmRbMV0gPSBvZmZzZXQgPj4gMTY7CisJZmxhc2gtPmNvbW1hbmRbMl0gPSBvZmZzZXQgPj4gODsKKwlmbGFzaC0+Y29tbWFuZFszXSA9IG9mZnNldDsKKworCXNwaV93cml0ZShmbGFzaC0+c3BpLCBmbGFzaC0+Y29tbWFuZCwgc2l6ZW9mKGZsYXNoLT5jb21tYW5kKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBNVEQgaW1wbGVtZW50YXRpb24KKyAqLworCisvKgorICogRXJhc2UgYW4gYWRkcmVzcyByYW5nZSBvbiB0aGUgZmxhc2ggY2hpcC4gIFRoZSBhZGRyZXNzIHJhbmdlIG1heSBleHRlbmQKKyAqIG9uZSBvciBtb3JlIGVyYXNlIHNlY3RvcnMuICBSZXR1cm4gYW4gZXJyb3IgaXMgdGhlcmUgaXMgYSBwcm9ibGVtIGVyYXNpbmcuCisgKi8KK3N0YXRpYyBpbnQgbTI1cDgwX2VyYXNlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgZXJhc2VfaW5mbyAqaW5zdHIpCit7CisJc3RydWN0IG0yNXAgKmZsYXNoID0gbXRkX3RvX20yNXAobXRkKTsKKwl1MzIgYWRkcixsZW47CisKKwlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiJXM6ICVzICVzIDB4JTA4eCwgbGVuICV6ZFxuIiwKKwkJCWZsYXNoLT5zcGktPmRldi5idXNfaWQsIF9fRlVOQ1RJT05fXywgImF0IiwKKwkJCSh1MzIpaW5zdHItPmFkZHIsIGluc3RyLT5sZW4pOworCisJLyogc2FuaXR5IGNoZWNrcyAqLworCWlmIChpbnN0ci0+YWRkciArIGluc3RyLT5sZW4gPiBmbGFzaC0+bXRkLnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgoaW5zdHItPmFkZHIgJSBtdGQtPmVyYXNlc2l6ZSkgIT0gMAorCQkJfHwgKGluc3RyLT5sZW4gJSBtdGQtPmVyYXNlc2l6ZSkgIT0gMCkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlhZGRyID0gaW5zdHItPmFkZHI7CisJbGVuID0gaW5zdHItPmxlbjsKKworICAJZG93bigmZmxhc2gtPmxvY2spOworCisJLyogbm93IGVyYXNlIHRob3NlIHNlY3RvcnMgKi8KKwl3aGlsZSAobGVuKSB7CisJCWlmIChlcmFzZV9zZWN0b3IoZmxhc2gsIGFkZHIpKSB7CisJCQlpbnN0ci0+c3RhdGUgPSBNVERfRVJBU0VfRkFJTEVEOworCQkJdXAoJmZsYXNoLT5sb2NrKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJYWRkciArPSBtdGQtPmVyYXNlc2l6ZTsKKwkJbGVuIC09IG10ZC0+ZXJhc2VzaXplOworCX0KKworICAJdXAoJmZsYXNoLT5sb2NrKTsKKworCWluc3RyLT5zdGF0ZSA9IE1URF9FUkFTRV9ET05FOworCW10ZF9lcmFzZV9jYWxsYmFjayhpbnN0cik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgYW4gYWRkcmVzcyByYW5nZSBmcm9tIHRoZSBmbGFzaCBjaGlwLiAgVGhlIGFkZHJlc3MgcmFuZ2UKKyAqIG1heSBiZSBhbnkgc2l6ZSBwcm92aWRlZCBpdCBpcyB3aXRoaW4gdGhlIHBoeXNpY2FsIGJvdW5kYXJpZXMuCisgKi8KK3N0YXRpYyBpbnQgbTI1cDgwX3JlYWQoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLAorCXNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbTI1cCAqZmxhc2ggPSBtdGRfdG9fbTI1cChtdGQpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgdFsyXTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKKworCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogJXMgJXMgMHglMDh4LCBsZW4gJXpkXG4iLAorCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19GVU5DVElPTl9fLCAiZnJvbSIsCisJCQkodTMyKWZyb20sIGxlbik7CisKKwkvKiBzYW5pdHkgY2hlY2tzICovCisJaWYgKCFsZW4pCisJCXJldHVybiAwOworCisJaWYgKGZyb20gKyBsZW4gPiBmbGFzaC0+bXRkLnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbSk7CisJbWVtc2V0KHQsIDAsIChzaXplb2YgdCkpOworCisJdFswXS50eF9idWYgPSBmbGFzaC0+Y29tbWFuZDsKKwl0WzBdLmxlbiA9IHNpemVvZihmbGFzaC0+Y29tbWFuZCk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRbMF0sICZtKTsKKworCXRbMV0ucnhfYnVmID0gYnVmOworCXRbMV0ubGVuID0gbGVuOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0WzFdLCAmbSk7CisKKwkvKiBCeXRlIGNvdW50IHN0YXJ0cyBhdCB6ZXJvLiAqLworCWlmIChyZXRsZW4pCisJCSpyZXRsZW4gPSAwOworCisJZG93bigmZmxhc2gtPmxvY2spOworCisJLyogV2FpdCB0aWxsIHByZXZpb3VzIHdyaXRlL2VyYXNlIGlzIGRvbmUuICovCisJaWYgKHdhaXRfdGlsbF9yZWFkeShmbGFzaCkpIHsKKwkJLyogUkVWSVNJVCBzdGF0dXMgcmV0dXJuPz8gKi8KKwkJdXAoJmZsYXNoLT5sb2NrKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogTk9URTogIE9QQ09ERV9GQVNUX1JFQUQgKGlmIGF2YWlsYWJsZSkgaXMgZmFzdGVyLi4uICovCisKKwkvKiBTZXQgdXAgdGhlIHdyaXRlIGRhdGEgYnVmZmVyLiAqLworCWZsYXNoLT5jb21tYW5kWzBdID0gT1BDT0RFX1JFQUQ7CisJZmxhc2gtPmNvbW1hbmRbMV0gPSBmcm9tID4+IDE2OworCWZsYXNoLT5jb21tYW5kWzJdID0gZnJvbSA+PiA4OworCWZsYXNoLT5jb21tYW5kWzNdID0gZnJvbTsKKworCXNwaV9zeW5jKGZsYXNoLT5zcGksICZtKTsKKworCSpyZXRsZW4gPSBtLmFjdHVhbF9sZW5ndGggLSBzaXplb2YoZmxhc2gtPmNvbW1hbmQpOworCisgIAl1cCgmZmxhc2gtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXcml0ZSBhbiBhZGRyZXNzIHJhbmdlIHRvIHRoZSBmbGFzaCBjaGlwLiAgRGF0YSBtdXN0IGJlIHdyaXR0ZW4gaW4KKyAqIEZMQVNIX1BBR0VTSVpFIGNodW5rcy4gIFRoZSBhZGRyZXNzIHJhbmdlIG1heSBiZSBhbnkgc2l6ZSBwcm92aWRlZAorICogaXQgaXMgd2l0aGluIHRoZSBwaHlzaWNhbCBib3VuZGFyaWVzLgorICovCitzdGF0aWMgaW50IG0yNXA4MF93cml0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLCBzaXplX3QgbGVuLAorCXNpemVfdCAqcmV0bGVuLCBjb25zdCB1X2NoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbTI1cCAqZmxhc2ggPSBtdGRfdG9fbTI1cChtdGQpOworCXUzMiBwYWdlX29mZnNldCwgcGFnZV9zaXplOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgdFsyXTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKKworCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogJXMgJXMgMHglMDh4LCBsZW4gJXpkXG4iLAorCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19GVU5DVElPTl9fLCAidG8iLAorCQkJKHUzMil0bywgbGVuKTsKKworCWlmIChyZXRsZW4pCisJCSpyZXRsZW4gPSAwOworCisJLyogc2FuaXR5IGNoZWNrcyAqLworCWlmICghbGVuKQorCQlyZXR1cm4oMCk7CisKKwlpZiAodG8gKyBsZW4gPiBmbGFzaC0+bXRkLnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbSk7CisJbWVtc2V0KHQsIDAsIChzaXplb2YgdCkpOworCisJdFswXS50eF9idWYgPSBmbGFzaC0+Y29tbWFuZDsKKwl0WzBdLmxlbiA9IHNpemVvZihmbGFzaC0+Y29tbWFuZCk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRbMF0sICZtKTsKKworCXRbMV0udHhfYnVmID0gYnVmOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0WzFdLCAmbSk7CisKKyAgCWRvd24oJmZsYXNoLT5sb2NrKTsKKworCS8qIFdhaXQgdW50aWwgZmluaXNoZWQgcHJldmlvdXMgd3JpdGUgY29tbWFuZC4gKi8KKwlpZiAod2FpdF90aWxsX3JlYWR5KGZsYXNoKSkKKwkJcmV0dXJuIDE7CisKKwl3cml0ZV9lbmFibGUoZmxhc2gpOworCisJLyogU2V0IHVwIHRoZSBvcGNvZGUgaW4gdGhlIHdyaXRlIGJ1ZmZlci4gKi8KKwlmbGFzaC0+Y29tbWFuZFswXSA9IE9QQ09ERV9QUDsKKwlmbGFzaC0+Y29tbWFuZFsxXSA9IHRvID4+IDE2OworCWZsYXNoLT5jb21tYW5kWzJdID0gdG8gPj4gODsKKwlmbGFzaC0+Y29tbWFuZFszXSA9IHRvOworCisJLyogd2hhdCBwYWdlIGRvIHdlIHN0YXJ0IHdpdGg/ICovCisJcGFnZV9vZmZzZXQgPSB0byAlIEZMQVNIX1BBR0VTSVpFOworCisJLyogZG8gYWxsIHRoZSBieXRlcyBmaXQgb250byBvbmUgcGFnZT8gKi8KKwlpZiAocGFnZV9vZmZzZXQgKyBsZW4gPD0gRkxBU0hfUEFHRVNJWkUpIHsKKwkJdFsxXS5sZW4gPSBsZW47CisKKwkJc3BpX3N5bmMoZmxhc2gtPnNwaSwgJm0pOworCisJCSpyZXRsZW4gPSBtLmFjdHVhbF9sZW5ndGggLSBzaXplb2YoZmxhc2gtPmNvbW1hbmQpOworCX0gZWxzZSB7CisJCXUzMiBpOworCisJCS8qIHRoZSBzaXplIG9mIGRhdGEgcmVtYWluaW5nIG9uIHRoZSBmaXJzdCBwYWdlICovCisJCXBhZ2Vfc2l6ZSA9IEZMQVNIX1BBR0VTSVpFIC0gcGFnZV9vZmZzZXQ7CisKKwkJdFsxXS5sZW4gPSBwYWdlX3NpemU7CisJCXNwaV9zeW5jKGZsYXNoLT5zcGksICZtKTsKKworCQkqcmV0bGVuID0gbS5hY3R1YWxfbGVuZ3RoIC0gc2l6ZW9mKGZsYXNoLT5jb21tYW5kKTsKKworCQkvKiB3cml0ZSBldmVyeXRoaW5nIGluIFBBR0VTSVpFIGNodW5rcyAqLworCQlmb3IgKGkgPSBwYWdlX3NpemU7IGkgPCBsZW47IGkgKz0gcGFnZV9zaXplKSB7CisJCQlwYWdlX3NpemUgPSBsZW4gLSBpOworCQkJaWYgKHBhZ2Vfc2l6ZSA+IEZMQVNIX1BBR0VTSVpFKQorCQkJCXBhZ2Vfc2l6ZSA9IEZMQVNIX1BBR0VTSVpFOworCisJCQkvKiB3cml0ZSB0aGUgbmV4dCBwYWdlIHRvIGZsYXNoICovCisJCQlmbGFzaC0+Y29tbWFuZFsxXSA9ICh0byArIGkpID4+IDE2OworCQkJZmxhc2gtPmNvbW1hbmRbMl0gPSAodG8gKyBpKSA+PiA4OworCQkJZmxhc2gtPmNvbW1hbmRbM10gPSAodG8gKyBpKTsKKworCQkJdFsxXS50eF9idWYgPSBidWYgKyBpOworCQkJdFsxXS5sZW4gPSBwYWdlX3NpemU7CisKKwkJCXdhaXRfdGlsbF9yZWFkeShmbGFzaCk7CisKKwkJCXdyaXRlX2VuYWJsZShmbGFzaCk7CisKKwkJCXNwaV9zeW5jKGZsYXNoLT5zcGksICZtKTsKKworCQkJaWYgKHJldGxlbikKKwkJCQkqcmV0bGVuICs9IG0uYWN0dWFsX2xlbmd0aAorCQkJCQktIHNpemVvZihmbGFzaC0+Y29tbWFuZCk7CisJICAgICAgICB9CisgCX0KKworCXVwKCZmbGFzaC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFNQSSBkZXZpY2UgZHJpdmVyIHNldHVwIGFuZCB0ZWFyZG93bgorICovCisKK3N0cnVjdCBmbGFzaF9pbmZvIHsKKwljaGFyCQkqbmFtZTsKKwl1OAkJaWQ7CisJdTE2CQlqZWRlY19pZDsKKwl1bnNpZ25lZAlzZWN0b3Jfc2l6ZTsKKwl1bnNpZ25lZAluX3NlY3RvcnM7Cit9OworCitzdGF0aWMgc3RydWN0IGZsYXNoX2luZm8gX19kZXZpbml0ZGF0YSBtMjVwX2RhdGEgW10gPSB7CisJLyogUkVWSVNJVDogZmlsbCBpbiBKRURFQyBpZHMsIGZvciBwYXJ0cyB0aGF0IGhhdmUgdGhlbSAqLworCXsgIm0yNXAwNSIsIDB4MDUsIDB4MDAwMCwgMzIgKiAxMDI0LCAyIH0sCisJeyAibTI1cDEwIiwgMHgxMCwgMHgwMDAwLCAzMiAqIDEwMjQsIDQgfSwKKwl7ICJtMjVwMjAiLCAweDExLCAweDAwMDAsIDY0ICogMTAyNCwgNCB9LAorCXsgIm0yNXA0MCIsIDB4MTIsIDB4MDAwMCwgNjQgKiAxMDI0LCA4IH0sCisJeyAibTI1cDgwIiwgMHgxMywgMHgwMDAwLCA2NCAqIDEwMjQsIDE2IH0sCisJeyAibTI1cDE2IiwgMHgxNCwgMHgwMDAwLCA2NCAqIDEwMjQsIDMyIH0sCisJeyAibTI1cDMyIiwgMHgxNSwgMHgwMDAwLCA2NCAqIDEwMjQsIDY0IH0sCisJeyAibTI1cDY0IiwgMHgxNiwgMHgyMDE3LCA2NCAqIDEwMjQsIDEyOCB9LAorfTsKKworLyoKKyAqIGJvYXJkIHNwZWNpZmljIHNldHVwIHNob3VsZCBoYXZlIGVuc3VyZWQgdGhlIFNQSSBjbG9jayB1c2VkIGhlcmUKKyAqIG1hdGNoZXMgd2hhdCB0aGUgUkVBRCBjb21tYW5kIHN1cHBvcnRzLCBhdCBsZWFzdCB1bnRpbCB0aGlzIGRyaXZlcgorICogdW5kZXJzdGFuZHMgRkFTVF9SRUFEIChmb3IgY2xvY2tzIG92ZXIgMjUgTUh6KS4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgbTI1cF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhCSpkYXRhOworCXN0cnVjdCBtMjVwCQkJKmZsYXNoOworCXN0cnVjdCBmbGFzaF9pbmZvCQkqaW5mbzsKKwl1bnNpZ25lZAkJCWk7CisKKwkvKiBQbGF0Zm9ybSBkYXRhIGhlbHBzIHNvcnQgb3V0IHdoaWNoIGNoaXAgdHlwZSB3ZSBoYXZlLCBhcworCSAqIHdlbGwgYXMgaG93IHRoaXMgYm9hcmQgcGFydGl0aW9ucyBpdC4KKwkgKi8KKwlkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoIWRhdGEgfHwgIWRhdGEtPnR5cGUpIHsKKwkJLyogRklYTUUgc29tZSBjaGlwcyBjYW4gaWRlbnRpZnkgdGhlbXNlbHZlcyB3aXRoIFJFUworCQkgKiBvciBKRURFQyBnZXQtaWQgY29tbWFuZHMuICBUcnkgdGhlbSAuLi4KKwkJICovCisJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICIlczogbm8gY2hpcCBpZFxuIiwKKwkJCQlmbGFzaC0+c3BpLT5kZXYuYnVzX2lkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZm9yIChpID0gMCwgaW5mbyA9IG0yNXBfZGF0YTsgaSA8IEFSUkFZX1NJWkUobTI1cF9kYXRhKTsgaSsrLCBpbmZvKyspIHsKKwkJaWYgKHN0cmNtcChkYXRhLT50eXBlLCBpbmZvLT5uYW1lKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChpID09IEFSUkFZX1NJWkUobTI1cF9kYXRhKSkgeworCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHVucmVjb2duaXplZCBpZCAlc1xuIiwKKwkJCQlmbGFzaC0+c3BpLT5kZXYuYnVzX2lkLCBkYXRhLT50eXBlKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZmxhc2ggPSBremFsbG9jKHNpemVvZiAqZmxhc2gsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIWZsYXNoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZsYXNoLT5zcGkgPSBzcGk7CisJaW5pdF9NVVRFWCgmZmxhc2gtPmxvY2spOworCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIGZsYXNoKTsKKworCWlmIChkYXRhLT5uYW1lKQorCQlmbGFzaC0+bXRkLm5hbWUgPSBkYXRhLT5uYW1lOworCWVsc2UKKwkJZmxhc2gtPm10ZC5uYW1lID0gc3BpLT5kZXYuYnVzX2lkOworCisJZmxhc2gtPm10ZC50eXBlID0gTVREX05PUkZMQVNIOworCWZsYXNoLT5tdGQuZmxhZ3MgPSBNVERfQ0FQX05PUkZMQVNIOworCWZsYXNoLT5tdGQuc2l6ZSA9IGluZm8tPnNlY3Rvcl9zaXplICogaW5mby0+bl9zZWN0b3JzOworCWZsYXNoLT5tdGQuZXJhc2VzaXplID0gaW5mby0+c2VjdG9yX3NpemU7CisJZmxhc2gtPm10ZC5lcmFzZSA9IG0yNXA4MF9lcmFzZTsKKwlmbGFzaC0+bXRkLnJlYWQgPSBtMjVwODBfcmVhZDsKKwlmbGFzaC0+bXRkLndyaXRlID0gbTI1cDgwX3dyaXRlOworCisJZGV2X2luZm8oJnNwaS0+ZGV2LCAiJXMgKCVkIEtieXRlcylcbiIsIGluZm8tPm5hbWUsCisJCQlmbGFzaC0+bXRkLnNpemUgLyAxMDI0KTsKKworCURFQlVHKE1URF9ERUJVR19MRVZFTDIsCisJCSJtdGQgLm5hbWUgPSAlcywgLnNpemUgPSAweCUuOHggKCV1TSkgIgorCQkJIi5lcmFzZXNpemUgPSAweCUuOHggKCV1SykgLm51bWVyYXNlcmVnaW9ucyA9ICVkXG4iLAorCQlmbGFzaC0+bXRkLm5hbWUsCisJCWZsYXNoLT5tdGQuc2l6ZSwgZmxhc2gtPm10ZC5zaXplIC8gKDEwMjQqMTAyNCksCisJCWZsYXNoLT5tdGQuZXJhc2VzaXplLCBmbGFzaC0+bXRkLmVyYXNlc2l6ZSAvIDEwMjQsCisJCWZsYXNoLT5tdGQubnVtZXJhc2VyZWdpb25zKTsKKworCWlmIChmbGFzaC0+bXRkLm51bWVyYXNlcmVnaW9ucykKKwkJZm9yIChpID0gMDsgaSA8IGZsYXNoLT5tdGQubnVtZXJhc2VyZWdpb25zOyBpKyspCisJCQlERUJVRyhNVERfREVCVUdfTEVWRUwyLAorCQkJCSJtdGQuZXJhc2VyZWdpb25zWyVkXSA9IHsgLm9mZnNldCA9IDB4JS44eCwgIgorCQkJCSIuZXJhc2VzaXplID0gMHglLjh4ICgldUspLCAiCisJCQkJIi5udW1ibG9ja3MgPSAlZCB9XG4iLAorCQkJCWksIGZsYXNoLT5tdGQuZXJhc2VyZWdpb25zW2ldLm9mZnNldCwKKwkJCQlmbGFzaC0+bXRkLmVyYXNlcmVnaW9uc1tpXS5lcmFzZXNpemUsCisJCQkJZmxhc2gtPm10ZC5lcmFzZXJlZ2lvbnNbaV0uZXJhc2VzaXplIC8gMTAyNCwKKwkJCQlmbGFzaC0+bXRkLmVyYXNlcmVnaW9uc1tpXS5udW1ibG9ja3MpOworCisKKwkvKiBwYXJ0aXRpb25zIHNob3VsZCBtYXRjaCBzZWN0b3IgYm91bmRhcmllczsgYW5kIGl0IG1heSBiZSBnb29kIHRvCisJICogdXNlIHJlYWRvbmx5IHBhcnRpdGlvbnMgZm9yIHdyaXRlcHJvdGVjdGVkIHNlY3RvcnMgKEJQMi4uQlAwKS4KKwkgKi8KKwlpZiAobXRkX2hhc19wYXJ0aXRpb25zKCkpIHsKKwkJc3RydWN0IG10ZF9wYXJ0aXRpb24JKnBhcnRzID0gTlVMTDsKKwkJaW50CQkJbnJfcGFydHMgPSAwOworCisjaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCisJCXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMLCB9OworCisJCW5yX3BhcnRzID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoJmZsYXNoLT5tdGQsCisJCQkJcGFydF9wcm9iZXMsICZwYXJ0cywgMCk7CisjZW5kaWYKKworCQlpZiAobnJfcGFydHMgPD0gMCAmJiBkYXRhICYmIGRhdGEtPnBhcnRzKSB7CisJCQlwYXJ0cyA9IGRhdGEtPnBhcnRzOworCQkJbnJfcGFydHMgPSBkYXRhLT5ucl9wYXJ0czsKKwkJfQorCisJCWlmIChucl9wYXJ0cyA+IDApIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5ucl9wYXJ0czsgaSsrKSB7CisJCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgInBhcnRpdGlvbnNbJWRdID0gIgorCQkJCQkiey5uYW1lID0gJXMsIC5vZmZzZXQgPSAweCUuOHgsICIKKwkJCQkJCSIuc2l6ZSA9IDB4JS44eCAoJXVLKSB9XG4iLAorCQkJCQlpLCBkYXRhLT5wYXJ0c1tpXS5uYW1lLAorCQkJCQlkYXRhLT5wYXJ0c1tpXS5vZmZzZXQsCisJCQkJCWRhdGEtPnBhcnRzW2ldLnNpemUsCisJCQkJCWRhdGEtPnBhcnRzW2ldLnNpemUgLyAxMDI0KTsKKwkJCX0KKwkJCWZsYXNoLT5wYXJ0aXRpb25lZCA9IDE7CisJCQlyZXR1cm4gYWRkX210ZF9wYXJ0aXRpb25zKCZmbGFzaC0+bXRkLCBwYXJ0cywgbnJfcGFydHMpOworCQl9CisJfSBlbHNlIGlmIChkYXRhLT5ucl9wYXJ0cykKKwkJZGV2X3dhcm4oJnNwaS0+ZGV2LCAiaWdub3JpbmcgJWQgZGVmYXVsdCBwYXJ0aXRpb25zIG9uICVzXG4iLAorCQkJCWRhdGEtPm5yX3BhcnRzLCBkYXRhLT5uYW1lKTsKKworCXJldHVybiBhZGRfbXRkX2RldmljZSgmZmxhc2gtPm10ZCkgPT0gMSA/IC1FTk9ERVYgOiAwOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG0yNXBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IG0yNXAJKmZsYXNoID0gZGV2X2dldF9kcnZkYXRhKCZzcGktPmRldik7CisJaW50CQlzdGF0dXM7CisKKwkvKiBDbGVhbiB1cCBNVEQgc3R1ZmYuICovCisJaWYgKG10ZF9oYXNfcGFydGl0aW9ucygpICYmIGZsYXNoLT5wYXJ0aXRpb25lZCkKKwkJc3RhdHVzID0gZGVsX210ZF9wYXJ0aXRpb25zKCZmbGFzaC0+bXRkKTsKKwllbHNlCisJCXN0YXR1cyA9IGRlbF9tdGRfZGV2aWNlKCZmbGFzaC0+bXRkKTsKKwlpZiAoc3RhdHVzID09IDApCisJCWtmcmVlKGZsYXNoKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgbTI1cDgwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJtMjVwODAiLAorCQkuYnVzCT0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJPSBtMjVwX3Byb2JlLAorCS5yZW1vdmUJPSBfX2RldmV4aXRfcChtMjVwX3JlbW92ZSksCit9OworCisKK3N0YXRpYyBpbnQgbTI1cDgwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmbTI1cDgwX2RyaXZlcik7Cit9CisKKworc3RhdGljIHZvaWQgbTI1cDgwX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJm0yNXA4MF9kcml2ZXIpOworfQorCisKK21vZHVsZV9pbml0KG0yNXA4MF9pbml0KTsKK21vZHVsZV9leGl0KG0yNXA4MF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTWlrZSBMYXZlbmRlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNVEQgU1BJIGRyaXZlciBmb3IgU1QgTTI1UHh4IGZsYXNoIGNoaXBzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL210ZF9kYXRhZmxhc2guYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkX2RhdGFmbGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NTczN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL210ZF9kYXRhZmxhc2guYwpAQCAtMCwwICsxLDYyOSBAQAorLyoKKyAqIEF0bWVsIEFUNDV4eHggRGF0YUZsYXNoIE1URCBkcml2ZXIgZm9yIGxpZ2h0d2VpZ2h0IFNQSSBmcmFtZXdvcmsKKyAqCisgKiBMYXJnZWx5IGRlcml2ZWQgZnJvbSBhdDkxX2RhdGFmbGFzaC5jOgorICogIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IFNBTiBQZW9wbGUgKFB0eSkgTHRkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvZmxhc2guaD4KKworI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorCisKKy8qCisgKiBEYXRhRmxhc2ggaXMgYSBraW5kIG9mIFNQSSBmbGFzaC4gIE1vc3QgQVQ0NSBjaGlwcyBoYXZlIHR3byBidWZmZXJzIGluCisgKiBlYWNoIGNoaXAsIHdoaWNoIG1heSBiZSB1c2VkIGZvciBkb3VibGUgYnVmZmVyZWQgSS9POyBidXQgdGhpcyBkcml2ZXIKKyAqIGRvZXNuJ3QgKHlldCkgdXNlIHRoZXNlIGZvciBhbnkga2luZCBvZiBpL28gb3ZlcmxhcCBvciBwcmVmZXRjaGluZy4KKyAqCisgKiBTb21ldGltZXMgRGF0YUZsYXNoIGlzIHBhY2thZ2VkIGluIE1NQy1mb3JtYXQgY2FyZHMsIGFsdGhvdWdoIHRoZQorICogTU1DIHN0YWNrIGNhbid0IHVzZSBTUEkgKHlldCksIG9yIGRpc3Rpbmd1aXNoIGJldHdlZW4gTU1DIGFuZCBEYXRhRmxhc2gKKyAqIHByb3RvY29scyBkdXJpbmcgZW51bWVyYXRpb24uCisgKi8KKworI2RlZmluZSBDT05GSUdfREFUQUZMQVNIX1dSSVRFX1ZFUklGWQorCisvKiByZWFkcyBjYW4gYnlwYXNzIHRoZSBidWZmZXJzICovCisjZGVmaW5lIE9QX1JFQURfQ09OVElOVU9VUwkweEU4CisjZGVmaW5lIE9QX1JFQURfUEFHRQkJMHhEMgorCisvKiBncm91cCBCIHJlcXVlc3RzIGNhbiBydW4gZXZlbiB3aGlsZSBzdGF0dXMgcmVwb3J0cyAiYnVzeSIgKi8KKyNkZWZpbmUgT1BfUkVBRF9TVEFUVVMJCTB4RDcJLyogZ3JvdXAgQiAqLworCisvKiBtb3ZlIGRhdGEgYmV0d2VlbiBob3N0IGFuZCBidWZmZXIgKi8KKyNkZWZpbmUgT1BfUkVBRF9CVUZGRVIxCQkweEQ0CS8qIGdyb3VwIEIgKi8KKyNkZWZpbmUgT1BfUkVBRF9CVUZGRVIyCQkweEQ2CS8qIGdyb3VwIEIgKi8KKyNkZWZpbmUgT1BfV1JJVEVfQlVGRkVSMQkweDg0CS8qIGdyb3VwIEIgKi8KKyNkZWZpbmUgT1BfV1JJVEVfQlVGRkVSMgkweDg3CS8qIGdyb3VwIEIgKi8KKworLyogZXJhc2luZyBmbGFzaCAqLworI2RlZmluZSBPUF9FUkFTRV9QQUdFCQkweDgxCisjZGVmaW5lIE9QX0VSQVNFX0JMT0NLCQkweDUwCisKKy8qIG1vdmUgZGF0YSBiZXR3ZWVuIGJ1ZmZlciBhbmQgZmxhc2ggKi8KKyNkZWZpbmUgT1BfVFJBTlNGRVJfQlVGMQkweDUzCisjZGVmaW5lIE9QX1RSQU5TRkVSX0JVRjIJMHg1NQorI2RlZmluZSBPUF9NUkVBRF9CVUZGRVIxCTB4RDQKKyNkZWZpbmUgT1BfTVJFQURfQlVGRkVSMgkweEQ2CisjZGVmaW5lIE9QX01XRVJBU0VfQlVGRkVSMQkweDgzCisjZGVmaW5lIE9QX01XRVJBU0VfQlVGRkVSMgkweDg2CisjZGVmaW5lIE9QX01XUklURV9CVUZGRVIxCTB4ODgJLyogc2VjdG9yIG11c3QgYmUgcHJlLWVyYXNlZCAqLworI2RlZmluZSBPUF9NV1JJVEVfQlVGRkVSMgkweDg5CS8qIHNlY3RvciBtdXN0IGJlIHByZS1lcmFzZWQgKi8KKworLyogd3JpdGUgdG8gYnVmZmVyLCB0aGVuIHdyaXRlLWVyYXNlIHRvIGZsYXNoICovCisjZGVmaW5lIE9QX1BST0dSQU1fVklBX0JVRjEJMHg4MgorI2RlZmluZSBPUF9QUk9HUkFNX1ZJQV9CVUYyCTB4ODUKKworLyogY29tcGFyZSBidWZmZXIgdG8gZmxhc2ggKi8KKyNkZWZpbmUgT1BfQ09NUEFSRV9CVUYxCQkweDYwCisjZGVmaW5lIE9QX0NPTVBBUkVfQlVGMgkJMHg2MQorCisvKiByZWFkIGZsYXNoIHRvIGJ1ZmZlciwgdGhlbiB3cml0ZS1lcmFzZSB0byBmbGFzaCAqLworI2RlZmluZSBPUF9SRVdSSVRFX1ZJQV9CVUYxCTB4NTgKKyNkZWZpbmUgT1BfUkVXUklURV9WSUFfQlVGMgkweDU5CisKKy8qIG5ld2VyIGNoaXBzIHJlcG9ydCBKRURFQyBtYW51ZmFjdHVyZXIgYW5kIGRldmljZSBJRHM7IGNoaXAKKyAqIHNlcmlhbCBudW1iZXIgYW5kIE9UUCBiaXRzOyBhbmQgcGVyLXNlY3RvciB3cml0ZXByb3RlY3QuCisgKi8KKyNkZWZpbmUgT1BfUkVBRF9JRAkJMHg5RgorI2RlZmluZSBPUF9SRUFEX1NFQ1VSSVRZCTB4NzcKKyNkZWZpbmUgT1BfV1JJVEVfU0VDVVJJVFkJMHg5QQkvKiBPVFAgYml0cyAqLworCisKK3N0cnVjdCBkYXRhZmxhc2ggeworCXU4CQkJY29tbWFuZFs0XTsKKwljaGFyCQkJbmFtZVsyNF07CisKKwl1bnNpZ25lZAkJcGFydGl0aW9uZWQ6MTsKKworCXVuc2lnbmVkIHNob3J0CQlwYWdlX29mZnNldDsJLyogb2Zmc2V0IGluIGZsYXNoIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBpbnQJCXBhZ2Vfc2l6ZTsJLyogb2YgYnl0ZXMgcGVyIHBhZ2UgKi8KKworCXN0cnVjdCBzZW1hcGhvcmUJbG9jazsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpOworCisJc3RydWN0IG10ZF9pbmZvCQltdGQ7Cit9OworCisjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCisjZGVmaW5lCW10ZF9oYXNfcGFydGl0aW9ucygpCSgxKQorI2Vsc2UKKyNkZWZpbmUJbXRkX2hhc19wYXJ0aXRpb25zKCkJKDApCisjZW5kaWYKKworLyogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAqLworCisvKgorICogUmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIERhdGFGbGFzaCBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGRhdGFmbGFzaF9zdGF0dXMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwkvKiBOT1RFOiAgYXQ0NWRiMzIxYyBvdmVyIDI1IE1IeiB3YW50cyB0byB3cml0ZQorCSAqIGEgZHVtbXkgYnl0ZSBhZnRlciB0aGUgb3Bjb2RlLi4uCisJICovCisJcmV0dXJuIHNwaV93OHI4KHNwaSwgT1BfUkVBRF9TVEFUVVMpOworfQorCisvKgorICogUG9sbCB0aGUgRGF0YUZsYXNoIGRldmljZSB1bnRpbCBpdCBpcyBSRUFEWS4KKyAqIFRoaXMgdXN1YWxseSB0YWtlcyA1LTIwIG1zZWMgb3Igc287IG1vcmUgZm9yIHNlY3RvciBlcmFzZS4KKyAqLworc3RhdGljIGludCBkYXRhZmxhc2hfd2FpdHJlYWR5KHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50CXN0YXR1czsKKworCWZvciAoOzspIHsKKwkJc3RhdHVzID0gZGF0YWZsYXNoX3N0YXR1cyhzcGkpOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBzdGF0dXMgJWQ/XG4iLAorCQkJCQlzcGktPmRldi5idXNfaWQsIHN0YXR1cyk7CisJCQlzdGF0dXMgPSAwOworCQl9CisKKwkJaWYgKHN0YXR1cyAmICgxIDw8IDcpKQkvKiBSRFkvbkJTWSAqLworCQkJcmV0dXJuIHN0YXR1czsKKworCQltc2xlZXAoMyk7CisJfQorfQorCisvKiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICovCisKKy8qCisgKiBFcmFzZSBwYWdlcyBvZiBmbGFzaC4KKyAqLworc3RhdGljIGludCBkYXRhZmxhc2hfZXJhc2Uoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBlcmFzZV9pbmZvICppbnN0cikKK3sKKwlzdHJ1Y3QgZGF0YWZsYXNoCSpwcml2ID0gKHN0cnVjdCBkYXRhZmxhc2ggKiltdGQtPnByaXY7CisJc3RydWN0IHNwaV9kZXZpY2UJKnNwaSA9IHByaXYtPnNwaTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXggPSB7IC50eF9kbWEgPSAwLCB9OworCXN0cnVjdCBzcGlfbWVzc2FnZQltc2c7CisJdW5zaWduZWQJCWJsb2Nrc2l6ZSA9IHByaXYtPnBhZ2Vfc2l6ZSA8PCAzOworCXU4CQkJKmNvbW1hbmQ7CisKKwlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiJXM6IGVyYXNlIGFkZHI9MHgleCBsZW4gMHgleFxuIiwKKwkJCXNwaS0+ZGV2LmJ1c19pZCwKKwkJCWluc3RyLT5hZGRyLCBpbnN0ci0+bGVuKTsKKworCS8qIFNhbml0eSBjaGVja3MgKi8KKwlpZiAoKGluc3RyLT5hZGRyICsgaW5zdHItPmxlbikgPiBtdGQtPnNpemUKKwkJCXx8IChpbnN0ci0+bGVuICUgcHJpdi0+cGFnZV9zaXplKSAhPSAwCisJCQl8fCAoaW5zdHItPmFkZHIgJSBwcml2LT5wYWdlX3NpemUpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKworCXgudHhfYnVmID0gY29tbWFuZCA9IHByaXYtPmNvbW1hbmQ7CisJeC5sZW4gPSA0OworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4LCAmbXNnKTsKKworCWRvd24oJnByaXYtPmxvY2spOworCXdoaWxlIChpbnN0ci0+bGVuID4gMCkgeworCQl1bnNpZ25lZCBpbnQJcGFnZWFkZHI7CisJCWludAkJc3RhdHVzOworCQlpbnQJCWRvX2Jsb2NrOworCisJCS8qIENhbGN1bGF0ZSBmbGFzaCBwYWdlIGFkZHJlc3M7IHVzZSBibG9jayBlcmFzZSAoZm9yIHNwZWVkKSBpZgorCQkgKiB3ZSdyZSBhdCBhIGJsb2NrIGJvdW5kYXJ5IGFuZCBuZWVkIHRvIGVyYXNlIHRoZSB3aG9sZSBibG9jay4KKwkJICovCisJCXBhZ2VhZGRyID0gaW5zdHItPmFkZHIgLyBwcml2LT5wYWdlX3NpemU7CisJCWRvX2Jsb2NrID0gKHBhZ2VhZGRyICYgMHg3KSA9PSAwICYmIGluc3RyLT5sZW4gPD0gYmxvY2tzaXplOworCQlwYWdlYWRkciA9IHBhZ2VhZGRyIDw8IHByaXYtPnBhZ2Vfb2Zmc2V0OworCisJCWNvbW1hbmRbMF0gPSBkb19ibG9jayA/IE9QX0VSQVNFX0JMT0NLIDogT1BfRVJBU0VfUEFHRTsKKwkJY29tbWFuZFsxXSA9ICh1OCkocGFnZWFkZHIgPj4gMTYpOworCQljb21tYW5kWzJdID0gKHU4KShwYWdlYWRkciA+PiA4KTsKKwkJY29tbWFuZFszXSA9IDA7CisKKwkJREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIkVSQVNFICVzOiAoJXgpICV4ICV4ICV4IFslaV1cbiIsCisJCQlkb19ibG9jayA/ICJibG9jayIgOiAicGFnZSIsCisJCQljb21tYW5kWzBdLCBjb21tYW5kWzFdLCBjb21tYW5kWzJdLCBjb21tYW5kWzNdLAorCQkJcGFnZWFkZHIpOworCisJCXN0YXR1cyA9IHNwaV9zeW5jKHNwaSwgJm1zZyk7CisJCSh2b2lkKSBkYXRhZmxhc2hfd2FpdHJlYWR5KHNwaSk7CisKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVyYXNlICV4LCBlcnIgJWRcbiIsCisJCQkJc3BpLT5kZXYuYnVzX2lkLCBwYWdlYWRkciwgc3RhdHVzKTsKKwkJCS8qIFJFVklTSVQ6ICBjYW4gcmV0cnkgaW5zdHItPnJldHJpZXMgdGltZXM7IG9yCisJCQkgKiBnaXZldXAgYW5kIGluc3RyLT5mYWlsX2FkZHIgPSBpbnN0ci0+YWRkcjsKKwkJCSAqLworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoZG9fYmxvY2spIHsKKwkJCWluc3RyLT5hZGRyICs9IGJsb2Nrc2l6ZTsKKwkJCWluc3RyLT5sZW4gLT0gYmxvY2tzaXplOworCQl9IGVsc2UgeworCQkJaW5zdHItPmFkZHIgKz0gcHJpdi0+cGFnZV9zaXplOworCQkJaW5zdHItPmxlbiAtPSBwcml2LT5wYWdlX3NpemU7CisJCX0KKwl9CisJdXAoJnByaXYtPmxvY2spOworCisJLyogSW5mb3JtIE1URCBzdWJzeXN0ZW0gdGhhdCBlcmFzZSBpcyBjb21wbGV0ZSAqLworCWluc3RyLT5zdGF0ZSA9IE1URF9FUkFTRV9ET05FOworCW10ZF9lcmFzZV9jYWxsYmFjayhpbnN0cik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgZnJvbSB0aGUgRGF0YUZsYXNoIGRldmljZS4KKyAqICAgZnJvbSAgIDogU3RhcnQgb2Zmc2V0IGluIGZsYXNoIGRldmljZQorICogICBsZW4gICAgOiBBbW91bnQgdG8gcmVhZAorICogICByZXRsZW4gOiBBYm91dCBvZiBkYXRhIGFjdHVhbGx5IHJlYWQKKyAqICAgYnVmICAgIDogQnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEKKyAqLworc3RhdGljIGludCBkYXRhZmxhc2hfcmVhZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sCisJCQkgICAgICAgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKQoreworCXN0cnVjdCBkYXRhZmxhc2gJKnByaXYgPSAoc3RydWN0IGRhdGFmbGFzaCAqKW10ZC0+cHJpdjsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXhbMl0gPSB7IHsgLnR4X2RtYSA9IDAsIH0sIH07CisJc3RydWN0IHNwaV9tZXNzYWdlCW1zZzsKKwl1bnNpZ25lZCBpbnQJCWFkZHI7CisJdTgJCQkqY29tbWFuZDsKKwlpbnQJCQlzdGF0dXM7CisKKwlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiJXM6IHJlYWQgMHgleC4uMHgleFxuIiwKKwkJcHJpdi0+c3BpLT5kZXYuYnVzX2lkLCAodW5zaWduZWQpZnJvbSwgKHVuc2lnbmVkKShmcm9tICsgbGVuKSk7CisKKwkqcmV0bGVuID0gMDsKKworCS8qIFNhbml0eSBjaGVja3MgKi8KKwlpZiAoIWxlbikKKwkJcmV0dXJuIDA7CisJaWYgKGZyb20gKyBsZW4gPiBtdGQtPnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ2FsY3VsYXRlIGZsYXNoIHBhZ2UvYnl0ZSBhZGRyZXNzICovCisJYWRkciA9ICgoKHVuc2lnbmVkKWZyb20gLyBwcml2LT5wYWdlX3NpemUpIDw8IHByaXYtPnBhZ2Vfb2Zmc2V0KQorCQkrICgodW5zaWduZWQpZnJvbSAlIHByaXYtPnBhZ2Vfc2l6ZSk7CisKKwljb21tYW5kID0gcHJpdi0+Y29tbWFuZDsKKworCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJSRUFEOiAoJXgpICV4ICV4ICV4XG4iLAorCQljb21tYW5kWzBdLCBjb21tYW5kWzFdLCBjb21tYW5kWzJdLCBjb21tYW5kWzNdKTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisKKwl4WzBdLnR4X2J1ZiA9IGNvbW1hbmQ7CisJeFswXS5sZW4gPSA4OworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4WzBdLCAmbXNnKTsKKworCXhbMV0ucnhfYnVmID0gYnVmOworCXhbMV0ubGVuID0gbGVuOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4WzFdLCAmbXNnKTsKKworCWRvd24oJnByaXYtPmxvY2spOworCisJLyogQ29udGludW91cyByZWFkLCBtYXggY2xvY2sgPSBmKGNhcikgd2hpY2ggbWF5IGJlIGxlc3MgdGhhbgorCSAqIHRoZSBwZWFrIHJhdGUgYXZhaWxhYmxlLiAgU29tZSBjaGlwcyBzdXBwb3J0IGNvbW1hbmRzIHdpdGgKKwkgKiBmZXdlciAiZG9uJ3QgY2FyZSIgYnl0ZXMuICBCb3RoIGJ1ZmZlcnMgc3RheSB1bmNoYW5nZWQuCisJICovCisJY29tbWFuZFswXSA9IE9QX1JFQURfQ09OVElOVU9VUzsKKwljb21tYW5kWzFdID0gKHU4KShhZGRyID4+IDE2KTsKKwljb21tYW5kWzJdID0gKHU4KShhZGRyID4+IDgpOworCWNvbW1hbmRbM10gPSAodTgpKGFkZHIgPj4gMCk7CisJLyogcGx1cyA0ICJkb24ndCBjYXJlIiBieXRlcyAqLworCisJc3RhdHVzID0gc3BpX3N5bmMocHJpdi0+c3BpLCAmbXNnKTsKKwl1cCgmcHJpdi0+bG9jayk7CisKKwlpZiAoc3RhdHVzID49IDApIHsKKwkJKnJldGxlbiA9IG1zZy5hY3R1YWxfbGVuZ3RoIC0gODsKKwkJc3RhdHVzID0gMDsKKwl9IGVsc2UKKwkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiByZWFkICV4Li4leCAtLT4gJWRcbiIsCisJCQlwcml2LT5zcGktPmRldi5idXNfaWQsCisJCQkodW5zaWduZWQpZnJvbSwgKHVuc2lnbmVkKShmcm9tICsgbGVuKSwKKwkJCXN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIFdyaXRlIHRvIHRoZSBEYXRhRmxhc2ggZGV2aWNlLgorICogICB0byAgICAgOiBTdGFydCBvZmZzZXQgaW4gZmxhc2ggZGV2aWNlCisgKiAgIGxlbiAgICA6IEFtb3VudCB0byB3cml0ZQorICogICByZXRsZW4gOiBBbW91bnQgb2YgZGF0YSBhY3R1YWxseSB3cml0dGVuCisgKiAgIGJ1ZiAgICA6IEJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhCisgKi8KK3N0YXRpYyBpbnQgZGF0YWZsYXNoX3dyaXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sCisJCQkJc2l6ZV90ICogcmV0bGVuLCBjb25zdCB1X2NoYXIgKiBidWYpCit7CisJc3RydWN0IGRhdGFmbGFzaAkqcHJpdiA9IChzdHJ1Y3QgZGF0YWZsYXNoICopbXRkLT5wcml2OworCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGkgPSBwcml2LT5zcGk7CisJc3RydWN0IHNwaV90cmFuc2Zlcgl4WzJdID0geyB7IC50eF9kbWEgPSAwLCB9LCB9OworCXN0cnVjdCBzcGlfbWVzc2FnZQltc2c7CisJdW5zaWduZWQgaW50CQlwYWdlYWRkciwgYWRkciwgb2Zmc2V0LCB3cml0ZWxlbjsKKwlzaXplX3QJCQlyZW1haW5pbmcgPSBsZW47CisJdV9jaGFyCQkJKndyaXRlYnVmID0gKHVfY2hhciAqKSBidWY7CisJaW50CQkJc3RhdHVzID0gLUVJTlZBTDsKKwl1OAkJCSpjb21tYW5kOworCisJREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIiVzOiB3cml0ZSAweCV4Li4weCV4XG4iLAorCQlzcGktPmRldi5idXNfaWQsICh1bnNpZ25lZCl0bywgKHVuc2lnbmVkKSh0byArIGxlbikpOworCisJKnJldGxlbiA9IDA7CisKKwkvKiBTYW5pdHkgY2hlY2tzICovCisJaWYgKCFsZW4pCisJCXJldHVybiAwOworCWlmICgodG8gKyBsZW4pID4gbXRkLT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisKKwl4WzBdLnR4X2J1ZiA9IGNvbW1hbmQgPSBwcml2LT5jb21tYW5kOworCXhbMF0ubGVuID0gNDsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeFswXSwgJm1zZyk7CisKKwlwYWdlYWRkciA9ICgodW5zaWduZWQpdG8gLyBwcml2LT5wYWdlX3NpemUpOworCW9mZnNldCA9ICgodW5zaWduZWQpdG8gJSBwcml2LT5wYWdlX3NpemUpOworCWlmIChvZmZzZXQgKyBsZW4gPiBwcml2LT5wYWdlX3NpemUpCisJCXdyaXRlbGVuID0gcHJpdi0+cGFnZV9zaXplIC0gb2Zmc2V0OworCWVsc2UKKwkJd3JpdGVsZW4gPSBsZW47CisKKwlkb3duKCZwcml2LT5sb2NrKTsKKwl3aGlsZSAocmVtYWluaW5nID4gMCkgeworCQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAid3JpdGUgQCAlaTolaSBsZW49JWlcbiIsCisJCQlwYWdlYWRkciwgb2Zmc2V0LCB3cml0ZWxlbik7CisKKwkJLyogUkVWSVNJVDoKKwkJICogKGEpIGVhY2ggcGFnZSBpbiBhIHNlY3RvciBtdXN0IGJlIHJld3JpdHRlbiBhdCBsZWFzdAorCQkgKiAgICAgb25jZSBldmVyeSAxMEsgc2libGluZyBlcmFzZS9wcm9ncmFtIG9wZXJhdGlvbnMuCisJCSAqIChiKSBmb3IgcGFnZXMgdGhhdCBhcmUgYWxyZWFkeSBlcmFzZWQsIHdlIGNvdWxkCisJCSAqICAgICB1c2UgV1JJVEUrTVdSSVRFIG5vdCBQUk9HUkFNIGZvciB+MzAlIHNwZWVkdXAuCisJCSAqIChjKSBXUklURSB0byBidWZmZXIgY291bGQgYmUgZG9uZSB3aGlsZSB3YWl0aW5nIGZvcgorCQkgKiAgICAgYSBwcmV2aW91cyBNV1JJVEUvTVdFUkFTRSB0byBjb21wbGV0ZSAuLi4KKwkJICogKGQpIGVycm9yIGhhbmRsaW5nIGhlcmUgc2VlbXMgdG8gYmUgbW9zdGx5IG1pc3NpbmcuCisJCSAqCisJCSAqIFR3byBwZXJzaXN0ZW50IGJpdHMgcGVyIHBhZ2UsIHBsdXMgYSBwZXItc2VjdG9yIGNvdW50ZXIsCisJCSAqIGNvdWxkIHN1cHBvcnQgKGEpIGFuZCAoYikgLi4uIHdlIG1pZ2h0IGNvbnNpZGVyIHVzaW5nCisJCSAqIHRoZSBzZWNvbmQgaGFsZiBvZiBzZWN0b3IgemVybywgd2hpY2ggaXMganVzdCBvbmUgYmxvY2ssCisJCSAqIHRvIHRyYWNrIHRoYXQgc3RhdGUuICAoT24gQVQ5MSwgdGhhdCBzZWN0b3Igc2hvdWxkIGFsc28KKwkJICogc3VwcG9ydCBib290LWZyb20tRGF0YUZsYXNoLikKKwkJICovCisKKwkJYWRkciA9IHBhZ2VhZGRyIDw8IHByaXYtPnBhZ2Vfb2Zmc2V0OworCisJCS8qICgxKSBNYXliZSB0cmFuc2ZlciBwYXJ0aWFsIHBhZ2UgdG8gQnVmZmVyMSAqLworCQlpZiAod3JpdGVsZW4gIT0gcHJpdi0+cGFnZV9zaXplKSB7CisJCQljb21tYW5kWzBdID0gT1BfVFJBTlNGRVJfQlVGMTsKKwkJCWNvbW1hbmRbMV0gPSAoYWRkciAmIDB4MDBGRjAwMDApID4+IDE2OworCQkJY29tbWFuZFsyXSA9IChhZGRyICYgMHgwMDAwRkYwMCkgPj4gODsKKwkJCWNvbW1hbmRbM10gPSAwOworCisJCQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiVFJBTlNGRVI6ICgleCkgJXggJXggJXhcbiIsCisJCQkJY29tbWFuZFswXSwgY29tbWFuZFsxXSwgY29tbWFuZFsyXSwgY29tbWFuZFszXSk7CisKKwkJCXN0YXR1cyA9IHNwaV9zeW5jKHNwaSwgJm1zZyk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHhmZXIgJXUgLT4gJWQgXG4iLAorCQkJCQlzcGktPmRldi5idXNfaWQsIGFkZHIsIHN0YXR1cyk7CisKKwkJCSh2b2lkKSBkYXRhZmxhc2hfd2FpdHJlYWR5KHByaXYtPnNwaSk7CisJCX0KKworCQkvKiAoMikgUHJvZ3JhbSBmdWxsIHBhZ2UgdmlhIEJ1ZmZlcjEgKi8KKwkJYWRkciArPSBvZmZzZXQ7CisJCWNvbW1hbmRbMF0gPSBPUF9QUk9HUkFNX1ZJQV9CVUYxOworCQljb21tYW5kWzFdID0gKGFkZHIgJiAweDAwRkYwMDAwKSA+PiAxNjsKKwkJY29tbWFuZFsyXSA9IChhZGRyICYgMHgwMDAwRkYwMCkgPj4gODsKKwkJY29tbWFuZFszXSA9IChhZGRyICYgMHgwMDAwMDBGRik7CisKKwkJREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIlBST0dSQU06ICgleCkgJXggJXggJXhcbiIsCisJCQljb21tYW5kWzBdLCBjb21tYW5kWzFdLCBjb21tYW5kWzJdLCBjb21tYW5kWzNdKTsKKworCQl4WzFdLnR4X2J1ZiA9IHdyaXRlYnVmOworCQl4WzFdLmxlbiA9IHdyaXRlbGVuOworCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ICsgMSwgJm1zZyk7CisJCXN0YXR1cyA9IHNwaV9zeW5jKHNwaSwgJm1zZyk7CisJCXNwaV90cmFuc2Zlcl9kZWwoeCArIDEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICIlczogcGdtICV1LyV1IC0+ICVkIFxuIiwKKwkJCQlzcGktPmRldi5idXNfaWQsIGFkZHIsIHdyaXRlbGVuLCBzdGF0dXMpOworCisJCSh2b2lkKSBkYXRhZmxhc2hfd2FpdHJlYWR5KHByaXYtPnNwaSk7CisKKworI2lmZGVmCUNPTkZJR19EQVRBRkxBU0hfV1JJVEVfVkVSSUZZCisKKwkJLyogKDMpIENvbXBhcmUgdG8gQnVmZmVyMSAqLworCQlhZGRyID0gcGFnZWFkZHIgPDwgcHJpdi0+cGFnZV9vZmZzZXQ7CisJCWNvbW1hbmRbMF0gPSBPUF9DT01QQVJFX0JVRjE7CisJCWNvbW1hbmRbMV0gPSAoYWRkciAmIDB4MDBGRjAwMDApID4+IDE2OworCQljb21tYW5kWzJdID0gKGFkZHIgJiAweDAwMDBGRjAwKSA+PiA4OworCQljb21tYW5kWzNdID0gMDsKKworCQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiQ09NUEFSRTogKCV4KSAleCAleCAleFxuIiwKKwkJCWNvbW1hbmRbMF0sIGNvbW1hbmRbMV0sIGNvbW1hbmRbMl0sIGNvbW1hbmRbM10pOworCisJCXN0YXR1cyA9IHNwaV9zeW5jKHNwaSwgJm1zZyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBjb21wYXJlICV1IC0+ICVkIFxuIiwKKwkJCQlzcGktPmRldi5idXNfaWQsIGFkZHIsIHN0YXR1cyk7CisKKwkJc3RhdHVzID0gZGF0YWZsYXNoX3dhaXRyZWFkeShwcml2LT5zcGkpOworCisJCS8qIENoZWNrIHJlc3VsdCBvZiB0aGUgY29tcGFyZSBvcGVyYXRpb24gKi8KKwkJaWYgKChzdGF0dXMgJiAoMSA8PCA2KSkgPT0gMSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY29tcGFyZSBwYWdlICV1LCBlcnIgJWRcbiIsCisJCQkJc3BpLT5kZXYuYnVzX2lkLCBwYWdlYWRkciwgc3RhdHVzKTsKKwkJCXJlbWFpbmluZyA9IDA7CisJCQlzdGF0dXMgPSAtRUlPOworCQkJYnJlYWs7CisJCX0gZWxzZQorCQkJc3RhdHVzID0gMDsKKworI2VuZGlmCS8qIENPTkZJR19EQVRBRkxBU0hfV1JJVEVfVkVSSUZZICovCisKKwkJcmVtYWluaW5nID0gcmVtYWluaW5nIC0gd3JpdGVsZW47CisJCXBhZ2VhZGRyKys7CisJCW9mZnNldCA9IDA7CisJCXdyaXRlYnVmICs9IHdyaXRlbGVuOworCQkqcmV0bGVuICs9IHdyaXRlbGVuOworCisJCWlmIChyZW1haW5pbmcgPiBwcml2LT5wYWdlX3NpemUpCisJCQl3cml0ZWxlbiA9IHByaXYtPnBhZ2Vfc2l6ZTsKKwkJZWxzZQorCQkJd3JpdGVsZW4gPSByZW1haW5pbmc7CisJfQorCXVwKCZwcml2LT5sb2NrKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi8KKworLyoKKyAqIFJlZ2lzdGVyIERhdGFGbGFzaCBkZXZpY2Ugd2l0aCBNVEQgc3Vic3lzdGVtLgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdAorYWRkX2RhdGFmbGFzaChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBjaGFyICpuYW1lLAorCQlpbnQgbnJfcGFnZXMsIGludCBwYWdlc2l6ZSwgaW50IHBhZ2VvZmZzZXQpCit7CisJc3RydWN0IGRhdGFmbGFzaAkJKnByaXY7CisJc3RydWN0IG10ZF9pbmZvCQkJKmRldmljZTsKKwlzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YQkqcGRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCisJcHJpdiA9IChzdHJ1Y3QgZGF0YWZsYXNoICopIGt6YWxsb2Moc2l6ZW9mICpwcml2LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJaW5pdF9NVVRFWCgmcHJpdi0+bG9jayk7CisJcHJpdi0+c3BpID0gc3BpOworCXByaXYtPnBhZ2Vfc2l6ZSA9IHBhZ2VzaXplOworCXByaXYtPnBhZ2Vfb2Zmc2V0ID0gcGFnZW9mZnNldDsKKworCS8qIG5hbWUgbXVzdCBiZSB1c2FibGUgd2l0aCBjbWRsaW5lcGFydCAqLworCXNwcmludGYocHJpdi0+bmFtZSwgInNwaSVkLiVkLSVzIiwKKwkJCXNwaS0+bWFzdGVyLT5idXNfbnVtLCBzcGktPmNoaXBfc2VsZWN0LAorCQkJbmFtZSk7CisKKwlkZXZpY2UgPSAmcHJpdi0+bXRkOworCWRldmljZS0+bmFtZSA9IChwZGF0YSAmJiBwZGF0YS0+bmFtZSkgPyBwZGF0YS0+bmFtZSA6IHByaXYtPm5hbWU7CisJZGV2aWNlLT5zaXplID0gbnJfcGFnZXMgKiBwYWdlc2l6ZTsKKwlkZXZpY2UtPmVyYXNlc2l6ZSA9IHBhZ2VzaXplOworCWRldmljZS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlkZXZpY2UtPnR5cGUgPSBNVERfREFUQUZMQVNIOworCWRldmljZS0+ZmxhZ3MgPSBNVERfQ0FQX05PUkZMQVNIOworCWRldmljZS0+ZXJhc2UgPSBkYXRhZmxhc2hfZXJhc2U7CisJZGV2aWNlLT5yZWFkID0gZGF0YWZsYXNoX3JlYWQ7CisJZGV2aWNlLT53cml0ZSA9IGRhdGFmbGFzaF93cml0ZTsKKwlkZXZpY2UtPnByaXYgPSBwcml2OworCisJZGV2X2luZm8oJnNwaS0+ZGV2LCAiJXMgKCVkIEtCeXRlcylcbiIsIG5hbWUsIGRldmljZS0+c2l6ZS8xMDI0KTsKKwlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBwcml2KTsKKworCWlmIChtdGRfaGFzX3BhcnRpdGlvbnMoKSkgeworCQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbgkqcGFydHM7CisJCWludAkJCW5yX3BhcnRzID0gMDsKKworI2lmZGVmIENPTkZJR19NVERfQ01ETElORV9QQVJUUworCQlzdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCwgfTsKKworCQlucl9wYXJ0cyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGRldmljZSwgcGFydF9wcm9iZXMsICZwYXJ0cywgMCk7CisjZW5kaWYKKworCQlpZiAobnJfcGFydHMgPD0gMCAmJiBwZGF0YSAmJiBwZGF0YS0+cGFydHMpIHsKKwkJCXBhcnRzID0gcGRhdGEtPnBhcnRzOworCQkJbnJfcGFydHMgPSBwZGF0YS0+bnJfcGFydHM7CisJCX0KKworCQlpZiAobnJfcGFydHMgPiAwKSB7CisJCQlwcml2LT5wYXJ0aXRpb25lZCA9IDE7CisJCQlyZXR1cm4gYWRkX210ZF9wYXJ0aXRpb25zKGRldmljZSwgcGFydHMsIG5yX3BhcnRzKTsKKwkJfQorCX0gZWxzZSBpZiAocGRhdGEgJiYgcGRhdGEtPm5yX3BhcnRzKQorCQlkZXZfd2Fybigmc3BpLT5kZXYsICJpZ25vcmluZyAlZCBkZWZhdWx0IHBhcnRpdGlvbnMgb24gJXNcbiIsCisJCQkJcGRhdGEtPm5yX3BhcnRzLCBkZXZpY2UtPm5hbWUpOworCisJcmV0dXJuIGFkZF9tdGRfZGV2aWNlKGRldmljZSkgPT0gMSA/IC1FTk9ERVYgOiAwOworfQorCisvKgorICogRGV0ZWN0IGFuZCBpbml0aWFsaXplIERhdGFGbGFzaCBkZXZpY2U6CisgKgorICogICBEZXZpY2UgICAgICBEZW5zaXR5ICAgICAgICAgSUQgY29kZSAgICAgICAgICAjUGFnZXMgUGFnZVNpemUgIE9mZnNldAorICogICBBVDQ1REIwMTFCICAxTWJpdCAgICgxMjhLKSAgeHgwMDExeHggKDB4MGMpICAgIDUxMiAgICAyNjQgICAgICA5CisgKiAgIEFUNDVEQjAyMUIgIDJNYml0ICAgKDI1NkspICB4eDAxMDF4eCAoMHgxNCkgICAxMDI1ICAgIDI2NCAgICAgIDkKKyAqICAgQVQ0NURCMDQxQiAgNE1iaXQgICAoNTEySykgIHh4MDExMXh4ICgweDFjKSAgIDIwNDggICAgMjY0ICAgICAgOQorICogICBBVDQ1REIwODFCICA4TWJpdCAgICgxTSkgICAgeHgxMDAxeHggKDB4MjQpICAgNDA5NiAgICAyNjQgICAgICA5CisgKiAgIEFUNDVEQjAxNjFCIDE2TWJpdCAgKDJNKSAgICB4eDEwMTF4eCAoMHgyYykgICA0MDk2ICAgIDUyOCAgICAgMTAKKyAqICAgQVQ0NURCMDMyMUIgMzJNYml0ICAoNE0pICAgIHh4MTEwMXh4ICgweDM0KSAgIDgxOTIgICAgNTI4ICAgICAxMAorICogICBBVDQ1REIwNjQyICA2NE1iaXQgICg4TSkgICAgeHgxMTF4eHggKDB4M2MpICAgODE5MiAgIDEwNTYgICAgIDExCisgKiAgIEFUNDVEQjEyODIgIDEyOE1iaXQgKDE2TSkgICB4eDAxMDB4eCAoMHgxMCkgIDE2Mzg0ICAgMTA1NiAgICAgMTEKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgZGF0YWZsYXNoX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGRhdGFmbGFzaF9zdGF0dXMoc3BpKTsKKwlpZiAoc3RhdHVzIDw9IDAgfHwgc3RhdHVzID09IDB4ZmYpIHsKKwkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBzdGF0dXMgZXJyb3IgJWRcbiIsCisJCQkJc3BpLT5kZXYuYnVzX2lkLCBzdGF0dXMpOworCQlpZiAoc3RhdHVzID09IDB4ZmYpCisJCQlzdGF0dXMgPSAtRU5PREVWOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIGlmIHRoZXJlJ3MgYSBkZXZpY2UgdGhlcmUsIGFzc3VtZSBpdCdzIGRhdGFmbGFzaC4KKwkgKiBib2FyZCBzZXR1cCBzaG91bGQgaGF2ZSBzZXQgc3BpLT5tYXhfc3BlZWRfbWF4IHRvCisJICogbWF0Y2ggZihjYXIpIGZvciBjb250aW51b3VzIHJlYWRzLCBtb2RlIDAgb3IgMy4KKwkgKi8KKwlzd2l0Y2ggKHN0YXR1cyAmIDB4M2MpIHsKKwljYXNlIDB4MGM6CS8qIDAgMCAxIDEgeCB4ICovCisJCXN0YXR1cyA9IGFkZF9kYXRhZmxhc2goc3BpLCAiQVQ0NURCMDExQiIsIDUxMiwgMjY0LCA5KTsKKwkJYnJlYWs7CisJY2FzZSAweDE0OgkvKiAwIDEgMCAxIHggeCAqLworCQlzdGF0dXMgPSBhZGRfZGF0YWZsYXNoKHNwaSwgIkFUNDVEQjAyMUIiLCAxMDI1LCAyNjQsIDkpOworCQlicmVhazsKKwljYXNlIDB4MWM6CS8qIDAgMSAxIDEgeCB4ICovCisJCXN0YXR1cyA9IGFkZF9kYXRhZmxhc2goc3BpLCAiQVQ0NURCMDQxeCIsIDIwNDgsIDI2NCwgOSk7CisJCWJyZWFrOworCWNhc2UgMHgyNDoJLyogMSAwIDAgMSB4IHggKi8KKwkJc3RhdHVzID0gYWRkX2RhdGFmbGFzaChzcGksICJBVDQ1REIwODFCIiwgNDA5NiwgMjY0LCA5KTsKKwkJYnJlYWs7CisJY2FzZSAweDJjOgkvKiAxIDAgMSAxIHggeCAqLworCQlzdGF0dXMgPSBhZGRfZGF0YWZsYXNoKHNwaSwgIkFUNDVEQjE2MXgiLCA0MDk2LCA1MjgsIDEwKTsKKwkJYnJlYWs7CisJY2FzZSAweDM0OgkvKiAxIDEgMCAxIHggeCAqLworCQlzdGF0dXMgPSBhZGRfZGF0YWZsYXNoKHNwaSwgIkFUNDVEQjMyMXgiLCA4MTkyLCA1MjgsIDEwKTsKKwkJYnJlYWs7CisJY2FzZSAweDM4OgkvKiAxIDEgMSB4IHggeCAqLworCWNhc2UgMHgzYzoKKwkJc3RhdHVzID0gYWRkX2RhdGFmbGFzaChzcGksICJBVDQ1REI2NDJ4IiwgODE5MiwgMTA1NiwgMTEpOworCQlicmVhazsKKwkvKiBvYnNvbGV0ZSBBVDQ1REIxMjgyIG5vdCAoeWV0Pykgc3VwcG9ydGVkICovCisJZGVmYXVsdDoKKwkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiB1bnN1cHBvcnRlZCBkZXZpY2UgKCV4KVxuIiwKKwkJCQlzcGktPmRldi5idXNfaWQsIHN0YXR1cyAmIDB4M2MpOworCQlzdGF0dXMgPSAtRU5PREVWOworCX0KKworCWlmIChzdGF0dXMgPCAwKQorCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IGFkZF9kYXRhZmxhc2ggLS0+ICVkXG4iLAorCQkJCXNwaS0+ZGV2LmJ1c19pZCwgc3RhdHVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGRhdGFmbGFzaF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgZGF0YWZsYXNoCSpmbGFzaCA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpLT5kZXYpOworCWludAkJCXN0YXR1czsKKworCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICIlczogcmVtb3ZlXG4iLCBzcGktPmRldi5idXNfaWQpOworCisJaWYgKG10ZF9oYXNfcGFydGl0aW9ucygpICYmIGZsYXNoLT5wYXJ0aXRpb25lZCkKKwkJc3RhdHVzID0gZGVsX210ZF9wYXJ0aXRpb25zKCZmbGFzaC0+bXRkKTsKKwllbHNlCisJCXN0YXR1cyA9IGRlbF9tdGRfZGV2aWNlKCZmbGFzaC0+bXRkKTsKKwlpZiAoc3RhdHVzID09IDApCisJCWtmcmVlKGZsYXNoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgZGF0YWZsYXNoX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQkJPSAibXRkX2RhdGFmbGFzaCIsCisJCS5idXMJCT0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCX0sCisKKwkucHJvYmUJCT0gZGF0YWZsYXNoX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZGF0YWZsYXNoX3JlbW92ZSksCisKKwkvKiBGSVhNRTogIGludmVzdGlnYXRlIHN1c3BlbmQgYW5kIHJlc3VtZS4uLiAqLworfTsKKworc3RhdGljIGludCBfX2luaXQgZGF0YWZsYXNoX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmZGF0YWZsYXNoX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChkYXRhZmxhc2hfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkYXRhZmxhc2hfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmZGF0YWZsYXNoX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChkYXRhZmxhc2hfZXhpdCk7CisKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQW5kcmV3IFZpY3RvciwgRGF2aWQgQnJvd25lbGwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTVREIERhdGFGbGFzaCBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZwppbmRleCBiOWI3N2NmLi43YWJkN2ZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCkBAIC00NzMsMTQgKzQ3Myw2IEBACiAJICBJWERQNDI1IGFuZCBDb3lvdGUuIElmIHlvdSBoYXZlIGFuIElYUDIwMDAgYmFzZWQgYm9hcmQgYW5kCiAJICB3b3VsZCBsaWtlIHRvIHVzZSB0aGUgZmxhc2ggY2hpcHMgb24gaXQsIHNheSAnWScuCiAKLWNvbmZpZyBNVERfRVBYQTEwREIKLQl0cmlzdGF0ZSAiQ0ZJIEZsYXNoIGRldmljZSBtYXBwZWQgb24gRXB4YTEwZGIiCi0JZGVwZW5kcyBvbiBNVERfQ0ZJICYmIE1URF9QQVJUSVRJT05TICYmIEFSQ0hfQ0FNRUxPVAotCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgZmxhc2ggZGV2aWNlcyBvbiB0aGUgQWx0ZXJhCi0JICBFeGNhbGlidXIgWEExMCBEZXZlbG9wbWVudCBCb2FyZC4gSWYgeW91IGFyZSBidWlsZGluZyBhIGtlcm5lbAotCSAgZm9yIG9uIG9mIHRoZXNlIGJvYXJkcyB0aGVuIHlvdSBzaG91bGQgc2F5ICdZJyBvdGhlcndpc2Ugc2F5ICdOJy4KLQogY29uZmlnIE1URF9GT1JUVU5FVAogCXRyaXN0YXRlICJDRkkgRmxhc2ggZGV2aWNlIG1hcHBlZCBvbiB0aGUgRm9ydHVOZXQgYm9hcmQiCiAJZGVwZW5kcyBvbiBNVERfQ0ZJICYmIE1URF9QQVJUSVRJT05TICYmIFNBMTEwMF9GT1JUVU5FVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL21hcHMvTWFrZWZpbGUKaW5kZXggMmY3ZTI1NC4uYWI3MWYxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL210ZC9tYXBzL01ha2VmaWxlCkBAIC0xNSw3ICsxNSw2IEBACiBvYmotJChDT05GSUdfTVREX0NTVE1fTUlQU19JWFgpCSs9IGNzdG1fbWlwc19peHgubwogb2JqLSQoQ09ORklHX01URF9EQzIxMjg1KQkrPSBkYzIxMjg1Lm8KIG9iai0kKENPTkZJR19NVERfRElMTkVUUEMpCSs9IGRpbG5ldHBjLm8KLW9iai0kKENPTkZJR19NVERfRVBYQTEwREIpCSs9IGVweGExMGRiLWZsYXNoLm8KIG9iai0kKENPTkZJR19NVERfSVE4MDMxMCkJKz0gaXE4MDMxMC5vCiBvYmotJChDT05GSUdfTVREX0w0NDBHWCkJKz0gbDQ0MGd4Lm8KIG9iai0kKENPTkZJR19NVERfQU1ENzZYUk9NKQkrPSBhbWQ3Nnhyb20ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9lcHhhMTBkYi1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9lcHhhMTBkYi1mbGFzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjViMDc5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbXRkL21hcHMvZXB4YTEwZGItZmxhc2guYworKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKgotICogRmxhc2ggbWVtb3J5IGFjY2VzcyBvbiBFUFhBIGJhc2VkIGRldmljZXMKLSAqCi0gKiAoQykgMjAwMCBOaWNvbGFzIFBpdHJlIDxuaWNvQGNhbS5vcmc+Ci0gKiAgQ29weXJpZ2h0IChDKSAyMDAxIEFsdGVyYSBDb3Jwb3JhdGlvbgotICogIENvcHlyaWdodCAoQykgMjAwMSBSZWQgSGF0LCBJbmMuCi0gKgotICogJElkOiBlcHhhMTBkYi1mbGFzaC5jLHYgMS4xNSAyMDA1LzExLzA3IDExOjE0OjI3IGdsZWl4bmVyIEV4cCAkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KLQotI2lmZGVmIENPTkZJR19FUFhBMTBEQgotI2RlZmluZSBCT0FSRF9OQU1FICJFUFhBMTBEQiIKLSNlbHNlCi0jZGVmaW5lIEJPQVJEX05BTUUgIkVQWEExREIiCi0jZW5kaWYKLQotc3RhdGljIGludCBucl9wYXJ0cyA9IDA7Ci1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzOwotCi1zdGF0aWMgc3RydWN0IG10ZF9pbmZvICpteW10ZDsKLQotc3RhdGljIGludCBlcHhhX2RlZmF1bHRfcGFydGl0aW9ucyhzdHJ1Y3QgbXRkX2luZm8gKm1hc3Rlciwgc3RydWN0IG10ZF9wYXJ0aXRpb24gKipwcGFydHMpOwotCi0KLXN0YXRpYyBzdHJ1Y3QgbWFwX2luZm8gZXB4YV9tYXAgPSB7Ci0JLm5hbWUgPQkJIkVQWEEgZmxhc2giLAotCS5zaXplID0JCUZMQVNIX1NJWkUsCi0JLmJhbmt3aWR0aCA9CTIsCi0JLnBoeXMgPQkJRkxBU0hfU1RBUlQsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqcHJvYmVzW10gPSB7ICJSZWRCb290IiwgImFmcyIsIE5VTEwgfTsKLQotc3RhdGljIGludCBfX2luaXQgZXB4YV9tdGRfaW5pdCh2b2lkKQotewotCWludCBpOwotCi0JcHJpbnRrKEtFUk5fTk9USUNFICIlcyBmbGFzaCBkZXZpY2U6IDB4JXggYXQgMHgleFxuIiwgQk9BUkRfTkFNRSwgRkxBU0hfU0laRSwgRkxBU0hfU1RBUlQpOwotCi0JZXB4YV9tYXAudmlydCA9IGlvcmVtYXAoRkxBU0hfU1RBUlQsIEZMQVNIX1NJWkUpOwotCWlmICghZXB4YV9tYXAudmlydCkgewotCQlwcmludGsoIkZhaWxlZCB0byBpb3JlbWFwICVzIGZsYXNoXG4iLEJPQVJEX05BTUUpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0Jc2ltcGxlX21hcF9pbml0KCZlcHhhX21hcCk7Ci0KLQlteW10ZCA9IGRvX21hcF9wcm9iZSgiY2ZpX3Byb2JlIiwgJmVweGFfbWFwKTsKLQlpZiAoIW15bXRkKSB7Ci0JCWlvdW5tYXAoKHZvaWQgKillcHhhX21hcC52aXJ0KTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQlteW10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKLQotCS8qIFVubG9jayB0aGUgZmxhc2ggZGV2aWNlLiAqLwotCWlmKG15bXRkLT51bmxvY2spewotCQlmb3IgKGk9MDsgaTxteW10ZC0+bnVtZXJhc2VyZWdpb25zO2krKyl7Ci0JCQlpbnQgajsKLQkJCWZvcihqPTA7ajxteW10ZC0+ZXJhc2VyZWdpb25zW2ldLm51bWJsb2NrcztqKyspewotCQkJCW15bXRkLT51bmxvY2sobXltdGQsbXltdGQtPmVyYXNlcmVnaW9uc1tpXS5vZmZzZXQgKyBqICogbXltdGQtPmVyYXNlcmVnaW9uc1tpXS5lcmFzZXNpemUsbXltdGQtPmVyYXNlcmVnaW9uc1tpXS5lcmFzZXNpemUpOwotCQkJfQotCQl9Ci0JfQotCi0jaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCi0JbnJfcGFydHMgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhteW10ZCwgcHJvYmVzLCAmcGFydHMsIDApOwotCi0JaWYgKG5yX3BhcnRzID4gMCkgewotCQlhZGRfbXRkX3BhcnRpdGlvbnMobXltdGQsIHBhcnRzLCBucl9wYXJ0cyk7Ci0JCXJldHVybiAwOwotCX0KLSNlbmRpZgotCS8qIE5vIHJlY29nbmlzZWQgcGFydGl0aW9uaW5nIHNjaGVtZXMgZm91bmQgLSB1c2UgZGVmYXVsdHMgKi8KLQlucl9wYXJ0cyA9IGVweGFfZGVmYXVsdF9wYXJ0aXRpb25zKG15bXRkLCAmcGFydHMpOwotCWlmIChucl9wYXJ0cyA+IDApIHsKLQkJYWRkX210ZF9wYXJ0aXRpb25zKG15bXRkLCBwYXJ0cywgbnJfcGFydHMpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBJZiBhbGwgZWxzZSBmYWlscy4uLiAqLwotCWFkZF9tdGRfZGV2aWNlKG15bXRkKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGVweGFfbXRkX2NsZWFudXAodm9pZCkKLXsKLQlpZiAobXltdGQpIHsKLQkJaWYgKG5yX3BhcnRzKQotCQkJZGVsX210ZF9wYXJ0aXRpb25zKG15bXRkKTsKLQkJZWxzZQotCQkJZGVsX210ZF9kZXZpY2UobXltdGQpOwotCQltYXBfZGVzdHJveShteW10ZCk7Ci0JfQotCWlmIChlcHhhX21hcC52aXJ0KSB7Ci0JCWlvdW5tYXAoKHZvaWQgKillcHhhX21hcC52aXJ0KTsKLQkJZXB4YV9tYXAudmlydCA9IDA7Ci0JfQotfQotCi0KLS8qCi0gKiBUaGlzIHdpbGwgZG8gZm9yIG5vdywgb25jZSB3ZSBkZWNpZGUgd2hpY2ggYm9vdGxkciB3ZSdyZSBmaW5hbGx5Ci0gKiBnb2luZyB0byB1c2UgdGhlbiB3ZSdsbCByZW1vdmUgdGhpcyBmdW5jdGlvbiBhbmQgZG8gaXQgcHJvcGVybHkKLSAqCi0gKiBQYXJ0aW9ucyBhcmUgY3VycmVudGx5IChhcyBvZmZzZXRzIGZyb20gYmFzZSBvZiBmbGFzaCk6Ci0gKiAweDAwMDAwMDAwIC0gMHgwMDNGRkZGRiAtIGJvb3Rsb2FkZXIgKCEpCi0gKiAweDAwNDAwMDAwIC0gMHgwMEZGRkZGRiAtIEZsYXNoZGlzawotICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGVweGFfZGVmYXVsdF9wYXJ0aXRpb25zKHN0cnVjdCBtdGRfaW5mbyAqbWFzdGVyLCBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqKnBwYXJ0cykKLXsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7Ci0JaW50IHJldCwgaTsKLQlpbnQgbnBhcnRpdGlvbnMgPSAwOwotCWNoYXIgKm5hbWVzOwotCWNvbnN0IGNoYXIgKm5hbWUgPSAiamZmcyI7Ci0KLQlwcmludGsoIlVzaW5nIGRlZmF1bHQgcGFydGl0aW9ucyBmb3IgJXNcbiIsQk9BUkRfTkFNRSk7Ci0JbnBhcnRpdGlvbnM9MTsKLQlwYXJ0cyA9IGttYWxsb2MobnBhcnRpdGlvbnMqc2l6ZW9mKCpwYXJ0cykrc3RybGVuKG5hbWUpLCBHRlBfS0VSTkVMKTsKLQltZW16ZXJvKHBhcnRzLG5wYXJ0aXRpb25zKnNpemVvZigqcGFydHMpK3N0cmxlbihuYW1lKSk7Ci0JaWYgKCFwYXJ0cykgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0JaT0wOwotCW5hbWVzID0gKGNoYXIgKikmcGFydHNbbnBhcnRpdGlvbnNdOwotCXBhcnRzW2ldLm5hbWUgPSBuYW1lczsKLQluYW1lcyArPSBzdHJsZW4obmFtZSkgKyAxOwotCXN0cmNweShwYXJ0c1tpXS5uYW1lLCBuYW1lKTsKLQotI2lmZGVmIENPTkZJR19FUFhBMTBEQgotCXBhcnRzW2ldLnNpemUgPSBGTEFTSF9TSVpFLTB4MDA0MDAwMDA7Ci0JcGFydHNbaV0ub2Zmc2V0ID0gMHgwMDQwMDAwMDsKLSNlbHNlCi0JcGFydHNbaV0uc2l6ZSA9IEZMQVNIX1NJWkUtMHgwMDE4MDAwMDsKLQlwYXJ0c1tpXS5vZmZzZXQgPSAweDAwMTgwMDAwOwotI2VuZGlmCi0KLSBvdXQ6Ci0JKnBwYXJ0cyA9IHBhcnRzOwotCXJldHVybiBucGFydGl0aW9uczsKLX0KLQotCi1tb2R1bGVfaW5pdChlcHhhX210ZF9pbml0KTsKLW1vZHVsZV9leGl0KGVweGFfbXRkX2NsZWFudXApOwotCi1NT0RVTEVfQVVUSE9SKCJDbGl2ZSBEYXZpZXMiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQWx0ZXJhIGVweGEgbXRkIGZsYXNoIG1hcCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbXRkX2Jsa2RldnMuYyBiL2RyaXZlcnMvbXRkL210ZF9ibGtkZXZzLmMKaW5kZXggMzM5Y2IxMi4uN2YzZmY1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkX2Jsa2RldnMuYworKysgYi9kcml2ZXJzL210ZC9tdGRfYmxrZGV2cy5jCkBAIC0xOTQsNiArMTk0LDE0IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBibGt0cmFuc19nZXRnZW8oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8pCit7CisJc3RydWN0IG10ZF9ibGt0cmFuc19kZXYgKmRldiA9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKKworCWlmIChkZXYtPnRyLT5nZXRnZW8pCisJCXJldHVybiBkZXYtPnRyLT5nZXRnZW8oZGV2LCBnZW8pOworCXJldHVybiAtRU5PVFRZOworfQogCiBzdGF0aWMgaW50IGJsa3RyYW5zX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCkBAIC0yMDcsMjIgKzIxNSw2IEBACiAJCQlyZXR1cm4gdHItPmZsdXNoKGRldik7CiAJCS8qIFRoZSBjb3JlIGNvZGUgZGlkIHRoZSB3b3JrLCB3ZSBoYWQgbm90aGluZyB0byBkby4gKi8KIAkJcmV0dXJuIDA7Ci0KLQljYXNlIEhESU9fR0VUR0VPOgotCQlpZiAodHItPmdldGdlbykgewotCQkJc3RydWN0IGhkX2dlb21ldHJ5IGc7Ci0JCQlpbnQgcmV0OwotCi0JCQltZW1zZXQoJmcsIDAsIHNpemVvZihnKSk7Ci0JCQlyZXQgPSB0ci0+Z2V0Z2VvKGRldiwgJmcpOwotCQkJaWYgKHJldCkKLQkJCQlyZXR1cm4gcmV0OwotCi0JCQlnLnN0YXJ0ID0gZ2V0X3N0YXJ0X3NlY3QoaW5vZGUtPmlfYmRldik7Ci0JCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmcsIHNpemVvZihnKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlyZXR1cm4gMDsKLQkJfSAvKiBlbHNlICovCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9UVFk7CiAJfQpAQCAtMjMzLDYgKzIyNSw3IEBACiAJLm9wZW4JCT0gYmxrdHJhbnNfb3BlbiwKIAkucmVsZWFzZQk9IGJsa3RyYW5zX3JlbGVhc2UsCiAJLmlvY3RsCQk9IGJsa3RyYW5zX2lvY3RsLAorCS5nZXRnZW8JCT0gYmxrdHJhbnNfZ2V0Z2VvLAogfTsKIAogaW50IGFkZF9tdGRfYmxrdHJhbnNfZGV2KHN0cnVjdCBtdGRfYmxrdHJhbnNfZGV2ICpuZXcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2F1MTU1MG5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2F1MTU1MG5kLmMKaW5kZXggOWM1OTQ1ZC4uMjAxZTEzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9hdTE1NTBuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvYXUxNTUwbmQuYwpAQCAtNDMsNyArNDMsNyBAQAogLyoKICAqIERlZmluZSBwYXJ0aXRpb25zIGZvciBmbGFzaCBkZXZpY2UKICAqLwotY29uc3Qgc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBhcnRpdGlvbl9pbmZvW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFydGl0aW9uX2luZm9bXSA9IHsKIAl7CiAJCS5uYW1lIAk9ICJOQU5EIEZTIDAiLAogCSAgCS5vZmZzZXQgPSAwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9kaXNrb25jaGlwLmMgYi9kcml2ZXJzL210ZC9uYW5kL2Rpc2tvbmNoaXAuYwppbmRleCAyMWQ0ZThmLi5lYzVlNDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2Rpc2tvbmNoaXAuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2Rpc2tvbmNoaXAuYwpAQCAtMTUwNiw3ICsxNTA2LDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgX19pbml0IGRvY19wcm9iZSh1bnNpZ25lZCBsb25nIHBoeXNhZHIpCitzdGF0aWMgaW50IF9faW5pdCBkb2NfcHJvYmUodW5zaWduZWQgbG9uZyBwaHlzYWRyKQogewogCXVuc2lnbmVkIGNoYXIgQ2hpcElEOwogCXN0cnVjdCBtdGRfaW5mbyAqbXRkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9ydGNfZnJvbTQuYyBiL2RyaXZlcnMvbXRkL25hbmQvcnRjX2Zyb200LmMKaW5kZXggM2E1ODQxYy4uNDEyOWMwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9ydGNfZnJvbTQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL3J0Y19mcm9tNC5jCkBAIC05Niw3ICs5Niw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9faW9tZW0gKnJ0Y19mcm9tNF9maW9fYmFzZSA9ICh2b2lkICopUDJTRUdBRERSKFJUQ19GUk9NNF9GSU9fQkFTRSk7CiAKLWNvbnN0IHN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYXJ0aXRpb25faW5mb1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBtdGRfcGFydGl0aW9uIHBhcnRpdGlvbl9pbmZvW10gPSB7CiAgICAgICAgIHsKICAgICAgICAgICAgICAgICAubmFtZSAgID0gIlJlbmVzYXMgZmxhc2ggcGFydGl0aW9uIDEiLAogICAgICAgICAgICAgICAgIC5vZmZzZXQgPSAwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9zM2MyNDEwLmMgYi9kcml2ZXJzL210ZC9uYW5kL3MzYzI0MTAuYwppbmRleCBkMjA5MjE0Li41YjU1NTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3MzYzI0MTAuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL3MzYzI0MTAuYwpAQCAtNTMsNiArNTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogCiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CkBAIC02MCw3ICs2MSw2IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgogCiAjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1uYW5kLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvbmFuZC5oPgpAQCAtNDYwLDcgKzQ2MCw2IEBACiAKIAlpZiAoaW5mby0+Y2xrICE9IE5VTEwgJiYgIUlTX0VSUihpbmZvLT5jbGspKSB7CiAJCWNsa19kaXNhYmxlKGluZm8tPmNsayk7Ci0JCWNsa191bnVzZShpbmZvLT5jbGspOwogCQljbGtfcHV0KGluZm8tPmNsayk7CiAJfQogCkBAIC01OTgsNyArNTk3LDYgQEAKIAkJZ290byBleGl0X2Vycm9yOwogCX0KIAotCWNsa191c2UoaW5mby0+Y2xrKTsKIAljbGtfZW5hYmxlKGluZm8tPmNsayk7CiAKIAkvKiBhbGxvY2F0ZSBhbmQgbWFwIHRoZSByZXNvdXJjZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9zcGlhLmMgYi9kcml2ZXJzL210ZC9uYW5kL3NwaWEuYwppbmRleCAzMjU0MWNiLi45Y2YxY2U3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3NwaWEuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL3NwaWEuYwpAQCAtNjcsNyArNjcsNyBAQAogLyoKICAqIERlZmluZSBwYXJ0aXRpb25zIGZvciBmbGFzaCBkZXZpY2UKICAqLwotY29uc3Qgc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBhcnRpdGlvbl9pbmZvW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFydGl0aW9uX2luZm9bXSA9IHsKIAl7CiAJCS5uYW1lCT0gIlNQSUEgZmxhc2ggcGFydGl0aW9uIDEiLAogCQkub2Zmc2V0CT0gMCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL29uZW5hbmQvZ2VuZXJpYy5jIGIvZHJpdmVycy9tdGQvb25lbmFuZC9nZW5lcmljLmMKaW5kZXggNDVjMDc3ZC4uYWYwNmE4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvb25lbmFuZC9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9tdGQvb25lbmFuZC9nZW5lcmljLmMKQEAgLTE0LDYgKzE0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9vbmVuYW5kLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9yZmRfZnRsLmMgYi9kcml2ZXJzL210ZC9yZmRfZnRsLmMKaW5kZXggMjBjZTIxMi4uYTNlMDBhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvcmZkX2Z0bC5jCisrKyBiL2RyaXZlcnMvbXRkL3JmZF9mdGwuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9ibGt0cmFucy5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KIAogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MDMuYyBiL2RyaXZlcnMvbmV0LzNjNTAzLmMKaW5kZXggNWM1ZWViZC4uZGNjOThhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MDMuYworKysgYi9kcml2ZXJzL25ldC8zYzUwMy5jCkBAIC0xNDgsMTQgKzE0OCw2IEBACiAgICAgcmV0dXJuIC1FTk9ERVY7CiB9CiAKLXN0YXRpYyB2b2lkIGNsZWFudXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCS8qIE5COiBlbDJfY2xvc2UoKSBoYW5kbGVzIGZyZWVfaXJxICovCi0JcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVMMl9JT19FWFRFTlQpOwotCWlmIChlaV9zdGF0dXMubWVtKQotCQlpb3VubWFwKGVpX3N0YXR1cy5tZW0pOwotfQotCiAjaWZuZGVmIE1PRFVMRQogc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgZWwyX3Byb2JlKGludCB1bml0KQogewpAQCAtNzI2LDYgKzcxOCwxNCBAQAogCXJldHVybiAtRU5YSU87CiB9CiAKK3N0YXRpYyB2b2lkIGNsZWFudXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIE5COiBlbDJfY2xvc2UoKSBoYW5kbGVzIGZyZWVfaXJxICovCisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVMMl9JT19FWFRFTlQpOworCWlmIChlaV9zdGF0dXMubWVtKQorCQlpb3VubWFwKGVpX3N0YXR1cy5tZW0pOworfQorCiB2b2lkCiBjbGVhbnVwX21vZHVsZSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MjcuaCBiL2RyaXZlcnMvbmV0LzNjNTI3LmgKaW5kZXggYzEwZjAwOS4uNTNiNWIwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MjcuaAorKysgYi9kcml2ZXJzL25ldC8zYzUyNy5oCkBAIC0zMiw0MyArMzIsNDMgQEAKIAogc3RydWN0IG1jMzJfbWFpbGJveAogewotCXUxNgltYm94IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKLQl1MTYJZGF0YVsxXSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7Ci19OworIAl1MTYgbWJveDsKKyAJdTE2IGRhdGFbMV07Cit9IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKIAogc3RydWN0IHNrYl9oZWFkZXIKIHsKLQl1OAlzdGF0dXMgX19hdHRyaWJ1dGUoKHBhY2tlZCkpOwotCXU4CWNvbnRyb2wgX19hdHRyaWJ1dGUoKHBhY2tlZCkpOwotCXUxNgluZXh0IF9fYXR0cmlidXRlKChwYWNrZWQpKTsJLyogRG8gbm90IGNoYW5nZSEgKi8KLQl1MTYJbGVuZ3RoIF9fYXR0cmlidXRlKChwYWNrZWQpKTsKLQl1MzIJZGF0YSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7Ci19OworCXU4IHN0YXR1czsKKwl1OCBjb250cm9sOworCXUxNiBuZXh0OwkvKiBEbyBub3QgY2hhbmdlISAqLworCXUxNiBsZW5ndGg7CisJdTMyIGRhdGE7Cit9IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKIAogc3RydWN0IG1jMzJfc3RhdHMKIHsKIAkvKiBSWCBFcnJvcnMgKi8KLQl1MzIgICAgIHJ4X2NyY19lcnJvcnMgICAgICAgX19hdHRyaWJ1dGUoKHBhY2tlZCkpOyAJCi0JdTMyICAgICByeF9hbGlnbm1lbnRfZXJyb3JzICBfX2F0dHJpYnV0ZSgocGFja2VkKSk7IAkKLQl1MzIgICAgIHJ4X292ZXJydW5fZXJyb3JzICAgIF9fYXR0cmlidXRlKChwYWNrZWQpKTsKLQl1MzIgICAgIHJ4X3Rvb3Nob3J0X2Vycm9ycyAgX19hdHRyaWJ1dGUoKHBhY2tlZCkpOwotCXUzMiAgICAgcnhfdG9vbG9uZ19lcnJvcnMgICBfX2F0dHJpYnV0ZSgocGFja2VkKSk7Ci0JdTMyICAgICByeF9vdXRvZnJlc291cmNlX2Vycm9ycyAgX19hdHRyaWJ1dGUoKHBhY2tlZCkpOyAKKwl1MzIgcnhfY3JjX2Vycm9yczsKKwl1MzIgcnhfYWxpZ25tZW50X2Vycm9yczsKKwl1MzIgcnhfb3ZlcnJ1bl9lcnJvcnM7CisJdTMyIHJ4X3Rvb3Nob3J0X2Vycm9yczsKKwl1MzIgcnhfdG9vbG9uZ19lcnJvcnM7CisJdTMyIHJ4X291dG9mcmVzb3VyY2VfZXJyb3JzOwogCi0JdTMyICAgICByeF9kaXNjYXJkZWQgICBfX2F0dHJpYnV0ZSgocGFja2VkKSk7ICAvKiB2aWEgY2FyZCBwYXR0ZXJuIG1hdGNoIGZpbHRlciAqLyAKKwl1MzIgcnhfZGlzY2FyZGVkOyAgLyogdmlhIGNhcmQgcGF0dGVybiBtYXRjaCBmaWx0ZXIgKi8KIAogCS8qIFRYIEVycm9ycyAqLwotCXUzMiAgICAgdHhfbWF4X2NvbGxpc2lvbnMgX19hdHRyaWJ1dGUoKHBhY2tlZCkpOyAKLQl1MzIgICAgIHR4X2NhcnJpZXJfZXJyb3JzIF9fYXR0cmlidXRlKChwYWNrZWQpKTsgCi0JdTMyICAgICB0eF91bmRlcnJ1bl9lcnJvcnMgX19hdHRyaWJ1dGUoKHBhY2tlZCkpOyAKLQl1MzIgICAgIHR4X2N0c19lcnJvcnMgICAgIF9fYXR0cmlidXRlKChwYWNrZWQpKTsgCi0JdTMyICAgICB0eF90aW1lb3V0X2Vycm9ycyBfX2F0dHJpYnV0ZSgocGFja2VkKSkgOworCXUzMiB0eF9tYXhfY29sbGlzaW9uczsKKwl1MzIgdHhfY2Fycmllcl9lcnJvcnM7CisJdTMyIHR4X3VuZGVycnVuX2Vycm9yczsKKwl1MzIgdHhfY3RzX2Vycm9yczsKKwl1MzIgdHhfdGltZW91dF9lcnJvcnM7CiAJCiAJLyogdmFyaW91cyBjcnVmdCAqLwotCXUzMiAgICAgZGF0YUFbNl0gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOyAgIAotICAgICAgICB1MTYJZGF0YUJbNV0gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOyAgIAotICAJdTMyICAgICBkYXRhQ1sxNF0gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOyAJCi19OworCXUzMiBkYXRhQVs2XTsKKwl1MTYgZGF0YUJbNV07CisJdTMyIGRhdGFDWzE0XTsKK30gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOwogCiAjZGVmaW5lIFNUQVRVU19NQVNLCTB4MEYKICNkZWZpbmUgQ09NUExFVEVECSgxPDw3KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvODEzOXRvby5jIGIvZHJpdmVycy9uZXQvODEzOXRvby5jCmluZGV4IGQyMTAyYTIuLmFkZmJhNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzgxMzl0b28uYworKysgYi9kcml2ZXJzL25ldC84MTM5dG9vLmMKQEAgLTUwNSw3ICs1MDUsNyBAQAogI2RlZmluZSBIV19SRVZJRF9NQVNLCUhXX1JFVklEKDEsIDEsIDEsIDEsIDEsIDEsIDEpCiAKIC8qIGRpcmVjdGx5IGluZGV4ZWQgYnkgY2hpcF90LCBhYm92ZSAqLwotY29uc3Qgc3RhdGljIHN0cnVjdCB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAljb25zdCBjaGFyICpuYW1lOwogCXUzMiB2ZXJzaW9uOyAvKiBmcm9tIFJUTDgxMzlDL1JUTDgxMzlEIGRvY3MgKi8KIAl1MzIgZmxhZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9LY29uZmlnIGIvZHJpdmVycy9uZXQvS2NvbmZpZwppbmRleCBlMmZhMjliLi42MjY1MDhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L0tjb25maWcKQEAgLTcsNiArNyw3IEBACiAKIGNvbmZpZyBORVRERVZJQ0VTCiAJZGVwZW5kcyBvbiBORVQKKwlkZWZhdWx0IHkgaWYgVU1MCiAJYm9vbCAiTmV0d29yayBkZXZpY2Ugc3VwcG9ydCIKIAktLS1oZWxwLS0tCiAJICBZb3UgY2FuIHNheSBOIGhlcmUgaWYgeW91IGRvbid0IGludGVuZCB0byBjb25uZWN0IHlvdXIgTGludXggYm94IHRvCkBAIC0yNyw2ICsyOCwxOSBAQAogIyB0aGF0IGZvciBlYWNoIG9mIHRoZSBzeW1ib2xzLgogaWYgTkVUREVWSUNFUwogCitjb25maWcgSUZCCisJdHJpc3RhdGUgIkludGVybWVkaWF0ZSBGdW5jdGlvbmFsIEJsb2NrIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfQ0xTX0FDVAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYW4gaW50ZXJtaWRpYXRlIGRyaXZlciB0aGF0IGFsbG93cyBzaGFyaW5nIG9mCisJICByZXNvdXJjZXMuCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpZmIuICBJZiB5b3Ugd2FudCB0byB1c2UgbW9yZSB0aGFuIG9uZSBpZmIKKwkgIGRldmljZSBhdCBhIHRpbWUsIHlvdSBuZWVkIHRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUuCisJICBJbnN0ZWFkIG9mICdpZmInLCB0aGUgZGV2aWNlcyB3aWxsIHRoZW4gYmUgY2FsbGVkICdpZmIwJywKKwkgICdpZmIxJyBldGMuCisJICBMb29rIGF0IHRoZSBpcHJvdXRlMiBkb2N1bWVudGF0aW9uIGRpcmVjdG9yeSBmb3IgdXNhZ2UgZXRjCisKIGNvbmZpZyBEVU1NWQogCXRyaXN0YXRlICJEdW1teSBuZXQgZHJpdmVyIHN1cHBvcnQiCiAJLS0taGVscC0tLQpAQCAtMTI5LDcgKzE0Myw3IEBACiAKIAkgIElmIHlvdSBkb24ndCBoYXZlIHRoaXMgY2FyZCwgb2YgY291cnNlIHNheSBOLgogCi0Jc291cmNlICJkcml2ZXJzL25ldC9hcmNuZXQvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9uZXQvYXJjbmV0L0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9uZXQvcGh5L0tjb25maWciCiAKQEAgLTg0NCw3ICs4NTgsNyBAQAogCiBjb25maWcgRE05MDAwCiAJdHJpc3RhdGUgIkRNOTAwMCBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVJNICYmIE5FVF9FVEhFUk5FVAorCWRlcGVuZHMgb24gKEFSTSB8fCBNSVBTKSAmJiBORVRfRVRIRVJORVQKIAlzZWxlY3QgQ1JDMzIKIAlzZWxlY3QgTUlJCiAJLS0taGVscC0tLQpAQCAtMTM3NCw3ICsxMzg4LDcgQEAKIAogY29uZmlnIENTODl4MAogCXRyaXN0YXRlICJDUzg5eDAgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIChORVRfUENJICYmIChJU0EgfHwgQVJDSF9JWERQMlgwMSkpIHx8IEFSQ0hfUE5YMDEwNQorCWRlcGVuZHMgb24gTkVUX1BDSSAmJiAoSVNBIHx8IE1BQ0hfSVhEUDIzNTEgfHwgQVJDSF9JWERQMlgwMSB8fCBBUkNIX1BOWDAxMFgpCiAJLS0taGVscC0tLQogCSAgU3VwcG9ydCBmb3IgQ1M4OXgwIGNoaXBzZXQgYmFzZWQgRXRoZXJuZXQgY2FyZHMuIElmIHlvdSBoYXZlIGEKIAkgIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQgdGhlCkBAIC0xMzg0LDcgKzEzOTgsNyBAQAogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCiAJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUgd2lsbCBiZQotCSAgY2FsbGVkIGNzODl4LgorCSAgY2FsbGVkIGNzODl4MC4KIAogY29uZmlnIFRDMzU4MTUKIAl0cmlzdGF0ZSAiVE9TSElCQSBUQzM1ODE1IEV0aGVybmV0IHN1cHBvcnQiCkBAIC0xNzkxLDcgKzE4MDUsNyBAQAogCiBjb25maWcgRkVDCiAJYm9vbCAiRkVDIGV0aGVybmV0IGNvbnRyb2xsZXIgKG9mIENvbGRGaXJlIENQVXMpIgotCWRlcGVuZHMgb24gTTUyM3ggfHwgTTUyN3ggfHwgTTUyNzIgfHwgTTUyOHgKKwlkZXBlbmRzIG9uIE01MjN4IHx8IE01Mjd4IHx8IE01MjcyIHx8IE01Mjh4IHx8IE01MjB4CiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGJ1aWx0LWluIDEwLzEwMCBGYXN0IGV0aGVybmV0CiAJICBjb250cm9sbGVyIG9uIHNvbWUgTW90b3JvbGEgQ29sZEZpcmUgcHJvY2Vzc29ycy4KQEAgLTE5MDEsNiArMTkxNSwxNSBAQAogCiAJICBJZiBpbiBkb3VidCwgc2F5IE4uCiAKK2NvbmZpZyBFMTAwMF9ESVNBQkxFX1BBQ0tFVF9TUExJVAorCWJvb2wgIkRpc2FibGUgUGFja2V0IFNwbGl0IGZvciBQQ0kgZXhwcmVzcyBhZGFwdGVycyIKKwlkZXBlbmRzIG9uIEUxMDAwCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGxlZ2FjeSByZWNlaXZlIHBhdGggZm9yIFBDSSBleHByZXNzCisJICBoYWR3YXJlLgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKIHNvdXJjZSAiZHJpdmVycy9uZXQvaXhwMjAwMC9LY29uZmlnIgogCiBjb25maWcgTVlSSV9TQlVTCkBAIC0yNjYzLDEwICsyNjg2LDYgQEAKIAkgIENsYXNzLUJhc2VkIFF1ZXVlaW5nIChDQlEpIHNjaGVkdWxpbmcgc3VwcG9ydCB3aGljaCB5b3UgZ2V0IGlmIHlvdQogCSAgc2F5IFkgdG8gIlFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZyIgYWJvdmUuCiAKLQkgIFRvIHNldCB1cCBhbmQgY29uZmlndXJlIHNoYXBlciBkZXZpY2VzLCB5b3UgbmVlZCB0aGUgc2hhcGVjZmcKLQkgIHByb2dyYW0sIGF2YWlsYWJsZSBmcm9tIDxmdHA6Ly9zaGFkb3cuY2FiaS5uZXQvcHViL0xpbnV4Lz4gaW4gdGhlCi0JICBzaGFwZXIgcGFja2FnZS4KLQogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgc2hhcGVyLiAgSWYgdW5zdXJlLCBzYXkgTi4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9NYWtlZmlsZQppbmRleCBiNzRhN2NiLi4wMGU3MmIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9NYWtlZmlsZQpAQCAtMTI1LDYgKzEyNSw3IEBACiBlbmRpZgogCiBvYmotJChDT05GSUdfRFVNTVkpICs9IGR1bW15Lm8KK29iai0kKENPTkZJR19JRkIpICs9IGlmYi5vCiBvYmotJChDT05GSUdfREU2MDApICs9IGRlNjAwLm8KIG9iai0kKENPTkZJR19ERTYyMCkgKz0gZGU2MjAubwogb2JqLSQoQ09ORklHX0xBTkNFKSArPSBsYW5jZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hYzMyMDAuYyBiL2RyaXZlcnMvbmV0L2FjMzIwMC5jCmluZGV4IDhhMGFmNTQuLjc5NTJkYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FjMzIwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2FjMzIwMC5jCkBAIC0xMjMsMTQgKzEyMyw2IEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLXN0YXRpYyB2b2lkIGNsZWFudXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCS8qIFNvbWVkYXkgZnJlZV9pcnEgbWF5IGJlIGluIGFjX2Nsb3NlX2NhcmQoKSAqLwotCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwotCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBBQ19JT19FWFRFTlQpOwotCWlvdW5tYXAoZWlfc3RhdHVzLm1lbSk7Ci19Ci0KICNpZm5kZWYgTU9EVUxFCiBzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBhYzMyMDBfcHJvYmUoaW50IHVuaXQpCiB7CkBAIC00MDYsNiArMzk4LDE0IEBACiAJcmV0dXJuIC1FTlhJTzsKIH0KIAorc3RhdGljIHZvaWQgY2xlYW51cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogU29tZWRheSBmcmVlX2lycSBtYXkgYmUgaW4gYWNfY2xvc2VfY2FyZCgpICovCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEFDX0lPX0VYVEVOVCk7CisJaW91bm1hcChlaV9zdGF0dXMubWVtKTsKK30KKwogdm9pZAogY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FybS9LY29uZmlnIGIvZHJpdmVycy9uZXQvYXJtL0tjb25maWcKaW5kZXggNDcwMzY0ZC4uNjI1MTg0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvYXJtL0tjb25maWcKQEAgLTMxLDE2ICszMSwzIEBACiAJaGVscAogCSAgSWYgeW91IGhhdmUgYW4gQWNvcm4gc3lzdGVtIHdpdGggb25lIG9mIHRoZXNlIG5ldHdvcmsgY2FyZHMsIHlvdQogCSAgc2hvdWxkIHNheSBZIHRvIHRoaXMgb3B0aW9uIGlmIHlvdSB3aXNoIHRvIHVzZSBpdCB3aXRoIExpbnV4LgotCi1jb25maWcgQVJNX0VUSEVSMDAKLQl0cmlzdGF0ZSAiQWx0ZXJhIEV0aGVyMDAgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBBUk0gJiYgQVJDSF9DQU1FTE9UCi0JaGVscAotCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciBBbHRlcmEncyBldGhlcjAwIGV0aGVybmV0IG1hYyBJUCBjb3JlLiBTYXkKLQkgIFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGlzIGludG8gdGhlIGtlcm5lbC4gSXQKLQkgIGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlIChzYXkgTSBoZXJlKSB0aGF0IGNhbiBiZSBpbnNlcnRlZC8KLQkgIHJlbW92ZWQgZnJvbSB0aGUga2VybmVsIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIFBMRCBpcyBjb25maWd1cmVkLgotCSAgSWYgdGhpcyBkcml2ZXIgaXMgcnVubmluZyBvbiBhbiBlcHhhMTAgZGV2ZWxvcG1lbnQgYm9hcmQgdGhlbiBpdAotCSAgd2lsbCBnZW5lcmF0ZSBhIHN1aXRhYmxlIGh3IGFkZHJlc3MgYmFzZWQgb24gdGhlIGJvYXJkIHNlcmlhbAotCSAgbnVtYmVyIChNVEQgc3VwcG9ydCBpcyByZXF1aXJlZCBmb3IgdGhpcykuIE90aGVyd2lzZSB5b3Ugd2lsbAotCSAgbmVlZCB0byBzZXQgYSBzdWl0YWJsZSBodyBhZGRyZXNzIHVzaW5nIGlmY29uZmlnLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvYXJtL01ha2VmaWxlCmluZGV4IGIwZDcwNjguLmJjMjYzZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FybS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9hcm0vTWFrZWZpbGUKQEAgLTQsNyArNCw2IEBACiAjCiAKIG9iai0kKENPTkZJR19BUk1fQU03OUM5NjFBKQkrPSBhbTc5Yzk2MWEubwotb2JqLSQoQ09ORklHX0FSTV9FVEhFUjAwKQkrPSBldGhlcjAwLm8KIG9iai0kKENPTkZJR19BUk1fRVRIRVJIKQkrPSBldGhlcmgubwogb2JqLSQoQ09ORklHX0FSTV9FVEhFUjMpCSs9IGV0aGVyMy5vCiBvYmotJChDT05GSUdfQVJNX0VUSEVSMSkJKz0gZXRoZXIxLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FybS9hbTc5Yzk2MWEuYyBiL2RyaXZlcnMvbmV0L2FybS9hbTc5Yzk2MWEuYwppbmRleCA4Nzc4OTFhLi41M2UzYWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcm0vYW03OWM5NjFhLmMKKysrIGIvZHJpdmVycy9uZXQvYXJtL2FtNzljOTYxYS5jCkBAIC02NjgsOSArNjY4LDggQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgYW03OWM5NjFfcHJvYmUoc3RydWN0IGRldmljZSAqX2RldikKK3N0YXRpYyBpbnQgX19pbml0IGFtNzljOTYxX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShfZGV2KTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0cnVjdCBkZXZfcHJpdiAqcHJpdjsKQEAgLTc1OCwxNSArNzU3LDE2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIGFtNzljOTYxX2RyaXZlciA9IHsKLQkubmFtZQkJPSAiYW03OWM5NjEiLAotCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYW03OWM5NjFfZHJpdmVyID0gewogCS5wcm9iZQkJPSBhbTc5Yzk2MV9wcm9iZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiYW03OWM5NjEiLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhbTc5Yzk2MV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmYW03OWM5NjFfZHJpdmVyKTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhbTc5Yzk2MV9kcml2ZXIpOwogfQogCiBfX2luaXRjYWxsKGFtNzljOTYxX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2V0aGVyMDAuYyBiL2RyaXZlcnMvbmV0L2FybS9ldGhlcjAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMWY0ZTMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvYXJtL2V0aGVyMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMTcgKzAsMCBAQAotLyoKLSAqICBkcml2ZXJzL25ldC9ldGhlcjAwLmMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAxIEFsdGVyYSBDb3Jwb3JhdGlvbgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0vKiBpbmNsdWRlcyAqLwotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90cXVldWUuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxkL3BsZF9ob3Rzd2FwLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvZXhjYWxpYnVyLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3NpemVzLmg+Ci0KLSNpbmNsdWRlIDxhc20vYXJjaC9ldGhlcjAwLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvdGRrcGh5Lmg+Ci0KLQotTU9EVUxFX0FVVEhPUigiQ2xpdmUgRGF2aWVzIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkFsdGVyYSBFdGhlcjAwIElQIGNvcmUgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLSNkZWZpbmUgUEtUX0JVRl9TWiAxNTQwIC8qIFNpemUgb2YgZWFjaCByeCBidWZmZXIgKi8KLSNkZWZpbmUgRVRIX05SIDQgLyogTnVtYmVyIG9mIE1BQ3MgdGhpcyBkcml2ZXIgc3VwcG9ydHMgKi8KLQotI2RlZmluZSBERUJVRyh4KQotCi0jZGVmaW5lIF9fZG1hX3ZhKHgpICh1bnNpZ25lZCBpbnQpKCh1bnNpZ25lZCBpbnQpcHJpdi0+ZG1hX2RhdGErKCgodW5zaWduZWQgaW50KSh4KSkmKEVYQ19TUFNSQU1fQkxPQ0swX1NJWkUtMSkpKQotI2RlZmluZSBfX2RtYV9wYSh4KSAodW5zaWduZWQgaW50KShFWENfU1BTUkFNX0JMT0NLMF9CQVNFKygoKHVuc2lnbmVkIGludCkoeCkpLSh1bnNpZ25lZCBpbnQpcHJpdi0+ZG1hX2RhdGEpKQotCi0jZGVmaW5lIEVUSEVSMDBfQkFTRQkwCi0jZGVmaW5lCUVUSEVSMDBfVFlQRQotI2RlZmluZSBFVEhFUjAwX05BTUUgImV0aGVyMDAiCi0jZGVmaW5lIE1BQ19SRUdfU0laRSAweDQwMCAvKiBzaXplIG9mIE1BQyByZWdpc3RlciBhcmVhICovCi0KLQotCi0vKiB0eXBlZGVmcyAqLwotCi0vKiBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgZHJpdmVyIGNvbnRyb2wgc3RydWN0dXJlICovCi0KLSNkZWZpbmUgUlhfTlVNX0JVRkYgICAgIDEwCi0jZGVmaW5lIFJYX05VTV9GREVTQyAgICAxMAotI2RlZmluZSBUWF9OVU1fRkRFU0MgICAgMTAKLQotc3RydWN0IHR4X2ZkYV9lbnR7Ci0JRkRBX0RFU0MgIGZkOwotCUJVRl9ERVNDICBiZDsKLQlCVUZfREVTQyAgcGFkOwotfTsKLXN0cnVjdCByeF9mZGFfZW50ewotCUZEQV9ERVNDICBmZDsKLQlCVUZfREVTQyAgYmQ7Ci0JQlVGX0RFU0MgIHBhZDsKLX07Ci1zdHJ1Y3QgcnhfYmxpc3RfZW50ewotCUZEQV9ERVNDICBmZDsKLQlCVUZfREVTQyAgYmQ7Ci0JQlVGX0RFU0MgIHBhZDsKLX07Ci1zdHJ1Y3QgbmV0X3ByaXYKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKLQlzdHJ1Y3Qgc2tfYnVmZiogc2tiOwotCXZvaWQqIGRtYV9kYXRhOwotCXN0cnVjdCByeF9ibGlzdF9lbnQqICByeF9ibGlzdF92cDsKLQlzdHJ1Y3QgcnhfZmRhX2VudCogcnhfZmRhX3B0cjsKLQlzdHJ1Y3QgdHhfZmRhX2VudCogdHhfZmRhbGlzdF92cDsKLQlzdHJ1Y3QgdHFfc3RydWN0ICB0cV9tZW11cGRhdGU7Ci0JdW5zaWduZWQgY2hhciAgIG1lbXVwZGF0ZV9zY2hlZHVsZWQ7Ci0JdW5zaWduZWQgY2hhciAgIHJ4X2Rpc2FibGVkOwotCXVuc2lnbmVkIGNoYXIgICBxdWV1ZV9zdG9wcGVkOwotCXNwaW5sb2NrX3QgcnhfbG9jazsKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyIHZlbmRvcl9pZFsyXT17MHgwNywweGVkfTsKLQotI2lmZGVmIEVUSEVSMDBfREVCVUcKLQotLyogRHVtcCAobW9zdCkgcmVnaXN0ZXJzIGZvciBkZWJ1Z2dpbmcgcHVwb3NlcyAqLwotCi1zdGF0aWMgdm9pZCBkdW1wX3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldil7Ci0Jc3RydWN0IG5ldF9wcml2KiBwcml2PWRldi0+cHJpdjsKLQl1bnNpZ25lZCBpbnQqIGk7Ci0KLQlwcmludGsoIlxuIFJYIGZyZWUgZGVzY3JpcHRvciBhcmVhOlxuIik7Ci0KLQlmb3IoaT0odW5zaWduZWQgaW50Kilwcml2LT5yeF9mZGFfcHRyOwotCSAgICBpPCgodW5zaWduZWQgaW50KikocHJpdi0+cnhfZmRhX3B0citSWF9OVU1fRkRFU0MpKTspewotCQlwcmludGsoIiUjOHggJSM4eCAlIzh4ICUjOHhcbiIsKmksKihpKzEpLCooaSsyKSwqKGkrMykpOwotCQlpKz00OwotCX0KLQotCXByaW50aygiXG4gUlggYnVmZmVyIGxpc3Q6XG4iKTsKLQotCWZvcihpPSh1bnNpZ25lZCBpbnQqKXByaXYtPnJ4X2JsaXN0X3ZwOwotCSAgICBpPCgodW5zaWduZWQgaW50KikocHJpdi0+cnhfYmxpc3RfdnArUlhfTlVNX0JVRkYpKTspewotCQlwcmludGsoIiUjOHggJSM4eCAlIzh4ICUjOHhcbiIsKmksKihpKzEpLCooaSsyKSwqKGkrMykpOwotCQlpKz00OwotCX0KLQotCXByaW50aygiXG4gVFggZnJhbWUgZGVzY3JpcHRvciBsaXN0OlxuIik7Ci0KLQlmb3IoaT0odW5zaWduZWQgaW50Kilwcml2LT50eF9mZGFsaXN0X3ZwOwotCSAgICBpPCgodW5zaWduZWQgaW50KikocHJpdi0+dHhfZmRhbGlzdF92cCtUWF9OVU1fRkRFU0MpKTspewotCQlwcmludGsoIiUjOHggJSM4eCAlIzh4ICUjOHhcbiIsKmksKihpKzEpLCooaSsyKSwqKGkrMykpOwotCQlpKz00OwotCX0KLQotCXByaW50aygiXG5kbWEgY3RsPSUjeFxuIixyZWFkdyhFVEhFUl9ETUFfQ1RMKGRldi0+YmFzZV9hZGRyKSkpOwotCXByaW50aygidHhmcm1wdHI9JSN4XG4iLHJlYWR3KEVUSEVSX1RYRlJNUFRSKGRldi0+YmFzZV9hZGRyKSkpOwotCXByaW50aygidHh0aHJzaD0lI3hcbiIscmVhZHcoRVRIRVJfVFhUSFJTSChkZXYtPmJhc2VfYWRkcikpKTsKLQlwcmludGsoInR4cG9sbGN0cj0lI3hcbiIscmVhZHcoRVRIRVJfVFhQT0xMQ1RSKGRldi0+YmFzZV9hZGRyKSkpOwotCXByaW50aygiYmxmcm1wdHI9JSN4XG4iLHJlYWR3KEVUSEVSX0JMRlJNUFRSKGRldi0+YmFzZV9hZGRyKSkpOwotCXByaW50aygicnhmcmFnc2l6ZT0lI3hcbiIscmVhZHcoRVRIRVJfUlhGUkFHU0laRShkZXYtPmJhc2VfYWRkcikpKTsKLQlwcmludGsoInR4X2ludF9lbj0lI3hcbiIscmVhZHcoRVRIRVJfSU5UX0VOKGRldi0+YmFzZV9hZGRyKSkpOwotCXByaW50aygiZmRhX2Jhcz0lI3hcbiIscmVhZHcoRVRIRVJfRkRBX0JBUyhkZXYtPmJhc2VfYWRkcikpKTsKLQlwcmludGsoImZkYV9saW09JSN4XG4iLHJlYWR3KEVUSEVSX0ZEQV9MSU0oZGV2LT5iYXNlX2FkZHIpKSk7Ci0JcHJpbnRrKCJpbnRfc3JjPSUjeFxuIixyZWFkdyhFVEhFUl9JTlRfU1JDKGRldi0+YmFzZV9hZGRyKSkpOwotCXByaW50aygicGF1c2VjbnQ9JSN4XG4iLHJlYWR3KEVUSEVSX1BBVVNFQ05UKGRldi0+YmFzZV9hZGRyKSkpOwotCXByaW50aygicmVtcGF1Y250PSUjeFxuIixyZWFkdyhFVEhFUl9SRU1QQVVDTlQoZGV2LT5iYXNlX2FkZHIpKSk7Ci0JcHJpbnRrKCJ0eGNvbmZybXN0YXQ9JSN4XG4iLHJlYWR3KEVUSEVSX1RYQ09ORlJNU1RBVChkZXYtPmJhc2VfYWRkcikpKTsKLQlwcmludGsoIm1hY19jdGw9JSN4XG4iLHJlYWR3KEVUSEVSX01BQ19DVEwoZGV2LT5iYXNlX2FkZHIpKSk7Ci0JcHJpbnRrKCJhcmNfY3RsPSUjeFxuIixyZWFkdyhFVEhFUl9BUkNfQ1RMKGRldi0+YmFzZV9hZGRyKSkpOwotCXByaW50aygidHhfY3RsPSUjeFxuIixyZWFkdyhFVEhFUl9UWF9DVEwoZGV2LT5iYXNlX2FkZHIpKSk7Ci19Ci0jZW5kaWYgLyogRVRIRVIwMF9ERUJVRyAqLwotCi0KLXN0YXRpYyBpbnQgZXRoZXIwMF93cml0ZV9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgYWRkcmVzcywgc2hvcnQgdmFsdWUpCi17Ci0Jdm9sYXRpbGUgaW50IGNvdW50ID0gMTAyNDsKLQl3cml0ZXcodmFsdWUsRVRIRVJfTURfREFUQShkZXYtPmJhc2VfYWRkcikpOwotCXdyaXRldyggRVRIRVJfTURfQ0FfQlVTWV9NU0sgfAotCQlFVEhFUl9NRF9DQV9XUl9NU0sgfAotCQkoYWRkcmVzcyAmIEVUSEVSX01EX0NBX0FERFJfTVNLKSwKLQkJRVRIRVJfTURfQ0EoZGV2LT5iYXNlX2FkZHIpKTsKLQotCS8qIFdhaXQgZm9yIHRoZSBjb21tYW5kIHRvIGNvbXBsZXRlICovCi0Jd2hpbGUoKHJlYWR3KEVUSEVSX01EX0NBKGRldi0+YmFzZV9hZGRyKSkgJiBFVEhFUl9NRF9DQV9CVVNZX01TSykmJmNvdW50KXsKLQkJY291bnQtLTsKLQl9Ci0JaWYgKCFjb3VudCl7Ci0JCXByaW50aygiV3JpdGUgdG8gcGh5IGZhaWxlZCwgYWRkcj0lI3gsIGRhdGE9JSN4XG4iLGFkZHJlc3MsIHZhbHVlKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGV0aGVyMDBfcmVhZF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgYWRkcmVzcykKLXsKLQl2b2xhdGlsZSBpbnQgY291bnQgPSAxMDI0OwotCXdyaXRldyggRVRIRVJfTURfQ0FfQlVTWV9NU0sgfAotCQkoYWRkcmVzcyAmIEVUSEVSX01EX0NBX0FERFJfTVNLKSwKLQkJRVRIRVJfTURfQ0EoZGV2LT5iYXNlX2FkZHIpKTsKLQotCS8qIFdhaXQgZm9yIHRoZSBjb21tYW5kIHRvIGNvbXBsZXRlICovCi0Jd2hpbGUoKHJlYWR3KEVUSEVSX01EX0NBKGRldi0+YmFzZV9hZGRyKSkgJiBFVEhFUl9NRF9DQV9CVVNZX01TSykmJmNvdW50KXsKLQkJY291bnQtLTsKLQl9Ci0JaWYgKCFjb3VudCl7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlJlYWQgZnJvbSBwaHkgdGltZWQgb3V0XG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCXJldHVybiByZWFkdyhFVEhFUl9NRF9EQVRBKGRldi0+YmFzZV9hZGRyKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGV0aGVyMDBfcGh5X2ludChpbnQgaXJxX251bSwgdm9pZCogZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyogcmVncykKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSogZGV2PWRldl9pZDsKLQlpbnQgaXJxX3N0YXR1czsKLQotCWlycV9zdGF0dXM9ZXRoZXIwMF9yZWFkX3BoeShkZXYsIFBIWV9JUlFfQ09OVFJPTCk7Ci0KLQlpZihpcnFfc3RhdHVzICYgUEhZX0lSUV9DT05UUk9MX0FORUdfQ09NUF9JTlRfTVNLKXsKLQkJLyoKLQkJICogQXV0b25lZ290aWF0aW9uIGNvbXBsZXRlIG9uIGVweGExMGRiLiBUaGUgbWFjIGRvZXNuJ3QKLQkJICogdHdpZyBpZiB3ZSdyZSBpbiBmdWxsIGR1cGxleCBzbyB3ZSBuZWVkIHRvIGNoZWNrIHRoZQotCQkgKiBwaHkgc3RhdHVzIHJlZ2lzdGVyIGFuZCBjb25maWd1cmUgdGhlIG1hYyBhY2NvcmRpbmdseQotCQkgKi8KLQkJaWYoZXRoZXIwMF9yZWFkX3BoeShkZXYsIFBIWV9TVEFUVVMpJihQSFlfU1RBVFVTXzEwVF9GX01TS3xQSFlfU1RBVFVTXzEwMF9YX0ZfTVNLKSl7Ci0JCQlpbnQgdG1wOwotCQkJdG1wPXJlYWRsKEVUSEVSX01BQ19DVEwoZGV2LT5iYXNlX2FkZHIpKTsKLQkJCXdyaXRlbCh0bXB8RVRIRVJfTUFDX0NUTF9GVUxMRFVQX01TSyxFVEhFUl9NQUNfQ1RMKGRldi0+YmFzZV9hZGRyKSk7Ci0JCX0KLQl9Ci0KLQlpZihpcnFfc3RhdHVzJlBIWV9JUlFfQ09OVFJPTF9MU19DSEdfSU5UX01TSyl7Ci0KLQkJaWYoZXRoZXIwMF9yZWFkX3BoeShkZXYsIFBIWV9TVEFUVVMpJiBQSFlfU1RBVFVTX0xJTktfTVNLKXsKLQkJCS8qIExpbmsgaXMgdXAgKi8KLQkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKLQkJCS8vcHJpbnRrKCJDYXJyaWVyIG9uXG4iKTsKLQkJfWVsc2V7Ci0JCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOwotCQkJLy9wcmludGsoIkNhcnJpZXIgb2ZmXG4iKTsKLQotCQl9Ci0JfQotCi19Ci0KLXN0YXRpYyB2b2lkIHNldHVwX2JsaXN0X2VudHJ5KHN0cnVjdCBza19idWZmKiBza2Isc3RydWN0IHJ4X2JsaXN0X2VudCogYmxpc3RfZW50X3B0cil7Ci0JLyogTWFrZSB0aGUgYnVmZmVyIGNvbnNpc3RlbnQgd2l0aCB0aGUgY2FjaGUgYXMgdGhlIG1hYyBpcyBnb2luZyB0byB3cml0ZQotCSAqIGRpcmVjdGx5IGludG8gaXQqLwotCWJsaXN0X2VudF9wdHItPmZkLkZEU3lzdGVtPSh1bnNpZ25lZCBpbnQpc2tiOwotCWJsaXN0X2VudF9wdHItPmJkLkJ1ZmZEYXRhPShjaGFyKilfX3BhKHNrYi0+ZGF0YSk7Ci0JY29uc2lzdGVudF9zeW5jKHNrYi0+ZGF0YSxQS1RfQlVGX1NaLFBDSV9ETUFfRlJPTURFVklDRSk7Ci0gICAgICAgIC8qIGFsaWduIElQIG9uIDE2IEJ5dGUgKERNQV9DVEwgc2V0IHRvIHNraXAgMiBieXRlcykgKi8KLQlza2JfcmVzZXJ2ZShza2IsMik7Ci0JYmxpc3RfZW50X3B0ci0+YmQuQnVmZkxlbmd0aD1QS1RfQlVGX1NaLTI7Ci0JYmxpc3RfZW50X3B0ci0+ZmQuRkRMZW5ndGg9MTsKLQlibGlzdF9lbnRfcHRyLT5mZC5GREN0bD1GRENUTF9DT1dOU0ZEX01TSzsKLQlibGlzdF9lbnRfcHRyLT5iZC5CREN0bD1CRENUTF9DT1dOU0JEX01TSzsKLX0KLQotCi1zdGF0aWMgaW50IGV0aGVyMDBfbWVtX2luaXQoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKLXsKLQlzdHJ1Y3QgbmV0X3ByaXYqIHByaXY9ZGV2LT5wcml2OwotCXN0cnVjdCB0eF9mZGFfZW50ICp0eF9mZF9wdHIsKnR4X2VuZF9wdHI7Ci0Jc3RydWN0IHJ4X2JsaXN0X2VudCogYmxpc3RfZW50X3B0cjsKLQlpbnQgaTsKLQotCS8qCi0JICogR3JhYiBhIGJsb2NrIG9mIG9uIGNoaXAgU1JBTSB0byBjb250YWluIHRoZSBjb250cm9sIHN0dWN0dXJlcyBmb3IKLQkgKiB0aGUgZXRoZXJuZXQgTUFDLiBUaGlzIHVuY2FjaGVkIGJlY3Vhc2UgaXQgbmVlZHMgdG8gYmUgYWNjZXNzZXMgYnkgYm90aAotCSAqIGJ1cyBtYXN0ZXJzIChjcHUgKyBtYWMpLiBIb3dldmVyLCBpdCBzaG91bGRuJ3QgbWF0dGVyIHRvbyBtdWNoIGluIHRlcm1zCi0JICogb2Ygc3BlZWQgYXMgaXRzIG9uIGNoaXAgbWVtb3J5Ci0JICovCi0JcHJpdi0+ZG1hX2RhdGE9aW9yZW1hcF9ub2NhY2hlKEVYQ19TUFNSQU1fQkxPQ0swX0JBU0UsRVhDX1NQU1JBTV9CTE9DSzBfU0laRSApOwotCWlmICghcHJpdi0+ZG1hX2RhdGEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcHJpdi0+cnhfZmRhX3B0cj0oc3RydWN0IHJ4X2ZkYV9lbnQqKXByaXYtPmRtYV9kYXRhOwotCS8qCi0JICogTm93IHNoYXJlIGl0IG91dCBhbW9uZ3N0IHRoZSBGcmFtZSBkZXNjcmlwdG9ycyBhbmQgdGhlIGJ1ZmZlciBsaXN0Ci0JICovCi0JcHJpdi0+cnhfYmxpc3RfdnA9KHN0cnVjdCByeF9ibGlzdF9lbnQqKSgodW5zaWduZWQgaW50KXByaXYtPmRtYV9kYXRhK1JYX05VTV9GREVTQypzaXplb2Yoc3RydWN0IHJ4X2ZkYV9lbnQpKTsKLQotCS8qCi0JICpJbml0YWxpc2UgdGhlIEZEQSBsaXN0Ci0JICovCi0JLyogc2V0IG93bmVyc2hpcCB0byB0aGUgY29udHJvbGxlciAqLwotCW1lbXNldChwcml2LT5yeF9mZGFfcHRyLDB4ODAsUlhfTlVNX0ZERVNDKnNpemVvZihzdHJ1Y3QgcnhfZmRhX2VudCkpOwotCi0JLyoKLQkgKkluaXRpYWxpc2UgdGhlIGJ1ZmZlciBsaXN0Ci0JICovCi0JYmxpc3RfZW50X3B0cj1wcml2LT5yeF9ibGlzdF92cDsKLQlpPTA7Ci0Jd2hpbGUoYmxpc3RfZW50X3B0cjwocHJpdi0+cnhfYmxpc3RfdnArUlhfTlVNX0JVRkYpKXsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQkJYmxpc3RfZW50X3B0ci0+ZmQuRkRMZW5ndGg9MTsKLQkJc2tiPWRldl9hbGxvY19za2IoUEtUX0JVRl9TWik7Ci0JCWlmKHNrYil7Ci0JCQlzZXR1cF9ibGlzdF9lbnRyeShza2IsYmxpc3RfZW50X3B0cik7Ci0JCQlibGlzdF9lbnRfcHRyLT5mZC5GRE5leHQ9KEZEQV9ERVNDKilfX2RtYV9wYShibGlzdF9lbnRfcHRyKzEpOwotCQkJYmxpc3RfZW50X3B0ci0+YmQuQkRTdGF0PWkrKzsKLQkJCWJsaXN0X2VudF9wdHIrKzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXByaW50aygiRmFpbGVkIHRvIGluaXRhbGlzZSBidWZmZXIgbGlzdFxuIik7Ci0JCX0KLQotCX0KLQlibGlzdF9lbnRfcHRyLS07Ci0JYmxpc3RfZW50X3B0ci0+ZmQuRkROZXh0PShGREFfREVTQyopX19kbWFfcGEocHJpdi0+cnhfYmxpc3RfdnApOwotCi0JcHJpdi0+dHhfZmRhbGlzdF92cD0oc3RydWN0IHR4X2ZkYV9lbnQqKShwcml2LT5yeF9ibGlzdF92cCtSWF9OVU1fQlVGRik7Ci0KLQkvKiBJbml0aWFsaXNlIHRoZSBidWZmZXJzIHRvIGJlIGEgY2lyY3VsYXIgbGlzdC4gVGhlIG1hYyB3aWxsIHRoZW4gZ28gcG9sbAotCSAqIHRoZSBsaXN0IHVudGlsIGl0IGZpbmRzIGEgZnJhbWUgcmVhZHkgdG8gdHJhbnNtaXQgKi8KLQl0eF9lbmRfcHRyPXByaXYtPnR4X2ZkYWxpc3RfdnArVFhfTlVNX0ZERVNDOwotCWZvcih0eF9mZF9wdHI9cHJpdi0+dHhfZmRhbGlzdF92cDt0eF9mZF9wdHI8dHhfZW5kX3B0cjt0eF9mZF9wdHIrKyl7Ci0JCXR4X2ZkX3B0ci0+ZmQuRkROZXh0PShGREFfREVTQyopX19kbWFfcGEoKHR4X2ZkX3B0cisxKSk7Ci0JCXR4X2ZkX3B0ci0+ZmQuRkRDdGw9MTsKLQkJdHhfZmRfcHRyLT5mZC5GRFN0YXQ9MDsKLQkJdHhfZmRfcHRyLT5mZC5GRExlbmd0aD0xOwotCi0JfQotCS8qIENoYW5nZSB0aGUgbGFzdCBGRE5leHQgcG9pbnRlciB0byBtYWtlIGEgY2lyY3VsYXIgbGlzdCAqLwotCXR4X2ZkX3B0ci0tOwotCXR4X2ZkX3B0ci0+ZmQuRkROZXh0PShGREFfREVTQyopX19kbWFfcGEocHJpdi0+dHhfZmRhbGlzdF92cCk7Ci0KLQkvKiBQb2ludCB0aGUgZGV2aWNlIGF0IHRoZSBjaGFpbiBvZiBSeCBhbmQgVHggQnVmZmVycyAqLwotCXdyaXRlbCgodW5zaWduZWQgaW50KV9fZG1hX3BhKHByaXYtPnJ4X2ZkYV9wdHIpLEVUSEVSX0ZEQV9CQVMoZGV2LT5iYXNlX2FkZHIpKTsKLQl3cml0ZWwoKFJYX05VTV9GREVTQy0xKSpzaXplb2Yoc3RydWN0IHJ4X2ZkYV9lbnQpLEVUSEVSX0ZEQV9MSU0oZGV2LT5iYXNlX2FkZHIpKTsKLQl3cml0ZWwoKHVuc2lnbmVkIGludClfX2RtYV9wYShwcml2LT5yeF9ibGlzdF92cCksRVRIRVJfQkxGUk1QVFIoZGV2LT5iYXNlX2FkZHIpKTsKLQotCXdyaXRlbCgodW5zaWduZWQgaW50KV9fZG1hX3BhKHByaXYtPnR4X2ZkYWxpc3RfdnApLEVUSEVSX1RYRlJNUFRSKGRldi0+YmFzZV9hZGRyKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi12b2lkIGV0aGVyMDBfbWVtX3VwZGF0ZSh2b2lkKiBkZXZfaWQpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UqIGRldj1kZXZfaWQ7Ci0Jc3RydWN0IG5ldF9wcml2KiBwcml2PWRldi0+cHJpdjsKLQlzdHJ1Y3Qgc2tfYnVmZiogc2tiOwotCXN0cnVjdCB0eF9mZGFfZW50ICpmZGFfcHRyPXByaXYtPnR4X2ZkYWxpc3RfdnA7Ci0Jc3RydWN0IHJ4X2JsaXN0X2VudCogYmxpc3RfZW50X3B0cjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JcHJpdi0+dHFfbWVtdXBkYXRlLnN5bmM9MDsKLQkvL3ByaXYtPnRxX21lbXVwZGF0ZS5saXN0PQotCXByaXYtPm1lbXVwZGF0ZV9zY2hlZHVsZWQ9MDsKLQotCS8qIFRyYW5zbWl0IGludGVycnVwdCAqLwotCXdoaWxlKGZkYV9wdHI8KHByaXYtPnR4X2ZkYWxpc3RfdnArVFhfTlVNX0ZERVNDKSl7Ci0JCWlmKCEoRkRDVExfQ09XTlNGRF9NU0smZmRhX3B0ci0+ZmQuRkRDdGwpICYmIChFVEhFUl9UWF9TVEFUX0NPTVBfTVNLJmZkYV9wdHItPmZkLkZEU3RhdCkpewotCQkJcHJpdi0+c3RhdHMudHhfcGFja2V0cysrOwotCQkJcHJpdi0+c3RhdHMudHhfYnl0ZXMrPWZkYV9wdHItPmJkLkJ1ZmZMZW5ndGg7Ci0JCQlza2I9KHN0cnVjdCBza19idWZmKilmZGFfcHRyLT5mZC5GRFN5c3RlbTsKLQkJCS8vcHJpbnRrKCIlZDp0eGNsbjpmZGE9JSN4IHNrYj0lI3hcbiIsamlmZmllcyxmZGFfcHRyLHNrYik7Ci0JCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCQlmZGFfcHRyLT5mZC5GRFN5c3RlbT0wOwotCQkJZmRhX3B0ci0+ZmQuRkRTdGF0PTA7Ci0JCQlmZGFfcHRyLT5mZC5GREN0bD0wOwotCQl9Ci0JCWZkYV9wdHIrKzsKLQl9Ci0JLyogRmlsbCBpbiBhbnkgbWlzc2luZyBidWZmZXJzIGZyb20gdGhlIHJlY2VpdmVkIHF1ZXVlICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4X2xvY2ssZmxhZ3MpOwotCWJsaXN0X2VudF9wdHI9cHJpdi0+cnhfYmxpc3RfdnA7Ci0Jd2hpbGUoYmxpc3RfZW50X3B0cjwocHJpdi0+cnhfYmxpc3RfdnArUlhfTlVNX0JVRkYpKXsKLQkJLyogZmQuRkRTeXN0ZW0gb2YgMCBpbmRpY2F0ZXMgd2UgZmFpbGVkIHRvIGFsbG9jYXRlIHRoZSBidWZmZXIgaW4gdGhlIElTUiAqLwotCQlpZighYmxpc3RfZW50X3B0ci0+ZmQuRkRTeXN0ZW0pewotCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQkJCXNrYj1kZXZfYWxsb2Nfc2tiKFBLVF9CVUZfU1opOwotCQkJYmxpc3RfZW50X3B0ci0+ZmQuRkRTeXN0ZW09KHVuc2lnbmVkIGludClza2I7Ci0JCQlpZihza2IpewotCQkJCXNldHVwX2JsaXN0X2VudHJ5KHNrYixibGlzdF9lbnRfcHRyKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlibGlzdF9lbnRfcHRyKys7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4X2xvY2ssZmxhZ3MpOwotCWlmKHByaXYtPnF1ZXVlX3N0b3BwZWQpewotCQkvL3ByaW50aygiJWQ6Y2xuOnN0YXJ0IHFcbiIsamlmZmllcyk7Ci0JCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7Ci0JfQotCWlmKHByaXYtPnJ4X2Rpc2FibGVkKXsKLQkJLy9wcmludGsoIiVkOmVuYWJsZV9pcnFcbiIsamlmZmllcyk7Ci0JCXByaXYtPnJ4X2Rpc2FibGVkPTA7Ci0JCXdyaXRlbChFVEhFUl9SWF9DVExfUlhFTl9NU0ssRVRIRVJfUlhfQ1RMKGRldi0+YmFzZV9hZGRyKSk7Ci0KLQl9Ci19Ci0KLQotc3RhdGljIHZvaWQgZXRoZXIwMF9pbnQoIGludCBpcnFfbnVtLCB2b2lkKiBkZXZfaWQsIHN0cnVjdCBwdF9yZWdzKiByZWdzKQotewotCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXY9ZGV2X2lkOwotCXN0cnVjdCBuZXRfcHJpdiogcHJpdj1kZXYtPnByaXY7Ci0KLQl1bnNpZ25lZCBpbnQgICBpbnRlcnJ1cHRWYWx1ZTsKLQotCWludGVycnVwdFZhbHVlPXJlYWRsKEVUSEVSX0lOVF9TUkMoZGV2LT5iYXNlX2FkZHIpKTsKLQotCS8vcHJpbnRrKCJJTlRfU1JDPSV4XG4iLGludGVycnVwdFZhbHVlKTsKLQotCWlmKCEocmVhZGwoRVRIRVJfSU5UX1NSQyhkZXYtPmJhc2VfYWRkcikpICYgRVRIRVJfSU5UX1NSQ19JUlFfTVNLKSkKLQl7Ci0JCXJldHVybjsJCS8qIEludGVycnVwdCB3YXNuJ3QgY2F1c2VkIGJ5IHVzISEgKi8KLQl9Ci0KLQlpZihyZWFkbChFVEhFUl9JTlRfU1JDKGRldi0+YmFzZV9hZGRyKSkmCi0JICAgKEVUSEVSX0lOVF9TUkNfSU5UTUFDUlhfTVNLIHwKLQkgICAgRVRIRVJfSU5UX1NSQ19GREFFWF9NU0sgfAotCSAgICBFVEhFUl9JTlRfU1JDX0JMRVhfTVNLKSkgewotCQlzdHJ1Y3QgcnhfYmxpc3RfZW50KiBibGlzdF9lbnRfcHRyOwotCQlzdHJ1Y3QgcnhfZmRhX2VudCogZmRhX2VudF9wdHI7Ci0JCXN0cnVjdCBza19idWZmKiBza2I7Ci0KLQkJZmRhX2VudF9wdHI9cHJpdi0+cnhfZmRhX3B0cjsKLQkJc3Bpbl9sb2NrKCZwcml2LT5yeF9sb2NrKTsKLQkJd2hpbGUoZmRhX2VudF9wdHI8KHByaXYtPnJ4X2ZkYV9wdHIrUlhfTlVNX0ZERVNDKSl7Ci0JCQlpbnQgcmVzdWx0OwotCi0JCQlpZighKGZkYV9lbnRfcHRyLT5mZC5GREN0bCZGRENUTF9DT1dOU0ZEX01TSykpCi0JCQl7Ci0JCQkJLyogVGhpcyBmcmFtZSBpcyByZWFkeSBmb3IgcHJvY2Vzc2luZyAqLwotCQkJCS8qZmluZCB0aGUgY29ycmVzcG9uZGluZyBidWZmZXIgaW4gdGhlIGJ1ZmZlcmxpc3QgKi8KLQkJCQlibGlzdF9lbnRfcHRyPXByaXYtPnJ4X2JsaXN0X3ZwK2ZkYV9lbnRfcHRyLT5iZC5CRFN0YXQ7Ci0JCQkJc2tiPShzdHJ1Y3Qgc2tfYnVmZiopYmxpc3RfZW50X3B0ci0+ZmQuRkRTeXN0ZW07Ci0KLQkJCQkvKiBQYXNzIHRoaXMgc2tiIHVwIHRoZSBzdGFjayAqLwotCQkJCXNrYi0+ZGV2PWRldjsKLQkJCQlza2JfcHV0KHNrYixmZGFfZW50X3B0ci0+ZmQuRkRMZW5ndGgpOwotCQkJCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7Ci0JCQkJc2tiLT5pcF9zdW1tZWQ9Q0hFQ0tTVU1fVU5ORUNFU1NBUlk7Ci0JCQkJcmVzdWx0PW5ldGlmX3J4KHNrYik7Ci0JCQkJLyogVXBkYXRlIHN0YXRpc3RpY3MgKi8KLQkJCQlwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCQkJcHJpdi0+c3RhdHMucnhfYnl0ZXMrPWZkYV9lbnRfcHRyLT5mZC5GRExlbmd0aDsKLQotCQkJCS8qIEZyZWUgdGhlIEZEQSBlbnRyeSAqLwotCQkJCWZkYV9lbnRfcHRyLT5iZC5CRFN0YXQ9MHhmZjsKLQkJCQlmZGFfZW50X3B0ci0+ZmQuRkRDdGw9RkRDVExfQ09XTlNGRF9NU0s7Ci0KLQkJCQkvKiBBbGxvY2F0ZSBhIG5ldyBza2IgYW5kIHBvaW50IHRoZSBiZCBlbnRyeSB0byBpdCAqLwotCQkJCWJsaXN0X2VudF9wdHItPmZkLkZEU3lzdGVtPTA7Ci0JCQkJc2tiPWRldl9hbGxvY19za2IoUEtUX0JVRl9TWik7Ci0JCQkJLy9wcmludGsoImFsbG9jc2tiPSUjeFxuIixza2IpOwotCQkJCWlmKHNrYil7Ci0JCQkJCXNldHVwX2JsaXN0X2VudHJ5KHNrYixibGlzdF9lbnRfcHRyKTsKLQotCQkJCX0KLQkJCQllbHNlIGlmKCFwcml2LT5tZW11cGRhdGVfc2NoZWR1bGVkKXsKLQkJCQkJaW50IHRtcDsKLQkJCQkJLyogVGhlcmUgYXJlIG5vIGJ1ZmZlcnMgYXQgdGhlIG1vbWVudCwgc28gc2NoZWR1bGUgKi8KLQkJCQkJLyogdGhlIGJhY2tncm91bmQgdGFzayB0byBzb3J0IHRoaXMgb3V0ICovCi0JCQkJCXNjaGVkdWxlX3Rhc2soJnByaXYtPnRxX21lbXVwZGF0ZSk7Ci0JCQkJCXByaXYtPm1lbXVwZGF0ZV9zY2hlZHVsZWQ9MTsKLQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOk5vIGJ1ZmZlcnMiLGRldi0+bmFtZSk7Ci0JCQkJCS8qIElmIHRoaXMgaW50ZXJydXB0IHdhcyBkdWUgdG8gYSBsYWNrIG9mIGJ1ZmZlcnMgdGhlbgotCQkJCQkgKiB3ZSdkIGJldHRlciBzdG9wIHRoZSByZWNlaXZlciB0b28gKi8KLQkJCQkJaWYoaW50ZXJydXB0VmFsdWUmRVRIRVJfSU5UX1NSQ19CTEVYX01TSyl7Ci0JCQkJCQlwcml2LT5yeF9kaXNhYmxlZD0xOwotCQkJCQkJdG1wPXJlYWRsKEVUSEVSX0lOVF9TUkMoZGV2LT5iYXNlX2FkZHIpKTsKLQkJCQkJCXdyaXRlbCh0bXAmfkVUSEVSX1JYX0NUTF9SWEVOX01TSyxFVEhFUl9SWF9DVEwoZGV2LT5iYXNlX2FkZHIpKTsKLQkJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczpIYWx0aW5nIHJ4IixkZXYtPm5hbWUpOwotCQkJCQl9Ci0KLQkJCQl9Ci0KLQkJCX0KLQkJCWZkYV9lbnRfcHRyKys7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJnByaXYtPnJ4X2xvY2spOwotCi0JCS8qIENsZWFyIHRoZSAgaW50ZXJydXB0cyAqLwotCQl3cml0ZWwoRVRIRVJfSU5UX1NSQ19JTlRNQUNSWF9NU0sgfCBFVEhFUl9JTlRfU1JDX0ZEQUVYX01TSwotCQkgICAgICAgfCBFVEhFUl9JTlRfU1JDX0JMRVhfTVNLLEVUSEVSX0lOVF9TUkMoZGV2LT5iYXNlX2FkZHIpKTsKLQotCX0KLQotCWlmKHJlYWRsKEVUSEVSX0lOVF9TUkMoZGV2LT5iYXNlX2FkZHIpKSZFVEhFUl9JTlRfU1JDX0lOVE1BQ1RYX01TSyl7Ci0KLQkJaWYoIXByaXYtPm1lbXVwZGF0ZV9zY2hlZHVsZWQpewotCQkJc2NoZWR1bGVfdGFzaygmcHJpdi0+dHFfbWVtdXBkYXRlKTsKLQkJCXByaXYtPm1lbXVwZGF0ZV9zY2hlZHVsZWQ9MTsKLQkJfQotCQkvKiBDbGVhciB0aGUgaW50ZXJydXB0ICovCi0JCXdyaXRlbChFVEhFUl9JTlRfU1JDX0lOVE1BQ1RYX01TSyxFVEhFUl9JTlRfU1JDKGRldi0+YmFzZV9hZGRyKSk7Ci0JfQotCi0JaWYgKHJlYWRsKEVUSEVSX0lOVF9TUkMoZGV2LT5iYXNlX2FkZHIpKSAmIChFVEhFUl9JTlRfU1JDX1NXSU5UX01TS3wKLQkJCQkJCSAgICBFVEhFUl9JTlRfU1JDX0lOVEVBUk5PVF9NU0t8Ci0JCQkJCQkgICAgRVRIRVJfSU5UX1NSQ19JTlRMSU5LX01TS3wKLQkJCQkJCSAgICBFVEhFUl9JTlRfU1JDX0lOVEVYQkRfTVNLfAotCQkJCQkJICAgIEVUSEVSX0lOVF9TUkNfSU5UVFhDVExDTVBfTVNLKSkKLQl7Ci0JCS8qCi0JCSAqCU5vdCB1c2luZyBhbnkgb2YgdGhlc2Ugc28gdGhleSBzaG91bGRuJ3QgaGFwcGVuCi0JCSAqCi0JCSAqCUluIHRoZSBjYXNlZCBvZiBJTlRFWEJEIC0gaWYgeW91IGFsbG9jYXRlIG1vcmUKLQkJICogICAgICB0aGFuIDI4IGRlY3NyaXB0b3JzIHlvdSBtYXkgbmVlZCB0byB0aGluayBhYm91dCB0aGlzCi0JCSAqLwotCQlwcmludGsoIk5vdCB1c2luZyB0aGlzIGludGVycnVwdFxuIik7Ci0JfQotCi0JaWYgKHJlYWRsKEVUSEVSX0lOVF9TUkMoZGV2LT5iYXNlX2FkZHIpKSAmCi0JICAgIChFVEhFUl9JTlRfU1JDX0lOVFNCVVNfTVNLIHwKLQkgICAgIEVUSEVSX0lOVF9TUkNfSU5UTlJBQlRfTVNLCi0JICAgICB8RVRIRVJfSU5UX1NSQ19ETVBBUkVSUl9NU0spKQotCXsKLQkJLyoKLQkJICogSGFyZHdhcmUgZXJyb3JzLCB3ZSBjYW4gZWl0aGVyIGlnbm9yZSB0aGVtIGFuZCBob3BlIHRoZXkgZ28gYXdheQotCQkgKm9yIHJlc2V0IHRoZSBkZXZpY2UsIEknbGwgdHJ5IHRoZSBmaXJzdCBmb3Igbm93IHRvIHNlZSBpZiB0aGV5IGhhcHBlbgotCQkgKi8KLQkJcHJpbnRrKCJIYXJkd2FyZSBlcnJvclxuIik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBldGhlcjAwX3NldHVwX2V0aGVybmV0X2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UqIGRldikKLXsKLQlpbnQgdG1wOwotCi0JZGV2LT5hZGRyX2xlbj02OwotCXdyaXRldygwLEVUSEVSX0FSQ19BRFIoZGV2LT5iYXNlX2FkZHIpKTsKLQl3cml0ZWwoKGRldi0+ZGV2X2FkZHJbMF08PDI0KSB8Ci0JCShkZXYtPmRldl9hZGRyWzFdPDwxNikgfAotCQkoZGV2LT5kZXZfYWRkclsyXTw8OCkgfAotCQlkZXYtPmRldl9hZGRyWzNdLAotCQlFVEhFUl9BUkNfREFUQShkZXYtPmJhc2VfYWRkcikpOwotCi0Jd3JpdGV3KDQsRVRIRVJfQVJDX0FEUihkZXYtPmJhc2VfYWRkcikpOwotCXRtcD1yZWFkbChFVEhFUl9BUkNfREFUQShkZXYtPmJhc2VfYWRkcikpOwotCXRtcCY9MHhmZmZmOwotCXRtcHw9KGRldi0+ZGV2X2FkZHJbNF08PDI0KSB8IChkZXYtPmRldl9hZGRyWzVdPDwxNik7Ci0Jd3JpdGVsKHRtcCwgRVRIRVJfQVJDX0RBVEEoZGV2LT5iYXNlX2FkZHIpKTsKLQkvKiBFbmFibGUgdGhpcyBlbnRyeSBpbiB0aGUgQVJDICovCi0KLQl3cml0ZWwoMSxFVEhFUl9BUkNfRU5BKGRldi0+YmFzZV9hZGRyKSk7Ci0KLQlyZXR1cm47Ci19Ci0KLQotc3RhdGljIHZvaWQgZXRoZXIwMF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCS8qIHJlc2V0IHRoZSBjb250cm9sbGVyICovCi0Jd3JpdGV3KEVUSEVSX01BQ19DVExfUkVTRVRfTVNLLEVUSEVSX01BQ19DVEwoZGV2LT5iYXNlX2FkZHIpKTsKLQotCS8qCi0JICogTWFrZSBzdXJlIHdlJ3JlIG5vdCBnb2luZyB0byBzZW5kIGFueXRoaW5nCi0JICovCi0KLQl3cml0ZXcoRVRIRVJfVFhfQ1RMX1RYSEFMVF9NU0ssRVRIRVJfVFhfQ1RMKGRldi0+YmFzZV9hZGRyKSk7Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSB3ZSdyZSBub3QgZ29pbmcgdG8gcmVjZWl2ZSBhbnl0aGluZwotCSAqLwotCXdyaXRldyhFVEhFUl9SWF9DVExfUlhIQUxUX01TSyxFVEhFUl9SWF9DVEwoZGV2LT5iYXNlX2FkZHIpKTsKLQotCS8qCi0JICogRGlzYWJsZSBJbnRlcnJ1cHRzIGZvciBub3csIGFuZCBzZXQgdGhlIGJ1cnN0IHNpemUgdG8gOCBieXRlcwotCSAqLwotCi0Jd3JpdGVsKEVUSEVSX0RNQV9DVExfSU5UTUFTS19NU0sgfAotCSAgICAgICAoKDggPDwgRVRIRVJfRE1BX0NUTF9ETUJVUlNUX09GU1QpICYgRVRIRVJfRE1BX0NUTF9ETUJVUlNUX01TSykKLQkgICAgICAgfCgyPDxFVEhFUl9ETUFfQ1RMX1JYQUxJR05fT0ZTVCksCi0JICAgICAgIEVUSEVSX0RNQV9DVEwoZGV2LT5iYXNlX2FkZHIpKTsKLQotCi0JLyoKLQkgKiBTZXQgVHhUaHJzaCAtIHN0YXJ0IHRyYW5zbWl0dGluZyBhIHBhY2tldCBhZnRlciAxNTE0Ci0JICogYnl0ZXMgb3Igd2hlbiBhIHBhY2tldCBpcyBjb21wbGV0ZSwgd2hpY2hldmVyIGNvbWVzIGZpcnN0Ci0JICovCi0JIHdyaXRldygxNTE0LEVUSEVSX1RYVEhSU0goZGV2LT5iYXNlX2FkZHIpKTsKLQotCS8qCi0JICogU2V0IFR4UG9sbEN0ci4gIEVhY2ggY3ljbGUgaXMKLQkgKiA2MS40NCBtaWNyb3NlY29uZHMgd2l0aCBhIDMzIE1IeiBidXMKLQkgKi8KLQkgd3JpdGV3KDEsRVRIRVJfVFhQT0xMQ1RSKGRldi0+YmFzZV9hZGRyKSk7Ci0KLQkvKgotCSAqIFNldCBSeF9DdGwgLSBUdXJuIG9mZiByZWNlcHRpb24gYW5kIGxldCBSeERhdGEgdHVybiBpdAotCSAqIG9uIGxhdGVyCi0JICovCi0JIHdyaXRldyhFVEhFUl9SWF9DVExfUlhIQUxUX01TSyxFVEhFUl9SWF9DVEwoZGV2LT5iYXNlX2FkZHIpKTsKLQotfQotCi0KLXN0YXRpYyB2b2lkIGV0aGVyMDBfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQotewotCWludCBjb3VudD1kZXYtPm1jX2NvdW50OwotCi0JLyogU2V0IHByb21pc2N1b3VzIG1vZGUgaWYgaXQncyBhc2tlZCBmb3IuICovCi0KLQlpZiAoZGV2LT5mbGFncyZJRkZfUFJPTUlTQyl7Ci0KLQkJd3JpdGV3KCBFVEhFUl9BUkNfQ1RMX0NPTVBFTl9NU0sgfAotCQkJRVRIRVJfQVJDX0NUTF9CUk9BREFDQ19NU0sgfAotCQkJRVRIRVJfQVJDX0NUTF9HUk9VUEFDQ19NU0sgfAotCQkJRVRIRVJfQVJDX0NUTF9TVEFUSU9OQUNDX01TSywKLQkJCUVUSEVSX0FSQ19DVEwoZGV2LT5iYXNlX2FkZHIpKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogR2V0IGFsbCBtdWx0aWNhc3QgcGFja2V0cyBpZiByZXF1aXJlZCwgb3IgaWYgdGhlcmUgYXJlIHRvbwotCSAqIG1hbnkgYWRkcmVzc2VzIHRvIGZpdCBpbiBoYXJkd2FyZQotCSAqLwotCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKXsKLQkJd3JpdGV3KCBFVEhFUl9BUkNfQ1RMX0NPTVBFTl9NU0sgfAotCQkJRVRIRVJfQVJDX0NUTF9HUk9VUEFDQ19NU0sgfAotCQkJRVRIRVJfQVJDX0NUTF9CUk9BREFDQ19NU0ssCi0JCQlFVEhFUl9BUkNfQ1RMKGRldi0+YmFzZV9hZGRyKSk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRldi0+bWNfY291bnQgPiAoRVRIRVJfQVJDX1NJWkUgLSAxKSl7Ci0KLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVG9vIG1hbnkgbXVsdGljYXN0IGFkZHJlc3NlcyBmb3IgaGFyZHdhcmUgdG8gZmlsdGVyIC0gcmVjZWl2aW5nIGFsbCBtdWx0aWNhc3QgcGFja2V0c1xuIik7Ci0JCXdyaXRldyggRVRIRVJfQVJDX0NUTF9DT01QRU5fTVNLIHwKLQkJCUVUSEVSX0FSQ19DVExfR1JPVVBBQ0NfTVNLIHwKLQkJCUVUSEVSX0FSQ19DVExfQlJPQURBQ0NfTVNLLAotCQkJRVRIRVJfQVJDX0NUTChkZXYtPmJhc2VfYWRkcikpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYoZGV2LT5tY19jb3VudCl7Ci0JCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNfbGlzdF9lbnQ9ZGV2LT5tY19saXN0OwotCQl1bnNpZ25lZCBpbnQgdGVtcCxpOwotCQlERUJVRyhwcmludGsoIm1jX2NvdW50PSVkIG1jX2xpc3Q9JSN4XG4iLGRldi0+IG1jX2NvdW50LCBkZXYtPm1jX2xpc3QpKTsKLQkJREVCVUcocHJpbnRrKCJtYyBhZGRyPSUwMiN4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCi0JCQkgICAgIG1jX2xpc3RfZW50LT5kbWlfYWRkcls1XSwKLQkJCSAgICAgbWNfbGlzdF9lbnQtPmRtaV9hZGRyWzRdLAotCQkJICAgICBtY19saXN0X2VudC0+ZG1pX2FkZHJbM10sCi0JCQkgICAgIG1jX2xpc3RfZW50LT5kbWlfYWRkclsyXSwKLQkJCSAgICAgbWNfbGlzdF9lbnQtPmRtaV9hZGRyWzFdLAotCQkJICAgICBtY19saXN0X2VudC0+ZG1pX2FkZHJbMF0pOykKLQotCQkvKgotCQkgKiBUaGUgZmlyc3QgNiBieXRlcyBhcmUgdGhlIE1BQyBhZGRyZXNzLCBzbwotCQkgKiBkb24ndCBjaGFuZ2UgdGhlbSEKLQkJICovCi0JCXdyaXRldyg0LEVUSEVSX0FSQ19BRFIoZGV2LT5iYXNlX2FkZHIpKTsKLQkJdGVtcD1yZWFkbChFVEhFUl9BUkNfREFUQShkZXYtPmJhc2VfYWRkcikpOwotCQl0ZW1wJj0weGZmZmYwMDAwOwotCi0JCS8qIERpc2FibGUgdGhlIGN1cnJlbnQgbXVsdGljYXN0IHN0dWZmICovCi0JCXdyaXRlbCgxLEVUSEVSX0FSQ19FTkEoZGV2LT5iYXNlX2FkZHIpKTsKLQotCQlmb3IoOzspewotCQkJdGVtcHw9bWNfbGlzdF9lbnQtPmRtaV9hZGRyWzFdIHwKLQkJCQltY19saXN0X2VudC0+ZG1pX2FkZHJbMF08PDg7Ci0JCQl3cml0ZWwodGVtcCxFVEhFUl9BUkNfREFUQShkZXYtPmJhc2VfYWRkcikpOwotCi0JCQlpPXJlYWRsKEVUSEVSX0FSQ19BRFIoZGV2LT5iYXNlX2FkZHIpKTsKLQkJCXdyaXRldyhpKzQsRVRIRVJfQVJDX0FEUihkZXYtPmJhc2VfYWRkcikpOwotCi0JCQl0ZW1wPW1jX2xpc3RfZW50LT5kbWlfYWRkcls1XXwKLQkJCQltY19saXN0X2VudC0+ZG1pX2FkZHJbNF08PDggfAotCQkJCW1jX2xpc3RfZW50LT5kbWlfYWRkclszXTw8MTYgfAotCQkJCW1jX2xpc3RfZW50LT5kbWlfYWRkclsyXTw8MjQ7Ci0JCQl3cml0ZWwodGVtcCxFVEhFUl9BUkNfREFUQShkZXYtPmJhc2VfYWRkcikpOwotCi0JCQljb3VudC0tOwotCQkJaWYoIW1jX2xpc3RfZW50LT5uZXh0IHx8ICFjb3VudCl7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlERUJVRyhwcmludGsoIm1jX2xpc3RfbmV4dD0lI3hcbiIsbWNfbGlzdF9lbnQtPm5leHQpOykKLQkJCW1jX2xpc3RfZW50PW1jX2xpc3RfZW50LT5uZXh0OwotCi0KLQkJCWk9cmVhZGwoRVRIRVJfQVJDX0FEUihkZXYtPmJhc2VfYWRkcikpOwotCQkJd3JpdGVsKGkrNCxFVEhFUl9BUkNfQURSKGRldi0+YmFzZV9hZGRyKSk7Ci0KLQkJCXRlbXA9bWNfbGlzdF9lbnQtPmRtaV9hZGRyWzNdfAotCQkJCW1jX2xpc3RfZW50LT5kbWlfYWRkclsyXTw8OCB8Ci0JCQkJbWNfbGlzdF9lbnQtPmRtaV9hZGRyWzFdPDwxNiB8Ci0JCQkJbWNfbGlzdF9lbnQtPmRtaV9hZGRyWzBdPDwyNDsKLQkJCXdyaXRlbCh0ZW1wLEVUSEVSX0FSQ19EQVRBKGRldi0+YmFzZV9hZGRyKSk7Ci0KLQkJCWk9cmVhZGwoRVRIRVJfQVJDX0FEUihkZXYtPmJhc2VfYWRkcikpOwotCQkJd3JpdGVsKGkrNCxFVEhFUl9BUkNfQURSKGRldi0+YmFzZV9hZGRyKSk7Ci0KLQkJCXRlbXA9bWNfbGlzdF9lbnQtPmRtaV9hZGRyWzRdPDwxNiB8Ci0JCQkJbWNfbGlzdF9lbnQtPmRtaV9hZGRyWzVdPDwyNDsKLQotCQkJd3JpdGVsKHRlbXAsRVRIRVJfQVJDX0RBVEEoZGV2LT5iYXNlX2FkZHIpKTsKLQotCQkJY291bnQtLTsKLQkJCWlmKCFtY19saXN0X2VudC0+bmV4dCB8fCAhY291bnQpewotCQkJCWJyZWFrOwotCQkJfQotCQkJbWNfbGlzdF9lbnQ9bWNfbGlzdF9lbnQtPm5leHQ7Ci0JCX0KLQotCi0JCWlmKGNvdW50KQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTXVsdGljYXN0IGxpc3Qgc2l6ZSBlcnJvclxuIik7Ci0KLQotCQl3cml0ZXcoIEVUSEVSX0FSQ19DVExfQlJPQURBQ0NfTVNLfAotCQkJRVRIRVJfQVJDX0NUTF9DT01QRU5fTVNLLAotCQkJRVRIRVJfQVJDX0NUTChkZXYtPmJhc2VfYWRkcikpOwotCi0JfQotCi0JLyogZW5hYmxlIHRoZSBhY3RpdmUgQVJDIGVudGllcyAqLwotCXdyaXRldygoMTw8KGNvdW50KzIpKS0xLEVUSEVSX0FSQ19FTkEoZGV2LT5iYXNlX2FkZHIpKTsKLX0KLQotCi1zdGF0aWMgaW50IGV0aGVyMDBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQotewotCWludCByZXN1bHQsdG1wOwotCXN0cnVjdCBuZXRfcHJpdiogcHJpdjsKLQotCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBJbnN0YWxsIGludGVycnVwdCBoYW5kbGVycyAqLwotCXJlc3VsdD1yZXF1ZXN0X2lycShkZXYtPmlycSxldGhlcjAwX2ludCwwLCJldGhlcjAwIixkZXYpOwotCWlmKHJlc3VsdCkKLQkJZ290byBvcGVuX2VycjE7Ci0KLQlyZXN1bHQ9cmVxdWVzdF9pcnEoMixldGhlcjAwX3BoeV9pbnQsMCwiZXRoZXIwMF9waHkiLGRldik7Ci0JaWYocmVzdWx0KQotCQlnb3RvIG9wZW5fZXJyMjsKLQotCWV0aGVyMDBfcmVzZXQoZGV2KTsKLQlyZXN1bHQ9ZXRoZXIwMF9tZW1faW5pdChkZXYpOwotCWlmKHJlc3VsdCkKLQkJZ290byBvcGVuX2VycjM7Ci0KLQotCWV0aGVyMDBfc2V0dXBfZXRoZXJuZXRfYWRkcmVzcyhkZXYpOwotCi0JZXRoZXIwMF9zZXRfbXVsdGljYXN0KGRldik7Ci0KLQlyZXN1bHQ9ZXRoZXIwMF93cml0ZV9waHkoZGV2LFBIWV9DT05UUk9MLCBQSFlfQ09OVFJPTF9BTkVHRU5fTVNLIHwgUEhZX0NPTlRST0xfUkFORUdfTVNLKTsKLQlpZihyZXN1bHQpCi0JCWdvdG8gb3Blbl9lcnI0OwotCXJlc3VsdD1ldGhlcjAwX3dyaXRlX3BoeShkZXYsUEhZX0lSUV9DT05UUk9MLCBQSFlfSVJRX0NPTlRST0xfTFNfQ0hHX0lFX01TSyB8Ci0JCQkJIFBIWV9JUlFfQ09OVFJPTF9BTkVHX0NPTVBfSUVfTVNLKTsKLQlpZihyZXN1bHQpCi0JCWdvdG8gb3Blbl9lcnI0OwotCi0JLyogU3RhcnQgdGhlIGRldmljZSBlbmFibGUgaW50ZXJydXB0cyAqLwotCXdyaXRldyhFVEhFUl9SWF9DVExfUlhFTl9NU0sKLS8vCSAgICAgICB8IEVUSEVSX1JYX0NUTF9TVFJJUENSQ19NU0sKLQkgICAgICAgfCBFVEhFUl9SWF9DVExfRU5HT09EX01TSwotCSAgICAgICB8IEVUSEVSX1JYX0NUTF9FTlJYUEFSX01TS3wgRVRIRVJfUlhfQ1RMX0VOTE9OR0VSUl9NU0sKLQkgICAgICAgfCBFVEhFUl9SWF9DVExfRU5PVkVSX01TS3wgRVRIRVJfUlhfQ1RMX0VOQ1JDRVJSX01TSywKLQkgICAgICAgRVRIRVJfUlhfQ1RMKGRldi0+YmFzZV9hZGRyKSk7Ci0KLQl3cml0ZXcoRVRIRVJfVFhfQ1RMX1RYRU5fTVNLfAotCSAgICAgICBFVEhFUl9UWF9DVExfRU5FWERFRkVSX01TS3wKLQkgICAgICAgRVRIRVJfVFhfQ1RMX0VOTENBUlJfTVNLfAotCSAgICAgICBFVEhFUl9UWF9DVExfRU5FWENPTExfTVNLfAotCSAgICAgICBFVEhFUl9UWF9DVExfRU5MQVRFQ09MTF9NU0t8Ci0JICAgICAgIEVUSEVSX1RYX0NUTF9FTlRYUEFSX01TS3wKLQkgICAgICAgRVRIRVJfVFhfQ1RMX0VOQ09NUF9NU0ssCi0JICAgICAgIEVUSEVSX1RYX0NUTChkZXYtPmJhc2VfYWRkcikpOwotCi0JdG1wPXJlYWRsKEVUSEVSX0RNQV9DVEwoZGV2LT5iYXNlX2FkZHIpKTsKLQl3cml0ZWwodG1wJn5FVEhFUl9ETUFfQ1RMX0lOVE1BU0tfTVNLLEVUSEVSX0RNQV9DVEwoZGV2LT5iYXNlX2FkZHIpKTsKLQotCXJldHVybiAwOwotCi0gb3Blbl9lcnI0OgotCWV0aGVyMDBfcmVzZXQoZGV2KTsKLSBvcGVuX2VycjM6Ci0JZnJlZV9pcnEoMixkZXYpOwotIG9wZW5fZXJyMjoKLQlmcmVlX2lycShkZXYtPmlycSxkZXYpOwotIG9wZW5fZXJyMToKLQlyZXR1cm4gcmVzdWx0OwotCi19Ci0KLQotc3RhdGljIGludCBldGhlcjAwX3R4KHN0cnVjdCBza19idWZmKiBza2IsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCi17Ci0Jc3RydWN0IG5ldF9wcml2ICpwcml2PWRldi0+cHJpdjsKLQlzdHJ1Y3QgdHhfZmRhX2VudCAqZmRhX3B0cjsKLQlpbnQgaTsKLQotCi0JLyoKLQkgKglGaW5kIGFuIGVtcHR5IHNsb3QgaW4gd2hpY2ggdG8gc3RpY2sgdGhlIGZyYW1lCi0JICovCi0JZmRhX3B0cj0oc3RydWN0IHR4X2ZkYV9lbnQqKV9fZG1hX3ZhKHJlYWRsKEVUSEVSX1RYRlJNUFRSKGRldi0+YmFzZV9hZGRyKSkpOwotCWk9MDsKLQl3aGlsZShpPFRYX05VTV9GREVTQyl7Ci0JCWlmIChmZGFfcHRyLT5mZC5GRFN0YXR8fChmZGFfcHRyLT5mZC5GREN0bCAmIEZEQ1RMX0NPV05TRkRfTVNLKSl7Ci0JCQlmZGFfcHRyID0oc3RydWN0IHR4X2ZkYV9lbnQqKSBfX2RtYV92YSgoc3RydWN0IHR4X2ZkYV9lbnQqKWZkYV9wdHItPmZkLkZETmV4dCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlicmVhazsKLQkJfQotCQlpKys7Ci0JfQotCi0JLyogV3JpdGUgdGhlIHNrYiBkYXRhIGZyb20gdGhlIGNhY2hlKi8KLQljb25zaXN0ZW50X3N5bmMoc2tiLT5kYXRhLHNrYi0+bGVuLFBDSV9ETUFfVE9ERVZJQ0UpOwotCWZkYV9wdHItPmJkLkJ1ZmZEYXRhPShjaGFyKilfX3BhKHNrYi0+ZGF0YSk7Ci0JZmRhX3B0ci0+YmQuQnVmZkxlbmd0aD0odW5zaWduZWQgc2hvcnQpc2tiLT5sZW47Ci0JLyogU2F2ZSB0aGUgcG9pbnRlciB0byB0aGUgc2tiIGZvciBmcmVlaW5nIGxhdGVyICovCi0JZmRhX3B0ci0+ZmQuRkRTeXN0ZW09KHVuc2lnbmVkIGludClza2I7Ci0JZmRhX3B0ci0+ZmQuRkRTdGF0PTA7Ci0JLyogUGFzcyBvd25lcnNoaXAgb2YgdGhlIGJ1ZmZlcnMgdG8gdGhlIGNvbnRyb2xsZXIgKi8KLQlmZGFfcHRyLT5mZC5GREN0bD0xOwotCWZkYV9wdHItPmZkLkZEQ3RsfD1GRENUTF9DT1dOU0ZEX01TSzsKLQotCS8qIElmIHRoZSBuZXh0IGJ1ZmZlciBpbiB0aGUgbGlzdCBpcyBmdWxsLCBzdG9wIHRoZSBxdWV1ZSAqLwotCWZkYV9wdHI9KHN0cnVjdCB0eF9mZGFfZW50KilfX2RtYV92YShmZGFfcHRyLT5mZC5GRE5leHQpOwotCWlmICgoZmRhX3B0ci0+ZmQuRkRTdGF0KXx8KGZkYV9wdHItPmZkLkZEQ3RsICYgRkRDVExfQ09XTlNGRF9NU0spKXsKLQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCQlwcml2LT5xdWV1ZV9zdG9wcGVkPTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZXRoZXIwMF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQotewotCXN0cnVjdCBuZXRfcHJpdiAqcHJpdj1kZXYtPnByaXY7Ci0JcmV0dXJuICZwcml2LT5zdGF0czsKLX0KLQotCi1zdGF0aWMgaW50IGV0aGVyMDBfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQotewotCXN0cnVjdCBuZXRfcHJpdiAqcHJpdj1kZXYtPnByaXY7Ci0JaW50IHRtcDsKLQotCS8qIFN0b3AvZGlzYWJsZSB0aGUgZGV2aWNlLiAqLwotCXRtcD1yZWFkdyhFVEhFUl9SWF9DVEwoZGV2LT5iYXNlX2FkZHIpKTsKLQl0bXAmPX4oRVRIRVJfUlhfQ1RMX1JYRU5fTVNLIHwgRVRIRVJfUlhfQ1RMX0VOR09PRF9NU0spOwotCXRtcHw9RVRIRVJfUlhfQ1RMX1JYSEFMVF9NU0s7Ci0Jd3JpdGV3KHRtcCxFVEhFUl9SWF9DVEwoZGV2LT5iYXNlX2FkZHIpKTsKLQotCXRtcD1yZWFkbChFVEhFUl9UWF9DVEwoZGV2LT5iYXNlX2FkZHIpKTsKLQl0bXAmPX5FVEhFUl9UWF9DVExfVFhFTl9NU0s7Ci0JdG1wfD1FVEhFUl9UWF9DVExfVFhIQUxUX01TSzsKLQl3cml0ZWwodG1wLEVUSEVSX1RYX0NUTChkZXYtPmJhc2VfYWRkcikpOwotCi0JLyogRnJlZSB1cCBzeXN0ZW0gcmVzb3VyY2VzICovCi0JZnJlZV9pcnEoZGV2LT5pcnEsZGV2KTsKLQlmcmVlX2lycSgyLGRldik7Ci0JaW91bm1hcChwcml2LT5kbWFfZGF0YSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZCBldGhlcjAwX2dldF9ldGhlcm5ldF9hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCi17Ci0Jc3RydWN0IG10ZF9pbmZvICpteW10ZD1OVUxMOwotCWludCBpOwotCXNpemVfdCByZXRsZW47Ci0KLQkvKgotCSAqIEZvciB0aGUgRXB4YTEwIGRldiBib2FyZCAoY2FtZWxvdCksIHRoZSBldGhlcm5ldCBNQUMKLQkgKiBhZGRyZXNzIGlzIG9mIHRoZSBmb3JtICAwMDphYTphYTowMDp4eDp4eCB3aGVyZQotCSAqIDAwOmFhOmFhIGlzIHRoZSBBbHRlcmEgdmVuZG9yIElEIGFuZCB4eDp4eCBpcyB0aGUKLQkgKiBsYXN0IDIgYnl0ZXMgb2YgdGhlIGJvYXJkIHNlcmlhbCBudW1iZXIsIGFzIHByb2dyYW1tZWQKLQkgKiBpbnRvIHRoZSBPVFAgYXJlYSBvZiB0aGUgZmxhc2ggZGV2aWNlIG9uIEVCSTEuIElmIHRoaXMKLQkgKiBpc24ndCBhbiBleHBhMTAgZGV2IGJvYXJkLCBvciB0aGVyZSdzIG5vIG10ZCBzdXBwb3J0IHRvCi0JICogcmVhZCB0aGUgc2VyaWFsIG51bWJlciBmcm9tIGZsYXNoIHRoZW4gd2UnbGwgZm9yY2UgdGhlCi0JICogdXNlIHRvIHNldCB0aGVpciBvd24gbWFjIGFkZHJlc3MgdXNpbmcgaWZjb25maWcuCi0JICovCi0KLSNpZmRlZiBDT05GSUdfQVJDSF9DQU1FTE9UCi0jaWZkZWYgQ09ORklHX01URAotCS8qIGdldCB0aGUgbXRkX2luZm8gc3RydWN0dXJlIGZvciB0aGUgZmlyc3QgbXRkIGRldmljZSovCi0JZm9yKGk9MDtpPE1BWF9NVERfREVWSUNFUztpKyspewotCQlteW10ZD1nZXRfbXRkX2RldmljZShOVUxMLGkpOwotCQlpZighbXltdGR8fCFzdHJjbXAobXltdGQtPm5hbWUsIkVQWEExMERCIGZsYXNoIikpCi0JCQlicmVhazsKLQl9Ci0KLQlpZighbXltdGQgfHwgIW15bXRkLT5yZWFkX3VzZXJfcHJvdF9yZWcpewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRmFpbGVkIHRvIHJlYWQgTUFDIGFkZHJlc3MgZnJvbSBmbGFzaFxuIixkZXYtPm5hbWUpOwotCX1lbHNlewotCQlteW10ZC0+cmVhZF91c2VyX3Byb3RfcmVnKG15bXRkLDIsMSwmcmV0bGVuLCZkZXYtPmRldl9hZGRyWzVdKTsKLQkJbXltdGQtPnJlYWRfdXNlcl9wcm90X3JlZyhteW10ZCwzLDEsJnJldGxlbiwmZGV2LT5kZXZfYWRkcls0XSk7Ci0JCWRldi0+ZGV2X2FkZHJbM109MDsKLQkJZGV2LT5kZXZfYWRkclsyXT12ZW5kb3JfaWRbMV07Ci0JCWRldi0+ZGV2X2FkZHJbMV09dmVuZG9yX2lkWzBdOwotCQlkZXYtPmRldl9hZGRyWzBdPTA7Ci0JfQotI2Vsc2UKLQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTVREIHN1cHBvcnQgcmVxdWlyZWQgdG8gcmVhZCBNQUMgYWRkcmVzcyBmcm9tIEVQWEExMCBkZXYgYm9hcmRcbiIsIGRldi0+bmFtZSk7Ci0jZW5kaWYKLSNlbmRpZgotCi0JaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKQotCQlwcmludGsoIiVzOiBJbnZhbGlkIGV0aGVybmV0IE1BQyBhZGRyZXNzLiAgUGxlYXNlIHNldCB1c2luZyAiCi0JCQkiaWZjb25maWdcbiIsIGRldi0+bmFtZSk7Ci0KLX0KLQotLyoKLSAqIEtlZXAgYSBtYXBwaW5nIG9mIGRldl9pbmZvIGFkZHJlc3NlcyAtPiBwb3J0IGxpbmVzIHRvIHVzZSB3aGVuCi0gKiByZW1vdmluZyBwb3J0cyBkZXY9PU5VTEwgaW5kaWNhdGVzIHVudXNlZCBlbnRyeQotICovCi0KLQotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXZfbGlzdFtFVEhfTlJdOwotCi1zdGF0aWMgaW50IGV0aGVyMDBfYWRkX2RldmljZShzdHJ1Y3QgcGxkaHNfZGV2X2luZm8qIGRldl9pbmZvLHZvaWQqIGRldl9wc19kYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IG5ldF9wcml2ICpwcml2OwotCXZvaWQgKm1hcF9hZGRyOwotCWludCByZXN1bHQ7Ci0JaW50IGk7Ci0KLQlpPTA7Ci0Jd2hpbGUoZGV2X2xpc3RbaV0gJiYgaSA8IEVUSF9OUikKLQkJaSsrOwotCi0JaWYoaT09RVRIX05SKXsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZXRoZXIwMDogTWF4aW11bSBudW1iZXIgb2YgcG9ydHMgcmVhY2hlZFxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oZGV2X2luZm8tPmJhc2VfYWRkciwgTUFDX1JFR19TSVpFLCAiZXRoZXIwMCIpKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfcHJpdikpOwotCWlmKCFkZXYpIHsKLQkJcmVzdWx0ID0gLUVOT01FTTsKLQkJZ290byBvdXRfcmVsZWFzZTsKLQl9Ci0JcHJpdiA9IGRldi0+cHJpdjsKLQotCXByaXYtPnRxX21lbXVwZGF0ZS5yb3V0aW5lPWV0aGVyMDBfbWVtX3VwZGF0ZTsKLQlwcml2LT50cV9tZW11cGRhdGUuZGF0YT0odm9pZCopIGRldjsKLQotCXNwaW5fbG9ja19pbml0KCZwcml2LT5yeF9sb2NrKTsKLQotCW1hcF9hZGRyPWlvcmVtYXBfbm9jYWNoZShkZXZfaW5mby0+YmFzZV9hZGRyLFNaXzRLKTsKLQlpZighbWFwX2FkZHIpewotCQlyZXN1bHQgPSAtRU5PTUVNOwotCQlvdXRfa2ZyZWU7Ci0JfQotCi0JZGV2LT5vcGVuPWV0aGVyMDBfb3BlbjsKLQlkZXYtPnN0b3A9ZXRoZXIwMF9zdG9wOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0PWV0aGVyMDBfc2V0X211bHRpY2FzdDsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdD1ldGhlcjAwX3R4OwotCWRldi0+Z2V0X3N0YXRzPWV0aGVyMDBfc3RhdHM7Ci0KLQlldGhlcjAwX2dldF9ldGhlcm5ldF9hZGRyZXNzKGRldik7Ci0KLQlTRVRfTU9EVUxFX09XTkVSKGRldik7Ci0KLQlkZXYtPmJhc2VfYWRkcj0odW5zaWduZWQgaW50KW1hcF9hZGRyOwotCWRldi0+aXJxPWRldl9pbmZvLT5pcnE7Ci0JZGV2LT5mZWF0dXJlcz1ORVRJRl9GX0RZTkFMTE9DIHwgTkVUSUZfRl9IV19DU1VNOwotCi0JcmVzdWx0PXJlZ2lzdGVyX25ldGRldihkZXYpOwotCWlmKHJlc3VsdCl7Ci0JCXByaW50aygiRXRoZXIwMDogRXJyb3IgJWkgcmVnaXN0ZXJpbmcgZHJpdmVyXG4iLHJlc3VsdCk7Ci0JCWdvdG8gb3V0X3VubWFwOwotCX0KLQlwcmludGsoInJlZ2lzdGVyZWQgZXRoZXIwMCBkZXZpY2UgYXQgJSN4XG4iLGRldl9pbmZvLT5iYXNlX2FkZHIpOwotCi0JZGV2X2xpc3RbaV09ZGV2OwotCi0JcmV0dXJuIHJlc3VsdDsKLQotIG91dF91bm1hcDoKLQlpb3VubWFwKG1hcF9hZGRyKTsKLSBvdXRfa2ZyZWU6Ci0JZnJlZV9uZXRkZXYoZGV2KTsKLSBvdXRfcmVsZWFzZToKLQlyZWxlYXNlX21lbV9yZWdpb24oZGV2X2luZm8tPmJhc2VfYWRkciwgTUFDX1JFR19TSVpFKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLXN0YXRpYyBpbnQgZXRoZXIwMF9yZW1vdmVfZGV2aWNlcyh2b2lkKQotewotCWludCBpOwotCi0JZm9yKGk9MDtpPEVUSF9OUjtpKyspewotCQlpZihkZXZfbGlzdFtpXSl7Ci0JCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldl9saXN0W2ldKTsKLQkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldl9saXN0W2ldKTsKLQkJCWlvdW5tYXAoKHZvaWQqKWRldl9saXN0W2ldLT5iYXNlX2FkZHIpOwotCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGRldl9saXN0W2ldLT5iYXNlX2FkZHIsIE1BQ19SRUdfU0laRSk7Ci0JCQlmcmVlX25ldGRldihkZXZfbGlzdFtpXSk7Ci0JCQlkZXZfbGlzdFtpXT0wOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsZF9ob3Rzd2FwX29wcyBldGhlcjAwX3BsZGhzX29wcz17Ci0JLm5hbWUgPSBFVEhFUjAwX05BTUUsCi0JLmFkZF9kZXZpY2UgPSBldGhlcjAwX2FkZF9kZXZpY2UsCi0JLnJlbW92ZV9kZXZpY2VzID0gZXRoZXIwMF9yZW1vdmVfZGV2aWNlcywKLX07Ci0KLQotc3RhdGljIHZvaWQgX19leGl0IGV0aGVyMDBfY2xlYW51cF9tb2R1bGUodm9pZCkKLXsKLQlpbnQgcmVzdWx0OwotCXJlc3VsdD1ldGhlcjAwX3JlbW92ZV9kZXZpY2VzKCk7Ci0JaWYocmVzdWx0KQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJldGhlcjAwOiBmYWlsZWQgdG8gcmVtb3ZlIGFsbCBkZXZpY2VzXG4iKTsKLQotCXBsZGhzX3VucmVnaXN0ZXJfZHJpdmVyKEVUSEVSMDBfTkFNRSk7Ci19Ci1tb2R1bGVfZXhpdChldGhlcjAwX2NsZWFudXBfbW9kdWxlKTsKLQotCi1zdGF0aWMgaW50IF9faW5pdCBldGhlcjAwX21vZF9pbml0KHZvaWQpCi17Ci0JcHJpbnRrKCJtb2QgaW5pdFxuIik7Ci0JcmV0dXJuIHBsZGhzX3JlZ2lzdGVyX2RyaXZlcigmZXRoZXIwMF9wbGRoc19vcHMpOwotCi19Ci0KLW1vZHVsZV9pbml0KGV0aGVyMDBfbW9kX2luaXQpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vZXRoZXIzLmMgYi9kcml2ZXJzL25ldC9hcm0vZXRoZXIzLmMKaW5kZXggMWNjNTNhYi4uZjFkNWIxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL2V0aGVyMy5jCisrKyBiL2RyaXZlcnMvbmV0L2FybS9ldGhlcjMuYwpAQCAtNjksNyArNjksNiBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vZWNhcmQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0gImV0aGVyMyBldGhlcm5ldCBkcml2ZXIgKGMpIDE5OTUtMjAwMCBSLk0uS2luZyB2MS4xN1xuIjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2V0aGVyaC5jIGIvZHJpdmVycy9uZXQvYXJtL2V0aGVyaC5jCmluZGV4IDk0MmEyODEuLjZhOTNiNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FybS9ldGhlcmguYworKysgYi9kcml2ZXJzL25ldC9hcm0vZXRoZXJoLmMKQEAgLTUwLDcgKzUwLDYgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2VjYXJkLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgogCiAjaW5jbHVkZSAiLi4vODM5MC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9iNDQuYyBiL2RyaXZlcnMvbmV0L2I0NC5jCmluZGV4IDdhYTQ5YjkuLmRmOWQ2ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2I0NC5jCisrKyBiL2RyaXZlcnMvbmV0L2I0NC5jCkBAIC0yMTM2LDcgKzIxMzYsNyBAQAogCiAJLyogU2V0dXAgcGFyYW1hdGVycyBmb3Igc3luY2luZyBSWC9UWCBETUEgZGVzY3JpcHRvcnMgKi8KIAlkbWFfZGVzY19hbGlnbl9tYXNrID0gfihkbWFfZGVzY19hbGlnbl9zaXplIC0gMSk7Ci0JZG1hX2Rlc2Nfc3luY19zaXplID0gbWF4KGRtYV9kZXNjX2FsaWduX3NpemUsIHNpemVvZihzdHJ1Y3QgZG1hX2Rlc2MpKTsKKwlkbWFfZGVzY19zeW5jX3NpemUgPSBtYXhfdCh1bnNpZ25lZCBpbnQsIGRtYV9kZXNjX2FsaWduX3NpemUsIHNpemVvZihzdHJ1Y3QgZG1hX2Rlc2MpKTsKIAogCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmI0NF9kcml2ZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5jIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5jCmluZGV4IDg1NGRkZmIuLmYyYTYzMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmMKQEAgLTE2OSw5ICsxNjksOSBAQAogCQlpbmRleCA9IG5leHRfaW5kZXg7CiAJfQogCi0JX3VubG9ja190eF9oYXNodGJsKGJvbmQpOwotCiAJdGxiX2luaXRfc2xhdmUoc2xhdmUpOworCisJX3VubG9ja190eF9oYXNodGJsKGJvbmQpOwogfQogCiAvKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgc3RhcnRpbmcgdGhlIG1vbml0b3IgdGltZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZGluZy5oIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kaW5nLmgKaW5kZXggMDE1YzdmMS4uM2RkNzhkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kaW5nLmgKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kaW5nLmgKQEAgLTIyLDggKzIyLDggQEAKICNpbmNsdWRlICJib25kXzNhZC5oIgogI2luY2x1ZGUgImJvbmRfYWxiLmgiCiAKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjMuMC4wIgotI2RlZmluZSBEUlZfUkVMREFURQkiTm92ZW1iZXIgOCwgMjAwNSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjMuMC4xIgorI2RlZmluZSBEUlZfUkVMREFURQkiSmFudWFyeSA5LCAyMDA2IgogI2RlZmluZSBEUlZfTkFNRQkiYm9uZGluZyIKICNkZWZpbmUgRFJWX0RFU0NSSVBUSU9OCSJFdGhlcm5ldCBDaGFubmVsIEJvbmRpbmcgRHJpdmVyIgogCkBAIC0yMDUsNyArMjA1LDcgQEAKICAqCiAgKiBDYWxsZXIgbXVzdCBob2xkIGJvbmQgbG9jayBmb3IgcmVhZAogICovCi1leHRlcm4gaW5saW5lIHN0cnVjdCBzbGF2ZSAqYm9uZF9nZXRfc2xhdmVfYnlfZGV2KHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2KQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2xhdmUgKmJvbmRfZ2V0X3NsYXZlX2J5X2RldihzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldikKIHsKIAlzdHJ1Y3Qgc2xhdmUgKnNsYXZlID0gTlVMTDsKIAlpbnQgaTsKQEAgLTIxOSw3ICsyMTksNyBAQAogCXJldHVybiBzbGF2ZTsKIH0KIAotZXh0ZXJuIGlubGluZSBzdHJ1Y3QgYm9uZGluZyAqYm9uZF9nZXRfYm9uZF9ieV9zbGF2ZShzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgYm9uZGluZyAqYm9uZF9nZXRfYm9uZF9ieV9zbGF2ZShzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQogewogCWlmICghc2xhdmUgfHwgIXNsYXZlLT5kZXYtPm1hc3RlcikgewogCQlyZXR1cm4gTlVMTDsKQEAgLTIyOCwxMyArMjI4LDEzIEBACiAJcmV0dXJuIChzdHJ1Y3QgYm9uZGluZyAqKXNsYXZlLT5kZXYtPm1hc3Rlci0+cHJpdjsKIH0KIAotZXh0ZXJuIGlubGluZSB2b2lkIGJvbmRfc2V0X3NsYXZlX2luYWN0aXZlX2ZsYWdzKHN0cnVjdCBzbGF2ZSAqc2xhdmUpCitzdGF0aWMgaW5saW5lIHZvaWQgYm9uZF9zZXRfc2xhdmVfaW5hY3RpdmVfZmxhZ3Moc3RydWN0IHNsYXZlICpzbGF2ZSkKIHsKIAlzbGF2ZS0+c3RhdGUgPSBCT05EX1NUQVRFX0JBQ0tVUDsKIAlzbGF2ZS0+ZGV2LT5mbGFncyB8PSBJRkZfTk9BUlA7CiB9CiAKLWV4dGVybiBpbmxpbmUgdm9pZCBib25kX3NldF9zbGF2ZV9hY3RpdmVfZmxhZ3Moc3RydWN0IHNsYXZlICpzbGF2ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBib25kX3NldF9zbGF2ZV9hY3RpdmVfZmxhZ3Moc3RydWN0IHNsYXZlICpzbGF2ZSkKIHsKIAlzbGF2ZS0+c3RhdGUgPSBCT05EX1NUQVRFX0FDVElWRTsKIAlzbGF2ZS0+ZGV2LT5mbGFncyAmPSB+SUZGX05PQVJQOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2Fzc2luaS5jIGIvZHJpdmVycy9uZXQvY2Fzc2luaS5jCmluZGV4IDFmN2NhNDUuLjZlMjk1ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhc3NpbmkuYworKysgYi9kcml2ZXJzL25ldC9jYXNzaW5pLmMKQEAgLTMzNSw2ICszMzUsMzAgQEAKIAkJY2FzX2Rpc2FibGVfaXJxKGNwLCBpKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGNhc19idWZmZXJfaW5pdChjYXNfcGFnZV90ICpjcCkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGNwLT5idWZmZXI7CisJYXRvbWljX3NldCgoYXRvbWljX3QgKikmcGFnZS0+bHJ1Lm5leHQsIDEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjYXNfYnVmZmVyX2NvdW50KGNhc19wYWdlX3QgKmNwKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gY3AtPmJ1ZmZlcjsKKwlyZXR1cm4gYXRvbWljX3JlYWQoKGF0b21pY190ICopJnBhZ2UtPmxydS5uZXh0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNhc19idWZmZXJfaW5jKGNhc19wYWdlX3QgKmNwKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gY3AtPmJ1ZmZlcjsKKwlhdG9taWNfaW5jKChhdG9taWNfdCAqKSZwYWdlLT5scnUubmV4dCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjYXNfYnVmZmVyX2RlYyhjYXNfcGFnZV90ICpjcCkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGNwLT5idWZmZXI7CisJYXRvbWljX2RlYygoYXRvbWljX3QgKikmcGFnZS0+bHJ1Lm5leHQpOworfQorCiBzdGF0aWMgdm9pZCBjYXNfZW5hYmxlX2lycShzdHJ1Y3QgY2FzICpjcCwgY29uc3QgaW50IHJpbmcpCiB7CiAJaWYgKHJpbmcgPT0gMCkgeyAvKiBhbGwgYnV0IFRYX0RPTkUgKi8KQEAgLTQ3Miw2ICs0OTYsNyBAQAogewogCXBjaV91bm1hcF9wYWdlKGNwLT5wZGV2LCBwYWdlLT5kbWFfYWRkciwgY3AtPnBhZ2Vfc2l6ZSwgCiAJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCWNhc19idWZmZXJfZGVjKHBhZ2UpOwogCV9fZnJlZV9wYWdlcyhwYWdlLT5idWZmZXIsIGNwLT5wYWdlX29yZGVyKTsKIAlrZnJlZShwYWdlKTsKIAlyZXR1cm4gMDsKQEAgLTUwMSw2ICs1MjYsNyBAQAogCXBhZ2UtPmJ1ZmZlciA9IGFsbG9jX3BhZ2VzKGZsYWdzLCBjcC0+cGFnZV9vcmRlcik7CiAJaWYgKCFwYWdlLT5idWZmZXIpCiAJCWdvdG8gcGFnZV9lcnI7CisJY2FzX2J1ZmZlcl9pbml0KHBhZ2UpOwogCXBhZ2UtPmRtYV9hZGRyID0gcGNpX21hcF9wYWdlKGNwLT5wZGV2LCBwYWdlLT5idWZmZXIsIDAsCiAJCQkJICAgICAgY3AtPnBhZ2Vfc2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAlyZXR1cm4gcGFnZTsKQEAgLTU3OSw3ICs2MDUsNyBAQAogCWxpc3RfZm9yX2VhY2hfc2FmZShlbGVtLCB0bXAsICZsaXN0KSB7CiAJCWNhc19wYWdlX3QgKnBhZ2UgPSBsaXN0X2VudHJ5KGVsZW0sIGNhc19wYWdlX3QsIGxpc3QpOwogCi0JCWlmIChwYWdlX2NvdW50KHBhZ2UtPmJ1ZmZlcikgPiAxKSAKKwkJaWYgKGNhc19idWZmZXJfY291bnQocGFnZSkgPiAxKQogCQkJY29udGludWU7CiAKIAkJbGlzdF9kZWwoZWxlbSk7CkBAIC0xMzQ3LDcgKzEzNzMsNyBAQAogCWNhc19wYWdlX3QgKnBhZ2UgPSBjcC0+cnhfcGFnZXNbMV1baW5kZXhdOwogCWNhc19wYWdlX3QgKm5ldzsKIAotCWlmIChwYWdlX2NvdW50KHBhZ2UtPmJ1ZmZlcikgPT0gMSkKKwlpZiAoY2FzX2J1ZmZlcl9jb3VudChwYWdlKSA9PSAxKQogCQlyZXR1cm4gcGFnZTsKIAogCW5ldyA9IGNhc19wYWdlX2RlcXVldWUoY3ApOwpAQCAtMTM2Nyw3ICsxMzkzLDcgQEAKIAljYXNfcGFnZV90ICoqcGFnZTEgPSBjcC0+cnhfcGFnZXNbMV07CiAKIAkvKiBzd2FwIGlmIGJ1ZmZlciBpcyBpbiB1c2UgKi8KLQlpZiAocGFnZV9jb3VudChwYWdlMFtpbmRleF0tPmJ1ZmZlcikgPiAxKSB7CisJaWYgKGNhc19idWZmZXJfY291bnQocGFnZTBbaW5kZXhdKSA+IDEpIHsKIAkJY2FzX3BhZ2VfdCAqbmV3ID0gY2FzX3BhZ2Vfc3BhcmUoY3AsIGluZGV4KTsKIAkJaWYgKG5ldykgewogCQkJcGFnZTFbaW5kZXhdID0gcGFnZTBbaW5kZXhdOwpAQCAtMTkyNSw4ICsxOTUxLDggQEAKIAl1NjQgY29tcHdiID0gbGU2NF90b19jcHUoY3AtPmluaXRfYmxvY2stPnR4X2NvbXB3Yik7CiAjZW5kaWYKIAlpZiAobmV0aWZfbXNnX2ludHIoY3ApKQotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR4IGludGVycnVwdCwgc3RhdHVzOiAweCV4LCAlbHhcbiIsCi0JCQljcC0+ZGV2LT5uYW1lLCBzdGF0dXMsIGNvbXB3Yik7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHggaW50ZXJydXB0LCBzdGF0dXM6IDB4JXgsICVsbHhcbiIsCisJCQljcC0+ZGV2LT5uYW1lLCBzdGF0dXMsICh1bnNpZ25lZCBsb25nIGxvbmcpY29tcHdiKTsKIAkvKiBwcm9jZXNzIGFsbCB0aGUgcmluZ3MgKi8KIAlmb3IgKHJpbmcgPSAwOyByaW5nIDwgTl9UWF9SSU5HUzsgcmluZysrKSB7CiAjaWZkZWYgVVNFX1RYX0NPTVBXQgpAQCAtMjAzOSw2ICsyMDY1LDcgQEAKIAkJc2tiLT5sZW4gICAgICArPSBobGVuIC0gc3dpdmVsOwogCiAJCWdldF9wYWdlKHBhZ2UtPmJ1ZmZlcik7CisJCWNhc19idWZmZXJfaW5jKHBhZ2UpOwogCQlmcmFnLT5wYWdlID0gcGFnZS0+YnVmZmVyOwogCQlmcmFnLT5wYWdlX29mZnNldCA9IG9mZjsKIAkJZnJhZy0+c2l6ZSA9IGhsZW4gLSBzd2l2ZWw7CkBAIC0yMDYzLDYgKzIwOTAsNyBAQAogCQkJZnJhZysrOwogCiAJCQlnZXRfcGFnZShwYWdlLT5idWZmZXIpOworCQkJY2FzX2J1ZmZlcl9pbmMocGFnZSk7CiAJCQlmcmFnLT5wYWdlID0gcGFnZS0+YnVmZmVyOwogCQkJZnJhZy0+cGFnZV9vZmZzZXQgPSAwOwogCQkJZnJhZy0+c2l6ZSA9IGhsZW47CkBAIC0yMjI1LDcgKzIyNTMsNyBAQAogCXJlbGVhc2VkID0gMDsKIAl3aGlsZSAoZW50cnkgIT0gbGFzdCkgewogCQkvKiBtYWtlIGEgbmV3IGJ1ZmZlciBpZiBpdCdzIHN0aWxsIGluIHVzZSAqLwotCQlpZiAocGFnZV9jb3VudChwYWdlW2VudHJ5XS0+YnVmZmVyKSA+IDEpIHsKKwkJaWYgKGNhc19idWZmZXJfY291bnQocGFnZVtlbnRyeV0pID4gMSkgewogCQkJY2FzX3BhZ2VfdCAqbmV3ID0gY2FzX3BhZ2VfZGVxdWV1ZShjcCk7CiAJCQlpZiAoIW5ldykgewogCQkJCS8qIGxldCB0aGUgdGltZXIga25vdyB0aGF0IHdlIG5lZWQgdG8gCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jczg5eDAuYyBiL2RyaXZlcnMvbmV0L2NzODl4MC5jCmluZGV4IGE2MDc4YWQuLmVmNTRlYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NzODl4MC5jCisrKyBiL2RyaXZlcnMvbmV0L2NzODl4MC5jCkBAIC04Nyw2ICs4NywxNSBAQAogICBEZWVwYWsgU2F4ZW5hICAgICA6IGRzYXhlbmFAcGxleGl0eS5uZXQKICAgICAgICAgICAgICAgICAgICAgOiBJbnRlbCBJWERQMngwMSAoWFNjYWxlIGl4cDJ4MDAgTlBVKSBwbGF0Zm9ybSBzdXBwb3J0CiAKKyAgRG1pdHJ5IFBlcnZ1c2hpbiAgOiBkcGVydnVzaGluQHJ1Lm12aXN0YS5jb20KKyAgICAgICAgICAgICAgICAgICAgOiBQTlgwMTBYIHBsYXRmb3JtIHN1cHBvcnQKKworICBEZWVwYWsgU2F4ZW5hICAgICA6IGRzYXhlbmFAcGxleGl0eS5uZXQKKyAgICAgICAgICAgICAgICAgICAgOiBJbnRlbCBJWERQMjM1MSBwbGF0Zm9ybSBzdXBwb3J0CisKKyAgRG1pdHJ5IFBlcnZ1c2hpbiAgOiBkcGVydnVzaGluQHJ1Lm12aXN0YS5jb20KKyAgICAgICAgICAgICAgICAgICAgOiBQTlgwMTBYIHBsYXRmb3JtIHN1cHBvcnQKKwogKi8KIAogLyogQWx3YXlzIGluY2x1ZGUgJ2NvbmZpZy5oJyBmaXJzdCBpbiBjYXNlIHRoZSB1c2VyIHdhbnRzIHRvIHR1cm4gb24KQEAgLTEwMCw3ICsxMDksNyBAQAogICogTm90ZSB0aGF0IGV2ZW4gaWYgRE1BIGlzIHR1cm5lZCBvZmYgd2Ugc3RpbGwgc3VwcG9ydCB0aGUgJ2RtYScgYW5kICAndXNlX2RtYScKICAqIG1vZHVsZSBvcHRpb25zIHNvIHdlIGRvbid0IGJyZWFrIGFueSBzdGFydHVwIHNjcmlwdHMuCiAgKi8KLSNpZm5kZWYgQ09ORklHX0FSQ0hfSVhEUDJYMDEKKyNpZm5kZWYgQ09ORklHX0lTQV9ETUFfQVBJCiAjZGVmaW5lIEFMTE9XX0RNQQkwCiAjZWxzZQogI2RlZmluZSBBTExPV19ETUEJMQpAQCAtMTcxLDExICsxODAsMTUgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbmV0Y2FyZF9wb3J0bGlzdFtdIF9faW5pdGRhdGEgPQogICAgeyAweDAzMDAsIDB9Owogc3RhdGljIHVuc2lnbmVkIGludCBjczg5MDBfaXJxX21hcFtdID0gezEsMCwwLDB9OworI2VsaWYgZGVmaW5lZChDT05GSUdfTUFDSF9JWERQMjM1MSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmV0Y2FyZF9wb3J0bGlzdFtdIF9faW5pdGRhdGEgPSB7SVhEUDIzNTFfVklSVF9DUzg5MDBfQkFTRSwgMH07CitzdGF0aWMgdW5zaWduZWQgaW50IGNzODkwMF9pcnFfbWFwW10gPSB7SVJRX0lYRFAyMzUxX0NTODkwMCwgMCwgMCwgMH07CisjaW5jbHVkZSA8YXNtL2lycS5oPgogI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9JWERQMlgwMSkKICNpbmNsdWRlIDxhc20vaXJxLmg+CiBzdGF0aWMgdW5zaWduZWQgaW50IG5ldGNhcmRfcG9ydGxpc3RbXSBfX2luaXRkYXRhID0ge0lYRFAyWDAxX0NTODkwMF9WSVJUX0JBU0UsIDB9Owogc3RhdGljIHVuc2lnbmVkIGludCBjczg5MDBfaXJxX21hcFtdID0ge0lSUV9JWERQMlgwMV9DUzg5MDAsIDAsIDAsIDB9OwotI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9QTlgwMTA1KQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9QTlgwMTBYKQogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CiAjZGVmaW5lIENJUlJVU19ERUZBVUxUX0JBU0UJSU9fQUREUkVTUyhFWFRfU1RBVElDMl9zMF9CQVNFICsgMHgyMDAwMDApCS8qID0gUGh5c2ljYWwgYWRkcmVzcyAweDQ4MjAwMDAwICovCkBAIC0zMzgsMzAgKzM1MSw5NiBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQKLXJlYWRyZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBvcnRubykKKyNpZiBkZWZpbmVkKENPTkZJR19NQUNIX0lYRFAyMzUxKQorc3RhdGljIHUxNgorcmVhZHdvcmQodW5zaWduZWQgbG9uZyBiYXNlX2FkZHIsIGludCBwb3J0bm8pCiB7Ci0Jb3V0dyhwb3J0bm8sIGRldi0+YmFzZV9hZGRyICsgQUREX1BPUlQpOwotCXJldHVybiBpbncoZGV2LT5iYXNlX2FkZHIgKyBEQVRBX1BPUlQpOworCXJldHVybiBfX3Jhd19yZWFkdyhiYXNlX2FkZHIgKyAocG9ydG5vIDw8IDEpKTsKIH0KIAogc3RhdGljIHZvaWQKLXdyaXRlcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwb3J0bm8sIGludCB2YWx1ZSkKK3dyaXRld29yZCh1bnNpZ25lZCBsb25nIGJhc2VfYWRkciwgaW50IHBvcnRubywgdTE2IHZhbHVlKQogewotCW91dHcocG9ydG5vLCBkZXYtPmJhc2VfYWRkciArIEFERF9QT1JUKTsKLQlvdXR3KHZhbHVlLCBkZXYtPmJhc2VfYWRkciArIERBVEFfUE9SVCk7CisJX19yYXdfd3JpdGV3KHZhbHVlLCBiYXNlX2FkZHIgKyAocG9ydG5vIDw8IDEpKTsKIH0KLQotc3RhdGljIGludAotcmVhZHdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBvcnRubykKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfSVhEUDJYMDEpCitzdGF0aWMgdTE2CityZWFkd29yZCh1bnNpZ25lZCBsb25nIGJhc2VfYWRkciwgaW50IHBvcnRubykKIHsKLQlyZXR1cm4gaW53KGRldi0+YmFzZV9hZGRyICsgcG9ydG5vKTsKKwlyZXR1cm4gX19yYXdfcmVhZGwoYmFzZV9hZGRyICsgKHBvcnRubyA8PCAxKSk7CiB9CiAKIHN0YXRpYyB2b2lkCi13cml0ZXdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBvcnRubywgaW50IHZhbHVlKQord3JpdGV3b3JkKHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyLCBpbnQgcG9ydG5vLCB1MTYgdmFsdWUpCiB7Ci0Jb3V0dyh2YWx1ZSwgZGV2LT5iYXNlX2FkZHIgKyBwb3J0bm8pOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgYmFzZV9hZGRyICsgKHBvcnRubyA8PCAxKSk7Cit9CisjZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX1BOWDAxMFgpCitzdGF0aWMgdTE2CityZWFkd29yZCh1bnNpZ25lZCBsb25nIGJhc2VfYWRkciwgaW50IHBvcnRubykKK3sKKwlyZXR1cm4gaW53KGJhc2VfYWRkciArIChwb3J0bm8gPDwgMSkpOworfQorCitzdGF0aWMgdm9pZAord3JpdGV3b3JkKHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyLCBpbnQgcG9ydG5vLCB1MTYgdmFsdWUpCit7CisJb3V0dyh2YWx1ZSwgYmFzZV9hZGRyICsgKHBvcnRubyA8PCAxKSk7Cit9CisjZWxzZQorc3RhdGljIHUxNgorcmVhZHdvcmQodW5zaWduZWQgbG9uZyBiYXNlX2FkZHIsIGludCBwb3J0bm8pCit7CisJcmV0dXJuIGludyhiYXNlX2FkZHIgKyBwb3J0bm8pOworfQorCitzdGF0aWMgdm9pZAord3JpdGV3b3JkKHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyLCBpbnQgcG9ydG5vLCB1MTYgdmFsdWUpCit7CisJb3V0dyh2YWx1ZSwgYmFzZV9hZGRyICsgcG9ydG5vKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorcmVhZHdvcmRzKHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyLCBpbnQgcG9ydG5vLCB2b2lkICpidWYsIGludCBsZW5ndGgpCit7CisJdTggKmJ1ZjggPSAodTggKilidWY7CisKKwlkbyB7CisJCXUxNiB0bXAxNjsKKworCQl0bXAxNiA9IHJlYWR3b3JkKGJhc2VfYWRkciwgcG9ydG5vKTsKKwkJKmJ1ZjgrKyA9ICh1OCl0bXAxNjsKKwkJKmJ1ZjgrKyA9ICh1OCkodG1wMTYgPj4gOCk7CisJfSB3aGlsZSAoLS1sZW5ndGgpOworfQorCitzdGF0aWMgdm9pZAord3JpdGV3b3Jkcyh1bnNpZ25lZCBsb25nIGJhc2VfYWRkciwgaW50IHBvcnRubywgdm9pZCAqYnVmLCBpbnQgbGVuZ3RoKQoreworCXU4ICpidWY4ID0gKHU4ICopYnVmOworCisJZG8geworCQl1MTYgdG1wMTY7CisKKwkJdG1wMTYgPSAqYnVmOCsrOworCQl0bXAxNiB8PSAoKmJ1ZjgrKykgPDwgODsKKwkJd3JpdGV3b3JkKGJhc2VfYWRkciwgcG9ydG5vLCB0bXAxNik7CisJfSB3aGlsZSAoLS1sZW5ndGgpOworfQorCitzdGF0aWMgdTE2CityZWFkcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiByZWdubykKK3sKKwl3cml0ZXdvcmQoZGV2LT5iYXNlX2FkZHIsIEFERF9QT1JULCByZWdubyk7CisJcmV0dXJuIHJlYWR3b3JkKGRldi0+YmFzZV9hZGRyLCBEQVRBX1BPUlQpOworfQorCitzdGF0aWMgdm9pZAord3JpdGVyZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHJlZ25vLCB1MTYgdmFsdWUpCit7CisJd3JpdGV3b3JkKGRldi0+YmFzZV9hZGRyLCBBRERfUE9SVCwgcmVnbm8pOworCXdyaXRld29yZChkZXYtPmJhc2VfYWRkciwgREFUQV9QT1JULCB2YWx1ZSk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0CkBAIC00NTYsNyArNTM1LDcgQEAKICNlbmRpZgogICAgICAgICB9CiAKLSNpZmRlZiBDT05GSUdfQVJDSF9QTlgwMTA1CisjaWZkZWYgQ09ORklHX0FSQ0hfUE5YMDEwWAogCWluaXRpYWxpemVfZWJpKCk7CiAKIAkvKiBNYXAgR1BJTyByZWdpc3RlcnMgZm9yIHRoZSBwaW5zIGNvbm5lY3RlZCB0byB0aGUgQ1M4OTAwYS4gKi8KQEAgLTQ5MSw4ICs1NzAsOCBAQAogCiAjaWZkZWYgQ09ORklHX1NIX0hJQ09TSDQKIAkvKiB0cnVlbHkgcmVzZXQgdGhlIGNoaXAgKi8KLQlvdXR3KDB4MDExNCwgaW9hZGRyICsgQUREX1BPUlQpOwotCW91dHcoMHgwMDQwLCBpb2FkZHIgKyBEQVRBX1BPUlQpOworCXdyaXRld29yZChpb2FkZHIsIEFERF9QT1JULCAweDAxMTQpOworCXdyaXRld29yZChpb2FkZHIsIERBVEFfUE9SVCwgMHgwMDQwKTsKICNlbmRpZgogCiAJLyogaWYgdGhleSBnaXZlIHVzIGFuIG9kZCBJL08gYWRkcmVzcywgdGhlbiBkbyBPTkUgd3JpdGUgdG8KQEAgLTUwMywyNCArNTgyLDI0IEBACiAJCWlmIChuZXRfZGVidWcgPiAxKQogCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG9kZCBpb2FkZHIgMHgleFxuIiwgZGV2LT5uYW1lLCBpb2FkZHIpOwogCSAgICAgICAgaWYgKChpb2FkZHIgJiAyKSAhPSAyKQotCSAgICAgICAgCWlmICgoaW53KChpb2FkZHIgJiB+MykrIEFERF9QT1JUKSAmIEFERF9NQVNLKSAhPSBBRERfU0lHKSB7CisJICAgICAgICAJaWYgKChyZWFkd29yZChpb2FkZHIgJiB+MywgQUREX1BPUlQpICYgQUREX01BU0spICE9IEFERF9TSUcpIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBiYWQgc2lnbmF0dXJlIDB4JXhcbiIsCi0JCQkJCWRldi0+bmFtZSwgaW53KChpb2FkZHIgJiB+MykrIEFERF9QT1JUKSk7CisJCQkJCWRldi0+bmFtZSwgcmVhZHdvcmQoaW9hZGRyICYgfjMsIEFERF9QT1JUKSk7CiAJCSAgICAgICAgCXJldHZhbCA9IC1FTk9ERVY7CiAJCQkJZ290byBvdXQyOwogCQkJfQogCX0KLQlwcmludGsoS0VSTl9ERUJVRyAiUFBfYWRkciBhdCAleDogMHgleFxuIiwKLQkJCWlvYWRkciArIEFERF9QT1JULCBpbncoaW9hZGRyICsgQUREX1BPUlQpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiUFBfYWRkciBhdCAleFsleF06IDB4JXhcbiIsCisJCQlpb2FkZHIsIEFERF9QT1JULCByZWFkd29yZChpb2FkZHIsIEFERF9QT1JUKSk7CiAKIAlpb2FkZHIgJj0gfjM7Ci0Jb3V0dyhQUF9DaGlwSUQsIGlvYWRkciArIEFERF9QT1JUKTsKKwl3cml0ZXdvcmQoaW9hZGRyLCBBRERfUE9SVCwgUFBfQ2hpcElEKTsKIAotCXRtcCA9IGludyhpb2FkZHIgKyBEQVRBX1BPUlQpOworCXRtcCA9IHJlYWR3b3JkKGlvYWRkciwgREFUQV9QT1JUKTsKIAlpZiAodG1wICE9IENISVBfRUlTQV9JRF9TSUcpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbmNvcnJlY3Qgc2lnbmF0dXJlIGF0ICV4OiAweCV4IT0iCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaW5jb3JyZWN0IHNpZ25hdHVyZSBhdCAleFsleF06IDB4JXghPSIKIAkJCUNISVBfRUlTQV9JRF9TSUdfU1RSICJcbiIsCi0JCQlkZXYtPm5hbWUsIGlvYWRkciArIERBVEFfUE9SVCwgdG1wKTsKKwkJCWRldi0+bmFtZSwgaW9hZGRyLCBEQVRBX1BPUlQsIHRtcCk7CiAgIAkJcmV0dmFsID0gLUVOT0RFVjsKICAgCQlnb3RvIG91dDI7CiAJfQpAQCAtNzI0LDcgKzgwMyw3IEBACiAJfSBlbHNlIHsKIAkJaSA9IGxwLT5pc2FfY29uZmlnICYgSU5UX05PX01BU0s7CiAJCWlmIChscC0+Y2hpcF90eXBlID09IENTODkwMCkgewotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfSVhEUDJYMDEpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfUE5YMDEwNSkKKyNpZiBkZWZpbmVkKENPTkZJR19NQUNIX0lYRFAyMzUxKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX0lYRFAyWDAxKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX1BOWDAxMFgpCiAJCSAgICAgICAgaSA9IGNzODkwMF9pcnFfbWFwWzBdOwogI2Vsc2UKIAkJCS8qIFRyYW5zbGF0ZSB0aGUgSVJRIHVzaW5nIHRoZSBJUlEgbWFwcGluZyB0YWJsZS4gKi8KQEAgLTc5MCw3ICs4NjksNyBAQAogCQlnb3RvIG91dDM7CiAJcmV0dXJuIDA7CiBvdXQzOgotCW91dHcoUFBfQ2hpcElELCBkZXYtPmJhc2VfYWRkciArIEFERF9QT1JUKTsKKwl3cml0ZXdvcmQoZGV2LT5iYXNlX2FkZHIsIEFERF9QT1JULCBQUF9DaGlwSUQpOwogb3V0MjoKIAlyZWxlYXNlX3JlZ2lvbihpb2FkZHIgJiB+MywgTkVUQ0FSRF9JT19FWFRFTlQpOwogb3V0MToKQEAgLTk1Niw3ICsxMDM1LDcgQEAKIAogdm9pZCAgX19pbml0IHJlc2V0X2NoaXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSNpZm5kZWYgQ09ORklHX0FSQ0hfSVhEUDJYMDEKKyNpZiAhZGVmaW5lZChDT05GSUdfTUFDSF9JWERQMjM1MSkgJiYgIWRlZmluZWQoQ09ORklHX0FSQ0hfSVhEUDJYMDEpCiAJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKICNlbmRpZgpAQCAtOTY3LDE0ICsxMDQ2LDE0IEBACiAJLyogd2FpdCAzMCBtcyAqLwogCW1zbGVlcCgzMCk7CiAKLSNpZm5kZWYgQ09ORklHX0FSQ0hfSVhEUDJYMDEKKyNpZiAhZGVmaW5lZChDT05GSUdfTUFDSF9JWERQMjM1MSkgJiYgIWRlZmluZWQoQ09ORklHX0FSQ0hfSVhEUDJYMDEpCiAJaWYgKGxwLT5jaGlwX3R5cGUgIT0gQ1M4OTAwKSB7CiAJCS8qIEhhcmR3YXJlIHByb2JsZW0gcmVxdWlyZXMgUE5QIHJlZ2lzdGVycyB0byBiZSByZWNvbmZpZ3VyZWQgYWZ0ZXIgYSByZXNldCAqLwotCQlvdXR3KFBQX0NTODkyMF9JU0FJTlQsIGlvYWRkciArIEFERF9QT1JUKTsKKwkJd3JpdGV3b3JkKGlvYWRkciwgQUREX1BPUlQsIFBQX0NTODkyMF9JU0FJTlQpOwogCQlvdXRiKGRldi0+aXJxLCBpb2FkZHIgKyBEQVRBX1BPUlQpOwogCQlvdXRiKDAsICAgICAgaW9hZGRyICsgREFUQV9QT1JUICsgMSk7CiAKLQkJb3V0dyhQUF9DUzg5MjBfSVNBTWVtQiwgaW9hZGRyICsgQUREX1BPUlQpOworCQl3cml0ZXdvcmQoaW9hZGRyLCBBRERfUE9SVCwgUFBfQ1M4OTIwX0lTQU1lbUIpOwogCQlvdXRiKChkZXYtPm1lbV9zdGFydCA+PiAxNikgJiAweGZmLCBpb2FkZHIgKyBEQVRBX1BPUlQpOwogCQlvdXRiKChkZXYtPm1lbV9zdGFydCA+PiA4KSAmIDB4ZmYsICAgaW9hZGRyICsgREFUQV9QT1JUICsgMSk7CiAJfQpAQCAtMTEwNCw4ICsxMTgzLDggQEAKIAltZW1jcHkodGVzdF9wYWNrZXQsICAgICAgICAgIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKIAltZW1jcHkodGVzdF9wYWNrZXQrRVRIX0FMRU4sIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKIAotICAgICAgICB3cml0ZXdvcmQoZGV2LCBUWF9DTURfUE9SVCwgVFhfQUZURVJfQUxMKTsKLSAgICAgICAgd3JpdGV3b3JkKGRldiwgVFhfTEVOX1BPUlQsIEVUSF9aTEVOKTsKKyAgICAgICAgd3JpdGV3b3JkKGRldi0+YmFzZV9hZGRyLCBUWF9DTURfUE9SVCwgVFhfQUZURVJfQUxMKTsKKyAgICAgICAgd3JpdGV3b3JkKGRldi0+YmFzZV9hZGRyLCBUWF9MRU5fUE9SVCwgRVRIX1pMRU4pOwogCiAJLyogVGVzdCB0byBzZWUgaWYgdGhlIGNoaXAgaGFzIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHRoZSBwYWNrZXQgKi8KIAl3aGlsZSAoamlmZmllcyAtIHRpbWVub3cgPCA1KQpAQCAtMTExNSw3ICsxMTk0LDcgQEAKIAkJcmV0dXJuIDA7CS8qIHRoaXMgc2hvdWxkbid0IGhhcHBlbiAqLwogCiAJLyogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBwYWNrZXQgKi8KLQlvdXRzdyhkZXYtPmJhc2VfYWRkciArIFRYX0ZSQU1FX1BPUlQsdGVzdF9wYWNrZXQsKEVUSF9aTEVOKzEpID4+MSk7CisJd3JpdGV3b3JkcyhkZXYtPmJhc2VfYWRkciwgVFhfRlJBTUVfUE9SVCx0ZXN0X3BhY2tldCwoRVRIX1pMRU4rMSkgPj4xKTsKIAogCWlmIChuZXRfZGVidWcgPiAxKSBwcmludGsoIlNlbmRpbmcgdGVzdCBwYWNrZXQgIik7CiAJLyogd2FpdCBhIGNvdXBsZSBvZiBqaWZmaWVzIGZvciBwYWNrZXQgdG8gYmUgcmVjZWl2ZWQgKi8KQEAgLTEyMDAsNyArMTI3OSw3IEBACiAJaW50IGk7CiAJaW50IHJldDsKIAotI2lmICFkZWZpbmVkKENPTkZJR19TSF9ISUNPU0g0KSAmJiAhZGVmaW5lZChDT05GSUdfQVJDSF9QTlgwMTA1KSAvKiB1c2VzIGlycSMxLCBzbyB0aGlzIHdvbid0IHdvcmsgKi8KKyNpZiAhZGVmaW5lZChDT05GSUdfU0hfSElDT1NINCkgJiYgIWRlZmluZWQoQ09ORklHX0FSQ0hfUE5YMDEwWCkgLyogdXNlcyBpcnEjMSwgc28gdGhpcyB3b24ndCB3b3JrICovCiAJaWYgKGRldi0+aXJxIDwgMikgewogCQkvKiBBbGxvdyBpbnRlcnJ1cHRzIHRvIGJlIGdlbmVyYXRlZCBieSB0aGUgY2hpcCAqLwogLyogQ2lycnVzJyByZWxlYXNlIGhhZCB0aGlzOiAqLwpAQCAtMTIzMSw3ICsxMzEwLDcgQEAKIAllbHNlCiAjZW5kaWYKIAl7Ci0jaWYgIWRlZmluZWQoQ09ORklHX0FSQ0hfSVhEUDJYMDEpICYmICFkZWZpbmVkKENPTkZJR19BUkNIX1BOWDAxMDUpCisjaWYgIWRlZmluZWQoQ09ORklHX01BQ0hfSVhEUDIzNTEpICYmICFkZWZpbmVkKENPTkZJR19BUkNIX0lYRFAyWDAxKSAmJiAhZGVmaW5lZChDT05GSUdfQVJDSF9QTlgwMTBYKQogCQlpZiAoKCgxIDw8IGRldi0+aXJxKSAmIGxwLT5pcnFfbWFwKSA9PSAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJUlEgJWQgaXMgbm90IGluIG91ciBtYXAgb2YgYWxsb3dhYmxlIElSUXMsIHdoaWNoIGlzICV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgZGV2LT5pcnEsIGxwLT5pcnFfbWFwKTsKQEAgLTEzMTYsNyArMTM5NSw3IEBACiAJY2FzZSBBX0NORl9NRURJQV8xMEJfMjogcmVzdWx0ID0gbHAtPmFkYXB0ZXJfY25mICYgQV9DTkZfMTBCXzI7IGJyZWFrOwogICAgICAgICBkZWZhdWx0OiByZXN1bHQgPSBscC0+YWRhcHRlcl9jbmYgJiAoQV9DTkZfMTBCX1QgfCBBX0NORl9BVUkgfCBBX0NORl8xMEJfMik7CiAgICAgICAgIH0KLSNpZmRlZiBDT05GSUdfQVJDSF9QTlgwMTA1CisjaWZkZWYgQ09ORklHX0FSQ0hfUE5YMDEwWAogCXJlc3VsdCA9IEFfQ05GXzEwQl9UOwogI2VuZGlmCiAgICAgICAgIGlmICghcmVzdWx0KSB7CkBAIC0xNDU3LDggKzE1MzYsOCBAQAogCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAogCS8qIGluaXRpYXRlIGEgdHJhbnNtaXQgc2VxdWVuY2UgKi8KLQl3cml0ZXdvcmQoZGV2LCBUWF9DTURfUE9SVCwgbHAtPnNlbmRfY21kKTsKLQl3cml0ZXdvcmQoZGV2LCBUWF9MRU5fUE9SVCwgc2tiLT5sZW4pOworCXdyaXRld29yZChkZXYtPmJhc2VfYWRkciwgVFhfQ01EX1BPUlQsIGxwLT5zZW5kX2NtZCk7CisJd3JpdGV3b3JkKGRldi0+YmFzZV9hZGRyLCBUWF9MRU5fUE9SVCwgc2tiLT5sZW4pOwogCiAJLyogVGVzdCB0byBzZWUgaWYgdGhlIGNoaXAgaGFzIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHRoZSBwYWNrZXQgKi8KIAlpZiAoKHJlYWRyZWcoZGV2LCBQUF9CdXNTVCkgJiBSRUFEWV9GT1JfVFhfTk9XKSA9PSAwKSB7CkBAIC0xNDcyLDcgKzE1NTEsNyBAQAogCQlyZXR1cm4gMTsKIAl9CiAJLyogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBwYWNrZXQgKi8KLQlvdXRzdyhkZXYtPmJhc2VfYWRkciArIFRYX0ZSQU1FX1BPUlQsc2tiLT5kYXRhLChza2ItPmxlbisxKSA+PjEpOworCXdyaXRld29yZHMoZGV2LT5iYXNlX2FkZHIsIFRYX0ZSQU1FX1BPUlQsc2tiLT5kYXRhLChza2ItPmxlbisxKSA+PjEpOwogCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOwogCWxwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKQEAgLTE1MTIsNyArMTU5MSw3IEBACiAgICAgICAgICAgIGNvdXJzZSwgaWYgeW91J3JlIG9uIGEgc2xvdyBtYWNoaW5lLCBhbmQgcGFja2V0cyBhcmUgYXJyaXZpbmcKICAgICAgICAgICAgZmFzdGVyIHRoYW4geW91IGNhbiByZWFkIHRoZW0gb2ZmLCB5b3UncmUgc2NyZXdlZC4gIEhhc3RhIGxhCiAgICAgICAgICAgIHZpc3RhLCBiYWJ5ISAgKi8KLQl3aGlsZSAoKHN0YXR1cyA9IHJlYWR3b3JkKGRldiwgSVNRX1BPUlQpKSkgeworCXdoaWxlICgoc3RhdHVzID0gcmVhZHdvcmQoZGV2LT5iYXNlX2FkZHIsIElTUV9QT1JUKSkpIHsKIAkJaWYgKG5ldF9kZWJ1ZyA+IDQpcHJpbnRrKCIlczogZXZlbnQ9JTA0eFxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpOwogCQloYW5kbGVkID0gMTsKIAkJc3dpdGNoKHN0YXR1cyAmIElTUV9FVkVOVF9NQVNLKSB7CkBAIC0xNjA2LDggKzE2ODUsOCBAQAogCWludCBzdGF0dXMsIGxlbmd0aDsKIAogCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKLQlzdGF0dXMgPSBpbncoaW9hZGRyICsgUlhfRlJBTUVfUE9SVCk7Ci0JbGVuZ3RoID0gaW53KGlvYWRkciArIFJYX0ZSQU1FX1BPUlQpOworCXN0YXR1cyA9IHJlYWR3b3JkKGlvYWRkciwgUlhfRlJBTUVfUE9SVCk7CisJbGVuZ3RoID0gcmVhZHdvcmQoaW9hZGRyLCBSWF9GUkFNRV9QT1JUKTsKIAogCWlmICgoc3RhdHVzICYgUlhfT0spID09IDApIHsKIAkJY291bnRfcnhfZXJyb3JzKHN0YXR1cywgbHApOwpAQCAtMTYyNiw5ICsxNzA1LDkgQEAKIAlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBsb25nd29yZCBhbGlnbiBMMyBoZWFkZXIgKi8KIAlza2ItPmRldiA9IGRldjsKIAotCWluc3coaW9hZGRyICsgUlhfRlJBTUVfUE9SVCwgc2tiX3B1dChza2IsIGxlbmd0aCksIGxlbmd0aCA+PiAxKTsKKwlyZWFkd29yZHMoaW9hZGRyLCBSWF9GUkFNRV9QT1JULCBza2JfcHV0KHNrYiwgbGVuZ3RoKSwgbGVuZ3RoID4+IDEpOwogCWlmIChsZW5ndGggJiAxKQotCQlza2ItPmRhdGFbbGVuZ3RoLTFdID0gaW53KGlvYWRkciArIFJYX0ZSQU1FX1BPUlQpOworCQlza2ItPmRhdGFbbGVuZ3RoLTFdID0gcmVhZHdvcmQoaW9hZGRyLCBSWF9GUkFNRV9QT1JUKTsKIAogCWlmIChuZXRfZGVidWcgPiAzKSB7CiAJCXByaW50aygJIiVzOiByZWNlaXZlZCAlZCBieXRlIHBhY2tldCBvZiB0eXBlICV4XG4iLApAQCAtMTkwMSw3ICsxOTgwLDcgQEAKIGNsZWFudXBfbW9kdWxlKHZvaWQpCiB7CiAJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2X2NzODl4MCk7Ci0Jb3V0dyhQUF9DaGlwSUQsIGRldl9jczg5eDAtPmJhc2VfYWRkciArIEFERF9QT1JUKTsKKwl3cml0ZXdvcmQoZGV2X2NzODl4MC0+YmFzZV9hZGRyLCBBRERfUE9SVCwgUFBfQ2hpcElEKTsKIAlyZWxlYXNlX3JlZ2lvbihkZXZfY3M4OXgwLT5iYXNlX2FkZHIsIE5FVENBUkRfSU9fRVhURU5UKTsKIAlmcmVlX25ldGRldihkZXZfY3M4OXgwKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NzODl4MC5oIGIvZHJpdmVycy9uZXQvY3M4OXgwLmgKaW5kZXggZGVjZWEyNi4uYmQ5NTRhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3M4OXgwLmgKKysrIGIvZHJpdmVycy9uZXQvY3M4OXgwLmgKQEAgLTE2LDEzICsxNiw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfSVhEUDJYMDEpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfUE5YMDEwNSkKLS8qIElYRFAyNDAxL0lYRFAyODAxIHVzZXMgZHdvcmQtYWxpZ25lZCByZWdpc3RlciBhZGRyZXNzaW5nICovCi0jZGVmaW5lIENTODl4MF9QT1JUKHJlZykgKChyZWcpICogMikKLSNlbHNlCi0jZGVmaW5lIENTODl4MF9QT1JUKHJlZykgKHJlZykKLSNlbmRpZgotCiAjZGVmaW5lIFBQX0NoaXBJRCAweDAwMDAJLyogb2Zmc2V0ICAgMGggLT4gQ29ycCAtSUQgICAgICAgICAgICAgICovCiAJCQkJLyogb2Zmc2V0ICAgMmggLT4gTW9kZWwvUHJvZHVjdCBOdW1iZXIgICovCiAJCQkJLyogb2Zmc2V0ICAgM2ggLT4gQ2hpcCBSZXZpc2lvbiBOdW1iZXIgICovCkBAIC0zMzIsMTYgKzMyNSwxNiBAQAogI2RlZmluZSBSQU1fU0laRQkweDEwMDAgICAgICAgLyogIFRoZSBjYXJkIGhhcyA0ayBieXRlcyBvciBSQU0gKi8KICNkZWZpbmUgUEtUX1NUQVJUIFBQX1R4RnJhbWUgIC8qICBTdGFydCBvZiBwYWNrZXQgUkFNICovCiAKLSNkZWZpbmUgUlhfRlJBTUVfUE9SVAlDUzg5eDBfUE9SVCgweDAwMDApCisjZGVmaW5lIFJYX0ZSQU1FX1BPUlQJMHgwMDAwCiAjZGVmaW5lIFRYX0ZSQU1FX1BPUlQgUlhfRlJBTUVfUE9SVAotI2RlZmluZSBUWF9DTURfUE9SVAlDUzg5eDBfUE9SVCgweDAwMDQpCisjZGVmaW5lIFRYX0NNRF9QT1JUCTB4MDAwNAogI2RlZmluZSBUWF9OT1cJCTB4MDAwMCAgICAgICAvKiAgVHggcGFja2V0IGFmdGVyICAgNSBieXRlcyBjb3BpZWQgKi8KICNkZWZpbmUgVFhfQUZURVJfMzgxCTB4MDA0MCAgICAgICAvKiAgVHggcGFja2V0IGFmdGVyIDM4MSBieXRlcyBjb3BpZWQgKi8KICNkZWZpbmUgVFhfQUZURVJfQUxMCTB4MDBjMCAgICAgICAvKiAgVHggcGFja2V0IGFmdGVyIGFsbCBieXRlcyBjb3BpZWQgKi8KLSNkZWZpbmUgVFhfTEVOX1BPUlQJQ1M4OXgwX1BPUlQoMHgwMDA2KQotI2RlZmluZSBJU1FfUE9SVAlDUzg5eDBfUE9SVCgweDAwMDgpCi0jZGVmaW5lIEFERF9QT1JUCUNTODl4MF9QT1JUKDB4MDAwQSkKLSNkZWZpbmUgREFUQV9QT1JUCUNTODl4MF9QT1JUKDB4MDAwQykKKyNkZWZpbmUgVFhfTEVOX1BPUlQJMHgwMDA2CisjZGVmaW5lIElTUV9QT1JUCTB4MDAwOAorI2RlZmluZSBBRERfUE9SVAkweDAwMEEKKyNkZWZpbmUgREFUQV9QT1JUCTB4MDAwQwogCiAjZGVmaW5lIEVFUFJPTV9XUklURV9FTgkJMHgwMEYwCiAjZGVmaW5lIEVFUFJPTV9XUklURV9ESVMJMHgwMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwLmMgYi9kcml2ZXJzL25ldC9lMTAwLmMKaW5kZXggMjJjZDA0NS4uYmYxZmQyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAuYwpAQCAtMSwyNSArMSwyNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAKKwogICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gIAotICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCAKLSAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgCi0gIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgCisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogICBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgCi0gIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCAKLSAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIAotICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIAorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogICBtb3JlIGRldGFpbHMuCi0gIAorCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKICAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0gIAorCiAgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQogICBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICAKKwogICBDb250YWN0IEluZm9ybWF0aW9uOgogICBMaW51eCBOSUNTIDxsaW51eC5uaWNzQGludGVsLmNvbT4KICAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwpAQCAtMTMyLDYgKzEzMiwxMCBAQAogICogCVRPRE86CiAgKiAJbyBzZXZlcmFsIGVudHJ5IHBvaW50cyByYWNlIHdpdGggZGV2LT5jbG9zZQogICogCW8gY2hlY2sgZm9yIHR4LW5vLXJlc291cmNlcy9zdG9wIFEgcmFjZXMgd2l0aCB0eCBjbGVhbi93YWtlIFEKKyAqCisgKglGSVhFUzoKKyAqIDIwMDUvMTIvMDIgLSBNaWNoYWVsIE8nRG9ubmVsbCA8TWljaGFlbC5PRG9ubmVsbCBhdCBzdHJhdHVzIGRvdCBjb20+CisgKgktIFN0cmF0dXM4NzI0NzogcHJvdGVjdCBNREkgY29udHJvbCByZWdpc3RlciBtYW5pcHVsYXRpb25zCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgpAQCAtMTU2LDcgKzE2MCw3IEBACiAKICNkZWZpbmUgRFJWX05BTUUJCSJlMTAwIgogI2RlZmluZSBEUlZfRVhUCQkiLU5BUEkiCi0jZGVmaW5lIERSVl9WRVJTSU9OCQkiMy40LjE0LWs0IkRSVl9FWFQKKyNkZWZpbmUgRFJWX1ZFUlNJT04JCSIzLjUuMTAtazIiRFJWX0VYVAogI2RlZmluZSBEUlZfREVTQ1JJUFRJT04JCSJJbnRlbChSKSBQUk8vMTAwIE5ldHdvcmsgRHJpdmVyIgogI2RlZmluZSBEUlZfQ09QWVJJR0hUCQkiQ29weXJpZ2h0KGMpIDE5OTktMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbiIKICNkZWZpbmUgUEZYCQkJRFJWX05BTUUgIjogIgpAQCAtMzE2LDcgKzMyMCw3IEBACiAJY3VjX2R1bXBfY29tcGxldGUgICAgICAgPSAweDAwMDBBMDA1LAogCWN1Y19kdW1wX3Jlc2V0X2NvbXBsZXRlID0gMHgwMDAwQTAwNywKIH07Ci0JCQorCiBlbnVtIHBvcnQgewogCXNvZnR3YXJlX3Jlc2V0ICA9IDB4MDAwMCwKIAlzZWxmdGVzdCAgICAgICAgPSAweDAwMDEsCkBAIC01NzgsNiArNTgyLDcgQEAKIAl1MTYgbGVkczsKIAl1MTYgZWVwcm9tX3djOwogCXUxNiBlZXByb21bMjU2XTsKKwlzcGlubG9ja190IG1kaW9fbG9jazsKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlMTAwX3dyaXRlX2ZsdXNoKHN0cnVjdCBuaWMgKm5pYykKQEAgLTU4Nyw3ICs1OTIsNyBAQAogCSh2b2lkKXJlYWRiKCZuaWMtPmNzci0+c2NiLnN0YXR1cyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBlMTAwX2VuYWJsZV9pcnEoc3RydWN0IG5pYyAqbmljKQorc3RhdGljIHZvaWQgZTEwMF9lbmFibGVfaXJxKHN0cnVjdCBuaWMgKm5pYykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC01OTcsNyArNjAyLDcgQEAKIAllMTAwX3dyaXRlX2ZsdXNoKG5pYyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBlMTAwX2Rpc2FibGVfaXJxKHN0cnVjdCBuaWMgKm5pYykKK3N0YXRpYyB2b2lkIGUxMDBfZGlzYWJsZV9pcnEoc3RydWN0IG5pYyAqbmljKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTcxMCwxMCArNzE1LDEwIEBACiAJCWN0cmwgPSAoY21kX2FkZHJfZGF0YSAmICgxIDw8IGkpKSA/IGVlY3MgfCBlZWRpIDogZWVjczsKIAkJd3JpdGViKGN0cmwsICZuaWMtPmNzci0+ZWVwcm9tX2N0cmxfbG8pOwogCQllMTAwX3dyaXRlX2ZsdXNoKG5pYyk7IHVkZWxheSg0KTsKLQkJCisKIAkJd3JpdGViKGN0cmwgfCBlZXNrLCAmbmljLT5jc3ItPmVlcHJvbV9jdHJsX2xvKTsKIAkJZTEwMF93cml0ZV9mbHVzaChuaWMpOyB1ZGVsYXkoNCk7Ci0JCQorCiAJCS8qIEVlcHJvbSBkcml2ZXMgYSBkdW1teSB6ZXJvIHRvIEVFRE8gYWZ0ZXIgcmVjZWl2aW5nCiAJCSAqIGNvbXBsZXRlIGFkZHJlc3MuICBVc2UgdGhpcyB0byBhZGp1c3QgYWRkcl9sZW4uICovCiAJCWN0cmwgPSByZWFkYigmbmljLT5jc3ItPmVlcHJvbV9jdHJsX2xvKTsKQEAgLTcyMSw3ICs3MjYsNyBAQAogCQkJKmFkZHJfbGVuIC09IChpIC0gMTYpOwogCQkJaSA9IDE3OwogCQl9Ci0JCQorCiAJCWRhdGEgPSAoZGF0YSA8PCAxKSB8IChjdHJsICYgZWVkbyA/IDEgOiAwKTsKIAl9CiAKQEAgLTc4Niw3ICs3OTEsNyBAQAogCiAjZGVmaW5lIEUxMDBfV0FJVF9TQ0JfVElNRU9VVCAyMDAwMCAvKiB3ZSBtaWdodCBoYXZlIHRvIHdhaXQgMTAwbXMhISEgKi8KICNkZWZpbmUgRTEwMF9XQUlUX1NDQl9GQVNUIDIwICAgICAgIC8qIGRlbGF5IGxpa2UgdGhlIG9sZCBjb2RlICovCi1zdGF0aWMgaW5saW5lIGludCBlMTAwX2V4ZWNfY21kKHN0cnVjdCBuaWMgKm5pYywgdTggY21kLCBkbWFfYWRkcl90IGRtYV9hZGRyKQorc3RhdGljIGludCBlMTAwX2V4ZWNfY21kKHN0cnVjdCBuaWMgKm5pYywgdTggY21kLCBkbWFfYWRkcl90IGRtYV9hZGRyKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGk7CkBAIC04MTcsNyArODIyLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBlMTAwX2V4ZWNfY2Ioc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorc3RhdGljIGludCBlMTAwX2V4ZWNfY2Ioc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCXZvaWQgKCpjYl9wcmVwYXJlKShzdHJ1Y3QgbmljICosIHN0cnVjdCBjYiAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKSkKIHsKIAlzdHJ1Y3QgY2IgKmNiOwpAQCAtODc2LDE1ICs4ODEsMzUgQEAKIHsKIAl1MzIgZGF0YV9vdXQgPSAwOwogCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKworCS8qCisJICogU3RyYXR1czg3MjQ3OiB3ZSBzaG91bGRuJ3QgYmUgd3JpdGluZyB0aGUgTURJIGNvbnRyb2wKKwkgKiByZWdpc3RlciB1bnRpbCB0aGUgUmVhZHkgYml0IHNob3dzIFRydWUuICBBbHNvLCBzaW5jZQorCSAqIG1hbmlwdWxhdGlvbiBvZiB0aGUgTURJIGNvbnRyb2wgcmVnaXN0ZXJzIGlzIGEgbXVsdGktc3RlcAorCSAqIHByb2NlZHVyZSBpdCBzaG91bGQgYmUgZG9uZSB1bmRlciBsb2NrLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZuaWMtPm1kaW9fbG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDEwMDsgaTsgLS1pKSB7CisJCWlmIChyZWFkbCgmbmljLT5jc3ItPm1kaV9jdHJsKSAmIG1kaV9yZWFkeSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMjApOworCX0KKwlpZiAodW5saWtlbHkoIWkpKSB7CisJCXByaW50aygiZTEwMC5tZGlvX2N0cmwoJXMpIHdvbid0IGdvIFJlYWR5XG4iLAorCQkJbmljLT5uZXRkZXYtPm5hbWUgKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmljLT5tZGlvX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CQkvKiBObyB3YXkgdG8gaW5kaWNhdGUgdGltZW91dCBlcnJvciAqLworCX0KIAl3cml0ZWwoKHJlZyA8PCAxNikgfCAoYWRkciA8PCAyMSkgfCBkaXIgfCBkYXRhLCAmbmljLT5jc3ItPm1kaV9jdHJsKTsKIAotCWZvcihpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CiAJCXVkZWxheSgyMCk7Ci0JCWlmKChkYXRhX291dCA9IHJlYWRsKCZuaWMtPmNzci0+bWRpX2N0cmwpKSAmIG1kaV9yZWFkeSkKKwkJaWYgKChkYXRhX291dCA9IHJlYWRsKCZuaWMtPmNzci0+bWRpX2N0cmwpKSAmIG1kaV9yZWFkeSkKIAkJCWJyZWFrOwogCX0KLQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5pYy0+bWRpb19sb2NrLCBmbGFncyk7CiAJRFBSSU5USyhIVywgREVCVUcsCiAJCSIlczphZGRyPSVkLCByZWc9JWQsIGRhdGFfaW49MHglMDRYLCBkYXRhX291dD0weCUwNFhcbiIsCiAJCWRpciA9PSBtZGlfcmVhZCA/ICJSRUFEIiA6ICJXUklURSIsIGFkZHIsIHJlZywgZGF0YSwgZGF0YV9vdXQpOwpAQCAtMTE0NSw3ICsxMTcwLDcgQEAKIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKIH0KIAotc3RhdGljIHZvaWQgZTEwMF9sb2FkX3Vjb2RlKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IGNiICpjYiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyB2b2lkIGUxMDBfc2V0dXBfdWNvZGUoc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgY2IgKmNiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogLyogKklOREVOVC1PRkYqICovCiAJc3RhdGljIHN0cnVjdCB7CkBAIC0xMTg4LDEzICsxMjEzLDEzIEBACiAqICBkcml2ZXIgY2FuIGNoYW5nZSB0aGUgYWxnb3JpdGhtLgogKgogKiAgSU5UREVMQVkgLSBUaGlzIGxvYWRzIHRoZSBkZWFkLW1hbiB0aW1lciB3aXRoIGl0cyBpbml0YWwgdmFsdWUuCi0qICAgIFdoZW4gdGhpcyB0aW1lciBleHBpcmVzIHRoZSBpbnRlcnJ1cHQgaXMgYXNzZXJ0ZWQsIGFuZCB0aGUgCisqICAgIFdoZW4gdGhpcyB0aW1lciBleHBpcmVzIHRoZSBpbnRlcnJ1cHQgaXMgYXNzZXJ0ZWQsIGFuZCB0aGUKICogICAgdGltZXIgaXMgcmVzZXQgZWFjaCB0aW1lIGEgbmV3IHBhY2tldCBpcyByZWNlaXZlZC4gIChzZWUKICogICAgQlVORExFTUFYIGJlbG93IHRvIHNldCB0aGUgbGltaXQgb24gbnVtYmVyIG9mIGNoYWluZWQgcGFja2V0cykKICogICAgVGhlIGN1cnJlbnQgZGVmYXVsdCBpcyAweDYwMCBvciAxNTM2LiAgRXhwZXJpbWVudHMgc2hvdyB0aGF0CiAqICAgIHRoZSB2YWx1ZSBzaG91bGQgcHJvYmFibHkgc3RheSB3aXRoaW4gdGhlIDB4MjAwIC0gMHgxMDAwLgogKgotKiAgQlVORExFTUFYIC0gCisqICBCVU5ETEVNQVggLQogKiAgICBUaGlzIHNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZyYW1lcyB0aGF0IHdpbGwgYmUgYnVuZGxlZC4gIEluCiAqICAgIHNvbWUgc2l0dWF0aW9ucywgc3VjaCBhcyB0aGUgVENQIHdpbmRvd2luZyBhbGdvcml0aG0sIGl0IG1heSBiZQogKiAgICBiZXR0ZXIgdG8gbGltaXQgdGhlIGdyb3d0aCBvZiB0aGUgYnVuZGxlIHNpemUgdGhhbiBsZXQgaXQgZ28gYXMKQEAgLTEyMDQsNyArMTIyOSw3IEBACiAqICAgIGFuIGludGVycnVwdCBmb3IgZXZlcnkgZnJhbWUgcmVjZWl2ZWQuICBJZiB5b3UgZG8gbm90IHdhbnQgdG8gcHV0CiAqICAgIGEgbGltaXQgb24gdGhlIGJ1bmRsZSBzaXplLCBzZXQgdGhpcyB2YWx1ZSB0byB4RkZGRi4KICoKLSogIEJVTkRMRVNNQUxMIC0gCisqICBCVU5ETEVTTUFMTCAtCiAqICAgIFRoaXMgY29udGFpbnMgYSBiaXQtbWFzayBkZXNjcmliaW5nIHRoZSBtaW5pbXVtIHNpemUgZnJhbWUgdGhhdAogKiAgICB3aWxsIGJlIGJ1bmRsZWQuICBUaGUgZGVmYXVsdCBtYXNrcyB0aGUgbG93ZXIgNyBiaXRzLCB3aGljaCBtZWFucwogKiAgICB0aGF0IGFueSBmcmFtZSBsZXNzIHRoYW4gMTI4IGJ5dGVzIGluIGxlbmd0aCB3aWxsIG5vdCBiZSBidW5kbGVkLApAQCAtMTIxOSw3ICsxMjQ0LDcgQEAKICoKICogICAgVGhlIGN1cnJlbnQgZGVmYXVsdCBpcyAweEZGODAsIHdoaWNoIG1hc2tzIG91dCB0aGUgbG93ZXIgNyBiaXRzLgogKiAgICBUaGlzIG1lYW5zIHRoYXQgYW55IGZyYW1lIHdoaWNoIGlzIHg3RiAoMTI3KSBieXRlcyBvciBzbWFsbGVyCi0qICAgIHdpbGwgY2F1c2UgYW4gaW1tZWRpYXRlIGludGVycnVwdC4gIEJlY2F1c2UgdGhpcyB2YWx1ZSBtdXN0IGJlIGEgCisqICAgIHdpbGwgY2F1c2UgYW4gaW1tZWRpYXRlIGludGVycnVwdC4gIEJlY2F1c2UgdGhpcyB2YWx1ZSBtdXN0IGJlIGEKICogICAgYml0IG1hc2ssIHRoZXJlIGFyZSBvbmx5IGEgZmV3IHZhbGlkIHZhbHVlcyB0aGF0IGNhbiBiZSB1c2VkLiAgVG8KICogICAgdHVybiB0aGlzIGZlYXR1cmUgb2ZmLCB0aGUgZHJpdmVyIGNhbiB3cml0ZSB0aGUgdmFsdWUgeEZGRkYgdG8gdGhlCiAqICAgIGxvd2VyIHdvcmQgb2YgdGhpcyBpbnN0cnVjdGlvbiAoaW4gdGhlIHNhbWUgd2F5IHRoYXQgdGhlIG90aGVyCkBAIC0xMjI4LDcgKzEyNTMsNyBAQAogKiAgICBzdGFuZGFyZCBFdGhlcm5ldCBmcmFtZXMgYXJlIDw9IDIwNDcgYnl0ZXMgaW4gbGVuZ3RoLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyogaWYgeW91IHdpc2ggdG8gZGlzYWJsZSB0aGUgdWNvZGUgZnVuY3Rpb25hbGl0eSwgd2hpbGUgbWFpbnRhaW5pbmcgdGhlIAorLyogaWYgeW91IHdpc2ggdG8gZGlzYWJsZSB0aGUgdWNvZGUgZnVuY3Rpb25hbGl0eSwgd2hpbGUgbWFpbnRhaW5pbmcgdGhlCiAgKiB3b3JrYXJvdW5kcyBpdCBwcm92aWRlcywgc2V0IHRoZSBmb2xsb3dpbmcgZGVmaW5lcyB0bzoKICAqIEJVTkRMRVNNQUxMIDAKICAqIEJVTkRMRU1BWCAxCkBAIC0xMjU5LDEyICsxMjg0LDQ2IEBACiAKIAkJZm9yIChpID0gMDsgaSA8IFVDT0RFX1NJWkU7IGkrKykKIAkJCWNiLT51LnVjb2RlW2ldID0gY3B1X3RvX2xlMzIodWNvZGVbaV0pOwotCQljYi0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNiX3Vjb2RlKTsKKwkJY2ItPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjYl91Y29kZSB8IGNiX2VsKTsKIAkJcmV0dXJuOwogCX0KIAogbm9sb2FkdWNvZGU6Ci0JY2ItPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjYl9ub3ApOworCWNiLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY2Jfbm9wIHwgY2JfZWwpOworfQorCitzdGF0aWMgaW5saW5lIGludCBlMTAwX2V4ZWNfY2Jfd2FpdChzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBza19idWZmICpza2IsCisJdm9pZCAoKmNiX3ByZXBhcmUpKHN0cnVjdCBuaWMgKiwgc3RydWN0IGNiICosIHN0cnVjdCBza19idWZmICopKQoreworCWludCBlcnIgPSAwLCBjb3VudGVyID0gNTA7CisJc3RydWN0IGNiICpjYiA9IG5pYy0+Y2JfdG9fY2xlYW47CisKKwlpZiAoKGVyciA9IGUxMDBfZXhlY19jYihuaWMsIE5VTEwsIGUxMDBfc2V0dXBfdWNvZGUpKSkKKwkJRFBSSU5USyhQUk9CRSxFUlIsICJ1Y29kZSBjbWQgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIGVycik7CisKKwkvKiBtdXN0IHJlc3RhcnQgY3VjICovCisJbmljLT5jdWNfY21kID0gY3VjX3N0YXJ0OworCisJLyogd2FpdCBmb3IgY29tcGxldGlvbiAqLworCWUxMDBfd3JpdGVfZmx1c2gobmljKTsKKwl1ZGVsYXkoMTApOworCisJLyogd2FpdCBmb3IgcG9zc2libHkgKG91Y2gpIDUwMG1zICovCisJd2hpbGUgKCEoY2ItPnN0YXR1cyAmIGNwdV90b19sZTE2KGNiX2NvbXBsZXRlKSkpIHsKKwkJbXNsZWVwKDEwKTsKKwkJaWYgKCEtLWNvdW50ZXIpIGJyZWFrOworCX0KKworCS8qIGFjayBhbnkgaW50ZXJ1cHRzLCBzb21ldGhpbmcgY291bGQgaGF2ZSBiZWVuIHNldCAqLworCXdyaXRlYih+MCwgJm5pYy0+Y3NyLT5zY2Iuc3RhdF9hY2spOworCisJLyogaWYgdGhlIGNvbW1hbmQgZmFpbGVkLCBvciBpcyBub3QgT0ssIG5vdGlmeSBhbmQgcmV0dXJuICovCisJaWYgKCFjb3VudGVyIHx8ICEoY2ItPnN0YXR1cyAmIGNwdV90b19sZTE2KGNiX29rKSkpIHsKKwkJRFBSSU5USyhQUk9CRSxFUlIsICJ1Y29kZSBsb2FkIGZhaWxlZFxuIik7CisJCWVyciA9IC1FUEVSTTsKKwl9CisKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBlMTAwX3NldHVwX2lhYWRkcihzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBjYiAqY2IsCkBAIC0xMzMyLDEzICsxMzkxLDEzIEBACiAJCW1kaW9fd3JpdGUobmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIE1JSV9OU0NfQ09ORywgY29uZyk7CiAJfQogCi0JaWYoKG5pYy0+bWFjID49IG1hY184MjU1MF9EMTAyKSB8fCAoKG5pYy0+ZmxhZ3MgJiBpY2gpICYmIAorCWlmKChuaWMtPm1hYyA+PSBtYWNfODI1NTBfRDEwMikgfHwgKChuaWMtPmZsYWdzICYgaWNoKSAmJgogCSAgIChtZGlvX3JlYWQobmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIE1JSV9UUElTVEFUVVMpICYgMHg4MDAwKSkpIHsKIAkJLyogZW5hYmxlL2Rpc2FibGUgTURJL01ESS1YIGF1dG8tc3dpdGNoaW5nLgogCQkgICBNREkvTURJLVggYXV0by1zd2l0Y2hpbmcgaXMgZGlzYWJsZWQgZm9yIDgyNTUxRVIvUU0gY2hpcHMgKi8KIAkJaWYoKG5pYy0+bWFjID09IG1hY184MjU1MV9FKSB8fCAobmljLT5tYWMgPT0gbWFjXzgyNTUxX0YpIHx8Ci0JCSAgIChuaWMtPm1hYyA9PSBtYWNfODI1NTFfMTApIHx8IChuaWMtPm1paS5mb3JjZV9tZWRpYSkgfHwgCi0JCSAgICEobmljLT5lZXByb21bZWVwcm9tX2NuZmdfbWRpeF0gJiBlZXByb21fbWRpeF9lbmFibGVkKSkgCisJCSAgIChuaWMtPm1hYyA9PSBtYWNfODI1NTFfMTApIHx8IChuaWMtPm1paS5mb3JjZV9tZWRpYSkgfHwKKwkJICAgIShuaWMtPmVlcHJvbVtlZXByb21fY25mZ19tZGl4XSAmIGVlcHJvbV9tZGl4X2VuYWJsZWQpKQogCQkJbWRpb193cml0ZShuZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX05DT05GSUcsIDApOwogCQllbHNlCiAJCQltZGlvX3dyaXRlKG5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfTkNPTkZJRywgTkNPTkZJR19BVVRPX1NXSVRDSCk7CkBAIC0xMzYzLDcgKzE0MjIsNyBAQAogCQlyZXR1cm4gZXJyOwogCWlmKChlcnIgPSBlMTAwX2V4ZWNfY21kKG5pYywgcnVjX2xvYWRfYmFzZSwgMCkpKQogCQlyZXR1cm4gZXJyOwotCWlmKChlcnIgPSBlMTAwX2V4ZWNfY2IobmljLCBOVUxMLCBlMTAwX2xvYWRfdWNvZGUpKSkKKwlpZiAoKGVyciA9IGUxMDBfZXhlY19jYl93YWl0KG5pYywgTlVMTCwgZTEwMF9zZXR1cF91Y29kZSkpKQogCQlyZXR1cm4gZXJyOwogCWlmKChlcnIgPSBlMTAwX2V4ZWNfY2IobmljLCBOVUxMLCBlMTAwX2NvbmZpZ3VyZSkpKQogCQlyZXR1cm4gZXJyOwpAQCAtMTQ2OCw3ICsxNTI3LDcgQEAKIAkJfQogCX0KIAotCQorCiAJaWYoZTEwMF9leGVjX2NtZChuaWMsIGN1Y19kdW1wX3Jlc2V0LCAwKSkKIAkJRFBSSU5USyhUWF9FUlIsIERFQlVHLCAiZXhlYyBjdWNfZHVtcF9yZXNldCBmYWlsZWRcbiIpOwogfQpAQCAtMTUxNywxMCArMTU3NiwxMCBAQAogCW1paV9jaGVja19saW5rKCZuaWMtPm1paSk7CiAKIAkvKiBTb2Z0d2FyZSBnZW5lcmF0ZWQgaW50ZXJydXB0IHRvIHJlY292ZXIgZnJvbSAocmFyZSkgUngKLQkqIGFsbG9jYXRpb24gZmFpbHVyZS4KLQkqIFVuZm9ydHVuYXRlbHkgaGF2ZSB0byB1c2UgYSBzcGlubG9jayB0byBub3QgcmUtZW5hYmxlIGludGVycnVwdHMKLQkqIGFjY2lkZW50YWxseSwgZHVlIHRvIGhhcmR3YXJlIHRoYXQgc2hhcmVzIGEgcmVnaXN0ZXIgYmV0d2VlbiB0aGUKLQkqIGludGVycnVwdCBtYXNrIGJpdCBhbmQgdGhlIFNXIEludGVycnVwdCBnZW5lcmF0aW9uIGJpdCAqLworCSAqIGFsbG9jYXRpb24gZmFpbHVyZS4KKwkgKiBVbmZvcnR1bmF0ZWx5IGhhdmUgdG8gdXNlIGEgc3BpbmxvY2sgdG8gbm90IHJlLWVuYWJsZSBpbnRlcnJ1cHRzCisJICogYWNjaWRlbnRhbGx5LCBkdWUgdG8gaGFyZHdhcmUgdGhhdCBzaGFyZXMgYSByZWdpc3RlciBiZXR3ZWVuIHRoZQorCSAqIGludGVycnVwdCBtYXNrIGJpdCBhbmQgdGhlIFNXIEludGVycnVwdCBnZW5lcmF0aW9uIGJpdCAqLwogCXNwaW5fbG9ja19pcnEoJm5pYy0+Y21kX2xvY2spOwogCXdyaXRlYihyZWFkYigmbmljLT5jc3ItPnNjYi5jbWRfaGkpIHwgaXJxX3N3X2dlbiwmbmljLT5jc3ItPnNjYi5jbWRfaGkpOwogCXNwaW5fdW5sb2NrX2lycSgmbmljLT5jbWRfbG9jayk7CkBAIC0xNTQyLDcgKzE2MDEsNyBAQAogCW1vZF90aW1lcigmbmljLT53YXRjaGRvZywgamlmZmllcyArIEUxMDBfV0FUQ0hET0dfUEVSSU9EKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGUxMDBfeG1pdF9wcmVwYXJlKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IGNiICpjYiwKK3N0YXRpYyB2b2lkIGUxMDBfeG1pdF9wcmVwYXJlKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IGNiICpjYiwKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWNiLT5jb21tYW5kID0gbmljLT50eF9jb21tYW5kOwpAQCAtMTU5Miw3ICsxNjUxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZTEwMF90eF9jbGVhbihzdHJ1Y3QgbmljICpuaWMpCitzdGF0aWMgaW50IGUxMDBfdHhfY2xlYW4oc3RydWN0IG5pYyAqbmljKQogewogCXN0cnVjdCBjYiAqY2I7CiAJaW50IHR4X2NsZWFuZWQgPSAwOwpAQCAtMTcwMyw3ICsxNzYyLDcgQEAKIH0KIAogI2RlZmluZSBSRkRfQlVGX0xFTiAoc2l6ZW9mKHN0cnVjdCByZmQpICsgVkxBTl9FVEhfRlJBTUVfTEVOKQotc3RhdGljIGlubGluZSBpbnQgZTEwMF9yeF9hbGxvY19za2Ioc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgcnggKnJ4KQorc3RhdGljIGludCBlMTAwX3J4X2FsbG9jX3NrYihzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCByeCAqcngpCiB7CiAJaWYoIShyeC0+c2tiID0gZGV2X2FsbG9jX3NrYihSRkRfQlVGX0xFTiArIE5FVF9JUF9BTElHTikpKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE3MzcsNyArMTc5Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGUxMDBfcnhfaW5kaWNhdGUoc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgcnggKnJ4LAorc3RhdGljIGludCBlMTAwX3J4X2luZGljYXRlKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IHJ4ICpyeCwKIAl1bnNpZ25lZCBpbnQgKndvcmtfZG9uZSwgdW5zaWduZWQgaW50IHdvcmtfdG9fZG8pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJ4LT5za2I7CkBAIC0xNzk3LDcgKzE4NTYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZTEwMF9yeF9jbGVhbihzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIGludCAqd29ya19kb25lLAorc3RhdGljIHZvaWQgZTEwMF9yeF9jbGVhbihzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIGludCAqd29ya19kb25lLAogCXVuc2lnbmVkIGludCB3b3JrX3RvX2RvKQogewogCXN0cnVjdCByeCAqcng7CkBAIC0xODA1LDcgKzE4NjQsNyBAQAogCXN0cnVjdCByeCAqcnhfdG9fc3RhcnQgPSBOVUxMOwogCiAJLyogYXJlIHdlIGFscmVhZHkgcm5yPyB0aGVuIHBheSBhdHRlbnRpb24hISEgdGhpcyBlbnN1cmVzIHRoYXQKLQkgKiB0aGUgc3RhdGUgbWFjaGluZSBwcm9ncmVzc2lvbiBuZXZlciBhbGxvd3MgYSBzdGFydCB3aXRoIGEgCisJICogdGhlIHN0YXRlIG1hY2hpbmUgcHJvZ3Jlc3Npb24gbmV2ZXIgYWxsb3dzIGEgc3RhcnQgd2l0aCBhCiAJICogcGFydGlhbGx5IGNsZWFuZWQgbGlzdCwgYXZvaWRpbmcgYSByYWNlIGJldHdlZW4gaGFyZHdhcmUKIAkgKiBhbmQgcnhfdG9fY2xlYW4gd2hlbiBpbiBOQVBJIG1vZGUgKi8KIAlpZihSVV9TVVNQRU5ERUQgPT0gbmljLT5ydV9ydW5uaW5nKQpAQCAtMjA0MSw3ICsyMTAwLDcgQEAKIHsKIAlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCi0JLyogUmVzZXQgb3V0c2lkZSBvZiBpbnRlcnJ1cHQgY29udGV4dCwgdG8gYXZvaWQgcmVxdWVzdF9pcnEgCisJLyogUmVzZXQgb3V0c2lkZSBvZiBpbnRlcnJ1cHQgY29udGV4dCwgdG8gYXZvaWQgcmVxdWVzdF9pcnEKIAkgKiBpbiBpbnRlcnJ1cHQgY29udGV4dCAqLwogCXNjaGVkdWxlX3dvcmsoJm5pYy0+dHhfdGltZW91dF90YXNrKTsKIH0KQEAgLTIyODgsNyArMjM0Nyw3IEBACiAJc3RydWN0IHBhcmFtX3JhbmdlICpyZmRzID0gJm5pYy0+cGFyYW1zLnJmZHM7CiAJc3RydWN0IHBhcmFtX3JhbmdlICpjYnMgPSAmbmljLT5wYXJhbXMuY2JzOwogCi0JaWYgKChyaW5nLT5yeF9taW5pX3BlbmRpbmcpIHx8IChyaW5nLT5yeF9qdW1ib19wZW5kaW5nKSkgCisJaWYgKChyaW5nLT5yeF9taW5pX3BlbmRpbmcpIHx8IChyaW5nLT5yeF9qdW1ib19wZW5kaW5nKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZihuZXRpZl9ydW5uaW5nKG5ldGRldikpCkBAIC0yNTYyLDYgKzI2MjEsNyBAQAogCS8qIGxvY2tzIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNhbGxpbmcgaHdfcmVzZXQgKi8KIAlzcGluX2xvY2tfaW5pdCgmbmljLT5jYl9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmbmljLT5jbWRfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJm5pYy0+bWRpb19sb2NrKTsKIAogCS8qIFJlc2V0IHRoZSBkZXZpY2UgYmVmb3JlIHBjaV9zZXRfbWFzdGVyKCkgaW4gY2FzZSBkZXZpY2UgaXMgaW4gc29tZQogCSAqIGZ1bmt5IHN0YXRlIGFuZCBoYXMgYW4gaW50ZXJydXB0IHBlbmRpbmcgLSBoaW50OiB3ZSBkb24ndCBoYXZlIHRoZQpAQCAtMjYwNSw3ICsyNjY1LDkgQEAKIAkJbmljLT5mbGFncyB8PSB3b2xfbWFnaWM7CiAKIAkvKiBhY2sgYW55IHBlbmRpbmcgd2FrZSBldmVudHMsIGRpc2FibGUgUE1FICovCi0JcGNpX2VuYWJsZV93YWtlKHBkZXYsIDAsIDApOworCWVyciA9IHBjaV9lbmFibGVfd2FrZShwZGV2LCAwLCAwKTsKKwlpZiAoZXJyKQorCQlEUFJJTlRLKFBST0JFLCBFUlIsICJFcnJvciBjbGVhcmluZyB3YWtlIGV2ZW50XG4iKTsKIAogCXN0cmNweShuZXRkZXYtPm5hbWUsICJldGglZCIpOwogCWlmKChlcnIgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KSkpIHsKQEAgLTI2NTYsNiArMjcxOCw3IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCByZXR2YWw7CiAKIAlpZihuZXRpZl9ydW5uaW5nKG5ldGRldikpCiAJCWUxMDBfZG93bihuaWMpOwpAQCAtMjY2Myw5ICsyNzI2LDE0IEBACiAJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOwogCiAJcGNpX3NhdmVfc3RhdGUocGRldik7Ci0JcGNpX2VuYWJsZV93YWtlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpLCBuaWMtPmZsYWdzICYgKHdvbF9tYWdpYyB8IGUxMDBfYXNmKG5pYykpKTsKKwlyZXR2YWwgPSBwY2lfZW5hYmxlX3dha2UocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSksCisJICAgICAgICAgICAgICAgICAgICAgICAgIG5pYy0+ZmxhZ3MgJiAod29sX21hZ2ljIHwgZTEwMF9hc2YobmljKSkpOworCWlmIChyZXR2YWwpCisJCURQUklOVEsoUFJPQkUsRVJSLCAiRXJyb3IgZW5hYmxpbmcgd2FrZVxuIik7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOworCXJldHZhbCA9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOworCWlmIChyZXR2YWwpCisJCURQUklOVEsoUFJPQkUsRVJSLCAiRXJyb3IgJWQgc2V0dGluZyBwb3dlciBzdGF0ZVxuIiwgcmV0dmFsKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjY3NCwxMSArMjc0MiwxNiBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgcmV0dmFsOwogCi0JcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCXJldHZhbCA9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlpZiAocmV0dmFsKQorCQlEUFJJTlRLKFBST0JFLEVSUiwgIkVycm9yIHdha2luZyBhZGFwdGVyXG4iKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKIAkvKiBhY2sgYW55IHBlbmRpbmcgd2FrZSBldmVudHMsIGRpc2FibGUgUE1FICovCi0JcGNpX2VuYWJsZV93YWtlKHBkZXYsIDAsIDApOworCXJldHZhbCA9IHBjaV9lbmFibGVfd2FrZShwZGV2LCAwLCAwKTsKKwlpZiAocmV0dmFsKQorCQlEUFJJTlRLKFBST0JFLEVSUiwgIkVycm9yIGNsZWFyaW5nIHdha2UgZXZlbnRzXG4iKTsKIAlpZihlMTAwX2h3X2luaXQobmljKSkKIAkJRFBSSU5USyhIVywgRVJSLCAiZTEwMF9od19pbml0IGZhaWxlZFxuIik7CiAKQEAgLTI2OTUsMTIgKzI3NjgsMTUgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IHJldHZhbDsKIAogI2lmZGVmIENPTkZJR19QTQotCXBjaV9lbmFibGVfd2FrZShwZGV2LCAwLCBuaWMtPmZsYWdzICYgKHdvbF9tYWdpYyB8IGUxMDBfYXNmKG5pYykpKTsKKwlyZXR2YWwgPSBwY2lfZW5hYmxlX3dha2UocGRldiwgMCwgbmljLT5mbGFncyAmICh3b2xfbWFnaWMgfCBlMTAwX2FzZihuaWMpKSk7CiAjZWxzZQotCXBjaV9lbmFibGVfd2FrZShwZGV2LCAwLCBuaWMtPmZsYWdzICYgKHdvbF9tYWdpYykpOworCXJldHZhbCA9IHBjaV9lbmFibGVfd2FrZShwZGV2LCAwLCBuaWMtPmZsYWdzICYgKHdvbF9tYWdpYykpOwogI2VuZGlmCisJaWYgKHJldHZhbCkKKwkJRFBSSU5USyhQUk9CRSxFUlIsICJFcnJvciBlbmFibGluZyB3YWtlXG4iKTsKIH0KIAogCkBAIC0yNzEzLDcgKzI3ODksNyBAQAogCS5zdXNwZW5kID0gICAgICBlMTAwX3N1c3BlbmQsCiAJLnJlc3VtZSA9ICAgICAgIGUxMDBfcmVzdW1lLAogI2VuZGlmCi0JLnNodXRkb3duID0JZTEwMF9zaHV0ZG93biwKKwkuc2h1dGRvd24gPSAgICAgZTEwMF9zaHV0ZG93biwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGUxMDBfaW5pdF9tb2R1bGUodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmggYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMC5oCmluZGV4IGUwMmU5YmEuLjI3Yzc3MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmgKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDAuaApAQCAtNzIsMTAgKzcyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9taWkuaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgotI2lmZGVmIENPTkZJR19FMTAwMF9NUQotI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2VuZGlmCiAKICNkZWZpbmUgQkFSXzAJCTAKICNkZWZpbmUgQkFSXzEJCTEKQEAgLTg3LDYgKzgzLDEwIEBACiBzdHJ1Y3QgZTEwMDBfYWRhcHRlcjsKIAogI2luY2x1ZGUgImUxMDAwX2h3LmgiCisjaWZkZWYgQ09ORklHX0UxMDAwX01RCisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjZW5kaWYKIAogI2lmZGVmIERCRwogI2RlZmluZSBFMTAwMF9EQkcoYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgImUxMDAwOiAiIGFyZ3MpCkBAIC0xNjksNiArMTY5LDEzIEBACiAJdWludDE2X3QgbmV4dF90b193YXRjaDsKIH07CiAKKyNpZmRlZiBDT05GSUdfRTEwMDBfTVEKK3N0cnVjdCBlMTAwMF9xdWV1ZV9zdGF0cyB7CisJdWludDY0X3QgcGFja2V0czsKKwl1aW50NjRfdCBieXRlczsKK307CisjZW5kaWYKKwogc3RydWN0IGUxMDAwX3BzX3BhZ2UgeyBzdHJ1Y3QgcGFnZSAqcHNfcGFnZVtQU19QQUdFX0JVRkZFUlNdOyB9Owogc3RydWN0IGUxMDAwX3BzX3BhZ2VfZG1hIHsgdWludDY0X3QgcHNfcGFnZV9kbWFbUFNfUEFHRV9CVUZGRVJTXTsgfTsKIApAQCAtMTkxLDEwICsxOTgsMTIgQEAKIAlzcGlubG9ja190IHR4X2xvY2s7CiAJdWludDE2X3QgdGRoOwogCXVpbnQxNl90IHRkdDsKLQl1aW50NjRfdCBwa3Q7CiAKIAlib29sZWFuX3QgbGFzdF90eF90c287CiAKKyNpZmRlZiBDT05GSUdfRTEwMDBfTVEKKwlzdHJ1Y3QgZTEwMDBfcXVldWVfc3RhdHMgdHhfc3RhdHM7CisjZW5kaWYKIH07CiAKIHN0cnVjdCBlMTAwMF9yeF9yaW5nIHsKQEAgLTIxNiw5ICsyMjUsMTcgQEAKIAlzdHJ1Y3QgZTEwMDBfcHNfcGFnZSAqcHNfcGFnZTsKIAlzdHJ1Y3QgZTEwMDBfcHNfcGFnZV9kbWEgKnBzX3BhZ2VfZG1hOwogCisJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYl90b3A7CisJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYl9wcmV2OworCisJLyogY3B1IGZvciByeCBxdWV1ZSAqLworCWludCBjcHU7CisKIAl1aW50MTZfdCByZGg7CiAJdWludDE2X3QgcmR0OwotCXVpbnQ2NF90IHBrdDsKKyNpZmRlZiBDT05GSUdfRTEwMDBfTVEKKwlzdHJ1Y3QgZTEwMDBfcXVldWVfc3RhdHMgcnhfc3RhdHM7CisjZW5kaWYKIH07CiAKICNkZWZpbmUgRTEwMDBfREVTQ19VTlVTRUQoUikgXApAQCAtMjUxLDYgKzI2OCw5IEBACiAJdWludDE2X3QgbGlua19zcGVlZDsKIAl1aW50MTZfdCBsaW5rX2R1cGxleDsKIAlzcGlubG9ja190IHN0YXRzX2xvY2s7CisjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKKwlzcGlubG9ja190IHR4X3F1ZXVlX2xvY2s7CisjZW5kaWYKIAlhdG9taWNfdCBpcnFfc2VtOwogCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF90aW1lb3V0X3Rhc2s7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdhdGNoZG9nX3Rhc2s7CkBAIC0yNjQsNiArMjg0LDcgQEAKICNpZmRlZiBDT05GSUdfRTEwMDBfTVEKIAlzdHJ1Y3QgZTEwMDBfdHhfcmluZyAqKmNwdV90eF9yaW5nOyAvKiBwZXItY3B1ICovCiAjZW5kaWYKKwl1bnNpZ25lZCBsb25nIHR4X3F1ZXVlX2xlbjsKIAl1aW50MzJfdCB0eGRfY21kOwogCXVpbnQzMl90IHR4X2ludF9kZWxheTsKIAl1aW50MzJfdCB0eF9hYnNfaW50X2RlbGF5OwpAQCAtMjcxLDkgKzI5MiwxMSBAQAogCXVpbnQ2NF90IGdvdGNsX29sZDsKIAl1aW50NjRfdCB0cHRfb2xkOwogCXVpbnQ2NF90IGNvbGNfb2xkOworCXVpbnQzMl90IHR4X3RpbWVvdXRfY291bnQ7CiAJdWludDMyX3QgdHhfZmlmb19oZWFkOwogCXVpbnQzMl90IHR4X2hlYWRfYWRkcjsKIAl1aW50MzJfdCB0eF9maWZvX3NpemU7CisJdWludDhfdCAgdHhfdGltZW91dF9mYWN0b3I7CiAJYXRvbWljX3QgdHhfZmlmb19zdGFsbDsKIAlib29sZWFuX3QgcGNpeF84MjU0NDsKIAlib29sZWFuX3QgZGV0ZWN0X3R4X2h1bmc7CkBAIC0yODEsMTQgKzMwNCwxNSBAQAogCS8qIFJYICovCiAjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKIAlib29sZWFuX3QgKCpjbGVhbl9yeCkgKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLAotCQkJICAgICAgIHN0cnVjdCBlMTAwMF9yeF9yaW5nICpyeF9yaW5nLAotCQkJICAgICAgIGludCAqd29ya19kb25lLCBpbnQgd29ya190b19kbyk7CisJCQkJCQkgICBzdHJ1Y3QgZTEwMDBfcnhfcmluZyAqcnhfcmluZywKKwkJCQkJCSAgIGludCAqd29ya19kb25lLCBpbnQgd29ya190b19kbyk7CiAjZWxzZQogCWJvb2xlYW5fdCAoKmNsZWFuX3J4KSAoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkgICAgICAgc3RydWN0IGUxMDAwX3J4X3JpbmcgKnJ4X3JpbmcpOworCQkJCQkJICAgc3RydWN0IGUxMDAwX3J4X3JpbmcgKnJ4X3JpbmcpOwogI2VuZGlmCiAJdm9pZCAoKmFsbG9jX3J4X2J1ZikgKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLAotCQkJICAgICAgc3RydWN0IGUxMDAwX3J4X3JpbmcgKnJ4X3JpbmcpOworCQkJCQkJICBzdHJ1Y3QgZTEwMDBfcnhfcmluZyAqcnhfcmluZywKKwkJCQkJCSAgaW50IGNsZWFuZWRfY291bnQpOwogCXN0cnVjdCBlMTAwMF9yeF9yaW5nICpyeF9yaW5nOyAgICAgIC8qIE9uZSBwZXIgYWN0aXZlIHF1ZXVlICovCiAjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcG9sbGluZ19uZXRkZXY7ICAvKiBPbmUgcGVyIGFjdGl2ZSBxdWV1ZSAqLwpAQCAtMjk2LDEzICszMjAsMTUgQEAKICNpZmRlZiBDT05GSUdfRTEwMDBfTVEKIAlzdHJ1Y3QgbmV0X2RldmljZSAqKmNwdV9uZXRkZXY7ICAgICAvKiBwZXItY3B1ICovCiAJc3RydWN0IGNhbGxfYXN5bmNfZGF0YV9zdHJ1Y3Qgcnhfc2NoZWRfY2FsbF9kYXRhOwotCWludCBjcHVfZm9yX3F1ZXVlWzRdOworCWNwdW1hc2tfdCBjcHVtYXNrOwogI2VuZGlmCi0JaW50IG51bV9xdWV1ZXM7CisJaW50IG51bV90eF9xdWV1ZXM7CisJaW50IG51bV9yeF9xdWV1ZXM7CiAKIAl1aW50NjRfdCBod19jc3VtX2VycjsKIAl1aW50NjRfdCBod19jc3VtX2dvb2Q7CiAJdWludDY0X3QgcnhfaGRyX3NwbGl0OworCXVpbnQzMl90IGFsbG9jX3J4X2J1ZmZfZmFpbGVkOwogCXVpbnQzMl90IHJ4X2ludF9kZWxheTsKIAl1aW50MzJfdCByeF9hYnNfaW50X2RlbGF5OwogCWJvb2xlYW5fdCByeF9jc3VtOwpAQCAtMzMwLDYgKzM1Niw3IEBACiAJc3RydWN0IGUxMDAwX3J4X3JpbmcgdGVzdF9yeF9yaW5nOwogCiAKKwl1MzIgKmNvbmZpZ19zcGFjZTsKIAlpbnQgbXNnX2VuYWJsZTsKICNpZmRlZiBDT05GSUdfUENJX01TSQogCWJvb2xlYW5fdCBoYXZlX21zaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2V0aHRvb2wuYwppbmRleCBjODhmMWEzLi41Y2VkYzgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfZXRodG9vbC5jCkBAIC04MCw2ICs4MCw3IEBACiAJeyAidHhfZGVmZXJyZWRfb2siLCBFMTAwMF9TVEFUKHN0YXRzLmRjKSB9LAogCXsgInR4X3NpbmdsZV9jb2xsX29rIiwgRTEwMDBfU1RBVChzdGF0cy5zY2MpIH0sCiAJeyAidHhfbXVsdGlfY29sbF9vayIsIEUxMDAwX1NUQVQoc3RhdHMubWNjKSB9LAorCXsgInR4X3RpbWVvdXRfY291bnQiLCBFMTAwMF9TVEFUKHR4X3RpbWVvdXRfY291bnQpIH0sCiAJeyAicnhfbG9uZ19sZW5ndGhfZXJyb3JzIiwgRTEwMDBfU1RBVChzdGF0cy5yb2MpIH0sCiAJeyAicnhfc2hvcnRfbGVuZ3RoX2Vycm9ycyIsIEUxMDAwX1NUQVQoc3RhdHMucnVjKSB9LAogCXsgInJ4X2FsaWduX2Vycm9ycyIsIEUxMDAwX1NUQVQoc3RhdHMuYWxnbmVycmMpIH0sCkBAIC05Myw5ICs5NCwyMCBAQAogCXsgInJ4X2NzdW1fb2ZmbG9hZF9nb29kIiwgRTEwMDBfU1RBVChod19jc3VtX2dvb2QpIH0sCiAJeyAicnhfY3N1bV9vZmZsb2FkX2Vycm9ycyIsIEUxMDAwX1NUQVQoaHdfY3N1bV9lcnIpIH0sCiAJeyAicnhfaGVhZGVyX3NwbGl0IiwgRTEwMDBfU1RBVChyeF9oZHJfc3BsaXQpIH0sCisJeyAiYWxsb2NfcnhfYnVmZl9mYWlsZWQiLCBFMTAwMF9TVEFUKGFsbG9jX3J4X2J1ZmZfZmFpbGVkKSB9LAogfTsKLSNkZWZpbmUgRTEwMDBfU1RBVFNfTEVOCVwKKworI2lmZGVmIENPTkZJR19FMTAwMF9NUQorI2RlZmluZSBFMTAwMF9RVUVVRV9TVEFUU19MRU4gXAorCSgoKHN0cnVjdCBlMTAwMF9hZGFwdGVyICopbmV0ZGV2LT5wcml2KS0+bnVtX3R4X3F1ZXVlcyArIFwKKwkgKChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqKW5ldGRldi0+cHJpdiktPm51bV9yeF9xdWV1ZXMpIFwKKwkqIChzaXplb2Yoc3RydWN0IGUxMDAwX3F1ZXVlX3N0YXRzKSAvIHNpemVvZih1aW50NjRfdCkpCisjZWxzZQorI2RlZmluZSBFMTAwMF9RVUVVRV9TVEFUU19MRU4gMAorI2VuZGlmCisjZGVmaW5lIEUxMDAwX0dMT0JBTF9TVEFUU19MRU4JXAogCXNpemVvZihlMTAwMF9nc3RyaW5nc19zdGF0cykgLyBzaXplb2Yoc3RydWN0IGUxMDAwX3N0YXRzKQorI2RlZmluZSBFMTAwMF9TVEFUU19MRU4gKEUxMDAwX0dMT0JBTF9TVEFUU19MRU4gKyBFMTAwMF9RVUVVRV9TVEFUU19MRU4pCiBzdGF0aWMgY29uc3QgY2hhciBlMTAwMF9nc3RyaW5nc190ZXN0W11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKIAkiUmVnaXN0ZXIgdGVzdCAgKG9mZmxpbmUpIiwgIkVlcHJvbSB0ZXN0ICAgIChvZmZsaW5lKSIsCiAJIkludGVycnVwdCB0ZXN0IChvZmZsaW5lKSIsICJMb29wYmFjayB0ZXN0ICAob2ZmbGluZSkiLApAQCAtMTA5LDcgKzEyMSw3IEBACiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAKLQlpZihody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgeworCWlmIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgewogCiAJCWVjbWQtPnN1cHBvcnRlZCA9IChTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKIAkJICAgICAgICAgICAgICAgICAgIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfApAQCAtMTIxLDcgKzEzMyw3IEBACiAKIAkJZWNtZC0+YWR2ZXJ0aXNpbmcgPSBBRFZFUlRJU0VEX1RQOwogCi0JCWlmKGh3LT5hdXRvbmVnID09IDEpIHsKKwkJaWYgKGh3LT5hdXRvbmVnID09IDEpIHsKIAkJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXV0b25lZzsKIAogCQkJLyogdGhlIGUxMDAwIGF1dG9uZWcgc2VlbXMgdG8gbWF0Y2ggZXRodG9vbCBuaWNlbHkgKi8KQEAgLTEzMiw3ICsxNDQsNyBAQAogCQllY21kLT5wb3J0ID0gUE9SVF9UUDsKIAkJZWNtZC0+cGh5X2FkZHJlc3MgPSBody0+cGh5X2FkZHI7CiAKLQkJaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQzKQorCQlpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQzKQogCQkJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0VYVEVSTkFMOwogCQllbHNlCiAJCQllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CkBAIC0xNDgsMTMgKzE2MCwxMyBAQAogCiAJCWVjbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOwogCi0JCWlmKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0NSkKKwkJaWYgKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0NSkKIAkJCWVjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsKIAkJZWxzZQogCQkJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0VYVEVSTkFMOwogCX0KIAotCWlmKG5ldGlmX2NhcnJpZXJfb2soYWRhcHRlci0+bmV0ZGV2KSkgeworCWlmIChuZXRpZl9jYXJyaWVyX29rKGFkYXB0ZXItPm5ldGRldikpIHsKIAogCQllMTAwMF9nZXRfc3BlZWRfYW5kX2R1cGxleChodywgJmFkYXB0ZXItPmxpbmtfc3BlZWQsCiAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkYXB0ZXItPmxpbmtfZHVwbGV4KTsKQEAgLTE2Myw3ICsxNzUsNyBAQAogCQkvKiB1bmZvcnR1bmF0bHkgRlVMTF9EVVBMRVggIT0gRFVQTEVYX0ZVTEwKIAkJICogICAgICAgICAgYW5kIEhBTEZfRFVQTEVYICE9IERVUExFWF9IQUxGICovCiAKLQkJaWYoYWRhcHRlci0+bGlua19kdXBsZXggPT0gRlVMTF9EVVBMRVgpCisJCWlmIChhZGFwdGVyLT5saW5rX2R1cGxleCA9PSBGVUxMX0RVUExFWCkKIAkJCWVjbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOwogCQllbHNlCiAJCQllY21kLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKQEAgLTE4MywxMyArMTk1LDIxIEBACiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAKLQlpZihlY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJLyogV2hlbiBTb0wvSURFUiBzZXNzaW9ucyBhcmUgYWN0aXZlLCBhdXRvbmVnL3NwZWVkL2R1cGxleAorCSAqIGNhbm5vdCBiZSBjaGFuZ2VkICovCisJaWYgKGUxMDAwX2NoZWNrX3BoeV9yZXNldF9ibG9jayhodykpIHsKKwkJRFBSSU5USyhEUlYsIEVSUiwgIkNhbm5vdCBjaGFuZ2UgbGluayBjaGFyYWN0ZXJpc3RpY3MgIgorCQkgICAgICAgICJ3aGVuIFNvTC9JREVSIGlzIGFjdGl2ZS5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZWNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgewogCQlody0+YXV0b25lZyA9IDE7Ci0JCWlmKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpCisJCWlmIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKQogCQkJaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwgfAogCQkJCSAgICAgQURWRVJUSVNFRF9GSUJSRSB8CiAJCQkJICAgICBBRFZFUlRJU0VEX0F1dG9uZWc7Ci0JCWVsc2UgCisJCWVsc2UKIAkJCWh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPSBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8CiAJCQkJCQkgIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsIHwKIAkJCQkJCSAgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmIHwKQEAgLTE5OSwxMiArMjE5LDEyIEBACiAJCQkJCQkgIEFEVkVSVElTRURfVFA7CiAJCWVjbWQtPmFkdmVydGlzaW5nID0gaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZDsKIAl9IGVsc2UKLQkJaWYoZTEwMDBfc2V0X3NwZF9kcGx4KGFkYXB0ZXIsIGVjbWQtPnNwZWVkICsgZWNtZC0+ZHVwbGV4KSkKKwkJaWYgKGUxMDAwX3NldF9zcGRfZHBseChhZGFwdGVyLCBlY21kLT5zcGVlZCArIGVjbWQtPmR1cGxleCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIHJlc2V0IHRoZSBsaW5rICovCiAKLQlpZihuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsKKwlpZiAobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKSB7CiAJCWUxMDAwX2Rvd24oYWRhcHRlcik7CiAJCWUxMDAwX3Jlc2V0KGFkYXB0ZXIpOwogCQllMTAwMF91cChhZGFwdGVyKTsKQEAgLTIyMSwxNCArMjQxLDE0IEBACiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAKLQlwYXVzZS0+YXV0b25lZyA9IAorCXBhdXNlLT5hdXRvbmVnID0KIAkJKGFkYXB0ZXItPmZjX2F1dG9uZWcgPyBBVVRPTkVHX0VOQUJMRSA6IEFVVE9ORUdfRElTQUJMRSk7Ci0JCi0JaWYoaHctPmZjID09IGUxMDAwX2ZjX3J4X3BhdXNlKQorCisJaWYgKGh3LT5mYyA9PSBlMTAwMF9mY19yeF9wYXVzZSkKIAkJcGF1c2UtPnJ4X3BhdXNlID0gMTsKLQllbHNlIGlmKGh3LT5mYyA9PSBlMTAwMF9mY190eF9wYXVzZSkKKwllbHNlIGlmIChody0+ZmMgPT0gZTEwMDBfZmNfdHhfcGF1c2UpCiAJCXBhdXNlLT50eF9wYXVzZSA9IDE7Ci0JZWxzZSBpZihody0+ZmMgPT0gZTEwMDBfZmNfZnVsbCkgeworCWVsc2UgaWYgKGh3LT5mYyA9PSBlMTAwMF9mY19mdWxsKSB7CiAJCXBhdXNlLT5yeF9wYXVzZSA9IDE7CiAJCXBhdXNlLT50eF9wYXVzZSA9IDE7CiAJfQpAQCAtMjQwLDMxICsyNjAsMzAgQEAKIHsKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQkKKwogCWFkYXB0ZXItPmZjX2F1dG9uZWcgPSBwYXVzZS0+YXV0b25lZzsKIAotCWlmKHBhdXNlLT5yeF9wYXVzZSAmJiBwYXVzZS0+dHhfcGF1c2UpCisJaWYgKHBhdXNlLT5yeF9wYXVzZSAmJiBwYXVzZS0+dHhfcGF1c2UpCiAJCWh3LT5mYyA9IGUxMDAwX2ZjX2Z1bGw7Ci0JZWxzZSBpZihwYXVzZS0+cnhfcGF1c2UgJiYgIXBhdXNlLT50eF9wYXVzZSkKKwllbHNlIGlmIChwYXVzZS0+cnhfcGF1c2UgJiYgIXBhdXNlLT50eF9wYXVzZSkKIAkJaHctPmZjID0gZTEwMDBfZmNfcnhfcGF1c2U7Ci0JZWxzZSBpZighcGF1c2UtPnJ4X3BhdXNlICYmIHBhdXNlLT50eF9wYXVzZSkKKwllbHNlIGlmICghcGF1c2UtPnJ4X3BhdXNlICYmIHBhdXNlLT50eF9wYXVzZSkKIAkJaHctPmZjID0gZTEwMDBfZmNfdHhfcGF1c2U7Ci0JZWxzZSBpZighcGF1c2UtPnJ4X3BhdXNlICYmICFwYXVzZS0+dHhfcGF1c2UpCisJZWxzZSBpZiAoIXBhdXNlLT5yeF9wYXVzZSAmJiAhcGF1c2UtPnR4X3BhdXNlKQogCQlody0+ZmMgPSBlMTAwMF9mY19ub25lOwogCiAJaHctPm9yaWdpbmFsX2ZjID0gaHctPmZjOwogCi0JaWYoYWRhcHRlci0+ZmNfYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgewotCQlpZihuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsKKwlpZiAoYWRhcHRlci0+ZmNfYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQlpZiAobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKSB7CiAJCQllMTAwMF9kb3duKGFkYXB0ZXIpOwogCQkJZTEwMDBfdXAoYWRhcHRlcik7CiAJCX0gZWxzZQogCQkJZTEwMDBfcmVzZXQoYWRhcHRlcik7Ci0JfQotCWVsc2UKKwl9IGVsc2UKIAkJcmV0dXJuICgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgPwogCQkJZTEwMDBfc2V0dXBfbGluayhodykgOiBlMTAwMF9mb3JjZV9tYWNfZmMoaHcpKTsKLQkKKwogCXJldHVybiAwOwogfQogCkBAIC0yODEsMTQgKzMwMCwxNCBAQAogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlhZGFwdGVyLT5yeF9jc3VtID0gZGF0YTsKIAotCWlmKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKIAkJZTEwMDBfZG93bihhZGFwdGVyKTsKIAkJZTEwMDBfdXAoYWRhcHRlcik7CiAJfSBlbHNlCiAJCWUxMDAwX3Jlc2V0KGFkYXB0ZXIpOwogCXJldHVybiAwOwogfQotCQorCiBzdGF0aWMgdWludDMyX3QKIGUxMDAwX2dldF90eF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CkBAIC0zMDAsNyArMzE5LDcgQEAKIHsKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKLQlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTQzKSB7CisJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlIDwgZTEwMDBfODI1NDMpIHsKIAkJaWYgKCFkYXRhKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXJldHVybiAwOwpAQCAtMzE5LDggKzMzOCw4IEBACiBlMTAwMF9zZXRfdHNvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQzMl90IGRhdGEpCiB7CiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWlmKChhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTQ0KSB8fAotCSAgICAoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSAKKwlpZiAoKGFkYXB0ZXItPmh3Lm1hY190eXBlIDwgZTEwMDBfODI1NDQpIHx8CisJICAgIChhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykpCiAJCXJldHVybiBkYXRhID8gLUVJTlZBTCA6IDA7CiAKIAlpZiAoZGF0YSkKQEAgLTMyOCw3ICszNDcsNyBAQAogCWVsc2UKIAkJbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9UU087CiAJcmV0dXJuIDA7Ci19IAorfQogI2VuZGlmIC8qIE5FVElGX0ZfVFNPICovCiAKIHN0YXRpYyB1aW50MzJfdApAQCAtMzQ1LDcgKzM2NCw3IEBACiAJYWRhcHRlci0+bXNnX2VuYWJsZSA9IGRhdGE7CiB9CiAKLXN0YXRpYyBpbnQgCitzdGF0aWMgaW50CiBlMTAwMF9nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKICNkZWZpbmUgRTEwMDBfUkVHU19MRU4gMzIKQEAgLTM4MSw3ICs0MDAsNyBAQAogCXJlZ3NfYnVmZlsxMV0gPSBFMTAwMF9SRUFEX1JFRyhodywgVElEVik7CiAKIAlyZWdzX2J1ZmZbMTJdID0gYWRhcHRlci0+aHcucGh5X3R5cGU7ICAvKiBQSFkgdHlwZSAoSUdQPTEsIE04OD0wKSAqLwotCWlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKSB7CisJaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKSB7CiAJCWUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULAogCQkJCSAgICBJR1AwMUUxMDAwX1BIWV9BR0NfQSk7CiAJCWUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfQUdDX0EgJgpAQCAtNDM1LDcgKzQ1NCw3IEBACiAJZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfU1RBVFVTLCAmcGh5X2RhdGEpOwogCXJlZ3NfYnVmZlsyNF0gPSAodWludDMyX3QpcGh5X2RhdGE7ICAvKiBwaHkgbG9jYWwgcmVjZWl2ZXIgc3RhdHVzICovCiAJcmVnc19idWZmWzI1XSA9IHJlZ3NfYnVmZlsyNF07ICAvKiBwaHkgcmVtb3RlIHJlY2VpdmVyIHN0YXR1cyAqLwotCWlmKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MCAmJgorCWlmIChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDAgJiYKIAkgICBody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgewogCQlyZWdzX2J1ZmZbMjZdID0gRTEwMDBfUkVBRF9SRUcoaHcsIE1BTkMpOwogCX0KQEAgLTQ1OSw3ICs0NzgsNyBAQAogCWludCByZXRfdmFsID0gMDsKIAl1aW50MTZfdCBpOwogCi0JaWYoZWVwcm9tLT5sZW4gPT0gMCkKKwlpZiAoZWVwcm9tLT5sZW4gPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAllZXByb20tPm1hZ2ljID0gaHctPnZlbmRvcl9pZCB8IChody0+ZGV2aWNlX2lkIDw8IDE2KTsKQEAgLTQ2OSwxNiArNDg4LDE2IEBACiAKIAllZXByb21fYnVmZiA9IGttYWxsb2Moc2l6ZW9mKHVpbnQxNl90KSAqCiAJCQkobGFzdF93b3JkIC0gZmlyc3Rfd29yZCArIDEpLCBHRlBfS0VSTkVMKTsKLQlpZighZWVwcm9tX2J1ZmYpCisJaWYgKCFlZXByb21fYnVmZikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZihody0+ZWVwcm9tLnR5cGUgPT0gZTEwMDBfZWVwcm9tX3NwaSkKKwlpZiAoaHctPmVlcHJvbS50eXBlID09IGUxMDAwX2VlcHJvbV9zcGkpCiAJCXJldF92YWwgPSBlMTAwMF9yZWFkX2VlcHJvbShodywgZmlyc3Rfd29yZCwKIAkJCQkJICAgIGxhc3Rfd29yZCAtIGZpcnN0X3dvcmQgKyAxLAogCQkJCQkgICAgZWVwcm9tX2J1ZmYpOwogCWVsc2UgewogCQlmb3IgKGkgPSAwOyBpIDwgbGFzdF93b3JkIC0gZmlyc3Rfd29yZCArIDE7IGkrKykKLQkJCWlmKChyZXRfdmFsID0gZTEwMDBfcmVhZF9lZXByb20oaHcsIGZpcnN0X3dvcmQgKyBpLCAxLAorCQkJaWYgKChyZXRfdmFsID0gZTEwMDBfcmVhZF9lZXByb20oaHcsIGZpcnN0X3dvcmQgKyBpLCAxLAogCQkJCQkJCSZlZXByb21fYnVmZltpXSkpKQogCQkJCWJyZWFrOwogCX0KQEAgLTUwNSwxMCArNTI0LDEwIEBACiAJaW50IG1heF9sZW4sIGZpcnN0X3dvcmQsIGxhc3Rfd29yZCwgcmV0X3ZhbCA9IDA7CiAJdWludDE2X3QgaTsKIAotCWlmKGVlcHJvbS0+bGVuID09IDApCisJaWYgKGVlcHJvbS0+bGVuID09IDApCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCWlmKGVlcHJvbS0+bWFnaWMgIT0gKGh3LT52ZW5kb3JfaWQgfCAoaHctPmRldmljZV9pZCA8PCAxNikpKQorCWlmIChlZXByb20tPm1hZ2ljICE9IChody0+dmVuZG9yX2lkIHwgKGh3LT5kZXZpY2VfaWQgPDwgMTYpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAltYXhfbGVuID0gaHctPmVlcHJvbS53b3JkX3NpemUgKiAyOwpAQCAtNTE2LDE5ICs1MzUsMTkgQEAKIAlmaXJzdF93b3JkID0gZWVwcm9tLT5vZmZzZXQgPj4gMTsKIAlsYXN0X3dvcmQgPSAoZWVwcm9tLT5vZmZzZXQgKyBlZXByb20tPmxlbiAtIDEpID4+IDE7CiAJZWVwcm9tX2J1ZmYgPSBrbWFsbG9jKG1heF9sZW4sIEdGUF9LRVJORUwpOwotCWlmKCFlZXByb21fYnVmZikKKwlpZiAoIWVlcHJvbV9idWZmKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXB0ciA9ICh2b2lkICopZWVwcm9tX2J1ZmY7CiAKLQlpZihlZXByb20tPm9mZnNldCAmIDEpIHsKKwlpZiAoZWVwcm9tLT5vZmZzZXQgJiAxKSB7CiAJCS8qIG5lZWQgcmVhZC9tb2RpZnkvd3JpdGUgb2YgZmlyc3QgY2hhbmdlZCBFRVBST00gd29yZCAqLwogCQkvKiBvbmx5IHRoZSBzZWNvbmQgYnl0ZSBvZiB0aGUgd29yZCBpcyBiZWluZyBtb2RpZmllZCAqLwogCQlyZXRfdmFsID0gZTEwMDBfcmVhZF9lZXByb20oaHcsIGZpcnN0X3dvcmQsIDEsCiAJCQkJCSAgICAmZWVwcm9tX2J1ZmZbMF0pOwogCQlwdHIrKzsKIAl9Ci0JaWYoKChlZXByb20tPm9mZnNldCArIGVlcHJvbS0+bGVuKSAmIDEpICYmIChyZXRfdmFsID09IDApKSB7CisJaWYgKCgoZWVwcm9tLT5vZmZzZXQgKyBlZXByb20tPmxlbikgJiAxKSAmJiAocmV0X3ZhbCA9PSAwKSkgewogCQkvKiBuZWVkIHJlYWQvbW9kaWZ5L3dyaXRlIG9mIGxhc3QgY2hhbmdlZCBFRVBST00gd29yZCAqLwogCQkvKiBvbmx5IHRoZSBmaXJzdCBieXRlIG9mIHRoZSB3b3JkIGlzIGJlaW5nIG1vZGlmaWVkICovCiAJCXJldF92YWwgPSBlMTAwMF9yZWFkX2VlcHJvbShodywgbGFzdF93b3JkLCAxLApAQCAtNTQ3LDkgKzU2Niw5IEBACiAJcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX2VlcHJvbShodywgZmlyc3Rfd29yZCwKIAkJCQkgICAgIGxhc3Rfd29yZCAtIGZpcnN0X3dvcmQgKyAxLCBlZXByb21fYnVmZik7CiAKLQkvKiBVcGRhdGUgdGhlIGNoZWNrc3VtIG92ZXIgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIEVFUFJPTSBpZiBuZWVkZWQgCisJLyogVXBkYXRlIHRoZSBjaGVja3N1bSBvdmVyIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBFRVBST00gaWYgbmVlZGVkCiAJICogYW5kIGZsdXNoIHNoYWRvdyBSQU0gZm9yIDgyNTczIGNvbnJvbGxlcnMgKi8KLQlpZigocmV0X3ZhbCA9PSAwKSAmJiAoKGZpcnN0X3dvcmQgPD0gRUVQUk9NX0NIRUNLU1VNX1JFRykgfHwgCisJaWYgKChyZXRfdmFsID09IDApICYmICgoZmlyc3Rfd29yZCA8PSBFRVBST01fQ0hFQ0tTVU1fUkVHKSB8fAogCQkJCShody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzMpKSkKIAkJZTEwMDBfdXBkYXRlX2VlcHJvbV9jaGVja3N1bShodyk7CiAKQEAgLTU2NywyMSArNTg2LDIxIEBACiAKIAlzdHJuY3B5KGRydmluZm8tPmRyaXZlciwgIGUxMDAwX2RyaXZlcl9uYW1lLCAzMik7CiAJc3RybmNweShkcnZpbmZvLT52ZXJzaW9uLCBlMTAwMF9kcml2ZXJfdmVyc2lvbiwgMzIpOwotCQotCS8qIEVFUFJPTSBpbWFnZSB2ZXJzaW9uICMgaXMgcmVwb3J0ZWQgYXMgZmlyd2FyZSB2ZXJzaW9uICMgZm9yCisKKwkvKiBFRVBST00gaW1hZ2UgdmVyc2lvbiAjIGlzIHJlcG9ydGVkIGFzIGZpcm13YXJlIHZlcnNpb24gIyBmb3IKIAkgKiA4MjU3ezF8MnwzfSBjb250cm9sbGVycyAqLwogCWUxMDAwX3JlYWRfZWVwcm9tKCZhZGFwdGVyLT5odywgNSwgMSwgJmVlcHJvbV9kYXRhKTsKIAlzd2l0Y2ggKGFkYXB0ZXItPmh3Lm1hY190eXBlKSB7CiAJY2FzZSBlMTAwMF84MjU3MToKIAljYXNlIGUxMDAwXzgyNTcyOgogCWNhc2UgZTEwMDBfODI1NzM6Ci0JCXNwcmludGYoZmlybXdhcmVfdmVyc2lvbiwgIiVkLiVkLSVkIiwgCisJCXNwcmludGYoZmlybXdhcmVfdmVyc2lvbiwgIiVkLiVkLSVkIiwKIAkJCShlZXByb21fZGF0YSAmIDB4RjAwMCkgPj4gMTIsCiAJCQkoZWVwcm9tX2RhdGEgJiAweDBGRjApID4+IDQsCiAJCQllZXByb21fZGF0YSAmIDB4MDAwRik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNwcmludGYoZmlybXdhcmVfdmVyc2lvbiwgIm4vYSIpOworCQlzcHJpbnRmKGZpcm13YXJlX3ZlcnNpb24sICJOL0EiKTsKIAl9CiAKIAlzdHJuY3B5KGRydmluZm8tPmZ3X3ZlcnNpb24sIGZpcm13YXJlX3ZlcnNpb24sIDMyKTsKQEAgLTYxMyw3ICs2MzIsNyBAQAogCXJpbmctPnJ4X2p1bWJvX3BlbmRpbmcgPSAwOwogfQogCi1zdGF0aWMgaW50IAorc3RhdGljIGludAogZTEwMDBfc2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJpbmcpCiB7CkBAIC02MjMsOCArNjQyLDggQEAKIAlzdHJ1Y3QgZTEwMDBfcnhfcmluZyAqcnhkciwgKnJ4X29sZCwgKnJ4X25ldzsKIAlpbnQgaSwgZXJyLCB0eF9yaW5nX3NpemUsIHJ4X3Jpbmdfc2l6ZTsKIAotCXR4X3Jpbmdfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfdHhfcmluZykgKiBhZGFwdGVyLT5udW1fcXVldWVzOwotCXJ4X3Jpbmdfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfcnhfcmluZykgKiBhZGFwdGVyLT5udW1fcXVldWVzOworCXR4X3Jpbmdfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfdHhfcmluZykgKiBhZGFwdGVyLT5udW1fdHhfcXVldWVzOworCXJ4X3Jpbmdfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfcnhfcmluZykgKiBhZGFwdGVyLT5udW1fcnhfcXVldWVzOwogCiAJaWYgKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkKIAkJZTEwMDBfZG93bihhZGFwdGVyKTsKQEAgLTY1MCwyNSArNjY5LDI1IEBACiAJdHhkciA9IGFkYXB0ZXItPnR4X3Jpbmc7CiAJcnhkciA9IGFkYXB0ZXItPnJ4X3Jpbmc7CiAKLQlpZigocmluZy0+cnhfbWluaV9wZW5kaW5nKSB8fCAocmluZy0+cnhfanVtYm9fcGVuZGluZykpCisJaWYgKChyaW5nLT5yeF9taW5pX3BlbmRpbmcpIHx8IChyaW5nLT5yeF9qdW1ib19wZW5kaW5nKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyeGRyLT5jb3VudCA9IG1heChyaW5nLT5yeF9wZW5kaW5nLCh1aW50MzJfdClFMTAwMF9NSU5fUlhEKTsKIAlyeGRyLT5jb3VudCA9IG1pbihyeGRyLT5jb3VudCwodWludDMyX3QpKG1hY190eXBlIDwgZTEwMDBfODI1NDQgPwogCQlFMTAwMF9NQVhfUlhEIDogRTEwMDBfTUFYXzgyNTQ0X1JYRCkpOwotCUUxMDAwX1JPVU5EVVAocnhkci0+Y291bnQsIFJFUV9SWF9ERVNDUklQVE9SX01VTFRJUExFKTsgCisJRTEwMDBfUk9VTkRVUChyeGRyLT5jb3VudCwgUkVRX1JYX0RFU0NSSVBUT1JfTVVMVElQTEUpOwogCiAJdHhkci0+Y291bnQgPSBtYXgocmluZy0+dHhfcGVuZGluZywodWludDMyX3QpRTEwMDBfTUlOX1RYRCk7CiAJdHhkci0+Y291bnQgPSBtaW4odHhkci0+Y291bnQsKHVpbnQzMl90KShtYWNfdHlwZSA8IGUxMDAwXzgyNTQ0ID8KIAkJRTEwMDBfTUFYX1RYRCA6IEUxMDAwX01BWF84MjU0NF9UWEQpKTsKLQlFMTAwMF9ST1VORFVQKHR4ZHItPmNvdW50LCBSRVFfVFhfREVTQ1JJUFRPUl9NVUxUSVBMRSk7IAorCUUxMDAwX1JPVU5EVVAodHhkci0+Y291bnQsIFJFUV9UWF9ERVNDUklQVE9SX01VTFRJUExFKTsKIAotCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3R4X3F1ZXVlczsgaSsrKQogCQl0eGRyW2ldLmNvdW50ID0gdHhkci0+Y291bnQ7CisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9yeF9xdWV1ZXM7IGkrKykKIAkJcnhkcltpXS5jb3VudCA9IHJ4ZHItPmNvdW50OwotCX0KIAotCWlmKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgeworCWlmIChuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsKIAkJLyogVHJ5IHRvIGdldCBuZXcgcmVzb3VyY2VzIGJlZm9yZSBkZWxldGluZyBvbGQgKi8KIAkJaWYgKChlcnIgPSBlMTAwMF9zZXR1cF9hbGxfcnhfcmVzb3VyY2VzKGFkYXB0ZXIpKSkKIAkJCWdvdG8gZXJyX3NldHVwX3J4OwpAQCAtNjg4LDcgKzcwNyw3IEBACiAJCWtmcmVlKHJ4X29sZCk7CiAJCWFkYXB0ZXItPnJ4X3JpbmcgPSByeF9uZXc7CiAJCWFkYXB0ZXItPnR4X3JpbmcgPSB0eF9uZXc7Ci0JCWlmKChlcnIgPSBlMTAwMF91cChhZGFwdGVyKSkpCisJCWlmICgoZXJyID0gZTEwMDBfdXAoYWRhcHRlcikpKQogCQkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTcwNywxMCArNzI2LDEwIEBACiAJdWludDMyX3QgcGF0LCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJdWludDMyX3QgdGVzdFtdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCXsweDVBNUE1QTVBLCAweEE1QTVBNUE1LCAweDAwMDAwMDAwLCAweEZGRkZGRkZGfTsgICAgICAgICAgICAgIFwKLQlmb3IocGF0ID0gMDsgcGF0IDwgc2l6ZW9mKHRlc3QpL3NpemVvZih0ZXN0WzBdKTsgcGF0KyspIHsgICAgICAgICAgICAgIFwKKwlmb3IgKHBhdCA9IDA7IHBhdCA8IHNpemVvZih0ZXN0KS9zaXplb2YodGVzdFswXSk7IHBhdCsrKSB7ICAgICAgICAgICAgICBcCiAJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFIsICh0ZXN0W3BhdF0gJiBXKSk7ICAgICAgICAgICAgIFwKIAkJdmFsdWUgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFIpOyAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZih2YWx1ZSAhPSAodGVzdFtwYXRdICYgVyAmIE0pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmICh2YWx1ZSAhPSAodGVzdFtwYXRdICYgVyAmIE0pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCQlEUFJJTlRLKERSViwgRVJSLCAicGF0dGVybiB0ZXN0IHJlZyAlMDRYIGZhaWxlZDogZ290ICIgXAogCQkJICAgICAgICAiMHglMDhYIGV4cGVjdGVkIDB4JTA4WFxuIiwgICAgICAgICAgICAgICAgICAgIFwKIAkJCSAgICAgICAgRTEwMDBfIyNSLCB2YWx1ZSwgKHRlc3RbcGF0XSAmIFcgJiBNKSk7ICAgICAgICBcCkBAIC03MjYsNyArNzQ1LDcgQEAKIAl1aW50MzJfdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSLCBXICYgTSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAl2YWx1ZSA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZigoVyAmIE0pICE9ICh2YWx1ZSAmIE0pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmICgoVyAmIE0pICE9ICh2YWx1ZSAmIE0pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQlEUFJJTlRLKERSViwgRVJSLCAic2V0L2NoZWNrIHJlZyAlMDRYIHRlc3QgZmFpbGVkOiBnb3QgMHglMDhYICJcCiAJCSAgICAgICAgImV4cGVjdGVkIDB4JTA4WFxuIiwgRTEwMDBfIyNSLCAodmFsdWUgJiBNKSwgKFcgJiBNKSk7IFwKIAkJKmRhdGEgPSAoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU0MykgPyAgICAgICAgICAgICAgICAgXApAQCAtNzYyLDcgKzc4MSw3IEBACiAJdmFsdWUgPSAoRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBTVEFUVVMpICYgdG9nZ2xlKTsKIAlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBTVEFUVVMsIHRvZ2dsZSk7CiAJYWZ0ZXIgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNUQVRVUykgJiB0b2dnbGU7Ci0JaWYodmFsdWUgIT0gYWZ0ZXIpIHsKKwlpZiAodmFsdWUgIT0gYWZ0ZXIpIHsKIAkJRFBSSU5USyhEUlYsIEVSUiwgImZhaWxlZCBTVEFUVVMgcmVnaXN0ZXIgdGVzdCBnb3Q6ICIKIAkJICAgICAgICAiMHglMDhYIGV4cGVjdGVkOiAweCUwOFhcbiIsIGFmdGVyLCB2YWx1ZSk7CiAJCSpkYXRhID0gMTsKQEAgLTc5MCw3ICs4MDksNyBAQAogCVJFR19TRVRfQU5EX0NIRUNLKFJDVEwsIDB4MDZERkIzRkUsIDB4MDAzRkZGRkIpOwogCVJFR19TRVRfQU5EX0NIRUNLKFRDVEwsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDApOwogCi0JaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpIHsKKwlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpIHsKIAogCQlSRUdfU0VUX0FORF9DSEVDSyhSQ1RMLCAweDA2REZCM0ZFLCAweEZGRkZGRkZGKTsKIAkJUkVHX1BBVFRFUk5fVEVTVChSREJBTCwgMHhGRkZGRkZGMCwgMHhGRkZGRkZGRik7CkBAIC03OTgsNyArODE3LDcgQEAKIAkJUkVHX1BBVFRFUk5fVEVTVChUREJBTCwgMHhGRkZGRkZGMCwgMHhGRkZGRkZGRik7CiAJCVJFR19QQVRURVJOX1RFU1QoVElEViwgMHgwMDAwRkZGRiwgMHgwMDAwRkZGRik7CiAKLQkJZm9yKGkgPSAwOyBpIDwgRTEwMDBfUkFSX0VOVFJJRVM7IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgRTEwMDBfUkFSX0VOVFJJRVM7IGkrKykgewogCQkJUkVHX1BBVFRFUk5fVEVTVChSQSArICgoaSA8PCAxKSA8PCAyKSwgMHhGRkZGRkZGRiwKIAkJCQkJIDB4RkZGRkZGRkYpOwogCQkJUkVHX1BBVFRFUk5fVEVTVChSQSArICgoKGkgPDwgMSkgKyAxKSA8PCAyKSwgMHg4MDAzRkZGRiwKQEAgLTgxNCw3ICs4MzMsNyBAQAogCiAJfQogCi0JZm9yKGkgPSAwOyBpIDwgRTEwMDBfTUNfVEJMX1NJWkU7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgRTEwMDBfTUNfVEJMX1NJWkU7IGkrKykKIAkJUkVHX1BBVFRFUk5fVEVTVChNVEEgKyAoaSA8PCAyKSwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRik7CiAKIAkqZGF0YSA9IDA7CkBAIC04MzAsOCArODQ5LDggQEAKIAogCSpkYXRhID0gMDsKIAkvKiBSZWFkIGFuZCBhZGQgdXAgdGhlIGNvbnRlbnRzIG9mIHRoZSBFRVBST00gKi8KLQlmb3IoaSA9IDA7IGkgPCAoRUVQUk9NX0NIRUNLU1VNX1JFRyArIDEpOyBpKyspIHsKLQkJaWYoKGUxMDAwX3JlYWRfZWVwcm9tKCZhZGFwdGVyLT5odywgaSwgMSwgJnRlbXApKSA8IDApIHsKKwlmb3IgKGkgPSAwOyBpIDwgKEVFUFJPTV9DSEVDS1NVTV9SRUcgKyAxKTsgaSsrKSB7CisJCWlmICgoZTEwMDBfcmVhZF9lZXByb20oJmFkYXB0ZXItPmh3LCBpLCAxLCAmdGVtcCkpIDwgMCkgewogCQkJKmRhdGEgPSAxOwogCQkJYnJlYWs7CiAJCX0KQEAgLTgzOSw3ICs4NTgsNyBAQAogCX0KIAogCS8qIElmIENoZWNrc3VtIGlzIG5vdCBDb3JyZWN0IHJldHVybiBlcnJvciBlbHNlIHRlc3QgcGFzc2VkICovCi0JaWYoKGNoZWNrc3VtICE9ICh1aW50MTZfdCkgRUVQUk9NX1NVTSkgJiYgISgqZGF0YSkpCisJaWYgKChjaGVja3N1bSAhPSAodWludDE2X3QpIEVFUFJPTV9TVU0pICYmICEoKmRhdGEpKQogCQkqZGF0YSA9IDI7CiAKIAlyZXR1cm4gKmRhdGE7CkBAIC04NjgsOSArODg3LDkgQEAKIAkqZGF0YSA9IDA7CiAKIAkvKiBIb29rIHVwIHRlc3QgaW50ZXJydXB0IGhhbmRsZXIganVzdCBmb3IgdGhpcyB0ZXN0ICovCi0gCWlmKCFyZXF1ZXN0X2lycShpcnEsICZlMTAwMF90ZXN0X2ludHIsIDAsIG5ldGRldi0+bmFtZSwgbmV0ZGV2KSkgeworIAlpZiAoIXJlcXVlc3RfaXJxKGlycSwgJmUxMDAwX3Rlc3RfaW50ciwgMCwgbmV0ZGV2LT5uYW1lLCBuZXRkZXYpKSB7CiAgCQlzaGFyZWRfaW50ID0gRkFMU0U7Ci0gCX0gZWxzZSBpZihyZXF1ZXN0X2lycShpcnEsICZlMTAwMF90ZXN0X2ludHIsIFNBX1NISVJRLAorIAl9IGVsc2UgaWYgKHJlcXVlc3RfaXJxKGlycSwgJmUxMDAwX3Rlc3RfaW50ciwgU0FfU0hJUlEsCiAJCQkgICAgICBuZXRkZXYtPm5hbWUsIG5ldGRldikpewogCQkqZGF0YSA9IDE7CiAJCXJldHVybiAtMTsKQEAgLTg4MSwxMiArOTAwLDEyIEBACiAJbXNlY19kZWxheSgxMCk7CiAKIAkvKiBUZXN0IGVhY2ggaW50ZXJydXB0ICovCi0JZm9yKDsgaSA8IDEwOyBpKyspIHsKKwlmb3IgKDsgaSA8IDEwOyBpKyspIHsKIAogCQkvKiBJbnRlcnJ1cHQgdG8gdGVzdCAqLwogCQltYXNrID0gMSA8PCBpOwogCi0gCQlpZighc2hhcmVkX2ludCkgeworIAkJaWYgKCFzaGFyZWRfaW50KSB7CiAgCQkJLyogRGlzYWJsZSB0aGUgaW50ZXJydXB0IHRvIGJlIHJlcG9ydGVkIGluCiAgCQkJICogdGhlIGNhdXNlIHJlZ2lzdGVyIGFuZCB0aGVuIGZvcmNlIHRoZSBzYW1lCiAgCQkJICogaW50ZXJydXB0IGFuZCBzZWUgaWYgb25lIGdldHMgcG9zdGVkLiAgSWYKQEAgLTg5Nyw4ICs5MTYsOCBAQAogIAkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElNQywgbWFzayk7CiAgCQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSUNTLCBtYXNrKTsKICAJCQltc2VjX2RlbGF5KDEwKTsKLSAKLSAJCQlpZihhZGFwdGVyLT50ZXN0X2ljciAmIG1hc2spIHsKKworIAkJCWlmIChhZGFwdGVyLT50ZXN0X2ljciAmIG1hc2spIHsKICAJCQkJKmRhdGEgPSAzOwogIAkJCQlicmVhazsKICAJCQl9CkBAIC05MTUsMTIgKzkzNCwxMiBAQAogCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJQ1MsIG1hc2spOwogCQltc2VjX2RlbGF5KDEwKTsKIAotCQlpZighKGFkYXB0ZXItPnRlc3RfaWNyICYgbWFzaykpIHsKKwkJaWYgKCEoYWRhcHRlci0+dGVzdF9pY3IgJiBtYXNrKSkgewogCQkJKmRhdGEgPSA0OwogCQkJYnJlYWs7CiAJCX0KIAotIAkJaWYoIXNoYXJlZF9pbnQpIHsKKyAJCWlmICghc2hhcmVkX2ludCkgewogCQkJLyogRGlzYWJsZSB0aGUgb3RoZXIgaW50ZXJydXB0cyB0byBiZSByZXBvcnRlZCBpbgogCQkJICogdGhlIGNhdXNlIHJlZ2lzdGVyIGFuZCB0aGVuIGZvcmNlIHRoZSBvdGhlcgogCQkJICogaW50ZXJydXB0cyBhbmQgc2VlIGlmIGFueSBnZXQgcG9zdGVkLiAgSWYKQEAgLTkzMiw3ICs5NTEsNyBAQAogCQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSUNTLCB+bWFzayAmIDB4MDAwMDdGRkYpOwogCQkJbXNlY19kZWxheSgxMCk7CiAKLQkJCWlmKGFkYXB0ZXItPnRlc3RfaWNyKSB7CisJCQlpZiAoYWRhcHRlci0+dGVzdF9pY3IpIHsKIAkJCQkqZGF0YSA9IDU7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC05NTcsNDAgKzk3NiwzOSBAQAogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKIAlpbnQgaTsKIAotCWlmKHR4ZHItPmRlc2MgJiYgdHhkci0+YnVmZmVyX2luZm8pIHsKLQkJZm9yKGkgPSAwOyBpIDwgdHhkci0+Y291bnQ7IGkrKykgewotCQkJaWYodHhkci0+YnVmZmVyX2luZm9baV0uZG1hKQorCWlmICh0eGRyLT5kZXNjICYmIHR4ZHItPmJ1ZmZlcl9pbmZvKSB7CisJCWZvciAoaSA9IDA7IGkgPCB0eGRyLT5jb3VudDsgaSsrKSB7CisJCQlpZiAodHhkci0+YnVmZmVyX2luZm9baV0uZG1hKQogCQkJCXBjaV91bm1hcF9zaW5nbGUocGRldiwgdHhkci0+YnVmZmVyX2luZm9baV0uZG1hLAogCQkJCQkJIHR4ZHItPmJ1ZmZlcl9pbmZvW2ldLmxlbmd0aCwKIAkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCWlmKHR4ZHItPmJ1ZmZlcl9pbmZvW2ldLnNrYikKKwkJCWlmICh0eGRyLT5idWZmZXJfaW5mb1tpXS5za2IpCiAJCQkJZGV2X2tmcmVlX3NrYih0eGRyLT5idWZmZXJfaW5mb1tpXS5za2IpOwogCQl9CiAJfQogCi0JaWYocnhkci0+ZGVzYyAmJiByeGRyLT5idWZmZXJfaW5mbykgewotCQlmb3IoaSA9IDA7IGkgPCByeGRyLT5jb3VudDsgaSsrKSB7Ci0JCQlpZihyeGRyLT5idWZmZXJfaW5mb1tpXS5kbWEpCisJaWYgKHJ4ZHItPmRlc2MgJiYgcnhkci0+YnVmZmVyX2luZm8pIHsKKwkJZm9yIChpID0gMDsgaSA8IHJ4ZHItPmNvdW50OyBpKyspIHsKKwkJCWlmIChyeGRyLT5idWZmZXJfaW5mb1tpXS5kbWEpCiAJCQkJcGNpX3VubWFwX3NpbmdsZShwZGV2LCByeGRyLT5idWZmZXJfaW5mb1tpXS5kbWEsCiAJCQkJCQkgcnhkci0+YnVmZmVyX2luZm9baV0ubGVuZ3RoLAogCQkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQlpZihyeGRyLT5idWZmZXJfaW5mb1tpXS5za2IpCisJCQlpZiAocnhkci0+YnVmZmVyX2luZm9baV0uc2tiKQogCQkJCWRldl9rZnJlZV9za2Iocnhkci0+YnVmZmVyX2luZm9baV0uc2tiKTsKIAkJfQogCX0KIAotCWlmKHR4ZHItPmRlc2MpIHsKKwlpZiAodHhkci0+ZGVzYykgewogCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHR4ZHItPnNpemUsIHR4ZHItPmRlc2MsIHR4ZHItPmRtYSk7CiAJCXR4ZHItPmRlc2MgPSBOVUxMOwogCX0KLQlpZihyeGRyLT5kZXNjKSB7CisJaWYgKHJ4ZHItPmRlc2MpIHsKIAkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCByeGRyLT5zaXplLCByeGRyLT5kZXNjLCByeGRyLT5kbWEpOwogCQlyeGRyLT5kZXNjID0gTlVMTDsKIAl9CiAKIAlrZnJlZSh0eGRyLT5idWZmZXJfaW5mbyk7CiAJdHhkci0+YnVmZmVyX2luZm8gPSBOVUxMOwotCiAJa2ZyZWUocnhkci0+YnVmZmVyX2luZm8pOwogCXJ4ZHItPmJ1ZmZlcl9pbmZvID0gTlVMTDsKIApAQCAtMTAwOCwxMSArMTAyNiwxMSBAQAogCiAJLyogU2V0dXAgVHggZGVzY3JpcHRvciByaW5nIGFuZCBUeCBidWZmZXJzICovCiAKLQlpZighdHhkci0+Y291bnQpCi0JCXR4ZHItPmNvdW50ID0gRTEwMDBfREVGQVVMVF9UWEQ7ICAgCisJaWYgKCF0eGRyLT5jb3VudCkKKwkJdHhkci0+Y291bnQgPSBFMTAwMF9ERUZBVUxUX1RYRDsKIAogCXNpemUgPSB0eGRyLT5jb3VudCAqIHNpemVvZihzdHJ1Y3QgZTEwMDBfYnVmZmVyKTsKLQlpZighKHR4ZHItPmJ1ZmZlcl9pbmZvID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKSkpIHsKKwlpZiAoISh0eGRyLT5idWZmZXJfaW5mbyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCkpKSB7CiAJCXJldF92YWwgPSAxOwogCQlnb3RvIGVycl9ub21lbTsKIAl9CkBAIC0xMDIwLDcgKzEwMzgsNyBAQAogCiAJdHhkci0+c2l6ZSA9IHR4ZHItPmNvdW50ICogc2l6ZW9mKHN0cnVjdCBlMTAwMF90eF9kZXNjKTsKIAlFMTAwMF9ST1VORFVQKHR4ZHItPnNpemUsIDQwOTYpOwotCWlmKCEodHhkci0+ZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHR4ZHItPnNpemUsICZ0eGRyLT5kbWEpKSkgeworCWlmICghKHR4ZHItPmRlc2MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCB0eGRyLT5zaXplLCAmdHhkci0+ZG1hKSkpIHsKIAkJcmV0X3ZhbCA9IDI7CiAJCWdvdG8gZXJyX25vbWVtOwogCX0KQEAgLTEwMzksMTIgKzEwNTcsMTIgQEAKIAkJCUUxMDAwX0NPTExJU0lPTl9USFJFU0hPTEQgPDwgRTEwMDBfQ1RfU0hJRlQgfAogCQkJRTEwMDBfRkRYX0NPTExJU0lPTl9ESVNUQU5DRSA8PCBFMTAwMF9DT0xEX1NISUZUKTsKIAotCWZvcihpID0gMDsgaSA8IHR4ZHItPmNvdW50OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgdHhkci0+Y291bnQ7IGkrKykgewogCQlzdHJ1Y3QgZTEwMDBfdHhfZGVzYyAqdHhfZGVzYyA9IEUxMDAwX1RYX0RFU0MoKnR4ZHIsIGkpOwogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCQl1bnNpZ25lZCBpbnQgc2l6ZSA9IDEwMjQ7CiAKLQkJaWYoIShza2IgPSBhbGxvY19za2Ioc2l6ZSwgR0ZQX0tFUk5FTCkpKSB7CisJCWlmICghKHNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfS0VSTkVMKSkpIHsKIAkJCXJldF92YWwgPSAzOwogCQkJZ290byBlcnJfbm9tZW07CiAJCX0KQEAgLTEwNjQsMTggKzEwODIsMTggQEAKIAogCS8qIFNldHVwIFJ4IGRlc2NyaXB0b3IgcmluZyBhbmQgUnggYnVmZmVycyAqLwogCi0JaWYoIXJ4ZHItPmNvdW50KQotCQlyeGRyLT5jb3VudCA9IEUxMDAwX0RFRkFVTFRfUlhEOyAgIAorCWlmICghcnhkci0+Y291bnQpCisJCXJ4ZHItPmNvdW50ID0gRTEwMDBfREVGQVVMVF9SWEQ7CiAKIAlzaXplID0gcnhkci0+Y291bnQgKiBzaXplb2Yoc3RydWN0IGUxMDAwX2J1ZmZlcik7Ci0JaWYoIShyeGRyLT5idWZmZXJfaW5mbyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCkpKSB7CisJaWYgKCEocnhkci0+YnVmZmVyX2luZm8gPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpKSkgewogCQlyZXRfdmFsID0gNDsKIAkJZ290byBlcnJfbm9tZW07CiAJfQogCW1lbXNldChyeGRyLT5idWZmZXJfaW5mbywgMCwgc2l6ZSk7CiAKIAlyeGRyLT5zaXplID0gcnhkci0+Y291bnQgKiBzaXplb2Yoc3RydWN0IGUxMDAwX3J4X2Rlc2MpOwotCWlmKCEocnhkci0+ZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHJ4ZHItPnNpemUsICZyeGRyLT5kbWEpKSkgeworCWlmICghKHJ4ZHItPmRlc2MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCByeGRyLT5zaXplLCAmcnhkci0+ZG1hKSkpIHsKIAkJcmV0X3ZhbCA9IDU7CiAJCWdvdG8gZXJyX25vbWVtOwogCX0KQEAgLTEwOTUsMTEgKzExMTMsMTEgQEAKIAkJKGFkYXB0ZXItPmh3Lm1jX2ZpbHRlcl90eXBlIDw8IEUxMDAwX1JDVExfTU9fU0hJRlQpOwogCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJDVEwsIHJjdGwpOwogCi0JZm9yKGkgPSAwOyBpIDwgcnhkci0+Y291bnQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCByeGRyLT5jb3VudDsgaSsrKSB7CiAJCXN0cnVjdCBlMTAwMF9yeF9kZXNjICpyeF9kZXNjID0gRTEwMDBfUlhfREVTQygqcnhkciwgaSk7CiAJCXN0cnVjdCBza19idWZmICpza2I7CiAKLQkJaWYoIShza2IgPSBhbGxvY19za2IoRTEwMDBfUlhCVUZGRVJfMjA0OCArIE5FVF9JUF9BTElHTiwKKwkJaWYgKCEoc2tiID0gYWxsb2Nfc2tiKEUxMDAwX1JYQlVGRkVSXzIwNDggKyBORVRfSVBfQUxJR04sCiAJCQkJR0ZQX0tFUk5FTCkpKSB7CiAJCQlyZXRfdmFsID0gNjsKIAkJCWdvdG8gZXJyX25vbWVtOwpAQCAtMTIwOCwxNSArMTIyNiwxNSBAQAogCiAJLyogQ2hlY2sgUGh5IENvbmZpZ3VyYXRpb24gKi8KIAllMTAwMF9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBQSFlfQ1RSTCwgJnBoeV9yZWcpOwotCWlmKHBoeV9yZWcgIT0gMHg0MTAwKQorCWlmIChwaHlfcmVnICE9IDB4NDEwMCkKIAkJIHJldHVybiA5OwogCiAJZTEwMDBfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgTTg4RTEwMDBfRVhUX1BIWV9TUEVDX0NUUkwsICZwaHlfcmVnKTsKLQlpZihwaHlfcmVnICE9IDB4MDA3MCkKKwlpZiAocGh5X3JlZyAhPSAweDAwNzApCiAJCXJldHVybiAxMDsKIAogCWUxMDAwX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIDI5LCAmcGh5X3JlZyk7Ci0JaWYocGh5X3JlZyAhPSAweDAwMUEpCisJaWYgKHBoeV9yZWcgIT0gMHgwMDFBKQogCQlyZXR1cm4gMTE7CiAKIAlyZXR1cm4gMDsKQEAgLTEyMzAsNyArMTI0OCw3IEBACiAKIAlhZGFwdGVyLT5ody5hdXRvbmVnID0gRkFMU0U7CiAKLQlpZihhZGFwdGVyLT5ody5waHlfdHlwZSA9PSBlMTAwMF9waHlfbTg4KSB7CisJaWYgKGFkYXB0ZXItPmh3LnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpIHsKIAkJLyogQXV0by1NREkvTURJWCBPZmYgKi8KIAkJZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsCiAJCQkJICAgIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsIDB4MDgwOCk7CkBAIC0xMjUwLDE0ICsxMjY4LDE0IEBACiAJCSAgICAgRTEwMDBfQ1RSTF9TUERfMTAwMCB8LyogRm9yY2UgU3BlZWQgdG8gMTAwMCAqLwogCQkgICAgIEUxMDAwX0NUUkxfRkQpOwkgLyogRm9yY2UgRHVwbGV4IHRvIEZVTEwgKi8KIAotCWlmKGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIgJiYKKwlpZiAoYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlciAmJgogCSAgIGFkYXB0ZXItPmh3LnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpIHsKIAkJY3RybF9yZWcgfD0gRTEwMDBfQ1RSTF9JTE9TOyAvKiBJbnZlcnQgTG9zcyBvZiBTaWduYWwgKi8KIAl9IGVsc2UgewogCQkvKiBTZXQgdGhlIElMT1MgYml0IG9uIHRoZSBmaWJlciBOaWMgaXMgaGFsZgogCQkgKiBkdXBsZXggbGluayBpcyBkZXRlY3RlZC4gKi8KIAkJc3RhdF9yZWcgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNUQVRVUyk7Ci0JCWlmKChzdGF0X3JlZyAmIEUxMDAwX1NUQVRVU19GRCkgPT0gMCkKKwkJaWYgKChzdGF0X3JlZyAmIEUxMDAwX1NUQVRVU19GRCkgPT0gMCkKIAkJCWN0cmxfcmVnIHw9IChFMTAwMF9DVFJMX0lMT1MgfCBFMTAwMF9DVFJMX1NMVSk7CiAJfQogCkBAIC0xMjY2LDcgKzEyODQsNyBAQAogCS8qIERpc2FibGUgdGhlIHJlY2VpdmVyIG9uIHRoZSBQSFkgc28gd2hlbiBhIGNhYmxlIGlzIHBsdWdnZWQgaW4sIHRoZQogCSAqIFBIWSBkb2VzIG5vdCBiZWdpbiB0byBhdXRvbmVnIHdoZW4gYSBjYWJsZSBpcyByZWNvbm5lY3RlZCB0byB0aGUgTklDLgogCSAqLwotCWlmKGFkYXB0ZXItPmh3LnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpCisJaWYgKGFkYXB0ZXItPmh3LnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpCiAJCWUxMDAwX3BoeV9kaXNhYmxlX3JlY2VpdmVyKGFkYXB0ZXIpOwogCiAJdWRlbGF5KDUwMCk7CkBAIC0xMjgyLDE0ICsxMzAwLDE0IEBACiAKIAlzd2l0Y2ggKGFkYXB0ZXItPmh3Lm1hY190eXBlKSB7CiAJY2FzZSBlMTAwMF84MjU0MzoKLQkJaWYoYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgeworCQlpZiAoYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgewogCQkJLyogQXR0ZW1wdCB0byBzZXR1cCBMb29wYmFjayBtb2RlIG9uIE5vbi1pbnRlZ3JhdGVkIFBIWS4KIAkJCSAqIFNvbWUgUEhZIHJlZ2lzdGVycyBnZXQgY29ycnVwdGVkIGF0IHJhbmRvbSwgc28KIAkJCSAqIGF0dGVtcHQgdGhpcyAxMCB0aW1lcy4KIAkJCSAqLwotCQkJd2hpbGUoZTEwMDBfbm9uaW50ZWdyYXRlZF9waHlfbG9vcGJhY2soYWRhcHRlcikgJiYKKwkJCXdoaWxlIChlMTAwMF9ub25pbnRlZ3JhdGVkX3BoeV9sb29wYmFjayhhZGFwdGVyKSAmJgogCQkJICAgICAgY291bnQrKyA8IDEwKTsKLQkJCWlmKGNvdW50IDwgMTEpCisJCQlpZiAoY291bnQgPCAxMSkKIAkJCQlyZXR1cm4gMDsKIAkJfQogCQlicmVhazsKQEAgLTEzMjcsMTEgKzEzNDUsMTEgQEAKIHN0YXRpYyBpbnQKIGUxMDAwX3NldHVwX2xvb3BiYWNrX3Rlc3Qoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JdWludDMyX3QgcmN0bDsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXVpbnQzMl90IHJjdGw7CiAKIAlpZiAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlciB8fAotCSAgIGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSB7CisJICAgIGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSB7CiAJCXN3aXRjaCAoaHctPm1hY190eXBlKSB7CiAJCWNhc2UgZTEwMDBfODI1NDU6CiAJCWNhc2UgZTEwMDBfODI1NDY6CkBAIC0xMzYyLDI1ICsxMzgwLDI1IEBACiBzdGF0aWMgdm9pZAogZTEwMDBfbG9vcGJhY2tfY2xlYW51cChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKIHsKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXVpbnQzMl90IHJjdGw7CiAJdWludDE2X3QgcGh5X3JlZzsKLQlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCi0JcmN0bCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkNUTCk7CisJcmN0bCA9IEUxMDAwX1JFQURfUkVHKGh3LCBSQ1RMKTsKIAlyY3RsICY9IH4oRTEwMDBfUkNUTF9MQk1fVENWUiB8IEUxMDAwX1JDVExfTEJNX01BQyk7Ci0JRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkNUTCwgcmN0bCk7CisJRTEwMDBfV1JJVEVfUkVHKGh3LCBSQ1RMLCByY3RsKTsKIAogCXN3aXRjaCAoaHctPm1hY190eXBlKSB7CiAJY2FzZSBlMTAwMF84MjU3MToKIAljYXNlIGUxMDAwXzgyNTcyOgogCQlpZiAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlciB8fAotCQkgICBody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcyl7CisJCSAgICBody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykgewogI2RlZmluZSBFMTAwMF9TRVJERVNfTEJfT0ZGIDB4NDAwCiAJCQlFMTAwMF9XUklURV9SRUcoaHcsIFNDVEwsIEUxMDAwX1NFUkRFU19MQl9PRkYpOwogCQkJbXNlY19kZWxheSgxMCk7CiAJCQlicmVhazsKIAkJfQotCQkvKiBmYWxsIHRocnUgZm9yIEN1IGFkYXB0ZXJzICovCisJCS8qIEZhbGwgVGhyb3VnaCAqLwogCWNhc2UgZTEwMDBfODI1NDU6CiAJY2FzZSBlMTAwMF84MjU0NjoKIAljYXNlIGUxMDAwXzgyNTQ1X3Jldl8zOgpAQCAtMTQwMSw3ICsxNDE5LDcgQEAKIGUxMDAwX2NyZWF0ZV9sYnRlc3RfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGZyYW1lX3NpemUpCiB7CiAJbWVtc2V0KHNrYi0+ZGF0YSwgMHhGRiwgZnJhbWVfc2l6ZSk7Ci0JZnJhbWVfc2l6ZSA9IChmcmFtZV9zaXplICUgMikgPyAoZnJhbWVfc2l6ZSAtIDEpIDogZnJhbWVfc2l6ZTsKKwlmcmFtZV9zaXplICY9IH4xOwogCW1lbXNldCgmc2tiLT5kYXRhW2ZyYW1lX3NpemUgLyAyXSwgMHhBQSwgZnJhbWVfc2l6ZSAvIDIgLSAxKTsKIAltZW1zZXQoJnNrYi0+ZGF0YVtmcmFtZV9zaXplIC8gMiArIDEwXSwgMHhCRSwgMSk7CiAJbWVtc2V0KCZza2ItPmRhdGFbZnJhbWVfc2l6ZSAvIDIgKyAxMl0sIDB4QUYsIDEpOwpAQCAtMTQxMCw5ICsxNDI4LDkgQEAKIHN0YXRpYyBpbnQKIGUxMDAwX2NoZWNrX2xidGVzdF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZSkKIHsKLQlmcmFtZV9zaXplID0gKGZyYW1lX3NpemUgJSAyKSA/IChmcmFtZV9zaXplIC0gMSkgOiBmcmFtZV9zaXplOwotCWlmKCooc2tiLT5kYXRhICsgMykgPT0gMHhGRikgewotCQlpZigoKihza2ItPmRhdGEgKyBmcmFtZV9zaXplIC8gMiArIDEwKSA9PSAweEJFKSAmJgorCWZyYW1lX3NpemUgJj0gfjE7CisJaWYgKCooc2tiLT5kYXRhICsgMykgPT0gMHhGRikgeworCQlpZiAoKCooc2tiLT5kYXRhICsgZnJhbWVfc2l6ZSAvIDIgKyAxMCkgPT0gMHhCRSkgJiYKIAkJICAgKCooc2tiLT5kYXRhICsgZnJhbWVfc2l6ZSAvIDIgKyAxMikgPT0gMHhBRikpIHsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0xNDMxLDUzICsxNDQ5LDUzIEBACiAKIAlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSRFQsIHJ4ZHItPmNvdW50IC0gMSk7CiAKLQkvKiBDYWxjdWxhdGUgdGhlIGxvb3AgY291bnQgYmFzZWQgb24gdGhlIGxhcmdlc3QgZGVzY3JpcHRvciByaW5nIAorCS8qIENhbGN1bGF0ZSB0aGUgbG9vcCBjb3VudCBiYXNlZCBvbiB0aGUgbGFyZ2VzdCBkZXNjcmlwdG9yIHJpbmcKIAkgKiBUaGUgaWRlYSBpcyB0byB3cmFwIHRoZSBsYXJnZXN0IHJpbmcgYSBudW1iZXIgb2YgdGltZXMgdXNpbmcgNjQKIAkgKiBzZW5kL3JlY2VpdmUgcGFpcnMgZHVyaW5nIGVhY2ggbG9vcAogCSAqLwogCi0JaWYocnhkci0+Y291bnQgPD0gdHhkci0+Y291bnQpCisJaWYgKHJ4ZHItPmNvdW50IDw9IHR4ZHItPmNvdW50KQogCQlsYyA9ICgodHhkci0+Y291bnQgLyA2NCkgKiAyKSArIDE7CiAJZWxzZQogCQlsYyA9ICgocnhkci0+Y291bnQgLyA2NCkgKiAyKSArIDE7CiAKIAlrID0gbCA9IDA7Ci0JZm9yKGogPSAwOyBqIDw9IGxjOyBqKyspIHsgLyogbG9vcCBjb3VudCBsb29wICovCi0JCWZvcihpID0gMDsgaSA8IDY0OyBpKyspIHsgLyogc2VuZCB0aGUgcGFja2V0cyAqLwotCQkJZTEwMDBfY3JlYXRlX2xidGVzdF9mcmFtZSh0eGRyLT5idWZmZXJfaW5mb1tpXS5za2IsIAorCWZvciAoaiA9IDA7IGogPD0gbGM7IGorKykgeyAvKiBsb29wIGNvdW50IGxvb3AgKi8KKwkJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsgLyogc2VuZCB0aGUgcGFja2V0cyAqLworCQkJZTEwMDBfY3JlYXRlX2xidGVzdF9mcmFtZSh0eGRyLT5idWZmZXJfaW5mb1tpXS5za2IsCiAJCQkJCTEwMjQpOwotCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHBkZXYsIAorCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHBkZXYsCiAJCQkJCXR4ZHItPmJ1ZmZlcl9pbmZvW2tdLmRtYSwKIAkJCQkgICAgCXR4ZHItPmJ1ZmZlcl9pbmZvW2tdLmxlbmd0aCwKIAkJCQkgICAgCVBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJaWYodW5saWtlbHkoKytrID09IHR4ZHItPmNvdW50KSkgayA9IDA7CisJCQlpZiAodW5saWtlbHkoKytrID09IHR4ZHItPmNvdW50KSkgayA9IDA7CiAJCX0KIAkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgVERULCBrKTsKIAkJbXNlY19kZWxheSgyMDApOwogCQl0aW1lID0gamlmZmllczsgLyogc2V0IHRoZSBzdGFydCB0aW1lIGZvciB0aGUgcmVjZWl2ZSAqLwogCQlnb29kX2NudCA9IDA7CiAJCWRvIHsgLyogcmVjZWl2ZSB0aGUgc2VudCBwYWNrZXRzICovCi0JCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocGRldiwgCisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocGRldiwKIAkJCQkJcnhkci0+YnVmZmVyX2luZm9bbF0uZG1hLAogCQkJCSAgICAJcnhkci0+YnVmZmVyX2luZm9bbF0ubGVuZ3RoLAogCQkJCSAgICAJUENJX0RNQV9GUk9NREVWSUNFKTsKLQkKKwogCQkJcmV0X3ZhbCA9IGUxMDAwX2NoZWNrX2xidGVzdF9mcmFtZSgKIAkJCQkJcnhkci0+YnVmZmVyX2luZm9bbF0uc2tiLAogCQkJCSAgIAkxMDI0KTsKLQkJCWlmKCFyZXRfdmFsKQorCQkJaWYgKCFyZXRfdmFsKQogCQkJCWdvb2RfY250Kys7Ci0JCQlpZih1bmxpa2VseSgrK2wgPT0gcnhkci0+Y291bnQpKSBsID0gMDsKLQkJCS8qIHRpbWUgKyAyMCBtc2VjcyAoMjAwIG1zZWNzIG9uIDIuNCkgaXMgbW9yZSB0aGFuIAotCQkJICogZW5vdWdoIHRpbWUgdG8gY29tcGxldGUgdGhlIHJlY2VpdmVzLCBpZiBpdCdzIAorCQkJaWYgKHVubGlrZWx5KCsrbCA9PSByeGRyLT5jb3VudCkpIGwgPSAwOworCQkJLyogdGltZSArIDIwIG1zZWNzICgyMDAgbXNlY3Mgb24gMi40KSBpcyBtb3JlIHRoYW4KKwkJCSAqIGVub3VnaCB0aW1lIHRvIGNvbXBsZXRlIHRoZSByZWNlaXZlcywgaWYgaXQncwogCQkJICogZXhjZWVkZWQsIGJyZWFrIGFuZCBlcnJvciBvZmYKIAkJCSAqLwogCQl9IHdoaWxlIChnb29kX2NudCA8IDY0ICYmIGppZmZpZXMgPCAodGltZSArIDIwKSk7Ci0JCWlmKGdvb2RfY250ICE9IDY0KSB7CisJCWlmIChnb29kX2NudCAhPSA2NCkgewogCQkJcmV0X3ZhbCA9IDEzOyAvKiByZXRfdmFsIGlzIHRoZSBzYW1lIGFzIG1pcy1jb21wYXJlICovCi0JCQlicmVhazsgCisJCQlicmVhazsKIAkJfQotCQlpZihqaWZmaWVzID49ICh0aW1lICsgMikpIHsKKwkJaWYgKGppZmZpZXMgPj0gKHRpbWUgKyAyKSkgewogCQkJcmV0X3ZhbCA9IDE0OyAvKiBlcnJvciBjb2RlIGZvciB0aW1lIG91dCBlcnJvciAqLwogCQkJYnJlYWs7CiAJCX0KQEAgLTE0ODgsMTQgKzE1MDYsMjUgQEAKIHN0YXRpYyBpbnQKIGUxMDAwX2xvb3BiYWNrX3Rlc3Qoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsIHVpbnQ2NF90ICpkYXRhKQogewotCWlmKCgqZGF0YSA9IGUxMDAwX3NldHVwX2Rlc2NfcmluZ3MoYWRhcHRlcikpKSBnb3RvIGVycl9sb29wYmFjazsKLQlpZigoKmRhdGEgPSBlMTAwMF9zZXR1cF9sb29wYmFja190ZXN0KGFkYXB0ZXIpKSkKLQkJZ290byBlcnJfbG9vcGJhY2tfc2V0dXA7CisJLyogUEhZIGxvb3BiYWNrIGNhbm5vdCBiZSBwZXJmb3JtZWQgaWYgU29ML0lERVIKKwkgKiBzZXNzaW9ucyBhcmUgYWN0aXZlICovCisJaWYgKGUxMDAwX2NoZWNrX3BoeV9yZXNldF9ibG9jaygmYWRhcHRlci0+aHcpKSB7CisJCURQUklOVEsoRFJWLCBFUlIsICJDYW5ub3QgZG8gUEhZIGxvb3BiYWNrIHRlc3QgIgorCQkgICAgICAgICJ3aGVuIFNvTC9JREVSIGlzIGFjdGl2ZS5cbiIpOworCQkqZGF0YSA9IDA7CisJCWdvdG8gb3V0OworCX0KKworCWlmICgoKmRhdGEgPSBlMTAwMF9zZXR1cF9kZXNjX3JpbmdzKGFkYXB0ZXIpKSkKKwkJZ290byBvdXQ7CisJaWYgKCgqZGF0YSA9IGUxMDAwX3NldHVwX2xvb3BiYWNrX3Rlc3QoYWRhcHRlcikpKQorCQlnb3RvIGVycl9sb29wYmFjazsKIAkqZGF0YSA9IGUxMDAwX3J1bl9sb29wYmFja190ZXN0KGFkYXB0ZXIpOwogCWUxMDAwX2xvb3BiYWNrX2NsZWFudXAoYWRhcHRlcik7Ci1lcnJfbG9vcGJhY2tfc2V0dXA6Ci0JZTEwMDBfZnJlZV9kZXNjX3JpbmdzKGFkYXB0ZXIpOworCiBlcnJfbG9vcGJhY2s6CisJZTEwMDBfZnJlZV9kZXNjX3JpbmdzKGFkYXB0ZXIpOworb3V0OgogCXJldHVybiAqZGF0YTsKIH0KIApAQCAtMTUxOSwxNyArMTU0OCwxNyBAQAogCQkqZGF0YSA9IDE7CiAJfSBlbHNlIHsKIAkJZTEwMDBfY2hlY2tfZm9yX2xpbmsoJmFkYXB0ZXItPmh3KTsKLQkJaWYoYWRhcHRlci0+aHcuYXV0b25lZykgIC8qIGlmIGF1dG9fbmVnIGlzIHNldCB3YWl0IGZvciBpdCAqLworCQlpZiAoYWRhcHRlci0+aHcuYXV0b25lZykgIC8qIGlmIGF1dG9fbmVnIGlzIHNldCB3YWl0IGZvciBpdCAqLwogCQkJbXNlY19kZWxheSg0MDAwKTsKIAotCQlpZighKEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19MVSkpIHsKKwkJaWYgKCEoRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBTVEFUVVMpICYgRTEwMDBfU1RBVFVTX0xVKSkgewogCQkJKmRhdGEgPSAxOwogCQl9CiAJfQogCXJldHVybiAqZGF0YTsKIH0KIAotc3RhdGljIGludCAKK3N0YXRpYyBpbnQKIGUxMDAwX2RpYWdfdGVzdF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXJldHVybiBFMTAwMF9URVNUX0xFTjsKQEAgLTE1NDIsNyArMTU3MSw3IEBACiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWJvb2xlYW5fdCBpZl9ydW5uaW5nID0gbmV0aWZfcnVubmluZyhuZXRkZXYpOwogCi0JaWYoZXRoX3Rlc3QtPmZsYWdzID09IEVUSF9URVNUX0ZMX09GRkxJTkUpIHsKKwlpZiAoZXRoX3Rlc3QtPmZsYWdzID09IEVUSF9URVNUX0ZMX09GRkxJTkUpIHsKIAkJLyogT2ZmbGluZSB0ZXN0cyAqLwogCiAJCS8qIHNhdmUgc3BlZWQsIGR1cGxleCwgYXV0b25lZyBzZXR0aW5ncyAqLwpAQCAtMTU1MiwyNyArMTU4MSwyNyBAQAogCiAJCS8qIExpbmsgdGVzdCBwZXJmb3JtZWQgYmVmb3JlIGhhcmR3YXJlIHJlc2V0IHNvIGF1dG9uZWcgZG9lc24ndAogCQkgKiBpbnRlcmZlcmUgd2l0aCB0ZXN0IHJlc3VsdCAqLwotCQlpZihlMTAwMF9saW5rX3Rlc3QoYWRhcHRlciwgJmRhdGFbNF0pKQorCQlpZiAoZTEwMDBfbGlua190ZXN0KGFkYXB0ZXIsICZkYXRhWzRdKSkKIAkJCWV0aF90ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CiAKLQkJaWYoaWZfcnVubmluZykKKwkJaWYgKGlmX3J1bm5pbmcpCiAJCQllMTAwMF9kb3duKGFkYXB0ZXIpOwogCQllbHNlCiAJCQllMTAwMF9yZXNldChhZGFwdGVyKTsKIAotCQlpZihlMTAwMF9yZWdfdGVzdChhZGFwdGVyLCAmZGF0YVswXSkpCisJCWlmIChlMTAwMF9yZWdfdGVzdChhZGFwdGVyLCAmZGF0YVswXSkpCiAJCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOwogCiAJCWUxMDAwX3Jlc2V0KGFkYXB0ZXIpOwotCQlpZihlMTAwMF9lZXByb21fdGVzdChhZGFwdGVyLCAmZGF0YVsxXSkpCisJCWlmIChlMTAwMF9lZXByb21fdGVzdChhZGFwdGVyLCAmZGF0YVsxXSkpCiAJCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOwogCiAJCWUxMDAwX3Jlc2V0KGFkYXB0ZXIpOwotCQlpZihlMTAwMF9pbnRyX3Rlc3QoYWRhcHRlciwgJmRhdGFbMl0pKQorCQlpZiAoZTEwMDBfaW50cl90ZXN0KGFkYXB0ZXIsICZkYXRhWzJdKSkKIAkJCWV0aF90ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CiAKIAkJZTEwMDBfcmVzZXQoYWRhcHRlcik7Ci0JCWlmKGUxMDAwX2xvb3BiYWNrX3Rlc3QoYWRhcHRlciwgJmRhdGFbM10pKQorCQlpZiAoZTEwMDBfbG9vcGJhY2tfdGVzdChhZGFwdGVyLCAmZGF0YVszXSkpCiAJCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOwogCiAJCS8qIHJlc3RvcmUgc3BlZWQsIGR1cGxleCwgYXV0b25lZyBzZXR0aW5ncyAqLwpAQCAtMTU4MSwxMSArMTYxMCwxMSBAQAogCQlhZGFwdGVyLT5ody5hdXRvbmVnID0gYXV0b25lZzsKIAogCQllMTAwMF9yZXNldChhZGFwdGVyKTsKLQkJaWYoaWZfcnVubmluZykKKwkJaWYgKGlmX3J1bm5pbmcpCiAJCQllMTAwMF91cChhZGFwdGVyKTsKIAl9IGVsc2UgewogCQkvKiBPbmxpbmUgdGVzdHMgKi8KLQkJaWYoZTEwMDBfbGlua190ZXN0KGFkYXB0ZXIsICZkYXRhWzRdKSkKKwkJaWYgKGUxMDAwX2xpbmtfdGVzdChhZGFwdGVyLCAmZGF0YVs0XSkpCiAJCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOwogCiAJCS8qIE9mZmxpbmUgdGVzdHMgYXJlbid0IHJ1bjsgcGFzcyBieSBkZWZhdWx0ICovCkBAIC0xNjAzLDcgKzE2MzIsNyBAQAogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCi0Jc3dpdGNoKGFkYXB0ZXItPmh3LmRldmljZV9pZCkgeworCXN3aXRjaCAoYWRhcHRlci0+aHcuZGV2aWNlX2lkKSB7CiAJY2FzZSBFMTAwMF9ERVZfSURfODI1NDI6CiAJY2FzZSBFMTAwMF9ERVZfSURfODI1NDNHQ19GSUJFUjoKIAljYXNlIEUxMDAwX0RFVl9JRF84MjU0M0dDX0NPUFBFUjoKQEAgLTE2MTcsOCArMTY0Niw5IEBACiAKIAljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkVCX0ZJQkVSOgogCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2R0JfRklCRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NzFFQl9GSUJFUjoKIAkJLyogV2FrZSBldmVudHMgb25seSBzdXBwb3J0ZWQgb24gcG9ydCBBIGZvciBkdWFsIGZpYmVyICovCi0JCWlmKEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpICYgRTEwMDBfU1RBVFVTX0ZVTkNfMSkgeworCQlpZiAoRTEwMDBfUkVBRF9SRUcoaHcsIFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfRlVOQ18xKSB7CiAJCQl3b2wtPnN1cHBvcnRlZCA9IDA7CiAJCQl3b2wtPndvbG9wdHMgICA9IDA7CiAJCQlyZXR1cm47CkBAIC0xNjMwLDEzICsxNjYwLDEzIEBACiAJCQkJIFdBS0VfQkNBU1QgfCBXQUtFX01BR0lDOwogCiAJCXdvbC0+d29sb3B0cyA9IDA7Ci0JCWlmKGFkYXB0ZXItPndvbCAmIEUxMDAwX1dVRkNfRVgpCisJCWlmIChhZGFwdGVyLT53b2wgJiBFMTAwMF9XVUZDX0VYKQogCQkJd29sLT53b2xvcHRzIHw9IFdBS0VfVUNBU1Q7Ci0JCWlmKGFkYXB0ZXItPndvbCAmIEUxMDAwX1dVRkNfTUMpCisJCWlmIChhZGFwdGVyLT53b2wgJiBFMTAwMF9XVUZDX01DKQogCQkJd29sLT53b2xvcHRzIHw9IFdBS0VfTUNBU1Q7Ci0JCWlmKGFkYXB0ZXItPndvbCAmIEUxMDAwX1dVRkNfQkMpCisJCWlmIChhZGFwdGVyLT53b2wgJiBFMTAwMF9XVUZDX0JDKQogCQkJd29sLT53b2xvcHRzIHw9IFdBS0VfQkNBU1Q7Ci0JCWlmKGFkYXB0ZXItPndvbCAmIEUxMDAwX1dVRkNfTUFHKQorCQlpZiAoYWRhcHRlci0+d29sICYgRTEwMDBfV1VGQ19NQUcpCiAJCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9NQUdJQzsKIAkJcmV0dXJuOwogCX0KQEAgLTE2NDgsNyArMTY3OCw3IEBACiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAKLQlzd2l0Y2goYWRhcHRlci0+aHcuZGV2aWNlX2lkKSB7CisJc3dpdGNoIChhZGFwdGVyLT5ody5kZXZpY2VfaWQpIHsKIAljYXNlIEUxMDAwX0RFVl9JRF84MjU0MjoKIAljYXNlIEUxMDAwX0RFVl9JRF84MjU0M0dDX0ZJQkVSOgogCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQzR0NfQ09QUEVSOgpAQCAtMTY2MCwyNCArMTY5MCwyNSBAQAogCiAJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZFQl9GSUJFUjoKIAljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkdCX0ZJQkVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfRklCRVI6CiAJCS8qIFdha2UgZXZlbnRzIG9ubHkgc3VwcG9ydGVkIG9uIHBvcnQgQSBmb3IgZHVhbCBmaWJlciAqLwotCQlpZihFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19GVU5DXzEpCisJCWlmIChFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19GVU5DXzEpCiAJCQlyZXR1cm4gd29sLT53b2xvcHRzID8gLUVPUE5PVFNVUFAgOiAwOwogCQkvKiBGYWxsIFRocm91Z2ggKi8KIAogCWRlZmF1bHQ6Ci0JCWlmKHdvbC0+d29sb3B0cyAmIChXQUtFX1BIWSB8IFdBS0VfQVJQIHwgV0FLRV9NQUdJQ1NFQ1VSRSkpCisJCWlmICh3b2wtPndvbG9wdHMgJiAoV0FLRV9QSFkgfCBXQUtFX0FSUCB8IFdBS0VfTUFHSUNTRUNVUkUpKQogCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJCWFkYXB0ZXItPndvbCA9IDA7CiAKLQkJaWYod29sLT53b2xvcHRzICYgV0FLRV9VQ0FTVCkKKwkJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfVUNBU1QpCiAJCQlhZGFwdGVyLT53b2wgfD0gRTEwMDBfV1VGQ19FWDsKLQkJaWYod29sLT53b2xvcHRzICYgV0FLRV9NQ0FTVCkKKwkJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfTUNBU1QpCiAJCQlhZGFwdGVyLT53b2wgfD0gRTEwMDBfV1VGQ19NQzsKLQkJaWYod29sLT53b2xvcHRzICYgV0FLRV9CQ0FTVCkKKwkJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfQkNBU1QpCiAJCQlhZGFwdGVyLT53b2wgfD0gRTEwMDBfV1VGQ19CQzsKLQkJaWYod29sLT53b2xvcHRzICYgV0FLRV9NQUdJQykKKwkJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfTUFHSUMpCiAJCQlhZGFwdGVyLT53b2wgfD0gRTEwMDBfV1VGQ19NQUc7CiAJfQogCkBAIC0xNjk1LDcgKzE3MjYsNyBAQAogewogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBlMTAwMF9hZGFwdGVyICopIGRhdGE7CiAKLQlpZih0ZXN0X2FuZF9jaGFuZ2VfYml0KEUxMDAwX0xFRF9PTiwgJmFkYXB0ZXItPmxlZF9zdGF0dXMpKQorCWlmICh0ZXN0X2FuZF9jaGFuZ2VfYml0KEUxMDAwX0xFRF9PTiwgJmFkYXB0ZXItPmxlZF9zdGF0dXMpKQogCQllMTAwMF9sZWRfb2ZmKCZhZGFwdGVyLT5odyk7CiAJZWxzZQogCQllMTAwMF9sZWRfb24oJmFkYXB0ZXItPmh3KTsKQEAgLTE3MDgsMTEgKzE3MzksMTEgQEAKIHsKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKLQlpZighZGF0YSB8fCBkYXRhID4gKHVpbnQzMl90KShNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKSkKKwlpZiAoIWRhdGEgfHwgZGF0YSA+ICh1aW50MzJfdCkoTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWikpCiAJCWRhdGEgPSAodWludDMyX3QpKE1BWF9TQ0hFRFVMRV9USU1FT1VUIC8gSFopOwogCi0JaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU3MSkgewotCQlpZighYWRhcHRlci0+YmxpbmtfdGltZXIuZnVuY3Rpb24pIHsKKwlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU3MSkgeworCQlpZiAoIWFkYXB0ZXItPmJsaW5rX3RpbWVyLmZ1bmN0aW9uKSB7CiAJCQlpbml0X3RpbWVyKCZhZGFwdGVyLT5ibGlua190aW1lcik7CiAJCQlhZGFwdGVyLT5ibGlua190aW1lci5mdW5jdGlvbiA9IGUxMDAwX2xlZF9ibGlua19jYWxsYmFjazsKIAkJCWFkYXB0ZXItPmJsaW5rX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgYWRhcHRlcjsKQEAgLTE3MjEsMjEgKzE3NTIsMjEgQEAKIAkJbW9kX3RpbWVyKCZhZGFwdGVyLT5ibGlua190aW1lciwgamlmZmllcyk7CiAJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGRhdGEgKiAxMDAwKTsKIAkJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPmJsaW5rX3RpbWVyKTsKLQl9Ci0JZWxzZSBpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTczKSB7Ci0JCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIExFRENUTCwgKEUxMDAwX0xFRENUTF9MRUQyX0JMSU5LX1JBVEUgfAotCQkJRTEwMDBfTEVEQ1RMX0xFRDBfQkxJTksgfCBFMTAwMF9MRURDVExfTEVEMl9CTElOSyB8Ci0JCQkoRTEwMDBfTEVEQ1RMX01PREVfTEVEX09OIDw8IEUxMDAwX0xFRENUTF9MRUQyX01PREVfU0hJRlQpIHwKLQkJCShFMTAwMF9MRURDVExfTU9ERV9MSU5LX0FDVElWSVRZIDw8IEUxMDAwX0xFRENUTF9MRUQwX01PREVfU0hJRlQpIHwKLQkJCShFMTAwMF9MRURDVExfTU9ERV9MRURfT0ZGIDw8IEUxMDAwX0xFRENUTF9MRUQxX01PREVfU0hJRlQpKSk7CisJfSBlbHNlIGlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTczKSB7CisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIExFRENUTCwKKwkJCShFMTAwMF9MRURDVExfTEVEMl9CTElOS19SQVRFIHwKKwkJCSBFMTAwMF9MRURDVExfTEVEMF9CTElOSyB8IEUxMDAwX0xFRENUTF9MRUQyX0JMSU5LIHwKKwkJCSAoRTEwMDBfTEVEQ1RMX01PREVfTEVEX09OIDw8IEUxMDAwX0xFRENUTF9MRUQyX01PREVfU0hJRlQpIHwKKwkJCSAoRTEwMDBfTEVEQ1RMX01PREVfTElOS19BQ1RJVklUWSA8PCBFMTAwMF9MRURDVExfTEVEMF9NT0RFX1NISUZUKSB8CisJCQkgKEUxMDAwX0xFRENUTF9NT0RFX0xFRF9PRkYgPDwgRTEwMDBfTEVEQ1RMX0xFRDFfTU9ERV9TSElGVCkpKTsKIAkJbXNsZWVwX2ludGVycnVwdGlibGUoZGF0YSAqIDEwMDApOwotCX0KLQllbHNlIHsKLQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgTEVEQ1RMLCAoRTEwMDBfTEVEQ1RMX0xFRDJfQkxJTktfUkFURSB8Ci0JCQlFMTAwMF9MRURDVExfTEVEMV9CTElOSyB8IEUxMDAwX0xFRENUTF9MRUQyX0JMSU5LIHwgCi0JCQkoRTEwMDBfTEVEQ1RMX01PREVfTEVEX09OIDw8IEUxMDAwX0xFRENUTF9MRUQyX01PREVfU0hJRlQpIHwKLQkJCShFMTAwMF9MRURDVExfTU9ERV9MSU5LX0FDVElWSVRZIDw8IEUxMDAwX0xFRENUTF9MRUQxX01PREVfU0hJRlQpIHwKLQkJCShFMTAwMF9MRURDVExfTU9ERV9MRURfT0ZGIDw8IEUxMDAwX0xFRENUTF9MRUQwX01PREVfU0hJRlQpKSk7CisJfSBlbHNlIHsKKwkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgTEVEQ1RMLAorCQkJKEUxMDAwX0xFRENUTF9MRUQyX0JMSU5LX1JBVEUgfAorCQkJIEUxMDAwX0xFRENUTF9MRUQxX0JMSU5LIHwgRTEwMDBfTEVEQ1RMX0xFRDJfQkxJTksgfAorCQkJIChFMTAwMF9MRURDVExfTU9ERV9MRURfT04gPDwgRTEwMDBfTEVEQ1RMX0xFRDJfTU9ERV9TSElGVCkgfAorCQkJIChFMTAwMF9MRURDVExfTU9ERV9MSU5LX0FDVElWSVRZIDw8IEUxMDAwX0xFRENUTF9MRUQxX01PREVfU0hJRlQpIHwKKwkJCSAoRTEwMDBfTEVEQ1RMX01PREVfTEVEX09GRiA8PCBFMTAwMF9MRURDVExfTEVEMF9NT0RFX1NISUZUKSkpOwogCQltc2xlZXBfaW50ZXJydXB0aWJsZShkYXRhICogMTAwMCk7CiAJfQogCkBAIC0xNzUwLDUwICsxNzgxLDg5IEBACiBlMTAwMF9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWlmKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKIAkJZTEwMDBfZG93bihhZGFwdGVyKTsKIAkJZTEwMDBfdXAoYWRhcHRlcik7CiAJfQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IAorc3RhdGljIGludAogZTEwMDBfZ2V0X3N0YXRzX2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJcmV0dXJuIEUxMDAwX1NUQVRTX0xFTjsKIH0KIAotc3RhdGljIHZvaWQgCi1lMTAwMF9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCAKK3N0YXRpYyB2b2lkCitlMTAwMF9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQlzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHVpbnQ2NF90ICpkYXRhKQogewogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKyNpZmRlZiBDT05GSUdfRTEwMDBfTVEKKwl1aW50NjRfdCAqcXVldWVfc3RhdDsKKwlpbnQgc3RhdF9jb3VudCA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfcXVldWVfc3RhdHMpIC8gc2l6ZW9mKHVpbnQ2NF90KTsKKwlpbnQgaiwgazsKKyNlbmRpZgogCWludCBpOwogCiAJZTEwMDBfdXBkYXRlX3N0YXRzKGFkYXB0ZXIpOwotCWZvcihpID0gMDsgaSA8IEUxMDAwX1NUQVRTX0xFTjsgaSsrKSB7Ci0JCWNoYXIgKnAgPSAoY2hhciAqKWFkYXB0ZXIrZTEwMDBfZ3N0cmluZ3Nfc3RhdHNbaV0uc3RhdF9vZmZzZXQ7CQotCQlkYXRhW2ldID0gKGUxMDAwX2dzdHJpbmdzX3N0YXRzW2ldLnNpemVvZl9zdGF0ID09IAorCWZvciAoaSA9IDA7IGkgPCBFMTAwMF9HTE9CQUxfU1RBVFNfTEVOOyBpKyspIHsKKwkJY2hhciAqcCA9IChjaGFyICopYWRhcHRlcitlMTAwMF9nc3RyaW5nc19zdGF0c1tpXS5zdGF0X29mZnNldDsKKwkJZGF0YVtpXSA9IChlMTAwMF9nc3RyaW5nc19zdGF0c1tpXS5zaXplb2Zfc3RhdCA9PQogCQkJc2l6ZW9mKHVpbnQ2NF90KSkgPyAqKHVpbnQ2NF90ICopcCA6ICoodWludDMyX3QgKilwOwogCX0KKyNpZmRlZiBDT05GSUdfRTEwMDBfTVEKKwlmb3IgKGogPSAwOyBqIDwgYWRhcHRlci0+bnVtX3R4X3F1ZXVlczsgaisrKSB7CisJCXF1ZXVlX3N0YXQgPSAodWludDY0X3QgKikmYWRhcHRlci0+dHhfcmluZ1tqXS50eF9zdGF0czsKKwkJZm9yIChrID0gMDsgayA8IHN0YXRfY291bnQ7IGsrKykKKwkJCWRhdGFbaSArIGtdID0gcXVldWVfc3RhdFtrXTsKKwkJaSArPSBrOworCX0KKwlmb3IgKGogPSAwOyBqIDwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlczsgaisrKSB7CisJCXF1ZXVlX3N0YXQgPSAodWludDY0X3QgKikmYWRhcHRlci0+cnhfcmluZ1tqXS5yeF9zdGF0czsKKwkJZm9yIChrID0gMDsgayA8IHN0YXRfY291bnQ7IGsrKykKKwkJCWRhdGFbaSArIGtdID0gcXVldWVfc3RhdFtrXTsKKwkJaSArPSBrOworCX0KKyNlbmRpZgorLyoJQlVHX09OKGkgIT0gRTEwMDBfU1RBVFNfTEVOKTsgKi8KIH0KIAotc3RhdGljIHZvaWQgCitzdGF0aWMgdm9pZAogZTEwMDBfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDMyX3Qgc3RyaW5nc2V0LCB1aW50OF90ICpkYXRhKQogeworI2lmZGVmIENPTkZJR19FMTAwMF9NUQorCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKyNlbmRpZgorCXVpbnQ4X3QgKnAgPSBkYXRhOwogCWludCBpOwogCi0Jc3dpdGNoKHN0cmluZ3NldCkgeworCXN3aXRjaCAoc3RyaW5nc2V0KSB7CiAJY2FzZSBFVEhfU1NfVEVTVDoKLQkJbWVtY3B5KGRhdGEsICplMTAwMF9nc3RyaW5nc190ZXN0LCAKKwkJbWVtY3B5KGRhdGEsICplMTAwMF9nc3RyaW5nc190ZXN0LAogCQkJRTEwMDBfVEVTVF9MRU4qRVRIX0dTVFJJTkdfTEVOKTsKIAkJYnJlYWs7CiAJY2FzZSBFVEhfU1NfU1RBVFM6Ci0JCWZvciAoaT0wOyBpIDwgRTEwMDBfU1RBVFNfTEVOOyBpKyspIHsKLQkJCW1lbWNweShkYXRhICsgaSAqIEVUSF9HU1RSSU5HX0xFTiwgCi0JCQllMTAwMF9nc3RyaW5nc19zdGF0c1tpXS5zdGF0X3N0cmluZywKLQkJCUVUSF9HU1RSSU5HX0xFTik7CisJCWZvciAoaSA9IDA7IGkgPCBFMTAwMF9HTE9CQUxfU1RBVFNfTEVOOyBpKyspIHsKKwkJCW1lbWNweShwLCBlMTAwMF9nc3RyaW5nc19zdGF0c1tpXS5zdGF0X3N0cmluZywKKwkJCSAgICAgICBFVEhfR1NUUklOR19MRU4pOworCQkJcCArPSBFVEhfR1NUUklOR19MRU47CiAJCX0KKyNpZmRlZiBDT05GSUdfRTEwMDBfTVEKKwkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV90eF9xdWV1ZXM7IGkrKykgeworCQkJc3ByaW50ZihwLCAidHhfcXVldWVfJXVfcGFja2V0cyIsIGkpOworCQkJcCArPSBFVEhfR1NUUklOR19MRU47CisJCQlzcHJpbnRmKHAsICJ0eF9xdWV1ZV8ldV9ieXRlcyIsIGkpOworCQkJcCArPSBFVEhfR1NUUklOR19MRU47CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9yeF9xdWV1ZXM7IGkrKykgeworCQkJc3ByaW50ZihwLCAicnhfcXVldWVfJXVfcGFja2V0cyIsIGkpOworCQkJcCArPSBFVEhfR1NUUklOR19MRU47CisJCQlzcHJpbnRmKHAsICJyeF9xdWV1ZV8ldV9ieXRlcyIsIGkpOworCQkJcCArPSBFVEhfR1NUUklOR19MRU47CisJCX0KKyNlbmRpZgorLyoJCUJVR19PTihwIC0gZGF0YSAhPSBFMTAwMF9TVEFUU19MRU4gKiBFVEhfR1NUUklOR19MRU4pOyAqLwogCQlicmVhazsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuYwppbmRleCAxMzZmYzAzLi5iZWVlYzBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmMKQEAgLTMxOCw2ICszMTgsOCBAQAogICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2R0JfRklCRVI6CiAgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9TRVJERVM6CiAgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9QQ0lFOgorICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2R0JfUVVBRF9DT1BQRVI6CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9RVUFEX0NPUFBFUl9LU1AzOgogICAgICAgICBody0+bWFjX3R5cGUgPSBlMTAwMF84MjU0Nl9yZXZfMzsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDFFSToKQEAgLTYzOSw2ICs2NDEsNyBAQAogICAgIHVpbnQxNl90IGNtZF9tbXJiYzsKICAgICB1aW50MTZfdCBzdGF0X21tcmJjOwogICAgIHVpbnQzMl90IG10YV9zaXplOworICAgIHVpbnQzMl90IGN0cmxfZXh0OwogCiAgICAgREVCVUdGVU5DKCJlMTAwMF9pbml0X2h3Iik7CiAKQEAgLTczNSw3ICs3MzgsNiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgZTEwMDBfODI1NzE6CiAgICAgICAgIGNhc2UgZTEwMDBfODI1NzI6Ci0gICAgICAgICAgICBjdHJsIHw9ICgxIDw8IDIyKTsKICAgICAgICAgY2FzZSBlMTAwMF84MjU3MzoKICAgICAgICAgICAgIGN0cmwgfD0gRTEwMDBfVFhEQ1RMX0NPVU5UX0RFU0M7CiAgICAgICAgICAgICBicmVhazsKQEAgLTc3NSw2ICs3NzcsMTUgQEAKICAgICAgKi8KICAgICBlMTAwMF9jbGVhcl9od19jbnRycyhodyk7CiAKKyAgICBpZiAoaHctPmRldmljZV9pZCA9PSBFMTAwMF9ERVZfSURfODI1NDZHQl9RVUFEX0NPUFBFUiB8fAorICAgICAgICBody0+ZGV2aWNlX2lkID09IEUxMDAwX0RFVl9JRF84MjU0NkdCX1FVQURfQ09QUEVSX0tTUDMpIHsKKyAgICAgICAgY3RybF9leHQgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTF9FWFQpOworICAgICAgICAvKiBSZWxheGVkIG9yZGVyaW5nIG11c3QgYmUgZGlzYWJsZWQgdG8gYXZvaWQgYSBwYXJpdHkKKyAgICAgICAgICogZXJyb3IgY3Jhc2ggaW4gYSBQQ0kgc2xvdC4gKi8KKyAgICAgICAgY3RybF9leHQgfD0gRTEwMDBfQ1RSTF9FWFRfUk9fRElTOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkxfRVhULCBjdHJsX2V4dCk7CisgICAgfQorCiAgICAgcmV0dXJuIHJldF92YWw7CiB9CiAKQEAgLTgzOCw2ICs4NDksMTEgQEAKIAogICAgIERFQlVHRlVOQygiZTEwMDBfc2V0dXBfbGluayIpOwogCisgICAgLyogSW4gdGhlIGNhc2Ugb2YgdGhlIHBoeSByZXNldCBiZWluZyBibG9ja2VkLCB3ZSBhbHJlYWR5IGhhdmUgYSBsaW5rLgorICAgICAqIFdlIGRvIG5vdCBoYXZlIHRvIHNldCBpdCB1cCBhZ2Fpbi4gKi8KKyAgICBpZiAoZTEwMDBfY2hlY2tfcGh5X3Jlc2V0X2Jsb2NrKGh3KSkKKyAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisKICAgICAvKiBSZWFkIGFuZCBzdG9yZSB3b3JkIDB4MEYgb2YgdGhlIEVFUFJPTS4gVGhpcyB3b3JkIGNvbnRhaW5zIGJpdHMKICAgICAgKiB0aGF0IGRldGVybWluZSB0aGUgaGFyZHdhcmUncyBkZWZhdWx0IFBBVVNFIChmbG93IGNvbnRyb2wpIG1vZGUsCiAgICAgICogYSBiaXQgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIEhXIGRlZmF1bHRzIHRvIGVuYWJsaW5nIG9yCkBAIC0xNTg0LDEwICsxNjAwLDEwIEBACiAgICAgaWYocmV0X3ZhbCkKICAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKLSAgICAgICAgLyogUmVhZCB0aGUgTUlJIDEwMDBCYXNlLVQgQ29udHJvbCBSZWdpc3RlciAoQWRkcmVzcyA5KS4gKi8KLSAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZXzEwMDBUX0NUUkwsICZtaWlfMTAwMHRfY3RybF9yZWcpOwotICAgICAgICBpZihyZXRfdmFsKQotICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgLyogUmVhZCB0aGUgTUlJIDEwMDBCYXNlLVQgQ29udHJvbCBSZWdpc3RlciAoQWRkcmVzcyA5KS4gKi8KKyAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfQ1RSTCwgJm1paV8xMDAwdF9jdHJsX3JlZyk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CiAKICAgICAvKiBOZWVkIHRvIHBhcnNlIGJvdGggYXV0b25lZ19hZHZlcnRpc2VkIGFuZCBmYyBhbmQgc2V0IHVwCiAgICAgICogdGhlIGFwcHJvcHJpYXRlIFBIWSByZWdpc3RlcnMuICBGaXJzdCB3ZSB3aWxsIHBhcnNlIGZvcgpAQCAtMTkyOSwxNCArMTk0NSwxOSBAQAogdm9pZAogZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7Ci0gICAgdWludDMyX3QgdGN0bDsKKyAgICB1aW50MzJfdCB0Y3RsLCBjb2xsX2Rpc3Q7CiAKICAgICBERUJVR0ZVTkMoImUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdCIpOwogCisgICAgaWYgKGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTQzKQorICAgICAgICBjb2xsX2Rpc3QgPSBFMTAwMF9DT0xMSVNJT05fRElTVEFOQ0VfODI1NDI7CisgICAgZWxzZQorICAgICAgICBjb2xsX2Rpc3QgPSBFMTAwMF9DT0xMSVNJT05fRElTVEFOQ0U7CisKICAgICB0Y3RsID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRDVEwpOwogCiAgICAgdGN0bCAmPSB+RTEwMDBfVENUTF9DT0xEOwotICAgIHRjdGwgfD0gRTEwMDBfQ09MTElTSU9OX0RJU1RBTkNFIDw8IEUxMDAwX0NPTERfU0hJRlQ7CisgICAgdGN0bCB8PSBjb2xsX2Rpc3QgPDwgRTEwMDBfQ09MRF9TSElGVDsKIAogICAgIEUxMDAwX1dSSVRFX1JFRyhodywgVENUTCwgdGN0bCk7CiAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOwpAQCAtMjk4Miw2ICszMDAzLDggQEAKICAgICAgICAgCiAgICAgICAgIGlmIChody0+bWFjX3R5cGUgPCBlMTAwMF84MjU3MSkgCiAgICAgICAgICAgICBtc2VjX2RlbGF5KDEwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdWRlbGF5KDEwMCk7CiAgICAgICAgIAogICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwpOwogICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CkBAIC0zODgxLDE3ICszOTA0LDE5IEBACiAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKICAgICB9CiAKLSAgICAvKiBGTEFTSCByZWFkcyB3aXRob3V0IGFjcXVpcmluZyB0aGUgc2VtYXBob3JlIGFyZSBzYWZlIGluIDgyNTczLWJhc2VkCi0gICAgICogY29udHJvbGxlcnMuCi0gICAgICovCi0gICAgaWYgKChlMTAwMF9pc19vbmJvYXJkX252bV9lZXByb20oaHcpID09IFRSVUUpIHx8Ci0gICAgICAgIChody0+bWFjX3R5cGUgIT0gZTEwMDBfODI1NzMpKSB7Ci0gICAgICAgIC8qIFByZXBhcmUgdGhlIEVFUFJPTSBmb3IgcmVhZGluZyAgKi8KLSAgICAgICAgaWYoZTEwMDBfYWNxdWlyZV9lZXByb20oaHcpICE9IEUxMDAwX1NVQ0NFU1MpCi0gICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisgICAgLyogRkxBU0ggcmVhZHMgd2l0aG91dCBhY3F1aXJpbmcgdGhlIHNlbWFwaG9yZSBhcmUgc2FmZSAqLworICAgIGlmIChlMTAwMF9pc19vbmJvYXJkX252bV9lZXByb20oaHcpID09IFRSVUUgJiYKKyAgICBody0+ZWVwcm9tLnVzZV9lZXJkID09IEZBTFNFKSB7CisgICAgICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBQcmVwYXJlIHRoZSBFRVBST00gZm9yIHJlYWRpbmcgICovCisgICAgICAgICAgICBpZiAoZTEwMDBfYWNxdWlyZV9lZXByb20oaHcpICE9IEUxMDAwX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBpZihlZXByb20tPnVzZV9lZXJkID09IFRSVUUpIHsKKyAgICBpZiAoZWVwcm9tLT51c2VfZWVyZCA9PSBUUlVFKSB7CiAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX2VlcHJvbV9lZXJkKGh3LCBvZmZzZXQsIHdvcmRzLCBkYXRhKTsKICAgICAgICAgaWYgKChlMTAwMF9pc19vbmJvYXJkX252bV9lZXByb20oaHcpID09IFRSVUUpIHx8CiAgICAgICAgICAgICAoaHctPm1hY190eXBlICE9IGUxMDAwXzgyNTczKSkKQEAgLTQzOTgsNyArNDQyMyw3IEBACiAgICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CiAgICAgICAgIH0KIAotCS8qIElmIFNUTSBvcGNvZGUgbG9jYXRlZCBpbiBiaXRzIDE1Ojggb2YgZmxvcCwgcmVzZXQgZmlybXdhcmUgKi8KKyAgICAgICAgLyogSWYgU1RNIG9wY29kZSBsb2NhdGVkIGluIGJpdHMgMTU6OCBvZiBmbG9wLCByZXNldCBmaXJtd2FyZSAqLwogICAgICAgICBpZiAoKGZsb3AgJiAweEZGMDApID09IEUxMDAwX1NUTV9PUENPREUpIHsKICAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgSElDUiwgRTEwMDBfSElDUl9GV19SRVNFVCk7CiAgICAgICAgIH0KQEAgLTQ0MDYsNyArNDQzMSw3IEBACiAgICAgICAgIC8qIFBlcmZvcm0gdGhlIGZsYXNoIHVwZGF0ZSAqLwogICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QgfCBFMTAwMF9FRUNEX0ZMVVBEKTsKIAotCWZvciAoaT0wOyBpIDwgYXR0ZW1wdHM7IGkrKykgeworICAgICAgICBmb3IgKGk9MDsgaSA8IGF0dGVtcHRzOyBpKyspIHsKICAgICAgICAgICAgIGVlY2QgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVDRCk7CiAgICAgICAgICAgICBpZiAoKGVlY2QgJiBFMTAwMF9FRUNEX0ZMVVBEKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC00NDc5LDYgKzQ1MDQsNyBAQAogICAgICAgICBody0+cGVybV9tYWNfYWRkcltpXSA9ICh1aW50OF90KSAoZWVwcm9tX2RhdGEgJiAweDAwRkYpOwogICAgICAgICBody0+cGVybV9tYWNfYWRkcltpKzFdID0gKHVpbnQ4X3QpIChlZXByb21fZGF0YSA+PiA4KTsKICAgICB9CisKICAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgewogICAgIGRlZmF1bHQ6CiAgICAgICAgIGJyZWFrOwpAQCAtNjcyMCw2ICs2NzQ2LDEyIEBACiAgICAgICAgIGJyZWFrOwogICAgIH0KIAorICAgIC8qIFBIWSBjb25maWd1cmF0aW9uIGZyb20gTlZNIGp1c3Qgc3RhcnRzIGFmdGVyIEVFQ0RfQVVUT19SRCBzZXRzIHRvIGhpZ2guCisgICAgICogTmVlZCB0byB3YWl0IGZvciBQSFkgY29uZmlndXJhdGlvbiBjb21wbGV0aW9uIGJlZm9yZSBhY2Nlc3NpbmcgTlZNCisgICAgICogYW5kIFBIWS4gKi8KKyAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTczKQorICAgICAgICBtc2VjX2RlbGF5KDI1KTsKKwogICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCkBAIC02ODA5LDcgKzY4NDEsOCBAQAogZTEwMDBfY2hlY2tfcGh5X3Jlc2V0X2Jsb2NrKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7CiAgICAgdWludDMyX3QgbWFuYyA9IDA7Ci0gICAgaWYoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDdfcmV2XzIpCisKKyAgICBpZiAoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDdfcmV2XzIpCiAgICAgICAgIG1hbmMgPSBFMTAwMF9SRUFEX1JFRyhodywgTUFOQyk7CiAgICAgcmV0dXJuIChtYW5jICYgRTEwMDBfTUFOQ19CTEtfUEhZX1JTVF9PTl9JREUpID8KIAkgICAgRTEwMDBfQkxLX1BIWV9SRVNFVCA6IEUxMDAwX1NVQ0NFU1M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5oIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuaAppbmRleCA3Y2FhMzU3Li5mMTIxOWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5oCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmgKQEAgLTM3Nyw2ICszNzcsNyBAQAogdm9pZCBlMTAwMF9zd2Z3X3N5bmNfcmVsZWFzZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MTZfdCBtYXNrKTsKIAogLyogRmlsdGVycyAobXVsdGljYXN0LCB2bGFuLCByZWNlaXZlKSAqLwordm9pZCBlMTAwMF9tY19hZGRyX2xpc3RfdXBkYXRlKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQ4X3QgKiBtY19hZGRyX2xpc3QsIHVpbnQzMl90IG1jX2FkZHJfY291bnQsIHVpbnQzMl90IHBhZCwgdWludDMyX3QgcmFyX3VzZWRfY291bnQpOwogdWludDMyX3QgZTEwMDBfaGFzaF9tY19hZGRyKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQ4X3QgKiBtY19hZGRyKTsKIHZvaWQgZTEwMDBfbXRhX3NldChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCBoYXNoX3ZhbHVlKTsKIHZvaWQgZTEwMDBfcmFyX3NldChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50OF90ICogbWNfYWRkciwgdWludDMyX3QgcmFyX2luZGV4KTsKQEAgLTQwMSw3ICs0MDIsOSBAQAogdm9pZCBlMTAwMF93cml0ZV9wY2lfY2ZnKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IHJlZywgdWludDE2X3QgKiB2YWx1ZSk7CiAvKiBQb3J0IEkvTyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MjU0NCBhbmQgbmV3ZXIgKi8KIHVpbnQzMl90IGUxMDAwX2lvX3JlYWQoc3RydWN0IGUxMDAwX2h3ICpodywgdW5zaWduZWQgbG9uZyBwb3J0KTsKK3VpbnQzMl90IGUxMDAwX3JlYWRfcmVnX2lvKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IG9mZnNldCk7CiB2b2lkIGUxMDAwX2lvX3dyaXRlKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVuc2lnbmVkIGxvbmcgcG9ydCwgdWludDMyX3QgdmFsdWUpOwordm9pZCBlMTAwMF9lbmFibGVfcGNpZXhfbWFzdGVyKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogaW50MzJfdCBlMTAwMF9kaXNhYmxlX3BjaWV4X21hc3RlcihzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIGludDMyX3QgZTEwMDBfZ2V0X3NvZnR3YXJlX3NlbWFwaG9yZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIHZvaWQgZTEwMDBfcmVsZWFzZV9zb2Z0d2FyZV9zZW1hcGhvcmUoc3RydWN0IGUxMDAwX2h3ICpodyk7CkBAIC00MzksNiArNDQyLDcgQEAKICNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ2R0JfRklCRVIgICAgICAgMHgxMDdBCiAjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NkdCX1NFUkRFUyAgICAgIDB4MTA3QgogI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDZHQl9QQ0lFICAgICAgICAweDEwOEEKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ2R0JfUVVBRF9DT1BQRVIgMHgxMDk5CiAjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0N0VJICAgICAgICAgICAgIDB4MTAxOQogI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzFFQl9DT1BQRVIgICAgICAweDEwNUUKICNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTcxRUJfRklCRVIgICAgICAgMHgxMDVGCkBAIC00NDksNiArNDUzLDcgQEAKICNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTczRSAgICAgICAgICAgICAgMHgxMDhCCiAjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU3M0VfSUFNVCAgICAgICAgIDB4MTA4QwogI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzNMICAgICAgICAgICAgICAweDEwOUEKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ2R0JfUVVBRF9DT1BQRVJfS1NQMyAweDEwQjUKIAogCiAjZGVmaW5lIE5PREVfQUREUkVTU19TSVpFIDYKQEAgLTg5NywxNCArOTAyLDE0IEBACiAjZGVmaW5lIEUxMDAwX1RYRENUTCAgIDB4MDM4MjggIC8qIFRYIERlc2NyaXB0b3IgQ29udHJvbCAtIFJXICovCiAjZGVmaW5lIEUxMDAwX1RBRFYgICAgIDB4MDM4MkMgIC8qIFRYIEludGVycnVwdCBBYnNvbHV0ZSBEZWxheSBWYWwgLSBSVyAqLwogI2RlZmluZSBFMTAwMF9UU1BNVCAgICAweDAzODMwICAvKiBUQ1AgU2VnbWVudGF0aW9uIFBBRCAmIE1pbiBUaHJlc2hvbGQgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9UQVJDMCAgICAweDAzODQwIC8qIFRYIEFyYml0cmF0aW9uIENvdW50ICgwKSAqLwotI2RlZmluZSBFMTAwMF9UREJBTDEgICAweDAzOTAwIC8qIFRYIERlc2MgQmFzZSBBZGRyZXNzIExvdyAoMSkgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9UREJBSDEgICAweDAzOTA0IC8qIFRYIERlc2MgQmFzZSBBZGRyZXNzIEhpZ2ggKDEpIC0gUlcgKi8KLSNkZWZpbmUgRTEwMDBfVERMRU4xICAgMHgwMzkwOCAvKiBUWCBEZXNjIExlbmd0aCAoMSkgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9UREgxICAgICAweDAzOTEwIC8qIFRYIERlc2MgSGVhZCAoMSkgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9URFQxICAgICAweDAzOTE4IC8qIFRYIERlc2MgVGFpbCAoMSkgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9UWERDVEwxICAweDAzOTI4IC8qIFRYIERlc2NyaXB0b3IgQ29udHJvbCAoMSkgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9UQVJDMSAgICAweDAzOTQwIC8qIFRYIEFyYml0cmF0aW9uIENvdW50ICgxKSAqLworI2RlZmluZSBFMTAwMF9UQVJDMCAgICAweDAzODQwICAvKiBUWCBBcmJpdHJhdGlvbiBDb3VudCAoMCkgKi8KKyNkZWZpbmUgRTEwMDBfVERCQUwxICAgMHgwMzkwMCAgLyogVFggRGVzYyBCYXNlIEFkZHJlc3MgTG93ICgxKSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1REQkFIMSAgIDB4MDM5MDQgIC8qIFRYIERlc2MgQmFzZSBBZGRyZXNzIEhpZ2ggKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERMRU4xICAgMHgwMzkwOCAgLyogVFggRGVzYyBMZW5ndGggKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERIMSAgICAgMHgwMzkxMCAgLyogVFggRGVzYyBIZWFkICgxKSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1REVDEgICAgIDB4MDM5MTggIC8qIFRYIERlc2MgVGFpbCAoMSkgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UWERDVEwxICAweDAzOTI4ICAvKiBUWCBEZXNjcmlwdG9yIENvbnRyb2wgKDEpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVEFSQzEgICAgMHgwMzk0MCAgLyogVFggQXJiaXRyYXRpb24gQ291bnQgKDEpICovCiAjZGVmaW5lIEUxMDAwX0NSQ0VSUlMgIDB4MDQwMDAgIC8qIENSQyBFcnJvciBDb3VudCAtIFIvY2xyICovCiAjZGVmaW5lIEUxMDAwX0FMR05FUlJDIDB4MDQwMDQgIC8qIEFsaWdubWVudCBFcnJvciBDb3VudCAtIFIvY2xyICovCiAjZGVmaW5lIEUxMDAwX1NZTUVSUlMgIDB4MDQwMDggIC8qIFN5bWJvbCBFcnJvciBDb3VudCAtIFIvY2xyICovCkBAIC0xNDk3LDYgKzE1MDIsNyBAQAogI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9FRV9SU1QgICAgMHgwMDAwMjAwMCAvKiBSZWluaXRpYWxpemUgZnJvbSBFRVBST00gKi8KICNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfSVBTICAgICAgIDB4MDAwMDQwMDAgLyogSW52ZXJ0IFBvd2VyIFN0YXRlICovCiAjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NQRF9CWVBTICAweDAwMDA4MDAwIC8qIFNwZWVkIFNlbGVjdCBCeXBhc3MgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfUk9fRElTICAgIDB4MDAwMjAwMDAgLyogUmVsYXhlZCBPcmRlcmluZyBkaXNhYmxlICovCiAjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0xJTktfTU9ERV9NQVNLIDB4MDBDMDAwMDAKICNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfTElOS19NT0RFX0dNSUkgMHgwMDAwMDAwMAogI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9MSU5LX01PREVfVEJJICAweDAwQzAwMDAwCkBAIC0xNzU4LDcgKzE3NjQsNiBAQAogI2RlZmluZSBFMTAwMF9UWERDVExfRlVMTF9UWF9ERVNDX1dCIDB4MDEwMTAwMDAgLyogR1JBTj0xLCBXVEhSRVNIPTEgKi8KICNkZWZpbmUgRTEwMDBfVFhEQ1RMX0NPVU5UX0RFU0MgMHgwMDQwMDAwMCAvKiBFbmFibGUgdGhlIGNvdW50aW5nIG9mIGRlc2MuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RpbGwgdG8gYmUgcHJvY2Vzc2VkLiAqLwotCiAvKiBUcmFuc21pdCBDb25maWd1cmF0aW9uIFdvcmQgKi8KICNkZWZpbmUgRTEwMDBfVFhDV19GRCAgICAgICAgIDB4MDAwMDAwMjAgICAgICAgIC8qIFRYQ1cgZnVsbCBkdXBsZXggKi8KICNkZWZpbmUgRTEwMDBfVFhDV19IRCAgICAgICAgIDB4MDAwMDAwNDAgICAgICAgIC8qIFRYQ1cgaGFsZiBkdXBsZXggKi8KQEAgLTE5NTQsNiArMTk1OSwyMyBAQAogCiAjZGVmaW5lIEUxMDAwX01EQUxJR04gICAgICAgICAgNDA5NgogCisvKiBQQ0ktRXggcmVnaXN0ZXJzICovCisKKy8qIFBDSS1FeCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEUxMDAwX0dDUl9SWERfTk9fU05PT1AJCQkweDAwMDAwMDAxCisjZGVmaW5lIEUxMDAwX0dDUl9SWERTQ1dfTk9fU05PT1AJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRTEwMDBfR0NSX1JYRFNDUl9OT19TTk9PUAkJMHgwMDAwMDAwNAorI2RlZmluZSBFMTAwMF9HQ1JfVFhEX05PX1NOT09QCQkJMHgwMDAwMDAwOAorI2RlZmluZSBFMTAwMF9HQ1JfVFhEU0NXX05PX1NOT09QCQkweDAwMDAwMDEwCisjZGVmaW5lIEUxMDAwX0dDUl9UWERTQ1JfTk9fU05PT1AJCTB4MDAwMDAwMjAKKworI2RlZmluZSBQQ0lfRVhfTk9fU05PT1BfQUxMIChFMTAwMF9HQ1JfUlhEX05PX1NOT09QCQl8IFwKKwkJCQkJCQkgRTEwMDBfR0NSX1JYRFNDV19OT19TTk9PUAl8IFwKKwkJCQkJCQkgRTEwMDBfR0NSX1JYRFNDUl9OT19TTk9PUAl8IFwKKwkJCQkJCQkgRTEwMDBfR0NSIFRYRF9OT19TTk9PUAkJfCBcCisJCQkJCQkJIEUxMDAwX0dDUl9UWERTQ1dfTk9fU05PT1AJfCBcCisJCQkJCQkJIEUxMDAwX0dDUl9UWERTQ1JfTk9fU05PT1ApCisKICNkZWZpbmUgRTEwMDBfR0NSX0wxX0FDVF9XSVRIT1VUX0wwU19SWCAweDA4MDAwMDAwCiAvKiBGdW5jdGlvbiBBY3RpdmUgYW5kIFBvd2VyIFN0YXRlIHRvIE1ORyAqLwogI2RlZmluZSBFMTAwMF9GQUNUUFNfRlVOQzBfUE9XRVJfU1RBVEVfTUFTSyAgICAgICAgIDB4MDAwMDAwMDMKQEAgLTIwNzcsNyArMjA5OSwxMCBAQAogLyogQ29sbGlzaW9uIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCiAjZGVmaW5lIEUxMDAwX0NPTExJU0lPTl9USFJFU0hPTEQgICAgICAgMTUKICNkZWZpbmUgRTEwMDBfQ1RfU0hJRlQgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIEUxMDAwX0NPTExJU0lPTl9ESVNUQU5DRSAgICAgICAgNjQKKy8qIENvbGxpc2lvbiBkaXN0YW5jZSBpcyBhIDAtYmFzZWQgdmFsdWUgdGhhdCBhcHBsaWVzIHRvCisgKiBoYWxmLWR1cGxleC1jYXBhYmxlIGhhcmR3YXJlIG9ubHkuICovCisjZGVmaW5lIEUxMDAwX0NPTExJU0lPTl9ESVNUQU5DRSAgICAgICAgNjMKKyNkZWZpbmUgRTEwMDBfQ09MTElTSU9OX0RJU1RBTkNFXzgyNTQyICA2NAogI2RlZmluZSBFMTAwMF9GRFhfQ09MTElTSU9OX0RJU1RBTkNFICAgIEUxMDAwX0NPTExJU0lPTl9ESVNUQU5DRQogI2RlZmluZSBFMTAwMF9IRFhfQ09MTElTSU9OX0RJU1RBTkNFICAgIEUxMDAwX0NPTExJU0lPTl9ESVNUQU5DRQogI2RlZmluZSBFMTAwMF9DT0xEX1NISUZUICAgICAgICAgICAgICAgIDEyCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMKaW5kZXggNDM4YTkzMS4uMzFlMzMyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYwpAQCAtMjksMTEgKzI5LDcxIEBACiAjaW5jbHVkZSAiZTEwMDAuaCIKIAogLyogQ2hhbmdlIExvZwotICogNi4wLjU4ICAgICAgIDQvMjAvMDUKLSAqICAgbyBBY2NlcHRlZCBldGh0b29sIGNsZWFudXAgcGF0Y2ggZnJvbSBTdGVwaGVuIEhlbW1pbmdlciAKLSAqIDYuMC40NCsJMi8xNS8wNQotICogICBvIGFwcGxpZWQgQW50b24ncyBwYXRjaCB0byByZXNvbHZlIHR4IGhhbmcgaW4gaGFyZHdhcmUKLSAqICAgbyBBcHBsaWVkIEFuZHJldyBNb3J0b25zIHBhdGNoIC0gZTEwMDAgc3RvcHMgd29ya2luZyBhZnRlciByZXN1bWUKKyAqIDYuMy45CTEyLzE2LzIwMDUKKyAqICAgbyBpbmNvcnBvcmF0ZSBmaXggZm9yIHJlY3ljbGVkIHNrYnMgZnJvbSBJQk0gTFRDCisgKiA2LjMuNwkxMS8xOC8yMDA1CisgKiAgIG8gSG9ub3IgZWVwcm9tIHNldHRpbmcgZm9yIGVuYWJsaW5nL2Rpc2FibGluZyBXYWtlIE9uIExhbgorICogNi4zLjUgCTExLzE3LzIwMDUKKyAqICAgbyBGaXggbWVtb3J5IGxlYWsgaW4gcnggcmluZyBoYW5kbGluZyBmb3IgUENJIEV4cHJlc3MgYWRhcHRlcnMKKyAqIDYuMy40CTExLzgvMDUKKyAqICAgbyBQYXRjaCBmcm9tIEplc3BlciBKdWhsIHRvIHJlbW92ZSByZWR1bmRhbnQgTlVMTCBjaGVja3MgZm9yIGtmcmVlCisgKiA2LjMuMgk5LzIwLzA1CisgKiAgIG8gUmVuZGVyIGxvZ2ljIHRoYXQgc2V0cy9yZXNldHMgRFJWX0xPQUQgYXMgaW5saW5lIGZ1bmN0aW9ucyB0byAKKyAqICAgICBhdm9pZCBjb2RlIHJlcGxpY2F0aW9uLiBJZiBmL3cgaXMgQU1UIHRoZW4gc2V0IERSVl9MT0FEIG9ubHkgd2hlbgorICogICAgIG5ldHdvcmsgaW50ZXJmYWNlIGlzIG9wZW4uCisgKiAgIG8gSGFuZGxlIERSVl9MT0FEIHNldC9yZXNldCBpbiBjYXNlcyB3aGVyZSBBTVQgdXNlcyBWTEFOcy4KKyAqICAgbyBBZGp1c3QgUEJBIHBhcnRpb25pbmcgZm9yIEp1bWJvIGZyYW1lcyB1c2luZyBNVFUgc2l6ZSBhbmQgbm90CisgKiAgICAgcnhfYnVmZmVyX2xlbgorICogNi4zLjEJOS8xOS8wNQorICogICBvIFVzZSBhZGFwdGVyLT50eF90aW1lb3V0X2ZhY3RvciBpbiBUeCBIdW5nIERldGVjdCBsb2dpYyAKKyAgICAgICAoZTEwMDBfY2xlYW5fdHhfaXJxKQorICogICBvIFN1cHBvcnQgZm9yIDgwODY6MTBCNSBkZXZpY2UgKFF1YWQgUG9ydCkKKyAqIDYuMi4xNAk5LzE1LzA1CisgKiAgIG8gSW4gQU1UIGVuYWJsZWQgY29uZmlndXJhdGlvbnMsIHNldC9yZXNldCBEUlZfTE9BRCBiaXQgb24gaW50ZXJmYWNlIAorICogICAgIG9wZW4vY2xvc2UgCisgKiA2LjIuMTMgICAgICAgOS8xNC8wNQorICogICBvIEludm9rZSBlMTAwMF9jaGVja19tbmdfbW9kZSBvbmx5IGZvciA4MjU3eCBjb250cm9sbGVycyBzaW5jZSBpdCAKKyAqICAgICBhY2Nlc3NlcyB0aGUgRldTTSB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgaW4gb3RoZXIgY29udHJvbGxlcnMKKyAqIDYuMi4xMiAgICAgICA5LzkvMDUKKyAqICAgbyBBZGQgc3VwcG9ydCBmb3IgZGV2aWNlIGlkIEUxMDAwX0RFVl9JRF84MjU0NkdCX1FVQURfQ09QUEVSCisgKiAgIG8gc2V0IFJDVEw6U0VDUkMgb25seSBmb3IgY29udHJvbGxlcnMgbmV3ZXIgdGhhbiA4MjU0My4gCisgKiAgIG8gV2hlbiB0aGUgbi93IGludGVyZmFjZSBjb21lcyBkb3duIHJlc2V0IERSVl9MT0FEIGJpdCB0byBub3RpZnkgZi93LgorICogICAgIFRoaXMgY29kZSB3YXMgbW92ZWQgZnJvbSBlMTAwMF9yZW1vdmUgdG8gZTEwMDBfY2xvc2UKKyAqIDYuMi4xMCAgICAgICA5LzYvMDUKKyAqICAgbyBGaXggZXJyb3IgaW4gdXBkYXRpbmcgUkRUIGluIGVsMTAwMF9hbGxvY19yeF9idWZmZXJzW19wc10gLS0gb25lIG9mZi4KKyAqICAgbyBFbmFibGUgZmMgYnkgZGVmYXVsdCBvbiA4MjU3MyBjb250cm9sbGVycyAoZG8gbm90IHJlYWQgZWVwcm9tKQorICogICBvIEZpeCByeF9lcnJvcnMgc3RhdGlzdGljIG5vdCB0byBpbmNsdWRlIG1pc3NlZF9wYWNrZXRfY291bnQKKyAqICAgbyBGaXggcnhfZHJvcHBlZCBzdGF0aXN0aWMgbm90IHRvIGluY2x1ZGUgbWlzc2VkX3BhY2tldF9jb3VudCAKKyAgICAgICAoUGFkcmFpZyBCcmFkeSkKKyAqIDYuMi45ICAgICAgICA4LzMwLzA1CisgKiAgIG8gUmVtb3ZlIGNhbGwgdG8gdXBkYXRlIHN0YXRpc3RpY3MgZnJvbSB0aGUgY29udHJvbGxlciBpYiBlMTAwMF9nZXRfc3RhdHMKKyAqIDYuMi44ICAgICAgICA4LzMwLzA1CisgKiAgIG8gSW1wcm92ZWQgYWxnb3JpdGhtIGZvciByeCBidWZmZXIgYWxsb2NhdGlvbi9yZHQgdXBkYXRlCisgKiAgIG8gRmxvdyBjb250cm9sIHdhdGVybWFya3MgcmVsYXRpdmUgdG8gcnggUEJBIHNpemUKKyAqICAgbyBTaW1wbGlmaWVkICdUeCBIdW5nJyBkZXRlY3QgbG9naWMKKyAqIDYuMi43IAk4LzE3LzA1CisgKiAgIG8gUmVwb3J0IHJ4IGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWx1cmVzIGFuZCB0eCB0aW1lb3V0IGNvdW50cyBpbiBzdGF0cworICogNi4yLjYgCTgvMTYvMDUKKyAqICAgbyBJbXBsZW1lbnQgd29ya2Fyb3VuZCBmb3IgY29udHJvbGxlciBlcnJhdHVtIC0tIGxpbmVhciBub24tdHNvIHBhY2tldAorICogICAgIGZvbGxvd2luZyBhIFRTTyBnZXRzIHdyaXR0ZW4gYmFjayBwcmVtYXR1cmVseQorICogNi4yLjUJOC8xNS8wNQorICogICBvIFNldCBuZXRkZXYtPnR4X3F1ZXVlX2xlbiBiYXNlZCBvbiBsaW5rIHNwZWVkL2R1cGxleCBzZXR0aW5ncy4KKyAqICAgbyBGaXggbmV0X3N0YXRzLnJ4X2ZpZm9fZXJyb3JzIDxwQGRyYWlnQnJhZHkuY29tPgorICogICBvIERvIG5vdCBwb3dlciBvZmYgUEhZIGlmIFNvTC9JREVSIHNlc3Npb24gaXMgYWN0aXZlCisgKiA2LjIuNAk4LzEwLzA1CisgKiAgIG8gRml4IGxvb3BiYWNrIHRlc3Qgc2V0dXAvY2xlYW51cCBmb3IgODI1NzEvMyBjb250cm9sbGVycworICogICBvIEZpeCBwYXJzaW5nIG9mIG91dGdvaW5nIHBhY2tldHMgKGUxMDAwX3RyYW5zZmVyX2RoY3BfaW5mbykgdG8gdHJlYXQKKyAqICAgICBhbGwgcGFja2V0cyBhcyByYXcKKyAqICAgbyBQcmV2ZW50IG9wZXJhdGlvbnMgdGhhdCB3aWxsIGNhdXNlIHRoZSBQSFkgdG8gYmUgcmVzZXQgaWYgU29ML0lERVIKKyAqICAgICBzZXNzaW9ucyBhcmUgYWN0aXZlIGFuZCBsb2cgYSBtZXNzYWdlCisgKiA2LjIuMgk3LzIxLzA1CisgKiAgIG8gdXNlZCBmaXhlZCBzaXplIGRlc2NyaXB0b3JzIGZvciBhbGwgTVRVIHNpemVzLCByZWR1Y2VzIG1lbW9yeSBsb2FkCisgKiA2LjEuMgk0LzEzLzA1CisgKiAgIG8gRml4ZWQgZXRodG9vbCBkaWFnbm9zdGljcworICogICBvIEVuYWJsZWQgZmxvdyBjb250cm9sIHRvIHRha2UgZGVmYXVsdCBlZXByb20gc2V0dGluZ3MKKyAqICAgbyBBZGRlZCBzdGF0c19sb2NrIGFyb3VuZCBlMTAwMF9yZWFkX3BoeV9yZWcgY29tbWFuZHMgdG8gYXZvaWQgY29uY3VycmVudAorICogICAgIGNhbGxzLCBvbmUgZnJvbSBtaWlfaW9jdGwgYW5kIG90aGVyIGZyb20gd2l0aGluIHVwZGF0ZV9zdGF0cyB3aGlsZSAKKyAqICAgICBwcm9jZXNzaW5nIE1JSVJFRyBpb2N0bC4KICAqLwogCiBjaGFyIGUxMDAwX2RyaXZlcl9uYW1lW10gPSAiZTEwMDAiOwpAQCAtNDMsNyArMTAzLDcgQEAKICNlbHNlCiAjZGVmaW5lIERSSVZFUk5BUEkgIi1OQVBJIgogI2VuZGlmCi0jZGVmaW5lIERSVl9WRVJTSU9OICI2LjEuMTYtazIiRFJJVkVSTkFQSQorI2RlZmluZSBEUlZfVkVSU0lPTiAiNi4zLjktazIiRFJJVkVSTkFQSQogY2hhciBlMTAwMF9kcml2ZXJfdmVyc2lvbltdID0gRFJWX1ZFUlNJT047CiBzdGF0aWMgY2hhciBlMTAwMF9jb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4iOwogCkBAIC05Nyw3ICsxNTcsOSBAQAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwOEEpLAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwOEIpLAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwOEMpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwOTkpLAogCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwOUEpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwQjUpLAogCS8qIHJlcXVpcmVkIGxhc3QgZW50cnkgKi8KIAl7MCx9CiB9OwpAQCAtMTcxLDkgKzIzMywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGUxMDAwX3J4X3JpbmcgKnJ4X3JpbmcpOwogI2VuZGlmCiBzdGF0aWMgdm9pZCBlMTAwMF9hbGxvY19yeF9idWZmZXJzKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZTEwMDBfcnhfcmluZyAqcnhfcmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBlMTAwMF9yeF9yaW5nICpyeF9yaW5nLAorCQkJCSAgIGludCBjbGVhbmVkX2NvdW50KTsKIHN0YXRpYyB2b2lkIGUxMDAwX2FsbG9jX3J4X2J1ZmZlcnNfcHMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBlMTAwMF9yeF9yaW5nICpyeF9yaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGUxMDAwX3J4X3JpbmcgKnJ4X3JpbmcsCisJCQkJICAgICAgaW50IGNsZWFuZWRfY291bnQpOwogc3RhdGljIGludCBlMTAwMF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7CiBzdGF0aWMgaW50IGUxMDAwX21paV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwKIAkJCSAgIGludCBjbWQpOwpAQCAtMjkxLDcgKzM1NSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIGUxMDAwX2lycV9lbmFibGUoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JaWYobGlrZWx5KGF0b21pY19kZWNfYW5kX3Rlc3QoJmFkYXB0ZXItPmlycV9zZW0pKSkgeworCWlmIChsaWtlbHkoYXRvbWljX2RlY19hbmRfdGVzdCgmYWRhcHRlci0+aXJxX3NlbSkpKSB7CiAJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElNUywgSU1TX0VOQUJMRV9NQVNLKTsKIAkJRTEwMDBfV1JJVEVfRkxVU0goJmFkYXB0ZXItPmh3KTsKIAl9CkBAIC0zMDMsMjMgKzM2Nyw5MSBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAJdWludDE2X3QgdmlkID0gYWRhcHRlci0+aHcubW5nX2Nvb2tpZS52bGFuX2lkOwogCXVpbnQxNl90IG9sZF92aWQgPSBhZGFwdGVyLT5tbmdfdmxhbl9pZDsKLQlpZihhZGFwdGVyLT52bGdycCkgewotCQlpZighYWRhcHRlci0+dmxncnAtPnZsYW5fZGV2aWNlc1t2aWRdKSB7Ci0JCQlpZihhZGFwdGVyLT5ody5tbmdfY29va2llLnN0YXR1cyAmCisJaWYgKGFkYXB0ZXItPnZsZ3JwKSB7CisJCWlmICghYWRhcHRlci0+dmxncnAtPnZsYW5fZGV2aWNlc1t2aWRdKSB7CisJCQlpZiAoYWRhcHRlci0+aHcubW5nX2Nvb2tpZS5zdGF0dXMgJgogCQkJCUUxMDAwX01OR19ESENQX0NPT0tJRV9TVEFUVVNfVkxBTl9TVVBQT1JUKSB7CiAJCQkJZTEwMDBfdmxhbl9yeF9hZGRfdmlkKG5ldGRldiwgdmlkKTsKIAkJCQlhZGFwdGVyLT5tbmdfdmxhbl9pZCA9IHZpZDsKIAkJCX0gZWxzZQogCQkJCWFkYXB0ZXItPm1uZ192bGFuX2lkID0gRTEwMDBfTU5HX1ZMQU5fTk9ORTsKLQkJCQkKLQkJCWlmKChvbGRfdmlkICE9ICh1aW50MTZfdClFMTAwMF9NTkdfVkxBTl9OT05FKSAmJgotCQkJCQkodmlkICE9IG9sZF92aWQpICYmIAorCisJCQlpZiAoKG9sZF92aWQgIT0gKHVpbnQxNl90KUUxMDAwX01OR19WTEFOX05PTkUpICYmCisJCQkJCSh2aWQgIT0gb2xkX3ZpZCkgJiYKIAkJCQkJIWFkYXB0ZXItPnZsZ3JwLT52bGFuX2RldmljZXNbb2xkX3ZpZF0pCiAJCQkJZTEwMDBfdmxhbl9yeF9raWxsX3ZpZChuZXRkZXYsIG9sZF92aWQpOwogCQl9CiAJfQogfQotCQorCisvKioKKyAqIGUxMDAwX3JlbGVhc2VfaHdfY29udHJvbCAtIHJlbGVhc2UgY29udHJvbCBvZiB0aGUgaC93IHRvIGYvdworICogQGFkYXB0ZXI6IGFkZHJlc3Mgb2YgYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBlMTAwMF9yZWxlYXNlX2h3X2NvbnRyb2wgcmVzZXRzIHtDVFJMX0VYVHxGV1NNfTpEUlZfTE9BRCBiaXQuCisgKiBGb3IgQVNGIGFuZCBQYXNzIFRocm91Z2ggdmVyc2lvbnMgb2YgZi93IHRoaXMgbWVhbnMgdGhhdCB0aGUKKyAqIGRyaXZlciBpcyBubyBsb25nZXIgbG9hZGVkLiBGb3IgQU1UIHZlcnNpb24gKG9ubHkgd2l0aCA4MjU3MykgaQorICogb2YgdGhlIGYvdyB0aGlzIG1lYW5zIHRoYXQgdGhlIG5ldG93cmsgaS9mIGlzIGNsb3NlZC4KKyAqIAorICoqLworCitzdGF0aWMgaW5saW5lIHZvaWQgCitlMTAwMF9yZWxlYXNlX2h3X2NvbnRyb2woc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdWludDMyX3QgY3RybF9leHQ7CisJdWludDMyX3Qgc3dzbTsKKworCS8qIExldCBmaXJtd2FyZSB0YWtlbiBvdmVyIGNvbnRyb2wgb2YgaC93ICovCisJc3dpdGNoIChhZGFwdGVyLT5ody5tYWNfdHlwZSkgeworCWNhc2UgZTEwMDBfODI1NzE6CisJY2FzZSBlMTAwMF84MjU3MjoKKwkJY3RybF9leHQgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIENUUkxfRVhUKTsKKwkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgQ1RSTF9FWFQsCisJCQkJY3RybF9leHQgJiB+RTEwMDBfQ1RSTF9FWFRfRFJWX0xPQUQpOworCQlicmVhazsKKwljYXNlIGUxMDAwXzgyNTczOgorCQlzd3NtID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBTV1NNKTsKKwkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgU1dTTSwKKwkJCQlzd3NtICYgfkUxMDAwX1NXU01fRFJWX0xPQUQpOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBlMTAwMF9nZXRfaHdfY29udHJvbCAtIGdldCBjb250cm9sIG9mIHRoZSBoL3cgZnJvbSBmL3cKKyAqIEBhZGFwdGVyOiBhZGRyZXNzIG9mIGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogZTEwMDBfZ2V0X2h3X2NvbnRyb2wgc2V0cyB7Q1RSTF9FWFR8RldTTX06RFJWX0xPQUQgYml0LgorICogRm9yIEFTRiBhbmQgUGFzcyBUaHJvdWdoIHZlcnNpb25zIG9mIGYvdyB0aGlzIG1lYW5zIHRoYXQgCisgKiB0aGUgZHJpdmVyIGlzIGxvYWRlZC4gRm9yIEFNVCB2ZXJzaW9uIChvbmx5IHdpdGggODI1NzMpIAorICogb2YgdGhlIGYvdyB0aGlzIG1lYW5zIHRoYXQgdGhlIG5ldG93cmsgaS9mIGlzIG9wZW4uCisgKiAKKyAqKi8KKworc3RhdGljIGlubGluZSB2b2lkIAorZTEwMDBfZ2V0X2h3X2NvbnRyb2woc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdWludDMyX3QgY3RybF9leHQ7CisJdWludDMyX3Qgc3dzbTsKKwkvKiBMZXQgZmlybXdhcmUga25vdyB0aGUgZHJpdmVyIGhhcyB0YWtlbiBvdmVyICovCisJc3dpdGNoIChhZGFwdGVyLT5ody5tYWNfdHlwZSkgeworCWNhc2UgZTEwMDBfODI1NzE6CisJY2FzZSBlMTAwMF84MjU3MjoKKwkJY3RybF9leHQgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIENUUkxfRVhUKTsKKwkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgQ1RSTF9FWFQsCisJCQkJY3RybF9leHQgfCBFMTAwMF9DVFJMX0VYVF9EUlZfTE9BRCk7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfODI1NzM6CisJCXN3c20gPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNXU00pOworCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBTV1NNLAorCQkJCXN3c20gfCBFMTAwMF9TV1NNX0RSVl9MT0FEKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCiBpbnQKIGUxMDAwX3VwKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQogewpAQCAtMzI5LDEwICs0NjEsMTAgQEAKIAkvKiBoYXJkd2FyZSBoYXMgYmVlbiByZXNldCwgd2UgbmVlZCB0byByZWxvYWQgc29tZSB0aGluZ3MgKi8KIAogCS8qIFJlc2V0IHRoZSBQSFkgaWYgaXQgd2FzIHByZXZpb3VzbHkgcG93ZXJlZCBkb3duICovCi0JaWYoYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgeworCWlmIChhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CiAJCXVpbnQxNl90IG1paV9yZWc7CiAJCWUxMDAwX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIFBIWV9DVFJMLCAmbWlpX3JlZyk7Ci0JCWlmKG1paV9yZWcgJiBNSUlfQ1JfUE9XRVJfRE9XTikKKwkJaWYgKG1paV9yZWcgJiBNSUlfQ1JfUE9XRVJfRE9XTikKIAkJCWUxMDAwX3BoeV9yZXNldCgmYWRhcHRlci0+aHcpOwogCX0KIApAQCAtMzQzLDIwICs0NzUsMjYgQEAKIAllMTAwMF9jb25maWd1cmVfdHgoYWRhcHRlcik7CiAJZTEwMDBfc2V0dXBfcmN0bChhZGFwdGVyKTsKIAllMTAwMF9jb25maWd1cmVfcngoYWRhcHRlcik7Ci0JZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykKLQkJYWRhcHRlci0+YWxsb2NfcnhfYnVmKGFkYXB0ZXIsICZhZGFwdGVyLT5yeF9yaW5nW2ldKTsKKwkvKiBjYWxsIEUxMDAwX0RFU0NfVU5VU0VEIHdoaWNoIGFsd2F5cyBsZWF2ZXMKKwkgKiBhdCBsZWFzdCAxIGRlc2NyaXB0b3IgdW51c2VkIHRvIG1ha2Ugc3VyZQorCSAqIG5leHRfdG9fdXNlICE9IG5leHRfdG9fY2xlYW4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlczsgaSsrKSB7CisJCXN0cnVjdCBlMTAwMF9yeF9yaW5nICpyaW5nID0gJmFkYXB0ZXItPnJ4X3JpbmdbaV07CisJCWFkYXB0ZXItPmFsbG9jX3J4X2J1ZihhZGFwdGVyLCByaW5nLAorCQkgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfREVTQ19VTlVTRUQocmluZykpOworCX0KIAogI2lmZGVmIENPTkZJR19QQ0lfTVNJCi0JaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPiBlMTAwMF84MjU0N19yZXZfMikgeworCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ3X3Jldl8yKSB7CiAJCWFkYXB0ZXItPmhhdmVfbXNpID0gVFJVRTsKLQkJaWYoKGVyciA9IHBjaV9lbmFibGVfbXNpKGFkYXB0ZXItPnBkZXYpKSkgeworCQlpZiAoKGVyciA9IHBjaV9lbmFibGVfbXNpKGFkYXB0ZXItPnBkZXYpKSkgewogCQkJRFBSSU5USyhQUk9CRSwgRVJSLAogCQkJICJVbmFibGUgdG8gYWxsb2NhdGUgTVNJIGludGVycnVwdCBFcnJvcjogJWRcbiIsIGVycik7CiAJCQlhZGFwdGVyLT5oYXZlX21zaSA9IEZBTFNFOwogCQl9CiAJfQogI2VuZGlmCi0JaWYoKGVyciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSwgJmUxMDAwX2ludHIsCisJaWYgKChlcnIgPSByZXF1ZXN0X2lycShhZGFwdGVyLT5wZGV2LT5pcnEsICZlMTAwMF9pbnRyLAogCQkgICAgICAgICAgICAgIFNBX1NISVJRIHwgU0FfU0FNUExFX1JBTkRPTSwKIAkJICAgICAgICAgICAgICBuZXRkZXYtPm5hbWUsIG5ldGRldikpKSB7CiAJCURQUklOVEsoUFJPQkUsIEVSUiwKQEAgLTM2NCw2ICs1MDIsMTIgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKKyNpZmRlZiBDT05GSUdfRTEwMDBfTVEKKwllMTAwMF9zZXR1cF9xdWV1ZV9tYXBwaW5nKGFkYXB0ZXIpOworI2VuZGlmCisKKwlhZGFwdGVyLT50eF9xdWV1ZV9sZW4gPSBuZXRkZXYtPnR4X3F1ZXVlX2xlbjsKKwogCW1vZF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIsIGppZmZpZXMpOwogCiAjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKQEAgLTM3OCw2ICs1MjIsOCBAQAogZTEwMDBfZG93bihzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCWJvb2xlYW5fdCBtbmdfbW9kZV9lbmFibGVkID0gKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTcxKSAmJgorCQkJCSAgICAgZTEwMDBfY2hlY2tfbW5nX21vZGUoJmFkYXB0ZXItPmh3KTsKIAogCWUxMDAwX2lycV9kaXNhYmxlKGFkYXB0ZXIpOwogI2lmZGVmIENPTkZJR19FMTAwMF9NUQpAQCAtMzg1LDcgKzUzMSw3IEBACiAjZW5kaWYKIAlmcmVlX2lycShhZGFwdGVyLT5wZGV2LT5pcnEsIG5ldGRldik7CiAjaWZkZWYgQ09ORklHX1BDSV9NU0kKLQlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ3X3Jldl8yICYmCisJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID4gZTEwMDBfODI1NDdfcmV2XzIgJiYKIAkgICBhZGFwdGVyLT5oYXZlX21zaSA9PSBUUlVFKQogCQlwY2lfZGlzYWJsZV9tc2koYWRhcHRlci0+cGRldik7CiAjZW5kaWYKQEAgLTM5Niw2ICs1NDIsNyBAQAogI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCiAJbmV0aWZfcG9sbF9kaXNhYmxlKG5ldGRldik7CiAjZW5kaWYKKwluZXRkZXYtPnR4X3F1ZXVlX2xlbiA9IGFkYXB0ZXItPnR4X3F1ZXVlX2xlbjsKIAlhZGFwdGVyLT5saW5rX3NwZWVkID0gMDsKIAlhZGFwdGVyLT5saW5rX2R1cGxleCA9IDA7CiAJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKQEAgLTQwNSwxMiArNTUyLDE2IEBACiAJZTEwMDBfY2xlYW5fYWxsX3R4X3JpbmdzKGFkYXB0ZXIpOwogCWUxMDAwX2NsZWFuX2FsbF9yeF9yaW5ncyhhZGFwdGVyKTsKIAotCS8qIElmIFdvTCBpcyBub3QgZW5hYmxlZCBhbmQgbWFuYWdlbWVudCBtb2RlIGlzIG5vdCBJQU1UCi0JICogUG93ZXIgZG93biB0aGUgUEhZIHNvIG5vIGxpbmsgaXMgaW1wbGllZCB3aGVuIGludGVyZmFjZSBpcyBkb3duICovCi0JaWYoIWFkYXB0ZXItPndvbCAmJiBhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MCAmJgorCS8qIFBvd2VyIGRvd24gdGhlIFBIWSBzbyBubyBsaW5rIGlzIGltcGxpZWQgd2hlbiBpbnRlcmZhY2UgaXMgZG93biAqCisJICogVGhlIFBIWSBjYW5ub3QgYmUgcG93ZXJlZCBkb3duIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIGlzIFRSVUUgKgorCSAqIChhKSBXb0wgaXMgZW5hYmxlZAorCSAqIChiKSBBTVQgaXMgYWN0aXZlCisJICogKGMpIFNvTC9JREVSIHNlc3Npb24gaXMgYWN0aXZlICovCisJaWYgKCFhZGFwdGVyLT53b2wgJiYgYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDAgJiYKIAkgICBhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyICYmCi0JICAgIWUxMDAwX2NoZWNrX21uZ19tb2RlKCZhZGFwdGVyLT5odykgJiYKLQkgICAhKEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgTUFOQykgJiBFMTAwMF9NQU5DX1NNQlVTX0VOKSkgeworCSAgICEoRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBNQU5DKSAmIEUxMDAwX01BTkNfU01CVVNfRU4pICYmCisJICAgIW1uZ19tb2RlX2VuYWJsZWQgJiYKKwkgICAhZTEwMDBfY2hlY2tfcGh5X3Jlc2V0X2Jsb2NrKCZhZGFwdGVyLT5odykpIHsKIAkJdWludDE2X3QgbWlpX3JlZzsKIAkJZTEwMDBfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZX0NUUkwsICZtaWlfcmVnKTsKIAkJbWlpX3JlZyB8PSBNSUlfQ1JfUE9XRVJfRE9XTjsKQEAgLTQyMiwxMCArNTczLDggQEAKIHZvaWQKIGUxMDAwX3Jlc2V0KHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAJdWludDMyX3QgcGJhLCBtYW5jOwogCXVpbnQxNl90IGZjX2hpZ2hfd2F0ZXJfbWFyayA9IEUxMDAwX0ZDX0hJR0hfRElGRjsKLQl1aW50MTZfdCBmY19sb3dfd2F0ZXJfbWFyayA9IEUxMDAwX0ZDX0xPV19ESUZGOwogCiAJLyogUmVwYXJ0aXRpb24gUGJhIGZvciBncmVhdGVyIHRoYW4gOWsgbXR1CiAJICogVG8gdGFrZSBlZmZlY3QgQ1RSTC5SU1QgaXMgcmVxdWlyZWQuCkBAIC00NDgsMTkgKzU5NywxMiBAQAogCQlicmVhazsKIAl9CiAKLQlpZigoYWRhcHRlci0+aHcubWFjX3R5cGUgIT0gZTEwMDBfODI1NzMpICYmCi0JICAgKGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gPiBFMTAwMF9SWEJVRkZFUl84MTkyKSkgeworCWlmICgoYWRhcHRlci0+aHcubWFjX3R5cGUgIT0gZTEwMDBfODI1NzMpICYmCisJICAgKGFkYXB0ZXItPm5ldGRldi0+bXR1ID4gRTEwMDBfUlhCVUZGRVJfODE5MikpCiAJCXBiYSAtPSA4OyAvKiBhbGxvY2F0ZSBtb3JlIEZJRk8gZm9yIFR4ICovCi0JCS8qIHNlbmQgYW4gWE9GRiB3aGVuIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBpbiB0aGUKLQkJICogUnggRklGTyB0byBob2xkIG9uZSBleHRyYSBmdWxsIHNpemUgUnggcGFja2V0IAotCQkqLwotCQlmY19oaWdoX3dhdGVyX21hcmsgPSBuZXRkZXYtPm10dSArIEVORVRfSEVBREVSX1NJWkUgKyAKLQkJCQkJRVRIRVJORVRfRkNTX1NJWkUgKyAxOwotCQlmY19sb3dfd2F0ZXJfbWFyayA9IGZjX2hpZ2hfd2F0ZXJfbWFyayArIDg7Ci0JfQogCiAKLQlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykgeworCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykgewogCQlhZGFwdGVyLT50eF9maWZvX2hlYWQgPSAwOwogCQlhZGFwdGVyLT50eF9oZWFkX2FkZHIgPSBwYmEgPDwgRTEwMDBfVFhfSEVBRF9BRERSX1NISUZUOwogCQlhZGFwdGVyLT50eF9maWZvX3NpemUgPQpAQCAtNDcxLDE5ICs2MTMsMjEgQEAKIAlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBQQkEsIHBiYSk7CiAKIAkvKiBmbG93IGNvbnRyb2wgc2V0dGluZ3MgKi8KLQlhZGFwdGVyLT5ody5mY19oaWdoX3dhdGVyID0gKHBiYSA8PCBFMTAwMF9QQkFfQllURVNfU0hJRlQpIC0KLQkJCQkgICAgZmNfaGlnaF93YXRlcl9tYXJrOwotCWFkYXB0ZXItPmh3LmZjX2xvd193YXRlciA9IChwYmEgPDwgRTEwMDBfUEJBX0JZVEVTX1NISUZUKSAtCi0JCQkJICAgZmNfbG93X3dhdGVyX21hcms7CisJLyogU2V0IHRoZSBGQyBoaWdoIHdhdGVyIG1hcmsgdG8gOTAlIG9mIHRoZSBGSUZPIHNpemUuCisJICogUmVxdWlyZWQgdG8gY2xlYXIgbGFzdCAzIExTQiAqLworCWZjX2hpZ2hfd2F0ZXJfbWFyayA9ICgocGJhICogOTIxNikvMTApICYgMHhGRkY4OworCisJYWRhcHRlci0+aHcuZmNfaGlnaF93YXRlciA9IGZjX2hpZ2hfd2F0ZXJfbWFyazsKKwlhZGFwdGVyLT5ody5mY19sb3dfd2F0ZXIgPSBmY19oaWdoX3dhdGVyX21hcmsgLSA4OwogCWFkYXB0ZXItPmh3LmZjX3BhdXNlX3RpbWUgPSBFMTAwMF9GQ19QQVVTRV9USU1FOwogCWFkYXB0ZXItPmh3LmZjX3NlbmRfeG9uID0gMTsKIAlhZGFwdGVyLT5ody5mYyA9IGFkYXB0ZXItPmh3Lm9yaWdpbmFsX2ZjOwogCiAJLyogQWxsb3cgdGltZSBmb3IgcGVuZGluZyBtYXN0ZXIgcmVxdWVzdHMgdG8gcnVuICovCiAJZTEwMDBfcmVzZXRfaHcoJmFkYXB0ZXItPmh3KTsKLQlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0NCkKKwlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDQpCiAJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFdVQywgMCk7Ci0JaWYoZTEwMDBfaW5pdF9odygmYWRhcHRlci0+aHcpKQorCWlmIChlMTAwMF9pbml0X2h3KCZhZGFwdGVyLT5odykpCiAJCURQUklOVEsoUFJPQkUsIEVSUiwgIkhhcmR3YXJlIEVycm9yXG4iKTsKIAllMTAwMF91cGRhdGVfbW5nX3ZsYW4oYWRhcHRlcik7CiAJLyogRW5hYmxlIGgvdyB0byByZWNvZ25pemUgYW4gODAyLjFRIFZMQU4gRXRoZXJuZXQgcGFja2V0ICovCkBAIC01MTcsMzMgKzY2MSwzMSBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXI7CiAJdW5zaWduZWQgbG9uZyBtbWlvX3N0YXJ0LCBtbWlvX2xlbjsKLQl1aW50MzJfdCBjdHJsX2V4dDsKLQl1aW50MzJfdCBzd3NtOwogCiAJc3RhdGljIGludCBjYXJkc19mb3VuZCA9IDA7CiAJaW50IGksIGVyciwgcGNpX3VzaW5nX2RhYzsKIAl1aW50MTZfdCBlZXByb21fZGF0YTsKIAl1aW50MTZfdCBlZXByb21fYXBtZV9tYXNrID0gRTEwMDBfRUVQUk9NX0FQTUU7Ci0JaWYoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSkKKwlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSkKIAkJcmV0dXJuIGVycjsKIAotCWlmKCEoZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykpKSB7CisJaWYgKCEoZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykpKSB7CiAJCXBjaV91c2luZ19kYWMgPSAxOwogCX0gZWxzZSB7Ci0JCWlmKChlcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkpIHsKKwkJaWYgKChlcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkpIHsKIAkJCUUxMDAwX0VSUigiTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uLCBhYm9ydGluZ1xuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCXBjaV91c2luZ19kYWMgPSAwOwogCX0KIAotCWlmKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIGUxMDAwX2RyaXZlcl9uYW1lKSkpCisJaWYgKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIGUxMDAwX2RyaXZlcl9uYW1lKSkpCiAJCXJldHVybiBlcnI7CiAKIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAogCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgZTEwMDBfYWRhcHRlcikpOwotCWlmKCFuZXRkZXYpIHsKKwlpZiAoIW5ldGRldikgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9hbGxvY19ldGhlcmRldjsKIAl9CkBAIC01NjIsMTUgKzcwNCwxNSBAQAogCW1taW9fbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCBCQVJfMCk7CiAKIAlhZGFwdGVyLT5ody5od19hZGRyID0gaW9yZW1hcChtbWlvX3N0YXJ0LCBtbWlvX2xlbik7Ci0JaWYoIWFkYXB0ZXItPmh3Lmh3X2FkZHIpIHsKKwlpZiAoIWFkYXB0ZXItPmh3Lmh3X2FkZHIpIHsKIAkJZXJyID0gLUVJTzsKIAkJZ290byBlcnJfaW9yZW1hcDsKIAl9CiAKLQlmb3IoaSA9IEJBUl8xOyBpIDw9IEJBUl81OyBpKyspIHsKLQkJaWYocGNpX3Jlc291cmNlX2xlbihwZGV2LCBpKSA9PSAwKQorCWZvciAoaSA9IEJBUl8xOyBpIDw9IEJBUl81OyBpKyspIHsKKwkJaWYgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaSkgPT0gMCkKIAkJCWNvbnRpbnVlOwotCQlpZihwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgaSkgJiBJT1JFU09VUkNFX0lPKSB7CisJCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgaSkgJiBJT1JFU09VUkNFX0lPKSB7CiAJCQlhZGFwdGVyLT5ody5pb19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGkpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTYwNywxMyArNzQ5LDEzIEBACiAKIAkvKiBzZXR1cCB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KIAotCWlmKChlcnIgPSBlMTAwMF9zd19pbml0KGFkYXB0ZXIpKSkKKwlpZiAoKGVyciA9IGUxMDAwX3N3X2luaXQoYWRhcHRlcikpKQogCQlnb3RvIGVycl9zd19pbml0OwogCi0JaWYoKGVyciA9IGUxMDAwX2NoZWNrX3BoeV9yZXNldF9ibG9jaygmYWRhcHRlci0+aHcpKSkKKwlpZiAoKGVyciA9IGUxMDAwX2NoZWNrX3BoeV9yZXNldF9ibG9jaygmYWRhcHRlci0+aHcpKSkKIAkJRFBSSU5USyhQUk9CRSwgSU5GTywgIlBIWSByZXNldCBpcyBibG9ja2VkIGR1ZSB0byBTT0wvSURFUiBzZXNzaW9uLlxuIik7CiAKLQlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgeworCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgewogCQluZXRkZXYtPmZlYXR1cmVzID0gTkVUSUZfRl9TRyB8CiAJCQkJICAgTkVUSUZfRl9IV19DU1VNIHwKIAkJCQkgICBORVRJRl9GX0hXX1ZMQU5fVFggfApAQCAtNjIyLDE2ICs3NjQsMTYgQEAKIAl9CiAKICNpZmRlZiBORVRJRl9GX1RTTwotCWlmKChhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0NCkgJiYKKwlpZiAoKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQ0KSAmJgogCSAgIChhZGFwdGVyLT5ody5tYWNfdHlwZSAhPSBlMTAwMF84MjU0NykpCiAJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087CiAKICNpZmRlZiBORVRJRl9GX1RTT19JUFY2Ci0JaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPiBlMTAwMF84MjU0N19yZXZfMikKKwlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPiBlMTAwMF84MjU0N19yZXZfMikKIAkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTT19JUFY2OwogI2VuZGlmCiAjZW5kaWYKLQlpZihwY2lfdXNpbmdfZGFjKQorCWlmIChwY2lfdXNpbmdfZGFjKQogCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKIAogIAkvKiBoYXJkX3N0YXJ0X3htaXQgaXMgc2FmZSBhZ2FpbnN0IHBhcmFsbGVsIGxvY2tpbmcgKi8KQEAgLTYzOSwxNCArNzgxLDE0IEBACiAgCiAJYWRhcHRlci0+ZW5fbW5nX3B0ID0gZTEwMDBfZW5hYmxlX21uZ19wYXNzX3RocnUoJmFkYXB0ZXItPmh3KTsKIAotCS8qIGJlZm9yZSByZWFkaW5nIHRoZSBFRVBST00sIHJlc2V0IHRoZSBjb250cm9sbGVyIHRvIAorCS8qIGJlZm9yZSByZWFkaW5nIHRoZSBFRVBST00sIHJlc2V0IHRoZSBjb250cm9sbGVyIHRvCiAJICogcHV0IHRoZSBkZXZpY2UgaW4gYSBrbm93biBnb29kIHN0YXJ0aW5nIHN0YXRlICovCi0JCisKIAllMTAwMF9yZXNldF9odygmYWRhcHRlci0+aHcpOwogCiAJLyogbWFrZSBzdXJlIHRoZSBFRVBST00gaXMgZ29vZCAqLwogCi0JaWYoZTEwMDBfdmFsaWRhdGVfZWVwcm9tX2NoZWNrc3VtKCZhZGFwdGVyLT5odykgPCAwKSB7CisJaWYgKGUxMDAwX3ZhbGlkYXRlX2VlcHJvbV9jaGVja3N1bSgmYWRhcHRlci0+aHcpIDwgMCkgewogCQlEUFJJTlRLKFBST0JFLCBFUlIsICJUaGUgRUVQUk9NIENoZWNrc3VtIElzIE5vdCBWYWxpZFxuIik7CiAJCWVyciA9IC1FSU87CiAJCWdvdG8gZXJyX2VlcHJvbTsKQEAgLTY1NCwxMiArNzk2LDEyIEBACiAKIAkvKiBjb3B5IHRoZSBNQUMgYWRkcmVzcyBvdXQgb2YgdGhlIEVFUFJPTSAqLwogCi0JaWYoZTEwMDBfcmVhZF9tYWNfYWRkcigmYWRhcHRlci0+aHcpKQorCWlmIChlMTAwMF9yZWFkX21hY19hZGRyKCZhZGFwdGVyLT5odykpCiAJCURQUklOVEsoUFJPQkUsIEVSUiwgIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKIAltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRhcHRlci0+aHcubWFjX2FkZHIsIG5ldGRldi0+YWRkcl9sZW4pOwogCW1lbWNweShuZXRkZXYtPnBlcm1fYWRkciwgYWRhcHRlci0+aHcubWFjX2FkZHIsIG5ldGRldi0+YWRkcl9sZW4pOwogCi0JaWYoIWlzX3ZhbGlkX2V0aGVyX2FkZHIobmV0ZGV2LT5wZXJtX2FkZHIpKSB7CisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKG5ldGRldi0+cGVybV9hZGRyKSkgewogCQlEUFJJTlRLKFBST0JFLCBFUlIsICJJbnZhbGlkIE1BQyBBZGRyZXNzXG4iKTsKIAkJZXJyID0gLUVJTzsKIAkJZ290byBlcnJfZWVwcm9tOwpAQCAtNjk5LDcgKzg0MSw3IEBACiAJICogZW5hYmxlIHRoZSBBQ1BJIE1hZ2ljIFBhY2tldCBmaWx0ZXIKIAkgKi8KIAotCXN3aXRjaChhZGFwdGVyLT5ody5tYWNfdHlwZSkgeworCXN3aXRjaCAoYWRhcHRlci0+aHcubWFjX3R5cGUpIHsKIAljYXNlIGUxMDAwXzgyNTQyX3JldjJfMDoKIAljYXNlIGUxMDAwXzgyNTQyX3JldjJfMToKIAljYXNlIGUxMDAwXzgyNTQzOgpAQCAtNzEyLDggKzg1NCw3IEBACiAJY2FzZSBlMTAwMF84MjU0NjoKIAljYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgogCWNhc2UgZTEwMDBfODI1NzE6Ci0JCWlmKChFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfRlVOQ18xKQotCQkgICAmJiAoYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikpIHsKKwkJaWYgKEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19GVU5DXzEpewogCQkJZTEwMDBfcmVhZF9lZXByb20oJmFkYXB0ZXItPmh3LAogCQkJCUVFUFJPTV9JTklUX0NPTlRST0wzX1BPUlRfQiwgMSwgJmVlcHJvbV9kYXRhKTsKIAkJCWJyZWFrOwpAQCAtNzI0LDMxICs4NjUsNDIgQEAKIAkJCUVFUFJPTV9JTklUX0NPTlRST0wzX1BPUlRfQSwgMSwgJmVlcHJvbV9kYXRhKTsKIAkJYnJlYWs7CiAJfQotCWlmKGVlcHJvbV9kYXRhICYgZWVwcm9tX2FwbWVfbWFzaykKKwlpZiAoZWVwcm9tX2RhdGEgJiBlZXByb21fYXBtZV9tYXNrKQogCQlhZGFwdGVyLT53b2wgfD0gRTEwMDBfV1VGQ19NQUc7CiAKKwkvKiBwcmludCBidXMgdHlwZS9zcGVlZC93aWR0aCBpbmZvICovCisJeworCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJRFBSSU5USyhQUk9CRSwgSU5GTywgIihQQ0klczolczolcykgIiwKKwkJKChody0+YnVzX3R5cGUgPT0gZTEwMDBfYnVzX3R5cGVfcGNpeCkgPyAiLVgiIDoKKwkJIChody0+YnVzX3R5cGUgPT0gZTEwMDBfYnVzX3R5cGVfcGNpX2V4cHJlc3MgPyAiIEV4cHJlc3MiOiIiKSksCisJCSgoaHctPmJ1c19zcGVlZCA9PSBlMTAwMF9idXNfc3BlZWRfMjUwMCkgPyAiMi41R2IvcyIgOgorCQkgKGh3LT5idXNfc3BlZWQgPT0gZTEwMDBfYnVzX3NwZWVkXzEzMykgPyAiMTMzTUh6IiA6CisJCSAoaHctPmJ1c19zcGVlZCA9PSBlMTAwMF9idXNfc3BlZWRfMTIwKSA/ICIxMjBNSHoiIDoKKwkJIChody0+YnVzX3NwZWVkID09IGUxMDAwX2J1c19zcGVlZF8xMDApID8gIjEwME1IeiIgOgorCQkgKGh3LT5idXNfc3BlZWQgPT0gZTEwMDBfYnVzX3NwZWVkXzY2KSA/ICI2Nk1IeiIgOiAiMzNNSHoiKSwKKwkJKChody0+YnVzX3dpZHRoID09IGUxMDAwX2J1c193aWR0aF82NCkgPyAiNjQtYml0IiA6CisJCSAoaHctPmJ1c193aWR0aCA9PSBlMTAwMF9idXNfd2lkdGhfcGNpZXhfNCkgPyAiV2lkdGggeDQiIDoKKwkJIChody0+YnVzX3dpZHRoID09IGUxMDAwX2J1c193aWR0aF9wY2lleF8xKSA/ICJXaWR0aCB4MSIgOgorCQkgIjMyLWJpdCIpKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiUyLjJ4JWMiLCBuZXRkZXYtPmRldl9hZGRyW2ldLCBpID09IDUgPyAnXG4nIDogJzonKTsKKwogCS8qIHJlc2V0IHRoZSBoYXJkd2FyZSB3aXRoIHRoZSBuZXcgc2V0dGluZ3MgKi8KIAllMTAwMF9yZXNldChhZGFwdGVyKTsKIAotCS8qIExldCBmaXJtd2FyZSBrbm93IHRoZSBkcml2ZXIgaGFzIHRha2VuIG92ZXIgKi8KLQlzd2l0Y2goYWRhcHRlci0+aHcubWFjX3R5cGUpIHsKLQljYXNlIGUxMDAwXzgyNTcxOgotCWNhc2UgZTEwMDBfODI1NzI6Ci0JCWN0cmxfZXh0ID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMX0VYVCk7Ci0JCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIENUUkxfRVhULAotCQkJCWN0cmxfZXh0IHwgRTEwMDBfQ1RSTF9FWFRfRFJWX0xPQUQpOwotCQlicmVhazsKLQljYXNlIGUxMDAwXzgyNTczOgotCQlzd3NtID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBTV1NNKTsKLQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgU1dTTSwKLQkJCQlzd3NtIHwgRTEwMDBfU1dTTV9EUlZfTE9BRCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KKwkvKiBJZiB0aGUgY29udHJvbGxlciBpcyA4MjU3MyBhbmQgZi93IGlzIEFNVCwgZG8gbm90IHNldAorCSAqIERSVl9MT0FEIHVudGlsIHRoZSBpbnRlcmZhY2UgaXMgdXAuICBGb3IgYWxsIG90aGVyIGNhc2VzLAorCSAqIGxldCB0aGUgZi93IGtub3cgdGhhdCB0aGUgaC93IGlzIG5vdyB1bmRlciB0aGUgY29udHJvbAorCSAqIG9mIHRoZSBkcml2ZXIuICovCisJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlICE9IGUxMDAwXzgyNTczIHx8CisJICAgICFlMTAwMF9jaGVja19tbmdfbW9kZSgmYWRhcHRlci0+aHcpKQorCQllMTAwMF9nZXRfaHdfY29udHJvbChhZGFwdGVyKTsKIAogCXN0cmNweShuZXRkZXYtPm5hbWUsICJldGglZCIpOwotCWlmKChlcnIgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KSkpCisJaWYgKChlcnIgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KSkpCiAJCWdvdG8gZXJyX3JlZ2lzdGVyOwogCiAJRFBSSU5USyhQUk9CRSwgSU5GTywgIkludGVsKFIpIFBSTy8xMDAwIE5ldHdvcmsgQ29ubmVjdGlvblxuIik7CkBAIC03ODIsNDcgKzkzNCwzMyBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXVpbnQzMl90IGN0cmxfZXh0OwotCXVpbnQzMl90IG1hbmMsIHN3c207CisJdWludDMyX3QgbWFuYzsKICNpZmRlZiBDT05GSUdfRTEwMDBfTkFQSQogCWludCBpOwogI2VuZGlmCiAKIAlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCi0JaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDAgJiYKKwlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDAgJiYKIAkgICBhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CiAJCW1hbmMgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIE1BTkMpOwotCQlpZihtYW5jICYgRTEwMDBfTUFOQ19TTUJVU19FTikgeworCQlpZiAobWFuYyAmIEUxMDAwX01BTkNfU01CVVNfRU4pIHsKIAkJCW1hbmMgfD0gRTEwMDBfTUFOQ19BUlBfRU47CiAJCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBNQU5DLCBtYW5jKTsKIAkJfQogCX0KIAotCXN3aXRjaChhZGFwdGVyLT5ody5tYWNfdHlwZSkgewotCWNhc2UgZTEwMDBfODI1NzE6Ci0JY2FzZSBlMTAwMF84MjU3MjoKLQkJY3RybF9leHQgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIENUUkxfRVhUKTsKLQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgQ1RSTF9FWFQsCi0JCQkJY3RybF9leHQgJiB+RTEwMDBfQ1RSTF9FWFRfRFJWX0xPQUQpOwotCQlicmVhazsKLQljYXNlIGUxMDAwXzgyNTczOgotCQlzd3NtID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBTV1NNKTsKLQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgU1dTTSwKLQkJCQlzd3NtICYgfkUxMDAwX1NXU01fRFJWX0xPQUQpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KKwkvKiBSZWxlYXNlIGNvbnRyb2wgb2YgaC93IHRvIGYvdy4gIElmIGYvdyBpcyBBTVQgZW5hYmxlZCwgdGhpcworCSAqIHdvdWxkIGhhdmUgYWxyZWFkeSBoYXBwZW5lZCBpbiBjbG9zZSBhbmQgaXMgcmVkdW5kYW50LiAqLworCWUxMDAwX3JlbGVhc2VfaHdfY29udHJvbChhZGFwdGVyKTsKIAogCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CiAjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKLQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcnhfcXVldWVzOyBpKyspCiAJCV9fZGV2X3B1dCgmYWRhcHRlci0+cG9sbGluZ19uZXRkZXZbaV0pOwogI2VuZGlmCiAKLQlpZighZTEwMDBfY2hlY2tfcGh5X3Jlc2V0X2Jsb2NrKCZhZGFwdGVyLT5odykpCisJaWYgKCFlMTAwMF9jaGVja19waHlfcmVzZXRfYmxvY2soJmFkYXB0ZXItPmh3KSkKIAkJZTEwMDBfcGh5X2h3X3Jlc2V0KCZhZGFwdGVyLT5odyk7CiAKIAlrZnJlZShhZGFwdGVyLT50eF9yaW5nKTsKQEAgLTg4MSwxOSArMTAxOSwxOSBAQAogCiAJLyogaWRlbnRpZnkgdGhlIE1BQyAqLwogCi0JaWYoZTEwMDBfc2V0X21hY190eXBlKGh3KSkgeworCWlmIChlMTAwMF9zZXRfbWFjX3R5cGUoaHcpKSB7CiAJCURQUklOVEsoUFJPQkUsIEVSUiwgIlVua25vd24gTUFDIFR5cGVcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAkvKiBpbml0aWFsaXplIGVlcHJvbSBwYXJhbWV0ZXJzICovCiAKLQlpZihlMTAwMF9pbml0X2VlcHJvbV9wYXJhbXMoaHcpKSB7CisJaWYgKGUxMDAwX2luaXRfZWVwcm9tX3BhcmFtcyhodykpIHsKIAkJRTEwMDBfRVJSKCJFRVBST00gaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0Jc3dpdGNoKGh3LT5tYWNfdHlwZSkgeworCXN3aXRjaCAoaHctPm1hY190eXBlKSB7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJY2FzZSBlMTAwMF84MjU0MToKQEAgLTkxMiw3ICsxMDUwLDcgQEAKIAogCS8qIENvcHBlciBvcHRpb25zICovCiAKLQlpZihody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgeworCWlmIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgewogCQlody0+bWRpeCA9IEFVVE9fQUxMX01PREVTOwogCQlody0+ZGlzYWJsZV9wb2xhcml0eV9jb3JyZWN0aW9uID0gRkFMU0U7CiAJCWh3LT5tYXN0ZXJfc2xhdmUgPSBFMTAwMF9NQVNURVJfU0xBVkU7CkBAIC05MjMsMTUgKzEwNjEsMzQgQEAKIAlzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgewogCWNhc2UgZTEwMDBfODI1NzE6CiAJY2FzZSBlMTAwMF84MjU3MjoKLQkJYWRhcHRlci0+bnVtX3F1ZXVlcyA9IDI7CisJCS8qIFRoZXNlIGNvbnRyb2xsZXJzIHN1cHBvcnQgMiB0eCBxdWV1ZXMsIGJ1dCB3aXRoIGEgc2luZ2xlCisJCSAqIHFkaXNjIGltcGxlbWVudGF0aW9uLCBtdWx0aXBsZSB0eCBxdWV1ZXMgYXJlbid0IHF1aXRlIGFzCisJCSAqIGludGVyZXN0aW5nLiAgSWYgd2UgY2FuIGZpbmQgYSBsb2dpY2FsIHdheSBvZiBtYXBwaW5nCisJCSAqIGZsb3dzIHRvIGEgcXVldWUsIHRoZW4gcGVyaGFwcyB3ZSBjYW4gdXAgdGhlIG51bV90eF9xdWV1ZQorCQkgKiBjb3VudCBiYWNrIHRvIGl0cyBkZWZhdWx0LiAgVW50aWwgdGhlbiwgd2UgcnVuIHRoZSByaXNrIG9mCisJCSAqIHRlcnJpYmxlIHBlcmZvcm1hbmNlIGR1ZSB0byBTQUNLIG92ZXJsb2FkLiAqLworCQlhZGFwdGVyLT5udW1fdHhfcXVldWVzID0gMTsKKwkJYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyA9IDI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWFkYXB0ZXItPm51bV9xdWV1ZXMgPSAxOworCQlhZGFwdGVyLT5udW1fdHhfcXVldWVzID0gMTsKKwkJYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyA9IDE7CiAJCWJyZWFrOwogCX0KLQlhZGFwdGVyLT5udW1fcXVldWVzID0gbWluKGFkYXB0ZXItPm51bV9xdWV1ZXMsIG51bV9vbmxpbmVfY3B1cygpKTsKKwlhZGFwdGVyLT5udW1fcnhfcXVldWVzID0gbWluKGFkYXB0ZXItPm51bV9yeF9xdWV1ZXMsIG51bV9vbmxpbmVfY3B1cygpKTsKKwlhZGFwdGVyLT5udW1fdHhfcXVldWVzID0gbWluKGFkYXB0ZXItPm51bV90eF9xdWV1ZXMsIG51bV9vbmxpbmVfY3B1cygpKTsKKwlEUFJJTlRLKERSViwgSU5GTywgIk11bHRpcXVldWUgRW5hYmxlZDogUnggUXVldWUgY291bnQgPSAldSAlc1xuIiwKKwkJYWRhcHRlci0+bnVtX3J4X3F1ZXVlcywKKwkJKChhZGFwdGVyLT5udW1fcnhfcXVldWVzID09IDEpCisJCSA/ICgobnVtX29ubGluZV9jcHVzKCkgPiAxKQorCQkJPyAiKGR1ZSB0byB1bnN1cHBvcnRlZCBmZWF0dXJlIGluIGN1cnJlbnQgYWRhcHRlcikiCisJCQk6ICIoZHVlIHRvIHVuc3VwcG9ydGVkIHN5c3RlbSBjb25maWd1cmF0aW9uKSIpCisJCSA6ICIiKSk7CisJRFBSSU5USyhEUlYsIElORk8sICJNdWx0aXF1ZXVlIEVuYWJsZWQ6IFR4IFF1ZXVlIGNvdW50ID0gJXVcbiIsCisJCWFkYXB0ZXItPm51bV90eF9xdWV1ZXMpOwogI2Vsc2UKLQlhZGFwdGVyLT5udW1fcXVldWVzID0gMTsKKwlhZGFwdGVyLT5udW1fdHhfcXVldWVzID0gMTsKKwlhZGFwdGVyLT5udW1fcnhfcXVldWVzID0gMTsKICNlbmRpZgogCiAJaWYgKGUxMDAwX2FsbG9jX3F1ZXVlcyhhZGFwdGVyKSkgewpAQCAtOTQwLDE3ICsxMDk3LDE0IEBACiAJfQogCiAjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKLQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9yeF9xdWV1ZXM7IGkrKykgewogCQlhZGFwdGVyLT5wb2xsaW5nX25ldGRldltpXS5wcml2ID0gYWRhcHRlcjsKIAkJYWRhcHRlci0+cG9sbGluZ19uZXRkZXZbaV0ucG9sbCA9ICZlMTAwMF9jbGVhbjsKIAkJYWRhcHRlci0+cG9sbGluZ19uZXRkZXZbaV0ud2VpZ2h0ID0gNjQ7CiAJCWRldl9ob2xkKCZhZGFwdGVyLT5wb2xsaW5nX25ldGRldltpXSk7CiAJCXNldF9iaXQoX19MSU5LX1NUQVRFX1NUQVJULCAmYWRhcHRlci0+cG9sbGluZ19uZXRkZXZbaV0uc3RhdGUpOwogCX0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0UxMDAwX01RCi0JZTEwMDBfc2V0dXBfcXVldWVfbWFwcGluZyhhZGFwdGVyKTsKKwlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+dHhfcXVldWVfbG9jayk7CiAjZW5kaWYKIAogCWF0b21pY19zZXQoJmFkYXB0ZXItPmlycV9zZW0sIDEpOwpAQCAtOTczLDEzICsxMTI3LDEzIEBACiB7CiAJaW50IHNpemU7CiAKLQlzaXplID0gc2l6ZW9mKHN0cnVjdCBlMTAwMF90eF9yaW5nKSAqIGFkYXB0ZXItPm51bV9xdWV1ZXM7CisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfdHhfcmluZykgKiBhZGFwdGVyLT5udW1fdHhfcXVldWVzOwogCWFkYXB0ZXItPnR4X3JpbmcgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCWlmICghYWRhcHRlci0+dHhfcmluZykKIAkJcmV0dXJuIC1FTk9NRU07CiAJbWVtc2V0KGFkYXB0ZXItPnR4X3JpbmcsIDAsIHNpemUpOwogCi0Jc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfcnhfcmluZykgKiBhZGFwdGVyLT5udW1fcXVldWVzOworCXNpemUgPSBzaXplb2Yoc3RydWN0IGUxMDAwX3J4X3JpbmcpICogYWRhcHRlci0+bnVtX3J4X3F1ZXVlczsKIAlhZGFwdGVyLT5yeF9yaW5nID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFkYXB0ZXItPnJ4X3JpbmcpIHsKIAkJa2ZyZWUoYWRhcHRlci0+dHhfcmluZyk7CkBAIC05ODgsNyArMTE0Miw3IEBACiAJbWVtc2V0KGFkYXB0ZXItPnJ4X3JpbmcsIDAsIHNpemUpOwogCiAjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKLQlzaXplID0gc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlKSAqIGFkYXB0ZXItPm51bV9xdWV1ZXM7CisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZSkgKiBhZGFwdGVyLT5udW1fcnhfcXVldWVzOwogCWFkYXB0ZXItPnBvbGxpbmdfbmV0ZGV2ID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFkYXB0ZXItPnBvbGxpbmdfbmV0ZGV2KSB7CiAJCWtmcmVlKGFkYXB0ZXItPnR4X3JpbmcpOwpAQCAtOTk4LDYgKzExNTIsMTQgQEAKIAltZW1zZXQoYWRhcHRlci0+cG9sbGluZ19uZXRkZXYsIDAsIHNpemUpOwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfRTEwMDBfTVEKKwlhZGFwdGVyLT5yeF9zY2hlZF9jYWxsX2RhdGEuZnVuYyA9IGUxMDAwX3J4X3NjaGVkdWxlOworCWFkYXB0ZXItPnJ4X3NjaGVkX2NhbGxfZGF0YS5pbmZvID0gYWRhcHRlci0+bmV0ZGV2OworCisJYWRhcHRlci0+Y3B1X25ldGRldiA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKwlhZGFwdGVyLT5jcHVfdHhfcmluZyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgZTEwMDBfdHhfcmluZyAqKTsKKyNlbmRpZgorCiAJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiB9CiAKQEAgLTEwMTcsMTQgKzExNzksMTUgQEAKIAlsb2NrX2NwdV9ob3RwbHVnKCk7CiAJaSA9IDA7CiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJKnBlcl9jcHVfcHRyKGFkYXB0ZXItPmNwdV90eF9yaW5nLCBjcHUpID0gJmFkYXB0ZXItPnR4X3JpbmdbaSAlIGFkYXB0ZXItPm51bV9xdWV1ZXNdOworCQkqcGVyX2NwdV9wdHIoYWRhcHRlci0+Y3B1X3R4X3JpbmcsIGNwdSkgPSAmYWRhcHRlci0+dHhfcmluZ1tpICUgYWRhcHRlci0+bnVtX3R4X3F1ZXVlc107CiAJCS8qIFRoaXMgaXMgaW5jb21wbGV0ZSBiZWNhdXNlIHdlJ2QgbGlrZSB0byBhc3NpZ24gc2VwYXJhdGUKIAkJICogcGh5c2ljYWwgY3B1cyB0byB0aGVzZSBuZXRkZXYgcG9sbGluZyBzdHJ1Y3R1cmVzIGFuZAogCQkgKiBhdm9pZCBzYXR1cmF0aW5nIGEgc3Vic2V0IG9mIGNwdXMuCiAJCSAqLwotCQlpZiAoaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXMpIHsKKwkJaWYgKGkgPCBhZGFwdGVyLT5udW1fcnhfcXVldWVzKSB7CiAJCQkqcGVyX2NwdV9wdHIoYWRhcHRlci0+Y3B1X25ldGRldiwgY3B1KSA9ICZhZGFwdGVyLT5wb2xsaW5nX25ldGRldltpXTsKLQkJCWFkYXB0ZXItPmNwdV9mb3JfcXVldWVbaV0gPSBjcHU7CisJCQlhZGFwdGVyLT5yeF9yaW5nW2ldLmNwdSA9IGNwdTsKKwkJCWNwdV9zZXQoY3B1LCBhZGFwdGVyLT5jcHVtYXNrKTsKIAkJfSBlbHNlCiAJCQkqcGVyX2NwdV9wdHIoYWRhcHRlci0+Y3B1X25ldGRldiwgY3B1KSA9IE5VTEw7CiAKQEAgLTEwNjMsMTQgKzEyMjYsMjAgQEAKIAlpZiAoKGVyciA9IGUxMDAwX3NldHVwX2FsbF9yeF9yZXNvdXJjZXMoYWRhcHRlcikpKQogCQlnb3RvIGVycl9zZXR1cF9yeDsKIAotCWlmKChlcnIgPSBlMTAwMF91cChhZGFwdGVyKSkpCisJaWYgKChlcnIgPSBlMTAwMF91cChhZGFwdGVyKSkpCiAJCWdvdG8gZXJyX3VwOwogCWFkYXB0ZXItPm1uZ192bGFuX2lkID0gRTEwMDBfTU5HX1ZMQU5fTk9ORTsKLQlpZigoYWRhcHRlci0+aHcubW5nX2Nvb2tpZS5zdGF0dXMgJgorCWlmICgoYWRhcHRlci0+aHcubW5nX2Nvb2tpZS5zdGF0dXMgJgogCQkJICBFMTAwMF9NTkdfREhDUF9DT09LSUVfU1RBVFVTX1ZMQU5fU1VQUE9SVCkpIHsKIAkJZTEwMDBfdXBkYXRlX21uZ192bGFuKGFkYXB0ZXIpOwogCX0KIAorCS8qIElmIEFNVCBpcyBlbmFibGVkLCBsZXQgdGhlIGZpcm13YXJlIGtub3cgdGhhdCB0aGUgbmV0d29yaworCSAqIGludGVyZmFjZSBpcyBub3cgb3BlbiAqLworCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF84MjU3MyAmJgorCSAgICBlMTAwMF9jaGVja19tbmdfbW9kZSgmYWRhcHRlci0+aHcpKQorCQllMTAwMF9nZXRfaHdfY29udHJvbChhZGFwdGVyKTsKKwogCXJldHVybiBFMTAwMF9TVUNDRVNTOwogCiBlcnJfdXA6CkBAIC0xMTA1LDEwICsxMjc0LDE3IEBACiAJZTEwMDBfZnJlZV9hbGxfdHhfcmVzb3VyY2VzKGFkYXB0ZXIpOwogCWUxMDAwX2ZyZWVfYWxsX3J4X3Jlc291cmNlcyhhZGFwdGVyKTsKIAotCWlmKChhZGFwdGVyLT5ody5tbmdfY29va2llLnN0YXR1cyAmCisJaWYgKChhZGFwdGVyLT5ody5tbmdfY29va2llLnN0YXR1cyAmCiAJCQkgIEUxMDAwX01OR19ESENQX0NPT0tJRV9TVEFUVVNfVkxBTl9TVVBQT1JUKSkgewogCQllMTAwMF92bGFuX3J4X2tpbGxfdmlkKG5ldGRldiwgYWRhcHRlci0+bW5nX3ZsYW5faWQpOwogCX0KKworCS8qIElmIEFNVCBpcyBlbmFibGVkLCBsZXQgdGhlIGZpcm13YXJlIGtub3cgdGhhdCB0aGUgbmV0d29yaworCSAqIGludGVyZmFjZSBpcyBub3cgY2xvc2VkICovCisJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTczICYmCisJICAgIGUxMDAwX2NoZWNrX21uZ19tb2RlKCZhZGFwdGVyLT5odykpCisJCWUxMDAwX3JlbGVhc2VfaHdfY29udHJvbChhZGFwdGVyKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMTUzLDcgKzEzMjksNyBAQAogCXNpemUgPSBzaXplb2Yoc3RydWN0IGUxMDAwX2J1ZmZlcikgKiB0eGRyLT5jb3VudDsKIAogCXR4ZHItPmJ1ZmZlcl9pbmZvID0gdm1hbGxvY19ub2RlKHNpemUsIHBjaWJ1c190b19ub2RlKHBkZXYtPmJ1cykpOwotCWlmKCF0eGRyLT5idWZmZXJfaW5mbykgeworCWlmICghdHhkci0+YnVmZmVyX2luZm8pIHsKIAkJRFBSSU5USyhQUk9CRSwgRVJSLAogCQkiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZ1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTE2Niw3ICsxMzQyLDcgQEAKIAlFMTAwMF9ST1VORFVQKHR4ZHItPnNpemUsIDQwOTYpOwogCiAJdHhkci0+ZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHR4ZHItPnNpemUsICZ0eGRyLT5kbWEpOwotCWlmKCF0eGRyLT5kZXNjKSB7CisJaWYgKCF0eGRyLT5kZXNjKSB7CiBzZXR1cF90eF9kZXNjX2RpZToKIAkJdmZyZWUodHhkci0+YnVmZmVyX2luZm8pOwogCQlEUFJJTlRLKFBST0JFLCBFUlIsCkBAIC0xMTgyLDggKzEzNTgsOCBAQAogCQkJCSAgICAgImF0ICVwXG4iLCB0eGRyLT5zaXplLCB0eGRyLT5kZXNjKTsKIAkJLyogVHJ5IGFnYWluLCB3aXRob3V0IGZyZWVpbmcgdGhlIHByZXZpb3VzICovCiAJCXR4ZHItPmRlc2MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCB0eGRyLT5zaXplLCAmdHhkci0+ZG1hKTsKLQkJaWYoIXR4ZHItPmRlc2MpIHsKIAkJLyogRmFpbGVkIGFsbG9jYXRpb24sIGNyaXRpY2FsIGZhaWx1cmUgKi8KKwkJaWYgKCF0eGRyLT5kZXNjKSB7CiAJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHR4ZHItPnNpemUsIG9sZGRlc2MsIG9sZGRtYSk7CiAJCQlnb3RvIHNldHVwX3R4X2Rlc2NfZGllOwogCQl9CkBAIC0xMjI5LDcgKzE0MDUsNyBAQAogewogCWludCBpLCBlcnIgPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fdHhfcXVldWVzOyBpKyspIHsKIAkJZXJyID0gZTEwMDBfc2V0dXBfdHhfcmVzb3VyY2VzKGFkYXB0ZXIsICZhZGFwdGVyLT50eF9yaW5nW2ldKTsKIAkJaWYgKGVycikgewogCQkJRFBSSU5USyhQUk9CRSwgRVJSLApAQCAtMTI1NCwxMCArMTQzMCwxMSBAQAogCXVpbnQ2NF90IHRkYmE7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAl1aW50MzJfdCB0ZGxlbiwgdGN0bCwgdGlwZywgdGFyYzsKKwl1aW50MzJfdCBpcGdyMSwgaXBncjI7CiAKIAkvKiBTZXR1cCB0aGUgSFcgVHggSGVhZCBhbmQgVGFpbCBkZXNjcmlwdG9yIHBvaW50ZXJzICovCiAKLQlzd2l0Y2ggKGFkYXB0ZXItPm51bV9xdWV1ZXMpIHsKKwlzd2l0Y2ggKGFkYXB0ZXItPm51bV90eF9xdWV1ZXMpIHsKIAljYXNlIDI6CiAJCXRkYmEgPSBhZGFwdGVyLT50eF9yaW5nWzFdLmRtYTsKIAkJdGRsZW4gPSBhZGFwdGVyLT50eF9yaW5nWzFdLmNvdW50ICoKQEAgLTEyODcsMjIgKzE0NjQsMjYgQEAKIAogCS8qIFNldCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBUeCBJbnRlciBQYWNrZXQgR2FwIHRpbWVyICovCiAKKwlpZiAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlciB8fAorCSAgICBody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykKKwkJdGlwZyA9IERFRkFVTFRfODI1NDNfVElQR19JUEdUX0ZJQkVSOworCWVsc2UKKwkJdGlwZyA9IERFRkFVTFRfODI1NDNfVElQR19JUEdUX0NPUFBFUjsKKwogCXN3aXRjaCAoaHctPm1hY190eXBlKSB7CiAJY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzA6CiAJY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzE6CiAJCXRpcGcgPSBERUZBVUxUXzgyNTQyX1RJUEdfSVBHVDsKLQkJdGlwZyB8PSBERUZBVUxUXzgyNTQyX1RJUEdfSVBHUjEgPDwgRTEwMDBfVElQR19JUEdSMV9TSElGVDsKLQkJdGlwZyB8PSBERUZBVUxUXzgyNTQyX1RJUEdfSVBHUjIgPDwgRTEwMDBfVElQR19JUEdSMl9TSElGVDsKKwkJaXBncjEgPSBERUZBVUxUXzgyNTQyX1RJUEdfSVBHUjE7CisJCWlwZ3IyID0gREVGQVVMVF84MjU0Ml9USVBHX0lQR1IyOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlpZiAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlciB8fAotCQkgICAgaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpCi0JCQl0aXBnID0gREVGQVVMVF84MjU0M19USVBHX0lQR1RfRklCRVI7Ci0JCWVsc2UKLQkJCXRpcGcgPSBERUZBVUxUXzgyNTQzX1RJUEdfSVBHVF9DT1BQRVI7Ci0JCXRpcGcgfD0gREVGQVVMVF84MjU0M19USVBHX0lQR1IxIDw8IEUxMDAwX1RJUEdfSVBHUjFfU0hJRlQ7Ci0JCXRpcGcgfD0gREVGQVVMVF84MjU0M19USVBHX0lQR1IyIDw8IEUxMDAwX1RJUEdfSVBHUjJfU0hJRlQ7CisJCWlwZ3IxID0gREVGQVVMVF84MjU0M19USVBHX0lQR1IxOworCQlpcGdyMiA9IERFRkFVTFRfODI1NDNfVElQR19JUEdSMjsKKwkJYnJlYWs7CiAJfQorCXRpcGcgfD0gaXBncjEgPDwgRTEwMDBfVElQR19JUEdSMV9TSElGVDsKKwl0aXBnIHw9IGlwZ3IyIDw8IEUxMDAwX1RJUEdfSVBHUjJfU0hJRlQ7CiAJRTEwMDBfV1JJVEVfUkVHKGh3LCBUSVBHLCB0aXBnKTsKIAogCS8qIFNldCB0aGUgVHggSW50ZXJydXB0IERlbGF5IHJlZ2lzdGVyICovCkBAIC0xMzc4LDcgKzE1NTksNyBAQAogCiAJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfcHNfcGFnZSkgKiByeGRyLT5jb3VudDsKIAlyeGRyLT5wc19wYWdlID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZighcnhkci0+cHNfcGFnZSkgeworCWlmICghcnhkci0+cHNfcGFnZSkgewogCQl2ZnJlZShyeGRyLT5idWZmZXJfaW5mbyk7CiAJCURQUklOVEsoUFJPQkUsIEVSUiwKIAkJIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSByZWNlaXZlIGRlc2NyaXB0b3IgcmluZ1xuIik7CkBAIC0xMzg4LDcgKzE1NjksNyBAQAogCiAJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfcHNfcGFnZV9kbWEpICogcnhkci0+Y291bnQ7CiAJcnhkci0+cHNfcGFnZV9kbWEgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCWlmKCFyeGRyLT5wc19wYWdlX2RtYSkgeworCWlmICghcnhkci0+cHNfcGFnZV9kbWEpIHsKIAkJdmZyZWUocnhkci0+YnVmZmVyX2luZm8pOwogCQlrZnJlZShyeGRyLT5wc19wYWdlKTsKIAkJRFBSSU5USyhQUk9CRSwgRVJSLApAQCAtMTM5Nyw3ICsxNTc4LDcgQEAKIAl9CiAJbWVtc2V0KHJ4ZHItPnBzX3BhZ2VfZG1hLCAwLCBzaXplKTsKIAotCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlIDw9IGUxMDAwXzgyNTQ3X3Jldl8yKQorCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA8PSBlMTAwMF84MjU0N19yZXZfMikKIAkJZGVzY19sZW4gPSBzaXplb2Yoc3RydWN0IGUxMDAwX3J4X2Rlc2MpOwogCWVsc2UKIAkJZGVzY19sZW4gPSBzaXplb2YodW5pb24gZTEwMDBfcnhfZGVzY19wYWNrZXRfc3BsaXQpOwpAQCAtMTQ1NCw2ICsxNjM1LDggQEAKIAogCXJ4ZHItPm5leHRfdG9fY2xlYW4gPSAwOwogCXJ4ZHItPm5leHRfdG9fdXNlID0gMDsKKwlyeGRyLT5yeF9za2JfdG9wID0gTlVMTDsKKwlyeGRyLT5yeF9za2JfcHJldiA9IE5VTEw7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE0NzUsNyArMTY1OCw3IEBACiB7CiAJaW50IGksIGVyciA9IDA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9yeF9xdWV1ZXM7IGkrKykgewogCQllcnIgPSBlMTAwMF9zZXR1cF9yeF9yZXNvdXJjZXMoYWRhcHRlciwgJmFkYXB0ZXItPnJ4X3JpbmdbaV0pOwogCQlpZiAoZXJyKSB7CiAJCQlEUFJJTlRLKFBST0JFLCBFUlIsCkBAIC0xNDk4LDcgKzE2ODEsNyBAQAogewogCXVpbnQzMl90IHJjdGwsIHJmY3RsOwogCXVpbnQzMl90IHBzcmN0bCA9IDA7Ci0jaWZkZWYgQ09ORklHX0UxMDAwX1BBQ0tFVF9TUExJVAorI2lmbmRlZiBDT05GSUdfRTEwMDBfRElTQUJMRV9QQUNLRVRfU1BMSVQKIAl1aW50MzJfdCBwYWdlcyA9IDA7CiAjZW5kaWYKIApAQCAtMTUxMCw3ICsxNjkzLDEwIEBACiAJCUUxMDAwX1JDVExfTEJNX05PIHwgRTEwMDBfUkNUTF9SRE1UU19IQUxGIHwKIAkJKGFkYXB0ZXItPmh3Lm1jX2ZpbHRlcl90eXBlIDw8IEUxMDAwX1JDVExfTU9fU0hJRlQpOwogCi0JaWYoYWRhcHRlci0+aHcudGJpX2NvbXBhdGliaWxpdHlfb24gPT0gMSkKKwlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPiBlMTAwMF84MjU0MykKKwkJcmN0bCB8PSBFMTAwMF9SQ1RMX1NFQ1JDOworCisJaWYgKGFkYXB0ZXItPmh3LnRiaV9jb21wYXRpYmlsaXR5X29uID09IDEpCiAJCXJjdGwgfD0gRTEwMDBfUkNUTF9TQlA7CiAJZWxzZQogCQlyY3RsICY9IH5FMTAwMF9SQ1RMX1NCUDsKQEAgLTE1MjEsMzIgKzE3MDcsMTcgQEAKIAkJcmN0bCB8PSBFMTAwMF9SQ1RMX0xQRTsKIAogCS8qIFNldHVwIGJ1ZmZlciBzaXplcyAqLwotCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTcxKSB7CisJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTcxKSB7CiAJCS8qIFdlIGNhbiBub3cgc3BlY2lmeSBidWZmZXJzIGluIDFLIGluY3JlbWVudHMuCiAJCSAqIEJTSVpFIGFuZCBCU0VYIGFyZSBpZ25vcmVkIGluIHRoaXMgY2FzZS4gKi8KIAkJcmN0bCB8PSBhZGFwdGVyLT5yeF9idWZmZXJfbGVuIDw8IDB4MTE7CiAJfSBlbHNlIHsKIAkJcmN0bCAmPSB+RTEwMDBfUkNUTF9TWl80MDk2OwotCQlyY3RsIHw9IEUxMDAwX1JDVExfQlNFWDsgCi0JCXN3aXRjaCAoYWRhcHRlci0+cnhfYnVmZmVyX2xlbikgewotCQljYXNlIEUxMDAwX1JYQlVGRkVSXzIwNDg6Ci0JCWRlZmF1bHQ6Ci0JCQlyY3RsIHw9IEUxMDAwX1JDVExfU1pfMjA0ODsKLQkJCXJjdGwgJj0gfkUxMDAwX1JDVExfQlNFWDsKLQkJCWJyZWFrOwotCQljYXNlIEUxMDAwX1JYQlVGRkVSXzQwOTY6Ci0JCQlyY3RsIHw9IEUxMDAwX1JDVExfU1pfNDA5NjsKLQkJCWJyZWFrOwotCQljYXNlIEUxMDAwX1JYQlVGRkVSXzgxOTI6Ci0JCQlyY3RsIHw9IEUxMDAwX1JDVExfU1pfODE5MjsKLQkJCWJyZWFrOwotCQljYXNlIEUxMDAwX1JYQlVGRkVSXzE2Mzg0OgotCQkJcmN0bCB8PSBFMTAwMF9SQ1RMX1NaXzE2Mzg0OwotCQkJYnJlYWs7Ci0JCX0KKwkJcmN0bCAmPSB+RTEwMDBfUkNUTF9CU0VYOworCQlyY3RsIHw9IEUxMDAwX1JDVExfU1pfMjA0ODsKIAl9CiAKLSNpZmRlZiBDT05GSUdfRTEwMDBfUEFDS0VUX1NQTElUCisjaWZuZGVmIENPTkZJR19FMTAwMF9ESVNBQkxFX1BBQ0tFVF9TUExJVAogCS8qIDgyNTcxIGFuZCBncmVhdGVyIHN1cHBvcnQgcGFja2V0LXNwbGl0IHdoZXJlIHRoZSBwcm90b2NvbAogCSAqIGhlYWRlciBpcyBwbGFjZWQgaW4gc2tiLT5kYXRhIGFuZCB0aGUgcGFja2V0IGRhdGEgaXMKIAkgKiBwbGFjZWQgaW4gcGFnZXMgaGFuZ2luZyBvZmYgb2Ygc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncy4KQEAgLTE1NzAsNyArMTc0MSw3IEBACiAJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJGQ1RMLCByZmN0bCk7CiAKIAkJcmN0bCB8PSBFMTAwMF9SQ1RMX0RUWVBfUFMgfCBFMTAwMF9SQ1RMX1NFQ1JDOwotCQkKKwogCQlwc3JjdGwgfD0gYWRhcHRlci0+cnhfcHNfYnNpemUwID4+CiAJCQlFMTAwMF9QU1JDVExfQlNJWkUwX1NISUZUOwogCkBAIC0xNjMyLDIyICsxODAzLDI3IEBACiAKIAlpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQwKSB7CiAJCUUxMDAwX1dSSVRFX1JFRyhodywgUkFEViwgYWRhcHRlci0+cnhfYWJzX2ludF9kZWxheSk7Ci0JCWlmKGFkYXB0ZXItPml0ciA+IDEpCisJCWlmIChhZGFwdGVyLT5pdHIgPiAxKQogCQkJRTEwMDBfV1JJVEVfUkVHKGh3LCBJVFIsCiAJCQkJMTAwMDAwMDAwMCAvIChhZGFwdGVyLT5pdHIgKiAyNTYpKTsKIAl9CiAKIAlpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTcxKSB7Ci0JCS8qIFJlc2V0IGRlbGF5IHRpbWVycyBhZnRlciBldmVyeSBpbnRlcnJ1cHQgKi8KIAkJY3RybF9leHQgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTF9FWFQpOworCQkvKiBSZXNldCBkZWxheSB0aW1lcnMgYWZ0ZXIgZXZlcnkgaW50ZXJydXB0ICovCiAJCWN0cmxfZXh0IHw9IEUxMDAwX0NUUkxfRVhUX0NBTkM7CisjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKKwkJLyogQXV0by1NYXNrIGludGVycnVwdHMgdXBvbiBJQ1IgcmVhZC4gKi8KKwkJY3RybF9leHQgfD0gRTEwMDBfQ1RSTF9FWFRfSUFNRTsKKyNlbmRpZgogCQlFMTAwMF9XUklURV9SRUcoaHcsIENUUkxfRVhULCBjdHJsX2V4dCk7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgSUFNLCB+MCk7CiAJCUUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKIAl9CiAKIAkvKiBTZXR1cCB0aGUgSFcgUnggSGVhZCBhbmQgVGFpbCBEZXNjcmlwdG9yIFBvaW50ZXJzIGFuZAogCSAqIHRoZSBCYXNlIGFuZCBMZW5ndGggb2YgdGhlIFJ4IERlc2NyaXB0b3IgUmluZyAqLwotCXN3aXRjaCAoYWRhcHRlci0+bnVtX3F1ZXVlcykgeworCXN3aXRjaCAoYWRhcHRlci0+bnVtX3J4X3F1ZXVlcykgewogI2lmZGVmIENPTkZJR19FMTAwMF9NUQogCWNhc2UgMjoKIAkJcmRiYSA9IGFkYXB0ZXItPnJ4X3JpbmdbMV0uZG1hOwpAQCAtMTY3NCw3ICsxODUwLDcgQEAKIAl9CiAKICNpZmRlZiBDT05GSUdfRTEwMDBfTVEKLQlpZiAoYWRhcHRlci0+bnVtX3F1ZXVlcyA+IDEpIHsKKwlpZiAoYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyA+IDEpIHsKIAkJdWludDMyX3QgcmFuZG9tWzEwXTsKIAogCQlnZXRfcmFuZG9tX2J5dGVzKCZyYW5kb21bMF0sIDQwKTsKQEAgLTE2ODQsNyArMTg2MCw3IEBACiAJCQlFMTAwMF9XUklURV9SRUcoaHcsIFJTU0lNLCAwKTsKIAkJfQogCi0JCXN3aXRjaCAoYWRhcHRlci0+bnVtX3F1ZXVlcykgeworCQlzd2l0Y2ggKGFkYXB0ZXItPm51bV9yeF9xdWV1ZXMpIHsKIAkJY2FzZSAyOgogCQlkZWZhdWx0OgogCQkJcmV0YSA9IDB4MDA4MDAwODA7CkBAIC0xNzE2LDEzICsxODkyLDEzIEBACiAJLyogRW5hYmxlIDgyNTQzIFJlY2VpdmUgQ2hlY2tzdW0gT2ZmbG9hZCBmb3IgVENQIGFuZCBVRFAgKi8KIAlpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQzKSB7CiAJCXJ4Y3N1bSA9IEUxMDAwX1JFQURfUkVHKGh3LCBSWENTVU0pOwotCQlpZihhZGFwdGVyLT5yeF9jc3VtID09IFRSVUUpIHsKKwkJaWYgKGFkYXB0ZXItPnJ4X2NzdW0gPT0gVFJVRSkgewogCQkJcnhjc3VtIHw9IEUxMDAwX1JYQ1NVTV9UVU9GTDsKIAogCQkJLyogRW5hYmxlIDgyNTcxIElQdjQgcGF5bG9hZCBjaGVja3N1bSBmb3IgVURQIGZyYWdtZW50cwogCQkJICogTXVzdCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggcGFja2V0LXNwbGl0LiAqLwotCQkJaWYgKChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NzEpICYmIAotCQkJICAgKGFkYXB0ZXItPnJ4X3BzX3BhZ2VzKSkgeworCQkJaWYgKChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NzEpICYmCisJCQkgICAgKGFkYXB0ZXItPnJ4X3BzX3BhZ2VzKSkgewogCQkJCXJ4Y3N1bSB8PSBFMTAwMF9SWENTVU1fSVBQQ1NFOwogCQkJfQogCQl9IGVsc2UgewpAQCAtMTc3Niw3ICsxOTUyLDcgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV90eF9xdWV1ZXM7IGkrKykKIAkJZTEwMDBfZnJlZV90eF9yZXNvdXJjZXMoYWRhcHRlciwgJmFkYXB0ZXItPnR4X3JpbmdbaV0pOwogfQogCkBAIC0xNzg0LDE3ICsxOTYwLDE1IEBACiBlMTAwMF91bm1hcF9hbmRfZnJlZV90eF9yZXNvdXJjZShzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwKIAkJCXN0cnVjdCBlMTAwMF9idWZmZXIgKmJ1ZmZlcl9pbmZvKQogewotCWlmKGJ1ZmZlcl9pbmZvLT5kbWEpIHsKKwlpZiAoYnVmZmVyX2luZm8tPmRtYSkgewogCQlwY2lfdW5tYXBfcGFnZShhZGFwdGVyLT5wZGV2LAogCQkJCWJ1ZmZlcl9pbmZvLT5kbWEsCiAJCQkJYnVmZmVyX2luZm8tPmxlbmd0aCwKIAkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKLQkJYnVmZmVyX2luZm8tPmRtYSA9IDA7CiAJfQotCWlmKGJ1ZmZlcl9pbmZvLT5za2IpIHsKKwlpZiAoYnVmZmVyX2luZm8tPnNrYikKIAkJZGV2X2tmcmVlX3NrYl9hbnkoYnVmZmVyX2luZm8tPnNrYik7Ci0JCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOwotCX0KKwltZW1zZXQoYnVmZmVyX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgZTEwMDBfYnVmZmVyKSk7CiB9CiAKIC8qKgpAQCAtMTgxMyw3ICsxOTg3LDcgQEAKIAogCS8qIEZyZWUgYWxsIHRoZSBUeCByaW5nIHNrX2J1ZmZzICovCiAKLQlmb3IoaSA9IDA7IGkgPCB0eF9yaW5nLT5jb3VudDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHR4X3JpbmctPmNvdW50OyBpKyspIHsKIAkJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+YnVmZmVyX2luZm9baV07CiAJCWUxMDAwX3VubWFwX2FuZF9mcmVlX3R4X3Jlc291cmNlKGFkYXB0ZXIsIGJ1ZmZlcl9pbmZvKTsKIAl9CkBAIC0xODQzLDcgKzIwMTcsNyBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3R4X3F1ZXVlczsgaSsrKQogCQllMTAwMF9jbGVhbl90eF9yaW5nKGFkYXB0ZXIsICZhZGFwdGVyLT50eF9yaW5nW2ldKTsKIH0KIApAQCAtMTg4Nyw3ICsyMDYxLDcgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9yeF9xdWV1ZXM7IGkrKykKIAkJZTEwMDBfZnJlZV9yeF9yZXNvdXJjZXMoYWRhcHRlciwgJmFkYXB0ZXItPnJ4X3JpbmdbaV0pOwogfQogCkBAIC0xOTA5LDEyICsyMDgzLDkgQEAKIAl1bnNpZ25lZCBpbnQgaSwgajsKIAogCS8qIEZyZWUgYWxsIHRoZSBSeCByaW5nIHNrX2J1ZmZzICovCi0KLQlmb3IoaSA9IDA7IGkgPCByeF9yaW5nLT5jb3VudDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHJ4X3JpbmctPmNvdW50OyBpKyspIHsKIAkJYnVmZmVyX2luZm8gPSAmcnhfcmluZy0+YnVmZmVyX2luZm9baV07Ci0JCWlmKGJ1ZmZlcl9pbmZvLT5za2IpIHsKLQkJCXBzX3BhZ2UgPSAmcnhfcmluZy0+cHNfcGFnZVtpXTsKLQkJCXBzX3BhZ2VfZG1hID0gJnJ4X3JpbmctPnBzX3BhZ2VfZG1hW2ldOworCQlpZiAoYnVmZmVyX2luZm8tPnNrYikgewogCQkJcGNpX3VubWFwX3NpbmdsZShwZGV2LAogCQkJCQkgYnVmZmVyX2luZm8tPmRtYSwKIAkJCQkJIGJ1ZmZlcl9pbmZvLT5sZW5ndGgsCkBAIC0xOTIyLDE5ICsyMDkzLDMwIEBACiAKIAkJCWRldl9rZnJlZV9za2IoYnVmZmVyX2luZm8tPnNrYik7CiAJCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKLQotCQkJZm9yKGogPSAwOyBqIDwgYWRhcHRlci0+cnhfcHNfcGFnZXM7IGorKykgewotCQkJCWlmKCFwc19wYWdlLT5wc19wYWdlW2pdKSBicmVhazsKLQkJCQlwY2lfdW5tYXBfc2luZ2xlKHBkZXYsCi0JCQkJCQkgcHNfcGFnZV9kbWEtPnBzX3BhZ2VfZG1hW2pdLAotCQkJCQkJIFBBR0VfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCQlwc19wYWdlX2RtYS0+cHNfcGFnZV9kbWFbal0gPSAwOwotCQkJCXB1dF9wYWdlKHBzX3BhZ2UtPnBzX3BhZ2Vbal0pOwotCQkJCXBzX3BhZ2UtPnBzX3BhZ2Vbal0gPSBOVUxMOwotCQkJfQorCQl9CisJCXBzX3BhZ2UgPSAmcnhfcmluZy0+cHNfcGFnZVtpXTsKKwkJcHNfcGFnZV9kbWEgPSAmcnhfcmluZy0+cHNfcGFnZV9kbWFbaV07CisJCWZvciAoaiA9IDA7IGogPCBhZGFwdGVyLT5yeF9wc19wYWdlczsgaisrKSB7CisJCQlpZiAoIXBzX3BhZ2UtPnBzX3BhZ2Vbal0pIGJyZWFrOworCQkJcGNpX3VubWFwX3BhZ2UocGRldiwKKwkJCQkgICAgICAgcHNfcGFnZV9kbWEtPnBzX3BhZ2VfZG1hW2pdLAorCQkJCSAgICAgICBQQUdFX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlwc19wYWdlX2RtYS0+cHNfcGFnZV9kbWFbal0gPSAwOworCQkJcHV0X3BhZ2UocHNfcGFnZS0+cHNfcGFnZVtqXSk7CisJCQlwc19wYWdlLT5wc19wYWdlW2pdID0gTlVMTDsKIAkJfQogCX0KIAorCS8qIHRoZXJlIGFsc28gbWF5IGJlIHNvbWUgY2FjaGVkIGRhdGEgaW4gb3VyIGFkYXB0ZXIgKi8KKwlpZiAocnhfcmluZy0+cnhfc2tiX3RvcCkgeworCQlkZXZfa2ZyZWVfc2tiKHJ4X3JpbmctPnJ4X3NrYl90b3ApOworCisJCS8qIHJ4X3NrYl9wcmV2IHdpbGwgYmUgd2lwZWQgb3V0IGJ5IHJ4X3NrYl90b3AgKi8KKwkJcnhfcmluZy0+cnhfc2tiX3RvcCA9IE5VTEw7CisJCXJ4X3JpbmctPnJ4X3NrYl9wcmV2ID0gTlVMTDsKKwl9CisKKwogCXNpemUgPSBzaXplb2Yoc3RydWN0IGUxMDAwX2J1ZmZlcikgKiByeF9yaW5nLT5jb3VudDsKIAltZW1zZXQocnhfcmluZy0+YnVmZmVyX2luZm8sIDAsIHNpemUpOwogCXNpemUgPSBzaXplb2Yoc3RydWN0IGUxMDAwX3BzX3BhZ2UpICogcnhfcmluZy0+Y291bnQ7CkBAIC0xOTYzLDcgKzIxNDUsNyBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlczsgaSsrKQogCQllMTAwMF9jbGVhbl9yeF9yaW5nKGFkYXB0ZXIsICZhZGFwdGVyLT5yeF9yaW5nW2ldKTsKIH0KIApAQCAtMTk4NCw3ICsyMTY2LDcgQEAKIAlFMTAwMF9XUklURV9GTFVTSCgmYWRhcHRlci0+aHcpOwogCW1kZWxheSg1KTsKIAotCWlmKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQogCQllMTAwMF9jbGVhbl9hbGxfcnhfcmluZ3MoYWRhcHRlcik7CiB9CiAKQEAgLTIwMDAsMTIgKzIxODIsMTQgQEAKIAlFMTAwMF9XUklURV9GTFVTSCgmYWRhcHRlci0+aHcpOwogCW1kZWxheSg1KTsKIAotCWlmKGFkYXB0ZXItPmh3LnBjaV9jbWRfd29yZCAmIFBDSV9DT01NQU5EX0lOVkFMSURBVEUpCisJaWYgKGFkYXB0ZXItPmh3LnBjaV9jbWRfd29yZCAmIFBDSV9DT01NQU5EX0lOVkFMSURBVEUpCiAJCWUxMDAwX3BjaV9zZXRfbXdpKCZhZGFwdGVyLT5odyk7CiAKLQlpZihuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCS8qIE5vIG5lZWQgdG8gbG9vcCwgYmVjYXVzZSA4MjU0MiBzdXBwb3J0cyBvbmx5IDEgcXVldWUgKi8KKwkJc3RydWN0IGUxMDAwX3J4X3JpbmcgKnJpbmcgPSAmYWRhcHRlci0+cnhfcmluZ1swXTsKIAkJZTEwMDBfY29uZmlndXJlX3J4KGFkYXB0ZXIpOwotCQllMTAwMF9hbGxvY19yeF9idWZmZXJzKGFkYXB0ZXIsICZhZGFwdGVyLT5yeF9yaW5nWzBdKTsKKwkJYWRhcHRlci0+YWxsb2NfcnhfYnVmKGFkYXB0ZXIsIHJpbmcsIEUxMDAwX0RFU0NfVU5VU0VEKHJpbmcpKTsKIAl9CiB9CiAKQEAgLTIwMjMsMTIgKzIyMDcsMTIgQEAKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKIAotCWlmKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKQorCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkKIAkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwogCiAJLyogODI1NDIgMi4wIG5lZWRzIHRvIGJlIGluIHJlc2V0IHRvIHdyaXRlIHJlY2VpdmUgYWRkcmVzcyByZWdpc3RlcnMgKi8KIAotCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkKKwlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKQogCQllMTAwMF9lbnRlcl84MjU0Ml9yc3QoYWRhcHRlcik7CiAKIAltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgbmV0ZGV2LT5hZGRyX2xlbik7CkBAIC0yMDQyLDE3ICsyMjI2LDE3IEBACiAJCS8qIGFjdGl2YXRlIHRoZSB3b3JrIGFyb3VuZCAqLwogCQlhZGFwdGVyLT5ody5sYWFfaXNfcHJlc2VudCA9IDE7CiAKLQkJLyogSG9sZCBhIGNvcHkgb2YgdGhlIExBQSBpbiBSQVJbMTRdIFRoaXMgaXMgZG9uZSBzbyB0aGF0IAotCQkgKiBiZXR3ZWVuIHRoZSB0aW1lIFJBUlswXSBnZXRzIGNsb2JiZXJlZCAgYW5kIHRoZSB0aW1lIGl0IAotCQkgKiBnZXRzIGZpeGVkIChpbiBlMTAwMF93YXRjaGRvZyksIHRoZSBhY3R1YWwgTEFBIGlzIGluIG9uZSAKKwkJLyogSG9sZCBhIGNvcHkgb2YgdGhlIExBQSBpbiBSQVJbMTRdIFRoaXMgaXMgZG9uZSBzbyB0aGF0CisJCSAqIGJldHdlZW4gdGhlIHRpbWUgUkFSWzBdIGdldHMgY2xvYmJlcmVkICBhbmQgdGhlIHRpbWUgaXQKKwkJICogZ2V0cyBmaXhlZCAoaW4gZTEwMDBfd2F0Y2hkb2cpLCB0aGUgYWN0dWFsIExBQSBpcyBpbiBvbmUKIAkJICogb2YgdGhlIFJBUnMgYW5kIG5vIGluY29taW5nIHBhY2tldHMgZGlyZWN0ZWQgdG8gdGhpcyBwb3J0Ci0JCSAqIGFyZSBkcm9wcGVkLiBFdmVudGF1bGx5IHRoZSBMQUEgd2lsbCBiZSBpbiBSQVJbMF0gYW5kIAorCQkgKiBhcmUgZHJvcHBlZC4gRXZlbnRhdWxseSB0aGUgTEFBIHdpbGwgYmUgaW4gUkFSWzBdIGFuZAogCQkgKiBSQVJbMTRdICovCi0JCWUxMDAwX3Jhcl9zZXQoJmFkYXB0ZXItPmh3LCBhZGFwdGVyLT5ody5tYWNfYWRkciwgCisJCWUxMDAwX3Jhcl9zZXQoJmFkYXB0ZXItPmh3LCBhZGFwdGVyLT5ody5tYWNfYWRkciwKIAkJCQkJRTEwMDBfUkFSX0VOVFJJRVMgLSAxKTsKIAl9CiAKLQlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApCisJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkKIAkJZTEwMDBfbGVhdmVfODI1NDJfcnN0KGFkYXB0ZXIpOwogCiAJcmV0dXJuIDA7CkBAIC0yMDg2LDkgKzIyNzAsOSBAQAogCiAJcmN0bCA9IEUxMDAwX1JFQURfUkVHKGh3LCBSQ1RMKTsKIAotCWlmKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKIAkJcmN0bCB8PSAoRTEwMDBfUkNUTF9VUEUgfCBFMTAwMF9SQ1RMX01QRSk7Ci0JfSBlbHNlIGlmKG5ldGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwl9IGVsc2UgaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKIAkJcmN0bCB8PSBFMTAwMF9SQ1RMX01QRTsKIAkJcmN0bCAmPSB+RTEwMDBfUkNUTF9VUEU7CiAJfSBlbHNlIHsKQEAgLTIwOTksNyArMjI4Myw3IEBACiAKIAkvKiA4MjU0MiAyLjAgbmVlZHMgdG8gYmUgaW4gcmVzZXQgdG8gd3JpdGUgcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVycyAqLwogCi0JaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkKKwlpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkKIAkJZTEwMDBfZW50ZXJfODI1NDJfcnN0KGFkYXB0ZXIpOwogCiAJLyogbG9hZCB0aGUgZmlyc3QgMTQgbXVsdGljYXN0IGFkZHJlc3MgaW50byB0aGUgZXhhY3QgZmlsdGVycyAxLTE0CkBAIC0yMTA5LDcgKzIyOTMsNyBAQAogCSAqLwogCW1jX3B0ciA9IG5ldGRldi0+bWNfbGlzdDsKIAotCWZvcihpID0gMTsgaSA8IHJhcl9lbnRyaWVzOyBpKyspIHsKKwlmb3IgKGkgPSAxOyBpIDwgcmFyX2VudHJpZXM7IGkrKykgewogCQlpZiAobWNfcHRyKSB7CiAJCQllMTAwMF9yYXJfc2V0KGh3LCBtY19wdHItPmRtaV9hZGRyLCBpKTsKIAkJCW1jX3B0ciA9IG1jX3B0ci0+bmV4dDsKQEAgLTIxMjEsMTcgKzIzMDUsMTcgQEAKIAogCS8qIGNsZWFyIHRoZSBvbGQgc2V0dGluZ3MgZnJvbSB0aGUgbXVsdGljYXN0IGhhc2ggdGFibGUgKi8KIAotCWZvcihpID0gMDsgaSA8IEUxMDAwX05VTV9NVEFfUkVHSVNURVJTOyBpKyspCisJZm9yIChpID0gMDsgaSA8IEUxMDAwX05VTV9NVEFfUkVHSVNURVJTOyBpKyspCiAJCUUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgTVRBLCBpLCAwKTsKIAogCS8qIGxvYWQgYW55IHJlbWFpbmluZyBhZGRyZXNzZXMgaW50byB0aGUgaGFzaCB0YWJsZSAqLwogCi0JZm9yKDsgbWNfcHRyOyBtY19wdHIgPSBtY19wdHItPm5leHQpIHsKKwlmb3IgKDsgbWNfcHRyOyBtY19wdHIgPSBtY19wdHItPm5leHQpIHsKIAkJaGFzaF92YWx1ZSA9IGUxMDAwX2hhc2hfbWNfYWRkcihodywgbWNfcHRyLT5kbWlfYWRkcik7CiAJCWUxMDAwX210YV9zZXQoaHcsIGhhc2hfdmFsdWUpOwogCX0KIAotCWlmKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApCisJaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApCiAJCWUxMDAwX2xlYXZlXzgyNTQyX3JzdChhZGFwdGVyKTsKIH0KIApAQCAtMjE1Nyw4ICsyMzQxLDggQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCXVpbnQzMl90IHRjdGw7CiAKLQlpZihhdG9taWNfcmVhZCgmYWRhcHRlci0+dHhfZmlmb19zdGFsbCkpIHsKLQkJaWYoKEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVERUKSA9PQorCWlmIChhdG9taWNfcmVhZCgmYWRhcHRlci0+dHhfZmlmb19zdGFsbCkpIHsKKwkJaWYgKChFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFREVCkgPT0KIAkJICAgIEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVERIKSkgJiYKIAkJICAgKEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVERGVCkgPT0KIAkJICAgIEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVERGSCkpICYmCkBAIC0yMjA0LDI0ICsyMzg4LDI0IEBACiBlMTAwMF93YXRjaGRvZ190YXNrKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7Ci0Jc3RydWN0IGUxMDAwX3R4X3JpbmcgKnR4ZHIgPSAmYWRhcHRlci0+dHhfcmluZ1swXTsKKwlzdHJ1Y3QgZTEwMDBfdHhfcmluZyAqdHhkciA9IGFkYXB0ZXItPnR4X3Jpbmc7CiAJdWludDMyX3QgbGluazsKIAogCWUxMDAwX2NoZWNrX2Zvcl9saW5rKCZhZGFwdGVyLT5odyk7CiAJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTczKSB7CiAJCWUxMDAwX2VuYWJsZV90eF9wa3RfZmlsdGVyaW5nKCZhZGFwdGVyLT5odyk7Ci0JCWlmKGFkYXB0ZXItPm1uZ192bGFuX2lkICE9IGFkYXB0ZXItPmh3Lm1uZ19jb29raWUudmxhbl9pZCkKKwkJaWYgKGFkYXB0ZXItPm1uZ192bGFuX2lkICE9IGFkYXB0ZXItPmh3Lm1uZ19jb29raWUudmxhbl9pZCkKIAkJCWUxMDAwX3VwZGF0ZV9tbmdfdmxhbihhZGFwdGVyKTsKLQl9CQorCX0KIAotCWlmKChhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSAmJgorCWlmICgoYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykgJiYKIAkgICAhKEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVFhDVykgJiBFMTAwMF9UWENXX0FORSkpCiAJCWxpbmsgPSAhYWRhcHRlci0+aHcuc2VyZGVzX2xpbmtfZG93bjsKIAllbHNlCiAJCWxpbmsgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfTFU7CiAKLQlpZihsaW5rKSB7Ci0JCWlmKCFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKKwlpZiAobGluaykgeworCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgewogCQkJZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoJmFkYXB0ZXItPmh3LAogCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkYXB0ZXItPmxpbmtfc3BlZWQsCiAJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWRhcHRlci0+bGlua19kdXBsZXgpOwpAQCAtMjIzMSwxMyArMjQxNSwyOCBAQAogCQkJICAgICAgIGFkYXB0ZXItPmxpbmtfZHVwbGV4ID09IEZVTExfRFVQTEVYID8KIAkJCSAgICAgICAiRnVsbCBEdXBsZXgiIDogIkhhbGYgRHVwbGV4Iik7CiAKKwkJCS8qIHR3ZWFrIHR4X3F1ZXVlX2xlbiBhY2NvcmRpbmcgdG8gc3BlZWQvZHVwbGV4ICovCisJCQluZXRkZXYtPnR4X3F1ZXVlX2xlbiA9IGFkYXB0ZXItPnR4X3F1ZXVlX2xlbjsKKwkJCWFkYXB0ZXItPnR4X3RpbWVvdXRfZmFjdG9yID0gMTsKKwkJCWlmIChhZGFwdGVyLT5saW5rX2R1cGxleCA9PSBIQUxGX0RVUExFWCkgeworCQkJCXN3aXRjaCAoYWRhcHRlci0+bGlua19zcGVlZCkgeworCQkJCWNhc2UgU1BFRURfMTA6CisJCQkJCW5ldGRldi0+dHhfcXVldWVfbGVuID0gMTA7CisJCQkJCWFkYXB0ZXItPnR4X3RpbWVvdXRfZmFjdG9yID0gODsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTUEVFRF8xMDA6CisJCQkJCW5ldGRldi0+dHhfcXVldWVfbGVuID0gMTAwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKIAkJCW5ldGlmX2NhcnJpZXJfb24obmV0ZGV2KTsKIAkJCW5ldGlmX3dha2VfcXVldWUobmV0ZGV2KTsKIAkJCW1vZF90aW1lcigmYWRhcHRlci0+cGh5X2luZm9fdGltZXIsIGppZmZpZXMgKyAyICogSFopOwogCQkJYWRhcHRlci0+c21hcnRzcGVlZCA9IDA7CiAJCX0KIAl9IGVsc2UgewotCQlpZihuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgewogCQkJYWRhcHRlci0+bGlua19zcGVlZCA9IDA7CiAJCQlhZGFwdGVyLT5saW5rX2R1cGxleCA9IDA7CiAJCQlEUFJJTlRLKExJTkssIElORk8sICJOSUMgTGluayBpcyBEb3duXG4iKTsKQEAgLTIyNjMsNyArMjQ2MiwxMCBAQAogCiAJZTEwMDBfdXBkYXRlX2FkYXB0aXZlKCZhZGFwdGVyLT5odyk7CiAKLQlpZiAoYWRhcHRlci0+bnVtX3F1ZXVlcyA9PSAxICYmICFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKKyNpZmRlZiBDT05GSUdfRTEwMDBfTVEKKwl0eGRyID0gKnBlcl9jcHVfcHRyKGFkYXB0ZXItPmNwdV90eF9yaW5nLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworI2VuZGlmCisJaWYgKCFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKIAkJaWYgKEUxMDAwX0RFU0NfVU5VU0VEKHR4ZHIpICsgMSA8IHR4ZHItPmNvdW50KSB7CiAJCQkvKiBXZSd2ZSBsb3N0IGxpbmssIHNvIHRoZSBjb250cm9sbGVyIHN0b3BzIERNQSwKIAkJCSAqIGJ1dCB3ZSd2ZSBnb3QgcXVldWVkIFR4IHdvcmsgdGhhdCdzIG5ldmVyIGdvaW5nCkBAIC0yMjc0LDEyICsyNDc2LDEyIEBACiAJfQogCiAJLyogRHluYW1pYyBtb2RlIGZvciBJbnRlcnJ1cHQgVGhyb3R0bGUgUmF0ZSAoSVRSKSAqLwotCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQwICYmIGFkYXB0ZXItPml0ciA9PSAxKSB7CisJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQwICYmIGFkYXB0ZXItPml0ciA9PSAxKSB7CiAJCS8qIFN5bW1ldHJpYyBUeC9SeCBnZXRzIGEgcmVkdWNlZCBJVFI9MjAwMDsgVG90YWwKIAkJICogYXN5bW1ldHJpY2FsIFR4IG9yIFJ4IGdldHMgSVRSPTgwMDA7IGV2ZXJ5b25lCiAJCSAqIGVsc2UgaXMgYmV0d2VlbiAyMDAwLTgwMDAuICovCiAJCXVpbnQzMl90IGdvYyA9IChhZGFwdGVyLT5nb3RjbCArIGFkYXB0ZXItPmdvcmNsKSAvIDEwMDAwOwotCQl1aW50MzJfdCBkaWYgPSAoYWRhcHRlci0+Z290Y2wgPiBhZGFwdGVyLT5nb3JjbCA/IAorCQl1aW50MzJfdCBkaWYgPSAoYWRhcHRlci0+Z290Y2wgPiBhZGFwdGVyLT5nb3JjbCA/CiAJCQlhZGFwdGVyLT5nb3RjbCAtIGFkYXB0ZXItPmdvcmNsIDoKIAkJCWFkYXB0ZXItPmdvcmNsIC0gYWRhcHRlci0+Z290Y2wpIC8gMTAwMDA7CiAJCXVpbnQzMl90IGl0ciA9IGdvYyA+IDAgPyAoZGlmICogNjAwMCAvIGdvYyArIDIwMDApIDogODAwMDsKQEAgLTIyOTIsNyArMjQ5NCw3IEBACiAJLyogRm9yY2UgZGV0ZWN0aW9uIG9mIGh1bmcgY29udHJvbGxlciBldmVyeSB3YXRjaGRvZyBwZXJpb2QgKi8KIAlhZGFwdGVyLT5kZXRlY3RfdHhfaHVuZyA9IFRSVUU7CiAKLQkvKiBXaXRoIDgyNTcxIGNvbnRyb2xsZXJzLCBMQUEgbWF5IGJlIG92ZXJ3cml0dGVuIGR1ZSB0byBjb250cm9sbGVyIAorCS8qIFdpdGggODI1NzEgY29udHJvbGxlcnMsIExBQSBtYXkgYmUgb3ZlcndyaXR0ZW4gZHVlIHRvIGNvbnRyb2xsZXIKIAkgKiByZXNldCBmcm9tIHRoZSBvdGhlciBwb3J0LiBTZXQgdGhlIGFwcHJvcHJpYXRlIExBQSBpbiBSQVJbMF0gKi8KIAlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NzEgJiYgYWRhcHRlci0+aHcubGFhX2lzX3ByZXNlbnQpCiAJCWUxMDAwX3Jhcl9zZXQoJmFkYXB0ZXItPmh3LCBhZGFwdGVyLT5ody5tYWNfYWRkciwgMCk7CkBAIC0yMzE0LDEzICsyNTE2LDE0IEBACiB7CiAjaWZkZWYgTkVUSUZfRl9UU08KIAlzdHJ1Y3QgZTEwMDBfY29udGV4dF9kZXNjICpjb250ZXh0X2Rlc2M7CisJc3RydWN0IGUxMDAwX2J1ZmZlciAqYnVmZmVyX2luZm87CiAJdW5zaWduZWQgaW50IGk7CiAJdWludDMyX3QgY21kX2xlbmd0aCA9IDA7CiAJdWludDE2X3QgaXBjc2UgPSAwLCB0dWNzZSwgbXNzOwogCXVpbnQ4X3QgaXBjc3MsIGlwY3NvLCB0dWNzcywgdHVjc28sIGhkcl9sZW47CiAJaW50IGVycjsKIAotCWlmKHNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemUpIHsKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSkgewogCQlpZiAoc2tiX2hlYWRlcl9jbG9uZWQoc2tiKSkgewogCQkJZXJyID0gcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpOwogCQkJaWYgKGVycikKQEAgLTIzMjksNyArMjUzMiw3IEBACiAKIAkJaGRyX2xlbiA9ICgoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSkgKyAoc2tiLT5oLnRoLT5kb2ZmIDw8IDIpKTsKIAkJbXNzID0gc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZTsKLQkJaWYoc2tiLT5wcm90b2NvbCA9PSBudG9ocyhFVEhfUF9JUCkpIHsKKwkJaWYgKHNrYi0+cHJvdG9jb2wgPT0gbnRvaHMoRVRIX1BfSVApKSB7CiAJCQlza2ItPm5oLmlwaC0+dG90X2xlbiA9IDA7CiAJCQlza2ItPm5oLmlwaC0+Y2hlY2sgPSAwOwogCQkJc2tiLT5oLnRoLT5jaGVjayA9CkBAIC0yMzQxLDcgKzI1NDQsNyBAQAogCQkJY21kX2xlbmd0aCA9IEUxMDAwX1RYRF9DTURfSVA7CiAJCQlpcGNzZSA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGEgLSAxOwogI2lmZGVmIE5FVElGX0ZfVFNPX0lQVjYKLQkJfSBlbHNlIGlmKHNrYi0+cHJvdG9jb2wgPT0gbnRvaHMoRVRIX1BfSVBWNikpIHsKKwkJfSBlbHNlIGlmIChza2ItPnByb3RvY29sID09IG50b2hzKEVUSF9QX0lQVjYpKSB7CiAJCQlza2ItPm5oLmlwdjZoLT5wYXlsb2FkX2xlbiA9IDA7CiAJCQlza2ItPmgudGgtPmNoZWNrID0KIAkJCQl+Y3N1bV9pcHY2X21hZ2ljKCZza2ItPm5oLmlwdjZoLT5zYWRkciwKQEAgLTIzNjMsNiArMjU2Niw3IEBACiAKIAkJaSA9IHR4X3JpbmctPm5leHRfdG9fdXNlOwogCQljb250ZXh0X2Rlc2MgPSBFMTAwMF9DT05URVhUX0RFU0MoKnR4X3JpbmcsIGkpOworCQlidWZmZXJfaW5mbyA9ICZ0eF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKIAogCQljb250ZXh0X2Rlc2MtPmxvd2VyX3NldHVwLmlwX2ZpZWxkcy5pcGNzcyAgPSBpcGNzczsKIAkJY29udGV4dF9kZXNjLT5sb3dlcl9zZXR1cC5pcF9maWVsZHMuaXBjc28gID0gaXBjc287CkBAIC0yMzc0LDE0ICsyNTc4LDE2IEBACiAJCWNvbnRleHRfZGVzYy0+dGNwX3NlZ19zZXR1cC5maWVsZHMuaGRyX2xlbiA9IGhkcl9sZW47CiAJCWNvbnRleHRfZGVzYy0+Y21kX2FuZF9sZW5ndGggPSBjcHVfdG9fbGUzMihjbWRfbGVuZ3RoKTsKIAorCQlidWZmZXJfaW5mby0+dGltZV9zdGFtcCA9IGppZmZpZXM7CisKIAkJaWYgKCsraSA9PSB0eF9yaW5nLT5jb3VudCkgaSA9IDA7CiAJCXR4X3JpbmctPm5leHRfdG9fdXNlID0gaTsKIAotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIFRSVUU7CiAJfQogI2VuZGlmCiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gRkFMU0U7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbGVhbl90CkBAIC0yMzg5LDEzICsyNTk1LDE1IEBACiAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGUxMDAwX2NvbnRleHRfZGVzYyAqY29udGV4dF9kZXNjOworCXN0cnVjdCBlMTAwMF9idWZmZXIgKmJ1ZmZlcl9pbmZvOwogCXVuc2lnbmVkIGludCBpOwogCXVpbnQ4X3QgY3NzOwogCi0JaWYobGlrZWx5KHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSkgeworCWlmIChsaWtlbHkoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpKSB7CiAJCWNzcyA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGE7CiAKIAkJaSA9IHR4X3JpbmctPm5leHRfdG9fdXNlOworCQlidWZmZXJfaW5mbyA9ICZ0eF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKIAkJY29udGV4dF9kZXNjID0gRTEwMDBfQ09OVEVYVF9ERVNDKCp0eF9yaW5nLCBpKTsKIAogCQljb250ZXh0X2Rlc2MtPnVwcGVyX3NldHVwLnRjcF9maWVsZHMudHVjc3MgPSBjc3M7CkBAIC0yNDA0LDYgKzI2MTIsOCBAQAogCQljb250ZXh0X2Rlc2MtPnRjcF9zZWdfc2V0dXAuZGF0YSA9IDA7CiAJCWNvbnRleHRfZGVzYy0+Y21kX2FuZF9sZW5ndGggPSBjcHVfdG9fbGUzMihFMTAwMF9UWERfQ01EX0RFWFQpOwogCisJCWJ1ZmZlcl9pbmZvLT50aW1lX3N0YW1wID0gamlmZmllczsKKwogCQlpZiAodW5saWtlbHkoKytpID09IHR4X3JpbmctPmNvdW50KSkgaSA9IDA7CiAJCXR4X3JpbmctPm5leHRfdG9fdXNlID0gaTsKIApAQCAtMjQyOSw3ICsyNjM5LDcgQEAKIAogCWkgPSB0eF9yaW5nLT5uZXh0X3RvX3VzZTsKIAotCXdoaWxlKGxlbikgeworCXdoaWxlIChsZW4pIHsKIAkJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+YnVmZmVyX2luZm9baV07CiAJCXNpemUgPSBtaW4obGVuLCBtYXhfcGVyX3R4ZCk7CiAjaWZkZWYgTkVUSUZfRl9UU08KQEAgLTI0NDUsNyArMjY1NSw3IEBACiAKIAkJLyogV29ya2Fyb3VuZCBmb3IgcHJlbWF0dXJlIGRlc2Mgd3JpdGUtYmFja3MKIAkJICogaW4gVFNPIG1vZGUuICBBcHBlbmQgNC1ieXRlIHNlbnRpbmVsIGRlc2MgKi8KLQkJaWYodW5saWtlbHkobXNzICYmICFucl9mcmFncyAmJiBzaXplID09IGxlbiAmJiBzaXplID4gOCkpCisJCWlmICh1bmxpa2VseShtc3MgJiYgIW5yX2ZyYWdzICYmIHNpemUgPT0gbGVuICYmIHNpemUgPiA4KSkKIAkJCXNpemUgLT0gNDsKICNlbmRpZgogCQkvKiB3b3JrLWFyb3VuZCBmb3IgZXJyYXRhIDEwIGFuZCBpdCBhcHBsaWVzCkBAIC0yNDUzLDEzICsyNjYzLDEzIEBACiAJCSAqIFRoZSBmaXggaXMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGZpcnN0IGRlc2NyaXB0b3Igb2YgYQogCQkgKiBwYWNrZXQgaXMgc21hbGxlciB0aGFuIDIwNDggLSAxNiAtIDE2IChvciAyMDE2KSBieXRlcwogCQkgKi8KLQkJaWYodW5saWtlbHkoKGFkYXB0ZXItPmh3LmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaXgpICYmCisJCWlmICh1bmxpa2VseSgoYWRhcHRlci0+aHcuYnVzX3R5cGUgPT0gZTEwMDBfYnVzX3R5cGVfcGNpeCkgJiYKIAkJICAgICAgICAgICAgICAgIChzaXplID4gMjAxNSkgJiYgY291bnQgPT0gMCkpCiAJCSAgICAgICAgc2l6ZSA9IDIwMTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCiAJCS8qIFdvcmthcm91bmQgZm9yIHBvdGVudGlhbCA4MjU0NCBoYW5nIGluIFBDSS1YLiAgQXZvaWQKIAkJICogdGVybWluYXRpbmcgYnVmZmVycyB3aXRoaW4gZXZlbmx5LWFsaWduZWQgZHdvcmRzLiAqLwotCQlpZih1bmxpa2VseShhZGFwdGVyLT5wY2l4XzgyNTQ0ICYmCisJCWlmICh1bmxpa2VseShhZGFwdGVyLT5wY2l4XzgyNTQ0ICYmCiAJCSAgICEoKHVuc2lnbmVkIGxvbmcpKHNrYi0+ZGF0YSArIG9mZnNldCArIHNpemUgLSAxKSAmIDQpICYmCiAJCSAgIHNpemUgPiA0KSkKIAkJCXNpemUgLT0gNDsKQEAgLTI0NzUsMjkgKzI2ODUsMjkgQEAKIAkJbGVuIC09IHNpemU7CiAJCW9mZnNldCArPSBzaXplOwogCQljb3VudCsrOwotCQlpZih1bmxpa2VseSgrK2kgPT0gdHhfcmluZy0+Y291bnQpKSBpID0gMDsKKwkJaWYgKHVubGlrZWx5KCsraSA9PSB0eF9yaW5nLT5jb3VudCkpIGkgPSAwOwogCX0KIAotCWZvcihmID0gMDsgZiA8IG5yX2ZyYWdzOyBmKyspIHsKKwlmb3IgKGYgPSAwOyBmIDwgbnJfZnJhZ3M7IGYrKykgewogCQlzdHJ1Y3Qgc2tiX2ZyYWdfc3RydWN0ICpmcmFnOwogCiAJCWZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tmXTsKIAkJbGVuID0gZnJhZy0+c2l6ZTsKIAkJb2Zmc2V0ID0gZnJhZy0+cGFnZV9vZmZzZXQ7CiAKLQkJd2hpbGUobGVuKSB7CisJCXdoaWxlIChsZW4pIHsKIAkJCWJ1ZmZlcl9pbmZvID0gJnR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOwogCQkJc2l6ZSA9IG1pbihsZW4sIG1heF9wZXJfdHhkKTsKICNpZmRlZiBORVRJRl9GX1RTTwogCQkJLyogV29ya2Fyb3VuZCBmb3IgcHJlbWF0dXJlIGRlc2Mgd3JpdGUtYmFja3MKIAkJCSAqIGluIFRTTyBtb2RlLiAgQXBwZW5kIDQtYnl0ZSBzZW50aW5lbCBkZXNjICovCi0JCQlpZih1bmxpa2VseShtc3MgJiYgZiA9PSAobnJfZnJhZ3MtMSkgJiYgc2l6ZSA9PSBsZW4gJiYgc2l6ZSA+IDgpKQorCQkJaWYgKHVubGlrZWx5KG1zcyAmJiBmID09IChucl9mcmFncy0xKSAmJiBzaXplID09IGxlbiAmJiBzaXplID4gOCkpCiAJCQkJc2l6ZSAtPSA0OwogI2VuZGlmCiAJCQkvKiBXb3JrYXJvdW5kIGZvciBwb3RlbnRpYWwgODI1NDQgaGFuZyBpbiBQQ0ktWC4KIAkJCSAqIEF2b2lkIHRlcm1pbmF0aW5nIGJ1ZmZlcnMgd2l0aGluIGV2ZW5seS1hbGlnbmVkCiAJCQkgKiBkd29yZHMuICovCi0JCQlpZih1bmxpa2VseShhZGFwdGVyLT5wY2l4XzgyNTQ0ICYmCisJCQlpZiAodW5saWtlbHkoYWRhcHRlci0+cGNpeF84MjU0NCAmJgogCQkJICAgISgodW5zaWduZWQgbG9uZykoZnJhZy0+cGFnZStvZmZzZXQrc2l6ZS0xKSAmIDQpICYmCiAJCQkgICBzaXplID4gNCkpCiAJCQkJc2l6ZSAtPSA0OwpAQCAtMjUxNCw3ICsyNzI0LDcgQEAKIAkJCWxlbiAtPSBzaXplOwogCQkJb2Zmc2V0ICs9IHNpemU7CiAJCQljb3VudCsrOwotCQkJaWYodW5saWtlbHkoKytpID09IHR4X3JpbmctPmNvdW50KSkgaSA9IDA7CisJCQlpZiAodW5saWtlbHkoKytpID09IHR4X3JpbmctPmNvdW50KSkgaSA9IDA7CiAJCX0KIAl9CiAKQEAgLTI1MzQsMzUgKzI3NDQsMzUgQEAKIAl1aW50MzJfdCB0eGRfdXBwZXIgPSAwLCB0eGRfbG93ZXIgPSBFMTAwMF9UWERfQ01EX0lGQ1M7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlpZihsaWtlbHkodHhfZmxhZ3MgJiBFMTAwMF9UWF9GTEFHU19UU08pKSB7CisJaWYgKGxpa2VseSh0eF9mbGFncyAmIEUxMDAwX1RYX0ZMQUdTX1RTTykpIHsKIAkJdHhkX2xvd2VyIHw9IEUxMDAwX1RYRF9DTURfREVYVCB8IEUxMDAwX1RYRF9EVFlQX0QgfAogCQkgICAgICAgICAgICAgRTEwMDBfVFhEX0NNRF9UU0U7CiAJCXR4ZF91cHBlciB8PSBFMTAwMF9UWERfUE9QVFNfVFhTTSA8PCA4OwogCi0JCWlmKGxpa2VseSh0eF9mbGFncyAmIEUxMDAwX1RYX0ZMQUdTX0lQVjQpKQorCQlpZiAobGlrZWx5KHR4X2ZsYWdzICYgRTEwMDBfVFhfRkxBR1NfSVBWNCkpCiAJCQl0eGRfdXBwZXIgfD0gRTEwMDBfVFhEX1BPUFRTX0lYU00gPDwgODsKIAl9CiAKLQlpZihsaWtlbHkodHhfZmxhZ3MgJiBFMTAwMF9UWF9GTEFHU19DU1VNKSkgeworCWlmIChsaWtlbHkodHhfZmxhZ3MgJiBFMTAwMF9UWF9GTEFHU19DU1VNKSkgewogCQl0eGRfbG93ZXIgfD0gRTEwMDBfVFhEX0NNRF9ERVhUIHwgRTEwMDBfVFhEX0RUWVBfRDsKIAkJdHhkX3VwcGVyIHw9IEUxMDAwX1RYRF9QT1BUU19UWFNNIDw8IDg7CiAJfQogCi0JaWYodW5saWtlbHkodHhfZmxhZ3MgJiBFMTAwMF9UWF9GTEFHU19WTEFOKSkgeworCWlmICh1bmxpa2VseSh0eF9mbGFncyAmIEUxMDAwX1RYX0ZMQUdTX1ZMQU4pKSB7CiAJCXR4ZF9sb3dlciB8PSBFMTAwMF9UWERfQ01EX1ZMRTsKIAkJdHhkX3VwcGVyIHw9ICh0eF9mbGFncyAmIEUxMDAwX1RYX0ZMQUdTX1ZMQU5fTUFTSyk7CiAJfQogCiAJaSA9IHR4X3JpbmctPm5leHRfdG9fdXNlOwogCi0Jd2hpbGUoY291bnQtLSkgeworCXdoaWxlIChjb3VudC0tKSB7CiAJCWJ1ZmZlcl9pbmZvID0gJnR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOwogCQl0eF9kZXNjID0gRTEwMDBfVFhfREVTQygqdHhfcmluZywgaSk7CiAJCXR4X2Rlc2MtPmJ1ZmZlcl9hZGRyID0gY3B1X3RvX2xlNjQoYnVmZmVyX2luZm8tPmRtYSk7CiAJCXR4X2Rlc2MtPmxvd2VyLmRhdGEgPQogCQkJY3B1X3RvX2xlMzIodHhkX2xvd2VyIHwgYnVmZmVyX2luZm8tPmxlbmd0aCk7CiAJCXR4X2Rlc2MtPnVwcGVyLmRhdGEgPSBjcHVfdG9fbGUzMih0eGRfdXBwZXIpOwotCQlpZih1bmxpa2VseSgrK2kgPT0gdHhfcmluZy0+Y291bnQpKSBpID0gMDsKKwkJaWYgKHVubGlrZWx5KCsraSA9PSB0eF9yaW5nLT5jb3VudCkpIGkgPSAwOwogCX0KIAogCXR4X2Rlc2MtPmxvd2VyLmRhdGEgfD0gY3B1X3RvX2xlMzIoYWRhcHRlci0+dHhkX2NtZCk7CkBAIC0yNTk3LDIwICsyODA3LDIwIEBACiAKIAlFMTAwMF9ST1VORFVQKHNrYl9maWZvX2xlbiwgRTEwMDBfRklGT19IRFIpOwogCi0JaWYoYWRhcHRlci0+bGlua19kdXBsZXggIT0gSEFMRl9EVVBMRVgpCisJaWYgKGFkYXB0ZXItPmxpbmtfZHVwbGV4ICE9IEhBTEZfRFVQTEVYKQogCQlnb3RvIG5vX2ZpZm9fc3RhbGxfcmVxdWlyZWQ7CiAKLQlpZihhdG9taWNfcmVhZCgmYWRhcHRlci0+dHhfZmlmb19zdGFsbCkpCisJaWYgKGF0b21pY19yZWFkKCZhZGFwdGVyLT50eF9maWZvX3N0YWxsKSkKIAkJcmV0dXJuIDE7CiAKLQlpZihza2JfZmlmb19sZW4gPj0gKEUxMDAwXzgyNTQ3X1BBRF9MRU4gKyBmaWZvX3NwYWNlKSkgeworCWlmIChza2JfZmlmb19sZW4gPj0gKEUxMDAwXzgyNTQ3X1BBRF9MRU4gKyBmaWZvX3NwYWNlKSkgewogCQlhdG9taWNfc2V0KCZhZGFwdGVyLT50eF9maWZvX3N0YWxsLCAxKTsKIAkJcmV0dXJuIDE7CiAJfQogCiBub19maWZvX3N0YWxsX3JlcXVpcmVkOgogCWFkYXB0ZXItPnR4X2ZpZm9faGVhZCArPSBza2JfZmlmb19sZW47Ci0JaWYoYWRhcHRlci0+dHhfZmlmb19oZWFkID49IGFkYXB0ZXItPnR4X2ZpZm9fc2l6ZSkKKwlpZiAoYWRhcHRlci0+dHhfZmlmb19oZWFkID49IGFkYXB0ZXItPnR4X2ZpZm9fc2l6ZSkKIAkJYWRhcHRlci0+dHhfZmlmb19oZWFkIC09IGFkYXB0ZXItPnR4X2ZpZm9fc2l6ZTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI2MjEsMjcgKzI4MzEsMjcgQEAKIHsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gICZhZGFwdGVyLT5odzsKIAl1aW50MTZfdCBsZW5ndGgsIG9mZnNldDsKLQlpZih2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpIHsKLQkJaWYoISgodmxhbl90eF90YWdfZ2V0KHNrYikgPT0gYWRhcHRlci0+aHcubW5nX2Nvb2tpZS52bGFuX2lkKSAmJgorCWlmICh2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpIHsKKwkJaWYgKCEoKHZsYW5fdHhfdGFnX2dldChza2IpID09IGFkYXB0ZXItPmh3Lm1uZ19jb29raWUudmxhbl9pZCkgJiYKIAkJCSggYWRhcHRlci0+aHcubW5nX2Nvb2tpZS5zdGF0dXMgJgogCQkJICBFMTAwMF9NTkdfREhDUF9DT09LSUVfU1RBVFVTX1ZMQU5fU1VQUE9SVCkpICkKIAkJCXJldHVybiAwOwogCX0KLSAJaWYgKChza2ItPmxlbiA+IE1JTklNVU1fREhDUF9QQUNLRVRfU0laRSkgJiYgKCFza2ItPnByb3RvY29sKSkgeworCWlmICgoc2tiLT5sZW4gPiBNSU5JTVVNX0RIQ1BfUEFDS0VUX1NJWkUpICYmICghc2tiLT5wcm90b2NvbCkpIHsKIAkJc3RydWN0IGV0aGhkciAqZXRoID0gKHN0cnVjdCBldGhoZHIgKikgc2tiLT5kYXRhOwotCQlpZigoaHRvbnMoRVRIX1BfSVApID09IGV0aC0+aF9wcm90bykpIHsKLQkJCWNvbnN0IHN0cnVjdCBpcGhkciAqaXAgPSAKKwkJaWYgKChodG9ucyhFVEhfUF9JUCkgPT0gZXRoLT5oX3Byb3RvKSkgeworCQkJY29uc3Qgc3RydWN0IGlwaGRyICppcCA9CiAJCQkJKHN0cnVjdCBpcGhkciAqKSgodWludDhfdCAqKXNrYi0+ZGF0YSsxNCk7Ci0JCQlpZihJUFBST1RPX1VEUCA9PSBpcC0+cHJvdG9jb2wpIHsKLQkJCQlzdHJ1Y3QgdWRwaGRyICp1ZHAgPSAKLQkJCQkJKHN0cnVjdCB1ZHBoZHIgKikoKHVpbnQ4X3QgKilpcCArIAorCQkJaWYgKElQUFJPVE9fVURQID09IGlwLT5wcm90b2NvbCkgeworCQkJCXN0cnVjdCB1ZHBoZHIgKnVkcCA9CisJCQkJCShzdHJ1Y3QgdWRwaGRyICopKCh1aW50OF90ICopaXAgKwogCQkJCQkJKGlwLT5paGwgPDwgMikpOwotCQkJCWlmKG50b2hzKHVkcC0+ZGVzdCkgPT0gNjcpIHsKKwkJCQlpZiAobnRvaHModWRwLT5kZXN0KSA9PSA2NykgewogCQkJCQlvZmZzZXQgPSAodWludDhfdCAqKXVkcCArIDggLSBza2ItPmRhdGE7CiAJCQkJCWxlbmd0aCA9IHNrYi0+bGVuIC0gb2Zmc2V0OwogCiAJCQkJCXJldHVybiBlMTAwMF9tbmdfd3JpdGVfZGhjcF9pbmZvKGh3LAotCQkJCQkJCSh1aW50OF90ICopdWRwICsgOCwgCisJCQkJCQkJKHVpbnQ4X3QgKil1ZHAgKyA4LAogCQkJCQkJCWxlbmd0aCk7CiAJCQkJfQogCQkJfQpAQCAtMjY2NCw3ICsyODc0LDcgQEAKIAl1bnNpZ25lZCBpbnQgbnJfZnJhZ3MgPSAwOwogCXVuc2lnbmVkIGludCBtc3MgPSAwOwogCWludCBjb3VudCA9IDA7Ci0JaW50IHRzbzsKKyAJaW50IHRzbzsKIAl1bnNpZ25lZCBpbnQgZjsKIAlsZW4gLT0gc2tiLT5kYXRhX2xlbjsKIApAQCAtMjY4NywxNiArMjg5NywzNSBAQAogCSAqIDQgPSBjZWlsKGJ1ZmZlciBsZW4vbXNzKS4gIFRvIG1ha2Ugc3VyZSB3ZSBkb24ndAogCSAqIG92ZXJydW4gdGhlIEZJRk8sIGFkanVzdCB0aGUgbWF4IGJ1ZmZlciBsZW4gaWYgbXNzCiAJICogZHJvcHMuICovCi0JaWYobXNzKSB7CisJaWYgKG1zcykgeworCQl1aW50OF90IGhkcl9sZW47CiAJCW1heF9wZXJfdHhkID0gbWluKG1zcyA8PCAyLCBtYXhfcGVyX3R4ZCk7CiAJCW1heF90eGRfcHdyID0gZmxzKG1heF9wZXJfdHhkKSAtIDE7CisKKwkvKiBUU08gV29ya2Fyb3VuZCBmb3IgODI1NzEvMiBDb250cm9sbGVycyAtLSBpZiBza2ItPmRhdGEKKwkgKiBwb2ludHMgdG8ganVzdCBoZWFkZXIsIHB1bGwgYSBmZXcgYnl0ZXMgb2YgcGF5bG9hZCBmcm9tCisJICogZnJhZ3MgaW50byBza2ItPmRhdGEgKi8KKwkJaGRyX2xlbiA9ICgoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSkgKyAoc2tiLT5oLnRoLT5kb2ZmIDw8IDIpKTsKKwkJaWYgKHNrYi0+ZGF0YV9sZW4gJiYgKGhkcl9sZW4gPT0gKHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbikpICYmCisJCQkoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NzEgfHwKKwkJCWFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTcyKSkgeworCQkJdW5zaWduZWQgaW50IHB1bGxfc2l6ZTsKKwkJCXB1bGxfc2l6ZSA9IG1pbigodW5zaWduZWQgaW50KTQsIHNrYi0+ZGF0YV9sZW4pOworCQkJaWYgKCFfX3Bza2JfcHVsbF90YWlsKHNrYiwgcHVsbF9zaXplKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiX19wc2tiX3B1bGxfdGFpbCBmYWlsZWQuXG4iKTsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJbGVuID0gc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuOworCQl9CiAJfQogCi0JaWYoKG1zcykgfHwgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSkKKwkvKiByZXNlcnZlIGEgZGVzY3JpcHRvciBmb3IgdGhlIG9mZmxvYWQgY29udGV4dCAqLworCWlmICgobXNzKSB8fCAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpKQogCQljb3VudCsrOwogCWNvdW50Kys7CiAjZWxzZQotCWlmKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKQorCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykKIAkJY291bnQrKzsKICNlbmRpZgogCkBAIC0yNzA5LDQ1ICsyOTM4LDI0IEBACiAKIAljb3VudCArPSBUWERfVVNFX0NPVU5UKGxlbiwgbWF4X3R4ZF9wd3IpOwogCi0JaWYoYWRhcHRlci0+cGNpeF84MjU0NCkKKwlpZiAoYWRhcHRlci0+cGNpeF84MjU0NCkKIAkJY291bnQrKzsKIAotCS8qIHdvcmstYXJvdW5kIGZvciBlcnJhdGEgMTAgYW5kIGl0IGFwcGxpZXMgdG8gYWxsIGNvbnRyb2xsZXJzIAorCS8qIHdvcmstYXJvdW5kIGZvciBlcnJhdGEgMTAgYW5kIGl0IGFwcGxpZXMgdG8gYWxsIGNvbnRyb2xsZXJzCiAJICogaW4gUENJLVggbW9kZSwgc28gYWRkIG9uZSBtb3JlIGRlc2NyaXB0b3IgdG8gdGhlIGNvdW50CiAJICovCi0JaWYodW5saWtlbHkoKGFkYXB0ZXItPmh3LmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaXgpICYmCisJaWYgKHVubGlrZWx5KChhZGFwdGVyLT5ody5idXNfdHlwZSA9PSBlMTAwMF9idXNfdHlwZV9wY2l4KSAmJgogCQkJKGxlbiA+IDIwMTUpKSkKIAkJY291bnQrKzsKIAogCW5yX2ZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKLQlmb3IoZiA9IDA7IGYgPCBucl9mcmFnczsgZisrKQorCWZvciAoZiA9IDA7IGYgPCBucl9mcmFnczsgZisrKQogCQljb3VudCArPSBUWERfVVNFX0NPVU5UKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbZl0uc2l6ZSwKIAkJCQkgICAgICAgbWF4X3R4ZF9wd3IpOwotCWlmKGFkYXB0ZXItPnBjaXhfODI1NDQpCisJaWYgKGFkYXB0ZXItPnBjaXhfODI1NDQpCiAJCWNvdW50ICs9IG5yX2ZyYWdzOwogCi0jaWZkZWYgTkVUSUZfRl9UU08KLQkvKiBUU08gV29ya2Fyb3VuZCBmb3IgODI1NzEvMiBDb250cm9sbGVycyAtLSBpZiBza2ItPmRhdGEKLQkgKiBwb2ludHMgdG8ganVzdCBoZWFkZXIsIHB1bGwgYSBmZXcgYnl0ZXMgb2YgcGF5bG9hZCBmcm9tIAotCSAqIGZyYWdzIGludG8gc2tiLT5kYXRhICovCi0JaWYgKHNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemUpIHsKLQkJdWludDhfdCBoZHJfbGVuOwotCQloZHJfbGVuID0gKChza2ItPmgucmF3IC0gc2tiLT5kYXRhKSArIChza2ItPmgudGgtPmRvZmYgPDwgMikpOwotCQlpZiAoc2tiLT5kYXRhX2xlbiAmJiAoaGRyX2xlbiA8IChza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW4pKSAmJiAKLQkJCShhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF84MjU3MSB8fAotCQkJYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NzIpKSB7Ci0JCQl1bnNpZ25lZCBpbnQgcHVsbF9zaXplOwotCQkJcHVsbF9zaXplID0gbWluKCh1bnNpZ25lZCBpbnQpNCwgc2tiLT5kYXRhX2xlbik7Ci0JCQlpZiAoIV9fcHNrYl9wdWxsX3RhaWwoc2tiLCBwdWxsX3NpemUpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJfX3Bza2JfcHVsbF90YWlsIGZhaWxlZC5cbiIpOwotCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl9Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCWlmKGFkYXB0ZXItPmh3LnR4X3BrdF9maWx0ZXJpbmcgJiYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTczKSApCisJaWYgKGFkYXB0ZXItPmh3LnR4X3BrdF9maWx0ZXJpbmcgJiYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTczKSApCiAJCWUxMDAwX3RyYW5zZmVyX2RoY3BfaW5mbyhhZGFwdGVyLCBza2IpOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwpAQCAtMjc2NSw4ICsyOTczLDggQEAKIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KIAotCWlmKHVubGlrZWx5KGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTQ3KSkgewotCQlpZih1bmxpa2VseShlMTAwMF84MjU0N19maWZvX3dvcmthcm91bmQoYWRhcHRlciwgc2tiKSkpIHsKKwlpZiAodW5saWtlbHkoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSB7CisJCWlmICh1bmxpa2VseShlMTAwMF84MjU0N19maWZvX3dvcmthcm91bmQoYWRhcHRlciwgc2tiKSkpIHsKIAkJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKIAkJCW1vZF90aW1lcigmYWRhcHRlci0+dHhfZmlmb19zdGFsbF90aW1lciwgamlmZmllcyk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0eF9yaW5nLT50eF9sb2NrLCBmbGFncyk7CkBAIC0yNzc0LDEzICsyOTgyLDEzIEBACiAJCX0KIAl9CiAKLQlpZih1bmxpa2VseShhZGFwdGVyLT52bGdycCAmJiB2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpKSB7CisJaWYgKHVubGlrZWx5KGFkYXB0ZXItPnZsZ3JwICYmIHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkpIHsKIAkJdHhfZmxhZ3MgfD0gRTEwMDBfVFhfRkxBR1NfVkxBTjsKIAkJdHhfZmxhZ3MgfD0gKHZsYW5fdHhfdGFnX2dldChza2IpIDw8IEUxMDAwX1RYX0ZMQUdTX1ZMQU5fU0hJRlQpOwogCX0KIAogCWZpcnN0ID0gdHhfcmluZy0+bmV4dF90b191c2U7Ci0JCisKIAl0c28gPSBlMTAwMF90c28oYWRhcHRlciwgdHhfcmluZywgc2tiKTsKIAlpZiAodHNvIDwgMCkgewogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwpAQCAtMjgzMyw2ICszMDQxLDcgQEAKIHsKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKKwlhZGFwdGVyLT50eF90aW1lb3V0X2NvdW50Kys7CiAJZTEwMDBfZG93bihhZGFwdGVyKTsKIAllMTAwMF91cChhZGFwdGVyKTsKIH0KQEAgLTI4NTAsNyArMzA1OSw3IEBACiB7CiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCi0JZTEwMDBfdXBkYXRlX3N0YXRzKGFkYXB0ZXIpOworCS8qIG9ubHkgcmV0dXJuIHRoZSBjdXJyZW50IHN0YXRzICovCiAJcmV0dXJuICZhZGFwdGVyLT5uZXRfc3RhdHM7CiB9CiAKQEAgLTI4NjgsNTYgKzMwNzcsNTcgQEAKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJaW50IG1heF9mcmFtZSA9IG5ld19tdHUgKyBFTkVUX0hFQURFUl9TSVpFICsgRVRIRVJORVRfRkNTX1NJWkU7CiAKLQlpZigobWF4X2ZyYW1lIDwgTUlOSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFKSB8fAotCQkobWF4X2ZyYW1lID4gTUFYX0pVTUJPX0ZSQU1FX1NJWkUpKSB7Ci0JCQlEUFJJTlRLKFBST0JFLCBFUlIsICJJbnZhbGlkIE1UVSBzZXR0aW5nXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQotI2RlZmluZSBNQVhfU1REX0pVTUJPX0ZSQU1FX1NJWkUgOTIzNAotCS8qIG1pZ2h0IHdhbnQgdGhpcyB0byBiZSBiaWdnZXIgZW51bSBjaGVjay4uLiAqLwotCS8qIDgyNTcxIGNvbnRyb2xsZXJzIGxpbWl0IGp1bWJvIGZyYW1lIHNpemUgdG8gMTA1MDAgYnl0ZXMgKi8KLQlpZiAoKGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTcxIHx8IAotCSAgICAgYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NzIpICYmCi0JICAgIG1heF9mcmFtZSA+IE1BWF9TVERfSlVNQk9fRlJBTUVfU0laRSkgewotCQlEUFJJTlRLKFBST0JFLCBFUlIsICJNVFUgPiA5MjE2IGJ5dGVzIG5vdCBzdXBwb3J0ZWQgIgotCQkJCSAgICAib24gODI1NzEgYW5kIDgyNTcyIGNvbnRyb2xsZXJzLlxuIik7CisJaWYgKChtYXhfZnJhbWUgPCBNSU5JTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkUpIHx8CisJICAgIChtYXhfZnJhbWUgPiBNQVhfSlVNQk9fRlJBTUVfU0laRSkpIHsKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAiSW52YWxpZCBNVFUgc2V0dGluZ1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTczICYmCi0JICAgIG1heF9mcmFtZSA+IE1BWElNVU1fRVRIRVJORVRfRlJBTUVfU0laRSkgewotCQlEUFJJTlRLKFBST0JFLCBFUlIsICJKdW1ibyBGcmFtZXMgbm90IHN1cHBvcnRlZCAiCi0JCQkJICAgICJvbiA4MjU3M1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlID4gZTEwMDBfODI1NDdfcmV2XzIpIHsKLQkJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA9IG1heF9mcmFtZTsKLQkJRTEwMDBfUk9VTkRVUChhZGFwdGVyLT5yeF9idWZmZXJfbGVuLCAxMDI0KTsKLQl9IGVsc2UgewotCQlpZih1bmxpa2VseSgoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU0MykgJiYKLQkJICAgKG1heF9mcmFtZSA+IE1BWElNVU1fRVRIRVJORVRfRlJBTUVfU0laRSkpKSB7Ci0JCQlEUFJJTlRLKFBST0JFLCBFUlIsICJKdW1ibyBGcmFtZXMgbm90IHN1cHBvcnRlZCAiCi0JCQkJCSAgICAib24gODI1NDJcbiIpOworCS8qIEFkYXB0ZXItc3BlY2lmaWMgbWF4IGZyYW1lIHNpemUgbGltaXRzLiAqLworCXN3aXRjaCAoYWRhcHRlci0+aHcubWFjX3R5cGUpIHsKKwljYXNlIGUxMDAwXzgyNTQyX3JldjJfMDoKKwljYXNlIGUxMDAwXzgyNTQyX3JldjJfMToKKwljYXNlIGUxMDAwXzgyNTczOgorCQlpZiAobWF4X2ZyYW1lID4gTUFYSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFKSB7CisJCQlEUFJJTlRLKFBST0JFLCBFUlIsICJKdW1ibyBGcmFtZXMgbm90IHN1cHBvcnRlZC5cbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJfSBlbHNlIHsKLQkJCWlmKG1heF9mcmFtZSA8PSBFMTAwMF9SWEJVRkZFUl8yMDQ4KSB7Ci0JCQkJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA9IEUxMDAwX1JYQlVGRkVSXzIwNDg7Ci0JCQl9IGVsc2UgaWYobWF4X2ZyYW1lIDw9IEUxMDAwX1JYQlVGRkVSXzQwOTYpIHsKLQkJCQlhZGFwdGVyLT5yeF9idWZmZXJfbGVuID0gRTEwMDBfUlhCVUZGRVJfNDA5NjsKLQkJCX0gZWxzZSBpZihtYXhfZnJhbWUgPD0gRTEwMDBfUlhCVUZGRVJfODE5MikgewotCQkJCWFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gPSBFMTAwMF9SWEJVRkZFUl84MTkyOwotCQkJfSBlbHNlIGlmKG1heF9mcmFtZSA8PSBFMTAwMF9SWEJVRkZFUl8xNjM4NCkgewotCQkJCWFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gPSBFMTAwMF9SWEJVRkZFUl8xNjM4NDsKLQkJCX0KIAkJfQorCQlicmVhazsKKwljYXNlIGUxMDAwXzgyNTcxOgorCWNhc2UgZTEwMDBfODI1NzI6CisjZGVmaW5lIE1BWF9TVERfSlVNQk9fRlJBTUVfU0laRSA5MjM0CisJCWlmIChtYXhfZnJhbWUgPiBNQVhfU1REX0pVTUJPX0ZSQU1FX1NJWkUpIHsKKwkJCURQUklOVEsoUFJPQkUsIEVSUiwgIk1UVSA+IDkyMTYgbm90IHN1cHBvcnRlZC5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogQ2FwYWJsZSBvZiBzdXBwb3J0aW5nIHVwIHRvIE1BWF9KVU1CT19GUkFNRV9TSVpFIGxpbWl0LiAqLworCQlicmVhazsKIAl9CiAKKwkvKiBzaW5jZSB0aGUgZHJpdmVyIGNvZGUgbm93IHN1cHBvcnRzIHNwbGl0dGluZyBhIHBhY2tldCBhY3Jvc3MKKwkgKiBtdWx0aXBsZSBkZXNjcmlwdG9ycywgbW9zdCBvZiB0aGUgZmlmbyByZWxhdGVkIGxpbWl0YXRpb25zIG9uCisJICoganVtYm8gZnJhbWUgdHJhZmZpYyBoYXZlIGdvbmUgYXdheS4KKwkgKiBzaW1wbHkgdXNlIDJrIGRlc2NyaXB0b3JzIGZvciBldmVyeXRoaW5nLgorCSAqCisJICogTk9URTogZGV2X2FsbG9jX3NrYiByZXNlcnZlcyAxNiBieXRlcywgYW5kIHR5cGljYWxseSBORVRfSVBfQUxJR04KKwkgKiBtZWFucyB3ZSByZXNlcnZlIDIgbW9yZSwgdGhpcyBwdXNoZXMgdXMgdG8gYWxsb2NhdGUgZnJvbSB0aGUgbmV4dAorCSAqIGxhcmdlciBzbGFiIHNpemUKKwkgKiBpLmUuIFJYQlVGRkVSXzIwNDggLS0+IHNpemUtNDA5NiBzbGFiICovCisKKwkvKiByZWNlbnQgaGFyZHdhcmUgc3VwcG9ydHMgMUtCIGdyYW51bGFyaXR5ICovCisJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID4gZTEwMDBfODI1NDdfcmV2XzIpIHsKKwkJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA9CisJCSAgICAoKG1heF9mcmFtZSA8IEUxMDAwX1JYQlVGRkVSXzIwNDgpID8KKwkJICAgICAgICBtYXhfZnJhbWUgOiBFMTAwMF9SWEJVRkZFUl8yMDQ4KTsKKwkJRTEwMDBfUk9VTkRVUChhZGFwdGVyLT5yeF9idWZmZXJfbGVuLCAxMDI0KTsKKwl9IGVsc2UKKwkJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA9IEUxMDAwX1JYQlVGRkVSXzIwNDg7CisKIAluZXRkZXYtPm10dSA9IG5ld19tdHU7CiAKLQlpZihuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CiAJCWUxMDAwX2Rvd24oYWRhcHRlcik7CiAJCWUxMDAwX3VwKGFkYXB0ZXIpOwogCX0KQEAgLTMwMDQsNyArMzIxNCw3IEBACiAJaHctPmNvbGxpc2lvbl9kZWx0YSA9IEUxMDAwX1JFQURfUkVHKGh3LCBDT0xDKTsKIAlhZGFwdGVyLT5zdGF0cy5jb2xjICs9IGh3LT5jb2xsaXNpb25fZGVsdGE7CiAKLQlpZihody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpIHsKKwlpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQzKSB7CiAJCWFkYXB0ZXItPnN0YXRzLmFsZ25lcnJjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBBTEdORVJSQyk7CiAJCWFkYXB0ZXItPnN0YXRzLnJ4ZXJyYyArPSBFMTAwMF9SRUFEX1JFRyhodywgUlhFUlJDKTsKIAkJYWRhcHRlci0+c3RhdHMudG5jcnMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFROQ1JTKTsKQEAgLTMwMTIsNyArMzIyMiw3IEBACiAJCWFkYXB0ZXItPnN0YXRzLnRzY3RjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBUU0NUQyk7CiAJCWFkYXB0ZXItPnN0YXRzLnRzY3RmYyArPSBFMTAwMF9SRUFEX1JFRyhodywgVFNDVEZDKTsKIAl9Ci0JaWYoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDdfcmV2XzIpIHsKKwlpZiAoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDdfcmV2XzIpIHsKIAkJYWRhcHRlci0+c3RhdHMuaWFjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBJQUMpOwogCQlhZGFwdGVyLT5zdGF0cy5pY3J4b2MgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIElDUlhPQyk7CiAJCWFkYXB0ZXItPnN0YXRzLmljcnhwdGMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIElDUlhQVEMpOwpAQCAtMzAzNywxMiArMzI0NywxMSBAQAogCiAJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2Vycm9ycyA9IGFkYXB0ZXItPnN0YXRzLnJ4ZXJyYyArCiAJCWFkYXB0ZXItPnN0YXRzLmNyY2VycnMgKyBhZGFwdGVyLT5zdGF0cy5hbGduZXJyYyArCi0JCWFkYXB0ZXItPnN0YXRzLnJsZWMgKyBhZGFwdGVyLT5zdGF0cy5tcGMgKyAKLQkJYWRhcHRlci0+c3RhdHMuY2V4dGVycjsKKwkJYWRhcHRlci0+c3RhdHMucmxlYyArIGFkYXB0ZXItPnN0YXRzLmNleHRlcnI7CisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2Ryb3BwZWQgPSAwOwogCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gYWRhcHRlci0+c3RhdHMucmxlYzsKIAlhZGFwdGVyLT5uZXRfc3RhdHMucnhfY3JjX2Vycm9ycyA9IGFkYXB0ZXItPnN0YXRzLmNyY2VycnM7CiAJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IGFkYXB0ZXItPnN0YXRzLmFsZ25lcnJjOwotCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9maWZvX2Vycm9ycyA9IGFkYXB0ZXItPnN0YXRzLm1wYzsKIAlhZGFwdGVyLT5uZXRfc3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IGFkYXB0ZXItPnN0YXRzLm1wYzsKIAogCS8qIFR4IEVycm9ycyAqLwpAQCAtMzA1NywxNCArMzI2NiwxNCBAQAogCiAJLyogUGh5IFN0YXRzICovCiAKLQlpZihody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgewotCQlpZigoYWRhcHRlci0+bGlua19zcGVlZCA9PSBTUEVFRF8xMDAwKSAmJgorCWlmIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgeworCQlpZiAoKGFkYXB0ZXItPmxpbmtfc3BlZWQgPT0gU1BFRURfMTAwMCkgJiYKIAkJICAgKCFlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9TVEFUVVMsICZwaHlfdG1wKSkpIHsKIAkJCXBoeV90bXAgJj0gUEhZX0lETEVfRVJST1JfQ09VTlRfTUFTSzsKIAkJCWFkYXB0ZXItPnBoeV9zdGF0cy5pZGxlX2Vycm9ycyArPSBwaHlfdG1wOwogCQl9CiAKLQkJaWYoKGh3LT5tYWNfdHlwZSA8PSBlMTAwMF84MjU0NikgJiYKKwkJaWYgKChody0+bWFjX3R5cGUgPD0gZTEwMDBfODI1NDYpICYmCiAJCSAgIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkgJiYKIAkJICAgIWUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUlhfRVJSX0NOVFIsICZwaHlfdG1wKSkKIAkJCWFkYXB0ZXItPnBoeV9zdGF0cy5yZWNlaXZlX2Vycm9ycyArPSBwaHlfdG1wOwpAQCAtMzExMCwzMiArMzMxOSw0NCBAQAogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXVpbnQzMl90IGljciA9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1IpOwotI2lmIGRlZmluZWQoQ09ORklHX0UxMDAwX05BUEkpICYmIGRlZmluZWQoQ09ORklHX0UxMDAwX01RKSB8fCAhZGVmaW5lZChDT05GSUdfRTEwMDBfTkFQSSkKKyNpZm5kZWYgQ09ORklHX0UxMDAwX05BUEkKIAlpbnQgaTsKKyNlbHNlCisJLyogSW50ZXJydXB0IEF1dG8tTWFzay4uLnVwb24gcmVhZGluZyBJQ1IsCisJICogaW50ZXJydXB0cyBhcmUgbWFza2VkLiAgTm8gbmVlZCBmb3IgdGhlCisJICogSU1DIHdyaXRlLCBidXQgaXQgZG9lcyBtZWFuIHdlIHNob3VsZAorCSAqIGFjY291bnQgZm9yIGl0IEFTQVAuICovCisJaWYgKGxpa2VseShody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NzEpKQorCQlhdG9taWNfaW5jKCZhZGFwdGVyLT5pcnFfc2VtKTsKICNlbmRpZgogCi0JaWYodW5saWtlbHkoIWljcikpCisJaWYgKHVubGlrZWx5KCFpY3IpKSB7CisjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKKwkJaWYgKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU3MSkKKwkJCWUxMDAwX2lycV9lbmFibGUoYWRhcHRlcik7CisjZW5kaWYKIAkJcmV0dXJuIElSUV9OT05FOyAgLyogTm90IG91ciBpbnRlcnJ1cHQgKi8KKwl9CiAKLQlpZih1bmxpa2VseShpY3IgJiAoRTEwMDBfSUNSX1JYU0VRIHwgRTEwMDBfSUNSX0xTQykpKSB7CisJaWYgKHVubGlrZWx5KGljciAmIChFMTAwMF9JQ1JfUlhTRVEgfCBFMTAwMF9JQ1JfTFNDKSkpIHsKIAkJaHctPmdldF9saW5rX3N0YXR1cyA9IDE7CiAJCW1vZF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIsIGppZmZpZXMpOwogCX0KIAogI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCi0JYXRvbWljX2luYygmYWRhcHRlci0+aXJxX3NlbSk7Ci0JRTEwMDBfV1JJVEVfUkVHKGh3LCBJTUMsIH4wKTsKLQlFMTAwMF9XUklURV9GTFVTSChodyk7CisJaWYgKHVubGlrZWx5KGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTcxKSkgeworCQlhdG9taWNfaW5jKCZhZGFwdGVyLT5pcnFfc2VtKTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBJTUMsIH4wKTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goaHcpOworCX0KICNpZmRlZiBDT05GSUdfRTEwMDBfTVEKIAlpZiAoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnJ4X3NjaGVkX2NhbGxfZGF0YS5jb3VudCkgPT0gMCkgewotCQljcHVfc2V0KGFkYXB0ZXItPmNwdV9mb3JfcXVldWVbMF0sCi0JCQlhZGFwdGVyLT5yeF9zY2hlZF9jYWxsX2RhdGEuY3B1bWFzayk7Ci0JCWZvciAoaSA9IDE7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspIHsKLQkJCWNwdV9zZXQoYWRhcHRlci0+Y3B1X2Zvcl9xdWV1ZVtpXSwKLQkJCQlhZGFwdGVyLT5yeF9zY2hlZF9jYWxsX2RhdGEuY3B1bWFzayk7Ci0JCQlhdG9taWNfaW5jKCZhZGFwdGVyLT5pcnFfc2VtKTsKLQkJfQotCQlhdG9taWNfc2V0KCZhZGFwdGVyLT5yeF9zY2hlZF9jYWxsX2RhdGEuY291bnQsIGkpOworCQkvKiBXZSBtdXN0IHNldHVwIHRoZSBjcHVtYXNrIG9uY2UgY291bnQgPT0gMCBzaW5jZQorCQkgKiBlYWNoIGNwdSBiaXQgaXMgY2xlYXJlZCB3aGVuIHRoZSB3b3JrIGlzIGRvbmUuICovCisJCWFkYXB0ZXItPnJ4X3NjaGVkX2NhbGxfZGF0YS5jcHVtYXNrID0gYWRhcHRlci0+Y3B1bWFzazsKKwkJYXRvbWljX2FkZChhZGFwdGVyLT5udW1fcnhfcXVldWVzIC0gMSwgJmFkYXB0ZXItPmlycV9zZW0pOworCQlhdG9taWNfc2V0KCZhZGFwdGVyLT5yeF9zY2hlZF9jYWxsX2RhdGEuY291bnQsCisJCSAgICAgICAgICAgYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyk7CiAJCXNtcF9jYWxsX2FzeW5jX21hc2soJmFkYXB0ZXItPnJ4X3NjaGVkX2NhbGxfZGF0YSk7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKCJjYWxsX2RhdGEuY291bnQgPT0gJXVcbiIsIGF0b21pY19yZWFkKCZhZGFwdGVyLT5yeF9zY2hlZF9jYWxsX2RhdGEuY291bnQpKTsKQEAgLTMxNDksMjYgKzMzNzAsMjYgQEAKIAogI2Vsc2UgLyogaWYgIUNPTkZJR19FMTAwMF9OQVBJICovCiAJLyogV3JpdGluZyBJTUMgYW5kIElNUyBpcyBuZWVkZWQgZm9yIDgyNTQ3LgotCSAgIER1ZSB0byBIdWIgTGluayBidXMgYmVpbmcgb2NjdXBpZWQsIGFuIGludGVycnVwdAotCSAgIGRlLWFzc2VydGlvbiBtZXNzYWdlIGlzIG5vdCBhYmxlIHRvIGJlIHNlbnQuCi0JICAgV2hlbiBhbiBpbnRlcnJ1cHQgYXNzZXJ0aW9uIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkIGxhdGVyLAotCSAgIHR3byBtZXNzYWdlcyBhcmUgcmUtb3JkZXJlZCBhbmQgc2VudCBvdXQuCi0JICAgVGhhdCBjYXVzZXMgQVBJQyB0byB0aGluayA4MjU0NyBpcyBpbiBkZS1hc3NlcnRpb24KLQkgICBzdGF0ZSwgd2hpbGUgODI1NDcgaXMgaW4gYXNzZXJ0aW9uIHN0YXRlLCByZXN1bHRpbmcKLQkgICBpbiBkZWFkIGxvY2suIFdyaXRpbmcgSU1DIGZvcmNlcyA4MjU0NyBpbnRvCi0JICAgZGUtYXNzZXJ0aW9uIHN0YXRlLgotCSovCi0JaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3IHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMil7CisJICogRHVlIHRvIEh1YiBMaW5rIGJ1cyBiZWluZyBvY2N1cGllZCwgYW4gaW50ZXJydXB0CisJICogZGUtYXNzZXJ0aW9uIG1lc3NhZ2UgaXMgbm90IGFibGUgdG8gYmUgc2VudC4KKwkgKiBXaGVuIGFuIGludGVycnVwdCBhc3NlcnRpb24gbWVzc2FnZSBpcyBnZW5lcmF0ZWQgbGF0ZXIsCisJICogdHdvIG1lc3NhZ2VzIGFyZSByZS1vcmRlcmVkIGFuZCBzZW50IG91dC4KKwkgKiBUaGF0IGNhdXNlcyBBUElDIHRvIHRoaW5rIDgyNTQ3IGlzIGluIGRlLWFzc2VydGlvbgorCSAqIHN0YXRlLCB3aGlsZSA4MjU0NyBpcyBpbiBhc3NlcnRpb24gc3RhdGUsIHJlc3VsdGluZworCSAqIGluIGRlYWQgbG9jay4gV3JpdGluZyBJTUMgZm9yY2VzIDgyNTQ3IGludG8KKwkgKiBkZS1hc3NlcnRpb24gc3RhdGUuCisJICovCisJaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NyB8fCBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDdfcmV2XzIpIHsKIAkJYXRvbWljX2luYygmYWRhcHRlci0+aXJxX3NlbSk7CiAJCUUxMDAwX1dSSVRFX1JFRyhodywgSU1DLCB+MCk7CiAJfQogCi0JZm9yKGkgPSAwOyBpIDwgRTEwMDBfTUFYX0lOVFI7IGkrKykKLQkJaWYodW5saWtlbHkoIWFkYXB0ZXItPmNsZWFuX3J4KGFkYXB0ZXIsIGFkYXB0ZXItPnJ4X3JpbmcpICYKKwlmb3IgKGkgPSAwOyBpIDwgRTEwMDBfTUFYX0lOVFI7IGkrKykKKwkJaWYgKHVubGlrZWx5KCFhZGFwdGVyLT5jbGVhbl9yeChhZGFwdGVyLCBhZGFwdGVyLT5yeF9yaW5nKSAmCiAJCSAgICFlMTAwMF9jbGVhbl90eF9pcnEoYWRhcHRlciwgYWRhcHRlci0+dHhfcmluZykpKQogCQkJYnJlYWs7CiAKLQlpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcgfHwgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3X3Jldl8yKQorCWlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcgfHwgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3X3Jldl8yKQogCQllMTAwMF9pcnFfZW5hYmxlKGFkYXB0ZXIpOwogCiAjZW5kaWYgLyogQ09ORklHX0UxMDAwX05BUEkgKi8KQEAgLTMxODcsNyArMzQwOCw3IEBACiB7CiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXI7CiAJaW50IHdvcmtfdG9fZG8gPSBtaW4oKmJ1ZGdldCwgcG9sbF9kZXYtPnF1b3RhKTsKLQlpbnQgdHhfY2xlYW5lZCwgaSA9IDAsIHdvcmtfZG9uZSA9IDA7CisJaW50IHR4X2NsZWFuZWQgPSAwLCBpID0gMCwgd29ya19kb25lID0gMDsKIAogCS8qIE11c3QgTk9UIHVzZSBuZXRkZXZfcHJpdiBtYWNybyBoZXJlLiAqLwogCWFkYXB0ZXIgPSBwb2xsX2Rldi0+cHJpdjsKQEAgLTMxOTgsMTkgKzM0MTksMzEgQEAKIAogCXdoaWxlIChwb2xsX2RldiAhPSAmYWRhcHRlci0+cG9sbGluZ19uZXRkZXZbaV0pIHsKIAkJaSsrOwotCQlpZiAodW5saWtlbHkoaSA9PSBhZGFwdGVyLT5udW1fcXVldWVzKSkKKwkJaWYgKHVubGlrZWx5KGkgPT0gYWRhcHRlci0+bnVtX3J4X3F1ZXVlcykpCiAJCQlCVUcoKTsKIAl9CiAKLQl0eF9jbGVhbmVkID0gZTEwMDBfY2xlYW5fdHhfaXJxKGFkYXB0ZXIsICZhZGFwdGVyLT50eF9yaW5nW2ldKTsKKwlpZiAobGlrZWx5KGFkYXB0ZXItPm51bV90eF9xdWV1ZXMgPT0gMSkpIHsKKwkJLyogZTEwMDBfY2xlYW4gaXMgY2FsbGVkIHBlci1jcHUuICBUaGlzIGxvY2sgcHJvdGVjdHMKKwkJICogdHhfcmluZ1swXSBmcm9tIGJlaW5nIGNsZWFuZWQgYnkgbXVsdGlwbGUgY3B1cworCQkgKiBzaW11bHRhbmVvdXNseS4gIEEgZmFpbHVyZSBvYnRhaW5pbmcgdGhlIGxvY2sgbWVhbnMKKwkJICogdHhfcmluZ1swXSBpcyBjdXJyZW50bHkgYmVpbmcgY2xlYW5lZCBhbnl3YXkuICovCisJCWlmIChzcGluX3RyeWxvY2soJmFkYXB0ZXItPnR4X3F1ZXVlX2xvY2spKSB7CisJCQl0eF9jbGVhbmVkID0gZTEwMDBfY2xlYW5fdHhfaXJxKGFkYXB0ZXIsCisJCQkJCQkJJmFkYXB0ZXItPnR4X3JpbmdbMF0pOworCQkJc3Bpbl91bmxvY2soJmFkYXB0ZXItPnR4X3F1ZXVlX2xvY2spOworCQl9CisJfSBlbHNlCisJCXR4X2NsZWFuZWQgPSBlMTAwMF9jbGVhbl90eF9pcnEoYWRhcHRlciwgJmFkYXB0ZXItPnR4X3JpbmdbaV0pOworCiAJYWRhcHRlci0+Y2xlYW5fcngoYWRhcHRlciwgJmFkYXB0ZXItPnJ4X3JpbmdbaV0sCiAJICAgICAgICAgICAgICAgICAgJndvcmtfZG9uZSwgd29ya190b19kbyk7CiAKIAkqYnVkZ2V0IC09IHdvcmtfZG9uZTsKIAlwb2xsX2Rldi0+cXVvdGEgLT0gd29ya19kb25lOwotCQorCiAJLyogSWYgbm8gVHggYW5kIG5vdCBlbm91Z2ggUnggd29yayBkb25lLCBleGl0IHRoZSBwb2xsaW5nIG1vZGUgKi8KLQlpZigoIXR4X2NsZWFuZWQgJiYgKHdvcmtfZG9uZSA9PSAwKSkgfHwKKwlpZiAoKCF0eF9jbGVhbmVkICYmICh3b3JrX2RvbmUgPT0gMCkpIHx8CiAJICAgIW5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgewogcXVpdF9wb2xsaW5nOgogCQluZXRpZl9yeF9jb21wbGV0ZShwb2xsX2Rldik7CkBAIC0zMjQyLDIyICszNDc1LDI0IEBACiAJZW9wX2Rlc2MgPSBFMTAwMF9UWF9ERVNDKCp0eF9yaW5nLCBlb3ApOwogCiAJd2hpbGUgKGVvcF9kZXNjLT51cHBlci5kYXRhICYgY3B1X3RvX2xlMzIoRTEwMDBfVFhEX1NUQVRfREQpKSB7Ci0JCWZvcihjbGVhbmVkID0gRkFMU0U7ICFjbGVhbmVkOyApIHsKKwkJZm9yIChjbGVhbmVkID0gRkFMU0U7ICFjbGVhbmVkOyApIHsKIAkJCXR4X2Rlc2MgPSBFMTAwMF9UWF9ERVNDKCp0eF9yaW5nLCBpKTsKIAkJCWJ1ZmZlcl9pbmZvID0gJnR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOwogCQkJY2xlYW5lZCA9IChpID09IGVvcCk7CiAKKyNpZmRlZiBDT05GSUdfRTEwMDBfTVEKKwkJCXR4X3JpbmctPnR4X3N0YXRzLmJ5dGVzICs9IGJ1ZmZlcl9pbmZvLT5sZW5ndGg7CisjZW5kaWYKIAkJCWUxMDAwX3VubWFwX2FuZF9mcmVlX3R4X3Jlc291cmNlKGFkYXB0ZXIsIGJ1ZmZlcl9pbmZvKTsKKwkJCW1lbXNldCh0eF9kZXNjLCAwLCBzaXplb2Yoc3RydWN0IGUxMDAwX3R4X2Rlc2MpKTsKIAotCQkJdHhfZGVzYy0+YnVmZmVyX2FkZHIgPSAwOwotCQkJdHhfZGVzYy0+bG93ZXIuZGF0YSA9IDA7Ci0JCQl0eF9kZXNjLT51cHBlci5kYXRhID0gMDsKLQotCQkJaWYodW5saWtlbHkoKytpID09IHR4X3JpbmctPmNvdW50KSkgaSA9IDA7CisJCQlpZiAodW5saWtlbHkoKytpID09IHR4X3JpbmctPmNvdW50KSkgaSA9IDA7CiAJCX0KIAotCQl0eF9yaW5nLT5wa3QrKzsKLQkJCisjaWZkZWYgQ09ORklHX0UxMDAwX01RCisJCXR4X3JpbmctPnR4X3N0YXRzLnBhY2tldHMrKzsKKyNlbmRpZgorCiAJCWVvcCA9IHR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldLm5leHRfdG9fd2F0Y2g7CiAJCWVvcF9kZXNjID0gRTEwMDBfVFhfREVTQygqdHhfcmluZywgZW9wKTsKIAl9CkBAIC0zMjY2LDcgKzM1MDEsNyBAQAogCiAJc3Bpbl9sb2NrKCZ0eF9yaW5nLT50eF9sb2NrKTsKIAotCWlmKHVubGlrZWx5KGNsZWFuZWQgJiYgbmV0aWZfcXVldWVfc3RvcHBlZChuZXRkZXYpICYmCisJaWYgKHVubGlrZWx5KGNsZWFuZWQgJiYgbmV0aWZfcXVldWVfc3RvcHBlZChuZXRkZXYpICYmCiAJCSAgICBuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpKQogCQluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7CiAKQEAgLTMyNzYsMzIgKzM1MTEsMzEgQEAKIAkJLyogRGV0ZWN0IGEgdHJhbnNtaXQgaGFuZyBpbiBoYXJkd2FyZSwgdGhpcyBzZXJpYWxpemVzIHRoZQogCQkgKiBjaGVjayB3aXRoIHRoZSBjbGVhcmluZyBvZiB0aW1lX3N0YW1wIGFuZCBtb3ZlbWVudCBvZiBpICovCiAJCWFkYXB0ZXItPmRldGVjdF90eF9odW5nID0gRkFMU0U7Ci0JCWlmICh0eF9yaW5nLT5idWZmZXJfaW5mb1tpXS5kbWEgJiYKLQkJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgdHhfcmluZy0+YnVmZmVyX2luZm9baV0udGltZV9zdGFtcCArIEhaKQorCQlpZiAodHhfcmluZy0+YnVmZmVyX2luZm9bZW9wXS5kbWEgJiYKKwkJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgdHhfcmluZy0+YnVmZmVyX2luZm9bZW9wXS50aW1lX3N0YW1wICsKKwkJICAgICAgICAgICAgICAgYWRhcHRlci0+dHhfdGltZW91dF9mYWN0b3IgKiBIWikKIAkJICAgICYmICEoRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBTVEFUVVMpICYKLQkJCUUxMDAwX1NUQVRVU19UWE9GRikpIHsKKwkJICAgICAgICAgRTEwMDBfU1RBVFVTX1RYT0ZGKSkgewogCiAJCQkvKiBkZXRlY3RlZCBUeCB1bml0IGhhbmcgKi8KLQkJCWkgPSB0eF9yaW5nLT5uZXh0X3RvX2NsZWFuOwotCQkJZW9wID0gdHhfcmluZy0+YnVmZmVyX2luZm9baV0ubmV4dF90b193YXRjaDsKLQkJCWVvcF9kZXNjID0gRTEwMDBfVFhfREVTQygqdHhfcmluZywgZW9wKTsKIAkJCURQUklOVEsoRFJWLCBFUlIsICJEZXRlY3RlZCBUeCBVbml0IEhhbmdcbiIKKwkJCQkJIiAgVHggUXVldWUgICAgICAgICAgICAgPCVsdT5cbiIKIAkJCQkJIiAgVERIICAgICAgICAgICAgICAgICAgPCV4PlxuIgogCQkJCQkiICBURFQgICAgICAgICAgICAgICAgICA8JXg+XG4iCiAJCQkJCSIgIG5leHRfdG9fdXNlICAgICAgICAgIDwleD5cbiIKIAkJCQkJIiAgbmV4dF90b19jbGVhbiAgICAgICAgPCV4PlxuIgogCQkJCQkiYnVmZmVyX2luZm9bbmV4dF90b19jbGVhbl1cbiIKLQkJCQkJIiAgZG1hICAgICAgICAgICAgICAgICAgPCVsbHg+XG4iCiAJCQkJCSIgIHRpbWVfc3RhbXAgICAgICAgICAgIDwlbHg+XG4iCiAJCQkJCSIgIG5leHRfdG9fd2F0Y2ggICAgICAgIDwleD5cbiIKIAkJCQkJIiAgamlmZmllcyAgICAgICAgICAgICAgPCVseD5cbiIKIAkJCQkJIiAgbmV4dF90b193YXRjaC5zdGF0dXMgPCV4PlxuIiwKKwkJCQkodW5zaWduZWQgbG9uZykoKHR4X3JpbmcgLSBhZGFwdGVyLT50eF9yaW5nKSAvCisJCQkJCXNpemVvZihzdHJ1Y3QgZTEwMDBfdHhfcmluZykpLAogCQkJCXJlYWRsKGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyB0eF9yaW5nLT50ZGgpLAogCQkJCXJlYWRsKGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyB0eF9yaW5nLT50ZHQpLAogCQkJCXR4X3JpbmctPm5leHRfdG9fdXNlLAotCQkJCWksCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl0eF9yaW5nLT5idWZmZXJfaW5mb1tpXS5kbWEsCi0JCQkJdHhfcmluZy0+YnVmZmVyX2luZm9baV0udGltZV9zdGFtcCwKKwkJCQl0eF9yaW5nLT5uZXh0X3RvX2NsZWFuLAorCQkJCXR4X3JpbmctPmJ1ZmZlcl9pbmZvW2VvcF0udGltZV9zdGFtcCwKIAkJCQllb3AsCiAJCQkJamlmZmllcywKIAkJCQllb3BfZGVzYy0+dXBwZXIuZmllbGRzLnN0YXR1cyk7CkBAIC0zMzI5LDIxICszNTYzLDIxIEBACiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCiAJLyogODI1NDMgb3IgbmV3ZXIgb25seSAqLwotCWlmKHVubGlrZWx5KGFkYXB0ZXItPmh3Lm1hY190eXBlIDwgZTEwMDBfODI1NDMpKSByZXR1cm47CisJaWYgKHVubGlrZWx5KGFkYXB0ZXItPmh3Lm1hY190eXBlIDwgZTEwMDBfODI1NDMpKSByZXR1cm47CiAJLyogSWdub3JlIENoZWNrc3VtIGJpdCBpcyBzZXQgKi8KLQlpZih1bmxpa2VseShzdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9JWFNNKSkgcmV0dXJuOworCWlmICh1bmxpa2VseShzdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9JWFNNKSkgcmV0dXJuOwogCS8qIFRDUC9VRFAgY2hlY2tzdW0gZXJyb3IgYml0IGlzIHNldCAqLwotCWlmKHVubGlrZWx5KGVycm9ycyAmIEUxMDAwX1JYRF9FUlJfVENQRSkpIHsKKwlpZiAodW5saWtlbHkoZXJyb3JzICYgRTEwMDBfUlhEX0VSUl9UQ1BFKSkgewogCQkvKiBsZXQgdGhlIHN0YWNrIHZlcmlmeSBjaGVja3N1bSBlcnJvcnMgKi8KIAkJYWRhcHRlci0+aHdfY3N1bV9lcnIrKzsKIAkJcmV0dXJuOwogCX0KIAkvKiBUQ1AvVURQIENoZWNrc3VtIGhhcyBub3QgYmVlbiBjYWxjdWxhdGVkICovCi0JaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPD0gZTEwMDBfODI1NDdfcmV2XzIpIHsKLQkJaWYoIShzdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9UQ1BDUykpCisJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlIDw9IGUxMDAwXzgyNTQ3X3Jldl8yKSB7CisJCWlmICghKHN0YXR1cyAmIEUxMDAwX1JYRF9TVEFUX1RDUENTKSkKIAkJCXJldHVybjsKIAl9IGVsc2UgewotCQlpZighKHN0YXR1cyAmIChFMTAwMF9SWERfU1RBVF9UQ1BDUyB8IEUxMDAwX1JYRF9TVEFUX1VEUENTKSkpCisJCWlmICghKHN0YXR1cyAmIChFMTAwMF9SWERfU1RBVF9UQ1BDUyB8IEUxMDAwX1JYRF9TVEFUX1VEUENTKSkpCiAJCQlyZXR1cm47CiAJfQogCS8qIEl0IG11c3QgYmUgYSBUQ1Agb3IgVURQIHBhY2tldCB3aXRoIGEgdmFsaWQgY2hlY2tzdW0gKi8KQEAgLTMzNzksNDYgKzM2MTMsODcgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKLQlzdHJ1Y3QgZTEwMDBfcnhfZGVzYyAqcnhfZGVzYzsKLQlzdHJ1Y3QgZTEwMDBfYnVmZmVyICpidWZmZXJfaW5mbzsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBlMTAwMF9yeF9kZXNjICpyeF9kZXNjLCAqbmV4dF9yeGQ7CisJc3RydWN0IGUxMDAwX2J1ZmZlciAqYnVmZmVyX2luZm8sICpuZXh0X2J1ZmZlcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVpbnQzMl90IGxlbmd0aDsKIAl1aW50OF90IGxhc3RfYnl0ZTsKIAl1bnNpZ25lZCBpbnQgaTsKLQlib29sZWFuX3QgY2xlYW5lZCA9IEZBTFNFOworCWludCBjbGVhbmVkX2NvdW50ID0gMDsKKwlib29sZWFuX3QgY2xlYW5lZCA9IEZBTFNFLCBtdWx0aV9kZXNjcmlwdG9yID0gRkFMU0U7CiAKIAlpID0gcnhfcmluZy0+bmV4dF90b19jbGVhbjsKIAlyeF9kZXNjID0gRTEwMDBfUlhfREVTQygqcnhfcmluZywgaSk7CisJYnVmZmVyX2luZm8gPSAmcnhfcmluZy0+YnVmZmVyX2luZm9baV07CiAKLQl3aGlsZShyeF9kZXNjLT5zdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9ERCkgewotCQlidWZmZXJfaW5mbyA9ICZyeF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKwl3aGlsZSAocnhfZGVzYy0+c3RhdHVzICYgRTEwMDBfUlhEX1NUQVRfREQpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm5leHRfc2tiOworCQl1OCBzdGF0dXM7CiAjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKLQkJaWYoKndvcmtfZG9uZSA+PSB3b3JrX3RvX2RvKQorCQlpZiAoKndvcmtfZG9uZSA+PSB3b3JrX3RvX2RvKQogCQkJYnJlYWs7CiAJCSgqd29ya19kb25lKSsrOwogI2VuZGlmCi0JCWNsZWFuZWQgPSBUUlVFOworCQlzdGF0dXMgPSByeF9kZXNjLT5zdGF0dXM7CisJCXNrYiA9IGJ1ZmZlcl9pbmZvLT5za2I7CisJCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOwogCisJCWlmICgrK2kgPT0gcnhfcmluZy0+Y291bnQpIGkgPSAwOworCQluZXh0X3J4ZCA9IEUxMDAwX1JYX0RFU0MoKnJ4X3JpbmcsIGkpOworCQluZXh0X2J1ZmZlciA9ICZyeF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKwkJbmV4dF9za2IgPSBuZXh0X2J1ZmZlci0+c2tiOworCisJCWNsZWFuZWQgPSBUUlVFOworCQljbGVhbmVkX2NvdW50Kys7CiAJCXBjaV91bm1hcF9zaW5nbGUocGRldiwKIAkJICAgICAgICAgICAgICAgICBidWZmZXJfaW5mby0+ZG1hLAogCQkgICAgICAgICAgICAgICAgIGJ1ZmZlcl9pbmZvLT5sZW5ndGgsCiAJCSAgICAgICAgICAgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAotCQlza2IgPSBidWZmZXJfaW5mby0+c2tiOwogCQlsZW5ndGggPSBsZTE2X3RvX2NwdShyeF9kZXNjLT5sZW5ndGgpOwogCi0JCWlmKHVubGlrZWx5KCEocnhfZGVzYy0+c3RhdHVzICYgRTEwMDBfUlhEX1NUQVRfRU9QKSkpIHsKLQkJCS8qIEFsbCByZWNlaXZlcyBtdXN0IGZpdCBpbnRvIGEgc2luZ2xlIGJ1ZmZlciAqLwotCQkJRTEwMDBfREJHKCIlczogUmVjZWl2ZSBwYWNrZXQgY29uc3VtZWQgbXVsdGlwbGUiCi0JCQkJICAiIGJ1ZmZlcnNcbiIsIG5ldGRldi0+bmFtZSk7Ci0JCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKKworCQlpZiAoIShzdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9FT1ApKSB7CisJCQlpZiAoIXJ4X3JpbmctPnJ4X3NrYl90b3ApIHsKKwkJCQlyeF9yaW5nLT5yeF9za2JfdG9wID0gc2tiOworCQkJCXJ4X3JpbmctPnJ4X3NrYl90b3AtPmxlbiA9IGxlbmd0aDsKKwkJCQlyeF9yaW5nLT5yeF9za2JfcHJldiA9IHNrYjsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHNrYl9zaGluZm8ocnhfcmluZy0+cnhfc2tiX3RvcCktPmZyYWdfbGlzdCkgeworCQkJCQlyeF9yaW5nLT5yeF9za2JfcHJldi0+bmV4dCA9IHNrYjsKKwkJCQkJc2tiLT5wcmV2ID0gcnhfcmluZy0+cnhfc2tiX3ByZXY7CisJCQkJfSBlbHNlIHsKKwkJCQkJc2tiX3NoaW5mbyhyeF9yaW5nLT5yeF9za2JfdG9wKS0+ZnJhZ19saXN0ID0gc2tiOworCQkJCX0KKwkJCQlyeF9yaW5nLT5yeF9za2JfcHJldiA9IHNrYjsKKwkJCQlyeF9yaW5nLT5yeF9za2JfdG9wLT5kYXRhX2xlbiArPSBsZW5ndGg7CisJCQl9CiAJCQlnb3RvIG5leHRfZGVzYzsKKwkJfSBlbHNlIHsKKwkJCWlmIChyeF9yaW5nLT5yeF9za2JfdG9wKSB7CisJCQkJaWYgKHNrYl9zaGluZm8ocnhfcmluZy0+cnhfc2tiX3RvcCkKKwkJCQkJCQktPmZyYWdfbGlzdCkgeworCQkJCQlyeF9yaW5nLT5yeF9za2JfcHJldi0+bmV4dCA9IHNrYjsKKwkJCQkJc2tiLT5wcmV2ID0gcnhfcmluZy0+cnhfc2tiX3ByZXY7CisJCQkJfSBlbHNlCisJCQkJCXNrYl9zaGluZm8ocnhfcmluZy0+cnhfc2tiX3RvcCkKKwkJCQkJCQktPmZyYWdfbGlzdCA9IHNrYjsKKworCQkJCXJ4X3JpbmctPnJ4X3NrYl90b3AtPmRhdGFfbGVuICs9IGxlbmd0aDsKKwkJCQlyeF9yaW5nLT5yeF9za2JfdG9wLT5sZW4gKz0KKwkJCQkJcnhfcmluZy0+cnhfc2tiX3RvcC0+ZGF0YV9sZW47CisKKwkJCQlza2IgPSByeF9yaW5nLT5yeF9za2JfdG9wOworCQkJCW11bHRpX2Rlc2NyaXB0b3IgPSBUUlVFOworCQkJCXJ4X3JpbmctPnJ4X3NrYl90b3AgPSBOVUxMOworCQkJCXJ4X3JpbmctPnJ4X3NrYl9wcmV2ID0gTlVMTDsKKwkJCX0KIAkJfQogCi0JCWlmKHVubGlrZWx5KHJ4X2Rlc2MtPmVycm9ycyAmIEUxMDAwX1JYRF9FUlJfRlJBTUVfRVJSX01BU0spKSB7CisJCWlmICh1bmxpa2VseShyeF9kZXNjLT5lcnJvcnMgJiBFMTAwMF9SWERfRVJSX0ZSQU1FX0VSUl9NQVNLKSkgewogCQkJbGFzdF9ieXRlID0gKihza2ItPmRhdGEgKyBsZW5ndGggLSAxKTsKLQkJCWlmKFRCSV9BQ0NFUFQoJmFkYXB0ZXItPmh3LCByeF9kZXNjLT5zdGF0dXMsCisJCQlpZiAoVEJJX0FDQ0VQVCgmYWRhcHRlci0+aHcsIHN0YXR1cywKIAkJCSAgICAgICAgICAgICAgcnhfZGVzYy0+ZXJyb3JzLCBsZW5ndGgsIGxhc3RfYnl0ZSkpIHsKIAkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+c3RhdHNfbG9jaywgZmxhZ3MpOwogCQkJCWUxMDAwX3RiaV9hZGp1c3Rfc3RhdHMoJmFkYXB0ZXItPmh3LApAQCAtMzQzMywxOCArMzcwOCw0MSBAQAogCQkJfQogCQl9CiAKLQkJLyogR29vZCBSZWNlaXZlICovCi0JCXNrYl9wdXQoc2tiLCBsZW5ndGggLSBFVEhFUk5FVF9GQ1NfU0laRSk7CisJCS8qIGNvZGUgYWRkZWQgZm9yIGNvcHlicmVhaywgdGhpcyBzaG91bGQgaW1wcm92ZQorCQkgKiBwZXJmb3JtYW5jZSBmb3Igc21hbGwgcGFja2V0cyB3aXRoIGxhcmdlIGFtb3VudHMKKwkJICogb2YgcmVhc3NlbWJseSBiZWluZyBkb25lIGluIHRoZSBzdGFjayAqLworI2RlZmluZSBFMTAwMF9DQl9MRU5HVEggMjU2CisJCWlmICgobGVuZ3RoIDwgRTEwMDBfQ0JfTEVOR1RIKSAmJgorCQkgICAhcnhfcmluZy0+cnhfc2tiX3RvcCAmJgorCQkgICAvKiBvciBtYXliZSAoc3RhdHVzICYgRTEwMDBfUlhEX1NUQVRfRU9QKSAmJiAqLworCQkgICAhbXVsdGlfZGVzY3JpcHRvcikgeworCQkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2IgPQorCQkJICAgIGRldl9hbGxvY19za2IobGVuZ3RoICsgTkVUX0lQX0FMSUdOKTsKKwkJCWlmIChuZXdfc2tiKSB7CisJCQkJc2tiX3Jlc2VydmUobmV3X3NrYiwgTkVUX0lQX0FMSUdOKTsKKwkJCQluZXdfc2tiLT5kZXYgPSBuZXRkZXY7CisJCQkJbWVtY3B5KG5ld19za2ItPmRhdGEgLSBORVRfSVBfQUxJR04sCisJCQkJICAgICAgIHNrYi0+ZGF0YSAtIE5FVF9JUF9BTElHTiwKKwkJCQkgICAgICAgbGVuZ3RoICsgTkVUX0lQX0FMSUdOKTsKKwkJCQkvKiBzYXZlIHRoZSBza2IgaW4gYnVmZmVyX2luZm8gYXMgZ29vZCAqLworCQkJCWJ1ZmZlcl9pbmZvLT5za2IgPSBza2I7CisJCQkJc2tiID0gbmV3X3NrYjsKKwkJCQlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKKwkJCX0KKwkJfQorCisJCS8qIGVuZCBjb3B5YnJlYWsgY29kZSAqLwogCiAJCS8qIFJlY2VpdmUgQ2hlY2tzdW0gT2ZmbG9hZCAqLwogCQllMTAwMF9yeF9jaGVja3N1bShhZGFwdGVyLAotCQkJCSAgKHVpbnQzMl90KShyeF9kZXNjLT5zdGF0dXMpIHwKKwkJCQkgICh1aW50MzJfdCkoc3RhdHVzKSB8CiAJCQkJICAoKHVpbnQzMl90KShyeF9kZXNjLT5lcnJvcnMpIDw8IDI0KSwKIAkJCQkgIHJ4X2Rlc2MtPmNzdW0sIHNrYik7CisKIAkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmV0ZGV2KTsKICNpZmRlZiBDT05GSUdfRTEwMDBfTkFQSQotCQlpZih1bmxpa2VseShhZGFwdGVyLT52bGdycCAmJgotCQkJICAgIChyeF9kZXNjLT5zdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9WUCkpKSB7CisJCWlmICh1bmxpa2VseShhZGFwdGVyLT52bGdycCAmJgorCQkJICAgIChzdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9WUCkpKSB7CiAJCQl2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc2tiLCBhZGFwdGVyLT52bGdycCwKIAkJCQkJCSBsZTE2X3RvX2NwdShyeF9kZXNjLT5zcGVjaWFsKSAmCiAJCQkJCQkgRTEwMDBfUlhEX1NQQ19WTEFOX01BU0spOwpAQCAtMzQ1Miw4ICszNzUwLDggQEAKIAkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CiAJCX0KICNlbHNlIC8qIENPTkZJR19FMTAwMF9OQVBJICovCi0JCWlmKHVubGlrZWx5KGFkYXB0ZXItPnZsZ3JwICYmCi0JCQkgICAgKHJ4X2Rlc2MtPnN0YXR1cyAmIEUxMDAwX1JYRF9TVEFUX1ZQKSkpIHsKKwkJaWYgKHVubGlrZWx5KGFkYXB0ZXItPnZsZ3JwICYmCisJCQkgICAgKHN0YXR1cyAmIEUxMDAwX1JYRF9TVEFUX1ZQKSkpIHsKIAkJCXZsYW5faHdhY2NlbF9yeChza2IsIGFkYXB0ZXItPnZsZ3JwLAogCQkJCQlsZTE2X3RvX2NwdShyeF9kZXNjLT5zcGVjaWFsKSAmCiAJCQkJCUUxMDAwX1JYRF9TUENfVkxBTl9NQVNLKTsKQEAgLTM0NjIsMTcgKzM3NjAsMjggQEAKIAkJfQogI2VuZGlmIC8qIENPTkZJR19FMTAwMF9OQVBJICovCiAJCW5ldGRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0JCXJ4X3JpbmctPnBrdCsrOworI2lmZGVmIENPTkZJR19FMTAwMF9NUQorCQlyeF9yaW5nLT5yeF9zdGF0cy5wYWNrZXRzKys7CisJCXJ4X3JpbmctPnJ4X3N0YXRzLmJ5dGVzICs9IGxlbmd0aDsKKyNlbmRpZgogCiBuZXh0X2Rlc2M6CiAJCXJ4X2Rlc2MtPnN0YXR1cyA9IDA7Ci0JCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOwotCQlpZih1bmxpa2VseSgrK2kgPT0gcnhfcmluZy0+Y291bnQpKSBpID0gMDsKIAotCQlyeF9kZXNjID0gRTEwMDBfUlhfREVTQygqcnhfcmluZywgaSk7CisJCS8qIHJldHVybiBzb21lIGJ1ZmZlcnMgdG8gaGFyZHdhcmUsIG9uZSBhdCBhIHRpbWUgaXMgdG9vIHNsb3cgKi8KKwkJaWYgKHVubGlrZWx5KGNsZWFuZWRfY291bnQgPj0gRTEwMDBfUlhfQlVGRkVSX1dSSVRFKSkgeworCQkJYWRhcHRlci0+YWxsb2NfcnhfYnVmKGFkYXB0ZXIsIHJ4X3JpbmcsIGNsZWFuZWRfY291bnQpOworCQkJY2xlYW5lZF9jb3VudCA9IDA7CisJCX0KKworCQlyeF9kZXNjID0gbmV4dF9yeGQ7CisJCWJ1ZmZlcl9pbmZvID0gbmV4dF9idWZmZXI7CiAJfQogCXJ4X3JpbmctPm5leHRfdG9fY2xlYW4gPSBpOwotCWFkYXB0ZXItPmFsbG9jX3J4X2J1ZihhZGFwdGVyLCByeF9yaW5nKTsKKworCWNsZWFuZWRfY291bnQgPSBFMTAwMF9ERVNDX1VOVVNFRChyeF9yaW5nKTsKKwlpZiAoY2xlYW5lZF9jb3VudCkKKwkJYWRhcHRlci0+YWxsb2NfcnhfYnVmKGFkYXB0ZXIsIHJ4X3JpbmcsIGNsZWFuZWRfY291bnQpOwogCiAJcmV0dXJuIGNsZWFuZWQ7CiB9CkBAIC0zNDkyLDUyICszODAxLDU5IEBACiAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGUxMDAwX3J4X3JpbmcgKnJ4X3JpbmcpCiAjZW5kaWYKIHsKLQl1bmlvbiBlMTAwMF9yeF9kZXNjX3BhY2tldF9zcGxpdCAqcnhfZGVzYzsKKwl1bmlvbiBlMTAwMF9yeF9kZXNjX3BhY2tldF9zcGxpdCAqcnhfZGVzYywgKm5leHRfcnhkOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwotCXN0cnVjdCBlMTAwMF9idWZmZXIgKmJ1ZmZlcl9pbmZvOworCXN0cnVjdCBlMTAwMF9idWZmZXIgKmJ1ZmZlcl9pbmZvLCAqbmV4dF9idWZmZXI7CiAJc3RydWN0IGUxMDAwX3BzX3BhZ2UgKnBzX3BhZ2U7CiAJc3RydWN0IGUxMDAwX3BzX3BhZ2VfZG1hICpwc19wYWdlX2RtYTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBza19idWZmICpza2IsICpuZXh0X3NrYjsKIAl1bnNpZ25lZCBpbnQgaSwgajsKIAl1aW50MzJfdCBsZW5ndGgsIHN0YXRlcnI7CisJaW50IGNsZWFuZWRfY291bnQgPSAwOwogCWJvb2xlYW5fdCBjbGVhbmVkID0gRkFMU0U7CiAKIAlpID0gcnhfcmluZy0+bmV4dF90b19jbGVhbjsKIAlyeF9kZXNjID0gRTEwMDBfUlhfREVTQ19QUygqcnhfcmluZywgaSk7CiAJc3RhdGVyciA9IGxlMzJfdG9fY3B1KHJ4X2Rlc2MtPndiLm1pZGRsZS5zdGF0dXNfZXJyb3IpOworCWJ1ZmZlcl9pbmZvID0gJnJ4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOwogCi0Jd2hpbGUoc3RhdGVyciAmIEUxMDAwX1JYRF9TVEFUX0REKSB7Ci0JCWJ1ZmZlcl9pbmZvID0gJnJ4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOworCXdoaWxlIChzdGF0ZXJyICYgRTEwMDBfUlhEX1NUQVRfREQpIHsKIAkJcHNfcGFnZSA9ICZyeF9yaW5nLT5wc19wYWdlW2ldOwogCQlwc19wYWdlX2RtYSA9ICZyeF9yaW5nLT5wc19wYWdlX2RtYVtpXTsKICNpZmRlZiBDT05GSUdfRTEwMDBfTkFQSQotCQlpZih1bmxpa2VseSgqd29ya19kb25lID49IHdvcmtfdG9fZG8pKQorCQlpZiAodW5saWtlbHkoKndvcmtfZG9uZSA+PSB3b3JrX3RvX2RvKSkKIAkJCWJyZWFrOwogCQkoKndvcmtfZG9uZSkrKzsKICNlbmRpZgorCQlza2IgPSBidWZmZXJfaW5mby0+c2tiOworCisJCWlmICgrK2kgPT0gcnhfcmluZy0+Y291bnQpIGkgPSAwOworCQluZXh0X3J4ZCA9IEUxMDAwX1JYX0RFU0NfUFMoKnJ4X3JpbmcsIGkpOworCQluZXh0X2J1ZmZlciA9ICZyeF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKwkJbmV4dF9za2IgPSBuZXh0X2J1ZmZlci0+c2tiOworCiAJCWNsZWFuZWQgPSBUUlVFOworCQljbGVhbmVkX2NvdW50Kys7CiAJCXBjaV91bm1hcF9zaW5nbGUocGRldiwgYnVmZmVyX2luZm8tPmRtYSwKIAkJCQkgYnVmZmVyX2luZm8tPmxlbmd0aCwKIAkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKIAotCQlza2IgPSBidWZmZXJfaW5mby0+c2tiOwotCi0JCWlmKHVubGlrZWx5KCEoc3RhdGVyciAmIEUxMDAwX1JYRF9TVEFUX0VPUCkpKSB7CisJCWlmICh1bmxpa2VseSghKHN0YXRlcnIgJiBFMTAwMF9SWERfU1RBVF9FT1ApKSkgewogCQkJRTEwMDBfREJHKCIlczogUGFja2V0IFNwbGl0IGJ1ZmZlcnMgZGlkbid0IHBpY2sgdXAiCiAJCQkJICAiIHRoZSBmdWxsIHBhY2tldFxuIiwgbmV0ZGV2LT5uYW1lKTsKIAkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CiAJCQlnb3RvIG5leHRfZGVzYzsKIAkJfQogCi0JCWlmKHVubGlrZWx5KHN0YXRlcnIgJiBFMTAwMF9SWERFWFRfRVJSX0ZSQU1FX0VSUl9NQVNLKSkgeworCQlpZiAodW5saWtlbHkoc3RhdGVyciAmIEUxMDAwX1JYREVYVF9FUlJfRlJBTUVfRVJSX01BU0spKSB7CiAJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwogCQkJZ290byBuZXh0X2Rlc2M7CiAJCX0KIAogCQlsZW5ndGggPSBsZTE2X3RvX2NwdShyeF9kZXNjLT53Yi5taWRkbGUubGVuZ3RoMCk7CiAKLQkJaWYodW5saWtlbHkoIWxlbmd0aCkpIHsKKwkJaWYgKHVubGlrZWx5KCFsZW5ndGgpKSB7CiAJCQlFMTAwMF9EQkcoIiVzOiBMYXN0IHBhcnQgb2YgdGhlIHBhY2tldCBzcGFubmluZyIKIAkJCQkgICIgbXVsdGlwbGUgZGVzY3JpcHRvcnNcbiIsIG5ldGRldi0+bmFtZSk7CiAJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwpAQCAtMzU0Nyw4ICszODYzLDggQEAKIAkJLyogR29vZCBSZWNlaXZlICovCiAJCXNrYl9wdXQoc2tiLCBsZW5ndGgpOwogCi0JCWZvcihqID0gMDsgaiA8IGFkYXB0ZXItPnJ4X3BzX3BhZ2VzOyBqKyspIHsKLQkJCWlmKCEobGVuZ3RoID0gbGUxNl90b19jcHUocnhfZGVzYy0+d2IudXBwZXIubGVuZ3RoW2pdKSkpCisJCWZvciAoaiA9IDA7IGogPCBhZGFwdGVyLT5yeF9wc19wYWdlczsgaisrKSB7CisJCQlpZiAoIShsZW5ndGggPSBsZTE2X3RvX2NwdShyeF9kZXNjLT53Yi51cHBlci5sZW5ndGhbal0pKSkKIAkJCQlicmVhazsKIAogCQkJcGNpX3VubWFwX3BhZ2UocGRldiwgcHNfcGFnZV9kbWEtPnBzX3BhZ2VfZG1hW2pdLApAQCAtMzU2OCwxNSArMzg4NCwxMSBAQAogCQkJCSAgcnhfZGVzYy0+d2IubG93ZXIuaGlfZHdvcmQuY3N1bV9pcC5jc3VtLCBza2IpOwogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBuZXRkZXYpOwogCi0JCWlmKGxpa2VseShyeF9kZXNjLT53Yi51cHBlci5oZWFkZXJfc3RhdHVzICYKLQkJCSAgRTEwMDBfUlhEUFNfSERSU1RBVF9IRFJTUCkpIHsKKwkJaWYgKGxpa2VseShyeF9kZXNjLT53Yi51cHBlci5oZWFkZXJfc3RhdHVzICYKKwkJCSAgRTEwMDBfUlhEUFNfSERSU1RBVF9IRFJTUCkpCiAJCQlhZGFwdGVyLT5yeF9oZHJfc3BsaXQrKzsKLSNpZmRlZiBIQVZFX1JYX1pFUk9fQ09QWQotCQkJc2tiX3NoaW5mbyhza2IpLT56ZXJvX2NvcHkgPSBUUlVFOwotI2VuZGlmCi0JICAgICAgICB9CiAjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKLQkJaWYodW5saWtlbHkoYWRhcHRlci0+dmxncnAgJiYgKHN0YXRlcnIgJiBFMTAwMF9SWERfU1RBVF9WUCkpKSB7CisJCWlmICh1bmxpa2VseShhZGFwdGVyLT52bGdycCAmJiAoc3RhdGVyciAmIEUxMDAwX1JYRF9TVEFUX1ZQKSkpIHsKIAkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIGFkYXB0ZXItPnZsZ3JwLAogCQkJCWxlMTZfdG9fY3B1KHJ4X2Rlc2MtPndiLm1pZGRsZS52bGFuKSAmCiAJCQkJRTEwMDBfUlhEX1NQQ19WTEFOX01BU0spOwpAQCAtMzU4NCw3ICszODk2LDcgQEAKIAkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CiAJCX0KICNlbHNlIC8qIENPTkZJR19FMTAwMF9OQVBJICovCi0JCWlmKHVubGlrZWx5KGFkYXB0ZXItPnZsZ3JwICYmIChzdGF0ZXJyICYgRTEwMDBfUlhEX1NUQVRfVlApKSkgeworCQlpZiAodW5saWtlbHkoYWRhcHRlci0+dmxncnAgJiYgKHN0YXRlcnIgJiBFMTAwMF9SWERfU1RBVF9WUCkpKSB7CiAJCQl2bGFuX2h3YWNjZWxfcngoc2tiLCBhZGFwdGVyLT52bGdycCwKIAkJCQlsZTE2X3RvX2NwdShyeF9kZXNjLT53Yi5taWRkbGUudmxhbikgJgogCQkJCUUxMDAwX1JYRF9TUENfVkxBTl9NQVNLKTsKQEAgLTM1OTMsMTggKzM5MDUsMzEgQEAKIAkJfQogI2VuZGlmIC8qIENPTkZJR19FMTAwMF9OQVBJICovCiAJCW5ldGRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0JCXJ4X3JpbmctPnBrdCsrOworI2lmZGVmIENPTkZJR19FMTAwMF9NUQorCQlyeF9yaW5nLT5yeF9zdGF0cy5wYWNrZXRzKys7CisJCXJ4X3JpbmctPnJ4X3N0YXRzLmJ5dGVzICs9IGxlbmd0aDsKKyNlbmRpZgogCiBuZXh0X2Rlc2M6CiAJCXJ4X2Rlc2MtPndiLm1pZGRsZS5zdGF0dXNfZXJyb3IgJj0gfjB4RkY7CiAJCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOwotCQlpZih1bmxpa2VseSgrK2kgPT0gcnhfcmluZy0+Y291bnQpKSBpID0gMDsKIAotCQlyeF9kZXNjID0gRTEwMDBfUlhfREVTQ19QUygqcnhfcmluZywgaSk7CisJCS8qIHJldHVybiBzb21lIGJ1ZmZlcnMgdG8gaGFyZHdhcmUsIG9uZSBhdCBhIHRpbWUgaXMgdG9vIHNsb3cgKi8KKwkJaWYgKHVubGlrZWx5KGNsZWFuZWRfY291bnQgPj0gRTEwMDBfUlhfQlVGRkVSX1dSSVRFKSkgeworCQkJYWRhcHRlci0+YWxsb2NfcnhfYnVmKGFkYXB0ZXIsIHJ4X3JpbmcsIGNsZWFuZWRfY291bnQpOworCQkJY2xlYW5lZF9jb3VudCA9IDA7CisJCX0KKworCQlyeF9kZXNjID0gbmV4dF9yeGQ7CisJCWJ1ZmZlcl9pbmZvID0gbmV4dF9idWZmZXI7CisKIAkJc3RhdGVyciA9IGxlMzJfdG9fY3B1KHJ4X2Rlc2MtPndiLm1pZGRsZS5zdGF0dXNfZXJyb3IpOwogCX0KIAlyeF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gaTsKLQlhZGFwdGVyLT5hbGxvY19yeF9idWYoYWRhcHRlciwgcnhfcmluZyk7CisKKwljbGVhbmVkX2NvdW50ID0gRTEwMDBfREVTQ19VTlVTRUQocnhfcmluZyk7CisJaWYgKGNsZWFuZWRfY291bnQpCisJCWFkYXB0ZXItPmFsbG9jX3J4X2J1ZihhZGFwdGVyLCByeF9yaW5nLCBjbGVhbmVkX2NvdW50KTsKIAogCXJldHVybiBjbGVhbmVkOwogfQpAQCAtMzYxNiw3ICszOTQxLDggQEAKIAogc3RhdGljIHZvaWQKIGUxMDAwX2FsbG9jX3J4X2J1ZmZlcnMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBlMTAwMF9yeF9yaW5nICpyeF9yaW5nKQorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZTEwMDBfcnhfcmluZyAqcnhfcmluZywKKwkJICAgICAgIGludCBjbGVhbmVkX2NvdW50KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwpAQCAtMzYyOSwxMSArMzk1NSwxOCBAQAogCWkgPSByeF9yaW5nLT5uZXh0X3RvX3VzZTsKIAlidWZmZXJfaW5mbyA9ICZyeF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKIAotCXdoaWxlKCFidWZmZXJfaW5mby0+c2tiKSB7Ci0JCXNrYiA9IGRldl9hbGxvY19za2IoYnVmc3opOworCXdoaWxlIChjbGVhbmVkX2NvdW50LS0pIHsKKwkJaWYgKCEoc2tiID0gYnVmZmVyX2luZm8tPnNrYikpCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGJ1ZnN6KTsKKwkJZWxzZSB7CisJCQlza2JfdHJpbShza2IsIDApOworCQkJZ290byBtYXBfc2tiOworCQl9CiAKLQkJaWYodW5saWtlbHkoIXNrYikpIHsKKworCQlpZiAodW5saWtlbHkoIXNrYikpIHsKIAkJCS8qIEJldHRlciBsdWNrIG5leHQgcm91bmQgKi8KKwkJCWFkYXB0ZXItPmFsbG9jX3J4X2J1ZmZfZmFpbGVkKys7CiAJCQlicmVhazsKIAkJfQogCkBAIC0zNjcwLDYgKzQwMDMsNyBAQAogCiAJCWJ1ZmZlcl9pbmZvLT5za2IgPSBza2I7CiAJCWJ1ZmZlcl9pbmZvLT5sZW5ndGggPSBhZGFwdGVyLT5yeF9idWZmZXJfbGVuOworbWFwX3NrYjoKIAkJYnVmZmVyX2luZm8tPmRtYSA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsCiAJCQkJCQkgIHNrYi0+ZGF0YSwKIAkJCQkJCSAgYWRhcHRlci0+cnhfYnVmZmVyX2xlbiwKQEAgLTM2OTUsMjAgKzQwMjksMjMgQEAKIAkJcnhfZGVzYyA9IEUxMDAwX1JYX0RFU0MoKnJ4X3JpbmcsIGkpOwogCQlyeF9kZXNjLT5idWZmZXJfYWRkciA9IGNwdV90b19sZTY0KGJ1ZmZlcl9pbmZvLT5kbWEpOwogCi0JCWlmKHVubGlrZWx5KChpICYgfihFMTAwMF9SWF9CVUZGRVJfV1JJVEUgLSAxKSkgPT0gaSkpIHsKLQkJCS8qIEZvcmNlIG1lbW9yeSB3cml0ZXMgdG8gY29tcGxldGUgYmVmb3JlIGxldHRpbmcgaC93Ci0JCQkgKiBrbm93IHRoZXJlIGFyZSBuZXcgZGVzY3JpcHRvcnMgdG8gZmV0Y2guICAoT25seQotCQkJICogYXBwbGljYWJsZSBmb3Igd2Vhay1vcmRlcmVkIG1lbW9yeSBtb2RlbCBhcmNocywKLQkJCSAqIHN1Y2ggYXMgSUEtNjQpLiAqLwotCQkJd21iKCk7Ci0JCQl3cml0ZWwoaSwgYWRhcHRlci0+aHcuaHdfYWRkciArIHJ4X3JpbmctPnJkdCk7Ci0JCX0KLQotCQlpZih1bmxpa2VseSgrK2kgPT0gcnhfcmluZy0+Y291bnQpKSBpID0gMDsKKwkJaWYgKHVubGlrZWx5KCsraSA9PSByeF9yaW5nLT5jb3VudCkpCisJCQlpID0gMDsKIAkJYnVmZmVyX2luZm8gPSAmcnhfcmluZy0+YnVmZmVyX2luZm9baV07CiAJfQogCi0JcnhfcmluZy0+bmV4dF90b191c2UgPSBpOworCWlmIChsaWtlbHkocnhfcmluZy0+bmV4dF90b191c2UgIT0gaSkpIHsKKwkJcnhfcmluZy0+bmV4dF90b191c2UgPSBpOworCQlpZiAodW5saWtlbHkoaS0tID09IDApKQorCQkJaSA9IChyeF9yaW5nLT5jb3VudCAtIDEpOworCisJCS8qIEZvcmNlIG1lbW9yeSB3cml0ZXMgdG8gY29tcGxldGUgYmVmb3JlIGxldHRpbmcgaC93CisJCSAqIGtub3cgdGhlcmUgYXJlIG5ldyBkZXNjcmlwdG9ycyB0byBmZXRjaC4gIChPbmx5CisJCSAqIGFwcGxpY2FibGUgZm9yIHdlYWstb3JkZXJlZCBtZW1vcnkgbW9kZWwgYXJjaHMsCisJCSAqIHN1Y2ggYXMgSUEtNjQpLiAqLworCQl3bWIoKTsKKwkJd3JpdGVsKGksIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyByeF9yaW5nLT5yZHQpOworCX0KIH0KIAogLyoqCkBAIC0zNzE4LDcgKzQwNTUsOCBAQAogCiBzdGF0aWMgdm9pZAogZTEwMDBfYWxsb2NfcnhfYnVmZmVyc19wcyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGUxMDAwX3J4X3JpbmcgKnJ4X3JpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBlMTAwMF9yeF9yaW5nICpyeF9yaW5nLAorCQkJICBpbnQgY2xlYW5lZF9jb3VudCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKQEAgLTM3MzQsMTYgKzQwNzIsMTggQEAKIAlwc19wYWdlID0gJnJ4X3JpbmctPnBzX3BhZ2VbaV07CiAJcHNfcGFnZV9kbWEgPSAmcnhfcmluZy0+cHNfcGFnZV9kbWFbaV07CiAKLQl3aGlsZSghYnVmZmVyX2luZm8tPnNrYikgeworCXdoaWxlIChjbGVhbmVkX2NvdW50LS0pIHsKIAkJcnhfZGVzYyA9IEUxMDAwX1JYX0RFU0NfUFMoKnJ4X3JpbmcsIGkpOwogCi0JCWZvcihqID0gMDsgaiA8IFBTX1BBR0VfQlVGRkVSUzsgaisrKSB7CisJCWZvciAoaiA9IDA7IGogPCBQU19QQUdFX0JVRkZFUlM7IGorKykgewogCQkJaWYgKGogPCBhZGFwdGVyLT5yeF9wc19wYWdlcykgewogCQkJCWlmIChsaWtlbHkoIXBzX3BhZ2UtPnBzX3BhZ2Vbal0pKSB7CiAJCQkJCXBzX3BhZ2UtPnBzX3BhZ2Vbal0gPQogCQkJCQkJYWxsb2NfcGFnZShHRlBfQVRPTUlDKTsKLQkJCQkJaWYgKHVubGlrZWx5KCFwc19wYWdlLT5wc19wYWdlW2pdKSkKKwkJCQkJaWYgKHVubGlrZWx5KCFwc19wYWdlLT5wc19wYWdlW2pdKSkgeworCQkJCQkJYWRhcHRlci0+YWxsb2NfcnhfYnVmZl9mYWlsZWQrKzsKIAkJCQkJCWdvdG8gbm9fYnVmZmVyczsKKwkJCQkJfQogCQkJCQlwc19wYWdlX2RtYS0+cHNfcGFnZV9kbWFbal0gPQogCQkJCQkJcGNpX21hcF9wYWdlKHBkZXYsCiAJCQkJCQkJICAgIHBzX3BhZ2UtPnBzX3BhZ2Vbal0sCkBAIC0zNzUxLDcgKzQwOTEsNyBAQAogCQkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJCX0KIAkJCQkvKiBSZWZyZXNoIHRoZSBkZXNjIGV2ZW4gaWYgYnVmZmVyX2FkZHJzIGRpZG4ndAotCQkJCSAqIGNoYW5nZSBiZWNhdXNlIGVhY2ggd3JpdGUtYmFjayBlcmFzZXMgCisJCQkJICogY2hhbmdlIGJlY2F1c2UgZWFjaCB3cml0ZS1iYWNrIGVyYXNlcwogCQkJCSAqIHRoaXMgaW5mby4KIAkJCQkgKi8KIAkJCQlyeF9kZXNjLT5yZWFkLmJ1ZmZlcl9hZGRyW2orMV0gPQpAQCAtMzc2Miw4ICs0MTAyLDEwIEBACiAKIAkJc2tiID0gZGV2X2FsbG9jX3NrYihhZGFwdGVyLT5yeF9wc19ic2l6ZTAgKyBORVRfSVBfQUxJR04pOwogCi0JCWlmKHVubGlrZWx5KCFza2IpKQorCQlpZiAodW5saWtlbHkoIXNrYikpIHsKKwkJCWFkYXB0ZXItPmFsbG9jX3J4X2J1ZmZfZmFpbGVkKys7CiAJCQlicmVhazsKKwkJfQogCiAJCS8qIE1ha2UgYnVmZmVyIGFsaWdubWVudCAyIGJleW9uZCBhIDE2IGJ5dGUgYm91bmRhcnkKIAkJICogdGhpcyB3aWxsIHJlc3VsdCBpbiBhIDE2IGJ5dGUgYWxpZ25lZCBJUCBoZWFkZXIgYWZ0ZXIKQEAgLTM3ODEsMjcgKzQxMjMsMjggQEAKIAogCQlyeF9kZXNjLT5yZWFkLmJ1ZmZlcl9hZGRyWzBdID0gY3B1X3RvX2xlNjQoYnVmZmVyX2luZm8tPmRtYSk7CiAKLQkJaWYodW5saWtlbHkoKGkgJiB+KEUxMDAwX1JYX0JVRkZFUl9XUklURSAtIDEpKSA9PSBpKSkgewotCQkJLyogRm9yY2UgbWVtb3J5IHdyaXRlcyB0byBjb21wbGV0ZSBiZWZvcmUgbGV0dGluZyBoL3cKLQkJCSAqIGtub3cgdGhlcmUgYXJlIG5ldyBkZXNjcmlwdG9ycyB0byBmZXRjaC4gIChPbmx5Ci0JCQkgKiBhcHBsaWNhYmxlIGZvciB3ZWFrLW9yZGVyZWQgbWVtb3J5IG1vZGVsIGFyY2hzLAotCQkJICogc3VjaCBhcyBJQS02NCkuICovCi0JCQl3bWIoKTsKLQkJCS8qIEhhcmR3YXJlIGluY3JlbWVudHMgYnkgMTYgYnl0ZXMsIGJ1dCBwYWNrZXQgc3BsaXQKLQkJCSAqIGRlc2NyaXB0b3JzIGFyZSAzMiBieXRlcy4uLnNvIHdlIGluY3JlbWVudCB0YWlsCi0JCQkgKiB0d2ljZSBhcyBtdWNoLgotCQkJICovCi0JCQl3cml0ZWwoaTw8MSwgYWRhcHRlci0+aHcuaHdfYWRkciArIHJ4X3JpbmctPnJkdCk7Ci0JCX0KLQotCQlpZih1bmxpa2VseSgrK2kgPT0gcnhfcmluZy0+Y291bnQpKSBpID0gMDsKKwkJaWYgKHVubGlrZWx5KCsraSA9PSByeF9yaW5nLT5jb3VudCkpIGkgPSAwOwogCQlidWZmZXJfaW5mbyA9ICZyeF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKIAkJcHNfcGFnZSA9ICZyeF9yaW5nLT5wc19wYWdlW2ldOwogCQlwc19wYWdlX2RtYSA9ICZyeF9yaW5nLT5wc19wYWdlX2RtYVtpXTsKIAl9CiAKIG5vX2J1ZmZlcnM6Ci0JcnhfcmluZy0+bmV4dF90b191c2UgPSBpOworCWlmIChsaWtlbHkocnhfcmluZy0+bmV4dF90b191c2UgIT0gaSkpIHsKKwkJcnhfcmluZy0+bmV4dF90b191c2UgPSBpOworCQlpZiAodW5saWtlbHkoaS0tID09IDApKSBpID0gKHJ4X3JpbmctPmNvdW50IC0gMSk7CisKKwkJLyogRm9yY2UgbWVtb3J5IHdyaXRlcyB0byBjb21wbGV0ZSBiZWZvcmUgbGV0dGluZyBoL3cKKwkJICoga25vdyB0aGVyZSBhcmUgbmV3IGRlc2NyaXB0b3JzIHRvIGZldGNoLiAgKE9ubHkKKwkJICogYXBwbGljYWJsZSBmb3Igd2Vhay1vcmRlcmVkIG1lbW9yeSBtb2RlbCBhcmNocywKKwkJICogc3VjaCBhcyBJQS02NCkuICovCisJCXdtYigpOworCQkvKiBIYXJkd2FyZSBpbmNyZW1lbnRzIGJ5IDE2IGJ5dGVzLCBidXQgcGFja2V0IHNwbGl0CisJCSAqIGRlc2NyaXB0b3JzIGFyZSAzMiBieXRlcy4uLnNvIHdlIGluY3JlbWVudCB0YWlsCisJCSAqIHR3aWNlIGFzIG11Y2guCisJCSAqLworCQl3cml0ZWwoaTw8MSwgYWRhcHRlci0+aHcuaHdfYWRkciArIHJ4X3JpbmctPnJkdCk7CisJfQogfQogCiAvKioKQEAgLTM4MTUsMjQgKzQxNTgsMjQgQEAKIAl1aW50MTZfdCBwaHlfc3RhdHVzOwogCXVpbnQxNl90IHBoeV9jdHJsOwogCi0JaWYoKGFkYXB0ZXItPmh3LnBoeV90eXBlICE9IGUxMDAwX3BoeV9pZ3ApIHx8ICFhZGFwdGVyLT5ody5hdXRvbmVnIHx8CisJaWYgKChhZGFwdGVyLT5ody5waHlfdHlwZSAhPSBlMTAwMF9waHlfaWdwKSB8fCAhYWRhcHRlci0+aHcuYXV0b25lZyB8fAogCSAgICEoYWRhcHRlci0+aHcuYXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwMDBfRlVMTCkpCiAJCXJldHVybjsKIAotCWlmKGFkYXB0ZXItPnNtYXJ0c3BlZWQgPT0gMCkgeworCWlmIChhZGFwdGVyLT5zbWFydHNwZWVkID09IDApIHsKIAkJLyogSWYgTWFzdGVyL1NsYXZlIGNvbmZpZyBmYXVsdCBpcyBhc3NlcnRlZCB0d2ljZSwKIAkJICogd2UgYXNzdW1lIGJhY2stdG8tYmFjayAqLwogCQllMTAwMF9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBQSFlfMTAwMFRfU1RBVFVTLCAmcGh5X3N0YXR1cyk7Ci0JCWlmKCEocGh5X3N0YXR1cyAmIFNSXzEwMDBUX01TX0NPTkZJR19GQVVMVCkpIHJldHVybjsKKwkJaWYgKCEocGh5X3N0YXR1cyAmIFNSXzEwMDBUX01TX0NPTkZJR19GQVVMVCkpIHJldHVybjsKIAkJZTEwMDBfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZXzEwMDBUX1NUQVRVUywgJnBoeV9zdGF0dXMpOwotCQlpZighKHBoeV9zdGF0dXMgJiBTUl8xMDAwVF9NU19DT05GSUdfRkFVTFQpKSByZXR1cm47CisJCWlmICghKHBoeV9zdGF0dXMgJiBTUl8xMDAwVF9NU19DT05GSUdfRkFVTFQpKSByZXR1cm47CiAJCWUxMDAwX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIFBIWV8xMDAwVF9DVFJMLCAmcGh5X2N0cmwpOwotCQlpZihwaHlfY3RybCAmIENSXzEwMDBUX01TX0VOQUJMRSkgeworCQlpZiAocGh5X2N0cmwgJiBDUl8xMDAwVF9NU19FTkFCTEUpIHsKIAkJCXBoeV9jdHJsICY9IH5DUl8xMDAwVF9NU19FTkFCTEU7CiAJCQllMTAwMF93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZXzEwMDBUX0NUUkwsCiAJCQkJCSAgICBwaHlfY3RybCk7CiAJCQlhZGFwdGVyLT5zbWFydHNwZWVkKys7Ci0JCQlpZighZTEwMDBfcGh5X3NldHVwX2F1dG9uZWcoJmFkYXB0ZXItPmh3KSAmJgorCQkJaWYgKCFlMTAwMF9waHlfc2V0dXBfYXV0b25lZygmYWRhcHRlci0+aHcpICYmCiAJCQkgICAhZTEwMDBfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZX0NUUkwsCiAJCQkJICAgCSAgICAgICAmcGh5X2N0cmwpKSB7CiAJCQkJcGh5X2N0cmwgfD0gKE1JSV9DUl9BVVRPX05FR19FTiB8CkBAIC0zODQyLDEyICs0MTg1LDEyIEBACiAJCQl9CiAJCX0KIAkJcmV0dXJuOwotCX0gZWxzZSBpZihhZGFwdGVyLT5zbWFydHNwZWVkID09IEUxMDAwX1NNQVJUU1BFRURfRE9XTlNISUZUKSB7CisJfSBlbHNlIGlmIChhZGFwdGVyLT5zbWFydHNwZWVkID09IEUxMDAwX1NNQVJUU1BFRURfRE9XTlNISUZUKSB7CiAJCS8qIElmIHN0aWxsIG5vIGxpbmssIHBlcmhhcHMgdXNpbmcgMi8zIHBhaXIgY2FibGUgKi8KIAkJZTEwMDBfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZXzEwMDBUX0NUUkwsICZwaHlfY3RybCk7CiAJCXBoeV9jdHJsIHw9IENSXzEwMDBUX01TX0VOQUJMRTsKIAkJZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIFBIWV8xMDAwVF9DVFJMLCBwaHlfY3RybCk7Ci0JCWlmKCFlMTAwMF9waHlfc2V0dXBfYXV0b25lZygmYWRhcHRlci0+aHcpICYmCisJCWlmICghZTEwMDBfcGh5X3NldHVwX2F1dG9uZWcoJmFkYXB0ZXItPmh3KSAmJgogCQkgICAhZTEwMDBfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZX0NUUkwsICZwaHlfY3RybCkpIHsKIAkJCXBoeV9jdHJsIHw9IChNSUlfQ1JfQVVUT19ORUdfRU4gfAogCQkJCSAgICAgTUlJX0NSX1JFU1RBUlRfQVVUT19ORUcpOwpAQCAtMzg1NSw3ICs0MTk4LDcgQEAKIAkJfQogCX0KIAkvKiBSZXN0YXJ0IHByb2Nlc3MgYWZ0ZXIgRTEwMDBfU01BUlRTUEVFRF9NQVggaXRlcmF0aW9ucyAqLwotCWlmKGFkYXB0ZXItPnNtYXJ0c3BlZWQrKyA9PSBFMTAwMF9TTUFSVFNQRUVEX01BWCkKKwlpZiAoYWRhcHRlci0+c21hcnRzcGVlZCsrID09IEUxMDAwX1NNQVJUU1BFRURfTUFYKQogCQlhZGFwdGVyLT5zbWFydHNwZWVkID0gMDsKIH0KIApAQCAtMzg5Niw3ICs0MjM5LDcgQEAKIAl1aW50MTZfdCBzcGRkcGx4OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZihhZGFwdGVyLT5ody5tZWRpYV90eXBlICE9IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKQorCWlmIChhZGFwdGVyLT5ody5tZWRpYV90eXBlICE9IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlzd2l0Y2ggKGNtZCkgewpAQCAtMzkwNCwxMCArNDI0NywxMCBAQAogCQlkYXRhLT5waHlfaWQgPSBhZGFwdGVyLT5ody5waHlfYWRkcjsKIAkJYnJlYWs7CiAJY2FzZSBTSU9DR01JSVJFRzoKLQkJaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKIAkJCXJldHVybiAtRVBFUk07CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5zdGF0c19sb2NrLCBmbGFncyk7Ci0JCWlmKGUxMDAwX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIGRhdGEtPnJlZ19udW0gJiAweDFGLAorCQlpZiAoZTEwMDBfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgZGF0YS0+cmVnX251bSAmIDB4MUYsCiAJCQkJICAgJmRhdGEtPnZhbF9vdXQpKSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5zdGF0c19sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm4gLUVJTzsKQEAgLTM5MTUsMjMgKzQyNTgsMjMgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+c3RhdHNfbG9jaywgZmxhZ3MpOwogCQlicmVhazsKIAljYXNlIFNJT0NTTUlJUkVHOgotCQlpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQogCQkJcmV0dXJuIC1FUEVSTTsKLQkJaWYoZGF0YS0+cmVnX251bSAmIH4oMHgxRikpCisJCWlmIChkYXRhLT5yZWdfbnVtICYgfigweDFGKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQltaWlfcmVnID0gZGF0YS0+dmFsX2luOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+c3RhdHNfbG9jaywgZmxhZ3MpOwotCQlpZihlMTAwMF93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgZGF0YS0+cmVnX251bSwKKwkJaWYgKGUxMDAwX3dyaXRlX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBkYXRhLT5yZWdfbnVtLAogCQkJCQltaWlfcmVnKSkgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+c3RhdHNfbG9jaywgZmxhZ3MpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KLQkJaWYoYWRhcHRlci0+aHcucGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkgeworCQlpZiAoYWRhcHRlci0+aHcucGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkgewogCQkJc3dpdGNoIChkYXRhLT5yZWdfbnVtKSB7CiAJCQljYXNlIFBIWV9DVFJMOgotCQkJCWlmKG1paV9yZWcgJiBNSUlfQ1JfUE9XRVJfRE9XTikKKwkJCQlpZiAobWlpX3JlZyAmIE1JSV9DUl9QT1dFUl9ET1dOKQogCQkJCQlicmVhazsKLQkJCQlpZihtaWlfcmVnICYgTUlJX0NSX0FVVE9fTkVHX0VOKSB7CisJCQkJaWYgKG1paV9yZWcgJiBNSUlfQ1JfQVVUT19ORUdfRU4pIHsKIAkJCQkJYWRhcHRlci0+aHcuYXV0b25lZyA9IDE7CiAJCQkJCWFkYXB0ZXItPmh3LmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IDB4MkY7CiAJCQkJfSBlbHNlIHsKQEAgLTM5NDYsMTQgKzQyODksMTQgQEAKIAkJCQkJCSAgIEhBTEZfRFVQTEVYOwogCQkJCQlyZXR2YWwgPSBlMTAwMF9zZXRfc3BkX2RwbHgoYWRhcHRlciwKIAkJCQkJCQkJICAgIHNwZGRwbHgpOwotCQkJCQlpZihyZXR2YWwpIHsKKwkJCQkJaWYgKHJldHZhbCkgewogCQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKLQkJCQkJCQkmYWRhcHRlci0+c3RhdHNfbG9jaywgCisJCQkJCQkJJmFkYXB0ZXItPnN0YXRzX2xvY2ssCiAJCQkJCQkJZmxhZ3MpOwogCQkJCQkJcmV0dXJuIHJldHZhbDsKIAkJCQkJfQogCQkJCX0KLQkJCQlpZihuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsKKwkJCQlpZiAobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKSB7CiAJCQkJCWUxMDAwX2Rvd24oYWRhcHRlcik7CiAJCQkJCWUxMDAwX3VwKGFkYXB0ZXIpOwogCQkJCX0gZWxzZQpAQCAtMzk2MSw3ICs0MzA0LDcgQEAKIAkJCQlicmVhazsKIAkJCWNhc2UgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTDoKIAkJCWNhc2UgTTg4RTEwMDBfRVhUX1BIWV9TUEVDX0NUUkw6Ci0JCQkJaWYoZTEwMDBfcGh5X3Jlc2V0KCZhZGFwdGVyLT5odykpIHsKKwkJCQlpZiAoZTEwMDBfcGh5X3Jlc2V0KCZhZGFwdGVyLT5odykpIHsKIAkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKIAkJCQkJCSZhZGFwdGVyLT5zdGF0c19sb2NrLCBmbGFncyk7CiAJCQkJCXJldHVybiAtRUlPOwpAQCAtMzk3MSw5ICs0MzE0LDkgQEAKIAkJfSBlbHNlIHsKIAkJCXN3aXRjaCAoZGF0YS0+cmVnX251bSkgewogCQkJY2FzZSBQSFlfQ1RSTDoKLQkJCQlpZihtaWlfcmVnICYgTUlJX0NSX1BPV0VSX0RPV04pCisJCQkJaWYgKG1paV9yZWcgJiBNSUlfQ1JfUE9XRVJfRE9XTikKIAkJCQkJYnJlYWs7Ci0JCQkJaWYobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKSB7CisJCQkJaWYgKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgewogCQkJCQllMTAwMF9kb3duKGFkYXB0ZXIpOwogCQkJCQllMTAwMF91cChhZGFwdGVyKTsKIAkJCQl9IGVsc2UKQEAgLTM5OTUsNyArNDMzOCw3IEBACiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBody0+YmFjazsKIAlpbnQgcmV0X3ZhbCA9IHBjaV9zZXRfbXdpKGFkYXB0ZXItPnBkZXYpOwogCi0JaWYocmV0X3ZhbCkKKwlpZiAocmV0X3ZhbCkKIAkJRFBSSU5USyhQUk9CRSwgRVJSLCAiRXJyb3IgaW4gc2V0dGluZyBNV0lcbiIpOwogfQogCkBAIC00MDQ0LDcgKzQzODcsNyBAQAogCWUxMDAwX2lycV9kaXNhYmxlKGFkYXB0ZXIpOwogCWFkYXB0ZXItPnZsZ3JwID0gZ3JwOwogCi0JaWYoZ3JwKSB7CisJaWYgKGdycCkgewogCQkvKiBlbmFibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCiAJCWN0cmwgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIENUUkwpOwogCQljdHJsIHw9IEUxMDAwX0NUUkxfVk1FOwpAQCAtNDA2Niw3ICs0NDA5LDcgQEAKIAkJcmN0bCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkNUTCk7CiAJCXJjdGwgJj0gfkUxMDAwX1JDVExfVkZFOwogCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMLCByY3RsKTsKLQkJaWYoYWRhcHRlci0+bW5nX3ZsYW5faWQgIT0gKHVpbnQxNl90KUUxMDAwX01OR19WTEFOX05PTkUpIHsKKwkJaWYgKGFkYXB0ZXItPm1uZ192bGFuX2lkICE9ICh1aW50MTZfdClFMTAwMF9NTkdfVkxBTl9OT05FKSB7CiAJCQllMTAwMF92bGFuX3J4X2tpbGxfdmlkKG5ldGRldiwgYWRhcHRlci0+bW5nX3ZsYW5faWQpOwogCQkJYWRhcHRlci0+bW5nX3ZsYW5faWQgPSBFMTAwMF9NTkdfVkxBTl9OT05FOwogCQl9CkBAIC00MDgwLDkgKzQ0MjMsMTAgQEAKIHsKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJdWludDMyX3QgdmZ0YSwgaW5kZXg7Ci0JaWYoKGFkYXB0ZXItPmh3Lm1uZ19jb29raWUuc3RhdHVzICYKLQkJRTEwMDBfTU5HX0RIQ1BfQ09PS0lFX1NUQVRVU19WTEFOX1NVUFBPUlQpICYmCi0JCSh2aWQgPT0gYWRhcHRlci0+bW5nX3ZsYW5faWQpKQorCisJaWYgKChhZGFwdGVyLT5ody5tbmdfY29va2llLnN0YXR1cyAmCisJICAgICBFMTAwMF9NTkdfREhDUF9DT09LSUVfU1RBVFVTX1ZMQU5fU1VQUE9SVCkgJiYKKwkgICAgKHZpZCA9PSBhZGFwdGVyLT5tbmdfdmxhbl9pZCkpCiAJCXJldHVybjsKIAkvKiBhZGQgVklEIHRvIGZpbHRlciB0YWJsZSAqLwogCWluZGV4ID0gKHZpZCA+PiA1KSAmIDB4N0Y7CkBAIC00MDk5LDE1ICs0NDQzLDE5IEBACiAKIAllMTAwMF9pcnFfZGlzYWJsZShhZGFwdGVyKTsKIAotCWlmKGFkYXB0ZXItPnZsZ3JwKQorCWlmIChhZGFwdGVyLT52bGdycCkKIAkJYWRhcHRlci0+dmxncnAtPnZsYW5fZGV2aWNlc1t2aWRdID0gTlVMTDsKIAogCWUxMDAwX2lycV9lbmFibGUoYWRhcHRlcik7CiAKLQlpZigoYWRhcHRlci0+aHcubW5nX2Nvb2tpZS5zdGF0dXMgJgotCQlFMTAwMF9NTkdfREhDUF9DT09LSUVfU1RBVFVTX1ZMQU5fU1VQUE9SVCkgJiYKLQkJKHZpZCA9PSBhZGFwdGVyLT5tbmdfdmxhbl9pZCkpCisJaWYgKChhZGFwdGVyLT5ody5tbmdfY29va2llLnN0YXR1cyAmCisJICAgICBFMTAwMF9NTkdfREhDUF9DT09LSUVfU1RBVFVTX1ZMQU5fU1VQUE9SVCkgJiYKKwkgICAgKHZpZCA9PSBhZGFwdGVyLT5tbmdfdmxhbl9pZCkpIHsKKwkJLyogcmVsZWFzZSBjb250cm9sIHRvIGYvdyAqLworCQllMTAwMF9yZWxlYXNlX2h3X2NvbnRyb2woYWRhcHRlcik7CiAJCXJldHVybjsKKwl9CisKIAkvKiByZW1vdmUgVklEIGZyb20gZmlsdGVyIHRhYmxlICovCiAJaW5kZXggPSAodmlkID4+IDUpICYgMHg3RjsKIAl2ZnRhID0gRTEwMDBfUkVBRF9SRUdfQVJSQVkoJmFkYXB0ZXItPmh3LCBWRlRBLCBpbmRleCk7CkBAIC00MTIwLDEwICs0NDY4LDEwIEBACiB7CiAJZTEwMDBfdmxhbl9yeF9yZWdpc3RlcihhZGFwdGVyLT5uZXRkZXYsIGFkYXB0ZXItPnZsZ3JwKTsKIAotCWlmKGFkYXB0ZXItPnZsZ3JwKSB7CisJaWYgKGFkYXB0ZXItPnZsZ3JwKSB7CiAJCXVpbnQxNl90IHZpZDsKLQkJZm9yKHZpZCA9IDA7IHZpZCA8IFZMQU5fR1JPVVBfQVJSQVlfTEVOOyB2aWQrKykgewotCQkJaWYoIWFkYXB0ZXItPnZsZ3JwLT52bGFuX2RldmljZXNbdmlkXSkKKwkJZm9yICh2aWQgPSAwOyB2aWQgPCBWTEFOX0dST1VQX0FSUkFZX0xFTjsgdmlkKyspIHsKKwkJCWlmICghYWRhcHRlci0+dmxncnAtPnZsYW5fZGV2aWNlc1t2aWRdKQogCQkJCWNvbnRpbnVlOwogCQkJZTEwMDBfdmxhbl9yeF9hZGRfdmlkKGFkYXB0ZXItPm5ldGRldiwgdmlkKTsKIAkJfQpAQCAtNDEzNiwxMyArNDQ4NCwxMyBAQAogCWFkYXB0ZXItPmh3LmF1dG9uZWcgPSAwOwogCiAJLyogRmliZXIgTklDcyBvbmx5IGFsbG93IDEwMDAgZ2JwcyBGdWxsIGR1cGxleCAqLwotCWlmKChhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpICYmCisJaWYgKChhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpICYmCiAJCXNwZGRwbHggIT0gKFNQRUVEXzEwMDAgKyBEVVBMRVhfRlVMTCkpIHsKIAkJRFBSSU5USyhQUk9CRSwgRVJSLCAiVW5zdXBwb3J0ZWQgU3BlZWQvRHVwbGV4IGNvbmZpZ3VyYXRpb25cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlzd2l0Y2goc3BkZHBseCkgeworCXN3aXRjaCAoc3BkZHBseCkgewogCWNhc2UgU1BFRURfMTAgKyBEVVBMRVhfSEFMRjoKIAkJYWRhcHRlci0+aHcuZm9yY2VkX3NwZWVkX2R1cGxleCA9IGUxMDAwXzEwX2hhbGY7CiAJCWJyZWFrOwpAQCAtNDE2OCwzNSArNDUxNiw5MiBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BNCisvKiB0aGVzZSBmdW5jdGlvbnMgc2F2ZSBhbmQgcmVzdG9yZSAxNiBvciA2NCBkd29yZHMgKDY0LTI1NiBieXRlcykgb2YgY29uZmlnCisgKiBzcGFjZSB2ZXJzdXMgdGhlIDY0IGJ5dGVzIHRoYXQgcGNpX1tzYXZlfHJlc3RvcmVdX3N0YXRlIGhhbmRsZQorICovCisjZGVmaW5lIFBDSUVfQ09ORklHX1NQQUNFX0xFTiAyNTYKKyNkZWZpbmUgUENJX0NPTkZJR19TUEFDRV9MRU4gNjQKK3N0YXRpYyBpbnQKK2UxMDAwX3BjaV9zYXZlX3N0YXRlKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBhZGFwdGVyLT5wZGV2OworCWludCBzaXplOworCWludCBpOworCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU3MSkKKwkJc2l6ZSA9IFBDSUVfQ09ORklHX1NQQUNFX0xFTjsKKwllbHNlCisJCXNpemUgPSBQQ0lfQ09ORklHX1NQQUNFX0xFTjsKKworCVdBUk5fT04oYWRhcHRlci0+Y29uZmlnX3NwYWNlICE9IE5VTEwpOworCisJYWRhcHRlci0+Y29uZmlnX3NwYWNlID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkYXB0ZXItPmNvbmZpZ19zcGFjZSkgeworCQlEUFJJTlRLKFBST0JFLCBFUlIsICJ1bmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXNcbiIsIHNpemUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZm9yIChpID0gMDsgaSA8IChzaXplIC8gNCk7IGkrKykKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgaSAqIDQsICZhZGFwdGVyLT5jb25maWdfc3BhY2VbaV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZTEwMDBfcGNpX3Jlc3RvcmVfc3RhdGUoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IGFkYXB0ZXItPnBkZXY7CisJaW50IHNpemU7CisJaW50IGk7CisJaWYgKGFkYXB0ZXItPmNvbmZpZ19zcGFjZSA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTcxKQorCQlzaXplID0gUENJRV9DT05GSUdfU1BBQ0VfTEVOOworCWVsc2UKKwkJc2l6ZSA9IFBDSV9DT05GSUdfU1BBQ0VfTEVOOworCWZvciAoaSA9IDA7IGkgPCAoc2l6ZSAvIDQpOyBpKyspCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBpICogNCwgYWRhcHRlci0+Y29uZmlnX3NwYWNlW2ldKTsKKwlrZnJlZShhZGFwdGVyLT5jb25maWdfc3BhY2UpOworCWFkYXB0ZXItPmNvbmZpZ19zcGFjZSA9IE5VTEw7CisJcmV0dXJuOworfQorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCiBzdGF0aWMgaW50CiBlMTAwMF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JdWludDMyX3QgY3RybCwgY3RybF9leHQsIHJjdGwsIG1hbmMsIHN0YXR1cywgc3dzbTsKKwl1aW50MzJfdCBjdHJsLCBjdHJsX2V4dCwgcmN0bCwgbWFuYywgc3RhdHVzOwogCXVpbnQzMl90IHd1ZmMgPSBhZGFwdGVyLT53b2w7CisJaW50IHJldHZhbCA9IDA7CiAKIAluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7CiAKLQlpZihuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKIAkJZTEwMDBfZG93bihhZGFwdGVyKTsKIAorI2lmZGVmIENPTkZJR19QTQorCS8qIGltcGxlbWVudCBvdXIgb3duIHZlcnNpb24gb2YgcGNpX3NhdmVfc3RhdGUocGRldikgYmVjYXVzZSBwY2kgCisJICogZXhwcmVzcyBhZGFwdGVycyBoYXZlIGxhcmdlciAyNTYgYnl0ZSBjb25maWcgc3BhY2VzICovCisJcmV0dmFsID0gZTEwMDBfcGNpX3NhdmVfc3RhdGUoYWRhcHRlcik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKyNlbmRpZgorCiAJc3RhdHVzID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBTVEFUVVMpOwotCWlmKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19MVSkKKwlpZiAoc3RhdHVzICYgRTEwMDBfU1RBVFVTX0xVKQogCQl3dWZjICY9IH5FMTAwMF9XVUZDX0xOS0M7CiAKLQlpZih3dWZjKSB7CisJaWYgKHd1ZmMpIHsKIAkJZTEwMDBfc2V0dXBfcmN0bChhZGFwdGVyKTsKIAkJZTEwMDBfc2V0X211bHRpKG5ldGRldik7CiAKIAkJLyogdHVybiBvbiBhbGwtbXVsdGkgbW9kZSBpZiB3YWtlIG9uIG11bHRpY2FzdCBpcyBlbmFibGVkICovCi0JCWlmKGFkYXB0ZXItPndvbCAmIEUxMDAwX1dVRkNfTUMpIHsKKwkJaWYgKGFkYXB0ZXItPndvbCAmIEUxMDAwX1dVRkNfTUMpIHsKIAkJCXJjdGwgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJDVEwpOwogCQkJcmN0bCB8PSBFMTAwMF9SQ1RMX01QRTsKIAkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJDVEwsIHJjdGwpOwogCQl9CiAKLQkJaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDApIHsKKwkJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQwKSB7CiAJCQljdHJsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMKTsKIAkJCS8qIGFkdmVydGlzZSB3YWtlIGZyb20gRDNDb2xkICovCiAJCQkjZGVmaW5lIEUxMDAwX0NUUkxfQURWRDNXVUMgMHgwMDEwMDAwMApAQCAtNDIwNyw3ICs0NjEyLDcgQEAKIAkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIENUUkwsIGN0cmwpOwogCQl9CiAKLQkJaWYoYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyIHx8CisJCWlmIChhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIgfHwKIAkJICAgYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykgewogCQkJLyoga2VlcCB0aGUgbGFzZXIgcnVubmluZyBpbiBEMyAqLwogCQkJY3RybF9leHQgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIENUUkxfRVhUKTsKQEAgLTQyMjAsOTYgKzQ2MjUsOTYgQEAKIAogCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBXVUMsIEUxMDAwX1dVQ19QTUVfRU4pOwogCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBXVUZDLCB3dWZjKTsKLQkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIDMsIDEpOwotCQlwY2lfZW5hYmxlX3dha2UocGRldiwgNCwgMSk7IC8qIDQgPT0gRDMgY29sZCAqLworCQlyZXR2YWwgPSBwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAxKTsKKwkJaWYgKHJldHZhbCkKKwkJCURQUklOVEsoUFJPQkUsIEVSUiwgIkVycm9yIGVuYWJsaW5nIEQzIHdha2VcbiIpOworCQlyZXR2YWwgPSBwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzY29sZCwgMSk7CisJCWlmIChyZXR2YWwpCisJCQlEUFJJTlRLKFBST0JFLCBFUlIsICJFcnJvciBlbmFibGluZyBEMyBjb2xkIHdha2VcbiIpOwogCX0gZWxzZSB7CiAJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFdVQywgMCk7CiAJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFdVRkMsIDApOwotCQlwY2lfZW5hYmxlX3dha2UocGRldiwgMywgMCk7Ci0JCXBjaV9lbmFibGVfd2FrZShwZGV2LCA0LCAwKTsgLyogNCA9PSBEMyBjb2xkICovCisJCXJldHZhbCA9IHBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIDApOworCQlpZiAocmV0dmFsKQorCQkJRFBSSU5USyhQUk9CRSwgRVJSLCAiRXJyb3IgZW5hYmxpbmcgRDMgd2FrZVxuIik7CisJCXJldHZhbCA9IHBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNjb2xkLCAwKTsgLyogNCA9PSBEMyBjb2xkICovCisJCWlmIChyZXR2YWwpCisJCQlEUFJJTlRLKFBST0JFLCBFUlIsICJFcnJvciBlbmFibGluZyBEMyBjb2xkIHdha2VcbiIpOwogCX0KIAotCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwotCi0JaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDAgJiYKKwlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDAgJiYKIAkgICBhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CiAJCW1hbmMgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIE1BTkMpOwotCQlpZihtYW5jICYgRTEwMDBfTUFOQ19TTUJVU19FTikgeworCQlpZiAobWFuYyAmIEUxMDAwX01BTkNfU01CVVNfRU4pIHsKIAkJCW1hbmMgfD0gRTEwMDBfTUFOQ19BUlBfRU47CiAJCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBNQU5DLCBtYW5jKTsKLQkJCXBjaV9lbmFibGVfd2FrZShwZGV2LCAzLCAxKTsKLQkJCXBjaV9lbmFibGVfd2FrZShwZGV2LCA0LCAxKTsgLyogNCA9PSBEMyBjb2xkICovCisJCQlyZXR2YWwgPSBwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAxKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJRFBSSU5USyhQUk9CRSwgRVJSLCAiRXJyb3IgZW5hYmxpbmcgRDMgd2FrZVxuIik7CisJCQlyZXR2YWwgPSBwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzY29sZCwgMSk7CisJCQlpZiAocmV0dmFsKQorCQkJCURQUklOVEsoUFJPQkUsIEVSUiwgIkVycm9yIGVuYWJsaW5nIEQzIGNvbGQgd2FrZVxuIik7CiAJCX0KIAl9CiAKLQlzd2l0Y2goYWRhcHRlci0+aHcubWFjX3R5cGUpIHsKLQljYXNlIGUxMDAwXzgyNTcxOgotCWNhc2UgZTEwMDBfODI1NzI6Ci0JCWN0cmxfZXh0ID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMX0VYVCk7Ci0JCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIENUUkxfRVhULAotCQkJCWN0cmxfZXh0ICYgfkUxMDAwX0NUUkxfRVhUX0RSVl9MT0FEKTsKLQkJYnJlYWs7Ci0JY2FzZSBlMTAwMF84MjU3MzoKLQkJc3dzbSA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1dTTSk7Ci0JCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFNXU00sCi0JCQkJc3dzbSAmIH5FMTAwMF9TV1NNX0RSVl9MT0FEKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQorCS8qIFJlbGVhc2UgY29udHJvbCBvZiBoL3cgdG8gZi93LiAgSWYgZi93IGlzIEFNVCBlbmFibGVkLCB0aGlzCisJICogd291bGQgaGF2ZSBhbHJlYWR5IGhhcHBlbmVkIGluIGNsb3NlIGFuZCBpcyByZWR1bmRhbnQuICovCisJZTEwMDBfcmVsZWFzZV9od19jb250cm9sKGFkYXB0ZXIpOwogCiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOworCisJcmV0dmFsID0gcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CisJaWYgKHJldHZhbCkKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAiRXJyb3IgaW4gc2V0dGluZyBwb3dlciBzdGF0ZVxuIik7CiAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludAogZTEwMDBfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXVpbnQzMl90IG1hbmMsIHJldF92YWwsIHN3c207Ci0JdWludDMyX3QgY3RybF9leHQ7CisJaW50IHJldHZhbDsKKwl1aW50MzJfdCBtYW5jLCByZXRfdmFsOwogCi0JcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOwotCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCXJldHZhbCA9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlpZiAocmV0dmFsKQorCQlEUFJJTlRLKFBST0JFLCBFUlIsICJFcnJvciBpbiBzZXR0aW5nIHBvd2VyIHN0YXRlXG4iKTsKKwllMTAwMF9wY2lfcmVzdG9yZV9zdGF0ZShhZGFwdGVyKTsKIAlyZXRfdmFsID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CiAJcGNpX3NldF9tYXN0ZXIocGRldik7CiAKLQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAwKTsKLQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzY29sZCwgMCk7CisJcmV0dmFsID0gcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2hvdCwgMCk7CisJaWYgKHJldHZhbCkKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAiRXJyb3IgZW5hYmxpbmcgRDMgd2FrZVxuIik7CisJcmV0dmFsID0gcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDApOworCWlmIChyZXR2YWwpCisJCURQUklOVEsoUFJPQkUsIEVSUiwgIkVycm9yIGVuYWJsaW5nIEQzIGNvbGQgd2FrZVxuIik7CiAKIAllMTAwMF9yZXNldChhZGFwdGVyKTsKIAlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBXVVMsIH4wKTsKIAotCWlmKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQogCQllMTAwMF91cChhZGFwdGVyKTsKIAogCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKIAotCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQwICYmCisJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQwICYmCiAJICAgYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgewogCQltYW5jID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBNQU5DKTsKIAkJbWFuYyAmPSB+KEUxMDAwX01BTkNfQVJQX0VOKTsKIAkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgTUFOQywgbWFuYyk7CiAJfQogCi0Jc3dpdGNoKGFkYXB0ZXItPmh3Lm1hY190eXBlKSB7Ci0JY2FzZSBlMTAwMF84MjU3MToKLQljYXNlIGUxMDAwXzgyNTcyOgotCQljdHJsX2V4dCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgQ1RSTF9FWFQpOwotCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMX0VYVCwKLQkJCQljdHJsX2V4dCB8IEUxMDAwX0NUUkxfRVhUX0RSVl9MT0FEKTsKLQkJYnJlYWs7Ci0JY2FzZSBlMTAwMF84MjU3MzoKLQkJc3dzbSA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1dTTSk7Ci0JCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFNXU00sCi0JCQkJc3dzbSB8IEUxMDAwX1NXU01fRFJWX0xPQUQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9CisJLyogSWYgdGhlIGNvbnRyb2xsZXIgaXMgODI1NzMgYW5kIGYvdyBpcyBBTVQsIGRvIG5vdCBzZXQKKwkgKiBEUlZfTE9BRCB1bnRpbCB0aGUgaW50ZXJmYWNlIGlzIHVwLiAgRm9yIGFsbCBvdGhlciBjYXNlcywKKwkgKiBsZXQgdGhlIGYvdyBrbm93IHRoYXQgdGhlIGgvdyBpcyBub3cgdW5kZXIgdGhlIGNvbnRyb2wKKwkgKiBvZiB0aGUgZHJpdmVyLiAqLworCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSAhPSBlMTAwMF84MjU3MyB8fAorCSAgICAhZTEwMDBfY2hlY2tfbW5nX21vZGUoJmFkYXB0ZXItPmh3KSkKKwkJZTEwMDBfZ2V0X2h3X2NvbnRyb2woYWRhcHRlcik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQzMjcsNiArNDczMiw5IEBACiAJZGlzYWJsZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxKTsKIAllMTAwMF9pbnRyKGFkYXB0ZXItPnBkZXYtPmlycSwgbmV0ZGV2LCBOVUxMKTsKIAllMTAwMF9jbGVhbl90eF9pcnEoYWRhcHRlciwgYWRhcHRlci0+dHhfcmluZyk7CisjaWZuZGVmIENPTkZJR19FMTAwMF9OQVBJCisJYWRhcHRlci0+Y2xlYW5fcngoYWRhcHRlciwgYWRhcHRlci0+cnhfcmluZyk7CisjZW5kaWYKIAllbmFibGVfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSk7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX29zZGVwLmggYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9vc2RlcC5oCmluZGV4IGFhYzY0ZGUuLjk3OTBkYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX29zZGVwLmgKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfb3NkZXAuaApAQCAtNDcsNyArNDcsNyBAQAogCSAgICAgICAgICAgICAgICAJQlVHKCk7IFwKIAkJCX0gZWxzZSB7IFwKIAkJCQltc2xlZXAoeCk7IFwKLQkJCX0gfSB3aGlsZSgwKQorCQkJfSB9IHdoaWxlICgwKQogCiAvKiBTb21lIHdvcmthcm91bmRzIHJlcXVpcmUgbWlsbGlzZWNvbmQgZGVsYXlzIGFuZCBhcmUgcnVuIGR1cmluZyBpbnRlcnJ1cHQKICAqIGNvbnRleHQuICBNb3N0IG5vdGFibHksIHdoZW4gZXN0YWJsaXNoaW5nIGxpbmssIHRoZSBwaHkgbWF5IG5lZWQgdHdlYWtpbmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX3BhcmFtLmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9wYXJhbS5jCmluZGV4IDM4Njk1ZDUuLjM3NjhkODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX3BhcmFtLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfcGFyYW0uYwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAgKgogICogVmFsaWQgUmFuZ2U6IDEwMC0xMDAwMDAgKDA9b2ZmLCAxPWR5bmFtaWMpCiAgKgotICogRGVmYXVsdCBWYWx1ZTogMQorICogRGVmYXVsdCBWYWx1ZTogODAwMAogICovCiAKIEUxMDAwX1BBUkFNKEludGVycnVwdFRocm90dGxlUmF0ZSwgIkludGVycnVwdCBUaHJvdHRsaW5nIFJhdGUiKTsKQEAgLTIyNyw3ICsyMjcsNyBAQAogZTEwMDBfdmFsaWRhdGVfb3B0aW9uKGludCAqdmFsdWUsIHN0cnVjdCBlMTAwMF9vcHRpb24gKm9wdCwKIAkJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JaWYoKnZhbHVlID09IE9QVElPTl9VTlNFVCkgeworCWlmICgqdmFsdWUgPT0gT1BUSU9OX1VOU0VUKSB7CiAJCSp2YWx1ZSA9IG9wdC0+ZGVmOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yNDQsNyArMjQ0LDcgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIHJhbmdlX29wdGlvbjoKLQkJaWYoKnZhbHVlID49IG9wdC0+YXJnLnIubWluICYmICp2YWx1ZSA8PSBvcHQtPmFyZy5yLm1heCkgeworCQlpZiAoKnZhbHVlID49IG9wdC0+YXJnLnIubWluICYmICp2YWx1ZSA8PSBvcHQtPmFyZy5yLm1heCkgewogCQkJRFBSSU5USyhQUk9CRSwgSU5GTywKIAkJCQkJIiVzIHNldCB0byAlaVxuIiwgb3B0LT5uYW1lLCAqdmFsdWUpOwogCQkJcmV0dXJuIDA7CkBAIC0yNTQsMTAgKzI1NCwxMCBAQAogCQlpbnQgaTsKIAkJc3RydWN0IGUxMDAwX29wdF9saXN0ICplbnQ7CiAKLQkJZm9yKGkgPSAwOyBpIDwgb3B0LT5hcmcubC5ucjsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBvcHQtPmFyZy5sLm5yOyBpKyspIHsKIAkJCWVudCA9ICZvcHQtPmFyZy5sLnBbaV07Ci0JCQlpZigqdmFsdWUgPT0gZW50LT5pKSB7Ci0JCQkJaWYoZW50LT5zdHJbMF0gIT0gJ1wwJykKKwkJCWlmICgqdmFsdWUgPT0gZW50LT5pKSB7CisJCQkJaWYgKGVudC0+c3RyWzBdICE9ICdcMCcpCiAJCQkJCURQUklOVEsoUFJPQkUsIElORk8sICIlc1xuIiwgZW50LT5zdHIpOwogCQkJCXJldHVybiAwOwogCQkJfQpAQCAtMjkxLDcgKzI5MSw3IEBACiBlMTAwMF9jaGVja19vcHRpb25zKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQogewogCWludCBiZCA9IGFkYXB0ZXItPmJkX251bWJlcjsKLQlpZihiZCA+PSBFMTAwMF9NQVhfTklDKSB7CisJaWYgKGJkID49IEUxMDAwX01BWF9OSUMpIHsKIAkJRFBSSU5USyhQUk9CRSwgTk9USUNFLAogCQkgICAgICAgIldhcm5pbmc6IG5vIGNvbmZpZ3VyYXRpb24gZm9yIGJvYXJkICMlaVxuIiwgYmQpOwogCQlEUFJJTlRLKFBST0JFLCBOT1RJQ0UsICJVc2luZyBkZWZhdWx0cyBmb3IgYWxsIHZhbHVlc1xuIik7CkBAIC0zMTUsMTIgKzMxNSwxMiBAQAogCQlpZiAobnVtX1R4RGVzY3JpcHRvcnMgPiBiZCkgewogCQkJdHhfcmluZy0+Y291bnQgPSBUeERlc2NyaXB0b3JzW2JkXTsKIAkJCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigmdHhfcmluZy0+Y291bnQsICZvcHQsIGFkYXB0ZXIpOwotCQkJRTEwMDBfUk9VTkRVUCh0eF9yaW5nLT5jb3VudCwgCisJCQlFMTAwMF9ST1VORFVQKHR4X3JpbmctPmNvdW50LAogCQkJCQkJUkVRX1RYX0RFU0NSSVBUT1JfTVVMVElQTEUpOwogCQl9IGVsc2UgewogCQkJdHhfcmluZy0+Y291bnQgPSBvcHQuZGVmOwogCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fdHhfcXVldWVzOyBpKyspCiAJCQl0eF9yaW5nW2ldLmNvdW50ID0gdHhfcmluZy0+Y291bnQ7CiAJfQogCXsgLyogUmVjZWl2ZSBEZXNjcmlwdG9yIENvdW50ICovCkBAIC0zNDEsMTIgKzM0MSwxMiBAQAogCQlpZiAobnVtX1J4RGVzY3JpcHRvcnMgPiBiZCkgewogCQkJcnhfcmluZy0+Y291bnQgPSBSeERlc2NyaXB0b3JzW2JkXTsKIAkJCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigmcnhfcmluZy0+Y291bnQsICZvcHQsIGFkYXB0ZXIpOwotCQkJRTEwMDBfUk9VTkRVUChyeF9yaW5nLT5jb3VudCwgCisJCQlFMTAwMF9ST1VORFVQKHJ4X3JpbmctPmNvdW50LAogCQkJCQkJUkVRX1JYX0RFU0NSSVBUT1JfTVVMVElQTEUpOwogCQl9IGVsc2UgewogCQkJcnhfcmluZy0+Y291bnQgPSBvcHQuZGVmOwogCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcnhfcXVldWVzOyBpKyspCiAJCQlyeF9yaW5nW2ldLmNvdW50ID0gcnhfcmluZy0+Y291bnQ7CiAJfQogCXsgLyogQ2hlY2tzdW0gT2ZmbG9hZCBFbmFibGUvRGlzYWJsZSAqLwpAQCAtMzg4LDcgKzM4OCw3IEBACiAJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmZjLCAmb3B0LCBhZGFwdGVyKTsKIAkJCWFkYXB0ZXItPmh3LmZjID0gYWRhcHRlci0+aHcub3JpZ2luYWxfZmMgPSBmYzsKIAkJfSBlbHNlIHsKLQkJCWFkYXB0ZXItPmh3LmZjID0gb3B0LmRlZjsKKwkJCWFkYXB0ZXItPmh3LmZjID0gYWRhcHRlci0+aHcub3JpZ2luYWxfZmMgPSBvcHQuZGVmOwogCQl9CiAJfQogCXsgLyogVHJhbnNtaXQgSW50ZXJydXB0IERlbGF5ICovCkBAIC00MDMsNyArNDAzLDcgQEAKIAogCQlpZiAobnVtX1R4SW50RGVsYXkgPiBiZCkgewogCQkJYWRhcHRlci0+dHhfaW50X2RlbGF5ID0gVHhJbnREZWxheVtiZF07Ci0JCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmFkYXB0ZXItPnR4X2ludF9kZWxheSwgJm9wdCwgCisJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmFkYXB0ZXItPnR4X2ludF9kZWxheSwgJm9wdCwKIAkJCQkJCQkJYWRhcHRlcik7CiAJCX0gZWxzZSB7CiAJCQlhZGFwdGVyLT50eF9pbnRfZGVsYXkgPSBvcHQuZGVmOwpAQCAtNDIxLDcgKzQyMSw3IEBACiAKIAkJaWYgKG51bV9UeEFic0ludERlbGF5ID4gYmQpIHsKIAkJCWFkYXB0ZXItPnR4X2Fic19pbnRfZGVsYXkgPSBUeEFic0ludERlbGF5W2JkXTsKLQkJCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigmYWRhcHRlci0+dHhfYWJzX2ludF9kZWxheSwgJm9wdCwgCisJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmFkYXB0ZXItPnR4X2Fic19pbnRfZGVsYXksICZvcHQsCiAJCQkJCQkJCWFkYXB0ZXIpOwogCQl9IGVsc2UgewogCQkJYWRhcHRlci0+dHhfYWJzX2ludF9kZWxheSA9IG9wdC5kZWY7CkBAIC00MzksNyArNDM5LDcgQEAKIAogCQlpZiAobnVtX1J4SW50RGVsYXkgPiBiZCkgewogCQkJYWRhcHRlci0+cnhfaW50X2RlbGF5ID0gUnhJbnREZWxheVtiZF07Ci0JCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmFkYXB0ZXItPnJ4X2ludF9kZWxheSwgJm9wdCwgCisJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmFkYXB0ZXItPnJ4X2ludF9kZWxheSwgJm9wdCwKIAkJCQkJCQkJYWRhcHRlcik7CiAJCX0gZWxzZSB7CiAJCQlhZGFwdGVyLT5yeF9pbnRfZGVsYXkgPSBvcHQuZGVmOwpAQCAtNDU3LDcgKzQ1Nyw3IEBACiAKIAkJaWYgKG51bV9SeEFic0ludERlbGF5ID4gYmQpIHsKIAkJCWFkYXB0ZXItPnJ4X2Fic19pbnRfZGVsYXkgPSBSeEFic0ludERlbGF5W2JkXTsKLQkJCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigmYWRhcHRlci0+cnhfYWJzX2ludF9kZWxheSwgJm9wdCwgCisJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmFkYXB0ZXItPnJ4X2Fic19pbnRfZGVsYXksICZvcHQsCiAJCQkJCQkJCWFkYXB0ZXIpOwogCQl9IGVsc2UgewogCQkJYWRhcHRlci0+cnhfYWJzX2ludF9kZWxheSA9IG9wdC5kZWY7CkBAIC00NzUsMTcgKzQ3NSwxNyBAQAogCiAJCWlmIChudW1fSW50ZXJydXB0VGhyb3R0bGVSYXRlID4gYmQpIHsKIAkJCWFkYXB0ZXItPml0ciA9IEludGVycnVwdFRocm90dGxlUmF0ZVtiZF07Ci0JCQlzd2l0Y2goYWRhcHRlci0+aXRyKSB7CisJCQlzd2l0Y2ggKGFkYXB0ZXItPml0cikgewogCQkJY2FzZSAwOgotCQkJCURQUklOVEsoUFJPQkUsIElORk8sICIlcyB0dXJuZWQgb2ZmXG4iLCAKKwkJCQlEUFJJTlRLKFBST0JFLCBJTkZPLCAiJXMgdHVybmVkIG9mZlxuIiwKIAkJCQkJb3B0Lm5hbWUpOwogCQkJCWJyZWFrOwogCQkJY2FzZSAxOgotCQkJCURQUklOVEsoUFJPQkUsIElORk8sICIlcyBzZXQgdG8gZHluYW1pYyBtb2RlXG4iLCAKKwkJCQlEUFJJTlRLKFBST0JFLCBJTkZPLCAiJXMgc2V0IHRvIGR5bmFtaWMgbW9kZVxuIiwKIAkJCQkJb3B0Lm5hbWUpOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmFkYXB0ZXItPml0ciwgJm9wdCwgCisJCQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZhZGFwdGVyLT5pdHIsICZvcHQsCiAJCQkJCWFkYXB0ZXIpOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtNDk0LDcgKzQ5NCw3IEBACiAJCX0KIAl9CiAKLQlzd2l0Y2goYWRhcHRlci0+aHcubWVkaWFfdHlwZSkgeworCXN3aXRjaCAoYWRhcHRlci0+aHcubWVkaWFfdHlwZSkgewogCWNhc2UgZTEwMDBfbWVkaWFfdHlwZV9maWJlcjoKIAljYXNlIGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzOgogCQllMTAwMF9jaGVja19maWJlcl9vcHRpb25zKGFkYXB0ZXIpOwpAQCAtNTE4LDE3ICs1MTgsMTcgQEAKIGUxMDAwX2NoZWNrX2ZpYmVyX29wdGlvbnMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJaW50IGJkID0gYWRhcHRlci0+YmRfbnVtYmVyOwotCWlmKG51bV9TcGVlZCA+IGJkKSB7CisJaWYgKG51bV9TcGVlZCA+IGJkKSB7CiAJCURQUklOVEsoUFJPQkUsIElORk8sICJTcGVlZCBub3QgdmFsaWQgZm9yIGZpYmVyIGFkYXB0ZXJzLCAiCiAJCSAgICAgICAicGFyYW1ldGVyIGlnbm9yZWRcbiIpOwogCX0KIAotCWlmKG51bV9EdXBsZXggPiBiZCkgeworCWlmIChudW1fRHVwbGV4ID4gYmQpIHsKIAkJRFBSSU5USyhQUk9CRSwgSU5GTywgIkR1cGxleCBub3QgdmFsaWQgZm9yIGZpYmVyIGFkYXB0ZXJzLCAiCiAJCSAgICAgICAicGFyYW1ldGVyIGlnbm9yZWRcbiIpOwogCX0KIAotCWlmKChudW1fQXV0b05lZyA+IGJkKSAmJiAoQXV0b05lZ1tiZF0gIT0gMHgyMCkpIHsKKwlpZiAoKG51bV9BdXRvTmVnID4gYmQpICYmIChBdXRvTmVnW2JkXSAhPSAweDIwKSkgewogCQlEUFJJTlRLKFBST0JFLCBJTkZPLCAiQXV0b05lZyBvdGhlciB0aGFuIDEwMDAvRnVsbCBpcyAiCiAJCQkJICJub3QgdmFsaWQgZm9yIGZpYmVyIGFkYXB0ZXJzLCAiCiAJCQkJICJwYXJhbWV0ZXIgaWdub3JlZFxuIik7CkBAIC01NDUsNyArNTQ1LDcgQEAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdAogZTEwMDBfY2hlY2tfY29wcGVyX29wdGlvbnMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JaW50IHNwZWVkLCBkcGx4OworCWludCBzcGVlZCwgZHBseCwgYW47CiAJaW50IGJkID0gYWRhcHRlci0+YmRfbnVtYmVyOwogCiAJeyAvKiBTcGVlZCAqLwpAQCAtNTg0LDYgKzU4NCwxMiBAQAogCQkJCQkgLnAgPSBkcGx4X2xpc3QgfX0KIAkJfTsKIAorCQlpZiAoZTEwMDBfY2hlY2tfcGh5X3Jlc2V0X2Jsb2NrKCZhZGFwdGVyLT5odykpIHsKKwkJCURQUklOVEsoUFJPQkUsIElORk8sCisJCQkJIkxpbmsgYWN0aXZlIGR1ZSB0byBTb0wvSURFUiBTZXNzaW9uLiAiCisJCQkgICAgICAgICJTcGVlZC9EdXBsZXgvQXV0b05lZyBwYXJhbWV0ZXIgaWdub3JlZC5cbiIpOworCQkJcmV0dXJuOworCQl9CiAJCWlmIChudW1fRHVwbGV4ID4gYmQpIHsKIAkJCWRwbHggPSBEdXBsZXhbYmRdOwogCQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZkcGx4LCAmb3B0LCBhZGFwdGVyKTsKQEAgLTU5Miw3ICs1OTgsNyBAQAogCQl9CiAJfQogCi0JaWYoKG51bV9BdXRvTmVnID4gYmQpICYmIChzcGVlZCAhPSAwIHx8IGRwbHggIT0gMCkpIHsKKwlpZiAoKG51bV9BdXRvTmVnID4gYmQpICYmIChzcGVlZCAhPSAwIHx8IGRwbHggIT0gMCkpIHsKIAkJRFBSSU5USyhQUk9CRSwgSU5GTywKIAkJICAgICAgICJBdXRvTmVnIHNwZWNpZmllZCBhbG9uZyB3aXRoIFNwZWVkIG9yIER1cGxleCwgIgogCQkgICAgICAgInBhcmFtZXRlciBpZ25vcmVkXG4iKTsKQEAgLTY0MSwxNSArNjQ3LDE5IEBACiAJCQkJCSAucCA9IGFuX2xpc3QgfX0KIAkJfTsKIAotCQlpbnQgYW4gPSBBdXRvTmVnW2JkXTsKLQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZhbiwgJm9wdCwgYWRhcHRlcik7CisJCWlmIChudW1fQXV0b05lZyA+IGJkKSB7CisJCQlhbiA9IEF1dG9OZWdbYmRdOworCQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZhbiwgJm9wdCwgYWRhcHRlcik7CisJCX0gZWxzZSB7CisJCQlhbiA9IG9wdC5kZWY7CisJCX0KIAkJYWRhcHRlci0+aHcuYXV0b25lZ19hZHZlcnRpc2VkID0gYW47CiAJfQogCiAJc3dpdGNoIChzcGVlZCArIGRwbHgpIHsKIAljYXNlIDA6CiAJCWFkYXB0ZXItPmh3LmF1dG9uZWcgPSBhZGFwdGVyLT5mY19hdXRvbmVnID0gMTsKLQkJaWYoKG51bV9TcGVlZCA+IGJkKSAmJiAoc3BlZWQgIT0gMCB8fCBkcGx4ICE9IDApKQorCQlpZiAoKG51bV9TcGVlZCA+IGJkKSAmJiAoc3BlZWQgIT0gMCB8fCBkcGx4ICE9IDApKQogCQkJRFBSSU5USyhQUk9CRSwgSU5GTywKIAkJCSAgICAgICAiU3BlZWQgYW5kIGR1cGxleCBhdXRvbmVnb3RpYXRpb24gZW5hYmxlZFxuIik7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTIxMDAuYyBiL2RyaXZlcnMvbmV0L2UyMTAwLmMKaW5kZXggZjVhNGRkNy4uZTVjNWNkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTIxMDAuYworKysgYi9kcml2ZXJzL25ldC9lMjEwMC5jCkBAIC0xNDAsMTMgKzE0MCw2IEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLXN0YXRpYyB2b2lkIGNsZWFudXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCS8qIE5COiBlMjFfY2xvc2UoKSBoYW5kbGVzIGZyZWVfaXJxICovCi0JaW91bm1hcChlaV9zdGF0dXMubWVtKTsKLQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRTIxX0lPX0VYVEVOVCk7Ci19Ci0KICNpZm5kZWYgTU9EVUxFCiBzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBlMjEwMF9wcm9iZShpbnQgdW5pdCkKIHsKQEAgLTQ2Myw2ICs0NTYsMTMgQEAKIAlyZXR1cm4gLUVOWElPOwogfQogCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBOQjogZTIxX2Nsb3NlKCkgaGFuZGxlcyBmcmVlX2lycSAqLworCWlvdW5tYXAoZWlfc3RhdHVzLm1lbSk7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEUyMV9JT19FWFRFTlQpOworfQorCiB2b2lkCiBjbGVhbnVwX21vZHVsZSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXMzMjEwLmMgYi9kcml2ZXJzL25ldC9lczMyMTAuYwppbmRleCA1MGY4ZTIzLi42YjBhYjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lczMyMTAuYworKysgYi9kcml2ZXJzL25ldC9lczMyMTAuYwpAQCAtMTU1LDEzICsxNTUsNiBAQAogCXJldHVybiAtRU5PREVWOwogfQogCi1zdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKLQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRVNfSU9fRVhURU5UKTsKLQlpb3VubWFwKGVpX3N0YXR1cy5tZW0pOwotfQotCiAjaWZuZGVmIE1PRFVMRQogc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgZXNfcHJvYmUoaW50IHVuaXQpCiB7CkBAIC00NTYsNiArNDQ5LDEzIEBACiAJcmV0dXJuIC1FTlhJTzsKIH0KIAorc3RhdGljIHZvaWQgY2xlYW51cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVTX0lPX0VYVEVOVCk7CisJaW91bm1hcChlaV9zdGF0dXMubWVtKTsKK30KKwogdm9pZAogY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKaW5kZXggYzM5MzQ0YS4uMzY4MmVjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKQEAgLTEwMSw2ICsxMDEsNyBAQAogICoJMC40NjogMjAgT2N0IDIwMDU6IEFkZCBpcnEgb3B0aW1pemF0aW9uIG1vZGVzLgogICoJMC40NzogMjYgT2N0IDIwMDU6IEFkZCBwaHlhZGRyIDAgaW4gcGh5IHNjYW4uCiAgKgkwLjQ4OiAyNCBEZWMgMjAwNTogRGlzYWJsZSBUU08sIGJ1Z2ZpeCBmb3IgcGNpX21hcF9zaW5nbGUKKyAqCTAuNDk6IDEwIERlYyAyMDA1OiBGaXggdHNvIGZvciBsYXJnZSBidWZmZXJzLgogICoKICAqIEtub3duIGJ1Z3M6CiAgKiBXZSBzdXNwZWN0IHRoYXQgb24gc29tZSBoYXJkd2FyZSBubyBUWCBkb25lIGludGVycnVwdHMgYXJlIGdlbmVyYXRlZC4KQEAgLTExMiw3ICsxMTMsNyBAQAogICogREVWX05FRURfVElNRVJJUlEgd2lsbCBub3QgaGFybSB5b3Ugb24gc2FuZSBoYXJkd2FyZSwgb25seSBnZW5lcmF0aW5nIGEgZmV3CiAgKiBzdXBlcmZsdW91cyB0aW1lciBpbnRlcnJ1cHRzIGZyb20gdGhlIG5pYy4KICAqLwotI2RlZmluZSBGT1JDRURFVEhfVkVSU0lPTgkJIjAuNDgiCisjZGVmaW5lIEZPUkNFREVUSF9WRVJTSU9OCQkiMC40OSIKICNkZWZpbmUgRFJWX05BTUUJCQkiZm9yY2VkZXRoIgogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zNDksNiArMzUwLDggQEAKICNkZWZpbmUgTlZfVFgyX1ZBTElECQkoMTw8MzEpCiAjZGVmaW5lIE5WX1RYMl9UU08JCSgxPDwyOCkKICNkZWZpbmUgTlZfVFgyX1RTT19TSElGVAkxNAorI2RlZmluZSBOVl9UWDJfVFNPX01BWF9TSElGVAkxNAorI2RlZmluZSBOVl9UWDJfVFNPX01BWF9TSVpFCSgxPDxOVl9UWDJfVFNPX01BWF9TSElGVCkKICNkZWZpbmUgTlZfVFgyX0NIRUNLU1VNX0wzCSgxPDwyNykKICNkZWZpbmUgTlZfVFgyX0NIRUNLU1VNX0w0CSgxPDwyNikKIApAQCAtNDA4LDE1ICs0MTEsMTUgQEAKICNkZWZpbmUgTlZfV0FUQ0hET0dfVElNRU8JKDUqSFopCiAKICNkZWZpbmUgUlhfUklORwkJMTI4Ci0jZGVmaW5lIFRYX1JJTkcJCTY0CisjZGVmaW5lIFRYX1JJTkcJCTI1NgogLyogCiAgKiBJZiB5b3VyIG5pYyBteXN0ZXJpb3VzbHkgaGFuZ3MgdGhlbiB0cnkgdG8gcmVkdWNlIHRoZSBsaW1pdHMKICAqIHRvIDEvMDogSXQgbWlnaHQgYmUgcmVxdWlyZWQgdG8gc2V0IE5WX1RYX0xBU1RQQUNLRVQgaW4gdGhlCiAgKiBsYXN0IHZhbGlkIHJpbmcgZW50cnkuIEJ1dCB0aGlzIHdvdWxkIGJlIGltcG9zc2libGUgdG8KICAqIGltcGxlbWVudCAtIHByb2JhYmx5IGEgZGlzYXNzZW1ibHkgZXJyb3IuCiAgKi8KLSNkZWZpbmUgVFhfTElNSVRfU1RPUAk2MwotI2RlZmluZSBUWF9MSU1JVF9TVEFSVAk2MgorI2RlZmluZSBUWF9MSU1JVF9TVE9QCTI1NQorI2RlZmluZSBUWF9MSU1JVF9TVEFSVAkyNTQKIAogLyogcngvdHggbWFjIGFkZHIgKyB0eXBlICsgdmxhbiArIGFsaWduICsgc2xhY2sqLwogI2RlZmluZSBOVl9SWF9IRUFERVJTCQkoNjQpCkBAIC01MzUsNiArNTM4LDcgQEAKIAl1bnNpZ25lZCBpbnQgbmV4dF90eCwgbmljX3R4OwogCXN0cnVjdCBza19idWZmICp0eF9za2J1ZmZbVFhfUklOR107CiAJZG1hX2FkZHJfdCB0eF9kbWFbVFhfUklOR107CisJdW5zaWduZWQgaW50IHR4X2RtYV9sZW5bVFhfUklOR107CiAJdTMyIHR4X2ZsYWdzOwogfTsKIApAQCAtOTM1LDYgKzkzOSw3IEBACiAJICAgICAgICBlbHNlCiAJCQlucC0+dHhfcmluZy5leFtpXS5GbGFnTGVuID0gMDsKIAkJbnAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCW5wLT50eF9kbWFbaV0gPSAwOwogCX0KIH0KIApAQCAtOTQ1LDMwICs5NTAsMjcgQEAKIAlyZXR1cm4gbnZfYWxsb2NfcngoZGV2KTsKIH0KIAotc3RhdGljIHZvaWQgbnZfcmVsZWFzZV90eHNrYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgc2tibnIpCitzdGF0aWMgaW50IG52X3JlbGVhc2VfdHhza2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHNrYm5yKQogewogCXN0cnVjdCBmZV9wcml2ICpucCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IG5wLT50eF9za2J1ZmZbc2tibnJdOwotCXVuc2lnbmVkIGludCBqLCBlbnRyeSwgZnJhZ21lbnRzOwotCQkJCi0JZHByaW50ayhLRVJOX0lORk8gIiVzOiBudl9yZWxlYXNlX3R4c2tiIGZvciBza2JuciAlZCwgc2tiICVwXG4iLAotCQlkZXYtPm5hbWUsIHNrYm5yLCBucC0+dHhfc2tidWZmW3NrYm5yXSk7Ci0JCi0JZW50cnkgPSBza2JucjsKLQlpZiAoKGZyYWdtZW50cyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MpICE9IDApIHsKLQkJZm9yIChqID0gZnJhZ21lbnRzOyBqID49IDE7IGotLSkgewotCQkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2otMV07Ci0JCQlwY2lfdW5tYXBfcGFnZShucC0+cGNpX2RldiwgbnAtPnR4X2RtYVtlbnRyeV0sCi0JCQkJICAgICAgIGZyYWctPnNpemUsCi0JCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJZW50cnkgPSAoZW50cnkgLSAxKSAlIFRYX1JJTkc7Ci0JCX0KKworCWRwcmludGsoS0VSTl9JTkZPICIlczogbnZfcmVsZWFzZV90eHNrYiBmb3Igc2tibnIgJWRcbiIsCisJCWRldi0+bmFtZSwgc2tibnIpOworCisJaWYgKG5wLT50eF9kbWFbc2tibnJdKSB7CisJCXBjaV91bm1hcF9wYWdlKG5wLT5wY2lfZGV2LCBucC0+dHhfZG1hW3NrYm5yXSwKKwkJCSAgICAgICBucC0+dHhfZG1hX2xlbltza2Jucl0sCisJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisJCW5wLT50eF9kbWFbc2tibnJdID0gMDsKIAl9Ci0JcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldiwgbnAtPnR4X2RtYVtlbnRyeV0sCi0JCQkgc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuLAotCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOwotCWRldl9rZnJlZV9za2JfaXJxKHNrYik7Ci0JbnAtPnR4X3NrYnVmZltza2Jucl0gPSBOVUxMOworCisJaWYgKG5wLT50eF9za2J1ZmZbc2tibnJdKSB7CisJCWRldl9rZnJlZV9za2JfaXJxKG5wLT50eF9za2J1ZmZbc2tibnJdKTsKKwkJbnAtPnR4X3NrYnVmZltza2Jucl0gPSBOVUxMOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIG52X2RyYWluX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC05ODEsMTAgKzk4Myw4IEBACiAJCQlucC0+dHhfcmluZy5vcmlnW2ldLkZsYWdMZW4gPSAwOwogCQllbHNlCiAJCQlucC0+dHhfcmluZy5leFtpXS5GbGFnTGVuID0gMDsKLQkJaWYgKG5wLT50eF9za2J1ZmZbaV0pIHsKLQkJCW52X3JlbGVhc2VfdHhza2IoZGV2LCBpKTsKKwkJaWYgKG52X3JlbGVhc2VfdHhza2IoZGV2LCBpKSkKIAkJCW5wLT5zdGF0cy50eF9kcm9wcGVkKys7Ci0JCX0KIAl9CiB9CiAKQEAgLTEwMjEsNjggKzEwMjEsMTA1IEBACiBzdGF0aWMgaW50IG52X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiB0eF9mbGFncyA9IDA7CiAJdTMyIHR4X2ZsYWdzX2V4dHJhID0gKG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8xID8gTlZfVFhfTEFTVFBBQ0tFVCA6IE5WX1RYMl9MQVNUUEFDS0VUKTsKIAl1bnNpZ25lZCBpbnQgZnJhZ21lbnRzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKLQl1bnNpZ25lZCBpbnQgbnIgPSAobnAtPm5leHRfdHggKyBmcmFnbWVudHMpICUgVFhfUklORzsKKwl1bnNpZ25lZCBpbnQgbnIgPSAobnAtPm5leHRfdHggLSAxKSAlIFRYX1JJTkc7CisJdW5zaWduZWQgaW50IHN0YXJ0X25yID0gbnAtPm5leHRfdHggJSBUWF9SSU5HOwogCXVuc2lnbmVkIGludCBpOworCXUzMiBvZmZzZXQgPSAwOworCXUzMiBiY250OworCXUzMiBzaXplID0gc2tiLT5sZW4tc2tiLT5kYXRhX2xlbjsKKwl1MzIgZW50cmllcyA9IChzaXplID4+IE5WX1RYMl9UU09fTUFYX1NISUZUKSArICgoc2l6ZSAmIChOVl9UWDJfVFNPX01BWF9TSVpFLTEpKSA/IDEgOiAwKTsKKworCS8qIGFkZCBmcmFnbWVudHMgdG8gZW50cmllcyBjb3VudCAqLworCWZvciAoaSA9IDA7IGkgPCBmcmFnbWVudHM7IGkrKykgeworCQllbnRyaWVzICs9IChza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemUgPj4gTlZfVFgyX1RTT19NQVhfU0hJRlQpICsKKwkJCSAgICgoc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplICYgKE5WX1RYMl9UU09fTUFYX1NJWkUtMSkpID8gMSA6IDApOworCX0KIAogCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKIAotCWlmICgobnAtPm5leHRfdHggLSBucC0+bmljX3R4ICsgZnJhZ21lbnRzKSA+IFRYX0xJTUlUX1NUT1ApIHsKKwlpZiAoKG5wLT5uZXh0X3R4IC0gbnAtPm5pY190eCArIGVudHJpZXMgLSAxKSA+IFRYX0xJTUlUX1NUT1ApIHsKIAkJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CiAJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KIAotCW5wLT50eF9za2J1ZmZbbnJdID0gc2tiOwotCQotCWlmIChmcmFnbWVudHMpIHsKLQkJZHByaW50ayhLRVJOX0RFQlVHICIlczogbnZfc3RhcnRfeG1pdDogYnVmZmVyIGNvbnRhaW5zICVkIGZyYWdtZW50c1xuIiwgZGV2LT5uYW1lLCBmcmFnbWVudHMpOwotCQkvKiBzZXR1cCBkZXNjcmlwdG9ycyBpbiByZXZlcnNlIG9yZGVyICovCi0JCWZvciAoaSA9IGZyYWdtZW50czsgaSA+PSAxOyBpLS0pIHsKLQkJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpLTFdOwotCQkJbnAtPnR4X2RtYVtucl0gPSBwY2lfbWFwX3BhZ2UobnAtPnBjaV9kZXYsIGZyYWctPnBhZ2UsIGZyYWctPnBhZ2Vfb2Zmc2V0LCBmcmFnLT5zaXplLAotCQkJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCS8qIHNldHVwIHRoZSBoZWFkZXIgYnVmZmVyICovCisJZG8geworCQliY250ID0gKHNpemUgPiBOVl9UWDJfVFNPX01BWF9TSVpFKSA/IE5WX1RYMl9UU09fTUFYX1NJWkUgOiBzaXplOworCQluciA9IChuciArIDEpICUgVFhfUklORzsKKworCQlucC0+dHhfZG1hW25yXSA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPmRhdGEgKyBvZmZzZXQsIGJjbnQsCisJCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJbnAtPnR4X2RtYV9sZW5bbnJdID0gYmNudDsKKworCQlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEgfHwgbnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzIpIHsKKwkJCW5wLT50eF9yaW5nLm9yaWdbbnJdLlBhY2tldEJ1ZmZlciA9IGNwdV90b19sZTMyKG5wLT50eF9kbWFbbnJdKTsKKwkJCW5wLT50eF9yaW5nLm9yaWdbbnJdLkZsYWdMZW4gPSBjcHVfdG9fbGUzMigoYmNudC0xKSB8IHR4X2ZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCW5wLT50eF9yaW5nLmV4W25yXS5QYWNrZXRCdWZmZXJIaWdoID0gY3B1X3RvX2xlNjQobnAtPnR4X2RtYVtucl0pID4+IDMyOworCQkJbnAtPnR4X3JpbmcuZXhbbnJdLlBhY2tldEJ1ZmZlckxvdyA9IGNwdV90b19sZTY0KG5wLT50eF9kbWFbbnJdKSAmIDB4MEZGRkZGRkZGOworCQkJbnAtPnR4X3JpbmcuZXhbbnJdLkZsYWdMZW4gPSBjcHVfdG9fbGUzMigoYmNudC0xKSB8IHR4X2ZsYWdzKTsKKwkJfQorCQl0eF9mbGFncyA9IG5wLT50eF9mbGFnczsKKwkJb2Zmc2V0ICs9IGJjbnQ7CisJCXNpemUgLT0gYmNudDsKKwl9IHdoaWxlKHNpemUpOworCisJLyogc2V0dXAgdGhlIGZyYWdtZW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBmcmFnbWVudHM7IGkrKykgeworCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisJCXUzMiBzaXplID0gZnJhZy0+c2l6ZTsKKwkJb2Zmc2V0ID0gMDsKKworCQlkbyB7CisJCQliY250ID0gKHNpemUgPiBOVl9UWDJfVFNPX01BWF9TSVpFKSA/IE5WX1RYMl9UU09fTUFYX1NJWkUgOiBzaXplOworCQkJbnIgPSAobnIgKyAxKSAlIFRYX1JJTkc7CisKKwkJCW5wLT50eF9kbWFbbnJdID0gcGNpX21hcF9wYWdlKG5wLT5wY2lfZGV2LCBmcmFnLT5wYWdlLCBmcmFnLT5wYWdlX29mZnNldCtvZmZzZXQsIGJjbnQsCisJCQkJCQkgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCW5wLT50eF9kbWFfbGVuW25yXSA9IGJjbnQ7CiAKIAkJCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSB8fCBucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMikgewogCQkJCW5wLT50eF9yaW5nLm9yaWdbbnJdLlBhY2tldEJ1ZmZlciA9IGNwdV90b19sZTMyKG5wLT50eF9kbWFbbnJdKTsKLQkJCQlucC0+dHhfcmluZy5vcmlnW25yXS5GbGFnTGVuID0gY3B1X3RvX2xlMzIoIChmcmFnLT5zaXplLTEpIHwgbnAtPnR4X2ZsYWdzIHwgdHhfZmxhZ3NfZXh0cmEpOworCQkJCW5wLT50eF9yaW5nLm9yaWdbbnJdLkZsYWdMZW4gPSBjcHVfdG9fbGUzMigoYmNudC0xKSB8IHR4X2ZsYWdzKTsKIAkJCX0gZWxzZSB7CiAJCQkJbnAtPnR4X3JpbmcuZXhbbnJdLlBhY2tldEJ1ZmZlckhpZ2ggPSBjcHVfdG9fbGU2NChucC0+dHhfZG1hW25yXSkgPj4gMzI7CiAJCQkJbnAtPnR4X3JpbmcuZXhbbnJdLlBhY2tldEJ1ZmZlckxvdyA9IGNwdV90b19sZTY0KG5wLT50eF9kbWFbbnJdKSAmIDB4MEZGRkZGRkZGOwotCQkJCW5wLT50eF9yaW5nLmV4W25yXS5GbGFnTGVuID0gY3B1X3RvX2xlMzIoIChmcmFnLT5zaXplLTEpIHwgbnAtPnR4X2ZsYWdzIHwgdHhfZmxhZ3NfZXh0cmEpOworCQkJCW5wLT50eF9yaW5nLmV4W25yXS5GbGFnTGVuID0gY3B1X3RvX2xlMzIoKGJjbnQtMSkgfCB0eF9mbGFncyk7CiAJCQl9Ci0JCQkKLQkJCW5yID0gKG5yIC0gMSkgJSBUWF9SSU5HOwotCi0JCQlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEpCi0JCQkJdHhfZmxhZ3NfZXh0cmEgJj0gfk5WX1RYX0xBU1RQQUNLRVQ7Ci0JCQllbHNlCi0JCQkJdHhfZmxhZ3NfZXh0cmEgJj0gfk5WX1RYMl9MQVNUUEFDS0VUOwkJCi0JCX0KKwkJCW9mZnNldCArPSBiY250OworCQkJc2l6ZSAtPSBiY250OworCQl9IHdoaWxlIChzaXplKTsKIAl9CiAKKwkvKiBzZXQgbGFzdCBmcmFnbWVudCBmbGFnICAqLworCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSB8fCBucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMikgeworCQlucC0+dHhfcmluZy5vcmlnW25yXS5GbGFnTGVuIHw9IGNwdV90b19sZTMyKHR4X2ZsYWdzX2V4dHJhKTsKKwl9IGVsc2UgeworCQlucC0+dHhfcmluZy5leFtucl0uRmxhZ0xlbiB8PSBjcHVfdG9fbGUzMih0eF9mbGFnc19leHRyYSk7CisJfQorCisJbnAtPnR4X3NrYnVmZltucl0gPSBza2I7CisKICNpZmRlZiBORVRJRl9GX1RTTwogCWlmIChza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplKQotCQl0eF9mbGFnc19leHRyYSB8PSBOVl9UWDJfVFNPIHwgKHNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemUgPDwgTlZfVFgyX1RTT19TSElGVCk7CisJCXR4X2ZsYWdzX2V4dHJhID0gTlZfVFgyX1RTTyB8IChza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplIDw8IE5WX1RYMl9UU09fU0hJRlQpOwogCWVsc2UKICNlbmRpZgotCXR4X2ZsYWdzX2V4dHJhIHw9IChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVyA/IChOVl9UWDJfQ0hFQ0tTVU1fTDN8TlZfVFgyX0NIRUNLU1VNX0w0KSA6IDApOworCXR4X2ZsYWdzX2V4dHJhID0gKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXID8gKE5WX1RYMl9DSEVDS1NVTV9MM3xOVl9UWDJfQ0hFQ0tTVU1fTDQpIDogMCk7CiAKLQlucC0+dHhfZG1hW25yXSA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLXNrYi0+ZGF0YV9sZW4sCi0JCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOwotCQorCS8qIHNldCB0eCBmbGFncyAqLwogCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSB8fCBucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMikgewotCQlucC0+dHhfcmluZy5vcmlnW25yXS5QYWNrZXRCdWZmZXIgPSBjcHVfdG9fbGUzMihucC0+dHhfZG1hW25yXSk7Ci0JCW5wLT50eF9yaW5nLm9yaWdbbnJdLkZsYWdMZW4gPSBjcHVfdG9fbGUzMiggKHNrYi0+bGVuLXNrYi0+ZGF0YV9sZW4tMSkgfCBucC0+dHhfZmxhZ3MgfCB0eF9mbGFnc19leHRyYSk7CisJCW5wLT50eF9yaW5nLm9yaWdbc3RhcnRfbnJdLkZsYWdMZW4gfD0gY3B1X3RvX2xlMzIodHhfZmxhZ3MgfCB0eF9mbGFnc19leHRyYSk7CiAJfSBlbHNlIHsKLQkJbnAtPnR4X3JpbmcuZXhbbnJdLlBhY2tldEJ1ZmZlckhpZ2ggPSBjcHVfdG9fbGU2NChucC0+dHhfZG1hW25yXSkgPj4gMzI7Ci0JCW5wLT50eF9yaW5nLmV4W25yXS5QYWNrZXRCdWZmZXJMb3cgPSBjcHVfdG9fbGU2NChucC0+dHhfZG1hW25yXSkgJiAweDBGRkZGRkZGRjsKLQkJbnAtPnR4X3JpbmcuZXhbbnJdLkZsYWdMZW4gPSBjcHVfdG9fbGUzMiggKHNrYi0+bGVuLXNrYi0+ZGF0YV9sZW4tMSkgfCBucC0+dHhfZmxhZ3MgfCB0eF9mbGFnc19leHRyYSk7CisJCW5wLT50eF9yaW5nLmV4W3N0YXJ0X25yXS5GbGFnTGVuIHw9IGNwdV90b19sZTMyKHR4X2ZsYWdzIHwgdHhfZmxhZ3NfZXh0cmEpOwogCX0JCiAKLQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl9zdGFydF94bWl0OiBwYWNrZXQgcGFja2V0ICVkIHF1ZXVlZCBmb3IgdHJhbnNtaXNzaW9uLiB0eF9mbGFnc19leHRyYTogJXhcbiIsCi0JCQkJZGV2LT5uYW1lLCBucC0+bmV4dF90eCwgdHhfZmxhZ3NfZXh0cmEpOworCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X3N0YXJ0X3htaXQ6IHBhY2tldCAlZCAoZW50cmllcyAlZCkgcXVldWVkIGZvciB0cmFuc21pc3Npb24uIHR4X2ZsYWdzX2V4dHJhOiAleFxuIiwKKwkJZGV2LT5uYW1lLCBucC0+bmV4dF90eCwgZW50cmllcywgdHhfZmxhZ3NfZXh0cmEpOwogCXsKIAkJaW50IGo7CiAJCWZvciAoaj0wOyBqPDY0OyBqKyspIHsKQEAgLTEwOTMsNyArMTEzMCw3IEBACiAJCWRwcmludGsoIlxuIik7CiAJfQogCi0JbnAtPm5leHRfdHggKz0gMSArIGZyYWdtZW50czsKKwlucC0+bmV4dF90eCArPSBlbnRyaWVzOwogCiAJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CkBAIC0xMTQwLDcgKzExNzcsNiBAQAogCQkJCQlucC0+c3RhdHMudHhfcGFja2V0cysrOwogCQkJCQlucC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJCQkJfQotCQkJCW52X3JlbGVhc2VfdHhza2IoZGV2LCBpKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWlmIChGbGFncyAmIE5WX1RYMl9MQVNUUEFDS0VUKSB7CkBAIC0xMTU2LDkgKzExOTIsOSBAQAogCQkJCQlucC0+c3RhdHMudHhfcGFja2V0cysrOwogCQkJCQlucC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJCQkJfQkJCQkKLQkJCQludl9yZWxlYXNlX3R4c2tiKGRldiwgaSk7CiAJCQl9CiAJCX0KKwkJbnZfcmVsZWFzZV90eHNrYihkZXYsIGkpOwogCQlucC0+bmljX3R4Kys7CiAJfQogCWlmIChucC0+bmV4dF90eCAtIG5wLT5uaWNfdHggPCBUWF9MSU1JVF9TVEFSVCkKQEAgLTI0NTYsNyArMjQ5Miw3IEBACiAJCW5wLT50eHJ4Y3RsX2JpdHMgfD0gTlZSRUdfVFhSWENUTF9SWENIRUNLOwogCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfQ1NVTSB8IE5FVElGX0ZfU0c7CiAjaWZkZWYgTkVUSUZfRl9UU08KLQkJLyogZGlzYWJsZWQgZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsgKi8KKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsKICNlbmRpZgogIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuYyBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuYwppbmRleCAxNDZmOTUxLi4wYzE4ZGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9naWFuZmFyLmMKKysrIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5jCkBAIC04NCw2ICs4NCw3IEBACiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtMzk4LDEyICszOTksMTUgQEAKIAkJcHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfR0lHQUJJVCA/CiAJCVNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCA6IDA7CiAJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKKwljaGFyIHBoeV9pZFtCVVNfSURfU0laRV07CiAKIAlwcml2LT5vbGRsaW5rID0gMDsKIAlwcml2LT5vbGRzcGVlZCA9IDA7CiAJcHJpdi0+b2xkZHVwbGV4ID0gLTE7CiAKLQlwaHlkZXYgPSBwaHlfY29ubmVjdChkZXYsIHByaXYtPmVpbmZvLT5idXNfaWQsICZhZGp1c3RfbGluaywgMCk7CisJc25wcmludGYocGh5X2lkLCBCVVNfSURfU0laRSwgUEhZX0lEX0ZNVCwgcHJpdi0+ZWluZm8tPmJ1c19pZCwgcHJpdi0+ZWluZm8tPnBoeV9pZCk7CisKKwlwaHlkZXYgPSBwaHlfY29ubmVjdChkZXYsIHBoeV9pZCwgJmFkanVzdF9saW5rLCAwKTsKIAogCWlmIChJU19FUlIocGh5ZGV2KSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgYXR0YWNoIHRvIFBIWVxuIiwgZGV2LT5uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuaCBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuaAppbmRleCA5NGE5MWRhLi5jYjlkNjZhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZ2lhbmZhci5oCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuaApAQCAtNzE4LDE0ICs3MTgsMTQgQEAKIAl1aW50MzJfdCBtc2dfZW5hYmxlOwogfTsKIAotZXh0ZXJuIGlubGluZSB1MzIgZ2Zhcl9yZWFkKHZvbGF0aWxlIHVuc2lnbmVkICphZGRyKQorc3RhdGljIGlubGluZSB1MzIgZ2Zhcl9yZWFkKHZvbGF0aWxlIHVuc2lnbmVkICphZGRyKQogewogCXUzMiB2YWw7CiAJdmFsID0gaW5fYmUzMihhZGRyKTsKIAlyZXR1cm4gdmFsOwogfQogCi1leHRlcm4gaW5saW5lIHZvaWQgZ2Zhcl93cml0ZSh2b2xhdGlsZSB1bnNpZ25lZCAqYWRkciwgdTMyIHZhbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZmFyX3dyaXRlKHZvbGF0aWxlIHVuc2lnbmVkICphZGRyLCB1MzIgdmFsKQogewogCW91dF9iZTMyKGFkZHIsIHZhbCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyX21paS5jIGIvZHJpdmVycy9uZXQvZ2lhbmZhcl9taWkuYwppbmRleCAwNGE0NjJjLi43NGU1MmZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9naWFuZmFyX21paS5jCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXJfbWlpLmMKQEAgLTEyOCw2ICsxMjgsNyBAQAogCXN0cnVjdCBnaWFuZmFyX21kaW9fZGF0YSAqcGRhdGE7CiAJc3RydWN0IGdmYXJfbWlpICpyZWdzOwogCXN0cnVjdCBtaWlfYnVzICpuZXdfYnVzOworCXN0cnVjdCByZXNvdXJjZSAqcjsKIAlpbnQgZXJyID0gMDsKIAogCWlmIChOVUxMID09IGRldikKQEAgLTE1MSw4ICsxNTIsMTAgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisKIAkvKiBTZXQgdGhlIFBIWSBiYXNlIGFkZHJlc3MgKi8KLQlyZWdzID0gKHN0cnVjdCBnZmFyX21paSAqKSBpb3JlbWFwKHBkYXRhLT5wYWRkciwgCisJcmVncyA9IChzdHJ1Y3QgZ2Zhcl9taWkgKikgaW9yZW1hcChyLT5zdGFydCwKIAkJCXNpemVvZiAoc3RydWN0IGdmYXJfbWlpKSk7CiAKIAlpZiAoTlVMTCA9PSByZWdzKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyX3N5c2ZzLmMgYi9kcml2ZXJzL25ldC9naWFuZmFyX3N5c2ZzLmMKaW5kZXggMTBkMzRjYi4uNTFlZjE4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZ2lhbmZhcl9zeXNmcy5jCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXJfc3lzZnMuYwpAQCAtNyw3ICs3LDcgQEAKICAqIEJhc2VkIG9uIDgyNjBfaW8vZmNjX2VuZXQuYwogICoKICAqIEF1dGhvcjogQW5keSBGbGVtaW5nCi0gKiBNYWludGFpbmVyOiBLdW1hciBHYWxhIChrdW1hci5nYWxhQGZyZWVzY2FsZS5jb20pCisgKiBNYWludGFpbmVyOiBLdW1hciBHYWxhIChnYWxha0BrZXJuZWwuY3Jhc2hpbmcub3JnKQogICoKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vNnBhY2suYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvLzZwYWNrLmMKaW5kZXggOTA5OTk4Ni4uMTAyYzFmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vNnBhY2suYworKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby82cGFjay5jCkBAIC00NTYsMTEgKzQ1Niw2IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgc2l4cGFja19yZWNlaXZlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlyZXR1cm4gNjU1MzY7ICAvKiBXZSBjYW4gaGFuZGxlIGFuIGluZmluaXRlIGFtb3VudCBvZiBkYXRhLiA6LSkgKi8KLX0KLQogLyoKICAqIEhhbmRsZSB0aGUgJ3JlY2VpdmVyIGRhdGEgcmVhZHknIGludGVycnVwdC4KICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSAndHR5X2lvJyBtb2R1bGUgaW4gdGhlIGtlcm5lbCB3aGVuCkBAIC02NzEsNiArNjY2LDcgQEAKIAogCS8qIERvbmUuICBXZSBoYXZlIGxpbmtlZCB0aGUgVFRZIGxpbmUgdG8gYSBjaGFubmVsLiAqLwogCXR0eS0+ZGlzY19kYXRhID0gc3A7CisJdHR5LT5yZWNlaXZlX3Jvb20gPSA2NTUzNjsKIAogCS8qIE5vdyB3ZSdyZSByZWFkeSB0byByZWdpc3Rlci4gKi8KIAlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpCkBAIC04MDIsNyArNzk4LDYgQEAKIAkuY2xvc2UJCT0gc2l4cGFja19jbG9zZSwKIAkuaW9jdGwJCT0gc2l4cGFja19pb2N0bCwKIAkucmVjZWl2ZV9idWYJPSBzaXhwYWNrX3JlY2VpdmVfYnVmLAotCS5yZWNlaXZlX3Jvb20JPSBzaXhwYWNrX3JlY2VpdmVfcm9vbSwKIAkud3JpdGVfd2FrZXVwCT0gc2l4cGFja193cml0ZV93YWtldXAsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9ta2lzcy5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vbWtpc3MuYwppbmRleCAzZTlhY2NmLi5kYzVlOWQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1yYWRpby9ta2lzcy5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL21raXNzLmMKQEAgLTUxNSw2ICs1MTUsNyBAQAogCQkJY291bnQgPSBraXNzX2VzYyhwLCAodW5zaWduZWQgY2hhciAqKWF4LT54YnVmZiwgbGVuKTsKIAkJfQogICAJfQorCXNwaW5fdW5sb2NrX2JoKCZheC0+YnVmbG9jayk7CiAKIAlzZXRfYml0KFRUWV9ET19XUklURV9XQUtFVVAsICZheC0+dHR5LT5mbGFncyk7CiAJYWN0dWFsID0gYXgtPnR0eS0+ZHJpdmVyLT53cml0ZShheC0+dHR5LCBheC0+eGJ1ZmYsIGNvdW50KTsKQEAgLTc1Miw2ICs3NTMsNyBAQAogCiAJYXgtPnR0eSA9IHR0eTsKIAl0dHktPmRpc2NfZGF0YSA9IGF4OworCXR0eS0+cmVjZWl2ZV9yb29tID0gNjU1MzU7CiAKIAlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKIAkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOwpAQCAtOTM5LDExICs5NDEsNiBAQAogCQl0dHktPmRyaXZlci0+dW50aHJvdHRsZSh0dHkpOwogfQogCi1zdGF0aWMgaW50IG1raXNzX3JlY2VpdmVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXJldHVybiA2NTUzNjsgIC8qIFdlIGNhbiBoYW5kbGUgYW4gaW5maW5pdGUgYW1vdW50IG9mIGRhdGEuIDotKSAqLwotfQotCiAvKgogICogQ2FsbGVkIGJ5IHRoZSBkcml2ZXIgd2hlbiB0aGVyZSdzIHJvb20gZm9yIG1vcmUgZGF0YS4gIElmIHdlIGhhdmUKICAqIG1vcmUgcGFja2V0cyB0byBzZW5kLCB3ZSBzZW5kIHRoZW0gaGVyZS4KQEAgLTk4Miw3ICs5NzksNiBAQAogCS5jbG9zZQkJPSBta2lzc19jbG9zZSwKIAkuaW9jdGwJCT0gbWtpc3NfaW9jdGwsCiAJLnJlY2VpdmVfYnVmCT0gbWtpc3NfcmVjZWl2ZV9idWYsCi0JLnJlY2VpdmVfcm9vbQk9IG1raXNzX3JlY2VpdmVfcm9vbSwKIAkud3JpdGVfd2FrZXVwCT0gbWtpc3Nfd3JpdGVfd2FrZXVwCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ocC1wbHVzLmMgYi9kcml2ZXJzL25ldC9ocC1wbHVzLmMKaW5kZXggMGFiZjVkZC4uNzRlMTY3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHAtcGx1cy5jCisrKyBiL2RyaXZlcnMvbmV0L2hwLXBsdXMuYwpAQCAtMTM4LDEyICsxMzgsNiBAQAogCXJldHVybiAtRU5PREVWOwogfQogCi1zdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQkvKiBOQjogaHBwX2Nsb3NlKCkgaGFuZGxlcyBmcmVlX2lycSAqLwotCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyIC0gTklDX09GRlNFVCwgSFBfSU9fRVhURU5UKTsKLX0KLQogI2lmbmRlZiBNT0RVTEUKIHN0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGhwX3BsdXNfcHJvYmUoaW50IHVuaXQpCiB7CkBAIC00NzMsNiArNDY3LDEyIEBACiAJcmV0dXJuIC1FTlhJTzsKIH0KIAorc3RhdGljIHZvaWQgY2xlYW51cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogTkI6IGhwcF9jbG9zZSgpIGhhbmRsZXMgZnJlZV9pcnEgKi8KKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciAtIE5JQ19PRkZTRVQsIEhQX0lPX0VYVEVOVCk7Cit9CisKIHZvaWQKIGNsZWFudXBfbW9kdWxlKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ocC5jIGIvZHJpdmVycy9uZXQvaHAuYwppbmRleCA1OWNmODQxLi5jZjlmYjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ocC5jCisrKyBiL2RyaXZlcnMvbmV0L2hwLmMKQEAgLTEwMiwxMiArMTAyLDYgQEAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAotc3RhdGljIHZvaWQgY2xlYW51cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7Ci0JcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIgLSBOSUNfT0ZGU0VULCBIUF9JT19FWFRFTlQpOwotfQotCiAjaWZuZGVmIE1PRFVMRQogc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgaHBfcHJvYmUoaW50IHVuaXQpCiB7CkBAIC00NDQsNiArNDM4LDEyIEBACiAJcmV0dXJuIC1FTlhJTzsKIH0KIAorc3RhdGljIHZvaWQgY2xlYW51cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIgLSBOSUNfT0ZGU0VULCBIUF9JT19FWFRFTlQpOworfQorCiB2b2lkCiBjbGVhbnVwX21vZHVsZSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHAxMDAuYyBiL2RyaXZlcnMvbmV0L2hwMTAwLmMKaW5kZXggZTkyYzE3Zi4uNTVjN2VkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHAxMDAuYworKysgYi9kcml2ZXJzL25ldC9ocDEwMC5jCkBAIC0yNzYsNyArMjc2LDcgQEAKICAqIENvbnZlcnQgYW4gYWRkcmVzcyBpbiBhIGtlcm5lbCBidWZmZXIgdG8gYSBidXMvcGh5cy9kbWEgYWRkcmVzcy4KICAqIFRoaXMgd29yayAqb25seSogZm9yIG1lbW9yeSBmcmFnbWVudHMgcGFydCBvZiBscC0+cGFnZV92YWRkciwKICAqIGJlY2F1c2UgaXQgd2FzIHByb3Blcmx5IERNQSBhbGxvY2F0ZWQgdmlhIHBjaV9hbGxvY19jb25zaXN0ZW50KCksCi0gKiBzbyB3ZSBqdXN0IG5lZWQgdG8gInJldHJlaXZlIiB0aGUgb3JpZ2luYWwgbWFwcGluZyB0byBidXMvcGh5cy9kbWEKKyAqIHNvIHdlIGp1c3QgbmVlZCB0byAicmV0cmlldmUiIHRoZSBvcmlnaW5hbCBtYXBwaW5nIHRvIGJ1cy9waHlzL2RtYQogICogYWRkcmVzcyAtIEplYW4gSUkgKi8KIHN0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCB2aXJ0X3RvX3doYXRldmVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiAqIHB0cikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hwbGFuY2UuYyBiL2RyaXZlcnMvbmV0L2hwbGFuY2UuYwppbmRleCAwODcwM2Q2Li5kODQxMDYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ocGxhbmNlLmMKKysrIGIvZHJpdmVycy9uZXQvaHBsYW5jZS5jCkBAIC0xNTAsNyArMTUwLDcgQEAKICAgICAgICAgbHAtPmxhbmNlLm5hbWUgPSAoY2hhciopZC0+bmFtZTsgICAgICAgICAgICAgICAgLyogZGlzY2FyZHMgY29uc3QsIHNodXQgdXAgZ2NjICovCiAgICAgICAgIGxwLT5sYW5jZS5iYXNlID0gdmE7CiAgICAgICAgIGxwLT5sYW5jZS5pbml0X2Jsb2NrID0gKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICopKHZhICsgSFBMQU5DRV9NRU1PRkYpOyAvKiBDUFUgYWRkciAqLwotICAgICAgICBscC0+bGFuY2UubGFuY2VfaW5pdF9ibG9jayA9IDA7ICAgICAgICAgICAgICAgICAvKiBMQU5DRSBhZGRyIG9mIHNhbWUgUkFNICovCisgICAgICAgIGxwLT5sYW5jZS5sYW5jZV9pbml0X2Jsb2NrID0gTlVMTDsgICAgICAgICAgICAgIC8qIExBTkNFIGFkZHIgb2Ygc2FtZSBSQU0gKi8KICAgICAgICAgbHAtPmxhbmNlLmJ1c21hc3Rlcl9yZWd2YWwgPSBMRV9DM19CU1dQOyAgICAgICAgLyogd2UncmUgYmlnZW5kaWFuICovCiAgICAgICAgIGxwLT5sYW5jZS5pcnEgPSBkLT5pcGw7CiAgICAgICAgIGxwLT5sYW5jZS53cml0ZXJhcCA9IGhwbGFuY2Vfd3JpdGVyYXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hYy5oIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWMuaAppbmRleCA2NDRlZGJmLi5jMmRhZTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hYy5oCisrKyBiL2RyaXZlcnMvbmV0L2libV9lbWFjL2libV9lbWFjLmgKQEAgLTExMCw2ICsxMTAsNyBAQAogI2RlZmluZSBFTUFDX01SMV9URlNfMksJCQkweDAwMDgwMDAwCiAjZGVmaW5lIEVNQUNfTVIxX1RSMF9NVUxUCQkweDAwMDA4MDAwCiAjZGVmaW5lIEVNQUNfTVIxX0pQU00JCQkweDAwMDAwMDAwCisjZGVmaW5lIEVNQUNfTVIxX01XU1dfMDAxCQkweDAwMDAwMDAwCiAjZGVmaW5lIEVNQUNfTVIxX0JBU0Uob3BiKQkJKEVNQUNfTVIxX1RGU18ySyB8IEVNQUNfTVIxX1RSMF9NVUxUKQogI2Vsc2UKICNkZWZpbmUgRU1BQ19NUjFfUkZTXzRLCQkJMHgwMDE4MDAwMApAQCAtMTMwLDcgKzEzMSw3IEBACiAJCQkJCSAoZnJlcSkgPD0gODMgID8gRU1BQ19NUjFfT0JDSV84MyA6IFwKIAkJCQkJIChmcmVxKSA8PSAxMDAgPyBFTUFDX01SMV9PQkNJXzEwMCA6IEVNQUNfTVIxX09CQ0lfMTAwUCkKICNkZWZpbmUgRU1BQ19NUjFfQkFTRShvcGIpCQkoRU1BQ19NUjFfVEZTXzJLIHwgRU1BQ19NUjFfVFIgfCBcCi0JCQkJCSBFTUFDX01SMV9NV1NXXzAwMSB8IEVNQUNfTVIxX09CQ0kob3BiKSkKKwkJCQkJIEVNQUNfTVIxX09CQ0kob3BiKSkKICNlbmRpZgogCiAvKiBFTUFDeF9UTVIwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19jb3JlLmMgYi9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19jb3JlLmMKaW5kZXggMWRhOGE2Ni4uNTkxYzU4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L2libV9lbWFjL2libV9lbWFjX2NvcmUuYwpAQCAtNDA4LDcgKzQwOCw3IEBACiAJLyogTW9kZSByZWdpc3RlciAqLwogCXIgPSBFTUFDX01SMV9CQVNFKGVtYWNfb3BiX21oeigpKSB8IEVNQUNfTVIxX1ZMRSB8IEVNQUNfTVIxX0lTVDsKIAlpZiAoZGV2LT5waHkuZHVwbGV4ID09IERVUExFWF9GVUxMKQotCQlyIHw9IEVNQUNfTVIxX0ZERTsKKwkJciB8PSBFTUFDX01SMV9GREUgfCBFTUFDX01SMV9NV1NXXzAwMTsKIAlkZXYtPnN0b3BfdGltZW91dCA9IFNUT1BfVElNRU9VVF8xMDsKIAlzd2l0Y2ggKGRldi0+cGh5LnNwZWVkKSB7CiAJY2FzZSBTUEVFRF8xMDAwOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWZiLmMgYi9kcml2ZXJzL25ldC9pZmIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjY5OTI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaWZiLmMKQEAgLTAsMCArMSwyOTQgQEAKKy8qIGRyaXZlcnMvbmV0L2lmYi5jOiAKKworCVRoZSBwdXJwb3NlIG9mIHRoaXMgZHJpdmVyIGlzIHRvIHByb3ZpZGUgYSBkZXZpY2UgdGhhdCBhbGxvd3MKKwlmb3Igc2hhcmluZyBvZiByZXNvdXJjZXM6CisKKwkxKSBxZGlzY3MvcG9saWNpZXMgdGhhdCBhcmUgcGVyIGRldmljZSBhcyBvcHBvc2VkIHRvIHN5c3RlbSB3aWRlLgorCWlmYiBhbGxvd3MgZm9yIGEgZGV2aWNlIHdoaWNoIGNhbiBiZSByZWRpcmVjdGVkIHRvIHRodXMgcHJvdmlkaW5nCisJYW4gaW1wcmVzc2lvbiBvZiBzaGFyaW5nLgorCisJMikgQWxsb3dzIGZvciBxdWV1ZWluZyBpbmNvbWluZyB0cmFmZmljIGZvciBzaGFwaW5nIGluc3RlYWQgb2YKKwlkcm9wcGluZy4gCisJCisJVGhlIG9yaWdpbmFsIGNvbmNlcHQgaXMgYmFzZWQgb24gd2hhdCBpcyBrbm93biBhcyB0aGUgSU1RCisJZHJpdmVyIGluaXRpYWxseSB3cml0dGVuIGJ5IE1hcnRpbiBEZXZlcmEsIGxhdGVyIHJld3JpdHRlbgorCWJ5IFBhdHJpY2sgTWNIYXJkeSBhbmQgdGhlbiBtYWludGFpbmVkIGJ5IEFuZHJlIENvcnJlYS4KKworCVlvdSBuZWVkIHRoZSB0YyBhY3Rpb24gIG1pcnJvciBvciByZWRpcmVjdCB0byBmZWVkIHRoaXMgZGV2aWNlCisgICAgICAgCXBhY2tldHMuCisKKwlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKwlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKwkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIAorICAJQXV0aG9yczoJSmFtYWwgSGFkaSBTYWxpbSAoMjAwNSkKKyAKKyovCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPiAKKworI2RlZmluZSBUWF9USU1FT1VUICAoMipIWikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIFRYX1FfTElNSVQgICAgMzIKK3N0cnVjdCBpZmJfcHJpdmF0ZSB7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0ICAgaWZiX3Rhc2tsZXQ7CisJaW50ICAgICB0YXNrbGV0X3BlbmRpbmc7CisJLyogbW9zdGx5IGRlYnVnIHN0YXRzIGxlYXZlIGluIGZvciBub3cgKi8KKwl1bnNpZ25lZCBsb25nICAgc3RfdGFza19lbnRlcjsgLyogdGFza2xldCBlbnRlcmVkICovCisJdW5zaWduZWQgbG9uZyAgIHN0X3R4cV9yZWZsX3RyeTsgLyogdHJhbnNtaXQgcXVldWUgcmVmaWxsIGF0dGVtcHQgKi8KKwl1bnNpZ25lZCBsb25nICAgc3RfcnhxX2VudGVyOyAvKiByZWNlaXZlIHF1ZXVlIGVudGVyZWQgKi8KKwl1bnNpZ25lZCBsb25nICAgc3RfcngydHhfdHJhbjsgLyogcmVjZWl2ZSB0byB0cmFzbWl0IHRyYW5zZmVycyAqLworCXVuc2lnbmVkIGxvbmcgICBzdF9yeHFfbm90ZW50ZXI7IC8qcmVjZWl2ZVEgbm90IGVudGVyZWQsIHJlc2NoZWQgKi8KKwl1bnNpZ25lZCBsb25nICAgc3RfcnhfZnJtX2VncjsgLyogcmVjZWl2ZWQgZnJvbSBlZ3Jlc3MgcGF0aCAqLworCXVuc2lnbmVkIGxvbmcgICBzdF9yeF9mcm1faW5nOyAvKiByZWNlaXZlZCBmcm9tIGluZ3Jlc3MgcGF0aCAqLworCXVuc2lnbmVkIGxvbmcgICBzdF9yeHFfY2hlY2s7CisJdW5zaWduZWQgbG9uZyAgIHN0X3J4cV9yc2NoOworCXN0cnVjdCBza19idWZmX2hlYWQgICAgIHJxOworCXN0cnVjdCBza19idWZmX2hlYWQgICAgIHRxOworfTsKKworc3RhdGljIGludCBudW1pZmJzID0gMTsKKworc3RhdGljIHZvaWQgcmlfdGFza2xldCh1bnNpZ25lZCBsb25nIGRldik7CitzdGF0aWMgaW50IGlmYl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppZmJfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpZmJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaWZiX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZCByaV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGV2KSAKK3sKKworCXN0cnVjdCBuZXRfZGV2aWNlICpfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2OworCXN0cnVjdCBpZmJfcHJpdmF0ZSAqZHAgPSBuZXRkZXZfcHJpdihfZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmZHAtPnN0YXRzOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlkcC0+c3RfdGFza19lbnRlcisrOworCWlmICgoc2tiID0gc2tiX3BlZWsoJmRwLT50cSkpID09IE5VTEwpIHsKKwkJZHAtPnN0X3R4cV9yZWZsX3RyeSsrOworCQlpZiAoc3Bpbl90cnlsb2NrKCZfZGV2LT54bWl0X2xvY2spKSB7CisJCQlkcC0+c3RfcnhxX2VudGVyKys7CisJCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZkcC0+cnEpKSAhPSBOVUxMKSB7CisJCQkJc2tiX3F1ZXVlX3RhaWwoJmRwLT50cSwgc2tiKTsKKwkJCQlkcC0+c3RfcngydHhfdHJhbisrOworCQkJfQorCQkJc3Bpbl91bmxvY2soJl9kZXYtPnhtaXRfbG9jayk7CisJCX0gZWxzZSB7CisJCQkvKiByZXNjaGVkdWxlICovCisJCQlkcC0+c3RfcnhxX25vdGVudGVyKys7CisJCQlnb3RvIHJlc2NoZWQ7CisJCX0KKwl9CisKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZkcC0+dHEpKSAhPSBOVUxMKSB7CisJCXUzMiBmcm9tID0gR19UQ19GUk9NKHNrYi0+dGNfdmVyZCk7CisKKwkJc2tiLT50Y192ZXJkID0gMDsKKwkJc2tiLT50Y192ZXJkID0gU0VUX1RDX05DTFMoc2tiLT50Y192ZXJkKTsKKwkJc3RhdHMtPnR4X3BhY2tldHMrKzsKKwkJc3RhdHMtPnR4X2J5dGVzICs9c2tiLT5sZW47CisJCWlmIChmcm9tICYgQVRfRUdSRVNTKSB7CisJCQlkcC0+c3RfcnhfZnJtX2VncisrOworCQkJZGV2X3F1ZXVlX3htaXQoc2tiKTsKKwkJfSBlbHNlIGlmIChmcm9tICYgQVRfSU5HUkVTUykgeworCisJCQlkcC0+c3RfcnhfZnJtX2luZysrOworCQkJbmV0aWZfcngoc2tiKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXN0YXRzLT50eF9kcm9wcGVkKys7CisJCX0KKwl9CisKKwlpZiAoc3Bpbl90cnlsb2NrKCZfZGV2LT54bWl0X2xvY2spKSB7CisJCWRwLT5zdF9yeHFfY2hlY2srKzsKKwkJaWYgKChza2IgPSBza2JfcGVlaygmZHAtPnJxKSkgPT0gTlVMTCkgeworCQkJZHAtPnRhc2tsZXRfcGVuZGluZyA9IDA7CisJCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChfZGV2KSkKKwkJCQluZXRpZl93YWtlX3F1ZXVlKF9kZXYpOworCQl9IGVsc2UgeworCQkJZHAtPnN0X3J4cV9yc2NoKys7CisJCQlzcGluX3VubG9jaygmX2Rldi0+eG1pdF9sb2NrKTsKKwkJCWdvdG8gcmVzY2hlZDsKKwkJfQorCQlzcGluX3VubG9jaygmX2Rldi0+eG1pdF9sb2NrKTsKKwl9IGVsc2UgeworcmVzY2hlZDoKKwkJZHAtPnRhc2tsZXRfcGVuZGluZyA9IDE7CisJCXRhc2tsZXRfc2NoZWR1bGUoJmRwLT5pZmJfdGFza2xldCk7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpZmJfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBJbml0aWFsaXplIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+Z2V0X3N0YXRzID0gaWZiX2dldF9zdGF0czsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGlmYl94bWl0OworCWRldi0+b3BlbiA9ICZpZmJfb3BlbjsKKwlkZXYtPnN0b3AgPSAmaWZiX2Nsb3NlOworCisJLyogRmlsbCBpbiBkZXZpY2Ugc3RydWN0dXJlIHdpdGggZXRoZXJuZXQtZ2VuZXJpYyB2YWx1ZXMuICovCisJZXRoZXJfc2V0dXAoZGV2KTsKKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IFRYX1FfTElNSVQ7CisJZGV2LT5jaGFuZ2VfbXR1ID0gTlVMTDsKKwlkZXYtPmZsYWdzIHw9IElGRl9OT0FSUDsKKwlkZXYtPmZsYWdzICY9IH5JRkZfTVVMVElDQVNUOworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlyYW5kb21fZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKTsKK30KKworc3RhdGljIGludCBpZmJfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpZmJfcHJpdmF0ZSAqZHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZkcC0+c3RhdHM7CisJaW50IHJldCA9IDA7CisJdTMyIGZyb20gPSBHX1RDX0ZST00oc2tiLT50Y192ZXJkKTsKKworCXN0YXRzLT50eF9wYWNrZXRzKys7CisJc3RhdHMtPnR4X2J5dGVzKz1za2ItPmxlbjsKKworCWlmICghZnJvbSB8fCAhc2tiLT5pbnB1dF9kZXYpIHsKK2Ryb3BwZWQ6CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJc3RhdHMtPnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQkvKiAKKwkJICogbm90ZSB3ZSBjb3VsZCBiZSBnb2luZworCQkgKiBpbmdyZXNzIC0+IGVncmVzcyBvcgorCQkgKiBlZ3Jlc3MgLT4gaW5ncmVzcworCQkqLworCQlza2ItPmRldiA9IHNrYi0+aW5wdXRfZGV2OworCQlza2ItPmlucHV0X2RldiA9IGRldjsKKwkJaWYgKGZyb20gJiBBVF9JTkdSRVNTKSB7CisJCQlza2JfcHVsbChza2IsIHNrYi0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4pOworCQl9IGVsc2UgeworCQkJaWYgKCEoZnJvbSAmIEFUX0VHUkVTUykpIHsKKwkJCQlnb3RvIGRyb3BwZWQ7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoc2tiX3F1ZXVlX2xlbigmZHAtPnJxKSA+PSBkZXYtPnR4X3F1ZXVlX2xlbikgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJfQorCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJc2tiX3F1ZXVlX3RhaWwoJmRwLT5ycSwgc2tiKTsKKwlpZiAoIWRwLT50YXNrbGV0X3BlbmRpbmcpIHsKKwkJZHAtPnRhc2tsZXRfcGVuZGluZyA9IDE7CisJCXRhc2tsZXRfc2NoZWR1bGUoJmRwLT5pZmJfdGFza2xldCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppZmJfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlmYl9wcml2YXRlICpkcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmRwLT5zdGF0czsKKworCXByX2RlYnVnKCJ0YXNrbGV0cyBzdGF0cyAlbGQ6JWxkOiVsZDolbGQ6JWxkOiVsZDolbGQ6JWxkOiVsZCBcbiIsCisJCWRwLT5zdF90YXNrX2VudGVyLCBkcC0+c3RfdHhxX3JlZmxfdHJ5LCBkcC0+c3RfcnhxX2VudGVyLCAKKwkJZHAtPnN0X3J4MnR4X3RyYW4gZHAtPnN0X3J4cV9ub3RlbnRlciwgZHAtPnN0X3J4X2ZybV9lZ3IsCisJCWRwLT5zdF9yeF9mcm1faW5nLCBkcC0+c3RfcnhxX2NoZWNrLCBkcC0+c3RfcnhxX3JzY2ggKTsKKworCXJldHVybiBzdGF0czsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICoqaWZiczsKKworLyogTnVtYmVyIG9mIGlmYiBkZXZpY2VzIHRvIGJlIHNldCB1cCBieSB0aGlzIG1vZHVsZS4gKi8KK21vZHVsZV9wYXJhbShudW1pZmJzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhudW1pZmJzLCAiTnVtYmVyIG9mIGlmYiBkZXZpY2VzIik7CisKK3N0YXRpYyBpbnQgaWZiX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlmYl9wcml2YXRlICpkcCA9IG5ldGRldl9wcml2KGRldik7CisKKwl0YXNrbGV0X2tpbGwoJmRwLT5pZmJfdGFza2xldCk7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXNrYl9xdWV1ZV9wdXJnZSgmZHAtPnJxKTsKKwlza2JfcXVldWVfcHVyZ2UoJmRwLT50cSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWZiX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWZiX3ByaXZhdGUgKmRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXRhc2tsZXRfaW5pdCgmZHAtPmlmYl90YXNrbGV0LCByaV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylkZXYpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmRwLT5ycSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmZHAtPnRxKTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGlmYl9pbml0X29uZShpbnQgaW5kZXgpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldl9pZmI7CisJaW50IGVycjsKKworCWRldl9pZmIgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBpZmJfcHJpdmF0ZSksCisJCQkJICJpZmIlZCIsIGlmYl9zZXR1cCk7CisKKwlpZiAoIWRldl9pZmIpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKChlcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2X2lmYikpKSB7CisJCWZyZWVfbmV0ZGV2KGRldl9pZmIpOworCQlkZXZfaWZiID0gTlVMTDsKKwl9IGVsc2UgeworCQlpZmJzW2luZGV4XSA9IGRldl9pZmI7IAorCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGlmYl9mcmVlX29uZShpbnQgaW5kZXgpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYoaWZic1tpbmRleF0pOworCWZyZWVfbmV0ZGV2KGlmYnNbaW5kZXhdKTsKK30gCisKK3N0YXRpYyBpbnQgX19pbml0IGlmYl9pbml0X21vZHVsZSh2b2lkKQoreyAKKwlpbnQgaSwgZXJyID0gMDsKKwlpZmJzID0ga21hbGxvYyhudW1pZmJzICogc2l6ZW9mKHZvaWQgKiksIEdGUF9LRVJORUwpOyAKKwlpZiAoIWlmYnMpCisJCXJldHVybiAtRU5PTUVNOyAKKwlmb3IgKGkgPSAwOyBpIDwgbnVtaWZicyAmJiAhZXJyOyBpKyspCisJCWVyciA9IGlmYl9pbml0X29uZShpKTsgCisJaWYgKGVycikgeyAKKwkJd2hpbGUgKC0taSA+PSAwKQorCQkJaWZiX2ZyZWVfb25lKGkpOworCX0KKworCXJldHVybiBlcnI7Cit9IAorCitzdGF0aWMgdm9pZCBfX2V4aXQgaWZiX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtaWZiczsgaSsrKSAKKwkJaWZiX2ZyZWVfb25lKGkpOyAKKwlrZnJlZShpZmJzKTsJCit9CisKK21vZHVsZV9pbml0KGlmYl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChpZmJfY2xlYW51cF9tb2R1bGUpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSmFtYWwgSGFkaSBTYWxpbSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9LY29uZmlnIGIvZHJpdmVycy9uZXQvaXJkYS9LY29uZmlnCmluZGV4IGQ1NDE1NmYuLjdhMDgxMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9pcmRhL0tjb25maWcKQEAgLTEsNCArMSwzIEBACi0KIG1lbnUgIkluZnJhcmVkLXBvcnQgZGV2aWNlIGRyaXZlcnMiCiAJZGVwZW5kcyBvbiBJUkRBIT1uCiAKQEAgLTE1Niw3ICsxNTUsNyBAQAogCiBjb25maWcgRE9OR0xFX09MRAogCWJvb2wgIk9sZCBTZXJpYWwgZG9uZ2xlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAoSVJUVFlfT0xEIHx8IElSUE9SVF9TSVIpICYmIEJST0tFTl9PTl9TTVAKKwlkZXBlbmRzIG9uIElSUE9SVF9TSVIgJiYgQlJPS0VOX09OX1NNUAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYW4gaW5mcmFyZWQgZGV2aWNlIHRoYXQgY29ubmVjdHMgdG8geW91cgogCSAgY29tcHV0ZXIncyBzZXJpYWwgcG9ydC4gVGhlc2UgZGV2aWNlcyBhcmUgY2FsbGVkIGRvbmdsZXMuIFRoZW4gc2F5IFkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9pcmRhL01ha2VmaWxlCmluZGV4IGU3YThiN2YuLjcyY2JmZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9NYWtlZmlsZQpAQCAtNDUsNCArNDUsNCBAQAogb2JqLSQoQ09ORklHX01BNjAwX0RPTkdMRSkJKz0gbWE2MDAtc2lyLm8KIAogIyBUaGUgU0lSIGhlbHBlciBtb2R1bGUKLXNpci1kZXYtb2JqcyA6PSBzaXJfY29yZS5vIHNpcl9kZXYubyBzaXJfZG9uZ2xlLm8gc2lyX2t0aHJlYWQubworc2lyLWRldi1vYmpzIDo9IHNpcl9kZXYubyBzaXJfZG9uZ2xlLm8gc2lyX2t0aHJlYWQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9pcnBvcnQuYyBiL2RyaXZlcnMvbmV0L2lyZGEvaXJwb3J0LmMKaW5kZXggM2QwMTZhNC4uNjA3MDE5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9pcnBvcnQuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2lycG9ydC5jCkBAIC0yODUsMTkgKzI4NSw2IEBACiB9CiAKIC8qCi0gKiBGdW5jdGlvbiBpcnBvcnRfcHJvYmUgKHZvaWQpCi0gKgotICogICAgU3RhcnQgSU8gcG9ydCAKLSAqCi0gKi8KLWludCBpcnBvcnRfcHJvYmUoaW50IGlvYmFzZSkKLXsKLQlJUkRBX0RFQlVHKDQsICIlcygpLCBpb2Jhc2U9JSN4XG4iLCBfX0ZVTkNUSU9OX18sIGlvYmFzZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKICAqIEZ1bmN0aW9uIGlycG9ydF9nZXRfZmNyIChzcGVlZCkKICAqCiAgKiAgICBDb21wdXRlIHZhbHVlIG9mIGZjcgpAQCAtMzgyLDcgKzM2OSw3IEBACiAgKiAgICB3ZSBjYW5ub3QgdXNlIHNjaGVkdWxlX3RpbWVvdXQoKSB3aGVuIHdlIGFyZSBpbiBpbnRlcnJ1cHQgY29udGV4dAogICoKICAqLwotaW50IF9faXJwb3J0X2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQorc3RhdGljIGludCBfX2lycG9ydF9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKIHsKIAlzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmOwogCV9fdTMyIHNwZWVkID0gKF9fdTMyKSB0YXNrLT5wYXJhbTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvaXJ0dHktc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2lydHR5LXNpci5jCmluZGV4IGI4ZDExMjMuLjEwMTc1MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvaXJ0dHktc2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9pcnR0eS1zaXIuYwpAQCAtMjg5LDIyICsyODksNiBAQAogfQogCiAvKgotICogRnVuY3Rpb24gaXJ0dHlfcmVjZWl2ZV9yb29tICh0dHkpCi0gKgotICogICAgVXNlZCBieSB0aGUgVFRZIHRvIGZpbmQgb3V0IGhvdyBtdWNoIGRhdGEgd2UgY2FuIHJlY2VpdmUgYXQgYSB0aW1lCi0gKiAKLSovCi1zdGF0aWMgaW50IGlydHR5X3JlY2VpdmVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KSAKLXsKLQlzdHJ1Y3Qgc2lydHR5X2NiICpwcml2ID0gdHR5LT5kaXNjX2RhdGE7Ci0KLQlJUkRBX0FTU0VSVChwcml2ICE9IE5VTEwsIHJldHVybiAwOyk7Ci0JSVJEQV9BU1NFUlQocHJpdi0+bWFnaWMgPT0gSVJUVFlfTUFHSUMsIHJldHVybiAwOyk7Ci0KLQlyZXR1cm4gNjU1MzY7ICAvKiBXZSBjYW4gaGFuZGxlIGFuIGluZmluaXRlIGFtb3VudCBvZiBkYXRhLiA6LSkgKi8KLX0KLQotLyoKICAqIEZ1bmN0aW9uIGlydHR5X3dyaXRlX3dha2V1cCAodHR5KQogICoKICAqICAgIENhbGxlZCBieSB0aGUgZHJpdmVyIHdoZW4gdGhlcmUncyByb29tIGZvciBtb3JlIGRhdGEuICBJZiB3ZSBoYXZlCkBAIC01MzQsNiArNTE4LDcgQEAKIAogCWRldi0+cHJpdiA9IHByaXY7CiAJdHR5LT5kaXNjX2RhdGEgPSBwcml2OworCXR0eS0+cmVjZWl2ZV9yb29tID0gNjU1MzY7CiAKIAl1cCgmaXJ0dHlfc2VtKTsKIApAQCAtNjA1LDcgKzU5MCw2IEBACiAJLmlvY3RsCQk9IGlydHR5X2lvY3RsLAogIAkucG9sbAkJPSBOVUxMLAogCS5yZWNlaXZlX2J1Zgk9IGlydHR5X3JlY2VpdmVfYnVmLAotCS5yZWNlaXZlX3Jvb20JPSBpcnR0eV9yZWNlaXZlX3Jvb20sCiAJLndyaXRlX3dha2V1cAk9IGlydHR5X3dyaXRlX3dha2V1cCwKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zaXItZGV2LmggYi9kcml2ZXJzL25ldC9pcmRhL3Npci1kZXYuaAppbmRleCBmMGI4YmMzLi5mNjlmYjRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3Npci1kZXYuaAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3Npci1kZXYuaApAQCAtMTMzLDggKzEzMyw2IEBACiAKIGV4dGVybiB2b2lkIHNpcmRldl9lbmFibGVfcngoc3RydWN0IHNpcl9kZXYgKmRldik7CiBleHRlcm4gaW50IHNpcmRldl9zY2hlZHVsZV9yZXF1ZXN0KHN0cnVjdCBzaXJfZGV2ICpkZXYsIGludCBzdGF0ZSwgdW5zaWduZWQgcGFyYW0pOwotZXh0ZXJuIGludCBfX2luaXQgaXJkYV90aHJlYWRfY3JlYXRlKHZvaWQpOwotZXh0ZXJuIHZvaWQgX19leGl0IGlyZGFfdGhyZWFkX2pvaW4odm9pZCk7CiAKIC8qIGlubGluZSBoZWxwZXJzICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2NvcmUuYyBiL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2NvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5ZjkxMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3Npcl9jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICoJc2lyX2NvcmUuYzoJbW9kdWxlIGNvcmUgZm9yIGlyZGEtc2lyIGFic3RyYWN0aW9uIGxheWVyCi0gKgotICoJQ29weXJpZ2h0IChjKSAyMDAyIE1hcnRpbiBEaWVobAotICogCi0gKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAotICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gKglwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKLSAqCXRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+Ci0KLSNpbmNsdWRlICJzaXItZGV2LmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLU1PRFVMRV9BVVRIT1IoIk1hcnRpbiBEaWVobCA8aW5mb0BtZGllaGwuZGU+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIklyREEgU0lSIGNvcmUiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotRVhQT1JUX1NZTUJPTChpcmRhX3JlZ2lzdGVyX2RvbmdsZSk7Ci1FWFBPUlRfU1lNQk9MKGlyZGFfdW5yZWdpc3Rlcl9kb25nbGUpOwotCi1FWFBPUlRfU1lNQk9MKHNpcmRldl9nZXRfaW5zdGFuY2UpOwotRVhQT1JUX1NZTUJPTChzaXJkZXZfcHV0X2luc3RhbmNlKTsKLQotRVhQT1JUX1NZTUJPTChzaXJkZXZfc2V0X2RvbmdsZSk7Ci1FWFBPUlRfU1lNQk9MKHNpcmRldl93cml0ZV9jb21wbGV0ZSk7Ci1FWFBPUlRfU1lNQk9MKHNpcmRldl9yZWNlaXZlKTsKLQotRVhQT1JUX1NZTUJPTChzaXJkZXZfcmF3X3dyaXRlKTsKLUVYUE9SVF9TWU1CT0woc2lyZGV2X3Jhd19yZWFkKTsKLUVYUE9SVF9TWU1CT0woc2lyZGV2X3NldF9kdHJfcnRzKTsKLQotc3RhdGljIGludCBfX2luaXQgc2lyX2NvcmVfaW5pdCh2b2lkKQotewotCXJldHVybiBpcmRhX3RocmVhZF9jcmVhdGUoKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHNpcl9jb3JlX2V4aXQodm9pZCkKLXsKLQlpcmRhX3RocmVhZF9qb2luKCk7Ci19Ci0KLW1vZHVsZV9pbml0KHNpcl9jb3JlX2luaXQpOwotbW9kdWxlX2V4aXQoc2lyX2NvcmVfZXhpdCk7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2Rldi5jIGIvZHJpdmVycy9uZXQvaXJkYS9zaXJfZGV2LmMKaW5kZXggZGYyMmI4Yi4uZWE3Yzk0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zaXJfZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zaXJfZGV2LmMKQEAgLTYwLDYgKzYwLDcgQEAKIAl1cCgmZGV2LT5mc20uc2VtKTsKIAlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTChzaXJkZXZfc2V0X2RvbmdsZSk7CiAKIC8qIHVzZWQgYnkgZG9uZ2xlIGRyaXZlcnMgZm9yIGRvbmdsZSBwcm9ncmFtbWluZyAqLwogCkBAIC05NCw2ICs5NSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT50eF9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0woc2lyZGV2X3Jhd193cml0ZSk7CiAKIC8qIHNlZW1zIHNvbWUgZG9uZ2xlIGRyaXZlcnMgbWF5IG5lZWQgdGhpcyAqLwogCkBAIC0xMTYsNiArMTE4LDcgQEAKIAogCXJldHVybiBjb3VudDsKIH0KK0VYUE9SVF9TWU1CT0woc2lyZGV2X3Jhd19yZWFkKTsKIAogaW50IHNpcmRldl9zZXRfZHRyX3J0cyhzdHJ1Y3Qgc2lyX2RldiAqZGV2LCBpbnQgZHRyLCBpbnQgcnRzKQogewpAQCAtMTI0LDcgKzEyNyw4IEBACiAJCXJldCA9ICBkZXYtPmRydi0+c2V0X2R0cl9ydHMoZGV2LCBkdHIsIHJ0cyk7CiAJcmV0dXJuIHJldDsKIH0KLQkKK0VYUE9SVF9TWU1CT0woc2lyZGV2X3NldF9kdHJfcnRzKTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIGNhbGxlZCBmcm9tIGNsaWVudCBkcml2ZXIgLSBsaWtlbHkgd2l0aCBiaC1jb250ZXh0IC0gdG8gaW5kaWNhdGUKQEAgLTIyNyw2ICsyMzEsNyBAQAogZG9uZToKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnR4X2xvY2ssIGZsYWdzKTsKIH0KK0VYUE9SVF9TWU1CT0woc2lyZGV2X3dyaXRlX2NvbXBsZXRlKTsKIAogLyogY2FsbGVkIGZyb20gY2xpZW50IGRyaXZlciAtIGxpa2VseSB3aXRoIGJoLWNvbnRleHQgLSB0byBnaXZlIHVzCiAgKiBzb21lIG1vcmUgcmVjZWl2ZWQgYnl0ZXMuIFdlIHB1dCB0aGVtIGludG8gdGhlIHJ4LWJ1ZmZlciwKQEAgLTI3OSw2ICsyODQsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHNpcmRldl9yZWNlaXZlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTY0MSw2ICs2NDcsNyBAQAogb3V0OgogCXJldHVybiBOVUxMOwogfQorRVhQT1JUX1NZTUJPTChzaXJkZXZfZ2V0X2luc3RhbmNlKTsKIAogaW50IHNpcmRldl9wdXRfaW5zdGFuY2Uoc3RydWN0IHNpcl9kZXYgKmRldikKIHsKQEAgLTY3Myw0ICs2ODAsNSBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHNpcmRldl9wdXRfaW5zdGFuY2UpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Npcl9kb25nbGUuYyBiL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2RvbmdsZS5jCmluZGV4IGM1Yjc2NzQuLjhkMjI1OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2RvbmdsZS5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2RvbmdsZS5jCkBAIC01MCw2ICs1MCw3IEBACiAJdXAoJmRvbmdsZV9saXN0X2xvY2spOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChpcmRhX3JlZ2lzdGVyX2RvbmdsZSk7CiAKIGludCBpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKHN0cnVjdCBkb25nbGVfZHJpdmVyICpkcnYpCiB7CkBAIC01OCw2ICs1OSw3IEBACiAJdXAoJmRvbmdsZV9saXN0X2xvY2spOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKTsKIAogaW50IHNpcmRldl9nZXRfZG9uZ2xlKHN0cnVjdCBzaXJfZGV2ICpkZXYsIElSREFfRE9OR0xFIHR5cGUpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Npcl9rdGhyZWFkLmMgYi9kcml2ZXJzL25ldC9pcmRhL3Npcl9rdGhyZWFkLmMKaW5kZXggYzY1MDU0My4uZTM5MDRkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zaXJfa3RocmVhZC5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2t0aHJlYWQuYwpAQCAtNDY2LDcgKzQ2Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBfX2luaXQgaXJkYV90aHJlYWRfY3JlYXRlKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpcmRhX3RocmVhZF9jcmVhdGUodm9pZCkKIHsKIAlzdHJ1Y3QgY29tcGxldGlvbiBzdGFydHVwOwogCWludCBwaWQ7CkBAIC00ODgsNyArNDg4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBfX2V4aXQgaXJkYV90aHJlYWRfam9pbih2b2lkKSAKK3N0YXRpYyB2b2lkIF9fZXhpdCBpcmRhX3RocmVhZF9qb2luKHZvaWQpCiB7CiAJaWYgKGlyZGFfcnFfcXVldWUudGhyZWFkKSB7CiAJCWZsdXNoX2lyZGFfcXVldWUoKTsKQEAgLTQ5OSwzICs0OTksMTAgQEAKIAl9CiB9CiAKK21vZHVsZV9pbml0KGlyZGFfdGhyZWFkX2NyZWF0ZSk7Cittb2R1bGVfZXhpdChpcmRhX3RocmVhZF9qb2luKTsKKworTU9EVUxFX0FVVEhPUigiTWFydGluIERpZWhsIDxpbmZvQG1kaWVobC5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSXJEQSBTSVIgY29yZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuaCBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5oCmluZGV4IDc0MWFlY2MuLmE4MmE0YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5oCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5oCkBAIC01NzcsOCArNTc3LDggQEAKIAkJc3RydWN0IHsKIAkJCXU4CQlhZGRyX3Jlc1szXTsKIAkJCXZvbGF0aWxlIHU4CXN0YXR1czsJCS8qIGRlc2NyaXB0b3Igc3RhdHVzICovCi0JCX0gcmRfcyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQl9IHJkX3UgX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworCQl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHJkX3M7CisJfSBfX2F0dHJpYnV0ZSgocGFja2VkKSkgcmRfdTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiAjZGVmaW5lIHJkX2FkZHIJCXJkX3UuYWRkcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMgYi9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguYwppbmRleCA3N2VhZGY4Li5mMGYwNGJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguYworKysgYi9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguYwpAQCAtNTkwLDkgKzU5MCw5IEBACiB7CiAJc3RydWN0IHZldGhfbHBldmVudCAqdmV0aF9ldmVudCA9IChzdHJ1Y3QgdmV0aF9scGV2ZW50ICopZXZlbnQ7CiAKLQlpZiAoZXZlbnQtPnhGbGFncy54RnVuY3Rpb24gPT0gSHZMcEV2ZW50X0Z1bmN0aW9uX0FjaykKKwlpZiAoaHZscGV2ZW50X2lzX2FjayhldmVudCkpCiAJCXZldGhfaGFuZGxlX2Fjayh2ZXRoX2V2ZW50KTsKLQllbHNlIGlmIChldmVudC0+eEZsYWdzLnhGdW5jdGlvbiA9PSBIdkxwRXZlbnRfRnVuY3Rpb25fSW50KQorCWVsc2UKIAkJdmV0aF9oYW5kbGVfaW50KHZldGhfZXZlbnQpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9sYW5jZS5jIGIvZHJpdmVycy9uZXQvbGFuY2UuYwppbmRleCAxZDc1Y2EwLi5kMWQ3MTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9sYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L2xhbmNlLmMKQEAgLTMwOSwxNyArMzA5LDYgQEAKIAogDAogCi1zdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7Ci0JaWYgKGRldi0+ZG1hICE9IDQpCi0JCWZyZWVfZG1hKGRldi0+ZG1hKTsKLQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTEFOQ0VfVE9UQUxfU0laRSk7Ci0Ja2ZyZWUobHAtPnR4X2JvdW5jZV9idWZmcyk7Ci0Ja2ZyZWUoKHZvaWQqKWxwLT5yeF9idWZmcyk7Ci0Ja2ZyZWUobHApOwotfQotCiAjaWZkZWYgTU9EVUxFCiAjZGVmaW5lIE1BWF9DQVJEUwkJOAkvKiBNYXggbnVtYmVyIG9mIGludGVyZmFjZXMgKGNhcmRzKSBwZXIgbW9kdWxlICovCiAKQEAgLTM2Nyw2ICszNTYsMTcgQEAKIAlyZXR1cm4gLUVOWElPOwogfQogCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJaWYgKGRldi0+ZG1hICE9IDQpCisJCWZyZWVfZG1hKGRldi0+ZG1hKTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTEFOQ0VfVE9UQUxfU0laRSk7CisJa2ZyZWUobHAtPnR4X2JvdW5jZV9idWZmcyk7CisJa2ZyZWUoKHZvaWQqKWxwLT5yeF9idWZmcyk7CisJa2ZyZWUobHApOworfQorCiB2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCiB7CiAJaW50IHRoaXNfZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbG5lMzkwLmMgYi9kcml2ZXJzL25ldC9sbmUzOTAuYwppbmRleCAzMDlkMjU0Li42NDZlODlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9sbmUzOTAuYworKysgYi9kcml2ZXJzL25ldC9sbmUzOTAuYwpAQCAtMTQ1LDEzICsxNDUsNiBAQAogCXJldHVybiAtRU5PREVWOwogfQogCi1zdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKLQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTE5FMzkwX0lPX0VYVEVOVCk7Ci0JaW91bm1hcChlaV9zdGF0dXMubWVtKTsKLX0KLQogI2lmbmRlZiBNT0RVTEUKIHN0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGxuZTM5MF9wcm9iZShpbnQgdW5pdCkKIHsKQEAgLTQ0MCw2ICs0MzMsMTMgQEAKIAlyZXR1cm4gLUVOWElPOwogfQogCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTE5FMzkwX0lPX0VYVEVOVCk7CisJaW91bm1hcChlaV9zdGF0dXMubWVtKTsKK30KKwogdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQogewogCWludCB0aGlzX2RldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hYzgzOTAuYyBiL2RyaXZlcnMvbmV0L21hYzgzOTAuYwppbmRleCBkOGM5OWYwLi4wNmNiNDYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWM4MzkwLmMKKysrIGIvZHJpdmVycy9uZXQvbWFjODM5MC5jCkBAIC01NTksNTUgKzU1OSw1MiBAQAogLyogZGlyZWN0bHkgZnJvbSBkYXluYXBvcnQuYyBieSBBbGFuIENveCAqLwogc3RhdGljIHZvaWQgZGF5bmFfbWVtY3B5X2Zyb21jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnRvLCBpbnQgZnJvbSwgaW50IGNvdW50KQogewotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICpwdHI7Ci0JdW5zaWduZWQgc2hvcnQgKnRhcmdldD10bzsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpwdHI7CisJdW5zaWduZWQgY2hhciAqdGFyZ2V0PXRvOwogCWZyb208PD0xOwkvKiB3b3JkLCBza2lwIG92ZXJoZWFkICovCi0JcHRyPSh1bnNpZ25lZCBzaG9ydCAqKShkZXYtPm1lbV9zdGFydCtmcm9tKTsKKwlwdHI9KHVuc2lnbmVkIGNoYXIgKikoZGV2LT5tZW1fc3RhcnQrZnJvbSk7CiAJLyogTGVhZGluZyBieXRlPyAqLwogCWlmIChmcm9tJjIpIHsKLQkJKigoY2hhciAqKXRhcmdldCkrKyA9ICooKChjaGFyICopcHRyKyspLTEpOworCQkqdGFyZ2V0KysgPSBwdHJbLTFdOworCQlwdHIgKz0gMjsKIAkJY291bnQtLTsKIAl9CiAJd2hpbGUoY291bnQ+PTIpCiAJewotCQkqdGFyZ2V0Kys9KnB0cisrOwkvKiBDb3B5IGFuZCAqLwotCQlwdHIrKzsJCQkvKiBza2lwIGNydWZ0ICovCisJCSoodW5zaWduZWQgc2hvcnQgKil0YXJnZXQgPSAqKHVuc2lnbmVkIHNob3J0IHZvbGF0aWxlICopcHRyOworCQlwdHIgKz0gNDsJCQkvKiBza2lwIGNydWZ0ICovCisJCXRhcmdldCArPSAyOwogCQljb3VudC09MjsKIAl9CiAJLyogVHJhaWxpbmcgYnl0ZT8gKi8KIAlpZihjb3VudCkKLQl7Ci0JCS8qIEJpZyBlbmRpYW4gKi8KLQkJdW5zaWduZWQgc2hvcnQgdj0qcHRyOwotCQkqKChjaGFyICopdGFyZ2V0KT12Pj44OwotCX0KKwkJKnRhcmdldCA9ICpwdHI7CiB9CiAKIHN0YXRpYyB2b2lkIGRheW5hX21lbWNweV90b2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHRvLCBjb25zdCB2b2lkICpmcm9tLCBpbnQgY291bnQpCiB7CiAJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKnB0cjsKLQljb25zdCB1bnNpZ25lZCBzaG9ydCAqc3JjPWZyb207CisJY29uc3QgdW5zaWduZWQgY2hhciAqc3JjPWZyb207CiAJdG88PD0xOwkvKiB3b3JkLCBza2lwIG92ZXJoZWFkICovCiAJcHRyPSh1bnNpZ25lZCBzaG9ydCAqKShkZXYtPm1lbV9zdGFydCt0byk7CiAJLyogTGVhZGluZyBieXRlPyAqLwogCWlmICh0byYyKSB7IC8qIGF2b2lkIGEgYnl0ZSB3cml0ZSAoc3RvbXBzIG9uIG90aGVyIGRhdGEpICovCi0JCXB0clstMV0gPSAocHRyWy0xXSYweEZGMDApfCooKHVuc2lnbmVkIGNoYXIgKilzcmMpKys7CisJCXB0clstMV0gPSAocHRyWy0xXSYweEZGMDApfCpzcmMrKzsKIAkJcHRyKys7CiAJCWNvdW50LS07CiAJfQogCXdoaWxlKGNvdW50Pj0yKQogCXsKLQkJKnB0cisrPSpzcmMrKzsJCS8qIENvcHkgYW5kICovCisJCSpwdHIrKz0qKHVuc2lnbmVkIHNob3J0ICopc3JjOwkJLyogQ29weSBhbmQgKi8KIAkJcHRyKys7CQkJLyogc2tpcCBjcnVmdCAqLworCQlzcmMgKz0gMjsKIAkJY291bnQtPTI7CiAJfQogCS8qIFRyYWlsaW5nIGJ5dGU/ICovCiAJaWYoY291bnQpCiAJewotCQkvKiBCaWcgZW5kaWFuICovCi0JCXVuc2lnbmVkIHNob3J0IHY9KnNyYzsKIAkJLyogY2FyZCBkb2Vzbid0IGxpa2UgYnl0ZSB3cml0ZXMgKi8KLQkJKnB0cj0oKnB0ciYweDAwRkYpfCh2JjB4RkYwMCk7CisJCSpwdHI9KCpwdHImMHgwMEZGKXwoKnNyYyA8PCA4KTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMgYi9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jCmluZGV4IDNjYjliM2YuLjQwYWUzNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvbXY2NDN4eF9ldGguYwpAQCAtNiw3ICs2LDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwMiByYWJlZWhAZ2FsaWxlby5jby5pbAogICoKICAqIENvcHlyaWdodCAoQykgMjAwMyBQTUMtU2llcnJhLCBJbmMuLAotICoJd3JpdHRlbiBieSBNYW5pc2ggTGFjaHdhbmkgKGxhY2h3YW5pQHBtYy1zaWVycmEuY29tKQorICoJd3JpdHRlbiBieSBNYW5pc2ggTGFjaHdhbmkKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmFsZiBCYWVjaGxlIDxyYWxmQGxpbnV4LW1pcHMub3JnPgogICoKQEAgLTM1LDYgKzM1LDggQEAKICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxsaW51eC91ZHAuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC01NSwxMyArNTcsMTUgQEAKIC8qIENvbnN0YW50cyAqLwogI2RlZmluZSBWTEFOX0hMRU4JCTQKICNkZWZpbmUgRkNTX0xFTgkJCTQKLSNkZWZpbmUgV1JBUAkJCU5FVF9JUF9BTElHTiArIEVUSF9ITEVOICsgVkxBTl9ITEVOICsgRkNTX0xFTgorI2RlZmluZSBETUFfQUxJR04JCTgJLyogaHcgcmVxdWlyZXMgOC1ieXRlIGFsaWdubWVudCAqLworI2RlZmluZSBIV19JUF9BTElHTgkJMgkvKiBodyBhbGlnbnMgSVAgaGVhZGVyICovCisjZGVmaW5lIFdSQVAJCQlIV19JUF9BTElHTiArIEVUSF9ITEVOICsgVkxBTl9ITEVOICsgRkNTX0xFTgogI2RlZmluZSBSWF9TS0JfU0laRQkJKChkZXYtPm10dSArIFdSQVAgKyA3KSAmIH4weDcpCiAKLSNkZWZpbmUgSU5UX0NBVVNFX1VOTUFTS19BTEwJCTB4MDAwN2ZmZmYKLSNkZWZpbmUgSU5UX0NBVVNFX1VOTUFTS19BTExfRVhUCTB4MDAxMWZmZmYKLSNkZWZpbmUgSU5UX0NBVVNFX01BU0tfQUxMCQkweDAwMDAwMDAwCi0jZGVmaW5lIElOVF9DQVVTRV9NQVNLX0FMTF9FWFQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgSU5UX1VOTUFTS19BTEwJCQkweDAwMDdmZmZmCisjZGVmaW5lIElOVF9VTk1BU0tfQUxMX0VYVAkJMHgwMDExZmZmZgorI2RlZmluZSBJTlRfTUFTS19BTEwJCQkweDAwMDAwMDAwCisjZGVmaW5lIElOVF9NQVNLX0FMTF9FWFQJCTB4MDAwMDAwMDAKICNkZWZpbmUgSU5UX0NBVVNFX0NIRUNLX0JJVFMJCUlOVF9DQVVTRV9VTk1BU0tfQUxMCiAjZGVmaW5lIElOVF9DQVVTRV9DSEVDS19CSVRTX0VYVAlJTlRfQ0FVU0VfVU5NQVNLX0FMTF9FWFQKIApAQCAtNzgsOCArODIsOSBAQAogc3RhdGljIGludCBldGhfcG9ydF9saW5rX2lzX3VwKHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0pOwogc3RhdGljIHZvaWQgZXRoX3BvcnRfdWNfYWRkcl9nZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJCXVuc2lnbmVkIGNoYXIgKk1hY0FkZHIpOwotc3RhdGljIGludCBtdjY0M3h4X2V0aF9yZWFsX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKik7Ci1zdGF0aWMgaW50IG12NjQzeHhfZXRoX3JlYWxfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyB2b2lkIGV0aF9wb3J0X3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgbXY2NDN4eF9ldGhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgbXY2NDN4eF9ldGhfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIHN0YXRpYyBpbnQgbXY2NDN4eF9ldGhfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQpOwogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICptdjY0M3h4X2V0aF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKik7CiBzdGF0aWMgdm9pZCBldGhfcG9ydF9pbml0X21hY190YWJsZXModW5zaWduZWQgaW50IGV0aF9wb3J0X251bSk7CkBAIC0xMjQsMTUgKzEyOSw4IEBACiAgKi8KIHN0YXRpYyBpbnQgbXY2NDN4eF9ldGhfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKIHsKLQlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtcC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKChuZXdfbXR1ID4gOTUwMCkgfHwgKG5ld19tdHUgPCA2NCkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPmxvY2ssIGZsYWdzKTsKKwlpZiAoKG5ld19tdHUgPiA5NTAwKSB8fCAobmV3X210dSA8IDY0KSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCiAJZGV2LT5tdHUgPSBuZXdfbXR1OwogCS8qCkBAIC0xNDIsMTcgKzE0MCwxMyBAQAogCSAqIHRvIG1lbW9yeSBpcyBmdWxsLCB3aGljaCBtaWdodCBmYWlsIHRoZSBvcGVuIGZ1bmN0aW9uLgogCSAqLwogCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKLQkJaWYgKG12NjQzeHhfZXRoX3JlYWxfc3RvcChkZXYpKQotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJIiVzOiBGYXRhbCBlcnJvciBvbiBzdG9wcGluZyBkZXZpY2VcbiIsCi0JCQkJZGV2LT5uYW1lKTsKLQkJaWYgKG12NjQzeHhfZXRoX3JlYWxfb3BlbihkZXYpKQorCQltdjY0M3h4X2V0aF9zdG9wKGRldik7CisJCWlmIChtdjY0M3h4X2V0aF9vcGVuKGRldikpCiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCQkiJXM6IEZhdGFsIGVycm9yIG9uIG9wZW5pbmcgZGV2aWNlXG4iLAogCQkJCWRldi0+bmFtZSk7CiAJfQogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTcwLDE1ICsxNjQsMTkgQEAKIAlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHBrdF9pbmZvIHBrdF9pbmZvOwogCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHVuYWxpZ25lZDsKIAogCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZtcC0+cnhfdGFza19idXN5KSkKIAkJcGFuaWMoIiVzOiBFcnJvciBpbiB0ZXN0X3NldF9iaXQgLyBjbGVhcl9iaXQiLCBkZXYtPm5hbWUpOwogCiAJd2hpbGUgKG1wLT5yeF9yaW5nX3NrYnMgPCAobXAtPnJ4X3Jpbmdfc2l6ZSAtIDUpKSB7Ci0JCXNrYiA9IGRldl9hbGxvY19za2IoUlhfU0tCX1NJWkUpOworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKFJYX1NLQl9TSVpFICsgRE1BX0FMSUdOKTsKIAkJaWYgKCFza2IpCiAJCQlicmVhazsKIAkJbXAtPnJ4X3Jpbmdfc2ticysrOworCQl1bmFsaWduZWQgPSAodTMyKXNrYi0+ZGF0YSAmIChETUFfQUxJR04gLSAxKTsKKwkJaWYgKHVuYWxpZ25lZCkKKwkJCXNrYl9yZXNlcnZlKHNrYiwgRE1BX0FMSUdOIC0gdW5hbGlnbmVkKTsKIAkJcGt0X2luZm8uY21kX3N0cyA9IEVUSF9SWF9FTkFCTEVfSU5URVJSVVBUOwogCQlwa3RfaW5mby5ieXRlX2NudCA9IFJYX1NLQl9TSVpFOwogCQlwa3RfaW5mby5idWZfcHRyID0gZG1hX21hcF9zaW5nbGUoTlVMTCwgc2tiLT5kYXRhLCBSWF9TS0JfU0laRSwKQEAgLTE4OSw3ICsxODcsNyBAQAogCQkJCSIlczogRXJyb3IgYWxsb2NhdGluZyBSWCBSaW5nXG4iLCBkZXYtPm5hbWUpOwogCQkJYnJlYWs7CiAJCX0KLQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkJc2tiX3Jlc2VydmUoc2tiLCBIV19JUF9BTElHTik7CiAJfQogCWNsZWFyX2JpdCgwLCAmbXAtPnJ4X3Rhc2tfYnVzeSk7CiAJLyoKQEAgLTIwNyw3ICsyMDUsNyBAQAogCWVsc2UgewogCQkvKiBSZXR1cm4gaW50ZXJydXB0cyAqLwogCQltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfTUFTS19SRUcobXAtPnBvcnRfbnVtKSwKLQkJCQkJCQlJTlRfQ0FVU0VfVU5NQVNLX0FMTCk7CisJCQkJCQkJSU5UX1VOTUFTS19BTEwpOwogCX0KICNlbmRpZgogfQpAQCAtMjY3LDYgKzI2NSw4IEBACiAJCW1wLT5wb3J0X2NvbmZpZyAmPSB+KHUzMikgTVY2NDNYWF9FVEhfVU5JQ0FTVF9QUk9NSVNDVU9VU19NT0RFOwogCiAJbXZfd3JpdGUoTVY2NDNYWF9FVEhfUE9SVF9DT05GSUdfUkVHKG1wLT5wb3J0X251bSksIG1wLT5wb3J0X2NvbmZpZyk7CisKKwlldGhfcG9ydF9zZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsKIH0KIAogLyoKQEAgLTM0Miw4ICszNDIsNiBAQAogCWlmICghKGV0aF9pbnRfY2F1c2VfZXh0ICYgKEJJVDAgfCBCSVQ4KSkpCiAJCXJldHVybiByZWxlYXNlZDsKIAotCXNwaW5fbG9jaygmbXAtPmxvY2spOwotCiAJLyogQ2hlY2sgb25seSBxdWV1ZSAwICovCiAJd2hpbGUgKGV0aF90eF9yZXR1cm5fZGVzYyhtcCwgJnBrdF9pbmZvKSA9PSBFVEhfT0spIHsKIAkJaWYgKHBrdF9pbmZvLmNtZF9zdHMgJiBCSVQwKSB7CkBAIC0zNTEsMzEgKzM0OSwyMSBAQAogCQkJc3RhdHMtPnR4X2Vycm9ycysrOwogCQl9CiAKLQkJLyoKLQkJICogSWYgcmV0dXJuX2luZm8gaXMgZGlmZmVyZW50IHRoYW4gMCwgcmVsZWFzZSB0aGUgc2tiLgotCQkgKiBUaGUgY2FzZSB3aGVyZSByZXR1cm5faW5mbyBpcyBub3QgMCBpcyBvbmx5IGluIGNhc2UKLQkJICogd2hlbiB0cmFuc21pdHRlZCBhIHNjYXR0ZXIvZ2F0aGVyIHBhY2tldCwgd2hlcmUgb25seQotCQkgKiBsYXN0IHNrYiByZWxlYXNlcyB0aGUgd2hvbGUgY2hhaW4uCi0JCSAqLwotCQlpZiAocGt0X2luZm8ucmV0dXJuX2luZm8pIHsKLQkJCWlmIChza2Jfc2hpbmZvKHBrdF9pbmZvLnJldHVybl9pbmZvKS0+bnJfZnJhZ3MpCi0JCQkJZG1hX3VubWFwX3BhZ2UoTlVMTCwgcGt0X2luZm8uYnVmX3B0ciwKLQkJCQkJCXBrdF9pbmZvLmJ5dGVfY250LAotCQkJCQkJRE1BX1RPX0RFVklDRSk7Ci0JCQllbHNlCi0JCQkJZG1hX3VubWFwX3NpbmdsZShOVUxMLCBwa3RfaW5mby5idWZfcHRyLAotCQkJCQkJcGt0X2luZm8uYnl0ZV9jbnQsCi0JCQkJCQlETUFfVE9fREVWSUNFKTsKKwkJaWYgKHBrdF9pbmZvLmNtZF9zdHMgJiBFVEhfVFhfRklSU1RfREVTQykKKwkJCWRtYV91bm1hcF9zaW5nbGUoTlVMTCwgcGt0X2luZm8uYnVmX3B0ciwKKwkJCQkJcGt0X2luZm8uYnl0ZV9jbnQsCisJCQkJCURNQV9UT19ERVZJQ0UpOworCQllbHNlCisJCQlkbWFfdW5tYXBfcGFnZShOVUxMLCBwa3RfaW5mby5idWZfcHRyLAorCQkJCQlwa3RfaW5mby5ieXRlX2NudCwKKwkJCQkJRE1BX1RPX0RFVklDRSk7CiAKKwkJaWYgKHBrdF9pbmZvLnJldHVybl9pbmZvKSB7CiAJCQlkZXZfa2ZyZWVfc2tiX2lycShwa3RfaW5mby5yZXR1cm5faW5mbyk7CiAJCQlyZWxlYXNlZCA9IDA7Ci0JCX0gZWxzZQotCQkJZG1hX3VubWFwX3BhZ2UoTlVMTCwgcGt0X2luZm8uYnVmX3B0ciwKLQkJCQkJcGt0X2luZm8uYnl0ZV9jbnQsIERNQV9UT19ERVZJQ0UpOworCQl9CiAJfQogCi0Jc3Bpbl91bmxvY2soJm1wLT5sb2NrKTsKLQogCXJldHVybiByZWxlYXNlZDsKIH0KIApAQCAtNDgyLDEyICs0NzAsMTIgQEAKIAogCS8qIFJlYWQgaW50ZXJydXB0IGNhdXNlIHJlZ2lzdGVycyAqLwogCWV0aF9pbnRfY2F1c2UgPSBtdl9yZWFkKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9DQVVTRV9SRUcocG9ydF9udW0pKSAmCi0JCQkJCQlJTlRfQ0FVU0VfVU5NQVNLX0FMTDsKKwkJCQkJCUlOVF9VTk1BU0tfQUxMOwogCiAJaWYgKGV0aF9pbnRfY2F1c2UgJiBCSVQxKQogCQlldGhfaW50X2NhdXNlX2V4dCA9IG12X3JlYWQoCiAJCQlNVjY0M1hYX0VUSF9JTlRFUlJVUFRfQ0FVU0VfRVhURU5EX1JFRyhwb3J0X251bSkpICYKLQkJCQkJCUlOVF9DQVVTRV9VTk1BU0tfQUxMX0VYVDsKKwkJCQkJCUlOVF9VTk1BU0tfQUxMX0VYVDsKIAogI2lmZGVmIE1WNjQzWFhfTkFQSQogCWlmICghKGV0aF9pbnRfY2F1c2UgJiAweDAwMDdmZmZkKSkgewpAQCAtNTEyLDkgKzUwMCwxMCBAQAogCX0gZWxzZSB7CiAJCWlmIChuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKGRldikpIHsKIAkJCS8qIE1hc2sgYWxsIHRoZSBpbnRlcnJ1cHRzICovCi0JCQltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfTUFTS19SRUcocG9ydF9udW0pLCAwKTsKLQkJCW12X3dyaXRlKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9FWFRFTkRfTUFTS19SRUcKLQkJCQkJCQkJKHBvcnRfbnVtKSwgMCk7CisJCQltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfTUFTS19SRUcocG9ydF9udW0pLAorCQkJCQkJCQlJTlRfTUFTS19BTEwpOworCQkJLyogd2FpdCBmb3IgcHJldmlvdXMgd3JpdGUgdG8gY29tcGxldGUgKi8KKwkJCW12X3JlYWQoTVY2NDNYWF9FVEhfSU5URVJSVVBUX01BU0tfUkVHKHBvcnRfbnVtKSk7CiAJCQlfX25ldGlmX3J4X3NjaGVkdWxlKGRldik7CiAJCX0KICNlbHNlCkBAIC01MjcsOSArNTE2LDEyIEBACiAJCSAqIHdpdGggc2tiJ3MuCiAJCSAqLwogI2lmZGVmIE1WNjQzWFhfUlhfUVVFVUVfRklMTF9PTl9UQVNLCi0JCS8qIFVubWFzayBhbGwgaW50ZXJydXB0cyBvbiBldGhlcm5ldCBwb3J0ICovCisJCS8qIE1hc2sgYWxsIGludGVycnVwdHMgb24gZXRoZXJuZXQgcG9ydCAqLwogCQltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfTUFTS19SRUcocG9ydF9udW0pLAotCQkJCQkJCUlOVF9DQVVTRV9NQVNLX0FMTCk7CisJCQkJCQkJSU5UX01BU0tfQUxMKTsKKwkJLyogd2FpdCBmb3IgcHJldmlvdXMgd3JpdGUgdG8gdGFrZSBlZmZlY3QgKi8KKwkJbXZfcmVhZChNVjY0M1hYX0VUSF9JTlRFUlJVUFRfTUFTS19SRUcocG9ydF9udW0pKTsKKwogCQlxdWV1ZV90YXNrKCZtcC0+cnhfdGFzaywgJnRxX2ltbWVkaWF0ZSk7CiAJCW1hcmtfYmgoSU1NRURJQVRFX0JIKTsKICNlbHNlCkBAIC02MzYsNTYgKzYyOCw2IEBACiB9CiAKIC8qCi0gKiBtdjY0M3h4X2V0aF9vcGVuCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBvcGVubmluZyB0aGUgbmV0d29yayBkZXZpY2UuIFRoZSBmdW5jdGlvbgotICogc2hvdWxkIGluaXRpYWxpemUgYWxsIHRoZSBoYXJkd2FyZSwgaW5pdGlhbGl6ZSBjeWNsaWMgUngvVHgKLSAqIGRlc2NyaXB0b3JzIGNoYWluIGFuZCBidWZmZXJzIGFuZCBhbGxvY2F0ZSBhbiBJUlEgdG8gdGhlIG5ldHdvcmsKLSAqIGRldmljZS4KLSAqCi0gKiBJbnB1dCA6CWEgcG9pbnRlciB0byB0aGUgbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCi0gKgotICogT3V0cHV0IDoJemVybyBvZiBzdWNjZXNzICwgbm9uemVybyBpZiBmYWlscy4KLSAqLwotCi1zdGF0aWMgaW50IG12NjQzeHhfZXRoX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7Ci0JdW5zaWduZWQgaW50IHBvcnRfbnVtID0gbXAtPnBvcnRfbnVtOwotCWludCBlcnI7Ci0KLQlzcGluX2xvY2tfaXJxKCZtcC0+bG9jayk7Ci0KLQllcnIgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgbXY2NDN4eF9ldGhfaW50X2hhbmRsZXIsCi0JCQlTQV9TSElSUSB8IFNBX1NBTVBMRV9SQU5ET00sIGRldi0+bmFtZSwgZGV2KTsKLQotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDYW4gbm90IGFzc2lnbiBJUlEgbnVtYmVyIHRvIE1WNjQzWFhfZXRoJWRcbiIsCi0JCQkJCQkJCXBvcnRfbnVtKTsKLQkJZXJyID0gLUVBR0FJTjsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKG12NjQzeHhfZXRoX3JlYWxfb3BlbihkZXYpKSB7Ci0JCXByaW50aygiJXM6IEVycm9yIG9wZW5pbmcgaW50ZXJmYWNlXG4iLCBkZXYtPm5hbWUpOwotCQllcnIgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxKCZtcC0+bG9jayk7Ci0KLQlyZXR1cm4gMDsKLQotb3V0X2ZyZWU6Ci0JZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7Ci0KLW91dDoKLQlzcGluX3VubG9ja19pcnEoJm1wLT5sb2NrKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLS8qCiAgKiBldGhlcl9pbml0X3J4X2Rlc2NfcmluZyAtIEN1cnZlIGEgUnggY2hhaW4gZGVzYyBsaXN0IGFuZCBidWZmZXIgaW4gbWVtb3J5LgogICoKICAqIERFU0NSSVBUSU9OOgpAQCAtNzc3LDI4ICs3MTksMzcgQEAKIAltcC0+cG9ydF90eF9xdWV1ZV9jb21tYW5kIHw9IDE7CiB9CiAKLS8qIEhlbHBlciBmdW5jdGlvbiBmb3IgbXY2NDN4eF9ldGhfb3BlbiAqLwotc3RhdGljIGludCBtdjY0M3h4X2V0aF9yZWFsX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKy8qCisgKiBtdjY0M3h4X2V0aF9vcGVuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBvcGVubmluZyB0aGUgbmV0d29yayBkZXZpY2UuIFRoZSBmdW5jdGlvbgorICogc2hvdWxkIGluaXRpYWxpemUgYWxsIHRoZSBoYXJkd2FyZSwgaW5pdGlhbGl6ZSBjeWNsaWMgUngvVHgKKyAqIGRlc2NyaXB0b3JzIGNoYWluIGFuZCBidWZmZXJzIGFuZCBhbGxvY2F0ZSBhbiBJUlEgdG8gdGhlIG5ldHdvcmsKKyAqIGRldmljZS4KKyAqCisgKiBJbnB1dCA6CWEgcG9pbnRlciB0byB0aGUgbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogT3V0cHV0IDoJemVybyBvZiBzdWNjZXNzICwgbm9uemVybyBpZiBmYWlscy4KKyAqLworCitzdGF0aWMgaW50IG12NjQzeHhfZXRoX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgaW50IHBvcnRfbnVtID0gbXAtPnBvcnRfbnVtOwogCXVuc2lnbmVkIGludCBzaXplOworCWludCBlcnI7CisKKwllcnIgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgbXY2NDN4eF9ldGhfaW50X2hhbmRsZXIsCisJCQlTQV9TSElSUSB8IFNBX1NBTVBMRV9SQU5ET00sIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2FuIG5vdCBhc3NpZ24gSVJRIG51bWJlciB0byBNVjY0M1hYX2V0aCVkXG4iLAorCQkJCQkJCQlwb3J0X251bSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KIAogCS8qIFN0b3AgUlggUXVldWVzICovCiAJbXZfd3JpdGUoTVY2NDNYWF9FVEhfUkVDRUlWRV9RVUVVRV9DT01NQU5EX1JFRyhwb3J0X251bSksIDB4MDAwMGZmMDApOwogCi0JLyogQ2xlYXIgdGhlIGV0aGVybmV0IHBvcnQgaW50ZXJydXB0cyAqLwotCW12X3dyaXRlKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9DQVVTRV9SRUcocG9ydF9udW0pLCAwKTsKLQltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfQ0FVU0VfRVhURU5EX1JFRyhwb3J0X251bSksIDApOwotCi0JLyogVW5tYXNrIFJYIGJ1ZmZlciBhbmQgVFggZW5kIGludGVycnVwdCAqLwotCW12X3dyaXRlKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9NQVNLX1JFRyhwb3J0X251bSksCi0JCQkJCQlJTlRfQ0FVU0VfVU5NQVNLX0FMTCk7Ci0KLQkvKiBVbm1hc2sgcGh5IGFuZCBsaW5rIHN0YXR1cyBjaGFuZ2VzIGludGVycnVwdHMgKi8KLQltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfRVhURU5EX01BU0tfUkVHKHBvcnRfbnVtKSwKLQkJCQkJCUlOVF9DQVVTRV9VTk1BU0tfQUxMX0VYVCk7Ci0KIAkvKiBTZXQgdGhlIE1BQyBBZGRyZXNzICovCiAJbWVtY3B5KG1wLT5wb3J0X21hY19hZGRyLCBkZXYtPmRldl9hZGRyLCA2KTsKIApAQCAtODE4LDE0ICs3NjksMTUgQEAKIAkJCQkJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFtcC0+cnhfc2tiKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCBhbGxvY2F0ZSBSeCBza2IgcmluZ1xuIiwgZGV2LT5uYW1lKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfaXJxOwogCX0KIAltcC0+dHhfc2tiID0ga21hbGxvYyhzaXplb2YoKm1wLT50eF9za2IpICogbXAtPnR4X3Jpbmdfc2l6ZSwKIAkJCQkJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFtcC0+dHhfc2tiKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCBhbGxvY2F0ZSBUeCBza2IgcmluZ1xuIiwgZGV2LT5uYW1lKTsKLQkJa2ZyZWUobXAtPnJ4X3NrYik7Ci0JCXJldHVybiAtRU5PTUVNOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX3J4X3NrYjsKIAl9CiAKIAkvKiBBbGxvY2F0ZSBUWCByaW5nICovCkBAIC04NDUsOSArNzk3LDggQEAKIAlpZiAoIW1wLT5wX3R4X2Rlc2NfYXJlYSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3QgYWxsb2NhdGUgVHggUmluZyAoc2l6ZSAlZCBieXRlcylcbiIsCiAJCQkJCQkJZGV2LT5uYW1lLCBzaXplKTsKLQkJa2ZyZWUobXAtPnJ4X3NrYik7Ci0JCWtmcmVlKG1wLT50eF9za2IpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV90eF9za2I7CiAJfQogCUJVR19PTigodTMyKSBtcC0+cF90eF9kZXNjX2FyZWEgJiAweGYpOwkvKiBjaGVjayAxNi1ieXRlIGFsaWdubWVudCAqLwogCW1lbXNldCgodm9pZCAqKW1wLT5wX3R4X2Rlc2NfYXJlYSwgMCwgbXAtPnR4X2Rlc2NfYXJlYV9zaXplKTsKQEAgLTg3NCwxMyArODI1LDEyIEBACiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IEZyZWVpbmcgcHJldmlvdXNseSBhbGxvY2F0ZWQgVFggcXVldWVzLi4uIiwKIAkJCQkJCQlkZXYtPm5hbWUpOwogCQlpZiAobXAtPnJ4X3NyYW1fc2l6ZSkKLQkJCWlvdW5tYXAobXAtPnBfcnhfZGVzY19hcmVhKTsKKwkJCWlvdW5tYXAobXAtPnBfdHhfZGVzY19hcmVhKTsKIAkJZWxzZQogCQkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgbXAtPnR4X2Rlc2NfYXJlYV9zaXplLAogCQkJCQltcC0+cF90eF9kZXNjX2FyZWEsIG1wLT50eF9kZXNjX2RtYSk7Ci0JCWtmcmVlKG1wLT5yeF9za2IpOwotCQlrZnJlZShtcC0+dHhfc2tiKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfdHhfc2tiOwogCX0KIAltZW1zZXQoKHZvaWQgKiltcC0+cF9yeF9kZXNjX2FyZWEsIDAsIHNpemUpOwogCkBAIC05MDAsOSArODUwLDI2IEBACiAJbXAtPnR4X2ludF9jb2FsID0KIAkJZXRoX3BvcnRfc2V0X3R4X2NvYWwocG9ydF9udW0sIDEzMzAwMDAwMCwgTVY2NDNYWF9UWF9DT0FMKTsKIAotCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJLyogQ2xlYXIgYW55IHBlbmRpbmcgZXRoZXJuZXQgcG9ydCBpbnRlcnJ1cHRzICovCisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfSU5URVJSVVBUX0NBVVNFX1JFRyhwb3J0X251bSksIDApOworCW12X3dyaXRlKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9DQVVTRV9FWFRFTkRfUkVHKHBvcnRfbnVtKSwgMCk7CiAKKwkvKiBVbm1hc2sgcGh5IGFuZCBsaW5rIHN0YXR1cyBjaGFuZ2VzIGludGVycnVwdHMgKi8KKwltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfRVhURU5EX01BU0tfUkVHKHBvcnRfbnVtKSwKKwkJCQkJCUlOVF9VTk1BU0tfQUxMX0VYVCk7CisKKwkvKiBVbm1hc2sgUlggYnVmZmVyIGFuZCBUWCBlbmQgaW50ZXJydXB0ICovCisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfSU5URVJSVVBUX01BU0tfUkVHKHBvcnRfbnVtKSwgSU5UX1VOTUFTS19BTEwpOwogCXJldHVybiAwOworCitvdXRfZnJlZV90eF9za2I6CisJa2ZyZWUobXAtPnR4X3NrYik7CitvdXRfZnJlZV9yeF9za2I6CisJa2ZyZWUobXAtPnJ4X3NrYik7CitvdXRfZnJlZV9pcnE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBtdjY0M3h4X2V0aF9mcmVlX3R4X3JpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC05MTAsMTQgKzg3NywxNyBAQAogCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBpbnQgcG9ydF9udW0gPSBtcC0+cG9ydF9udW07CiAJdW5zaWduZWQgaW50IGN1cnI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCS8qIFN0b3AgVHggUXVldWVzICovCiAJbXZfd3JpdGUoTVY2NDNYWF9FVEhfVFJBTlNNSVRfUVVFVUVfQ09NTUFORF9SRUcocG9ydF9udW0pLCAweDAwMDBmZjAwKTsKIAogCS8qIEZyZWUgb3V0c3RhbmRpbmcgc2tiJ3Mgb24gVFggcmluZ3MgKi8KIAlmb3IgKGN1cnIgPSAwOyBtcC0+dHhfcmluZ19za2JzICYmIGN1cnIgPCBtcC0+dHhfcmluZ19zaXplOyBjdXJyKyspIHsKLQkJaWYgKG1wLT50eF9za2JbY3Vycl0pIHsKLQkJCWRldl9rZnJlZV9za2IobXAtPnR4X3NrYltjdXJyXSk7CisJCXNrYiA9IG1wLT50eF9za2JbY3Vycl07CisJCWlmIChza2IpIHsKKwkJCW1wLT50eF9yaW5nX3NrYnMgLT0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJCW1wLT50eF9yaW5nX3NrYnMtLTsKIAkJfQogCX0KQEAgLTk3Myw0NCArOTQzLDMyIEBACiAgKiBPdXRwdXQgOgl6ZXJvIGlmIHN1Y2Nlc3MgLCBub256ZXJvIGlmIGZhaWxzCiAgKi8KIAotLyogSGVscGVyIGZ1bmN0aW9uIGZvciBtdjY0M3h4X2V0aF9zdG9wICovCi0KLXN0YXRpYyBpbnQgbXY2NDN4eF9ldGhfcmVhbF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IG12NjQzeHhfZXRoX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgaW50IHBvcnRfbnVtID0gbXAtPnBvcnRfbnVtOwogCisJLyogTWFzayBhbGwgaW50ZXJydXB0cyBvbiBldGhlcm5ldCBwb3J0ICovCisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfSU5URVJSVVBUX01BU0tfUkVHKHBvcnRfbnVtKSwgSU5UX01BU0tfQUxMKTsKKwkvKiB3YWl0IGZvciBwcmV2aW91cyB3cml0ZSB0byBjb21wbGV0ZSAqLworCW12X3JlYWQoTVY2NDNYWF9FVEhfSU5URVJSVVBUX01BU0tfUkVHKHBvcnRfbnVtKSk7CisKKyNpZmRlZiBNVjY0M1hYX05BUEkKKwluZXRpZl9wb2xsX2Rpc2FibGUoZGV2KTsKKyNlbmRpZgogCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCisJZXRoX3BvcnRfcmVzZXQobXAtPnBvcnRfbnVtKTsKKwogCW12NjQzeHhfZXRoX2ZyZWVfdHhfcmluZ3MoZGV2KTsKIAltdjY0M3h4X2V0aF9mcmVlX3J4X3JpbmdzKGRldik7CiAKLQlldGhfcG9ydF9yZXNldChtcC0+cG9ydF9udW0pOwotCi0JLyogRGlzYWJsZSBldGhlcm5ldCBwb3J0IGludGVycnVwdHMgKi8KLQltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfQ0FVU0VfUkVHKHBvcnRfbnVtKSwgMCk7Ci0JbXZfd3JpdGUoTVY2NDNYWF9FVEhfSU5URVJSVVBUX0NBVVNFX0VYVEVORF9SRUcocG9ydF9udW0pLCAwKTsKLQotCS8qIE1hc2sgUlggYnVmZmVyIGFuZCBUWCBlbmQgaW50ZXJydXB0ICovCi0JbXZfd3JpdGUoTVY2NDNYWF9FVEhfSU5URVJSVVBUX01BU0tfUkVHKHBvcnRfbnVtKSwgMCk7Ci0KLQkvKiBNYXNrIHBoeSBhbmQgbGluayBzdGF0dXMgY2hhbmdlcyBpbnRlcnJ1cHRzICovCi0JbXZfd3JpdGUoTVY2NDNYWF9FVEhfSU5URVJSVVBUX0VYVEVORF9NQVNLX1JFRyhwb3J0X251bSksIDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXY2NDN4eF9ldGhfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCXNwaW5fbG9ja19pcnEoJm1wLT5sb2NrKTsKLQotCW12NjQzeHhfZXRoX3JlYWxfc3RvcChkZXYpOworI2lmZGVmIE1WNjQzWFhfTkFQSQorCW5ldGlmX3BvbGxfZW5hYmxlKGRldik7CisjZW5kaWYKIAogCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwotCXNwaW5fdW5sb2NrX2lycSgmbXAtPmxvY2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMDIyLDIwICs5ODAsMTcgQEAKIAlzdHJ1Y3QgcGt0X2luZm8gcGt0X2luZm87CiAKIAl3aGlsZSAoZXRoX3R4X3JldHVybl9kZXNjKG1wLCAmcGt0X2luZm8pID09IEVUSF9PSykgewotCQlpZiAocGt0X2luZm8ucmV0dXJuX2luZm8pIHsKLQkJCWlmIChza2Jfc2hpbmZvKHBrdF9pbmZvLnJldHVybl9pbmZvKS0+bnJfZnJhZ3MpCi0JCQkJZG1hX3VubWFwX3BhZ2UoTlVMTCwgcGt0X2luZm8uYnVmX3B0ciwKLQkJCQkJCXBrdF9pbmZvLmJ5dGVfY250LAotCQkJCQkJRE1BX1RPX0RFVklDRSk7Ci0JCQllbHNlCi0JCQkJZG1hX3VubWFwX3NpbmdsZShOVUxMLCBwa3RfaW5mby5idWZfcHRyLAotCQkJCQkJcGt0X2luZm8uYnl0ZV9jbnQsCi0JCQkJCQlETUFfVE9fREVWSUNFKTsKLQotCQkJZGV2X2tmcmVlX3NrYl9pcnEocGt0X2luZm8ucmV0dXJuX2luZm8pOwotCQl9IGVsc2UKKwkJaWYgKHBrdF9pbmZvLmNtZF9zdHMgJiBFVEhfVFhfRklSU1RfREVTQykKKwkJCWRtYV91bm1hcF9zaW5nbGUoTlVMTCwgcGt0X2luZm8uYnVmX3B0ciwKKwkJCQkJcGt0X2luZm8uYnl0ZV9jbnQsCisJCQkJCURNQV9UT19ERVZJQ0UpOworCQllbHNlCiAJCQlkbWFfdW5tYXBfcGFnZShOVUxMLCBwa3RfaW5mby5idWZfcHRyLAotCQkJCQlwa3RfaW5mby5ieXRlX2NudCwgRE1BX1RPX0RFVklDRSk7CisJCQkJCXBrdF9pbmZvLmJ5dGVfY250LAorCQkJCQlETUFfVE9fREVWSUNFKTsKKworCQlpZiAocGt0X2luZm8ucmV0dXJuX2luZm8pCisJCQlkZXZfa2ZyZWVfc2tiX2lycShwa3RfaW5mby5yZXR1cm5faW5mbyk7CiAJfQogCiAJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJgpAQCAtMTA1MywxNCArMTAwOCwxMSBAQAogCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgZG9uZSA9IDEsIG9yaWdfYnVkZ2V0LCB3b3JrX2RvbmU7CiAJdW5zaWduZWQgaW50IHBvcnRfbnVtID0gbXAtPnBvcnRfbnVtOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKICNpZmRlZiBNVjY0M1hYX1RYX0ZBU1RfUkVGSUxMCiAJaWYgKCsrbXAtPnR4X2NsZWFuX3RocmVzaG9sZCA+IDUpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1wLT5sb2NrLCBmbGFncyk7CiAJCW12NjQzeHhfdHgoZGV2KTsKIAkJbXAtPnR4X2NsZWFuX3RocmVzaG9sZCA9IDA7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5sb2NrLCBmbGFncyk7CiAJfQogI2VuZGlmCiAKQEAgLTEwNzgsMjEgKzEwMzAsMzYgQEAKIAl9CiAKIAlpZiAoZG9uZSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXAtPmxvY2ssIGZsYWdzKTsKLQkJX19uZXRpZl9yeF9jb21wbGV0ZShkZXYpOworCQluZXRpZl9yeF9jb21wbGV0ZShkZXYpOwogCQltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfQ0FVU0VfUkVHKHBvcnRfbnVtKSwgMCk7CiAJCW12X3dyaXRlKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9DQVVTRV9FWFRFTkRfUkVHKHBvcnRfbnVtKSwgMCk7CiAJCW12X3dyaXRlKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9NQVNLX1JFRyhwb3J0X251bSksCi0JCQkJCQlJTlRfQ0FVU0VfVU5NQVNLX0FMTCk7Ci0JCW12X3dyaXRlKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9FWFRFTkRfTUFTS19SRUcocG9ydF9udW0pLAotCQkJCQkJSU5UX0NBVVNFX1VOTUFTS19BTExfRVhUKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPmxvY2ssIGZsYWdzKTsKKwkJCQkJCUlOVF9VTk1BU0tfQUxMKTsKIAl9CiAKIAlyZXR1cm4gZG9uZSA/IDAgOiAxOwogfQogI2VuZGlmCiAKKy8qIEhhcmR3YXJlIGNhbid0IGhhbmRsZSB1bmFsaWduZWQgZnJhZ21lbnRzIHNtYWxsZXIgdGhhbiA5IGJ5dGVzLgorICogVGhpcyBoZWxwZXIgZnVuY3Rpb24gZGV0ZWN0cyB0aGF0IGNhc2UuCisgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaGFzX3RpbnlfdW5hbGlnbmVkX2ZyYWdzKHN0cnVjdCBza19idWZmICpza2IpCit7CisgICAgICAgIHVuc2lnbmVkIGludCBmcmFnOworICAgICAgICBza2JfZnJhZ190ICpmcmFncDsKKworICAgICAgICBmb3IgKGZyYWcgPSAwOyBmcmFnIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgZnJhZysrKSB7CisgICAgICAgICAgICAgICAgZnJhZ3AgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tmcmFnXTsKKyAgICAgICAgICAgICAgICBpZiAoZnJhZ3AtPnNpemUgPD0gOCAmJiBmcmFncC0+cGFnZV9vZmZzZXQgJiAweDcpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworfQorCisKIC8qCiAgKiBtdjY0M3h4X2V0aF9zdGFydF94bWl0CiAgKgpAQCAtMTEzNiwxMiArMTEwMywxOSBAQAogCQlyZXR1cm4gMTsKIAl9CiAKKyNpZmRlZiBNVjY0M1hYX0NIRUNLU1VNX09GRkxPQURfVFgKKwlpZiAoaGFzX3RpbnlfdW5hbGlnbmVkX2ZyYWdzKHNrYikpIHsKKwkJaWYgKChza2JfbGluZWFyaXplKHNrYiwgR0ZQX0FUT01JQykgIT0gMCkpIHsKKwkJCXN0YXRzLT50eF9kcm9wcGVkKys7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGZhaWxlZCB0byBsaW5lYXJpemUgdGlueSAiCisJCQkJCSJ1bmFsaWduZWQgZnJhZ21lbnRcbiIsIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwogCXNwaW5fbG9ja19pcnFzYXZlKCZtcC0+bG9jaywgZmxhZ3MpOwogCi0JLyogVXBkYXRlIHBhY2tldCBpbmZvIGRhdGEgc3RydWN0dXJlIC0tIERNQSBvd25lZCwgZmlyc3QgbGFzdCAqLwotI2lmZGVmIE1WNjQzWFhfQ0hFQ0tTVU1fT0ZGTE9BRF9UWAogCWlmICghc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncykgewotbGluZWFyOgogCQlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fSFcpIHsKIAkJCS8qIEVycmF0YSBCVFMgIzUwLCBJSEwgbXVzdCBiZSA1IGlmIG5vIEhXIGNoZWNrc3VtICovCiAJCQlwa3RfaW5mby5jbWRfc3RzID0gRVRIX1RYX0VOQUJMRV9JTlRFUlJVUFQgfApAQCAtMTE1MCw3ICsxMTI0LDYgQEAKIAkJCQkJICAgNSA8PCBFVEhfVFhfSUhMX1NISUZUOwogCQkJcGt0X2luZm8ubDRpX2NoayA9IDA7CiAJCX0gZWxzZSB7Ci0KIAkJCXBrdF9pbmZvLmNtZF9zdHMgPSBFVEhfVFhfRU5BQkxFX0lOVEVSUlVQVCB8CiAJCQkJCSAgIEVUSF9UWF9GSVJTVF9ERVNDIHwKIAkJCQkJICAgRVRIX1RYX0xBU1RfREVTQyB8CkBAIC0xMTU4LDE0ICsxMTMxLDE2IEBACiAJCQkJCSAgIEVUSF9HRU5fSVBfVl80X0NIRUNLU1VNIHwKIAkJCQkJICAgc2tiLT5uaC5pcGgtPmlobCA8PCBFVEhfVFhfSUhMX1NISUZUOwogCQkJLyogQ1BVIGFscmVhZHkgY2FsY3VsYXRlZCBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtLiAqLwotCQkJaWYgKHNrYi0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgeworCQkJaWYgKChza2ItPnByb3RvY29sID09IEVUSF9QX0lQKSAmJgorCQkJICAgIChza2ItPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApICkgewogCQkJCXBrdF9pbmZvLmNtZF9zdHMgfD0gRVRIX1VEUF9GUkFNRTsKIAkJCQlwa3RfaW5mby5sNGlfY2hrID0gc2tiLT5oLnVoLT5jaGVjazsKLQkJCX0gZWxzZSBpZiAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVENQKQorCQkJfSBlbHNlIGlmICgoc2tiLT5wcm90b2NvbCA9PSBFVEhfUF9JUCkgJiYKKwkJCQkgICAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVENQKSkKIAkJCQlwa3RfaW5mby5sNGlfY2hrID0gc2tiLT5oLnRoLT5jaGVjazsKIAkJCWVsc2UgewogCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkiJXM6IGNoa3N1bSBwcm90byAhPSBUQ1Agb3IgVURQXG4iLAorCQkJCQkiJXM6IGNoa3N1bSBwcm90byAhPSBJUHY0IFRDUCBvciBVRFBcbiIsCiAJCQkJCWRldi0+bmFtZSk7CiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPmxvY2ssIGZsYWdzKTsKIAkJCQlyZXR1cm4gMTsKQEAgLTExODMsMjYgKzExNTgsNiBAQAogCX0gZWxzZSB7CiAJCXVuc2lnbmVkIGludCBmcmFnOwogCi0JCS8qIFNpbmNlIGhhcmR3YXJlIGNhbid0IGhhbmRsZSB1bmFsaWduZWQgZnJhZ21lbnRzIHNtYWxsZXIKLQkJICogdGhhbiA5IGJ5dGVzLCBpZiB3ZSBmaW5kIGFueSwgd2UgbGluZWFyaXplIHRoZSBza2IKLQkJICogYW5kIHN0YXJ0IGFnYWluLiAgV2hlbiBJJ3ZlIHNlZW4gaXQsIGl0J3MgYWx3YXlzIGJlZW4KLQkJICogdGhlIGZpcnN0IGZyYWcgKHByb2JhYmx5IG5lYXIgdGhlIGVuZCBvZiB0aGUgcGFnZSksCi0JCSAqIGJ1dCB3ZSBjaGVjayBhbGwgZnJhZ3MgdG8gYmUgc2FmZS4KLQkJICovCi0JCWZvciAoZnJhZyA9IDA7IGZyYWcgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBmcmFnKyspIHsKLQkJCXNrYl9mcmFnX3QgKmZyYWdwOwotCi0JCQlmcmFncCA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ZyYWddOwotCQkJaWYgKGZyYWdwLT5zaXplIDw9IDggJiYgZnJhZ3AtPnBhZ2Vfb2Zmc2V0ICYgMHg3KSB7Ci0JCQkJc2tiX2xpbmVhcml6ZShza2IsIEdGUF9BVE9NSUMpOwotCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdW5hbGlnbmVkIHRpbnkgZnJhZ21lbnQiCi0JCQkJCQkiJWQgb2YgJWQsIGZpeGVkXG4iLAotCQkJCQkJZGV2LT5uYW1lLCBmcmFnLAotCQkJCQkJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyk7Ci0JCQkJZ290byBsaW5lYXI7Ci0JCQl9Ci0JCX0KLQogCQkvKiBmaXJzdCBmcmFnIHdoaWNoIGlzIHNrYiBoZWFkZXIgKi8KIAkJcGt0X2luZm8uYnl0ZV9jbnQgPSBza2JfaGVhZGxlbihza2IpOwogCQlwa3RfaW5mby5idWZfcHRyID0gZG1hX21hcF9zaW5nbGUoTlVMTCwgc2tiLT5kYXRhLApAQCAtMTIyMSwxNCArMTE3NiwxNiBAQAogCQkJCQkgICBFVEhfR0VOX0lQX1ZfNF9DSEVDS1NVTSB8CiAJCQkJCSAgIHNrYi0+bmguaXBoLT5paGwgPDwgRVRIX1RYX0lITF9TSElGVDsKIAkJCS8qIENQVSBhbHJlYWR5IGNhbGN1bGF0ZWQgcHNldWRvIGhlYWRlciBjaGVja3N1bS4gKi8KLQkJCWlmIChza2ItPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApIHsKKwkJCWlmICgoc2tiLT5wcm90b2NvbCA9PSBFVEhfUF9JUCkgJiYKKwkJCSAgICAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVURQKSkgewogCQkJCXBrdF9pbmZvLmNtZF9zdHMgfD0gRVRIX1VEUF9GUkFNRTsKIAkJCQlwa3RfaW5mby5sNGlfY2hrID0gc2tiLT5oLnVoLT5jaGVjazsKLQkJCX0gZWxzZSBpZiAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVENQKQorCQkJfSBlbHNlIGlmICgoc2tiLT5wcm90b2NvbCA9PSBFVEhfUF9JUCkgJiYKKwkJCQkgICAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVENQKSkKIAkJCQlwa3RfaW5mby5sNGlfY2hrID0gc2tiLT5oLnRoLT5jaGVjazsKIAkJCWVsc2UgewogCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkiJXM6IGNoa3N1bSBwcm90byAhPSBUQ1Agb3IgVURQXG4iLAorCQkJCQkiJXM6IGNoa3N1bSBwcm90byAhPSBJUHY0IFRDUCBvciBVRFBcbiIsCiAJCQkJCWRldi0+bmFtZSk7CiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPmxvY2ssIGZsYWdzKTsKIAkJCQlyZXR1cm4gMTsKQEAgLTEyODgsNiArMTI0NSw4IEBACiAJCX0KIAl9CiAjZWxzZQorCXNwaW5fbG9ja19pcnFzYXZlKCZtcC0+bG9jaywgZmxhZ3MpOworCiAJcGt0X2luZm8uY21kX3N0cyA9IEVUSF9UWF9FTkFCTEVfSU5URVJSVVBUIHwgRVRIX1RYX0ZJUlNUX0RFU0MgfAogCQkJCQkJCUVUSF9UWF9MQVNUX0RFU0M7CiAJcGt0X2luZm8ubDRpX2NoayA9IDA7CkBAIC0xMzQwLDM5ICsxMjk5LDE4IEBACiB9CiAKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotc3RhdGljIGlubGluZSB2b2lkIG12NjQzeHhfZW5hYmxlX2lycShzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCkKLXsKLQlpbnQgcG9ydF9udW0gPSBtcC0+cG9ydF9udW07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtcC0+bG9jaywgZmxhZ3MpOwotCW12X3dyaXRlKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9NQVNLX1JFRyhwb3J0X251bSksCi0JCQkJCUlOVF9DQVVTRV9VTk1BU0tfQUxMKTsKLQltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfRVhURU5EX01BU0tfUkVHKHBvcnRfbnVtKSwKLQkJCQkJSU5UX0NBVVNFX1VOTUFTS19BTExfRVhUKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcC0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbXY2NDN4eF9kaXNhYmxlX2lycShzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCkKLXsKLQlpbnQgcG9ydF9udW0gPSBtcC0+cG9ydF9udW07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtcC0+bG9jaywgZmxhZ3MpOwotCW12X3dyaXRlKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9NQVNLX1JFRyhwb3J0X251bSksCi0JCQkJCUlOVF9DQVVTRV9NQVNLX0FMTCk7Ci0JbXZfd3JpdGUoTVY2NDNYWF9FVEhfSU5URVJSVVBUX0VYVEVORF9NQVNLX1JFRyhwb3J0X251bSksCi0JCQkJCUlOVF9DQVVTRV9NQVNLX0FMTF9FWFQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5sb2NrLCBmbGFncyk7Ci19Ci0KIHN0YXRpYyB2b2lkIG12NjQzeHhfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgcG9ydF9udW0gPSBtcC0+cG9ydF9udW07CiAKLQltdjY0M3h4X2Rpc2FibGVfaXJxKG1wKTsKKwltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfTUFTS19SRUcocG9ydF9udW0pLCBJTlRfTUFTS19BTEwpOworCS8qIHdhaXQgZm9yIHByZXZpb3VzIHdyaXRlIHRvIGNvbXBsZXRlICovCisJbXZfcmVhZChNVjY0M1hYX0VUSF9JTlRFUlJVUFRfTUFTS19SRUcocG9ydF9udW0pKTsKKwogCW12NjQzeHhfZXRoX2ludF9oYW5kbGVyKG5ldGRldi0+aXJxLCBuZXRkZXYsIE5VTEwpOwotCW12NjQzeHhfZW5hYmxlX2lycShtcCk7CisKKwltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfTUFTS19SRUcocG9ydF9udW0pLCBJTlRfVU5NQVNLX0FMTCk7CiB9CiAjZW5kaWYKIApAQCAtMTQ0MSw3ICsxMzc5LDcgQEAKIAkgKiBaZXJvIGNvcHkgY2FuIG9ubHkgd29yayBpZiB3ZSB1c2UgRGlzY292ZXJ5IElJIG1lbW9yeS4gRWxzZSwgd2Ugd2lsbAogCSAqIGhhdmUgdG8gbWFwIHRoZSBidWZmZXJzIHRvIElTQSBtZW1vcnkgd2hpY2ggaXMgb25seSAxNiBNQgogCSAqLwotCWRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9IV19DU1VNOworCWRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNOwogI2VuZGlmCiAjZW5kaWYKIApAQCAtMjA1NCw2ICsxOTkyLDE5NiBAQAogfQogCiAvKgorICogVGhlIGVudHJpZXMgaW4gZWFjaCB0YWJsZSBhcmUgaW5kZXhlZCBieSBhIGhhc2ggb2YgYSBwYWNrZXQncyBNQUMKKyAqIGFkZHJlc3MuICBPbmUgYml0IGluIGVhY2ggZW50cnkgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYWNrZXQgaXMKKyAqIGFjY2VwdGVkLiAgVGhlcmUgYXJlIDQgZW50cmllcyAoZWFjaCA4IGJpdHMgd2lkZSkgaW4gZWFjaCByZWdpc3RlcgorICogb2YgdGhlIHRhYmxlLiAgVGhlIGJpdHMgaW4gZWFjaCBlbnRyeSBhcmUgZGVmaW5lZCBhcyBmb2xsb3dzOgorICoJMAlBY2NlcHQ9MSwgRHJvcD0wCisgKgkzLTEJUXVldWUJCQkoRVRIX1EwPTApCisgKgk3LTQJUmVzZXJ2ZWQgPSAwOworICovCitzdGF0aWMgdm9pZCBldGhfcG9ydF9zZXRfZmlsdGVyX3RhYmxlX2VudHJ5KGludCB0YWJsZSwgdW5zaWduZWQgY2hhciBlbnRyeSkKK3sKKwl1bnNpZ25lZCBpbnQgdGFibGVfcmVnOworCXVuc2lnbmVkIGludCB0Ymxfb2Zmc2V0OworCXVuc2lnbmVkIGludCByZWdfb2Zmc2V0OworCisJdGJsX29mZnNldCA9IChlbnRyeSAvIDQpICogNDsJLyogUmVnaXN0ZXIgb2Zmc2V0IG9mIERBIHRhYmxlIGVudHJ5ICovCisJcmVnX29mZnNldCA9IGVudHJ5ICUgNDsJCS8qIEVudHJ5IG9mZnNldCB3aXRoaW4gdGhlIHJlZ2lzdGVyICovCisKKwkvKiBTZXQgImFjY2VwdHMgZnJhbWUgYml0IiBhdCBzcGVjaWZpZWQgdGFibGUgZW50cnkgKi8KKwl0YWJsZV9yZWcgPSBtdl9yZWFkKHRhYmxlICsgdGJsX29mZnNldCk7CisJdGFibGVfcmVnIHw9IDB4MDEgPDwgKDggKiByZWdfb2Zmc2V0KTsKKwltdl93cml0ZSh0YWJsZSArIHRibF9vZmZzZXQsIHRhYmxlX3JlZyk7Cit9CisKKy8qCisgKiBldGhfcG9ydF9tY19hZGRyIC0gTXVsdGljYXN0IGFkZHJlc3Mgc2V0dGluZ3MuCisgKgorICogVGhlIE1WIGRldmljZSBzdXBwb3J0cyBtdWx0aWNhc3QgdXNpbmcgdHdvIHRhYmxlczoKKyAqIDEpIFNwZWNpYWwgTXVsdGljYXN0IFRhYmxlIGZvciBNQUMgYWRkcmVzc2VzIG9mIHRoZSBmb3JtCisgKiAgICAweDAxLTAwLTVFLTAwLTAwLVhYICh3aGVyZSBYWCBpcyBiZXR3ZWVuIDB4MDAgYW5kIDB4X0ZGKS4KKyAqICAgIFRoZSBNQUMgREFbNzowXSBiaXRzIGFyZSB1c2VkIGFzIGEgcG9pbnRlciB0byB0aGUgU3BlY2lhbCBNdWx0aWNhc3QKKyAqICAgIFRhYmxlIGVudHJpZXMgaW4gdGhlIERBLUZpbHRlciB0YWJsZS4KKyAqIDIpIE90aGVyIE11bHRpY2FzdCBUYWJsZSBmb3IgbXVsdGljYXN0IG9mIGFub3RoZXIgdHlwZS4gQSBDUkMtOGJpdAorICogICAgaXMgdXNlZCBhcyBhbiBpbmRleCB0byB0aGUgT3RoZXIgTXVsdGljYXN0IFRhYmxlIGVudHJpZXMgaW4gdGhlCisgKiAgICBEQS1GaWx0ZXIgdGFibGUuICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIENSQy04Yml0IHZhbHVlLgorICogSW4gZWl0aGVyIGNhc2UsIGV0aF9wb3J0X3NldF9maWx0ZXJfdGFibGVfZW50cnkoKSBpcyB0aGVuIGNhbGxlZAorICogdG8gc2V0IHRvIHNldCB0aGUgYWN0dWFsIHRhYmxlIGVudHJ5LgorICovCitzdGF0aWMgdm9pZCBldGhfcG9ydF9tY19hZGRyKHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0sIHVuc2lnbmVkIGNoYXIgKnBfYWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgbWFjX2g7CisJdW5zaWduZWQgaW50IG1hY19sOworCXVuc2lnbmVkIGNoYXIgY3JjX3Jlc3VsdCA9IDA7CisJaW50IHRhYmxlOworCWludCBtYWNfYXJyYXlbNDhdOworCWludCBjcmNbOF07CisJaW50IGk7CisKKwlpZiAoKHBfYWRkclswXSA9PSAweDAxKSAmJiAocF9hZGRyWzFdID09IDB4MDApICYmCisJICAgIChwX2FkZHJbMl0gPT0gMHg1RSkgJiYgKHBfYWRkclszXSA9PSAweDAwKSAmJiAocF9hZGRyWzRdID09IDB4MDApKSB7CisJCXRhYmxlID0gTVY2NDNYWF9FVEhfREFfRklMVEVSX1NQRUNJQUxfTVVMVElDQVNUX1RBQkxFX0JBU0UKKwkJCQkJKGV0aF9wb3J0X251bSk7CisJCWV0aF9wb3J0X3NldF9maWx0ZXJfdGFibGVfZW50cnkodGFibGUsIHBfYWRkcls1XSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBDYWxjdWxhdGUgQ1JDLTggb3V0IG9mIHRoZSBnaXZlbiBhZGRyZXNzICovCisJbWFjX2ggPSAocF9hZGRyWzBdIDw8IDgpIHwgKHBfYWRkclsxXSk7CisJbWFjX2wgPSAocF9hZGRyWzJdIDw8IDI0KSB8IChwX2FkZHJbM10gPDwgMTYpIHwKKwkJCShwX2FkZHJbNF0gPDwgOCkgfCAocF9hZGRyWzVdIDw8IDApOworCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCW1hY19hcnJheVtpXSA9IChtYWNfbCA+PiBpKSAmIDB4MTsKKwlmb3IgKGkgPSAzMjsgaSA8IDQ4OyBpKyspCisJCW1hY19hcnJheVtpXSA9IChtYWNfaCA+PiAoaSAtIDMyKSkgJiAweDE7CisKKwljcmNbMF0gPSBtYWNfYXJyYXlbNDVdIF4gbWFjX2FycmF5WzQzXSBeIG1hY19hcnJheVs0MF0gXiBtYWNfYXJyYXlbMzldIF4KKwkJIG1hY19hcnJheVszNV0gXiBtYWNfYXJyYXlbMzRdIF4gbWFjX2FycmF5WzMxXSBeIG1hY19hcnJheVszMF0gXgorCQkgbWFjX2FycmF5WzI4XSBeIG1hY19hcnJheVsyM10gXiBtYWNfYXJyYXlbMjFdIF4gbWFjX2FycmF5WzE5XSBeCisJCSBtYWNfYXJyYXlbMThdIF4gbWFjX2FycmF5WzE2XSBeIG1hY19hcnJheVsxNF0gXiBtYWNfYXJyYXlbMTJdIF4KKwkJIG1hY19hcnJheVs4XSAgXiBtYWNfYXJyYXlbN10gIF4gbWFjX2FycmF5WzZdICBeIG1hY19hcnJheVswXTsKKworCWNyY1sxXSA9IG1hY19hcnJheVs0Nl0gXiBtYWNfYXJyYXlbNDVdIF4gbWFjX2FycmF5WzQ0XSBeIG1hY19hcnJheVs0M10gXgorCQkgbWFjX2FycmF5WzQxXSBeIG1hY19hcnJheVszOV0gXiBtYWNfYXJyYXlbMzZdIF4gbWFjX2FycmF5WzM0XSBeCisJCSBtYWNfYXJyYXlbMzJdIF4gbWFjX2FycmF5WzMwXSBeIG1hY19hcnJheVsyOV0gXiBtYWNfYXJyYXlbMjhdIF4KKwkJIG1hY19hcnJheVsyNF0gXiBtYWNfYXJyYXlbMjNdIF4gbWFjX2FycmF5WzIyXSBeIG1hY19hcnJheVsyMV0gXgorCQkgbWFjX2FycmF5WzIwXSBeIG1hY19hcnJheVsxOF0gXiBtYWNfYXJyYXlbMTddIF4gbWFjX2FycmF5WzE2XSBeCisJCSBtYWNfYXJyYXlbMTVdIF4gbWFjX2FycmF5WzE0XSBeIG1hY19hcnJheVsxM10gXiBtYWNfYXJyYXlbMTJdIF4KKwkJIG1hY19hcnJheVs5XSAgXiBtYWNfYXJyYXlbNl0gIF4gbWFjX2FycmF5WzFdICBeIG1hY19hcnJheVswXTsKKworCWNyY1syXSA9IG1hY19hcnJheVs0N10gXiBtYWNfYXJyYXlbNDZdIF4gbWFjX2FycmF5WzQ0XSBeIG1hY19hcnJheVs0M10gXgorCQkgbWFjX2FycmF5WzQyXSBeIG1hY19hcnJheVszOV0gXiBtYWNfYXJyYXlbMzddIF4gbWFjX2FycmF5WzM0XSBeCisJCSBtYWNfYXJyYXlbMzNdIF4gbWFjX2FycmF5WzI5XSBeIG1hY19hcnJheVsyOF0gXiBtYWNfYXJyYXlbMjVdIF4KKwkJIG1hY19hcnJheVsyNF0gXiBtYWNfYXJyYXlbMjJdIF4gbWFjX2FycmF5WzE3XSBeIG1hY19hcnJheVsxNV0gXgorCQkgbWFjX2FycmF5WzEzXSBeIG1hY19hcnJheVsxMl0gXiBtYWNfYXJyYXlbMTBdIF4gbWFjX2FycmF5WzhdICBeCisJCSBtYWNfYXJyYXlbNl0gIF4gbWFjX2FycmF5WzJdICBeIG1hY19hcnJheVsxXSAgXiBtYWNfYXJyYXlbMF07CisKKwljcmNbM10gPSBtYWNfYXJyYXlbNDddIF4gbWFjX2FycmF5WzQ1XSBeIG1hY19hcnJheVs0NF0gXiBtYWNfYXJyYXlbNDNdIF4KKwkJIG1hY19hcnJheVs0MF0gXiBtYWNfYXJyYXlbMzhdIF4gbWFjX2FycmF5WzM1XSBeIG1hY19hcnJheVszNF0gXgorCQkgbWFjX2FycmF5WzMwXSBeIG1hY19hcnJheVsyOV0gXiBtYWNfYXJyYXlbMjZdIF4gbWFjX2FycmF5WzI1XSBeCisJCSBtYWNfYXJyYXlbMjNdIF4gbWFjX2FycmF5WzE4XSBeIG1hY19hcnJheVsxNl0gXiBtYWNfYXJyYXlbMTRdIF4KKwkJIG1hY19hcnJheVsxM10gXiBtYWNfYXJyYXlbMTFdIF4gbWFjX2FycmF5WzldICBeIG1hY19hcnJheVs3XSAgXgorCQkgbWFjX2FycmF5WzNdICBeIG1hY19hcnJheVsyXSAgXiBtYWNfYXJyYXlbMV07CisKKwljcmNbNF0gPSBtYWNfYXJyYXlbNDZdIF4gbWFjX2FycmF5WzQ1XSBeIG1hY19hcnJheVs0NF0gXiBtYWNfYXJyYXlbNDFdIF4KKwkJIG1hY19hcnJheVszOV0gXiBtYWNfYXJyYXlbMzZdIF4gbWFjX2FycmF5WzM1XSBeIG1hY19hcnJheVszMV0gXgorCQkgbWFjX2FycmF5WzMwXSBeIG1hY19hcnJheVsyN10gXiBtYWNfYXJyYXlbMjZdIF4gbWFjX2FycmF5WzI0XSBeCisJCSBtYWNfYXJyYXlbMTldIF4gbWFjX2FycmF5WzE3XSBeIG1hY19hcnJheVsxNV0gXiBtYWNfYXJyYXlbMTRdIF4KKwkJIG1hY19hcnJheVsxMl0gXiBtYWNfYXJyYXlbMTBdIF4gbWFjX2FycmF5WzhdICBeIG1hY19hcnJheVs0XSAgXgorCQkgbWFjX2FycmF5WzNdICBeIG1hY19hcnJheVsyXTsKKworCWNyY1s1XSA9IG1hY19hcnJheVs0N10gXiBtYWNfYXJyYXlbNDZdIF4gbWFjX2FycmF5WzQ1XSBeIG1hY19hcnJheVs0Ml0gXgorCQkgbWFjX2FycmF5WzQwXSBeIG1hY19hcnJheVszN10gXiBtYWNfYXJyYXlbMzZdIF4gbWFjX2FycmF5WzMyXSBeCisJCSBtYWNfYXJyYXlbMzFdIF4gbWFjX2FycmF5WzI4XSBeIG1hY19hcnJheVsyN10gXiBtYWNfYXJyYXlbMjVdIF4KKwkJIG1hY19hcnJheVsyMF0gXiBtYWNfYXJyYXlbMThdIF4gbWFjX2FycmF5WzE2XSBeIG1hY19hcnJheVsxNV0gXgorCQkgbWFjX2FycmF5WzEzXSBeIG1hY19hcnJheVsxMV0gXiBtYWNfYXJyYXlbOV0gIF4gbWFjX2FycmF5WzVdICBeCisJCSBtYWNfYXJyYXlbNF0gIF4gbWFjX2FycmF5WzNdOworCisJY3JjWzZdID0gbWFjX2FycmF5WzQ3XSBeIG1hY19hcnJheVs0Nl0gXiBtYWNfYXJyYXlbNDNdIF4gbWFjX2FycmF5WzQxXSBeCisJCSBtYWNfYXJyYXlbMzhdIF4gbWFjX2FycmF5WzM3XSBeIG1hY19hcnJheVszM10gXiBtYWNfYXJyYXlbMzJdIF4KKwkJIG1hY19hcnJheVsyOV0gXiBtYWNfYXJyYXlbMjhdIF4gbWFjX2FycmF5WzI2XSBeIG1hY19hcnJheVsyMV0gXgorCQkgbWFjX2FycmF5WzE5XSBeIG1hY19hcnJheVsxN10gXiBtYWNfYXJyYXlbMTZdIF4gbWFjX2FycmF5WzE0XSBeCisJCSBtYWNfYXJyYXlbMTJdIF4gbWFjX2FycmF5WzEwXSBeIG1hY19hcnJheVs2XSAgXiBtYWNfYXJyYXlbNV0gIF4KKwkJIG1hY19hcnJheVs0XTsKKworCWNyY1s3XSA9IG1hY19hcnJheVs0N10gXiBtYWNfYXJyYXlbNDRdIF4gbWFjX2FycmF5WzQyXSBeIG1hY19hcnJheVszOV0gXgorCQkgbWFjX2FycmF5WzM4XSBeIG1hY19hcnJheVszNF0gXiBtYWNfYXJyYXlbMzNdIF4gbWFjX2FycmF5WzMwXSBeCisJCSBtYWNfYXJyYXlbMjldIF4gbWFjX2FycmF5WzI3XSBeIG1hY19hcnJheVsyMl0gXiBtYWNfYXJyYXlbMjBdIF4KKwkJIG1hY19hcnJheVsxOF0gXiBtYWNfYXJyYXlbMTddIF4gbWFjX2FycmF5WzE1XSBeIG1hY19hcnJheVsxM10gXgorCQkgbWFjX2FycmF5WzExXSBeIG1hY19hcnJheVs3XSAgXiBtYWNfYXJyYXlbNl0gIF4gbWFjX2FycmF5WzVdOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJY3JjX3Jlc3VsdCA9IGNyY19yZXN1bHQgfCAoY3JjW2ldIDw8IGkpOworCisJdGFibGUgPSBNVjY0M1hYX0VUSF9EQV9GSUxURVJfT1RIRVJfTVVMVElDQVNUX1RBQkxFX0JBU0UoZXRoX3BvcnRfbnVtKTsKKwlldGhfcG9ydF9zZXRfZmlsdGVyX3RhYmxlX2VudHJ5KHRhYmxlLCBjcmNfcmVzdWx0KTsKK30KKworLyoKKyAqIFNldCB0aGUgZW50aXJlIG11bHRpY2FzdCBsaXN0IGJhc2VkIG9uIGRldi0+bWNfbGlzdC4KKyAqLworc3RhdGljIHZvaWQgZXRoX3BvcnRfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlzdHJ1Y3QgZGV2X21jX2xpc3QJKm1jX2xpc3Q7CisJaW50CQkJaTsKKwlpbnQJCQl0YWJsZV9pbmRleDsKKwlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlCSptcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50CQlldGhfcG9ydF9udW0gPSBtcC0+cG9ydF9udW07CisKKwkvKiBJZiB0aGUgZGV2aWNlIGlzIGluIHByb21pc2N1b3VzIG1vZGUgb3IgaW4gYWxsIG11bHRpY2FzdCBtb2RlLAorCSAqIHdlIHdpbGwgZnVsbHkgcG9wdWxhdGUgYm90aCBtdWx0aWNhc3QgdGFibGVzIHdpdGggYWNjZXB0LgorCSAqIFRoaXMgaXMgZ3VhcmFudGVlZCB0byB5aWVsZCBhIG1hdGNoIG9uIGFsbCBtdWx0aWNhc3QgYWRkcmVzc2VzLi4uCisJICovCisJaWYgKChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHx8IChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQlmb3IgKHRhYmxlX2luZGV4ID0gMDsgdGFibGVfaW5kZXggPD0gMHhGQzsgdGFibGVfaW5kZXggKz0gNCkgeworCQkJIC8qIFNldCBhbGwgZW50cmllcyBpbiBEQSBmaWx0ZXIgc3BlY2lhbCBtdWx0aWNhc3QKKwkJCSAgKiB0YWJsZSAoRXhfZEZTTVQpCisJCQkgICogU2V0IGZvciBFVEhfUTAgZm9yIG5vdworCQkJICAqIEJpdHMKKwkJCSAgKiAwCSAgQWNjZXB0PTEsIERyb3A9MAorCQkJICAqIDMtMSAgUXVldWUJIEVUSF9RMD0wCisJCQkgICogNy00ICBSZXNlcnZlZCA9IDA7CisJCQkgICovCisJCQkgbXZfd3JpdGUoTVY2NDNYWF9FVEhfREFfRklMVEVSX1NQRUNJQUxfTVVMVElDQVNUX1RBQkxFX0JBU0UoZXRoX3BvcnRfbnVtKSArIHRhYmxlX2luZGV4LCAweDAxMDEwMTAxKTsKKworCQkJIC8qIFNldCBhbGwgZW50cmllcyBpbiBEQSBmaWx0ZXIgb3RoZXIgbXVsdGljYXN0CisJCQkgICogdGFibGUgKEV4X2RGT01UKQorCQkJICAqIFNldCBmb3IgRVRIX1EwIGZvciBub3cKKwkJCSAgKiBCaXRzCisJCQkgICogMAkgIEFjY2VwdD0xLCBEcm9wPTAKKwkJCSAgKiAzLTEgIFF1ZXVlCSBFVEhfUTA9MAorCQkJICAqIDctNCAgUmVzZXJ2ZWQgPSAwOworCQkJICAqLworCQkJIG12X3dyaXRlKE1WNjQzWFhfRVRIX0RBX0ZJTFRFUl9PVEhFUl9NVUxUSUNBU1RfVEFCTEVfQkFTRShldGhfcG9ydF9udW0pICsgdGFibGVfaW5kZXgsIDB4MDEwMTAxMDEpOworICAgICAgIAl9CisJCXJldHVybjsKKwl9CisKKwkvKiBXZSB3aWxsIGNsZWFyIG91dCBtdWx0aWNhc3QgdGFibGVzIGV2ZXJ5IHRpbWUgd2UgZ2V0IHRoZSBsaXN0LgorCSAqIFRoZW4gYWRkIHRoZSBlbnRpcmUgbmV3IGxpc3QuLi4KKwkgKi8KKwlmb3IgKHRhYmxlX2luZGV4ID0gMDsgdGFibGVfaW5kZXggPD0gMHhGQzsgdGFibGVfaW5kZXggKz0gNCkgeworCQkvKiBDbGVhciBEQSBmaWx0ZXIgc3BlY2lhbCBtdWx0aWNhc3QgdGFibGUgKEV4X2RGU01UKSAqLworCQltdl93cml0ZShNVjY0M1hYX0VUSF9EQV9GSUxURVJfU1BFQ0lBTF9NVUxUSUNBU1RfVEFCTEVfQkFTRQorCQkJCShldGhfcG9ydF9udW0pICsgdGFibGVfaW5kZXgsIDApOworCisJCS8qIENsZWFyIERBIGZpbHRlciBvdGhlciBtdWx0aWNhc3QgdGFibGUgKEV4X2RGT01UKSAqLworCQltdl93cml0ZShNVjY0M1hYX0VUSF9EQV9GSUxURVJfT1RIRVJfTVVMVElDQVNUX1RBQkxFX0JBU0UKKwkJCQkoZXRoX3BvcnRfbnVtKSArIHRhYmxlX2luZGV4LCAwKTsKKwl9CisKKwkvKiBHZXQgcG9pbnRlciB0byBuZXRfZGV2aWNlIG11bHRpY2FzdCBsaXN0IGFuZCBhZGQgZWFjaCBvbmUuLi4gKi8KKwlmb3IgKGkgPSAwLCBtY19saXN0ID0gZGV2LT5tY19saXN0OworCQkJKGkgPCAyNTYpICYmIChtY19saXN0ICE9IE5VTEwpICYmIChpIDwgZGV2LT5tY19jb3VudCk7CisJCQlpKyssIG1jX2xpc3QgPSBtY19saXN0LT5uZXh0KQorCQlpZiAobWNfbGlzdC0+ZG1pX2FkZHJsZW4gPT0gNikKKwkJCWV0aF9wb3J0X21jX2FkZHIoZXRoX3BvcnRfbnVtLCBtY19saXN0LT5kbWlfYWRkcik7Cit9CisKKy8qCiAgKiBldGhfcG9ydF9pbml0X21hY190YWJsZXMgLSBDbGVhciBhbGwgZW50cmFuY2UgaW4gdGhlIFVDLCBTTUMgYW5kIE9NQyB0YWJsZXMKICAqCiAgKiBERVNDUklQVElPTjoKQEAgLTIwODAsMTEgKzIyMDgsMTEgQEAKIAogCWZvciAodGFibGVfaW5kZXggPSAwOyB0YWJsZV9pbmRleCA8PSAweEZDOyB0YWJsZV9pbmRleCArPSA0KSB7CiAJCS8qIENsZWFyIERBIGZpbHRlciBzcGVjaWFsIG11bHRpY2FzdCB0YWJsZSAoRXhfZEZTTVQpICovCi0JCW12X3dyaXRlKChNVjY0M1hYX0VUSF9EQV9GSUxURVJfU1BFQ0lBTF9NVUxUSUNBU1RfVEFCTEVfQkFTRQotCQkJCQkoZXRoX3BvcnRfbnVtKSArIHRhYmxlX2luZGV4KSwgMCk7CisJCW12X3dyaXRlKE1WNjQzWFhfRVRIX0RBX0ZJTFRFUl9TUEVDSUFMX01VTFRJQ0FTVF9UQUJMRV9CQVNFCisJCQkJCShldGhfcG9ydF9udW0pICsgdGFibGVfaW5kZXgsIDApOwogCQkvKiBDbGVhciBEQSBmaWx0ZXIgb3RoZXIgbXVsdGljYXN0IHRhYmxlIChFeF9kRk9NVCkgKi8KLQkJbXZfd3JpdGUoKE1WNjQzWFhfRVRIX0RBX0ZJTFRFUl9PVEhFUl9NVUxUSUNBU1RfVEFCTEVfQkFTRQotCQkJCQkoZXRoX3BvcnRfbnVtKSArIHRhYmxlX2luZGV4KSwgMCk7CisJCW12X3dyaXRlKE1WNjQzWFhfRVRIX0RBX0ZJTFRFUl9PVEhFUl9NVUxUSUNBU1RfVEFCTEVfQkFTRQorCQkJCQkoZXRoX3BvcnRfbnVtKSArIHRhYmxlX2luZGV4LCAwKTsKIAl9CiB9CiAKQEAgLTI0ODksNiArMjYxNyw3IEBACiAJc3RydWN0IGV0aF90eF9kZXNjICpjdXJyZW50X2Rlc2NyaXB0b3I7CiAJc3RydWN0IGV0aF90eF9kZXNjICpmaXJzdF9kZXNjcmlwdG9yOwogCXUzMiBjb21tYW5kOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBEbyBub3QgcHJvY2VzcyBUeCByaW5nIGluIGNhc2Ugb2YgVHggcmluZyByZXNvdXJjZSBlcnJvciAqLwogCWlmIChtcC0+dHhfcmVzb3VyY2VfZXJyKQpAQCAtMjUwNSw2ICsyNjM0LDggQEAKIAkJcmV0dXJuIEVUSF9FUlJPUjsKIAl9CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXAtPmxvY2ssIGZsYWdzKTsKKwogCW1wLT50eF9yaW5nX3NrYnMrKzsKIAlCVUdfT04obXAtPnR4X3Jpbmdfc2ticyA+IG1wLT50eF9yaW5nX3NpemUpOwogCkBAIC0yNTU0LDExICsyNjg1LDE1IEBACiAJCW1wLT50eF9yZXNvdXJjZV9lcnIgPSAxOwogCQltcC0+dHhfY3Vycl9kZXNjX3EgPSB0eF9maXJzdF9kZXNjOwogCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5sb2NrLCBmbGFncyk7CisKIAkJcmV0dXJuIEVUSF9RVUVVRV9MQVNUX1JFU09VUkNFOwogCX0KIAogCW1wLT50eF9jdXJyX2Rlc2NfcSA9IHR4X25leHRfZGVzYzsKIAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5sb2NrLCBmbGFncyk7CisKIAlyZXR1cm4gRVRIX09LOwogfQogI2Vsc2UKQEAgLTI1NjksMTEgKzI3MDQsMTQgQEAKIAlpbnQgdHhfZGVzY191c2VkOwogCXN0cnVjdCBldGhfdHhfZGVzYyAqY3VycmVudF9kZXNjcmlwdG9yOwogCXVuc2lnbmVkIGludCBjb21tYW5kX3N0YXR1czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogRG8gbm90IHByb2Nlc3MgVHggcmluZyBpbiBjYXNlIG9mIFR4IHJpbmcgcmVzb3VyY2UgZXJyb3IgKi8KIAlpZiAobXAtPnR4X3Jlc291cmNlX2VycikKIAkJcmV0dXJuIEVUSF9RVUVVRV9GVUxMOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1wLT5sb2NrLCBmbGFncyk7CisKIAltcC0+dHhfcmluZ19za2JzKys7CiAJQlVHX09OKG1wLT50eF9yaW5nX3NrYnMgPiBtcC0+dHhfcmluZ19zaXplKTsKIApAQCAtMjYwNCw5ICsyNzQyLDEyIEBACiAJLyogQ2hlY2sgZm9yIHJpbmcgaW5kZXggb3ZlcmxhcCBpbiB0aGUgVHggZGVzYyByaW5nICovCiAJaWYgKHR4X2Rlc2NfY3VyciA9PSB0eF9kZXNjX3VzZWQpIHsKIAkJbXAtPnR4X3Jlc291cmNlX2VyciA9IDE7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIEVUSF9RVUVVRV9MQVNUX1JFU09VUkNFOwogCX0KIAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIEVUSF9PSzsKIH0KICNlbmRpZgpAQCAtMjYyOSwyMyArMjc3MCwyNyBAQAogICoJVHggcmluZyAnZmlyc3QnIGFuZCAndXNlZCcgaW5kZXhlcyBhcmUgdXBkYXRlZC4KICAqCiAgKiBSRVRVUk46Ci0gKglFVEhfRVJST1IgaW4gY2FzZSB0aGUgcm91dGluZSBjYW4gbm90IGFjY2VzcyBUeCBkZXNjIHJpbmcuCi0gKglFVEhfUkVUUlkgaW4gY2FzZSB0aGVyZSBpcyB0cmFuc21pc3Npb24gaW4gcHJvY2Vzcy4KLSAqCUVUSF9FTkRfT0ZfSk9CIGlmIHRoZSByb3V0aW5lIGhhcyBub3RoaW5nIHRvIHJlbGVhc2UuCi0gKglFVEhfT0sgb3RoZXJ3aXNlLgorICoJRVRIX09LIG9uIHN1Y2Nlc3MKKyAqCUVUSF9FUlJPUiBvdGhlcndpc2UuCiAgKgogICovCiBzdGF0aWMgRVRIX0ZVTkNfUkVUX1NUQVRVUyBldGhfdHhfcmV0dXJuX2Rlc2Moc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAsCiAJCQkJCQlzdHJ1Y3QgcGt0X2luZm8gKnBfcGt0X2luZm8pCiB7CiAJaW50IHR4X2Rlc2NfdXNlZDsKLSNpZmRlZiBNVjY0M1hYX0NIRUNLU1VNX09GRkxPQURfVFgKLQlpbnQgdHhfYnVzeV9kZXNjID0gbXAtPnR4X2ZpcnN0X2Rlc2NfcTsKLSNlbHNlCi0JaW50IHR4X2J1c3lfZGVzYyA9IG1wLT50eF9jdXJyX2Rlc2NfcTsKLSNlbmRpZgorCWludCB0eF9idXN5X2Rlc2M7CiAJc3RydWN0IGV0aF90eF9kZXNjICpwX3R4X2Rlc2NfdXNlZDsKIAl1bnNpZ25lZCBpbnQgY29tbWFuZF9zdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyID0gRVRIX09LOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1wLT5sb2NrLCBmbGFncyk7CisKKyNpZmRlZiBNVjY0M1hYX0NIRUNLU1VNX09GRkxPQURfVFgKKwl0eF9idXN5X2Rlc2MgPSBtcC0+dHhfZmlyc3RfZGVzY19xOworI2Vsc2UKKwl0eF9idXN5X2Rlc2MgPSBtcC0+dHhfY3Vycl9kZXNjX3E7CisjZW5kaWYKIAogCS8qIEdldCB0aGUgVHggRGVzYyByaW5nIGluZGV4ZXMgKi8KIAl0eF9kZXNjX3VzZWQgPSBtcC0+dHhfdXNlZF9kZXNjX3E7CkBAIC0yNjUzLDIyICsyNzk4LDMwIEBACiAJcF90eF9kZXNjX3VzZWQgPSAmbXAtPnBfdHhfZGVzY19hcmVhW3R4X2Rlc2NfdXNlZF07CiAKIAkvKiBTYW5pdHkgY2hlY2sgKi8KLQlpZiAocF90eF9kZXNjX3VzZWQgPT0gTlVMTCkKLQkJcmV0dXJuIEVUSF9FUlJPUjsKKwlpZiAocF90eF9kZXNjX3VzZWQgPT0gTlVMTCkgeworCQllcnIgPSBFVEhfRVJST1I7CisJCWdvdG8gb3V0OworCX0KIAogCS8qIFN0b3AgcmVsZWFzZS4gQWJvdXQgdG8gb3ZlcmxhcCB0aGUgY3VycmVudCBhdmFpbGFibGUgVHggZGVzY3JpcHRvciAqLwotCWlmICh0eF9kZXNjX3VzZWQgPT0gdHhfYnVzeV9kZXNjICYmICFtcC0+dHhfcmVzb3VyY2VfZXJyKQotCQlyZXR1cm4gRVRIX0VORF9PRl9KT0I7CisJaWYgKHR4X2Rlc2NfdXNlZCA9PSB0eF9idXN5X2Rlc2MgJiYgIW1wLT50eF9yZXNvdXJjZV9lcnIpIHsKKwkJZXJyID0gRVRIX0VSUk9SOworCQlnb3RvIG91dDsKKwl9CiAKIAljb21tYW5kX3N0YXR1cyA9IHBfdHhfZGVzY191c2VkLT5jbWRfc3RzOwogCiAJLyogU3RpbGwgdHJhbnNtaXR0aW5nLi4uICovCi0JaWYgKGNvbW1hbmRfc3RhdHVzICYgKEVUSF9CVUZGRVJfT1dORURfQllfRE1BKSkKLQkJcmV0dXJuIEVUSF9SRVRSWTsKKwlpZiAoY29tbWFuZF9zdGF0dXMgJiAoRVRIX0JVRkZFUl9PV05FRF9CWV9ETUEpKSB7CisJCWVyciA9IEVUSF9FUlJPUjsKKwkJZ290byBvdXQ7CisJfQogCiAJLyogUGFzcyB0aGUgcGFja2V0IGluZm9ybWF0aW9uIHRvIHRoZSBjYWxsZXIgKi8KIAlwX3BrdF9pbmZvLT5jbWRfc3RzID0gY29tbWFuZF9zdGF0dXM7CiAJcF9wa3RfaW5mby0+cmV0dXJuX2luZm8gPSBtcC0+dHhfc2tiW3R4X2Rlc2NfdXNlZF07CisJcF9wa3RfaW5mby0+YnVmX3B0ciA9IHBfdHhfZGVzY191c2VkLT5idWZfcHRyOworCXBfcGt0X2luZm8tPmJ5dGVfY250ID0gcF90eF9kZXNjX3VzZWQtPmJ5dGVfY250OwogCW1wLT50eF9za2JbdHhfZGVzY191c2VkXSA9IE5VTEw7CiAKIAkvKiBVcGRhdGUgdGhlIG5leHQgZGVzY3JpcHRvciB0byByZWxlYXNlLiAqLwpAQCAtMjY4MCw3ICsyODMzLDEwIEBACiAJQlVHX09OKG1wLT50eF9yaW5nX3NrYnMgPT0gMCk7CiAJbXAtPnR4X3Jpbmdfc2ticy0tOwogCi0JcmV0dXJuIEVUSF9PSzsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGVycjsKIH0KIAogLyoKQEAgLTI3MTIsMTEgKzI4NjgsMTQgQEAKIAlpbnQgcnhfbmV4dF9jdXJyX2Rlc2MsIHJ4X2N1cnJfZGVzYywgcnhfdXNlZF9kZXNjOwogCXZvbGF0aWxlIHN0cnVjdCBldGhfcnhfZGVzYyAqcF9yeF9kZXNjOwogCXVuc2lnbmVkIGludCBjb21tYW5kX3N0YXR1czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogRG8gbm90IHByb2Nlc3MgUnggcmluZyBpbiBjYXNlIG9mIFJ4IHJpbmcgcmVzb3VyY2UgZXJyb3IgKi8KIAlpZiAobXAtPnJ4X3Jlc291cmNlX2VycikKIAkJcmV0dXJuIEVUSF9RVUVVRV9GVUxMOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1wLT5sb2NrLCBmbGFncyk7CisKIAkvKiBHZXQgdGhlIFJ4IERlc2MgcmluZyAnY3VyciBhbmQgJ3VzZWQnIGluZGV4ZXMgKi8KIAlyeF9jdXJyX2Rlc2MgPSBtcC0+cnhfY3Vycl9kZXNjX3E7CiAJcnhfdXNlZF9kZXNjID0gbXAtPnJ4X3VzZWRfZGVzY19xOwpAQCAtMjcyOCw4ICsyODg3LDEwIEBACiAJcm1iKCk7CiAKIAkvKiBOb3RoaW5nIHRvIHJlY2VpdmUuLi4gKi8KLQlpZiAoY29tbWFuZF9zdGF0dXMgJiAoRVRIX0JVRkZFUl9PV05FRF9CWV9ETUEpKQorCWlmIChjb21tYW5kX3N0YXR1cyAmIChFVEhfQlVGRkVSX09XTkVEX0JZX0RNQSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIEVUSF9FTkRfT0ZfSk9COworCX0KIAogCXBfcGt0X2luZm8tPmJ5dGVfY250ID0gKHBfcnhfZGVzYy0+Ynl0ZV9jbnQpIC0gUlhfQlVGX09GRlNFVDsKIAlwX3BrdF9pbmZvLT5jbWRfc3RzID0gY29tbWFuZF9zdGF0dXM7CkBAIC0yNzQ5LDYgKzI5MTAsOCBAQAogCWlmIChyeF9uZXh0X2N1cnJfZGVzYyA9PSByeF91c2VkX2Rlc2MpCiAJCW1wLT5yeF9yZXNvdXJjZV9lcnIgPSAxOwogCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPmxvY2ssIGZsYWdzKTsKKwogCXJldHVybiBFVEhfT0s7CiB9CiAKQEAgLTI3NzcsNiArMjk0MCw5IEBACiB7CiAJaW50IHVzZWRfcnhfZGVzYzsJLyogV2hlcmUgdG8gcmV0dXJuIFJ4IHJlc291cmNlICovCiAJdm9sYXRpbGUgc3RydWN0IGV0aF9yeF9kZXNjICpwX3VzZWRfcnhfZGVzYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1wLT5sb2NrLCBmbGFncyk7CiAKIAkvKiBHZXQgJ3VzZWQnIFJ4IGRlc2NyaXB0b3IgKi8KIAl1c2VkX3J4X2Rlc2MgPSBtcC0+cnhfdXNlZF9kZXNjX3E7CkBAIC0yODAwLDYgKzI5NjYsOCBAQAogCS8qIEFueSBSeCByZXR1cm4gY2FuY2VscyB0aGUgUnggcmVzb3VyY2UgZXJyb3Igc3RhdHVzICovCiAJbXAtPnJ4X3Jlc291cmNlX2VyciA9IDA7CiAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcC0+bG9jaywgZmxhZ3MpOworCiAJcmV0dXJuIEVUSF9PSzsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmUuYyBiL2RyaXZlcnMvbmV0L25lLmMKaW5kZXggMGRlOGZkZC4uOTRmNzgyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmUuYworKysgYi9kcml2ZXJzL25ldC9uZS5jCkBAIC0yMTIsMTUgKzIxMiw2IEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLXN0YXRpYyB2b2lkIGNsZWFudXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBwbnBfZGV2ICppZGV2ID0gKHN0cnVjdCBwbnBfZGV2ICopZWlfc3RhdHVzLnByaXY7Ci0JaWYgKGlkZXYpCi0JCXBucF9kZXZpY2VfZGV0YWNoKGlkZXYpOwotCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwotCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBORV9JT19FWFRFTlQpOwotfQotCiAjaWZuZGVmIE1PRFVMRQogc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgbmVfcHJvYmUoaW50IHVuaXQpCiB7CkBAIC04NTksNiArODUwLDE1IEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKK3N0YXRpYyB2b2lkIGNsZWFudXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwbnBfZGV2ICppZGV2ID0gKHN0cnVjdCBwbnBfZGV2ICopZWlfc3RhdHVzLnByaXY7CisJaWYgKGlkZXYpCisJCXBucF9kZXZpY2VfZGV0YWNoKGlkZXYpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBORV9JT19FWFRFTlQpOworfQorCiB2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCiB7CiAJaW50IHRoaXNfZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmUyLmMgYi9kcml2ZXJzL25ldC9uZTIuYwppbmRleCA2ZDYyYWRhLi5lNmRmMzc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZTIuYworKysgYi9kcml2ZXJzL25ldC9uZTIuYwpAQCAtMjc4LDE0ICsyNzgsNiBAQAogCXJldHVybiAtRU5PREVWOwogfQogCi1zdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQltY2FfbWFya19hc191bnVzZWQoZWlfc3RhdHVzLnByaXYpOwotCW1jYV9zZXRfYWRhcHRlcl9wcm9jZm4oIGVpX3N0YXR1cy5wcml2LCBOVUxMLCBOVUxMKTsKLQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKLQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTkVfSU9fRVhURU5UKTsKLX0KLQogI2lmbmRlZiBNT0RVTEUKIHN0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IG5lMl9wcm9iZShpbnQgdW5pdCkKIHsKQEAgLTgxMiw2ICs4MDQsMTQgQEAKIAlyZXR1cm4gLUVOWElPOwogfQogCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwltY2FfbWFya19hc191bnVzZWQoZWlfc3RhdHVzLnByaXYpOworCW1jYV9zZXRfYWRhcHRlcl9wcm9jZm4oIGVpX3N0YXR1cy5wcml2LCBOVUxMLCBOVUxMKTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTkVfSU9fRVhURU5UKTsKK30KKwogdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQogewogCWludCB0aGlzX2RldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjaS1za2VsZXRvbi5jIGIvZHJpdmVycy9uZXQvcGNpLXNrZWxldG9uLmMKaW5kZXggYTFhYzRiZC4uYTdiYjU0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNpLXNrZWxldG9uLmMKKysrIGIvZHJpdmVycy9uZXQvcGNpLXNrZWxldG9uLmMKQEAgLTQxNSw3ICs0MTUsNyBAQAogCiAKIC8qIGRpcmVjdGx5IGluZGV4ZWQgYnkgY2hpcF90LCBhYm92ZSAqLwotY29uc3Qgc3RhdGljIHN0cnVjdCB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAljb25zdCBjaGFyICpuYW1lOwogCXU4IHZlcnNpb247IC8qIGZyb20gUlRMODEzOUMgZG9jcyAqLwogCXUzMiBSeENvbmZpZ01hc2s7IC8qIHNob3VsZCBjbGVhciB0aGUgYml0cyBzdXBwb3J0ZWQgYnkgdGhpcyBjaGlwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEveGlyYzJwc19jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL3hpcmMycHNfY3MuYwppbmRleCAwNDljMzRiMy4uNTkzZDhhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL3hpcmMycHNfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEveGlyYzJwc19jcy5jCkBAIC0xNTk4LDcgKzE1OTgsNyBAQAogICAgIHN3aXRjaChjbWQpIHsKICAgICAgIGNhc2UgU0lPQ0dNSUlQSFk6CQkvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIFBIWSBpbiB1c2UuICovCiAJZGF0YVswXSA9IDA7CQkvKiB3ZSBoYXZlIG9ubHkgdGhpcyBhZGRyZXNzICovCi0JLyogZmFsbCB0cm91Z2ggKi8KKwkvKiBmYWxsIHRocm91Z2ggKi8KICAgICAgIGNhc2UgU0lPQ0dNSUlSRUc6CQkvKiBSZWFkIHRoZSBzcGVjaWZpZWQgTUlJIHJlZ2lzdGVyLiAqLwogCWRhdGFbM10gPSBtaWlfcmQoaW9hZGRyLCBkYXRhWzBdICYgMHgxZiwgZGF0YVsxXSAmIDB4MWYpOwogCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L21kaW9fYnVzLmMgYi9kcml2ZXJzL25ldC9waHkvbWRpb19idXMuYwppbmRleCAwMjk0MGMwLi40NTk0NDNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvbWRpb19idXMuYworKysgYi9kcml2ZXJzL25ldC9waHkvbWRpb19idXMuYwpAQCAtODEsNyArODEsNyBAQAogCiAJCQlwaHlkZXYtPmRldi5wYXJlbnQgPSBidXMtPmRldjsKIAkJCXBoeWRldi0+ZGV2LmJ1cyA9ICZtZGlvX2J1c190eXBlOwotCQkJc3ByaW50ZihwaHlkZXYtPmRldi5idXNfaWQsICJwaHklZDolZCIsIGJ1cy0+aWQsIGkpOworCQkJc25wcmludGYocGh5ZGV2LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgUEhZX0lEX0ZNVCwgYnVzLT5pZCwgaSk7CiAKIAkJCXBoeWRldi0+YnVzID0gYnVzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvcGh5LmMgYi9kcml2ZXJzL25ldC9waHkvcGh5LmMKaW5kZXggYjg2ODZlNC4uMTQ3NGI3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9waHkuYwpAQCAtNDIsNyArNDIsNyBAQAogICovCiB2b2lkIHBoeV9wcmludF9zdGF0dXMoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKIHsKLQlwcl9pbmZvKCIlczogTGluayBpcyAlcyIsIHBoeWRldi0+ZGV2LmJ1c19pZCwKKwlwcl9pbmZvKCJQSFk6ICVzIC0gTGluayBpcyAlcyIsIHBoeWRldi0+ZGV2LmJ1c19pZCwKIAkJCXBoeWRldi0+bGluayA/ICJVcCIgOiAiRG93biIpOwogCWlmIChwaHlkZXYtPmxpbmspCiAJCXByaW50aygiIC0gJWQvJXMiLCBwaHlkZXYtPnNwZWVkLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwX2FzeW5jLmMgYi9kcml2ZXJzL25ldC9wcHBfYXN5bmMuYwppbmRleCA0MDBmNjUyLi5hYTY1NDBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHBfYXN5bmMuYworKysgYi9kcml2ZXJzL25ldC9wcHBfYXN5bmMuYwpAQCAtMTg5LDcgKzE4OSw3IEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAKIAl0dHktPmRpc2NfZGF0YSA9IGFwOwotCisJdHR5LT5yZWNlaXZlX3Jvb20gPSA2NTUzNjsKIAlyZXR1cm4gMDsKIAogIG91dF9mcmVlOgpAQCAtMzQzLDEyICszNDMsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1wcHBfYXN5bmN0dHlfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXJldHVybiA2NTUzNTsKLX0KLQogLyoKICAqIFRoaXMgY2FuIG5vdyBiZSBjYWxsZWQgZnJvbSBoYXJkIGludGVycnVwdCBsZXZlbCBhcyB3ZWxsCiAgKiBhcyBzb2Z0IGludGVycnVwdCBsZXZlbCBvciBtYWlubGluZS4KQEAgLTM5OCw3ICszOTIsNiBAQAogCS53cml0ZQk9IHBwcF9hc3luY3R0eV93cml0ZSwKIAkuaW9jdGwJPSBwcHBfYXN5bmN0dHlfaW9jdGwsCiAJLnBvbGwJPSBwcHBfYXN5bmN0dHlfcG9sbCwKLQkucmVjZWl2ZV9yb29tID0gcHBwX2FzeW5jdHR5X3Jvb20sCiAJLnJlY2VpdmVfYnVmID0gcHBwX2FzeW5jdHR5X3JlY2VpdmUsCiAJLndyaXRlX3dha2V1cCA9IHBwcF9hc3luY3R0eV93YWtldXAsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwX3N5bmN0dHkuYyBiL2RyaXZlcnMvbmV0L3BwcF9zeW5jdHR5LmMKaW5kZXggNGQ1MWMwYy4uMzNjYjgyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHBwX3N5bmN0dHkuYworKysgYi9kcml2ZXJzL25ldC9wcHBfc3luY3R0eS5jCkBAIC0yMzcsNyArMjM3LDcgQEAKIAkJZ290byBvdXRfZnJlZTsKIAogCXR0eS0+ZGlzY19kYXRhID0gYXA7Ci0KKwl0dHktPnJlY2VpdmVfcm9vbSA9IDY1NTM2OwogCXJldHVybiAwOwogCiAgb3V0X2ZyZWU6CkBAIC0zODQsMTIgKzM4NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLXBwcF9zeW5jX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlyZXR1cm4gNjU1MzU7Ci19Ci0KIC8qCiAgKiBUaGlzIGNhbiBub3cgYmUgY2FsbGVkIGZyb20gaGFyZCBpbnRlcnJ1cHQgbGV2ZWwgYXMgd2VsbAogICogYXMgc29mdCBpbnRlcnJ1cHQgbGV2ZWwgb3IgbWFpbmxpbmUuCkBAIC00MzksNyArNDMzLDYgQEAKIAkud3JpdGUJPSBwcHBfc3luY193cml0ZSwKIAkuaW9jdGwJPSBwcHBfc3luY3R0eV9pb2N0bCwKIAkucG9sbAk9IHBwcF9zeW5jX3BvbGwsCi0JLnJlY2VpdmVfcm9vbSA9IHBwcF9zeW5jX3Jvb20sCiAJLnJlY2VpdmVfYnVmID0gcHBwX3N5bmNfcmVjZWl2ZSwKIAkud3JpdGVfd2FrZXVwID0gcHBwX3N5bmNfd2FrZXVwLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3I4MTY5LmMgYi9kcml2ZXJzL25ldC9yODE2OS5jCmluZGV4IDE0YTc2ZjcuLjJlMWJlZDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9yODE2OS5jCisrKyBiL2RyaXZlcnMvbmV0L3I4MTY5LmMKQEAgLTE3MCw3ICsxNzAsNyBAQAogI2RlZmluZSBfUihOQU1FLE1BQyxNQVNLKSBcCiAJeyAubmFtZSA9IE5BTUUsIC5tYWNfdmVyc2lvbiA9IE1BQywgLlJ4Q29uZmlnTWFzayA9IE1BU0sgfQogCi1jb25zdCBzdGF0aWMgc3RydWN0IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJdTggbWFjX3ZlcnNpb247CiAJdTMyIFJ4Q29uZmlnTWFzazsJLyogQ2xlYXJzIHRoZSBiaXRzIHN1cHBvcnRlZCBieSB0aGlzIGNoaXAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NiMTAwMC5jIGIvZHJpdmVycy9uZXQvc2IxMDAwLmMKaW5kZXggZDYzODhlMS4uNzYxMzk0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2IxMDAwLmMKKysrIGIvZHJpdmVycy9uZXQvc2IxMDAwLmMKQEAgLTk0LDcgKzk0LDcgQEAKIAljb25zdCBjaGFyKiBuYW1lKTsKIHN0YXRpYyBpbmxpbmUgaW50IGNhcmRfd2FpdF9mb3JfcmVhZHkoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lLAogCXVuc2lnbmVkIGNoYXIgaW5bXSk7Ci1zdGF0aWMgaW5saW5lIGludCBjYXJkX3NlbmRfY29tbWFuZChjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsCitzdGF0aWMgaW50IGNhcmRfc2VuZF9jb21tYW5kKGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSwKIAljb25zdCB1bnNpZ25lZCBjaGFyIG91dFtdLCB1bnNpZ25lZCBjaGFyIGluW10pOwogCiAvKiBTQjEwMDAgaGFyZHdhcmUgcm91dGluZXMgdG8gYmUgdXNlZCBkdXJpbmcgZnJhbWUgcnggaW50ZXJydXB0ICovCkBAIC0zMDksNyArMzA5LDcgQEAKIH0KIAogLyogQ2FyZCBTZW5kIENvbW1hbmQgKGNhbm5vdCBiZSB1c2VkIGR1cmluZyBhbiBpbnRlcnJ1cHQpICovCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGludAogY2FyZF9zZW5kX2NvbW1hbmQoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lLAogCWNvbnN0IHVuc2lnbmVkIGNoYXIgb3V0W10sIHVuc2lnbmVkIGNoYXIgaW5bXSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NpczE5MC5jIGIvZHJpdmVycy9uZXQvc2lzMTkwLmMKaW5kZXggNDc4NzkxZS4uYjQyMDE4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2lzMTkwLmMKKysrIGIvZHJpdmVycy9uZXQvc2lzMTkwLmMKQEAgLTMyOSw3ICszMjksNyBAQAogCXsgTlVMTCwgfQogfTsKIAotY29uc3Qgc3RhdGljIHN0cnVjdCB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAljb25zdCBjaGFyICpuYW1lOwogfSBzaXNfY2hpcF9pbmZvW10gPSB7CiAJeyAiU2lTIDE5MCBQQ0kgRmFzdCBFdGhlcm5ldCBhZGFwdGVyIiB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2RpbS5jIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2RpbS5jCmluZGV4IDBmZGRmNjEuLjA3YzFiNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tkaW0uYworKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZGltLmMKQEAgLTE4MCw3ICsxODAsNyBAQAogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiogVGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzIHBlciBzZWMgaXMgdGhlIHNhbWUgYXMgZXhwZWN0ZWQuCiAgICAgICAgICAgICAgICAgKiogRXZhbHVsYXRlIHRoZSBkZXNjcmlwdG9yLXJhdGlvLiBJZiBpdCBoYXMgY2hhbmdlZCwgYSByZXNpemUgCi0gICAgICAgICAgICAgICAgKiogaW4gdGhlIG1vZGVyYXRpb24gdGltZXIgbWlnaHQgYmUgdXNlZnVsbAorICAgICAgICAgICAgICAgICoqIGluIHRoZSBtb2RlcmF0aW9uIHRpbWVyIG1pZ2h0IGJlIHVzZWZ1bAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgaWYgKE1fRElNSU5GTy5BdXRvU2l6aW5nKSB7CiAgICAgICAgICAgICAgICAgICAgIFJlc2l6ZURpbVRpbWVyRHVyYXRpb24ocEFDKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZS5jIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlLmMKaW5kZXggOWE3NmFjMS4uYTVmMmIxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlLmMKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlLmMKQEAgLTI4MiwyNiArMjgyLDIyIEBACiAgKiBEZXNjcmlwdGlvbjoKICAqCVRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZSB0aGUgUENJIHJlc291cmNlcyBhbmQgSU8KICAqCi0gKiBSZXR1cm5zOiBOL0EKLSAqCQorICogUmV0dXJuczoKKyAqCTAgLSBpbmRpY2F0ZSBldmVyeXRoaW5nIHdvcmtlZCBvay4KKyAqCSE9IDAgLSBlcnJvciBpbmRpY2F0aW9uCiAgKi8KLWludCBTa0dlSW5pdFBDSShTS19BQyAqcEFDKQorc3RhdGljIF9fZGV2aW5pdCBpbnQgU2tHZUluaXRQQ0koU0tfQUMgKnBBQykKIHsKIAlzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2ID0gcEFDLT5kZXZbMF07CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwQUMtPlBjaURldjsKIAlpbnQgcmV0dmFsOwogCi0JaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpICE9IDApIHsKLQkJcmV0dXJuIDE7Ci0JfQotCiAJZGV2LT5tZW1fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDApOwogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCi0JaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgInNrOThsaW4iKSAhPSAwKSB7Ci0JCXJldHZhbCA9IDI7Ci0JCWdvdG8gb3V0X2Rpc2FibGU7Ci0JfQorCXJldHZhbCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgInNrOThsaW4iKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKIAogI2lmZGVmIFNLX0JJR19FTkRJQU4KIAkvKgpAQCAtMzIwLDkgKzMxNiw4IEBACiAJICogUmVtYXAgdGhlIHJlZ3MgaW50byBrZXJuZWwgc3BhY2UuCiAJICovCiAJcEFDLT5Jb0Jhc2UgPSBpb3JlbWFwX25vY2FjaGUoZGV2LT5tZW1fc3RhcnQsIDB4NDAwMCk7Ci0KLQlpZiAoIXBBQy0+SW9CYXNlKXsKLQkJcmV0dmFsID0gMzsKKwlpZiAoIXBBQy0+SW9CYXNlKSB7CisJCXJldHZhbCA9IC1FSU87CiAJCWdvdG8gb3V0X3JlbGVhc2U7CiAJfQogCkBAIC0zMzAsOCArMzI1LDcgQEAKIAogIG91dF9yZWxlYXNlOgogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0gb3V0X2Rpc2FibGU6Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworIG91dDoKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC00OTIsNyArNDg2LDcgQEAKICAqCTAsIGlmIGV2ZXJ5dGhpbmcgaXMgb2sKICAqCSE9MCwgb24gZXJyb3IKICAqLwotc3RhdGljIGludCBfX2luaXQgU2tHZUJvYXJkSW5pdChzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2LCBTS19BQyAqcEFDKQorc3RhdGljIGludCBfX2RldmluaXQgU2tHZUJvYXJkSW5pdChzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2LCBTS19BQyAqcEFDKQogewogc2hvcnQJaTsKIHVuc2lnbmVkIGxvbmcgRmxhZ3M7CkBAIC01MjksNyArNTIzLDcgQEAKIAlpZiAoU2tHZUluaXQocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9EQVRBKSAhPSAwKSB7CiAJCXByaW50aygiSFdJbml0ICgwKSBmYWlsZWQuXG4iKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKLQkJcmV0dXJuKC1FQUdBSU4pOworCQlyZXR1cm4gLUVJTzsKIAl9CiAJU2tJMmNJbml0KCAgcEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9EQVRBKTsKIAlTa0V2ZW50SW5pdChwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0RBVEEpOwpAQCAtNTUxLDcgKzU0NSw3IEBACiAJaWYgKFNrR2VJbml0KHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfSU8pICE9IDApIHsKIAkJcHJpbnRrKCJzazk4bGluOiBIV0luaXQgKDEpIGZhaWxlZC5cbiIpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOwotCQlyZXR1cm4oLUVBR0FJTik7CisJCXJldHVybiAtRUlPOwogCX0KIAlTa0kyY0luaXQoICBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKIAlTa0V2ZW50SW5pdChwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKQEAgLTU4MywyMCArNTc3LDIwIEBACiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAic2s5OGxpbjogSWxsZWdhbCBudW1iZXIgb2YgcG9ydHM6ICVkXG4iLAogCQkgICAgICAgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kKTsKLQkJcmV0dXJuIC1FQUdBSU47CisJCXJldHVybiAtRUlPOwogCX0KIAogCWlmIChSZXQpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAic2s5OGxpbjogUmVxdWVzdGVkIElSUSAlZCBpcyBidXN5LlxuIiwKIAkJICAgICAgIGRldi0+aXJxKTsKLQkJcmV0dXJuIC1FQUdBSU47CisJCXJldHVybiBSZXQ7CiAJfQogCXBBQy0+QWxsb2NGbGFnIHw9IFNLX0FMTE9DX0lSUTsKIAogCS8qIEFsbG9jIG1lbW9yeSBmb3IgdGhpcyBib2FyZCAoTWVtIGZvciBSeEQvVHhEKSA6ICovCiAJaWYoIUJvYXJkQWxsb2NNZW0ocEFDKSkgewogCQlwcmludGsoIk5vIG1lbW9yeSBmb3IgZGVzY3JpcHRvciByaW5ncy5cbiIpOwotICAgICAgIAkJcmV0dXJuKC1FQUdBSU4pOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlCb2FyZEluaXRNZW0ocEFDKTsKQEAgLTYxMiw3ICs2MDYsNyBAQAogCQlEdWFsTmV0KSkgewogCQlCb2FyZEZyZWVNZW0ocEFDKTsKIAkJcHJpbnRrKCJzazk4bGluOiBTa0dlSW5pdEFzc2lnblJhbVRvUXVldWVzIGZhaWxlZC5cbiIpOwotCQlyZXR1cm4oLUVBR0FJTik7CisJCXJldHVybiAtRUlPOwogCX0KIAogCXJldHVybiAoMCk7CkBAIC02MzMsOCArNjI3LDcgQEAKICAqCVNLX1RSVUUsIGlmIGFsbCBtZW1vcnkgY291bGQgYmUgYWxsb2NhdGVkCiAgKglTS19GQUxTRSwgaWYgbm90CiAgKi8KLXN0YXRpYyBTS19CT09MIEJvYXJkQWxsb2NNZW0oCi1TS19BQwkqcEFDKQorc3RhdGljIF9fZGV2aW5pdCBTS19CT09MIEJvYXJkQWxsb2NNZW0oU0tfQUMJKnBBQykKIHsKIGNhZGRyX3QJCXBEZXNjck1lbTsJLyogcG9pbnRlciB0byBkZXNjcmlwdG9yIG1lbW9yeSBhcmVhICovCiBzaXplX3QJCUFsbG9jTGVuZ3RoOwkvKiBsZW5ndGggb2YgY29tcGxldGUgZGVzY3JpcHRvciBhcmVhICovCkBAIC03MjcsOCArNzIwLDcgQEAKICAqCiAgKiBSZXR1cm5zOglOL0EKICAqLwotc3RhdGljIHZvaWQgQm9hcmRJbml0TWVtKAotU0tfQUMJKnBBQykJLyogcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK3N0YXRpYyBfX2RldmluaXQgdm9pZCBCb2FyZEluaXRNZW0oU0tfQUMgKnBBQykKIHsKIGludAlpOwkJLyogbG9vcCBjb3VudGVyICovCiBpbnQJUnhEZXNjclNpemU7CS8qIHRoZSBzaXplIG9mIGEgcnggZGVzY3JpcHRvciByb3VuZGVkIHVwIHRvIGFsaWdubWVudCovCkBAIC0yODU5LDcgKzI4NTEsNyBAQAogICogRGVzY3JpcHRpb246CiAgKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpZiBhbiBpb2N0bCBpcyBpc3N1ZWQgb24gdGhlIGRldmljZS4KICAqCVRoZXJlIGFyZSB0aHJlZSBzdWJmdW5jdGlvbiBmb3IgcmVhZGluZywgd3JpdGluZyBhbmQgdGVzdC13cml0aW5nCi0gKgl0aGUgcHJpdmF0ZSBNSUIgZGF0YSBzdHJ1Y3R1cmUgKHVzZWZ1bGwgZm9yIFN5c0tvbm5lY3QtaW50ZXJuYWwgdG9vbHMpLgorICoJdGhlIHByaXZhdGUgTUlCIGRhdGEgc3RydWN0dXJlICh1c2VmdWwgZm9yIFN5c0tvbm5lY3QtaW50ZXJuYWwgdG9vbHMpLgogICoKICAqIFJldHVybnM6CiAgKgkwLCBpZiBldmVyeXRoaW5nIGlzIG9rCkBAIC00Nzc2LDMyICs0NzY4LDQ3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UJKmRldiA9IE5VTEw7CiAJc3RhdGljIGludCBib2FyZHNfZm91bmQgPSAwOwogCWludCBlcnJvciA9IC1FTk9ERVY7CisJaW50IHVzaW5nX2RhYyA9IDA7CiAJY2hhciBEZXZpY2VTdHJbODBdOwogCiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQogCQlnb3RvIG91dDsKICAKIAkvKiBDb25maWd1cmUgRE1BIGF0dHJpYnV0ZXMuICovCi0JaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spICYmCi0JICAgIHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spKQotCQlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKKwlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gc2l6ZW9mKHUzMikgJiYKKwkgICAgIShlcnJvciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spKSkgeworCQl1c2luZ19kYWMgPSAxOworCQllcnJvciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSyk7CisJCWlmIChlcnJvciA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAic2s5OGxpbiAlcyB1bmFibGUgdG8gb2J0YWluIDY0IGJpdCBETUEgIgorCQkJICAgICAgICJmb3IgY29uc2lzdGVudCBhbGxvY2F0aW9uc1xuIiwgcGNpX25hbWUocGRldikpOworCQkJZ290byBvdXRfZGlzYWJsZV9kZXZpY2U7CisJCX0KKwl9IGVsc2UgeworCQllcnJvciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOworCQlpZiAoZXJyb3IpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAic2s5OGxpbiAlcyBubyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb25cbiIsCisJCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQkJZ290byBvdXRfZGlzYWJsZV9kZXZpY2U7CisJCX0KKwl9CiAKLQotCWlmICgoZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKERFVl9ORVQpKSkgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBldGhlcmRldiAiCisgCWVycm9yID0gLUVOT01FTTsKKyAJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKERFVl9ORVQpKTsKKyAJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzazk4bGluOiB1bmFibGUgdG8gYWxsb2NhdGUgZXRoZXJkZXYgIgogCQkgICAgICAgInN0cnVjdHVyZSFcbiIpOwogCQlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKIAl9CiAKIAlwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlwTmV0LT5wQUMgPSBrbWFsbG9jKHNpemVvZihTS19BQyksIEdGUF9LRVJORUwpOworCXBOZXQtPnBBQyA9IGt6YWxsb2Moc2l6ZW9mKFNLX0FDKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwTmV0LT5wQUMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgYWRhcHRlciAiCisJCXByaW50ayhLRVJOX0VSUiAic2s5OGxpbjogdW5hYmxlIHRvIGFsbG9jYXRlIGFkYXB0ZXIgIgogCQkgICAgICAgInN0cnVjdHVyZSFcbiIpOwogCQlnb3RvIG91dF9mcmVlX25ldGRldjsKIAl9CiAKLQltZW1zZXQocE5ldC0+cEFDLCAwLCBzaXplb2YoU0tfQUMpKTsKIAlwQUMgPSBwTmV0LT5wQUM7CiAJcEFDLT5QY2lEZXYgPSBwZGV2OwogCkBAIC00ODEwLDYgKzQ4MTcsNyBAQAogCXBBQy0+Q2hlY2tRdWV1ZSA9IFNLX0ZBTFNFOwogCiAJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisKIAllcnJvciA9IFNrR2VJbml0UENJKHBBQyk7CiAJaWYgKGVycm9yKSB7CiAJCXByaW50ayhLRVJOX0VSUiAic2s5OGxpbjogUENJIHNldHVwIGZhaWxlZDogJWlcbiIsIGVycm9yKTsKQEAgLTQ4NDQsMTkgKzQ4NTIsMjUgQEAKICNlbmRpZgogCX0KIAorCWlmICh1c2luZ19kYWMpCisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOworCiAJcEFDLT5JbmRleCA9IGJvYXJkc19mb3VuZCsrOwogCi0JaWYgKFNrR2VCb2FyZEluaXQoZGV2LCBwQUMpKQorCWVycm9yID0gU2tHZUJvYXJkSW5pdChkZXYsIHBBQyk7CisJaWYgKGVycm9yKQogCQlnb3RvIG91dF9mcmVlX25ldGRldjsKIAogCS8qIFJlYWQgQWRhcHRlciBuYW1lIGZyb20gVlBEICovCiAJaWYgKFByb2R1Y3RTdHIocEFDLCBEZXZpY2VTdHIsIHNpemVvZihEZXZpY2VTdHIpKSAhPSAwKSB7CisJCWVycm9yID0gLUVJTzsKIAkJcHJpbnRrKEtFUk5fRVJSICJzazk4bGluOiBDb3VsZCBub3QgcmVhZCBWUEQgZGF0YS5cbiIpOwogCQlnb3RvIG91dF9mcmVlX3Jlc291cmNlczsKIAl9CiAKIAkvKiBSZWdpc3RlciBuZXQgZGV2aWNlICovCi0JaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CisJZXJyb3IgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyb3IpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJzazk4bGluOiBDb3VsZCBub3QgcmVnaXN0ZXIgZGV2aWNlLlxuIik7CiAJCWdvdG8gb3V0X2ZyZWVfcmVzb3VyY2VzOwogCX0KQEAgLTQ4ODMsMTUgKzQ4OTcsMTcgQEAKIAogCWJvYXJkc19mb3VuZCsrOwogCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKIAkvKiBNb3JlIHRoZW4gb25lIHBvcnQgZm91bmQgKi8KIAlpZiAoKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA9PSAyICkgJiYgKHBBQy0+UmxtdE5ldHMgPT0gMikpIHsKLQkJaWYgKChkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoREVWX05FVCkpKSA9PSAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBldGhlcmRldiAiCisJCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihERVZfTkVUKSk7CisJCWlmICghZGV2KSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNrOThsaW46IHVuYWJsZSB0byBhbGxvY2F0ZSBldGhlcmRldiAiCiAJCQkJInN0cnVjdHVyZSFcbiIpOwotCQkJZ290byBvdXQ7CisJCQlnb3RvIHNpbmdsZV9wb3J0OwogCQl9CiAKLQkJcEFDLT5kZXZbMV0gICA9IGRldjsKIAkJcE5ldCAgICAgICAgICA9IG5ldGRldl9wcml2KGRldik7CiAJCXBOZXQtPlBvcnROciAgPSAxOwogCQlwTmV0LT5OZXROciAgID0gMTsKQEAgLTQ5MjAsMjAgKzQ5MzYsMjggQEAKICNlbmRpZgogCQl9CiAKLQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgInNrOThsaW46IENvdWxkIG5vdCByZWdpc3RlciBkZXZpY2UgZm9yIHNlY29uZiBwb3J0LlxuIik7CisJCWlmICh1c2luZ19kYWMpCisJCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKKworCQllcnJvciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCQlpZiAoZXJyb3IpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAic2s5OGxpbjogQ291bGQgbm90IHJlZ2lzdGVyIGRldmljZSIKKwkJCSAgICAgICAiIGZvciBzZWNvbmQgcG9ydC4gKCVkKVxuIiwgZXJyb3IpOwogCQkJZnJlZV9uZXRkZXYoZGV2KTsKLQkJCXBBQy0+ZGV2WzFdID0gcEFDLT5kZXZbMF07Ci0JCX0gZWxzZSB7Ci0JCQltZW1jcHkoJmRldi0+ZGV2X2FkZHIsCi0JCQkJCSZwQUMtPkFkZHIuTmV0WzFdLkN1cnJlbnRNYWNBZGRyZXNzLCA2KTsKLQkJCW1lbWNweShkZXYtPnBlcm1fYWRkciwgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7Ci0JCi0JCQlwcmludGsoIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBEZXZpY2VTdHIpOwotCQkJcHJpbnRrKCIgICAgICBQcmVmUG9ydDpCICBSbG10TW9kZTpEdWFsIENoZWNrIExpbmsgU3RhdGVcbiIpOworCQkJZ290byBzaW5nbGVfcG9ydDsKIAkJfQorCisJCXBBQy0+ZGV2WzFdICAgPSBkZXY7CisJCW1lbWNweSgmZGV2LT5kZXZfYWRkciwKKwkJICAgICAgICZwQUMtPkFkZHIuTmV0WzFdLkN1cnJlbnRNYWNBZGRyZXNzLCA2KTsKKwkJbWVtY3B5KGRldi0+cGVybV9hZGRyLCBkZXYtPmRldl9hZGRyLCBkZXYtPmFkZHJfbGVuKTsKKworCQlwcmludGsoIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBEZXZpY2VTdHIpOworCQlwcmludGsoIiAgICAgIFByZWZQb3J0OkIgIFJsbXRNb2RlOkR1YWwgQ2hlY2sgTGluayBTdGF0ZVxuIik7CiAJfQogCitzaW5nbGVfcG9ydDoKKwogCS8qIFNhdmUgdGhlIGhhcmR3YXJlIHJldmlzaW9uICovCiAJcEFDLT5IV1JldmlzaW9uID0gKCgocEFDLT5HSW5pLkdJUGNpSHdSZXYgPj4gNCkgJiAweDBGKSoxMCkgKwogCQkocEFDLT5HSW5pLkdJUGNpSHdSZXYgJiAweDBGKTsKQEAgLTQ5NDUsNyArNDk2OSw2IEBACiAJbWVtc2V0KCZwQUMtPlBubWlCYWNrdXAsIDAsIHNpemVvZihTS19QTk1JX1NUUlVDVF9EQVRBKSk7CiAJbWVtY3B5KCZwQUMtPlBubWlCYWNrdXAsICZwQUMtPlBubWlTdHJ1Y3QsIHNpemVvZihTS19QTk1JX1NUUlVDVF9EQVRBKSk7CiAKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKIAlyZXR1cm4gMDsKIAogIG91dF9mcmVlX3Jlc291cmNlczoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZXBubWkuYyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZXBubWkuYwppbmRleCA1OGUxYTViZS4uYTM4NjE3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlcG5taS5jCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZXBubWkuYwpAQCAtNjExLDcgKzYxMSw3IEBACiAgKiBEZXNjcmlwdGlvbjoKICAqCUNhbGxzIGEgZ2VuZXJhbCBzdWItZnVuY3Rpb24gZm9yIGFsbCB0aGlzIHN0dWZmLiBUaGUgcHJlc2V0IGRvZXMKICAqCXRoZSBzYW1lIGFzIGEgc2V0LCBidXQgcmV0dXJucyBqdXN0IGJlZm9yZSBmaW5hbGx5IHNldHRpbmcgdGhlCi0gKgluZXcgdmFsdWUuIFRoaXMgaXMgdXNlZnVsbCB0byBjaGVjayBpZiBhIHNldCBtaWdodCBiZSBzdWNjZXNzZnVsbC4KKyAqCW5ldyB2YWx1ZS4gVGhpcyBpcyB1c2VmdWwgdG8gY2hlY2sgaWYgYSBzZXQgbWlnaHQgYmUgc3VjY2Vzc2Z1bGwuCiAgKglJZiB0aGUgaW5zdGFuY2UgLTEgaXMgcGFzc2VkLCBhbiBhcnJheSBvZiB2YWx1ZXMgaXMgc3VwcG9zZWQgYW5kCiAgKglhbGwgaW5zdGFuY2VzIG9mIHRoZSBPSUQgd2lsbCBiZSBzZXQuCiAgKgpAQCAtNjU0LDcgKzY1NCw3IEBACiAgKiBEZXNjcmlwdGlvbjoKICAqCUNhbGxzIGEgZ2VuZXJhbCBzdWItZnVuY3Rpb24gZm9yIGFsbCB0aGlzIHN0dWZmLiBUaGUgcHJlc2V0IGRvZXMKICAqCXRoZSBzYW1lIGFzIGEgc2V0LCBidXQgcmV0dXJucyBqdXN0IGJlZm9yZSBmaW5hbGx5IHNldHRpbmcgdGhlCi0gKgluZXcgdmFsdWUuIFRoaXMgaXMgdXNlZnVsbCB0byBjaGVjayBpZiBhIHNldCBtaWdodCBiZSBzdWNjZXNzZnVsbC4KKyAqCW5ldyB2YWx1ZS4gVGhpcyBpcyB1c2VmdWwgdG8gY2hlY2sgaWYgYSBzZXQgbWlnaHQgYmUgc3VjY2Vzc2Z1bGwuCiAgKglJZiB0aGUgaW5zdGFuY2UgLTEgaXMgcGFzc2VkLCBhbiBhcnJheSBvZiB2YWx1ZXMgaXMgc3VwcG9zZWQgYW5kCiAgKglhbGwgaW5zdGFuY2VzIG9mIHRoZSBPSUQgd2lsbCBiZSBzZXQuCiAgKgpAQCAtODcwLDcgKzg3MCw3IEBACiAgKiBEZXNjcmlwdGlvbjoKICAqCUNhbGxzIGEgZ2VuZXJhbCBzdWItZnVuY3Rpb24gZm9yIGFsbCB0aGlzIHNldCBzdHVmZi4gVGhlIHByZXNldCBkb2VzCiAgKgl0aGUgc2FtZSBhcyBhIHNldCwgYnV0IHJldHVybnMganVzdCBiZWZvcmUgZmluYWxseSBzZXR0aW5nIHRoZQotICoJbmV3IHZhbHVlLiBUaGlzIGlzIHVzZWZ1bGwgdG8gY2hlY2sgaWYgYSBzZXQgbWlnaHQgYmUgc3VjY2Vzc2Z1bGwuCisgKgluZXcgdmFsdWUuIFRoaXMgaXMgdXNlZnVsIHRvIGNoZWNrIGlmIGEgc2V0IG1pZ2h0IGJlIHN1Y2Nlc3NmdWxsLgogICoJVGhlIHN1Yi1mdW5jdGlvbiBydW5zIHRocm91Z2ggdGhlIElkVGFibGUsIGNoZWNrcyB3aGljaCBPSURzIGFyZSBhYmxlCiAgKgl0byBzZXQsIGFuZCBjYWxscyB0aGUgaGFuZGxlciBmdW5jdGlvbiBvZiB0aGUgT0lEIHRvIHBlcmZvcm0gdGhlCiAgKglwcmVzZXQuIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIHdpbGwgYWxzbyBiZSBzdG9yZWQgaW4KQEAgLTY0NzMsNyArNjQ3Myw3IEBACiAgKgogICogRGVzY3JpcHRpb246CiAgKglUaGUgQ09NTU9OIG1vZHVsZSBvbmx5IHRlbGxzIHVzIGlmIHRoZSBtb2RlIGlzIGhhbGYgb3IgZnVsbCBkdXBsZXguCi0gKglCdXQgaW4gdGhlIGRlY2FkZSBvZiBhdXRvIHNlbnNpbmcgaXQgaXMgdXNlZnVsbCBmb3IgdGhlIHVzZXIgdG8KKyAqCUJ1dCBpbiB0aGUgZGVjYWRlIG9mIGF1dG8gc2Vuc2luZyBpdCBpcyB1c2VmdWwgZm9yIHRoZSB1c2VyIHRvCiAgKglrbm93IGlmIHRoZSBtb2RlIHdhcyBuZWdvdGlhdGVkIG9yIGZvcmNlZC4gVGhlcmVmb3JlIHdlIGhhdmUgYQogICoJbG9vayB0byB0aGUgbW9kZSwgd2hpY2ggd2FzIGxhc3QgdXNlZCBieSB0aGUgbmVnb3RpYXRpb24gcHJvY2Vzcy4KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2dlLmMgYi9kcml2ZXJzL25ldC9za2dlLmMKaW5kZXggYjUzOGUzMC4uYmY1NWE0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2tnZS5jCisrKyBiL2RyaXZlcnMvbmV0L3NrZ2UuYwpAQCAtMzI0MywxMiArMzI0MywyMiBAQAogCiAJcGNpX3NldF9tYXN0ZXIocGRldik7CiAKLQlpZiAoIShlcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSkpCisJaWYgKHNpemVvZihkbWFfYWRkcl90KSA+IHNpemVvZih1MzIpICYmCisJICAgICEoZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykpKSB7CiAJCXVzaW5nX2RhYyA9IDE7Ci0JZWxzZSBpZiAoIShlcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXMgbm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uXG4iLAotCQkgICAgICAgcGNpX25hbWUocGRldikpOwotCQlnb3RvIGVycl9vdXRfZnJlZV9yZWdpb25zOworCQllcnIgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spOworCQlpZiAoZXJyIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXMgdW5hYmxlIHRvIG9idGFpbiA2NCBiaXQgRE1BICIKKwkJCSAgICAgICAiZm9yIGNvbnNpc3RlbnQgYWxsb2NhdGlvbnNcbiIsIHBjaV9uYW1lKHBkZXYpKTsKKwkJCWdvdG8gZXJyX291dF9mcmVlX3JlZ2lvbnM7CisJCX0KKwl9IGVsc2UgeworCQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXMgbm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uXG4iLAorCQkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJCWdvdG8gZXJyX291dF9mcmVlX3JlZ2lvbnM7CisJCX0KIAl9CiAKICNpZmRlZiBfX0JJR19FTkRJQU4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NreTIuYyBiL2RyaXZlcnMvbmV0L3NreTIuYwppbmRleCBmNWQ2OTdjLi5mOGI5NzNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za3kyLmMKKysrIGIvZHJpdmVycy9uZXQvc2t5Mi5jCkBAIC01Nyw3ICs1Nyw3IEBACiAjaW5jbHVkZSAic2t5Mi5oIgogCiAjZGVmaW5lIERSVl9OQU1FCQkic2t5MiIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JCSIwLjExIgorI2RlZmluZSBEUlZfVkVSU0lPTgkJIjAuMTMiCiAjZGVmaW5lIFBGWAkJCURSVl9OQU1FICIgIgogCiAvKgpAQCAtNzUsNiArNzUsNyBAQAogI2RlZmluZSBSWF9MRV9CWVRFUwkJKFJYX0xFX1NJWkUqc2l6ZW9mKHN0cnVjdCBza3kyX3J4X2xlKSkKICNkZWZpbmUgUlhfTUFYX1BFTkRJTkcJCShSWF9MRV9TSVpFLzIgLSAyKQogI2RlZmluZSBSWF9ERUZfUEVORElORwkJUlhfTUFYX1BFTkRJTkcKKyNkZWZpbmUgUlhfU0tCX0FMSUdOCQk4CiAKICNkZWZpbmUgVFhfUklOR19TSVpFCQk1MTIKICNkZWZpbmUgVFhfREVGX1BFTkRJTkcJCShUWF9SSU5HX1NJWkUgLSAxKQpAQCAtOTEsNyArOTIsNyBAQAogc3RhdGljIGNvbnN0IHUzMiBkZWZhdWx0X21zZyA9CiAgICAgTkVUSUZfTVNHX0RSViB8IE5FVElGX01TR19QUk9CRSB8IE5FVElGX01TR19MSU5LCiAgICAgfCBORVRJRl9NU0dfVElNRVIgfCBORVRJRl9NU0dfVFhfRVJSIHwgTkVUSUZfTVNHX1JYX0VSUgotICAgIHwgTkVUSUZfTVNHX0lGVVAgfCBORVRJRl9NU0dfSUZET1dOIHwgTkVUSUZfTVNHX0lOVFI7CisgICAgfCBORVRJRl9NU0dfSUZVUCB8IE5FVElGX01TR19JRkRPV047CiAKIHN0YXRpYyBpbnQgZGVidWcgPSAtMTsJCS8qIGRlZmF1bHRzIGFib3ZlICovCiBtb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CkBAIC02MjQsMTMgKzYyNSwxNiBAQAogCiB9CiAKLXN0YXRpYyB2b2lkIHNreTJfcmFtc2V0KHN0cnVjdCBza3kyX2h3ICpodywgdTE2IHEsIHUzMiBzdGFydCwgc2l6ZV90IGxlbikKKy8qIEFzc2lnbiBSYW0gQnVmZmVyIGFsbG9jYXRpb24uCisgKiBzdGFydCBhbmQgZW5kIGFyZSBpbiB1bml0cyBvZiA0ayBieXRlcworICogcmFtIHJlZ2lzdGVycyBhcmUgaW4gdW5pdHMgb2YgNjRiaXQgd29yZHMKKyAqLworc3RhdGljIHZvaWQgc2t5Ml9yYW1zZXQoc3RydWN0IHNreTJfaHcgKmh3LCB1MTYgcSwgdTggc3RhcnRrLCB1OCBlbmRrKQogewotCXUzMiBlbmQ7CisJdTMyIHN0YXJ0LCBlbmQ7CiAKLQlzdGFydCAvPSA4OwotCWxlbiAvPSA4OwotCWVuZCA9IHN0YXJ0ICsgbGVuIC0gMTsKKwlzdGFydCA9IHN0YXJ0ayAqIDQwOTYvODsKKwllbmQgPSAoZW5kayAqIDQwOTYvOCkgLSAxOwogCiAJc2t5Ml93cml0ZTgoaHcsIFJCX0FERFIocSwgUkJfQ1RSTCksIFJCX1JTVF9DTFIpOwogCXNreTJfd3JpdGUzMihodywgUkJfQUREUihxLCBSQl9TVEFSVCksIHN0YXJ0KTsKQEAgLTYzOSwxNCArNjQzLDE5IEBACiAJc2t5Ml93cml0ZTMyKGh3LCBSQl9BRERSKHEsIFJCX1JQKSwgc3RhcnQpOwogCiAJaWYgKHEgPT0gUV9SMSB8fCBxID09IFFfUjIpIHsKLQkJdTMyIHJ4dXAsIHJ4bG87CisJCXUzMiBzcGFjZSA9IChlbmRrIC0gc3RhcnRrKSAqIDQwOTYvODsKKwkJdTMyIHRwID0gc3BhY2UgLSBzcGFjZS80OwogCi0JCXJ4bG8gPSBsZW4vMjsKLQkJcnh1cCA9IHJ4bG8gKyBsZW4vNDsKKwkJLyogT24gcmVjZWl2ZSBxdWV1ZSdzIHNldCB0aGUgdGhyZXNob2xkcworCQkgKiBnaXZlIHJlY2VpdmVyIHByaW9yaXR5IHdoZW4gPiAzLzQgZnVsbAorCQkgKiBzZW5kIHBhdXNlIHdoZW4gZG93biB0byAySworCQkgKi8KKwkJc2t5Ml93cml0ZTMyKGh3LCBSQl9BRERSKHEsIFJCX1JYX1VUSFApLCB0cCk7CisJCXNreTJfd3JpdGUzMihodywgUkJfQUREUihxLCBSQl9SWF9MVEhQKSwgc3BhY2UvMik7CiAKLQkJLyogU2V0IHRocmVzaG9sZHMgb24gcmVjZWl2ZSBxdWV1ZSdzICovCi0JCXNreTJfd3JpdGUzMihodywgUkJfQUREUihxLCBSQl9SWF9VVFBQKSwgcnh1cCk7Ci0JCXNreTJfd3JpdGUzMihodywgUkJfQUREUihxLCBSQl9SWF9MVFBQKSwgcnhsbyk7CisJCXRwID0gc3BhY2UgLSAyMDQ4Lzg7CisJCXNreTJfd3JpdGUzMihodywgUkJfQUREUihxLCBSQl9SWF9VVFBQKSwgdHApOworCQlza3kyX3dyaXRlMzIoaHcsIFJCX0FERFIocSwgUkJfUlhfTFRQUCksIHNwYWNlLzQpOwogCX0gZWxzZSB7CiAJCS8qIEVuYWJsZSBzdG9yZSAmIGZvcndhcmQgb24gVHggcXVldWUncyBiZWNhdXNlCiAJCSAqIFR4IEZJRk8gaXMgb25seSAxSyBvbiBZdWtvbgpAQCAtNjk1LDkgKzcwNCwxMCBAQAogICogVGhpcyBpcyBhIHdvcmthcm91bmQgY29kZSB0YWtlbiBmcm9tIFN5c0tvbm5lY3Qgc2s5OGxpbiBkcml2ZXIKICAqIHRvIGRlYWwgd2l0aCBjaGlwIGJ1ZyBvbiBZdWtvbiBFQyByZXYgMCBpbiB0aGUgd3JhcGFyb3VuZCBjYXNlLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc2t5Ml9wdXRfaWR4KHN0cnVjdCBza3kyX2h3ICpodywgdW5zaWduZWQgcSwKK3N0YXRpYyB2b2lkIHNreTJfcHV0X2lkeChzdHJ1Y3Qgc2t5Ml9odyAqaHcsIHVuc2lnbmVkIHEsCiAJCQkJdTE2IGlkeCwgdTE2ICpsYXN0LCB1MTYgc2l6ZSkKIHsKKwl3bWIoKTsKIAlpZiAoaXNfZWNfYTEoaHcpICYmIGlkeCA8ICpsYXN0KSB7CiAJCXUxNiBod2dldCA9IHNreTJfcmVhZDE2KGh3LCBZMl9RQUREUihxLCBQUkVGX1VOSVRfR0VUX0lEWCkpOwogCkBAIC03MjEsNiArNzMxLDcgQEAKIAkJc2t5Ml93cml0ZTE2KGh3LCBZMl9RQUREUihxLCBQUkVGX1VOSVRfUFVUX0lEWCksIGlkeCk7CiAJfQogCSpsYXN0ID0gaWR4OworCW1taW93YigpOwogfQogCiAKQEAgLTczNCwxMSArNzQ1LDExIEBACiAvKiBSZXR1cm4gaGlnaCBwYXJ0IG9mIERNQSBhZGRyZXNzIChjb3VsZCBiZSAzMiBvciA2NCBiaXQpICovCiBzdGF0aWMgaW5saW5lIHUzMiBoaWdoMzIoZG1hX2FkZHJfdCBhKQogewotCXJldHVybiAoYSA+PiAxNikgPj4gMTY7CisJcmV0dXJuIHNpemVvZihhKSA+IHNpemVvZih1MzIpID8gKGEgPj4gMTYpID4+IDE2IDogMDsKIH0KIAogLyogQnVpbGQgZGVzY3JpcHRpb24gdG8gaGFyZHdhcmUgYWJvdXQgYnVmZmVyICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc2t5Ml9yeF9hZGQoc3RydWN0IHNreTJfcG9ydCAqc2t5MiwgZG1hX2FkZHJfdCBtYXApCitzdGF0aWMgdm9pZCBza3kyX3J4X2FkZChzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyLCBkbWFfYWRkcl90IG1hcCkKIHsKIAlzdHJ1Y3Qgc2t5Ml9yeF9sZSAqbGU7CiAJdTMyIGhpID0gaGlnaDMyKG1hcCk7CkBAIC04NzgsMTMgKzg4OSwxMyBAQAogCXN0cnVjdCBza3kyX2h3ICpodyA9IHNreTItPmh3OwogCXUxNiBwb3J0ID0gc2t5Mi0+cG9ydDsKIAotCXNwaW5fbG9jaygmc2t5Mi0+dHhfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZza3kyLT50eF9sb2NrKTsKIAogCXNreTJfd3JpdGUzMihodywgU0tfUkVHKHBvcnQsIFJYX0dNRl9DVFJMX1QpLCBSWF9WTEFOX1NUUklQX09OKTsKIAlza3kyX3dyaXRlMzIoaHcsIFNLX1JFRyhwb3J0LCBUWF9HTUZfQ1RSTF9UKSwgVFhfVkxBTl9UQUdfT04pOwogCXNreTItPnZsZ3JwID0gZ3JwOwogCi0Jc3Bpbl91bmxvY2soJnNreTItPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZza3kyLT50eF9sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgc2t5Ml92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKQEAgLTg5MywyNyArOTA0LDQyIEBACiAJc3RydWN0IHNreTJfaHcgKmh3ID0gc2t5Mi0+aHc7CiAJdTE2IHBvcnQgPSBza3kyLT5wb3J0OwogCi0Jc3Bpbl9sb2NrKCZza3kyLT50eF9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNreTItPnR4X2xvY2spOwogCiAJc2t5Ml93cml0ZTMyKGh3LCBTS19SRUcocG9ydCwgUlhfR01GX0NUUkxfVCksIFJYX1ZMQU5fU1RSSVBfT0ZGKTsKIAlza3kyX3dyaXRlMzIoaHcsIFNLX1JFRyhwb3J0LCBUWF9HTUZfQ1RSTF9UKSwgVFhfVkxBTl9UQUdfT0ZGKTsKIAlpZiAoc2t5Mi0+dmxncnApCiAJCXNreTItPnZsZ3JwLT52bGFuX2RldmljZXNbdmlkXSA9IE5VTEw7CiAKLQlzcGluX3VubG9jaygmc2t5Mi0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNreTItPnR4X2xvY2spOwogfQogI2VuZGlmCiAKIC8qCisgKiBJdCBhcHBlYXJzIHRoZSBoYXJkd2FyZSBoYXMgYSBidWcgaW4gdGhlIEZJRk8gbG9naWMgdGhhdAorICogY2F1c2UgaXQgdG8gaGFuZyBpZiB0aGUgRklGTyBnZXRzIG92ZXJydW4gYW5kIHRoZSByZWNlaXZlIGJ1ZmZlcgorICogaXMgbm90IGFsaWduZWQuIEFMc28gYWxsb2Nfc2tiKCkgd29uJ3QgYWxpZ24gcHJvcGVybHkgaWYgc2xhYgorICogZGVidWdnaW5nIGlzIGVuYWJsZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnNreTJfYWxsb2Nfc2tiKHVuc2lnbmVkIGludCBzaXplLCBnZnBfdCBnZnBfbWFzaykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2tiID0gYWxsb2Nfc2tiKHNpemUgKyBSWF9TS0JfQUxJR04sIGdmcF9tYXNrKTsKKwlpZiAobGlrZWx5KHNrYikpIHsKKwkJdW5zaWduZWQgbG9uZyBwCT0gKHVuc2lnbmVkIGxvbmcpIHNrYi0+ZGF0YTsKKwkJc2tiX3Jlc2VydmUoc2tiLAorCQkJKChwICsgUlhfU0tCX0FMSUdOIC0gMSkgJiB+KFJYX1NLQl9BTElHTiAtIDEpKSAtIHApOworCX0KKworCXJldHVybiBza2I7Cit9CisKKy8qCiAgKiBBbGxvY2F0ZSBhbmQgc2V0dXAgcmVjZWl2ZXIgYnVmZmVyIHBvb2wuCiAgKiBJbiBjYXNlIG9mIDY0IGJpdCBkbWEsIHRoZXJlIGFyZSAyWCBhcyBtYW55IGxpc3QgZWxlbWVudHMKICAqIGF2YWlsYWJsZSBhcyByaW5nIGVudHJpZXMKICAqIGFuZCBuZWVkIHRvIHJlc2VydmUgb25lIGxpc3QgZWxlbWVudCBzbyB3ZSBkb24ndCB3cmFwIGFyb3VuZC4KLSAqCi0gKiBJdCBhcHBlYXJzIHRoZSBoYXJkd2FyZSBoYXMgYSBidWcgaW4gdGhlIEZJRk8gbG9naWMgdGhhdAotICogY2F1c2UgaXQgdG8gaGFuZyBpZiB0aGUgRklGTyBnZXRzIG92ZXJydW4gYW5kIHRoZSByZWNlaXZlIGJ1ZmZlcgotICogaXMgbm90IGFsaWduZWQuICBUaGlzIG1lYW5zIHdlIGNhbid0IHVzZSBza2JfcmVzZXJ2ZSB0byBhbGlnbgotICogdGhlIElQIGhlYWRlci4KICAqLwogc3RhdGljIGludCBza3kyX3J4X3N0YXJ0KHN0cnVjdCBza3kyX3BvcnQgKnNreTIpCiB7CkBAIC05MjksNyArOTU1LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgc2t5Mi0+cnhfcGVuZGluZzsgaSsrKSB7CiAJCXN0cnVjdCByaW5nX2luZm8gKnJlID0gc2t5Mi0+cnhfcmluZyArIGk7CiAKLQkJcmUtPnNrYiA9IGRldl9hbGxvY19za2Ioc2t5Mi0+cnhfYnVmc2l6ZSk7CisJCXJlLT5za2IgPSBza3kyX2FsbG9jX3NrYihza3kyLT5yeF9idWZzaXplLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFyZS0+c2tiKQogCQkJZ290byBub21lbTsKIApAQCAtOTg2LDE5ICsxMDEyLDE5IEBACiAKIAlza3kyX21hY19pbml0KGh3LCBwb3J0KTsKIAotCS8qIENvbmZpZ3VyZSBSQU0gYnVmZmVycyAqLwotCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0ZFIHx8Ci0JICAgIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0VDICYmIGh3LT5jaGlwX3JldiA9PSAyKSkKLQkJcmFtc2l6ZSA9IDQwOTY7Ci0JZWxzZSB7Ci0JCXU4IGUwID0gc2t5Ml9yZWFkOChodywgQjJfRV8wKTsKLQkJcmFtc2l6ZSA9IChlMCA9PSAwKSA/ICgxMjggKiAxMDI0KSA6IChlMCAqIDQwOTYpOwotCX0KKwkvKiBEZXRlcm1pbmUgYXZhaWxhYmxlIHJhbSBidWZmZXIgc3BhY2UgKGluIDRLIGJsb2NrcykuCisJICogTm90ZTogbm90IHN1cmUgYWJvdXQgdGhlIEZFIHNldHRpbmcgYmVsb3cgeWV0CisJICovCisJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRkUpCisJCXJhbXNpemUgPSA0OworCWVsc2UKKwkJcmFtc2l6ZSA9IHNreTJfcmVhZDgoaHcsIEIyX0VfMCk7CiAKLQkvKiAyLzMgZm9yIFJ4ICovCi0JcnhzcGFjZSA9ICgyICogcmFtc2l6ZSkgLyAzOworCS8qIEdpdmUgdHJhbnNtaXR0ZXIgb25lIHRoaXJkIChyb3VuZGVkIHVwKSAqLworCXJ4c3BhY2UgPSByYW1zaXplIC0gKHJhbXNpemUgKyAyKSAvIDM7CisKIAlza3kyX3JhbXNldChodywgcnhxYWRkcltwb3J0XSwgMCwgcnhzcGFjZSk7Ci0Jc2t5Ml9yYW1zZXQoaHcsIHR4cWFkZHJbcG9ydF0sIHJ4c3BhY2UsIHJhbXNpemUgLSByeHNwYWNlKTsKKwlza3kyX3JhbXNldChodywgdHhxYWRkcltwb3J0XSwgcnhzcGFjZSwgcmFtc2l6ZSk7CiAKIAkvKiBNYWtlIHN1cmUgU3luY1EgaXMgZGlzYWJsZWQgKi8KIAlza3kyX3dyaXRlOChodywgUkJfQUREUihwb3J0ID09IDAgPyBRX1hTMSA6IFFfWFMyLCBSQl9DVFJMKSwKQEAgLTEwNTQsNyArMTA4MCw3IEBACiB9CiAKIC8qIEVzdGltYXRlIG9mIG51bWJlciBvZiB0cmFuc21pdCBsaXN0IGVsZW1lbnRzIHJlcXVpcmVkICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHR4X2xlX3JlcShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHVuc2lnbmVkIHR4X2xlX3JlcShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXVuc2lnbmVkIGNvdW50OwogCkBAIC0xMDkwLDYgKzExMTYsMTAgQEAKIAl1MTYgbXNzOwogCXU4IGN0cmw7CiAKKwkvKiBObyBCSCBkaXNhYmxpbmcgZm9yIHR4X2xvY2sgaGVyZS4gIFdlIGFyZSBydW5uaW5nIGluIEJIIGRpc2FibGVkCisJICogY29udGV4dCBhbmQgVFggcmVjbGFpbSBydW5zIHZpYSBwb2xsIGluc2lkZSBvZiBhIHNvZnR3YXJlCisJICogaW50ZXJydXB0LCBhbmQgbm8gcmVsYXRlZCBsb2NrcyBpbiBJUlEgcHJvY2Vzc2luZy4KKwkgKi8KIAlpZiAoIXNwaW5fdHJ5bG9jaygmc2t5Mi0+dHhfbG9jaykpCiAJCXJldHVybiBORVRERVZfVFhfTE9DS0VEOwogCkBAIC0xMDk5LDggKzExMjksOSBAQAogCQkgKi8KIAkJaWYgKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKIAkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICIlczogcmluZyBmdWxsIHdoZW4gcXVldWUgYXdha2UhXG4iLAotCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICIlczogcmluZyBmdWxsIHdoZW4gcXVldWUgYXdha2UhXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOwogCQl9CiAJCXNwaW5fdW5sb2NrKCZza3kyLT50eF9sb2NrKTsKIApAQCAtMTE5OSw3ICsxMjMwLDcgQEAKIAogCQltYXBwaW5nID0gcGNpX21hcF9wYWdlKGh3LT5wZGV2LCBmcmFnLT5wYWdlLCBmcmFnLT5wYWdlX29mZnNldCwKIAkJCQkgICAgICAgZnJhZy0+c2l6ZSwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCWFkZHI2NCA9IChtYXBwaW5nID4+IDE2KSA+PiAxNjsKKwkJYWRkcjY0ID0gaGlnaDMyKG1hcHBpbmcpOwogCQlpZiAoYWRkcjY0ICE9IHNreTItPnR4X2FkZHI2NCkgewogCQkJbGUgPSBnZXRfdHhfbGUoc2t5Mik7CiAJCQlsZS0+dHguYWRkciA9IGNwdV90b19sZTMyKGFkZHI2NCk7CkBAIC0xMjI5LDcgKzEyNjAsNiBAQAogCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAKIG91dF91bmxvY2s6Ci0JbW1pb3diKCk7CiAJc3Bpbl91bmxvY2soJnNreTItPnR4X2xvY2spOwogCiAJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CkBAIC0xMjgyLDE3ICsxMzEyLDE3IEBACiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJfQogCi0Jc3Bpbl9sb2NrKCZza3kyLT50eF9sb2NrKTsKIAlza3kyLT50eF9jb25zID0gcHV0OwogCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYgdHhfYXZhaWwoc2t5MikgPiBNQVhfU0tCX1RYX0xFKQogCQluZXRpZl93YWtlX3F1ZXVlKGRldik7Ci0Jc3Bpbl91bmxvY2soJnNreTItPnR4X2xvY2spOwogfQogCiAvKiBDbGVhbnVwIGFsbCB1bnRyYW5zbWl0dGVkIGJ1ZmZlcnMsIGFzc3VtZSB0cmFuc21pdHRlciBub3QgcnVubmluZyAqLwogc3RhdGljIHZvaWQgc2t5Ml90eF9jbGVhbihzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyKQogeworCXNwaW5fbG9ja19iaCgmc2t5Mi0+dHhfbG9jayk7CiAJc2t5Ml90eF9jb21wbGV0ZShza3kyLCBza3kyLT50eF9wcm9kKTsKKwlzcGluX3VubG9ja19iaCgmc2t5Mi0+dHhfbG9jayk7CiB9CiAKIC8qIE5ldHdvcmsgc2h1dGRvd24gKi8KQEAgLTE1ODIsMjggKzE2MTIsNDAgQEAKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiB9CiAKKworLyogVHJhbnNtaXQgdGltZW91dCBpcyBvbmx5IGNhbGxlZCBpZiB3ZSBhcmUgcnVubmluZywgY2FycmllcyBpcyB1cAorICogYW5kIHR4IHF1ZXVlIGlzIGZ1bGwgKHN0b3BwZWQpLgorICovCiBzdGF0aWMgdm9pZCBza3kyX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3Qgc2t5Ml9odyAqaHcgPSBza3kyLT5odzsKIAl1bnNpZ25lZCB0eHEgPSB0eHFhZGRyW3NreTItPnBvcnRdOworCXUxNiByaWR4OworCisJLyogTWF5YmUgd2UganVzdCBtaXNzZWQgYW4gc3RhdHVzIGludGVycnVwdCAqLworCXNwaW5fbG9jaygmc2t5Mi0+dHhfbG9jayk7CisJcmlkeCA9IHNreTJfcmVhZDE2KGh3LAorCQkJICAgc2t5Mi0+cG9ydCA9PSAwID8gU1RBVF9UWEExX1JJRFggOiBTVEFUX1RYQTJfUklEWCk7CisJc2t5Ml90eF9jb21wbGV0ZShza3kyLCByaWR4KTsKKwlzcGluX3VubG9jaygmc2t5Mi0+dHhfbG9jayk7CisKKwlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJfaW5mbyhQRlggInRyYW5zbWl0IGludGVycnVwdCBtaXNzZWQ/IHJlY292ZXJlZFxuIik7CisJCXJldHVybjsKKwl9CiAKIAlpZiAobmV0aWZfbXNnX3RpbWVyKHNreTIpKQogCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogdHggdGltZW91dFxuIiwgZGV2LT5uYW1lKTsKIAotCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQogCXNreTJfd3JpdGUzMihodywgUV9BRERSKHR4cSwgUV9DU1IpLCBCTVVfU1RPUCk7Ci0Jc2t5Ml9yZWFkMzIoaHcsIFFfQUREUih0eHEsIFFfQ1NSKSk7Ci0KIAlza3kyX3dyaXRlMzIoaHcsIFkyX1FBRERSKHR4cSwgUFJFRl9VTklUX0NUUkwpLCBQUkVGX1VOSVRfUlNUX1NFVCk7CiAKIAlza3kyX3R4X2NsZWFuKHNreTIpOwogCiAJc2t5Ml9xc2V0KGh3LCB0eHEpOwogCXNreTJfcHJlZmV0Y2hfaW5pdChodywgdHhxLCBza3kyLT50eF9sZV9tYXAsIFRYX1JJTkdfU0laRSAtIDEpOwotCi0JbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwogfQogCiAKQEAgLTE3MTMsNyArMTc1NSw3IEBACiAJfSBlbHNlIHsKIAkJc3RydWN0IHNrX2J1ZmYgKm5za2I7CiAKLQkJbnNrYiA9IGRldl9hbGxvY19za2Ioc2t5Mi0+cnhfYnVmc2l6ZSk7CisJCW5za2IgPSBza3kyX2FsbG9jX3NrYihza3kyLT5yeF9idWZzaXplLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFuc2tiKQogCQkJZ290byByZXN1Ym1pdDsKIApAQCAtMTc0NSw3ICsxNzg3LDcgQEAKIGVycm9yOgogCSsrc2t5Mi0+bmV0X3N0YXRzLnJ4X2Vycm9yczsKIAotCWlmIChuZXRpZl9tc2dfcnhfZXJyKHNreTIpKQorCWlmIChuZXRpZl9tc2dfcnhfZXJyKHNreTIpICYmIG5ldF9yYXRlbGltaXQoKSkKIAkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiByeCBlcnJvciwgc3RhdHVzIDB4JXggbGVuZ3RoICVkXG4iLAogCQkgICAgICAgc2t5Mi0+bmV0ZGV2LT5uYW1lLCBzdGF0dXMsIGxlbmd0aCk7CiAKQEAgLTE3NjYsMTMgKzE4MDgsMTYgQEAKICAqLwogI2RlZmluZSBUWF9OT19TVEFUVVMJMHhmZmZmCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBza3kyX3R4X2NoZWNrKHN0cnVjdCBza3kyX2h3ICpodywgaW50IHBvcnQsIHUxNiBsYXN0KQorc3RhdGljIHZvaWQgc2t5Ml90eF9jaGVjayhzdHJ1Y3Qgc2t5Ml9odyAqaHcsIGludCBwb3J0LCB1MTYgbGFzdCkKIHsKIAlpZiAobGFzdCAhPSBUWF9OT19TVEFUVVMpIHsKIAkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGh3LT5kZXZbcG9ydF07CiAJCWlmIChkZXYgJiYgbmV0aWZfcnVubmluZyhkZXYpKSB7CiAJCQlzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCQkJc3Bpbl9sb2NrKCZza3kyLT50eF9sb2NrKTsKIAkJCXNreTJfdHhfY29tcGxldGUoc2t5MiwgbGFzdCk7CisJCQlzcGluX3VubG9jaygmc2t5Mi0+dHhfbG9jayk7CiAJCX0KIAl9CiB9CkBAIC0xODAwLDcgKzE4NDUsNiBAQAogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCQl1MzIgc3RhdHVzOwogCQl1MTYgbGVuZ3RoOwotCQl1OCBvcDsKIAogCQlsZSA9IGh3LT5zdF9sZSArIGh3LT5zdF9pZHg7CiAJCWh3LT5zdF9pZHggPSAoaHctPnN0X2lkeCArIDEpICUgU1RBVFVTX1JJTkdfU0laRTsKQEAgLTE4MTQsMTAgKzE4NTgsOCBAQAogCQlza3kyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAkJc3RhdHVzID0gbGUzMl90b19jcHUobGUtPnN0YXR1cyk7CiAJCWxlbmd0aCA9IGxlMTZfdG9fY3B1KGxlLT5sZW5ndGgpOwotCQlvcCA9IGxlLT5vcGNvZGUgJiB+SFdfT1dORVI7Ci0JCWxlLT5vcGNvZGUgPSAwOwogCi0JCXN3aXRjaCAob3ApIHsKKwkJc3dpdGNoIChsZS0+b3Bjb2RlICYgfkhXX09XTkVSKSB7CiAJCWNhc2UgT1BfUlhTVEFUOgogCQkJc2tiID0gc2t5Ml9yZWNlaXZlKHNreTIsIGxlbmd0aCwgc3RhdHVzKTsKIAkJCWlmICghc2tiKQpAQCAtMTg2NSwxNCArMTkwNywxMyBAQAogCQlkZWZhdWx0OgogCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWAotCQkJCSAgICAgICAidW5rbm93biBzdGF0dXMgb3Bjb2RlIDB4JXhcbiIsIG9wKTsKKwkJCQkgICAgICAgInVua25vd24gc3RhdHVzIG9wY29kZSAweCV4XG4iLCBsZS0+b3Bjb2RlKTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCiBleGl0X2xvb3A6CiAJc2t5Ml93cml0ZTMyKGh3LCBTVEFUX0NUUkwsIFNDX1NUQVRfQ0xSX0lSUSk7Ci0JbW1pb3diKCk7CiAKIAlza3kyX3R4X2NoZWNrKGh3LCAwLCB0eF9kb25lWzBdKTsKIAlza3kyX3R4X2NoZWNrKGh3LCAxLCB0eF9kb25lWzFdKTsKQEAgLTE4ODcsNyArMTkyOCw2IEBACiAJCW5ldGlmX3J4X2NvbXBsZXRlKGRldjApOwogCQlody0+aW50cl9tYXNrIHw9IFkyX0lTX1NUQVRfQk1VOwogCQlza3kyX3dyaXRlMzIoaHcsIEIwX0lNU0ssIGh3LT5pbnRyX21hc2spOwotCQltbWlvd2IoKTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIHsKIAkJKmJ1ZGdldCAtPSB3b3JrX2RvbmU7CkBAIC0xOTAwLDM1ICsxOTQwLDQyIEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGh3LT5kZXZbcG9ydF07CiAKLQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6IGh3IGVycm9yIGludGVycnVwdCBzdGF0dXMgMHgleFxuIiwKLQkgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMpOworCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCXByaW50ayhLRVJOX0lORk8gUEZYICIlczogaHcgZXJyb3IgaW50ZXJydXB0IHN0YXR1cyAweCV4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMpOwogCiAJaWYgKHN0YXR1cyAmIFkyX0lTX1BBUl9SRDEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IHJhbSBkYXRhIHJlYWQgcGFyaXR5IGVycm9yXG4iLAotCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiByYW0gZGF0YSByZWFkIHBhcml0eSBlcnJvclxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOwogCQkvKiBDbGVhciBJUlEgKi8KIAkJc2t5Ml93cml0ZTE2KGh3LCBSQU1fQlVGRkVSKHBvcnQsIEIzX1JJX0NUUkwpLCBSSV9DTFJfUkRfUEVSUik7CiAJfQogCiAJaWYgKHN0YXR1cyAmIFkyX0lTX1BBUl9XUjEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IHJhbSBkYXRhIHdyaXRlIHBhcml0eSBlcnJvclxuIiwKLQkJICAgICAgIGRldi0+bmFtZSk7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogcmFtIGRhdGEgd3JpdGUgcGFyaXR5IGVycm9yXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CiAKIAkJc2t5Ml93cml0ZTE2KGh3LCBSQU1fQlVGRkVSKHBvcnQsIEIzX1JJX0NUUkwpLCBSSV9DTFJfV1JfUEVSUik7CiAJfQogCiAJaWYgKHN0YXR1cyAmIFkyX0lTX1BBUl9NQUMxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBNQUMgcGFyaXR5IGVycm9yXG4iLCBkZXYtPm5hbWUpOworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IE1BQyBwYXJpdHkgZXJyb3JcbiIsIGRldi0+bmFtZSk7CiAJCXNreTJfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgVFhfR01GX0NUUkxfVCksIEdNRl9DTElfVFhfUEUpOwogCX0KIAogCWlmIChzdGF0dXMgJiBZMl9JU19QQVJfUlgxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBSWCBwYXJpdHkgZXJyb3JcbiIsIGRldi0+bmFtZSk7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogUlggcGFyaXR5IGVycm9yXG4iLCBkZXYtPm5hbWUpOwogCQlza3kyX3dyaXRlMzIoaHcsIFFfQUREUihyeHFhZGRyW3BvcnRdLCBRX0NTUiksIEJNVV9DTFJfSVJRX1BBUik7CiAJfQogCiAJaWYgKHN0YXR1cyAmIFkyX0lTX1RDUF9UWEExKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBUQ1Agc2VnbWVudGF0aW9uIGVycm9yXG4iLCBkZXYtPm5hbWUpOworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IFRDUCBzZWdtZW50YXRpb24gZXJyb3JcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKIAkJc2t5Ml93cml0ZTMyKGh3LCBRX0FERFIodHhxYWRkcltwb3J0XSwgUV9DU1IpLCBCTVVfQ0xSX0lSUV9UQ1ApOwogCX0KIH0KQEAgLTE5NDQsOCArMTk5MSw5IEBACiAJCXUxNiBwY2lfZXJyOwogCiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGh3LT5wZGV2LCBQQ0lfU1RBVFVTLCAmcGNpX2Vycik7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBwY2kgaHcgZXJyb3IgKDB4JXgpXG4iLAotCQkgICAgICAgcGNpX25hbWUoaHctPnBkZXYpLCBwY2lfZXJyKTsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBwY2kgaHcgZXJyb3IgKDB4JXgpXG4iLAorCQkJICAgICAgIHBjaV9uYW1lKGh3LT5wZGV2KSwgcGNpX2Vycik7CiAKIAkJc2t5Ml93cml0ZTgoaHcsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PTik7CiAJCXBjaV93cml0ZV9jb25maWdfd29yZChody0+cGRldiwgUENJX1NUQVRVUywKQEAgLTE5NTksOCArMjAwNyw5IEBACiAKIAkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGh3LT5wZGV2LCBQRVhfVU5DX0VSUl9TVEFULCAmcGV4X2Vycik7CiAKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IHBjaSBleHByZXNzIGVycm9yICgweCV4KVxuIiwKLQkJICAgICAgIHBjaV9uYW1lKGh3LT5wZGV2KSwgcGV4X2Vycik7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogcGNpIGV4cHJlc3MgZXJyb3IgKDB4JXgpXG4iLAorCQkJICAgICAgIHBjaV9uYW1lKGh3LT5wZGV2KSwgcGV4X2Vycik7CiAKIAkJLyogY2xlYXIgdGhlIGludGVycnVwdCAqLwogCQlza3kyX3dyaXRlMzIoaHcsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PTik7CkBAIC0yMjUwLDcgKzIyOTksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiBza3kyX3N1cHBvcnRlZF9tb2Rlcyhjb25zdCBzdHJ1Y3Qgc2t5Ml9odyAqaHcpCitzdGF0aWMgdTMyIHNreTJfc3VwcG9ydGVkX21vZGVzKGNvbnN0IHN0cnVjdCBza3kyX2h3ICpodykKIHsKIAl1MzIgbW9kZXM7CiAJaWYgKGh3LT5jb3BwZXIpIHsKQEAgLTI5OTUsNyArMzA0NCw3IEBACiAJcmV0dXJuIGRldjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNreTJfc2hvd19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc2t5Ml9zaG93X2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAljb25zdCBzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIApAQCAtMzAzOCwxMyArMzA4NywxNyBAQAogCQlnb3RvIGVycl9vdXRfZnJlZV9yZWdpb25zOwogCX0KIAotCWlmIChzaXplb2YoZG1hX2FkZHJfdCkgPiBzaXplb2YodTMyKSkgewotCQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKTsKLQkJaWYgKCFlcnIpCi0JCQl1c2luZ19kYWMgPSAxOwotCX0KKwlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gc2l6ZW9mKHUzMikgJiYKKwkgICAgIShlcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSkpIHsKKwkJdXNpbmdfZGFjID0gMTsKKwkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzIHVuYWJsZSB0byBvYnRhaW4gNjQgYml0IERNQSAiCisJCQkgICAgICAgImZvciBjb25zaXN0ZW50IGFsbG9jYXRpb25zXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCQlnb3RvIGVycl9vdXRfZnJlZV9yZWdpb25zOworCQl9CiAKLQlpZiAoIXVzaW5nX2RhYykgeworCX0gZWxzZSB7CiAJCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOwogCQlpZiAoZXJyKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgUEZYICIlcyBubyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb25cbiIsCkBAIC0zMDUyLDYgKzMxMDUsNyBAQAogCQkJZ290byBlcnJfb3V0X2ZyZWVfcmVnaW9uczsKIAkJfQogCX0KKwogI2lmZGVmIF9fQklHX0VORElBTgogCS8qIGJ5dGUgc3dhcCBkZXNjcmlwdG9ycyBpbiBoYXJkd2FyZSAqLwogCXsKQEAgLTMwNjQsMTQgKzMxMTgsMTMgQEAKICNlbmRpZgogCiAJZXJyID0gLUVOT01FTTsKLQlodyA9IGttYWxsb2Moc2l6ZW9mKCpodyksIEdGUF9LRVJORUwpOworCWh3ID0ga3phbGxvYyhzaXplb2YoKmh3KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFodykgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogY2Fubm90IGFsbG9jYXRlIGhhcmR3YXJlIHN0cnVjdFxuIiwKIAkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKIAkJZ290byBlcnJfb3V0X2ZyZWVfcmVnaW9uczsKIAl9CiAKLQltZW1zZXQoaHcsIDAsIHNpemVvZigqaHcpKTsKIAlody0+cGRldiA9IHBkZXY7CiAKIAlody0+cmVncyA9IGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksIDB4NDAwMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbGlwLmMgYi9kcml2ZXJzL25ldC9zbGlwLmMKaW5kZXggNDA0ZWE0Mi4uYjJlMThkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2xpcC5jCisrKyBiL2RyaXZlcnMvbmV0L3NsaXAuYwpAQCAtNjUxLDExICs2NTEsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi1zdGF0aWMgaW50IHNsaXBfcmVjZWl2ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0JcmV0dXJuIDY1NTM2OyAgLyogV2UgY2FuIGhhbmRsZSBhbiBpbmZpbml0ZSBhbW91bnQgb2YgZGF0YS4gOi0pICovCi19Ci0KIC8qCiAgKiBIYW5kbGUgdGhlICdyZWNlaXZlciBkYXRhIHJlYWR5JyBpbnRlcnJ1cHQuCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgJ3R0eV9pbycgbW9kdWxlIGluIHRoZSBrZXJuZWwgd2hlbgpAQCAtODY5LDEwICs4NjQsNiBAQAogCXNsLT5saW5lID0gdHR5X2Rldm51bSh0dHkpOwogCXNsLT5waWQgPSBjdXJyZW50LT5waWQ7CiAJCi0JLyogRklYTUU6IGFscmVhZHkgZG9uZSBiZWZvcmUgd2Ugd2VyZSBjYWxsZWQgLSBzZWVtcyB0aGlzIGNhbiBnbyAqLwotCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQotCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7Ci0JCQogCWlmICghdGVzdF9iaXQoU0xGX0lOVVNFLCAmc2wtPmZsYWdzKSkgewogCQkvKiBQZXJmb3JtIHRoZSBsb3ctbGV2ZWwgU0xJUCBpbml0aWFsaXphdGlvbi4gKi8KIAkJaWYgKChlcnIgPSBzbF9hbGxvY19idWZzKHNsLCBTTF9NVFUpKSAhPSAwKQpAQCAtODk3LDYgKzg4OCw3IEBACiAKIAkvKiBEb25lLiAgV2UgaGF2ZSBsaW5rZWQgdGhlIFRUWSBsaW5lIHRvIGEgY2hhbm5lbC4gKi8KIAlydG5sX3VubG9jaygpOworCXR0eS0+cmVjZWl2ZV9yb29tID0gNjU1MzY7CS8qIFdlIGRvbid0IGZsb3cgY29udHJvbCAqLwogCXJldHVybiBzbC0+ZGV2LT5iYXNlX2FkZHI7CiAKIGVycl9mcmVlX2J1ZnM6CkBAIC0xMzI5LDcgKzEzMjEsNiBAQAogCS5jbG9zZQkgCT0gc2xpcF9jbG9zZSwKIAkuaW9jdGwJCT0gc2xpcF9pb2N0bCwKIAkucmVjZWl2ZV9idWYJPSBzbGlwX3JlY2VpdmVfYnVmLAotCS5yZWNlaXZlX3Jvb20JPSBzbGlwX3JlY2VpdmVfcm9vbSwKIAkud3JpdGVfd2FrZXVwCT0gc2xpcF93cml0ZV93YWtldXAsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWMtdWx0cmEuYyBiL2RyaXZlcnMvbmV0L3NtYy11bHRyYS5jCmluZGV4IGJhODU5M2FjLi4zZGIzMGNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbWMtdWx0cmEuYworKysgYi9kcml2ZXJzL25ldC9zbWMtdWx0cmEuYwpAQCAtMTY4LDE4ICsxNjgsNiBAQAogCXJldHVybiAtRU5PREVWOwogfQogCi1zdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQkvKiBOQjogdWx0cmFfY2xvc2VfY2FyZCgpIGRvZXMgZnJlZV9pcnEgKi8KLSNpZmRlZiBfX0lTQVBOUF9fCi0Jc3RydWN0IHBucF9kZXYgKmlkZXYgPSAoc3RydWN0IHBucF9kZXYgKillaV9zdGF0dXMucHJpdjsKLQlpZiAoaWRldikKLQkJcG5wX2RldmljZV9kZXRhY2goaWRldik7Ci0jZW5kaWYKLQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciAtIFVMVFJBX05JQ19PRkZTRVQsIFVMVFJBX0lPX0VYVEVOVCk7Ci0JaW91bm1hcChlaV9zdGF0dXMubWVtKTsKLX0KLQogI2lmbmRlZiBNT0RVTEUKIHN0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IHVsdHJhX3Byb2JlKGludCB1bml0KQogewpAQCAtNTk0LDYgKzU4MiwxOCBAQAogCXJldHVybiAtRU5YSU87CiB9CiAKK3N0YXRpYyB2b2lkIGNsZWFudXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIE5COiB1bHRyYV9jbG9zZV9jYXJkKCkgZG9lcyBmcmVlX2lycSAqLworI2lmZGVmIF9fSVNBUE5QX18KKwlzdHJ1Y3QgcG5wX2RldiAqaWRldiA9IChzdHJ1Y3QgcG5wX2RldiAqKWVpX3N0YXR1cy5wcml2OworCWlmIChpZGV2KQorCQlwbnBfZGV2aWNlX2RldGFjaChpZGV2KTsKKyNlbmRpZgorCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyIC0gVUxUUkFfTklDX09GRlNFVCwgVUxUUkFfSU9fRVhURU5UKTsKKwlpb3VubWFwKGVpX3N0YXR1cy5tZW0pOworfQorCiB2b2lkCiBjbGVhbnVwX21vZHVsZSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21jOTF4LmMgYi9kcml2ZXJzL25ldC9zbWM5MXguYwppbmRleCAyOGJmMmU2Li43ZWMwODEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbWM5MXguYworKysgYi9kcml2ZXJzL25ldC9zbWM5MXguYwpAQCAtODgsNyArODgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgogCiAjaW5jbHVkZSAic21jOTF4LmgiCiAKQEAgLTIwMDcsMTIgKzIwMDYsMTAgQEAKIAl9CiAKIAkvKiBHcmFiIHRoZSBJUlEgKi8KLSAgICAgIAlyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJnNtY19pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KTsKKyAgICAgIAlyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJnNtY19pbnRlcnJ1cHQsIFNNQ19JUlFfRkxBR1MsIGRldi0+bmFtZSwgZGV2KTsKICAgICAgIAlpZiAocmV0dmFsKQogICAgICAgCQlnb3RvIGVycl9vdXQ7CiAKLQlzZXRfaXJxX3R5cGUoZGV2LT5pcnEsIFNNQ19JUlFfVFJJR0dFUl9UWVBFKTsKLQogI2lmZGVmIFNNQ19VU0VfUFhBX0RNQQogCXsKIAkJaW50IGRtYSA9IHB4YV9yZXF1ZXN0X2RtYShkZXYtPm5hbWUsIERNQV9QUklPX0xPVywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYzkxeC5oIGIvZHJpdmVycy9uZXQvc21jOTF4LmgKaW5kZXggNWMyODI0Yi4uZTBlZmQxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jOTF4LmgKKysrIGIvZHJpdmVycy9uZXQvc21jOTF4LmgKQEAgLTkwLDcgKzkwLDcgQEAKIAkJCV9fbC0tOwkJCQkJCVwKIAkJfQkJCQkJCQlcCiAJfSB3aGlsZSAoMCkKLSNkZWZpbmUgc2V0X2lycV90eXBlKGlycSwgdHlwZSkKKyNkZWZpbmUgU01DX0lSUV9GTEFHUwkJKDApCiAKICNlbGlmIGRlZmluZWQoQ09ORklHX1NBMTEwMF9QTEVCKQogLyogV2UgY2FuIG9ubHkgZG8gMTYtYml0IHJlYWRzIGFuZCB3cml0ZXMgaW4gdGhlIHN0YXRpYyBtZW1vcnkgc3BhY2UuICovCkBAIC0xMDksNyArMTA5LDcgQEAKICNkZWZpbmUgU01DX291dHcodiwgYSwgcikJd3JpdGV3KHYsIChhKSArIChyKSkKICNkZWZpbmUgU01DX291dHN3KGEsIHIsIHAsIGwpCXdyaXRlc3coKGEpICsgKHIpLCBwLCBsKQogCi0jZGVmaW5lIHNldF9pcnFfdHlwZShpcnEsIHR5cGUpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBTTUNfSVJRX0ZMQUdTCQkoMCkKIAogI2VsaWYgZGVmaW5lZChDT05GSUdfU0ExMTAwX0FTU0FCRVQpCiAKQEAgLTE4NSwxMSArMTg1LDExIEBACiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KIAotI2RlZmluZQlTTUNfSVJRX1RSSUdHRVJfVFlQRSAoKCBcCisjZGVmaW5lCVNNQ19JUlFfRkxBR1MgKCggXAogCQkgICBtYWNoaW5lX2lzX29tYXBfaDIoKSBcCiAJCXx8IG1hY2hpbmVfaXNfb21hcF9oMygpIFwKIAkJfHwgKG1hY2hpbmVfaXNfb21hcF9pbm5vdmF0b3IoKSAmJiAhY3B1X2lzX29tYXAxNTEwKCkpIFwKLQkpID8gSVJRVF9GQUxMSU5HIDogSVJRVF9SSVNJTkcpCisJKSA/IFNBX1RSSUdHRVJfRkFMTElORyA6IFNBX1RSSUdHRVJfUklTSU5HKQogCiAKICNlbGlmCWRlZmluZWQoQ09ORklHX1NIX1NINDIwMl9NSUNST0RFVikKQEAgLTIwOSw3ICsyMDksNyBAQAogI2RlZmluZSBTTUNfaW5zdyhhLCByLCBwLCBsKQlpbnN3KChhKSArIChyKSAtIDB4YTAwMDAwMDAsIHAsIGwpCiAjZGVmaW5lIFNNQ19vdXRzdyhhLCByLCBwLCBsKQlvdXRzdygoYSkgKyAocikgLSAweGEwMDAwMDAwLCBwLCBsKQogCi0jZGVmaW5lIHNldF9pcnFfdHlwZShpcnEsIHR5cGUpCWRvIHt9IHdoaWxlKDApCisjZGVmaW5lIFNNQ19JUlFfRkxBR1MJCSgwKQogCiAjZWxpZglkZWZpbmVkKENPTkZJR19JU0EpCiAKQEAgLTIzNyw3ICsyMzcsNyBAQAogI2RlZmluZSBTTUNfaW5zdyhhLCByLCBwLCBsKQlpbnN3KCgodTMyKWEpICsgKHIpLCBwLCBsKQogI2RlZmluZSBTTUNfb3V0c3coYSwgciwgcCwgbCkJb3V0c3coKCh1MzIpYSkgKyAociksIHAsIGwpCiAKLSNkZWZpbmUgc2V0X2lycV90eXBlKGlycSwgdHlwZSkJZG8ge30gd2hpbGUoMCkKKyNkZWZpbmUgU01DX0lSUV9GTEFHUwkJKDApCiAKICNkZWZpbmUgUlBDX0xTQV9ERUZBVUxUCQlSUENfTEVEX1RYX1JYCiAjZGVmaW5lIFJQQ19MU0JfREVGQVVMVAkJUlBDX0xFRF8xMDBfMTAKQEAgLTMxOSw3ICszMTksNyBAQAogCQkJYXVfd3JpdGV3KCpfcCsrICwgX2EpOyBcCiAJfSB3aGlsZSgwKQogCi0jZGVmaW5lIHNldF9pcnFfdHlwZShpcnEsIHR5cGUpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBTTUNfSVJRX0ZMQUdTCQkoMCkKIAogI2Vsc2UKIApAQCAtMzQyLDggKzM0Miw4IEBACiAKICNlbmRpZgogCi0jaWZuZGVmCVNNQ19JUlFfVFJJR0dFUl9UWVBFCi0jZGVmaW5lCVNNQ19JUlFfVFJJR0dFUl9UWVBFCUlSUVRfUklTSU5HCisjaWZuZGVmCVNNQ19JUlFfRkxBR1MKKyNkZWZpbmUJU01DX0lSUV9GTEFHUwkJU0FfVFJJR0dFUl9SSVNJTkcKICNlbmRpZgogCiAjaWZkZWYgU01DX1VTRV9QWEFfRE1BCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmMgYi9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmMKaW5kZXggMGQ3NjVmMS4uMWY1OTc1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuYwpAQCAtMjIsNyArMjIsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLQogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtMzAsNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgpAQCAtMTA4LDQyICsxMDksNiBAQAogCXdyaXRlbCh2YWx1ZSwgY2FyZC0+cmVncyArIHJlZyk7CiB9CiAKLS8qKgotICogc3BpZGVyX25ldF93cml0ZV9yZWdfc3luYyAtIHdyaXRlcyB0byBhbiBTTU1JTyByZWdpc3RlciBvZiBhIGNhcmQKLSAqIEBjYXJkOiBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAcmVnOiByZWdpc3RlciB0byB3cml0ZSB0bwotICogQHZhbHVlOiB2YWx1ZSB0byB3cml0ZSBpbnRvIHRoZSBzcGVjaWZpZWQgU01NSU8gcmVnaXN0ZXIKLSAqCi0gKiBVbmxpa2Ugc3BpZGVyX25ldF93cml0ZV9yZWcsIHRoaXMgd2lsbCBhbHNvIG1ha2Ugc3VyZSB0aGUKLSAqIGRhdGEgYXJyaXZlcyBvbiB0aGUgY2FyZCBieSByZWFkaW5nIHRoZSByZWcgYWdhaW4uCi0gKi8KLXN0YXRpYyB2b2lkCi1zcGlkZXJfbmV0X3dyaXRlX3JlZ19zeW5jKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQsIHUzMiByZWcsIHUzMiB2YWx1ZSkKLXsKLQl2YWx1ZSA9IGNwdV90b19sZTMyKHZhbHVlKTsKLQl3cml0ZWwodmFsdWUsIGNhcmQtPnJlZ3MgKyByZWcpOwotCSh2b2lkKXJlYWRsKGNhcmQtPnJlZ3MgKyByZWcpOwotfQotCi0vKioKLSAqIHNwaWRlcl9uZXRfcnhfaXJxX29mZiAtIHN3aXRjaCBvZmYgcnggaXJxIG9uIHRoaXMgc3BpZGVyIGNhcmQKLSAqIEBjYXJkOiBkZXZpY2Ugc3RydWN0dXJlCi0gKgotICogc3dpdGNoZXMgb2ZmIHJ4IGlycSBieSBtYXNraW5nIHRoZW0gb3V0IGluIHRoZSBHSElJTlRuTVNLIHJlZ2lzdGVyCi0gKi8KLXN0YXRpYyB2b2lkCi1zcGlkZXJfbmV0X3J4X2lycV9vZmYoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKLXsKLQl1MzIgcmVndmFsdWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pbnRtYXNrX2xvY2ssIGZsYWdzKTsKLQlyZWd2YWx1ZSA9IHNwaWRlcl9uZXRfcmVhZF9yZWcoY2FyZCwgU1BJREVSX05FVF9HSElJTlQwTVNLKTsKLQlyZWd2YWx1ZSAmPSB+U1BJREVSX05FVF9SWElOVDsKLQlzcGlkZXJfbmV0X3dyaXRlX3JlZ19zeW5jKGNhcmQsIFNQSURFUl9ORVRfR0hJSU5UME1TSywgcmVndmFsdWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmludG1hc2tfbG9jaywgZmxhZ3MpOwotfQotCiAvKiogc3BpZGVyX25ldF93cml0ZV9waHkgLSB3cml0ZSB0byBwaHkgcmVnaXN0ZXIKICAqIEBuZXRkZXY6IGFkYXB0ZXIgdG8gYmUgd3JpdHRlbiB0bwogICogQG1paV9pZDogaWQgb2YgTUlJCkBAIC0xOTksNiArMTY0LDIxIEBACiB9CiAKIC8qKgorICogc3BpZGVyX25ldF9yeF9pcnFfb2ZmIC0gc3dpdGNoIG9mZiByeCBpcnEgb24gdGhpcyBzcGlkZXIgY2FyZAorICogQGNhcmQ6IGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBzd2l0Y2hlcyBvZmYgcnggaXJxIGJ5IG1hc2tpbmcgdGhlbSBvdXQgaW4gdGhlIEdISUlOVG5NU0sgcmVnaXN0ZXIKKyAqLworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfcnhfaXJxX29mZihzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkKQoreworCXUzMiByZWd2YWx1ZTsKKworCXJlZ3ZhbHVlID0gU1BJREVSX05FVF9JTlQwX01BU0tfVkFMVUUgJiAoflNQSURFUl9ORVRfUlhJTlQpOworCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR0hJSU5UME1TSywgcmVndmFsdWUpOworfQorCisvKioKICAqIHNwaWRlcl9uZXRfcnhfaXJxX29uIC0gc3dpdGNoIG9uIHJ4IGlycSBvbiB0aGlzIHNwaWRlciBjYXJkCiAgKiBAY2FyZDogZGV2aWNlIHN0cnVjdHVyZQogICoKQEAgLTIwOCw1MSArMTg4LDkgQEAKIHNwaWRlcl9uZXRfcnhfaXJxX29uKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCiB7CiAJdTMyIHJlZ3ZhbHVlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aW50bWFza19sb2NrLCBmbGFncyk7Ci0JcmVndmFsdWUgPSBzcGlkZXJfbmV0X3JlYWRfcmVnKGNhcmQsIFNQSURFUl9ORVRfR0hJSU5UME1TSyk7Ci0JcmVndmFsdWUgfD0gU1BJREVSX05FVF9SWElOVDsKLQlzcGlkZXJfbmV0X3dyaXRlX3JlZ19zeW5jKGNhcmQsIFNQSURFUl9ORVRfR0hJSU5UME1TSywgcmVndmFsdWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmludG1hc2tfbG9jaywgZmxhZ3MpOwotfQotCi0vKioKLSAqIHNwaWRlcl9uZXRfdHhfaXJxX29mZiAtIHN3aXRjaCBvZmYgdHggaXJxIG9uIHRoaXMgc3BpZGVyIGNhcmQKLSAqIEBjYXJkOiBkZXZpY2Ugc3RydWN0dXJlCi0gKgotICogc3dpdGNoZXMgb2ZmIHR4IGlycSBieSBtYXNraW5nIHRoZW0gb3V0IGluIHRoZSBHSElJTlRuTVNLIHJlZ2lzdGVyCi0gKi8KLXN0YXRpYyB2b2lkCi1zcGlkZXJfbmV0X3R4X2lycV9vZmYoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKLXsKLQl1MzIgcmVndmFsdWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pbnRtYXNrX2xvY2ssIGZsYWdzKTsKLQlyZWd2YWx1ZSA9IHNwaWRlcl9uZXRfcmVhZF9yZWcoY2FyZCwgU1BJREVSX05FVF9HSElJTlQwTVNLKTsKLQlyZWd2YWx1ZSAmPSB+U1BJREVSX05FVF9UWElOVDsKLQlzcGlkZXJfbmV0X3dyaXRlX3JlZ19zeW5jKGNhcmQsIFNQSURFUl9ORVRfR0hJSU5UME1TSywgcmVndmFsdWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmludG1hc2tfbG9jaywgZmxhZ3MpOwotfQotCi0vKioKLSAqIHNwaWRlcl9uZXRfdHhfaXJxX29uIC0gc3dpdGNoIG9uIHR4IGlycSBvbiB0aGlzIHNwaWRlciBjYXJkCi0gKiBAY2FyZDogZGV2aWNlIHN0cnVjdHVyZQotICoKLSAqIHN3aXRjaGVzIG9uIHR4IGlycSBieSBlbmFibGluZyB0aGVtIGluIHRoZSBHSElJTlRuTVNLIHJlZ2lzdGVyCi0gKi8KLXN0YXRpYyB2b2lkCi1zcGlkZXJfbmV0X3R4X2lycV9vbihzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkKQotewotCXUzMiByZWd2YWx1ZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmludG1hc2tfbG9jaywgZmxhZ3MpOwotCXJlZ3ZhbHVlID0gc3BpZGVyX25ldF9yZWFkX3JlZyhjYXJkLCBTUElERVJfTkVUX0dISUlOVDBNU0spOwotCXJlZ3ZhbHVlIHw9IFNQSURFUl9ORVRfVFhJTlQ7Ci0Jc3BpZGVyX25ldF93cml0ZV9yZWdfc3luYyhjYXJkLCBTUElERVJfTkVUX0dISUlOVDBNU0ssIHJlZ3ZhbHVlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5pbnRtYXNrX2xvY2ssIGZsYWdzKTsKKwlyZWd2YWx1ZSA9IFNQSURFUl9ORVRfSU5UMF9NQVNLX1ZBTFVFIHwgU1BJREVSX05FVF9SWElOVDsKKwlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dISUlOVDBNU0ssIHJlZ3ZhbHVlKTsKIH0KIAogLyoqCkBAIC0zMjYsOSArMjY0LDggQEAKIHNwaWRlcl9uZXRfZ2V0X2Rlc2NyX3N0YXR1cyhzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqZGVzY3IpCiB7CiAJdTMyIGNtZF9zdGF0dXM7Ci0Jcm1iKCk7CisKIAljbWRfc3RhdHVzID0gZGVzY3ItPmRtYWNfY21kX3N0YXR1czsKLQlybWIoKTsKIAljbWRfc3RhdHVzID4+PSBTUElERVJfTkVUX0RFU0NSX0lORF9QUk9DX1NISUZUOwogCS8qIG5vIG5lZWQgdG8gbWFzayBvdXQgYW55IGJpdHMsIGFzIGNtZF9zdGF0dXMgaXMgMzIgYml0cyB3aWRlIG9ubHkKIAkgKiAoYW5kIHVuc2lnbmVkKSAqLwpAQCAtMzQ5LDcgKzI4Niw2IEBACiB7CiAJdTMyIGNtZF9zdGF0dXM7CiAJLyogcmVhZCB0aGUgc3RhdHVzICovCi0JbWIoKTsKIAljbWRfc3RhdHVzID0gZGVzY3ItPmRtYWNfY21kX3N0YXR1czsKIAkvKiBjbGVhbiB0aGUgdXBwZXIgNCBiaXRzICovCiAJY21kX3N0YXR1cyAmPSBTUElERVJfTkVUX0RFU0NSX0lORF9QUk9DX01BU0tPOwpAQCAtMzU3LDcgKzI5Myw2IEBACiAJY21kX3N0YXR1cyB8PSAoKHUzMilzdGF0dXMpPDxTUElERVJfTkVUX0RFU0NSX0lORF9QUk9DX1NISUZUOwogCS8qIGFuZCB3cml0ZSBpdCBiYWNrICovCiAJZGVzY3ItPmRtYWNfY21kX3N0YXR1cyA9IGNtZF9zdGF0dXM7Ci0Jd21iKCk7CiB9CiAKIC8qKgpAQCAtMzk4LDggKzMzMyw5IEBACiB7CiAJaW50IGk7CiAJc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKmRlc2NyOworCWRtYV9hZGRyX3QgYnVmOwogCi0Jc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmNoYWluX2xvY2spOworCWF0b21pY19zZXQoJmNhcmQtPnJ4X2NoYWluX3JlZmlsbCwwKTsKIAogCWRlc2NyID0gc3RhcnRfZGVzY3I7CiAJbWVtc2V0KGRlc2NyLCAwLCBzaXplb2YoKmRlc2NyKSAqIG5vKTsKQEAgLTQwOCwxNCArMzQ0LDE0IEBACiAJZm9yIChpPTA7IGk8bm87IGkrKywgZGVzY3IrKykgewogCQlzcGlkZXJfbmV0X3NldF9kZXNjcl9zdGF0dXMoZGVzY3IsIFNQSURFUl9ORVRfREVTQ1JfTk9UX0lOX1VTRSk7CiAKLQkJZGVzY3ItPmJ1c19hZGRyID0KLQkJCXBjaV9tYXBfc2luZ2xlKGNhcmQtPnBkZXYsIGRlc2NyLAotCQkJCSAgICAgICBTUElERVJfTkVUX0RFU0NSX1NJWkUsCi0JCQkJICAgICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJCWJ1ZiA9IHBjaV9tYXBfc2luZ2xlKGNhcmQtPnBkZXYsIGRlc2NyLAorCQkJCSAgICAgU1BJREVSX05FVF9ERVNDUl9TSVpFLAorCQkJCSAgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKIAotCQlpZiAoZGVzY3ItPmJ1c19hZGRyID09IERNQV9FUlJPUl9DT0RFKQorCQlpZiAoYnVmID09IERNQV9FUlJPUl9DT0RFKQogCQkJZ290byBpb21tdV9lcnJvcjsKIAorCQlkZXNjci0+YnVzX2FkZHIgPSBidWY7CiAJCWRlc2NyLT5uZXh0ID0gZGVzY3IgKyAxOwogCQlkZXNjci0+cHJldiA9IGRlc2NyIC0gMTsKIApAQCAtNDM5LDcgKzM3NSw4IEBACiAJZm9yIChpPTA7IGkgPCBubzsgaSsrLCBkZXNjcisrKQogCQlpZiAoZGVzY3ItPmJ1c19hZGRyKQogCQkJcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wZGV2LCBkZXNjci0+YnVzX2FkZHIsCi0JCQkJCSBTUElERVJfTkVUX0RFU0NSX1NJWkUsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJCQkJCSBTUElERVJfTkVUX0RFU0NSX1NJWkUsCisJCQkJCSBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogCXJldHVybiAtRU5PTUVNOwogfQogCkBAIC00NTksNyArMzk2LDcgQEAKIAkJaWYgKGRlc2NyLT5za2IpIHsKIAkJCWRldl9rZnJlZV9za2IoZGVzY3ItPnNrYik7CiAJCQlwY2lfdW5tYXBfc2luZ2xlKGNhcmQtPnBkZXYsIGRlc2NyLT5idWZfYWRkciwKLQkJCQkJIFNQSURFUl9ORVRfTUFYX01UVSwKKwkJCQkJIFNQSURFUl9ORVRfTUFYX0ZSQU1FLAogCQkJCQkgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKIAkJfQogCQlkZXNjciA9IGRlc2NyLT5uZXh0OwpAQCAtNDgwLDEyICs0MTcsMTMgQEAKIHNwaWRlcl9uZXRfcHJlcGFyZV9yeF9kZXNjcihzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkLAogCQkJICAgIHN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpkZXNjcikKIHsKKwlkbWFfYWRkcl90IGJ1ZjsKIAlpbnQgZXJyb3IgPSAwOwogCWludCBvZmZzZXQ7CiAJaW50IGJ1ZnNpemU7CiAKIAkvKiB3ZSBuZWVkIHRvIHJvdW5kIHVwIHRoZSBidWZmZXIgc2l6ZSB0byBhIG11bHRpcGxlIG9mIDEyOCAqLwotCWJ1ZnNpemUgPSAoU1BJREVSX05FVF9NQVhfTVRVICsgU1BJREVSX05FVF9SWEJVRl9BTElHTiAtIDEpICYKKwlidWZzaXplID0gKFNQSURFUl9ORVRfTUFYX0ZSQU1FICsgU1BJREVSX05FVF9SWEJVRl9BTElHTiAtIDEpICYKIAkJKH4oU1BJREVSX05FVF9SWEJVRl9BTElHTiAtIDEpKTsKIAogCS8qIGFuZCB3ZSBuZWVkIHRvIGhhdmUgaXQgMTI4IGJ5dGUgYWxpZ25lZCwgdGhlcmVmb3JlIHdlIGFsbG9jYXRlIGEKQEAgLTQ5MywxMCArNDMxLDggQEAKIAkvKiBhbGxvY2F0ZSBhbiBza2IgKi8KIAlkZXNjci0+c2tiID0gZGV2X2FsbG9jX3NrYihidWZzaXplICsgU1BJREVSX05FVF9SWEJVRl9BTElHTiAtIDEpOwogCWlmICghZGVzY3ItPnNrYikgewotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJaWYgKG5ldGlmX21zZ19yeF9lcnIoY2FyZCkpCi0JCQkJcHJfZXJyKCJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSAiCi0JCQkJCSJyeCBidWZmZXJcbiIpOworCQlpZiAobmV0aWZfbXNnX3J4X2VycihjYXJkKSAmJiBuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcl9lcnIoIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHJ4IGJ1ZmZlclxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlkZXNjci0+YnVmX3NpemUgPSBidWZzaXplOwpAQCAtNTEwLDEyICs0NDYsMTIgQEAKIAlpZiAob2Zmc2V0KQogCQlza2JfcmVzZXJ2ZShkZXNjci0+c2tiLCBTUElERVJfTkVUX1JYQlVGX0FMSUdOIC0gb2Zmc2V0KTsKIAkvKiBpby1tbXUtbWFwIHRoZSBza2IgKi8KLQlkZXNjci0+YnVmX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShjYXJkLT5wZGV2LCBkZXNjci0+c2tiLT5kYXRhLAotCQkJCQkgU1BJREVSX05FVF9NQVhfTVRVLAotCQkJCQkgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQlpZiAoZGVzY3ItPmJ1Zl9hZGRyID09IERNQV9FUlJPUl9DT0RFKSB7CisJYnVmID0gcGNpX21hcF9zaW5nbGUoY2FyZC0+cGRldiwgZGVzY3ItPnNrYi0+ZGF0YSwKKwkJCSAgICAgU1BJREVSX05FVF9NQVhfRlJBTUUsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJZGVzY3ItPmJ1Zl9hZGRyID0gYnVmOworCWlmIChidWYgPT0gRE1BX0VSUk9SX0NPREUpIHsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoZGVzY3ItPnNrYik7Ci0JCWlmIChuZXRpZl9tc2dfcnhfZXJyKGNhcmQpKQorCQlpZiAobmV0aWZfbXNnX3J4X2VycihjYXJkKSAmJiBuZXRfcmF0ZWxpbWl0KCkpCiAJCQlwcl9lcnIoIkNvdWxkIG5vdCBpb21tdS1tYXAgcnggYnVmZmVyXG4iKTsKIAkJc3BpZGVyX25ldF9zZXRfZGVzY3Jfc3RhdHVzKGRlc2NyLCBTUElERVJfTkVUX0RFU0NSX05PVF9JTl9VU0UpOwogCX0gZWxzZSB7CkBAIC01MjYsMTAgKzQ2MiwxMCBAQAogfQogCiAvKioKLSAqIHNwaWRlcl9uZXRfZW5hYmxlX3J4Y3RhaWxzIC0gc2V0cyBSWCBkbWFjIGNoYWluIHRhaWwgYWRkcmVzc2VzCisgKiBzcGlkZXJfbmV0X2VuYWJsZV9yeGNodGFpbHMgLSBzZXRzIFJYIGRtYWMgY2hhaW4gdGFpbCBhZGRyZXNzZXMKICAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQogICoKLSAqIHNwaWRlcl9uZXRfZW5hYmxlX3J4Y3RhaWxzIHNldHMgdGhlIFJYIERNQUMgY2hhaW4gdGFpbCBhZHJlc3NlcyBpbiB0aGUKKyAqIHNwaWRlcl9uZXRfZW5hYmxlX3J4Y2h0YWlscyBzZXRzIHRoZSBSWCBETUFDIGNoYWluIHRhaWwgYWRyZXNzZXMgaW4gdGhlCiAgKiBjaGlwIGJ5IHdyaXRpbmcgdG8gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyLiBETUEgaXMgZW5hYmxlZCBpbgogICogc3BpZGVyX25ldF9lbmFibGVfcnhkbWFjLgogICovCkBAIC01NTEsNiArNDg3LDcgQEAKIHN0YXRpYyB2b2lkCiBzcGlkZXJfbmV0X2VuYWJsZV9yeGRtYWMoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKIHsKKwl3bWIoKTsKIAlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dEQURNQUNDTlRSLAogCQkJICAgICBTUElERVJfTkVUX0RNQV9SWF9WQUxVRSk7CiB9CkBAIC01NTksMzIgKzQ5NiwyOCBAQAogICogc3BpZGVyX25ldF9yZWZpbGxfcnhfY2hhaW4gLSByZWZpbGxzIGRlc2NyaXB0b3JzL3NrYnMgaW4gdGhlIHJ4IGNoYWlucwogICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCiAgKgotICogcmVmaWxscyBkZXNjcmlwdG9ycyBpbiBhbGwgY2hhaW5zIChsYXN0IHVzZWQgY2hhaW4gZmlyc3QpOiBhbGxvY2F0ZXMgc2ticwotICogYW5kIGlvbW11LW1hcHMgdGhlbS4KKyAqIHJlZmlsbHMgZGVzY3JpcHRvcnMgaW4gdGhlIHJ4IGNoYWluOiBhbGxvY2F0ZXMgc2ticyBhbmQgaW9tbXUtbWFwcyB0aGVtLgogICovCiBzdGF0aWMgdm9pZAogc3BpZGVyX25ldF9yZWZpbGxfcnhfY2hhaW4oc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKIHsKIAlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjcl9jaGFpbiAqY2hhaW47Ci0JaW50IGNvdW50ID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJY2hhaW4gPSAmY2FyZC0+cnhfY2hhaW47CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2hhaW5fbG9jaywgZmxhZ3MpOwotCXdoaWxlIChzcGlkZXJfbmV0X2dldF9kZXNjcl9zdGF0dXMoY2hhaW4tPmhlYWQpID09Ci0JCQkJU1BJREVSX05FVF9ERVNDUl9OT1RfSU5fVVNFKSB7Ci0JCWlmIChzcGlkZXJfbmV0X3ByZXBhcmVfcnhfZGVzY3IoY2FyZCwgY2hhaW4tPmhlYWQpKQotCQkJYnJlYWs7Ci0JCWNvdW50Kys7Ci0JCWNoYWluLT5oZWFkID0gY2hhaW4tPmhlYWQtPm5leHQ7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNoYWluX2xvY2ssIGZsYWdzKTsKKwkvKiBvbmUgY29udGV4dCBkb2luZyB0aGUgcmVmaWxsIChhbmQgYSBzZWNvbmQgY29udGV4dCBzZWVpbmcgdGhhdAorCSAqIGFuZCBvbWl0dGluZyBpdCkgaXMgb2suIElmIGNhbGxlZCBieSBOQVBJLCB3ZSdsbCBiZSBjYWxsZWQgYWdhaW4KKwkgKiBhcyBzcGlkZXJfbmV0X2RlY29kZV9vbmVfZGVzY3IgaXMgY2FsbGVkIHNldmVyYWwgdGltZXMuIElmIHNvbWUKKwkgKiBpbnRlcnJ1cHQgY2FsbHMgdXMsIHRoZSBOQVBJIGlzIGFib3V0IHRvIGNsZWFuIHVwIGFueXdheS4gKi8KKwlpZiAoYXRvbWljX2luY19yZXR1cm4oJmNhcmQtPnJ4X2NoYWluX3JlZmlsbCkgPT0gMSkKKwkJd2hpbGUgKHNwaWRlcl9uZXRfZ2V0X2Rlc2NyX3N0YXR1cyhjaGFpbi0+aGVhZCkgPT0KKwkJICAgICAgIFNQSURFUl9ORVRfREVTQ1JfTk9UX0lOX1VTRSkgeworCQkJaWYgKHNwaWRlcl9uZXRfcHJlcGFyZV9yeF9kZXNjcihjYXJkLCBjaGFpbi0+aGVhZCkpCisJCQkJYnJlYWs7CisJCQljaGFpbi0+aGVhZCA9IGNoYWluLT5oZWFkLT5uZXh0OworCQl9CiAKLQkvKiBjb3VsZCBiZSBvcHRpbWl6ZWQsIG9ubHkgZG8gdGhhdCwgaWYgd2Uga25vdyB0aGUgRE1BIHByb2Nlc3NpbmcKLQkgKiBoYXMgdGVybWluYXRlZCAqLwotCWlmIChjb3VudCkKLQkJc3BpZGVyX25ldF9lbmFibGVfcnhkbWFjKGNhcmQpOworCWF0b21pY19kZWMoJmNhcmQtPnJ4X2NoYWluX3JlZmlsbCk7CiB9CiAKIC8qKgpAQCAtNjEzLDYgKzU0Niw3IEBACiAJLyogdGhpcyB3aWxsIGFsbG9jYXRlIHRoZSByZXN0IG9mIHRoZSByeCBidWZmZXJzOyBpZiBub3QsIGl0J3MKIAkgKiBidXNpbmVzcyBhcyB1c3VhbCBsYXRlciBvbiAqLwogCXNwaWRlcl9uZXRfcmVmaWxsX3J4X2NoYWluKGNhcmQpOworCXNwaWRlcl9uZXRfZW5hYmxlX3J4ZG1hYyhjYXJkKTsKIAlyZXR1cm4gMDsKIAogZXJyb3I6CkBAIC02NDksMjQgKzU4MywzMCBAQAogICogQGNhcmQ6IGFkYXB0ZXIgc3RydWN0dXJlCiAgKiBAYnJ1dGFsOiBpZiBzZXQsIGRvbid0IGNhcmUgYWJvdXQgd2hldGhlciBkZXNjcmlwdG9yIHNlZW1zIHRvIGJlIGluIHVzZQogICoKLSAqIHJlbGVhc2VzIHRoZSB0eCBkZXNjcmlwdG9ycyB0aGF0IHNwaWRlciBoYXMgZmluaXNoZWQgd2l0aCAoaWYgbm9uLWJydXRhbCkKLSAqIG9yIHNpbXBseSByZWxlYXNlIHR4IGRlc2NyaXB0b3JzIChpZiBicnV0YWwpCisgKiByZXR1cm5zIDAgaWYgdGhlIHR4IHJpbmcgaXMgZW1wdHksIG90aGVyd2lzZSAxLgorICoKKyAqIHNwaWRlcl9uZXRfcmVsZWFzZV90eF9jaGFpbiByZWxlYXNlcyB0aGUgdHggZGVzY3JpcHRvcnMgdGhhdCBzcGlkZXIgaGFzCisgKiBmaW5pc2hlZCB3aXRoIChpZiBub24tYnJ1dGFsKSBvciBzaW1wbHkgcmVsZWFzZSB0eCBkZXNjcmlwdG9ycyAoaWYgYnJ1dGFsKS4KKyAqIElmIHNvbWUgb3RoZXIgY29udGV4dCBpcyBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIHdlIHJldHVybiAxIHNvIHRoYXQgd2UncmUKKyAqIHNjaGVkdWxlZCBhZ2FpbiAoaWYgd2Ugd2VyZSBzY2hlZHVsZWQpIGFuZCB3aWxsIG5vdCBsb29zZSBpbml0aWF0aXZlLgogICovCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogc3BpZGVyX25ldF9yZWxlYXNlX3R4X2NoYWluKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQsIGludCBicnV0YWwpCiB7CiAJc3RydWN0IHNwaWRlcl9uZXRfZGVzY3JfY2hhaW4gKnR4X2NoYWluID0gJmNhcmQtPnR4X2NoYWluOwogCWVudW0gc3BpZGVyX25ldF9kZXNjcl9zdGF0dXMgc3RhdHVzOwogCi0Jc3BpZGVyX25ldF90eF9pcnFfb2ZmKGNhcmQpOworCWlmIChhdG9taWNfaW5jX3JldHVybigmY2FyZC0+dHhfY2hhaW5fcmVsZWFzZSkgIT0gMSkgeworCQlhdG9taWNfZGVjKCZjYXJkLT50eF9jaGFpbl9yZWxlYXNlKTsKKwkJcmV0dXJuIDE7CisJfQogCi0JLyogbm8gbG9jayBmb3IgY2hhaW4gbmVlZGVkLCBpZiB0aGlzIGlzIG9ubHkgZXhlY3V0ZWQgb25jZSBhdCBhIHRpbWUgKi8KLWFnYWluOgogCWZvciAoOzspIHsKIAkJc3RhdHVzID0gc3BpZGVyX25ldF9nZXRfZGVzY3Jfc3RhdHVzKHR4X2NoYWluLT50YWlsKTsKIAkJc3dpdGNoIChzdGF0dXMpIHsKIAkJY2FzZSBTUElERVJfTkVUX0RFU0NSX0NBUkRPV05FRDoKLQkJCWlmICghYnJ1dGFsKSBnb3RvIG91dDsKKwkJCWlmICghYnJ1dGFsKQorCQkJCWdvdG8gb3V0OwogCQkJLyogZmFsbHRocm91Z2gsIGlmIHdlIHJlbGVhc2UgdGhlIGRlc2NyaXB0b3JzCiAJCQkgKiBicnV0YWxseSAodGhlbiB3ZSBkb24ndCBjYXJlIGFib3V0CiAJCQkgKiBTUElERVJfTkVUX0RFU0NSX0NBUkRPV05FRCkgKi8KQEAgLTY5MywyNSArNjMzLDMwIEBACiAJCXR4X2NoYWluLT50YWlsID0gdHhfY2hhaW4tPnRhaWwtPm5leHQ7CiAJfQogb3V0OgorCWF0b21pY19kZWMoJmNhcmQtPnR4X2NoYWluX3JlbGVhc2UpOworCiAJbmV0aWZfd2FrZV9xdWV1ZShjYXJkLT5uZXRkZXYpOwogCi0JaWYgKCFicnV0YWwpIHsKLQkJLyogc3dpdGNoIG9uIHR4IGlycXMgKHdoaWxlIHdlIGFyZSBzdGlsbCBpbiB0aGUgaW50ZXJydXB0Ci0JCSAqIGhhbmRsZXIsIHNvIHdlIGRvbid0IGdldCBhbiBpbnRlcnJ1cHQpLCBjaGVjayBhZ2FpbgotCQkgKiBmb3IgZG9uZSBkZXNjcmlwdG9ycy4gVGhpcyByZXN1bHRzIGluIGZld2VyIGludGVycnVwdHMgKi8KLQkJc3BpZGVyX25ldF90eF9pcnFfb24oY2FyZCk7Ci0JCXN0YXR1cyA9IHNwaWRlcl9uZXRfZ2V0X2Rlc2NyX3N0YXR1cyh0eF9jaGFpbi0+dGFpbCk7Ci0JCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCQljYXNlIFNQSURFUl9ORVRfREVTQ1JfUkVTUE9OU0VfRVJST1I6Ci0JCQljYXNlIFNQSURFUl9ORVRfREVTQ1JfUFJPVEVDVElPTl9FUlJPUjoKLQkJCWNhc2UgU1BJREVSX05FVF9ERVNDUl9GT1JDRV9FTkQ6Ci0JCQljYXNlIFNQSURFUl9ORVRfREVTQ1JfQ09NUExFVEU6Ci0JCQkJZ290byBhZ2FpbjsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9CisJaWYgKHN0YXR1cyA9PSBTUElERVJfTkVUX0RFU0NSX0NBUkRPV05FRCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CiAKKy8qKgorICogc3BpZGVyX25ldF9jbGVhbnVwX3R4X3JpbmcgLSBjbGVhbnMgdXAgdGhlIFRYIHJpbmcKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICoKKyAqIHNwaWRlcl9uZXRfY2xlYW51cF90eF9yaW5nIGlzIGNhbGxlZCBieSB0aGUgdHhfdGltZXIgKGFzIHdlIGRvbid0IHVzZQorICogaW50ZXJydXB0cyB0byBjbGVhbnVwIG91ciBUWCByaW5nKSBhbmQgcmV0dXJucyBzZW50IHBhY2tldHMgdG8gdGhlIHN0YWNrCisgKiBieSBmcmVlaW5nIHRoZW0KKyAqLworc3RhdGljIHZvaWQKK3NwaWRlcl9uZXRfY2xlYW51cF90eF9yaW5nKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCit7CisJaWYgKCAoc3BpZGVyX25ldF9yZWxlYXNlX3R4X2NoYWluKGNhcmQsIDApKSAmJgorCSAgICAgIChjYXJkLT5uZXRkZXYtPmZsYWdzICYgSUZGX1VQKSApIHsKKwkJbW9kX3RpbWVyKCZjYXJkLT50eF90aW1lciwgamlmZmllcyArIFNQSURFUl9ORVRfVFhfVElNRVIpOworCX0KIH0KIAogLyoqCkBAIC03MjYsMTYgKzY3MSwyMiBAQAogc3RhdGljIHU4CiBzcGlkZXJfbmV0X2dldF9tdWx0aWNhc3RfaGFzaChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBfX3U4ICphZGRyKQogewotCS8qIEZJWE1FOiBhbiBhZGRyIG9mIDAxOjAwOjVlOjAwOjAwOjAxIG11c3QgcmVzdWx0IGluIDB4YTksCi0JICogZmY6ZmY6ZmY6ZmY6ZmY6ZmYgbXVzdCByZXN1bHQgaW4gMHhmZCAqLwogCXUzMiBjcmM7CiAJdTggaGFzaDsKKwljaGFyIGFkZHJfZm9yX2NyY1tFVEhfQUxFTl0gPSB7IDAsIH07CisJaW50IGksIGJpdDsKIAotCWNyYyA9IGNyYzMyX2JlKH4wLCBhZGRyLCBuZXRkZXYtPmFkZHJfbGVuKTsKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU4gKiA4OyBpKyspIHsKKwkJYml0ID0gKGFkZHJbaSAvIDhdID4+IChpICUgOCkpICYgMTsKKwkJYWRkcl9mb3JfY3JjW0VUSF9BTEVOIC0gMSAtIGkgLyA4XSArPSBiaXQgPDwgKDcgLSAoaSAlIDgpKTsKKwl9CisKKwljcmMgPSBjcmMzMl9iZSh+MCwgYWRkcl9mb3JfY3JjLCBuZXRkZXYtPmFkZHJfbGVuKTsKIAogCWhhc2ggPSAoY3JjID4+IDI3KTsKIAloYXNoIDw8PSAzOwogCWhhc2ggfD0gY3JjICYgNzsKKwloYXNoICY9IDB4ZmY7CiAKIAlyZXR1cm4gaGFzaDsKIH0KQEAgLTgyMSw5ICs3NzIsMTEgQEAKIHsKIAlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAorCXRhc2tsZXRfa2lsbCgmY2FyZC0+cnhyYW1fZnVsbF90bCk7CiAJbmV0aWZfcG9sbF9kaXNhYmxlKG5ldGRldik7CiAJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKIAluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJZGVsX3RpbWVyX3N5bmMoJmNhcmQtPnR4X3RpbWVyKTsKIAogCS8qIGRpc2FibGUvbWFzayBhbGwgaW50ZXJydXB0cyAqLwogCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR0hJSU5UME1TSywgMCk7CkBAIC04NzIsMTMgKzgyNSwxNSBAQAogICogQHNrYjogcGFja2V0IHRvIGNvbnNpZGVyCiAgKgogICogZmlsbHMgb3V0IHRoZSBjb21tYW5kIGFuZCBzdGF0dXMgZmllbGQgb2YgdGhlIGRlc2NyaXB0b3Igc3RydWN0dXJlLAotICogZGVwZW5kaW5nIG9uIGhhcmR3YXJlIGNoZWNrc3VtIHNldHRpbmdzLiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgYSB3bWIoKQotICogaGFzIGV4ZWN1dGVkIGJlZm9yZS4KKyAqIGRlcGVuZGluZyBvbiBoYXJkd2FyZSBjaGVja3N1bSBzZXR0aW5ncy4KICAqLwogc3RhdGljIHZvaWQKIHNwaWRlcl9uZXRfc2V0X3R4ZGVzY3JfY21kc3RhdChzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqZGVzY3IsCiAJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKKwkvKiBtYWtlIHN1cmUgdGhlIG90aGVyIGZpZWxkcyBpbiB0aGUgZGVzY3JpcHRvciBhcmUgd3JpdHRlbiAqLworCXdtYigpOworCiAJaWYgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX0hXKSB7CiAJCWRlc2NyLT5kbWFjX2NtZF9zdGF0dXMgPSBTUElERVJfTkVUX0RNQUNfQ01EU1RBVF9OT0NTOwogCQlyZXR1cm47CkBAIC04ODcsMTQgKzg0MiwxMyBAQAogCS8qIGlzIHBhY2tldCBpcD8KIAkgKiBpZiB5ZXM6IHRjcD8gdWRwPyAqLwogCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkgewotCQlpZiAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVENQKSB7CisJCWlmIChza2ItPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApCiAJCQlkZXNjci0+ZG1hY19jbWRfc3RhdHVzID0gU1BJREVSX05FVF9ETUFDX0NNRFNUQVRfVENQQ1M7Ci0JCX0gZWxzZSBpZiAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVURQKSB7CisJCWVsc2UgaWYgKHNrYi0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkKIAkJCWRlc2NyLT5kbWFjX2NtZF9zdGF0dXMgPSBTUElERVJfTkVUX0RNQUNfQ01EU1RBVF9VRFBDUzsKLQkJfSBlbHNlIHsgLyogdGhlIHN0YWNrIHNob3VsZCBjaGVja3N1bSBub24tdGNwIGFuZCBub24tdWRwCi0JCQkgICAgcGFja2V0cyBvbiBoaXMgb3duOiBORVRJRl9GX0lQX0NTVU0gKi8KKwkJZWxzZSAvKiB0aGUgc3RhY2sgc2hvdWxkIGNoZWNrc3VtIG5vbi10Y3AgYW5kIG5vbi11ZHAKKwkJCXBhY2tldHMgb24gaGlzIG93bjogTkVUSUZfRl9JUF9DU1VNICovCiAJCQlkZXNjci0+ZG1hY19jbWRfc3RhdHVzID0gU1BJREVSX05FVF9ETUFDX0NNRFNUQVRfTk9DUzsKLQkJfQogCX0KIH0KIApAQCAtOTE0LDIzICs4NjgsMjIgQEAKIAkJCSAgICBzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqZGVzY3IsCiAJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlkZXNjci0+YnVmX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShjYXJkLT5wZGV2LCBza2ItPmRhdGEsCi0JCQkJCSBza2ItPmxlbiwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQlpZiAoZGVzY3ItPmJ1Zl9hZGRyID09IERNQV9FUlJPUl9DT0RFKSB7Ci0JCWlmIChuZXRpZl9tc2dfdHhfZXJyKGNhcmQpKQorCWRtYV9hZGRyX3QgYnVmOworCisJYnVmID0gcGNpX21hcF9zaW5nbGUoY2FyZC0+cGRldiwgc2tiLT5kYXRhLAorCQkJICAgICBza2ItPmxlbiwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwlpZiAoYnVmID09IERNQV9FUlJPUl9DT0RFKSB7CisJCWlmIChuZXRpZl9tc2dfdHhfZXJyKGNhcmQpICYmIG5ldF9yYXRlbGltaXQoKSkKIAkJCXByX2VycigiY291bGQgbm90IGlvbW11LW1hcCBwYWNrZXQgKCVwLCAlaSkuICIKIAkJCQkgICJEcm9wcGluZyBwYWNrZXRcbiIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwlkZXNjci0+YnVmX2FkZHIgPSBidWY7CiAJZGVzY3ItPmJ1Zl9zaXplID0gc2tiLT5sZW47CiAJZGVzY3ItPnNrYiA9IHNrYjsKIAlkZXNjci0+ZGF0YV9zdGF0dXMgPSAwOwogCi0JLyogbWFrZSBzdXJlIHRoZSBhYm92ZSB2YWx1ZXMgYXJlIGluIG1lbW9yeSBiZWZvcmUgd2UgY2hhbmdlIHRoZQotCSAqIHN0YXR1cyAqLwotCXdtYigpOwotCiAJc3BpZGVyX25ldF9zZXRfdHhkZXNjcl9jbWRzdGF0KGRlc2NyLHNrYik7CiAKIAlyZXR1cm4gMDsKQEAgLTk3MiwxNyArOTI1LDEyIEBACiAJc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKmRlc2NyOwogCWludCByZXN1bHQ7CiAKKwlzcGlkZXJfbmV0X3JlbGVhc2VfdHhfY2hhaW4oY2FyZCwgMCk7CisKIAlkZXNjciA9IHNwaWRlcl9uZXRfZ2V0X25leHRfdHhfZGVzY3IoY2FyZCk7CiAKLQlpZiAoIWRlc2NyKSB7Ci0JCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKLQotCQlkZXNjciA9IHNwaWRlcl9uZXRfZ2V0X25leHRfdHhfZGVzY3IoY2FyZCk7Ci0JCWlmICghZGVzY3IpCi0JCQlnb3RvIGVycm9yOwotCQllbHNlCi0JCQluZXRpZl9zdGFydF9xdWV1ZShuZXRkZXYpOwotCX0KKwlpZiAoIWRlc2NyKQorCQlnb3RvIGVycm9yOwogCiAJcmVzdWx0ID0gc3BpZGVyX25ldF9wcmVwYXJlX3R4X2Rlc2NyKGNhcmQsIGRlc2NyLCBza2IpOwogCWlmIChyZXN1bHQpCkBAIC05OTAsMTkgKzkzOCwyNSBAQAogCiAJY2FyZC0+dHhfY2hhaW4uaGVhZCA9IGNhcmQtPnR4X2NoYWluLmhlYWQtPm5leHQ7CiAKLQkvKiBtYWtlIHN1cmUgdGhlIHN0YXR1cyBmcm9tIHNwaWRlcl9uZXRfcHJlcGFyZV90eF9kZXNjciBpcyBpbgotCSAqIG1lbW9yeSBiZWZvcmUgd2UgY2hlY2sgb3V0IHRoZSBwcmV2aW91cyBkZXNjcmlwdG9yICovCi0Jd21iKCk7Ci0KIAlpZiAoc3BpZGVyX25ldF9nZXRfZGVzY3Jfc3RhdHVzKGRlc2NyLT5wcmV2KSAhPQotCSAgICBTUElERVJfTkVUX0RFU0NSX0NBUkRPV05FRCkKLQkJc3BpZGVyX25ldF9raWNrX3R4X2RtYShjYXJkLCBkZXNjcik7CisJICAgIFNQSURFUl9ORVRfREVTQ1JfQ0FSRE9XTkVEKSB7CisJCS8qIG1ha2Ugc3VyZSB0aGUgY3VycmVudCBkZXNjcmlwdG9yIGlzIGluIG1lbW9yeS4gVGhlbgorCQkgKiBraWNraW5nIGl0IG9uIGFnYWluIG1ha2VzIHNlbnNlLCBpZiB0aGUgcHJldmlvdXMgaXMgbm90CisJCSAqIGNhcmQtb3duZWQgYW55bW9yZS4gQ2hlY2sgdGhlIHByZXZpb3VzIGRlc2NyaXB0b3IgdHdpY2UKKwkJICogdG8gb21pdCBhbiBtYigpIGluIGhlYXZ5IHRyYWZmaWMgY2FzZXMgKi8KKwkJbWIoKTsKKwkJaWYgKHNwaWRlcl9uZXRfZ2V0X2Rlc2NyX3N0YXR1cyhkZXNjci0+cHJldikgIT0KKwkJICAgIFNQSURFUl9ORVRfREVTQ1JfQ0FSRE9XTkVEKQorCQkJc3BpZGVyX25ldF9raWNrX3R4X2RtYShjYXJkLCBkZXNjcik7CisJfQorCisJbW9kX3RpbWVyKCZjYXJkLT50eF90aW1lciwgamlmZmllcyArIFNQSURFUl9ORVRfVFhfVElNRVIpOwogCiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAogZXJyb3I6CiAJY2FyZC0+bmV0ZGV2X3N0YXRzLnR4X2Ryb3BwZWQrKzsKLQlyZXR1cm4gTkVUREVWX1RYX0xPQ0tFRDsKKwlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CiB9CiAKIC8qKgpAQCAtMTAyNyw2ICs5ODEsNyBAQAogICogc3BpZGVyX25ldF9wYXNzX3NrYl91cCAtIHRha2VzIGFuIHNrYiBmcm9tIGEgZGVzY3JpcHRvciBhbmQgcGFzc2VzIGl0IG9uCiAgKiBAZGVzY3I6IGRlc2NyaXB0b3IgdG8gcHJvY2VzcwogICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCisgKiBAbmFwaTogd2hldGhlciBjYWxsZXIgaXMgaW4gTkFQSSBjb250ZXh0CiAgKgogICogcmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgaWYgbm8gcGFja2V0IHdhcyBwYXNzZWQgdG8gdGhlIHN0YWNrCiAgKgpAQCAtMTAzNSw3ICs5OTAsNyBAQAogICovCiBzdGF0aWMgaW50CiBzcGlkZXJfbmV0X3Bhc3Nfc2tiX3VwKHN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpkZXNjciwKLQkJICAgICAgIHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCisJCSAgICAgICBzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkLCBpbnQgbmFwaSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CkBAIC0xMDQ2LDIyICsxMDAxLDIwIEBACiAKIAluZXRkZXYgPSBjYXJkLT5uZXRkZXY7CiAKLQkvKiBjaGVjayBmb3IgZXJyb3JzIGluIHRoZSBkYXRhX2Vycm9yIGZsYWcgKi8KLQlpZiAoKGRhdGFfZXJyb3IgJiBTUElERVJfTkVUX0RBVEFfRVJST1JfTUFTSykgJiYKLQkgICAgbmV0aWZfbXNnX3J4X2VycihjYXJkKSkKLQkJcHJfZXJyKCJlcnJvciBpbiByZWNlaXZlZCBkZXNjcmlwdG9yIGZvdW5kLCAiCi0JCSAgICAgICAiZGF0YV9zdGF0dXM9eCUwOHgsIGRhdGFfZXJyb3I9eCUwOHhcbiIsCi0JCSAgICAgICBkYXRhX3N0YXR1cywgZGF0YV9lcnJvcik7Ci0KLQkvKiBwcmVwYXJlIHNrYiwgdW5tYXAgZGVzY3JpcHRvciAqLwotCXNrYiA9IGRlc2NyLT5za2I7Ci0JcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wZGV2LCBkZXNjci0+YnVmX2FkZHIsIFNQSURFUl9ORVRfTUFYX01UVSwKKwkvKiB1bm1hcCBkZXNjcmlwdG9yICovCisJcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wZGV2LCBkZXNjci0+YnVmX2FkZHIsIFNQSURFUl9ORVRfTUFYX0ZSQU1FLAogCQkJIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CiAKIAkvKiB0aGUgY2FzZXMgd2UnbGwgdGhyb3cgYXdheSB0aGUgcGFja2V0IGltbWVkaWF0ZWx5ICovCi0JaWYgKGRhdGFfZXJyb3IgJiBTUElERVJfTkVUX0RFU1RST1lfUlhfRkxBR1MpCisJaWYgKGRhdGFfZXJyb3IgJiBTUElERVJfTkVUX0RFU1RST1lfUlhfRkxBR1MpIHsKKwkJaWYgKG5ldGlmX21zZ19yeF9lcnIoY2FyZCkpCisJCQlwcl9lcnIoImVycm9yIGluIHJlY2VpdmVkIGRlc2NyaXB0b3IgZm91bmQsICIKKwkJCSAgICAgICAiZGF0YV9zdGF0dXM9eCUwOHgsIGRhdGFfZXJyb3I9eCUwOHhcbiIsCisJCQkgICAgICAgZGF0YV9zdGF0dXMsIGRhdGFfZXJyb3IpOwogCQlyZXR1cm4gMDsKKwl9CiAKKwlza2IgPSBkZXNjci0+c2tiOwogCXNrYi0+ZGV2ID0gbmV0ZGV2OwogCXNrYl9wdXQoc2tiLCBkZXNjci0+dmFsaWRfc2l6ZSk7CiAKQEAgLTEwNzMsMTQgKzEwMjYsMTQgQEAKIAogCS8qIGNoZWNrc3VtIG9mZmxvYWQgKi8KIAlpZiAoY2FyZC0+b3B0aW9ucy5yeF9jc3VtKSB7Ci0JCWlmICggKGRhdGFfc3RhdHVzICYgU1BJREVSX05FVF9EQVRBX1NUQVRVU19DSEtfTUFTSykgJiYKLQkJICAgICAoIShkYXRhX2Vycm9yICYgU1BJREVSX05FVF9EQVRBX0VSUk9SX0NIS19NQVNLKSkgKQorCQlpZiAoICggKGRhdGFfc3RhdHVzICYgU1BJREVSX05FVF9EQVRBX1NUQVRVU19DS1NVTV9NQVNLKSA9PQorCQkgICAgICAgU1BJREVSX05FVF9EQVRBX1NUQVRVU19DS1NVTV9NQVNLKSAmJgorCQkgICAgICEoZGF0YV9lcnJvciAmIFNQSURFUl9ORVRfREFUQV9FUlJfQ0tTVU1fTUFTSykpCiAJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCQllbHNlCiAJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Ci0JfSBlbHNlIHsKKwl9IGVsc2UKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwotCX0KIAogCWlmIChkYXRhX3N0YXR1cyAmIFNQSURFUl9ORVRfVkxBTl9QQUNLRVQpIHsKIAkJLyogZnVydGhlciBlbmhhbmNlbWVudHM6IEhXLWFjY2VsIFZMQU4KQEAgLTEwODksNyArMTA0MiwxMCBAQAogCX0KIAogCS8qIHBhc3Mgc2tiIHVwIHRvIHN0YWNrICovCi0JbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKwlpZiAobmFwaSkKKwkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKwllbHNlCisJCW5ldGlmX3J4X25pKHNrYik7CiAKIAkvKiB1cGRhdGUgbmV0ZGV2aWNlIHN0YXRpc3RpY3MgKi8KIAljYXJkLT5uZXRkZXZfc3RhdHMucnhfcGFja2V0cysrOwpAQCAtMTA5OSwxNiArMTA1NSwxOCBAQAogfQogCiAvKioKLSAqIHNwaWRlcl9uZXRfZGVjb2RlX2Rlc2NyIC0gcHJvY2Vzc2VzIGFuIHJ4IGRlc2NyaXB0b3IKKyAqIHNwaWRlcl9uZXRfZGVjb2RlX29uZV9kZXNjciAtIHByb2Nlc3NlcyBhbiByeCBkZXNjcmlwdG9yCiAgKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKKyAqIEBuYXBpOiB3aGV0aGVyIGNhbGxlciBpcyBpbiBOQVBJIGNvbnRleHQKICAqCiAgKiByZXR1cm5zIDEgaWYgYSBwYWNrZXQgaGFzIGJlZW4gc2VudCB0byB0aGUgc3RhY2ssIG90aGVyd2lzZSAwCiAgKgogICogcHJvY2Vzc2VzIGFuIHJ4IGRlc2NyaXB0b3IgYnkgaW9tbXUtdW5tYXBwaW5nIHRoZSBkYXRhIGJ1ZmZlciBhbmQgcGFzc2luZwotICogdGhlIHBhY2tldCB1cCB0byB0aGUgc3RhY2sKKyAqIHRoZSBwYWNrZXQgdXAgdG8gdGhlIHN0YWNrLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBzb2Z0aXJxCisgKiBjb250ZXh0LCBlLmcuIGVpdGhlciBib3R0b20gaGFsZiBmcm9tIGludGVycnVwdCBvciBOQVBJIHBvbGxpbmcgY29udGV4dAogICovCiBzdGF0aWMgaW50Ci1zcGlkZXJfbmV0X2RlY29kZV9vbmVfZGVzY3Ioc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKK3NwaWRlcl9uZXRfZGVjb2RlX29uZV9kZXNjcihzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkLCBpbnQgbmFwaSkKIHsKIAllbnVtIHNwaWRlcl9uZXRfZGVzY3Jfc3RhdHVzIHN0YXR1czsKIAlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqZGVzY3I7CkBAIC0xMTIyLDE3ICsxMDgwLDE5IEBACiAKIAlpZiAoc3RhdHVzID09IFNQSURFUl9ORVRfREVTQ1JfQ0FSRE9XTkVEKSB7CiAJCS8qIG5vdGhpbmcgaW4gdGhlIGRlc2NyaXB0b3IgeWV0ICovCi0JCXJldHVybiAwOworCQlyZXN1bHQ9MDsKKwkJZ290byBvdXQ7CiAJfQogCiAJaWYgKHN0YXR1cyA9PSBTUElERVJfTkVUX0RFU0NSX05PVF9JTl9VU0UpIHsKLQkJLyogbm90IGluaXRpYWxpemVkIHlldCwgSSBiZXQgY2hhaW4tPnRhaWwgPT0gY2hhaW4tPmhlYWQKLQkJICogYW5kIHRoZSByaW5nIGlzIGVtcHR5ICovCisJCS8qIG5vdCBpbml0aWFsaXplZCB5ZXQsIHRoZSByaW5nIG11c3QgYmUgZW1wdHkgKi8KIAkJc3BpZGVyX25ldF9yZWZpbGxfcnhfY2hhaW4oY2FyZCk7Ci0JCXJldHVybiAwOworCQlzcGlkZXJfbmV0X2VuYWJsZV9yeGRtYWMoY2FyZCk7CisJCXJlc3VsdD0wOworCQlnb3RvIG91dDsKIAl9CiAKLQkvKiBkZXNjcmlwdG9yIGRlZmluaXRpdmVseSB1c2VkIC0tIG1vdmUgb24gaGVhZCAqLworCS8qIGRlc2NyaXB0b3IgZGVmaW5pdGl2ZWx5IHVzZWQgLS0gbW92ZSBvbiB0YWlsICovCiAJY2hhaW4tPnRhaWwgPSBkZXNjci0+bmV4dDsKIAogCXJlc3VsdCA9IDA7CkBAIC0xMTQzLDYgKzExMDMsOSBAQAogCQkJcHJfZXJyKCIlczogZHJvcHBpbmcgUlggZGVzY3JpcHRvciB3aXRoIHN0YXRlICVkXG4iLAogCQkJICAgICAgIGNhcmQtPm5ldGRldi0+bmFtZSwgc3RhdHVzKTsKIAkJY2FyZC0+bmV0ZGV2X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wZGV2LCBkZXNjci0+YnVmX2FkZHIsCisJCQkJIFNQSURFUl9ORVRfTUFYX0ZSQU1FLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCQlkZXZfa2ZyZWVfc2tiX2lycShkZXNjci0+c2tiKTsKIAkJZ290byByZWZpbGw7CiAJfQogCkBAIC0xMTU1LDEyICsxMTE4LDEzIEBACiAJfQogCiAJLyogb2ssIHdlJ3ZlIGdvdCBhIHBhY2tldCBpbiBkZXNjciAqLwotCXJlc3VsdCA9IHNwaWRlcl9uZXRfcGFzc19za2JfdXAoZGVzY3IsIGNhcmQpOworCXJlc3VsdCA9IHNwaWRlcl9uZXRfcGFzc19za2JfdXAoZGVzY3IsIGNhcmQsIG5hcGkpOwogcmVmaWxsOgogCXNwaWRlcl9uZXRfc2V0X2Rlc2NyX3N0YXR1cyhkZXNjciwgU1BJREVSX05FVF9ERVNDUl9OT1RfSU5fVVNFKTsKIAkvKiBjaGFuZ2UgdGhlIGRlc2NyaXB0b3Igc3RhdGU6ICovCi0Jc3BpZGVyX25ldF9yZWZpbGxfcnhfY2hhaW4oY2FyZCk7Ci0KKwlpZiAoIW5hcGkpCisJCXNwaWRlcl9uZXRfcmVmaWxsX3J4X2NoYWluKGNhcmQpOworb3V0OgogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTExODYsNyArMTE1MCw3IEBACiAJcGFja2V0c190b19kbyA9IG1pbigqYnVkZ2V0LCBuZXRkZXYtPnF1b3RhKTsKIAogCXdoaWxlIChwYWNrZXRzX3RvX2RvKSB7Ci0JCWlmIChzcGlkZXJfbmV0X2RlY29kZV9vbmVfZGVzY3IoY2FyZCkpIHsKKwkJaWYgKHNwaWRlcl9uZXRfZGVjb2RlX29uZV9kZXNjcihjYXJkLCAxKSkgewogCQkJcGFja2V0c19kb25lKys7CiAJCQlwYWNrZXRzX3RvX2RvLS07CiAJCX0gZWxzZSB7CkBAIC0xMTk4LDYgKzExNjIsNyBAQAogCiAJbmV0ZGV2LT5xdW90YSAtPSBwYWNrZXRzX2RvbmU7CiAJKmJ1ZGdldCAtPSBwYWNrZXRzX2RvbmU7CisJc3BpZGVyX25ldF9yZWZpbGxfcnhfY2hhaW4oY2FyZCk7CiAKIAkvKiBpZiBhbGwgcGFja2V0cyBhcmUgaW4gdGhlIHN0YWNrLCBlbmFibGUgaW50ZXJydXB0cyBhbmQgcmV0dXJuIDAgKi8KIAkvKiBpZiBub3QsIHJldHVybiAxICovCkBAIC0xMzQyLDYgKzEzMDcsMjQgQEAKIH0KIAogLyoqCisgKiBzcGlkZXJfbmV0X2hhbmRsZV9yeHJhbV9mdWxsIC0gY2xlYW5zIHVwIFJYIHJpbmcgdXBvbiBSWCBSQU0gZnVsbCBpbnRlcnJ1cHQKKyAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQorICoKKyAqIHNwaWRlcl9uZXRfaGFuZGxlX3J4cmFtX2Z1bGwgZW1wdGllcyB0aGUgUlggcmluZyBzbyB0aGF0IHNwaWRlciBjYW4gcHV0CisgKiBtb3JlIHBhY2tldHMgaW4gaXQgYW5kIGVtcHR5IGl0cyBSWCBSQU0uIFRoaXMgaXMgY2FsbGVkIGluIGJvdHRvbSBoYWxmCisgKiBjb250ZXh0CisgKi8KK3N0YXRpYyB2b2lkCitzcGlkZXJfbmV0X2hhbmRsZV9yeHJhbV9mdWxsKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCit7CisJd2hpbGUgKHNwaWRlcl9uZXRfZGVjb2RlX29uZV9kZXNjcihjYXJkLCAwKSkKKwkJOworCXNwaWRlcl9uZXRfZW5hYmxlX3J4Y2h0YWlscyhjYXJkKTsKKwlzcGlkZXJfbmV0X2VuYWJsZV9yeGRtYWMoY2FyZCk7CisJbmV0aWZfcnhfc2NoZWR1bGUoY2FyZC0+bmV0ZGV2KTsKK30KKworLyoqCiAgKiBzcGlkZXJfbmV0X2hhbmRsZV9lcnJvcl9pcnEgLSBoYW5kbGVzIGVycm9ycyByYWlzZWQgYnkgYW4gaW50ZXJydXB0CiAgKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKICAqIEBzdGF0dXNfcmVnOiBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIDAgKEdISUlOVDBTVFMpCkBAIC0xNDQ5LDE3ICsxNDMyLDIxIEBACiAJCQkJc3dpdGNoIChpKQogCXsKIAljYXNlIFNQSURFUl9ORVRfR1RNRkxMSU5UOgotCQlpZiAobmV0aWZfbXNnX2ludHIoY2FyZCkpCisJCWlmIChuZXRpZl9tc2dfaW50cihjYXJkKSAmJiBuZXRfcmF0ZWxpbWl0KCkpCiAJCQlwcl9lcnIoIlNwaWRlciBUWCBSQU0gZnVsbFxuIik7CiAJCXNob3dfZXJyb3IgPSAwOwogCQlicmVhazsKKwljYXNlIFNQSURFUl9ORVRfR1JGREZMTElOVDogLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIFNQSURFUl9ORVRfR1JGQ0ZMTElOVDogLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIFNQSURFUl9ORVRfR1JGQkZMTElOVDogLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIFNQSURFUl9ORVRfR1JGQUZMTElOVDogLyogZmFsbHRocm91Z2ggKi8KIAljYXNlIFNQSURFUl9ORVRfR1JNRkxMSU5UOgotCQlpZiAobmV0aWZfbXNnX2ludHIoY2FyZCkpCisJCWlmIChuZXRpZl9tc2dfaW50cihjYXJkKSAmJiBuZXRfcmF0ZWxpbWl0KCkpCiAJCQlwcl9lcnIoIlNwaWRlciBSWCBSQU0gZnVsbCwgaW5jb21pbmcgcGFja2V0cyAiCi0JCQkgICAgICAgIm1pZ2h0IGJlIGRpc2NhcmRlZCAhXG4iKTsKLQkJbmV0aWZfcnhfc2NoZWR1bGUoY2FyZC0+bmV0ZGV2KTsKLQkJc3BpZGVyX25ldF9lbmFibGVfcnhjaHRhaWxzKGNhcmQpOwotCQlzcGlkZXJfbmV0X2VuYWJsZV9yeGRtYWMoY2FyZCk7CisJCQkgICAgICAgIm1pZ2h0IGJlIGRpc2NhcmRlZCFcbiIpOworCQlzcGlkZXJfbmV0X3J4X2lycV9vZmYoY2FyZCk7CisJCXRhc2tsZXRfc2NoZWR1bGUoJmNhcmQtPnJ4cmFtX2Z1bGxfdGwpOworCQlzaG93X2Vycm9yID0gMDsKIAkJYnJlYWs7CiAKIAkvKiBjYXNlIFNQSURFUl9ORVRfR1RNU0hUSU5UOiBwcm9ibGVtLCBwcmludCBhIG1lc3NhZ2UgKi8KQEAgLTE0NjcsMTAgKzE0NTQsNiBAQAogCQkvKiBhbGxyaWdodHkuIHR4IGZyb20gcHJldmlvdXMgZGVzY3Igb2sgKi8KIAkJc2hvd19lcnJvciA9IDA7CiAJCWJyZWFrOwotCS8qIGNhc2UgU1BJREVSX05FVF9HUkZERkxMSU5UOiBwcmludCBhIG1lc3NhZ2UgZG93biB0aGVyZSAqLwotCS8qIGNhc2UgU1BJREVSX05FVF9HUkZDRkxMSU5UOiBwcmludCBhIG1lc3NhZ2UgZG93biB0aGVyZSAqLwotCS8qIGNhc2UgU1BJREVSX05FVF9HUkZCRkxMSU5UOiBwcmludCBhIG1lc3NhZ2UgZG93biB0aGVyZSAqLwotCS8qIGNhc2UgU1BJREVSX05FVF9HUkZBRkxMSU5UOiBwcmludCBhIG1lc3NhZ2UgZG93biB0aGVyZSAqLwogCiAJLyogY2hhaW4gZW5kICovCiAJY2FzZSBTUElERVJfTkVUX0dERERDRUlOVDogLyogZmFsbHRocm91Z2ggKi8KQEAgLTE0ODIsNiArMTQ2NSw3IEBACiAJCQkgICAgICAgInJlc3RhcnRpbmcgRE1BQyAlYy5cbiIsCiAJCQkgICAgICAgJ0QnK2ktU1BJREVSX05FVF9HREREQ0VJTlQpOwogCQlzcGlkZXJfbmV0X3JlZmlsbF9yeF9jaGFpbihjYXJkKTsKKwkJc3BpZGVyX25ldF9lbmFibGVfcnhkbWFjKGNhcmQpOwogCQlzaG93X2Vycm9yID0gMDsKIAkJYnJlYWs7CiAKQEAgLTE0OTIsNiArMTQ3Niw3IEBACiAJY2FzZSBTUElERVJfTkVUX0dEQUlOVkRJTlQ6CiAJCS8qIGNvdWxkIGhhcHBlbiB3aGVuIHJ4IGNoYWluIGlzIGZ1bGwgKi8KIAkJc3BpZGVyX25ldF9yZWZpbGxfcnhfY2hhaW4oY2FyZCk7CisJCXNwaWRlcl9uZXRfZW5hYmxlX3J4ZG1hYyhjYXJkKTsKIAkJc2hvd19lcnJvciA9IDA7CiAJCWJyZWFrOwogCkBAIC0xNTgwLDE3ICsxNTY1LDEzIEBACiAJaWYgKCFzdGF0dXNfcmVnKQogCQlyZXR1cm4gSVJRX05PTkU7CiAKLQlpZiAoc3RhdHVzX3JlZyAmIFNQSURFUl9ORVRfVFhJTlQpCi0JCXNwaWRlcl9uZXRfcmVsZWFzZV90eF9jaGFpbihjYXJkLCAwKTsKLQogCWlmIChzdGF0dXNfcmVnICYgU1BJREVSX05FVF9SWElOVCApIHsKIAkJc3BpZGVyX25ldF9yeF9pcnFfb2ZmKGNhcmQpOwogCQluZXRpZl9yeF9zY2hlZHVsZShuZXRkZXYpOwogCX0KIAotCS8qIHdlIGRvIHRoaXMgYWZ0ZXIgcnggYW5kIHR4IHByb2Nlc3NpbmcsIGFzIHdlIHdhbnQgdGhlIHR4IGNoYWluCi0JICogcHJvY2Vzc2VkIHRvIHNlZSwgd2hldGhlciB3ZSBzaG91bGQgcmVzdGFydCB0eCBkbWEgcHJvY2Vzc2luZyAqLwotCXNwaWRlcl9uZXRfaGFuZGxlX2Vycm9yX2lycShjYXJkLCBzdGF0dXNfcmVnKTsKKwlpZiAoc3RhdHVzX3JlZyAmIFNQSURFUl9ORVRfRVJSSU5UICkKKwkJc3BpZGVyX25ldF9oYW5kbGVfZXJyb3JfaXJxKGNhcmQsIHN0YXR1c19yZWcpOwogCiAJLyogY2xlYXIgaW50ZXJydXB0IHNvdXJjZXMgKi8KIAlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dISUlOVDBTVFMsIHN0YXR1c19yZWcpOwpAQCAtMTgzMSwzNCArMTgxMiw0MCBAQAogLyoqCiAgKiBzcGlkZXJfbmV0X2Rvd25sb2FkX2Zpcm13YXJlIC0gbG9hZHMgZmlybXdhcmUgaW50byB0aGUgYWRhcHRlcgogICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCi0gKiBAZmlybXdhcmU6IGZpcm13YXJlIHBvaW50ZXIKKyAqIEBmaXJtd2FyZV9wdHI6IHBvaW50ZXIgdG8gZmlybXdhcmUgZGF0YQogICoKLSAqIHNwaWRlcl9uZXRfZG93bmxvYWRfZmlybXdhcmUgbG9hZHMgdGhlIGZpcm13YXJlIG9wZW5lZCBieQotICogc3BpZGVyX25ldF9pbml0X2Zpcm13YXJlIGludG8gdGhlIGFkYXB0ZXIuCisgKiBzcGlkZXJfbmV0X2Rvd25sb2FkX2Zpcm13YXJlIGxvYWRzIHRoZSBmaXJtd2FyZSBkYXRhIGludG8gdGhlCisgKiBhZGFwdGVyLiBJdCBhc3N1bWVzIHRoZSBsZW5ndGggZXRjLiB0byBiZSBhbGxyaWdodC4KICAqLwotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIHNwaWRlcl9uZXRfZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCwKLQkJCSAgICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmaXJtd2FyZSkKKwkJCSAgICAgdTggKmZpcm13YXJlX3B0cikKIHsKIAlpbnQgc2VxdWVuY2VyLCBpOwotCXUzMiAqZndfcHRyID0gKHUzMiAqKWZpcm13YXJlLT5kYXRhOworCXUzMiAqZndfcHRyID0gKHUzMiAqKWZpcm13YXJlX3B0cjsKIAogCS8qIHN0b3Agc2VxdWVuY2VycyAqLwogCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR1NJTklULAogCQkJICAgICBTUElERVJfTkVUX1NUT1BfU0VRX1ZBTFVFKTsKIAotCWZvciAoc2VxdWVuY2VyID0gMDsgc2VxdWVuY2VyIDwgNjsgc2VxdWVuY2VyKyspIHsKKwlmb3IgKHNlcXVlbmNlciA9IDA7IHNlcXVlbmNlciA8IFNQSURFUl9ORVRfRklSTVdBUkVfU0VRUzsKKwkgICAgIHNlcXVlbmNlcisrKSB7CiAJCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsCiAJCQkJICAgICBTUElERVJfTkVUX0dTblBSR0FEUiArIHNlcXVlbmNlciAqIDgsIDApOwotCQlmb3IgKGkgPSAwOyBpIDwgU1BJREVSX05FVF9GSVJNV0FSRV9MRU47IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgU1BJREVSX05FVF9GSVJNV0FSRV9TRVFXT1JEUzsgaSsrKSB7CiAJCQlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dTblBSR0RBVCArCiAJCQkJCSAgICAgc2VxdWVuY2VyICogOCwgKmZ3X3B0cik7CiAJCQlmd19wdHIrKzsKIAkJfQogCX0KIAorCWlmIChzcGlkZXJfbmV0X3JlYWRfcmVnKGNhcmQsIFNQSURFUl9ORVRfR1NJTklUKSkKKwkJcmV0dXJuIC1FSU87CisKIAlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dTSU5JVCwKIAkJCSAgICAgU1BJREVSX05FVF9SVU5fU0VRX1ZBTFVFKTsKKworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTE4OTAsMzEgKzE4NzcsNTMgQEAKIHN0YXRpYyBpbnQKIHNwaWRlcl9uZXRfaW5pdF9maXJtd2FyZShzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkKQogewotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZmlybXdhcmU7Ci0JaW50IGVyciA9IC1FSU87CisJc3RydWN0IGZpcm13YXJlICpmaXJtd2FyZSA9IE5VTEw7CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKKwl1OCAqZndfcHJvcCA9IE5VTEw7CisJaW50IGVyciA9IC1FTk9FTlQ7CisJaW50IGZ3X3NpemU7CiAKLQlpZiAocmVxdWVzdF9maXJtd2FyZSgmZmlybXdhcmUsCi0JCQkgICAgIFNQSURFUl9ORVRfRklSTVdBUkVfTkFNRSwgJmNhcmQtPnBkZXYtPmRldikgPCAwKSB7Ci0JCWlmIChuZXRpZl9tc2dfcHJvYmUoY2FyZCkpCi0JCQlwcl9lcnIoIkNvdWxkbid0IHJlYWQgaW4gc2VxdWVuY2VyIGRhdGEgZmlsZSAlcy5cbiIsCi0JCQkgICAgICAgU1BJREVSX05FVF9GSVJNV0FSRV9OQU1FKTsKLQkJZmlybXdhcmUgPSBOVUxMOwotCQlnb3RvIG91dDsKKwlpZiAocmVxdWVzdF9maXJtd2FyZSgoY29uc3Qgc3RydWN0IGZpcm13YXJlICoqKSZmaXJtd2FyZSwKKwkJCSAgICAgU1BJREVSX05FVF9GSVJNV0FSRV9OQU1FLCAmY2FyZC0+cGRldi0+ZGV2KSA9PSAwKSB7CisJCWlmICggKGZpcm13YXJlLT5zaXplICE9IFNQSURFUl9ORVRfRklSTVdBUkVfTEVOKSAmJgorCQkgICAgIG5ldGlmX21zZ19wcm9iZShjYXJkKSApIHsKKwkJCXByX2VycigiSW5jb3JyZWN0IHNpemUgb2Ygc3BpZGVybmV0IGZpcm13YXJlIGluICIgXAorCQkJICAgICAgICJmaWxlc3lzdGVtLiBMb29raW5nIGluIGhvc3QgZmlybXdhcmUuLi5cbiIpOworCQkJZ290byB0cnlfaG9zdF9mdzsKKwkJfQorCQllcnIgPSBzcGlkZXJfbmV0X2Rvd25sb2FkX2Zpcm13YXJlKGNhcmQsIGZpcm13YXJlLT5kYXRhKTsKKworCQlyZWxlYXNlX2Zpcm13YXJlKGZpcm13YXJlKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gdHJ5X2hvc3RfZnc7CisKKwkJZ290byBkb25lOwogCX0KIAotCWlmIChmaXJtd2FyZS0+c2l6ZSAhPSA2ICogU1BJREVSX05FVF9GSVJNV0FSRV9MRU4gKiBzaXplb2YodTMyKSkgewotCQlpZiAobmV0aWZfbXNnX3Byb2JlKGNhcmQpKQotCQkJcHJfZXJyKCJJbnZhbGlkIHNpemUgb2Ygc2VxdWVuY2VyIGRhdGEgZmlsZSAlcy5cbiIsCi0JCQkgICAgICAgU1BJREVSX05FVF9GSVJNV0FSRV9OQU1FKTsKLQkJZ290byBvdXQ7Cit0cnlfaG9zdF9mdzoKKwlkbiA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShjYXJkLT5wZGV2KTsKKwlpZiAoIWRuKQorCQlnb3RvIG91dF9lcnI7CisKKwlmd19wcm9wID0gKHU4ICopZ2V0X3Byb3BlcnR5KGRuLCAiZmlybXdhcmUiLCAmZndfc2l6ZSk7CisJaWYgKCFmd19wcm9wKQorCQlnb3RvIG91dF9lcnI7CisKKwlpZiAoIChmd19zaXplICE9IFNQSURFUl9ORVRfRklSTVdBUkVfTEVOKSAmJgorCSAgICAgbmV0aWZfbXNnX3Byb2JlKGNhcmQpICkgeworCQlwcl9lcnIoIkluY29ycmVjdCBzaXplIG9mIHNwaWRlcm5ldCBmaXJtd2FyZSBpbiAiIFwKKwkJICAgICAgICJob3N0IGZpcm13YXJlXG4iKTsKKwkJZ290byBkb25lOwogCX0KIAotCXNwaWRlcl9uZXRfZG93bmxvYWRfZmlybXdhcmUoY2FyZCwgZmlybXdhcmUpOworCWVyciA9IHNwaWRlcl9uZXRfZG93bmxvYWRfZmlybXdhcmUoY2FyZCwgZndfcHJvcCk7CiAKLQllcnIgPSAwOwotb3V0OgotCXJlbGVhc2VfZmlybXdhcmUoZmlybXdhcmUpOwotCitkb25lOgorCXJldHVybiBlcnI7CitvdXRfZXJyOgorCWlmIChuZXRpZl9tc2dfcHJvYmUoY2FyZCkpCisJCXByX2VycigiQ291bGRuJ3QgZmluZCBzcGlkZXJuZXQgZmlybXdhcmUgaW4gZmlsZXN5c3RlbSAiIFwKKwkJICAgICAgICJvciBob3N0IGZpcm13YXJlXG4iKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xOTM0LDEwICsxOTQzLDExIEBACiAJCQkgICAgIFNQSURFUl9ORVRfQ0tSQ1RSTF9SVU5fVkFMVUUpOwogCiAJLyogZW1wdHkgc2VxdWVuY2VyIGRhdGEgKi8KLQlmb3IgKHNlcXVlbmNlciA9IDA7IHNlcXVlbmNlciA8IDY7IHNlcXVlbmNlcisrKSB7CisJZm9yIChzZXF1ZW5jZXIgPSAwOyBzZXF1ZW5jZXIgPCBTUElERVJfTkVUX0ZJUk1XQVJFX1NFUVM7CisJICAgICBzZXF1ZW5jZXIrKykgewogCQlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dTblBSR0RBVCArCiAJCQkJICAgICBzZXF1ZW5jZXIgKiA4LCAweDApOwotCQlmb3IgKGkgPSAwOyBpIDwgU1BJREVSX05FVF9GSVJNV0FSRV9MRU47IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgU1BJREVSX05FVF9GSVJNV0FSRV9TRVFXT1JEUzsgaSsrKSB7CiAJCQlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dTblBSR0RBVCArCiAJCQkJCSAgICAgc2VxdWVuY2VyICogOCwgMHgwKTsKIAkJfQpAQCAtMjA2MSw3ICsyMDcxLDE1IEBACiAJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmY2FyZC0+cGRldi0+ZGV2KTsKIAogCXBjaV9zZXRfZHJ2ZGF0YShjYXJkLT5wZGV2LCBuZXRkZXYpOwotCXNwaW5fbG9ja19pbml0KCZjYXJkLT5pbnRtYXNrX2xvY2spOworCisJYXRvbWljX3NldCgmY2FyZC0+dHhfY2hhaW5fcmVsZWFzZSwwKTsKKwljYXJkLT5yeHJhbV9mdWxsX3RsLmRhdGEgPSAodW5zaWduZWQgbG9uZykgY2FyZDsKKwljYXJkLT5yeHJhbV9mdWxsX3RsLmZ1bmMgPQorCQkodm9pZCAoKikodW5zaWduZWQgbG9uZykpIHNwaWRlcl9uZXRfaGFuZGxlX3J4cmFtX2Z1bGw7CisJaW5pdF90aW1lcigmY2FyZC0+dHhfdGltZXIpOworCWNhcmQtPnR4X3RpbWVyLmZ1bmN0aW9uID0KKwkJKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKSBzcGlkZXJfbmV0X2NsZWFudXBfdHhfcmluZzsKKwljYXJkLT50eF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGNhcmQ7CiAJbmV0ZGV2LT5pcnEgPSBjYXJkLT5wZGV2LT5pcnE7CiAKIAljYXJkLT5vcHRpb25zLnJ4X2NzdW0gPSBTUElERVJfTkVUX1JYX0NTVU1fREVGQVVMVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuaCBiL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuaAppbmRleCAyMmIyZjIzLi41OTIyYjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmgKKysrIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5oCkBAIC0zMywyNSArMzMsMzIgQEAKIAogZXh0ZXJuIGNoYXIgc3BpZGVyX25ldF9kcml2ZXJfbmFtZVtdOwogCi0jZGVmaW5lIFNQSURFUl9ORVRfTUFYX01UVQkJCTIzMDgKKyNkZWZpbmUgU1BJREVSX05FVF9NQVhfRlJBTUUJCQkyMzEyCisjZGVmaW5lIFNQSURFUl9ORVRfTUFYX01UVQkJCTIyOTQKICNkZWZpbmUgU1BJREVSX05FVF9NSU5fTVRVCQkJNjQKIAogI2RlZmluZSBTUElERVJfTkVUX1JYQlVGX0FMSUdOCQkJMTI4CiAKLSNkZWZpbmUgU1BJREVSX05FVF9SWF9ERVNDUklQVE9SU19ERUZBVUxUCTY0CisjZGVmaW5lIFNQSURFUl9ORVRfUlhfREVTQ1JJUFRPUlNfREVGQVVMVAkyNTYKICNkZWZpbmUgU1BJREVSX05FVF9SWF9ERVNDUklQVE9SU19NSU4JCTE2Ci0jZGVmaW5lIFNQSURFUl9ORVRfUlhfREVTQ1JJUFRPUlNfTUFYCQkyNTYKKyNkZWZpbmUgU1BJREVSX05FVF9SWF9ERVNDUklQVE9SU19NQVgJCTUxMgogCi0jZGVmaW5lIFNQSURFUl9ORVRfVFhfREVTQ1JJUFRPUlNfREVGQVVMVAk2NAorI2RlZmluZSBTUElERVJfTkVUX1RYX0RFU0NSSVBUT1JTX0RFRkFVTFQJMjU2CiAjZGVmaW5lIFNQSURFUl9ORVRfVFhfREVTQ1JJUFRPUlNfTUlOCQkxNgotI2RlZmluZSBTUElERVJfTkVUX1RYX0RFU0NSSVBUT1JTX01BWAkJMjU2CisjZGVmaW5lIFNQSURFUl9ORVRfVFhfREVTQ1JJUFRPUlNfTUFYCQk1MTIKKworI2RlZmluZSBTUElERVJfTkVUX1RYX1RJTUVSCQkJMjAKIAogI2RlZmluZSBTUElERVJfTkVUX1JYX0NTVU1fREVGQVVMVAkJMQogCi0jZGVmaW5lIFNQSURFUl9ORVRfV0FUQ0hET0dfVElNRU9VVCA1KkhaCi0jZGVmaW5lIFNQSURFUl9ORVRfTkFQSV9XRUlHSFQgNjQKKyNkZWZpbmUgU1BJREVSX05FVF9XQVRDSERPR19USU1FT1VUCQk1MCpIWgorI2RlZmluZSBTUElERVJfTkVUX05BUElfV0VJR0hUCQkJNjQKIAotI2RlZmluZSBTUElERVJfTkVUX0ZJUk1XQVJFX0xFTgkJMTAyNAorI2RlZmluZSBTUElERVJfTkVUX0ZJUk1XQVJFX1NFUVMJNgorI2RlZmluZSBTUElERVJfTkVUX0ZJUk1XQVJFX1NFUVdPUkRTCTEwMjQKKyNkZWZpbmUgU1BJREVSX05FVF9GSVJNV0FSRV9MRU4JCShTUElERVJfTkVUX0ZJUk1XQVJFX1NFUVMgKiBcCisJCQkJCSBTUElERVJfTkVUX0ZJUk1XQVJFX1NFUVdPUkRTICogXAorCQkJCQkgc2l6ZW9mKHUzMikpCiAjZGVmaW5lIFNQSURFUl9ORVRfRklSTVdBUkVfTkFNRQkic3BpZGVyX2Z3LmJpbiIKIAogLyoqIHNwaWRlcl9uZXQgU01NSU8gcmVnaXN0ZXJzICovCkBAIC0xNDIsMTQgKzE0OSwxMiBAQAogLyoqIFNDT05GSUcgcmVnaXN0ZXJzICovCiAjZGVmaW5lIFNQSURFUl9ORVRfU0NPTkZJR19JT0FDVEUJMHgwMDAwMjgxMAogCi0vKiogaGFyZGNvZGVkIHJlZ2lzdGVyIHZhbHVlcyAqLwotI2RlZmluZSBTUElERVJfTkVUX0lOVDBfTUFTS19WQUxVRQkweDNmN2ZlM2ZmCi0jZGVmaW5lIFNQSURFUl9ORVRfSU5UMV9NQVNLX1ZBTFVFCTB4ZmZmZmZmZmYKKy8qKiBpbnRlcnJ1cHQgbWFzayByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU1BJREVSX05FVF9JTlQwX01BU0tfVkFMVUUJMHgzZjdmZTJjNworI2RlZmluZSBTUElERVJfTkVUX0lOVDFfTUFTS19WQUxVRQkweGZmZmY3ZmY3CiAvKiBubyBNQUMgYWJvcnRzIC0+IGF1dG8gcmV0cmFuc21pc3Npb24gKi8KLSNkZWZpbmUgU1BJREVSX05FVF9JTlQyX01BU0tfVkFMVUUJMHhmZmZmZmZmMQorI2RlZmluZSBTUElERVJfTkVUX0lOVDJfTUFTS19WQUxVRQkweGZmZWY3ZmYxCiAKLS8qIGNsZWFyIGNvdW50ZXIgd2hlbiBpbnRlcnJ1cHQgc291cmNlcyBhcmUgY2xlYXJlZAotI2RlZmluZSBTUElERVJfTkVUX0ZSQU1FTlVNX1ZBTFVFCTB4MDAwMWYwMDEgKi8KIC8qIHdlIHJlbHkgb24gZmxhZ2dlZCBkZXNjcmlwdG9yIGludGVycnVwdHMgKi8KICNkZWZpbmUgU1BJREVSX05FVF9GUkFNRU5VTV9WQUxVRQkweDAwMDAwMDAwCiAvKiBzZXQgdGhpcyBmaXJzdCwgdGhlbiB0aGUgRlJBTUVOVU1fVkFMVUUgKi8KQEAgLTE2OCw3ICsxNzMsNyBAQAogI2lmIDAKICNkZWZpbmUgU1BJREVSX05FVF9XT0xfVkFMVUUJCTB4MDAwMDAwMDAKICNlbmRpZgotI2RlZmluZSBTUElERVJfTkVUX0lQU0VDSU5JVF9WQUxVRQkweDAwZjAwMGY4CisjZGVmaW5lIFNQSURFUl9ORVRfSVBTRUNJTklUX1ZBTFVFCTB4NmY3MTZmNzEKIAogLyogcGF1c2UgZnJhbWVzOiBhdXRvbWF0aWMsIG5vIHVwcGVyIHJldHJhbnNtaXNzaW9uIGNvdW50ICovCiAvKiBvdXRzaWRlIGxvb3BiYWNrIG1vZGU6IEVUT01PRCBzaWduYWwgZG9udCBtYXR0ZXIsIG5vdCBjb25uZWN0ZWQgKi8KQEAgLTMxOCw2ICszMjMsMTAgQEAKICNkZWZpbmUgU1BJREVSX05FVF9SWElOVAkoICgxIDw8IFNQSURFUl9ORVRfR0RBRkRDSU5UKSB8IFwKIAkJCQkgICgxIDw8IFNQSURFUl9ORVRfR1JNRkxMSU5UKSApCiAKKyNkZWZpbmUgU1BJREVSX05FVF9FUlJJTlQJKCAweGZmZmZmZmZmICYgXAorCQkJCSAgKH5TUElERVJfTkVUX1RYSU5UKSAmIFwKKwkJCQkgICh+U1BJREVSX05FVF9SWElOVCkgKQorCiAjZGVmaW5lIFNQSURFUl9ORVRfR1BSRVhFQwkJMHg4MDAwMDAwMAogI2RlZmluZSBTUElERVJfTkVUX0dQUkRBVF9NQVNLCQkweDAwMDBmZmZmCiAKQEAgLTM1OCw5ICszNjcsNiBAQAogLyogZGVzY3IgcmVhZHksIGRlc2NyIGlzIGluIG1pZGRsZSBvZiBjaGFpbiwgZ2V0IGludGVycnVwdCBvbiBjb21wbGV0aW9uICovCiAjZGVmaW5lIFNQSURFUl9ORVRfRE1BQ19SWF9DQVJET1dORUQJMHhhMDgwMDAwMAogCi0vKiBtdWx0aWNhc3QgaXMgbm8gcHJvYmxlbSAqLwotI2RlZmluZSBTUElERVJfTkVUX0RBVEFfRVJST1JfTUFTSwkweGZmZmZiZmZmCi0KIGVudW0gc3BpZGVyX25ldF9kZXNjcl9zdGF0dXMgewogCVNQSURFUl9ORVRfREVTQ1JfQ09NUExFVEUJCT0gMHgwMCwgLyogdXNlZCBpbiByeCBhbmQgdHggKi8KIAlTUElERVJfTkVUX0RFU0NSX1JFU1BPTlNFX0VSUk9SCQk9IDB4MDEsIC8qIHVzZWQgaW4gcnggYW5kIHR4ICovCkBAIC0zNzMsOSArMzc5LDkgQEAKIAogc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgewogCS8qIGFzIGRlZmluZWQgYnkgdGhlIGhhcmR3YXJlICovCi0JZG1hX2FkZHJfdCBidWZfYWRkcjsKKwl1MzIgYnVmX2FkZHI7CiAJdTMyIGJ1Zl9zaXplOwotCWRtYV9hZGRyX3QgbmV4dF9kZXNjcl9hZGRyOworCXUzMiBuZXh0X2Rlc2NyX2FkZHI7CiAJdTMyIGRtYWNfY21kX3N0YXR1czsKIAl1MzIgcmVzdWx0X3NpemU7CiAJdTMyIHZhbGlkX3NpemU7CS8qIGFsbCB6ZXJvZXMgZm9yIHR4ICovCkBAIC0zODQsNyArMzkwLDcgQEAKIAogCS8qIHVzZWQgaW4gdGhlIGRyaXZlciAqLwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JZG1hX2FkZHJfdCBidXNfYWRkcjsKKwl1MzIgYnVzX2FkZHI7CiAJc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKm5leHQ7CiAJc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKnByZXY7CiB9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CkBAIC0zOTYsMjEgKzQwMiwyMSBAQAogfTsKIAogLyogZGVzY3JpcHRvciBkYXRhX3N0YXR1cyBiaXRzICovCi0jZGVmaW5lIFNQSURFUl9ORVRfUlhJUENISwkJMjkKLSNkZWZpbmUgU1BJREVSX05FVF9UQ1BVRFBJUENISwkJMjgKLSNkZWZpbmUgU1BJREVSX05FVF9EQVRBX1NUQVRVU19DSEtfTUFTSwkoMSA8PCBTUElERVJfTkVUX1JYSVBDSEsgfCBcCi0JCQkJCSAxIDw8IFNQSURFUl9ORVRfVENQVURQSVBDSEspCi0KKyNkZWZpbmUgU1BJREVSX05FVF9SWF9JUENISwkJMjkKKyNkZWZpbmUgU1BJREVSX05FVF9SWF9UQ1BDSEsJCTI4CiAjZGVmaW5lIFNQSURFUl9ORVRfVkxBTl9QQUNLRVQJCTIxCisjZGVmaW5lIFNQSURFUl9ORVRfREFUQV9TVEFUVVNfQ0tTVU1fTUFTSyAoICgxIDw8IFNQSURFUl9ORVRfUlhfSVBDSEspIHwgXAorCQkJCQkgICgxIDw8IFNQSURFUl9ORVRfUlhfVENQQ0hLKSApCiAKIC8qIGRlc2NyaXB0b3IgZGF0YV9lcnJvciBiaXRzICovCi0jZGVmaW5lIFNQSURFUl9ORVRfUlhJUENIS0VSUgkJMjcKLSNkZWZpbmUgU1BJREVSX05FVF9SWFRDUENIS0VSUgkJMjYKLSNkZWZpbmUgU1BJREVSX05FVF9EQVRBX0VSUk9SX0NIS19NQVNLCSgxIDw8IFNQSURFUl9ORVRfUlhJUENIS0VSUiB8IFwKLQkJCQkJIDEgPDwgU1BJREVSX05FVF9SWFRDUENIS0VSUikKKyNkZWZpbmUgU1BJREVSX05FVF9SWF9JUENIS0VSUgkJMjcKKyNkZWZpbmUgU1BJREVSX05FVF9SWF9SWFRDUENIS0VSUgkyOAogCi0vKiB0aGUgY2FzZXMgd2UgZG9uJ3QgcGFzcyB0aGUgcGFja2V0IHRvIHRoZSBzdGFjayAqLwotI2RlZmluZSBTUElERVJfTkVUX0RFU1RST1lfUlhfRkxBR1MJMHg3MDEzODAwMAorI2RlZmluZSBTUElERVJfTkVUX0RBVEFfRVJSX0NLU1VNX01BU0sJKDEgPDwgU1BJREVSX05FVF9SWF9JUENIS0VSUikKKworLyogdGhlIGNhc2VzIHdlIGRvbid0IHBhc3MgdGhlIHBhY2tldCB0byB0aGUgc3RhY2suCisgKiA3MDFiODAwMCB3b3VsZCBiZSBjb3JyZWN0LCBidXQgZXZlcnkgcGFja2V0cyBnZXRzIHRoYXQgZmxhZyAqLworI2RlZmluZSBTUElERVJfTkVUX0RFU1RST1lfUlhfRkxBR1MJMHg3MDBiODAwMAogCiAjZGVmaW5lIFNQSURFUl9ORVRfREVTQ1JfU0laRQkJMzIKIApAQCAtNDQ1LDEzICs0NTEsMTYgQEAKIAogCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyX2NoYWluIHR4X2NoYWluOwogCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyX2NoYWluIHJ4X2NoYWluOwotCXNwaW5sb2NrX3QgY2hhaW5fbG9jazsKKwlhdG9taWNfdCByeF9jaGFpbl9yZWZpbGw7CisJYXRvbWljX3QgdHhfY2hhaW5fcmVsZWFzZTsKIAogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldGRldl9zdGF0czsKIAogCXN0cnVjdCBzcGlkZXJfbmV0X29wdGlvbnMgb3B0aW9uczsKIAogCXNwaW5sb2NrX3QgaW50bWFza19sb2NrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCByeHJhbV9mdWxsX3RsOworCXN0cnVjdCB0aW1lcl9saXN0IHR4X3RpbWVyOwogCiAJc3RydWN0IHdvcmtfc3RydWN0IHR4X3RpbWVvdXRfdGFzazsKIAlhdG9taWNfdCB0eF90aW1lb3V0X3Rhc2tfY291bnRlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXRfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldF9ldGh0b29sLmMKaW5kZXggZDQyZTYwYi4uYTViYjBiNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXRfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXRfZXRodG9vbC5jCkBAIC0xMTMsNiArMTEzLDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB1aW50MzJfdAorc3BpZGVyX25ldF9ldGh0b29sX2dldF90eF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisgICAgICAgIHJldHVybiAobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfQ1NVTSkgIT0gMDsKK30KKworc3RhdGljIGludAorc3BpZGVyX25ldF9ldGh0b29sX3NldF90eF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQzMl90IGRhdGEpCit7CisgICAgICAgIGlmIChkYXRhKQorICAgICAgICAgICAgICAgIG5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19DU1VNOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9IV19DU1VNOworCisgICAgICAgIHJldHVybiAwOworfQorCiBzdHJ1Y3QgZXRodG9vbF9vcHMgc3BpZGVyX25ldF9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X3NldHRpbmdzCQk9IHNwaWRlcl9uZXRfZXRodG9vbF9nZXRfc2V0dGluZ3MsCiAJLmdldF9kcnZpbmZvCQk9IHNwaWRlcl9uZXRfZXRodG9vbF9nZXRfZHJ2aW5mbywKQEAgLTEyMiw1ICsxMzksNyBAQAogCS5ud2F5X3Jlc2V0CQk9IHNwaWRlcl9uZXRfZXRodG9vbF9ud2F5X3Jlc2V0LAogCS5nZXRfcnhfY3N1bQkJPSBzcGlkZXJfbmV0X2V0aHRvb2xfZ2V0X3J4X2NzdW0sCiAJLnNldF9yeF9jc3VtCQk9IHNwaWRlcl9uZXRfZXRodG9vbF9zZXRfcnhfY3N1bSwKKwkuZ2V0X3R4X2NzdW0JCT0gc3BpZGVyX25ldF9ldGh0b29sX2dldF90eF9jc3VtLAorCS5zZXRfdHhfY3N1bQkJPSBzcGlkZXJfbmV0X2V0aHRvb2xfc2V0X3R4X2NzdW0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW4zbGFuY2UuYyBiL2RyaXZlcnMvbmV0L3N1bjNsYW5jZS5jCmluZGV4IDVjOGZjZDQuLjAxYmRiMjMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW4zbGFuY2UuYworKysgYi9kcml2ZXJzL25ldC9zdW4zbGFuY2UuYwpAQCAtMzg5LDcgKzM4OSw3IEBACiAJZGV2LT5zdG9wID0gJmxhbmNlX2Nsb3NlOwogCWRldi0+Z2V0X3N0YXRzID0gJmxhbmNlX2dldF9zdGF0czsKIAlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7Ci0JZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSAwOworCWRldi0+c2V0X21hY19hZGRyZXNzID0gTlVMTDsKIC8vCUtMVURHRSAtLSBSRU1PVkUgTUUKIAlzZXRfYml0KF9fTElOS19TVEFURV9QUkVTRU5ULCAmZGV2LT5zdGF0ZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RnMy5jIGIvZHJpdmVycy9uZXQvdGczLmMKaW5kZXggZWI4NmIwNS4uZjJkMWRhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdGczLmMKKysrIGIvZHJpdmVycy9uZXQvdGczLmMKQEAgLTY5LDggKzY5LDggQEAKIAogI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJ0ZzMiCiAjZGVmaW5lIFBGWCBEUlZfTU9EVUxFX05BTUUJIjogIgotI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjMuNDciCi0jZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiRGVjIDI4LCAyMDA1IgorI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjMuNDgiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiSmFuIDE2LCAyMDA2IgogCiAjZGVmaW5lIFRHM19ERUZfTUFDX01PREUJMAogI2RlZmluZSBURzNfREVGX1JYX01PREUJCTAKQEAgLTEzMjUsMTAgKzEzMjUsMTIgQEAKIAkJdmFsICY9IH4oKDEgPDwgMTYpIHwgKDEgPDwgNCkgfCAoMSA8PCAyKSB8ICgxIDw8IDEpIHwgMSk7CiAJCXR3MzIoMHg3ZDAwLCB2YWwpOwogCQlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRU5BQkxFX0FTRikpIHsKLQkJCXRnM19udnJhbV9sb2NrKHRwKTsKKwkJCWludCBlcnI7CisKKwkJCWVyciA9IHRnM19udnJhbV9sb2NrKHRwKTsKIAkJCXRnM19oYWx0X2NwdSh0cCwgUlhfQ1BVX0JBU0UpOwotCQkJdHczMl9mKE5WUkFNX1NXQVJCLCBTV0FSQl9SRVFfQ0xSMCk7Ci0JCQl0ZzNfbnZyYW1fdW5sb2NrKHRwKTsKKwkJCWlmICghZXJyKQorCQkJCXRnM19udnJhbV91bmxvY2sodHApOwogCQl9CiAJfQogCkBAIC00MTkzLDE0ICs0MTk1LDE5IEBACiAJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19OVlJBTSkgewogCQlpbnQgaTsKIAotCQl0dzMyKE5WUkFNX1NXQVJCLCBTV0FSQl9SRVFfU0VUMSk7Ci0JCWZvciAoaSA9IDA7IGkgPCA4MDAwOyBpKyspIHsKLQkJCWlmICh0cjMyKE5WUkFNX1NXQVJCKSAmIFNXQVJCX0dOVDEpCi0JCQkJYnJlYWs7Ci0JCQl1ZGVsYXkoMjApOworCQlpZiAodHAtPm52cmFtX2xvY2tfY250ID09IDApIHsKKwkJCXR3MzIoTlZSQU1fU1dBUkIsIFNXQVJCX1JFUV9TRVQxKTsKKwkJCWZvciAoaSA9IDA7IGkgPCA4MDAwOyBpKyspIHsKKwkJCQlpZiAodHIzMihOVlJBTV9TV0FSQikgJiBTV0FSQl9HTlQxKQorCQkJCQlicmVhazsKKwkJCQl1ZGVsYXkoMjApOworCQkJfQorCQkJaWYgKGkgPT0gODAwMCkgeworCQkJCXR3MzIoTlZSQU1fU1dBUkIsIFNXQVJCX1JFUV9DTFIxKTsKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCX0KIAkJfQotCQlpZiAoaSA9PSA4MDAwKQotCQkJcmV0dXJuIC1FTk9ERVY7CisJCXRwLT5udnJhbV9sb2NrX2NudCsrOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTQyMDgsOCArNDIxNSwxMiBAQAogLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KIHN0YXRpYyB2b2lkIHRnM19udnJhbV91bmxvY2soc3RydWN0IHRnMyAqdHApCiB7Ci0JaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19OVlJBTSkKLQkJdHczMl9mKE5WUkFNX1NXQVJCLCBTV0FSQl9SRVFfQ0xSMSk7CisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19OVlJBTSkgeworCQlpZiAodHAtPm52cmFtX2xvY2tfY250ID4gMCkKKwkJCXRwLT5udnJhbV9sb2NrX2NudC0tOworCQlpZiAodHAtPm52cmFtX2xvY2tfY250ID09IDApCisJCQl0dzMyX2YoTlZSQU1fU1dBUkIsIFNXQVJCX1JFUV9DTFIxKTsKKwl9CiB9CiAKIC8qIHRwLT5sb2NrIGlzIGhlbGQuICovCkBAIC00MzIwLDggKzQzMzEsMTMgQEAKIAl2b2lkICgqd3JpdGVfb3ApKHN0cnVjdCB0ZzMgKiwgdTMyLCB1MzIpOwogCWludCBpOwogCi0JaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9TVU5fNTcwWCkpCisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9TVU5fNTcwWCkpIHsKIAkJdGczX252cmFtX2xvY2sodHApOworCQkvKiBObyBtYXRjaGluZyB0ZzNfbnZyYW1fdW5sb2NrKCkgYWZ0ZXIgdGhpcyBiZWNhdXNlCisJCSAqIGNoaXAgcmVzZXQgYmVsb3cgd2lsbCB1bmRvIHRoZSBudnJhbSBsb2NrLgorCQkgKi8KKwkJdHAtPm52cmFtX2xvY2tfY250ID0gMDsKKwl9CiAKIAkvKgogCSAqIFdlIG11c3QgYXZvaWQgdGhlIHJlYWRsKCkgdGhhdCBub3JtYWxseSB0YWtlcyBwbGFjZS4KQEAgLTQ3MTcsNiArNDczMywxMCBAQAogCQkgICAgICAgKG9mZnNldCA9PSBSWF9DUFVfQkFTRSA/ICJSWCIgOiAiVFgiKSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KKworCS8qIENsZWFyIGZpcm13YXJlJ3MgbnZyYW0gYXJiaXRyYXRpb24uICovCisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19OVlJBTSkKKwkJdHczMihOVlJBTV9TV0FSQiwgU1dBUkJfUkVRX0NMUjApOwogCXJldHVybiAwOwogfQogCkBAIC00NzM2LDcgKzQ3NTYsNyBAQAogc3RhdGljIGludCB0ZzNfbG9hZF9maXJtd2FyZV9jcHUoc3RydWN0IHRnMyAqdHAsIHUzMiBjcHVfYmFzZSwgdTMyIGNwdV9zY3JhdGNoX2Jhc2UsCiAJCQkJIGludCBjcHVfc2NyYXRjaF9zaXplLCBzdHJ1Y3QgZndfaW5mbyAqaW5mbykKIHsKLQlpbnQgZXJyLCBpOworCWludCBlcnIsIGxvY2tfZXJyLCBpOwogCXZvaWQgKCp3cml0ZV9vcCkoc3RydWN0IHRnMyAqLCB1MzIsIHUzMik7CiAKIAlpZiAoY3B1X2Jhc2UgPT0gVFhfQ1BVX0JBU0UgJiYKQEAgLTQ3NTUsOSArNDc3NSwxMCBAQAogCS8qIEl0IGlzIHBvc3NpYmxlIHRoYXQgYm9vdGNvZGUgaXMgc3RpbGwgbG9hZGluZyBhdCB0aGlzIHBvaW50LgogCSAqIEdldCB0aGUgbnZyYW0gbG9jayBmaXJzdCBiZWZvcmUgaGFsdGluZyB0aGUgY3B1LgogCSAqLwotCXRnM19udnJhbV9sb2NrKHRwKTsKKwlsb2NrX2VyciA9IHRnM19udnJhbV9sb2NrKHRwKTsKIAllcnIgPSB0ZzNfaGFsdF9jcHUodHAsIGNwdV9iYXNlKTsKLQl0ZzNfbnZyYW1fdW5sb2NrKHRwKTsKKwlpZiAoIWxvY2tfZXJyKQorCQl0ZzNfbnZyYW1fdW5sb2NrKHRwKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIApAQCAtODE4Miw3ICs4MjAzLDcgQEAKIAkJZGF0YVsxXSA9IDE7CiAJfQogCWlmIChldGVzdC0+ZmxhZ3MgJiBFVEhfVEVTVF9GTF9PRkZMSU5FKSB7Ci0JCWludCBpcnFfc3luYyA9IDA7CisJCWludCBlcnIsIGlycV9zeW5jID0gMDsKIAogCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CiAJCQl0ZzNfbmV0aWZfc3RvcCh0cCk7CkBAIC04MTkyLDExICs4MjEzLDEyIEBACiAJCXRnM19mdWxsX2xvY2sodHAsIGlycV9zeW5jKTsKIAogCQl0ZzNfaGFsdCh0cCwgUkVTRVRfS0lORF9TVVNQRU5ELCAxKTsKLQkJdGczX252cmFtX2xvY2sodHApOworCQllcnIgPSB0ZzNfbnZyYW1fbG9jayh0cCk7CiAJCXRnM19oYWx0X2NwdSh0cCwgUlhfQ1BVX0JBU0UpOwogCQlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykpCiAJCQl0ZzNfaGFsdF9jcHUodHAsIFRYX0NQVV9CQVNFKTsKLQkJdGczX252cmFtX3VubG9jayh0cCk7CisJCWlmICghZXJyKQorCQkJdGczX252cmFtX3VubG9jayh0cCk7CiAKIAkJaWYgKHRnM190ZXN0X3JlZ2lzdGVycyh0cCkgIT0gMCkgewogCQkJZXRlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKQEAgLTg1ODgsNyArODYxMCwxMSBAQAogCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwMSkgewogCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX05WUkFNOwogCi0JCXRnM19udnJhbV9sb2NrKHRwKTsKKwkJaWYgKHRnM19udnJhbV9sb2NrKHRwKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIiVzOiBDYW5ub3QgZ2V0IG52YXJtIGxvY2ssICIKKwkJCSAgICAgICAidGczX252cmFtX2luaXQgZmFpbGVkLlxuIiwgdHAtPmRldi0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KIAkJdGczX2VuYWJsZV9udnJhbV9hY2Nlc3ModHApOwogCiAJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc1MikKQEAgLTg2ODYsNyArODcxMiw5IEBACiAJaWYgKG9mZnNldCA+IE5WUkFNX0FERFJfTVNLKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXRnM19udnJhbV9sb2NrKHRwKTsKKwlyZXQgPSB0ZzNfbnZyYW1fbG9jayh0cCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCXRnM19lbmFibGVfbnZyYW1fYWNjZXNzKHRwKTsKIApAQCAtODc4NSwxMCArODgxMyw2IEBACiAKIAkJb2Zmc2V0ID0gb2Zmc2V0ICsgKHBhZ2VzaXplIC0gcGFnZV9vZmYpOwogCi0JCS8qIE52cmFtIGxvY2sgcmVsZWFzZWQgYnkgdGczX252cmFtX3JlYWQoKSBhYm92ZSwKLQkJICogc28gbmVlZCB0byBnZXQgaXQgYWdhaW4uCi0JCSAqLwotCQl0ZzNfbnZyYW1fbG9jayh0cCk7CiAJCXRnM19lbmFibGVfbnZyYW1fYWNjZXNzKHRwKTsKIAogCQkvKgpAQCAtODkyNSw3ICs4OTQ5LDkgQEAKIAllbHNlIHsKIAkJdTMyIGdyY19tb2RlOwogCi0JCXRnM19udnJhbV9sb2NrKHRwKTsKKwkJcmV0ID0gdGczX252cmFtX2xvY2sodHApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQl0ZzNfZW5hYmxlX252cmFtX2FjY2Vzcyh0cCk7CiAJCWlmICgodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzUwX1BMVVMpICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90ZzMuaCBiL2RyaXZlcnMvbmV0L3RnMy5oCmluZGV4IDg5MGUxNjMuLmU4MjQzMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RnMy5oCisrKyBiL2RyaXZlcnMvbmV0L3RnMy5oCkBAIC0yMjc1LDYgKzIyNzUsNyBAQAogCWRtYV9hZGRyX3QJCQlzdGF0c19tYXBwaW5nOwogCXN0cnVjdCB3b3JrX3N0cnVjdAkJcmVzZXRfdGFzazsKIAorCWludAkJCQludnJhbV9sb2NrX2NudDsKIAl1MzIJCQkJbnZyYW1fc2l6ZTsKIAl1MzIJCQkJbnZyYW1fcGFnZXNpemU7CiAJdTMyCQkJCW52cmFtX2plZGVjbnVtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jCmluZGV4IDEyNWVkMDAuLmM2N2M5MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwX2NvcmUuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC90dWxpcF9jb3JlLmMKQEAgLTE1NjQsNyArMTU2NCw3IEBACiAJCQkgICAgZGV2LT5kZXZfYWRkciwgNik7CiAJCX0KICNlbmRpZgotI2lmIGRlZmluZWQoX19pMzg2X18pCQkvKiBQYXRjaCB1cCB4ODYgQklPUyBidWcuICovCisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQkvKiBQYXRjaCB1cCB4ODYgQklPUyBidWcuICovCiAJCWlmIChsYXN0X2lycSkKIAkJCWlycSA9IGxhc3RfaXJxOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC91bGk1MjZ4LmMgYi9kcml2ZXJzL25ldC90dWxpcC91bGk1MjZ4LmMKaW5kZXggMWE0MzE2MzMuLjk4Mzk4MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL3VsaTUyNnguYworKysgYi9kcml2ZXJzL25ldC90dWxpcC91bGk1MjZ4LmMKQEAgLTE2ODksOSArMTY4OSw5IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIlVMaSBNNTI2MS9NNTI2MyBmYXN0IGV0aGVybmV0IGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1NT0RVTEVfUEFSTShkZWJ1ZywgImkiKTsKLU1PRFVMRV9QQVJNKG1vZGUsICJpIik7Ci1NT0RVTEVfUEFSTShjcjZzZXQsICJpIik7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0obW9kZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjcjZzZXQsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVUxpIE01MjYxL001MjYzIGVuYWJsZSBkZWJ1Z2dpbmcgKDAtMSkiKTsKIE1PRFVMRV9QQVJNX0RFU0MobW9kZSwgIlVMaSBNNTI2MS9NNTI2MzogQml0IDA6IDEwLzEwME1icHMsIGJpdCAyOiBkdXBsZXgsIGJpdCA4OiBIb21lUE5BIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jIGIvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMKaW5kZXggODJjNmI3NS4uYzJkNTkwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMKKysrIGIvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMKQEAgLTc5MSw3ICs3OTEsNyBAQAogI2VuZGlmCiAKIAlpZiAodnB0ci0+ZmxhZ3MgJiBWRUxPQ0lUWV9GTEFHU19UWF9DU1VNKSB7Ci0JCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19DU1VNOworCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSVBfQ1NVTTsKIAl9CiAKIAlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX21haW4uYyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX21haW4uYwppbmRleCAyYjk0OGVhLi40MDkyNmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfbWFpbi5jCkBAIC02NDEsNyArNjQxLDcgQEAKICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmc2MtPmxtY19sb2NrLCBmbGFncyk7CiAKICAgICBpZihzYy0+Y2hlY2sgIT0gMHhCRUFGQ0FGRSl7Ci0gICAgICAgIHByaW50aygiTE1DOiBDb3JydXB0IG5ldF9kZXZpY2Ugc3R1Y3QsIGJyZWFraW5nIG91dFxuIik7CisgICAgICAgIHByaW50aygiTE1DOiBDb3JydXB0IG5ldF9kZXZpY2Ugc3RydWN0LCBicmVha2luZyBvdXRcbiIpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjLT5sbWNfbG9jaywgZmxhZ3MpOwogICAgICAgICByZXR1cm47CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3BjMzAwX3R0eS5jIGIvZHJpdmVycy9uZXQvd2FuL3BjMzAwX3R0eS5jCmluZGV4IDUyZjI2YjkuLjkzMWNiZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF90dHkuYworKysgYi9kcml2ZXJzL25ldC93YW4vcGMzMDBfdHR5LmMKQEAgLTY4OSw3ICs2ODksNyBAQAogCQkJCQl9CiAJCQkJfQkKIAkJCQljcGNfdHR5LT5idWZfcnguZmlyc3QgPSBjcGNfdHR5LT5idWZfcnguZmlyc3QtPm5leHQ7Ci0JCQkJa2ZyZWUoYnVmKTsKKwkJCQlrZnJlZSgodm9pZCAqKWJ1Zik7CiAJCQkJYnVmID0gY3BjX3R0eS0+YnVmX3J4LmZpcnN0OwogCQkJCWZsZ19yeCA9IDE7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vc2RsYS5jIGIvZHJpdmVycy9uZXQvd2FuL3NkbGEuYwppbmRleCAwMzZhZGM0Li4yMmU3OTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vc2RsYS5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhLmMKQEAgLTMyOSw5ICszMjksOSBAQAogCiBzdHJ1Y3QgX2RsY2lfc3RhdCAKIHsKLQlzaG9ydCBkbGNpCQlfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQljaGFyICBmbGFncwkJX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci19OworCXNob3J0IGRsY2k7CisJY2hhciAgZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgX2ZyYWRfc3RhdCAKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi94MjVfYXN5LmMgYi9kcml2ZXJzL25ldC93YW4veDI1X2FzeS5jCmluZGV4IGJkZjY3MmMuLjljM2NjYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi94MjVfYXN5LmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3gyNV9hc3kuYwpAQCAtNTE1LDExICs1MTUsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHgyNV9hc3lfcmVjZWl2ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0JcmV0dXJuIDY1NTM2OyAgLyogV2UgY2FuIGhhbmRsZSBhbiBpbmZpbml0ZSBhbW91bnQgb2YgZGF0YS4gOi0pICovCi19Ci0KIC8qCiAgKiBIYW5kbGUgdGhlICdyZWNlaXZlciBkYXRhIHJlYWR5JyBpbnRlcnJ1cHQuCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgJ3R0eV9pbycgbW9kdWxlIGluIHRoZSBrZXJuZWwgd2hlbgpAQCAtNTczLDYgKzU2OCw3IEBACiAKIAlzbC0+dHR5ID0gdHR5OwogCXR0eS0+ZGlzY19kYXRhID0gc2w7CisJdHR5LT5yZWNlaXZlX3Jvb20gPSA2NTUzNjsKIAlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikgIHsKIAkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOwogCX0KQEAgLTc3OSw3ICs3NzUsNiBAQAogCS5jbG9zZQkJPSB4MjVfYXN5X2Nsb3NlX3R0eSwKIAkuaW9jdGwJCT0geDI1X2FzeV9pb2N0bCwKIAkucmVjZWl2ZV9idWYJPSB4MjVfYXN5X3JlY2VpdmVfYnVmLAotCS5yZWNlaXZlX3Jvb20JPSB4MjVfYXN5X3JlY2VpdmVfcm9vbSwKIAkud3JpdGVfd2FrZXVwCT0geDI1X2FzeV93cml0ZV93YWtldXAsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93ZC5jIGIvZHJpdmVycy9uZXQvd2QuYwppbmRleCBiMDNmZWFlLi43Y2FhOGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93ZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dkLmMKQEAgLTEyNywxMyArMTI3LDYgQEAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAotc3RhdGljIHZvaWQgY2xlYW51cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7Ci0JcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIgLSBXRF9OSUNfT0ZGU0VULCBXRF9JT19FWFRFTlQpOwotCWlvdW5tYXAoZWlfc3RhdHVzLm1lbSk7Ci19Ci0KICNpZm5kZWYgTU9EVUxFCiBzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCB3ZF9wcm9iZShpbnQgdW5pdCkKIHsKQEAgLTUzOCw2ICs1MzEsMTMgQEAKIAlyZXR1cm4gLUVOWElPOwogfQogCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciAtIFdEX05JQ19PRkZTRVQsIFdEX0lPX0VYVEVOVCk7CisJaW91bm1hcChlaV9zdGF0dXMubWVtKTsKK30KKwogdm9pZAogY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnCmluZGV4IDI0Zjc5NjcuLjIzM2E0ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZwpAQCAtMjQsMTAgKzI0LDYgQEAKIAkgIHRoZSB0b29scyBmcm9tCiAJICA8aHR0cDovL3d3dy5ocGwuaHAuY29tL3BlcnNvbmFsL0plYW5fVG91cnJpbGhlcy9MaW51eC9Ub29scy5odG1sPi4KIAotCSAgU29tZSB1c2VyLWxldmVsIGRyaXZlcnMgZm9yIHNjYXJhYiBkZXZpY2VzIHdoaWNoIGRvbid0IHJlcXVpcmUKLQkgIHNwZWNpYWwga2VybmVsIHN1cHBvcnQgYXJlIGF2YWlsYWJsZSBmcm9tCi0JICA8ZnRwOi8vc2hhZG93LmNhYmkubmV0L3B1Yi9MaW51eC8+LgotCiAjIE5vdGUgOiB0aGUgY2FyZHMgYXJlIG9ic29sZXRlIChjYW4ndCBidXkgdGhlbSBhbnltb3JlKSwgYnV0IHRoZSBkcml2ZXJzCiAjIGFyZSBub3QsIGFzIHBlb3BsZSBhcmUgc3RpbGwgdXNpbmcgdGhlbS4uLgogY29tbWVudCAiT2Jzb2xldGUgV2lyZWxlc3MgY2FyZHMgc3VwcG9ydCAocHJlLTgwMi4xMSkiCkBAIC0xNjAsNyArMTU2LDcgQEAKICAgICAgICAgICA8aHR0cDovL3d3dy5ocGwuaHAuY29tL3BlcnNvbmFsL0plYW5fVG91cnJpbGhlcy9MaW51eC9Ub29scy5odG1sPi4KICAKICAgICAgICAgICBJZiB5b3Ugd2FudCB0byBjb21waWxlIHRoZSBkcml2ZXIgYXMgYSBtb2R1bGUgKCA9IGNvZGUgd2hpY2ggY2FuIGJlCi0gICAgICAgICAgaW5zZXJ0ZWQgaW4gYW5kIHJlbXZvZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91IHdhbnQpLAorICAgICAgICAgIGluc2VydGVkIGluIGFuZCByZW1vdmVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdSB3YW50KSwKICAgICAgICAgICBzYXkgTSBoZXJlIGFuZCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZQogICAgICAgICAgIHdpbGwgYmUgY2FsbGVkIGlwdzIxMDAua28uCiAJCkBAIC0yMTMsNyArMjA5LDcgQEAKICAgICAgICAgICA8aHR0cDovL3d3dy5ocGwuaHAuY29tL3BlcnNvbmFsL0plYW5fVG91cnJpbGhlcy9MaW51eC9Ub29scy5odG1sPi4KICAKICAgICAgICAgICBJZiB5b3Ugd2FudCB0byBjb21waWxlIHRoZSBkcml2ZXIgYXMgYSBtb2R1bGUgKCA9IGNvZGUgd2hpY2ggY2FuIGJlCi0gICAgICAgICAgaW5zZXJ0ZWQgaW4gYW5kIHJlbXZvZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91IHdhbnQpLAorICAgICAgICAgIGluc2VydGVkIGluIGFuZCByZW1vdmVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdSB3YW50KSwKICAgICAgICAgICBzYXkgTSBoZXJlIGFuZCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZQogICAgICAgICAgIHdpbGwgYmUgY2FsbGVkIGlwdzIyMDAua28uCiAKQEAgLTI0Myw3ICsyMzksNyBAQAogCiBjb25maWcgQUlSTwogCXRyaXN0YXRlICJDaXNjby9BaXJvbmV0IDM0WC8zNVgvNDUwMC80ODAwIElTQSBhbmQgUENJIGNhcmRzIgotCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIElTQV9ETUFfQVBJICYmIChQQ0kgfHwgQlJPS0VOKQorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIElTQV9ETUFfQVBJICYmIENSWVBUTyAmJiAoUENJIHx8IEJST0tFTikKIAktLS1oZWxwLS0tCiAJICBUaGlzIGlzIHRoZSBzdGFuZGFyZCBMaW51eCBkcml2ZXIgdG8gc3VwcG9ydCBDaXNjby9BaXJvbmV0IElTQSBhbmQKIAkgIFBDSSA4MDIuMTEgd2lyZWxlc3MgY2FyZHMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKaW5kZXggZWU4NjZmZC4uYTRjN2FlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYwpAQCAtNTY2OCwxMyArNTY2OCwxMyBAQAogCQlpbnQgY2hhbm5lbCA9IGZ3cnEtPm07CiAJCS8qIFdlIHNob3VsZCBkbyBhIGJldHRlciBjaGVjayB0aGFuIHRoYXQsCiAJCSAqIGJhc2VkIG9uIHRoZSBjYXJkIGNhcGFiaWxpdHkgISEhICovCi0JCWlmKChjaGFubmVsIDwgMSkgfHwgKGNoYW5uZWwgPiAxNikpIHsKKwkJaWYoKGNoYW5uZWwgPCAxKSB8fCAoY2hhbm5lbCA+IDE0KSkgewogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBOZXcgY2hhbm5lbCB2YWx1ZSBvZiAlZCBpcyBpbnZhbGlkIVxuIiwgZGV2LT5uYW1lLCBmd3JxLT5tKTsKIAkJCXJjID0gLUVJTlZBTDsKIAkJfSBlbHNlIHsKIAkJCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOwogCQkJLyogWWVzICEgV2UgY2FuIHNldCBpdCAhISEgKi8KLQkJCWxvY2FsLT5jb25maWcuY2hhbm5lbFNldCA9ICh1MTYpKGNoYW5uZWwgLSAxKTsKKwkJCWxvY2FsLT5jb25maWcuY2hhbm5lbFNldCA9ICh1MTYpIGNoYW5uZWw7CiAJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CiAJCX0KIAl9CkBAIC01NjkyLDYgKzU2OTIsNyBAQAogewogCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OwogCVN0YXR1c1JpZCBzdGF0dXNfcmlkOwkJLyogQ2FyZCBzdGF0dXMgaW5mbyAqLworCWludCBjaDsKIAogCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOwogCWlmICgobG9jYWwtPmNvbmZpZy5vcG1vZGUgJiAweEZGKSA9PSBNT0RFX1NUQV9FU1MpCkBAIC01Njk5LDE2ICs1NzAwLDE0IEBACiAJZWxzZQogCQlyZWFkU3RhdHVzUmlkKGxvY2FsLCAmc3RhdHVzX3JpZCwgMSk7CiAKLSNpZmRlZiBXRVhUX1VTRUNIQU5ORUxTCi0JZndycS0+bSA9ICgoaW50KXN0YXR1c19yaWQuY2hhbm5lbCkgKyAxOwotCWZ3cnEtPmUgPSAwOwotI2Vsc2UKLQl7Ci0JCWludCBmID0gKGludClzdGF0dXNfcmlkLmNoYW5uZWw7Ci0JCWZ3cnEtPm0gPSBmcmVxdWVuY3lfbGlzdFtmXSAqIDEwMDAwMDsKKwljaCA9IChpbnQpc3RhdHVzX3JpZC5jaGFubmVsOworCWlmKChjaCA+IDApICYmIChjaCA8IDE1KSkgeworCQlmd3JxLT5tID0gZnJlcXVlbmN5X2xpc3RbY2ggLSAxXSAqIDEwMDAwMDsKIAkJZndycS0+ZSA9IDE7CisJfSBlbHNlIHsKKwkJZndycS0+bSA9IGNoOworCQlmd3JxLT5lID0gMDsKIAl9Ci0jZW5kaWYKIAogCXJldHVybiAwOwogfQpAQCAtNTc4Myw3ICs1NzgyLDcgQEAKIAkvKiBJZiBub25lLCB3ZSBtYXkgd2FudCB0byBnZXQgdGhlIG9uZSB0aGF0IHdhcyBzZXQgKi8KIAogCS8qIFB1c2ggaXQgb3V0ICEgKi8KLQlkd3JxLT5sZW5ndGggPSBzdGF0dXNfcmlkLlNTSURsZW4gKyAxOworCWR3cnEtPmxlbmd0aCA9IHN0YXR1c19yaWQuU1NJRGxlbjsKIAlkd3JxLT5mbGFncyA9IDE7IC8qIGFjdGl2ZSAqLwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYwppbmRleCBlNDcyOWRkLi45OGE3NmYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMKQEAgLTE0MDcsNiArMTQwNywxNyBAQAogewogCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAorCS8qIFNlbmQgZXZlbnQgdG8gdXNlcnNwYWNlIHRoYXQgd2UgYXJlIGRpc2Fzc29jaWF0aW5nICovCisJaWYgKHByaXYtPnN0YXRpb25fc3RhdGUgPT0gU1RBVElPTl9TVEFURV9SRUFEWSkgeworCQl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisKKwkJd3JxdS5kYXRhLmxlbmd0aCA9IDA7CisJCXdycXUuZGF0YS5mbGFncyA9IDA7CisJCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOworCQl3aXJlbGVzc19zZW5kX2V2ZW50KHByaXYtPmRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisJfQorCiAJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9ET1dOKTsKIAogCWlmIChwcml2LT5idXNfdHlwZSA9PSBCVVNfVFlQRV9QQ0NBUkQpCkBAIC0xNzA3LDExICsxNzE4LDExIEBACiAJaWYgKHByaXYtPm5ld19TU0lEX3NpemUgIT0gMCkgewogCQltZW1jcHkoZXh0cmEsIHByaXYtPm5ld19TU0lELCBwcml2LT5uZXdfU1NJRF9zaXplKTsKIAkJZXh0cmFbcHJpdi0+bmV3X1NTSURfc2l6ZV0gPSAnXDAnOwotCQlkd3JxLT5sZW5ndGggPSBwcml2LT5uZXdfU1NJRF9zaXplICsgMTsKKwkJZHdycS0+bGVuZ3RoID0gcHJpdi0+bmV3X1NTSURfc2l6ZTsKIAl9IGVsc2UgewogCQltZW1jcHkoZXh0cmEsIHByaXYtPlNTSUQsIHByaXYtPlNTSURfc2l6ZSk7CiAJCWV4dHJhW3ByaXYtPlNTSURfc2l6ZV0gPSAnXDAnOwotCQlkd3JxLT5sZW5ndGggPSBwcml2LT5TU0lEX3NpemUgKyAxOworCQlkd3JxLT5sZW5ndGggPSBwcml2LT5TU0lEX3NpemU7CiAJfQogCiAJZHdycS0+ZmxhZ3MgPSAhcHJpdi0+Y29ubmVjdF90b19hbnlfQlNTOyAvKiBhY3RpdmUgKi8KQEAgLTE3ODAsMTAgKzE3OTEsMTAgQEAKIAkJCXByaXYtPndlcF9pc19vbiA9IDE7CiAJCQlwcml2LT5leGNsdWRlX3VuZW5jcnlwdGVkID0gMTsKIAkJCWlmIChwcml2LT53ZXBfa2V5X2xlbltpbmRleF0gPiA1KSB7Ci0JCQkJcHJpdi0+cGFpcndpc2VfY2lwaGVyX3N1aXRlID0gQ0lQSEVSX1NVSVRFX1dFUF82NDsKKwkJCQlwcml2LT5wYWlyd2lzZV9jaXBoZXJfc3VpdGUgPSBDSVBIRVJfU1VJVEVfV0VQXzEyODsKIAkJCQlwcml2LT5lbmNyeXB0aW9uX2xldmVsID0gMjsKIAkJCX0gZWxzZSB7Ci0JCQkJcHJpdi0+cGFpcndpc2VfY2lwaGVyX3N1aXRlID0gQ0lQSEVSX1NVSVRFX1dFUF8xMjg7CisJCQkJcHJpdi0+cGFpcndpc2VfY2lwaGVyX3N1aXRlID0gQ0lQSEVSX1NVSVRFX1dFUF82NDsKIAkJCQlwcml2LT5lbmNyeXB0aW9uX2xldmVsID0gMTsKIAkJCX0KIAkJfQpAQCAtMTg1Myw2ICsxODY0LDE4MSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGF0bWVsX3NldF9lbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7CisJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOworCWludCBpZHgsIGtleV9sZW47CisKKwkvKiBEZXRlcm1pbmUgYW5kIHZhbGlkYXRlIHRoZSBrZXkgaW5kZXggKi8KKwlpZHggPSBlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGlkeCkgeworCQlpZiAoaWR4IDwgMSB8fCBpZHggPiBXRVBfS0VZUykKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZHgtLTsKKwl9IGVsc2UKKwkJaWR4ID0gcHJpdi0+ZGVmYXVsdF9rZXk7CisKKwlpZiAoKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgfHwKKwkgICAgZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19OT05FKSB7CisJCXByaXYtPndlcF9pc19vbiA9IDA7CisJCXByaXYtPmVuY3J5cHRpb25fbGV2ZWwgPSAwOworCQlwcml2LT5wYWlyd2lzZV9jaXBoZXJfc3VpdGUgPSBDSVBIRVJfU1VJVEVfTk9ORTsKKwl9CisKKwlpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpCisJCXByaXYtPmRlZmF1bHRfa2V5ID0gaWR4OworCisJLyogU2V0IHRoZSByZXF1ZXN0ZWQga2V5ICovCisJc3dpdGNoIChleHQtPmFsZykgeworCWNhc2UgSVdfRU5DT0RFX0FMR19OT05FOgorCQlicmVhazsKKwljYXNlIElXX0VOQ09ERV9BTEdfV0VQOgorCQlpZiAoZXh0LT5rZXlfbGVuID4gNSkgeworCQkJcHJpdi0+d2VwX2tleV9sZW5baWR4XSA9IDEzOworCQkJcHJpdi0+cGFpcndpc2VfY2lwaGVyX3N1aXRlID0gQ0lQSEVSX1NVSVRFX1dFUF8xMjg7CisJCQlwcml2LT5lbmNyeXB0aW9uX2xldmVsID0gMjsKKwkJfSBlbHNlIGlmIChleHQtPmtleV9sZW4gPiAwKSB7CisJCQlwcml2LT53ZXBfa2V5X2xlbltpZHhdID0gNTsKKwkJCXByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZSA9IENJUEhFUl9TVUlURV9XRVBfNjQ7CisJCQlwcml2LT5lbmNyeXB0aW9uX2xldmVsID0gMTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXByaXYtPndlcF9pc19vbiA9IDE7CisJCW1lbXNldChwcml2LT53ZXBfa2V5c1tpZHhdLCAwLCAxMyk7CisJCWtleV9sZW4gPSBtaW4gKChpbnQpZXh0LT5rZXlfbGVuLCBwcml2LT53ZXBfa2V5X2xlbltpZHhdKTsKKwkJbWVtY3B5KHByaXYtPndlcF9rZXlzW2lkeF0sIGV4dC0+a2V5LCBrZXlfbGVuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIC1FSU5QUk9HUkVTUzsKK30KKworc3RhdGljIGludCBhdG1lbF9nZXRfZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOworCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKKwlpbnQgaWR4LCBtYXhfa2V5X2xlbjsKKworCW1heF9rZXlfbGVuID0gZW5jb2RpbmctPmxlbmd0aCAtIHNpemVvZigqZXh0KTsKKwlpZiAobWF4X2tleV9sZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlkeCA9IGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlpZiAoaWR4KSB7CisJCWlmIChpZHggPCAxIHx8IGlkeCA+IFdFUF9LRVlTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlkeC0tOworCX0gZWxzZQorCQlpZHggPSBwcml2LT5kZWZhdWx0X2tleTsKKworCWVuY29kaW5nLT5mbGFncyA9IGlkeCArIDE7CisJbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKTsKKwkKKwlpZiAoIXByaXYtPndlcF9pc19vbikgeworCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfTk9ORTsKKwkJZXh0LT5rZXlfbGVuID0gMDsKKwkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwl9IGVsc2UgeworCQlpZiAocHJpdi0+ZW5jcnlwdGlvbl9sZXZlbCA+IDApCisJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfV0VQOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlleHQtPmtleV9sZW4gPSBwcml2LT53ZXBfa2V5X2xlbltpZHhdOworCQltZW1jcHkoZXh0LT5rZXksIHByaXYtPndlcF9rZXlzW2lkeF0sIGV4dC0+a2V5X2xlbik7CisJCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9zZXRfYXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpd19wYXJhbSAqcGFyYW0gPSAmd3JxdS0+cGFyYW07CisKKwlzd2l0Y2ggKHBhcmFtLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKKwljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046CisJY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKKwljYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgorCWNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKKwljYXNlIElXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0w6CisJY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKKwkJLyoKKwkJICogYXRtZWwgZG9lcyBub3QgdXNlIHRoZXNlIHBhcmFtZXRlcnMKKwkJICovCisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisJCXByaXYtPmV4Y2x1ZGVfdW5lbmNyeXB0ZWQgPSBwYXJhbS0+dmFsdWUgPyAxIDogMDsKKwkJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6IHsKKwkJCWlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19TSEFSRURfS0VZKSB7CisJCQkJcHJpdi0+ZXhjbHVkZV91bmVuY3J5cHRlZCA9IDE7CisJCQl9IGVsc2UgaWYgKHBhcmFtLT52YWx1ZSAmIElXX0FVVEhfQUxHX09QRU5fU1lTVEVNKSB7CisJCQkJcHJpdi0+ZXhjbHVkZV91bmVuY3J5cHRlZCA9IDA7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6CisJCS8qIFNpbGVudGx5IGFjY2VwdCBkaXNhYmxlIG9mIFdQQSAqLworCQlpZiAocGFyYW0tPnZhbHVlID4gMCkKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCXJldHVybiAtRUlOUFJPR1JFU1M7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfZ2V0X2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gJndycXUtPnBhcmFtOworCisJc3dpdGNoIChwYXJhbS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisJCXBhcmFtLT52YWx1ZSA9IHByaXYtPmV4Y2x1ZGVfdW5lbmNyeXB0ZWQ7CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorCQlpZiAocHJpdi0+ZXhjbHVkZV91bmVuY3J5cHRlZCA9PSAxKQorCQkJcGFyYW0tPnZhbHVlID0gSVdfQVVUSF9BTEdfU0hBUkVEX0tFWTsKKwkJZWxzZQorCQkJcGFyYW0tPnZhbHVlID0gSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorCQlwYXJhbS0+dmFsdWUgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKwogc3RhdGljIGludCBhdG1lbF9nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJICBjaGFyICpjd3JxLApAQCAtMjI4OSwxMyArMjQ3NSwxNSBAQAogewogCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgaTsKLQlzdGF0aWMgY29uc3QgdTggYmNhc3RbXSA9IHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9OworCXN0YXRpYyBjb25zdCB1OCBhbnlbXSA9IHsgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiB9OworCXN0YXRpYyBjb25zdCB1OCBvZmZbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoYXdycS0+c2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAobWVtY21wKGJjYXN0LCBhd3JxLT5zYV9kYXRhLCA2KSA9PSAwKSB7CisJaWYgKCFtZW1jbXAoYW55LCBhd3JxLT5zYV9kYXRhLCA2KSB8fAorCSAgICAhbWVtY21wKG9mZiwgYXdycS0+c2FfZGF0YSwgNikpIHsKIAkJZGVsX3RpbWVyX3N5bmMoJnByaXYtPm1hbmFnZW1lbnRfdGltZXIpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aXJxbG9jaywgZmxhZ3MpOwogCQlhdG1lbF9zY2FuKHByaXYsIDEpOwpAQCAtMjM3OCw2ICsyNTY2LDE1IEBACiAJKGl3X2hhbmRsZXIpIGF0bWVsX2dldF9lbmNvZGUsCQkvKiBTSU9DR0lXRU5DT0RFICovCiAJKGl3X2hhbmRsZXIpIGF0bWVsX3NldF9wb3dlciwJCS8qIFNJT0NTSVdQT1dFUiAqLwogCShpd19oYW5kbGVyKSBhdG1lbF9nZXRfcG93ZXIsCQkvKiBTSU9DR0lXUE9XRVIgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NTSVdHRU5JRSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NHSVdHRU5JRSAqLworCShpd19oYW5kbGVyKSBhdG1lbF9zZXRfYXV0aCwJCS8qIFNJT0NTSVdBVVRIICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX2dldF9hdXRoLAkJLyogU0lPQ0dJV0FVVEggKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfc2V0X2VuY29kZWV4dCwJLyogU0lPQ1NJV0VOQ09ERUVYVCAqLworCShpd19oYW5kbGVyKSBhdG1lbF9nZXRfZW5jb2RlZXh0LAkvKiBTSU9DR0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ1NJV1BNS1NBICovCiB9OwogCiBzdGF0aWMgY29uc3QgaXdfaGFuZGxlciBhdG1lbF9wcml2YXRlX2hhbmRsZXJbXSA9CkBAIC0yOTI0LDYgKzMxMjEsOCBAQAogCXUxNiBhc3NfaWQgPSBsZTE2X3RvX2NwdShhc3NfcmVzcC0+YXNzX2lkKTsKIAl1MTYgcmF0ZXNfbGVuID0gYXNzX3Jlc3AtPmxlbmd0aCA+IDQgPyA0IDogYXNzX3Jlc3AtPmxlbmd0aDsKIAorCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwogCWlmIChmcmFtZV9sZW4gPCA4ICsgcmF0ZXNfbGVuKQogCQlyZXR1cm47CiAKQEAgLTI5NTQsNiArMzE1MywxNCBAQAogCQlwcml2LT5zdGF0aW9uX2lzX2Fzc29jaWF0ZWQgPSAxOwogCQlwcml2LT5zdGF0aW9uX3dhc19hc3NvY2lhdGVkID0gMTsKIAkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9SRUFEWSk7CisKKwkJLyogU2VuZCBhc3NvY2lhdGlvbiBldmVudCB0byB1c2Vyc3BhY2UgKi8KKwkJd3JxdS5kYXRhLmxlbmd0aCA9IDA7CisJCXdycXUuZGF0YS5mbGFncyA9IDA7CisJCW1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcHJpdi0+Q3VycmVudEJTU0lELCBFVEhfQUxFTik7CisJCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCXdpcmVsZXNzX3NlbmRfZXZlbnQocHJpdi0+ZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKwogCQlyZXR1cm47CiAJfQogCkBAIC0zNjMyLDYgKzM4MzksNyBAQAogCiAJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXU4IGNvbmZpZ3VyYXRpb247CisJaW50IG9sZF9zdGF0ZSA9IHByaXYtPnN0YXRpb25fc3RhdGU7CiAKIAkvKiBkYXRhIHRvIGFkZCB0byB0aGUgZmlybXdhcmUgbmFtZXMsIGluIHByaW9yaXR5IG9yZGVyCiAJICAgdGhpcyBpbXBsZW1lbmVudHMgZmlybXdhcmUgdmVyc2lvbmluZyAqLwpAQCAtMzc5Miw2ICs0MDAwLDE3IEBACiAJZWxzZQogCQlidWlsZF93ZXBfbWliKHByaXYpOwogCisJaWYgKG9sZF9zdGF0ZSA9PSBTVEFUSU9OX1NUQVRFX1JFQURZKQorCXsKKwkJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCisJCXdycXUuZGF0YS5sZW5ndGggPSAwOworCQl3cnF1LmRhdGEuZmxhZ3MgPSAwOworCQl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQltZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKKwkJd2lyZWxlc3Nfc2VuZF9ldmVudChwcml2LT5kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworCX0KKwogCXJldHVybiAxOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9LY29uZmlnCmluZGV4IDU2ZjQxYzcuLmM4ZjYyODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9LY29uZmlnCkBAIC0yNiwxMSArMjYsMjUgQEAKIAlkZXBlbmRzIG9uIEhPU1RBUAogCS0tLWhlbHAtLS0KIAlDb25maWd1cmUgSG9zdCBBUCBkcml2ZXIgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBmaXJtd2FyZSBpbWFnZQotCWRvd25sb2FkLiBDdXJyZW50IHZlcnNpb24gc3VwcG9ydHMgb25seSBkb3dubG9hZGluZyB0byB2b2xhdGlsZSwgaS5lLiwKLQlSQU0gbWVtb3J5LiBGbGFzaCB1cGdyYWRlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLgorCWRvd25sb2FkLiBUaGlzIG9wdGlvbiBieSBpdHNlbGYgb25seSBlbmFibGVzIGRvd25sb2FkaW5nIHRvIHRoZQorCXZvbGF0aWxlIG1lbW9yeSwgaS5lLiB0aGUgY2FyZCBSQU0uIFRoaXMgb3B0aW9uIGlzIHJlcXVpcmVkIHRvCisJc3VwcG9ydCBjYXJkcyB0aGF0IGRvbid0IGhhdmUgZmlybXdhcmUgaW4gZmxhc2gsIHN1Y2ggYXMgRC1MaW5rCisJRFdMLTUyMCByZXYgRSBhbmQgRC1MaW5rIERXTC02NTAgcmV2IFAuCiAKLQlGaXJtd2FyZSBpbWFnZSBkb3dubG9hZGluZyBuZWVkcyB1c2VyIHNwYWNlIHRvb2wsIHByaXNtMl9zcmVjLiBJdCBpcwotCWF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9ob3N0YXAuZXBpdGVzdC5maS8uCisJRmlybXdhcmUgaW1hZ2UgZG93bmxvYWRpbmcgbmVlZHMgYSB1c2VyIHNwYWNlIHRvb2wsIHByaXNtMl9zcmVjLgorCUl0IGlzIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly9ob3N0YXAuZXBpdGVzdC5maS8uCisKK2NvbmZpZyBIT1NUQVBfRklSTVdBUkVfTlZSQU0KKwlib29sICJTdXBwb3J0IGZvciBub24tdm9sYXRpbGUgZmlybXdhcmUgZG93bmxvYWQiCisJZGVwZW5kcyBvbiBIT1NUQVBfRklSTVdBUkUKKwktLS1oZWxwLS0tCisJQWxsb3cgSG9zdCBBUCBkcml2ZXIgdG8gd3JpdGUgZmlybXdhcmUgaW1hZ2VzIHRvIHRoZSBub24tdm9sYXRpbGUKKwljYXJkIG1lbW9yeSwgaS5lLiBmbGFzaCBtZW1vcnkgdGhhdCBzdXJ2aXZlcyBwb3dlciBjeWNsaW5nLgorCUVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIGNoYW5nZSBjYXJkIGZpcm13YXJlCisJcGVybWFuZW50bHkuCisKKwlGaXJtd2FyZSBpbWFnZSBkb3dubG9hZGluZyBuZWVkcyBhIHVzZXIgc3BhY2UgdG9vbCwgcHJpc20yX3NyZWMuCisJSXQgaXMgYXZhaWxhYmxlIGZyb20gaHR0cDovL2hvc3RhcC5lcGl0ZXN0LmZpLy4KIAogY29uZmlnIEhPU1RBUF9QTFgKIAl0cmlzdGF0ZSAiSG9zdCBBUCBkcml2ZXIgZm9yIFByaXNtMi8yLjUvMyBpbiBQTFg5MDUyIFBDSSBhZGFwdG9ycyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9NYWtlZmlsZQppbmRleCAzNTNjY2I5Li5iOGU0MWE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL01ha2VmaWxlCkBAIC0xLDQgKzEsNSBAQAotaG9zdGFwLXkgOj0gaG9zdGFwX21haW4ubworaG9zdGFwLXkgOj0gaG9zdGFwXzgwMjExX3J4Lm8gaG9zdGFwXzgwMjExX3R4Lm8gaG9zdGFwX2FwLm8gaG9zdGFwX2luZm8ubyBcCisgICAgICAgICAgICBob3N0YXBfaW9jdGwubyBob3N0YXBfbWFpbi5vIGhvc3RhcF9wcm9jLm8gCiBvYmotJChDT05GSUdfSE9TVEFQKSArPSBob3N0YXAubwogCiBvYmotJChDT05GSUdfSE9TVEFQX0NTKSArPSBob3N0YXBfY3MubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcC5oCmluZGV4IDVmYWM4OWIuLjVlNjM3NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwLmgKQEAgLTEsNiArMSwxNSBAQAogI2lmbmRlZiBIT1NUQVBfSAogI2RlZmluZSBIT1NUQVBfSAogCisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorCisjaW5jbHVkZSAiaG9zdGFwX3dsYW4uaCIKKyNpbmNsdWRlICJob3N0YXBfYXAuaCIKKworc3RhdGljIGNvbnN0IGxvbmcgZnJlcV9saXN0W10gPSB7IDI0MTIsIDI0MTcsIDI0MjIsIDI0MjcsIDI0MzIsIDI0MzcsIDI0NDIsCisJCQkJICAyNDQ3LCAyNDUyLCAyNDU3LCAyNDYyLCAyNDY3LCAyNDcyLCAyNDg0IH07CisjZGVmaW5lIEZSRVFfQ09VTlQgKHNpemVvZihmcmVxX2xpc3QpIC8gc2l6ZW9mKGZyZXFfbGlzdFswXSkpCisKIC8qIGhvc3RhcC5jICovCiAKIGV4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmhvc3RhcF9wcm9jOwpAQCAtNDAsNiArNDksMjYgQEAKIGludCBwcmlzbTJfc3RhX3NlbmRfbWdtdChsb2NhbF9pbmZvX3QgKmxvY2FsLCB1OCAqZHN0LCB1MTYgc3R5cGUsCiAJCQkgdTggKmJvZHksIHNpemVfdCBib2R5bGVuKTsKIGludCBwcmlzbTJfc3RhX2RlYXV0aChsb2NhbF9pbmZvX3QgKmxvY2FsLCB1MTYgcmVhc29uKTsKK2ludCBwcmlzbTJfd2RzX2FkZChsb2NhbF9pbmZvX3QgKmxvY2FsLCB1OCAqcmVtb3RlX2FkZHIsCisJCSAgIGludCBydG5sX2xvY2tlZCk7CitpbnQgcHJpc20yX3dkc19kZWwobG9jYWxfaW5mb190ICpsb2NhbCwgdTggKnJlbW90ZV9hZGRyLAorCQkgICBpbnQgcnRubF9sb2NrZWQsIGludCBkb19ub3RfcmVtb3ZlKTsKKworCisvKiBob3N0YXBfYXAuYyAqLworCitpbnQgYXBfY29udHJvbF9hZGRfbWFjKHN0cnVjdCBtYWNfcmVzdHJpY3Rpb25zICptYWNfcmVzdHJpY3Rpb25zLCB1OCAqbWFjKTsKK2ludCBhcF9jb250cm9sX2RlbF9tYWMoc3RydWN0IG1hY19yZXN0cmljdGlvbnMgKm1hY19yZXN0cmljdGlvbnMsIHU4ICptYWMpOwordm9pZCBhcF9jb250cm9sX2ZsdXNoX21hY3Moc3RydWN0IG1hY19yZXN0cmljdGlvbnMgKm1hY19yZXN0cmljdGlvbnMpOworaW50IGFwX2NvbnRyb2xfa2lja19tYWMoc3RydWN0IGFwX2RhdGEgKmFwLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqbWFjKTsKK3ZvaWQgYXBfY29udHJvbF9raWNrYWxsKHN0cnVjdCBhcF9kYXRhICphcCk7Cit2b2lkICogYXBfY3J5cHRfZ2V0X3B0cnMoc3RydWN0IGFwX2RhdGEgKmFwLCB1OCAqYWRkciwgaW50IHBlcm1hbmVudCwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKioqY3J5cHQpOworaW50IHByaXNtMl9hcF9nZXRfc3RhX3F1YWwobG9jYWxfaW5mb190ICpsb2NhbCwgc3RydWN0IHNvY2thZGRyIGFkZHJbXSwKKwkJCSAgIHN0cnVjdCBpd19xdWFsaXR5IHF1YWxbXSwgaW50IGJ1Zl9zaXplLAorCQkJICAgaW50IGFwbGlzdCk7CitpbnQgcHJpc20yX2FwX3RyYW5zbGF0ZV9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZmZlcik7CitpbnQgcHJpc20yX2hvc3RhcGQoc3RydWN0IGFwX2RhdGEgKmFwLCBzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKnBhcmFtKTsKIAogCiAvKiBob3N0YXBfcHJvYy5jICovCkBAIC01NCw0ICs4MywxMiBAQAogdm9pZCBob3N0YXBfaW5mb19wcm9jZXNzKGxvY2FsX2luZm9fdCAqbG9jYWwsIHN0cnVjdCBza19idWZmICpza2IpOwogCiAKKy8qIGhvc3RhcF9pb2N0bC5jICovCisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgaG9zdGFwX2l3X2hhbmRsZXJfZGVmOworZXh0ZXJuIHN0cnVjdCBldGh0b29sX29wcyBwcmlzbTJfZXRodG9vbF9vcHM7CisKK2ludCBob3N0YXBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOworCisKICNlbmRpZiAvKiBIT1NUQVBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMS5oCmluZGV4IGJmNTA2ZjUuLjFmYzcyZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfODAyMTEuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExLmgKQEAgLTEsNiArMSw5IEBACiAjaWZuZGVmIEhPU1RBUF84MDIxMV9ICiAjZGVmaW5lIEhPU1RBUF84MDIxMV9ICiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPG5ldC9pZWVlODAyMTFfY3J5cHQuaD4KKwogc3RydWN0IGhvc3RhcF9pZWVlODAyMTFfbWdtdCB7CiAJdTE2IGZyYW1lX2NvbnRyb2w7CiAJdTE2IGR1cmF0aW9uOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMV9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMV9yeC5jCmluZGV4IGZmYWM1MDguLjdlMDRkYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfODAyMTFfcnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExX3J4LmMKQEAgLTEsNyArMSwxOCBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L2llZWU4MDIxMV9jcnlwdC5oPgogCiAjaW5jbHVkZSAiaG9zdGFwXzgwMjExLmgiCiAjaW5jbHVkZSAiaG9zdGFwLmgiCisjaW5jbHVkZSAiaG9zdGFwX2FwLmgiCisKKy8qIFNlZSBJRUVFIDgwMi4xSCBmb3IgTExDL1NOQVAgZW5jYXBzdWxhdGlvbi9kZWNhcHN1bGF0aW9uICovCisvKiBFdGhlcm5ldC1JSSBzbmFwIGhlYWRlciAoUkZDMTA0MiBmb3IgbW9zdCBFdGhlclR5cGVzKSAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmZjMTA0Ml9oZWFkZXJbXSA9Cit7IDB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKy8qIEJyaWRnZS1UdW5uZWwgaGVhZGVyIChmb3IgRXRoZXJUeXBlcyBFVEhfUF9BQVJQIGFuZCBFVEhfUF9JUFgpICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBicmlkZ2VfdHVubmVsX2hlYWRlcltdID0KK3sgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHhmOCB9OworLyogTm8gZW5jYXBzdWxhdGlvbiBoZWFkZXIgaWYgRXRoZXJUeXBlIDwgMHg2MDAgKD1sZW5ndGgpICovCiAKIHZvaWQgaG9zdGFwX2R1bXBfcnhfODAyMTEoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgc3RydWN0IGhvc3RhcF84MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXRzKQpAQCAtNDM1LDcgKzQ0Niw3IEBACiB9CiAKIAotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbnQKIGhvc3RhcF9yeF9mcmFtZV9tZ210KGxvY2FsX2luZm9fdCAqbG9jYWwsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgICAgc3RydWN0IGhvc3RhcF84MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXRzLCB1MTYgdHlwZSwKIAkJICAgICB1MTYgc3R5cGUpCkBAIC00OTksNyArNTEwLDcgQEAKIAogCiAvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IG5ldF9kZXZpY2UgKnByaXNtMl9yeF9nZXRfd2RzKGxvY2FsX2luZm9fdCAqbG9jYWwsCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnByaXNtMl9yeF9nZXRfd2RzKGxvY2FsX2luZm9fdCAqbG9jYWwsCiAJCQkJCQkgICB1OCAqYWRkcikKIHsKIAlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2UgPSBOVUxMOwpAQCAtNTE5LDcgKzUzMCw3IEBACiB9CiAKIAotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbnQKIGhvc3RhcF9yeF9mcmFtZV93ZHMobG9jYWxfaW5mb190ICpsb2NhbCwgc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkciwKIAkJICAgIHUxNiBmYywgc3RydWN0IG5ldF9kZXZpY2UgKip3ZHMpCiB7CkBAIC02MTUsNyArNjI2LDcgQEAKIAogCiAvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW50CiBob3N0YXBfcnhfZnJhbWVfZGVjcnlwdChsb2NhbF9pbmZvX3QgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCkKIHsKQEAgLTY1NCw3ICs2NjUsNyBAQAogCiAKIC8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSAqLwotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbnQKIGhvc3RhcF9yeF9mcmFtZV9kZWNyeXB0X21zZHUobG9jYWxfaW5mb190ICpsb2NhbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgaW50IGtleWlkeCwgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfODAyMTFfdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfODAyMTFfdHguYwppbmRleCA5ZDI0ZjhhLi40YTg1ZTYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExX3R4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMV90eC5jCkBAIC0xLDMgKzEsMTggQEAKKyNpbmNsdWRlICJob3N0YXBfODAyMTEuaCIKKyNpbmNsdWRlICJob3N0YXBfY29tbW9uLmgiCisjaW5jbHVkZSAiaG9zdGFwX3dsYW4uaCIKKyNpbmNsdWRlICJob3N0YXAuaCIKKyNpbmNsdWRlICJob3N0YXBfYXAuaCIKKworLyogU2VlIElFRUUgODAyLjFIIGZvciBMTEMvU05BUCBlbmNhcHN1bGF0aW9uL2RlY2Fwc3VsYXRpb24gKi8KKy8qIEV0aGVybmV0LUlJIHNuYXAgaGVhZGVyIChSRkMxMDQyIGZvciBtb3N0IEV0aGVyVHlwZXMpICovCitzdGF0aWMgdW5zaWduZWQgY2hhciByZmMxMDQyX2hlYWRlcltdID0KK3sgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OworLyogQnJpZGdlLVR1bm5lbCBoZWFkZXIgKGZvciBFdGhlclR5cGVzIEVUSF9QX0FBUlAgYW5kIEVUSF9QX0lQWCkgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJyaWRnZV90dW5uZWxfaGVhZGVyW10gPQoreyAweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweGY4IH07CisvKiBObyBlbmNhcHN1bGF0aW9uIGhlYWRlciBpZiBFdGhlclR5cGUgPCAweDYwMCAoPWxlbmd0aCkgKi8KKwogdm9pZCBob3N0YXBfZHVtcF90eF84MDIxMShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2FwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2FwLmMKaW5kZXggOWRhOTRhYi4uNzUzYTFkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9hcC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfYXAuYwpAQCAtMTYsNiArMTYsMTQgQEAKICAqICAgKDg4MDIuMTE6IDUuNSkKICAqLwogCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisKKyNpbmNsdWRlICJob3N0YXBfd2xhbi5oIgorI2luY2x1ZGUgImhvc3RhcC5oIgorI2luY2x1ZGUgImhvc3RhcF9hcC5oIgorCiBzdGF0aWMgaW50IG90aGVyX2FwX3BvbGljeVtNQVhfUEFSTV9ERVZJQ0VTXSA9IHsgQVBfT1RIRVJfQVBfU0tJUF9BTEwsCiAJCQkJCQkgREVGX0lOVFMgfTsKIG1vZHVsZV9wYXJhbV9hcnJheShvdGhlcl9hcF9wb2xpY3ksIGludCwgTlVMTCwgMDQ0NCk7CkBAIC0zNjAsOCArMzY4LDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IGFwX2NvbnRyb2xfYWRkX21hYyhzdHJ1Y3QgbWFjX3Jlc3RyaWN0aW9ucyAqbWFjX3Jlc3RyaWN0aW9ucywKLQkJCSAgICAgIHU4ICptYWMpCitpbnQgYXBfY29udHJvbF9hZGRfbWFjKHN0cnVjdCBtYWNfcmVzdHJpY3Rpb25zICptYWNfcmVzdHJpY3Rpb25zLCB1OCAqbWFjKQogewogCXN0cnVjdCBtYWNfZW50cnkgKmVudHJ5OwogCkBAIC0zODAsOCArMzg3LDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IGFwX2NvbnRyb2xfZGVsX21hYyhzdHJ1Y3QgbWFjX3Jlc3RyaWN0aW9ucyAqbWFjX3Jlc3RyaWN0aW9ucywKLQkJCSAgICAgIHU4ICptYWMpCitpbnQgYXBfY29udHJvbF9kZWxfbWFjKHN0cnVjdCBtYWNfcmVzdHJpY3Rpb25zICptYWNfcmVzdHJpY3Rpb25zLCB1OCAqbWFjKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKIAlzdHJ1Y3QgbWFjX2VudHJ5ICplbnRyeTsKQEAgLTQzMyw3ICs0MzksNyBAQAogfQogCiAKLXN0YXRpYyB2b2lkIGFwX2NvbnRyb2xfZmx1c2hfbWFjcyhzdHJ1Y3QgbWFjX3Jlc3RyaWN0aW9ucyAqbWFjX3Jlc3RyaWN0aW9ucykKK3ZvaWQgYXBfY29udHJvbF9mbHVzaF9tYWNzKHN0cnVjdCBtYWNfcmVzdHJpY3Rpb25zICptYWNfcmVzdHJpY3Rpb25zKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm47CiAJc3RydWN0IG1hY19lbnRyeSAqZW50cnk7CkBAIC00NTQsOCArNDYwLDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IGFwX2NvbnRyb2xfa2lja19tYWMoc3RydWN0IGFwX2RhdGEgKmFwLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgIHU4ICptYWMpCitpbnQgYXBfY29udHJvbF9raWNrX21hYyhzdHJ1Y3QgYXBfZGF0YSAqYXAsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICptYWMpCiB7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7CiAJdTE2IHJlc3A7CkBAIC00ODYsNyArNDkxLDcgQEAKICNlbmRpZiAvKiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UICovCiAKIAotc3RhdGljIHZvaWQgYXBfY29udHJvbF9raWNrYWxsKHN0cnVjdCBhcF9kYXRhICphcCkKK3ZvaWQgYXBfY29udHJvbF9raWNrYWxsKHN0cnVjdCBhcF9kYXRhICphcCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuOwogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwpAQCAtMjMyMSw5ICsyMzI2LDkgQEAKIH0KIAogCi1zdGF0aWMgaW50IHByaXNtMl9hcF9nZXRfc3RhX3F1YWwobG9jYWxfaW5mb190ICpsb2NhbCwgc3RydWN0IHNvY2thZGRyIGFkZHJbXSwKLQkJCQkgIHN0cnVjdCBpd19xdWFsaXR5IHF1YWxbXSwgaW50IGJ1Zl9zaXplLAotCQkJCSAgaW50IGFwbGlzdCkKK2ludCBwcmlzbTJfYXBfZ2V0X3N0YV9xdWFsKGxvY2FsX2luZm9fdCAqbG9jYWwsIHN0cnVjdCBzb2NrYWRkciBhZGRyW10sCisJCQkgICBzdHJ1Y3QgaXdfcXVhbGl0eSBxdWFsW10sIGludCBidWZfc2l6ZSwKKwkJCSAgIGludCBhcGxpc3QpCiB7CiAJc3RydWN0IGFwX2RhdGEgKmFwID0gbG9jYWwtPmFwOwogCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKQEAgLTIzNjMsNyArMjM2OCw3IEBACiAKIC8qIFRyYW5zbGF0ZSBvdXIgbGlzdCBvZiBBY2Nlc3MgUG9pbnRzICYgU3RhdGlvbnMgdG8gYSBjYXJkIGluZGVwZW5kYW50CiAgKiBmb3JtYXQgdGhhdCB0aGUgV2lyZWxlc3MgVG9vbHMgd2lsbCB1bmRlcnN0YW5kIC0gSmVhbiBJSSAqLwotc3RhdGljIGludCBwcmlzbTJfYXBfdHJhbnNsYXRlX3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqYnVmZmVyKQoraW50IHByaXNtMl9hcF90cmFuc2xhdGVfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpidWZmZXIpCiB7CiAJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOwogCWxvY2FsX2luZm9fdCAqbG9jYWw7CkBAIC0yNjA4LDggKzI2MTMsNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgcHJpc20yX2hvc3RhcGQoc3RydWN0IGFwX2RhdGEgKmFwLAotCQkJICBzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKnBhcmFtKQoraW50IHByaXNtMl9ob3N0YXBkKHN0cnVjdCBhcF9kYXRhICphcCwgc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtICpwYXJhbSkKIHsKIAlzd2l0Y2ggKHBhcmFtLT5jbWQpIHsKIAljYXNlIFBSSVNNMl9IT1NUQVBEX0ZMVVNIOgpAQCAtMzIwNyw4ICszMjExLDggQEAKIH0KIAogCi1zdGF0aWMgdm9pZCAqIGFwX2NyeXB0X2dldF9wdHJzKHN0cnVjdCBhcF9kYXRhICphcCwgdTggKmFkZHIsIGludCBwZXJtYW5lbnQsCi0JCQkJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICoqKmNyeXB0KQordm9pZCAqIGFwX2NyeXB0X2dldF9wdHJzKHN0cnVjdCBhcF9kYXRhICphcCwgdTggKmFkZHIsIGludCBwZXJtYW5lbnQsCisJCQkgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICoqKmNyeXB0KQogewogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2FwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2FwLmgKaW5kZXggNmQwMGRmNi4uMmZhMjQ1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9hcC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfYXAuaApAQCAtMSw2ICsxLDggQEAKICNpZm5kZWYgSE9TVEFQX0FQX0gKICNkZWZpbmUgSE9TVEFQX0FQX0gKIAorI2luY2x1ZGUgImhvc3RhcF84MDIxMS5oIgorCiAvKiBBUCBkYXRhIHN0cnVjdHVyZXMgZm9yIFNUQXMgKi8KIAogLyogbWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIHRvIGJ1ZmZlciBwZXIgU1RBICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NvbW1vbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jb21tb24uaAppbmRleCA2ZjRmYTlkLi4wMTYyNDAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY29tbW9uLmgKQEAgLTEsNiArMSw5IEBACiAjaWZuZGVmIEhPU1RBUF9DT01NT05fSAogI2RlZmluZSBIT1NUQVBfQ09NTU9OX0gKIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKwogI2RlZmluZSBCSVQoeCkgKDEgPDwgKHgpKQogCiAjZGVmaW5lIE1BQzJTVFIoYSkgKGEpWzBdLCAoYSlbMV0sIChhKVsyXSwgKGEpWzNdLCAoYSlbNF0sIChhKVs1XQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jb25maWcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY29uZmlnLmgKaW5kZXggN2VkMzQyNS4uYzA5MGE1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jb25maWcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NvbmZpZy5oCkBAIC0yMSwxNSArMjEsMTAgQEAKICNkZWZpbmUgUFJJU00yX0RPV05MT0FEX1NVUFBPUlQKICNlbmRpZgogCi0jaWZkZWYgUFJJU00yX0RPV05MT0FEX1NVUFBPUlQKLS8qIEFsbG93IHdyaXRpbmcgZmlybXdhcmUgaW1hZ2VzIGludG8gZmxhc2gsIGkuZS4sIHRvIG5vbi12b2xhdGlsZSBzdG9yYWdlLgotICogQmVmb3JlIHlvdSBlbmFibGUgdGhpcyBvcHRpb24sIHlvdSBzaG91bGQgbWFrZSBhYnNvbHV0ZWx5IHN1cmUgdGhhdCB5b3UgYXJlCi0gKiB1c2luZyBwcmlzbTJfc3JlYyB1dGlsaXR5IHRoYXQgY29tZXMgd2l0aCBUSElTIHZlcnNpb24gb2YgdGhlIGRyaXZlciEKLSAqIEluIGFkZGl0aW9uLCBwbGVhc2Ugbm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGtpbGwgeW91ciBjYXJkIHdpdGgKLSAqIG5vbi12b2xhdGlsZSBkb3dubG9hZCBpZiB5b3UgYXJlIHVzaW5nIGluY29ycmVjdCBpbWFnZS4gVGhpcyBmZWF0dXJlIGhhcyBub3QKLSAqIGJlZW4gZnVsbHkgdGVzdGVkLCBzbyBwbGVhc2UgYmUgY2FyZWZ1bCB3aXRoIGl0LiAqLwotLyogI2RlZmluZSBQUklTTTJfTk9OX1ZPTEFUSUxFX0RPV05MT0FEICovCi0jZW5kaWYgLyogUFJJU00yX0RPV05MT0FEX1NVUFBPUlQgKi8KKy8qIEFsbG93IGtlcm5lbCBjb25maWd1cmF0aW9uIHRvIGVuYWJsZSBub24tdm9sYXRpbGUgZG93bmxvYWQgc3VwcG9ydC4gKi8KKyNpZmRlZiBDT05GSUdfSE9TVEFQX0ZJUk1XQVJFX05WUkFNCisjZGVmaW5lIFBSSVNNMl9OT05fVk9MQVRJTEVfRE9XTkxPQUQKKyNlbmRpZgogCiAvKiBTYXZlIGxvdy1sZXZlbCBJL08gZm9yIGRlYnVnZ2luZy4gVGhpcyBzaG91bGQgbm90IGJlIGVuYWJsZWQgaW4gbm9ybWFsIHVzZS4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9ody5jCmluZGV4IGFiZmFlN2YuLmIxZjE0MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2h3LmMKQEAgLTI1Myw3ICsyNTMsNyBAQAogICogQGRldjogcG9pbnRlciB0byBuZXRfZGV2aWNlCiAgKiBAZW50cnk6IFByaXNtMiBjb21tYW5kIHF1ZXVlIGVudHJ5IHRvIGJlIGlzc3VlZAogICovCi1zdGF0aWMgaW5saW5lIGludCBoZmEzODR4X2NtZF9pc3N1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorc3RhdGljIGludCBoZmEzODR4X2NtZF9pc3N1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgICBzdHJ1Y3QgaG9zdGFwX2NtZF9xdWV1ZSAqZW50cnkpCiB7CiAJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOwpAQCAtNzQzLDcgKzc0Myw3IEBACiB9CiAKIAotc3RhdGljIGlubGluZSBpbnQgaGZhMzg0eF93YWl0X29mZnNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgb19vZmYpCitzdGF0aWMgaW50IGhmYTM4NHhfd2FpdF9vZmZzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IG9fb2ZmKQogewogCWludCB0cmllcyA9IEhGQTM4NFhfQkFQX0JVU1lfVElNRU9VVDsKIAlpbnQgcmVzID0gSEZBMzg0WF9JTlcob19vZmYpICYgSEZBMzg0WF9PRkZTRVRfQlVTWTsKQEAgLTE5MDQsNyArMTkwNCw3IEBACiAgKiBhbmQgd2lsbCB0cnkgdG8gZ2V0IHRoZSBjb3JyZWN0IGZpZCBldmVudHVhbGx5LiAqLwogI2RlZmluZSBFWFRSQV9GSURfUkVBRF9URVNUUwogCi1zdGF0aWMgaW5saW5lIHUxNiBwcmlzbTJfcmVhZF9maWRfcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiByZWcpCitzdGF0aWMgdTE2IHByaXNtMl9yZWFkX2ZpZF9yZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHJlZykKIHsKICNpZmRlZiBFWFRSQV9GSURfUkVBRF9URVNUUwogCXUxNiB2YWwsIHZhbDIsIHZhbDM7CkBAIC0yNTgxLDcgKzI1ODEsNyBAQAogCiAKIC8qIENhbGxlZCBvbmx5IGZyb20gaGFyZHdhcmUgSVJRICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJpc20yX2NoZWNrX21hZ2ljKGxvY2FsX2luZm9fdCAqbG9jYWwpCitzdGF0aWMgdm9pZCBwcmlzbTJfY2hlY2tfbWFnaWMobG9jYWxfaW5mb190ICpsb2NhbCkKIHsKIAkvKiBhdCBsZWFzdCBQQ0kgUHJpc20yLjUgd2l0aCBidXMgbWFzdGVyaW5nIHNlZW1zIHRvIHNvbWV0aW1lcwogCSAqIHJldHVybiAweDAwMDAgaW4gU1dTVVBQT1JUMCBmb3IgdW5rbm93biByZWFzb24sIGJ1dCByZS1yZWFkaW5nIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9pbmZvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2luZm8uYwppbmRleCA1YWE5OThmLi41MGY3MmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2luZm8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2luZm8uYwpAQCAtMSw1ICsxLDggQEAKIC8qIEhvc3QgQVAgZHJpdmVyIEluZm8gRnJhbWUgcHJvY2Vzc2luZyAocGFydCBvZiBob3N0YXAubyBtb2R1bGUpICovCiAKKyNpbmNsdWRlICJob3N0YXBfd2xhbi5oIgorI2luY2x1ZGUgImhvc3RhcC5oIgorI2luY2x1ZGUgImhvc3RhcF9hcC5oIgogCiAvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KIHN0YXRpYyB2b2lkIHByaXNtMl9pbmZvX2NvbW10YWxsaWVzMTYobG9jYWxfaW5mb190ICpsb2NhbCwgdW5zaWduZWQgY2hhciAqYnVmLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9pb2N0bC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9pb2N0bC5jCmluZGV4IDI2MTdkNzAuLmYzZTBjZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaW9jdGwuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2lvY3RsLmMKQEAgLTEsMTEgKzEsMTMgQEAKIC8qIGlvY3RsKCkgKG1vc3RseSBMaW51eCBXaXJlbGVzcyBFeHRlbnNpb25zKSByb3V0aW5lcyBmb3IgSG9zdCBBUCBkcml2ZXIgKi8KIAotI2lmZGVmIGluX2F0b21pYwotLyogR2V0IGtlcm5lbF9sb2NrZWQoKSBmb3IgaW5fYXRvbWljKCkgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bmV0L2llZWU4MDIxMV9jcnlwdC5oPgogCisjaW5jbHVkZSAiaG9zdGFwX3dsYW4uaCIKKyNpbmNsdWRlICJob3N0YXAuaCIKKyNpbmNsdWRlICJob3N0YXBfYXAuaCIKIAogc3RhdGljIHN0cnVjdCBpd19zdGF0aXN0aWNzICpob3N0YXBfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CkBAIC0zOTEwLDcgKzM5MTIsNyBAQAogCQkgbG9jYWwtPnN0YV9md192ZXIgJiAweGZmKTsKIH0KIAotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBwcmlzbTJfZXRodG9vbF9vcHMgPSB7CitzdHJ1Y3QgZXRodG9vbF9vcHMgcHJpc20yX2V0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbyA9IHByaXNtMl9nZXRfZHJ2aW5mbwogfTsKIApAQCAtMzk4NSw3ICszOTg3LDcgQEAKIAkoaXdfaGFuZGxlcikgcHJpc20yX2lvY3RsX3ByaXZfcmVhZG1pZiwJCS8qIDMgKi8KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgaG9zdGFwX2l3X2hhbmRsZXJfZGVmID0KK2NvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBob3N0YXBfaXdfaGFuZGxlcl9kZWYgPQogewogCS5udW1fc3RhbmRhcmQJPSBzaXplb2YocHJpc20yX2hhbmRsZXIpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAogCS5udW1fcHJpdmF0ZQk9IHNpemVvZihwcmlzbTJfcHJpdmF0ZV9oYW5kbGVyKSAvIHNpemVvZihpd19oYW5kbGVyKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9tYWluLmMKaW5kZXggM2QyZWE2MS4uOGRkNGM0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9tYWluLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CiAjaW5jbHVkZSA8bmV0L2llZWU4MDIxMS5oPgogI2luY2x1ZGUgPG5ldC9pZWVlODAyMTFfY3J5cHQuaD4KQEAgLTQ3LDU3ICs0OCw2IEBACiAjZGVmaW5lIFBSSVNNMl9NQVhfTVRVIChQUklTTTJfTUFYX0ZSQU1FX1NJWkUgLSAoNiAvKiBMTEMgKi8gKyA4IC8qIFdFUCAqLykpCiAKIAotLyogaG9zdGFwLmMgKi8KLXN0YXRpYyBpbnQgcHJpc20yX3dkc19hZGQobG9jYWxfaW5mb190ICpsb2NhbCwgdTggKnJlbW90ZV9hZGRyLAotCQkJICBpbnQgcnRubF9sb2NrZWQpOwotc3RhdGljIGludCBwcmlzbTJfd2RzX2RlbChsb2NhbF9pbmZvX3QgKmxvY2FsLCB1OCAqcmVtb3RlX2FkZHIsCi0JCQkgIGludCBydG5sX2xvY2tlZCwgaW50IGRvX25vdF9yZW1vdmUpOwotCi0vKiBob3N0YXBfYXAuYyAqLwotc3RhdGljIGludCBwcmlzbTJfYXBfZ2V0X3N0YV9xdWFsKGxvY2FsX2luZm9fdCAqbG9jYWwsIHN0cnVjdCBzb2NrYWRkciBhZGRyW10sCi0JCQkJICBzdHJ1Y3QgaXdfcXVhbGl0eSBxdWFsW10sIGludCBidWZfc2l6ZSwKLQkJCQkgIGludCBhcGxpc3QpOwotc3RhdGljIGludCBwcmlzbTJfYXBfdHJhbnNsYXRlX3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqYnVmZmVyKTsKLXN0YXRpYyBpbnQgcHJpc20yX2hvc3RhcGQoc3RydWN0IGFwX2RhdGEgKmFwLAotCQkJICBzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKnBhcmFtKTsKLXN0YXRpYyB2b2lkICogYXBfY3J5cHRfZ2V0X3B0cnMoc3RydWN0IGFwX2RhdGEgKmFwLCB1OCAqYWRkciwgaW50IHBlcm1hbmVudCwKLQkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKioqY3J5cHQpOwotc3RhdGljIHZvaWQgYXBfY29udHJvbF9raWNrYWxsKHN0cnVjdCBhcF9kYXRhICphcCk7Ci0jaWZuZGVmIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQKLXN0YXRpYyBpbnQgYXBfY29udHJvbF9hZGRfbWFjKHN0cnVjdCBtYWNfcmVzdHJpY3Rpb25zICptYWNfcmVzdHJpY3Rpb25zLAotCQkJICAgICAgdTggKm1hYyk7Ci1zdGF0aWMgaW50IGFwX2NvbnRyb2xfZGVsX21hYyhzdHJ1Y3QgbWFjX3Jlc3RyaWN0aW9ucyAqbWFjX3Jlc3RyaWN0aW9ucywKLQkJCSAgICAgIHU4ICptYWMpOwotc3RhdGljIHZvaWQgYXBfY29udHJvbF9mbHVzaF9tYWNzKHN0cnVjdCBtYWNfcmVzdHJpY3Rpb25zICptYWNfcmVzdHJpY3Rpb25zKTsKLXN0YXRpYyBpbnQgYXBfY29udHJvbF9raWNrX21hYyhzdHJ1Y3QgYXBfZGF0YSAqYXAsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgdTggKm1hYyk7Ci0jZW5kaWYgLyogIVBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQgKi8KLQotCi1zdGF0aWMgY29uc3QgbG9uZyBmcmVxX2xpc3RbXSA9IHsgMjQxMiwgMjQxNywgMjQyMiwgMjQyNywgMjQzMiwgMjQzNywgMjQ0MiwKLQkJCQkgIDI0NDcsIDI0NTIsIDI0NTcsIDI0NjIsIDI0NjcsIDI0NzIsIDI0ODQgfTsKLSNkZWZpbmUgRlJFUV9DT1VOVCAoc2l6ZW9mKGZyZXFfbGlzdCkgLyBzaXplb2YoZnJlcV9saXN0WzBdKSkKLQotCi0vKiBTZWUgSUVFRSA4MDIuMUggZm9yIExMQy9TTkFQIGVuY2Fwc3VsYXRpb24vZGVjYXBzdWxhdGlvbiAqLwotLyogRXRoZXJuZXQtSUkgc25hcCBoZWFkZXIgKFJGQzEwNDIgZm9yIG1vc3QgRXRoZXJUeXBlcykgKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHJmYzEwNDJfaGVhZGVyW10gPQoteyAweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwIH07Ci0vKiBCcmlkZ2UtVHVubmVsIGhlYWRlciAoZm9yIEV0aGVyVHlwZXMgRVRIX1BfQUFSUCBhbmQgRVRIX1BfSVBYKSAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgYnJpZGdlX3R1bm5lbF9oZWFkZXJbXSA9Ci17IDB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZjggfTsKLS8qIE5vIGVuY2Fwc3VsYXRpb24gaGVhZGVyIGlmIEV0aGVyVHlwZSA8IDB4NjAwICg9bGVuZ3RoKSAqLwotCi0KLS8qIEZJWDogdGhlc2UgY291bGQgYmUgY29tcGlsZWQgc2VwYXJhdGVseSBhbmQgbGlua2VkIHRvZ2V0aGVyIHRvIGhvc3RhcC5vICovCi0jaW5jbHVkZSAiaG9zdGFwX2FwLmMiCi0jaW5jbHVkZSAiaG9zdGFwX2luZm8uYyIKLSNpbmNsdWRlICJob3N0YXBfaW9jdGwuYyIKLSNpbmNsdWRlICJob3N0YXBfcHJvYy5jIgotI2luY2x1ZGUgImhvc3RhcF84MDIxMV9yeC5jIgotI2luY2x1ZGUgImhvc3RhcF84MDIxMV90eC5jIgotCi0KIHN0cnVjdCBuZXRfZGV2aWNlICogaG9zdGFwX2FkZF9pbnRlcmZhY2Uoc3RydWN0IGxvY2FsX2luZm8gKmxvY2FsLAogCQkJCQkgaW50IHR5cGUsIGludCBydG5sX2xvY2tlZCwKIAkJCQkJIGNvbnN0IGNoYXIgKnByZWZpeCwKQEAgLTE5Niw4ICsxNDYsOCBAQAogfQogCiAKLXN0YXRpYyBpbnQgcHJpc20yX3dkc19hZGQobG9jYWxfaW5mb190ICpsb2NhbCwgdTggKnJlbW90ZV9hZGRyLAotCQkJICBpbnQgcnRubF9sb2NrZWQpCitpbnQgcHJpc20yX3dkc19hZGQobG9jYWxfaW5mb190ICpsb2NhbCwgdTggKnJlbW90ZV9hZGRyLAorCQkgICBpbnQgcnRubF9sb2NrZWQpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CkBAIC0yNTgsOCArMjA4LDggQEAKIH0KIAogCi1zdGF0aWMgaW50IHByaXNtMl93ZHNfZGVsKGxvY2FsX2luZm9fdCAqbG9jYWwsIHU4ICpyZW1vdGVfYWRkciwKLQkJCSAgaW50IHJ0bmxfbG9ja2VkLCBpbnQgZG9fbm90X3JlbW92ZSkKK2ludCBwcmlzbTJfd2RzX2RlbChsb2NhbF9pbmZvX3QgKmxvY2FsLCB1OCAqcmVtb3RlX2FkZHIsCisJCSAgIGludCBydG5sX2xvY2tlZCwgaW50IGRvX25vdF9yZW1vdmUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX3Byb2MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfcHJvYy5jCmluZGV4IGEwYTRjYmQuLmQxZDhjZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfcHJvYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfcHJvYy5jCkBAIC0xLDUgKzEsMTIgQEAKIC8qIC9wcm9jIHJvdXRpbmVzIGZvciBIb3N0IEFQIGRyaXZlciAqLwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bmV0L2llZWU4MDIxMV9jcnlwdC5oPgorCisjaW5jbHVkZSAiaG9zdGFwX3dsYW4uaCIKKyNpbmNsdWRlICJob3N0YXAuaCIKKwogI2RlZmluZSBQUk9DX0xJTUlUIChQQUdFX1NJWkUgLSA4MCkKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX3dsYW4uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfd2xhbi5oCmluZGV4IGNmZDgwMTUuLjg3YTU0YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfd2xhbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfd2xhbi5oCkBAIC0xLDYgKzEsMTAgQEAKICNpZm5kZWYgSE9TVEFQX1dMQU5fSAogI2RlZmluZSBIT1NUQVBfV0xBTl9ICiAKKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisKICNpbmNsdWRlICJob3N0YXBfY29uZmlnLmgiCiAjaW5jbHVkZSAiaG9zdGFwX2NvbW1vbi5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMKaW5kZXggNDRjZDNmYy4uOGJmMDI3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIxMDAuYwpAQCAtNDExLDcgKzQxMSw3IEBACiAJd3JpdGVfcmVnaXN0ZXIoZGV2LCBJUFdfUkVHX0FVVE9JTkNSRU1FTlRfREFUQSwgdmFsKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX25pY19tZW1vcnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGFkZHIsIHUzMiBsZW4sCitzdGF0aWMgdm9pZCB3cml0ZV9uaWNfbWVtb3J5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBhZGRyLCB1MzIgbGVuLAogCQkJCSAgICBjb25zdCB1OCAqIGJ1ZikKIHsKIAl1MzIgYWxpZ25lZF9hZGRyOwpAQCAtNDQ5LDcgKzQ0OSw3IEBACiAJCQkJICAgICpidWYpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVhZF9uaWNfbWVtb3J5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBhZGRyLCB1MzIgbGVuLAorc3RhdGljIHZvaWQgcmVhZF9uaWNfbWVtb3J5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBhZGRyLCB1MzIgbGVuLAogCQkJCSAgIHU4ICogYnVmKQogewogCXUzMiBhbGlnbmVkX2FkZHI7CkBAIC02NTcsNyArNjU3LDcgQEAKIAogI2RlZmluZSBNQVhfUkVTRVRfQkFDS09GRiAxMAogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2NoZWR1bGVfcmVzZXQoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3N0YXRpYyB2b2lkIHNjaGVkdWxlX3Jlc2V0KHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYpCiB7CiAJdW5zaWduZWQgbG9uZyBub3cgPSBnZXRfc2Vjb25kcygpOwogCkBAIC0xMTMwLDcgKzExMzAsNyBAQAogCXdyaXRlX3JlZ2lzdGVyKHByaXYtPm5ldF9kZXYsIElQV19SRUdfR1BJTywgcmVnKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcmZfa2lsbF9hY3RpdmUoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3N0YXRpYyBpbnQgcmZfa2lsbF9hY3RpdmUoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKIHsKICNkZWZpbmUgTUFYX1JGX0tJTExfQ0hFQ0tTIDUKICNkZWZpbmUgUkZfS0lMTF9DSEVDS19ERUxBWSA0MApAQCAtMjE3Nyw3ICsyMTc3LDcgQEAKIH07CiAjZW5kaWYKIAotc3RhdGljIGlubGluZSBpbnQgaXB3MjEwMF9hbGxvY19za2Ioc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwKK3N0YXRpYyBpbnQgaXB3MjEwMF9hbGxvY19za2Ioc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwKIAkJCQkgICAgc3RydWN0IGlwdzIxMDBfcnhfcGFja2V0ICpwYWNrZXQpCiB7CiAJcGFja2V0LT5za2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaXB3MjEwMF9yeCkpOwpAQCAtMjIwMSw3ICsyMjAxLDcgQEAKICNkZWZpbmUgU0VBUkNIX1NOQVBTSE9UIDEKIAogI2RlZmluZSBTTkFQU0hPVF9BRERSKG9mcykgKHByaXYtPnNuYXBzaG90Wygob2ZzKSA+PiAxMikgJiAweGZmXSArICgob2ZzKSAmIDB4ZmZmKSkKLXN0YXRpYyBpbmxpbmUgaW50IGlwdzIxMDBfc25hcHNob3RfYWxsb2Moc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3N0YXRpYyBpbnQgaXB3MjEwMF9zbmFwc2hvdF9hbGxvYyhzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQogewogCWludCBpOwogCWlmIChwcml2LT5zbmFwc2hvdFswXSkKQEAgLTIyMjEsNyArMjIyMSw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpcHcyMTAwX3NuYXBzaG90X2ZyZWUoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3N0YXRpYyB2b2lkIGlwdzIxMDBfc25hcHNob3RfZnJlZShzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQogewogCWludCBpOwogCWlmICghcHJpdi0+c25hcHNob3RbMF0pCkBAIC0yMjMxLDcgKzIyMzEsNyBAQAogCXByaXYtPnNuYXBzaG90WzBdID0gTlVMTDsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgaXB3MjEwMF9tYXRjaF9idWYoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwgdTggKiBpbl9idWYsCitzdGF0aWMgdTMyIGlwdzIxMDBfbWF0Y2hfYnVmKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIHU4ICogaW5fYnVmLAogCQkJCSAgICBzaXplX3QgbGVuLCBpbnQgbW9kZSkKIHsKIAl1MzIgaSwgajsKQEAgLTIyODgsNyArMjI4OCw3IEBACiBzdGF0aWMgdTggcGFja2V0X2RhdGFbSVBXX1JYX05JQ19CVUZGRVJfTEVOR1RIXTsKICNlbmRpZgogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXB3MjEwMF9jb3JydXB0aW9uX2RldGVjdGVkKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIGludCBpKQorc3RhdGljIHZvaWQgaXB3MjEwMF9jb3JydXB0aW9uX2RldGVjdGVkKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIGludCBpKQogewogI2lmZGVmIENPTkZJR19JUFcyMTAwX0RFQlVHX0MzCiAJc3RydWN0IGlwdzIxMDBfc3RhdHVzICpzdGF0dXMgPSAmcHJpdi0+c3RhdHVzX3F1ZXVlLmRydltpXTsKQEAgLTIzNDYsNyArMjM0Niw3IEBACiAJc2NoZWR1bGVfcmVzZXQocHJpdik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpc3Jfcngoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwgaW50IGksCitzdGF0aWMgdm9pZCBpc3Jfcngoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwgaW50IGksCiAJCQkgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKQogewogCXN0cnVjdCBpcHcyMTAwX3N0YXR1cyAqc3RhdHVzID0gJnByaXYtPnN0YXR1c19xdWV1ZS5kcnZbaV07CkBAIC0yNDI1LDcgKzI0MjUsNyBAQAogCXByaXYtPnJ4X3F1ZXVlLmRydltpXS5ob3N0X2FkZHIgPSBwYWNrZXQtPmRtYV9hZGRyOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBpcHcyMTAwX2NvcnJ1cHRpb25fY2hlY2soc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwgaW50IGkpCitzdGF0aWMgaW50IGlwdzIxMDBfY29ycnVwdGlvbl9jaGVjayhzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2LCBpbnQgaSkKIHsKIAlzdHJ1Y3QgaXB3MjEwMF9zdGF0dXMgKnN0YXR1cyA9ICZwcml2LT5zdGF0dXNfcXVldWUuZHJ2W2ldOwogCXN0cnVjdCBpcHcyMTAwX3J4ICp1ID0gcHJpdi0+cnhfYnVmZmVyc1tpXS5yeHA7CkBAIC0yNDgxLDcgKzI0ODEsNyBAQAogICogVGhlIFdSSVRFIGluZGV4IGlzIGNhY2hlZCBpbiB0aGUgdmFyaWFibGUgJ3ByaXYtPnJ4X3F1ZXVlLm5leHQnLgogICoKICAqLwotc3RhdGljIGlubGluZSB2b2lkIF9faXB3MjEwMF9yeF9wcm9jZXNzKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYpCitzdGF0aWMgdm9pZCBfX2lwdzIxMDBfcnhfcHJvY2VzcyhzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQogewogCXN0cnVjdCBpcHcyMTAwX2JkX3F1ZXVlICpyeHEgPSAmcHJpdi0+cnhfcXVldWU7CiAJc3RydWN0IGlwdzIxMDBfc3RhdHVzX3F1ZXVlICpzcSA9ICZwcml2LT5zdGF0dXNfcXVldWU7CkBAIC0yNjM0LDcgKzI2MzQsNyBAQAogICogZm9yIHVzZSBieSBmdXR1cmUgY29tbWFuZCBhbmQgZGF0YSBwYWNrZXRzLgogICoKICAqLwotc3RhdGljIGlubGluZSBpbnQgX19pcHcyMTAwX3R4X3Byb2Nlc3Moc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3N0YXRpYyBpbnQgX19pcHcyMTAwX3R4X3Byb2Nlc3Moc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKIHsKIAlzdHJ1Y3QgaXB3MjEwMF9iZF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4X3F1ZXVlOwogCXN0cnVjdCBpcHcyMTAwX2JkICp0YmQ7CkBAIC01NzM1LDcwICs1NzM1LDYgQEAKIAlyZXR1cm4gJnByaXYtPmllZWUtPnN0YXRzOwogfQogCi0jaWYgV0lSRUxFU1NfRVhUIDwgMTgKLS8qIFN1cHBvcnQgZm9yIHdwYV9zdXBwbGljYW50IGJlZm9yZSBXRS0xOCwgZGVwcmVjYXRlZC4gKi8KLQotLyogZm9sbG93aW5nIGRlZmluaXRpb25zIG11c3QgbWF0Y2ggZGVmaW5pdGlvbnMgaW4gZHJpdmVyX2lwdy5jICovCi0KLSNkZWZpbmUgSVBXMjEwMF9JT0NUTF9XUEFfU1VQUExJQ0FOVAkJU0lPQ0lXRklSU1RQUklWKzMwCi0KLSNkZWZpbmUgSVBXMjEwMF9DTURfU0VUX1dQQV9QQVJBTQkJMQotI2RlZmluZQlJUFcyMTAwX0NNRF9TRVRfV1BBX0lFCQkJMgotI2RlZmluZSBJUFcyMTAwX0NNRF9TRVRfRU5DUllQVElPTgkJMwotI2RlZmluZSBJUFcyMTAwX0NNRF9NTE1FCQkJNAotCi0jZGVmaW5lIElQVzIxMDBfUEFSQU1fV1BBX0VOQUJMRUQJCTEKLSNkZWZpbmUgSVBXMjEwMF9QQVJBTV9US0lQX0NPVU5URVJNRUFTVVJFUwkyCi0jZGVmaW5lIElQVzIxMDBfUEFSQU1fRFJPUF9VTkVOQ1JZUFRFRAkJMwotI2RlZmluZSBJUFcyMTAwX1BBUkFNX1BSSVZBQ1lfSU5WT0tFRAkJNAotI2RlZmluZSBJUFcyMTAwX1BBUkFNX0FVVEhfQUxHUwkJCTUKLSNkZWZpbmUgSVBXMjEwMF9QQVJBTV9JRUVFXzgwMl8xWAkJNgotCi0jZGVmaW5lIElQVzIxMDBfTUxNRV9TVEFfREVBVVRICQkJMQotI2RlZmluZSBJUFcyMTAwX01MTUVfU1RBX0RJU0FTU09DCQkyCi0KLSNkZWZpbmUgSVBXMjEwMF9DUllQVF9FUlJfVU5LTk9XTl9BTEcJCTIKLSNkZWZpbmUgSVBXMjEwMF9DUllQVF9FUlJfVU5LTk9XTl9BRERSCQkzCi0jZGVmaW5lIElQVzIxMDBfQ1JZUFRfRVJSX0NSWVBUX0lOSVRfRkFJTEVECTQKLSNkZWZpbmUgSVBXMjEwMF9DUllQVF9FUlJfS0VZX1NFVF9GQUlMRUQJNQotI2RlZmluZSBJUFcyMTAwX0NSWVBUX0VSUl9UWF9LRVlfU0VUX0ZBSUxFRAk2Ci0jZGVmaW5lIElQVzIxMDBfQ1JZUFRfRVJSX0NBUkRfQ09ORl9GQUlMRUQJNwotCi0jZGVmaW5lCUlQVzIxMDBfQ1JZUFRfQUxHX05BTUVfTEVOCQkxNgotCi1zdHJ1Y3QgaXB3MjEwMF9wYXJhbSB7Ci0JdTMyIGNtZDsKLQl1OCBzdGFfYWRkcltFVEhfQUxFTl07Ci0JdW5pb24gewotCQlzdHJ1Y3QgewotCQkJdTggbmFtZTsKLQkJCXUzMiB2YWx1ZTsKLQkJfSB3cGFfcGFyYW07Ci0JCXN0cnVjdCB7Ci0JCQl1MzIgbGVuOwotCQkJdTggcmVzZXJ2ZWRbMzJdOwotCQkJdTggZGF0YVswXTsKLQkJfSB3cGFfaWU7Ci0JCXN0cnVjdCB7Ci0JCQl1MzIgY29tbWFuZDsKLQkJCXUzMiByZWFzb25fY29kZTsKLQkJfSBtbG1lOwotCQlzdHJ1Y3QgewotCQkJdTggYWxnW0lQVzIxMDBfQ1JZUFRfQUxHX05BTUVfTEVOXTsKLQkJCXU4IHNldF90eDsKLQkJCXUzMiBlcnI7Ci0JCQl1OCBpZHg7Ci0JCQl1OCBzZXFbOF07CS8qIHNlcXVlbmNlIGNvdW50ZXIgKHNldDogUlgsIGdldDogVFgpICovCi0JCQl1MTYga2V5X2xlbjsKLQkJCXU4IGtleVswXTsKLQkJfSBjcnlwdDsKLQotCX0gdTsKLX07Ci0KLS8qIGVuZCBvZiBkcml2ZXJfaXB3LmMgY29kZSAqLwotI2VuZGlmCQkJCS8qIFdJUkVMRVNTX0VYVCA8IDE4ICovCi0KIHN0YXRpYyBpbnQgaXB3MjEwMF93cGFfZW5hYmxlKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIGludCB2YWx1ZSkKIHsKIAkvKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHdwYV9zdXBwbGljYW50IGxvYWRzIGFuZCBjbG9zZXMgdGhlIGRyaXZlcgpAQCAtNTgwNywxMSArNTc0Myw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiBXSVJFTEVTU19FWFQgPCAxOAotI2RlZmluZSBJV19BVVRIX0FMR19PUEVOX1NZU1RFTQkJCTB4MQotI2RlZmluZSBJV19BVVRIX0FMR19TSEFSRURfS0VZCQkJMHgyCi0jZW5kaWYKLQogc3RhdGljIGludCBpcHcyMTAwX3dwYV9zZXRfYXV0aF9hbGdzKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIGludCB2YWx1ZSkKIHsKIApAQCAtNTg1NSwzNjAgKzU3ODYsNiBAQAogCWlwdzIxMDBfc2V0X3dwYV9pZShwcml2LCAmZnJhbWUsIDApOwogfQogCi0jaWYgV0lSRUxFU1NfRVhUIDwgMTgKLXN0YXRpYyBpbnQgaXB3MjEwMF93cGFfc2V0X3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IG5hbWUsIHUzMiB2YWx1ZSkKLXsKLQlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldCA9IDA7Ci0KLQlzd2l0Y2ggKG5hbWUpIHsKLQljYXNlIElQVzIxMDBfUEFSQU1fV1BBX0VOQUJMRUQ6Ci0JCXJldCA9IGlwdzIxMDBfd3BhX2VuYWJsZShwcml2LCB2YWx1ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJUFcyMTAwX1BBUkFNX1RLSVBfQ09VTlRFUk1FQVNVUkVTOgotCQljcnlwdCA9IHByaXYtPmllZWUtPmNyeXB0W3ByaXYtPmllZWUtPnR4X2tleWlkeF07Ci0JCWlmICghY3J5cHQgfHwgIWNyeXB0LT5vcHMtPnNldF9mbGFncyB8fCAhY3J5cHQtPm9wcy0+Z2V0X2ZsYWdzKQotCQkJYnJlYWs7Ci0KLQkJZmxhZ3MgPSBjcnlwdC0+b3BzLT5nZXRfZmxhZ3MoY3J5cHQtPnByaXYpOwotCi0JCWlmICh2YWx1ZSkKLQkJCWZsYWdzIHw9IElFRUU4MDIxMV9DUllQVE9fVEtJUF9DT1VOVEVSTUVBU1VSRVM7Ci0JCWVsc2UKLQkJCWZsYWdzICY9IH5JRUVFODAyMTFfQ1JZUFRPX1RLSVBfQ09VTlRFUk1FQVNVUkVTOwotCi0JCWNyeXB0LT5vcHMtPnNldF9mbGFncyhmbGFncywgY3J5cHQtPnByaXYpOwotCi0JCWJyZWFrOwotCi0JY2FzZSBJUFcyMTAwX1BBUkFNX0RST1BfVU5FTkNSWVBURUQ6ewotCQkJLyogU2VlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRCBoYW5kbGluZyBmb3IgZGV0YWlscyAqLwotCQkJc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSBzZWMgPSB7Ci0JCQkJLmZsYWdzID0gU0VDX0VOQUJMRUQsCi0JCQkJLmVuYWJsZWQgPSB2YWx1ZSwKLQkJCX07Ci0JCQlwcml2LT5pZWVlLT5kcm9wX3VuZW5jcnlwdGVkID0gdmFsdWU7Ci0JCQkvKiBXZSBvbmx5IGNoYW5nZSBTRUNfTEVWRUwgZm9yIG9wZW4gbW9kZS4gT3RoZXJzCi0JCQkgKiBhcmUgc2V0IGJ5IGlwd193cGFfc2V0X2VuY3J5cHRpb24uCi0JCQkgKi8KLQkJCWlmICghdmFsdWUpIHsKLQkJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOwotCQkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8wOwotCQkJfSBlbHNlIHsKLQkJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOwotCQkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8xOwotCQkJfQotCQkJaWYgKHByaXYtPmllZWUtPnNldF9zZWN1cml0eSkKLQkJCQlwcml2LT5pZWVlLT5zZXRfc2VjdXJpdHkocHJpdi0+aWVlZS0+ZGV2LCAmc2VjKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQljYXNlIElQVzIxMDBfUEFSQU1fUFJJVkFDWV9JTlZPS0VEOgotCQlwcml2LT5pZWVlLT5wcml2YWN5X2ludm9rZWQgPSB2YWx1ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIElQVzIxMDBfUEFSQU1fQVVUSF9BTEdTOgotCQlyZXQgPSBpcHcyMTAwX3dwYV9zZXRfYXV0aF9hbGdzKHByaXYsIHZhbHVlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElQVzIxMDBfUEFSQU1fSUVFRV84MDJfMVg6Ci0JCXByaXYtPmllZWUtPmllZWU4MDJfMXggPSB2YWx1ZTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogJXM6IFVua25vd24gV1BBIHBhcmFtOiAlZFxuIiwKLQkJICAgICAgIGRldi0+bmFtZSwgbmFtZSk7Ci0JCXJldCA9IC1FT1BOT1RTVVBQOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgaXB3MjEwMF93cGFfbWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY29tbWFuZCwgaW50IHJlYXNvbikKLXsKLQotCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCWludCByZXQgPSAwOwotCi0Jc3dpdGNoIChjb21tYW5kKSB7Ci0JY2FzZSBJUFcyMTAwX01MTUVfU1RBX0RFQVVUSDoKLQkJLy8gc2lsZW50bHkgaWdub3JlCi0JCWJyZWFrOwotCi0JY2FzZSBJUFcyMTAwX01MTUVfU1RBX0RJU0FTU09DOgotCQlpcHcyMTAwX2Rpc2Fzc29jaWF0ZV9ic3NpZChwcml2KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogJXM6IFVua25vd24gTUxNRSByZXF1ZXN0OiAlZFxuIiwKLQkJICAgICAgIGRldi0+bmFtZSwgY29tbWFuZCk7Ci0JCXJldCA9IC1FT1BOT1RTVVBQOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgaXB3MjEwMF93cGFfc2V0X3dwYV9pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgc3RydWN0IGlwdzIxMDBfcGFyYW0gKnBhcmFtLCBpbnQgcGxlbikKLXsKLQotCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTsKLQl1OCAqYnVmOwotCi0JaWYgKCFpZWVlLT53cGFfZW5hYmxlZCkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JaWYgKHBhcmFtLT51LndwYV9pZS5sZW4gPiBNQVhfV1BBX0lFX0xFTiB8fAotCSAgICAocGFyYW0tPnUud3BhX2llLmxlbiAmJiBwYXJhbS0+dS53cGFfaWUuZGF0YSA9PSBOVUxMKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAocGFyYW0tPnUud3BhX2llLmxlbikgewotCQlidWYgPSBrbWFsbG9jKHBhcmFtLT51LndwYV9pZS5sZW4sIEdGUF9LRVJORUwpOwotCQlpZiAoYnVmID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQltZW1jcHkoYnVmLCBwYXJhbS0+dS53cGFfaWUuZGF0YSwgcGFyYW0tPnUud3BhX2llLmxlbik7Ci0KLQkJa2ZyZWUoaWVlZS0+d3BhX2llKTsKLQkJaWVlZS0+d3BhX2llID0gYnVmOwotCQlpZWVlLT53cGFfaWVfbGVuID0gcGFyYW0tPnUud3BhX2llLmxlbjsKLQotCX0gZWxzZSB7Ci0JCWtmcmVlKGllZWUtPndwYV9pZSk7Ci0JCWllZWUtPndwYV9pZSA9IE5VTEw7Ci0JCWllZWUtPndwYV9pZV9sZW4gPSAwOwotCX0KLQotCWlwdzIxMDBfd3BhX2Fzc29jX2ZyYW1lKHByaXYsIGllZWUtPndwYV9pZSwgaWVlZS0+d3BhX2llX2xlbik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogaW1wbGVtZW50YXRpb24gYm9ycm93ZWQgZnJvbSBob3N0YXAgZHJpdmVyICovCi0KLXN0YXRpYyBpbnQgaXB3MjEwMF93cGFfc2V0X2VuY3J5cHRpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgICAgICBzdHJ1Y3QgaXB3MjEwMF9wYXJhbSAqcGFyYW0sCi0JCQkJICAgICAgaW50IHBhcmFtX2xlbikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IHByaXYtPmllZWU7Ci0Jc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHM7Ci0Jc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICoqY3J5cHQ7Ci0KLQlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKLQkJLmZsYWdzID0gMCwKLQl9OwotCi0JcGFyYW0tPnUuY3J5cHQuZXJyID0gMDsKLQlwYXJhbS0+dS5jcnlwdC5hbGdbSVBXMjEwMF9DUllQVF9BTEdfTkFNRV9MRU4gLSAxXSA9ICdcMCc7Ci0KLQlpZiAocGFyYW1fbGVuICE9Ci0JICAgIChpbnQpKChjaGFyICopcGFyYW0tPnUuY3J5cHQua2V5IC0gKGNoYXIgKilwYXJhbSkgKwotCSAgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuKSB7Ci0JCUlQV19ERUJVR19JTkZPKCJMZW4gbWlzbWF0Y2ggJWQsICVkXG4iLCBwYXJhbV9sZW4sCi0JCQkgICAgICAgcGFyYW0tPnUuY3J5cHQua2V5X2xlbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAocGFyYW0tPnN0YV9hZGRyWzBdID09IDB4ZmYgJiYgcGFyYW0tPnN0YV9hZGRyWzFdID09IDB4ZmYgJiYKLQkgICAgcGFyYW0tPnN0YV9hZGRyWzJdID09IDB4ZmYgJiYgcGFyYW0tPnN0YV9hZGRyWzNdID09IDB4ZmYgJiYKLQkgICAgcGFyYW0tPnN0YV9hZGRyWzRdID09IDB4ZmYgJiYgcGFyYW0tPnN0YV9hZGRyWzVdID09IDB4ZmYpIHsKLQkJaWYgKHBhcmFtLT51LmNyeXB0LmlkeCA+PSBXRVBfS0VZUykKLQkJCXJldHVybiAtRUlOVkFMOwotCQljcnlwdCA9ICZpZWVlLT5jcnlwdFtwYXJhbS0+dS5jcnlwdC5pZHhdOwotCX0gZWxzZSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRCB8IFNFQ19FTkNSWVBUOwotCWlmIChzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAibm9uZSIpID09IDApIHsKLQkJaWYgKGNyeXB0KSB7Ci0JCQlzZWMuZW5hYmxlZCA9IDA7Ci0JCQlzZWMuZW5jcnlwdCA9IDA7Ci0JCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMDsKLQkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7Ci0JCQlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9Ci0Jc2VjLmVuYWJsZWQgPSAxOwotCXNlYy5lbmNyeXB0ID0gMTsKLQotCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhwYXJhbS0+dS5jcnlwdC5hbGcpOwotCWlmIChvcHMgPT0gTlVMTCAmJiBzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiV0VQIikgPT0gMCkgewotCQlyZXF1ZXN0X21vZHVsZSgiaWVlZTgwMjExX2NyeXB0X3dlcCIpOwotCQlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKLQl9IGVsc2UgaWYgKG9wcyA9PSBOVUxMICYmIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJUS0lQIikgPT0gMCkgewotCQlyZXF1ZXN0X21vZHVsZSgiaWVlZTgwMjExX2NyeXB0X3RraXAiKTsKLQkJb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKHBhcmFtLT51LmNyeXB0LmFsZyk7Ci0JfSBlbHNlIGlmIChvcHMgPT0gTlVMTCAmJiBzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiQ0NNUCIpID09IDApIHsKLQkJcmVxdWVzdF9tb2R1bGUoImllZWU4MDIxMV9jcnlwdF9jY21wIik7Ci0JCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhwYXJhbS0+dS5jcnlwdC5hbGcpOwotCX0KLQlpZiAob3BzID09IE5VTEwpIHsKLQkJSVBXX0RFQlVHX0lORk8oIiVzOiB1bmtub3duIGNyeXB0byBhbGcgJyVzJ1xuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUsIHBhcmFtLT51LmNyeXB0LmFsZyk7Ci0JCXBhcmFtLT51LmNyeXB0LmVyciA9IElQVzIxMDBfQ1JZUFRfRVJSX1VOS05PV05fQUxHOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKCpjcnlwdCA9PSBOVUxMIHx8ICgqY3J5cHQpLT5vcHMgIT0gb3BzKSB7Ci0JCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqbmV3X2NyeXB0OwotCi0JCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7Ci0KLQkJbmV3X2NyeXB0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChuZXdfY3J5cHQgPT0gTlVMTCkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQluZXdfY3J5cHQtPm9wcyA9IG9wczsKLQkJaWYgKG5ld19jcnlwdC0+b3BzICYmIHRyeV9tb2R1bGVfZ2V0KG5ld19jcnlwdC0+b3BzLT5vd25lcikpCi0JCQluZXdfY3J5cHQtPnByaXYgPQotCQkJICAgIG5ld19jcnlwdC0+b3BzLT5pbml0KHBhcmFtLT51LmNyeXB0LmlkeCk7Ci0KLQkJaWYgKG5ld19jcnlwdC0+cHJpdiA9PSBOVUxMKSB7Ci0JCQlrZnJlZShuZXdfY3J5cHQpOwotCQkJcGFyYW0tPnUuY3J5cHQuZXJyID0KLQkJCSAgICBJUFcyMTAwX0NSWVBUX0VSUl9DUllQVF9JTklUX0ZBSUxFRDsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQkqY3J5cHQgPSBuZXdfY3J5cHQ7Ci0JfQotCi0JaWYgKHBhcmFtLT51LmNyeXB0LmtleV9sZW4gPiAwICYmICgqY3J5cHQpLT5vcHMtPnNldF9rZXkgJiYKLQkgICAgKCpjcnlwdCktPm9wcy0+c2V0X2tleShwYXJhbS0+dS5jcnlwdC5rZXksCi0JCQkJICAgcGFyYW0tPnUuY3J5cHQua2V5X2xlbiwgcGFyYW0tPnUuY3J5cHQuc2VxLAotCQkJCSAgICgqY3J5cHQpLT5wcml2KSA8IDApIHsKLQkJSVBXX0RFQlVHX0lORk8oIiVzOiBrZXkgc2V0dGluZyBmYWlsZWRcbiIsIGRldi0+bmFtZSk7Ci0JCXBhcmFtLT51LmNyeXB0LmVyciA9IElQVzIxMDBfQ1JZUFRfRVJSX0tFWV9TRVRfRkFJTEVEOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKHBhcmFtLT51LmNyeXB0LnNldF90eCkgewotCQlpZWVlLT50eF9rZXlpZHggPSBwYXJhbS0+dS5jcnlwdC5pZHg7Ci0JCXNlYy5hY3RpdmVfa2V5ID0gcGFyYW0tPnUuY3J5cHQuaWR4OwotCQlzZWMuZmxhZ3MgfD0gU0VDX0FDVElWRV9LRVk7Ci0JfQotCi0JaWYgKG9wcy0+bmFtZSAhPSBOVUxMKSB7Ci0KLQkJaWYgKHN0cmNtcChvcHMtPm5hbWUsICJXRVAiKSA9PSAwKSB7Ci0JCQltZW1jcHkoc2VjLmtleXNbcGFyYW0tPnUuY3J5cHQuaWR4XSwKLQkJCSAgICAgICBwYXJhbS0+dS5jcnlwdC5rZXksIHBhcmFtLT51LmNyeXB0LmtleV9sZW4pOwotCQkJc2VjLmtleV9zaXplc1twYXJhbS0+dS5jcnlwdC5pZHhdID0KLQkJCSAgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuOwotCQkJc2VjLmZsYWdzIHw9ICgxIDw8IHBhcmFtLT51LmNyeXB0LmlkeCk7Ci0JCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOwotCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzE7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKG9wcy0+bmFtZSwgIlRLSVAiKSA9PSAwKSB7Ci0JCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOwotCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzI7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKG9wcy0+bmFtZSwgIkNDTVAiKSA9PSAwKSB7Ci0JCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOwotCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzM7Ci0JCX0KLQl9Ci0gICAgICBkb25lOgotCWlmIChpZWVlLT5zZXRfc2VjdXJpdHkpCi0JCWllZWUtPnNldF9zZWN1cml0eShpZWVlLT5kZXYsICZzZWMpOwotCi0JLyogRG8gbm90IHJlc2V0IHBvcnQgaWYgY2FyZCBpcyBpbiBNYW5hZ2VkIG1vZGUgc2luY2UgcmVzZXR0aW5nIHdpbGwKLQkgKiBnZW5lcmF0ZSBuZXcgSUVFRSA4MDIuMTEgYXV0aGVudGljYXRpb24gd2hpY2ggbWF5IGVuZCB1cCBpbiBsb29waW5nCi0JICogd2l0aCBJRUVFIDgwMi4xWC4gIElmIHlvdXIgaGFyZHdhcmUgcmVxdWlyZXMgYSByZXNldCBhZnRlciBXRVAKLQkgKiBjb25maWd1cmF0aW9uIChmb3IgZXhhbXBsZS4uLiBQcmlzbTIpLCBpbXBsZW1lbnQgdGhlIHJlc2V0X3BvcnQgaW4KLQkgKiB0aGUgY2FsbGJhY2tzIHN0cnVjdHVyZXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSA4MDIuMTEgc3RhY2suICovCi0JaWYgKGllZWUtPnJlc2V0X29uX2tleWNoYW5nZSAmJgotCSAgICBpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgJiYKLQkgICAgaWVlZS0+cmVzZXRfcG9ydCAmJiBpZWVlLT5yZXNldF9wb3J0KGRldikpIHsKLQkJSVBXX0RFQlVHX0lORk8oIiVzOiByZXNldF9wb3J0IGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKLQkJcGFyYW0tPnUuY3J5cHQuZXJyID0gSVBXMjEwMF9DUllQVF9FUlJfQ0FSRF9DT05GX0ZBSUxFRDsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpcHcyMTAwX3dwYV9zdXBwbGljYW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqcCkKLXsKLQotCXN0cnVjdCBpcHcyMTAwX3BhcmFtICpwYXJhbTsKLQlpbnQgcmV0ID0gMDsKLQotCUlQV19ERUJVR19JT0NUTCgid3BhX3N1cHBsaWNhbnQ6IGxlbj0lZFxuIiwgcC0+bGVuZ3RoKTsKLQotCWlmIChwLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGlwdzIxMDBfcGFyYW0pIHx8ICFwLT5wb2ludGVyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBhcmFtID0gKHN0cnVjdCBpcHcyMTAwX3BhcmFtICopa21hbGxvYyhwLT5sZW5ndGgsIEdGUF9LRVJORUwpOwotCWlmIChwYXJhbSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcihwYXJhbSwgcC0+cG9pbnRlciwgcC0+bGVuZ3RoKSkgewotCQlrZnJlZShwYXJhbSk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXN3aXRjaCAocGFyYW0tPmNtZCkgewotCi0JY2FzZSBJUFcyMTAwX0NNRF9TRVRfV1BBX1BBUkFNOgotCQlyZXQgPSBpcHcyMTAwX3dwYV9zZXRfcGFyYW0oZGV2LCBwYXJhbS0+dS53cGFfcGFyYW0ubmFtZSwKLQkJCQkJICAgIHBhcmFtLT51LndwYV9wYXJhbS52YWx1ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJUFcyMTAwX0NNRF9TRVRfV1BBX0lFOgotCQlyZXQgPSBpcHcyMTAwX3dwYV9zZXRfd3BhX2llKGRldiwgcGFyYW0sIHAtPmxlbmd0aCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJUFcyMTAwX0NNRF9TRVRfRU5DUllQVElPTjoKLQkJcmV0ID0gaXB3MjEwMF93cGFfc2V0X2VuY3J5cHRpb24oZGV2LCBwYXJhbSwgcC0+bGVuZ3RoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElQVzIxMDBfQ01EX01MTUU6Ci0JCXJldCA9IGlwdzIxMDBfd3BhX21sbWUoZGV2LCBwYXJhbS0+dS5tbG1lLmNvbW1hbmQsCi0JCQkJICAgICAgIHBhcmFtLT51Lm1sbWUucmVhc29uX2NvZGUpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQotCQkgICAgICAgIjogJXM6IFVua25vd24gV1BBIHN1cHBsaWNhbnQgcmVxdWVzdDogJWRcbiIsIGRldi0+bmFtZSwKLQkJICAgICAgIHBhcmFtLT5jbWQpOwotCQlyZXQgPSAtRU9QTk9UU1VQUDsKLQotCX0KLQotCWlmIChyZXQgPT0gMCAmJiBjb3B5X3RvX3VzZXIocC0+cG9pbnRlciwgcGFyYW0sIHAtPmxlbmd0aCkpCi0JCXJldCA9IC1FRkFVTFQ7Ci0KLQlrZnJlZShwYXJhbSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpcHcyMTAwX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCi17Ci0Jc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcnE7Ci0JaW50IHJldCA9IC0xOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBJUFcyMTAwX0lPQ1RMX1dQQV9TVVBQTElDQU5UOgotCQlyZXQgPSBpcHcyMTAwX3dwYV9zdXBwbGljYW50KGRldiwgJndycS0+dS5kYXRhKTsKLQkJcmV0dXJuIHJldDsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci0KLQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci19Ci0jZW5kaWYJCQkJLyogV0lSRUxFU1NfRVhUIDwgMTggKi8KLQogc3RhdGljIHZvaWQgaXB3X2V0aHRvb2xfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKIHsKQEAgLTYzMzcsOSArNTkxNCw2IEBACiAJZGV2LT5vcGVuID0gaXB3MjEwMF9vcGVuOwogCWRldi0+c3RvcCA9IGlwdzIxMDBfY2xvc2U7CiAJZGV2LT5pbml0ID0gaXB3MjEwMF9uZXRfaW5pdDsKLSNpZiBXSVJFTEVTU19FWFQgPCAxOAotCWRldi0+ZG9faW9jdGwgPSBpcHcyMTAwX2lvY3RsOwotI2VuZGlmCiAJZGV2LT5nZXRfc3RhdHMgPSBpcHcyMTAwX3N0YXRzOwogCWRldi0+ZXRodG9vbF9vcHMgPSAmaXB3MjEwMF9ldGh0b29sX29wczsKIAlkZXYtPnR4X3RpbWVvdXQgPSBpcHcyMTAwX3R4X3RpbWVvdXQ7CkBAIC03MTUzLDcgKzY3MjcsNyBAQAogCiAJLyogU2V0IHRoZSBXaXJlbGVzcyBFeHRlbnNpb24gdmVyc2lvbnMgKi8KIAlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKLQlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSAxNjsKKwlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSAxODsKIAogLy8gICAgICByYW5nZS0+cmV0cnlfY2FwYTsgICAgICAvKiBXaGF0IHJldHJ5IG9wdGlvbnMgYXJlIHN1cHBvcnRlZCAqLwogLy8gICAgICByYW5nZS0+cmV0cnlfZmxhZ3M7ICAgICAvKiBIb3cgdG8gZGVjb2RlIG1heC9taW4gcmV0cnkgbGltaXQgKi8KQEAgLTcxODQsNiArNjc1OCw5IEBACiAJCQkJSVdfRVZFTlRfQ0FQQV9NQVNLKFNJT0NHSVdBUCkpOwogCXJhbmdlLT5ldmVudF9jYXBhWzFdID0gSVdfRVZFTlRfQ0FQQV9LXzE7CiAKKwlyYW5nZS0+ZW5jX2NhcGEgPSBJV19FTkNfQ0FQQV9XUEEgfCBJV19FTkNfQ0FQQV9XUEEyIHwKKwkJSVdfRU5DX0NBUEFfQ0lQSEVSX1RLSVAgfCBJV19FTkNfQ0FQQV9DSVBIRVJfQ0NNUDsKKwogCUlQV19ERUJVR19XWCgiR0VUIFJhbmdlXG4iKTsKIAogCXJldHVybiAwOwpAQCAtNzg1Miw3ICs3NDI5LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmIFdJUkVMRVNTX0VYVCA+IDE3CiAvKgogICogV0UtMTggV1BBIHN1cHBvcnQKICAqLwpAQCAtODExNCw3ICs3NjkwLDYgQEAKIAl9CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYJCQkJLyogV0lSRUxFU1NfRVhUID4gMTcgKi8KIAogLyoKICAqCkBAIC04MzQ3LDExICs3OTIyLDcgQEAKIAlOVUxMLAkJCS8qIFNJT0NXSVdUSFJTUFkgKi8KIAlpcHcyMTAwX3d4X3NldF93YXAsCS8qIFNJT0NTSVdBUCAqLwogCWlwdzIxMDBfd3hfZ2V0X3dhcCwJLyogU0lPQ0dJV0FQICovCi0jaWYgV0lSRUxFU1NfRVhUID4gMTcKIAlpcHcyMTAwX3d4X3NldF9tbG1lLAkvKiBTSU9DU0lXTUxNRSAqLwotI2Vsc2UKLQlOVUxMLAkJCS8qIC0tIGhvbGUgLS0gKi8KLSNlbmRpZgogCU5VTEwsCQkJLyogU0lPQ0dJV0FQTElTVCAtLSBkZXByZWNhdGVkICovCiAJaXB3MjEwMF93eF9zZXRfc2NhbiwJLyogU0lPQ1NJV1NDQU4gKi8KIAlpcHcyMTAwX3d4X2dldF9zY2FuLAkvKiBTSU9DR0lXU0NBTiAqLwpAQCAtODM3NSw3ICs3OTQ2LDYgQEAKIAlpcHcyMTAwX3d4X2dldF9lbmNvZGUsCS8qIFNJT0NHSVdFTkNPREUgKi8KIAlpcHcyMTAwX3d4X3NldF9wb3dlciwJLyogU0lPQ1NJV1BPV0VSICovCiAJaXB3MjEwMF93eF9nZXRfcG93ZXIsCS8qIFNJT0NHSVdQT1dFUiAqLwotI2lmIFdJUkVMRVNTX0VYVCA+IDE3CiAJTlVMTCwJCQkvKiAtLSBob2xlIC0tICovCiAJTlVMTCwJCQkvKiAtLSBob2xlIC0tICovCiAJaXB3MjEwMF93eF9zZXRfZ2VuaWUsCS8qIFNJT0NTSVdHRU5JRSAqLwpAQCAtODM4NSw3ICs3OTU1LDYgQEAKIAlpcHcyMTAwX3d4X3NldF9lbmNvZGVleHQsCS8qIFNJT0NTSVdFTkNPREVFWFQgKi8KIAlpcHcyMTAwX3d4X2dldF9lbmNvZGVleHQsCS8qIFNJT0NHSVdFTkNPREVFWFQgKi8KIAlOVUxMLAkJCS8qIFNJT0NTSVdQTUtTQSAqLwotI2VuZGlmCiB9OwogCiAjZGVmaW5lIElQVzIxMDBfUFJJVl9TRVRfTU9OSVRPUglTSU9DSVdGSVJTVFBSSVYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuYwppbmRleCBjZGZlNTAyLi40YzI4ZTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jCkBAIC04MTMsNyArODEzLDcgQEAKIAl1cCgmcHJpdi0+c2VtKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9faXB3X2xlZF9hY3Rpdml0eV9vbihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpCitzdGF0aWMgdm9pZCBfX2lwd19sZWRfYWN0aXZpdHlfb24oc3RydWN0IGlwd19wcml2ICpwcml2KQogewogCXUzMiBsZWQ7CiAKQEAgLTE1MDgsNyArMTUwOCw3IEBACiBzdGF0aWMgREVWSUNFX0FUVFIoZGlyZWN0X2R3b3JkLCBTX0lXVVNSIHwgU19JUlVHTywKIAkJICAgc2hvd19kaXJlY3RfZHdvcmQsIHN0b3JlX2RpcmVjdF9kd29yZCk7CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJmX2tpbGxfYWN0aXZlKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3N0YXRpYyBpbnQgcmZfa2lsbF9hY3RpdmUoc3RydWN0IGlwd19wcml2ICpwcml2KQogewogCWlmICgwID09IChpcHdfcmVhZDMyKHByaXYsIDB4MzApICYgMHgxMDAwMCkpCiAJCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfUkZfS0lMTF9IVzsKQEAgLTIzNTksNyArMjM1OSw3IEBACiB9CiAKIC8qIHBlcmZvcm0gYSBjaGlwIHNlbGVjdCBvcGVyYXRpb24gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBlZXByb21fY3Moc3RydWN0IGlwd19wcml2ICpwcml2KQorc3RhdGljIHZvaWQgZWVwcm9tX2NzKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKIHsKIAllZXByb21fd3JpdGVfcmVnKHByaXYsIDApOwogCWVlcHJvbV93cml0ZV9yZWcocHJpdiwgRUVQUk9NX0JJVF9DUyk7CkBAIC0yMzY4LDcgKzIzNjgsNyBAQAogfQogCiAvKiBwZXJmb3JtIGEgY2hpcCBzZWxlY3Qgb3BlcmF0aW9uICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZWVwcm9tX2Rpc2FibGVfY3Moc3RydWN0IGlwd19wcml2ICpwcml2KQorc3RhdGljIHZvaWQgZWVwcm9tX2Rpc2FibGVfY3Moc3RydWN0IGlwd19wcml2ICpwcml2KQogewogCWVlcHJvbV93cml0ZV9yZWcocHJpdiwgRUVQUk9NX0JJVF9DUyk7CiAJZWVwcm9tX3dyaXRlX3JlZyhwcml2LCAwKTsKQEAgLTI0NzUsNyArMjQ3NSw3IEBACiAJSVBXX0RFQlVHX1RSQUNFKCI8PFxuIik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpcHdfemVyb19tZW1vcnkoc3RydWN0IGlwd19wcml2ICpwcml2LCB1MzIgc3RhcnQsIHUzMiBjb3VudCkKK3N0YXRpYyB2b2lkIGlwd196ZXJvX21lbW9yeShzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHUzMiBzdGFydCwgdTMyIGNvdW50KQogewogCWNvdW50ID4+PSAyOwogCWlmICghY291bnQpCkBAIC0yNzcyLDcgKzI3NzIsNyBAQAogCXJldHVybiBpcHdfcmVhZDMyKHByaXYsIDB4OTApID09IDB4ZDU1NTU1ZDU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGlwd19wb2xsX2JpdChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHUzMiBhZGRyLCB1MzIgbWFzaywKK3N0YXRpYyBpbnQgaXB3X3BvbGxfYml0KHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTMyIGFkZHIsIHUzMiBtYXNrLAogCQkJICAgICAgIGludCB0aW1lb3V0KQogewogCWludCBpID0gMDsKQEAgLTMxNTAsNyArMzE1MCw3IEBACiAKICNkZWZpbmUgSVBXX1JYX0JVRl9TSVpFICgzMDAwKQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXB3X3J4X3F1ZXVlX3Jlc2V0KHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwKK3N0YXRpYyB2b2lkIGlwd19yeF9xdWV1ZV9yZXNldChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsCiAJCQkJICAgICAgc3RydWN0IGlwd19yeF9xdWV1ZSAqcnhxKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0zNjA4LDcgKzM2MDgsNyBAQAogCWlwd19xdWV1ZV90eF9mcmVlKHByaXYsICZwcml2LT50eHFbM10pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXB3X2NyZWF0ZV9ic3NpZChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHU4ICogYnNzaWQpCitzdGF0aWMgdm9pZCBpcHdfY3JlYXRlX2Jzc2lkKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTggKiBic3NpZCkKIHsKIAkvKiBGaXJzdCAzIGJ5dGVzIGFyZSBtYW51ZmFjdHVyZXIgKi8KIAlic3NpZFswXSA9IHByaXYtPm1hY19hZGRyWzBdOwpAQCAtMzYyMiw3ICszNjIyLDcgQEAKIAlic3NpZFswXSB8PSAweDAyOwkvKiBzZXQgbG9jYWwgYXNzaWdubWVudCBiaXQgKElFRUU4MDIpICovCiB9CiAKLXN0YXRpYyBpbmxpbmUgdTggaXB3X2FkZF9zdGF0aW9uKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgdTggKiBic3NpZCkKK3N0YXRpYyB1OCBpcHdfYWRkX3N0YXRpb24oc3RydWN0IGlwd19wcml2ICpwcml2LCB1OCAqIGJzc2lkKQogewogCXN0cnVjdCBpcHdfc3RhdGlvbl9lbnRyeSBlbnRyeTsKIAlpbnQgaTsKQEAgLTM2NTUsNyArMzY1NSw3IEBACiAJcmV0dXJuIGk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTggaXB3X2ZpbmRfc3RhdGlvbihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHU4ICogYnNzaWQpCitzdGF0aWMgdTggaXB3X2ZpbmRfc3RhdGlvbihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHU4ICogYnNzaWQpCiB7CiAJaW50IGk7CiAKQEAgLTM3OTQsNyArMzc5NCw3IEBACiAJbWVtc2V0KGF2ZywgMCwgc2l6ZW9mKCphdmcpKTsKIH0KIAotc3RhdGljIHZvaWQgaW5saW5lIGF2ZXJhZ2VfYWRkKHN0cnVjdCBhdmVyYWdlICphdmcsIHMxNiB2YWwpCitzdGF0aWMgdm9pZCBhdmVyYWdlX2FkZChzdHJ1Y3QgYXZlcmFnZSAqYXZnLCBzMTYgdmFsKQogewogCWF2Zy0+c3VtIC09IGF2Zy0+ZW50cmllc1thdmctPnBvc107CiAJYXZnLT5zdW0gKz0gdmFsOwpAQCAtMzgwNSw3ICszODA1LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBzMTYgaW5saW5lIGF2ZXJhZ2VfdmFsdWUoc3RydWN0IGF2ZXJhZ2UgKmF2ZykKK3N0YXRpYyBzMTYgYXZlcmFnZV92YWx1ZShzdHJ1Y3QgYXZlcmFnZSAqYXZnKQogewogCWlmICghdW5saWtlbHkoYXZnLT5pbml0KSkgewogCQlpZiAoYXZnLT5wb3MpCkBAIC0zODQ3LDcgKzM4NDcsNyBAQAogCiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIGlwd19nZXRfbWF4X3JhdGUoc3RydWN0IGlwd19wcml2ICpwcml2KQorc3RhdGljIHUzMiBpcHdfZ2V0X21heF9yYXRlKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKIHsKIAl1MzIgaSA9IDB4ODAwMDAwMDA7CiAJdTMyIG1hc2sgPSBwcml2LT5yYXRlc19tYXNrOwpAQCAtNDA4Nyw3ICs0MDg3LDcgQEAKICAqIHJvYW1pbmdfdGhyZXNob2xkIC0+IGRpc2Fzc29jaWF0ZV90aHJlc2hvbGQsIHNjYW4gYW5kIHJvYW0gZm9yIGJldHRlciBzaWduYWwuCiAgKiBBYm92ZSBkaXNhc3NvY2lhdGUgdGhyZXNob2xkLCBnaXZlIHVwIGFuZCBzdG9wIHNjYW5uaW5nLgogICogUm9hbWluZyBpcyBkaXNhYmxlZCBpZiBkaXNhc3NvY2lhdGVfdGhyZXNob2xkIDw9IHJvYW1pbmdfdGhyZXNob2xkICAqLwotc3RhdGljIGlubGluZSB2b2lkIGlwd19oYW5kbGVfbWlzc2VkX2JlYWNvbihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsCitzdGF0aWMgdm9pZCBpcHdfaGFuZGxlX21pc3NlZF9iZWFjb24oc3RydWN0IGlwd19wcml2ICpwcml2LAogCQkJCQkgICAgaW50IG1pc3NlZF9jb3VudCkKIHsKIAlwcml2LT5ub3RpZl9taXNzZWRfYmVhY29ucyA9IG1pc3NlZF9jb3VudDsKQEAgLTQxNTcsNyArNDE1Nyw3IEBACiAgKiBIYW5kbGUgaG9zdCBub3RpZmljYXRpb24gcGFja2V0LgogICogQ2FsbGVkIGZyb20gaW50ZXJydXB0IHJvdXRpbmUKICAqLwotc3RhdGljIGlubGluZSB2b2lkIGlwd19yeF9ub3RpZmljYXRpb24oc3RydWN0IGlwd19wcml2ICpwcml2LAorc3RhdGljIHZvaWQgaXB3X3J4X25vdGlmaWNhdGlvbihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsCiAJCQkJICAgICAgIHN0cnVjdCBpcHdfcnhfbm90aWZpY2F0aW9uICpub3RpZikKIHsKIAlub3RpZi0+c2l6ZSA9IGxlMTZfdG9fY3B1KG5vdGlmLT5zaXplKTsKQEAgLTUwOTUsNyArNTA5NSw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpcHdfY29weV9yYXRlcyhzdHJ1Y3QgaXB3X3N1cHBvcnRlZF9yYXRlcyAqZGVzdCwKK3N0YXRpYyB2b2lkIGlwd19jb3B5X3JhdGVzKHN0cnVjdCBpcHdfc3VwcG9ydGVkX3JhdGVzICpkZXN0LAogCQkJCSAgY29uc3Qgc3RydWN0IGlwd19zdXBwb3J0ZWRfcmF0ZXMgKnNyYykKIHsKIAl1OCBpOwpAQCAtNTg1Niw3ICs1ODU2LDcgQEAKICNkZWZpbmUgaXB3X2RlYnVnX2NvbmZpZyh4KSBkbyB7fSB3aGlsZSAoMCkKICNlbmRpZgogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXB3X3NldF9maXhlZF9yYXRlKHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwgaW50IG1vZGUpCitzdGF0aWMgdm9pZCBpcHdfc2V0X2ZpeGVkX3JhdGUoc3RydWN0IGlwd19wcml2ICpwcml2LCBpbnQgbW9kZSkKIHsKIAkvKiBUT0RPOiBWZXJpZnkgdGhhdCB0aGlzIHdvcmtzLi4uICovCiAJc3RydWN0IGlwd19maXhlZF9yYXRlIGZyID0gewpAQCAtNzYzNCw3ICs3NjM0LDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW5saW5lIGludCBpc19uZXR3b3JrX3BhY2tldChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsCitzdGF0aWMgaW50IGlzX25ldHdvcmtfcGFja2V0KHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwKIAkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhlYWRlcikKIHsKIAkvKiBGaWx0ZXIgaW5jb21pbmcgcGFja2V0cyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgdGFyZ2V0dGVkIHRvd2FyZApAQCAtNzY3Miw3ICs3NjcyLDcgQEAKIAogI2RlZmluZSBJUFdfUEFDS0VUX1JFVFJZX1RJTUUgSFoKIAotc3RhdGljIGlubGluZSBpbnQgaXNfZHVwbGljYXRlX3BhY2tldChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsCitzdGF0aWMgIGludCBpc19kdXBsaWNhdGVfcGFja2V0KHN0cnVjdCBpcHdfcHJpdiAqcHJpdiwKIAkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGVhZGVyKQogewogCXUxNiBzYyA9IGxlMTZfdG9fY3B1KGhlYWRlci0+c2VxX2N0bCk7CkBAIC04OTM2LDE0ICs4OTM2LDEyIEBACiAJSVBXX0RFQlVHX0hDKCJzdGFydGluZyByZXF1ZXN0IGRpcmVjdCBzY2FuIVxuIik7CiAKIAlpZiAocHJpdi0+c3RhdHVzICYgKFNUQVRVU19TQ0FOTklORyB8IFNUQVRVU19TQ0FOX0FCT1JUSU5HKSkgewotCQllcnIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocHJpdi0+d2FpdF9zdGF0ZSwKLQkJCQkJICAgICAgICEocHJpdi0+Ci0JCQkJCQkgc3RhdHVzICYgKFNUQVRVU19TQ0FOTklORyB8Ci0JCQkJCQkJICAgU1RBVFVTX1NDQU5fQUJPUlRJTkcpKSk7Ci0JCWlmIChlcnIpIHsKLQkJCUlQV19ERUJVR19IQygiYWJvcnRpbmcgZGlyZWN0IHNjYW4iKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQorCQkvKiBXZSBzaG91bGQgbm90IHNsZWVwIGhlcmU7IG90aGVyd2lzZSB3ZSB3aWxsIGJsb2NrIG1vc3QKKwkJICogb2YgdGhlIHN5c3RlbSAoZm9yIGluc3RhbmNlLCB3ZSBob2xkIHJ0bmxfbG9jayB3aGVuIHdlCisJCSAqIGdldCBoZXJlKS4KKwkJICovCisJCWVyciA9IC1FQUdBSU47CisJCWdvdG8gZG9uZTsKIAl9CiAJbWVtc2V0KCZzY2FuLCAwLCBzaXplb2Yoc2NhbikpOwogCkBAIC05NTgxLDcgKzk1NzksNyBAQAogCiAvKiBuZXQgZGV2aWNlIHN0dWZmICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X3N5c19jb25maWcoc3RydWN0IGlwd19zeXNfY29uZmlnICpzeXNfY29uZmlnKQorc3RhdGljICB2b2lkIGluaXRfc3lzX2NvbmZpZyhzdHJ1Y3QgaXB3X3N5c19jb25maWcgKnN5c19jb25maWcpCiB7CiAJbWVtc2V0KHN5c19jb25maWcsIDAsIHNpemVvZihzdHJ1Y3QgaXB3X3N5c19jb25maWcpKTsKIAlzeXNfY29uZmlnLT5idF9jb2V4aXN0ZW5jZSA9IDE7CS8qIFdlIG1heSBuZWVkIHRvIGxvb2sgaW50byBwcnZTdGFCdENvbmZpZyAqLwpAQCAtOTYyNyw3ICs5NjI1LDcgQEAKIHdlIG5lZWQgdG8gaGVhdmlseSBtb2RpZnkgdGhlIGllZWU4MDIxMV9za2JfdG9fdHhiLgogKi8KIAotc3RhdGljIGlubGluZSBpbnQgaXB3X3R4X3NrYihzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIsCitzdGF0aWMgaW50IGlwd190eF9za2Ioc3RydWN0IGlwd19wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiLAogCQkJICAgICBpbnQgcHJpKQogewogCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCmluZGV4IDEzNWExNTYuLmM1Y2Q2MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYwpAQCAtNzQ4LDcgKzc0OCw3IEBACiAJaWYgKGVzc2lkLT5sZW5ndGgpIHsKIAkJZHdycS0+ZmxhZ3MgPSAxOwkvKiBzZXQgRVNTSUQgdG8gT04gZm9yIFdpcmVsZXNzIEV4dGVuc2lvbnMgKi8KIAkJLyogaWYgaXQgaXMgdG8gYmlnLCB0cnVuayBpdCAqLwotCQlkd3JxLT5sZW5ndGggPSBtaW4oSVdfRVNTSURfTUFYX1NJWkUsIGVzc2lkLT5sZW5ndGggKyAxKTsKKwkJZHdycS0+bGVuZ3RoID0gbWluKElXX0VTU0lEX01BWF9TSVpFLCBlc3NpZC0+bGVuZ3RoKTsKIAl9IGVsc2UgewogCQlkd3JxLT5mbGFncyA9IDA7CiAJCWR3cnEtPmxlbmd0aCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ldGguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jCmluZGV4IDMzZDY0ZDIuLmE4MjYxZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jCkBAIC0xNzcsNyArMTc3LDcgQEAKICNlbmRpZgogCiAJCQluZXdza2ItPmRldiA9IHNrYi0+ZGV2OwotCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKIAkJCXNrYiA9IG5ld3NrYjsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmMKaW5kZXggMzE5MTgwYy4uNzg4MGQ4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmMKQEAgLTEyNTYsNyArMTI1Niw3IEBACiAJZXh0cmFbSVdfRVNTSURfTUFYX1NJWkVdID0gJ1wwJzsKIAogCS8qIFB1c2ggaXQgb3V0ICEgKi8KLQlkd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsKKwlkd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpOwogCWR3cnEtPmZsYWdzID0gMTsgLyogYWN0aXZlICovCiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3N0cmlwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9zdHJpcC5jCmluZGV4IGQyNTI2NGIuLjE4YmFhY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3N0cmlwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvc3RyaXAuYwpAQCAtMTY3NSwxMSArMTY3NSw2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogUmVjZWl2aW5nIHJvdXRpbmVzCQkJCQkJCSovCiAKLXN0YXRpYyBpbnQgc3RyaXBfcmVjZWl2ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0JcmV0dXJuIDB4MTAwMDA7CQkvKiBXZSBjYW4gaGFuZGxlIGFuIGluZmluaXRlIGFtb3VudCBvZiBkYXRhLiA6LSkgKi8KLX0KLQogLyoKICAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSByZXNwb25zZSB0byB0aGUgQVRTMzAwPyBjb21tYW5kLAogICogZXh0cmFjdGluZyB0aGUgcmFkaW8gdmVyc2lvbiBhbmQgc2VyaWFsIG51bWJlci4KQEAgLTI0MjQsNyArMjQxOSw3IEBACiAvKgogICogSGVyZSdzIHRoZSBvcmRlciB0aGluZ3MgaGFwcGVuOgogICogV2hlbiB0aGUgdXNlciBydW5zICJzbGF0dGFjaCAtcCBzdHJpcCAuLi4iCi0gKiAgMS4gVGhlIFRUWSBtb2R1bGUgY2FsbHMgc3RyaXBfb3BlbgorICogIDEuIFRoZSBUVFkgbW9kdWxlIGNhbGxzIHN0cmlwX29wZW47OwogICogIDIuIHN0cmlwX29wZW4gY2FsbHMgc3RyaXBfYWxsb2MKICAqICAzLiAgICAgICAgICAgICAgICAgIHN0cmlwX2FsbG9jIGNhbGxzIHJlZ2lzdGVyX25ldGRldgogICogIDQuICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfbmV0ZGV2IGNhbGxzIHN0cmlwX2Rldl9pbml0CkBAIC0yNjUyLDYgKzI2NDcsOCBAQAogCiAJc3RyaXBfaW5mby0+dHR5ID0gdHR5OwogCXR0eS0+ZGlzY19kYXRhID0gc3RyaXBfaW5mbzsKKwl0dHktPnJlY2VpdmVfcm9vbSA9IDY1NTM2OworCiAJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCiAJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKIApAQCAtMjc2Miw3ICsyNzU5LDYgQEAKIAkuY2xvc2UgPSBzdHJpcF9jbG9zZSwKIAkuaW9jdGwgPSBzdHJpcF9pb2N0bCwKIAkucmVjZWl2ZV9idWYgPSBzdHJpcF9yZWNlaXZlX2J1ZiwKLQkucmVjZWl2ZV9yb29tID0gc3RyaXBfcmVjZWl2ZV9yb29tLAogCS53cml0ZV93YWtldXAgPSBzdHJpcF93cml0ZV9zb21lX21vcmUsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLmMKaW5kZXggYjBkOGI1Yi4uZmYxOTJlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4uYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAgKiBXcml0ZSB0byBjYXJkJ3MgSG9zdCBBZGFwdGVyIENvbW1hbmQgUmVnaXN0ZXIuIEluY2x1ZGUgYSBkZWxheSBmb3IKICAqIHRob3NlIHRpbWVzIHdoZW4gaXQgaXMgbmVlZGVkLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaGFjcl93cml0ZV9zbG93KHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1MTYgaGFjcikKK3N0YXRpYyB2b2lkIGhhY3Jfd3JpdGVfc2xvdyh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IGhhY3IpCiB7CiAJaGFjcl93cml0ZShpb2FkZHIsIGhhY3IpOwogCS8qIGRlbGF5IG1pZ2h0IG9ubHkgYmUgbmVlZGVkIHNvbWV0aW1lcyAqLwpAQCAtMjQyLDcgKzI0Miw3IEBACiAgKiBUaGUgV2luZG93cyBkcml2ZXJzIGRvbid0IHVzZSB0aGUgQ1JDLCBidXQgdGhlIEFQIGFuZCB0aGUgUHRQIHRvb2wKICAqIGRlcGVuZCBvbiBpdC4KICAqLwotc3RhdGljIGlubGluZSB1MTYgcHNhX2NyYyh1OCAqIHBzYSwJLyogVGhlIFBTQSAqLworc3RhdGljIHUxNiBwc2FfY3JjKHU4ICogcHNhLAkvKiBUaGUgUFNBICovCiAJCQkgICAgICBpbnQgc2l6ZSkKIHsJCQkJLyogTnVtYmVyIG9mIHNob3J0IGZvciBDUkMgKi8KIAlpbnQgYnl0ZV9jbnQ7CQkvKiBMb29wIG9uIHRoZSBQU0EgKi8KQEAgLTMxMCw3ICszMTAsNyBAQAogLyoKICAqIFdyaXRlIDEgYnl0ZSB0byB0aGUgTU1DLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgbW1jX291dCh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IG8sIHU4IGQpCitzdGF0aWMgdm9pZCBtbWNfb3V0KHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1MTYgbywgdTggZCkKIHsKIAlpbnQgY291bnQgPSAwOwogCkBAIC0zMjYsNyArMzI2LDcgQEAKICAqIFJvdXRpbmUgdG8gd3JpdGUgYnl0ZXMgdG8gdGhlIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlci4KICAqIFdlIHN0YXJ0IGF0IHRoZSBlbmQgYmVjYXVzZSBpdCBpcyB0aGUgd2F5IGl0IHNob3VsZCBiZSEKICAqLwotc3RhdGljIGlubGluZSB2b2lkIG1tY193cml0ZSh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTggbywgdTggKiBiLCBpbnQgbikKK3N0YXRpYyB2b2lkIG1tY193cml0ZSh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTggbywgdTggKiBiLCBpbnQgbikKIHsKIAlvICs9IG47CiAJYiArPSBuOwpAQCAtMzQwLDcgKzM0MCw3IEBACiAgKiBSZWFkIGEgYnl0ZSBmcm9tIHRoZSBNTUMuCiAgKiBPcHRpbWlzZWQgdmVyc2lvbiBmb3IgMSBieXRlLCBhdm9pZCB1c2luZyBtZW1vcnkuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdTggbW1jX2luKHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1MTYgbykKK3N0YXRpYyB1OCBtbWNfaW4odW5zaWduZWQgbG9uZyBpb2FkZHIsIHUxNiBvKQogewogCWludCBjb3VudCA9IDA7CiAKQEAgLTU4Nyw3ICs1ODcsNyBAQAogICogU2V0IGNoYW5uZWwgYXR0ZW50aW9uIGJpdCBhbmQgYnVzeSB3YWl0IHVudGlsIGNvbW1hbmQgaGFzCiAgKiBjb21wbGV0ZWQsIHRoZW4gYWNrbm93bGVkZ2UgY29tcGxldGlvbiBvZiB0aGUgY29tbWFuZC4KICAqLwotc3RhdGljIGlubGluZSBpbnQgd3Zfc3luY2hyb25vdXNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCBjb25zdCBjaGFyICpzdHIpCitzdGF0aWMgaW50IHd2X3N5bmNocm9ub3VzX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgY29uc3QgY2hhciAqc3RyKQogewogCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOwpAQCAtNjMzLDcgKzYzMyw3IEBACiAgKiBDb25maWd1cmF0aW9uIGNvbW1hbmRzIGNvbXBsZXRpb24gaW50ZXJydXB0LgogICogQ2hlY2sgaWYgZG9uZSwgYW5kIGlmIE9LLgogICovCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGludAogd3ZfY29uZmlnX2NvbXBsZXRlKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBsb25nIGlvYWRkciwgbmV0X2xvY2FsICogbHApCiB7CiAJdW5zaWduZWQgc2hvcnQgbWNzX2FkZHI7CkBAIC04NDMsNyArODQzLDcgQEAKICAqIHdhdmVsYW5faW50ZXJydXB0IGlzIG5vdCBhbiBvcHRpb24pLCBzbyB5b3UgbWF5IGV4cGVyaWVuY2UKICAqIGRlbGF5cyBzb21ldGltZXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB3dl84MjU4Nl9yZWNvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3N0YXRpYyB2b2lkIHd2XzgyNTg2X3JlY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQogewogCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTI4MSw3ICsxMjgxLDcgQEAKICAqIFRoaXMgaXMgdGhlIGluZm9ybWF0aW9uIHdoaWNoIGlzIGRpc3BsYXllZCBieSB0aGUgZHJpdmVyIGF0IHN0YXJ0dXAuCiAgKiBUaGVyZSBhcmUgbG90cyBvZiBmbGFncyBmb3IgY29uZmlndXJpbmcgaXQgdG8geW91ciBsaWtpbmcuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB3dl9pbml0X2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCitzdGF0aWMgdm9pZCB3dl9pbml0X2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCiB7CiAJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CiAJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OwpAQCAtMTUwMiw3ICsxNTAyLDcgQEAKICAqIEl0J3MgYSBiaXQgY29tcGxpY2F0ZWQgYW5kIHlvdSBkb24ndCByZWFsbHkgd2FudCB0byBsb29rIGludG8gaXQuCiAgKiAoY2FsbGVkIGluIHdhdmVsYW5faW9jdGwpCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHd2X3NldF9mcmVxdWVuY3kodW5zaWduZWQgbG9uZyBpb2FkZHIsCS8qIEkvTyBwb3J0IG9mIHRoZSBjYXJkICovCitzdGF0aWMgaW50IHd2X3NldF9mcmVxdWVuY3kodW5zaWduZWQgbG9uZyBpb2FkZHIsCS8qIEkvTyBwb3J0IG9mIHRoZSBjYXJkICovCiAJCQkJICAgaXdfZnJlcSAqIGZyZXF1ZW5jeSkKIHsKIAljb25zdCBpbnQgQkFORF9OVU0gPSAxMDsJLyogTnVtYmVyIG9mIGJhbmRzICovCkBAIC0xNjc3LDcgKzE2NzcsNyBAQAogLyoKICAqIEdpdmUgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGZyZXF1ZW5jaWVzLgogICovCi1zdGF0aWMgaW5saW5lIGludCB3dl9mcmVxdWVuY3lfbGlzdCh1bnNpZ25lZCBsb25nIGlvYWRkciwJLyogSS9PIHBvcnQgb2YgdGhlIGNhcmQgKi8KK3N0YXRpYyBpbnQgd3ZfZnJlcXVlbmN5X2xpc3QodW5zaWduZWQgbG9uZyBpb2FkZHIsCS8qIEkvTyBwb3J0IG9mIHRoZSBjYXJkICovCiAJCQkJICAgIGl3X2ZyZXEgKiBsaXN0LAkvKiBMaXN0IG9mIGZyZXF1ZW5jaWVzIHRvIGZpbGwgKi8KIAkJCQkgICAgaW50IG1heCkKIHsJCQkJLyogTWF4aW11bSBudW1iZXIgb2YgZnJlcXVlbmNpZXMgKi8KQEAgLTI0ODksNyArMjQ4OSw3IEBACiAgKiBOb3RlOiBpZiBhbnkgZXJyb3JzIG9jY3VyLCB0aGUgcGFja2V0IGlzICJkcm9wcGVkIG9uIHRoZSBmbG9vciIuCiAgKiAoY2FsbGVkIGJ5IHd2X3BhY2tldF9yY3YoKSkKICAqLwotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogd3ZfcGFja2V0X3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIHUxNiBidWZfb2ZmLCBpbnQgc2tzaXplKQogewogCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKQEAgLTI1ODUsNyArMjU4NSw3IEBACiAgKiAoY2FsbGVkIGluIHdhdmVsYW5faW50ZXJydXB0KCkpLgogICogTm90ZSA6IHRoZSBzcGlubG9jayBpcyBhbHJlYWR5IGdyYWJiZWQgZm9yIHVzLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgd3ZfcmVjZWl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3N0YXRpYyB2b2lkIHd2X3JlY2VpdmUoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCiB7CiAJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKIAluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CkBAIC0yNzY4LDcgKzI3NjgsNyBAQAogICoKICAqIChjYWxsZWQgaW4gd2F2ZWxhbl9wYWNrZXRfeG1pdCgpKQogICovCi1zdGF0aWMgaW5saW5lIGludCB3dl9wYWNrZXRfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIHZvaWQgKmJ1Ziwgc2hvcnQgbGVuZ3RoKQorc3RhdGljIGludCB3dl9wYWNrZXRfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIHZvaWQgKmJ1Ziwgc2hvcnQgbGVuZ3RoKQogewogCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOwpAQCAtMjk2NCw3ICsyOTY0LDcgQEAKICAqIFJvdXRpbmUgdG8gaW5pdGlhbGl6ZSB0aGUgTW9kZW0gTWFuYWdlbWVudCBDb250cm9sbGVyLgogICogKGNhbGxlZCBieSB3dl9od19yZXNldCgpKQogICovCi1zdGF0aWMgaW5saW5lIGludCB3dl9tbWNfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3N0YXRpYyBpbnQgd3ZfbW1jX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCiB7CiAJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKIAluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CkBAIC0zMTM2LDcgKzMxMzYsNyBAQAogICogU3RhcnQgdGhlIHJlY2VpdmUgdW5pdC4KICAqIChjYWxsZWQgYnkgd3ZfaHdfcmVzZXQoKSkKICAqLwotc3RhdGljIGlubGluZSBpbnQgd3ZfcnVfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCitzdGF0aWMgaW50IHd2X3J1X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQogewogCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOwpAQCAtMzIyOCw3ICszMjI4LDcgQEAKICAqCiAgKiAoY2FsbGVkIGJ5IHd2X2h3X3Jlc2V0KCkpCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHd2X2N1X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQorc3RhdGljIGludCB3dl9jdV9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKIHsKIAluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CiAJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKQEAgLTMzMjksNyArMzMyOSw3IEBACiAgKgogICogKGNhbGxlZCBieSB3dl9od19yZXNldCgpKQogICovCi1zdGF0aWMgaW5saW5lIGludCB3dl84MjU4Nl9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3N0YXRpYyBpbnQgd3ZfODI1ODZfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCiB7CiAJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OwogCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CkBAIC0zNjQxLDcgKzM2NDEsNyBAQAogICogV2F2ZUxBTiBjb250cm9sbGVyIChpODI1ODYpLgogICogKGNhbGxlZCBieSB3YXZlbGFuX2Nsb3NlKCkpCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB3dl84MjU4Nl9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQorc3RhdGljIHZvaWQgd3ZfODI1ODZfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKIHsKIAluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CiAJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYwppbmRleCA3ZTIwMzlmLi5jZjM3MzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5jCkBAIC0yMjgwLDcgKzIyODAsNyBAQAogCWV4dHJhW0lXX0VTU0lEX01BWF9TSVpFXSA9ICdcMCc7CiAKIAkvKiBTZXQgdGhlIGxlbmd0aCAqLwotCXdycXUtPmRhdGEubGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7CisJd3JxdS0+ZGF0YS5sZW5ndGggPSBzdHJsZW4oZXh0cmEpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL29wcm9maWxlL2J1ZmZlcl9zeW5jLmMgYi9kcml2ZXJzL29wcm9maWxlL2J1ZmZlcl9zeW5jLmMKaW5kZXggNTMxYjA3My4uYjJlOGU0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9vcHJvZmlsZS9idWZmZXJfc3luYy5jCisrKyBiL2RyaXZlcnMvb3Byb2ZpbGUvYnVmZmVyX3N5bmMuYwpAQCAtNDMsMTMgKzQzLDE2IEBACiAgKiBsaXN0IGZvciBwcm9jZXNzaW5nLiBPbmx5IGFmdGVyIHR3byBmdWxsIGJ1ZmZlciBzeW5jcwogICogZG9lcyB0aGUgdGFzayBldmVudHVhbGx5IGdldCBmcmVlZCwgYmVjYXVzZSBieSB0aGVuCiAgKiB3ZSBhcmUgc3VyZSB3ZSB3aWxsIG5vdCByZWZlcmVuY2UgaXQgYWdhaW4uCisgKiBDYW4gYmUgaW52b2tlZCBmcm9tIHNvZnRpcnEgdmlhIFJDVSBjYWxsYmFjayBkdWUgdG8KKyAqIGNhbGxfcmN1KCkgb2YgdGhlIHRhc2sgc3RydWN0LCBoZW5jZSB0aGUgX2lycXNhdmUuCiAgKi8KIHN0YXRpYyBpbnQgdGFza19mcmVlX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKiBzZWxmLCB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqIGRhdGEpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKiB0YXNrID0gZGF0YTsKLQlzcGluX2xvY2soJnRhc2tfbW9ydHVhcnkpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrX21vcnR1YXJ5LCBmbGFncyk7CiAJbGlzdF9hZGQoJnRhc2stPnRhc2tzLCAmZHlpbmdfdGFza3MpOwotCXNwaW5fdW5sb2NrKCZ0YXNrX21vcnR1YXJ5KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrX21vcnR1YXJ5LCBmbGFncyk7CiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KIApAQCAtNDMxLDI1ICs0MzQsMjIgQEAKICAqLwogc3RhdGljIHZvaWQgcHJvY2Vzc190YXNrX21vcnR1YXJ5KHZvaWQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqIHBvczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICogcG9zMjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCUxJU1RfSEVBRChsb2NhbF9kZWFkX3Rhc2tzKTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKiB0YXNrOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqIHR0YXNrOwogCi0Jc3Bpbl9sb2NrKCZ0YXNrX21vcnR1YXJ5KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGFza19tb3J0dWFyeSwgZmxhZ3MpOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgcG9zMiwgJmRlYWRfdGFza3MpIHsKLQkJdGFzayA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRhc2tzKTsKKwlsaXN0X3NwbGljZV9pbml0KCZkZWFkX3Rhc2tzLCAmbG9jYWxfZGVhZF90YXNrcyk7CisJbGlzdF9zcGxpY2VfaW5pdCgmZHlpbmdfdGFza3MsICZkZWFkX3Rhc2tzKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2tfbW9ydHVhcnksIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0YXNrLCB0dGFzaywgJmxvY2FsX2RlYWRfdGFza3MsIHRhc2tzKSB7CiAJCWxpc3RfZGVsKCZ0YXNrLT50YXNrcyk7CiAJCWZyZWVfdGFzayh0YXNrKTsKIAl9Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBwb3MyLCAmZHlpbmdfdGFza3MpIHsKLQkJdGFzayA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRhc2tzKTsKLQkJbGlzdF9kZWwoJnRhc2stPnRhc2tzKTsKLQkJbGlzdF9hZGRfdGFpbCgmdGFzay0+dGFza3MsICZkZWFkX3Rhc2tzKTsKLQl9Ci0KLQlzcGluX3VubG9jaygmdGFza19tb3J0dWFyeSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9vcHJvZmlsZS9jcHVfYnVmZmVyLmMgYi9kcml2ZXJzL29wcm9maWxlL2NwdV9idWZmZXIuYwppbmRleCAwMjZmNjcxLi43ODE5M2U0IDEwMDY0NAotLS0gYS9kcml2ZXJzL29wcm9maWxlL2NwdV9idWZmZXIuYworKysgYi9kcml2ZXJzL29wcm9maWxlL2NwdV9idWZmZXIuYwpAQCAtNTIsNyArNTIsOCBAQAogCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgewogCQlzdHJ1Y3Qgb3Byb2ZpbGVfY3B1X2J1ZmZlciAqIGIgPSAmY3B1X2J1ZmZlcltpXTsKICAKLQkJYi0+YnVmZmVyID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IG9wX3NhbXBsZSkgKiBidWZmZXJfc2l6ZSk7CisJCWItPmJ1ZmZlciA9IHZtYWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IG9wX3NhbXBsZSkgKiBidWZmZXJfc2l6ZSwKKwkJCWNwdV90b19ub2RlKGkpKTsKIAkJaWYgKCFiLT5idWZmZXIpCiAJCQlnb3RvIGZhaWw7CiAgCmRpZmYgLS1naXQgYS9kcml2ZXJzL29wcm9maWxlL2V2ZW50X2J1ZmZlci5jIGIvZHJpdmVycy9vcHJvZmlsZS9ldmVudF9idWZmZXIuYwppbmRleCAxNjZiY2E3Li5iODAzMThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL29wcm9maWxlL2V2ZW50X2J1ZmZlci5jCisrKyBiL2RyaXZlcnMvb3Byb2ZpbGUvZXZlbnRfYnVmZmVyLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9kY29va2llcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFyaXNjL2Rpbm8uYyBiL2RyaXZlcnMvcGFyaXNjL2Rpbm8uYwppbmRleCA1YWI3NTMzLi4yMTZkMWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcmlzYy9kaW5vLmMKKysrIGIvZHJpdmVycy9wYXJpc2MvZGluby5jCkBAIC04Myw3ICs4Myw4IEBACiAqKiBidXMgbnVtYmVyIGZvciBlYWNoIGRpbm8uCiAqLwogCi0jZGVmaW5lIGlzX2NhcmRfZGlubyhpZCkgKChpZCktPmh3X3R5cGUgPT0gSFBIV19BX0RNQSkKKyNkZWZpbmUgaXNfY2FyZF9kaW5vKGlkKQkoKGlkKS0+aHdfdHlwZSA9PSBIUEhXX0FfRE1BKQorI2RlZmluZSBpc19jdWpvKGlkKQkJKChpZCktPmh2ZXJzaW9uID09IDB4NjgyKQogCiAjZGVmaW5lIERJTk9fSUFSMAkJMHgwMDQKICNkZWZpbmUgRElOT19JT0RDX0FERFIJCTB4MDA4CkBAIC0xMjQsNiArMTI1LDcgQEAKIAogI2RlZmluZSBESU5PX0lSUVMgMTEJCS8qIGJpdHMgMC0xMCBhcmUgYXJjaGl0ZWN0ZWQgKi8KICNkZWZpbmUgRElOT19JUlJfTUFTSwkweDVmZgkvKiBvbmx5IDEwIGJpdHMgYXJlIGltcGxlbWVudGVkICovCisjZGVmaW5lIERJTk9fTE9DQUxfSVJRUyAoRElOT19JUlFTKzEpCiAKICNkZWZpbmUgRElOT19NQVNLX0lSUSh4KQkoMTw8KHgpKQogCkBAIC0xNDYsNyArMTQ4LDcgQEAKIAl1bnNpZ25lZCBsb25nCQl0eG5fYWRkcjsgLyogRUlSIGFkZHIgdG8gZ2VuZXJhdGUgaW50ZXJydXB0ICovIAogCXUzMgkJCXR4bl9kYXRhOyAvKiBFSVIgZGF0YSBhc3NpZ24gdG8gZWFjaCBkaW5vICovIAogCXUzMiAJCQlpbXI7CSAgLyogSVJRJ3Mgd2hpY2ggYXJlIGVuYWJsZWQgKi8gCi0JaW50CQkJZ2xvYmFsX2lycVsxMl07IC8qIG1hcCBJTVIgYml0IHRvIGdsb2JhbCBpcnEgKi8KKwlpbnQJCQlnbG9iYWxfaXJxW0RJTk9fTE9DQUxfSVJRU107IC8qIG1hcCBJTVIgYml0IHRvIGdsb2JhbCBpcnEgKi8KICNpZmRlZiBESU5PX0RFQlVHCiAJdW5zaWduZWQgaW50CQlkaW5vX2lycjA7IC8qIHNhdmUgbW9zdCByZWNlbnQgSVJRIGxpbmUgc3RhdCAqLwogI2VuZGlmCkBAIC0yOTcsNyArMjk5LDcgQEAKIHN0YXRpYyB2b2lkIGRpbm9fZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgZGlub19kZXZpY2UgKmRpbm9fZGV2ID0gaXJxX2Rlc2NbaXJxXS5oYW5kbGVyX2RhdGE7Ci0JaW50IGxvY2FsX2lycSA9IGdzY19maW5kX2xvY2FsX2lycShpcnEsIGRpbm9fZGV2LT5nbG9iYWxfaXJxLCBpcnEpOworCWludCBsb2NhbF9pcnEgPSBnc2NfZmluZF9sb2NhbF9pcnEoaXJxLCBkaW5vX2Rldi0+Z2xvYmFsX2lycSwgRElOT19MT0NBTF9JUlFTKTsKIAogCURCRyhLRVJOX1dBUk5JTkcgIiVzKDB4JXAsICVkKVxuIiwgX19GVU5DVElPTl9fLCBkaW5vX2RldiwgaXJxKTsKIApAQCAtMzA5LDcgKzMxMSw3IEBACiBzdGF0aWMgdm9pZCBkaW5vX2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgZGlub19kZXZpY2UgKmRpbm9fZGV2ID0gaXJxX2Rlc2NbaXJxXS5oYW5kbGVyX2RhdGE7Ci0JaW50IGxvY2FsX2lycSA9IGdzY19maW5kX2xvY2FsX2lycShpcnEsIGRpbm9fZGV2LT5nbG9iYWxfaXJxLCBpcnEpOworCWludCBsb2NhbF9pcnEgPSBnc2NfZmluZF9sb2NhbF9pcnEoaXJxLCBkaW5vX2Rldi0+Z2xvYmFsX2lycSwgRElOT19MT0NBTF9JUlFTKTsKIAl1MzIgdG1wOwogCiAJREJHKEtFUk5fV0FSTklORyAiJXMoMHglcCwgJWQpXG4iLCBfX0ZVTkNUSU9OX18sIGRpbm9fZGV2LCBpcnEpOwpAQCAtNDM1LDYgKzQzNywyMSBAQAogCWRpbm9fYXNzaWduX2lycShkaW5vLCBpcnEsICZkZXYtPmlycSk7CiB9CiAKKworLyoKKyAqIENpcnJ1cyA2ODMyIENhcmRidXMgcmVwb3J0cyB3cm9uZyBpcnEgb24gUkRJIFRhZHBvbGUgUEFSSVNDIExhcHRvcCAoZGVsbGVyQGdteC5kZSkKKyAqICh0aGUgaXJxcyBhcmUgb2ZmLWJ5LW9uZSwgbm90IHN1cmUgeWV0IGlmIHRoaXMgaXMgYSBjaXJydXMsIGRpbm8taGFyZHdhcmUgb3IgZGluby1kcml2ZXIgcHJvYmxlbS4uLikKKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHF1aXJrX2NpcnJ1c19jYXJkYnVzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTggbmV3X2lycSA9IGRldi0+aXJxIC0gMTsKKwlwcmludGsoS0VSTl9JTkZPICJQQ0k6IENpcnJ1cyBDYXJkYnVzIElSUSBmaXh1cCBmb3IgJXMsIGZyb20gJWQgdG8gJWRcbiIsCisJCQlwY2lfbmFtZShkZXYpLCBkZXYtPmlycSwgbmV3X2lycSk7CisJZGV2LT5pcnEgPSBuZXdfaXJxOworfQorREVDTEFSRV9QQ0lfRklYVVBfRU5BQkxFKFBDSV9WRU5ET1JfSURfQ0lSUlVTLCBQQ0lfREVWSUNFX0lEX0NJUlJVU182ODMyLCBxdWlya19jaXJydXNfY2FyZGJ1cyApOworCisKIHN0YXRpYyB2b2lkIF9faW5pdAogZGlub19iaW9zX2luaXQodm9pZCkKIHsKQEAgLTY2Niw3ICs2ODMsNiBAQAogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGV2aWNlICVzIGhhcyB1bmFzc2lnbmVkIElSUVxuIiwgcGNpX25hbWUoZGV2KSk7CiAjZW5kaWYKIAkJfSBlbHNlIHsKLQogCQkJLyogQWRqdXN0IElOVF9MSU5FIGZvciB0aGF0IGJ1c3NlcyByZWdpb24gKi8KIAkJCWRpbm9fYXNzaWduX2lycShkaW5vX2RldiwgZGV2LT5pcnEsICZkZXYtPmlycSk7CiAJCX0KQEAgLTg3Miw3ICs4ODgsNyBAQAogCiAJLyogYWxsb2NhdGUgSS9PIFBvcnQgcmVzb3VyY2UgcmVnaW9uICovCiAJcmVzID0gJmRpbm9fZGV2LT5oYmEuaW9fc3BhY2U7Ci0JaWYgKGRldi0+aWQuaHZlcnNpb24gPT0gMHg2ODAgfHwgaXNfY2FyZF9kaW5vKCZkZXYtPmlkKSkgeworCWlmICghaXNfY3VqbygmZGV2LT5pZCkpIHsKIAkJcmVzLT5uYW1lID0gIkRpbm8gSS9PIFBvcnQiOwogCX0gZWxzZSB7CiAJCXJlcy0+bmFtZSA9ICJDdWpvIEkvTyBQb3J0IjsKQEAgLTkyNyw3ICs5NDMsNyBAQAogCWlmIChpc19jYXJkX2Rpbm8oJmRldi0+aWQpKSB7CiAJCXZlcnNpb24gPSAiMy54IChjYXJkIG1vZGUpIjsKIAl9IGVsc2UgewotCQlpZihkZXYtPmlkLmh2ZXJzaW9uID09IDB4NjgwKSB7CisJCWlmICghaXNfY3VqbygmZGV2LT5pZCkpIHsKIAkJCWlmIChkZXYtPmlkLmh2ZXJzaW9uX3JldiA8IDQpIHsKIAkJCQl2ZXJzaW9uID0gZGlub192ZXJzW2Rldi0+aWQuaHZlcnNpb25fcmV2XTsKIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFyaXNjL2Vpc2EuYyBiL2RyaXZlcnMvcGFyaXNjL2Vpc2EuYwppbmRleCA2MzYyYmY5Li4zZDk0ZDg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcmlzYy9laXNhLmMKKysrIGIvZHJpdmVycy9wYXJpc2MvZWlzYS5jCkBAIC01Nyw3ICs1Nyw3IEBACiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZWlzYV9pcnFfbG9jayk7CiAKLXZvaWQgX19pb21lbSAqZWlzYV9lZXByb21fYWRkcjsKK3ZvaWQgX19pb21lbSAqZWlzYV9lZXByb21fYWRkciBfX3JlYWRfbW9zdGx5OwogCiAvKiBXZSBjYW4gb25seSBoYXZlIG9uZSBFSVNBIGFkYXB0ZXIgaW4gdGhlIHN5c3RlbSBiZWNhdXNlIG5laXRoZXIKICAqIGltcGxlbWVudGF0aW9uIGNhbiBiZSBmbGV4ZWQuCkBAIC0xNDEsNyArMTQxLDcgQEAKICAqIGluIHRoZSBmdXJ1cmUuIAogICovCiAvKiBpcnEgMTMsOCwyLDEsMCBtdXN0IGJlIGVkZ2UgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZWlzYV9pcnFfbGV2ZWw7IC8qIGRlZmF1bHQgdG8gZWRnZSB0cmlnZ2VyZWQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZWlzYV9pcnFfbGV2ZWwgX19yZWFkX21vc3RseTsgLyogZGVmYXVsdCB0byBlZGdlIHRyaWdnZXJlZCAqLwogCiAKIC8qIGNhbGxlZCBieSBmcmVlIGlycSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJpc2MvZWlzYV9lZXByb20uYyBiL2RyaXZlcnMvcGFyaXNjL2Vpc2FfZWVwcm9tLmMKaW5kZXggM2ExYjQ4Mi4uZTEzYWFmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJpc2MvZWlzYV9lZXByb20uYworKysgYi9kcml2ZXJzL3BhcmlzYy9laXNhX2VlcHJvbS5jCkBAIC00OCw3ICs0OCw3IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGVpc2FfZWVwcm9tX3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLAotCQkJICAgICAgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyApCisJCQkgICAgICBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyApCiB7CiAJdW5zaWduZWQgY2hhciAqdG1wOwogCXNzaXplX3QgcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJpc2MvbGFzaS5jIGIvZHJpdmVycy9wYXJpc2MvbGFzaS5jCmluZGV4IGE4YzIwMzkuLjJiM2JhMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFyaXNjL2xhc2kuYworKysgYi9kcml2ZXJzL3BhcmlzYy9sYXNpLmMKQEAgLTE1MCw3ICsxNTAsNyBAQAogICogCiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzaV9wb3dlcl9vZmZfaHBhOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzaV9wb3dlcl9vZmZfaHBhIF9fcmVhZF9tb3N0bHk7CiAKIHN0YXRpYyB2b2lkIGxhc2lfcG93ZXJfb2ZmKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcmlzYy9sYmFfcGNpLmMgYi9kcml2ZXJzL3BhcmlzYy9sYmFfcGNpLmMKaW5kZXggNWU0OTVkYy4uY2JhZThjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJpc2MvbGJhX3BjaS5jCisrKyBiL2RyaXZlcnMvcGFyaXNjL2xiYV9wY2kuYwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAKIC8qIG5vbi1wb3N0YWJsZSBJL08gcG9ydCBzcGFjZSwgZGVuc2VseSBwYWNrZWQgKi8KICNkZWZpbmUgTEJBX1BPUlRfQkFTRQkoUENJX0ZfRVhURU5EIHwgMHhmZWUwMDAwMFVMKQotc3RhdGljIHZvaWQgX19pb21lbSAqYXN0cm9faW9wX2Jhc2U7CitzdGF0aWMgdm9pZCBfX2lvbWVtICphc3Ryb19pb3BfYmFzZSBfX3JlYWRfbW9zdGx5OwogCiAjZGVmaW5lIEVMUk9ZX0hWRVJTCTB4NzgyCiAjZGVmaW5lIE1FUkNVUllfSFZFUlMJMHg3ODMKQEAgLTY5NSwxMiArNjk1LDcyIEBACiAJCX0KIAl9CiB9Ci0jZWxzZQotI2RlZmluZSBsYmFfY2xhaW1fZGV2X3Jlc291cmNlcyhkZXYpCi0jZW5kaWYKIAogCiAvKgorICogdHJ1bmNhdGVfcGF0X2NvbGxpc2lvbjogIERlYWwgd2l0aCBvdmVybGFwcyBvciBvdXRyaWdodCBjb2xsaXNpb25zCisgKgkJCWJldHdlZW4gUEFUIFBEQyByZXBvcnRlZCByYW5nZXMuCisgKgorICogICBCcm9rZW4gUEE4ODAwIGZpcm13YXJlIHdpbGwgcmVwb3J0IGxtbWlvIHJhbmdlIHRoYXQKKyAqICAgb3ZlcmxhcHMgd2l0aCBDUFUgSFBBLiBKdXN0IHRydW5jYXRlIHRoZSBsbW1pbyByYW5nZS4KKyAqCisgKiAgIEJFV0FSRTogY29uZmxpY3RzIHdpdGggdGhpcyBsbW1pbyByYW5nZSBtYXkgYmUgYW4KKyAqICAgZWxtbWlvIHJhbmdlIHdoaWNoIGlzIHBvaW50aW5nIGRvd24gYW5vdGhlciByb3BlLgorICoKKyAqICBGSVhNRTogb25seSBkZWFscyB3aXRoIG9uZSBjb2xsaXNpb24gcGVyIHJhbmdlLi4udGhlb3JldGljYWxseSB3ZQorICogIGNvdWxkIGhhdmUgc2V2ZXJhbC4gU3VwcG9ydGluZyBtb3JlIHRoYW4gb25lIGNvbGxpc2lvbiB3aWxsIGdldCBtZXNzeS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcKK3RydW5jYXRlX3BhdF9jb2xsaXNpb24oc3RydWN0IHJlc291cmNlICpyb290LCBzdHJ1Y3QgcmVzb3VyY2UgKm5ldykKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gbmV3LT5zdGFydDsKKwl1bnNpZ25lZCBsb25nIGVuZCA9IG5ldy0+ZW5kOworCXN0cnVjdCByZXNvdXJjZSAqdG1wID0gcm9vdC0+Y2hpbGQ7CisKKwlpZiAoZW5kIDw9IHN0YXJ0IHx8IHN0YXJ0IDwgcm9vdC0+c3RhcnQgfHwgIXRtcCkKKwkJcmV0dXJuIDA7CisKKwkvKiBmaW5kIGZpcnN0IG92ZXJsYXAgKi8KKwl3aGlsZSAodG1wICYmIHRtcC0+ZW5kIDwgc3RhcnQpCisJCXRtcCA9IHRtcC0+c2libGluZzsKKworCS8qIG5vIGVudHJpZXMgb3ZlcmxhcCAqLworCWlmICghdG1wKSAgcmV0dXJuIDA7CisKKwkvKiBmb3VuZCBvbmUgdGhhdCBzdGFydHMgYmVoaW5kIHRoZSBuZXcgb25lCisJKiogRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4KKwkqLworCWlmICh0bXAtPnN0YXJ0ID49IGVuZCkgcmV0dXJuIDA7CisKKwlpZiAodG1wLT5zdGFydCA8PSBzdGFydCkgeworCQkvKiAiZnJvbnQiIG9mIG5ldyBvbmUgb3ZlcmxhcHMgKi8KKwkJbmV3LT5zdGFydCA9IHRtcC0+ZW5kICsgMTsKKworCQlpZiAodG1wLT5lbmQgPj0gZW5kKSB7CisJCQkvKiBBQUNDS0shIHRvdGFsbHkgb3ZlcmxhcHMhIGRyb3AgdGhpcyByYW5nZS4gKi8KKwkJCXJldHVybiAxOworCQl9CisJfSAKKworCWlmICh0bXAtPmVuZCA8IGVuZCApIHsKKwkJLyogImVuZCIgb2YgbmV3IG9uZSBvdmVybGFwcyAqLworCQluZXctPmVuZCA9IHRtcC0+c3RhcnQgLSAxOworCX0KKworCXByaW50ayhLRVJOX1dBUk5JTkcgIkxCQTogVHJ1bmNhdGluZyBsbW1pb19zcGFjZSBbJWx4LyVseF0gIgorCQkJCQkidG8gWyVseCwlbHhdXG4iLAorCQkJc3RhcnQsIGVuZCwKKwkJCW5ldy0+c3RhcnQsIG5ldy0+ZW5kICk7CisKKwlyZXR1cm4gMDsJLyogdHJ1bmNhdGlvbiBzdWNjZXNzZnVsICovCit9CisKKyNlbHNlCisjZGVmaW5lIGxiYV9jbGFpbV9kZXZfcmVzb3VyY2VzKGRldikgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSB0cnVuY2F0ZV9wYXRfY29sbGlzaW9uKHIsbikgICgwKQorI2VuZGlmCisKKy8qCiAqKiBUaGUgYWxnb3JpdGhtIGlzIGdlbmVyaWMgY29kZS4KICoqIEJ1dCBpdCBuZWVkcyB0byBhY2Nlc3MgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzIHRvIGdldCB0aGUgSVJRIGJhc2UuCiAqKiBDb3VsZCBtYWtlIHRoaXMgYSAicGNpX2ZpeHVwX2lycShidXMsIHJlZ2lvbikiIGJ1dCBub3Qgc3VyZQpAQCAtNzQ3LDYgKzgwNyw5IEBACiAJCQlsYmFfZHVtcF9yZXMoJmlvcG9ydF9yZXNvdXJjZSwgMik7CiAJCQlCVUcoKTsKIAkJfQorCQkvKiBhZHZlcnRpemUgSG9zdCBicmlkZ2UgcmVzb3VyY2VzIHRvIFBDSSBidXMgKi8KKwkJYnVzLT5yZXNvdXJjZVswXSA9ICYobGRldi0+aGJhLmlvX3NwYWNlKTsKKwkJaSA9IDE7CiAKIAkJaWYgKGxkZXYtPmhiYS5lbG1taW9fc3BhY2Uuc3RhcnQpIHsKIAkJCWVyciA9IHJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLApAQCAtNzYwLDIzICs4MjMsMzUgQEAKIAogCQkJCS8qIGxiYV9kdW1wX3JlcygmaW9tZW1fcmVzb3VyY2UsIDIpOyAqLwogCQkJCS8qIEJVRygpOyAqLwotCQkJfQorCQkJfSBlbHNlCisJCQkJYnVzLT5yZXNvdXJjZVtpKytdID0gJihsZGV2LT5oYmEuZWxtbWlvX3NwYWNlKTsKIAkJfQogCi0JCWVyciA9IHJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmKGxkZXYtPmhiYS5sbW1pb19zcGFjZSkpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJLyogICBGSVhNRSAgb3ZlcmxhcHMgd2l0aCBlbG1taW8gd2lsbCBmYWlsIGhlcmUuCi0JCQkgKiAgIE5lZWQgdG8gcHJ1bmUgKG9yIGRpc2FibGUpIHRoZSBkaXN0cmlidXRlZCByYW5nZS4KLQkJCSAqCi0JCQkgKiAgIEJFV0FSRTogY29uZmxpY3RzIHdpdGggdGhpcyBsbW1pbyByYW5nZSBtYXkgYmUKLQkJCSAqICAgZWxtbWlvIHJhbmdlIHdoaWNoIGlzIHBvaW50aW5nIGRvd24gYW5vdGhlciByb3BlLgotCQkJICovCiAKLQkJCXByaW50aygiRkFJTEVEOiBsYmFfZml4dXBfYnVzKCkgcmVxdWVzdCBmb3IgIgorCQkvKiAgIE92ZXJsYXBzIHdpdGggZWxtbWlvIGNhbiAoYW5kIHNob3VsZCkgZmFpbCBoZXJlLgorCQkgKiAgIFdlIHdpbGwgcHJ1bmUgKG9yIGlnbm9yZSkgdGhlIGRpc3RyaWJ1dGVkIHJhbmdlLgorCQkgKgorCQkgKiAgIEZJWE1FOiBTQkEgY29kZSBzaG91bGQgcmVnaXN0ZXIgYWxsIGVsbW1pbyByYW5nZXMgZmlyc3QuCisJCSAqICAgICAgdGhhdCB3b3VsZCB0YWtlIGNhcmUgb2YgZWxtbWlvIHJhbmdlcyByb3V0ZWQKKwkJICoJdG8gYSBkaWZmZXJlbnQgcm9wZSAoYWxyZWFkeSBkaXNjb3ZlcmVkKSBmcm9tCisJCSAqCWdldHRpbmcgcmVnaXN0ZXJlZCAqYWZ0ZXIqIExCQSBjb2RlIGhhcyBhbHJlYWR5CisJCSAqCXJlZ2lzdGVyZWQgaXQncyBkaXN0cmlidXRlZCBsbW1pbyByYW5nZS4KKwkJICovCisJCWlmICh0cnVuY2F0ZV9wYXRfY29sbGlzaW9uKCZpb21lbV9yZXNvdXJjZSwKKwkJCQkgICAgICAgCSYobGRldi0+aGJhLmxtbWlvX3NwYWNlKSkpIHsKKworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTEJBOiBsbW1pb19zcGFjZSBbJWx4LyVseF0gZHVwbGljYXRlIVxuIiwKKwkJCQkJbGRldi0+aGJhLmxtbWlvX3NwYWNlLnN0YXJ0LAorCQkJCQlsZGV2LT5oYmEubG1taW9fc3BhY2UuZW5kKTsKKwkJfSBlbHNlIHsKKwkJCWVyciA9IHJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmKGxkZXYtPmhiYS5sbW1pb19zcGFjZSkpOworCQkJaWYgKGVyciA8IDApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkZBSUxFRDogbGJhX2ZpeHVwX2J1cygpIHJlcXVlc3QgZm9yICIKIAkJCQkJImxtbWlvX3NwYWNlIFslbHgvJWx4XVxuIiwKIAkJCQkJbGRldi0+aGJhLmxtbWlvX3NwYWNlLnN0YXJ0LAogCQkJCQlsZGV2LT5oYmEubG1taW9fc3BhY2UuZW5kKTsKLQkJCS8qIGxiYV9kdW1wX3JlcygmaW9tZW1fcmVzb3VyY2UsIDIpOyAqLworCQkJfSBlbHNlCisJCQkJYnVzLT5yZXNvdXJjZVtpKytdID0gJihsZGV2LT5oYmEubG1taW9fc3BhY2UpOwogCQl9CiAKICNpZmRlZiBDT05GSUdfNjRCSVQKQEAgLTc5MSwxOCArODY2LDEwIEBACiAJCQkJbGJhX2R1bXBfcmVzKCZpb21lbV9yZXNvdXJjZSwgMik7CiAJCQkJQlVHKCk7CiAJCQl9CisJCQlidXMtPnJlc291cmNlW2krK10gPSAmKGxkZXYtPmhiYS5nbW1pb19zcGFjZSk7CiAJCX0KICNlbmRpZgogCi0JCS8qIGFkdmVydGl6ZSBIb3N0IGJyaWRnZSByZXNvdXJjZXMgdG8gUENJIGJ1cyAqLwotCQlidXMtPnJlc291cmNlWzBdID0gJihsZGV2LT5oYmEuaW9fc3BhY2UpOwotCQlidXMtPnJlc291cmNlWzFdID0gJihsZGV2LT5oYmEubG1taW9fc3BhY2UpOwotCQlpPTI7Ci0JCWlmIChsZGV2LT5oYmEuZWxtbWlvX3NwYWNlLnN0YXJ0KQotCQkJYnVzLT5yZXNvdXJjZVtpKytdID0gJihsZGV2LT5oYmEuZWxtbWlvX3NwYWNlKTsKLQkJaWYgKGxkZXYtPmhiYS5nbW1pb19zcGFjZS5zdGFydCkKLQkJCWJ1cy0+cmVzb3VyY2VbaSsrXSA9ICYobGRldi0+aGJhLmdtbWlvX3NwYWNlKTsKLQkJCQogCX0KIAogCWxpc3RfZm9yX2VhY2gobG4sICZidXMtPmRldmljZXMpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFyaXNjL2xlZC5jIGIvZHJpdmVycy9wYXJpc2MvbGVkLmMKaW5kZXggOTViZDA3Yi4uMzYyN2EyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJpc2MvbGVkLmMKKysrIGIvZHJpdmVycy9wYXJpc2MvbGVkLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogICAgICAoYykgQ29weXJpZ2h0IDIwMDAgUmVkIEhhdCBTb2Z0d2FyZQogICogICAgICAoYykgQ29weXJpZ2h0IDIwMDAgSGVsZ2UgRGVsbGVyIDxoZGVsbGVyQHJlZGhhdC5jb20+Ci0gKiAgICAgIChjKSBDb3B5cmlnaHQgMjAwMS0yMDA0IEhlbGdlIERlbGxlciA8ZGVsbGVyQGdteC5kZT4KKyAqICAgICAgKGMpIENvcHlyaWdodCAyMDAxLTIwMDUgSGVsZ2UgRGVsbGVyIDxkZWxsZXJAZ214LmRlPgogICogICAgICAoYykgQ29weXJpZ2h0IDIwMDEgUmFuZG9scGggQ2h1bmcgPHRhdXNxQGRlYmlhbi5vcmc+CiAgKgogICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KQEAgLTU2LDEzICs1NywxMyBAQAogICAgcmVsYXRpdmVseSBsYXJnZSBhbW91bnQgb2YgQ1BVIHRpbWUsIHNvbWUgb2YgdGhlIGNhbGN1bGF0aW9ucyBjYW4gYmUgCiAgICB0dXJuZWQgb2ZmIHdpdGggdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgKGNvbnRyb2xsZWQgdmlhIHByb2NmcykgKi8KIAotc3RhdGljIGludCBsZWRfdHlwZSA9IC0xOworc3RhdGljIGludCBsZWRfdHlwZSBfX3JlYWRfbW9zdGx5ID0gLTE7CiBzdGF0aWMgdW5zaWduZWQgY2hhciBsYXN0bGVkczsJLyogTEVEIHN0YXRlIGZyb20gbW9zdCByZWNlbnQgdXBkYXRlICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGxlZF9oZWFydGJlYXQgPSAxOwotc3RhdGljIHVuc2lnbmVkIGludCBsZWRfZGlza2lvID0gMTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbGVkX2xhbnJ4dHggPSAxOwotc3RhdGljIGNoYXIgbGNkX3RleHRbMzJdOwotc3RhdGljIGNoYXIgbGNkX3RleHRfZGVmYXVsdFszMl07CitzdGF0aWMgdW5zaWduZWQgaW50IGxlZF9oZWFydGJlYXQgX19yZWFkX21vc3RseSA9IDE7CitzdGF0aWMgdW5zaWduZWQgaW50IGxlZF9kaXNraW8gICAgX19yZWFkX21vc3RseSA9IDE7CitzdGF0aWMgdW5zaWduZWQgaW50IGxlZF9sYW5yeHR4ICAgX19yZWFkX21vc3RseSA9IDE7CitzdGF0aWMgY2hhciBsY2RfdGV4dFszMl0gICAgICAgICAgX19yZWFkX21vc3RseTsKK3N0YXRpYyBjaGFyIGxjZF90ZXh0X2RlZmF1bHRbMzJdICBfX3JlYWRfbW9zdGx5OwogCiAKIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqbGVkX3dxOwpAQCAtMTA4LDcgKzEwOSw3IEBACiAvKiBsY2RfaW5mbyBpcyBwcmUtaW5pdGlhbGl6ZWQgdG8gdGhlIHZhbHVlcyBuZWVkZWQgdG8gcHJvZ3JhbSBLaXR0eUhhd2sgTENEJ3MgCiAgKiBIUCBzZWVtcyB0byBoYXZlIHVzZWQgU2hhcnAvSGl0YWNoaSBIRDQ0NzgwIExDRHMgbW9zdCBvZiB0aGUgdGltZS4gKi8KIHN0YXRpYyBzdHJ1Y3QgcGRjX2NoYXNzaXNfbGNkX2luZm9fcmV0X2Jsb2NrCi1sY2RfaW5mbyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSkgPQorbGNkX2luZm8gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpIF9fcmVhZF9tb3N0bHkgPQogewogCS5tb2RlbCA9CQlESVNQTEFZX01PREVMX0xDRCwKIAkubGNkX3dpZHRoID0JCTE2LApAQCAtMTQ0LDcgKzE0NSw3IEBACiBkZXZpY2VfaW5pdGNhbGwoc3RhcnRfdGFzayk7CiAKIC8qIHB0ciB0byBMQ0QvTEVELXNwZWNpZmljIGZ1bmN0aW9uICovCi1zdGF0aWMgdm9pZCAoKmxlZF9mdW5jX3B0cikgKHVuc2lnbmVkIGNoYXIpOworc3RhdGljIHZvaWQgKCpsZWRfZnVuY19wdHIpICh1bnNpZ25lZCBjaGFyKSBfX3JlYWRfbW9zdGx5OwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIHN0YXRpYyBpbnQgbGVkX3Byb2NfcmVhZChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCAKQEAgLTM0Nyw3ICszNDgsNyBAQAogICAgKiogCiAgICAqKiBsZWRfZ2V0X25ldF9hY3Rpdml0eSgpCiAgICAqKiAKLSAgICoqIGNhbGN1bGF0ZSBpZiB0aGVyZSB3YXMgVFgtIG9yIFJYLXRyb3VnaHB1dCBvbiB0aGUgbmV0d29yayBpbnRlcmZhY2VzCisgICAqKiBjYWxjdWxhdGUgaWYgdGhlcmUgd2FzIFRYLSBvciBSWC10aHJvdWdocHV0IG9uIHRoZSBuZXR3b3JrIGludGVyZmFjZXMKICAgICoqIChhbmFsb2cgdG8gZGV2X2dldF9pbmZvKCkgZnJvbSBuZXQvY29yZS9kZXYuYykKICAgICoqICAgCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFyaXNjL3BkY19zdGFibGUuYyBiL2RyaXZlcnMvcGFyaXNjL3BkY19zdGFibGUuYwppbmRleCAyNzNhNzQxLi40MmEzYzU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcmlzYy9wZGNfc3RhYmxlLmMKKysrIGIvZHJpdmVycy9wYXJpc2MvcGRjX3N0YWJsZS5jCkBAIC00Miw5ICs0Miw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JCS8qIGZvciBjYXBhYmxlKCkgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KQEAgLTU2LDcgKzU2LDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogCi0jZGVmaW5lIFBEQ1NfVkVSU0lPTgkiMC4wOSIKKyNkZWZpbmUgUERDU19WRVJTSU9OCSIwLjEwIgogCiAjZGVmaW5lIFBEQ1NfQUREUl9QUFJJCTB4MDAKICNkZWZpbmUgUERDU19BRERSX09TSUQJMHg0MApAQCAtNzAsNyArNzAsNyBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1ZFUlNJT04oUERDU19WRVJTSU9OKTsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgcGRjc19zaXplID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBkY3Nfc2l6ZSBfX3JlYWRfbW9zdGx5OwogCiAvKiBUaGlzIHN0cnVjdCBkZWZpbmVzIHdoYXQgd2UgbmVlZCB0byBkZWFsIHdpdGggYSBwYXJpc2MgcGRjIHBhdGggZW50cnkgKi8KIHN0cnVjdCBwZGNzcGF0aF9lbnRyeSB7CkBAIC0xOTQsNyArMTk0LDggQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCQkKLQllbnRyeS0+cmVhZHkgPSAxOworCS8qIGtvYmplY3QgaXMgYWxyZWFkeSByZWdpc3RlcmVkICovCisJZW50cnktPnJlYWR5ID0gMjsKIAkKIAlEUFJJTlRLKCIlczogZGV2aWNlOiAweCVwXG4iLCBfX2Z1bmNfXywgZW50cnktPmRldik7CiAJCkBAIC02NTMsMTUgKzY1NCwyMSBAQAogewogCXVuc2lnbmVkIHNob3J0IGk7CiAJc3RydWN0IHBkY3NwYXRoX2VudHJ5ICplbnRyeTsKKwlpbnQgZXJyOwogCQogCWZvciAoaSA9IDA7IChlbnRyeSA9IHBkY3NwYXRoX2VudHJpZXNbaV0pOyBpKyspIHsKIAkJaWYgKHBkY3NwYXRoX2ZldGNoKGVudHJ5KSA8IDApCiAJCQljb250aW51ZTsKIAotCQlrb2JqZWN0X3NldF9uYW1lKCZlbnRyeS0+a29iaiwgIiVzIiwgZW50cnktPm5hbWUpOworCQlpZiAoKGVyciA9IGtvYmplY3Rfc2V0X25hbWUoJmVudHJ5LT5rb2JqLCAiJXMiLCBlbnRyeS0+bmFtZSkpKQorCQkJcmV0dXJuIGVycjsKIAkJa29ial9zZXRfa3NldF9zKGVudHJ5LCBwYXRoc19zdWJzeXMpOwotCQlrb2JqZWN0X3JlZ2lzdGVyKCZlbnRyeS0+a29iaik7Ci0KKwkJaWYgKChlcnIgPSBrb2JqZWN0X3JlZ2lzdGVyKCZlbnRyeS0+a29iaikpKQorCQkJcmV0dXJuIGVycjsKKwkJCisJCS8qIGtvYmplY3QgaXMgbm93IHJlZ2lzdGVyZWQgKi8KKwkJZW50cnktPnJlYWR5ID0gMjsKKwkJCiAJCWlmICghZW50cnktPmRldikKIAkJCWNvbnRpbnVlOwogCkBAIC02NzUsMTQgKzY4MiwxNCBAQAogLyoqCiAgKiBwZGNzX3VucmVnaXN0ZXJfcGF0aGVudHJpZXMgLSBSb3V0aW5lIGNhbGxlZCB3aGVuIHVucmVnaXN0ZXJpbmcgdGhlIG1vZHVsZS4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fZXhpdAorc3RhdGljIGlubGluZSB2b2lkCiBwZGNzX3VucmVnaXN0ZXJfcGF0aGVudHJpZXModm9pZCkKIHsKIAl1bnNpZ25lZCBzaG9ydCBpOwogCXN0cnVjdCBwZGNzcGF0aF9lbnRyeSAqZW50cnk7CiAJCiAJZm9yIChpID0gMDsgKGVudHJ5ID0gcGRjc3BhdGhfZW50cmllc1tpXSk7IGkrKykKLQkJaWYgKGVudHJ5LT5yZWFkeSkKKwkJaWYgKGVudHJ5LT5yZWFkeSA+PSAyKQogCQkJa29iamVjdF91bnJlZ2lzdGVyKCZlbnRyeS0+a29iaik7CQogfQogCkBAIC03MDQsNyArNzExLDcgQEAKIAogCS8qIEZvciBub3cgd2UnbGwgcmVnaXN0ZXIgdGhlIHBkYyBzdWJzeXMgd2l0aGluIHRoaXMgZHJpdmVyICovCiAJaWYgKChyYyA9IGZpcm13YXJlX3JlZ2lzdGVyKCZwZGNfc3Vic3lzKSkpCi0JCXJldHVybiByYzsKKwkJZ290byBmYWlsX2Zpcm1yZWc7CiAKIAkvKiBEb24ndCBmb3JnZXQgdGhlIGluZm8gZW50cnkgKi8KIAlmb3IgKGkgPSAwOyAoYXR0ciA9IHBkY3Nfc3Vic3lzX2F0dHJzW2ldKSAmJiAhZXJyb3I7IGkrKykKQEAgLTcxMywxMiArNzIwLDI1IEBACiAJCiAJLyogcmVnaXN0ZXIgdGhlIHBhdGhzIHN1YnN5cyBhcyBhIHN1YnN5c3RlbSBvZiBwZGMgc3Vic3lzICovCiAJa3NldF9zZXRfa3NldF9zKCZwYXRoc19zdWJzeXMsIHBkY19zdWJzeXMpOwotCXN1YnN5c3RlbV9yZWdpc3RlcigmcGF0aHNfc3Vic3lzKTsKKwlpZiAoKHJjPSBzdWJzeXN0ZW1fcmVnaXN0ZXIoJnBhdGhzX3N1YnN5cykpKQorCQlnb3RvIGZhaWxfc3Vic3lzcmVnOwogCiAJLyogbm93IHdlIGNyZWF0ZSBhbGwgImZpbGVzIiBmb3IgdGhlIHBhdGhzIHN1YnN5cyAqLwotCXBkY3NfcmVnaXN0ZXJfcGF0aGVudHJpZXMoKTsKKwlpZiAoKHJjID0gcGRjc19yZWdpc3Rlcl9wYXRoZW50cmllcygpKSkKKwkJZ290byBmYWlsX3BkY3NyZWc7CisKKwlyZXR1cm4gcmM7CiAJCi0JcmV0dXJuIDA7CitmYWlsX3BkY3NyZWc6CisJcGRjc191bnJlZ2lzdGVyX3BhdGhlbnRyaWVzKCk7CisJc3Vic3lzdGVtX3VucmVnaXN0ZXIoJnBhdGhzX3N1YnN5cyk7CisJCitmYWlsX3N1YnN5c3JlZzoKKwlmaXJtd2FyZV91bnJlZ2lzdGVyKCZwZGNfc3Vic3lzKTsKKwkKK2ZhaWxfZmlybXJlZzoKKwlwcmludGsoS0VSTl9JTkZPICJQREMgU3RhYmxlIFN0b3JhZ2UgYmFpbGluZyBvdXRcbiIpOworCXJldHVybiByYzsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcmlzYy9wb3dlci5jIGIvZHJpdmVycy9wYXJpc2MvcG93ZXIuYwppbmRleCBmZjc1ZTkyLi41NGIyYjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcmlzYy9wb3dlci5jCisrKyBiL2RyaXZlcnMvcGFyaXNjL3Bvd2VyLmMKQEAgLTIsNyArMiw3IEBACiAgKiBsaW51eC9hcmNoL3BhcmlzYy9rZXJuZWwvcG93ZXIuYwogICogSFAgUEFSSVNDIHNvZnQgcG93ZXIgc3dpdGNoIHN1cHBvcnQgZHJpdmVyCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIgSGVsZ2UgRGVsbGVyIDxkZWxsZXJAZ214LmRlPgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgSGVsZ2UgRGVsbGVyIDxkZWxsZXJAZ214LmRlPgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKgpAQCAtMTAyLDcgKzEwMiw3IEBACiAKIHN0YXRpYyB2b2lkIHBvd2Vyb2ZmKHZvaWQpCiB7Ci0Jc3RhdGljIGludCBwb3dlcmluZ19vZmY7CisJc3RhdGljIGludCBwb3dlcmluZ19vZmYgX19yZWFkX21vc3RseTsKIAogCWlmIChwb3dlcmluZ19vZmYpCiAJCXJldHVybjsKQEAgLTExMyw3ICsxMTMsNyBAQAogCiAKIC8qIGxvY2FsIHRpbWUtY291bnRlciBmb3Igc2h1dGRvd24gKi8KLXN0YXRpYyBpbnQgc2h1dGRvd25fdGltZXI7CitzdGF0aWMgaW50IHNodXRkb3duX3RpbWVyIF9fcmVhZF9tb3N0bHk7CiAKIC8qIGNoZWNrLCBnaXZlIGZlZWRiYWNrIGFuZCBzdGFydCBzaHV0ZG93biBhZnRlciBvbmUgc2Vjb25kICovCiBzdGF0aWMgdm9pZCBwcm9jZXNzX3NodXRkb3duKHZvaWQpCkBAIC0xMzksNyArMTM5LDcgQEAKIERFQ0xBUkVfVEFTS0xFVF9ESVNBQkxFRChwb3dlcl90YXNrbGV0LCBOVUxMLCAwKTsKIAogLyogc29mdCBwb3dlciBzd2l0Y2ggZW5hYmxlZC9kaXNhYmxlZCAqLwotaW50IHB3cnN3X2VuYWJsZWQgPSAxOworaW50IHB3cnN3X2VuYWJsZWQgX19yZWFkX21vc3RseSA9IDE7CiAKIC8qCiAgKiBPbiBnZWNrbyBzdHlsZSBtYWNoaW5lcyAoZS5nLiA3MTIveHggYW5kIDcxNS94eCkgCkBAIC0xNDksNyArMTQ5LDcgQEAKICAqLwogc3RhdGljIHZvaWQgZ2Vja29fdGFza2xldF9mdW5jKHVuc2lnbmVkIGxvbmcgdW51c2VkKQogewotCWlmICghcHdyc3dfZW5hYmxlZCkKKwlpZiAodW5saWtlbHkoIXB3cnN3X2VuYWJsZWQpKQogCQlyZXR1cm47CiAKIAlpZiAoX19nZXRESUFHKDI1KSAmIDB4ODAwMDAwMDApIHsKQEAgLTE3Myw3ICsxNzMsNyBAQAogewogICAgICAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfc3RhdHVzOwogCQotCWlmICghcHdyc3dfZW5hYmxlZCkKKwlpZiAodW5saWtlbHkoIXB3cnN3X2VuYWJsZWQpKQogCQlyZXR1cm47CiAKIAljdXJyZW50X3N0YXR1cyA9IGdzY19yZWFkbChzb2Z0X3Bvd2VyX3JlZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcnBvcnQvS2NvbmZpZyBiL2RyaXZlcnMvcGFycG9ydC9LY29uZmlnCmluZGV4IGI4MjQxNTYuLmY2MDVkZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGFycG9ydC9LY29uZmlnCkBAIC0zNCw3ICszNCw3IEBACiAKIGNvbmZpZyBQQVJQT1JUX1BDCiAJdHJpc3RhdGUgIlBDLXN0eWxlIGhhcmR3YXJlIgotCWRlcGVuZHMgb24gUEFSUE9SVCAmJiAoIVNQQVJDNjQgfHwgUENJKSAmJiAhU1BBUkMzMiAmJiAhTTMyUgorCWRlcGVuZHMgb24gUEFSUE9SVCAmJiAoIVNQQVJDNjQgfHwgUENJKSAmJiAhU1BBUkMzMiAmJiAhTTMyUiAmJiAhRlJWCiAJLS0taGVscC0tLQogCSAgWW91IHNob3VsZCBzYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgUEMtc3R5bGUgcGFyYWxsZWwgcG9ydC4gQWxsCiAJICBJQk0gUEMgY29tcGF0aWJsZSBjb21wdXRlcnMgYW5kIHNvbWUgQWxwaGFzIGhhdmUgUEMtc3R5bGUKQEAgLTEyMSw2ICsxMjEsNyBAQAogCXRyaXN0YXRlCiAJZGVmYXVsdCBHU0MKIAlkZXBlbmRzIG9uIFBBUlBPUlQKKwlzZWxlY3QgUEFSUE9SVF9OT1RfUEMKIAogY29uZmlnIFBBUlBPUlRfU1VOQlBQCiAJdHJpc3RhdGUgIlNwYXJjIGhhcmR3YXJlIChFWFBFUklNRU5UQUwpIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfcGMuYyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3BjLmMKaW5kZXggMThlODVjYy4uOTMwMmI4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfcGMuYworKysgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9wYy5jCkBAIC0yMzcxLDggKzIzNzEsMTAgQEAKIAlzcGluX2xvY2soJnBvcnRzX2xvY2spOwogCWxpc3RfZGVsX2luaXQoJnByaXYtPmxpc3QpOwogCXNwaW5fdW5sb2NrKCZwb3J0c19sb2NrKTsKKyNpZiBkZWZpbmVkKENPTkZJR19QQVJQT1JUX1BDX0ZJRk8pICYmIGRlZmluZWQoSEFTX0RNQSkKIAlpZiAocC0+ZG1hICE9IFBBUlBPUlRfRE1BX05PTkUpCiAJCWZyZWVfZG1hKHAtPmRtYSk7CisjZW5kaWYKIAlpZiAocC0+aXJxICE9IFBBUlBPUlRfSVJRX05PTkUpCiAJCWZyZWVfaXJxKHAtPmlycSwgcCk7CiAJcmVsZWFzZV9yZWdpb24ocC0+YmFzZSwgMyk7CkBAIC0yMzgwLDE0ICsyMzgyLDEyIEBACiAJCXJlbGVhc2VfcmVnaW9uKHAtPmJhc2UgKyAzLCBwLT5zaXplIC0gMyk7CiAJaWYgKHAtPm1vZGVzICYgUEFSUE9SVF9NT0RFX0VDUCkKIAkJcmVsZWFzZV9yZWdpb24ocC0+YmFzZV9oaSwgMyk7Ci0jaWZkZWYgQ09ORklHX1BBUlBPUlRfUENfRklGTwotI2lmZGVmIEhBU19ETUEKKyNpZiBkZWZpbmVkKENPTkZJR19QQVJQT1JUX1BDX0ZJRk8pICYmIGRlZmluZWQoSEFTX0RNQSkKIAlpZiAocHJpdi0+ZG1hX2J1ZikKIAkJcGNpX2ZyZWVfY29uc2lzdGVudChwcml2LT5kZXYsIFBBR0VfU0laRSwKIAkJCQkgICAgcHJpdi0+ZG1hX2J1ZiwKIAkJCQkgICAgcHJpdi0+ZG1hX2hhbmRsZSk7CiAjZW5kaWYKLSNlbmRpZgogCWtmcmVlIChwLT5wcml2YXRlX2RhdGEpOwogCXBhcnBvcnRfcHV0X3BvcnQocCk7CiAJa2ZyZWUgKG9wcyk7IC8qIGhvcGUgbm8tb25lIGNhY2hlZCBpdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfc2VyaWFsLmMgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9zZXJpYWwuYwppbmRleCBkM2RhZDBhLi43NmRkMDc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9zZXJpYWwuYworKysgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9zZXJpYWwuYwpAQCAtNDY0LDcgKzQ2NCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHBhcnBvcnRfc2VyaWFsX2luaXQgKHZvaWQpCiB7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCAoJnBhcnBvcnRfc2VyaWFsX3BjaV9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyICgmcGFycG9ydF9zZXJpYWxfcGNpX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBwYXJwb3J0X3NlcmlhbF9leGl0ICh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKaW5kZXggOGUyMWY2YWIuLjUwOWE1YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYwpAQCAtNzk0LDEyICs3OTQsMTQgQEAKIAkJCWlmIChQQ0lfU0xPVChkZXYtPmRldmZuKSAhPSBzbG90LT5kZXZpY2UpCiAJCQkJY29udGludWU7CiAJCQlpZiAoZGV2LT5oZHJfdHlwZSA9PSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFIHx8Ci0JCQkgICAgZGV2LT5oZHJfdHlwZSA9PSBQQ0lfSEVBREVSX1RZUEVfQ0FSREJVUykKKwkJCSAgICBkZXYtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9DQVJEQlVTKSB7CiAJCQkJbWF4ID0gcGNpX3NjYW5fYnJpZGdlKGJ1cywgZGV2LCBtYXgsIHBhc3MpOworCQkJCWlmIChwYXNzICYmIGRldi0+c3Vib3JkaW5hdGUpCisJCQkJCXBjaV9idXNfc2l6ZV9icmlkZ2VzKGRldi0+c3Vib3JkaW5hdGUpOworCQkJfQogCQl9CiAJfQogCi0JcGNpX2J1c19zaXplX2JyaWRnZXMoYnVzKTsKIAlwY2lfYnVzX2Fzc2lnbl9yZXNvdXJjZXMoYnVzKTsKIAlhY3BpcGhwX3Nhbml0aXplX2J1cyhidXMpOwogCXBjaV9lbmFibGVfYnJpZGdlcyhidXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHAuaCBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwLmgKaW5kZXggMDkyNDkxZS4uY2I4ODQwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHAuaAorKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocC5oCkBAIC0zMTcsNiArMzE3LDcgQEAKIAl1MTYgdmVuZG9yX2lkOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBpbnRfdGFza19ldmVudDsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZTsJLyogc2xlZXAgJiB3YWtlIHByb2Nlc3MgKi8KKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CQkvKiBkZWJ1Z2ZzIGRlbnRyeSAqLwogfTsKIAogc3RydWN0IGlycV9tYXBwaW5nIHsKQEAgLTM5OSw4ICs0MDAsMTEgQEAKICNkZWZpbmUgbXNnX2J1dHRvbl9pZ25vcmUJIlBDSSBzbG90ICMlZCAtIGJ1dHRvbiBwcmVzcyBpZ25vcmVkLiAgKGFjdGlvbiBpbiBwcm9ncmVzcy4uLilcbiIKIAogCi0vKiBzeXNmcyBmdW5jdGlvbnMgZm9yIHRoZSBob3RwbHVnIGNvbnRyb2xsZXIgaW5mbyAqLwotZXh0ZXJuIHZvaWQgY3BxaHBfY3JlYXRlX2N0cmxfZmlsZXMJCShzdHJ1Y3QgY29udHJvbGxlciAqY3RybCk7CisvKiBkZWJ1Z2ZzIGZ1bmN0aW9ucyBmb3IgdGhlIGhvdHBsdWcgY29udHJvbGxlciBpbmZvICovCitleHRlcm4gdm9pZCBjcHFocF9pbml0aWFsaXplX2RlYnVnZnMJCSh2b2lkKTsKK2V4dGVybiB2b2lkIGNwcWhwX3NodXRkb3duX2RlYnVnZnMJCSh2b2lkKTsKK2V4dGVybiB2b2lkIGNwcWhwX2NyZWF0ZV9kZWJ1Z2ZzX2ZpbGVzCQkoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpOworZXh0ZXJuIHZvaWQgY3BxaHBfcmVtb3ZlX2RlYnVnZnNfZmlsZXMJCShzdHJ1Y3QgY29udHJvbGxlciAqY3RybCk7CiAKIC8qIGNvbnRyb2xsZXIgZnVuY3Rpb25zICovCiBleHRlcm4gdm9pZAljcHFocF9wdXNoYnV0dG9uX3RocmVhZAkJKHVuc2lnbmVkIGxvbmcgZXZlbnRfcG9pbnRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jb3JlLmMKaW5kZXggOWFlZDhlZi4uYjM2NTlmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2NvcmUuYwpAQCAtMzI3LDcgKzMyNyw5IEBACiAJCQl2b2lkIF9faW9tZW0gKnNtYmlvc19zdGFydCwKIAkJCXZvaWQgX19pb21lbSAqc21iaW9zX3RhYmxlKQogewotCXN0cnVjdCBzbG90ICpuZXdfc2xvdDsKKwlzdHJ1Y3Qgc2xvdCAqc2xvdDsKKwlzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3Q7CisJc3RydWN0IGhvdHBsdWdfc2xvdF9pbmZvICpob3RwbHVnX3Nsb3RfaW5mbzsKIAl1OCBudW1iZXJfb2Zfc2xvdHM7CiAJdTggc2xvdF9kZXZpY2U7CiAJdTggc2xvdF9udW1iZXI7CkBAIC0zNDUsOTMgKzM0NywxMDUgQEAKIAlzbG90X251bWJlciA9IGN0cmwtPmZpcnN0X3Nsb3Q7CiAKIAl3aGlsZSAobnVtYmVyX29mX3Nsb3RzKSB7Ci0JCW5ld19zbG90ID0ga21hbGxvYyhzaXplb2YoKm5ld19zbG90KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghbmV3X3Nsb3QpCisJCXNsb3QgPSBrbWFsbG9jKHNpemVvZigqc2xvdCksIEdGUF9LRVJORUwpOworCQlpZiAoIXNsb3QpCiAJCQlnb3RvIGVycm9yOwogCi0JCW1lbXNldChuZXdfc2xvdCwgMCwgc2l6ZW9mKHN0cnVjdCBzbG90KSk7Ci0JCW5ld19zbG90LT5ob3RwbHVnX3Nsb3QgPSBrbWFsbG9jKHNpemVvZigqKG5ld19zbG90LT5ob3RwbHVnX3Nsb3QpKSwKKwkJbWVtc2V0KHNsb3QsIDAsIHNpemVvZihzdHJ1Y3Qgc2xvdCkpOworCQlzbG90LT5ob3RwbHVnX3Nsb3QgPSBrbWFsbG9jKHNpemVvZigqKHNsb3QtPmhvdHBsdWdfc2xvdCkpLAogCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCWlmICghbmV3X3Nsb3QtPmhvdHBsdWdfc2xvdCkKKwkJaWYgKCFzbG90LT5ob3RwbHVnX3Nsb3QpCiAJCQlnb3RvIGVycm9yX3Nsb3Q7Ci0JCW1lbXNldChuZXdfc2xvdC0+aG90cGx1Z19zbG90LCAwLCBzaXplb2Yoc3RydWN0IGhvdHBsdWdfc2xvdCkpOworCQlob3RwbHVnX3Nsb3QgPSBzbG90LT5ob3RwbHVnX3Nsb3Q7CisJCW1lbXNldChob3RwbHVnX3Nsb3QsIDAsIHNpemVvZihzdHJ1Y3QgaG90cGx1Z19zbG90KSk7CiAKLQkJbmV3X3Nsb3QtPmhvdHBsdWdfc2xvdC0+aW5mbyA9Ci0JCQkJa21hbGxvYyhzaXplb2YoKihuZXdfc2xvdC0+aG90cGx1Z19zbG90LT5pbmZvKSksCisJCWhvdHBsdWdfc2xvdC0+aW5mbyA9CisJCQkJa21hbGxvYyhzaXplb2YoKihob3RwbHVnX3Nsb3QtPmluZm8pKSwKIAkJCQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKCFuZXdfc2xvdC0+aG90cGx1Z19zbG90LT5pbmZvKQorCQlpZiAoIWhvdHBsdWdfc2xvdC0+aW5mbykKIAkJCWdvdG8gZXJyb3JfaHBzbG90OwotCQltZW1zZXQobmV3X3Nsb3QtPmhvdHBsdWdfc2xvdC0+aW5mbywgMCwKKwkJaG90cGx1Z19zbG90X2luZm8gPSBob3RwbHVnX3Nsb3QtPmluZm87CisJCW1lbXNldChob3RwbHVnX3Nsb3RfaW5mbywgMCwKIAkJCQlzaXplb2Yoc3RydWN0IGhvdHBsdWdfc2xvdF9pbmZvKSk7Ci0JCW5ld19zbG90LT5ob3RwbHVnX3Nsb3QtPm5hbWUgPSBrbWFsbG9jKFNMT1RfTkFNRV9TSVpFLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFuZXdfc2xvdC0+aG90cGx1Z19zbG90LT5uYW1lKQorCQlob3RwbHVnX3Nsb3QtPm5hbWUgPSBrbWFsbG9jKFNMT1RfTkFNRV9TSVpFLCBHRlBfS0VSTkVMKTsKKworCQlpZiAoIWhvdHBsdWdfc2xvdC0+bmFtZSkKIAkJCWdvdG8gZXJyb3JfaW5mbzsKIAotCQluZXdfc2xvdC0+Y3RybCA9IGN0cmw7Ci0JCW5ld19zbG90LT5idXMgPSBjdHJsLT5idXM7Ci0JCW5ld19zbG90LT5kZXZpY2UgPSBzbG90X2RldmljZTsKLQkJbmV3X3Nsb3QtPm51bWJlciA9IHNsb3RfbnVtYmVyOwotCQlkYmcoInNsb3QtPm51bWJlciA9ICVkXG4iLG5ld19zbG90LT5udW1iZXIpOworCQlzbG90LT5jdHJsID0gY3RybDsKKwkJc2xvdC0+YnVzID0gY3RybC0+YnVzOworCQlzbG90LT5kZXZpY2UgPSBzbG90X2RldmljZTsKKwkJc2xvdC0+bnVtYmVyID0gc2xvdF9udW1iZXI7CisJCWRiZygic2xvdC0+bnVtYmVyID0gJWRcbiIsIHNsb3QtPm51bWJlcik7CiAKIAkJc2xvdF9lbnRyeSA9IGdldF9TTUJJT1NfZW50cnkoc21iaW9zX3N0YXJ0LCBzbWJpb3NfdGFibGUsIDksCiAJCQkJCXNsb3RfZW50cnkpOwogCi0JCXdoaWxlIChzbG90X2VudHJ5ICYmIChyZWFkdyhzbG90X2VudHJ5ICsgU01CSU9TX1NMT1RfTlVNQkVSKSAhPSBuZXdfc2xvdC0+bnVtYmVyKSkgeworCQl3aGlsZSAoc2xvdF9lbnRyeSAmJiAocmVhZHcoc2xvdF9lbnRyeSArIFNNQklPU19TTE9UX05VTUJFUikgIT0KKwkJCQlzbG90LT5udW1iZXIpKSB7CiAJCQlzbG90X2VudHJ5ID0gZ2V0X1NNQklPU19lbnRyeShzbWJpb3Nfc3RhcnQsCiAJCQkJCQlzbWJpb3NfdGFibGUsIDksIHNsb3RfZW50cnkpOwogCQl9CiAKLQkJbmV3X3Nsb3QtPnBfc21fc2xvdCA9IHNsb3RfZW50cnk7CisJCXNsb3QtPnBfc21fc2xvdCA9IHNsb3RfZW50cnk7CiAKLQkJaW5pdF90aW1lcigmbmV3X3Nsb3QtPnRhc2tfZXZlbnQpOwotCQluZXdfc2xvdC0+dGFza19ldmVudC5leHBpcmVzID0gamlmZmllcyArIDUgKiBIWjsKLQkJbmV3X3Nsb3QtPnRhc2tfZXZlbnQuZnVuY3Rpb24gPSBjcHFocF9wdXNoYnV0dG9uX3RocmVhZDsKKwkJaW5pdF90aW1lcigmc2xvdC0+dGFza19ldmVudCk7CisJCXNsb3QtPnRhc2tfZXZlbnQuZXhwaXJlcyA9IGppZmZpZXMgKyA1ICogSFo7CisJCXNsb3QtPnRhc2tfZXZlbnQuZnVuY3Rpb24gPSBjcHFocF9wdXNoYnV0dG9uX3RocmVhZDsKIAogCQkvL0ZJWE1FOiB0aGVzZSBjYXBhYmlsaXRpZXMgYXJlbid0IHVzZWQgYnV0IGlmIHRoZXkgYXJlCiAJCS8vICAgICAgIHRoZXkgbmVlZCB0byBiZSBjb3JyZWN0bHkgaW1wbGVtZW50ZWQKLQkJbmV3X3Nsb3QtPmNhcGFiaWxpdGllcyB8PSBQQ0lTTE9UX1JFUExBQ0VfU1VQUE9SVEVEOwotCQluZXdfc2xvdC0+Y2FwYWJpbGl0aWVzIHw9IFBDSVNMT1RfSU5URVJMT0NLX1NVUFBPUlRFRDsKKwkJc2xvdC0+Y2FwYWJpbGl0aWVzIHw9IFBDSVNMT1RfUkVQTEFDRV9TVVBQT1JURUQ7CisJCXNsb3QtPmNhcGFiaWxpdGllcyB8PSBQQ0lTTE9UX0lOVEVSTE9DS19TVVBQT1JURUQ7CiAKLQkJaWYgKGlzX3Nsb3Q2NGJpdChuZXdfc2xvdCkpCi0JCQluZXdfc2xvdC0+Y2FwYWJpbGl0aWVzIHw9IFBDSVNMT1RfNjRfQklUX1NVUFBPUlRFRDsKLQkJaWYgKGlzX3Nsb3Q2Nm1oeihuZXdfc2xvdCkpCi0JCQluZXdfc2xvdC0+Y2FwYWJpbGl0aWVzIHw9IFBDSVNMT1RfNjZfTUhaX1NVUFBPUlRFRDsKKwkJaWYgKGlzX3Nsb3Q2NGJpdChzbG90KSkKKwkJCXNsb3QtPmNhcGFiaWxpdGllcyB8PSBQQ0lTTE9UXzY0X0JJVF9TVVBQT1JURUQ7CisJCWlmIChpc19zbG90NjZtaHooc2xvdCkpCisJCQlzbG90LT5jYXBhYmlsaXRpZXMgfD0gUENJU0xPVF82Nl9NSFpfU1VQUE9SVEVEOwogCQlpZiAoY3RybC0+c3BlZWQgPT0gUENJX1NQRUVEXzY2TUh6KQotCQkJbmV3X3Nsb3QtPmNhcGFiaWxpdGllcyB8PSBQQ0lTTE9UXzY2X01IWl9PUEVSQVRJT047CisJCQlzbG90LT5jYXBhYmlsaXRpZXMgfD0gUENJU0xPVF82Nl9NSFpfT1BFUkFUSU9OOwogCi0JCWN0cmxfc2xvdCA9IHNsb3RfZGV2aWNlIC0gKHJlYWRiKGN0cmwtPmhwY19yZWcgKyBTTE9UX01BU0spID4+IDQpOworCQljdHJsX3Nsb3QgPQorCQkJc2xvdF9kZXZpY2UgLSAocmVhZGIoY3RybC0+aHBjX3JlZyArIFNMT1RfTUFTSykgPj4gNCk7CiAKIAkJLy8gQ2hlY2sgcHJlc2VuY2UKLQkJbmV3X3Nsb3QtPmNhcGFiaWxpdGllcyB8PSAoKCgofnRlbXBkd29yZCkgPj4gMjMpIHwgKCh+dGVtcGR3b3JkKSA+PiAxNSkpID4+IGN0cmxfc2xvdCkgJiAweDAyOworCQlzbG90LT5jYXBhYmlsaXRpZXMgfD0KKwkJCSgoKCh+dGVtcGR3b3JkKSA+PiAyMykgfAorCQkJICgofnRlbXBkd29yZCkgPj4gMTUpKSA+PiBjdHJsX3Nsb3QpICYgMHgwMjsKIAkJLy8gQ2hlY2sgdGhlIHN3aXRjaCBzdGF0ZQotCQluZXdfc2xvdC0+Y2FwYWJpbGl0aWVzIHw9ICgofnRlbXBkd29yZCAmIDB4RkYpID4+IGN0cmxfc2xvdCkgJiAweDAxOworCQlzbG90LT5jYXBhYmlsaXRpZXMgfD0KKwkJCSgofnRlbXBkd29yZCAmIDB4RkYpID4+IGN0cmxfc2xvdCkgJiAweDAxOwogCQkvLyBDaGVjayB0aGUgc2xvdCBlbmFibGUKLQkJbmV3X3Nsb3QtPmNhcGFiaWxpdGllcyB8PSAoKHJlYWRfc2xvdF9lbmFibGUoY3RybCkgPDwgMikgPj4gY3RybF9zbG90KSAmIDB4MDQ7CisJCXNsb3QtPmNhcGFiaWxpdGllcyB8PQorCQkJKChyZWFkX3Nsb3RfZW5hYmxlKGN0cmwpIDw8IDIpID4+IGN0cmxfc2xvdCkgJiAweDA0OwogCiAJCS8qIHJlZ2lzdGVyIHRoaXMgc2xvdCB3aXRoIHRoZSBob3RwbHVnIHBjaSBjb3JlICovCi0JCW5ld19zbG90LT5ob3RwbHVnX3Nsb3QtPnJlbGVhc2UgPSAmcmVsZWFzZV9zbG90OwotCQluZXdfc2xvdC0+aG90cGx1Z19zbG90LT5wcml2YXRlID0gbmV3X3Nsb3Q7Ci0JCW1ha2Vfc2xvdF9uYW1lKG5ld19zbG90LT5ob3RwbHVnX3Nsb3QtPm5hbWUsIFNMT1RfTkFNRV9TSVpFLCBuZXdfc2xvdCk7Ci0JCW5ld19zbG90LT5ob3RwbHVnX3Nsb3QtPm9wcyA9ICZjcHFwaHBfaG90cGx1Z19zbG90X29wczsKKwkJaG90cGx1Z19zbG90LT5yZWxlYXNlID0gJnJlbGVhc2Vfc2xvdDsKKwkJaG90cGx1Z19zbG90LT5wcml2YXRlID0gc2xvdDsKKwkJbWFrZV9zbG90X25hbWUoaG90cGx1Z19zbG90LT5uYW1lLCBTTE9UX05BTUVfU0laRSwgc2xvdCk7CisJCWhvdHBsdWdfc2xvdC0+b3BzID0gJmNwcXBocF9ob3RwbHVnX3Nsb3Rfb3BzOwogCQkKLQkJbmV3X3Nsb3QtPmhvdHBsdWdfc2xvdC0+aW5mby0+cG93ZXJfc3RhdHVzID0gZ2V0X3Nsb3RfZW5hYmxlZChjdHJsLCBuZXdfc2xvdCk7Ci0JCW5ld19zbG90LT5ob3RwbHVnX3Nsb3QtPmluZm8tPmF0dGVudGlvbl9zdGF0dXMgPSBjcHFfZ2V0X2F0dGVudGlvbl9zdGF0dXMoY3RybCwgbmV3X3Nsb3QpOwotCQluZXdfc2xvdC0+aG90cGx1Z19zbG90LT5pbmZvLT5sYXRjaF9zdGF0dXMgPSBjcHFfZ2V0X2xhdGNoX3N0YXR1cyhjdHJsLCBuZXdfc2xvdCk7Ci0JCW5ld19zbG90LT5ob3RwbHVnX3Nsb3QtPmluZm8tPmFkYXB0ZXJfc3RhdHVzID0gZ2V0X3ByZXNlbmNlX3N0YXR1cyhjdHJsLCBuZXdfc2xvdCk7CisJCWhvdHBsdWdfc2xvdF9pbmZvLT5wb3dlcl9zdGF0dXMgPSBnZXRfc2xvdF9lbmFibGVkKGN0cmwsIHNsb3QpOworCQlob3RwbHVnX3Nsb3RfaW5mby0+YXR0ZW50aW9uX3N0YXR1cyA9CisJCQljcHFfZ2V0X2F0dGVudGlvbl9zdGF0dXMoY3RybCwgc2xvdCk7CisJCWhvdHBsdWdfc2xvdF9pbmZvLT5sYXRjaF9zdGF0dXMgPQorCQkJY3BxX2dldF9sYXRjaF9zdGF0dXMoY3RybCwgc2xvdCk7CisJCWhvdHBsdWdfc2xvdF9pbmZvLT5hZGFwdGVyX3N0YXR1cyA9CisJCQlnZXRfcHJlc2VuY2Vfc3RhdHVzKGN0cmwsIHNsb3QpOwogCQkKLQkJZGJnICgicmVnaXN0ZXJpbmcgYnVzICVkLCBkZXYgJWQsIG51bWJlciAlZCwgIgorCQlkYmcoInJlZ2lzdGVyaW5nIGJ1cyAlZCwgZGV2ICVkLCBudW1iZXIgJWQsICIKIAkJCQkiY3RybC0+c2xvdF9kZXZpY2Vfb2Zmc2V0ICVkLCBzbG90ICVkXG4iLAotCQkJCW5ld19zbG90LT5idXMsIG5ld19zbG90LT5kZXZpY2UsCi0JCQkJbmV3X3Nsb3QtPm51bWJlciwgY3RybC0+c2xvdF9kZXZpY2Vfb2Zmc2V0LAorCQkJCXNsb3QtPmJ1cywgc2xvdC0+ZGV2aWNlLAorCQkJCXNsb3QtPm51bWJlciwgY3RybC0+c2xvdF9kZXZpY2Vfb2Zmc2V0LAogCQkJCXNsb3RfbnVtYmVyKTsKLQkJcmVzdWx0ID0gcGNpX2hwX3JlZ2lzdGVyIChuZXdfc2xvdC0+aG90cGx1Z19zbG90KTsKKwkJcmVzdWx0ID0gcGNpX2hwX3JlZ2lzdGVyKGhvdHBsdWdfc2xvdCk7CiAJCWlmIChyZXN1bHQpIHsKLQkJCWVyciAoInBjaV9ocF9yZWdpc3RlciBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwgcmVzdWx0KTsKKwkJCWVycigicGNpX2hwX3JlZ2lzdGVyIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLCByZXN1bHQpOwogCQkJZ290byBlcnJvcl9uYW1lOwogCQl9CiAJCQotCQluZXdfc2xvdC0+bmV4dCA9IGN0cmwtPnNsb3Q7Ci0JCWN0cmwtPnNsb3QgPSBuZXdfc2xvdDsKKwkJc2xvdC0+bmV4dCA9IGN0cmwtPnNsb3Q7CisJCWN0cmwtPnNsb3QgPSBzbG90OwogCiAJCW51bWJlcl9vZl9zbG90cy0tOwogCQlzbG90X2RldmljZSsrOwpAQCAtNDM5LDE1ICs0NTMsMTQgQEAKIAl9CiAKIAlyZXR1cm4gMDsKLQogZXJyb3JfbmFtZToKLQlrZnJlZShuZXdfc2xvdC0+aG90cGx1Z19zbG90LT5uYW1lKTsKKwlrZnJlZShob3RwbHVnX3Nsb3QtPm5hbWUpOwogZXJyb3JfaW5mbzoKLQlrZnJlZShuZXdfc2xvdC0+aG90cGx1Z19zbG90LT5pbmZvKTsKKwlrZnJlZShob3RwbHVnX3Nsb3RfaW5mbyk7CiBlcnJvcl9ocHNsb3Q6Ci0Ja2ZyZWUobmV3X3Nsb3QtPmhvdHBsdWdfc2xvdCk7CisJa2ZyZWUoaG90cGx1Z19zbG90KTsKIGVycm9yX3Nsb3Q6Ci0Ja2ZyZWUobmV3X3Nsb3QpOworCWtmcmVlKHNsb3QpOwogZXJyb3I6CiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTQ2Niw2ICs0NzksOCBAQAogCQlvbGRfc2xvdCA9IG5leHRfc2xvdDsKIAl9CiAKKwljcHFocF9yZW1vdmVfZGVidWdmc19maWxlcyhjdHJsKTsKKwogCS8vRnJlZSBJUlEgYXNzb2NpYXRlZCB3aXRoIGhvdCBwbHVnIGRldmljZQogCWZyZWVfaXJxKGN0cmwtPmludGVycnVwdCwgY3RybCk7CiAJLy9Vbm1hcCB0aGUgbWVtb3J5CkBAIC0xMjYyLDcgKzEyNzcsNyBAQAogCS8vIERvbmUgd2l0aCBleGNsdXNpdmUgaGFyZHdhcmUgYWNjZXNzCiAJdXAoJmN0cmwtPmNyaXRfc2VjdCk7CiAKLQljcHFocF9jcmVhdGVfY3RybF9maWxlcyhjdHJsKTsKKwljcHFocF9jcmVhdGVfZGVidWdmc19maWxlcyhjdHJsKTsKIAogCXJldHVybiAwOwogCkBAIC0xNTAyLDYgKzE1MTcsNyBAQAogCWNwcWhwX2RlYnVnID0gZGVidWc7CiAKIAlpbmZvIChEUklWRVJfREVTQyAiIHZlcnNpb246ICIgRFJJVkVSX1ZFUlNJT04gIlxuIik7CisJY3BxaHBfaW5pdGlhbGl6ZV9kZWJ1Z2ZzKCk7CiAJcmVzdWx0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY3BxaHBjX2RyaXZlcik7CiAJZGJnKCJwY2lfcmVnaXN0ZXJfZHJpdmVyID0gJWRcbiIsIHJlc3VsdCk7CiAJcmV0dXJuIHJlc3VsdDsKQEAgLTE1MTUsNiArMTUzMSw3IEBACiAKIAlkYmcoInBjaV91bnJlZ2lzdGVyX2RyaXZlclxuIik7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZjcHFocGNfZHJpdmVyKTsKKwljcHFocF9zaHV0ZG93bl9kZWJ1Z2ZzKCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY3RybC5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY3RybC5jCmluZGV4IDEwYTVhNzYuLjc3MWVkMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2N0cmwuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jdHJsLmMKQEAgLTI2MzAsMjkgKzI2MzAsMTUgQEAKIAkJCWhvbGRfbWVtX25vZGUgPSBOVUxMOwogCQl9CiAKLQkJLyogSWYgd2UgaGF2ZSBwcmVmZXRjaGFibGUgbWVtb3J5IHJlc291cmNlcyBjb3B5IHRoZW0gYW5kIAotCQkgKiBmaWxsIGluIHRoZSBicmlkZ2UncyBtZW1vcnkgcmFuZ2UgcmVnaXN0ZXJzLiAgT3RoZXJ3aXNlLAotCQkgKiBmaWxsIGluIHRoZSByYW5nZSByZWdpc3RlcnMgd2l0aCB2YWx1ZXMgdGhhdCBkaXNhYmxlIHRoZW0uICovCi0JCWlmIChwX21lbV9ub2RlKSB7Ci0JCQltZW1jcHkoaG9sZF9wX21lbV9ub2RlLCBwX21lbV9ub2RlLCBzaXplb2Yoc3RydWN0IHBjaV9yZXNvdXJjZSkpOwotCQkJcF9tZW1fbm9kZS0+bmV4dCA9IE5VTEw7CisJCW1lbWNweShob2xkX3BfbWVtX25vZGUsIHBfbWVtX25vZGUsIHNpemVvZihzdHJ1Y3QgcGNpX3Jlc291cmNlKSk7CisJCXBfbWVtX25vZGUtPm5leHQgPSBOVUxMOwogCi0JCQkvKiBzZXQgUHJlIE1lbSBiYXNlIGFuZCBMaW1pdCByZWdpc3RlcnMgKi8KLQkJCXRlbXBfd29yZCA9IHBfbWVtX25vZGUtPmJhc2UgPj4gMTY7Ci0JCQlyYyA9IHBjaV9idXNfd3JpdGVfY29uZmlnX3dvcmQgKHBjaV9idXMsIGRldmZuLCBQQ0lfUFJFRl9NRU1PUllfQkFTRSwgdGVtcF93b3JkKTsKKwkJLyogc2V0IFByZSBNZW0gYmFzZSBhbmQgTGltaXQgcmVnaXN0ZXJzICovCisJCXRlbXBfd29yZCA9IHBfbWVtX25vZGUtPmJhc2UgPj4gMTY7CisJCXJjID0gcGNpX2J1c193cml0ZV9jb25maWdfd29yZCAocGNpX2J1cywgZGV2Zm4sIFBDSV9QUkVGX01FTU9SWV9CQVNFLCB0ZW1wX3dvcmQpOwogCi0JCQl0ZW1wX3dvcmQgPSAocF9tZW1fbm9kZS0+YmFzZSArIHBfbWVtX25vZGUtPmxlbmd0aCAtIDEpID4+IDE2OwotCQkJcmMgPSBwY2lfYnVzX3dyaXRlX2NvbmZpZ193b3JkIChwY2lfYnVzLCBkZXZmbiwgUENJX1BSRUZfTUVNT1JZX0xJTUlULCB0ZW1wX3dvcmQpOwotCQl9IGVsc2UgewotCQkJdGVtcF93b3JkID0gMHhGRkZGOwotCQkJcmMgPSBwY2lfYnVzX3dyaXRlX2NvbmZpZ193b3JkIChwY2lfYnVzLCBkZXZmbiwgUENJX1BSRUZfTUVNT1JZX0JBU0UsIHRlbXBfd29yZCk7Ci0KLQkJCXRlbXBfd29yZCA9IDB4MDAwMDsKLQkJCXJjID0gcGNpX2J1c193cml0ZV9jb25maWdfd29yZCAocGNpX2J1cywgZGV2Zm4sIFBDSV9QUkVGX01FTU9SWV9MSU1JVCwgdGVtcF93b3JkKTsKLQotCQkJa2ZyZWUoaG9sZF9wX21lbV9ub2RlKTsKLQkJCWhvbGRfcF9tZW1fbm9kZSA9IE5VTEw7Ci0JCX0KKwkJdGVtcF93b3JkID0gKHBfbWVtX25vZGUtPmJhc2UgKyBwX21lbV9ub2RlLT5sZW5ndGggLSAxKSA+PiAxNjsKKwkJcmMgPSBwY2lfYnVzX3dyaXRlX2NvbmZpZ193b3JkIChwY2lfYnVzLCBkZXZmbiwgUENJX1BSRUZfTUVNT1JZX0xJTUlULCB0ZW1wX3dvcmQpOwogCiAJCS8qIEFkanVzdCB0aGlzIHRvIGNvbXBlbnNhdGUgZm9yIGV4dHJhIGFkanVzdG1lbnQgaW4gZmlyc3QgbG9vcCAqLwogCQlpcnFzLmJhcmJlcl9wb2xlLS07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9zeXNmcy5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfc3lzZnMuYwppbmRleCA0YzExMDQ4Li5iYmZlZWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9zeXNmcy5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX3N5c2ZzLmMKQEAgLTMzLDIyICszMywxNSBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSAiY3BxcGhwLmgiCiAKLQotLyogQSBmZXcgcm91dGluZXMgdGhhdCBjcmVhdGUgc3lzZnMgZW50cmllcyBmb3IgdGhlIGhvdCBwbHVnIGNvbnRyb2xsZXIgKi8KLQotc3RhdGljIHNzaXplX3Qgc2hvd19jdHJsIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgaW50IHNob3dfY3RybCAoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKLQlzdHJ1Y3QgY29udHJvbGxlciAqY3RybDsKLQljaGFyICogb3V0ID0gYnVmOworCWNoYXIgKm91dCA9IGJ1ZjsKIAlpbnQgaW5kZXg7CiAJc3RydWN0IHBjaV9yZXNvdXJjZSAqcmVzOwogCi0JcGNpX2RldiA9IGNvbnRhaW5lcl9vZiAoZGV2LCBzdHJ1Y3QgcGNpX2RldiwgZGV2KTsKLQljdHJsID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOwotCiAJb3V0ICs9IHNwcmludGYoYnVmLCAiRnJlZSByZXNvdXJjZXM6IG1lbW9yeVxuIik7CiAJaW5kZXggPSAxMTsKIAlyZXMgPSBjdHJsLT5tZW1faGVhZDsKQEAgLTgwLDIyICs3MywxNiBAQAogCiAJcmV0dXJuIG91dCAtIGJ1ZjsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUiAoY3RybCwgU19JUlVHTywgc2hvd19jdHJsLCBOVUxMKTsKIAotc3RhdGljIHNzaXplX3Qgc2hvd19kZXYgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgc2hvd19kZXYgKHN0cnVjdCBjb250cm9sbGVyICpjdHJsLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7Ci0Jc3RydWN0IGNvbnRyb2xsZXIgKmN0cmw7CiAJY2hhciAqIG91dCA9IGJ1ZjsKIAlpbnQgaW5kZXg7CiAJc3RydWN0IHBjaV9yZXNvdXJjZSAqcmVzOwogCXN0cnVjdCBwY2lfZnVuYyAqbmV3X3Nsb3Q7CiAJc3RydWN0IHNsb3QgKnNsb3Q7CiAKLQlwY2lfZGV2ID0gY29udGFpbmVyX29mIChkZXYsIHN0cnVjdCBwY2lfZGV2LCBkZXYpOwotCWN0cmwgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7Ci0KLQlzbG90PWN0cmwtPnNsb3Q7CisJc2xvdCA9IGN0cmwtPnNsb3Q7CiAKIAl3aGlsZSAoc2xvdCkgewogCQluZXdfc2xvdCA9IGNwcWhwX3Nsb3RfZmluZChzbG90LT5idXMsIHNsb3QtPmRldmljZSwgMCk7CkBAIC0xMzQsMTAgKzEyMSwxMTcgQEAKIAogCXJldHVybiBvdXQgLSBidWY7CiB9Ci1zdGF0aWMgREVWSUNFX0FUVFIgKGRldiwgU19JUlVHTywgc2hvd19kZXYsIE5VTEwpOwogCi12b2lkIGNwcWhwX2NyZWF0ZV9jdHJsX2ZpbGVzIChzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKK3N0YXRpYyBpbnQgc3Bld19kZWJ1Z19pbmZvKHN0cnVjdCBjb250cm9sbGVyICpjdHJsLCBjaGFyICpkYXRhLCBpbnQgc2l6ZSkKIHsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUgKCZjdHJsLT5wY2lfZGV2LT5kZXYsICZkZXZfYXR0cl9jdHJsKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUgKCZjdHJsLT5wY2lfZGV2LT5kZXYsICZkZXZfYXR0cl9kZXYpOworCWludCB1c2VkOworCisJdXNlZCA9IHNpemUgLSBzaG93X2N0cmwoY3RybCwgZGF0YSk7CisJdXNlZCA9IChzaXplIC0gdXNlZCkgLSBzaG93X2RldihjdHJsLCAmZGF0YVt1c2VkXSk7CisJcmV0dXJuIHVzZWQ7CiB9CisKK3N0cnVjdCBjdHJsX2RiZyB7CisJaW50IHNpemU7CisJY2hhciAqZGF0YTsKKwlzdHJ1Y3QgY29udHJvbGxlciAqY3RybDsKK307CisKKyNkZWZpbmUgTUFYX09VVFBVVAkoNCpQQUdFX1NJWkUpCisKK3N0YXRpYyBpbnQgb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IGlub2RlLT51LmdlbmVyaWNfaXA7CisJc3RydWN0IGN0cmxfZGJnICpkYmc7CisJaW50IHJldHZhbCA9IC1FTk9NRU07CisKKwlsb2NrX2tlcm5lbCgpOworCWRiZyA9IGttYWxsb2Moc2l6ZW9mKCpkYmcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRiZykKKwkJZ290byBleGl0OworCWRiZy0+ZGF0YSA9IGttYWxsb2MoTUFYX09VVFBVVCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYmctPmRhdGEpIHsKKwkJa2ZyZWUoZGJnKTsKKwkJZ290byBleGl0OworCX0KKwlkYmctPnNpemUgPSBzcGV3X2RlYnVnX2luZm8oY3RybCwgZGJnLT5kYXRhLCBNQVhfT1VUUFVUKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBkYmc7CisJcmV0dmFsID0gMDsKK2V4aXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBsb2ZmX3QgbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmYsIGludCB3aGVuY2UpCit7CisJc3RydWN0IGN0cmxfZGJnICpkYmc7CisJbG9mZl90IG5ldyA9IC0xOworCisJbG9ja19rZXJuZWwoKTsKKwlkYmcgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlzd2l0Y2ggKHdoZW5jZSkgeworCWNhc2UgMDoKKwkJbmV3ID0gb2ZmOworCQlicmVhazsKKwljYXNlIDE6CisJCW5ldyA9IGZpbGUtPmZfcG9zICsgb2ZmOworCQlicmVhazsKKwl9CisJaWYgKG5ldyA8IDAgfHwgbmV3ID4gZGJnLT5zaXplKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gKGZpbGUtPmZfcG9zID0gbmV3KTsKK30KKworc3RhdGljIHNzaXplX3QgcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJICAgIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgY3RybF9kYmcgKmRiZyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIGRiZy0+ZGF0YSwgZGJnLT5zaXplKTsKK30KKworc3RhdGljIGludCByZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBjdHJsX2RiZyAqZGJnID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJa2ZyZWUoZGJnLT5kYXRhKTsKKwlrZnJlZShkYmcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z19vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBvcGVuLAorCS5sbHNlZWsgPSBsc2VlaywKKwkucmVhZCA9IHJlYWQsCisJLnJlbGVhc2UgPSByZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKnJvb3Q7CisKK3ZvaWQgY3BxaHBfaW5pdGlhbGl6ZV9kZWJ1Z2ZzKHZvaWQpCit7CisJaWYgKCFyb290KQorCQlyb290ID0gZGVidWdmc19jcmVhdGVfZGlyKCJjcHFocCIsIE5VTEwpOworfQorCit2b2lkIGNwcWhwX3NodXRkb3duX2RlYnVnZnModm9pZCkKK3sKKwlkZWJ1Z2ZzX3JlbW92ZShyb290KTsKK30KKwordm9pZCBjcHFocF9jcmVhdGVfZGVidWdmc19maWxlcyhzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKK3sKKwljdHJsLT5kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGN0cmwtPnBjaV9kZXYtPmRldi5idXNfaWQsIFNfSVJVR08sIHJvb3QsIGN0cmwsICZkZWJ1Z19vcHMpOworfQorCit2b2lkIGNwcWhwX3JlbW92ZV9kZWJ1Z2ZzX2ZpbGVzKHN0cnVjdCBjb250cm9sbGVyICpjdHJsKQoreworCWlmIChjdHJsLT5kZW50cnkpCisJCWRlYnVnZnNfcmVtb3ZlKGN0cmwtPmRlbnRyeSk7CisJY3RybC0+ZGVudHJ5ID0gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfcGNpLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9wY2kuYwppbmRleCBiMWJhNDI5Li4xNTUxMzNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9wY2kuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9wY2kuYwpAQCAtOTY5LDcgKzk2OSw3IEBACiAJCQlkZWJ1ZyAoImlvIDMyXG4iKTsKIAkJCW5lZWRfaW9fdXBwZXIgPSBUUlVFOwogCQl9Ci0JCWlmICgoaW9fYmFzZSAmIFBDSV9QUkVGX1JBTkdFX1RZUEVfTUFTSykgPT0gUENJX1BSRUZfUkFOR0VfVFlQRV82NCkgeworCQlpZiAoKHBmbWVtX2Jhc2UgJiBQQ0lfUFJFRl9SQU5HRV9UWVBFX01BU0spID09IFBDSV9QUkVGX1JBTkdFX1RZUEVfNjQpIHsKIAkJCWRlYnVnICgicGZtZW0gNjRcbiIpOwogCQkJbmVlZF9wZm1lbV91cHBlciA9IFRSVUU7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwLmggYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oCmluZGV4IDZhNjFiOWYuLjBhYWM2YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwLmgKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHAuaApAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkJLyogc2lnbmFsX3BlbmRpbmcoKSAqLwogI2luY2x1ZGUgPGxpbnV4L3BjaWVwb3J0X2lmLmg+CiAjaW5jbHVkZSAicGNpX2hvdHBsdWcuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jCmluZGV4IDhkZjcwNDguLjRmYjU2OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jb3JlLmMKQEAgLTEwMyw3ICsxMDMsMTAgQEAKIAogc3RhdGljIGludCBpbml0X3Nsb3RzKHN0cnVjdCBjb250cm9sbGVyICpjdHJsKQogewotCXN0cnVjdCBzbG90ICpuZXdfc2xvdDsKKwlzdHJ1Y3Qgc2xvdCAqc2xvdDsKKwlzdHJ1Y3QgaHBjX29wcyAqaHBjX29wczsKKwlzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3Q7CisJc3RydWN0IGhvdHBsdWdfc2xvdF9pbmZvICpob3RwbHVnX3Nsb3RfaW5mbzsKIAl1OCBudW1iZXJfb2Zfc2xvdHM7CiAJdTggc2xvdF9kZXZpY2U7CiAJdTMyIHNsb3RfbnVtYmVyOwpAQCAtMTE0LDU5ICsxMTcsNjYgQEAKIAlzbG90X251bWJlciA9IGN0cmwtPmZpcnN0X3Nsb3Q7CiAKIAl3aGlsZSAobnVtYmVyX29mX3Nsb3RzKSB7Ci0JCW5ld19zbG90ID0ga21hbGxvYyhzaXplb2YoKm5ld19zbG90KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghbmV3X3Nsb3QpCisJCXNsb3QgPSBrbWFsbG9jKHNpemVvZigqc2xvdCksIEdGUF9LRVJORUwpOworCQlpZiAoIXNsb3QpCiAJCQlnb3RvIGVycm9yOwogCi0JCW1lbXNldChuZXdfc2xvdCwgMCwgc2l6ZW9mKHN0cnVjdCBzbG90KSk7Ci0JCW5ld19zbG90LT5ob3RwbHVnX3Nsb3QgPQotCQkJCWttYWxsb2Moc2l6ZW9mKCoobmV3X3Nsb3QtPmhvdHBsdWdfc2xvdCkpLAorCQltZW1zZXQoc2xvdCwgMCwgc2l6ZW9mKHN0cnVjdCBzbG90KSk7CisJCXNsb3QtPmhvdHBsdWdfc2xvdCA9CisJCQkJa21hbGxvYyhzaXplb2YoKihzbG90LT5ob3RwbHVnX3Nsb3QpKSwKIAkJCQkJCUdGUF9LRVJORUwpOwotCQlpZiAoIW5ld19zbG90LT5ob3RwbHVnX3Nsb3QpCisJCWlmICghc2xvdC0+aG90cGx1Z19zbG90KQogCQkJZ290byBlcnJvcl9zbG90OwotCQltZW1zZXQobmV3X3Nsb3QtPmhvdHBsdWdfc2xvdCwgMCwgc2l6ZW9mKHN0cnVjdCBob3RwbHVnX3Nsb3QpKTsKKwkJaG90cGx1Z19zbG90ID0gc2xvdC0+aG90cGx1Z19zbG90OworCQltZW1zZXQoaG90cGx1Z19zbG90LCAwLCBzaXplb2Yoc3RydWN0IGhvdHBsdWdfc2xvdCkpOwogCi0JCW5ld19zbG90LT5ob3RwbHVnX3Nsb3QtPmluZm8gPQotCQkJa21hbGxvYyhzaXplb2YoKihuZXdfc2xvdC0+aG90cGx1Z19zbG90LT5pbmZvKSksCisJCWhvdHBsdWdfc2xvdC0+aW5mbyA9CisJCQlrbWFsbG9jKHNpemVvZigqKGhvdHBsdWdfc2xvdC0+aW5mbykpLAogCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCWlmICghbmV3X3Nsb3QtPmhvdHBsdWdfc2xvdC0+aW5mbykKKwkJaWYgKCFob3RwbHVnX3Nsb3QtPmluZm8pCiAJCQlnb3RvIGVycm9yX2hwc2xvdDsKLQkJbWVtc2V0KG5ld19zbG90LT5ob3RwbHVnX3Nsb3QtPmluZm8sIDAsCisJCWhvdHBsdWdfc2xvdF9pbmZvID0gaG90cGx1Z19zbG90LT5pbmZvOworCQltZW1zZXQoaG90cGx1Z19zbG90X2luZm8sIDAsCiAJCQkJCXNpemVvZihzdHJ1Y3QgaG90cGx1Z19zbG90X2luZm8pKTsKLQkJbmV3X3Nsb3QtPmhvdHBsdWdfc2xvdC0+bmFtZSA9IGttYWxsb2MoU0xPVF9OQU1FX1NJWkUsCi0JCQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKCFuZXdfc2xvdC0+aG90cGx1Z19zbG90LT5uYW1lKQorCQlob3RwbHVnX3Nsb3QtPm5hbWUgPSBrbWFsbG9jKFNMT1RfTkFNRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFob3RwbHVnX3Nsb3QtPm5hbWUpCiAJCQlnb3RvIGVycm9yX2luZm87CiAKLQkJbmV3X3Nsb3QtPmN0cmwgPSBjdHJsOwotCQluZXdfc2xvdC0+YnVzID0gY3RybC0+c2xvdF9idXM7Ci0JCW5ld19zbG90LT5kZXZpY2UgPSBzbG90X2RldmljZTsKLQkJbmV3X3Nsb3QtPmhwY19vcHMgPSBjdHJsLT5ocGNfb3BzOworCQlzbG90LT5jdHJsID0gY3RybDsKKwkJc2xvdC0+YnVzID0gY3RybC0+c2xvdF9idXM7CisJCXNsb3QtPmRldmljZSA9IHNsb3RfZGV2aWNlOworCQlzbG90LT5ocGNfb3BzID0gaHBjX29wcyA9IGN0cmwtPmhwY19vcHM7CiAKLQkJbmV3X3Nsb3QtPm51bWJlciA9IGN0cmwtPmZpcnN0X3Nsb3Q7Ci0JCW5ld19zbG90LT5ocF9zbG90ID0gc2xvdF9kZXZpY2UgLSBjdHJsLT5zbG90X2RldmljZV9vZmZzZXQ7CisJCXNsb3QtPm51bWJlciA9IGN0cmwtPmZpcnN0X3Nsb3Q7CisJCXNsb3QtPmhwX3Nsb3QgPSBzbG90X2RldmljZSAtIGN0cmwtPnNsb3RfZGV2aWNlX29mZnNldDsKIAogCQkvKiByZWdpc3RlciB0aGlzIHNsb3Qgd2l0aCB0aGUgaG90cGx1ZyBwY2kgY29yZSAqLwotCQluZXdfc2xvdC0+aG90cGx1Z19zbG90LT5wcml2YXRlID0gbmV3X3Nsb3Q7Ci0JCW5ld19zbG90LT5ob3RwbHVnX3Nsb3QtPnJlbGVhc2UgPSAmcmVsZWFzZV9zbG90OwotCQltYWtlX3Nsb3RfbmFtZShuZXdfc2xvdC0+aG90cGx1Z19zbG90LT5uYW1lLCBTTE9UX05BTUVfU0laRSwgbmV3X3Nsb3QpOwotCQluZXdfc2xvdC0+aG90cGx1Z19zbG90LT5vcHMgPSAmcGNpZWhwX2hvdHBsdWdfc2xvdF9vcHM7CisJCWhvdHBsdWdfc2xvdC0+cHJpdmF0ZSA9IHNsb3Q7CisJCWhvdHBsdWdfc2xvdC0+cmVsZWFzZSA9ICZyZWxlYXNlX3Nsb3Q7CisJCW1ha2Vfc2xvdF9uYW1lKGhvdHBsdWdfc2xvdC0+bmFtZSwgU0xPVF9OQU1FX1NJWkUsIHNsb3QpOworCQlob3RwbHVnX3Nsb3QtPm9wcyA9ICZwY2llaHBfaG90cGx1Z19zbG90X29wczsKIAotCQluZXdfc2xvdC0+aHBjX29wcy0+Z2V0X3Bvd2VyX3N0YXR1cyhuZXdfc2xvdCwgJihuZXdfc2xvdC0+aG90cGx1Z19zbG90LT5pbmZvLT5wb3dlcl9zdGF0dXMpKTsKLQkJbmV3X3Nsb3QtPmhwY19vcHMtPmdldF9hdHRlbnRpb25fc3RhdHVzKG5ld19zbG90LCAmKG5ld19zbG90LT5ob3RwbHVnX3Nsb3QtPmluZm8tPmF0dGVudGlvbl9zdGF0dXMpKTsKLQkJbmV3X3Nsb3QtPmhwY19vcHMtPmdldF9sYXRjaF9zdGF0dXMobmV3X3Nsb3QsICYobmV3X3Nsb3QtPmhvdHBsdWdfc2xvdC0+aW5mby0+bGF0Y2hfc3RhdHVzKSk7Ci0JCW5ld19zbG90LT5ocGNfb3BzLT5nZXRfYWRhcHRlcl9zdGF0dXMobmV3X3Nsb3QsICYobmV3X3Nsb3QtPmhvdHBsdWdfc2xvdC0+aW5mby0+YWRhcHRlcl9zdGF0dXMpKTsKKwkJaHBjX29wcy0+Z2V0X3Bvd2VyX3N0YXR1cyhzbG90LAorCQkJJihob3RwbHVnX3Nsb3RfaW5mby0+cG93ZXJfc3RhdHVzKSk7CisJCWhwY19vcHMtPmdldF9hdHRlbnRpb25fc3RhdHVzKHNsb3QsCisJCQkmKGhvdHBsdWdfc2xvdF9pbmZvLT5hdHRlbnRpb25fc3RhdHVzKSk7CisJCWhwY19vcHMtPmdldF9sYXRjaF9zdGF0dXMoc2xvdCwKKwkJCSYoaG90cGx1Z19zbG90X2luZm8tPmxhdGNoX3N0YXR1cykpOworCQlocGNfb3BzLT5nZXRfYWRhcHRlcl9zdGF0dXMoc2xvdCwKKwkJCSYoaG90cGx1Z19zbG90X2luZm8tPmFkYXB0ZXJfc3RhdHVzKSk7CiAKLQkJZGJnKCJSZWdpc3RlcmluZyBidXM9JXggZGV2PSV4IGhwX3Nsb3Q9JXggc3VuPSV4IHNsb3RfZGV2aWNlX29mZnNldD0leFxuIiwgCi0JCQluZXdfc2xvdC0+YnVzLCBuZXdfc2xvdC0+ZGV2aWNlLCBuZXdfc2xvdC0+aHBfc2xvdCwgbmV3X3Nsb3QtPm51bWJlciwgY3RybC0+c2xvdF9kZXZpY2Vfb2Zmc2V0KTsKLQkJcmVzdWx0ID0gcGNpX2hwX3JlZ2lzdGVyIChuZXdfc2xvdC0+aG90cGx1Z19zbG90KTsKKwkJZGJnKCJSZWdpc3RlcmluZyBidXM9JXggZGV2PSV4IGhwX3Nsb3Q9JXggc3VuPSV4ICIKKwkJCSJzbG90X2RldmljZV9vZmZzZXQ9JXhcbiIsCisJCQlzbG90LT5idXMsIHNsb3QtPmRldmljZSwgc2xvdC0+aHBfc2xvdCwgc2xvdC0+bnVtYmVyLAorCQkJY3RybC0+c2xvdF9kZXZpY2Vfb2Zmc2V0KTsKKwkJcmVzdWx0ID0gcGNpX2hwX3JlZ2lzdGVyKGhvdHBsdWdfc2xvdCk7CiAJCWlmIChyZXN1bHQpIHsKIAkJCWVyciAoInBjaV9ocF9yZWdpc3RlciBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwgcmVzdWx0KTsKIAkJCWdvdG8gZXJyb3JfbmFtZTsKIAkJfQogCi0JCW5ld19zbG90LT5uZXh0ID0gY3RybC0+c2xvdDsKLQkJY3RybC0+c2xvdCA9IG5ld19zbG90OworCQlzbG90LT5uZXh0ID0gY3RybC0+c2xvdDsKKwkJY3RybC0+c2xvdCA9IHNsb3Q7CiAKIAkJbnVtYmVyX29mX3Nsb3RzLS07CiAJCXNsb3RfZGV2aWNlKys7CkBAIC0xNzYsMTMgKzE4NiwxMyBAQAogCXJldHVybiAwOwogCiBlcnJvcl9uYW1lOgotCWtmcmVlKG5ld19zbG90LT5ob3RwbHVnX3Nsb3QtPm5hbWUpOworCWtmcmVlKGhvdHBsdWdfc2xvdC0+bmFtZSk7CiBlcnJvcl9pbmZvOgotCWtmcmVlKG5ld19zbG90LT5ob3RwbHVnX3Nsb3QtPmluZm8pOworCWtmcmVlKGhvdHBsdWdfc2xvdF9pbmZvKTsKIGVycm9yX2hwc2xvdDoKLQlrZnJlZShuZXdfc2xvdC0+aG90cGx1Z19zbG90KTsKKwlrZnJlZShob3RwbHVnX3Nsb3QpOwogZXJyb3Jfc2xvdDoKLQlrZnJlZShuZXdfc2xvdCk7CisJa2ZyZWUoc2xvdCk7CiBlcnJvcjoKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtNTAyLDcgKzUxMiw3IEBACiAKIH0KIAotaW50IGhwZHJpdmVyX2NvbnRleHQgPSAwOworc3RhdGljIGludCBocGRyaXZlcl9jb250ZXh0ID0gMDsKIAogc3RhdGljIHZvaWQgcGNpZWhwX3JlbW92ZSAoc3RydWN0IHBjaWVfZGV2aWNlICpkZXZpY2UpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2hwYy5jCmluZGV4IDBiOGIyNmIuLjc3ZTUzMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2hwYy5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2hwYy5jCkBAIC0zMCw2ICszMCw5IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIApAQCAtNzg0LDggKzc4NywxMyBAQAogCiAJc2xvdF9jbWQgPSAoc2xvdF9jdHJsICYgflBXUl9DVFJMKSB8IFBPV0VSX09OOwogCisJLyogRW5hYmxlIGRldGVjdGlvbiB0aGF0IHdlIHR1cm5lZCBvZmYgYXQgc2xvdCBwb3dlci1vZmYgdGltZSAqLwogCWlmICghcGNpZWhwX3BvbGxfbW9kZSkKLQkJc2xvdF9jbWQgPSBzbG90X2NtZCB8IEhQX0lOVFJfRU5BQkxFOyAKKwkJc2xvdF9jbWQgPSBzbG90X2NtZCB8CisJCSAgICAgICAgICAgUFdSX0ZBVUxUX0RFVEVDVF9FTkFCTEUgfAorCQkgICAgICAgICAgIE1STF9ERVRFQ1RfRU5BQkxFIHwKKwkJICAgICAgICAgICBQUlNOX0RFVEVDVF9FTkFCTEUgfAorCQkgICAgICAgICAgIEhQX0lOVFJfRU5BQkxFOwogCiAJcmV0dmFsID0gcGNpZV93cml0ZV9jbWQoc2xvdCwgc2xvdF9jbWQpOwogCkBAIC04MzAsOCArODM4LDE4IEBACiAKIAlzbG90X2NtZCA9IChzbG90X2N0cmwgJiB+UFdSX0NUUkwpIHwgUE9XRVJfT0ZGOwogCisJLyoKKwkgKiBJZiB3ZSBnZXQgTVJMIG9yIHByZXNlbmNlIGRldGVjdCBpbnRlcnJ1cHRzIG5vdywgdGhlIGlzcgorCSAqIHdpbGwgbm90aWNlIHRoZSBzdGlja3kgcG93ZXItZmF1bHQgYml0IHRvbyBhbmQgaXNzdWUgcG93ZXIKKwkgKiBpbmRpY2F0b3IgY2hhbmdlIGNvbW1hbmRzLiBUaGlzIHdpbGwgbGVhZCB0byBhbiBlbmRsZXNzIGxvb3AKKwkgKiBvZiBjb21tYW5kIGNvbXBsZXRpb25zLCBzaW5jZSB0aGUgcG93ZXItZmF1bHQgYml0IHJlbWFpbnMgb24KKwkgKiB0aWxsIHRoZSBzbG90IGlzIHBvd2VyZWQgb24gYWdhaW4uCisJICovCiAJaWYgKCFwY2llaHBfcG9sbF9tb2RlKQotCQlzbG90X2NtZCA9IHNsb3RfY21kIHwgSFBfSU5UUl9FTkFCTEU7IAorCQlzbG90X2NtZCA9IChzbG90X2NtZCAmCisJCSAgICAgICAgICAgIH5QV1JfRkFVTFRfREVURUNUX0VOQUJMRSAmCisJCSAgICAgICAgICAgIH5NUkxfREVURUNUX0VOQUJMRSAmCisJCSAgICAgICAgICAgIH5QUlNOX0RFVEVDVF9FTkFCTEUpIHwgSFBfSU5UUl9FTkFCTEU7CiAKIAlyZXR2YWwgPSBwY2llX3dyaXRlX2NtZChzbG90LCBzbG90X2NtZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX3BjaS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfcGNpLmMKaW5kZXggNjQ3NjczYS4uNDAxN2ZiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfcGNpLmMKQEAgLTM0LDYgKzM0LDMxIEBACiAjaW5jbHVkZSAiLi4vcGNpLmgiCiAjaW5jbHVkZSAicGNpZWhwLmgiCiAKK3N0YXRpYyBpbnQgcGNpZWhwX2FkZF9icmlkZ2Uoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2J1cyAqcGFyZW50ID0gZGV2LT5idXM7CisJaW50IHBhc3MsIGJ1c25yLCBzdGFydCA9IHBhcmVudC0+c2Vjb25kYXJ5OworCWludCBlbmQgPSBwYXJlbnQtPnN1Ym9yZGluYXRlOworCisJZm9yIChidXNuciA9IHN0YXJ0OyBidXNuciA8PSBlbmQ7IGJ1c25yKyspIHsKKwkJaWYgKCFwY2lfZmluZF9idXMocGNpX2RvbWFpbl9ucihwYXJlbnQpLCBidXNucikpCisJCQlicmVhazsKKwl9CisJaWYgKGJ1c25yLS0gPiBlbmQpIHsKKwkJZXJyKCJObyBidXMgbnVtYmVyIGF2YWlsYWJsZSBmb3IgaG90LWFkZGVkIGJyaWRnZSAlc1xuIiwKKwkJCQlwY2lfbmFtZShkZXYpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMjsgcGFzcysrKQorCQlidXNuciA9IHBjaV9zY2FuX2JyaWRnZShwYXJlbnQsIGRldiwgYnVzbnIsIHBhc3MpOworCWlmICghZGV2LT5zdWJvcmRpbmF0ZSkKKwkJcmV0dXJuIC0xOworCXBjaV9idXNfc2l6ZV9icmlkZ2VzKGRldi0+c3Vib3JkaW5hdGUpOworCXBjaV9idXNfYXNzaWduX3Jlc291cmNlcyhwYXJlbnQpOworCXBjaV9lbmFibGVfYnJpZGdlcyhwYXJlbnQpOworCXBjaV9idXNfYWRkX2RldmljZXMocGFyZW50KTsKKwlyZXR1cm4gMDsKK30KIAogaW50IHBjaWVocF9jb25maWd1cmVfZGV2aWNlKHN0cnVjdCBzbG90ICpwX3Nsb3QpCiB7CkBAIC01NSw4ICs4MCw4IEBACiAJfQogCiAJZm9yIChmbiA9IDA7IGZuIDwgODsgZm4rKykgewotCQlpZiAoIShkZXYgPSBwY2lfZmluZF9zbG90KHBfc2xvdC0+YnVzLAotCQkJCQlQQ0lfREVWRk4ocF9zbG90LT5kZXZpY2UsIGZuKSkpKQorCQlkZXYgPSBwY2lfZ2V0X3Nsb3QocGFyZW50LCBQQ0lfREVWRk4ocF9zbG90LT5kZXZpY2UsIGZuKSk7CisJCWlmICghZGV2KQogCQkJY29udGludWU7CiAJCWlmICgoZGV2LT5jbGFzcyA+PiAxNikgPT0gUENJX0JBU0VfQ0xBU1NfRElTUExBWSkgewogCQkJZXJyKCJDYW5ub3QgaG90LWFkZCBkaXNwbGF5IGRldmljZSAlc1xuIiwKQEAgLTY1LDI3ICs5MCw3IEBACiAJCX0KIAkJaWYgKChkZXYtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9CUklER0UpIHx8CiAJCQkJKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0NBUkRCVVMpKSB7Ci0JCQkvKiBGaW5kIGFuIHVudXNlZCBidXMgbnVtYmVyIGZvciB0aGUgbmV3IGJyaWRnZSAqLwotCQkJc3RydWN0IHBjaV9idXMgKmNoaWxkOwotCQkJdW5zaWduZWQgY2hhciBidXNuciwgc3RhcnQgPSBwYXJlbnQtPnNlY29uZGFyeTsKLQkJCXVuc2lnbmVkIGNoYXIgZW5kID0gcGFyZW50LT5zdWJvcmRpbmF0ZTsKLQkJCWZvciAoYnVzbnIgPSBzdGFydDsgYnVzbnIgPD0gZW5kOyBidXNucisrKSB7Ci0JCQkJaWYgKCFwY2lfZmluZF9idXMocGNpX2RvbWFpbl9ucihwYXJlbnQpLAotCQkJCQkJCWJ1c25yKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoYnVzbnIgPj0gZW5kKSB7Ci0JCQkJZXJyKCJObyBmcmVlIGJ1cyBmb3IgaG90LWFkZGVkIGJyaWRnZVxuIik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQljaGlsZCA9IHBjaV9hZGRfbmV3X2J1cyhwYXJlbnQsIGRldiwgYnVzbnIpOwotCQkJaWYgKCFjaGlsZCkgewotCQkJCWVycigiQ2Fubm90IGFkZCBuZXcgYnVzIGZvciAlc1xuIiwKLQkJCQkJCXBjaV9uYW1lKGRldikpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJY2hpbGQtPnN1Ym9yZGluYXRlID0gcGNpX2RvX3NjYW5fYnVzKGNoaWxkKTsKLQkJCXBjaV9idXNfc2l6ZV9icmlkZ2VzKGNoaWxkKTsKKwkJCXBjaWVocF9hZGRfYnJpZGdlKGRldik7CiAJCX0KIAkJLyogVEJEOiBwcm9ncmFtIGZpcm13YXJlIHByb3ZpZGVkIF9IUFAgdmFsdWVzICovCiAJCS8qIHByb2dyYW1fZndfcHJvdmlkZWRfdmFsdWVzKGRldik7ICovCkBAIC05Myw3ICs5OCw2IEBACiAKIAlwY2lfYnVzX2Fzc2lnbl9yZXNvdXJjZXMocGFyZW50KTsKIAlwY2lfYnVzX2FkZF9kZXZpY2VzKHBhcmVudCk7Ci0JcGNpX2VuYWJsZV9icmlkZ2VzKHBhcmVudCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwcm1fYWNwaS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBybV9hY3BpLmMKaW5kZXggYWUyNDRlMi4uMmJkYjMwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBybV9hY3BpLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBybV9hY3BpLmMKQEAgLTE3NCw3ICsxNzQsOSBAQAogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlhY3BpX2hhbmRsZSBjaGFuZGxlLCBoYW5kbGUgPSBERVZJQ0VfQUNQSV9IQU5ETEUoJihkZXYtPmRldikpOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2OworCXN0cnVjdCBwY2lfYnVzICpwYXJlbnQ7CiAJdTggKnBhdGhfbmFtZTsKKwogCS8qCiAJICogUGVyIFBDSSBmaXJtd2FyZSBzcGVjaWZpY2F0aW9uLCB3ZSBzaG91bGQgcnVuIHRoZSBBQ1BJIF9PU0MKIAkgKiBtZXRob2QgdG8gZ2V0IGNvbnRyb2wgb2YgaG90cGx1ZyBoYXJkd2FyZSBiZWZvcmUgdXNpbmcgaXQuCkBAIC0xOTAsMTcgKzE5MiwxOCBAQAogCQkgKi8KIAkJaWYgKCFwZGV2IHx8ICFwZGV2LT5idXMtPnBhcmVudCkKIAkJCWJyZWFrOworCQlwYXJlbnQgPSBwZGV2LT5idXMtPnBhcmVudDsKIAkJZGJnKCJDb3VsZCBub3QgZmluZCAlcyBpbiBhY3BpIG5hbWVzcGFjZSwgdHJ5aW5nIHBhcmVudFxuIiwKIAkJCQlwY2lfbmFtZShwZGV2KSk7Ci0JCWlmICghcGRldi0+YnVzLT5wYXJlbnQtPnNlbGYpCisJCWlmICghcGFyZW50LT5zZWxmKQogCQkJLyogUGFyZW50IG11c3QgYmUgYSBob3N0IGJyaWRnZSAqLwogCQkJaGFuZGxlID0gYWNwaV9nZXRfcGNpX3Jvb3RicmlkZ2VfaGFuZGxlKAotCQkJCQlwY2lfZG9tYWluX25yKHBkZXYtPmJ1cy0+cGFyZW50KSwKLQkJCQkJcGRldi0+YnVzLT5wYXJlbnQtPm51bWJlcik7CisJCQkJCXBjaV9kb21haW5fbnIocGFyZW50KSwKKwkJCQkJcGFyZW50LT5udW1iZXIpOwogCQllbHNlCiAJCQloYW5kbGUgPSBERVZJQ0VfQUNQSV9IQU5ETEUoCi0JCQkJCSYocGRldi0+YnVzLT5wYXJlbnQtPnNlbGYtPmRldikpOwotCQlwZGV2ID0gcGRldi0+YnVzLT5wYXJlbnQtPnNlbGY7CisJCQkJCSYocGFyZW50LT5zZWxmLT5kZXYpKTsKKwkJcGRldiA9IHBhcmVudC0+c2VsZjsKIAl9CiAKIAl3aGlsZSAoaGFuZGxlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYWRscGFyX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhZGxwYXJfY29yZS5jCmluZGV4IGNjMDM2MDkuLjdkOTNkYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhZGxwYXJfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhZGxwYXJfY29yZS5jCkBAIC0xMTIsMjggKzExMiw2IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBycGFkbHBhcl9jbGFpbV9vbmVfYnVzKHN0cnVjdCBwY2lfYnVzICpiKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmxkOwotCXN0cnVjdCBwY2lfYnVzICpjaGlsZF9idXM7Ci0KLQlmb3IgKGxkID0gYi0+ZGV2aWNlcy5uZXh0OyBsZCAhPSAmYi0+ZGV2aWNlczsgbGQgPSBsZC0+bmV4dCkgewotCQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gcGNpX2Rldl9iKGxkKTsKLQkJaW50IGk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJCXN0cnVjdCByZXNvdXJjZSAqciA9ICZkZXYtPnJlc291cmNlW2ldOwotCi0JCQlpZiAoci0+cGFyZW50IHx8ICFyLT5zdGFydCB8fCAhci0+ZmxhZ3MpCi0JCQkJY29udGludWU7Ci0JCQlycGFwaHBfY2xhaW1fcmVzb3VyY2UoZGV2LCBpKTsKLQkJfQotCX0KLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGRfYnVzLCAmYi0+Y2hpbGRyZW4sIG5vZGUpCi0JCXJwYWRscGFyX2NsYWltX29uZV9idXMoY2hpbGRfYnVzKTsKLX0KLQogc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpkbHBhcl9maW5kX25ld19kZXYoc3RydWN0IHBjaV9idXMgKnBhcmVudCwKIAkJCQkJc3RydWN0IGRldmljZV9ub2RlICpkZXZfZG4pCiB7CkBAIC0xNTQsNyArMTMyLDggQEAKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYiA9IHBkbi0+cGhiOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOwogCi0JcnBhcGhwX2VlaF9pbml0X25vZGVzKGRuKTsKKwllZWhfYWRkX2RldmljZV90cmVlX2Vhcmx5KGRuKTsKKwogCS8qIEFkZCBFQURTIGRldmljZSB0byBQSEIgYnVzLCBhZGRpbmcgbmV3IGVudHJ5IHRvIGJ1cy0+ZGV2aWNlcyAqLwogCWRldiA9IG9mX2NyZWF0ZV9wY2lfZGV2KGRuLCBwaGItPmJ1cywgcGRuLT5kZXZmbik7CiAJaWYgKCFkZXYpIHsKQEAgLTE3MCw3ICsxNDksNyBAQAogCXJwYXBocF9pbml0X25ld19kZXZzKGRldi0+c3Vib3JkaW5hdGUpOwogCiAJLyogQ2xhaW0gbmV3IGJ1cyByZXNvdXJjZXMgKi8KLQlycGFkbHBhcl9jbGFpbV9vbmVfYnVzKGRldi0+YnVzKTsKKwlwY2liaW9zX2NsYWltX29uZV9idXMoZGV2LT5idXMpOwogCiAJLyogaW9yZW1hcCgpIGZvciBjaGlsZCBidXMsIHdoaWNoIG1heSBvciBtYXkgbm90IHN1Y2NlZWQgKi8KIAkodm9pZCkgcmVtYXBfYnVzX3JhbmdlKGRldi0+YnVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX3BjaS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHBfcGNpLmMKaW5kZXggNGIzNTA5Ny4uMzk2YjU0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHBfcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHBfcGNpLmMKQEAgLTYyLDI4ICs2Miw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChycGFwaHBfZmluZF9wY2lfYnVzKTsKIAotaW50IHJwYXBocF9jbGFpbV9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcmVzb3VyY2UpCi17Ci0Jc3RydWN0IHJlc291cmNlICpyZXMgPSAmZGV2LT5yZXNvdXJjZVtyZXNvdXJjZV07Ci0Jc3RydWN0IHJlc291cmNlICpyb290ID0gcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGRldiwgcmVzKTsKLQljaGFyICpkdHlwZSA9IHJlc291cmNlIDwgUENJX0JSSURHRV9SRVNPVVJDRVMgPyAiZGV2aWNlIiA6ICJicmlkZ2UiOwotCWludCBlcnIgPSAtRUlOVkFMOwotCi0JaWYgKHJvb3QgIT0gTlVMTCkgewotCQllcnIgPSByZXF1ZXN0X3Jlc291cmNlKHJvb3QsIHJlcyk7Ci0JfQotCi0JaWYgKGVycikgewotCQllcnIoIlBDSTogJXMgcmVnaW9uICVkIG9mICVzICVzIFslbHg6JWx4XVxuIiwKLQkJICAgIHJvb3QgPyAiQWRkcmVzcyBzcGFjZSBjb2xsaXNpb24gb24iIDoKLQkJICAgICJObyBwYXJlbnQgZm91bmQgZm9yIiwKLQkJICAgIHJlc291cmNlLCBkdHlwZSwgcGNpX25hbWUoZGV2KSwgcmVzLT5zdGFydCwgcmVzLT5lbmQpOwotCX0KLQlyZXR1cm4gZXJyOwotfQotCi1FWFBPUlRfU1lNQk9MX0dQTChycGFwaHBfY2xhaW1fcmVzb3VyY2UpOwotCiBzdGF0aWMgaW50IHJwYXBocF9nZXRfc2Vuc29yX3N0YXRlKHN0cnVjdCBzbG90ICpzbG90LCBpbnQgKnN0YXRlKQogewogCWludCByYzsKQEAgLTE3Nyw3ICsxNTUsNyBAQAogCiAJCQkJaWYgKHItPnBhcmVudCB8fCAhci0+c3RhcnQgfHwgIXItPmZsYWdzKQogCQkJCQljb250aW51ZTsKLQkJCQlycGFwaHBfY2xhaW1fcmVzb3VyY2UoZGV2LCBpKTsKKwkJCQlwY2lfY2xhaW1fcmVzb3VyY2UoZGV2LCBpKTsKIAkJCX0KIAkJfQogCX0KQEAgLTI4NywxOCArMjY1LDYgQEAKIAlyZXR1cm4gZGV2OwogfQogCi12b2lkIHJwYXBocF9lZWhfaW5pdF9ub2RlcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc2liOwotCi0JZm9yIChzaWIgPSBkbi0+Y2hpbGQ7IHNpYjsgc2liID0gc2liLT5zaWJsaW5nKSAKLQkJcnBhcGhwX2VlaF9pbml0X25vZGVzKHNpYik7Ci0JZWVoX2FkZF9kZXZpY2VfZWFybHkoZG4pOwotCXJldHVybjsKLQkKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHJwYXBocF9lZWhfaW5pdF9ub2Rlcyk7Ci0KIHN0YXRpYyB2b2lkIHByaW50X3Nsb3RfcGNpX2Z1bmNzKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkbjsKQEAgLTMyNCw3ICsyOTAsNyBAQAogCWlmICghZG4pCiAJCWdvdG8gZXhpdDsKIAotCXJwYXBocF9lZWhfaW5pdF9ub2Rlcyhkbik7CisJZWVoX2FkZF9kZXZpY2VfdHJlZV9lYXJseShkbik7CiAJZGV2ID0gcnBhcGhwX3BjaV9jb25maWdfc2xvdChidXMpOwogCWlmICghZGV2KSB7CiAJCWVycigiJXM6IGNhbid0IGZpbmQgYW55IGRldmljZXMuXG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtMzcwLDEzICszMzYsMTQgQEAKIAogc3RhdGljIGludCBzZXR1cF9wY2lfaG90cGx1Z19zbG90X2luZm8oc3RydWN0IHNsb3QgKnNsb3QpCiB7CisJc3RydWN0IGhvdHBsdWdfc2xvdF9pbmZvICpob3RwbHVnX3Nsb3RfaW5mbyA9IHNsb3QtPmhvdHBsdWdfc2xvdC0+aW5mbzsKKwogCWRiZygiJXMgSW5pdGlsaXplIHRoZSBQQ0kgc2xvdCdzIGhvdHBsdWctPmluZm8gc3RydWN0dXJlIC4uLlxuIiwKIAkgICAgX19GVU5DVElPTl9fKTsKLQlycGFwaHBfZ2V0X3Bvd2VyX3N0YXR1cyhzbG90LCAmc2xvdC0+aG90cGx1Z19zbG90LT5pbmZvLT5wb3dlcl9zdGF0dXMpOworCXJwYXBocF9nZXRfcG93ZXJfc3RhdHVzKHNsb3QsICZob3RwbHVnX3Nsb3RfaW5mby0+cG93ZXJfc3RhdHVzKTsKIAlycGFwaHBfZ2V0X3BjaV9hZGFwdGVyX3N0YXR1cyhzbG90LCAxLAotCQkJCSAgICAgICZzbG90LT5ob3RwbHVnX3Nsb3QtPmluZm8tPgotCQkJCSAgICAgIGFkYXB0ZXJfc3RhdHVzKTsKLQlpZiAoc2xvdC0+aG90cGx1Z19zbG90LT5pbmZvLT5hZGFwdGVyX3N0YXR1cyA9PSBOT1RfVkFMSUQpIHsKKwkJCQkgICAgICAmaG90cGx1Z19zbG90X2luZm8tPmFkYXB0ZXJfc3RhdHVzKTsKKwlpZiAoaG90cGx1Z19zbG90X2luZm8tPmFkYXB0ZXJfc3RhdHVzID09IE5PVF9WQUxJRCkgewogCQllcnIoIiVzOiBOT1RfVkFMSUQ6IHNraXAgZG4tPmZ1bGxfbmFtZT0lc1xuIiwKIAkJICAgIF9fRlVOQ1RJT05fXywgc2xvdC0+ZG4tPmZ1bGxfbmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHAuaCBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwLmgKaW5kZXggMDhhZDI2YS4uY2UwZTliNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHAuaAorKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocC5oCkBAIC05OCw2ICs5OCwxMCBAQAogCWVudW0gcGNpX2J1c19zcGVlZCBzcGVlZDsKIAl1MzIgZmlyc3Rfc2xvdDsJCS8qIEZpcnN0IHBoeXNpY2FsIHNsb3QgbnVtYmVyICovCiAJdTggc2xvdF9idXM7CQkvKiBCdXMgd2hlcmUgdGhlIHNsb3RzIGhhbmRsZWQgYnkgdGhpcyBjb250cm9sbGVyIHNpdCAqLworCXUzMiBjYXBfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgbW1pb19iYXNlOworCXVuc2lnbmVkIGxvbmcgbW1pb19zaXplOworCXZvbGF0aWxlIGludCBjbWRfYnVzeTsKIH07CiAKIHN0cnVjdCBob3RwbHVnX3BhcmFtcyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9jb3JlLmMKaW5kZXggNjM2MjhlMC4uYTJiM2YwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX2NvcmUuYwpAQCAtNjUsNiArNjUsNyBAQAogc3RhdGljIGludCBnZXRfYXR0ZW50aW9uX3N0YXR1cwkoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCwgdTggKnZhbHVlKTsKIHN0YXRpYyBpbnQgZ2V0X2xhdGNoX3N0YXR1cwkoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCwgdTggKnZhbHVlKTsKIHN0YXRpYyBpbnQgZ2V0X2FkYXB0ZXJfc3RhdHVzCShzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCB1OCAqdmFsdWUpOworc3RhdGljIGludCBnZXRfYWRkcmVzcwkJKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QsIHUzMiAqdmFsdWUpOwogc3RhdGljIGludCBnZXRfbWF4X2J1c19zcGVlZAkoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCwgZW51bSBwY2lfYnVzX3NwZWVkICp2YWx1ZSk7CiBzdGF0aWMgaW50IGdldF9jdXJfYnVzX3NwZWVkCShzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCBlbnVtIHBjaV9idXNfc3BlZWQgKnZhbHVlKTsKIApAQCAtNzcsNiArNzgsNyBAQAogCS5nZXRfYXR0ZW50aW9uX3N0YXR1cyA9CWdldF9hdHRlbnRpb25fc3RhdHVzLAogCS5nZXRfbGF0Y2hfc3RhdHVzID0JZ2V0X2xhdGNoX3N0YXR1cywKIAkuZ2V0X2FkYXB0ZXJfc3RhdHVzID0JZ2V0X2FkYXB0ZXJfc3RhdHVzLAorCS5nZXRfYWRkcmVzcyA9CQlnZXRfYWRkcmVzcywKIAkuZ2V0X21heF9idXNfc3BlZWQgPQlnZXRfbWF4X2J1c19zcGVlZCwKIAkuZ2V0X2N1cl9idXNfc3BlZWQgPQlnZXRfY3VyX2J1c19zcGVlZCwKIH07CkBAIC0zMTQsNiArMzE2LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZ2V0X2FkZHJlc3MgKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdCwgdTMyICp2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IGdldF9zbG90IChob3RwbHVnX3Nsb3QsIF9fRlVOQ1RJT05fXyk7CisJc3RydWN0IHBjaV9idXMgKmJ1cyA9IHNsb3QtPmN0cmwtPnBjaV9kZXYtPnN1Ym9yZGluYXRlOworCisJZGJnKCIlcyAtIHBoeXNpY2FsX3Nsb3QgPSAlc1xuIiwgX19GVU5DVElPTl9fLCBob3RwbHVnX3Nsb3QtPm5hbWUpOworCisJKnZhbHVlID0gKHBjaV9kb21haW5fbnIoYnVzKSA8PCAxNikgfCAoc2xvdC0+YnVzIDw8IDgpIHwgc2xvdC0+ZGV2aWNlOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZ2V0X21heF9idXNfc3BlZWQgKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdCwgZW51bSBwY2lfYnVzX3NwZWVkICp2YWx1ZSkKIHsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IGdldF9zbG90IChob3RwbHVnX3Nsb3QsIF9fRlVOQ1RJT05fXyk7CkBAIC0zNzcsOCArMzkxLDYgQEAKIAkJZ290byBlcnJfb3V0X2ZyZWVfY3RybDsKIAl9CiAKLQljdHJsLT5wY2lfZGV2ID0gcGRldjsgIC8qIHBjaV9kZXYgb2YgdGhlIFAyUCBicmlkZ2UgKi8KLQogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBjdHJsKTsKIAogCWN0cmwtPnBjaV9idXMgPSBrbWFsbG9jIChzaXplb2YgKCpjdHJsLT5wY2lfYnVzKSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9jdHJsLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9jdHJsLmMKaW5kZXggNTg2MTkzNS4uMjVjY2IwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfY3RybC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX2N0cmwuYwpAQCAtMjQ4LDcgKzI0OCw2IEBACiAJCXVwKCZjdHJsLT5jcml0X3NlY3QpOwogCQlyZXR1cm4gV1JPTkdfQlVTX0ZSRVFVRU5DWTsKIAl9Ci0Jd2FpdF9mb3JfY3RybF9pcnEgKGN0cmwpOwogCQkKIAlpZiAoKHJjID0gcF9zbG90LT5ocGNfb3BzLT5jaGVja19jbWRfc3RhdHVzKGN0cmwpKSkgewogCQllcnIoIiVzOiBDYW4ndCBzZXQgYnVzIHNwZWVkL21vZGUgaW4gdGhlIGNhc2Ugb2YgYWRhcHRlciAmIGJ1cyBtaXNtYXRjaFxuIiwKQEAgLTMzMCw5ICszMjksNiBAQAogCQl1cCgmY3RybC0+Y3JpdF9zZWN0KTsKIAkJcmV0dXJuIC0xOwogCX0KLQkJCQotCS8qIFdhaXQgZm9yIHRoZSBjb21tYW5kIHRvIGNvbXBsZXRlICovCi0Jd2FpdF9mb3JfY3RybF9pcnEgKGN0cmwpOwogCQogCXJjID0gcF9zbG90LT5ocGNfb3BzLT5jaGVja19jbWRfc3RhdHVzKGN0cmwpOwogCWlmIChyYykgewpAQCAtMzUyLDcgKzM0OCw2IEBACiAJCQl1cCgmY3RybC0+Y3JpdF9zZWN0KTsKIAkJCXJldHVybiBXUk9OR19CVVNfRlJFUVVFTkNZOwogCQl9Ci0JCXdhaXRfZm9yX2N0cmxfaXJxIChjdHJsKTsKIAkJCiAJCWlmICgocmMgPSBwX3Nsb3QtPmhwY19vcHMtPmNoZWNrX2NtZF9zdGF0dXMoY3RybCkpKSB7CiAJCQllcnIoIiVzOiBDYW4ndCBzZXQgYnVzIHNwZWVkL21vZGUgaW4gdGhlIGNhc2Ugb2YgYWRhcHRlciAmIGJ1cyBtaXNtYXRjaFxuIiwKQEAgLTM2Nyw3ICszNjIsNiBAQAogCQkJdXAoJmN0cmwtPmNyaXRfc2VjdCk7CiAJCQlyZXR1cm4gcmM7CiAJCX0KLQkJd2FpdF9mb3JfY3RybF9pcnEgKGN0cmwpOwogCiAJCWlmICgocmMgPSBwX3Nsb3QtPmhwY19vcHMtPmNoZWNrX2NtZF9zdGF0dXMoY3RybCkpKSB7CiAJCQllcnIoIiVzOiBGYWlsZWQgdG8gZW5hYmxlIHNsb3QsIGVycm9yIGNvZGUoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKQEAgLTQ5NCw3ICs0ODgsNiBAQAogCQl1cCgmY3RybC0+Y3JpdF9zZWN0KTsKIAkJcmV0dXJuIHJjOwogCX0KLQl3YWl0X2Zvcl9jdHJsX2lycSAoY3RybCk7CiAKIAlpZiAoKHJjID0gcF9zbG90LT5ocGNfb3BzLT5jaGVja19jbWRfc3RhdHVzKGN0cmwpKSkgewogCQllcnIoIiVzOiBGYWlsZWQgdG8gZW5hYmxlIHNsb3QsIGVycm9yIGNvZGUoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKQEAgLTUzMiw5ICs1MjUsNiBAQAogCiAJcF9zbG90LT5ocGNfb3BzLT5ncmVlbl9sZWRfb24ocF9zbG90KTsKIAotCS8qIFdhaXQgZm9yIHRoZSBjb21tYW5kIHRvIGNvbXBsZXRlICovCi0Jd2FpdF9mb3JfY3RybF9pcnEgKGN0cmwpOwotCiAJLyogRG9uZSB3aXRoIGV4Y2x1c2l2ZSBoYXJkd2FyZSBhY2Nlc3MgKi8KIAl1cCgmY3RybC0+Y3JpdF9zZWN0KTsKIApAQCAtNTUyLDggKzU0Miw2IEBACiAJCXVwKCZjdHJsLT5jcml0X3NlY3QpOwogCQlyZXR1cm4gcmM7CiAJfQotCS8qIFdhaXQgZm9yIHRoZSBjb21tYW5kIHRvIGNvbXBsZXRlICovCi0Jd2FpdF9mb3JfY3RybF9pcnEgKGN0cmwpOwogCiAJcmMgPSBwX3Nsb3QtPmhwY19vcHMtPmNoZWNrX2NtZF9zdGF0dXMoY3RybCk7CiAJaWYgKHJjKSB7CkBAIC02MDMsOCArNTkxLDYgQEAKIAkJdXAoJmN0cmwtPmNyaXRfc2VjdCk7CiAJCXJldHVybiByYzsKIAl9Ci0JLyogV2FpdCBmb3IgdGhlIGNvbW1hbmQgdG8gY29tcGxldGUgKi8KLQl3YWl0X2Zvcl9jdHJsX2lycSAoY3RybCk7CiAKIAlyYyA9IHBfc2xvdC0+aHBjX29wcy0+Y2hlY2tfY21kX3N0YXR1cyhjdHJsKTsKIAlpZiAocmMpIHsKQEAgLTYyMSw4ICs2MDcsNiBAQAogCQl1cCgmY3RybC0+Y3JpdF9zZWN0KTsKIAkJcmV0dXJuIHJjOwogCX0KLQkvKiBXYWl0IGZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZSAqLwotCXdhaXRfZm9yX2N0cmxfaXJxIChjdHJsKTsKIAogCS8qIERvbmUgd2l0aCBleGNsdXNpdmUgaGFyZHdhcmUgYWNjZXNzICovCiAJdXAoJmN0cmwtPmNyaXRfc2VjdCk7CkBAIC02NzYsOSArNjYwLDYgQEAKIAogCQkJcF9zbG90LT5ocGNfb3BzLT5ncmVlbl9sZWRfb2ZmKHBfc2xvdCk7CiAKLQkJCS8qIFdhaXQgZm9yIHRoZSBjb21tYW5kIHRvIGNvbXBsZXRlICovCi0JCQl3YWl0X2Zvcl9jdHJsX2lycSAocF9zbG90LT5jdHJsKTsKLQogCQkJLyogRG9uZSB3aXRoIGV4Y2x1c2l2ZSBoYXJkd2FyZSBhY2Nlc3MgKi8KIAkJCXVwKCZwX3Nsb3QtPmN0cmwtPmNyaXRfc2VjdCk7CiAJCX0KQEAgLTc5MCwxNCArNzcxLDkgQEAKIAkJCQkJCWRvd24oJmN0cmwtPmNyaXRfc2VjdCk7CiAKIAkJCQkJCXBfc2xvdC0+aHBjX29wcy0+Z3JlZW5fbGVkX29uKHBfc2xvdCk7Ci0JCQkJCQkvKiBXYWl0IGZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZSAqLwotCQkJCQkJd2FpdF9mb3JfY3RybF9pcnEgKGN0cmwpOwogCiAJCQkJCQlwX3Nsb3QtPmhwY19vcHMtPnNldF9hdHRlbnRpb25fc3RhdHVzKHBfc2xvdCwgMCk7CiAKLQkJCQkJCS8qIFdhaXQgZm9yIHRoZSBjb21tYW5kIHRvIGNvbXBsZXRlICovCi0JCQkJCQl3YWl0X2Zvcl9jdHJsX2lycSAoY3RybCk7Ci0KIAkJCQkJCS8qIERvbmUgd2l0aCBleGNsdXNpdmUgaGFyZHdhcmUgYWNjZXNzICovCiAJCQkJCQl1cCgmY3RybC0+Y3JpdF9zZWN0KTsKIAkJCQkJCWJyZWFrOwpAQCAtODA2LDEyICs3ODIsOCBAQAogCQkJCQkJZG93bigmY3RybC0+Y3JpdF9zZWN0KTsKIAogCQkJCQkJcF9zbG90LT5ocGNfb3BzLT5ncmVlbl9sZWRfb2ZmKHBfc2xvdCk7Ci0JCQkJCQkvKiBXYWl0IGZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZSAqLwotCQkJCQkJd2FpdF9mb3JfY3RybF9pcnEgKGN0cmwpOwogCiAJCQkJCQlwX3Nsb3QtPmhwY19vcHMtPnNldF9hdHRlbnRpb25fc3RhdHVzKHBfc2xvdCwgMCk7Ci0JCQkJCQkvKiBXYWl0IGZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZSAqLwotCQkJCQkJd2FpdF9mb3JfY3RybF9pcnEgKGN0cmwpOwogCiAJCQkJCQkvKiBEb25lIHdpdGggZXhjbHVzaXZlIGhhcmR3YXJlIGFjY2VzcyAqLwogCQkJCQkJdXAoJmN0cmwtPmNyaXRfc2VjdCk7CkBAIC04NDUsMTQgKzgxNyw5IEBACiAKIAkJCQkJLyogYmxpbmsgZ3JlZW4gTEVEIGFuZCB0dXJuIG9mZiBhbWJlciAqLwogCQkJCQlwX3Nsb3QtPmhwY19vcHMtPmdyZWVuX2xlZF9ibGluayhwX3Nsb3QpOwotCQkJCQkvKiBXYWl0IGZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZSAqLwotCQkJCQl3YWl0X2Zvcl9jdHJsX2lycSAoY3RybCk7CiAJCQkJCQogCQkJCQlwX3Nsb3QtPmhwY19vcHMtPnNldF9hdHRlbnRpb25fc3RhdHVzKHBfc2xvdCwgMCk7CiAKLQkJCQkJLyogV2FpdCBmb3IgdGhlIGNvbW1hbmQgdG8gY29tcGxldGUgKi8KLQkJCQkJd2FpdF9mb3JfY3RybF9pcnEgKGN0cmwpOwotCiAJCQkJCS8qIERvbmUgd2l0aCBleGNsdXNpdmUgaGFyZHdhcmUgYWNjZXNzICovCiAJCQkJCXVwKCZjdHJsLT5jcml0X3NlY3QpOwogCkBAIC04NzAsMTIgKzgzNyw4IEBACiAJCQkJCWRvd24oJmN0cmwtPmNyaXRfc2VjdCk7CiAKIAkJCQkJcF9zbG90LT5ocGNfb3BzLT5zZXRfYXR0ZW50aW9uX3N0YXR1cyhwX3Nsb3QsIDEpOwotCQkJCQkvKiBXYWl0IGZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZSAqLwotCQkJCQl3YWl0X2Zvcl9jdHJsX2lycSAoY3RybCk7CiAJCQkJCQogCQkJCQlwX3Nsb3QtPmhwY19vcHMtPmdyZWVuX2xlZF9vZmYocF9zbG90KTsKLQkJCQkJLyogV2FpdCBmb3IgdGhlIGNvbW1hbmQgdG8gY29tcGxldGUgKi8KLQkJCQkJd2FpdF9mb3JfY3RybF9pcnEgKGN0cmwpOwogCiAJCQkJCS8qIERvbmUgd2l0aCBleGNsdXNpdmUgaGFyZHdhcmUgYWNjZXNzICovCiAJCQkJCXVwKCZjdHJsLT5jcml0X3NlY3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfaHBjLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9ocGMuYwppbmRleCA5OTg3YTZmLi5iNDIyNmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9ocGMuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9ocGMuYwpAQCAtMjc1LDYgKzI3NSwyNSBAQAogCXJldHVybjsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgc2hwY193YWl0X2NtZChzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwl1bnNpZ25lZCBpbnQgdGltZW91dF9tc2VjID0gc2hwY2hwX3BvbGxfbW9kZSA/IDIwMDAgOiAxMDAwOworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXModGltZW91dF9tc2VjKTsKKwlpbnQgcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChjdHJsLT5xdWV1ZSwKKwkJCQkJCSAgIWN0cmwtPmNtZF9idXN5LCB0aW1lb3V0KTsKKwlpZiAoIXJjKSB7CisJCXJldHZhbCA9IC1FSU87CisJCWVycigiQ29tbWFuZCBub3QgY29tcGxldGVkIGluICVkIG1zZWNcbiIsIHRpbWVvdXRfbXNlYyk7CisJfSBlbHNlIGlmIChyYyA8IDApIHsKKwkJcmV0dmFsID0gLUVJTlRSOworCQlpbmZvKCJDb21tYW5kIHdhcyBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbFxuIik7CisJfQorCWN0cmwtPmNtZF9idXN5ID0gMDsKKworCXJldHVybiByZXR2YWw7Cit9CisKIHN0YXRpYyBpbnQgc2hwY193cml0ZV9jbWQoc3RydWN0IHNsb3QgKnNsb3QsIHU4IHRfc2xvdCwgdTggY21kKQogewogCXN0cnVjdCBwaHBfY3Rscl9zdGF0ZV9zICpwaHBfY3RsciA9IHNsb3QtPmN0cmwtPmhwY19jdGxyX2hhbmRsZTsKQEAgLTMxNCw4ICszMzMsMTQgQEAKIAkvKiBUbyBtYWtlIHN1cmUgdGhlIENvbnRyb2xsZXIgQnVzeSBiaXQgaXMgMCBiZWZvcmUgd2Ugc2VuZCBvdXQgdGhlCiAJICogY29tbWFuZC4gCiAJICovCisJc2xvdC0+Y3RybC0+Y21kX2J1c3kgPSAxOwogCXdyaXRldyh0ZW1wX3dvcmQsIHBocF9jdGxyLT5jcmVnICsgQ01EKTsKIAorCS8qCisJICogV2FpdCBmb3IgY29tbWFuZCBjb21wbGV0aW9uLgorCSAqLworCXJldHZhbCA9IHNocGNfd2FpdF9jbWQoc2xvdC0+Y3RybCk7CisKIAlEQkdfTEVBVkVfUk9VVElORSAKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtNjA0LDcgKzYyOSw3IEBACiAJc2VjX2J1c19zdGF0dXMgPSByZWFkdyhwaHBfY3Rsci0+Y3JlZyArIFNFQ19CVVNfQ09ORklHKTsKIAogCWlmIChwaSA9PSAyKSB7Ci0JCSptb2RlID0gKHNlY19idXNfc3RhdHVzICYgMHgwMTAwKSA+PiA3OworCQkqbW9kZSA9IChzZWNfYnVzX3N0YXR1cyAmIDB4MDEwMCkgPj4gODsKIAl9IGVsc2UgewogCQlyZXR2YWwgPSAtMTsKIAl9CkBAIC03OTEsNyArODE2LDcgQEAKIAl9CiAJaWYgKHBocF9jdGxyLT5wY2lfZGV2KSB7CiAJCWlvdW5tYXAocGhwX2N0bHItPmNyZWcpOwotCQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBocF9jdGxyLT5wY2lfZGV2LCAwKSwgcGNpX3Jlc291cmNlX2xlbihwaHBfY3Rsci0+cGNpX2RldiwgMCkpOworCQlyZWxlYXNlX21lbV9yZWdpb24oY3RybC0+bW1pb19iYXNlLCBjdHJsLT5tbWlvX3NpemUpOwogCQlwaHBfY3Rsci0+cGNpX2RldiA9IE5VTEw7CiAJfQogCkBAIC0xMDU4LDEyICsxMDgzLDEzIEBACiAJaWYgKGludHJfbG9jICYgMHgwMDAxKSB7CiAJCS8qIAogCQkgKiBDb21tYW5kIENvbXBsZXRlIEludGVycnVwdCBQZW5kaW5nIAotCQkgKiBSTyBvbmx5IC0gY2xlYXIgYnkgd3JpdGluZyAwIHRvIHRoZSBDb21tYW5kIENvbXBsZXRpb24KKwkJICogUk8gb25seSAtIGNsZWFyIGJ5IHdyaXRpbmcgMSB0byB0aGUgQ29tbWFuZCBDb21wbGV0aW9uCiAJCSAqIERldGVjdCBiaXQgaW4gQ29udHJvbGxlciBTRVJSLUlOVCByZWdpc3RlcgogCQkgKi8KIAkJdGVtcF9kd29yZCA9IHJlYWRsKHBocF9jdGxyLT5jcmVnICsgU0VSUl9JTlRSX0VOQUJMRSk7Ci0JCXRlbXBfZHdvcmQgJj0gMHhmZmZlZmZmZjsKKwkJdGVtcF9kd29yZCAmPSAweGZmZmRmZmZmOwogCQl3cml0ZWwodGVtcF9kd29yZCwgcGhwX2N0bHItPmNyZWcgKyBTRVJSX0lOVFJfRU5BQkxFKTsKKwkJY3RybC0+Y21kX2J1c3kgPSAwOwogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmN0cmwtPnF1ZXVlKTsKIAl9CiAKQEAgLTExMjEsNyArMTE0Nyw2IEBACiAJaW50IHJldHZhbCA9IDA7CiAJdTggcGk7CiAJdTMyIHNsb3RfYXZhaWwxLCBzbG90X2F2YWlsMjsKLQlpbnQgc2xvdF9udW07CiAKIAlEQkdfRU5URVJfUk9VVElORSAKIApAQCAtMTE0MCwzOSArMTE2NSwzOSBAQAogCXNsb3RfYXZhaWwyID0gcmVhZGwocGhwX2N0bHItPmNyZWcgKyBTTE9UX0FWQUlMMik7CiAKIAlpZiAocGkgPT0gMikgewotCQlpZiAoKHNsb3RfbnVtID0gKChzbG90X2F2YWlsMiAmIFNMT1RfMTMzTUhaX1BDSVhfNTMzKSA+PiAyNykgICkgIT0gMCApCisJCWlmIChzbG90X2F2YWlsMiAmIFNMT1RfMTMzTUhaX1BDSVhfNTMzKQogCQkJYnVzX3NwZWVkID0gUENJWF8xMzNNSFpfNTMzOwotCQllbHNlIGlmICgoc2xvdF9udW0gPSAoKHNsb3RfYXZhaWwyICYgU0xPVF8xMDBNSFpfUENJWF81MzMpID4+IDIzKSAgKSAhPSAwICkKKwkJZWxzZSBpZiAoc2xvdF9hdmFpbDIgJiBTTE9UXzEwME1IWl9QQ0lYXzUzMykKIAkJCWJ1c19zcGVlZCA9IFBDSVhfMTAwTUhaXzUzMzsKLQkJZWxzZSBpZiAoKHNsb3RfbnVtID0gKChzbG90X2F2YWlsMiAmIFNMT1RfNjZNSFpfUENJWF81MzMpID4+IDE5KSAgKSAhPSAwICkKKwkJZWxzZSBpZiAoc2xvdF9hdmFpbDIgJiBTTE9UXzY2TUhaX1BDSVhfNTMzKQogCQkJYnVzX3NwZWVkID0gUENJWF82Nk1IWl81MzM7Ci0JCWVsc2UgaWYgKChzbG90X251bSA9ICgoc2xvdF9hdmFpbDIgJiBTTE9UXzEzM01IWl9QQ0lYXzI2NikgPj4gMTUpICApICE9IDAgKQorCQllbHNlIGlmIChzbG90X2F2YWlsMiAmIFNMT1RfMTMzTUhaX1BDSVhfMjY2KQogCQkJYnVzX3NwZWVkID0gUENJWF8xMzNNSFpfMjY2OwotCQllbHNlIGlmICgoc2xvdF9udW0gPSAoKHNsb3RfYXZhaWwyICYgU0xPVF8xMDBNSFpfUENJWF8yNjYpID4+IDExKSAgKSAhPSAwICkKKwkJZWxzZSBpZiAoc2xvdF9hdmFpbDIgJiBTTE9UXzEwME1IWl9QQ0lYXzI2NikKIAkJCWJ1c19zcGVlZCA9IFBDSVhfMTAwTUhaXzI2NjsKLQkJZWxzZSBpZiAoKHNsb3RfbnVtID0gKChzbG90X2F2YWlsMiAmIFNMT1RfNjZNSFpfUENJWF8yNjYpID4+IDcpICApICE9IDAgKQorCQllbHNlIGlmIChzbG90X2F2YWlsMiAmIFNMT1RfNjZNSFpfUENJWF8yNjYpCiAJCQlidXNfc3BlZWQgPSBQQ0lYXzY2TUhaXzI2NjsKLQkJZWxzZSBpZiAoKHNsb3RfbnVtID0gKChzbG90X2F2YWlsMSAmIFNMT1RfMTMzTUhaX1BDSVgpID4+IDIzKSAgKSAhPSAwICkKKwkJZWxzZSBpZiAoc2xvdF9hdmFpbDEgJiBTTE9UXzEzM01IWl9QQ0lYKQogCQkJYnVzX3NwZWVkID0gUENJWF8xMzNNSFo7Ci0JCWVsc2UgaWYgKChzbG90X251bSA9ICgoc2xvdF9hdmFpbDEgJiBTTE9UXzEwME1IWl9QQ0lYKSA+PiAxNSkgICkgIT0gMCApCisJCWVsc2UgaWYgKHNsb3RfYXZhaWwxICYgU0xPVF8xMDBNSFpfUENJWCkKIAkJCWJ1c19zcGVlZCA9IFBDSVhfMTAwTUhaOwotCQllbHNlIGlmICgoc2xvdF9udW0gPSAoKHNsb3RfYXZhaWwxICYgU0xPVF82Nk1IWl9QQ0lYKSA+PiA3KSAgKSAhPSAwICkKKwkJZWxzZSBpZiAoc2xvdF9hdmFpbDEgJiBTTE9UXzY2TUhaX1BDSVgpCiAJCQlidXNfc3BlZWQgPSBQQ0lYXzY2TUhaOwotCQllbHNlIGlmICgoc2xvdF9udW0gPSAoc2xvdF9hdmFpbDIgJiBTTE9UXzY2TUhaKSkgIT0gMCApCisJCWVsc2UgaWYgKHNsb3RfYXZhaWwyICYgU0xPVF82Nk1IWikKIAkJCWJ1c19zcGVlZCA9IFBDSV82Nk1IWjsKLQkJZWxzZSBpZiAoKHNsb3RfbnVtID0gKHNsb3RfYXZhaWwxICYgU0xPVF8zM01IWikpICE9IDAgKQorCQllbHNlIGlmIChzbG90X2F2YWlsMSAmIFNMT1RfMzNNSFopCiAJCQlidXNfc3BlZWQgPSBQQ0lfMzNNSFo7CiAJCWVsc2UgYnVzX3NwZWVkID0gUENJX1NQRUVEX1VOS05PV047CiAJfSBlbHNlIHsKLQkJaWYgKChzbG90X251bSA9ICgoc2xvdF9hdmFpbDEgJiBTTE9UXzEzM01IWl9QQ0lYKSA+PiAyMykgICkgIT0gMCApCisJCWlmIChzbG90X2F2YWlsMSAmIFNMT1RfMTMzTUhaX1BDSVgpCiAJCQlidXNfc3BlZWQgPSBQQ0lYXzEzM01IWjsKLQkJZWxzZSBpZiAoKHNsb3RfbnVtID0gKChzbG90X2F2YWlsMSAmIFNMT1RfMTAwTUhaX1BDSVgpID4+IDE1KSAgKSAhPSAwICkKKwkJZWxzZSBpZiAoc2xvdF9hdmFpbDEgJiBTTE9UXzEwME1IWl9QQ0lYKQogCQkJYnVzX3NwZWVkID0gUENJWF8xMDBNSFo7Ci0JCWVsc2UgaWYgKChzbG90X251bSA9ICgoc2xvdF9hdmFpbDEgJiBTTE9UXzY2TUhaX1BDSVgpID4+IDcpICApICE9IDAgKQorCQllbHNlIGlmIChzbG90X2F2YWlsMSAmIFNMT1RfNjZNSFpfUENJWCkKIAkJCWJ1c19zcGVlZCA9IFBDSVhfNjZNSFo7Ci0JCWVsc2UgaWYgKChzbG90X251bSA9IChzbG90X2F2YWlsMiAmIFNMT1RfNjZNSFopKSAhPSAwICkKKwkJZWxzZSBpZiAoc2xvdF9hdmFpbDIgJiBTTE9UXzY2TUhaKQogCQkJYnVzX3NwZWVkID0gUENJXzY2TUhaOwotCQllbHNlIGlmICgoc2xvdF9udW0gPSAoc2xvdF9hdmFpbDEgJiBTTE9UXzMzTUhaKSkgIT0gMCApCisJCWVsc2UgaWYgKHNsb3RfYXZhaWwxICYgU0xPVF8zM01IWikKIAkJCWJ1c19zcGVlZCA9IFBDSV8zM01IWjsKIAkJZWxzZSBidXNfc3BlZWQgPSBQQ0lfU1BFRURfVU5LTk9XTjsKIAl9CkBAIC0xMzIxLDE5ICsxMzQ2LDM0IEBACiAJLmNoZWNrX2NtZF9zdGF0dXMJCT0gaHBjX2NoZWNrX2NtZF9zdGF0dXMsCiB9OwogCitpbmxpbmUgc3RhdGljIGludCBzaHBjX2luZGlyZWN0X2NyZWdfcmVhZChzdHJ1Y3QgY29udHJvbGxlciAqY3RybCwgaW50IGluZGV4LAorCQkJCQkgIHUzMiAqdmFsdWUpCit7CisJaW50IHJjOworCXUzMiBjYXBfb2Zmc2V0ID0gY3RybC0+Y2FwX29mZnNldDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGN0cmwtPnBjaV9kZXY7CisKKwlyYyA9IHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBjYXBfb2Zmc2V0ICsgRFdPUkRfU0VMRUNULCBpbmRleCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJcmV0dXJuIHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBjYXBfb2Zmc2V0ICsgRFdPUkRfREFUQSwgdmFsdWUpOworfQorCiBpbnQgc2hwY19pbml0KHN0cnVjdCBjb250cm9sbGVyICogY3RybCwgc3RydWN0IHBjaV9kZXYgKiBwZGV2KQogewogCXN0cnVjdCBwaHBfY3Rscl9zdGF0ZV9zICpwaHBfY3RsciwgKnA7CiAJdm9pZCAqaW5zdGFuY2VfaWQgPSBjdHJsOwotCWludCByYzsKKwlpbnQgcmMsIG51bV9zbG90cyA9IDA7CiAJdTggaHBfc2xvdDsKIAlzdGF0aWMgaW50IGZpcnN0ID0gMTsKLQl1MzIgc2hwY19jYXBfb2Zmc2V0LCBzaHBjX2Jhc2Vfb2Zmc2V0OworCXUzMiBzaHBjX2Jhc2Vfb2Zmc2V0OwogCXUzMiB0ZW1wZHdvcmQsIHNsb3RfcmVnOwogCXU4IGk7CiAKIAlEQkdfRU5URVJfUk9VVElORQogCisJY3RybC0+cGNpX2RldiA9IHBkZXY7ICAvKiBwY2lfZGV2IG9mIHRoZSBQMlAgYnJpZGdlICovCisKIAlzcGluX2xvY2tfaW5pdCgmbGlzdF9sb2NrKTsKIAlwaHBfY3RsciA9IChzdHJ1Y3QgcGhwX2N0bHJfc3RhdGVfcyAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGhwX2N0bHJfc3RhdGVfcyksIEdGUF9LRVJORUwpOwogCkBAIC0xMzQ4LDQxICsxMzg4LDQ1IEBACiAKIAlpZiAoKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FNRCkgfHwgKHBkZXYtPmRldmljZSA9PQogCQkJCVBDSV9ERVZJQ0VfSURfQU1EX0dPTEFNXzc0NTApKSB7Ci0JCXNocGNfYmFzZV9vZmZzZXQgPSAwOyAgLyogYW1kIHNocGMgZHJpdmVyIGRvZXNuJ3QgdXNlIHRoaXM7IGFzc3VtZSAwICovCisJCS8qIGFtZCBzaHBjIGRyaXZlciBkb2Vzbid0IHVzZSBCYXNlIE9mZnNldDsgYXNzdW1lIDAgKi8KKwkJY3RybC0+bW1pb19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCQljdHJsLT5tbWlvX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOwogCX0gZWxzZSB7Ci0JCWlmICgoc2hwY19jYXBfb2Zmc2V0ID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX1NIUEMpKSA9PSAwKSB7Ci0JCQllcnIoIiVzIDogc2hwY19jYXBfb2Zmc2V0ID09IDBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWN0cmwtPmNhcF9vZmZzZXQgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfU0hQQyk7CisJCWlmICghY3RybC0+Y2FwX29mZnNldCkgeworCQkJZXJyKCIlcyA6IGNhcF9vZmZzZXQgPT0gMFxuIiwgX19GVU5DVElPTl9fKTsKIAkJCWdvdG8gYWJvcnRfZnJlZV9jdGxyOwogCQl9Ci0JCWRiZygiJXM6IHNocGNfY2FwX29mZnNldCA9ICV4XG4iLCBfX0ZVTkNUSU9OX18sIHNocGNfY2FwX29mZnNldCk7CQotCQotCQlyYyA9IHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAodTgpc2hwY19jYXBfb2Zmc2V0ICsgRFdPUkRfU0VMRUNUICwgQkFTRV9PRkZTRVQpOworCQlkYmcoIiVzOiBjYXBfb2Zmc2V0ID0gJXhcbiIsIF9fRlVOQ1RJT05fXywgY3RybC0+Y2FwX29mZnNldCk7CisKKwkJcmMgPSBzaHBjX2luZGlyZWN0X2NyZWdfcmVhZChjdHJsLCAwLCAmc2hwY19iYXNlX29mZnNldCk7CiAJCWlmIChyYykgewotCQkJZXJyKCIlcyA6IHBjaV93b3JkX2NvbmZpZ19ieXRlIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKLQkJCWdvdG8gYWJvcnRfZnJlZV9jdGxyOwotCQl9Ci0JCi0JCXJjID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsICh1OClzaHBjX2NhcF9vZmZzZXQgKyBEV09SRF9EQVRBLCAmc2hwY19iYXNlX29mZnNldCk7Ci0JCWlmIChyYykgewotCQkJZXJyKCIlcyA6IHBjaV9yZWFkX2NvbmZpZ19kd29yZCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQllcnIoIiVzOiBjYW5ub3QgcmVhZCBiYXNlX29mZnNldFxuIiwgX19GVU5DVElPTl9fKTsKIAkJCWdvdG8gYWJvcnRfZnJlZV9jdGxyOwogCQl9CiAKLQkJZm9yIChpID0gMDsgaSA8PSAxNDsgaSsrKSB7Ci0JCQlyYyA9IHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAodTgpc2hwY19jYXBfb2Zmc2V0ICsgIERXT1JEX1NFTEVDVCAsIGkpOworCQlyYyA9IHNocGNfaW5kaXJlY3RfY3JlZ19yZWFkKGN0cmwsIDMsICZ0ZW1wZHdvcmQpOworCQlpZiAocmMpIHsKKwkJCWVycigiJXM6IGNhbm5vdCByZWFkIHNsb3QgY29uZmlnXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJZ290byBhYm9ydF9mcmVlX2N0bHI7CisJCX0KKwkJbnVtX3Nsb3RzID0gdGVtcGR3b3JkICYgU0xPVF9OVU07CisJCWRiZygiJXM6IG51bV9zbG90cyAoaW5kaXJlY3QpICV4XG4iLCBfX0ZVTkNUSU9OX18sIG51bV9zbG90cyk7CisKKwkJZm9yIChpID0gMDsgaSA8IDkgKyBudW1fc2xvdHM7IGkrKykgeworCQkJcmMgPSBzaHBjX2luZGlyZWN0X2NyZWdfcmVhZChjdHJsLCBpLCAmdGVtcGR3b3JkKTsKIAkJCWlmIChyYykgewotCQkJCWVycigiJXMgOiBwY2lfd29yZF9jb25maWdfYnl0ZSBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQkJZ290byBhYm9ydF9mcmVlX2N0bHI7Ci0JCQl9Ci0JCi0JCQlyYyA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAodTgpc2hwY19jYXBfb2Zmc2V0ICsgRFdPUkRfREFUQSwgJnRlbXBkd29yZCk7Ci0JCQlpZiAocmMpIHsKLQkJCQllcnIoIiVzIDogcGNpX3JlYWRfY29uZmlnX2R3b3JkIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQllcnIoIiVzOiBjYW5ub3QgcmVhZCBjcmVnIChpbmRleCA9ICVkKVxuIiwKKwkJCQkgICAgX19GVU5DVElPTl9fLCBpKTsKIAkJCQlnb3RvIGFib3J0X2ZyZWVfY3RscjsKIAkJCX0KIAkJCWRiZygiJXM6IG9mZnNldCAlZDogdmFsdWUgJXhcbiIsIF9fRlVOQ1RJT05fXyxpLAogCQkJCQl0ZW1wZHdvcmQpOwogCQl9CisKKwkJY3RybC0+bW1pb19iYXNlID0KKwkJCXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSArIHNocGNfYmFzZV9vZmZzZXQ7CisJCWN0cmwtPm1taW9fc2l6ZSA9IDB4MjQgKyAweDQgKiBudW1fc2xvdHM7CiAJfQogCiAJaWYgKGZpcnN0KSB7CkBAIC0xMzk2LDE2ICsxNDQwLDE2IEBACiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQogCQlnb3RvIGFib3J0X2ZyZWVfY3RscjsKIAotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSArIHNocGNfYmFzZV9vZmZzZXQsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCksIE1ZX05BTUUpKSB7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oY3RybC0+bW1pb19iYXNlLCBjdHJsLT5tbWlvX3NpemUsIE1ZX05BTUUpKSB7CiAJCWVycigiJXM6IGNhbm5vdCByZXNlcnZlIE1NSU8gcmVnaW9uXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlnb3RvIGFib3J0X2ZyZWVfY3RscjsKIAl9CiAKLQlwaHBfY3Rsci0+Y3JlZyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApICsgc2hwY19iYXNlX29mZnNldCwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7CisJcGhwX2N0bHItPmNyZWcgPSBpb3JlbWFwKGN0cmwtPm1taW9fYmFzZSwgY3RybC0+bW1pb19zaXplKTsKIAlpZiAoIXBocF9jdGxyLT5jcmVnKSB7Ci0JCWVycigiJXM6IGNhbm5vdCByZW1hcCBNTUlPIHJlZ2lvbiAlbHggQCAlbHhcbiIsIF9fRlVOQ1RJT05fXywgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSwgCi0JCQlwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCkgKyBzaHBjX2Jhc2Vfb2Zmc2V0KTsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSArIHNocGNfYmFzZV9vZmZzZXQsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOworCQllcnIoIiVzOiBjYW5ub3QgcmVtYXAgTU1JTyByZWdpb24gJWx4IEAgJWx4XG4iLCBfX0ZVTkNUSU9OX18sCisJCSAgICBjdHJsLT5tbWlvX3NpemUsIGN0cmwtPm1taW9fYmFzZSk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihjdHJsLT5tbWlvX2Jhc2UsIGN0cmwtPm1taW9fc2l6ZSk7CiAJCWdvdG8gYWJvcnRfZnJlZV9jdGxyOwogCX0KIAlkYmcoIiVzOiBwaHBfY3Rsci0+Y3JlZyAlcFxuIiwgX19GVU5DVElPTl9fLCBwaHBfY3Rsci0+Y3JlZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9wY2kuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX3BjaS5jCmluZGV4IDM4MDA5YmMuLjE5ZTFhNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX3BjaS5jCkBAIC04OSwxMCArODksMTEgQEAKIAlzdHJ1Y3QgcGNpX2J1cyAqcGFyZW50ID0gcF9zbG90LT5jdHJsLT5wY2lfZGV2LT5zdWJvcmRpbmF0ZTsKIAlpbnQgbnVtLCBmbjsKIAotCWRldiA9IHBjaV9maW5kX3Nsb3QocF9zbG90LT5idXMsIFBDSV9ERVZGTihwX3Nsb3QtPmRldmljZSwgMCkpOworCWRldiA9IHBjaV9nZXRfc2xvdChwYXJlbnQsIFBDSV9ERVZGTihwX3Nsb3QtPmRldmljZSwgMCkpOwogCWlmIChkZXYpIHsKIAkJZXJyKCJEZXZpY2UgJXMgYWxyZWFkeSBleGlzdHMgYXQgJXg6JXgsIGNhbm5vdCBob3QtYWRkXG4iLAogCQkJCXBjaV9uYW1lKGRldiksIHBfc2xvdC0+YnVzLCBwX3Nsb3QtPmRldmljZSk7CisJCXBjaV9kZXZfcHV0KGRldik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTAzLDEyICsxMDQsMTMgQEAKIAl9CiAKIAlmb3IgKGZuID0gMDsgZm4gPCA4OyBmbisrKSB7Ci0JCWlmICghKGRldiA9IHBjaV9maW5kX3Nsb3QocF9zbG90LT5idXMsCi0JCQkJCVBDSV9ERVZGTihwX3Nsb3QtPmRldmljZSwgZm4pKSkpCisJCWRldiA9IHBjaV9nZXRfc2xvdChwYXJlbnQsIFBDSV9ERVZGTihwX3Nsb3QtPmRldmljZSwgZm4pKTsKKwkJaWYgKCFkZXYpCiAJCQljb250aW51ZTsKIAkJaWYgKChkZXYtPmNsYXNzID4+IDE2KSA9PSBQQ0lfQkFTRV9DTEFTU19ESVNQTEFZKSB7CiAJCQllcnIoIkNhbm5vdCBob3QtYWRkIGRpc3BsYXkgZGV2aWNlICVzXG4iLAogCQkJCQlwY2lfbmFtZShkZXYpKTsKKwkJCXBjaV9kZXZfcHV0KGRldik7CiAJCQljb250aW51ZTsKIAkJfQogCQlpZiAoKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSkgfHwKQEAgLTEyNCwxOCArMTI2LDIxIEBACiAJCQl9CiAJCQlpZiAoYnVzbnIgPj0gZW5kKSB7CiAJCQkJZXJyKCJObyBmcmVlIGJ1cyBmb3IgaG90LWFkZGVkIGJyaWRnZVxuIik7CisJCQkJcGNpX2Rldl9wdXQoZGV2KTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCWNoaWxkID0gcGNpX2FkZF9uZXdfYnVzKHBhcmVudCwgZGV2LCBidXNucik7CiAJCQlpZiAoIWNoaWxkKSB7CiAJCQkJZXJyKCJDYW5ub3QgYWRkIG5ldyBidXMgZm9yICVzXG4iLAogCQkJCQkJcGNpX25hbWUoZGV2KSk7CisJCQkJcGNpX2Rldl9wdXQoZGV2KTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCWNoaWxkLT5zdWJvcmRpbmF0ZSA9IHBjaV9kb19zY2FuX2J1cyhjaGlsZCk7CiAJCQlwY2lfYnVzX3NpemVfYnJpZGdlcyhjaGlsZCk7CiAJCX0KIAkJcHJvZ3JhbV9md19wcm92aWRlZF92YWx1ZXMoZGV2KTsKKwkJcGNpX2Rldl9wdXQoZGV2KTsKIAl9CiAKIAlwY2lfYnVzX2Fzc2lnbl9yZXNvdXJjZXMocGFyZW50KTsKQEAgLTE0OSwxNyArMTU0LDE5IEBACiAJaW50IHJjID0gMDsKIAlpbnQgajsKIAl1OCBiY3RsID0gMDsKLQkKKwlzdHJ1Y3QgcGNpX2J1cyAqcGFyZW50ID0gcF9zbG90LT5jdHJsLT5wY2lfZGV2LT5zdWJvcmRpbmF0ZTsKKwogCWRiZygiJXM6IGJ1cy9kZXYgPSAleC8leFxuIiwgX19GVU5DVElPTl9fLCBwX3Nsb3QtPmJ1cywgcF9zbG90LT5kZXZpY2UpOwogCiAJZm9yIChqPTA7IGo8OCA7IGorKykgewotCQlzdHJ1Y3QgcGNpX2RldiogdGVtcCA9IHBjaV9maW5kX3Nsb3QocF9zbG90LT5idXMsCisJCXN0cnVjdCBwY2lfZGV2KiB0ZW1wID0gcGNpX2dldF9zbG90KHBhcmVudCwKIAkJCQkocF9zbG90LT5kZXZpY2UgPDwgMykgfCBqKTsKIAkJaWYgKCF0ZW1wKQogCQkJY29udGludWU7CiAJCWlmICgodGVtcC0+Y2xhc3MgPj4gMTYpID09IFBDSV9CQVNFX0NMQVNTX0RJU1BMQVkpIHsKIAkJCWVycigiQ2Fubm90IHJlbW92ZSBkaXNwbGF5IGRldmljZSAlc1xuIiwKIAkJCQkJcGNpX25hbWUodGVtcCkpOworCQkJcGNpX2Rldl9wdXQodGVtcCk7CiAJCQljb250aW51ZTsKIAkJfQogCQlpZiAodGVtcC0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSkgewpAQCAtMTY3LDEwICsxNzQsMTIgQEAKIAkJCWlmIChiY3RsICYgUENJX0JSSURHRV9DVExfVkdBKSB7CiAJCQkJZXJyKCJDYW5ub3QgcmVtb3ZlIGRpc3BsYXkgZGV2aWNlICVzXG4iLAogCQkJCQkJcGNpX25hbWUodGVtcCkpOworCQkJCXBjaV9kZXZfcHV0KHRlbXApOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQl9CiAJCXBjaV9yZW1vdmVfYnVzX2RldmljZSh0ZW1wKTsKKwkJcGNpX2Rldl9wdXQodGVtcCk7CiAJfQogCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYyBiL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYwppbmRleCA3MTQ2YjY5Li4wYWExNGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCkBAIC0zODAsOCArMzgwLDYgQEAKIAkvKiBpbml0aWFsaXplIGNvbW1vbiBkcml2ZXIgZmllbGRzICovCiAJZHJ2LT5kcml2ZXIubmFtZSA9IGRydi0+bmFtZTsKIAlkcnYtPmRyaXZlci5idXMgPSAmcGNpX2J1c190eXBlOwotCWRydi0+ZHJpdmVyLnByb2JlID0gcGNpX2RldmljZV9wcm9iZTsKLQlkcnYtPmRyaXZlci5yZW1vdmUgPSBwY2lfZGV2aWNlX3JlbW92ZTsKIAkvKiBGSVhNRSwgb25jZSBhbGwgb2YgdGhlIGV4aXN0aW5nIFBDSSBkcml2ZXJzIGhhdmUgYmVlbiBmaXhlZCB0byBzZXQKIAkgKiB0aGUgcGNpIHNodXRkb3duIGZ1bmN0aW9uLCB0aGlzIHRlc3QgY2FuIGdvIGF3YXkuICovCiAJaWYgKCFkcnYtPmRyaXZlci5zaHV0ZG93bikKQEAgLTUxMyw2ICs1MTEsOCBAQAogCS5uYW1lCQk9ICJwY2kiLAogCS5tYXRjaAkJPSBwY2lfYnVzX21hdGNoLAogCS51ZXZlbnQJCT0gcGNpX3VldmVudCwKKwkucHJvYmUJCT0gcGNpX2RldmljZV9wcm9iZSwKKwkucmVtb3ZlCQk9IHBjaV9kZXZpY2VfcmVtb3ZlLAogCS5zdXNwZW5kCT0gcGNpX2RldmljZV9zdXNwZW5kLAogCS5yZXN1bWUJCT0gcGNpX2RldmljZV9yZXN1bWUsCiAJLmRldl9hdHRycwk9IHBjaV9kZXZfYXR0cnMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaS5jCmluZGV4IDhlMjg3YTguLmQyYTYzM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8YXNtL2RtYS5oPgkvKiBpc2FfZG1hX2JyaWRnZV9idWdneSAqLwogI2luY2x1ZGUgInBjaS5oIgogCisjaWYgMAogCiAvKioKICAqIHBjaV9idXNfbWF4X2J1c25yIC0gcmV0dXJucyBtYXhpbXVtIFBDSSBidXMgbnVtYmVyIG9mIGdpdmVuIGJ1cycgY2hpbGRyZW4KQEAgLTYzLDYgKzY0LDggQEAKIAlyZXR1cm4gbWF4OwogfQogCisjZW5kaWYgIC8qICAwICAqLworCiBzdGF0aWMgaW50IF9fcGNpX2ZpbmRfbmV4dF9jYXAoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCB1OCBwb3MsIGludCBjYXApCiB7CiAJdTggaWQ7CkBAIC01ODcsNyArNTkwLDcgQEAKIHsKIAl1OCBwaW47CiAKLQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAmcGluKTsKKwlwaW4gPSBkZXYtPnBpbjsKIAlpZiAoIXBpbikKIAkJcmV0dXJuIC0xOwogCXBpbi0tOwpAQCAtOTE3LDggKzkyMCw2IEBACiBFWFBPUlRfU1lNQk9MKHBjaV9lbmFibGVfZGV2aWNlX2JhcnMpOwogRVhQT1JUX1NZTUJPTChwY2lfZW5hYmxlX2RldmljZSk7CiBFWFBPUlRfU1lNQk9MKHBjaV9kaXNhYmxlX2RldmljZSk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9tYXhfYnVzbnIpOwotRVhQT1JUX1NZTUJPTChwY2lfYnVzX21heF9idXNucik7CiBFWFBPUlRfU1lNQk9MKHBjaV9maW5kX2NhcGFiaWxpdHkpOwogRVhQT1JUX1NZTUJPTChwY2lfYnVzX2ZpbmRfY2FwYWJpbGl0eSk7CiBFWFBPUlRfU1lNQk9MKHBjaV9yZWxlYXNlX3JlZ2lvbnMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmggYi9kcml2ZXJzL3BjaS9wY2kuaAppbmRleCAyOTQ4NDlkLi5hNmRmZWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuaAorKysgYi9kcml2ZXJzL3BjaS9wY2kuaApAQCAtMjYsMjAgKzI2LDE1IEBACiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIGV4dGVybiBpbnQgcGNpX3Byb2NfYXR0YWNoX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiBpbnQgcGNpX3Byb2NfZGV0YWNoX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLWV4dGVybiBpbnQgcGNpX3Byb2NfYXR0YWNoX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIGV4dGVybiBpbnQgcGNpX3Byb2NfZGV0YWNoX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBwY2lfcHJvY19hdHRhY2hfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHBjaV9wcm9jX2RldGFjaF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldikgeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSBpbnQgcGNpX3Byb2NfYXR0YWNoX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCBwY2lfcHJvY19kZXRhY2hfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpIHsgcmV0dXJuIDA7IH0KICNlbmRpZgogCiAvKiBGdW5jdGlvbnMgZm9yIFBDSSBIb3RwbHVnIGRyaXZlcnMgdG8gdXNlICovCiBleHRlcm4gdW5zaWduZWQgaW50IHBjaV9kb19zY2FuX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKLWV4dGVybiBpbnQgcGNpX3JlbW92ZV9kZXZpY2Vfc2FmZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyIHBjaV9tYXhfYnVzbnIodm9pZCk7Ci1leHRlcm4gdW5zaWduZWQgY2hhciBwY2lfYnVzX21heF9idXNucihzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIGV4dGVybiBpbnQgcGNpX2J1c19maW5kX2NhcGFiaWxpdHkgKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IGNhcCk7CiAKIGV4dGVybiB2b2lkIHBjaV9yZW1vdmVfbGVnYWN5X2ZpbGVzKHN0cnVjdCBwY2lfYnVzICpidXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2NvcmUuYyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9jb3JlLmMKaW5kZXggNDY3YTRjZS4uZTRlNWYxZThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9jb3JlLmMKQEAgLTIzOCw4ICsyMzgsOCBAQAogCWRldmljZS0+ZHJpdmVyID0gTlVMTDsKIAlkZXZpY2UtPmRyaXZlcl9kYXRhID0gTlVMTDsKIAlkZXZpY2UtPnJlbGVhc2UgPSByZWxlYXNlX3BjaWVfZGV2aWNlOwkvKiBjYWxsYmFjayB0byBmcmVlIHBjaWUgZGV2ICovCi0Jc3ByaW50ZigmZGV2aWNlLT5idXNfaWRbMF0sICJwY2llJTAyeCIsCi0JCWdldF9kZXNjcmlwdG9yX2lkKHBvcnRfdHlwZSwgc2VydmljZV90eXBlKSk7CisJc25wcmludGYoZGV2aWNlLT5idXNfaWQsIHNpemVvZihkZXZpY2UtPmJ1c19pZCksICIlczpwY2llJTAyeCIsCisJCSBwY2lfbmFtZShwYXJlbnQpLCBnZXRfZGVzY3JpcHRvcl9pZChwb3J0X3R5cGUsIHNlcnZpY2VfdHlwZSkpOwogCWRldmljZS0+cGFyZW50ID0gJnBhcmVudC0+ZGV2OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wcm9iZS5jIGIvZHJpdmVycy9wY2kvcHJvYmUuYwppbmRleCBmY2UyY2IyLi5hZGZhZDRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wcm9iZS5jCisrKyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKQEAgLTI2NCw4ICsyNjQsMTAgQEAKIAogCWlmIChiYXNlIDw9IGxpbWl0KSB7CiAJCXJlcy0+ZmxhZ3MgPSAoaW9fYmFzZV9sbyAmIFBDSV9JT19SQU5HRV9UWVBFX01BU0spIHwgSU9SRVNPVVJDRV9JTzsKLQkJcmVzLT5zdGFydCA9IGJhc2U7Ci0JCXJlcy0+ZW5kID0gbGltaXQgKyAweGZmZjsKKwkJaWYgKCFyZXMtPnN0YXJ0KQorCQkJcmVzLT5zdGFydCA9IGJhc2U7CisJCWlmICghcmVzLT5lbmQpCisJCQlyZXMtPmVuZCA9IGxpbWl0ICsgMHhmZmY7CiAJfQogCiAJcmVzID0gY2hpbGQtPnJlc291cmNlWzFdOwpAQCAtNDMxLDcgKzQzMyw3IEBACiB7CiAJc3RydWN0IHBjaV9idXMgKmNoaWxkOwogCWludCBpc19jYXJkYnVzID0gKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0NBUkRCVVMpOwotCXUzMiBidXNlcywgaTsKKwl1MzIgYnVzZXMsIGksIGogPSAwOwogCXUxNiBiY3RsOwogCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgUENJX1BSSU1BUllfQlVTLCAmYnVzZXMpOwpAQCAtNTQxLDEwICs1NDMsMjkgQEAKIAkJCSAqIGFzIGNhcmRzIHdpdGggYSBQQ0ktdG8tUENJIGJyaWRnZSBjYW4gYmUKIAkJCSAqIGluc2VydGVkIGxhdGVyLgogCQkJICovCi0JCQlmb3IgKGk9MDsgaTxDQVJEQlVTX1JFU0VSVkVfQlVTTlI7IGkrKykKKwkJCWZvciAoaT0wOyBpPENBUkRCVVNfUkVTRVJWRV9CVVNOUjsgaSsrKSB7CisJCQkJc3RydWN0IHBjaV9idXMgKnBhcmVudCA9IGJ1czsKIAkJCQlpZiAocGNpX2ZpbmRfYnVzKHBjaV9kb21haW5fbnIoYnVzKSwKIAkJCQkJCQltYXgraSsxKSkKIAkJCQkJYnJlYWs7CisJCQkJd2hpbGUgKHBhcmVudC0+cGFyZW50KSB7CisJCQkJCWlmICgoIXBjaWJpb3NfYXNzaWduX2FsbF9idXNzZXMoKSkgJiYKKwkJCQkJICAgIChwYXJlbnQtPnN1Ym9yZGluYXRlID4gbWF4KSAmJgorCQkJCQkgICAgKHBhcmVudC0+c3Vib3JkaW5hdGUgPD0gbWF4K2kpKSB7CisJCQkJCQlqID0gMTsKKwkJCQkJfQorCQkJCQlwYXJlbnQgPSBwYXJlbnQtPnBhcmVudDsKKwkJCQl9CisJCQkJaWYgKGopIHsKKwkJCQkJLyoKKwkJCQkJICogT2Z0ZW4sIHRoZXJlIGFyZSB0d28gY2FyZGJ1cyBicmlkZ2VzCisJCQkJCSAqIC0tIHRyeSB0byBsZWF2ZSBvbmUgdmFsaWQgYnVzIG51bWJlcgorCQkJCQkgKiBmb3IgZWFjaCBvbmUuCisJCQkJCSAqLworCQkJCQlpIC89IDI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KIAkJCW1heCArPSBpOwogCQkJcGNpX2ZpeHVwX3BhcmVudF9zdWJvcmRpbmF0ZV9idXNucihjaGlsZCwgbWF4KTsKIAkJfQpAQCAtNTU5LDYgKzU4MCwyMiBAQAogCiAJc3ByaW50ZihjaGlsZC0+bmFtZSwgKGlzX2NhcmRidXMgPyAiUENJIENhcmRCdXMgIyUwMngiIDogIlBDSSBCdXMgIyUwMngiKSwgY2hpbGQtPm51bWJlcik7CiAKKwl3aGlsZSAoYnVzLT5wYXJlbnQpIHsKKwkJaWYgKChjaGlsZC0+c3Vib3JkaW5hdGUgPiBidXMtPnN1Ym9yZGluYXRlKSB8fAorCQkgICAgKGNoaWxkLT5udW1iZXIgPiBidXMtPnN1Ym9yZGluYXRlKSB8fAorCQkgICAgKGNoaWxkLT5udW1iZXIgPCBidXMtPm51bWJlcikgfHwKKwkJICAgIChjaGlsZC0+c3Vib3JkaW5hdGUgPCBidXMtPm51bWJlcikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBDSTogQnVzICMlMDJ4ICgtIyUwMngpIG1heSBiZSAiCisJCQkgICAgICAgImhpZGRlbiBiZWhpbmQlcyBicmlkZ2UgIyUwMnggKC0jJTAyeCklc1xuIiwKKwkJCSAgICAgICBjaGlsZC0+bnVtYmVyLCBjaGlsZC0+c3Vib3JkaW5hdGUsCisJCQkgICAgICAgYnVzLT5zZWxmLT50cmFuc3BhcmVudCA/ICIgdHJhbnNwYXJlbnQiIDogIiAiLAorCQkJICAgICAgIGJ1cy0+bnVtYmVyLCBidXMtPnN1Ym9yZGluYXRlLAorCQkJICAgICAgIHBjaWJpb3NfYXNzaWduX2FsbF9idXNzZXMoKSA/ICIgIiA6CisJCQkgICAgICAgIiAodHJ5ICdwY2k9YXNzaWduLWJ1c3NlcycpIik7CisJCX0KKwkJYnVzID0gYnVzLT5wYXJlbnQ7CisJfQorCiAJcmV0dXJuIG1heDsKIH0KIApAQCAtNTcxLDYgKzYwOCw3IEBACiAJdW5zaWduZWQgY2hhciBpcnE7CiAKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAmaXJxKTsKKwlkZXYtPnBpbiA9IGlycTsKIAlpZiAoaXJxKQogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgJmlycSk7CiAJZGV2LT5pcnEgPSBpcnE7CkBAIC02MjQsNiArNjYyLDcgQEAKIAkJLyogVGhlIFBDSS10by1QQ0kgYnJpZGdlIHNwZWMgcmVxdWlyZXMgdGhhdCBzdWJ0cmFjdGl2ZQogCQkgICBkZWNvZGluZyAoaS5lLiB0cmFuc3BhcmVudCkgYnJpZGdlIG11c3QgaGF2ZSBwcm9ncmFtbWluZwogCQkgICBpbnRlcmZhY2UgY29kZSBvZiAweDAxLiAqLyAKKwkJcGNpX3JlYWRfaXJxKGRldik7CiAJCWRldi0+dHJhbnNwYXJlbnQgPSAoKGRldi0+Y2xhc3MgJiAweGZmKSA9PSAxKTsKIAkJcGNpX3JlYWRfYmFzZXMoZGV2LCAyLCBQQ0lfUk9NX0FERFJFU1MxKTsKIAkJYnJlYWs7CkBAIC02NzgsNyArNzE3LDcgQEAKICAqIHJlYWRpbmcgdGhlIGR3b3JkIGF0IDB4MTAwIHdoaWNoIG11c3QgZWl0aGVyIGJlIDAgb3IgYSB2YWxpZCBleHRlbmRlZAogICogY2FwYWJpbGl0eSBoZWFkZXIuCiAgKi8KLXN0YXRpYyBpbnQgcGNpX2NmZ19zcGFjZV9zaXplKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitpbnQgcGNpX2NmZ19zcGFjZV9zaXplKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJaW50IHBvczsKIAl1MzIgc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYy5jIGIvZHJpdmVycy9wY2kvcHJvYy5jCmluZGV4IDllYjQ2NTcuLjkyYTg4NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3Byb2MuYworKysgYi9kcml2ZXJzL3BjaS9wcm9jLmMKQEAgLTI1LDcgKzI1LDcgQEAKIAlsb2ZmX3QgbmV3ID0gLTE7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOwogCi0JZG93bigmaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJc3dpdGNoICh3aGVuY2UpIHsKIAljYXNlIDA6CiAJCW5ldyA9IG9mZjsKQEAgLTQxLDcgKzQxLDcgQEAKIAkJbmV3ID0gLUVJTlZBTDsKIAllbHNlCiAJCWZpbGUtPmZfcG9zID0gbmV3OwotCXVwKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiBuZXc7CiB9CiAKQEAgLTQzMSw2ICs0MzEsNyBAQAogCXJldHVybiAwOwogfQogCisjaWYgMAogaW50IHBjaV9wcm9jX2F0dGFjaF9idXMoc3RydWN0IHBjaV9idXMqIGJ1cykKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlID0gYnVzLT5wcm9jZGlyOwpAQCAtNDQ3LDYgKzQ0OCw3IEBACiAJfQogCXJldHVybiAwOwogfQorI2VuZGlmICAvKiAgMCAgKi8KIAogaW50IHBjaV9wcm9jX2RldGFjaF9idXMoc3RydWN0IHBjaV9idXMqIGJ1cykKIHsKQEAgLTYxMiw3ICs2MTQsNiBAQAogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUcKIEVYUE9SVF9TWU1CT0wocGNpX3Byb2NfYXR0YWNoX2RldmljZSk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9wcm9jX2F0dGFjaF9idXMpOwogRVhQT1JUX1NZTUJPTChwY2lfcHJvY19kZXRhY2hfYnVzKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9xdWlya3MuYyBiL2RyaXZlcnMvcGNpL3F1aXJrcy5jCmluZGV4IGYyOGViZGQuLmRkYTYwOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jCisrKyBiL2RyaXZlcnMvcGNpL3F1aXJrcy5jCkBAIC0xMTQyLDYgKzExNDIsOSBAQAogCWNhc2UgMHgyN2M0OgogCQlpY2ggPSA3OwogCQlicmVhazsKKwljYXNlIDB4MjgyODoJLyogSUNIOE0gKi8KKwkJaWNoID0gODsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJLyogd2UgZG8gbm90IGhhbmRsZSB0aGlzIFBDSSBkZXZpY2UgKi8KIAkJcmV0dXJuOwpAQCAtMTE2MSw3ICsxMTY0LDcgQEAKIAkJZWxzZQogCQkJcmV0dXJuOwkJCS8qIG5vdCBpbiBjb21iaW5lZCBtb2RlICovCiAJfSBlbHNlIHsKLQkJV0FSTl9PTigoaWNoICE9IDYpICYmIChpY2ggIT0gNykpOworCQlXQVJOX09OKChpY2ggIT0gNikgJiYgKGljaCAhPSA3KSAmJiAoaWNoICE9IDgpKTsKIAkJdG1wICY9IDB4MzsgIC8qIGludGVyZXN0aW5nIGJpdHMgMTowICovCiAJCWlmICh0bXAgJiAoMSA8PCAwKSkKIAkJCWNvbWIgPSAoMSA8PCAyKTsJLyogUEFUQSBwb3J0IDAsIFNBVEEgcG9ydCAxICovCkBAIC0xMzQyLDYgKzEzNDUsMzIgQEAKIAlwY2lfZG9fZml4dXBzKGRldiwgc3RhcnQsIGVuZCk7CiB9CiAKKy8qIEVuYWJsZSAxayBJL08gc3BhY2UgZ3JhbnVsYXJpdHkgb24gdGhlIEludGVsIFA2NEgyICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfcDY0aDJfMWtfaW8oc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1MTYgZW4xazsKKwl1OCBpb19iYXNlX2xvLCBpb19saW1pdF9sbzsKKwl1bnNpZ25lZCBsb25nIGJhc2UsIGxpbWl0OworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gZGV2LT5yZXNvdXJjZSArIFBDSV9CUklER0VfUkVTT1VSQ0VTOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCAweDQwLCAmZW4xayk7CisKKwlpZiAoZW4xayAmIDB4MjAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlBDSTogRW5hYmxlIEkvTyBTcGFjZSB0byAxIEtCIEdyYW51bGFyaXR5XG4iKTsKKworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9JT19CQVNFLCAmaW9fYmFzZV9sbyk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0lPX0xJTUlULCAmaW9fbGltaXRfbG8pOworCQliYXNlID0gKGlvX2Jhc2VfbG8gJiAoUENJX0lPX1JBTkdFX01BU0sgfCAweDBjKSkgPDwgODsKKwkJbGltaXQgPSAoaW9fbGltaXRfbG8gJiAoUENJX0lPX1JBTkdFX01BU0sgfCAweDBjKSkgPDwgODsKKworCQlpZiAoYmFzZSA8PSBsaW1pdCkgeworCQkJcmVzLT5zdGFydCA9IGJhc2U7CisJCQlyZXMtPmVuZCA9IGxpbWl0ICsgMHgzZmY7CisJCX0KKwl9Cit9CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJMHgxNDYwLAkJcXVpcmtfcDY0aDJfMWtfaW8pOworCiBFWFBPUlRfU1lNQk9MKHBjaWVfbWNoX3F1aXJrKTsKICNpZmRlZiBDT05GSUdfSE9UUExVRwogRVhQT1JUX1NZTUJPTChwY2lfZml4dXBfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3JlbW92ZS5jIGIvZHJpdmVycy9wY2kvcmVtb3ZlLmMKaW5kZXggMjdhMjk0Yi4uMWE2YmY5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcmVtb3ZlLmMKKysrIGIvZHJpdmVycy9wY2kvcmVtb3ZlLmMKQEAgLTQ4LDYgKzQ4LDcgQEAKICAqIGluIHF1ZXN0aW9uIGlzIG5vdCBiZWluZyB1c2VkIGJ5IGEgZHJpdmVyLgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KKyNpZiAwCiBpbnQgcGNpX3JlbW92ZV9kZXZpY2Vfc2FmZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCWlmIChwY2lfZGV2X2RyaXZlcihkZXYpKQpAQCAtNTUsNyArNTYsNyBAQAogCXBjaV9kZXN0cm95X2RldihkZXYpOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChwY2lfcmVtb3ZlX2RldmljZV9zYWZlKTsKKyNlbmRpZiAgLyogIDAgICovCiAKIHZvaWQgcGNpX3JlbW92ZV9idXMoc3RydWN0IHBjaV9idXMgKnBjaV9idXMpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9kcy5jIGIvZHJpdmVycy9wY21jaWEvZHMuYwppbmRleCAwMjUyNTgyLi4wYTQyNGE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9kcy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2RzLmMKQEAgLTMxMSw4ICszMTEsNiBAQAogCS8qIGluaXRpYWxpemUgY29tbW9uIGZpZWxkcyAqLwogCWRyaXZlci0+ZHJ2LmJ1cyA9ICZwY21jaWFfYnVzX3R5cGU7CiAJZHJpdmVyLT5kcnYub3duZXIgPSBkcml2ZXItPm93bmVyOwotCWRyaXZlci0+ZHJ2LnByb2JlID0gcGNtY2lhX2RldmljZV9wcm9iZTsKLQlkcml2ZXItPmRydi5yZW1vdmUgPSBwY21jaWFfZGV2aWNlX3JlbW92ZTsKIAogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRyaXZlci0+ZHJ2KTsKIH0KQEAgLTkyMCw2ICs5MTgsMzcgQEAKIHBjbWNpYV9kZXZpY2Vfc3RyaW5nYXR0cihwcm9kX2lkMywgcHJvZF9pZFsyXSk7CiBwY21jaWFfZGV2aWNlX3N0cmluZ2F0dHIocHJvZF9pZDQsIHByb2RfaWRbM10pOwogCisKK3N0YXRpYyBzc2l6ZV90IHBjbWNpYV9zaG93X3BtX3N0YXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYgPSB0b19wY21jaWFfZGV2KGRldik7CisKKwlpZiAocF9kZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCAhPSBQTV9FVkVOVF9PTikKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAib2ZmXG4iKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm9uXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgcGNtY2lhX3N0b3JlX3BtX3N0YXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYgPSB0b19wY21jaWFfZGV2KGRldik7CisJaW50IHJldCA9IDA7CisKKyAgICAgICAgaWYgKCFjb3VudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworCWlmICgocF9kZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9PTikgJiYKKwkgICAgKCFzdHJuY21wKGJ1ZiwgIm9mZiIsIDMpKSkKKwkJcmV0ID0gZHBtX3J1bnRpbWVfc3VzcGVuZChkZXYsIFBNU0dfU1VTUEVORCk7CisJZWxzZSBpZiAoKHBfZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgIT0gUE1fRVZFTlRfT04pICYmCisJCSAoIXN0cm5jbXAoYnVmLCAib24iLCAyKSkpCisJCWRwbV9ydW50aW1lX3Jlc3VtZShkZXYpOworCisJcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OworfQorCisKIHN0YXRpYyBzc2l6ZV90IG1vZGFsaWFzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IHRvX3BjbWNpYV9kZXYoZGV2KTsKQEAgLTk0NSw4ICs5NzQsOSBAQAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2ID0gdG9fcGNtY2lhX2RldihkZXYpOwotICAgICAgICBpZiAoIWNvdW50KQotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlkb3duKCZwX2Rldi0+c29ja2V0LT5za3Rfc2VtKTsKIAlwX2Rldi0+YWxsb3dfZnVuY19pZF9tYXRjaCA9IDE7CkBAIC05NTksNiArOTg5LDcgQEAKIAogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHBjbWNpYV9kZXZfYXR0cnNbXSA9IHsKIAlfX0FUVFIoZnVuY3Rpb24sIDA0NDQsIGZ1bmNfc2hvdywgTlVMTCksCisJX19BVFRSKHBtX3N0YXRlLCAwNjQ0LCBwY21jaWFfc2hvd19wbV9zdGF0ZSwgcGNtY2lhX3N0b3JlX3BtX3N0YXRlKSwKIAlfX0FUVFJfUk8oZnVuY19pZCksCiAJX19BVFRSX1JPKG1hbmZfaWQpLAogCV9fQVRUUl9STyhjYXJkX2lkKSwKQEAgLTExNjcsNiArMTE5OCw4IEBACiAJLnVldmVudCA9IHBjbWNpYV9idXNfdWV2ZW50LAogCS5tYXRjaCA9IHBjbWNpYV9idXNfbWF0Y2gsCiAJLmRldl9hdHRycyA9IHBjbWNpYV9kZXZfYXR0cnMsCisJLnByb2JlID0gcGNtY2lhX2RldmljZV9wcm9iZSwKKwkucmVtb3ZlID0gcGNtY2lhX2RldmljZV9yZW1vdmUsCiAJLnN1c3BlbmQgPSBwY21jaWFfZGV2X3N1c3BlbmQsCiAJLnJlc3VtZSA9IHBjbWNpYV9kZXZfcmVzdW1lLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9tYWluc3RvbmUuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9tYWluc3RvbmUuYwppbmRleCA1ZDk1N2RmLi5mZGEwNjk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfbWFpbnN0b25lLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X21haW5zdG9uZS5jCkBAIC0xNzEsMjcgKzE3MSwyMiBAQAogewogCWludCByZXQ7CiAKLQltc3RfcGNtY2lhX2RldmljZSA9IGt6YWxsb2Moc2l6ZW9mKCptc3RfcGNtY2lhX2RldmljZSksIEdGUF9LRVJORUwpOworCW1zdF9wY21jaWFfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJweGEyeHgtcGNtY2lhIiwgLTEpOwogCWlmICghbXN0X3BjbWNpYV9kZXZpY2UpCiAJCXJldHVybiAtRU5PTUVNOwotCW1zdF9wY21jaWFfZGV2aWNlLT5uYW1lID0gInB4YTJ4eC1wY21jaWEiOworCiAJbXN0X3BjbWNpYV9kZXZpY2UtPmRldi5wbGF0Zm9ybV9kYXRhID0gJm1zdF9wY21jaWFfb3BzOwogCi0JcmV0ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKG1zdF9wY21jaWFfZGV2aWNlKTsKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKG1zdF9wY21jaWFfZGV2aWNlKTsKKwogCWlmIChyZXQpCi0JCWtmcmVlKG1zdF9wY21jaWFfZGV2aWNlKTsKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChtc3RfcGNtY2lhX2RldmljZSk7CiAKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbXN0X3BjbWNpYV9leGl0KHZvaWQpCiB7Ci0JLyoKLQkgKiBUaGlzIGNhbGwgaXMgc3VwcG9zZWQgdG8gZnJlZSBvdXIgbXN0X3BjbWNpYV9kZXZpY2UuCi0JICogVW5mb3J0dW5hdGVseSBwbGF0Zm9ybV9kZXZpY2UgZG9uJ3QgaGF2ZSBhIGZyZWUgbWV0aG9kLCBhbmQKLQkgKiB3ZSBjYW4ndCBhc3N1bWUgaXQncyBmcmVlIG9mIGFueSByZWZlcmVuY2UgYXQgdGhpcyBwb2ludCBzbyB3ZQotCSAqIGNhbid0IGZyZWUgaXQgZWl0aGVyLgotCSAqLwogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKG1zdF9wY21jaWFfZGV2aWNlKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3NoYXJwc2wuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9zaGFycHNsLmMKaW5kZXggYjVmZGVlYy4uZmQzNjQ3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3NoYXJwc2wuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfc2hhcnBzbC5jCkBAIC0zNiw5ICszNiwxOCBAQAogc3RydWN0IHNjb29wX3BjbWNpYV9jb25maWcgKnBsYXRmb3JtX3Njb29wX2NvbmZpZzsKICNkZWZpbmUgU0NPT1BfREVWIHBsYXRmb3JtX3Njb29wX2NvbmZpZy0+ZGV2cwogCi1zdGF0aWMgdm9pZCBzaGFycHNsX3BjbWNpYV9pbml0X3Jlc2V0KHN0cnVjdCBzY29vcF9wY21jaWFfZGV2ICpzY29vcGRldikKK3N0YXRpYyB2b2lkIHNoYXJwc2xfcGNtY2lhX2luaXRfcmVzZXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCiB7CisJc3RydWN0IHNjb29wX3BjbWNpYV9kZXYgKnNjb29wZGV2ID0gJlNDT09QX0RFVltza3QtPm5yXTsKKwogCXJlc2V0X3Njb29wKHNjb29wZGV2LT5kZXYpOworCisJLyogU2hhcmVkIHBvd2VyIGNvbnRyb2xzIG5lZWQgdG8gYmUgaGFuZGxlZCBjYXJlZnVsbHkgKi8KKwlpZiAocGxhdGZvcm1fc2Nvb3BfY29uZmlnLT5wb3dlcl9jdHJsKQorCQlwbGF0Zm9ybV9zY29vcF9jb25maWctPnBvd2VyX2N0cmwoc2Nvb3BkZXYtPmRldiwgMHgwMDAwLCBza3QtPm5yKTsKKwllbHNlCisJCXdyaXRlX3Njb29wX3JlZyhzY29vcGRldi0+ZGV2LCBTQ09PUF9DUFIsIDB4MDAwMCk7CisKIAlzY29vcGRldi0+a2VlcF92cyA9IE5PX0tFRVBfVlM7CiAJc2Nvb3BkZXYtPmtlZXBfcmQgPSAwOwogfQpAQCAtMjA4LDI2ICsyMTcsMTcgQEAKIAogc3RhdGljIHZvaWQgc2hhcnBzbF9wY21jaWFfc29ja2V0X2luaXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCiB7Ci0Jc2hhcnBzbF9wY21jaWFfaW5pdF9yZXNldCgmU0NPT1BfREVWW3NrdC0+bnJdKTsKKwlzaGFycHNsX3BjbWNpYV9pbml0X3Jlc2V0KHNrdCk7CiAKIAkvKiBFbmFibGUgaW50ZXJydXB0ICovCiAJd3JpdGVfc2Nvb3BfcmVnKFNDT09QX0RFVltza3QtPm5yXS5kZXYsIFNDT09QX0lNUiwgMHgwMEMwKTsKIAl3cml0ZV9zY29vcF9yZWcoU0NPT1BfREVWW3NrdC0+bnJdLmRldiwgU0NPT1BfTUNSLCAweDAxMDEpOwogCVNDT09QX0RFVltza3QtPm5yXS5rZWVwX3ZzID0gTk9fS0VFUF9WUzsKLQotCWlmIChtYWNoaW5lX2lzX2NvbGxpZSgpKQotCQkvKiBXZSBuZWVkIHRvIGRpc2FibGUgU1NfT1VUUFVUX0VOQSBoZXJlLiAqLwotCQl3cml0ZV9zY29vcF9yZWcoU0NPT1BfREVWW3NrdC0+bnJdLmRldiwgU0NPT1BfQ1BSLCByZWFkX3Njb29wX3JlZyhTQ09PUF9ERVZbc2t0LT5ucl0uZGV2LCBTQ09PUF9DUFIpICYgfjB4MDA4MCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNoYXJwc2xfcGNtY2lhX3NvY2tldF9zdXNwZW5kKHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQogewotCS8qIENGX0JVU19PRkYgKi8KLQlzaGFycHNsX3BjbWNpYV9pbml0X3Jlc2V0KCZTQ09PUF9ERVZbc2t0LT5ucl0pOwotCi0JaWYgKG1hY2hpbmVfaXNfY29sbGllKCkpCi0JCS8qIFdlIG5lZWQgdG8gZGlzYWJsZSBTU19PVVRQVVRfRU5BIGhlcmUuICovCi0JCXdyaXRlX3Njb29wX3JlZyhTQ09PUF9ERVZbc2t0LT5ucl0uZGV2LCBTQ09PUF9DUFIsIHJlYWRfc2Nvb3BfcmVnKFNDT09QX0RFVltza3QtPm5yXS5kZXYsIFNDT09QX0NQUikgJiB+MHgwMDgwKTsKKwlzaGFycHNsX3BjbWNpYV9pbml0X3Jlc2V0KHNrdCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCBzaGFycHNsX3BjbWNpYV9vcHMgPSB7CkBAIC0yNjMsMzAgKzI2MywyNSBAQAogewogCWludCByZXQ7CiAKLQlzaGFycHNsX3BjbWNpYV9vcHMubnI9cGxhdGZvcm1fc2Nvb3BfY29uZmlnLT5udW1fZGV2czsKLQlzaGFycHNsX3BjbWNpYV9kZXZpY2UgPSBremFsbG9jKHNpemVvZigqc2hhcnBzbF9wY21jaWFfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJc2hhcnBzbF9wY21jaWFfb3BzLm5yID0gcGxhdGZvcm1fc2Nvb3BfY29uZmlnLT5udW1fZGV2czsKKwlzaGFycHNsX3BjbWNpYV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInB4YTJ4eC1wY21jaWEiLCAtMSk7CisKIAlpZiAoIXNoYXJwc2xfcGNtY2lhX2RldmljZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzaGFycHNsX3BjbWNpYV9kZXZpY2UtPm5hbWUgPSAicHhhMnh4LXBjbWNpYSI7CiAJc2hhcnBzbF9wY21jaWFfZGV2aWNlLT5kZXYucGxhdGZvcm1fZGF0YSA9ICZzaGFycHNsX3BjbWNpYV9vcHM7Ci0Jc2hhcnBzbF9wY21jaWFfZGV2aWNlLT5kZXYucGFyZW50PXBsYXRmb3JtX3Njb29wX2NvbmZpZy0+ZGV2c1swXS5kZXY7CisJc2hhcnBzbF9wY21jaWFfZGV2aWNlLT5kZXYucGFyZW50ID0gcGxhdGZvcm1fc2Nvb3BfY29uZmlnLT5kZXZzWzBdLmRldjsKIAotCXJldCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcihzaGFycHNsX3BjbWNpYV9kZXZpY2UpOworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQoc2hhcnBzbF9wY21jaWFfZGV2aWNlKTsKKwogCWlmIChyZXQpCi0JCWtmcmVlKHNoYXJwc2xfcGNtY2lhX2RldmljZSk7CisJCXBsYXRmb3JtX2RldmljZV9wdXQoc2hhcnBzbF9wY21jaWFfZGV2aWNlKTsKIAogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzaGFycHNsX3BjbWNpYV9leGl0KHZvaWQpCiB7Ci0JLyoKLQkgKiBUaGlzIGNhbGwgaXMgc3VwcG9zZWQgdG8gZnJlZSBvdXIgc2hhcnBzbF9wY21jaWFfZGV2aWNlLgotCSAqIFVuZm9ydHVuYXRlbHkgcGxhdGZvcm1fZGV2aWNlIGRvbid0IGhhdmUgYSBmcmVlIG1ldGhvZCwgYW5kCi0JICogd2UgY2FuJ3QgYXNzdW1lIGl0J3MgZnJlZSBvZiBhbnkgcmVmZXJlbmNlIGF0IHRoaXMgcG9pbnQgc28gd2UKLQkgKiBjYW4ndCBmcmVlIGl0IGVpdGhlci4KLQkgKi8KIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihzaGFycHNsX3BjbWNpYV9kZXZpY2UpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9zb2NrZXRfc3lzZnMuYyBiL2RyaXZlcnMvcGNtY2lhL3NvY2tldF9zeXNmcy5jCmluZGV4IDdhNzc0NDYuLjVhYjFjZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3NvY2tldF9zeXNmcy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3NvY2tldF9zeXNmcy5jCkBAIC05OCw2ICs5OCwzMCBAQAogfQogc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGNhcmRfaW5zZXJ0LCAwMjAwLCBOVUxMLCBwY2NhcmRfc3RvcmVfaW5zZXJ0KTsKIAorCitzdGF0aWMgc3NpemVfdCBwY2NhcmRfc2hvd19jYXJkX3BtX3N0YXRlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gdG9fc29ja2V0KGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHMtPnN0YXRlICYgU09DS0VUX1NVU1BFTkQgPyAib2ZmIiA6ICJvbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBwY2NhcmRfc3RvcmVfY2FyZF9wbV9zdGF0ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXNzaXplX3QgcmV0ID0gLUVJTlZBTDsKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IHRvX3NvY2tldChkZXYpOworCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9TVVNQRU5EKSAmJiAhc3RybmNtcChidWYsICJvZmYiLCAzKSkKKwkJcmV0ID0gcGNtY2lhX3N1c3BlbmRfY2FyZChzKTsKKwllbHNlIGlmICgocy0+c3RhdGUgJiBTT0NLRVRfU1VTUEVORCkgJiYgIXN0cm5jbXAoYnVmLCAib24iLCAyKSkKKwkJcmV0ID0gcGNtY2lhX3Jlc3VtZV9jYXJkKHMpOworCisJcmV0dXJuIHJldCA/IC1FTk9ERVYgOiBjb3VudDsKK30KK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihjYXJkX3BtX3N0YXRlLCAwNjQ0LCBwY2NhcmRfc2hvd19jYXJkX3BtX3N0YXRlLCBwY2NhcmRfc3RvcmVfY2FyZF9wbV9zdGF0ZSk7CisKIHN0YXRpYyBzc2l6ZV90IHBjY2FyZF9zdG9yZV9lamVjdChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXNzaXplX3QgcmV0OwpAQCAtMzIwLDYgKzM0NCw3IEBACiAJJmNsYXNzX2RldmljZV9hdHRyX2NhcmRfdnBwLAogCSZjbGFzc19kZXZpY2VfYXR0cl9jYXJkX3ZjYywKIAkmY2xhc3NfZGV2aWNlX2F0dHJfY2FyZF9pbnNlcnQsCisJJmNsYXNzX2RldmljZV9hdHRyX2NhcmRfcG1fc3RhdGUsCiAJJmNsYXNzX2RldmljZV9hdHRyX2NhcmRfZWplY3QsCiAJJmNsYXNzX2RldmljZV9hdHRyX2NhcmRfaXJxX21hc2ssCiAJJmNsYXNzX2RldmljZV9hdHRyX2F2YWlsYWJsZV9yZXNvdXJjZXNfc2V0dXBfZG9uZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3ZyYzQxNzFfY2FyZC5jIGIvZHJpdmVycy9wY21jaWEvdnJjNDE3MV9jYXJkLmMKaW5kZXggMjRjNTQ3ZS4uMDU3NGVmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvdnJjNDE3MV9jYXJkLmMKKysrIGIvZHJpdmVycy9wY21jaWEvdnJjNDE3MV9jYXJkLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogdnJjNDE3MV9jYXJkLmMsIE5FQyBWUkM0MTcxIENhcmQgQ29udHJvbGxlciBkcml2ZXIgZm9yIFNvY2tldCBTZXJ2aWNlcy4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1ICBZb2ljaGkgWXVhc2EgPHlvaWNoaV95dWFzYUB0cmlwZWFrcy5jby5qcD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMzMsNyArMzMsNyBAQAogI2luY2x1ZGUgImk4MjM2NS5oIgogCiBNT0RVTEVfREVTQ1JJUFRJT04oIk5FQyBWUkM0MTcxIENhcmQgQ29udHJvbGxlcnMgZHJpdmVyIGZvciBTb2NrZXQgU2VydmljZXMiKTsKLU1PRFVMRV9BVVRIT1IoIllvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+Iik7CitNT0RVTEVfQVVUSE9SKCJZb2ljaGkgWXVhc2EgPHlvaWNoaV95dWFzYUB0cmlwZWFrcy5jby5qcD4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogI2RlZmluZSBDQVJEX01BWF9TTE9UUwkJMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvdnJjNDE3M19jYXJkdS5jIGIvZHJpdmVycy9wY21jaWEvdnJjNDE3M19jYXJkdS5jCmluZGV4IDFiMjc3ZDIuLjU3ZjM4ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3ZyYzQxNzNfY2FyZHUuYworKysgYi9kcml2ZXJzL3BjbWNpYS92cmM0MTczX2NhcmR1LmMKQEAgLTYsNyArNiw3IEBACiAgKiAJTkVDIFZSQzQxNzMgQ0FSRFUgZHJpdmVyIGZvciBTb2NrZXQgU2VydmljZXMKICAqCShUaGlzIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgQ2FyZEJ1cy4gaXQgaXMgc3VwcG9ydGluZyBvbmx5IDE2Yml0IFBDIENhcmQuKQogICoKLSAqIENvcHlyaWdodCAyMDAyLDIwMDMgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KKyAqIENvcHlyaWdodCAyMDAyLDIwMDMgWW9pY2hpIFl1YXNhIDx5b2ljaGlfeXVhc2FAdHJpcGVha3MuY28uanA+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCkBAIC00MSw3ICs0MSw3IEBACiAjaW5jbHVkZSAidnJjNDE3M19jYXJkdS5oIgogCiBNT0RVTEVfREVTQ1JJUFRJT04oIk5FQyBWUkM0MTczIENBUkRVIGRyaXZlciBmb3IgU29ja2V0IFNlcnZpY2VzIik7Ci1NT0RVTEVfQVVUSE9SKCJZb2ljaGkgWXVhc2EgPHl1YXNhQGhoLmlpajR1Lm9yLmpwPiIpOworTU9EVUxFX0FVVEhPUigiWW9pY2hpIFl1YXNhIDx5b2ljaGlfeXVhc2FAdHJpcGVha3MuY28uanA+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0YXRpYyBpbnQgdnJjNDE3M19jYXJkdV9zbG90czsKQEAgLTU2MSw3ICs1NjEsNyBAQAogewogCXZyYzQxNzNfY2FyZHVfc2xvdHMgPSAwOwogCi0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmdnJjNDE3M19jYXJkdV9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ2cmM0MTczX2NhcmR1X2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCB2cmM0MTczX2NhcmR1X2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3ZyYzQxNzNfY2FyZHUuaCBiL2RyaXZlcnMvcGNtY2lhL3ZyYzQxNzNfY2FyZHUuaAppbmRleCAxMTM3MjZmLi43ZDc3Yzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS92cmM0MTczX2NhcmR1LmgKKysrIGIvZHJpdmVycy9wY21jaWEvdnJjNDE3M19jYXJkdS5oCkBAIC01LDcgKzUsNyBAQAogICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCiAgKglJbmNsdWRlIGZpbGUgZm9yIE5FQyBWUkM0MTczIENBUkRVLgogICoKLSAqIENvcHlyaWdodCAyMDAyIFlvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+CisgKiBDb3B5cmlnaHQgMjAwMiBZb2ljaGkgWXVhc2EgPHlvaWNoaV95dWFzYUB0cmlwZWFrcy5jby5qcD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL2RyaXZlci5jIGIvZHJpdmVycy9wbnAvZHJpdmVyLmMKaW5kZXggMTVmYjc1OC4uN2NhZmFjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvZHJpdmVyLmMKKysrIGIvZHJpdmVycy9wbnAvZHJpdmVyLmMKQEAgLTE5NSw2ICsxOTUsOCBAQAogc3RydWN0IGJ1c190eXBlIHBucF9idXNfdHlwZSA9IHsKIAkubmFtZQk9ICJwbnAiLAogCS5tYXRjaAk9IHBucF9idXNfbWF0Y2gsCisJLnByb2JlCT0gcG5wX2RldmljZV9wcm9iZSwKKwkucmVtb3ZlCT0gcG5wX2RldmljZV9yZW1vdmUsCiAJLnN1c3BlbmQgPSBwbnBfYnVzX3N1c3BlbmQsCiAJLnJlc3VtZSA9IHBucF9idXNfcmVzdW1lLAogfTsKQEAgLTIxNSw4ICsyMTcsNiBAQAogCiAJZHJ2LT5kcml2ZXIubmFtZSA9IGRydi0+bmFtZTsKIAlkcnYtPmRyaXZlci5idXMgPSAmcG5wX2J1c190eXBlOwotCWRydi0+ZHJpdmVyLnByb2JlID0gcG5wX2RldmljZV9wcm9iZTsKLQlkcnYtPmRyaXZlci5yZW1vdmUgPSBwbnBfZGV2aWNlX3JlbW92ZTsKIAogCWNvdW50ID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jIGIvZHJpdmVycy9wbnAvcG5wYWNwaS9jb3JlLmMKaW5kZXggODE2NDc5YS4uZjEwNDU3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYWNwaS9jb3JlLmMKKysrIGIvZHJpdmVycy9wbnAvcG5wYWNwaS9jb3JlLmMKQEAgLTI3LDEyICsyNywxNSBAQAogCiBzdGF0aWMgaW50IG51bSA9IDA7CiAKKy8qIFdlIG5lZWQgb25seSB0byBibGFja2xpc3QgZGV2aWNlcyB0aGF0IGhhdmUgYWxyZWFkeSBhbiBhY3BpIGRyaXZlciB0aGF0CisgKiBjYW4ndCB1c2UgcG5wIGxheWVyLiBXZSBkb24ndCBuZWVkIHRvIGJsYWNrbGlzdCBkZXZpY2UgdGhhdCBhcmUgZGlyZWN0bHkKKyAqIHVzZWQgYnkgdGhlIGtlcm5lbCAoUENJIHJvb3QsIC4uLiksIGFzIGl0IGlzIGhhcm1sZXNzIGFuZCB0aGVyZSB3ZXJlCisgKiBhbHJlYWR5IHByZXNlbnQgaW4gcG5wYmlvcy4gQnV0IHRoZXJlIGlzIGFuIGV4Y2VwdGlvbiBmb3IgZGV2aWNlcyB0aGF0CisgKiBoYXZlIGlycXMgKFBJQywgVGltZXIpIGJlY2F1c2Ugd2UgY2FsbCBhY3BpX3JlZ2lzdGVyX2dzaS4KKyAqIEZpbmFseSBvbmx5IGRldmljZXMgdGhhdCBoYXZlIGEgQ1JTIG1ldGhvZCBuZWVkIHRvIGJlIGluIHRoaXMgbGlzdC4KKyAqLwogc3RhdGljIGNoYXIgX19pbml0ZGF0YSBleGNsdWRlZF9pZF9saXN0W10gPQotCSJQTlAwQzBBLCIgLyogQmF0dGVyeSAqLwotCSJQTlAwQzBDLFBOUDBDMEUsUE5QMEMwRCwiIC8qIEJ1dHRvbiAqLwogCSJQTlAwQzA5LCIgLyogRUMgKi8KLQkiUE5QMEMwQiwiIC8qIEZhbiAqLwotCSJQTlAwQTAzLCIgLyogUENJIHJvb3QgKi8KIAkiUE5QMEMwRiwiIC8qIExpbmsgZGV2aWNlICovCiAJIlBOUDAwMDAsIiAvKiBQSUMgKi8KIAkiUE5QMDEwMCwiIC8qIFRpbWVyICovCkBAIC0xMzEsNyArMTM0LDggQEAKIAlzdHJ1Y3QgcG5wX2lkICpkZXZfaWQ7CiAJc3RydWN0IHBucF9kZXYgKmRldjsKIAotCWlmICghaXNwbnBpZGFjcGkoYWNwaV9kZXZpY2VfaGlkKGRldmljZSkpIHx8CisJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX0NSUyIsICZ0ZW1wKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgIWlzcG5waWRhY3BpKGFjcGlfZGV2aWNlX2hpZChkZXZpY2UpKSB8fAogCQlpc19leGNsdXNpdmVfZGV2aWNlKGRldmljZSkpCiAJCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMgYi9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMKaW5kZXggNDE2ZDMwZC4uNDA3YjRlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYWNwaS9yc3BhcnNlci5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvcnNwYXJzZXIuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgTWF0dGhpZXUgQ2FzdGV0IDxjYXN0ZXQubWF0dGhpZXVAZnJlZS5mcj4KICAqIENvcHlyaWdodCAoYykgMjAwNCBMaSBTaGFvaHVhIDxzaGFvaHVhLmxpQGludGVsLmNvbT4KLSAqIAorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKICAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKQEAgLTMyLDE3ICszMiwxNyBAQAogLyoKICAqIEFsbG9jYXRlZCBSZXNvdXJjZXMKICAqLwotc3RhdGljIGludCBpcnFfZmxhZ3MoaW50IGVkZ2VfbGV2ZWwsIGludCBhY3RpdmVfaGlnaF9sb3cpCitzdGF0aWMgaW50IGlycV9mbGFncyhpbnQgdHJpZ2dlcmluZywgaW50IHBvbGFyaXR5KQogewogCWludCBmbGFnOwotCWlmIChlZGdlX2xldmVsID09IEFDUElfTEVWRUxfU0VOU0lUSVZFKSB7Ci0JCWlmKGFjdGl2ZV9oaWdoX2xvdyA9PSBBQ1BJX0FDVElWRV9MT1cpCisJaWYgKHRyaWdnZXJpbmcgPT0gQUNQSV9MRVZFTF9TRU5TSVRJVkUpIHsKKwkJaWYocG9sYXJpdHkgPT0gQUNQSV9BQ1RJVkVfTE9XKQogCQkJZmxhZyA9IElPUkVTT1VSQ0VfSVJRX0xPV0xFVkVMOwogCQllbHNlCiAJCQlmbGFnID0gSU9SRVNPVVJDRV9JUlFfSElHSExFVkVMOwogCX0KIAllbHNlIHsKLQkJaWYoYWN0aXZlX2hpZ2hfbG93ID09IEFDUElfQUNUSVZFX0xPVykKKwkJaWYocG9sYXJpdHkgPT0gQUNQSV9BQ1RJVkVfTE9XKQogCQkJZmxhZyA9IElPUkVTT1VSQ0VfSVJRX0xPV0VER0U7CiAJCWVsc2UKIAkJCWZsYWcgPSBJT1JFU09VUkNFX0lSUV9ISUdIRURHRTsKQEAgLTUwLDMxICs1MCwzMSBAQAogCXJldHVybiBmbGFnOwogfQogCi1zdGF0aWMgdm9pZCBkZWNvZGVfaXJxX2ZsYWdzKGludCBmbGFnLCBpbnQgKmVkZ2VfbGV2ZWwsIGludCAqYWN0aXZlX2hpZ2hfbG93KQorc3RhdGljIHZvaWQgZGVjb2RlX2lycV9mbGFncyhpbnQgZmxhZywgaW50ICp0cmlnZ2VyaW5nLCBpbnQgKnBvbGFyaXR5KQogewogCXN3aXRjaCAoZmxhZykgewogCWNhc2UgSU9SRVNPVVJDRV9JUlFfTE9XTEVWRUw6Ci0JCSplZGdlX2xldmVsID0gQUNQSV9MRVZFTF9TRU5TSVRJVkU7Ci0JCSphY3RpdmVfaGlnaF9sb3cgPSBBQ1BJX0FDVElWRV9MT1c7CisJCSp0cmlnZ2VyaW5nID0gQUNQSV9MRVZFTF9TRU5TSVRJVkU7CisJCSpwb2xhcml0eSA9IEFDUElfQUNUSVZFX0xPVzsKIAkJYnJlYWs7CiAJY2FzZSBJT1JFU09VUkNFX0lSUV9ISUdITEVWRUw6CQotCQkqZWRnZV9sZXZlbCA9IEFDUElfTEVWRUxfU0VOU0lUSVZFOwotCQkqYWN0aXZlX2hpZ2hfbG93ID0gQUNQSV9BQ1RJVkVfSElHSDsKKwkJKnRyaWdnZXJpbmcgPSBBQ1BJX0xFVkVMX1NFTlNJVElWRTsKKwkJKnBvbGFyaXR5ID0gQUNQSV9BQ1RJVkVfSElHSDsKIAkJYnJlYWs7CiAJY2FzZSBJT1JFU09VUkNFX0lSUV9MT1dFREdFOgotCQkqZWRnZV9sZXZlbCA9IEFDUElfRURHRV9TRU5TSVRJVkU7Ci0JCSphY3RpdmVfaGlnaF9sb3cgPSBBQ1BJX0FDVElWRV9MT1c7CisJCSp0cmlnZ2VyaW5nID0gQUNQSV9FREdFX1NFTlNJVElWRTsKKwkJKnBvbGFyaXR5ID0gQUNQSV9BQ1RJVkVfTE9XOwogCQlicmVhazsKIAljYXNlIElPUkVTT1VSQ0VfSVJRX0hJR0hFREdFOgotCQkqZWRnZV9sZXZlbCA9IEFDUElfRURHRV9TRU5TSVRJVkU7Ci0JCSphY3RpdmVfaGlnaF9sb3cgPSBBQ1BJX0FDVElWRV9ISUdIOworCQkqdHJpZ2dlcmluZyA9IEFDUElfRURHRV9TRU5TSVRJVkU7CisJCSpwb2xhcml0eSA9IEFDUElfQUNUSVZFX0hJR0g7CiAJCWJyZWFrOwogCX0KIH0KIAogc3RhdGljIHZvaWQKIHBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX2lycXJlc291cmNlKHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKiByZXMsIHUzMiBnc2ksCi0JaW50IGVkZ2VfbGV2ZWwsIGludCBhY3RpdmVfaGlnaF9sb3cpCisJaW50IHRyaWdnZXJpbmcsIGludCBwb2xhcml0eSkKIHsKIAlpbnQgaSA9IDA7CiAJaW50IGlycTsKQEAgLTg5LDcgKzg5LDcgQEAKIAkJcmV0dXJuOwogCiAJcmVzLT5pcnFfcmVzb3VyY2VbaV0uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsgIC8vIEFsc28gY2xlYXJzIF9VTlNFVCBmbGFnCi0JaXJxID0gYWNwaV9yZWdpc3Rlcl9nc2koZ3NpLCBlZGdlX2xldmVsLCBhY3RpdmVfaGlnaF9sb3cpOworCWlycSA9IGFjcGlfcmVnaXN0ZXJfZ3NpKGdzaSwgdHJpZ2dlcmluZywgcG9sYXJpdHkpOwogCWlmIChpcnEgPCAwKSB7CiAJCXJlcy0+aXJxX3Jlc291cmNlW2ldLmZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CiAJCXJldHVybjsKQEAgLTE2Myw3NyArMTYzLDk2IEBACiAJc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqIHJlc190YWJsZSA9IChzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICopZGF0YTsKIAlpbnQgaTsKIAotCXN3aXRjaCAocmVzLT5pZCkgewotCWNhc2UgQUNQSV9SU1RZUEVfSVJROgorCXN3aXRjaCAocmVzLT50eXBlKSB7CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfSVJROgogCQkvKgogCQkgKiBQZXIgc3BlYywgb25seSBvbmUgaW50ZXJydXB0IHBlciBkZXNjcmlwdG9yIGlzIGFsbG93ZWQgaW4KIAkJICogX0NSUywgYnV0IHNvbWUgZmlybXdhcmUgdmlvbGF0ZXMgdGhpcywgc28gcGFyc2UgdGhlbSBhbGwuCiAJCSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgcmVzLT5kYXRhLmlycS5udW1iZXJfb2ZfaW50ZXJydXB0czsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCByZXMtPmRhdGEuaXJxLmludGVycnVwdF9jb3VudDsgaSsrKSB7CiAJCQlwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9pcnFyZXNvdXJjZShyZXNfdGFibGUsCiAJCQkJcmVzLT5kYXRhLmlycS5pbnRlcnJ1cHRzW2ldLAotCQkJCXJlcy0+ZGF0YS5pcnEuZWRnZV9sZXZlbCwKLQkJCQlyZXMtPmRhdGEuaXJxLmFjdGl2ZV9oaWdoX2xvdyk7CisJCQkJcmVzLT5kYXRhLmlycS50cmlnZ2VyaW5nLAorCQkJCXJlcy0+ZGF0YS5pcnEucG9sYXJpdHkpOwogCQl9CiAJCWJyZWFrOwogCi0JY2FzZSBBQ1BJX1JTVFlQRV9FWFRfSVJROgotCQlmb3IgKGkgPSAwOyBpIDwgcmVzLT5kYXRhLmV4dGVuZGVkX2lycS5udW1iZXJfb2ZfaW50ZXJydXB0czsgaSsrKSB7Ci0JCQlwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9pcnFyZXNvdXJjZShyZXNfdGFibGUsCi0JCQkJcmVzLT5kYXRhLmV4dGVuZGVkX2lycS5pbnRlcnJ1cHRzW2ldLAotCQkJCXJlcy0+ZGF0YS5leHRlbmRlZF9pcnEuZWRnZV9sZXZlbCwKLQkJCQlyZXMtPmRhdGEuZXh0ZW5kZWRfaXJxLmFjdGl2ZV9oaWdoX2xvdyk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBQ1BJX1JTVFlQRV9ETUE6Ci0JCWlmIChyZXMtPmRhdGEuZG1hLm51bWJlcl9vZl9jaGFubmVscyA+IDApCi0JCQlwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9kbWFyZXNvdXJjZShyZXNfdGFibGUsIAorCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0RNQToKKwkJaWYgKHJlcy0+ZGF0YS5kbWEuY2hhbm5lbF9jb3VudCA+IDApCisJCQlwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9kbWFyZXNvdXJjZShyZXNfdGFibGUsCiAJCQkJCXJlcy0+ZGF0YS5kbWEuY2hhbm5lbHNbMF0pOwogCQlicmVhazsKLQljYXNlIEFDUElfUlNUWVBFX0lPOgotCQlwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9pb3Jlc291cmNlKHJlc190YWJsZSwgCi0JCQkJcmVzLT5kYXRhLmlvLm1pbl9iYXNlX2FkZHJlc3MsIAotCQkJCXJlcy0+ZGF0YS5pby5yYW5nZV9sZW5ndGgpOworCisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfSU86CisJCXBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX2lvcmVzb3VyY2UocmVzX3RhYmxlLAorCQkJCXJlcy0+ZGF0YS5pby5taW5pbXVtLAorCQkJCXJlcy0+ZGF0YS5pby5hZGRyZXNzX2xlbmd0aCk7CiAJCWJyZWFrOwotCWNhc2UgQUNQSV9SU1RZUEVfRklYRURfSU86Ci0JCXBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX2lvcmVzb3VyY2UocmVzX3RhYmxlLCAKLQkJCQlyZXMtPmRhdGEuZml4ZWRfaW8uYmFzZV9hZGRyZXNzLCAKLQkJCQlyZXMtPmRhdGEuZml4ZWRfaW8ucmFuZ2VfbGVuZ3RoKTsKKworCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX1NUQVJUX0RFUEVOREVOVDoKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfREVQRU5ERU5UOgogCQlicmVhazsKLQljYXNlIEFDUElfUlNUWVBFX01FTTI0OgotCQlwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9tZW1yZXNvdXJjZShyZXNfdGFibGUsIAotCQkJCXJlcy0+ZGF0YS5tZW1vcnkyNC5taW5fYmFzZV9hZGRyZXNzLCAKLQkJCQlyZXMtPmRhdGEubWVtb3J5MjQucmFuZ2VfbGVuZ3RoKTsKKworCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0ZJWEVEX0lPOgorCQlwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9pb3Jlc291cmNlKHJlc190YWJsZSwKKwkJCQlyZXMtPmRhdGEuZml4ZWRfaW8uYWRkcmVzcywKKwkJCQlyZXMtPmRhdGEuZml4ZWRfaW8uYWRkcmVzc19sZW5ndGgpOwogCQlicmVhazsKLQljYXNlIEFDUElfUlNUWVBFX01FTTMyOgotCQlwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9tZW1yZXNvdXJjZShyZXNfdGFibGUsIAotCQkJCXJlcy0+ZGF0YS5tZW1vcnkzMi5taW5fYmFzZV9hZGRyZXNzLCAKLQkJCQlyZXMtPmRhdGEubWVtb3J5MzIucmFuZ2VfbGVuZ3RoKTsKKworCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX1ZFTkRPUjoKIAkJYnJlYWs7Ci0JY2FzZSBBQ1BJX1JTVFlQRV9GSVhFRF9NRU0zMjoKLQkJcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfbWVtcmVzb3VyY2UocmVzX3RhYmxlLCAKLQkJCQlyZXMtPmRhdGEuZml4ZWRfbWVtb3J5MzIucmFuZ2VfYmFzZV9hZGRyZXNzLCAKLQkJCQlyZXMtPmRhdGEuZml4ZWRfbWVtb3J5MzIucmFuZ2VfbGVuZ3RoKTsKKworCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0VORF9UQUc6CiAJCWJyZWFrOwotCWNhc2UgQUNQSV9SU1RZUEVfQUREUkVTUzE2OgotCQlwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9tZW1yZXNvdXJjZShyZXNfdGFibGUsIAotCQkJCXJlcy0+ZGF0YS5hZGRyZXNzMTYubWluX2FkZHJlc3NfcmFuZ2UsIAorCisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMjQ6CisJCXBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX21lbXJlc291cmNlKHJlc190YWJsZSwKKwkJCQlyZXMtPmRhdGEubWVtb3J5MjQubWluaW11bSwKKwkJCQlyZXMtPmRhdGEubWVtb3J5MjQuYWRkcmVzc19sZW5ndGgpOworCQlicmVhazsKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkzMjoKKwkJcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfbWVtcmVzb3VyY2UocmVzX3RhYmxlLAorCQkJCXJlcy0+ZGF0YS5tZW1vcnkzMi5taW5pbXVtLAorCQkJCXJlcy0+ZGF0YS5tZW1vcnkzMi5hZGRyZXNzX2xlbmd0aCk7CisJCWJyZWFrOworCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0ZJWEVEX01FTU9SWTMyOgorCQlwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9tZW1yZXNvdXJjZShyZXNfdGFibGUsCisJCQkJcmVzLT5kYXRhLmZpeGVkX21lbW9yeTMyLmFkZHJlc3MsCisJCQkJcmVzLT5kYXRhLmZpeGVkX21lbW9yeTMyLmFkZHJlc3NfbGVuZ3RoKTsKKwkJYnJlYWs7CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzE2OgorCQlwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9tZW1yZXNvdXJjZShyZXNfdGFibGUsCisJCQkJcmVzLT5kYXRhLmFkZHJlc3MxNi5taW5pbXVtLAogCQkJCXJlcy0+ZGF0YS5hZGRyZXNzMTYuYWRkcmVzc19sZW5ndGgpOwogCQlicmVhazsKLQljYXNlIEFDUElfUlNUWVBFX0FERFJFU1MzMjoKLQkJcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfbWVtcmVzb3VyY2UocmVzX3RhYmxlLCAKLQkJCQlyZXMtPmRhdGEuYWRkcmVzczMyLm1pbl9hZGRyZXNzX3JhbmdlLCAKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMzI6CisJCXBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX21lbXJlc291cmNlKHJlc190YWJsZSwKKwkJCQlyZXMtPmRhdGEuYWRkcmVzczMyLm1pbmltdW0sCiAJCQkJcmVzLT5kYXRhLmFkZHJlc3MzMi5hZGRyZXNzX2xlbmd0aCk7CiAJCWJyZWFrOwotCWNhc2UgQUNQSV9SU1RZUEVfQUREUkVTUzY0OgotCQlwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9tZW1yZXNvdXJjZShyZXNfdGFibGUsIAotCQlyZXMtPmRhdGEuYWRkcmVzczY0Lm1pbl9hZGRyZXNzX3JhbmdlLCAKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTNjQ6CisJCXBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX21lbXJlc291cmNlKHJlc190YWJsZSwKKwkJcmVzLT5kYXRhLmFkZHJlc3M2NC5taW5pbXVtLAogCQlyZXMtPmRhdGEuYWRkcmVzczY0LmFkZHJlc3NfbGVuZ3RoKTsKIAkJYnJlYWs7Ci0JY2FzZSBBQ1BJX1JTVFlQRV9WRU5ET1I6CisKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FWFRFTkRFRF9BRERSRVNTNjQ6CiAJCWJyZWFrOworCisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRVhURU5ERURfSVJROgorCQlmb3IgKGkgPSAwOyBpIDwgcmVzLT5kYXRhLmV4dGVuZGVkX2lycS5pbnRlcnJ1cHRfY291bnQ7IGkrKykgeworCQkJcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfaXJxcmVzb3VyY2UocmVzX3RhYmxlLAorCQkJCXJlcy0+ZGF0YS5leHRlbmRlZF9pcnEuaW50ZXJydXB0c1tpXSwKKwkJCQlyZXMtPmRhdGEuZXh0ZW5kZWRfaXJxLnRyaWdnZXJpbmcsCisJCQkJcmVzLT5kYXRhLmV4dGVuZGVkX2lycS5wb2xhcml0eSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9HRU5FUklDX1JFR0lTVEVSOgorCQlicmVhazsKKwogCWRlZmF1bHQ6Ci0JCXBucF93YXJuKCJQblBBQ1BJOiB1bmtub3duIHJlc291cmNlIHR5cGUgJWQiLCByZXMtPmlkKTsKKwkJcG5wX3dhcm4oIlBuUEFDUEk6IHVua25vd24gcmVzb3VyY2UgdHlwZSAlZCIsIHJlcy0+dHlwZSk7CiAJCXJldHVybiBBRV9FUlJPUjsKIAl9CiAJCQkKQEAgLTI1MywxMyArMjcyLDEzIEBACiAJaW50IGk7CiAJc3RydWN0IHBucF9kbWEgKiBkbWE7CiAKLQlpZiAocC0+bnVtYmVyX29mX2NoYW5uZWxzID09IDApCisJaWYgKHAtPmNoYW5uZWxfY291bnQgPT0gMCkKIAkJcmV0dXJuOwogCWRtYSA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfZG1hKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkbWEpCiAJCXJldHVybjsKIAotCWZvcihpID0gMDsgaSA8IHAtPm51bWJlcl9vZl9jaGFubmVsczsgaSsrKQorCWZvcihpID0gMDsgaSA8IHAtPmNoYW5uZWxfY291bnQ7IGkrKykKIAkJZG1hLT5tYXAgfD0gMSA8PCBwLT5jaGFubmVsc1tpXTsKIAlkbWEtPmZsYWdzID0gMDsKIAlpZiAocC0+YnVzX21hc3RlcikKQEAgLTMwOSwzNyArMzI4LDM3IEBACiAJaW50IGk7CiAJc3RydWN0IHBucF9pcnEgKiBpcnE7CiAJCi0JaWYgKHAtPm51bWJlcl9vZl9pbnRlcnJ1cHRzID09IDApCisJaWYgKHAtPmludGVycnVwdF9jb3VudCA9PSAwKQogCQlyZXR1cm47CiAJaXJxID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9pcnEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWlycSkKIAkJcmV0dXJuOwogCi0JZm9yKGkgPSAwOyBpIDwgcC0+bnVtYmVyX29mX2ludGVycnVwdHM7IGkrKykKKwlmb3IoaSA9IDA7IGkgPCBwLT5pbnRlcnJ1cHRfY291bnQ7IGkrKykKIAkJaWYgKHAtPmludGVycnVwdHNbaV0pCiAJCQlfX3NldF9iaXQocC0+aW50ZXJydXB0c1tpXSwgaXJxLT5tYXApOwotCWlycS0+ZmxhZ3MgPSBpcnFfZmxhZ3MocC0+ZWRnZV9sZXZlbCwgcC0+YWN0aXZlX2hpZ2hfbG93KTsKKwlpcnEtPmZsYWdzID0gaXJxX2ZsYWdzKHAtPnRyaWdnZXJpbmcsIHAtPnBvbGFyaXR5KTsKIAogCXBucF9yZWdpc3Rlcl9pcnFfcmVzb3VyY2Uob3B0aW9uLCBpcnEpOwogCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQgcG5wYWNwaV9wYXJzZV9leHRfaXJxX29wdGlvbihzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLAotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dF9pcnEgKnApCisJc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0ZW5kZWRfaXJxICpwKQogewogCWludCBpOwogCXN0cnVjdCBwbnBfaXJxICogaXJxOwogCi0JaWYgKHAtPm51bWJlcl9vZl9pbnRlcnJ1cHRzID09IDApCisJaWYgKHAtPmludGVycnVwdF9jb3VudCA9PSAwKQogCQlyZXR1cm47CiAJaXJxID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9pcnEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWlycSkKIAkJcmV0dXJuOwogCi0JZm9yKGkgPSAwOyBpIDwgcC0+bnVtYmVyX29mX2ludGVycnVwdHM7IGkrKykKKwlmb3IoaSA9IDA7IGkgPCBwLT5pbnRlcnJ1cHRfY291bnQ7IGkrKykKIAkJaWYgKHAtPmludGVycnVwdHNbaV0pCiAJCQlfX3NldF9iaXQocC0+aW50ZXJydXB0c1tpXSwgaXJxLT5tYXApOwotCWlycS0+ZmxhZ3MgPSBpcnFfZmxhZ3MocC0+ZWRnZV9sZXZlbCwgcC0+YWN0aXZlX2hpZ2hfbG93KTsKKwlpcnEtPmZsYWdzID0gaXJxX2ZsYWdzKHAtPnRyaWdnZXJpbmcsIHAtPnBvbGFyaXR5KTsKIAogCXBucF9yZWdpc3Rlcl9pcnFfcmVzb3VyY2Uob3B0aW9uLCBpcnEpOwogCXJldHVybjsKQEAgLTM1MSwxNiArMzcwLDE2IEBACiB7CiAJc3RydWN0IHBucF9wb3J0ICogcG9ydDsKIAotCWlmIChpby0+cmFuZ2VfbGVuZ3RoID09IDApCisJaWYgKGlvLT5hZGRyZXNzX2xlbmd0aCA9PSAwKQogCQlyZXR1cm47CiAJcG9ydCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfcG9ydCksIEdGUF9LRVJORUwpOwogCWlmICghcG9ydCkKIAkJcmV0dXJuOwotCXBvcnQtPm1pbiA9IGlvLT5taW5fYmFzZV9hZGRyZXNzOwotCXBvcnQtPm1heCA9IGlvLT5tYXhfYmFzZV9hZGRyZXNzOworCXBvcnQtPm1pbiA9IGlvLT5taW5pbXVtOworCXBvcnQtPm1heCA9IGlvLT5tYXhpbXVtOwogCXBvcnQtPmFsaWduID0gaW8tPmFsaWdubWVudDsKLQlwb3J0LT5zaXplID0gaW8tPnJhbmdlX2xlbmd0aDsKLQlwb3J0LT5mbGFncyA9IEFDUElfREVDT0RFXzE2ID09IGlvLT5pb19kZWNvZGUgPyAKKwlwb3J0LT5zaXplID0gaW8tPmFkZHJlc3NfbGVuZ3RoOworCXBvcnQtPmZsYWdzID0gQUNQSV9ERUNPREVfMTYgPT0gaW8tPmlvX2RlY29kZSA/CiAJCVBOUF9QT1JUX0ZMQUdfMTZCSVRBRERSIDogMDsKIAlwbnBfcmVnaXN0ZXJfcG9ydF9yZXNvdXJjZShvcHRpb24scG9ydCk7CiAJcmV0dXJuOwpAQCAtMzcyLDEzICszOTEsMTMgQEAKIHsKIAlzdHJ1Y3QgcG5wX3BvcnQgKiBwb3J0OwogCi0JaWYgKGlvLT5yYW5nZV9sZW5ndGggPT0gMCkKKwlpZiAoaW8tPmFkZHJlc3NfbGVuZ3RoID09IDApCiAJCXJldHVybjsKIAlwb3J0ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9wb3J0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwb3J0KQogCQlyZXR1cm47Ci0JcG9ydC0+bWluID0gcG9ydC0+bWF4ID0gaW8tPmJhc2VfYWRkcmVzczsKLQlwb3J0LT5zaXplID0gaW8tPnJhbmdlX2xlbmd0aDsKKwlwb3J0LT5taW4gPSBwb3J0LT5tYXggPSBpby0+YWRkcmVzczsKKwlwb3J0LT5zaXplID0gaW8tPmFkZHJlc3NfbGVuZ3RoOwogCXBvcnQtPmFsaWduID0gMDsKIAlwb3J0LT5mbGFncyA9IFBOUF9QT1JUX0ZMQUdfRklYRUQ7CiAJcG5wX3JlZ2lzdGVyX3BvcnRfcmVzb3VyY2Uob3B0aW9uLHBvcnQpOwpAQCAtMzg3LDIxICs0MDYsMjEgQEAKIAogc3RhdGljIHZvaWQKIHBucGFjcGlfcGFyc2VfbWVtMjRfb3B0aW9uKHN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb24sCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMjQgKnApCisJc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtb3J5MjQgKnApCiB7CiAJc3RydWN0IHBucF9tZW0gKiBtZW07CiAKLQlpZiAocC0+cmFuZ2VfbGVuZ3RoID09IDApCisJaWYgKHAtPmFkZHJlc3NfbGVuZ3RoID09IDApCiAJCXJldHVybjsKIAltZW0gPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX21lbSksIEdGUF9LRVJORUwpOwogCWlmICghbWVtKQogCQlyZXR1cm47Ci0JbWVtLT5taW4gPSBwLT5taW5fYmFzZV9hZGRyZXNzOwotCW1lbS0+bWF4ID0gcC0+bWF4X2Jhc2VfYWRkcmVzczsKKwltZW0tPm1pbiA9IHAtPm1pbmltdW07CisJbWVtLT5tYXggPSBwLT5tYXhpbXVtOwogCW1lbS0+YWxpZ24gPSBwLT5hbGlnbm1lbnQ7Ci0JbWVtLT5zaXplID0gcC0+cmFuZ2VfbGVuZ3RoOworCW1lbS0+c2l6ZSA9IHAtPmFkZHJlc3NfbGVuZ3RoOwogCi0JbWVtLT5mbGFncyA9IChBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09IHAtPnJlYWRfd3JpdGVfYXR0cmlidXRlKSA/CisJbWVtLT5mbGFncyA9IChBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09IHAtPndyaXRlX3Byb3RlY3QpID8KIAkJCUlPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRSA6IDA7CiAKIAlwbnBfcmVnaXN0ZXJfbWVtX3Jlc291cmNlKG9wdGlvbixtZW0pOwpAQCAtNDEwLDIxICs0MjksMjEgQEAKIAogc3RhdGljIHZvaWQKIHBucGFjcGlfcGFyc2VfbWVtMzJfb3B0aW9uKHN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb24sCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMzIgKnApCisJc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtb3J5MzIgKnApCiB7CiAJc3RydWN0IHBucF9tZW0gKiBtZW07CiAKLQlpZiAocC0+cmFuZ2VfbGVuZ3RoID09IDApCisJaWYgKHAtPmFkZHJlc3NfbGVuZ3RoID09IDApCiAJCXJldHVybjsKIAltZW0gPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX21lbSksIEdGUF9LRVJORUwpOwogCWlmICghbWVtKQogCQlyZXR1cm47Ci0JbWVtLT5taW4gPSBwLT5taW5fYmFzZV9hZGRyZXNzOwotCW1lbS0+bWF4ID0gcC0+bWF4X2Jhc2VfYWRkcmVzczsKKwltZW0tPm1pbiA9IHAtPm1pbmltdW07CisJbWVtLT5tYXggPSBwLT5tYXhpbXVtOwogCW1lbS0+YWxpZ24gPSBwLT5hbGlnbm1lbnQ7Ci0JbWVtLT5zaXplID0gcC0+cmFuZ2VfbGVuZ3RoOworCW1lbS0+c2l6ZSA9IHAtPmFkZHJlc3NfbGVuZ3RoOwogCi0JbWVtLT5mbGFncyA9IChBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09IHAtPnJlYWRfd3JpdGVfYXR0cmlidXRlKSA/CisJbWVtLT5mbGFncyA9IChBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09IHAtPndyaXRlX3Byb3RlY3QpID8KIAkJCUlPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRSA6IDA7CiAKIAlwbnBfcmVnaXN0ZXJfbWVtX3Jlc291cmNlKG9wdGlvbixtZW0pOwpAQCAtNDMzLDMzICs0NTIsNzIgQEAKIAogc3RhdGljIHZvaWQKIHBucGFjcGlfcGFyc2VfZml4ZWRfbWVtMzJfb3B0aW9uKHN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb24sCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtMzIgKnApCisJc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtb3J5MzIgKnApCiB7CiAJc3RydWN0IHBucF9tZW0gKiBtZW07CiAKLQlpZiAocC0+cmFuZ2VfbGVuZ3RoID09IDApCisJaWYgKHAtPmFkZHJlc3NfbGVuZ3RoID09IDApCiAJCXJldHVybjsKIAltZW0gPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX21lbSksIEdGUF9LRVJORUwpOwogCWlmICghbWVtKQogCQlyZXR1cm47Ci0JbWVtLT5taW4gPSBtZW0tPm1heCA9IHAtPnJhbmdlX2Jhc2VfYWRkcmVzczsKLQltZW0tPnNpemUgPSBwLT5yYW5nZV9sZW5ndGg7CisJbWVtLT5taW4gPSBtZW0tPm1heCA9IHAtPmFkZHJlc3M7CisJbWVtLT5zaXplID0gcC0+YWRkcmVzc19sZW5ndGg7CiAJbWVtLT5hbGlnbiA9IDA7CiAKLQltZW0tPmZsYWdzID0gKEFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0gcC0+cmVhZF93cml0ZV9hdHRyaWJ1dGUpID8KKwltZW0tPmZsYWdzID0gKEFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0gcC0+d3JpdGVfcHJvdGVjdCkgPwogCQkJSU9SRVNPVVJDRV9NRU1fV1JJVEVBQkxFIDogMDsKIAogCXBucF9yZWdpc3Rlcl9tZW1fcmVzb3VyY2Uob3B0aW9uLG1lbSk7CiAJcmV0dXJuOwogfQogCitzdGF0aWMgdm9pZAorcG5wYWNwaV9wYXJzZV9hZGRyZXNzX29wdGlvbihzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLCBzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcikKK3sKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQgYWRkciwgKnAgPSAmYWRkcjsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IHBucF9tZW0gKiBtZW07CisJc3RydWN0IHBucF9wb3J0ICogcG9ydDsKKworCXN0YXR1cyA9IGFjcGlfcmVzb3VyY2VfdG9fYWRkcmVzczY0KHIsIHApOworCWlmICghQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJcG5wX3dhcm4oIlBuUEFDUEk6IGZhaWxlZCB0byBjb252ZXJ0IHJlc291cmNlIHR5cGUgJWQiLCByLT50eXBlKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwLT5hZGRyZXNzX2xlbmd0aCA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAocC0+cmVzb3VyY2VfdHlwZSA9PSBBQ1BJX01FTU9SWV9SQU5HRSkgeworCQltZW0gPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX21lbSksIEdGUF9LRVJORUwpOworCQlpZiAoIW1lbSkKKwkJCXJldHVybjsKKwkJbWVtLT5taW4gPSBtZW0tPm1heCA9IHAtPm1pbmltdW07CisJCW1lbS0+c2l6ZSA9IHAtPmFkZHJlc3NfbGVuZ3RoOworCQltZW0tPmFsaWduID0gMDsKKwkJbWVtLT5mbGFncyA9IChwLT5pbmZvLm1lbS53cml0ZV9wcm90ZWN0ID09CisJCSAgICBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZKSA/IElPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRSA6IDA7CisJCXBucF9yZWdpc3Rlcl9tZW1fcmVzb3VyY2Uob3B0aW9uLG1lbSk7CisJfSBlbHNlIGlmIChwLT5yZXNvdXJjZV90eXBlID09IEFDUElfSU9fUkFOR0UpIHsKKwkJcG9ydCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfcG9ydCksIEdGUF9LRVJORUwpOworCQlpZiAoIXBvcnQpCisJCQlyZXR1cm47CisJCXBvcnQtPm1pbiA9IHBvcnQtPm1heCA9IHAtPm1pbmltdW07CisJCXBvcnQtPnNpemUgPSBwLT5hZGRyZXNzX2xlbmd0aDsKKwkJcG9ydC0+YWxpZ24gPSAwOworCQlwb3J0LT5mbGFncyA9IFBOUF9QT1JUX0ZMQUdfRklYRUQ7CisJCXBucF9yZWdpc3Rlcl9wb3J0X3Jlc291cmNlKG9wdGlvbixwb3J0KTsKKwl9Cit9CisKIHN0cnVjdCBhY3BpcG5wX3BhcnNlX29wdGlvbl9zIHsKIAlzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uOwogCXN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb25faW5kZXBlbmRlbnQ7CiAJc3RydWN0IHBucF9kZXYgKmRldjsKIH07CiAKLXN0YXRpYyBhY3BpX3N0YXR1cyBwbnBhY3BpX29wdGlvbl9yZXNvdXJjZShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzLCAKK3N0YXRpYyBhY3BpX3N0YXR1cyBwbnBhY3BpX29wdGlvbl9yZXNvdXJjZShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzLAogCXZvaWQgKmRhdGEpCiB7CiAJaW50IHByaW9yaXR5ID0gMDsKQEAgLTQ2NywzNSArNTI1LDE2IEBACiAJc3RydWN0IHBucF9kZXYgKmRldiA9IHBhcnNlX2RhdGEtPmRldjsKIAlzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uID0gcGFyc2VfZGF0YS0+b3B0aW9uOwogCi0Jc3dpdGNoIChyZXMtPmlkKSB7Ci0JCWNhc2UgQUNQSV9SU1RZUEVfSVJROgorCXN3aXRjaCAocmVzLT50eXBlKSB7CisJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0lSUToKIAkJCXBucGFjcGlfcGFyc2VfaXJxX29wdGlvbihvcHRpb24sICZyZXMtPmRhdGEuaXJxKTsKIAkJCWJyZWFrOwotCQljYXNlIEFDUElfUlNUWVBFX0VYVF9JUlE6Ci0JCQlwbnBhY3BpX3BhcnNlX2V4dF9pcnFfb3B0aW9uKG9wdGlvbiwKLQkJCQkmcmVzLT5kYXRhLmV4dGVuZGVkX2lycSk7Ci0JCQlicmVhazsKLQkJY2FzZSBBQ1BJX1JTVFlQRV9ETUE6CisKKwkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRE1BOgogCQkJcG5wYWNwaV9wYXJzZV9kbWFfb3B0aW9uKG9wdGlvbiwgJnJlcy0+ZGF0YS5kbWEpOwkKIAkJCWJyZWFrOwotCQljYXNlIEFDUElfUlNUWVBFX0lPOgotCQkJcG5wYWNwaV9wYXJzZV9wb3J0X29wdGlvbihvcHRpb24sICZyZXMtPmRhdGEuaW8pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQUNQSV9SU1RZUEVfRklYRURfSU86Ci0JCQlwbnBhY3BpX3BhcnNlX2ZpeGVkX3BvcnRfb3B0aW9uKG9wdGlvbiwKLQkJCQkmcmVzLT5kYXRhLmZpeGVkX2lvKTsKLQkJCWJyZWFrOwotCQljYXNlIEFDUElfUlNUWVBFX01FTTI0OgotCQkJcG5wYWNwaV9wYXJzZV9tZW0yNF9vcHRpb24ob3B0aW9uLCAmcmVzLT5kYXRhLm1lbW9yeTI0KTsKLQkJCWJyZWFrOwotCQljYXNlIEFDUElfUlNUWVBFX01FTTMyOgotCQkJcG5wYWNwaV9wYXJzZV9tZW0zMl9vcHRpb24ob3B0aW9uLCAmcmVzLT5kYXRhLm1lbW9yeTMyKTsKLQkJCWJyZWFrOwotCQljYXNlIEFDUElfUlNUWVBFX0ZJWEVEX01FTTMyOgotCQkJcG5wYWNwaV9wYXJzZV9maXhlZF9tZW0zMl9vcHRpb24ob3B0aW9uLAotCQkJCSZyZXMtPmRhdGEuZml4ZWRfbWVtb3J5MzIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQUNQSV9SU1RZUEVfU1RBUlRfRFBGOgorCisJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX1NUQVJUX0RFUEVOREVOVDoKIAkJCXN3aXRjaCAocmVzLT5kYXRhLnN0YXJ0X2RwZi5jb21wYXRpYmlsaXR5X3ByaW9yaXR5KSB7CiAJCQkJY2FzZSBBQ1BJX0dPT0RfQ09ORklHVVJBVElPTjoKIAkJCQkJcHJpb3JpdHkgPSBQTlBfUkVTX1BSSU9SSVRZX1BSRUZFUlJFRDsKQEAgLTUxOCw3ICs1NTcsOCBAQAogCQkJCXJldHVybiBBRV9FUlJPUjsKIAkJCXBhcnNlX2RhdGEtPm9wdGlvbiA9IG9wdGlvbjsJCiAJCQlicmVhazsKLQkJY2FzZSBBQ1BJX1JTVFlQRV9FTkRfRFBGOgorCisJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0VORF9ERVBFTkRFTlQ6CiAJCQkvKm9ubHkgb25lIEVuZERlcGVuZGVudEZuIGlzIGFsbG93ZWQqLwogCQkJaWYgKCFwYXJzZV9kYXRhLT5vcHRpb25faW5kZXBlbmRlbnQpIHsKIAkJCQlwbnBfd2FybigiUG5QQUNQSTogbW9yZSB0aGFuIG9uZSBFbmREZXBlbmRlbnRGbiIpOwpAQCAtNTI3LDE1ICs1NjcsNTkgQEAKIAkJCXBhcnNlX2RhdGEtPm9wdGlvbiA9IHBhcnNlX2RhdGEtPm9wdGlvbl9pbmRlcGVuZGVudDsKIAkJCXBhcnNlX2RhdGEtPm9wdGlvbl9pbmRlcGVuZGVudCA9IE5VTEw7CiAJCQlicmVhazsKKworCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9JTzoKKwkJCXBucGFjcGlfcGFyc2VfcG9ydF9vcHRpb24ob3B0aW9uLCAmcmVzLT5kYXRhLmlvKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0ZJWEVEX0lPOgorCQkJcG5wYWNwaV9wYXJzZV9maXhlZF9wb3J0X29wdGlvbihvcHRpb24sCisJCQkJJnJlcy0+ZGF0YS5maXhlZF9pbyk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9WRU5ET1I6CisJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0VORF9UQUc6CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkyNDoKKwkJCXBucGFjcGlfcGFyc2VfbWVtMjRfb3B0aW9uKG9wdGlvbiwgJnJlcy0+ZGF0YS5tZW1vcnkyNCk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkzMjoKKwkJCXBucGFjcGlfcGFyc2VfbWVtMzJfb3B0aW9uKG9wdGlvbiwgJnJlcy0+ZGF0YS5tZW1vcnkzMik7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9NRU1PUlkzMjoKKwkJCXBucGFjcGlfcGFyc2VfZml4ZWRfbWVtMzJfb3B0aW9uKG9wdGlvbiwKKwkJCQkmcmVzLT5kYXRhLmZpeGVkX21lbW9yeTMyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MxNjoKKwkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzMyOgorCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTNjQ6CisJCQlwbnBhY3BpX3BhcnNlX2FkZHJlc3Nfb3B0aW9uKG9wdGlvbiwgcmVzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0FERFJFU1M2NDoKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0lSUToKKwkJCXBucGFjcGlfcGFyc2VfZXh0X2lycV9vcHRpb24ob3B0aW9uLAorCQkJCSZyZXMtPmRhdGEuZXh0ZW5kZWRfaXJxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0dFTkVSSUNfUkVHSVNURVI6CisJCQlicmVhazsKKwogCQlkZWZhdWx0OgotCQkJcG5wX3dhcm4oIlBuUEFDUEk6IHVua25vd24gcmVzb3VyY2UgdHlwZSAlZCIsIHJlcy0+aWQpOworCQkJcG5wX3dhcm4oIlBuUEFDUEk6IHVua25vd24gcmVzb3VyY2UgdHlwZSAlZCIsIHJlcy0+dHlwZSk7CiAJCQlyZXR1cm4gQUVfRVJST1I7CiAJfQogCQkJCiAJcmV0dXJuIEFFX09LOwogfQogCi1hY3BpX3N0YXR1cyBwbnBhY3BpX3BhcnNlX3Jlc291cmNlX29wdGlvbl9kYXRhKGFjcGlfaGFuZGxlIGhhbmRsZSwgCithY3BpX3N0YXR1cyBwbnBhY3BpX3BhcnNlX3Jlc291cmNlX29wdGlvbl9kYXRhKGFjcGlfaGFuZGxlIGhhbmRsZSwKIAlzdHJ1Y3QgcG5wX2RldiAqZGV2KQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKQEAgLTU0Niw3ICs2MzAsNyBAQAogCQlyZXR1cm4gQUVfRVJST1I7CiAJcGFyc2VfZGF0YS5vcHRpb25faW5kZXBlbmRlbnQgPSBwYXJzZV9kYXRhLm9wdGlvbjsKIAlwYXJzZV9kYXRhLmRldiA9IGRldjsKLQlzdGF0dXMgPSBhY3BpX3dhbGtfcmVzb3VyY2VzKGhhbmRsZSwgTUVUSE9EX05BTUVfX1BSUywgCisJc3RhdHVzID0gYWNwaV93YWxrX3Jlc291cmNlcyhoYW5kbGUsIE1FVEhPRF9OQU1FX19QUlMsCiAJCXBucGFjcGlfb3B0aW9uX3Jlc291cmNlLCAmcGFyc2VfZGF0YSk7CiAKIAlyZXR1cm4gc3RhdHVzOwpAQCAtNTU5LDIxICs2NDMsMjQgQEAKIAl2b2lkICpkYXRhKQogewogCWludCAqcmVzX2NudCA9IChpbnQgKilkYXRhOwotCXN3aXRjaCAocmVzLT5pZCkgewotCWNhc2UgQUNQSV9SU1RZUEVfSVJROgotCWNhc2UgQUNQSV9SU1RZUEVfRVhUX0lSUToKLQljYXNlIEFDUElfUlNUWVBFX0RNQToKLQljYXNlIEFDUElfUlNUWVBFX0lPOgotCWNhc2UgQUNQSV9SU1RZUEVfRklYRURfSU86Ci0JY2FzZSBBQ1BJX1JTVFlQRV9NRU0yNDoKLQljYXNlIEFDUElfUlNUWVBFX01FTTMyOgotCWNhc2UgQUNQSV9SU1RZUEVfRklYRURfTUVNMzI6Ci0jaWYgMAotCWNhc2UgQUNQSV9SU1RZUEVfQUREUkVTUzE2OgotCWNhc2UgQUNQSV9SU1RZUEVfQUREUkVTUzMyOgotCWNhc2UgQUNQSV9SU1RZUEVfQUREUkVTUzY0OgotI2VuZGlmCisJc3dpdGNoIChyZXMtPnR5cGUpIHsKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9JUlE6CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRE1BOgorCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0lPOgorCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0ZJWEVEX0lPOgorCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX01FTU9SWTI0OgorCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX01FTU9SWTMyOgorCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0ZJWEVEX01FTU9SWTMyOgorCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MxNjoKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMzI6CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzY0OgorCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0lSUToKIAkJKCpyZXNfY250KSArKzsKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9TVEFSVF9ERVBFTkRFTlQ6CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX0RFUEVOREVOVDoKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9WRU5ET1I6CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX1RBRzoKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9HRU5FUklDX1JFR0lTVEVSOgogCWRlZmF1bHQ6CiAJCXJldHVybiBBRV9PSzsKIAl9CkBAIC01ODQsMjIgKzY3MSwyNSBAQAogCXZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGFjcGlfcmVzb3VyY2UgKipyZXNvdXJjZSA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqKilkYXRhOwkKLQlzd2l0Y2ggKHJlcy0+aWQpIHsKLQljYXNlIEFDUElfUlNUWVBFX0lSUToKLQljYXNlIEFDUElfUlNUWVBFX0VYVF9JUlE6Ci0JY2FzZSBBQ1BJX1JTVFlQRV9ETUE6Ci0JY2FzZSBBQ1BJX1JTVFlQRV9JTzoKLQljYXNlIEFDUElfUlNUWVBFX0ZJWEVEX0lPOgotCWNhc2UgQUNQSV9SU1RZUEVfTUVNMjQ6Ci0JY2FzZSBBQ1BJX1JTVFlQRV9NRU0zMjoKLQljYXNlIEFDUElfUlNUWVBFX0ZJWEVEX01FTTMyOgotI2lmIDAKLQljYXNlIEFDUElfUlNUWVBFX0FERFJFU1MxNjoKLQljYXNlIEFDUElfUlNUWVBFX0FERFJFU1MzMjoKLQljYXNlIEFDUElfUlNUWVBFX0FERFJFU1M2NDoKLSNlbmRpZgotCQkoKnJlc291cmNlKS0+aWQgPSByZXMtPmlkOworCXN3aXRjaCAocmVzLT50eXBlKSB7CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfSVJROgorCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0RNQToKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9JTzoKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9JTzoKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkyNDoKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkzMjoKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9NRU1PUlkzMjoKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMTY6CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzMyOgorCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1M2NDoKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FWFRFTkRFRF9JUlE6CisJCSgqcmVzb3VyY2UpLT50eXBlID0gcmVzLT50eXBlOwogCQkoKnJlc291cmNlKSsrOworCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX1NUQVJUX0RFUEVOREVOVDoKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfREVQRU5ERU5UOgorCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX1ZFTkRPUjoKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfVEFHOgorCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0dFTkVSSUNfUkVHSVNURVI6CiAJZGVmYXVsdDoKIAkJcmV0dXJuIEFFX09LOwogCX0KQEAgLTYwNywxNCArNjk3LDE0IEBACiAJcmV0dXJuIEFFX09LOwogfQogCi1pbnQgcG5wYWNwaV9idWlsZF9yZXNvdXJjZV90ZW1wbGF0ZShhY3BpX2hhbmRsZSBoYW5kbGUsIAoraW50IHBucGFjcGlfYnVpbGRfcmVzb3VyY2VfdGVtcGxhdGUoYWNwaV9oYW5kbGUgaGFuZGxlLAogCXN0cnVjdCBhY3BpX2J1ZmZlciAqYnVmZmVyKQogewogCXN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZTsKIAlpbnQgcmVzX2NudCA9IDA7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0Jc3RhdHVzID0gYWNwaV93YWxrX3Jlc291cmNlcyhoYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsIAorCXN0YXR1cyA9IGFjcGlfd2Fsa19yZXNvdXJjZXMoaGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLAogCQlwbnBhY3BpX2NvdW50X3Jlc291cmNlcywgJnJlc19jbnQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlwbnBfZXJyKCJFdmFsdWF0ZSBfQ1JTIGZhaWxlZCIpOwpAQCAtNjI4LDcgKzcxOCw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCXBucF9kYmcoIlJlcyBjbnQgJWQiLCByZXNfY250KTsKIAlyZXNvdXJjZSA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqKWJ1ZmZlci0+cG9pbnRlcjsKLQlzdGF0dXMgPSBhY3BpX3dhbGtfcmVzb3VyY2VzKGhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywgCisJc3RhdHVzID0gYWNwaV93YWxrX3Jlc291cmNlcyhoYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsCiAJCXBucGFjcGlfdHlwZV9yZXNvdXJjZXMsICZyZXNvdXJjZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWtmcmVlKGJ1ZmZlci0+cG9pbnRlcik7CkBAIC02MzYsNTQgKzcyNiw1NCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJLyogcmVzb3VyY2Ugd2lsbCBwb2ludGVyIHRoZSBlbmQgcmVzb3VyY2Ugbm93ICovCi0JcmVzb3VyY2UtPmlkID0gQUNQSV9SU1RZUEVfRU5EX1RBRzsKKwlyZXNvdXJjZS0+dHlwZSA9IEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfVEFHOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHBucGFjcGlfZW5jb2RlX2lycShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsIAorc3RhdGljIHZvaWQgcG5wYWNwaV9lbmNvZGVfaXJxKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwKIAlzdHJ1Y3QgcmVzb3VyY2UgKnApCiB7Ci0JaW50IGVkZ2VfbGV2ZWwsIGFjdGl2ZV9oaWdoX2xvdzsKKwlpbnQgdHJpZ2dlcmluZywgcG9sYXJpdHk7CiAJCi0JZGVjb2RlX2lycV9mbGFncyhwLT5mbGFncyAmIElPUkVTT1VSQ0VfQklUUywgJmVkZ2VfbGV2ZWwsIAotCQkmYWN0aXZlX2hpZ2hfbG93KTsKLQlyZXNvdXJjZS0+aWQgPSBBQ1BJX1JTVFlQRV9JUlE7CisJZGVjb2RlX2lycV9mbGFncyhwLT5mbGFncyAmIElPUkVTT1VSQ0VfQklUUywgJnRyaWdnZXJpbmcsCisJCSZwb2xhcml0eSk7CisJcmVzb3VyY2UtPnR5cGUgPSBBQ1BJX1JFU09VUkNFX1RZUEVfSVJROwogCXJlc291cmNlLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGFjcGlfcmVzb3VyY2UpOwotCXJlc291cmNlLT5kYXRhLmlycS5lZGdlX2xldmVsID0gZWRnZV9sZXZlbDsKLQlyZXNvdXJjZS0+ZGF0YS5pcnEuYWN0aXZlX2hpZ2hfbG93ID0gYWN0aXZlX2hpZ2hfbG93OwotCWlmIChlZGdlX2xldmVsID09IEFDUElfRURHRV9TRU5TSVRJVkUpCi0JCXJlc291cmNlLT5kYXRhLmlycS5zaGFyZWRfZXhjbHVzaXZlID0gQUNQSV9FWENMVVNJVkU7CisJcmVzb3VyY2UtPmRhdGEuaXJxLnRyaWdnZXJpbmcgPSB0cmlnZ2VyaW5nOworCXJlc291cmNlLT5kYXRhLmlycS5wb2xhcml0eSA9IHBvbGFyaXR5OworCWlmICh0cmlnZ2VyaW5nID09IEFDUElfRURHRV9TRU5TSVRJVkUpCisJCXJlc291cmNlLT5kYXRhLmlycS5zaGFyYWJsZSA9IEFDUElfRVhDTFVTSVZFOwogCWVsc2UKLQkJcmVzb3VyY2UtPmRhdGEuaXJxLnNoYXJlZF9leGNsdXNpdmUgPSBBQ1BJX1NIQVJFRDsKLQlyZXNvdXJjZS0+ZGF0YS5pcnEubnVtYmVyX29mX2ludGVycnVwdHMgPSAxOworCQlyZXNvdXJjZS0+ZGF0YS5pcnEuc2hhcmFibGUgPSBBQ1BJX1NIQVJFRDsKKwlyZXNvdXJjZS0+ZGF0YS5pcnEuaW50ZXJydXB0X2NvdW50ID0gMTsKIAlyZXNvdXJjZS0+ZGF0YS5pcnEuaW50ZXJydXB0c1swXSA9IHAtPnN0YXJ0OwogfQogCiBzdGF0aWMgdm9pZCBwbnBhY3BpX2VuY29kZV9leHRfaXJxKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwKIAlzdHJ1Y3QgcmVzb3VyY2UgKnApCiB7Ci0JaW50IGVkZ2VfbGV2ZWwsIGFjdGl2ZV9oaWdoX2xvdzsKKwlpbnQgdHJpZ2dlcmluZywgcG9sYXJpdHk7CiAJCi0JZGVjb2RlX2lycV9mbGFncyhwLT5mbGFncyAmIElPUkVTT1VSQ0VfQklUUywgJmVkZ2VfbGV2ZWwsIAotCQkmYWN0aXZlX2hpZ2hfbG93KTsKLQlyZXNvdXJjZS0+aWQgPSBBQ1BJX1JTVFlQRV9FWFRfSVJROworCWRlY29kZV9pcnFfZmxhZ3MocC0+ZmxhZ3MgJiBJT1JFU09VUkNFX0JJVFMsICZ0cmlnZ2VyaW5nLAorCQkmcG9sYXJpdHkpOworCXJlc291cmNlLT50eXBlID0gQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0lSUTsKIAlyZXNvdXJjZS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlKTsKIAlyZXNvdXJjZS0+ZGF0YS5leHRlbmRlZF9pcnEucHJvZHVjZXJfY29uc3VtZXIgPSBBQ1BJX0NPTlNVTUVSOwotCXJlc291cmNlLT5kYXRhLmV4dGVuZGVkX2lycS5lZGdlX2xldmVsID0gZWRnZV9sZXZlbDsKLQlyZXNvdXJjZS0+ZGF0YS5leHRlbmRlZF9pcnEuYWN0aXZlX2hpZ2hfbG93ID0gYWN0aXZlX2hpZ2hfbG93OwotCWlmIChlZGdlX2xldmVsID09IEFDUElfRURHRV9TRU5TSVRJVkUpCi0JCXJlc291cmNlLT5kYXRhLmlycS5zaGFyZWRfZXhjbHVzaXZlID0gQUNQSV9FWENMVVNJVkU7CisJcmVzb3VyY2UtPmRhdGEuZXh0ZW5kZWRfaXJxLnRyaWdnZXJpbmcgPSB0cmlnZ2VyaW5nOworCXJlc291cmNlLT5kYXRhLmV4dGVuZGVkX2lycS5wb2xhcml0eSA9IHBvbGFyaXR5OworCWlmICh0cmlnZ2VyaW5nID09IEFDUElfRURHRV9TRU5TSVRJVkUpCisJCXJlc291cmNlLT5kYXRhLmlycS5zaGFyYWJsZSA9IEFDUElfRVhDTFVTSVZFOwogCWVsc2UKLQkJcmVzb3VyY2UtPmRhdGEuaXJxLnNoYXJlZF9leGNsdXNpdmUgPSBBQ1BJX1NIQVJFRDsKLQlyZXNvdXJjZS0+ZGF0YS5leHRlbmRlZF9pcnEubnVtYmVyX29mX2ludGVycnVwdHMgPSAxOworCQlyZXNvdXJjZS0+ZGF0YS5pcnEuc2hhcmFibGUgPSBBQ1BJX1NIQVJFRDsKKwlyZXNvdXJjZS0+ZGF0YS5leHRlbmRlZF9pcnEuaW50ZXJydXB0X2NvdW50ID0gMTsKIAlyZXNvdXJjZS0+ZGF0YS5leHRlbmRlZF9pcnEuaW50ZXJydXB0c1swXSA9IHAtPnN0YXJ0OwogfQogCiBzdGF0aWMgdm9pZCBwbnBhY3BpX2VuY29kZV9kbWEoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLAogCXN0cnVjdCByZXNvdXJjZSAqcCkKIHsKLQlyZXNvdXJjZS0+aWQgPSBBQ1BJX1JTVFlQRV9ETUE7CisJcmVzb3VyY2UtPnR5cGUgPSBBQ1BJX1JFU09VUkNFX1RZUEVfRE1BOwogCXJlc291cmNlLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGFjcGlfcmVzb3VyY2UpOwogCS8qIE5vdGU6IHBucF9hc3NpZ25fZG1hIHdpbGwgY29weSBwbnBfZG1hLT5mbGFncyBpbnRvIHAtPmZsYWdzICovCiAJaWYgKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9ETUFfQ09NUEFUSUJMRSkKQEAgLTcwMSw3NSArNzkxLDc1IEBACiAJZWxzZSBpZiAocC0+ZmxhZ3MgJiBJT1JFU09VUkNFX0RNQV8xNkJJVCkKIAkJcmVzb3VyY2UtPmRhdGEuZG1hLnRyYW5zZmVyID0gQUNQSV9UUkFOU0ZFUl8xNjsKIAlyZXNvdXJjZS0+ZGF0YS5kbWEuYnVzX21hc3RlciA9IHAtPmZsYWdzICYgSU9SRVNPVVJDRV9ETUFfTUFTVEVSOwotCXJlc291cmNlLT5kYXRhLmRtYS5udW1iZXJfb2ZfY2hhbm5lbHMgPSAxOworCXJlc291cmNlLT5kYXRhLmRtYS5jaGFubmVsX2NvdW50ID0gMTsKIAlyZXNvdXJjZS0+ZGF0YS5kbWEuY2hhbm5lbHNbMF0gPSBwLT5zdGFydDsKIH0KIAogc3RhdGljIHZvaWQgcG5wYWNwaV9lbmNvZGVfaW8oc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLAogCXN0cnVjdCByZXNvdXJjZSAqcCkKIHsKLQlyZXNvdXJjZS0+aWQgPSBBQ1BJX1JTVFlQRV9JTzsKKwlyZXNvdXJjZS0+dHlwZSA9IEFDUElfUkVTT1VSQ0VfVFlQRV9JTzsKIAlyZXNvdXJjZS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlKTsKIAkvKiBOb3RlOiBwbnBfYXNzaWduX3BvcnQgd2lsbCBjb3B5IHBucF9wb3J0LT5mbGFncyBpbnRvIHAtPmZsYWdzICovCiAJcmVzb3VyY2UtPmRhdGEuaW8uaW9fZGVjb2RlID0gKHAtPmZsYWdzICYgUE5QX1BPUlRfRkxBR18xNkJJVEFERFIpPwotCQlBQ1BJX0RFQ09ERV8xNiA6IEFDUElfREVDT0RFXzEwOyAKLQlyZXNvdXJjZS0+ZGF0YS5pby5taW5fYmFzZV9hZGRyZXNzID0gcC0+c3RhcnQ7Ci0JcmVzb3VyY2UtPmRhdGEuaW8ubWF4X2Jhc2VfYWRkcmVzcyA9IHAtPmVuZDsKKwkJQUNQSV9ERUNPREVfMTYgOiBBQ1BJX0RFQ09ERV8xMDsKKwlyZXNvdXJjZS0+ZGF0YS5pby5taW5pbXVtID0gcC0+c3RhcnQ7CisJcmVzb3VyY2UtPmRhdGEuaW8ubWF4aW11bSA9IHAtPmVuZDsKIAlyZXNvdXJjZS0+ZGF0YS5pby5hbGlnbm1lbnQgPSAwOyAvKiBDb3JyZWN0PyAqLwotCXJlc291cmNlLT5kYXRhLmlvLnJhbmdlX2xlbmd0aCA9IHAtPmVuZCAtIHAtPnN0YXJ0ICsgMTsKKwlyZXNvdXJjZS0+ZGF0YS5pby5hZGRyZXNzX2xlbmd0aCA9IHAtPmVuZCAtIHAtPnN0YXJ0ICsgMTsKIH0KIAogc3RhdGljIHZvaWQgcG5wYWNwaV9lbmNvZGVfZml4ZWRfaW8oc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLAogCXN0cnVjdCByZXNvdXJjZSAqcCkKIHsKLQlyZXNvdXJjZS0+aWQgPSBBQ1BJX1JTVFlQRV9GSVhFRF9JTzsKKwlyZXNvdXJjZS0+dHlwZSA9IEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9JTzsKIAlyZXNvdXJjZS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlKTsKLQlyZXNvdXJjZS0+ZGF0YS5maXhlZF9pby5iYXNlX2FkZHJlc3MgPSBwLT5zdGFydDsKLQlyZXNvdXJjZS0+ZGF0YS5maXhlZF9pby5yYW5nZV9sZW5ndGggPSBwLT5lbmQgLSBwLT5zdGFydCArIDE7CisJcmVzb3VyY2UtPmRhdGEuZml4ZWRfaW8uYWRkcmVzcyA9IHAtPnN0YXJ0OworCXJlc291cmNlLT5kYXRhLmZpeGVkX2lvLmFkZHJlc3NfbGVuZ3RoID0gcC0+ZW5kIC0gcC0+c3RhcnQgKyAxOwogfQogCiBzdGF0aWMgdm9pZCBwbnBhY3BpX2VuY29kZV9tZW0yNChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsCiAJc3RydWN0IHJlc291cmNlICpwKQogewotCXJlc291cmNlLT5pZCA9IEFDUElfUlNUWVBFX01FTTI0OworCXJlc291cmNlLT50eXBlID0gQUNQSV9SRVNPVVJDRV9UWVBFX01FTU9SWTI0OwogCXJlc291cmNlLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGFjcGlfcmVzb3VyY2UpOwogCS8qIE5vdGU6IHBucF9hc3NpZ25fbWVtIHdpbGwgY29weSBwbnBfbWVtLT5mbGFncyBpbnRvIHAtPmZsYWdzICovCi0JcmVzb3VyY2UtPmRhdGEubWVtb3J5MjQucmVhZF93cml0ZV9hdHRyaWJ1dGUgPQorCXJlc291cmNlLT5kYXRhLm1lbW9yeTI0LndyaXRlX3Byb3RlY3QgPQogCQkocC0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTV9XUklURUFCTEUpID8KIAkJQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA6IEFDUElfUkVBRF9PTkxZX01FTU9SWTsKLQlyZXNvdXJjZS0+ZGF0YS5tZW1vcnkyNC5taW5fYmFzZV9hZGRyZXNzID0gcC0+c3RhcnQ7Ci0JcmVzb3VyY2UtPmRhdGEubWVtb3J5MjQubWF4X2Jhc2VfYWRkcmVzcyA9IHAtPmVuZDsKKwlyZXNvdXJjZS0+ZGF0YS5tZW1vcnkyNC5taW5pbXVtID0gcC0+c3RhcnQ7CisJcmVzb3VyY2UtPmRhdGEubWVtb3J5MjQubWF4aW11bSA9IHAtPmVuZDsKIAlyZXNvdXJjZS0+ZGF0YS5tZW1vcnkyNC5hbGlnbm1lbnQgPSAwOwotCXJlc291cmNlLT5kYXRhLm1lbW9yeTI0LnJhbmdlX2xlbmd0aCA9IHAtPmVuZCAtIHAtPnN0YXJ0ICsgMTsKKwlyZXNvdXJjZS0+ZGF0YS5tZW1vcnkyNC5hZGRyZXNzX2xlbmd0aCA9IHAtPmVuZCAtIHAtPnN0YXJ0ICsgMTsKIH0KIAogc3RhdGljIHZvaWQgcG5wYWNwaV9lbmNvZGVfbWVtMzIoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLAogCXN0cnVjdCByZXNvdXJjZSAqcCkKIHsKLQlyZXNvdXJjZS0+aWQgPSBBQ1BJX1JTVFlQRV9NRU0zMjsKKwlyZXNvdXJjZS0+dHlwZSA9IEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkzMjsKIAlyZXNvdXJjZS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlKTsKLQlyZXNvdXJjZS0+ZGF0YS5tZW1vcnkzMi5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA9CisJcmVzb3VyY2UtPmRhdGEubWVtb3J5MzIud3JpdGVfcHJvdGVjdCA9CiAJCShwLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRSkgPwogCQlBQ1BJX1JFQURfV1JJVEVfTUVNT1JZIDogQUNQSV9SRUFEX09OTFlfTUVNT1JZOwotCXJlc291cmNlLT5kYXRhLm1lbW9yeTMyLm1pbl9iYXNlX2FkZHJlc3MgPSBwLT5zdGFydDsKLQlyZXNvdXJjZS0+ZGF0YS5tZW1vcnkzMi5tYXhfYmFzZV9hZGRyZXNzID0gcC0+ZW5kOworCXJlc291cmNlLT5kYXRhLm1lbW9yeTMyLm1pbmltdW0gPSBwLT5zdGFydDsKKwlyZXNvdXJjZS0+ZGF0YS5tZW1vcnkzMi5tYXhpbXVtID0gcC0+ZW5kOwogCXJlc291cmNlLT5kYXRhLm1lbW9yeTMyLmFsaWdubWVudCA9IDA7Ci0JcmVzb3VyY2UtPmRhdGEubWVtb3J5MzIucmFuZ2VfbGVuZ3RoID0gcC0+ZW5kIC0gcC0+c3RhcnQgKyAxOworCXJlc291cmNlLT5kYXRhLm1lbW9yeTMyLmFkZHJlc3NfbGVuZ3RoID0gcC0+ZW5kIC0gcC0+c3RhcnQgKyAxOwogfQogCiBzdGF0aWMgdm9pZCBwbnBhY3BpX2VuY29kZV9maXhlZF9tZW0zMihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsCiAJc3RydWN0IHJlc291cmNlICpwKQogewotCXJlc291cmNlLT5pZCA9IEFDUElfUlNUWVBFX0ZJWEVEX01FTTMyOworCXJlc291cmNlLT50eXBlID0gQUNQSV9SRVNPVVJDRV9UWVBFX0ZJWEVEX01FTU9SWTMyOwogCXJlc291cmNlLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGFjcGlfcmVzb3VyY2UpOwotCXJlc291cmNlLT5kYXRhLmZpeGVkX21lbW9yeTMyLnJlYWRfd3JpdGVfYXR0cmlidXRlID0KKwlyZXNvdXJjZS0+ZGF0YS5maXhlZF9tZW1vcnkzMi53cml0ZV9wcm90ZWN0ID0KIAkJKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU1fV1JJVEVBQkxFKSA/CiAJCUFDUElfUkVBRF9XUklURV9NRU1PUlkgOiBBQ1BJX1JFQURfT05MWV9NRU1PUlk7Ci0JcmVzb3VyY2UtPmRhdGEuZml4ZWRfbWVtb3J5MzIucmFuZ2VfYmFzZV9hZGRyZXNzID0gcC0+c3RhcnQ7Ci0JcmVzb3VyY2UtPmRhdGEuZml4ZWRfbWVtb3J5MzIucmFuZ2VfbGVuZ3RoID0gcC0+ZW5kIC0gcC0+c3RhcnQgKyAxOworCXJlc291cmNlLT5kYXRhLmZpeGVkX21lbW9yeTMyLmFkZHJlc3MgPSBwLT5zdGFydDsKKwlyZXNvdXJjZS0+ZGF0YS5maXhlZF9tZW1vcnkzMi5hZGRyZXNzX2xlbmd0aCA9IHAtPmVuZCAtIHAtPnN0YXJ0ICsgMTsKIH0KIAotaW50IHBucGFjcGlfZW5jb2RlX3Jlc291cmNlcyhzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICpyZXNfdGFibGUsIAoraW50IHBucGFjcGlfZW5jb2RlX3Jlc291cmNlcyhzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICpyZXNfdGFibGUsCiAJc3RydWN0IGFjcGlfYnVmZmVyICpidWZmZXIpCiB7CiAJaW50IGkgPSAwOwpAQCAtNzgwLDU4ICs4NzAsNjcgQEAKIAogCXBucF9kYmcoInJlcyBjbnQgJWQiLCByZXNfY250KTsKIAl3aGlsZSAoaSA8IHJlc19jbnQpIHsKLQkJc3dpdGNoKHJlc291cmNlLT5pZCkgewotCQljYXNlIEFDUElfUlNUWVBFX0lSUToKKwkJc3dpdGNoKHJlc291cmNlLT50eXBlKSB7CisJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0lSUToKIAkJCXBucF9kYmcoIkVuY29kZSBpcnEiKTsKLQkJCXBucGFjcGlfZW5jb2RlX2lycShyZXNvdXJjZSwgCisJCQlwbnBhY3BpX2VuY29kZV9pcnEocmVzb3VyY2UsCiAJCQkJJnJlc190YWJsZS0+aXJxX3Jlc291cmNlW2lycV0pOwogCQkJaXJxKys7CiAJCQlicmVhazsKIAotCQljYXNlIEFDUElfUlNUWVBFX0VYVF9JUlE6Ci0JCQlwbnBfZGJnKCJFbmNvZGUgZXh0IGlycSIpOwotCQkJcG5wYWNwaV9lbmNvZGVfZXh0X2lycShyZXNvdXJjZSwgCi0JCQkJJnJlc190YWJsZS0+aXJxX3Jlc291cmNlW2lycV0pOwotCQkJaXJxKys7Ci0JCQlicmVhazsKLQkJY2FzZSBBQ1BJX1JTVFlQRV9ETUE6CisJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0RNQToKIAkJCXBucF9kYmcoIkVuY29kZSBkbWEiKTsKLQkJCXBucGFjcGlfZW5jb2RlX2RtYShyZXNvdXJjZSwgCisJCQlwbnBhY3BpX2VuY29kZV9kbWEocmVzb3VyY2UsCiAJCQkJJnJlc190YWJsZS0+ZG1hX3Jlc291cmNlW2RtYV0pOwogCQkJZG1hICsrOwogCQkJYnJlYWs7Ci0JCWNhc2UgQUNQSV9SU1RZUEVfSU86CisJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0lPOgogCQkJcG5wX2RiZygiRW5jb2RlIGlvIik7Ci0JCQlwbnBhY3BpX2VuY29kZV9pbyhyZXNvdXJjZSwgCisJCQlwbnBhY3BpX2VuY29kZV9pbyhyZXNvdXJjZSwKIAkJCQkmcmVzX3RhYmxlLT5wb3J0X3Jlc291cmNlW3BvcnRdKTsKIAkJCXBvcnQgKys7CiAJCQlicmVhazsKLQkJY2FzZSBBQ1BJX1JTVFlQRV9GSVhFRF9JTzoKKwkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRklYRURfSU86CiAJCQlwbnBfZGJnKCJFbmNvZGUgZml4ZWQgaW8iKTsKIAkJCXBucGFjcGlfZW5jb2RlX2ZpeGVkX2lvKHJlc291cmNlLAogCQkJCSZyZXNfdGFibGUtPnBvcnRfcmVzb3VyY2VbcG9ydF0pOwogCQkJcG9ydCArKzsKIAkJCWJyZWFrOwotCQljYXNlIEFDUElfUlNUWVBFX01FTTI0OgorCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkyNDoKIAkJCXBucF9kYmcoIkVuY29kZSBtZW0yNCIpOwogCQkJcG5wYWNwaV9lbmNvZGVfbWVtMjQocmVzb3VyY2UsCiAJCQkJJnJlc190YWJsZS0+bWVtX3Jlc291cmNlW21lbV0pOwogCQkJbWVtICsrOwogCQkJYnJlYWs7Ci0JCWNhc2UgQUNQSV9SU1RZUEVfTUVNMzI6CisJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX01FTU9SWTMyOgogCQkJcG5wX2RiZygiRW5jb2RlIG1lbTMyIik7CiAJCQlwbnBhY3BpX2VuY29kZV9tZW0zMihyZXNvdXJjZSwKIAkJCQkmcmVzX3RhYmxlLT5tZW1fcmVzb3VyY2VbbWVtXSk7CiAJCQltZW0gKys7CiAJCQlicmVhazsKLQkJY2FzZSBBQ1BJX1JTVFlQRV9GSVhFRF9NRU0zMjoKKwkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRklYRURfTUVNT1JZMzI6CiAJCQlwbnBfZGJnKCJFbmNvZGUgZml4ZWQgbWVtMzIiKTsKIAkJCXBucGFjcGlfZW5jb2RlX2ZpeGVkX21lbTMyKHJlc291cmNlLAogCQkJCSZyZXNfdGFibGUtPm1lbV9yZXNvdXJjZVttZW1dKTsKIAkJCW1lbSArKzsKIAkJCWJyZWFrOworCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FWFRFTkRFRF9JUlE6CisJCQlwbnBfZGJnKCJFbmNvZGUgZXh0IGlycSIpOworCQkJcG5wYWNwaV9lbmNvZGVfZXh0X2lycShyZXNvdXJjZSwKKwkJCQkmcmVzX3RhYmxlLT5pcnFfcmVzb3VyY2VbaXJxXSk7CisJCQlpcnErKzsKKwkJCWJyZWFrOworCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9TVEFSVF9ERVBFTkRFTlQ6CisJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0VORF9ERVBFTkRFTlQ6CisJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX1ZFTkRPUjoKKwkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX1RBRzoKKwkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzE2OgorCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMzI6CisJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1M2NDoKKwkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRVhURU5ERURfQUREUkVTUzY0OgorCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9HRU5FUklDX1JFR0lTVEVSOgogCQlkZWZhdWx0OiAvKiBvdGhlciB0eXBlICovCi0JCQlwbnBfd2FybigidW5rbm93biByZXNvdXJjZSB0eXBlICVkIiwgcmVzb3VyY2UtPmlkKTsKKwkJCXBucF93YXJuKCJ1bmtub3duIHJlc291cmNlIHR5cGUgJWQiLCByZXNvdXJjZS0+dHlwZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlyZXNvdXJjZSArKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmFwaWRpby9yaW8tZHJpdmVyLmMgYi9kcml2ZXJzL3JhcGlkaW8vcmlvLWRyaXZlci5jCmluZGV4IGRjNzQ5NjAuLjU0ODAxMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmFwaWRpby9yaW8tZHJpdmVyLmMKKysrIGIvZHJpdmVycy9yYXBpZGlvL3Jpby1kcml2ZXIuYwpAQCAtMTQ3LDggKzE0Nyw2IEBACiAJLyogaW5pdGlhbGl6ZSBjb21tb24gZHJpdmVyIGZpZWxkcyAqLwogCXJkcnYtPmRyaXZlci5uYW1lID0gcmRydi0+bmFtZTsKIAlyZHJ2LT5kcml2ZXIuYnVzID0gJnJpb19idXNfdHlwZTsKLQlyZHJ2LT5kcml2ZXIucHJvYmUgPSByaW9fZGV2aWNlX3Byb2JlOwotCXJkcnYtPmRyaXZlci5yZW1vdmUgPSByaW9fZGV2aWNlX3JlbW92ZTsKIAogCS8qIHJlZ2lzdGVyIHdpdGggY29yZSAqLwogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJnJkcnYtPmRyaXZlcik7CkBAIC0yMDQsNyArMjAyLDkgQEAKIHN0cnVjdCBidXNfdHlwZSByaW9fYnVzX3R5cGUgPSB7CiAJLm5hbWUgPSAicmFwaWRpbyIsCiAJLm1hdGNoID0gcmlvX21hdGNoX2J1cywKLQkuZGV2X2F0dHJzID0gcmlvX2Rldl9hdHRycworCS5kZXZfYXR0cnMgPSByaW9fZGV2X2F0dHJzLAorCS5wcm9iZSA9IHJpb19kZXZpY2VfcHJvYmUsCisJLnJlbW92ZSA9IHJpb19kZXZpY2VfcmVtb3ZlLAogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JhcGlkaW8vcmlvLXNjYW4uYyBiL2RyaXZlcnMvcmFwaWRpby9yaW8tc2Nhbi5jCmluZGV4IDRmN2VkNGIuLjk0ZTMwZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmFwaWRpby9yaW8tc2Nhbi5jCisrKyBiL2RyaXZlcnMvcmFwaWRpby9yaW8tc2Nhbi5jCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlICJyaW8uaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yYXBpZGlvL3Jpby1zeXNmcy5jIGIvZHJpdmVycy9yYXBpZGlvL3Jpby1zeXNmcy5jCmluZGV4IDMwYTExNDMuLmJlZjkzMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmFwaWRpby9yaW8tc3lzZnMuYworKysgYi9kcml2ZXJzL3JhcGlkaW8vcmlvLXN5c2ZzLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yaW8uaD4KICNpbmNsdWRlIDxsaW51eC9yaW9fZHJ2Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CS8qIGZvciBjYXBhYmxlKCkgKi8KIAogI2luY2x1ZGUgInJpby5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JhcGlkaW8vcmlvLmMgYi9kcml2ZXJzL3JhcGlkaW8vcmlvLmMKaW5kZXggM2NhMTAxMS4uNWUzODI0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yYXBpZGlvL3Jpby5jCisrKyBiL2RyaXZlcnMvcmFwaWRpby9yaW8uYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Jpb19yZWdzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlICJyaW8uaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKaW5kZXggZjc3OWY2Ny4uZWY0YzY4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogCiAjaW5jbHVkZSA8YXNtL2Njd2Rldi5oPgogI2luY2x1ZGUgPGFzbS9lYmNkaWMuaD4KQEAgLTE2MzQsNyArMTYzNSw3IEBACiAJYmxrX3F1ZXVlX21heF9od19zZWdtZW50cyhkZXZpY2UtPnJlcXVlc3RfcXVldWUsIC0xTCk7CiAJYmxrX3F1ZXVlX21heF9zZWdtZW50X3NpemUoZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLCAtMUwpOwogCWJsa19xdWV1ZV9zZWdtZW50X2JvdW5kYXJ5KGRldmljZS0+cmVxdWVzdF9xdWV1ZSwgLTFMKTsKLQlibGtfcXVldWVfb3JkZXJlZChkZXZpY2UtPnJlcXVlc3RfcXVldWUsIDEpOworCWJsa19xdWV1ZV9vcmRlcmVkKGRldmljZS0+cmVxdWVzdF9xdWV1ZSwgUVVFVUVfT1JERVJFRF9UQUcsIE5VTEwpOwogfQogCiAvKgpAQCAtMTcyMywxMiArMTcyNCwzNSBAQAogCXJldHVybiAwOwogfQogCisvKgorICogUmV0dXJuIGRpc2sgZ2VvbWV0cnkuCisgKi8KK3N0YXRpYyBpbnQKK2Rhc2RfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKQoreworCXN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlOworCisJZGV2aWNlID0gYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOworCWlmICghZGV2aWNlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghZGV2aWNlLT5kaXNjaXBsaW5lIHx8CisJICAgICFkZXZpY2UtPmRpc2NpcGxpbmUtPmZpbGxfZ2VvbWV0cnkpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2aWNlLT5kaXNjaXBsaW5lLT5maWxsX2dlb21ldHJ5KGRldmljZSwgZ2VvKTsKKwlnZW8tPnN0YXJ0ID0gZ2V0X3N0YXJ0X3NlY3QoYmRldikgPj4gZGV2aWNlLT5zMmJfc2hpZnQ7CisJcmV0dXJuIDA7Cit9CisKIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucwogZGFzZF9kZXZpY2Vfb3BlcmF0aW9ucyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4JCT0gZGFzZF9vcGVuLAogCS5yZWxlYXNlCT0gZGFzZF9yZWxlYXNlLAogCS5pb2N0bAkJPSBkYXNkX2lvY3RsLAorCS5jb21wYXRfaW9jdGwJPSBkYXNkX2NvbXBhdF9pb2N0bCwKKwkuZ2V0Z2VvCQk9IGRhc2RfZ2V0Z2VvLAogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9pbnQuaCBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oCmluZGV4IDJmYjA1YzQuLmU0YjQwMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oCkBAIC01MjcsNiArNTI3LDcgQEAKIGludCAgZGFzZF9pb2N0bF9ub19yZWdpc3RlcihzdHJ1Y3QgbW9kdWxlICosIGludCwgZGFzZF9pb2N0bF9mbl90KTsKIGludCAgZGFzZF9pb2N0bF9ub191bnJlZ2lzdGVyKHN0cnVjdCBtb2R1bGUgKiwgaW50LCBkYXNkX2lvY3RsX2ZuX3QpOwogaW50ICBkYXNkX2lvY3RsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworbG9uZyBkYXNkX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwogCiAvKiBleHRlcm5hbHMgaW4gZGFzZF9wcm9jLmMgKi8KIGludCBkYXNkX3Byb2NfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2lvY3RsLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9pb2N0bC5jCmluZGV4IDA0NGI3NTMuLjkzOTZmY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2lvY3RsLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW9jdGwuYwpAQCAtMTE4LDYgKzExOCwxOCBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCitsb25nCitkYXNkX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJ2YWw7CisKKwlsb2NrX2tlcm5lbCgpOworCXJ2YWwgPSBkYXNkX2lvY3RsKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxwLCBjbWQsIGFyZyk7CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIChydmFsID09IC1FSU5WQUwpID8gLUVOT0lPQ1RMQ01EIDogcnZhbDsKK30KKwogc3RhdGljIGludAogZGFzZF9pb2N0bF9hcGlfdmVyc2lvbihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBpbnQgbm8sIGxvbmcgYXJncykKIHsKQEAgLTQ4NiwzMyArNDk4LDYgQEAKIH0KIAogLyoKLSAqIFJldHVybiBkaXNrIGdlb21ldHJ5LgotICovCi1zdGF0aWMgaW50Ci1kYXNkX2lvY3RsX2dldGdlbyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBpbnQgbm8sIGxvbmcgYXJncykKLXsKLQlzdHJ1Y3QgaGRfZ2VvbWV0cnkgZ2VvID0geyAwLCB9OwotCXN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlOwotCi0JZGV2aWNlID0gIGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKLQlpZiAoZGV2aWNlID09IE5VTEwpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKGRldmljZSA9PSBOVUxMIHx8IGRldmljZS0+ZGlzY2lwbGluZSA9PSBOVUxMIHx8Ci0JICAgIGRldmljZS0+ZGlzY2lwbGluZS0+ZmlsbF9nZW9tZXRyeSA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWdlbyA9IChzdHJ1Y3QgaGRfZ2VvbWV0cnkpIHt9OwotCWRldmljZS0+ZGlzY2lwbGluZS0+ZmlsbF9nZW9tZXRyeShkZXZpY2UsICZnZW8pOwotCWdlby5zdGFydCA9IGdldF9zdGFydF9zZWN0KGJkZXYpID4+IGRldmljZS0+czJiX3NoaWZ0OwotCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCBoZF9nZW9tZXRyeSBfX3VzZXIgKikgYXJncywgJmdlbywKLQkJCSBzaXplb2YgKHN0cnVjdCBoZF9nZW9tZXRyeSkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotCi0vKgogICogTGlzdCBvZiBzdGF0aWMgaW9jdGxzLgogICovCiBzdGF0aWMgc3RydWN0IHsgaW50IG5vOyBkYXNkX2lvY3RsX2ZuX3QgZm47IH0gZGFzZF9pb2N0bHNbXSA9CkBAIC01MjgsNyArNTEzLDYgQEAKIAl7IEJJT0RBU0RQUlJTVCwgZGFzZF9pb2N0bF9yZXNldF9wcm9maWxlIH0sCiAJeyBCTEtST1NFVCwgZGFzZF9pb2N0bF9zZXRfcm8gfSwKIAl7IERBU0RBUElWRVIsIGRhc2RfaW9jdGxfYXBpX3ZlcnNpb24gfSwKLQl7IEhESU9fR0VUR0VPLCBkYXNkX2lvY3RsX2dldGdlbyB9LAogCXsgLTEsIE5VTEwgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL3hwcmFtLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2sveHByYW0uYwppbmRleCBiZjNhNjdjLi41NGVjZDU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2sveHByYW0uYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2sveHByYW0uYwpAQCAtMzI4LDMxICszMjgsMjcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB4cHJhbV9pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgeHByYW1fZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKQogewotCXN0cnVjdCBoZF9nZW9tZXRyeSBfX3VzZXIgKmdlbzsKIAl1bnNpZ25lZCBsb25nIHNpemU7Ci0JaWYgKGNtZCAhPSBIRElPX0dFVEdFTykKLQkJcmV0dXJuIC1FSU5WQUw7CisKIAkvKgogCSAqIGdldCBnZW9tZXRyeTogd2UgaGF2ZSB0byBmYWtlIG9uZS4uLiAgdHJpbSB0aGUgc2l6ZSB0byBhCiAJICogbXVsdGlwbGUgb2YgNjQgKDMyayk6IHRlbGwgd2UgaGF2ZSAxNiBzZWN0b3JzLCA0IGhlYWRzLAogCSAqIHdoYXRldmVyIGN5bGluZGVycy4gVGVsbCBhbHNvIHRoYXQgZGF0YSBzdGFydHMgYXQgc2VjdG9yLiA0LgogCSAqLwotCWdlbyA9IChzdHJ1Y3QgaGRfZ2VvbWV0cnkgX191c2VyICopIGFyZzsKIAlzaXplID0gKHhwcmFtX3BhZ2VzICogOCkgJiB+MHgzZjsKLQlwdXRfdXNlcihzaXplID4+IDYsICZnZW8tPmN5bGluZGVycyk7Ci0JcHV0X3VzZXIoNCwgJmdlby0+aGVhZHMpOwotCXB1dF91c2VyKDE2LCAmZ2VvLT5zZWN0b3JzKTsKLQlwdXRfdXNlcig0LCAmZ2VvLT5zdGFydCk7CisJZ2VvLT5jeWxpbmRlcnMgPSBzaXplID4+IDY7CisJZ2VvLT5oZWFkcyA9IDQ7CisJZ2VvLT5zZWN0b3JzID0gMTY7CisJZ2VvLT5zdGFydCA9IDQ7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgeHByYW1fZGV2b3BzID0KIHsKIAkub3duZXIJPSBUSElTX01PRFVMRSwKLQkuaW9jdGwJPSB4cHJhbV9pb2N0bCwKKwkuZ2V0Z2VvCT0geHByYW1fZ2V0Z2VvLAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyMTUuYyBiL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyMTUuYwppbmRleCA3NTQxOWNmLi4xZjA2MDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjE1LmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvY29uMzIxNS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgogI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgpAQCAtNDMyLDggKzQzMyw2IEBACiAJCQkJaWYgKGNvdW50ID4gc2xlbikKIAkJCQkJY291bnQgPSBzbGVuOwogCQkJfSBlbHNlCi0JCQlpZiAoY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSAtIHR0eS0+ZmxpcC5jb3VudCkKLQkJCQljb3VudCA9IFRUWV9GTElQQlVGX1NJWkUgLSB0dHktPmZsaXAuY291bnQgLSAxOwogCQkJRUJDQVNDKHJhdy0+aW5idWYsIGNvdW50KTsKIAkJCWNjaGFyID0gY3RybGNoYXJfaGFuZGxlKHJhdy0+aW5idWYsIGNvdW50LCB0dHkpOwogCQkJc3dpdGNoIChjY2hhciAmIENUUkxDSEFSX01BU0spIHsKQEAgLTQ0MSwyOCArNDQwLDIwIEBACiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgQ1RSTENIQVJfQ1RSTDoKLQkJCQl0dHktPmZsaXAuY291bnQrKzsKLQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX05PUk1BTDsKLQkJCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gY2NoYXI7CisJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjY2hhciwgVFRZX05PUk1BTCk7CiAJCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2gocmF3LT50dHkpOwogCQkJCWJyZWFrOwogCiAJCQljYXNlIENUUkxDSEFSX05PTkU6Ci0JCQkJbWVtY3B5KHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIsCi0JCQkJICAgICAgIHJhdy0+aW5idWYsIGNvdW50KTsKIAkJCQlpZiAoY291bnQgPCAyIHx8Ci0JCQkJICAgIChzdHJuY21wKHJhdy0+aW5idWYrY291bnQtMiwgIl5uIiwgMikgJiYKLQkJCQkgICAgc3RybmNtcChyYXctPmluYnVmK2NvdW50LTIsICJcMjUybiIsIDIpKSApIHsKLQkJCQkJLyogZG9uJ3QgYWRkIHRoZSBhdXRvIFxuICovCi0JCQkJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHJbY291bnRdID0gJ1xuJzsKLQkJCQkJbWVtc2V0KHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIsCi0JCQkJCSAgICAgICBUVFlfTk9STUFMLCBjb3VudCArIDEpOworCQkJCSAgICAoc3RybmNtcChyYXctPmluYnVmK2NvdW50LTIsICJcMjUybiIsIDIpICYmCisJCQkJICAgICBzdHJuY21wKHJhdy0+aW5idWYrY291bnQtMiwgIl5uIiwgMikpICkgeworCQkJCQkvKiBhZGQgdGhlIGF1dG8gXG4gKi8KKwkJCQkJcmF3LT5pbmJ1Zltjb3VudF0gPSAnXG4nOwogCQkJCQljb3VudCsrOwogCQkJCX0gZWxzZQotCQkJCQljb3VudC09MjsKLQkJCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyICs9IGNvdW50OwotCQkJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgKz0gY291bnQ7Ci0JCQkJdHR5LT5mbGlwLmNvdW50ICs9IGNvdW50OworCQkJCQljb3VudCAtPSAyOworCQkJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCByYXctPmluYnVmLCBjb3VudCk7CiAJCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2gocmF3LT50dHkpOwogCQkJCWJyZWFrOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvZnMzMjcwLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9mczMyNzAuYwppbmRleCA3MzVhN2ZjLi41ZjZmYTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9mczMyNzAuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9mczMyNzAuYwpAQCAtMzE5LDkgKzMxOSw4IEBACiAvKgogICogcHJvY2VzcyBpb2N0bCBjb21tYW5kcyBmb3IgdGhlIHR1YmUgZHJpdmVyCiAgKi8KLXN0YXRpYyBpbnQKLWZzMzI3MF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGxvbmcKK2ZzMzI3MF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGZzMzI3MCAqZnA7CiAJc3RydWN0IHJhdzMyNzBfaW9jYiBpb2NiOwpAQCAtMzMxLDYgKzMzMCw3IEBACiAJaWYgKCFmcCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJcmMgPSAwOworCWxvY2tfa2VybmVsKCk7CiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFRVQklDTUQ6CiAJCWZwLT5yZWFkX2NvbW1hbmQgPSBhcmc7CkBAIC0zNTYsNiArMzU2LDcgQEAKIAkJCXJjID0gLUVGQVVMVDsKIAkJYnJlYWs7CiAJfQorCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTQ5MSwxMiArNDkyLDEzIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZzMzI3MF9mb3BzID0gewotCS5vd25lcgkgPSBUSElTX01PRFVMRSwJCS8qIG93bmVyICovCi0JLnJlYWQJID0gZnMzMjcwX3JlYWQsCQkvKiByZWFkICovCi0JLndyaXRlCSA9IGZzMzI3MF93cml0ZSwJLyogd3JpdGUgKi8KLQkuaW9jdGwJID0gZnMzMjcwX2lvY3RsLAkvKiBpb2N0bCAqLwotCS5vcGVuCSA9IGZzMzI3MF9vcGVuLAkJLyogb3BlbiAqLwotCS5yZWxlYXNlID0gZnMzMjcwX2Nsb3NlLAkvKiByZWxlYXNlICovCisJLm93bmVyCQkgPSBUSElTX01PRFVMRSwJCS8qIG93bmVyICovCisJLnJlYWQJCSA9IGZzMzI3MF9yZWFkLAkJLyogcmVhZCAqLworCS53cml0ZQkJID0gZnMzMjcwX3dyaXRlLAkvKiB3cml0ZSAqLworCS51bmxvY2tlZF9pb2N0bAkgPSBmczMyNzBfaW9jdGwsCS8qIGlvY3RsICovCisJLmNvbXBhdF9pb2N0bAkgPSBmczMyNzBfaW9jdGwsCS8qIGlvY3RsICovCisJLm9wZW4JIAk9IGZzMzI3MF9vcGVuLAkJLyogb3BlbiAqLworCS5yZWxlYXNlIAk9IGZzMzI3MF9jbG9zZSwJCS8qIHJlbGVhc2UgKi8KIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3R0eS5jIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF90dHkuYwppbmRleCBhMjBkN2M4OS4uNmNiZjA2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF90dHkuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3R0eS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTQ5NiwyNSArNDk3LDE5IEBACiAJY2FzZSBDVFJMQ0hBUl9TWVNSUToKIAkJYnJlYWs7CiAJY2FzZSBDVFJMQ0hBUl9DVFJMOgotCQlzY2xwX3R0eS0+ZmxpcC5jb3VudCsrOwotCQkqc2NscF90dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfTk9STUFMOwotCQkqc2NscF90dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSBjY2hhcjsKKwkJdHR5X2luc2VydF9mbGlwX2NoYXIoc2NscF90dHksIGNjaGFyLCBUVFlfTk9STUFMKTsKIAkJdHR5X2ZsaXBfYnVmZmVyX3B1c2goc2NscF90dHkpOwogCQlicmVhazsKIAljYXNlIENUUkxDSEFSX05PTkU6CiAJCS8qIHNlbmQgKG5vcm1hbCkgaW5wdXQgdG8gbGluZSBkaXNjaXBsaW5lICovCi0JCW1lbWNweShzY2xwX3R0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIsIGJ1ZiwgY291bnQpOwogCQlpZiAoY291bnQgPCAyIHx8Ci0JCSAgICAoc3RybmNtcCAoKGNvbnN0IGNoYXIgKikgYnVmICsgY291bnQgLSAyLCAiXm4iLCAyKSAmJgotCQkgICAgIHN0cm5jbXAgKChjb25zdCBjaGFyICopIGJ1ZiArIGNvdW50IC0gMiwgIlwwMjUybiIsIDIpKSkgewotCQkJc2NscF90dHktPmZsaXAuY2hhcl9idWZfcHRyW2NvdW50XSA9ICdcbic7Ci0JCQljb3VudCsrOworCQkgICAgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKikgYnVmICsgY291bnQgLSAyLCAiXm4iLCAyKSAmJgorCQkgICAgIHN0cm5jbXAoKGNvbnN0IGNoYXIgKikgYnVmICsgY291bnQgLSAyLCAiXDI1Mm4iLCAyKSkpIHsKKwkJCS8qIGFkZCB0aGUgYXV0byBcbiAqLworCQkJdHR5X2luc2VydF9mbGlwX3N0cmluZyhzY2xwX3R0eSwgYnVmLCBjb3VudCk7CisJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcihzY2xwX3R0eSwgJ1xuJywgVFRZX05PUk1BTCk7CiAJCX0gZWxzZQotCQkJY291bnQgLT0gMjsKLQkJbWVtc2V0KHNjbHBfdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciwgVFRZX05PUk1BTCwgY291bnQpOwotCQlzY2xwX3R0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgKz0gY291bnQ7Ci0JCXNjbHBfdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciArPSBjb3VudDsKLQkJc2NscF90dHktPmZsaXAuY291bnQgKz0gY291bnQ7CisJCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHNjbHBfdHR5LCBidWYsIGNvdW50IC0gMik7CiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHNjbHBfdHR5KTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF92dDIyMC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF92dDIyMC5jCmluZGV4IDA2YmQ4NTguLjllMDI2MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfdnQyMjAuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3Z0MjIwLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC90dHlfZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KQEAgLTQ4MiwxNiArNDgzLDcgQEAKIAkJLyogU2VuZCBpbnB1dCB0byBsaW5lIGRpc2NpcGxpbmUgKi8KIAkJYnVmZmVyKys7CiAJCWNvdW50LS07Ci0JCS8qIFByZXZlbnQgYnVmZmVyIG92ZXJydW4gYnkgZGlzY2FyZGluZyBpbnB1dC4gTm90ZSB0aGF0Ci0JCSAqIGJlY2F1c2UgYnVmZmVyX3B1c2ggd29ya3MgYXN5bmNocm9ub3VzbHksIHdlIGNhbm5vdCB3YWl0Ci0JCSAqIGZvciB0aGUgYnVmZmVyIHRvIGJlIGVtcHRpZWQuICovCi0JCWlmIChjb3VudCArIHNjbHBfdnQyMjBfdHR5LT5mbGlwLmNvdW50ID4gVFRZX0ZMSVBCVUZfU0laRSkKLQkJCWNvdW50ID0gVFRZX0ZMSVBCVUZfU0laRSAtIHNjbHBfdnQyMjBfdHR5LT5mbGlwLmNvdW50OwotCQltZW1jcHkoc2NscF92dDIyMF90dHktPmZsaXAuY2hhcl9idWZfcHRyLCBidWZmZXIsIGNvdW50KTsKLQkJbWVtc2V0KHNjbHBfdnQyMjBfdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciwgVFRZX05PUk1BTCwgY291bnQpOwotCQlzY2xwX3Z0MjIwX3R0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgKz0gY291bnQ7Ci0JCXNjbHBfdnQyMjBfdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciArPSBjb3VudDsKLQkJc2NscF92dDIyMF90dHktPmZsaXAuY291bnQgKz0gY291bnQ7CisJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcoc2NscF92dDIyMF90dHksIGJ1ZmZlciwgY291bnQpOwogCQl0dHlfZmxpcF9idWZmZXJfcHVzaChzY2xwX3Z0MjIwX3R0eSk7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY2hhci5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9jaGFyLmMKaW5kZXggODYyNjJhMS4uNWNlN2NhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9jaGFyLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9jaGFyLmMKQEAgLTM3LDYgKzM3LDggQEAKIHN0YXRpYyBpbnQgdGFwZWNoYXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZmlsZSAqKTsKIHN0YXRpYyBpbnQgdGFwZWNoYXJfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwKIAkJCSAgdW5zaWduZWQgbG9uZyk7CitzdGF0aWMgbG9uZyB0YXBlY2hhcl9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LAorCQkJICB1bnNpZ25lZCBsb25nKTsKIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdGFwZV9mb3BzID0KIHsKQEAgLTQ0LDYgKzQ2LDcgQEAKIAkucmVhZCA9IHRhcGVjaGFyX3JlYWQsCiAJLndyaXRlID0gdGFwZWNoYXJfd3JpdGUsCiAJLmlvY3RsID0gdGFwZWNoYXJfaW9jdGwsCisJLmNvbXBhdF9pb2N0bCA9IHRhcGVjaGFyX2NvbXBhdF9pb2N0bCwKIAkub3BlbiA9IHRhcGVjaGFyX29wZW4sCiAJLnJlbGVhc2UgPSB0YXBlY2hhcl9yZWxlYXNlLAogfTsKQEAgLTQ2Myw2ICs0NjYsMjMgQEAKIAlyZXR1cm4gZGV2aWNlLT5kaXNjaXBsaW5lLT5pb2N0bF9mbihkZXZpY2UsIG5vLCBkYXRhKTsKIH0KIAorc3RhdGljIGxvbmcKK3RhcGVjaGFyX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IG5vLCB1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHRhcGVfZGV2aWNlICpkZXZpY2UgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJaW50IHJ2YWwgPSAtRU5PSU9DVExDTUQ7CisKKwlpZiAoZGV2aWNlLT5kaXNjaXBsaW5lLT5pb2N0bF9mbikgeworCQlsb2NrX2tlcm5lbCgpOworCQlydmFsID0gZGV2aWNlLT5kaXNjaXBsaW5lLT5pb2N0bF9mbihkZXZpY2UsIG5vLCBkYXRhKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlpZiAocnZhbCA9PSAtRUlOVkFMKQorCQkJcnZhbCA9IC1FTk9JT0NUTENNRDsKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKwogLyoKICAqIEluaXRpYWxpemUgY2hhcmFjdGVyIGRldmljZSBmcm9udGVuZC4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9haXJxLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2FpcnEuYwppbmRleCA4M2U2YTA2Li5jZDJjYzI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2FpcnEuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2FpcnEuYwpAQCAtMiwxMiArMiwxMiBAQAogICogIGRyaXZlcnMvczM5MC9jaW8vYWlycS5jCiAgKiAgIFMvMzkwIGNvbW1vbiBJL08gcm91dGluZXMgLS0gc3VwcG9ydCBmb3IgYWRhcHRlciBpbnRlcnJ1cHRpb25zCiAgKgotICogICAkUmV2aXNpb246IDEuMTIgJAorICogICAkUmV2aXNpb246IDEuMTUgJAogICoKICAqICAgIENvcHlyaWdodCAoQykgMTk5OS0yMDAyIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILAogICoJCQkgICAgICBJQk0gQ29ycG9yYXRpb24KICAqICAgIEF1dGhvcihzKTogSW5nbyBBZGx1bmcgKGFkbHVuZ0BkZS5pYm0uY29tKQotICoJCSBDb3JuZWxpYSBIdWNrIChjb2h1Y2tAZGUuaWJtLmNvbSkKKyAqCQkgQ29ybmVsaWEgSHVjayAoY29ybmVsaWEuaHVja0BkZS5pYm0uY29tKQogICoJCSBBcm5kIEJlcmdtYW5uIChhcm5kYkBkZS5pYm0uY29tKQogICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vYmxhY2tsaXN0LmMgYi9kcml2ZXJzL3MzOTAvY2lvL2JsYWNrbGlzdC5jCmluZGV4IGRhZjIxZTAuLjcyZjI3YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vYmxhY2tsaXN0LmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9ibGFja2xpc3QuYwpAQCAtMSwxMiArMSwxMiBAQAogLyoKICAqICBkcml2ZXJzL3MzOTAvY2lvL2JsYWNrbGlzdC5jCiAgKiAgIFMvMzkwIGNvbW1vbiBJL08gcm91dGluZXMgLS0gYmxhY2tsaXN0aW5nIG9mIHNwZWNpZmljIGRldmljZXMKLSAqICAgJFJldmlzaW9uOiAxLjM5ICQKKyAqICAgJFJldmlzaW9uOiAxLjQyICQKICAqCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMiBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwKICAqCQkJICAgICAgSUJNIENvcnBvcmF0aW9uCiAgKiAgICBBdXRob3Iocyk6IEluZ28gQWRsdW5nIChhZGx1bmdAZGUuaWJtLmNvbSkKLSAqCQkgQ29ybmVsaWEgSHVjayAoY29odWNrQGRlLmlibS5jb20pCisgKgkJIENvcm5lbGlhIEh1Y2sgKGNvcm5lbGlhLmh1Y2tAZGUuaWJtLmNvbSkKICAqCQkgQXJuZCBCZXJnbWFubiAoYXJuZGJAZGUuaWJtLmNvbSkKICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2Njd2dyb3VwLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Njd2dyb3VwLmMKaW5kZXggZTg0OTI4OS4uNmMwNzdhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jY3dncm91cC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYwpAQCAtMSwxMiArMSwxMiBAQAogLyoKICAqICBkcml2ZXJzL3MzOTAvY2lvL2Njd2dyb3VwLmMKICAqICBidXMgZHJpdmVyIGZvciBjY3dncm91cAotICogICAkUmV2aXNpb246IDEuMzMgJAorICogICAkUmV2aXNpb246IDEuMzUgJAogICoKICAqICAgIENvcHlyaWdodCAoQykgMjAwMiBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwKICAqICAgICAgICAgICAgICAgICAgICAgICBJQk0gQ29ycG9yYXRpb24KICAqICAgIEF1dGhvcihzKTogQXJuZCBCZXJnbWFubiAoYXJuZGJAZGUuaWJtLmNvbSkKLSAqICAgICAgICAgICAgICAgQ29ybmVsaWEgSHVjayAoY29odWNrQGRlLmlibS5jb20pCisgKiAgICAgICAgICAgICAgIENvcm5lbGlhIEh1Y2sgKGNvcm5lbGlhLmh1Y2tAZGUuaWJtLmNvbSkKICAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CkBAIC01MiwxMSArNTIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGJ1c190eXBlIGNjd2dyb3VwX2J1c190eXBlID0gewotCS5uYW1lICAgID0gImNjd2dyb3VwIiwKLQkubWF0Y2ggICA9IGNjd2dyb3VwX2J1c19tYXRjaCwKLQkudWV2ZW50ID0gY2N3Z3JvdXBfdWV2ZW50LAotfTsKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgY2N3Z3JvdXBfYnVzX3R5cGU7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogX19jY3dncm91cF9yZW1vdmVfc3ltbGlua3Moc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldikKQEAgLTM4OSw2ICszODUsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBidXNfdHlwZSBjY3dncm91cF9idXNfdHlwZSA9IHsKKwkubmFtZSAgID0gImNjd2dyb3VwIiwKKwkubWF0Y2ggID0gY2N3Z3JvdXBfYnVzX21hdGNoLAorCS51ZXZlbnQgPSBjY3dncm91cF91ZXZlbnQsCisJLnByb2JlICA9IGNjd2dyb3VwX3Byb2JlLAorCS5yZW1vdmUgPSBjY3dncm91cF9yZW1vdmUsCit9OworCiBpbnQKIGNjd2dyb3VwX2RyaXZlcl9yZWdpc3RlciAoc3RydWN0IGNjd2dyb3VwX2RyaXZlciAqY2RyaXZlcikKIHsKQEAgLTM5Niw4ICs0MDAsNiBAQAogCWNkcml2ZXItPmRyaXZlciA9IChzdHJ1Y3QgZGV2aWNlX2RyaXZlcikgewogCQkuYnVzID0gJmNjd2dyb3VwX2J1c190eXBlLAogCQkubmFtZSA9IGNkcml2ZXItPm5hbWUsCi0JCS5wcm9iZSA9IGNjd2dyb3VwX3Byb2JlLAotCQkucmVtb3ZlID0gY2N3Z3JvdXBfcmVtb3ZlLAogCX07CiAKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZjZHJpdmVyLT5kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jaHNjLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuYwppbmRleCA3MjcwODA4Li4yY2JiNzI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuYwpAQCAtMSwxMiArMSwxMiBAQAogLyoKICAqICBkcml2ZXJzL3MzOTAvY2lvL2Noc2MuYwogICogICBTLzM5MCBjb21tb24gSS9PIHJvdXRpbmVzIC0tIGNoYW5uZWwgc3Vic3lzdGVtIGNhbGwKLSAqICAgJFJldmlzaW9uOiAxLjEyNiAkCisgKiAgICRSZXZpc2lvbjogMS4xMjggJAogICoKICAqICAgIENvcHlyaWdodCAoQykgMTk5OS0yMDAyIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILAogICoJCQkgICAgICBJQk0gQ29ycG9yYXRpb24KICAqICAgIEF1dGhvcihzKTogSW5nbyBBZGx1bmcgKGFkbHVuZ0BkZS5pYm0uY29tKQotICoJCSBDb3JuZWxpYSBIdWNrIChjb2h1Y2tAZGUuaWJtLmNvbSkKKyAqCQkgQ29ybmVsaWEgSHVjayAoY29ybmVsaWEuaHVja0BkZS5pYm0uY29tKQogICoJCSBBcm5kIEJlcmdtYW5uIChhcm5kYkBkZS5pYm0uY29tKQogICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5jCmluZGV4IDczNzZiYzguLjYyMjNiMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaW8uYwpAQCAtMSwxMiArMSwxMiBAQAogLyoKICAqICBkcml2ZXJzL3MzOTAvY2lvL2Npby5jCiAgKiAgIFMvMzkwIGNvbW1vbiBJL08gcm91dGluZXMgLS0gbG93IGxldmVsIGkvbyBjYWxscwotICogICAkUmV2aXNpb246IDEuMTM4ICQKKyAqICAgJFJldmlzaW9uOiAxLjE0MCAkCiAgKgogICogICAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDIgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsCiAgKgkJCSAgICAgIElCTSBDb3Jwb3JhdGlvbgogICogICAgQXV0aG9yKHMpOiBJbmdvIEFkbHVuZyAoYWRsdW5nQGRlLmlibS5jb20pCi0gKgkJIENvcm5lbGlhIEh1Y2sgKGNvaHVja0BkZS5pYm0uY29tKQorICoJCSBDb3JuZWxpYSBIdWNrIChjb3JuZWxpYS5odWNrQGRlLmlibS5jb20pCiAgKgkJIEFybmQgQmVyZ21hbm4gKGFybmRiQGRlLmlibS5jb20pCiAgKgkJIE1hcnRpbiBTY2h3aWRlZnNreSAoc2Nod2lkZWZza3lAZGUuaWJtLmNvbSkKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jc3MuYyBiL2RyaXZlcnMvczM5MC9jaW8vY3NzLmMKaW5kZXggZTU2NTE5My4uNTE2MTA4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jc3MuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5jCkBAIC0xLDEyICsxLDEyIEBACiAvKgogICogIGRyaXZlcnMvczM5MC9jaW8vY3NzLmMKICAqICBkcml2ZXIgZm9yIGNoYW5uZWwgc3Vic3lzdGVtCi0gKiAgICRSZXZpc2lvbjogMS45MyAkCisgKiAgICRSZXZpc2lvbjogMS45NiAkCiAgKgogICogICAgQ29weXJpZ2h0IChDKSAyMDAyIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILAogICoJCQkgSUJNIENvcnBvcmF0aW9uCiAgKiAgICBBdXRob3Iocyk6IEFybmQgQmVyZ21hbm4gKGFybmRiQGRlLmlibS5jb20pCi0gKgkJIENvcm5lbGlhIEh1Y2sgKGNvaHVja0BkZS5pYm0uY29tKQorICoJCSBDb3JuZWxpYSBIdWNrIChjb3JuZWxpYS5odWNrQGRlLmlibS5jb20pCiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC01NDIsOSArNTQyLDQxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQKK2Nzc19wcm9iZSAoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CisKKwlzY2ggPSB0b19zdWJjaGFubmVsKGRldik7CisJc2NoLT5kcml2ZXIgPSBjb250YWluZXJfb2YgKGRldi0+ZHJpdmVyLCBzdHJ1Y3QgY3NzX2RyaXZlciwgZHJ2KTsKKwlyZXR1cm4gKHNjaC0+ZHJpdmVyLT5wcm9iZSA/IHNjaC0+ZHJpdmVyLT5wcm9iZShzY2gpIDogMCk7Cit9CisKK3N0YXRpYyBpbnQKK2Nzc19yZW1vdmUgKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOworCisJc2NoID0gdG9fc3ViY2hhbm5lbChkZXYpOworCXJldHVybiAoc2NoLT5kcml2ZXItPnJlbW92ZSA/IHNjaC0+ZHJpdmVyLT5yZW1vdmUoc2NoKSA6IDApOworfQorCitzdGF0aWMgdm9pZAorY3NzX3NodXRkb3duIChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN1YmNoYW5uZWwgKnNjaDsKKworCXNjaCA9IHRvX3N1YmNoYW5uZWwoZGV2KTsKKwlpZiAoc2NoLT5kcml2ZXItPnNodXRkb3duKQorCQlzY2gtPmRyaXZlci0+c2h1dGRvd24oc2NoKTsKK30KKwogc3RydWN0IGJ1c190eXBlIGNzc19idXNfdHlwZSA9IHsKLQkubmFtZSAgPSAiY3NzIiwKLQkubWF0Y2ggPSAmY3NzX2J1c19tYXRjaCwKKwkubmFtZSAgICAgPSAiY3NzIiwKKwkubWF0Y2ggICAgPSBjc3NfYnVzX21hdGNoLAorCS5wcm9iZSAgICA9IGNzc19wcm9iZSwKKwkucmVtb3ZlICAgPSBjc3NfcmVtb3ZlLAorCS5zaHV0ZG93biA9IGNzc19zaHV0ZG93biwKIH07CiAKIHN1YnN5c19pbml0Y2FsbChpbml0X2NoYW5uZWxfc3Vic3lzdGVtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY3NzLmggYi9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5oCmluZGV4IDI1MWViZDcuLmI2Mzc1ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY3NzLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jc3MuaApAQCAtMTE1LDYgKzExNSw3IEBACiAgKiBDdXJyZW50bHksIHdlIG9ubHkgY2FyZSBhYm91dCBJL08gc3ViY2hhbm5lbHMgKHR5cGUgMCksIHRoZXNlCiAgKiBoYXZlIGEgY2N3X2RldmljZSBjb25uZWN0ZWQgdG8gdGhlbS4KICAqLworc3RydWN0IHN1YmNoYW5uZWw7CiBzdHJ1Y3QgY3NzX2RyaXZlciB7CiAJdW5zaWduZWQgaW50IHN1YmNoYW5uZWxfdHlwZTsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcnY7CkBAIC0xMjIsNiArMTIzLDkgQEAKIAlpbnQgKCpub3RpZnkpKHN0cnVjdCBkZXZpY2UgKiwgaW50KTsKIAl2b2lkICgqdmVyaWZ5KShzdHJ1Y3QgZGV2aWNlICopOwogCXZvaWQgKCp0ZXJtaW5hdGlvbikoc3RydWN0IGRldmljZSAqKTsKKwlpbnQgKCpwcm9iZSkoc3RydWN0IHN1YmNoYW5uZWwgKik7CisJaW50ICgqcmVtb3ZlKShzdHJ1Y3Qgc3ViY2hhbm5lbCAqKTsKKwl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBzdWJjaGFubmVsICopOwogfTsKIAogLyoKQEAgLTE0Myw3ICsxNDcsNyBAQAogc3RydWN0IGNoYW5uZWxfc3Vic3lzdGVtIHsKIAl1OCBjc3NpZDsKIAlpbnQgdmFsaWQ7Ci0Jc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwc1tfX01BWF9DSFBJRF07CisJc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwc1tfX01BWF9DSFBJRCArIDFdOwogCXN0cnVjdCBkZXZpY2UgZGV2aWNlOwogCXN0cnVjdCBwZ2lkIGdsb2JhbF9wZ2lkOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCmluZGV4IGZhM2U0YzAuLmE2N2U3ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYwpAQCAtMSwxMiArMSwxMiBAQAogLyoKICAqICBkcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCiAgKiAgYnVzIGRyaXZlciBmb3IgY2N3IGRldmljZXMKLSAqICAgJFJldmlzaW9uOiAxLjEzNyAkCisgKiAgICRSZXZpc2lvbjogMS4xNDAgJAogICoKICAqICAgIENvcHlyaWdodCAoQykgMjAwMiBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwKICAqCQkJIElCTSBDb3Jwb3JhdGlvbgogICogICAgQXV0aG9yKHMpOiBBcm5kIEJlcmdtYW5uIChhcm5kYkBkZS5pYm0uY29tKQotICoJCSBDb3JuZWxpYSBIdWNrIChjb2h1Y2tAZGUuaWJtLmNvbSkKKyAqCQkgQ29ybmVsaWEgSHVjayAoY29ybmVsaWEuaHVja0BkZS5pYm0uY29tKQogICoJCSBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KQEAgLTEwNywzMyArMTA3LDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBidXNfdHlwZSBjY3dfYnVzX3R5cGUgPSB7Ci0JLm5hbWUgID0gImNjdyIsCi0JLm1hdGNoID0gJmNjd19idXNfbWF0Y2gsCi0JLnVldmVudCA9ICZjY3dfdWV2ZW50LAotfTsKK3N0cnVjdCBidXNfdHlwZSBjY3dfYnVzX3R5cGU7CiAKLXN0YXRpYyBpbnQgaW9fc3ViY2hhbm5lbF9wcm9iZSAoc3RydWN0IGRldmljZSAqKTsKLXN0YXRpYyBpbnQgaW9fc3ViY2hhbm5lbF9yZW1vdmUgKHN0cnVjdCBkZXZpY2UgKik7CitzdGF0aWMgaW50IGlvX3N1YmNoYW5uZWxfcHJvYmUgKHN0cnVjdCBzdWJjaGFubmVsICopOworc3RhdGljIGludCBpb19zdWJjaGFubmVsX3JlbW92ZSAoc3RydWN0IHN1YmNoYW5uZWwgKik7CiB2b2lkIGlvX3N1YmNoYW5uZWxfaXJxIChzdHJ1Y3QgZGV2aWNlICopOwogc3RhdGljIGludCBpb19zdWJjaGFubmVsX25vdGlmeShzdHJ1Y3QgZGV2aWNlICosIGludCk7CiBzdGF0aWMgdm9pZCBpb19zdWJjaGFubmVsX3ZlcmlmeShzdHJ1Y3QgZGV2aWNlICopOwogc3RhdGljIHZvaWQgaW9fc3ViY2hhbm5lbF9pb3Rlcm0oc3RydWN0IGRldmljZSAqKTsKLXN0YXRpYyB2b2lkIGlvX3N1YmNoYW5uZWxfc2h1dGRvd24oc3RydWN0IGRldmljZSAqKTsKK3N0YXRpYyB2b2lkIGlvX3N1YmNoYW5uZWxfc2h1dGRvd24oc3RydWN0IHN1YmNoYW5uZWwgKik7CiAKIHN0cnVjdCBjc3NfZHJpdmVyIGlvX3N1YmNoYW5uZWxfZHJpdmVyID0gewogCS5zdWJjaGFubmVsX3R5cGUgPSBTVUJDSEFOTkVMX1RZUEVfSU8sCiAJLmRydiA9IHsKIAkJLm5hbWUgPSAiaW9fc3ViY2hhbm5lbCIsCiAJCS5idXMgID0gJmNzc19idXNfdHlwZSwKLQkJLnByb2JlID0gJmlvX3N1YmNoYW5uZWxfcHJvYmUsCi0JCS5yZW1vdmUgPSAmaW9fc3ViY2hhbm5lbF9yZW1vdmUsCi0JCS5zaHV0ZG93biA9ICZpb19zdWJjaGFubmVsX3NodXRkb3duLAogCX0sCiAJLmlycSA9IGlvX3N1YmNoYW5uZWxfaXJxLAogCS5ub3RpZnkgPSBpb19zdWJjaGFubmVsX25vdGlmeSwKIAkudmVyaWZ5ID0gaW9fc3ViY2hhbm5lbF92ZXJpZnksCiAJLnRlcm1pbmF0aW9uID0gaW9fc3ViY2hhbm5lbF9pb3Rlcm0sCisJLnByb2JlID0gaW9fc3ViY2hhbm5lbF9wcm9iZSwKKwkucmVtb3ZlID0gaW9fc3ViY2hhbm5lbF9yZW1vdmUsCisJLnNodXRkb3duID0gaW9fc3ViY2hhbm5lbF9zaHV0ZG93biwKIH07CiAKIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpjY3dfZGV2aWNlX3dvcms7CkBAIC04MDMsMTQgKzc5OSwxMiBAQAogfQogCiBzdGF0aWMgaW50Ci1pb19zdWJjaGFubmVsX3Byb2JlIChzdHJ1Y3QgZGV2aWNlICpwZGV2KQoraW9fc3ViY2hhbm5lbF9wcm9iZSAoc3RydWN0IHN1YmNoYW5uZWwgKnNjaCkKIHsKLQlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwogCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwogCWludCByYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc2NoID0gdG9fc3ViY2hhbm5lbChwZGV2KTsKIAlpZiAoc2NoLT5kZXYuZHJpdmVyX2RhdGEpIHsKIAkJLyoKIAkJICogVGhpcyBzdWJjaGFubmVsIGFscmVhZHkgaGFzIGFuIGFzc29jaWF0ZWQgY2N3X2RldmljZS4KQEAgLTg0Niw3ICs4NDAsNyBAQAogCW1lbXNldChjZGV2LT5wcml2YXRlLCAwLCBzaXplb2Yoc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSkpOwogCWF0b21pY19zZXQoJmNkZXYtPnByaXZhdGUtPm9ub2ZmLCAwKTsKIAljZGV2LT5kZXYgPSAoc3RydWN0IGRldmljZSkgewotCQkucGFyZW50ID0gcGRldiwKKwkJLnBhcmVudCA9ICZzY2gtPmRldiwKIAkJLnJlbGVhc2UgPSBjY3dfZGV2aWNlX3JlbGVhc2UsCiAJfTsKIAlJTklUX0xJU1RfSEVBRCgmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrLmVudHJ5KTsKQEAgLTg1OSw3ICs4NTMsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlyYyA9IGlvX3N1YmNoYW5uZWxfcmVjb2coY2RldiwgdG9fc3ViY2hhbm5lbChwZGV2KSk7CisJcmMgPSBpb19zdWJjaGFubmVsX3JlY29nKGNkZXYsIHNjaCk7CiAJaWYgKHJjKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZzY2gtPmxvY2ssIGZsYWdzKTsKIAkJc2NoLT5kZXYuZHJpdmVyX2RhdGEgPSBOVUxMOwpAQCAtODgzLDE3ICs4NzcsMTcgQEAKIH0KIAogc3RhdGljIGludAotaW9fc3ViY2hhbm5lbF9yZW1vdmUgKHN0cnVjdCBkZXZpY2UgKmRldikKK2lvX3N1YmNoYW5uZWxfcmVtb3ZlIChzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQogewogCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoIWRldi0+ZHJpdmVyX2RhdGEpCisJaWYgKCFzY2gtPmRldi5kcml2ZXJfZGF0YSkKIAkJcmV0dXJuIDA7Ci0JY2RldiA9IGRldi0+ZHJpdmVyX2RhdGE7CisJY2RldiA9IHNjaC0+ZGV2LmRyaXZlcl9kYXRhOwogCS8qIFNldCBjY3cgZGV2aWNlIHRvIG5vdCBvcGVyYXRpb25hbCBhbmQgZHJvcCByZWZlcmVuY2UuICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwotCWRldi0+ZHJpdmVyX2RhdGEgPSBOVUxMOworCXNjaC0+ZGV2LmRyaXZlcl9kYXRhID0gTlVMTDsKIAljZGV2LT5wcml2YXRlLT5zdGF0ZSA9IERFVl9TVEFURV9OT1RfT1BFUjsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGNkZXYtPmNjd2xvY2ssIGZsYWdzKTsKIAkvKgpAQCAtOTQ4LDE0ICs5NDIsMTIgQEAKIH0KIAogc3RhdGljIHZvaWQKLWlvX3N1YmNoYW5uZWxfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoraW9fc3ViY2hhbm5lbF9zaHV0ZG93bihzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQogewotCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CiAJc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7CiAJaW50IHJldDsKIAotCXNjaCA9IHRvX3N1YmNoYW5uZWwoZGV2KTsKLQljZGV2ID0gZGV2LT5kcml2ZXJfZGF0YTsKKwljZGV2ID0gc2NoLT5kZXYuZHJpdmVyX2RhdGE7CiAKIAlpZiAoY2lvX2lzX2NvbnNvbGUoc2NoLT5zY2hpZCkpCiAJCXJldHVybjsKQEAgLTExMjksNiArMTEyMSwxNCBAQAogCXJldHVybiAwOwogfQogCitzdHJ1Y3QgYnVzX3R5cGUgY2N3X2J1c190eXBlID0geworCS5uYW1lICAgPSAiY2N3IiwKKwkubWF0Y2ggID0gY2N3X2J1c19tYXRjaCwKKwkudWV2ZW50ID0gY2N3X3VldmVudCwKKwkucHJvYmUgID0gY2N3X2RldmljZV9wcm9iZSwKKwkucmVtb3ZlID0gY2N3X2RldmljZV9yZW1vdmUsCit9OworCiBpbnQKIGNjd19kcml2ZXJfcmVnaXN0ZXIgKHN0cnVjdCBjY3dfZHJpdmVyICpjZHJpdmVyKQogewpAQCAtMTEzNiw4ICsxMTM2LDYgQEAKIAogCWRydi0+YnVzID0gJmNjd19idXNfdHlwZTsKIAlkcnYtPm5hbWUgPSBjZHJpdmVyLT5uYW1lOwotCWRydi0+cHJvYmUgPSBjY3dfZGV2aWNlX3Byb2JlOwotCWRydi0+cmVtb3ZlID0gY2N3X2RldmljZV9yZW1vdmU7CiAKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKGRydik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9mc20uYyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jCmluZGV4IDIzZDEyYjYuLmIzMDI3NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jCkBAIC00LDcgKzQsNyBAQAogICoKICAqICAgIENvcHlyaWdodCAoQykgMjAwMiBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwKICAqCQkJIElCTSBDb3Jwb3JhdGlvbgotICogICAgQXV0aG9yKHMpOiBDb3JuZWxpYSBIdWNrKGNvaHVja0BkZS5pYm0uY29tKQorICogICAgQXV0aG9yKHMpOiBDb3JuZWxpYSBIdWNrIChjb3JuZWxpYS5odWNrQGRlLmlibS5jb20pCiAgKgkJIE1hcnRpbiBTY2h3aWRlZnNreSAoc2Nod2lkZWZza3lAZGUuaWJtLmNvbSkKICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9pZC5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfaWQuYwppbmRleCAwNGNlYmEzLi5lNjBiMmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9pZC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2lkLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogICAgQ29weXJpZ2h0IChDKSAyMDAyIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILAogICoJCQkgSUJNIENvcnBvcmF0aW9uCi0gKiAgICBBdXRob3Iocyk6IENvcm5lbGlhIEh1Y2soY29odWNrQGRlLmlibS5jb20pCisgKiAgICBBdXRob3Iocyk6IENvcm5lbGlhIEh1Y2sgKGNvcm5lbGlhLmh1Y2tAZGUuaWJtLmNvbSkKICAqCQkgTWFydGluIFNjaHdpZGVmc2t5IChzY2h3aWRlZnNreUBkZS5pYm0uY29tKQogICoKICAqIFNlbnNlIElEIGZ1bmN0aW9ucy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX29wcy5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKaW5kZXggMTQzYjZjMi4uOGIwMjE4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKQEAgLTEsMTIgKzEsMTIgQEAKIC8qCiAgKiAgZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKICAqCi0gKiAgICRSZXZpc2lvbjogMS41OCAkCisgKiAgICRSZXZpc2lvbjogMS42MSAkCiAgKgogICogICAgQ29weXJpZ2h0IChDKSAyMDAyIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILAogICoJCQkgSUJNIENvcnBvcmF0aW9uCiAgKiAgICBBdXRob3Iocyk6IE1hcnRpbiBTY2h3aWRlZnNreSAoc2Nod2lkZWZza3lAZGUuaWJtLmNvbSkKLSAqICAgICAgICAgICAgICAgQ29ybmVsaWEgSHVjayAoY29odWNrQGRlLmlibS5jb20pCisgKiAgICAgICAgICAgICAgIENvcm5lbGlhIEh1Y2sgKGNvcm5lbGlhLmh1Y2tAZGUuaWJtLmNvbSkKICAqLwogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfcGdpZC5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfcGdpZC5jCmluZGV4IDA1MjgzMmQuLmQyYTViMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX3BnaWQuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9wZ2lkLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogICAgQ29weXJpZ2h0IChDKSAyMDAyIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILAogICoJCQkgSUJNIENvcnBvcmF0aW9uCi0gKiAgICBBdXRob3Iocyk6IENvcm5lbGlhIEh1Y2soY29odWNrQGRlLmlibS5jb20pCisgKiAgICBBdXRob3Iocyk6IENvcm5lbGlhIEh1Y2sgKGNvcm5lbGlhLmh1Y2tAZGUuaWJtLmNvbSkKICAqCQkgTWFydGluIFNjaHdpZGVmc2t5IChzY2h3aWRlZnNreUBkZS5pYm0uY29tKQogICoKICAqIFBhdGggR3JvdXAgSUQgZnVuY3Rpb25zLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfc3RhdHVzLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9zdGF0dXMuYwppbmRleCBkYjA5YzIwLi5kYWQ0ZGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9zdGF0dXMuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9zdGF0dXMuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDIgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsCiAgKgkJCSBJQk0gQ29ycG9yYXRpb24KLSAqICAgIEF1dGhvcihzKTogQ29ybmVsaWEgSHVjayhjb2h1Y2tAZGUuaWJtLmNvbSkKKyAqICAgIEF1dGhvcihzKTogQ29ybmVsaWEgSHVjayAoY29ybmVsaWEuaHVja0BkZS5pYm0uY29tKQogICoJCSBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pCiAgKgogICogU3RhdHVzIGFjY3VtdWxhdGlvbiBhbmQgYmFzaWMgc2Vuc2UgZnVuY3Rpb25zLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9xZGlvLmMgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uYwppbmRleCAzMGE4MzZmLi43N2JlMmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uYwpAQCAtNyw3ICs3LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgMjAwMCwyMDAyIElCTSBDb3Jwb3JhdGlvbgogICogQXV0aG9yKHMpOiAgICAgICAgICAgICBVdHogQmFjaGVyIDx1dHouYmFjaGVyQGRlLmlibS5jb20+Ci0gKiAyLjYgY2lvIGludGVncmF0aW9uIGJ5IENvcm5lbGlhIEh1Y2sgPGNvaHVja0BkZS5pYm0uY29tPgorICogMi42IGNpbyBpbnRlZ3JhdGlvbiBieSBDb3JuZWxpYSBIdWNrIDxjb3JuZWxpYS5odWNrQGRlLmlibS5jb20+CiAgKgogICogUmVzdHJpY3Rpb246IG9ubHkgNjMgaXFkaW8gc3ViY2hhbm5lbHMgd291bGQgaGF2ZSBpdHMgb3duIGluZGljYXRvciwKICAqIGFmdGVyIHRoYXQsIHN1YnNlcXVlbnQgc3ViY2hhbm5lbHMgc2hhcmUgb25lIGluZGljYXRvcgpAQCAtNTYsNyArNTYsNyBAQAogI2luY2x1ZGUgImlvYXNtLmgiCiAjaW5jbHVkZSAiY2hzYy5oIgogCi0jZGVmaW5lIFZFUlNJT05fUURJT19DICIkUmV2aXNpb246IDEuMTE0ICQiCisjZGVmaW5lIFZFUlNJT05fUURJT19DICIkUmV2aXNpb246IDEuMTE3ICQiCiAKIC8qKioqKioqKioqKioqKioqKiogTU9EVUxFIFBBUkFNRVRFUiBWQVJJQUJMRVMgKioqKioqKioqKioqKioqKioqKiovCiBNT0RVTEVfQVVUSE9SKCJVdHogQmFjaGVyIDx1dHouYmFjaGVyQGRlLmlibS5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY3J5cHRvL3o5MG1haW4uYyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vejkwbWFpbi5jCmluZGV4IDEzNWFlMDQuLjJmNTRkMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jcnlwdG8vejkwbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vejkwbWFpbi5jCkBAIC0zMCw3ICszMCw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4gICAgICAgLy8gbWRlbGF5CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPiAgIC8vIGZvciB0YXNrbGV0cwotI2luY2x1ZGUgPGxpbnV4L2lvY3RsMzIuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvY3RjbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9jdGNtYWluLmMKaW5kZXggMGRiNGY1Ny4uMTkwMWZlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9jdGNtYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9jdGNtYWluLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBjdGNtYWluLmMsdiAxLjc4IDIwMDUvMDkvMDcgMTI6MTg6MDIgcGF2bGljIEV4cCAkCisgKiAkSWQ6IGN0Y21haW4uYyx2IDEuNzkgMjAwNi8wMS8xMSAxMTozMjoxOCBjb2h1Y2sgRXhwICQKICAqCiAgKiBDVEMgLyBFU0NPTiBuZXR3b3JrIGRyaXZlcgogICoKQEAgLTgsNyArOCw3IEBACiAgKiBGaXhlcyBieSA6IEpvY2hlbiBS9mhyaWcgKHJvZWhyaWdAZGUuaWJtLmNvbSkKICAqICAgICAgICAgICAgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CiAJICAgICAgUGV0ZXIgVGllZGVtYW5uIChwdGllZGVtQGRlLmlibS5jb20pCi0gKiBEcml2ZXIgTW9kZWwgc3R1ZmYgYnkgOiBDb3JuZWxpYSBIdWNrIDxjb2h1Y2tAZGUuaWJtLmNvbT4KKyAqIERyaXZlciBNb2RlbCBzdHVmZiBieSA6IENvcm5lbGlhIEh1Y2sgPGh1Y2tjQGRlLmlibS5jb20+CiAgKgogICogRG9jdW1lbnRhdGlvbiB1c2VkOgogICogIC0gUHJpbmNpcGxlcyBvZiBPcGVyYXRpb24gKElCTSBkb2MjOiBTQTIyLTcyMDEtMDYpCkBAIC0zNyw3ICszNyw3IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKgotICogUkVMRUFTRS1UQUc6IENUQy9FU0NPTiBuZXR3b3JrIGRyaXZlciAkUmV2aXNpb246IDEuNzggJAorICogUkVMRUFTRS1UQUc6IENUQy9FU0NPTiBuZXR3b3JrIGRyaXZlciAkUmV2aXNpb246IDEuNzkgJAogICoKICAqLwogI3VuZGVmIERFQlVHCkBAIC0yNDgsNyArMjQ4LDcgQEAKIHByaW50X2Jhbm5lcih2b2lkKQogewogCXN0YXRpYyBpbnQgcHJpbnRlZCA9IDA7Ci0JY2hhciB2YnVmW10gPSAiJFJldmlzaW9uOiAxLjc4ICQiOworCWNoYXIgdmJ1ZltdID0gIiRSZXZpc2lvbjogMS43OSAkIjsKIAljaGFyICp2ZXJzaW9uID0gdmJ1ZjsKIAogCWlmIChwcmludGVkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9jdGN0dHkuYyBiL2RyaXZlcnMvczM5MC9uZXQvY3RjdHR5LmMKaW5kZXggOTY4ZjJjMS4uOTNkMTcyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9jdGN0dHkuYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L2N0Y3R0eS5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTEwMSwyNSArMTAyLDE3IEBACiBzdGF0aWMgaW50CiBjdGNfdHR5X3RyeV9yZWFkKGN0Y190dHlfaW5mbyAqIGluZm8sIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaW50IGM7CiAJaW50IGxlbjsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCiAJREJGX1RFWFQodHJhY2UsIDUsIF9fRlVOQ1RJT05fXyk7CiAJaWYgKCh0dHkgPSBpbmZvLT50dHkpKSB7CiAJCWlmIChpbmZvLT5tY3IgJiBVQVJUX01DUl9SVFMpIHsKLQkJCWMgPSBUVFlfRkxJUEJVRl9TSVpFIC0gdHR5LT5mbGlwLmNvdW50OwogCQkJbGVuID0gc2tiLT5sZW47Ci0JCQlpZiAoYyA+PSBsZW4pIHsKLQkJCQltZW1jcHkodHR5LT5mbGlwLmNoYXJfYnVmX3B0ciwgc2tiLT5kYXRhLCBsZW4pOwotCQkJCW1lbXNldCh0dHktPmZsaXAuZmxhZ19idWZfcHRyLCAwLCBsZW4pOwotCQkJCXR0eS0+ZmxpcC5jb3VudCArPSBsZW47Ci0JCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciArPSBsZW47Ci0JCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciArPSBsZW47Ci0JCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKLQkJCQlrZnJlZV9za2Ioc2tiKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KKwkJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBza2ItPmRhdGEsIGxlbik7CisJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMTsKIAkJfQogCX0KIAlyZXR1cm4gMDsKQEAgLTEzOCwxOSArMTMxLDEyIEBACiAJREJGX1RFWFQodHJhY2UsIDUsIF9fRlVOQ1RJT05fXyk7CiAJaWYgKCh0dHkgPSBpbmZvLT50dHkpKSB7CiAJCWlmIChpbmZvLT5tY3IgJiBVQVJUX01DUl9SVFMpIHsKLQkJCWludCBjID0gVFRZX0ZMSVBCVUZfU0laRSAtIHR0eS0+ZmxpcC5jb3VudDsKIAkJCXN0cnVjdCBza19idWZmICpza2I7CiAJCQkKLQkJCWlmICgoYyA+IDApICYmIChza2IgPSBza2JfZGVxdWV1ZSgmaW5mby0+cnhfcXVldWUpKSkgeworCQkJaWYgKChza2IgPSBza2JfZGVxdWV1ZSgmaW5mby0+cnhfcXVldWUpKSkgewogCQkJCWludCBsZW4gPSBza2ItPmxlbjsKLQkJCQlpZiAobGVuID4gYykKLQkJCQkJbGVuID0gYzsKLQkJCQltZW1jcHkodHR5LT5mbGlwLmNoYXJfYnVmX3B0ciwgc2tiLT5kYXRhLCBsZW4pOworCQkJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBza2ItPmRhdGEsIGxlbik7CiAJCQkJc2tiX3B1bGwoc2tiLCBsZW4pOwotCQkJCW1lbXNldCh0dHktPmZsaXAuZmxhZ19idWZfcHRyLCAwLCBsZW4pOwotCQkJCXR0eS0+ZmxpcC5jb3VudCArPSBsZW47Ci0JCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciArPSBsZW47Ci0JCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciArPSBsZW47CiAJCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKIAkJCQlpZiAoc2tiLT5sZW4gPiAwKQogCQkJCQlza2JfcXVldWVfaGVhZCgmaW5mby0+cnhfcXVldWUsIHNrYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L2N1MzA4OC5jIGIvZHJpdmVycy9zMzkwL25ldC9jdTMwODguYwppbmRleCA3N2RhY2I0Li4yMDE0ZmI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L2N1MzA4OC5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvY3UzMDg4LmMKQEAgLTEsMTEgKzEsMTEgQEAKIC8qCi0gKiAkSWQ6IGN1MzA4OC5jLHYgMS4zNiAyMDA1LzEwLzI1IDE0OjM3OjE3IGNvaHVjayBFeHAgJAorICogJElkOiBjdTMwODguYyx2IDEuMzggMjAwNi8wMS8xMiAxNDozMzowOSBjb2h1Y2sgRXhwICQKICAqCiAgKiBDVEMgLyBMQ1MgY2N3X2RldmljZSBkcml2ZXIKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgogICogQXV0aG9yKHMpOiBBcm5kIEJlcmdtYW5uIDxhcm5kYkBkZS5pYm0uY29tPgotICogICAgICAgICAgICBDb3JuZWxpYSBIdWNrIDxjb2h1Y2tAZGUuaWJtLmNvbT4KKyAqICAgICAgICAgICAgQ29ybmVsaWEgSHVjayA8Y29ybmVsaWEuaHVja0BkZS5pYm0uY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9uZXRpdWN2LmMgYi9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYwppbmRleCA2OTQyNWE3Li5hYzRjNGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYwpAQCAtMSwxMiArMSwxMyBAQAogLyoKLSAqICRJZDogbmV0aXVjdi5jLHYgMS42NiAyMDA1LzA1LzExIDA4OjEwOjE3IGhvbHpoZXUgRXhwICQKKyAqICRJZDogbmV0aXVjdi5jLHYgMS42OSAyMDA2LzAxLzEyIDE0OjMzOjA5IGNvaHVjayBFeHAgJAogICoKICAqIElVQ1YgbmV0d29yayBkcml2ZXIKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgogICogQXV0aG9yKHMpOiBGcml0eiBFbGZlcnQgKGVsZmVydEBkZS5pYm0uY29tLCBmZWxmZXJ0QG1pbGxlbnV4LmNvbSkKICAqCi0gKiBEcml2ZXJmcyBpbnRlZ3JhdGlvbiBhbmQgYWxsIGJ1Z3MgdGhlcmVpbiBieSBDb3JuZWxpYSBIdWNrKGNvaHVja0BkZS5pYm0uY29tKQorICogU3lzZnMgaW50ZWdyYXRpb24gYW5kIGFsbCBidWdzIHRoZXJlaW4gYnkgQ29ybmVsaWEgSHVjaworICogKGNvcm5lbGlhLmh1Y2tAZGUuaWJtLmNvbSkKICAqCiAgKiBEb2N1bWVudGF0aW9uIHVzZWQ6CiAgKiAgdGhlIHNvdXJjZSBvZiB0aGUgb3JpZ2luYWwgSVVDViBkcml2ZXIgYnk6CkBAIC0zMCw3ICszMSw3IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKgotICogUkVMRUFTRS1UQUc6IElVQ1YgbmV0d29yayBkcml2ZXIgJFJldmlzaW9uOiAxLjY2ICQKKyAqIFJFTEVBU0UtVEFHOiBJVUNWIG5ldHdvcmsgZHJpdmVyICRSZXZpc2lvbjogMS42OSAkCiAgKgogICovCiAMCkBAIC0yMDc2LDcgKzIwNzcsNyBAQAogc3RhdGljIHZvaWQKIG5ldGl1Y3ZfYmFubmVyKHZvaWQpCiB7Ci0JY2hhciB2YnVmW10gPSAiJFJldmlzaW9uOiAxLjY2ICQiOworCWNoYXIgdmJ1ZltdID0gIiRSZXZpc2lvbjogMS42OSAkIjsKIAljaGFyICp2ZXJzaW9uID0gdmJ1ZjsKIAogCWlmICgodmVyc2lvbiA9IHN0cmNocih2ZXJzaW9uLCAnOicpKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3MzOTBfcmRldi5jIGIvZHJpdmVycy9zMzkwL3MzOTBfcmRldi5jCmluZGV4IDU2NmNjM2QuLjIwNjUxOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zMzkwX3JkZXYuYworKysgYi9kcml2ZXJzL3MzOTAvczM5MF9yZGV2LmMKQEAgLTEsMTEgKzEsMTEgQEAKIC8qCiAgKiAgZHJpdmVycy9zMzkwL3MzOTBfcmRldi5jCiAgKiAgczM5MCByb290IGRldmljZQotICogICAkUmV2aXNpb246IDEuMiAkCisgKiAgICRSZXZpc2lvbjogMS40ICQKICAqCiAgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDUgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsCiAgKgkJCSBJQk0gQ29ycG9yYXRpb24KLSAqICAgIEF1dGhvcihzKTogQ29ybmVsaWEgSHVjayAoY29odWNrQGRlLmlibS5jb20pCisgKiAgICBBdXRob3Iocyk6IENvcm5lbGlhIEh1Y2sgKGNvcm5lbGlhLmh1Y2tAZGUuaWJtLmNvbSkKICAqCQkgIENhcnN0ZW4gT3R0ZSAgKGNvdHRlQGRlLmlibS5jb20pCiAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9hdXguYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfYXV4LmMKaW5kZXggNWU4NGM1YS4uMTY3ZmVmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9hdXguYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2F1eC5jCkBAIC0xMTI1LDYgKzExMjUsOCBAQAogCXpmY3BfZnJlZV9sb3dfbWVtX2J1ZmZlcnMoYWRhcHRlcik7CiAJLyogZnJlZSBtZW1vcnkgb2YgYWRhcHRlciBkYXRhIHN0cnVjdHVyZSBhbmQgcXVldWVzICovCiAJemZjcF9xZGlvX2ZyZWVfcXVldWVzKGFkYXB0ZXIpOworCWtmcmVlKGFkYXB0ZXItPmZjX3N0YXRzKTsKKwlrZnJlZShhZGFwdGVyLT5zdGF0c19yZXNldF9kYXRhKTsKIAlaRkNQX0xPR19UUkFDRSgiZnJlZWluZyBhZGFwdGVyIHN0cnVjdHVyZVxuIik7CiAJa2ZyZWUoYWRhcHRlcik7CiAgb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kZWYuaCBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGVmLmgKaW5kZXggZDgxYjczNy4uOWJiNTExMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kZWYuaAorKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RlZi5oCkBAIC05MjEsNyArOTIxLDYgQEAKIAl1MzIJCQlwaHlzaWNhbF9zX2lkOyAgICAgLyogbG9jYWwgRkMgcG9ydCBJRCAqLwogCXN0cnVjdCBjY3dfZGV2aWNlICAgICAgICpjY3dfZGV2aWNlOwkgICAvKiBTLzM5MCBjY3cgZGV2aWNlICovCiAJdTgJCQlmY19zZXJ2aWNlX2NsYXNzOwotCXUzMgkJCWZjX3RvcG9sb2d5OwkgICAvKiBGQyB0b3BvbG9neSAqLwogCXUzMgkJCWh5ZHJhX3ZlcnNpb247CSAgIC8qIEh5ZHJhIHZlcnNpb24gKi8KIAl1MzIJCQlmc2ZfbGljX3ZlcnNpb247CiAJdTMyCQkJYWRhcHRlcl9mZWF0dXJlczsgIC8qIEZDUCBjaGFubmVsIGZlYXR1cmVzICovCkBAIC05NzgsNiArOTc3LDkgQEAKIAlzdHJ1Y3QgemZjcF9hZGFwdGVyX21lbXBvb2wJcG9vbDsgICAgICAvKiBBZGFwdGVyIG1lbW9yeSBwb29scyAqLwogCXN0cnVjdCBxZGlvX2luaXRpYWxpemUgIHFkaW9faW5pdF9kYXRhOyAgICAvKiBmb3IgcWRpb19lc3RhYmxpc2ggKi8KIAlzdHJ1Y3QgZGV2aWNlICAgICAgICAgICBnZW5lcmljX3NlcnZpY2VzOyAgLyogZGlyZWN0b3J5IGZvciBXS0EgcG9ydHMgKi8KKwlzdHJ1Y3QgZmNfaG9zdF9zdGF0aXN0aWNzICpmY19zdGF0czsKKwlzdHJ1Y3QgZnNmX3F0Y2JfYm90dG9tX3BvcnQgKnN0YXRzX3Jlc2V0X2RhdGE7CisJdW5zaWduZWQgbG9uZwkJc3RhdHNfcmVzZXQ7CiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9lcnAuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXJwLmMKaW5kZXggZWU3MzE0ZC4uYzA2NWNiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9lcnAuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2VycC5jCkBAIC0yNjEzLDcgKzI2MTMsNyBAQAogCWNhc2UgWkZDUF9FUlBfU1RFUF9VTklOSVRJQUxJWkVEOgogCWNhc2UgWkZDUF9FUlBfU1RFUF9QSFlTX1BPUlRfQ0xPU0lORzoKIAljYXNlIFpGQ1BfRVJQX1NURVBfUE9SVF9DTE9TSU5HOgotCQlpZiAoYWRhcHRlci0+ZmNfdG9wb2xvZ3kgPT0gRlNGX1RPUE9fUDJQKSB7CisJCWlmIChmY19ob3N0X3BvcnRfdHlwZShhZGFwdGVyLT5zY3NpX2hvc3QpID09IEZDX1BPUlRUWVBFX1BUUCkgewogCQkJaWYgKHBvcnQtPnd3cG4gIT0gYWRhcHRlci0+cGVlcl93d3BuKSB7CiAJCQkJWkZDUF9MT0dfTk9STUFMKCJGYWlsZWQgdG8gb3BlbiBwb3J0IDB4JTAxNkx4ICIKIAkJCQkJCSJvbiBhZGFwdGVyICVzLlxuUGVlciBXV1BOICIKQEAgLTM0MDMsNyArMzQwMyw3IEBACiAvKioKICAqIHpmY3BfZXJwX2FjdGlvbl9jbGVhbnVwCiAgKgotICogUmVnaXN0ZXIgdW5pdCB3aXRoIHNjc2kgc3RhY2sgaWYgYXBwcm9waWF0ZSBhbmQgZml4IHJlZmVyZW5jZSBjb3VudHMuCisgKiBSZWdpc3RlciB1bml0IHdpdGggc2NzaSBzdGFjayBpZiBhcHByb3ByaWF0ZSBhbmQgZml4IHJlZmVyZW5jZSBjb3VudHMuCiAgKiBOb3RlOiBUZW1wb3JhcnkgdW5pdHMgYXJlIG5vdCByZWdpc3RlcmVkIHdpdGggc2NzaSBzdGFjay4KICAqLwogc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5jCmluZGV4IDU5NTg3OTUuLmNiZmFiMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuYwpAQCAtOTY0LDYgKzk2NCw0MCBAQAogCQkJCQl8IFpGQ1BfU1RBVFVTX0NPTU1PTl9FUlBfRkFJTEVEKTsKIAkJYnJlYWs7CiAKKwljYXNlIEZTRl9TVEFUVVNfUkVBRF9OT1RJRklDQVRJT05fTE9TVDoKKwkJWkZDUF9MT0dfTk9STUFMKCJVbnNvbGljaXRlZCBzdGF0dXMgbm90aWZpY2F0aW9uKHMpIGxvc3Q6ICIKKwkJCQkiYWRhcHRlciAlcyVzJXMlcyVzJXMlcyVzJXNcbiIsCisJCQkJemZjcF9nZXRfYnVzaWRfYnlfYWRhcHRlcihhZGFwdGVyKSwKKwkJCQkoc3RhdHVzX2J1ZmZlci0+c3RhdHVzX3N1YnR5cGUgJgorCQkJCQlGU0ZfU1RBVFVTX1JFQURfU1VCX0lOQ09NSU5HX0VMUykgPworCQkJCQkiLCBpbmNvbWluZyBFTFMiIDogIiIsCisJCQkJKHN0YXR1c19idWZmZXItPnN0YXR1c19zdWJ0eXBlICYKKwkJCQkJRlNGX1NUQVRVU19SRUFEX1NVQl9TRU5TRV9EQVRBKSA/CisJCQkJCSIsIHNlbnNlIGRhdGEiIDogIiIsCisJCQkJKHN0YXR1c19idWZmZXItPnN0YXR1c19zdWJ0eXBlICYKKwkJCQkJRlNGX1NUQVRVU19SRUFEX1NVQl9MSU5LX1NUQVRVUykgPworCQkJCQkiLCBsaW5rIHN0YXR1cyBjaGFuZ2UiIDogIiIsCisJCQkJKHN0YXR1c19idWZmZXItPnN0YXR1c19zdWJ0eXBlICYKKwkJCQkJRlNGX1NUQVRVU19SRUFEX1NVQl9QT1JUX0NMT1NFRCkgPworCQkJCQkiLCBwb3J0IGNsb3NlIiA6ICIiLAorCQkJCShzdGF0dXNfYnVmZmVyLT5zdGF0dXNfc3VidHlwZSAmCisJCQkJCUZTRl9TVEFUVVNfUkVBRF9TVUJfQklUX0VSUk9SX1RIUkVTSE9MRCkgPworCQkJCQkiLCBiaXQgZXJyb3IgZXhjZXB0aW9uIiA6ICIiLAorCQkJCShzdGF0dXNfYnVmZmVyLT5zdGF0dXNfc3VidHlwZSAmCisJCQkJCUZTRl9TVEFUVVNfUkVBRF9TVUJfQUNUX1VQREFURUQpID8KKwkJCQkJIiwgQUNUIHVwZGF0ZSIgOiAiIiwKKwkJCQkoc3RhdHVzX2J1ZmZlci0+c3RhdHVzX3N1YnR5cGUgJgorCQkJCQlGU0ZfU1RBVFVTX1JFQURfU1VCX0FDVF9IQVJERU5FRCkgPworCQkJCQkiLCBBQ1QgaGFyZGVuaW5nIiA6ICIiLAorCQkJCShzdGF0dXNfYnVmZmVyLT5zdGF0dXNfc3VidHlwZSAmCisJCQkJCUZTRl9TVEFUVVNfUkVBRF9TVUJfRkVBVFVSRV9VUERBVEVfQUxFUlQpID8KKwkJCQkJIiwgYWRhcHRlciBmZWF0dXJlIGNoYW5nZSIgOiAiIik7CisKKwkJaWYgKHN0YXR1c19idWZmZXItPnN0YXR1c19zdWJ0eXBlICYKKwkJICAgIEZTRl9TVEFUVVNfUkVBRF9TVUJfQUNUX1VQREFURUQpCisJCQl6ZmNwX2VycF9hZGFwdGVyX2FjY2Vzc19jaGFuZ2VkKGFkYXB0ZXIpOworCQlicmVhazsKKwogCWNhc2UgRlNGX1NUQVRVU19SRUFEX0NGRENfVVBEQVRFRDoKIAkJWkZDUF9MT0dfTk9STUFMKCJDRkRDIGhhcyBiZWVuIHVwZGF0ZWQgb24gdGhlIGFkYXB0ZXIgJXNcbiIsCiAJCQkgICAgICB6ZmNwX2dldF9idXNpZF9ieV9hZGFwdGVyKGFkYXB0ZXIpKTsKQEAgLTE5NTQsNiArMTk4OCw3IEBACiAJZXJwX2FjdGlvbi0+ZnNmX3JlcS0+cXRjYi0+Ym90dG9tLmNvbmZpZy5mZWF0dXJlX3NlbGVjdGlvbiA9CiAJCQlGU0ZfRkVBVFVSRV9DRkRDIHwKIAkJCUZTRl9GRUFUVVJFX0xVTl9TSEFSSU5HIHwKKwkJCUZTRl9GRUFUVVJFX05PVElGSUNBVElPTl9MT1NUIHwKIAkJCUZTRl9GRUFUVVJFX1VQREFURV9BTEVSVDsKIAogCS8qIHN0YXJ0IFFESU8gcmVxdWVzdCBmb3IgdGhpcyBGU0YgcmVxdWVzdCAqLwpAQCAtMjAwOCwyNyArMjA0MywzMCBAQAogCQlmY19ob3N0X3BvcnRfaWQoc2hvc3QpID0gYm90dG9tLT5zX2lkICYgWkZDUF9ESURfTUFTSzsKIAkJZmNfaG9zdF9zcGVlZChzaG9zdCkgPSBib3R0b20tPmZjX2xpbmtfc3BlZWQ7CiAJCWZjX2hvc3Rfc3VwcG9ydGVkX2NsYXNzZXMoc2hvc3QpID0gRkNfQ09TX0NMQVNTMiB8IEZDX0NPU19DTEFTUzM7Ci0JCWFkYXB0ZXItPmZjX3RvcG9sb2d5ID0gYm90dG9tLT5mY190b3BvbG9neTsKIAkJYWRhcHRlci0+aHlkcmFfdmVyc2lvbiA9IGJvdHRvbS0+YWRhcHRlcl90eXBlOwotCQlpZiAoYWRhcHRlci0+cGh5c2ljYWxfd3dwbiA9PSAwKQotCQkJYWRhcHRlci0+cGh5c2ljYWxfd3dwbiA9IGZjX2hvc3RfcG9ydF9uYW1lKHNob3N0KTsKLQkJaWYgKGFkYXB0ZXItPnBoeXNpY2FsX3NfaWQgPT0gMCkKLQkJCWFkYXB0ZXItPnBoeXNpY2FsX3NfaWQgPSBmY19ob3N0X3BvcnRfaWQoc2hvc3QpOworCQlpZiAoZmNfaG9zdF9wZXJtYW5lbnRfcG9ydF9uYW1lKHNob3N0KSA9PSAtMSkKKwkJCWZjX2hvc3RfcGVybWFuZW50X3BvcnRfbmFtZShzaG9zdCkgPQorCQkJCWZjX2hvc3RfcG9ydF9uYW1lKHNob3N0KTsKKwkJaWYgKGJvdHRvbS0+ZmNfdG9wb2xvZ3kgPT0gRlNGX1RPUE9fUDJQKSB7CisJCQlhZGFwdGVyLT5wZWVyX2RfaWQgPSBib3R0b20tPnBlZXJfZF9pZCAmIFpGQ1BfRElEX01BU0s7CisJCQlhZGFwdGVyLT5wZWVyX3d3cG4gPSBib3R0b20tPnBsb2dpX3BheWxvYWQud3dwbjsKKwkJCWFkYXB0ZXItPnBlZXJfd3dubiA9IGJvdHRvbS0+cGxvZ2lfcGF5bG9hZC53d25uOworCQkJZmNfaG9zdF9wb3J0X3R5cGUoc2hvc3QpID0gRkNfUE9SVFRZUEVfUFRQOworCQl9IGVsc2UgaWYgKGJvdHRvbS0+ZmNfdG9wb2xvZ3kgPT0gRlNGX1RPUE9fRkFCUklDKQorCQkJZmNfaG9zdF9wb3J0X3R5cGUoc2hvc3QpID0gRkNfUE9SVFRZUEVfTlBPUlQ7CisJCWVsc2UgaWYgKGJvdHRvbS0+ZmNfdG9wb2xvZ3kgPT0gRlNGX1RPUE9fQUwpCisJCQlmY19ob3N0X3BvcnRfdHlwZShzaG9zdCkgPSBGQ19QT1JUVFlQRV9OTFBPUlQ7CisJCWVsc2UKKwkJCWZjX2hvc3RfcG9ydF90eXBlKHNob3N0KSA9IEZDX1BPUlRUWVBFX1VOS05PV047CiAJfSBlbHNlIHsKIAkJZmNfaG9zdF9ub2RlX25hbWUoc2hvc3QpID0gMDsKIAkJZmNfaG9zdF9wb3J0X25hbWUoc2hvc3QpID0gMDsKIAkJZmNfaG9zdF9wb3J0X2lkKHNob3N0KSA9IDA7CiAJCWZjX2hvc3Rfc3BlZWQoc2hvc3QpID0gRkNfUE9SVFNQRUVEX1VOS05PV047Ci0JCWFkYXB0ZXItPmZjX3RvcG9sb2d5ID0gMDsKKwkJZmNfaG9zdF9wb3J0X3R5cGUoc2hvc3QpID0gRkNfUE9SVFRZUEVfVU5LTk9XTjsKIAkJYWRhcHRlci0+aHlkcmFfdmVyc2lvbiA9IDA7CiAJfQogCi0JaWYgKGFkYXB0ZXItPmZjX3RvcG9sb2d5ID09IEZTRl9UT1BPX1AyUCkgewotCQlhZGFwdGVyLT5wZWVyX2RfaWQgPSBib3R0b20tPnBlZXJfZF9pZCAmIFpGQ1BfRElEX01BU0s7Ci0JCWFkYXB0ZXItPnBlZXJfd3dwbiA9IGJvdHRvbS0+cGxvZ2lfcGF5bG9hZC53d3BuOwotCQlhZGFwdGVyLT5wZWVyX3d3bm4gPSBib3R0b20tPnBsb2dpX3BheWxvYWQud3dubjsKLQl9Ci0KIAlpZiAoYWRhcHRlci0+YWRhcHRlcl9mZWF0dXJlcyAmIEZTRl9GRUFUVVJFX0hCQUFQSV9NQU5BR0VNRU5UKSB7CiAJCWFkYXB0ZXItPmhhcmR3YXJlX3ZlcnNpb24gPSBib3R0b20tPmhhcmR3YXJlX3ZlcnNpb247CiAJCW1lbWNweShmY19ob3N0X3NlcmlhbF9udW1iZXIoc2hvc3QpLCBib3R0b20tPnNlcmlhbF9udW1iZXIsCkBAIC0yMDk3LDggKzIxMzUsOCBAQAogCQlpZiAoemZjcF9mc2ZfZXhjaGFuZ2VfY29uZmlnX2V2YWx1YXRlKGZzZl9yZXEsIDEpKQogCQkJcmV0dXJuIC1FSU87CiAKLQkJc3dpdGNoIChhZGFwdGVyLT5mY190b3BvbG9neSkgewotCQljYXNlIEZTRl9UT1BPX1AyUDoKKwkJc3dpdGNoIChmY19ob3N0X3BvcnRfdHlwZShhZGFwdGVyLT5zY3NpX2hvc3QpKSB7CisJCWNhc2UgRkNfUE9SVFRZUEVfUFRQOgogCQkJWkZDUF9MT0dfTk9STUFMKCJQb2ludC10by1Qb2ludCBmaWJyZWNoYW5uZWwgIgogCQkJCQkiY29uZmlndXJhdGlvbiBkZXRlY3RlZCBhdCBhZGFwdGVyICVzXG4iCiAJCQkJCSJQZWVyIFdXTk4gMHglMDE2bGx4LCAiCkBAIC0yMTExLDcgKzIxNDksNyBAQAogCQkJZGVidWdfdGV4dF9ldmVudChmc2ZfcmVxLT5hZGFwdGVyLT5lcnBfZGJmLCAwLAogCQkJCQkgInRvcC1wLXRvLXAiKTsKIAkJCWJyZWFrOwotCQljYXNlIEZTRl9UT1BPX0FMOgorCQljYXNlIEZDX1BPUlRUWVBFX05MUE9SVDoKIAkJCVpGQ1BfTE9HX05PUk1BTCgiZXJyb3I6IEFyYml0cmF0ZWQgbG9vcCBmaWJyZWNoYW5uZWwgIgogCQkJCQkidG9wb2xvZ3kgZGV0ZWN0ZWQgYXQgYWRhcHRlciAlcyAiCiAJCQkJCSJ1bnN1cHBvcnRlZCwgc2h1dHRpbmcgZG93biBhZGFwdGVyXG4iLApAQCAtMjEyMCw3ICsyMTU4LDcgQEAKIAkJCQkJICJ0b3AtYWwiKTsKIAkJCXpmY3BfZXJwX2FkYXB0ZXJfc2h1dGRvd24oYWRhcHRlciwgMCk7CiAJCQlyZXR1cm4gLUVJTzsKLQkJY2FzZSBGU0ZfVE9QT19GQUJSSUM6CisJCWNhc2UgRkNfUE9SVFRZUEVfTlBPUlQ6CiAJCQlaRkNQX0xPR19OT1JNQUwoIlN3aXRjaGVkIGZhYnJpYyBmaWJyZWNoYW5uZWwgIgogCQkJCSAgICAgICJuZXR3b3JrIGRldGVjdGVkIGF0IGFkYXB0ZXIgJXMuXG4iLAogCQkJCSAgICAgIHpmY3BfZ2V0X2J1c2lkX2J5X2FkYXB0ZXIoYWRhcHRlcikpOwpAQCAtMjEzMyw3ICsyMTcxLDYgQEAKIAkJCQkJIm9mIGEgdHlwZSBrbm93biB0byB0aGUgemZjcCAiCiAJCQkJCSJkcml2ZXIsIHNodXR0aW5nIGRvd24gYWRhcHRlclxuIiwKIAkJCQkJemZjcF9nZXRfYnVzaWRfYnlfYWRhcHRlcihhZGFwdGVyKSk7Ci0JCQlhZGFwdGVyLT5mY190b3BvbG9neSA9IEZTRl9UT1BPX0VSUk9SOwogCQkJZGVidWdfdGV4dF9leGNlcHRpb24oZnNmX3JlcS0+YWRhcHRlci0+ZXJwX2RiZiwgMCwKIAkJCQkJICAgICAidW5rbm93bi10b3BvIik7CiAJCQl6ZmNwX2VycF9hZGFwdGVyX3NodXRkb3duKGFkYXB0ZXIsIDApOwpAQCAtMjI5MywxNCArMjMzMCwxMyBAQAogCQlkYXRhID0gKHN0cnVjdCBmc2ZfcXRjYl9ib3R0b21fcG9ydCopIGZzZl9yZXEtPmRhdGE7CiAJCWlmIChkYXRhKQogCQkJbWVtY3B5KGRhdGEsIGJvdHRvbSwgc2l6ZW9mKHN0cnVjdCBmc2ZfcXRjYl9ib3R0b21fcG9ydCkpOwotCQlpZiAoYWRhcHRlci0+Y29ubmVjdGlvbl9mZWF0dXJlcyAmIEZTRl9GRUFUVVJFX05QSVZfTU9ERSkgewotCQkJYWRhcHRlci0+cGh5c2ljYWxfd3dwbiA9IGJvdHRvbS0+d3dwbjsKLQkJCWFkYXB0ZXItPnBoeXNpY2FsX3NfaWQgPSBib3R0b20tPmZjX3BvcnRfaWQ7Ci0JCX0gZWxzZSB7Ci0JCQlhZGFwdGVyLT5waHlzaWNhbF93d3BuID0gZmNfaG9zdF9wb3J0X25hbWUoc2hvc3QpOwotCQkJYWRhcHRlci0+cGh5c2ljYWxfc19pZCA9IGZjX2hvc3RfcG9ydF9pZChzaG9zdCk7Ci0JCX0KKwkJaWYgKGFkYXB0ZXItPmNvbm5lY3Rpb25fZmVhdHVyZXMgJiBGU0ZfRkVBVFVSRV9OUElWX01PREUpCisJCQlmY19ob3N0X3Blcm1hbmVudF9wb3J0X25hbWUoc2hvc3QpID0gYm90dG9tLT53d3BuOworCQllbHNlCisJCQlmY19ob3N0X3Blcm1hbmVudF9wb3J0X25hbWUoc2hvc3QpID0KKwkJCQlmY19ob3N0X3BvcnRfbmFtZShzaG9zdCk7CiAJCWZjX2hvc3RfbWF4ZnJhbWVfc2l6ZShzaG9zdCkgPSBib3R0b20tPm1heGltdW1fZnJhbWVfc2l6ZTsKKwkJZmNfaG9zdF9zdXBwb3J0ZWRfc3BlZWRzKHNob3N0KSA9IGJvdHRvbS0+c3VwcG9ydGVkX3NwZWVkOwogCQlicmVhazsKIAogCWNhc2UgRlNGX0VYQ0hBTkdFX0NPTkZJR19EQVRBX0lOQ09NUExFVEU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5oIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuaAppbmRleCA0ODcxOWYwLi5lNzM0NDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5oCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmgKQEAgLTE2Niw2ICsxNjYsNyBAQAogI2RlZmluZSBGU0ZfU1RBVFVTX1JFQURfQklUX0VSUk9SX1RIUkVTSE9MRAkweDAwMDAwMDA0CiAjZGVmaW5lIEZTRl9TVEFUVVNfUkVBRF9MSU5LX0RPV04JCTB4MDAwMDAwMDUKICNkZWZpbmUgRlNGX1NUQVRVU19SRUFEX0xJTktfVVAgICAgICAgICAgCTB4MDAwMDAwMDYKKyNkZWZpbmUgRlNGX1NUQVRVU19SRUFEX05PVElGSUNBVElPTl9MT1NUCTB4MDAwMDAwMDkKICNkZWZpbmUgRlNGX1NUQVRVU19SRUFEX0NGRENfVVBEQVRFRAkJMHgwMDAwMDAwQQogI2RlZmluZSBGU0ZfU1RBVFVTX1JFQURfQ0ZEQ19IQVJERU5FRAkJMHgwMDAwMDAwQgogI2RlZmluZSBGU0ZfU1RBVFVTX1JFQURfRkVBVFVSRV9VUERBVEVfQUxFUlQJMHgwMDAwMDAwQwpAQCAtMTc5LDYgKzE4MCwxNiBAQAogI2RlZmluZSBGU0ZfU1RBVFVTX1JFQURfU1VCX0ZESVNDX0ZBSUxFRAkweDAwMDAwMDAxCiAjZGVmaW5lIEZTRl9TVEFUVVNfUkVBRF9TVUJfRklSTVdBUkVfVVBEQVRFCTB4MDAwMDAwMDIKIAorLyogc3RhdHVzIHN1YnR5cGVzIGZvciB1bnNvbGljaXRlZCBzdGF0dXMgbm90aWZpY2F0aW9uIGxvc3QgKi8KKyNkZWZpbmUgRlNGX1NUQVRVU19SRUFEX1NVQl9JTkNPTUlOR19FTFMJMHgwMDAwMDAwMQorI2RlZmluZSBGU0ZfU1RBVFVTX1JFQURfU1VCX1NFTlNFX0RBVEEJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRlNGX1NUQVRVU19SRUFEX1NVQl9MSU5LX1NUQVRVUwkJMHgwMDAwMDAwNAorI2RlZmluZSBGU0ZfU1RBVFVTX1JFQURfU1VCX1BPUlRfQ0xPU0VECQkweDAwMDAwMDA4CisjZGVmaW5lIEZTRl9TVEFUVVNfUkVBRF9TVUJfQklUX0VSUk9SX1RIUkVTSE9MRAkweDAwMDAwMDEwCisjZGVmaW5lIEZTRl9TVEFUVVNfUkVBRF9TVUJfQUNUX1VQREFURUQJCTB4MDAwMDAwMjAKKyNkZWZpbmUgRlNGX1NUQVRVU19SRUFEX1NVQl9BQ1RfSEFSREVORUQJMHgwMDAwMDA0MAorI2RlZmluZSBGU0ZfU1RBVFVTX1JFQURfU1VCX0ZFQVRVUkVfVVBEQVRFX0FMRVJUIDB4MDAwMDAwODAKKwogLyogc3RhdHVzIHN1YnR5cGVzIGZvciBDRkRDICovCiAjZGVmaW5lIEZTRl9TVEFUVVNfUkVBRF9TVUJfQ0ZEQ19IQVJERU5FRF9PTl9TRQkweDAwMDAwMDAyCiAjZGVmaW5lIEZTRl9TVEFUVVNfUkVBRF9TVUJfQ0ZEQ19IQVJERU5FRF9PTl9TRTIgMHgwMDAwMDAwRgpAQCAtMTg4LDcgKzE5OSw2IEBACiAjZGVmaW5lIEZTRl9UT1BPX1AyUAkJCQkweDAwMDAwMDAxCiAjZGVmaW5lIEZTRl9UT1BPX0ZBQlJJQwkJCQkweDAwMDAwMDAyCiAjZGVmaW5lIEZTRl9UT1BPX0FMCQkJCTB4MDAwMDAwMDMKLSNkZWZpbmUgRlNGX1RPUE9fRkFCUklDX1ZJUlQJCQkweDAwMDAwMDA0CiAKIC8qIGRhdGEgZGlyZWN0aW9uIGZvciBGQ1AgY29tbWFuZHMgKi8KICNkZWZpbmUgRlNGX0RBVEFESVJfV1JJVEUJCQkweDAwMDAwMDAxCkBAIC0yMTEsNiArMjIxLDcgQEAKIC8qIGNoYW5uZWwgZmVhdHVyZXMgKi8KICNkZWZpbmUgRlNGX0ZFQVRVUkVfQ0ZEQwkJCTB4MDAwMDAwMDIKICNkZWZpbmUgRlNGX0ZFQVRVUkVfTFVOX1NIQVJJTkcJCQkweDAwMDAwMDA0CisjZGVmaW5lIEZTRl9GRUFUVVJFX05PVElGSUNBVElPTl9MT1NUCQkweDAwMDAwMDA4CiAjZGVmaW5lIEZTRl9GRUFUVVJFX0hCQUFQSV9NQU5BR0VNRU5UICAgICAgICAgICAweDAwMDAwMDEwCiAjZGVmaW5lIEZTRl9GRUFUVVJFX0VMU19DVF9DSEFJTkVEX1NCQUxTICAgICAgICAweDAwMDAwMDIwCiAjZGVmaW5lIEZTRl9GRUFUVVJFX1VQREFURV9BTEVSVAkJMHgwMDAwMDEwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zY3NpLmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3Njc2kuYwppbmRleCA2NjYwOGQxLi4zYzJjYmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3Njc2kuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3Njc2kuYwpAQCAtNDksOCArNDksNiBAQAogCiBzdGF0aWMgc3RydWN0IHpmY3BfdW5pdCAqemZjcF91bml0X2xvb2t1cChzdHJ1Y3QgemZjcF9hZGFwdGVyICosIGludCwgc2NzaV9pZF90LAogCQkJCQkgIHNjc2lfbHVuX3QpOwotc3RhdGljIHN0cnVjdCB6ZmNwX3BvcnQgKnpmY3BfcG9ydF9sb29rdXAoc3RydWN0IHpmY3BfYWRhcHRlciAqLCBpbnQsCi0JCQkJCSAgc2NzaV9pZF90KTsKIAogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICp6ZmNwX3N5c2ZzX3NkZXZfYXR0cnNbXTsKIApAQCAtNDA2LDE4ICs0MDQsNiBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgemZjcF9wb3J0ICoKLXpmY3BfcG9ydF9sb29rdXAoc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciwgaW50IGNoYW5uZWwsIHNjc2lfaWRfdCBpZCkKLXsKLQlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0OwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCAmYWRhcHRlci0+cG9ydF9saXN0X2hlYWQsIGxpc3QpIHsKLQkJaWYgKHBvcnQtPnJwb3J0ICYmIChpZCA9PSBwb3J0LT5ycG9ydC0+c2NzaV90YXJnZXRfaWQpKQotCQkJcmV0dXJuIHBvcnQ7Ci0JfQotCXJldHVybiAoc3RydWN0IHpmY3BfcG9ydCAqKSBOVUxMOwotfQotCiAvKioKICAqIHpmY3Bfc2NzaV9laF9hYm9ydF9oYW5kbGVyIC0gYWJvcnQgdGhlIHNwZWNpZmllZCBTQ1NJIGNvbW1hbmQKICAqIEBzY3BudDogcG9pbnRlciB0byBzY3NpX2NtbmQgdG8gYmUgYWJvcnRlZCAKQEAgLTczMSw3MCArNzE3LDE2NCBAQAogLyoKICAqIFN1cHBvcnQgZnVuY3Rpb25zIGZvciBGQyB0cmFuc3BvcnQgY2xhc3MKICAqLwotc3RhdGljIHZvaWQKLXpmY3BfZ2V0X3BvcnRfaWQoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0KQorc3RhdGljIHN0cnVjdCBmY19ob3N0X3N0YXRpc3RpY3MqCit6ZmNwX2luaXRfZmNfaG9zdF9zdGF0cyhzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyKQogewotCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOwotCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IHpmY3BfYWRhcHRlciAqKXNob3N0LT5ob3N0ZGF0YVswXTsKLQlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyAqZmNfc3RhdHM7CiAKLQlyZWFkX2xvY2tfaXJxc2F2ZSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrLCBmbGFncyk7Ci0JcG9ydCA9IHpmY3BfcG9ydF9sb29rdXAoYWRhcHRlciwgc3RhcmdldC0+Y2hhbm5lbCwgc3RhcmdldC0+aWQpOwotCWlmIChwb3J0KQotCQlmY19zdGFyZ2V0X3BvcnRfaWQoc3RhcmdldCkgPSBwb3J0LT5kX2lkOwotCWVsc2UKLQkJZmNfc3RhcmdldF9wb3J0X2lkKHN0YXJnZXQpID0gLTE7Ci0JcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrLCBmbGFncyk7CisJaWYgKCFhZGFwdGVyLT5mY19zdGF0cykgeworCQlmY19zdGF0cyA9IGttYWxsb2Moc2l6ZW9mKCpmY19zdGF0cyksIEdGUF9LRVJORUwpOworCQlpZiAoIWZjX3N0YXRzKQorCQkJcmV0dXJuIE5VTEw7CisJCWFkYXB0ZXItPmZjX3N0YXRzID0gZmNfc3RhdHM7IC8qIGZyZWVkIGluIGFkYXRlcl9kZXF1ZXVlICovCisJfQorCW1lbXNldChhZGFwdGVyLT5mY19zdGF0cywgMCwgc2l6ZW9mKCphZGFwdGVyLT5mY19zdGF0cykpOworCXJldHVybiBhZGFwdGVyLT5mY19zdGF0czsKIH0KIAogc3RhdGljIHZvaWQKLXpmY3BfZ2V0X3BvcnRfbmFtZShzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQpCit6ZmNwX2FkanVzdF9mY19ob3N0X3N0YXRzKHN0cnVjdCBmY19ob3N0X3N0YXRpc3RpY3MgKmZjX3N0YXRzLAorCQkJICBzdHJ1Y3QgZnNmX3F0Y2JfYm90dG9tX3BvcnQgKmRhdGEsCisJCQkgIHN0cnVjdCBmc2ZfcXRjYl9ib3R0b21fcG9ydCAqb2xkKQogewotCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOwotCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IHpmY3BfYWRhcHRlciAqKXNob3N0LT5ob3N0ZGF0YVswXTsKLQlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlyZWFkX2xvY2tfaXJxc2F2ZSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrLCBmbGFncyk7Ci0JcG9ydCA9IHpmY3BfcG9ydF9sb29rdXAoYWRhcHRlciwgc3RhcmdldC0+Y2hhbm5lbCwgc3RhcmdldC0+aWQpOwotCWlmIChwb3J0KQotCQlmY19zdGFyZ2V0X3BvcnRfbmFtZShzdGFyZ2V0KSA9IHBvcnQtPnd3cG47Ci0JZWxzZQotCQlmY19zdGFyZ2V0X3BvcnRfbmFtZShzdGFyZ2V0KSA9IC0xOwotCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnpmY3BfZGF0YS5jb25maWdfbG9jaywgZmxhZ3MpOworCWZjX3N0YXRzLT5zZWNvbmRzX3NpbmNlX2xhc3RfcmVzZXQgPSBkYXRhLT5zZWNvbmRzX3NpbmNlX2xhc3RfcmVzZXQgLQorCQlvbGQtPnNlY29uZHNfc2luY2VfbGFzdF9yZXNldDsKKwlmY19zdGF0cy0+dHhfZnJhbWVzID0gZGF0YS0+dHhfZnJhbWVzIC0gb2xkLT50eF9mcmFtZXM7CisJZmNfc3RhdHMtPnR4X3dvcmRzID0gZGF0YS0+dHhfd29yZHMgLSBvbGQtPnR4X3dvcmRzOworCWZjX3N0YXRzLT5yeF9mcmFtZXMgPSBkYXRhLT5yeF9mcmFtZXMgLSBvbGQtPnJ4X2ZyYW1lczsKKwlmY19zdGF0cy0+cnhfd29yZHMgPSBkYXRhLT5yeF93b3JkcyAtIG9sZC0+cnhfd29yZHM7CisJZmNfc3RhdHMtPmxpcF9jb3VudCA9IGRhdGEtPmxpcCAtIG9sZC0+bGlwOworCWZjX3N0YXRzLT5ub3NfY291bnQgPSBkYXRhLT5ub3MgLSBvbGQtPm5vczsKKwlmY19zdGF0cy0+ZXJyb3JfZnJhbWVzID0gZGF0YS0+ZXJyb3JfZnJhbWVzIC0gb2xkLT5lcnJvcl9mcmFtZXM7CisJZmNfc3RhdHMtPmR1bXBlZF9mcmFtZXMgPSBkYXRhLT5kdW1wZWRfZnJhbWVzIC0gb2xkLT5kdW1wZWRfZnJhbWVzOworCWZjX3N0YXRzLT5saW5rX2ZhaWx1cmVfY291bnQgPSBkYXRhLT5saW5rX2ZhaWx1cmUgLSBvbGQtPmxpbmtfZmFpbHVyZTsKKwlmY19zdGF0cy0+bG9zc19vZl9zeW5jX2NvdW50ID0gZGF0YS0+bG9zc19vZl9zeW5jIC0gb2xkLT5sb3NzX29mX3N5bmM7CisJZmNfc3RhdHMtPmxvc3Nfb2Zfc2lnbmFsX2NvdW50ID0gZGF0YS0+bG9zc19vZl9zaWduYWwgLQorCQlvbGQtPmxvc3Nfb2Zfc2lnbmFsOworCWZjX3N0YXRzLT5wcmltX3NlcV9wcm90b2NvbF9lcnJfY291bnQgPSBkYXRhLT5wc3BfZXJyb3JfY291bnRzIC0KKwkJb2xkLT5wc3BfZXJyb3JfY291bnRzOworCWZjX3N0YXRzLT5pbnZhbGlkX3R4X3dvcmRfY291bnQgPSBkYXRhLT5pbnZhbGlkX3R4X3dvcmRzIC0KKwkJb2xkLT5pbnZhbGlkX3R4X3dvcmRzOworCWZjX3N0YXRzLT5pbnZhbGlkX2NyY19jb3VudCA9IGRhdGEtPmludmFsaWRfY3JjcyAtIG9sZC0+aW52YWxpZF9jcmNzOworCWZjX3N0YXRzLT5mY3BfaW5wdXRfcmVxdWVzdHMgPSBkYXRhLT5pbnB1dF9yZXF1ZXN0cyAtCisJCW9sZC0+aW5wdXRfcmVxdWVzdHM7CisJZmNfc3RhdHMtPmZjcF9vdXRwdXRfcmVxdWVzdHMgPSBkYXRhLT5vdXRwdXRfcmVxdWVzdHMgLQorCQlvbGQtPm91dHB1dF9yZXF1ZXN0czsKKwlmY19zdGF0cy0+ZmNwX2NvbnRyb2xfcmVxdWVzdHMgPSBkYXRhLT5jb250cm9sX3JlcXVlc3RzIC0KKwkJb2xkLT5jb250cm9sX3JlcXVlc3RzOworCWZjX3N0YXRzLT5mY3BfaW5wdXRfbWVnYWJ5dGVzID0gZGF0YS0+aW5wdXRfbWIgLSBvbGQtPmlucHV0X21iOworCWZjX3N0YXRzLT5mY3Bfb3V0cHV0X21lZ2FieXRlcyA9IGRhdGEtPm91dHB1dF9tYiAtIG9sZC0+b3V0cHV0X21iOwogfQogCiBzdGF0aWMgdm9pZAotemZjcF9nZXRfbm9kZV9uYW1lKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKK3pmY3Bfc2V0X2ZjX2hvc3Rfc3RhdHMoc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyAqZmNfc3RhdHMsCisJCSAgICAgICBzdHJ1Y3QgZnNmX3F0Y2JfYm90dG9tX3BvcnQgKmRhdGEpCiB7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7Ci0Jc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgemZjcF9hZGFwdGVyICopc2hvc3QtPmhvc3RkYXRhWzBdOwotCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlmY19zdGF0cy0+c2Vjb25kc19zaW5jZV9sYXN0X3Jlc2V0ID0gZGF0YS0+c2Vjb25kc19zaW5jZV9sYXN0X3Jlc2V0OworCWZjX3N0YXRzLT50eF9mcmFtZXMgPSBkYXRhLT50eF9mcmFtZXM7CisJZmNfc3RhdHMtPnR4X3dvcmRzID0gZGF0YS0+dHhfd29yZHM7CisJZmNfc3RhdHMtPnJ4X2ZyYW1lcyA9IGRhdGEtPnJ4X2ZyYW1lczsKKwlmY19zdGF0cy0+cnhfd29yZHMgPSBkYXRhLT5yeF93b3JkczsKKwlmY19zdGF0cy0+bGlwX2NvdW50ID0gZGF0YS0+bGlwOworCWZjX3N0YXRzLT5ub3NfY291bnQgPSBkYXRhLT5ub3M7CisJZmNfc3RhdHMtPmVycm9yX2ZyYW1lcyA9IGRhdGEtPmVycm9yX2ZyYW1lczsKKwlmY19zdGF0cy0+ZHVtcGVkX2ZyYW1lcyA9IGRhdGEtPmR1bXBlZF9mcmFtZXM7CisJZmNfc3RhdHMtPmxpbmtfZmFpbHVyZV9jb3VudCA9IGRhdGEtPmxpbmtfZmFpbHVyZTsKKwlmY19zdGF0cy0+bG9zc19vZl9zeW5jX2NvdW50ID0gZGF0YS0+bG9zc19vZl9zeW5jOworCWZjX3N0YXRzLT5sb3NzX29mX3NpZ25hbF9jb3VudCA9IGRhdGEtPmxvc3Nfb2Zfc2lnbmFsOworCWZjX3N0YXRzLT5wcmltX3NlcV9wcm90b2NvbF9lcnJfY291bnQgPSBkYXRhLT5wc3BfZXJyb3JfY291bnRzOworCWZjX3N0YXRzLT5pbnZhbGlkX3R4X3dvcmRfY291bnQgPSBkYXRhLT5pbnZhbGlkX3R4X3dvcmRzOworCWZjX3N0YXRzLT5pbnZhbGlkX2NyY19jb3VudCA9IGRhdGEtPmludmFsaWRfY3JjczsKKwlmY19zdGF0cy0+ZmNwX2lucHV0X3JlcXVlc3RzID0gZGF0YS0+aW5wdXRfcmVxdWVzdHM7CisJZmNfc3RhdHMtPmZjcF9vdXRwdXRfcmVxdWVzdHMgPSBkYXRhLT5vdXRwdXRfcmVxdWVzdHM7CisJZmNfc3RhdHMtPmZjcF9jb250cm9sX3JlcXVlc3RzID0gZGF0YS0+Y29udHJvbF9yZXF1ZXN0czsKKwlmY19zdGF0cy0+ZmNwX2lucHV0X21lZ2FieXRlcyA9IGRhdGEtPmlucHV0X21iOworCWZjX3N0YXRzLT5mY3Bfb3V0cHV0X21lZ2FieXRlcyA9IGRhdGEtPm91dHB1dF9tYjsKK30KIAotCXJlYWRfbG9ja19pcnFzYXZlKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2ssIGZsYWdzKTsKLQlwb3J0ID0gemZjcF9wb3J0X2xvb2t1cChhZGFwdGVyLCBzdGFyZ2V0LT5jaGFubmVsLCBzdGFyZ2V0LT5pZCk7Ci0JaWYgKHBvcnQpCi0JCWZjX3N0YXJnZXRfbm9kZV9uYW1lKHN0YXJnZXQpID0gcG9ydC0+d3dubjsKLQllbHNlCi0JCWZjX3N0YXJnZXRfbm9kZV9uYW1lKHN0YXJnZXQpID0gLTE7Ci0JcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrLCBmbGFncyk7CisvKioKKyAqIHpmY3BfZ2V0X2ZjX2hvc3Rfc3RhdHMgLSBwcm92aWRlIGZjX2hvc3Rfc3RhdGlzdGljcyBmb3Igc2NzaV90cmFuc3BvcnRfZmMKKyAqCisgKiBhc3N1bXB0aW9uOiBzY3NpX3RyYW5zcG9ydF9mYyBzeW5jaHJvbml6ZXMgY2FsbHMgb2YKKyAqICAgICAgICAgICAgIGdldF9mY19ob3N0X3N0YXRzIGFuZCByZXNldF9mY19ob3N0X3N0YXRzCisgKiAgICAgICAgICAgICAoWFhYIHRvIGJlIGNoZWNrZWQgb3RoZXJ3aXNlIGludHJvZHVjZSBsb2NraW5nKQorICovCitzdGF0aWMgc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyAqCit6ZmNwX2dldF9mY19ob3N0X3N0YXRzKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXI7CisJc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyAqZmNfc3RhdHM7CisJc3RydWN0IGZzZl9xdGNiX2JvdHRvbV9wb3J0ICpkYXRhOworCWludCByZXQ7CisKKwlhZGFwdGVyID0gKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKilzaG9zdC0+aG9zdGRhdGFbMF07CisJZmNfc3RhdHMgPSB6ZmNwX2luaXRfZmNfaG9zdF9zdGF0cyhhZGFwdGVyKTsKKwlpZiAoIWZjX3N0YXRzKQorCQlyZXR1cm4gTlVMTDsKKworCWRhdGEgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZigqZGF0YSkpOworCisJcmV0ID0gemZjcF9mc2ZfZXhjaGFuZ2VfcG9ydF9kYXRhKE5VTEwsIGFkYXB0ZXIsIGRhdGEpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUoZGF0YSk7CisJCXJldHVybiBOVUxMOyAvKiBYWFggcmV0dXJuIHplcm9lZCBmY19zdGF0cz8gKi8KKwl9CisKKwlpZiAoYWRhcHRlci0+c3RhdHNfcmVzZXQgJiYKKwkgICAgKChqaWZmaWVzL0haIC0gYWRhcHRlci0+c3RhdHNfcmVzZXQpIDwKKwkgICAgIGRhdGEtPnNlY29uZHNfc2luY2VfbGFzdF9yZXNldCkpIHsKKwkJemZjcF9hZGp1c3RfZmNfaG9zdF9zdGF0cyhmY19zdGF0cywgZGF0YSwKKwkJCQkJICBhZGFwdGVyLT5zdGF0c19yZXNldF9kYXRhKTsKKwl9IGVsc2UKKwkJemZjcF9zZXRfZmNfaG9zdF9zdGF0cyhmY19zdGF0cywgZGF0YSk7CisKKwlrZnJlZShkYXRhKTsKKwlyZXR1cm4gZmNfc3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkCit6ZmNwX3Jlc2V0X2ZjX2hvc3Rfc3RhdHMoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3QgZnNmX3F0Y2JfYm90dG9tX3BvcnQgKmRhdGEsICpvbGRfZGF0YTsKKwlpbnQgcmV0OworCisJYWRhcHRlciA9IChzdHJ1Y3QgemZjcF9hZGFwdGVyICopc2hvc3QtPmhvc3RkYXRhWzBdOworCWRhdGEgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKKwkJcmV0dXJuOworCW1lbXNldChkYXRhLCAwLCBzaXplb2YoKmRhdGEpKTsKKworCXJldCA9IHpmY3BfZnNmX2V4Y2hhbmdlX3BvcnRfZGF0YShOVUxMLCBhZGFwdGVyLCBkYXRhKTsKKwlpZiAocmV0ID09IDApIHsKKwkJYWRhcHRlci0+c3RhdHNfcmVzZXQgPSBqaWZmaWVzL0haOworCQlvbGRfZGF0YSA9IGFkYXB0ZXItPnN0YXRzX3Jlc2V0X2RhdGE7CisJCWFkYXB0ZXItPnN0YXRzX3Jlc2V0X2RhdGEgPSBkYXRhOyAvKiBmaW5hbGx5IGZyZWVkIGluCisJCQkJCQkgICAgIGFkYXRlcl9kZXF1ZXVlICovCisJCWtmcmVlKG9sZF9kYXRhKTsKKwl9CiB9CiAKIHN0cnVjdCBmY19mdW5jdGlvbl90ZW1wbGF0ZSB6ZmNwX3RyYW5zcG9ydF9mdW5jdGlvbnMgPSB7Ci0JLmdldF9zdGFyZ2V0X3BvcnRfaWQgPSB6ZmNwX2dldF9wb3J0X2lkLAotCS5nZXRfc3RhcmdldF9wb3J0X25hbWUgPSB6ZmNwX2dldF9wb3J0X25hbWUsCi0JLmdldF9zdGFyZ2V0X25vZGVfbmFtZSA9IHpmY3BfZ2V0X25vZGVfbmFtZSwKIAkuc2hvd19zdGFyZ2V0X3BvcnRfaWQgPSAxLAogCS5zaG93X3N0YXJnZXRfcG9ydF9uYW1lID0gMSwKIAkuc2hvd19zdGFyZ2V0X25vZGVfbmFtZSA9IDEsCiAJLnNob3dfcnBvcnRfc3VwcG9ydGVkX2NsYXNzZXMgPSAxLAogCS5zaG93X2hvc3Rfbm9kZV9uYW1lID0gMSwKIAkuc2hvd19ob3N0X3BvcnRfbmFtZSA9IDEsCisJLnNob3dfaG9zdF9wZXJtYW5lbnRfcG9ydF9uYW1lID0gMSwKIAkuc2hvd19ob3N0X3N1cHBvcnRlZF9jbGFzc2VzID0gMSwKKwkuc2hvd19ob3N0X3N1cHBvcnRlZF9zcGVlZHMgPSAxLAogCS5zaG93X2hvc3RfbWF4ZnJhbWVfc2l6ZSA9IDEsCiAJLnNob3dfaG9zdF9zZXJpYWxfbnVtYmVyID0gMSwKKwkuZ2V0X2ZjX2hvc3Rfc3RhdHMgPSB6ZmNwX2dldF9mY19ob3N0X3N0YXRzLAorCS5yZXNldF9mY19ob3N0X3N0YXRzID0gemZjcF9yZXNldF9mY19ob3N0X3N0YXRzLAorCS8qIG5vIGZ1bmN0aW9ucyByZWdpc3RlcmVkIGZvciBmb2xsb3dpbmcgZHluYW1pYyBhdHRyaWJ1dGVzIGJ1dAorCSAgIGRpcmVjdGx5IHNldCBieSBMTEREICovCisJLnNob3dfaG9zdF9wb3J0X3R5cGUgPSAxLAogCS5zaG93X2hvc3Rfc3BlZWQgPSAxLAogCS5zaG93X2hvc3RfcG9ydF9pZCA9IDEsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zeXNmc19hZGFwdGVyLmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3N5c2ZzX2FkYXB0ZXIuYwppbmRleCAwY2Q0MzUyLi45ZjI2MjI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3N5c2ZzX2FkYXB0ZXIuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3N5c2ZzX2FkYXB0ZXIuYwpAQCAtMzMsMTQgKzMzLDYgQEAKIAogI2RlZmluZSBaRkNQX0xPR19BUkVBICAgICAgICAgICAgICAgICAgIFpGQ1BfTE9HX0FSRUFfQ09ORklHCiAKLXN0YXRpYyBjb25zdCBjaGFyIGZjX3RvcG9sb2dpZXNbNV1bMjVdID0gewotCSI8ZXJyb3I+IiwKLQkicG9pbnQtdG8tcG9pbnQiLAotCSJmYWJyaWMiLAotCSJhcmJpdHJhdGVkIGxvb3AiLAotCSJmYWJyaWMgKHZpcnQuIGFkYXB0ZXIpIgotfTsKLQogLyoqCiAgKiBaRkNQX0RFRklORV9BREFQVEVSX0FUVFIKICAqIEBfbmFtZTogICBuYW1lIG9mIHNob3cgYXR0cmlidXRlCkBAIC02OSwxMiArNjEsOCBAQAogWkZDUF9ERUZJTkVfQURBUFRFUl9BVFRSKHBoeXNpY2FsX3NfaWQsICIweCUwNnhcbiIsIGFkYXB0ZXItPnBoeXNpY2FsX3NfaWQpOwogWkZDUF9ERUZJTkVfQURBUFRFUl9BVFRSKGNhcmRfdmVyc2lvbiwgIjB4JTA0eFxuIiwgYWRhcHRlci0+aHlkcmFfdmVyc2lvbik7CiBaRkNQX0RFRklORV9BREFQVEVSX0FUVFIobGljX3ZlcnNpb24sICIweCUwOHhcbiIsIGFkYXB0ZXItPmZzZl9saWNfdmVyc2lvbik7Ci1aRkNQX0RFRklORV9BREFQVEVSX0FUVFIoZmNfc2VydmljZV9jbGFzcywgIiVkXG4iLCBhZGFwdGVyLT5mY19zZXJ2aWNlX2NsYXNzKTsKLVpGQ1BfREVGSU5FX0FEQVBURVJfQVRUUihmY190b3BvbG9neSwgIiVzXG4iLAotCQkJIGZjX3RvcG9sb2dpZXNbYWRhcHRlci0+ZmNfdG9wb2xvZ3ldKTsKIFpGQ1BfREVGSU5FX0FEQVBURVJfQVRUUihoYXJkd2FyZV92ZXJzaW9uLCAiMHglMDh4XG4iLAogCQkJIGFkYXB0ZXItPmhhcmR3YXJlX3ZlcnNpb24pOwotWkZDUF9ERUZJTkVfQURBUFRFUl9BVFRSKHNjc2lfaG9zdF9ubywgIjB4JXhcbiIsIGFkYXB0ZXItPnNjc2lfaG9zdF9ubyk7CiBaRkNQX0RFRklORV9BREFQVEVSX0FUVFIoaW5fcmVjb3ZlcnksICIlZFxuIiwgYXRvbWljX3Rlc3RfbWFzawogCQkJIChaRkNQX1NUQVRVU19DT01NT05fRVJQX0lOVVNFLCAmYWRhcHRlci0+c3RhdHVzKSk7CiAKQEAgLTI1OSw5ICsyNDcsNiBAQAogCSZkZXZfYXR0cl9waHlzaWNhbF9zX2lkLmF0dHIsCiAJJmRldl9hdHRyX2NhcmRfdmVyc2lvbi5hdHRyLAogCSZkZXZfYXR0cl9saWNfdmVyc2lvbi5hdHRyLAotCSZkZXZfYXR0cl9mY19zZXJ2aWNlX2NsYXNzLmF0dHIsCi0JJmRldl9hdHRyX2ZjX3RvcG9sb2d5LmF0dHIsCi0JJmRldl9hdHRyX3Njc2lfaG9zdF9uby5hdHRyLAogCSZkZXZfYXR0cl9zdGF0dXMuYXR0ciwKIAkmZGV2X2F0dHJfaGFyZHdhcmVfdmVyc2lvbi5hdHRyLAogCU5VTEwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc3lzZnNfcG9ydC5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zeXNmc19wb3J0LmMKaW5kZXggYzU1ZTgyZC4uMzkyNGViMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zeXNmc19wb3J0LmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zeXNmc19wb3J0LmMKQEAgLTY1LDggKzY1LDYgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihfbmFtZSwgU19JUlVHTywgemZjcF9zeXNmc19wb3J0XyMjX25hbWUjI19zaG93LCBOVUxMKTsKIAogWkZDUF9ERUZJTkVfUE9SVF9BVFRSKHN0YXR1cywgIjB4JTA4eFxuIiwgYXRvbWljX3JlYWQoJnBvcnQtPnN0YXR1cykpOwotWkZDUF9ERUZJTkVfUE9SVF9BVFRSKHd3bm4sICIweCUwMTZsbHhcbiIsIHBvcnQtPnd3bm4pOwotWkZDUF9ERUZJTkVfUE9SVF9BVFRSKGRfaWQsICIweCUwNnhcbiIsIHBvcnQtPmRfaWQpOwogWkZDUF9ERUZJTkVfUE9SVF9BVFRSKGluX3JlY292ZXJ5LCAiJWRcbiIsIGF0b21pY190ZXN0X21hc2sKIAkJICAgICAgKFpGQ1BfU1RBVFVTX0NPTU1PTl9FUlBfSU5VU0UsICZwb3J0LT5zdGF0dXMpKTsKIFpGQ1BfREVGSU5FX1BPUlRfQVRUUihhY2Nlc3NfZGVuaWVkLCAiJWRcbiIsIGF0b21pY190ZXN0X21hc2sKQEAgLTI0NSw4ICsyNDMsNiBAQAogCSZkZXZfYXR0cl9mYWlsZWQuYXR0ciwKIAkmZGV2X2F0dHJfaW5fcmVjb3ZlcnkuYXR0ciwKIAkmZGV2X2F0dHJfc3RhdHVzLmF0dHIsCi0JJmRldl9hdHRyX3d3bm4uYXR0ciwKLQkmZGV2X2F0dHJfZF9pZC5hdHRyLAogCSZkZXZfYXR0cl9hY2Nlc3NfZGVuaWVkLmF0dHIsCiAJTlVMTAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc3lzZnNfdW5pdC5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zeXNmc191bml0LmMKaW5kZXggMDU1NjY0Mi4uMmY1MDgxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zeXNmc191bml0LmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zeXNmc191bml0LmMKQEAgLTY1LDcgKzY1LDYgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihfbmFtZSwgU19JUlVHTywgemZjcF9zeXNmc191bml0XyMjX25hbWUjI19zaG93LCBOVUxMKTsKIAogWkZDUF9ERUZJTkVfVU5JVF9BVFRSKHN0YXR1cywgIjB4JTA4eFxuIiwgYXRvbWljX3JlYWQoJnVuaXQtPnN0YXR1cykpOwotWkZDUF9ERUZJTkVfVU5JVF9BVFRSKHNjc2lfbHVuLCAiMHgleFxuIiwgdW5pdC0+c2NzaV9sdW4pOwogWkZDUF9ERUZJTkVfVU5JVF9BVFRSKGluX3JlY292ZXJ5LCAiJWRcbiIsIGF0b21pY190ZXN0X21hc2sKIAkJICAgICAgKFpGQ1BfU1RBVFVTX0NPTU1PTl9FUlBfSU5VU0UsICZ1bml0LT5zdGF0dXMpKTsKIFpGQ1BfREVGSU5FX1VOSVRfQVRUUihhY2Nlc3NfZGVuaWVkLCAiJWRcbiIsIGF0b21pY190ZXN0X21hc2sKQEAgLTEzOCw3ICsxMzcsNiBAQAogCQkgICB6ZmNwX3N5c2ZzX3VuaXRfZmFpbGVkX3N0b3JlKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnpmY3BfdW5pdF9hdHRyc1tdID0gewotCSZkZXZfYXR0cl9zY3NpX2x1bi5hdHRyLAogCSZkZXZfYXR0cl9mYWlsZWQuYXR0ciwKIAkmZGV2X2F0dHJfaW5fcmVjb3ZlcnkuYXR0ciwKIAkmZGV2X2F0dHJfc3RhdHVzLmF0dHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9hdXJvcmEuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2F1cm9yYS5jCmluZGV4IDkyZTZjNTYzOS4uMDE1ZGI0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvYXVyb3JhLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvYXVyb3JhLmMKQEAgLTkyLDcgKzkyLDYgQEAKIAogLyogbm8gbG9uZ2VyIHVzZWQuIHN0YXRpYyBzdHJ1Y3QgQXVyb3JhX2JvYXJkICogSVJRX3RvX2JvYXJkWzE2XSA9IHsgTlVMTCwgfSA7Ki8KIHN0YXRpYyB1bnNpZ25lZCBjaGFyICogdG1wX2J1ZiA9IE5VTEw7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWCh0bXBfYnVmX3NlbSk7CiAKIERFQ0xBUkVfVEFTS19RVUVVRSh0cV9hdXJvcmEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvM3ctOXh4eC5jIGIvZHJpdmVycy9zY3NpLzN3LTl4eHguYwppbmRleCAzZmY3NGY0Li4zMWM0OTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvM3ctOXh4eC5jCisrKyBiL2RyaXZlcnMvc2NzaS8zdy05eHh4LmMKQEAgLTczLDYgKzczLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNjE1LDcgKzYxNiw3IEBACiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAKIAkvKiBPbmx5IGxldCBvbmUgb2YgdGhlc2UgdGhyb3VnaCBhdCBhIHRpbWUgKi8KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ0d19kZXYtPmlvY3RsX3NlbSkpIHsKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ0d19kZXYtPmlvY3RsX2xvY2spKSB7CiAJCXJldHZhbCA9IFRXX0lPQ1RMX0VSUk9SX09TX0VJTlRSOwogCQlnb3RvIG91dDsKIAl9CkBAIC04NTIsNyArODUzLDcgQEAKIAkvKiBOb3cgZnJlZSBpb2N0bCBidWYgbWVtb3J5ICovCiAJZG1hX2ZyZWVfY29oZXJlbnQoJnR3X2Rldi0+dHdfcGNpX2Rldi0+ZGV2LCBkYXRhX2J1ZmZlcl9sZW5ndGhfYWRqdXN0ZWQrc2l6ZW9mKFRXX0lvY3RsX0J1Zl9BcGFjaGUpIC0gMSwgY3B1X2FkZHIsIGRtYV9oYW5kbGUpOwogb3V0MjoKLQl1cCgmdHdfZGV2LT5pb2N0bF9zZW0pOworCW11dGV4X3VubG9jaygmdHdfZGV2LT5pb2N0bF9sb2NrKTsKIG91dDoKIAlyZXR1cm4gcmV0dmFsOwogfSAvKiBFbmQgdHdhX2NocmRldl9pb2N0bCgpICovCkBAIC0xMTgyLDcgKzExODMsNyBAQAogCXR3X2Rldi0+ZXJyb3Jfc2VxdWVuY2VfaWQgPSAxOwogCXR3X2Rldi0+Y2hyZGV2X3JlcXVlc3RfaWQgPSBUV19JT0NUTF9DSFJERVZfRlJFRTsKIAotCWluaXRfTVVURVgoJnR3X2Rldi0+aW9jdGxfc2VtKTsKKwltdXRleF9pbml0KCZ0d19kZXYtPmlvY3RsX2xvY2spOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnR3X2Rldi0+aW9jdGxfd3F1ZXVlKTsKIAogCXJldHZhbCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvM3ctOXh4eC5oIGIvZHJpdmVycy9zY3NpLzN3LTl4eHguaAppbmRleCA0NmYyMmNkLi4xYjE2ZDU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvM3ctOXh4eC5oCisrKyBiL2RyaXZlcnMvc2NzaS8zdy05eHh4LmgKQEAgLTY3Miw3ICs2NzIsNyBAQAogCXUzMiAgICAgICAgICAgICAgICAgICAgIGlvY3RsX21zZWM7CiAJaW50CQkJY2hyZGV2X3JlcXVlc3RfaWQ7CiAJd2FpdF9xdWV1ZV9oZWFkX3QJaW9jdGxfd3F1ZXVlOwotCXN0cnVjdCBzZW1hcGhvcmUJaW9jdGxfc2VtOworCXN0cnVjdCBtdXRleAkJaW9jdGxfbG9jazsKIAljaGFyCQkJYWVuX2Nsb2JiZXI7CiAJdW5zaWduZWQgc2hvcnQJCXdvcmtpbmdfc3JsOwogCXVuc2lnbmVkIHNob3J0CQl3b3JraW5nX2JyYW5jaDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS8zdy14eHh4LmMgYi9kcml2ZXJzL3Njc2kvM3cteHh4eC5jCmluZGV4IDI4M2Y2ZDIuLjI1ZjY3OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS8zdy14eHh4LmMKKysrIGIvZHJpdmVycy9zY3NpLzN3LXh4eHguYwpAQCAtMjAzLDYgKzIwMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTg4OCw3ICs4ODksNyBAQAogCWRwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19jaHJkZXZfaW9jdGwoKVxuIik7CiAKIAkvKiBPbmx5IGxldCBvbmUgb2YgdGhlc2UgdGhyb3VnaCBhdCBhIHRpbWUgKi8KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ0d19kZXYtPmlvY3RsX3NlbSkpCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdHdfZGV2LT5pb2N0bF9sb2NrKSkKIAkJcmV0dXJuIC1FSU5UUjsKIAogCS8qIEZpcnN0IGNvcHkgZG93biB0aGUgYnVmZmVyIGxlbmd0aCAqLwpAQCAtMTAyOSw3ICsxMDMwLDcgQEAKIAkvKiBOb3cgZnJlZSBpb2N0bCBidWYgbWVtb3J5ICovCiAJZG1hX2ZyZWVfY29oZXJlbnQoJnR3X2Rldi0+dHdfcGNpX2Rldi0+ZGV2LCBkYXRhX2J1ZmZlcl9sZW5ndGhfYWRqdXN0ZWQrc2l6ZW9mKFRXX05ld19Jb2N0bCkgLSAxLCBjcHVfYWRkciwgZG1hX2hhbmRsZSk7CiBvdXQ6Ci0JdXAoJnR3X2Rldi0+aW9jdGxfc2VtKTsKKwltdXRleF91bmxvY2soJnR3X2Rldi0+aW9jdGxfbG9jayk7CiAJcmV0dXJuIHJldHZhbDsKIH0gLyogRW5kIHR3X2NocmRldl9pb2N0bCgpICovCiAKQEAgLTEyNzAsNyArMTI3MSw3IEBACiAJdHdfZGV2LT5wZW5kaW5nX3RhaWwgPSBUV19RX1NUQVJUOwogCXR3X2Rldi0+Y2hyZGV2X3JlcXVlc3RfaWQgPSBUV19JT0NUTF9DSFJERVZfRlJFRTsKIAotCWluaXRfTVVURVgoJnR3X2Rldi0+aW9jdGxfc2VtKTsKKwltdXRleF9pbml0KCZ0d19kZXYtPmlvY3RsX2xvY2spOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnR3X2Rldi0+aW9jdGxfd3F1ZXVlKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpLzN3LXh4eHguaCBiL2RyaXZlcnMvc2NzaS8zdy14eHh4LmgKaW5kZXggNGY4MWZjMy4uMzFmZTVlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpLzN3LXh4eHguaAorKysgYi9kcml2ZXJzL3Njc2kvM3cteHh4eC5oCkBAIC00MjAsNyArNDIwLDcgQEAKIAl1MzIJCQltYXhfc2VjdG9yX2NvdW50OwogCXUzMgkJCWFlbl9jb3VudDsKIAlzdHJ1Y3QgU2NzaV9Ib3N0CSpob3N0OwotCXN0cnVjdCBzZW1hcGhvcmUJaW9jdGxfc2VtOworCXN0cnVjdCBtdXRleAkJaW9jdGxfbG9jazsKIAl1bnNpZ25lZCBzaG9ydAkJYWVuX3F1ZXVlW1RXX1FfTEVOR1RIXTsKIAl1bnNpZ25lZCBjaGFyCQlhZW5faGVhZDsKIAl1bnNpZ25lZCBjaGFyCQlhZW5fdGFpbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9CdXNMb2dpYy5jIGIvZHJpdmVycy9zY3NpL0J1c0xvZ2ljLmMKaW5kZXggOWQ2MDQwYi4uMWM0NTkzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL0J1c0xvZ2ljLmMKKysrIGIvZHJpdmVycy9zY3NpL0J1c0xvZ2ljLmMKQEAgLTIyMTYsNiArMjIxNiw3IEBACiAJCUhvc3RBZGFwdGVyLT5QQ0lfQWRkcmVzcyA9IFByb2JlSW5mby0+UENJX0FkZHJlc3M7CiAJCUhvc3RBZGFwdGVyLT5CdXMgPSBQcm9iZUluZm8tPkJ1czsKIAkJSG9zdEFkYXB0ZXItPkRldmljZSA9IFByb2JlSW5mby0+RGV2aWNlOworCQlIb3N0QWRhcHRlci0+UENJX0RldmljZSA9IFByb2JlSW5mby0+UENJX0RldmljZTsKIAkJSG9zdEFkYXB0ZXItPklSUV9DaGFubmVsID0gUHJvYmVJbmZvLT5JUlFfQ2hhbm5lbDsKIAkJSG9zdEFkYXB0ZXItPkFkZHJlc3NDb3VudCA9IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyQWRkcmVzc0NvdW50W0hvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlclR5cGVdOwogCQkvKgpAQCAtMjI5Niw3ICsyMjk3LDcgQEAKIAkJCQlzY3NpX2hvc3RfcHV0KEhvc3QpOwogCQkJfSBlbHNlIHsKIAkJCQlCdXNMb2dpY19Jbml0aWFsaXplSG9zdFN0cnVjdHVyZShIb3N0QWRhcHRlciwgSG9zdCk7Ci0JCQkJc2NzaV9hZGRfaG9zdChIb3N0LCBOVUxMKTsKKwkJCQlzY3NpX2FkZF9ob3N0KEhvc3QsIEhvc3RBZGFwdGVyLT5QQ0lfRGV2aWNlID8gJkhvc3RBZGFwdGVyLT5QQ0lfRGV2aWNlLT5kZXYgOiBOVUxMKTsKIAkJCQlzY3NpX3NjYW5faG9zdChIb3N0KTsKIAkJCQlCdXNMb2dpY0hvc3RBZGFwdGVyQ291bnQrKzsKIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9GbGFzaFBvaW50LmMgYi9kcml2ZXJzL3Njc2kvRmxhc2hQb2ludC5jCmluZGV4IDViZWVkNGYuLjhkNjRmMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9GbGFzaFBvaW50LmMKKysrIGIvZHJpdmVycy9zY3NpL0ZsYXNoUG9pbnQuYwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAjZGVmaW5lIFBDSV9CVVNfQ0FSRCAgICAgICAgICAweDAzCiAjZGVmaW5lIFZFU0FfQlVTX0NBUkQgICAgICAgICAweDA0CiAKLS8qIFNDQ0Igc3RydWMgdXNlZCBmb3IgYm90aCBTQ0NCIGFuZCBVQ0IgbWFuYWdlciBjb21waWxlcyEgCisvKiBTQ0NCIHN0cnVjdCB1c2VkIGZvciBib3RoIFNDQ0IgYW5kIFVDQiBtYW5hZ2VyIGNvbXBpbGVzISAKICAqIFRoZSBVQ0IgTWFuYWdlciB0cmVhdHMgdGhlIFNDQ0IgYXMgaXQncyAnbmF0aXZlIGhhcmR3YXJlIHN0cnVjdHVyZScgCiAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL01ha2VmaWxlCmluZGV4IGYwNjJlYTAuLjMyMGU3NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKQEAgLTQ1LDcgKzQ1LDcgQEAKIG9iai0kKENPTkZJR19CTFoyMDYwX1NDU0kpCSs9IE5DUjUzQzl4Lm8JYmx6MjA2MC5vCiBvYmotJChDT05GSUdfQkxaMTIzMF9TQ1NJKQkrPSBOQ1I1M0M5eC5vCWJsejEyMzAubwogb2JqLSQoQ09ORklHX0ZBU1RMQU5FX1NDU0kpCSs9IE5DUjUzQzl4Lm8JZmFzdGxhbmUubwotb2JqLSQoQ09ORklHX09LVEFHT05fU0NTSSkJKz0gTkNSNTNDOXgubwlva3RhZ29uX2VzcC5vCW9rdGFnb25faW8ubworb2JqLSQoQ09ORklHX09LVEFHT05fU0NTSSkJKz0gTkNSNTNDOXgubwlva3RhZ29uX2VzcF9tb2Qubwogb2JqLSQoQ09ORklHX0FUQVJJX1NDU0kpCSs9IGF0YXJpX3Njc2kubwogb2JqLSQoQ09ORklHX01BQ19TQ1NJKQkJKz0gbWFjX3Njc2kubwogb2JqLSQoQ09ORklHX1NDU0lfTUFDX0VTUCkJKz0gbWFjX2VzcC5vCU5DUjUzQzl4Lm8KQEAgLTgwLDcgKzgwLDcgQEAKIG9iai0kKENPTkZJR19QQ01DSUFfUUxPR0lDKQkrPSBxbG9naWNmYXM0MDgubwogb2JqLSQoQ09ORklHX1NDU0lfUUxPR0lDX0ZDKQkrPSBxbG9naWNmYy5vIAogb2JqLSQoQ09ORklHX1NDU0lfUUxPR0lDXzEyODApCSs9IHFsYTEyODAubyAKLW9iai0kKENPTkZJR19TQ1NJX1FMQTJYWFgpCSs9IHFsYTJ4eHgvCitvYmotJChDT05GSUdfU0NTSV9RTEFfRkMpCSs9IHFsYTJ4eHgvCiBvYmotJChDT05GSUdfU0NTSV9MUEZDKQkJKz0gbHBmYy8KIG9iai0kKENPTkZJR19TQ1NJX1BBUzE2KQkrPSBwYXMxNi5vCiBvYmotJChDT05GSUdfU0NTSV9TRUFHQVRFKQkrPSBzZWFnYXRlLm8KQEAgLTE2NCw2ICsxNjQsNyBAQAogemFsb243eHgtb2Jqcwk6PSB6YWxvbi5vIG5jcjUzYzh4eC5vCiBOQ1JfUTcyMF9tb2Qtb2Jqcwk6PSBOQ1JfUTcyMC5vIG5jcjUzYzh4eC5vCiBsaWJhdGEtb2Jqcwk6PSBsaWJhdGEtY29yZS5vIGxpYmF0YS1zY3NpLm8KK29rdGFnb25fZXNwX21vZC1vYmpzCTo9IG9rdGFnb25fZXNwLm8gb2t0YWdvbl9pby5vCiAKICMgRmlsZXMgZ2VuZXJhdGVkIHRoYXQgc2hhbGwgYmUgcmVtb3ZlZCB1cG9uIG1ha2UgY2xlYW4KIGNsZWFuLWZpbGVzIDo9CTUzYzd4eF9kLmggNTNjNzAwX2QuaAlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTkNSNTNDOXguYyBiL2RyaXZlcnMvc2NzaS9OQ1I1M0M5eC5jCmluZGV4IDY0MDU5MGIuLmM3ZGQwMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9OQ1I1M0M5eC5jCisrKyBiL2RyaXZlcnMvc2NzaS9OQ1I1M0M5eC5jCkBAIC0xNzk5LDYgKzE3OTksNyBAQAogCQkgKi8KIAkJaW50IG9sZHBoYXNlLCBpID0gMDsgLyogb3Igd2hlcmUgd2UgbGVmdCBvZmYgbGFzdCB0aW1lID8/IGVzcC0+Y3VycmVudF9kYXRhID8/ICovCiAJCWludCBmaWZvY250ID0gMDsKKwkJdW5zaWduZWQgY2hhciAqcCA9IHBoeXNfdG9fdmlydCgodW5zaWduZWQgbG9uZylTQ3B0ci0+U0NwLnB0cik7CiAKIAkJb2xkcGhhc2UgPSBlc3BfcmVhZChlcmVncy0+ZXNwX3N0YXR1cykgJiBFU1BfU1RBVF9QTUFTSzsKIApAQCAtMTg2MCw3ICsxODYxLDcgQEAKIAogCQkJCS8qIHJlYWQgZmlmbyAqLwogCQkJCWZvcihqPTA7ajxmaWZvY250O2orKykKLQkJCQkJU0NwdHItPlNDcC5wdHJbaSsrXSA9IGVzcF9yZWFkKGVyZWdzLT5lc3BfZmRhdGEpOworCQkJCQlwW2krK10gPSBlc3BfcmVhZChlcmVncy0+ZXNwX2ZkYXRhKTsKIAogCQkJCUVTUERBVEEoKCIoJWQpICIsIGkpKTsKIApAQCAtMTg4Miw3ICsxODgzLDcgQEAKIAogCQkJCS8qIGZpbGwgZmlmbyAqLwogCQkJCWZvcihqPTA7ajx0aGlzX2NvdW50O2orKykKLQkJCQkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfZmRhdGEsIFNDcHRyLT5TQ3AucHRyW2krK10pOworCQkJCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9mZGF0YSwgcFtpKytdKTsKIAogCQkJCS8qIGhvdyBtYW55IGxlZnQgaWYgdGhpcyBnb2VzIG91dCA/PyAqLwogCQkJCWhtdWNoIC09IHRoaXNfY291bnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9SRUFETUUgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOTM4NjUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotQUFDUkFJRCBEcml2ZXIgZm9yIExpbnV4ICh0YWtlIHR3bykKLQotSW50cm9kdWN0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGUgYWFjcmFpZCBkcml2ZXIgYWRkcyBzdXBwb3J0IGZvciBBZGFwdGVjIChodHRwOi8vd3d3LmFkYXB0ZWMuY29tKQotUkFJRCBjb250cm9sbGVycy4gVGhpcyBpcyBhIG1ham9yIHJld3JpdGUgZnJvbSB0aGUgb3JpZ2luYWwgCi1BZGFwdGVjIHN1cHBsaWVkIGRyaXZlci4gSXQgaGFzIHNpZ25maWNhbnRseSBjbGVhbmVkIHVwIGJvdGggdGhlIGNvZGUKLWFuZCB0aGUgcnVubmluZyBiaW5hcnkgc2l6ZSAodGhlIG1vZHVsZSBpcyBsZXNzIHRoYW4gaGFsZiB0aGUgc2l6ZSBvZgotdGhlIG9yaWdpbmFsKS4KLQotU3VwcG9ydGVkIENhcmRzL0NoaXBzZXRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JQWRhcHRlYyAyMDIwUwotCUFkYXB0ZWMgMjAyNVMKLQlBZGFwdGVjIDIxMjBTCi0JQWRhcHRlYyAyMTMwUwotCUFkYXB0ZWMgMjIwMFMKLQlBZGFwdGVjIDIyMzBTCi0JQWRhcHRlYyAyMjQwUwotCUFkYXB0ZWMgMjQxMFNBCi0JQWRhcHRlYyAyNjEwU0EKLQlBZGFwdGVjIDI4MTBTQQotCUFkYXB0ZWMgMjE2MTBTQQotCUFkYXB0ZWMgMzIzMFMKLQlBZGFwdGVjIDMyNDBTCi0JQWRhcHRlYyA0MDAwU0FTCi0JQWRhcHRlYyA0MDA1U0FTCi0JQWRhcHRlYyA0ODAwU0FTCi0JQWRhcHRlYyA0ODA1U0FTCi0JQWRhcHRlYyA1NDAwUwotCURlbGwgUEVSQyAyIFF1YWQgQ2hhbm5lbAotCURlbGwgUEVSQyAyL1NpCi0JRGVsbCBQRVJDIDMvU2kKLQlEZWxsIFBFUkMgMy9EaQotCURlbGwgQ0VSQyAyCi0JSFAgTmV0UkFJRC00TQotCUxlZ2VuZCBTMjIwCi0JTGVnZW5kIFMyMzAKLQlJQk0gU2VydmVSQUlEIDhpCi0JSUNQIDkwMTRSMAotCUlDUCA5MDI0UjAKLQlJQ1AgOTA0N01BCi0JSUNQIDkwODdNQQotCUlDUCA5MDg1TEkKLQlJQ1AgNTA4NUFVCi0KLVBlb3BsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KLUNocmlzdG9waCBIZWxsd2lnIDxoY2hAaW5mcmFkZWFkLm9yZz4JKHVwZGF0ZXMgZm9yIG5ldy1zdHlsZSBQQ0kgcHJvYmluZyBhbmQgU0NTSSBob3N0IHJlZ2lzdHJhdGlvbiwKLQkJCQkJIHNtYWxsIGNsZWFudXBzL2ZpeGVzKQotTWF0dCBEb21zY2ggPG1hdHRfZG9tc2NoQGRlbGwuY29tPgkocmV2aXNpb24gaW9jdGwsIGFkYXB0ZXIgbWVzc2FnZXMpCi1EZWFubmEgQm9uZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vbi1EQVNEIHN1cHBvcnQsIFBBRSBmaWJzIGFuZCA2NCBiaXQsIGFkZGVkIG5ldyBhZGFwdGVjIGNvbnRyb2xsZXJzCi0JCQkJCSBhZGRlZCBuZXcgaW9jdGxzLCBjaGFuZ2VkIHNjc2kgaW50ZXJmYWNlIHRvIHVzZSBuZXcgZXJyb3IgaGFuZGxlciwKLQkJCQkJIGluY3JlYXNlZCB0aGUgbnVtYmVyIG9mIGZpYnMgYW5kIG91dHN0YW5kaW5nIGNvbW1hbmRzIHRvIGEgY29udGFpbmVyKQotCi0JCQkJCShmaXhlZCA2NGJpdCBhbmQgNjRHIG1lbW9yeSBtb2RlbCwgY2hhbmdlZCBjb25mdXNpbmcgbmFtaW5nIGNvbnZlbnRpb24KLQkJCQkJIHdoZXJlIGZpYnMgdGhhdCBnbyB0byB0aGUgaGFyZHdhcmUgYXJlIGNvbnNpc3RlbnRseSBjYWxsZWQgaHdfZmlicyBhbmQKLQkJCQkJIG5vdCBqdXN0IGZpYnMgbGlrZSB0aGUgbmFtZSBvZiB0aGUgZHJpdmVyIHRyYWNraW5nIHN0cnVjdHVyZSkKLU1hcmsgU2FseXp5biA8TWFya19TYWx5enluQGFkYXB0ZWMuY29tPiBGaXhlZCBwYW5pYyBpc3N1ZXMgYW5kIGFkZGVkIHNvbWUgbmV3IHByb2R1Y3QgaWRzIGZvciB1cGNvbWluZyBoYmFzLiBQZXJmb3JtYW5jZSB0dW5pbmcsIGNhcmQgZmFpbG92ZXIgYW5kIGJ1ZyBtaXRpZ2F0aW9ucy4KLQotT3JpZ2luYWwgRHJpdmVyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BZGFwdGVjIFVuaXggT0VNIFByb2R1Y3QgR3JvdXAKLQotTWFpbGluZyBMaXN0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1saW51eC1zY3NpQHZnZXIua2VybmVsLm9yZyAoSW50ZXJlc3RlZCBwYXJ0aWVzIHRyb2xsIGhlcmUpCi1BbHNvIG5vdGUgdGhpcyBpcyB2ZXJ5IGRpZmZlcmVudCB0byBCcmlhbidzIG9yaWdpbmFsIGRyaXZlcgotc28gZG9uJ3QgZXhwZWN0IGhpbSB0byBzdXBwb3J0IGl0LgotQWRhcHRlYyBkb2VzIHN1cHBvcnQgdGhpcyBkcml2ZXIuICBDb250YWN0IGVpdGhlciB0ZWNoIHN1cHBvcnQgb3IgTWFyayBTYWx5enluLgotCi1PcmlnaW5hbCBieSBCcmlhbiBCb2VybmVyIEZlYnJ1YXJ5IDIwMDEKLVJld3JpdHRlbiBieSBBbGFuIENveCwgTm92ZW1iZXIgMjAwMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjcmFpZC5oIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjcmFpZC5oCmluZGV4IDMwZmQ4ZDYuLjY2ZGJiNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY3JhaWQuaAorKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNyYWlkLmgKQEAgLTUzMiw2ICs1MzIsMTMgQEAKICNkZWZpbmUgQUFDX1FVSVJLX01BU1RFUiAweDAwMDgKIAogLyoKKyAqIFNvbWUgYWRhcHRlciBmaXJtd2FyZSBwZXJmb3JtIHBvb3JseSB3aGVuIGl0IG11c3Qgc3BsaXQgdXAgc2NhdHRlciBnYXRoZXJzCisgKiBpbiBvcmRlciB0byBkZWFsIHdpdGggdGhlIGxpbWl0cyBvZiB0aGUgdW5kZXJseWluZyBDSElNLiBUaGlzIGxpbWl0IGluIHRoaXMKKyAqIGNsYXNzIG9mIGFkYXB0ZXJzIGlzIDE3IHNjYXR0ZXIgZ2F0aGVyIGVsZW1lbnRzLgorICovCisjZGVmaW5lIEFBQ19RVUlSS18xN1NHCTB4MDAxMAorCisvKgogICoJVGhlIGFkYXB0ZXIgaW50ZXJmYWNlIHNwZWNzIGFsbCBxdWV1ZXMgdG8gYmUgbG9jYXRlZCBpbiB0aGUgc2FtZQogICoJcGh5c2ljYWxseSBjb250aWdvdXMgYmxvY2suIFRoZSBob3N0IHN0cnVjdHVyZSB0aGF0IGRlZmluZXMgdGhlCiAgKgljb21tdWljYXRpb24gcXVldWVzIHdpbGwgYXNzdW1lIHRoZXkgYXJlIGVhY2ggYSBzZXBhcmF0ZSBwaHlzaWNhbGx5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tY3RybC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWN0cmwuYwppbmRleCBlZjYyM2JkLi40ZmU3OWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tY3RybC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1jdHJsLmMKQEAgLTg1LDYgKzg1LDEwIEBACiAJaWYgKHNpemUgPCBsZTE2X3RvX2NwdShrZmliLT5oZWFkZXIuU2VuZGVyU2l6ZSkpCiAJCXNpemUgPSBsZTE2X3RvX2NwdShrZmliLT5oZWFkZXIuU2VuZGVyU2l6ZSk7CiAJaWYgKHNpemUgPiBkZXYtPm1heF9maWJfc2l6ZSkgeworCQlpZiAoc2l6ZSA+IDIwNDgpIHsKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KIAkJLyogSGlnaGphY2sgdGhlIGh3X2ZpYiAqLwogCQlod19maWIgPSBmaWJwdHItPmh3X2ZpYjsKIAkJaHdfZmliX3BhID0gZmlicHRyLT5od19maWJfcGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9saW5pdC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvbGluaXQuYwppbmRleCAzY2I2OGFmLi4wYmY1ZjlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9saW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2xpbml0LmMKQEAgLTQ2LDcgKzQ2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgotI2luY2x1ZGUgPGxpbnV4L2lvY3RsMzIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgpAQCAtMjAxLDEwICsyMDAsMTAgQEAKIAl7IGFhY19ya3RfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkNhbGxpc3RvICAgICAgICAiLCAyLCBBQUNfUVVJUktfTUFTVEVSIH0sIC8qIEp1cGl0ZXIgUGxhdGZvcm0gKi8KIAl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQVNSLTIwMjBTQSAgICAgICAiLCAxIH0sIC8qIEFTUi0yMDIwU0EgU0FUQSBQQ0ktWCBaQ1IgKFNreWhhd2spICovCiAJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFTUi0yMDI1U0EgICAgICAgIiwgMSB9LCAvKiBBU1ItMjAyNVNBIFNBVEEgU08tRElNTSBQQ0ktWCBaQ1IgKFRlcm1pbmF0b3IpICovCi0JeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFBUi0yNDEwU0EgU0FUQSAiLCAxIH0sIC8qIEFBUi0yNDEwU0EgUENJIFNBVEEgNGNoIChKYWd1YXIgSUkpICovCi0JeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkRFTEwgICAgIiwgIkNFUkMgU1IyICAgICAgICAiLCAxIH0sIC8qIENFUkMgU0FUQSBSQUlEIDIgUENJIFNBVEEgNmNoIChEZWxsQ29yc2FpcikgKi8KLQl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQUFSLTI4MTBTQSBTQVRBICIsIDEgfSwgLyogQUFSLTI4MTBTQSBQQ0kgU0FUQSA4Y2ggKENvcnNhaXItOCkgKi8KLQl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQUFSLTIxNjEwU0EgU0FUQSIsIDEgfSwgLyogQUFSLTIxNjEwU0EgUENJIFNBVEEgMTZjaCAoQ29yc2Fpci0xNikgKi8KKwl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQUFSLTI0MTBTQSBTQVRBICIsIDEsIEFBQ19RVUlSS18xN1NHIH0sIC8qIEFBUi0yNDEwU0EgUENJIFNBVEEgNGNoIChKYWd1YXIgSUkpICovCisJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkRFTEwgICAgIiwgIkNFUkMgU1IyICAgICAgICAiLCAxLCBBQUNfUVVJUktfMTdTRyB9LCAvKiBDRVJDIFNBVEEgUkFJRCAyIFBDSSBTQVRBIDZjaCAoRGVsbENvcnNhaXIpICovCisJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFBUi0yODEwU0EgU0FUQSAiLCAxLCBBQUNfUVVJUktfMTdTRyB9LCAvKiBBQVItMjgxMFNBIFBDSSBTQVRBIDhjaCAoQ29yc2Fpci04KSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBQVItMjE2MTBTQSBTQVRBIiwgMSwgQUFDX1FVSVJLXzE3U0cgfSwgLyogQUFSLTIxNjEwU0EgUENJIFNBVEEgMTZjaCAoQ29yc2Fpci0xNikgKi8KIAl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQVNSLTIwMjZaQ1IgICAgICIsIDEgfSwgLyogRVNEIFNPLURJTU0gUENJLVggU0FUQSBaQ1IgKFByb3dsZXIpICovCiAJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFBUi0yNjEwU0EgICAgICAiLCAxIH0sIC8qIFNBVEEgNkNoIChCZWFyY2F0KSAqLwogCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBU1ItMjI0MFMgICAgICAgIiwgMSB9LCAvKiBBU1ItMjI0MFMgKFNhYnJlRXhwcmVzcykgKi8KQEAgLTU3NSw3ICs1NzQsMTUgQEAKIAlzdHJ1Y3QgYWFjX2RldiAqZGV2ID0gKHN0cnVjdCBhYWNfZGV2KiljbGFzc190b19zaG9zdChjbGFzc19kZXYpLT5ob3N0ZGF0YTsKIAlpbnQgbGVuOwogCi0JbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwKKwlpZiAoZGV2LT5zdXBwbGVtZW50X2FkYXB0ZXJfaW5mby5BZGFwdGVyVHlwZVRleHRbMF0pIHsKKwkJY2hhciAqIGNwID0gZGV2LT5zdXBwbGVtZW50X2FkYXB0ZXJfaW5mby5BZGFwdGVyVHlwZVRleHQ7CisJCXdoaWxlICgqY3AgJiYgKmNwICE9ICcgJykKKwkJCSsrY3A7CisJCXdoaWxlICgqY3AgPT0gJyAnKQorCQkJKytjcDsKKwkJbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgY3ApOworCX0gZWxzZQorCQlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLAogCQkgIGFhY19kcml2ZXJzW2Rldi0+Y2FyZHR5cGVdLm1vZGVsKTsKIAlyZXR1cm4gbGVuOwogfQpAQCAtNTg2LDcgKzU5MywxNSBAQAogCXN0cnVjdCBhYWNfZGV2ICpkZXYgPSAoc3RydWN0IGFhY19kZXYqKWNsYXNzX3RvX3Nob3N0KGNsYXNzX2RldiktPmhvc3RkYXRhOwogCWludCBsZW47CiAKLQlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLAorCWlmIChkZXYtPnN1cHBsZW1lbnRfYWRhcHRlcl9pbmZvLkFkYXB0ZXJUeXBlVGV4dFswXSkgeworCQljaGFyICogY3AgPSBkZXYtPnN1cHBsZW1lbnRfYWRhcHRlcl9pbmZvLkFkYXB0ZXJUeXBlVGV4dDsKKwkJd2hpbGUgKCpjcCAmJiAqY3AgIT0gJyAnKQorCQkJKytjcDsKKwkJbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlLipzXG4iLAorCQkgIChpbnQpKGNwIC0gKGNoYXIgKilkZXYtPnN1cHBsZW1lbnRfYWRhcHRlcl9pbmZvLkFkYXB0ZXJUeXBlVGV4dCksCisJCSAgZGV2LT5zdXBwbGVtZW50X2FkYXB0ZXJfaW5mby5BZGFwdGVyVHlwZVRleHQpOworCX0gZWxzZQorCQlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLAogCQkgIGFhY19kcml2ZXJzW2Rldi0+Y2FyZHR5cGVdLnZuYW1lKTsKIAlyZXR1cm4gbGVuOwogfQpAQCAtODM4LDYgKzg1MywxMyBAQAogIAkJICA9IChhYWMtPnNjc2lfaG9zdF9wdHItPnNnX3RhYmxlc2l6ZSAqIDgpICsgMTEyOwogIAl9CiAKKyAJaWYgKChhYWNfZHJpdmVyc1tpbmRleF0ucXVpcmtzICYgQUFDX1FVSVJLXzE3U0cpICYmCisJCQkoYWFjLT5zY3NpX2hvc3RfcHRyLT5zZ190YWJsZXNpemUgPiAxNykpIHsKKyAJCWFhYy0+c2NzaV9ob3N0X3B0ci0+c2dfdGFibGVzaXplID0gMTc7CisgCQlhYWMtPnNjc2lfaG9zdF9wdHItPm1heF9zZWN0b3JzCisgCQkgID0gKGFhYy0+c2NzaV9ob3N0X3B0ci0+c2dfdGFibGVzaXplICogOCkgKyAxMTI7CisgCX0KKwogCS8qCiAJICogRmlyd2FyZSBwcmludGYgd29ya3Mgb25seSB3aXRoIG9sZGVyIGZpcm13YXJlLgogCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FoY2kuYyBiL2RyaXZlcnMvc2NzaS9haGNpLmMKaW5kZXggZDExMzI5MC4uMTliZDM0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FoY2kuYworKysgYi9kcml2ZXJzL3Njc2kvYWhjaS5jCkBAIC0yNzYsNiArMjc2LDE2IEBACiAJICBib2FyZF9haGNpIH0sIC8qIEVTQjIgKi8KIAl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjdjNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKIAkgIGJvYXJkX2FoY2kgfSwgLyogSUNINy1NIERIICovCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI4MjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJICBib2FyZF9haGNpIH0sIC8qIElDSDggKi8KKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjgyMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgIGJvYXJkX2FoY2kgfSwgLyogSUNIOCAqLworCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyODI0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCSAgYm9hcmRfYWhjaSB9LCAvKiBJQ0g4ICovCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI4MjksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJICBib2FyZF9haGNpIH0sIC8qIElDSDhNICovCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI4MmEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJICBib2FyZF9haGNpIH0sIC8qIElDSDhNICovCiAJeyB9CS8qIHRlcm1pbmF0ZSBsaXN0ICovCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9LY29uZmlnLmFpYzd4eHggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9LY29uZmlnLmFpYzd4eHgKaW5kZXggYWM4ZGUwMy4uNmMyYzM5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvS2NvbmZpZy5haWM3eHh4CisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L0tjb25maWcuYWljN3h4eApAQCAtNDIsMTMgKzQyLDEzIEBACiBjb25maWcgQUlDN1hYWF9SRVNFVF9ERUxBWV9NUwogCWludCAiSW5pdGlhbCBidXMgcmVzZXQgZGVsYXkgaW4gbWlsbGktc2Vjb25kcyIKIAlkZXBlbmRzIG9uIFNDU0lfQUlDN1hYWAotCWRlZmF1bHQgIjE1MDAwIgorCWRlZmF1bHQgIjUwMDAiCiAJLS0taGVscC0tLQogCVRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGFmdGVyIGFuIGluaXRpYWwgYnVzIHJlc2V0LgogCVRoZSBidXMgc2V0dGxlIGRlbGF5IGZvbGxvd2luZyBhbGwgZXJyb3IgcmVjb3ZlcnkgYWN0aW9ucyBpcwogCWRpY3RhdGVkIGJ5IHRoZSBTQ1NJIGxheWVyIGFuZCBpcyBub3QgYWZmZWN0ZWQgYnkgdGhpcyB2YWx1ZS4KIAotCURlZmF1bHQ6IDE1MDAwICgxNSBzZWNvbmRzKQorCURlZmF1bHQ6IDUwMDAgKDUgc2Vjb25kcykKIAogY29uZmlnIEFJQzdYWFhfUFJPQkVfRUlTQV9WTAogCWJvb2wgIlByb2JlIGZvciBFSVNBIGFuZCBWTCBBSUM3WFhYIEFkYXB0ZXJzIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5oCmluZGV4IDY1M2ZiMGIuLjJjZmRiZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHguaAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4LmgKQEAgLTM3LDcgKzM3LDcgQEAKICAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICoKLSAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5oIzk1ICQKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5oIzEwOCAkCiAgKgogICogJEZyZWVCU0QkCiAgKi8KQEAgLTc1LDggKzc1LDcgQEAKICNkZWZpbmUgSU5JVElBVE9SX1dJTERDQVJECSh+MCkKICNkZWZpbmUJU0NCX0xJU1RfTlVMTAkJMHhGRjAwCiAjZGVmaW5lCVNDQl9MSVNUX05VTExfTEUJKGFoZF9odG9sZTE2KFNDQl9MSVNUX05VTEwpKQotI2RlZmluZSBRT1VURklGT19FTlRSWV9WQUxJRCAweDgwMDAKLSNkZWZpbmUgUU9VVEZJRk9fRU5UUllfVkFMSURfTEUgKGFoZF9odG9sZTE2KDB4ODAwMCkpCisjZGVmaW5lIFFPVVRGSUZPX0VOVFJZX1ZBTElEIDB4ODAKICNkZWZpbmUgU0NCSURfSVNfTlVMTChzY2JpZCkgKCgoc2NiaWQpICYgMHhGRjAwICkgPT0gU0NCX0xJU1RfTlVMTCkKIAogI2RlZmluZSBTQ1NJSURfVEFSR0VUKGFoZCwgc2NzaWlkKQlcCkBAIC0xMDUzLDYgKzEwNTIsMTMgQEAKIAogdHlwZWRlZiB2b2lkIGFoZF9jYWxsYmFja190ICh2b2lkICopOwogCitzdHJ1Y3QgYWhkX2NvbXBsZXRpb24KK3sKKwl1aW50MTZfdAl0YWc7CisJdWludDhfdAkJc2dfc3RhdHVzOworCXVpbnQ4X3QJCXZhbGlkX3RhZzsKK307CisKIHN0cnVjdCBhaGRfc29mdGMgewogCWJ1c19zcGFjZV90YWdfdCAgICAgICAgICAgdGFnc1syXTsKIAlidXNfc3BhY2VfaGFuZGxlX3QgICAgICAgIGJzaHNbMl07CkBAIC0xMDYyLDYgKzEwNjgsNyBAQAogCXN0cnVjdCBzY2JfZGF0YQkJICBzY2JfZGF0YTsKIAogCXN0cnVjdCBoYXJkd2FyZV9zY2IJICpuZXh0X3F1ZXVlZF9oc2NiOworCXN0cnVjdCBtYXBfbm9kZQkJICpuZXh0X3F1ZXVlZF9oc2NiX21hcDsKIAogCS8qCiAJICogU0NCcyB0aGF0IGhhdmUgYmVlbiBzZW50IHRvIHRoZSBjb250cm9sbGVyCkBAIC0xMTQwLDE2ICsxMTQ3LDIzIEBACiAJYWhkX2ZsYWcJCSAgZmxhZ3M7CiAJc3RydWN0IHNlZXByb21fY29uZmlnCSAqc2VlcF9jb25maWc7CiAKLQkvKiBWYWx1ZXMgdG8gc3RvcmUgaW4gdGhlIFNFUUNUTCByZWdpc3RlciBmb3IgcGF1c2UgYW5kIHVucGF1c2UgKi8KLQl1aW50OF90CQkJICB1bnBhdXNlOwotCXVpbnQ4X3QJCQkgIHBhdXNlOwotCiAJLyogQ29tbWFuZCBRdWV1ZXMgKi8KKwlzdHJ1Y3QgYWhkX2NvbXBsZXRpb24JICAqcW91dGZpZm87CiAJdWludDE2X3QJCSAgcW91dGZpZm9uZXh0OwogCXVpbnQxNl90CQkgIHFvdXRmaWZvbmV4dF92YWxpZF90YWc7CiAJdWludDE2X3QJCSAgcWluZmlmb25leHQ7CiAJdWludDE2X3QJCSAgcWluZmlmb1tBSERfU0NCX01BWF07Ci0JdWludDE2X3QJCSAqcW91dGZpZm87CisKKwkvKgorCSAqIE91ciBxZnJlZXplIGNvdW50LiAgVGhlIHNlcXVlbmNlciBjb21wYXJlcworCSAqIHRoaXMgdmFsdWUgd2l0aCBpdHMgb3duIGNvdW50ZXIgdG8gZGV0ZXJtaW5lCisJICogd2hldGhlciB0byBhbGxvdyBzZWxlY3Rpb25zIHRvIG9jY3VyLgorCSAqLworCXVpbnQxNl90CQkgIHFmcmVlemVfY250OworCisJLyogVmFsdWVzIHRvIHN0b3JlIGluIHRoZSBTRVFDVEwgcmVnaXN0ZXIgZm9yIHBhdXNlIGFuZCB1bnBhdXNlICovCisJdWludDhfdAkJCSAgdW5wYXVzZTsKKwl1aW50OF90CQkJICBwYXVzZTsKIAogCS8qIENyaXRpY2FsIFNlY3Rpb24gRGF0YSAqLwogCXN0cnVjdCBjcwkJICpjcml0aWNhbF9zZWN0aW9uczsKQEAgLTExOTcsOCArMTIxMSw3IEBACiAJICovCiAJYnVzX2RtYV90YWdfdAkJICBwYXJlbnRfZG1hdDsKIAlidXNfZG1hX3RhZ190CQkgIHNoYXJlZF9kYXRhX2RtYXQ7Ci0JYnVzX2RtYW1hcF90CQkgIHNoYXJlZF9kYXRhX2RtYW1hcDsKLQlkbWFfYWRkcl90CQkgIHNoYXJlZF9kYXRhX2J1c2FkZHI7CisJc3RydWN0IG1hcF9ub2RlCQkgIHNoYXJlZF9kYXRhX21hcDsKIAogCS8qIEluZm9ybWF0aW9uIHNhdmVkIHRocm91Z2ggc3VzcGVuZC9yZXN1bWUgY3ljbGVzICovCiAJc3RydWN0IGFoZF9zdXNwZW5kX3N0YXRlICBzdXNwZW5kX3N0YXRlOwpAQCAtMTI5Niw5ICsxMzA5LDkgQEAKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUENJIFN0cnVjdHVyZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEFIRF9QQ0lfSU9BRERSMAlQQ0lSX01BUFMJLyogSS9PIEJBUiovCi0jZGVmaW5lIEFIRF9QQ0lfTUVNQUREUgkoUENJUl9NQVBTICsgNCkJLyogTWVtb3J5IEJBUiAqLwotI2RlZmluZSBBSERfUENJX0lPQUREUjEJKFBDSVJfTUFQUyArIDEyKS8qIFNlY29uZCBJL08gQkFSICovCisjZGVmaW5lIEFIRF9QQ0lfSU9BRERSMAlQQ0lSX0JBUigwKQkvKiBJL08gQkFSKi8KKyNkZWZpbmUgQUhEX1BDSV9NRU1BRERSCVBDSVJfQkFSKDEpCS8qIE1lbW9yeSBCQVIgKi8KKyNkZWZpbmUgQUhEX1BDSV9JT0FERFIxCVBDSVJfQkFSKDMpCS8qIFNlY29uZCBJL08gQkFSICovCiAKIHR5cGVkZWYgaW50IChhaGRfZGV2aWNlX3NldHVwX3QpKHN0cnVjdCBhaGRfc29mdGMgKik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHgucmVnIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5yZWcKaW5kZXggY2NhNThlZC4uM2EzMjA0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5yZWcKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5yZWcKQEAgLTM5LDcgKzM5LDcgQEAKICAqCiAgKiAkRnJlZUJTRCQKICAqLwotVkVSU0lPTiA9ICIkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHgucmVnIzcwICQiCitWRVJTSU9OID0gIiRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5yZWcjNzYgJCIKIAogLyoKICAqIFRoaXMgZmlsZSBpcyBwcm9jZXNzZWQgYnkgdGhlIGFpYzd4eHhfYXNtIHV0aWxpdHkgZm9yIHVzZSBpbiBhc3NlbWJsaW5nCkBAIC02NSwxMyArNjUsNiBAQAogCQltdmkJTU9ERV9QVFIsIE1LX01PREUoc3JjLCBkc3QpOwkJCVwKIAl9CiAKLSNkZWZpbmUgVE9HR0xFX0RGRl9NT0RFCQkJCQkJCVwKLQlpZiAoKGFoZC0+YnVncyAmIEFIRF9TRVRfTU9ERV9CVUcpICE9IDApIHsJCQlcCi0JCWNhbGwJdG9nZ2xlX2RmZl9tb2RlX3dvcmtfYXJvdW5kOwkJCVwKLQl9IGVsc2UgewkJCQkJCQlcCi0JCXhvcglNT0RFX1BUUiwgTUtfTU9ERShNX0RGRjEsIE1fREZGMSk7CQlcCi0JfQotCQogI2RlZmluZSBSRVNUT1JFX01PREUobW9kZSkJCQkJCQlcCiAJaWYgKChhaGQtPmJ1Z3MgJiBBSERfU0VUX01PREVfQlVHKSAhPSAwKSB7CQkJXAogCQltb3YJbW9kZSBjYWxsIHNldF9tb2RlX3dvcmtfYXJvdW5kOwkJCVwKQEAgLTExOTksNyArMTE5Miw3IEBACiAKIC8qCiAgKiBMUSBQYWNrZXQgSW4KLSAqIFRoZSBsYXN0IExRIFBhY2tldCByZWNlaXZlZAorICogVGhlIGxhc3QgTFEgUGFja2V0IHJlY2lldmVkCiAgKi8KIHJlZ2lzdGVyIExRSU4gewogCWFkZHJlc3MJCQkweDAyMApAQCAtMzU0MiwxMCArMzUzNSwzNCBAQAogCUNPTVBMRVRFX0RNQV9TQ0JfSEVBRCB7CiAJCXNpemUJCTIKIAl9Ci0JLyogQ291bnRpbmcgc2VtYXBob3JlIHRvIHByZXZlbnQgbmV3IHNlbGVjdC1vdXRzICovCisJLyoKKwkgKiB0YWlsIG9mIGxpc3Qgb2YgU0NCcyB0aGF0IGhhdmUKKwkgKiBjb21wbGV0ZWQgYnV0IG5lZWQgdG8gYmUgdXBsb2FkZWQKKwkgKiB0byB0aGUgaG9zdCBwcmlvciB0byBiZWluZyBjb21wbGV0ZWQuCisJICovCisJQ09NUExFVEVfRE1BX1NDQl9UQUlMIHsKKwkJc2l6ZQkJMgorCX0KKwkvKgorCSAqIGhlYWQgb2YgbGlzdCBvZiBTQ0JzIHRoYXQgaGF2ZQorCSAqIGJlZW4gdXBsb2FkZWQgdG8gdGhlIGhvc3QsIGJ1dCBjYW5ub3QKKwkgKiBiZSBjb21wbGV0ZWQgdW50aWwgdGhlIFFGUkVFWkUgaXMgaW4KKwkgKiBmdWxsIGVmZmVjdCAoaS5lLiBubyBzZWxlY3Rpb25zIHBlbmRpbmcpLgorCSAqLworCUNPTVBMRVRFX09OX1FGUkVFWkVfSEVBRCB7CisJCXNpemUJCTIKKwl9CisJLyoKKwkgKiBDb3VudGluZyBzZW1hcGhvcmUgdG8gcHJldmVudCBuZXcgc2VsZWN0LW91dHMKKwkgKiBUaGUgcXVldWUgaXMgZnJvemVuIHNvIGxvbmcgYXMgdGhlIHNlcXVlbmNlcgorCSAqIGFuZCBrZXJuZWwgZnJlZXplIGNvdW50cyBkaWZmZXIuCisJICovCiAJUUZSRUVaRV9DT1VOVCB7CiAJCXNpemUJCTIKIAl9CisJS0VSTkVMX1FGUkVFWkVfQ09VTlQgeworCQlzaXplCQkyCisJfQogCS8qCiAJICogTW9kZSB0byByZXN0b3JlIG9uIGxlZ2FjeSBpZGxlIGxvb3AgZXhpdC4KIAkgKi8KQEAgLTM2MjUsNiArMzY0MiwxNyBAQAogCQlzaXplCQkxCiAJfQogCS8qCisJICogS2VybmVsIGFuZCBzZXF1ZW5jZXIgb2Zmc2V0cyBpbnRvIHRoZSBxdWV1ZSBvZgorCSAqIGluY29taW5nIHRhcmdldCBtb2RlIGNvbW1hbmQgZGVzY3JpcHRvcnMuICBUaGUKKwkgKiBxdWV1ZSBpcyBmdWxsIHdoZW4gdGhlIEtFUk5FTF9UUUlOUE9TID09IFRRSU5QT1MuCisJICovCisJS0VSTkVMX1RRSU5QT1MgeworCQlzaXplCQkxCisJfQorCVRRSU5QT1MgeyAgICAgICAgICAgICAgICAKKwkJc2l6ZQkJMQorCX0KKwkvKgogCSAqIEJhc2UgYWRkcmVzcyBvZiBvdXIgc2hhcmVkIGRhdGEgd2l0aCB0aGUga2VybmVsIGRyaXZlciBpbiBob3N0CiAJICogbWVtb3J5LiAgVGhpcyBpbmNsdWRlcyB0aGUgcW91dGZpZm8gYW5kIHRhcmdldCBtb2RlCiAJICogaW5jb21pbmcgY29tbWFuZCBxdWV1ZS4KQEAgLTM2MzksMTcgKzM2NjcsNiBAQAogCVFPVVRGSUZPX05FWFRfQUREUiB7CiAJCXNpemUJCTQKIAl9Ci0JLyoKLQkgKiBLZXJuZWwgYW5kIHNlcXVlbmNlciBvZmZzZXRzIGludG8gdGhlIHF1ZXVlIG9mCi0JICogaW5jb21pbmcgdGFyZ2V0IG1vZGUgY29tbWFuZCBkZXNjcmlwdG9ycy4gIFRoZQotCSAqIHF1ZXVlIGlzIGZ1bGwgd2hlbiB0aGUgS0VSTkVMX1RRSU5QT1MgPT0gVFFJTlBPUy4KLQkgKi8KLQlLRVJORUxfVFFJTlBPUyB7Ci0JCXNpemUJCTEKLQl9Ci0JVFFJTlBPUyB7ICAgICAgICAgICAgICAgIAotCQlzaXplCQkxCi0JfQogCUFSR18xIHsKIAkJc2l6ZQkJMQogCQltYXNrCVNFTkRfTVNHCQkweDgwCkBAIC0zOTUxLDYgKzM5NjgsNyBAQAogY29uc3QgU0dfU0laRU9GIGRvd25sb2FkCiBjb25zdCBQS1RfT1ZFUlJVTl9CVUZPRkZTRVQgZG93bmxvYWQKIGNvbnN0IFNDQl9UUkFOU0ZFUl9TSVpFCWRvd25sb2FkCitjb25zdCBDQUNIRUxJTkVfTUFTSyBkb3dubG9hZAogCiAvKgogICogQklPUyBTQ0Igb2Zmc2V0cwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5zZXEgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4LnNlcQppbmRleCA2NTMzOWJjLi5iZWYxZjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4LnNlcQorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4LnNlcQpAQCAtNDAsNyArNDAsNyBAQAogICogJEZyZWVCU0QkCiAgKi8KIAotVkVSU0lPTiA9ICIkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHguc2VxIzk5ICQiCitWRVJTSU9OID0gIiRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5zZXEjMTE5ICQiCiBQQVRDSF9BUkdfTElTVCA9ICJzdHJ1Y3QgYWhkX3NvZnRjICphaGQiCiBQUkVGSVggPSAiYWhkXyIKIApAQCAtNjgsMTMgKzY4LDQ3IEBACiAJfQogCVNFVF9NT0RFKE1fU0NTSSwgTV9TQ1NJKQogCXRlc3QJU0NTSVNFUTAsIEVOU0VMT3xFTkFSQk8gam56IGlkbGVfbG9vcF9jaGVja2J1czsKLQl0ZXN0CVNFUV9GTEFHUzIsIFNFTEVDVE9VVF9RRlJPWkVOIGpueiBpZGxlX2xvb3BfY2hlY2tidXM7CisJdGVzdAlTRVFfRkxBR1MyLCBTRUxFQ1RPVVRfUUZST1pFTiBqeiBjaGVja193YWl0aW5nX2xpc3Q7CisJLyoKKwkgKiBJZiB0aGUga2VybmVsIGhhcyBjYXVnaHQgdXAgd2l0aCB1cywgdGhhdyB0aGUgcXVldWUuCisJICovCisJbW92CUEsIEtFUk5FTF9RRlJFRVpFX0NPVU5UOworCWNtcAlRRlJFRVpFX0NPVU5ULCBBIGpuZSBjaGVja19mcm96ZW5fY29tcGxldGlvbnM7CisJbW92CUEsIEtFUk5FTF9RRlJFRVpFX0NPVU5UWzFdOworCWNtcAlRRlJFRVpFX0NPVU5UWzFdLCBBIGpuZSBjaGVja19mcm96ZW5fY29tcGxldGlvbnM7CisJYW5kCVNFUV9GTEFHUzIsIH5TRUxFQ1RPVVRfUUZST1pFTjsKKwlqbXAJY2hlY2tfd2FpdGluZ19saXN0OworY2hlY2tfZnJvemVuX2NvbXBsZXRpb25zOgorCXRlc3QJU1NUQVQwLCBTRUxET3xTRUxJTkdPIGpueiBpZGxlX2xvb3BfY2hlY2tidXM7CitCRUdJTl9DUklUSUNBTDsKKwkvKgorCSAqIElmIHdlIGhhdmUgY29tcGxldGlvbnMgc3RhbGxlZCB3YWl0aW5nIGZvciB0aGUgcWZyZWV6ZQorCSAqIHRvIHRha2UgZWZmZWN0LCBtb3ZlIHRoZW0gb3ZlciB0byB0aGUgY29tcGxldGVfc2NiIGxpc3QKKwkgKiBub3cgdGhhdCBubyBzZWxlY3Rpb25zIGFyZSBwZW5kaW5nLgorCSAqLworCWNtcAlDT01QTEVURV9PTl9RRlJFRVpFX0hFQURbMV0sU0NCX0xJU1RfTlVMTCBqZSBpZGxlX2xvb3BfY2hlY2tidXM7CisJLyoKKwkgKiBGaW5kIHRoZSBlbmQgb2YgdGhlIHFmcmVlemUgbGlzdC4gIFRoZSBmaXJzdCBlbGVtZW50IGhhcworCSAqIHRvIGJlIHRyZWF0ZWQgc3BlY2lhbGx5LgorCSAqLworCWJtb3YJU0NCUFRSLCBDT01QTEVURV9PTl9RRlJFRVpFX0hFQUQsIDI7CisJY21wIAlTQ0JfTkVYVF9DT01QTEVURVsxXSwgU0NCX0xJU1RfTlVMTCBqZSBqb2luX2xpc3RzOworCS8qCisJICogTm93IHRoZSBub3JtYWwgbG9vcC4KKwkgKi8KKwlibW92CVNDQlBUUiwgU0NCX05FWFRfQ09NUExFVEUsIDI7CisJY21wIAlTQ0JfTkVYVF9DT01QTEVURVsxXSwgU0NCX0xJU1RfTlVMTCBqbmUgLiAtIDE7Citqb2luX2xpc3RzOgorCWJtb3YJU0NCX05FWFRfQ09NUExFVEUsIENPTVBMRVRFX1NDQl9IRUFELCAyOworCWJtb3YJQ09NUExFVEVfU0NCX0hFQUQsIENPTVBMRVRFX09OX1FGUkVFWkVfSEVBRCwgMjsKKwltdmkJQ09NUExFVEVfT05fUUZSRUVaRV9IRUFEWzFdLCBTQ0JfTElTVF9OVUxMOworCWptcAlpZGxlX2xvb3BfY2hlY2tidXM7CitjaGVja193YWl0aW5nX2xpc3Q6CiAJY21wCVdBSVRJTkdfVElEX0hFQURbMV0sIFNDQl9MSVNUX05VTEwgamUgaWRsZV9sb29wX2NoZWNrYnVzOwogCS8qCiAJICogRU5TRUxPIGlzIGNsZWFyZWQgYnkgYSBTRUxETywgc28gd2UgbXVzdCB0ZXN0IGZvciBTRUxETwogCSAqIG9uZSBsYXN0IHRpbWUuCiAJICovCi1CRUdJTl9DUklUSUNBTDsKIAl0ZXN0CVNTVEFUMCwgU0VMRE8gam56IHNlbGVjdF9vdXQ7CiBFTkRfQ1JJVElDQUw7CiAJY2FsbAlzdGFydF9zZWxlY3Rpb247CkBAIC05MCw2ICsxMjQsMTMgQEAKIAl0ZXN0CVNTVEFUMiwgTk9OUEFDS1JFUSBqeiAuICsgMjsKIAljYWxsCXVuZXhwZWN0ZWRfbm9ucGt0X3BoYXNlX2ZpbmRfY3R4dDsKIAlpZiAoKGFoZC0+YnVncyAmIEFIRF9GQUlOVF9MRURfQlVHKSAhPSAwKSB7CisJCS8qCisJCSAqIE9uIFJldiBBLiBoYXJkd2FyZSwgdGhlIGJ1c3kgTEVEIGlzIG9ubHkKKwkJICogdHVybmVkIG9uIGF1dG9tYWljYWxseSBkdXJpbmcgc2VsZWN0aW9ucworCQkgKiBhbmQgcmUtc2VsZWN0aW9ucy4gIE1ha2UgdGhlIExFRCBzdGF0dXMKKwkJICogbW9yZSB1c2VmdWwgYnkgZm9yY2luZyBpdCB0byBiZSBvbiBzbworCQkgKiBsb25nIGFzIG9uZSBvZiBvdXIgZGF0YSBGSUZPcyBpcyBhY3RpdmUuCisJCSAqLwogCQlhbmQJQSwgRklGTzBGUkVFfEZJRk8xRlJFRSwgREZGU1RBVDsKIAkJY21wCUEsIEZJRk8wRlJFRXxGSUZPMUZSRUUgam5lIC4gKyAzOwogCQlhbmQJU0JMS0NUTCwgfkRJQUdMRURFTnxESUFHTEVET047CkBAIC0xMDEsOSArMTQyLDkgQEAKIAljYWxsCWlkbGVfbG9vcF9jY2hhbjsKIAlqbXAJaWRsZV9sb29wOwogCi1CRUdJTl9DUklUSUNBTDsKIGlkbGVfbG9vcF9nc2ZpZm86CiAJU0VUX01PREUoTV9TQ1NJLCBNX1NDU0kpCitCRUdJTl9DUklUSUNBTDsKIGlkbGVfbG9vcF9nc2ZpZm9faW5fc2NzaV9tb2RlOgogCXRlc3QJTFFJU1RBVDIsIExRSUdTQVZBSUwganogcmV0dXJuOwogCS8qCkBAIC0xNTIsMTEgKzE5MywxNSBAQAogCiBpZGxlX2xvb3Bfc2VydmljZV9maWZvczoKIAlTRVRfTU9ERShNX0RGRjAsIE1fREZGMCkKK0JFR0lOX0NSSVRJQ0FMOwogCXRlc3QJTE9OR0pNUF9BRERSWzFdLCBJTlZBTElEX0FERFIgam56IGlkbGVfbG9vcF9uZXh0X2ZpZm87CiAJY2FsbAlsb25nam1wOworRU5EX0NSSVRJQ0FMOwogaWRsZV9sb29wX25leHRfZmlmbzoKIAlTRVRfTU9ERShNX0RGRjEsIE1fREZGMSkKK0JFR0lOX0NSSVRJQ0FMOwogCXRlc3QJTE9OR0pNUF9BRERSWzFdLCBJTlZBTElEX0FERFIganogbG9uZ2ptcDsKK0VORF9DUklUSUNBTDsKIHJldHVybjoKIAlyZXQ7CiAKQEAgLTE3MCw3ICsyMTUsNiBAQAogCXRlc3QJQ0NTQ0JDVEwsIENDQVJSRU58Q0NTQ0JFTiBqeiBzY2JkbWFfaWRsZTsKIAl0ZXN0CUNDU0NCQ1RMLCBDQ1NDQkRJUiBqbnogZmV0Y2hfbmV3X3NjYl9pbnByb2c7CiAJdGVzdAlDQ1NDQkNUTCwgQ0NTQ0JET05FIGp6IHJldHVybjsKLUVORF9DUklUSUNBTDsKIAkvKiBGQUxMVEhST1VHSCAqLwogc2NiZG1hX3RvaG9zdF9kb25lOgogCXRlc3QJQ0NTQ0JDVEwsIENDQVJSRU4ganogZmlsbF9xb3V0Zmlmb19kbWFkb25lOwpAQCAtMTgwLDI2ICsyMjQsMTggQEAKIAkgKiBiYWQgU0NTSSBzdGF0dXMgKGN1cnJlbnRseSBvbmx5IGZvciB1bmRlcnJ1bnMpLCB3ZQogCSAqIHF1ZXVlIHRoZSBTQ0IgZm9yIG5vcm1hbCBjb21wbGV0aW9uLiAgT3RoZXJ3aXNlLCB3ZQogCSAqIHdhaXQgdW50aWwgYW55IHNlbGVjdC1vdXQgYWN0aXZpdHkgaGFzIGhhbHRlZCwgYW5kCi0JICogdGhlbiBub3RpZnkgdGhlIGhvc3Qgc28gdGhhdCB0aGUgdHJhbnNhY3Rpb24gY2FuIGJlCi0JICogZGVhbHQgd2l0aC4KKwkgKiB0aGVuIHF1ZXVlIHRoZSBjb21wbGV0aW9uLgogCSAqLwotCXRlc3QJU0NCX1NDU0lfU1RBVFVTLCAweGZmIGpueiBzY2JkbWFfbm90aWZ5X2hvc3Q7CiAJYW5kCUNDU0NCQ1RMLCB+KENDQVJSRU58Q0NTQ0JFTik7CiAJYm1vdglDT01QTEVURV9ETUFfU0NCX0hFQUQsIFNDQl9ORVhUX0NPTVBMRVRFLCAyOworCWNtcAlTQ0JfTkVYVF9DT01QTEVURVsxXSwgU0NCX0xJU1RfTlVMTCBqbmUgLiArIDI7CisJbXZpCUNPTVBMRVRFX0RNQV9TQ0JfVEFJTFsxXSwgU0NCX0xJU1RfTlVMTDsKKwl0ZXN0CVNDQl9TQ1NJX1NUQVRVUywgMHhmZiBqeiBzY2JkbWFfcXVldWVfY29tcGxldGlvbjsKKwlibW92CVNDQl9ORVhUX0NPTVBMRVRFLCBDT01QTEVURV9PTl9RRlJFRVpFX0hFQUQsIDI7CisJYm1vdglDT01QTEVURV9PTl9RRlJFRVpFX0hFQUQsIFNDQlBUUiwgMiByZXQ7CitzY2JkbWFfcXVldWVfY29tcGxldGlvbjoKIAlibW92CVNDQl9ORVhUX0NPTVBMRVRFLCBDT01QTEVURV9TQ0JfSEVBRCwgMjsKIAlibW92CUNPTVBMRVRFX1NDQl9IRUFELCBTQ0JQVFIsIDIgcmV0Owotc2NiZG1hX25vdGlmeV9ob3N0OgotCVNFVF9NT0RFKE1fU0NTSSwgTV9TQ1NJKQotCXRlc3QJU0NTSVNFUTAsIEVOU0VMTyBqbnogcmV0dXJuOwotCXRlc3QJU1NUQVQwLCAoU0VMRE98U0VMSU5HTykgam56IHJldHVybjsKLQlTRVRfTU9ERShNX0NDSEFOLCBNX0NDSEFOKQotCS8qCi0JICogUmVtb3ZlIFNDQiBhbmQgbm90aWZ5IGhvc3QuCi0JICovCi0JYW5kCUNDU0NCQ1RMLCB+KENDQVJSRU58Q0NTQ0JFTik7Ci0JYm1vdglDT01QTEVURV9ETUFfU0NCX0hFQUQsIFNDQl9ORVhUX0NPTVBMRVRFLCAyOwotCVNFVF9TRVFJTlRDT0RFKEJBRF9TQ0JfU1RBVFVTKQotCXJldDsKIGZpbGxfcW91dGZpZm9fZG1hZG9uZToKIAlhbmQJQ0NTQ0JDVEwsIH4oQ0NBUlJFTnxDQ1NDQkVOKTsKIAljYWxsCXFvdXRmaWZvX3VwZGF0ZWQ7CkBAIC0yMDgsNiArMjQ0LDcgQEAKIAl0ZXN0CVFPRkZfQ1RMU1RBLCBTRFNDQl9ST0xMT1ZSIGp6IHJldHVybjsKIAlibW92CVFPVVRGSUZPX05FWFRfQUREUiwgU0hBUkVEX0RBVEFfQUREUiwgNDsKIAl4b3IJUU9VVEZJRk9fRU5UUllfVkFMSURfVEFHLCBRT1VURklGT19FTlRSWV9WQUxJRF9UT0dHTEUgcmV0OworRU5EX0NSSVRJQ0FMOwogCiBxb3V0Zmlmb191cGRhdGVkOgogCS8qCkBAIC0zMjQsMTQgKzM2MSwxNSBAQAogCSAqIEtlZXAgdHJhY2sgb2YgdGhlIFNDQnMgd2UgYXJlIGRtYWluZyBqdXN0CiAJICogaW4gY2FzZSB0aGUgRE1BIGZhaWxzIG9yIGlzIGFib3J0ZWQuCiAJICovCi0JbW92CUEsIFFPVVRGSUZPX0VOVFJZX1ZBTElEX1RBRzsKIAlibW92CUNPTVBMRVRFX1NDQl9ETUFJTlBST0dfSEVBRCwgQ09NUExFVEVfU0NCX0hFQUQsIDI7CiAJbXZpCUNDU0NCQ1RMLCBDQ1NDQlJFU0VUOwogCWJtb3YJU0NCSEFERFIsIFFPVVRGSUZPX05FWFRfQUREUiwgNDsKKwltb3YJQSwgUU9VVEZJRk9fTkVYVF9BRERSOwogCWJtb3YJU0NCUFRSLCBDT01QTEVURV9TQ0JfSEVBRCwgMjsKIGZpbGxfcW91dGZpZm9fbG9vcDoKLQltb3YJQ0NTQ0JSQU0sIFNDQlBUUjsKLQlvcglDQ1NDQlJBTSwgQSwgU0NCUFRSWzFdOworCWJtb3YJQ0NTQ0JSQU0sIFNDQlBUUiwgMjsKKwltb3YJQ0NTQ0JSQU0sIFNDQl9TR1BUUlswXTsKKwltb3YJQ0NTQ0JSQU0sIFFPVVRGSUZPX0VOVFJZX1ZBTElEX1RBRzsKIAltb3YJTk9ORSwgU0RTQ0JfUU9GRjsKIAlpbmMJSU5UX0NPQUxFU0NJTkdfQ01EQ09VTlQ7CiAJYWRkCUNNRFNfUEVORElORywgLTE7CkBAIC0zMzksNiArMzc3LDE4IEBACiAJY21wCVNDQl9ORVhUX0NPTVBMRVRFWzFdLCBTQ0JfTElTVF9OVUxMIGplIGZpbGxfcW91dGZpZm9fZG9uZTsKIAljbXAJQ0NTQ0JBRERSLCBDQ1NDQkFERFJfTUFYIGplIGZpbGxfcW91dGZpZm9fZG9uZTsKIAl0ZXN0CVFPRkZfQ1RMU1RBLCBTRFNDQl9ST0xMT1ZSIGpueiBmaWxsX3FvdXRmaWZvX2RvbmU7CisJLyoKKwkgKiBEb24ndCBjcm9zcyBhbiBBREIgb3IgQ2FjaGxpbmUgYm91bmRhcnkgd2hlbiBETUEnaW5nCisJICogY29tcGxldGlvbiBlbnRyaWVzLiAgSW4gUENJIG1vZGUsIGF0IGxlYXN0IGluIDMyLzMzCisJICogY29uZmlndXJhdGlvbnMsIHRoZSBTQ0IgRE1BIGVuZ2luZSBtYXkgbG9zZSBpdHMgcGxhY2UKKwkgKiBpbiB0aGUgZGF0YS1zdHJlYW0gc2hvdWxkIHRoZSB0YXJnZXQgZm9yY2UgYSByZXRyeSBvbgorCSAqIHNvbWV0aGluZyBvdGhlciB0aGFuIGFuIDhieXRlIGFsaWduZWQgYm91bmRhcnkuIEluCisJICogUENJLVggbW9kZSwgd2UgZG8gdGhpcyB0byBhdm9pZCBzcGxpdCB0cmFuc2FjdGlvbnMgc2luY2UKKwkgKiBtYW55IGNoaXBzZXRzIHNlZW0gdG8gYmUgdW5hYmxlIHRvIGZvcm1hdCBwcm9wZXIgc3BsaXQKKwkgKiBjb21wbGV0aW9ucyB0byBjb250aW51ZSB0aGUgZGF0YSB0cmFuc2Zlci4KKwkgKi8KKwlhZGQJU0lOREVYLCBBLCBDQ1NDQkFERFI7CisJdGVzdAlTSU5ERVgsIENBQ0hFTElORV9NQVNLIGp6IGZpbGxfcW91dGZpZm9fZG9uZTsKIAlibW92CVNDQlBUUiwgU0NCX05FWFRfQ09NUExFVEUsIDI7CiAJam1wCWZpbGxfcW91dGZpZm9fbG9vcDsKIGZpbGxfcW91dGZpZm9fZG9uZToKQEAgLTM1NCw3ICs0MDQsNiBAQAogCWJtb3YJU0NCUFRSLCBDT01QTEVURV9ETUFfU0NCX0hFQUQsIDI7CiAJYm1vdglTQ0JIQUREUiwgU0NCX0JVU0FERFIsIDQ7CiAJbXZpCUNDQVJSRU58Q0NTQ0JFTnxDQ1NDQlJFU0VUIGptcCBkbWFfc2NiOwotRU5EX0NSSVRJQ0FMOwogCiAvKgogICogRWl0aGVyIHBvc3Qgb3IgZmV0Y2ggYW4gU0NCIGZyb20gaG9zdCBtZW1vcnkuICBUaGUgY2FsbGVyCkBAIC0zNzEsOSArNDIwLDE5IEBACiAJbXZpCVNDQkhDTlQsIFNDQl9UUkFOU0ZFUl9TSVpFOwogCW1vdglDQ1NDQkNUTCwgU0lOREVYIHJldDsKIAotQkVHSU5fQ1JJVElDQUw7CiBzZXRqbXA6Ci0JYm1vdglMT05HSk1QX0FERFIsIFNUQUNLLCAyIHJldDsKKwkvKgorCSAqIEF0IGxlYXN0IG9uIHRoZSBBLCBhIHJldHVybiBpbiB0aGUgc2FtZQorCSAqIGluc3RydWN0aW9uIGFzIHRoZSBibW92IHJlc3VsdHMgaW4gYSByZXR1cm4KKwkgKiB0byB0aGUgY2FsbGVyLCBub3QgdG8gdGhlIG5ldyBhZGRyZXNzIGF0IHRoZQorCSAqIHRvcCBvZiB0aGUgc3RhY2suICBTaW5jZSB3ZSB3YW50IHRoZSBsYXR0ZXIKKwkgKiAod2UgdXNlIHNldGptcCB0byByZWdpc3RlciBhIGhhbmRsZXIgZnJvbSBhbgorCSAqIGludGVycnVwdCBjb250ZXh0IGJ1dCBub3QgaW52b2tlIHRoYXQgaGFuZGxlcgorCSAqIHVudGlsIHdlIHJldHVybiB0byBvdXIgaWRsZSBsb29wKSwgdXNlIGEKKwkgKiBzZXBhcmF0ZSByZXQgaW5zdHJ1Y3Rpb24uCisJICovCisJYm1vdglMT05HSk1QX0FERFIsIFNUQUNLLCAyOworCXJldDsKIHNldGptcF9pbmxpbmU6CiAJYm1vdglMT05HSk1QX0FERFIsIFNUQUNLLCAyOwogbG9uZ2ptcDoKQEAgLTM5MiwxMSArNDUxLDYgQEAKIAltdmkJU0VRSU5UQ1RMLCBJTlRWRUMxRFNMOwogCW1vdglNT0RFX1BUUiwgU0lOREVYOwogCWNscglTRVFJTlRDVEwgcmV0OwotCi10b2dnbGVfZGZmX21vZGVfd29ya19hcm91bmQ6Ci0JbXZpCVNFUUlOVENUTCwgSU5UVkVDMURTTDsKLQl4b3IJTU9ERV9QVFIsIE1LX01PREUoTV9ERkYxLCBNX0RGRjEpOwotCWNscglTRVFJTlRDVEwgcmV0OwogfQogCiAKQEAgLTQ5MCw2ICs1NDQsMjEgQEAKIFNFVF9TUkNfTU9ERQlNX1NDU0k7CiBTRVRfRFNUX01PREUJTV9TQ1NJOwogc2VsZWN0X2luOgorCWlmICgoYWhkLT5idWdzICYgQUhEX0ZBSU5UX0xFRF9CVUcpICE9IDApIHsKKwkJLyoKKwkJICogT24gUmV2IEEuIGhhcmR3YXJlLCB0aGUgYnVzeSBMRUQgaXMgb25seQorCQkgKiB0dXJuZWQgb24gYXV0b21haWNhbGx5IGR1cmluZyBzZWxlY3Rpb25zCisJCSAqIGFuZCByZS1zZWxlY3Rpb25zLiAgTWFrZSB0aGUgTEVEIHN0YXR1cworCQkgKiBtb3JlIHVzZWZ1bCBieSBmb3JjaW5nIGl0IHRvIGJlIG9uIGZyb20KKwkJICogdGhlIHBvaW50IG9mIHNlbGVjdGlvbiB1bnRpbCBvdXIgaWRsZQorCQkgKiBsb29wIGRldGVybWluZXMgdGhhdCBuZWl0aGVyIG9mIG91ciBGSUZPcworCQkgKiBhcmUgYnVzeS4gIFRoaXMgaGFuZGxlcyB0aGUgbm9uLXBhY2tldGl6ZWQKKwkJICogY2FzZSBuaWNlbHkgYXMgd2Ugd2lsbCBub3QgcmV0dXJuIHRvIHRoZQorCQkgKiBpZGxlIGxvb3AgdW50aWwgdGhlIGJ1c2ZyZWUgYXQgdGhlIGVuZCBvZgorCQkgKiBlYWNoIHRyYW5zYWN0aW9uLgorCQkgKi8KKwkJb3IJU0JMS0NUTCwgRElBR0xFREVOfERJQUdMRURPTjsKKwl9CiAJaWYgKChhaGQtPmJ1Z3MgJiBBSERfQlVTRlJFRVJFVl9CVUcpICE9IDApIHsKIAkJLyoKIAkJICogVGVzdCB0byBlbnN1cmUgdGhhdCB0aGUgYnVzIGhhcyBub3QKQEAgLTUyOCw2ICs1OTcsMjEgQEAKIFNFVF9EU1RfTU9ERQlNX1NDU0k7CiBzZWxlY3Rfb3V0OgogQkVHSU5fQ1JJVElDQUw7CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfRkFJTlRfTEVEX0JVRykgIT0gMCkgeworCQkvKgorCQkgKiBPbiBSZXYgQS4gaGFyZHdhcmUsIHRoZSBidXN5IExFRCBpcyBvbmx5CisJCSAqIHR1cm5lZCBvbiBhdXRvbWFpY2FsbHkgZHVyaW5nIHNlbGVjdGlvbnMKKwkJICogYW5kIHJlLXNlbGVjdGlvbnMuICBNYWtlIHRoZSBMRUQgc3RhdHVzCisJCSAqIG1vcmUgdXNlZnVsIGJ5IGZvcmNpbmcgaXQgdG8gYmUgb24gZnJvbQorCQkgKiB0aGUgcG9pbnQgb2YgcmUtc2VsZWN0aW9uIHVudGlsIG91ciBpZGxlCisJCSAqIGxvb3AgZGV0ZXJtaW5lcyB0aGF0IG5laXRoZXIgb2Ygb3VyIEZJRk9zCisJCSAqIGFyZSBidXN5LiAgVGhpcyBoYW5kbGVzIHRoZSBub24tcGFja2V0aXplZAorCQkgKiBjYXNlIG5pY2VseSBhcyB3ZSB3aWxsIG5vdCByZXR1cm4gdG8gdGhlCisJCSAqIGlkbGUgbG9vcCB1bnRpbCB0aGUgYnVzZnJlZSBhdCB0aGUgZW5kIG9mCisJCSAqIGVhY2ggdHJhbnNhY3Rpb24uCisJCSAqLworCQlvcglTQkxLQ1RMLCBESUFHTEVERU58RElBR0xFRE9OOworCX0KIAkvKiBDbGVhciBvdXQgYWxsIFNDQnMgdGhhdCBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IHNlbnQuICovCiAJaWYgKChhaGQtPmJ1Z3MgJiBBSERfU0VOVF9TQ0JfVVBEQVRFX0JVRykgIT0gMCkgewogCQkvKgpAQCAtMTAwMCwxNSArMTA4NCw5IEBACiAvKgogICogV2UgcmVjZWl2ZWQgYSAiY29tbWFuZCBjb21wbGV0ZSIgbWVzc2FnZS4gIFB1dCB0aGUgU0NCIG9uIHRoZSBjb21wbGV0ZQogICogcXVldWUgYW5kIHRyaWdnZXIgYSBjb21wbGV0aW9uIGludGVycnVwdCB2aWEgdGhlIGlkbGUgbG9vcC4gIEJlZm9yZSBkb2luZwotICogc28sIGNoZWNrIHRvIHNlZSBpZiB0aGVyZQotICogaXMgYSByZXNpZHVhbCBvciB0aGUgc3RhdHVzIGJ5dGUgaXMgc29tZXRoaW5nIG90aGVyIHRoYW4gU1RBVFVTX0dPT0QgKDApLgotICogSW4gZWl0aGVyIG9mIHRoZXNlIGNvbmRpdGlvbnMsIHdlIHVwbG9hZCB0aGUgU0NCIGJhY2sgdG8gdGhlIGhvc3Qgc28gaXQgY2FuCi0gKiBwcm9jZXNzIHRoaXMgaW5mb3JtYXRpb24uICBJbiB0aGUgY2FzZSBvZiBhIG5vbiB6ZXJvIHN0YXR1cyBieXRlLCB3ZSAKLSAqIGFkZGl0aW9uYWxseSBpbnRlcnJ1cHQgdGhlIGtlcm5lbCBkcml2ZXIgc3luY2hyb25vdXNseSwgYWxsb3dpbmcgaXQgdG8KLSAqIGRlY2lkZSBpZiBzZW5zZSBzaG91bGQgYmUgcmV0cmlldmVkLiAgSWYgdGhlIGtlcm5lbCBkcml2ZXIgd2lzaGVzIHRvIHJlcXVlc3QKLSAqIHNlbnNlLCBpdCB3aWxsIGZpbGwgdGhlIGtlcm5lbCBTQ0Igd2l0aCBhIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZCwgcmVxdWV1ZQotICogaXQgdG8gdGhlIFFJTkZJRk8gYW5kIHRlbGwgdXMgbm90IHRvIHBvc3QgdG8gdGhlIFFPVVRGSUZPIGJ5IHNldHRpbmcgCi0gKiBSRVRVUk5fMSB0byBTRU5EX1NFTlNFLgorICogc28sIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHJlc2lkdWFsIG9yIHRoZSBzdGF0dXMgYnl0ZSBpcyBzb21ldGhpbmcKKyAqIG90aGVyIHRoYW4gU1RBVFVTX0dPT0QgKDApLiAgSW4gZWl0aGVyIG9mIHRoZXNlIGNvbmRpdGlvbnMsIHdlIHVwbG9hZCB0aGUKKyAqIFNDQiBiYWNrIHRvIHRoZSBob3N0IHNvIGl0IGNhbiBwcm9jZXNzIHRoaXMgaW5mb3JtYXRpb24uCiAgKi8KIG1lc2dpbl9jb21wbGV0ZToKIApAQCAtMTA1Myw2ICsxMTMxLDcgQEAKIAljYWxsCXF1ZXVlX3NjYl9jb21wbGV0aW9uOwogCWptcAlhd2FpdF9idXNmcmVlOwogCitCRUdJTl9DUklUSUNBTDsKIGZyZWV6ZV9xdWV1ZToKIAkvKiBDYW5jZWwgYW55IHBlbmRpbmcgc2VsZWN0LW91dC4gKi8KIAl0ZXN0CVNTVEFUMCwgU0VMRE98U0VMSU5HTyBqbnogLiArIDI7CkBAIC0xMDYzLDYgKzExNDIsNyBAQAogCWFkYwlRRlJFRVpFX0NPVU5UWzFdLCBBOwogCW9yCVNFUV9GTEFHUzIsIFNFTEVDVE9VVF9RRlJPWkVOOwogCW1vdglBLCBBQ0NVTV9TQVZFIHJldDsKK0VORF9DUklUSUNBTDsKIAogLyoKICAqIENvbXBsZXRlIHRoZSBjdXJyZW50IEZJRk8ncyBTQ0IgaWYgZGF0YSBmb3IgdGhpcyBzYW1lCkBAIC0xMDg1LDggKzExNjUsMTAgQEAKIAl0ZXN0CVNDQl9TR1BUUiwgU0dfRlVMTF9SRVNJRCBqbnogdXBsb2FkX3NjYjsvKiBOZXZlciB4ZmVyZWQgKi8KIAl0ZXN0CVNDQl9SRVNJRFVBTF9TR1BUUiwgU0dfTElTVF9OVUxMIGp6IHVwbG9hZF9zY2I7CiBjb21wbGV0ZToKK0JFR0lOX0NSSVRJQ0FMOwogCWJtb3YJU0NCX05FWFRfQ09NUExFVEUsIENPTVBMRVRFX1NDQl9IRUFELCAyOwogCWJtb3YJQ09NUExFVEVfU0NCX0hFQUQsIFNDQlBUUiwgMiByZXQ7CitFTkRfQ1JJVElDQUw7CiBiYWRfc3RhdHVzOgogCWNtcAlTQ0JfU0NTSV9TVEFUVVMsIFNUQVRVU19QS1RfU0VOU0UgamUgdXBsb2FkX3NjYjsKIAljYWxsCWZyZWV6ZV9xdWV1ZTsKQEAgLTEwOTcsOSArMTE3OSwxOCBAQAogCSAqIGl0IG9uIHRoZSBob3N0LgogCSAqLwogCWJtb3YJU0NCX1RBRywgU0NCUFRSLCAyOwotCWJtb3YJU0NCX05FWFRfQ09NUExFVEUsIENPTVBMRVRFX0RNQV9TQ0JfSEVBRCwgMjsKK0JFR0lOX0NSSVRJQ0FMOworCW9yCVNDQl9TR1BUUiwgU0dfU1RBVFVTX1ZBTElEOworCW12aQlTQ0JfTkVYVF9DT01QTEVURVsxXSwgU0NCX0xJU1RfTlVMTDsKKwljbXAJQ09NUExFVEVfRE1BX1NDQl9IRUFEWzFdLCBTQ0JfTElTVF9OVUxMIGpuZSBhZGRfZG1hX3NjYl90YWlsOwogCWJtb3YJQ09NUExFVEVfRE1BX1NDQl9IRUFELCBTQ0JQVFIsIDI7Ci0Jb3IJU0NCX1NHUFRSLCBTR19TVEFUVVNfVkFMSUQgcmV0OworCWJtb3YJQ09NUExFVEVfRE1BX1NDQl9UQUlMLCBTQ0JQVFIsIDIgcmV0OworYWRkX2RtYV9zY2JfdGFpbDoKKwlibW92CVJFRzAsIFNDQlBUUiwgMjsKKwlibW92CVNDQlBUUiwgQ09NUExFVEVfRE1BX1NDQl9UQUlMLCAyOworCWJtb3YJU0NCX05FWFRfQ09NUExFVEUsIFJFRzAsIDI7CisJYm1vdglDT01QTEVURV9ETUFfU0NCX1RBSUwsIFJFRzAsIDIgcmV0OworRU5EX0NSSVRJQ0FMOwogCiAvKgogICogSXMgaXQgYSBkaXNjb25uZWN0IG1lc3NhZ2U/ICBTZXQgYSBmbGFnIGluIHRoZSBTQ0IgdG8gcmVtaW5kIHVzCkBAIC0xMTQ2LDggKzEyMzcsMTggQEAKIGF3YWl0X2J1c2ZyZWVfY2xyY2huOgogCW12aQlERkZTWEZSQ1RMLCBDTFJDSE47CiBhd2FpdF9idXNmcmVlX25vdF9tX2RmZjoKLQljYWxsCWNsZWFyX3RhcmdldF9zdGF0ZTsKKwkvKiBjbGVhciB0YXJnZXQgc3BlY2lmaWMgZmxhZ3MgKi8KKwltdmkJU0VRX0ZMQUdTLCBOT1RfSURFTlRJRklFRHxOT19DREJfU0VOVDsKIAl0ZXN0CVNTVEFUMSxSRVFJTklUfEJVU0ZSRUUJanogLjsKKwkvKgorCSAqIFdlIG9ubHkgc2V0IEJVU0ZSRUUgc3RhdHVzIG9uY2UgZWl0aGVyIGEgbmV3CisJICogcGhhc2UgaGFzIGJlZW4gZGV0ZWN0ZWQgb3Igd2UgYXJlIHJlYWxseQorCSAqIEJVU0ZSRUUuICBUaGlzIGFsbG93cyB0aGUgZHJpdmVyIHRvIGtub3cKKwkgKiB0aGF0IHdlIGFyZSBhY3RpdmUgb24gdGhlIGJ1cyBldmVuIHRob3VnaAorCSAqIG5vIGlkZW50aWZpZWQgdHJhbnNhY3Rpb24gZXhpc3RzIHNob3VsZCBhCisJICogdGltZW91dCBvY2N1ciB3aGlsZSBhd2FpdGluZyBidXNmcmVlLgorCSAqLworCW12aQlMQVNUUEhBU0UsIFBfQlVTRlJFRTsKIAl0ZXN0CVNTVEFUMSwgQlVTRlJFRSBqbnogaWRsZV9sb29wOwogCVNFVF9TRVFJTlRDT0RFKE1JU1NFRF9CVVNGUkVFKQogCkBAIC0xMjAyLDExICsxMzAzLDYgQEAKIAljYWxsCWFsbG9jYXRlX2ZpZm87CiAJam1wCW1lc2dpbl9kb25lOwogCi1jbGVhcl90YXJnZXRfc3RhdGU6Ci0JbXZpCUxBU1RQSEFTRSwgUF9CVVNGUkVFOwotCS8qIGNsZWFyIHRhcmdldCBzcGVjaWZpYyBmbGFncyAqLwotCW12aQlTRVFfRkxBR1MsIE5PVF9JREVOVElGSUVEfE5PX0NEQl9TRU5UIHJldDsKLQogcGhhc2VfbG9jazogICAgIAogCWlmICgoYWhkLT5idWdzICYgQUhEX0VBUkxZX1JFUV9CVUcpICE9IDApIHsKIAkJLyoKQEAgLTEyOTgsNiArMTM5NCw0NyBAQAogCXRlc3QJQ0NTR0NUTCwgQ0NTR0VOQUNLIGpueiByZXR1cm47CiAKIAkvKgorCSAqIFNob3VsZCB0aGUgb3RoZXIgRklGTyBnZXQgdGhlIFMvRyBjYWNoZSBmaXJzdD8gIElmCisJICogYm90aCBGSUZPcyBoYXZlIGJlZW4gYWxsb2NhdGVkIHNpbmNlIHdlIGxhc3QgY2hlY2tlZAorCSAqIGFueSBGSUZPLCBpdCBpcyBpbXBvcnRhbnQgdGhhdCB3ZSBzZXJ2aWNlIGEgRklGTworCSAqIHRoYXQgaXMgbm90IGFjdGl2ZWx5IG9uIHRoZSBidXMgZmlyc3QuICBUaGlzIGd1YXJhbnRlZXMKKwkgKiB0aGF0IGEgRklGTyB3aWxsIGJlIGZyZWVkIHRvIGhhbmRsZSBzbmFwc2hvdCByZXF1ZXN0cyBmb3IKKwkgKiBhbnkgRklGTyB0aGF0IGlzIHN0aWxsIG9uIHRoZSBidXMuICBDaGlwcyB3aXRoIFJUSSBkbyBub3QKKwkgKiBwZXJmb3JtIHNuYXBzaG90cywgc28gZG9uJ3QgYm90aGVyIHdpdGggdGhpcyB0ZXN0IHRoZXJlLgorCSAqLworCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9SVEkpID09IDApIHsKKwkJLyoKKwkJICogSWYgd2UncmUgbm90IHN0aWxsIHJlY2VpdmluZyBTQ1NJIGRhdGEsCisJCSAqIGl0IGlzIHNhZmUgdG8gYWxsb2NhdGUgdGhlIFMvRyBjYWNoZSB0bworCQkgKiB0aGlzIEZJRk8uCisJCSAqLworCQl0ZXN0CURGQ05UUkwsIFNDU0lFTiBqeiBpZGxlX3NnZmV0Y2hfc3RhcnQ7CisKKwkJLyoKKwkJICogU3dpdGNoIHRvIHRoZSBvdGhlciBGSUZPLiAgTm9uLVJUSSBjaGlwcworCQkgKiBhbHNvIGhhdmUgdGhlICJzZXQgbW9kZSIgYnVnLCBzbyB3ZSBtdXN0CisJCSAqIGRpc2FibGUgaW50ZXJydXB0cyBkdXJpbmcgdGhlIHN3aXRjaC4KKwkJICovCisJCW12aQlTRVFJTlRDVEwsIElOVFZFQzFEU0w7CisJCXhvcglNT0RFX1BUUiwgTUtfTU9ERShNX0RGRjEsIE1fREZGMSk7CisKKwkJLyoKKwkJICogSWYgdGhlIG90aGVyIEZJRk8gbmVlZHMgbG9hZGluZywgdGhlbiBpdAorCQkgKiBtdXN0IG5vdCBoYXZlIGNsYWltZWQgdGhlIFMvRyBjYWNoZSB5ZXQKKwkJICogKFNHX0NBQ0hFX0FWQUlMIHdvdWxkIGhhdmUgYmVlbiBjbGVhcmVkIGluCisJCSAqIHRoZSBvcmdpbmFsIEZJRk8gbW9kZSBhbmQgd2UgdGVzdCB0aGlzIGFib3ZlKS4KKwkJICogUmV0dXJuIHRvIHRoZSBpZGxlIGxvb3Agc28gd2UgY2FuIHByb2Nlc3MgdGhlCisJCSAqIEZJRk8gbm90IGN1cnJlbnRseSBvbiB0aGUgYnVzIGZpcnN0LgorCQkgKi8KKwkJdGVzdAlTR19TVEFURSwgTE9BRElOR19ORUVERUQganogaWRsZV9zZ2ZldGNoX29rYXk7CisJCWNscglTRVFJTlRDVEwgcmV0OworaWRsZV9zZ2ZldGNoX29rYXk6CisJCXhvcglNT0RFX1BUUiwgTUtfTU9ERShNX0RGRjEsIE1fREZGMSk7CisJCWNscglTRVFJTlRDVEw7CisJfQorCitpZGxlX3NnZmV0Y2hfc3RhcnQ6CisJLyoKIAkgKiBXZSBmZXRjaCBhICJjYWNoZWxpbmUgYWxpZ25lZCIgYW5kIHNpemVkIGFtb3VudCBvZiBkYXRhCiAJICogc28gd2UgZG9uJ3QgZW5kIHVwIHJlZmVyZW5jaW5nIGEgbm9uLWV4aXN0YW50IHBhZ2UuCiAJICogQ2FjaGVsaW5lIGFsaWduZWQgaXMgaW4gcXVvdGVzIGJlY2F1c2UgdGhlIGtlcm5lbCB3aWxsCkBAIC0xMzA4LDcgKzE0NDUsNyBAQAogCW12aQlTR0hDTlQsIFNHX1BSRUZFVENIX0NOVDsKIAlpZiAoKGFoZC0+YnVncyAmIEFIRF9SRUdfU0xPV19TRVRUTEVfQlVHKSAhPSAwKSB7CiAJCS8qCi0JCSAqIE5lZWQgdHdvIGluc3RydWN0aW9uIGJldHdlZW4gInRvdWNoZXMiIG9mIFNHSEFERFIuCisJCSAqIE5lZWQgdHdvIGluc3RydWN0aW9ucyBiZXR3ZWVuICJ0b3VjaGVzIiBvZiBTR0hBRERSLgogCQkgKi8KIAkJbm9wOwogCX0KQEAgLTE2NTgsNyArMTc5NSw3IEBACiAJCSAqIHNhdmVwb2ludGVyIGluIHRoZSBjdXJyZW50IEZJRk8uICBXZSBkbyB0aGlzIHNvIHRoYXQKIAkJICogYSBwZW5kaW5nIENUWFRET05FIG9yIFNBVkVQVFIgaXMgdmlzaWJsZSBpbiB0aGUgYWN0aXZlCiAJCSAqIEZJRk8uICBUaGlzIHN0YXR1cyBpcyB0aGUgb25seSB3YXkgd2UgY2FuIGRldGVjdCBpZiB3ZQotCQkgKiBoYXZlIGxvc3QgdGhlIHJhY2UgKGUuZy4gaG9zdCBwYXVzZWQgdXMpIGFuZCBvdXIgYXR0ZXB0cworCQkgKiBoYXZlIGxvc3QgdGhlIHJhY2UgKGUuZy4gaG9zdCBwYXVzZWQgdXMpIGFuZCBvdXIgYXR0ZW1wdHMKIAkJICogdG8gZGlzYWJsZSB0aGUgY2hhbm5lbCBvY2N1cnJlZCBhZnRlciBhbGwgUkVRcyB3ZXJlCiAJCSAqIGFscmVhZHkgc2VlbiBhbmQgYWNrZWQgKFJFUUlOSVQgbmV2ZXIgY29tZXMgdHJ1ZSkuCiAJCSAqLwpAQCAtMTY2Nyw3ICsxODA0LDcgQEAKIAkJdGVzdAlERkNOVFJMLCBESVJFQ1RJT04ganogaW50ZXJydXB0X3JldHVybjsKIAkJYW5kCURGQ05UUkwsIH5TQ1NJRU47CiBzbmFwc2hvdF93YWl0X2RhdGFfdmFsaWQ6Ci0JCXRlc3QJU0VRSU5UU1JDLCAoQ1RYVERPTkV8U0FWRVBUUlMpIGpueiBzbmFwc2hvdF9kYXRhX3ZhbGlkOworCQl0ZXN0CVNFUUlOVFNSQywgKENUWFRET05FfFNBVkVQVFJTKSBqbnogaW50ZXJydXB0X3JldHVybjsKIAkJdGVzdAlTU1RBVDEsIFJFUUlOSVQJanogc25hcHNob3Rfd2FpdF9kYXRhX3ZhbGlkOwogc25hcHNob3RfZGF0YV92YWxpZDoKIAkJb3IJREZDTlRSTCwgU0NTSUVOOwpAQCAtMTgzNCw3ICsxOTcxLDYgQEAKIAlkZWMJU0NCX0ZJRk9fVVNFX0NPVU5UOwogCXRlc3QJU0NCX0NPTlRST0wsIFNUQVRVU19SQ1ZEIGpueiBwa3RfY29tcGxldGVfc2NiX2lmX2ZpZm9zX2lkbGU7CiAJbXZpCURGRlNYRlJDVEwsIENMUkNITiByZXQ7Ci1FTkRfQ1JJVElDQUw7CiAKIC8qCiAgKiBMQVNUX1NFR19ET05FIHN0YXR1cyBoYXMgYmVlbiBzZWVuIGluIHRoZSBjdXJyZW50IEZJRk8uCkBAIC0xODQzLDcgKzE5NzksNiBAQAogICogQ2hlY2sgZm9yIG92ZXJydW4gYW5kIHNlZSBpZiB3ZSBjYW4gY29tcGxldGUgdGhpcyBjb21tYW5kLgogICovCiBwa3RfbGFzdF9zZWdfZG9uZToKLUJFR0lOX0NSSVRJQ0FMOwogCS8qCiAJICogTWFyayB0cmFuc2ZlciBhcyBjb21wbGV0ZWQuCiAJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2NvcmUuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfY29yZS5jCmluZGV4IDRlOGYwMGQuLmRiOGY1Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfY29yZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfY29yZS5jCkBAIC0zNyw5ICszNyw3IEBACiAgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqCi0gKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHguYyMyMDIgJAotICoKLSAqICRGcmVlQlNEJAorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3OXh4LmMjMjQ3ICQKICAqLwogCiAjaWZkZWYgX19saW51eF9fCkBAIC0zMzIsNiArMzMwLDE0IEBACiAJYWhkX291dGIoYWhkLCBTQ1NJU0VRMSwKIAkJIGFoZF9pbmIoYWhkLCBTQ1NJU0VRX1RFTVBMQVRFKSAmIChFTlNFTEl8RU5SU0VMSXxFTkFVVE9BVE5QKSk7CiAJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX0NDSEFOLCBBSERfTU9ERV9DQ0hBTik7CisKKwkvKgorCSAqIENsZWFyIGFueSBwZW5kaW5nIHNlcXVlbmNlciBpbnRlcnJ1cHQuICBJdCBpcyBubworCSAqIGxvbmdlciByZWxldmFudCBzaW5jZSB3ZSdyZSByZXNldHRpbmcgdGhlIFByb2dyYW0KKwkgKiBDb3VudGVyLgorCSAqLworCWFoZF9vdXRiKGFoZCwgQ0xSSU5ULCBDTFJTRVFJTlQpOworCiAJYWhkX291dGIoYWhkLCBTRVFDVEwwLCBGQVNUTU9ERXxTRVFSRVNFVCk7CiAJYWhkX3VucGF1c2UoYWhkKTsKIH0KQEAgLTM3MywxMyArMzc5LDcgQEAKIAlzYXZlZF9tb2RlcyA9IGFoZF9zYXZlX21vZGVzKGFoZCk7CiAKIAkvKgotCSAqIENvbXBsZXRlIGFueSBTQ0JzIHRoYXQganVzdCBmaW5pc2hlZCBiZWluZwotCSAqIERNQSdlZCBpbnRvIHRoZSBxb3V0Zmlmby4KLQkgKi8KLQlhaGRfcnVuX3FvdXRmaWZvKGFoZCk7Ci0KLQkvKgotCSAqIEZsdXNoIHRoZSBnb29kIHN0YXR1cyBGSUZPIGZvciBjb21wZWx0ZWQgcGFja2V0aXplZCBjb21tYW5kcy4KKwkgKiBGbHVzaCB0aGUgZ29vZCBzdGF0dXMgRklGTyBmb3IgY29tcGxldGVkIHBhY2tldGl6ZWQgY29tbWFuZHMuCiAJICovCiAJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOwogCXNhdmVkX3NjYnB0ciA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CkBAIC0zODcsOCArMzg3LDcgQEAKIAkJdV9pbnQgZmlmb19tb2RlOwogCQl1X2ludCBpOwogCQkKLQkJc2NiaWQgPSAoYWhkX2luYihhaGQsIEdTRklGTysxKSA8PCA4KQotCQkgICAgICB8IGFoZF9pbmIoYWhkLCBHU0ZJRk8pOworCQlzY2JpZCA9IGFoZF9pbncoYWhkLCBHU0ZJRk8pOwogCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKIAkJaWYgKHNjYiA9PSBOVUxMKSB7CiAJCQlwcmludGYoIiVzOiBXYXJuaW5nIC0gR1NGSUZPIFNDQiAlZCBpbnZhbGlkXG4iLApAQCAtNDAxLDIyICs0MDAsMzMgQEAKIAkJICogdGhlIGhvc3QgYmVmb3JlIGNvbXBsZXRpbmcgdGhlICBjb21tYW5kLgogCQkgKi8KIAkJZmlmb19tb2RlID0gMDsKK3Jlc2Nhbl9maWZvczoKIAkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogCQkJLyogVG9nZ2xlIHRvIHRoZSBvdGhlciBtb2RlLiAqLwogCQkJZmlmb19tb2RlIF49IDE7CiAJCQlhaGRfc2V0X21vZGVzKGFoZCwgZmlmb19tb2RlLCBmaWZvX21vZGUpOworCiAJCQlpZiAoYWhkX3NjYl9hY3RpdmVfaW5fZmlmbyhhaGQsIHNjYikgPT0gMCkKIAkJCQljb250aW51ZTsKIAogCQkJYWhkX3J1bl9kYXRhX2ZpZm8oYWhkLCBzY2IpOwogCiAJCQkvKgotCQkJICogQ2xlYXJpbmcgdGhpcyB0cmFuc2FjdGlvbiBpbiB0aGlzIEZJRk8gbWF5Ci0JCQkgKiBjYXVzZSBhIENGRzREQVRBIGZvciB0aGlzIHNhbWUgdHJhbnNhY3Rpb24KLQkJCSAqIHRvIGFzc2VydCBpbiB0aGUgb3RoZXIgRklGTy4gIE1ha2Ugc3VyZSB3ZQotCQkJICogbG9vcCBvbmUgbW9yZSB0aW1lIGFuZCBjaGVjayB0aGUgb3RoZXIgRklGTy4KKwkJCSAqIFJ1bm5pbmcgdGhpcyBGSUZPIG1heSBjYXVzZSBhIENGRzREQVRBIGZvcgorCQkJICogdGhpcyBzYW1lIHRyYW5zYWN0aW9uIHRvIGFzc2VydCBpbiB0aGUgb3RoZXIKKwkJCSAqIEZJRk8gb3IgYSBuZXcgc25hcHNob3QgU0FWRVBUUlMgaW50ZXJydXB0CisJCQkgKiBpbiB0aGlzIEZJRk8uICBFdmVuIHJ1bm5pbmcgYSBGSUZPIG1heSBub3QKKwkJCSAqIGNsZWFyIHRoZSB0cmFuc2FjdGlvbiBpZiB3ZSBhcmUgc3RpbGwgd2FpdGluZworCQkJICogZm9yIGRhdGEgdG8gZHJhaW4gdG8gdGhlIGhvc3QuIFdlIG11c3QgbG9vcAorCQkJICogdW50aWwgdGhlIHRyYW5zYWN0aW9uIGlzIG5vdCBhY3RpdmUgaW4gZWl0aGVyCisJCQkgKiBGSUZPIGp1c3QgdG8gYmUgc3VyZS4gIFJlc2V0IG91ciBsb29wIGNvdW50ZXIKKwkJCSAqIHNvIHdlIHdpbGwgdmlzaXQgYm90aCBGSUZPcyBhZ2FpbiBiZWZvcmUKKwkJCSAqIGRlY2xhcmluZyB0aGlzIHRyYW5zYWN0aW9uIGZpbmlzaGVkLiAgV2UKKwkJCSAqIGFsc28gZGVsYXkgYSBiaXQgc28gdGhhdCBzdGF0dXMgaGFzIGEgY2hhbmNlCisJCQkgKiB0byBjaGFuZ2UgYmVmb3JlIHdlIGxvb2sgYXQgdGhpcyBGSUZPIGFnYWluLgogCQkJICovCi0JCQlpID0gMDsKKwkJCWFoZF9kZWxheSgyMDApOworCQkJZ290byByZXNjYW5fZmlmb3M7CiAJCX0KIAkJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOwogCQlhaGRfc2V0X3NjYnB0cihhaGQsIHNjYmlkKTsKQEAgLTQyOSwxOSArNDM5LDI4IEBACiAJCQkvKgogCQkJICogVGhlIHRyYW5zZmVyIGNvbXBsZXRlZCB3aXRoIGEgcmVzaWR1YWwuCiAJCQkgKiBQbGFjZSB0aGlzIFNDQiBvbiB0aGUgY29tcGxldGUgRE1BIGxpc3QKLQkJCSAqIHNvIHRoYXQgd2UgVXBkYXRlIG91ciBpbi1jb3JlIGNvcHkgb2YgdGhlCisJCQkgKiBzbyB0aGF0IHdlIHVwZGF0ZSBvdXIgaW4tY29yZSBjb3B5IG9mIHRoZQogCQkJICogU0NCIGJlZm9yZSBjb21wbGV0aW5nIHRoZSBjb21tYW5kLgogCQkJICovCiAJCQlhaGRfb3V0YihhaGQsIFNDQl9TQ1NJX1NUQVRVUywgMCk7CiAJCQlhaGRfb3V0YihhaGQsIFNDQl9TR1BUUiwKIAkJCQkgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfU0dQVFIpCiAJCQkJIHwgU0dfU1RBVFVTX1ZBTElEKTsKLQkJCWFoZF9vdXR3KGFoZCwgU0NCX1RBRywgU0NCX0dFVF9UQUcoc2NiKSk7CisJCQlhaGRfb3V0dyhhaGQsIFNDQl9UQUcsIHNjYmlkKTsKKwkJCWFoZF9vdXR3KGFoZCwgU0NCX05FWFRfQ09NUExFVEUsIFNDQl9MSVNUX05VTEwpOwogCQkJY29tcF9oZWFkID0gYWhkX2ludyhhaGQsIENPTVBMRVRFX0RNQV9TQ0JfSEVBRCk7Ci0JCQlhaGRfb3V0dyhhaGQsIFNDQl9ORVhUX0NPTVBMRVRFLCBjb21wX2hlYWQpOwotCQkJaWYgKFNDQklEX0lTX05VTEwoY29tcF9oZWFkKSkKLQkJCQlhaGRfb3V0dyhhaGQsIENPTVBMRVRFX0RNQV9TQ0JfSEVBRCwKLQkJCQkJIFNDQl9HRVRfVEFHKHNjYikpOworCQkJaWYgKFNDQklEX0lTX05VTEwoY29tcF9oZWFkKSkgeworCQkJCWFoZF9vdXR3KGFoZCwgQ09NUExFVEVfRE1BX1NDQl9IRUFELCBzY2JpZCk7CisJCQkJYWhkX291dHcoYWhkLCBDT01QTEVURV9ETUFfU0NCX1RBSUwsIHNjYmlkKTsKKwkJCX0gZWxzZSB7CisJCQkJdV9pbnQgdGFpbDsKKworCQkJCXRhaWwgPSBhaGRfaW53KGFoZCwgQ09NUExFVEVfRE1BX1NDQl9UQUlMKTsKKwkJCQlhaGRfc2V0X3NjYnB0cihhaGQsIHRhaWwpOworCQkJCWFoZF9vdXR3KGFoZCwgU0NCX05FWFRfQ09NUExFVEUsIHNjYmlkKTsKKwkJCQlhaGRfb3V0dyhhaGQsIENPTVBMRVRFX0RNQV9TQ0JfVEFJTCwgc2NiaWQpOworCQkJCWFoZF9zZXRfc2NicHRyKGFoZCwgc2NiaWQpOworCQkJfQogCQl9IGVsc2UKIAkJCWFoZF9jb21wbGV0ZV9zY2IoYWhkLCBzY2IpOwogCX0KQEAgLTQ2NSw5ICs0ODQsMjIgQEAKIAkJCWJyZWFrOwogCQlhaGRfZGVsYXkoMjAwKTsKIAl9Ci0JaWYgKChjY3NjYmN0bCAmIENDU0NCRElSKSAhPSAwKQorCS8qCisJICogV2UgbGVhdmUgdGhlIHNlcXVlbmNlciB0byBjbGVhbnVwIGluIHRoZSBjYXNlIG9mIERNQSdzIHRvCisJICogdXBkYXRlIHRoZSBxb3V0Zmlmby4gIEluIGFsbCBvdGhlciBjYXNlcyAoRE1BJ3MgdG8gdGhlCisJICogY2hpcCBvciBhIHB1c2ggb2YgYW4gU0NCIGZyb20gdGhlIENPTVBMRVRFX0RNQV9TQ0IgbGlzdCksCisJICogd2UgZGlzYWJsZSB0aGUgRE1BIGVuZ2luZSBzbyB0aGF0IHRoZSBzZXF1ZW5jZXIgd2lsbCBub3QKKwkgKiBhdHRlbXB0IHRvIGhhbmRsZSB0aGUgRE1BIGNvbXBsZXRpb24uCisJICovCisJaWYgKChjY3NjYmN0bCAmIENDU0NCRElSKSAhPSAwIHx8IChjY3NjYmN0bCAmIEFSUkRPTkUpICE9IDApCiAJCWFoZF9vdXRiKGFoZCwgQ0NTQ0JDVEwsIGNjc2NiY3RsICYgfihDQ0FSUkVOfENDU0NCRU4pKTsKIAorCS8qCisJICogQ29tcGxldGUgYW55IFNDQnMgdGhhdCBqdXN0IGZpbmlzaGVkCisJICogYmVpbmcgRE1BJ2VkIGludG8gdGhlIHFvdXRmaWZvLgorCSAqLworCWFoZF9ydW5fcW91dGZpZm8oYWhkKTsKKwogCXNhdmVkX3NjYnB0ciA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CiAJLyoKIAkgKiBNYW51YWxseSB1cGRhdGUvY29tcGxldGUgYW55IGNvbXBsZXRlZCBTQ0JzIHRoYXQgYXJlIHdhaXRpbmcgdG8gYmUKQEAgLTQ5NCw2ICs1MjYsMjQgQEAKIAkJc2NiaWQgPSBuZXh0X3NjYmlkOwogCX0KIAlhaGRfb3V0dyhhaGQsIENPTVBMRVRFX0RNQV9TQ0JfSEVBRCwgU0NCX0xJU1RfTlVMTCk7CisJYWhkX291dHcoYWhkLCBDT01QTEVURV9ETUFfU0NCX1RBSUwsIFNDQl9MSVNUX05VTEwpOworCisJc2NiaWQgPSBhaGRfaW53KGFoZCwgQ09NUExFVEVfT05fUUZSRUVaRV9IRUFEKTsKKwl3aGlsZSAoIVNDQklEX0lTX05VTEwoc2NiaWQpKSB7CisKKwkJYWhkX3NldF9zY2JwdHIoYWhkLCBzY2JpZCk7CisJCW5leHRfc2NiaWQgPSBhaGRfaW53X3NjYnJhbShhaGQsIFNDQl9ORVhUX0NPTVBMRVRFKTsKKwkJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JpZCk7CisJCWlmIChzY2IgPT0gTlVMTCkgeworCQkJcHJpbnRmKCIlczogV2FybmluZyAtIENvbXBsZXRlIFFmcnogU0NCICVkIGludmFsaWRcbiIsCisJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgc2NiaWQpOworCQkJY29udGludWU7CisJCX0KKworCQlhaGRfY29tcGxldGVfc2NiKGFoZCwgc2NiKTsKKwkJc2NiaWQgPSBuZXh0X3NjYmlkOworCX0KKwlhaGRfb3V0dyhhaGQsIENPTVBMRVRFX09OX1FGUkVFWkVfSEVBRCwgU0NCX0xJU1RfTlVMTCk7CiAKIAlzY2JpZCA9IGFoZF9pbncoYWhkLCBDT01QTEVURV9TQ0JfSEVBRCk7CiAJd2hpbGUgKCFTQ0JJRF9JU19OVUxMKHNjYmlkKSkgewpAQCAtNTU4LDE1MCArNjA4LDE0NiBAQAogewogCXVfaW50IHNlcWludHNyYzsKIAotCXdoaWxlICgxKSB7Ci0JCXNlcWludHNyYyA9IGFoZF9pbmIoYWhkLCBTRVFJTlRTUkMpOwotCQlpZiAoKHNlcWludHNyYyAmIENGRzREQVRBKSAhPSAwKSB7Ci0JCQl1aW50MzJfdCBkYXRhY250OwotCQkJdWludDMyX3Qgc2dwdHI7CisJc2VxaW50c3JjID0gYWhkX2luYihhaGQsIFNFUUlOVFNSQyk7CisJaWYgKChzZXFpbnRzcmMgJiBDRkc0REFUQSkgIT0gMCkgeworCQl1aW50MzJfdCBkYXRhY250OworCQl1aW50MzJfdCBzZ3B0cjsKIAotCQkJLyoKLQkJCSAqIENsZWFyIGZ1bGwgcmVzaWR1YWwgZmxhZy4KLQkJCSAqLwotCQkJc2dwdHIgPSBhaGRfaW5sX3NjYnJhbShhaGQsIFNDQl9TR1BUUikgJiB+U0dfRlVMTF9SRVNJRDsKLQkJCWFoZF9vdXRiKGFoZCwgU0NCX1NHUFRSLCBzZ3B0cik7CisJCS8qCisJCSAqIENsZWFyIGZ1bGwgcmVzaWR1YWwgZmxhZy4KKwkJICovCisJCXNncHRyID0gYWhkX2lubF9zY2JyYW0oYWhkLCBTQ0JfU0dQVFIpICYgflNHX0ZVTExfUkVTSUQ7CisJCWFoZF9vdXRiKGFoZCwgU0NCX1NHUFRSLCBzZ3B0cik7CiAKLQkJCS8qCi0JCQkgKiBMb2FkIGRhdGFjbnQgYW5kIGFkZHJlc3MuCi0JCQkgKi8KLQkJCWRhdGFjbnQgPSBhaGRfaW5sX3NjYnJhbShhaGQsIFNDQl9EQVRBQ05UKTsKLQkJCWlmICgoZGF0YWNudCAmIEFIRF9ETUFfTEFTVF9TRUcpICE9IDApIHsKLQkJCQlzZ3B0ciB8PSBMQVNUX1NFRzsKLQkJCQlhaGRfb3V0YihhaGQsIFNHX1NUQVRFLCAwKTsKLQkJCX0gZWxzZQotCQkJCWFoZF9vdXRiKGFoZCwgU0dfU1RBVEUsIExPQURJTkdfTkVFREVEKTsKLQkJCWFoZF9vdXRxKGFoZCwgSEFERFIsIGFoZF9pbnFfc2NicmFtKGFoZCwgU0NCX0RBVEFQVFIpKTsKLQkJCWFoZF9vdXRsKGFoZCwgSENOVCwgZGF0YWNudCAmIEFIRF9TR19MRU5fTUFTSyk7Ci0JCQlhaGRfb3V0YihhaGQsIFNHX0NBQ0hFX1BSRSwgc2dwdHIpOwotCQkJYWhkX291dGIoYWhkLCBERkNOVFJMLCBQUkVMT0FERU58U0NTSUVOfEhETUFFTik7Ci0KLQkJCS8qCi0JCQkgKiBJbml0aWFsaXplIFJlc2lkdWFsIEZpZWxkcy4KLQkJCSAqLwotCQkJYWhkX291dGIoYWhkLCBTQ0JfUkVTSURVQUxfREFUQUNOVCszLCBkYXRhY250ID4+IDI0KTsKLQkJCWFoZF9vdXRsKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSLCBzZ3B0ciAmIFNHX1BUUl9NQVNLKTsKLQotCQkJLyoKLQkJCSAqIE1hcmsgdGhlIFNDQiBhcyBoYXZpbmcgYSBGSUZPIGluIHVzZS4KLQkJCSAqLwotCQkJYWhkX291dGIoYWhkLCBTQ0JfRklGT19VU0VfQ09VTlQsCi0JCQkJIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0ZJRk9fVVNFX0NPVU5UKSArIDEpOwotCi0JCQkvKgotCQkJICogSW5zdGFsbCBhICJmYWtlIiBoYW5kbGVyIGZvciB0aGlzIEZJRk8uCi0JCQkgKi8KLQkJCWFoZF9vdXR3KGFoZCwgTE9OR0pNUF9BRERSLCAwKTsKLQotCQkJLyoKLQkJCSAqIE5vdGlmeSB0aGUgaGFyZHdhcmUgdGhhdCB3ZSBoYXZlIHNhdGlzZmllZAotCQkJICogdGhpcyBzZXF1ZW5jZXIgaW50ZXJydXB0LgotCQkJICovCi0JCQlhaGRfb3V0YihhaGQsIENMUlNFUUlOVFNSQywgQ0xSQ0ZHNERBVEEpOwotCQl9IGVsc2UgaWYgKChzZXFpbnRzcmMgJiBTQVZFUFRSUykgIT0gMCkgewotCQkJdWludDMyX3Qgc2dwdHI7Ci0JCQl1aW50MzJfdCByZXNpZDsKLQotCQkJaWYgKChhaGRfaW5iKGFoZCwgTE9OR0pNUF9BRERSKzEpJklOVkFMSURfQUREUikgIT0gMCkgewotCQkJCS8qCi0JCQkJICogU25hcHNob3QgU2F2ZSBQb2ludGVycy4gIENsZWFyCi0JCQkJICogdGhlIHNuYXBzaG90IGFuZCBjb250aW51ZS4KLQkJCQkgKi8KLQkJCQlhaGRfb3V0YihhaGQsIERGRlNYRlJDVEwsIENMUkNITik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBEaXNhYmxlIFMvRyBmZXRjaCBzbyB0aGUgRE1BIGVuZ2luZQotCQkJICogaXMgYXZhaWxhYmxlIHRvIGZ1dHVyZSB1c2Vycy4KLQkJCSAqLwotCQkJaWYgKChhaGRfaW5iKGFoZCwgU0dfU1RBVEUpICYgRkVUQ0hfSU5QUk9HKSAhPSAwKQotCQkJCWFoZF9vdXRiKGFoZCwgQ0NTR0NUTCwgMCk7CisJCS8qCisJCSAqIExvYWQgZGF0YWNudCBhbmQgYWRkcmVzcy4KKwkJICovCisJCWRhdGFjbnQgPSBhaGRfaW5sX3NjYnJhbShhaGQsIFNDQl9EQVRBQ05UKTsKKwkJaWYgKChkYXRhY250ICYgQUhEX0RNQV9MQVNUX1NFRykgIT0gMCkgeworCQkJc2dwdHIgfD0gTEFTVF9TRUc7CiAJCQlhaGRfb3V0YihhaGQsIFNHX1NUQVRFLCAwKTsKKwkJfSBlbHNlCisJCQlhaGRfb3V0YihhaGQsIFNHX1NUQVRFLCBMT0FESU5HX05FRURFRCk7CisJCWFoZF9vdXRxKGFoZCwgSEFERFIsIGFoZF9pbnFfc2NicmFtKGFoZCwgU0NCX0RBVEFQVFIpKTsKKwkJYWhkX291dGwoYWhkLCBIQ05ULCBkYXRhY250ICYgQUhEX1NHX0xFTl9NQVNLKTsKKwkJYWhkX291dGIoYWhkLCBTR19DQUNIRV9QUkUsIHNncHRyKTsKKwkJYWhkX291dGIoYWhkLCBERkNOVFJMLCBQUkVMT0FERU58U0NTSUVOfEhETUFFTik7CiAKLQkJCS8qCi0JCQkgKiBGbHVzaCB0aGUgZGF0YSBGSUZPLiAgU3RyaWNrbHkgb25seQotCQkJICogbmVjZXNzYXJ5IGZvciBSZXYgQSBwYXJ0cy4KLQkJCSAqLwotCQkJYWhkX291dGIoYWhkLCBERkNOVFJMLAotCQkJCSBhaGRfaW5iKGFoZCwgREZDTlRSTCkgfCBGSUZPRkxVU0gpOworCQkvKgorCQkgKiBJbml0aWFsaXplIFJlc2lkdWFsIEZpZWxkcy4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgU0NCX1JFU0lEVUFMX0RBVEFDTlQrMywgZGF0YWNudCA+PiAyNCk7CisJCWFoZF9vdXRsKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSLCBzZ3B0ciAmIFNHX1BUUl9NQVNLKTsKIAotCQkJLyoKLQkJCSAqIENhbGN1bGF0ZSByZXNpZHVhbC4KLQkJCSAqLwotCQkJc2dwdHIgPSBhaGRfaW5sX3NjYnJhbShhaGQsIFNDQl9SRVNJRFVBTF9TR1BUUik7Ci0JCQlyZXNpZCA9IGFoZF9pbmwoYWhkLCBTSENOVCk7Ci0JCQlyZXNpZCB8PQotCQkJICAgIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1JFU0lEVUFMX0RBVEFDTlQrMykgPDwgMjQ7Ci0JCQlhaGRfb3V0bChhaGQsIFNDQl9SRVNJRFVBTF9EQVRBQ05ULCByZXNpZCk7Ci0JCQlpZiAoKGFoZF9pbmIoYWhkLCBTR19DQUNIRV9TSEFET1cpICYgTEFTVF9TRUcpID09IDApIHsKLQkJCQkvKgotCQkJCSAqIE11c3QgYmFjayB1cCB0byB0aGUgY29ycmVjdCBTL0cgZWxlbWVudC4KLQkJCQkgKiBUeXBpY2FsbHkgdGhpcyBqdXN0IG1lYW5zIHJlc2V0dGluZyBvdXIKLQkJCQkgKiBsb3cgYnl0ZSB0byB0aGUgb2Zmc2V0IGluIHRoZSBTR19DQUNIRSwKLQkJCQkgKiBidXQgaWYgd2Ugd3JhcHBlZCwgd2UgaGF2ZSB0byBjb3JyZWN0Ci0JCQkJICogdGhlIG90aGVyIGJ5dGVzIG9mIHRoZSBzZ3B0ciB0b28uCi0JCQkJICovCi0JCQkJaWYgKChhaGRfaW5iKGFoZCwgU0dfQ0FDSEVfU0hBRE9XKSAmIDB4ODApICE9IDAKLQkJCQkgJiYgKHNncHRyICYgMHg4MCkgPT0gMCkKLQkJCQkJc2dwdHIgLT0gMHgxMDA7Ci0JCQkJc2dwdHIgJj0gfjB4RkY7Ci0JCQkJc2dwdHIgfD0gYWhkX2luYihhaGQsIFNHX0NBQ0hFX1NIQURPVykKLQkJCQkgICAgICAgJiBTR19BRERSX01BU0s7Ci0JCQkJYWhkX291dGwoYWhkLCBTQ0JfUkVTSURVQUxfU0dQVFIsIHNncHRyKTsKLQkJCQlhaGRfb3V0YihhaGQsIFNDQl9SRVNJRFVBTF9EQVRBQ05UICsgMywgMCk7Ci0JCQl9IGVsc2UgaWYgKChyZXNpZCAmIEFIRF9TR19MRU5fTUFTSykgPT0gMCkgewotCQkJCWFoZF9vdXRiKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSLAotCQkJCQkgc2dwdHIgfCBTR19MSVNUX05VTEwpOwotCQkJfQotCQkJLyoKLQkJCSAqIFNhdmUgUG9pbnRlcnMuCi0JCQkgKi8KLQkJCWFoZF9vdXRxKGFoZCwgU0NCX0RBVEFQVFIsIGFoZF9pbnEoYWhkLCBTSEFERFIpKTsKLQkJCWFoZF9vdXRsKGFoZCwgU0NCX0RBVEFDTlQsIHJlc2lkKTsKLQkJCWFoZF9vdXRsKGFoZCwgU0NCX1NHUFRSLCBzZ3B0cik7Ci0JCQlhaGRfb3V0YihhaGQsIENMUlNFUUlOVFNSQywgQ0xSU0FWRVBUUlMpOwotCQkJYWhkX291dGIoYWhkLCBTRVFJTU9ERSwKLQkJCQkgYWhkX2luYihhaGQsIFNFUUlNT0RFKSB8IEVOU0FWRVBUUlMpOwotCQkJLyoKLQkJCSAqIElmIHRoZSBkYXRhIGlzIHRvIHRoZSBTQ1NJIGJ1cywgd2UgYXJlCi0JCQkgKiBkb25lLCBvdGhlcndpc2Ugd2FpdCBmb3IgRklGT0VNUC4KLQkJCSAqLwotCQkJaWYgKChhaGRfaW5iKGFoZCwgREZDTlRSTCkgJiBESVJFQ1RJT04pICE9IDApCi0JCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAoKGFoZF9pbmIoYWhkLCBTR19TVEFURSkgJiBMT0FESU5HX05FRURFRCkgIT0gMCkgewotCQkJdWludDMyX3Qgc2dwdHI7Ci0JCQl1aW50NjRfdCBkYXRhX2FkZHI7Ci0JCQl1aW50MzJfdCBkYXRhX2xlbjsKLQkJCXVfaW50CSBkZmNudHJsOworCQkvKgorCQkgKiBNYXJrIHRoZSBTQ0IgYXMgaGF2aW5nIGEgRklGTyBpbiB1c2UuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIFNDQl9GSUZPX1VTRV9DT1VOVCwKKwkJCSBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9GSUZPX1VTRV9DT1VOVCkgKyAxKTsKIAotCQkJLyoKLQkJCSAqIERpc2FibGUgUy9HIGZldGNoIHNvIHRoZSBETUEgZW5naW5lCi0JCQkgKiBpcyBhdmFpbGFibGUgdG8gZnV0dXJlIHVzZXJzLgotCQkJICovCi0JCQlpZiAoKGFoZF9pbmIoYWhkLCBTR19TVEFURSkgJiBGRVRDSF9JTlBST0cpICE9IDApIHsKLQkJCQlhaGRfb3V0YihhaGQsIENDU0dDVEwsIDApOwotCQkJCWFoZF9vdXRiKGFoZCwgU0dfU1RBVEUsIExPQURJTkdfTkVFREVEKTsKLQkJCX0KKwkJLyoKKwkJICogSW5zdGFsbCBhICJmYWtlIiBoYW5kbGVyIGZvciB0aGlzIEZJRk8uCisJCSAqLworCQlhaGRfb3V0dyhhaGQsIExPTkdKTVBfQUREUiwgMCk7CiAKKwkJLyoKKwkJICogTm90aWZ5IHRoZSBoYXJkd2FyZSB0aGF0IHdlIGhhdmUgc2F0aXNmaWVkCisJCSAqIHRoaXMgc2VxdWVuY2VyIGludGVycnVwdC4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgQ0xSU0VRSU5UU1JDLCBDTFJDRkc0REFUQSk7CisJfSBlbHNlIGlmICgoc2VxaW50c3JjICYgU0FWRVBUUlMpICE9IDApIHsKKwkJdWludDMyX3Qgc2dwdHI7CisJCXVpbnQzMl90IHJlc2lkOworCisJCWlmICgoYWhkX2luYihhaGQsIExPTkdKTVBfQUREUisxKSZJTlZBTElEX0FERFIpICE9IDApIHsKIAkJCS8qCi0JCQkgKiBXYWl0IGZvciB0aGUgRE1BIGVuZ2luZSB0byBub3RpY2UgdGhhdCB0aGUKLQkJCSAqIGhvc3QgdHJhbnNmZXIgaXMgZW5hYmxlZCBhbmQgdGhhdCB0aGVyZSBpcwotCQkJICogc3BhY2UgaW4gdGhlIFMvRyBGSUZPIGZvciBuZXcgc2VnbWVudHMgYmVmb3JlCi0JCQkgKiBsb2FkaW5nIG1vcmUgc2VnbWVudHMuCisJCQkgKiBTbmFwc2hvdCBTYXZlIFBvaW50ZXJzLiAgQWxsIHRoYXQKKwkJCSAqIGlzIG5lY2Vzc2FyeSB0byBjbGVhciB0aGUgc25hcHNob3QKKwkJCSAqIGlzIGEgQ0xSQ0hOLgogCQkJICovCi0JCQlpZiAoKGFoZF9pbmIoYWhkLCBERlNUQVRVUykgJiBQUkVMT0FEX0FWQUlMKSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKChhaGRfaW5iKGFoZCwgREZDTlRSTCkgJiBIRE1BRU5BQ0spID09IDApCi0JCQkJY29udGludWU7CisJCQlnb3RvIGNscmNobjsKKwkJfQorCisJCS8qCisJCSAqIERpc2FibGUgUy9HIGZldGNoIHNvIHRoZSBETUEgZW5naW5lCisJCSAqIGlzIGF2YWlsYWJsZSB0byBmdXR1cmUgdXNlcnMuCisJCSAqLworCQlpZiAoKGFoZF9pbmIoYWhkLCBTR19TVEFURSkgJiBGRVRDSF9JTlBST0cpICE9IDApCisJCQlhaGRfb3V0YihhaGQsIENDU0dDVEwsIDApOworCQlhaGRfb3V0YihhaGQsIFNHX1NUQVRFLCAwKTsKKworCQkvKgorCQkgKiBGbHVzaCB0aGUgZGF0YSBGSUZPLiAgU3RyaWNrbHkgb25seQorCQkgKiBuZWNlc3NhcnkgZm9yIFJldiBBIHBhcnRzLgorCQkgKi8KKwkJYWhkX291dGIoYWhkLCBERkNOVFJMLCBhaGRfaW5iKGFoZCwgREZDTlRSTCkgfCBGSUZPRkxVU0gpOworCisJCS8qCisJCSAqIENhbGN1bGF0ZSByZXNpZHVhbC4KKwkJICovCisJCXNncHRyID0gYWhkX2lubF9zY2JyYW0oYWhkLCBTQ0JfUkVTSURVQUxfU0dQVFIpOworCQlyZXNpZCA9IGFoZF9pbmwoYWhkLCBTSENOVCk7CisJCXJlc2lkIHw9IGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1JFU0lEVUFMX0RBVEFDTlQrMykgPDwgMjQ7CisJCWFoZF9vdXRsKGFoZCwgU0NCX1JFU0lEVUFMX0RBVEFDTlQsIHJlc2lkKTsKKwkJaWYgKChhaGRfaW5iKGFoZCwgU0dfQ0FDSEVfU0hBRE9XKSAmIExBU1RfU0VHKSA9PSAwKSB7CisJCQkvKgorCQkJICogTXVzdCBiYWNrIHVwIHRvIHRoZSBjb3JyZWN0IFMvRyBlbGVtZW50LgorCQkJICogVHlwaWNhbGx5IHRoaXMganVzdCBtZWFucyByZXNldHRpbmcgb3VyCisJCQkgKiBsb3cgYnl0ZSB0byB0aGUgb2Zmc2V0IGluIHRoZSBTR19DQUNIRSwKKwkJCSAqIGJ1dCBpZiB3ZSB3cmFwcGVkLCB3ZSBoYXZlIHRvIGNvcnJlY3QKKwkJCSAqIHRoZSBvdGhlciBieXRlcyBvZiB0aGUgc2dwdHIgdG9vLgorCQkJICovCisJCQlpZiAoKGFoZF9pbmIoYWhkLCBTR19DQUNIRV9TSEFET1cpICYgMHg4MCkgIT0gMAorCQkJICYmIChzZ3B0ciAmIDB4ODApID09IDApCisJCQkJc2dwdHIgLT0gMHgxMDA7CisJCQlzZ3B0ciAmPSB+MHhGRjsKKwkJCXNncHRyIHw9IGFoZF9pbmIoYWhkLCBTR19DQUNIRV9TSEFET1cpCisJCQkgICAgICAgJiBTR19BRERSX01BU0s7CisJCQlhaGRfb3V0bChhaGQsIFNDQl9SRVNJRFVBTF9TR1BUUiwgc2dwdHIpOworCQkJYWhkX291dGIoYWhkLCBTQ0JfUkVTSURVQUxfREFUQUNOVCArIDMsIDApOworCQl9IGVsc2UgaWYgKChyZXNpZCAmIEFIRF9TR19MRU5fTUFTSykgPT0gMCkgeworCQkJYWhkX291dGIoYWhkLCBTQ0JfUkVTSURVQUxfU0dQVFIsCisJCQkJIHNncHRyIHwgU0dfTElTVF9OVUxMKTsKKwkJfQorCQkvKgorCQkgKiBTYXZlIFBvaW50ZXJzLgorCQkgKi8KKwkJYWhkX291dHEoYWhkLCBTQ0JfREFUQVBUUiwgYWhkX2lucShhaGQsIFNIQUREUikpOworCQlhaGRfb3V0bChhaGQsIFNDQl9EQVRBQ05ULCByZXNpZCk7CisJCWFoZF9vdXRsKGFoZCwgU0NCX1NHUFRSLCBzZ3B0cik7CisJCWFoZF9vdXRiKGFoZCwgQ0xSU0VRSU5UU1JDLCBDTFJTQVZFUFRSUyk7CisJCWFoZF9vdXRiKGFoZCwgU0VRSU1PREUsCisJCQkgYWhkX2luYihhaGQsIFNFUUlNT0RFKSB8IEVOU0FWRVBUUlMpOworCQkvKgorCQkgKiBJZiB0aGUgZGF0YSBpcyB0byB0aGUgU0NTSSBidXMsIHdlIGFyZQorCQkgKiBkb25lLCBvdGhlcndpc2Ugd2FpdCBmb3IgRklGT0VNUC4KKwkJICovCisJCWlmICgoYWhkX2luYihhaGQsIERGQ05UUkwpICYgRElSRUNUSU9OKSAhPSAwKQorCQkJZ290byBjbHJjaG47CisJfSBlbHNlIGlmICgoYWhkX2luYihhaGQsIFNHX1NUQVRFKSAmIExPQURJTkdfTkVFREVEKSAhPSAwKSB7CisJCXVpbnQzMl90IHNncHRyOworCQl1aW50NjRfdCBkYXRhX2FkZHI7CisJCXVpbnQzMl90IGRhdGFfbGVuOworCQl1X2ludAkgZGZjbnRybDsKKworCQkvKgorCQkgKiBEaXNhYmxlIFMvRyBmZXRjaCBzbyB0aGUgRE1BIGVuZ2luZQorCQkgKiBpcyBhdmFpbGFibGUgdG8gZnV0dXJlIHVzZXJzLiAgV2Ugd29uJ3QKKwkJICogYmUgdXNpbmcgdGhlIERNQSBlbmdpbmUgdG8gbG9hZCBzZWdtZW50cy4KKwkJICovCisJCWlmICgoYWhkX2luYihhaGQsIFNHX1NUQVRFKSAmIEZFVENIX0lOUFJPRykgIT0gMCkgeworCQkJYWhkX291dGIoYWhkLCBDQ1NHQ1RMLCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0dfU1RBVEUsIExPQURJTkdfTkVFREVEKTsKKwkJfQorCisJCS8qCisJCSAqIFdhaXQgZm9yIHRoZSBETUEgZW5naW5lIHRvIG5vdGljZSB0aGF0IHRoZQorCQkgKiBob3N0IHRyYW5zZmVyIGlzIGVuYWJsZWQgYW5kIHRoYXQgdGhlcmUgaXMKKwkJICogc3BhY2UgaW4gdGhlIFMvRyBGSUZPIGZvciBuZXcgc2VnbWVudHMgYmVmb3JlCisJCSAqIGxvYWRpbmcgbW9yZSBzZWdtZW50cy4KKwkJICovCisJCWlmICgoYWhkX2luYihhaGQsIERGU1RBVFVTKSAmIFBSRUxPQURfQVZBSUwpICE9IDAKKwkJICYmIChhaGRfaW5iKGFoZCwgREZDTlRSTCkgJiBIRE1BRU5BQ0spICE9IDApIHsKIAogCQkJLyoKIAkJCSAqIERldGVybWluZSB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IFMvRwpAQCAtNzQ4LDcgKzc5NCw3IEBACiAJCQkgKiBBZHZlcnRpc2UgdGhlIHNlZ21lbnQgdG8gdGhlIGhhcmR3YXJlLgogCQkJICovCiAJCQlkZmNudHJsID0gYWhkX2luYihhaGQsIERGQ05UUkwpfFBSRUxPQURFTnxIRE1BRU47Ci0JCQlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfTkVXX0RGQ05UUkxfT1BUUykhPTApIHsKKwkJCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9ORVdfREZDTlRSTF9PUFRTKSAhPSAwKSB7CiAJCQkJLyoKIAkJCQkgKiBVc2UgU0NTSUVOV1JESVMgc28gdGhhdCBTQ1NJRU4KIAkJCQkgKiBpcyBuZXZlciBtb2RpZmllZCBieSB0aGlzCkBAIC03NTcsMzUgKzgwMyw0NCBAQAogCQkJCWRmY250cmwgfD0gU0NTSUVOV1JESVM7CiAJCQl9CiAJCQlhaGRfb3V0YihhaGQsIERGQ05UUkwsIGRmY250cmwpOwotCQl9IGVsc2UgaWYgKChhaGRfaW5iKGFoZCwgU0dfQ0FDSEVfU0hBRE9XKQotCQkJICYgTEFTVF9TRUdfRE9ORSkgIT0gMCkgewotCi0JCQkvKgotCQkJICogVHJhbnNmZXIgY29tcGxldGVkIHRvIHRoZSBlbmQgb2YgU0cgbGlzdAotCQkJICogYW5kIGhhcyBmbHVzaGVkIHRvIHRoZSBob3N0LgotCQkJICovCi0JCQlhaGRfb3V0YihhaGQsIFNDQl9TR1BUUiwKLQkJCQkgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfU0dQVFIpIHwgU0dfTElTVF9OVUxMKTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKChhaGRfaW5iKGFoZCwgREZTVEFUVVMpICYgRklGT0VNUCkgIT0gMCkgewotCQkJYnJlYWs7CiAJCX0KLQkJYWhkX2RlbGF5KDIwMCk7CisJfSBlbHNlIGlmICgoYWhkX2luYihhaGQsIFNHX0NBQ0hFX1NIQURPVykgJiBMQVNUX1NFR19ET05FKSAhPSAwKSB7CisKKwkJLyoKKwkJICogVHJhbnNmZXIgY29tcGxldGVkIHRvIHRoZSBlbmQgb2YgU0cgbGlzdAorCQkgKiBhbmQgaGFzIGZsdXNoZWQgdG8gdGhlIGhvc3QuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIFNDQl9TR1BUUiwKKwkJCSBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9TR1BUUikgfCBTR19MSVNUX05VTEwpOworCQlnb3RvIGNscmNobjsKKwl9IGVsc2UgaWYgKChhaGRfaW5iKGFoZCwgREZTVEFUVVMpICYgRklGT0VNUCkgIT0gMCkgeworY2xyY2huOgorCQkvKgorCQkgKiBDbGVhciBhbnkgaGFuZGxlciBmb3IgdGhpcyBGSUZPLCBkZWNyZW1lbnQKKwkJICogdGhlIEZJRk8gdXNlIGNvdW50IGZvciB0aGUgU0NCLCBhbmQgcmVsZWFzZQorCQkgKiB0aGUgRklGTy4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgTE9OR0pNUF9BRERSICsgMSwgSU5WQUxJRF9BRERSKTsKKwkJYWhkX291dGIoYWhkLCBTQ0JfRklGT19VU0VfQ09VTlQsCisJCQkgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfRklGT19VU0VfQ09VTlQpIC0gMSk7CisJCWFoZF9vdXRiKGFoZCwgREZGU1hGUkNUTCwgQ0xSQ0hOKTsKIAl9Ci0JLyoKLQkgKiBDbGVhciBhbnkgaGFuZGxlciBmb3IgdGhpcyBGSUZPLCBkZWNyZW1lbnQKLQkgKiB0aGUgRklGTyB1c2UgY291bnQgZm9yIHRoZSBTQ0IsIGFuZCByZWxlYXNlCi0JICogdGhlIEZJRk8uCi0JICovCi0JYWhkX291dGIoYWhkLCBMT05HSk1QX0FERFIgKyAxLCBJTlZBTElEX0FERFIpOwotCWFoZF9vdXRiKGFoZCwgU0NCX0ZJRk9fVVNFX0NPVU5ULAotCQkgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfRklGT19VU0VfQ09VTlQpIC0gMSk7Ci0JYWhkX291dGIoYWhkLCBERkZTWEZSQ1RMLCBDTFJDSE4pOwogfQogCisvKgorICogTG9vayBmb3IgZW50cmllcyBpbiB0aGUgUW91dEZJRk8gdGhhdCBoYXZlIGNvbXBsZXRlZC4KKyAqIFRoZSB2YWxpZF90YWcgY29tcGxldGlvbiBmaWVsZCBpbmRpY2F0ZXMgdGhlIHZhbGlkaXR5CisgKiBvZiB0aGUgZW50cnkgLSB0aGUgdmFsaWQgdmFsdWUgdG9nZ2xlcyBlYWNoIHRpbWUgdGhyb3VnaAorICogdGhlIHF1ZXVlLiBXZSB1c2UgdGhlIHNnX3N0YXR1cyBmaWVsZCBpbiB0aGUgY29tcGxldGlvbgorICogZW50cnkgdG8gYXZvaWQgcmVmZXJlbmNpbmcgdGhlIGhzY2IgaWYgdGhlIGNvbXBsZXRpb24KKyAqIG9jY3VycmVkIHdpdGggbm8gZXJyb3JzIGFuZCBubyByZXNpZHVhbC4gIHNnX3N0YXR1cyBpcworICogYSBjb3B5IG9mIHRoZSBmaXJzdCBieXRlIChsaXR0bGUgZW5kaWFuKSBvZiB0aGUgc2dwdHIKKyAqIGhzY2IgZmllbGQuCisgKi8KIHZvaWQKIGFoZF9ydW5fcW91dGZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQogeworCXN0cnVjdCBhaGRfY29tcGxldGlvbiAqY29tcGxldGlvbjsKIAlzdHJ1Y3Qgc2NiICpzY2I7CiAJdV9pbnQgIHNjYl9pbmRleDsKIApAQCAtNzkzLDExICs4NDgsMTMgQEAKIAkJcGFuaWMoImFoZF9ydW5fcW91dGZpZm8gcmVjdXJzaW9uIik7CiAJYWhkLT5mbGFncyB8PSBBSERfUlVOTklOR19RT1VURklGTzsKIAlhaGRfc3luY19xb3V0ZmlmbyhhaGQsIEJVU19ETUFTWU5DX1BPU1RSRUFEKTsKLQl3aGlsZSAoKGFoZC0+cW91dGZpZm9bYWhkLT5xb3V0Zmlmb25leHRdCi0JICAgICAmIFFPVVRGSUZPX0VOVFJZX1ZBTElEX0xFKSA9PSBhaGQtPnFvdXRmaWZvbmV4dF92YWxpZF90YWcpIHsKKwlmb3IgKDs7KSB7CisJCWNvbXBsZXRpb24gPSAmYWhkLT5xb3V0Zmlmb1thaGQtPnFvdXRmaWZvbmV4dF07CiAKLQkJc2NiX2luZGV4ID0gYWhkX2xlMTZ0b2goYWhkLT5xb3V0Zmlmb1thaGQtPnFvdXRmaWZvbmV4dF0KLQkJCQkgICAgICAmIH5RT1VURklGT19FTlRSWV9WQUxJRF9MRSk7CisJCWlmIChjb21wbGV0aW9uLT52YWxpZF90YWcgIT0gYWhkLT5xb3V0Zmlmb25leHRfdmFsaWRfdGFnKQorCQkJYnJlYWs7CisKKwkJc2NiX2luZGV4ID0gYWhkX2xlMTZ0b2goY29tcGxldGlvbi0+dGFnKTsKIAkJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JfaW5kZXgpOwogCQlpZiAoc2NiID09IE5VTEwpIHsKIAkJCXByaW50ZigiJXM6IFdBUk5JTkcgbm8gY29tbWFuZCBmb3Igc2NiICVkICIKQEAgLTgwNSwxMiArODYyLDE1IEBACiAJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgc2NiX2luZGV4LAogCQkJICAgICAgIGFoZC0+cW91dGZpZm9uZXh0KTsKIAkJCWFoZF9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKLQkJfSBlbHNlCi0JCQlhaGRfY29tcGxldGVfc2NiKGFoZCwgc2NiKTsKKwkJfSBlbHNlIGlmICgoY29tcGxldGlvbi0+c2dfc3RhdHVzICYgU0dfU1RBVFVTX1ZBTElEKSAhPSAwKSB7CisJCQlhaGRfaGFuZGxlX3NjYl9zdGF0dXMoYWhkLCBzY2IpOworCQl9IGVsc2UgeworCQkJYWhkX2RvbmUoYWhkLCBzY2IpOworCQl9CiAKIAkJYWhkLT5xb3V0Zmlmb25leHQgPSAoYWhkLT5xb3V0Zmlmb25leHQrMSkgJiAoQUhEX1FPVVRfU0laRS0xKTsKIAkJaWYgKGFoZC0+cW91dGZpZm9uZXh0ID09IDApCi0JCQlhaGQtPnFvdXRmaWZvbmV4dF92YWxpZF90YWcgXj0gUU9VVEZJRk9fRU5UUllfVkFMSURfTEU7CisJCQlhaGQtPnFvdXRmaWZvbmV4dF92YWxpZF90YWcgXj0gUU9VVEZJRk9fRU5UUllfVkFMSUQ7CiAJfQogCWFoZC0+ZmxhZ3MgJj0gfkFIRF9SVU5OSU5HX1FPVVRGSUZPOwogfQpAQCAtODc2LDI2ICs5MzYsNiBAQAogCQkgICAgICAgYWhkX25hbWUoYWhkKSwgc2VxaW50Y29kZSk7CiAjZW5kaWYKIAlzd2l0Y2ggKHNlcWludGNvZGUpIHsKLQljYXNlIEJBRF9TQ0JfU1RBVFVTOgotCXsKLQkJc3RydWN0CXNjYiAqc2NiOwotCQl1X2ludAlzY2JpZDsKLQkJaW50CWNtZHNfcGVuZGluZzsKLQotCQlzY2JpZCA9IGFoZF9nZXRfc2NicHRyKGFoZCk7Ci0JCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiaWQpOwotCQlpZiAoc2NiICE9IE5VTEwpIHsKLQkJCWFoZF9jb21wbGV0ZV9zY2IoYWhkLCBzY2IpOwotCQl9IGVsc2UgewotCQkJcHJpbnRmKCIlczogV0FSTklORyBubyBjb21tYW5kIGZvciBzY2IgJWQgIgotCQkJICAgICAgICIoYmFkIHN0YXR1cylcbiIsIGFoZF9uYW1lKGFoZCksIHNjYmlkKTsKLQkJCWFoZF9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKLQkJfQotCQljbWRzX3BlbmRpbmcgPSBhaGRfaW53KGFoZCwgQ01EU19QRU5ESU5HKTsKLQkJaWYgKGNtZHNfcGVuZGluZyA+IDApCi0JCQlhaGRfb3V0dyhhaGQsIENNRFNfUEVORElORywgY21kc19wZW5kaW5nIC0gMSk7Ci0JCWJyZWFrOwotCX0KIAljYXNlIEVOVEVSSU5HX05PTlBBQ0s6CiAJewogCQlzdHJ1Y3QJc2NiICpzY2I7CkBAIC0xMDYwLDcgKzExMDAsNyBAQAogCQkJYWhkX291dGIoYWhkLCBTQVZFRF9MVU4sIDApOwogCQkJYWhkX291dGIoYWhkLCBTRVFfRkxBR1MsIDApOwogCQkJYWhkX2Fzc2VydF9hdG4oYWhkKTsKLQkJCXNjYi0+ZmxhZ3MgJj0gfihTQ0JfUEFDS0VUSVpFRCk7CisJCQlzY2ItPmZsYWdzICY9IH5TQ0JfUEFDS0VUSVpFRDsKIAkJCXNjYi0+ZmxhZ3MgfD0gU0NCX0FCT1JUfFNDQl9DTURQSEFTRV9BQk9SVDsKIAkJCWFoZF9mcmVlemVfZGV2cShhaGQsIHNjYik7CiAJCQlhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9SRVFVRVVFX1JFUSk7CkBAIC0xNTAzLDkgKzE1NDMsNiBAQAogCSAmJiAoYWhkX2luYihhaGQsIFNFUV9GTEFHUykgJiBOT1RfSURFTlRJRklFRCkgIT0gMCkKIAkJc2NiID0gTlVMTDsKIAotCS8qIE1ha2Ugc3VyZSB0aGUgc2VxdWVuY2VyIGlzIGluIGEgc2FmZSBsb2NhdGlvbi4gKi8KLQlhaGRfY2xlYXJfY3JpdGljYWxfc2VjdGlvbihhaGQpOwotCiAJaWYgKChzdGF0dXMwICYgSU9FUlIpICE9IDApIHsKIAkJdV9pbnQgbm93X2x2ZDsKIApAQCAtMTUyMSwyNiArMTU1OCwzNSBAQAogCQlhaGRfc2V0dXBfaW9jZWxsX3dvcmthcm91bmQoYWhkKTsKIAkJYWhkX3VucGF1c2UoYWhkKTsKIAl9IGVsc2UgaWYgKChzdGF0dXMwICYgT1ZFUlJVTikgIT0gMCkgeworCiAJCXByaW50ZigiJXM6IFNDU0kgb2Zmc2V0IG92ZXJydW4gZGV0ZWN0ZWQuICBSZXNldHRpbmcgYnVzLlxuIiwKIAkJICAgICAgIGFoZF9uYW1lKGFoZCkpOwogCQlhaGRfcmVzZXRfY2hhbm5lbChhaGQsICdBJywgLypJbml0aWF0ZSBSZXNldCovVFJVRSk7CiAJfSBlbHNlIGlmICgoc3RhdHVzICYgU0NTSVJTVEkpICE9IDApIHsKKwogCQlwcmludGYoIiVzOiBTb21lb25lIHJlc2V0IGNoYW5uZWwgQVxuIiwgYWhkX25hbWUoYWhkKSk7CiAJCWFoZF9yZXNldF9jaGFubmVsKGFoZCwgJ0EnLCAvKkluaXRpYXRlIFJlc2V0Ki9GQUxTRSk7CiAJfSBlbHNlIGlmICgoc3RhdHVzICYgU0NTSVBFUlIpICE9IDApIHsKKworCQkvKiBNYWtlIHN1cmUgdGhlIHNlcXVlbmNlciBpcyBpbiBhIHNhZmUgbG9jYXRpb24uICovCisJCWFoZF9jbGVhcl9jcml0aWNhbF9zZWN0aW9uKGFoZCk7CisKIAkJYWhkX2hhbmRsZV90cmFuc21pc3Npb25fZXJyb3IoYWhkKTsKIAl9IGVsc2UgaWYgKGxxb3N0YXQwICE9IDApIHsKKwogCQlwcmludGYoIiVzOiBscW9zdGF0MCA9PSAweCV4IVxuIiwgYWhkX25hbWUoYWhkKSwgbHFvc3RhdDApOwogCQlhaGRfb3V0YihhaGQsIENMUkxRT0lOVDAsIGxxb3N0YXQwKTsKLQkJaWYgKChhaGQtPmJ1Z3MgJiBBSERfQ0xSTFFPX0FVVE9DTFJfQlVHKSAhPSAwKSB7CisJCWlmICgoYWhkLT5idWdzICYgQUhEX0NMUkxRT19BVVRPQ0xSX0JVRykgIT0gMCkKIAkJCWFoZF9vdXRiKGFoZCwgQ0xSTFFPSU5UMSwgMCk7Ci0JCX0KIAl9IGVsc2UgaWYgKChzdGF0dXMgJiBTRUxUTykgIT0gMCkgewogCQl1X2ludCAgc2NiaWQ7CiAKIAkJLyogU3RvcCB0aGUgc2VsZWN0aW9uICovCiAJCWFoZF9vdXRiKGFoZCwgU0NTSVNFUTAsIDApOwogCisJCS8qIE1ha2Ugc3VyZSB0aGUgc2VxdWVuY2VyIGlzIGluIGEgc2FmZSBsb2NhdGlvbi4gKi8KKwkJYWhkX2NsZWFyX2NyaXRpY2FsX3NlY3Rpb24oYWhkKTsKKwogCQkvKiBObyBtb3JlIHBlbmRpbmcgbWVzc2FnZXMgKi8KIAkJYWhkX2NsZWFyX21zZ19zdGF0ZShhaGQpOwogCkBAIC0xNTczLDI0ICsxNjE5LDI3IEBACiAJCQkJICAgICAgIHNjYmlkKTsKIAkJCX0KICNlbmRpZgotCQkJLyoKLQkJCSAqIEZvcmNlIGEgcmVuZWdvdGlhdGlvbiB3aXRoIHRoaXMgdGFyZ2V0IGp1c3QgaW4KLQkJCSAqIGNhc2UgdGhlIGNhYmxlIHdhcyBwdWxsZWQgYW5kIHdpbGwgbGF0ZXIgYmUKLQkJCSAqIHJlLWF0dGFjaGVkLiAgVGhlIHRhcmdldCBtYXkgZm9yZ2V0IGl0cyBuZWdvdGlhdGlvbgotCQkJICogc2V0dGluZ3Mgd2l0aCB1cyBzaG91bGQgaXQgYXR0ZW1wdCB0byByZXNlbGVjdAotCQkJICogZHVyaW5nIHRoZSBpbnRlcnJ1cHRpb24uICBUaGUgdGFyZ2V0IHdpbGwgbm90IGlzc3VlCi0JCQkgKiBhIHVuaXQgYXR0ZW50aW9uIGluIHRoaXMgY2FzZSwgc28gd2UgbXVzdCBhbHdheXMKLQkJCSAqIHJlbmVnb3RpYXRlLgotCQkJICovCiAJCQlhaGRfc2NiX2RldmluZm8oYWhkLCAmZGV2aW5mbywgc2NiKTsKLQkJCWFoZF9mb3JjZV9yZW5lZ290aWF0aW9uKGFoZCwgJmRldmluZm8pOwogCQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fU0VMX1RJTUVPVVQpOwogCQkJYWhkX2ZyZWV6ZV9kZXZxKGFoZCwgc2NiKTsKKworCQkJLyoKKwkJCSAqIENhbmNlbCBhbnkgcGVuZGluZyB0cmFuc2FjdGlvbnMgb24gdGhlIGRldmljZQorCQkJICogbm93IHRoYXQgaXQgc2VlbXMgdG8gYmUgbWlzc2luZy4gIFRoaXMgd2lsbAorCQkJICogYWxzbyByZXZlcnQgdXMgdG8gYXN5bmMvbmFycm93IHRyYW5zZmVycyB1bnRpbAorCQkJICogd2UgY2FuIHJlbmVnb3RpYXRlIHdpdGggdGhlIGRldmljZS4KKwkJCSAqLworCQkJYWhkX2hhbmRsZV9kZXZyZXNldChhaGQsICZkZXZpbmZvLAorCQkJCQkgICAgQ0FNX0xVTl9XSUxEQ0FSRCwKKwkJCQkJICAgIENBTV9TRUxfVElNRU9VVCwKKwkJCQkJICAgICJTZWxlY3Rpb24gVGltZW91dCIsCisJCQkJCSAgICAvKnZlcmJvc2VfbGV2ZWwqLzEpOwogCQl9CiAJCWFoZF9vdXRiKGFoZCwgQ0xSSU5ULCBDTFJTQ1NJSU5UKTsKIAkJYWhkX2lvY2VsbF9maXJzdF9zZWxlY3Rpb24oYWhkKTsKIAkJYWhkX3VucGF1c2UoYWhkKTsKIAl9IGVsc2UgaWYgKChzdGF0dXMwICYgKFNFTERJfFNFTERPKSkgIT0gMCkgeworCiAJCWFoZF9pb2NlbGxfZmlyc3Rfc2VsZWN0aW9uKGFoZCk7CiAJCWFoZF91bnBhdXNlKGFoZCk7CiAJfSBlbHNlIGlmIChzdGF0dXMzICE9IDApIHsKQEAgLTE1OTgsNiArMTY0NywxMCBAQAogCQkgICAgICAgYWhkX25hbWUoYWhkKSwgc3RhdHVzMyk7CiAJCWFoZF9vdXRiKGFoZCwgQ0xSU0lOVDMsIHN0YXR1czMpOwogCX0gZWxzZSBpZiAoKGxxaXN0YXQxICYgKExRSVBIQVNFX0xRfExRSVBIQVNFX05MUSkpICE9IDApIHsKKworCQkvKiBNYWtlIHN1cmUgdGhlIHNlcXVlbmNlciBpcyBpbiBhIHNhZmUgbG9jYXRpb24uICovCisJCWFoZF9jbGVhcl9jcml0aWNhbF9zZWN0aW9uKGFoZCk7CisKIAkJYWhkX2hhbmRsZV9scWlwaGFzZV9lcnJvcihhaGQsIGxxaXN0YXQxKTsKIAl9IGVsc2UgaWYgKChscWlzdGF0MSAmIExRSUNSQ0lfTkxRKSAhPSAwKSB7CiAJCS8qCkBAIC0xNjIyLDYgKzE2NzUsOSBAQAogCQkgKi8KIAkJYWhkX291dGIoYWhkLCBTQ1NJU0VRMCwgMCk7CiAKKwkJLyogTWFrZSBzdXJlIHRoZSBzZXF1ZW5jZXIgaXMgaW4gYSBzYWZlIGxvY2F0aW9uLiAqLworCQlhaGRfY2xlYXJfY3JpdGljYWxfc2VjdGlvbihhaGQpOworCiAJCS8qCiAJCSAqIERldGVybWluZSB3aGF0IHdlIHdlcmUgdXAgdG8gYXQgdGhlIHRpbWUgb2YKIAkJICogdGhlIGJ1c2ZyZWUuCkBAIC0xNjU5LDcgKzE3MTUsMTYgQEAKIAkJCWNsZWFyX2ZpZm8gPSAwOwogCQkJcGFja2V0aXplZCA9ICAobHFvc3RhdDEgJiBMUU9CVVNGUkVFKSAhPSAwOwogCQkJaWYgKCFwYWNrZXRpemVkCi0JCQkgJiYgYWhkX2luYihhaGQsIExBU1RQSEFTRSkgPT0gUF9CVVNGUkVFKQorCQkJICYmIGFoZF9pbmIoYWhkLCBMQVNUUEhBU0UpID09IFBfQlVTRlJFRQorCQkJICYmIChhaGRfaW5iKGFoZCwgU1NUQVQwKSAmIFNFTERJKSA9PSAwCisJCQkgJiYgKChhaGRfaW5iKGFoZCwgU1NUQVQwKSAmIFNFTERPKSA9PSAwCisJCQkgIHx8IChhaGRfaW5iKGFoZCwgU0NTSVNFUTApICYgRU5TRUxPKSA9PSAwKSkKKwkJCQkvKgorCQkJCSAqIEFzc3VtZSBwYWNrZXRpemVkIGlmIHdlIGFyZSBub3QKKwkJCQkgKiBvbiB0aGUgYnVzIGluIGEgbm9uLXBhY2tldGl6ZWQKKwkJCQkgKiBjYXBhY2l0eSBhbmQgYW55IHBlbmRpbmcgc2VsZWN0aW9uCisJCQkJICogd2FzIGEgcGFja2V0aXplZCBzZWxlY3Rpb24uCisJCQkJICovCiAJCQkJcGFja2V0aXplZCA9IDE7CiAJCQlicmVhazsKIAkJfQpAQCAtMjMxMCw4ICsyMzc1LDcgQEAKIAkJICAgICAgICJQUkdNQ05UID09IDB4JXhcbiIsCiAJCSAgICAgICBhaGRfbG9va3VwX3BoYXNlX2VudHJ5KGxhc3RwaGFzZSktPnBoYXNlbXNnLAogCQkgICAgICAgYWJvcnRlZCwKLQkJICAgICAgIGFoZF9pbmIoYWhkLCBQUkdNQ05UKQotCQkJfCAoYWhkX2luYihhaGQsIFBSR01DTlQrMSkgPDwgOCkpOworCQkgICAgICAgYWhkX2ludyhhaGQsIFBSR01DTlQpKTsKIAkJYWhkX2R1bXBfY2FyZF9zdGF0ZShhaGQpOwogCX0KIAkvKiBBbHdheXMgcmVzdGFydCB0aGUgc2VxdWVuY2VyLiAqLwpAQCAtMjQ3NCw4ICsyNTM4LDcgQEAKIAkJdV9pbnQJaTsKIAogCQlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7Ci0JCXNlcWFkZHIgPSBhaGRfaW5iKGFoZCwgQ1VSQUREUikKLQkJCXwgKGFoZF9pbmIoYWhkLCBDVVJBRERSKzEpIDw8IDgpOworCQlzZXFhZGRyID0gYWhkX2ludyhhaGQsIENVUkFERFIpOwogCiAJCWNzID0gYWhkLT5jcml0aWNhbF9zZWN0aW9uczsKIAkJZm9yIChpID0gMDsgaSA8IGFoZC0+bnVtX2NyaXRpY2FsX3NlY3Rpb25zOyBpKyssIGNzKyspIHsKQEAgLTMxOTYsMTQgKzMyNTksMjUgQEAKIAkJaW9jZWxsX29wdHNbQUhEX1BSRUNPTVBfU0xFV19JTkRFWF0gJj0gfkFIRF9QUkVDT01QX01BU0s7CiAKIAkJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX05FV19JT0NFTExfT1BUUykgIT0gMAotCQkgJiYgKHBwcl9vcHRzICYgTVNHX0VYVF9QUFJfRFRfUkVRKSAhPSAwKSB7CisJCSAmJiAocHByX29wdHMgJiBNU0dfRVhUX1BQUl9EVF9SRVEpICE9IDAKKwkJICYmIChwcHJfb3B0cyAmIE1TR19FWFRfUFBSX0lVX1JFUSkgPT0gMCkgewogCQkJLyoKIAkJCSAqIFNsb3cgZG93biBvdXIgQ1JDIGludGVydmFsIHRvIGJlCi0JCQkgKiBjb21wYXRpYmxlIHdpdGggZGV2aWNlcyB0aGF0IGNhbid0Ci0JCQkgKiBoYW5kbGUgYSBDUkMgYXQgZnVsbCBzcGVlZC4KKwkJCSAqIGNvbXBhdGlibGUgd2l0aCBub24tcGFja2V0aXplZAorCQkJICogVTE2MCBkZXZpY2VzIHRoYXQgY2FuJ3QgaGFuZGxlIGEKKwkJCSAqIENSQyBhdCBmdWxsIHNwZWVkLgogCQkJICovCiAJCQljb25fb3B0cyB8PSBFTlNMT1dDUkM7CiAJCX0KKworCQlpZiAoKGFoZC0+YnVncyAmIEFIRF9QQUNFRF9ORUdUQUJMRV9CVUcpICE9IDApIHsKKwkJCS8qCisJCQkgKiBPbiBIMkE0LCByZXZlcnQgdG8gYSBzbG93ZXIgc2xld3JhdGUKKwkJCSAqIG9uIG5vbi1wYWNlZCB0cmFuc2ZlcnMuCisJCQkgKi8KKwkJCWlvY2VsbF9vcHRzW0FIRF9QUkVDT01QX1NMRVdfSU5ERVhdICY9CisJCQkgICAgfkFIRF9TTEVXUkFURV9NQVNLOworCQl9CiAJfQogCiAJYWhkX291dGIoYWhkLCBBTk5FWENPTCwgQUhEX0FOTkVYQ09MX1BSRUNPTVBfU0xFVyk7CkBAIC0zMjkyLDExICszMzY2LDE1IEBACiAJICogRm9yY2UgdGhlIHNlcXVlbmNlciB0byByZWluaXRpYWxpemUgdGhlIHNlbGVjdGlvbiBmb3IKIAkgKiB0aGUgY29tbWFuZCBhdCB0aGUgaGVhZCBvZiB0aGUgZXhlY3V0aW9uIHF1ZXVlIGlmIGl0CiAJICogaGFzIGFscmVhZHkgYmVlbiBzZXR1cC4gIFRoZSBuZWdvdGlhdGlvbiBjaGFuZ2VzIG1heQotCSAqIGVmZmVjdCB3aGV0aGVyIHdlIHNlbGVjdC1vdXQgd2l0aCBBVE4uCisJICogZWZmZWN0IHdoZXRoZXIgd2Ugc2VsZWN0LW91dCB3aXRoIEFUTi4gIEl0IGlzIG9ubHkKKwkgKiBzYWZlIHRvIGNsZWFyIEVOU0VMTyB3aGVuIHRoZSBidXMgaXMgbm90IGZyZWUgYW5kIG5vCisJICogc2VsZWN0aW9uIGlzIGluIHByb2dyZXMgb3IgY29tcGxldGVkLgogCSAqLwogCXNhdmVkX21vZGVzID0gYWhkX3NhdmVfbW9kZXMoYWhkKTsKIAlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7Ci0JYWhkX291dGIoYWhkLCBTQ1NJU0VRMCwgYWhkX2luYihhaGQsIFNDU0lTRVEwKSAmIH5FTlNFTE8pOworCWlmICgoYWhkX2luYihhaGQsIFNDU0lTSUdJKSAmIEJTWUkpICE9IDAKKwkgJiYgKGFoZF9pbmIoYWhkLCBTU1RBVDApICYgKFNFTERPfFNFTElOR08pKSA9PSAwKQorCQlhaGRfb3V0YihhaGQsIFNDU0lTRVEwLCBhaGRfaW5iKGFoZCwgU0NTSVNFUTApICYgfkVOU0VMTyk7CiAJc2F2ZWRfc2NicHRyID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKIAkvKiBFbnN1cmUgdGhhdCB0aGUgaHNjYnMgZG93biBvbiB0aGUgY2FyZCBtYXRjaCB0aGUgbmV3IGluZm9ybWF0aW9uICovCiAJZm9yIChzY2JfdGFnID0gMDsgc2NiX3RhZyA8IGFoZC0+c2NiX2RhdGEubWF4aHNjYnM7IHNjYl90YWcrKykgewpAQCAtNDkwOSwxMCArNDk4Nyw3IEBACiAJICogRGV0ZXJtaW5lIGluaXRpYWwgdmFsdWVzIGZvciBkYXRhX2FkZHIgYW5kIGRhdGFfY250CiAJICogZm9yIHJlc3VtaW5nIHRoZSBkYXRhIHBoYXNlLgogCSAqLwotCXNncHRyID0gKGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSICsgMykgPDwgMjQpCi0JICAgICAgfCAoYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfUkVTSURVQUxfU0dQVFIgKyAyKSA8PCAxNikKLQkgICAgICB8IChhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9SRVNJRFVBTF9TR1BUUiArIDEpIDw8IDgpCi0JICAgICAgfAlhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9SRVNJRFVBTF9TR1BUUik7CisJc2dwdHIgPSBhaGRfaW5sX3NjYnJhbShhaGQsIFNDQl9SRVNJRFVBTF9TR1BUUik7CiAJc2dwdHIgJj0gU0dfUFRSX01BU0s7CiAKIAlyZXNpZCA9IChhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9SRVNJRFVBTF9EQVRBQ05UICsgMikgPDwgMTYpCkBAIC00OTMwLDEwICs1MDA1LDcgQEAKIAkJZGF0YXB0ciA9IGFoZF9sZTY0dG9oKHNnLT5hZGRyKQogCQkJKyAoYWhkX2xlMzJ0b2goc2ctPmxlbikgJiBBSERfU0dfTEVOX01BU0spCiAJCQktIHJlc2lkOwotCQlhaGRfb3V0YihhaGQsIEhBRERSICsgNywgZGF0YXB0ciA+PiA1Nik7Ci0JCWFoZF9vdXRiKGFoZCwgSEFERFIgKyA2LCBkYXRhcHRyID4+IDQ4KTsKLQkJYWhkX291dGIoYWhkLCBIQUREUiArIDUsIGRhdGFwdHIgPj4gNDApOwotCQlhaGRfb3V0YihhaGQsIEhBRERSICsgNCwgZGF0YXB0ciA+PiAzMik7CisJCWFoZF9vdXRsKGFoZCwgSEFERFIgKyA0LCBkYXRhcHRyID4+IDMyKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QJIGFoZF9kbWFfc2VnICpzZzsKIApAQCAtNDk0OCwxMCArNTAyMCw3IEBACiAJCWFoZF9vdXRiKGFoZCwgSEFERFIgKyA0LAogCQkJIChhaGRfbGUzMnRvaChzZy0+bGVuKSAmIH5BSERfU0dfTEVOX01BU0spID4+IDI0KTsKIAl9Ci0JYWhkX291dGIoYWhkLCBIQUREUiArIDMsIGRhdGFwdHIgPj4gMjQpOwotCWFoZF9vdXRiKGFoZCwgSEFERFIgKyAyLCBkYXRhcHRyID4+IDE2KTsKLQlhaGRfb3V0YihhaGQsIEhBRERSICsgMSwgZGF0YXB0ciA+PiA4KTsKLQlhaGRfb3V0YihhaGQsIEhBRERSLCBkYXRhcHRyKTsKKwlhaGRfb3V0bChhaGQsIEhBRERSLCBkYXRhcHRyKTsKIAlhaGRfb3V0YihhaGQsIEhDTlQgKyAyLCByZXNpZCA+PiAxNik7CiAJYWhkX291dGIoYWhkLCBIQ05UICsgMSwgcmVzaWQgPj4gOCk7CiAJYWhkX291dGIoYWhkLCBIQ05ULCByZXNpZCk7CkBAIC01MDExLDEzICs1MDgwLDE0IEBACiAJYWhkX3NldF93aWR0aChhaGQsIGRldmluZm8sIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCiAJCSAgICAgIEFIRF9UUkFOU19DVVIsIC8qcGF1c2VkKi9UUlVFKTsKIAlhaGRfc2V0X3N5bmNyYXRlKGFoZCwgZGV2aW5mbywgLypwZXJpb2QqLzAsIC8qb2Zmc2V0Ki8wLAotCQkJIC8qcHByX29wdGlvbnMqLzAsIEFIRF9UUkFOU19DVVIsIC8qcGF1c2VkKi9UUlVFKTsKKwkJCSAvKnBwcl9vcHRpb25zKi8wLCBBSERfVFJBTlNfQ1VSLAorCQkJIC8qcGF1c2VkKi9UUlVFKTsKIAkKLQlhaGRfc2VuZF9hc3luYyhhaGQsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKLQkJICAgICAgIGx1biwgQUNfU0VOVF9CRFIsIE5VTEwpOworCWlmIChzdGF0dXMgIT0gQ0FNX1NFTF9USU1FT1VUKQorCQlhaGRfc2VuZF9hc3luYyhhaGQsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKKwkJCSAgICAgICBDQU1fTFVOX1dJTERDQVJELCBBQ19TRU5UX0JEUiwgTlVMTCk7CiAKLQlpZiAobWVzc2FnZSAhPSBOVUxMCi0JICYmICh2ZXJib3NlX2xldmVsIDw9IGJvb3R2ZXJib3NlKSkKKwlpZiAobWVzc2FnZSAhPSBOVUxMICYmIGJvb3R2ZXJib3NlKQogCQlwcmludGYoIiVzOiAlcyBvbiAlYzolZC4gJWQgU0NCcyBhYm9ydGVkXG4iLCBhaGRfbmFtZShhaGQpLAogCQkgICAgICAgbWVzc2FnZSwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LCBmb3VuZCk7CiB9CkBAIC01MjAzLDEzICs1MjczLDEzIEBACiAJCS8qIEZBTExUSFJPVUdIICovCiAJY2FzZSA0OgogCQlhaGRfZG1hbWFwX3VubG9hZChhaGQsIGFoZC0+c2hhcmVkX2RhdGFfZG1hdCwKLQkJCQkgIGFoZC0+c2hhcmVkX2RhdGFfZG1hbWFwKTsKKwkJCQkgIGFoZC0+c2hhcmVkX2RhdGFfbWFwLmRtYW1hcCk7CiAJCS8qIEZBTExUSFJPVUdIICovCiAJY2FzZSAzOgogCQlhaGRfZG1hbWVtX2ZyZWUoYWhkLCBhaGQtPnNoYXJlZF9kYXRhX2RtYXQsIGFoZC0+cW91dGZpZm8sCi0JCQkJYWhkLT5zaGFyZWRfZGF0YV9kbWFtYXApOworCQkJCWFoZC0+c2hhcmVkX2RhdGFfbWFwLmRtYW1hcCk7CiAJCWFoZF9kbWFtYXBfZGVzdHJveShhaGQsIGFoZC0+c2hhcmVkX2RhdGFfZG1hdCwKLQkJCQkgICBhaGQtPnNoYXJlZF9kYXRhX2RtYW1hcCk7CisJCQkJICAgYWhkLT5zaGFyZWRfZGF0YV9tYXAuZG1hbWFwKTsKIAkJLyogRkFMTFRIUk9VR0ggKi8KIAljYXNlIDI6CiAJCWFoZF9kbWFfdGFnX2Rlc3Ryb3koYWhkLCBhaGQtPnNoYXJlZF9kYXRhX2RtYXQpOwpAQCAtNTk3NSwxNiArNjA0NSwxMyBAQAogCW5ld2NvdW50ID0gTUlOKHNjYl9kYXRhLT5zZW5zZV9sZWZ0LCBzY2JfZGF0YS0+c2Nic19sZWZ0KTsKIAluZXdjb3VudCA9IE1JTihuZXdjb3VudCwgc2NiX2RhdGEtPnNnc19sZWZ0KTsKIAluZXdjb3VudCA9IE1JTihuZXdjb3VudCwgKEFIRF9TQ0JfTUFYX0FMTE9DIC0gc2NiX2RhdGEtPm51bXNjYnMpKTsKLQlzY2JfZGF0YS0+c2Vuc2VfbGVmdCAtPSBuZXdjb3VudDsKLQlzY2JfZGF0YS0+c2Nic19sZWZ0IC09IG5ld2NvdW50OwotCXNjYl9kYXRhLT5zZ3NfbGVmdCAtPSBuZXdjb3VudDsKIAlmb3IgKGkgPSAwOyBpIDwgbmV3Y291bnQ7IGkrKykgewotCQl1X2ludCBjb2xfdGFnOwotCiAJCXN0cnVjdCBzY2JfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJCXVfaW50IGNvbF90YWc7CiAjaWZuZGVmIF9fbGludXhfXwogCQlpbnQgZXJyb3I7CiAjZW5kaWYKKwogCQluZXh0X3NjYiA9IChzdHJ1Y3Qgc2NiICopbWFsbG9jKHNpemVvZigqbmV4dF9zY2IpLAogCQkJCQkJTV9ERVZCVUYsIE1fTk9XQUlUKTsKIAkJaWYgKG5leHRfc2NiID09IE5VTEwpCkBAIC02MDQxLDYgKzYxMDgsOSBAQAogCQlzZW5zZV9kYXRhICs9IEFIRF9TRU5TRV9CVUZTSVpFOwogCQlzZW5zZV9idXNhZGRyICs9IEFIRF9TRU5TRV9CVUZTSVpFOwogCQlzY2JfZGF0YS0+bnVtc2NicysrOworCQlzY2JfZGF0YS0+c2Vuc2VfbGVmdC0tOworCQlzY2JfZGF0YS0+c2Nic19sZWZ0LS07CisJCXNjYl9kYXRhLT5zZ3NfbGVmdC0tOwogCX0KIH0KIApAQCAtNjA4OCw3ICs2MTU4LDYgQEAKIGludAogYWhkX2luaXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQogewotCXVpbnQ4X3QJCSpiYXNlX3ZhZGRyOwogCXVpbnQ4X3QJCSpuZXh0X3ZhZGRyOwogCWRtYV9hZGRyX3QJIG5leHRfYmFkZHI7CiAJc2l6ZV90CQkgZHJpdmVyX2RhdGFfc2l6ZTsKQEAgLTYxNTYsNyArNjIyNSw3IEBACiAJICogZm9yIHRoZSB0YXJnZXQgbW9kZSByb2xlLCB3ZSBtdXN0IGFkZGl0aW9uYWxseSBwcm92aWRlIHNwYWNlIGZvcgogCSAqIHRoZSBpbmNvbWluZyB0YXJnZXQgY29tbWFuZCBmaWZvLgogCSAqLwotCWRyaXZlcl9kYXRhX3NpemUgPSBBSERfU0NCX01BWCAqIHNpemVvZih1aW50MTZfdCkKKwlkcml2ZXJfZGF0YV9zaXplID0gQUhEX1NDQl9NQVggKiBzaXplb2YoKmFoZC0+cW91dGZpZm8pCiAJCQkgKyBzaXplb2Yoc3RydWN0IGhhcmR3YXJlX3NjYik7CiAJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX1RBUkdFVE1PREUpICE9IDApCiAJCWRyaXZlcl9kYXRhX3NpemUgKz0gQUhEX1RNT0RFX0NNRFMgKiBzaXplb2Yoc3RydWN0IHRhcmdldF9jbWQpOwpAQCAtNjE3OCwyMCArNjI0NywyMyBAQAogCiAJLyogQWxsb2NhdGlvbiBvZiBkcml2ZXIgZGF0YSAqLwogCWlmIChhaGRfZG1hbWVtX2FsbG9jKGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LAotCQkJICAgICAodm9pZCAqKikmYmFzZV92YWRkciwKLQkJCSAgICAgQlVTX0RNQV9OT1dBSVQsICZhaGQtPnNoYXJlZF9kYXRhX2RtYW1hcCkgIT0gMCkgeworCQkJICAgICAodm9pZCAqKikmYWhkLT5zaGFyZWRfZGF0YV9tYXAudmFkZHIsCisJCQkgICAgIEJVU19ETUFfTk9XQUlULAorCQkJICAgICAmYWhkLT5zaGFyZWRfZGF0YV9tYXAuZG1hbWFwKSAhPSAwKSB7CiAJCXJldHVybiAoRU5PTUVNKTsKIAl9CiAKIAlhaGQtPmluaXRfbGV2ZWwrKzsKIAogCS8qIEFuZCBwZXJtYW5lbnRseSBtYXAgaXQgaW4gKi8KLQlhaGRfZG1hbWFwX2xvYWQoYWhkLCBhaGQtPnNoYXJlZF9kYXRhX2RtYXQsIGFoZC0+c2hhcmVkX2RhdGFfZG1hbWFwLAotCQkJYmFzZV92YWRkciwgZHJpdmVyX2RhdGFfc2l6ZSwgYWhkX2RtYW1hcF9jYiwKLQkJCSZhaGQtPnNoYXJlZF9kYXRhX2J1c2FkZHIsIC8qZmxhZ3MqLzApOwotCWFoZC0+cW91dGZpZm8gPSAodWludDE2X3QgKiliYXNlX3ZhZGRyOworCWFoZF9kbWFtYXBfbG9hZChhaGQsIGFoZC0+c2hhcmVkX2RhdGFfZG1hdCwgYWhkLT5zaGFyZWRfZGF0YV9tYXAuZG1hbWFwLAorCQkJYWhkLT5zaGFyZWRfZGF0YV9tYXAudmFkZHIsIGRyaXZlcl9kYXRhX3NpemUsCisJCQlhaGRfZG1hbWFwX2NiLCAmYWhkLT5zaGFyZWRfZGF0YV9tYXAucGh5c2FkZHIsCisJCQkvKmZsYWdzKi8wKTsKKwlhaGQtPnFvdXRmaWZvID0gKHN0cnVjdCBhaGRfY29tcGxldGlvbiAqKWFoZC0+c2hhcmVkX2RhdGFfbWFwLnZhZGRyOwogCW5leHRfdmFkZHIgPSAodWludDhfdCAqKSZhaGQtPnFvdXRmaWZvW0FIRF9RT1VUX1NJWkVdOwotCW5leHRfYmFkZHIgPSBhaGQtPnNoYXJlZF9kYXRhX2J1c2FkZHIgKyBBSERfUU9VVF9TSVpFKnNpemVvZih1aW50MTZfdCk7CisJbmV4dF9iYWRkciA9IGFoZC0+c2hhcmVkX2RhdGFfbWFwLnBoeXNhZGRyCisJCSAgICsgQUhEX1FPVVRfU0laRSpzaXplb2Yoc3RydWN0IGFoZF9jb21wbGV0aW9uKTsKIAlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfVEFSR0VUTU9ERSkgIT0gMCkgewogCQlhaGQtPnRhcmdldGNtZHMgPSAoc3RydWN0IHRhcmdldF9jbWQgKiluZXh0X3ZhZGRyOwogCQluZXh0X3ZhZGRyICs9IEFIRF9UTU9ERV9DTURTICogc2l6ZW9mKHN0cnVjdCB0YXJnZXRfY21kKTsKQEAgLTYyMTIsNiArNjI4NCw3IEBACiAJICogc3BlY2lhbGx5IGZyb20gdGhlIERNQSBzYWZlIG1lbW9yeSBjaHVuayB1c2VkIGZvciB0aGUgUU9VVEZJRk8uCiAJICovCiAJYWhkLT5uZXh0X3F1ZXVlZF9oc2NiID0gKHN0cnVjdCBoYXJkd2FyZV9zY2IgKiluZXh0X3ZhZGRyOworCWFoZC0+bmV4dF9xdWV1ZWRfaHNjYl9tYXAgPSAmYWhkLT5zaGFyZWRfZGF0YV9tYXA7CiAJYWhkLT5uZXh0X3F1ZXVlZF9oc2NiLT5oc2NiX2J1c2FkZHIgPSBhaGRfaHRvbGUzMihuZXh0X2JhZGRyKTsKIAogCWFoZC0+aW5pdF9sZXZlbCsrOwpAQCAtNjUxNywxMCArNjU5MCwxMCBAQAogCiAJLyogQWxsIG9mIG91ciBxdWV1ZXMgYXJlIGVtcHR5ICovCiAJYWhkLT5xb3V0Zmlmb25leHQgPSAwOwotCWFoZC0+cW91dGZpZm9uZXh0X3ZhbGlkX3RhZyA9IFFPVVRGSUZPX0VOVFJZX1ZBTElEX0xFOwotCWFoZF9vdXRiKGFoZCwgUU9VVEZJRk9fRU5UUllfVkFMSURfVEFHLCBRT1VURklGT19FTlRSWV9WQUxJRCA+PiA4KTsKKwlhaGQtPnFvdXRmaWZvbmV4dF92YWxpZF90YWcgPSBRT1VURklGT19FTlRSWV9WQUxJRDsKKwlhaGRfb3V0YihhaGQsIFFPVVRGSUZPX0VOVFJZX1ZBTElEX1RBRywgUU9VVEZJRk9fRU5UUllfVkFMSUQpOwogCWZvciAoaSA9IDA7IGkgPCBBSERfUU9VVF9TSVpFOyBpKyspCi0JCWFoZC0+cW91dGZpZm9baV0gPSAwOworCQlhaGQtPnFvdXRmaWZvW2ldLnZhbGlkX3RhZyA9IDA7CiAJYWhkX3N5bmNfcW91dGZpZm8oYWhkLCBCVVNfRE1BU1lOQ19QUkVSRUFEKTsKIAogCWFoZC0+cWluZmlmb25leHQgPSAwOwpAQCAtNjU1MywyNCArNjYyNiwyMiBAQAogCWFoZF9vdXR3KGFoZCwgQ09NUExFVEVfU0NCX0hFQUQsIFNDQl9MSVNUX05VTEwpOwogCWFoZF9vdXR3KGFoZCwgQ09NUExFVEVfU0NCX0RNQUlOUFJPR19IRUFELCBTQ0JfTElTVF9OVUxMKTsKIAlhaGRfb3V0dyhhaGQsIENPTVBMRVRFX0RNQV9TQ0JfSEVBRCwgU0NCX0xJU1RfTlVMTCk7CisJYWhkX291dHcoYWhkLCBDT01QTEVURV9ETUFfU0NCX1RBSUwsIFNDQl9MSVNUX05VTEwpOworCWFoZF9vdXR3KGFoZCwgQ09NUExFVEVfT05fUUZSRUVaRV9IRUFELCBTQ0JfTElTVF9OVUxMKTsKIAogCS8qCiAJICogVGhlIEZyZWV6ZSBDb3VudCBpcyAwLgogCSAqLworCWFoZC0+cWZyZWV6ZV9jbnQgPSAwOwogCWFoZF9vdXR3KGFoZCwgUUZSRUVaRV9DT1VOVCwgMCk7CisJYWhkX291dHcoYWhkLCBLRVJORUxfUUZSRUVaRV9DT1VOVCwgMCk7CiAKIAkvKgogCSAqIFRlbGwgdGhlIHNlcXVlbmNlciB3aGVyZSBpdCBjYW4gZmluZCBvdXIgYXJyYXlzIGluIG1lbW9yeS4KIAkgKi8KLQlidXNhZGRyID0gYWhkLT5zaGFyZWRfZGF0YV9idXNhZGRyOwotCWFoZF9vdXRiKGFoZCwgU0hBUkVEX0RBVEFfQUREUiwgYnVzYWRkciAmIDB4RkYpOwotCWFoZF9vdXRiKGFoZCwgU0hBUkVEX0RBVEFfQUREUiArIDEsIChidXNhZGRyID4+IDgpICYgMHhGRik7Ci0JYWhkX291dGIoYWhkLCBTSEFSRURfREFUQV9BRERSICsgMiwgKGJ1c2FkZHIgPj4gMTYpICYgMHhGRik7Ci0JYWhkX291dGIoYWhkLCBTSEFSRURfREFUQV9BRERSICsgMywgKGJ1c2FkZHIgPj4gMjQpICYgMHhGRik7Ci0JYWhkX291dGIoYWhkLCBRT1VURklGT19ORVhUX0FERFIsIGJ1c2FkZHIgJiAweEZGKTsKLQlhaGRfb3V0YihhaGQsIFFPVVRGSUZPX05FWFRfQUREUiArIDEsIChidXNhZGRyID4+IDgpICYgMHhGRik7Ci0JYWhkX291dGIoYWhkLCBRT1VURklGT19ORVhUX0FERFIgKyAyLCAoYnVzYWRkciA+PiAxNikgJiAweEZGKTsKLQlhaGRfb3V0YihhaGQsIFFPVVRGSUZPX05FWFRfQUREUiArIDMsIChidXNhZGRyID4+IDI0KSAmIDB4RkYpOworCWJ1c2FkZHIgPSBhaGQtPnNoYXJlZF9kYXRhX21hcC5waHlzYWRkcjsKKwlhaGRfb3V0bChhaGQsIFNIQVJFRF9EQVRBX0FERFIsIGJ1c2FkZHIpOworCWFoZF9vdXRsKGFoZCwgUU9VVEZJRk9fTkVYVF9BRERSLCBidXNhZGRyKTsKIAogCS8qCiAJICogU2V0dXAgdGhlIGFsbG93ZWQgU0NTSSBTZXF1ZW5jZXMgYmFzZWQgb24gb3BlcmF0aW9uYWwgbW9kZS4KQEAgLTY2MTksMTAgKzY2OTAsNyBAQAogCSAqIFRlbGwgdGhlIHNlcXVlbmNlciB3aGljaCBTQ0Igd2lsbCBiZSB0aGUgbmV4dCBvbmUgaXQgcmVjZWl2ZXMuCiAJICovCiAJYnVzYWRkciA9IGFoZF9sZTMydG9oKGFoZC0+bmV4dF9xdWV1ZWRfaHNjYi0+aHNjYl9idXNhZGRyKTsKLQlhaGRfb3V0YihhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSICsgMCwgYnVzYWRkciAmIDB4RkYpOwotCWFoZF9vdXRiKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIgKyAxLCAoYnVzYWRkciA+PiA4KSAmIDB4RkYpOwotCWFoZF9vdXRiKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIgKyAyLCAoYnVzYWRkciA+PiAxNikgJiAweEZGKTsKLQlhaGRfb3V0YihhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSICsgMywgKGJ1c2FkZHIgPj4gMjQpICYgMHhGRik7CisJYWhkX291dGwoYWhkLCBORVhUX1FVRVVFRF9TQ0JfQUREUiwgYnVzYWRkcik7CiAKIAkvKgogCSAqIERlZmF1bHQgdG8gY29hbGVzY2luZyBkaXNhYmxlZC4KQEAgLTY5MjYsNDMgKzY5OTQsMzQgQEAKIHsKIAl1X2ludCBpbnRzdGF0OwogCXVfaW50IG1heGxvb3BzOwotCXVfaW50IHFmcmVlemVfY250OwogCiAJbWF4bG9vcHMgPSAxMDAwOwogCWFoZC0+ZmxhZ3MgfD0gQUhEX0FMTF9JTlRFUlJVUFRTOwogCWFoZF9wYXVzZShhaGQpOwogCS8qCi0JICogSW5jcmVtZW50IHRoZSBRRnJlZXplIENvdW50IHNvIHRoYXQgdGhlIHNlcXVlbmNlcgotCSAqIHdpbGwgbm90IHN0YXJ0IG5ldyBzZWxlY3Rpb25zLiAgV2UgZG8gdGhpcyBvbmx5CisJICogRnJlZXplIHRoZSBvdXRnb2luZyBzZWxlY3Rpb25zLiAgV2UgZG8gdGhpcyBvbmx5CiAJICogdW50aWwgd2UgYXJlIHNhZmVseSBwYXVzZWQgd2l0aG91dCBmdXJ0aGVyIHNlbGVjdGlvbnMKIAkgKiBwZW5kaW5nLgogCSAqLwotCWFoZF9vdXR3KGFoZCwgUUZSRUVaRV9DT1VOVCwgYWhkX2ludyhhaGQsIFFGUkVFWkVfQ09VTlQpICsgMSk7CisJYWhkLT5xZnJlZXplX2NudC0tOworCWFoZF9vdXR3KGFoZCwgS0VSTkVMX1FGUkVFWkVfQ09VTlQsIGFoZC0+cWZyZWV6ZV9jbnQpOwogCWFoZF9vdXRiKGFoZCwgU0VRX0ZMQUdTMiwgYWhkX2luYihhaGQsIFNFUV9GTEFHUzIpIHwgU0VMRUNUT1VUX1FGUk9aRU4pOwogCWRvIHsKLQkJc3RydWN0IHNjYiAqd2FpdGluZ19zY2I7CiAKIAkJYWhkX3VucGF1c2UoYWhkKTsKKwkJLyoKKwkJICogR2l2ZSB0aGUgc2VxdWVuY2VyIHNvbWUgdGltZSB0byBzZXJ2aWNlCisJCSAqIGFueSBhY3RpdmUgc2VsZWN0aW9ucy4KKwkJICovCisJCWFoZF9kZWxheSg1MDApOworCiAJCWFoZF9pbnRyKGFoZCk7CiAJCWFoZF9wYXVzZShhaGQpOwotCQlhaGRfY2xlYXJfY3JpdGljYWxfc2VjdGlvbihhaGQpOwogCQlpbnRzdGF0ID0gYWhkX2luYihhaGQsIElOVFNUQVQpOwotCQlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7Ci0JCWlmICgoYWhkX2luYihhaGQsIFNTVEFUMCkgJiAoU0VMRE98U0VMSU5HTykpID09IDApCi0JCQlhaGRfb3V0YihhaGQsIFNDU0lTRVEwLAotCQkJCSBhaGRfaW5iKGFoZCwgU0NTSVNFUTApICYgfkVOU0VMTyk7Ci0JCS8qCi0JCSAqIEluIHRoZSBub24tcGFja2V0aXplZCBjYXNlLCB0aGUgc2VxdWVuY2VyIChmb3IgUmV2IEEpLAotCQkgKiByZWxpZXMgb24gRU5TRUxPIHJlbWFpbmluZyBzZXQgYWZ0ZXIgU0VMRE8uICBUaGUgaGFyZHdhcmUKLQkJICogYXV0by1jbGVhcnMgRU5TRUxPIGluIHRoZSBwYWNrZXRpemVkIGNhc2UuCi0JCSAqLwotCQl3YWl0aW5nX3NjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwKLQkJCQkJICAgICBhaGRfaW53KGFoZCwgV0FJVElOR19USURfSEVBRCkpOwotCQlpZiAod2FpdGluZ19zY2IgIT0gTlVMTAotCQkgJiYgKHdhaXRpbmdfc2NiLT5mbGFncyAmIFNDQl9QQUNLRVRJWkVEKSA9PSAwCi0JCSAmJiAoYWhkX2luYihhaGQsIFNTVEFUMCkgJiAoU0VMRE98U0VMSU5HTykpICE9IDApCi0JCQlhaGRfb3V0YihhaGQsIFNDU0lTRVEwLAotCQkJCSBhaGRfaW5iKGFoZCwgU0NTSVNFUTApIHwgRU5TRUxPKTsKKwkJaWYgKChpbnRzdGF0ICYgSU5UX1BFTkQpID09IDApIHsKKwkJCWFoZF9jbGVhcl9jcml0aWNhbF9zZWN0aW9uKGFoZCk7CisJCQlpbnRzdGF0ID0gYWhkX2luYihhaGQsIElOVFNUQVQpOworCQl9CiAJfSB3aGlsZSAoLS1tYXhsb29wcwogCSAgICAgICYmIChpbnRzdGF0ICE9IDB4RkYgfHwgKGFoZC0+ZmVhdHVyZXMgJiBBSERfUkVNT1ZBQkxFKSA9PSAwKQogCSAgICAgICYmICgoaW50c3RhdCAmIElOVF9QRU5EKSAhPSAwCkBAIC02OTczLDE3ICs3MDMyLDggQEAKIAkJcHJpbnRmKCJJbmZpbml0ZSBpbnRlcnJ1cHQgbG9vcCwgSU5UU1RBVCA9ICV4IiwKIAkJICAgICAgYWhkX2luYihhaGQsIElOVFNUQVQpKTsKIAl9Ci0JcWZyZWV6ZV9jbnQgPSBhaGRfaW53KGFoZCwgUUZSRUVaRV9DT1VOVCk7Ci0JaWYgKHFmcmVlemVfY250ID09IDApIHsKLQkJcHJpbnRmKCIlczogYWhkX3BhdXNlX2FuZF9mbHVzaHdvcmsgd2l0aCAwIHFmcmVlemUgY291bnQhXG4iLAotCQkgICAgICAgYWhkX25hbWUoYWhkKSk7Ci0JfSBlbHNlIHsKLQkJcWZyZWV6ZV9jbnQtLTsKLQl9Ci0JYWhkX291dHcoYWhkLCBRRlJFRVpFX0NPVU5ULCBxZnJlZXplX2NudCk7Ci0JaWYgKHFmcmVlemVfY250ID09IDApCi0JCWFoZF9vdXRiKGFoZCwgU0VRX0ZMQUdTMiwKLQkJCSBhaGRfaW5iKGFoZCwgU0VRX0ZMQUdTMikgJiB+U0VMRUNUT1VUX1FGUk9aRU4pOworCWFoZC0+cWZyZWV6ZV9jbnQrKzsKKwlhaGRfb3V0dyhhaGQsIEtFUk5FTF9RRlJFRVpFX0NPVU5ULCBhaGQtPnFmcmVlemVfY250KTsKIAogCWFoZF9mbHVzaF9xb3V0ZmlmbyhhaGQpOwogCkBAIC03MTU1LDEwICs3MjA1LDcgQEAKIAkJdWludDMyX3QgYnVzYWRkcjsKIAogCQlidXNhZGRyID0gYWhkX2xlMzJ0b2goc2NiLT5oc2NiLT5oc2NiX2J1c2FkZHIpOwotCQlhaGRfb3V0YihhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSICsgMCwgYnVzYWRkciAmIDB4RkYpOwotCQlhaGRfb3V0YihhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSICsgMSwgKGJ1c2FkZHIgPj4gOCkgJiAweEZGKTsKLQkJYWhkX291dGIoYWhkLCBORVhUX1FVRVVFRF9TQ0JfQUREUiArIDIsIChidXNhZGRyID4+IDE2KSAmIDB4RkYpOwotCQlhaGRfb3V0YihhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSICsgMywgKGJ1c2FkZHIgPj4gMjQpICYgMHhGRik7CisJCWFoZF9vdXRsKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIsIGJ1c2FkZHIpOwogCX0gZWxzZSB7CiAJCXByZXZfc2NiLT5oc2NiLT5uZXh0X2hzY2JfYnVzYWRkciA9IHNjYi0+aHNjYi0+aHNjYl9idXNhZGRyOwogCQlhaGRfc3luY19zY2IoYWhkLCBwcmV2X3NjYiwgCkBAIC03MjY1LDEwICs3MzEyLDcgQEAKIAkgKi8KIAlhaGQtPnFpbmZpZm9uZXh0ID0gcWluc3RhcnQ7CiAJYnVzYWRkciA9IGFoZF9sZTMydG9oKGFoZC0+bmV4dF9xdWV1ZWRfaHNjYi0+aHNjYl9idXNhZGRyKTsKLQlhaGRfb3V0YihhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSICsgMCwgYnVzYWRkciAmIDB4RkYpOwotCWFoZF9vdXRiKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIgKyAxLCAoYnVzYWRkciA+PiA4KSAmIDB4RkYpOwotCWFoZF9vdXRiKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIgKyAyLCAoYnVzYWRkciA+PiAxNikgJiAweEZGKTsKLQlhaGRfb3V0YihhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSICsgMywgKGJ1c2FkZHIgPj4gMjQpICYgMHhGRik7CisJYWhkX291dGwoYWhkLCBORVhUX1FVRVVFRF9TQ0JfQUREUiwgYnVzYWRkcik7CiAKIAl3aGlsZSAocWlucG9zICE9IHFpbnRhaWwpIHsKIAkJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBhaGQtPnFpbmZpZm9bcWlucG9zXSk7CkBAIC03MzMwLDYgKzczNzQsNyBAQAogCSAqIGFwcHJvcHJpYXRlLCB0cmF2ZXJzZSB0aGUgU0NCcyBvZiBlYWNoICJ0aGVpciBpZCIKIAkgKiBsb29raW5nIGZvciBtYXRjaGVzLgogCSAqLworCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKIAlzYXZlZHNjYnB0ciA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CiAJdGlkX25leHQgPSBhaGRfaW53KGFoZCwgV0FJVElOR19USURfSEVBRCk7CiAJdGlkX3ByZXYgPSBTQ0JfTElTVF9OVUxMOwpAQCAtNzM5OSw3ICs3NDQ0LDcgQEAKIAl1X2ludAlwcmV2OwogCWludAlmb3VuZDsKIAotCUFIRF9BU1NFUlRfTU9ERVMoYWhkLCBBSERfTU9ERV9DQ0hBTl9NU0ssIEFIRF9NT0RFX0NDSEFOX01TSyk7CisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX1NDU0lfTVNLLCBBSERfTU9ERV9TQ1NJX01TSyk7CiAJZm91bmQgPSAwOwogCXByZXYgPSBTQ0JfTElTVF9OVUxMOwogCW5leHQgPSAqbGlzdF9oZWFkOwpAQCAtNzQ2Niw3ICs3NTExLDcgQEAKIGFoZF9zdGl0Y2hfdGlkX2xpc3Qoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0aWRfcHJldiwKIAkJICAgIHVfaW50IHRpZF9jdXIsIHVfaW50IHRpZF9uZXh0KQogewotCUFIRF9BU1NFUlRfTU9ERVMoYWhkLCBBSERfTU9ERV9DQ0hBTl9NU0ssIEFIRF9NT0RFX0NDSEFOX01TSyk7CisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX1NDU0lfTVNLLCBBSERfTU9ERV9TQ1NJX01TSyk7CiAKIAlpZiAoU0NCSURfSVNfTlVMTCh0aWRfY3VyKSkgewogCkBAIC03NTA2LDcgKzc1NTEsNyBAQAogewogCXVfaW50IHRhaWxfb2Zmc2V0OwogCi0JQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX0NDSEFOX01TSywgQUhEX01PREVfQ0NIQU5fTVNLKTsKKwlBSERfQVNTRVJUX01PREVTKGFoZCwgQUhEX01PREVfU0NTSV9NU0ssIEFIRF9NT0RFX1NDU0lfTVNLKTsKIAlpZiAoIVNDQklEX0lTX05VTEwocHJldikpIHsKIAkJYWhkX3NldF9zY2JwdHIoYWhkLCBwcmV2KTsKIAkJYWhkX291dHcoYWhkLCBTQ0JfTkVYVCwgbmV4dCk7CkBAIC03NzM5LDcgKzc3ODQsNyBAQAogCSAqLwogCWFoZF9jbGVhcl9tc2dfc3RhdGUoYWhkKTsKIAlhaGRfb3V0YihhaGQsIFNJTU9ERTEsCi0JCSBhaGRfaW5iKGFoZCwgU0lNT0RFMSkgJiB+KEVOQlVTRlJFRXxFTlNDU0lSU1R8RU5CVVNGUkVFKSk7CisJCSBhaGRfaW5iKGFoZCwgU0lNT0RFMSkgJiB+KEVOQlVTRlJFRXxFTlNDU0lSU1QpKTsKIAogCWlmIChpbml0aWF0ZV9yZXNldCkKIAkJYWhkX3Jlc2V0X2N1cnJlbnRfYnVzKGFoZCk7CkBAIC03OTEwLDMwICs3OTU1LDM1IEBACiB2b2lkCiBhaGRfaGFuZGxlX3Njc2lfc3RhdHVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQogewotCXN0cnVjdCBoYXJkd2FyZV9zY2IgKmhzY2I7Ci0JdV9pbnQgIHFmcmVlemVfY250OworCXN0cnVjdAloYXJkd2FyZV9zY2IgKmhzY2I7CisJaW50CXBhdXNlZDsKIAogCS8qCiAJICogVGhlIHNlcXVlbmNlciBmcmVlemVzIGl0cyBzZWxlY3Qtb3V0IHF1ZXVlCiAJICogYW55dGltZSBhIFNDU0kgc3RhdHVzIGVycm9yIG9jY3Vycy4gIFdlIG11c3QKLQkgKiBoYW5kbGUgdGhlIGVycm9yIGFuZCBkZWNyZW1lbnQgdGhlIFFGUkVFWkUgY291bnQKLQkgKiB0byBhbGxvdyB0aGUgc2VxdWVuY2VyIHRvIGNvbnRpbnVlLgorCSAqIGhhbmRsZSB0aGUgZXJyb3IgYW5kIGluY3JlbWVudCBvdXIgcWZyZWV6ZSBjb3VudAorCSAqIHRvIGFsbG93IHRoZSBzZXF1ZW5jZXIgdG8gY29udGludWUuICBXZSBkb24ndAorCSAqIGJvdGhlciBjbGVhcmluZyBjcml0aWNhbCBzZWN0aW9ucyBoZXJlIHNpbmNlIGFsbAorCSAqIG9wZXJhdGlvbnMgYXJlIG9uIGRhdGEgc3RydWN0dXJlcyB0aGF0IHRoZSBzZXF1ZW5jZXIKKwkgKiBpcyBub3QgdG91Y2hpbmcgb25jZSB0aGUgcXVldWUgaXMgZnJvemVuLgogCSAqLwogCWhzY2IgPSBzY2ItPmhzY2I7IAogCisJaWYgKGFoZF9pc19wYXVzZWQoYWhkKSkgeworCQlwYXVzZWQgPSAxOworCX0gZWxzZSB7CisJCXBhdXNlZCA9IDA7CisJCWFoZF9wYXVzZShhaGQpOworCX0KKwogCS8qIEZyZWV6ZSB0aGUgcXVldWUgdW50aWwgdGhlIGNsaWVudCBzZWVzIHRoZSBlcnJvci4gKi8KIAlhaGRfZnJlZXplX2RldnEoYWhkLCBzY2IpOwogCWFoZF9mcmVlemVfc2NiKHNjYik7Ci0JcWZyZWV6ZV9jbnQgPSBhaGRfaW53KGFoZCwgUUZSRUVaRV9DT1VOVCk7Ci0JaWYgKHFmcmVlemVfY250ID09IDApIHsKLQkJcHJpbnRmKCIlczogQmFkIHN0YXR1cyB3aXRoIDAgcWZyZWV6ZSBjb3VudCFcbiIsIGFoZF9uYW1lKGFoZCkpOwotCX0gZWxzZSB7Ci0JCXFmcmVlemVfY250LS07Ci0JCWFoZF9vdXR3KGFoZCwgUUZSRUVaRV9DT1VOVCwgcWZyZWV6ZV9jbnQpOwotCX0KLQlpZiAocWZyZWV6ZV9jbnQgPT0gMCkKLQkJYWhkX291dGIoYWhkLCBTRVFfRkxBR1MyLAotCQkJIGFoZF9pbmIoYWhkLCBTRVFfRkxBR1MyKSAmIH5TRUxFQ1RPVVRfUUZST1pFTik7CisJYWhkLT5xZnJlZXplX2NudCsrOworCWFoZF9vdXR3KGFoZCwgS0VSTkVMX1FGUkVFWkVfQ09VTlQsIGFoZC0+cWZyZWV6ZV9jbnQpOworCisJaWYgKHBhdXNlZCA9PSAwKQorCQlhaGRfdW5wYXVzZShhaGQpOwogCiAJLyogRG9uJ3Qgd2FudCB0byBjbG9iYmVyIHRoZSBvcmlnaW5hbCBzZW5zZSBjb2RlICovCiAJaWYgKChzY2ItPmZsYWdzICYgU0NCX1NFTlNFKSAhPSAwKSB7CkBAIC04MzE3LDggKzgzNjcsNyBAQAogCW1heF9wcm9nID0gMjA0ODsKIAogCWFoZF9vdXRiKGFoZCwgU0VRQ1RMMCwgUEVSUk9SRElTfEZBSUxESVN8RkFTVE1PREV8TE9BRFJBTSk7Ci0JYWhkX291dGIoYWhkLCBQUkdNQ05ULCAwKTsKLQlhaGRfb3V0YihhaGQsIFBSR01DTlQrMSwgMCk7CisJYWhkX291dHcoYWhkLCBQUkdNQ05ULCAwKTsKIAlmb3IgKGkgPSAwOyBpIDwgbWF4X3Byb2c7IGkrKykgewogCQl1aW50OF90IGluc19ieXRlc1s0XTsKIApAQCAtODM0NywxMyArODM5NiwxNCBAQAogCXVfaW50CXNnX3ByZWZldGNoX2NudF9saW1pdDsKIAl1X2ludAlzZ19wcmVmZXRjaF9hbGlnbjsKIAl1X2ludAlzZ19zaXplOworCXVfaW50CWNhY2hlbGluZV9tYXNrOwogCXVpbnQ4X3QJZG93bmxvYWRfY29uc3RzW0RPV05MT0FEX0NPTlNUX0NPVU5UXTsKIAogCWlmIChib290dmVyYm9zZSkKIAkJcHJpbnRmKCIlczogRG93bmxvYWRpbmcgU2VxdWVuY2VyIFByb2dyYW0uLi4iLAogCQkgICAgICAgYWhkX25hbWUoYWhkKSk7CiAKLSNpZiBET1dOTE9BRF9DT05TVF9DT1VOVCAhPSA3CisjaWYgRE9XTkxPQURfQ09OU1RfQ09VTlQgIT0gOAogI2Vycm9yICJEb3dubG9hZCBDb25zdCBNaXNtYXRjaCIKICNlbmRpZgogCS8qCkBAIC04Mzg5LDYgKzg0MzksOSBAQAogCS8qIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgcG93ZXIgb2YgMi4gKi8KIAl3aGlsZSAocG93ZXJvZjIoc2dfcHJlZmV0Y2hfYWxpZ24pID09IDApCiAJCXNnX3ByZWZldGNoX2FsaWduLS07CisKKwljYWNoZWxpbmVfbWFzayA9IHNnX3ByZWZldGNoX2FsaWduIC0gMTsKKwogCS8qCiAJICogSWYgdGhlIGNhY2hlbGluZSBib3VuZGFyeSBpcyBncmVhdGVyIHRoYW4gaGFsZiBvdXIgcHJlZmV0Y2ggUkFNCiAJICogd2UgcmlzayBub3QgYmVpbmcgYWJsZSB0byBmZXRjaCBldmVuIGEgc2luZ2xlIGNvbXBsZXRlIFMvRwpAQCAtODQyOSwxMiArODQ4MiwxMiBAQAogCWRvd25sb2FkX2NvbnN0c1tQS1RfT1ZFUlJVTl9CVUZPRkZTRVRdID0KIAkJKGFoZC0+b3ZlcnJ1bl9idWYgLSAodWludDhfdCAqKWFoZC0+cW91dGZpZm8pIC8gMjU2OwogCWRvd25sb2FkX2NvbnN0c1tTQ0JfVFJBTlNGRVJfU0laRV0gPSBTQ0JfVFJBTlNGRVJfU0laRV8xQllURV9MVU47CisJZG93bmxvYWRfY29uc3RzW0NBQ0hFTElORV9NQVNLXSA9IGNhY2hlbGluZV9tYXNrOwogCWN1cl9wYXRjaCA9IHBhdGNoZXM7CiAJZG93bmxvYWRlZCA9IDA7CiAJc2tpcF9hZGRyID0gMDsKIAlhaGRfb3V0YihhaGQsIFNFUUNUTDAsIFBFUlJPUkRJU3xGQUlMRElTfEZBU1RNT0RFfExPQURSQU0pOwotCWFoZF9vdXRiKGFoZCwgUFJHTUNOVCwgMCk7Ci0JYWhkX291dGIoYWhkLCBQUkdNQ05UKzEsIDApOworCWFoZF9vdXR3KGFoZCwgUFJHTUNOVCwgMCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNlcXByb2cpLzQ7IGkrKykgewogCQlpZiAoYWhkX2NoZWNrX3BhdGNoKGFoZCwgJmN1cl9wYXRjaCwgaSwgJnNraXBfYWRkcikgPT0gMCkgewpAQCAtODcyNyw3ICs4NzgwLDcgQEAKIAlwcmludGYoIj4+Pj4+Pj4+Pj4+Pj4+Pj4+PiBEdW1wIENhcmQgU3RhdGUgQmVnaW5zIDw8PDw8PDw8PDw8PDw8PDw8XG4iCiAJICAgICAgICIlczogRHVtcGluZyBDYXJkIFN0YXRlIGF0IHByb2dyYW0gYWRkcmVzcyAweCV4IE1vZGUgMHgleFxuIiwKIAkgICAgICAgYWhkX25hbWUoYWhkKSwgCi0JICAgICAgIGFoZF9pbmIoYWhkLCBDVVJBRERSKSB8IChhaGRfaW5iKGFoZCwgQ1VSQUREUisxKSA8PCA4KSwKKwkgICAgICAgYWhkX2ludyhhaGQsIENVUkFERFIpLAogCSAgICAgICBhaGRfYnVpbGRfbW9kZV9zdGF0ZShhaGQsIGFoZC0+c2F2ZWRfc3JjX21vZGUsCiAJCQkJICAgIGFoZC0+c2F2ZWRfZHN0X21vZGUpKTsKIAlpZiAocGF1c2VkKQpAQCAtODg0Myw2ICs4ODk2LDE1IEBACiAJCXNjYl9pbmRleCA9IGFoZF9pbndfc2NicmFtKGFoZCwgU0NCX05FWFRfQ09NUExFVEUpOwogCX0KIAlwcmludGYoIlxuIik7CisJcHJpbnRmKCJTZXF1ZW5jZXIgT24gUUZyZWV6ZSBhbmQgQ29tcGxldGUgbGlzdDogIik7CisJc2NiX2luZGV4ID0gYWhkX2ludyhhaGQsIENPTVBMRVRFX09OX1FGUkVFWkVfSEVBRCk7CisJaSA9IDA7CisJd2hpbGUgKCFTQ0JJRF9JU19OVUxMKHNjYl9pbmRleCkgJiYgaSsrIDwgQUhEX1NDQl9NQVgpIHsKKwkJYWhkX3NldF9zY2JwdHIoYWhkLCBzY2JfaW5kZXgpOworCQlwcmludGYoIiVkICIsIHNjYl9pbmRleCk7CisJCXNjYl9pbmRleCA9IGFoZF9pbndfc2NicmFtKGFoZCwgU0NCX05FWFRfQ09NUExFVEUpOworCX0KKwlwcmludGYoIlxuIik7CiAJYWhkX3NldF9zY2JwdHIoYWhkLCBzYXZlZF9zY2JfaW5kZXgpOwogCWRmZnN0YXQgPSBhaGRfaW5iKGFoZCwgREZGU1RBVCk7CiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewpAQCAtOTA3Nyw3ICs5MTM5LDcgQEAKIHsKIAlpbnQgY250OwogCi0JY250ID0gMjA7CisJY250ID0gNTAwMDsKIAl3aGlsZSAoKGFoZF9pbmIoYWhkLCBTRUVTVEFUKSAmIChTRUVBUkJBQ0t8U0VFQlVTWSkpICE9IDAgJiYgLS1jbnQpCiAJCWFoZF9kZWxheSg1KTsKIApAQCAtOTQyMywxMyArOTQ4NSw5IEBACiAJCQlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfTVVMVElfVElEKSAhPSAwKSB7CiAJCQkJdV9pbnQgdGFyZ2lkX21hc2s7CiAKLQkJCQl0YXJnaWRfbWFzayA9IGFoZF9pbmIoYWhkLCBUQVJHSUQpCi0JCQkJCSAgICB8IChhaGRfaW5iKGFoZCwgVEFSR0lEICsgMSkgPDwgOCk7Ci0KKwkJCQl0YXJnaWRfbWFzayA9IGFoZF9pbncoYWhkLCBUQVJHSUQpOwogCQkJCXRhcmdpZF9tYXNrIHw9IHRhcmdldF9tYXNrOwotCQkJCWFoZF9vdXRiKGFoZCwgVEFSR0lELCB0YXJnaWRfbWFzayk7Ci0JCQkJYWhkX291dGIoYWhkLCBUQVJHSUQrMSwgKHRhcmdpZF9tYXNrID4+IDgpKTsKLQkJCQkKKwkJCQlhaGRfb3V0dyhhaGQsIFRBUkdJRCwgdGFyZ2lkX21hc2spOwogCQkJCWFoZF91cGRhdGVfc2NzaWlkKGFoZCwgdGFyZ2lkX21hc2spOwogCQkJfSBlbHNlIHsKIAkJCQl1X2ludCBvdXJfaWQ7CkBAIC05NTQzLDE0ICs5NjAxLDkgQEAKIAkJCQlpZiAoYWhkLT5mZWF0dXJlcyAmIEFIRF9NVUxUSV9USUQpIHsKIAkJCQkJdV9pbnQgdGFyZ2lkX21hc2s7CiAKLQkJCQkJdGFyZ2lkX21hc2sgPSBhaGRfaW5iKGFoZCwgVEFSR0lEKQotCQkJCQkJICAgIHwgKGFoZF9pbmIoYWhkLCBUQVJHSUQgKyAxKQotCQkJCQkJICAgICAgIDw8IDgpOwotCisJCQkJCXRhcmdpZF9tYXNrID0gYWhkX2ludyhhaGQsIFRBUkdJRCk7CiAJCQkJCXRhcmdpZF9tYXNrICY9IH50YXJnZXRfbWFzazsKLQkJCQkJYWhkX291dGIoYWhkLCBUQVJHSUQsIHRhcmdpZF9tYXNrKTsKLQkJCQkJYWhkX291dGIoYWhkLCBUQVJHSUQrMSwKLQkJCQkJIAkgKHRhcmdpZF9tYXNrID4+IDgpKTsKKwkJCQkJYWhkX291dHcoYWhkLCBUQVJHSUQsIHRhcmdpZF9tYXNrKTsKIAkJCQkJYWhkX3VwZGF0ZV9zY3NpaWQoYWhkLCB0YXJnaWRfbWFzayk7CiAJCQkJfQogCQkJfQpAQCAtOTY1MSw3ICs5NzA0LDcgQEAKIAogCQljbWQtPmNtZF92YWxpZCA9IDA7CiAJCWFoZF9kbWFtYXBfc3luYyhhaGQsIGFoZC0+c2hhcmVkX2RhdGFfZG1hdCwKLQkJCQlhaGQtPnNoYXJlZF9kYXRhX2RtYW1hcCwKKwkJCQlhaGQtPnNoYXJlZF9kYXRhX21hcC5kbWFtYXAsCiAJCQkJYWhkX3RhcmdldGNtZF9vZmZzZXQoYWhkLCBhaGQtPnRxaW5maWZvbmV4dCksCiAJCQkJc2l6ZW9mKHN0cnVjdCB0YXJnZXRfY21kKSwKIAkJCQlCVVNfRE1BU1lOQ19QUkVSRUFEKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfaW5saW5lLmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2lubGluZS5oCmluZGV4IGQ4MGJjNTEuLjkxYzRmN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfaW5saW5lLmgKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9pbmxpbmUuaApAQCAtMzcsNyArMzcsNyBAQAogICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKgotICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3OXh4X2lubGluZS5oIzUxICQKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eF9pbmxpbmUuaCM1OCAkCiAgKgogICogJEZyZWVCU0QkCiAgKi8KQEAgLTUyMiwxMiArNTIyLDIxIEBACiBzdGF0aWMgX19pbmxpbmUgdWludDE2X3QKIGFoZF9pbncoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBwb3J0KQogeworCS8qCisJICogUmVhZCBoaWdoIGJ5dGUgZmlyc3QgYXMgc29tZSByZWdpc3RlcnMgaW5jcmVtZW50CisJICogb3IgaGF2ZSBvdGhlciBzaWRlIGVmZmVjdHMgd2hlbiB0aGUgbG93IGJ5dGUgaXMKKwkgKiByZWFkLgorCSAqLwogCXJldHVybiAoKGFoZF9pbmIoYWhkLCBwb3J0KzEpIDw8IDgpIHwgYWhkX2luYihhaGQsIHBvcnQpKTsKIH0KIAogc3RhdGljIF9faW5saW5lIHZvaWQKIGFoZF9vdXR3KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgcG9ydCwgdV9pbnQgdmFsdWUpCiB7CisJLyoKKwkgKiBXcml0ZSBsb3cgYnl0ZSBmaXJzdCB0byBhY2NvbW9kYXRlIHJlZ2lzdGVycworCSAqIHN1Y2ggYXMgUFJHTUNOVCB3aGVyZSB0aGUgb3JkZXIgbWF0ZXJzLgorCSAqLwogCWFoZF9vdXRiKGFoZCwgcG9ydCwgdmFsdWUgJiAweEZGKTsKIAlhaGRfb3V0YihhaGQsIHBvcnQrMSwgKHZhbHVlID4+IDgpICYgMHhGRik7CiB9CkBAIC02ODQsNyArNjkzLDcgQEAKIAkgKiBSYXpvciAjNTI4CiAJICovCiAJdmFsdWUgPSBhaGRfaW5iKGFoZCwgb2Zmc2V0KTsKLQlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfUENJWF9TQ0JSQU1fUkRfQlVHKSAhPSAwKQorCWlmICgoYWhkLT5idWdzICYgQUhEX1BDSVhfU0NCUkFNX1JEX0JVRykgIT0gMCkKIAkJYWhkX2luYihhaGQsIE1PREVfUFRSKTsKIAlyZXR1cm4gKHZhbHVlKTsKIH0KQEAgLTcyNyw3ICs3MzYsOCBAQAogc3RhdGljIF9faW5saW5lIHZvaWQKIGFoZF9zd2FwX3dpdGhfbmV4dF9oc2NiKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQogewotCXN0cnVjdCBoYXJkd2FyZV9zY2IgKnFfaHNjYjsKKwlzdHJ1Y3QJIGhhcmR3YXJlX3NjYiAqcV9oc2NiOworCXN0cnVjdAkgbWFwX25vZGUgKnFfaHNjYl9tYXA7CiAJdWludDMyX3Qgc2F2ZWRfaHNjYl9idXNhZGRyOwogCiAJLyoKQEAgLTc0Myw2ICs3NTMsNyBAQAogCSAqIGxvY2F0ZSB0aGUgY29ycmVjdCBTQ0IgYnkgU0NCX1RBRy4KIAkgKi8KIAlxX2hzY2IgPSBhaGQtPm5leHRfcXVldWVkX2hzY2I7CisJcV9oc2NiX21hcCA9IGFoZC0+bmV4dF9xdWV1ZWRfaHNjYl9tYXA7CiAJc2F2ZWRfaHNjYl9idXNhZGRyID0gcV9oc2NiLT5oc2NiX2J1c2FkZHI7CiAJbWVtY3B5KHFfaHNjYiwgc2NiLT5oc2NiLCBzaXplb2YoKnNjYi0+aHNjYikpOwogCXFfaHNjYi0+aHNjYl9idXNhZGRyID0gc2F2ZWRfaHNjYl9idXNhZGRyOwpAQCAtNzUwLDcgKzc2MSw5IEBACiAKIAkvKiBOb3cgc3dhcCBIU0NCIHBvaW50ZXJzLiAqLwogCWFoZC0+bmV4dF9xdWV1ZWRfaHNjYiA9IHNjYi0+aHNjYjsKKwlhaGQtPm5leHRfcXVldWVkX2hzY2JfbWFwID0gc2NiLT5oc2NiX21hcDsKIAlzY2ItPmhzY2IgPSBxX2hzY2I7CisJc2NiLT5oc2NiX21hcCA9IHFfaHNjYl9tYXA7CiAKIAkvKiBOb3cgZGVmaW5lIHRoZSBtYXBwaW5nIGZyb20gdGFnIHRvIFNDQiBpbiB0aGUgc2NiaW5kZXggKi8KIAlhaGQtPnNjYl9kYXRhLnNjYmluZGV4W1NDQl9HRVRfVEFHKHNjYildID0gc2NiOwpAQCAtODI0LDggKzgzNyw5IEBACiBzdGF0aWMgX19pbmxpbmUgdm9pZAogYWhkX3N5bmNfcW91dGZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgb3ApCiB7Ci0JYWhkX2RtYW1hcF9zeW5jKGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LCBhaGQtPnNoYXJlZF9kYXRhX2RtYW1hcCwKLQkJCS8qb2Zmc2V0Ki8wLCAvKmxlbiovQUhDX1NDQl9NQVggKiBzaXplb2YodWludDE2X3QpLCBvcCk7CisJYWhkX2RtYW1hcF9zeW5jKGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LCBhaGQtPnNoYXJlZF9kYXRhX21hcC5kbWFtYXAsCisJCQkvKm9mZnNldCovMCwKKwkJCS8qbGVuKi9BSERfU0NCX01BWCAqIHNpemVvZihzdHJ1Y3QgYWhkX2NvbXBsZXRpb24pLCBvcCk7CiB9CiAKIHN0YXRpYyBfX2lubGluZSB2b2lkCkBAIC04MzQsNyArODQ4LDcgQEAKICNpZmRlZiBBSERfVEFSR0VUX01PREUKIAlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfVEFSR0VUUk9MRSkgIT0gMCkgewogCQlhaGRfZG1hbWFwX3N5bmMoYWhkLCBhaGQtPnNoYXJlZF9kYXRhX2RtYXQsCi0JCQkJYWhkLT5zaGFyZWRfZGF0YV9kbWFtYXAsCisJCQkJYWhkLT5zaGFyZWRfZGF0YV9tYXAuZG1hbWFwLAogCQkJCWFoZF90YXJnZXRjbWRfb2Zmc2V0KGFoZCwgMCksCiAJCQkJc2l6ZW9mKHN0cnVjdCB0YXJnZXRfY21kKSAqIEFIRF9UTU9ERV9DTURTLAogCQkJCW9wKTsKQEAgLTg1NCwxNyArODY4LDE3IEBACiAJdV9pbnQgcmV0dmFsOwogCiAJcmV0dmFsID0gMDsKLQlhaGRfZG1hbWFwX3N5bmMoYWhkLCBhaGQtPnNoYXJlZF9kYXRhX2RtYXQsIGFoZC0+c2hhcmVkX2RhdGFfZG1hbWFwLAotCQkJLypvZmZzZXQqL2FoZC0+cW91dGZpZm9uZXh0LCAvKmxlbiovMiwKLQkJCUJVU19ETUFTWU5DX1BPU1RSRUFEKTsKLQlpZiAoKGFoZC0+cW91dGZpZm9bYWhkLT5xb3V0Zmlmb25leHRdCi0JICAgICAmIFFPVVRGSUZPX0VOVFJZX1ZBTElEX0xFKSA9PSBhaGQtPnFvdXRmaWZvbmV4dF92YWxpZF90YWcpCisJYWhkX2RtYW1hcF9zeW5jKGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LCBhaGQtPnNoYXJlZF9kYXRhX21hcC5kbWFtYXAsCisJCQkvKm9mZnNldCovYWhkLT5xb3V0Zmlmb25leHQgKiBzaXplb2YoKmFoZC0+cW91dGZpZm8pLAorCQkJLypsZW4qL3NpemVvZigqYWhkLT5xb3V0ZmlmbyksIEJVU19ETUFTWU5DX1BPU1RSRUFEKTsKKwlpZiAoYWhkLT5xb3V0Zmlmb1thaGQtPnFvdXRmaWZvbmV4dF0udmFsaWRfdGFnCisJICA9PSBhaGQtPnFvdXRmaWZvbmV4dF92YWxpZF90YWcpCiAJCXJldHZhbCB8PSBBSERfUlVOX1FPVVRGSUZPOwogI2lmZGVmIEFIRF9UQVJHRVRfTU9ERQogCWlmICgoYWhkLT5mbGFncyAmIEFIRF9UQVJHRVRST0xFKSAhPSAwCiAJICYmIChhaGQtPmZsYWdzICYgQUhEX1RRSU5GSUZPX0JMT0NLRUQpID09IDApIHsKIAkJYWhkX2RtYW1hcF9zeW5jKGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LAotCQkJCWFoZC0+c2hhcmVkX2RhdGFfZG1hbWFwLAorCQkJCWFoZC0+c2hhcmVkX2RhdGFfbWFwLmRtYW1hcCwKIAkJCQlhaGRfdGFyZ2V0Y21kX29mZnNldChhaGQsIGFoZC0+dHFpbmZpZm9mbmV4dCksCiAJCQkJLypsZW4qL3NpemVvZihzdHJ1Y3QgdGFyZ2V0X2NtZCksCiAJCQkJQlVTX0RNQVNZTkNfUE9TVFJFQUQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmMKaW5kZXggMWM4Zjg3Mi4uMjU2N2UyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5jCkBAIC0xNDY4LDYgKzE0NjgsMzAgQEAKIAlpZiAoKHRzdGF0ZS0+YXV0b19uZWdvdGlhdGUgJiBtYXNrKSAhPSAwKSB7CiAJCXNjYi0+ZmxhZ3MgfD0gU0NCX0FVVE9fTkVHT1RJQVRFOwogCQlzY2ItPmhzY2ItPmNvbnRyb2wgfD0gTUtfTUVTU0FHRTsKKwkJfSBlbHNlIGlmIChjbWQtPmNtbmRbMF0gPT0gSU5RVUlSWQorCQkJJiYgKHRpbmZvLT5jdXJyLm9mZnNldCAhPSAwCisJCQkgfHwgdGluZm8tPmN1cnIud2lkdGggIT0gTVNHX0VYVF9XRFRSX0JVU184X0JJVAorCQkJIHx8IHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zICE9IDApCisJCQkmJiAodGluZm8tPmN1cnIucHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9JVV9SRVEpPT0wKSB7CisJCQkvKgorCQkJICogVGhlIFNDU0kgc3BlYyByZXF1aXJlcyBpbnF1aXJ5CisJCQkgKiBjb21tYW5kcyB0byBjb21wbGV0ZSB3aXRob3V0CisJCQkgKiByZXBvcnRpbmcgdW5pdCBhdHRlbnRpb24gY29uZGl0aW9ucy4KKwkJCSAqIEJlY2F1c2Ugb2YgdGhpcywgYW4gaW5xdWlyeSBjb21tYW5kCisJCQkgKiB0aGF0IG9jY3VycyBqdXN0IGFmdGVyIGEgZGV2aWNlIGlzCisJCQkgKiByZXNldCB3aWxsIHJlc3VsdCBpbiBhIGRhdGEgcGhhc2UKKwkJCSAqIHdpdGggbWlzbWF0Y2hlZCBuZWdvdGlhdGVkIHJhdGVzLgorCQkJICogVGhlIGNvcmUgYWxyZWFkeSBmb3JjZXMgYSByZW5lZ290aWF0aW9uCisJCQkgKiBmb3IgcmVzZXQgZXZlbnRzIHRoYXQgYXJlIHZpc2libGUgdG8KKwkJCSAqIG91ciBjb250cm9sbGVyIG9yIHRoYXQgd2UgaW5pdGlhdGUsCisJCQkgKiBidXQgYSB0aGlyZCBwYXJ0eSBkZXZpY2UgcmVzZXQgb3IgYQorCQkJICogaG90LXBsdWcgaW5zZXJ0aW9uIGNhbiBzdGlsbCBjYXVzZSB0aGlzCisJCQkgKiBpc3N1ZS4gIFRoZXJlZm9yZSwgd2UgZm9yY2UgYSByZS1uZWdvdGlhdGlvbgorCQkJICogZm9yIGV2ZXJ5IGlucXVpcnkgY29tbWFuZCB1bmxlc3Mgd2UKKwkJCSAqIGFyZSBhc3luYy4KKwkJCSAqLworCQkJc2NiLT5mbGFncyB8PSBTQ0JfTkVHT1RJQVRFOworCQkJc2NiLT5oc2NiLT5jb250cm9sIHw9IE1LX01FU1NBR0U7CiAJfQogCiAJaWYgKChkZXYtPmZsYWdzICYgKEFIRF9ERVZfUV9UQUdHRUR8QUhEX0RFVl9RX0JBU0lDKSkgIT0gMCkgewpAQCAtMjA1OCw2ICsyMDgyLDcgQEAKIAlpbnQgICAgcGF1c2VkOwogCWludCAgICB3YWl0OwogCWludCAgICBkaXNjb25uZWN0ZWQ7CisJaW50ICAgIGZvdW5kOwogCWFoZF9tb2RlX3N0YXRlIHNhdmVkX21vZGVzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTIxNzYsNyArMjIwMSw4IEBACiAJbGFzdF9waGFzZSA9IGFoZF9pbmIoYWhkLCBMQVNUUEhBU0UpOwogCXNhdmVkX3NjYnB0ciA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CiAJYWN0aXZlX3NjYnB0ciA9IHNhdmVkX3NjYnB0cjsKLQlpZiAoZGlzY29ubmVjdGVkICYmIChhaGRfaW5iKGFoZCwgU0VRX0ZMQUdTKSAmIE5PVF9JREVOVElGSUVEKSA9PSAwKSB7CisJaWYgKGRpc2Nvbm5lY3RlZCAmJiAoKGxhc3RfcGhhc2UgIT0gUF9CVVNGUkVFKSB8fCAKKwkJCSAgICAgKGFoZF9pbmIoYWhkLCBTRVFfRkxBR1MpICYgTk9UX0lERU5USUZJRUQpID09IDApKSB7CiAJCXN0cnVjdCBzY2IgKmJ1c19zY2I7CiAKIAkJYnVzX3NjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgYWN0aXZlX3NjYnB0cik7CkBAIC0yMTk0LDI4ICsyMjIwLDQxIEBACiAJICogYnVzIG9yIGlzIGluIHRoZSBkaXNjb25uZWN0ZWQgc3RhdGUuCiAJICovCiAJc2F2ZWRfc2NzaWlkID0gYWhkX2luYihhaGQsIFNBVkVEX1NDU0lJRCk7Ci0JaWYgKGxhc3RfcGhhc2UgIT0gUF9CVVNGUkVFCi0JICYmIChTQ0JfR0VUX1RBRyhwZW5kaW5nX3NjYikgPT0gYWN0aXZlX3NjYnB0cgorCWlmIChTQ0JfR0VUX1RBRyhwZW5kaW5nX3NjYikgPT0gYWN0aXZlX3NjYnB0cgogCSAgICAgfHwgKGZsYWcgPT0gU0NCX0RFVklDRV9SRVNFVAotCQkgJiYgU0NTSUlEX1RBUkdFVChhaGQsIHNhdmVkX3Njc2lpZCkgPT0gc2NtZF9pZChjbWQpKSkpIHsKKwkJICYmIFNDU0lJRF9UQVJHRVQoYWhkLCBzYXZlZF9zY3NpaWQpID09IHNjbWRfaWQoY21kKSkpIHsKIAogCQkvKgogCQkgKiBXZSdyZSBhY3RpdmUgb24gdGhlIGJ1cywgc28gYXNzZXJ0IEFUTgogCQkgKiBhbmQgaG9wZSB0aGF0IHRoZSB0YXJnZXQgcmVzcG9uZHMuCiAJCSAqLwogCQlwZW5kaW5nX3NjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgYWN0aXZlX3NjYnB0cik7Ci0JCXBlbmRpbmdfc2NiLT5mbGFncyB8PSBTQ0JfUkVDT1ZFUllfU0NCfGZsYWc7CisJCXBlbmRpbmdfc2NiLT5mbGFncyB8PSBTQ0JfUkVDT1ZFUllfU0NCfFNDQl9ERVZJQ0VfUkVTRVQ7CiAJCWFoZF9vdXRiKGFoZCwgTVNHX09VVCwgSE9TVF9NU0cpOwogCQlhaGRfb3V0YihhaGQsIFNDU0lTSUdPLCBsYXN0X3BoYXNlfEFUTk8pOwotCQlzY21kX3ByaW50ayhLRVJOX0lORk8sIGNtZCwgIkRldmljZSBpcyBhY3RpdmUsIGFzc2VydGluZyBBVE5cbiIpOworCQlzY21kX3ByaW50ayhLRVJOX0lORk8sIGNtZCwgIkJEUiBtZXNzYWdlIGluIG1lc3NhZ2UgYnVmZmVyXG4iKTsKIAkJd2FpdCA9IFRSVUU7CisJfSBlbHNlIGlmIChsYXN0X3BoYXNlICE9IFBfQlVTRlJFRQorCQkgICAmJiBhaGRfaW5iKGFoZCwgU0NTSVBIQVNFKSA9PSAwKSB7CisJCS8qCisJCSAqIFNDQiBpcyBub3QgaWRlbnRpZmllZCwgdGhlcmUKKwkJICogaXMgbm8gcGVuZGluZyBSRVEsIGFuZCB0aGUgc2VxdWVuY2VyCisJCSAqIGhhcyBub3Qgc2VlbiBhIGJ1c2ZyZWUuICBMb29rcyBsaWtlCisJCSAqIGEgc3R1Y2sgY29ubmVjdGlvbiB3YWl0aW5nIHRvCisJCSAqIGdvIGJ1c2ZyZWUuICBSZXNldCB0aGUgYnVzLgorCQkgKi8KKwkJZm91bmQgPSBhaGRfcmVzZXRfY2hhbm5lbChhaGQsIGNtZC0+ZGV2aWNlLT5jaGFubmVsICsgJ0EnLAorCQkJCQkgIC8qSW5pdGlhdGUgUmVzZXQqL1RSVUUpOworCQlwcmludGYoIiVzOiBJc3N1ZWQgQ2hhbm5lbCAlYyBCdXMgUmVzZXQuICIKKwkJICAgICAgICIlZCBTQ0JzIGFib3J0ZWRcbiIsIGFoZF9uYW1lKGFoZCksCisJCSAgICAgICBjbWQtPmRldmljZS0+Y2hhbm5lbCArICdBJywgZm91bmQpOwogCX0gZWxzZSBpZiAoZGlzY29ubmVjdGVkKSB7CiAKIAkJLyoKIAkJICogQWN0dWFsbHkgcmUtcXVldWUgdGhpcyBTQ0IgaW4gYW4gYXR0ZW1wdAogCQkgKiB0byBzZWxlY3QgdGhlIGRldmljZSBiZWZvcmUgaXQgcmVjb25uZWN0cy4KIAkJICovCi0JCXBlbmRpbmdfc2NiLT5mbGFncyB8PSBTQ0JfUkVDT1ZFUllfU0NCfFNDQl9BQk9SVDsKKwkJcGVuZGluZ19zY2ItPmZsYWdzIHw9IFNDQl9SRUNPVkVSWV9TQ0J8ZmxhZzsKIAkJYWhkX3NldF9zY2JwdHIoYWhkLCBTQ0JfR0VUX1RBRyhwZW5kaW5nX3NjYikpOwogCQlwZW5kaW5nX3NjYi0+aHNjYi0+Y2RiX2xlbiA9IDA7CiAJCXBlbmRpbmdfc2NiLT5oc2NiLT50YXNrX2F0dHJpYnV0ZSA9IDA7CkBAIC0yMjk2LDE2ICsyMzM1LDE3IEBACiAJCXRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKDUgKiBIWik7CiAJCXRpbWVyLmZ1bmN0aW9uID0gYWhkX2xpbnV4X3NlbV90aW1lb3V0OwogCQlhZGRfdGltZXIoJnRpbWVyKTsKLQkJcHJpbnRmKCJSZWNvdmVyeSBjb2RlIHNsZWVwaW5nXG4iKTsKKwkJcHJpbnRmKCIlczogUmVjb3ZlcnkgY29kZSBzbGVlcGluZ1xuIiwgYWhkX25hbWUoYWhkKSk7CiAJCWRvd24oJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZWhfc2VtKTsKLQkJcHJpbnRmKCJSZWNvdmVyeSBjb2RlIGF3YWtlXG4iKTsKKwkJcHJpbnRmKCIlczogUmVjb3ZlcnkgY29kZSBhd2FrZVxuIiwgYWhkX25hbWUoYWhkKSk7CiAgICAgICAgIAlyZXQgPSBkZWxfdGltZXJfc3luYygmdGltZXIpOwogCQlpZiAocmV0ID09IDApIHsKLQkJCXByaW50ZigiVGltZXIgRXhwaXJlZFxuIik7CisJCQlwcmludGYoIiVzOiBUaW1lciBFeHBpcmVkIChhY3RpdmUgJWQpXG4iLAorCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGRldi0+YWN0aXZlKTsKIAkJCXJldHZhbCA9IEZBSUxFRDsKIAkJfQogCX0KLQkJYWhkX3VubG9jayhhaGQsICZmbGFncyk7CisJYWhkX3VubG9jayhhaGQsICZmbGFncyk7CiAJcmV0dXJuIChyZXR2YWwpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uaAppbmRleCBiYzQ0MjIyLi5jYjc0ZmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5oCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmgKQEAgLTI1Miw3ICsyNTIsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNNUCBzdXBwb3J0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCi0jZGVmaW5lIEFJQzc5WFhfRFJJVkVSX1ZFUlNJT04gIjEuMy4xMSIKKyNkZWZpbmUgQUlDNzlYWF9EUklWRVJfVkVSU0lPTiAiMy4wIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqIERldmljZSBEYXRhIFN0cnVjdHVyZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcGNpLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5jCmluZGV4IDIxMzFkYjYuLjE5NmE2MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcGNpLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wY2kuYwpAQCAtMzgsOSArMzgsNyBAQAogICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKgotICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3OXh4X3BjaS5jIzc3ICQKLSAqCi0gKiAkRnJlZUJTRCQKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eF9wY2kuYyM4OSAkCiAgKi8KIAogI2lmZGVmIF9fbGludXhfXwpAQCAtMTE0LDYgKzExMiwxMyBAQAogCQkiQWRhcHRlYyAyOTMyMEFMUCBVbHRyYTMyMCBTQ1NJIGFkYXB0ZXIiLAogCQlhaGRfYWljNzkwMV9zZXR1cAogCX0sCisJLyogYWljNzkwMUEgYmFzZWQgY29udHJvbGxlcnMgKi8KKwl7CisJCUlEX0FIQV8yOTMyMExQLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMjkzMjBMUCBVbHRyYTMyMCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGRfYWljNzkwMUFfc2V0dXAKKwl9LAogCS8qIGFpYzc5MDIgYmFzZWQgY29udHJvbGxlcnMgKi8JCiAJewogCQlJRF9BSEFfMjkzMjAsCkBAIC0xMjgsMTIgKzEzMyw2IEBACiAJCWFoZF9haWM3OTAyX3NldHVwCiAJfSwKIAl7Ci0JCUlEX0FIQV8yOTMyMExQLAotCQlJRF9BTExfTUFTSywKLQkJIkFkYXB0ZWMgMjkzMjBMUCBVbHRyYTMyMCBTQ1NJIGFkYXB0ZXIiLAotCQlhaGRfYWljNzkwMUFfc2V0dXAKLQl9LAotCXsKIAkJSURfQUhBXzM5MzIwLAogCQlJRF9BTExfTUFTSywKIAkJIkFkYXB0ZWMgMzkzMjAgVWx0cmEzMjAgU0NTSSBhZGFwdGVyIiwKQEAgLTE0Niw2ICsxNDUsMTIgQEAKIAkJYWhkX2FpYzc5MDJfc2V0dXAKIAl9LAogCXsKKwkJSURfQUhBXzM5MzIwX0JfREVMTCwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIChEZWxsIE9FTSkgMzkzMjAgVWx0cmEzMjAgU0NTSSBhZGFwdGVyIiwKKwkJYWhkX2FpYzc5MDJfc2V0dXAKKwl9LAorCXsKIAkJSURfQUhBXzM5MzIwQSwKIAkJSURfQUxMX01BU0ssCiAJCSJBZGFwdGVjIDM5MzIwQSBVbHRyYTMyMCBTQ1NJIGFkYXB0ZXIiLApAQCAtNjY4LDYgKzY3Myw3IEBACiAJICogTm93IHNldCB0aGUgdGVybWluYXRpb24gYmFzZWQgb24gd2hhdCB3ZSBmb3VuZC4KIAkgKi8KIAlzeGZyY3RsMSA9IGFoZF9pbmIoYWhkLCBTWEZSQ1RMMSkgJiB+U1RQV0VOOworCWFoZC0+ZmxhZ3MgJj0gfkFIRF9URVJNX0VOQl9BOwogCWlmICgodGVybWN0bCAmIEZMWF9URVJNQ1RMX0VOUFJJTE9XKSAhPSAwKSB7CiAJCWFoZC0+ZmxhZ3MgfD0gQUhEX1RFUk1fRU5CX0E7CiAJCXN4ZnJjdGwxIHw9IFNUUFdFTjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcGNpLmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5oCmluZGV4IGI1Y2ZlYWIuLmRhNDUxNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcGNpLmgKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wY2kuaApAQCAtNTMsMTQgKzUzLDE1IEBACiAjZGVmaW5lIElEX0FIQV8yOTMyMEFMUAkJCTB4ODAxNzkwMDUwMDQ0OTAwNXVsbAogCiAjZGVmaW5lIElEX0FJQzc5MDFBCQkJMHg4MDFFOTAwNUZGRkY5MDA1dWxsCi0jZGVmaW5lIElEX0FIQV8yOTMyMAkJCTB4ODAxMjkwMDUwMDQyOTAwNXVsbAotI2RlZmluZSBJRF9BSEFfMjkzMjBCCQkJMHg4MDEzOTAwNTAwNDM5MDA1dWxsCiAjZGVmaW5lIElEX0FIQV8yOTMyMExQCQkJMHg4MDE0OTAwNTAwNDQ5MDA1dWxsCiAKICNkZWZpbmUgSURfQUlDNzkwMgkJCTB4ODAxRjkwMDVGRkZGOTAwNXVsbAogI2RlZmluZSBJRF9BSUM3OTAyX0IJCQkweDgwMUQ5MDA1RkZGRjkwMDV1bGwKICNkZWZpbmUgSURfQUhBXzM5MzIwCQkJMHg4MDEwOTAwNTAwNDA5MDA1dWxsCisjZGVmaW5lIElEX0FIQV8yOTMyMAkJCTB4ODAxMjkwMDUwMDQyOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMjkzMjBCCQkJMHg4MDEzOTAwNTAwNDM5MDA1dWxsCiAjZGVmaW5lIElEX0FIQV8zOTMyMF9CCQkJMHg4MDE1OTAwNTAwNDA5MDA1dWxsCisjZGVmaW5lIElEX0FIQV8zOTMyMF9CX0RFTEwJCTB4ODAxNTkwMDUwMTY4MTAyOHVsbAogI2RlZmluZSBJRF9BSEFfMzkzMjBBCQkJMHg4MDE2OTAwNTAwNDA5MDA1dWxsCiAjZGVmaW5lIElEX0FIQV8zOTMyMEQJCQkweDgwMTE5MDA1MDA0MTkwMDV1bGwKICNkZWZpbmUgSURfQUhBXzM5MzIwRF9CCQkJMHg4MDFDOTAwNTAwNDE5MDA1dWxsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3JlZy5oX3NoaXBwZWQgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3JlZy5oX3NoaXBwZWQKaW5kZXggYzAxYWMzOS4uODc2M2IxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9yZWcuaF9zaGlwcGVkCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcmVnLmhfc2hpcHBlZApAQCAtMiw4ICsyLDggQEAKICAqIERPIE5PVCBFRElUIC0gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCiAgKgkJIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2UgZmlsZXM6CiAgKgotICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3OXh4LnNlcSM5NCAkCi0gKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHgucmVnIzcwICQKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5zZXEjMTE5ICQKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5yZWcjNzYgJAogICovCiB0eXBlZGVmIGludCAoYWhkX3JlZ19wcmludF90KSh1X2ludCwgdV9pbnQgKiwgdV9pbnQpOwogdHlwZWRlZiBzdHJ1Y3QgYWhkX3JlZ19wYXJzZV9lbnRyeSB7CkBAIC04MywxMyArODMsNiBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCi1haGRfcmVnX3ByaW50X3QgYWhkX2NscnNlcWludHN0YXRfcHJpbnQ7Ci0jZWxzZQotI2RlZmluZSBhaGRfY2xyc2VxaW50c3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0xSU0VRSU5UU1RBVCIsIDB4MGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQotI2VuZGlmCi0KLSNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX3NlcWludHN0YXRfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfc2VxaW50c3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtOTcsNiArOTAsMTMgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9jbHJzZXFpbnRzdGF0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NscnNlcWludHN0YXRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNMUlNFUUlOVFNUQVQiLCAweDBjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9zd3RpbWVyX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX3N3dGltZXJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKQEAgLTQxMiwxMyArNDEyLDYgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9idXNpbml0aWRfcHJpbnQ7Ci0jZWxzZQotI2RlZmluZSBhaGRfYnVzaW5pdGlkX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJCVVNJTklUSUQiLCAweDNjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKLSNlbmRpZgotCi0jaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9kbGNvdW50X3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2RsY291bnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKQEAgLTQyNiw2ICs0MTksMTMgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9idXNpbml0aWRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfYnVzaW5pdGlkX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJCVVNJTklUSUQiLCAweDNjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9zeGZyY3RsMV9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9zeGZyY3RsMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtNTE3LDEzICs1MTcsNiBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCi1haGRfcmVnX3ByaW50X3QgYWhkX3NibGtjdGxfcHJpbnQ7Ci0jZWxzZQotI2RlZmluZSBhaGRfc2Jsa2N0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0JMS0NUTCIsIDB4NGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQotI2VuZGlmCi0KLSNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX29wdGlvbm1vZGVfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfb3B0aW9ubW9kZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtNTMxLDEwICs1MjQsMTAgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9zc3RhdDBfcHJpbnQ7CithaGRfcmVnX3ByaW50X3QgYWhkX3NibGtjdGxfcHJpbnQ7CiAjZWxzZQotI2RlZmluZSBhaGRfc3N0YXQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTU1RBVDAiLCAweDRiLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNkZWZpbmUgYWhkX3NibGtjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNCTEtDVEwiLCAweDRhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwpAQCAtNTQ1LDYgKzUzOCwxMyBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NzdGF0MF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zc3RhdDBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNTVEFUMCIsIDB4NGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX3NpbW9kZTBfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfc2ltb2RlMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtNTczLDEzICs1NzMsNiBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCi1haGRfcmVnX3ByaW50X3QgYWhkX2NscnNpbnQyX3ByaW50OwotI2Vsc2UKLSNkZWZpbmUgYWhkX2NscnNpbnQyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTFJTSU5UMiIsIDB4NGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQotI2VuZGlmCi0KLSNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX3NpbW9kZTJfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfc2ltb2RlMl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtNTg3LDYgKzU4MCwxMyBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NscnNpbnQyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NscnNpbnQyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTFJTSU5UMiIsIDB4NGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX3BlcnJkaWFnX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX3BlcnJkaWFnX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC02ODUsMTMgKzY4NSw2IEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKLWFoZF9yZWdfcHJpbnRfdCBhaGRfbHFvbW9kZTBfcHJpbnQ7Ci0jZWxzZQotI2RlZmluZSBhaGRfbHFvbW9kZTBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxRT01PREUwIiwgMHg1NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCi0jZW5kaWYKLQotI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfbHFvc3RhdDBfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfbHFvc3RhdDBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKQEAgLTcwNiw2ICs2OTksMjAgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9scW9tb2RlMF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9scW9tb2RlMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTFFPTU9ERTAiLCAweDU0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9scW9tb2RlMV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9scW9tb2RlMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTFFPTU9ERTEiLCAweDU1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9scW9zdGF0MV9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9scW9zdGF0MV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtNzIwLDEzICs3MjcsNiBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCi1haGRfcmVnX3ByaW50X3QgYWhkX2xxb21vZGUxX3ByaW50OwotI2Vsc2UKLSNkZWZpbmUgYWhkX2xxb21vZGUxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUU9NT0RFMSIsIDB4NTUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQotI2VuZGlmCi0KLSNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2xxb3N0YXQyX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2xxb3N0YXQyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC05MDksMTMgKzkwOSw2IEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKLWFoZF9yZWdfcHJpbnRfdCBhaGRfc2NzY2hrbl9wcmludDsKLSNlbHNlCi0jZGVmaW5lIGFoZF9zY3NjaGtuX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NDSEtOIiwgMHg2NiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCi0jZW5kaWYKLQotI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfYW5uZXhkYXRfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfYW5uZXhkYXRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKQEAgLTkyMyw2ICs5MTYsMTMgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zY3NjaGtuX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Njc2Noa25fcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDU0NIS04iLCAweDY2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9pb3duaWRfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfaW93bmlkX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xMDAwLDEzICsxMDAwLDYgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9wbGw0MDBjbnQwX3ByaW50OwotI2Vsc2UKLSNkZWZpbmUgYWhkX3BsbDQwMGNudDBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlBMTDQwMENOVDAiLCAweDZlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKLSNlbmRpZgotCi0jaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF91bmZhaXJuZXNzX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX3VuZmFpcm5lc3NfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKQEAgLTEwMTQsNiArMTAwNywxMyBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3BsbDQwMGNudDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcGxsNDAwY250MF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUExMNDAwQ05UMCIsIDB4NmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2hhZGRyX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2hhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xMDU2LDEzICsxMDU2LDYgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9zZ2hhZGRyX3ByaW50OwotI2Vsc2UKLSNkZWZpbmUgYWhkX3NnaGFkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHSEFERFIiLCAweDdjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKLSNlbmRpZgotCi0jaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9zY2JoYWRkcl9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9zY2JoYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTA3MCwxMCArMTA2MywxMCBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCi1haGRfcmVnX3ByaW50X3QgYWhkX3NnaGNudF9wcmludDsKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc2doYWRkcl9wcmludDsKICNlbHNlCi0jZGVmaW5lIGFoZF9zZ2hjbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHSENOVCIsIDB4ODQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2RlZmluZSBhaGRfc2doYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0dIQUREUiIsIDB4N2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCkBAIC0xMDg0LDYgKzEwNzcsMTMgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zZ2hjbnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2doY250X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTR0hDTlQiLCAweDg0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9kZmZfdGhyc2hfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfZGZmX3RocnNoX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xMTU0LDEzICsxMTU0LDYgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9kY2hyeG1zZzFfcHJpbnQ7Ci0jZWxzZQotI2RlZmluZSBhaGRfZGNocnhtc2cxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJEQ0hSWE1TRzEiLCAweDkxLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKLSNlbmRpZgotCi0jaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9jbWNyeG1zZzFfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfY21jcnhtc2cxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xMTY4LDYgKzExNjEsMTMgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9kY2hyeG1zZzFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGNocnhtc2cxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJEQ0hSWE1TRzEiLCAweDkxLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9kY2hyeG1zZzJfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfZGNocnhtc2cyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xMTc1LDEzICsxMTc1LDYgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9vdmx5cnhtc2cyX3ByaW50OwotI2Vsc2UKLSNkZWZpbmUgYWhkX292bHlyeG1zZzJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk9WTFlSWE1TRzIiLCAweDkyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKLSNlbmRpZgotCi0jaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9jbWNyeG1zZzJfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfY21jcnhtc2cyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xMTk2LDYgKzExODksMTMgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9vdmx5cnhtc2cyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX292bHlyeG1zZzJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk9WTFlSWE1TRzIiLCAweDkyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9kY2hyeG1zZzNfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfZGNocnhtc2czX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xMjAzLDYgKzEyMDMsMTMgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9vdmx5cnhtc2czX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX292bHlyeG1zZzNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk9WTFlSWE1TRzMiLCAweDkzLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9jbWNyeG1zZzNfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfY21jcnhtc2czX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xMjE3LDEzICsxMjI0LDYgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9vdmx5cnhtc2czX3ByaW50OwotI2Vsc2UKLSNkZWZpbmUgYWhkX292bHlyeG1zZzNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk9WTFlSWE1TRzMiLCAweDkzLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKLSNlbmRpZgotCi0jaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9vdmx5c2VxYmNudF9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9vdmx5c2VxYmNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTIzMSwxMyArMTIzMSw2IEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKLWFoZF9yZWdfcHJpbnRfdCBhaGRfY21jc2VxYmNudF9wcmludDsKLSNlbHNlCi0jZGVmaW5lIGFoZF9jbWNzZXFiY250X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTUNTRVFCQ05UIiwgMHg5NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCi0jZW5kaWYKLQotI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfZGNoc2VxYmNudF9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9kY2hzZXFiY250X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xMjQ1LDYgKzEyMzgsMTMgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9jbWNzZXFiY250X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NtY3NlcWJjbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNQ1NFUUJDTlQiLCAweDk0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9jbWNzcGx0c3RhdDBfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfY21jc3BsdHN0YXQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xMjUyLDEzICsxMjUyLDYgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9vdmx5c3BsdHN0YXQwX3ByaW50OwotI2Vsc2UKLSNkZWZpbmUgYWhkX292bHlzcGx0c3RhdDBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk9WTFlTUExUU1RBVDAiLCAweDk2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKLSNlbmRpZgotCi0jaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9kY2hzcGx0c3RhdDBfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfZGNoc3BsdHN0YXQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xMjY2LDEwICsxMjU5LDEwIEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKLWFoZF9yZWdfcHJpbnRfdCBhaGRfZGNoc3BsdHN0YXQxX3ByaW50OworYWhkX3JlZ19wcmludF90IGFoZF9vdmx5c3BsdHN0YXQwX3ByaW50OwogI2Vsc2UKLSNkZWZpbmUgYWhkX2RjaHNwbHRzdGF0MV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRENIU1BMVFNUQVQxIiwgMHg5NywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZGVmaW5lIGFoZF9vdmx5c3BsdHN0YXQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJPVkxZU1BMVFNUQVQwIiwgMHg5NiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKQEAgLTEyODcsNiArMTI4MCwxMyBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RjaHNwbHRzdGF0MV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kY2hzcGx0c3RhdDFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRDSFNQTFRTVEFUMSIsIDB4OTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX3Nncnhtc2cwX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX3Nncnhtc2cwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xMzc4LDEzICsxMzc4LDYgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9zZnVuY3RfcHJpbnQ7Ci0jZWxzZQotI2RlZmluZSBhaGRfc2Z1bmN0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRlVOQ1QiLCAweDlmLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKLSNlbmRpZgotCi0jaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9zZ3NwbHRzdGF0MV9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9zZ3NwbHRzdGF0MV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTM5Miw2ICsxMzg1LDEzIEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc2Z1bmN0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NmdW5jdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0ZVTkNUIiwgMHg5ZiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfZGYwcGNpc3RhdF9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9kZjBwY2lzdGF0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xNTA0LDEzICsxNTA0LDYgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9jY3NjYmFkZHJfcHJpbnQ7Ci0jZWxzZQotI2RlZmluZSBhaGRfY2NzY2JhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQkFERFIiLCAweGFjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKLSNlbmRpZgotCi0jaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9jY3NjYmFkcl9ia19wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9jY3NjYmFkcl9ia19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTUxOCw2ICsxNTExLDEzIEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfY2NzY2JhZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2Njc2NiYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NTQ0JBRERSIiwgMHhhYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfY21jX3JhbWJpc3RfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfY21jX3JhbWJpc3RfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKQEAgLTE1MjUsMTMgKzE1MjUsNiBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCi1haGRfcmVnX3ByaW50X3QgYWhkX2Njc2djdGxfcHJpbnQ7Ci0jZWxzZQotI2RlZmluZSBhaGRfY2NzZ2N0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NTR0NUTCIsIDB4YWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQotI2VuZGlmCi0KLSNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2Njc2NiY3RsX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2Njc2NiY3RsX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xNTM5LDYgKzE1MzIsMTMgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9jY3NnY3RsX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2Njc2djdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDU0dDVEwiLCAweGFkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9jY3NncmFtX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2Njc2dyYW1fcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKQEAgLTE3MDcsMTMgKzE3MDcsNiBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCi1haGRfcmVnX3ByaW50X3QgYWhkX2RmcHRyc19wcmludDsKLSNlbHNlCi0jZGVmaW5lIGFoZF9kZnB0cnNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGUFRSUyIsIDB4YzgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQotI2VuZGlmCi0KLSNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX3JjdnJiaWFzY2FsY19wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9yY3ZyYmlhc2NhbGNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKQEAgLTE3MjEsMTAgKzE3MTQsMTAgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9kZmJrcHRyX3ByaW50OworYWhkX3JlZ19wcmludF90IGFoZF9kZnB0cnNfcHJpbnQ7CiAjZWxzZQotI2RlZmluZSBhaGRfZGZia3B0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZCS1BUUiIsIDB4YzksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2RlZmluZSBhaGRfZGZwdHJzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJERlBUUlMiLCAweGM4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwpAQCAtMTczNSw2ICsxNzI4LDEzIEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfZGZia3B0cl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kZmJrcHRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJERkJLUFRSIiwgMHhjOSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfZGZkYmN0bF9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9kZmRiY3RsX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xODI2LDEzICsxODI2LDYgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9icmthZGRyMV9wcmludDsKLSNlbHNlCi0jZGVmaW5lIGFoZF9icmthZGRyMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQlJLQUREUjEiLCAweGU2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKLSNlbmRpZgotCi0jaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9icmthZGRyMF9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9icmthZGRyMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXApAQCAtMTg0MCw2ICsxODMzLDEzIEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfYnJrYWRkcjFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfYnJrYWRkcjFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJSS0FERFIxIiwgMHhlNiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfYWxsb25lc19wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9hbGxvbmVzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xODg5LDEzICsxODg5LDYgQEAKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9jdXJhZGRyX3ByaW50OwotI2Vsc2UKLSNkZWZpbmUgYWhkX2N1cmFkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNVUkFERFIiLCAweGY0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKLSNlbmRpZgotCi0jaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9pbnR2ZWMxX2FkZHJfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfaW50dmVjMV9hZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCkBAIC0xOTAzLDEwICsxODk2LDEwIEBACiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKLWFoZF9yZWdfcHJpbnRfdCBhaGRfaW50dmVjMl9hZGRyX3ByaW50OworYWhkX3JlZ19wcmludF90IGFoZF9jdXJhZGRyX3ByaW50OwogI2Vsc2UKLSNkZWZpbmUgYWhkX2ludHZlYzJfYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5UVkVDMl9BRERSIiwgMHhmNiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZGVmaW5lIGFoZF9jdXJhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDVVJBRERSIiwgMHhmNCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKQEAgLTE5MTcsNiArMTkxMCwxMyBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ludHZlYzJfYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9pbnR2ZWMyX2FkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVFZFQzJfQUREUiIsIDB4ZjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2xvbmdqbXBfYWRkcl9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9sb25nam1wX2FkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKQEAgLTE5OTQsMTkyICsxOTk0LDIxMyBAQAogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NvbXBsZXRlX2RtYV9zY2JfdGFpbF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jb21wbGV0ZV9kbWFfc2NiX3RhaWxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNPTVBMRVRFX0RNQV9TQ0JfVEFJTCIsIDB4MTJlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9jb21wbGV0ZV9vbl9xZnJlZXplX2hlYWRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY29tcGxldGVfb25fcWZyZWV6ZV9oZWFkX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDT01QTEVURV9PTl9RRlJFRVpFX0hFQUQiLCAweDEzMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfcWZyZWV6ZV9jb3VudF9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9xZnJlZXplX2NvdW50X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRRlJFRVpFX0NPVU5UIiwgMHgxMmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUUZSRUVaRV9DT1VOVCIsIDB4MTMyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9rZXJuZWxfcWZyZWV6ZV9jb3VudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9rZXJuZWxfcWZyZWV6ZV9jb3VudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiS0VSTkVMX1FGUkVFWkVfQ09VTlQiLCAweDEzNCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfc2F2ZWRfbW9kZV9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9zYXZlZF9tb2RlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQVZFRF9NT0RFIiwgMHgxMzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0FWRURfTU9ERSIsIDB4MTM2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9tc2dfb3V0X3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX21zZ19vdXRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk1TR19PVVQiLCAweDEzMSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJNU0dfT1VUIiwgMHgxMzcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2RtYXBhcmFtc19wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9kbWFwYXJhbXNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRNQVBBUkFNUyIsIDB4MTMyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRNQVBBUkFNUyIsIDB4MTM4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9zZXFfZmxhZ3NfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfc2VxX2ZsYWdzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRVFfRkxBR1MiLCAweDEzMywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRVFfRkxBR1MiLCAweDEzOSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfc2F2ZWRfc2NzaWlkX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX3NhdmVkX3Njc2lpZF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0FWRURfU0NTSUlEIiwgMHgxMzQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0FWRURfU0NTSUlEIiwgMHgxM2EsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX3NhdmVkX2x1bl9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9zYXZlZF9sdW5fcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNBVkVEX0xVTiIsIDB4MTM1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNBVkVEX0xVTiIsIDB4MTNiLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9sYXN0cGhhc2VfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfbGFzdHBoYXNlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMQVNUUEhBU0UiLCAweDEzNiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMQVNUUEhBU0UiLCAweDEzYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfcW91dGZpZm9fZW50cnlfdmFsaWRfdGFnX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX3FvdXRmaWZvX2VudHJ5X3ZhbGlkX3RhZ19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUU9VVEZJRk9fRU5UUllfVkFMSURfVEFHIiwgMHgxMzcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQotI2VuZGlmCi0KLSNpZiBBSUNfREVCVUdfUkVHSVNURVJTCi1haGRfcmVnX3ByaW50X3QgYWhkX3NoYXJlZF9kYXRhX2FkZHJfcHJpbnQ7Ci0jZWxzZQotI2RlZmluZSBhaGRfc2hhcmVkX2RhdGFfYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0hBUkVEX0RBVEFfQUREUiIsIDB4MTM4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKLSNlbmRpZgotCi0jaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwotYWhkX3JlZ19wcmludF90IGFoZF9xb3V0Zmlmb19uZXh0X2FkZHJfcHJpbnQ7Ci0jZWxzZQotI2RlZmluZSBhaGRfcW91dGZpZm9fbmV4dF9hZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRT1VURklGT19ORVhUX0FERFIiLCAweDEzYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRT1VURklGT19FTlRSWV9WQUxJRF9UQUciLCAweDEzZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfa2VybmVsX3RxaW5wb3NfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfa2VybmVsX3RxaW5wb3NfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIktFUk5FTF9UUUlOUE9TIiwgMHgxNDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiS0VSTkVMX1RRSU5QT1MiLCAweDEzZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfdHFpbnBvc19wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF90cWlucG9zX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJUUUlOUE9TIiwgMHgxNDEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiVFFJTlBPUyIsIDB4MTNmLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zaGFyZWRfZGF0YV9hZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NoYXJlZF9kYXRhX2FkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNIQVJFRF9EQVRBX0FERFIiLCAweDE0MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfcW91dGZpZm9fbmV4dF9hZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3FvdXRmaWZvX25leHRfYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUU9VVEZJRk9fTkVYVF9BRERSIiwgMHgxNDQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2FyZ18xX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2FyZ18xX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBUkdfMSIsIDB4MTQyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFSR18xIiwgMHgxNDgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2FyZ18yX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2FyZ18yX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBUkdfMiIsIDB4MTQzLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFSR18yIiwgMHgxNDksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2xhc3RfbXNnX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2xhc3RfbXNnX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMQVNUX01TRyIsIDB4MTQ0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxBU1RfTVNHIiwgMHgxNGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX3Njc2lzZXFfdGVtcGxhdGVfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfc2NzaXNlcV90ZW1wbGF0ZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NTSVNFUV9URU1QTEFURSIsIDB4MTQ1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDU0lTRVFfVEVNUExBVEUiLCAweDE0YiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfaW5pdGlhdG9yX3RhZ19wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9pbml0aWF0b3JfdGFnX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTklUSUFUT1JfVEFHIiwgMHgxNDYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5JVElBVE9SX1RBRyIsIDB4MTRjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9zZXFfZmxhZ3MyX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX3NlcV9mbGFnczJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFUV9GTEFHUzIiLCAweDE0NywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRVFfRkxBR1MyIiwgMHgxNGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2FsbG9jZmlmb19zY2JwdHJfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfYWxsb2NmaWZvX3NjYnB0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQUxMT0NGSUZPX1NDQlBUUiIsIDB4MTQ4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFMTE9DRklGT19TQ0JQVFIiLCAweDE0ZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfaW50X2NvYWxlc2NpbmdfdGltZXJfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfaW50X2NvYWxlc2NpbmdfdGltZXJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVF9DT0FMRVNDSU5HX1RJTUVSIiwgMHgxNGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5UX0NPQUxFU0NJTkdfVElNRVIiLCAweDE1MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKIGFoZF9yZWdfcHJpbnRfdCBhaGRfaW50X2NvYWxlc2NpbmdfbWF4Y21kc19wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9pbnRfY29hbGVzY2luZ19tYXhjbWRzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCi0gICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRfQ09BTEVTQ0lOR19NQVhDTURTIiwgMHgxNGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5UX0NPQUxFU0NJTkdfTUFYQ01EUyIsIDB4MTUyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9pbnRfY29hbGVzY2luZ19taW5jbWRzX3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2ludF9jb2FsZXNjaW5nX21pbmNtZHNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVF9DT0FMRVNDSU5HX01JTkNNRFMiLCAweDE0ZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRfQ09BTEVTQ0lOR19NSU5DTURTIiwgMHgxNTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2NtZHNfcGVuZGluZ19wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9jbWRzX3BlbmRpbmdfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNRFNfUEVORElORyIsIDB4MTRlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNRFNfUEVORElORyIsIDB4MTU0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9pbnRfY29hbGVzY2luZ19jbWRjb3VudF9wcmludDsKICNlbHNlCiAjZGVmaW5lIGFoZF9pbnRfY29hbGVzY2luZ19jbWRjb3VudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5UX0NPQUxFU0NJTkdfQ01EQ09VTlQiLCAweDE1MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRfQ09BTEVTQ0lOR19DTURDT1VOVCIsIDB4MTU2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKICNlbmRpZgogCiAjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUwogYWhkX3JlZ19wcmludF90IGFoZF9sb2NhbF9oc19tYWlsYm94X3ByaW50OwogI2Vsc2UKICNkZWZpbmUgYWhkX2xvY2FsX2hzX21haWxib3hfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKLSAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxPQ0FMX0hTX01BSUxCT1giLCAweDE1MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMT0NBTF9IU19NQUlMQk9YIiwgMHgxNTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQogI2VuZGlmCiAKICNpZiBBSUNfREVCVUdfUkVHSVNURVJTCiBhaGRfcmVnX3ByaW50X3QgYWhkX2NtZHNpemVfdGFibGVfcHJpbnQ7CiAjZWxzZQogI2RlZmluZSBhaGRfY21kc2l6ZV90YWJsZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAotICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ01EU0laRV9UQUJMRSIsIDB4MTUyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNRFNJWkVfVEFCTEUiLCAweDE1OCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCiAjZW5kaWYKIAogI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKQEAgLTI0MzQsMTMgKzI0NTUsNiBAQAogI2RlZmluZQkJSE9TVF9UUUlOUE9TICAgIAkweDgwCiAjZGVmaW5lCQlFTklOVF9DT0FMRVNDRSAgCTB4NDAKIAotI2RlZmluZQlDTFJTRVFJTlRTVEFUICAgCQkweDBjCi0jZGVmaW5lCQlDTFJTRVFfU1dUTVJUTyAgCTB4MTAKLSNkZWZpbmUJCUNMUlNFUV9TRVFJTlQgICAJMHgwOAotI2RlZmluZQkJQ0xSU0VRX1NDU0lJTlQgIAkweDA0Ci0jZGVmaW5lCQlDTFJTRVFfUENJSU5UICAgCTB4MDIKLSNkZWZpbmUJCUNMUlNFUV9TUExUSU5UICAJMHgwMQotCiAjZGVmaW5lCVNFUUlOVFNUQVQgICAgICAJCTB4MGMKICNkZWZpbmUJCVNFUV9TV1RNUlRPICAgICAJMHgxMAogI2RlZmluZQkJU0VRX1NFUUlOVCAgICAgIAkweDA4CkBAIC0yNDQ4LDYgKzI0NjIsMTMgQEAKICNkZWZpbmUJCVNFUV9QQ0lJTlQgICAgICAJMHgwMgogI2RlZmluZQkJU0VRX1NQTFRJTlQgICAgIAkweDAxCiAKKyNkZWZpbmUJQ0xSU0VRSU5UU1RBVCAgIAkJMHgwYworI2RlZmluZQkJQ0xSU0VRX1NXVE1SVE8gIAkweDEwCisjZGVmaW5lCQlDTFJTRVFfU0VRSU5UICAgCTB4MDgKKyNkZWZpbmUJCUNMUlNFUV9TQ1NJSU5UICAJMHgwNAorI2RlZmluZQkJQ0xSU0VRX1BDSUlOVCAgIAkweDAyCisjZGVmaW5lCQlDTFJTRVFfU1BMVElOVCAgCTB4MDEKKwogI2RlZmluZQlTV1RJTUVSICAgICAgICAgCQkweDBlCiAKICNkZWZpbmUJU05TQ0JfUU9GRiAgICAgIAkJMHgxMApAQCAtMjYyMywxMCArMjY0NCwxMCBAQAogI2RlZmluZQkJQklPU0NBTkNFTEVOICAgIAkweDEwCiAjZGVmaW5lCQlTUElPRU4gICAgICAgICAgCTB4MDgKIAotI2RlZmluZQlCVVNJTklUSUQgICAgICAgCQkweDNjCi0KICNkZWZpbmUJRExDT1VOVCAgICAgICAgIAkJMHgzYwogCisjZGVmaW5lCUJVU0lOSVRJRCAgICAgICAJCTB4M2MKKwogI2RlZmluZQlTWEZSQ1RMMSAgICAgICAgCQkweDNkCiAjZGVmaW5lCQlCSVRCVUNLRVQgICAgICAgCTB4ODAKICNkZWZpbmUJCUVOU0FDSEsgICAgICAgICAJMHg0MApAQCAtMjY5MywxMyArMjcxNCw2IEBACiAjZGVmaW5lCQlTRUxJRF9NQVNLICAgICAgCTB4ZjAKICNkZWZpbmUJCU9ORUJJVCAgICAgICAgICAJMHgwOAogCi0jZGVmaW5lCVNCTEtDVEwgICAgICAgICAJCTB4NGEKLSNkZWZpbmUJCURJQUdMRURFTiAgICAgICAJMHg4MAotI2RlZmluZQkJRElBR0xFRE9OICAgICAgIAkweDQwCi0jZGVmaW5lCQlFTkFCNDAgICAgICAgICAgCTB4MDgKLSNkZWZpbmUJCUVOQUIyMCAgICAgICAgICAJMHgwNAotI2RlZmluZQkJU0VMV0lERSAgICAgICAgIAkweDAyCi0KICNkZWZpbmUJT1BUSU9OTU9ERSAgICAgIAkJMHg0YQogI2RlZmluZQkJT1BUSU9OTU9ERV9ERUZBVUxUUwkweDAyCiAjZGVmaW5lCQlCSU9TQ0FOQ1RMICAgICAgCTB4ODAKQEAgLTI3MDksNiArMjcyMywyMiBAQAogI2RlZmluZQkJRU5ER0ZPUk1DSEsgICAgIAkweDA0CiAjZGVmaW5lCQlBVVRPX01TR09VVF9ERSAgCTB4MDIKIAorI2RlZmluZQlTQkxLQ1RMICAgICAgICAgCQkweDRhCisjZGVmaW5lCQlESUFHTEVERU4gICAgICAgCTB4ODAKKyNkZWZpbmUJCURJQUdMRURPTiAgICAgICAJMHg0MAorI2RlZmluZQkJRU5BQjQwICAgICAgICAgIAkweDA4CisjZGVmaW5lCQlFTkFCMjAgICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCVNFTFdJREUgICAgICAgICAJMHgwMgorCisjZGVmaW5lCUNMUlNJTlQwICAgICAgICAJCTB4NGIKKyNkZWZpbmUJCUNMUlNFTERPICAgICAgICAJMHg0MAorI2RlZmluZQkJQ0xSU0VMREkgICAgICAgIAkweDIwCisjZGVmaW5lCQlDTFJTRUxJTkdPICAgICAgCTB4MTAKKyNkZWZpbmUJCUNMUklPRVJSICAgICAgICAJMHgwOAorI2RlZmluZQkJQ0xST1ZFUlJVTiAgICAgIAkweDA0CisjZGVmaW5lCQlDTFJTUElPUkRZICAgICAgCTB4MDIKKyNkZWZpbmUJCUNMUkFSQkRPICAgICAgICAJMHgwMQorCiAjZGVmaW5lCVNTVEFUMCAgICAgICAgICAJCTB4NGIKICNkZWZpbmUJCVRBUkdFVCAgICAgICAgICAJMHg4MAogI2RlZmluZQkJU0VMRE8gICAgICAgICAgIAkweDQwCkBAIC0yNzE5LDE1ICsyNzQ5LDYgQEAKICNkZWZpbmUJCVNQSU9SRFkgICAgICAgICAJMHgwMgogI2RlZmluZQkJQVJCRE8gICAgICAgICAgIAkweDAxCiAKLSNkZWZpbmUJQ0xSU0lOVDAgICAgICAgIAkJMHg0YgotI2RlZmluZQkJQ0xSU0VMRE8gICAgICAgIAkweDQwCi0jZGVmaW5lCQlDTFJTRUxESSAgICAgICAgCTB4MjAKLSNkZWZpbmUJCUNMUlNFTElOR08gICAgICAJMHgxMAotI2RlZmluZQkJQ0xSSU9FUlIgICAgICAgIAkweDA4Ci0jZGVmaW5lCQlDTFJPVkVSUlVOICAgICAgCTB4MDQKLSNkZWZpbmUJCUNMUlNQSU9SRFkgICAgICAJMHgwMgotI2RlZmluZQkJQ0xSQVJCRE8gICAgICAgIAkweDAxCi0KICNkZWZpbmUJU0lNT0RFMCAgICAgICAgIAkJMHg0YgogI2RlZmluZQkJRU5TRUxETyAgICAgICAgIAkweDQwCiAjZGVmaW5lCQlFTlNFTERJICAgICAgICAgCTB4MjAKQEAgLTI3NjgsMTcgKzI3ODksMTcgQEAKICNkZWZpbmUJCUJVU0ZSRUVfREZGMCAgICAJMHg4MAogI2RlZmluZQkJQlVTRlJFRV9MUU8gICAgIAkweDQwCiAKKyNkZWZpbmUJU0lNT0RFMiAgICAgICAgIAkJMHg0ZAorI2RlZmluZQkJRU5XSURFX1JFUyAgICAgIAkweDA0CisjZGVmaW5lCQlFTlNET05FICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUVORE1BRE9ORSAgICAgICAJMHgwMQorCiAjZGVmaW5lCUNMUlNJTlQyICAgICAgICAJCTB4NGQKICNkZWZpbmUJCUNMUk5PTlBBQ0tSRVEgICAJMHgyMAogI2RlZmluZQkJQ0xSV0lERV9SRVMgICAgIAkweDA0CiAjZGVmaW5lCQlDTFJTRE9ORSAgICAgICAgCTB4MDIKICNkZWZpbmUJCUNMUkRNQURPTkUgICAgICAJMHgwMQogCi0jZGVmaW5lCVNJTU9ERTIgICAgICAgICAJCTB4NGQKLSNkZWZpbmUJCUVOV0lERV9SRVMgICAgICAJMHgwNAotI2RlZmluZQkJRU5TRE9ORSAgICAgICAgIAkweDAyCi0jZGVmaW5lCQlFTkRNQURPTkUgICAgICAgCTB4MDEKLQogI2RlZmluZQlQRVJSRElBRyAgICAgICAgCQkweDRlCiAjZGVmaW5lCQlISVpFUk8gICAgICAgICAgCTB4ODAKICNkZWZpbmUJCUhJUEVSUiAgICAgICAgICAJMHg0MApAQCAtMjg3MSwxMyArMjg5Miw2IEBACiAjZGVmaW5lCQlDTFJOVFJBTVBFUlIgICAgCTB4MDIKICNkZWZpbmUJCUNMUk9TUkFNUEVSUiAgICAJMHgwMQogCi0jZGVmaW5lCUxRT01PREUwICAgICAgICAJCTB4NTQKLSNkZWZpbmUJCUVOTFFPVEFSR1NDQlBFUlIJMHgxMAotI2RlZmluZQkJRU5MUU9TVE9QVDIgICAgIAkweDA4Ci0jZGVmaW5lCQlFTkxRT0FUTkxRICAgICAgCTB4MDQKLSNkZWZpbmUJCUVOTFFPQVROUEtUICAgICAJMHgwMgotI2RlZmluZQkJRU5MUU9UQ1JDICAgICAgIAkweDAxCi0KICNkZWZpbmUJTFFPU1RBVDAgICAgICAgIAkJMHg1NAogI2RlZmluZQkJTFFPVEFSR1NDQlBFUlIgIAkweDEwCiAjZGVmaW5lCQlMUU9TVE9QVDIgICAgICAgCTB4MDgKQEAgLTI4OTIsNiArMjkwNiwyMCBAQAogI2RlZmluZQkJQ0xSTFFPQVROUEtUICAgIAkweDAyCiAjZGVmaW5lCQlDTFJMUU9UQ1JDICAgICAgCTB4MDEKIAorI2RlZmluZQlMUU9NT0RFMCAgICAgICAgCQkweDU0CisjZGVmaW5lCQlFTkxRT1RBUkdTQ0JQRVJSCTB4MTAKKyNkZWZpbmUJCUVOTFFPU1RPUFQyICAgICAJMHgwOAorI2RlZmluZQkJRU5MUU9BVE5MUSAgICAgIAkweDA0CisjZGVmaW5lCQlFTkxRT0FUTlBLVCAgICAgCTB4MDIKKyNkZWZpbmUJCUVOTFFPVENSQyAgICAgICAJMHgwMQorCisjZGVmaW5lCUxRT01PREUxICAgICAgICAJCTB4NTUKKyNkZWZpbmUJCUVOTFFPSU5JVFNDQlBFUlIJMHgxMAorI2RlZmluZQkJRU5MUU9TVE9QSTIgICAgIAkweDA4CisjZGVmaW5lCQlFTkxRT0JBRFFBUyAgICAgCTB4MDQKKyNkZWZpbmUJCUVOTFFPQlVTRlJFRSAgICAJMHgwMgorI2RlZmluZQkJRU5MUU9QSEFDSEdJTlBLVAkweDAxCisKICNkZWZpbmUJTFFPU1RBVDEgICAgICAgIAkJMHg1NQogI2RlZmluZQkJTFFPSU5JVFNDQlBFUlIgIAkweDEwCiAjZGVmaW5lCQlMUU9TVE9QSTIgICAgICAgCTB4MDgKQEAgLTI5MDYsMTMgKzI5MzQsNiBAQAogI2RlZmluZQkJQ0xSTFFPQlVTRlJFRSAgIAkweDAyCiAjZGVmaW5lCQlDTFJMUU9QSEFDSEdJTlBLVAkweDAxCiAKLSNkZWZpbmUJTFFPTU9ERTEgICAgICAgIAkJMHg1NQotI2RlZmluZQkJRU5MUU9JTklUU0NCUEVSUgkweDEwCi0jZGVmaW5lCQlFTkxRT1NUT1BJMiAgICAgCTB4MDgKLSNkZWZpbmUJCUVOTFFPQkFEUUFTICAgICAJMHgwNAotI2RlZmluZQkJRU5MUU9CVVNGUkVFICAgIAkweDAyCi0jZGVmaW5lCQlFTkxRT1BIQUNIR0lOUEtUCTB4MDEKLQogI2RlZmluZQlMUU9TVEFUMiAgICAgICAgCQkweDU2CiAjZGVmaW5lCQlMUU9QS1QgICAgICAgICAgCTB4ZTAKICNkZWZpbmUJCUxRT1dBSVRGSUZPICAgICAJMHgxMApAQCAtMzAyOCw2ICszMDQ5LDggQEAKIAogI2RlZmluZQlBTk5FWENPTCAgICAgICAgCQkweDY1CiAKKyNkZWZpbmUJQU5ORVhEQVQgICAgICAgIAkJMHg2NgorCiAjZGVmaW5lCVNDU0NIS04gICAgICAgICAJCTB4NjYKICNkZWZpbmUJCVNUU0VMU0tJRERJUyAgICAJMHg0MAogI2RlZmluZQkJQ1VSUkZJRk9ERUYgICAgIAkweDIwCkBAIC0zMDM3LDggKzMwNjAsNiBAQAogI2RlZmluZQkJU0hWQUxJRFNURElTICAgIAkweDAyCiAjZGVmaW5lCQlMU1RTR0NMUkRJUyAgICAgCTB4MDEKIAotI2RlZmluZQlBTk5FWERBVCAgICAgICAgCQkweDY2Ci0KICNkZWZpbmUJSU9XTklEICAgICAgICAgIAkJMHg2NwogCiAjZGVmaW5lCVBMTDk2MENUTDAgICAgICAJCTB4NjgKQEAgLTMwNzEsMTAgKzMwOTIsMTAgQEAKICNkZWZpbmUJCVBMTF9DTlRDTFIgICAgICAJMHg0MAogI2RlZmluZQkJUExMX1JTVCAgICAgICAgIAkweDAxCiAKLSNkZWZpbmUJUExMNDAwQ05UMCAgICAgIAkJMHg2ZQotCiAjZGVmaW5lCVVORkFJUk5FU1MgICAgICAJCTB4NmUKIAorI2RlZmluZQlQTEw0MDBDTlQwICAgICAgCQkweDZlCisKICNkZWZpbmUJSEFERFIgICAgICAgICAgIAkJMHg3MAogCiAjZGVmaW5lCVBMTERFTEFZICAgICAgICAJCTB4NzAKQEAgLTMwODgsMTQgKzMxMDksMTQgQEAKIAogI2RlZmluZQlIT0RNQUVOICAgICAgICAgCQkweDdhCiAKLSNkZWZpbmUJU0dIQUREUiAgICAgICAgIAkJMHg3YwotCiAjZGVmaW5lCVNDQkhBRERSICAgICAgICAJCTB4N2MKIAotI2RlZmluZQlTR0hDTlQgICAgICAgICAgCQkweDg0CisjZGVmaW5lCVNHSEFERFIgICAgICAgICAJCTB4N2MKIAogI2RlZmluZQlTQ0JIQ05UICAgICAgICAgCQkweDg0CiAKKyNkZWZpbmUJU0dIQ05UICAgICAgICAgIAkJMHg4NAorCiAjZGVmaW5lCURGRl9USFJTSCAgICAgICAJCTB4ODgKICNkZWZpbmUJCVdSX0RGVEhSU0ggICAgICAJMHg3MAogI2RlZmluZQkJUkRfREZUSFJTSCAgICAgIAkweDA3CkBAIC0zMTEzLDggKzMxMzQsOCBAQAogI2RlZmluZQkJUkRfREZUSFJTSF82MyAgIAkweDAzCiAjZGVmaW5lCQlSRF9ERlRIUlNIXzUwICAgCTB4MDIKICNkZWZpbmUJCVJEX0RGVEhSU0hfMjUgICAJMHgwMQotI2RlZmluZQkJV1JfREZUSFJTSF9NSU4gIAkweDAwCiAjZGVmaW5lCQlSRF9ERlRIUlNIX01JTiAgCTB4MDAKKyNkZWZpbmUJCVdSX0RGVEhSU0hfTUlOICAJMHgwMAogCiAjZGVmaW5lCVJPTUFERFIgICAgICAgICAJCTB4OGEKIApAQCAtMzE1MCwyMCArMzE3MSwyMiBAQAogI2RlZmluZQkJRENIMU5TRU4gICAgICAgIAkweDAyCiAjZGVmaW5lCQlEQ0gwTlNFTiAgICAgICAgCTB4MDEKIAotI2RlZmluZQlEQ0hSWE1TRzEgICAgICAgCQkweDkxCi0KICNkZWZpbmUJQ01DUlhNU0cxICAgICAgIAkJMHg5MQogCi0jZGVmaW5lCURDSFJYTVNHMiAgICAgICAJCTB4OTIKKyNkZWZpbmUJRENIUlhNU0cxICAgICAgIAkJMHg5MQogCi0jZGVmaW5lCU9WTFlSWE1TRzIgICAgICAJCTB4OTIKKyNkZWZpbmUJRENIUlhNU0cyICAgICAgIAkJMHg5MgogCiAjZGVmaW5lCUNNQ1JYTVNHMiAgICAgICAJCTB4OTIKIAogI2RlZmluZQlPU1QgICAgICAgICAgICAgCQkweDkyCiAKKyNkZWZpbmUJT1ZMWVJYTVNHMiAgICAgIAkJMHg5MgorCiAjZGVmaW5lCURDSFJYTVNHMyAgICAgICAJCTB4OTMKIAorI2RlZmluZQlPVkxZUlhNU0czICAgICAgCQkweDkzCisKICNkZWZpbmUJQ01DUlhNU0czICAgICAgIAkJMHg5MwogCiAjZGVmaW5lCVBDSVhDVEwgICAgICAgICAJCTB4OTMKQEAgLTMxNzUsMjYgKzMxOTgsMjQgQEAKICNkZWZpbmUJCVRTQ1NFUlJFTiAgICAgICAJMHgwMgogI2RlZmluZQkJQ01QQUJDRElTICAgICAgIAkweDAxCiAKLSNkZWZpbmUJT1ZMWVJYTVNHMyAgICAgIAkJMHg5MwotCiAjZGVmaW5lCU9WTFlTRVFCQ05UICAgICAJCTB4OTQKIAotI2RlZmluZQlDTUNTRVFCQ05UICAgICAgCQkweDk0Ci0KICNkZWZpbmUJRENIU0VRQkNOVCAgICAgIAkJMHg5NAogCi0jZGVmaW5lCUNNQ1NQTFRTVEFUMCAgICAJCTB4OTYKKyNkZWZpbmUJQ01DU0VRQkNOVCAgICAgIAkJMHg5NAogCi0jZGVmaW5lCU9WTFlTUExUU1RBVDAgICAJCTB4OTYKKyNkZWZpbmUJQ01DU1BMVFNUQVQwICAgIAkJMHg5NgogCiAjZGVmaW5lCURDSFNQTFRTVEFUMCAgICAJCTB4OTYKIAotI2RlZmluZQlEQ0hTUExUU1RBVDEgICAgCQkweDk3CisjZGVmaW5lCU9WTFlTUExUU1RBVDAgICAJCTB4OTYKIAogI2RlZmluZQlDTUNTUExUU1RBVDEgICAgCQkweDk3CiAKICNkZWZpbmUJT1ZMWVNQTFRTVEFUMSAgIAkJMHg5NwogCisjZGVmaW5lCURDSFNQTFRTVEFUMSAgICAJCTB4OTcKKwogI2RlZmluZQlTR1JYTVNHMCAgICAgICAgCQkweDk4CiAjZGVmaW5lCQlDRE5VTSAgICAgICAgICAgCTB4ZjgKICNkZWZpbmUJCUNGTlVNICAgICAgICAgICAJMHgwNwpAQCAtMzI0NCwxMyArMzI2NSwxMyBAQAogI2RlZmluZQkJUlhTQ0VNU0cgICAgICAgIAkweDAyCiAjZGVmaW5lCQlSWFNQTFRSU1AgICAgICAgCTB4MDEKIAorI2RlZmluZQlTR1NQTFRTVEFUMSAgICAgCQkweDlmCisjZGVmaW5lCQlSWERBVEFCVUNLRVQgICAgCTB4MDEKKwogI2RlZmluZQlTRlVOQ1QgICAgICAgICAgCQkweDlmCiAjZGVmaW5lCQlURVNUX0dST1VQICAgICAgCTB4ZjAKICNkZWZpbmUJCVRFU1RfTlVNICAgICAgICAJMHgwZgogCi0jZGVmaW5lCVNHU1BMVFNUQVQxICAgICAJCTB4OWYKLSNkZWZpbmUJCVJYREFUQUJVQ0tFVCAgICAJMHgwMQotCiAjZGVmaW5lCURGMFBDSVNUQVQgICAgICAJCTB4YTAKIAogI2RlZmluZQlSRUcwICAgICAgICAgICAgCQkweGEwCkBAIC0zMjk5LDEwICszMzIwLDEwIEBACiAKICNkZWZpbmUJQ0NTR0FERFIgICAgICAgIAkJMHhhYwogCi0jZGVmaW5lCUNDU0NCQUREUiAgICAgICAJCTB4YWMKLQogI2RlZmluZQlDQ1NDQkFEUl9CSyAgICAgCQkweGFjCiAKKyNkZWZpbmUJQ0NTQ0JBRERSICAgICAgIAkJMHhhYworCiAjZGVmaW5lCUNNQ19SQU1CSVNUICAgICAJCTB4YWQKICNkZWZpbmUJCVNHX0VMRU1FTlRfU0laRSAJMHg4MAogI2RlZmluZQkJU0NCUkFNQklTVF9GQUlMIAkweDQwCkBAIC0zMzExLDE0ICszMzMyLDYgQEAKICNkZWZpbmUJCUNNQ19CVUZGRVJfQklTVF9GQUlMCTB4MDIKICNkZWZpbmUJCUNNQ19CVUZGRVJfQklTVF9FTgkweDAxCiAKLSNkZWZpbmUJQ0NTR0NUTCAgICAgICAgIAkJMHhhZAotI2RlZmluZQkJQ0NTR0VOICAgICAgICAgIAkweDBjCi0jZGVmaW5lCQlDQ1NHRE9ORSAgICAgICAgCTB4ODAKLSNkZWZpbmUJCVNHX0NBQ0hFX0FWQUlMICAJMHgxMAotI2RlZmluZQkJQ0NTR0VOQUNLICAgICAgIAkweDA4Ci0jZGVmaW5lCQlTR19GRVRDSF9SRVEgICAgCTB4MDIKLSNkZWZpbmUJCUNDU0dSRVNFVCAgICAgICAJMHgwMQotCiAjZGVmaW5lCUNDU0NCQ1RMICAgICAgICAJCTB4YWQKICNkZWZpbmUJCUNDU0NCRE9ORSAgICAgICAJMHg4MAogI2RlZmluZQkJQVJSRE9ORSAgICAgICAgIAkweDQwCkBAIC0zMzI3LDYgKzMzNDAsMTQgQEAKICNkZWZpbmUJCUNDU0NCRElSICAgICAgICAJMHgwNAogI2RlZmluZQkJQ0NTQ0JSRVNFVCAgICAgIAkweDAxCiAKKyNkZWZpbmUJQ0NTR0NUTCAgICAgICAgIAkJMHhhZAorI2RlZmluZQkJQ0NTR0VOICAgICAgICAgIAkweDBjCisjZGVmaW5lCQlDQ1NHRE9ORSAgICAgICAgCTB4ODAKKyNkZWZpbmUJCVNHX0NBQ0hFX0FWQUlMICAJMHgxMAorI2RlZmluZQkJQ0NTR0VOQUNLICAgICAgIAkweDA4CisjZGVmaW5lCQlTR19GRVRDSF9SRVEgICAgCTB4MDIKKyNkZWZpbmUJCUNDU0dSRVNFVCAgICAgICAJMHgwMQorCiAjZGVmaW5lCUNDU0dSQU0gICAgICAgICAJCTB4YjAKIAogI2RlZmluZQlGTEVYQURSICAgICAgICAgCQkweGIwCkBAIC0zMzU2LDggKzMzNzcsOCBAQAogI2RlZmluZQlTRUVEQVQgICAgICAgICAgCQkweGJjCiAKICNkZWZpbmUJU0VFQ1RMICAgICAgICAgIAkJMHhiZQotI2RlZmluZQkJU0VFT1BfRVdFTiAgICAgIAkweDQwCiAjZGVmaW5lCQlTRUVPUF9XQUxMICAgICAgCTB4NDAKKyNkZWZpbmUJCVNFRU9QX0VXRU4gICAgICAJMHg0MAogI2RlZmluZQkJU0VFT1BfRVdEUyAgICAgIAkweDQwCiAjZGVmaW5lCQlTRUVPUENPREUgICAgICAgCTB4NzAKICNkZWZpbmUJCVNFRVJTVCAgICAgICAgICAJMHgwMgpAQCAtMzQxNCwxNCArMzQzNSwxNCBAQAogCiAjZGVmaW5lCVdSVEJJQVNDQUxDICAgICAJCTB4YzcKIAotI2RlZmluZQlERlBUUlMgICAgICAgICAgCQkweGM4Ci0KICNkZWZpbmUJUkNWUkJJQVNDQUxDICAgIAkJMHhjOAogCi0jZGVmaW5lCURGQktQVFIgICAgICAgICAJCTB4YzkKKyNkZWZpbmUJREZQVFJTICAgICAgICAgIAkJMHhjOAogCiAjZGVmaW5lCVNLRVdDQUxDICAgICAgICAJCTB4YzkKIAorI2RlZmluZQlERkJLUFRSICAgICAgICAgCQkweGM5CisKICNkZWZpbmUJREZEQkNUTCAgICAgICAgIAkJMHhjYgogI2RlZmluZQkJREZGX0NJT19XUl9SRFkgIAkweDIwCiAjZGVmaW5lCQlERkZfQ0lPX1JEX1JEWSAgCTB4MTAKQEAgLTM0NzUsMTEgKzM0OTYsMTEgQEAKIAogI2RlZmluZQlESU5ERVggICAgICAgICAgCQkweGU0CiAKKyNkZWZpbmUJQlJLQUREUjAgICAgICAgIAkJMHhlNgorCiAjZGVmaW5lCUJSS0FERFIxICAgICAgICAJCTB4ZTYKICNkZWZpbmUJCUJSS0RJUyAgICAgICAgICAJMHg4MAogCi0jZGVmaW5lCUJSS0FERFIwICAgICAgICAJCTB4ZTYKLQogI2RlZmluZQlBTExPTkVTICAgICAgICAgCQkweGU4CiAKICNkZWZpbmUJQUxMWkVST1MgICAgICAgIAkJMHhlYQpAQCAtMzQ5NCwxNCArMzUxNSwxNCBAQAogCiAjZGVmaW5lCVNUQUNLICAgICAgICAgICAJCTB4ZjIKIAotI2RlZmluZQlDVVJBRERSICAgICAgICAgCQkweGY0Ci0KICNkZWZpbmUJSU5UVkVDMV9BRERSICAgIAkJMHhmNAogCi0jZGVmaW5lCUlOVFZFQzJfQUREUiAgICAJCTB4ZjYKKyNkZWZpbmUJQ1VSQUREUiAgICAgICAgIAkJMHhmNAogCiAjZGVmaW5lCUxBU1RBRERSICAgICAgICAJCTB4ZjYKIAorI2RlZmluZQlJTlRWRUMyX0FERFIgICAgCQkweGY2CisKICNkZWZpbmUJTE9OR0pNUF9BRERSICAgIAkJMHhmOAogCiAjZGVmaW5lCUFDQ1VNX1NBVkUgICAgICAJCTB4ZmEKQEAgLTM1MjQsMjUgKzM1NDUsMzEgQEAKIAogI2RlZmluZQlDT01QTEVURV9ETUFfU0NCX0hFQUQJCTB4MTJjCiAKLSNkZWZpbmUJUUZSRUVaRV9DT1VOVCAgIAkJMHgxMmUKKyNkZWZpbmUJQ09NUExFVEVfRE1BX1NDQl9UQUlMCQkweDEyZQogCi0jZGVmaW5lCVNBVkVEX01PREUgICAgICAJCTB4MTMwCisjZGVmaW5lCUNPTVBMRVRFX09OX1FGUkVFWkVfSEVBRAkJMHgxMzAKIAotI2RlZmluZQlNU0dfT1VUICAgICAgICAgCQkweDEzMQorI2RlZmluZQlRRlJFRVpFX0NPVU5UICAgCQkweDEzMgogCi0jZGVmaW5lCURNQVBBUkFNUyAgICAgICAJCTB4MTMyCisjZGVmaW5lCUtFUk5FTF9RRlJFRVpFX0NPVU5UCQkweDEzNAorCisjZGVmaW5lCVNBVkVEX01PREUgICAgICAJCTB4MTM2CisKKyNkZWZpbmUJTVNHX09VVCAgICAgICAgIAkJMHgxMzcKKworI2RlZmluZQlETUFQQVJBTVMgICAgICAgCQkweDEzOAogI2RlZmluZQkJUFJFTE9BREVOICAgICAgIAkweDgwCiAjZGVmaW5lCQlXSURFT0REICAgICAgICAgCTB4NDAKICNkZWZpbmUJCVNDU0lFTiAgICAgICAgICAJMHgyMAogI2RlZmluZQkJU0RNQUVOICAgICAgICAgIAkweDEwCiAjZGVmaW5lCQlTRE1BRU5BQ0sgICAgICAgCTB4MTAKLSNkZWZpbmUJCUhETUFFTkFDSyAgICAgICAJMHgwOAogI2RlZmluZQkJSERNQUVOICAgICAgICAgIAkweDA4CisjZGVmaW5lCQlIRE1BRU5BQ0sgICAgICAgCTB4MDgKICNkZWZpbmUJCURJUkVDVElPTiAgICAgICAJMHgwNAogI2RlZmluZQkJRklGT0ZMVVNIICAgICAgIAkweDAyCiAjZGVmaW5lCQlGSUZPUkVTRVQgICAgICAgCTB4MDEKIAotI2RlZmluZQlTRVFfRkxBR1MgICAgICAgCQkweDEzMworI2RlZmluZQlTRVFfRkxBR1MgICAgICAgCQkweDEzOQogI2RlZmluZQkJTk9UX0lERU5USUZJRUQgIAkweDgwCiAjZGVmaW5lCQlOT19DREJfU0VOVCAgICAgCTB4NDAKICNkZWZpbmUJCVRBUkdFVF9DTURfSVNfVEFHR0VECTB4NDAKQEAgLTM1NTMsMTEgKzM1ODAsMTEgQEAKICNkZWZpbmUJCVNQSEFTRV9QRU5ESU5HICAJMHgwMgogI2RlZmluZQkJTk9fRElTQ09OTkVDVCAgIAkweDAxCiAKLSNkZWZpbmUJU0FWRURfU0NTSUlEICAgIAkJMHgxMzQKKyNkZWZpbmUJU0FWRURfU0NTSUlEICAgIAkJMHgxM2EKIAotI2RlZmluZQlTQVZFRF9MVU4gICAgICAgCQkweDEzNQorI2RlZmluZQlTQVZFRF9MVU4gICAgICAgCQkweDEzYgogCi0jZGVmaW5lCUxBU1RQSEFTRSAgICAgICAJCTB4MTM2CisjZGVmaW5lCUxBU1RQSEFTRSAgICAgICAJCTB4MTNjCiAjZGVmaW5lCQlQSEFTRV9NQVNLICAgICAgCTB4ZTAKICNkZWZpbmUJCUNESSAgICAgICAgICAgICAJMHg4MAogI2RlZmluZQkJSU9JICAgICAgICAgICAgIAkweDQwCkBAIC0zNTcyLDE4ICszNTk5LDE4IEBACiAjZGVmaW5lCQlQX0RBVEFPVVRfRFQgICAgCTB4MjAKICNkZWZpbmUJCVBfREFUQU9VVCAgICAgICAJMHgwMAogCi0jZGVmaW5lCVFPVVRGSUZPX0VOVFJZX1ZBTElEX1RBRwkJMHgxMzcKKyNkZWZpbmUJUU9VVEZJRk9fRU5UUllfVkFMSURfVEFHCQkweDEzZAogCi0jZGVmaW5lCVNIQVJFRF9EQVRBX0FERFIJCTB4MTM4CisjZGVmaW5lCUtFUk5FTF9UUUlOUE9TICAJCTB4MTNlCiAKLSNkZWZpbmUJUU9VVEZJRk9fTkVYVF9BRERSCQkweDEzYworI2RlZmluZQlUUUlOUE9TICAgICAgICAgCQkweDEzZgogCi0jZGVmaW5lCUtFUk5FTF9UUUlOUE9TICAJCTB4MTQwCisjZGVmaW5lCVNIQVJFRF9EQVRBX0FERFIJCTB4MTQwCiAKLSNkZWZpbmUJVFFJTlBPUyAgICAgICAgIAkJMHgxNDEKKyNkZWZpbmUJUU9VVEZJRk9fTkVYVF9BRERSCQkweDE0NAogCi0jZGVmaW5lCUFSR18xICAgICAgICAgICAJCTB4MTQyCi0jZGVmaW5lCVJFVFVSTl8xICAgICAgICAJCTB4MTQyCisjZGVmaW5lCUFSR18xICAgICAgICAgICAJCTB4MTQ4CisjZGVmaW5lCVJFVFVSTl8xICAgICAgICAJCTB4MTQ4CiAjZGVmaW5lCQlTRU5EX01TRyAgICAgICAgCTB4ODAKICNkZWZpbmUJCVNFTkRfU0VOU0UgICAgICAJMHg0MAogI2RlZmluZQkJU0VORF9SRUogICAgICAgIAkweDIwCkBAIC0zNTkzLDEyICszNjIwLDEyIEBACiAjZGVmaW5lCQlDT05UX01TR19MT09QX1JFQUQJMHgwMwogI2RlZmluZQkJQ09OVF9NU0dfTE9PUF9UQVJHCTB4MDIKIAotI2RlZmluZQlBUkdfMiAgICAgICAgICAgCQkweDE0MwotI2RlZmluZQlSRVRVUk5fMiAgICAgICAgCQkweDE0MworI2RlZmluZQlBUkdfMiAgICAgICAgICAgCQkweDE0OQorI2RlZmluZQlSRVRVUk5fMiAgICAgICAgCQkweDE0OQogCi0jZGVmaW5lCUxBU1RfTVNHICAgICAgICAJCTB4MTQ0CisjZGVmaW5lCUxBU1RfTVNHICAgICAgICAJCTB4MTRhCiAKLSNkZWZpbmUJU0NTSVNFUV9URU1QTEFURQkJMHgxNDUKKyNkZWZpbmUJU0NTSVNFUV9URU1QTEFURQkJMHgxNGIKICNkZWZpbmUJCU1BTlVBTENUTCAgICAgICAJMHg0MAogI2RlZmluZQkJRU5TRUxJICAgICAgICAgIAkweDIwCiAjZGVmaW5lCQlFTlJTRUxJICAgICAgICAgCTB4MTAKQEAgLTM2MDYsMjcgKzM2MzMsMjcgQEAKICNkZWZpbmUJCUVOQVVUT0FUTlAgICAgICAJMHgwMgogI2RlZmluZQkJQUxUU1RJTSAgICAgICAgIAkweDAxCiAKLSNkZWZpbmUJSU5JVElBVE9SX1RBRyAgIAkJMHgxNDYKKyNkZWZpbmUJSU5JVElBVE9SX1RBRyAgIAkJMHgxNGMKIAotI2RlZmluZQlTRVFfRkxBR1MyICAgICAgCQkweDE0NworI2RlZmluZQlTRVFfRkxBR1MyICAgICAgCQkweDE0ZAogI2RlZmluZQkJU0VMRUNUT1VUX1FGUk9aRU4JMHgwNAogI2RlZmluZQkJVEFSR0VUX01TR19QRU5ESU5HCTB4MDIKIAotI2RlZmluZQlBTExPQ0ZJRk9fU0NCUFRSCQkweDE0OAorI2RlZmluZQlBTExPQ0ZJRk9fU0NCUFRSCQkweDE0ZQogCi0jZGVmaW5lCUlOVF9DT0FMRVNDSU5HX1RJTUVSCQkweDE0YQorI2RlZmluZQlJTlRfQ09BTEVTQ0lOR19USU1FUgkJMHgxNTAKIAotI2RlZmluZQlJTlRfQ09BTEVTQ0lOR19NQVhDTURTCQkweDE0YworI2RlZmluZQlJTlRfQ09BTEVTQ0lOR19NQVhDTURTCQkweDE1MgogCi0jZGVmaW5lCUlOVF9DT0FMRVNDSU5HX01JTkNNRFMJCTB4MTRkCisjZGVmaW5lCUlOVF9DT0FMRVNDSU5HX01JTkNNRFMJCTB4MTUzCiAKLSNkZWZpbmUJQ01EU19QRU5ESU5HICAgIAkJMHgxNGUKKyNkZWZpbmUJQ01EU19QRU5ESU5HICAgIAkJMHgxNTQKIAotI2RlZmluZQlJTlRfQ09BTEVTQ0lOR19DTURDT1VOVAkJMHgxNTAKKyNkZWZpbmUJSU5UX0NPQUxFU0NJTkdfQ01EQ09VTlQJCTB4MTU2CiAKLSNkZWZpbmUJTE9DQUxfSFNfTUFJTEJPWAkJMHgxNTEKKyNkZWZpbmUJTE9DQUxfSFNfTUFJTEJPWAkJMHgxNTcKIAotI2RlZmluZQlDTURTSVpFX1RBQkxFICAgCQkweDE1MgorI2RlZmluZQlDTURTSVpFX1RBQkxFICAgCQkweDE1OAogCiAjZGVmaW5lCVNDQl9CQVNFICAgICAgICAJCTB4MTgwCiAKQEAgLTM3MDEsNiArMzcyOCwxNiBAQAogI2RlZmluZQlTQ0JfRElTQ09OTkVDVEVEX0xJU1RTCQkweDFiOAogCiAKKyNkZWZpbmUJQUhEX1RJTUVSX01BWF9VUwkweDE4ZmZlNworI2RlZmluZQlBSERfVElNRVJfTUFYX1RJQ0tTCTB4ZmZmZgorI2RlZmluZQlBSERfU0VOU0VfQlVGU0laRQkweDEwMAorI2RlZmluZQlCVVNfOF9CSVQJMHgwMAorI2RlZmluZQlUQVJHRVRfQ01EX0NNUExUCTB4ZmUKKyNkZWZpbmUJU0VFT1BfV1JBTF9BRERSCTB4NDAKKyNkZWZpbmUJQUhEX0FNUExJVFVERV9ERUYJMHgwNworI2RlZmluZQlBSERfUFJFQ09NUF9DVVRCQUNLXzM3CTB4MDcKKyNkZWZpbmUJQUhEX1BSRUNPTVBfU0hJRlQJMHgwMAorI2RlZmluZQlBSERfQU5ORVhDT0xfUFJFQ09NUF9TTEVXCTB4MDQKICNkZWZpbmUJQUhEX1RJTUVSX1VTX1BFUl9USUNLCTB4MTkKICNkZWZpbmUJU0NCX1RSQU5TRkVSX1NJWkVfRlVMTF9MVU4JMHgzOAogI2RlZmluZQlTVEFUVVNfUVVFVUVfRlVMTAkweDI4CkBAIC0zNzI0LDI4ICszNzYxLDE4IEBACiAjZGVmaW5lCUJfQ1VSUkZJRk9fMAkweDAyCiAjZGVmaW5lCUxVTkxFTl9TSU5HTEVfTEVWRUxfTFVOCTB4MGYKICNkZWZpbmUJTlZSQU1fU0NCX09GRlNFVAkweDJjCi0jZGVmaW5lCUFIRF9USU1FUl9NQVhfVVMJMHgxOGZmZTcKLSNkZWZpbmUJQUhEX1RJTUVSX01BWF9USUNLUwkweGZmZmYKICNkZWZpbmUJU1RBVFVTX1BLVF9TRU5TRQkweGZmCiAjZGVmaW5lCUNNRF9HUk9VUF9DT0RFX1NISUZUCTB4MDUKLSNkZWZpbmUJQUhEX1NFTlNFX0JVRlNJWkUJMHgxMDAKICNkZWZpbmUJTUFYX09GRlNFVF9QQUNFRF9CVUcJMHg3ZgotI2RlZmluZQlCVVNfOF9CSVQJMHgwMAogI2RlZmluZQlTVElNRVNFTF9CVUdfQURKCTB4MDgKICNkZWZpbmUJU1RJTUVTRUxfTUlOCTB4MTgKICNkZWZpbmUJU1RJTUVTRUxfU0hJRlQJMHgwMwogI2RlZmluZQlDQ1NHUkFNX01BWFNFR1MJMHgxMAogI2RlZmluZQlJTlZBTElEX0FERFIJMHg4MAotI2RlZmluZQlUQVJHRVRfQ01EX0NNUExUCTB4ZmUKLSNkZWZpbmUJU0VFT1BfV1JBTF9BRERSCTB4NDAKICNkZWZpbmUJU0VFT1BfRVJBTF9BRERSCTB4ODAKLSNkZWZpbmUJQUhEX0FNUExJVFVERV9ERUYJMHgwNwogI2RlZmluZQlBSERfU0xFV1JBVEVfREVGX1JFVkIJMHgwOAotI2RlZmluZQlBSERfUFJFQ09NUF9DVVRCQUNLXzM3CTB4MDcKICNkZWZpbmUJQUhEX1BSRUNPTVBfQ1VUQkFDS18xNwkweDA0Ci0jZGVmaW5lCUFIRF9QUkVDT01QX1NISUZUCTB4MDAKICNkZWZpbmUJQUhEX1BSRUNPTVBfTUFTSwkweDA3Ci0jZGVmaW5lCUFIRF9BTk5FWENPTF9QUkVDT01QX1NMRVcJMHgwNAogI2RlZmluZQlTUkNfTU9ERV9TSElGVAkweDAwCiAjZGVmaW5lCVBLVF9PVkVSUlVOX0JVRlNJWkUJMHgyMDAKICNkZWZpbmUJU0NCX1RSQU5TRkVSX1NJWkVfMUJZVEVfTFVOCTB4MzAKQEAgLTM3NjEsNiArMzc4OCw3IEBACiAKIAogLyogRG93bmxvYWRlZCBDb25zdGFudCBEZWZpbml0aW9ucyAqLworI2RlZmluZQlDQUNIRUxJTkVfTUFTSwkweDA3CiAjZGVmaW5lCVNDQl9UUkFOU0ZFUl9TSVpFCTB4MDYKICNkZWZpbmUJUEtUX09WRVJSVU5fQlVGT0ZGU0VUCTB4MDUKICNkZWZpbmUJU0dfU0laRU9GCTB4MDQKQEAgLTM3NjgsOSArMzc5Niw5IEBACiAjZGVmaW5lCVNHX1BSRUZFVENIX0FMSUdOX01BU0sJMHgwMgogI2RlZmluZQlTR19QUkVGRVRDSF9DTlRfTElNSVQJMHgwMQogI2RlZmluZQlTR19QUkVGRVRDSF9DTlQJMHgwMAotI2RlZmluZQlET1dOTE9BRF9DT05TVF9DT1VOVAkweDA3CisjZGVmaW5lCURPV05MT0FEX0NPTlNUX0NPVU5UCTB4MDgKIAogCiAvKiBFeHBvcnRlZCBMYWJlbHMgKi8KLSNkZWZpbmUJTEFCRUxfc2VxX2lzciAJMHgyNjkKLSNkZWZpbmUJTEFCRUxfdGltZXJfaXNyCTB4MjY1CisjZGVmaW5lCUxBQkVMX3NlcV9pc3IgCTB4Mjg1CisjZGVmaW5lCUxBQkVMX3RpbWVyX2lzcgkweDI4MQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9yZWdfcHJpbnQuY19zaGlwcGVkIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9yZWdfcHJpbnQuY19zaGlwcGVkCmluZGV4IDMwOThhNzUuLmE0MTM3YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcmVnX3ByaW50LmNfc2hpcHBlZAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3JlZ19wcmludC5jX3NoaXBwZWQKQEAgLTIsOCArMiw4IEBACiAgKiBETyBOT1QgRURJVCAtIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAogICoJCSBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlIGZpbGVzOgogICoKLSAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5zZXEjOTQgJAotICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3OXh4LnJlZyM3MCAkCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHguc2VxIzExOCAkCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHgucmVnIzc1ICQKICAqLwogCiAjaW5jbHVkZSAiYWljNzl4eF9vc20uaCIKQEAgLTE3MiwyMSArMTcyLDYgQEAKIAkgICAgMHgwYiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAotc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDTFJTRVFJTlRTVEFUX3BhcnNlX3RhYmxlW10gPSB7Ci0JeyAiQ0xSU0VRX1NQTFRJTlQiLAkweDAxLCAweDAxIH0sCi0JeyAiQ0xSU0VRX1BDSUlOVCIsCTB4MDIsIDB4MDIgfSwKLQl7ICJDTFJTRVFfU0NTSUlOVCIsCTB4MDQsIDB4MDQgfSwKLQl7ICJDTFJTRVFfU0VRSU5UIiwJMHgwOCwgMHgwOCB9LAotCXsgIkNMUlNFUV9TV1RNUlRPIiwJMHgxMCwgMHgxMCB9Ci19OwotCi1pbnQKLWFoZF9jbHJzZXFpbnRzdGF0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKLXsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihDTFJTRVFJTlRTVEFUX3BhcnNlX3RhYmxlLCA1LCAiQ0xSU0VRSU5UU1RBVCIsCi0JICAgIDB4MGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Ci19Ci0KIHN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0VRSU5UU1RBVF9wYXJzZV90YWJsZVtdID0gewogCXsgIlNFUV9TUExUSU5UIiwJMHgwMSwgMHgwMSB9LAogCXsgIlNFUV9QQ0lJTlQiLAkJMHgwMiwgMHgwMiB9LApAQCAtMjAyLDYgKzE4NywyMSBAQAogCSAgICAweDBjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IENMUlNFUUlOVFNUQVRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDTFJTRVFfU1BMVElOVCIsCTB4MDEsIDB4MDEgfSwKKwl7ICJDTFJTRVFfUENJSU5UIiwJMHgwMiwgMHgwMiB9LAorCXsgIkNMUlNFUV9TQ1NJSU5UIiwJMHgwNCwgMHgwNCB9LAorCXsgIkNMUlNFUV9TRVFJTlQiLAkweDA4LCAweDA4IH0sCisJeyAiQ0xSU0VRX1NXVE1SVE8iLAkweDEwLCAweDEwIH0KK307CisKK2ludAorYWhkX2NscnNlcWludHN0YXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKENMUlNFUUlOVFNUQVRfcGFyc2VfdGFibGUsIDUsICJDTFJTRVFJTlRTVEFUIiwKKwkgICAgMHgwYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKwogaW50CiBhaGRfc3d0aW1lcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7CkBAIC02NzAsMTYgKzY3MCwxNiBAQAogfQogCiBpbnQKLWFoZF9idXNpbml0aWRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQorYWhkX2RsY291bnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewotCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJCVVNJTklUSUQiLAorCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJETENPVU5UIiwKIAkgICAgMHgzYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAogaW50Ci1haGRfZGxjb3VudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCithaGRfYnVzaW5pdGlkX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRExDT1VOVCIsCisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJVU0lOSVRJRCIsCiAJICAgIDB4M2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKQEAgLTg1OSwyMSArODU5LDYgQEAKIAkgICAgMHg0OSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAotc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTQkxLQ1RMX3BhcnNlX3RhYmxlW10gPSB7Ci0JeyAiU0VMV0lERSIsCQkweDAyLCAweDAyIH0sCi0JeyAiRU5BQjIwIiwJCTB4MDQsIDB4MDQgfSwKLQl7ICJFTkFCNDAiLAkJMHgwOCwgMHgwOCB9LAotCXsgIkRJQUdMRURPTiIsCQkweDQwLCAweDQwIH0sCi0JeyAiRElBR0xFREVOIiwJCTB4ODAsIDB4ODAgfQotfTsKLQotaW50Ci1haGRfc2Jsa2N0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCi17Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0JMS0NUTF9wYXJzZV90YWJsZSwgNSwgIlNCTEtDVEwiLAotCSAgICAweDRhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwotfQotCiBzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IE9QVElPTk1PREVfcGFyc2VfdGFibGVbXSA9IHsKIAl7ICJBVVRPX01TR09VVF9ERSIsCTB4MDIsIDB4MDIgfSwKIAl7ICJFTkRHRk9STUNISyIsCTB4MDQsIDB4MDQgfSwKQEAgLTg5MSwyMiArODc2LDE5IEBACiAJICAgIDB4NGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKLXN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU1NUQVQwX3BhcnNlX3RhYmxlW10gPSB7Ci0JeyAiQVJCRE8iLAkJMHgwMSwgMHgwMSB9LAotCXsgIlNQSU9SRFkiLAkJMHgwMiwgMHgwMiB9LAotCXsgIk9WRVJSVU4iLAkJMHgwNCwgMHgwNCB9LAotCXsgIklPRVJSIiwJCTB4MDgsIDB4MDggfSwKLQl7ICJTRUxJTkdPIiwJCTB4MTAsIDB4MTAgfSwKLQl7ICJTRUxESSIsCQkweDIwLCAweDIwIH0sCi0JeyAiU0VMRE8iLAkJMHg0MCwgMHg0MCB9LAotCXsgIlRBUkdFVCIsCQkweDgwLCAweDgwIH0KK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0JMS0NUTF9wYXJzZV90YWJsZVtdID0geworCXsgIlNFTFdJREUiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkVOQUIyMCIsCQkweDA0LCAweDA0IH0sCisJeyAiRU5BQjQwIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJESUFHTEVET04iLAkJMHg0MCwgMHg0MCB9LAorCXsgIkRJQUdMRURFTiIsCQkweDgwLCAweDgwIH0KIH07CiAKIGludAotYWhkX3NzdGF0MF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCithaGRfc2Jsa2N0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU1NUQVQwX3BhcnNlX3RhYmxlLCA4LCAiU1NUQVQwIiwKLQkgICAgMHg0YiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTQkxLQ1RMX3BhcnNlX3RhYmxlLCA1LCAiU0JMS0NUTCIsCisJICAgIDB4NGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKIHN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ0xSU0lOVDBfcGFyc2VfdGFibGVbXSA9IHsKQEAgLTkyNiw2ICs5MDgsMjQgQEAKIAkgICAgMHg0YiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAorc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTU1RBVDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJBUkJETyIsCQkweDAxLCAweDAxIH0sCisJeyAiU1BJT1JEWSIsCQkweDAyLCAweDAyIH0sCisJeyAiT1ZFUlJVTiIsCQkweDA0LCAweDA0IH0sCisJeyAiSU9FUlIiLAkJMHgwOCwgMHgwOCB9LAorCXsgIlNFTElOR08iLAkJMHgxMCwgMHgxMCB9LAorCXsgIlNFTERJIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJTRUxETyIsCQkweDQwLCAweDQwIH0sCisJeyAiVEFSR0VUIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfc3N0YXQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTU1RBVDBfcGFyc2VfdGFibGUsIDgsICJTU1RBVDAiLAorCSAgICAweDRiLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCiBzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNJTU9ERTBfcGFyc2VfdGFibGVbXSA9IHsKIAl7ICJFTkFSQkRPIiwJCTB4MDEsIDB4MDEgfSwKIAl7ICJFTlNQSU9SRFkiLAkJMHgwMiwgMHgwMiB9LApAQCAtOTk4LDYgKzk5OCwxOSBAQAogCSAgICAweDRkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNJTU9ERTJfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJFTkRNQURPTkUiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkVOU0RPTkUiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkVOV0lERV9SRVMiLAkJMHgwNCwgMHgwNCB9Cit9OworCitpbnQKK2FoZF9zaW1vZGUyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTSU1PREUyX3BhcnNlX3RhYmxlLCAzLCAiU0lNT0RFMiIsCisJICAgIDB4NGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKIHN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ0xSU0lOVDJfcGFyc2VfdGFibGVbXSA9IHsKIAl7ICJDTFJETUFET05FIiwJCTB4MDEsIDB4MDEgfSwKIAl7ICJDTFJTRE9ORSIsCQkweDAyLCAweDAyIH0sCkBAIC0xMDEyLDE5ICsxMDI1LDYgQEAKIAkgICAgMHg0ZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAotc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTSU1PREUyX3BhcnNlX3RhYmxlW10gPSB7Ci0JeyAiRU5ETUFET05FIiwJCTB4MDEsIDB4MDEgfSwKLQl7ICJFTlNET05FIiwJCTB4MDIsIDB4MDIgfSwKLQl7ICJFTldJREVfUkVTIiwJCTB4MDQsIDB4MDQgfQotfTsKLQotaW50Ci1haGRfc2ltb2RlMl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCi17Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0lNT0RFMl9wYXJzZV90YWJsZSwgMywgIlNJTU9ERTIiLAotCSAgICAweDRkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwotfQotCiBzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFBFUlJESUFHX3BhcnNlX3RhYmxlW10gPSB7CiAJeyAiRFRFUlIiLAkJMHgwMSwgMHgwMSB9LAogCXsgIkRHRk9STUVSUiIsCQkweDAyLCAweDAyIH0sCkBAIC0xMjIwLDIxICsxMjIwLDYgQEAKIAkgICAgMHg1MywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAotc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBMUU9NT0RFMF9wYXJzZV90YWJsZVtdID0gewotCXsgIkVOTFFPVENSQyIsCQkweDAxLCAweDAxIH0sCi0JeyAiRU5MUU9BVE5QS1QiLAkweDAyLCAweDAyIH0sCi0JeyAiRU5MUU9BVE5MUSIsCQkweDA0LCAweDA0IH0sCi0JeyAiRU5MUU9TVE9QVDIiLAkweDA4LCAweDA4IH0sCi0JeyAiRU5MUU9UQVJHU0NCUEVSUiIsCTB4MTAsIDB4MTAgfQotfTsKLQotaW50Ci1haGRfbHFvbW9kZTBfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQotewotCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKExRT01PREUwX3BhcnNlX3RhYmxlLCA1LCAiTFFPTU9ERTAiLAotCSAgICAweDU0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwotfQotCiBzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IExRT1NUQVQwX3BhcnNlX3RhYmxlW10gPSB7CiAJeyAiTFFPVENSQyIsCQkweDAxLCAweDAxIH0sCiAJeyAiTFFPQVROUEtUIiwJCTB4MDIsIDB4MDIgfSwKQEAgLTEyNjUsNiArMTI1MCwzNiBAQAogCSAgICAweDU0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IExRT01PREUwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRU5MUU9UQ1JDIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJFTkxRT0FUTlBLVCIsCTB4MDIsIDB4MDIgfSwKKwl7ICJFTkxRT0FUTkxRIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJFTkxRT1NUT1BUMiIsCTB4MDgsIDB4MDggfSwKKwl7ICJFTkxRT1RBUkdTQ0JQRVJSIiwJMHgxMCwgMHgxMCB9Cit9OworCitpbnQKK2FoZF9scW9tb2RlMF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTFFPTU9ERTBfcGFyc2VfdGFibGUsIDUsICJMUU9NT0RFMCIsCisJICAgIDB4NTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgTFFPTU9ERTFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJFTkxRT1BIQUNIR0lOUEtUIiwJMHgwMSwgMHgwMSB9LAorCXsgIkVOTFFPQlVTRlJFRSIsCTB4MDIsIDB4MDIgfSwKKwl7ICJFTkxRT0JBRFFBUyIsCTB4MDQsIDB4MDQgfSwKKwl7ICJFTkxRT1NUT1BJMiIsCTB4MDgsIDB4MDggfSwKKwl7ICJFTkxRT0lOSVRTQ0JQRVJSIiwJMHgxMCwgMHgxMCB9Cit9OworCitpbnQKK2FoZF9scW9tb2RlMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTFFPTU9ERTFfcGFyc2VfdGFibGUsIDUsICJMUU9NT0RFMSIsCisJICAgIDB4NTUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKIHN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgTFFPU1RBVDFfcGFyc2VfdGFibGVbXSA9IHsKIAl7ICJMUU9QSEFDSEdJTlBLVCIsCTB4MDEsIDB4MDEgfSwKIAl7ICJMUU9CVVNGUkVFIiwJCTB4MDIsIDB4MDIgfSwKQEAgLTEyOTUsMjEgKzEzMTAsNiBAQAogCSAgICAweDU1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCi1zdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IExRT01PREUxX3BhcnNlX3RhYmxlW10gPSB7Ci0JeyAiRU5MUU9QSEFDSEdJTlBLVCIsCTB4MDEsIDB4MDEgfSwKLQl7ICJFTkxRT0JVU0ZSRUUiLAkweDAyLCAweDAyIH0sCi0JeyAiRU5MUU9CQURRQVMiLAkweDA0LCAweDA0IH0sCi0JeyAiRU5MUU9TVE9QSTIiLAkweDA4LCAweDA4IH0sCi0JeyAiRU5MUU9JTklUU0NCUEVSUiIsCTB4MTAsIDB4MTAgfQotfTsKLQotaW50Ci1haGRfbHFvbW9kZTFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQotewotCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKExRT01PREUxX3BhcnNlX3RhYmxlLCA1LCAiTFFPTU9ERTEiLAotCSAgICAweDU1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwotfQotCiBzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IExRT1NUQVQyX3BhcnNlX3RhYmxlW10gPSB7CiAJeyAiTFFPU1RPUDAiLAkJMHgwMSwgMHgwMSB9LAogCXsgIkxRT1BIQUNIR09VVFBLVCIsCTB4MDIsIDB4MDIgfSwKQEAgLTE1OTQsNiArMTU5NCwxMyBAQAogCSAgICAweDY1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCitpbnQKK2FoZF9hbm5leGRhdF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFOTkVYREFUIiwKKwkgICAgMHg2NiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKwogc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTQ1NDSEtOX3BhcnNlX3RhYmxlW10gPSB7CiAJeyAiTFNUU0dDTFJESVMiLAkweDAxLCAweDAxIH0sCiAJeyAiU0hWQUxJRFNURElTIiwJMHgwMiwgMHgwMiB9LApAQCAtMTYxMiwxMyArMTYxOSw2IEBACiB9CiAKIGludAotYWhkX2FubmV4ZGF0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKLXsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQU5ORVhEQVQiLAotCSAgICAweDY2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwotfQotCi1pbnQKIGFoZF9pb3duaWRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJT1dOSUQiLApAQCAtMTcyOCwxNiArMTcyOCwxNiBAQAogfQogCiBpbnQKLWFoZF9wbGw0MDBjbnQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK2FoZF91bmZhaXJuZXNzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUExMNDAwQ05UMCIsCisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlVORkFJUk5FU1MiLAogCSAgICAweDZlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBpbnQKLWFoZF91bmZhaXJuZXNzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK2FoZF9wbGw0MDBjbnQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiVU5GQUlSTkVTUyIsCisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlBMTDQwMENOVDAiLAogCSAgICAweDZlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCkBAIC0xNzg4LDEzICsxNzg4LDYgQEAKIH0KIAogaW50Ci1haGRfc2doYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCi17Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHSEFERFIiLAotCSAgICAweDdjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwotfQotCi1pbnQKIGFoZF9zY2JoYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7CiAJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQkhBRERSIiwKQEAgLTE4MDIsMTAgKzE3OTUsMTAgQEAKIH0KIAogaW50Ci1haGRfc2doY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK2FoZF9zZ2hhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0dIQ05UIiwKLQkgICAgMHg4NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0dIQUREUiIsCisJICAgIDB4N2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKIGludApAQCAtMTgxNSw2ICsxODA4LDEzIEBACiAJICAgIDB4ODQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKK2ludAorYWhkX3NnaGNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHSENOVCIsCisJICAgIDB4ODQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKIHN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgREZGX1RIUlNIX3BhcnNlX3RhYmxlW10gPSB7CiAJeyAiV1JfREZUSFJTSF9NSU4iLAkweDAwLCAweDcwIH0sCiAJeyAiUkRfREZUSFJTSF9NSU4iLAkweDAwLCAweDA3IH0sCkBAIC0xOTUwLDE3ICsxOTUwLDYgQEAKIAkgICAgMHg5MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAotc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBEQ0hSWE1TRzFfcGFyc2VfdGFibGVbXSA9IHsKLQl7ICJDQk5VTSIsCQkweGZmLCAweGZmIH0KLX07Ci0KLWludAotYWhkX2RjaHJ4bXNnMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCi17Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoRENIUlhNU0cxX3BhcnNlX3RhYmxlLCAxLCAiRENIUlhNU0cxIiwKLQkgICAgMHg5MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKLX0KLQogc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDTUNSWE1TRzFfcGFyc2VfdGFibGVbXSA9IHsKIAl7ICJDQk5VTSIsCQkweGZmLCAweGZmIH0KIH07CkBAIC0xOTcyLDYgKzE5NjEsMTcgQEAKIAkgICAgMHg5MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAorc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBEQ0hSWE1TRzFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDQk5VTSIsCQkweGZmLCAweGZmIH0KK307CisKK2ludAorYWhkX2RjaHJ4bXNnMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoRENIUlhNU0cxX3BhcnNlX3RhYmxlLCAxLCAiRENIUlhNU0cxIiwKKwkgICAgMHg5MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKwogc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBEQ0hSWE1TRzJfcGFyc2VfdGFibGVbXSA9IHsKIAl7ICJNSU5ERVgiLAkJMHhmZiwgMHhmZiB9CiB9OwpAQCAtMTk4MywxNyArMTk4Myw2IEBACiAJICAgIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKLXN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgT1ZMWVJYTVNHMl9wYXJzZV90YWJsZVtdID0gewotCXsgIk1JTkRFWCIsCQkweGZmLCAweGZmIH0KLX07Ci0KLWludAotYWhkX292bHlyeG1zZzJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQotewotCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE9WTFlSWE1TRzJfcGFyc2VfdGFibGUsIDEsICJPVkxZUlhNU0cyIiwKLQkgICAgMHg5MiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKLX0KLQogc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDTUNSWE1TRzJfcGFyc2VfdGFibGVbXSA9IHsKIAl7ICJNSU5ERVgiLAkJMHhmZiwgMHhmZiB9CiB9OwpAQCAtMjAxMiw2ICsyMDAxLDE3IEBACiAJICAgIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgT1ZMWVJYTVNHMl9wYXJzZV90YWJsZVtdID0geworCXsgIk1JTkRFWCIsCQkweGZmLCAweGZmIH0KK307CisKK2ludAorYWhkX292bHlyeG1zZzJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE9WTFlSWE1TRzJfcGFyc2VfdGFibGUsIDEsICJPVkxZUlhNU0cyIiwKKwkgICAgMHg5MiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKwogc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBEQ0hSWE1TRzNfcGFyc2VfdGFibGVbXSA9IHsKIAl7ICJNQ0xBU1MiLAkJMHgwZiwgMHgwZiB9CiB9OwpAQCAtMjAyMyw2ICsyMDIzLDE3IEBACiAJICAgIDB4OTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgT1ZMWVJYTVNHM19wYXJzZV90YWJsZVtdID0geworCXsgIk1DTEFTUyIsCQkweDBmLCAweDBmIH0KK307CisKK2ludAorYWhkX292bHlyeG1zZzNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE9WTFlSWE1TRzNfcGFyc2VfdGFibGUsIDEsICJPVkxZUlhNU0czIiwKKwkgICAgMHg5MywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKwogc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDTUNSWE1TRzNfcGFyc2VfdGFibGVbXSA9IHsKIAl7ICJNQ0xBU1MiLAkJMHgwZiwgMHgwZiB9CiB9OwpAQCAtMjA1MSwxNyArMjA2Miw2IEBACiAJICAgIDB4OTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKLXN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgT1ZMWVJYTVNHM19wYXJzZV90YWJsZVtdID0gewotCXsgIk1DTEFTUyIsCQkweDBmLCAweDBmIH0KLX07Ci0KLWludAotYWhkX292bHlyeG1zZzNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQotewotCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE9WTFlSWE1TRzNfcGFyc2VfdGFibGUsIDEsICJPVkxZUlhNU0czIiwKLQkgICAgMHg5MywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKLX0KLQogaW50CiBhaGRfb3ZseXNlcWJjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewpAQCAtMjA3MCwxNiArMjA3MCwxNiBAQAogfQogCiBpbnQKLWFoZF9jbWNzZXFiY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK2FoZF9kY2hzZXFiY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ01DU0VRQkNOVCIsCisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRDSFNFUUJDTlQiLAogCSAgICAweDk0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBpbnQKLWFoZF9kY2hzZXFiY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK2FoZF9jbWNzZXFiY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRENIU0VRQkNOVCIsCisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNQ1NFUUJDTlQiLAogCSAgICAweDk0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCkBAIC0yMTAxLDI0ICsyMTAxLDYgQEAKIAkgICAgMHg5NiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAotc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBPVkxZU1BMVFNUQVQwX3BhcnNlX3RhYmxlW10gPSB7Ci0JeyAiUlhTUExUUlNQIiwJCTB4MDEsIDB4MDEgfSwKLQl7ICJSWFNDRU1TRyIsCQkweDAyLCAweDAyIH0sCi0JeyAiUlhPVlJVTiIsCQkweDA0LCAweDA0IH0sCi0JeyAiQ05UTk9UQ01QTFQiLAkweDA4LCAweDA4IH0sCi0JeyAiU0NEQVRCVUNLRVQiLAkweDEwLCAweDEwIH0sCi0JeyAiU0NBREVSUiIsCQkweDIwLCAweDIwIH0sCi0JeyAiU0NCQ0VSUiIsCQkweDQwLCAweDQwIH0sCi0JeyAiU1RBRVRFUk0iLAkJMHg4MCwgMHg4MCB9Ci19OwotCi1pbnQKLWFoZF9vdmx5c3BsdHN0YXQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKLXsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihPVkxZU1BMVFNUQVQwX3BhcnNlX3RhYmxlLCA4LCAiT1ZMWVNQTFRTVEFUMCIsCi0JICAgIDB4OTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Ci19Ci0KIHN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgRENIU1BMVFNUQVQwX3BhcnNlX3RhYmxlW10gPSB7CiAJeyAiUlhTUExUUlNQIiwJCTB4MDEsIDB4MDEgfSwKIAl7ICJSWFNDRU1TRyIsCQkweDAyLCAweDAyIH0sCkBAIC0yMTM3LDE1ICsyMTE5LDIyIEBACiAJICAgIDB4OTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKLXN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgRENIU1BMVFNUQVQxX3BhcnNlX3RhYmxlW10gPSB7Ci0JeyAiUlhEQVRBQlVDS0VUIiwJMHgwMSwgMHgwMSB9CitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IE9WTFlTUExUU1RBVDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJSWFNQTFRSU1AiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlJYU0NFTVNHIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJSWE9WUlVOIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJDTlROT1RDTVBMVCIsCTB4MDgsIDB4MDggfSwKKwl7ICJTQ0RBVEJVQ0tFVCIsCTB4MTAsIDB4MTAgfSwKKwl7ICJTQ0FERVJSIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJTQ0JDRVJSIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJTVEFFVEVSTSIsCQkweDgwLCAweDgwIH0KIH07CiAKIGludAotYWhkX2RjaHNwbHRzdGF0MV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCithaGRfb3ZseXNwbHRzdGF0MF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoRENIU1BMVFNUQVQxX3BhcnNlX3RhYmxlLCAxLCAiRENIU1BMVFNUQVQxIiwKLQkgICAgMHg5NywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihPVkxZU1BMVFNUQVQwX3BhcnNlX3RhYmxlLCA4LCAiT1ZMWVNQTFRTVEFUMCIsCisJICAgIDB4OTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKIHN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ01DU1BMVFNUQVQxX3BhcnNlX3RhYmxlW10gPSB7CkBAIC0yMTcwLDYgKzIxNTksMTcgQEAKIAkgICAgMHg5NywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAorc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBEQ0hTUExUU1RBVDFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJSWERBVEFCVUNLRVQiLAkweDAxLCAweDAxIH0KK307CisKK2ludAorYWhkX2RjaHNwbHRzdGF0MV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoRENIU1BMVFNUQVQxX3BhcnNlX3RhYmxlLCAxLCAiRENIU1BMVFNUQVQxIiwKKwkgICAgMHg5NywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKwogc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTR1JYTVNHMF9wYXJzZV90YWJsZVtdID0gewogCXsgIkNGTlVNIiwJCTB4MDcsIDB4MDcgfSwKIAl7ICJDRE5VTSIsCQkweGY4LCAweGY4IH0KQEAgLTIzMjAsNiArMjMyMCwxNyBAQAogCSAgICAweDllLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNHU1BMVFNUQVQxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUlhEQVRBQlVDS0VUIiwJMHgwMSwgMHgwMSB9Cit9OworCitpbnQKK2FoZF9zZ3NwbHRzdGF0MV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0dTUExUU1RBVDFfcGFyc2VfdGFibGUsIDEsICJTR1NQTFRTVEFUMSIsCisJICAgIDB4OWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKIHN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0ZVTkNUX3BhcnNlX3RhYmxlW10gPSB7CiAJeyAiVEVTVF9OVU0iLAkJMHgwZiwgMHgwZiB9LAogCXsgIlRFU1RfR1JPVVAiLAkJMHhmMCwgMHhmMCB9CkBAIC0yMzMyLDE3ICsyMzQzLDYgQEAKIAkgICAgMHg5ZiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAotc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTR1NQTFRTVEFUMV9wYXJzZV90YWJsZVtdID0gewotCXsgIlJYREFUQUJVQ0tFVCIsCTB4MDEsIDB4MDEgfQotfTsKLQotaW50Ci1haGRfc2dzcGx0c3RhdDFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQotewotCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNHU1BMVFNUQVQxX3BhcnNlX3RhYmxlLCAxLCAiU0dTUExUU1RBVDEiLAotCSAgICAweDlmLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwotfQotCiBzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IERGMFBDSVNUQVRfcGFyc2VfdGFibGVbXSA9IHsKIAl7ICJEUFIiLAkJMHgwMSwgMHgwMSB9LAogCXsgIlRXQVRFUlIiLAkJMHgwMiwgMHgwMiB9LApAQCAtMjUzNywxNiArMjUzNywxNiBAQAogfQogCiBpbnQKLWFoZF9jY3NjYmFkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQorYWhkX2Njc2NiYWRyX2JrX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NTQ0JBRERSIiwKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NTQ0JBRFJfQksiLAogCSAgICAweGFjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBpbnQKLWFoZF9jY3NjYmFkcl9ia19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCithaGRfY2NzY2JhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NTQ0JBRFJfQksiLAorCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQkFERFIiLAogCSAgICAweGFjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCkBAIC0yNTY2LDIyICsyNTY2LDYgQEAKIAkgICAgMHhhZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAotc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDQ1NHQ1RMX3BhcnNlX3RhYmxlW10gPSB7Ci0JeyAiQ0NTR1JFU0VUIiwJCTB4MDEsIDB4MDEgfSwKLQl7ICJTR19GRVRDSF9SRVEiLAkweDAyLCAweDAyIH0sCi0JeyAiQ0NTR0VOQUNLIiwJCTB4MDgsIDB4MDggfSwKLQl7ICJTR19DQUNIRV9BVkFJTCIsCTB4MTAsIDB4MTAgfSwKLQl7ICJDQ1NHRE9ORSIsCQkweDgwLCAweDgwIH0sCi0JeyAiQ0NTR0VOIiwJCTB4MGMsIDB4MGMgfQotfTsKLQotaW50Ci1haGRfY2NzZ2N0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCi17Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ0NTR0NUTF9wYXJzZV90YWJsZSwgNiwgIkNDU0dDVEwiLAotCSAgICAweGFkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwotfQotCiBzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IENDU0NCQ1RMX3BhcnNlX3RhYmxlW10gPSB7CiAJeyAiQ0NTQ0JSRVNFVCIsCQkweDAxLCAweDAxIH0sCiAJeyAiQ0NTQ0JESVIiLAkJMHgwNCwgMHgwNCB9LApAQCAtMjU5OCw2ICsyNTgyLDIyIEBACiAJICAgIDB4YWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ0NTR0NUTF9wYXJzZV90YWJsZVtdID0geworCXsgIkNDU0dSRVNFVCIsCQkweDAxLCAweDAxIH0sCisJeyAiU0dfRkVUQ0hfUkVRIiwJMHgwMiwgMHgwMiB9LAorCXsgIkNDU0dFTkFDSyIsCQkweDA4LCAweDA4IH0sCisJeyAiU0dfQ0FDSEVfQVZBSUwiLAkweDEwLCAweDEwIH0sCisJeyAiQ0NTR0RPTkUiLAkJMHg4MCwgMHg4MCB9LAorCXsgIkNDU0dFTiIsCQkweDBjLCAweDBjIH0KK307CisKK2ludAorYWhkX2Njc2djdGxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKENDU0dDVExfcGFyc2VfdGFibGUsIDYsICJDQ1NHQ1RMIiwKKwkgICAgMHhhZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKwogaW50CiBhaGRfY2NzZ3JhbV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7CkBAIC0yODQxLDEzICsyODQxLDYgQEAKIH0KIAogaW50Ci1haGRfZGZwdHJzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKLXsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZQVFJTIiwKLQkgICAgMHhjOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKLX0KLQotaW50CiBhaGRfcmN2cmJpYXNjYWxjX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUkNWUkJJQVNDQUxDIiwKQEAgLTI4NTUsMTAgKzI4NDgsMTAgQEAKIH0KIAogaW50Ci1haGRfZGZia3B0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCithaGRfZGZwdHJzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZCS1BUUiIsCi0JICAgIDB4YzksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGUFRSUyIsCisJICAgIDB4YzgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKIGludApAQCAtMjg2OCw2ICsyODYxLDEzIEBACiAJICAgIDB4YzksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKK2ludAorYWhkX2RmYmtwdHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJERkJLUFRSIiwKKwkgICAgMHhjOSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKwogc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBERkRCQ1RMX3BhcnNlX3RhYmxlW10gPSB7CiAJeyAiREZGX1JBTUJJU1RfRU4iLAkweDAxLCAweDAxIH0sCiAJeyAiREZGX1JBTUJJU1RfRE9ORSIsCTB4MDIsIDB4MDIgfSwKQEAgLTMwMDEsNiArMzAwMSwxMyBAQAogCSAgICAweGU0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCitpbnQKK2FoZF9icmthZGRyMF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJSS0FERFIwIiwKKwkgICAgMHhlNiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKwogc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBCUktBRERSMV9wYXJzZV90YWJsZVtdID0gewogCXsgIkJSS0RJUyIsCQkweDgwLCAweDgwIH0KIH07CkBAIC0zMDEzLDEzICszMDIwLDYgQEAKIH0KIAogaW50Ci1haGRfYnJrYWRkcjBfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQotewotCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJCUktBRERSMCIsCi0JICAgIDB4ZTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Ci19Ci0KLWludAogYWhkX2FsbG9uZXNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBTExPTkVTIiwKQEAgLTMwNjksMTMgKzMwNjksNiBAQAogfQogCiBpbnQKLWFoZF9jdXJhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKLXsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ1VSQUREUiIsCi0JICAgIDB4ZjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Ci19Ci0KLWludAogYWhkX2ludHZlYzFfYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7CiAJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVFZFQzFfQUREUiIsCkBAIC0zMDgzLDEwICszMDc2LDEwIEBACiB9CiAKIGludAotYWhkX2ludHZlYzJfYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCithaGRfY3VyYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7Ci0JcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVFZFQzJfQUREUiIsCi0JICAgIDB4ZjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNVUkFERFIiLAorCSAgICAweGY0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBpbnQKQEAgLTMwOTcsNiArMzA5MCwxMyBAQAogfQogCiBpbnQKK2FoZF9pbnR2ZWMyX2FkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRWRUMyX0FERFIiLAorCSAgICAweGY2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKIGFoZF9sb25nam1wX2FkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMT05HSk1QX0FERFIiLApAQCAtMzE3NCwyNCArMzE3NCw0NSBAQAogfQogCiBpbnQKK2FoZF9jb21wbGV0ZV9kbWFfc2NiX3RhaWxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDT01QTEVURV9ETUFfU0NCX1RBSUwiLAorCSAgICAweDEyZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfY29tcGxldGVfb25fcWZyZWV6ZV9oZWFkX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ09NUExFVEVfT05fUUZSRUVaRV9IRUFEIiwKKwkgICAgMHgxMzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAogYWhkX3FmcmVlemVfY291bnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRRlJFRVpFX0NPVU5UIiwKLQkgICAgMHgxMmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJICAgIDB4MTMyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9rZXJuZWxfcWZyZWV6ZV9jb3VudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIktFUk5FTF9RRlJFRVpFX0NPVU5UIiwKKwkgICAgMHgxMzQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKIGludAogYWhkX3NhdmVkX21vZGVfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQVZFRF9NT0RFIiwKLQkgICAgMHgxMzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJICAgIDB4MTM2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBpbnQKIGFoZF9tc2dfb3V0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTVNHX09VVCIsCi0JICAgIDB4MTMxLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworCSAgICAweDEzNywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAogc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBETUFQQVJBTVNfcGFyc2VfdGFibGVbXSA9IHsKQEAgLTMyMTEsNyArMzIzMiw3IEBACiBhaGRfZG1hcGFyYW1zX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihETUFQQVJBTVNfcGFyc2VfdGFibGUsIDEwLCAiRE1BUEFSQU1TIiwKLQkgICAgMHgxMzIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJICAgIDB4MTM4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNFUV9GTEFHU19wYXJzZV90YWJsZVtdID0gewpAQCAtMzIzMCwyMSArMzI1MSwyMSBAQAogYWhkX3NlcV9mbGFnc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7CiAJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0VRX0ZMQUdTX3BhcnNlX3RhYmxlLCA5LCAiU0VRX0ZMQUdTIiwKLQkgICAgMHgxMzMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJICAgIDB4MTM5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBpbnQKIGFoZF9zYXZlZF9zY3NpaWRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQVZFRF9TQ1NJSUQiLAotCSAgICAweDEzNCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKKwkgICAgMHgxM2EsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKIGludAogYWhkX3NhdmVkX2x1bl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7CiAJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNBVkVEX0xVTiIsCi0JICAgIDB4MTM1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworCSAgICAweDEzYiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAogc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBMQVNUUEhBU0VfcGFyc2VfdGFibGVbXSA9IHsKQEAgLTMyNjcsNDIgKzMyODgsNDIgQEAKIGFoZF9sYXN0cGhhc2VfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKExBU1RQSEFTRV9wYXJzZV90YWJsZSwgMTMsICJMQVNUUEhBU0UiLAotCSAgICAweDEzNiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKKwkgICAgMHgxM2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKIGludAogYWhkX3FvdXRmaWZvX2VudHJ5X3ZhbGlkX3RhZ19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7CiAJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlFPVVRGSUZPX0VOVFJZX1ZBTElEX1RBRyIsCi0JICAgIDB4MTM3LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwotfQotCi1pbnQKLWFoZF9zaGFyZWRfZGF0YV9hZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKLXsKLQlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0hBUkVEX0RBVEFfQUREUiIsCi0JICAgIDB4MTM4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwotfQotCi1pbnQKLWFoZF9xb3V0Zmlmb19uZXh0X2FkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQotewotCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRT1VURklGT19ORVhUX0FERFIiLAotCSAgICAweDEzYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKKwkgICAgMHgxM2QsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKIGludAogYWhkX2tlcm5lbF90cWlucG9zX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiS0VSTkVMX1RRSU5QT1MiLAotCSAgICAweDE0MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKKwkgICAgMHgxM2UsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKIGludAogYWhkX3RxaW5wb3NfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJUUUlOUE9TIiwKLQkgICAgMHgxNDEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJICAgIDB4MTNmLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zaGFyZWRfZGF0YV9hZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0hBUkVEX0RBVEFfQUREUiIsCisJICAgIDB4MTQwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9xb3V0Zmlmb19uZXh0X2FkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRT1VURklGT19ORVhUX0FERFIiLAorCSAgICAweDE0NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAogc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBBUkdfMV9wYXJzZV90YWJsZVtdID0gewpAQCAtMzMyMCwyMSArMzM0MSwyMSBAQAogYWhkX2FyZ18xX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihBUkdfMV9wYXJzZV90YWJsZSwgOCwgIkFSR18xIiwKLQkgICAgMHgxNDIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJICAgIDB4MTQ4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBpbnQKIGFoZF9hcmdfMl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7CiAJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFSR18yIiwKLQkgICAgMHgxNDMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJICAgIDB4MTQ5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBpbnQKIGFoZF9sYXN0X21zZ19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7CiAJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxBU1RfTVNHIiwKLQkgICAgMHgxNDQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJICAgIDB4MTRhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNDU0lTRVFfVEVNUExBVEVfcGFyc2VfdGFibGVbXSA9IHsKQEAgLTMzNTAsMTQgKzMzNzEsMTQgQEAKIGFoZF9zY3Npc2VxX3RlbXBsYXRlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTQ1NJU0VRX1RFTVBMQVRFX3BhcnNlX3RhYmxlLCA2LCAiU0NTSVNFUV9URU1QTEFURSIsCi0JICAgIDB4MTQ1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworCSAgICAweDE0YiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAogaW50CiBhaGRfaW5pdGlhdG9yX3RhZ19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7CiAJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOSVRJQVRPUl9UQUciLAotCSAgICAweDE0NiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKKwkgICAgMHgxNGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKIHN0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0VRX0ZMQUdTMl9wYXJzZV90YWJsZVtdID0gewpAQCAtMzM2OSw2MyArMzM5MCw2MyBAQAogYWhkX3NlcV9mbGFnczJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNFUV9GTEFHUzJfcGFyc2VfdGFibGUsIDIsICJTRVFfRkxBR1MyIiwKLQkgICAgMHgxNDcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJICAgIDB4MTRkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBpbnQKIGFoZF9hbGxvY2ZpZm9fc2NicHRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQUxMT0NGSUZPX1NDQlBUUiIsCi0JICAgIDB4MTQ4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworCSAgICAweDE0ZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAogaW50CiBhaGRfaW50X2NvYWxlc2NpbmdfdGltZXJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRfQ09BTEVTQ0lOR19USU1FUiIsCi0JICAgIDB4MTRhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworCSAgICAweDE1MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAogaW50CiBhaGRfaW50X2NvYWxlc2NpbmdfbWF4Y21kc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCiB7CiAJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVF9DT0FMRVNDSU5HX01BWENNRFMiLAotCSAgICAweDE0YywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKKwkgICAgMHgxNTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKIGludAogYWhkX2ludF9jb2FsZXNjaW5nX21pbmNtZHNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRfQ09BTEVTQ0lOR19NSU5DTURTIiwKLQkgICAgMHgxNGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJICAgIDB4MTUzLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBpbnQKIGFoZF9jbWRzX3BlbmRpbmdfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTURTX1BFTkRJTkciLAotCSAgICAweDE0ZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKKwkgICAgMHgxNTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKIGludAogYWhkX2ludF9jb2FsZXNjaW5nX2NtZGNvdW50X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5UX0NPQUxFU0NJTkdfQ01EQ09VTlQiLAotCSAgICAweDE1MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKKwkgICAgMHgxNTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CiB9CiAKIGludAogYWhkX2xvY2FsX2hzX21haWxib3hfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQogewogCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMT0NBTF9IU19NQUlMQk9YIiwKLQkgICAgMHgxNTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7CisJICAgIDB4MTU3LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOwogfQogCiBpbnQKIGFoZF9jbWRzaXplX3RhYmxlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKIHsKIAlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ01EU0laRV9UQUJMRSIsCi0JICAgIDB4MTUyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworCSAgICAweDE1OCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKIH0KIAogaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3NlcS5oX3NoaXBwZWQgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3NlcS5oX3NoaXBwZWQKaW5kZXggNzdjNDcxZi4uYjFlNTM2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9zZXEuaF9zaGlwcGVkCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfc2VxLmhfc2hpcHBlZApAQCAtMiwyMTUgKzIsMjI4IEBACiAgKiBETyBOT1QgRURJVCAtIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAogICoJCSBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlIGZpbGVzOgogICoKLSAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5zZXEjOTQgJAotICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3OXh4LnJlZyM3MCAkCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHguc2VxIzExOSAkCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHgucmVnIzc2ICQKICAqLwogc3RhdGljIHVpbnQ4X3Qgc2VxcHJvZ1tdID0gewogCTB4ZmYsIDB4MDIsIDB4MDYsIDB4NzgsCi0JMHgwMCwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDAwLCAweGVhLCAweDY0LCAweDU5LAogCTB4MDEsIDB4ZWEsIDB4MDQsIDB4MzAsCiAJMHhmZiwgMHgwNCwgMHgwYywgMHg3OCwKLQkweDE5LCAweGVhLCAweDUwLCAweDU5LAorCTB4MTksIDB4ZWEsIDB4NjQsIDB4NTksCiAJMHgxOSwgMHhlYSwgMHgwNCwgMHgwMCwKLQkweDMzLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MzMsIDB4ZWEsIDB4NWUsIDB4NTksCiAJMHgzMywgMHhlYSwgMHgwMCwgMHgwMCwKLQkweDYwLCAweDNhLCAweDFhLCAweDY4LAotCTB4MDQsIDB4NDcsIDB4MWIsIDB4NjgsCi0JMHhmZiwgMHgyMSwgMHgxYiwgMHg3MCwKLQkweDQwLCAweDRiLCAweDkyLCAweDY5LAotCTB4MDAsIDB4ZTIsIDB4NTQsIDB4NTksCi0JMHg0MCwgMHg0YiwgMHg5MiwgMHg2OSwKLQkweDIwLCAweDRiLCAweDgyLCAweDY5LAotCTB4ZmMsIDB4NDIsIDB4MjQsIDB4NzgsCi0JMHgxMCwgMHg0MCwgMHgyNCwgMHg3OCwKLQkweDAwLCAweGUyLCAweGM0LCAweDVkLAotCTB4MjAsIDB4NGQsIDB4MjgsIDB4NzgsCi0JMHgwMCwgMHhlMiwgMHhjNCwgMHg1ZCwKKwkweDYwLCAweDNhLCAweDNhLCAweDY4LAorCTB4MDQsIDB4NGQsIDB4MzUsIDB4NzgsCisJMHgwMSwgMHgzNCwgMHhjMSwgMHgzMSwKKwkweDAwLCAweDMyLCAweDIxLCAweDYwLAorCTB4MDEsIDB4MzUsIDB4YzEsIDB4MzEsCisJMHgwMCwgMHgzMywgMHgyMSwgMHg2MCwKKwkweGZiLCAweDRkLCAweDliLCAweDBhLAorCTB4MDAsIDB4ZTIsIDB4MzQsIDB4NDAsCisJMHg1MCwgMHg0YiwgMHgzYSwgMHg2OCwKKwkweGZmLCAweDMxLCAweDNiLCAweDcwLAorCTB4MDIsIDB4MzAsIDB4NTEsIDB4MzEsCisJMHhmZiwgMHg4ZCwgMHgyZCwgMHg3MCwKKwkweDAyLCAweDhjLCAweDUxLCAweDMxLAorCTB4ZmYsIDB4OGQsIDB4MjksIDB4NjAsCisJMHgwMiwgMHgyOCwgMHgxOSwgMHgzMywKKwkweDAyLCAweDMwLCAweDUxLCAweDMyLAorCTB4ZmYsIDB4ZWEsIDB4NjIsIDB4MDIsCisJMHgwMCwgMHhlMiwgMHgzYSwgMHg0MCwKKwkweGZmLCAweDIxLCAweDNiLCAweDcwLAorCTB4NDAsIDB4NGIsIDB4YWEsIDB4NjksCisJMHgwMCwgMHhlMiwgMHg2OCwgMHg1OSwKKwkweDQwLCAweDRiLCAweGFhLCAweDY5LAorCTB4MjAsIDB4NGIsIDB4OTYsIDB4NjksCisJMHhmYywgMHg0MiwgMHg0NCwgMHg3OCwKKwkweDEwLCAweDQwLCAweDQ0LCAweDc4LAorCTB4MDAsIDB4ZTIsIDB4ZmMsIDB4NWQsCisJMHgyMCwgMHg0ZCwgMHg0OCwgMHg3OCwKKwkweDAwLCAweGUyLCAweGZjLCAweDVkLAogCTB4MzAsIDB4M2YsIDB4YzAsIDB4MDksCi0JMHgzMCwgMHhlMCwgMHgzMCwgMHg2MCwKKwkweDMwLCAweGUwLCAweDUwLCAweDYwLAogCTB4N2YsIDB4NGEsIDB4OTQsIDB4MDgsCi0JMHgwMCwgMHhlMiwgMHgzMiwgMHg0MCwKKwkweDAwLCAweGUyLCAweDUyLCAweDQwLAogCTB4YzAsIDB4NGEsIDB4OTQsIDB4MDAsCi0JMHgwMCwgMHhlMiwgMHgzZSwgMHg1OCwKLQkweDAwLCAweGUyLCAweDU2LCAweDU4LAotCTB4MDAsIDB4ZTIsIDB4NjYsIDB4NTgsCisJMHgwMCwgMHhlMiwgMHg1ZSwgMHg1OCwKKwkweDAwLCAweGUyLCAweDc2LCAweDU4LAorCTB4MDAsIDB4ZTIsIDB4ODYsIDB4NTgsCiAJMHgwMCwgMHhlMiwgMHgwNiwgMHg0MCwKLQkweDMzLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MzMsIDB4ZWEsIDB4NWUsIDB4NTksCiAJMHgzMywgMHhlYSwgMHgwMCwgMHgwMCwKLQkweDAxLCAweDUyLCAweDY0LCAweDc4LAorCTB4MDEsIDB4NTIsIDB4ODQsIDB4NzgsCiAJMHgwMiwgMHg1OCwgMHg1MCwgMHgzMSwKIAkweGZmLCAweGVhLCAweDEwLCAweDBiLAotCTB4ZmYsIDB4OTcsIDB4NGYsIDB4NzgsCi0JMHg1MCwgMHg0YiwgMHg0YSwgMHg2OCwKKwkweGZmLCAweDk3LCAweDZmLCAweDc4LAorCTB4NTAsIDB4NGIsIDB4NmEsIDB4NjgsCiAJMHhiZiwgMHgzYSwgMHg3NCwgMHgwOCwKLQkweDE0LCAweGVhLCAweDUwLCAweDU5LAorCTB4MTQsIDB4ZWEsIDB4NjQsIDB4NTksCiAJMHgxNCwgMHhlYSwgMHgwNCwgMHgwMCwKIAkweDA4LCAweDkyLCAweDI1LCAweDAzLAotCTB4ZmYsIDB4OTAsIDB4M2YsIDB4NjgsCi0JMHgwMCwgMHhlMiwgMHg1NiwgMHg1YiwKLQkweDAwLCAweGUyLCAweDNlLCAweDQwLAotCTB4MDAsIDB4ZWEsIDB4NDQsIDB4NTksCisJMHhmZiwgMHg5MCwgMHg1ZiwgMHg2OCwKKwkweDAwLCAweGUyLCAweDc2LCAweDViLAorCTB4MDAsIDB4ZTIsIDB4NWUsIDB4NDAsCisJMHgwMCwgMHhlYSwgMHg1ZSwgMHg1OSwKIAkweDAxLCAweGVhLCAweDAwLCAweDMwLAotCTB4ODAsIDB4ZjksIDB4NWUsIDB4NjgsCi0JMHgwMCwgMHhlMiwgMHg0MiwgMHg1OSwKLQkweDExLCAweGVhLCAweDQ0LCAweDU5LAorCTB4ODAsIDB4ZjksIDB4N2UsIDB4NjgsCisJMHgwMCwgMHhlMiwgMHg1YywgMHg1OSwKKwkweDExLCAweGVhLCAweDVlLCAweDU5LAogCTB4MTEsIDB4ZWEsIDB4MDAsIDB4MDAsCi0JMHg4MCwgMHhmOSwgMHg0MiwgMHg3OSwKKwkweDgwLCAweGY5LCAweDVjLCAweDc5LAogCTB4ZmYsIDB4ZWEsIDB4ZDQsIDB4MGQsCi0JMHgyMiwgMHhlYSwgMHg0NCwgMHg1OSwKKwkweDIyLCAweGVhLCAweDVlLCAweDU5LAogCTB4MjIsIDB4ZWEsIDB4MDAsIDB4MDAsCi0JMHgxMCwgMHgxNiwgMHg3MCwgMHg3OCwKLQkweDAxLCAweDBiLCAweGEyLCAweDMyLAorCTB4MTAsIDB4MTYsIDB4OTAsIDB4NzgsCiAJMHgxMCwgMHgxNiwgMHgyYywgMHgwMCwKLQkweDE4LCAweGFkLCAweDAwLCAweDc5LAotCTB4MDQsIDB4YWQsIDB4Y2EsIDB4NjgsCi0JMHg4MCwgMHhhZCwgMHg2NCwgMHg3OCwKLQkweDEwLCAweGFkLCAweDk4LCAweDc4LAotCTB4ZmYsIDB4ODgsIDB4ODMsIDB4NjgsCisJMHgwMSwgMHgwYiwgMHhhZSwgMHgzMiwKKwkweDE4LCAweGFkLCAweDEyLCAweDc5LAorCTB4MDQsIDB4YWQsIDB4ZGMsIDB4NjgsCisJMHg4MCwgMHhhZCwgMHg4NCwgMHg3OCwKKwkweDEwLCAweGFkLCAweGFhLCAweDc4LAogCTB4ZTcsIDB4YWQsIDB4NWEsIDB4MDksCiAJMHgwMiwgMHg4YywgMHg1OSwgMHgzMiwKKwkweGZmLCAweDhkLCAweGExLCAweDYwLAorCTB4ZmYsIDB4ZWEsIDB4NWUsIDB4MDIsCisJMHhmZiwgMHg4OCwgMHhhNywgMHg3OCwKKwkweDAyLCAweDMwLCAweDE5LCAweDMzLAorCTB4MDIsIDB4YTgsIDB4NjAsIDB4MzYsCiAJMHgwMiwgMHgyOCwgMHgxOSwgMHgzMywKIAkweDAyLCAweGE4LCAweDUwLCAweDM2LAotCTB4MzMsIDB4ZWEsIDB4NDQsIDB4NTksCi0JMHgzMywgMHhlYSwgMHgwMCwgMHgwMCwKLQkweDQwLCAweDNhLCAweDY0LCAweDY4LAotCTB4NTAsIDB4NGIsIDB4NjQsIDB4NjgsCi0JMHgyMiwgMHhlYSwgMHg0NCwgMHg1OSwKLQkweDIyLCAweGVhLCAweDAwLCAweDAwLAogCTB4ZTcsIDB4YWQsIDB4NWEsIDB4MDksCi0JMHgwMiwgMHg4YywgMHg1OSwgMHgzMiwKLQkweDFhLCAweGVhLCAweDUwLCAweDU5LAotCTB4MWEsIDB4ZWEsIDB4MDQsIDB4MDAsCi0JMHhmZiwgMHhlYSwgMHhkNCwgMHgwZCwKLQkweGU3LCAweGFkLCAweDVhLCAweDA5LAotCTB4MDAsIDB4ZTIsIDB4YTYsIDB4NTgsCisJMHgwMCwgMHhlMiwgMHhiOCwgMHg1OCwKIAkweGZmLCAweGVhLCAweDU2LCAweDAyLAotCTB4MDQsIDB4N2MsIDB4NzgsIDB4MzIsCi0JMHgyMCwgMHgxNiwgMHg2NCwgMHg3OCwKLQkweDA0LCAweDM4LCAweDc5LCAweDMyLAotCTB4ODAsIDB4MzcsIDB4NmYsIDB4MTYsCi0JMHhmZiwgMHgyZCwgMHhiNSwgMHg2MCwKLQkweGZmLCAweDI5LCAweGI1LCAweDYwLAotCTB4NDAsIDB4NTEsIDB4YzUsIDB4NzgsCi0JMHhmZiwgMHg0ZiwgMHhiNSwgMHg2OCwKLQkweGZmLCAweDRkLCAweGMxLCAweDE5LAotCTB4MDAsIDB4NGUsIDB4ZDUsIDB4MTksCi0JMHgwMCwgMHhlMiwgMHhjNCwgMHg1MCwKLQkweDAxLCAweDRjLCAweGMxLCAweDMxLAotCTB4MDAsIDB4NTAsIDB4ZDUsIDB4MTksCi0JMHgwMCwgMHhlMiwgMHhjNCwgMHg0OCwKLQkweDgwLCAweDE4LCAweDY0LCAweDc4LAotCTB4MDIsIDB4NGEsIDB4MWQsIDB4MzAsCisJMHgwNCwgMHg3YywgMHg4OCwgMHgzMiwKKwkweDIwLCAweDE2LCAweDg0LCAweDc4LAorCTB4MDQsIDB4NDAsIDB4ODksIDB4MzIsCisJMHg4MCwgMHgzZCwgMHg3YiwgMHgxNiwKKwkweGZmLCAweDJkLCAweGM3LCAweDYwLAorCTB4ZmYsIDB4MjksIDB4YzcsIDB4NjAsCisJMHg0MCwgMHg1NywgMHhkNywgMHg3OCwKKwkweGZmLCAweDU1LCAweGM3LCAweDY4LAorCTB4ZmYsIDB4NTMsIDB4YzEsIDB4MTksCisJMHgwMCwgMHg1NCwgMHhkNSwgMHgxOSwKKwkweDAwLCAweGUyLCAweGQ2LCAweDUwLAorCTB4MDEsIDB4NTIsIDB4YzEsIDB4MzEsCisJMHgwMCwgMHg1NiwgMHhkNSwgMHgxOSwKKwkweDAwLCAweGUyLCAweGQ2LCAweDQ4LAorCTB4ODAsIDB4MTgsIDB4ODQsIDB4NzgsCisJMHgwMiwgMHg1MCwgMHgxZCwgMHgzMCwKIAkweDEwLCAweGVhLCAweDE4LCAweDAwLAogCTB4NjAsIDB4MTgsIDB4MzAsIDB4MDAsCiAJMHg3ZiwgMHgxOCwgMHgzMCwgMHgwYywKIAkweDAyLCAweGVhLCAweDAyLCAweDAwLAotCTB4ZmYsIDB4ZWEsIDB4YTAsIDB4MGEsCisJMHhmZiwgMHhlYSwgMHhhYywgMHgwYSwKIAkweDgwLCAweDE4LCAweDMwLCAweDA0LAotCTB4NDAsIDB4YWQsIDB4NjQsIDB4NzgsCisJMHg0MCwgMHhhZCwgMHg4NCwgMHg3OCwKIAkweGU3LCAweGFkLCAweDVhLCAweDA5LAogCTB4MDIsIDB4YTgsIDB4NDAsIDB4MzEsCiAJMHhmZiwgMHhlYSwgMHhjMCwgMHgwOSwKLQkweDAxLCAweDRlLCAweDlkLCAweDFhLAotCTB4MDAsIDB4NGYsIDB4OWYsIDB4MjIsCisJMHgwMSwgMHg1NCwgMHhhOSwgMHgxYSwKKwkweDAwLCAweDU1LCAweGFiLCAweDIyLAogCTB4MDEsIDB4OTQsIDB4NmQsIDB4MzMsCi0JMHgwMSwgMHhlYSwgMHgyMCwgMHgzMywKKwkweGZmLCAweGVhLCAweDIwLCAweDBiLAogCTB4MDQsIDB4YWMsIDB4NDksIDB4MzIsCiAJMHhmZiwgMHhlYSwgMHg1YSwgMHgwMywKIAkweGZmLCAweGVhLCAweDVlLCAweDAzLAogCTB4MDEsIDB4MTAsIDB4ZDQsIDB4MzEsCi0JMHgxMCwgMHg5MiwgMHhmNSwgMHg2OCwKKwkweDEwLCAweDkyLCAweDA3LCAweDY5LAogCTB4M2QsIDB4OTMsIDB4YzUsIDB4MjksCiAJMHhmZSwgMHhlMiwgMHhjNCwgMHgwOSwKIAkweDAxLCAweGVhLCAweGM2LCAweDAxLAogCTB4MDIsIDB4ZTIsIDB4YzgsIDB4MzEsCiAJMHgwMiwgMHhlYywgMHg1MCwgMHgzMSwKIAkweDAyLCAweGEwLCAweGRhLCAweDMxLAotCTB4ZmYsIDB4YTksIDB4ZjQsIDB4NzAsCisJMHhmZiwgMHhhOSwgMHgwNiwgMHg3MSwKIAkweDAyLCAweGEwLCAweDU4LCAweDM3LAotCTB4ZmYsIDB4MjEsIDB4ZmQsIDB4NzAsCisJMHhmZiwgMHgyMSwgMHgwZiwgMHg3MSwKIAkweDAyLCAweDIyLCAweDUxLCAweDMxLAogCTB4MDIsIDB4YTAsIDB4NWMsIDB4MzMsCiAJMHgwMiwgMHhhMCwgMHg0NCwgMHgzNiwKIAkweDAyLCAweGEwLCAweDQwLCAweDMyLAogCTB4MDIsIDB4YTAsIDB4NDQsIDB4MzYsCi0JMHgwNCwgMHg0NywgMHgwNSwgMHg2OSwKLQkweDQwLCAweDE2LCAweDMwLCAweDY5LAotCTB4ZmYsIDB4MmQsIDB4MzUsIDB4NjEsCi0JMHhmZiwgMHgyOSwgMHg2NSwgMHg3MCwKLQkweDAxLCAweDM3LCAweGMxLCAweDMxLAorCTB4MDQsIDB4NGQsIDB4MTcsIDB4NjksCisJMHg0MCwgMHgxNiwgMHg0OCwgMHg2OSwKKwkweGZmLCAweDJkLCAweDRkLCAweDYxLAorCTB4ZmYsIDB4MjksIDB4ODUsIDB4NzAsCiAJMHgwMiwgMHgyOCwgMHg1NSwgMHgzMiwKIAkweDAxLCAweGVhLCAweDVhLCAweDAxLAotCTB4MDQsIDB4M2MsIDB4ZjksIDB4MzAsCisJMHgwNCwgMHg0NCwgMHhmOSwgMHgzMCwKKwkweDAxLCAweDQ0LCAweGMxLCAweDMxLAogCTB4MDIsIDB4MjgsIDB4NTEsIDB4MzEsCi0JMHgwMSwgMHhhOCwgMHg2MCwgMHgzMSwKLQkweDAwLCAweGE5LCAweDYwLCAweDAxLAorCTB4MDIsIDB4YTgsIDB4NjAsIDB4MzEsCisJMHgwMSwgMHhhNCwgMHg2MSwgMHgzMSwKKwkweDAxLCAweDNkLCAweDYxLCAweDMxLAogCTB4MDEsIDB4MTQsIDB4ZDQsIDB4MzEsCi0JMHgwMSwgMHg1MCwgMHhhMSwgMHgxYSwKLQkweGZmLCAweDRlLCAweDlkLCAweDFhLAotCTB4ZmYsIDB4NGYsIDB4OWYsIDB4MjIsCi0JMHhmZiwgMHg4ZCwgMHgyOSwgMHg3MSwKLQkweDgwLCAweGFjLCAweDI4LCAweDcxLAotCTB4MjAsIDB4MTYsIDB4MjgsIDB4NjksCisJMHgwMSwgMHg1NiwgMHhhZCwgMHgxYSwKKwkweGZmLCAweDU0LCAweGE5LCAweDFhLAorCTB4ZmYsIDB4NTUsIDB4YWIsIDB4MjIsCisJMHhmZiwgMHg4ZCwgMHg0MSwgMHg3MSwKKwkweDgwLCAweGFjLCAweDQwLCAweDcxLAorCTB4MjAsIDB4MTYsIDB4NDAsIDB4NjksCisJMHgwMCwgMHhhYywgMHhjNCwgMHgxOSwKKwkweDA3LCAweGUyLCAweDQwLCAweGY5LAogCTB4MDIsIDB4OGMsIDB4NTEsIDB4MzEsCi0JMHgwMCwgMHhlMiwgMHgxMiwgMHg0MSwKKwkweDAwLCAweGUyLCAweDI0LCAweDQxLAogCTB4MDEsIDB4YWMsIDB4MDgsIDB4MzEsCiAJMHgwOSwgMHhlYSwgMHg1YSwgMHgwMSwKIAkweDAyLCAweDhjLCAweDUxLCAweDMyLAogCTB4ZmYsIDB4ZWEsIDB4MWEsIDB4MDcsCiAJMHgwNCwgMHgyNCwgMHhmOSwgMHgzMCwKLQkweDFkLCAweGVhLCAweDNhLCAweDQxLAorCTB4MWQsIDB4ZWEsIDB4NTIsIDB4NDEsCiAJMHgwMiwgMHgyYywgMHg1MSwgMHgzMSwKIAkweDA0LCAweGE4LCAweGY5LCAweDMwLAotCTB4MTksIDB4ZWEsIDB4M2EsIDB4NDEsCisJMHgxOSwgMHhlYSwgMHg1MiwgMHg0MSwKIAkweDA2LCAweGVhLCAweDA4LCAweDgxLAogCTB4MDEsIDB4ZTIsIDB4NWEsIDB4MzUsCi0JMHgwMiwgMHhmMiwgMHhmMCwgMHgzNSwKKwkweDAyLCAweGYyLCAweGYwLCAweDMxLAorCTB4ZmYsIDB4ZWEsIDB4ZDQsIDB4MGQsCiAJMHgwMiwgMHhmMiwgMHhmMCwgMHgzMSwKIAkweDAyLCAweGY4LCAweGU0LCAweDM1LAogCTB4ODAsIDB4ZWEsIDB4YjIsIDB4MDEsCiAJMHgwMSwgMHhlMiwgMHgwMCwgMHgzMCwKIAkweGZmLCAweGVhLCAweGIyLCAweDBkLAotCTB4ODAsIDB4ZWEsIDB4YjIsIDB4MDEsCi0JMHgxMSwgMHgwMCwgMHgwMCwgMHgxMCwKLQkweGZmLCAweGVhLCAweGIyLCAweDBkLAogCTB4MDEsIDB4ZTIsIDB4MDQsIDB4MzAsCiAJMHgwMSwgMHhlYSwgMHgwNCwgMHgzNCwKIAkweDAyLCAweDIwLCAweGJkLCAweDMwLAogCTB4MDIsIDB4MjAsIDB4YjksIDB4MzAsCiAJMHgwMiwgMHgyMCwgMHg1MSwgMHgzMSwKIAkweDRjLCAweDkzLCAweGQ3LCAweDI4LAotCTB4MTAsIDB4OTIsIDB4NjMsIDB4NzksCisJMHgxMCwgMHg5MiwgMHg3NywgMHg3OSwKIAkweDAxLCAweDZiLCAweGMwLCAweDMwLAogCTB4MDIsIDB4NjQsIDB4YzgsIDB4MDAsCiAJMHg0MCwgMHgzYSwgMHg3NCwgMHgwNCwKLQkweDAwLCAweGUyLCAweDU2LCAweDU4LAotCTB4MzMsIDB4ZWEsIDB4NDQsIDB4NTksCisJMHgwMCwgMHhlMiwgMHg3NiwgMHg1OCwKKwkweDMzLCAweGVhLCAweDVlLCAweDU5LAogCTB4MzMsIDB4ZWEsIDB4MDAsIDB4MDAsCiAJMHgzMCwgMHgzZiwgMHhjMCwgMHgwOSwKLQkweDMwLCAweGUwLCAweDY0LCAweDYxLAotCTB4MjAsIDB4M2YsIDB4N2EsIDB4NjksCi0JMHgxMCwgMHgzZiwgMHg2NCwgMHg3OSwKKwkweDMwLCAweGUwLCAweDc4LCAweDYxLAorCTB4MjAsIDB4M2YsIDB4OGUsIDB4NjksCisJMHgxMCwgMHgzZiwgMHg3OCwgMHg3OSwKIAkweDAyLCAweGVhLCAweDdlLCAweDAwLAotCTB4MDAsIDB4ZWEsIDB4NDQsIDB4NTksCisJMHgwMCwgMHhlYSwgMHg1ZSwgMHg1OSwKIAkweDAxLCAweGVhLCAweDAwLCAweDMwLAotCTB4MDIsIDB4NDgsIDB4NTEsIDB4MzUsCisJMHgwMiwgMHg0ZSwgMHg1MSwgMHgzNSwKIAkweDAxLCAweGVhLCAweDdlLCAweDAwLAotCTB4MTEsIDB4ZWEsIDB4NDQsIDB4NTksCisJMHgxMSwgMHhlYSwgMHg1ZSwgMHg1OSwKIAkweDExLCAweGVhLCAweDAwLCAweDAwLAotCTB4MDIsIDB4NDgsIDB4NTEsIDB4MzUsCisJMHgwMiwgMHg0ZSwgMHg1MSwgMHgzNSwKKwkweGMwLCAweDRhLCAweDk0LCAweDAwLAorCTB4MDQsIDB4NDEsIDB4OWMsIDB4NzksCiAJMHgwOCwgMHhlYSwgMHg5OCwgMHgwMCwKIAkweDA4LCAweDU3LCAweGFlLCAweDAwLAogCTB4MDgsIDB4M2MsIDB4NzgsIDB4MDAsCi0JMHhmMCwgMHg0OSwgMHg2OCwgMHgwYSwKKwkweGYwLCAweDQ5LCAweDc0LCAweDBhLAogCTB4MGYsIDB4NjcsIDB4YzAsIDB4MDksCi0JMHgwMCwgMHgzNCwgMHg2OSwgMHgwMiwKKwkweDAwLCAweDNhLCAweDc1LCAweDAyLAogCTB4MjAsIDB4ZWEsIDB4OTYsIDB4MDAsCi0JMHgwMCwgMHhlMiwgMHhmOCwgMHg0MSwKLQkweDQwLCAweDNhLCAweGFlLCAweDY5LAorCTB4MDAsIDB4ZTIsIDB4MTQsIDB4NDIsCisJMHhjMCwgMHg0YSwgMHg5NCwgMHgwMCwKKwkweDQwLCAweDNhLCAweGM4LCAweDY5LAogCTB4MDIsIDB4NTUsIDB4MDYsIDB4NjgsCi0JMHgwMiwgMHg1NiwgMHhhZSwgMHg2OSwKLQkweGZmLCAweDViLCAweGFlLCAweDYxLAorCTB4MDIsIDB4NTYsIDB4YzgsIDB4NjksCisJMHhmZiwgMHg1YiwgMHhjOCwgMHg2MSwKIAkweDAyLCAweDIwLCAweDUxLCAweDMxLAogCTB4ODAsIDB4ZWEsIDB4YjIsIDB4MDEsCiAJMHg0NCwgMHhlYSwgMHgwMCwgMHgwMCwKQEAgLTIxOCwyMzcgKzIzMSwyNDYgQEAKIAkweDMzLCAweGVhLCAweDAwLCAweDAwLAogCTB4ZmYsIDB4ZWEsIDB4YjIsIDB4MDksCiAJMHhmZiwgMHhlMCwgMHhjMCwgMHgxOSwKLQkweGZmLCAweGUwLCAweGIwLCAweDc5LAorCTB4ZmYsIDB4ZTAsIDB4Y2EsIDB4NzksCiAJMHgwMiwgMHhhYywgMHg1MSwgMHgzMSwKLQkweDAwLCAweGUyLCAweGE2LCAweDQxLAorCTB4MDAsIDB4ZTIsIDB4YzAsIDB4NDEsCiAJMHgwMiwgMHg1ZSwgMHg1MCwgMHgzMSwKIAkweDAyLCAweGE4LCAweGI4LCAweDMwLAogCTB4MDIsIDB4NWMsIDB4NTAsIDB4MzEsCi0JMHhmZiwgMHhhZCwgMHhjMSwgMHg3MSwKKwkweGZmLCAweGFkLCAweGRiLCAweDcxLAogCTB4MDIsIDB4YWMsIDB4NDEsIDB4MzEsCiAJMHgwMiwgMHgyMiwgMHg1MSwgMHgzMSwKIAkweDAyLCAweGEwLCAweDVjLCAweDMzLAogCTB4MDIsIDB4YTAsIDB4NDQsIDB4MzIsCi0JMHgwMCwgMHhlMiwgMHhjYSwgMHg0MSwKLQkweDEwLCAweDkyLCAweGNiLCAweDY5LAorCTB4MDAsIDB4ZTIsIDB4ZTQsIDB4NDEsCisJMHgxMCwgMHg5MiwgMHhlNSwgMHg2OSwKIAkweDNkLCAweDkzLCAweGM5LCAweDI5LAogCTB4MDEsIDB4ZTQsIDB4YzgsIDB4MDEsCiAJMHgwMSwgMHhlYSwgMHhjYSwgMHgwMSwKIAkweGZmLCAweGVhLCAweGRhLCAweDAxLAogCTB4MDIsIDB4MjAsIDB4NTEsIDB4MzEsCiAJMHgwMiwgMHhhZSwgMHg0MSwgMHgzMiwKLQkweGZmLCAweDIxLCAweGQzLCAweDYxLAorCTB4ZmYsIDB4MjEsIDB4ZWQsIDB4NjEsCiAJMHhmZiwgMHhlYSwgMHg0NiwgMHgwMiwKIAkweDAyLCAweDVjLCAweDUwLCAweDMxLAogCTB4NDAsIDB4ZWEsIDB4OTYsIDB4MDAsCi0JMHgwMiwgMHg1NiwgMHhjYywgMHg2ZCwKLQkweDAxLCAweDU1LCAweGNjLCAweDZkLAotCTB4MTAsIDB4OTIsIDB4ZGYsIDB4NzksCi0JMHgxMCwgMHg0MCwgMHhlOCwgMHg2OSwKLQkweDAxLCAweDU2LCAweGU4LCAweDc5LAorCTB4MDIsIDB4NTYsIDB4MDQsIDB4NmUsCisJMHgwMSwgMHg1NSwgMHgwNCwgMHg2ZSwKKwkweDEwLCAweDkyLCAweGY5LCAweDc5LAorCTB4MTAsIDB4NDAsIDB4MDIsIDB4NmEsCisJMHgwMSwgMHg1NiwgMHgwMiwgMHg3YSwKIAkweGZmLCAweDk3LCAweDA3LCAweDc4LAotCTB4MTMsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgxMywgMHhlYSwgMHg2NCwgMHg1OSwKIAkweDEzLCAweGVhLCAweDA0LCAweDAwLAogCTB4MDAsIDB4ZTIsIDB4MDYsIDB4NDAsCiAJMHhiZiwgMHgzYSwgMHg3NCwgMHgwOCwKKwkweDA0LCAweDQxLCAweDA4LCAweDdhLAogCTB4MDgsIDB4ZWEsIDB4OTgsIDB4MDAsCiAJMHgwOCwgMHg1NywgMHhhZSwgMHgwMCwKLQkweDAxLCAweDkzLCAweDY5LCAweDMyLAotCTB4MDEsIDB4OTQsIDB4NmIsIDB4MzIsCi0JMHg0MCwgMHhlYSwgMHg2NiwgMHgwMiwKKwkweDAxLCAweDkzLCAweDc1LCAweDMyLAorCTB4MDEsIDB4OTQsIDB4NzcsIDB4MzIsCisJMHg0MCwgMHhlYSwgMHg3MiwgMHgwMiwKIAkweDA4LCAweDNjLCAweDc4LCAweDAwLAotCTB4ODAsIDB4ZWEsIDB4NjIsIDB4MDIsCi0JMHgwMCwgMHhlMiwgMHhiOCwgMHg1YiwKLQkweDAxLCAweDM2LCAweGMxLCAweDMxLAotCTB4OWYsIDB4ZTAsIDB4NGMsIDB4N2MsCi0JMHg4MCwgMHhlMCwgMHgwYywgMHg3MiwKLQkweGEwLCAweGUwLCAweDQ0LCAweDcyLAotCTB4YzAsIDB4ZTAsIDB4M2EsIDB4NzIsCi0JMHhlMCwgMHhlMCwgMHg3NCwgMHg3MiwKLQkweDAxLCAweGVhLCAweDUwLCAweDU5LAorCTB4ODAsIDB4ZWEsIDB4NmUsIDB4MDIsCisJMHgwMCwgMHhlMiwgMHhlMiwgMHg1YiwKKwkweDAxLCAweDNjLCAweGMxLCAweDMxLAorCTB4OWYsIDB4ZTAsIDB4ODQsIDB4N2MsCisJMHg4MCwgMHhlMCwgMHgyOCwgMHg3MiwKKwkweGEwLCAweGUwLCAweDY0LCAweDcyLAorCTB4YzAsIDB4ZTAsIDB4NWEsIDB4NzIsCisJMHhlMCwgMHhlMCwgMHg5NCwgMHg3MiwKKwkweDAxLCAweGVhLCAweDY0LCAweDU5LAogCTB4MDEsIDB4ZWEsIDB4MDQsIDB4MDAsCi0JMHgwMCwgMHhlMiwgMHhmOCwgMHg0MSwKLQkweDgwLCAweDMzLCAweDEzLCAweDdhLAotCTB4MDMsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgwMCwgMHhlMiwgMHgxNCwgMHg0MiwKKwkweDgwLCAweDM5LCAweDJmLCAweDdhLAorCTB4MDMsIDB4ZWEsIDB4NjQsIDB4NTksCiAJMHgwMywgMHhlYSwgMHgwNCwgMHgwMCwKLQkweGVlLCAweDAwLCAweDFhLCAweDZhLAorCTB4ZWUsIDB4MDAsIDB4MzYsIDB4NmEsCiAJMHgwNSwgMHhlYSwgMHhiNCwgMHgwMCwKLQkweDMzLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MzMsIDB4ZWEsIDB4NWUsIDB4NTksCiAJMHgzMywgMHhlYSwgMHgwMCwgMHgwMCwKLQkweDAyLCAweGE4LCAweDkwLCAweDMyLAotCTB4MDAsIDB4ZTIsIDB4NmEsIDB4NTksCisJMHgwMiwgMHhhOCwgMHg5YywgMHgzMiwKKwkweDAwLCAweGUyLCAweDdlLCAweDU5LAogCTB4ZWYsIDB4OTYsIDB4ZDUsIDB4MTksCi0JMHgwMCwgMHhlMiwgMHgyYSwgMHg1MiwKKwkweDAwLCAweGUyLCAweDQ2LCAweDUyLAogCTB4MDksIDB4ODAsIDB4ZTEsIDB4MzAsCiAJMHgwMiwgMHhlYSwgMHgzNiwgMHgwMCwKIAkweGE4LCAweGVhLCAweDMyLCAweDAwLAotCTB4MDAsIDB4ZTIsIDB4MzAsIDB4NDIsCisJMHgwMCwgMHhlMiwgMHg0YywgMHg0MiwKIAkweDAxLCAweDk2LCAweGQxLCAweDMwLAogCTB4MTAsIDB4ODAsIDB4ODksIDB4MzEsCiAJMHgyMCwgMHhlYSwgMHgzMiwgMHgwMCwKLQkweGJmLCAweDMzLCAweDY3LCAweDBhLAotCTB4MjAsIDB4MTksIDB4MzIsIDB4NmEsCi0JMHgwMiwgMHg0ZCwgMHhmOCwgMHg2OSwKLQkweDQwLCAweDMzLCAweDY3LCAweDAyLAotCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCi0JMHg4MCwgMHgzMywgMHhiNSwgMHg2YSwKKwkweGJmLCAweDM5LCAweDczLCAweDBhLAorCTB4MTAsIDB4NGMsIDB4NTYsIDB4NmEsCisJMHgyMCwgMHgxOSwgMHg0ZSwgMHg2YSwKKwkweDIwLCAweDE5LCAweDUyLCAweDZhLAorCTB4MDIsIDB4NGQsIDB4MTQsIDB4NmEsCisJMHg0MCwgMHgzOSwgMHg3MywgMHgwMiwKKwkweDAwLCAweGUyLCAweDE0LCAweDQyLAorCTB4ODAsIDB4MzksIDB4ZDUsIDB4NmEsCiAJMHgwMSwgMHg0NCwgMHgxMCwgMHgzMywKIAkweDA4LCAweDkyLCAweDI1LCAweDAzLAotCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCisJMHgwMCwgMHhlMiwgMHgxNCwgMHg0MiwKIAkweDEwLCAweGVhLCAweDgwLCAweDAwLAotCTB4MDEsIDB4MzEsIDB4YzUsIDB4MzEsCi0JMHg4MCwgMHhlMiwgMHg2MCwgMHg2MiwKLQkweDEwLCAweDkyLCAweDg1LCAweDZhLAorCTB4MDEsIDB4MzcsIDB4YzUsIDB4MzEsCisJMHg4MCwgMHhlMiwgMHg4MCwgMHg2MiwKKwkweDEwLCAweDkyLCAweGE1LCAweDZhLAogCTB4YzAsIDB4OTQsIDB4YzUsIDB4MDEsCi0JMHg0MCwgMHg5MiwgMHg1MSwgMHg2YSwKKwkweDQwLCAweDkyLCAweDcxLCAweDZhLAogCTB4YmYsIDB4ZTIsIDB4YzQsIDB4MDksCi0JMHgyMCwgMHg5MiwgMHg2NSwgMHg3YSwKKwkweDIwLCAweDkyLCAweDg1LCAweDdhLAogCTB4MDEsIDB4ZTIsIDB4ODgsIDB4MzAsCi0JMHgwMCwgMHhlMiwgMHhiOCwgMHg1YiwKLQkweGEwLCAweDM2LCAweDZkLCAweDYyLAorCTB4MDAsIDB4ZTIsIDB4ZTIsIDB4NWIsCisJMHhhMCwgMHgzYywgMHg4ZCwgMHg2MiwKIAkweDIzLCAweDkyLCAweDg5LCAweDA4LAotCTB4MDAsIDB4ZTIsIDB4YjgsIDB4NWIsCi0JMHhhMCwgMHgzNiwgMHg2ZCwgMHg2MiwKLQkweDAwLCAweGE4LCAweDY0LCAweDQyLAotCTB4ZmYsIDB4ZTIsIDB4NjQsIDB4NjIsCi0JMHgwMCwgMHhlMiwgMHg4NCwgMHg0MiwKKwkweDAwLCAweGUyLCAweGUyLCAweDViLAorCTB4YTAsIDB4M2MsIDB4OGQsIDB4NjIsCisJMHgwMCwgMHhhOCwgMHg4NCwgMHg0MiwKKwkweGZmLCAweGUyLCAweDg0LCAweDYyLAorCTB4MDAsIDB4ZTIsIDB4YTQsIDB4NDIsCiAJMHg0MCwgMHhlYSwgMHg5OCwgMHgwMCwKIAkweDAxLCAweGUyLCAweDg4LCAweDMwLAotCTB4MDAsIDB4ZTIsIDB4YjgsIDB4NWIsCi0JMHhhMCwgMHgzNiwgMHg0MywgMHg3MiwKKwkweDAwLCAweGUyLCAweGUyLCAweDViLAorCTB4YTAsIDB4M2MsIDB4NjMsIDB4NzIsCiAJMHg0MCwgMHhlYSwgMHg5OCwgMHgwMCwKLQkweDAxLCAweDMxLCAweDg5LCAweDMyLAotCTB4MDgsIDB4ZWEsIDB4NjIsIDB4MDIsCi0JMHgwMCwgMHhlMiwgMHhmOCwgMHg0MSwKLQkweGUwLCAweGVhLCAweGQ0LCAweDViLAotCTB4ODAsIDB4ZTAsIDB4YzAsIDB4NmEsCi0JMHgwNCwgMHhlMCwgMHg2NiwgMHg3MywKLQkweDAyLCAweGUwLCAweDk2LCAweDczLAotCTB4MDAsIDB4ZWEsIDB4MWUsIDB4NzMsCi0JMHgwMywgMHhlMCwgMHhhNiwgMHg3MywKLQkweDIzLCAweGUwLCAweDk2LCAweDcyLAotCTB4MDgsIDB4ZTAsIDB4YmMsIDB4NzIsCi0JMHgwMCwgMHhlMiwgMHhiOCwgMHg1YiwKLQkweDA3LCAweGVhLCAweDUwLCAweDU5LAorCTB4MDEsIDB4MzcsIDB4OTUsIDB4MzIsCisJMHgwOCwgMHhlYSwgMHg2ZSwgMHgwMiwKKwkweDAwLCAweGUyLCAweDE0LCAweDQyLAorCTB4ZTAsIDB4ZWEsIDB4ZmUsIDB4NWIsCisJMHg4MCwgMHhlMCwgMHhlMCwgMHg2YSwKKwkweDA0LCAweGUwLCAweDkyLCAweDczLAorCTB4MDIsIDB4ZTAsIDB4YzQsIDB4NzMsCisJMHgwMCwgMHhlYSwgMHgzZSwgMHg3MywKKwkweDAzLCAweGUwLCAweGQ0LCAweDczLAorCTB4MjMsIDB4ZTAsIDB4YjYsIDB4NzIsCisJMHgwOCwgMHhlMCwgMHhkYywgMHg3MiwKKwkweDAwLCAweGUyLCAweGUyLCAweDViLAorCTB4MDcsIDB4ZWEsIDB4NjQsIDB4NTksCiAJMHgwNywgMHhlYSwgMHgwNCwgMHgwMCwKLQkweDA4LCAweDQyLCAweGY5LCAweDcxLAotCTB4MDQsIDB4NDIsIDB4OTMsIDB4NjIsCi0JMHgwMSwgMHg0MywgMHg4OSwgMHgzMCwKLQkweDAwLCAweGUyLCAweDg0LCAweDQyLAorCTB4MDgsIDB4NDgsIDB4MTUsIDB4NzIsCisJMHgwNCwgMHg0OCwgMHhiMywgMHg2MiwKKwkweDAxLCAweDQ5LCAweDg5LCAweDMwLAorCTB4MDAsIDB4ZTIsIDB4YTQsIDB4NDIsCiAJMHgwMSwgMHg0NCwgMHhkNCwgMHgzMSwKLQkweDAwLCAweGUyLCAweDg0LCAweDQyLAotCTB4MDEsIDB4MDAsIDB4NjAsIDB4MzIsCi0JMHgzMywgMHhlYSwgMHg0NCwgMHg1OSwKKwkweDAwLCAweGUyLCAweGE0LCAweDQyLAorCTB4MDEsIDB4MDAsIDB4NmMsIDB4MzIsCisJMHgzMywgMHhlYSwgMHg1ZSwgMHg1OSwKIAkweDMzLCAweGVhLCAweDAwLCAweDAwLAotCTB4NGMsIDB4MzQsIDB4YzEsIDB4MjgsCisJMHg0YywgMHgzYSwgMHhjMSwgMHgyOCwKIAkweDAxLCAweDY0LCAweGMwLCAweDMxLAotCTB4MDAsIDB4MzAsIDB4NDUsIDB4NTksCi0JMHgwMSwgMHgzMCwgMHgwMSwgMHgzMCwKLQkweDAxLCAweGUwLCAweGJhLCAweDdhLAotCTB4YTAsIDB4ZWEsIDB4Y2EsIDB4NWIsCi0JMHgwMSwgMHhhMCwgMHhiYSwgMHg2MiwKLQkweDAxLCAweDg0LCAweGFmLCAweDdhLAotCTB4MDEsIDB4OTUsIDB4YmQsIDB4NmEsCi0JMHgwNSwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDAwLCAweDM2LCAweDVmLCAweDU5LAorCTB4MDEsIDB4MzYsIDB4MDEsIDB4MzAsCisJMHgwMSwgMHhlMCwgMHhkYSwgMHg3YSwKKwkweGEwLCAweGVhLCAweGY0LCAweDViLAorCTB4MDEsIDB4YTAsIDB4ZGEsIDB4NjIsCisJMHgwMSwgMHg4NCwgMHhjZiwgMHg3YSwKKwkweDAxLCAweDk1LCAweGRkLCAweDZhLAorCTB4MDUsIDB4ZWEsIDB4NjQsIDB4NTksCiAJMHgwNSwgMHhlYSwgMHgwNCwgMHgwMCwKLQkweDAwLCAweGUyLCAweGJjLCAweDQyLAotCTB4MDMsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgwMCwgMHhlMiwgMHhkYywgMHg0MiwKKwkweDAzLCAweGVhLCAweDY0LCAweDU5LAogCTB4MDMsIDB4ZWEsIDB4MDQsIDB4MDAsCi0JMHgwMCwgMHhlMiwgMHhiYywgMHg0MiwKLQkweDA3LCAweGVhLCAweGRjLCAweDViLAorCTB4MDAsIDB4ZTIsIDB4ZGMsIDB4NDIsCisJMHgwNywgMHhlYSwgMHgwNiwgMHg1YywKIAkweDAxLCAweDQ0LCAweGQ0LCAweDMxLAotCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCi0JMHgzZiwgMHhlMCwgMHg2YSwgMHgwYSwKLQkweGMwLCAweDM0LCAweGMxLCAweDA5LAotCTB4MDAsIDB4MzUsIDB4NTEsIDB4MDEsCisJMHgwMCwgMHhlMiwgMHgxNCwgMHg0MiwKKwkweDNmLCAweGUwLCAweDc2LCAweDBhLAorCTB4YzAsIDB4M2EsIDB4YzEsIDB4MDksCisJMHgwMCwgMHgzYiwgMHg1MSwgMHgwMSwKIAkweGZmLCAweGVhLCAweDUyLCAweDA5LAotCTB4MzAsIDB4MzQsIDB4YzUsIDB4MDksCisJMHgzMCwgMHgzYSwgMHhjNSwgMHgwOSwKIAkweDNkLCAweGUyLCAweGM0LCAweDI5LAogCTB4YjgsIDB4ZTIsIDB4YzQsIDB4MTksCiAJMHgwMSwgMHhlYSwgMHhjNiwgMHgwMSwKIAkweDAyLCAweGUyLCAweGM4LCAweDMxLAogCTB4MDIsIDB4ZWMsIDB4NDAsIDB4MzEsCi0JMHhmZiwgMHhhMSwgMHhkYywgMHg3MiwKKwkweGZmLCAweGExLCAweGZjLCAweDcyLAogCTB4MDIsIDB4ZTgsIDB4ZGEsIDB4MzEsCiAJMHgwMiwgMHhhMCwgMHg1MCwgMHgzMSwKLQkweDAwLCAweGUyLCAweGZlLCAweDQyLAotCTB4ODAsIDB4MzMsIDB4NjcsIDB4MDIsCisJMHgwMCwgMHhlMiwgMHgxZSwgMHg0MywKKwkweDgwLCAweDM5LCAweDczLCAweDAyLAogCTB4MDEsIDB4NDQsIDB4ZDQsIDB4MzEsCi0JMHgwMCwgMHhlMiwgMHhiOCwgMHg1YiwKLQkweDAxLCAweDMzLCAweDY3LCAweDAyLAotCTB4ZTAsIDB4MzYsIDB4MTksIDB4NjMsCi0JMHgwMiwgMHgzMywgMHg2NywgMHgwMiwKLQkweDIwLCAweDQ2LCAweDEyLCAweDYzLAorCTB4MDAsIDB4ZTIsIDB4ZTIsIDB4NWIsCisJMHgwMSwgMHgzOSwgMHg3MywgMHgwMiwKKwkweGUwLCAweDNjLCAweDM5LCAweDYzLAorCTB4MDIsIDB4MzksIDB4NzMsIDB4MDIsCisJMHgyMCwgMHg0NiwgMHgzMiwgMHg2MywKIAkweGZmLCAweGVhLCAweDUyLCAweDA5LAotCTB4YTgsIDB4ZWEsIDB4Y2EsIDB4NWIsCi0JMHgwNCwgMHg5MiwgMHhmOSwgMHg3YSwKLQkweDAxLCAweDM0LCAweGMxLCAweDMxLAotCTB4MDAsIDB4OTMsIDB4ZjksIDB4NjIsCi0JMHgwMSwgMHgzNSwgMHhjMSwgMHgzMSwKLQkweDAwLCAweDk0LCAweDAzLCAweDczLAorCTB4YTgsIDB4ZWEsIDB4ZjQsIDB4NWIsCisJMHgwNCwgMHg5MiwgMHgxOSwgMHg3YiwKKwkweDAxLCAweDNhLCAweGMxLCAweDMxLAorCTB4MDAsIDB4OTMsIDB4MTksIDB4NjMsCisJMHgwMSwgMHgzYiwgMHhjMSwgMHgzMSwKKwkweDAwLCAweDk0LCAweDIzLCAweDczLAogCTB4MDEsIDB4YTksIDB4NTIsIDB4MTEsCi0JMHhmZiwgMHhhOSwgMHhlZSwgMHg2YSwKLQkweDAwLCAweGUyLCAweDEyLCAweDQzLAotCTB4MTAsIDB4MzMsIDB4NjcsIDB4MDIsCi0JMHgwNCwgMHg5MiwgMHgxMywgMHg3YiwKKwkweGZmLCAweGE5LCAweDBlLCAweDZiLAorCTB4MDAsIDB4ZTIsIDB4MzIsIDB4NDMsCisJMHgxMCwgMHgzOSwgMHg3MywgMHgwMiwKKwkweDA0LCAweDkyLCAweDMzLCAweDdiLAogCTB4ZmIsIDB4OTIsIDB4MjUsIDB4MGIsCi0JMHhmZiwgMHhlYSwgMHg2NiwgMHgwYSwKLQkweDAxLCAweGE0LCAweDBkLCAweDZiLAotCTB4MDIsIDB4YTgsIDB4OTAsIDB4MzIsCi0JMHgwMCwgMHhlMiwgMHg2YSwgMHg1OSwKLQkweDEwLCAweDkyLCAweGJkLCAweDdhLAotCTB4ZmYsIDB4ZWEsIDB4ZGMsIDB4NWIsCi0JMHgwMCwgMHhlMiwgMHhiYywgMHg0MiwKLQkweDA0LCAweGVhLCAweDUwLCAweDU5LAorCTB4ZmYsIDB4ZWEsIDB4NzIsIDB4MGEsCisJMHgwMSwgMHhhNCwgMHgyZCwgMHg2YiwKKwkweDAyLCAweGE4LCAweDljLCAweDMyLAorCTB4MDAsIDB4ZTIsIDB4N2UsIDB4NTksCisJMHgxMCwgMHg5MiwgMHhkZCwgMHg3YSwKKwkweGZmLCAweGVhLCAweDA2LCAweDVjLAorCTB4MDAsIDB4ZTIsIDB4ZGMsIDB4NDIsCisJMHgwNCwgMHhlYSwgMHg2NCwgMHg1OSwKIAkweDA0LCAweGVhLCAweDA0LCAweDAwLAotCTB4MDAsIDB4ZTIsIDB4YmMsIDB4NDIsCi0JMHgwNCwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDAwLCAweGUyLCAweGRjLCAweDQyLAorCTB4MDQsIDB4ZWEsIDB4NjQsIDB4NTksCiAJMHgwNCwgMHhlYSwgMHgwNCwgMHgwMCwKLQkweDAwLCAweGUyLCAweGY4LCAweDQxLAotCTB4MDgsIDB4OTIsIDB4YjUsIDB4N2EsCi0JMHhjMCwgMHgzMywgMHgyOSwgMHg3YiwKLQkweDgwLCAweDMzLCAweGI1LCAweDZhLAotCTB4ZmYsIDB4ODgsIDB4MjksIDB4NmIsCi0JMHg0MCwgMHgzMywgMHhiNSwgMHg2YSwKLQkweDEwLCAweDkyLCAweDJmLCAweDdiLAotCTB4MGEsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgwMCwgMHhlMiwgMHgxNCwgMHg0MiwKKwkweDA4LCAweDkyLCAweGQ1LCAweDdhLAorCTB4YzAsIDB4MzksIDB4NDksIDB4N2IsCisJMHg4MCwgMHgzOSwgMHhkNSwgMHg2YSwKKwkweGZmLCAweDg4LCAweDQ5LCAweDZiLAorCTB4NDAsIDB4MzksIDB4ZDUsIDB4NmEsCisJMHgxMCwgMHg5MiwgMHg0ZiwgMHg3YiwKKwkweDBhLCAweGVhLCAweDY0LCAweDU5LAogCTB4MGEsIDB4ZWEsIDB4MDQsIDB4MDAsCi0JMHgwMCwgMHhlMiwgMHg0ZSwgMHg1YiwKLQkweDAwLCAweGUyLCAweDgyLCAweDQzLAotCTB4NTAsIDB4NGIsIDB4MzYsIDB4NmIsCisJMHgwMCwgMHhlMiwgMHg2ZSwgMHg1YiwKKwkweDAwLCAweGUyLCAweGFlLCAweDQzLAorCTB4NTAsIDB4NGIsIDB4NTYsIDB4NmIsCiAJMHhiZiwgMHgzYSwgMHg3NCwgMHgwOCwKIAkweDAxLCAweGUwLCAweGY0LCAweDMxLAogCTB4ZmYsIDB4ZWEsIDB4YzAsIDB4MDksCi0JMHgwMSwgMHgyZSwgMHg1ZCwgMHgxYSwKLQkweDAwLCAweDJmLCAweDVmLCAweDIyLAotCTB4MDQsIDB4NDcsIDB4OGYsIDB4MDIsCisJMHgwMSwgMHgzMiwgMHg2NSwgMHgxYSwKKwkweDAwLCAweDMzLCAweDY3LCAweDIyLAorCTB4MDQsIDB4NGQsIDB4OWIsIDB4MDIsCiAJMHgwMSwgMHhmYSwgMHhjMCwgMHgzNSwKLQkweDAyLCAweGE4LCAweDg0LCAweDMyLAorCTB4MDIsIDB4YTgsIDB4OTAsIDB4MzIsCiAJMHgwMiwgMHhlYSwgMHhiNCwgMHgwMCwKLQkweDMzLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MzMsIDB4ZWEsIDB4NWUsIDB4NTksCiAJMHgzMywgMHhlYSwgMHgwMCwgMHgwMCwKLQkweDAyLCAweDQyLCAweDUxLCAweDMxLAotCTB4ZmYsIDB4OTAsIDB4NjUsIDB4NjgsCi0JMHhmZiwgMHg4OCwgMHg1YiwgMHg2YiwKLQkweDAxLCAweGE0LCAweDU3LCAweDZiLAotCTB4MDIsIDB4YTQsIDB4NWYsIDB4NmIsCi0JMHgwMSwgMHg4NCwgMHg1ZiwgMHg3YiwKKwkweDAyLCAweDQ4LCAweDUxLCAweDMxLAorCTB4ZmYsIDB4OTAsIDB4ODUsIDB4NjgsCisJMHhmZiwgMHg4OCwgMHg3YiwgMHg2YiwKKwkweDAxLCAweGE0LCAweDc3LCAweDZiLAorCTB4MDIsIDB4YTQsIDB4N2YsIDB4NmIsCisJMHgwMSwgMHg4NCwgMHg3ZiwgMHg3YiwKIAkweDAyLCAweDI4LCAweDE5LCAweDMzLAogCTB4MDIsIDB4YTgsIDB4NTAsIDB4MzYsCi0JMHhmZiwgMHg4OCwgMHg1ZiwgMHg3MywKLQkweDAwLCAweGUyLCAweDMyLCAweDViLAorCTB4ZmYsIDB4ODgsIDB4N2YsIDB4NzMsCisJMHgwMCwgMHhlMiwgMHg1MiwgMHg1YiwKIAkweDAyLCAweGE4LCAweDIwLCAweDMzLAotCTB4MDIsIDB4MmMsIDB4MTksIDB4MzMsCisJMHgwNCwgMHhhNCwgMHg0OSwgMHgwMywKKwkweGZmLCAweGVhLCAweDFhLCAweDAzLAorCTB4ZmYsIDB4MmQsIDB4OGIsIDB4NjMsCiAJMHgwMiwgMHhhOCwgMHg1OCwgMHgzMiwKLQkweDA0LCAweGE0LCAweDQ5LCAweDA3LAotCTB4YzAsIDB4MzMsIDB4YjUsIDB4NmEsCi0JMHgwNCwgMHg5MiwgMHgyNSwgMHgwMywKLQkweDIwLCAweDkyLCAweDgzLCAweDZiLAorCTB4MDIsIDB4YTgsIDB4NWMsIDB4MzYsCiAJMHgwMiwgMHhhOCwgMHg0MCwgMHgzMSwKLQkweGMwLCAweDM0LCAweGMxLCAweDA5LAotCTB4MDAsIDB4MzUsIDB4NTEsIDB4MDEsCisJMHgwMiwgMHgyZSwgMHg1MSwgMHgzMSwKKwkweDAyLCAweGEwLCAweDE4LCAweDMzLAorCTB4MDIsIDB4YTAsIDB4NWMsIDB4MzYsCisJMHhjMCwgMHgzOSwgMHhkNSwgMHg2YSwKKwkweDA0LCAweDkyLCAweDI1LCAweDAzLAorCTB4MjAsIDB4OTIsIDB4YWYsIDB4NmIsCisJMHgwMiwgMHhhOCwgMHg0MCwgMHgzMSwKKwkweGMwLCAweDNhLCAweGMxLCAweDA5LAorCTB4MDAsIDB4M2IsIDB4NTEsIDB4MDEsCiAJMHhmZiwgMHhlYSwgMHg1MiwgMHgwOSwKLQkweDMwLCAweDM0LCAweGM1LCAweDA5LAorCTB4MzAsIDB4M2EsIDB4YzUsIDB4MDksCiAJMHgzZCwgMHhlMiwgMHhjNCwgMHgyOSwKIAkweGI4LCAweGUyLCAweGM0LCAweDE5LAogCTB4MDEsIDB4ZWEsIDB4YzYsIDB4MDEsCkBAIC00NTgsNjkgKzQ4MCw3NSBAQAogCTB4ZjcsIDB4NTcsIDB4YWUsIDB4MDgsCiAJMHgwOCwgMHhlYSwgMHg5OCwgMHgwMCwKIAkweDAxLCAweDQ0LCAweGQ0LCAweDMxLAotCTB4ZWUsIDB4MDAsIDB4OGMsIDB4NmIsCisJMHhlZSwgMHgwMCwgMHhiOCwgMHg2YiwKIAkweDAyLCAweGVhLCAweGI0LCAweDAwLAotCTB4MDAsIDB4ZTIsIDB4YjQsIDB4NWIsCi0JMHgwOSwgMHg0YywgMHg4ZSwgMHg3YiwKKwkweGMwLCAweGVhLCAweDcyLCAweDAyLAorCTB4MDksIDB4NGMsIDB4YmEsIDB4N2IsCisJMHgwMSwgMHhlYSwgMHg3OCwgMHgwMiwKIAkweDA4LCAweDRjLCAweDA2LCAweDY4LAotCTB4MGIsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgwYiwgMHhlYSwgMHg2NCwgMHg1OSwKIAkweDBiLCAweGVhLCAweDA0LCAweDAwLAogCTB4MDEsIDB4NDQsIDB4ZDQsIDB4MzEsCi0JMHgyMCwgMHgzMywgMHhmOSwgMHg3OSwKLQkweDAwLCAweGUyLCAweDllLCAweDViLAotCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCi0JMHgwMSwgMHg4NCwgMHhhMywgMHg3YiwKKwkweDIwLCAweDM5LCAweDE1LCAweDdhLAorCTB4MDAsIDB4ZTIsIDB4Y2MsIDB4NWIsCisJMHgwMCwgMHhlMiwgMHgxNCwgMHg0MiwKKwkweDAxLCAweDg0LCAweGQxLCAweDdiLAogCTB4MDEsIDB4YTQsIDB4NDksIDB4MDcsCiAJMHgwOCwgMHg2MCwgMHgzMCwgMHgzMywKIAkweDA4LCAweDgwLCAweDQxLCAweDM3LAotCTB4ZGYsIDB4MzMsIDB4NjcsIDB4MGEsCi0JMHhlZSwgMHgwMCwgMHhiMCwgMHg2YiwKKwkweGRmLCAweDM5LCAweDczLCAweDBhLAorCTB4ZWUsIDB4MDAsIDB4ZGUsIDB4NmIsCiAJMHgwNSwgMHhlYSwgMHhiNCwgMHgwMCwKLQkweDMzLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MzMsIDB4ZWEsIDB4NWUsIDB4NTksCiAJMHgzMywgMHhlYSwgMHgwMCwgMHgwMCwKLQkweDAwLCAweGUyLCAweDZhLCAweDU5LAotCTB4MDAsIDB4ZTIsIDB4YmMsIDB4NDIsCi0JMHgwMSwgMHhlYSwgMHg2YywgMHgwMiwKLQkweGMwLCAweGVhLCAweDY2LCAweDA2LAotCTB4ZmYsIDB4NDIsIDB4YzQsIDB4NmIsCi0JMHgwMSwgMHg0MSwgMHhiOCwgMHg2YiwKLQkweDAyLCAweDQxLCAweGI4LCAweDdiLAotCTB4ZmYsIDB4NDIsIDB4YzQsIDB4NmIsCi0JMHgwMSwgMHg0MSwgMHhiOCwgMHg2YiwKLQkweDAyLCAweDQxLCAweGI4LCAweDdiLAotCTB4ZmYsIDB4NDIsIDB4YzQsIDB4N2IsCi0JMHgwNCwgMHg0YywgMHhiOCwgMHg2YiwKLQkweGUwLCAweDQxLCAweDZjLCAweDBlLAorCTB4MDAsIDB4ZTIsIDB4N2UsIDB4NTksCisJMHgwMCwgMHhlMiwgMHhkYywgMHg0MiwKKwkweGZmLCAweDQyLCAweGVlLCAweDZiLAorCTB4MDEsIDB4NDEsIDB4ZTIsIDB4NmIsCisJMHgwMiwgMHg0MSwgMHhlMiwgMHg3YiwKKwkweGZmLCAweDQyLCAweGVlLCAweDZiLAorCTB4MDEsIDB4NDEsIDB4ZTIsIDB4NmIsCisJMHgwMiwgMHg0MSwgMHhlMiwgMHg3YiwKKwkweGZmLCAweDQyLCAweGVlLCAweDdiLAorCTB4MDQsIDB4NGMsIDB4ZTIsIDB4NmIsCisJMHhlMCwgMHg0MSwgMHg3OCwgMHgwZSwKIAkweDAxLCAweDQ0LCAweGQ0LCAweDMxLAotCTB4ZmYsIDB4NDIsIDB4Y2MsIDB4N2IsCi0JMHgwNCwgMHg0YywgMHhjYywgMHg2YiwKLQkweGUwLCAweDQxLCAweDZjLCAweDBhLAotCTB4ZTAsIDB4MzYsIDB4ZjksIDB4NjEsCisJMHhmZiwgMHg0MiwgMHhmNiwgMHg3YiwKKwkweDA0LCAweDRjLCAweGY2LCAweDZiLAorCTB4ZTAsIDB4NDEsIDB4NzgsIDB4MGEsCisJMHhlMCwgMHgzYywgMHgxNSwgMHg2MiwKIAkweGZmLCAweGVhLCAweGNhLCAweDA5LAogCTB4MDEsIDB4ZTIsIDB4YzgsIDB4MzEsCiAJMHgwMSwgMHg0NiwgMHhkYSwgMHgzNSwKIAkweDAxLCAweDQ0LCAweGQ0LCAweDM1LAogCTB4MTAsIDB4ZWEsIDB4ODAsIDB4MDAsCi0JMHgwMSwgMHhlMiwgMHg2MiwgMHgzNiwKLQkweDA0LCAweGE2LCAweGU0LCAweDdiLAorCTB4MDEsIDB4ZTIsIDB4NmUsIDB4MzYsCisJMHgwNCwgMHhhNiwgMHgwZSwgMHg3YywKIAkweGZmLCAweGVhLCAweDVhLCAweDA5LAogCTB4ZmYsIDB4ZWEsIDB4NGMsIDB4MGQsCi0JMHgwMSwgMHhhNiwgMHgwMiwgMHg2YywKLQkweDEwLCAweGFkLCAweDY0LCAweDc4LAotCTB4ODAsIDB4YWQsIDB4ZmEsIDB4NmIsCi0JMHgwOCwgMHhhZCwgMHg2NCwgMHg2OCwKKwkweDAxLCAweGE2LCAweDNhLCAweDZjLAorCTB4MTAsIDB4YWQsIDB4ODQsIDB4NzgsCisJMHg4MCwgMHhhZCwgMHgzMiwgMHg2YywKKwkweDA4LCAweGFkLCAweDg0LCAweDY4LAorCTB4MjAsIDB4MTksIDB4MjYsIDB4N2MsCisJMHg4MCwgMHhlYSwgMHhiMiwgMHgwMSwKKwkweDExLCAweDAwLCAweDAwLCAweDEwLAorCTB4MDIsIDB4YTYsIDB4MjIsIDB4N2MsCisJMHhmZiwgMHhlYSwgMHhiMiwgMHgwZCwKKwkweDExLCAweDAwLCAweDAwLCAweDEwLAorCTB4ZmYsIDB4ZWEsIDB4YjIsIDB4MDksCiAJMHgwNCwgMHg4NCwgMHhmOSwgMHgzMCwKIAkweDAwLCAweGVhLCAweDA4LCAweDgxLAogCTB4ZmYsIDB4ZWEsIDB4ZDQsIDB4MDksCiAJMHgwMiwgMHg4NCwgMHhmOSwgMHg4OCwKIAkweDBkLCAweGVhLCAweDVhLCAweDAxLAogCTB4MDQsIDB4YTYsIDB4NGMsIDB4MDUsCi0JMHgwNCwgMHhhNiwgMHg2NCwgMHg3OCwKKwkweDA0LCAweGE2LCAweDg0LCAweDc4LAogCTB4ZmYsIDB4ZWEsIDB4NWEsIDB4MDksCiAJMHgwMywgMHg4NCwgMHg1OSwgMHg4OSwKIAkweDAzLCAweGVhLCAweDRjLCAweDAxLAotCTB4ODAsIDB4MWEsIDB4NjQsIDB4NzgsCi0JMHgwOCwgMHgxOSwgMHg2NCwgMHg3OCwKKwkweDgwLCAweDFhLCAweDg0LCAweDc4LAorCTB4MDgsIDB4MTksIDB4ODQsIDB4NzgsCiAJMHgwOCwgMHhiMCwgMHhlMCwgMHgzMCwKIAkweDA0LCAweGIwLCAweGUwLCAweDMwLAogCTB4MDMsIDB4YjAsIDB4ZjAsIDB4MzAsCkBAIC01MzMsMjU5ICs1NjEsMjU5IEBACiAJMHgwMCwgMHg4NiwgMHgwZCwgMHgyMywKIAkweDAwLCAweDg3LCAweDBmLCAweDIzLAogCTB4MDEsIDB4ODQsIDB4YzUsIDB4MzEsCi0JMHg4MCwgMHg4MywgMHgyNSwgMHg3YywKKwkweDgwLCAweDgzLCAweDVkLCAweDdjLAogCTB4MDIsIDB4ZTIsIDB4YzQsIDB4MDEsCiAJMHhmZiwgMHhlYSwgMHg0YywgMHgwOSwKIAkweDAxLCAweGUyLCAweDM2LCAweDMwLAogCTB4YzgsIDB4MTksIDB4MzIsIDB4MDAsCiAJMHg4OCwgMHgxOSwgMHgzMiwgMHgwMCwKIAkweDAxLCAweGFjLCAweGQ0LCAweDk5LAotCTB4MDAsIDB4ZTIsIDB4NjQsIDB4NTAsCisJMHgwMCwgMHhlMiwgMHg4NCwgMHg1MCwKIAkweGZlLCAweGE2LCAweDRjLCAweDBkLAogCTB4MGIsIDB4OTgsIDB4ZTEsIDB4MzAsCiAJMHhmZCwgMHhhNCwgMHg0OSwgMHgwOSwKLQkweDgwLCAweGEzLCAweDM5LCAweDdjLAorCTB4ODAsIDB4YTMsIDB4NzEsIDB4N2MsCiAJMHgwMiwgMHhhNCwgMHg0OCwgMHgwMSwKIAkweDAxLCAweGE0LCAweDM2LCAweDMwLAogCTB4YTgsIDB4ZWEsIDB4MzIsIDB4MDAsCiAJMHhmZCwgMHhhNCwgMHg0OSwgMHgwYiwKIAkweDA1LCAweGEzLCAweDA3LCAweDMzLAotCTB4ODAsIDB4ODMsIDB4NDUsIDB4NmMsCisJMHg4MCwgMHg4MywgMHg3ZCwgMHg2YywKIAkweDAyLCAweGVhLCAweDRjLCAweDA1LAogCTB4ZmYsIDB4ZWEsIDB4NGMsIDB4MGQsCi0JMHgwMCwgMHhlMiwgMHgzZSwgMHg1OSwKLQkweDAyLCAweGE2LCAweGU2LCAweDZiLAorCTB4MDAsIDB4ZTIsIDB4NTYsIDB4NTksCisJMHgwMiwgMHhhNiwgMHgxMCwgMHg2YywKIAkweDgwLCAweGY5LCAweGYyLCAweDA1LAotCTB4YzAsIDB4MzMsIDB4NTMsIDB4N2MsCi0JMHgwMywgMHhlYSwgMHg1MCwgMHg1OSwKKwkweGMwLCAweDM5LCAweDhiLCAweDdjLAorCTB4MDMsIDB4ZWEsIDB4NjQsIDB4NTksCiAJMHgwMywgMHhlYSwgMHgwNCwgMHgwMCwKLQkweDIwLCAweDMzLCAweDc3LCAweDdjLAotCTB4MDEsIDB4ODQsIDB4NWQsIDB4NmMsCi0JMHgwNiwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDIwLCAweDM5LCAweGFmLCAweDdjLAorCTB4MDEsIDB4ODQsIDB4OTUsIDB4NmMsCisJMHgwNiwgMHhlYSwgMHg2NCwgMHg1OSwKIAkweDA2LCAweGVhLCAweDA0LCAweDAwLAotCTB4MDAsIDB4ZTIsIDB4N2EsIDB4NDQsCi0JMHgwMSwgMHgwMCwgMHg2MCwgMHgzMiwKLQkweGVlLCAweDAwLCAweDY2LCAweDZjLAorCTB4MDAsIDB4ZTIsIDB4YjIsIDB4NDQsCisJMHgwMSwgMHgwMCwgMHg2YywgMHgzMiwKKwkweGVlLCAweDAwLCAweDllLCAweDZjLAogCTB4MDUsIDB4ZWEsIDB4YjQsIDB4MDAsCi0JMHgzMywgMHhlYSwgMHg0NCwgMHg1OSwKKwkweDMzLCAweGVhLCAweDVlLCAweDU5LAogCTB4MzMsIDB4ZWEsIDB4MDAsIDB4MDAsCiAJMHg4MCwgMHgzZCwgMHg3YSwgMHgwMCwKLQkweGZjLCAweDQyLCAweDY4LCAweDdjLAorCTB4ZmMsIDB4NDIsIDB4YTAsIDB4N2MsCiAJMHg3ZiwgMHgzZCwgMHg3YSwgMHgwOCwKLQkweDAwLCAweDMwLCAweDQ1LCAweDU5LAotCTB4MDEsIDB4MzAsIDB4MDEsIDB4MzAsCi0JMHgwOSwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDAwLCAweDM2LCAweDVmLCAweDU5LAorCTB4MDEsIDB4MzYsIDB4MDEsIDB4MzAsCisJMHgwOSwgMHhlYSwgMHg2NCwgMHg1OSwKIAkweDA5LCAweGVhLCAweDA0LCAweDAwLAotCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCi0JMHgwMSwgMHhhNCwgMHg1ZCwgMHg2YywKLQkweDAwLCAweGUyLCAweDMwLCAweDVjLAotCTB4MjAsIDB4MzMsIDB4NjcsIDB4MDIsCi0JMHgwMSwgMHgwMCwgMHg2MCwgMHgzMiwKLQkweDAyLCAweGE2LCAweDgyLCAweDdjLAotCTB4MDAsIDB4ZTIsIDB4NDYsIDB4NWMsCi0JMHgwMCwgMHhlMiwgMHg1NiwgMHg1OCwKLQkweDAwLCAweGUyLCAweDY2LCAweDU4LAotCTB4MDAsIDB4ZTIsIDB4M2EsIDB4NTgsCi0JMHgwMCwgMHgzMCwgMHg0NSwgMHg1OSwKLQkweDAxLCAweDMwLCAweDAxLCAweDMwLAotCTB4MjAsIDB4MTksIDB4ODIsIDB4NmMsCi0JMHgwMCwgMHhlMiwgMHhiMiwgMHg1YywKLQkweDA0LCAweDE5LCAweDljLCAweDZjLAorCTB4MDAsIDB4ZTIsIDB4MTQsIDB4NDIsCisJMHgwMSwgMHhhNCwgMHg5NSwgMHg2YywKKwkweDAwLCAweGUyLCAweDY4LCAweDVjLAorCTB4MjAsIDB4MzksIDB4NzMsIDB4MDIsCisJMHgwMSwgMHgwMCwgMHg2YywgMHgzMiwKKwkweDAyLCAweGE2LCAweGJhLCAweDdjLAorCTB4MDAsIDB4ZTIsIDB4N2UsIDB4NWMsCisJMHgwMCwgMHhlMiwgMHg3NiwgMHg1OCwKKwkweDAwLCAweGUyLCAweDg2LCAweDU4LAorCTB4MDAsIDB4ZTIsIDB4NWEsIDB4NTgsCisJMHgwMCwgMHgzNiwgMHg1ZiwgMHg1OSwKKwkweDAxLCAweDM2LCAweDAxLCAweDMwLAorCTB4MjAsIDB4MTksIDB4YmEsIDB4NmMsCisJMHgwMCwgMHhlMiwgMHhlYSwgMHg1YywKKwkweDA0LCAweDE5LCAweGQ0LCAweDZjLAogCTB4MDIsIDB4MTksIDB4MzIsIDB4MDAsCi0JMHgwMSwgMHg4NCwgMHg5ZCwgMHg3YywKLQkweDAxLCAweDFiLCAweDk2LCAweDdjLAotCTB4MDEsIDB4MWEsIDB4OWMsIDB4NmMsCi0JMHgwMCwgMHhlMiwgMHg0YywgMHg0NCwKLQkweDgwLCAweDRiLCAweGEyLCAweDZjLAotCTB4MDEsIDB4NGMsIDB4OWUsIDB4N2MsCi0JMHgwMywgMHg0MiwgMHg0YywgMHg2YywKLQkweDAwLCAweGUyLCAweGUwLCAweDViLAorCTB4MDEsIDB4ODQsIDB4ZDUsIDB4N2MsCisJMHgwMSwgMHgxYiwgMHhjZSwgMHg3YywKKwkweDAxLCAweDFhLCAweGQ0LCAweDZjLAorCTB4MDAsIDB4ZTIsIDB4ODQsIDB4NDQsCisJMHg4MCwgMHg0YiwgMHhkYSwgMHg2YywKKwkweDAxLCAweDRjLCAweGQ2LCAweDdjLAorCTB4MDMsIDB4NDIsIDB4ODQsIDB4NmMsCisJMHgwMCwgMHhlMiwgMHgwYSwgMHg1YywKIAkweDgwLCAweGY5LCAweGYyLCAweDAxLAotCTB4MDQsIDB4MzMsIDB4ZjksIDB4NzksCi0JMHgwMCwgMHhlMiwgMHhmOCwgMHg0MSwKLQkweDA4LCAweDVkLCAweGJhLCAweDZjLAotCTB4MDAsIDB4ZTIsIDB4NTYsIDB4NTgsCi0JMHgwMCwgMHgzMCwgMHg0NSwgMHg1OSwKLQkweDAxLCAweDMwLCAweDAxLCAweDMwLAotCTB4MDIsIDB4MWIsIDB4YWEsIDB4N2MsCi0JMHgwOCwgMHg1ZCwgMHhiOCwgMHg3YywKKwkweDA0LCAweDM5LCAweDE1LCAweDdhLAorCTB4MDAsIDB4ZTIsIDB4MTQsIDB4NDIsCisJMHgwOCwgMHg1ZCwgMHhmMiwgMHg2YywKKwkweDAwLCAweGUyLCAweDc2LCAweDU4LAorCTB4MDAsIDB4MzYsIDB4NWYsIDB4NTksCisJMHgwMSwgMHgzNiwgMHgwMSwgMHgzMCwKKwkweDAyLCAweDFiLCAweGUyLCAweDdjLAorCTB4MDgsIDB4NWQsIDB4ZjAsIDB4N2MsCiAJMHgwMywgMHg2OCwgMHgwMCwgMHgzNywKIAkweDAxLCAweDg0LCAweDA5LCAweDA3LAotCTB4ODAsIDB4MWIsIDB4YzQsIDB4N2MsCi0JMHg4MCwgMHg4NCwgMHhjNSwgMHg2YywKKwkweDgwLCAweDFiLCAweGZjLCAweDdjLAorCTB4ODAsIDB4ODQsIDB4ZmQsIDB4NmMsCiAJMHhmZiwgMHg4NSwgMHgwYiwgMHgxYiwKIAkweGZmLCAweDg2LCAweDBkLCAweDIzLAogCTB4ZmYsIDB4ODcsIDB4MGYsIDB4MjMsCiAJMHhmOCwgMHgxYiwgMHgwOCwgMHgwYiwKIAkweGZmLCAweGVhLCAweDA2LCAweDBiLAogCTB4MDMsIDB4NjgsIDB4MDAsIDB4MzcsCi0JMHgwMCwgMHhlMiwgMHhjNCwgMHg1OCwKKwkweDAwLCAweGUyLCAweGQ2LCAweDU4LAogCTB4MTAsIDB4ZWEsIDB4MTgsIDB4MDAsCiAJMHhmOSwgMHhkOSwgMHhiMiwgMHgwZCwKIAkweDAxLCAweGQ5LCAweGIyLCAweDA1LAogCTB4MDEsIDB4NTIsIDB4NDgsIDB4MzEsCi0JMHgyMCwgMHhhNCwgMHhlZSwgMHg3YywKLQkweDIwLCAweDViLCAweGVlLCAweDdjLAotCTB4ODAsIDB4ZjksIDB4ZmMsIDB4N2MsCisJMHgyMCwgMHhhNCwgMHgyNiwgMHg3ZCwKKwkweDIwLCAweDViLCAweDI2LCAweDdkLAorCTB4ODAsIDB4ZjksIDB4MzQsIDB4N2QsCiAJMHgwMiwgMHhlYSwgMHhiNCwgMHgwMCwKIAkweDExLCAweDAwLCAweDAwLCAweDEwLAotCTB4MDQsIDB4MTksIDB4MDgsIDB4N2QsCisJMHgwNCwgMHgxOSwgMHg0MCwgMHg3ZCwKIAkweGRmLCAweDE5LCAweDMyLCAweDA4LAotCTB4NjAsIDB4NWIsIDB4ZTYsIDB4NmMsCi0JMHgwMSwgMHg0YywgMHhlMiwgMHg3YywKKwkweDYwLCAweDViLCAweDQwLCAweDZkLAorCTB4MDEsIDB4NGMsIDB4MWEsIDB4N2QsCiAJMHgyMCwgMHgxOSwgMHgzMiwgMHgwMCwKIAkweDAxLCAweGQ5LCAweGIyLCAweDA1LAogCTB4MDIsIDB4ZWEsIDB4YjQsIDB4MDAsCiAJMHgwMSwgMHhkOSwgMHhiMiwgMHgwNSwKLQkweDEwLCAweDViLCAweDAwLCAweDZkLAotCTB4MDgsIDB4NWIsIDB4MGEsIDB4NmQsCi0JMHgyMCwgMHg1YiwgMHhmYSwgMHg2YywKLQkweDAyLCAweDViLCAweDJhLCAweDZkLAotCTB4MGUsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgxMCwgMHg1YiwgMHgzOCwgMHg2ZCwKKwkweDA4LCAweDViLCAweDQyLCAweDZkLAorCTB4MjAsIDB4NWIsIDB4MzIsIDB4NmQsCisJMHgwMiwgMHg1YiwgMHg2MiwgMHg2ZCwKKwkweDBlLCAweGVhLCAweDY0LCAweDU5LAogCTB4MGUsIDB4ZWEsIDB4MDQsIDB4MDAsCi0JMHg4MCwgMHhmOSwgMHhlYSwgMHg2YywKKwkweDgwLCAweGY5LCAweDIyLCAweDZkLAogCTB4ZGYsIDB4NWMsIDB4YjgsIDB4MDgsCiAJMHgwMSwgMHhkOSwgMHhiMiwgMHgwNSwKLQkweDAxLCAweGE0LCAweGU1LCAweDZkLAotCTB4MDAsIDB4ZTIsIDB4MzAsIDB4NWMsCi0JMHgwMCwgMHhlMiwgMHgzNCwgMHg1ZCwKKwkweDAxLCAweGE0LCAweDFkLCAweDZlLAorCTB4MDAsIDB4ZTIsIDB4NjgsIDB4NWMsCisJMHgwMCwgMHhlMiwgMHg2YywgMHg1ZCwKIAkweDAxLCAweDkwLCAweDIxLCAweDFiLAogCTB4MDEsIDB4ZDksIDB4YjIsIDB4MDUsCi0JMHgwMCwgMHhlMiwgMHgzMiwgMHg1YiwKKwkweDAwLCAweGUyLCAweDUyLCAweDViLAogCTB4ZjMsIDB4OTYsIDB4ZDUsIDB4MTksCi0JMHgwMCwgMHhlMiwgMHgxOCwgMHg1NSwKLQkweDgwLCAweDk2LCAweDE5LCAweDZkLAotCTB4MGYsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgwMCwgMHhlMiwgMHg1MCwgMHg1NSwKKwkweDgwLCAweDk2LCAweDUxLCAweDZkLAorCTB4MGYsIDB4ZWEsIDB4NjQsIDB4NTksCiAJMHgwZiwgMHhlYSwgMHgwNCwgMHgwMCwKLQkweDAwLCAweGUyLCAweDIwLCAweDQ1LAorCTB4MDAsIDB4ZTIsIDB4NTgsIDB4NDUsCiAJMHgwNCwgMHg4YywgMHhlMSwgMHgzMCwKIAkweDAxLCAweGVhLCAweGYyLCAweDAwLAogCTB4MDIsIDB4ZWEsIDB4MzYsIDB4MDAsCiAJMHhhOCwgMHhlYSwgMHgzMiwgMHgwMCwKLQkweGZmLCAweDk3LCAweDI3LCAweDdkLAotCTB4MTQsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHhmZiwgMHg5NywgMHg1ZiwgMHg3ZCwKKwkweDE0LCAweGVhLCAweDY0LCAweDU5LAogCTB4MTQsIDB4ZWEsIDB4MDQsIDB4MDAsCi0JMHgwMCwgMHhlMiwgMHg5NiwgMHg1ZCwKKwkweDAwLCAweGUyLCAweGNlLCAweDVkLAogCTB4MDEsIDB4ZDksIDB4YjIsIDB4MDUsCiAJMHgwOSwgMHg4MCwgMHhlMSwgMHgzMCwKIAkweDAyLCAweGVhLCAweDM2LCAweDAwLAogCTB4YTgsIDB4ZWEsIDB4MzIsIDB4MDAsCi0JMHgwMCwgMHhlMiwgMHg4ZSwgMHg1ZCwKKwkweDAwLCAweGUyLCAweGM2LCAweDVkLAogCTB4MDEsIDB4ZDksIDB4YjIsIDB4MDUsCi0JMHgwMiwgMHhhNiwgMHg0NCwgMHg3ZCwKLQkweDAwLCAweGUyLCAweDNlLCAweDU5LAotCTB4MjAsIDB4NWIsIDB4NTIsIDB4NmQsCi0JMHhmYywgMHg0MiwgMHgzZSwgMHg3ZCwKLQkweDEwLCAweDQwLCAweDQwLCAweDZkLAotCTB4MjAsIDB4NGQsIDB4NDIsIDB4N2QsCi0JMHgwOCwgMHg1ZCwgMHg1MiwgMHg2ZCwKLQkweDAyLCAweGE2LCAweGU2LCAweDZiLAotCTB4MDAsIDB4ZTIsIDB4M2UsIDB4NTksCi0JMHgyMCwgMHg1YiwgMHg1MiwgMHg2ZCwKLQkweDAxLCAweDFiLCAweDcyLCAweDZkLAotCTB4ZmMsIDB4NDIsIDB4NGUsIDB4N2QsCi0JMHgxMCwgMHg0MCwgMHg1MCwgMHg2ZCwKLQkweDIwLCAweDRkLCAweDY0LCAweDc4LAotCTB4MDgsIDB4NWQsIDB4NjQsIDB4NzgsCisJMHgwMiwgMHhhNiwgMHg3YywgMHg3ZCwKKwkweDAwLCAweGUyLCAweDU2LCAweDU5LAorCTB4MjAsIDB4NWIsIDB4OGEsIDB4NmQsCisJMHhmYywgMHg0MiwgMHg3NiwgMHg3ZCwKKwkweDEwLCAweDQwLCAweDc4LCAweDZkLAorCTB4MjAsIDB4NGQsIDB4N2EsIDB4N2QsCisJMHgwOCwgMHg1ZCwgMHg4YSwgMHg2ZCwKKwkweDAyLCAweGE2LCAweDEwLCAweDZjLAorCTB4MDAsIDB4ZTIsIDB4NTYsIDB4NTksCisJMHgyMCwgMHg1YiwgMHg4YSwgMHg2ZCwKKwkweDAxLCAweDFiLCAweGFhLCAweDZkLAorCTB4ZmMsIDB4NDIsIDB4ODYsIDB4N2QsCisJMHgxMCwgMHg0MCwgMHg4OCwgMHg2ZCwKKwkweDIwLCAweDRkLCAweDg0LCAweDc4LAorCTB4MDgsIDB4NWQsIDB4ODQsIDB4NzgsCiAJMHgwMiwgMHgxOSwgMHgzMiwgMHgwMCwKIAkweDAxLCAweDViLCAweDQwLCAweDMxLAotCTB4MDAsIDB4ZTIsIDB4YjIsIDB4NWMsCi0JMHgwMCwgMHhlMiwgMHg5ZSwgMHg1YiwKKwkweDAwLCAweGUyLCAweGVhLCAweDVjLAorCTB4MDAsIDB4ZTIsIDB4Y2MsIDB4NWIsCiAJMHgyMCwgMHhlYSwgMHhiNiwgMHgwMCwKLQkweDAwLCAweGUyLCAweGUwLCAweDViLAorCTB4MDAsIDB4ZTIsIDB4MGEsIDB4NWMsCiAJMHgyMCwgMHg1YywgMHhiOCwgMHgwMCwKLQkweDA0LCAweDE5LCAweDY4LCAweDZkLAotCTB4MDEsIDB4MWEsIDB4NjgsIDB4NmQsCi0JMHgwMCwgMHhlMiwgMHgzZSwgMHg1OSwKLQkweDAxLCAweDFhLCAweDY0LCAweDc4LAorCTB4MDQsIDB4MTksIDB4YTAsIDB4NmQsCisJMHgwMSwgMHgxYSwgMHhhMCwgMHg2ZCwKKwkweDAwLCAweGUyLCAweDU2LCAweDU5LAorCTB4MDEsIDB4MWEsIDB4ODQsIDB4NzgsCiAJMHg4MCwgMHhmOSwgMHhmMiwgMHgwMSwKLQkweDIwLCAweGEwLCAweGNjLCAweDdkLAorCTB4MjAsIDB4YTAsIDB4MDQsIDB4N2UsCiAJMHhmZiwgMHg5MCwgMHgyMSwgMHgxYiwKLQkweDA4LCAweDkyLCAweDQzLCAweDZiLAorCTB4MDgsIDB4OTIsIDB4NjMsIDB4NmIsCiAJMHgwMiwgMHhlYSwgMHhiNCwgMHgwNCwKIAkweDAxLCAweGE0LCAweDQ5LCAweDAzLAotCTB4NDAsIDB4NWIsIDB4ODIsIDB4NmQsCi0JMHgwMCwgMHhlMiwgMHgzZSwgMHg1OSwKLQkweDQwLCAweDViLCAweDgyLCAweDZkLAotCTB4MDQsIDB4NWQsIDB4ZTYsIDB4N2QsCi0JMHgwMSwgMHgxYSwgMHhlNiwgMHg3ZCwKLQkweDIwLCAweDRkLCAweDY0LCAweDc4LAotCTB4NDAsIDB4NWIsIDB4Y2MsIDB4N2QsCi0JMHgwNCwgMHg1ZCwgMHhlNiwgMHg3ZCwKLQkweDAxLCAweDFhLCAweGU2LCAweDdkLAorCTB4NDAsIDB4NWIsIDB4YmEsIDB4NmQsCisJMHgwMCwgMHhlMiwgMHg1NiwgMHg1OSwKKwkweDQwLCAweDViLCAweGJhLCAweDZkLAorCTB4MDQsIDB4NWQsIDB4MWUsIDB4N2UsCisJMHgwMSwgMHgxYSwgMHgxZSwgMHg3ZSwKKwkweDIwLCAweDRkLCAweDg0LCAweDc4LAorCTB4NDAsIDB4NWIsIDB4MDQsIDB4N2UsCisJMHgwNCwgMHg1ZCwgMHgxZSwgMHg3ZSwKKwkweDAxLCAweDFhLCAweDFlLCAweDdlLAogCTB4ODAsIDB4ZjksIDB4ZjIsIDB4MDEsCiAJMHhmZiwgMHg5MCwgMHgyMSwgMHgxYiwKLQkweDA4LCAweDkyLCAweDQzLCAweDZiLAorCTB4MDgsIDB4OTIsIDB4NjMsIDB4NmIsCiAJMHgwMiwgMHhlYSwgMHhiNCwgMHgwNCwKLQkweDAwLCAweGUyLCAweDNlLCAweDU5LAotCTB4MDEsIDB4MWIsIDB4NjQsIDB4NzgsCisJMHgwMCwgMHhlMiwgMHg1NiwgMHg1OSwKKwkweDAxLCAweDFiLCAweDg0LCAweDc4LAogCTB4ODAsIDB4ZjksIDB4ZjIsIDB4MDEsCiAJMHgwMiwgMHhlYSwgMHhiNCwgMHgwNCwKLQkweDAwLCAweGUyLCAweDNlLCAweDU5LAotCTB4MDEsIDB4MWIsIDB4YWEsIDB4NmQsCi0JMHg0MCwgMHg1YiwgMHhiOCwgMHg3ZCwKLQkweDAxLCAweDFiLCAweGFhLCAweDZkLAorCTB4MDAsIDB4ZTIsIDB4NTYsIDB4NTksCisJMHgwMSwgMHgxYiwgMHhlMiwgMHg2ZCwKKwkweDQwLCAweDViLCAweGYwLCAweDdkLAorCTB4MDEsIDB4MWIsIDB4ZTIsIDB4NmQsCiAJMHgwMiwgMHgxOSwgMHgzMiwgMHgwMCwKLQkweDAxLCAweDFhLCAweDY0LCAweDc4LAorCTB4MDEsIDB4MWEsIDB4ODQsIDB4NzgsCiAJMHg4MCwgMHhmOSwgMHhmMiwgMHgwMSwKIAkweGZmLCAweGVhLCAweDEwLCAweDAzLAogCTB4MDgsIDB4OTIsIDB4MjUsIDB4MDMsCi0JMHgwMCwgMHhlMiwgMHg0MiwgMHg0MywKLQkweDAxLCAweDFhLCAweGI0LCAweDdkLAotCTB4NDAsIDB4NWIsIDB4YjAsIDB4N2QsCi0JMHgwMSwgMHgxYSwgMHg5ZSwgMHg2ZCwKLQkweGZjLCAweDQyLCAweDY0LCAweDc4LAotCTB4MDEsIDB4MWEsIDB4YjgsIDB4NmQsCi0JMHgxMCwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDAwLCAweGUyLCAweDYyLCAweDQzLAorCTB4MDEsIDB4MWEsIDB4ZWMsIDB4N2QsCisJMHg0MCwgMHg1YiwgMHhlOCwgMHg3ZCwKKwkweDAxLCAweDFhLCAweGQ2LCAweDZkLAorCTB4ZmMsIDB4NDIsIDB4ODQsIDB4NzgsCisJMHgwMSwgMHgxYSwgMHhmMCwgMHg2ZCwKKwkweDEwLCAweGVhLCAweDY0LCAweDU5LAogCTB4MTAsIDB4ZWEsIDB4MDQsIDB4MDAsCi0JMHhmYywgMHg0MiwgMHg2NCwgMHg3OCwKLQkweDEwLCAweDQwLCAweGJlLCAweDZkLAotCTB4MjAsIDB4NGQsIDB4NjQsIDB4NzgsCi0JMHg0MCwgMHg1YiwgMHg5ZSwgMHg2ZCwKLQkweDAxLCAweDFhLCAweDY0LCAweDc4LAorCTB4ZmMsIDB4NDIsIDB4ODQsIDB4NzgsCisJMHgxMCwgMHg0MCwgMHhmNiwgMHg2ZCwKKwkweDIwLCAweDRkLCAweDg0LCAweDc4LAorCTB4NDAsIDB4NWIsIDB4ZDYsIDB4NmQsCisJMHgwMSwgMHgxYSwgMHg4NCwgMHg3OCwKIAkweDAxLCAweDkwLCAweDIxLCAweDFiLAogCTB4MzAsIDB4M2YsIDB4YzAsIDB4MDksCi0JMHgzMCwgMHhlMCwgMHg2NCwgMHg2MCwKLQkweDQwLCAweDRiLCAweDY0LCAweDY4LAorCTB4MzAsIDB4ZTAsIDB4ODQsIDB4NjAsCisJMHg0MCwgMHg0YiwgMHg4NCwgMHg2OCwKIAkweGZmLCAweGVhLCAweDUyLCAweDAxLAotCTB4ZWUsIDB4MDAsIDB4ZDIsIDB4NmQsCisJMHhlZSwgMHgwMCwgMHgwYywgMHg2ZSwKIAkweDgwLCAweGY5LCAweGYyLCAweDAxLAogCTB4ZmYsIDB4OTAsIDB4MjEsIDB4MWIsCiAJMHgwMiwgMHhlYSwgMHhiNCwgMHgwMCwKIAkweDIwLCAweGVhLCAweDlhLCAweDAwLAotCTB4ZjMsIDB4NDIsIDB4ZGUsIDB4NmQsCi0JMHgxMiwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweGYzLCAweDQyLCAweDE2LCAweDZlLAorCTB4MTIsIDB4ZWEsIDB4NjQsIDB4NTksCiAJMHgxMiwgMHhlYSwgMHgwNCwgMHgwMCwKLQkweDAwLCAweGUyLCAweGY4LCAweDQxLAotCTB4MGQsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgwMCwgMHhlMiwgMHgxNCwgMHg0MiwKKwkweDBkLCAweGVhLCAweDY0LCAweDU5LAogCTB4MGQsIDB4ZWEsIDB4MDQsIDB4MDAsCi0JMHgwMCwgMHhlMiwgMHhmOCwgMHg0MSwKKwkweDAwLCAweGUyLCAweDE0LCAweDQyLAogCTB4MDEsIDB4OTAsIDB4MjEsIDB4MWIsCi0JMHgxMSwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDExLCAweGVhLCAweDY0LCAweDU5LAogCTB4MTEsIDB4ZWEsIDB4MDQsIDB4MDAsCi0JMHgwMCwgMHhlMiwgMHgzMiwgMHg1YiwKKwkweDAwLCAweGUyLCAweDUyLCAweDViLAogCTB4MDgsIDB4NWEsIDB4YjQsIDB4MDAsCi0JMHgwMCwgMHhlMiwgMHgwYywgMHg1ZSwKKwkweDAwLCAweGUyLCAweDQ0LCAweDVlLAogCTB4YTgsIDB4ZWEsIDB4MzIsIDB4MDAsCi0JMHgwMCwgMHhlMiwgMHgzZSwgMHg1OSwKLQkweDgwLCAweDFhLCAweGZhLCAweDdkLAotCTB4MDAsIDB4ZTIsIDB4MGMsIDB4NWUsCisJMHgwMCwgMHhlMiwgMHg1NiwgMHg1OSwKKwkweDgwLCAweDFhLCAweDMyLCAweDdlLAorCTB4MDAsIDB4ZTIsIDB4NDQsIDB4NWUsCiAJMHg4MCwgMHgxOSwgMHgzMiwgMHgwMCwKLQkweDQwLCAweDViLCAweDAwLCAweDZlLAotCTB4MDgsIDB4NWEsIDB4MDAsIDB4N2UsCi0JMHgyMCwgMHg0ZCwgMHg2NCwgMHg3OCwKKwkweDQwLCAweDViLCAweDM4LCAweDZlLAorCTB4MDgsIDB4NWEsIDB4MzgsIDB4N2UsCisJMHgyMCwgMHg0ZCwgMHg4NCwgMHg3OCwKIAkweDAyLCAweDg0LCAweDA5LCAweDAzLAotCTB4NDAsIDB4NWIsIDB4Y2MsIDB4N2QsCisJMHg0MCwgMHg1YiwgMHgwNCwgMHg3ZSwKIAkweGZmLCAweDkwLCAweDIxLCAweDFiLAogCTB4ODAsIDB4ZjksIDB4ZjIsIDB4MDEsCi0JMHgwOCwgMHg5MiwgMHg0MywgMHg2YiwKKwkweDA4LCAweDkyLCAweDYzLCAweDZiLAogCTB4MDIsIDB4ZWEsIDB4YjQsIDB4MDQsCi0JMHgwMSwgMHgzOCwgMHhlMSwgMHgzMCwKLQkweDA1LCAweDM5LCAweGUzLCAweDk4LAorCTB4MDEsIDB4NDAsIDB4ZTEsIDB4MzAsCisJMHgwNSwgMHg0MSwgMHhlMywgMHg5OCwKIAkweDAxLCAweGUwLCAweGY0LCAweDMxLAogCTB4ZmYsIDB4ZWEsIDB4YzAsIDB4MDksCi0JMHgwMCwgMHgzYSwgMHhlNSwgMHgyMCwKLQkweDAwLCAweDNiLCAweGU3LCAweDIwLAorCTB4MDAsIDB4NDIsIDB4ZTUsIDB4MjAsCisJMHgwMCwgMHg0MywgMHhlNywgMHgyMCwKIAkweDAxLCAweGZhLCAweGMwLCAweDMxLAogCTB4MDQsIDB4ZWEsIDB4ZTgsIDB4MzAsCiAJMHhmZiwgMHhlYSwgMHhmMCwgMHgwOCwKQEAgLTc5NCwxMiArODIyLDIwIEBACiB9OwogCiB0eXBlZGVmIGludCBhaGRfcGF0Y2hfZnVuY190IChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoMjNfZnVuYzsKKworc3RhdGljIGludAorYWhkX3BhdGNoMjNfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJcmV0dXJuICgoYWhkLT5idWdzICYgQUhEX1BLVF9CSVRCVUNLRVRfQlVHKSAhPSAwKTsKK30KKwogc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoMjJfZnVuYzsKIAogc3RhdGljIGludAogYWhkX3BhdGNoMjJfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCiB7Ci0JcmV0dXJuICgoYWhkLT5idWdzICYgQUhEX1BLVF9CSVRCVUNLRVRfQlVHKSAhPSAwKTsKKwlyZXR1cm4gKChhaGQtPmJ1Z3MgJiBBSERfUEtUX0JJVEJVQ0tFVF9CVUcpID09IDApOwogfQogCiBzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gyMV9mdW5jOwpAQCAtODA3LDcgKzg0Myw3IEBACiBzdGF0aWMgaW50CiBhaGRfcGF0Y2gyMV9mdW5jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKIHsKLQlyZXR1cm4gKChhaGQtPmJ1Z3MgJiBBSERfUEtUX0JJVEJVQ0tFVF9CVUcpID09IDApOworCXJldHVybiAoKGFoZC0+ZmxhZ3MgJiBBSERfSU5JVElBVE9SUk9MRSkgIT0gMCk7CiB9CiAKIHN0YXRpYyBhaGRfcGF0Y2hfZnVuY190IGFoZF9wYXRjaDIwX2Z1bmM7CkBAIC04MTUsNyArODUxLDcgQEAKIHN0YXRpYyBpbnQKIGFoZF9wYXRjaDIwX2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQogewotCXJldHVybiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfUlRJKSA9PSAwKTsKKwlyZXR1cm4gKChhaGQtPmZsYWdzICYgQUhEX1RBUkdFVFJPTEUpICE9IDApOwogfQogCiBzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gxOV9mdW5jOwpAQCAtODIzLDcgKzg1OSw3IEBACiBzdGF0aWMgaW50CiBhaGRfcGF0Y2gxOV9mdW5jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKIHsKLQlyZXR1cm4gKChhaGQtPmZsYWdzICYgQUhEX0lOSVRJQVRPUlJPTEUpICE9IDApOworCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9BVVRPRkxVU0hfQlVHKSAhPSAwKTsKIH0KIAogc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoMThfZnVuYzsKQEAgLTgzMSw3ICs4NjcsNyBAQAogc3RhdGljIGludAogYWhkX3BhdGNoMThfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCiB7Ci0JcmV0dXJuICgoYWhkLT5mbGFncyAmIEFIRF9UQVJHRVRST0xFKSAhPSAwKTsKKwlyZXR1cm4gKChhaGQtPmZlYXR1cmVzICYgQUhEX05FV19ERkNOVFJMX09QVFMpICE9IDApOwogfQogCiBzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gxN19mdW5jOwpAQCAtODM5LDcgKzg3NSw3IEBACiBzdGF0aWMgaW50CiBhaGRfcGF0Y2gxN19mdW5jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKIHsKLQlyZXR1cm4gKChhaGQtPmJ1Z3MgJiBBSERfQVVUT0ZMVVNIX0JVRykgIT0gMCk7CisJcmV0dXJuICgoYWhkLT5mbGFncyAmIEFIRF8zOUJJVF9BRERSRVNTSU5HKSAhPSAwKTsKIH0KIAogc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoMTZfZnVuYzsKQEAgLTg0Nyw3ICs4ODMsNyBAQAogc3RhdGljIGludAogYWhkX3BhdGNoMTZfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCiB7Ci0JcmV0dXJuICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9ORVdfREZDTlRSTF9PUFRTKSAhPSAwKTsKKwlyZXR1cm4gKChhaGQtPmZsYWdzICYgQUhEXzY0QklUX0FERFJFU1NJTkcpICE9IDApOwogfQogCiBzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gxNV9mdW5jOwpAQCAtODU1LDcgKzg5MSw3IEBACiBzdGF0aWMgaW50CiBhaGRfcGF0Y2gxNV9mdW5jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKIHsKLQlyZXR1cm4gKChhaGQtPmZsYWdzICYgQUhEXzM5QklUX0FERFJFU1NJTkcpICE9IDApOworCXJldHVybiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfTkVXX0RGQ05UUkxfT1BUUykgPT0gMCk7CiB9CiAKIHN0YXRpYyBhaGRfcGF0Y2hfZnVuY190IGFoZF9wYXRjaDE0X2Z1bmM7CkBAIC04NjMsNyArODk5LDcgQEAKIHN0YXRpYyBpbnQKIGFoZF9wYXRjaDE0X2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQogewotCXJldHVybiAoKGFoZC0+ZmxhZ3MgJiBBSERfNjRCSVRfQUREUkVTU0lORykgIT0gMCk7CisJcmV0dXJuICgoYWhkLT5idWdzICYgQUhEX1JFR19TTE9XX1NFVFRMRV9CVUcpICE9IDApOwogfQogCiBzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gxM19mdW5jOwpAQCAtODcxLDcgKzkwNyw3IEBACiBzdGF0aWMgaW50CiBhaGRfcGF0Y2gxM19mdW5jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKIHsKLQlyZXR1cm4gKChhaGQtPmZlYXR1cmVzICYgQUhEX05FV19ERkNOVFJMX09QVFMpID09IDApOworCXJldHVybiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfUlRJKSA9PSAwKTsKIH0KIAogc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoMTJfZnVuYzsKQEAgLTg3OSw3ICs5MTUsNyBAQAogc3RhdGljIGludAogYWhkX3BhdGNoMTJfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCiB7Ci0JcmV0dXJuICgoYWhkLT5idWdzICYgQUhEX1JFR19TTE9XX1NFVFRMRV9CVUcpICE9IDApOworCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9FQVJMWV9SRVFfQlVHKSAhPSAwKTsKIH0KIAogc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoMTFfZnVuYzsKQEAgLTg4Nyw3ICs5MjMsNyBAQAogc3RhdGljIGludAogYWhkX3BhdGNoMTFfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCiB7Ci0JcmV0dXJuICgoYWhkLT5idWdzICYgQUhEX0VBUkxZX1JFUV9CVUcpICE9IDApOworCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9CVVNGUkVFUkVWX0JVRykgPT0gMCk7CiB9CiAKIHN0YXRpYyBhaGRfcGF0Y2hfZnVuY190IGFoZF9wYXRjaDEwX2Z1bmM7CkBAIC04OTUsNyArOTMxLDcgQEAKIHN0YXRpYyBpbnQKIGFoZF9wYXRjaDEwX2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQogewotCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9CVVNGUkVFUkVWX0JVRykgPT0gMCk7CisJcmV0dXJuICgoYWhkLT5mbGFncyAmIEFIRF9TRVFVRU5DRVJfREVCVUcpICE9IDApOwogfQogCiBzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2g5X2Z1bmM7CkBAIC05MDMsNyArOTM5LDcgQEAKIHN0YXRpYyBpbnQKIGFoZF9wYXRjaDlfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCiB7Ci0JcmV0dXJuICgoYWhkLT5mbGFncyAmIEFIRF9TRVFVRU5DRVJfREVCVUcpICE9IDApOworCXJldHVybiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfRkFTVF9DREJfREVMSVZFUlkpICE9IDApOwogfQogCiBzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2g4X2Z1bmM7CkBAIC05OTIsMTQ3ICsxMDI4LDE0OSBAQAogCXsgYWhkX3BhdGNoMF9mdW5jLCA1LCAxLCAxIH0sCiAJeyBhaGRfcGF0Y2gyX2Z1bmMsIDYsIDEsIDIgfSwKIAl7IGFoZF9wYXRjaDBfZnVuYywgNywgMSwgMSB9LAotCXsgYWhkX3BhdGNoM19mdW5jLCAyMCwgNSwgMSB9LAotCXsgYWhkX3BhdGNoMl9mdW5jLCAyOSwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCAzMCwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMV9mdW5jLCAzNywgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCAzOCwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMl9mdW5jLCA0MywgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCA0NCwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMl9mdW5jLCA0NywgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCA0OCwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMl9mdW5jLCA1MSwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCA1MiwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMl9mdW5jLCA2NSwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCA2NiwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMl9mdW5jLCA2OSwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCA3MCwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMV9mdW5jLCA3MywgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCA3NCwgMSwgMSB9LAotCXsgYWhkX3BhdGNoNF9mdW5jLCAxMDcsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDJfZnVuYywgMTYyLCA2LCAxIH0sCi0JeyBhaGRfcGF0Y2gxX2Z1bmMsIDE2OCwgMiwgMSB9LAotCXsgYWhkX3BhdGNoNV9mdW5jLCAxNzAsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDJfZnVuYywgMTc5LCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDE4MCwgMSwgMSB9LAotCXsgYWhkX3BhdGNoNl9mdW5jLCAxODEsIDIsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgMTgzLCA2LCAzIH0sCi0JeyBhaGRfcGF0Y2gyX2Z1bmMsIDE4NiwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCAxODcsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDJfZnVuYywgMTkwLCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDE5MSwgMSwgMSB9LAotCXsgYWhkX3BhdGNoN19mdW5jLCAxOTMsIDIsIDEgfSwKLQl7IGFoZF9wYXRjaDVfZnVuYywgMjAxLCAxNiwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCAyMTcsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDhfZnVuYywgMjM3LCAyLCAxIH0sCi0JeyBhaGRfcGF0Y2gxX2Z1bmMsIDI0MSwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCAyNDIsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDdfZnVuYywgMjQ1LCAyLCAxIH0sCi0JeyBhaGRfcGF0Y2gxX2Z1bmMsIDI1OSwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCAyNjAsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDFfZnVuYywgMjYzLCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDI2NCwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMl9mdW5jLCAyNjcsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgMjY4LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gxX2Z1bmMsIDMyMywgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCAzMjQsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDJfZnVuYywgMzMyLCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDMzMywgMSwgMSB9LAotCXsgYWhkX3BhdGNoMl9mdW5jLCAzMzYsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgMzM3LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gxX2Z1bmMsIDM0MywgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCAzNDQsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDFfZnVuYywgMzQ2LCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDM0NywgMSwgMSB9LAotCXsgYWhkX3BhdGNoOV9mdW5jLCAzNjYsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDlfZnVuYywgMzY5LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2g5X2Z1bmMsIDM3MSwgMSwgMSB9LAotCXsgYWhkX3BhdGNoOV9mdW5jLCAzODMsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDFfZnVuYywgMzkzLCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDM5NCwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMV9mdW5jLCAzOTYsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgMzk3LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gxX2Z1bmMsIDQwNSwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCA0MDYsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDJfZnVuYywgNDE5LCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDQyMCwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMTBfZnVuYywgNDUwLCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gxX2Z1bmMsIDQ1NywgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCA0NTgsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDJfZnVuYywgNDcwLCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDQ3MSwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMTFfZnVuYywgNDc2LCA2LCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDQ4MiwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMTJfZnVuYywgNTA1LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gxM19mdW5jLCA1MTQsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDE0X2Z1bmMsIDUxNSwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCA1MTYsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDE1X2Z1bmMsIDUxOSwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMTRfZnVuYywgNTIwLCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gxNl9mdW5jLCA1MzEsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNTMyLCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gxX2Z1bmMsIDU1MSwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCA1NTIsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDFfZnVuYywgNTU1LCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDU1NiwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMl9mdW5jLCA1NjEsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNTYyLCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gyX2Z1bmMsIDU2NiwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCA1NjcsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDFfZnVuYywgNTY4LCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDU2OSwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMl9mdW5jLCA1ODAsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNTgxLCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gxN19mdW5jLCA1ODUsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDE4X2Z1bmMsIDU5MCwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMTlfZnVuYywgNTkxLCAyLCAxIH0sCi0JeyBhaGRfcGF0Y2gxOF9mdW5jLCA1OTUsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNTk2LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gyX2Z1bmMsIDU5OSwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCA2MDAsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDJfZnVuYywgNjE1LCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDYxNiwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMjBfZnVuYywgNjE3LCAxNCwgMSB9LAotCXsgYWhkX3BhdGNoMV9mdW5jLCA2MzUsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNjM2LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gyMF9mdW5jLCA2MzcsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDFfZnVuYywgNjQ5LCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDY1MCwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMV9mdW5jLCA2NTcsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNjU4LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gxN19mdW5jLCA2ODEsIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDE3X2Z1bmMsIDcxOSwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMV9mdW5jLCA3MzAsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNzMxLCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gxX2Z1bmMsIDc0OCwgMSwgMiB9LAotCXsgYWhkX3BhdGNoMF9mdW5jLCA3NDksIDEsIDEgfSwKLQl7IGFoZF9wYXRjaDFfZnVuYywgNzUxLCAxLCAyIH0sCi0JeyBhaGRfcGF0Y2gwX2Z1bmMsIDc1MiwgMSwgMSB9LAotCXsgYWhkX3BhdGNoMV9mdW5jLCA3NTUsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNzU2LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gyMV9mdW5jLCA3NTgsIDEsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNzU5LCAyLCAxIH0sCi0JeyBhaGRfcGF0Y2gyMl9mdW5jLCA3NjIsIDQsIDIgfSwKLQl7IGFoZF9wYXRjaDBfZnVuYywgNzY2LCAxLCAxIH0sCi0JeyBhaGRfcGF0Y2gyMl9mdW5jLCA3NzQsIDExLCAxIH0KKwl7IGFoZF9wYXRjaDNfZnVuYywgMzYsIDUsIDEgfSwKKwl7IGFoZF9wYXRjaDJfZnVuYywgNDUsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNDYsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgNTMsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNTQsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDJfZnVuYywgNTksIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNjAsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDJfZnVuYywgNjMsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNjQsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDJfZnVuYywgNjcsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNjgsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDRfZnVuYywgMTE2LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDE3NSwgMywgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCAxNzgsIDIsIDEgfSwKKwl7IGFoZF9wYXRjaDVfZnVuYywgMTgwLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDE4OSwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCAxOTAsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDZfZnVuYywgMTkxLCAyLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDE5MywgNiwgMyB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCAxOTYsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMTk3LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDIwMCwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCAyMDEsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDNfZnVuYywgMjAzLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2g3X2Z1bmMsIDIwNCwgMywgMSB9LAorCXsgYWhkX3BhdGNoM19mdW5jLCAyMTMsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDVfZnVuYywgMjE0LCAxNiwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCAyMzAsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDhfZnVuYywgMjUwLCAyLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDI1NCwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCAyNTUsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDdfZnVuYywgMjU4LCAzLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDI3MywgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCAyNzQsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgMjc3LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDI3OCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCAyODEsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMjgyLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2g5X2Z1bmMsIDI5NSwgMiwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCAyOTcsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgMzM5LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDM0MCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCAzNDgsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMzQ5LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDM1MiwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCAzNTMsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgMzU5LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDM2MCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCAzNjIsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMzYzLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxMF9mdW5jLCAzODIsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDEwX2Z1bmMsIDM4NSwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMTBfZnVuYywgMzg3LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxMF9mdW5jLCAzOTksIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgNDA5LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDQxMCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCA0MTIsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNDEzLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDQyMSwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA0MjIsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDJfZnVuYywgNDM1LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDQzNiwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMTFfZnVuYywgNDcyLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDQ4MCwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA0ODEsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDJfZnVuYywgNDkzLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDQ5NCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMTJfZnVuYywgNDk3LCA2LCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDUwMywgMSwgMSB9LAorCXsgYWhkX3BhdGNoMTNfZnVuYywgNTI0LCA3LCAxIH0sCisJeyBhaGRfcGF0Y2gxNF9mdW5jLCA1MzMsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDE1X2Z1bmMsIDU0MiwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMTZfZnVuYywgNTQzLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDU0NCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMTdfZnVuYywgNTQ3LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxNl9mdW5jLCA1NDgsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDE4X2Z1bmMsIDU1OSwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA1NjAsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgNTc5LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDU4MCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCA1ODMsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNTg0LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDU4OSwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA1OTAsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDJfZnVuYywgNTk0LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDU5NSwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCA1OTYsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNTk3LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDYwOCwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA2MDksIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDE5X2Z1bmMsIDYxMywgMSwgMSB9LAorCXsgYWhkX3BhdGNoMjBfZnVuYywgNjE4LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyMV9mdW5jLCA2MTksIDIsIDEgfSwKKwl7IGFoZF9wYXRjaDIwX2Z1bmMsIDYyMywgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA2MjQsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDJfZnVuYywgNjI3LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDYyOCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCA2NDMsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNjQ0LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxM19mdW5jLCA2NDUsIDE0LCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDY2MywgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA2NjQsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDEzX2Z1bmMsIDY2NSwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCA2NzcsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNjc4LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDY4NSwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA2ODYsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDE5X2Z1bmMsIDcwOSwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMTlfZnVuYywgNzQ3LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDc1OCwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA3NTksIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgNzc2LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDc3NywgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCA3NzksIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNzgwLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDc4MywgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA3ODQsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDIyX2Z1bmMsIDc4NiwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA3ODcsIDIsIDEgfSwKKwl7IGFoZF9wYXRjaDIzX2Z1bmMsIDc5MCwgNCwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA3OTQsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDIzX2Z1bmMsIDgwMiwgMTEsIDEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBjcyB7CiAJdWludDE2X3QJYmVnaW47CiAJdWludDE2X3QJZW5kOwogfSBjcml0aWNhbF9zZWN0aW9uc1tdID0gewotCXsgMTEsIDEyIH0sCi0JeyAxMywgMTQgfSwKLQl7IDI5LCA0MiB9LAotCXsgNTYsIDU5IH0sCi0JeyAxMDEsIDEyOCB9LAotCXsgMTI5LCAxNTcgfSwKLQl7IDE1OSwgMTYyIH0sCi0JeyAxNzAsIDE3OCB9LAotCXsgMjAxLCAyNTAgfSwKLQl7IDY4MSwgNjk3IH0sCi0JeyA2OTcsIDcxMSB9LAotCXsgNzIxLCA3MjUgfQorCXsgMTcsIDI4IH0sCisJeyAyOSwgMzAgfSwKKwl7IDQ3LCA1OCB9LAorCXsgNjEsIDYzIH0sCisJeyA2NSwgNjYgfSwKKwl7IDcyLCA5MiB9LAorCXsgMTEwLCAxMzcgfSwKKwl7IDEzOCwgMTc1IH0sCisJeyAxODAsIDE4OCB9LAorCXsgMjEzLCAyNjQgfSwKKwl7IDQyNSwgNDMzIH0sCisJeyA0NDMsIDQ0NSB9LAorCXsgNDQ4LCA0NTcgfSwKKwl7IDcwOSwgNzM5IH0sCisJeyA3NDksIDc1MyB9CiB9OwogCiBzdGF0aWMgY29uc3QgaW50IG51bV9jcml0aWNhbF9zZWN0aW9ucyA9IHNpemVvZihjcml0aWNhbF9zZWN0aW9ucykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5jCmluZGV4IGZkMzg5ZTkuLjA1MTk3MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uYwpAQCAtMzc1LDcgKzM3NSw3IEBACiAJCQkJCSBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOwogc3RhdGljIHZvaWQgYWhjX2xpbnV4X3NlbV90aW1lb3V0KHVfbG9uZyBhcmcpOwogc3RhdGljIHZvaWQgYWhjX2xpbnV4X2ZyZWV6ZV9zaW1xKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7Ci1zdGF0aWMgdm9pZCBhaGNfbGludXhfcmVsZWFzZV9zaW1xKHVfbG9uZyBhcmcpOworc3RhdGljIHZvaWQgYWhjX2xpbnV4X3JlbGVhc2Vfc2ltcShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOwogc3RhdGljIGludCAgYWhjX2xpbnV4X3F1ZXVlX3JlY292ZXJ5X2NtZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHNjYl9mbGFnIGZsYWcpOwogc3RhdGljIHZvaWQgYWhjX2xpbnV4X2luaXRpYWxpemVfc2NzaV9idXMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKIHN0YXRpYyB1X2ludCBhaGNfbGludXhfdXNlcl90YWdkZXB0aChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCkBAIC0xMDczLDcgKzEwNzMsNiBAQAogCQlyZXR1cm4gKEVOT01FTSk7CiAKIAkqKChzdHJ1Y3QgYWhjX3NvZnRjICoqKWhvc3QtPmhvc3RkYXRhKSA9IGFoYzsKLQlhaGNfbG9jayhhaGMsICZzKTsKIAlhaGMtPnBsYXRmb3JtX2RhdGEtPmhvc3QgPSBob3N0OwogCWhvc3QtPmNhbl9xdWV1ZSA9IEFIQ19NQVhfUVVFVUU7CiAJaG9zdC0+Y21kX3Blcl9sdW4gPSAyOwpAQCAtMTA4NCw3ICsxMDgzLDkgQEAKIAlob3N0LT5tYXhfbHVuID0gQUhDX05VTV9MVU5TOwogCWhvc3QtPm1heF9jaGFubmVsID0gKGFoYy0+ZmVhdHVyZXMgJiBBSENfVFdJTikgPyAxIDogMDsKIAlob3N0LT5zZ190YWJsZXNpemUgPSBBSENfTlNFRzsKKwlhaGNfbG9jayhhaGMsICZzKTsKIAlhaGNfc2V0X3VuaXQoYWhjLCBhaGNfbGludXhfdW5pdCsrKTsKKwlhaGNfdW5sb2NrKGFoYywgJnMpOwogCXNwcmludGYoYnVmLCAic2NzaSVkIiwgaG9zdC0+aG9zdF9ubyk7CiAJbmV3X25hbWUgPSBtYWxsb2Moc3RybGVuKGJ1ZikgKyAxLCBNX0RFVkJVRiwgTV9OT1dBSVQpOwogCWlmIChuZXdfbmFtZSAhPSBOVUxMKSB7CkBAIC0xMDk0LDcgKzEwOTUsNiBAQAogCWhvc3QtPnVuaXF1ZV9pZCA9IGFoYy0+dW5pdDsKIAlhaGNfbGludXhfaW5pdGlhbGl6ZV9zY3NpX2J1cyhhaGMpOwogCWFoY19pbnRyX2VuYWJsZShhaGMsIFRSVUUpOwotCWFoY191bmxvY2soYWhjLCAmcyk7CiAKIAlob3N0LT50cmFuc3BvcnR0ID0gYWhjX2xpbnV4X3RyYW5zcG9ydF90ZW1wbGF0ZTsKIApAQCAtMTEyMCwxMCArMTEyMCwxMyBAQAogewogCWludCBpOwogCWludCBudW10YXJnOworCXVuc2lnbmVkIGxvbmcgczsKIAogCWkgPSAwOwogCW51bXRhcmcgPSAwOwogCisJYWhjX2xvY2soYWhjLCAmcyk7CisKIAlpZiAoYWljN3h4eF9ub19yZXNldCAhPSAwKQogCQlhaGMtPmZsYWdzICY9IH4oQUhDX1JFU0VUX0JVU19BfEFIQ19SRVNFVF9CVVNfQik7CiAKQEAgLTExNzAsMTYgKzExNzMsMTIgQEAKIAkJYWhjX3VwZGF0ZV9uZWdfcmVxdWVzdChhaGMsICZkZXZpbmZvLCB0c3RhdGUsCiAJCQkJICAgICAgIHRpbmZvLCBBSENfTkVHX0FMV0FZUyk7CiAJfQorCWFoY191bmxvY2soYWhjLCAmcyk7CiAJLyogR2l2ZSB0aGUgYnVzIHNvbWUgdGltZSB0byByZWNvdmVyICovCiAJaWYgKChhaGMtPmZsYWdzICYgKEFIQ19SRVNFVF9CVVNfQXxBSENfUkVTRVRfQlVTX0IpKSAhPSAwKSB7CiAJCWFoY19saW51eF9mcmVlemVfc2ltcShhaGMpOwotCQlpbml0X3RpbWVyKCZhaGMtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyKTsKLQkJYWhjLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lci5kYXRhID0gKHVfbG9uZylhaGM7Ci0JCWFoYy0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIuZXhwaXJlcyA9Ci0JCSAgICBqaWZmaWVzICsgKEFJQzdYWFhfUkVTRVRfREVMQVkgKiBIWikvMTAwMDsKLQkJYWhjLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lci5mdW5jdGlvbiA9Ci0JCSAgICBhaGNfbGludXhfcmVsZWFzZV9zaW1xOwotCQlhZGRfdGltZXIoJmFoYy0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIpOworCQltc2xlZXAoQUlDN1hYWF9SRVNFVF9ERUxBWSk7CisJCWFoY19saW51eF9yZWxlYXNlX3NpbXEoYWhjKTsKIAl9CiB9CiAKQEAgLTIwNTksNiArMjA1OCw5IEBACiBzdGF0aWMgdm9pZAogYWhjX2xpbnV4X2ZyZWV6ZV9zaW1xKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKIHsKKwl1bnNpZ25lZCBsb25nIHM7CisKKwlhaGNfbG9jayhhaGMsICZzKTsKIAlhaGMtPnBsYXRmb3JtX2RhdGEtPnFmcm96ZW4rKzsKIAlpZiAoYWhjLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuID09IDEpIHsKIAkJc2NzaV9ibG9ja19yZXF1ZXN0cyhhaGMtPnBsYXRmb3JtX2RhdGEtPmhvc3QpOwpAQCAtMjA2OCwxNyArMjA3MCwxNSBAQAogCQkJCQlDQU1fTFVOX1dJTERDQVJELCBTQ0JfTElTVF9OVUxMLAogCQkJCQlST0xFX0lOSVRJQVRPUiwgQ0FNX1JFUVVFVUVfUkVRKTsKIAl9CisJYWhjX3VubG9jayhhaGMsICZzKTsKIH0KIAogc3RhdGljIHZvaWQKLWFoY19saW51eF9yZWxlYXNlX3NpbXEodV9sb25nIGFyZykKK2FoY19saW51eF9yZWxlYXNlX3NpbXEoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQogewotCXN0cnVjdCBhaGNfc29mdGMgKmFoYzsKIAl1X2xvbmcgczsKIAlpbnQgICAgdW5ibG9ja19yZXFzOwogCi0JYWhjID0gKHN0cnVjdCBhaGNfc29mdGMgKilhcmc7Ci0KIAl1bmJsb2NrX3JlcXMgPSAwOwogCWFoY19sb2NrKGFoYywgJnMpOwogCWlmIChhaGMtPnBsYXRmb3JtX2RhdGEtPnFmcm96ZW4gPiAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmgKaW5kZXggZjJhOTU0NC4uZTBlZGFjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uaAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5oCkBAIC0yMjMsOSArMjIzLDYgQEAKICAqLwogI2RlZmluZSBhaGNfZG1hbWFwX3N5bmMoYWhjLCBkbWFfdGFnLCBkbWFtYXAsIG9mZnNldCwgbGVuLCBvcCkKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFRpbWVyIERhdGFTdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IHRpbWVyX2xpc3QgYWhjX3RpbWVyX3Q7Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQ09ORklHX0FJQzdYWFhfUkVHX1BSRVRUWV9QUklOVAogI2RlZmluZSBBSUNfREVCVUdfUkVHSVNURVJTIDEKQEAgLTIzNSwzMCArMjMyLDkgQEAKICNpbmNsdWRlICJhaWM3eHh4LmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBUaW1lciBGYWNpbGl0aWVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIGFoY190aW1lcl9pbml0IGluaXRfdGltZXIKLSNkZWZpbmUgYWhjX3RpbWVyX3N0b3AgZGVsX3RpbWVyX3N5bmMKLXR5cGVkZWYgdm9pZCBhaGNfbGludXhfY2FsbGJhY2tfdCAodV9sb25nKTsgIAotc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX3RpbWVyX3Jlc2V0KGFoY190aW1lcl90ICp0aW1lciwgaW50IHVzZWMsCi0JCQkJICAgICBhaGNfY2FsbGJhY2tfdCAqZnVuYywgdm9pZCAqYXJnKTsKLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoY19zY2JfdGltZXJfcmVzZXQoc3RydWN0IHNjYiAqc2NiLCB1X2ludCB1c2VjKTsKLQotc3RhdGljIF9faW5saW5lIHZvaWQKLWFoY190aW1lcl9yZXNldChhaGNfdGltZXJfdCAqdGltZXIsIGludCB1c2VjLCBhaGNfY2FsbGJhY2tfdCAqZnVuYywgdm9pZCAqYXJnKQotewotCXN0cnVjdCBhaGNfc29mdGMgKmFoYzsKLQotCWFoYyA9IChzdHJ1Y3QgYWhjX3NvZnRjICopYXJnOwotCWRlbF90aW1lcih0aW1lcik7Ci0JdGltZXItPmRhdGEgPSAodV9sb25nKWFyZzsKLQl0aW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyAodXNlYyAqIEhaKS8xMDAwMDAwOwotCXRpbWVyLT5mdW5jdGlvbiA9IChhaGNfbGludXhfY2FsbGJhY2tfdCopZnVuYzsKLQlhZGRfdGltZXIodGltZXIpOwotfQotCiBzdGF0aWMgX19pbmxpbmUgdm9pZAogYWhjX3NjYl90aW1lcl9yZXNldChzdHJ1Y3Qgc2NiICpzY2IsIHVfaW50IHVzZWMpCiB7Ci0JbW9kX3RpbWVyKCZzY2ItPmlvX2N0eC0+ZWhfdGltZW91dCwgamlmZmllcyArICh1c2VjICogSFopLzEwMDAwMDApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU01QIHN1cHBvcnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzkzLDcgKzM2OSw2IEBACiAKIAlzcGlubG9ja190CQkgc3Bpbl9sb2NrOwogCXVfaW50CQkJIHFmcm96ZW47Ci0Jc3RydWN0IHRpbWVyX2xpc3QJIHJlc2V0X3RpbWVyOwogCXN0cnVjdCBzZW1hcGhvcmUJIGVoX3NlbTsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICAgICAgICAqaG9zdDsJCS8qIHBvaW50ZXIgdG8gc2NzaSBob3N0ICovCiAjZGVmaW5lIEFIQ19MSU5VWF9OT0lSUQkoKHVpbnQzMl90KX4wKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wY2kuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcGNpLmMKaW5kZXggYjNiMmUyMi4uNWY1ODYxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wY2kuYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3BjaS5jCkBAIC0zOSw5ICszOSw3IEBACiAgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqCi0gKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHhfcGNpLmMjNjkgJAotICoKLSAqICRGcmVlQlNEJAorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4X3BjaS5jIzc5ICQKICAqLwogCiAjaWZkZWYgX19saW51eF9fCkBAIC0zOTMsNiArMzkxLDEyIEBACiAJCSJBZGFwdGVjIGFpYzc4OTIgVWx0cmExNjAgU0NTSSBhZGFwdGVyIChBUk8pIiwKIAkJYWhjX2FpYzc4OTJfc2V0dXAKIAl9LAorCXsKKwkJSURfQUhBXzI5MTVfMzBMUCwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDI5MTUvMzBMUCBVbHRyYTE2MCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg5Ml9zZXR1cAorCX0sCiAJLyogYWljNzg5NSBiYXNlZCBjb250cm9sbGVycyAqLwkKIAl7CiAJCUlEX0FIQV8yOTQwVV9EVUFMLApAQCAtMTE5Myw5ICsxMTk3LDE5IEBACiAJICogdXNlIGZvciB0aGlzIHRlc3QuCiAJICovCiAJaGNudHJsID0gYWhjX2luYihhaGMsIEhDTlRSTCk7CisKIAlpZiAoaGNudHJsID09IDB4RkYpCiAJCWdvdG8gZmFpbDsKIAorCWlmICgoaGNudHJsICYgQ0hJUFJTVCkgIT0gMCkgeworCQkvKgorCQkgKiBUaGUgY2hpcCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgc2luY2UKKwkJICogUENJL0VJU0EvVkxCIGJ1cyByZXNldC4gIERvbid0IHRydXN0CisJCSAqICJsZWZ0IG92ZXIgQklPUyBkYXRhIi4KKwkJICovCisJCWFoYy0+ZmxhZ3MgfD0gQUhDX05PX0JJT1NfSU5JVDsKKwl9CisKIAkvKgogCSAqIE5leHQgY3JlYXRlIGEgc2l0dWF0aW9uIHdoZXJlIHdyaXRlIGNvbWJpbmluZwogCSAqIG9yIHJlYWQgcHJlZmV0Y2hpbmcgY291bGQgYmUgaW5pdGlhdGVkIGJ5IHRoZQpAQCAtMTMwNyw2ICsxMzIxLDEwIEBACiAJCQlzZC5zZF9jaGlwID0gQzU2XzY2OwogCQl9CiAJCWFoY19yZWxlYXNlX3NlZXByb20oJnNkKTsKKworCQkvKiBSZW1lbWJlciB0aGUgU0VFUFJPTSB0eXBlIGZvciBsYXRlciAqLworCQlpZiAoc2Quc2RfY2hpcCA9PSBDNTZfNjYpCisJCQlhaGMtPmZsYWdzIHw9IEFIQ19MQVJHRV9TRUVQUk9NOwogCX0KIAogCWlmICghaGF2ZV9zZWVwcm9tKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3BjaS5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wY2kuaAppbmRleCBiZTI3ZmNiLi4yNjNmODVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3BjaS5oCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcGNpLmgKQEAgLTEwNSw2ICsxMDUsNyBAQAogI2RlZmluZSBJRF9BSEFfMjkxNjBDCQkJMHgwMDgwOTAwNTYyMjA5MDA1dWxsCiAjZGVmaW5lIElEX0FIQV8yOTE2MEIJCQkweDAwODA5MDA1RTIyMDkwMDV1bGwKICNkZWZpbmUgSURfQUhBXzE5MTYwQgkJCTB4MDA4MTkwMDU2MkExOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMjkxNV8zMExQCQkweDAwODI5MDA1MDIxMDkwMDV1bGwKIAogI2RlZmluZSBJRF9BSUM3ODk2CQkJMHgwMDVGOTAwNUZGRkY5MDA1dWxsCiAjZGVmaW5lIElEX0FJQzc4OTZfQVJPCQkJMHgwMDUzOTAwNUZGRkY5MDA1dWxsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eF9vbGQuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4X29sZC5jCmluZGV4IDMzZDU2YzMuLjc3MGYxNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4X29sZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4X29sZC5jCkBAIC0xMjkwLDcgKzEyOTAsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhcgorc3RhdGljIHVuc2lnbmVkIGNoYXIKIGFpY19pbmIoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgbG9uZyBwb3J0KQogewogI2lmZGVmIE1NQVBJTwpAQCAtMTMwOSw3ICsxMzA5LDcgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyB2b2lkCiBhaWNfb3V0YihzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCB1bnNpZ25lZCBjaGFyIHZhbCwgbG9uZyBwb3J0KQogewogI2lmZGVmIE1NQVBJTwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FybS9hY29ybnNjc2kuYyBiL2RyaXZlcnMvc2NzaS9hcm0vYWNvcm5zY3NpLmMKaW5kZXggMDllZDA1Ny4uZGRhNWE1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FybS9hY29ybnNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvYXJtL2Fjb3Juc2NzaS5jCkBAIC0xNDYsNyArMTQ2LDYgQEAKIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2VjYXJkLmg+CiAKICNpbmNsdWRlICIuLi9zY3NpLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL2FyeGVzY3NpLmMgYi9kcml2ZXJzL3Njc2kvYXJtL2FyeGVzY3NpLmMKaW5kZXggODA0MTI1ZS4uYTI4OTQwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FybS9hcnhlc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vYXJ4ZXNjc2kuYwpAQCAtMzMsNyArMzMsNiBAQAogCiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vZWNhcmQuaD4KIAogI2luY2x1ZGUgIi4uL3Njc2kuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hcm0vY3VtYW5hXzEuYyBiL2RyaXZlcnMvc2NzaS9hcm0vY3VtYW5hXzEuYwppbmRleCA4MWUyNjZiLi5lNmM5NDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYXJtL2N1bWFuYV8xLmMKKysrIGIvZHJpdmVycy9zY3NpL2FybS9jdW1hbmFfMS5jCkBAIC0xMyw3ICsxMyw2IEBACiAKICNpbmNsdWRlIDxhc20vZWNhcmQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiAjaW5jbHVkZSAiLi4vc2NzaS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FybS9jdW1hbmFfMi5jIGIvZHJpdmVycy9zY3NpL2FybS9jdW1hbmFfMi5jCmluZGV4IDNhN2E0NmIuLjU4M2QyZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hcm0vY3VtYW5hXzIuYworKysgYi9kcml2ZXJzL3Njc2kvYXJtL2N1bWFuYV8yLmMKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2VjYXJkLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAKICNpbmNsdWRlICIuLi9zY3NpLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL2Vlc294LmMgYi9kcml2ZXJzL3Njc2kvYXJtL2Vlc294LmMKaW5kZXggNGQxZThmNS4uM2ZmZWM3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FybS9lZXNveC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vZWVzb3guYwpAQCAtMzUsNyArMzUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9lY2FyZC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL3Bvd2VydGVjLmMgYi9kcml2ZXJzL3Njc2kvYXJtL3Bvd2VydGVjLmMKaW5kZXggMzMzM2Q3Yi4uMzExM2JkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FybS9wb3dlcnRlYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vcG93ZXJ0ZWMuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vZWNhcmQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KIAogI2luY2x1ZGUgIi4uL3Njc2kuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hdGFfcGlpeC5jIGIvZHJpdmVycy9zY3NpL2F0YV9waWl4LmMKaW5kZXggNTU3Nzg4ZS4uZmMzY2EwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2F0YV9waWl4LmMKKysrIGIvZHJpdmVycy9zY3NpL2F0YV9waWl4LmMKQEAgLTE1Nyw2ICsxNTcsOSBAQAogCXsgMHg4MDg2LCAweDI3YzAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDZfc2F0YV9haGNpIH0sCiAJeyAweDgwODYsIDB4MjdjNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoNl9zYXRhX2FoY2kgfSwKIAl7IDB4ODA4NiwgMHgyNjgwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBpY2g2X3NhdGFfYWhjaSB9LAorCXsgMHg4MDg2LCAweDI4MjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDZfc2F0YV9haGNpIH0sCisJeyAweDgwODYsIDB4MjgyNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoNl9zYXRhX2FoY2kgfSwKKwl7IDB4ODA4NiwgMHgyODI4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBpY2g2X3NhdGFfYWhjaSB9LAogCiAJeyB9CS8qIHRlcm1pbmF0ZSBsaXN0ICovCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JsejEyMzAuYyBiL2RyaXZlcnMvc2NzaS9ibHoxMjMwLmMKaW5kZXggNzYzZTQwOS4uMzg2N2FjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JsejEyMzAuYworKysgYi9kcml2ZXJzL3Njc2kvYmx6MTIzMC5jCkBAIC0yMjQsNyArMjI0LDcgQEAKIHN0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApCiB7CiAJRVNQTE9HKCgiaW50cmVxOjwlMDR4PiwgaW50ZW5hOjwlMDR4PlxuIiwKLQkJY3VzdG9tLmludHJlcXIsIGN1c3RvbS5pbnRlbmFyKSk7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXFyLCBhbWlnYV9jdXN0b20uaW50ZW5hcikpOwogfQogCiB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCkKQEAgLTI5OCw3ICsyOTgsNyBAQAogCiBzdGF0aWMgaW50IGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApCiB7Ci0JcmV0dXJuICgoY3VzdG9tLmludGVuYXIpICYgSUZfUE9SVFMpOworCXJldHVybiAoKGFtaWdhX2N1c3RvbS5pbnRlbmFyKSAmIElGX1BPUlRTKTsKIH0KIAogc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JsejIwNjAuYyBiL2RyaXZlcnMvc2NzaS9ibHoyMDYwLmMKaW5kZXggZDcyZDA1Zi4uNGViZTY5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JsejIwNjAuYworKysgYi9kcml2ZXJzL3Njc2kvYmx6MjA2MC5jCkBAIC0xOTAsNyArMTkwLDcgQEAKIHN0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApCiB7CiAJRVNQTE9HKCgiaW50cmVxOjwlMDR4PiwgaW50ZW5hOjwlMDR4PlxuIiwKLQkJY3VzdG9tLmludHJlcXIsIGN1c3RvbS5pbnRlbmFyKSk7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXFyLCBhbWlnYV9jdXN0b20uaW50ZW5hcikpOwogfQogCiBzdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpCkBAIC0yNTEsNyArMjUxLDcgQEAKIAogc3RhdGljIGludCBkbWFfcG9ydHNfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQogewotCXJldHVybiAoKGN1c3RvbS5pbnRlbmFyKSAmIElGX1BPUlRTKTsKKwlyZXR1cm4gKChhbWlnYV9jdXN0b20uaW50ZW5hcikgJiBJRl9QT1JUUyk7CiB9CiAKIHN0YXRpYyB2b2lkIGRtYV9zZXR1cChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jaC5jIGIvZHJpdmVycy9zY3NpL2NoLmMKaW5kZXggMDkyMDIyMC4uYzNmMjcyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2NoLmMKKysrIGIvZHJpdmVycy9zY3NpL2NoLmMKQEAgLTIwLDkgKzIwLDkgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9jdGwzMi5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NoaW8uaD4JCQkvKiBoZXJlIGFyZSBhbGwgdGhlIGlvY3RscyAqLworI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgpAQCAtMTEyLDcgKzExMiw3IEBACiAJdV9pbnQgICAgICAgICAgICAgICBjb3VudHNbQ0hfVFlQRVNdOwogCXVfaW50ICAgICAgICAgICAgICAgdW5pdF9hdHRlbnRpb247CiAJdV9pbnQJCSAgICB2b2x0YWdzOwotCXN0cnVjdCBzZW1hcGhvcmUgICAgbG9jazsKKwlzdHJ1Y3QgbXV0ZXgJICAgIGxvY2s7CiB9IHNjc2lfY2hhbmdlcjsKIAogc3RhdGljIExJU1RfSEVBRChjaF9kZXZsaXN0KTsKQEAgLTU2Niw3ICs1NjYsNyBAQAogCXVfY2hhciBkYXRhWzE2XTsKIAl1bnNpZ25lZCBpbnQgaTsKIAkKLQlkb3duKCZjaC0+bG9jayk7CisJbXV0ZXhfbG9jaygmY2gtPmxvY2spOwogCWZvciAoaSA9IDA7IGkgPCBjaC0+Y291bnRzW3R5cGVdOyBpKyspIHsKIAkJaWYgKDAgIT0gY2hfcmVhZF9lbGVtZW50X3N0YXR1cwogCQkgICAgKGNoLCBjaC0+Zmlyc3RzW3R5cGVdK2ksZGF0YSkpIHsKQEAgLTU4Myw3ICs1ODMsNyBAQAogCQlpZiAoMCAhPSByZXR2YWwpCiAJCQlicmVhazsKIAl9Ci0JdXAoJmNoLT5sb2NrKTsKKwltdXRleF91bmxvY2soJmNoLT5sb2NrKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC02ODgsMTEgKzY4OCwxMSBAQAogCQkJZHByaW50aygiQ0hJT1BPU0lUSU9OOiBpbnZhbGlkIHBhcmFtZXRlclxuIik7CiAJCQlyZXR1cm4gLUVCQURTTFQ7CiAJCX0KLQkJZG93bigmY2gtPmxvY2spOworCQltdXRleF9sb2NrKCZjaC0+bG9jayk7CiAJCXJldHZhbCA9IGNoX3Bvc2l0aW9uKGNoLDAsCiAJCQkJICAgICBjaC0+Zmlyc3RzW3Bvcy5jcF90eXBlXSArIHBvcy5jcF91bml0LAogCQkJCSAgICAgcG9zLmNwX2ZsYWdzICYgQ1BfSU5WRVJUKTsKLQkJdXAoJmNoLT5sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZjaC0+bG9jayk7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCQpAQCAtNzA5LDEyICs3MDksMTIgQEAKIAkJCXJldHVybiAtRUJBRFNMVDsKIAkJfQogCQkKLQkJZG93bigmY2gtPmxvY2spOworCQltdXRleF9sb2NrKCZjaC0+bG9jayk7CiAJCXJldHZhbCA9IGNoX21vdmUoY2gsMCwKIAkJCQkgY2gtPmZpcnN0c1ttdi5jbV9mcm9tdHlwZV0gKyBtdi5jbV9mcm9tdW5pdCwKIAkJCQkgY2gtPmZpcnN0c1ttdi5jbV90b3R5cGVdICAgKyBtdi5jbV90b3VuaXQsCiAJCQkJIG12LmNtX2ZsYWdzICYgQ01fSU5WRVJUKTsKLQkJdXAoJmNoLT5sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZjaC0+bG9jayk7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCkBAIC03MzIsMTQgKzczMiwxNCBAQAogCQkJcmV0dXJuIC1FQkFEU0xUOwogCQl9CiAJCQotCQlkb3duKCZjaC0+bG9jayk7CisJCW11dGV4X2xvY2soJmNoLT5sb2NrKTsKIAkJcmV0dmFsID0gY2hfZXhjaGFuZ2UKIAkJCShjaCwwLAogCQkJIGNoLT5maXJzdHNbbXYuY2Vfc3JjdHlwZV0gICsgbXYuY2Vfc3JjdW5pdCwKIAkJCSBjaC0+Zmlyc3RzW212LmNlX2Zkc3R0eXBlXSArIG12LmNlX2Zkc3R1bml0LAogCQkJIGNoLT5maXJzdHNbbXYuY2Vfc2RzdHR5cGVdICsgbXYuY2Vfc2RzdHVuaXQsCiAJCQkgbXYuY2VfZmxhZ3MgJiBDRV9JTlZFUlQxLCBtdi5jZV9mbGFncyAmIENFX0lOVkVSVDIpOwotCQl1cCgmY2gtPmxvY2spOworCQltdXRleF91bmxvY2soJmNoLT5sb2NrKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKQEAgLTc3Myw3ICs3NzMsNyBAQAogCQlidWZmZXIgPSBrbWFsbG9jKDUxMiwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwogCQlpZiAoIWJ1ZmZlcikKIAkJCXJldHVybiAtRU5PTUVNOwotCQlkb3duKCZjaC0+bG9jayk7CisJCW11dGV4X2xvY2soJmNoLT5sb2NrKTsKIAkJCiAJdm9sdGFnX3JldHJ5OgogCQltZW1zZXQoY21kLDAsc2l6ZW9mKGNtZCkpOwpAQCAtODI0LDcgKzgyNCw3IEBACiAJCQlnb3RvIHZvbHRhZ19yZXRyeTsKIAkJfQogCQlrZnJlZShidWZmZXIpOwotCQl1cCgmY2gtPmxvY2spOworCQltdXRleF91bmxvY2soJmNoLT5sb2NrKTsKIAkJCiAJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNnZSwgc2l6ZW9mIChjZ2UpKSkKIAkJCXJldHVybiAtRUZBVUxUOwpAQCAtODMzLDkgKzgzMyw5IEBACiAKIAljYXNlIENISU9JTklURUxFTToKIAl7Ci0JCWRvd24oJmNoLT5sb2NrKTsKKwkJbXV0ZXhfbG9jaygmY2gtPmxvY2spOwogCQlyZXR2YWwgPSBjaF9pbml0X2VsZW0oY2gpOwotCQl1cCgmY2gtPmxvY2spOworCQltdXRleF91bmxvY2soJmNoLT5sb2NrKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAJCQpAQCAtODUyLDEyICs4NTIsMTIgQEAKIAkJCXJldHVybiAtRUJBRFNMVDsKIAkJfQogCQllbGVtID0gY2gtPmZpcnN0c1tjc3YuY3N2X3R5cGVdICsgY3N2LmNzdl91bml0OwotCQlkb3duKCZjaC0+bG9jayk7CisJCW11dGV4X2xvY2soJmNoLT5sb2NrKTsKIAkJcmV0dmFsID0gY2hfc2V0X3ZvbHRhZyhjaCwgZWxlbSwKIAkJCQkgICAgICAgY3N2LmNzdl9mbGFncyAmIENTVl9BVk9MVEFHLAogCQkJCSAgICAgICBjc3YuY3N2X2ZsYWdzICYgQ1NWX0NMRUFSVEFHLAogCQkJCSAgICAgICBjc3YuY3N2X3ZvbHRhZyk7Ci0JCXVwKCZjaC0+bG9jayk7CisJCW11dGV4X3VubG9jaygmY2gtPmxvY2spOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KIApAQCAtOTMwLDcgKzkzMCw3IEBACiAJbWVtc2V0KGNoLDAsc2l6ZW9mKCpjaCkpOwogCWNoLT5taW5vciA9IGNoX2RldmNvdW50OwogCXNwcmludGYoY2gtPm5hbWUsImNoJWQiLGNoLT5taW5vcik7Ci0JaW5pdF9NVVRFWCgmY2gtPmxvY2spOworCW11dGV4X2luaXQoJmNoLT5sb2NrKTsKIAljaC0+ZGV2aWNlID0gc2Q7CiAJY2hfcmVhZGNvbmZpZyhjaCk7CiAJaWYgKGluaXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3liZXJzdG9ybS5jIGIvZHJpdmVycy9zY3NpL2N5YmVyc3Rvcm0uYwppbmRleCBmOWI5NDBlLi5hNGE0ZmFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvY3liZXJzdG9ybS5jCisrKyBiL2RyaXZlcnMvc2NzaS9jeWJlcnN0b3JtLmMKQEAgLTIyMyw3ICsyMjMsNyBAQAogCQllc3AtPmVzcF9pZCwgKChzdHJ1Y3QgY3liZXJfZG1hX3JlZ2lzdGVycyAqKQogCQkJICAgICAgKGVzcC0+ZHJlZ3MpKS0+Y29uZF9yZWcpKTsKIAlFU1BMT0coKCJpbnRyZXE6PCUwNHg+LCBpbnRlbmE6PCUwNHg+XG4iLAotCQljdXN0b20uaW50cmVxciwgY3VzdG9tLmludGVuYXIpKTsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcXIsIGFtaWdhX2N1c3RvbS5pbnRlbmFyKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCkKQEAgLTMyMiw3ICszMjIsNyBAQAogCiBzdGF0aWMgaW50IGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApCiB7Ci0JcmV0dXJuICgoY3VzdG9tLmludGVuYXIpICYgSUZfUE9SVFMpOworCXJldHVybiAoKGFtaWdhX2N1c3RvbS5pbnRlbmFyKSAmIElGX1BPUlRTKTsKIH0KIAogc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2N5YmVyc3Rvcm1JSS5jIGIvZHJpdmVycy9zY3NpL2N5YmVyc3Rvcm1JSS5jCmluZGV4IGEzY2FhYmYuLjNhODAzZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jeWJlcnN0b3JtSUkuYworKysgYi9kcml2ZXJzL3Njc2kvY3liZXJzdG9ybUlJLmMKQEAgLTIwMCw3ICsyMDAsNyBAQAogCQllc3AtPmVzcF9pZCwgKChzdHJ1Y3QgY3liZXJJSV9kbWFfcmVnaXN0ZXJzICopCiAJCQkgICAgICAoZXNwLT5kcmVncykpLT5jb25kX3JlZykpOwogCUVTUExPRygoImludHJlcTo8JTA0eD4sIGludGVuYTo8JTA0eD5cbiIsCi0JCWN1c3RvbS5pbnRyZXFyLCBjdXN0b20uaW50ZW5hcikpOworCQlhbWlnYV9jdXN0b20uaW50cmVxciwgYW1pZ2FfY3VzdG9tLmludGVuYXIpKTsKIH0KIAogc3RhdGljIHZvaWQgZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgbGVuZ3RoKQpAQCAtMjU5LDcgKzI1OSw3IEBACiAKIHN0YXRpYyBpbnQgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKIHsKLQlyZXR1cm4gKChjdXN0b20uaW50ZW5hcikgJiBJRl9QT1JUUyk7CisJcmV0dXJuICgoYW1pZ2FfY3VzdG9tLmludGVuYXIpICYgSUZfUE9SVFMpOwogfQogCiBzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZHB0X2kyby5jIGIvZHJpdmVycy9zY3NpL2RwdF9pMm8uYwppbmRleCA2MjUyYjlkLi42ZTZiMjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZHB0X2kyby5jCisrKyBiL2RyaXZlcnMvc2NzaS9kcHRfaTJvLmMKQEAgLTYxLDYgKzYxLDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CS8qIGZvciBib290X2NwdV9kYXRhICovCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTEwNiw3ICsxMDcsNyBAQAogICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KIAotc3RhdGljIERFQ0xBUkVfTVVURVgoYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworc3RhdGljIERFRklORV9NVVRFWChhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CiAKIHN0YXRpYyBzdHJ1Y3QgaTJvX3N5c190YmwgKnN5c190YmwgPSBOVUxMOwogc3RhdGljIGludCBzeXNfdGJsX2luZCA9IDA7CkBAIC01MzcsMTMgKzUzOCwxMyBAQAogCSAqLwogCiAJLy8gRmluZCBIQkEgKGhvc3QgYnVzIGFkYXB0ZXIpIHdlIGFyZSBsb29raW5nIGZvcgotCWRvd24oJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKwltdXRleF9sb2NrKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CiAJZm9yIChwSGJhID0gaGJhX2NoYWluOyBwSGJhOyBwSGJhID0gcEhiYS0+bmV4dCkgewogCQlpZiAocEhiYS0+aG9zdCA9PSBob3N0KSB7CiAJCQlicmVhazsJLyogZm91bmQgYWRhcHRlciAqLwogCQl9CiAJfQotCXVwKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CiAJaWYgKHBIYmEgPT0gTlVMTCkgewogCQlyZXR1cm4gMDsKIAl9CkBAIC04OTgsNiArODk5LDEyIEBACiAJaWYocGNpX2VuYWJsZV9kZXZpY2UocERldikpIHsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCisJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocERldiwgImRwdF9pMm8iKSkgeworCQlQRVJST1IoImRwdGk6IGFkcHRfY29uZmlnX2hiYTogcGNpIHJlcXVlc3QgcmVnaW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCXBjaV9zZXRfbWFzdGVyKHBEZXYpOwogCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBEZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCkgJiYKIAkgICAgcGNpX3NldF9kbWFfbWFzayhwRGV2LCAweGZmZmZmZmZmVUxMKSkKQEAgLTkyMywxMCArOTMwLDYgQEAKIAkJcmFwdG9yRmxhZyA9IFRSVUU7CiAJfQogCi0JaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocERldiwgImRwdF9pMm8iKSkgewotCQlQRVJST1IoImRwdGk6IGFkcHRfY29uZmlnX2hiYTogcGNpIHJlcXVlc3QgcmVnaW9uIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KIAliYXNlX2FkZHJfdmlydCA9IGlvcmVtYXAoYmFzZV9hZGRyMF9waHlzLGhiYV9tYXAwX2FyZWFfc2l6ZSk7CiAJaWYgKCFiYXNlX2FkZHJfdmlydCkgewogCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBEZXYpOwpAQCAtOTU4LDcgKzk2MSw3IEBACiAJfQogCW1lbXNldChwSGJhLCAwLCBzaXplb2YoYWRwdF9oYmEpKTsKIAotCWRvd24oJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKwltdXRleF9sb2NrKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CiAKIAlpZihoYmFfY2hhaW4gIT0gTlVMTCl7CiAJCWZvcihwID0gaGJhX2NoYWluOyBwLT5uZXh0OyBwID0gcC0+bmV4dCk7CkBAIC05NzEsNyArOTc0LDcgQEAKIAlzcHJpbnRmKHBIYmEtPm5hbWUsICJkcHRpJWQiLCBoYmFfY291bnQpOwogCWhiYV9jb3VudCsrOwogCQotCXVwKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CiAKIAlwSGJhLT5wRGV2ID0gcERldjsKIAlwSGJhLT5iYXNlX2FkZHJfcGh5cyA9IGJhc2VfYWRkcjBfcGh5czsKQEAgLTEwMjcsNyArMTAzMCw3IEBACiAJc3RydWN0IGFkcHRfZGV2aWNlKiBwTmV4dDsKIAogCi0JZG93bigmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworCW11dGV4X2xvY2soJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKIAkvLyBzY3NpX3VucmVnaXN0ZXIgY2FsbHMgb3VyIGFkcHRfcmVsZWFzZSB3aGljaAogCS8vIGRvZXMgYSBxdWllc2UKIAlpZihwSGJhLT5ob3N0KXsKQEAgLTEwNDYsNyArMTA0OSw3IEBACiAJfQogCiAJaGJhX2NvdW50LS07Ci0JdXAoJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKwltdXRleF91bmxvY2soJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKIAogCWlvdW5tYXAocEhiYS0+YmFzZV9hZGRyX3ZpcnQpOwogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocEhiYS0+cERldik7CkBAIC0xNTQ5LDcgKzE1NTIsNyBAQAogIAogc3RhdGljIGludCBhZHB0X2kyb19pbnN0YWxsX2RldmljZShhZHB0X2hiYSogcEhiYSwgc3RydWN0IGkyb19kZXZpY2UgKmQpCiB7Ci0JZG93bigmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworCW11dGV4X2xvY2soJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKIAlkLT5jb250cm9sbGVyPXBIYmE7CiAJZC0+b3duZXI9TlVMTDsKIAlkLT5uZXh0PXBIYmEtPmRldmljZXM7CkBAIC0xNTYwLDcgKzE1NjMsNyBAQAogCXBIYmEtPmRldmljZXM9ZDsKIAkqZC0+ZGV2X25hbWUgPSAwOwogCi0JdXAoJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKwltdXRleF91bmxvY2soJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU3NSwyNCArMTU3OCwyNCBAQAogCWlmIChtaW5vciA+PSBoYmFfY291bnQpIHsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9Ci0JZG93bigmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworCW11dGV4X2xvY2soJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKIAlmb3IgKHBIYmEgPSBoYmFfY2hhaW47IHBIYmE7IHBIYmEgPSBwSGJhLT5uZXh0KSB7CiAJCWlmIChwSGJhLT51bml0ID09IG1pbm9yKSB7CiAJCQlicmVhazsJLyogZm91bmQgYWRhcHRlciAqLwogCQl9CiAJfQogCWlmIChwSGJhID09IE5VTEwpIHsKLQkJdXAoJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCiAvLwlpZihwSGJhLT5pbl91c2UpewotCS8vCXVwKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CisJLy8JbXV0ZXhfdW5sb2NrKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CiAvLwkJcmV0dXJuIC1FQlVTWTsKIC8vCX0KIAogCXBIYmEtPmluX3VzZSA9IDE7Ci0JdXAoJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKwltdXRleF91bmxvY2soJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTYwNiwxMyArMTYwOSwxMyBAQAogCWlmIChtaW5vciA+PSBoYmFfY291bnQpIHsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9Ci0JZG93bigmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworCW11dGV4X2xvY2soJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKIAlmb3IgKHBIYmEgPSBoYmFfY2hhaW47IHBIYmE7IHBIYmEgPSBwSGJhLT5uZXh0KSB7CiAJCWlmIChwSGJhLT51bml0ID09IG1pbm9yKSB7CiAJCQlicmVhazsJLyogZm91bmQgYWRhcHRlciAqLwogCQl9CiAJfQotCXVwKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CiAJaWYgKHBIYmEgPT0gTlVMTCkgewogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTE5MTAsMTMgKzE5MTMsMTMgQEAKIAlpZiAobWlub3IgPj0gRFBUSV9NQVhfSEJBKXsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9Ci0JZG93bigmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworCW11dGV4X2xvY2soJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKIAlmb3IgKHBIYmEgPSBoYmFfY2hhaW47IHBIYmE7IHBIYmEgPSBwSGJhLT5uZXh0KSB7CiAJCWlmIChwSGJhLT51bml0ID09IG1pbm9yKSB7CiAJCQlicmVhazsJLyogZm91bmQgYWRhcHRlciAqLwogCQl9CiAJfQotCXVwKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CiAJaWYocEhiYSA9PSBOVUxMKXsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZmFzdGxhbmUuYyBiL2RyaXZlcnMvc2NzaS9mYXN0bGFuZS5jCmluZGV4IGNjZWU2OGIuLjhhZTljNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9mYXN0bGFuZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9mYXN0bGFuZS5jCkBAIC0yNjgsNyArMjY4LDcgQEAKIAkJZXNwLT5lc3BfaWQsICgoc3RydWN0IGZhc3RsYW5lX2RtYV9yZWdpc3RlcnMgKikKIAkJCSAgICAgIChlc3AtPmRyZWdzKSktPmNvbmRfcmVnKSk7CiAJRVNQTE9HKCgiaW50cmVxOjwlMDR4PiwgaW50ZW5hOjwlMDR4PlxuIiwKLQkJY3VzdG9tLmludHJlcXIsIGN1c3RvbS5pbnRlbmFyKSk7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXFyLCBhbWlnYV9jdXN0b20uaW50ZW5hcikpOwogfQogCiBzdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpCkBAIC0zNjgsNyArMzY4LDcgQEAKIAogc3RhdGljIGludCBkbWFfcG9ydHNfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQogewotCXJldHVybiAoKGN1c3RvbS5pbnRlbmFyKSAmIElGX1BPUlRTKTsKKwlyZXR1cm4gKChhbWlnYV9jdXN0b20uaW50ZW5hcikgJiBJRl9QT1JUUyk7CiB9CiAKIHN0YXRpYyB2b2lkIGRtYV9zZXR1cChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9nZHRoLmMgYi9kcml2ZXJzL3Njc2kvZ2R0aC5jCmluZGV4IGE2ZGViMDEuLmJkM2ZmZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9nZHRoLmMKKysrIGIvZHJpdmVycy9zY3NpL2dkdGguYwpAQCAtMzI4LDcgKzMyOCw3IEBACiAgKiBoZHJfY2hhbm5lbDp4ICAgICAgICAgICAgICAgIHggLSBudW1iZXIgb2YgdmlydHVhbCBidXMgZm9yIGhvc3QgZHJpdmVzCiAgKiBzaGFyZWRfYWNjZXNzOlkgICAgICAgICAgICAgIGRpc2FibGUgZHJpdmVyIHJlc2VydmUvcmVsZWFzZSBwcm90b2NvbCB0byAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzIGEgc2hhcmVkIHJlc291cmNlIGZyb20gc2V2ZXJhbCBub2RlcywgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcHJvcGlhdGUgY29udHJvbGxlciBmaXJtd2FyZSByZXF1aXJlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBjb250cm9sbGVyIGZpcm13YXJlIHJlcXVpcmVkCiAgKiBzaGFyZWRfYWNjZXNzOk4gICAgICAgICAgICAgIGVuYWJsZSBkcml2ZXIgcmVzZXJ2ZS9yZWxlYXNlIHByb3RvY29sCiAgKiBwcm9iZV9laXNhX2lzYTpZICAgICAgICAgICAgIHNjYW4gZm9yIEVJU0EvSVNBIGNvbnRyb2xsZXJzCiAgKiBwcm9iZV9laXNhX2lzYTpOICAgICAgICAgICAgIGRvIG5vdCBzY2FuIGZvciBFSVNBL0lTQSBjb250cm9sbGVycwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hvc3RzLmMgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwppbmRleCA2Njc4M2M4Li41ODgxMDc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaG9zdHMuYworKysgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwpAQCAtMTU2LDE2ICsxNTYsMTYgQEAKIHZvaWQgc2NzaV9yZW1vdmVfaG9zdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWRvd24oJnNob3N0LT5zY2FuX211dGV4KTsKKwltdXRleF9sb2NrKCZzaG9zdC0+c2Nhbl9tdXRleCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCWlmIChzY3NpX2hvc3Rfc2V0X3N0YXRlKHNob3N0LCBTSE9TVF9DQU5DRUwpKQogCQlpZiAoc2NzaV9ob3N0X3NldF9zdGF0ZShzaG9zdCwgU0hPU1RfQ0FOQ0VMX1JFQ09WRVJZKSkgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JCQl1cCgmc2hvc3QtPnNjYW5fbXV0ZXgpOworCQkJbXV0ZXhfdW5sb2NrKCZzaG9zdC0+c2Nhbl9tdXRleCk7CiAJCQlyZXR1cm47CiAJCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQl1cCgmc2hvc3QtPnNjYW5fbXV0ZXgpOworCW11dGV4X3VubG9jaygmc2hvc3QtPnNjYW5fbXV0ZXgpOwogCXNjc2lfZm9yZ2V0X2hvc3Qoc2hvc3QpOwogCXNjc2lfcHJvY19ob3N0X3JtKHNob3N0KTsKIApAQCAtMzIwLDcgKzMyMCw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJnNob3N0LT5zdGFydmVkX2xpc3QpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNob3N0LT5ob3N0X3dhaXQpOwogCi0JaW5pdF9NVVRFWCgmc2hvc3QtPnNjYW5fbXV0ZXgpOworCW11dGV4X2luaXQoJnNob3N0LT5zY2FuX211dGV4KTsKIAogCXNob3N0LT5ob3N0X25vID0gc2NzaV9ob3N0X25leHRfaG4rKzsgLyogWFhYKGhjaCk6IHN0aWxsIHJhY3kgKi8KIAlzaG9zdC0+ZG1hX2NoYW5uZWwgPSAweGZmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lwcy5jIGIvZHJpdmVycy9zY3NpL2lwcy5jCmluZGV4IDM4ODJkNDguLmU1ZTFjYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pcHMuYworKysgYi9kcml2ZXJzL3Njc2kvaXBzLmMKQEAgLTEzMTksNiArMTMxOSw5IEBACiAJCQltaW4gPSBoYS0+bWF4X2NtZHMgLSAxOwogCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChTRHB0ciwgTVNHX09SREVSRURfVEFHLCBtaW4pOwogCX0KKworCVNEcHRyLT5za2lwX21zX3BhZ2VfOCA9IDE7CisJU0RwdHItPnNraXBfbXNfcGFnZV8zZiA9IDE7CiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYyBiL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYwppbmRleCAxMGJjZjQyLi43ODBiZmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMKKysrIGIvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CkBAIC04NiwzNSArODcsMzIgQEAKIHsKIAlzZ19pbml0X29uZSgmaWJ1Zi0+c2csICh1OCAqKXZidWYsIHNpemUpOwogCWlidWYtPnNlbnQgPSAwOworCWlidWYtPnVzZV9zZW5kbXNnID0gMDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCiBpc2NzaV9idWZfaW5pdF9pb3Yoc3RydWN0IGlzY3NpX2J1ZiAqaWJ1ZiwgY2hhciAqdmJ1ZiwgaW50IHNpemUpCiB7Ci0JaWJ1Zi0+c2cucGFnZSA9ICh2b2lkKil2YnVmOwotCWlidWYtPnNnLm9mZnNldCA9ICh1bnNpZ25lZCBpbnQpLTE7CisJaWJ1Zi0+c2cucGFnZSA9IHZpcnRfdG9fcGFnZSh2YnVmKTsKKwlpYnVmLT5zZy5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZSh2YnVmKTsKIAlpYnVmLT5zZy5sZW5ndGggPSBzaXplOwogCWlidWYtPnNlbnQgPSAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQqCi1pc2NzaV9idWZfaW92X2Jhc2Uoc3RydWN0IGlzY3NpX2J1ZiAqaWJ1ZikKLXsKLQlyZXR1cm4gKGNoYXIqKWlidWYtPnNnLnBhZ2UgKyBpYnVmLT5zZW50OworCWlidWYtPnVzZV9zZW5kbXNnID0gMTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCiBpc2NzaV9idWZfaW5pdF9zZyhzdHJ1Y3QgaXNjc2lfYnVmICppYnVmLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKQogeworCWlidWYtPnNnLnBhZ2UgPSBzZy0+cGFnZTsKKwlpYnVmLT5zZy5vZmZzZXQgPSBzZy0+b2Zmc2V0OworCWlidWYtPnNnLmxlbmd0aCA9IHNnLT5sZW5ndGg7CiAJLyoKIAkgKiBGYXN0cGF0aDogc2cgZWxlbWVudCBmaXRzIGludG8gc2luZ2xlIHBhZ2UKIAkgKi8KLQlpZiAoc2ctPmxlbmd0aCArIHNnLT5vZmZzZXQgPD0gUEFHRV9TSVpFICYmIHBhZ2VfY291bnQoc2ctPnBhZ2UpID49IDIpIHsKLQkJaWJ1Zi0+c2cucGFnZSA9IHNnLT5wYWdlOwotCQlpYnVmLT5zZy5vZmZzZXQgPSBzZy0+b2Zmc2V0OwotCQlpYnVmLT5zZy5sZW5ndGggPSBzZy0+bGVuZ3RoOwotCX0gZWxzZQotCQlpc2NzaV9idWZfaW5pdF9pb3YoaWJ1ZiwgcGFnZV9hZGRyZXNzKHNnLT5wYWdlKSwgc2ctPmxlbmd0aCk7CisJaWYgKHNnLT5sZW5ndGggKyBzZy0+b2Zmc2V0IDw9IFBBR0VfU0laRSAmJiAhUGFnZVNsYWIoc2ctPnBhZ2UpKQorCQlpYnVmLT51c2Vfc2VuZG1zZyA9IDA7CisJZWxzZQorCQlpYnVmLT51c2Vfc2VuZG1zZyA9IDE7CiAJaWJ1Zi0+c2VudCA9IDA7CiB9CiAKQEAgLTM1Niw3ICszNTQsNyBAQAogCQlzdHJ1Y3Qgc2NzaV9jbW5kICpzYyA9IGN0YXNrLT5zYzsKIAogCQljb25uLT5leHBfc3RhdHNuID0gYmUzMl90b19jcHUocmhkci0+c3RhdHNuKSArIDE7Ci0JCWlmIChyaGRyLT5mbGFncyAmIElTQ1NJX0ZMQUdfQ01EX1VOREVSRkxPVykgeworCQlpZiAocmhkci0+ZmxhZ3MgJiBJU0NTSV9GTEFHX0RBVEFfVU5ERVJGTE9XKSB7CiAJCQlpbnQgcmVzX2NvdW50ID0gYmUzMl90b19jcHUocmhkci0+cmVzaWR1YWxfY291bnQpOwogCiAJCQlpZiAocmVzX2NvdW50ID4gMCAmJgpAQCAtMzY2LDkgKzM2NCw3IEBACiAJCQl9IGVsc2UKIAkJCQlzYy0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KSB8CiAJCQkJCXJoZHItPmNtZF9zdGF0dXM7Ci0JCX0gZWxzZSBpZiAocmhkci0+ZmxhZ3MgJiBJU0NTSV9GTEFHX0NNRF9CSURJX1VOREVSRkxPVykKLQkJCXNjLT5yZXN1bHQgPSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpIHwgcmhkci0+Y21kX3N0YXR1czsKLQkJZWxzZSBpZiAocmhkci0+ZmxhZ3MgJiBJU0NTSV9GTEFHX0NNRF9PVkVSRkxPVykgeworCQl9IGVsc2UgaWYgKHJoZHItPmZsYWdzICYgSVNDU0lfRkxBR19EQVRBX09WRVJGTE9XKSB7CiAJCQlzYy0+cmVzaWQgPSBiZTMyX3RvX2NwdShyaGRyLT5yZXNpZHVhbF9jb3VudCk7CiAJCQlzYy0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgfCByaGRyLT5jbWRfc3RhdHVzOwogCQl9IGVsc2UKQEAgLTUyOSw3ICs1MjUsNyBAQAogCV9fa2ZpZm9fcHV0KGN0YXNrLT5yMnRxdWV1ZSwgKHZvaWQqKSZyMnQsIHNpemVvZih2b2lkKikpOwogCV9fa2ZpZm9fcHV0KGNvbm4tPndyaXRlcXVldWUsICh2b2lkKikmY3Rhc2ssIHNpemVvZih2b2lkKikpOwogCi0Jc2NoZWR1bGVfd29yaygmY29ubi0+eG1pdHdvcmspOworCXNjc2lfcXVldWVfd29yayhzZXNzaW9uLT5ob3N0LCAmY29ubi0+eG1pdHdvcmspOwogCWNvbm4tPnIydF9wZHVzX2NudCsrOwogCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKIApAQCAtNjg2LDcgKzY4Miw3IEBACiAJCXN3aXRjaChjb25uLT5pbi5vcGNvZGUpIHsKIAkJY2FzZSBJU0NTSV9PUF9MT0dJTl9SU1A6CiAJCWNhc2UgSVNDU0lfT1BfVEVYVF9SU1A6Ci0JCWNhc2UgSVNDU0lfT1BfTE9HT1VUX1JTUDogCisJCWNhc2UgSVNDU0lfT1BfTE9HT1VUX1JTUDoKIAkJCXJjID0gaXNjc2lfY2hlY2tfYXNzaWduX2NtZHNuKHNlc3Npb24sCiAJCQkJCQkgKHN0cnVjdCBpc2NzaV9ub3BpbiopaGRyKTsKIAkJCWlmIChyYykKQEAgLTcyNywxMiArNzIzLDEyIEBACiAJCQl9CiAJCQlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7CiAJCQlicmVhazsKLQkJY2FzZSBJU0NTSV9PUF9OT09QX0lOOiAKKwkJY2FzZSBJU0NTSV9PUF9OT09QX0lOOgogCQkJaWYgKGhkci0+dHR0ICE9IElTQ1NJX1JFU0VSVkVEX1RBRykgewogCQkJCXJjID0gSVNDU0lfRVJSX1BST1RPOwogCQkJCWJyZWFrOwogCQkJfQotCQkJcmMgPSBpc2NzaV9jaGVja19hc3NpZ25fY21kc24oc2Vzc2lvbiwgCisJCQlyYyA9IGlzY3NpX2NoZWNrX2Fzc2lnbl9jbWRzbihzZXNzaW9uLAogCQkJCQkJKHN0cnVjdCBpc2NzaV9ub3BpbiopaGRyKTsKIAkJCWlmIChyYykKIAkJCQlicmVhazsKQEAgLTc2Nyw3ICs3NjMsNyBAQAogCQkJCWlmICghcmMgJiYgaGRyLT50dHQgIT0gSVNDU0lfUkVTRVJWRURfVEFHKQogCQkJCQlyYyA9IGlzY3NpX3JlY3ZfcGR1KGlzY3NpX2hhbmRsZShjb25uKSwKIAkJCQkJCQkgICAgaGRyLCBOVUxMLCAwKTsKLQkJCX0gZWxzZSAKKwkJCX0gZWxzZQogCQkJCXJjID0gSVNDU0lfRVJSX1BST1RPOwogCQkJYnJlYWs7CiAJCWNhc2UgSVNDU0lfT1BfUkVKRUNUOgpAQCAtOTI5LDcgKzkyNSw3IEBACiAJCQkJICAgICAgc2MtPnJlcXVlc3RfYnVmZmxlbiwgY3Rhc2stPmRhdGFfb2Zmc2V0KTsKIAkJaWYgKHJjID09IC1FQUdBSU4pCiAJCQlyZXR1cm4gcmM7Ci0JCWlmIChjb25uLT5kYXRhZGdzdF9lbikgCisJCWlmIChjb25uLT5kYXRhZGdzdF9lbikKIAkJCWlzY3NpX3JlY3ZfZGlnZXN0X3VwZGF0ZShjb25uLCBzYy0+cmVxdWVzdF9idWZmZXIsIGkpOwogCQlyYyA9IDA7CiAJCWdvdG8gZG9uZTsKQEAgLTEwMjQsNyArMTAyMCw3IEBACiAJCWNvbm4tPmluLmhkciA9ICZjb25uLT5oZHI7CiAJCWNvbm4tPnNlbnNlbGVuID0gKGNvbm4tPmRhdGFbMF0gPDwgOCkgfCBjb25uLT5kYXRhWzFdOwogCQlyYyA9IGlzY3NpX2NtZF9yc3AoY29ubiwgY29ubi0+aW4uY3Rhc2spOwotCQlpZiAoIXJjICYmIGNvbm4tPmRhdGFkZ3N0X2VuKSAKKwkJaWYgKCFyYyAmJiBjb25uLT5kYXRhZGdzdF9lbikKIAkJCWlzY3NpX3JlY3ZfZGlnZXN0X3VwZGF0ZShjb25uLCBjb25uLT5kYXRhLAogCQkJCQkJIGNvbm4tPmluLmRhdGFsZW4pOwogCX0KQEAgLTEwNTEsNyArMTA0Nyw3IEBACiAJCXJjID0gaXNjc2lfcmVjdl9wZHUoaXNjc2lfaGFuZGxlKGNvbm4pLCBjb25uLT5pbi5oZHIsCiAJCQkJICAgIGNvbm4tPmRhdGEsIGNvbm4tPmluLmRhdGFsZW4pOwogCi0JCWlmICghcmMgJiYgY29ubi0+ZGF0YWRnc3RfZW4gJiYgCisJCWlmICghcmMgJiYgY29ubi0+ZGF0YWRnc3RfZW4gJiYKIAkJCWNvbm4tPmluLm9wY29kZSAhPSBJU0NTSV9PUF9MT0dJTl9SU1ApCiAJCQlpc2NzaV9yZWN2X2RpZ2VzdF91cGRhdGUoY29ubiwgY29ubi0+ZGF0YSwKIAkJCSAgCQkJY29ubi0+aW4uZGF0YWxlbik7CkBAIC0xMjcxLDcgKzEyNjcsNyBAQAogCWNvbm4tPm9sZF93cml0ZV9zcGFjZShzayk7CiAJZGVidWdfdGNwKCJpc2NzaV93cml0ZV9zcGFjZTogY2lkICVkXG4iLCBjb25uLT5pZCk7CiAJY2xlYXJfYml0KFNVU1BFTkRfQklULCAmY29ubi0+c3VzcGVuZF90eCk7Ci0Jc2NoZWR1bGVfd29yaygmY29ubi0+eG1pdHdvcmspOworCXNjc2lfcXVldWVfd29yayhjb25uLT5zZXNzaW9uLT5ob3N0LCAmY29ubi0+eG1pdHdvcmspOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTMxMiwzNSArMTMwOCwyNSBAQAogICogQGJ1ZjogYnVmZmVyIHRvIHdyaXRlIGZyb20KICAqIEBzaXplOiBhY3R1YWwgc2l6ZSB0byB3cml0ZQogICogQGZsYWdzOiBzb2NrZXQncyBmbGFncwotICoKLSAqIE5vdGVzOgotICoJZGVwZW5kaW5nIG9uIGJ1ZmZlciB3aWxsIHVzZSB0Y3Bfc2VuZHBhZ2UoKSBvciB0Y3Bfc2VuZG1zZygpLgotICoJYnVmLT5zZy5vZmZzZXQgPT0gLTEgdGVsbHMgdXMgdGhhdCBidWZmZXIgaXMgbm9uIFMvRyBhbmQgZm9yY2VzCi0gKgl0byB1c2UgdGNwX3NlbmRtc2coKS4KICAqLwogc3RhdGljIGlubGluZSBpbnQKLWlzY3NpX3NlbmQoc3RydWN0IHNvY2tldCAqc2ssIHN0cnVjdCBpc2NzaV9idWYgKmJ1ZiwgaW50IHNpemUsIGludCBmbGFncykKK2lzY3NpX3NlbmQoc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sIHN0cnVjdCBpc2NzaV9idWYgKmJ1ZiwgaW50IHNpemUsIGludCBmbGFncykKIHsKLQlpbnQgcmVzOworCXN0cnVjdCBzb2NrZXQgKnNrID0gY29ubi0+c29jazsKKwlpbnQgb2Zmc2V0ID0gYnVmLT5zZy5vZmZzZXQgKyBidWYtPnNlbnQ7CiAKLQlpZiAoKGludClidWYtPnNnLm9mZnNldCA+PSAwKSB7Ci0JCWludCBvZmZzZXQgPSBidWYtPnNnLm9mZnNldCArIGJ1Zi0+c2VudDsKLQotCQkvKiB0Y3Bfc2VuZHBhZ2UgKi8KLQkJcmVzID0gc2stPm9wcy0+c2VuZHBhZ2Uoc2ssIGJ1Zi0+c2cucGFnZSwgb2Zmc2V0LCBzaXplLCBmbGFncyk7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IG1zZ2hkciBtc2c7Ci0KLQkJYnVmLT5pb3YuaW92X2Jhc2UgPSBpc2NzaV9idWZfaW92X2Jhc2UoYnVmKTsKLQkJYnVmLT5pb3YuaW92X2xlbiA9IHNpemU7Ci0KLQkJbWVtc2V0KCZtc2csIDAsIHNpemVvZihzdHJ1Y3QgbXNnaGRyKSk7Ci0KLQkJLyogdGNwX3NlbmRtc2cgKi8KLQkJcmVzID0ga2VybmVsX3NlbmRtc2coc2ssICZtc2csICZidWYtPmlvdiwgMSwgc2l6ZSk7Ci0JfQotCi0JcmV0dXJuIHJlczsKKwkvKgorCSAqIGlmIHdlIGdvdCB1c2Vfc2c9MCBvciBhcmUgc2VuZGluZyBzb21ldGhpbmcgd2Uga21hbGxvY2QKKwkgKiB0aGVuIHdlIGRpZCBub3QgaGF2ZSB0byBkbyBrbWFwIChrbWFwIHJldHVybnMgcGFnZV9hZGRyZXNzKQorCSAqCisJICogaWYgd2UgZ290IHVzZV9zZyA+IDAsIGJ1dCBoYWQgdG8gZHJvcCBkb3duLCB3ZSBkbyBub3QKKwkgKiBzZXQgY2x1c3RlcmluZyBzbyB0aGlzIHNob3VsZCBvbmx5IGhhcHBlbiBmb3IgdGhhdAorCSAqIHNsYWIgY2FzZS4KKwkgKi8KKwlpZiAoYnVmLT51c2Vfc2VuZG1zZykKKwkJcmV0dXJuIHNvY2tfbm9fc2VuZHBhZ2Uoc2ssIGJ1Zi0+c2cucGFnZSwgb2Zmc2V0LCBzaXplLCBmbGFncyk7CisJZWxzZQorCQlyZXR1cm4gY29ubi0+c2VuZHBhZ2Uoc2ssIGJ1Zi0+c2cucGFnZSwgb2Zmc2V0LCBzaXplLCBmbGFncyk7CiB9CiAKIC8qKgpAQCAtMTM1NSw3ICsxMzQxLDYgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBpc2NzaV9zZW5kaGRyKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBzdHJ1Y3QgaXNjc2lfYnVmICpidWYsIGludCBkYXRhbGVuKQogewotCXN0cnVjdCBzb2NrZXQgKnNrID0gY29ubi0+c29jazsKIAlpbnQgZmxhZ3MgPSAwOyAvKiBNU0dfRE9OVFdBSVQ7ICovCiAJaW50IHJlcywgc2l6ZTsKIApAQCAtMTM2NCw3ICsxMzQ5LDcgQEAKIAlpZiAoYnVmLT5zZW50ICsgc2l6ZSAhPSBidWYtPnNnLmxlbmd0aCB8fCBkYXRhbGVuKQogCQlmbGFncyB8PSBNU0dfTU9SRTsKIAotCXJlcyA9IGlzY3NpX3NlbmQoc2ssIGJ1Ziwgc2l6ZSwgZmxhZ3MpOworCXJlcyA9IGlzY3NpX3NlbmQoY29ubiwgYnVmLCBzaXplLCBmbGFncyk7CiAJZGVidWdfdGNwKCJzZW5kaGRyICVkIGJ5dGVzLCBzZW50ICVkIHJlcyAlZFxuIiwgc2l6ZSwgYnVmLT5zZW50LCByZXMpOwogCWlmIChyZXMgPj0gMCkgewogCQljb25uLT50eGRhdGFfb2N0ZXRzICs9IHJlczsKQEAgLTEzOTUsNyArMTM4MCw2IEBACiBpc2NzaV9zZW5kcGFnZShzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgc3RydWN0IGlzY3NpX2J1ZiAqYnVmLAogCSAgICAgICBpbnQgKmNvdW50LCBpbnQgKnNlbnQpCiB7Ci0Jc3RydWN0IHNvY2tldCAqc2sgPSBjb25uLT5zb2NrOwogCWludCBmbGFncyA9IDA7IC8qIE1TR19ET05UV0FJVDsgKi8KIAlpbnQgcmVzLCBzaXplOwogCkBAIC0xNDA2LDcgKzEzOTAsNyBAQAogCWlmIChidWYtPnNlbnQgKyBzaXplICE9IGJ1Zi0+c2cubGVuZ3RoIHx8ICpjb3VudCAhPSBzaXplKQogCQlmbGFncyB8PSBNU0dfTU9SRTsKIAotCXJlcyA9IGlzY3NpX3NlbmQoc2ssIGJ1Ziwgc2l6ZSwgZmxhZ3MpOworCXJlcyA9IGlzY3NpX3NlbmQoY29ubiwgYnVmLCBzaXplLCBmbGFncyk7CiAJZGVidWdfdGNwKCJzZW5kcGFnZTogJWQgYnl0ZXMsIHNlbnQgJWQgbGVmdCAlZCBzZW50ICVkIHJlcyAlZFxuIiwKIAkJICBzaXplLCBidWYtPnNlbnQsICpjb3VudCwgKnNlbnQsIHJlcyk7CiAJaWYgKHJlcyA+PSAwKSB7CkBAIC0xNDM0LDIwICsxNDE4LDcgQEAKIAljdGFzay0+ZGlnZXN0X2NvdW50ID0gNDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCi1pc2NzaV9idWZfZGF0YV9kaWdlc3RfdXBkYXRlKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBzdHJ1Y3QgaXNjc2lfYnVmICpidWYpCi17Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0IHNnOwotCi0JaWYgKGJ1Zi0+c2cub2Zmc2V0ICE9IC0xKQotCQljcnlwdG9fZGlnZXN0X3VwZGF0ZShjb25uLT5kYXRhX3R4X3RmbSwgJmJ1Zi0+c2csIDEpOwotCWVsc2UgewotCQlzZ19pbml0X29uZSgmc2csIChjaGFyICopYnVmLT5zZy5wYWdlLCBidWYtPnNnLmxlbmd0aCk7Ci0JCWNyeXB0b19kaWdlc3RfdXBkYXRlKGNvbm4tPmRhdGFfdHhfdGZtLCAmc2csIDEpOwotCX0KLX0KLQotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbnQKIGlzY3NpX2RpZ2VzdF9maW5hbF9zZW5kKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBzdHJ1Y3QgaXNjc2lfY21kX3Rhc2sgKmN0YXNrLAogCQkJc3RydWN0IGlzY3NpX2J1ZiAqYnVmLCB1aW50MzJfdCAqZGlnZXN0LCBpbnQgZmluYWwpCiB7CkBAIC0xNjgwLDcgKzE2NTEsNyBAQAogCQl6ZXJvX2RhdGEoY3Rhc2stPmhkci5kbGVuZ3RoKTsKIAl9CiAKLQlpc2NzaV9idWZfaW5pdF92aXJ0KCZjdGFzay0+aGVhZGJ1ZiwgKGNoYXIqKSZjdGFzay0+aGRyLCAKKwlpc2NzaV9idWZfaW5pdF92aXJ0KCZjdGFzay0+aGVhZGJ1ZiwgKGNoYXIqKSZjdGFzay0+aGRyLAogCQkJICAgIHNpemVvZihzdHJ1Y3QgaXNjc2lfaGRyKSk7CiAJY29ubi0+c2NzaWNtZF9wZHVzX2NudCsrOwogfQpAQCAtMTc0Niw3ICsxNzE3LDcgQEAKIGhhbmRsZV94bXN0YXRlX3JfaGRyKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBzdHJ1Y3QgaXNjc2lfY21kX3Rhc2sgKmN0YXNrKQogewogCWN0YXNrLT54bXN0YXRlICY9IH5YTVNUQVRFX1JfSERSOwotCWlmIChjb25uLT5oZHJkZ3N0X2VuKSAKKwlpZiAoY29ubi0+aGRyZGdzdF9lbikKIAkJaXNjc2lfaGRyX2RpZ2VzdChjb25uLCAmY3Rhc2stPmhlYWRidWYsICh1OCopY3Rhc2stPmhkcmV4dCk7CiAJaWYgKCFpc2NzaV9zZW5kaGRyKGNvbm4sICZjdGFzay0+aGVhZGJ1ZiwgMCkpIHsKIAkJQlVHX09OKGN0YXNrLT54bXN0YXRlICE9IFhNU1RBVEVfSURMRSk7CkBAIC0xNzYwLDcgKzE3MzEsNyBAQAogaGFuZGxlX3htc3RhdGVfd19oZHIoc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sIHN0cnVjdCBpc2NzaV9jbWRfdGFzayAqY3Rhc2spCiB7CiAJY3Rhc2stPnhtc3RhdGUgJj0gflhNU1RBVEVfV19IRFI7Ci0JaWYgKGNvbm4tPmhkcmRnc3RfZW4pIAorCWlmIChjb25uLT5oZHJkZ3N0X2VuKQogCQlpc2NzaV9oZHJfZGlnZXN0KGNvbm4sICZjdGFzay0+aGVhZGJ1ZiwgKHU4KiljdGFzay0+aGRyZXh0KTsKIAlpZiAoaXNjc2lfc2VuZGhkcihjb25uLCAmY3Rhc2stPmhlYWRidWYsIGN0YXNrLT5pbW1fY291bnQpKSB7CiAJCWN0YXNrLT54bXN0YXRlIHw9IFhNU1RBVEVfV19IRFI7CkBAIC0xODA5LDcgKzE3ODAsOCBAQAogCQkJcmV0dXJuIC1FQUdBSU47CiAJCX0KIAkJaWYgKGNvbm4tPmRhdGFkZ3N0X2VuKQotCQkJaXNjc2lfYnVmX2RhdGFfZGlnZXN0X3VwZGF0ZShjb25uLCAmY3Rhc2stPnNlbmRidWYpOworCQkJY3J5cHRvX2RpZ2VzdF91cGRhdGUoY29ubi0+ZGF0YV90eF90Zm0sCisJCQkJCSAgICAgJmN0YXNrLT5zZW5kYnVmLnNnLCAxKTsKIAogCQlpZiAoIWN0YXNrLT5pbW1fY291bnQpCiAJCQlicmVhazsKQEAgLTE4OTQsNyArMTg2Niw4IEBACiAJCSAqIHNvIHBhc3MgaXQKIAkJICovCiAJCWlmIChjb25uLT5kYXRhZGdzdF9lbiAmJiBjdGFzay0+c2VudCAtIHN0YXJ0ID4gMCkKLQkJCWlzY3NpX2J1Zl9kYXRhX2RpZ2VzdF91cGRhdGUoY29ubiwgJmN0YXNrLT5zZW5kYnVmKTsKKwkJCWNyeXB0b19kaWdlc3RfdXBkYXRlKGNvbm4tPmRhdGFfdHhfdGZtLAorCQkJCQkgICAgICZjdGFzay0+c2VuZGJ1Zi5zZywgMSk7CiAKIAkJaWYgKCFjdGFzay0+ZGF0YV9jb3VudCkKIAkJCWJyZWFrOwpAQCAtMTk3Miw3ICsxOTQ1LDcgQEAKIAogCUJVR19PTihyMnQtPmRhdGFfY291bnQgPCAwKTsKIAlpZiAoY29ubi0+ZGF0YWRnc3RfZW4pCi0JCWlzY3NpX2J1Zl9kYXRhX2RpZ2VzdF91cGRhdGUoY29ubiwgJnIydC0+c2VuZGJ1Zik7CisJCWNyeXB0b19kaWdlc3RfdXBkYXRlKGNvbm4tPmRhdGFfdHhfdGZtLCAmcjJ0LT5zZW5kYnVmLnNnLCAxKTsKIAogCWlmIChyMnQtPmRhdGFfY291bnQpIHsKIAkJQlVHX09OKGN0YXNrLT5zYy0+dXNlX3NnID09IDApOwpAQCAtMjA1NCw3ICsyMDI3LDcgQEAKIAl9CiAKIAlpZiAoY29ubi0+ZGF0YWRnc3RfZW4pIHsKLQkJaXNjc2lfYnVmX2RhdGFfZGlnZXN0X3VwZGF0ZShjb25uLCAmY3Rhc2stPnNlbmRidWYpOworCQljcnlwdG9fZGlnZXN0X3VwZGF0ZShjb25uLT5kYXRhX3R4X3RmbSwgJmN0YXNrLT5zZW5kYnVmLnNnLCAxKTsKIAkJLyogaW1tIGRhdGE/ICovCiAJCWlmICghZHRhc2spIHsKIAkJCWlmIChpc2NzaV9kaWdlc3RfZmluYWxfc2VuZChjb25uLCBjdGFzaywgJmN0YXNrLT5pbW1idWYsCkBAIC0yMTQ4LDcgKzIxMjEsNyBAQAogc29saWNpdF9oZWFkX2FnYWluOgogCQlyMnQgPSBjdGFzay0+cjJ0OwogCQlpZiAoY29ubi0+aGRyZGdzdF9lbikKLQkJCWlzY3NpX2hkcl9kaWdlc3QoY29ubiwgJnIydC0+aGVhZGJ1ZiwgCisJCQlpc2NzaV9oZHJfZGlnZXN0KGNvbm4sICZyMnQtPmhlYWRidWYsCiAJCQkJCSh1OCopcjJ0LT5kdGFzay0+aGRyZXh0KTsKIAkJaWYgKGlzY3NpX3NlbmRoZHIoY29ubiwgJnIydC0+aGVhZGJ1ZiwgcjJ0LT5kYXRhX2NvdW50KSkgewogCQkJY3Rhc2stPnhtc3RhdGUgJj0gflhNU1RBVEVfU09MX0RBVEE7CkBAIC0yMzAwLDEwICsyMjczLDEwIEBACiAJLyoKIAkgKiBzZXJpYWxpemUgWG1pdCB3b3JrZXIgb24gYSBwZXItY29ubmVjdGlvbiBiYXNpcy4KIAkgKi8KLQlkb3duKCZjb25uLT54bWl0c2VtYSk7CisJbXV0ZXhfbG9jaygmY29ubi0+eG1pdG11dGV4KTsKIAlpZiAoaXNjc2lfZGF0YV94bWl0KGNvbm4pKQotCQlzY2hlZHVsZV93b3JrKCZjb25uLT54bWl0d29yayk7Ci0JdXAoJmNvbm4tPnhtaXRzZW1hKTsKKwkJc2NzaV9xdWV1ZV93b3JrKGNvbm4tPnNlc3Npb24tPmhvc3QsICZjb25uLT54bWl0d29yayk7CisJbXV0ZXhfdW5sb2NrKCZjb25uLT54bWl0bXV0ZXgpOwogfQogCiAjZGVmaW5lIEZBSUxVUkVfQkFEX0hPU1QJCTEKQEAgLTIzNjcsMTUgKzIzNDAsNyBAQAogCQlzZXNzaW9uLT5jbWRzbiwgc2Vzc2lvbi0+bWF4X2NtZHNuIC0gc2Vzc2lvbi0+ZXhwX2NtZHNuICsgMSk7CiAJc3Bpbl91bmxvY2soJnNlc3Npb24tPmxvY2spOwogCi0gICAgICAgIGlmICghaW5faW50ZXJydXB0KCkgJiYgIWRvd25fdHJ5bG9jaygmY29ubi0+eG1pdHNlbWEpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycShob3N0LT5ob3N0X2xvY2spOwotCQlpZiAoaXNjc2lfZGF0YV94bWl0KGNvbm4pKQotCQkJc2NoZWR1bGVfd29yaygmY29ubi0+eG1pdHdvcmspOwotCQl1cCgmY29ubi0+eG1pdHNlbWEpOwotCQlzcGluX2xvY2tfaXJxKGhvc3QtPmhvc3RfbG9jayk7Ci0JfSBlbHNlCi0JCXNjaGVkdWxlX3dvcmsoJmNvbm4tPnhtaXR3b3JrKTsKLQorCXNjc2lfcXVldWVfd29yayhob3N0LCAmY29ubi0+eG1pdHdvcmspOwogCXJldHVybiAwOwogCiByZWplY3Q6CkBAIC0yNDYyLDE3ICsyNDI3LDIwIEBACiAJa2ZyZWUoaXRlbXMpOwogfQogCi1zdGF0aWMgaXNjc2lfY29ubmhfdAotaXNjc2lfY29ubl9jcmVhdGUoaXNjc2lfc2Vzc2lvbmhfdCBzZXNzaW9uaCwgdWludDMyX3QgY29ubl9pZHgpCitzdGF0aWMgc3RydWN0IGlzY3NpX2Nsc19jb25uICoKK2lzY3NpX2Nvbm5fY3JlYXRlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCB1aW50MzJfdCBjb25uX2lkeCkKIHsKLQlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGlzY3NpX3B0cihzZXNzaW9uaCk7Ci0Jc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSBOVUxMOworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gaXNjc2lfaG9zdGRhdGEoc2hvc3QtPmhvc3RkYXRhKTsKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubjsKKwlzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uOwogCi0JY29ubiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpc2NzaV9jb25uKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGNvbm4gPT0gTlVMTCkKLQkJZ290byBjb25uX2FsbG9jX2ZhaWw7CisJY2xzX2Nvbm4gPSBpc2NzaV9jcmVhdGVfY29ubihob3N0ZGF0YV9zZXNzaW9uKHNob3N0LT5ob3N0ZGF0YSksCisJCQkJICAgICBjb25uX2lkeCk7CisJaWYgKCFjbHNfY29ubikKKwkJcmV0dXJuIE5VTEw7CisJY29ubiA9IGNsc19jb25uLT5kZF9kYXRhOworCiAJbWVtc2V0KGNvbm4sIDAsIHNpemVvZihzdHJ1Y3QgaXNjc2lfY29ubikpOwotCiAJY29ubi0+Y19zdGFnZSA9IElTQ1NJX0NPTk5fSU5JVElBTF9TVEFHRTsKIAljb25uLT5pbl9wcm9ncmVzcyA9IElOX1BST0dSRVNTX1dBSVRfSEVBREVSOwogCWNvbm4tPmlkID0gY29ubl9pZHg7CkBAIC0yNTMxLDEwICsyNDk5LDEwIEBACiAJCWdvdG8gbWF4X3JlY3ZfZGxlbmdodF9hbGxvY19mYWlsOwogCiAJaW5pdF90aW1lcigmY29ubi0+dG1hYm9ydF90aW1lcik7Ci0JaW5pdF9NVVRFWCgmY29ubi0+eG1pdHNlbWEpOworCW11dGV4X2luaXQoJmNvbm4tPnhtaXRtdXRleCk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY29ubi0+ZWh3YWl0KTsKIAotCXJldHVybiBpc2NzaV9oYW5kbGUoY29ubik7CisJcmV0dXJuIGNsc19jb25uOwogCiBtYXhfcmVjdl9kbGVuZ2h0X2FsbG9jX2ZhaWw6CiAJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKQEAgLTI1NTAsMTggKzI1MTgsMTggQEAKIHdyaXRlcXVldWVfYWxsb2NfZmFpbDoKIAlrZmlmb19mcmVlKGNvbm4tPnhtaXRxdWV1ZSk7CiB4bWl0cXVldWVfYWxsb2NfZmFpbDoKLQlrZnJlZShjb25uKTsKLWNvbm5fYWxsb2NfZmFpbDoKLQlyZXR1cm4gaXNjc2lfaGFuZGxlKE5VTEwpOworCWlzY3NpX2Rlc3Ryb3lfY29ubihjbHNfY29ubik7CisJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkCi1pc2NzaV9jb25uX2Rlc3Ryb3koaXNjc2lfY29ubmhfdCBjb25uaCkKK2lzY3NpX2Nvbm5fZGVzdHJveShzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uKQogewotCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gaXNjc2lfcHRyKGNvbm5oKTsKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IGNsc19jb25uLT5kZF9kYXRhOwogCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gY29ubi0+c2Vzc2lvbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZG93bigmY29ubi0+eG1pdHNlbWEpOworCW11dGV4X2xvY2soJmNvbm4tPnhtaXRtdXRleCk7CiAJc2V0X2JpdChTVVNQRU5EX0JJVCwgJmNvbm4tPnN1c3BlbmRfdHgpOwogCWlmIChjb25uLT5jX3N0YWdlID09IElTQ1NJX0NPTk5fSU5JVElBTF9TVEFHRSAmJiBjb25uLT5zb2NrKSB7CiAJCXN0cnVjdCBzb2NrICpzayA9IGNvbm4tPnNvY2stPnNrOwpAQCAtMjU5MiwxOSArMjU2MCwxOSBAQAogCX0KIAlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CiAKLQl1cCgmY29ubi0+eG1pdHNlbWEpOworCW11dGV4X3VubG9jaygmY29ubi0+eG1pdG11dGV4KTsKIAogCS8qCiAJICogQmxvY2sgdW50aWwgYWxsIGluLXByb2dyZXNzIGNvbW1hbmRzIGZvciB0aGlzIGNvbm5lY3Rpb24KIAkgKiB0aW1lIG91dCBvciBmYWlsLgogCSAqLwogCWZvciAoOzspIHsKLQkJc3Bpbl9sb2NrX2JoKCZjb25uLT5sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoc2Vzc2lvbi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJCWlmICghc2Vzc2lvbi0+aG9zdC0+aG9zdF9idXN5KSB7IC8qIE9LIGZvciBFUkwgPT0gMCAqLwotCQkJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPmxvY2spOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzZXNzaW9uLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAkJCWJyZWFrOwogCQl9Ci0JCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzZXNzaW9uLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAkJbXNsZWVwX2ludGVycnVwdGlibGUoNTAwKTsKIAkJcHJpbnRrKCJjb25uX2Rlc3Ryb3koKTogaG9zdF9idXN5ICVkIGhvc3RfZmFpbGVkICVkXG4iLAogCQkJc2Vzc2lvbi0+aG9zdC0+aG9zdF9idXN5LCBzZXNzaW9uLT5ob3N0LT5ob3N0X2ZhaWxlZCk7CkBAIC0yNjUyLDcgKzI2MjAsOCBAQAogCWtmaWZvX2ZyZWUoY29ubi0+d3JpdGVxdWV1ZSk7CiAJa2ZpZm9fZnJlZShjb25uLT5pbW1xdWV1ZSk7CiAJa2ZpZm9fZnJlZShjb25uLT5tZ210cXVldWUpOwotCWtmcmVlKGNvbm4pOworCisJaXNjc2lfZGVzdHJveV9jb25uKGNsc19jb25uKTsKIH0KIAogc3RhdGljIGludApAQCAtMjcxMyw2ICsyNjgyLDggQEAKIAkJICovCiAJCWlzY3NpX2Nvbm5fc2V0X2NhbGxiYWNrcyhjb25uKTsKIAorCQljb25uLT5zZW5kcGFnZSA9IGNvbm4tPnNvY2stPm9wcy0+c2VuZHBhZ2U7CisKIAkJLyoKIAkJICogc2V0IHJlY2VpdmUgc3RhdGUgbWFjaGluZSBpbnRvIGluaXRpYWwgc3RhdGUKIAkJICovCkBAIC0yNzk2LDcgKzI3NjcsNyBAQAogCXNldF9iaXQoU1VTUEVORF9CSVQsICZjb25uLT5zdXNwZW5kX3J4KTsKIAl3cml0ZV91bmxvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKIAotCWRvd24oJmNvbm4tPnhtaXRzZW1hKTsKKwltdXRleF9sb2NrKCZjb25uLT54bWl0bXV0ZXgpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoc2Vzc2lvbi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJc3Bpbl9sb2NrKCZzZXNzaW9uLT5sb2NrKTsKQEAgLTI4NzgsNyArMjg0OSw3IEBACiAJCQljb25uLT5kYXRhZGdzdF9lbiA9IDA7CiAJCX0KIAl9Ci0JdXAoJmNvbm4tPnhtaXRzZW1hKTsKKwltdXRleF91bmxvY2soJmNvbm4tPnhtaXRtdXRleCk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTI5NjMsOCArMjkzNCw3IEBACiAJZWxzZQogCSAgICAgICAgX19rZmlmb19wdXQoY29ubi0+bWdtdHF1ZXVlLCAodm9pZCopJm10YXNrLCBzaXplb2Yodm9pZCopKTsKIAotCXNjaGVkdWxlX3dvcmsoJmNvbm4tPnhtaXR3b3JrKTsKLQorCXNjc2lfcXVldWVfd29yayhzZXNzaW9uLT5ob3N0LCAmY29ubi0+eG1pdHdvcmspOwogCXJldHVybiAwOwogfQogCkBAIC0zMDI5LDEyICsyOTk5LDEyIEBACiAJICogMSkgY29ubmVjdGlvbi1sZXZlbCBmYWlsdXJlOwogCSAqIDIpIHJlY292ZXJ5IGR1ZSBwcm90b2NvbCBlcnJvcjsKIAkgKi8KLQlkb3duKCZjb25uLT54bWl0c2VtYSk7CisJbXV0ZXhfbG9jaygmY29ubi0+eG1pdG11dGV4KTsKIAlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOwogCWlmIChzZXNzaW9uLT5zdGF0ZSAhPSBJU0NTSV9TVEFURV9MT0dHRURfSU4pIHsKIAkJaWYgKHNlc3Npb24tPnN0YXRlID09IElTQ1NJX1NUQVRFX1RFUk1JTkFURSkgewogCQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOwotCQkJdXAoJmNvbm4tPnhtaXRzZW1hKTsKKwkJCW11dGV4X3VubG9jaygmY29ubi0+eG1pdG11dGV4KTsKIAkJCWdvdG8gZmFpbGVkOwogCQl9CiAJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKQEAgLTMwNTIsNyArMzAyMiw3IEBACiAJCQkgKiAyKSBzZXNzaW9uIHdhcyByZS1vcGVuIGR1cmluZyB0aW1lIG91dCBvZiBjdGFzay4KIAkJCSAqLwogCQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOwotCQkJdXAoJmNvbm4tPnhtaXRzZW1hKTsKKwkJCW11dGV4X3VubG9jaygmY29ubi0+eG1pdG11dGV4KTsKIAkJCWdvdG8gc3VjY2VzczsKIAkJfQogCQljb25uLT50bWFib3J0X3N0YXRlID0gVE1BQk9SVF9JTklUSUFMOwpAQCAtMzEwNyw3ICszMDc3LDcgQEAKIAkJCQkgICAgY29ubi0+dG1hYm9ydF9zdGF0ZSA9PSBUTUFCT1JUX1NVQ0NFU1MpIHsKIAkJCQkJY29ubi0+dG1hYm9ydF9zdGF0ZSA9IFRNQUJPUlRfSU5JVElBTDsKIAkJCQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOwotCQkJCQl1cCgmY29ubi0+eG1pdHNlbWEpOworCQkJCQltdXRleF91bmxvY2soJmNvbm4tPnhtaXRtdXRleCk7CiAJCQkJCWdvdG8gc3VjY2VzczsKIAkJCQl9CiAJCQkJY29ubi0+dG1hYm9ydF9zdGF0ZSA9IFRNQUJPUlRfSU5JVElBTDsKQEAgLTMxMTYsNyArMzA4Niw3IEBACiAJCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CiAJCX0KIAl9Ci0JdXAoJmNvbm4tPnhtaXRzZW1hKTsKKwltdXRleF91bmxvY2soJmNvbm4tPnhtaXRtdXRleCk7CiAKIAogCS8qCkBAIC0zMTgyLDcgKzMxNTIsNyBAQAogZXhpdDoKIAlkZWxfdGltZXJfc3luYygmY29ubi0+dG1hYm9ydF90aW1lcik7CiAKLQlkb3duKCZjb25uLT54bWl0c2VtYSk7CisJbXV0ZXhfbG9jaygmY29ubi0+eG1pdG11dGV4KTsKIAlpZiAoY29ubi0+c29jaykgewogCQlzdHJ1Y3Qgc29jayAqc2sgPSBjb25uLT5zb2NrLT5zazsKIApAQCAtMzE5MCw3ICszMTYwLDcgQEAKIAkJaXNjc2lfY3Rhc2tfY2xlYW51cChjb25uLCBjdGFzayk7CiAJCXdyaXRlX3VubG9ja19iaCgmc2stPnNrX2NhbGxiYWNrX2xvY2spOwogCX0KLQl1cCgmY29ubi0+eG1pdHNlbWEpOworCW11dGV4X3VubG9jaygmY29ubi0+eG1pdG11dGV4KTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTMyODEsMTcgKzMyNTEsMjMgQEAKIAkudGhpc19pZAkJPSAtMSwKIH07CiAKLXN0YXRpYyBpc2NzaV9zZXNzaW9uaF90Ci1pc2NzaV9zZXNzaW9uX2NyZWF0ZSh1aW50MzJfdCBpbml0aWFsX2NtZHNuLCBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQorc3RhdGljIHN0cnVjdCBpc2NzaV90cmFuc3BvcnQgaXNjc2lfdGNwX3RyYW5zcG9ydDsKKworc3RhdGljIHN0cnVjdCBTY3NpX0hvc3QgKgoraXNjc2lfc2Vzc2lvbl9jcmVhdGUoc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICpzY3NpdCwKKwkJICAgICB1aW50MzJfdCBpbml0aWFsX2NtZHNuKQogewotCWludCBjbWRfaTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbjsKKwlpbnQgY21kX2k7CiAKLQlzZXNzaW9uID0gaXNjc2lfaG9zdGRhdGEoaG9zdC0+aG9zdGRhdGEpOworCXNob3N0ID0gaXNjc2lfdHJhbnNwb3J0X2NyZWF0ZV9zZXNzaW9uKHNjc2l0LCAmaXNjc2lfdGNwX3RyYW5zcG9ydCk7CisJaWYgKCFzaG9zdCkKKwkJcmV0dXJuIE5VTEw7IAorCisJc2Vzc2lvbiA9IGlzY3NpX2hvc3RkYXRhKHNob3N0LT5ob3N0ZGF0YSk7CiAJbWVtc2V0KHNlc3Npb24sIDAsIHNpemVvZihzdHJ1Y3QgaXNjc2lfc2Vzc2lvbikpOwotCi0Jc2Vzc2lvbi0+aG9zdCA9IGhvc3Q7Ci0Jc2Vzc2lvbi0+aWQgPSBob3N0LT5ob3N0X25vOworCXNlc3Npb24tPmhvc3QgPSBzaG9zdDsKIAlzZXNzaW9uLT5zdGF0ZSA9IElTQ1NJX1NUQVRFX0xPR0dFRF9JTjsKIAlzZXNzaW9uLT5tZ210cG9vbF9tYXggPSBJU0NTSV9NR01UX0NNRFNfTUFYOwogCXNlc3Npb24tPmNtZHNfbWF4ID0gSVNDU0lfWE1JVF9DTURTX01BWDsKQEAgLTMzMzUsNyArMzMxMSw3IEBACiAJaWYgKGlzY3NpX3IydHBvb2xfYWxsb2Moc2Vzc2lvbikpCiAJCWdvdG8gcjJ0cG9vbF9hbGxvY19mYWlsOwogCi0JcmV0dXJuIGlzY3NpX2hhbmRsZShzZXNzaW9uKTsKKwlyZXR1cm4gc2hvc3Q7CiAKIHIydHBvb2xfYWxsb2NfZmFpbDoKIAlmb3IgKGNtZF9pID0gMDsgY21kX2kgPCBzZXNzaW9uLT5tZ210cG9vbF9tYXg7IGNtZF9pKyspCkBAIC0zMzQ1LDE1ICszMzIxLDE1IEBACiBtZ210cG9vbF9hbGxvY19mYWlsOgogCWlzY3NpX3Bvb2xfZnJlZSgmc2Vzc2lvbi0+Y21kcG9vbCwgKHZvaWQqKilzZXNzaW9uLT5jbWRzKTsKIGNtZHBvb2xfYWxsb2NfZmFpbDoKLQlyZXR1cm4gaXNjc2lfaGFuZGxlKE5VTEwpOworCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZAotaXNjc2lfc2Vzc2lvbl9kZXN0cm95KGlzY3NpX3Nlc3Npb25oX3Qgc2Vzc2lvbmgpCitpc2NzaV9zZXNzaW9uX2Rlc3Ryb3koc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBpc2NzaV9ob3N0ZGF0YShzaG9zdC0+aG9zdGRhdGEpOwogCWludCBjbWRfaTsKIAlzdHJ1Y3QgaXNjc2lfZGF0YV90YXNrICpkdGFzaywgKm47Ci0Jc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBpc2NzaV9wdHIoc2Vzc2lvbmgpOwogCiAJZm9yIChjbWRfaSA9IDA7IGNtZF9pIDwgc2Vzc2lvbi0+Y21kc19tYXg7IGNtZF9pKyspIHsKIAkJc3RydWN0IGlzY3NpX2NtZF90YXNrICpjdGFzayA9IHNlc3Npb24tPmNtZHNbY21kX2ldOwpAQCAtMzM2OSw2ICszMzQ1LDggQEAKIAlpc2NzaV9yMnRwb29sX2ZyZWUoc2Vzc2lvbik7CiAJaXNjc2lfcG9vbF9mcmVlKCZzZXNzaW9uLT5tZ210cG9vbCwgKHZvaWQqKilzZXNzaW9uLT5tZ210X2NtZHMpOwogCWlzY3NpX3Bvb2xfZnJlZSgmc2Vzc2lvbi0+Y21kcG9vbCwgKHZvaWQqKilzZXNzaW9uLT5jbWRzKTsKKworCWlzY3NpX3RyYW5zcG9ydF9kZXN0cm95X3Nlc3Npb24oc2hvc3QpOwogfQogCiBzdGF0aWMgaW50CkBAIC0zNDY3LDYgKzM0NDUsOCBAQAogCQkJaWYgKGNvbm4tPmRhdGFfcnhfdGZtKQogCQkJCWNyeXB0b19mcmVlX3RmbShjb25uLT5kYXRhX3J4X3RmbSk7CiAJCX0KKwkJY29ubi0+c2VuZHBhZ2UgPSBjb25uLT5kYXRhZGdzdF9lbiA/CisJCQlzb2NrX25vX3NlbmRwYWdlIDogY29ubi0+c29jay0+b3BzLT5zZW5kcGFnZTsKIAkJYnJlYWs7CiAJY2FzZSBJU0NTSV9QQVJBTV9JTklUSUFMX1IyVF9FTjoKIAkJc2Vzc2lvbi0+aW5pdGlhbF9yMnRfZW4gPSB2YWx1ZTsKQEAgLTM1MTUsMjUgKzM0OTUsMTIgQEAKIH0KIAogc3RhdGljIGludAotaXNjc2lfY29ubl9nZXRfcGFyYW0oaXNjc2lfY29ubmhfdCBjb25uaCwgZW51bSBpc2NzaV9wYXJhbSBwYXJhbSwKLQkJICAgICB1aW50MzJfdCAqdmFsdWUpCitpc2NzaV9zZXNzaW9uX2dldF9wYXJhbShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwkJCWVudW0gaXNjc2lfcGFyYW0gcGFyYW0sIHVpbnQzMl90ICp2YWx1ZSkKIHsKLQlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IGlzY3NpX3B0cihjb25uaCk7Ci0Jc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBjb25uLT5zZXNzaW9uOworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gaXNjc2lfaG9zdGRhdGEoc2hvc3QtPmhvc3RkYXRhKTsKIAogCXN3aXRjaChwYXJhbSkgewotCWNhc2UgSVNDU0lfUEFSQU1fTUFYX1JFQ1ZfRExFTkdUSDoKLQkJKnZhbHVlID0gY29ubi0+bWF4X3JlY3ZfZGxlbmd0aDsKLQkJYnJlYWs7Ci0JY2FzZSBJU0NTSV9QQVJBTV9NQVhfWE1JVF9ETEVOR1RIOgotCQkqdmFsdWUgPSBjb25uLT5tYXhfeG1pdF9kbGVuZ3RoOwotCQlicmVhazsKLQljYXNlIElTQ1NJX1BBUkFNX0hEUkRHU1RfRU46Ci0JCSp2YWx1ZSA9IGNvbm4tPmhkcmRnc3RfZW47Ci0JCWJyZWFrOwotCWNhc2UgSVNDU0lfUEFSQU1fREFUQURHU1RfRU46Ci0JCSp2YWx1ZSA9IGNvbm4tPmRhdGFkZ3N0X2VuOwotCQlicmVhazsKIAljYXNlIElTQ1NJX1BBUkFNX0lOSVRJQUxfUjJUX0VOOgogCQkqdmFsdWUgPSBzZXNzaW9uLT5pbml0aWFsX3IydF9lbjsKIAkJYnJlYWs7CkBAIC0zNTcxLDYgKzM1MzgsMzEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludAoraXNjc2lfY29ubl9nZXRfcGFyYW0odm9pZCAqZGF0YSwgZW51bSBpc2NzaV9wYXJhbSBwYXJhbSwgdWludDMyX3QgKnZhbHVlKQoreworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gZGF0YTsKKworCXN3aXRjaChwYXJhbSkgeworCWNhc2UgSVNDU0lfUEFSQU1fTUFYX1JFQ1ZfRExFTkdUSDoKKwkJKnZhbHVlID0gY29ubi0+bWF4X3JlY3ZfZGxlbmd0aDsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9QQVJBTV9NQVhfWE1JVF9ETEVOR1RIOgorCQkqdmFsdWUgPSBjb25uLT5tYXhfeG1pdF9kbGVuZ3RoOworCQlicmVhazsKKwljYXNlIElTQ1NJX1BBUkFNX0hEUkRHU1RfRU46CisJCSp2YWx1ZSA9IGNvbm4tPmhkcmRnc3RfZW47CisJCWJyZWFrOworCWNhc2UgSVNDU0lfUEFSQU1fREFUQURHU1RfRU46CisJCSp2YWx1ZSA9IGNvbm4tPmRhdGFkZ3N0X2VuOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gSVNDU0lfRVJSX1BBUkFNX05PVF9GT1VORDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQKIGlzY3NpX2Nvbm5fZ2V0X3N0YXRzKGlzY3NpX2Nvbm5oX3QgY29ubmgsIHN0cnVjdCBpc2NzaV9zdGF0cyAqc3RhdHMpCiB7CkBAIC0zNjAxLDkgKzM1OTMsOSBAQAogCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gaXNjc2lfcHRyKGNvbm5oKTsKIAlpbnQgcmM7CiAKLQlkb3duKCZjb25uLT54bWl0c2VtYSk7CisJbXV0ZXhfbG9jaygmY29ubi0+eG1pdG11dGV4KTsKIAlyYyA9IGlzY3NpX2Nvbm5fc2VuZF9nZW5lcmljKGNvbm4sIGhkciwgZGF0YSwgZGF0YV9zaXplKTsKLQl1cCgmY29ubi0+eG1pdHNlbWEpOworCW11dGV4X3VubG9jaygmY29ubi0+eG1pdG11dGV4KTsKIAogCXJldHVybiByYzsKIH0KQEAgLTM2MTUsNiArMzYwNyw3IEBACiAJCQkJICB8IENBUF9EQVRBREdTVCwKIAkuaG9zdF90ZW1wbGF0ZQkJPSAmaXNjc2lfc2h0LAogCS5ob3N0ZGF0YV9zaXplCQk9IHNpemVvZihzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiksCisJLmNvbm5kYXRhX3NpemUJCT0gc2l6ZW9mKHN0cnVjdCBpc2NzaV9jb25uKSwKIAkubWF4X2Nvbm4JCT0gMSwKIAkubWF4X2NtZF9sZW4JCT0gSVNDU0lfVENQX01BWF9DTURfTEVOLAogCS5jcmVhdGVfc2Vzc2lvbgkJPSBpc2NzaV9zZXNzaW9uX2NyZWF0ZSwKQEAgLTM2MjMsNyArMzYxNiw4IEBACiAJLmJpbmRfY29ubgkJPSBpc2NzaV9jb25uX2JpbmQsCiAJLmRlc3Ryb3lfY29ubgkJPSBpc2NzaV9jb25uX2Rlc3Ryb3ksCiAJLnNldF9wYXJhbQkJPSBpc2NzaV9jb25uX3NldF9wYXJhbSwKLQkuZ2V0X3BhcmFtCQk9IGlzY3NpX2Nvbm5fZ2V0X3BhcmFtLAorCS5nZXRfY29ubl9wYXJhbQkJPSBpc2NzaV9jb25uX2dldF9wYXJhbSwKKwkuZ2V0X3Nlc3Npb25fcGFyYW0JPSBpc2NzaV9zZXNzaW9uX2dldF9wYXJhbSwKIAkuc3RhcnRfY29ubgkJPSBpc2NzaV9jb25uX3N0YXJ0LAogCS5zdG9wX2Nvbm4JCT0gaXNjc2lfY29ubl9zdG9wLAogCS5zZW5kX3BkdQkJPSBpc2NzaV9jb25uX3NlbmRfcGR1LApAQCAtMzYzMyw4ICszNjI3LDYgQEAKIHN0YXRpYyBpbnQgX19pbml0CiBpc2NzaV90Y3BfaW5pdCh2b2lkKQogewotCWludCBlcnJvcjsKLQogCWlmIChpc2NzaV9tYXhfbHVuIDwgMSkgewogCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgbWF4X2x1biB2YWx1ZSBvZiAldVxuIiwgaXNjc2lfbWF4X2x1bik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzY0NywxMSArMzYzOSwxMCBAQAogCWlmICghdGFza2NhY2hlKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWVycm9yID0gaXNjc2lfcmVnaXN0ZXJfdHJhbnNwb3J0KCZpc2NzaV90Y3BfdHJhbnNwb3J0KTsKLQlpZiAoZXJyb3IpCisJaWYgKCFpc2NzaV9yZWdpc3Rlcl90cmFuc3BvcnQoJmlzY3NpX3RjcF90cmFuc3BvcnQpKQogCQlrbWVtX2NhY2hlX2Rlc3Ryb3kodGFza2NhY2hlKTsKIAotCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmggYi9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmgKaW5kZXggODU1ZjJkZi4uZjk1ZTYxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5oCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuaApAQCAtMTU4LDcgKzE1OCw3IEBACiAJc3RydWN0IGtmaWZvCQkqbWdtdHF1ZXVlOwkvKiBtZ210IChjb250cm9sKSB4bWl0IHF1ZXVlICovCiAJc3RydWN0IGtmaWZvCQkqeG1pdHF1ZXVlOwkvKiBkYXRhLXBhdGggY21kIHF1ZXVlICovCiAJc3RydWN0IHdvcmtfc3RydWN0CXhtaXR3b3JrOwkvKiBwZXItY29ubi4geG1pdCB3b3JrcXVldWUgKi8KLQlzdHJ1Y3Qgc2VtYXBob3JlCXhtaXRzZW1hOwkvKiBzZXJpYWxpemVzIGNvbm5lY3Rpb24geG1pdCwKKwlzdHJ1Y3QgbXV0ZXgJCXhtaXRtdXRleDsJLyogc2VyaWFsaXplcyBjb25uZWN0aW9uIHhtaXQsCiAJCQkJCQkgKiBhY2Nlc3MgdG8ga2ZpZm9zOgkgICoKIAkJCQkJCSAqIHhtaXRxdWV1ZSwgd3JpdGVxdWV1ZSwgKgogCQkJCQkJICogaW1tcXVldWUsIG1nbXRxdWV1ZSAgICAqLwpAQCAtMTkxLDYgKzE5MSw4IEBACiAJdWludDMyX3QJCXNlbmRwYWdlX2ZhaWx1cmVzX2NudDsKIAl1aW50MzJfdAkJZGlzY29udGlndW91c19oZHJfY250OwogCXVpbnQzMl90CQllaF9hYm9ydF9jbnQ7CisKKwlzc2l6ZV90ICgqc2VuZHBhZ2UpKHN0cnVjdCBzb2NrZXQgKiwgc3RydWN0IHBhZ2UgKiwgaW50LCBzaXplX3QsIGludCk7CiB9OwogCiBzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiB7CkBAIC0yNDAsOCArMjQyLDggQEAKIAogc3RydWN0IGlzY3NpX2J1ZiB7CiAJc3RydWN0IHNjYXR0ZXJsaXN0CXNnOwotCXN0cnVjdCBrdmVjCQlpb3Y7CiAJdW5zaWduZWQgaW50CQlzZW50OworCWNoYXIJCQl1c2Vfc2VuZG1zZzsKIH07CiAKIHN0cnVjdCBpc2NzaV9kYXRhX3Rhc2sgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmF0YS1jb3JlLmMgYi9kcml2ZXJzL3Njc2kvbGliYXRhLWNvcmUuYwppbmRleCBmNTViOWIzLi40NmM0Y2RiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliYXRhLWNvcmUuYworKysgYi9kcml2ZXJzL3Njc2kvbGliYXRhLWNvcmUuYwpAQCAtNjExLDYgKzYxMSwxMCBAQAogCWlmIChkZXYtPmZsYWdzICYgQVRBX0RGTEFHX1BJTykgewogCQl0Zi0+cHJvdG9jb2wgPSBBVEFfUFJPVF9QSU87CiAJCWluZGV4ID0gZGV2LT5tdWx0aV9jb3VudCA/IDAgOiA4OworCX0gZWxzZSBpZiAobGJhNDggJiYgKHFjLT5hcC0+ZmxhZ3MgJiBBVEFfRkxBR19QSU9fTEJBNDgpKSB7CisJCS8qIFVuYWJsZSB0byB1c2UgRE1BIGR1ZSB0byBob3N0IGxpbWl0YXRpb24gKi8KKwkJdGYtPnByb3RvY29sID0gQVRBX1BST1RfUElPOworCQlpbmRleCA9IGRldi0+bXVsdGlfY291bnQgPyAwIDogNDsKIAl9IGVsc2UgewogCQl0Zi0+cHJvdG9jb2wgPSBBVEFfUFJPVF9ETUE7CiAJCWluZGV4ID0gMTY7CkBAIC0xMDUxLDE4ICsxMDU1LDIyIEBACiB7CiAJdTE2IG1vZGVzOwogCi0JLyogVXN1YWwgY2FzZS4gV29yZCA1MyBpbmRpY2F0ZXMgd29yZCA4OCBpcyB2YWxpZCAqLwotCWlmIChhZGV2LT5pZFtBVEFfSURfRklFTERfVkFMSURdICYgKDEgPDwgMikpIHsKKwkvKiBVc3VhbCBjYXNlLiBXb3JkIDUzIGluZGljYXRlcyB3b3JkIDY0IGlzIHZhbGlkICovCisJaWYgKGFkZXYtPmlkW0FUQV9JRF9GSUVMRF9WQUxJRF0gJiAoMSA8PCAxKSkgewogCQltb2RlcyA9IGFkZXYtPmlkW0FUQV9JRF9QSU9fTU9ERVNdICYgMHgwMzsKIAkJbW9kZXMgPDw9IDM7CiAJCW1vZGVzIHw9IDB4NzsKIAkJcmV0dXJuIG1vZGVzOwogCX0KIAotCS8qIElmIHdvcmQgODggaXNuJ3QgdmFsaWQgdGhlbiBXb3JkIDUxIGhvbGRzIHRoZSBQSU8gdGltaW5nIG51bWJlcgotCSAgIGZvciB0aGUgbWF4aW11bS4gVHVybiBpdCBpbnRvIGEgbWFzayBhbmQgcmV0dXJuIGl0ICovCi0JbW9kZXMgPSAoMiA8PCAoYWRldi0+aWRbQVRBX0lEX09MRF9QSU9fTU9ERVNdICYgMHhGRikpIC0gMSA7CisJLyogSWYgd29yZCA2NCBpc24ndCB2YWxpZCB0aGVuIFdvcmQgNTEgaGlnaCBieXRlIGhvbGRzIHRoZSBQSU8gdGltaW5nCisJICAgbnVtYmVyIGZvciB0aGUgbWF4aW11bS4gVHVybiBpdCBpbnRvIGEgbWFzayBhbmQgcmV0dXJuIGl0ICovCisJbW9kZXMgPSAoMiA8PCAoKGFkZXYtPmlkW0FUQV9JRF9PTERfUElPX01PREVTXSA+PiA4KSAmIDB4RkYpKSAtIDEgOwogCXJldHVybiBtb2RlczsKKwkvKiBCdXQgd2FpdC4uIHRoZXJlJ3MgbW9yZS4gRGVzaWduIHlvdXIgc3RhbmRhcmRzIGJ5IGNvbW1pdHRlZSBhbmQKKwkgICB5b3UgdG9vIGNhbiBnZXQgYSBmcmVlIGlvcmR5IGZpZWxkIHRvIHByb2Nlc3MuIEhvd2V2ZXIgaXRzIHRoZSAKKwkgICBzcGVlZHMgbm90IHRoZSBtb2RlcyB0aGF0IGFyZSBzdXBwb3J0ZWQuLi4gTm90ZSBkcml2ZXJzIHVzaW5nIHRoZQorCSAgIHRpbWluZyBBUEkgd2lsbCBnZXQgdGhpcyByaWdodCBhbnl3YXkgKi8KIH0KIAogc3RydWN0IGF0YV9leGVjX2ludGVybmFsX2FyZyB7CkBAIC0xMTY1LDYgKzExNzMsMzkgQEAKIH0KIAogLyoqCisgKglhdGFfcGlvX25lZWRfaW9yZHkJLQljaGVjayBpZiBpb3JkeSBuZWVkZWQKKyAqCUBhZGV2OiBBVEEgZGV2aWNlCisgKgorICoJQ2hlY2sgaWYgdGhlIGN1cnJlbnQgc3BlZWQgb2YgdGhlIGRldmljZSByZXF1aXJlcyBJT1JEWS4gVXNlZAorICoJYnkgdmFyaW91cyBjb250cm9sbGVycyBmb3IgY2hpcCBjb25maWd1cmF0aW9uLgorICovCisKK3Vuc2lnbmVkIGludCBhdGFfcGlvX25lZWRfaW9yZHkoY29uc3Qgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCit7CisJaW50IHBpbzsKKwlpbnQgc3BlZWQgPSBhZGV2LT5waW9fbW9kZSAtIFhGRVJfUElPXzA7CisKKwlpZiAoc3BlZWQgPCAyKQorCQlyZXR1cm4gMDsKKwlpZiAoc3BlZWQgPiAyKQorCQlyZXR1cm4gMTsKKwkJCisJLyogSWYgd2UgaGF2ZSBubyBkcml2ZSBzcGVjaWZpYyBydWxlLCB0aGVuIFBJTyAyIGlzIG5vbiBJT1JEWSAqLworCisJaWYgKGFkZXYtPmlkW0FUQV9JRF9GSUVMRF9WQUxJRF0gJiAyKSB7CS8qIEVJREUgKi8KKwkJcGlvID0gYWRldi0+aWRbQVRBX0lEX0VJREVfUElPXTsKKwkJLyogSXMgdGhlIHNwZWVkIGZhc3RlciB0aGFuIHRoZSBkcml2ZSBhbGxvd3Mgbm9uIElPUkRZID8gKi8KKwkJaWYgKHBpbykgeworCQkJLyogVGhpcyBpcyBjeWNsZSB0aW1lcyBub3QgZnJlcXVlbmN5IC0gd2F0Y2ggdGhlIGxvZ2ljISAqLworCQkJaWYgKHBpbyA+IDI0MCkJLyogUElPMiBpcyAyNDBuUyBwZXIgY3ljbGUgKi8KKwkJCQlyZXR1cm4gMTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKICAqCWF0YV9kZXZfaWRlbnRpZnkgLSBvYnRhaW4gSURFTlRJRlkgeCBERVZJQ0UgcGFnZQogICoJQGFwOiBwb3J0IG9uIHdoaWNoIGRldmljZSB3ZSB3aXNoIHRvIHByb2JlIHJlc2lkZXMKICAqCUBkZXZpY2U6IGRldmljZSBidXMgYWRkcmVzcywgc3RhcnRpbmcgYXQgemVybwpAQCAtMTQxNSw3ICsxNDU2LDcgQEAKIAkJYXAtPnVkbWFfbWFzayAmPSBBVEFfVURNQTU7CiAJCWFwLT5ob3N0LT5tYXhfc2VjdG9ycyA9IEFUQV9NQVhfU0VDVE9SUzsKIAkJYXAtPmhvc3QtPmhvc3R0LT5tYXhfc2VjdG9ycyA9IEFUQV9NQVhfU0VDVE9SUzsKLQkJYXAtPmRldmljZS0+ZmxhZ3MgfD0gQVRBX0RGTEFHX0xPQ0tfU0VDVE9SUzsKKwkJYXAtPmRldmljZVtpXS5mbGFncyB8PSBBVEFfREZMQUdfTE9DS19TRUNUT1JTOwogCX0KIAogCWlmIChhcC0+b3BzLT5kZXZfY29uZmlnKQpAQCAtMTc0Nyw3ICsxNzg4LDcgQEAKIAl7IEFUQV9TSElGVF9QSU8sCVhGRVJfUElPXzAgfSwKIH07CiAKLXN0YXRpYyBpbmxpbmUgdTggYmFzZV9mcm9tX3NoaWZ0KHVuc2lnbmVkIGludCBzaGlmdCkKK3N0YXRpYyB1OCBiYXNlX2Zyb21fc2hpZnQodW5zaWduZWQgaW50IHNoaWZ0KQogewogCWludCBpOwogCkBAIC0zMDU2LDEwICszMDk3LDIxIEBACiBzdGF0aWMgdm9pZCBhdGFfZGF0YV94ZmVyKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKIAkJCSAgdW5zaWduZWQgaW50IGJ1ZmxlbiwgaW50IGRvX3dyaXRlKQogewotCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19NTUlPKQotCQlhdGFfbW1pb19kYXRhX3hmZXIoYXAsIGJ1ZiwgYnVmbGVuLCBkb193cml0ZSk7Ci0JZWxzZQotCQlhdGFfcGlvX2RhdGFfeGZlcihhcCwgYnVmLCBidWZsZW4sIGRvX3dyaXRlKTsKKwkvKiBNYWtlIHRoZSBjcmFwIGhhcmR3YXJlIHBheSB0aGUgY29zdHMgbm90IHRoZSBnb29kIHN0dWZmICovCisJaWYgKHVubGlrZWx5KGFwLT5mbGFncyAmIEFUQV9GTEFHX0lSUV9NQVNLKSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19NTUlPKQorCQkJYXRhX21taW9fZGF0YV94ZmVyKGFwLCBidWYsIGJ1ZmxlbiwgZG9fd3JpdGUpOworCQllbHNlCisJCQlhdGFfcGlvX2RhdGFfeGZlcihhcCwgYnVmLCBidWZsZW4sIGRvX3dyaXRlKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0gZWxzZSB7CisJCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19NTUlPKQorCQkJYXRhX21taW9fZGF0YV94ZmVyKGFwLCBidWYsIGJ1ZmxlbiwgZG9fd3JpdGUpOworCQllbHNlCisJCQlhdGFfcGlvX2RhdGFfeGZlcihhcCwgYnVmLCBidWZsZW4sIGRvX3dyaXRlKTsKKwl9CiB9CiAKIC8qKgpAQCAtNTEyMiw2ICs1MTc0LDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9kZXZfY29uZmlnKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3NpX3NpbXVsYXRlKTsKIAorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3Bpb19uZWVkX2lvcmR5KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV90aW1pbmdfY29tcHV0ZSk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfdGltaW5nX21lcmdlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYwppbmRleCA5ZWU4MjE4Li5kYWZhYmVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYwpAQCAtMTUwLDcgKzE1MCw3IEBACiAJcmV0dXJuIHBzYjsKIH0KIAotc3RydWN0ICBscGZjX3Njc2lfYnVmKgorc3RhdGljIHN0cnVjdCBscGZjX3Njc2lfYnVmKgogbHBmY19nZXRfc2NzaV9idWYoc3RydWN0IGxwZmNfaGJhICogcGhiYSkKIHsKIAlzdHJ1Y3QgIGxwZmNfc2NzaV9idWYgKiBscGZjX2NtZCA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWFjNTNjOTQuYyBiL2RyaXZlcnMvc2NzaS9tYWM1M2M5NC5jCmluZGV4IDkzMmRjZjAuLjMxMWE0MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tYWM1M2M5NC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tYWM1M2M5NC5jCkBAIC00MzIsMTEgKzQzMiwxMiBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CiAJdm9pZCAqZG1hX2NtZF9zcGFjZTsKIAl1bnNpZ25lZCBjaGFyICpjbGtwcm9wOwotCWludCBwcm9wbGVuOworCWludCBwcm9wbGVuLCByYyA9IC1FTk9ERVY7CiAKIAlpZiAobWFjaW9fcmVzb3VyY2VfY291bnQobWRldikgIT0gMiB8fCBtYWNpb19pcnFfY291bnQobWRldikgIT0gMikgewotCQlwcmludGsoS0VSTl9FUlIgIm1hYzUzYzk0OiBleHBlY3RlZCAyIGFkZHJzIGFuZCBpbnRycyAoZ290ICVkLyVkKVxuIiwKLQkJICAgICAgIG5vZGUtPm5fYWRkcnMsIG5vZGUtPm5faW50cnMpOworCQlwcmludGsoS0VSTl9FUlIgIm1hYzUzYzk0OiBleHBlY3RlZCAyIGFkZHJzIGFuZCBpbnRycyIKKwkJICAgICAgICIgKGdvdCAlZC8lZClcbiIsCisJCSAgICAgICBtYWNpb19yZXNvdXJjZV9jb3VudChtZGV2KSwgbWFjaW9faXJxX2NvdW50KG1kZXYpKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC00NDgsNiArNDQ5LDcgQEAKICAgICAgICAJaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmbWFjNTNjOTRfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgZnNjX3N0YXRlKSk7CiAJaWYgKGhvc3QgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIm1hYzUzYzk0OiBjb3VsZG4ndCByZWdpc3RlciBob3N0Iik7CisJCXJjID0gLUVOT01FTTsKIAkJZ290byBvdXRfcmVsZWFzZTsKIAl9CiAKQEAgLTQ4Niw2ICs0ODgsNyBAQAogICAgICAgIAlpZiAoZG1hX2NtZF9zcGFjZSA9PSAwKSB7CiAgICAgICAgCQlwcmludGsoS0VSTl9FUlIgIm1hYzUzYzk0OiBjb3VsZG4ndCBhbGxvY2F0ZSBkbWEgIgogICAgICAgIAkJICAgICAgICJjb21tYW5kIHNwYWNlIGZvciAlc1xuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJcmMgPSAtRU5PTUVNOwogICAgICAgIAkJZ290byBvdXRfZnJlZTsKICAgICAgICAJfQogCXN0YXRlLT5kbWFfY21kcyA9IChzdHJ1Y3QgZGJkbWFfY21kICopREJETUFfQUxJR04oZG1hX2NtZF9zcGFjZSk7CkBAIC00OTUsMTggKzQ5OCwyMSBAQAogCiAJbWFjNTNjOTRfaW5pdChzdGF0ZSk7CiAKLQlpZiAocmVxdWVzdF9pcnEoc3RhdGUtPmludHIsIGRvX21hYzUzYzk0X2ludGVycnVwdCwgMCwgIjUzQzk0Iiwgc3RhdGUpKSB7CisJaWYgKHJlcXVlc3RfaXJxKHN0YXRlLT5pbnRyLCBkb19tYWM1M2M5NF9pbnRlcnJ1cHQsIDAsICI1M0M5NCIsc3RhdGUpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAibWFjNTNDOTQ6IGNhbid0IGdldCBpcnEgJWQgZm9yICVzXG4iLAogCQkgICAgICAgc3RhdGUtPmludHIsIG5vZGUtPmZ1bGxfbmFtZSk7CiAJCWdvdG8gb3V0X2ZyZWVfZG1hOwogCX0KIAotCS8qIFhYWCBGSVhNRTogaGFuZGxlIGZhaWx1cmUgKi8KLQlzY3NpX2FkZF9ob3N0KGhvc3QsICZtZGV2LT5vZmRldi5kZXYpOwotCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworCXJjID0gc2NzaV9hZGRfaG9zdChob3N0LCAmbWRldi0+b2ZkZXYuZGV2KTsKKwlpZiAocmMgIT0gMCkKKwkJZ290byBvdXRfcmVsZWFzZV9pcnE7CiAKKwlzY3NpX3NjYW5faG9zdChob3N0KTsKIAlyZXR1cm4gMDsKIAorIG91dF9yZWxlYXNlX2lycToKKwlmcmVlX2lycShzdGF0ZS0+aW50ciwgc3RhdGUpOwogIG91dF9mcmVlX2RtYToKIAlrZnJlZShzdGF0ZS0+ZG1hX2NtZF9zcGFjZSk7CiAgb3V0X2ZyZWU6CkBAIC01MTgsNyArNTI0LDcgQEAKICBvdXRfcmVsZWFzZToKIAltYWNpb19yZWxlYXNlX3Jlc291cmNlcyhtZGV2KTsKIAotCXJldHVybiAgLUVOT0RFVjsKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgbWFjNTNjOTRfcmVtb3ZlKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuYyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jCmluZGV4IDRhNmZlYjEuLmQxMDFhOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jCkBAIC00NDc5LDcgKzQ0NzksNyBAQAogCSAqIHNlcmlhbGl6ZWQuIFRoaXMgaXMgc28gYmVjYXVzZSB3ZSB3YW50IHRvIHJlc2VydmUgbWF4aW11bSBudW1iZXIgb2YKIAkgKiBhdmFpbGFibGUgY29tbWFuZCBpZHMgZm9yIHRoZSBJL08gY29tbWFuZHMuCiAJICovCi0JZG93bigmYWRhcHRlci0+aW50X210eCk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+aW50X210eCk7CiAKIAlzY2IgPSAmYWRhcHRlci0+aW50X3NjYjsKIAltZW1zZXQoc2NiLCAwLCBzaXplb2Yoc2NiX3QpKTsKQEAgLTQ1MjcsNyArNDUyNyw3IEBACiAJCQltYy0+Y21kLCBtYy0+b3Bjb2RlLCBtYy0+c3Vib3Bjb2RlLCBzY21kLT5yZXN1bHQpOwogCX0KIAotCXVwKCZhZGFwdGVyLT5pbnRfbXR4KTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPmludF9tdHgpOwogCiAJcmV0dXJuIHJ2YWw7CiB9CkBAIC00ODY2LDcgKzQ4NjYsNyBAQAogCQlhZGFwdGVyLT5oYXNfNjRiaXRfYWRkciA9IDA7CiAJfQogCQkKLQlpbml0X01VVEVYKCZhZGFwdGVyLT5pbnRfbXR4KTsKKwltdXRleF9pbml0KCZhZGFwdGVyLT5pbnRfbXR4KTsKIAlpbml0X2NvbXBsZXRpb24oJmFkYXB0ZXItPmludF93YWl0cSk7CiAKIAlhZGFwdGVyLT50aGlzX2lkID0gREVGQVVMVF9JTklUSUFUT1JfSUQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuaCBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5oCmluZGV4IDZmOTA3ODAuLjRiM2UwZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5oCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5oCkBAIC0yLDcgKzIsNyBAQAogI2RlZmluZSBfX01FR0FSQUlEX0hfXwogCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLQorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNkZWZpbmUgTUVHQVJBSURfVkVSU0lPTglcCiAJInYyLjAwLjMgKFJlbGVhc2UgRGF0ZTogV2VkIEZlYiAxOSAwODo1MTozMCBFU1QgMjAwMylcbiIKQEAgLTg4OSw3ICs4ODksNyBAQAogCiAJc2NiX3QJCQlpbnRfc2NiOwogCVNjc2lfQ21uZAkJaW50X3NjbWQ7Ci0Jc3RydWN0IHNlbWFwaG9yZQlpbnRfbXR4OwkvKiBUbyBzeW5jaHJvbml6ZSB0aGUgaW50ZXJuYWwKKwlzdHJ1Y3QgbXV0ZXgJCWludF9tdHg7CS8qIFRvIHN5bmNocm9uaXplIHRoZSBpbnRlcm5hbAogCQkJCQkJY29tbWFuZHMgKi8KIAlzdHJ1Y3QgY29tcGxldGlvbglpbnRfd2FpdHE7CS8qIHdhaXQgcXVldWUgZm9yIGludGVybmFsCiAJCQkJCQkgY21kcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21ib3guYyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tYm94LmMKaW5kZXggZDE4YTRiYy4uYmY5ZjdmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21ib3guYworKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbWJveC5jCkBAIC0xMjY2LDcgKzEyNjYsNyBAQAogICogcmV0dXJuIHRoZSBzY2IgZnJvbSB0aGUgaGVhZCBvZiB0aGUgZnJlZSBsaXN0LiBOVUxMIGlmIHRoZXJlIGFyZSBub25lCiAgKiBhdmFpbGFibGUKICAqKi8KLXN0YXRpYyBpbmxpbmUgc2NiX3QgKgorc3RhdGljIHNjYl90ICoKIG1lZ2FyYWlkX2FsbG9jX3NjYihhZGFwdGVyX3QgKmFkYXB0ZXIsIHN0cnVjdCBzY3NpX2NtbmQgKnNjcCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSpoZWFkID0gJmFkYXB0ZXItPmtzY2JfcG9vbDsKQEAgLTEzMjksNyArMTMyOSw3IEBACiAgKgogICogcHJlcGFyZSB0aGUgc2NhdHRlci1nYXRoZXIgbGlzdAogICovCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGludAogbWVnYXJhaWRfbWJveF9ta3NnbChhZGFwdGVyX3QgKmFkYXB0ZXIsIHNjYl90ICpzY2IpCiB7CiAJc3RydWN0IHNjYXR0ZXJsaXN0CSpzZ2w7CkBAIC0xNDAyLDcgKzE0MDIsNyBAQAogICoKICAqIHBvc3QgdGhlIGNvbW1hbmQgdG8gdGhlIGNvbnRyb2xsZXIgaWYgbWFpbGJveCBpcyBhdmFpbGJsZS4KICAqLwotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbnQKIG1ib3hfcG9zdF9jbWQoYWRhcHRlcl90ICphZGFwdGVyLCBzY2JfdCAqc2NiKQogewogCW1yYWlkX2RldmljZV90CSpyYWlkX2RldiA9IEFEQVAyUkFJRERFVihhZGFwdGVyKTsKQEAgLTIwNzAsNyArMjA3MCw3IEBACiAgKgogICogUmV0dXJuczoJMSBpZiB0aGUgaW50ZXJydXB0IGlzIHZhbGlkLCAwIG90aGVyd2lzZQogICovCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGludAogbWVnYXJhaWRfYWNrX3NlcXVlbmNlKGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKIAltcmFpZF9kZXZpY2VfdAkJKnJhaWRfZGV2ID0gQURBUDJSQUlEREVWKGFkYXB0ZXIpOwpAQCAtMjIwOCw3ICsyMjA4LDcgQEAKICAqCiAgKiBETUEgc3luYyBpZiByZXF1aXJlZC4KICAqLwotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogbWVnYXJhaWRfbWJveF9zeW5jX3NjYihhZGFwdGVyX3QgKmFkYXB0ZXIsIHNjYl90ICpzY2IpCiB7CiAJbWJveF9jY2JfdAkqY2NiOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21tLmggYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbW0uaAppbmRleCBlYjhjMzkwLi4zZDllNjdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbW0uaAorKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbW0uaApAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvY3RsMzIuaD4KIAogI2luY2x1ZGUgIm1ib3hfZGVmcy5oIgogI2luY2x1ZGUgIm1lZ2FyYWlkX2lvY3RsLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzLmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzLmMKaW5kZXggM2MzMmU2OS4uNTExZWQ1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXMuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KQEAgLTcyLDcgKzczLDcgQEAKIHN0YXRpYyBpbnQgbWVnYXNhc19tZ210X21ham9ybm87CiBzdGF0aWMgc3RydWN0IG1lZ2FzYXNfbWdtdF9pbmZvIG1lZ2FzYXNfbWdtdF9pbmZvOwogc3RhdGljIHN0cnVjdCBmYXN5bmNfc3RydWN0ICptZWdhc2FzX2FzeW5jX3F1ZXVlOwotc3RhdGljIERFQ0xBUkVfTVVURVgobWVnYXNhc19hc3luY19xdWV1ZV9tdXRleCk7CitzdGF0aWMgREVGSU5FX01VVEVYKG1lZ2FzYXNfYXN5bmNfcXVldWVfbXV0ZXgpOwogCiAvKioKICAqIG1lZ2FzYXNfZ2V0X2NtZCAtCUdldCBhIGNvbW1hbmQgZnJvbSB0aGUgZnJlZSBwb29sCkBAIC04MCw3ICs4MSw3IEBACiAgKgogICogUmV0dXJucyBhIGZyZWUgY29tbWFuZCBmcm9tIHRoZSBwb29sCiAgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IG1lZ2FzYXNfY21kICptZWdhc2FzX2dldF9jbWQoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UKK3N0YXRpYyBzdHJ1Y3QgbWVnYXNhc19jbWQgKm1lZ2FzYXNfZ2V0X2NtZChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZQogCQkJCQkJICAqaW5zdGFuY2UpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTI2Miw3ICsyNjMsNyBAQAogICogSWYgc3VjY2Vzc2Z1bCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgU0cgZWxlbWVudHMuIE90aGVyd2lzZSwKICAqIGl0IHJldHVybmVzIC0xLgogICovCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGludAogbWVnYXNhc19tYWtlX3NnbDMyKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwgc3RydWN0IHNjc2lfY21uZCAqc2NwLAogCQkgICB1bmlvbiBtZWdhc2FzX3NnbCAqbWZpX3NnbCkKIHsKQEAgLTMxMCw3ICszMTEsNyBAQAogICogSWYgc3VjY2Vzc2Z1bCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgU0cgZWxlbWVudHMuIE90aGVyd2lzZSwKICAqIGl0IHJldHVybmVzIC0xLgogICovCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGludAogbWVnYXNhc19tYWtlX3NnbDY0KHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwgc3RydWN0IHNjc2lfY21uZCAqc2NwLAogCQkgICB1bmlvbiBtZWdhc2FzX3NnbCAqbWZpX3NnbCkKIHsKQEAgLTM1OSw3ICszNjAsNyBAQAogICogVGhpcyBmdW5jdGlvbiBwcmVwYXJlcyBDREIgY29tbWFuZHMuIFRoZXNlIGFyZSB0eXBjaWFsbHkgcGFzcy10aHJvdWdoCiAgKiBjb21tYW5kcyB0byB0aGUgZGV2aWNlcy4KICAqLwotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbnQKIG1lZ2FzYXNfYnVpbGRfZGNkYihzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsIHN0cnVjdCBzY3NpX2NtbmQgKnNjcCwKIAkJICAgc3RydWN0IG1lZ2FzYXNfY21kICpjbWQpCiB7CkBAIC00NDAsNyArNDQxLDcgQEAKICAqCiAgKiBGcmFtZXMgKGFuZCBhY2NvbXBhbnlpbmcgU0dMcykgZm9yIHJlZ3VsYXIgU0NTSSBJT3MgdXNlIHRoaXMgZnVuY3Rpb24uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW50CiBtZWdhc2FzX2J1aWxkX2xkaW8oc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3AsCiAJCSAgIHN0cnVjdCBtZWdhc2FzX2NtZCAqY21kKQogewpAQCAtNTYyLDcgKzU2Myw3IEBACiAgKiBAc2NwOgkJU0NTSSBjb21tYW5kCiAgKiBAZnJhbWVfY291bnQ6CVtPVVRdIE51bWJlciBvZiBmcmFtZXMgdXNlZCB0byBwcmVwYXJlIHRoaXMgY29tbWFuZAogICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBtZWdhc2FzX2NtZCAqbWVnYXNhc19idWlsZF9jbWQoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UKK3N0YXRpYyBzdHJ1Y3QgbWVnYXNhc19jbWQgKm1lZ2FzYXNfYnVpbGRfY21kKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlCiAJCQkJCQkgICAgKmluc3RhbmNlLAogCQkJCQkJICAgIHN0cnVjdCBzY3NpX2NtbmQgKnNjcCwKIAkJCQkJCSAgICBpbnQgKmZyYW1lX2NvdW50KQpAQCAtOTEzLDcgKzkxNCw3IEBACiAgKiBAaW5zdGFuY2U6CQkJQWRhcHRlciBzb2Z0IHN0YXRlCiAgKiBAY21kOgkJCUNvbXBsZXRlZCBjb21tYW5kCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAorc3RhdGljIHZvaWQKIG1lZ2FzYXNfdW5tYXBfc2didWYoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLCBzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZCkKIHsKIAlkbWFfYWRkcl90IGJ1Zl9oOwpAQCAtOTU3LDcgKzk1OCw3IEBACiAgKiAJCQkJYW4gYWx0ZXJuYXRlIHN0YXR1cyAoYXMgaW4gdGhlIGNhc2Ugb2YgYWJvcnRlZAogICogCQkJCWNvbW1hbmRzKQogICovCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyB2b2lkCiBtZWdhc2FzX2NvbXBsZXRlX2NtZChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsIHN0cnVjdCBtZWdhc2FzX2NtZCAqY21kLAogCQkgICAgIHU4IGFsdF9zdGF0dXMpCiB7CkBAIC0xMTA0LDcgKzExMDUsNyBAQAogICogCQkJCQlTQ1NJIG1pZC1sYXllciBpbnN0ZWFkIG9mIHRoZSBzdGF0dXMKICAqIAkJCQkJcmV0dXJuZWQgYnkgdGhlIEZXCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW50CiBtZWdhc2FzX2RlcGxldGVfcmVwbHlfcXVldWUoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLCB1OCBhbHRfc3RhdHVzKQogewogCXUzMiBzdGF0dXM7CkBAIC0yMzYyLDExICsyMzYzLDExIEBACiB7CiAJaW50IHJjOwogCi0JZG93bigmbWVnYXNhc19hc3luY19xdWV1ZV9tdXRleCk7CisJbXV0ZXhfbG9jaygmbWVnYXNhc19hc3luY19xdWV1ZV9tdXRleCk7CiAKIAlyYyA9IGZhc3luY19oZWxwZXIoZmQsIGZpbGVwLCBtb2RlLCAmbWVnYXNhc19hc3luY19xdWV1ZSk7CiAKLQl1cCgmbWVnYXNhc19hc3luY19xdWV1ZV9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZtZWdhc2FzX2FzeW5jX3F1ZXVlX211dGV4KTsKIAogCWlmIChyYyA+PSAwKSB7CiAJCS8qIEZvciBzYW5pdHkgY2hlY2sgd2hlbiB3ZSBnZXQgaW9jdGwgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZXNoLmMgYi9kcml2ZXJzL3Njc2kvbWVzaC5jCmluZGV4IGJkY2NmNzMuLmQ2ZDIxMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZXNoLmMKKysrIGIvZHJpdmVycy9zY3NpL21lc2guYwpAQCAtMTg2OSw3ICsxODY5LDggQEAKIAogCWlmIChtYWNpb19yZXNvdXJjZV9jb3VudChtZGV2KSAhPSAyIHx8IG1hY2lvX2lycV9jb3VudChtZGV2KSAhPSAyKSB7CiAgICAgICAgCQlwcmludGsoS0VSTl9FUlIgIm1lc2g6IGV4cGVjdGVkIDIgYWRkcnMgYW5kIDIgaW50cnMiCi0JICAgICAgIAkgICAgICAgIiAoZ290ICVkLCVkKVxuIiwgbWVzaC0+bl9hZGRycywgbWVzaC0+bl9pbnRycyk7CisJICAgICAgIAkgICAgICAgIiAoZ290ICVkLCVkKVxuIiwgbWFjaW9fcmVzb3VyY2VfY291bnQobWRldiksCisJCSAgICAgICBtYWNpb19pcnFfY291bnQobWRldikpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9va3RhZ29uX2VzcC5jIGIvZHJpdmVycy9zY3NpL29rdGFnb25fZXNwLmMKaW5kZXggNWQ5YzlhZC4uZGVlNDI2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL29rdGFnb25fZXNwLmMKKysrIGIvZHJpdmVycy9zY3NpL29rdGFnb25fZXNwLmMKQEAgLTQ5MCw3ICs0OTAsNyBAQAogCiBzdGF0aWMgaW50IGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApCiB7Ci0JcmV0dXJuICgoY3VzdG9tLmludGVuYXIpICYgSUZfUE9SVFMpOworCXJldHVybiAoKGFtaWdhX2N1c3RvbS5pbnRlbmFyKSAmIElGX1BPUlRTKTsKIH0KIAogc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvS2NvbmZpZyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L0tjb25maWcKaW5kZXggNTIwNWM0ZS4uNTc1OGIyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvS2NvbmZpZworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9LY29uZmlnCkBAIC0xLDQgKzEsNCBAQAotY29uZmlnIFNDU0lfUUxBMlhYWAorY29uZmlnIFNDU0lfUUxBX0ZDCiAJdHJpc3RhdGUgIlFMb2dpYyBRTEEyWFhYIEZpYnJlIENoYW5uZWwgU3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJCiAJc2VsZWN0IFNDU0lfRkNfQVRUUlMKQEAgLTIyLDQ5ICsyMiw1NyBAQAogCVVwb24gcmVxdWVzdCwgdGhlIGRyaXZlciBjYWNoZXMgdGhlIGZpcm13YXJlIGltYWdlIHVudGlsCiAJdGhlIGRyaXZlciBpcyB1bmxvYWRlZC4KIAorCUZpcm13YXJlIGltYWdlcyBjYW4gYmUgcmV0cmlldmVkIGZyb206CisKKwkJZnRwOi8vZnRwLnFsb2dpYy5jb20vb3V0Z29pbmcvbGludXgvZmlybXdhcmUvCisKIAlOT1RFOiBUaGUgb3JpZ2luYWwgbWV0aG9kIG9mIGJ1aWxkaW5nIGZpcm13YXJlLWxvYWRlcgogCW1vZHVsZXMgaGFzIGJlZW4gZGVwcmVjYXRlZCBhcyB0aGUgZmlybXdhcmUtaW1hZ2VzIHdpbGwKIAliZSByZW1vdmVkIGZyb20gdGhlIGtlcm5lbCBzb3VyY2VzLgogCiBjb25maWcgU0NTSV9RTEEyWFhYX0VNQkVEREVEX0ZJUk1XQVJFCiAJYm9vbCAiICBVc2UgZmlybXdhcmUtbG9hZGVyIG1vZHVsZXMgKERFUFJFQ0FURUQpIgotCWRlcGVuZHMgb24gU0NTSV9RTEEyWFhYCisJZGVwZW5kcyBvbiBTQ1NJX1FMQV9GQworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIG9mZmVycyB5b3UgdGhlIGRlcHJlY2F0ZWQgZmlybXdhcmUtbG9hZGVyCisJICBtb2R1bGVzIHRoYXQgaGF2ZSBiZWVuIG9ic29sZXRlZCBieSB0aGUgdXNhZ2Ugb2YgdGhlCisJICBGaXJtd2FyZSBMb2FkZXIgaW50ZXJmYWNlIGluIHRoZSBxbGEyeHh4IGRyaXZlci4KIAogY29uZmlnIFNDU0lfUUxBMjFYWAogCXRyaXN0YXRlICIgIEJ1aWxkIFFMb2dpYyBJU1AyMTAwIGZpcm13YXJlLW1vZHVsZSIKLQlkZXBlbmRzIG9uIFNDU0lfUUxBMlhYWF9FTUJFRERFRF9GSVJNV0FSRQorCWRlcGVuZHMgb24gU0NTSV9RTEFfRkMgJiYgU0NTSV9RTEEyWFhYX0VNQkVEREVEX0ZJUk1XQVJFCiAJLS0taGVscC0tLQogCVRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBRTG9naWMgMjF4eCAoSVNQMjEwMCkgaG9zdCBhZGFwdGVyIGZhbWlseS4KIAogY29uZmlnIFNDU0lfUUxBMjJYWAogCXRyaXN0YXRlICIgIEJ1aWxkIFFMb2dpYyBJU1AyMjAwIGZpcm13YXJlLW1vZHVsZSIKLQlkZXBlbmRzIG9uIFNDU0lfUUxBMlhYWF9FTUJFRERFRF9GSVJNV0FSRQorCWRlcGVuZHMgb24gU0NTSV9RTEFfRkMgJiYgU0NTSV9RTEEyWFhYX0VNQkVEREVEX0ZJUk1XQVJFCiAJLS0taGVscC0tLQogCVRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBRTG9naWMgMjJ4eCAoSVNQMjIwMCkgaG9zdCBhZGFwdGVyIGZhbWlseS4KIAogY29uZmlnIFNDU0lfUUxBMjMwMAogCXRyaXN0YXRlICIgIEJ1aWxkIFFMb2dpYyBJU1AyMzAwIGZpcm13YXJlLW1vZHVsZSIKLQlkZXBlbmRzIG9uIFNDU0lfUUxBMlhYWF9FTUJFRERFRF9GSVJNV0FSRQorCWRlcGVuZHMgb24gU0NTSV9RTEFfRkMgJiYgU0NTSV9RTEEyWFhYX0VNQkVEREVEX0ZJUk1XQVJFCiAJLS0taGVscC0tLQogCVRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBRTG9naWMgMjMwMCAoSVNQMjMwMCBhbmQgSVNQMjMxMikgaG9zdAogCWFkYXB0ZXIgZmFtaWx5LgogCiBjb25maWcgU0NTSV9RTEEyMzIyCiAJdHJpc3RhdGUgIiAgQnVpbGQgUUxvZ2ljIElTUDIzMjIgZmlybXdhcmUtbW9kdWxlIgotCWRlcGVuZHMgb24gU0NTSV9RTEEyWFhYX0VNQkVEREVEX0ZJUk1XQVJFCisJZGVwZW5kcyBvbiBTQ1NJX1FMQV9GQyAmJiBTQ1NJX1FMQTJYWFhfRU1CRURERURfRklSTVdBUkUKIAktLS1oZWxwLS0tCiAJVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIFFMb2dpYyAyMzIyIChJU1AyMzIyKSBob3N0IGFkYXB0ZXIgZmFtaWx5LgogCiBjb25maWcgU0NTSV9RTEE2MzEyCiAJdHJpc3RhdGUgIiAgQnVpbGQgUUxvZ2ljIElTUDYzeHggZmlybXdhcmUtbW9kdWxlIgotCWRlcGVuZHMgb24gU0NTSV9RTEEyWFhYX0VNQkVEREVEX0ZJUk1XQVJFCisJZGVwZW5kcyBvbiBTQ1NJX1FMQV9GQyAmJiBTQ1NJX1FMQTJYWFhfRU1CRURERURfRklSTVdBUkUKIAktLS1oZWxwLS0tCiAJVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIFFMb2dpYyA2M3h4IChJU1A2MzEyIGFuZCBJU1A2MzIyKSBob3N0CiAJYWRhcHRlciBmYW1pbHkuCiAKIGNvbmZpZyBTQ1NJX1FMQTI0WFgKIAl0cmlzdGF0ZSAiICBCdWlsZCBRTG9naWMgSVNQMjR4eCBmaXJtd2FyZS1tb2R1bGUiCi0JZGVwZW5kcyBvbiBTQ1NJX1FMQTJYWFhfRU1CRURERURfRklSTVdBUkUKKwlkZXBlbmRzIG9uIFNDU0lfUUxBX0ZDICYmIFNDU0lfUUxBMlhYWF9FTUJFRERFRF9GSVJNV0FSRQogCS0tLWhlbHAtLS0KIAlUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgUUxvZ2ljIDI0eHggKElTUDI0MjIgYW5kIElTUDI0MzIpIGhvc3QKIAlhZGFwdGVyIGZhbWlseS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvTWFrZWZpbGUKaW5kZXggNDBjMGRlMS4uZDAyOGJjNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L01ha2VmaWxlCkBAIC0zLDcgKzMsNyBAQAogcWxhMnh4eC15IDo9IHFsYV9vcy5vIHFsYV9pbml0Lm8gcWxhX21ieC5vIHFsYV9pb2NiLm8gcWxhX2lzci5vIHFsYV9ncy5vIFwKIAkJcWxhX2RiZy5vIHFsYV9zdXAubyBxbGFfcnNjbi5vIHFsYV9hdHRyLm8KIAotb2JqLSQoQ09ORklHX1NDU0lfUUxBMlhYWCkgKz0gcWxhMnh4eC5vCitvYmotJChDT05GSUdfU0NTSV9RTEFfRkMpICs9IHFsYTJ4eHgubwogCiBxbGEyMTAwLXkgOj0gcWwyMTAwLm8gcWwyMTAwX2Z3Lm8KIHFsYTIyMDAteSA6PSBxbDIyMDAubyBxbDIyMDBfZncubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKaW5kZXggMmVmY2E1Mi4uYjE3ZWU2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCkBAIC01NDEsNyArNTQxLDcgQEAKIHZvaWQKIHFsYTJ4MDBfaW5pdF9ob3N0X2F0dHIoc2NzaV9xbGFfaG9zdF90ICpoYSkKIHsKLQlmY19ob3N0X25vZGVfbmFtZShoYS0+aG9zdCkgPSB3d25fdG9fdTY0KGhhLT5pbml0X2NiLT5ub2RlX25hbWUpOwotCWZjX2hvc3RfcG9ydF9uYW1lKGhhLT5ob3N0KSA9IHd3bl90b191NjQoaGEtPmluaXRfY2ItPnBvcnRfbmFtZSk7CisJZmNfaG9zdF9ub2RlX25hbWUoaGEtPmhvc3QpID0gd3duX3RvX3U2NChoYS0+bm9kZV9uYW1lKTsKKwlmY19ob3N0X3BvcnRfbmFtZShoYS0+aG9zdCkgPSB3d25fdG9fdTY0KGhhLT5wb3J0X25hbWUpOwogCWZjX2hvc3Rfc3VwcG9ydGVkX2NsYXNzZXMoaGEtPmhvc3QpID0gRkNfQ09TX0NMQVNTMzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYwppbmRleCA1YzVkMjMxLi4yZDliMTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jCkBAIC0xMDAzLDEwICsxMDAzLDEwIEBACiAJZncgPSAoc3RydWN0IHFsYTI0eHhfZndfZHVtcCAqKSBoYS0+ZndfZHVtcDI0OwogCiAJcnZhbCA9IFFMQV9TVUNDRVNTOwotCWZ3LT5oY2NyID0gUkRfUkVHX0RXT1JEKCZyZWctPmhjY3IpOworCWZ3LT5ob3N0X3N0YXR1cyA9IFJEX1JFR19EV09SRCgmcmVnLT5ob3N0X3N0YXR1cyk7CiAKIAkvKiBQYXVzZSBSSVNDLiAqLwotCWlmICgoZnctPmhjY3IgJiBIQ0NSWF9SSVNDX1BBVVNFKSA9PSAwKSB7CisJaWYgKChSRF9SRUdfRFdPUkQoJnJlZy0+aGNjcikgJiBIQ0NSWF9SSVNDX1BBVVNFKSA9PSAwKSB7CiAJCVdSVF9SRUdfRFdPUkQoJnJlZy0+aGNjciwgSENDUlhfU0VUX1JJU0NfUkVTRVQgfAogCQkgICAgSENDUlhfQ0xSX0hPU1RfSU5UKTsKIAkJUkRfUkVHX0RXT1JEKCZyZWctPmhjY3IpOwkJLyogUENJIFBvc3RpbmcuICovCkBAIC0xMDIxLDE2ICsxMDIxLDU0IEBACiAJCX0KIAl9CiAKLQkvKiBEaXNhYmxlIGludGVycnVwdHMuICovCi0JV1JUX1JFR19EV09SRCgmcmVnLT5pY3RybCwgMCk7Ci0JUkRfUkVHX0RXT1JEKCZyZWctPmljdHJsKTsKLQogCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CiAJCS8qIEhvc3QgaW50ZXJmYWNlIHJlZ2lzdGVycy4gKi8KIAkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKHJlZyArIDApOwogCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+aG9zdF9yZWcpIC8gNDsgY250KyspCiAJCQlmdy0+aG9zdF9yZWdbY250XSA9IFJEX1JFR19EV09SRChkbXBfcmVnKyspOwogCisJCS8qIERpc2FibGUgaW50ZXJydXB0cy4gKi8KKwkJV1JUX1JFR19EV09SRCgmcmVnLT5pY3RybCwgMCk7CisJCVJEX1JFR19EV09SRCgmcmVnLT5pY3RybCk7CisKKwkJLyogU2hhZG93IHJlZ2lzdGVycy4gKi8KKwkJV1JUX1JFR19EV09SRCgmcmVnLT5pb2Jhc2VfYWRkciwgMHgwRjcwKTsKKwkJUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9hZGRyKTsKKwkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEYwKTsKKwkJV1JUX1JFR19EV09SRChkbXBfcmVnLCAweEIwMDAwMDAwKTsKKwkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEZDKTsKKwkJZnctPnNoYWRvd19yZWdbMF0gPSBSRF9SRUdfRFdPUkQoZG1wX3JlZyk7CisKKwkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEYwKTsKKwkJV1JUX1JFR19EV09SRChkbXBfcmVnLCAweEIwMTAwMDAwKTsKKwkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEZDKTsKKwkJZnctPnNoYWRvd19yZWdbMV0gPSBSRF9SRUdfRFdPUkQoZG1wX3JlZyk7CisKKwkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEYwKTsKKwkJV1JUX1JFR19EV09SRChkbXBfcmVnLCAweEIwMjAwMDAwKTsKKwkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEZDKTsKKwkJZnctPnNoYWRvd19yZWdbMl0gPSBSRF9SRUdfRFdPUkQoZG1wX3JlZyk7CisKKwkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEYwKTsKKwkJV1JUX1JFR19EV09SRChkbXBfcmVnLCAweEIwMzAwMDAwKTsKKwkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEZDKTsKKwkJZnctPnNoYWRvd19yZWdbM10gPSBSRF9SRUdfRFdPUkQoZG1wX3JlZyk7CisKKwkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEYwKTsKKwkJV1JUX1JFR19EV09SRChkbXBfcmVnLCAweEIwNDAwMDAwKTsKKwkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEZDKTsKKwkJZnctPnNoYWRvd19yZWdbNF0gPSBSRF9SRUdfRFdPUkQoZG1wX3JlZyk7CisKKwkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEYwKTsKKwkJV1JUX1JFR19EV09SRChkbXBfcmVnLCAweEIwNTAwMDAwKTsKKwkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEZDKTsKKwkJZnctPnNoYWRvd19yZWdbNV0gPSBSRF9SRUdfRFdPUkQoZG1wX3JlZyk7CisKKwkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEYwKTsKKwkJV1JUX1JFR19EV09SRChkbXBfcmVnLCAweEIwNjAwMDAwKTsKKwkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEZDKTsKKwkJZnctPnNoYWRvd19yZWdbNl0gPSBSRF9SRUdfRFdPUkQoZG1wX3JlZyk7CisKIAkJLyogTWFpbGJveCByZWdpc3RlcnMuICovCiAJCW1ieF9yZWcgPSAodWludDE2X3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHg4MCk7CiAJCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5tYWlsYm94X3JlZykgLyAyOyBjbnQrKykKQEAgLTEzMDgsNDMgKzEzNDYsNiBAQAogCQlmb3IgKGNudCA9IDA7IGNudCA8IDE2OyBjbnQrKykKIAkJCSppdGVyX3JlZysrID0gUkRfUkVHX0RXT1JEKGRtcF9yZWcrKyk7CiAKLQkJV1JUX1JFR19EV09SRCgmcmVnLT5pb2Jhc2VfYWRkciwgMHgwRjcwKTsKLQkJUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9hZGRyKTsKLQkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEYwKTsKLQkJV1JUX1JFR19EV09SRChkbXBfcmVnLCAweEIwMDAwMDAwKTsKLQkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEZDKTsKLQkJZnctPnNoYWRvd19yZWdbMF0gPSBSRF9SRUdfRFdPUkQoZG1wX3JlZyk7Ci0KLQkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEYwKTsKLQkJV1JUX1JFR19EV09SRChkbXBfcmVnLCAweEIwMTAwMDAwKTsKLQkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEZDKTsKLQkJZnctPnNoYWRvd19yZWdbMV0gPSBSRF9SRUdfRFdPUkQoZG1wX3JlZyk7Ci0KLQkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEYwKTsKLQkJV1JUX1JFR19EV09SRChkbXBfcmVnLCAweEIwMjAwMDAwKTsKLQkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEZDKTsKLQkJZnctPnNoYWRvd19yZWdbMl0gPSBSRF9SRUdfRFdPUkQoZG1wX3JlZyk7Ci0KLQkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEYwKTsKLQkJV1JUX1JFR19EV09SRChkbXBfcmVnLCAweEIwMzAwMDAwKTsKLQkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEZDKTsKLQkJZnctPnNoYWRvd19yZWdbM10gPSBSRF9SRUdfRFdPUkQoZG1wX3JlZyk7Ci0KLQkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEYwKTsKLQkJV1JUX1JFR19EV09SRChkbXBfcmVnLCAweEIwNDAwMDAwKTsKLQkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEZDKTsKLQkJZnctPnNoYWRvd19yZWdbNF0gPSBSRF9SRUdfRFdPUkQoZG1wX3JlZyk7Ci0KLQkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEYwKTsKLQkJV1JUX1JFR19EV09SRChkbXBfcmVnLCAweEIwNTAwMDAwKTsKLQkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEZDKTsKLQkJZnctPnNoYWRvd19yZWdbNV0gPSBSRF9SRUdfRFdPUkQoZG1wX3JlZyk7Ci0KLQkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEYwKTsKLQkJV1JUX1JFR19EV09SRChkbXBfcmVnLCAweEIwNjAwMDAwKTsKLQkJZG1wX3JlZyA9ICh1aW50MzJfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweEZDKTsKLQkJZnctPnNoYWRvd19yZWdbNl0gPSBSRF9SRUdfRFdPUkQoZG1wX3JlZyk7Ci0KIAkJLyogTG9jYWwgbWVtb3J5IGNvbnRyb2xsZXIgcmVnaXN0ZXJzLiAqLwogCQlpdGVyX3JlZyA9IGZ3LT5sbWNfcmVnOwogCQlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9hZGRyLCAweDMwMDApOwpAQCAtMTY3Nyw3ICsxNjc4LDcgQEAKIAkgICAgaGEtPmZ3X21ham9yX3ZlcnNpb24sIGhhLT5md19taW5vcl92ZXJzaW9uLAogCSAgICBoYS0+Zndfc3VibWlub3JfdmVyc2lvbiwgaGEtPmZ3X2F0dHJpYnV0ZXMpOwogCi0JcWxhX3VwcmludGYoJnVpdGVyLCAiXG5IQ0NSIFJlZ2lzdGVyXG4lMDR4XG4iLCBmdy0+aGNjcik7CisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5SMkggU3RhdHVzIFJlZ2lzdGVyXG4lMDR4XG4iLCBmdy0+aG9zdF9zdGF0dXMpOwogCiAJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5Ib3N0IEludGVyZmFjZSBSZWdpc3RlcnMiKTsKIAlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+aG9zdF9yZWcpIC8gNDsgY250KyspIHsKQEAgLTE2ODcsNiArMTY4OCwxNCBAQAogCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDh4ICIsIGZ3LT5ob3N0X3JlZ1tjbnRdKTsKIAl9CiAKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuU2hhZG93IFJlZ2lzdGVycyIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5zaGFkb3dfcmVnKSAvIDQ7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApCisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwOHggIiwgZnctPnNoYWRvd19yZWdbY250XSk7CisJfQorCiAJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cbk1haWxib3ggUmVnaXN0ZXJzIik7CiAJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPm1haWxib3hfcmVnKSAvIDI7IGNudCsrKSB7CiAJCWlmIChjbnQgJSA4ID09IDApCkBAIC0xODU1LDE0ICsxODY0LDYgQEAKIAkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA4eCAiLCBmdy0+cmlzY19ncF9yZWdbY250XSk7CiAJfQogCi0JcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cblNoYWRvdyBSZWdpc3RlcnMiKTsKLQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+c2hhZG93X3JlZykgLyA0OyBjbnQrKykgewotCQlpZiAoY250ICUgOCA9PSAwKQotCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKLQotCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDh4ICIsIGZ3LT5zaGFkb3dfcmVnW2NudF0pOwotCX0KLQogCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5MTUMgUmVnaXN0ZXJzIik7CiAJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPmxtY19yZWcpIC8gNDsgY250KyspIHsKIAkJaWYgKGNudCAlIDggPT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaAppbmRleCA5MzVhNTlhLi5hYjZhZmVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5oCkBAIC0yMjcsOCArMjI3LDkgQEAKICNkZWZpbmUgRldfRFVNUF9TSVpFXzI0WFgJMHgyQjAwMDAKIAogc3RydWN0IHFsYTI0eHhfZndfZHVtcCB7Ci0JdWludDMyX3QgaGNjcjsKKwl1aW50MzJfdCBob3N0X3N0YXR1czsKIAl1aW50MzJfdCBob3N0X3JlZ1szMl07CisJdWludDMyX3Qgc2hhZG93X3JlZ1s3XTsKIAl1aW50MTZfdCBtYWlsYm94X3JlZ1szMl07CiAJdWludDMyX3QgeHNlcV9ncF9yZWdbMTI4XTsKIAl1aW50MzJfdCB4c2VxXzBfcmVnWzE2XTsKQEAgLTI1MCw3ICsyNTEsNiBAQAogCXVpbnQzMl90IHJjdnQwX2RhdGFfZG1hX3JlZ1szMl07CiAJdWludDMyX3QgcmN2dDFfZGF0YV9kbWFfcmVnWzMyXTsKIAl1aW50MzJfdCByaXNjX2dwX3JlZ1sxMjhdOwotCXVpbnQzMl90IHNoYWRvd19yZWdbN107CiAJdWludDMyX3QgbG1jX3JlZ1sxMTJdOwogCXVpbnQzMl90IGZwbV9oZHdfcmVnWzE5Ml07CiAJdWludDMyX3QgZmJfaGR3X3JlZ1sxNzZdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCmluZGV4IGJlYzgxYWQuLjMyYmU0YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKQEAgLTYyLDYgKzYyLDcgQEAKIGV4dGVybiBpbnQgcWwyeHBsb2dpYWJzZW50ZGV2aWNlOwogZXh0ZXJuIGludCBxbDJ4bG9naW5yZXRyeWNvdW50OwogZXh0ZXJuIGludCBxbDJ4ZmRtaWVuYWJsZTsKK2V4dGVybiBpbnQgcWwyeHByb2Nlc3Nyc2NuOwogCiBleHRlcm4gdm9pZCBxbGEyeDAwX3NwX2NvbXBsKHNjc2lfcWxhX2hvc3RfdCAqLCBzcmJfdCAqKTsKIApAQCAtOTYsMTAgKzk3LDcgQEAKICAqIEdsb2JhbCBGdW5jdGlvbiBQcm90b3R5cGVzIGluIHFsYV9tYnguYyBzb3VyY2UgZmlsZS4KICAqLwogZXh0ZXJuIGludAotcWxhMngwMF9sb2FkX3JhbShzY3NpX3FsYV9ob3N0X3QgKiwgZG1hX2FkZHJfdCwgdWludDE2X3QsIHVpbnQxNl90KTsKLQotZXh0ZXJuIGludAotcWxhMngwMF9sb2FkX3JhbV9leHQoc2NzaV9xbGFfaG9zdF90ICosIGRtYV9hZGRyX3QsIHVpbnQzMl90LCB1aW50MzJfdCk7CitxbGEyeDAwX2xvYWRfcmFtKHNjc2lfcWxhX2hvc3RfdCAqLCBkbWFfYWRkcl90LCB1aW50MzJfdCwgdWludDMyX3QpOwogCiBleHRlcm4gaW50CiBxbGEyeDAwX2V4ZWN1dGVfZncoc2NzaV9xbGFfaG9zdF90ICosIHVpbnQzMl90KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ncy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMKaW5kZXggY2Q2ZjdjMy4uZDYyMGE4ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ncy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ncy5jCkBAIC01MzgsNiArNTM4LDcgQEAKIAljdF9yZXEtPnJlcS5yZmZfaWQucG9ydF9pZFsxXSA9IGhhLT5kX2lkLmIuYXJlYTsKIAljdF9yZXEtPnJlcS5yZmZfaWQucG9ydF9pZFsyXSA9IGhhLT5kX2lkLmIuYWxfcGE7CiAKKwljdF9yZXEtPnJlcS5yZmZfaWQuZmM0X2ZlYXR1cmUgPSBCSVRfMTsKIAljdF9yZXEtPnJlcS5yZmZfaWQuZmM0X3R5cGUgPSAweDA4OwkJLyogU0NTSSAtIEZDUCAqLwogCiAJLyogRXhlY3V0ZSBNUyBJT0NCICovCkBAIC0xNTI5LDkgKzE1MzAsOSBAQAogCWVpdGVyLT50eXBlID0gX19jb25zdGFudF9jcHVfdG9fYmUxNihGRE1JX1BPUlRfU1VQUE9SVF9TUEVFRCk7CiAJZWl0ZXItPmxlbiA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoNCArIDQpOwogCWlmIChJU19RTEEyNVhYKGhhKSkKLQkJZWl0ZXItPmEuc3VwX3NwZWVkID0gX19jb25zdGFudF9jcHVfdG9fYmUzMig0KTsKLQllbHNlIGlmIChJU19RTEEyNFhYKGhhKSkKIAkJZWl0ZXItPmEuc3VwX3NwZWVkID0gX19jb25zdGFudF9jcHVfdG9fYmUzMig4KTsKKwllbHNlIGlmIChJU19RTEEyNFhYKGhhKSkKKwkJZWl0ZXItPmEuc3VwX3NwZWVkID0gX19jb25zdGFudF9jcHVfdG9fYmUzMig0KTsKIAllbHNlIGlmIChJU19RTEEyM1hYKGhhKSkKIAkJZWl0ZXItPmEuc3VwX3NwZWVkID0gX19jb25zdGFudF9jcHVfdG9fYmUzMigyKTsKIAllbHNlCkBAIC0xNTUzLDkgKzE1NTQsNiBAQAogCQllaXRlci0+YS5jdXJfc3BlZWQgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDIpOwogCQlicmVhazsKIAljYXNlIDM6Ci0JCWVpdGVyLT5hLmN1cl9zcGVlZCA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoOCk7Ci0JCWJyZWFrOwotCWNhc2UgNDoKIAkJZWl0ZXItPmEuY3VyX3NwZWVkID0gX19jb25zdGFudF9jcHVfdG9fYmUzMig0KTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKaW5kZXggN2Q5NzNiZC4uYTkxZmVhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCkBAIC0xMDE0LDExICsxMDE0LDEzIEBACiAJaW50IHJ2YWw7CiAKIAkvKiBVcGRhdGUgU2VyaWFsIExpbmsgb3B0aW9ucy4gKi8KLQlpZiAoKGhhLT5md19zZXJpYWxsaW5rX29wdGlvbnMyNFswXSAmIEJJVF8wKSA9PSAwKQorCWlmICgobGUxNl90b19jcHUoaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9uczI0WzBdKSAmIEJJVF8wKSA9PSAwKQogCQlyZXR1cm47CiAKLQlydmFsID0gcWxhMngwMF9zZXRfc2VyZGVzX3BhcmFtcyhoYSwgaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9uczI0WzFdLAotCSAgICBoYS0+Zndfc2VyaWFsbGlua19vcHRpb25zMjRbMl0sIGhhLT5md19zZXJpYWxsaW5rX29wdGlvbnMyNFszXSk7CisJcnZhbCA9IHFsYTJ4MDBfc2V0X3NlcmRlc19wYXJhbXMoaGEsCisJICAgIGxlMTZfdG9fY3B1KGhhLT5md19zZXJpYWxsaW5rX29wdGlvbnMyNFsxXSksCisJICAgIGxlMTZfdG9fY3B1KGhhLT5md19zZXJpYWxsaW5rX29wdGlvbnMyNFsyXSksCisJICAgIGxlMTZfdG9fY3B1KGhhLT5md19zZXJpYWxsaW5rX29wdGlvbnMyNFszXSkpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKIAkJICAgICJVbmFibGUgdG8gdXBkYXRlIFNlcmlhbCBMaW5rIG9wdGlvbnMgKCV4KS5cbiIsIHJ2YWwpOwpAQCAtMTkzOSw2ICsxOTQxLDkgQEAKIAkJCSAgICAiaW5mb3JtYXRpb24gLS0gZ2V0X3BvcnRfZGF0YWJhc2U9JXgsICIKIAkJCSAgICAibG9vcF9pZD0weCUwNHhcbiIsCiAJCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwyLCBuZXdfZmNwb3J0LT5sb29wX2lkKSk7CisJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFNjaGVkdWxpbmcgcmVzeW5jLi4uXG4iLAorCQkJICAgIGhhLT5ob3N0X25vKSk7CisJCQlzZXRfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtMjY0OCw3ICsyNjUzLDggQEAKIAogCQlzd2l0Y2ggKGZvcm1hdCkgewogCQljYXNlIDA6Ci0JCQlpZiAoIUlTX1FMQTIxMDAoaGEpICYmICFJU19RTEEyMjAwKGhhKSAmJgorCQkJaWYgKHFsMnhwcm9jZXNzcnNjbiAmJgorCQkJICAgICFJU19RTEEyMTAwKGhhKSAmJiAhSVNfUUxBMjIwMChoYSkgJiYKIAkJCSAgICAhSVNfUUxBNjMxMihoYSkgJiYgIUlTX1FMQTYzMjIoaGEpICYmCiAJCQkgICAgIUlTX1FMQTI0WFgoaGEpICYmICFJU19RTEEyNVhYKGhhKSAmJgogCQkJICAgIGhhLT5mbGFncy5pbml0X2RvbmUpIHsKQEAgLTM0MDIsNiArMzQwOCw4IEBACiAJaGEtPm5vZGVfbmFtZSA9IGljYi0+bm9kZV9uYW1lOwogCWhhLT5wb3J0X25hbWUgPSBpY2ItPnBvcnRfbmFtZTsKIAorCWljYi0+ZXhlY3V0aW9uX3Rocm90dGxlID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigweEZGRkYpOworCiAJaGEtPnJldHJ5X2NvdW50ID0gbGUxNl90b19jcHUobnYtPmxvZ2luX3JldHJ5X2NvdW50KTsKIAogCS8qIFNldCBtaW5pbXVtIGxvZ2luX3RpbWVvdXQgdG8gNCBzZWNvbmRzLiAqLwpAQCAtMzY2Nyw4ICszNjc1LDggQEAKIAkJCWZvciAoaSA9IDA7IGkgPCBkbGVuOyBpKyspCiAJCQkJZGNvZGVbaV0gPSBzd2FiMzIoZGNvZGVbaV0pOwogCi0JCQlydmFsID0gcWxhMngwMF9sb2FkX3JhbV9leHQoaGEsIGhhLT5yZXF1ZXN0X2RtYSwKLQkJCSAgICByaXNjX2FkZHIsIGRsZW4pOworCQkJcnZhbCA9IHFsYTJ4MDBfbG9hZF9yYW0oaGEsIGhhLT5yZXF1ZXN0X2RtYSwgcmlzY19hZGRyLAorCQkJICAgIGRsZW4pOwogCQkJaWYgKHJ2YWwpIHsKIAkJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTpbRVJST1JdIEZhaWxlZCB0byBsb2FkICIKIAkJCQkgICAgInNlZ21lbnQgJWQgb2YgZmlybXdhcmVcbiIsIGhhLT5ob3N0X25vLApAQCAtMzg2OCw4ICszODc2LDggQEAKIAkJCWZvciAoaSA9IDA7IGkgPCBkbGVuOyBpKyspCiAJCQkJZGNvZGVbaV0gPSBzd2FiMzIoZndjb2RlW2ldKTsKIAotCQkJcnZhbCA9IHFsYTJ4MDBfbG9hZF9yYW1fZXh0KGhhLCBoYS0+cmVxdWVzdF9kbWEsCi0JCQkgICAgcmlzY19hZGRyLCBkbGVuKTsKKwkJCXJ2YWwgPSBxbGEyeDAwX2xvYWRfcmFtKGhhLCBoYS0+cmVxdWVzdF9kbWEsIHJpc2NfYWRkciwKKwkJCSAgICBkbGVuKTsKIAkJCWlmIChydmFsKSB7CiAJCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6W0VSUk9SXSBGYWlsZWQgdG8gbG9hZCAiCiAJCQkJICAgICJzZWdtZW50ICVkIG9mIGZpcm13YXJlXG4iLCBoYS0+aG9zdF9ubywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYwppbmRleCA1MTgxZDk2Li5mNjNhZjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCkBAIC01MTksNyArNTE5LDggQEAKIAkJICogdXMsIGNyZWF0ZSBhIG5ldyBlbnRyeSBpbiBvdXIgcnNjbiBmY3BvcnRzIGxpc3QgYW5kIGhhbmRsZQogCQkgKiB0aGUgZXZlbnQgbGlrZSBhbiBSU0NOLgogCQkgKi8KLQkJaWYgKCFJU19RTEEyMTAwKGhhKSAmJiAhSVNfUUxBMjIwMChoYSkgJiYgIUlTX1FMQTYzMTIoaGEpICYmCisJCWlmIChxbDJ4cHJvY2Vzc3JzY24gJiYKKwkJICAgICFJU19RTEEyMTAwKGhhKSAmJiAhSVNfUUxBMjIwMChoYSkgJiYgIUlTX1FMQTYzMTIoaGEpICYmCiAJCSAgICAhSVNfUUxBNjMyMihoYSkgJiYgIUlTX1FMQTI0WFgoaGEpICYmICFJU19RTEEyNVhYKGhhKSAmJgogCQkgICAgaGEtPmZsYWdzLmluaXRfZG9uZSAmJiBtYlsxXSAhPSAweGZmZmYgJiYKIAkJICAgICgoaGEtPm9wZXJhdGluZ19tb2RlID09IFAyUCAmJiBtYlsxXSAhPSAwKSB8fApAQCAtOTYzLDE1ICs5NjQsMTYgQEAKIAkJYnJlYWs7CiAKIAljYXNlIENTX0RBVEFfVU5ERVJSVU46Ci0JCURFQlVHMihwcmludGsoS0VSTl9JTkZPCi0JCSAgICAic2NzaSglbGQ6JWQ6JWQpIFVOREVSUlVOIHN0YXR1cyBkZXRlY3RlZCAweCV4LTB4JXguXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8sIGNwLT5kZXZpY2UtPmlkLCBjcC0+ZGV2aWNlLT5sdW4sIGNvbXBfc3RhdHVzLAotCQkgICAgc2NzaV9zdGF0dXMpKTsKLQogCQlyZXNpZCA9IHJlc2lkX2xlbjsKIAkJaWYgKHNjc2lfc3RhdHVzICYgU1NfUkVTSURVQUxfVU5ERVIpIHsKIAkJCWNwLT5yZXNpZCA9IHJlc2lkOwogCQkJQ01EX1JFU0lEX0xFTihjcCkgPSByZXNpZDsKKwkJfSBlbHNlIHsKKwkJCURFQlVHMihwcmludGsoS0VSTl9JTkZPCisJCQkgICAgInNjc2koJWxkOiVkOiVkKSBVTkRFUlJVTiBzdGF0dXMgZGV0ZWN0ZWQgIgorCQkJICAgICIweCV4LTB4JXguXG4iLCBoYS0+aG9zdF9ubywgY3AtPmRldmljZS0+aWQsCisJCQkgICAgY3AtPmRldmljZS0+bHVuLCBjb21wX3N0YXR1cywgc2NzaV9zdGF0dXMpKTsKKwogCQl9CiAKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYwppbmRleCA5NzQ2Y2QxLi4zMDk5YjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jCkBAIC0xOTYsNyArMTk2LDkgQEAKIAkJCS8qIENoZWNrIGZvciBwZW5kaW5nIGludGVycnVwdHMuICovCiAJCQlxbGEyeDAwX3BvbGwoaGEpOwogCi0JCQl1ZGVsYXkoMTApOyAvKiB2NC4yNyAqLworCQkJaWYgKGNvbW1hbmQgIT0gTUJDX0xPQURfUklTQ19SQU1fRVhURU5ERUQgJiYKKwkJCSAgICAhaGEtPmZsYWdzLm1ib3hfaW50KQorCQkJCW1zbGVlcCgxMCk7CiAJCX0gLyogd2hpbGUgKi8KIAl9CiAKQEAgLTMyNSw5OCArMzI3LDkgQEAKIAlyZXR1cm4gcnZhbDsKIH0KIAotLyoKLSAqIHFsYTJ4MDBfbG9hZF9yYW0KLSAqCUxvYWQgYWRhcHRlciBSQU0gdXNpbmcgRE1BLgotICoKLSAqIElucHV0OgotICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCi0gKgotICogUmV0dXJuczoKLSAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgotICoKLSAqIENvbnRleHQ6Ci0gKglLZXJuZWwgY29udGV4dC4KLSAqLwogaW50Ci1xbGEyeDAwX2xvYWRfcmFtKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGRtYV9hZGRyX3QgcmVxX2RtYSwgdWludDE2X3QgcmlzY19hZGRyLAotICAgIHVpbnQxNl90IHJpc2NfY29kZV9zaXplKQotewotCWludCBydmFsOwotCW1ieF9jbWRfdCBtYzsKLQltYnhfY21kX3QgKm1jcCA9ICZtYzsKLQl1aW50MzJfdAlyZXFfbGVuOwotCWRtYV9hZGRyX3QJbm1sX2RtYTsKLQl1aW50MzJfdAlubWxfbGVuOwotCXVpbnQzMl90CW5vcm1hbGl6ZWQ7Ci0KLQlERUJVRzExKHByaW50aygicWxhMngwMF9sb2FkX3JhbSglbGQpOiBlbnRlcmVkLlxuIiwKLQkgICAgaGEtPmhvc3Rfbm8pOykKLQotCXJlcV9sZW4gPSByaXNjX2NvZGVfc2l6ZTsKLQlubWxfZG1hID0gMDsKLQlubWxfbGVuID0gMDsKLQotCW5vcm1hbGl6ZWQgPSBxbGEyeDAwX25vcm1hbGl6ZV9kbWFfYWRkcigmcmVxX2RtYSwgJnJlcV9sZW4sICZubWxfZG1hLAotCSAgICAmbm1sX2xlbik7Ci0KLQkvKiBMb2FkIGZpcnN0IHNlZ21lbnQgKi8KLQltY3AtPm1iWzBdID0gTUJDX0xPQURfUklTQ19SQU07Ci0JbWNwLT5tYlsxXSA9IHJpc2NfYWRkcjsKLQltY3AtPm1iWzJdID0gTVNXKHJlcV9kbWEpOwotCW1jcC0+bWJbM10gPSBMU1cocmVxX2RtYSk7Ci0JbWNwLT5tYls0XSA9ICh1aW50MTZfdClyZXFfbGVuOwotCW1jcC0+bWJbNl0gPSBNU1coTVNEKHJlcV9kbWEpKTsKLQltY3AtPm1iWzddID0gTFNXKE1TRChyZXFfZG1hKSk7Ci0JbWNwLT5vdXRfbWIgPSBNQlhfN3xNQlhfNnxNQlhfNHxNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKLQltY3AtPmluX21iID0gTUJYXzA7Ci0JbWNwLT50b3YgPSAzMDsKLQltY3AtPmZsYWdzID0gMDsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7Ci0KLQkvKiBMb2FkIHNlY29uZCBzZWdtZW50IC0gaWYgbmVjZXNzYXJ5ICovCi0JaWYgKG5vcm1hbGl6ZWQgJiYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpKSB7Ci0JCW1jcC0+bWJbMF0gPSBNQkNfTE9BRF9SSVNDX1JBTTsKLQkJbWNwLT5tYlsxXSA9IHJpc2NfYWRkciArICh1aW50MTZfdClyZXFfbGVuOwotCQltY3AtPm1iWzJdID0gTVNXKG5tbF9kbWEpOwotCQltY3AtPm1iWzNdID0gTFNXKG5tbF9kbWEpOwotCQltY3AtPm1iWzRdID0gKHVpbnQxNl90KW5tbF9sZW47Ci0JCW1jcC0+bWJbNl0gPSBNU1coTVNEKG5tbF9kbWEpKTsKLQkJbWNwLT5tYls3XSA9IExTVyhNU0Qobm1sX2RtYSkpOwotCQltY3AtPm91dF9tYiA9IE1CWF83fE1CWF82fE1CWF80fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOwotCQltY3AtPmluX21iID0gTUJYXzA7Ci0JCW1jcC0+dG92ID0gMzA7Ci0JCW1jcC0+ZmxhZ3MgPSAwOwotCQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7Ci0JfQotCi0JaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKLQkJLyogRW1wdHkgKi8KLQkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfbG9hZF9yYW0oJWxkKTogZG9uZS5cbiIsIGhhLT5ob3N0X25vKTspCi0JfSBlbHNlIHsKLQkJLyogRW1wdHkgKi8KLQkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2xvYWRfcmFtKCVsZCk6IGZhaWxlZC4gcnZhbD0leCAiCi0JCSAgICAibWJbMF09JXguXG4iLCBoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSk7KQotCX0KLQlyZXR1cm4gcnZhbDsKLX0KLQotLyoKLSAqIHFsYTJ4MDBfbG9hZF9yYW1fZXh0Ci0gKglMb2FkIGFkYXB0ZXIgZXh0ZW5kZWQgUkFNIHVzaW5nIERNQS4KLSAqCi0gKiBJbnB1dDoKLSAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgotICoKLSAqIFJldHVybnM6Ci0gKglxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZS4KLSAqCi0gKiBDb250ZXh0OgotICoJS2VybmVsIGNvbnRleHQuCi0gKi8KLWludAotcWxhMngwMF9sb2FkX3JhbV9leHQoc2NzaV9xbGFfaG9zdF90ICpoYSwgZG1hX2FkZHJfdCByZXFfZG1hLAotICAgIHVpbnQzMl90IHJpc2NfYWRkciwgdWludDMyX3QgcmlzY19jb2RlX3NpemUpCitxbGEyeDAwX2xvYWRfcmFtKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGRtYV9hZGRyX3QgcmVxX2RtYSwgdWludDMyX3QgcmlzY19hZGRyLAorICAgIHVpbnQzMl90IHJpc2NfY29kZV9zaXplKQogewogCWludCBydmFsOwogCW1ieF9jbWRfdCBtYzsKQEAgLTQyNCwxNCArMzM3LDIwIEBACiAKIAlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOwogCi0JbWNwLT5tYlswXSA9IE1CQ19MT0FEX1JJU0NfUkFNX0VYVEVOREVEOworCWlmIChNU1cocmlzY19hZGRyKSB8fCBJU19RTEEyNFhYKGhhKSB8fCBJU19RTEEyNVhYKGhhKSkgeworCQltY3AtPm1iWzBdID0gTUJDX0xPQURfUklTQ19SQU1fRVhURU5ERUQ7CisJCW1jcC0+bWJbOF0gPSBNU1cocmlzY19hZGRyKTsKKwkJbWNwLT5vdXRfbWIgPSBNQlhfOHxNQlhfMDsKKwl9IGVsc2UgeworCQltY3AtPm1iWzBdID0gTUJDX0xPQURfUklTQ19SQU07CisJCW1jcC0+b3V0X21iID0gTUJYXzA7CisJfQogCW1jcC0+bWJbMV0gPSBMU1cocmlzY19hZGRyKTsKIAltY3AtPm1iWzJdID0gTVNXKHJlcV9kbWEpOwogCW1jcC0+bWJbM10gPSBMU1cocmVxX2RtYSk7CiAJbWNwLT5tYls2XSA9IE1TVyhNU0QocmVxX2RtYSkpOwogCW1jcC0+bWJbN10gPSBMU1coTVNEKHJlcV9kbWEpKTsKLQltY3AtPm1iWzhdID0gTVNXKHJpc2NfYWRkcik7Ci0JbWNwLT5vdXRfbWIgPSBNQlhfOHxNQlhfN3xNQlhfNnxNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKKwltY3AtPm91dF9tYiB8PSBNQlhfN3xNQlhfNnxNQlhfM3xNQlhfMnxNQlhfMTsKIAlpZiAoSVNfUUxBMjRYWChoYSkgfHwgSVNfUUxBMjVYWChoYSkpIHsKIAkJbWNwLT5tYls0XSA9IE1TVyhyaXNjX2NvZGVfc2l6ZSk7CiAJCW1jcC0+bWJbNV0gPSBMU1cocmlzY19jb2RlX3NpemUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwppbmRleCAyNDMwNDMwLi40OTE2ODQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwpAQCAtNzEsNiArNzEsMTIgQEAKIAkJIkVuYWJsZXMgRkRNSSByZWdpc3RyYXRvbnMgIgogCQkiRGVmYXVsdCBpcyAwIC0gbm8gRkRNSS4gMSAtIHBlcmZvbSBGRE1JLiIpOwogCitpbnQgcWwyeHByb2Nlc3Nyc2NuOworbW9kdWxlX3BhcmFtKHFsMnhwcm9jZXNzcnNjbiwgaW50LCBTX0lSVUdPfFNfSVJVU1IpOworTU9EVUxFX1BBUk1fREVTQyhxbDJ4cHJvY2Vzc3JzY24sCisJCSJPcHRpb24gdG8gZW5hYmxlIHBvcnQgUlNDTiBoYW5kbGluZyB2aWEgYSBzZXJpZXMgb2YgbGVzcyIKKwkJImZhYnJpYyBpbnRydXNpdmUgQURJU0NzIGFuZCBQTE9HSXMuIik7CisKIC8qCiAgKiBTQ1NJIGhvc3QgdGVtcGxhdGUgZW50cnkgcG9pbnRzCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYwppbmRleCBkNTRkMmE5Li5mNGQ3NTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jCkBAIC01NzMsNiArNTczLDkgQEAKIAkJfQogCX0gd2hpbGUgKDApOwogCisJLyogRW5hYmxlIGZsYXNoIHdyaXRlLXByb3RlY3Rpb24uICovCisJcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgZmxhc2hfY29uZl90b19hY2Nlc3NfYWRkcigweDEwMSksIDB4OWMpOworCiAJLyogRGlzYWJsZSBmbGFzaCB3cml0ZS4gKi8KIAlXUlRfUkVHX0RXT1JEKCZyZWctPmN0cmxfc3RhdHVzLAogCSAgICBSRF9SRUdfRFdPUkQoJnJlZy0+Y3RybF9zdGF0dXMpICYgfkNTUlhfRkxBU0hfRU5BQkxFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oCmluZGV4IGY3OTM3ZjcuLmQ1MzcxOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaApAQCAtNyw5ICs3LDkgQEAKIC8qCiAgKiBEcml2ZXIgdmVyc2lvbgogICovCi0jZGVmaW5lIFFMQTJYWFhfVkVSU0lPTiAgICAgICI4LjAxLjAzLWsiCisjZGVmaW5lIFFMQTJYWFhfVkVSU0lPTiAgICAgICI4LjAxLjA0LWsiCiAKICNkZWZpbmUgUUxBX0RSSVZFUl9NQUpPUl9WRVIJOAogI2RlZmluZSBRTEFfRFJJVkVSX01JTk9SX1ZFUgkxCi0jZGVmaW5lIFFMQV9EUklWRVJfUEFUQ0hfVkVSCTMKKyNkZWZpbmUgUUxBX0RSSVZFUl9QQVRDSF9WRVIJNAogI2RlZmluZSBRTEFfRFJJVkVSX0JFVEFfVkVSCTAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9yYWlkX2NsYXNzLmMgYi9kcml2ZXJzL3Njc2kvcmFpZF9jbGFzcy5jCmluZGV4IDVlYzVmNDQuLjUwYzM5OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9yYWlkX2NsYXNzLmMKKysrIGIvZHJpdmVycy9zY3NpL3JhaWRfY2xhc3MuYwpAQCAtMTQ4LDkgKzE0OCwxMSBAQAogCXsgUkFJRF9MRVZFTF9MSU5FQVIsICJsaW5lYXIiIH0sCiAJeyBSQUlEX0xFVkVMXzAsICJyYWlkMCIgfSwKIAl7IFJBSURfTEVWRUxfMSwgInJhaWQxIiB9LAorCXsgUkFJRF9MRVZFTF8xMCwgInJhaWQxMCIgfSwKIAl7IFJBSURfTEVWRUxfMywgInJhaWQzIiB9LAogCXsgUkFJRF9MRVZFTF80LCAicmFpZDQiIH0sCiAJeyBSQUlEX0xFVkVMXzUsICJyYWlkNSIgfSwKKwl7IFJBSURfTEVWRUxfNTAsICJyYWlkNTAiIH0sCiAJeyBSQUlEX0xFVkVMXzYsICJyYWlkNiIgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zYXRhX252LmMgYi9kcml2ZXJzL3Njc2kvc2F0YV9udi5jCmluZGV4IGMwY2Y1MmMuLmJiYmI1NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zYXRhX252LmMKKysrIGIvZHJpdmVycy9zY3NpL3NhdGFfbnYuYwpAQCAtMjksNiArMjksMTIgQEAKICAqICBOVi1zcGVjaWZpYyBkZXRhaWxzIHN1Y2ggYXMgcmVnaXN0ZXIgb2Zmc2V0cywgU0FUQSBwaHkgbG9jYXRpb24sCiAgKiAgaG90cGx1ZyBpbmZvLCBldGMuCiAgKgorICogIDAuMTAKKyAqICAgICAtIEZpeGVkIHNwdXJpb3VzIGludGVycnVwdHMgaXNzdWUgc2VlbiB3aXRoIHRoZSBNYXh0b3IgNkg1MDBGMCA1MDBHQgorICogICAgICAgZHJpdmUuICBBbHNvIG1hZGUgdGhlIGNoZWNrX2hvdHBsdWcoKSBjYWxsYmFja3MgcmV0dXJuIHdoZXRoZXIgdGhlcmUKKyAqICAgICAgIHdhcyBhIGhvdHBsdWcgaW50ZXJydXB0IG9yIG5vdC4gIFRoaXMgd2FzIG5vdCB0aGUgc291cmNlIG9mIHRoZQorICogICAgICAgc3B1cmlvdXMgaW50ZXJydXB0cywgYnV0IGlzIHRoZSByaWdodCB0aGluZyB0byBkbyBhbnl3YXkuCisgKgogICogIDAuMDkKICAqICAgICAtIEZpeGVkIGJ1ZyBpbnRyb2R1Y2VkIGJ5IDAuMDgncyBNQ1A1MSBhbmQgTUNQNTUgc3VwcG9ydC4KICAqCkBAIC0xMjQsMTAgKzEzMCwxMCBAQAogc3RhdGljIHZvaWQgbnZfaG9zdF9zdG9wIChzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCk7CiBzdGF0aWMgdm9pZCBudl9lbmFibGVfaG90cGx1ZyhzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50KTsKIHN0YXRpYyB2b2lkIG52X2Rpc2FibGVfaG90cGx1ZyhzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCk7Ci1zdGF0aWMgdm9pZCBudl9jaGVja19ob3RwbHVnKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KTsKK3N0YXRpYyBpbnQgbnZfY2hlY2tfaG90cGx1ZyhzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCk7CiBzdGF0aWMgdm9pZCBudl9lbmFibGVfaG90cGx1Z19jazgwNChzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50KTsKIHN0YXRpYyB2b2lkIG52X2Rpc2FibGVfaG90cGx1Z19jazgwNChzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCk7Ci1zdGF0aWMgdm9pZCBudl9jaGVja19ob3RwbHVnX2NrODA0KHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KTsKK3N0YXRpYyBpbnQgbnZfY2hlY2tfaG90cGx1Z19jazgwNChzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCk7CiAKIGVudW0gbnZfaG9zdF90eXBlCiB7CkBAIC0xNzYsNyArMTgyLDcgQEAKIAllbnVtIG52X2hvc3RfdHlwZQlob3N0X3R5cGU7CiAJdm9pZAkJCSgqZW5hYmxlX2hvdHBsdWcpKHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQpOwogCXZvaWQJCQkoKmRpc2FibGVfaG90cGx1Zykoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpOwotCXZvaWQJCQkoKmNoZWNrX2hvdHBsdWcpKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KTsKKwlpbnQJCQkoKmNoZWNrX2hvdHBsdWcpKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KTsKIAogfTsKIHN0YXRpYyBzdHJ1Y3QgbnZfaG9zdF9kZXNjIG52X2RldmljZV90YmxbXSA9IHsKQEAgLTMwOSwxMiArMzE1LDE2IEBACiAJCQlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOwogCQkJaWYgKHFjICYmICghKHFjLT50Zi5jdGwgJiBBVEFfTklFTikpKQogCQkJCWhhbmRsZWQgKz0gYXRhX2hvc3RfaW50cihhcCwgcWMpOworCQkJZWxzZQorCQkJCS8vIE5vIHJlcXVlc3QgcGVuZGluZz8gIENsZWFyIGludGVycnVwdCBzdGF0dXMKKwkJCQkvLyBhbnl3YXksIGluIGNhc2UgdGhlcmUncyBvbmUgcGVuZGluZy4KKwkJCQlhcC0+b3BzLT5jaGVja19zdGF0dXMoYXApOwogCQl9CiAKIAl9CiAKIAlpZiAoaG9zdC0+aG9zdF9kZXNjLT5jaGVja19ob3RwbHVnKQotCQlob3N0LT5ob3N0X2Rlc2MtPmNoZWNrX2hvdHBsdWcoaG9zdF9zZXQpOworCQloYW5kbGVkICs9IGhvc3QtPmhvc3RfZGVzYy0+Y2hlY2tfaG90cGx1Zyhob3N0X3NldCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0X3NldC0+bG9jaywgZmxhZ3MpOwogCkBAIC00OTcsNyArNTA3LDcgQEAKIAlvdXRiKGludHJfbWFzaywgaG9zdF9zZXQtPnBvcnRzWzBdLT5pb2FkZHIuc2NyX2FkZHIgKyBOVl9JTlRfRU5BQkxFKTsKIH0KIAotc3RhdGljIHZvaWQgbnZfY2hlY2tfaG90cGx1ZyhzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCkKK3N0YXRpYyBpbnQgbnZfY2hlY2tfaG90cGx1ZyhzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCkKIHsKIAl1OCBpbnRyX3N0YXR1czsKIApAQCAtNTIyLDcgKzUzMiwxMSBAQAogCQlpZiAoaW50cl9zdGF0dXMgJiBOVl9JTlRfU1RBVFVTX1NERVZfUkVNT1ZFRCkKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm52X3NhdGE6ICIKIAkJCQkiU2Vjb25kYXJ5IGRldmljZSByZW1vdmVkXG4iKTsKKworCQlyZXR1cm4gMTsKIAl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgbnZfZW5hYmxlX2hvdHBsdWdfY2s4MDQoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCkKQEAgLTU2MCw3ICs1NzQsNyBAQAogCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBOVl9NQ1BfU0FUQV9DRkdfMjAsIHJlZ3ZhbCk7CiB9CiAKLXN0YXRpYyB2b2lkIG52X2NoZWNrX2hvdHBsdWdfY2s4MDQoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpCitzdGF0aWMgaW50IG52X2NoZWNrX2hvdHBsdWdfY2s4MDQoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpCiB7CiAJdTggaW50cl9zdGF0dXM7CiAKQEAgLTU4NSw3ICs1OTksMTEgQEAKIAkJaWYgKGludHJfc3RhdHVzICYgTlZfSU5UX1NUQVRVU19TREVWX1JFTU9WRUQpCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJudl9zYXRhOiAiCiAJCQkJIlNlY29uZGFyeSBkZXZpY2UgcmVtb3ZlZFxuIik7CisKKwkJcmV0dXJuIDE7CiAJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IG52X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zYXRhX3Byb21pc2UuYyBiL2RyaXZlcnMvc2NzaS9zYXRhX3Byb21pc2UuYwppbmRleCAzZDFlYTA5Li5iMGIwYTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2F0YV9wcm9taXNlLmMKKysrIGIvZHJpdmVycy9zY3NpL3NhdGFfcHJvbWlzZS5jCkBAIC02Niw2ICs2Niw3IEBACiAJYm9hcmRfMjAzN3gJCT0gMCwJLyogRmFzdFRyYWsgUzE1MCBUWDJwbHVzICovCiAJYm9hcmRfMjAzMTkJCT0gMSwJLyogRmFzdFRyYWsgUzE1MCBUWDQgKi8KIAlib2FyZF8yMDYxOQkJPSAyLAkvKiBGYXN0VHJhayBUWDQwMDAgKi8KKwlib2FyZF8yMDc3MQkJPSAzLAkvKiBGYXN0VHJhayBUWDIzMDAgKi8KIAogCVBEQ19IQVNfUEFUQQkJPSAoMSA8PCAxKSwgLyogUERDMjAzNzUgaGFzIFBBVEEgKi8KIApAQCAtMTkwLDYgKzE5MSwxNiBAQAogCQkudWRtYV9tYXNrCT0gMHg3ZiwgLyogdWRtYTAtNiA7IEZJWE1FICovCiAJCS5wb3J0X29wcwk9ICZwZGNfcGF0YV9vcHMsCiAJfSwKKworCS8qIGJvYXJkXzIwNzcxICovCisJeworCQkuc2h0CQk9ICZwZGNfYXRhX3NodCwKKwkJLmhvc3RfZmxhZ3MJPSBQRENfQ09NTU9OX0ZMQUdTIHwgQVRBX0ZMQUdfU0FUQSwKKwkJLnBpb19tYXNrCT0gMHgxZiwgLyogcGlvMC00ICovCisJCS5td2RtYV9tYXNrCT0gMHgwNywgLyogbXdkbWEwLTIgKi8KKwkJLnVkbWFfbWFzawk9IDB4N2YsIC8qIHVkbWEwLTYgOyBGSVhNRSAqLworCQkucG9ydF9vcHMJPSAmcGRjX3NhdGFfb3BzLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGRjX2F0YV9wY2lfdGJsW10gPSB7CkBAIC0yMjYsNiArMjM3LDggQEAKIAl7IFBDSV9WRU5ET1JfSURfUFJPTUlTRSwgMHg2NjI5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAogCSAgYm9hcmRfMjA2MTkgfSwKIAorCXsgUENJX1ZFTkRPUl9JRF9QUk9NSVNFLCAweDM1NzAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJICBib2FyZF8yMDc3MSB9LAogCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLwogfTsKIApAQCAtNzA2LDYgKzcxOSw5IEBACiAJY2FzZSBib2FyZF8yMDM3eDoKIAkJcHJvYmVfZW50LT5uX3BvcnRzID0gMjsKIAkJYnJlYWs7CisJY2FzZSBib2FyZF8yMDc3MToKKwkJcHJvYmVfZW50LT5uX3BvcnRzID0gMjsKKwkJYnJlYWs7CiAJY2FzZSBib2FyZF8yMDYxOToKIAkJcHJvYmVfZW50LT5uX3BvcnRzID0gNDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NhdGFfc3Z3LmMgYi9kcml2ZXJzL3Njc2kvc2F0YV9zdncuYwppbmRleCA2NjgzNzM1Li5kODQ3MjU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2F0YV9zdncuYworKysgYi9kcml2ZXJzL3Njc2kvc2F0YV9zdncuYwpAQCAtNDcwLDYgKzQ3MCw3IEBACiAJeyAweDExNjYsIDB4MDI0MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNCB9LAogCXsgMHgxMTY2LCAweDAyNDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDggfSwKIAl7IDB4MTE2NiwgMHgwMjRhLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA0IH0sCisJeyAweDExNjYsIDB4MDI0YiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNCB9LAogCXsgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2kuYyBiL2RyaXZlcnMvc2NzaS9zY3NpLmMKaW5kZXggMTgwNjc2ZC4uMjQ1Y2E5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2kuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaS5jCkBAIC01NSw2ICs1NSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KQEAgLTY5LDcgKzcwLDYgQEAKICNpbmNsdWRlICJzY3NpX2xvZ2dpbmcuaCIKIAogc3RhdGljIHZvaWQgc2NzaV9kb25lKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7Ci1zdGF0aWMgaW50IHNjc2lfcmV0cnlfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOwogCiAvKgogICogRGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cy4KQEAgLTIxMCw3ICsyMTAsNyBAQAogCS5nZnBfbWFzawk9IF9fR0ZQX0RNQSwKIH07CiAKLXN0YXRpYyBERUNMQVJFX01VVEVYKGhvc3RfY21kX3Bvb2xfbXV0ZXgpOworc3RhdGljIERFRklORV9NVVRFWChob3N0X2NtZF9wb29sX211dGV4KTsKIAogc3RhdGljIHN0cnVjdCBzY3NpX2NtbmQgKl9fc2NzaV9nZXRfY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKIAkJCQkJICAgIGdmcF90IGdmcF9tYXNrKQpAQCAtMzMxLDcgKzMzMSw3IEBACiAJICogU2VsZWN0IGEgY29tbWFuZCBzbGFiIGZvciB0aGlzIGhvc3QgYW5kIGNyZWF0ZSBpdCBpZiBub3QKIAkgKiB5ZXQgZXhpc3RhbnQuCiAJICovCi0JZG93bigmaG9zdF9jbWRfcG9vbF9tdXRleCk7CisJbXV0ZXhfbG9jaygmaG9zdF9jbWRfcG9vbF9tdXRleCk7CiAJcG9vbCA9IChzaG9zdC0+dW5jaGVja2VkX2lzYV9kbWEgPyAmc2NzaV9jbWRfZG1hX3Bvb2wgOiAmc2NzaV9jbWRfcG9vbCk7CiAJaWYgKCFwb29sLT51c2VycykgewogCQlwb29sLT5zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUocG9vbC0+bmFtZSwKQEAgLTM0Myw3ICszNDMsNyBAQAogCiAJcG9vbC0+dXNlcnMrKzsKIAlzaG9zdC0+Y21kX3Bvb2wgPSBwb29sOwotCXVwKCZob3N0X2NtZF9wb29sX211dGV4KTsKKwltdXRleF91bmxvY2soJmhvc3RfY21kX3Bvb2xfbXV0ZXgpOwogCiAJLyoKIAkgKiBHZXQgb25lIGJhY2t1cCBjb21tYW5kIGZvciB0aGlzIGhvc3QuCkBAIC0zNjAsNyArMzYwLDcgQEAKIAkJa21lbV9jYWNoZV9kZXN0cm95KHBvb2wtPnNsYWIpOwogCXJldHVybiAtRU5PTUVNOwogIGZhaWw6Ci0JdXAoJmhvc3RfY21kX3Bvb2xfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaG9zdF9jbWRfcG9vbF9tdXRleCk7CiAJcmV0dXJuIC1FTk9NRU07CiAKIH0KQEAgLTM4MiwxMCArMzgyLDEwIEBACiAJCWttZW1fY2FjaGVfZnJlZShzaG9zdC0+Y21kX3Bvb2wtPnNsYWIsIGNtZCk7CiAJfQogCi0JZG93bigmaG9zdF9jbWRfcG9vbF9tdXRleCk7CisJbXV0ZXhfbG9jaygmaG9zdF9jbWRfcG9vbF9tdXRleCk7CiAJaWYgKCEtLXNob3N0LT5jbWRfcG9vbC0+dXNlcnMpCiAJCWttZW1fY2FjaGVfZGVzdHJveShzaG9zdC0+Y21kX3Bvb2wtPnNsYWIpOwotCXVwKCZob3N0X2NtZF9wb29sX211dGV4KTsKKwltdXRleF91bmxvY2soJmhvc3RfY21kX3Bvb2xfbXV0ZXgpOwogfQogCiAjaWZkZWYgQ09ORklHX1NDU0lfTE9HR0lORwpAQCAtNzUyLDcgKzc1Miw3IEBACiAgKiBpc24ndCBydW5uaW5nIC0tLSB1c2VkIGJ5IHNjc2lfdGltZXNfb3V0ICovCiB2b2lkIF9fc2NzaV9kb25lKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGNtZC0+cmVxdWVzdDsKIAogCS8qCiAJICogU2V0IHRoZSBzZXJpYWwgbnVtYmVycyBiYWNrIHRvIHplcm8KQEAgLTc2Myw3MSArNzYzLDE0IEBACiAJaWYgKGNtZC0+cmVzdWx0KQogCQlhdG9taWNfaW5jKCZjbWQtPmRldmljZS0+aW9lcnJfY250KTsKIAorCUJVR19PTighcnEpOworCiAJLyoKLQkgKiBOZXh0LCBlbnF1ZXVlIHRoZSBjb21tYW5kIGludG8gdGhlIGRvbmUgcXVldWUuCi0JICogSXQgaXMgYSBwZXItQ1BVIHF1ZXVlLCBzbyB3ZSBqdXN0IGRpc2FibGUgbG9jYWwgaW50ZXJydXB0cwotCSAqIGFuZCBuZWVkIG5vIHNwaW5sb2NrLgorCSAqIFRoZSB1cHRvZGF0ZS9uYnl0ZXMgdmFsdWVzIGRvbid0IG1hdHRlciwgYXMgd2UgYWxsb3cgcGFydGlhbAorCSAqIGNvbXBsZXRlcyBhbmQgdGh1cyB3aWxsIGNoZWNrIHRoaXMgaW4gdGhlIHNvZnRpcnEgY2FsbGJhY2sKIAkgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JbGlzdF9hZGRfdGFpbCgmY21kLT5laF9lbnRyeSwgJl9fZ2V0X2NwdV92YXIoc2NzaV9kb25lX3EpKTsKLQlyYWlzZV9zb2Z0aXJxX2lycW9mZihTQ1NJX1NPRlRJUlEpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotLyoqCi0gKiBzY3NpX3NvZnRpcnEgLSBQZXJmb3JtIHBvc3QtaW50ZXJydXB0IHByb2Nlc3Npbmcgb2YgZmluaXNoZWQgU0NTSSBjb21tYW5kcy4KLSAqCi0gKiBUaGlzIGlzIHRoZSBjb25zdW1lciBvZiB0aGUgZG9uZSBxdWV1ZS4KLSAqCi0gKiBUaGlzIGlzIGNhbGxlZCB3aXRoIGFsbCBpbnRlcnJ1cHRzIGVuYWJsZWQuICBUaGlzIHNob3VsZCByZWR1Y2UKLSAqIGludGVycnVwdCBsYXRlbmN5LCBzdGFjayBkZXB0aCwgYW5kIHJlZW50cmFuY3kgb2YgdGhlIGxvdy1sZXZlbAotICogZHJpdmVycy4KLSAqLwotc3RhdGljIHZvaWQgc2NzaV9zb2Z0aXJxKHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiAqaCkKLXsKLQlpbnQgZGlzcG9zaXRpb247Ci0JTElTVF9IRUFEKGxvY2FsX3EpOwotCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlsaXN0X3NwbGljZV9pbml0KCZfX2dldF9jcHVfdmFyKHNjc2lfZG9uZV9xKSwgJmxvY2FsX3EpOwotCWxvY2FsX2lycV9lbmFibGUoKTsKLQotCXdoaWxlICghbGlzdF9lbXB0eSgmbG9jYWxfcSkpIHsKLQkJc3RydWN0IHNjc2lfY21uZCAqY21kID0gbGlzdF9lbnRyeShsb2NhbF9xLm5leHQsCi0JCQkJCQkgICBzdHJ1Y3Qgc2NzaV9jbW5kLCBlaF9lbnRyeSk7Ci0JCS8qIFRoZSBsb25nZXN0IHRpbWUgYW55IGNvbW1hbmQgc2hvdWxkIGJlIG91dHN0YW5kaW5nIGlzIHRoZQotCQkgKiBwZXIgY29tbWFuZCB0aW1lb3V0IG11bHRpcGxpZWQgYnkgdGhlIG51bWJlciBvZiByZXRyaWVzLgotCQkgKgotCQkgKiBGb3IgYSB0eXBpY2FsIGNvbW1hbmQsIHRoaXMgaXMgMi41IG1pbnV0ZXMgKi8KLQkJdW5zaWduZWQgbG9uZyB3YWl0X2ZvciAKLQkJCT0gY21kLT5hbGxvd2VkICogY21kLT50aW1lb3V0X3Blcl9jb21tYW5kOwotCQlsaXN0X2RlbF9pbml0KCZjbWQtPmVoX2VudHJ5KTsKLQotCQlkaXNwb3NpdGlvbiA9IHNjc2lfZGVjaWRlX2Rpc3Bvc2l0aW9uKGNtZCk7Ci0JCWlmIChkaXNwb3NpdGlvbiAhPSBTVUNDRVNTICYmCi0JCSAgICB0aW1lX2JlZm9yZShjbWQtPmppZmZpZXNfYXRfYWxsb2MgKyB3YWl0X2ZvciwgamlmZmllcykpIHsKLQkJCXNkZXZfcHJpbnRrKEtFUk5fRVJSLCBjbWQtPmRldmljZSwKLQkJCQkgICAgInRpbWluZyBvdXQgY29tbWFuZCwgd2FpdGVkICVsdXNcbiIsCi0JCQkJICAgIHdhaXRfZm9yL0haKTsKLQkJCWRpc3Bvc2l0aW9uID0gU1VDQ0VTUzsKLQkJfQotCQkJCi0JCXNjc2lfbG9nX2NvbXBsZXRpb24oY21kLCBkaXNwb3NpdGlvbik7Ci0JCXN3aXRjaCAoZGlzcG9zaXRpb24pIHsKLQkJY2FzZSBTVUNDRVNTOgotCQkJc2NzaV9maW5pc2hfY29tbWFuZChjbWQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTkVFRFNfUkVUUlk6Ci0JCQlzY3NpX3JldHJ5X2NvbW1hbmQoY21kKTsKLQkJCWJyZWFrOwotCQljYXNlIEFERF9UT19NTFFVRVVFOgotCQkJc2NzaV9xdWV1ZV9pbnNlcnQoY21kLCBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1kpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAoIXNjc2lfZWhfc2NtZF9hZGQoY21kLCAwKSkKLQkJCQlzY3NpX2ZpbmlzaF9jb21tYW5kKGNtZCk7Ci0JCX0KLQl9CisJcnEtPmNvbXBsZXRpb25fZGF0YSA9IGNtZDsKKwlibGtfY29tcGxldGVfcmVxdWVzdChycSk7CiB9CiAKIC8qCkBAIC04NDAsNyArNzgzLDcgQEAKICAqICAgICAgICAgICAgICBsZXZlbCBkcml2ZXJzIHNob3VsZCBub3QgYmVjb21lIHJlLWVudHJhbnQgYXMgYSByZXN1bHQgb2YKICAqICAgICAgICAgICAgICB0aGlzLgogICovCi1zdGF0aWMgaW50IHNjc2lfcmV0cnlfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCitpbnQgc2NzaV9yZXRyeV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAkvKgogCSAqIFJlc3RvcmUgdGhlIFNDU0kgY29tbWFuZCBzdGF0ZS4KQEAgLTEyNzMsMzggKzEyMTYsNiBAQAogfQogRVhQT1JUX1NZTUJPTChzY3NpX2RldmljZV9jYW5jZWwpOwogCi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi1zdGF0aWMgaW50IHNjc2lfY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCi0JCQkgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKLXsKLQlpbnQgY3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKLQotCXN3aXRjaChhY3Rpb24pIHsKLQljYXNlIENQVV9ERUFEOgotCQkvKiBEcmFpbiBzY3NpX2RvbmVfcS4gKi8KLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJbGlzdF9zcGxpY2VfaW5pdCgmcGVyX2NwdShzY3NpX2RvbmVfcSwgY3B1KSwKLQkJCQkgJl9fZ2V0X2NwdV92YXIoc2NzaV9kb25lX3EpKTsKLQkJcmFpc2Vfc29mdGlycV9pcnFvZmYoU0NTSV9TT0ZUSVJRKTsKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBfX2RldmluaXRkYXRhIHNjc2lfY3B1X25iID0gewotCS5ub3RpZmllcl9jYWxsCT0gc2NzaV9jcHVfbm90aWZ5LAotfTsKLQotI2RlZmluZSByZWdpc3Rlcl9zY3NpX2NwdSgpIHJlZ2lzdGVyX2NwdV9ub3RpZmllcigmc2NzaV9jcHVfbmIpCi0jZGVmaW5lIHVucmVnaXN0ZXJfc2NzaV9jcHUoKSB1bnJlZ2lzdGVyX2NwdV9ub3RpZmllcigmc2NzaV9jcHVfbmIpCi0jZWxzZQotI2RlZmluZSByZWdpc3Rlcl9zY3NpX2NwdSgpCi0jZGVmaW5lIHVucmVnaXN0ZXJfc2NzaV9jcHUoKQotI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwotCiBNT0RVTEVfREVTQ1JJUFRJT04oIlNDU0kgY29yZSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCkBAIC0xMzM4LDggKzEyNDksNiBAQAogCQlJTklUX0xJU1RfSEVBRCgmcGVyX2NwdShzY3NpX2RvbmVfcSwgaSkpOwogCiAJZGV2ZnNfbWtfZGlyKCJzY3NpIik7Ci0Jb3Blbl9zb2Z0aXJxKFNDU0lfU09GVElSUSwgc2NzaV9zb2Z0aXJxLCBOVUxMKTsKLQlyZWdpc3Rlcl9zY3NpX2NwdSgpOwogCXByaW50ayhLRVJOX05PVElDRSAiU0NTSSBzdWJzeXN0ZW0gaW5pdGlhbGl6ZWRcbiIpOwogCXJldHVybiAwOwogCkBAIC0xMzY3LDcgKzEyNzYsNiBAQAogCWRldmZzX3JlbW92ZSgic2NzaSIpOwogCXNjc2lfZXhpdF9wcm9jZnMoKTsKIAlzY3NpX2V4aXRfcXVldWUoKTsKLQl1bnJlZ2lzdGVyX3Njc2lfY3B1KCk7CiB9CiAKIHN1YnN5c19pbml0Y2FsbChpbml0X3Njc2kpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMKaW5kZXggM2RlZDlkYS4uMGU1MjlmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jCkBAIC0yMjEsOCArMjIxLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBzZGVidWdfZHJpdmVyZnNfZHJpdmVyID0gewogCS5uYW1lIAkJPSBzZGVidWdfcHJvY19uYW1lLAogCS5idXMJCT0gJnBzZXVkb19sbGRfYnVzLAotCS5wcm9iZSAgICAgICAgICA9IHNkZWJ1Z19kcml2ZXJfcHJvYmUsCi0JLnJlbW92ZSAgICAgICAgID0gc2RlYnVnX2RyaXZlcl9yZW1vdmUsCiB9OwogCiBzdGF0aWMgY29uc3QgaW50IGNoZWNrX2NvbmRpdGlvbl9yZXN1bHQgPQpAQCAtMTc5Niw2ICsxNzk0LDggQEAKIHN0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgcHNldWRvX2xsZF9idXMgPSB7CiAgICAgICAgIC5uYW1lID0gInBzZXVkbyIsCiAgICAgICAgIC5tYXRjaCA9IHBzZXVkb19sbGRfYnVzX21hdGNoLAorCS5wcm9iZSA9IHNkZWJ1Z19kcml2ZXJfcHJvYmUsCisJLnJlbW92ZSA9IHNkZWJ1Z19kcml2ZXJfcmVtb3ZlLAogfTsKIAogc3RhdGljIHZvaWQgc2RlYnVnX3JlbGVhc2VfYWRhcHRlcihzdHJ1Y3QgZGV2aWNlICogZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYwppbmRleCBiYTkzZDZlLi4zNTc0YmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYwpAQCAtMTIxMiw3ICsxMjEyLDcgQEAKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKLXN0YXRpYyB2b2lkIHNjc2lfZ2VuZXJpY19kb25lKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3N0YXRpYyB2b2lkIHNjc2lfYmxrX3BjX2RvbmUoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewogCUJVR19PTighYmxrX3BjX3JlcXVlc3QoY21kLT5yZXF1ZXN0KSk7CiAJLyoKQEAgLTEyMjQsNyArMTIyNCw3IEBACiAJc2NzaV9pb19jb21wbGV0aW9uKGNtZCwgY21kLT5idWZmbGVuLCAwKTsKIH0KIAotdm9pZCBzY3NpX3NldHVwX2Jsa19wY19jbW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3N0YXRpYyB2b2lkIHNjc2lfc2V0dXBfYmxrX3BjX2NtbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewogCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBjbWQtPnJlcXVlc3Q7CiAKQEAgLTEyNDEsOCArMTI0MSw4IEBACiAJY21kLT50cmFuc2ZlcnNpemUgPSByZXEtPmRhdGFfbGVuOwogCWNtZC0+YWxsb3dlZCA9IHJlcS0+cmV0cmllczsKIAljbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQgPSByZXEtPnRpbWVvdXQ7CisJY21kLT5kb25lID0gc2NzaV9ibGtfcGNfZG9uZTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHNjc2lfc2V0dXBfYmxrX3BjX2NtbmQpOwogCiBzdGF0aWMgaW50IHNjc2lfcHJlcF9mbihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJlcSkKIHsKQEAgLTEzMzksNyArMTMzOSw2IEBACiAJICogaGFwcGVuaW5nIG5vdy4KIAkgKi8KIAlpZiAocmVxLT5mbGFncyAmIChSRVFfQ01EIHwgUkVRX0JMT0NLX1BDKSkgewotCQlzdHJ1Y3Qgc2NzaV9kcml2ZXIgKmRydjsKIAkJaW50IHJldDsKIAogCQkvKgpAQCAtMTM3MSwxNiArMTM3MCwxNyBAQAogCQkvKgogCQkgKiBJbml0aWFsaXplIHRoZSBhY3R1YWwgU0NTSSBjb21tYW5kIGZvciB0aGlzIHJlcXVlc3QuCiAJCSAqLwotCQlpZiAocmVxLT5ycV9kaXNrKSB7CisJCWlmIChyZXEtPmZsYWdzICYgUkVRX0JMT0NLX1BDKSB7CisJCQlzY3NpX3NldHVwX2Jsa19wY19jbW5kKGNtZCk7CisJCX0gZWxzZSBpZiAocmVxLT5ycV9kaXNrKSB7CisJCQlzdHJ1Y3Qgc2NzaV9kcml2ZXIgKmRydjsKKwogCQkJZHJ2ID0gKihzdHJ1Y3Qgc2NzaV9kcml2ZXIgKiopcmVxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CiAJCQlpZiAodW5saWtlbHkoIWRydi0+aW5pdF9jb21tYW5kKGNtZCkpKSB7CiAJCQkJc2NzaV9yZWxlYXNlX2J1ZmZlcnMoY21kKTsKIAkJCQlzY3NpX3B1dF9jb21tYW5kKGNtZCk7CiAJCQkJZ290byBraWxsOwogCQkJfQotCQl9IGVsc2UgewotCQkJc2NzaV9zZXR1cF9ibGtfcGNfY21uZChjbWQpOwotCQkJY21kLT5kb25lID0gc2NzaV9nZW5lcmljX2RvbmU7CiAJCX0KIAl9CiAKQEAgLTE0OTMsNiArMTQ5Myw0MSBAQAogCV9fc2NzaV9kb25lKGNtZCk7CiB9CiAKK3N0YXRpYyB2b2lkIHNjc2lfc29mdGlycV9kb25lKHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBycS0+Y29tcGxldGlvbl9kYXRhOworCXVuc2lnbmVkIGxvbmcgd2FpdF9mb3IgPSBjbWQtPmFsbG93ZWQgKiBjbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQ7CisJaW50IGRpc3Bvc2l0aW9uOworCisJSU5JVF9MSVNUX0hFQUQoJmNtZC0+ZWhfZW50cnkpOworCisJZGlzcG9zaXRpb24gPSBzY3NpX2RlY2lkZV9kaXNwb3NpdGlvbihjbWQpOworCWlmIChkaXNwb3NpdGlvbiAhPSBTVUNDRVNTICYmCisJICAgIHRpbWVfYmVmb3JlKGNtZC0+amlmZmllc19hdF9hbGxvYyArIHdhaXRfZm9yLCBqaWZmaWVzKSkgeworCQlzZGV2X3ByaW50ayhLRVJOX0VSUiwgY21kLT5kZXZpY2UsCisJCQkgICAgInRpbWluZyBvdXQgY29tbWFuZCwgd2FpdGVkICVsdXNcbiIsCisJCQkgICAgd2FpdF9mb3IvSFopOworCQlkaXNwb3NpdGlvbiA9IFNVQ0NFU1M7CisJfQorCQkJCisJc2NzaV9sb2dfY29tcGxldGlvbihjbWQsIGRpc3Bvc2l0aW9uKTsKKworCXN3aXRjaCAoZGlzcG9zaXRpb24pIHsKKwkJY2FzZSBTVUNDRVNTOgorCQkJc2NzaV9maW5pc2hfY29tbWFuZChjbWQpOworCQkJYnJlYWs7CisJCWNhc2UgTkVFRFNfUkVUUlk6CisJCQlzY3NpX3JldHJ5X2NvbW1hbmQoY21kKTsKKwkJCWJyZWFrOworCQljYXNlIEFERF9UT19NTFFVRVVFOgorCQkJc2NzaV9xdWV1ZV9pbnNlcnQoY21kLCBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1kpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoIXNjc2lfZWhfc2NtZF9hZGQoY21kLCAwKSkKKwkJCQlzY3NpX2ZpbmlzaF9jb21tYW5kKGNtZCk7CisJfQorfQorCiAvKgogICogRnVuY3Rpb246ICAgIHNjc2lfcmVxdWVzdF9mbigpCiAgKgpAQCAtMTY2Nyw2ICsxNzAyLDcgQEAKIAlibGtfcXVldWVfYm91bmNlX2xpbWl0KHEsIHNjc2lfY2FsY3VsYXRlX2JvdW5jZV9saW1pdChzaG9zdCkpOwogCWJsa19xdWV1ZV9zZWdtZW50X2JvdW5kYXJ5KHEsIHNob3N0LT5kbWFfYm91bmRhcnkpOwogCWJsa19xdWV1ZV9pc3N1ZV9mbHVzaF9mbihxLCBzY3NpX2lzc3VlX2ZsdXNoX2ZuKTsKKwlibGtfcXVldWVfc29mdGlycV9kb25lKHEsIHNjc2lfc29mdGlycV9kb25lKTsKIAogCWlmICghc2hvc3QtPnVzZV9jbHVzdGVyaW5nKQogCQljbGVhcl9iaXQoUVVFVUVfRkxBR19DTFVTVEVSLCAmcS0+cXVldWVfZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfcHJpdi5oIGIvZHJpdmVycy9zY3NpL3Njc2lfcHJpdi5oCmluZGV4IGYwNGU3ZTEuLjI3YzQ4MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3ByaXYuaAorKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9wcml2LmgKQEAgLTI2LDEyICsyNiw2IEBACiAjZGVmaW5lIFNDU0lfU0VOU0VfVkFMSUQoc2NtZCkgXAogCSgoKHNjbWQpLT5zZW5zZV9idWZmZXJbMF0gJiAweDcwKSA9PSAweDcwKQogCi0vKgotICogU3BlY2lhbCB2YWx1ZSBmb3Igc2Nhbm5pbmcgdG8gc3BlY2lmeSBzY2FubmluZyBvciByZXNjYW5uaW5nIG9mIGFsbAotICogcG9zc2libGUgY2hhbm5lbHMsICh0YXJnZXQpIGlkcywgb3IgbHVucyBvbiBhIGdpdmVuIHNob3N0LgotICovCi0jZGVmaW5lIFNDQU5fV0lMRF9DQVJECX4wCi0KIC8qIGhvc3RzLmMgKi8KIGV4dGVybiBpbnQgc2NzaV9pbml0X2hvc3RzKHZvaWQpOwogZXh0ZXJuIHZvaWQgc2NzaV9leGl0X2hvc3RzKHZvaWQpOwpAQCAtNDQsNiArMzgsNyBAQAogCQlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxKTsKIGV4dGVybiB2b2lkIF9fc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSk7CiBleHRlcm4gdm9pZCBfX3Njc2lfZG9uZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOworZXh0ZXJuIGludCBzY3NpX3JldHJ5X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKICNpZmRlZiBDT05GSUdfU0NTSV9MT0dHSU5HCiB2b2lkIHNjc2lfbG9nX3NlbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKIHZvaWQgc2NzaV9sb2dfY29tcGxldGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCBkaXNwb3NpdGlvbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9wcm9jLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9wcm9jLmMKaW5kZXggYTUwOTU4Yi4uMDdiZTYyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfcHJvYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3Byb2MuYwpAQCAtMjUsMTEgKzI1LDEzIEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnQuaD4KIAogI2luY2x1ZGUgInNjc2lfcHJpdi5oIgogI2luY2x1ZGUgInNjc2lfbG9nZ2luZy5oIgpAQCAtNDEsNyArNDMsNyBAQAogc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19zY3NpOwogCiAvKiBQcm90ZWN0IHNodC0+cHJlc2VudCBhbmQgc2h0LT5wcm9jX2RpciAqLwotc3RhdGljIERFQ0xBUkVfTVVURVgoZ2xvYmFsX2hvc3RfdGVtcGxhdGVfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgoZ2xvYmFsX2hvc3RfdGVtcGxhdGVfbXV0ZXgpOwogCiBzdGF0aWMgaW50IHByb2Nfc2NzaV9yZWFkKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCiAJCQkgIGludCBsZW5ndGgsIGludCAqZW9mLCB2b2lkICpkYXRhKQpAQCAtODMsNyArODUsNyBAQAogCWlmICghc2h0LT5wcm9jX2luZm8pCiAJCXJldHVybjsKIAotCWRvd24oJmdsb2JhbF9ob3N0X3RlbXBsYXRlX3NlbSk7CisJbXV0ZXhfbG9jaygmZ2xvYmFsX2hvc3RfdGVtcGxhdGVfbXV0ZXgpOwogCWlmICghc2h0LT5wcmVzZW50KyspIHsKIAkJc2h0LT5wcm9jX2RpciA9IHByb2NfbWtkaXIoc2h0LT5wcm9jX25hbWUsIHByb2Nfc2NzaSk7CiAgICAgICAgIAlpZiAoIXNodC0+cHJvY19kaXIpCkBAIC05Miw3ICs5NCw3IEBACiAJCWVsc2UKIAkJCXNodC0+cHJvY19kaXItPm93bmVyID0gc2h0LT5tb2R1bGU7CiAJfQotCXVwKCZnbG9iYWxfaG9zdF90ZW1wbGF0ZV9zZW0pOworCW11dGV4X3VubG9jaygmZ2xvYmFsX2hvc3RfdGVtcGxhdGVfbXV0ZXgpOwogfQogCiB2b2lkIHNjc2lfcHJvY19ob3N0ZGlyX3JtKHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnNodCkKQEAgLTEwMCwxMiArMTAyLDEyIEBACiAJaWYgKCFzaHQtPnByb2NfaW5mbykKIAkJcmV0dXJuOwogCi0JZG93bigmZ2xvYmFsX2hvc3RfdGVtcGxhdGVfc2VtKTsKKwltdXRleF9sb2NrKCZnbG9iYWxfaG9zdF90ZW1wbGF0ZV9tdXRleCk7CiAJaWYgKCEtLXNodC0+cHJlc2VudCAmJiBzaHQtPnByb2NfZGlyKSB7CiAJCXJlbW92ZV9wcm9jX2VudHJ5KHNodC0+cHJvY19uYW1lLCBwcm9jX3Njc2kpOwogCQlzaHQtPnByb2NfZGlyID0gTlVMTDsKIAl9Ci0JdXAoJmdsb2JhbF9ob3N0X3RlbXBsYXRlX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZnbG9iYWxfaG9zdF90ZW1wbGF0ZV9tdXRleCk7CiB9CiAKIHZvaWQgc2NzaV9wcm9jX2hvc3RfYWRkKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQpAQCAtMTk5LDcgKzIwMSwxMCBAQAogCWlmIChJU19FUlIoc2hvc3QpKQogCQlyZXR1cm4gUFRSX0VSUihzaG9zdCk7CiAKLQllcnJvciA9IHNjc2lfc2Nhbl9ob3N0X3NlbGVjdGVkKHNob3N0LCBjaGFubmVsLCBpZCwgbHVuLCAxKTsKKwlpZiAoc2hvc3QtPnRyYW5zcG9ydHQtPnVzZXJfc2NhbikKKwkJZXJyb3IgPSBzaG9zdC0+dHJhbnNwb3J0dC0+dXNlcl9zY2FuKHNob3N0LCBjaGFubmVsLCBpZCwgbHVuKTsKKwllbHNlCisJCWVycm9yID0gc2NzaV9zY2FuX2hvc3Rfc2VsZWN0ZWQoc2hvc3QsIGNoYW5uZWwsIGlkLCBsdW4sIDEpOwogCXNjc2lfaG9zdF9wdXQoc2hvc3QpOwogCXJldHVybiBlcnJvcjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYwppbmRleCAwNWViYjljLi43NTJmYjVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCkBAIC0zMzQsMTkgKzMzNCw2IEBACiAJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0OwogCXN0cnVjdCBzY3NpX3RhcmdldCAqZm91bmRfdGFyZ2V0OwogCi0JLyoKLQkgKiBPYnRhaW4gdGhlIHJlYWwgcGFyZW50IGZyb20gdGhlIHRyYW5zcG9ydC4gVGhlIHRyYW5zcG9ydAotCSAqIGlzIGFsbG93ZWQgdG8gZmFpbCAobm8gZXJyb3IpIGlmIHRoZXJlIGlzIG5vdGhpbmcgYXQgdGhhdAotCSAqIHRhcmdldCBpZC4KLQkgKi8KLQlpZiAoc2hvc3QtPnRyYW5zcG9ydHQtPnRhcmdldF9wYXJlbnQpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCQlwYXJlbnQgPSBzaG9zdC0+dHJhbnNwb3J0dC0+dGFyZ2V0X3BhcmVudChzaG9zdCwgY2hhbm5lbCwgaWQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQkJaWYgKCFwYXJlbnQpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0KIAlzdGFyZ2V0ID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXN0YXJnZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogYWxsb2NhdGlvbiBmYWlsdXJlXG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtMTI4MywyMCArMTI3MCwyMSBAQAogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKIAlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQgPSAmc2hvc3QtPnNob3N0X2dlbmRldjsKIAlpbnQgcmVzOwotCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHNjc2lfYWxsb2NfdGFyZ2V0KHBhcmVudCwgY2hhbm5lbCwgaWQpOworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldDsKIAorCXN0YXJnZXQgPSBzY3NpX2FsbG9jX3RhcmdldChwYXJlbnQsIGNoYW5uZWwsIGlkKTsKIAlpZiAoIXN0YXJnZXQpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJZ2V0X2RldmljZSgmc3RhcmdldC0+ZGV2KTsKLQlkb3duKCZzaG9zdC0+c2Nhbl9tdXRleCk7CisJbXV0ZXhfbG9jaygmc2hvc3QtPnNjYW5fbXV0ZXgpOwogCWlmIChzY3NpX2hvc3Rfc2Nhbl9hbGxvd2VkKHNob3N0KSkgewogCQlyZXMgPSBzY3NpX3Byb2JlX2FuZF9hZGRfbHVuKHN0YXJnZXQsIGx1biwgTlVMTCwgJnNkZXYsIDEsCiAJCQkJCSAgICAgaG9zdGRhdGEpOwogCQlpZiAocmVzICE9IFNDU0lfU0NBTl9MVU5fUFJFU0VOVCkKIAkJCXNkZXYgPSBFUlJfUFRSKC1FTk9ERVYpOwogCX0KLQl1cCgmc2hvc3QtPnNjYW5fbXV0ZXgpOworCW11dGV4X3VubG9jaygmc2hvc3QtPnNjYW5fbXV0ZXgpOwogCXNjc2lfdGFyZ2V0X3JlYXAoc3RhcmdldCk7CiAJcHV0X2RldmljZSgmc3RhcmdldC0+ZGV2KTsKIApAQCAtMTQwNCwxMCArMTM5MiwxMCBAQAogewogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHBhcmVudCk7CiAKLQlkb3duKCZzaG9zdC0+c2Nhbl9tdXRleCk7CisJbXV0ZXhfbG9jaygmc2hvc3QtPnNjYW5fbXV0ZXgpOwogCWlmIChzY3NpX2hvc3Rfc2Nhbl9hbGxvd2VkKHNob3N0KSkKIAkJX19zY3NpX3NjYW5fdGFyZ2V0KHBhcmVudCwgY2hhbm5lbCwgaWQsIGx1biwgcmVzY2FuKTsKLQl1cCgmc2hvc3QtPnNjYW5fbXV0ZXgpOworCW11dGV4X3VubG9jaygmc2hvc3QtPnNjYW5fbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTChzY3NpX3NjYW5fdGFyZ2V0KTsKIApAQCAtMTQ1NCw3ICsxNDQyLDcgQEAKIAkgICAgKChsdW4gIT0gU0NBTl9XSUxEX0NBUkQpICYmIChsdW4gPiBzaG9zdC0+bWF4X2x1bikpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWRvd24oJnNob3N0LT5zY2FuX211dGV4KTsKKwltdXRleF9sb2NrKCZzaG9zdC0+c2Nhbl9tdXRleCk7CiAJaWYgKHNjc2lfaG9zdF9zY2FuX2FsbG93ZWQoc2hvc3QpKSB7CiAJCWlmIChjaGFubmVsID09IFNDQU5fV0lMRF9DQVJEKQogCQkJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8PSBzaG9zdC0+bWF4X2NoYW5uZWw7CkBAIC0xNDY0LDcgKzE0NTIsNyBAQAogCQllbHNlCiAJCQlzY3NpX3NjYW5fY2hhbm5lbChzaG9zdCwgY2hhbm5lbCwgaWQsIGx1biwgcmVzY2FuKTsKIAl9Ci0JdXAoJnNob3N0LT5zY2FuX211dGV4KTsKKwltdXRleF91bmxvY2soJnNob3N0LT5zY2FuX211dGV4KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTUyMiw3ICsxNTEwLDcgQEAKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBOVUxMOwogCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldDsKIAotCWRvd24oJnNob3N0LT5zY2FuX211dGV4KTsKKwltdXRleF9sb2NrKCZzaG9zdC0+c2Nhbl9tdXRleCk7CiAJaWYgKCFzY3NpX2hvc3Rfc2Nhbl9hbGxvd2VkKHNob3N0KSkKIAkJZ290byBvdXQ7CiAJc3RhcmdldCA9IHNjc2lfYWxsb2NfdGFyZ2V0KCZzaG9zdC0+c2hvc3RfZ2VuZGV2LCAwLCBzaG9zdC0+dGhpc19pZCk7CkBAIC0xNTM2LDcgKzE1MjQsNyBAQAogCX0KIAlwdXRfZGV2aWNlKCZzdGFyZ2V0LT5kZXYpOwogIG91dDoKLQl1cCgmc2hvc3QtPnNjYW5fbXV0ZXgpOworCW11dGV4X3VubG9jaygmc2hvc3QtPnNjYW5fbXV0ZXgpOwogCXJldHVybiBzZGV2OwogfQogRVhQT1JUX1NZTUJPTChzY3NpX2dldF9ob3N0X2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jIGIvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYwppbmRleCBlYTdmM2E0Li5hNzdiMzJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKQEAgLTEwNiw3ICsxMDYsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGNoZWNrX3NldCgmbHVuLCBzMykpCiAJCXJldHVybiAtRUlOVkFMOwotCXJlcyA9IHNjc2lfc2Nhbl9ob3N0X3NlbGVjdGVkKHNob3N0LCBjaGFubmVsLCBpZCwgbHVuLCAxKTsKKwlpZiAoc2hvc3QtPnRyYW5zcG9ydHQtPnVzZXJfc2NhbikKKwkJcmVzID0gc2hvc3QtPnRyYW5zcG9ydHQtPnVzZXJfc2NhbihzaG9zdCwgY2hhbm5lbCwgaWQsIGx1bik7CisJZWxzZQorCQlyZXMgPSBzY3NpX3NjYW5faG9zdF9zZWxlY3RlZChzaG9zdCwgY2hhbm5lbCwgaWQsIGx1biwgMSk7CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtNzQ1LDkgKzc0OCw5IEBACiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBzZGV2LT5ob3N0OwogCi0JZG93bigmc2hvc3QtPnNjYW5fbXV0ZXgpOworCW11dGV4X2xvY2soJnNob3N0LT5zY2FuX211dGV4KTsKIAlfX3Njc2lfcmVtb3ZlX2RldmljZShzZGV2KTsKLQl1cCgmc2hvc3QtPnNjYW5fbXV0ZXgpOworCW11dGV4X3VubG9jaygmc2hvc3QtPnNjYW5fbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTChzY3NpX3JlbW92ZV9kZXZpY2UpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5jCmluZGV4IDY4NWI5OTcuLmYyYzlhY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5jCkBAIC0yOTUsNiArMjk1LDcgQEAKIAkgKi8KIAlmY19ob3N0X25vZGVfbmFtZShzaG9zdCkgPSAtMTsKIAlmY19ob3N0X3BvcnRfbmFtZShzaG9zdCkgPSAtMTsKKwlmY19ob3N0X3Blcm1hbmVudF9wb3J0X25hbWUoc2hvc3QpID0gLTE7CiAJZmNfaG9zdF9zdXBwb3J0ZWRfY2xhc3NlcyhzaG9zdCkgPSBGQ19DT1NfVU5TUEVDSUZJRUQ7CiAJbWVtc2V0KGZjX2hvc3Rfc3VwcG9ydGVkX2ZjNHMoc2hvc3QpLCAwLAogCQlzaXplb2YoZmNfaG9zdF9zdXBwb3J0ZWRfZmM0cyhzaG9zdCkpKTsKQEAgLTc5NSw2ICs3OTYsOCBAQAogCiBmY19wcml2YXRlX2hvc3RfcmRfYXR0cl9jYXN0KG5vZGVfbmFtZSwgIjB4JWxseFxuIiwgMjAsIHVuc2lnbmVkIGxvbmcgbG9uZyk7CiBmY19wcml2YXRlX2hvc3RfcmRfYXR0cl9jYXN0KHBvcnRfbmFtZSwgIjB4JWxseFxuIiwgMjAsIHVuc2lnbmVkIGxvbmcgbG9uZyk7CitmY19wcml2YXRlX2hvc3RfcmRfYXR0cl9jYXN0KHBlcm1hbmVudF9wb3J0X25hbWUsICIweCVsbHhcbiIsIDIwLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGxvbmcpOwogZmNfcHJpdmF0ZV9ob3N0X3JkX2F0dHIoc3ltYm9saWNfbmFtZSwgIiVzXG4iLCAoRkNfU1lNQk9MSUNfTkFNRV9TSVpFICsxKSk7CiBmY19wcml2YXRlX2hvc3RfcmRfYXR0cihtYXhmcmFtZV9zaXplLCAiJXUgYnl0ZXNcbiIsIDIwKTsKIGZjX3ByaXZhdGVfaG9zdF9yZF9hdHRyKHNlcmlhbF9udW1iZXIsICIlc1xuIiwgKEZDX1NFUklBTF9OVU1CRVJfU0laRSArMSkpOwpAQCAtMTA5MCwxNyArMTA5MywyMyBAQAogLyoKICAqIE11c3QgYmUgY2FsbGVkIHdpdGggc2hvc3QtPmhvc3RfbG9jayBoZWxkCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlICpmY190YXJnZXRfcGFyZW50KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAotCQkJCQlpbnQgY2hhbm5lbCwgdWludCBpZCkKK3N0YXRpYyBpbnQgZmNfdXNlcl9zY2FuKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCB1aW50IGNoYW5uZWwsCisJCXVpbnQgaWQsIHVpbnQgbHVuKQogewogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQ7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJwb3J0LCAmZmNfaG9zdF9ycG9ydHMoc2hvc3QpLCBwZWVycykKLQkJaWYgKChycG9ydC0+Y2hhbm5lbCA9PSBjaGFubmVsKSAmJgotCQkgICAgKHJwb3J0LT5zY3NpX3RhcmdldF9pZCA9PSBpZCkpCi0JCQlyZXR1cm4gJnJwb3J0LT5kZXY7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShycG9ydCwgJmZjX2hvc3RfcnBvcnRzKHNob3N0KSwgcGVlcnMpIHsKKwkJaWYgKHJwb3J0LT5zY3NpX3RhcmdldF9pZCA9PSAtMSkKKwkJCWNvbnRpbnVlOwogCi0JcmV0dXJuIE5VTEw7CisJCWlmICgoY2hhbm5lbCA9PSBTQ0FOX1dJTERfQ0FSRCB8fCBjaGFubmVsID09IHJwb3J0LT5jaGFubmVsKSAmJgorCQkgICAgKGlkID09IFNDQU5fV0lMRF9DQVJEIHx8IGlkID09IHJwb3J0LT5zY3NpX3RhcmdldF9pZCkpIHsKKwkJCXNjc2lfc2Nhbl90YXJnZXQoJnJwb3J0LT5kZXYsIHJwb3J0LT5jaGFubmVsLAorCQkJCQkgcnBvcnQtPnNjc2lfdGFyZ2V0X2lkLCBsdW4sIDEpOworCQl9CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqCkBAIC0xMTM5LDcgKzExNDgsNyBAQAogCS8qIFRyYW5zcG9ydCB1c2VzIHRoZSBzaG9zdCB3b3JrcSBmb3Igc2NzaSBzY2FubmluZyAqLwogCWktPnQuY3JlYXRlX3dvcmtfcXVldWUgPSAxOwogCi0JaS0+dC50YXJnZXRfcGFyZW50ID0gZmNfdGFyZ2V0X3BhcmVudDsKKwlpLT50LnVzZXJfc2NhbiA9IGZjX3VzZXJfc2NhbjsKIAkKIAkvKgogCSAqIFNldHVwIFNDU0kgVGFyZ2V0IEF0dHJpYnV0ZXMuCkBAIC0xMTYwLDYgKzExNjksNyBAQAogCWNvdW50PTA7CiAJU0VUVVBfSE9TVF9BVFRSSUJVVEVfUkQobm9kZV9uYW1lKTsKIAlTRVRVUF9IT1NUX0FUVFJJQlVURV9SRChwb3J0X25hbWUpOworCVNFVFVQX0hPU1RfQVRUUklCVVRFX1JEKHBlcm1hbmVudF9wb3J0X25hbWUpOwogCVNFVFVQX0hPU1RfQVRUUklCVVRFX1JEKHN1cHBvcnRlZF9jbGFzc2VzKTsKIAlTRVRVUF9IT1NUX0FUVFJJQlVURV9SRChzdXBwb3J0ZWRfZmM0cyk7CiAJU0VUVVBfSE9TVF9BVFRSSUJVVEVfUkQoc3ltYm9saWNfbmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5jCmluZGV4IGUwODQ2MmQuLjU5YTFjOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5jCkBAIC0yMSwxMSArMjEsOSBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KICAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+Ci0KICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KQEAgLTQ1LDExICs0Myw2IEBACiAJICovCiAJc3RydWN0IGxpc3RfaGVhZCBzZXNzaW9uczsKIAkvKgotCSAqIGxvY2sgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgc2Vzc2lvbnMgbGlzdCB3aGljaCBtdXN0Ci0JICogYmUgdGFrZW4gYWZ0ZXIgdGhlIHJ4X3F1ZXVlX3NlbWEKLQkgKi8KLQlzcGlubG9ja190IHNlc3Npb25fbG9jazsKLQkvKgogCSAqIGJhc2VkIG9uIHRyYW5zcG9ydCBjYXBhYmlsaXRpZXMsIGF0IHJlZ2lzdGVyIHRpbWUgd2Ugc2V0IHRoZXNlCiAJICogYml0cyB0byB0ZWxsIHRoZSB0cmFuc3BvcnQgY2xhc3MgaXQgd2FudHMgYXR0cmlidXRlcyBkaXNwbGF5ZWQKIAkgKiBpbiBzeXNmcyBvciB0aGF0IGl0IGNhbiBzdXBwb3J0IGRpZmZlcmVudCBpU0NTSSBEYXRhLVBhdGgKQEAgLTcwLDcgKzYzLDcgQEAKIC8qCiAgKiBsaXN0IG9mIHJlZ2lzdGVyZWQgdHJhbnNwb3J0cyBhbmQgbG9jayB0aGF0IG11c3QKICAqIGJlIGhlbGQgd2hpbGUgYWNjZXNzaW5nIGxpc3QuIFRoZSBpc2NzaV90cmFuc3BvcnRfbG9jayBtdXN0Ci0gKiBiZSBhY3F1aXJlZCBhZnRlciB0aGUgcnhfcXVldWVfc2VtYS4KKyAqIGJlIGFjcXVpcmVkIGFmdGVyIHRoZSByeF9xdWV1ZV9tdXRleC4KICAqLwogc3RhdGljIExJU1RfSEVBRChpc2NzaV90cmFuc3BvcnRzKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXNjc2lfdHJhbnNwb3J0X2xvY2spOwpAQCAtMTQ1LDcgKzEzOCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc29jayAqbmxzOwogc3RhdGljIGludCBkYWVtb25fcGlkOwotc3RhdGljIERFQ0xBUkVfTVVURVgocnhfcXVldWVfc2VtYSk7CitzdGF0aWMgREVGSU5FX01VVEVYKHJ4X3F1ZXVlX211dGV4KTsKIAogc3RydWN0IG1lbXBvb2xfem9uZSB7CiAJbWVtcG9vbF90ICpwb29sOwpAQCAtMTU2LDcgKzE0OSw3IEBACiAJc3BpbmxvY2tfdCBmcmVlbG9jazsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbWVtcG9vbF96b25lIHpfcmVwbHk7CitzdGF0aWMgc3RydWN0IG1lbXBvb2xfem9uZSAqel9yZXBseTsKIAogLyoKICAqIFpfTUFYXyogLSBhY3R1YWwgbWVtcG9vbCBzaXplIGFsbG9jYXRlZCBhdCB0aGUgbWVtcG9vbF96b25lX2luaXQoKSB0aW1lCkBAIC0xNzEsNTAgKzE2NCwyNzEgQEAKICNkZWZpbmUgWl9NQVhfRVJST1IJMTYKICNkZWZpbmUgWl9ISVdBVF9FUlJPUgkxMgogCi1zdHJ1Y3QgaXNjc2lfaWZfY29ubiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBjb25uX2xpc3Q7CS8qIGl0ZW0gaW4gY29ubmxpc3QgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIHNlc3Npb25fbGlzdDsJLyogaXRlbSBpbiBzZXNzaW9uLT5jb25uZWN0aW9ucyAqLwotCWlzY3NpX2Nvbm5oX3QgY29ubmg7Ci0JaW50IGFjdGl2ZTsJCQkvKiBtdXN0IGJlIGFjY2Vzc2VkIHdpdGggdGhlIGNvbm5sb2NrICovCi0Jc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsJCS8qIG9yaWdpbmF0ZWQgc2hvc3QgKi8KLQlzdHJ1Y3QgZGV2aWNlIGRldjsJCS8qIHN5c2ZzIHRyYW5zcG9ydC9jb250YWluZXIgZGV2aWNlICovCi0Jc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHJhbnNwb3J0OwotCXN0cnVjdCBtZW1wb29sX3pvbmUgel9lcnJvcjsKLQlzdHJ1Y3QgbWVtcG9vbF96b25lIHpfcGR1OwotCXN0cnVjdCBsaXN0X2hlYWQgZnJlZXF1ZXVlOwotfTsKLQotI2RlZmluZSBpc2NzaV9kZXZfdG9faWZfY29ubihfZGV2KSBcCi0JY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBpc2NzaV9pZl9jb25uLCBkZXYpCi0KLSNkZWZpbmUgaXNjc2lfY2Rldl90b19pZl9jb25uKF9jZGV2KSBcCi0JaXNjc2lfZGV2X3RvX2lmX2Nvbm4oX2NkZXYtPmRldikKLQogc3RhdGljIExJU1RfSEVBRChjb25ubGlzdCk7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNvbm5sb2NrKTsKIAotc3RydWN0IGlzY3NpX2lmX3Nlc3Npb24gewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJLyogaXRlbSBpbiBzZXNzaW9uX2xpc3QgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGNvbm5lY3Rpb25zOwotCWlzY3NpX3Nlc3Npb25oX3Qgc2Vzc2lvbmg7Ci0Jc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHJhbnNwb3J0OwotCXN0cnVjdCBkZXZpY2UgZGV2OwkvKiBzeXNmcyB0cmFuc3BvcnQvY29udGFpbmVyIGRldmljZSAqLwotfTsKKy8qCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBieSBMTERzIHRoYXQgYWxsb2NhdGUKKyAqIHRoZWlyIG93biBzY3NpX2hvc3RzIG9yIGJ5IHNvZnR3YXJlIGlzY3NpIExMRHMKKyAqLworc3RhdGljIHZvaWQgaXNjc2lfc2Vzc2lvbl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3Npb24gPSBpc2NzaV9kZXZfdG9fc2Vzc2lvbihkZXYpOworCXN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnRyYW5zcG9ydCA9IHNlc3Npb24tPnRyYW5zcG9ydDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKIAotI2RlZmluZSBpc2NzaV9kZXZfdG9faWZfc2Vzc2lvbihfZGV2KSBcCi0JY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBpc2NzaV9pZl9zZXNzaW9uLCBkZXYpCisJc2hvc3QgPSBpc2NzaV9zZXNzaW9uX3RvX3Nob3N0KHNlc3Npb24pOworCXNjc2lfaG9zdF9wdXQoc2hvc3QpOworCWtmcmVlKHNlc3Npb24pOworCW1vZHVsZV9wdXQodHJhbnNwb3J0LT5vd25lcik7Cit9CiAKLSNkZWZpbmUgaXNjc2lfY2Rldl90b19pZl9zZXNzaW9uKF9jZGV2KSBcCi0JaXNjc2lfZGV2X3RvX2lmX3Nlc3Npb24oX2NkZXYtPmRldikKK3N0YXRpYyBpbnQgaXNjc2lfaXNfc2Vzc2lvbl9kZXYoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXYtPnJlbGVhc2UgPT0gaXNjc2lfc2Vzc2lvbl9yZWxlYXNlOworfQogCi0jZGVmaW5lIGlzY3NpX2lmX3Nlc3Npb25fdG9fc2hvc3QoX3Nlc3Npb24pIFwKLQlkZXZfdG9fc2hvc3QoX3Nlc3Npb24tPmRldi5wYXJlbnQpCisvKioKKyAqIGlzY3NpX2NyZWF0ZV9zZXNzaW9uIC0gY3JlYXRlIGlzY3NpIGNsYXNzIHNlc3Npb24KKyAqIEBzaG9zdDogc2NzaSBob3N0CisgKiBAdHJhbnNwb3J0OiBpc2NzaSB0cmFuc3BvcnQKKyAqCisgKiBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbSBhIExMRCBvciBpc2NzaV90cmFuc3BvcnQKKyAqKi8KK3N0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqCitpc2NzaV9jcmVhdGVfc2Vzc2lvbihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbjsKKwlpbnQgZXJyOwogCi1zdGF0aWMgc3RydWN0IGlzY3NpX2lmX2Nvbm4qCisJaWYgKCF0cnlfbW9kdWxlX2dldCh0cmFuc3BvcnQtPm93bmVyKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzZXNzaW9uID0ga3phbGxvYyhzaXplb2YoKnNlc3Npb24pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlc3Npb24pCisJCWdvdG8gbW9kdWxlX3B1dDsKKwlzZXNzaW9uLT50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisKKwkvKiB0aGlzIGlzIHJlbGVhc2VkIGluIHRoZSBkZXYncyByZWxlYXNlIGZ1bmN0aW9uICovCisJc2NzaV9ob3N0X2dldChzaG9zdCk7CisJc25wcmludGYoc2Vzc2lvbi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICJzZXNzaW9uJXUiLCBzaG9zdC0+aG9zdF9ubyk7CisJc2Vzc2lvbi0+ZGV2LnBhcmVudCA9ICZzaG9zdC0+c2hvc3RfZ2VuZGV2OworCXNlc3Npb24tPmRldi5yZWxlYXNlID0gaXNjc2lfc2Vzc2lvbl9yZWxlYXNlOworCWVyciA9IGRldmljZV9yZWdpc3Rlcigmc2Vzc2lvbi0+ZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9wcmludGsoS0VSTl9FUlIsICZzZXNzaW9uLT5kZXYsICJpc2NzaTogY291bGQgbm90ICIKKwkJCSAgICJyZWdpc3RlciBzZXNzaW9uJ3MgZGV2XG4iKTsKKwkJZ290byBmcmVlX3Nlc3Npb247CisJfQorCXRyYW5zcG9ydF9yZWdpc3Rlcl9kZXZpY2UoJnNlc3Npb24tPmRldik7CisKKwlyZXR1cm4gc2Vzc2lvbjsKKworZnJlZV9zZXNzaW9uOgorCWtmcmVlKHNlc3Npb24pOworbW9kdWxlX3B1dDoKKwltb2R1bGVfcHV0KHRyYW5zcG9ydC0+b3duZXIpOworCXJldHVybiBOVUxMOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9jcmVhdGVfc2Vzc2lvbik7CisKKy8qKgorICogaXNjc2lfZGVzdHJveV9zZXNzaW9uIC0gZGVzdHJveSBpc2NzaSBzZXNzaW9uCisgKiBAc2Vzc2lvbjogaXNjc2lfc2Vzc2lvbgorICoKKyAqIENhbiBiZSBjYWxsZWQgYnkgYSBMTEQgb3IgaXNjc2lfdHJhbnNwb3J0LiBUaGVyZSBtdXN0IG5vdCBiZQorICogYW55IHJ1bm5pbmcgY29ubmVjdGlvbnMuCisgKiovCitpbnQgaXNjc2lfZGVzdHJveV9zZXNzaW9uKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwl0cmFuc3BvcnRfdW5yZWdpc3Rlcl9kZXZpY2UoJnNlc3Npb24tPmRldik7CisJZGV2aWNlX3VucmVnaXN0ZXIoJnNlc3Npb24tPmRldik7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX2Rlc3Ryb3lfc2Vzc2lvbik7CisKK3N0YXRpYyB2b2lkIGlzY3NpX2Nvbm5fcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uID0gaXNjc2lfZGV2X3RvX2Nvbm4oZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQgPSBjb25uLT5kZXYucGFyZW50OworCisJa2ZyZWUoY29ubik7CisJcHV0X2RldmljZShwYXJlbnQpOworfQorCitzdGF0aWMgaW50IGlzY3NpX2lzX2Nvbm5fZGV2KGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2LT5yZWxlYXNlID09IGlzY3NpX2Nvbm5fcmVsZWFzZTsKK30KKworLyoqCisgKiBpc2NzaV9jcmVhdGVfY29ubiAtIGNyZWF0ZSBpc2NzaSBjbGFzcyBjb25uZWN0aW9uCisgKiBAc2Vzc2lvbjogaXNjc2kgY2xzIHNlc3Npb24KKyAqIEBjaWQ6IGNvbm5lY3Rpb24gaWQKKyAqCisgKiBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbSBhIExMRCBvciBpc2NzaV90cmFuc3BvcnQuIFRoZSBjb25uZWN0aW9uCisgKiBpcyBjaGlsZCBvZiB0aGUgc2Vzc2lvbiBzbyBjaWQgbXVzdCBiZSB1bmlxdWUgZm9yIGFsbCBjb25uZWN0aW9ucworICogb24gdGhlIHNlc3Npb24uCisgKiovCitzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKgoraXNjc2lfY3JlYXRlX2Nvbm4oc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uLCB1aW50MzJfdCBjaWQpCit7CisJc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHJhbnNwb3J0ID0gc2Vzc2lvbi0+dHJhbnNwb3J0OworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gaXNjc2lfc2Vzc2lvbl90b19zaG9zdChzZXNzaW9uKTsKKwlzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNvbm47CisJaW50IGVycjsKKworCWNvbm4gPSBremFsbG9jKHNpemVvZigqY29ubikgKyB0cmFuc3BvcnQtPmNvbm5kYXRhX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghY29ubikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodHJhbnNwb3J0LT5jb25uZGF0YV9zaXplKQorCQljb25uLT5kZF9kYXRhID0gJmNvbm5bMV07CisKKwlJTklUX0xJU1RfSEVBRCgmY29ubi0+Y29ubl9saXN0KTsKKwljb25uLT50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisKKwkvKiB0aGlzIGlzIHJlbGVhc2VkIGluIHRoZSBkZXYncyByZWxlYXNlIGZ1bmN0aW9uICovCisJaWYgKCFnZXRfZGV2aWNlKCZzZXNzaW9uLT5kZXYpKQorCQlnb3RvIGZyZWVfY29ubjsKKwlzbnByaW50Zihjb25uLT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgImNvbm5lY3Rpb24lZDoldSIsCisJCSBzaG9zdC0+aG9zdF9ubywgY2lkKTsKKwljb25uLT5kZXYucGFyZW50ID0gJnNlc3Npb24tPmRldjsKKwljb25uLT5kZXYucmVsZWFzZSA9IGlzY3NpX2Nvbm5fcmVsZWFzZTsKKwllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJmNvbm4tPmRldik7CisJaWYgKGVycikgeworCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmY29ubi0+ZGV2LCAiaXNjc2k6IGNvdWxkIG5vdCByZWdpc3RlciAiCisJCQkgICAiY29ubmVjdGlvbidzIGRldlxuIik7CisJCWdvdG8gcmVsZWFzZV9wYXJlbnRfcmVmOworCX0KKwl0cmFuc3BvcnRfcmVnaXN0ZXJfZGV2aWNlKCZjb25uLT5kZXYpOworCXJldHVybiBjb25uOworCityZWxlYXNlX3BhcmVudF9yZWY6CisJcHV0X2RldmljZSgmc2Vzc2lvbi0+ZGV2KTsKK2ZyZWVfY29ubjoKKwlrZnJlZShjb25uKTsKKwlyZXR1cm4gTlVMTDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfY3JlYXRlX2Nvbm4pOworCisvKioKKyAqIGlzY3NpX2Rlc3Ryb3lfY29ubiAtIGRlc3Ryb3kgaXNjc2kgY2xhc3MgY29ubmVjdGlvbgorICogQHNlc3Npb246IGlzY3NpIGNscyBzZXNzaW9uCisgKgorICogVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gYSBMTEQgb3IgaXNjc2lfdHJhbnNwb3J0LgorICoqLworaW50IGlzY3NpX2Rlc3Ryb3lfY29ubihzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNvbm4pCit7CisJdHJhbnNwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKCZjb25uLT5kZXYpOworCWRldmljZV91bnJlZ2lzdGVyKCZjb25uLT5kZXYpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9kZXN0cm95X2Nvbm4pOworCisvKgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIG9ubHkgYnkgc29mdHdhcmUgaXNjc2lfdHJhbnNwb3J0cworICogd2hpY2ggZG8gbm90IGFsbG9jYXRlIGFuZCBtb3JlIHRoZWlyIHNjc2lfaG9zdHMgc2luY2UgdGhpcworICogaXMgaW5pdGlhdGVkIGZyb20gdXNlcnNwYWNlLgorICovCisKKy8qCisgKiBpU0NTSSBTZXNzaW9uJ3MgaG9zdGRhdGEgb3JnYW5pemF0aW9uOgorICoKKyAqICAgICotLS0tLS0tLS0tLS0tLS0tLS0qIDw9PSBob3N0ZGF0YV9zZXNzaW9uKGhvc3QtPmhvc3RkYXRhKQorICogICAgfCBwdHIgdG8gY2xhc3Mgc2Vzc3wKKyAqICAgIHwtLS0tLS0tLS0tLS0tLS0tLS18IDw9PSBpc2NzaV9ob3N0ZGF0YShob3N0LT5ob3N0ZGF0YSkKKyAqICAgIHwgdHJhbnNwb3J0J3MgZGF0YSB8CisgKiAgICAqLS0tLS0tLS0tLS0tLS0tLS0tKgorICovCisKKyNkZWZpbmUgaG9zdGRhdGFfcHJpdnNpemUoX3QpCShzaXplb2YodW5zaWduZWQgbG9uZykgKyBfdC0+aG9zdGRhdGFfc2l6ZSArIFwKKwkJCQkgX3QtPmhvc3RkYXRhX3NpemUgJSBzaXplb2YodW5zaWduZWQgbG9uZykpCisKKyNkZWZpbmUgaG9zdGRhdGFfc2Vzc2lvbihfaG9zdGRhdGEpIChpc2NzaV9wdHIoKih1bnNpZ25lZCBsb25nICopX2hvc3RkYXRhKSkKKworLyoqCisgKiBpc2NzaV90cmFuc3BvcnRfY3JlYXRlX3Nlc3Npb24gLSBjcmVhdGUgaXNjc2kgY2xzIHNlc3Npb24gYW5kIGhvc3QKKyAqIHNjc2l0OiBzY3NpIHRyYW5zcG9ydCB0ZW1wbGF0ZQorICogdHJhbnNwb3J0OiBpc2NzaSB0cmFuc3BvcnQgdGVtcGxhdGUKKyAqCisgKiBUaGlzIGNhbiBiZSB1c2VkIGJ5IHNvZnR3YXJlIGlzY3NpX3RyYW5zcG9ydHMgdGhhdCBhbGxvY2F0ZQorICogYSBzZXNzaW9uIHBlciBzY3NpIGhvc3QuCisgKiovCitzdHJ1Y3QgU2NzaV9Ib3N0ICoKK2lzY3NpX3RyYW5zcG9ydF9jcmVhdGVfc2Vzc2lvbihzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKnNjc2l0LAorCQkJICAgICAgIHN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKwlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3Npb247CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisKKwlzaG9zdCA9IHNjc2lfaG9zdF9hbGxvYyh0cmFuc3BvcnQtPmhvc3RfdGVtcGxhdGUsCisJCQkJaG9zdGRhdGFfcHJpdnNpemUodHJhbnNwb3J0KSk7CisJaWYgKCFzaG9zdCkgeworCQlwcmludGsoS0VSTl9FUlIgImlzY3NpOiBjYW4gbm90IGFsbG9jYXRlIFNDU0kgaG9zdCBmb3IgIgorCQkJInNlc3Npb25cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzaG9zdC0+bWF4X2lkID0gMTsKKwlzaG9zdC0+bWF4X2NoYW5uZWwgPSAwOworCXNob3N0LT5tYXhfbHVuID0gdHJhbnNwb3J0LT5tYXhfbHVuOworCXNob3N0LT5tYXhfY21kX2xlbiA9IHRyYW5zcG9ydC0+bWF4X2NtZF9sZW47CisJc2hvc3QtPnRyYW5zcG9ydHQgPSBzY3NpdDsKKwlzaG9zdC0+dHJhbnNwb3J0dC0+Y3JlYXRlX3dvcmtfcXVldWUgPSAxOworCisJaWYgKHNjc2lfYWRkX2hvc3Qoc2hvc3QsIE5VTEwpKQorCQlnb3RvIGZyZWVfaG9zdDsKKworCXNlc3Npb24gPSBpc2NzaV9jcmVhdGVfc2Vzc2lvbihzaG9zdCwgdHJhbnNwb3J0KTsKKwlpZiAoIXNlc3Npb24pCisJCWdvdG8gcmVtb3ZlX2hvc3Q7CisKKwkqKHVuc2lnbmVkIGxvbmcqKXNob3N0LT5ob3N0ZGF0YSA9ICh1bnNpZ25lZCBsb25nKXNlc3Npb247CisJcmV0dXJuIHNob3N0OworCityZW1vdmVfaG9zdDoKKwlzY3NpX3JlbW92ZV9ob3N0KHNob3N0KTsKK2ZyZWVfaG9zdDoKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfdHJhbnNwb3J0X2NyZWF0ZV9zZXNzaW9uKTsKKworLyoqCisgKiBpc2NzaV90cmFuc3BvcnRfZGVzdHJveV9zZXNzaW9uIC0gZGVzdHJveSBzZXNzaW9uIGFuZCBzY3NpIGhvc3QKKyAqIHNob3N0OiBzY3NpIGhvc3QKKyAqCisgKiBUaGlzIGNhbiBiZSB1c2VkIGJ5IHNvZnR3YXJlIGlzY3NpX3RyYW5zcG9ydHMgdGhhdCBhbGxvY2F0ZQorICogYSBzZXNzaW9uIHBlciBzY3NpIGhvc3QuCisgKiovCitpbnQgaXNjc2lfdHJhbnNwb3J0X2Rlc3Ryb3lfc2Vzc2lvbihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3Npb247CisKKwlzY3NpX3JlbW92ZV9ob3N0KHNob3N0KTsKKwlzZXNzaW9uID0gaG9zdGRhdGFfc2Vzc2lvbihzaG9zdC0+aG9zdGRhdGEpOworCWlzY3NpX2Rlc3Ryb3lfc2Vzc2lvbihzZXNzaW9uKTsKKwkvKiByZWYgZnJvbSBob3N0IGFsbG9jICovCisJc2NzaV9ob3N0X3B1dChzaG9zdCk7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX3RyYW5zcG9ydF9kZXN0cm95X3Nlc3Npb24pOworCisvKgorICogaXNjc2kgaW50ZXJmYWNlIGZ1bmN0aW9ucworICovCitzdGF0aWMgc3RydWN0IGlzY3NpX2Nsc19jb25uKgogaXNjc2lfaWZfZmluZF9jb25uKHVpbnQ2NF90IGtleSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpc2NzaV9pZl9jb25uICpjb25uOworCXN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY29ubjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjb25ubG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubiwgJmNvbm5saXN0LCBjb25uX2xpc3QpCkBAIC0yNDksNyArNDYzLDcgQEAKIH0KIAogc3RhdGljIHZvaWQqCi1tZW1wb29sX3pvbmVfYWxsb2Nfc2tiKGdmcF90IGdmcF9tYXNrLCB2b2lkICpwb29sX2RhdGEpCittZW1wb29sX3pvbmVfYWxsb2Nfc2tiKHVuc2lnbmVkIGludCBnZnBfbWFzaywgdm9pZCAqcG9vbF9kYXRhKQogewogCXN0cnVjdCBtZW1wb29sX3pvbmUgKnpvbmUgPSBwb29sX2RhdGE7CiAKQEAgLTI4MSwxNCArNDk1LDIxIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmem9uZS0+ZnJlZWxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGludAotbWVtcG9vbF96b25lX2luaXQoc3RydWN0IG1lbXBvb2xfem9uZSAqenAsIHVuc2lnbmVkIG1heCwgdW5zaWduZWQgc2l6ZSwKLQkJdW5zaWduZWQgaGl3YXQpCitzdGF0aWMgc3RydWN0IG1lbXBvb2xfem9uZSAqCittZW1wb29sX3pvbmVfaW5pdCh1bnNpZ25lZCBtYXgsIHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIGhpd2F0KQogeworCXN0cnVjdCBtZW1wb29sX3pvbmUgKnpwOworCisJenAgPSBremFsbG9jKHNpemVvZigqenApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXpwKQorCQlyZXR1cm4gTlVMTDsKKwogCXpwLT5wb29sID0gbWVtcG9vbF9jcmVhdGUobWF4LCBtZW1wb29sX3pvbmVfYWxsb2Nfc2tiLAogCQkJCSAgbWVtcG9vbF96b25lX2ZyZWVfc2tiLCB6cCk7Ci0JaWYgKCF6cC0+cG9vbCkKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCF6cC0+cG9vbCkgeworCQlrZnJlZSh6cCk7CisJCXJldHVybiBOVUxMOworCX0KIAogCXpwLT5zaXplID0gc2l6ZTsKIAl6cC0+aGl3YXQgPSBoaXdhdDsKQEAgLTI5Nyw5ICs1MTgsMTQgQEAKIAlzcGluX2xvY2tfaW5pdCgmenAtPmZyZWVsb2NrKTsKIAlhdG9taWNfc2V0KCZ6cC0+YWxsb2NhdGVkLCAwKTsKIAotCXJldHVybiAwOworCXJldHVybiB6cDsKIH0KIAorc3RhdGljIHZvaWQgbWVtcG9vbF96b25lX2Rlc3Ryb3koc3RydWN0IG1lbXBvb2xfem9uZSAqenApCit7CisJbWVtcG9vbF9kZXN0cm95KHpwLT5wb29sKTsKKwlrZnJlZSh6cCk7Cit9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZioKIG1lbXBvb2xfem9uZV9nZXRfc2tiKHN0cnVjdCBtZW1wb29sX3pvbmUgKnpvbmUpCkBAIC0zMzksNyArNTY1LDcgQEAKIAlzdHJ1Y3Qgbmxtc2doZHIJKm5saDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpc2NzaV91ZXZlbnQgKmV2OwotCXN0cnVjdCBpc2NzaV9pZl9jb25uICpjb25uOworCXN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY29ubjsKIAljaGFyICpwZHU7CiAJaW50IGxlbiA9IE5MTVNHX1NQQUNFKHNpemVvZigqZXYpICsgc2l6ZW9mKHN0cnVjdCBpc2NzaV9oZHIpICsKIAkJCSAgICAgIGRhdGFfc2l6ZSk7CkBAIC0zNDcsMTMgKzU3MywxMyBAQAogCWNvbm4gPSBpc2NzaV9pZl9maW5kX2Nvbm4oY29ubmgpOwogCUJVR19PTighY29ubik7CiAKLQltZW1wb29sX3pvbmVfY29tcGxldGUoJmNvbm4tPnpfcGR1KTsKKwltZW1wb29sX3pvbmVfY29tcGxldGUoY29ubi0+el9wZHUpOwogCi0Jc2tiID0gbWVtcG9vbF96b25lX2dldF9za2IoJmNvbm4tPnpfcGR1KTsKKwlza2IgPSBtZW1wb29sX3pvbmVfZ2V0X3NrYihjb25uLT56X3BkdSk7CiAJaWYgKCFza2IpIHsKIAkJaXNjc2lfY29ubl9lcnJvcihjb25uaCwgSVNDU0lfRVJSX0NPTk5fRkFJTEVEKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJpc2NzaSVkOiBjYW4gbm90IGRlbGl2ZXIgY29udHJvbCBQRFU6IE9PTVxuIiwKLQkJICAgICAgIGNvbm4tPmhvc3QtPmhvc3Rfbm8pOworCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmY29ubi0+ZGV2LCAiaXNjc2k6IGNhbiBub3QgZGVsaXZlciAiCisJCQkgICAiY29udHJvbCBQRFU6IE9PTVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMzYyLDE0ICs1ODgsMTQgQEAKIAltZW1zZXQoZXYsIDAsIHNpemVvZigqZXYpKTsKIAlldi0+dHJhbnNwb3J0X2hhbmRsZSA9IGlzY3NpX2hhbmRsZShjb25uLT50cmFuc3BvcnQpOwogCWV2LT50eXBlID0gSVNDU0lfS0VWRU5UX1JFQ1ZfUERVOwotCWlmIChhdG9taWNfcmVhZCgmY29ubi0+el9wZHUuYWxsb2NhdGVkKSA+PSBjb25uLT56X3BkdS5oaXdhdCkKKwlpZiAoYXRvbWljX3JlYWQoJmNvbm4tPnpfcGR1LT5hbGxvY2F0ZWQpID49IGNvbm4tPnpfcGR1LT5oaXdhdCkKIAkJZXYtPmlmZXJyb3IgPSAtRU5PTUVNOwogCWV2LT5yLnJlY3ZfcmVxLmNvbm5faGFuZGxlID0gY29ubmg7CiAJcGR1ID0gKGNoYXIqKWV2ICsgc2l6ZW9mKCpldik7CiAJbWVtY3B5KHBkdSwgaGRyLCBzaXplb2Yoc3RydWN0IGlzY3NpX2hkcikpOwogCW1lbWNweShwZHUgKyBzaXplb2Yoc3RydWN0IGlzY3NpX2hkciksIGRhdGEsIGRhdGFfc2l6ZSk7CiAKLQlyZXR1cm4gaXNjc2lfdW5pY2FzdF9za2IoJmNvbm4tPnpfcGR1LCBza2IpOworCXJldHVybiBpc2NzaV91bmljYXN0X3NrYihjb25uLT56X3BkdSwgc2tiKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX3JlY3ZfcGR1KTsKIApAQCAtMzc4LDE4ICs2MDQsMTggQEAKIAlzdHJ1Y3Qgbmxtc2doZHIJKm5saDsKIAlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOwogCXN0cnVjdCBpc2NzaV91ZXZlbnQgKmV2OwotCXN0cnVjdCBpc2NzaV9pZl9jb25uICpjb25uOworCXN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY29ubjsKIAlpbnQgbGVuID0gTkxNU0dfU1BBQ0Uoc2l6ZW9mKCpldikpOwogCiAJY29ubiA9IGlzY3NpX2lmX2ZpbmRfY29ubihjb25uaCk7CiAJQlVHX09OKCFjb25uKTsKIAotCW1lbXBvb2xfem9uZV9jb21wbGV0ZSgmY29ubi0+el9lcnJvcik7CisJbWVtcG9vbF96b25lX2NvbXBsZXRlKGNvbm4tPnpfZXJyb3IpOwogCi0Jc2tiID0gbWVtcG9vbF96b25lX2dldF9za2IoJmNvbm4tPnpfZXJyb3IpOworCXNrYiA9IG1lbXBvb2xfem9uZV9nZXRfc2tiKGNvbm4tPnpfZXJyb3IpOwogCWlmICghc2tiKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaXNjc2klZDogZ3JhY2VmdWxseSBpZ25vcmVkIGNvbm4gZXJyb3IgKCVkKVxuIiwKLQkJICAgICAgIGNvbm4tPmhvc3QtPmhvc3Rfbm8sIGVycm9yKTsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmNvbm4tPmRldiwgImlzY3NpOiBncmFjZWZ1bGx5IGlnbm9yZWQgIgorCQkJICAiY29ubiBlcnJvciAoJWQpXG4iLCBlcnJvcik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTM5NywxNSArNjIzLDE1IEBACiAJZXYgPSBOTE1TR19EQVRBKG5saCk7CiAJZXYtPnRyYW5zcG9ydF9oYW5kbGUgPSBpc2NzaV9oYW5kbGUoY29ubi0+dHJhbnNwb3J0KTsKIAlldi0+dHlwZSA9IElTQ1NJX0tFVkVOVF9DT05OX0VSUk9SOwotCWlmIChhdG9taWNfcmVhZCgmY29ubi0+el9lcnJvci5hbGxvY2F0ZWQpID49IGNvbm4tPnpfZXJyb3IuaGl3YXQpCisJaWYgKGF0b21pY19yZWFkKCZjb25uLT56X2Vycm9yLT5hbGxvY2F0ZWQpID49IGNvbm4tPnpfZXJyb3ItPmhpd2F0KQogCQlldi0+aWZlcnJvciA9IC1FTk9NRU07CiAJZXYtPnIuY29ubmVycm9yLmVycm9yID0gZXJyb3I7CiAJZXYtPnIuY29ubmVycm9yLmNvbm5faGFuZGxlID0gY29ubmg7CiAKLQlpc2NzaV91bmljYXN0X3NrYigmY29ubi0+el9lcnJvciwgc2tiKTsKKwlpc2NzaV91bmljYXN0X3NrYihjb25uLT56X2Vycm9yLCBza2IpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiaXNjc2klZDogZGV0ZWN0ZWQgY29ubiBlcnJvciAoJWQpXG4iLAotCSAgICAgICBjb25uLT5ob3N0LT5ob3N0X25vLCBlcnJvcik7CisJZGV2X3ByaW50ayhLRVJOX0lORk8sICZjb25uLT5kZXYsICJpc2NzaTogZGV0ZWN0ZWQgY29ubiBlcnJvciAoJWQpXG4iLAorCQkgICBlcnJvcik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9jb25uX2Vycm9yKTsKIApAQCAtNDE5LDkgKzY0NSw5IEBACiAJaW50IGZsYWdzID0gbXVsdGkgPyBOTE1fRl9NVUxUSSA6IDA7CiAJaW50IHQgPSBkb25lID8gTkxNU0dfRE9ORSA6IHR5cGU7CiAKLQltZW1wb29sX3pvbmVfY29tcGxldGUoJnpfcmVwbHkpOworCW1lbXBvb2xfem9uZV9jb21wbGV0ZSh6X3JlcGx5KTsKIAotCXNrYiA9IG1lbXBvb2xfem9uZV9nZXRfc2tiKCZ6X3JlcGx5KTsKKwlza2IgPSBtZW1wb29sX3pvbmVfZ2V0X3NrYih6X3JlcGx5KTsKIAkvKgogCSAqIEZJWE1FOgogCSAqIHVzZXIgaXMgc3VwcG9zZWQgdG8gcmVhY3Qgb24gaWZlcnJvciA9PSAtRU5PTUVNOwpAQCAtNDMyLDMwNCArNjU4LDcgQEAKIAlubGggPSBfX25sbXNnX3B1dChza2IsIHBpZCwgc2VxLCB0LCAobGVuIC0gc2l6ZW9mKCpubGgpKSwgMCk7CiAJbmxoLT5ubG1zZ19mbGFncyA9IGZsYWdzOwogCW1lbWNweShOTE1TR19EQVRBKG5saCksIHBheWxvYWQsIHNpemUpOwotCXJldHVybiBpc2NzaV91bmljYXN0X3NrYigmel9yZXBseSwgc2tiKTsKLX0KLQotLyoKLSAqIGlTQ1NJIFNlc3Npb24ncyBob3N0ZGF0YSBvcmdhbml6YXRpb246Ci0gKgotICogICAgKi0tLS0tLS0tLS0tLS0tLS0tLSogPD09IGhvc3QtPmhvc3RkYXRhCi0gKiAgICB8IHRyYW5zcG9ydCAgICAgICAgfAotICogICAgfC0tLS0tLS0tLS0tLS0tLS0tLXwgPD09IGlzY3NpX2hvc3RkYXRhKGhvc3QtPmhvc3RkYXRhKQotICogICAgfCB0cmFuc3BvcnQncyBkYXRhIHwKLSAqICAgIHwtLS0tLS0tLS0tLS0tLS0tLS18IDw9PSBob3N0ZGF0YV9zZXNzaW9uKGhvc3QtPmhvc3RkYXRhKQotICogICAgfCBpbnRlcmZhY2UncyBkYXRhIHwKLSAqICAgICotLS0tLS0tLS0tLS0tLS0tLS0qCi0gKi8KLQotI2RlZmluZSBob3N0ZGF0YV9wcml2c2l6ZShfdCkJKHNpemVvZih1bnNpZ25lZCBsb25nKSArIF90LT5ob3N0ZGF0YV9zaXplICsgXAotCQkJCSBfdC0+aG9zdGRhdGFfc2l6ZSAlIHNpemVvZih1bnNpZ25lZCBsb25nKSArIFwKLQkJCQkgc2l6ZW9mKHN0cnVjdCBpc2NzaV9pZl9zZXNzaW9uKSkKLQotI2RlZmluZSBob3N0ZGF0YV9zZXNzaW9uKF9ob3N0ZGF0YSkgKCh2b2lkKilfaG9zdGRhdGEgKyBzaXplb2YodW5zaWduZWQgbG9uZykgKyBcCi0JCQkoKHN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKikgXAotCQkJIGlzY3NpX3B0cigqKHVpbnQ2NF90ICopX2hvc3RkYXRhKSktPmhvc3RkYXRhX3NpemUpCi0KLXN0YXRpYyB2b2lkIGlzY3NpX2lmX3Nlc3Npb25fZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBpc2NzaV9pZl9zZXNzaW9uICpzZXNzaW9uID0gaXNjc2lfZGV2X3RvX2lmX3Nlc3Npb24oZGV2KTsKLQlzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBzZXNzaW9uLT50cmFuc3BvcnQ7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBpc2NzaV9pZl9zZXNzaW9uX3RvX3Nob3N0KHNlc3Npb24pOwotCXN0cnVjdCBpc2NzaV9pZl9jb25uICpjb25uLCAqdG1wOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBub3cgZnJlZSBjb25uZWN0aW9ucyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZjb25ubG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjb25uLCB0bXAsICZzZXNzaW9uLT5jb25uZWN0aW9ucywKLQkJCQkgc2Vzc2lvbl9saXN0KSB7Ci0JCWxpc3RfZGVsKCZjb25uLT5zZXNzaW9uX2xpc3QpOwotCQltZW1wb29sX2Rlc3Ryb3koY29ubi0+el9wZHUucG9vbCk7Ci0JCW1lbXBvb2xfZGVzdHJveShjb25uLT56X2Vycm9yLnBvb2wpOwotCQlrZnJlZShjb25uKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29ubmxvY2ssIGZsYWdzKTsKLQlzY3NpX2hvc3RfcHV0KHNob3N0KTsKLQltb2R1bGVfcHV0KHRyYW5zcG9ydC0+b3duZXIpOwotfQotCi1zdGF0aWMgaW50Ci1pc2NzaV9pZl9jcmVhdGVfc2Vzc2lvbihzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgKnByaXYsIHN0cnVjdCBpc2NzaV91ZXZlbnQgKmV2KQotewotCXN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnRyYW5zcG9ydCA9IHByaXYtPmlzY3NpX3RyYW5zcG9ydDsKLQlzdHJ1Y3QgaXNjc2lfaWZfc2Vzc2lvbiAqc2Vzc2lvbjsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlcnJvcjsKLQotCWlmICghdHJ5X21vZHVsZV9nZXQodHJhbnNwb3J0LT5vd25lcikpCi0JCXJldHVybiAtRVBFUk07Ci0KLQlzaG9zdCA9IHNjc2lfaG9zdF9hbGxvYyh0cmFuc3BvcnQtPmhvc3RfdGVtcGxhdGUsCi0JCQkJaG9zdGRhdGFfcHJpdnNpemUodHJhbnNwb3J0KSk7Ci0JaWYgKCFzaG9zdCkgewotCQlldi0+ci5jX3Nlc3Npb25fcmV0LnNlc3Npb25faGFuZGxlID0gaXNjc2lfaGFuZGxlKE5VTEwpOwotCQlwcmludGsoS0VSTl9FUlIgImlzY3NpOiBjYW4gbm90IGFsbG9jYXRlIFNDU0kgaG9zdCBmb3IgIgotCQkgICAgICAgInNlc3Npb25cbiIpOwotCQllcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X21vZHVsZV9wdXQ7Ci0JfQotCXNob3N0LT5tYXhfaWQgPSAxOwotCXNob3N0LT5tYXhfY2hhbm5lbCA9IDA7Ci0Jc2hvc3QtPm1heF9sdW4gPSB0cmFuc3BvcnQtPm1heF9sdW47Ci0Jc2hvc3QtPm1heF9jbWRfbGVuID0gdHJhbnNwb3J0LT5tYXhfY21kX2xlbjsKLQlzaG9zdC0+dHJhbnNwb3J0dCA9ICZwcml2LT50OwotCi0JLyogc3RvcmUgc3RydWN0IGlzY3NpX3RyYW5zcG9ydCBpbiBob3N0ZGF0YSAqLwotCSoodWludDY0X3QqKXNob3N0LT5ob3N0ZGF0YSA9IGV2LT50cmFuc3BvcnRfaGFuZGxlOwotCi0JZXYtPnIuY19zZXNzaW9uX3JldC5zZXNzaW9uX2hhbmRsZSA9IHRyYW5zcG9ydC0+Y3JlYXRlX3Nlc3Npb24oCi0JCQkJCWV2LT51LmNfc2Vzc2lvbi5pbml0aWFsX2NtZHNuLCBzaG9zdCk7Ci0JaWYgKGV2LT5yLmNfc2Vzc2lvbl9yZXQuc2Vzc2lvbl9oYW5kbGUgPT0gaXNjc2lfaGFuZGxlKE5VTEwpKSB7Ci0JCWVycm9yID0gMDsKLQkJZ290byBvdXRfaG9zdF9wdXQ7Ci0JfQotCi0JLyogaG9zdF9ubyBiZWNvbWVzIGFzc2lnbmVkIFNJRCAqLwotCWV2LT5yLmNfc2Vzc2lvbl9yZXQuc2lkID0gc2hvc3QtPmhvc3Rfbm87Ci0JLyogaW5pdGlhbGl6ZSBzZXNzaW9uICovCi0Jc2Vzc2lvbiA9IGhvc3RkYXRhX3Nlc3Npb24oc2hvc3QtPmhvc3RkYXRhKTsKLQlJTklUX0xJU1RfSEVBRCgmc2Vzc2lvbi0+Y29ubmVjdGlvbnMpOwotCUlOSVRfTElTVF9IRUFEKCZzZXNzaW9uLT5saXN0KTsKLQlzZXNzaW9uLT5zZXNzaW9uaCA9IGV2LT5yLmNfc2Vzc2lvbl9yZXQuc2Vzc2lvbl9oYW5kbGU7Ci0Jc2Vzc2lvbi0+dHJhbnNwb3J0ID0gdHJhbnNwb3J0OwotCi0JZXJyb3IgPSBzY3NpX2FkZF9ob3N0KHNob3N0LCBOVUxMKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0X2Rlc3Ryb3lfc2Vzc2lvbjsKLQotCS8qCi0JICogdGhpcyBpcyByZWxlYXNlZCBpbiB0aGUgZGV2J3MgcmVsZWFzZSBmdW5jdGlvbikKLQkgKi8KLQlzY3NpX2hvc3RfZ2V0KHNob3N0KTsKLQlzbnByaW50ZihzZXNzaW9uLT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgInNlc3Npb24ldSIsIHNob3N0LT5ob3N0X25vKTsKLQlzZXNzaW9uLT5kZXYucGFyZW50ID0gJnNob3N0LT5zaG9zdF9nZW5kZXY7Ci0Jc2Vzc2lvbi0+ZGV2LnJlbGVhc2UgPSBpc2NzaV9pZl9zZXNzaW9uX2Rldl9yZWxlYXNlOwotCWVycm9yID0gZGV2aWNlX3JlZ2lzdGVyKCZzZXNzaW9uLT5kZXYpOwotCWlmIChlcnJvcikgewotCQlwcmludGsoS0VSTl9FUlIgImlzY3NpOiBjb3VsZCBub3QgcmVnaXN0ZXIgc2Vzc2lvbiVkJ3MgZGV2XG4iLAotCQkgICAgICAgc2hvc3QtPmhvc3Rfbm8pOwotCQlnb3RvIG91dF9yZW1vdmVfaG9zdDsKLQl9Ci0JdHJhbnNwb3J0X3JlZ2lzdGVyX2RldmljZSgmc2Vzc2lvbi0+ZGV2KTsKLQotCS8qIGFkZCB0aGlzIHNlc3Npb24gdG8gdGhlIGxpc3Qgb2YgYWN0aXZlIHNlc3Npb25zICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNlc3Npb25fbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkKCZzZXNzaW9uLT5saXN0LCAmcHJpdi0+c2Vzc2lvbnMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNlc3Npb25fbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci0KLW91dF9yZW1vdmVfaG9zdDoKLQlzY3NpX3JlbW92ZV9ob3N0KHNob3N0KTsKLW91dF9kZXN0cm95X3Nlc3Npb246Ci0JdHJhbnNwb3J0LT5kZXN0cm95X3Nlc3Npb24oZXYtPnIuY19zZXNzaW9uX3JldC5zZXNzaW9uX2hhbmRsZSk7Ci0JZXYtPnIuY19zZXNzaW9uX3JldC5zZXNzaW9uX2hhbmRsZSA9IGlzY3NpX2hhbmRsZShOVUxMKTsKLW91dF9ob3N0X3B1dDoKLQlzY3NpX2hvc3RfcHV0KHNob3N0KTsKLW91dF9tb2R1bGVfcHV0OgotCW1vZHVsZV9wdXQodHJhbnNwb3J0LT5vd25lcik7Ci0JcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgaW50Ci1pc2NzaV9pZl9kZXN0cm95X3Nlc3Npb24oc3RydWN0IGlzY3NpX2ludGVybmFsICpwcml2LCBzdHJ1Y3QgaXNjc2lfdWV2ZW50ICpldikKLXsKLQlzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBwcml2LT5pc2NzaV90cmFuc3BvcnQ7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7Ci0Jc3RydWN0IGlzY3NpX2lmX3Nlc3Npb24gKnNlc3Npb247Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaXNjc2lfaWZfY29ubiAqY29ubjsKLQlpbnQgZXJyb3IgPSAwOwotCi0Jc2hvc3QgPSBzY3NpX2hvc3RfbG9va3VwKGV2LT51LmRfc2Vzc2lvbi5zaWQpOwotCWlmIChzaG9zdCA9PSBFUlJfUFRSKC1FTlhJTykpCi0JCXJldHVybiAtRUVYSVNUOwotCXNlc3Npb24gPSBob3N0ZGF0YV9zZXNzaW9uKHNob3N0LT5ob3N0ZGF0YSk7Ci0KLQkvKiBjaGVjayBpZiB3ZSBoYXZlIGFjdGl2ZSBjb25uZWN0aW9ucyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZjb25ubG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubiwgJnNlc3Npb24tPmNvbm5lY3Rpb25zLCBzZXNzaW9uX2xpc3QpIHsKLQkJaWYgKGNvbm4tPmFjdGl2ZSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJpc2NzaSVkOiBjYW4gbm90IGRlc3Ryb3kgc2Vzc2lvbjogIgotCQkJICAgICAgICJoYXMgYWN0aXZlIGNvbm5lY3Rpb24gKCVwKVxuIiwKLQkJCSAgICAgICBzaG9zdC0+aG9zdF9ubywgaXNjc2lfcHRyKGNvbm4tPmNvbm5oKSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25ubG9jaywgZmxhZ3MpOwotCQkJZXJyb3IgPSBFSU87Ci0JCQlnb3RvIG91dF9yZWxlYXNlX3JlZjsKLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25ubG9jaywgZmxhZ3MpOwotCi0Jc2NzaV9yZW1vdmVfaG9zdChzaG9zdCk7Ci0JdHJhbnNwb3J0LT5kZXN0cm95X3Nlc3Npb24oZXYtPnUuZF9zZXNzaW9uLnNlc3Npb25faGFuZGxlKTsKLQl0cmFuc3BvcnRfdW5yZWdpc3Rlcl9kZXZpY2UoJnNlc3Npb24tPmRldik7Ci0JZGV2aWNlX3VucmVnaXN0ZXIoJnNlc3Npb24tPmRldik7Ci0KLQkvKiByZW1vdmUgdGhpcyBzZXNzaW9uIGZyb20gdGhlIGxpc3Qgb2YgYWN0aXZlIHNlc3Npb25zICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNlc3Npb25fbG9jaywgZmxhZ3MpOwotCWxpc3RfZGVsKCZzZXNzaW9uLT5saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zZXNzaW9uX2xvY2ssIGZsYWdzKTsKLQotCS8qIHJlZiBmcm9tIGhvc3QgYWxsb2MgKi8KLQlzY3NpX2hvc3RfcHV0KHNob3N0KTsKLW91dF9yZWxlYXNlX3JlZjoKLQkvKiByZWYgZnJvbSBob3N0IGxvb2t1cCAqLwotCXNjc2lfaG9zdF9wdXQoc2hvc3QpOwotCXJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIHZvaWQgaXNjc2lfaWZfY29ubl9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGlzY3NpX2lmX2Nvbm4gKmNvbm4gPSBpc2NzaV9kZXZfdG9faWZfY29ubihkZXYpOwotCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY29ubi0+aG9zdDsKLQotCXNjc2lfaG9zdF9wdXQoc2hvc3QpOwotfQotCi1zdGF0aWMgaW50Ci1pc2NzaV9pZl9jcmVhdGVfY29ubihzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0cmFuc3BvcnQsIHN0cnVjdCBpc2NzaV91ZXZlbnQgKmV2KQotewotCXN0cnVjdCBpc2NzaV9pZl9zZXNzaW9uICpzZXNzaW9uOwotCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OwotCXN0cnVjdCBpc2NzaV9pZl9jb25uICpjb25uOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGVycm9yOwotCi0Jc2hvc3QgPSBzY3NpX2hvc3RfbG9va3VwKGV2LT51LmNfY29ubi5zaWQpOwotCWlmIChzaG9zdCA9PSBFUlJfUFRSKC1FTlhJTykpCi0JCXJldHVybiAtRUVYSVNUOwotCXNlc3Npb24gPSBob3N0ZGF0YV9zZXNzaW9uKHNob3N0LT5ob3N0ZGF0YSk7Ci0KLQljb25uID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlzY3NpX2lmX2Nvbm4pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNvbm4pIHsKLQkJZXJyb3IgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9yZWxlYXNlX3JlZjsKLQl9Ci0JbWVtc2V0KGNvbm4sIDAsIHNpemVvZihzdHJ1Y3QgaXNjc2lfaWZfY29ubikpOwotCUlOSVRfTElTVF9IRUFEKCZjb25uLT5zZXNzaW9uX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZjb25uLT5jb25uX2xpc3QpOwotCWNvbm4tPmhvc3QgPSBzaG9zdDsKLQljb25uLT50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7Ci0KLQllcnJvciA9IG1lbXBvb2xfem9uZV9pbml0KCZjb25uLT56X3BkdSwgWl9NQVhfUERVLAotCQkJTkxNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBpc2NzaV91ZXZlbnQpICsKLQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBpc2NzaV9oZHIpICsKLQkJCQkgICAgREVGQVVMVF9NQVhfUkVDVl9EQVRBX1NFR01FTlRfTEVOR1RIKSwKLQkJCVpfSElXQVRfUERVKTsKLQlpZiAoZXJyb3IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpc2NzaSVkOiBjYW4gbm90IGFsbG9jYXRlIHBkdSB6b25lIGZvciBuZXcgIgotCQkgICAgICAgImNvbm5cbiIsIHNob3N0LT5ob3N0X25vKTsKLQkJZ290byBvdXRfZnJlZV9jb25uOwotCX0KLQllcnJvciA9IG1lbXBvb2xfem9uZV9pbml0KCZjb25uLT56X2Vycm9yLCBaX01BWF9FUlJPUiwKLQkJCU5MTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgaXNjc2lfdWV2ZW50KSksCi0JCQlaX0hJV0FUX0VSUk9SKTsKLQlpZiAoZXJyb3IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpc2NzaSVkOiBjYW4gbm90IGFsbG9jYXRlIGVycm9yIHpvbmUgZm9yICIKLQkJICAgICAgICJuZXcgY29ublxuIiwgc2hvc3QtPmhvc3Rfbm8pOwotCQlnb3RvIG91dF9mcmVlX3BkdV9wb29sOwotCX0KLQotCWV2LT5yLmhhbmRsZSA9IHRyYW5zcG9ydC0+Y3JlYXRlX2Nvbm4oZXYtPnUuY19jb25uLnNlc3Npb25faGFuZGxlLAotCQkJCQlldi0+dS5jX2Nvbm4uY2lkKTsKLQlpZiAoIWV2LT5yLmhhbmRsZSkgewotCQllcnJvciA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X2ZyZWVfZXJyb3JfcG9vbDsKLQl9Ci0KLQljb25uLT5jb25uaCA9IGV2LT5yLmhhbmRsZTsKLQotCS8qCi0JICogdGhpcyBpcyByZWxlYXNlZCBpbiB0aGUgZGV2J3MgcmVsZWFzZSBmdW5jdGlvbgotCSAqLwotCWlmICghc2NzaV9ob3N0X2dldChzaG9zdCkpCi0JCWdvdG8gb3V0X2Rlc3Ryb3lfY29ubjsKLQlzbnByaW50Zihjb25uLT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgImNvbm5lY3Rpb24lZDoldSIsCi0JCSBzaG9zdC0+aG9zdF9ubywgZXYtPnUuY19jb25uLmNpZCk7Ci0JY29ubi0+ZGV2LnBhcmVudCA9ICZzZXNzaW9uLT5kZXY7Ci0JY29ubi0+ZGV2LnJlbGVhc2UgPSBpc2NzaV9pZl9jb25uX2Rldl9yZWxlYXNlOwotCWVycm9yID0gZGV2aWNlX3JlZ2lzdGVyKCZjb25uLT5kZXYpOwotCWlmIChlcnJvcikgewotCQlwcmludGsoS0VSTl9FUlIgImlzY3NpJWQ6IGNvdWxkIG5vdCByZWdpc3RlciBjb25uZWN0aW9ucyV1ICIKLQkJICAgICAgICJkZXZcbiIsIHNob3N0LT5ob3N0X25vLCBldi0+dS5jX2Nvbm4uY2lkKTsKLQkJZ290byBvdXRfcmVsZWFzZV9wYXJlbnRfcmVmOwotCX0KLQl0cmFuc3BvcnRfcmVnaXN0ZXJfZGV2aWNlKCZjb25uLT5kZXYpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNvbm5sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGQoJmNvbm4tPmNvbm5fbGlzdCwgJmNvbm5saXN0KTsKLQlsaXN0X2FkZCgmY29ubi0+c2Vzc2lvbl9saXN0LCAmc2Vzc2lvbi0+Y29ubmVjdGlvbnMpOwotCWNvbm4tPmFjdGl2ZSA9IDE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29ubmxvY2ssIGZsYWdzKTsKLQotCXNjc2lfaG9zdF9wdXQoc2hvc3QpOwotCXJldHVybiAwOwotCi1vdXRfcmVsZWFzZV9wYXJlbnRfcmVmOgotCXNjc2lfaG9zdF9wdXQoc2hvc3QpOwotb3V0X2Rlc3Ryb3lfY29ubjoKLQl0cmFuc3BvcnQtPmRlc3Ryb3lfY29ubihldi0+ci5oYW5kbGUpOwotb3V0X2ZyZWVfZXJyb3JfcG9vbDoKLQltZW1wb29sX2Rlc3Ryb3koY29ubi0+el9lcnJvci5wb29sKTsKLW91dF9mcmVlX3BkdV9wb29sOgotCW1lbXBvb2xfZGVzdHJveShjb25uLT56X3BkdS5wb29sKTsKLW91dF9mcmVlX2Nvbm46Ci0Ja2ZyZWUoY29ubik7Ci1vdXRfcmVsZWFzZV9yZWY6Ci0Jc2NzaV9ob3N0X3B1dChzaG9zdCk7Ci0JcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgaW50Ci1pc2NzaV9pZl9kZXN0cm95X2Nvbm4oc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHJhbnNwb3J0LCBzdHJ1Y3QgaXNjc2lfdWV2ZW50ICpldikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpc2NzaV9pZl9jb25uICpjb25uOwotCi0JY29ubiA9IGlzY3NpX2lmX2ZpbmRfY29ubihldi0+dS5kX2Nvbm4uY29ubl9oYW5kbGUpOwotCWlmICghY29ubikKLQkJcmV0dXJuIC1FRVhJU1Q7Ci0KLQl0cmFuc3BvcnQtPmRlc3Ryb3lfY29ubihldi0+dS5kX2Nvbm4uY29ubl9oYW5kbGUpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNvbm5sb2NrLCBmbGFncyk7Ci0JY29ubi0+YWN0aXZlID0gMDsKLQlsaXN0X2RlbCgmY29ubi0+Y29ubl9saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25ubG9jaywgZmxhZ3MpOwotCi0JdHJhbnNwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKCZjb25uLT5kZXYpOwotCWRldmljZV91bnJlZ2lzdGVyKCZjb25uLT5kZXYpOwotCXJldHVybiAwOworCXJldHVybiBpc2NzaV91bmljYXN0X3NrYih6X3JlcGx5LCBza2IpOwogfQogCiBzdGF0aWMgaW50CkBAIC03MzksNyArNjY4LDcgQEAKIAlzdHJ1Y3QgaXNjc2lfdWV2ZW50ICpldiA9IE5MTVNHX0RBVEEobmxoKTsKIAlzdHJ1Y3QgaXNjc2lfc3RhdHMgKnN0YXRzOwogCXN0cnVjdCBza19idWZmICpza2JzdGF0OwotCXN0cnVjdCBpc2NzaV9pZl9jb25uICpjb25uOworCXN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY29ubjsKIAlzdHJ1Y3Qgbmxtc2doZHIJKm5saHN0YXQ7CiAJc3RydWN0IGlzY3NpX3VldmVudCAqZXZzdGF0OwogCWludCBsZW4gPSBOTE1TR19TUEFDRShzaXplb2YoKmV2KSArCkBAIC03NTUsMTIgKzY4NCwxMiBAQAogCWRvIHsKIAkJaW50IGFjdHVhbF9zaXplOwogCi0JCW1lbXBvb2xfem9uZV9jb21wbGV0ZSgmY29ubi0+el9wZHUpOworCQltZW1wb29sX3pvbmVfY29tcGxldGUoY29ubi0+el9wZHUpOwogCi0JCXNrYnN0YXQgPSBtZW1wb29sX3pvbmVfZ2V0X3NrYigmY29ubi0+el9wZHUpOworCQlza2JzdGF0ID0gbWVtcG9vbF96b25lX2dldF9za2IoY29ubi0+el9wZHUpOwogCQlpZiAoIXNrYnN0YXQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiaXNjc2klZDogY2FuIG5vdCBkZWxpdmVyIHN0YXRzOiBPT01cbiIsCi0JCQkgICAgICAgY29ubi0+aG9zdC0+aG9zdF9ubyk7CisJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmY29ubi0+ZGV2LCAiaXNjc2k6IGNhbiBub3QgIgorCQkJCSAgICJkZWxpdmVyIHN0YXRzOiBPT01cbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIApAQCAtNzcwLDcgKzY5OSw3IEBACiAJCW1lbXNldChldnN0YXQsIDAsIHNpemVvZigqZXZzdGF0KSk7CiAJCWV2c3RhdC0+dHJhbnNwb3J0X2hhbmRsZSA9IGlzY3NpX2hhbmRsZShjb25uLT50cmFuc3BvcnQpOwogCQlldnN0YXQtPnR5cGUgPSBubGgtPm5sbXNnX3R5cGU7Ci0JCWlmIChhdG9taWNfcmVhZCgmY29ubi0+el9wZHUuYWxsb2NhdGVkKSA+PSBjb25uLT56X3BkdS5oaXdhdCkKKwkJaWYgKGF0b21pY19yZWFkKCZjb25uLT56X3BkdS0+YWxsb2NhdGVkKSA+PSBjb25uLT56X3BkdS0+aGl3YXQpCiAJCQlldnN0YXQtPmlmZXJyb3IgPSAtRU5PTUVNOwogCQlldnN0YXQtPnUuZ2V0X3N0YXRzLmNvbm5faGFuZGxlID0KIAkJCWV2LT51LmdldF9zdGF0cy5jb25uX2hhbmRsZTsKQEAgLTc4OCwxMyArNzE3LDE0MSBAQAogCQlza2JfdHJpbShza2IsIE5MTVNHX0FMSUdOKGFjdHVhbF9zaXplKSk7CiAJCW5saHN0YXQtPm5sbXNnX2xlbiA9IGFjdHVhbF9zaXplOwogCi0JCWVyciA9IGlzY3NpX3VuaWNhc3Rfc2tiKCZjb25uLT56X3BkdSwgc2tic3RhdCk7CisJCWVyciA9IGlzY3NpX3VuaWNhc3Rfc2tiKGNvbm4tPnpfcGR1LCBza2JzdGF0KTsKIAl9IHdoaWxlIChlcnIgPCAwICYmIGVyciAhPSAtRUNPTk5SRUZVU0VEKTsKIAogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQKK2lzY3NpX2lmX2NyZWF0ZV9zZXNzaW9uKHN0cnVjdCBpc2NzaV9pbnRlcm5hbCAqcHJpdiwgc3RydWN0IGlzY3NpX3VldmVudCAqZXYpCit7CisJc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHJhbnNwb3J0ID0gcHJpdi0+aXNjc2lfdHJhbnNwb3J0OworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCisJaWYgKCF0cmFuc3BvcnQtPmNyZWF0ZV9zZXNzaW9uKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNob3N0ID0gdHJhbnNwb3J0LT5jcmVhdGVfc2Vzc2lvbigmcHJpdi0+dCwKKwkJCQkJICBldi0+dS5jX3Nlc3Npb24uaW5pdGlhbF9jbWRzbik7CisJaWYgKCFzaG9zdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlldi0+ci5jX3Nlc3Npb25fcmV0LnNlc3Npb25faGFuZGxlID0gaXNjc2lfaGFuZGxlKGlzY3NpX2hvc3RkYXRhKHNob3N0LT5ob3N0ZGF0YSkpOworCWV2LT5yLmNfc2Vzc2lvbl9yZXQuc2lkID0gc2hvc3QtPmhvc3Rfbm87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lzY3NpX2lmX2Rlc3Ryb3lfc2Vzc2lvbihzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgKnByaXYsIHN0cnVjdCBpc2NzaV91ZXZlbnQgKmV2KQoreworCXN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnRyYW5zcG9ydCA9IHByaXYtPmlzY3NpX3RyYW5zcG9ydDsKKworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCisJaWYgKCF0cmFuc3BvcnQtPmRlc3Ryb3lfc2Vzc2lvbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzaG9zdCA9IHNjc2lfaG9zdF9sb29rdXAoZXYtPnUuZF9zZXNzaW9uLnNpZCk7CisJaWYgKHNob3N0ID09IEVSUl9QVFIoLUVOWElPKSkKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwlpZiAodHJhbnNwb3J0LT5kZXN0cm95X3Nlc3Npb24pCisJCXRyYW5zcG9ydC0+ZGVzdHJveV9zZXNzaW9uKHNob3N0KTsKKyAgICAgICAgLyogcmVmIGZyb20gaG9zdCBsb29rdXAgKi8KKyAgICAgICAgc2NzaV9ob3N0X3B1dChzaG9zdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lzY3NpX2lmX2NyZWF0ZV9jb25uKHN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnRyYW5zcG9ydCwgc3RydWN0IGlzY3NpX3VldmVudCAqZXYpeworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCXN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY29ubjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCF0cmFuc3BvcnQtPmNyZWF0ZV9jb25uKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNob3N0ID0gc2NzaV9ob3N0X2xvb2t1cChldi0+dS5jX2Nvbm4uc2lkKTsKKwlpZiAoc2hvc3QgPT0gRVJSX1BUUigtRU5YSU8pKQorCQlyZXR1cm4gLUVFWElTVDsKKworCWNvbm4gPSB0cmFuc3BvcnQtPmNyZWF0ZV9jb25uKHNob3N0LCBldi0+dS5jX2Nvbm4uY2lkKTsKKwlpZiAoIWNvbm4pCisJCWdvdG8gcmVsZWFzZV9yZWY7CisKKwljb25uLT56X3BkdSA9IG1lbXBvb2xfem9uZV9pbml0KFpfTUFYX1BEVSwKKwkJCU5MTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgaXNjc2lfdWV2ZW50KSArCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgaXNjc2lfaGRyKSArCisJCQkJICAgIERFRkFVTFRfTUFYX1JFQ1ZfREFUQV9TRUdNRU5UX0xFTkdUSCksCisJCQlaX0hJV0FUX1BEVSk7CisJaWYgKCFjb25uLT56X3BkdSkgeworCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmY29ubi0+ZGV2LCAiaXNjc2k6IGNhbiBub3QgYWxsb2NhdGUgIgorCQkJICAgInBkdSB6b25lIGZvciBuZXcgY29ublxuIik7CisJCWdvdG8gZGVzdHJveV9jb25uOworCX0KKworCWNvbm4tPnpfZXJyb3IgPSBtZW1wb29sX3pvbmVfaW5pdChaX01BWF9FUlJPUiwKKwkJCU5MTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgaXNjc2lfdWV2ZW50KSksCisJCQlaX0hJV0FUX0VSUk9SKTsKKwlpZiAoIWNvbm4tPnpfZXJyb3IpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmNvbm4tPmRldiwgImlzY3NpOiBjYW4gbm90IGFsbG9jYXRlICIKKwkJCSAgICJlcnJvciB6b25lIGZvciBuZXcgY29ublxuIik7CisJCWdvdG8gZnJlZV9wZHVfcG9vbDsKKwl9CisKKwlldi0+ci5oYW5kbGUgPSBjb25uLT5jb25uaCA9IGlzY3NpX2hhbmRsZShjb25uLT5kZF9kYXRhKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb25ubG9jaywgZmxhZ3MpOworCWxpc3RfYWRkKCZjb25uLT5jb25uX2xpc3QsICZjb25ubGlzdCk7CisJY29ubi0+YWN0aXZlID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25ubG9jaywgZmxhZ3MpOworCisJc2NzaV9ob3N0X3B1dChzaG9zdCk7CisJcmV0dXJuIDA7CisKK2ZyZWVfcGR1X3Bvb2w6CisJbWVtcG9vbF96b25lX2Rlc3Ryb3koY29ubi0+el9wZHUpOworZGVzdHJveV9jb25uOgorCWlmICh0cmFuc3BvcnQtPmRlc3Ryb3lfY29ubikKKwkJdHJhbnNwb3J0LT5kZXN0cm95X2Nvbm4oY29ubi0+ZGRfZGF0YSk7CityZWxlYXNlX3JlZjoKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIGludAoraXNjc2lfaWZfZGVzdHJveV9jb25uKHN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnRyYW5zcG9ydCwgc3RydWN0IGlzY3NpX3VldmVudCAqZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNvbm47CisJc3RydWN0IG1lbXBvb2xfem9uZSAqel9lcnJvciwgKnpfcGR1OworCisJY29ubiA9IGlzY3NpX2lmX2ZpbmRfY29ubihldi0+dS5kX2Nvbm4uY29ubl9oYW5kbGUpOworCWlmICghY29ubikKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwlpZiAoIXRyYW5zcG9ydC0+ZGVzdHJveV9jb25uKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb25ubG9jaywgZmxhZ3MpOworCWNvbm4tPmFjdGl2ZSA9IDA7CisJbGlzdF9kZWwoJmNvbm4tPmNvbm5fbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29ubmxvY2ssIGZsYWdzKTsKKworCXpfcGR1ID0gY29ubi0+el9wZHU7CisJel9lcnJvciA9IGNvbm4tPnpfZXJyb3I7CisKKwlpZiAodHJhbnNwb3J0LT5kZXN0cm95X2Nvbm4pCisJCXRyYW5zcG9ydC0+ZGVzdHJveV9jb25uKGNvbm4pOworCisJbWVtcG9vbF96b25lX2Rlc3Ryb3koel9wZHUpOworCW1lbXBvb2xfem9uZV9kZXN0cm95KHpfZXJyb3IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKIGlzY3NpX2lmX3JlY3ZfbXNnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoKQogewogCWludCBlcnIgPSAwOwpAQCAtODgxLDcgKzkzOCw3IEBACiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAotCWRvd24oJnJ4X3F1ZXVlX3NlbWEpOworCW11dGV4X2xvY2soJnJ4X3F1ZXVlX211dGV4KTsKIAl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpICE9IE5VTEwpIHsKIAkJd2hpbGUgKHNrYi0+bGVuID49IE5MTVNHX1NQQUNFKDApKSB7CiAJCQlpbnQgZXJyOwpAQCAtOTE1LDE3ICs5NzIsMjAgQEAKIAkJCQllcnIgPSBpc2NzaV9pZl9zZW5kX3JlcGx5KAogCQkJCQlORVRMSU5LX0NSRURTKHNrYiktPnBpZCwgbmxoLT5ubG1zZ19zZXEsCiAJCQkJCW5saC0+bmxtc2dfdHlwZSwgMCwgMCwgZXYsIHNpemVvZigqZXYpKTsKLQkJCQlpZiAoYXRvbWljX3JlYWQoJnpfcmVwbHkuYWxsb2NhdGVkKSA+PQotCQkJCQkJel9yZXBseS5oaXdhdCkKKwkJCQlpZiAoYXRvbWljX3JlYWQoJnpfcmVwbHktPmFsbG9jYXRlZCkgPj0KKwkJCQkJCXpfcmVwbHktPmhpd2F0KQogCQkJCQlldi0+aWZlcnJvciA9IC1FTk9NRU07CiAJCQl9IHdoaWxlIChlcnIgPCAwICYmIGVyciAhPSAtRUNPTk5SRUZVU0VEKTsKIAkJCXNrYl9wdWxsKHNrYiwgcmxlbik7CiAJCX0KIAkJa2ZyZWVfc2tiKHNrYik7CiAJfQotCXVwKCZyeF9xdWV1ZV9zZW1hKTsKKwltdXRleF91bmxvY2soJnJ4X3F1ZXVlX211dGV4KTsKIH0KIAorI2RlZmluZSBpc2NzaV9jZGV2X3RvX2Nvbm4oX2NkZXYpIFwKKwlpc2NzaV9kZXZfdG9fY29ubihfY2Rldi0+ZGV2KQorCiAvKgogICogaVNDU0kgY29ubmVjdGlvbiBhdHRycwogICovCkBAIC05MzQsMTIgKzk5NCwxMCBAQAogc2hvd19jb25uX2ludF9wYXJhbV8jI3BhcmFtKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikJXAogewkJCQkJCQkJCVwKIAl1aW50MzJfdCB2YWx1ZSA9IDA7CQkJCQkJXAotCXN0cnVjdCBpc2NzaV9pZl9jb25uICpjb25uID0gaXNjc2lfY2Rldl90b19pZl9jb25uKGNkZXYpOwlcCi0Jc3RydWN0IGlzY3NpX2ludGVybmFsICpwcml2OwkJCQkJXAorCXN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY29ubiA9IGlzY3NpX2NkZXZfdG9fY29ubihjZGV2KTsJCVwKKwlzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0ID0gY29ubi0+dHJhbnNwb3J0OwkJCVwKIAkJCQkJCQkJCVwKLQlwcml2ID0gdG9faXNjc2lfaW50ZXJuYWwoY29ubi0+aG9zdC0+dHJhbnNwb3J0dCk7CQlcCi0JaWYgKHByaXYtPnBhcmFtX21hc2sgJiAoMSA8PCBwYXJhbSkpCQkJCVwKLQkJcHJpdi0+aXNjc2lfdHJhbnNwb3J0LT5nZXRfcGFyYW0oY29ubi0+Y29ubmgsIHBhcmFtLCAmdmFsdWUpOyBcCisJdC0+Z2V0X2Nvbm5fcGFyYW0oY29ubi0+ZGRfZGF0YSwgcGFyYW0sICZ2YWx1ZSk7CQlcCiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMjAsIGZvcm1hdCJcbiIsIHZhbHVlKTsJCQlcCiB9CiAKQEAgLTk1NCw2ICsxMDEyLDkgQEAKIGlzY3NpX2Nvbm5faW50X2F0dHIoaWZtYXJrZXIsIElTQ1NJX1BBUkFNX0lGTUFSS0VSX0VOLCAiJWQiKTsKIGlzY3NpX2Nvbm5faW50X2F0dHIob2ZtYXJrZXIsIElTQ1NJX1BBUkFNX09GTUFSS0VSX0VOLCAiJWQiKTsKIAorI2RlZmluZSBpc2NzaV9jZGV2X3RvX3Nlc3Npb24oX2NkZXYpIFwKKwlpc2NzaV9kZXZfdG9fc2Vzc2lvbihfY2Rldi0+ZGV2KQorCiAvKgogICogaVNDU0kgc2Vzc2lvbiBhdHRycwogICovCkBAIC05NjIsMjAgKzEwMjMsMTEgQEAKIHNob3dfc2Vzc2lvbl9pbnRfcGFyYW1fIyNwYXJhbShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCVwKIHsJCQkJCQkJCQlcCiAJdWludDMyX3QgdmFsdWUgPSAwOwkJCQkJCVwKLQlzdHJ1Y3QgaXNjc2lfaWZfc2Vzc2lvbiAqc2Vzc2lvbiA9IGlzY3NpX2NkZXZfdG9faWZfc2Vzc2lvbihjZGV2KTsgXAotCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gaXNjc2lfaWZfc2Vzc2lvbl90b19zaG9zdChzZXNzaW9uKTsJXAotCXN0cnVjdCBpc2NzaV9pbnRlcm5hbCAqcHJpdiA9IHRvX2lzY3NpX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsgXAotCXN0cnVjdCBpc2NzaV9pZl9jb25uICpjb25uID0gTlVMTDsJCQkJXAotCXVuc2lnbmVkIGxvbmcgIGZsYWdzOwkJCQkJCVwKKwlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3Npb24gPSBpc2NzaV9jZGV2X3RvX3Nlc3Npb24oY2Rldik7CVwKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGlzY3NpX3Nlc3Npb25fdG9fc2hvc3Qoc2Vzc2lvbik7CVwKKwlzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0ID0gc2Vzc2lvbi0+dHJhbnNwb3J0OwkJCVwKIAkJCQkJCQkJCVwKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY29ubmxvY2ssIGZsYWdzKTsJCQkJXAotCWlmICghbGlzdF9lbXB0eSgmc2Vzc2lvbi0+Y29ubmVjdGlvbnMpKQkJCQlcCi0JCWNvbm4gPSBsaXN0X2VudHJ5KHNlc3Npb24tPmNvbm5lY3Rpb25zLm5leHQsCQlcCi0JCQkJICBzdHJ1Y3QgaXNjc2lfaWZfY29ubiwgc2Vzc2lvbl9saXN0KTsJXAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbm5sb2NrLCBmbGFncyk7CQkJXAotCQkJCQkJCQkJXAotCWlmIChjb25uICYmIChwcml2LT5wYXJhbV9tYXNrICYgKDEgPDwgcGFyYW0pKSkJCQlcCi0JCXByaXYtPmlzY3NpX3RyYW5zcG9ydC0+Z2V0X3BhcmFtKGNvbm4tPmNvbm5oLCBwYXJhbSwgJnZhbHVlKTtcCisJdC0+Z2V0X3Nlc3Npb25fcGFyYW0oc2hvc3QsIHBhcmFtLCAmdmFsdWUpOwkJCVwKIAlyZXR1cm4gc25wcmludGYoYnVmLCAyMCwgZm9ybWF0IlxuIiwgdmFsdWUpOwkJCVwKIH0KIApAQCAtMTAwNCwyMyArMTA1NiwxOCBAQAogCQljb3VudCsrOwkJCQkJCVwKIAl9CiAKLXN0YXRpYyBpbnQgaXNjc2lfaXNfc2Vzc2lvbl9kZXYoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiBkZXYtPnJlbGVhc2UgPT0gaXNjc2lfaWZfc2Vzc2lvbl9kZXZfcmVsZWFzZTsKLX0KLQogc3RhdGljIGludCBpc2NzaV9zZXNzaW9uX21hdGNoKHN0cnVjdCBhdHRyaWJ1dGVfY29udGFpbmVyICpjb250LAogCQkJICAgc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBpc2NzaV9pZl9zZXNzaW9uICpzZXNzaW9uOworCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbjsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKIAlzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgKnByaXY7CiAKIAlpZiAoIWlzY3NpX2lzX3Nlc3Npb25fZGV2KGRldikpCiAJCXJldHVybiAwOwogCi0Jc2Vzc2lvbiA9IGlzY3NpX2Rldl90b19pZl9zZXNzaW9uKGRldik7Ci0Jc2hvc3QgPSBpc2NzaV9pZl9zZXNzaW9uX3RvX3Nob3N0KHNlc3Npb24pOworCXNlc3Npb24gPSBpc2NzaV9kZXZfdG9fc2Vzc2lvbihkZXYpOworCXNob3N0ID0gaXNjc2lfc2Vzc2lvbl90b19zaG9zdChzZXNzaW9uKTsKIAlpZiAoIXNob3N0LT50cmFuc3BvcnR0KQogCQlyZXR1cm4gMDsKIApAQCAtMTAzMSwyMyArMTA3OCwyMSBAQAogCXJldHVybiAmcHJpdi0+c2Vzc2lvbl9jb250LmFjID09IGNvbnQ7CiB9CiAKLXN0YXRpYyBpbnQgaXNjc2lfaXNfY29ubl9kZXYoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiBkZXYtPnJlbGVhc2UgPT0gaXNjc2lfaWZfY29ubl9kZXZfcmVsZWFzZTsKLX0KLQogc3RhdGljIGludCBpc2NzaV9jb25uX21hdGNoKHN0cnVjdCBhdHRyaWJ1dGVfY29udGFpbmVyICpjb250LAogCQkJICAgc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBpc2NzaV9pZl9jb25uICpjb25uOworCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbjsKKwlzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNvbm47CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CiAJc3RydWN0IGlzY3NpX2ludGVybmFsICpwcml2OwogCiAJaWYgKCFpc2NzaV9pc19jb25uX2RldihkZXYpKQogCQlyZXR1cm4gMDsKIAotCWNvbm4gPSBpc2NzaV9kZXZfdG9faWZfY29ubihkZXYpOwotCXNob3N0ID0gY29ubi0+aG9zdDsKKwljb25uID0gaXNjc2lfZGV2X3RvX2Nvbm4oZGV2KTsKKwlzZXNzaW9uID0gaXNjc2lfZGV2X3RvX3Nlc3Npb24oY29ubi0+ZGV2LnBhcmVudCk7CisJc2hvc3QgPSBpc2NzaV9zZXNzaW9uX3RvX3Nob3N0KHNlc3Npb24pOworCiAJaWYgKCFzaG9zdC0+dHJhbnNwb3J0dCkKIAkJcmV0dXJuIDA7CiAKQEAgLTEwNTgsNyArMTEwMyw4IEBACiAJcmV0dXJuICZwcml2LT5jb25uX2NvbnQuYWMgPT0gY29udDsKIH0KIAotaW50IGlzY3NpX3JlZ2lzdGVyX3RyYW5zcG9ydChzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0dCkKK3N0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqCitpc2NzaV9yZWdpc3Rlcl90cmFuc3BvcnQoc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHQpCiB7CiAJc3RydWN0IGlzY3NpX2ludGVybmFsICpwcml2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xMDY4LDE1ICsxMTE0LDE0IEBACiAKIAlwcml2ID0gaXNjc2lfaWZfdHJhbnNwb3J0X2xvb2t1cCh0dCk7CiAJaWYgKHByaXYpCi0JCXJldHVybiAtRUVYSVNUOworCQlyZXR1cm4gTlVMTDsKIAogCXByaXYgPSBrbWFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOwogCWlmICghcHJpdikKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJldHVybiBOVUxMOwogCW1lbXNldChwcml2LCAwLCBzaXplb2YoKnByaXYpKTsKIAlJTklUX0xJU1RfSEVBRCgmcHJpdi0+bGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJnByaXYtPnNlc3Npb25zKTsKLQlzcGluX2xvY2tfaW5pdCgmcHJpdi0+c2Vzc2lvbl9sb2NrKTsKIAlwcml2LT5pc2NzaV90cmFuc3BvcnQgPSB0dDsKIAogCXByaXYtPmNkZXYuY2xhc3MgPSAmaXNjc2lfdHJhbnNwb3J0X2NsYXNzOwpAQCAtMTE0MiwxMyArMTE4NywxMyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzY3NpX3RyYW5zcG9ydF9sb2NrLCBmbGFncyk7CiAKIAlwcmludGsoS0VSTl9OT1RJQ0UgImlzY3NpOiByZWdpc3RlcmVkIHRyYW5zcG9ydCAoJXMpXG4iLCB0dC0+bmFtZSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuICZwcml2LT50OwogCiB1bnJlZ2lzdGVyX2NkZXY6CiAJY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoJnByaXYtPmNkZXYpOwogZnJlZV9wcml2OgogCWtmcmVlKHByaXYpOwotCXJldHVybiBlcnI7CisJcmV0dXJuIE5VTEw7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9yZWdpc3Rlcl90cmFuc3BvcnQpOwogCkBAIC0xMTU5LDE5ICsxMjA0LDExIEBACiAKIAlCVUdfT04oIXR0KTsKIAotCWRvd24oJnJ4X3F1ZXVlX3NlbWEpOworCW11dGV4X2xvY2soJnJ4X3F1ZXVlX211dGV4KTsKIAogCXByaXYgPSBpc2NzaV9pZl90cmFuc3BvcnRfbG9va3VwKHR0KTsKIAlCVUdfT04gKCFwcml2KTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zZXNzaW9uX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWxpc3RfZW1wdHkoJnByaXYtPnNlc3Npb25zKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zZXNzaW9uX2xvY2ssIGZsYWdzKTsKLQkJdXAoJnJ4X3F1ZXVlX3NlbWEpOwotCQlyZXR1cm4gLUVQRVJNOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zZXNzaW9uX2xvY2ssIGZsYWdzKTsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZpc2NzaV90cmFuc3BvcnRfbG9jaywgZmxhZ3MpOwogCWxpc3RfZGVsKCZwcml2LT5saXN0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2NzaV90cmFuc3BvcnRfbG9jaywgZmxhZ3MpOwpAQCAtMTE4MSw3ICsxMjE4LDcgQEAKIAogCXN5c2ZzX3JlbW92ZV9ncm91cCgmcHJpdi0+Y2Rldi5rb2JqLCAmaXNjc2lfdHJhbnNwb3J0X2dyb3VwKTsKIAljbGFzc19kZXZpY2VfdW5yZWdpc3RlcigmcHJpdi0+Y2Rldik7Ci0JdXAoJnJ4X3F1ZXVlX3NlbWEpOworCW11dGV4X3VubG9jaygmcnhfcXVldWVfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTk0LDE0ICsxMjMxLDE0IEBACiAKIAlpZiAoZXZlbnQgPT0gTkVUTElOS19VUkVMRUFTRSAmJgogCSAgICBuLT5wcm90b2NvbCA9PSBORVRMSU5LX0lTQ1NJICYmIG4tPnBpZCkgewotCQlzdHJ1Y3QgaXNjc2lfaWZfY29ubiAqY29ubjsKKwkJc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uOwogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JCW1lbXBvb2xfem9uZV9jb21wbGV0ZSgmel9yZXBseSk7CisJCW1lbXBvb2xfem9uZV9jb21wbGV0ZSh6X3JlcGx5KTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbm5sb2NrLCBmbGFncyk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubiwgJmNvbm5saXN0LCBjb25uX2xpc3QpIHsKLQkJCW1lbXBvb2xfem9uZV9jb21wbGV0ZSgmY29ubi0+el9lcnJvcik7Ci0JCQltZW1wb29sX3pvbmVfY29tcGxldGUoJmNvbm4tPnpfcGR1KTsKKwkJCW1lbXBvb2xfem9uZV9jb21wbGV0ZShjb25uLT56X2Vycm9yKTsKKwkJCW1lbXBvb2xfem9uZV9jb21wbGV0ZShjb25uLT56X3BkdSk7CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29ubmxvY2ssIGZsYWdzKTsKIAl9CkBAIC0xMjM0LDE1ICsxMjcxLDE1IEBACiAJCWdvdG8gdW5yZWdpc3Rlcl9zZXNzaW9uX2NsYXNzOwogCiAJbmxzID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfSVNDU0ksIDEsIGlzY3NpX2lmX3J4LAotCQkJCSAgICBUSElTX01PRFVMRSk7CisJCQlUSElTX01PRFVMRSk7CiAJaWYgKCFubHMpIHsKIAkJZXJyID0gLUVOT0JVRlM7CiAJCWdvdG8gdW5yZWdpc3Rlcl9ub3RpZmllcjsKIAl9CiAKLQllcnIgPSBtZW1wb29sX3pvbmVfaW5pdCgmel9yZXBseSwgWl9NQVhfUkVQTFksCisJel9yZXBseSA9IG1lbXBvb2xfem9uZV9pbml0KFpfTUFYX1JFUExZLAogCQlOTE1TR19TUEFDRShzaXplb2Yoc3RydWN0IGlzY3NpX3VldmVudCkpLCBaX0hJV0FUX1JFUExZKTsKLQlpZiAoIWVycikKKwlpZiAoel9yZXBseSkKIAkJcmV0dXJuIDA7CiAKIAlzb2NrX3JlbGVhc2UobmxzLT5za19zb2NrZXQpOwpAQCAtMTI1OSw3ICsxMjk2LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGlzY3NpX3RyYW5zcG9ydF9leGl0KHZvaWQpCiB7Ci0JbWVtcG9vbF9kZXN0cm95KHpfcmVwbHkucG9vbCk7CisJbWVtcG9vbF96b25lX2Rlc3Ryb3koel9yZXBseSk7CiAJc29ja19yZWxlYXNlKG5scy0+c2tfc29ja2V0KTsKIAluZXRsaW5rX3VucmVnaXN0ZXJfbm90aWZpZXIoJmlzY3NpX25sX25vdGlmaWVyKTsKIAl0cmFuc3BvcnRfY2xhc3NfdW5yZWdpc3RlcigmaXNjc2lfY29ubmVjdGlvbl9jbGFzcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmMKaW5kZXggZWRhYmJkMC4uYTNlMGI3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3Nhcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KIAorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnQuaD4KQEAgLTYyLDcgKzYzLDcgQEAKIAogc3RydWN0IHNhc19ob3N0X2F0dHJzIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHJwaHlfbGlzdDsKLQlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IG11dGV4IGxvY2s7CiAJdTMyIG5leHRfdGFyZ2V0X2lkOwogfTsKICNkZWZpbmUgdG9fc2FzX2hvc3RfYXR0cnMoaG9zdCkJKChzdHJ1Y3Qgc2FzX2hvc3RfYXR0cnMgKikoaG9zdCktPnNob3N0X2RhdGEpCkBAIC0xNjUsNyArMTY2LDcgQEAKIAlzdHJ1Y3Qgc2FzX2hvc3RfYXR0cnMgKnNhc19ob3N0ID0gdG9fc2FzX2hvc3RfYXR0cnMoc2hvc3QpOwogCiAJSU5JVF9MSVNUX0hFQUQoJnNhc19ob3N0LT5ycGh5X2xpc3QpOwotCXNwaW5fbG9ja19pbml0KCZzYXNfaG9zdC0+bG9jayk7CisJbXV0ZXhfaW5pdCgmc2FzX2hvc3QtPmxvY2spOwogCXNhc19ob3N0LT5uZXh0X3RhcmdldF9pZCA9IDA7CiAJcmV0dXJuIDA7CiB9CkBAIC02MjYsNyArNjI3LDcgQEAKIAl0cmFuc3BvcnRfYWRkX2RldmljZSgmcnBoeS0+ZGV2KTsKIAl0cmFuc3BvcnRfY29uZmlndXJlX2RldmljZSgmcnBoeS0+ZGV2KTsKIAotCXNwaW5fbG9jaygmc2FzX2hvc3QtPmxvY2spOworCW11dGV4X2xvY2soJnNhc19ob3N0LT5sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZycGh5LT5saXN0LCAmc2FzX2hvc3QtPnJwaHlfbGlzdCk7CiAJaWYgKGlkZW50aWZ5LT5kZXZpY2VfdHlwZSA9PSBTQVNfRU5EX0RFVklDRSAmJgogCSAgICAoaWRlbnRpZnktPnRhcmdldF9wb3J0X3Byb3RvY29scyAmCkBAIC02MzQsMTAgKzYzNSwxMCBAQAogCQlycGh5LT5zY3NpX3RhcmdldF9pZCA9IHNhc19ob3N0LT5uZXh0X3RhcmdldF9pZCsrOwogCWVsc2UKIAkJcnBoeS0+c2NzaV90YXJnZXRfaWQgPSAtMTsKLQlzcGluX3VubG9jaygmc2FzX2hvc3QtPmxvY2spOworCW11dGV4X3VubG9jaygmc2FzX2hvc3QtPmxvY2spOwogCiAJaWYgKHJwaHktPnNjc2lfdGFyZ2V0X2lkICE9IC0xKSB7Ci0JCXNjc2lfc2Nhbl90YXJnZXQoJnJwaHktPmRldiwgcGFyZW50LT5udW1iZXIsCisJCXNjc2lfc2Nhbl90YXJnZXQoJnJwaHktPmRldiwgcGFyZW50LT5wb3J0X2lkZW50aWZpZXIsCiAJCQkJcnBoeS0+c2NzaV90YXJnZXRfaWQsIH4wLCAwKTsKIAl9CiAKQEAgLTY2MSw5ICs2NjIsOSBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHJwaHktPmRldi5wYXJlbnQtPnBhcmVudCk7CiAJc3RydWN0IHNhc19ob3N0X2F0dHJzICpzYXNfaG9zdCA9IHRvX3Nhc19ob3N0X2F0dHJzKHNob3N0KTsKIAotCXNwaW5fbG9jaygmc2FzX2hvc3QtPmxvY2spOworCW11dGV4X2xvY2soJnNhc19ob3N0LT5sb2NrKTsKIAlsaXN0X2RlbCgmcnBoeS0+bGlzdCk7Ci0Jc3Bpbl91bmxvY2soJnNhc19ob3N0LT5sb2NrKTsKKwltdXRleF91bmxvY2soJnNhc19ob3N0LT5sb2NrKTsKIAogCXRyYW5zcG9ydF9kZXN0cm95X2RldmljZSgmcnBoeS0+ZGV2KTsKIAlwdXRfZGV2aWNlKHJwaHktPmRldi5wYXJlbnQpOwpAQCAtNjg3LDE1ICs2ODgsMjcgQEAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChwYXJlbnQtPmRldi5wYXJlbnQpOwogCXN0cnVjdCBzYXNfaG9zdF9hdHRycyAqc2FzX2hvc3QgPSB0b19zYXNfaG9zdF9hdHRycyhzaG9zdCk7CiAKLQlzY3NpX3JlbW92ZV90YXJnZXQoZGV2KTsKKwlzd2l0Y2ggKHJwaHktPmlkZW50aWZ5LmRldmljZV90eXBlKSB7CisJY2FzZSBTQVNfRU5EX0RFVklDRToKKwkJc2NzaV9yZW1vdmVfdGFyZ2V0KGRldik7CisJCWJyZWFrOworCWNhc2UgU0FTX0VER0VfRVhQQU5ERVJfREVWSUNFOgorCWNhc2UgU0FTX0ZBTk9VVF9FWFBBTkRFUl9ERVZJQ0U6CisJCWRldmljZV9mb3JfZWFjaF9jaGlsZChkZXYsIE5VTEwsIGRvX3Nhc19waHlfZGVsZXRlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQogCiAJdHJhbnNwb3J0X3JlbW92ZV9kZXZpY2UoZGV2KTsKIAlkZXZpY2VfZGVsKGRldik7CiAJdHJhbnNwb3J0X2Rlc3Ryb3lfZGV2aWNlKGRldik7CiAKLQlzcGluX2xvY2soJnNhc19ob3N0LT5sb2NrKTsKKwltdXRleF9sb2NrKCZzYXNfaG9zdC0+bG9jayk7CiAJbGlzdF9kZWwoJnJwaHktPmxpc3QpOwotCXNwaW5fdW5sb2NrKCZzYXNfaG9zdC0+bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZzYXNfaG9zdC0+bG9jayk7CisKKwlwYXJlbnQtPnJwaHkgPSBOVUxMOwogCiAJcHV0X2RldmljZSgmcGFyZW50LT5kZXYpOwogfQpAQCAtNzE5LDIzICs3MzIsMjggQEAKICAqIFNDU0kgc2NhbiBoZWxwZXIKICAqLwogCi1zdGF0aWMgc3RydWN0IGRldmljZSAqc2FzX3RhcmdldF9wYXJlbnQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCi0JCQkJCWludCBjaGFubmVsLCB1aW50IGlkKQorc3RhdGljIGludCBzYXNfdXNlcl9zY2FuKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCB1aW50IGNoYW5uZWwsCisJCXVpbnQgaWQsIHVpbnQgbHVuKQogewogCXN0cnVjdCBzYXNfaG9zdF9hdHRycyAqc2FzX2hvc3QgPSB0b19zYXNfaG9zdF9hdHRycyhzaG9zdCk7CiAJc3RydWN0IHNhc19ycGh5ICpycGh5OwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IE5VTEw7CiAKLQlzcGluX2xvY2soJnNhc19ob3N0LT5sb2NrKTsKKwltdXRleF9sb2NrKCZzYXNfaG9zdC0+bG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShycGh5LCAmc2FzX2hvc3QtPnJwaHlfbGlzdCwgbGlzdCkgewogCQlzdHJ1Y3Qgc2FzX3BoeSAqcGFyZW50ID0gZGV2X3RvX3BoeShycGh5LT5kZXYucGFyZW50KTsKLQkJaWYgKHBhcmVudC0+bnVtYmVyID09IGNoYW5uZWwgJiYKLQkJICAgIHJwaHktPnNjc2lfdGFyZ2V0X2lkID09IGlkKQotCQkJZGV2ID0gJnJwaHktPmRldjsKLQl9Ci0Jc3Bpbl91bmxvY2soJnNhc19ob3N0LT5sb2NrKTsKIAotCXJldHVybiBkZXY7CisJCWlmIChycGh5LT5zY3NpX3RhcmdldF9pZCA9PSAtMSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgoY2hhbm5lbCA9PSBTQ0FOX1dJTERfQ0FSRCB8fCBjaGFubmVsID09IHBhcmVudC0+cG9ydF9pZGVudGlmaWVyKSAmJgorCQkgICAgKGlkID09IFNDQU5fV0lMRF9DQVJEIHx8IGlkID09IHJwaHktPnNjc2lfdGFyZ2V0X2lkKSkgeworCQkJc2NzaV9zY2FuX3RhcmdldCgmcnBoeS0+ZGV2LCBwYXJlbnQtPnBvcnRfaWRlbnRpZmllciwKKwkJCQkJIHJwaHktPnNjc2lfdGFyZ2V0X2lkLCBsdW4sIDEpOworCQl9CisJfQorCW11dGV4X3VubG9jaygmc2FzX2hvc3QtPmxvY2spOworCisJcmV0dXJuIDA7CiB9CiAKIApAQCAtNzgwLDcgKzc5OCw3IEBACiAJCXJldHVybiBOVUxMOwogCW1lbXNldChpLCAwLCBzaXplb2Yoc3RydWN0IHNhc19pbnRlcm5hbCkpOwogCi0JaS0+dC50YXJnZXRfcGFyZW50ID0gc2FzX3RhcmdldF9wYXJlbnQ7CisJaS0+dC51c2VyX3NjYW4gPSBzYXNfdXNlcl9zY2FuOwogCiAJaS0+dC5ob3N0X2F0dHJzLmFjLmF0dHJzID0gJmktPmhvc3RfYXR0cnNbMF07CiAJaS0+dC5ob3N0X2F0dHJzLmFjLmNsYXNzID0gJnNhc19ob3N0X2NsYXNzLmNsYXNzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5jCmluZGV4IDQ2ZGE2ZmUuLjdlZTk1ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc3BpLmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlICJzY3NpX3ByaXYuaCIKICNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CkBAIC00OCw3ICs0OCw3IEBACiAKIC8qIFByaXZhdGUgZGF0YSBhY2Nlc3NvcnMgKGtlZXAgdGhlc2Ugb3V0IG9mIHRoZSBoZWFkZXIgZmlsZSkgKi8KICNkZWZpbmUgc3BpX2R2X3BlbmRpbmcoeCkgKCgoc3RydWN0IHNwaV90cmFuc3BvcnRfYXR0cnMgKikmKHgpLT5zdGFyZ2V0X2RhdGEpLT5kdl9wZW5kaW5nKQotI2RlZmluZSBzcGlfZHZfc2VtKHgpICgoKHN0cnVjdCBzcGlfdHJhbnNwb3J0X2F0dHJzICopJih4KS0+c3RhcmdldF9kYXRhKS0+ZHZfc2VtKQorI2RlZmluZSBzcGlfZHZfbXV0ZXgoeCkgKCgoc3RydWN0IHNwaV90cmFuc3BvcnRfYXR0cnMgKikmKHgpLT5zdGFyZ2V0X2RhdGEpLT5kdl9tdXRleCkKIAogc3RydWN0IHNwaV9pbnRlcm5hbCB7CiAJc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlIHQ7CkBAIC0yNDIsNyArMjQyLDcgQEAKIAlzcGlfaG9sZF9tY3Moc3RhcmdldCkgPSAwOwogCXNwaV9kdl9wZW5kaW5nKHN0YXJnZXQpID0gMDsKIAlzcGlfaW5pdGlhbF9kdihzdGFyZ2V0KSA9IDA7Ci0JaW5pdF9NVVRFWCgmc3BpX2R2X3NlbShzdGFyZ2V0KSk7CisJbXV0ZXhfaW5pdCgmc3BpX2R2X211dGV4KHN0YXJnZXQpKTsKIAogCXJldHVybiAwOwogfQpAQCAtOTE1LDcgKzkxNSw3IEBACiAJc2NzaV90YXJnZXRfcXVpZXNjZShzdGFyZ2V0KTsKIAogCXNwaV9kdl9wZW5kaW5nKHN0YXJnZXQpID0gMTsKLQlkb3duKCZzcGlfZHZfc2VtKHN0YXJnZXQpKTsKKwltdXRleF9sb2NrKCZzcGlfZHZfbXV0ZXgoc3RhcmdldCkpOwogCiAJc3RhcmdldF9wcmludGsoS0VSTl9JTkZPLCBzdGFyZ2V0LCAiQmVnaW5uaW5nIERvbWFpbiBWYWxpZGF0aW9uXG4iKTsKIApAQCAtOTIzLDcgKzkyMyw3IEBACiAKIAlzdGFyZ2V0X3ByaW50ayhLRVJOX0lORk8sIHN0YXJnZXQsICJFbmRpbmcgRG9tYWluIFZhbGlkYXRpb25cbiIpOwogCi0JdXAoJnNwaV9kdl9zZW0oc3RhcmdldCkpOworCW11dGV4X3VubG9jaygmc3BpX2R2X211dGV4KHN0YXJnZXQpKTsKIAlzcGlfZHZfcGVuZGluZyhzdGFyZ2V0KSA9IDA7CiAKIAlzY3NpX3RhcmdldF9yZXN1bWUoc3RhcmdldCk7CkBAIC0xMDc1LDcgKzEwNzUsNyBAQAogLyogMHgwNCAqLyAiUGFyYWxsZWwgUHJvdG9jb2wgUmVxdWVzdCIKIH07CiAKLXZvaWQgcHJpbnRfbmVnbyhjb25zdCB1bnNpZ25lZCBjaGFyICptc2csIGludCBwZXIsIGludCBvZmYsIGludCB3aWR0aCkKK3N0YXRpYyB2b2lkIHByaW50X25lZ28oY29uc3QgdW5zaWduZWQgY2hhciAqbXNnLCBpbnQgcGVyLCBpbnQgb2ZmLCBpbnQgd2lkdGgpCiB7CiAJaWYgKHBlcikgewogCQljaGFyIGJ1ZlsyMF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2QuYyBiL2RyaXZlcnMvc2NzaS9zZC5jCmluZGV4IDMyZDRkOGQuLjkzMGRiMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zZC5jCkBAIC00OSw2ICs0OSw3IEBACiAjaW5jbHVkZSA8bGludXgvYmxrcGcuaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KQEAgLTExMSw3ICsxMTIsNyBAQAogLyogVGhpcyBzZW1hcGhvcmUgaXMgdXNlZCB0byBtZWRpYXRlIHRoZSAwLT4xIHJlZmVyZW5jZSBnZXQgaW4gdGhlCiAgKiBmYWNlIG9mIG9iamVjdCBkZXN0cnVjdGlvbiAoaS5lLiB3ZSBjYW4ndCBhbGxvdyBhIGdldCBvbiBhbgogICogb2JqZWN0IGFmdGVyIGxhc3QgcHV0KSAqLwotc3RhdGljIERFQ0xBUkVfTVVURVgoc2RfcmVmX3NlbSk7CitzdGF0aWMgREVGSU5FX01VVEVYKHNkX3JlZl9tdXRleCk7CiAKIHN0YXRpYyBpbnQgc2RfcmV2YWxpZGF0ZV9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrKTsKIHN0YXRpYyB2b2lkIHNkX3J3X2ludHIoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KTsKQEAgLTE5Myw5ICsxOTQsOSBAQAogewogCXN0cnVjdCBzY3NpX2Rpc2sgKnNka3A7CiAKLQlkb3duKCZzZF9yZWZfc2VtKTsKKwltdXRleF9sb2NrKCZzZF9yZWZfbXV0ZXgpOwogCXNka3AgPSBfX3Njc2lfZGlza19nZXQoZGlzayk7Ci0JdXAoJnNkX3JlZl9zZW0pOworCW11dGV4X3VubG9jaygmc2RfcmVmX211dGV4KTsKIAlyZXR1cm4gc2RrcDsKIH0KIApAQCAtMjAzLDExICsyMDQsMTEgQEAKIHsKIAlzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwOwogCi0JZG93bigmc2RfcmVmX3NlbSk7CisJbXV0ZXhfbG9jaygmc2RfcmVmX211dGV4KTsKIAlzZGtwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaWYgKHNka3ApCiAJCXNka3AgPSBfX3Njc2lfZGlza19nZXQoc2RrcC0+ZGlzayk7Ci0JdXAoJnNkX3JlZl9zZW0pOworCW11dGV4X3VubG9jaygmc2RfcmVmX211dGV4KTsKIAlyZXR1cm4gc2RrcDsKIH0KIApAQCAtMjE1LDEwICsyMTYsMTAgQEAKIHsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBzZGtwLT5kZXZpY2U7CiAKLQlkb3duKCZzZF9yZWZfc2VtKTsKKwltdXRleF9sb2NrKCZzZF9yZWZfbXV0ZXgpOwogCWtyZWZfcHV0KCZzZGtwLT5rcmVmLCBzY3NpX2Rpc2tfcmVsZWFzZSk7CiAJc2NzaV9kZXZpY2VfcHV0KHNkZXYpOwotCXVwKCZzZF9yZWZfc2VtKTsKKwltdXRleF91bmxvY2soJnNkX3JlZl9tdXRleCk7CiB9CiAKIC8qKgpAQCAtMjMxLDM0ICsyMzIsMTIgQEAKICAqKi8KIHN0YXRpYyBpbnQgc2RfaW5pdF9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCkKIHsKLQl1bnNpZ25lZCBpbnQgdGhpc19jb3VudCwgdGltZW91dDsKLQlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKLQlzZWN0b3JfdCBibG9jazsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcCA9IFNDcG50LT5kZXZpY2U7CiAJc3RydWN0IHJlcXVlc3QgKnJxID0gU0NwbnQtPnJlcXVlc3Q7Ci0KLQl0aW1lb3V0ID0gc2RwLT50aW1lb3V0OwotCi0JLyoKLQkgKiBTR19JTyBmcm9tIGJsb2NrIGxheWVyIGFscmVhZHkgc2V0dXAsIGp1c3QgY29weSBjZGIgYmFzaWNhbGx5Ci0JICovCi0JaWYgKGJsa19wY19yZXF1ZXN0KHJxKSkgewotCQlzY3NpX3NldHVwX2Jsa19wY19jbW5kKFNDcG50KTsKLQkJaWYgKHJxLT50aW1lb3V0KQotCQkJdGltZW91dCA9IHJxLT50aW1lb3V0OwotCi0JCWdvdG8gcXVldWU7Ci0JfQotCi0JLyoKLQkgKiB3ZSBvbmx5IGRvIFJFUV9DTUQgYW5kIFJFUV9CTE9DS19QQwotCSAqLwotCWlmICghYmxrX2ZzX3JlcXVlc3QocnEpKQotCQlyZXR1cm4gMDsKLQotCWRpc2sgPSBycS0+cnFfZGlzazsKLQlibG9jayA9IHJxLT5zZWN0b3I7Ci0JdGhpc19jb3VudCA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gPj4gOTsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IHJxLT5ycV9kaXNrOworCXNlY3Rvcl90IGJsb2NrID0gcnEtPnNlY3RvcjsKKwl1bnNpZ25lZCBpbnQgdGhpc19jb3VudCA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gPj4gOTsKKwl1bnNpZ25lZCBpbnQgdGltZW91dCA9IHNkcC0+dGltZW91dDsKIAogCVNDU0lfTE9HX0hMUVVFVUUoMSwgcHJpbnRrKCJzZF9pbml0X2NvbW1hbmQ6IGRpc2s9JXMsIGJsb2NrPSVsbHUsICIKIAkJCSAgICAiY291bnQ9JWRcbiIsIGRpc2stPmRpc2tfbmFtZSwKQEAgLTQwMSw4ICszODAsNiBAQAogCVNDcG50LT50cmFuc2ZlcnNpemUgPSBzZHAtPnNlY3Rvcl9zaXplOwogCVNDcG50LT51bmRlcmZsb3cgPSB0aGlzX2NvdW50IDw8IDk7CiAJU0NwbnQtPmFsbG93ZWQgPSBTRF9NQVhfUkVUUklFUzsKLQotcXVldWU6CiAJU0NwbnQtPnRpbWVvdXRfcGVyX2NvbW1hbmQgPSB0aW1lb3V0OwogCiAJLyoKQEAgLTUyNyw3ICs1MDQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNkX2hkaW9fZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSBfX3VzZXIgKmxvYykKK3N0YXRpYyBpbnQgc2RfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKQogewogCXN0cnVjdCBzY3NpX2Rpc2sgKnNka3AgPSBzY3NpX2Rpc2soYmRldi0+YmRfZGlzayk7CiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZHAgPSBzZGtwLT5kZXZpY2U7CkBAIC01NDUsMTUgKzUyMiw5IEBACiAJZWxzZQogCQlzY3NpY2FtX2Jpb3NfcGFyYW0oYmRldiwgc2RrcC0+Y2FwYWNpdHksIGRpc2tpbmZvKTsKIAotCWlmIChwdXRfdXNlcihkaXNraW5mb1swXSwgJmxvYy0+aGVhZHMpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAocHV0X3VzZXIoZGlza2luZm9bMV0sICZsb2MtPnNlY3RvcnMpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAocHV0X3VzZXIoZGlza2luZm9bMl0sICZsb2MtPmN5bGluZGVycykpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmIChwdXRfdXNlcigodW5zaWduZWQpZ2V0X3N0YXJ0X3NlY3QoYmRldiksCi0JICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSZsb2MtPnN0YXJ0KSkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJZ2VvLT5oZWFkcyA9IGRpc2tpbmZvWzBdOworCWdlby0+c2VjdG9ycyA9IGRpc2tpbmZvWzFdOworCWdlby0+Y3lsaW5kZXJzID0gZGlza2luZm9bMl07CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU5MywxMiArNTY0LDYgQEAKIAlpZiAoIXNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyhzZHApIHx8ICFlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCi0JaWYgKGNtZCA9PSBIRElPX0dFVEdFTykgewotCQlpZiAoIWFyZykKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gc2RfaGRpb19nZXRnZW8oYmRldiwgcCk7Ci0JfQotCiAJLyoKIAkgKiBTZW5kIFNDU0kgYWRkcmVzc2luZyBpb2N0bHMgZGlyZWN0bHkgdG8gbWlkIGxldmVsLCBzZW5kIG90aGVyCiAJICogaW9jdGxzIHRvIGJsb2NrIGxldmVsIGFuZCB0aGVuIG9udG8gbWlkIGxldmVsIGlmIHRoZXkgY2FuJ3QgYmUKQEAgLTgwMCw2ICs3NjUsNyBAQAogCS5vcGVuCQkJPSBzZF9vcGVuLAogCS5yZWxlYXNlCQk9IHNkX3JlbGVhc2UsCiAJLmlvY3RsCQkJPSBzZF9pb2N0bCwKKwkuZ2V0Z2VvCQkJPSBzZF9nZXRnZW8sCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfaW9jdGwJCT0gc2RfY29tcGF0X2lvY3RsLAogI2VuZGlmCkBAIC04NDcsMTUgKzgxMyw3IEBACiAJICAgcmVsYXRpdmVseSByYXJlIGVycm9yIGNvbmRpdGlvbiwgbm8gY2FyZSBpcyB0YWtlbiB0byBhdm9pZAogCSAgIHVubmVjZXNzYXJ5IGFkZGl0aW9uYWwgd29yayBzdWNoIGFzIG1lbWNweSdzIHRoYXQgY291bGQgYmUgYXZvaWRlZC4KIAkgKi8KLQotCS8qIAotCSAqIElmIFNHX0lPIGZyb20gYmxvY2sgbGF5ZXIgdGhlbiBzZXQgZ29vZF9ieXRlcyB0byBzdG9wIHJldHJpZXM7Ci0JICogZWxzZSBpZiBlcnJvcnMsIGNoZWNrIHRoZW0sIGFuZCBpZiBuZWNlc3NhcnkgcHJlcGFyZSBmb3IKLQkgKiAocGFydGlhbCkgcmV0cmllcy4KLQkgKi8KLQlpZiAoYmxrX3BjX3JlcXVlc3QoU0NwbnQtPnJlcXVlc3QpKQotCQlnb29kX2J5dGVzID0gdGhpc19jb3VudDsKLQllbHNlIGlmIChkcml2ZXJfYnl0ZShyZXN1bHQpICE9IDAgJiYKKwlpZiAoZHJpdmVyX2J5dGUocmVzdWx0KSAhPSAwICYmCiAJCSBzZW5zZV92YWxpZCAmJiAhc2Vuc2VfZGVmZXJyZWQpIHsKIAkJc3dpdGNoIChzc2hkci5zZW5zZV9rZXkpIHsKIAkJY2FzZSBNRURJVU1fRVJST1I6CkBAIC0xNjQ2LDEwICsxNjA0LDEwIEBACiAJZGVsX2dlbmRpc2soc2RrcC0+ZGlzayk7CiAJc2Rfc2h1dGRvd24oZGV2KTsKIAotCWRvd24oJnNkX3JlZl9zZW0pOworCW11dGV4X2xvY2soJnNkX3JlZl9tdXRleCk7CiAJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CiAJa3JlZl9wdXQoJnNka3AtPmtyZWYsIHNjc2lfZGlza19yZWxlYXNlKTsKLQl1cCgmc2RfcmVmX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZzZF9yZWZfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNjU4LDcgKzE2MTYsNyBAQAogICoJc2NzaV9kaXNrX3JlbGVhc2UgLSBDYWxsZWQgdG8gZnJlZSB0aGUgc2NzaV9kaXNrIHN0cnVjdHVyZQogICoJQGtyZWY6IHBvaW50ZXIgdG8gZW1iZWRkZWQga3JlZgogICoKLSAqCXNkX3JlZl9zZW0gbXVzdCBiZSBoZWxkIGVudGVyaW5nIHRoaXMgcm91dGluZS4gIEJlY2F1c2UgaXQgaXMKKyAqCXNkX3JlZl9tdXRleCBtdXN0IGJlIGhlbGQgZW50ZXJpbmcgdGhpcyByb3V0aW5lLiAgQmVjYXVzZSBpdCBpcwogICoJY2FsbGVkIG9uIGxhc3QgcHV0LCB5b3Ugc2hvdWxkIGFsd2F5cyB1c2UgdGhlIHNjc2lfZGlza19nZXQoKQogICoJc2NzaV9kaXNrX3B1dCgpIGhlbHBlcnMgd2hpY2ggbWFuaXB1bGF0ZSB0aGUgc2VtYXBob3JlIGRpcmVjdGx5CiAgKglhbmQgbmV2ZXIgZG8gYSBkaXJlY3Qga3JlZl9wdXQoKS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZy5jIGIvZHJpdmVycy9zY3NpL3NnLmMKaW5kZXggMjIxZTk2ZS4uNzhhYWQ5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NnLmMKKysrIGIvZHJpdmVycy9zY3NpL3NnLmMKQEAgLTI0OTMsNyArMjQ5Myw3IEBACiAJfQogCWlmIChyZXNwKSB7CiAJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCAhY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKLQkJCW1lbXNldChyZXNwLCAwLCByZXNTeik7CisJCQltZW1zZXQocGFnZV9hZGRyZXNzKHJlc3ApLCAwLCByZXNTeik7CiAJCWlmIChyZXRTenApCiAJCQkqcmV0U3pwID0gcmVzU3o7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NyLmMgYi9kcml2ZXJzL3Njc2kvc3IuYwppbmRleCBhNGQ5YmU3Li45OTdmOGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3IuYworKysgYi9kcml2ZXJzL3Njc2kvc3IuYwpAQCAtNDQsNiArNDQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KQEAgLTkwLDcgKzkxLDcgQEAKIC8qIFRoaXMgc2VtYXBob3JlIGlzIHVzZWQgdG8gbWVkaWF0ZSB0aGUgMC0+MSByZWZlcmVuY2UgZ2V0IGluIHRoZQogICogZmFjZSBvZiBvYmplY3QgZGVzdHJ1Y3Rpb24gKGkuZS4gd2UgY2FuJ3QgYWxsb3cgYSBnZXQgb24gYW4KICAqIG9iamVjdCBhZnRlciBsYXN0IHB1dCkgKi8KLXN0YXRpYyBERUNMQVJFX01VVEVYKHNyX3JlZl9zZW0pOworc3RhdGljIERFRklORV9NVVRFWChzcl9yZWZfbXV0ZXgpOwogCiBzdGF0aWMgaW50IHNyX29wZW4oc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICosIGludCk7CiBzdGF0aWMgdm9pZCBzcl9yZWxlYXNlKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqKTsKQEAgLTEzMyw3ICsxMzQsNyBAQAogewogCXN0cnVjdCBzY3NpX2NkICpjZCA9IE5VTEw7CiAKLQlkb3duKCZzcl9yZWZfc2VtKTsKKwltdXRleF9sb2NrKCZzcl9yZWZfbXV0ZXgpOwogCWlmIChkaXNrLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAJY2QgPSBzY3NpX2NkKGRpc2spOwpAQCAtMTQ2LDE4ICsxNDcsMTggQEAKIAlrcmVmX3B1dCgmY2QtPmtyZWYsIHNyX2tyZWZfcmVsZWFzZSk7CiAJY2QgPSBOVUxMOwogIG91dDoKLQl1cCgmc3JfcmVmX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZzcl9yZWZfbXV0ZXgpOwogCXJldHVybiBjZDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNjc2lfY2RfcHV0KHN0cnVjdCBzY3NpX2NkICpjZCkKK3N0YXRpYyB2b2lkIHNjc2lfY2RfcHV0KHN0cnVjdCBzY3NpX2NkICpjZCkKIHsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBjZC0+ZGV2aWNlOwogCi0JZG93bigmc3JfcmVmX3NlbSk7CisJbXV0ZXhfbG9jaygmc3JfcmVmX211dGV4KTsKIAlrcmVmX3B1dCgmY2QtPmtyZWYsIHNyX2tyZWZfcmVsZWFzZSk7CiAJc2NzaV9kZXZpY2VfcHV0KHNkZXYpOwotCXVwKCZzcl9yZWZfc2VtKTsKKwltdXRleF91bmxvY2soJnNyX3JlZl9tdXRleCk7CiB9CiAKIC8qCkBAIC0yMzcsOCArMjM4LDYgQEAKIAkJY2FzZSBJTExFR0FMX1JFUVVFU1Q6CiAJCQlpZiAoIShTQ3BudC0+c2Vuc2VfYnVmZmVyWzBdICYgMHg5MCkpCiAJCQkJYnJlYWs7Ci0JCQlpZiAoIWJsa19mc19yZXF1ZXN0KFNDcG50LT5yZXF1ZXN0KSkKLQkJCQlicmVhazsKIAkJCWVycm9yX3NlY3RvciA9IChTQ3BudC0+c2Vuc2VfYnVmZmVyWzNdIDw8IDI0KSB8CiAJCQkJKFNDcG50LT5zZW5zZV9idWZmZXJbNF0gPDwgMTYpIHwKIAkJCQkoU0NwbnQtPnNlbnNlX2J1ZmZlcls1XSA8PCA4KSB8CkBAIC0zMTcsMjMgKzMxNiw2IEBACiAJfQogCiAJLyoKLQkgKiB0aGVzZSBhcmUgYWxyZWFkeSBzZXR1cCwganVzdCBjb3B5IGNkYiBiYXNpY2FsbHkKLQkgKi8KLQlpZiAoU0NwbnQtPnJlcXVlc3QtPmZsYWdzICYgUkVRX0JMT0NLX1BDKSB7Ci0JCXNjc2lfc2V0dXBfYmxrX3BjX2NtbmQoU0NwbnQpOwotCi0JCWlmIChTQ3BudC0+dGltZW91dF9wZXJfY29tbWFuZCkKLQkJCXRpbWVvdXQgPSBTQ3BudC0+dGltZW91dF9wZXJfY29tbWFuZDsKLQotCQlnb3RvIHF1ZXVlOwotCX0KLQotCWlmICghKFNDcG50LT5yZXF1ZXN0LT5mbGFncyAmIFJFUV9DTUQpKSB7Ci0JCWJsa19kdW1wX3JxX2ZsYWdzKFNDcG50LT5yZXF1ZXN0LCAic3IgdW5zdXAgY29tbWFuZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKgogCSAqIHdlIGRvIGxhenkgYmxvY2tzaXplIHN3aXRjaGluZyAod2hlbiByZWFkaW5nIFhBIHNlY3RvcnMsCiAJICogc2VlIENEUk9NUkVBRE1PREUyIGlvY3RsKSAKIAkgKi8KQEAgLTQyMSw4ICs0MDMsNiBAQAogCSAqLwogCVNDcG50LT50cmFuc2ZlcnNpemUgPSBjZC0+ZGV2aWNlLT5zZWN0b3Jfc2l6ZTsKIAlTQ3BudC0+dW5kZXJmbG93ID0gdGhpc19jb3VudCA8PCA5OwotCi1xdWV1ZToKIAlTQ3BudC0+YWxsb3dlZCA9IE1BWF9SRVRSSUVTOwogCVNDcG50LT50aW1lb3V0X3Blcl9jb21tYW5kID0gdGltZW91dDsKIApAQCAtNzYyLDggKzc0Miw5IEBACiAJCS8qIGZhaWxlZCwgZHJpdmUgZG9lc24ndCBoYXZlIGNhcGFiaWxpdGllcyBtb2RlIHBhZ2UgKi8KIAkJY2QtPmNkaS5zcGVlZCA9IDE7CiAJCWNkLT5jZGkubWFzayB8PSAoQ0RDX0NEX1IgfCBDRENfQ0RfUlcgfCBDRENfRFZEX1IgfAotCQkJCQkgQ0RDX0RWRCB8IENEQ19EVkRfUkFNIHwKLQkJCQkJIENEQ19TRUxFQ1RfRElTQyB8IENEQ19TRUxFQ1RfU1BFRUQpOworCQkJCSBDRENfRFZEIHwgQ0RDX0RWRF9SQU0gfAorCQkJCSBDRENfU0VMRUNUX0RJU0MgfCBDRENfU0VMRUNUX1NQRUVEIHwKKwkJCQkgQ0RDX01SVyB8IENEQ19NUldfVyB8IENEQ19SQU0pOwogCQlrZnJlZShidWZmZXIpOwogCQlwcmludGsoIiVzOiBzY3NpLTEgZHJpdmVcbiIsIGNkLT5jZGkubmFtZSk7CiAJCXJldHVybjsKQEAgLTg0NSw3ICs4MjYsNyBAQAogICoJc3Jfa3JlZl9yZWxlYXNlIC0gQ2FsbGVkIHRvIGZyZWUgdGhlIHNjc2lfY2Qgc3RydWN0dXJlCiAgKglAa3JlZjogcG9pbnRlciB0byBlbWJlZGRlZCBrcmVmCiAgKgotICoJc3JfcmVmX3NlbSBtdXN0IGJlIGhlbGQgZW50ZXJpbmcgdGhpcyByb3V0aW5lLiAgQmVjYXVzZSBpdCBpcworICoJc3JfcmVmX211dGV4IG11c3QgYmUgaGVsZCBlbnRlcmluZyB0aGlzIHJvdXRpbmUuICBCZWNhdXNlIGl0IGlzCiAgKgljYWxsZWQgb24gbGFzdCBwdXQsIHlvdSBzaG91bGQgYWx3YXlzIHVzZSB0aGUgc2NzaV9jZF9nZXQoKQogICoJc2NzaV9jZF9wdXQoKSBoZWxwZXJzIHdoaWNoIG1hbmlwdWxhdGUgdGhlIHNlbWFwaG9yZSBkaXJlY3RseQogICoJYW5kIG5ldmVyIGRvIGEgZGlyZWN0IGtyZWZfcHV0KCkuCkBAIC04NzQsOSArODU1LDkgQEAKIAogCWRlbF9nZW5kaXNrKGNkLT5kaXNrKTsKIAotCWRvd24oJnNyX3JlZl9zZW0pOworCW11dGV4X2xvY2soJnNyX3JlZl9tdXRleCk7CiAJa3JlZl9wdXQoJmNkLT5rcmVmLCBzcl9rcmVmX3JlbGVhc2UpOwotCXVwKCZzcl9yZWZfc2VtKTsKKwltdXRleF91bmxvY2soJnNyX3JlZl9tdXRleCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zcl9pb2N0bC5jIGIvZHJpdmVycy9zY3NpL3NyX2lvY3RsLmMKaW5kZXggNmU0NWFjMy4uNWQwMmZmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NyX2lvY3RsLmMKKysrIGIvZHJpdmVycy9zY3NpL3NyX2lvY3RsLmMKQEAgLTMxLDYgKzMxLDc5IEBACiAKIG1vZHVsZV9wYXJhbSh4YV90ZXN0LCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKIAorLyogcHJpbWl0aXZlIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIG5lZWQgdG8gaGF2ZSBHRlBfRE1BIHNldCBiYXNlZCBvbgorICogdGhlIHN0YXR1cyBvZiB0aGUgdW5jaGVja2VkX2lzYV9kbWEgZmxhZyBpbiB0aGUgaG9zdCBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgU1JfR0ZQX0RNQShjZCkgKCgoY2QpLT5kZXZpY2UtPmhvc3QtPnVuY2hlY2tlZF9pc2FfZG1hKSA/IEdGUF9ETUEgOiAwKQorCisKK3N0YXRpYyBpbnQgc3JfcmVhZF90b2NoZHIoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksCisJCXN0cnVjdCBjZHJvbV90b2NoZHIgKnRvY2hkcikKK3sKKwlzdHJ1Y3Qgc2NzaV9jZCAqY2QgPSBjZGktPmhhbmRsZTsKKwlzdHJ1Y3QgcGFja2V0X2NvbW1hbmQgY2djOworCWludCByZXN1bHQ7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyOworCisJYnVmZmVyID0ga21hbGxvYygzMiwgR0ZQX0tFUk5FTCB8IFNSX0dGUF9ETUEoY2QpKTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoJmNnYywgMCwgc2l6ZW9mKHN0cnVjdCBwYWNrZXRfY29tbWFuZCkpOworCWNnYy50aW1lb3V0ID0gSU9DVExfVElNRU9VVDsKKwljZ2MuY21kWzBdID0gR1BDTURfUkVBRF9UT0NfUE1BX0FUSVA7CisJY2djLmNtZFs4XSA9IDEyOwkJLyogTFNCIG9mIGxlbmd0aCAqLworCWNnYy5idWZmZXIgPSBidWZmZXI7CisJY2djLmJ1ZmxlbiA9IDEyOworCWNnYy5xdWlldCA9IDE7CisJY2djLmRhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCisJcmVzdWx0ID0gc3JfZG9faW9jdGwoY2QsICZjZ2MpOworCisJdG9jaGRyLT5jZHRoX3RyazAgPSBidWZmZXJbMl07CisJdG9jaGRyLT5jZHRoX3RyazEgPSBidWZmZXJbM107CisKKwlrZnJlZShidWZmZXIpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgc3JfcmVhZF90b2NlbnRyeShzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwKKwkJc3RydWN0IGNkcm9tX3RvY2VudHJ5ICp0b2NlbnRyeSkKK3sKKwlzdHJ1Y3Qgc2NzaV9jZCAqY2QgPSBjZGktPmhhbmRsZTsKKwlzdHJ1Y3QgcGFja2V0X2NvbW1hbmQgY2djOworCWludCByZXN1bHQ7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyOworCisJYnVmZmVyID0ga21hbGxvYygzMiwgR0ZQX0tFUk5FTCB8IFNSX0dGUF9ETUEoY2QpKTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoJmNnYywgMCwgc2l6ZW9mKHN0cnVjdCBwYWNrZXRfY29tbWFuZCkpOworCWNnYy50aW1lb3V0ID0gSU9DVExfVElNRU9VVDsKKwljZ2MuY21kWzBdID0gR1BDTURfUkVBRF9UT0NfUE1BX0FUSVA7CisJY2djLmNtZFsxXSB8PSAodG9jZW50cnktPmNkdGVfZm9ybWF0ID09IENEUk9NX01TRikgPyAweDAyIDogMDsKKwljZ2MuY21kWzZdID0gdG9jZW50cnktPmNkdGVfdHJhY2s7CisJY2djLmNtZFs4XSA9IDEyOwkJLyogTFNCIG9mIGxlbmd0aCAqLworCWNnYy5idWZmZXIgPSBidWZmZXI7CisJY2djLmJ1ZmxlbiA9IDEyOworCWNnYy5kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKworCXJlc3VsdCA9IHNyX2RvX2lvY3RsKGNkLCAmY2djKTsKKworCXRvY2VudHJ5LT5jZHRlX2N0cmwgPSBidWZmZXJbNV0gJiAweGY7CisJdG9jZW50cnktPmNkdGVfYWRyID0gYnVmZmVyWzVdID4+IDQ7CisJdG9jZW50cnktPmNkdGVfZGF0YW1vZGUgPSAodG9jZW50cnktPmNkdGVfY3RybCAmIDB4MDQpID8gMSA6IDA7CisJaWYgKHRvY2VudHJ5LT5jZHRlX2Zvcm1hdCA9PSBDRFJPTV9NU0YpIHsKKwkJdG9jZW50cnktPmNkdGVfYWRkci5tc2YubWludXRlID0gYnVmZmVyWzldOworCQl0b2NlbnRyeS0+Y2R0ZV9hZGRyLm1zZi5zZWNvbmQgPSBidWZmZXJbMTBdOworCQl0b2NlbnRyeS0+Y2R0ZV9hZGRyLm1zZi5mcmFtZSA9IGJ1ZmZlclsxMV07CisJfSBlbHNlCisJCXRvY2VudHJ5LT5jZHRlX2FkZHIubGJhID0gKCgoKChidWZmZXJbOF0gPDwgOCkgKyBidWZmZXJbOV0pIDw8IDgpCisJCQkrIGJ1ZmZlclsxMF0pIDw8IDgpICsgYnVmZmVyWzExXTsKKworCWtmcmVlKGJ1ZmZlcik7CisJcmV0dXJuIHJlc3VsdDsKK30KIAogI2RlZmluZSBJT0NUTF9SRVRSSUVTIDMKIApAQCAtNDUsNyArMTE4LDggQEAKIAlzdHJ1Y3QgcGFja2V0X2NvbW1hbmQgY2djOwogCWludCBudHJhY2tzLCByZXQ7CiAKLQlpZiAoKHJldCA9IHNyX2F1ZGlvX2lvY3RsKGNkaSwgQ0RST01SRUFEVE9DSERSLCAmdG9jaGRyKSkpCisJcmV0ID0gc3JfcmVhZF90b2NoZHIoY2RpLCAmdG9jaGRyKTsKKwlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJbnRyYWNrcyA9IHRvY2hkci5jZHRoX3RyazEgLSB0b2NoZHIuY2R0aF90cmswICsgMTsKQEAgLTYwLDkgKzEzNCwxMSBAQAogCXRyazFfdGUuY2R0ZV90cmFjayA9IHRpLT5jZHRpX3RyazE7CiAJdHJrMV90ZS5jZHRlX2Zvcm1hdCA9IENEUk9NX01TRjsKIAkKLQlpZiAoKHJldCA9IHNyX2F1ZGlvX2lvY3RsKGNkaSwgQ0RST01SRUFEVE9DRU5UUlksICZ0cmswX3RlKSkpCisJcmV0ID0gc3JfcmVhZF90b2NlbnRyeShjZGksICZ0cmswX3RlKTsKKwlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCWlmICgocmV0ID0gc3JfYXVkaW9faW9jdGwoY2RpLCBDRFJPTVJFQURUT0NFTlRSWSwgJnRyazFfdGUpKSkKKwlyZXQgPSBzcl9yZWFkX3RvY2VudHJ5KGNkaSwgJnRyazFfdGUpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAltZW1zZXQoJmNnYywgMCwgc2l6ZW9mKHN0cnVjdCBwYWNrZXRfY29tbWFuZCkpOwpAQCAtNzgsNiArMTU0LDMwIEBACiAJcmV0dXJuIHNyX2RvX2lvY3RsKGNkaS0+aGFuZGxlLCAmY2djKTsKIH0KIAorc3RhdGljIGludCBzcl9wbGF5X3Rya2luZChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwKKwkJc3RydWN0IGNkcm9tX3RpICp0aSkKKworeworCXN0cnVjdCBzY3NpX2NkICpjZCA9IGNkaS0+aGFuZGxlOworCXN0cnVjdCBwYWNrZXRfY29tbWFuZCBjZ2M7CisJaW50IHJlc3VsdDsKKworCW1lbXNldCgmY2djLCAwLCBzaXplb2Yoc3RydWN0IHBhY2tldF9jb21tYW5kKSk7CisJY2djLnRpbWVvdXQgPSBJT0NUTF9USU1FT1VUOworCWNnYy5jbWRbMF0gPSBHUENNRF9QTEFZQVVESU9fVEk7CisJY2djLmNtZFs0XSA9IHRpLT5jZHRpX3RyazA7CisJY2djLmNtZFs1XSA9IHRpLT5jZHRpX2luZDA7CisJY2djLmNtZFs3XSA9IHRpLT5jZHRpX3RyazE7CisJY2djLmNtZFs4XSA9IHRpLT5jZHRpX2luZDE7CisJY2djLmRhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7CisKKwlyZXN1bHQgPSBzcl9kb19pb2N0bChjZCwgJmNnYyk7CisJaWYgKHJlc3VsdCA9PSAtRURSSVZFX0NBTlRfRE9fVEhJUykKKwkJcmVzdWx0ID0gc3JfZmFrZV9wbGF5dHJraW5kKGNkaSwgdGkpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKwogLyogV2UgZG8gb3VyIG93biByZXRyaWVzIGJlY2F1c2Ugd2Ugd2FudCB0byBrbm93IHdoYXQgdGhlIHNwZWNpZmljCiAgICBlcnJvciBjb2RlIGlzLiAgTm9ybWFsbHkgdGhlIFVOSVRfQVRURU5USU9OIGNvZGUgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICBjbGVhciBhZnRlciBvbmUgZXJyb3IgKi8KQEAgLTIyOSwxMyArMzI5LDE0IEBACiAJaW50IGksIHJjLCBoYXZlX2RhdGF0cmFja3MgPSAwOwogCiAJLyogbG9vayBmb3IgZGF0YSB0cmFja3MgKi8KLQlpZiAoMCAhPSAocmMgPSBzcl9hdWRpb19pb2N0bChjZGksIENEUk9NUkVBRFRPQ0hEUiwgJnRvY19oKSkpCisJcmMgPSBzcl9yZWFkX3RvY2hkcihjZGksICZ0b2NfaCk7CisJaWYgKHJjKQogCQlyZXR1cm4gKHJjID09IC1FTk9NRURJVU0pID8gQ0RTX05PX0RJU0MgOiBDRFNfTk9fSU5GTzsKIAogCWZvciAoaSA9IHRvY19oLmNkdGhfdHJrMDsgaSA8PSB0b2NfaC5jZHRoX3RyazE7IGkrKykgewogCQl0b2NfZS5jZHRlX3RyYWNrID0gaTsKIAkJdG9jX2UuY2R0ZV9mb3JtYXQgPSBDRFJPTV9MQkE7Ci0JCWlmIChzcl9hdWRpb19pb2N0bChjZGksIENEUk9NUkVBRFRPQ0VOVFJZLCAmdG9jX2UpKQorCQlpZiAoc3JfcmVhZF90b2NlbnRyeShjZGksICZ0b2NfZSkpCiAJCQlyZXR1cm4gQ0RTX05PX0lORk87CiAJCWlmICh0b2NfZS5jZHRlX2N0cmwgJiBDRFJPTV9EQVRBX1RSQUNLKSB7CiAJCQloYXZlX2RhdGF0cmFja3MgPSAxOwpAQCAtMjYyLDEwICszNjMsNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBwcmltaXRpdmUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgbmVlZCB0byBoYXZlIEdGUF9ETUEgc2V0IGJhc2VkIG9uCi0gKiB0aGUgc3RhdHVzIG9mIHRoZSB1bmNoZWNrZWRfaXNhX2RtYSBmbGFnIGluIHRoZSBob3N0IHN0cnVjdHVyZSAqLwotI2RlZmluZSBTUl9HRlBfRE1BKGNkKSAoKChjZCktPmRldmljZS0+aG9zdC0+dW5jaGVja2VkX2lzYV9kbWEpID8gR0ZQX0RNQSA6IDApCi0KIGludCBzcl9nZXRfbWNuKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLCBzdHJ1Y3QgY2Ryb21fbWNuICptY24pCiB7CiAJU2NzaV9DRCAqY2QgPSBjZGktPmhhbmRsZTsKQEAgLTMyOSw5MyArNDI2LDE2IEBACiAKIGludCBzcl9hdWRpb19pb2N0bChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewotCVNjc2lfQ0QgKmNkID0gY2RpLT5oYW5kbGU7Ci0Jc3RydWN0IHBhY2tldF9jb21tYW5kIGNnYzsKLQlpbnQgcmVzdWx0OwotCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9IGttYWxsb2MoMzIsIEdGUF9LRVJORUwgfCBTUl9HRlBfRE1BKGNkKSk7Ci0KLQlpZiAoIWJ1ZmZlcikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltZW1zZXQoJmNnYywgMCwgc2l6ZW9mKHN0cnVjdCBwYWNrZXRfY29tbWFuZCkpOwotCWNnYy50aW1lb3V0ID0gSU9DVExfVElNRU9VVDsKLQogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBDRFJPTVJFQURUT0NIRFI6Ci0JCXsKLQkJCXN0cnVjdCBjZHJvbV90b2NoZHIgKnRvY2hkciA9IChzdHJ1Y3QgY2Ryb21fdG9jaGRyICopIGFyZzsKLQotCQkJY2djLmNtZFswXSA9IEdQQ01EX1JFQURfVE9DX1BNQV9BVElQOwotCQkJY2djLmNtZFs4XSA9IDEyOwkJLyogTFNCIG9mIGxlbmd0aCAqLwotCQkJY2djLmJ1ZmZlciA9IGJ1ZmZlcjsKLQkJCWNnYy5idWZsZW4gPSAxMjsKLQkJCWNnYy5xdWlldCA9IDE7Ci0JCQljZ2MuZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7Ci0KLQkJCXJlc3VsdCA9IHNyX2RvX2lvY3RsKGNkLCAmY2djKTsKLQotCQkJdG9jaGRyLT5jZHRoX3RyazAgPSBidWZmZXJbMl07Ci0JCQl0b2NoZHItPmNkdGhfdHJrMSA9IGJ1ZmZlclszXTsKLQotCQkJYnJlYWs7Ci0JCX0KLQorCQlyZXR1cm4gc3JfcmVhZF90b2NoZHIoY2RpLCBhcmcpOwogCWNhc2UgQ0RST01SRUFEVE9DRU5UUlk6Ci0JCXsKLQkJCXN0cnVjdCBjZHJvbV90b2NlbnRyeSAqdG9jZW50cnkgPSAoc3RydWN0IGNkcm9tX3RvY2VudHJ5ICopIGFyZzsKLQotCQkJY2djLmNtZFswXSA9IEdQQ01EX1JFQURfVE9DX1BNQV9BVElQOwotCQkJY2djLmNtZFsxXSB8PSAodG9jZW50cnktPmNkdGVfZm9ybWF0ID09IENEUk9NX01TRikgPyAweDAyIDogMDsKLQkJCWNnYy5jbWRbNl0gPSB0b2NlbnRyeS0+Y2R0ZV90cmFjazsKLQkJCWNnYy5jbWRbOF0gPSAxMjsJCS8qIExTQiBvZiBsZW5ndGggKi8KLQkJCWNnYy5idWZmZXIgPSBidWZmZXI7Ci0JCQljZ2MuYnVmbGVuID0gMTI7Ci0JCQljZ2MuZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7Ci0KLQkJCXJlc3VsdCA9IHNyX2RvX2lvY3RsKGNkLCAmY2djKTsKLQotCQkJdG9jZW50cnktPmNkdGVfY3RybCA9IGJ1ZmZlcls1XSAmIDB4ZjsKLQkJCXRvY2VudHJ5LT5jZHRlX2FkciA9IGJ1ZmZlcls1XSA+PiA0OwotCQkJdG9jZW50cnktPmNkdGVfZGF0YW1vZGUgPSAodG9jZW50cnktPmNkdGVfY3RybCAmIDB4MDQpID8gMSA6IDA7Ci0JCQlpZiAodG9jZW50cnktPmNkdGVfZm9ybWF0ID09IENEUk9NX01TRikgewotCQkJCXRvY2VudHJ5LT5jZHRlX2FkZHIubXNmLm1pbnV0ZSA9IGJ1ZmZlcls5XTsKLQkJCQl0b2NlbnRyeS0+Y2R0ZV9hZGRyLm1zZi5zZWNvbmQgPSBidWZmZXJbMTBdOwotCQkJCXRvY2VudHJ5LT5jZHRlX2FkZHIubXNmLmZyYW1lID0gYnVmZmVyWzExXTsKLQkJCX0gZWxzZQotCQkJCXRvY2VudHJ5LT5jZHRlX2FkZHIubGJhID0gKCgoKChidWZmZXJbOF0gPDwgOCkgKyBidWZmZXJbOV0pIDw8IDgpCi0JCQkJCSsgYnVmZmVyWzEwXSkgPDwgOCkgKyBidWZmZXJbMTFdOwotCi0JCQlicmVhazsKLQkJfQotCi0JY2FzZSBDRFJPTVBMQVlUUktJTkQ6IHsKLQkJc3RydWN0IGNkcm9tX3RpKiB0aSA9IChzdHJ1Y3QgY2Ryb21fdGkqKWFyZzsKLQotCQljZ2MuY21kWzBdID0gR1BDTURfUExBWUFVRElPX1RJOwotCQljZ2MuY21kWzRdID0gdGktPmNkdGlfdHJrMDsKLQkJY2djLmNtZFs1XSA9IHRpLT5jZHRpX2luZDA7Ci0JCWNnYy5jbWRbN10gPSB0aS0+Y2R0aV90cmsxOwotCQljZ2MuY21kWzhdID0gdGktPmNkdGlfaW5kMTsKLQkJY2djLmRhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7Ci0KLQkJcmVzdWx0ID0gc3JfZG9faW9jdGwoY2QsICZjZ2MpOwotCQlpZiAocmVzdWx0ID09IC1FRFJJVkVfQ0FOVF9ET19USElTKQotCQkJcmVzdWx0ID0gc3JfZmFrZV9wbGF5dHJraW5kKGNkaSwgdGkpOwotCi0JCWJyZWFrOwotCX0KLQorCQlyZXR1cm4gc3JfcmVhZF90b2NlbnRyeShjZGksIGFyZyk7CisJY2FzZSBDRFJPTVBMQVlUUktJTkQ6CisJCXJldHVybiBzcl9wbGF5X3Rya2luZChjZGksIGFyZyk7CiAJZGVmYXVsdDoKLQkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCi0jaWYgMAotCWlmIChyZXN1bHQpCi0JCXByaW50aygiREVCVUc6IHNyX2F1ZGlvOiByZXN1bHQgZm9yIGlvY3RsICV4OiAleFxuIiwgY21kLCByZXN1bHQpOwotI2VuZGlmCi0KLQlrZnJlZShidWZmZXIpOwotCXJldHVybiByZXN1bHQ7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3QuYyBiL2RyaXZlcnMvc2NzaS9zdC5jCmluZGV4IGM0YWFkZTguLjEzYjFkM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zdC5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgpAQCAtMTkzLDcgKzE5NCw2IEBACiAKIHN0YXRpYyBpbnQgc3RfcHJvYmUoc3RydWN0IGRldmljZSAqKTsKIHN0YXRpYyBpbnQgc3RfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKik7Ci1zdGF0aWMgaW50IHN0X2luaXRfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICopOwogCiBzdGF0aWMgdm9pZCBkb19jcmVhdGVfZHJpdmVyZnNfZmlsZXModm9pZCk7CiBzdGF0aWMgdm9pZCBkb19yZW1vdmVfZHJpdmVyZnNfZmlsZXModm9pZCk7CkBAIC0yMDYsNyArMjA2LDYgQEAKIAkJLnByb2JlCQk9IHN0X3Byb2JlLAogCQkucmVtb3ZlCQk9IHN0X3JlbW92ZSwKIAl9LAotCS5pbml0X2NvbW1hbmQJCT0gc3RfaW5pdF9jb21tYW5kLAogfTsKIAogc3RhdGljIGludCBzdF9jb21wcmVzc2lvbihzdHJ1Y3Qgc2NzaV90YXBlICosIGludCk7CkBAIC0yMjAsNyArMjE5LDcgQEAKIAogI2RlZmluZSB0b19zY3NpX3RhcGUob2JqKSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3Qgc2NzaV90YXBlLCBrcmVmKQogCi1zdGF0aWMgREVDTEFSRV9NVVRFWChzdF9yZWZfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgoc3RfcmVmX211dGV4KTsKIAogDAogI2luY2x1ZGUgIm9zc3RfZGV0ZWN0LmgiCkBAIC0yMzcsNyArMjM2LDcgQEAKIHsKIAlzdHJ1Y3Qgc2NzaV90YXBlICpTVHAgPSBOVUxMOwogCi0JZG93bigmc3RfcmVmX3NlbSk7CisJbXV0ZXhfbG9jaygmc3RfcmVmX211dGV4KTsKIAl3cml0ZV9sb2NrKCZzdF9kZXZfYXJyX2xvY2spOwogCiAJaWYgKGRldiA8IHN0X2Rldl9tYXggJiYgc2NzaV90YXBlcyAhPSBOVUxMKQpAQCAtMjU5LDcgKzI1OCw3IEBACiAJU1RwID0gTlVMTDsKIG91dDoKIAl3cml0ZV91bmxvY2soJnN0X2Rldl9hcnJfbG9jayk7Ci0JdXAoJnN0X3JlZl9zZW0pOworCW11dGV4X3VubG9jaygmc3RfcmVmX211dGV4KTsKIAlyZXR1cm4gU1RwOwogfQogCkBAIC0yNjcsMTAgKzI2NiwxMCBAQAogewogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IFNUcC0+ZGV2aWNlOwogCi0JZG93bigmc3RfcmVmX3NlbSk7CisJbXV0ZXhfbG9jaygmc3RfcmVmX211dGV4KTsKIAlrcmVmX3B1dCgmU1RwLT5rcmVmLCBzY3NpX3RhcGVfcmVsZWFzZSk7CiAJc2NzaV9kZXZpY2VfcHV0KHNkZXYpOwotCXVwKCZzdF9yZWZfc2VtKTsKKwltdXRleF91bmxvY2soJnN0X3JlZl9tdXRleCk7CiB9CiAKIHN0cnVjdCBzdF9yZWplY3RfZGF0YSB7CkBAIC00MTQxLDkgKzQxNDAsOSBAQAogCQkJCX0KIAkJCX0KIAotCQkJZG93bigmc3RfcmVmX3NlbSk7CisJCQltdXRleF9sb2NrKCZzdF9yZWZfbXV0ZXgpOwogCQkJa3JlZl9wdXQoJnRwbnQtPmtyZWYsIHNjc2lfdGFwZV9yZWxlYXNlKTsKLQkJCXVwKCZzdF9yZWZfc2VtKTsKKwkJCW11dGV4X3VubG9jaygmc3RfcmVmX211dGV4KTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtNDE1Niw3ICs0MTU1LDcgQEAKICAqICAgICAgc2NzaV90YXBlX3JlbGVhc2UgLSBDYWxsZWQgdG8gZnJlZSB0aGUgU2NzaV9UYXBlIHN0cnVjdHVyZQogICogICAgICBAa3JlZjogcG9pbnRlciB0byBlbWJlZGRlZCBrcmVmCiAgKgotICogICAgICBzdF9yZWZfc2VtIG11c3QgYmUgaGVsZCBlbnRlcmluZyB0aGlzIHJvdXRpbmUuICBCZWNhdXNlIGl0IGlzCisgKiAgICAgIHN0X3JlZl9tdXRleCBtdXN0IGJlIGhlbGQgZW50ZXJpbmcgdGhpcyByb3V0aW5lLiAgQmVjYXVzZSBpdCBpcwogICogICAgICBjYWxsZWQgb24gbGFzdCBwdXQsIHlvdSBzaG91bGQgYWx3YXlzIHVzZSB0aGUgc2NzaV90YXBlX2dldCgpCiAgKiAgICAgIHNjc2lfdGFwZV9wdXQoKSBoZWxwZXJzIHdoaWNoIG1hbmlwdWxhdGUgdGhlIHNlbWFwaG9yZSBkaXJlY3RseQogICogICAgICBhbmQgbmV2ZXIgZG8gYSBkaXJlY3Qga3JlZl9wdXQoKS4KQEAgLTQxODAsMjkgKzQxNzksNiBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgc3RfaW50cihzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKLXsKLQkvKgotCSAqIFRoZSBjYWxsZXIgc2hvdWxkIGJlIGNoZWNraW5nIHRoZSByZXF1ZXN0J3MgZXJyb3JzCi0JICogdmFsdWUuCi0JICovCi0Jc2NzaV9pb19jb21wbGV0aW9uKFNDcG50LCBTQ3BudC0+YnVmZmxlbiwgMCk7Ci19Ci0KLS8qCi0gKiBzdF9pbml0X2NvbW1hbmQ6IG9ubHkgY2FsbGVkIHZpYSB0aGUgc2NzaV9jbWRfaW9jdGwgKGJsb2NrIFNHX0lPKQotICogaW50ZXJmYWNlIGZvciBSRVFfQkxPQ0tfUEMgY29tbWFuZHMuCi0gKi8KLXN0YXRpYyBpbnQgc3RfaW5pdF9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQotewotCWlmICghKFNDcG50LT5yZXF1ZXN0LT5mbGFncyAmIFJFUV9CTE9DS19QQykpCi0JCXJldHVybiAwOwotCi0Jc2NzaV9zZXR1cF9ibGtfcGNfY21uZChTQ3BudCk7Ci0JU0NwbnQtPmRvbmUgPSBzdF9pbnRyOwotCXJldHVybiAxOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3N0KHZvaWQpCiB7CiAJdmFsaWRhdGVfb3B0aW9ucygpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3dkMzNjOTMuYyBiL2RyaXZlcnMvc2NzaS93ZDMzYzkzLmMKaW5kZXggZmQ2M2FkZC4uZmI1M2VlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3dkMzNjOTMuYworKysgYi9kcml2ZXJzL3Njc2kvd2QzM2M5My5jCkBAIC00NjUsNyArNDY1LDcgQEAKIAkgKi8KIAogCWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGhvc3RkYXRhLT5pbnB1dF9ROwotCXByZXYgPSAwOworCXByZXYgPSBOVUxMOwogCXdoaWxlIChjbWQpIHsKIAkJaWYgKCEoaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSAmICgxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pKSkKIAkJCWJyZWFrOwpAQCAtMTU2OSw3ICsxNTY5LDcgQEAKICAqLwogCiAJdG1wID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgaG9zdGRhdGEtPmlucHV0X1E7Ci0JcHJldiA9IDA7CisJcHJldiA9IE5VTEw7CiAJd2hpbGUgKHRtcCkgewogCQlpZiAodG1wID09IGNtZCkgewogCQkJaWYgKHByZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC8yMTI4NS5jIGIvZHJpdmVycy9zZXJpYWwvMjEyODUuYwppbmRleCBiNWNmMzk0Li4yMjE5OTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC8yMTI4NS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzIxMjg1LmMKQEAgLTk0LDE1ICs5NCw2IEBACiAKIAlzdGF0dXMgPSAqQ1NSX1VBUlRGTEc7CiAJd2hpbGUgKCEoc3RhdHVzICYgMHgxMCkgJiYgbWF4X2NvdW50LS0pIHsKLQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSB7Ci0JCQlpZiAodHR5LT5sb3dfbGF0ZW5jeSkKLQkJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCQkJLyoKLQkJCSAqIElmIHRoaXMgZmFpbGVkIHRoZW4gd2Ugd2lsbCB0aHJvdyBhd2F5IHRoZQotCQkJICogYnl0ZXMgYnV0IG11c3QgZG8gc28gdG8gY2xlYXIgaW50ZXJydXB0cwotCQkJICovCi0JCX0KLQogCQljaCA9ICpDU1JfVUFSVERSOwogCQlmbGFnID0gVFRZX05PUk1BTDsKIAkJcG9ydC0+aWNvdW50LnJ4Kys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC82ODMyOHNlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvNjgzMjhzZXJpYWwuYwppbmRleCA2N2U5YWZhLi44Y2JmMGZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC82ODMyOHNlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzY4MzI4c2VyaWFsLmMKQEAgLTE0Myw3ICsxNDMsNiBAQAogICogbWVtb3J5IGlmIGxhcmdlIG51bWJlcnMgb2Ygc2VyaWFsIHBvcnRzIGFyZSBvcGVuLgogICovCiBzdGF0aWMgdW5zaWduZWQgY2hhciB0bXBfYnVmW1NFUklBTF9YTUlUX1NJWkVdOyAvKiBUaGlzIGlzIGNoZWF0aW5nICovCi1ERUNMQVJFX01VVEVYKHRtcF9idWZfc2VtKTsKIAogc3RhdGljIGlubGluZSBpbnQgc2VyaWFsX3BhcmFub2lhX2NoZWNrKHN0cnVjdCBtNjhrX3NlcmlhbCAqaW5mbywKIAkJCQkJY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcm91dGluZSkKQEAgLTI5NCw3ICsyOTMsNyBAQAogewogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7CiAJbTY4MzI4X3VhcnQgKnVhcnQgPSAmdWFydF9hZGRyW2luZm8tPmxpbmVdOwotCXVuc2lnbmVkIGNoYXIgY2g7CisJdW5zaWduZWQgY2hhciBjaCwgZmxhZzsKIAogCS8qCiAJICogVGhpcyBkbyB7IH0gd2hpbGUoKSBsb29wIHdpbGwgZ2V0IEFMTCBjaGFycyBvdXQgb2YgUnggRklGTyAKQEAgLTMzMiwyNiArMzMxLDI0IEBACiAJCS8qCiAJCSAqIE1ha2Ugc3VyZSB0aGF0IHdlIGRvIG5vdCBvdmVyZmxvdyB0aGUgYnVmZmVyCiAJCSAqLwotCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpIHsKKwkJaWYgKHR0eV9yZXF1ZXN0X2J1ZmZlcl9yb29tKHR0eSwgMSkgPT0gMCkgewogCQkJc2NoZWR1bGVfd29yaygmdHR5LT5mbGlwLndvcmspOwogCQkJcmV0dXJuOwogCQl9CiAKKwkJZmxhZyA9IFRUWV9OT1JNQUw7CisKIAkJaWYocnggJiBVUlhfUEFSSVRZX0VSUk9SKSB7Ci0JCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX1BBUklUWTsKKwkJCWZsYWcgPSBUVFlfUEFSSVRZOwogCQkJc3RhdHVzX2hhbmRsZShpbmZvLCByeCk7CiAJCX0gZWxzZSBpZihyeCAmIFVSWF9PVlJVTikgewotCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9PVkVSUlVOOworCQkJZmxhZyA9IFRUWV9PVkVSUlVOOwogCQkJc3RhdHVzX2hhbmRsZShpbmZvLCByeCk7CiAJCX0gZWxzZSBpZihyeCAmIFVSWF9GUkFNRV9FUlJPUikgewotCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9GUkFNRTsKKwkJCWZsYWcgPSBUVFlfRlJBTUU7CiAJCQlzdGF0dXNfaGFuZGxlKGluZm8sIHJ4KTsKLQkJfSBlbHNlIHsKLQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSAwOyAvKiBYWFggKi8KIAkJfQotICAgICAgICAgICAgICAgICp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSBjaDsKLQkJdHR5LT5mbGlwLmNvdW50Kys7Ci0KKwkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgZmxhZyk7CiAjaWZuZGVmIENPTkZJR19YQ09QSUxPVF9CVUdTCiAJfSB3aGlsZSgocnggPSB1YXJ0LT51cngudykgJiBVUlhfREFUQV9SRUFEWSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzY4MzYwc2VyaWFsLmMgYi9kcml2ZXJzL3NlcmlhbC82ODM2MHNlcmlhbC5jCmluZGV4IDE3MGM5ZDIuLjYwZjVhNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzY4MzYwc2VyaWFsLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvNjgzNjBzZXJpYWwuYwpAQCAtMzk0LDcgKzM5NCw3IEBACiBzdGF0aWMgX0lOTElORV8gdm9pZCByZWNlaXZlX2NoYXJzKHNlcl9pbmZvX3QgKmluZm8pCiB7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKLQl1bnNpZ25lZCBjaGFyIGNoLCAqY3A7CisJdW5zaWduZWQgY2hhciBjaCwgZmxhZywgKmNwOwogCS8qaW50CWlnbm9yZWQgPSAwOyovCiAJaW50CWk7CiAJdXNob3J0CXN0YXR1czsKQEAgLTQzOCwyNCArNDM4LDE1IEBACiAJCWNwID0gKGNoYXIgKiliZHAtPmJ1ZjsKIAkJc3RhdHVzID0gYmRwLT5zdGF0dXM7CiAKLQkJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIHJvb20gaW4gdGhlIHR0eSBidWZmZXIgZm9yCi0JCSAqIHRoZSBjaGFyYWN0ZXJzIGluIG91ciBCRCBidWZmZXIuICBJZiBub3QsIHdlIGV4aXQKLQkJICogbm93LCBsZWF2aW5nIHRoZSBCRCB3aXRoIHRoZSBjaGFyYWN0ZXJzLiAgV2UnbGwgcGljawotCQkgKiB0aGVtIHVwIGFnYWluIG9uIHRoZSBuZXh0IHJlY2VpdmUgaW50ZXJydXB0ICh3aGljaCBjb3VsZAotCQkgKiBiZSBhIHRpbWVvdXQpLgotCQkgKi8KLQkJaWYgKCh0dHktPmZsaXAuY291bnQgKyBpKSA+PSBUVFlfRkxJUEJVRl9TSVpFKQotCQkJYnJlYWs7Ci0KIAkJd2hpbGUgKGktLSA+IDApIHsKIAkJCWNoID0gKmNwKys7Ci0JCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciA9IGNoOwogCQkJaWNvdW50LT5yeCsrOwogCiAjaWZkZWYgU0VSSUFMX0RFQlVHX0lOVFIKIAkJCXByaW50aygiRFIlMDJ4OiUwMnguLi4iLCBjaCwgc3RhdHVzKTsKICNlbmRpZgotCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSAwOworCQkJZmxhZyA9IFRUWV9OT1JNQUw7CisKIAkJCWlmIChzdGF0dXMgJiAoQkRfU0NfQlIgfCBCRF9TQ19GUiB8CiAJCQkJICAgICAgIEJEX1NDX1BSIHwgQkRfU0NfT1YpKSB7CiAJCQkJLyoKQEAgLTQ5MCwzMCArNDgxLDE4IEBACiAJCQkJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX1NBSykKIAkJCQkJCWRvX1NBSyh0dHkpOwogCQkJCX0gZWxzZSBpZiAoc3RhdHVzICYgQkRfU0NfUFIpCi0JCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX1BBUklUWTsKKwkJCQkJZmxhZyA9IFRUWV9QQVJJVFk7CiAJCQkJZWxzZSBpZiAoc3RhdHVzICYgQkRfU0NfRlIpCi0JCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX0ZSQU1FOwotCQkJCWlmIChzdGF0dXMgJiBCRF9TQ19PVikgewotCQkJCQkvKgotCQkJCQkgKiBPdmVycnVuIGlzIHNwZWNpYWwsIHNpbmNlIGl0J3MKLQkJCQkJICogcmVwb3J0ZWQgaW1tZWRpYXRlbHksIGFuZCBkb2Vzbid0Ci0JCQkJCSAqIGFmZmVjdCB0aGUgY3VycmVudCBjaGFyYWN0ZXIKLQkJCQkJICovCi0JCQkJCWlmICh0dHktPmZsaXAuY291bnQgPCBUVFlfRkxJUEJVRl9TSVpFKSB7Ci0JCQkJCQl0dHktPmZsaXAuY291bnQrKzsKLQkJCQkJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKzsKLQkJCQkJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKzsKLQkJCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0KLQkJCQkJCQkJVFRZX09WRVJSVU47Ci0JCQkJCX0KLQkJCQl9CisJCQkJCWZsYWcgPSBUVFlfRlJBTUU7CiAJCQl9Ci0JCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpCi0JCQkJYnJlYWs7Ci0KLQkJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKzsKLQkJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKzsKLQkJCXR0eS0+ZmxpcC5jb3VudCsrOworCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgZmxhZyk7CisJCQlpZiAoc3RhdHVzICYgQkRfU0NfT1YpCisJCQkJLyoKKwkJCQkgKiBPdmVycnVuIGlzIHNwZWNpYWwsIHNpbmNlIGl0J3MKKwkJCQkgKiByZXBvcnRlZCBpbW1lZGlhdGVseSwgYW5kIGRvZXNuJ3QKKwkJCQkgKiBhZmZlY3QgdGhlIGN1cnJlbnQgY2hhcmFjdGVyCisJCQkJICovCisJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTik7CiAJCX0KIAogCQkvKiBUaGlzIEJEIGlzIHJlYWR5IHRvIGJlIHVzZWQgYWdhaW4uICBDbGVhciBzdGF0dXMuCkBAIC01NDEsMTIgKzUyMCw3IEBACiAJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIHJvb20gaW4gdGhlIHR0eSBidWZmZXIgZm9yCiAJICogdGhlIGJyZWFrLiAgSWYgbm90LCB3ZSBleGl0IG5vdywgbG9zaW5nIHRoZSBicmVhay4gIEZJWE1FCiAJICovCi0JaWYgKCh0dHktPmZsaXAuY291bnQgKyAxKSA+PSBUVFlfRkxJUEJVRl9TSVpFKQotCQlyZXR1cm47Ci0JKih0dHktPmZsaXAuZmxhZ19idWZfcHRyKyspID0gVFRZX0JSRUFLOwotCSoodHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrKSA9IDA7Ci0JdHR5LT5mbGlwLmNvdW50Kys7Ci0KKwl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9CUkVBSyk7CiAJc2NoZWR1bGVfd29yaygmdHR5LT5mbGlwLndvcmspOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwLmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwLmMKaW5kZXggZDJiY2QxZi4uYmMzNmVkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTAuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8bGludXgvbm1pLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTU0LDYgKzU1LDggQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIGludCBzaGFyZV9pcnFzID0gU0VSSUFMODI1MF9TSEFSRV9JUlFTOwogCitzdGF0aWMgdW5zaWduZWQgaW50IG5yX3VhcnRzID0gQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM7CisKIC8qCiAgKiBEZWJ1Z2dpbmcuCiAgKi8KQEAgLTI5Niw3ICsyOTksNyBAQAogCiAjZW5kaWYKIAotc3RhdGljIF9JTkxJTkVfIHVuc2lnbmVkIGludCBzZXJpYWxfaW4oc3RydWN0IHVhcnRfODI1MF9wb3J0ICp1cCwgaW50IG9mZnNldCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2VyaWFsX2luKHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXAsIGludCBvZmZzZXQpCiB7CiAJb2Zmc2V0ID0gbWFwXzgyNTBfaW5fcmVnKHVwLCBvZmZzZXQpIDw8IHVwLT5wb3J0LnJlZ3NoaWZ0OwogCkBAIC0zMjEsNyArMzI0LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBfSU5MSU5FXyB2b2lkCitzdGF0aWMgdm9pZAogc2VyaWFsX291dChzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwLCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCiB7CiAJb2Zmc2V0ID0gbWFwXzgyNTBfb3V0X3JlZyh1cCwgb2Zmc2V0KSA8PCB1cC0+cG9ydC5yZWdzaGlmdDsKQEAgLTExMzEsNyArMTEzNCw3IEBACiAJc2VyaWFsX291dCh1cCwgVUFSVF9JRVIsIHVwLT5pZXIpOwogfQogCi1zdGF0aWMgX0lOTElORV8gdm9pZAorc3RhdGljIHZvaWQKIHJlY2VpdmVfY2hhcnMoc3RydWN0IHVhcnRfODI1MF9wb3J0ICp1cCwgaW50ICpzdGF0dXMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSB1cC0+cG9ydC5pbmZvLT50dHk7CkBAIC0xMTQwLDE5ICsxMTQzLDYgQEAKIAljaGFyIGZsYWc7CiAKIAlkbyB7Ci0JCS8qIFRoZSBmb2xsb3dpbmcgaXMgbm90IGFsbG93ZWQgYnkgdGhlIHR0eSBsYXllciBhbmQKLQkJICAgdW5zYWZlLiBJdCBzaG91bGQgYmUgZml4ZWQgQVNBUCAqLwotCQlpZiAodW5saWtlbHkodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpKSB7Ci0JCQlpZiAodHR5LT5sb3dfbGF0ZW5jeSkgewotCQkJCXNwaW5fdW5sb2NrKCZ1cC0+cG9ydC5sb2NrKTsKLQkJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCQkJCXNwaW5fbG9jaygmdXAtPnBvcnQubG9jayk7Ci0JCQl9Ci0JCQkvKgotCQkJICogSWYgdGhpcyBmYWlsZWQgdGhlbiB3ZSB3aWxsIHRocm93IGF3YXkgdGhlCi0JCQkgKiBieXRlcyBidXQgbXVzdCBkbyBzbyB0byBjbGVhciBpbnRlcnJ1cHRzCi0JCQkgKi8KLQkJfQogCQljaCA9IHNlcmlhbF9pbnAodXAsIFVBUlRfUlgpOwogCQlmbGFnID0gVFRZX05PUk1BTDsKIAkJdXAtPnBvcnQuaWNvdW50LnJ4Kys7CkBAIC0xMjE3LDcgKzEyMDcsNyBAQAogCSpzdGF0dXMgPSBsc3I7CiB9CiAKLXN0YXRpYyBfSU5MSU5FXyB2b2lkIHRyYW5zbWl0X2NoYXJzKHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXApCitzdGF0aWMgdm9pZCB0cmFuc21pdF9jaGFycyhzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwKQogewogCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZ1cC0+cG9ydC5pbmZvLT54bWl0OwogCWludCBjb3VudDsKQEAgLTEyNTUsMjUgKzEyNDUsMjQgQEAKIAkJX19zdG9wX3R4KHVwKTsKIH0KIAotc3RhdGljIF9JTkxJTkVfIHZvaWQgY2hlY2tfbW9kZW1fc3RhdHVzKHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXApCitzdGF0aWMgdW5zaWduZWQgaW50IGNoZWNrX21vZGVtX3N0YXR1cyhzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwKQogewotCWludCBzdGF0dXM7CisJdW5zaWduZWQgaW50IHN0YXR1cyA9IHNlcmlhbF9pbih1cCwgVUFSVF9NU1IpOwogCi0Jc3RhdHVzID0gc2VyaWFsX2luKHVwLCBVQVJUX01TUik7CisJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0FOWV9ERUxUQSAmJiB1cC0+aWVyICYgVUFSVF9JRVJfTVNJKSB7CisJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9URVJJKQorCQkJdXAtPnBvcnQuaWNvdW50LnJuZysrOworCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERTUikKKwkJCXVwLT5wb3J0Lmljb3VudC5kc3IrKzsKKwkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0REQ0QpCisJCQl1YXJ0X2hhbmRsZV9kY2RfY2hhbmdlKCZ1cC0+cG9ydCwgc3RhdHVzICYgVUFSVF9NU1JfRENEKTsKKwkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDVFMpCisJCQl1YXJ0X2hhbmRsZV9jdHNfY2hhbmdlKCZ1cC0+cG9ydCwgc3RhdHVzICYgVUFSVF9NU1JfQ1RTKTsKIAotCWlmICgoc3RhdHVzICYgVUFSVF9NU1JfQU5ZX0RFTFRBKSA9PSAwKQotCQlyZXR1cm47CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdXAtPnBvcnQuaW5mby0+ZGVsdGFfbXNyX3dhaXQpOworCX0KIAotCWlmIChzdGF0dXMgJiBVQVJUX01TUl9URVJJKQotCQl1cC0+cG9ydC5pY291bnQucm5nKys7Ci0JaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0REU1IpCi0JCXVwLT5wb3J0Lmljb3VudC5kc3IrKzsKLQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERDRCkKLQkJdWFydF9oYW5kbGVfZGNkX2NoYW5nZSgmdXAtPnBvcnQsIHN0YXR1cyAmIFVBUlRfTVNSX0RDRCk7Ci0JaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDVFMpCi0JCXVhcnRfaGFuZGxlX2N0c19jaGFuZ2UoJnVwLT5wb3J0LCBzdGF0dXMgJiBVQVJUX01TUl9DVFMpOwotCi0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ1cC0+cG9ydC5pbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisJcmV0dXJuIHN0YXR1czsKIH0KIAogLyoKQEAgLTEyODIsNyArMTI3MSwxMSBAQAogc3RhdGljIGlubGluZSB2b2lkCiBzZXJpYWw4MjUwX2hhbmRsZV9wb3J0KHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXVuc2lnbmVkIGludCBzdGF0dXMgPSBzZXJpYWxfaW5wKHVwLCBVQVJUX0xTUik7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXNwaW5fbG9jaygmdXAtPnBvcnQubG9jayk7CisKKwlzdGF0dXMgPSBzZXJpYWxfaW5wKHVwLCBVQVJUX0xTUik7CiAKIAlERUJVR19JTlRSKCJzdGF0dXMgPSAleC4uLiIsIHN0YXR1cyk7CiAKQEAgLTEyOTEsNiArMTI4NCw4IEBACiAJY2hlY2tfbW9kZW1fc3RhdHVzKHVwKTsKIAlpZiAoc3RhdHVzICYgVUFSVF9MU1JfVEhSRSkKIAkJdHJhbnNtaXRfY2hhcnModXApOworCisJc3Bpbl91bmxvY2soJnVwLT5wb3J0LmxvY2spOwogfQogCiAvKgpAQCAtMTMyNiw5ICsxMzIxLDcgQEAKIAogCQlpaXIgPSBzZXJpYWxfaW4odXAsIFVBUlRfSUlSKTsKIAkJaWYgKCEoaWlyICYgVUFSVF9JSVJfTk9fSU5UKSkgewotCQkJc3Bpbl9sb2NrKCZ1cC0+cG9ydC5sb2NrKTsKIAkJCXNlcmlhbDgyNTBfaGFuZGxlX3BvcnQodXAsIHJlZ3MpOwotCQkJc3Bpbl91bmxvY2soJnVwLT5wb3J0LmxvY2spOwogCiAJCQloYW5kbGVkID0gMTsKIApAQCAtMTQyNywxMSArMTQyMCw4IEBACiAJdW5zaWduZWQgaW50IGlpcjsKIAogCWlpciA9IHNlcmlhbF9pbih1cCwgVUFSVF9JSVIpOwotCWlmICghKGlpciAmIFVBUlRfSUlSX05PX0lOVCkpIHsKLQkJc3Bpbl9sb2NrKCZ1cC0+cG9ydC5sb2NrKTsKKwlpZiAoIShpaXIgJiBVQVJUX0lJUl9OT19JTlQpKQogCQlzZXJpYWw4MjUwX2hhbmRsZV9wb3J0KHVwLCBOVUxMKTsKLQkJc3Bpbl91bmxvY2soJnVwLT5wb3J0LmxvY2spOwotCX0KIAogCXRpbWVvdXQgPSB1cC0+cG9ydC50aW1lb3V0OwogCXRpbWVvdXQgPSB0aW1lb3V0ID4gNiA/ICh0aW1lb3V0IC8gMiAtIDIpIDogMTsKQEAgLTE0NTQsMTAgKzE0NDQsMTAgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2VyaWFsODI1MF9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwID0gKHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqKXBvcnQ7Ci0JdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgaW50IHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgcmV0OwogCi0Jc3RhdHVzID0gc2VyaWFsX2luKHVwLCBVQVJUX01TUik7CisJc3RhdHVzID0gY2hlY2tfbW9kZW1fc3RhdHVzKHVwKTsKIAogCXJldCA9IDA7CiAJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDRCkKQEAgLTIxMTgsNyArMjEwOCw3IEBACiAJCXJldHVybjsKIAlmaXJzdCA9IDA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgVUFSVF9OUjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IG5yX3VhcnRzOyBpKyspIHsKIAkJc3RydWN0IHVhcnRfODI1MF9wb3J0ICp1cCA9ICZzZXJpYWw4MjUwX3BvcnRzW2ldOwogCiAJCXVwLT5wb3J0LmxpbmUgPSBpOwpAQCAtMjEzNyw3ICsyMTI3LDcgQEAKIAl9CiAKIAlmb3IgKGkgPSAwLCB1cCA9IHNlcmlhbDgyNTBfcG9ydHM7Ci0JICAgICBpIDwgQVJSQVlfU0laRShvbGRfc2VyaWFsX3BvcnQpICYmIGkgPCBVQVJUX05SOworCSAgICAgaSA8IEFSUkFZX1NJWkUob2xkX3NlcmlhbF9wb3J0KSAmJiBpIDwgbnJfdWFydHM7CiAJICAgICBpKyssIHVwKyspIHsKIAkJdXAtPnBvcnQuaW9iYXNlICAgPSBvbGRfc2VyaWFsX3BvcnRbaV0ucG9ydDsKIAkJdXAtPnBvcnQuaXJxICAgICAgPSBpcnFfY2Fub25pY2FsaXplKG9sZF9zZXJpYWxfcG9ydFtpXS5pcnEpOwpAQCAtMjE1OSw3ICsyMTQ5LDcgQEAKIAogCXNlcmlhbDgyNTBfaXNhX2luaXRfcG9ydHMoKTsKIAotCWZvciAoaSA9IDA7IGkgPCBVQVJUX05SOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfdWFydHM7IGkrKykgewogCQlzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwID0gJnNlcmlhbDgyNTBfcG9ydHNbaV07CiAKIAkJdXAtPnBvcnQuZGV2ID0gZGV2OwpAQCAtMjI2Miw3ICsyMjUyLDcgQEAKIAkgKiBpZiBzbywgc2VhcmNoIGZvciB0aGUgZmlyc3QgYXZhaWxhYmxlIHBvcnQgdGhhdCBkb2VzIGhhdmUKIAkgKiBjb25zb2xlIHN1cHBvcnQuCiAJICovCi0JaWYgKGNvLT5pbmRleCA+PSBVQVJUX05SKQorCWlmIChjby0+aW5kZXggPj0gbnJfdWFydHMpCiAJCWNvLT5pbmRleCA9IDA7CiAJcG9ydCA9ICZzZXJpYWw4MjUwX3BvcnRzW2NvLT5pbmRleF0ucG9ydDsKIAlpZiAoIXBvcnQtPmlvYmFzZSAmJiAhcG9ydC0+bWVtYmFzZSkKQEAgLTIyOTgsMTEgKzIyODgsOSBAQAogCWludCBsaW5lOwogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQ7CiAKLQlmb3IgKGxpbmUgPSAwOyBsaW5lIDwgVUFSVF9OUjsgbGluZSsrKSB7CisJZm9yIChsaW5lID0gMDsgbGluZSA8IG5yX3VhcnRzOyBsaW5lKyspIHsKIAkJcG9ydCA9ICZzZXJpYWw4MjUwX3BvcnRzW2xpbmVdLnBvcnQ7Ci0JCWlmIChwLT5pb3R5cGUgPT0gcG9ydC0+aW90eXBlICYmCi0JCSAgICBwLT5pb2Jhc2UgPT0gcG9ydC0+aW9iYXNlICYmCi0JCSAgICBwLT5tZW1iYXNlID09IHBvcnQtPm1lbWJhc2UpCisJCWlmICh1YXJ0X21hdGNoX3BvcnQocCwgcG9ydCkpCiAJCQlyZXR1cm4gbGluZTsKIAl9CiAJcmV0dXJuIC1FTk9ERVY7CkBAIC0yNDIyLDcgKzI0MTAsNyBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFVBUlRfTlI7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBucl91YXJ0czsgaSsrKSB7CiAJCXN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXAgPSAmc2VyaWFsODI1MF9wb3J0c1tpXTsKIAogCQlpZiAodXAtPnBvcnQuZGV2ID09ICZkZXYtPmRldikKQEAgLTI0NjYsNiArMjQ1NCw3IEBACiAJLnJlc3VtZQkJPSBzZXJpYWw4MjUwX3Jlc3VtZSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAic2VyaWFsODI1MCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCiB9OwogCkBAIC0yNDgwLDcgKzI0NjksNyBAQAogICogMTZ4NTAgc2VyaWFsIHBvcnRzIHRvIGJlIGNvbmZpZ3VyZWQgYXQgcnVuLXRpbWUsIHRvIHN1cHBvcnQgUENNQ0lBCiAgKiBtb2RlbXMgYW5kIFBDSSBtdWx0aXBvcnQgY2FyZHMuCiAgKi8KLXN0YXRpYyBERUNMQVJFX01VVEVYKHNlcmlhbF9zZW0pOworc3RhdGljIERFRklORV9NVVRFWChzZXJpYWxfbXV0ZXgpOwogCiBzdGF0aWMgc3RydWN0IHVhcnRfODI1MF9wb3J0ICpzZXJpYWw4MjUwX2ZpbmRfbWF0Y2hfb3JfdW51c2VkKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CkBAIC0yNDg5LDcgKzI0NzgsNyBAQAogCS8qCiAJICogRmlyc3QsIGZpbmQgYSBwb3J0IGVudHJ5IHdoaWNoIG1hdGNoZXMuCiAJICovCi0JZm9yIChpID0gMDsgaSA8IFVBUlRfTlI7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgbnJfdWFydHM7IGkrKykKIAkJaWYgKHVhcnRfbWF0Y2hfcG9ydCgmc2VyaWFsODI1MF9wb3J0c1tpXS5wb3J0LCBwb3J0KSkKIAkJCXJldHVybiAmc2VyaWFsODI1MF9wb3J0c1tpXTsKIApAQCAtMjQ5OCw3ICsyNDg3LDcgQEAKIAkgKiBmcmVlIGVudHJ5LiAgV2UgbG9vayBmb3Igb25lIHdoaWNoIGhhc24ndCBiZWVuIHByZXZpb3VzbHkKIAkgKiB1c2VkIChpbmRpY2F0ZWQgYnkgemVybyBpb2Jhc2UpLgogCSAqLwotCWZvciAoaSA9IDA7IGkgPCBVQVJUX05SOyBpKyspCisJZm9yIChpID0gMDsgaSA8IG5yX3VhcnRzOyBpKyspCiAJCWlmIChzZXJpYWw4MjUwX3BvcnRzW2ldLnBvcnQudHlwZSA9PSBQT1JUX1VOS05PV04gJiYKIAkJICAgIHNlcmlhbDgyNTBfcG9ydHNbaV0ucG9ydC5pb2Jhc2UgPT0gMCkKIAkJCXJldHVybiAmc2VyaWFsODI1MF9wb3J0c1tpXTsKQEAgLTI1MDcsNyArMjQ5Niw3IEBACiAJICogVGhhdCBhbHNvIGZhaWxlZC4gIExhc3QgcmVzb3J0IGlzIHRvIGZpbmQgYW55IGVudHJ5IHdoaWNoCiAJICogZG9lc24ndCBoYXZlIGEgcmVhbCBwb3J0IGFzc29jaWF0ZWQgd2l0aCBpdC4KIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgVUFSVF9OUjsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBucl91YXJ0czsgaSsrKQogCQlpZiAoc2VyaWFsODI1MF9wb3J0c1tpXS5wb3J0LnR5cGUgPT0gUE9SVF9VTktOT1dOKQogCQkJcmV0dXJuICZzZXJpYWw4MjUwX3BvcnRzW2ldOwogCkBAIC0yNTM1LDcgKzI1MjQsNyBAQAogCWlmIChwb3J0LT51YXJ0Y2xrID09IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZG93bigmc2VyaWFsX3NlbSk7CisJbXV0ZXhfbG9jaygmc2VyaWFsX211dGV4KTsKIAogCXVhcnQgPSBzZXJpYWw4MjUwX2ZpbmRfbWF0Y2hfb3JfdW51c2VkKHBvcnQpOwogCWlmICh1YXJ0KSB7CkBAIC0yNTU3LDcgKzI1NDYsNyBAQAogCQlpZiAocmV0ID09IDApCiAJCQlyZXQgPSB1YXJ0LT5wb3J0LmxpbmU7CiAJfQotCXVwKCZzZXJpYWxfc2VtKTsKKwltdXRleF91bmxvY2soJnNlcmlhbF9tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjU3NCw3ICsyNTYzLDcgQEAKIHsKIAlzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVhcnQgPSAmc2VyaWFsODI1MF9wb3J0c1tsaW5lXTsKIAotCWRvd24oJnNlcmlhbF9zZW0pOworCW11dGV4X2xvY2soJnNlcmlhbF9tdXRleCk7CiAJdWFydF9yZW1vdmVfb25lX3BvcnQoJnNlcmlhbDgyNTBfcmVnLCAmdWFydC0+cG9ydCk7CiAJaWYgKHNlcmlhbDgyNTBfaXNhX2RldnMpIHsKIAkJdWFydC0+cG9ydC5mbGFncyAmPSB+VVBGX0JPT1RfQVVUT0NPTkY7CkBAIC0yNTg0LDcgKzI1NzMsNyBAQAogCX0gZWxzZSB7CiAJCXVhcnQtPnBvcnQuZGV2ID0gTlVMTDsKIAl9Ci0JdXAoJnNlcmlhbF9zZW0pOworCW11dGV4X3VubG9jaygmc2VyaWFsX211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0woc2VyaWFsODI1MF91bnJlZ2lzdGVyX3BvcnQpOwogCkBAIC0yNTkyLDggKzI1ODEsMTEgQEAKIHsKIAlpbnQgcmV0LCBpOwogCisJaWYgKG5yX3VhcnRzID4gVUFSVF9OUikKKwkJbnJfdWFydHMgPSBVQVJUX05SOworCiAJcHJpbnRrKEtFUk5fSU5GTyAiU2VyaWFsOiA4MjUwLzE2NTUwIGRyaXZlciAkUmV2aXNpb246IDEuOTAgJCAiCi0JCSIlZCBwb3J0cywgSVJRIHNoYXJpbmcgJXNhYmxlZFxuIiwgKGludCkgVUFSVF9OUiwKKwkJIiVkIHBvcnRzLCBJUlEgc2hhcmluZyAlc2FibGVkXG4iLCBucl91YXJ0cywKIAkJc2hhcmVfaXJxcyA/ICJlbiIgOiAiZGlzIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTlJfSVJRUzsgaSsrKQpAQCAtMjYwMywyMSArMjU5NSwyNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0Jc2VyaWFsODI1MF9pc2FfZGV2cyA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInNlcmlhbDgyNTAiLAotCQkJCQkgUExBVDgyNTBfREVWX0xFR0FDWSwgTlVMTCwgMCk7Ci0JaWYgKElTX0VSUihzZXJpYWw4MjUwX2lzYV9kZXZzKSkgewotCQlyZXQgPSBQVFJfRVJSKHNlcmlhbDgyNTBfaXNhX2RldnMpOwotCQlnb3RvIHVucmVnOworCXNlcmlhbDgyNTBfaXNhX2RldnMgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInNlcmlhbDgyNTAiLAorCQkJCQkJICAgIFBMQVQ4MjUwX0RFVl9MRUdBQ1kpOworCWlmICghc2VyaWFsODI1MF9pc2FfZGV2cykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHVucmVnX3VhcnRfZHJ2OwogCX0KIAorCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQoc2VyaWFsODI1MF9pc2FfZGV2cyk7CisJaWYgKHJldCkKKwkJZ290byBwdXRfZGV2OworCiAJc2VyaWFsODI1MF9yZWdpc3Rlcl9wb3J0cygmc2VyaWFsODI1MF9yZWcsICZzZXJpYWw4MjUwX2lzYV9kZXZzLT5kZXYpOwogCiAJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzZXJpYWw4MjUwX2lzYV9kcml2ZXIpOwogCWlmIChyZXQgPT0gMCkKIAkJZ290byBvdXQ7CiAKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihzZXJpYWw4MjUwX2lzYV9kZXZzKTsKLSB1bnJlZzoKKwlwbGF0Zm9ybV9kZXZpY2VfZGVsKHNlcmlhbDgyNTBfaXNhX2RldnMpOworIHB1dF9kZXY6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChzZXJpYWw4MjUwX2lzYV9kZXZzKTsKKyB1bnJlZ191YXJ0X2RydjoKIAl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZzZXJpYWw4MjUwX3JlZyk7CiAgb3V0OgogCXJldHVybiByZXQ7CkBAIC0yNjUzLDYgKzI2NTEsOSBAQAogTU9EVUxFX1BBUk1fREVTQyhzaGFyZV9pcnFzLCAiU2hhcmUgSVJRcyB3aXRoIG90aGVyIG5vbi04MjUwLzE2eDUwIGRldmljZXMiCiAJIiAodW5zYWZlKSIpOwogCittb2R1bGVfcGFyYW0obnJfdWFydHMsIHVpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhucl91YXJ0cywgIk1heGltdW0gbnVtYmVyIG9mIFVBUlRzIHN1cHBvcnRlZC4gKDEtIiBfX01PRFVMRV9TVFJJTkcoQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTKSAiKSIpOworCiAjaWZkZWYgQ09ORklHX1NFUklBTF84MjUwX1JTQQogbW9kdWxlX3BhcmFtX2FycmF5KHByb2JlX3JzYSwgdWxvbmcsICZwcm9iZV9yc2FfY291bnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhwcm9iZV9yc2EsICJQcm9iZSBJL08gcG9ydHMgZm9yIFJTQSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MC5oIGIvZHJpdmVycy9zZXJpYWwvODI1MC5oCmluZGV4IGE2MDdiOTguLjQ5MDYwNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTAuaAorKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwLmgKQEAgLTUxLDEyICs1MSw2IEBACiAjZGVmaW5lIFVBUlRfQlVHX1RYRU4JKDEgPDwgMSkJLyogVUFSVCBoYXMgYnVnZ3kgVFggSUlSIHN0YXR1cyAqLwogI2RlZmluZSBVQVJUX0JVR19OT01TUgkoMSA8PCAyKQkvKiBVQVJUIGhhcyBidWdneSBNU1Igc3RhdHVzIGJpdHMgKEF1MXgwMCkgKi8KIAotI2lmIGRlZmluZWQoX19pMzg2X18pICYmIChkZWZpbmVkKENPTkZJR19NMzg2KSB8fCBkZWZpbmVkKENPTkZJR19NNDg2KSkKLSNkZWZpbmUgX0lOTElORV8gaW5saW5lCi0jZWxzZQotI2RlZmluZSBfSU5MSU5FXwotI2VuZGlmCi0KICNkZWZpbmUgUFJPQkVfUlNBCSgxIDw8IDApCiAjZGVmaW5lIFBST0JFX0FOWQkofjApCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzgyNTBfYWNwaS5jIGIvZHJpdmVycy9zZXJpYWwvODI1MF9hY3BpLmMKaW5kZXggYTgwMmJkYy4uODA5Zjg5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MF9hY3BpLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvODI1MF9hY3BpLmMKQEAgLTI3LDcgKzI3LDcgQEAKIHN0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3NlcmlhbF9tbWlvKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCiAJCQkJICAgIHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCAqYWRkcikKIHsKLQlwb3J0LT5tYXBiYXNlID0gYWRkci0+bWluX2FkZHJlc3NfcmFuZ2U7CisJcG9ydC0+bWFwYmFzZSA9IGFkZHItPm1pbmltdW07CiAJcG9ydC0+aW90eXBlID0gVVBJT19NRU07CiAJcG9ydC0+ZmxhZ3MgfD0gVVBGX0lPUkVNQVA7CiAJcmV0dXJuIEFFX09LOwpAQCAtMzYsOCArMzYsOCBAQAogc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfc2VyaWFsX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwKIAkJCQkgICAgc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8gKmlvKQogewotCWlmIChpby0+cmFuZ2VfbGVuZ3RoKSB7Ci0JCXBvcnQtPmlvYmFzZSA9IGlvLT5taW5fYmFzZV9hZGRyZXNzOworCWlmIChpby0+YWRkcmVzc19sZW5ndGgpIHsKKwkJcG9ydC0+aW9iYXNlID0gaW8tPm1pbmltdW07CiAJCXBvcnQtPmlvdHlwZSA9IFVQSU9fUE9SVDsKIAl9IGVsc2UKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogemVyby1sZW5ndGggSU8gcG9ydCByYW5nZT9cbiIsIF9fRlVOQ1RJT05fXyk7CkBAIC00NSwxMyArNDUsMTMgQEAKIH0KIAogc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfc2VyaWFsX2V4dF9pcnEoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwKLQkJCQkgICAgICAgc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0X2lycSAqZXh0X2lycSkKKwkJCQkgICAgICAgc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0ZW5kZWRfaXJxICpleHRfaXJxKQogewogCWludCByYzsKIAotCWlmIChleHRfaXJxLT5udW1iZXJfb2ZfaW50ZXJydXB0cyA+IDApIHsKKwlpZiAoZXh0X2lycS0+aW50ZXJydXB0X2NvdW50ID4gMCkgewogCQlyYyA9IGFjcGlfcmVnaXN0ZXJfZ3NpKGV4dF9pcnEtPmludGVycnVwdHNbMF0sCi0JICAgICAgICAgICAgICAgICAgIGV4dF9pcnEtPmVkZ2VfbGV2ZWwsIGV4dF9pcnEtPmFjdGl2ZV9oaWdoX2xvdyk7CisJICAgICAgICAgICAgICAgICAgIGV4dF9pcnEtPnRyaWdnZXJpbmcsIGV4dF9pcnEtPnBvbGFyaXR5KTsKIAkJaWYgKHJjIDwgMCkKIAkJCXJldHVybiBBRV9FUlJPUjsKIAkJcG9ydC0+aXJxID0gcmM7CkBAIC02NCw5ICs2NCw5IEBACiB7CiAJaW50IHJjOwogCi0JaWYgKGlycS0+bnVtYmVyX29mX2ludGVycnVwdHMgPiAwKSB7CisJaWYgKGlycS0+aW50ZXJydXB0X2NvdW50ID4gMCkgewogCQlyYyA9IGFjcGlfcmVnaXN0ZXJfZ3NpKGlycS0+aW50ZXJydXB0c1swXSwKLQkgICAgICAgICAgICAgICAgICAgaXJxLT5lZGdlX2xldmVsLCBpcnEtPmFjdGl2ZV9oaWdoX2xvdyk7CisJICAgICAgICAgICAgICAgICAgIGlycS0+dHJpZ2dlcmluZywgaXJxLT5wb2xhcml0eSk7CiAJCWlmIChyYyA8IDApCiAJCQlyZXR1cm4gQUVfRVJST1I7CiAJCXBvcnQtPmlycSA9IHJjOwpAQCAtODMsMTEgKzgzLDExIEBACiAJc3RhdHVzID0gYWNwaV9yZXNvdXJjZV90b19hZGRyZXNzNjQocmVzLCAmYWRkcik7CiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQogCQlyZXR1cm4gYWNwaV9zZXJpYWxfbW1pbyhwb3J0LCAmYWRkcik7Ci0JZWxzZSBpZiAocmVzLT5pZCA9PSBBQ1BJX1JTVFlQRV9JTykKKwllbHNlIGlmIChyZXMtPnR5cGUgPT0gQUNQSV9SRVNPVVJDRV9UWVBFX0lPKQogCQlyZXR1cm4gYWNwaV9zZXJpYWxfcG9ydChwb3J0LCAmcmVzLT5kYXRhLmlvKTsKLQllbHNlIGlmIChyZXMtPmlkID09IEFDUElfUlNUWVBFX0VYVF9JUlEpCisJZWxzZSBpZiAocmVzLT50eXBlID09IEFDUElfUkVTT1VSQ0VfVFlQRV9FWFRFTkRFRF9JUlEpCiAJCXJldHVybiBhY3BpX3NlcmlhbF9leHRfaXJxKHBvcnQsICZyZXMtPmRhdGEuZXh0ZW5kZWRfaXJxKTsKLQllbHNlIGlmIChyZXMtPmlkID09IEFDUElfUlNUWVBFX0lSUSkKKwllbHNlIGlmIChyZXMtPnR5cGUgPT0gQUNQSV9SRVNPVVJDRV9UWVBFX0lSUSkKIAkJcmV0dXJuIGFjcGlfc2VyaWFsX2lycShwb3J0LCAmcmVzLT5kYXRhLmlycSk7CiAJcmV0dXJuIEFFX09LOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9wY2kuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfcGNpLmMKaW5kZXggOGFkY2EwYy4uMmE5MTIxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MF9wY2kuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwX3BjaS5jCkBAIC04MzcsOCArODM3LDggQEAKIAlyZXR1cm4gcXVpcms7CiB9CiAKLXN0YXRpYyBfSU5MSU5FXyBpbnQKLWdldF9wY2lfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBwY2lzZXJpYWxfYm9hcmQgKmJvYXJkKQorc3RhdGljIGlubGluZSBpbnQgZ2V0X3BjaV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQlzdHJ1Y3QgcGNpc2VyaWFsX2JvYXJkICpib2FyZCkKIHsKIAlpZiAoYm9hcmQtPmZsYWdzICYgRkxfTk9JUlEpCiAJCXJldHVybiAwOwpAQCAtODUzLDE0ICs4NTMsMTUgQEAKICAqIGRyaXZlcl9kYXRhIG1lbWJlci4KICAqCiAgKiBUaGUgbWFrZXVwIG9mIHRoZXNlIG5hbWVzIGFyZToKLSAqICBwYm5fYm57X2J0fV9uX2JhdWQKKyAqICBwYm5fYm57X2J0fV9uX2JhdWR7X29mZnNldGluaGV4fQogICoKLSAqICBibiAgID0gUENJIEJBUiBudW1iZXIKLSAqICBidCAgID0gSW5kZXggdXNpbmcgUENJIEJBUnMKLSAqICBuICAgID0gbnVtYmVyIG9mIHNlcmlhbCBwb3J0cwotICogIGJhdWQgPSBiYXVkIHJhdGUKKyAqICBibgkJPSBQQ0kgQkFSIG51bWJlcgorICogIGJ0CQk9IEluZGV4IHVzaW5nIFBDSSBCQVJzCisgKiAgbgkJPSBudW1iZXIgb2Ygc2VyaWFsIHBvcnRzCisgKiAgYmF1ZAk9IGJhdWQgcmF0ZQorICogIG9mZnNldGluaGV4CT0gb2Zmc2V0IGZvciBlYWNoIHNlcXVlbnRpYWwgcG9ydCAoaW4gaGV4KQogICoKLSAqIFRoaXMgdGFibGUgaXMgc29ydGVkIGJ5IChpbiBvcmRlcik6IGJhdWQsIGJ0LCBibiwgbi4KKyAqIFRoaXMgdGFibGUgaXMgc29ydGVkIGJ5IChpbiBvcmRlcik6IGJuLCBidCwgYmF1ZCwgb2Zmc2V0aW5kZXgsIG4uCiAgKgogICogUGxlYXNlIG5vdGU6IGluIHRoZW9yeSBpZiBuID0gMSwgX2J0IGluZml4IHNob3VsZCBtYWtlIG5vIGRpZmZlcmVuY2UuCiAgKiBpZSwgcGJuX2IwXzFfMTE1MjAwIGlzIHRoZSBzYW1lIGFzIHBibl9iMF9idF8xXzExNTIwMApAQCAtODgxLDYgKzg4MiwxMyBAQAogCiAJcGJuX2IwXzRfMTE1MjAwMCwKIAorCXBibl9iMF8yXzE4NDMyMDAsCisJcGJuX2IwXzRfMTg0MzIwMCwKKworCXBibl9iMF8yXzE4NDMyMDBfMjAwLAorCXBibl9iMF80XzE4NDMyMDBfMjAwLAorCXBibl9iMF84XzE4NDMyMDBfMjAwLAorCiAJcGJuX2IwX2J0XzFfMTE1MjAwLAogCXBibl9iMF9idF8yXzExNTIwMCwKIAlwYm5fYjBfYnRfOF8xMTUyMDAsCkBAIC05MDQsNiArOTEyLDggQEAKIAlwYm5fYjFfNF85MjE2MDAsCiAJcGJuX2IxXzhfOTIxNjAwLAogCisJcGJuX2IxXzJfMTI1MDAwMCwKKwogCXBibl9iMV9idF8yXzkyMTYwMCwKIAogCXBibl9iMV8xXzEzODI0MDAsCkBAIC05MzAsNiArOTQwLDcgQEAKIAlwYm5fYjJfYnRfMl85MjE2MDAsCiAJcGJuX2IyX2J0XzRfOTIxNjAwLAogCisJcGJuX2IzXzJfMTE1MjAwLAogCXBibl9iM180XzExNTIwMCwKIAlwYm5fYjNfOF8xMTUyMDAsCiAKQEAgLTEwMjksNiArMTA0MCwzOCBAQAogCQkudWFydF9vZmZzZXQJPSA4LAogCX0sCiAKKwlbcGJuX2IwXzJfMTg0MzIwMF0gPSB7CisJCS5mbGFncwkJPSBGTF9CQVNFMCwKKwkJLm51bV9wb3J0cwk9IDIsCisJCS5iYXNlX2JhdWQJPSAxODQzMjAwLAorCQkudWFydF9vZmZzZXQJPSA4LAorCX0sCisJW3Bibl9iMF80XzE4NDMyMDBdID0geworCQkuZmxhZ3MJCT0gRkxfQkFTRTAsCisJCS5udW1fcG9ydHMJPSA0LAorCQkuYmFzZV9iYXVkCT0gMTg0MzIwMCwKKwkJLnVhcnRfb2Zmc2V0CT0gOCwKKwl9LAorCisJW3Bibl9iMF8yXzE4NDMyMDBfMjAwXSA9IHsKKwkJLmZsYWdzCQk9IEZMX0JBU0UwLAorCQkubnVtX3BvcnRzCT0gMiwKKwkJLmJhc2VfYmF1ZAk9IDE4NDMyMDAsCisJCS51YXJ0X29mZnNldAk9IDB4MjAwLAorCX0sCisJW3Bibl9iMF80XzE4NDMyMDBfMjAwXSA9IHsKKwkJLmZsYWdzCQk9IEZMX0JBU0UwLAorCQkubnVtX3BvcnRzCT0gNCwKKwkJLmJhc2VfYmF1ZAk9IDE4NDMyMDAsCisJCS51YXJ0X29mZnNldAk9IDB4MjAwLAorCX0sCisJW3Bibl9iMF84XzE4NDMyMDBfMjAwXSA9IHsKKwkJLmZsYWdzCQk9IEZMX0JBU0UwLAorCQkubnVtX3BvcnRzCT0gOCwKKwkJLmJhc2VfYmF1ZAk9IDE4NDMyMDAsCisJCS51YXJ0X29mZnNldAk9IDB4MjAwLAorCX0sCisKIAlbcGJuX2IwX2J0XzFfMTE1MjAwXSA9IHsKIAkJLmZsYWdzCQk9IEZMX0JBU0UwfEZMX0JBU0VfQkFSUywKIAkJLm51bV9wb3J0cwk9IDEsCkBAIC0xMTQxLDYgKzExODQsMTIgQEAKIAkJLmJhc2VfYmF1ZAk9IDkyMTYwMCwKIAkJLnVhcnRfb2Zmc2V0CT0gOCwKIAl9LAorCVtwYm5fYjFfMl8xMjUwMDAwXSA9IHsKKwkJLmZsYWdzCQk9IEZMX0JBU0UxLAorCQkubnVtX3BvcnRzCT0gMiwKKwkJLmJhc2VfYmF1ZAk9IDEyNTAwMDAsCisJCS51YXJ0X29mZnNldAk9IDgsCisJfSwKIAogCVtwYm5fYjFfYnRfMl85MjE2MDBdID0gewogCQkuZmxhZ3MJCT0gRkxfQkFTRTF8RkxfQkFTRV9CQVJTLApAQCAtMTI2Myw2ICsxMzEyLDEyIEBACiAJCS51YXJ0X29mZnNldAk9IDgsCiAJfSwKIAorCVtwYm5fYjNfMl8xMTUyMDBdID0geworCQkuZmxhZ3MJCT0gRkxfQkFTRTMsCisJCS5udW1fcG9ydHMJPSAyLAorCQkuYmFzZV9iYXVkCT0gMTE1MjAwLAorCQkudWFydF9vZmZzZXQJPSA4LAorCX0sCiAJW3Bibl9iM180XzExNTIwMF0gPSB7CiAJCS5mbGFncwkJPSBGTF9CQVNFMywKIAkJLm51bV9wb3J0cwk9IDQsCkBAIC0xODAxLDYgKzE4NTYsNjYgQEAKIAkJUENJX1NVQlZFTkRPUl9JRF9DT05ORUNUX1RFQ0gsCiAJCVBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX0JIMDQxMTAxVjEsIDAsIDAsCiAJCXBibl9iMV80XzkyMTYwMCB9LAorCXsJUENJX1ZFTkRPUl9JRF9WMywgUENJX0RFVklDRV9JRF9WM19WMzUxLAorCQlQQ0lfU1VCVkVORE9SX0lEX0NPTk5FQ1RfVEVDSCwKKwkJUENJX1NVQkRFVklDRV9JRF9DT05ORUNUX1RFQ0hfQkgyXzIwTUhaLCAwLCAwLAorCQlwYm5fYjFfMl8xMjUwMDAwIH0sCisJewlQQ0lfVkVORE9SX0lEX09YU0VNSSwgUENJX0RFVklDRV9JRF9PWFNFTUlfMTZQQ0k5NTQsCisJCVBDSV9TVUJWRU5ET1JfSURfQ09OTkVDVF9URUNILAorCQlQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9USVRBTl8yLCAwLCAwLAorCQlwYm5fYjBfMl8xODQzMjAwIH0sCisJewlQQ0lfVkVORE9SX0lEX09YU0VNSSwgUENJX0RFVklDRV9JRF9PWFNFTUlfMTZQQ0k5NTQsCisJCVBDSV9TVUJWRU5ET1JfSURfQ09OTkVDVF9URUNILAorCQlQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9USVRBTl80LCAwLCAwLAorCQlwYm5fYjBfNF8xODQzMjAwIH0sCisJewlQQ0lfVkVORE9SX0lEX0VYQVIsIFBDSV9ERVZJQ0VfSURfRVhBUl9YUjE3QzE1MiwKKwkJUENJX1NVQlZFTkRPUl9JRF9DT05ORUNUX1RFQ0gsCisJCVBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX1BDSV9VQVJUXzJfMjMyLCAwLCAwLAorCQlwYm5fYjBfMl8xODQzMjAwXzIwMCB9LAorCXsJUENJX1ZFTkRPUl9JRF9FWEFSLCBQQ0lfREVWSUNFX0lEX0VYQVJfWFIxN0MxNTQsCisJCVBDSV9TVUJWRU5ET1JfSURfQ09OTkVDVF9URUNILAorCQlQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9QQ0lfVUFSVF80XzIzMiwgMCwgMCwKKwkJcGJuX2IwXzRfMTg0MzIwMF8yMDAgfSwKKwl7CVBDSV9WRU5ET1JfSURfRVhBUiwgUENJX0RFVklDRV9JRF9FWEFSX1hSMTdDMTU4LAorCQlQQ0lfU1VCVkVORE9SX0lEX0NPTk5FQ1RfVEVDSCwKKwkJUENJX1NVQkRFVklDRV9JRF9DT05ORUNUX1RFQ0hfUENJX1VBUlRfOF8yMzIsIDAsIDAsCisJCXBibl9iMF84XzE4NDMyMDBfMjAwIH0sCisJewlQQ0lfVkVORE9SX0lEX0VYQVIsIFBDSV9ERVZJQ0VfSURfRVhBUl9YUjE3QzE1MiwKKwkJUENJX1NVQlZFTkRPUl9JRF9DT05ORUNUX1RFQ0gsCisJCVBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX1BDSV9VQVJUXzFfMSwgMCwgMCwKKwkJcGJuX2IwXzJfMTg0MzIwMF8yMDAgfSwKKwl7CVBDSV9WRU5ET1JfSURfRVhBUiwgUENJX0RFVklDRV9JRF9FWEFSX1hSMTdDMTU0LAorCQlQQ0lfU1VCVkVORE9SX0lEX0NPTk5FQ1RfVEVDSCwKKwkJUENJX1NVQkRFVklDRV9JRF9DT05ORUNUX1RFQ0hfUENJX1VBUlRfMl8yLCAwLCAwLAorCQlwYm5fYjBfNF8xODQzMjAwXzIwMCB9LAorCXsJUENJX1ZFTkRPUl9JRF9FWEFSLCBQQ0lfREVWSUNFX0lEX0VYQVJfWFIxN0MxNTgsCisJCVBDSV9TVUJWRU5ET1JfSURfQ09OTkVDVF9URUNILAorCQlQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9QQ0lfVUFSVF80XzQsIDAsIDAsCisJCXBibl9iMF84XzE4NDMyMDBfMjAwIH0sCisJewlQQ0lfVkVORE9SX0lEX0VYQVIsIFBDSV9ERVZJQ0VfSURfRVhBUl9YUjE3QzE1MiwKKwkJUENJX1NVQlZFTkRPUl9JRF9DT05ORUNUX1RFQ0gsCisJCVBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX1BDSV9VQVJUXzIsIDAsIDAsCisJCXBibl9iMF8yXzE4NDMyMDBfMjAwIH0sCisJewlQQ0lfVkVORE9SX0lEX0VYQVIsIFBDSV9ERVZJQ0VfSURfRVhBUl9YUjE3QzE1NCwKKwkJUENJX1NVQlZFTkRPUl9JRF9DT05ORUNUX1RFQ0gsCisJCVBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX1BDSV9VQVJUXzQsIDAsIDAsCisJCXBibl9iMF80XzE4NDMyMDBfMjAwIH0sCisJewlQQ0lfVkVORE9SX0lEX0VYQVIsIFBDSV9ERVZJQ0VfSURfRVhBUl9YUjE3QzE1OCwKKwkJUENJX1NVQlZFTkRPUl9JRF9DT05ORUNUX1RFQ0gsCisJCVBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX1BDSV9VQVJUXzgsIDAsIDAsCisJCXBibl9iMF84XzE4NDMyMDBfMjAwIH0sCisJewlQQ0lfVkVORE9SX0lEX0VYQVIsIFBDSV9ERVZJQ0VfSURfRVhBUl9YUjE3QzE1MiwKKwkJUENJX1NVQlZFTkRPUl9JRF9DT05ORUNUX1RFQ0gsCisJCVBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX1BDSV9VQVJUXzJfNDg1LCAwLCAwLAorCQlwYm5fYjBfMl8xODQzMjAwXzIwMCB9LAorCXsJUENJX1ZFTkRPUl9JRF9FWEFSLCBQQ0lfREVWSUNFX0lEX0VYQVJfWFIxN0MxNTQsCisJCVBDSV9TVUJWRU5ET1JfSURfQ09OTkVDVF9URUNILAorCQlQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9QQ0lfVUFSVF80XzQ4NSwgMCwgMCwKKwkJcGJuX2IwXzRfMTg0MzIwMF8yMDAgfSwKKwl7CVBDSV9WRU5ET1JfSURfRVhBUiwgUENJX0RFVklDRV9JRF9FWEFSX1hSMTdDMTU4LAorCQlQQ0lfU1VCVkVORE9SX0lEX0NPTk5FQ1RfVEVDSCwKKwkJUENJX1NVQkRFVklDRV9JRF9DT05ORUNUX1RFQ0hfUENJX1VBUlRfOF80ODUsIDAsIDAsCisJCXBibl9iMF84XzE4NDMyMDBfMjAwIH0sCiAKIAl7CVBDSV9WRU5ET1JfSURfU0VBTEVWRUwsIFBDSV9ERVZJQ0VfSURfU0VBTEVWRUxfVTUzMCwKIAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgCkBAIC0yMTY0LDYgKzIyNzksOSBAQAogCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAogCQlwYm5fbmVjX25pbGU0IH0sCiAKKwl7CVBDSV9WRU5ET1JfSURfRENJLCBQQ0lfREVWSUNFX0lEX0RDSV9QQ0NPTTIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9iM18yXzExNTIwMCB9LAogCXsJUENJX1ZFTkRPUl9JRF9EQ0ksIFBDSV9ERVZJQ0VfSURfRENJX1BDQ09NNCwKIAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKIAkJcGJuX2IzXzRfMTE1MjAwIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9LY29uZmlnIGIvZHJpdmVycy9zZXJpYWwvS2NvbmZpZwppbmRleCA4MTJiYWU2Li45ZmQxOTI1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCkBAIC05NSw2ICs5NSwxNiBAQAogCSAgUENJIGVudW1lcmF0aW9uIGFuZCBhbnkgcG9ydHMgdGhhdCBtYXkgYmUgYWRkZWQgYXQgcnVuLXRpbWUKIAkgIHZpYSBob3QtcGx1Zywgb3IgYW55IElTQSBtdWx0aS1wb3J0IHNlcmlhbCBjYXJkcy4KIAorY29uZmlnIFNFUklBTF84MjUwX1JVTlRJTUVfVUFSVFMKKwlpbnQgIk51bWJlciBvZiA4MjUwLzE2NTUwIHNlcmlhbCBwb3J0cyB0byByZWdpc3RlciBhdCBydW50aW1lIgorCWRlcGVuZHMgb24gU0VSSUFMXzgyNTAKKwlkZWZhdWx0ICI0IgorCWhlbHAKKwkgIFNldCB0aGlzIHRvIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZXJpYWwgcG9ydHMgeW91IHdhbnQKKwkgIHRoZSBrZXJuZWwgdG8gcmVnaXN0ZXIgYXQgYm9vdCB0aW1lLiAgVGhpcyBjYW4gYmUgb3ZlcnJpZGVuCisJICB3aXRoIHRoZSBtb2R1bGUgcGFyYW1ldGVyICJucl91YXJ0cyIsIG9yIGJvb3QtdGltZSBwYXJhbWV0ZXIKKwkgIDgyNTAubnJfdWFydHMKKwogY29uZmlnIFNFUklBTF84MjUwX0VYVEVOREVECiAJYm9vbCAiRXh0ZW5kZWQgODI1MC8xNjU1MCBzZXJpYWwgZHJpdmVyIG9wdGlvbnMiCiAJZGVwZW5kcyBvbiBTRVJJQUxfODI1MApAQCAtMTgwLDcgKzE5MCw2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCA4MjUwX2JvY2EuCiAKLQogY29uZmlnIFNFUklBTF84MjUwX0hVQjYKIAl0cmlzdGF0ZSAiU3VwcG9ydCBIdWI2IGNhcmRzIgogCWRlcGVuZHMgb24gU0VSSUFMXzgyNTAgIT0gbiAmJiBJU0EgJiYgU0VSSUFMXzgyNTBfTUFOWV9QT1JUUwpAQCAtMjcwLDYgKzI3OSw0MCBAQAogCSAgeW91ciBib290IGxvYWRlciAobGlsbyBvciBsb2FkbGluKSBhYm91dCBob3cgdG8gcGFzcyBvcHRpb25zIHRvIHRoZQogCSAga2VybmVsIGF0IGJvb3QgdGltZS4pCiAKK2NvbmZpZyBTRVJJQUxfQVQ5MQorCWJvb2wgIkFUOTFSTTkyMDAgc2VyaWFsIHBvcnQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSTSAmJiBBUkNIX0FUOTFSTTkyMDAKKwlzZWxlY3QgU0VSSUFMX0NPUkUKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgdGhlIGRyaXZlciBmb3IgdGhlIG9uLWNoaXAgVUFSVHMgb2YgdGhlIEFUOTFSTTkyMDAKKwkgIHByb2Nlc3Nvci4KKworY29uZmlnIFNFUklBTF9BVDkxX0NPTlNPTEUKKwlib29sICJTdXBwb3J0IGZvciBjb25zb2xlIG9uIEFUOTFSTTkyMDAgc2VyaWFsIHBvcnQiCisJZGVwZW5kcyBvbiBTRVJJQUxfQVQ5MT15CisJc2VsZWN0IFNFUklBTF9DT1JFX0NPTlNPTEUKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3aXNoIHRvIHVzZSBhIFVBUlQgb24gdGhlIEFUOTFSTTkyMDAgYXMgdGhlIHN5c3RlbQorCSAgY29uc29sZSAodGhlIHN5c3RlbSBjb25zb2xlIGlzIHRoZSBkZXZpY2Ugd2hpY2ggcmVjZWl2ZXMgYWxsIGtlcm5lbAorCSAgbWVzc2FnZXMgYW5kIHdhcm5pbmdzIGFuZCB3aGljaCBhbGxvd3MgbG9naW5zIGluIHNpbmdsZSB1c2VyIG1vZGUpLgorCitjb25maWcgU0VSSUFMX0FUOTFfVFRZQVQKKwlib29sICJJbnN0YWxsIGFzIGRldmljZSB0dHlBVDAtNCBpbnN0ZWFkIG9mIHR0eVMwLTQiCisJZGVwZW5kcyBvbiBTRVJJQUxfQVQ5MT15CisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2lzaCB0byBoYXZlIHRoZSBmaXZlIGludGVybmFsIEFUOTFSTTkyMDAgVUFSVHMKKwkgIGFwcGVhciBhcyAvZGV2L3R0eUFUMC00IChtYWpvciAyMDQsIG1pbm9yIDE1NC0xNTgpIGluc3RlYWQgb2YgdGhlCisJICBub3JtYWwgL2Rldi90dHlTMC00IChtYWpvciA0LCBtaW5vciA2NC02OCkuIFRoaXMgaXMgbmVjZXNzYXJ5IGlmCisJICB5b3UgYWxzbyB3YW50IG90aGVyIFVBUlRzLCBzdWNoIGFzIGV4dGVybmFsIDgyNTAvMTZDNTUwIGNvbXBhdGlibGUKKwkgIFVBUlRzLgorCSAgVGhlIHR0eVNuIG5vZGVzIGFyZSBsZWdhbGx5IHJlc2VydmVkIGZvciB0aGUgODI1MCBzZXJpYWwgZHJpdmVyCisJICBidXQgYXJlIG9mdGVuIG1pc3VzZWQgYnkgb3RoZXIgc2VyaWFsIGRyaXZlcnMuCisKKwkgIFRvIHVzZSB0aGlzLCB5b3Ugc2hvdWxkIGNyZWF0ZSBzdWl0YWJsZSB0dHlBVG4gZGV2aWNlIG5vZGVzIGluCisJICAvZGV2LywgYW5kIHBhc3MgImNvbnNvbGU9dHR5QVRuIiB0byB0aGUga2VybmVsLgorCisJICBTYXkgWSBpZiB5b3UgaGF2ZSBhbiBleHRlcm5hbCA4MjUwLzE2QzU1MCBVQVJULiAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIFNFUklBTF9DTFBTNzExWAogCXRyaXN0YXRlICJDTFBTNzExWCBzZXJpYWwgcG9ydCBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVJNICYmIEFSQ0hfQ0xQUzcxMVgKQEAgLTM1OSwyOSArNDAyLDYgQEAKIAkgIHlvdXIgYm9vdCBsb2FkZXIgKGxpbG8gb3IgbG9hZGxpbikgYWJvdXQgaG93IHRvIHBhc3Mgb3B0aW9ucyB0byB0aGUKIAkgIGtlcm5lbCBhdCBib290IHRpbWUuKQogCi1jb25maWcgU0VSSUFMX1VBUlQwMAotCWJvb2wgIkV4Y2FsaWJ1ciBzZXJpYWwgcG9ydCAodWFydDAwKSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVJNICYmIEFSQ0hfQ0FNRUxPVAotCXNlbGVjdCBTRVJJQUxfQ09SRQotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBoYXJkIGxvZ2ljIHVhcnQgb24gRXhjYWxpYnVyLiBUaGlzCi0JICBkcml2ZXIgYWxzbyBzdXBwb3J0cyBzb2Z0IGxvZ2ljIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIHVhcnQgY29yZS4KLQotY29uZmlnIFNFUklBTF9VQVJUMDBfQ09OU09MRQotCWJvb2wgIlN1cHBvcnQgZm9yIGNvbnNvbGUgb24gRXhjYWxpYnVyIHNlcmlhbCBwb3J0IgotCWRlcGVuZHMgb24gU0VSSUFMX1VBUlQwMAotCXNlbGVjdCBTRVJJQUxfQ09SRV9DT05TT0xFCi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBzdXBwb3J0IGEgc2VyaWFsIGNvbnNvbGUgb24gYW4gRXhjYWxpYnVyCi0JICBoYXJkIGxvZ2ljIHVhcnQgb3IgdWFydDAwIElQIGNvcmUuCi0KLQkgIEV2ZW4gaWYgeW91IHNheSBZIGhlcmUsIHRoZSBjdXJyZW50bHkgdmlzaWJsZSB2aXJ0dWFsIGNvbnNvbGUKLQkgICgvZGV2L3R0eTApIHdpbGwgc3RpbGwgYmUgdXNlZCBhcyB0aGUgc3lzdGVtIGNvbnNvbGUgYnkgZGVmYXVsdCwgYnV0Ci0JICB5b3UgY2FuIGFsdGVyIHRoYXQgdXNpbmcgYSBrZXJuZWwgY29tbWFuZCBsaW5lIG9wdGlvbiBzdWNoIGFzCi0JICAiY29uc29sZT10dHlTMSIuIChUcnkgIm1hbiBib290cGFyYW0iIG9yIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZgotCSAgeW91ciBib290IGxvYWRlciAobGlsbyBvciBsb2FkbGluKSBhYm91dCBob3cgdG8gcGFzcyBvcHRpb25zIHRvIHRoZQotCSAga2VybmVsIGF0IGJvb3QgdGltZS4pCi0KIGNvbmZpZyBTRVJJQUxfTVBTQwogCWJvb2wgIk1hcnZlbGwgTVBTQyBzZXJpYWwgcG9ydCBzdXBwb3J0IgogCWRlcGVuZHMgb24gUFBDMzIgJiYgTVY2NFg2MApAQCAtODI3LDcgKzg0Nyw3IEBACiAKIGNvbmZpZyBTRVJJQUxfTTMyUl9QTERTSU8KIAlib29sICJNMzJSIFNJTyBJL0Ygb24gYSBQTEQiCi0JZGVwZW5kcyBvbiBTRVJJQUxfTTMyUl9TSU89eSAmJiAoUExBVF9PUFNQVVQgfHwgUEFMVF9VU1JWIHx8IFBMQVRfTTMyNzAwVVQpCisJZGVwZW5kcyBvbiBTRVJJQUxfTTMyUl9TSU89eSAmJiAoUExBVF9PUFNQVVQgfHwgUExBVF9VU1JWIHx8IFBMQVRfTTMyNzAwVVQpCiAJZGVmYXVsdCBuCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIE0zMlIgc2VyaWFsIGNvbnRyb2xsZXIKQEAgLTg3Myw3ICs4OTMsNyBAQAogCiBjb25maWcgU0VSSUFMX0pTTQogICAgICAgICB0cmlzdGF0ZSAiRGlnaSBJbnRlcm5hdGlvbmFsIE5FTyBQQ0kgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBDSQorCWRlcGVuZHMgb24gUENJICYmIEJST0tFTgogICAgICAgICBzZWxlY3QgU0VSSUFMX0NPUkUKICAgICAgICAgaGVscAogICAgICAgICAgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIERpZ2kgSW50ZXJuYXRpb25hbCdzIE5lbyBzZXJpZXMKQEAgLTg5Niw0ICs5MTYsMTIgQEAKIAkJYW5kIHdpc2ggdG8gdXNlIHRoZSBzZXJpYWwgcG9ydHMgb24gdGhpcyBjYXJkLCBzYXkgWS4KIAkJT3RoZXJ3aXNlLCBzYXkgTi4KIAorY29uZmlnIFNFUklBTF9TR0lfSU9DMworCXRyaXN0YXRlICJTR0kgQWx0aXggSU9DMyBzZXJpYWwgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIChJQTY0X0dFTkVSSUMgfHwgSUE2NF9TR0lfU04yKSAmJiBTR0lfSU9DMworCXNlbGVjdCBTRVJJQUxfQ09SRQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGFuIFNHSSBBbHRpeCB3aXRoIGFuIElPQzMgc2VyaWFsIGNhcmQsCisJICBzYXkgWSBvciBNLiAgT3RoZXJ3aXNlLCBzYXkgTi4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUgYi9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQppbmRleCBkN2M3YzcxLi5lYWY4ZTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQpAQCAtMjksNyArMjksNiBAQAogb2JqLSQoQ09ORklHX1NFUklBTF9QWEEpICs9IHB4YS5vCiBvYmotJChDT05GSUdfU0VSSUFMX1NBMTEwMCkgKz0gc2ExMTAwLm8KIG9iai0kKENPTkZJR19TRVJJQUxfUzNDMjQxMCkgKz0gczNjMjQxMC5vCi1vYmotJChDT05GSUdfU0VSSUFMX1VBUlQwMCkgKz0gdWFydDAwLm8KIG9iai0kKENPTkZJR19TRVJJQUxfU1VOQ09SRSkgKz0gc3VuY29yZS5vCiBvYmotJChDT05GSUdfU0VSSUFMX1NVTlpJTE9HKSArPSBzdW56aWxvZy5vCiBvYmotJChDT05GSUdfU0VSSUFMX0lQMjJfWklMT0cpICs9IGlwMjJ6aWxvZy5vCkBAIC01NywzICs1Niw1IEBACiBvYmotJChDT05GSUdfU0VSSUFMX1RYWDkpICs9IHNlcmlhbF90eHg5Lm8KIG9iai0kKENPTkZJR19TRVJJQUxfVlI0MVhYKSArPSB2cjQxeHhfc2l1Lm8KIG9iai0kKENPTkZJR19TRVJJQUxfU0dJX0lPQzQpICs9IGlvYzRfc2VyaWFsLm8KK29iai0kKENPTkZJR19TRVJJQUxfU0dJX0lPQzMpICs9IGlvYzNfc2VyaWFsLm8KK29iai0kKENPTkZJR19TRVJJQUxfQVQ5MSkgKz0gYXQ5MV9zZXJpYWwubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvYW1iYS1wbDAxMC5jIGIvZHJpdmVycy9zZXJpYWwvYW1iYS1wbDAxMC5jCmluZGV4IGRkZDAzMDcuLjM0OTAwMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2FtYmEtcGwwMTAuYworKysgYi9kcml2ZXJzL3NlcmlhbC9hbWJhLXBsMDEwLmMKQEAgLTQ3LDEyICs0NywxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvc2VyaWFsLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2FtYmEuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYW1iYV9zZXJpYWwuaD4KIAogI2RlZmluZSBVQVJUX05SCQkyCiAKQEAgLTE1NCwxNSArMTU0LDYgQEAKIAogCXN0YXR1cyA9IFVBUlRfR0VUX0ZSKHBvcnQpOwogCXdoaWxlIChVQVJUX1JYX0RBVEEoc3RhdHVzKSAmJiBtYXhfY291bnQtLSkgewotCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpIHsKLQkJCWlmICh0dHktPmxvd19sYXRlbmN5KQotCQkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7Ci0JCQkvKgotCQkJICogSWYgdGhpcyBmYWlsZWQgdGhlbiB3ZSB3aWxsIHRocm93IGF3YXkgdGhlCi0JCQkgKiBieXRlcyBidXQgbXVzdCBkbyBzbyB0byBjbGVhciBpbnRlcnJ1cHRzLgotCQkJICovCi0JCX0KLQogCQljaCA9IFVBUlRfR0VUX0NIQVIocG9ydCk7CiAJCWZsYWcgPSBUVFlfTk9STUFMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9hbWJhLXBsMDExLmMgYi9kcml2ZXJzL3NlcmlhbC9hbWJhLXBsMDExLmMKaW5kZXggZDg0NDc2ZS4uMDM0YTAyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvYW1iYS1wbDAxMS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2FtYmEtcGwwMTEuYwpAQCAtNDcsMTIgKzQ3LDEyIEBACiAjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hbWJhLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2FtYmFfc2VyaWFsLmg+CiAKICNkZWZpbmUgVUFSVF9OUgkJCTE0CiAKQEAgLTEyMCwxNSArMTIwLDYgQEAKIAogCXN0YXR1cyA9IHJlYWR3KHVhcC0+cG9ydC5tZW1iYXNlICsgVUFSVDAxeF9GUik7CiAJd2hpbGUgKChzdGF0dXMgJiBVQVJUMDF4X0ZSX1JYRkUpID09IDAgJiYgbWF4X2NvdW50LS0pIHsKLQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSB7Ci0JCQlpZiAodHR5LT5sb3dfbGF0ZW5jeSkKLQkJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCQkJLyoKLQkJCSAqIElmIHRoaXMgZmFpbGVkIHRoZW4gd2Ugd2lsbCB0aHJvdyBhd2F5IHRoZQotCQkJICogYnl0ZXMgYnV0IG11c3QgZG8gc28gdG8gY2xlYXIgaW50ZXJydXB0cwotCQkJICovCi0JCX0KLQogCQljaCA9IHJlYWR3KHVhcC0+cG9ydC5tZW1iYXNlICsgVUFSVDAxeF9EUikgfCBVQVJUX0RVTU1ZX0RSX1JYOwogCQlmbGFnID0gVFRZX05PUk1BTDsKIAkJdWFwLT5wb3J0Lmljb3VudC5yeCsrOwpAQCAtNzYxLDEwICs3NTIsNiBAQAogCQlnb3RvIHVubWFwOwogCX0KIAotCXJldCA9IGNsa191c2UodWFwLT5jbGspOwotCWlmIChyZXQpCi0JCWdvdG8gcHV0Y2xrOwotCiAJdWFwLT5wb3J0LmRldiA9ICZkZXYtPmRldjsKIAl1YXAtPnBvcnQubWFwYmFzZSA9IGRldi0+cmVzLnN0YXJ0OwogCXVhcC0+cG9ydC5tZW1iYXNlID0gYmFzZTsKQEAgLTc4Miw4ICs3NjksNiBAQAogCWlmIChyZXQpIHsKIAkJYW1iYV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOwogCQlhbWJhX3BvcnRzW2ldID0gTlVMTDsKLQkJY2xrX3VudXNlKHVhcC0+Y2xrKTsKLSBwdXRjbGs6CiAJCWNsa19wdXQodWFwLT5jbGspOwogIHVubWFwOgogCQlpb3VubWFwKGJhc2UpOwpAQCAtODA4LDcgKzc5Myw2IEBACiAJCQlhbWJhX3BvcnRzW2ldID0gTlVMTDsKIAogCWlvdW5tYXAodWFwLT5wb3J0Lm1lbWJhc2UpOwotCWNsa191bnVzZSh1YXAtPmNsayk7CiAJY2xrX3B1dCh1YXAtPmNsayk7CiAJa2ZyZWUodWFwKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2F0OTFfc2VyaWFsLmMgYi9kcml2ZXJzL3NlcmlhbC9hdDkxX3NlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMTNmZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NlcmlhbC9hdDkxX3NlcmlhbC5jCkBAIC0wLDAgKzEsODkyIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvY2hhci9hdDkxX3NlcmlhbC5jCisgKgorICogIERyaXZlciBmb3IgQXRtZWwgQVQ5MVJNOTIwMCBTZXJpYWwgcG9ydHMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIFJpY2sgQnJvbnNvbgorICoKKyAqICBCYXNlZCBvbiBkcml2ZXJzL2NoYXIvc2VyaWFsX3NhMTEwMC5jLCBieSBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZC4KKyAqICBCYXNlZCBvbiBkcml2ZXJzL2NoYXIvc2VyaWFsLmMsIGJ5IExpbnVzIFRvcnZhbGRzLCBUaGVvZG9yZSBUcydvLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNycS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFybTkyMDBfdXNhcnQuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9zZXJpYWxfYXQ5MXJtOTIwMC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcGlvLmg+CisKKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9BVDkxX0NPTlNPTEUpICYmIGRlZmluZWQoQ09ORklHX01BR0lDX1NZU1JRKQorI2RlZmluZSBTVVBQT1JUX1NZU1JRCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0FUOTFfVFRZQVQKKworLyogVXNlIGRldmljZSBuYW1lIHR0eUFULCBtYWpvciAyMDQgYW5kIG1pbm9yIDE1NC0xNjkuICBUaGlzIGlzIG5lY2Vzc2FyeSBpZiB3ZQorICogc2hvdWxkIGNvZXhpc3Qgd2l0aCB0aGUgODI1MCBkcml2ZXIsIHN1Y2ggYXMgaWYgd2UgaGF2ZSBhbiBleHRlcm5hbCAxNkM1NTAKKyAqIFVBUlQuICovCisjZGVmaW5lIFNFUklBTF9BVDkxX01BSk9SCTIwNAorI2RlZmluZSBNSU5PUl9TVEFSVAkJMTU0CisjZGVmaW5lIEFUOTFfREVWSUNFTkFNRQkJInR0eUFUIgorCisjZWxzZQorCisvKiBVc2UgZGV2aWNlIG5hbWUgdHR5UywgbWFqb3IgNCwgbWlub3IgNjQtNjguICBUaGlzIGlzIHRoZSB1c3VhbCBzZXJpYWwgcG9ydAorICogbmFtZSwgYnV0IGl0IGlzIGxlZ2FsbHkgcmVzZXJ2ZWQgZm9yIHRoZSA4MjUwIGRyaXZlci4gKi8KKyNkZWZpbmUgU0VSSUFMX0FUOTFfTUFKT1IJVFRZX01BSk9SCisjZGVmaW5lIE1JTk9SX1NUQVJUCQk2NAorI2RlZmluZSBBVDkxX0RFVklDRU5BTUUJCSJ0dHlTIgorCisjZW5kaWYKKworI2RlZmluZSBBVDkxX1ZBX0JBU0VfREJHVQkoKHVuc2lnbmVkIGxvbmcpIEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0RCR1UpCisjZGVmaW5lIEFUOTFfSVNSX1BBU1NfTElNSVQJMjU2CisKKyNkZWZpbmUgVUFSVF9QVVRfQ1IocG9ydCx2KQl3cml0ZWwodiwgKHBvcnQpLT5tZW1iYXNlICsgQVQ5MV9VU19DUikKKyNkZWZpbmUgVUFSVF9HRVRfTVIocG9ydCkJcmVhZGwoKHBvcnQpLT5tZW1iYXNlICsgQVQ5MV9VU19NUikKKyNkZWZpbmUgVUFSVF9QVVRfTVIocG9ydCx2KQl3cml0ZWwodiwgKHBvcnQpLT5tZW1iYXNlICsgQVQ5MV9VU19NUikKKyNkZWZpbmUgVUFSVF9QVVRfSUVSKHBvcnQsdikJd3JpdGVsKHYsIChwb3J0KS0+bWVtYmFzZSArIEFUOTFfVVNfSUVSKQorI2RlZmluZSBVQVJUX1BVVF9JRFIocG9ydCx2KQl3cml0ZWwodiwgKHBvcnQpLT5tZW1iYXNlICsgQVQ5MV9VU19JRFIpCisjZGVmaW5lIFVBUlRfR0VUX0lNUihwb3J0KQlyZWFkbCgocG9ydCktPm1lbWJhc2UgKyBBVDkxX1VTX0lNUikKKyNkZWZpbmUgVUFSVF9HRVRfQ1NSKHBvcnQpCXJlYWRsKChwb3J0KS0+bWVtYmFzZSArIEFUOTFfVVNfQ1NSKQorI2RlZmluZSBVQVJUX0dFVF9DSEFSKHBvcnQpCXJlYWRsKChwb3J0KS0+bWVtYmFzZSArIEFUOTFfVVNfUkhSKQorI2RlZmluZSBVQVJUX1BVVF9DSEFSKHBvcnQsdikJd3JpdGVsKHYsIChwb3J0KS0+bWVtYmFzZSArIEFUOTFfVVNfVEhSKQorI2RlZmluZSBVQVJUX0dFVF9CUkdSKHBvcnQpCXJlYWRsKChwb3J0KS0+bWVtYmFzZSArIEFUOTFfVVNfQlJHUikKKyNkZWZpbmUgVUFSVF9QVVRfQlJHUihwb3J0LHYpCXdyaXRlbCh2LCAocG9ydCktPm1lbWJhc2UgKyBBVDkxX1VTX0JSR1IpCisjZGVmaW5lIFVBUlRfUFVUX1JUT1IocG9ydCx2KQl3cml0ZWwodiwgKHBvcnQpLT5tZW1iYXNlICsgQVQ5MV9VU19SVE9SKQorCisvLyAjZGVmaW5lIFVBUlRfR0VUX0NSKHBvcnQpCXJlYWRsKChwb3J0KS0+bWVtYmFzZSArIEFUOTFfVVNfQ1IpCQkvLyBpcyB3cml0ZS1vbmx5CisKKyAvKiBQREMgcmVnaXN0ZXJzICovCisjZGVmaW5lIFVBUlRfUFVUX1BUQ1IocG9ydCx2KQl3cml0ZWwodiwgKHBvcnQpLT5tZW1iYXNlICsgQVQ5MV9QRENfUFRDUikKKyNkZWZpbmUgVUFSVF9QVVRfUlBSKHBvcnQsdikJd3JpdGVsKHYsIChwb3J0KS0+bWVtYmFzZSArIEFUOTFfUERDX1JQUikKKyNkZWZpbmUgVUFSVF9QVVRfUkNSKHBvcnQsdikJd3JpdGVsKHYsIChwb3J0KS0+bWVtYmFzZSArIEFUOTFfUERDX1JDUikKKyNkZWZpbmUgVUFSVF9HRVRfUkNSKHBvcnQpCXJlYWRsKChwb3J0KS0+bWVtYmFzZSArIEFUOTFfUERDX1JDUikKKyNkZWZpbmUgVUFSVF9QVVRfUk5QUihwb3J0LHYpCXdyaXRlbCh2LCAocG9ydCktPm1lbWJhc2UgKyBBVDkxX1BEQ19STlBSKQorI2RlZmluZSBVQVJUX1BVVF9STkNSKHBvcnQsdikJd3JpdGVsKHYsIChwb3J0KS0+bWVtYmFzZSArIEFUOTFfUERDX1JOQ1IpCisKKworc3RhdGljIGludCAoKmF0OTFfb3Blbikoc3RydWN0IHVhcnRfcG9ydCAqKTsKK3N0YXRpYyB2b2lkICgqYXQ5MV9jbG9zZSkoc3RydWN0IHVhcnRfcG9ydCAqKTsKKworI2lmZGVmIFNVUFBPUlRfU1lTUlEKK3N0YXRpYyBzdHJ1Y3QgY29uc29sZSBhdDkxX2NvbnNvbGU7CisjZW5kaWYKKworLyoKKyAqIFJldHVybiBUSU9DU0VSX1RFTVQgd2hlbiB0cmFuc21pdHRlciBGSUZPIGFuZCBTaGlmdCByZWdpc3RlciBpcyBlbXB0eS4KKyAqLworc3RhdGljIHVfaW50IGF0OTFfdHhfZW1wdHkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4gKFVBUlRfR0VUX0NTUihwb3J0KSAmIEFUOTFfVVNfVFhFTVBUWSkgPyBUSU9DU0VSX1RFTVQgOiAwOworfQorCisvKgorICogU2V0IHN0YXRlIG9mIHRoZSBtb2RlbSBjb250cm9sIG91dHB1dCBsaW5lcworICovCitzdGF0aWMgdm9pZCBhdDkxX3NldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1X2ludCBtY3RybCkKK3sKKwl1bnNpZ25lZCBpbnQgY29udHJvbCA9IDA7CisKKwkvKgorCSAqIEVycmF0YSAjMzk6IFJUUzAgaXMgbm90IGludGVybmFsbHkgY29ubmVjdGVkIHRvIFBBMjEuICBXZSBuZWVkIHRvIGRyaXZlCisJICogIHRoZSBwaW4gbWFudWFsbHkuCisJICovCisJaWYgKHBvcnQtPm1hcGJhc2UgPT0gQVQ5MV9WQV9CQVNFX1VTMCkgeworCQlpZiAobWN0cmwgJiBUSU9DTV9SVFMpCisJCQlhdDkxX3N5c193cml0ZShBVDkxX1BJT0EgKyBQSU9fQ09EUiwgQVQ5MV9QQTIxX1JUUzApOworCQllbHNlCisJCQlhdDkxX3N5c193cml0ZShBVDkxX1BJT0EgKyBQSU9fU09EUiwgQVQ5MV9QQTIxX1JUUzApOworCX0KKworCWlmIChtY3RybCAmIFRJT0NNX1JUUykKKwkJY29udHJvbCB8PSBBVDkxX1VTX1JUU0VOOworCWVsc2UKKwkJY29udHJvbCB8PSBBVDkxX1VTX1JUU0RJUzsKKworCWlmIChtY3RybCAmIFRJT0NNX0RUUikKKwkJY29udHJvbCB8PSBBVDkxX1VTX0RUUkVOOworCWVsc2UKKwkJY29udHJvbCB8PSBBVDkxX1VTX0RUUkRJUzsKKworCVVBUlRfUFVUX0NSKHBvcnQsY29udHJvbCk7Cit9CisKKy8qCisgKiBHZXQgc3RhdGUgb2YgdGhlIG1vZGVtIGNvbnRyb2wgaW5wdXQgbGluZXMKKyAqLworc3RhdGljIHVfaW50IGF0OTFfZ2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJdW5zaWduZWQgaW50IHN0YXR1cywgcmV0ID0gMDsKKworCXN0YXR1cyA9IFVBUlRfR0VUX0NTUihwb3J0KTsKKworCS8qCisJICogVGhlIGNvbnRyb2wgc2lnbmFscyBhcmUgYWN0aXZlIGxvdy4KKwkgKi8KKwlpZiAoIShzdGF0dXMgJiBBVDkxX1VTX0RDRCkpCisJCXJldCB8PSBUSU9DTV9DRDsKKwlpZiAoIShzdGF0dXMgJiBBVDkxX1VTX0NUUykpCisJCXJldCB8PSBUSU9DTV9DVFM7CisJaWYgKCEoc3RhdHVzICYgQVQ5MV9VU19EU1IpKQorCQlyZXQgfD0gVElPQ01fRFNSOworCWlmICghKHN0YXR1cyAmIEFUOTFfVVNfUkkpKQorCQlyZXQgfD0gVElPQ01fUkk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogU3RvcCB0cmFuc21pdHRpbmcuCisgKi8KK3N0YXRpYyB2b2lkIGF0OTFfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCVVBUlRfUFVUX0lEUihwb3J0LCBBVDkxX1VTX1RYUkRZKTsKKwlwb3J0LT5yZWFkX3N0YXR1c19tYXNrICY9IH5BVDkxX1VTX1RYUkRZOworfQorCisvKgorICogU3RhcnQgdHJhbnNtaXR0aW5nLgorICovCitzdGF0aWMgdm9pZCBhdDkxX3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayB8PSBBVDkxX1VTX1RYUkRZOworCVVBUlRfUFVUX0lFUihwb3J0LCBBVDkxX1VTX1RYUkRZKTsKK30KKworLyoKKyAqIFN0b3AgcmVjZWl2aW5nIC0gcG9ydCBpcyBpbiBwcm9jZXNzIG9mIGJlaW5nIGNsb3NlZC4KKyAqLworc3RhdGljIHZvaWQgYXQ5MV9zdG9wX3J4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJVUFSVF9QVVRfSURSKHBvcnQsIEFUOTFfVVNfUlhSRFkpOworfQorCisvKgorICogRW5hYmxlIG1vZGVtIHN0YXR1cyBpbnRlcnJ1cHRzCisgKi8KK3N0YXRpYyB2b2lkIGF0OTFfZW5hYmxlX21zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayB8PSAoQVQ5MV9VU19SSUlDIHwgQVQ5MV9VU19EU1JJQyB8IEFUOTFfVVNfRENESUMgfCBBVDkxX1VTX0NUU0lDKTsKKwlVQVJUX1BVVF9JRVIocG9ydCwgQVQ5MV9VU19SSUlDIHwgQVQ5MV9VU19EU1JJQyB8IEFUOTFfVVNfRENESUMgfCBBVDkxX1VTX0NUU0lDKTsKK30KKworLyoKKyAqIENvbnRyb2wgdGhlIHRyYW5zbWlzc2lvbiBvZiBhIGJyZWFrIHNpZ25hbAorICovCitzdGF0aWMgdm9pZCBhdDkxX2JyZWFrX2N0bChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgYnJlYWtfc3RhdGUpCit7CisJaWYgKGJyZWFrX3N0YXRlICE9IDApCisJCVVBUlRfUFVUX0NSKHBvcnQsIEFUOTFfVVNfU1RUQlJLKTsJLyogc3RhcnQgYnJlYWsgKi8KKwllbHNlCisJCVVBUlRfUFVUX0NSKHBvcnQsIEFUOTFfVVNfU1RQQlJLKTsJLyogc3RvcCBicmVhayAqLworfQorCisvKgorICogQ2hhcmFjdGVycyByZWNlaXZlZCAoY2FsbGVkIGZyb20gaW50ZXJydXB0IGhhbmRsZXIpCisgKi8KK3N0YXRpYyB2b2lkIGF0OTFfcnhfY2hhcnMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPmluZm8tPnR0eTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzLCBjaCwgZmxnOworCisJc3RhdHVzID0gVUFSVF9HRVRfQ1NSKHBvcnQpICYgcG9ydC0+cmVhZF9zdGF0dXNfbWFzazsKKwl3aGlsZSAoc3RhdHVzICYgKEFUOTFfVVNfUlhSRFkpKSB7CisJCWNoID0gVUFSVF9HRVRfQ0hBUihwb3J0KTsKKworCQlwb3J0LT5pY291bnQucngrKzsKKworCQlmbGcgPSBUVFlfTk9STUFMOworCisJCS8qCisJCSAqIG5vdGUgdGhhdCB0aGUgZXJyb3IgaGFuZGxpbmcgY29kZSBpcworCQkgKiBvdXQgb2YgdGhlIG1haW4gZXhlY3V0aW9uIHBhdGgKKwkJICovCisJCWlmICh1bmxpa2VseShzdGF0dXMgJiAoQVQ5MV9VU19QQVJFIHwgQVQ5MV9VU19GUkFNRSB8IEFUOTFfVVNfT1ZSRSkpKSB7CisJCQlVQVJUX1BVVF9DUihwb3J0LCBBVDkxX1VTX1JTVFNUQSk7CS8qIGNsZWFyIGVycm9yICovCisJCQlpZiAoc3RhdHVzICYgKEFUOTFfVVNfUEFSRSkpCisJCQkJcG9ydC0+aWNvdW50LnBhcml0eSsrOworCQkJaWYgKHN0YXR1cyAmIChBVDkxX1VTX0ZSQU1FKSkKKwkJCQlwb3J0LT5pY291bnQuZnJhbWUrKzsKKwkJCWlmIChzdGF0dXMgJiAoQVQ5MV9VU19PVlJFKSkKKwkJCQlwb3J0LT5pY291bnQub3ZlcnJ1bisrOworCisJCQlpZiAoc3RhdHVzICYgQVQ5MV9VU19QQVJFKQorCQkJCWZsZyA9IFRUWV9QQVJJVFk7CisJCQllbHNlIGlmIChzdGF0dXMgJiBBVDkxX1VTX0ZSQU1FKQorCQkJCWZsZyA9IFRUWV9GUkFNRTsKKwkJCWlmIChzdGF0dXMgJiBBVDkxX1VTX09WUkUpIHsKKwkJCQkvKgorCQkJCSAqIG92ZXJydW4gZG9lcyAqbm90KiBhZmZlY3QgdGhlIGNoYXJhY3RlcgorCQkJCSAqIHdlIHJlYWQgZnJvbSB0aGUgRklGTworCQkJCSAqLworCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY2gsIGZsZyk7CisJCQkJY2ggPSAwOworCQkJCWZsZyA9IFRUWV9PVkVSUlVOOworCQkJfQorI2lmZGVmIFNVUFBPUlRfU1lTUlEKKwkJCXBvcnQtPnN5c3JxID0gMDsKKyNlbmRpZgorCQl9CisKKwkJaWYgKHVhcnRfaGFuZGxlX3N5c3JxX2NoYXIocG9ydCwgY2gsIHJlZ3MpKQorCQkJZ290byBpZ25vcmVfY2hhcjsKKworCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBmbGcpOworCisJaWdub3JlX2NoYXI6CisJCXN0YXR1cyA9IFVBUlRfR0VUX0NTUihwb3J0KSAmIHBvcnQtPnJlYWRfc3RhdHVzX21hc2s7CisJfQorCisJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKK30KKworLyoKKyAqIFRyYW5zbWl0IGNoYXJhY3RlcnMgKGNhbGxlZCBmcm9tIGludGVycnVwdCBoYW5kbGVyKQorICovCitzdGF0aWMgdm9pZCBhdDkxX3R4X2NoYXJzKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnBvcnQtPmluZm8tPnhtaXQ7CisKKwlpZiAocG9ydC0+eF9jaGFyKSB7CisJCVVBUlRfUFVUX0NIQVIocG9ydCwgcG9ydC0+eF9jaGFyKTsKKwkJcG9ydC0+aWNvdW50LnR4Kys7CisJCXBvcnQtPnhfY2hhciA9IDA7CisJCXJldHVybjsKKwl9CisJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSB8fCB1YXJ0X3R4X3N0b3BwZWQocG9ydCkpIHsKKwkJYXQ5MV9zdG9wX3R4KHBvcnQpOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKFVBUlRfR0VUX0NTUihwb3J0KSAmIEFUOTFfVVNfVFhSRFkpIHsKKwkJVUFSVF9QVVRfQ0hBUihwb3J0LCB4bWl0LT5idWZbeG1pdC0+dGFpbF0pOworCQl4bWl0LT50YWlsID0gKHhtaXQtPnRhaWwgKyAxKSAmIChVQVJUX1hNSVRfU0laRSAtIDEpOworCQlwb3J0LT5pY291bnQudHgrKzsKKwkJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSkKKwkJCWJyZWFrOworCX0KKworCWlmICh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZyh4bWl0KSA8IFdBS0VVUF9DSEFSUykKKwkJdWFydF93cml0ZV93YWtldXAocG9ydCk7CisKKwlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpKQorCQlhdDkxX3N0b3BfdHgocG9ydCk7Cit9CisKKy8qCisgKiBJbnRlcnJ1cHQgaGFuZGxlcgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYXQ5MV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gZGV2X2lkOworCXVuc2lnbmVkIGludCBzdGF0dXMsIHBlbmRpbmcsIHBhc3NfY291bnRlciA9IDA7CisKKwlzdGF0dXMgPSBVQVJUX0dFVF9DU1IocG9ydCk7CisJcGVuZGluZyA9IHN0YXR1cyAmIHBvcnQtPnJlYWRfc3RhdHVzX21hc2s7CisJaWYgKHBlbmRpbmcpIHsKKwkJZG8geworCQkJaWYgKHBlbmRpbmcgJiBBVDkxX1VTX1JYUkRZKQorCQkJCWF0OTFfcnhfY2hhcnMocG9ydCwgcmVncyk7CisKKwkJCS8qIENsZWFyIHRoZSByZWxldmVudCBicmVhayBiaXRzICovCisJCQlpZiAocGVuZGluZyAmIEFUOTFfVVNfUlhCUkspIHsKKwkJCQlVQVJUX1BVVF9DUihwb3J0LCBBVDkxX1VTX1JTVFNUQSk7CisJCQkJcG9ydC0+aWNvdW50LmJyaysrOworCQkJCXVhcnRfaGFuZGxlX2JyZWFrKHBvcnQpOworCQkJfQorCisJCQkvLyBUT0RPOiBBbGwgcmVhZHMgdG8gQ1NSIHdpbGwgY2xlYXIgdGhlc2UgaW50ZXJydXB0cyEKKwkJCWlmIChwZW5kaW5nICYgQVQ5MV9VU19SSUlDKSBwb3J0LT5pY291bnQucm5nKys7CisJCQlpZiAocGVuZGluZyAmIEFUOTFfVVNfRFNSSUMpIHBvcnQtPmljb3VudC5kc3IrKzsKKwkJCWlmIChwZW5kaW5nICYgQVQ5MV9VU19EQ0RJQykKKwkJCQl1YXJ0X2hhbmRsZV9kY2RfY2hhbmdlKHBvcnQsICEoc3RhdHVzICYgQVQ5MV9VU19EQ0QpKTsKKwkJCWlmIChwZW5kaW5nICYgQVQ5MV9VU19DVFNJQykKKwkJCQl1YXJ0X2hhbmRsZV9jdHNfY2hhbmdlKHBvcnQsICEoc3RhdHVzICYgQVQ5MV9VU19DVFMpKTsKKwkJCWlmIChwZW5kaW5nICYgKEFUOTFfVVNfUklJQyB8IEFUOTFfVVNfRFNSSUMgfCBBVDkxX1VTX0RDRElDIHwgQVQ5MV9VU19DVFNJQykpCisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5pbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisKKwkJCWlmIChwZW5kaW5nICYgQVQ5MV9VU19UWFJEWSkKKwkJCQlhdDkxX3R4X2NoYXJzKHBvcnQpOworCQkJaWYgKHBhc3NfY291bnRlcisrID4gQVQ5MV9JU1JfUEFTU19MSU1JVCkKKwkJCQlicmVhazsKKworCQkJc3RhdHVzID0gVUFSVF9HRVRfQ1NSKHBvcnQpOworCQkJcGVuZGluZyA9IHN0YXR1cyAmIHBvcnQtPnJlYWRfc3RhdHVzX21hc2s7CisJCX0gd2hpbGUgKHBlbmRpbmcpOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBQZXJmb3JtIGluaXRpYWxpemF0aW9uIGFuZCBlbmFibGUgcG9ydCBmb3IgcmVjZXB0aW9uCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9zdGFydHVwKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJaW50IHJldHZhbDsKKworCS8qCisJICogRW5zdXJlIHRoYXQgbm8gaW50ZXJydXB0cyBhcmUgZW5hYmxlZCBvdGhlcndpc2Ugd2hlbgorCSAqIHJlcXVlc3RfaXJxKCkgaXMgY2FsbGVkIHdlIGNvdWxkIGdldCBzdHVjayB0cnlpbmcgdG8KKwkgKiBoYW5kbGUgYW4gdW5leHBlY3RlZCBpbnRlcnJ1cHQKKwkgKi8KKwlVQVJUX1BVVF9JRFIocG9ydCwgLTEpOworCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgSVJRCisJICovCisJcmV0dmFsID0gcmVxdWVzdF9pcnEocG9ydC0+aXJxLCBhdDkxX2ludGVycnVwdCwgU0FfU0hJUlEsICJhdDkxX3NlcmlhbCIsIHBvcnQpOworCWlmIChyZXR2YWwpIHsKKwkJcHJpbnRrKCJhdDkxX3NlcmlhbDogYXQ5MV9zdGFydHVwIC0gQ2FuJ3QgZ2V0IGlycVxuIik7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhIHNwZWNpZmljICJvcGVuIiBmdW5jdGlvbiAodG8gcmVnaXN0ZXIKKwkgKiBjb250cm9sIGxpbmUgaW50ZXJydXB0cykKKwkgKi8KKwlpZiAoYXQ5MV9vcGVuKSB7CisJCXJldHZhbCA9IGF0OTFfb3Blbihwb3J0KTsKKwkJaWYgKHJldHZhbCkgeworCQkJZnJlZV9pcnEocG9ydC0+aXJxLCBwb3J0KTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwl9CisKKwlwb3J0LT5yZWFkX3N0YXR1c19tYXNrID0gQVQ5MV9VU19SWFJEWSB8IEFUOTFfVVNfVFhSRFkgfCBBVDkxX1VTX09WUkUKKwkJCXwgQVQ5MV9VU19GUkFNRSB8IEFUOTFfVVNfUEFSRSB8IEFUOTFfVVNfUlhCUks7CisJLyoKKwkgKiBGaW5hbGx5LCBlbmFibGUgdGhlIHNlcmlhbCBwb3J0CisJICovCisJVUFSVF9QVVRfQ1IocG9ydCwgQVQ5MV9VU19SU1RTVEEgfCBBVDkxX1VTX1JTVFJYKTsKKwlVQVJUX1BVVF9DUihwb3J0LCBBVDkxX1VTX1RYRU4gfCBBVDkxX1VTX1JYRU4pOwkJLyogZW5hYmxlIHhtaXQgJiByY3ZyICovCisJVUFSVF9QVVRfSUVSKHBvcnQsIEFUOTFfVVNfUlhSRFkpOwkJCS8qIGRvIHJlY2VpdmUgb25seSAqLworCXJldHVybiAwOworfQorCisvKgorICogRGlzYWJsZSB0aGUgcG9ydAorICovCitzdGF0aWMgdm9pZCBhdDkxX3NodXRkb3duKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJLyoKKwkgKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzLCBwb3J0IGFuZCBicmVhayBjb25kaXRpb24uCisJICovCisJVUFSVF9QVVRfQ1IocG9ydCwgQVQ5MV9VU19SU1RTVEEpOworCVVBUlRfUFVUX0lEUihwb3J0LCAtMSk7CisKKwkvKgorCSAqIEZyZWUgdGhlIGludGVycnVwdAorCSAqLworCWZyZWVfaXJxKHBvcnQtPmlycSwgcG9ydCk7CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIGEgc3BlY2lmaWMgImNsb3NlIiBmdW5jdGlvbiAodG8gdW5yZWdpc3RlcgorCSAqIGNvbnRyb2wgbGluZSBpbnRlcnJ1cHRzKQorCSAqLworCWlmIChhdDkxX2Nsb3NlKQorCQlhdDkxX2Nsb3NlKHBvcnQpOworfQorCisvKgorICogUG93ZXIgLyBDbG9jayBtYW5hZ2VtZW50LgorICovCitzdGF0aWMgdm9pZCBhdDkxX3NlcmlhbF9wbShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgc3RhdGUsIHVuc2lnbmVkIGludCBvbGRzdGF0ZSkKK3sKKwlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgMDoKKwkJCS8qCisJCQkgKiBFbmFibGUgdGhlIHBlcmlwaGVyYWwgY2xvY2sgZm9yIHRoaXMgc2VyaWFsIHBvcnQuCisJCQkgKiBUaGlzIGlzIGNhbGxlZCBvbiB1YXJ0X29wZW4oKSBvciBhIHJlc3VtZSBldmVudC4KKwkJCSAqLworCQkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QTUNfUENFUiwgMSA8PCBwb3J0LT5pcnEpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCS8qCisJCQkgKiBEaXNhYmxlIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGZvciB0aGlzIHNlcmlhbCBwb3J0LgorCQkJICogVGhpcyBpcyBjYWxsZWQgb24gdWFydF9jbG9zZSgpIG9yIGEgc3VzcGVuZCBldmVudC4KKwkJCSAqLworCQkJaWYgKHBvcnQtPmlycSAhPSBBVDkxX0lEX1NZUykJCQkvKiBpcyB0aGlzIGEgc2hhcmVkIGNsb2NrPyAqLworCQkJCWF0OTFfc3lzX3dyaXRlKEFUOTFfUE1DX1BDRFIsIDEgPDwgcG9ydC0+aXJxKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJhdDkxX3NlcmlhbDogdW5rbm93biBwbSAlZFxuIiwgc3RhdGUpOworCX0KK30KKworLyoKKyAqIENoYW5nZSB0aGUgcG9ydCBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyB2b2lkIGF0OTFfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKiB0ZXJtaW9zLCBzdHJ1Y3QgdGVybWlvcyAqIG9sZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtb2RlLCBpbXIsIHF1b3QsIGJhdWQ7CisKKwliYXVkID0gdWFydF9nZXRfYmF1ZF9yYXRlKHBvcnQsIHRlcm1pb3MsIG9sZCwgMCwgcG9ydC0+dWFydGNsay8xNik7CisJcXVvdCA9IHVhcnRfZ2V0X2Rpdmlzb3IocG9ydCwgYmF1ZCk7CisKKwkvKiBHZXQgY3VycmVudCBtb2RlIHJlZ2lzdGVyICovCisJbW9kZSA9IFVBUlRfR0VUX01SKHBvcnQpICYgfihBVDkxX1VTX0NIUkwgfCBBVDkxX1VTX05CU1RPUCB8IEFUOTFfVVNfUEFSKTsKKworCS8qIGJ5dGUgc2l6ZSAqLworCXN3aXRjaCAodGVybWlvcy0+Y19jZmxhZyAmIENTSVpFKSB7CisJY2FzZSBDUzU6CisJCW1vZGUgfD0gQVQ5MV9VU19DSFJMXzU7CisJCWJyZWFrOworCWNhc2UgQ1M2OgorCQltb2RlIHw9IEFUOTFfVVNfQ0hSTF82OworCQlicmVhazsKKwljYXNlIENTNzoKKwkJbW9kZSB8PSBBVDkxX1VTX0NIUkxfNzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbW9kZSB8PSBBVDkxX1VTX0NIUkxfODsKKwkJYnJlYWs7CisJfQorCisJLyogc3RvcCBiaXRzICovCisJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU1RPUEIpCisJCW1vZGUgfD0gQVQ5MV9VU19OQlNUT1BfMjsKKworCS8qIHBhcml0eSAqLworCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgUEFSRU5CKSB7CisJCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ01TUEFSKSB7CQkJLyogTWFyayBvciBTcGFjZSBwYXJpdHkgKi8KKwkJCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgUEFST0REKQorCQkJCW1vZGUgfD0gQVQ5MV9VU19QQVJfTUFSSzsKKwkJCWVsc2UKKwkJCQltb2RlIHw9IEFUOTFfVVNfUEFSX1NQQUNFOworCQl9CisJCWVsc2UgaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJPREQpCisJCQltb2RlIHw9IEFUOTFfVVNfUEFSX09ERDsKKwkJZWxzZQorCQkJbW9kZSB8PSBBVDkxX1VTX1BBUl9FVkVOOworCX0KKwllbHNlCisJCW1vZGUgfD0gQVQ5MV9VU19QQVJfTk9ORTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisKKwlwb3J0LT5yZWFkX3N0YXR1c19tYXNrIHw9IEFUOTFfVVNfT1ZSRTsKKwlpZiAodGVybWlvcy0+Y19pZmxhZyAmIElOUENLKQorCQlwb3J0LT5yZWFkX3N0YXR1c19tYXNrIHw9IEFUOTFfVVNfRlJBTUUgfCBBVDkxX1VTX1BBUkU7CisJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiAoQlJLSU5UIHwgUEFSTVJLKSkKKwkJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayB8PSBBVDkxX1VTX1JYQlJLOworCisJLyoKKwkgKiBDaGFyYWN0ZXJzIHRvIGlnbm9yZQorCSAqLworCXBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayA9IDA7CisJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJR05QQVIpCisJCXBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayB8PSAoQVQ5MV9VU19GUkFNRSB8IEFUOTFfVVNfUEFSRSk7CisJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJR05CUkspIHsKKwkJcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrIHw9IEFUOTFfVVNfUlhCUks7CisJCS8qCisJCSAqIElmIHdlJ3JlIGlnbm9yaW5nIHBhcml0eSBhbmQgYnJlYWsgaW5kaWNhdG9ycywKKwkJICogaWdub3JlIG92ZXJydW5zIHRvbyAoZm9yIHJlYWwgcmF3IHN1cHBvcnQpLgorCQkgKi8KKwkJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJR05QQVIpCisJCQlwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gQVQ5MV9VU19PVlJFOworCX0KKworCS8vIFRPRE86IElnbm9yZSBhbGwgY2hhcmFjdGVycyBpZiBDUkVBRCBpcyBzZXQuCisKKwkvKiB1cGRhdGUgdGhlIHBlci1wb3J0IHRpbWVvdXQgKi8KKwl1YXJ0X3VwZGF0ZV90aW1lb3V0KHBvcnQsIHRlcm1pb3MtPmNfY2ZsYWcsIGJhdWQpOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBkcmFpbiB0cmFuc21pdHRlciAqLworCWltciA9IFVBUlRfR0VUX0lNUihwb3J0KTsJLyogZ2V0IGludGVycnVwdCBtYXNrICovCisJVUFSVF9QVVRfSURSKHBvcnQsIC0xKTsJCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwl3aGlsZSAoIShVQVJUX0dFVF9DU1IocG9ydCkgJiBBVDkxX1VTX1RYRU1QVFkpKSB7IGJhcnJpZXIoKTsgfQorCisJLyogZGlzYWJsZSByZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXIgKi8KKwlVQVJUX1BVVF9DUihwb3J0LCBBVDkxX1VTX1RYRElTIHwgQVQ5MV9VU19SWERJUyk7CisKKwkvKiBzZXQgdGhlIHBhcml0eSwgc3RvcCBiaXRzIGFuZCBkYXRhIHNpemUgKi8KKwlVQVJUX1BVVF9NUihwb3J0LCBtb2RlKTsKKworCS8qIHNldCB0aGUgYmF1ZCByYXRlICovCisJVUFSVF9QVVRfQlJHUihwb3J0LCBxdW90KTsKKwlVQVJUX1BVVF9DUihwb3J0LCBBVDkxX1VTX1JTVFNUQSB8IEFUOTFfVVNfUlNUUlgpOworCVVBUlRfUFVUX0NSKHBvcnQsIEFUOTFfVVNfVFhFTiB8IEFUOTFfVVNfUlhFTik7CisKKwkvKiByZXN0b3JlIGludGVycnVwdHMgKi8KKwlVQVJUX1BVVF9JRVIocG9ydCwgaW1yKTsKKworCS8qIENUUyBmbG93LWNvbnRyb2wgYW5kIG1vZGVtLXN0YXR1cyBpbnRlcnJ1cHRzICovCisJaWYgKFVBUlRfRU5BQkxFX01TKHBvcnQsIHRlcm1pb3MtPmNfY2ZsYWcpKQorCQlwb3J0LT5vcHMtPmVuYWJsZV9tcyhwb3J0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIFJldHVybiBzdHJpbmcgZGVzY3JpYmluZyB0aGUgc3BlY2lmaWVkIHBvcnQKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmF0OTFfdHlwZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXJldHVybiAocG9ydC0+dHlwZSA9PSBQT1JUX0FUOTFSTTkyMDApID8gIkFUOTFfU0VSSUFMIiA6IE5VTEw7Cit9CisKKy8qCisgKiBSZWxlYXNlIHRoZSBtZW1vcnkgcmVnaW9uKHMpIGJlaW5nIHVzZWQgYnkgJ3BvcnQnLgorICovCitzdGF0aWMgdm9pZCBhdDkxX3JlbGVhc2VfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXJlbGVhc2VfbWVtX3JlZ2lvbihwb3J0LT5tYXBiYXNlLAorCQkocG9ydC0+bWFwYmFzZSA9PSBBVDkxX1ZBX0JBU0VfREJHVSkgPyA1MTIgOiBTWl8xNkspOworfQorCisvKgorICogUmVxdWVzdCB0aGUgbWVtb3J5IHJlZ2lvbihzKSBiZWluZyB1c2VkIGJ5ICdwb3J0Jy4KKyAqLworc3RhdGljIGludCBhdDkxX3JlcXVlc3RfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXJldHVybiByZXF1ZXN0X21lbV9yZWdpb24ocG9ydC0+bWFwYmFzZSwKKwkJKHBvcnQtPm1hcGJhc2UgPT0gQVQ5MV9WQV9CQVNFX0RCR1UpID8gNTEyIDogU1pfMTZLLAorCQkiYXQ5MV9zZXJpYWwiKSAhPSBOVUxMID8gMCA6IC1FQlVTWTsKKworfQorCisvKgorICogQ29uZmlndXJlL2F1dG9jb25maWd1cmUgdGhlIHBvcnQuCisgKi8KK3N0YXRpYyB2b2lkIGF0OTFfY29uZmlnX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IGZsYWdzKQoreworCWlmIChmbGFncyAmIFVBUlRfQ09ORklHX1RZUEUpIHsKKwkJcG9ydC0+dHlwZSA9IFBPUlRfQVQ5MVJNOTIwMDsKKwkJYXQ5MV9yZXF1ZXN0X3BvcnQocG9ydCk7CisJfQorfQorCisvKgorICogVmVyaWZ5IHRoZSBuZXcgc2VyaWFsX3N0cnVjdCAoZm9yIFRJT0NTU0VSSUFMKS4KKyAqLworc3RhdGljIGludCBhdDkxX3ZlcmlmeV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBzZXJpYWxfc3RydWN0ICpzZXIpCit7CisJaW50IHJldCA9IDA7CisJaWYgKHNlci0+dHlwZSAhPSBQT1JUX1VOS05PV04gJiYgc2VyLT50eXBlICE9IFBPUlRfQVQ5MVJNOTIwMCkKKwkJcmV0ID0gLUVJTlZBTDsKKwlpZiAocG9ydC0+aXJxICE9IHNlci0+aXJxKQorCQlyZXQgPSAtRUlOVkFMOworCWlmIChzZXItPmlvX3R5cGUgIT0gU0VSSUFMX0lPX01FTSkKKwkJcmV0ID0gLUVJTlZBTDsKKwlpZiAocG9ydC0+dWFydGNsayAvIDE2ICE9IHNlci0+YmF1ZF9iYXNlKQorCQlyZXQgPSAtRUlOVkFMOworCWlmICgodm9pZCAqKXBvcnQtPm1hcGJhc2UgIT0gc2VyLT5pb21lbV9iYXNlKQorCQlyZXQgPSAtRUlOVkFMOworCWlmIChwb3J0LT5pb2Jhc2UgIT0gc2VyLT5wb3J0KQorCQlyZXQgPSAtRUlOVkFMOworCWlmIChzZXItPmh1YjYgIT0gMCkKKwkJcmV0ID0gLUVJTlZBTDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHVhcnRfb3BzIGF0OTFfcG9wcyA9IHsKKwkudHhfZW1wdHkJPSBhdDkxX3R4X2VtcHR5LAorCS5zZXRfbWN0cmwJPSBhdDkxX3NldF9tY3RybCwKKwkuZ2V0X21jdHJsCT0gYXQ5MV9nZXRfbWN0cmwsCisJLnN0b3BfdHgJPSBhdDkxX3N0b3BfdHgsCisJLnN0YXJ0X3R4CT0gYXQ5MV9zdGFydF90eCwKKwkuc3RvcF9yeAk9IGF0OTFfc3RvcF9yeCwKKwkuZW5hYmxlX21zCT0gYXQ5MV9lbmFibGVfbXMsCisJLmJyZWFrX2N0bAk9IGF0OTFfYnJlYWtfY3RsLAorCS5zdGFydHVwCT0gYXQ5MV9zdGFydHVwLAorCS5zaHV0ZG93bgk9IGF0OTFfc2h1dGRvd24sCisJLnNldF90ZXJtaW9zCT0gYXQ5MV9zZXRfdGVybWlvcywKKwkudHlwZQkJPSBhdDkxX3R5cGUsCisJLnJlbGVhc2VfcG9ydAk9IGF0OTFfcmVsZWFzZV9wb3J0LAorCS5yZXF1ZXN0X3BvcnQJPSBhdDkxX3JlcXVlc3RfcG9ydCwKKwkuY29uZmlnX3BvcnQgCT0gYXQ5MV9jb25maWdfcG9ydCwKKwkudmVyaWZ5X3BvcnQgCT0gYXQ5MV92ZXJpZnlfcG9ydCwKKwkucG0JCT0gYXQ5MV9zZXJpYWxfcG0sCit9OworCitzdGF0aWMgc3RydWN0IHVhcnRfcG9ydCBhdDkxX3BvcnRzW0FUOTFfTlJfVUFSVF07CisKK3ZvaWQgX19pbml0IGF0OTFfaW5pdF9wb3J0cyh2b2lkKQoreworCXN0YXRpYyBpbnQgZmlyc3QgPSAxOworCWludCBpOworCisJaWYgKCFmaXJzdCkKKwkJcmV0dXJuOworCWZpcnN0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBVDkxX05SX1VBUlQ7IGkrKykgeworCQlhdDkxX3BvcnRzW2ldLmlvdHlwZQk9IFVQSU9fTUVNOworCQlhdDkxX3BvcnRzW2ldLmZsYWdzICAgICA9IFVQRl9CT09UX0FVVE9DT05GOworCQlhdDkxX3BvcnRzW2ldLnVhcnRjbGsgICA9IGF0OTFfbWFzdGVyX2Nsb2NrOworCQlhdDkxX3BvcnRzW2ldLm9wcwk9ICZhdDkxX3BvcHM7CisJCWF0OTFfcG9ydHNbaV0uZmlmb3NpemUgID0gMTsKKwkJYXQ5MV9wb3J0c1tpXS5saW5lCT0gaTsKKyAJfQorfQorCit2b2lkIF9faW5pdCBhdDkxX3JlZ2lzdGVyX3VhcnRfZm5zKHN0cnVjdCBhdDkxcm05MjAwX3BvcnRfZm5zICpmbnMpCit7CisJaWYgKGZucy0+ZW5hYmxlX21zKQorCQlhdDkxX3BvcHMuZW5hYmxlX21zID0gZm5zLT5lbmFibGVfbXM7CisJaWYgKGZucy0+Z2V0X21jdHJsKQorCQlhdDkxX3BvcHMuZ2V0X21jdHJsID0gZm5zLT5nZXRfbWN0cmw7CisJaWYgKGZucy0+c2V0X21jdHJsKQorCQlhdDkxX3BvcHMuc2V0X21jdHJsID0gZm5zLT5zZXRfbWN0cmw7CisJYXQ5MV9vcGVuICAgICAgICAgID0gZm5zLT5vcGVuOworCWF0OTFfY2xvc2UgICAgICAgICA9IGZucy0+Y2xvc2U7CisJYXQ5MV9wb3BzLnBtICAgICAgID0gZm5zLT5wbTsKKwlhdDkxX3BvcHMuc2V0X3dha2UgPSBmbnMtPnNldF93YWtlOworfQorCisvKgorICogU2V0dXAgcG9ydHMuCisgKi8KK3ZvaWQgX19pbml0IGF0OTFfcmVnaXN0ZXJfdWFydChpbnQgaWR4LCBpbnQgcG9ydCkKK3sKKwlpZiAoKGlkeCA8IDApIHx8IChpZHggPj0gQVQ5MV9OUl9VQVJUKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBiYWQgaW5kZXggbnVtYmVyICVkXG4iLCBfX0ZVTkNUSU9OX18sIGlkeCk7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKHBvcnQpIHsKKwljYXNlIDA6CisJCWF0OTFfcG9ydHNbaWR4XS5tZW1iYXNlID0gKHZvaWQgX19pb21lbSAqKSBBVDkxX1ZBX0JBU0VfVVMwOworCQlhdDkxX3BvcnRzW2lkeF0ubWFwYmFzZSA9IEFUOTFfVkFfQkFTRV9VUzA7CisJCWF0OTFfcG9ydHNbaWR4XS5pcnEgICAgID0gQVQ5MV9JRF9VUzA7CisJCUFUOTFfQ2ZnUElPX1VTQVJUMCgpOworCQlicmVhazsKKwljYXNlIDE6CisJCWF0OTFfcG9ydHNbaWR4XS5tZW1iYXNlID0gKHZvaWQgX19pb21lbSAqKSBBVDkxX1ZBX0JBU0VfVVMxOworCQlhdDkxX3BvcnRzW2lkeF0ubWFwYmFzZSA9IEFUOTFfVkFfQkFTRV9VUzE7CisJCWF0OTFfcG9ydHNbaWR4XS5pcnEgICAgID0gQVQ5MV9JRF9VUzE7CisJCUFUOTFfQ2ZnUElPX1VTQVJUMSgpOworCQlicmVhazsKKwljYXNlIDI6CisJCWF0OTFfcG9ydHNbaWR4XS5tZW1iYXNlID0gKHZvaWQgX19pb21lbSAqKSBBVDkxX1ZBX0JBU0VfVVMyOworCQlhdDkxX3BvcnRzW2lkeF0ubWFwYmFzZSA9IEFUOTFfVkFfQkFTRV9VUzI7CisJCWF0OTFfcG9ydHNbaWR4XS5pcnEgICAgID0gQVQ5MV9JRF9VUzI7CisJCUFUOTFfQ2ZnUElPX1VTQVJUMigpOworCQlicmVhazsKKwljYXNlIDM6CisJCWF0OTFfcG9ydHNbaWR4XS5tZW1iYXNlID0gKHZvaWQgX19pb21lbSAqKSBBVDkxX1ZBX0JBU0VfVVMzOworCQlhdDkxX3BvcnRzW2lkeF0ubWFwYmFzZSA9IEFUOTFfVkFfQkFTRV9VUzM7CisJCWF0OTFfcG9ydHNbaWR4XS5pcnEgICAgID0gQVQ5MV9JRF9VUzM7CisJCUFUOTFfQ2ZnUElPX1VTQVJUMygpOworCQlicmVhazsKKwljYXNlIDQ6CisJCWF0OTFfcG9ydHNbaWR4XS5tZW1iYXNlID0gKHZvaWQgX19pb21lbSAqKSBBVDkxX1ZBX0JBU0VfREJHVTsKKwkJYXQ5MV9wb3J0c1tpZHhdLm1hcGJhc2UgPSBBVDkxX1ZBX0JBU0VfREJHVTsKKwkJYXQ5MV9wb3J0c1tpZHhdLmlycSAgICAgPSBBVDkxX0lEX1NZUzsKKwkJQVQ5MV9DZmdQSU9fREJHVSgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgICIlcyA6IGJhZCBwb3J0IG51bWJlciAlZFxuIiwgX19GVU5DVElPTl9fLCBwb3J0KTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0FUOTFfQ09OU09MRQorCisvKgorICogSW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgb24gZW50ZXJpbmcKKyAqLworc3RhdGljIHZvaWQgYXQ5MV9jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqcywgdV9pbnQgY291bnQpCit7CisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IGF0OTFfcG9ydHMgKyBjby0+aW5kZXg7CisJdW5zaWduZWQgaW50IHN0YXR1cywgaSwgaW1yOworCisJLyoKKwkgKglGaXJzdCwgc2F2ZSBJTVIgYW5kIHRoZW4gZGlzYWJsZSBpbnRlcnJ1cHRzCisJICovCisJaW1yID0gVUFSVF9HRVRfSU1SKHBvcnQpOwkvKiBnZXQgaW50ZXJydXB0IG1hc2sgKi8KKwlVQVJUX1BVVF9JRFIocG9ydCwgQVQ5MV9VU19SWFJEWSB8IEFUOTFfVVNfVFhSRFkpOworCisJLyoKKwkgKglOb3csIGRvIGVhY2ggY2hhcmFjdGVyCisJICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJZG8geworCQkJc3RhdHVzID0gVUFSVF9HRVRfQ1NSKHBvcnQpOworCQl9IHdoaWxlICghKHN0YXR1cyAmIEFUOTFfVVNfVFhSRFkpKTsKKwkJVUFSVF9QVVRfQ0hBUihwb3J0LCBzW2ldKTsKKwkJaWYgKHNbaV0gPT0gJ1xuJykgeworCQkJZG8geworCQkJCXN0YXR1cyA9IFVBUlRfR0VUX0NTUihwb3J0KTsKKwkJCX0gd2hpbGUgKCEoc3RhdHVzICYgQVQ5MV9VU19UWFJEWSkpOworCQkJVUFSVF9QVVRfQ0hBUihwb3J0LCAnXHInKTsKKwkJfQorCX0KKworCS8qCisJICoJRmluYWxseSwgd2FpdCBmb3IgdHJhbnNtaXR0ZXIgdG8gYmVjb21lIGVtcHR5CisJICoJYW5kIHJlc3RvcmUgSU1SCisJICovCisJZG8geworCQlzdGF0dXMgPSBVQVJUX0dFVF9DU1IocG9ydCk7CisJfSB3aGlsZSAoIShzdGF0dXMgJiBBVDkxX1VTX1RYUkRZKSk7CisJVUFSVF9QVVRfSUVSKHBvcnQsIGltcik7CS8qIHNldCBpbnRlcnJ1cHRzIGJhY2sgdGhlIHdheSB0aGV5IHdlcmUgKi8KK30KKworLyoKKyAqIElmIHRoZSBwb3J0IHdhcyBhbHJlYWR5IGluaXRpYWxpc2VkIChlZywgYnkgYSBib290IGxvYWRlciksIHRyeSB0byBkZXRlcm1pbmUKKyAqIHRoZSBjdXJyZW50IHNldHVwLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MV9jb25zb2xlX2dldF9vcHRpb25zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCAqYmF1ZCwgaW50ICpwYXJpdHksIGludCAqYml0cykKK3sKKwl1bnNpZ25lZCBpbnQgbXIsIHF1b3Q7CisKKy8vIFRPRE86IENSIGlzIGEgd3JpdGUtb25seSByZWdpc3RlcgorLy8JdW5zaWduZWQgaW50IGNyOworLy8KKy8vCWNyID0gVUFSVF9HRVRfQ1IocG9ydCkgJiAoQVQ5MV9VU19SWEVOIHwgQVQ5MV9VU19UWEVOKTsKKy8vCWlmIChjciA9PSAoQVQ5MV9VU19SWEVOIHwgQVQ5MV9VU19UWEVOKSkgeworLy8JCS8qIG9rLCB0aGUgcG9ydCB3YXMgZW5hYmxlZCAqLworLy8JfQorCisJbXIgPSBVQVJUX0dFVF9NUihwb3J0KSAmIEFUOTFfVVNfQ0hSTDsKKwlpZiAobXIgPT0gQVQ5MV9VU19DSFJMXzgpCisJCSpiaXRzID0gODsKKwllbHNlCisJCSpiaXRzID0gNzsKKworCW1yID0gVUFSVF9HRVRfTVIocG9ydCkgJiBBVDkxX1VTX1BBUjsKKwlpZiAobXIgPT0gQVQ5MV9VU19QQVJfRVZFTikKKwkJKnBhcml0eSA9ICdlJzsKKwllbHNlIGlmIChtciA9PSBBVDkxX1VTX1BBUl9PREQpCisJCSpwYXJpdHkgPSAnbyc7CisKKwlxdW90ID0gVUFSVF9HRVRfQlJHUihwb3J0KTsKKwkqYmF1ZCA9IHBvcnQtPnVhcnRjbGsgLyAoMTYgKiAocXVvdCkpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhdDkxX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvLCBjaGFyICpvcHRpb25zKQoreworCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQ7CisJaW50IGJhdWQgPSAxMTUyMDA7CisJaW50IGJpdHMgPSA4OworCWludCBwYXJpdHkgPSAnbic7CisJaW50IGZsb3cgPSAnbic7CisKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgYW4gaW52YWxpZCB1YXJ0IG51bWJlciBoYXMgYmVlbiBzcGVjaWZpZWQsIGFuZAorCSAqIGlmIHNvLCBzZWFyY2ggZm9yIHRoZSBmaXJzdCBhdmFpbGFibGUgcG9ydCB0aGF0IGRvZXMgaGF2ZQorCSAqIGNvbnNvbGUgc3VwcG9ydC4KKwkgKi8KKwlwb3J0ID0gdWFydF9nZXRfY29uc29sZShhdDkxX3BvcnRzLCBBVDkxX05SX1VBUlQsIGNvKTsKKworCS8qCisJICogRW5hYmxlIHRoZSBzZXJpYWwgY29uc29sZSwgaW4tY2FzZSBib290bG9hZGVyIGRpZCBub3QgZG8gaXQuCisJICovCisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QTUNfUENFUiwgMSA8PCBwb3J0LT5pcnEpOwkvKiBlbmFibGUgY2xvY2sgKi8KKwlVQVJUX1BVVF9JRFIocG9ydCwgLTEpOwkJCQkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwlVQVJUX1BVVF9DUihwb3J0LCBBVDkxX1VTX1JTVFNUQSB8IEFUOTFfVVNfUlNUUlgpOworCVVBUlRfUFVUX0NSKHBvcnQsIEFUOTFfVVNfVFhFTiB8IEFUOTFfVVNfUlhFTik7CisKKwlpZiAob3B0aW9ucykKKwkJdWFydF9wYXJzZV9vcHRpb25zKG9wdGlvbnMsICZiYXVkLCAmcGFyaXR5LCAmYml0cywgJmZsb3cpOworCWVsc2UKKwkJYXQ5MV9jb25zb2xlX2dldF9vcHRpb25zKHBvcnQsICZiYXVkLCAmcGFyaXR5LCAmYml0cyk7CisKKwlyZXR1cm4gdWFydF9zZXRfb3B0aW9ucyhwb3J0LCBjbywgYmF1ZCwgcGFyaXR5LCBiaXRzLCBmbG93KTsKK30KKworc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBhdDkxX3VhcnQ7CisKK3N0YXRpYyBzdHJ1Y3QgY29uc29sZSBhdDkxX2NvbnNvbGUgPSB7CisJLm5hbWUJCT0gQVQ5MV9ERVZJQ0VOQU1FLAorCS53cml0ZQkJPSBhdDkxX2NvbnNvbGVfd3JpdGUsCisJLmRldmljZQkJPSB1YXJ0X2NvbnNvbGVfZGV2aWNlLAorCS5zZXR1cAkJPSBhdDkxX2NvbnNvbGVfc2V0dXAsCisJLmZsYWdzCQk9IENPTl9QUklOVEJVRkZFUiwKKwkuaW5kZXgJCT0gLTEsCisJLmRhdGEJCT0gJmF0OTFfdWFydCwKK307CisKKyNkZWZpbmUgQVQ5MV9DT05TT0xFX0RFVklDRQkmYXQ5MV9jb25zb2xlCisKK3N0YXRpYyBpbnQgIF9faW5pdCBhdDkxX2NvbnNvbGVfaW5pdCh2b2lkKQoreworCWF0OTFfaW5pdF9wb3J0cygpOworCisJYXQ5MV9jb25zb2xlLmluZGV4ID0gYXQ5MV9jb25zb2xlX3BvcnQ7CisJcmVnaXN0ZXJfY29uc29sZSgmYXQ5MV9jb25zb2xlKTsKKwlyZXR1cm4gMDsKK30KK2NvbnNvbGVfaW5pdGNhbGwoYXQ5MV9jb25zb2xlX2luaXQpOworCisjZWxzZQorI2RlZmluZSBBVDkxX0NPTlNPTEVfREVWSUNFCU5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIGF0OTFfdWFydCA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5kcml2ZXJfbmFtZQkJPSBBVDkxX0RFVklDRU5BTUUsCisJLmRldl9uYW1lCQk9IEFUOTFfREVWSUNFTkFNRSwKKwkuZGV2ZnNfbmFtZQkJPSBBVDkxX0RFVklDRU5BTUUsCisJLm1ham9yCQkJPSBTRVJJQUxfQVQ5MV9NQUpPUiwKKwkubWlub3IJCQk9IE1JTk9SX1NUQVJULAorCS5ucgkJCT0gQVQ5MV9OUl9VQVJULAorCS5jb25zCQkJPSBBVDkxX0NPTlNPTEVfREVWSUNFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXQ5MV9zZXJpYWxfaW5pdCh2b2lkKQoreworCWludCByZXQsIGk7CisKKwlhdDkxX2luaXRfcG9ydHMoKTsKKworCXJldCA9IHVhcnRfcmVnaXN0ZXJfZHJpdmVyKCZhdDkxX3VhcnQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVQ5MV9OUl9VQVJUOyBpKyspIHsKKwkJaWYgKGF0OTFfc2VyaWFsX21hcFtpXSA+PSAwKQorCQkJdWFydF9hZGRfb25lX3BvcnQoJmF0OTFfdWFydCwgJmF0OTFfcG9ydHNbaV0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXQ5MV9zZXJpYWxfZXhpdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFUOTFfTlJfVUFSVDsgaSsrKSB7CisgCQlpZiAoYXQ5MV9zZXJpYWxfbWFwW2ldID49IDApCisJCQl1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmYXQ5MV91YXJ0LCAmYXQ5MV9wb3J0c1tpXSk7CisgIAl9CisKKwl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZhdDkxX3VhcnQpOworfQorCittb2R1bGVfaW5pdChhdDkxX3NlcmlhbF9pbml0KTsKK21vZHVsZV9leGl0KGF0OTFfc2VyaWFsX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJSaWNrIEJyb25zb24iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQVQ5MSBnZW5lcmljIHNlcmlhbCBwb3J0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvYXUxeDAwX3VhcnQuYyBiL2RyaXZlcnMvc2VyaWFsL2F1MXgwMF91YXJ0LmMKaW5kZXggYTI3NGViZi4uY2ViNWQ3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvYXUxeDAwX3VhcnQuYworKysgYi9kcml2ZXJzL3NlcmlhbC9hdTF4MDBfdWFydC5jCkBAIC0yNDEsMTggKzI0MSwxMiBAQAogcmVjZWl2ZV9jaGFycyhzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwLCBpbnQgKnN0YXR1cywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHVwLT5wb3J0LmluZm8tPnR0eTsKLQl1bnNpZ25lZCBjaGFyIGNoOworCXVuc2lnbmVkIGNoYXIgY2gsIGZsYWc7CiAJaW50IG1heF9jb3VudCA9IDI1NjsKIAogCWRvIHsKLQkJaWYgKHVubGlrZWx5KHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSkgewotCQkJdHR5LT5mbGlwLndvcmsuZnVuYygodm9pZCAqKXR0eSk7Ci0JCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpCi0JCQkJcmV0dXJuOyAvLyBpZiBUVFlfRE9OVF9GTElQIGlzIHNldAotCQl9CiAJCWNoID0gc2VyaWFsX2lucCh1cCwgVUFSVF9SWCk7Ci0JCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyID0gY2g7Ci0JCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX05PUk1BTDsKKwkJZmxhZyA9IFRUWV9OT1JNQUw7CiAJCXVwLT5wb3J0Lmljb3VudC5yeCsrOwogCiAJCWlmICh1bmxpa2VseSgqc3RhdHVzICYgKFVBUlRfTFNSX0JJIHwgVUFSVF9MU1JfUEUgfApAQCAtMjkyLDMwICsyODYsMjMgQEAKICNlbmRpZgogCQkJaWYgKCpzdGF0dXMgJiBVQVJUX0xTUl9CSSkgewogCQkJCURFQlVHX0lOVFIoImhhbmRsaW5nIGJyZWFrLi4uLiIpOwotCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX0JSRUFLOworCQkJCWZsYWcgPSBUVFlfQlJFQUs7CiAJCQl9IGVsc2UgaWYgKCpzdGF0dXMgJiBVQVJUX0xTUl9QRSkKLQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9QQVJJVFk7CisJCQkJZmxhZyA9IFRUWV9QQVJJVFk7CiAJCQllbHNlIGlmICgqc3RhdHVzICYgVUFSVF9MU1JfRkUpCi0JCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfRlJBTUU7CisJCQkJZmxhZyA9IFRUWV9GUkFNRTsKIAkJfQogCQlpZiAodWFydF9oYW5kbGVfc3lzcnFfY2hhcigmdXAtPnBvcnQsIGNoLCByZWdzKSkKIAkJCWdvdG8gaWdub3JlX2NoYXI7Ci0JCWlmICgoKnN0YXR1cyAmIHVwLT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzaykgPT0gMCkgewotCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOwotCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOwotCQkJdHR5LT5mbGlwLmNvdW50Kys7Ci0JCX0KLQkJaWYgKCgqc3RhdHVzICYgVUFSVF9MU1JfT0UpICYmCi0JCSAgICB0dHktPmZsaXAuY291bnQgPCBUVFlfRkxJUEJVRl9TSVpFKSB7CisJCWlmICgoKnN0YXR1cyAmIHVwLT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzaykgPT0gMCkKKwkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY2gsIGZsYWcpOworCQlpZiAoKnN0YXR1cyAmIFVBUlRfTFNSX09FKQogCQkJLyoKIAkJCSAqIE92ZXJydW4gaXMgc3BlY2lhbCwgc2luY2UgaXQncyByZXBvcnRlZAogCQkJICogaW1tZWRpYXRlbHksIGFuZCBkb2Vzbid0IGFmZmVjdCB0aGUgY3VycmVudAogCQkJICogY2hhcmFjdGVyLgogCQkJICovCi0JCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9PVkVSUlVOOwotCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOwotCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOwotCQkJdHR5LT5mbGlwLmNvdW50Kys7CisJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9PVkVSUlVOKTsKIAkJfQogCWlnbm9yZV9jaGFyOgogCQkqc3RhdHVzID0gc2VyaWFsX2lucCh1cCwgVUFSVF9MU1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvY2xwczcxMXguYyBiL2RyaXZlcnMvc2VyaWFsL2NscHM3MTF4LmMKaW5kZXggODdlZjM2OC4uOGVmOTk5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvY2xwczcxMXguYworKysgYi9kcml2ZXJzL3NlcmlhbC9jbHBzNzExeC5jCkBAIC0xMDQsOCArMTA0LDYgQEAKIAl3aGlsZSAoIShzdGF0dXMgJiBTWVNGTEdfVVJYRkUpKSB7CiAJCWNoID0gY2xwc19yZWFkbChVQVJURFIocG9ydCkpOwogCi0JCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkKLQkJCWdvdG8gaWdub3JlX2NoYXI7CiAJCXBvcnQtPmljb3VudC5yeCsrOwogCiAJCWZsZyA9IFRUWV9OT1JNQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jb3JlLmMgYi9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jb3JlLmMKaW5kZXggOTg3ZDIyYi4uMTZhZjU2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY29yZS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NvcmUuYwpAQCAtNjA4LDcgKzYwOCw3IEBACiAKIAkJcCA9IGNwbTJjcHVfYWRkcihiZHAtPmNiZF9idWZhZGRyKTsKIAotCQkqcCsrID0geG1pdC0+YnVmW3htaXQtPnRhaWxdOworCQkqcCsrID0gcG9ydC0+eF9jaGFyOwogCQliZHAtPmNiZF9kYXRsZW4gPSAxOwogCQliZHAtPmNiZF9zYyB8PSBCRF9TQ19SRUFEWTsKIAkJLyogR2V0IG5leHQgQkQuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9jcmlzdjEwLmMgYi9kcml2ZXJzL3NlcmlhbC9jcmlzdjEwLmMKaW5kZXggMDhjNDJjMC4uYmUxMjYyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvY3Jpc3YxMC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2NyaXN2MTAuYwpAQCAtNDQyLDYgKzQ0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTEzMTUsMTEgKzEzMTYsNyBAQAogICogbWVtb3J5IGlmIGxhcmdlIG51bWJlcnMgb2Ygc2VyaWFsIHBvcnRzIGFyZSBvcGVuLgogICovCiBzdGF0aWMgdW5zaWduZWQgY2hhciAqdG1wX2J1ZjsKLSNpZmRlZiBERUNMQVJFX01VVEVYCi1zdGF0aWMgREVDTEFSRV9NVVRFWCh0bXBfYnVmX3NlbSk7Ci0jZWxzZQotc3RhdGljIHN0cnVjdCBzZW1hcGhvcmUgdG1wX2J1Zl9zZW0gPSBNVVRFWDsKLSNlbmRpZgorc3RhdGljIERFRklORV9NVVRFWCh0bXBfYnVmX211dGV4KTsKIAogLyogQ2FsY3VsYXRlIHRoZSBjaGFydGltZSBkZXBlbmRpbmcgb24gYmF1ZHJhdGUsIG51bWJvciBvZiBiaXRzIGV0Yy4gKi8KIHN0YXRpYyB2b2lkIHVwZGF0ZV9jaGFyX3RpbWUoc3RydWN0IGUxMDBfc2VyaWFsICogaW5mbykKQEAgLTM2NjEsNyArMzY1OCw3IEBACiAJICogZGVzaWduLgogCSAqLwogCWlmIChmcm9tX3VzZXIpIHsKLQkJZG93bigmdG1wX2J1Zl9zZW0pOworCQltdXRleF9sb2NrKCZ0bXBfYnVmX211dGV4KTsKIAkJd2hpbGUgKDEpIHsKIAkJCWludCBjMTsKIAkJCWMgPSBDSVJDX1NQQUNFX1RPX0VORChpbmZvLT54bWl0LmhlYWQsCkBAIC0zNjkyLDcgKzM2ODksNyBAQAogCQkJY291bnQgLT0gYzsKIAkJCXJldCArPSBjOwogCQl9Ci0JCXVwKCZ0bXBfYnVmX3NlbSk7CisJCW11dGV4X3VubG9jaygmdG1wX2J1Zl9tdXRleCk7CiAJfSBlbHNlIHsKIAkJY2xpKCk7CiAJCXdoaWxlIChjb3VudCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvZHouYyBiL2RyaXZlcnMvc2VyaWFsL2R6LmMKaW5kZXggNGQ4NTE2ZC4uYTY0YmEyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvZHouYworKysgYi9kcml2ZXJzL3NlcmlhbC9kei5jCkBAIC0yMTYsOCArMjE2LDYgQEAKIAogCQlpZiAoIXR0eSkKIAkJCWJyZWFrOwotCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpCi0JCQlicmVhazsKIAogCQlpY291bnQtPnJ4Kys7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2ljb20uYyBiL2RyaXZlcnMvc2VyaWFsL2ljb20uYwppbmRleCBlYjMxMTI1Li4xNDRhN2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9pY29tLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvaWNvbS5jCkBAIC03MjksMTkgKzcyOSwyMCBAQAogCXVuc2lnbmVkIHNob3J0IGludCBzdGF0dXM7CiAJc3RydWN0IHVhcnRfaWNvdW50ICppY291bnQ7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdW5zaWduZWQgY2hhciBmbGFnOwogCiAJdHJhY2UoaWNvbV9wb3J0LCAiUkNWX0NPTVBMRVRFIiwgMCk7CiAJcmN2X2J1ZmYgPSBpY29tX3BvcnQtPm5leHRfcmN2OwogCiAJc3RhdHVzID0gY3B1X3RvX2xlMTYoaWNvbV9wb3J0LT5zdGF0U3RnLT5yY3ZbcmN2X2J1ZmZdLmZsYWdzKTsKIAl3aGlsZSAoc3RhdHVzICYgU0FfRkxfUkNWX0RPTkUpIHsKKwkJaW50IGZpcnN0ID0gLTE7CiAKIAkJdHJhY2UoaWNvbV9wb3J0LCAiRklEX1NUQVRVUyIsIHN0YXR1cyk7CiAJCWNvdW50ID0gY3B1X3RvX2xlMTYoaWNvbV9wb3J0LT5zdGF0U3RnLT5yY3ZbcmN2X2J1ZmZdLmxlTGVuZ3RoKTsKIAorICAgICAgICAgICAgICAgIGNvdW50ID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBjb3VudCk7CiAJCXRyYWNlKGljb21fcG9ydCwgIlJDVl9DT1VOVCIsIGNvdW50KTsKLQkJaWYgKGNvdW50ID4gKFRUWV9GTElQQlVGX1NJWkUgLSB0dHktPmZsaXAuY291bnQpKQotCQkJY291bnQgPSBUVFlfRkxJUEJVRl9TSVpFIC0gdHR5LT5mbGlwLmNvdW50OwogCiAJCXRyYWNlKGljb21fcG9ydCwgIlJFQUxfQ09VTlQiLCBjb3VudCk7CiAKQEAgLTc0OSwxNSArNzUwLDEwIEBACiAJCQljcHVfdG9fbGUzMihpY29tX3BvcnQtPnN0YXRTdGctPnJjdltyY3ZfYnVmZl0ubGVCdWZmZXIpIC0KIAkJCWljb21fcG9ydC0+cmVjdl9idWZfcGNpOwogCi0JCW1lbWNweSh0dHktPmZsaXAuY2hhcl9idWZfcHRyLCh1bnNpZ25lZCBjaGFyICopCi0JCSAgICAgICAoKHVuc2lnbmVkIGxvbmcpaWNvbV9wb3J0LT5yZWN2X2J1ZiArIG9mZnNldCksIGNvdW50KTsKLQorCQkvKiBCbG9jayBjb3B5IGFsbCBidXQgdGhlIGxhc3QgYnl0ZSBhcyB0aGlzIG1heSBoYXZlIHN0YXR1cyAqLwogCQlpZiAoY291bnQgPiAwKSB7Ci0JCQl0dHktPmZsaXAuY291bnQgKz0gY291bnQgLSAxOwotCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciArPSBjb3VudCAtIDE7Ci0KLQkJCW1lbXNldCh0dHktPmZsaXAuZmxhZ19idWZfcHRyLCAwLCBjb3VudCk7Ci0JCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyICs9IGNvdW50IC0gMTsKKwkJCWZpcnN0ID0gaWNvbV9wb3J0LT5yZWN2X2J1ZltvZmZzZXRdOworCQkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGljb21fcG9ydC0+cmVjdl9idWYgKyBvZmZzZXQsIGNvdW50IC0gMSk7CiAJCX0KIAogCQlpY291bnQgPSAmaWNvbV9wb3J0LT51YXJ0X3BvcnQuaWNvdW50OwpAQCAtNzY1LDEyICs3NjEsMTQgQEAKIAogCQkvKiBCcmVhayBkZXRlY3QgbG9naWMgKi8KIAkJaWYgKChzdGF0dXMgJiBTQV9GTEFHU19GUkFNRV9FUlJPUikKLQkJICAgICYmICh0dHktPmZsaXAuY2hhcl9idWZfcHRyWzBdID09IDB4MDApKSB7CisJCSAgICAmJiBmaXJzdCA9PSAwKSB7CiAJCQlzdGF0dXMgJj0gflNBX0ZMQUdTX0ZSQU1FX0VSUk9SOwogCQkJc3RhdHVzIHw9IFNBX0ZMQUdTX0JSRUFLX0RFVDsKIAkJCXRyYWNlKGljb21fcG9ydCwgIkJSRUFLX0RFVCIsIDApOwogCQl9CiAKKwkJZmxhZyA9IFRUWV9OT1JNQUw7CisKIAkJaWYgKHN0YXR1cyAmCiAJCSAgICAoU0FfRkxBR1NfQlJFQUtfREVUIHwgU0FfRkxBR1NfUEFSSVRZX0VSUk9SIHwKIAkJICAgICBTQV9GTEFHU19GUkFNRV9FUlJPUiB8IFNBX0ZMQUdTX09WRVJSVU4pKSB7CkBAIC03OTcsMzMgKzc5NSwyNiBAQAogCQkJc3RhdHVzICY9IGljb21fcG9ydC0+cmVhZF9zdGF0dXNfbWFzazsKIAogCQkJaWYgKHN0YXR1cyAmIFNBX0ZMQUdTX0JSRUFLX0RFVCkgewotCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX0JSRUFLOworCQkJCWZsYWcgPSBUVFlfQlJFQUs7CiAJCQl9IGVsc2UgaWYgKHN0YXR1cyAmIFNBX0ZMQUdTX1BBUklUWV9FUlJPUikgewogCQkJCXRyYWNlKGljb21fcG9ydCwgIlBBUklUWV9FUlJPUiIsIDApOwotCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX1BBUklUWTsKKwkJCQlmbGFnID0gVFRZX1BBUklUWTsKIAkJCX0gZWxzZSBpZiAoc3RhdHVzICYgU0FfRkxBR1NfRlJBTUVfRVJST1IpCi0JCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfRlJBTUU7CisJCQkJZmxhZyA9IFRUWV9GUkFNRTsKIAotCQkJaWYgKHN0YXR1cyAmIFNBX0ZMQUdTX09WRVJSVU4pIHsKLQkJCQkvKgotCQkJCSAqIE92ZXJydW4gaXMgc3BlY2lhbCwgc2luY2UgaXQncwotCQkJCSAqIHJlcG9ydGVkIGltbWVkaWF0ZWx5LCBhbmQgZG9lc24ndAotCQkJCSAqIGFmZmVjdCB0aGUgY3VycmVudCBjaGFyYWN0ZXIKLQkJCQkgKi8KLQkJCQlpZiAodHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSkgewotCQkJCQl0dHktPmZsaXAuY291bnQrKzsKLQkJCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOwotCQkJCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyKys7Ci0JCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX09WRVJSVU47Ci0JCQkJfQotCQkJfQogCQl9CiAKLQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOwotCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyKys7Ci0JCXR0eS0+ZmxpcC5jb3VudCsrOwotCQlpZ25vcmVfY2hhcjoKLQkJCWljb21fcG9ydC0+c3RhdFN0Zy0+cmN2W3Jjdl9idWZmXS5mbGFncyA9IDA7CisJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgKihpY29tX3BvcnQtPnJlY3ZfYnVmICsgb2Zmc2V0ICsgY291bnQgLSAxKSwgZmxhZyk7CisKKwkJaWYgKHN0YXR1cyAmIFNBX0ZMQUdTX09WRVJSVU4pCisJCQkvKgorCQkJICogT3ZlcnJ1biBpcyBzcGVjaWFsLCBzaW5jZSBpdCdzCisJCQkgKiByZXBvcnRlZCBpbW1lZGlhdGVseSwgYW5kIGRvZXNuJ3QKKwkJCSAqIGFmZmVjdCB0aGUgY3VycmVudCBjaGFyYWN0ZXIKKwkJCSAqLworCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTik7CitpZ25vcmVfY2hhcjoKKwkJaWNvbV9wb3J0LT5zdGF0U3RnLT5yY3ZbcmN2X2J1ZmZdLmZsYWdzID0gMDsKIAkJaWNvbV9wb3J0LT5zdGF0U3RnLT5yY3ZbcmN2X2J1ZmZdLmxlTGVuZ3RoID0gMDsKIAkJaWNvbV9wb3J0LT5zdGF0U3RnLT5yY3ZbcmN2X2J1ZmZdLldvcmtpbmdMZW5ndGggPQogCQkJKHVuc2lnbmVkIHNob3J0IGludCkgY3B1X3RvX2xlMTYoUkNWX0JVRkZfU1opOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvaW14LmMgYi9kcml2ZXJzL3NlcmlhbC9pbXguYwppbmRleCA4M2M0YzEyLi41ODdjYzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9pbXguYworKysgYi9kcml2ZXJzL3NlcmlhbC9pbXguYwpAQCAtMjU2LDkgKzI1Niw2IEBACiAJZXJyb3JfcmV0dXJuOgogCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIHJ4LCBmbGcpOwogCi0JCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkKLQkJCWdvdG8gb3V0OwotCiAJaWdub3JlX2NoYXI6CiAJCXJ4ID0gVVJYRDAoKHUzMilzcG9ydC0+cG9ydC5tZW1iYXNlKTsKIAl9IHdoaWxlKHJ4ICYgVVJYRF9DSEFSUkRZKTsKQEAgLTUwMiw3ICs0OTksNyBAQAogCQl1Y3IyIHw9IFVDUjJfU1RQQjsKIAlpZiAodGVybWlvcy0+Y19jZmxhZyAmIFBBUkVOQikgewogCQl1Y3IyIHw9IFVDUjJfUFJFTjsKLQkJaWYgKCEodGVybWlvcy0+Y19jZmxhZyAmIFBBUk9ERCkpCisJCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgUEFST0REKQogCQkJdWNyMiB8PSBVQ1IyX1BST0U7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9pb2MzX3NlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvaW9jM19zZXJpYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDk3Y2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zZXJpYWwvaW9jM19zZXJpYWwuYwpAQCAtMCwwICsxLDIxOTcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgbW9kdWxlIHZlcnNpb24gb2YgdGhlIGlvYzMgc2VyaWFsIGRyaXZlci4gVGhpcworICogaW5jbHVkZXMgYWxsIHRoZSBzdXBwb3J0IGZ1bmN0aW9ucyBuZWVkZWQgKHN1cHBvcnQgZnVuY3Rpb25zLCBldGMuKQorICogYW5kIHRoZSBzZXJpYWwgZHJpdmVyIGl0c2VsZi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvY2lyY19idWYuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2MzLmg+CisKKy8qCisgKiBJbnRlcmVzdGluZyB0aGluZ3MgYWJvdXQgdGhlIGlvYzMKKyAqLworCisjZGVmaW5lIExPR0lDQUxfUE9SVFMJCTIJLyogcnMyMzIoMCkgYW5kIHJzNDIyKDEpICovCisjZGVmaW5lIFBPUlRTX1BFUl9DQVJECQkyCisjZGVmaW5lIExPR0lDQUxfUE9SVFNfUEVSX0NBUkQgKFBPUlRTX1BFUl9DQVJEICogTE9HSUNBTF9QT1JUUykKKyNkZWZpbmUgTUFYX0NBUkRTCQk4CisjZGVmaW5lIE1BWF9MT0dJQ0FMX1BPUlRTCShMT0dJQ0FMX1BPUlRTX1BFUl9DQVJEICogTUFYX0NBUkRTKQorCisvKiBkZXRlcm1pbmUgZ2l2ZW4gdGhlIHNpb19pciB3aGF0IHBvcnQgaXQgYXBwbGllcyB0byAqLworI2RlZmluZSBHRVRfUE9SVF9GUk9NX1NJT19JUihfeCkJKF94ICYgU0lPX0lSX1NBKSA/IDAgOiAxCisKKworLyoKKyAqIHdlIGhhdmUgMiBsb2dpY2FsIHBvcnRzIChyczIzMiwgcnM0MjIpIGZvciBlYWNoIHBoeXNpY2FsIHBvcnQKKyAqIGV2ZW5zIGFyZSByczIzMiwgb2RkcyBhcmUgcnM0MjIKKyAqLworI2RlZmluZSBHRVRfUEhZU0lDQUxfUE9SVChfeCkJKChfeCkgPj4gMSkKKyNkZWZpbmUgR0VUX0xPR0lDQUxfUE9SVChfeCkJKChfeCkgJiAxKQorI2RlZmluZSBJU19QSFlTSUNBTF9QT1JUKF94KQkhKChfeCkgJiAxKQorI2RlZmluZSBJU19SUzIzMihfeCkJCSEoKF94KSAmIDEpCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgTnVtX29mX2lvYzNfY2FyZHM7CitzdGF0aWMgdW5zaWduZWQgaW50IFN1Ym1vZHVsZV9zbG90OworCisvKiBkZWZpbmluZyB0aGlzIHdpbGwgZ2V0IHlvdSBMT1RTIG9mIGdyZWF0IGRlYnVnIGluZm8gKi8KKy8vI2RlZmluZSBERUJVR19JTlRFUlJVUFRTCisjZGVmaW5lIERQUklOVF9DT05GSUcoX3guLi4pCTsKKy8vI2RlZmluZSBEUFJJTlRfQ09ORklHKF94Li4uKSAgcHJpbnRrIF94CisjZGVmaW5lIE5PVF9QUk9HUkVTUygpCTsKKy8vI2RlZmluZSBOT1RfUFJPR1JFU1MoKQlwcmludGsoIiVzIDogZmFpbHMgJWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCisKKy8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdlIHdhbnQgdG8gdHJhbnNtaXQgdG8gdGhlIGxvd2VyIGxldmVsIGF0IGEgdGltZSAqLworI2RlZmluZSBNQVhfQ0hBUlMJCTI1NgorI2RlZmluZSBGSUZPX1NJWkUJCShNQVhfQ0hBUlMtMSkJLyogaXQncyBhIHVjaGFyICovCisKKy8qIERldmljZSBuYW1lIHdlJ3JlIHVzaW5nICovCisjZGVmaW5lIERFVklDRV9OQU1FCQkidHR5U0lPQyIKKyNkZWZpbmUgREVWSUNFX01BSk9SCQkyMDQKKyNkZWZpbmUgREVWSUNFX01JTk9SCQkxMTYKKworLyogZmxhZ3MgZm9yIG5leHRfY2hhcl9zdGF0ZSAqLworI2RlZmluZSBOQ1NfQlJFQUsJCTB4MQorI2RlZmluZSBOQ1NfUEFSSVRZCQkweDIKKyNkZWZpbmUgTkNTX0ZSQU1JTkcJCTB4NAorI2RlZmluZSBOQ1NfT1ZFUlJVTgkJMHg4CisKKy8qIGNhdXNlIHdlIG5lZWQgU09NRSBwYXJhbWV0ZXJzIC4uLiAqLworI2RlZmluZSBNSU5fQkFVRF9TVVBQT1JURUQJMTIwMAorI2RlZmluZSBNQVhfQkFVRF9TVVBQT1JURUQJMTE1MjAwCisKKy8qIHByb3RvY29sIHR5cGVzIHN1cHBvcnRlZCAqLworI2RlZmluZSBQUk9UT19SUzIzMgkJMAorI2RlZmluZSBQUk9UT19SUzQyMgkJMQorCisvKiBOb3RpZmljYXRpb24gdHlwZXMgKi8KKyNkZWZpbmUgTl9EQVRBX1JFQURZCQkweDAxCisjZGVmaW5lIE5fT1VUUFVUX0xPV0FUCQkweDAyCisjZGVmaW5lIE5fQlJFQUsJCQkweDA0CisjZGVmaW5lIE5fUEFSSVRZX0VSUk9SCQkweDA4CisjZGVmaW5lIE5fRlJBTUlOR19FUlJPUgkJMHgxMAorI2RlZmluZSBOX09WRVJSVU5fRVJST1IJCTB4MjAKKyNkZWZpbmUgTl9ERENECQkJMHg0MAorI2RlZmluZSBOX0RDVFMJCQkweDgwCisKKyNkZWZpbmUgTl9BTExfSU5QVVQJCShOX0RBVEFfUkVBRFkgfCBOX0JSRUFLCQkJICAgXAorCQkJCQl8IE5fUEFSSVRZX0VSUk9SIHwgTl9GUkFNSU5HX0VSUk9SIFwKKwkJCQkJfCBOX09WRVJSVU5fRVJST1IgfCBOX0REQ0QgfCBOX0RDVFMpCisKKyNkZWZpbmUgTl9BTExfT1VUUFVUCQlOX09VVFBVVF9MT1dBVAorCisjZGVmaW5lIE5fQUxMX0VSUk9SUwkJKE5fUEFSSVRZX0VSUk9SIHwgTl9GUkFNSU5HX0VSUk9SIFwKKwkJCQkJCXwgTl9PVkVSUlVOX0VSUk9SKQorCisjZGVmaW5lIE5fQUxMCQkJKE5fREFUQV9SRUFEWSB8IE5fT1VUUFVUX0xPV0FUIHwgTl9CUkVBSyAgICBcCisJCQkJCXwgTl9QQVJJVFlfRVJST1IgfCBOX0ZSQU1JTkdfRVJST1IgIFwKKwkJCQkJfCBOX09WRVJSVU5fRVJST1IgfCBOX0REQ0QgfCBOX0RDVFMpCisKKyNkZWZpbmUgU0VSX0NMS19TUEVFRChwcmVkaXYpCSgoMjIwMDAwMDAgPDwgMSkgLyBwcmVkaXYpCisjZGVmaW5lIFNFUl9ESVZJU09SKHgsIGNsaykJKCgoY2xrKSArICh4KSAqIDgpIC8gKCh4KSAqIDE2KSkKKyNkZWZpbmUgRElWSVNPUl9UT19CQVVEKGRpdiwgY2xrKSAoKGNsaykgLyAxNiAvIChkaXYpKQorCisvKiBTb21lIG1hc2tzICovCisjZGVmaW5lIExDUl9NQVNLX0JJVFNfQ0hBUgkoVUFSVF9MQ1JfV0xFTjUgfCBVQVJUX0xDUl9XTEVONiBcCisJCQkJCXwgVUFSVF9MQ1JfV0xFTjcgfCBVQVJUX0xDUl9XTEVOOCkKKyNkZWZpbmUgTENSX01BU0tfU1RPUF9CSVRTCShVQVJUX0xDUl9TVE9QKQorCisjZGVmaW5lIFBFTkRJTkcoX2EsIF9wKQkJKHJlYWRsKCYoX3ApLT52bWEtPnNpb19pcikgJiAoX2EpLT5pY19lbmFibGUpCisKKyNkZWZpbmUgUklOR19CVUZfU0laRQkJNDA5NgorI2RlZmluZSBCVUZfU0laRV9CSVQJCVNCQlJfTF9TSVpFCisjZGVmaW5lIFBST0RfQ09OU19NQVNLCQlQUk9EX0NPTlNfUFRSXzRLCisKKyNkZWZpbmUgVE9UQUxfUklOR19CVUZfU0laRQkoUklOR19CVUZfU0laRSAqIDQpCisKKy8qIGRyaXZlciBzcGVjaWZpYyAtIG9uZSBwZXIgY2FyZCAqLworc3RydWN0IGlvYzNfY2FyZCB7CisJc3RydWN0IHsKKwkJLyogdWFydCBwb3J0cyBhcmUgYWxsb2NhdGVkIGhlcmUgKi8KKwkJc3RydWN0IHVhcnRfcG9ydCBpY3BfdWFydF9wb3J0W0xPR0lDQUxfUE9SVFNdOworCQkvKiB0aGUgaW9jM19wb3J0IHVzZWQgZm9yIHRoaXMgcG9ydCAqLworCQlzdHJ1Y3QgaW9jM19wb3J0ICppY3BfcG9ydDsKKwl9IGljX3BvcnRbUE9SVFNfUEVSX0NBUkRdOworCS8qIGN1cnJlbnRseSBlbmFibGVkIGludGVycnVwdHMgKi8KKwl1aW50MzJfdCBpY19lbmFibGU7Cit9OworCisvKiBMb2NhbCBwb3J0IGluZm8gZm9yIGVhY2ggSU9DMyBzZXJpYWwgcG9ydCAqLworc3RydWN0IGlvYzNfcG9ydCB7CisJLyogaGFuZHkgcmVmZXJlbmNlIG1hdGVyaWFsICovCisJc3RydWN0IHVhcnRfcG9ydCAqaXBfcG9ydDsKKwlzdHJ1Y3QgaW9jM19jYXJkICppcF9jYXJkOworCXN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppcF9pZGQ7CisJc3RydWN0IGlvYzNfc3VibW9kdWxlICppcF9pczsKKworCS8qIHBjaSBtZW0gYWRkcmVzc2VzIGZvciB0aGlzIHBvcnQgKi8KKwlzdHJ1Y3QgaW9jM19zZXJpYWxyZWdzIF9faW9tZW0gKmlwX3NlcmlhbF9yZWdzOworCXN0cnVjdCBpb2MzX3VhcnRyZWdzIF9faW9tZW0gKmlwX3VhcnRfcmVnczsKKworCS8qIFJpbmcgYnVmZmVyIHBhZ2UgZm9yIHRoaXMgcG9ydCAqLworCWRtYV9hZGRyX3QgaXBfZG1hX3JpbmdidWY7CisJLyogdmFkZHIgb2YgcmluZyBidWZmZXIgKi8KKwlzdHJ1Y3QgcmluZ19idWZmZXIgKmlwX2NwdV9yaW5nYnVmOworCisJLyogUmluZ3MgZm9yIHRoaXMgcG9ydCAqLworCXN0cnVjdCByaW5nICppcF9pbnJpbmc7CisJc3RydWN0IHJpbmcgKmlwX291dHJpbmc7CisKKwkvKiBIb29rIHRvIHBvcnQgc3BlY2lmaWMgdmFsdWVzICovCisJc3RydWN0IHBvcnRfaG9va3MgKmlwX2hvb2tzOworCisJc3BpbmxvY2tfdCBpcF9sb2NrOworCisJLyogVmFyaW91cyByeC90eCBwYXJhbWV0ZXJzICovCisJaW50IGlwX2JhdWQ7CisJaW50IGlwX3R4X2xvd2F0OworCWludCBpcF9yeF90aW1lb3V0OworCisJLyogQ29weSBvZiBub3RpZmljYXRpb24gYml0cyAqLworCWludCBpcF9ub3RpZnk7CisKKwkvKiBTaGFkb3cgY29waWVzIG9mIHZhcmlvdXMgcmVnaXN0ZXJzIHNvIHdlIGRvbid0IG5lZWQgdG8gUElPCisJICogcmVhZCB0aGVtIGNvbnN0YW50bHkKKwkgKi8KKwl1aW50MzJfdCBpcF9zc2NyOworCXVpbnQzMl90IGlwX3R4X3Byb2Q7CisJdWludDMyX3QgaXBfcnhfY29uczsKKwl1bnNpZ25lZCBjaGFyIGlwX2ZsYWdzOworfTsKKworLyogdHggbG93IHdhdGVyIG1hcmsuICBXZSBuZWVkIHRvIG5vdGlmeSB0aGUgZHJpdmVyIHdoZW5ldmVyIHR4IGlzIGdldHRpbmcKKyAqIGNsb3NlIHRvIGVtcHR5IHNvIGl0IGNhbiByZWZpbGwgdGhlIHR4IGJ1ZmZlciBhbmQga2VlcCB0aGluZ3MgZ29pbmcuCisgKiBMZXQncyBhc3N1bWUgdGhhdCBpZiB3ZSBpbnRlcnJ1cHQgMSBtcyBiZWZvcmUgdGhlIHR4IGdvZXMgaWRsZSwgd2UnbGwKKyAqIGhhdmUgbm8gdHJvdWJsZSBnZXR0aW5nIGluIG1vcmUgY2hhcnMgaW4gdGltZSAoSSBjZXJ0YWlubHkgaG9wZSBzbykuCisgKi8KKyNkZWZpbmUgVFhfTE9XQVRfTEFURU5DWSAgICAgIDEwMDAKKyNkZWZpbmUgVFhfTE9XQVRfSFogICAgICAgICAgKDEwMDAwMDAgLyBUWF9MT1dBVF9MQVRFTkNZKQorI2RlZmluZSBUWF9MT1dBVF9DSEFSUyhiYXVkKSAoYmF1ZCAvIDEwIC8gVFhfTE9XQVRfSFopCisKKy8qIEZsYWdzIHBlciBwb3J0ICovCisjZGVmaW5lIElOUFVUX0hJR0gJCTB4MDEKKwkvKiB1c2VkIHRvIHNpZ25pZnkgdGhhdCB3ZSBoYXZlIHR1cm5lZCBvZmYgdGhlIHJ4X2hpZ2gKKwkgKiB0ZW1wb3JhcmlseSAtIHdlIG5lZWQgdG8gZHJhaW4gdGhlIGZpZm8gYW5kIGRvbid0CisJICogd2FudCB0byBnZXQgYmxhc3RlZCB3aXRoIGludGVycnVwdHMuCisJICovCisjZGVmaW5lIERDRF9PTgkJCTB4MDIKKwkvKiBEQ0Qgc3RhdGUgaXMgb24gKi8KKyNkZWZpbmUgTE9XQVRfV1JJVFRFTgkJMHgwNAorI2RlZmluZSBSRUFEX0FCT1JURUQJCTB4MDgKKwkvKiB0aGUgcmVhZCB3YXMgYWJvcnRlZCAtIHVzZWQgdG8gYXZhb2lkIGluZmluYXRlIGxvb3BpbmcKKwkgKiBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIKKwkgKi8KKyNkZWZpbmUgSU5QVVRfRU5BQkxFCQkweDEwCisKKy8qIFNpbmNlIGVhY2ggcG9ydCBoYXMgZGlmZmVyZW50IHJlZ2lzdGVyIG9mZnNldHMgYW5kIGJpdG1hc2tzCisgKiBmb3IgZXZlcnl0aGluZywgd2UnbGwgc3RvcmUgdGhvc2UgdGhhdCB3ZSBuZWVkIGluIHRhYmxlcyBzbyB3ZQorICogZG9uJ3QgaGF2ZSB0byBiZSBjb25zdGFudGx5IGNoZWNraW5nIHRoZSBwb3J0IHdlIGFyZSBkZWFsaW5nIHdpdGguCisgKi8KK3N0cnVjdCBwb3J0X2hvb2tzIHsKKwl1aW50MzJfdCBpbnRyX2RlbHRhX2RjZDsKKwl1aW50MzJfdCBpbnRyX2RlbHRhX2N0czsKKwl1aW50MzJfdCBpbnRyX3R4X210OworCXVpbnQzMl90IGludHJfcnhfdGltZXI7CisJdWludDMyX3QgaW50cl9yeF9oaWdoOworCXVpbnQzMl90IGludHJfdHhfZXhwbGljaXQ7CisJdWludDMyX3QgaW50cl9jbGVhcjsKKwl1aW50MzJfdCBpbnRyX2FsbDsKKwljaGFyIHJzNDIyX3NlbGVjdF9waW47Cit9OworCitzdGF0aWMgc3RydWN0IHBvcnRfaG9va3MgaG9va3NfYXJyYXlbUE9SVFNfUEVSX0NBUkRdID0geworCS8qIHZhbHVlcyBmb3IgcG9ydCBBICovCisJeworCS5pbnRyX2RlbHRhX2RjZCA9IFNJT19JUl9TQV9ERUxUQV9EQ0QsCisJLmludHJfZGVsdGFfY3RzID0gU0lPX0lSX1NBX0RFTFRBX0NUUywKKwkuaW50cl90eF9tdCA9IFNJT19JUl9TQV9UWF9NVCwKKwkuaW50cl9yeF90aW1lciA9IFNJT19JUl9TQV9SWF9USU1FUiwKKwkuaW50cl9yeF9oaWdoID0gU0lPX0lSX1NBX1JYX0hJR0gsCisJLmludHJfdHhfZXhwbGljaXQgPSBTSU9fSVJfU0FfVFhfRVhQTElDSVQsCisJLmludHJfY2xlYXIgPSAoU0lPX0lSX1NBX1RYX01UIHwgU0lPX0lSX1NBX1JYX0ZVTEwKKwkJCQl8IFNJT19JUl9TQV9SWF9ISUdICisJCQkJfCBTSU9fSVJfU0FfUlhfVElNRVIKKwkJCQl8IFNJT19JUl9TQV9ERUxUQV9EQ0QKKwkJCQl8IFNJT19JUl9TQV9ERUxUQV9DVFMKKwkJCQl8IFNJT19JUl9TQV9JTlQKKwkJCQl8IFNJT19JUl9TQV9UWF9FWFBMSUNJVAorCQkJCXwgU0lPX0lSX1NBX01FTUVSUiksCisJLmludHJfYWxsID0gIFNJT19JUl9TQSwKKwkucnM0MjJfc2VsZWN0X3BpbiA9IEdQUFJfVUFSVEFfTU9ERVNFTF9QSU4sCisJIH0sCisKKwkvKiB2YWx1ZXMgZm9yIHBvcnQgQiAqLworCXsKKwkuaW50cl9kZWx0YV9kY2QgPSBTSU9fSVJfU0JfREVMVEFfRENELAorCS5pbnRyX2RlbHRhX2N0cyA9IFNJT19JUl9TQl9ERUxUQV9DVFMsCisJLmludHJfdHhfbXQgPSBTSU9fSVJfU0JfVFhfTVQsCisJLmludHJfcnhfdGltZXIgPSBTSU9fSVJfU0JfUlhfVElNRVIsCisJLmludHJfcnhfaGlnaCA9IFNJT19JUl9TQl9SWF9ISUdILAorCS5pbnRyX3R4X2V4cGxpY2l0ID0gU0lPX0lSX1NCX1RYX0VYUExJQ0lULAorCS5pbnRyX2NsZWFyID0gKFNJT19JUl9TQl9UWF9NVCB8IFNJT19JUl9TQl9SWF9GVUxMCisJCQkJfCBTSU9fSVJfU0JfUlhfSElHSAorCQkJCXwgU0lPX0lSX1NCX1JYX1RJTUVSCisJCQkJfCBTSU9fSVJfU0JfREVMVEFfRENECisJCQkJfCBTSU9fSVJfU0JfREVMVEFfQ1RTCisJCQkJfCBTSU9fSVJfU0JfSU5UCisJCQkJfCBTSU9fSVJfU0JfVFhfRVhQTElDSVQKKwkJCQl8IFNJT19JUl9TQl9NRU1FUlIpLAorCS5pbnRyX2FsbCA9IFNJT19JUl9TQiwKKwkucnM0MjJfc2VsZWN0X3BpbiA9IEdQUFJfVUFSVEJfTU9ERVNFTF9QSU4sCisJIH0KK307CisKK3N0cnVjdCByaW5nX2VudHJ5IHsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1aW50MzJfdCBhbGxkYXRhOworCQkJdWludDMyX3QgYWxsc2M7CisJCX0gYWxsOworCQlzdHJ1Y3QgeworCQkJY2hhciBkYXRhWzRdOwkvKiBkYXRhIGJ5dGVzICovCisJCQljaGFyIHNjWzRdOwkvKiBzdGF0dXMvY29udHJvbCAqLworCQl9IHM7CisJfSB1OworfTsKKworLyogVGVzdCB0aGUgdmFsaWQgYml0cyBpbiBhbnkgb2YgdGhlIDQgc2MgY2hhcnMgdXNpbmcgImFsbHNjIiBtZW1iZXIgKi8KKyNkZWZpbmUgUklOR19BTllfVkFMSUQgXAorCSgodWludDMyX3QpKFJYU0JfTU9ERU1fVkFMSUQgfCBSWFNCX0RBVEFfVkFMSUQpICogMHgwMTAxMDEwMSkKKworI2RlZmluZSByaW5nX3NjCQl1LnMuc2MKKyNkZWZpbmUgcmluZ19kYXRhCXUucy5kYXRhCisjZGVmaW5lIHJpbmdfYWxsc2MJdS5hbGwuYWxsc2MKKworLyogTnVtYmVyIG9mIGVudHJpZXMgcGVyIHJpbmcgYnVmZmVyLiAqLworI2RlZmluZSBFTlRSSUVTX1BFUl9SSU5HIChSSU5HX0JVRl9TSVpFIC8gKGludCkgc2l6ZW9mKHN0cnVjdCByaW5nX2VudHJ5KSkKKworLyogQW4gaW5kaXZpZHVhbCByaW5nICovCitzdHJ1Y3QgcmluZyB7CisJc3RydWN0IHJpbmdfZW50cnkgZW50cmllc1tFTlRSSUVTX1BFUl9SSU5HXTsKK307CisKKy8qIFRoZSB3aG9sZSBlbmNoaWxhZGEgKi8KK3N0cnVjdCByaW5nX2J1ZmZlciB7CisJc3RydWN0IHJpbmcgVFhfQTsKKwlzdHJ1Y3QgcmluZyBSWF9BOworCXN0cnVjdCByaW5nIFRYX0I7CisJc3RydWN0IHJpbmcgUlhfQjsKK307CisKKy8qIEdldCBhIHJpbmcgZnJvbSBhIHBvcnQgc3RydWN0ICovCisjZGVmaW5lIFJJTkcoX3AsIF93aCkJJigoKHN0cnVjdCByaW5nX2J1ZmZlciAqKSgoX3ApLT5pcF9jcHVfcmluZ2J1ZikpLT5fd2gpCisKKy8qIGZvciBJbmZpbml0ZSBsb29wIGRldGVjdGlvbiAgKi8KKyNkZWZpbmUgTUFYSVRFUgkJMTAwMDAwMDAKKworCisvKioKKyAqIHNldF9iYXVkIC0gQmF1ZCByYXRlIHNldHRpbmcgY29kZQorICogQHBvcnQ6IHBvcnQgdG8gc2V0CisgKiBAYmF1ZDogYmF1ZCByYXRlIHRvIHVzZQorICovCitzdGF0aWMgaW50IHNldF9iYXVkKHN0cnVjdCBpb2MzX3BvcnQgKnBvcnQsIGludCBiYXVkKQoreworCWludCBkaXZpc29yOworCWludCBhY3R1YWxfYmF1ZDsKKwlpbnQgZGlmZjsKKwlpbnQgbGNyLCBwcmVkaXY7CisJc3RydWN0IGlvYzNfdWFydHJlZ3MgX19pb21lbSAqdWFydDsKKworCWZvciAocHJlZGl2ID0gNjsgcHJlZGl2IDwgNjQ7IHByZWRpdisrKSB7CisJCWRpdmlzb3IgPSBTRVJfRElWSVNPUihiYXVkLCBTRVJfQ0xLX1NQRUVEKHByZWRpdikpOworCQlpZiAoIWRpdmlzb3IpCisJCQljb250aW51ZTsJLyogaW52YWxpZCBkaXZpc29yICovCisJCWFjdHVhbF9iYXVkID0gRElWSVNPUl9UT19CQVVEKGRpdmlzb3IsIFNFUl9DTEtfU1BFRUQocHJlZGl2KSk7CisKKwkJZGlmZiA9IGFjdHVhbF9iYXVkIC0gYmF1ZDsKKwkJaWYgKGRpZmYgPCAwKQorCQkJZGlmZiA9IC1kaWZmOworCisJCS8qIGlmIHdlJ3JlIHdpdGhpbiAxJSB3ZSd2ZSBmb3VuZCBhIG1hdGNoICovCisJCWlmIChkaWZmICogMTAwIDw9IGFjdHVhbF9iYXVkKQorCQkJYnJlYWs7CisJfQorCisJLyogaWYgdGhlIGFib3ZlIGxvb3AgY29tcGxldGVkLCB3ZSBkaWRuJ3QgbWF0Y2gKKwkgKiB0aGUgYmF1ZCByYXRlLiAgZ2l2ZSB1cC4KKwkgKi8KKwlpZiAocHJlZGl2ID09IDY0KSB7CisJCU5PVF9QUk9HUkVTUygpOworCQlyZXR1cm4gMTsKKwl9CisKKwl1YXJ0ID0gcG9ydC0+aXBfdWFydF9yZWdzOworCWxjciA9IHJlYWRiKCZ1YXJ0LT5pdV9sY3IpOworCisJd3JpdGViKGxjciB8IFVBUlRfTENSX0RMQUIsICZ1YXJ0LT5pdV9sY3IpOworCXdyaXRlYigodW5zaWduZWQgY2hhcilkaXZpc29yLCAmdWFydC0+aXVfZGxsKTsKKwl3cml0ZWIoKHVuc2lnbmVkIGNoYXIpKGRpdmlzb3IgPj4gOCksICZ1YXJ0LT5pdV9kbG0pOworCXdyaXRlYigodW5zaWduZWQgY2hhcilwcmVkaXYsICZ1YXJ0LT5pdV9zY3IpOworCXdyaXRlYigodW5zaWduZWQgY2hhcilsY3IsICZ1YXJ0LT5pdV9sY3IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZ2V0X2lvYzNfcG9ydCAtIGdpdmVuIGEgdWFydCBwb3J0LCByZXR1cm4gdGhlIGNvbnRyb2wgc3RydWN0dXJlCisgKiBAdGhlX3BvcnQ6IHVhcnQgcG9ydCB0byBmaW5kCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaW9jM19wb3J0ICpnZXRfaW9jM19wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnRoZV9wb3J0KQoreworCXN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQgPSBkZXZfZ2V0X2RydmRhdGEodGhlX3BvcnQtPmRldik7CisJc3RydWN0IGlvYzNfY2FyZCAqY2FyZF9wdHIgPSBpZGQtPmRhdGFbU3VibW9kdWxlX3Nsb3RdOworCWludCBpaSwgamo7CisKKwlpZiAoIWNhcmRfcHRyKSB7CisJCU5PVF9QUk9HUkVTUygpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZm9yIChpaSA9IDA7IGlpIDwgUE9SVFNfUEVSX0NBUkQ7IGlpKyspIHsKKwkJZm9yIChqaiA9IDA7IGpqIDwgTE9HSUNBTF9QT1JUUzsgamorKykgeworCQkJaWYgKHRoZV9wb3J0ID09ICZjYXJkX3B0ci0+aWNfcG9ydFtpaV0uaWNwX3VhcnRfcG9ydFtqal0pCisJCQkJcmV0dXJuIGNhcmRfcHRyLT5pY19wb3J0W2lpXS5pY3BfcG9ydDsKKwkJfQorCX0KKwlOT1RfUFJPR1JFU1MoKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBwb3J0X2luaXQgLSBJbml0aWFsaXplIHRoZSBzaW8gYW5kIGlvYzMgaGFyZHdhcmUgZm9yIGEgZ2l2ZW4gcG9ydAorICoJCQljYWxsZWQgcGVyIHBvcnQgZnJvbSBhdHRhY2guLi4KKyAqIEBwb3J0OiBwb3J0IHRvIGluaXRpYWxpemUKKyAqLworc3RhdGljIGludCBpbmxpbmUgcG9ydF9pbml0KHN0cnVjdCBpb2MzX3BvcnQgKnBvcnQpCit7CisJdWludDMyX3Qgc2lvX2NyOworCXN0cnVjdCBwb3J0X2hvb2tzICpob29rcyA9IHBvcnQtPmlwX2hvb2tzOworCXN0cnVjdCBpb2MzX3VhcnRyZWdzIF9faW9tZW0gKnVhcnQ7CisJaW50IHJlc2V0X2xvb3BfY291bnRlciA9IDB4ZmZmZmY7CisJc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZCA9IHBvcnQtPmlwX2lkZDsKKworCS8qIElkbGUgdGhlIElPQzMgc2VyaWFsIGludGVyZmFjZSAqLworCXdyaXRlbChTU0NSX1JFU0VULCAmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNzY3IpOworCisJLyogV2FpdCB1bnRpbCBhbnkgcGVuZGluZyBidXMgYWN0aXZpdHkgZm9yIHRoaXMgcG9ydCBoYXMgY2Vhc2VkICovCisJZG8geworCQlzaW9fY3IgPSByZWFkbCgmaWRkLT52bWEtPnNpb19jcik7CisJCWlmIChyZXNldF9sb29wX2NvdW50ZXItLSA8PSAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIklPQzMgdW5hYmxlIHRvIGNvbWUgb3V0IG9mIHJlc2V0IgorCQkJCSIgc2NyIDB4JXhcbiIsIHNpb19jcik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IHdoaWxlICghKHNpb19jciAmIFNJT19DUl9BUkJfRElBR19JRExFKSAmJgorCSAgICAgICAoKChzaW9fY3IgJj0gU0lPX0NSX0FSQl9ESUFHKSA9PSBTSU9fQ1JfQVJCX0RJQUdfVFhBKQorCQl8fCBzaW9fY3IgPT0gU0lPX0NSX0FSQl9ESUFHX1RYQgorCQl8fCBzaW9fY3IgPT0gU0lPX0NSX0FSQl9ESUFHX1JYQQorCQl8fCBzaW9fY3IgPT0gU0lPX0NSX0FSQl9ESUFHX1JYQikpOworCisJLyogRmluaXNoIHJlc2V0IHNlcXVlbmNlICovCisJd3JpdGVsKDAsICZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3Njcik7CisKKwkvKiBPbmNlIFJFU0VUIGlzIGRvbmUsIHJlbG9hZCBjYWNoZWQgdHhfcHJvZCBhbmQgcnhfY29ucyB2YWx1ZXMKKwkgKiBhbmQgc2V0IHJpbmdzIHRvIGVtcHR5IGJ5IG1ha2luZyBwcm9kID09IGNvbnMKKwkgKi8KKwlwb3J0LT5pcF90eF9wcm9kID0gcmVhZGwoJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zdGNpcikgJiBQUk9EX0NPTlNfTUFTSzsKKwl3cml0ZWwocG9ydC0+aXBfdHhfcHJvZCwgJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zdHBpcik7CisJcG9ydC0+aXBfcnhfY29ucyA9IHJlYWRsKCZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3JwaXIpICYgUFJPRF9DT05TX01BU0s7CisJd3JpdGVsKHBvcnQtPmlwX3J4X2NvbnMgfCBTUkNJUl9BUk0sICZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3JjaXIpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGZvciB0aGlzIDE2NTUwICovCisJdWFydCA9IHBvcnQtPmlwX3VhcnRfcmVnczsKKwl3cml0ZWIoMCwgJnVhcnQtPml1X2xjcik7CisJd3JpdGViKDAsICZ1YXJ0LT5pdV9pZXIpOworCisJLyogU2V0IHRoZSBkZWZhdWx0IGJhdWQgKi8KKwlzZXRfYmF1ZChwb3J0LCBwb3J0LT5pcF9iYXVkKTsKKworCS8qIFNldCBsaW5lIGNvbnRyb2wgdG8gOCBiaXRzIG5vIHBhcml0eSAqLworCXdyaXRlYihVQVJUX0xDUl9XTEVOOCB8IDAsICZ1YXJ0LT5pdV9sY3IpOworCS8qIFVBUlRfTENSX1NUT1AgPT0gMSBzdG9wICovCisKKwkvKiBFbmFibGUgdGhlIEZJRk9zICovCisJd3JpdGViKFVBUlRfRkNSX0VOQUJMRV9GSUZPLCAmdWFydC0+aXVfZmNyKTsKKwkvKiB0aGVuIHJlc2V0IDE2NTUwIEZJRk9zICovCisJd3JpdGViKFVBUlRfRkNSX0VOQUJMRV9GSUZPIHwgVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFSX1hNSVQsCisJICAgICAgICZ1YXJ0LT5pdV9mY3IpOworCisJLyogQ2xlYXIgbW9kZW0gY29udHJvbCByZWdpc3RlciAqLworCXdyaXRlYigwLCAmdWFydC0+aXVfbWNyKTsKKworCS8qIENsZWFyIGRlbHRhcyBpbiBtb2RlbSBzdGF0dXMgcmVnaXN0ZXIgKi8KKwl3cml0ZWwoMCwgJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zaGFkb3cpOworCisJLyogT25seSBkbyB0aGlzIG9uY2UgcGVyIHBvcnQgcGFpciAqLworCWlmIChwb3J0LT5pcF9ob29rcyA9PSAmaG9va3NfYXJyYXlbMF0pIHsKKwkJdW5zaWduZWQgbG9uZyByaW5nX3BjaV9hZGRyOworCQl1aW50MzJfdCBfX2lvbWVtICpzYmJyX2wsICpzYmJyX2g7CisKKwkJc2Jicl9sID0gJmlkZC0+dm1hLT5zYmJyX2w7CisJCXNiYnJfaCA9ICZpZGQtPnZtYS0+c2Jicl9oOworCQlyaW5nX3BjaV9hZGRyID0gKHVuc2lnbmVkIGxvbmcgX19pb21lbSlwb3J0LT5pcF9kbWFfcmluZ2J1ZjsKKwkJRFBSSU5UX0NPTkZJRygoIiVzOiByaW5nX3BjaV9hZGRyIDB4JXBcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCAodm9pZCAqKXJpbmdfcGNpX2FkZHIpKTsKKworCQl3cml0ZWwoKHVuc2lnbmVkIGludCkoKHVpbnQ2NF90KSByaW5nX3BjaV9hZGRyID4+IDMyKSwgc2Jicl9oKTsKKwkJd3JpdGVsKCh1bnNpZ25lZCBpbnQpcmluZ19wY2lfYWRkciB8IEJVRl9TSVpFX0JJVCwgc2Jicl9sKTsKKwl9CisKKwkvKiBTZXQgdGhlIHJlY2VpdmUgdGltZW91dCB2YWx1ZSB0byAxMCBtc2VjICovCisJd3JpdGVsKFNSVFJfSFogLyAxMDAsICZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3J0cik7CisKKwkvKiBTZXQgcnggdGhyZXNob2xkLCBlbmFibGUgRE1BICovCisJLyogU2V0IGhpZ2ggd2F0ZXIgbWFyayBhdCAzLzQgb2YgZnVsbCByaW5nICovCisJcG9ydC0+aXBfc3NjciA9IChFTlRSSUVTX1BFUl9SSU5HICogMyAvIDQpOworCisJLyogdWFydCBleHBlcmllbmNlcyBwYXVzZXMgYXQgaGlnaCBiYXVkIHJhdGUgcmVkdWNpbmcgYWN0dWFsCisJICogdGhyb3VnaHB1dCBieSAxMCUgb3Igc28gdW5sZXNzIHdlIGVuYWJsZSBoaWdoIHNwZWVkIHBvbGxpbmcKKwkgKiBYWFggd2hlbiB0aGlzIGhhcmR3YXJlIGJ1ZyBpcyByZXNvbHZlZCB3ZSBzaG91bGQgcmV2ZXJ0IHRvCisJICogbm9ybWFsIHBvbGxpbmcgc3BlZWQKKwkgKi8KKwlwb3J0LT5pcF9zc2NyIHw9IFNTQ1JfSElHSF9TUEQ7CisKKwl3cml0ZWwocG9ydC0+aXBfc3NjciwgJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zc2NyKTsKKworCS8qIERpc2FibGUgYW5kIGNsZWFyIGFsbCBzZXJpYWwgcmVsYXRlZCBpbnRlcnJ1cHQgYml0cyAqLworCXBvcnQtPmlwX2NhcmQtPmljX2VuYWJsZSAmPSB+aG9va3MtPmludHJfY2xlYXI7CisJaW9jM19kaXNhYmxlKHBvcnQtPmlwX2lzLCBpZGQsIGhvb2tzLT5pbnRyX2NsZWFyKTsKKwlpb2MzX2Fjayhwb3J0LT5pcF9pcywgaWRkLCBob29rcy0+aW50cl9jbGVhcik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZW5hYmxlX2ludHJzIC0gZW5hYmxlIGludGVycnVwdHMKKyAqIEBwb3J0OiBwb3J0IHRvIGVuYWJsZQorICogQG1hc2s6IG1hc2sgdG8gdXNlCisgKi8KK3N0YXRpYyB2b2lkIGVuYWJsZV9pbnRycyhzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0LCB1aW50MzJfdCBtYXNrKQoreworCWlmICgocG9ydC0+aXBfY2FyZC0+aWNfZW5hYmxlICYgbWFzaykgIT0gbWFzaykgeworCQlwb3J0LT5pcF9jYXJkLT5pY19lbmFibGUgfD0gbWFzazsKKwkJaW9jM19lbmFibGUocG9ydC0+aXBfaXMsIHBvcnQtPmlwX2lkZCwgbWFzayk7CisJfQorfQorCisvKioKKyAqIGxvY2FsX29wZW4gLSBsb2NhbCBvcGVuIGEgcG9ydAorICogQHBvcnQ6IHBvcnQgdG8gb3BlbgorICovCitzdGF0aWMgaW5saW5lIGludCBsb2NhbF9vcGVuKHN0cnVjdCBpb2MzX3BvcnQgKnBvcnQpCit7CisJaW50IHNwaW5pdGVyID0gMDsKKworCXBvcnQtPmlwX2ZsYWdzID0gSU5QVVRfRU5BQkxFOworCisJLyogUGF1c2UgdGhlIERNQSBpbnRlcmZhY2UgaWYgbmVjZXNzYXJ5ICovCisJaWYgKHBvcnQtPmlwX3NzY3IgJiBTU0NSX0RNQV9FTikgeworCQl3cml0ZWwocG9ydC0+aXBfc3NjciB8IFNTQ1JfRE1BX1BBVVNFLAorCQkgICAgICAgJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zc2NyKTsKKwkJd2hpbGUgKChyZWFkbCgmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNzY3IpCisJCQkmIFNTQ1JfUEFVU0VfU1RBVEUpID09IDApIHsKKwkJCXNwaW5pdGVyKys7CisJCQlpZiAoc3Bpbml0ZXIgPiBNQVhJVEVSKSB7CisJCQkJTk9UX1BST0dSRVNTKCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfQorCisJLyogUmVzZXQgdGhlIGlucHV0IGZpZm8uICBJZiB0aGUgdWFydCByZWNlaXZlZCBjaGFycyB3aGlsZSB0aGUgcG9ydAorCSAqIHdhcyBjbG9zZWQgYW5kIERNQSBpcyBub3QgZW5hYmxlZCwgdGhlIHVhcnQgbWF5IGhhdmUgYSBidW5jaCBvZgorCSAqIGNoYXJzIGhhbmdpbmcgYXJvdW5kIGluIGl0cyByeCBmaWZvIHdoaWNoIHdpbGwgbm90IGJlIGRpc2NhcmRlZAorCSAqIGJ5IHJjbHIgaW4gdGhlIHVwcGVyIGxheWVyLiBXZSBtdXN0IGdldCByaWQgb2YgdGhlbSBoZXJlLgorCSAqLworCXdyaXRlYihVQVJUX0ZDUl9FTkFCTEVfRklGTyB8IFVBUlRfRkNSX0NMRUFSX1JDVlIsCisJICAgICAgICZwb3J0LT5pcF91YXJ0X3JlZ3MtPml1X2Zjcik7CisKKwl3cml0ZWIoVUFSVF9MQ1JfV0xFTjgsICZwb3J0LT5pcF91YXJ0X3JlZ3MtPml1X2xjcik7CisJLyogVUFSVF9MQ1JfU1RPUCA9PSAxIHN0b3AgKi8KKworCS8qIFJlLWVuYWJsZSBETUEsIHNldCBkZWZhdWx0IHRocmVzaG9sZCB0byBpbnRyIHdoZW5ldmVyIHRoZXJlIGlzCisJICogZGF0YSBhdmFpbGFibGUuCisJICovCisJcG9ydC0+aXBfc3NjciAmPSB+U1NDUl9SWF9USFJFU0hPTEQ7CisJcG9ydC0+aXBfc3NjciB8PSAxOwkvKiBkZWZhdWx0IHRocmVzaG9sZCAqLworCisJLyogUGx1ZyBpbiB0aGUgbmV3IHNzY3IuICBUaGlzIGltcGxpY2l0bHkgY2xlYXJzIHRoZSBETUFfUEFVU0UKKwkgKiBmbGFnIGlmIGl0IHdhcyBzZXQgYWJvdmUKKwkgKi8KKwl3cml0ZWwocG9ydC0+aXBfc3NjciwgJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zc2NyKTsKKwlwb3J0LT5pcF90eF9sb3dhdCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc2V0X3J4X3RpbWVvdXQgLSBTZXQgcnggdGltZW91dCBhbmQgdGhyZXNob2xkIHZhbHVlcy4KKyAqIEBwb3J0OiBwb3J0IHRvIHVzZQorICogQHRpbWVvdXQ6IHRpbWVvdXQgdmFsdWUgaW4gdGlja3MKKyAqLworc3RhdGljIGlubGluZSBpbnQgc2V0X3J4X3RpbWVvdXQoc3RydWN0IGlvYzNfcG9ydCAqcG9ydCwgaW50IHRpbWVvdXQpCit7CisJaW50IHRocmVzaG9sZDsKKworCXBvcnQtPmlwX3J4X3RpbWVvdXQgPSB0aW1lb3V0OworCisJLyogVGltZW91dCBpcyBpbiB0aWNrcy4gIExldCdzIGZpZ3VyZSBvdXQgaG93IG1hbnkgY2hhcnMgd2UKKwkgKiBjYW4gcmVjZWl2ZSBhdCB0aGUgY3VycmVudCBiYXVkIHJhdGUgaW4gdGhhdCBpbnRlcnZhbAorCSAqIGFuZCBzZXQgdGhlIHJ4IHRocmVzaG9sZCB0byB0aGF0IGFtb3VudC4gIFRoZXJlIGFyZSA0IGNoYXJzCisJICogcGVyIHJpbmcgZW50cnksIHNvIHdlJ2xsIGRpdmlkZSB0aGUgbnVtYmVyIG9mIGNoYXJzIHRoYXQgd2lsbAorCSAqIGFycml2ZSBpbiB0aW1lb3V0IGJ5IDQuCisJICogU28gLi4uLiB0aW1lb3V0ICogYmF1ZCAvIDEwIC8gSFogLyA0LCB3aXRoIEhaID0gMTAwLgorCSAqLworCXRocmVzaG9sZCA9IHRpbWVvdXQgKiBwb3J0LT5pcF9iYXVkIC8gNDAwMDsKKwlpZiAodGhyZXNob2xkID09IDApCisJCXRocmVzaG9sZCA9IDE7CS8qIG90aGVyd2lzZSB3ZSdsbCBpbnRyIGFsbCB0aGUgdGltZSEgKi8KKworCWlmICgodW5zaWduZWQpdGhyZXNob2xkID4gKHVuc2lnbmVkKVNTQ1JfUlhfVEhSRVNIT0xEKQorCQlyZXR1cm4gMTsKKworCXBvcnQtPmlwX3NzY3IgJj0gflNTQ1JfUlhfVEhSRVNIT0xEOworCXBvcnQtPmlwX3NzY3IgfD0gdGhyZXNob2xkOworCXdyaXRlbChwb3J0LT5pcF9zc2NyLCAmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNzY3IpOworCisJLyogTm93IHNldCB0aGUgcnggdGltZW91dCB0byB0aGUgZ2l2ZW4gdmFsdWUKKwkgKiBhZ2FpbiB0aW1lb3V0ICogU1JUUl9IWiAvIEhaCisJICovCisJdGltZW91dCA9IHRpbWVvdXQgKiBTUlRSX0haIC8gMTAwOworCWlmICh0aW1lb3V0ID4gU1JUUl9DTlQpCisJCXRpbWVvdXQgPSBTUlRSX0NOVDsKKwl3cml0ZWwodGltZW91dCwgJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zcnRyKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjb25maWdfcG9ydCAtIGNvbmZpZyB0aGUgaGFyZHdhcmUKKyAqIEBwb3J0OiBwb3J0IHRvIGNvbmZpZworICogQGJhdWQ6IGJhdWQgcmF0ZSBmb3IgdGhlIHBvcnQKKyAqIEBieXRlX3NpemU6IGRhdGEgc2l6ZQorICogQHN0b3BfYml0czogbnVtYmVyIG9mIHN0b3AgYml0cworICogQHBhcmVuYjogcGFyaXR5IGVuYWJsZSA/CisgKiBAcGFyb2RkOiBvZGQgcGFyaXR5ID8KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2NvbmZpZ19wb3J0KHN0cnVjdCBpb2MzX3BvcnQgKnBvcnQsCisJICAgIGludCBiYXVkLCBpbnQgYnl0ZV9zaXplLCBpbnQgc3RvcF9iaXRzLCBpbnQgcGFyZW5iLCBpbnQgcGFyb2RkKQoreworCWNoYXIgbGNyLCBzaXplYml0czsKKwlpbnQgc3Bpbml0ZXIgPSAwOworCisJRFBSSU5UX0NPTkZJRygoIiVzOiBsaW5lICVkIGJhdWQgJWQgYnl0ZV9zaXplICVkIHN0b3AgJWQgcGFyZW5iICVkICIKKwkJCSJwYXJvZGQgJWRcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sICgoc3RydWN0IHVhcnRfcG9ydCAqKXBvcnQtPmlwX3BvcnQpLT5saW5lLAorCQkJYmF1ZCwgYnl0ZV9zaXplLCBzdG9wX2JpdHMsIHBhcmVuYiwgcGFyb2RkKSk7CisKKwlpZiAoc2V0X2JhdWQocG9ydCwgYmF1ZCkpCisJCXJldHVybiAxOworCisJc3dpdGNoIChieXRlX3NpemUpIHsKKwljYXNlIDU6CisJCXNpemViaXRzID0gVUFSVF9MQ1JfV0xFTjU7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJc2l6ZWJpdHMgPSBVQVJUX0xDUl9XTEVONjsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlzaXplYml0cyA9IFVBUlRfTENSX1dMRU43OworCQlicmVhazsKKwljYXNlIDg6CisJCXNpemViaXRzID0gVUFSVF9MQ1JfV0xFTjg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAxOworCX0KKworCS8qIFBhdXNlIHRoZSBETUEgaW50ZXJmYWNlIGlmIG5lY2Vzc2FyeSAqLworCWlmIChwb3J0LT5pcF9zc2NyICYgU1NDUl9ETUFfRU4pIHsKKwkJd3JpdGVsKHBvcnQtPmlwX3NzY3IgfCBTU0NSX0RNQV9QQVVTRSwKKwkJICAgICAgICZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3Njcik7CisJCXdoaWxlICgocmVhZGwoJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zc2NyKQorCQkJJiBTU0NSX1BBVVNFX1NUQVRFKSA9PSAwKSB7CisJCQlzcGluaXRlcisrOworCQkJaWYgKHNwaW5pdGVyID4gTUFYSVRFUikKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwkvKiBDbGVhciByZWxldmFudCBmaWVsZHMgaW4gbGNyICovCisJbGNyID0gcmVhZGIoJnBvcnQtPmlwX3VhcnRfcmVncy0+aXVfbGNyKTsKKwlsY3IgJj0gfihMQ1JfTUFTS19CSVRTX0NIQVIgfCBVQVJUX0xDUl9FUEFSIHwKKwkJIFVBUlRfTENSX1BBUklUWSB8IExDUl9NQVNLX1NUT1BfQklUUyk7CisKKwkvKiBTZXQgYnl0ZSBzaXplIGluIGxjciAqLworCWxjciB8PSBzaXplYml0czsKKworCS8qIFNldCBwYXJpdHkgKi8KKwlpZiAocGFyZW5iKSB7CisJCWxjciB8PSBVQVJUX0xDUl9QQVJJVFk7CisJCWlmICghcGFyb2RkKQorCQkJbGNyIHw9IFVBUlRfTENSX0VQQVI7CisJfQorCisJLyogU2V0IHN0b3AgYml0cyAqLworCWlmIChzdG9wX2JpdHMpCisJCWxjciB8PSBVQVJUX0xDUl9TVE9QIC8qIDIgc3RvcCBiaXRzICovIDsKKworCXdyaXRlYihsY3IsICZwb3J0LT5pcF91YXJ0X3JlZ3MtPml1X2xjcik7CisKKwkvKiBSZS1lbmFibGUgdGhlIERNQSBpbnRlcmZhY2UgaWYgbmVjZXNzYXJ5ICovCisJaWYgKHBvcnQtPmlwX3NzY3IgJiBTU0NSX0RNQV9FTikgeworCQl3cml0ZWwocG9ydC0+aXBfc3NjciwgJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zc2NyKTsKKwl9CisJcG9ydC0+aXBfYmF1ZCA9IGJhdWQ7CisKKwkvKiBXaGVuIHdlIGdldCB3aXRoaW4gdGhpcyBudW1iZXIgb2YgcmluZyBlbnRyaWVzIG9mIGZpbGxpbmcgdGhlCisJICogZW50aXJlIHJpbmcgb24gdHgsIHBsYWNlIGFuIEVYUExJQ0lUIGludHIgdG8gZ2VuZXJhdGUgYSBsb3dhdAorCSAqIG5vdGlmaWNhdGlvbiB3aGVuIG91dHB1dCBoYXMgZHJhaW5lZC4KKwkgKi8KKwlwb3J0LT5pcF90eF9sb3dhdCA9IChUWF9MT1dBVF9DSEFSUyhiYXVkKSArIDMpIC8gNDsKKwlpZiAocG9ydC0+aXBfdHhfbG93YXQgPT0gMCkKKwkJcG9ydC0+aXBfdHhfbG93YXQgPSAxOworCisJc2V0X3J4X3RpbWVvdXQocG9ydCwgMik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZG9fd3JpdGUgLSBXcml0ZSBieXRlcyB0byB0aGUgcG9ydC4gIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcworICoJCQlhY3R1YWxseSB3cml0dGVuLiBDYWxsZWQgZnJvbSB0cmFuc21pdF9jaGFycworICogQHBvcnQ6IHBvcnQgdG8gdXNlCisgKiBAYnVmOiB0aGUgc3R1ZmYgdG8gd3JpdGUKKyAqIEBsZW46IGhvdyBtYW55IGJ5dGVzIGluICdidWYnCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGRvX3dyaXRlKHN0cnVjdCBpb2MzX3BvcnQgKnBvcnQsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgcHJvZF9wdHIsIGNvbnNfcHRyLCB0b3RhbCA9IDA7CisJc3RydWN0IHJpbmcgKm91dHJpbmc7CisJc3RydWN0IHJpbmdfZW50cnkgKmVudHJ5OworCXN0cnVjdCBwb3J0X2hvb2tzICpob29rcyA9IHBvcnQtPmlwX2hvb2tzOworCisJQlVHX09OKCEobGVuID49IDApKTsKKworCXByb2RfcHRyID0gcG9ydC0+aXBfdHhfcHJvZDsKKwljb25zX3B0ciA9IHJlYWRsKCZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3RjaXIpICYgUFJPRF9DT05TX01BU0s7CisJb3V0cmluZyA9IHBvcnQtPmlwX291dHJpbmc7CisKKwkvKiBNYWludGFpbiBhIDEtZW50cnkgcmVkLXpvbmUuICBUaGUgcmluZyBidWZmZXIgaXMgZnVsbCB3aGVuCisJICogKGNvbnMgLSBwcm9kKSAlIHJpbmdfc2l6ZSBpcyAxLiAgUmF0aGVyIHRoYW4gZG8gdGhpcyBzdWJ0cmFjdGlvbgorCSAqIGluIHRoZSBib2R5IG9mIHRoZSBsb29wLCBJJ2xsIGRvIGl0IG5vdy4KKwkgKi8KKwljb25zX3B0ciA9IChjb25zX3B0ciAtIChpbnQpc2l6ZW9mKHN0cnVjdCByaW5nX2VudHJ5KSkgJiBQUk9EX0NPTlNfTUFTSzsKKworCS8qIFN0dWZmIHRoZSBieXRlcyBpbnRvIHRoZSBvdXRwdXQgKi8KKwl3aGlsZSAoKHByb2RfcHRyICE9IGNvbnNfcHRyKSAmJiAobGVuID4gMCkpIHsKKwkJaW50IHh4OworCisJCS8qIEdldCA0IGJ5dGVzIChvbmUgcmluZyBlbnRyeSkgYXQgYSB0aW1lICovCisJCWVudHJ5ID0gKHN0cnVjdCByaW5nX2VudHJ5ICopKChjYWRkcl90KSBvdXRyaW5nICsgcHJvZF9wdHIpOworCisJCS8qIEludmFsaWRhdGUgYWxsIGVudHJpZXMgKi8KKwkJZW50cnktPnJpbmdfYWxsc2MgPSAwOworCisJCS8qIENvcHkgaW4gc29tZSBieXRlcyAqLworCQlmb3IgKHh4ID0gMDsgKHh4IDwgNCkgJiYgKGxlbiA+IDApOyB4eCsrKSB7CisJCQllbnRyeS0+cmluZ19kYXRhW3h4XSA9ICpidWYrKzsKKwkJCWVudHJ5LT5yaW5nX3NjW3h4XSA9IFRYQ0JfVkFMSUQ7CisJCQlsZW4tLTsKKwkJCXRvdGFsKys7CisJCX0KKworCQkvKiBJZiB3ZSBhcmUgd2l0aGluIHNvbWUgc21hbGwgdGhyZXNob2xkIG9mIGZpbGxpbmcgdXAgdGhlCisJCSAqIGVudGlyZSByaW5nIGJ1ZmZlciwgd2UgbXVzdCBwbGFjZSBhbiBFWFBMSUNJVCBpbnRyIGhlcmUKKwkJICogdG8gZ2VuZXJhdGUgYSBsb3dhdCBpbnRlcnJ1cHQgaW4gY2FzZSB3ZSBzdWJzZXF1ZW50bHkKKwkJICogcmVhbGx5IGRvIGZpbGwgdXAgdGhlIHJpbmcgYW5kIHRoZSBjYWxsZXIgZ29lcyB0byBzbGVlcC4KKwkJICogTm8gbmVlZCB0byBwbGFjZSBtb3JlIHRoYW4gb25lIHRob3VnaC4KKwkJICovCisJCWlmICghKHBvcnQtPmlwX2ZsYWdzICYgTE9XQVRfV1JJVFRFTikgJiYKKwkJICAgICgoY29uc19wdHIgLSBwcm9kX3B0cikgJiBQUk9EX0NPTlNfTUFTSykKKwkJICAgIDw9IHBvcnQtPmlwX3R4X2xvd2F0ICogKGludClzaXplb2Yoc3RydWN0IHJpbmdfZW50cnkpKSB7CisJCQlwb3J0LT5pcF9mbGFncyB8PSBMT1dBVF9XUklUVEVOOworCQkJZW50cnktPnJpbmdfc2NbMF0gfD0gVFhDQl9JTlRfV0hFTl9ET05FOworCQl9CisKKwkJLyogR28gb24gdG8gbmV4dCBlbnRyeSAqLworCQlwcm9kX3B0ciArPSBzaXplb2Yoc3RydWN0IHJpbmdfZW50cnkpOworCQlwcm9kX3B0ciAmPSBQUk9EX0NPTlNfTUFTSzsKKwl9CisKKwkvKiBJZiB3ZSBzZW50IHNvbWV0aGluZywgc3RhcnQgRE1BIGlmIG5lY2Vzc2FyeSAqLworCWlmICh0b3RhbCA+IDAgJiYgIShwb3J0LT5pcF9zc2NyICYgU1NDUl9ETUFfRU4pKSB7CisJCXBvcnQtPmlwX3NzY3IgfD0gU1NDUl9ETUFfRU47CisJCXdyaXRlbChwb3J0LT5pcF9zc2NyLCAmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNzY3IpOworCX0KKworCS8qIFN0b3JlIHRoZSBuZXcgcHJvZHVjZXIgcG9pbnRlci4gIElmIHR4IGlzIGRpc2FibGVkLCB3ZSBzdHVmZiB0aGUKKwkgKiBkYXRhIGludG8gdGhlIHJpbmcgYnVmZmVyLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkgc3RhcnQgdHguCisJICovCisJaWYgKCF1YXJ0X3R4X3N0b3BwZWQocG9ydC0+aXBfcG9ydCkpIHsKKwkJd3JpdGVsKHByb2RfcHRyLCAmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnN0cGlyKTsKKworCQkvKiBJZiB3ZSBhcmUgbm93IHRyYW5zbWl0dGluZywgZW5hYmxlIHR4X210IGludGVycnVwdCBzbyB3ZQorCQkgKiBjYW4gZGlzYWJsZSBETUEgaWYgbmVjZXNzYXJ5IHdoZW4gdGhlIHR4IGZpbmlzaGVzLgorCQkgKi8KKwkJaWYgKHRvdGFsID4gMCkKKwkJCWVuYWJsZV9pbnRycyhwb3J0LCBob29rcy0+aW50cl90eF9tdCk7CisJfQorCXBvcnQtPmlwX3R4X3Byb2QgPSBwcm9kX3B0cjsKKworCXJldHVybiB0b3RhbDsKK30KKworLyoqCisgKiBkaXNhYmxlX2ludHJzIC0gZGlzYWJsZSBpbnRlcnJ1cHRzCisgKiBAcG9ydDogcG9ydCB0byBlbmFibGUKKyAqIEBtYXNrOiBtYXNrIHRvIHVzZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9pbnRycyhzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0LCB1aW50MzJfdCBtYXNrKQoreworCWlmIChwb3J0LT5pcF9jYXJkLT5pY19lbmFibGUgJiBtYXNrKSB7CisJCWlvYzNfZGlzYWJsZShwb3J0LT5pcF9pcywgcG9ydC0+aXBfaWRkLCBtYXNrKTsKKwkJcG9ydC0+aXBfY2FyZC0+aWNfZW5hYmxlICY9IH5tYXNrOworCX0KK30KKworLyoqCisgKiBzZXRfbm90aWZpY2F0aW9uIC0gTW9kaWZ5IGV2ZW50IG5vdGlmaWNhdGlvbgorICogQHBvcnQ6IHBvcnQgdG8gdXNlCisgKiBAbWFzazogZXZlbnRzIG1hc2sKKyAqIEBzZXRfb246IHNldCA/CisgKi8KK3N0YXRpYyBpbnQgc2V0X25vdGlmaWNhdGlvbihzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0LCBpbnQgbWFzaywgaW50IHNldF9vbikKK3sKKwlzdHJ1Y3QgcG9ydF9ob29rcyAqaG9va3MgPSBwb3J0LT5pcF9ob29rczsKKwl1aW50MzJfdCBpbnRyYml0cywgc3NjcmJpdHM7CisKKwlCVUdfT04oIW1hc2spOworCisJaW50cmJpdHMgPSBzc2NyYml0cyA9IDA7CisKKwlpZiAobWFzayAmIE5fREFUQV9SRUFEWSkKKwkJaW50cmJpdHMgfD0gKGhvb2tzLT5pbnRyX3J4X3RpbWVyIHwgaG9va3MtPmludHJfcnhfaGlnaCk7CisJaWYgKG1hc2sgJiBOX09VVFBVVF9MT1dBVCkKKwkJaW50cmJpdHMgfD0gaG9va3MtPmludHJfdHhfZXhwbGljaXQ7CisJaWYgKG1hc2sgJiBOX0REQ0QpIHsKKwkJaW50cmJpdHMgfD0gaG9va3MtPmludHJfZGVsdGFfZGNkOworCQlzc2NyYml0cyB8PSBTU0NSX1JYX1JJTkdfRENEOworCX0KKwlpZiAobWFzayAmIE5fRENUUykKKwkJaW50cmJpdHMgfD0gaG9va3MtPmludHJfZGVsdGFfY3RzOworCisJaWYgKHNldF9vbikgeworCQllbmFibGVfaW50cnMocG9ydCwgaW50cmJpdHMpOworCQlwb3J0LT5pcF9ub3RpZnkgfD0gbWFzazsKKwkJcG9ydC0+aXBfc3NjciB8PSBzc2NyYml0czsKKwl9IGVsc2UgeworCQlkaXNhYmxlX2ludHJzKHBvcnQsIGludHJiaXRzKTsKKwkJcG9ydC0+aXBfbm90aWZ5ICY9IH5tYXNrOworCQlwb3J0LT5pcF9zc2NyICY9IH5zc2NyYml0czsKKwl9CisKKwkvKiBXZSByZXF1aXJlIERNQSBpZiBlaXRoZXIgREFUQV9SRUFEWSBvciBERENEIG5vdGlmaWNhdGlvbiBpcworCSAqIGN1cnJlbnRseSByZXF1ZXN0ZWQuIElmIG5laXRoZXIgb2YgdGhlc2UgaXMgcmVxdWVzdGVkIGFuZAorCSAqIHRoZXJlIGlzIGN1cnJlbnRseSBubyB0eCBpbiBwcm9ncmVzcywgRE1BIG1heSBiZSBkaXNhYmxlZC4KKwkgKi8KKwlpZiAocG9ydC0+aXBfbm90aWZ5ICYgKE5fREFUQV9SRUFEWSB8IE5fRERDRCkpCisJCXBvcnQtPmlwX3NzY3IgfD0gU1NDUl9ETUFfRU47CisJZWxzZSBpZiAoIShwb3J0LT5pcF9jYXJkLT5pY19lbmFibGUgJiBob29rcy0+aW50cl90eF9tdCkpCisJCXBvcnQtPmlwX3NzY3IgJj0gflNTQ1JfRE1BX0VOOworCisJd3JpdGVsKHBvcnQtPmlwX3NzY3IsICZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3Njcik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc2V0X21jciAtIHNldCB0aGUgbWFzdGVyIGNvbnRyb2wgcmVnCisgKiBAdGhlX3BvcnQ6IHBvcnQgdG8gdXNlCisgKiBAbWFzazE6IG1jciBtYXNrCisgKiBAbWFzazI6IHNoYWRvdyBtYXNrCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNldF9tY3Ioc3RydWN0IHVhcnRfcG9ydCAqdGhlX3BvcnQsCisJCQkgIGludCBtYXNrMSwgaW50IG1hc2syKQoreworCXN0cnVjdCBpb2MzX3BvcnQgKnBvcnQgPSBnZXRfaW9jM19wb3J0KHRoZV9wb3J0KTsKKwl1aW50MzJfdCBzaGFkb3c7CisJaW50IHNwaW5pdGVyID0gMDsKKwljaGFyIG1jcjsKKworCWlmICghcG9ydCkKKwkJcmV0dXJuIC0xOworCisJLyogUGF1c2UgdGhlIERNQSBpbnRlcmZhY2UgaWYgbmVjZXNzYXJ5ICovCisJaWYgKHBvcnQtPmlwX3NzY3IgJiBTU0NSX0RNQV9FTikgeworCQl3cml0ZWwocG9ydC0+aXBfc3NjciB8IFNTQ1JfRE1BX1BBVVNFLAorCQkgICAgICAgJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zc2NyKTsKKwkJd2hpbGUgKChyZWFkbCgmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNzY3IpCisJCQkmIFNTQ1JfUEFVU0VfU1RBVEUpID09IDApIHsKKwkJCXNwaW5pdGVyKys7CisJCQlpZiAoc3Bpbml0ZXIgPiBNQVhJVEVSKQorCQkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlzaGFkb3cgPSByZWFkbCgmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNoYWRvdyk7CisJbWNyID0gKHNoYWRvdyAmIDB4ZmYwMDAwMDApID4+IDI0OworCisJLyogU2V0IG5ldyB2YWx1ZSAqLworCW1jciB8PSBtYXNrMTsKKwlzaGFkb3cgfD0gbWFzazI7CisJd3JpdGViKG1jciwgJnBvcnQtPmlwX3VhcnRfcmVncy0+aXVfbWNyKTsKKwl3cml0ZWwoc2hhZG93LCAmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNoYWRvdyk7CisKKwkvKiBSZS1lbmFibGUgdGhlIERNQSBpbnRlcmZhY2UgaWYgbmVjZXNzYXJ5ICovCisJaWYgKHBvcnQtPmlwX3NzY3IgJiBTU0NSX0RNQV9FTikgeworCQl3cml0ZWwocG9ydC0+aXBfc3NjciwgJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zc2NyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW9jM19zZXRfcHJvdG8gLSBzZXQgdGhlIHByb3RvY29sIGZvciB0aGUgcG9ydAorICogQHBvcnQ6IHBvcnQgdG8gdXNlCisgKiBAcHJvdG86IHByb3RvY29sIHRvIHVzZQorICovCitzdGF0aWMgaW50IGlvYzNfc2V0X3Byb3RvKHN0cnVjdCBpb2MzX3BvcnQgKnBvcnQsIGludCBwcm90bykKK3sKKwlzdHJ1Y3QgcG9ydF9ob29rcyAqaG9va3MgPSBwb3J0LT5pcF9ob29rczsKKworCXN3aXRjaCAocHJvdG8pIHsKKwlkZWZhdWx0OgorCWNhc2UgUFJPVE9fUlMyMzI6CisJCS8qIENsZWFyIHRoZSBhcHByb3ByaWF0ZSBHSU8gcGluICovCisJCURQUklOVF9DT05GSUcoKCIlczogcnMyMzJcbiIsIF9fRlVOQ1RJT05fXykpOworCQl3cml0ZWwoMCwgKCZwb3J0LT5pcF9pZGQtPnZtYS0+Z3BwclswXQorCQkJCQkrIGhvb2tzLT5yczQyMl9zZWxlY3RfcGluKSk7CisJCWJyZWFrOworCisJY2FzZSBQUk9UT19SUzQyMjoKKwkJLyogU2V0IHRoZSBhcHByb3ByaWF0ZSBHSU8gcGluICovCisJCURQUklOVF9DT05GSUcoKCIlczogcnM0MjJcbiIsIF9fRlVOQ1RJT05fXykpOworCQl3cml0ZWwoMSwgKCZwb3J0LT5pcF9pZGQtPnZtYS0+Z3BwclswXQorCQkJCQkrIGhvb2tzLT5yczQyMl9zZWxlY3RfcGluKSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB0cmFuc21pdF9jaGFycyAtIHVwcGVyIGxldmVsIHdyaXRlLCBjYWxsZWQgd2l0aCB0aGVfcG9ydC0+bG9jaworICogQHRoZV9wb3J0OiBwb3J0IHRvIHdyaXRlCisgKi8KK3N0YXRpYyB2b2lkIHRyYW5zbWl0X2NoYXJzKHN0cnVjdCB1YXJ0X3BvcnQgKnRoZV9wb3J0KQoreworCWludCB4bWl0X2NvdW50LCB0YWlsLCBoZWFkOworCWludCByZXN1bHQ7CisJY2hhciAqc3RhcnQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0ID0gZ2V0X2lvYzNfcG9ydCh0aGVfcG9ydCk7CisJc3RydWN0IHVhcnRfaW5mbyAqaW5mbzsKKworCWlmICghdGhlX3BvcnQpCisJCXJldHVybjsKKwlpZiAoIXBvcnQpCisJCXJldHVybjsKKworCWluZm8gPSB0aGVfcG9ydC0+aW5mbzsKKwl0dHkgPSBpbmZvLT50dHk7CisKKwlpZiAodWFydF9jaXJjX2VtcHR5KCZpbmZvLT54bWl0KSB8fCB1YXJ0X3R4X3N0b3BwZWQodGhlX3BvcnQpKSB7CisJCS8qIE5vdGhpbmcgdG8gZG8gb3IgaHcgc3RvcHBlZCAqLworCQlzZXRfbm90aWZpY2F0aW9uKHBvcnQsIE5fQUxMX09VVFBVVCwgMCk7CisJCXJldHVybjsKKwl9CisKKwloZWFkID0gaW5mby0+eG1pdC5oZWFkOworCXRhaWwgPSBpbmZvLT54bWl0LnRhaWw7CisJc3RhcnQgPSAoY2hhciAqKSZpbmZvLT54bWl0LmJ1Zlt0YWlsXTsKKworCS8qIHdyaXRlIG91dCBhbGwgdGhlIGRhdGEgb3IgdW50aWwgdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovCisJeG1pdF9jb3VudCA9IChoZWFkIDwgdGFpbCkgPyAoVUFSVF9YTUlUX1NJWkUgLSB0YWlsKSA6IChoZWFkIC0gdGFpbCk7CisJaWYgKHhtaXRfY291bnQgPiAwKSB7CisJCXJlc3VsdCA9IGRvX3dyaXRlKHBvcnQsIHN0YXJ0LCB4bWl0X2NvdW50KTsKKwkJaWYgKHJlc3VsdCA+IDApIHsKKwkJCS8qIGJvb2tpbmcgKi8KKwkJCXhtaXRfY291bnQgLT0gcmVzdWx0OworCQkJdGhlX3BvcnQtPmljb3VudC50eCArPSByZXN1bHQ7CisJCQkvKiBhZHZhbmNlIHRoZSBwb2ludGVycyAqLworCQkJdGFpbCArPSByZXN1bHQ7CisJCQl0YWlsICY9IFVBUlRfWE1JVF9TSVpFIC0gMTsKKwkJCWluZm8tPnhtaXQudGFpbCA9IHRhaWw7CisJCQlzdGFydCA9IChjaGFyICopJmluZm8tPnhtaXQuYnVmW3RhaWxdOworCQl9CisJfQorCWlmICh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZygmaW5mby0+eG1pdCkgPCBXQUtFVVBfQ0hBUlMpCisJCXVhcnRfd3JpdGVfd2FrZXVwKHRoZV9wb3J0KTsKKworCWlmICh1YXJ0X2NpcmNfZW1wdHkoJmluZm8tPnhtaXQpKSB7CisJCXNldF9ub3RpZmljYXRpb24ocG9ydCwgTl9PVVRQVVRfTE9XQVQsIDApOworCX0gZWxzZSB7CisJCXNldF9ub3RpZmljYXRpb24ocG9ydCwgTl9PVVRQVVRfTE9XQVQsIDEpOworCX0KK30KKworLyoqCisgKiBpb2MzX2NoYW5nZV9zcGVlZCAtIGNoYW5nZSB0aGUgc3BlZWQgb2YgdGhlIHBvcnQKKyAqIEB0aGVfcG9ydDogcG9ydCB0byBjaGFuZ2UKKyAqIEBuZXdfdGVybWlvczogbmV3IHRlcm1pb3Mgc2V0dGluZ3MKKyAqIEBvbGRfdGVybWlvczogb2xkIHRlcm1pb3Mgc2V0dGluZ3MKKyAqLworc3RhdGljIHZvaWQKK2lvYzNfY2hhbmdlX3NwZWVkKHN0cnVjdCB1YXJ0X3BvcnQgKnRoZV9wb3J0LAorCQkgIHN0cnVjdCB0ZXJtaW9zICpuZXdfdGVybWlvcywgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQoreworCXN0cnVjdCBpb2MzX3BvcnQgKnBvcnQgPSBnZXRfaW9jM19wb3J0KHRoZV9wb3J0KTsKKwl1bnNpZ25lZCBpbnQgY2ZsYWc7CisJaW50IGJhdWQ7CisJaW50IG5ld19wYXJpdHkgPSAwLCBuZXdfcGFyaXR5X2VuYWJsZSA9IDAsIG5ld19zdG9wID0gMCwgbmV3X2RhdGEgPSA4OworCXN0cnVjdCB1YXJ0X2luZm8gKmluZm8gPSB0aGVfcG9ydC0+aW5mbzsKKworCWNmbGFnID0gbmV3X3Rlcm1pb3MtPmNfY2ZsYWc7CisKKwlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKKwljYXNlIENTNToKKwkJbmV3X2RhdGEgPSA1OworCQlicmVhazsKKwljYXNlIENTNjoKKwkJbmV3X2RhdGEgPSA2OworCQlicmVhazsKKwljYXNlIENTNzoKKwkJbmV3X2RhdGEgPSA3OworCQlicmVhazsKKwljYXNlIENTODoKKwkJbmV3X2RhdGEgPSA4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBjdXogd2UgYWx3YXlzIG5lZWQgYSBkZWZhdWx0IC4uLiAqLworCQluZXdfZGF0YSA9IDU7CisJCWJyZWFrOworCX0KKwlpZiAoY2ZsYWcgJiBDU1RPUEIpIHsKKwkJbmV3X3N0b3AgPSAxOworCX0KKwlpZiAoY2ZsYWcgJiBQQVJFTkIpIHsKKwkJbmV3X3Bhcml0eV9lbmFibGUgPSAxOworCQlpZiAoY2ZsYWcgJiBQQVJPREQpCisJCQluZXdfcGFyaXR5ID0gMTsKKwl9CisJYmF1ZCA9IHVhcnRfZ2V0X2JhdWRfcmF0ZSh0aGVfcG9ydCwgbmV3X3Rlcm1pb3MsIG9sZF90ZXJtaW9zLAorCQkJCSAgTUlOX0JBVURfU1VQUE9SVEVELCBNQVhfQkFVRF9TVVBQT1JURUQpOworCURQUklOVF9DT05GSUcoKCIlczogcmV0dXJuZWQgYmF1ZCAlZCBmb3IgbGluZSAlZFxuIiwgX19GVU5DVElPTl9fLCBiYXVkLAorCQkJCXRoZV9wb3J0LT5saW5lKSk7CisKKwlpZiAoIXRoZV9wb3J0LT5maWZvc2l6ZSkKKwkJdGhlX3BvcnQtPmZpZm9zaXplID0gRklGT19TSVpFOworCXVhcnRfdXBkYXRlX3RpbWVvdXQodGhlX3BvcnQsIGNmbGFnLCBiYXVkKTsKKworCXRoZV9wb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgPSBOX0FMTF9JTlBVVDsKKworCWluZm8tPnR0eS0+bG93X2xhdGVuY3kgPSAxOworCisJaWYgKElfSUdOUEFSKGluZm8tPnR0eSkpCisJCXRoZV9wb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgJj0gfihOX1BBUklUWV9FUlJPUgorCQkJCQkJICB8IE5fRlJBTUlOR19FUlJPUik7CisJaWYgKElfSUdOQlJLKGluZm8tPnR0eSkpIHsKKwkJdGhlX3BvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayAmPSB+Tl9CUkVBSzsKKwkJaWYgKElfSUdOUEFSKGluZm8tPnR0eSkpCisJCQl0aGVfcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrICY9IH5OX09WRVJSVU5fRVJST1I7CisJfQorCWlmICghKGNmbGFnICYgQ1JFQUQpKSB7CisJCS8qIGlnbm9yZSBldmVyeXRoaW5nICovCisJCXRoZV9wb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgJj0gfk5fREFUQV9SRUFEWTsKKwl9CisKKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCS8qIGVuYWJsZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgKi8KKwkJcG9ydC0+aXBfc3NjciB8PSBTU0NSX0hGQ19FTjsKKwl9CisJZWxzZSB7CisJCS8qIGRpc2FibGUgaGFyZHdhcmUgZmxvdyBjb250cm9sICovCisJCXBvcnQtPmlwX3NzY3IgJj0gflNTQ1JfSEZDX0VOOworCX0KKwl3cml0ZWwocG9ydC0+aXBfc3NjciwgJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zc2NyKTsKKworCS8qIFNldCB0aGUgY29uZmlndXJhdGlvbiBhbmQgcHJvcGVyIG5vdGlmaWNhdGlvbiBjYWxsICovCisJRFBSSU5UX0NPTkZJRygoIiVzIDogcG9ydCAweCVwIGxpbmUgJWQgY2ZsYWcgMCVvICIKKwkJICAgICAgICJjb25maWdfcG9ydChiYXVkICVkIGRhdGEgJWQgc3RvcCAlZCBwZW5hYmxlICVkICIKKwkJCSIgcGFyaXR5ICVkKSwgbm90aWZpY2F0aW9uIDB4JXhcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sICh2b2lkICopcG9ydCwgdGhlX3BvcnQtPmxpbmUsIGNmbGFnLCBiYXVkLAorCQkgICAgICAgbmV3X2RhdGEsIG5ld19zdG9wLCBuZXdfcGFyaXR5X2VuYWJsZSwgbmV3X3Bhcml0eSwKKwkJICAgICAgIHRoZV9wb3J0LT5pZ25vcmVfc3RhdHVzX21hc2spKTsKKworCWlmICgoY29uZmlnX3BvcnQocG9ydCwgYmF1ZCwJLyogYmF1ZCAqLworCQkJIG5ld19kYXRhLAkvKiBieXRlIHNpemUgKi8KKwkJCSBuZXdfc3RvcCwJLyogc3RvcCBiaXRzICovCisJCQkgbmV3X3Bhcml0eV9lbmFibGUsCS8qIHNldCBwYXJpdHkgKi8KKwkJCSBuZXdfcGFyaXR5KSkgPj0gMCkgewkvKiBwYXJpdHkgMT09b2RkICovCisJCXNldF9ub3RpZmljYXRpb24ocG9ydCwgdGhlX3BvcnQtPmlnbm9yZV9zdGF0dXNfbWFzaywgMSk7CisJfQorfQorCisvKioKKyAqIGljM19zdGFydHVwX2xvY2FsIC0gU3RhcnQgdXAgdGhlIHNlcmlhbCBwb3J0IC0gcmV0dXJucyA+PSAwIGlmIG5vIGVycm9ycworICogQHRoZV9wb3J0OiBQb3J0IHRvIG9wZXJhdGUgb24KKyAqLworc3RhdGljIGlubGluZSBpbnQgaWMzX3N0YXJ0dXBfbG9jYWwoc3RydWN0IHVhcnRfcG9ydCAqdGhlX3BvcnQpCit7CisJc3RydWN0IGlvYzNfcG9ydCAqcG9ydDsKKworCWlmICghdGhlX3BvcnQpIHsKKwkJTk9UX1BST0dSRVNTKCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwb3J0ID0gZ2V0X2lvYzNfcG9ydCh0aGVfcG9ydCk7CisJaWYgKCFwb3J0KSB7CisJCU5PVF9QUk9HUkVTUygpOworCQlyZXR1cm4gLTE7CisJfQorCisJbG9jYWxfb3Blbihwb3J0KTsKKworCS8qIHNldCB0aGUgcHJvdG9jb2wgKi8KKwlpb2MzX3NldF9wcm90byhwb3J0LCBJU19SUzIzMih0aGVfcG9ydC0+bGluZSkgPyBQUk9UT19SUzIzMiA6CisJCQkJCQkJUFJPVE9fUlM0MjIpOworCXJldHVybiAwOworfQorCisvKgorICogaW9jM19jYl9vdXRwdXRfbG93YXQgLSBjYWxsZWQgd2hlbiB0aGUgb3V0cHV0IGxvdyB3YXRlciBtYXJrIGlzIGhpdAorICogQHBvcnQ6IHBvcnQgdG8gb3V0cHV0CisgKi8KK3N0YXRpYyB2b2lkIGlvYzNfY2Jfb3V0cHV0X2xvd2F0KHN0cnVjdCBpb2MzX3BvcnQgKnBvcnQpCit7CisJdW5zaWduZWQgbG9uZyBwZmxhZ3M7CisKKwkvKiB0aGVfcG9ydC0+bG9jayBpcyBzZXQgb24gdGhlIGNhbGwgaGVyZSAqLworCWlmIChwb3J0LT5pcF9wb3J0KSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5pcF9wb3J0LT5sb2NrLCBwZmxhZ3MpOworCQl0cmFuc21pdF9jaGFycyhwb3J0LT5pcF9wb3J0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+aXBfcG9ydC0+bG9jaywgcGZsYWdzKTsKKwl9Cit9CisKKy8qCisgKiBpb2MzX2NiX3Bvc3RfbmNzIC0gY2FsbGVkIGZvciBzb21lIGJhc2ljIGVycm9ycworICogQHBvcnQ6IHBvcnQgdG8gdXNlCisgKiBAbmNzOiBldmVudAorICovCitzdGF0aWMgdm9pZCBpb2MzX2NiX3Bvc3RfbmNzKHN0cnVjdCB1YXJ0X3BvcnQgKnRoZV9wb3J0LCBpbnQgbmNzKQoreworCXN0cnVjdCB1YXJ0X2ljb3VudCAqaWNvdW50OworCisJaWNvdW50ID0gJnRoZV9wb3J0LT5pY291bnQ7CisKKwlpZiAobmNzICYgTkNTX0JSRUFLKQorCQlpY291bnQtPmJyaysrOworCWlmIChuY3MgJiBOQ1NfRlJBTUlORykKKwkJaWNvdW50LT5mcmFtZSsrOworCWlmIChuY3MgJiBOQ1NfT1ZFUlJVTikKKwkJaWNvdW50LT5vdmVycnVuKys7CisJaWYgKG5jcyAmIE5DU19QQVJJVFkpCisJCWljb3VudC0+cGFyaXR5Kys7Cit9CisKKy8qKgorICogZG9fcmVhZCAtIFJlYWQgaW4gYnl0ZXMgZnJvbSB0aGUgcG9ydC4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgKgkJCWFjdHVhbGx5IHJlYWQuCisgKiBAdGhlX3BvcnQ6IHBvcnQgdG8gdXNlCisgKiBAYnVmOiBwbGFjZSB0byBwdXQgdGhlIHN0dWZmIHdlIHJlYWQKKyAqIEBsZW46IGhvdyBiaWcgJ2J1ZicgaXMKKyAqLworCitzdGF0aWMgaW5saW5lIGludCBkb19yZWFkKHN0cnVjdCB1YXJ0X3BvcnQgKnRoZV9wb3J0LCBjaGFyICpidWYsIGludCBsZW4pCit7CisJaW50IHByb2RfcHRyLCBjb25zX3B0ciwgdG90YWw7CisJc3RydWN0IGlvYzNfcG9ydCAqcG9ydCA9IGdldF9pb2MzX3BvcnQodGhlX3BvcnQpOworCXN0cnVjdCByaW5nICppbnJpbmc7CisJc3RydWN0IHJpbmdfZW50cnkgKmVudHJ5OworCXN0cnVjdCBwb3J0X2hvb2tzICpob29rcyA9IHBvcnQtPmlwX2hvb2tzOworCWludCBieXRlX251bTsKKwljaGFyICpzYzsKKwlpbnQgbG9vcF9jb3VudGVyOworCisJQlVHX09OKCEobGVuID49IDApKTsKKwlCVUdfT04oIXBvcnQpOworCisJLyogVGhlcmUgaXMgYSBuYXN0eSB0aW1pbmcgaXNzdWUgaW4gdGhlIElPQzMuIFdoZW4gdGhlIHJ4X3RpbWVyCisJICogZXhwaXJlcyBvciB0aGUgcnhfaGlnaCBjb25kaXRpb24gYXJpc2VzLCB3ZSB0YWtlIGFuIGludGVycnVwdC4KKwkgKiBBdCBzb21lIHBvaW50IHdoaWxlIHNlcnZpY2luZyB0aGUgaW50ZXJydXB0LCB3ZSByZWFkIGJ5dGVzIGZyb20KKwkgKiB0aGUgcmluZyBidWZmZXIgYW5kIHJlLWFybSB0aGUgcnhfdGltZXIuICBIb3dldmVyIHRoZSByeF90aW1lciBpcworCSAqIG5vdCBzdGFydGVkIHVudGlsIHRoZSBmaXJzdCBieXRlIGlzIHJlY2VpdmVkICphZnRlciogaXQgaXMgYXJtZWQsCisJICogYW5kIGFueSBieXRlcyBwZW5kaW5nIGluIHRoZSByeCBjb25zdHJ1Y3Rpb24gYnVmZmVycyBhcmUgbm90IGRyYWluZWQKKwkgKiB0byBtZW1vcnkgdW50aWwgZWl0aGVyIHRoZXJlIGFyZSA0IGJ5dGVzIGF2YWlsYWJsZSBvciB0aGUgcnhfdGltZXIKKwkgKiBleHBpcmVzLiAgVGhpcyBsZWFkcyB0byBhIHBvdGVudGlhbCBzaXR1YXRpb24gd2hlcmUgZGF0YSBpcyBsZWZ0CisJICogaW4gdGhlIGNvbnN0cnVjdGlvbiBidWZmZXJzIGZvcmV2ZXIgLSAxIHRvIDMgYnl0ZXMgd2VyZSByZWNlaXZlZAorCSAqIGFmdGVyIHRoZSBpbnRlcnJ1cHQgd2FzIGdlbmVyYXRlZCBidXQgYmVmb3JlIHRoZSByeF90aW1lciB3YXMKKwkgKiByZS1hcm1lZC4gQXQgdGhhdCBwb2ludCBhcyBsb25nIGFzIG5vIHN1YnNlcXVlbnQgYnl0ZXMgYXJlIHJlY2VpdmVkCisJICogdGhlIHRpbWVyIHdpbGwgbmV2ZXIgYmUgc3RhcnRlZCBhbmQgdGhlIGJ5dGVzIHdpbGwgcmVtYWluIGluIHRoZQorCSAqIGNvbnN0cnVjdGlvbiBidWZmZXIgZm9yZXZlci4gIFRoZSBzb2x1dGlvbiBpcyB0byBleGVjdXRlIGEgRFJBSU4KKwkgKiBjb21tYW5kIGFmdGVyIHJlYXJtaW5nIHRoZSB0aW1lci4gIFRoaXMgd2F5IGFueSBieXRlcyByZWNlaXZlZCBiZWZvcmUKKwkgKiB0aGUgRFJBSU4gd2lsbCBiZSBkcmFpbmVkIHRvIG1lbW9yeSwgYW5kIGFueSBieXRlcyByZWNlaXZlZCBhZnRlcgorCSAqIHRoZSBEUkFJTiB3aWxsIHN0YXJ0IHRoZSBUSU1FUiBhbmQgYmUgZHJhaW5lZCB3aGVuIGl0IGV4cGlyZXMuCisJICogTHVja2lseSwgdGhpcyBvbmx5IG5lZWRzIHRvIGJlIGRvbmUgd2hlbiB0aGUgRE1BIGJ1ZmZlciBpcyBlbXB0eQorCSAqIHNpbmNlIHRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IHRoYXQgdGhpcyBmdW5jdGlvbiByZXR1cm4gYWxsCisJICogYXZhaWxhYmxlIGRhdGEgYXMgbG9uZyBhcyBpdCByZXR1cm5zIHNvbWUuCisJICovCisJLyogUmUtYXJtIHRoZSB0aW1lciAqLworCisJd3JpdGVsKHBvcnQtPmlwX3J4X2NvbnMgfCBTUkNJUl9BUk0sICZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3JjaXIpOworCisJcHJvZF9wdHIgPSByZWFkbCgmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNycGlyKSAmIFBST0RfQ09OU19NQVNLOworCWNvbnNfcHRyID0gcG9ydC0+aXBfcnhfY29uczsKKworCWlmIChwcm9kX3B0ciA9PSBjb25zX3B0cikgeworCQlpbnQgcmVzZXRfZG1hID0gMDsKKworCQkvKiBJbnB1dCBidWZmZXIgYXBwZWFycyBlbXB0eSwgZG8gYSBmbHVzaC4gKi8KKworCQkvKiBETUEgbXVzdCBiZSBlbmFibGVkIGZvciB0aGlzIHRvIHdvcmsuICovCisJCWlmICghKHBvcnQtPmlwX3NzY3IgJiBTU0NSX0RNQV9FTikpIHsKKwkJCXBvcnQtPmlwX3NzY3IgfD0gU1NDUl9ETUFfRU47CisJCQlyZXNldF9kbWEgPSAxOworCQl9CisKKwkJLyogUG90ZW50aWFsIHJhY2UgY29uZGl0aW9uOiB3ZSBtdXN0IHJlbG9hZCB0aGUgc3JwaXIgYWZ0ZXIKKwkJICogaXNzdWluZyB0aGUgZHJhaW4gY29tbWFuZCwgb3RoZXJ3aXNlIHdlIGNvdWxkIHRoaW5rIHRoZSByeAorCQkgKiBidWZmZXIgaXMgZW1wdHksIHRoZW4gdGFrZSBhIHZlcnkgbG9uZyBpbnRlcnJ1cHQsIGFuZCB3aGVuCisJCSAqIHdlIGNvbWUgYmFjayBpdCdzIGZ1bGwgYW5kIHdlIHdhaXQgZm9yZXZlciBmb3IgdGhlIGRyYWluIHRvCisJCSAqIGNvbXBsZXRlLgorCQkgKi8KKwkJd3JpdGVsKHBvcnQtPmlwX3NzY3IgfCBTU0NSX1JYX0RSQUlOLAorCQkgICAgICAgJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zc2NyKTsKKwkJcHJvZF9wdHIgPSByZWFkbCgmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNycGlyKSAmIFBST0RfQ09OU19NQVNLOworCisJCS8qIFdlIG11c3Qgbm90IHdhaXQgZm9yIHRoZSBEUkFJTiB0byBjb21wbGV0ZSB1bmxlc3MgdGhlcmUgYXJlCisJCSAqIGF0IGxlYXN0IDggYnl0ZXMgKDIgcmluZyBlbnRyaWVzKSBhdmFpbGFibGUgdG8gcmVjZWl2ZSB0aGUKKwkJICogZGF0YSBvdGhlcndpc2UgdGhlIERSQUlOIHdpbGwgbmV2ZXIgY29tcGxldGUgYW5kIHdlJ2xsCisJCSAqIGRlYWRsb2NrIGhlcmUuCisJCSAqIEluIGZhY3QsIHRvIG1ha2UgdGhpbmdzIGVhc2llciwgSSdsbCBqdXN0IGlnbm9yZSB0aGUgZmx1c2ggaWYKKwkJICogdGhlcmUgaXMgYW55IGRhdGEgYXQgYWxsIG5vdyBhdmFpbGFibGUuCisJCSAqLworCQlpZiAocHJvZF9wdHIgPT0gY29uc19wdHIpIHsKKwkJCWxvb3BfY291bnRlciA9IDA7CisJCQl3aGlsZSAocmVhZGwoJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zc2NyKSAmCisJCQkgICAgICAgU1NDUl9SWF9EUkFJTikgeworCQkJCWxvb3BfY291bnRlcisrOworCQkJCWlmIChsb29wX2NvdW50ZXIgPiBNQVhJVEVSKQorCQkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCS8qIFNJR0guIFdlIGhhdmUgdG8gcmVsb2FkIHRoZSBwcm9kX3B0ciAqYWdhaW4qIHNpbmNlCisJCQkgKiB0aGUgZHJhaW4gbWF5IGhhdmUgY2F1c2VkIGl0IHRvIGNoYW5nZQorCQkJICovCisJCQlwcm9kX3B0ciA9IHJlYWRsKCZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3JwaXIpCisJCQkgICAgJiBQUk9EX0NPTlNfTUFTSzsKKwkJfQorCQlpZiAocmVzZXRfZG1hKSB7CisJCQlwb3J0LT5pcF9zc2NyICY9IH5TU0NSX0RNQV9FTjsKKwkJCXdyaXRlbChwb3J0LT5pcF9zc2NyLCAmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNzY3IpOworCQl9CisJfQorCWlucmluZyA9IHBvcnQtPmlwX2lucmluZzsKKwlwb3J0LT5pcF9mbGFncyAmPSB+UkVBRF9BQk9SVEVEOworCisJdG90YWwgPSAwOworCWxvb3BfY291bnRlciA9IDB4ZmZmZmY7CS8qIHRvIGF2b2lkIGhhbmdzICovCisKKwkvKiBHcmFiIGJ5dGVzIGZyb20gdGhlIGhhcmR3YXJlICovCisJd2hpbGUgKChwcm9kX3B0ciAhPSBjb25zX3B0cikgJiYgKGxlbiA+IDApKSB7CisJCWVudHJ5ID0gKHN0cnVjdCByaW5nX2VudHJ5ICopKChjYWRkcl90KSBpbnJpbmcgKyBjb25zX3B0cik7CisKKwkJaWYgKGxvb3BfY291bnRlci0tIDw9IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIklPQzMgc2VyaWFsOiAiCisJCQkgICAgICAgInBvc3NpYmxlIGhhbmcgY29uZGl0aW9uLyIKKwkJCSAgICAgICAicG9ydCBzdHVjayBvbiByZWFkIChsaW5lICVkKS5cbiIsCisJCQkJdGhlX3BvcnQtPmxpbmUpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBBY2NvcmRpbmcgdG8gdGhlIHByb2R1Y2VyIHBvaW50ZXIsIHRoaXMgcmluZyBlbnRyeQorCQkgKiBtdXN0IGNvbnRhaW4gc29tZSBkYXRhLiAgQnV0IGlmIHRoZSBQSU8gaGFwcGVuZWQgZmFzdGVyCisJCSAqIHRoYW4gdGhlIERNQSwgdGhlIGRhdGEgbWF5IG5vdCBiZSBhdmFpbGFibGUgeWV0LCBzbyBsZXQncworCQkgKiB3YWl0IHVudGlsIGl0IGFycml2ZXMuCisJCSAqLworCQlpZiAoKGVudHJ5LT5yaW5nX2FsbHNjICYgUklOR19BTllfVkFMSUQpID09IDApIHsKKwkJCS8qIEluZGljYXRlIHRoZSByZWFkIGlzIGFib3J0ZWQgc28gd2UgZG9uJ3QgZGlzYWJsZQorCQkJICogdGhlIGludGVycnVwdCB0aGlua2luZyB0aGF0IHRoZSBjb25zdW1lciBpcworCQkJICogY29uZ2VzdGVkLgorCQkJICovCisJCQlwb3J0LT5pcF9mbGFncyB8PSBSRUFEX0FCT1JURUQ7CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBMb2FkIHRoZSBieXRlcy9zdGF0dXMgb3V0IG9mIHRoZSByaW5nIGVudHJ5ICovCisJCWZvciAoYnl0ZV9udW0gPSAwOyBieXRlX251bSA8IDQgJiYgbGVuID4gMDsgYnl0ZV9udW0rKykgeworCQkJc2MgPSAmKGVudHJ5LT5yaW5nX3NjW2J5dGVfbnVtXSk7CisKKwkJCS8qIENoZWNrIGZvciBjaGFuZ2UgaW4gbW9kZW0gc3RhdGUgb3Igb3ZlcnJ1biAqLworCQkJaWYgKCgqc2MgJiBSWFNCX01PREVNX1ZBTElEKQorCQkJICAgICYmIChwb3J0LT5pcF9ub3RpZnkgJiBOX0REQ0QpKSB7CisJCQkJLyogTm90aWZ5IHVwcGVyIGxheWVyIGlmIERDRCBkcm9wcGVkICovCisJCQkJaWYgKChwb3J0LT5pcF9mbGFncyAmIERDRF9PTikKKwkJCQkgICAgJiYgISgqc2MgJiBSWFNCX0RDRCkpIHsKKwkJCQkJLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGNvcGllZCBzb21lIGRhdGEsCisJCQkJCSAqIHJldHVybiBpdC4gIFdlJ2xsIHBpY2sgdXAgdGhlIGNhcnJpZXIKKwkJCQkJICogZHJvcCBvbiB0aGUgbmV4dCBwYXNzLiAgVGhhdCB3YXkgd2UKKwkJCQkJICogZG9uJ3QgdGhyb3cgYXdheSB0aGUgZGF0YSB0aGF0IGhhcworCQkJCQkgKiBhbHJlYWR5IGJlZW4gY29waWVkIGJhY2sgdG8KKwkJCQkJICogdGhlIGNhbGxlcidzIGJ1ZmZlci4KKwkJCQkJICovCisJCQkJCWlmICh0b3RhbCA+IDApIHsKKwkJCQkJCWxlbiA9IDA7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlwb3J0LT5pcF9mbGFncyAmPSB+RENEX09OOworCisJCQkJCS8qIFR1cm4gb2ZmIHRoaXMgbm90aWZpY2F0aW9uIHNvIHRoZQorCQkJCQkgKiBjYXJyaWVyIGRyb3AgcHJvdG9jb2wgd29uJ3Qgc2VlIGl0CisJCQkJCSAqIGFnYWluIHdoZW4gaXQgZG9lcyBhIHJlYWQuCisJCQkJCSAqLworCQkJCQkqc2MgJj0gflJYU0JfTU9ERU1fVkFMSUQ7CisKKwkJCQkJLyogVG8ga2VlcCB0aGluZ3MgY29uc2lzdGVudCwgd2UgbmVlZAorCQkJCQkgKiB0byB1cGRhdGUgdGhlIGNvbnN1bWVyIHBvaW50ZXIgc28KKwkJCQkJICogdGhlIG5leHQgcmVhZGVyIHdvbid0IGNvbWUgaW4gYW5kCisJCQkJCSAqIHRyeSB0byByZWFkIHRoZSBzYW1lIHJpbmcgZW50cmllcworCQkJCQkgKiBhZ2Fpbi4gVGhpcyBtdXN0IGJlIGRvbmUgaGVyZSBiZWZvcmUKKwkJCQkJICogdGhlIGRjZCBjaGFuZ2UuCisJCQkJCSAqLworCisJCQkJCWlmICgoZW50cnktPnJpbmdfYWxsc2MgJiBSSU5HX0FOWV9WQUxJRCkKKwkJCQkJICAgID09IDApIHsKKwkJCQkJCWNvbnNfcHRyICs9IChpbnQpc2l6ZW9mCisJCQkJCQkgICAgKHN0cnVjdCByaW5nX2VudHJ5KTsKKwkJCQkJCWNvbnNfcHRyICY9IFBST0RfQ09OU19NQVNLOworCQkJCQl9CisJCQkJCXdyaXRlbChjb25zX3B0ciwKKwkJCQkJICAgICAgICZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c3JjaXIpOworCQkJCQlwb3J0LT5pcF9yeF9jb25zID0gY29uc19wdHI7CisKKwkJCQkJLyogTm90aWZ5IHVwcGVyIGxheWVyIG9mIGNhcnJpZXIgZHJvcCAqLworCQkJCQlpZiAoKHBvcnQtPmlwX25vdGlmeSAmIE5fRERDRCkKKwkJCQkJICAgICYmIHBvcnQtPmlwX3BvcnQpIHsKKwkJCQkJCXVhcnRfaGFuZGxlX2RjZF9jaGFuZ2UKKwkJCQkJCQkocG9ydC0+aXBfcG9ydCwgMCk7CisJCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUKKwkJCQkJCSAgICAoJnRoZV9wb3J0LT5pbmZvLT4KKwkJCQkJCSAgICAgZGVsdGFfbXNyX3dhaXQpOworCQkJCQl9CisKKwkJCQkJLyogSWYgd2UgaGFkIGFueSBkYXRhIHRvIHJldHVybiwgd2UKKwkJCQkJICogd291bGQgaGF2ZSByZXR1cm5lZCBpdCBhYm92ZS4KKwkJCQkJICovCisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJCWlmICgqc2MgJiBSWFNCX01PREVNX1ZBTElEKSB7CisJCQkJLyogTm90aWZ5IHRoYXQgYW4gaW5wdXQgb3ZlcnJ1biBvY2N1cnJlZCAqLworCQkJCWlmICgoKnNjICYgUlhTQl9PVkVSUlVOKQorCQkJCSAgICAmJiAocG9ydC0+aXBfbm90aWZ5ICYgTl9PVkVSUlVOX0VSUk9SKSkgeworCQkJCQlpb2MzX2NiX3Bvc3RfbmNzKHRoZV9wb3J0LCBOQ1NfT1ZFUlJVTik7CisJCQkJfQorCQkJCS8qIERvbid0IGxvb2sgYXQgdGhpcyBieXRlIGFnYWluICovCisJCQkJKnNjICY9IH5SWFNCX01PREVNX1ZBTElEOworCQkJfQorCisJCQkvKiBDaGVjayBmb3IgdmFsaWQgZGF0YSBvciBSWCBlcnJvcnMgKi8KKwkJCWlmICgoKnNjICYgUlhTQl9EQVRBX1ZBTElEKSAmJgorCQkJICAgICgoKnNjICYgKFJYU0JfUEFSX0VSUgorCQkJCSAgICAgfCBSWFNCX0ZSQU1FX0VSUiB8IFJYU0JfQlJFQUspKQorCQkJICAgICAmJiAocG9ydC0+aXBfbm90aWZ5ICYgKE5fUEFSSVRZX0VSUk9SCisJCQkJCQkgICAgfCBOX0ZSQU1JTkdfRVJST1IKKwkJCQkJCSAgICB8IE5fQlJFQUspKSkpIHsKKwkJCQkvKiBUaGVyZSBpcyBhbiBlcnJvciBjb25kaXRpb24gb24gdGhlIG5leHQgYnl0ZS4KKwkJCQkgKiBJZiB3ZSBoYXZlIGFscmVhZHkgdHJhbnNmZXJyZWQgc29tZSBieXRlcywKKwkJCQkgKiB3ZSdsbCBzdG9wIGhlcmUuIE90aGVyd2lzZSBpZiB0aGlzIGlzIHRoZQorCQkJCSAqIGZpcnN0IGJ5dGUgdG8gYmUgcmVhZCwgd2UnbGwganVzdCB0cmFuc2ZlcgorCQkJCSAqIGl0IGFsb25lIGFmdGVyIG5vdGlmeWluZyB0aGUKKwkJCQkgKiB1cHBlciBsYXllciBvZiBpdHMgc3RhdHVzLgorCQkJCSAqLworCQkJCWlmICh0b3RhbCA+IDApIHsKKwkJCQkJbGVuID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCgqc2MgJiBSWFNCX1BBUl9FUlIpICYmCisJCQkJCSAgICAocG9ydC0+CisJCQkJCSAgICAgaXBfbm90aWZ5ICYgTl9QQVJJVFlfRVJST1IpKSB7CisJCQkJCQlpb2MzX2NiX3Bvc3RfbmNzKHRoZV9wb3J0LAorCQkJCQkJCQkgTkNTX1BBUklUWSk7CisJCQkJCX0KKwkJCQkJaWYgKCgqc2MgJiBSWFNCX0ZSQU1FX0VSUikgJiYKKwkJCQkJICAgIChwb3J0LT4KKwkJCQkJICAgICBpcF9ub3RpZnkgJiBOX0ZSQU1JTkdfRVJST1IpKSB7CisJCQkJCQlpb2MzX2NiX3Bvc3RfbmNzKHRoZV9wb3J0LAorCQkJCQkJCQkgTkNTX0ZSQU1JTkcpOworCQkJCQl9CisJCQkJCWlmICgoKnNjICYgUlhTQl9CUkVBSykKKwkJCQkJICAgICYmIChwb3J0LT5pcF9ub3RpZnkgJiBOX0JSRUFLKSkgeworCQkJCQkJaW9jM19jYl9wb3N0X25jcworCQkJCQkJICAgICh0aGVfcG9ydCwgTkNTX0JSRUFLKTsKKwkJCQkJfQorCQkJCQlsZW4gPSAxOworCQkJCX0KKwkJCX0KKwkJCWlmICgqc2MgJiBSWFNCX0RBVEFfVkFMSUQpIHsKKwkJCQkqc2MgJj0gflJYU0JfREFUQV9WQUxJRDsKKwkJCQkqYnVmID0gZW50cnktPnJpbmdfZGF0YVtieXRlX251bV07CisJCQkJYnVmKys7CisJCQkJbGVuLS07CisJCQkJdG90YWwrKzsKKwkJCX0KKwkJfQorCisJCS8qIElmIHdlIHVzZWQgdXAgdGhpcyBlbnRyeSBlbnRpcmVseSwgZ28gb24gdG8gdGhlIG5leHQgb25lLAorCQkgKiBvdGhlcndpc2Ugd2UgbXVzdCBoYXZlIHJ1biBvdXQgb2YgYnVmZmVyIHNwYWNlLCBzbworCQkgKiBsZWF2ZSB0aGUgY29uc3VtZXIgcG9pbnRlciBoZXJlIGZvciB0aGUgbmV4dCByZWFkIGluIGNhc2UKKwkJICogdGhlcmUgYXJlIHN0aWxsIHVucmVhZCBieXRlcyBpbiB0aGlzIGVudHJ5LgorCQkgKi8KKwkJaWYgKChlbnRyeS0+cmluZ19hbGxzYyAmIFJJTkdfQU5ZX1ZBTElEKSA9PSAwKSB7CisJCQljb25zX3B0ciArPSAoaW50KXNpemVvZihzdHJ1Y3QgcmluZ19lbnRyeSk7CisJCQljb25zX3B0ciAmPSBQUk9EX0NPTlNfTUFTSzsKKwkJfQorCX0KKworCS8qIFVwZGF0ZSBjb25zdW1lciBwb2ludGVyIGFuZCByZS1hcm0gcnggdGltZXIgaW50ZXJydXB0ICovCisJd3JpdGVsKGNvbnNfcHRyLCAmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNyY2lyKTsKKwlwb3J0LT5pcF9yeF9jb25zID0gY29uc19wdHI7CisKKwkvKiBJZiB3ZSBoYXZlIG5vdyBkaXBwZWQgYmVsb3cgdGhlIHJ4IGhpZ2ggd2F0ZXIgbWFyayBhbmQgd2UgaGF2ZQorCSAqIHJ4X2hpZ2ggaW50ZXJydXB0IHR1cm5lZCBvZmYsIHdlIGNhbiBub3cgdHVybiBpdCBiYWNrIG9uIGFnYWluLgorCSAqLworCWlmICgocG9ydC0+aXBfZmxhZ3MgJiBJTlBVVF9ISUdIKSAmJiAoKChwcm9kX3B0ciAtIGNvbnNfcHRyKQorCQkJCQkgICAgICAgJiBQUk9EX0NPTlNfTUFTSykgPAorCQkJCQkgICAgICAoKHBvcnQtPgorCQkJCQkJaXBfc3NjciAmCisJCQkJCQlTU0NSX1JYX1RIUkVTSE9MRCkKKwkJCQkJICAgICAgIDw8IFBST0RfQ09OU19QVFJfT0ZGKSkpIHsKKwkJcG9ydC0+aXBfZmxhZ3MgJj0gfklOUFVUX0hJR0g7CisJCWVuYWJsZV9pbnRycyhwb3J0LCBob29rcy0+aW50cl9yeF9oaWdoKTsKKwl9CisJcmV0dXJuIHRvdGFsOworfQorCisvKioKKyAqIHJlY2VpdmVfY2hhcnMgLSB1cHBlciBsZXZlbCByZWFkLgorICogQHRoZV9wb3J0OiBwb3J0IHRvIHJlYWQgZnJvbQorICovCitzdGF0aWMgaW50IHJlY2VpdmVfY2hhcnMoc3RydWN0IHVhcnRfcG9ydCAqdGhlX3BvcnQpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBjaGFyIGNoW01BWF9DSEFSU107CisJaW50IHJlYWRfY291bnQgPSAwLCByZWFkX3Jvb20sIGZsaXAgPSAwOworCXN0cnVjdCB1YXJ0X2luZm8gKmluZm8gPSB0aGVfcG9ydC0+aW5mbzsKKwlzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0ID0gZ2V0X2lvYzNfcG9ydCh0aGVfcG9ydCk7CisJdW5zaWduZWQgbG9uZyBwZmxhZ3M7CisKKwkvKiBNYWtlIHN1cmUgYWxsIHRoZSBwb2ludGVycyBhcmUgImdvb2QiIG9uZXMgKi8KKwlpZiAoIWluZm8pCisJCXJldHVybiAwOworCWlmICghaW5mby0+dHR5KQorCQlyZXR1cm4gMDsKKworCWlmICghKHBvcnQtPmlwX2ZsYWdzICYgSU5QVVRfRU5BQkxFKSkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGhlX3BvcnQtPmxvY2ssIHBmbGFncyk7CisJdHR5ID0gaW5mby0+dHR5OworCisJcmVhZF9jb3VudCA9IGRvX3JlYWQodGhlX3BvcnQsIGNoLCBNQVhfQ0hBUlMpOworCWlmIChyZWFkX2NvdW50ID4gMCkgeworCQlmbGlwID0gMTsKKwkJcmVhZF9yb29tID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCByZWFkX2NvdW50KTsKKwkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGNoLCByZWFkX3Jvb20pOworCQl0aGVfcG9ydC0+aWNvdW50LnJ4ICs9IHJlYWRfY291bnQ7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9wb3J0LT5sb2NrLCBwZmxhZ3MpOworCisJaWYgKGZsaXApCisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisKKwlyZXR1cm4gcmVhZF9jb3VudDsKK30KKworLyoqCisgKiBpb2MzdWFydF9pbnRyX29uZSAtIGxvd2VzdCBsZXZlbCAocGVyIHBvcnQpIGludGVycnVwdCBoYW5kbGVyLgorICogQGlzIDogc3VibW9kdWxlCisgKiBAaWRkOiBkcml2ZXIgZGF0YQorICogQHBlbmRpbmc6IGludGVycnVwdHMgdG8gaGFuZGxlCisgKiBAcmVnczogcHRfcmVncworICovCisKK3N0YXRpYyBpbnQgaW5saW5lCitpb2MzdWFydF9pbnRyX29uZShzdHJ1Y3QgaW9jM19zdWJtb2R1bGUgKmlzLAorCQkJc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZCwKKwkJCXVuc2lnbmVkIGludCBwZW5kaW5nLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgcG9ydF9udW0gPSBHRVRfUE9SVF9GUk9NX1NJT19JUihwZW5kaW5nKTsKKwlzdHJ1Y3QgcG9ydF9ob29rcyAqaG9va3M7CisJdW5zaWduZWQgaW50IHJ4X2hpZ2hfcmRfYWJvcnRlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydDsKKwlzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0OworCWludCBsb29wX2NvdW50ZXI7CisJc3RydWN0IGlvYzNfY2FyZCAqY2FyZF9wdHI7CisJdW5zaWduZWQgaW50IHNpb19pcjsKKworCWNhcmRfcHRyID0gaWRkLT5kYXRhW2lzLT5pZF07CisJcG9ydCA9IGNhcmRfcHRyLT5pY19wb3J0W3BvcnRfbnVtXS5pY3BfcG9ydDsKKwlob29rcyA9IHBvcnQtPmlwX2hvb2tzOworCisJLyogUG9zc2libGUgcmFjZSBjb25kaXRpb24gaGVyZTogVGhlIHR4X210IGludGVycnVwdCBiaXQgbWF5IGJlCisJICogY2xlYXJlZCB3aXRob3V0IHRoZSBpbnRlcnZlbnRpb24gb2YgdGhlIGludGVycnVwdCBoYW5kbGVyLAorCSAqIGUuZy4gYnkgYSB3cml0ZS4gIElmIHRoZSB0b3AgbGV2ZWwgaW50ZXJydXB0IGhhbmRsZXIgcmVhZHMgYQorCSAqIHR4X210LCB0aGVuIHNvbWUgb3RoZXIgcHJvY2Vzc29yIGRvZXMgYSB3cml0ZSwgc3RhcnRpbmcgdXAKKwkgKiBvdXRwdXQsIHRoZW4gd2UgY29tZSBpbiBoZXJlLCBzZWUgdGhlIHR4X210IGFuZCBzdG9wIERNQSwgdGhlCisJICogb3V0cHV0IHN0YXJ0ZWQgYnkgdGhlIG90aGVyIHByb2Nlc3NvciB3aWxsIGhhbmcuICBUaHVzIHdlIGNhbgorCSAqIG9ubHkgcmVseSBvbiB0eF9tdCBiZWluZyBsZWdpdGltYXRlIGlmIGl0IGlzIHJlYWQgd2hpbGUgdGhlCisJICogcG9ydCBsb2NrIGlzIGhlbGQuICBUaGVyZWZvcmUgdGhpcyBiaXQgbXVzdCBiZSBpZ25vcmVkIGluIHRoZQorCSAqIHBhc3NlZCBpbiBpbnRlcnJ1cHQgbWFzayB3aGljaCB3YXMgcmVhZCBieSB0aGUgdG9wIGxldmVsCisJICogaW50ZXJydXB0IGhhbmRsZXIgc2luY2UgdGhlIHBvcnQgbG9jayB3YXMgbm90IGhlbGQgYXQgdGhlIHRpbWUKKwkgKiBpdCB3YXMgcmVhZC4gIFdlIGNhbiBvbmx5IHJlbHkgb24gdGhpcyBiaXQgYmVpbmcgYWNjdXJhdGUgaWYgaXQKKwkgKiBpcyByZWFkIHdoaWxlIHRoZSBwb3J0IGxvY2sgaXMgaGVsZC4gIFNvIHdlJ2xsIGNsZWFyIGl0IGZvciBub3csCisJICogYW5kIHJlbG9hZCBpdCBsYXRlciBvbmNlIHdlIGhhdmUgdGhlIHBvcnQgbG9jay4KKwkgKi8KKworCXNpb19pciA9IHBlbmRpbmcgJiB+KGhvb2tzLT5pbnRyX3R4X210KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+aXBfbG9jaywgZmxhZ3MpOworCisJbG9vcF9jb3VudGVyID0gTUFYSVRFUjsJLyogdG8gYXZvaWQgaGFuZ3MgKi8KKworCWRvIHsKKwkJdWludDMyX3Qgc2hhZG93OworCisJCWlmIChsb29wX2NvdW50ZXItLSA8PSAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJJT0MzIHNlcmlhbDogIgorCQkJICAgICAgICJwb3NzaWJsZSBoYW5nIGNvbmRpdGlvbi8iCisJCQkgICAgICAgInBvcnQgc3R1Y2sgb24gaW50ZXJydXB0IChsaW5lICVkKS5cbiIsCisJCQkJKChzdHJ1Y3QgdWFydF9wb3J0ICopcG9ydC0+aXBfcG9ydCktPmxpbmUpOworCQkJYnJlYWs7CisJCX0KKwkJLyogSGFuZGxlIGEgRENEIGNoYW5nZSAqLworCQlpZiAoc2lvX2lyICYgaG9va3MtPmludHJfZGVsdGFfZGNkKSB7CisJCQlpb2MzX2FjayhpcywgaWRkLCBob29rcy0+aW50cl9kZWx0YV9kY2QpOworCQkJc2hhZG93ID0gcmVhZGwoJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zaGFkb3cpOworCisJCQlpZiAoKHBvcnQtPmlwX25vdGlmeSAmIE5fRERDRCkKKwkJCSAgICAmJiAoc2hhZG93ICYgU0hBRE9XX0RDRCkKKwkJCSAgICAmJiAocG9ydC0+aXBfcG9ydCkpIHsKKwkJCQl0aGVfcG9ydCA9IHBvcnQtPmlwX3BvcnQ7CisJCQkJdWFydF9oYW5kbGVfZGNkX2NoYW5nZSh0aGVfcG9ydCwKKwkJCQkJCXNoYWRvdyAmIFNIQURPV19EQ0QpOworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZQorCQkJCSAgICAoJnRoZV9wb3J0LT5pbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisJCQl9IGVsc2UgaWYgKChwb3J0LT5pcF9ub3RpZnkgJiBOX0REQ0QpCisJCQkJICAgJiYgIShzaGFkb3cgJiBTSEFET1dfRENEKSkgeworCQkJCS8qIEZsYWcgZGVsdGEgRENEL25vIERDRCAqLworCQkJCXVhcnRfaGFuZGxlX2RjZF9jaGFuZ2UocG9ydC0+aXBfcG9ydCwKKwkJCQkJCXNoYWRvdyAmIFNIQURPV19EQ0QpOworCQkJCXBvcnQtPmlwX2ZsYWdzIHw9IERDRF9PTjsKKwkJCX0KKwkJfQorCisJCS8qIEhhbmRsZSBhIENUUyBjaGFuZ2UgKi8KKwkJaWYgKHNpb19pciAmIGhvb2tzLT5pbnRyX2RlbHRhX2N0cykgeworCQkJaW9jM19hY2soaXMsIGlkZCwgaG9va3MtPmludHJfZGVsdGFfY3RzKTsKKwkJCXNoYWRvdyA9IHJlYWRsKCZwb3J0LT5pcF9zZXJpYWxfcmVncy0+c2hhZG93KTsKKworCQkJaWYgKChwb3J0LT5pcF9ub3RpZnkgJiBOX0RDVFMpICYmIChwb3J0LT5pcF9wb3J0KSkgeworCQkJCXRoZV9wb3J0ID0gcG9ydC0+aXBfcG9ydDsKKwkJCQl1YXJ0X2hhbmRsZV9jdHNfY2hhbmdlKHRoZV9wb3J0LCBzaGFkb3cKKwkJCQkJCSYgU0hBRE9XX0NUUyk7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlCisJCQkJICAgICgmdGhlX3BvcnQtPmluZm8tPmRlbHRhX21zcl93YWl0KTsKKwkJCX0KKwkJfQorCisJCS8qIHJ4IHRpbWVvdXQgaW50ZXJydXB0LiAgTXVzdCBiZSBzb21lIGRhdGEgYXZhaWxhYmxlLiAgUHV0IHRoaXMKKwkJICogYmVmb3JlIHRoZSBjaGVjayBmb3IgcnhfaGlnaCBzaW5jZSBzZXJ2aWNpbmcgdGhpcyBjb25kaXRpb24KKwkJICogbWF5IGNhdXNlIHRoYXQgY29uZGl0aW9uIHRvIGNsZWFyLgorCQkgKi8KKwkJaWYgKHNpb19pciAmIGhvb2tzLT5pbnRyX3J4X3RpbWVyKSB7CisJCQlpb2MzX2FjayhpcywgaWRkLCBob29rcy0+aW50cl9yeF90aW1lcik7CisJCQlpZiAoKHBvcnQtPmlwX25vdGlmeSAmIE5fREFUQV9SRUFEWSkKKwkJCQkJCSYmIChwb3J0LT5pcF9wb3J0KSkgeworCQkJCXJlY2VpdmVfY2hhcnMocG9ydC0+aXBfcG9ydCk7CisJCQl9CisJCX0KKworCQkvKiByeCBoaWdoIGludGVycnVwdC4gTXVzdCBiZSBhZnRlciByeF90aW1lci4gICovCisJCWVsc2UgaWYgKHNpb19pciAmIGhvb2tzLT5pbnRyX3J4X2hpZ2gpIHsKKwkJCS8qIERhdGEgYXZhaWxhYmxlLCBub3RpZnkgdXBwZXIgbGF5ZXIgKi8KKwkJCWlmICgocG9ydC0+aXBfbm90aWZ5ICYgTl9EQVRBX1JFQURZKSAmJiBwb3J0LT5pcF9wb3J0KSB7CisJCQkJcmVjZWl2ZV9jaGFycyhwb3J0LT5pcF9wb3J0KTsKKwkJCX0KKworCQkJLyogV2UgY2FuJ3QgQUNLIHRoaXMgaW50ZXJydXB0LiAgSWYgcmVjZWl2ZV9jaGFycyBkaWRuJ3QKKwkJCSAqIGNhdXNlIHRoZSBjb25kaXRpb24gdG8gY2xlYXIsIHdlJ2xsIGhhdmUgdG8gZGlzYWJsZQorCQkJICogdGhlIGludGVycnVwdCB1bnRpbCB0aGUgZGF0YSBpcyBkcmFpbmVkLgorCQkJICogSWYgdGhlIHJlYWQgd2FzIGFib3J0ZWQsIGRvbid0IGRpc2FibGUgdGhlIGludGVycnVwdAorCQkJICogYXMgdGhpcyBtYXkgY2F1c2UgdXMgdG8gaGFuZyBpbmRlZmluaXRlbHkuICBBbgorCQkJICogYWJvcnRlZCByZWFkIGdlbmVyYWxseSBtZWFucyB0aGF0IHRoaXMgaW50ZXJydXB0CisJCQkgKiBoYXNuJ3QgYmVlbiBkZWxpdmVyZWQgdG8gdGhlIGNwdSB5ZXQgYW55d2F5LCBldmVuCisJCQkgKiB0aG91Z2ggd2Ugc2VlIGl0IGFzIGFzc2VydGVkIHdoZW4gd2UgcmVhZCB0aGUgc2lvX2lyLgorCQkJICovCisJCQlpZiAoKHNpb19pciA9IFBFTkRJTkcoY2FyZF9wdHIsIGlkZCkpCisJCQkJCSYgaG9va3MtPmludHJfcnhfaGlnaCkgeworCQkJCWlmIChwb3J0LT5pcF9mbGFncyAmIFJFQURfQUJPUlRFRCkgeworCQkJCQlyeF9oaWdoX3JkX2Fib3J0ZWQrKzsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWNhcmRfcHRyLT5pY19lbmFibGUgJj0gfmhvb2tzLT5pbnRyX3J4X2hpZ2g7CisJCQkJCXBvcnQtPmlwX2ZsYWdzIHw9IElOUFVUX0hJR0g7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyogV2UgZ290IGEgbG93IHdhdGVyIGludGVycnVwdDogbm90aWZ5IHVwcGVyIGxheWVyIHRvCisJCSAqIHNlbmQgbW9yZSBkYXRhLiAgTXVzdCBjb21lIGJlZm9yZSB0eF9tdCBzaW5jZSBzZXJ2aWNpbmcKKwkJICogdGhpcyBjb25kaXRpb24gbWF5IGNhdXNlIHRoYXQgY29uZGl0aW9uIHRvIGNsZWFyLgorCQkgKi8KKwkJaWYgKHNpb19pciAmIGhvb2tzLT5pbnRyX3R4X2V4cGxpY2l0KSB7CisJCQlwb3J0LT5pcF9mbGFncyAmPSB+TE9XQVRfV1JJVFRFTjsKKwkJCWlvYzNfYWNrKGlzLCBpZGQsIGhvb2tzLT5pbnRyX3R4X2V4cGxpY2l0KTsKKwkJCWlmIChwb3J0LT5pcF9ub3RpZnkgJiBOX09VVFBVVF9MT1dBVCkKKwkJCQlpb2MzX2NiX291dHB1dF9sb3dhdChwb3J0KTsKKwkJfQorCisJCS8qIEhhbmRsZSB0eF9tdC4gIE11c3QgY29tZSBhZnRlciB0eF9leHBsaWNpdC4gICovCisJCWVsc2UgaWYgKHNpb19pciAmIGhvb2tzLT5pbnRyX3R4X210KSB7CisJCQkvKiBJZiB3ZSBhcmUgZXhwZWN0aW5nIGEgbG93YXQgbm90aWZpY2F0aW9uCisJCQkgKiBhbmQgd2UgZ2V0IHRvIHRoaXMgcG9pbnQgaXQgcHJvYmFibHkgbWVhbnMgdGhhdCBmb3IKKwkJCSAqIHNvbWUgcmVhc29uIHRoZSB0eF9leHBsaWNpdCBkaWRuJ3Qgd29yayBhcyBleHBlY3RlZAorCQkJICogKHRoYXQgY2FuIGxlZ2l0aW1hdGVseSBoYXBwZW4gaWYgdGhlIG91dHB1dCBidWZmZXIgaXMKKwkJCSAqIGZpbGxlZCB1cCBpbiBqdXN0IHRoZSByaWdodCB3YXkpLgorCQkJICogU28gc2VuZCB0aGUgbm90aWZpY2F0aW9uIG5vdy4KKwkJCSAqLworCQkJaWYgKHBvcnQtPmlwX25vdGlmeSAmIE5fT1VUUFVUX0xPV0FUKSB7CisJCQkJaW9jM19jYl9vdXRwdXRfbG93YXQocG9ydCk7CisKKwkJCQkvKiBXZSBuZWVkIHRvIHJlbG9hZCB0aGUgc2lvX2lyIHNpbmNlIHRoZSBsb3dhdAorCQkJCSAqIGNhbGwgbWF5IGhhdmUgY2F1c2VkIGFub3RoZXIgd3JpdGUgdG8gb2NjdXIsCisJCQkJICogY2xlYXJpbmcgdGhlIHR4X210IGNvbmRpdGlvbi4KKwkJCQkgKi8KKwkJCQlzaW9faXIgPSBQRU5ESU5HKGNhcmRfcHRyLCBpZGQpOworCQkJfQorCisJCQkvKiBJZiB0aGUgdHhfbXQgY29uZGl0aW9uIHN0aWxsIHBlcnNpc3RzIGV2ZW4gYWZ0ZXIgdGhlCisJCQkgKiBsb3dhdCBjYWxsLCB3ZSd2ZSBnb3Qgc29tZSB3b3JrIHRvIGRvLgorCQkJICovCisJCQlpZiAoc2lvX2lyICYgaG9va3MtPmludHJfdHhfbXQpIHsKKwkJCQkvKiBJZiB3ZSBhcmUgbm90IGN1cnJlbnRseSBleHBlY3RpbmcgRE1BIGlucHV0LAorCQkJCSAqIGFuZCB0aGUgdHJhbnNtaXR0ZXIgaGFzIGp1c3QgZ29uZSBpZGxlLAorCQkJCSAqIHRoZXJlIGlzIG5vIGxvbmdlciBhbnkgcmVhc29uIGZvciBETUEsIHNvCisJCQkJICogZGlzYWJsZSBpdC4KKwkJCQkgKi8KKwkJCQlpZiAoIShwb3J0LT5pcF9ub3RpZnkKKwkJCQkgICAgICAmIChOX0RBVEFfUkVBRFkgfCBOX0REQ0QpKSkgeworCQkJCQlCVUdfT04oIShwb3J0LT5pcF9zc2NyCisJCQkJCQkgJiBTU0NSX0RNQV9FTikpOworCQkJCQlwb3J0LT5pcF9zc2NyICY9IH5TU0NSX0RNQV9FTjsKKwkJCQkJd3JpdGVsKHBvcnQtPmlwX3NzY3IsCisJCQkJCSAgICAgICAmcG9ydC0+aXBfc2VyaWFsX3JlZ3MtPnNzY3IpOworCQkJCX0KKwkJCQkvKiBQcmV2ZW50IGluZmluaXRlIHR4X210IGludGVycnVwdCAqLworCQkJCWNhcmRfcHRyLT5pY19lbmFibGUgJj0gfmhvb2tzLT5pbnRyX3R4X210OworCQkJfQorCQl9CisJCXNpb19pciA9IFBFTkRJTkcoY2FyZF9wdHIsIGlkZCk7CisKKwkJLyogaWYgdGhlIHJlYWQgd2FzIGFib3J0ZWQgYW5kIG9ubHkgaG9va3MtPmludHJfcnhfaGlnaCwKKwkJICogY2xlYXIgaG9va3MtPmludHJfcnhfaGlnaCwgc28gd2UgZG8gbm90IGxvb3AgZm9yZXZlci4KKwkJICovCisKKwkJaWYgKHJ4X2hpZ2hfcmRfYWJvcnRlZCAmJiAoc2lvX2lyID09IGhvb2tzLT5pbnRyX3J4X2hpZ2gpKSB7CisJCQlzaW9faXIgJj0gfmhvb2tzLT5pbnRyX3J4X2hpZ2g7CisJCX0KKwl9IHdoaWxlIChzaW9faXIgJiBob29rcy0+aW50cl9hbGwpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+aXBfbG9jaywgZmxhZ3MpOworCWlvYzNfZW5hYmxlKGlzLCBpZGQsIGNhcmRfcHRyLT5pY19lbmFibGUpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGlvYzN1YXJ0X2ludHIgLSBmaWVsZCBhbGwgc2VyaWFsIGludGVycnVwdHMKKyAqIEBpcyA6IHN1Ym1vZHVsZQorICogQGlkZDogZHJpdmVyIGRhdGEKKyAqIEBwZW5kaW5nOiBpbnRlcnJ1cHRzIHRvIGhhbmRsZQorICogQHJlZ3M6IHB0X3JlZ3MKKyAqCisgKi8KKworc3RhdGljIGludCBpb2MzdWFydF9pbnRyKHN0cnVjdCBpb2MzX3N1Ym1vZHVsZSAqaXMsCisJCQlzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkLAorCQkJdW5zaWduZWQgaW50IHBlbmRpbmcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCByZXQgPSAwOworCisJLyoKKwkgKiBUaGUgdXBwZXIgbGV2ZWwgaW50ZXJydXB0IGhhbmRsZXIgc2VuZHMgaW50ZXJydXB0cyBmb3IgYm90aCBwb3J0cworCSAqIGhlcmUuIFNvIHdlIG5lZWQgdG8gY2FsbCBmb3IgZWFjaCBwb3J0IHdpdGggaXRzIGludGVycnVwdHMuCisJICovCisKKwlpZiAocGVuZGluZyAmIFNJT19JUl9TQSkKKwkJcmV0IHw9IGlvYzN1YXJ0X2ludHJfb25lKGlzLCBpZGQsIHBlbmRpbmcgJiBTSU9fSVJfU0EsIHJlZ3MpOworCWlmIChwZW5kaW5nICYgU0lPX0lSX1NCKQorCQlyZXQgfD0gaW9jM3VhcnRfaW50cl9vbmUoaXMsIGlkZCwgcGVuZGluZyAmIFNJT19JUl9TQiwgcmVncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGljM190eXBlCisgKiBAcG9ydDogUG9ydCB0byBvcGVyYXRlIHdpdGggKHdlIGlnbm9yZSBzaW5jZSB3ZSBvbmx5IGhhdmUgb25lIHBvcnQpCisgKgorICovCitzdGF0aWMgY29uc3QgY2hhciAqaWMzX3R5cGUoc3RydWN0IHVhcnRfcG9ydCAqdGhlX3BvcnQpCit7CisJaWYgKElTX1JTMjMyKHRoZV9wb3J0LT5saW5lKSkKKwkJcmV0dXJuICJTR0kgSU9DMyBTZXJpYWwgW3JzMjMyXSI7CisJZWxzZQorCQlyZXR1cm4gIlNHSSBJT0MzIFNlcmlhbCBbcnM0MjJdIjsKK30KKworLyoqCisgKiBpYzNfdHhfZW1wdHkgLSBJcyB0aGUgdHJhbnNtaXR0ZXIgZW1wdHk/CisgKiBAcG9ydDogUG9ydCB0byBvcGVyYXRlIG9uCisgKgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGljM190eF9lbXB0eShzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydCkKK3sKKwl1bnNpZ25lZCBpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0ID0gZ2V0X2lvYzNfcG9ydCh0aGVfcG9ydCk7CisKKwlpZiAocmVhZGwoJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zaGFkb3cpICYgU0hBRE9XX1RFTVQpCisJCXJldCA9IFRJT0NTRVJfVEVNVDsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGljM19zdG9wX3R4IC0gc3RvcCB0aGUgdHJhbnNtaXR0ZXIKKyAqIEBwb3J0OiBQb3J0IHRvIG9wZXJhdGUgb24KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGljM19zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnRoZV9wb3J0KQoreworCXN0cnVjdCBpb2MzX3BvcnQgKnBvcnQgPSBnZXRfaW9jM19wb3J0KHRoZV9wb3J0KTsKKworCWlmIChwb3J0KQorCQlzZXRfbm90aWZpY2F0aW9uKHBvcnQsIE5fT1VUUFVUX0xPV0FULCAwKTsKK30KKworLyoqCisgKiBpYzNfc3RvcF9yeCAtIHN0b3AgdGhlIHJlY2VpdmVyCisgKiBAcG9ydDogUG9ydCB0byBvcGVyYXRlIG9uCisgKgorICovCitzdGF0aWMgdm9pZCBpYzNfc3RvcF9yeChzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydCkKK3sKKwlzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0ID0gZ2V0X2lvYzNfcG9ydCh0aGVfcG9ydCk7CisKKwlpZiAocG9ydCkKKwkJcG9ydC0+aXBfZmxhZ3MgJj0gfklOUFVUX0VOQUJMRTsKK30KKworLyoqCisgKiBudWxsX3ZvaWRfZnVuY3Rpb24KKyAqIEBwb3J0OiBQb3J0IHRvIG9wZXJhdGUgb24KKyAqCisgKi8KK3N0YXRpYyB2b2lkIG51bGxfdm9pZF9mdW5jdGlvbihzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydCkKK3sKK30KKworLyoqCisgKiBpYzNfc2h1dGRvd24gLSBzaHV0IGRvd24gdGhlIHBvcnQgLSBmcmVlIGlycSBhbmQgZGlzYWJsZQorICogQHBvcnQ6IHBvcnQgdG8gc2h1dCBkb3duCisgKgorICovCitzdGF0aWMgdm9pZCBpYzNfc2h1dGRvd24oc3RydWN0IHVhcnRfcG9ydCAqdGhlX3BvcnQpCit7CisJdW5zaWduZWQgbG9uZyBwb3J0X2ZsYWdzOworCXN0cnVjdCBpb2MzX3BvcnQgKnBvcnQ7CisJc3RydWN0IHVhcnRfaW5mbyAqaW5mbzsKKworCXBvcnQgPSBnZXRfaW9jM19wb3J0KHRoZV9wb3J0KTsKKwlpZiAoIXBvcnQpCisJCXJldHVybjsKKworCWluZm8gPSB0aGVfcG9ydC0+aW5mbzsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGVfcG9ydC0+bG9jaywgcG9ydF9mbGFncyk7CisJc2V0X25vdGlmaWNhdGlvbihwb3J0LCBOX0FMTCwgMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhlX3BvcnQtPmxvY2ssIHBvcnRfZmxhZ3MpOworfQorCisvKioKKyAqIGljM19zZXRfbWN0cmwgLSBzZXQgY29udHJvbCBsaW5lcyAoZHRyLCBydHMsIGV0YykKKyAqIEBwb3J0OiBQb3J0IHRvIG9wZXJhdGUgb24KKyAqIEBtY3RybDogTGluZXMgdG8gc2V0L3Vuc2V0CisgKgorICovCitzdGF0aWMgdm9pZCBpYzNfc2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnRoZV9wb3J0LCB1bnNpZ25lZCBpbnQgbWN0cmwpCit7CisJdW5zaWduZWQgY2hhciBtY3IgPSAwOworCisJaWYgKG1jdHJsICYgVElPQ01fUlRTKQorCQltY3IgfD0gVUFSVF9NQ1JfUlRTOworCWlmIChtY3RybCAmIFRJT0NNX0RUUikKKwkJbWNyIHw9IFVBUlRfTUNSX0RUUjsKKwlpZiAobWN0cmwgJiBUSU9DTV9PVVQxKQorCQltY3IgfD0gVUFSVF9NQ1JfT1VUMTsKKwlpZiAobWN0cmwgJiBUSU9DTV9PVVQyKQorCQltY3IgfD0gVUFSVF9NQ1JfT1VUMjsKKwlpZiAobWN0cmwgJiBUSU9DTV9MT09QKQorCQltY3IgfD0gVUFSVF9NQ1JfTE9PUDsKKworCXNldF9tY3IodGhlX3BvcnQsIG1jciwgU0hBRE9XX0RUUik7Cit9CisKKy8qKgorICogaWMzX2dldF9tY3RybCAtIGdldCBjb250cm9sIGxpbmUgaW5mbworICogQHBvcnQ6IHBvcnQgdG8gb3BlcmF0ZSBvbgorICoKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBpYzNfZ2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnRoZV9wb3J0KQoreworCXN0cnVjdCBpb2MzX3BvcnQgKnBvcnQgPSBnZXRfaW9jM19wb3J0KHRoZV9wb3J0KTsKKwl1aW50MzJfdCBzaGFkb3c7CisJdW5zaWduZWQgaW50IHJldCA9IDA7CisKKwlpZiAoIXBvcnQpCisJCXJldHVybiAwOworCisJc2hhZG93ID0gcmVhZGwoJnBvcnQtPmlwX3NlcmlhbF9yZWdzLT5zaGFkb3cpOworCWlmIChzaGFkb3cgJiBTSEFET1dfRENEKQorCQlyZXQgfD0gVElPQ01fQ0Q7CisJaWYgKHNoYWRvdyAmIFNIQURPV19EUikKKwkJcmV0IHw9IFRJT0NNX0RTUjsKKwlpZiAoc2hhZG93ICYgU0hBRE9XX0NUUykKKwkJcmV0IHw9IFRJT0NNX0NUUzsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGljM19zdGFydF90eCAtIFN0YXJ0IHRyYW5zbWl0dGVyLiBDYWxsZWQgd2l0aCB0aGVfcG9ydC0+bG9jaworICogQHBvcnQ6IFBvcnQgdG8gb3BlcmF0ZSBvbgorICoKKyAqLworc3RhdGljIHZvaWQgaWMzX3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnRoZV9wb3J0KQoreworCXN0cnVjdCBpb2MzX3BvcnQgKnBvcnQgPSBnZXRfaW9jM19wb3J0KHRoZV9wb3J0KTsKKworCWlmIChwb3J0KSB7CisJCXNldF9ub3RpZmljYXRpb24ocG9ydCwgTl9PVVRQVVRfTE9XQVQsIDEpOworCQllbmFibGVfaW50cnMocG9ydCwgcG9ydC0+aXBfaG9va3MtPmludHJfdHhfbXQpOworCX0KK30KKworLyoqCisgKiBpYzNfYnJlYWtfY3RsIC0gaGFuZGxlIGJyZWFrcworICogQHBvcnQ6IFBvcnQgdG8gb3BlcmF0ZSBvbgorICogQGJyZWFrX3N0YXRlOiBCcmVhayBzdGF0ZQorICoKKyAqLworc3RhdGljIHZvaWQgaWMzX2JyZWFrX2N0bChzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydCwgaW50IGJyZWFrX3N0YXRlKQoreworfQorCisvKioKKyAqIGljM19zdGFydHVwIC0gU3RhcnQgdXAgdGhlIHNlcmlhbCBwb3J0IC0gYWx3YXlzIHJldHVybiAwIChXZSdyZSBhbHdheXMgb24pCisgKiBAcG9ydDogUG9ydCB0byBvcGVyYXRlIG9uCisgKgorICovCitzdGF0aWMgaW50IGljM19zdGFydHVwKHN0cnVjdCB1YXJ0X3BvcnQgKnRoZV9wb3J0KQoreworCWludCByZXR2YWw7CisJc3RydWN0IGlvYzNfcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgaW9jM19jYXJkICpjYXJkX3B0cjsKKwl1bnNpZ25lZCBsb25nIHBvcnRfZmxhZ3M7CisKKwlpZiAoIXRoZV9wb3J0KSB7CisJCU5PVF9QUk9HUkVTUygpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcG9ydCA9IGdldF9pb2MzX3BvcnQodGhlX3BvcnQpOworCWlmICghcG9ydCkgeworCQlOT1RfUFJPR1JFU1MoKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWNhcmRfcHRyID0gcG9ydC0+aXBfY2FyZDsKKwlwb3J0LT5pcF9wb3J0ID0gdGhlX3BvcnQ7CisKKwlpZiAoIWNhcmRfcHRyKSB7CisJCU5PVF9QUk9HUkVTUygpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBTdGFydCB1cCB0aGUgc2VyaWFsIHBvcnQgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGhlX3BvcnQtPmxvY2ssIHBvcnRfZmxhZ3MpOworCXJldHZhbCA9IGljM19zdGFydHVwX2xvY2FsKHRoZV9wb3J0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGVfcG9ydC0+bG9jaywgcG9ydF9mbGFncyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBpYzNfc2V0X3Rlcm1pb3MgLSBzZXQgdGVybWlvcyBzdHVmZgorICogQHBvcnQ6IHBvcnQgdG8gb3BlcmF0ZSBvbgorICogQHRlcm1pb3M6IE5ldyBzZXR0aW5ncworICogQHRlcm1pb3M6IE9sZAorICoKKyAqLworc3RhdGljIHZvaWQKK2ljM19zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydCwKKwkJc3RydWN0IHRlcm1pb3MgKnRlcm1pb3MsIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwl1bnNpZ25lZCBsb25nIHBvcnRfZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGhlX3BvcnQtPmxvY2ssIHBvcnRfZmxhZ3MpOworCWlvYzNfY2hhbmdlX3NwZWVkKHRoZV9wb3J0LCB0ZXJtaW9zLCBvbGRfdGVybWlvcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhlX3BvcnQtPmxvY2ssIHBvcnRfZmxhZ3MpOworfQorCisvKioKKyAqIGljM19yZXF1ZXN0X3BvcnQgLSBhbGxvY2F0ZSByZXNvdXJjZXMgZm9yIHBvcnQgLSBubyBvcC4uLi4KKyAqIEBwb3J0OiBwb3J0IHRvIG9wZXJhdGUgb24KKyAqCisgKi8KK3N0YXRpYyBpbnQgaWMzX3JlcXVlc3RfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXJldHVybiAwOworfQorCisvKiBBc3NvY2lhdGUgdGhlIHVhcnQgZnVuY3Rpb25zIGFib3ZlIC0gZ2l2ZW4gdG8gc2VyaWFsIGNvcmUgKi8KK3N0YXRpYyBzdHJ1Y3QgdWFydF9vcHMgaW9jM19vcHMgPSB7CisJLnR4X2VtcHR5ID0gaWMzX3R4X2VtcHR5LAorCS5zZXRfbWN0cmwgPSBpYzNfc2V0X21jdHJsLAorCS5nZXRfbWN0cmwgPSBpYzNfZ2V0X21jdHJsLAorCS5zdG9wX3R4ID0gaWMzX3N0b3BfdHgsCisJLnN0YXJ0X3R4ID0gaWMzX3N0YXJ0X3R4LAorCS5zdG9wX3J4ID0gaWMzX3N0b3BfcngsCisJLmVuYWJsZV9tcyA9IG51bGxfdm9pZF9mdW5jdGlvbiwKKwkuYnJlYWtfY3RsID0gaWMzX2JyZWFrX2N0bCwKKwkuc3RhcnR1cCA9IGljM19zdGFydHVwLAorCS5zaHV0ZG93biA9IGljM19zaHV0ZG93biwKKwkuc2V0X3Rlcm1pb3MgPSBpYzNfc2V0X3Rlcm1pb3MsCisJLnR5cGUgPSBpYzNfdHlwZSwKKwkucmVsZWFzZV9wb3J0ID0gbnVsbF92b2lkX2Z1bmN0aW9uLAorCS5yZXF1ZXN0X3BvcnQgPSBpYzNfcmVxdWVzdF9wb3J0LAorfTsKKworLyoKKyAqIEJvb3QtdGltZSBpbml0aWFsaXphdGlvbiBjb2RlCisgKi8KKworc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBpb2MzX3VhcnQgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmRyaXZlcl9uYW1lID0gImlvYzNfc2VyaWFsIiwKKwkuZGV2X25hbWUgPSBERVZJQ0VfTkFNRSwKKwkubWFqb3IgPSBERVZJQ0VfTUFKT1IsCisJLm1pbm9yID0gREVWSUNFX01JTk9SLAorCS5uciA9IE1BWF9MT0dJQ0FMX1BPUlRTCit9OworCisvKioKKyAqIGlvYzNfc2VyaWFsX2NvcmVfYXR0YWNoIC0gcmVnaXN0ZXIgd2l0aCBzZXJpYWwgY29yZQorICoJCVRoaXMgaXMgZG9uZSBkdXJpbmcgcGNpIHByb2JpbmcKKyAqIEBpczogc3VibW9kdWxlIHN0cnVjdCBmb3IgdGhpcworICogQGlkZDogaGFuZGxlIGZvciB0aGlzIGNhcmQKKyAqLworc3RhdGljIGlubGluZSBpbnQgaW9jM19zZXJpYWxfY29yZV9hdHRhY2goIHN0cnVjdCBpb2MzX3N1Ym1vZHVsZSAqaXMsCisJCQkJc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZCkKK3sKKwlzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0OworCXN0cnVjdCB1YXJ0X3BvcnQgKnRoZV9wb3J0OworCXN0cnVjdCBpb2MzX2NhcmQgKmNhcmRfcHRyID0gaWRkLT5kYXRhW2lzLT5pZF07CisJaW50IGlpLCBwaHlzX3BvcnQ7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBpZGQtPnBkZXY7CisKKwlEUFJJTlRfQ09ORklHKCgiJXM6IGF0dGFjaCBwZGV2IDB4JXAgLSBjYXJkX3B0ciAweCVwXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBwZGV2LCAodm9pZCAqKWNhcmRfcHRyKSk7CisKKwlpZiAoIWNhcmRfcHRyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIG9uY2UgYXJvdW5kIGZvciBlYWNoIGxvZ2ljYWwgcG9ydCBvbiB0aGlzIGNhcmQgKi8KKwlmb3IgKGlpID0gMDsgaWkgPCBMT0dJQ0FMX1BPUlRTX1BFUl9DQVJEOyBpaSsrKSB7CisJCXBoeXNfcG9ydCA9IEdFVF9QSFlTSUNBTF9QT1JUKGlpKTsKKwkJdGhlX3BvcnQgPSAmY2FyZF9wdHItPmljX3BvcnRbcGh5c19wb3J0XS4KKwkJCQlpY3BfdWFydF9wb3J0W0dFVF9MT0dJQ0FMX1BPUlQoaWkpXTsKKwkJcG9ydCA9IGNhcmRfcHRyLT5pY19wb3J0W3BoeXNfcG9ydF0uaWNwX3BvcnQ7CisJCXBvcnQtPmlwX3BvcnQgPSB0aGVfcG9ydDsKKworCQlEUFJJTlRfQ09ORklHKCgiJXM6IGF0dGFjaCB0aGVfcG9ydCAweCVwIC8gcG9ydCAweCVwIFslZC8lZF1cbiIsCisJCQlfX0ZVTkNUSU9OX18sICh2b2lkICopdGhlX3BvcnQsICh2b2lkICopcG9ydCwKKwkJCQlwaHlzX3BvcnQsIGlpKSk7CisKKwkJLyogbWVtYmFzZSwgaW9iYXNlIGFuZCBtYXBiYXNlIGp1c3QgbmVlZCB0byBiZSBub24tMCAqLworCQl0aGVfcG9ydC0+bWVtYmFzZSA9ICh1bnNpZ25lZCBjaGFyIF9faW9tZW0gKikxOworCQl0aGVfcG9ydC0+aW9iYXNlID0gKHBkZXYtPmJ1cy0+bnVtYmVyIDw8IDE2KSB8ICBpaTsKKwkJdGhlX3BvcnQtPmxpbmUgPSAoTnVtX29mX2lvYzNfY2FyZHMgPDwgMikgfCBpaTsKKwkJdGhlX3BvcnQtPm1hcGJhc2UgPSAxOworCQl0aGVfcG9ydC0+dHlwZSA9IFBPUlRfMTY1NTBBOworCQl0aGVfcG9ydC0+Zmlmb3NpemUgPSBGSUZPX1NJWkU7CisJCXRoZV9wb3J0LT5vcHMgPSAmaW9jM19vcHM7CisJCXRoZV9wb3J0LT5pcnEgPSBpZGQtPmlycV9pbzsKKwkJdGhlX3BvcnQtPmRldiA9ICZwZGV2LT5kZXY7CisKKwkJaWYgKHVhcnRfYWRkX29uZV9wb3J0KCZpb2MzX3VhcnQsIHRoZV9wb3J0KSA8IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICAgICIlczogdW5hYmxlIHRvIGFkZCBwb3J0ICVkIGJ1cyAlZFxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIHRoZV9wb3J0LT5saW5lLCBwZGV2LT5idXMtPm51bWJlcik7CisJCX0gZWxzZSB7CisJCQlEUFJJTlRfQ09ORklHKCgiSU9DMyBzZXJpYWwgcG9ydCAlZCBpcnEgJWQgYnVzICVkXG4iLAorCQkgICAgICAgICAgdGhlX3BvcnQtPmxpbmUsIHRoZV9wb3J0LT5pcnEsIHBkZXYtPmJ1cy0+bnVtYmVyKSk7CisJCX0KKworCQkvKiBhbGwgcG9ydHMgYXJlIHJzMjMyIGZvciBub3cgKi8KKwkJaWYgKElTX1BIWVNJQ0FMX1BPUlQoaWkpKQorCQkJaW9jM19zZXRfcHJvdG8ocG9ydCwgUFJPVE9fUlMyMzIpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpb2MzdWFydF9yZW1vdmUgLSByZWdpc3RlciBkZXRhY2ggZnVuY3Rpb24KKyAqIEBpczogc3VibW9kdWxlIHN0cnVjdCBmb3IgdGhpcyBzdWJtb2R1bGUKKyAqIEBpZGQ6IGlvYzMgZHJpdmVyIGRhdGEgZm9yIHRoaXMgc3VibW9kdWxlCisgKi8KKworc3RhdGljIGludCBpb2MzdWFydF9yZW1vdmUoc3RydWN0IGlvYzNfc3VibW9kdWxlICppcywKKwkJCXN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQpCit7CisJc3RydWN0IGlvYzNfY2FyZCAqY2FyZF9wdHIgPSBpZGQtPmRhdGFbaXMtPmlkXTsKKwlzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydDsKKwlzdHJ1Y3QgaW9jM19wb3J0ICpwb3J0OworCWludCBpaTsKKworCWlmIChjYXJkX3B0cikgeworCQlmb3IgKGlpID0gMDsgaWkgPCBMT0dJQ0FMX1BPUlRTX1BFUl9DQVJEOyBpaSsrKSB7CisJCQl0aGVfcG9ydCA9ICZjYXJkX3B0ci0+aWNfcG9ydFtHRVRfUEhZU0lDQUxfUE9SVChpaSldLgorCQkJCQlpY3BfdWFydF9wb3J0W0dFVF9MT0dJQ0FMX1BPUlQoaWkpXTsKKwkJCWlmICh0aGVfcG9ydCkKKwkJCQl1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmaW9jM191YXJ0LCB0aGVfcG9ydCk7CisJCQlwb3J0ID0gY2FyZF9wdHItPmljX3BvcnRbR0VUX1BIWVNJQ0FMX1BPUlQoaWkpXS5pY3BfcG9ydDsKKwkJCWlmIChwb3J0ICYmIElTX1BIWVNJQ0FMX1BPUlQoaWkpCisJCQkJCSYmIChHRVRfUEhZU0lDQUxfUE9SVChpaSkgPT0gMCkpIHsKKwkJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBvcnQtPmlwX2lkZC0+cGRldiwKKwkJCQkJVE9UQUxfUklOR19CVUZfU0laRSwKKwkJCQkJKHZvaWQgKilwb3J0LT5pcF9jcHVfcmluZ2J1ZiwKKwkJCQkJcG9ydC0+aXBfZG1hX3JpbmdidWYpOworCQkJCWtmcmVlKHBvcnQpOworCQkJCWNhcmRfcHRyLT5pY19wb3J0W0dFVF9QSFlTSUNBTF9QT1JUKGlpKV0uCisJCQkJCQkJaWNwX3BvcnQgPSBOVUxMOworCQkJfQorCQl9CisJCWtmcmVlKGNhcmRfcHRyKTsKKwkJaWRkLT5kYXRhW2lzLT5pZF0gPSBOVUxMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpb2MzdWFydF9wcm9iZSAtIGNhcmQgcHJvYmUgZnVuY3Rpb24gY2FsbGVkIGZyb20gc2hpbSBkcml2ZXIKKyAqIEBpczogc3VibW9kdWxlIHN0cnVjdCBmb3IgdGhpcyBzdWJtb2R1bGUKKyAqIEBpZGQ6IGlvYzMgZHJpdmVyIGRhdGEgZm9yIHRoaXMgY2FyZAorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0Citpb2MzdWFydF9wcm9iZShzdHJ1Y3QgaW9jM19zdWJtb2R1bGUgKmlzLCBzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaWRkLT5wZGV2OworCXN0cnVjdCBpb2MzX2NhcmQgKmNhcmRfcHRyOworCWludCByZXQgPSAwOworCXN0cnVjdCBpb2MzX3BvcnQgKnBvcnQ7CisJc3RydWN0IGlvYzNfcG9ydCAqcG9ydHNbUE9SVFNfUEVSX0NBUkRdOworCWludCBwaHlzX3BvcnQ7CisKKwlEUFJJTlRfQ09ORklHKCgiJXMgKDB4JXAsIDB4JXApXG4iLCBfX0ZVTkNUSU9OX18sIGlzLCBpZGQpKTsKKworCWNhcmRfcHRyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlvYzNfY2FyZCksIEdGUF9LRVJORUwpOworCWlmICghY2FyZF9wdHIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaW9jM19hdHRhY2hfb25lIgorCQkgICAgICAgIjogdW5hYmxlIHRvIGdldCBtZW1vcnkgZm9yIHRoZSBJT0MzXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChjYXJkX3B0ciwgMCwgc2l6ZW9mKHN0cnVjdCBpb2MzX2NhcmQpKTsKKwlpZGQtPmRhdGFbaXMtPmlkXSA9IGNhcmRfcHRyOworCVN1Ym1vZHVsZV9zbG90ID0gaXMtPmlkOworCisJd3JpdGVsKCgoVUFSVEFfQkFTRSA+PiAzKSA8PCBTSU9fQ1JfU0VSX0FfQkFTRV9TSElGVCkgfAorCQkoKFVBUlRCX0JBU0UgPj4gMykgPDwgU0lPX0NSX1NFUl9CX0JBU0VfU0hJRlQpIHwKKwkJKDB4ZiA8PCBTSU9fQ1JfQ01EX1BVTFNFX1NISUZUKSwgJmlkZC0+dm1hLT5zaW9fY3IpOworCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfTEFULCAweGZmMDApOworCisJLyogRW5hYmxlIHNlcmlhbCBwb3J0IG1vZGUgc2VsZWN0IGdlbmVyaWMgUElPIHBpbnMgYXMgb3V0cHV0cyAqLworCWlvYzNfZ3Bjcl9zZXQoaWRkLCBHUENSX1VBUlRBX01PREVTRUwgfCBHUENSX1VBUlRCX01PREVTRUwpOworCisJLyogQ3JlYXRlIHBvcnQgc3RydWN0dXJlcyBmb3IgZWFjaCBwb3J0ICovCisJZm9yIChwaHlzX3BvcnQgPSAwOyBwaHlzX3BvcnQgPCBQT1JUU19QRVJfQ0FSRDsgcGh5c19wb3J0KyspIHsKKwkJcG9ydCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb2MzX3BvcnQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwb3J0KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIklPQzMgc2VyaWFsIG1lbW9yeSBub3QgYXZhaWxhYmxlIGZvciBwb3J0XG4iKTsKKwkJCWdvdG8gb3V0NDsKKwkJfQorCQltZW1zZXQocG9ydCwgMCwgc2l6ZW9mKHN0cnVjdCBpb2MzX3BvcnQpKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnBvcnQtPmlwX2xvY2spOworCisJCS8qIHdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIHByZXZpb3VzIG9uZXMsIHRvIHBvaW50IGJhY2sgdG8KKwkJICogdGhlbSBmYXJ0aGVyIGRvd24gLSBzZXR0aW5nIHVwIHRoZSByaW5nIGJ1ZmZlcnMuCisJCSAqLworCQlwb3J0c1twaHlzX3BvcnRdID0gcG9ydDsKKworCQkvKiBpbml0IHRvIHNvbWV0aGluZyB1c2VmdWwgKi8KKwkJY2FyZF9wdHItPmljX3BvcnRbcGh5c19wb3J0XS5pY3BfcG9ydCA9IHBvcnQ7CisJCXBvcnQtPmlwX2lzID0gaXM7CisJCXBvcnQtPmlwX2lkZCA9IGlkZDsKKwkJcG9ydC0+aXBfYmF1ZCA9IDk2MDA7CisJCXBvcnQtPmlwX2NhcmQgPSBjYXJkX3B0cjsKKwkJcG9ydC0+aXBfaG9va3MgPSAmaG9va3NfYXJyYXlbcGh5c19wb3J0XTsKKworCQkvKiBTZXR1cCBlYWNoIHBvcnQgKi8KKwkJaWYgKHBoeXNfcG9ydCA9PSAwKSB7CisJCQlwb3J0LT5pcF9zZXJpYWxfcmVncyA9ICZpZGQtPnZtYS0+cG9ydF9hOworCQkJcG9ydC0+aXBfdWFydF9yZWdzID0gJmlkZC0+dm1hLT5zcmVncy51YXJ0YTsKKworCQkJRFBSSU5UX0NPTkZJRygoIiVzIDogUG9ydCBBIGlwX3NlcmlhbF9yZWdzIDB4JXAgIgorCQkJCSAgICAgICAiaXBfdWFydF9yZWdzIDB4JXBcbiIsCisJCQkJICAgICAgIF9fRlVOQ1RJT05fXywKKwkJCQkgICAgICAgKHZvaWQgKilwb3J0LT5pcF9zZXJpYWxfcmVncywKKwkJCQkgICAgICAgKHZvaWQgKilwb3J0LT5pcF91YXJ0X3JlZ3MpKTsKKworCQkJLyogc2V0dXAgcmluZyBidWZmZXJzICovCisJCQlwb3J0LT5pcF9jcHVfcmluZ2J1ZiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsCisJCQkJVE9UQUxfUklOR19CVUZfU0laRSwgJnBvcnQtPmlwX2RtYV9yaW5nYnVmKTsKKworCQkJQlVHX09OKCEoKCgoaW50NjRfdCkgcG9ydC0+aXBfZG1hX3JpbmdidWYpICYKKwkJCQkgIChUT1RBTF9SSU5HX0JVRl9TSVpFIC0gMSkpID09IDApKTsKKwkJCXBvcnQtPmlwX2lucmluZyA9IFJJTkcocG9ydCwgUlhfQSk7CisJCQlwb3J0LT5pcF9vdXRyaW5nID0gUklORyhwb3J0LCBUWF9BKTsKKwkJCURQUklOVF9DT05GSUcoKCIlcyA6IFBvcnQgQSBpcF9jcHVfcmluZ2J1ZiAweCVwICIKKwkJCQkgICAgICAgImlwX2RtYV9yaW5nYnVmIDB4JXAsIGlwX2lucmluZyAweCVwICIKKwkJCQkJImlwX291dHJpbmcgMHglcFxuIiwKKwkJCQkgICAgICAgX19GVU5DVElPTl9fLAorCQkJCSAgICAgICAodm9pZCAqKXBvcnQtPmlwX2NwdV9yaW5nYnVmLAorCQkJCSAgICAgICAodm9pZCAqKXBvcnQtPmlwX2RtYV9yaW5nYnVmLAorCQkJCSAgICAgICAodm9pZCAqKXBvcnQtPmlwX2lucmluZywKKwkJCQkgICAgICAgKHZvaWQgKilwb3J0LT5pcF9vdXRyaW5nKSk7CisJCX0KKwkJZWxzZSB7CisJCQlwb3J0LT5pcF9zZXJpYWxfcmVncyA9ICZpZGQtPnZtYS0+cG9ydF9iOworCQkJcG9ydC0+aXBfdWFydF9yZWdzID0gJmlkZC0+dm1hLT5zcmVncy51YXJ0YjsKKworCQkJRFBSSU5UX0NPTkZJRygoIiVzIDogUG9ydCBCIGlwX3NlcmlhbF9yZWdzIDB4JXAgIgorCQkJCSAgICAgICAiaXBfdWFydF9yZWdzIDB4JXBcbiIsCisJCQkJICAgICAgIF9fRlVOQ1RJT05fXywKKwkJCQkgICAgICAgKHZvaWQgKilwb3J0LT5pcF9zZXJpYWxfcmVncywKKwkJCQkgICAgICAgKHZvaWQgKilwb3J0LT5pcF91YXJ0X3JlZ3MpKTsKKworCQkJLyogc2hhcmUgdGhlIHJpbmcgYnVmZmVycyAqLworCQkJcG9ydC0+aXBfZG1hX3JpbmdidWYgPQorCQkJICAgIHBvcnRzW3BoeXNfcG9ydCAtIDFdLT5pcF9kbWFfcmluZ2J1ZjsKKwkJCXBvcnQtPmlwX2NwdV9yaW5nYnVmID0KKwkJCSAgICBwb3J0c1twaHlzX3BvcnQgLSAxXS0+aXBfY3B1X3JpbmdidWY7CisJCQlwb3J0LT5pcF9pbnJpbmcgPSBSSU5HKHBvcnQsIFJYX0IpOworCQkJcG9ydC0+aXBfb3V0cmluZyA9IFJJTkcocG9ydCwgVFhfQik7CisJCQlEUFJJTlRfQ09ORklHKCgiJXMgOiBQb3J0IEIgaXBfY3B1X3JpbmdidWYgMHglcCAiCisJCQkJICAgICAgICJpcF9kbWFfcmluZ2J1ZiAweCVwLCBpcF9pbnJpbmcgMHglcCAiCisJCQkJCSJpcF9vdXRyaW5nIDB4JXBcbiIsCisJCQkJICAgICAgIF9fRlVOQ1RJT05fXywKKwkJCQkgICAgICAgKHZvaWQgKilwb3J0LT5pcF9jcHVfcmluZ2J1ZiwKKwkJCQkgICAgICAgKHZvaWQgKilwb3J0LT5pcF9kbWFfcmluZ2J1ZiwKKwkJCQkgICAgICAgKHZvaWQgKilwb3J0LT5pcF9pbnJpbmcsCisJCQkJICAgICAgICh2b2lkICopcG9ydC0+aXBfb3V0cmluZykpOworCQl9CisKKwkJRFBSSU5UX0NPTkZJRygoIiVzIDogcG9ydCAlZCBbYWRkciAweCVwXSBjYXJkX3B0ciAweCVwIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sCisJCQkgICAgICAgcGh5c19wb3J0LCAodm9pZCAqKXBvcnQsICh2b2lkICopY2FyZF9wdHIpKTsKKwkJRFBSSU5UX0NPTkZJRygoIiBpcF9zZXJpYWxfcmVncyAweCVwIGlwX3VhcnRfcmVncyAweCVwXG4iLAorCQkJICAgICAgICh2b2lkICopcG9ydC0+aXBfc2VyaWFsX3JlZ3MsCisJCQkgICAgICAgKHZvaWQgKilwb3J0LT5pcF91YXJ0X3JlZ3MpKTsKKworCQkvKiBJbml0aWFsaXplIHRoZSBoYXJkd2FyZSBmb3IgSU9DMyAqLworCQlwb3J0X2luaXQocG9ydCk7CisKKwkJRFBSSU5UX0NPTkZJRygoIiVzOiBwaHlzX3BvcnQgJWQgcG9ydCAweCVwIGlucmluZyAweCVwICIKKwkJCSAgICAgICAib3V0cmluZyAweCVwXG4iLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgICBwaHlzX3BvcnQsICh2b2lkICopcG9ydCwKKwkJCSAgICAgICAodm9pZCAqKXBvcnQtPmlwX2lucmluZywKKwkJCSAgICAgICAodm9pZCAqKXBvcnQtPmlwX291dHJpbmcpKTsKKworCX0KKworCS8qIHJlZ2lzdGVyIHBvcnQgd2l0aCB0aGUgc2VyaWFsIGNvcmUgKi8KKworCWlmICgocmV0ID0gaW9jM19zZXJpYWxfY29yZV9hdHRhY2goaXMsIGlkZCkpKQorCQlnb3RvIG91dDQ7CisKKwlOdW1fb2ZfaW9jM19jYXJkcysrOworCisJcmV0dXJuIHJldDsKKworCS8qIGVycm9yIGV4aXRzIHRoYXQgZ2l2ZSBiYWNrIHJlc291cmNlcyAqLworb3V0NDoKKwlrZnJlZShjYXJkX3B0cik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBpb2MzX3N1Ym1vZHVsZSBpb2MzdWFydF9zdWJtb2R1bGUgPSB7CisJLm5hbWUgPSAiSU9DM3VhcnQiLAorCS5wcm9iZSA9IGlvYzN1YXJ0X3Byb2JlLAorCS5yZW1vdmUgPSBpb2MzdWFydF9yZW1vdmUsCisJLyogY2FsbCAuaW50ciBmb3IgYm90aCBwb3J0cyBpbml0aWFsbHkgKi8KKwkuaXJxX21hc2sgPSBTSU9fSVJfU0EgfCBTSU9fSVJfU0IsCisJLmludHIgPSBpb2MzdWFydF9pbnRyLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworLyoqCisgKiBpb2MzX2RldGVjdCAtIG1vZHVsZSBpbml0IGNhbGxlZCwKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgaW9jM3VhcnRfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwkvKiByZWdpc3RlciB3aXRoIHNlcmlhbCBjb3JlICovCisJaWYgKChyZXQgPSB1YXJ0X3JlZ2lzdGVyX2RyaXZlcigmaW9jM191YXJ0KSkgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIlczogQ291bGRuJ3QgcmVnaXN0ZXIgSU9DMyB1YXJ0IHNlcmlhbCBkcml2ZXJcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSBpb2MzX3JlZ2lzdGVyX3N1Ym1vZHVsZSgmaW9jM3VhcnRfc3VibW9kdWxlKTsKKwlpZiAocmV0KQorCQl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZpb2MzX3VhcnQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpb2MzdWFydF9leGl0KHZvaWQpCit7CisJaW9jM191bnJlZ2lzdGVyX3N1Ym1vZHVsZSgmaW9jM3VhcnRfc3VibW9kdWxlKTsKKwl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZpb2MzX3VhcnQpOworfQorCittb2R1bGVfaW5pdChpb2MzdWFydF9pbml0KTsKK21vZHVsZV9leGl0KGlvYzN1YXJ0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJQYXQgR2VmcmUgLSBTaWxpY29uIEdyYXBoaWNzIEluYy4gKFNHSSkgPHBmZ0BzZ2kuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTZXJpYWwgUENJIGRyaXZlciBtb2R1bGUgZm9yIFNHSSBJT0MzIGNhcmQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2lvYzRfc2VyaWFsLmMgYi9kcml2ZXJzL3NlcmlhbC9pb2M0X3NlcmlhbC5jCmluZGV4IDc3MTY3NmEuLjFkODU1MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2lvYzRfc2VyaWFsLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvaW9jNF9zZXJpYWwuYwpAQCAtMjMyNywxOSArMjMyNywxMyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGVfcG9ydC0+bG9jaywgcGZsYWdzKTsKIAl0dHkgPSBpbmZvLT50dHk7CiAKLQlpZiAocmVxdWVzdF9jb3VudCA+IFRUWV9GTElQQlVGX1NJWkUgLSB0dHktPmZsaXAuY291bnQpCi0JCXJlcXVlc3RfY291bnQgPSBUVFlfRkxJUEJVRl9TSVpFIC0gdHR5LT5mbGlwLmNvdW50OworCXJlcXVlc3RfY291bnQgPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIElPQzRfTUFYX0NIQVJTIC0gMik7CiAKIAlpZiAocmVxdWVzdF9jb3VudCA+IDApIHsKIAkJaWNvdW50ID0gJnRoZV9wb3J0LT5pY291bnQ7CiAJCXJlYWRfY291bnQgPSBkb19yZWFkKHRoZV9wb3J0LCBjaCwgcmVxdWVzdF9jb3VudCk7CiAJCWlmIChyZWFkX2NvdW50ID4gMCkgewotCQkJZmxpcCA9IDE7Ci0JCQltZW1jcHkodHR5LT5mbGlwLmNoYXJfYnVmX3B0ciwgY2gsIHJlYWRfY291bnQpOwotCQkJbWVtc2V0KHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIsIFRUWV9OT1JNQUwsIHJlYWRfY291bnQpOwotCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciArPSByZWFkX2NvdW50OwotCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciArPSByZWFkX2NvdW50OwotCQkJdHR5LT5mbGlwLmNvdW50ICs9IHJlYWRfY291bnQ7CisJCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwgY2gsIHJlYWRfY291bnQpOwogCQkJaWNvdW50LT5yeCArPSByZWFkX2NvdW50OwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvaXAyMnppbG9nLmMgYi9kcml2ZXJzL3NlcmlhbC9pcDIyemlsb2cuYwppbmRleCBlZjEzMjM0Li42NmYxMTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9pcDIyemlsb2cuYworKysgYi9kcml2ZXJzL3NlcmlhbC9pcDIyemlsb2cuYwpAQCAtMjU5LDEzICsyNTksNyBAQAogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSB1cC0+cG9ydC5pbmZvLT50dHk7CS8qIFhYWCBpbmZvPT1OVUxMPyAqLwogCiAJd2hpbGUgKDEpIHsKLQkJdW5zaWduZWQgY2hhciBjaCwgcjE7Ci0KLQkJaWYgKHVubGlrZWx5KHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSkgewotCQkJdHR5LT5mbGlwLndvcmsuZnVuYygodm9pZCAqKXR0eSk7Ci0JCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpCi0JCQkJcmV0dXJuOwkJLyogWFhYIElnbm9yZXMgU3lzUnEgd2hlbiB3ZSBuZWVkIGl0IG1vc3QuIEZpeC4gKi8KLQkJfQorCQl1bnNpZ25lZCBjaGFyIGNoLCByMSwgZmxhZzsKIAogCQlyMSA9IHJlYWRfenNyZWcoY2hhbm5lbCwgUjEpOwogCQlpZiAocjEgJiAoUEFSX0VSUiB8IFJ4X09WUiB8IENSQ19FUlIpKSB7CkBAIC0zMDMsOCArMjk3LDcgQEAKIAkJfQogCiAJCS8qIEEgcmVhbCBzZXJpYWwgbGluZSwgcmVjb3JkIHRoZSBjaGFyYWN0ZXIgYW5kIHN0YXR1cy4gICovCi0JCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyID0gY2g7Ci0JCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX05PUk1BTDsKKwkJZmxhZyA9IFRUWV9OT1JNQUw7CiAJCXVwLT5wb3J0Lmljb3VudC5yeCsrOwogCQlpZiAocjEgJiAoQlJLX0FCUlQgfCBQQVJfRVJSIHwgUnhfT1ZSIHwgQ1JDX0VSUikpIHsKIAkJCWlmIChyMSAmIEJSS19BQlJUKSB7CkBAIC0zMjEsMjggKzMxNCwyMSBAQAogCQkJCXVwLT5wb3J0Lmljb3VudC5vdmVycnVuKys7CiAJCQlyMSAmPSB1cC0+cG9ydC5yZWFkX3N0YXR1c19tYXNrOwogCQkJaWYgKHIxICYgQlJLX0FCUlQpCi0JCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfQlJFQUs7CisJCQkJZmxhZyA9IFRUWV9CUkVBSzsKIAkJCWVsc2UgaWYgKHIxICYgUEFSX0VSUikKLQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9QQVJJVFk7CisJCQkJZmxhZyA9IFRUWV9QQVJJVFk7CiAJCQllbHNlIGlmIChyMSAmIENSQ19FUlIpCi0JCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfRlJBTUU7CisJCQkJZmxhZyA9IFRUWV9GUkFNRTsKIAkJfQogCQlpZiAodWFydF9oYW5kbGVfc3lzcnFfY2hhcigmdXAtPnBvcnQsIGNoLCByZWdzKSkKIAkJCWdvdG8gbmV4dF9jaGFyOwogCiAJCWlmICh1cC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2sgPT0gMHhmZiB8fAotCQkgICAgKHIxICYgdXAtPnBvcnQuaWdub3JlX3N0YXR1c19tYXNrKSA9PSAwKSB7Ci0JCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyKys7Ci0JCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyKys7Ci0JCQl0dHktPmZsaXAuY291bnQrKzsKLQkJfQotCQlpZiAoKHIxICYgUnhfT1ZSKSAmJgotCQkgICAgdHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSkgewotCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfT1ZFUlJVTjsKLQkJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKzsKLQkJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKzsKLQkJCXR0eS0+ZmxpcC5jb3VudCsrOwotCQl9CisJCSAgICAocjEgJiB1cC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2spID09IDApCisJCSAgICAJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgZmxhZyk7CisKKwkJaWYgKHIxICYgUnhfT1ZSKQorCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTik7CiAJbmV4dF9jaGFyOgogCQljaCA9IHJlYWRiKCZjaGFubmVsLT5jb250cm9sKTsKIAkJWlNERUxBWSgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvbTMycl9zaW8uYyBiL2RyaXZlcnMvc2VyaWFsL20zMnJfc2lvLmMKaW5kZXggYjBlY2M3NS4uYjQ4MDY2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvbTMycl9zaW8uYworKysgYi9kcml2ZXJzL3NlcmlhbC9tMzJyX3Npby5jCkBAIC0zMzEsMTcgKzMzMSwxMiBAQAogewogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSB1cC0+cG9ydC5pbmZvLT50dHk7CiAJdW5zaWduZWQgY2hhciBjaDsKKwl1bnNpZ25lZCBjaGFyIGZsYWc7CiAJaW50IG1heF9jb3VudCA9IDI1NjsKIAogCWRvIHsKLQkJaWYgKHVubGlrZWx5KHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSkgewotCQkJdHR5LT5mbGlwLndvcmsuZnVuYygodm9pZCAqKXR0eSk7Ci0JCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpCi0JCQkJcmV0dXJuOyAvLyBpZiBUVFlfRE9OVF9GTElQIGlzIHNldAotCQl9CiAJCWNoID0gc2lvX2luKHVwLCBTSU9SWEIpOwotCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciA9IGNoOwotCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9OT1JNQUw7CisJCWZsYWcgPSBUVFlfTk9STUFMOwogCQl1cC0+cG9ydC5pY291bnQucngrKzsKIAogCQlpZiAodW5saWtlbHkoKnN0YXR1cyAmIChVQVJUX0xTUl9CSSB8IFVBUlRfTFNSX1BFIHwKQEAgLTM4MCwzMCArMzc1LDI0IEBACiAKIAkJCWlmICgqc3RhdHVzICYgVUFSVF9MU1JfQkkpIHsKIAkJCQlERUJVR19JTlRSKCJoYW5kbGluZyBicmVhay4uLi4iKTsKLQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9CUkVBSzsKKwkJCQlmbGFnID0gVFRZX0JSRUFLOwogCQkJfSBlbHNlIGlmICgqc3RhdHVzICYgVUFSVF9MU1JfUEUpCi0JCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfUEFSSVRZOworCQkJCWZsYWcgPSBUVFlfUEFSSVRZOwogCQkJZWxzZSBpZiAoKnN0YXR1cyAmIFVBUlRfTFNSX0ZFKQotCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX0ZSQU1FOworCQkJCWZsYWcgPSBUVFlfRlJBTUU7CiAJCX0KIAkJaWYgKHVhcnRfaGFuZGxlX3N5c3JxX2NoYXIoJnVwLT5wb3J0LCBjaCwgcmVncykpCiAJCQlnb3RvIGlnbm9yZV9jaGFyOwotCQlpZiAoKCpzdGF0dXMgJiB1cC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2spID09IDApIHsKLQkJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKzsKLQkJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKzsKLQkJCXR0eS0+ZmxpcC5jb3VudCsrOwotCQl9Ci0JCWlmICgoKnN0YXR1cyAmIFVBUlRfTFNSX09FKSAmJgotCQkgICAgdHR5LT5mbGlwLmNvdW50IDwgVFRZX0ZMSVBCVUZfU0laRSkgeworCQlpZiAoKCpzdGF0dXMgJiB1cC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2spID09IDApCisJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBmbGFnKTsKKworCQlpZiAoKnN0YXR1cyAmIFVBUlRfTFNSX09FKSB7CiAJCQkvKgogCQkJICogT3ZlcnJ1biBpcyBzcGVjaWFsLCBzaW5jZSBpdCdzIHJlcG9ydGVkCiAJCQkgKiBpbW1lZGlhdGVseSwgYW5kIGRvZXNuJ3QgYWZmZWN0IHRoZSBjdXJyZW50CiAJCQkgKiBjaGFyYWN0ZXIuCiAJCQkgKi8KLQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX09WRVJSVU47Ci0JCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyKys7Ci0JCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyKys7Ci0JCQl0dHktPmZsaXAuY291bnQrKzsKKwkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pOwogCQl9CiAJaWdub3JlX2NoYXI6CiAJCSpzdGF0dXMgPSBzZXJpYWxfaW4odXAsIFVBUlRfTFNSKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL21jZnNlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvbWNmc2VyaWFsLmMKaW5kZXggNDdmNzQwNC4uZDk1N2EzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvbWNmc2VyaWFsLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvbWNmc2VyaWFsLmMKQEAgLTMxMyw3ICszMTMsNyBAQAogewogCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJKnVhcnRwOwogCXN0cnVjdCB0dHlfc3RydWN0CSp0dHkgPSBpbmZvLT50dHk7Ci0JdW5zaWduZWQgY2hhcgkJc3RhdHVzLCBjaDsKKwl1bnNpZ25lZCBjaGFyCQlzdGF0dXMsIGNoLCBmbGFnOwogCiAJaWYgKCF0dHkpCiAJCXJldHVybjsKQEAgLTMyMSwxMCArMzIxLDYgQEAKIAl1YXJ0cCA9IGluZm8tPmFkZHI7CiAKIAl3aGlsZSAoKHN0YXR1cyA9IHVhcnRwW01DRlVBUlRfVVNSXSkgJiBNQ0ZVQVJUX1VTUl9SWFJFQURZKSB7Ci0KLQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKQotCQkJYnJlYWs7Ci0KIAkJY2ggPSB1YXJ0cFtNQ0ZVQVJUX1VSQl07CiAJCWluZm8tPnN0YXRzLnJ4Kys7CiAKQEAgLTMzNSwyOSArMzMxLDI0IEBACiAJCX0KICNlbmRpZgogCi0JCXR0eS0+ZmxpcC5jb3VudCsrOworCQlmbGFnID0gVFRZX05PUk1BTDsKIAkJaWYgKHN0YXR1cyAmIE1DRlVBUlRfVVNSX1JYRVJSKSB7CiAJCQl1YXJ0cFtNQ0ZVQVJUX1VDUl0gPSBNQ0ZVQVJUX1VDUl9DTURSRVNFVEVSUjsKIAkJCWlmIChzdGF0dXMgJiBNQ0ZVQVJUX1VTUl9SWEJSRUFLKSB7CiAJCQkJaW5mby0+c3RhdHMucnhicmVhaysrOwotCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfQlJFQUs7CisJCQkJZmxhZyA9IFRUWV9CUkVBSzsKIAkJCX0gZWxzZSBpZiAoc3RhdHVzICYgTUNGVUFSVF9VU1JfUlhQQVJJVFkpIHsKIAkJCQlpbmZvLT5zdGF0cy5yeHBhcml0eSsrOwotCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfUEFSSVRZOworCQkJCWZsYWcgPSBUVFlfUEFSSVRZOwogCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBNQ0ZVQVJUX1VTUl9SWE9WRVJSVU4pIHsKIAkJCQlpbmZvLT5zdGF0cy5yeG92ZXJydW4rKzsKLQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX09WRVJSVU47CisJCQkJZmxhZyA9IFRUWV9PVkVSUlVOOwogCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBNQ0ZVQVJUX1VTUl9SWEZSQU1JTkcpIHsKIAkJCQlpbmZvLT5zdGF0cy5yeGZyYW1pbmcrKzsKLQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX0ZSQU1FOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uLi4gKi8KLQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gMDsKKwkJCQlmbGFnID0gVFRZX0ZSQU1FOwogCQkJfQotCQl9IGVsc2UgewotCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IDA7CiAJCX0KLQkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IGNoOworCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBmbGFnKTsKIAl9CiAKIAlzY2hlZHVsZV93b3JrKCZ0dHktPmZsaXAud29yayk7CkBAIC0xNTI1LDcgKzE1MTYsNyBAQAogCiAJaWNycCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChNQ0ZfTUJBUiArIE1DRklDTV9JTlRDMCArCiAJCU1DRklOVENfSUNSMCArIE1DRklOVF9VQVJUMCArIGluZm8tPmxpbmUpOwotCSppY3JwID0gMHgzMzsgLyogVUFSVDAgd2l0aCBsZXZlbCA2LCBwcmlvcml0eSAzICovCisJKmljcnAgPSAweDMwICsgaW5mby0+bGluZTsgLyogbGV2ZWwgNiwgbGluZSBiYXNlZCBwcmlvcml0eSAqLwogCiAJaW1ycCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChNQ0ZfTUJBUiArIE1DRklDTV9JTlRDMCArCiAJCU1DRklOVENfSU1STCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9tcGM1Mnh4X3VhcnQuYyBiL2RyaXZlcnMvc2VyaWFsL21wYzUyeHhfdWFydC5jCmluZGV4IDEyODhkNjIuLjYxZGQxN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL21wYzUyeHhfdWFydC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL21wYzUyeHhfdWFydC5jCkBAIC00MDUsMTcgKzQwNSwxMyBAQAogbXBjNTJ4eF91YXJ0X2ludF9yeF9jaGFycyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+aW5mby0+dHR5OwotCXVuc2lnbmVkIGNoYXIgY2g7CisJdW5zaWduZWQgY2hhciBjaCwgZmxhZzsKIAl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CiAKIAkvKiBXaGlsZSB3ZSBjYW4gcmVhZCwgZG8gc28gISAqLwogCXdoaWxlICggKHN0YXR1cyA9IGluX2JlMTYoJlBTQyhwb3J0KS0+bXBjNTJ4eF9wc2Nfc3RhdHVzKSkgJgogCSAgICAgICAgTVBDNTJ4eF9QU0NfU1JfUlhSRFkpIHsKIAotCQkvKiBJZiB3ZSBhcmUgZnVsbCwganVzdCBzdG9wIHJlYWRpbmcgKi8KLQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKQotCQkJYnJlYWs7Ci0JCQogCQkvKiBHZXQgdGhlIGNoYXIgKi8KIAkJY2ggPSBpbl84KCZQU0MocG9ydCktPm1wYzUyeHhfcHNjX2J1ZmZlcl84KTsKIApAQCAtNDI4LDQ1ICs0MjQsMzUgQEAKICNlbmRpZgogCiAJCS8qIFN0b3JlIGl0ICovCi0JCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyID0gY2g7Ci0JCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gMDsKKworCQlmbGFnID0gVFRZX05PUk1BTDsKIAkJcG9ydC0+aWNvdW50LnJ4Kys7CiAJCiAJCWlmICggc3RhdHVzICYgKE1QQzUyeHhfUFNDX1NSX1BFIHwKIAkJICAgICAgICAgICAgICAgTVBDNTJ4eF9QU0NfU1JfRkUgfAotCQkgICAgICAgICAgICAgICBNUEM1Mnh4X1BTQ19TUl9SQiB8Ci0JCSAgICAgICAgICAgICAgIE1QQzUyeHhfUFNDX1NSX09FKSApIHsKKwkJICAgICAgICAgICAgICAgTVBDNTJ4eF9QU0NfU1JfUkIpICkgewogCQkJCiAJCQlpZiAoc3RhdHVzICYgTVBDNTJ4eF9QU0NfU1JfUkIpIHsKLQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9CUkVBSzsKKwkJCQlmbGFnID0gVFRZX0JSRUFLOwogCQkJCXVhcnRfaGFuZGxlX2JyZWFrKHBvcnQpOwogCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBNUEM1Mnh4X1BTQ19TUl9QRSkKLQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9QQVJJVFk7CisJCQkJZmxhZyA9IFRUWV9QQVJJVFk7CiAJCQllbHNlIGlmIChzdGF0dXMgJiBNUEM1Mnh4X1BTQ19TUl9GRSkKLQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9GUkFNRTsKLQkJCWlmIChzdGF0dXMgJiBNUEM1Mnh4X1BTQ19TUl9PRSkgewotCQkJCS8qCi0JCQkJICogT3ZlcnJ1biBpcyBzcGVjaWFsLCBzaW5jZSBpdCdzCi0JCQkJICogcmVwb3J0ZWQgaW1tZWRpYXRlbHksIGFuZCBkb2Vzbid0Ci0JCQkJICogYWZmZWN0IHRoZSBjdXJyZW50IGNoYXJhY3RlcgotCQkJCSAqLwotCQkJCWlmICh0dHktPmZsaXAuY291bnQgPCAoVFRZX0ZMSVBCVUZfU0laRS0xKSkgewotCQkJCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyKys7Ci0JCQkJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKzsKLQkJCQkJdHR5LT5mbGlwLmNvdW50Kys7Ci0JCQkJfQotCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX09WRVJSVU47Ci0JCQl9CisJCQkJZmxhZyA9IFRUWV9GUkFNRTsKIAogCQkJLyogQ2xlYXIgZXJyb3IgY29uZGl0aW9uICovCiAJCQlvdXRfOCgmUFNDKHBvcnQpLT5jb21tYW5kLE1QQzUyeHhfUFNDX1JTVF9FUlJfU1RBVCk7CiAKIAkJfQotCi0JCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKzsKLQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOwotCQl0dHktPmZsaXAuY291bnQrKzsKLQorCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBmbGFnKTsKKwkJaWYgKHN0YXR1cyAmIE1QQzUyeHhfUFNDX1NSX09FKSB7CisJCQkvKgorCQkJICogT3ZlcnJ1biBpcyBzcGVjaWFsLCBzaW5jZSBpdCdzCisJCQkgKiByZXBvcnRlZCBpbW1lZGlhdGVseSwgYW5kIGRvZXNuJ3QKKwkJCSAqIGFmZmVjdCB0aGUgY3VycmVudCBjaGFyYWN0ZXIKKwkJCSAqLworCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTik7CisJCX0KIAl9CiAKIAl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvbXBzYy5jIGIvZHJpdmVycy9zZXJpYWwvbXBzYy5jCmluZGV4IDhmODNlNDAuLjBjYTgzYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL21wc2MuYworKysgYi9kcml2ZXJzL3NlcmlhbC9tcHNjLmMKQEAgLTc2OSwxMiArNzY5LDEyIEBACiAJCWJ5dGVzX2luID0gYmUxNl90b19jcHUocnhyZS0+Ynl0ZWNudCk7CiAKIAkJLyogRm9sbG93aW5nIHVzZSBvZiB0dHkgc3RydWN0IGRpcmVjdGx5IGlzIGRlcHJlY2F0ZWQgKi8KLQkJaWYgKHVubGlrZWx5KCh0dHktPmZsaXAuY291bnQgKyBieXRlc19pbikgPj0gVFRZX0ZMSVBCVUZfU0laRSkpeworCQlpZiAodW5saWtlbHkodHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBieXRlc19pbikgPCBieXRlc19pbikpIHsKIAkJCWlmICh0dHktPmxvd19sYXRlbmN5KQogCQkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiAJCQkvKgotCQkJICogSWYgdGhpcyBmYWlsZWQgdGhlbiB3ZSB3aWxsIHRocm93IGF3YSB0aGUgYnl0ZXMKLQkJCSAqIGJ1dCBtc3QgZG8gc28gdG8gY2xlYXIgaW50ZXJydXB0cy4KKwkJCSAqIElmIHRoaXMgZmFpbGVkIHRoZW4gd2Ugd2lsbCB0aHJvdyBhd2F5IHRoZSBieXRlcworCQkJICogYnV0IG11c3QgZG8gc28gdG8gY2xlYXIgaW50ZXJydXB0cy4KIAkJCSAqLwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL211eC5jIGIvZHJpdmVycy9zZXJpYWwvbXV4LmMKaW5kZXggNzYzMzEzMi4uNGU0OTE2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvbXV4LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvbXV4LmMKQEAgLTIyMywxMSArMjIzLDYgQEAKIAkJaWYgKE1VWF9FT0ZJRk8oZGF0YSkpCiAJCQlicmVhazsKIAotCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpCi0JCQljb250aW51ZTsKLQotCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciA9IGRhdGEgJiAweGZmdTsKLQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfTk9STUFMOwogCQlwb3J0LT5pY291bnQucngrKzsKIAogCQlpZiAoTVVYX0JSRUFLKGRhdGEpKSB7CkBAIC0yMzksOSArMjM0LDcgQEAKIAkJaWYgKHVhcnRfaGFuZGxlX3N5c3JxX2NoYXIocG9ydCwgZGF0YSAmIDB4ZmZ1LCBOVUxMKSkKIAkJCWNvbnRpbnVlOwogCi0JCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKzsKLQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOwotCQl0dHktPmZsaXAuY291bnQrKzsKKwkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBkYXRhICYgMHhGRiwgVFRZX05PUk1BTCk7CiAJfQogCQogCWlmIChzdGFydF9jb3VudCAhPSBwb3J0LT5pY291bnQucngpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3BtYWNfemlsb2cuYyBiL2RyaXZlcnMvc2VyaWFsL3BtYWNfemlsb2cuYwppbmRleCA1ZGRkOGFiLi40ZTAzYTg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9wbWFjX3ppbG9nLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvcG1hY196aWxvZy5jCkBAIC02MCw2ICs2MCw3IEBACiAjaW5jbHVkZSA8bGludXgvcG11Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTY4LDcgKzY5LDYgQEAKICNpbmNsdWRlIDxhc20vcG1hY19mZWF0dXJlLmg+CiAjaW5jbHVkZSA8YXNtL2RiZG1hLmg+CiAjaW5jbHVkZSA8YXNtL21hY2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogCiAjaWYgZGVmaW5lZCAoQ09ORklHX1NFUklBTF9QTUFDWklMT0dfQ09OU09MRSkgJiYgZGVmaW5lZChDT05GSUdfTUFHSUNfU1lTUlEpCiAjZGVmaW5lIFNVUFBPUlRfU1lTUlEKQEAgLTk2LDcgKzk2LDcgQEAKICAqLwogc3RhdGljIHN0cnVjdCB1YXJ0X3BtYWNfcG9ydAlwbXpfcG9ydHNbTUFYX1pTX1BPUlRTXTsKIHN0YXRpYyBpbnQJCQlwbXpfcG9ydHNfY291bnQ7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWChwbXpfaXJxX3NlbSk7CitzdGF0aWMgREVGSU5FX01VVEVYKHBtel9pcnFfbXV0ZXgpOwogCiBzdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIHBtel91YXJ0X3JlZyA9IHsKIAkub3duZXIJCT0JVEhJU19NT0RVTEUsCkBAIC0yMTAsMTAgKzIxMCw5IEBACiAJCQkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gTlVMTDsKLQl1bnNpZ25lZCBjaGFyIGNoLCByMSwgZHJvcCwgZXJyb3I7CisJdW5zaWduZWQgY2hhciBjaCwgcjEsIGRyb3AsIGVycm9yLCBmbGFnOwogCWludCBsb29wcyA9IDA7CiAKLSByZXRyeToKIAkvKiBUaGUgaW50ZXJydXB0IGNhbiBiZSBlbmFibGVkIHdoZW4gdGhlIHBvcnQgaXNuJ3Qgb3BlbiwgdHlwaWNhbGx5CiAJICogdGhhdCBoYXBwZW5zIHdoZW4gdXNpbmcgb25lIHBvcnQgaXMgb3BlbiBhbmQgdGhlIG90aGVyIGNsb3NlZCAoc3RhbGUKIAkgKiBpbnRlcnJ1cHQpIG9yIHdoZW4gb25lIHBvcnQgaXMgdXNlZCBhcyBhIGNvbnNvbGUuCkBAIC0yNDYsMjAgKzI0NSw2IEBACiAJCWVycm9yID0gMDsKIAkJZHJvcCA9IDA7CiAKLQkJaWYgKHVubGlrZWx5KHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSkgewotCQkJLyogSGF2ZSB0byBkcm9wIHRoZSBsb2NrIGhlcmUgKi8KLQkJCXBtel9kZWJ1ZygicG16OiBmbGlwIG92ZXJmbG93XG4iKTsKLQkJCXNwaW5fdW5sb2NrKCZ1YXAtPnBvcnQubG9jayk7Ci0JCQl0dHktPmZsaXAud29yay5mdW5jKCh2b2lkICopdHR5KTsKLQkJCXNwaW5fbG9jaygmdWFwLT5wb3J0LmxvY2spOwotCQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKQotCQkJCWRyb3AgPSAxOwotCQkJaWYgKFpTX0lTX0FTTEVFUCh1YXApKQotCQkJCXJldHVybiBOVUxMOwotCQkJaWYgKCFaU19JU19PUEVOKHVhcCkpCi0JCQkJZ290byByZXRyeTsKLQkJfQotCiAJCXIxID0gcmVhZF96c3JlZyh1YXAsIFIxKTsKIAkJY2ggPSByZWFkX3pzZGF0YSh1YXApOwogCkBAIC0yOTUsOCArMjgwLDcgQEAKIAkJaWYgKGRyb3ApCiAJCQlnb3RvIG5leHRfY2hhcjsKIAotCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciA9IGNoOwotCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9OT1JNQUw7CisJCWZsYWcgPSBUVFlfTk9STUFMOwogCQl1YXAtPnBvcnQuaWNvdW50LnJ4Kys7CiAKIAkJaWYgKHIxICYgKFBBUl9FUlIgfCBSeF9PVlIgfCBDUkNfRVJSIHwgQlJLX0FCUlQpKSB7CkBAIC0zMTYsMjYgKzMwMCwxOSBAQAogCQkJCXVhcC0+cG9ydC5pY291bnQub3ZlcnJ1bisrOwogCQkJcjEgJj0gdWFwLT5wb3J0LnJlYWRfc3RhdHVzX21hc2s7CiAJCQlpZiAocjEgJiBCUktfQUJSVCkKLQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9CUkVBSzsKKwkJCQlmbGFnID0gVFRZX0JSRUFLOwogCQkJZWxzZSBpZiAocjEgJiBQQVJfRVJSKQotCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX1BBUklUWTsKKwkJCQlmbGFnID0gVFRZX1BBUklUWTsKIAkJCWVsc2UgaWYgKHIxICYgQ1JDX0VSUikKLQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9GUkFNRTsKKwkJCQlmbGFnID0gVFRZX0ZSQU1FOwogCQl9CiAKIAkJaWYgKHVhcC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2sgPT0gMHhmZiB8fAogCQkgICAgKHIxICYgdWFwLT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzaykgPT0gMCkgewotCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOwotCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOwotCQkJdHR5LT5mbGlwLmNvdW50Kys7CisJCSAgICAJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgZmxhZyk7CiAJCX0KLQkJaWYgKChyMSAmIFJ4X09WUikgJiYKLQkJICAgIHR0eS0+ZmxpcC5jb3VudCA8IFRUWV9GTElQQlVGX1NJWkUpIHsKLQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX09WRVJSVU47Ci0JCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyKys7Ci0JCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyKys7Ci0JCQl0dHktPmZsaXAuY291bnQrKzsKLQkJfQorCQlpZiAocjEgJiBSeF9PVlIpCisJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9PVkVSUlVOKTsKIAluZXh0X2NoYXI6CiAJCS8qIFdlIGNhbiBnZXQgc3R1Y2sgaW4gYW4gaW5maW5pdGUgbG9vcCBnZXR0aW5nIGNoYXIgMCB3aGVuIHRoZQogCQkgKiBsaW5lIGlzIGluIGEgd3JvbmcgSFcgc3RhdGUsIHdlIGJyZWFrIHRoYXQgaGVyZS4KQEAgLTk0NSw3ICs5MjIsNyBAQAogCWlmICh1YXAtPm5vZGUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlkb3duKCZwbXpfaXJxX3NlbSk7CisJbXV0ZXhfbG9jaygmcG16X2lycV9tdXRleCk7CiAKIAl1YXAtPmZsYWdzIHw9IFBNQUNaSUxPR19GTEFHX0lTX09QRU47CiAKQEAgLTk2MywxMSArOTQwLDExIEBACiAJCWRldl9lcnIoJnVhcC0+ZGV2LT5vZmRldi5kZXYsCiAJCQkiVW5hYmxlIHRvIHJlZ2lzdGVyIHpzIGludGVycnVwdCBoYW5kbGVyLlxuIik7CiAJCXBtel9zZXRfc2NjX3Bvd2VyKHVhcCwgMCk7Ci0JCXVwKCZwbXpfaXJxX3NlbSk7CisJCW11dGV4X3VubG9jaygmcG16X2lycV9tdXRleCk7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCi0JdXAoJnBtel9pcnFfc2VtKTsKKwltdXRleF91bmxvY2soJnBtel9pcnFfbXV0ZXgpOwogCiAJLyogUmlnaHQgbm93LCB3ZSBkZWFsIHdpdGggZGVsYXkgYnkgYmxvY2tpbmcgaGVyZSwgSSdsbCBiZQogCSAqIHNtYXJ0ZXIgbGF0ZXIgb24KQEAgLTEwMDQsNyArOTgxLDcgQEAKIAlpZiAodWFwLT5ub2RlID09IE5VTEwpCiAJCXJldHVybjsKIAotCWRvd24oJnBtel9pcnFfc2VtKTsKKwltdXRleF9sb2NrKCZwbXpfaXJxX211dGV4KTsKIAogCS8qIFJlbGVhc2UgaW50ZXJydXB0IGhhbmRsZXIgKi8KICAgICAgICAJZnJlZV9pcnEodWFwLT5wb3J0LmlycSwgdWFwKTsKQEAgLTEwMjUsNyArMTAwMiw3IEBACiAKIAlpZiAoWlNfSVNfQ09OUyh1YXApIHx8IFpTX0lTX0FTTEVFUCh1YXApKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJdXAoJnBtel9pcnFfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZwbXpfaXJxX211dGV4KTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTA0Miw3ICsxMDE5LDcgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAotCXVwKCZwbXpfaXJxX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwbXpfaXJxX211dGV4KTsKIAogCXBtel9kZWJ1ZygicG16OiBzaHV0ZG93bigpIGRvbmUuXG4iKTsKIH0KQEAgLTE0MzEsMTEgKzE0MDgsMTQgQEAKIAkJY2hhcgluYW1lWzFdOwogCX0gKnNsb3RzOwogCWludCBsZW47CisJc3RydWN0IHJlc291cmNlIHJfcG9ydHMsIHJfcnhkbWEsIHJfdHhkbWE7CiAKIAkvKgogCSAqIFJlcXVlc3QgJiBtYXAgY2hpcCByZWdpc3RlcnMKIAkgKi8KLQl1YXAtPnBvcnQubWFwYmFzZSA9IG5wLT5hZGRyc1swXS5hZGRyZXNzOworCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcl9wb3J0cykpCisJCXJldHVybiAtRU5PREVWOworCXVhcC0+cG9ydC5tYXBiYXNlID0gcl9wb3J0cy5zdGFydDsKIAl1YXAtPnBvcnQubWVtYmFzZSA9IGlvcmVtYXAodWFwLT5wb3J0Lm1hcGJhc2UsIDB4MTAwMCk7CiAgICAgICAKIAl1YXAtPmNvbnRyb2xfcmVnID0gdWFwLT5wb3J0Lm1lbWJhc2U7CkBAIC0xNDQ1LDE2ICsxNDI1LDIwIEBACiAJICogUmVxdWVzdCAmIG1hcCBEQkRNQSByZWdpc3RlcnMKIAkgKi8KICNpZmRlZiBIQVNfREJETUEKLQlpZiAobnAtPm5fYWRkcnMgPj0gMyAmJiBucC0+bl9pbnRycyA+PSAzKQorCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAxLCAmcl90eGRtYSkgPT0gMCAmJgorCSAgICBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAyLCAmcl9yeGRtYSkgPT0gMCkKIAkJdWFwLT5mbGFncyB8PSBQTUFDWklMT0dfRkxBR19IQVNfRE1BOworI2Vsc2UKKwltZW1zZXQoJnJfdHhkbWEsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKwltZW1zZXQoJnJfcnhkbWEsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKICNlbmRpZgkKIAlpZiAoWlNfSEFTX0RNQSh1YXApKSB7Ci0JCXVhcC0+dHhfZG1hX3JlZ3MgPSBpb3JlbWFwKG5wLT5hZGRyc1tucC0+bl9hZGRycyAtIDJdLmFkZHJlc3MsIDB4MTAwMCk7CisJCXVhcC0+dHhfZG1hX3JlZ3MgPSBpb3JlbWFwKHJfdHhkbWEuc3RhcnQsIDB4MTAwKTsKIAkJaWYgKHVhcC0+dHhfZG1hX3JlZ3MgPT0gTlVMTCkgewkKIAkJCXVhcC0+ZmxhZ3MgJj0gflBNQUNaSUxPR19GTEFHX0hBU19ETUE7CiAJCQlnb3RvIG5vX2RtYTsKIAkJfQotCQl1YXAtPnJ4X2RtYV9yZWdzID0gaW9yZW1hcChucC0+YWRkcnNbbnAtPm5fYWRkcnMgLSAxXS5hZGRyZXNzLCAweDEwMDApOworCQl1YXAtPnJ4X2RtYV9yZWdzID0gaW9yZW1hcChyX3J4ZG1hLnN0YXJ0LCAweDEwMCk7CiAJCWlmICh1YXAtPnJ4X2RtYV9yZWdzID09IE5VTEwpIHsJCiAJCQlpb3VubWFwKHVhcC0+dHhfZG1hX3JlZ3MpOwogCQkJdWFwLT50eF9kbWFfcmVncyA9IE5VTEw7CkBAIC0xNjA3LDggKzE1OTEsOCBAQAogCiAJc3RhdGUgPSBwbXpfdWFydF9yZWcuc3RhdGUgKyB1YXAtPnBvcnQubGluZTsKIAotCWRvd24oJnBtel9pcnFfc2VtKTsKLQlkb3duKCZzdGF0ZS0+c2VtKTsKKwltdXRleF9sb2NrKCZwbXpfaXJxX211dGV4KTsKKwltdXRleF9sb2NrKCZzdGF0ZS0+bXV0ZXgpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnVhcC0+cG9ydC5sb2NrLCBmbGFncyk7CiAKQEAgLTE2MzksOCArMTYyMyw4IEBACiAJLyogU2h1dCB0aGUgY2hpcCBkb3duICovCiAJcG16X3NldF9zY2NfcG93ZXIodWFwLCAwKTsKIAotCXVwKCZzdGF0ZS0+c2VtKTsKLQl1cCgmcG16X2lycV9zZW0pOworCW11dGV4X3VubG9jaygmc3RhdGUtPm11dGV4KTsKKwltdXRleF91bmxvY2soJnBtel9pcnFfbXV0ZXgpOwogCiAJcG16X2RlYnVnKCJzdXNwZW5kLCBzd2l0Y2hpbmcgY29tcGxldGVcbiIpOwogCkBAIC0xNjY3LDggKzE2NTEsOCBAQAogCiAJc3RhdGUgPSBwbXpfdWFydF9yZWcuc3RhdGUgKyB1YXAtPnBvcnQubGluZTsKIAotCWRvd24oJnBtel9pcnFfc2VtKTsKLQlkb3duKCZzdGF0ZS0+c2VtKTsKKwltdXRleF9sb2NrKCZwbXpfaXJxX211dGV4KTsKKwltdXRleF9sb2NrKCZzdGF0ZS0+bXV0ZXgpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnVhcC0+cG9ydC5sb2NrLCBmbGFncyk7CiAJaWYgKCFaU19JU19PUEVOKHVhcCkgJiYgIVpTX0lTX0NPTlModWFwKSkgewpAQCAtMTcwMCw4ICsxNjg0LDggQEAKIAl9CiAKICBiYWlsOgotCXVwKCZzdGF0ZS0+c2VtKTsKLQl1cCgmcG16X2lycV9zZW0pOworCW11dGV4X3VubG9jaygmc3RhdGUtPm11dGV4KTsKKwltdXRleF91bmxvY2soJnBtel9pcnFfbXV0ZXgpOwogCiAJLyogUmlnaHQgbm93LCB3ZSBkZWFsIHdpdGggZGVsYXkgYnkgYmxvY2tpbmcgaGVyZSwgSSdsbCBiZQogCSAqIHNtYXJ0ZXIgbGF0ZXIgb24KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3B4YS5jIGIvZHJpdmVycy9zZXJpYWwvcHhhLmMKaW5kZXggY2M5OThiOS4uMTA1MzVmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvcHhhLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvcHhhLmMKQEAgLTEwNywxNCArMTA3LDYgQEAKIAlpbnQgbWF4X2NvdW50ID0gMjU2OwogCiAJZG8gewotCQlpZiAodW5saWtlbHkodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpKSB7Ci0JCQlpZiAodHR5LT5sb3dfbGF0ZW5jeSkKLQkJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCQkJLyoKLQkJCSAqIElmIHRoaXMgZmFpbGVkIHRoZW4gd2Ugd2lsbCB0aHJvdyBhd2F5IHRoZQotCQkJICogYnl0ZXMgYnV0IG11c3QgZG8gc28gdG8gY2xlYXIgaW50ZXJydXB0cwotCQkJICovCi0JCX0KIAkJY2ggPSBzZXJpYWxfaW4odXAsIFVBUlRfUlgpOwogCQlmbGFnID0gVFRZX05PUk1BTDsKIAkJdXAtPnBvcnQuaWNvdW50LnJ4Kys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zM2MyNDEwLmMgYi9kcml2ZXJzL3NlcmlhbC9zM2MyNDEwLmMKaW5kZXggNDc2ODFjNC4uZWI0ODgzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvczNjMjQxMC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3MzYzI0MTAuYwpAQCAtNzIsMTIgKzcyLDEyIEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLXNlcmlhbC5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtZ3Bpby5oPgpAQCAtMzIzLDE2ICszMjMsNiBAQAogCQlpZiAoczNjMjR4eF9zZXJpYWxfcnhfZmlmb2NudChvdXJwb3J0LCB1ZnN0YXQpID09IDApCiAJCQlicmVhazsKIAotCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpIHsKLQkJCWlmICh0dHktPmxvd19sYXRlbmN5KQotCQkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7Ci0KLQkJCS8qCi0JCQkgKiBJZiB0aGlzIGZhaWxlZCB0aGVuIHdlIHdpbGwgdGhyb3cgYXdheSB0aGUKLQkJCSAqIGJ5dGVzIGJ1dCBtdXN0IGRvIHNvIHRvIGNsZWFyIGludGVycnVwdHMKLQkJCSAqLwotCQl9Ci0KIAkJdWVyc3RhdCA9IHJkX3JlZ2wocG9ydCwgUzNDMjQxMF9VRVJTVEFUKTsKIAkJY2ggPSByZF9yZWdiKHBvcnQsIFMzQzI0MTBfVVJYSCk7CiAKQEAgLTc4MiwxMSArNzcyLDkgQEAKIAogCQlpZiAob3VycG9ydC0+YmF1ZGNsayAhPSBOVUxMICYmICFJU19FUlIob3VycG9ydC0+YmF1ZGNsaykpIHsKIAkJCWNsa19kaXNhYmxlKG91cnBvcnQtPmJhdWRjbGspOwotCQkJY2xrX3VudXNlKG91cnBvcnQtPmJhdWRjbGspOwogCQkJb3VycG9ydC0+YmF1ZGNsayAgPSBOVUxMOwogCQl9CiAKLQkJY2xrX3VzZShjbGspOwogCQljbGtfZW5hYmxlKGNsayk7CiAKIAkJb3VycG9ydC0+Y2xrc3JjID0gY2xrc3JjOwpAQCAtMTA3Nyw5ICsxMDY1LDYgQEAKIAogCW91cnBvcnQtPmNsawk9IGNsa19nZXQoJnBsYXRkZXYtPmRldiwgInVhcnQiKTsKIAotCWlmIChvdXJwb3J0LT5jbGsgIT0gTlVMTCAmJiAhSVNfRVJSKG91cnBvcnQtPmNsaykpCi0JCWNsa191c2Uob3VycG9ydC0+Y2xrKTsKLQogCWRiZygicG9ydDogbWFwPSUwOHgsIG1lbT0lMDh4LCBpcnE9JWQsIGNsb2NrPSVsZFxuIiwKIAkgICAgcG9ydC0+bWFwYmFzZSwgcG9ydC0+bWVtYmFzZSwgcG9ydC0+aXJxLCBwb3J0LT51YXJ0Y2xrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2ExMTAwLmMgYi9kcml2ZXJzL3NlcmlhbC9zYTExMDAuYwppbmRleCAyNWEwODY0Li4xYmQ5MzE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zYTExMDAuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zYTExMDAuYwpAQCAtMjAxLDggKzIwMSw2IEBACiAJd2hpbGUgKHN0YXR1cyAmIFVUU1IxX1RPX1NNKFVUU1IxX1JORSkpIHsKIAkJY2ggPSBVQVJUX0dFVF9DSEFSKHNwb3J0KTsKIAotCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpCi0JCQlnb3RvIGlnbm9yZV9jaGFyOwogCQlzcG9ydC0+cG9ydC5pY291bnQucngrKzsKIAogCQlmbGcgPSBUVFlfTk9STUFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMKaW5kZXggYzE3ZDY4MC4uOTQzNzcwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+IC8qIGZvciBzZXJpYWxfc3RhdGUgYW5kIHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgKi8KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTQ3LDcgKzQ4LDcgQEAKIC8qCiAgKiBUaGlzIGlzIHVzZWQgdG8gbG9jayBjaGFuZ2VzIGluIHNlcmlhbCBsaW5lIGNvbmZpZ3VyYXRpb24uCiAgKi8KLXN0YXRpYyBERUNMQVJFX01VVEVYKHBvcnRfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgocG9ydF9tdXRleCk7CiAKICNkZWZpbmUgSElHSF9CSVRTX09GRlNFVAkoKHNpemVvZihsb25nKS1zaXplb2YoaW50KSkqOCkKIApAQCAtNjM3LDcgKzYzOCw3IEBACiAJICogbW9kdWxlIGluc2VydGlvbi9yZW1vdmFsIGRvZXNuJ3QgY2hhbmdlIGFueXRoaW5nCiAJICogdW5kZXIgdXMuCiAJICovCi0JZG93bigmc3RhdGUtPnNlbSk7CisJbXV0ZXhfbG9jaygmc3RhdGUtPm11dGV4KTsKIAogCWNoYW5nZV9pcnEgID0gbmV3X3NlcmlhbC5pcnEgIT0gcG9ydC0+aXJxOwogCkBAIC03OTYsNyArNzk3LDcgQEAKIAl9IGVsc2UKIAkJcmV0dmFsID0gdWFydF9zdGFydHVwKHN0YXRlLCAxKTsKICBleGl0OgotCXVwKCZzdGF0ZS0+c2VtKTsKKwltdXRleF91bmxvY2soJnN0YXRlLT5tdXRleCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtODMzLDcgKzgzNCw3IEBACiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwogCWludCByZXN1bHQgPSAtRUlPOwogCi0JZG93bigmc3RhdGUtPnNlbSk7CisJbXV0ZXhfbG9jaygmc3RhdGUtPm11dGV4KTsKIAlpZiAoKCFmaWxlIHx8ICF0dHlfaHVuZ191cF9wKGZpbGUpKSAmJgogCSAgICAhKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKSkgewogCQlyZXN1bHQgPSBwb3J0LT5tY3RybDsKQEAgLTg0Miw3ICs4NDMsNyBAQAogCQlyZXN1bHQgfD0gcG9ydC0+b3BzLT5nZXRfbWN0cmwocG9ydCk7CiAJCXNwaW5fdW5sb2NrX2lycSgmcG9ydC0+bG9jayk7CiAJfQotCXVwKCZzdGF0ZS0+c2VtKTsKKwltdXRleF91bmxvY2soJnN0YXRlLT5tdXRleCk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtODU1LDEzICs4NTYsMTMgQEAKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnBvcnQ7CiAJaW50IHJldCA9IC1FSU87CiAKLQlkb3duKCZzdGF0ZS0+c2VtKTsKKwltdXRleF9sb2NrKCZzdGF0ZS0+bXV0ZXgpOwogCWlmICgoIWZpbGUgfHwgIXR0eV9odW5nX3VwX3AoZmlsZSkpICYmCiAJICAgICEodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpKSB7CiAJCXVhcnRfdXBkYXRlX21jdHJsKHBvcnQsIHNldCwgY2xlYXIpOwogCQlyZXQgPSAwOwogCX0KLQl1cCgmc3RhdGUtPnNlbSk7CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+bXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTg3MiwxMiArODczLDEyIEBACiAKIAlCVUdfT04oIWtlcm5lbF9sb2NrZWQoKSk7CiAKLQlkb3duKCZzdGF0ZS0+c2VtKTsKKwltdXRleF9sb2NrKCZzdGF0ZS0+bXV0ZXgpOwogCiAJaWYgKHBvcnQtPnR5cGUgIT0gUE9SVF9VTktOT1dOKQogCQlwb3J0LT5vcHMtPmJyZWFrX2N0bChwb3J0LCBicmVha19zdGF0ZSk7CiAKLQl1cCgmc3RhdGUtPnNlbSk7CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+bXV0ZXgpOwogfQogCiBzdGF0aWMgaW50IHVhcnRfZG9fYXV0b2NvbmZpZyhzdHJ1Y3QgdWFydF9zdGF0ZSAqc3RhdGUpCkBAIC04OTMsNyArODk0LDcgQEAKIAkgKiBjaGFuZ2luZywgYW5kIGhlbmNlIGFueSBleHRyYSBvcGVucyBvZiB0aGUgcG9ydCB3aGlsZQogCSAqIHdlJ3JlIGF1dG8tY29uZmlndXJpbmcuCiAJICovCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc3RhdGUtPnNlbSkpCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3RhdGUtPm11dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogCXJldCA9IC1FQlVTWTsKQEAgLTkxOSw3ICs5MjAsNyBAQAogCiAJCXJldCA9IHVhcnRfc3RhcnR1cChzdGF0ZSwgMSk7CiAJfQotCXVwKCZzdGF0ZS0+c2VtKTsKKwltdXRleF91bmxvY2soJnN0YXRlLT5tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTA3Myw3ICsxMDc0LDcgQEAKIAlpZiAocmV0ICE9IC1FTk9JT0NUTENNRCkKIAkJZ290byBvdXQ7CiAKLQlkb3duKCZzdGF0ZS0+c2VtKTsKKwltdXRleF9sb2NrKCZzdGF0ZS0+bXV0ZXgpOwogCiAJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpIHsKIAkJcmV0ID0gLUVJTzsKQEAgLTEwOTcsNyArMTA5OCw3IEBACiAJfQogCX0KICBvdXRfdXA6Ci0JdXAoJnN0YXRlLT5zZW0pOworCW11dGV4X3VubG9jaygmc3RhdGUtPm11dGV4KTsKICBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTExODUsNyArMTE4Niw3IEBACiAKIAlEUFJJTlRLKCJ1YXJ0X2Nsb3NlKCVkKSBjYWxsZWRcbiIsIHBvcnQtPmxpbmUpOwogCi0JZG93bigmc3RhdGUtPnNlbSk7CisJbXV0ZXhfbG9jaygmc3RhdGUtPm11dGV4KTsKIAogCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKQogCQlnb3RvIGRvbmU7CkBAIC0xMjU5LDcgKzEyNjAsNyBAQAogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc3RhdGUtPmluZm8tPm9wZW5fd2FpdCk7CiAKICBkb25lOgotCXVwKCZzdGF0ZS0+c2VtKTsKKwltdXRleF91bmxvY2soJnN0YXRlLT5tdXRleCk7CiB9CiAKIHN0YXRpYyB2b2lkIHVhcnRfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQpAQCAtMTMzMyw3ICsxMzM0LDcgQEAKIAlCVUdfT04oIWtlcm5lbF9sb2NrZWQoKSk7CiAJRFBSSU5USygidWFydF9oYW5ndXAoJWQpXG4iLCBzdGF0ZS0+cG9ydC0+bGluZSk7CiAKLQlkb3duKCZzdGF0ZS0+c2VtKTsKKwltdXRleF9sb2NrKCZzdGF0ZS0+bXV0ZXgpOwogCWlmIChzdGF0ZS0+aW5mbyAmJiBzdGF0ZS0+aW5mby0+ZmxhZ3MgJiBVSUZfTk9STUFMX0FDVElWRSkgewogCQl1YXJ0X2ZsdXNoX2J1ZmZlcih0dHkpOwogCQl1YXJ0X3NodXRkb3duKHN0YXRlKTsKQEAgLTEzNDMsNyArMTM0NCw3IEBACiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc3RhdGUtPmluZm8tPm9wZW5fd2FpdCk7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc3RhdGUtPmluZm8tPmRlbHRhX21zcl93YWl0KTsKIAl9Ci0JdXAoJnN0YXRlLT5zZW0pOworCW11dGV4X3VubG9jaygmc3RhdGUtPm11dGV4KTsKIH0KIAogLyoKQEAgLTE0NDAsMTQgKzE0NDEsMTUgQEAKIAkJICogbW9kZW0gaXMgcmVhZHkgZm9yIHVzLgogCQkgKi8KIAkJc3Bpbl9sb2NrX2lycSgmcG9ydC0+bG9jayk7CisJCXBvcnQtPm9wcy0+ZW5hYmxlX21zKHBvcnQpOwogCQltY3RybCA9IHBvcnQtPm9wcy0+Z2V0X21jdHJsKHBvcnQpOwogCQlzcGluX3VubG9ja19pcnEoJnBvcnQtPmxvY2spOwogCQlpZiAobWN0cmwgJiBUSU9DTV9DQVIpCiAJCQlicmVhazsKIAotCQl1cCgmc3RhdGUtPnNlbSk7CisJCW11dGV4X3VubG9jaygmc3RhdGUtPm11dGV4KTsKIAkJc2NoZWR1bGUoKTsKLQkJZG93bigmc3RhdGUtPnNlbSk7CisJCW11dGV4X2xvY2soJnN0YXRlLT5tdXRleCk7CiAKIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJYnJlYWs7CkBAIC0xNDcxLDkgKzE0NzMsOSBAQAogewogCXN0cnVjdCB1YXJ0X3N0YXRlICpzdGF0ZTsKIAotCWRvd24oJnBvcnRfc2VtKTsKKwltdXRleF9sb2NrKCZwb3J0X211dGV4KTsKIAlzdGF0ZSA9IGRydi0+c3RhdGUgKyBsaW5lOwotCWlmIChkb3duX2ludGVycnVwdGlibGUoJnN0YXRlLT5zZW0pKSB7CisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3RhdGUtPm11dGV4KSkgewogCQlzdGF0ZSA9IEVSUl9QVFIoLUVSRVNUQVJUU1lTKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTQ4MSw3ICsxNDgzLDcgQEAKIAlzdGF0ZS0+Y291bnQrKzsKIAlpZiAoIXN0YXRlLT5wb3J0KSB7CiAJCXN0YXRlLT5jb3VudC0tOwotCQl1cCgmc3RhdGUtPnNlbSk7CisJCW11dGV4X3VubG9jaygmc3RhdGUtPm11dGV4KTsKIAkJc3RhdGUgPSBFUlJfUFRSKC1FTlhJTyk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTE1MDIsMTMgKzE1MDQsMTMgQEAKIAkJCQkgICAgICh1bnNpZ25lZCBsb25nKXN0YXRlKTsKIAkJfSBlbHNlIHsKIAkJCXN0YXRlLT5jb3VudC0tOwotCQkJdXAoJnN0YXRlLT5zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+bXV0ZXgpOwogCQkJc3RhdGUgPSBFUlJfUFRSKC1FTk9NRU0pOwogCQl9CiAJfQogCiAgb3V0OgotCXVwKCZwb3J0X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwb3J0X211dGV4KTsKIAlyZXR1cm4gc3RhdGU7CiB9CiAKQEAgLTE1NjksNyArMTU3MSw3IEBACiAJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpIHsKIAkJcmV0dmFsID0gLUVBR0FJTjsKIAkJc3RhdGUtPmNvdW50LS07Ci0JCXVwKCZzdGF0ZS0+c2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+bXV0ZXgpOwogCQlnb3RvIGZhaWw7CiAJfQogCkBAIC0xNTg5LDcgKzE1OTEsNyBAQAogCSAqLwogCWlmIChyZXR2YWwgPT0gMCkKIAkJcmV0dmFsID0gdWFydF9ibG9ja190aWxfcmVhZHkoZmlscCwgc3RhdGUpOwotCXVwKCZzdGF0ZS0+c2VtKTsKKwltdXRleF91bmxvY2soJnN0YXRlLT5tdXRleCk7CiAKIAkvKgogCSAqIElmIHRoaXMgaXMgdGhlIGZpcnN0IG9wZW4gdG8gc3VjY2VlZCwgYWRqdXN0IHRoaW5ncyB0byBzdWl0LgpAQCAtMTg2NSw3ICsxODY3LDcgQEAKIHsKIAlzdHJ1Y3QgdWFydF9zdGF0ZSAqc3RhdGUgPSBkcnYtPnN0YXRlICsgcG9ydC0+bGluZTsKIAotCWRvd24oJnN0YXRlLT5zZW0pOworCW11dGV4X2xvY2soJnN0YXRlLT5tdXRleCk7CiAKIAlpZiAoc3RhdGUtPmluZm8gJiYgc3RhdGUtPmluZm8tPmZsYWdzICYgVUlGX0lOSVRJQUxJWkVEKSB7CiAJCXN0cnVjdCB1YXJ0X29wcyAqb3BzID0gcG9ydC0+b3BzOwpAQCAtMTg5NCw3ICsxODk2LDcgQEAKIAogCXVhcnRfY2hhbmdlX3BtKHN0YXRlLCAzKTsKIAotCXVwKCZzdGF0ZS0+c2VtKTsKKwltdXRleF91bmxvY2soJnN0YXRlLT5tdXRleCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5MDMsNyArMTkwNSw3IEBACiB7CiAJc3RydWN0IHVhcnRfc3RhdGUgKnN0YXRlID0gZHJ2LT5zdGF0ZSArIHBvcnQtPmxpbmU7CiAKLQlkb3duKCZzdGF0ZS0+c2VtKTsKKwltdXRleF9sb2NrKCZzdGF0ZS0+bXV0ZXgpOwogCiAJdWFydF9jaGFuZ2VfcG0oc3RhdGUsIDApOwogCkBAIC0xOTUyLDcgKzE5NTQsNyBAQAogCQl9CiAJfQogCi0JdXAoJnN0YXRlLT5zZW0pOworCW11dGV4X3VubG9jaygmc3RhdGUtPm11dGV4KTsKIAogCXJldHVybiAwOwogfQpAQCAtMjA0Nyw3ICsyMDQ5LDcgQEAKIAlpZiAoaW5mbyAmJiBpbmZvLT50dHkpCiAJCXR0eV92aGFuZ3VwKGluZm8tPnR0eSk7CiAKLQlkb3duKCZzdGF0ZS0+c2VtKTsKKwltdXRleF9sb2NrKCZzdGF0ZS0+bXV0ZXgpOwogCiAJc3RhdGUtPmluZm8gPSBOVUxMOwogCkBAIC0yMDcwLDcgKzIwNzIsNyBAQAogCQlrZnJlZShpbmZvKTsKIAl9CiAKLQl1cCgmc3RhdGUtPnNlbSk7CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+bXV0ZXgpOwogfQogCiBzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIHVhcnRfb3BzID0gewpAQCAtMjE1OSw3ICsyMTYxLDcgQEAKIAkJc3RhdGUtPmNsb3NlX2RlbGF5ICAgICA9IDUwMDsJLyogLjUgc2Vjb25kcyAqLwogCQlzdGF0ZS0+Y2xvc2luZ193YWl0ICAgID0gMzAwMDA7CS8qIDMwIHNlY29uZHMgKi8KIAotCQlpbml0X01VVEVYKCZzdGF0ZS0+c2VtKTsKKwkJbXV0ZXhfaW5pdCgmc3RhdGUtPm11dGV4KTsKIAl9CiAKIAlyZXR2YWwgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKG5vcm1hbCk7CkBAIC0yMjE4LDcgKzIyMjAsNyBAQAogCiAJc3RhdGUgPSBkcnYtPnN0YXRlICsgcG9ydC0+bGluZTsKIAotCWRvd24oJnBvcnRfc2VtKTsKKwltdXRleF9sb2NrKCZwb3J0X211dGV4KTsKIAlpZiAoc3RhdGUtPnBvcnQpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CkBAIC0yMjU0LDcgKzIyNTYsNyBAQAogCQlyZWdpc3Rlcl9jb25zb2xlKHBvcnQtPmNvbnMpOwogCiAgb3V0OgotCXVwKCZwb3J0X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwb3J0X211dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yMjc4LDcgKzIyODAsNyBAQAogCQlwcmludGsoS0VSTl9BTEVSVCAiUmVtb3Zpbmcgd3JvbmcgcG9ydDogJXAgIT0gJXBcbiIsCiAJCQlzdGF0ZS0+cG9ydCwgcG9ydCk7CiAKLQlkb3duKCZwb3J0X3NlbSk7CisJbXV0ZXhfbG9jaygmcG9ydF9tdXRleCk7CiAKIAkvKgogCSAqIFJlbW92ZSB0aGUgZGV2aWNlcyBmcm9tIGRldmZzCkBAIC0yMjg3LDcgKzIyODksNyBAQAogCiAJdWFydF91bmNvbmZpZ3VyZV9wb3J0KGRydiwgc3RhdGUpOwogCXN0YXRlLT5wb3J0ID0gTlVMTDsKLQl1cCgmcG9ydF9zZW0pOworCW11dGV4X3VubG9jaygmcG9ydF9tdXRleCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIzMDcsNyArMjMwOSw3IEBACiAJCXJldHVybiAocG9ydDEtPmlvYmFzZSA9PSBwb3J0Mi0+aW9iYXNlKSAmJgogCQkgICAgICAgKHBvcnQxLT5odWI2ICAgPT0gcG9ydDItPmh1YjYpOwogCWNhc2UgVVBJT19NRU06Ci0JCXJldHVybiAocG9ydDEtPm1lbWJhc2UgPT0gcG9ydDItPm1lbWJhc2UpOworCQlyZXR1cm4gKHBvcnQxLT5tYXBiYXNlID09IHBvcnQyLT5tYXBiYXNlKTsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY3MuYyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jcy5jCmluZGV4IDk2OTY5Y2IuLmMzMDMzMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jcy5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jcy5jCkBAIC03ODUsNiArNzg1LDggQEAKIAlQQ01DSUFfTUZDX0RFVklDRV9DSVNfTUFORl9DQVJEKDEsIDB4MDEwMSwgMHgwMDM1LCAiM0NYRU01NTYuY2lzIiksCiAJUENNQ0lBX01GQ19ERVZJQ0VfQ0lTX01BTkZfQ0FSRCgxLCAweDAxMDEsIDB4MDAzZCwgIjNDWEVNNTU2LmNpcyIpLAogCVBDTUNJQV9ERVZJQ0VfQ0lTX01BTkZfQ0FSRCgweDAxOTIsIDB4MDcxMCwgIlNXXzd4eF9TRVIuY2lzIiksCS8qIFNpZXJyYSBXaXJlbGVzcyBBQzcxMC9BQzc1MCBHUFJTIE5ldHdvcmsgQWRhcHRlciBSMSAqLworCVBDTUNJQV9ERVZJQ0VfQ0lTX01BTkZfQ0FSRCgweDAxOTIsIDB4YTU1NSwgIlNXXzU1NV9TRVIuY2lzIiksICAvKiBTaWVycmEgQWlyY2FyZCA1NTUgQ0RNQSAxeHJ0dCBNb2RlbSAtLSBwcmUgdXBkYXRlICovCisJUENNQ0lBX0RFVklDRV9DSVNfTUFORl9DQVJEKDB4MDEzZiwgMHhhNTU1LCAiU1dfNTU1X1NFUi5jaXMiKSwgIC8qIFNpZXJyYSBBaXJjYXJkIDU1NSBDRE1BIDF4cnR0IE1vZGVtIC0tIHBvc3QgdXBkYXRlICovCiAJUENNQ0lBX0RFVklDRV9DSVNfUFJPRF9JRDEyKCJNdWx0aVRlY2giLCAiUENNQ0lBIDU2SyBEYXRhRmF4IiwgMHg4NDIwNDdlZSwgMHhjMmVmY2YwMywgIk1UNTYzNFpMWC5jaXMiKSwKIAlQQ01DSUFfREVWSUNFX0NJU19QUk9EX0lEMTIoIkFEVkFOVEVDSCIsICJDT01wYWQtMzIvODVCLTQiLCAweDk2OTEzYTg1LCAweGNlYzhmMTAyLCAiQ09NcGFkNC5jaXMiKSwKIAlQQ01DSUFfREVWSUNFX0NJU19QUk9EX0lEMTIzKCJBRFZBTlRFQ0giLCAiQ09NcGFkLTMyLzg1IiwgIjEuMCIsIDB4OTY5MTNhODUsIDB4OGZiZTkyYWUsIDB4MDg3N2I2MjcsICJDT01wYWQyLmNpcyIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2xoN2E0MHguYyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9saDdhNDB4LmMKaW5kZXggZDAxZGJlNS4uZDRhMWYwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2xoN2E0MHguYworKysgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfbGg3YTQweC5jCkBAIC0xNDgsMTUgKzE0OCw2IEBACiAJdW5zaWduZWQgaW50IGRhdGEsIGZsYWc7LyogUmVjZWl2ZWQgZGF0YSBhbmQgc3RhdHVzICovCiAKIAl3aGlsZSAoIShVUiAocG9ydCwgVUFSVF9SX1NUQVRVUykgJiBuUnhSZHkpICYmIC0tY2JSeE1heCkgewotCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpIHsKLQkJCWlmICh0dHktPmxvd19sYXRlbmN5KQotCQkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7Ci0JCQkvKgotCQkJICogSWYgdGhpcyBmYWlsZWQgdGhlbiB3ZSB3aWxsIHRocm93IGF3YXkgdGhlCi0JCQkgKiBieXRlcyBidXQgbXVzdCBkbyBzbyB0byBjbGVhciBpbnRlcnJ1cHRzCi0JCQkgKi8KLQkJfQotCiAJCWRhdGEgPSBVUiAocG9ydCwgVUFSVF9SX0RBVEEpOwogCQlmbGFnID0gVFRZX05PUk1BTDsKIAkJKytwb3J0LT5pY291bnQucng7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfdHh4OS5jIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX3R4eDkuYwppbmRleCBmMTBjODZkLi5lZTk4YTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfdHh4OS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF90eHg5LmMKQEAgLTUyLDYgKzUyLDcgQEAKICNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTMwMywxNyArMzA0LDYgQEAKIAljaGFyIGZsYWc7CiAKIAlkbyB7Ci0JCS8qIFRoZSBmb2xsb3dpbmcgaXMgbm90IGFsbG93ZWQgYnkgdGhlIHR0eSBsYXllciBhbmQKLQkJICAgdW5zYWZlLiBJdCBzaG91bGQgYmUgZml4ZWQgQVNBUCAqLwotCQlpZiAodW5saWtlbHkodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpKSB7Ci0JCQlpZiAodHR5LT5sb3dfbGF0ZW5jeSkgewotCQkJCXNwaW5fdW5sb2NrKCZ1cC0+cG9ydC5sb2NrKTsKLQkJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCQkJCXNwaW5fbG9jaygmdXAtPnBvcnQubG9jayk7Ci0JCQl9Ci0JCQkvKiBJZiB0aGlzIGZhaWxlZCB0aGVuIHdlIHdpbGwgdGhyb3cgYXdheSB0aGUKLQkJCSAgIGJ5dGVzIGJ1dCBtdXN0IGRvIHNvIHRvIGNsZWFyIGludGVycnVwdHMgKi8KLQkJfQogCQljaCA9IHNpb19pbih1cCwgVFhYOV9TSVJGSUZPKTsKIAkJZmxhZyA9IFRUWV9OT1JNQUw7CiAJCXVwLT5wb3J0Lmljb3VudC5yeCsrOwpAQCAtMTAyOSw3ICsxMDE5LDcgQEAKIAl1YXJ0X3Jlc3VtZV9wb3J0KCZzZXJpYWxfdHh4OV9yZWcsICZzZXJpYWxfdHh4OV9wb3J0c1tsaW5lXS5wb3J0KTsKIH0KIAotc3RhdGljIERFQ0xBUkVfTVVURVgoc2VyaWFsX3R4eDlfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgoc2VyaWFsX3R4eDlfbXV0ZXgpOwogCiAvKioKICAqCXNlcmlhbF90eHg5X3JlZ2lzdGVyX3BvcnQgLSByZWdpc3RlciBhIHNlcmlhbCBwb3J0CkBAIC0xMDQ4LDcgKzEwMzgsNyBAQAogCXN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqdWFydDsKIAlpbnQgcmV0ID0gLUVOT1NQQzsKIAotCWRvd24oJnNlcmlhbF90eHg5X3NlbSk7CisJbXV0ZXhfbG9jaygmc2VyaWFsX3R4eDlfbXV0ZXgpOwogCWZvciAoaSA9IDA7IGkgPCBVQVJUX05SOyBpKyspIHsKIAkJdWFydCA9ICZzZXJpYWxfdHh4OV9wb3J0c1tpXTsKIAkJaWYgKHVhcnQtPnBvcnQudHlwZSA9PSBQT1JUX1VOS05PV04pCkBAIC0xMDY5LDcgKzEwNTksNyBAQAogCQlpZiAocmV0ID09IDApCiAJCQlyZXQgPSB1YXJ0LT5wb3J0LmxpbmU7CiAJfQotCXVwKCZzZXJpYWxfdHh4OV9zZW0pOworCW11dGV4X3VubG9jaygmc2VyaWFsX3R4eDlfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEwODQsNyArMTA3NCw3IEBACiB7CiAJc3RydWN0IHVhcnRfdHh4OV9wb3J0ICp1YXJ0ID0gJnNlcmlhbF90eHg5X3BvcnRzW2xpbmVdOwogCi0JZG93bigmc2VyaWFsX3R4eDlfc2VtKTsKKwltdXRleF9sb2NrKCZzZXJpYWxfdHh4OV9tdXRleCk7CiAJdWFydF9yZW1vdmVfb25lX3BvcnQoJnNlcmlhbF90eHg5X3JlZywgJnVhcnQtPnBvcnQpOwogCXVhcnQtPnBvcnQuZmxhZ3MgPSAwOwogCXVhcnQtPnBvcnQudHlwZSA9IFBPUlRfVU5LTk9XTjsKQEAgLTEwOTMsNyArMTA4Myw3IEBACiAJdWFydC0+cG9ydC5tZW1iYXNlID0gMDsKIAl1YXJ0LT5wb3J0LmRldiA9IE5VTEw7CiAJdWFydF9hZGRfb25lX3BvcnQoJnNlcmlhbF90eHg5X3JlZywgJnVhcnQtPnBvcnQpOwotCXVwKCZzZXJpYWxfdHh4OV9zZW0pOworCW11dGV4X3VubG9jaygmc2VyaWFsX3R4eDlfbXV0ZXgpOwogfQogCiAvKgpAQCAtMTE5NSw3ICsxMTg1LDcgQEAKIAkJc2VyaWFsX3R4eDlfcmVnaXN0ZXJfcG9ydHMoJnNlcmlhbF90eHg5X3JlZyk7CiAKICNpZmRlZiBFTkFCTEVfU0VSSUFMX1RYWDlfUENJCi0JCXJldCA9IHBjaV9tb2R1bGVfaW5pdCgmc2VyaWFsX3R4eDlfcGNpX2RyaXZlcik7CisJCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnNlcmlhbF90eHg5X3BjaV9kcml2ZXIpOwogI2VuZGlmCiAJfQogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuYyBiL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5jCmluZGV4IDQzMDc1NGUuLmE5ZTA3MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5jCkBAIC00ODIsNiArNDgyLDcgQEAKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+aW5mby0+dHR5OwogCWludCBpLCBjb3VudCwgY29waWVkID0gMDsKIAl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBmbGFnOwogCiAJc3RhdHVzID0gc2NpX2luKHBvcnQsIFNDeFNSKTsKIAlpZiAoIShzdGF0dXMgJiBTQ3hTUl9SRHhGKHBvcnQpKSkKQEAgLTQ5OSw4ICs1MDAsNyBAQAogI2VuZGlmCiAKIAkJLyogRG9uJ3QgY29weSBtb3JlIGJ5dGVzIHRoYW4gdGhlcmUgaXMgcm9vbSBmb3IgaW4gdGhlIGJ1ZmZlciAqLwotCQlpZiAodHR5LT5mbGlwLmNvdW50ICsgY291bnQgPiBUVFlfRkxJUEJVRl9TSVpFKQotCQkJY291bnQgPSBUVFlfRkxJUEJVRl9TSVpFIC0gdHR5LT5mbGlwLmNvdW50OworCQljb3VudCA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgY291bnQpOwogCiAJCS8qIElmIGZvciBhbnkgcmVhc29uIHdlIGNhbid0IGNvcHkgbW9yZSBkYXRhLCB3ZSdyZSBkb25lISAqLwogCQlpZiAoY291bnQgPT0gMCkKQEAgLTUxMiw4ICs1MTIsNyBAQAogCQkJICAgIHx8IHVhcnRfaGFuZGxlX3N5c3JxX2NoYXIocG9ydCwgYywgcmVncykpIHsKIAkJCQljb3VudCA9IDA7CiAJCQl9IGVsc2UgewotCQkJICAgIHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHJbMF0gPSBjOwotCQkJICAgIHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHJbMF0gPSBUVFlfTk9STUFMOworCQkJICAgIHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgYywgVFRZX05PUk1BTCk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlmb3IgKGk9MDsgaTxjb3VudDsgaSsrKSB7CkBAIC01NDIsMjYgKzU0MSwyMSBAQAogCQkJCX0KIAogCQkJCS8qIFN0b3JlIGRhdGEgYW5kIHN0YXR1cyAqLwotCQkJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHJbaV0gPSBjOwogCQkJCWlmIChzdGF0dXMmU0N4U1JfRkVSKHBvcnQpKSB7Ci0JCQkJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHJbaV0gPSBUVFlfRlJBTUU7CisJCQkJCWZsYWcgPSBUVFlfRlJBTUU7CiAJCQkJCXByX2RlYnVnKCJzY2k6IGZyYW1lIGVycm9yXG4iKTsKIAkJCQl9IGVsc2UgaWYgKHN0YXR1cyZTQ3hTUl9QRVIocG9ydCkpIHsKLQkJCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cltpXSA9IFRUWV9QQVJJVFk7CisJCQkJCWZsYWcgPSBUVFlfUEFSSVRZOwogCQkJCQlwcl9kZWJ1Zygic2NpOiBwYXJpdHkgZXJyb3JcbiIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHJbaV0gPSBUVFlfTk9STUFMOwotCQkJCX0KKwkJCQl9IGVsc2UKKwkJCQkJZmxhZyA9IFRUWV9OT1JNQUw7CisJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjLCBmbGFnKTsKIAkJCX0KIAkJfQogCiAJCXNjaV9pbihwb3J0LCBTQ3hTUik7IC8qIGR1bW15IHJlYWQgKi8KIAkJc2NpX291dChwb3J0LCBTQ3hTUiwgU0N4U1JfUkR4Rl9DTEVBUihwb3J0KSk7CiAKLQkJLyogVXBkYXRlIHRoZSBrZXJuZWwgYnVmZmVyIGVuZCAqLwotCQl0dHktPmZsaXAuY291bnQgKz0gY291bnQ7Ci0JCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgKz0gY291bnQ7Ci0JCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgKz0gY291bnQ7CiAJCWNvcGllZCArPSBjb3VudDsKIAkJcG9ydC0+aWNvdW50LnJ4ICs9IGNvdW50OwogCX0KQEAgLTYwOCw0OCArNjAyLDQ1IEBACiAJdW5zaWduZWQgc2hvcnQgc3RhdHVzID0gc2NpX2luKHBvcnQsIFNDeFNSKTsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+aW5mby0+dHR5OwogCi0JaWYgKHN0YXR1cyZTQ3hTUl9PUkVSKHBvcnQpICYmIHR0eS0+ZmxpcC5jb3VudDxUVFlfRkxJUEJVRl9TSVpFKSB7CisJaWYgKHN0YXR1cyZTQ3hTUl9PUkVSKHBvcnQpKSB7CiAJCS8qIG92ZXJydW4gZXJyb3IgKi8KLQkJY29waWVkKys7Ci0JCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfT1ZFUlJVTjsKKwkJaWYodHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTikpCisJCQljb3BpZWQrKzsKIAkJcHJfZGVidWcoInNjaTogb3ZlcnJ1biBlcnJvclxuIik7CiAJfQogCi0JaWYgKHN0YXR1cyZTQ3hTUl9GRVIocG9ydCkgJiYgdHR5LT5mbGlwLmNvdW50PFRUWV9GTElQQlVGX1NJWkUpIHsKKwlpZiAoc3RhdHVzJlNDeFNSX0ZFUihwb3J0KSkgewogCQlpZiAoc2NpX3J4ZF9pbihwb3J0KSA9PSAwKSB7CiAJCQkvKiBOb3RpZnkgb2YgQlJFQUsgKi8KIAkJCXN0cnVjdCBzY2lfcG9ydCAqIHNjaV9wb3J0ID0gKHN0cnVjdCBzY2lfcG9ydCAqKXBvcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmKCFzY2lfcG9ydC0+YnJlYWtfZmxhZykgewotCSAgICAgICAgICAgICAgICAgICAgICAgIHNjaV9wb3J0LT5icmVha19mbGFnID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lfc2NoZWR1bGVfYnJlYWtfdGltZXIoKHN0cnVjdCBzY2lfcG9ydCAqKXBvcnQpOworCQkJaWYoIXNjaV9wb3J0LT5icmVha19mbGFnKSB7CisJICAgICAgICAgICAgICAgIAlzY2lfcG9ydC0+YnJlYWtfZmxhZyA9IDE7CisJICAgICAgICAgICAgICAgIAlzY2lfc2NoZWR1bGVfYnJlYWtfdGltZXIoKHN0cnVjdCBzY2lfcG9ydCAqKXBvcnQpOwogCQkJCS8qIERvIHN5c3JxIGhhbmRsaW5nLiAqLwotCQkJCWlmKHVhcnRfaGFuZGxlX2JyZWFrKHBvcnQpKSB7CisJCQkJaWYodWFydF9oYW5kbGVfYnJlYWsocG9ydCkpCiAJCQkJCXJldHVybiAwOwotCQkJCX0KIAkJCSAgICAgICAgcHJfZGVidWcoInNjaTogQlJFQUsgZGV0ZWN0ZWRcbiIpOwotCQkJICAgICAgICBjb3BpZWQrKzsKLQkJCSAgICAgICAgKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9CUkVBSzsKKwkJCSAgICAgICAgaWYodHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfQlJFQUspKQorCQkJCSAgICAgICAgY29waWVkKys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KIAkJfQogCQllbHNlIHsKIAkJCS8qIGZyYW1lIGVycm9yICovCi0JCQljb3BpZWQrKzsKLQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfRlJBTUU7CisJCQlpZih0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9GUkFNRSkpCisJCQkJY29waWVkKys7CiAJCQlwcl9kZWJ1Zygic2NpOiBmcmFtZSBlcnJvclxuIik7CiAJCX0KIAl9CiAKLQlpZiAoc3RhdHVzJlNDeFNSX1BFUihwb3J0KSAmJiB0dHktPmZsaXAuY291bnQ8VFRZX0ZMSVBCVUZfU0laRSkgeworCWlmIChzdGF0dXMmU0N4U1JfUEVSKHBvcnQpKSB7CisJCWlmKHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX1BBUklUWSkpCisJCQljb3BpZWQrKzsKIAkJLyogcGFyaXR5IGVycm9yICovCi0JCWNvcGllZCsrOwotCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX1BBUklUWTsKIAkJcHJfZGVidWcoInNjaTogcGFyaXR5IGVycm9yXG4iKTsKIAl9CiAKLQlpZiAoY29waWVkKSB7Ci0JCXR0eS0+ZmxpcC5jb3VudCArPSBjb3BpZWQ7CisJaWYgKGNvcGllZCkKIAkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKLQl9CiAKIAlyZXR1cm4gY29waWVkOwogfQpAQCAtNjYxLDE1ICs2NTIsMTQgQEAKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+aW5mby0+dHR5OwogCXN0cnVjdCBzY2lfcG9ydCAqcyA9ICZzY2lfcG9ydHNbcG9ydC0+bGluZV07CiAKLQlpZiAoIXMtPmJyZWFrX2ZsYWcgJiYgc3RhdHVzICYgU0N4U1JfQlJLKHBvcnQpICYmCi0JICAgIHR0eS0+ZmxpcC5jb3VudCA8IFRUWV9GTElQQlVGX1NJWkUpIHsKKwlpZiAoIXMtPmJyZWFrX2ZsYWcgJiYgc3RhdHVzICYgU0N4U1JfQlJLKHBvcnQpKQogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDMpCiAJCS8qIERlYm91bmNlIGJyZWFrICovCiAJCXMtPmJyZWFrX2ZsYWcgPSAxOwogI2VuZGlmCiAJCS8qIE5vdGlmeSBvZiBCUkVBSyAqLwotCQljb3BpZWQrKzsKLQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9CUkVBSzsKKwkJaWYodHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfQlJFQUspKQorCQkJY29waWVkKys7CiAJCXByX2RlYnVnKCJzY2k6IEJSRUFLIGRldGVjdGVkXG4iKTsKIAl9CiAKQEAgLTY3NywxOSArNjY3LDE1IEBACiAJLyogWFhYOiBIYW5kbGUgU0NJRiBvdmVycnVuIGVycm9yICovCiAJaWYgKHBvcnQtPnR5cGUgPT0gUE9SVF9TQ0lGICYmIChzY2lfaW4ocG9ydCwgU0NMU1IpICYgU0NJRl9PUkVSKSAhPSAwKSB7CiAJCXNjaV9vdXQocG9ydCwgU0NMU1IsIDApOwotCQlpZih0dHktPmZsaXAuY291bnQ8VFRZX0ZMSVBCVUZfU0laRSkgeworCQlpZih0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9PVkVSUlVOKSkgewogCQkJY29waWVkKys7Ci0JCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gVFRZX09WRVJSVU47CiAJCQlwcl9kZWJ1Zygic2NpOiBvdmVycnVuIGVycm9yXG4iKTsKIAkJfQogCX0KICNlbmRpZgogCi0JaWYgKGNvcGllZCkgewotCQl0dHktPmZsaXAuY291bnQgKz0gY29waWVkOworCWlmIChjb3BpZWQpCiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7Ci0JfQotCiAJcmV0dXJuIGNvcGllZDsKIH0KIApAQCAtNzMyLDEyICs3MTgsOSBAQAogCQkJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPmluZm8tPnR0eTsKIAogCQkJc2NpX291dChwb3J0LCBTQ0xTUiwgMCk7Ci0JCQlpZih0dHktPmZsaXAuY291bnQ8VFRZX0ZMSVBCVUZfU0laRSkgewotCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBUVFlfT1ZFUlJVTjsKLQkJCQl0dHktPmZsaXAuY291bnQrKzsKLQkJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCQkJCXByX2RlYnVnKCJzY2lmOiBvdmVycnVuIGVycm9yXG4iKTsKLQkJCX0KKwkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pOworCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKKwkJCXByX2RlYnVnKCJzY2lmOiBvdmVycnVuIGVycm9yXG4iKTsKIAkJfQogI2VuZGlmCiAJCXNjaV9yeF9pbnRlcnJ1cHQoaXJxLCBwdHIsIHJlZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc25fY29uc29sZS5jIGIvZHJpdmVycy9zZXJpYWwvc25fY29uc29sZS5jCmluZGV4IDMxM2Y5ZGYuLjQzZTY3ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NuX2NvbnNvbGUuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zbl9jb25zb2xlLmMKQEAgLTYsNyArNiw3IEBACiAgKiBkcml2ZXIgZm9yIHRoYXQuCiAgKgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQpAQCAtNTE5LDExICs1MTksNyBAQAogCiAJCS8qIHJlY29yZCB0aGUgY2hhcmFjdGVyIHRvIHBhc3MgdXAgdG8gdGhlIHR0eSBsYXllciAqLwogCQlpZiAodHR5KSB7Ci0JCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciA9IGNoOwotCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfTk9STUFMOwotCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOwotCQkJdHR5LT5mbGlwLmNvdW50Kys7Ci0JCQlpZiAodHR5LT5mbGlwLmNvdW50ID09IFRUWV9GTElQQlVGX1NJWkUpCisJCQlpZih0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBUVFlfTk9STUFMKSA9PSAwKQogCQkJCWJyZWFrOwogCQl9CiAJCXBvcnQtPnNjX3BvcnQuaWNvdW50LnJ4Kys7CkBAIC04MzMsOCArODI5LDggQEAKIAkJbWlzYy5uYW1lID0gREVWSUNFX05BTUVfRFlOQU1JQzsKIAkJcmV0dmFsID0gbWlzY19yZWdpc3RlcigmbWlzYyk7CiAJCWlmIChyZXR2YWwgIT0gMCkgewotCQkJcHJpbnRrCi0JCQkgICAgKCJGYWlsZWQgdG8gcmVnaXN0ZXIgY29uc29sZSBkZXZpY2UgdXNpbmcgbWlzY19yZWdpc3Rlci5cbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFpbGVkIHRvIHJlZ2lzdGVyIGNvbnNvbGUgIgorCQkJICAgICAgICJkZXZpY2UgdXNpbmcgbWlzY19yZWdpc3Rlci5cbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAkJc2FsX2NvbnNvbGVfdWFydC5tYWpvciA9IE1JU0NfTUFKT1I7CkBAIC05NDYsODggKzk0Miw3NSBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCXN0cnVjdCBzbl9jb25zX3BvcnQgKnBvcnQgPSAmc2FsX2NvbnNvbGVfcG9ydDsKLSNpZiBkZWZpbmVkKENPTkZJR19TTVApIHx8IGRlZmluZWQoQ09ORklHX1BSRUVNUFQpCiAJc3RhdGljIGludCBzdG9sZV9sb2NrID0gMDsKLSNlbmRpZgogCiAJQlVHX09OKCFwb3J0LT5zY19pc19hc3luY2gpOwogCiAJLyogV2UgY2FuJ3QgbG9vayBhdCB0aGUgeG1pdCBidWZmZXIgaWYgd2UncmUgbm90IHJlZ2lzdGVyZWQgd2l0aCBzZXJpYWwgY29yZQogCSAqICB5ZXQuICBTbyBvbmx5IGRvIHRoZSBmYW5jeSByZWNvdmVyeSBhZnRlciByZWdpc3RlcmluZwogCSAqLwotCWlmIChwb3J0LT5zY19wb3J0LmluZm8pIHsKKwlpZiAoIXBvcnQtPnNjX3BvcnQuaW5mbykgeworCQkvKiBOb3QgeWV0IHJlZ2lzdGVyZWQgd2l0aCBzZXJpYWwgY29yZSAtIHNpbXBsZSBjYXNlICovCisJCXB1dHNfcmF3X2ZpeGVkKHBvcnQtPnNjX29wcy0+c2FsX3B1dHNfcmF3LCBzLCBjb3VudCk7CisJCXJldHVybjsKKwl9CiAKLQkJLyogc29tZWJvZHkgcmVhbGx5IHdhbnRzIHRoaXMgb3V0cHV0LCBtaWdodCBiZSBhbgotCQkgKiBvb3BzLCBrZGIsIHBhbmljLCBldGMuICBtYWtlIHN1cmUgdGhleSBnZXQgaXQuICovCi0jaWYgZGVmaW5lZChDT05GSUdfU01QKSB8fCBkZWZpbmVkKENPTkZJR19QUkVFTVBUKQotCQlpZiAoc3Bpbl9pc19sb2NrZWQoJnBvcnQtPnNjX3BvcnQubG9jaykpIHsKLQkJCWludCBsaGVhZCA9IHBvcnQtPnNjX3BvcnQuaW5mby0+eG1pdC5oZWFkOwotCQkJaW50IGx0YWlsID0gcG9ydC0+c2NfcG9ydC5pbmZvLT54bWl0LnRhaWw7Ci0JCQlpbnQgY291bnRlciwgZ290X2xvY2sgPSAwOworCS8qIHNvbWVib2R5IHJlYWxseSB3YW50cyB0aGlzIG91dHB1dCwgbWlnaHQgYmUgYW4KKwkgKiBvb3BzLCBrZGIsIHBhbmljLCBldGMuICBtYWtlIHN1cmUgdGhleSBnZXQgaXQuICovCisJaWYgKHNwaW5faXNfbG9ja2VkKCZwb3J0LT5zY19wb3J0LmxvY2spKSB7CisJCWludCBsaGVhZCA9IHBvcnQtPnNjX3BvcnQuaW5mby0+eG1pdC5oZWFkOworCQlpbnQgbHRhaWwgPSBwb3J0LT5zY19wb3J0LmluZm8tPnhtaXQudGFpbDsKKwkJaW50IGNvdW50ZXIsIGdvdF9sb2NrID0gMDsKIAotCQkJLyoKLQkJCSAqIFdlIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIGlmIHNvbWVvbmUgaGFzIGRpZWQgd2l0aCB0aGUKLQkJCSAqIGxvY2suIFdlIHdhaXQgfjIwIHNlY3MgYWZ0ZXIgdGhlIGhlYWQgYW5kIHRhaWwgcHRycwotCQkJICogc3RvcCBtb3ZpbmcgYW5kIGFzc3VtZSB0aGUgbG9jayBob2xkZXIgaXMgbm90IGZ1bmN0aW9uYWwKLQkJCSAqIGFuZCBwbG93IGFoZWFkLiBJZiB0aGUgbG9jayBpcyBmcmVlZCB3aXRoaW4gdGhlIHRpbWUgb3V0Ci0JCQkgKiBwZXJpb2Qgd2UgcmUtZ2V0IHRoZSBsb2NrIGFuZCBnbyBhaGVhZCBub3JtYWxseS4gV2UgYWxzbwotCQkJICogcmVtZW1iZXIgaWYgd2UgaGF2ZSBwbG93ZWQgYWhlYWQgc28gdGhhdCB3ZSBkb24ndCBoYXZlCi0JCQkgKiB0byB3YWl0IG91dCB0aGUgdGltZSBvdXQgcGVyaW9kIGFnYWluIC0gdGhlIGFzdW1wdGlvbgotCQkJICogaXMgdGhhdCB3ZSB3aWxsIHRpbWUgb3V0IGFnYWluLgotCQkJICovCisJCS8qCisJCSAqIFdlIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIGlmIHNvbWVvbmUgaGFzIGRpZWQgd2l0aCB0aGUKKwkJICogbG9jay4gV2Ugd2FpdCB+MjAgc2VjcyBhZnRlciB0aGUgaGVhZCBhbmQgdGFpbCBwdHJzCisJCSAqIHN0b3AgbW92aW5nIGFuZCBhc3N1bWUgdGhlIGxvY2sgaG9sZGVyIGlzIG5vdCBmdW5jdGlvbmFsCisJCSAqIGFuZCBwbG93IGFoZWFkLiBJZiB0aGUgbG9jayBpcyBmcmVlZCB3aXRoaW4gdGhlIHRpbWUgb3V0CisJCSAqIHBlcmlvZCB3ZSByZS1nZXQgdGhlIGxvY2sgYW5kIGdvIGFoZWFkIG5vcm1hbGx5LiBXZSBhbHNvCisJCSAqIHJlbWVtYmVyIGlmIHdlIGhhdmUgcGxvd2VkIGFoZWFkIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZQorCQkgKiB0byB3YWl0IG91dCB0aGUgdGltZSBvdXQgcGVyaW9kIGFnYWluIC0gdGhlIGFzdW1wdGlvbgorCQkgKiBpcyB0aGF0IHdlIHdpbGwgdGltZSBvdXQgYWdhaW4uCisJCSAqLwogCi0JCQlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgMTUwOyBtZGVsYXkoMTI1KSwgY291bnRlcisrKSB7Ci0JCQkJaWYgKCFzcGluX2lzX2xvY2tlZCgmcG9ydC0+c2NfcG9ydC5sb2NrKQotCQkJCSAgICB8fCBzdG9sZV9sb2NrKSB7Ci0JCQkJCWlmICghc3RvbGVfbG9jaykgewotCQkJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPgotCQkJCQkJCQkgIHNjX3BvcnQubG9jaywKLQkJCQkJCQkJICBmbGFncyk7Ci0JCQkJCQlnb3RfbG9jayA9IDE7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogc3RpbGwgbG9ja2VkICovCi0JCQkJCWlmICgobGhlYWQgIT0KLQkJCQkJICAgICBwb3J0LT5zY19wb3J0LmluZm8tPnhtaXQuaGVhZCkKLQkJCQkJICAgIHx8IChsdGFpbCAhPQotCQkJCQkJcG9ydC0+c2NfcG9ydC5pbmZvLT54bWl0LgotCQkJCQkJdGFpbCkpIHsKLQkJCQkJCWxoZWFkID0KLQkJCQkJCSAgICBwb3J0LT5zY19wb3J0LmluZm8tPnhtaXQuCi0JCQkJCQkgICAgaGVhZDsKLQkJCQkJCWx0YWlsID0KLQkJCQkJCSAgICBwb3J0LT5zY19wb3J0LmluZm8tPnhtaXQuCi0JCQkJCQkgICAgdGFpbDsKLQkJCQkJCWNvdW50ZXIgPSAwOwotCQkJCQl9CisJCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCAxNTA7IG1kZWxheSgxMjUpLCBjb3VudGVyKyspIHsKKwkJCWlmICghc3Bpbl9pc19sb2NrZWQoJnBvcnQtPnNjX3BvcnQubG9jaykKKwkJCSAgICB8fCBzdG9sZV9sb2NrKSB7CisJCQkJaWYgKCFzdG9sZV9sb2NrKSB7CisJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5zY19wb3J0LmxvY2ssCisJCQkJCQkJICBmbGFncyk7CisJCQkJCWdvdF9sb2NrID0gMTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCS8qIHN0aWxsIGxvY2tlZCAqLworCQkJCWlmICgobGhlYWQgIT0gcG9ydC0+c2NfcG9ydC5pbmZvLT54bWl0LmhlYWQpCisJCQkJICAgIHx8IChsdGFpbCAhPQorCQkJCQlwb3J0LT5zY19wb3J0LmluZm8tPnhtaXQudGFpbCkpIHsKKwkJCQkJbGhlYWQgPQorCQkJCQkJcG9ydC0+c2NfcG9ydC5pbmZvLT54bWl0LmhlYWQ7CisJCQkJCWx0YWlsID0KKwkJCQkJCXBvcnQtPnNjX3BvcnQuaW5mby0+eG1pdC50YWlsOworCQkJCQljb3VudGVyID0gMDsKIAkJCQl9CiAJCQl9Ci0JCQkvKiBmbHVzaCBhbnl0aGluZyBpbiB0aGUgc2VyaWFsIGNvcmUgeG1pdCBidWZmZXIsIHJhdyAqLwotCQkJc25fdHJhbnNtaXRfY2hhcnMocG9ydCwgMSk7Ci0JCQlpZiAoZ290X2xvY2spIHsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5zY19wb3J0LmxvY2ssCi0JCQkJCQkgICAgICAgZmxhZ3MpOwotCQkJCXN0b2xlX2xvY2sgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBmZWxsIHRocnUgKi8KLQkJCQlzdG9sZV9sb2NrID0gMTsKLQkJCX0KLQkJCXB1dHNfcmF3X2ZpeGVkKHBvcnQtPnNjX29wcy0+c2FsX3B1dHNfcmF3LCBzLCBjb3VudCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdG9sZV9sb2NrID0gMDsKLSNlbmRpZgotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPnNjX3BvcnQubG9jaywgZmxhZ3MpOwotCQkJc25fdHJhbnNtaXRfY2hhcnMocG9ydCwgMSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5zY19wb3J0LmxvY2ssIGZsYWdzKTsKLQotCQkJcHV0c19yYXdfZml4ZWQocG9ydC0+c2Nfb3BzLT5zYWxfcHV0c19yYXcsIHMsIGNvdW50KTsKLSNpZiBkZWZpbmVkKENPTkZJR19TTVApIHx8IGRlZmluZWQoQ09ORklHX1BSRUVNUFQpCiAJCX0KLSNlbmRpZgotCX0KLQllbHNlIHsKLQkJLyogTm90IHlldCByZWdpc3RlcmVkIHdpdGggc2VyaWFsIGNvcmUgLSBzaW1wbGUgY2FzZSAqLworCQkvKiBmbHVzaCBhbnl0aGluZyBpbiB0aGUgc2VyaWFsIGNvcmUgeG1pdCBidWZmZXIsIHJhdyAqLworCQlzbl90cmFuc21pdF9jaGFycyhwb3J0LCAxKTsKKwkJaWYgKGdvdF9sb2NrKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5zY19wb3J0LmxvY2ssIGZsYWdzKTsKKwkJCXN0b2xlX2xvY2sgPSAwOworCQl9IGVsc2UgeworCQkJLyogZmVsbCB0aHJ1ICovCisJCQlzdG9sZV9sb2NrID0gMTsKKwkJfQorCQlwdXRzX3Jhd19maXhlZChwb3J0LT5zY19vcHMtPnNhbF9wdXRzX3JhdywgcywgY291bnQpOworCX0gZWxzZSB7CisJCXN0b2xlX2xvY2sgPSAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+c2NfcG9ydC5sb2NrLCBmbGFncyk7CisJCXNuX3RyYW5zbWl0X2NoYXJzKHBvcnQsIDEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5zY19wb3J0LmxvY2ssIGZsYWdzKTsKKwogCQlwdXRzX3Jhd19maXhlZChwb3J0LT5zY19vcHMtPnNhbF9wdXRzX3JhdywgcywgY291bnQpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bmNvcmUuYyBiL2RyaXZlcnMvc2VyaWFsL3N1bmNvcmUuYwppbmRleCA1ZmM0YTYyLi5mYTRhZTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zdW5jb3JlLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3VuY29yZS5jCkBAIC0zNCw2ICszNCw3IEBACiAJY2hhciAqbW9kZV9wcm9wID0gInR0eVgtbW9kZSI7CiAJY2hhciAqY2RfcHJvcCA9ICJ0dHlYLWlnbm9yZS1jZCI7CiAJY2hhciAqZHRyX3Byb3AgPSAidHR5WC1ydHMtZHRyLW9mZiI7CisJY2hhciAqc3NwX2NvbnNvbGVfbW9kZXNfcHJvcCA9ICJzc3AtY29uc29sZS1tb2RlcyI7CiAJaW50IGJhdWQsIGJpdHMsIHN0b3AsIGNmbGFnOwogCWNoYXIgcGFyaXR5OwogCWludCBjYXJyaWVyID0gMDsKQEAgLTQzLDE0ICs0NCwzOSBAQAogCWlmICghc2VyaWFsX2NvbnNvbGUpCiAJCXJldHVybjsKIAotCWlmIChzZXJpYWxfY29uc29sZSA9PSAxKSB7CisJc3dpdGNoIChzZXJpYWxfY29uc29sZSkgeworCWNhc2UgUFJPTURFVl9PVFRZQToKIAkJbW9kZV9wcm9wWzNdID0gJ2EnOwogCQljZF9wcm9wWzNdID0gJ2EnOwogCQlkdHJfcHJvcFszXSA9ICdhJzsKLQl9IGVsc2UgeworCQlicmVhazsKKworCWNhc2UgUFJPTURFVl9PVFRZQjoKIAkJbW9kZV9wcm9wWzNdID0gJ2InOwogCQljZF9wcm9wWzNdID0gJ2InOwogCQlkdHJfcHJvcFszXSA9ICdiJzsKKwkJYnJlYWs7CisKKwljYXNlIFBST01ERVZfT1JTQzoKKworCQluZCA9IHByb21fcGF0aHRvaW5vZGUoInJzYyIpOworCQlpZiAoIW5kKSB7CisJCQlzdHJjcHkobW9kZSwgIjExNTIwMCw4LG4sMSwtIik7CisJCQlnb3RvIG5vX29wdGlvbnM7CisJCX0KKworCQlpZiAoIXByb21fbm9kZV9oYXNfcHJvcGVydHkobmQsIHNzcF9jb25zb2xlX21vZGVzX3Byb3ApKSB7CisJCQlzdHJjcHkobW9kZSwgIjExNTIwMCw4LG4sMSwtIik7CisJCQlnb3RvIG5vX29wdGlvbnM7CisJCX0KKworCQltZW1zZXQobW9kZSwgMCwgc2l6ZW9mKG1vZGUpKTsKKwkJcHJvbV9nZXRzdHJpbmcobmQsIHNzcF9jb25zb2xlX21vZGVzX3Byb3AsIG1vZGUsIHNpemVvZihtb2RlKSk7CisJCWdvdG8gbm9fb3B0aW9uczsKKworCWRlZmF1bHQ6CisJCXN0cmNweShtb2RlLCAiOTYwMCw4LG4sMSwtIik7CisJCWdvdG8gbm9fb3B0aW9uczsKIAl9CiAKIAl0b3BuZCA9IHByb21fZ2V0Y2hpbGQocHJvbV9yb290X25vZGUpOwpAQCAtMTEwLDYgKzEzNiwxMCBAQAogCQljYXNlIDk2MDA6IGNmbGFnIHw9IEI5NjAwOyBicmVhazsKIAkJY2FzZSAxOTIwMDogY2ZsYWcgfD0gQjE5MjAwOyBicmVhazsKIAkJY2FzZSAzODQwMDogY2ZsYWcgfD0gQjM4NDAwOyBicmVhazsKKwkJY2FzZSA1NzYwMDogY2ZsYWcgfD0gQjU3NjAwOyBicmVhazsKKwkJY2FzZSAxMTUyMDA6IGNmbGFnIHw9IEIxMTUyMDA7IGJyZWFrOworCQljYXNlIDIzMDQwMDogY2ZsYWcgfD0gQjIzMDQwMDsgYnJlYWs7CisJCWNhc2UgNDYwODAwOiBjZmxhZyB8PSBCNDYwODAwOyBicmVhazsKIAkJZGVmYXVsdDogYmF1ZCA9IDk2MDA7IGNmbGFnIHw9IEI5NjAwOyBicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bnNhYi5jIGIvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKaW5kZXggYmE5MzgxZi4uOGJjYWViYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKQEAgLTE1OSwyMSArMTU5LDE0IEBACiAJCXNhd19jb25zb2xlX2JyayA9IDE7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQl1bnNpZ25lZCBjaGFyIGNoID0gYnVmW2ldOworCQl1bnNpZ25lZCBjaGFyIGNoID0gYnVmW2ldLCBmbGFnOwogCiAJCWlmICh0dHkgPT0gTlVMTCkgewogCQkJdWFydF9oYW5kbGVfc3lzcnFfY2hhcigmdXAtPnBvcnQsIGNoLCByZWdzKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJaWYgKHVubGlrZWx5KHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSkgewotCQkJdHR5LT5mbGlwLndvcmsuZnVuYygodm9pZCAqKXR0eSk7Ci0JCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpCi0JCQkJcmV0dXJuIHR0eTsgLy8gaWYgVFRZX0RPTlRfRkxJUCBpcyBzZXQKLQkJfQotCi0JCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyID0gY2g7Ci0JCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX05PUk1BTDsKKwkJZmxhZyA9IFRUWV9OT1JNQUw7CiAJCXVwLT5wb3J0Lmljb3VudC5yeCsrOwogCiAJCWlmICh1bmxpa2VseShzdGF0LT5zcmVnLmlzcjAgJiAoU0FCODI1MzJfSVNSMF9QRVJSIHwKQEAgLTIwOSwzNCArMjAyLDIxIEBACiAJCQlzdGF0LT5zcmVnLmlzcjEgJj0gKCh1cC0+cG9ydC5yZWFkX3N0YXR1c19tYXNrID4+IDgpICYgMHhmZik7CiAKIAkJCWlmIChzdGF0LT5zcmVnLmlzcjEgJiBTQUI4MjUzMl9JU1IxX0JSSykgewotCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX0JSRUFLOworCQkJCWZsYWcgPSBUVFlfQlJFQUs7CiAJCQl9IGVsc2UgaWYgKHN0YXQtPnNyZWcuaXNyMCAmIFNBQjgyNTMyX0lTUjBfUEVSUikKLQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9QQVJJVFk7CisJCQkJZmxhZyA9IFRUWV9QQVJJVFk7CiAJCQllbHNlIGlmIChzdGF0LT5zcmVnLmlzcjAgJiBTQUI4MjUzMl9JU1IwX0ZFUlIpCi0JCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfRlJBTUU7CisJCQkJZmxhZyA9IFRUWV9GUkFNRTsKIAkJfQogCiAJCWlmICh1YXJ0X2hhbmRsZV9zeXNycV9jaGFyKCZ1cC0+cG9ydCwgY2gsIHJlZ3MpKQogCQkJY29udGludWU7CiAKIAkJaWYgKChzdGF0LT5zcmVnLmlzcjAgJiAodXAtPnBvcnQuaWdub3JlX3N0YXR1c19tYXNrICYgMHhmZikpID09IDAgJiYKLQkJICAgIChzdGF0LT5zcmVnLmlzcjEgJiAoKHVwLT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzayA+PiA4KSAmIDB4ZmYpKSA9PSAwKXsKLQkJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKzsKLQkJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKzsKLQkJCXR0eS0+ZmxpcC5jb3VudCsrOwotCQl9Ci0JCWlmICgoc3RhdC0+c3JlZy5pc3IwICYgU0FCODI1MzJfSVNSMF9SRk8pICYmCi0JCSAgICB0dHktPmZsaXAuY291bnQgPCBUVFlfRkxJUEJVRl9TSVpFKSB7Ci0JCQkvKgotCQkJICogT3ZlcnJ1biBpcyBzcGVjaWFsLCBzaW5jZSBpdCdzIHJlcG9ydGVkCi0JCQkgKiBpbW1lZGlhdGVseSwgYW5kIGRvZXNuJ3QgYWZmZWN0IHRoZSBjdXJyZW50Ci0JCQkgKiBjaGFyYWN0ZXIuCi0JCQkgKi8KLQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX09WRVJSVU47Ci0JCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyKys7Ci0JCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyKys7Ci0JCQl0dHktPmZsaXAuY291bnQrKzsKLQkJfQorCQkgICAgKHN0YXQtPnNyZWcuaXNyMSAmICgodXAtPnBvcnQuaWdub3JlX3N0YXR1c19tYXNrID4+IDgpICYgMHhmZikpID09IDApCisJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBmbGFnKTsKKwkJaWYgKHN0YXQtPnNyZWcuaXNyMCAmIFNBQjgyNTMyX0lTUjBfUkZPKQorCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTik7CiAJfQogCiAJaWYgKHNhd19jb25zb2xlX2JyaykKQEAgLTkxNyw5ICs4OTcsNiBAQAogCiAJc3Vuc2VyaWFsX2NvbnNvbGVfdGVybWlvcyhjb24pOwogCi0JLyogRmlybXdhcmUgY29uc29sZSBzcGVlZCBpcyBsaW1pdGVkIHRvIDE1MC0tPjM4NDAwIGJhdWQgc28KLQkgKiB0aGlzIGhhY2tpc2ggY2ZsYWcgdGhpbmcgaXMgT0suCi0JICovCiAJc3dpdGNoIChjb24tPmNmbGFnICYgQ0JBVUQpIHsKIAljYXNlIEIxNTA6IGJhdWQgPSAxNTA7IGJyZWFrOwogCWNhc2UgQjMwMDogYmF1ZCA9IDMwMDsgYnJlYWs7CkBAIC05MzAsNiArOTA3LDEwIEBACiAJZGVmYXVsdDogY2FzZSBCOTYwMDogYmF1ZCA9IDk2MDA7IGJyZWFrOwogCWNhc2UgQjE5MjAwOiBiYXVkID0gMTkyMDA7IGJyZWFrOwogCWNhc2UgQjM4NDAwOiBiYXVkID0gMzg0MDA7IGJyZWFrOworCWNhc2UgQjU3NjAwOiBiYXVkID0gNTc2MDA7IGJyZWFrOworCWNhc2UgQjExNTIwMDogYmF1ZCA9IDExNTIwMDsgYnJlYWs7CisJY2FzZSBCMjMwNDAwOiBiYXVkID0gMjMwNDAwOyBicmVhazsKKwljYXNlIEI0NjA4MDA6IGJhdWQgPSA0NjA4MDA7IGJyZWFrOwogCX07CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc3Vuc3UuYyBiL2RyaXZlcnMvc2VyaWFsL3N1bnN1LmMKaW5kZXggZjA3Mzg1My4uOWEzNjY1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc3Vuc3UuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zdW5zdS5jCkBAIC0zMjMsMTkgKzMyMywxMyBAQAogcmVjZWl2ZV9jaGFycyhzdHJ1Y3QgdWFydF9zdW5zdV9wb3J0ICp1cCwgdW5zaWduZWQgY2hhciAqc3RhdHVzLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gdXAtPnBvcnQuaW5mby0+dHR5OwotCXVuc2lnbmVkIGNoYXIgY2g7CisJdW5zaWduZWQgY2hhciBjaCwgZmxhZzsKIAlpbnQgbWF4X2NvdW50ID0gMjU2OwogCWludCBzYXdfY29uc29sZV9icmsgPSAwOwogCiAJZG8gewotCQlpZiAodW5saWtlbHkodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpKSB7Ci0JCQl0dHktPmZsaXAud29yay5mdW5jKCh2b2lkICopdHR5KTsKLQkJCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkKLQkJCQlyZXR1cm4gdHR5OyAvLyBpZiBUVFlfRE9OVF9GTElQIGlzIHNldAotCQl9CiAJCWNoID0gc2VyaWFsX2lucCh1cCwgVUFSVF9SWCk7Ci0JCSp0dHktPmZsaXAuY2hhcl9idWZfcHRyID0gY2g7Ci0JCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX05PUk1BTDsKKwkJZmxhZyA9IFRUWV9OT1JNQUw7CiAJCXVwLT5wb3J0Lmljb3VudC5yeCsrOwogCiAJCWlmICh1bmxpa2VseSgqc3RhdHVzICYgKFVBUlRfTFNSX0JJIHwgVUFSVF9MU1JfUEUgfApAQCAtMzc3LDMxICszNzEsMjMgQEAKIAkJCX0KIAogCQkJaWYgKCpzdGF0dXMgJiBVQVJUX0xTUl9CSSkgewotCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX0JSRUFLOworCQkJCWZsYWcgPSBUVFlfQlJFQUs7CiAJCQl9IGVsc2UgaWYgKCpzdGF0dXMgJiBVQVJUX0xTUl9QRSkKLQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9QQVJJVFk7CisJCQkJZmxhZyA9IFRUWV9QQVJJVFk7CiAJCQllbHNlIGlmICgqc3RhdHVzICYgVUFSVF9MU1JfRkUpCi0JCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfRlJBTUU7CisJCQkJZmxhZyA9IFRUWV9GUkFNRTsKIAkJfQogCQlpZiAodWFydF9oYW5kbGVfc3lzcnFfY2hhcigmdXAtPnBvcnQsIGNoLCByZWdzKSkKIAkJCWdvdG8gaWdub3JlX2NoYXI7Ci0JCWlmICgoKnN0YXR1cyAmIHVwLT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzaykgPT0gMCkgewotCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOwotCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOwotCQkJdHR5LT5mbGlwLmNvdW50Kys7Ci0JCX0KLQkJaWYgKCgqc3RhdHVzICYgVUFSVF9MU1JfT0UpICYmCi0JCSAgICB0dHktPmZsaXAuY291bnQgPCBUVFlfRkxJUEJVRl9TSVpFKSB7CisJCWlmICgoKnN0YXR1cyAmIHVwLT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzaykgPT0gMCkKKwkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY2gsIGZsYWcpOworCQlpZiAoKnN0YXR1cyAmIFVBUlRfTFNSX09FKQogCQkJLyoKIAkJCSAqIE92ZXJydW4gaXMgc3BlY2lhbCwgc2luY2UgaXQncyByZXBvcnRlZAogCQkJICogaW1tZWRpYXRlbHksIGFuZCBkb2Vzbid0IGFmZmVjdCB0aGUgY3VycmVudAogCQkJICogY2hhcmFjdGVyLgogCQkJICovCi0JCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9PVkVSUlVOOwotCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOwotCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOwotCQkJdHR5LT5mbGlwLmNvdW50Kys7Ci0JCX0KKwkJCSB0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9PVkVSUlVOKTsKIAlpZ25vcmVfY2hhcjoKIAkJKnN0YXR1cyA9IHNlcmlhbF9pbnAodXAsIFVBUlRfTFNSKTsKIAl9IHdoaWxlICgoKnN0YXR1cyAmIFVBUlRfTFNSX0RSKSAmJiAobWF4X2NvdW50LS0gPiAwKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zdW56aWxvZy5jIGIvZHJpdmVycy9zZXJpYWwvc3Vuemlsb2cuYwppbmRleCA3NjUzZDZjLi4zYzcyNDg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zdW56aWxvZy5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3N1bnppbG9nLmMKQEAgLTMxOSw3ICszMTksNyBAQAogCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKLQl1bnNpZ25lZCBjaGFyIGNoLCByMTsKKwl1bnNpZ25lZCBjaGFyIGNoLCByMSwgZmxhZzsKIAogCXR0eSA9IE5VTEw7CiAJaWYgKHVwLT5wb3J0LmluZm8gIT0gTlVMTCAmJgkJLyogVW5vcGVuZWQgc2VyaWFsIGNvbnNvbGUgKi8KQEAgLTM2MiwxOSArMzYyLDggQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJaWYgKHVubGlrZWx5KHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSkgewotCQkJdHR5LT5mbGlwLndvcmsuZnVuYygodm9pZCAqKXR0eSk7Ci0JCQkvKgotCQkJICogVGhlIDgyNTAgYmFpbHMgb3V0IG9mIHRoZSBsb29wIGhlcmUsCi0JCQkgKiBidXQgd2UgbmVlZCB0byByZWFkIGV2ZXJ5dGhpbmcsIG9yIGRpZS4KLQkJCSAqLwotCQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKQotCQkJCWNvbnRpbnVlOwotCQl9Ci0KIAkJLyogQSByZWFsIHNlcmlhbCBsaW5lLCByZWNvcmQgdGhlIGNoYXJhY3RlciBhbmQgc3RhdHVzLiAgKi8KLQkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgPSBjaDsKLQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfTk9STUFMOworCQlmbGFnID0gVFRZX05PUk1BTDsKIAkJdXAtPnBvcnQuaWNvdW50LnJ4Kys7CiAJCWlmIChyMSAmIChCUktfQUJSVCB8IFBBUl9FUlIgfCBSeF9PVlIgfCBDUkNfRVJSKSkgewogCQkJaWYgKHIxICYgQlJLX0FCUlQpIHsKQEAgLTM5MSwyOCArMzgwLDIxIEBACiAJCQkJdXAtPnBvcnQuaWNvdW50Lm92ZXJydW4rKzsKIAkJCXIxICY9IHVwLT5wb3J0LnJlYWRfc3RhdHVzX21hc2s7CiAJCQlpZiAocjEgJiBCUktfQUJSVCkKLQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9CUkVBSzsKKwkJCQlmbGFnID0gVFRZX0JSRUFLOwogCQkJZWxzZSBpZiAocjEgJiBQQVJfRVJSKQotCQkJCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyID0gVFRZX1BBUklUWTsKKwkJCQlmbGFnID0gVFRZX1BBUklUWTsKIAkJCWVsc2UgaWYgKHIxICYgQ1JDX0VSUikKLQkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9GUkFNRTsKKwkJCQlmbGFnID0gVFRZX0ZSQU1FOwogCQl9CiAJCWlmICh1YXJ0X2hhbmRsZV9zeXNycV9jaGFyKCZ1cC0+cG9ydCwgY2gsIHJlZ3MpKQogCQkJY29udGludWU7CiAKIAkJaWYgKHVwLT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzayA9PSAweGZmIHx8CiAJCSAgICAocjEgJiB1cC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2spID09IDApIHsKLQkJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKzsKLQkJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKzsKLQkJCXR0eS0+ZmxpcC5jb3VudCsrOworCQkgICAgCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY2gsIGZsYWcpOwogCQl9Ci0JCWlmICgocjEgJiBSeF9PVlIpICYmCi0JCSAgICB0dHktPmZsaXAuY291bnQgPCBUVFlfRkxJUEJVRl9TSVpFKSB7Ci0JCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9PVkVSUlVOOwotCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOwotCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrOwotCQkJdHR5LT5mbGlwLmNvdW50Kys7Ci0JCX0KKwkJaWYgKHIxICYgUnhfT1ZSKQorCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTik7CiAJfQogCiAJcmV0dXJuIHR0eTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3VhcnQwMC5jIGIvZHJpdmVycy9zZXJpYWwvdWFydDAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YjUwNGYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zZXJpYWwvdWFydDAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ODIgKzAsMCBAQAotLyoKLSAqICBsaW51eC9kcml2ZXJzL3NlcmlhbC91YXJ0MDAuYwotICoKLSAqICBEcml2ZXIgZm9yIFVBUlQwMCBzZXJpYWwgcG9ydHMKLSAqCi0gKiAgQmFzZWQgb24gZHJpdmVycy9jaGFyL3NlcmlhbF9hbWJhLmMsIGJ5IEFSTSBMaW1pdGVkICYgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkLgotICogIENvcHlyaWdodCAyMDAxIEFsdGVyYSBDb3Jwb3JhdGlvbgotICoKLSAqICBVcGRhdGUgZm9yIDIuNi40IGJ5IERpcmsgQmVobWUgPGRpcmsuYmVobWVAZGUuYm9zY2guY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqCi0gKiAgJElkOiB1YXJ0MDAuYyx2IDEuMzUgMjAwMi8wNy8yOCAxMDowMzoyOCBybWsgRXhwICQKLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLQotI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9VQVJUMDBfQ09OU09MRSkgJiYgZGVmaW5lZChDT05GSUdfTUFHSUNfU1lTUlEpCi0jZGVmaW5lIFNVUFBPUlRfU1lTUlEKLSNlbmRpZgotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNycS5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KLQotI2luY2x1ZGUgPGFzbS9hcmNoL2V4Y2FsaWJ1ci5oPgotI2RlZmluZSBVQVJUMDBfVFlQRSAodm9sYXRpbGUgdW5zaWduZWQgaW50KikKLSNpbmNsdWRlIDxhc20vYXJjaC91YXJ0MDAuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9pbnRfY3RybDAwLmg+Ci0KLSNkZWZpbmUgVUFSVF9OUgkJMgotCi0jZGVmaW5lIFNFUklBTF9VQVJUMDBfTkFNRQkidHR5VUEiCi0jZGVmaW5lIFNFUklBTF9VQVJUMDBfTUFKT1IJMjA0Ci0jZGVmaW5lIFNFUklBTF9VQVJUMDBfTUlOT1IJMTYgICAgICAvKiBUZW1wb3JhcnkgLSB3aWxsIGNoYW5nZSBpbiBmdXR1cmUgKi8KLSNkZWZpbmUgU0VSSUFMX1VBUlQwMF9OUglVQVJUX05SCi0jZGVmaW5lIFVBUlRfUE9SVF9TSVpFIDB4NTAKLQotI2RlZmluZSBVQVJUMDBfSVNSX1BBU1NfTElNSVQJMjU2Ci0KLS8qCi0gKiBBY2Nlc3MgbWFjcm9zIGZvciB0aGUgVUFSVDAwIFVBUlRzCi0gKi8KLSNkZWZpbmUgVUFSVF9HRVRfSU5UX1NUQVRVUyhwKQlpbmwoVUFSVF9JU1IoKHApLT5tZW1iYXNlKSkKLSNkZWZpbmUgVUFSVF9QVVRfSUVTKHAsIGMpICAgICAgb3V0bChjLFVBUlRfSUVTKChwKS0+bWVtYmFzZSkpCi0jZGVmaW5lIFVBUlRfR0VUX0lFUyhwKSAgICAgICAgIGlubChVQVJUX0lFUygocCktPm1lbWJhc2UpKQotI2RlZmluZSBVQVJUX1BVVF9JRUMocCwgYykgICAgICBvdXRsKGMsVUFSVF9JRUMoKHApLT5tZW1iYXNlKSkKLSNkZWZpbmUgVUFSVF9HRVRfSUVDKHApICAgICAgICAgaW5sKFVBUlRfSUVDKChwKS0+bWVtYmFzZSkpCi0jZGVmaW5lIFVBUlRfUFVUX0NIQVIocCwgYykgICAgIG91dGwoYyxVQVJUX1REKChwKS0+bWVtYmFzZSkpCi0jZGVmaW5lIFVBUlRfR0VUX0NIQVIocCkgICAgICAgIGlubChVQVJUX1JEKChwKS0+bWVtYmFzZSkpCi0jZGVmaW5lIFVBUlRfR0VUX1JTUihwKSAgICAgICAgIGlubChVQVJUX1JTUigocCktPm1lbWJhc2UpKQotI2RlZmluZSBVQVJUX0dFVF9SRFMocCkgICAgICAgICBpbmwoVUFSVF9SRFMoKHApLT5tZW1iYXNlKSkKLSNkZWZpbmUgVUFSVF9HRVRfTVNSKHApICAgICAgICAgaW5sKFVBUlRfTVNSKChwKS0+bWVtYmFzZSkpCi0jZGVmaW5lIFVBUlRfR0VUX01DUihwKSAgICAgICAgIGlubChVQVJUX01DUigocCktPm1lbWJhc2UpKQotI2RlZmluZSBVQVJUX1BVVF9NQ1IocCwgYykgICAgICBvdXRsKGMsVUFSVF9NQ1IoKHApLT5tZW1iYXNlKSkKLSNkZWZpbmUgVUFSVF9HRVRfTUMocCkgICAgICAgICAgaW5sKFVBUlRfTUMoKHApLT5tZW1iYXNlKSkKLSNkZWZpbmUgVUFSVF9QVVRfTUMocCwgYykgICAgICAgb3V0bChjLFVBUlRfTUMoKHApLT5tZW1iYXNlKSkKLSNkZWZpbmUgVUFSVF9HRVRfVFNSKHApICAgICAgICAgaW5sKFVBUlRfVFNSKChwKS0+bWVtYmFzZSkpCi0jZGVmaW5lIFVBUlRfR0VUX0RJVl9ISShwKQlpbmwoVUFSVF9ESVZfSEkoKHApLT5tZW1iYXNlKSkKLSNkZWZpbmUgVUFSVF9QVVRfRElWX0hJKHAsYykJb3V0bChjLFVBUlRfRElWX0hJKChwKS0+bWVtYmFzZSkpCi0jZGVmaW5lIFVBUlRfR0VUX0RJVl9MTyhwKQlpbmwoVUFSVF9ESVZfTE8oKHApLT5tZW1iYXNlKSkKLSNkZWZpbmUgVUFSVF9QVVRfRElWX0xPKHAsYykJb3V0bChjLFVBUlRfRElWX0xPKChwKS0+bWVtYmFzZSkpCi0jZGVmaW5lIFVBUlRfUlhfREFUQShzKQkJKChzKSAmIFVBUlRfUlNSX1JYX0xFVkVMX01TSykKLSNkZWZpbmUgVUFSVF9UWF9SRUFEWShzKQkoKChzKSAmIFVBUlRfVFNSX1RYX0xFVkVMX01TSykgPCAxNSkKLS8vI2RlZmluZSBVQVJUX1RYX0VNUFRZKHApCSgoVUFSVF9HRVRfRlIocCkgJiBVQVJUMDBfVUFSVEZSX1RNU0spID09IDApCi0KLXN0YXRpYyB2b2lkIHVhcnQwMF9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JVUFSVF9QVVRfSUVDKHBvcnQsIFVBUlRfSUVDX1RJRV9NU0spOwotfQotCi1zdGF0aWMgdm9pZCB1YXJ0MDBfc3RvcF9yeChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCVVBUlRfUFVUX0lFQyhwb3J0LCBVQVJUX0lFQ19SRV9NU0spOwotfQotCi1zdGF0aWMgdm9pZCB1YXJ0MDBfZW5hYmxlX21zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JVUFSVF9QVVRfSUVTKHBvcnQsIFVBUlRfSUVTX01FX01TSyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi11YXJ0MDBfcnhfY2hhcnMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPmluZm8tPnR0eTsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzLCBjaCwgcmRzLCBmbGcsIGlnbm9yZWQgPSAwOwotCi0Jc3RhdHVzID0gVUFSVF9HRVRfUlNSKHBvcnQpOwotCXdoaWxlIChVQVJUX1JYX0RBVEEoc3RhdHVzKSkgewotCQkvKiAKLQkJICogV2UgbmVlZCB0byByZWFkIHJkcyBiZWZvcmUgcmVhZGluZyB0aGUgCi0JCSAqIGNoYXJhY3RlciBmcm9tIHRoZSBmaWZvCi0JCSAqLwotCQlyZHMgPSBVQVJUX0dFVF9SRFMocG9ydCk7Ci0JCWNoID0gVUFSVF9HRVRfQ0hBUihwb3J0KTsKLQkJcG9ydC0+aWNvdW50LnJ4Kys7Ci0KLQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKQotCQkJZ290byBpZ25vcmVfY2hhcjsKLQotCQlmbGcgPSBUVFlfTk9STUFMOwotCi0JCS8qCi0JCSAqIE5vdGUgdGhhdCB0aGUgZXJyb3IgaGFuZGxpbmcgY29kZSBpcwotCQkgKiBvdXQgb2YgdGhlIG1haW4gZXhlY3V0aW9uIHBhdGgKLQkJICovCi0JCWlmIChyZHMgJiAoVUFSVF9SRFNfQklfTVNLIHxVQVJUX1JEU19GRV9NU0t8Ci0JCQkgICBVQVJUX1JEU19QRV9NU0sgfFVBUlRfUkRTX1BFX01TSykpCi0JCQlnb3RvIGhhbmRsZV9lcnJvcjsKLQkJaWYgKHVhcnRfaGFuZGxlX3N5c3JxX2NoYXIocG9ydCwgY2gsIHJlZ3MpKQotCQkJZ290byBpZ25vcmVfY2hhcjsKLQotCWVycm9yX3JldHVybjoKLQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgZmxnKTsKLQotCWlnbm9yZV9jaGFyOgotCQlzdGF0dXMgPSBVQVJUX0dFVF9SU1IocG9ydCk7Ci0JfQotIG91dDoKLQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCXJldHVybjsKLQotIGhhbmRsZV9lcnJvcjoKLQlpZiAocmRzICYgVUFSVF9SRFNfQklfTVNLKSB7Ci0JCXN0YXR1cyAmPSB+KFVBUlRfUkRTX0ZFX01TSyB8IFVBUlRfUkRTX1BFX01TSyk7Ci0JCXBvcnQtPmljb3VudC5icmsrKzsKLQkJaWYgKHVhcnRfaGFuZGxlX2JyZWFrKHBvcnQpKQotCQkJZ290byBpZ25vcmVfY2hhcjsKLQl9IGVsc2UgaWYgKHJkcyAmIFVBUlRfUkRTX1BFX01TSykKLQkJcG9ydC0+aWNvdW50LnBhcml0eSsrOwotCWVsc2UgaWYgKHJkcyAmIFVBUlRfUkRTX0ZFX01TSykKLQkJcG9ydC0+aWNvdW50LmZyYW1lKys7Ci0JaWYgKHJkcyAmIFVBUlRfUkRTX09FX01TSykKLQkJcG9ydC0+aWNvdW50Lm92ZXJydW4rKzsKLQotCWlmIChyZHMgJiBwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2spIHsKLQkJaWYgKCsraWdub3JlZCA+IDEwMCkKLQkJCWdvdG8gb3V0OwotCQlnb3RvIGlnbm9yZV9jaGFyOwotCX0KLQlyZHMgJj0gcG9ydC0+cmVhZF9zdGF0dXNfbWFzazsKLQotCWlmIChyZHMgJiBVQVJUX1JEU19CSV9NU0spCi0JCWZsZyA9IFRUWV9CUkVBSzsKLQllbHNlIGlmIChyZHMgJiBVQVJUX1JEU19QRV9NU0spCi0JCWZsZyA9IFRUWV9QQVJJVFk7Ci0JZWxzZSBpZiAocmRzICYgVUFSVF9SRFNfRkVfTVNLKQotCQlmbGcgPSBUVFlfRlJBTUU7Ci0KLQlpZiAocmRzICYgVUFSVF9SRFNfT0VfTVNLKSB7Ci0JCS8qCi0JCSAqIENIRUNLOiBkb2VzIG92ZXJydW4gYWZmZWN0IHRoZSBjdXJyZW50IGNoYXJhY3Rlcj8KLQkJICogQVNTVU1QVElPTjogaXQgZG9lcyBub3QuCi0JCSAqLwotCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBmbGcpOwotCQljaCA9IDA7Ci0JCWZsZyA9IFRUWV9PVkVSUlVOOwotCX0KLSNpZmRlZiBTVVBQT1JUX1NZU1JRCi0JcG9ydC0+c3lzcnEgPSAwOwotI2VuZGlmCi0JZ290byBlcnJvcl9yZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIHVhcnQwMF90eF9jaGFycyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZwb3J0LT5pbmZvLT54bWl0OwotCWludCBjb3VudDsKLQotCWlmIChwb3J0LT54X2NoYXIpIHsKLQkJd2hpbGUgKChVQVJUX0dFVF9UU1IocG9ydCkgJiBVQVJUX1RTUl9UWF9MRVZFTF9NU0spID09IDE1KQotCQkJYmFycmllcigpOwotCQlVQVJUX1BVVF9DSEFSKHBvcnQsIHBvcnQtPnhfY2hhcik7Ci0JCXBvcnQtPmljb3VudC50eCsrOwotCQlwb3J0LT54X2NoYXIgPSAwOwotCQlyZXR1cm47Ci0JfQotCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkgfHwgdWFydF90eF9zdG9wcGVkKHBvcnQpKSB7Ci0JCXVhcnQwMF9zdG9wX3R4KHBvcnQpOwotCQlyZXR1cm47Ci0JfQotCi0JY291bnQgPSBwb3J0LT5maWZvc2l6ZSA+PiAxOwotCWRvIHsKLQkJd2hpbGUgKChVQVJUX0dFVF9UU1IocG9ydCkgJiBVQVJUX1RTUl9UWF9MRVZFTF9NU0spID09IDE1KQotCQkJYmFycmllcigpOwotCQlVQVJUX1BVVF9DSEFSKHBvcnQsIHhtaXQtPmJ1Zlt4bWl0LT50YWlsXSk7Ci0JCXhtaXQtPnRhaWwgPSAoeG1pdC0+dGFpbCArIDEpICYgKFVBUlRfWE1JVF9TSVpFIC0gMSk7Ci0JCXBvcnQtPmljb3VudC50eCsrOwotCQlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpKQotCQkJYnJlYWs7Ci0JfSB3aGlsZSAoLS1jb3VudCA+IDApOwotCi0JaWYgKHVhcnRfY2lyY19jaGFyc19wZW5kaW5nKHhtaXQpIDwgV0FLRVVQX0NIQVJTKQotCQl1YXJ0X3dyaXRlX3dha2V1cChwb3J0KTsKLQotCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCi0JCXVhcnQwMF9zdG9wX3R4KHBvcnQpOwotfQotCi1zdGF0aWMgdm9pZCB1YXJ0MDBfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQlVQVJUX1BVVF9JRVMocG9ydCwgVUFSVF9JRVNfVElFX01TSyk7Ci0JdWFydDAwX3R4X2NoYXJzKHBvcnQpOwotfQotCi1zdGF0aWMgdm9pZCB1YXJ0MDBfbW9kZW1fc3RhdHVzKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JdW5zaWduZWQgaW50IHN0YXR1czsKLQotCXN0YXR1cyA9IFVBUlRfR0VUX01TUihwb3J0KTsKLQotCWlmICghKHN0YXR1cyAmIChVQVJUX01TUl9EQ1RTX01TSyB8IFVBUlRfTVNSX0REU1JfTVNLIHwgCi0JCQlVQVJUX01TUl9URVJJX01TSyB8IFVBUlRfTVNSX0REQ0RfTVNLKSkpCi0JCXJldHVybjsKLQotCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERENEX01TSykKLQkJdWFydF9oYW5kbGVfZGNkX2NoYW5nZShwb3J0LCBzdGF0dXMgJiBVQVJUX01TUl9EQ0RfTVNLKTsKLQotCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERFNSX01TSykKLQkJcG9ydC0+aWNvdW50LmRzcisrOwotCi0JaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDVFNfTVNLKQotCQl1YXJ0X2hhbmRsZV9jdHNfY2hhbmdlKHBvcnQsIHN0YXR1cyAmIFVBUlRfTVNSX0NUU19NU0spOwotCi0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5pbmZvLT5kZWx0YV9tc3Jfd2FpdCk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCB1YXJ0MDBfaW50KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IGRldl9pZDsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzLCBwYXNzX2NvdW50ZXIgPSAwOwotCi0Jc3RhdHVzID0gVUFSVF9HRVRfSU5UX1NUQVRVUyhwb3J0KTsKLQlkbyB7Ci0JCWlmIChzdGF0dXMgJiBVQVJUX0lTUl9SSV9NU0spCi0JCQl1YXJ0MDBfcnhfY2hhcnMocG9ydCwgcmVncyk7Ci0JCWlmIChzdGF0dXMgJiBVQVJUX0lTUl9NSV9NU0spCi0JCQl1YXJ0MDBfbW9kZW1fc3RhdHVzKHBvcnQpOwotCQlpZiAoc3RhdHVzICYgKFVBUlRfSVNSX1RJX01TSyB8IFVBUlRfSVNSX1RJSV9NU0spKQotCQkJdWFydDAwX3R4X2NoYXJzKHBvcnQpOwotCQlpZiAocGFzc19jb3VudGVyKysgPiBVQVJUMDBfSVNSX1BBU1NfTElNSVQpCi0JCQlicmVhazsKLQotCQlzdGF0dXMgPSBVQVJUX0dFVF9JTlRfU1RBVFVTKHBvcnQpOwotCX0gd2hpbGUgKHN0YXR1cyk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdWFydDAwX3R4X2VtcHR5KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JcmV0dXJuIFVBUlRfR0VUX1RTUihwb3J0KSAmIFVBUlRfVFNSX1RYX0xFVkVMX01TSz8gMCA6IFRJT0NTRVJfVEVNVDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCB1YXJ0MDBfZ2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7Ci0JdW5zaWduZWQgaW50IHN0YXR1czsKLQotCXN0YXR1cyA9IFVBUlRfR0VUX01TUihwb3J0KTsKLQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRENEX01TSykKLQkJcmVzdWx0IHw9IFRJT0NNX0NBUjsKLQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRFNSX01TSykKLQkJcmVzdWx0IHw9IFRJT0NNX0RTUjsKLQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfQ1RTX01TSykKLQkJcmVzdWx0IHw9IFRJT0NNX0NUUzsKLQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfUklfTVNLKQotCQlyZXN1bHQgfD0gVElPQ01fUkk7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZCB1YXJ0MDBfc2V0X21jdHJsX251bGwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IG1jdHJsKQotewotfQotCi1zdGF0aWMgdm9pZCB1YXJ0MDBfYnJlYWtfY3RsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBtY3I7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCW1jciA9IFVBUlRfR0VUX01DUihwb3J0KTsKLQlpZiAoYnJlYWtfc3RhdGUgPT0gLTEpCi0JCW1jciB8PSBVQVJUX01DUl9CUl9NU0s7Ci0JZWxzZQotCQltY3IgJj0gflVBUlRfTUNSX0JSX01TSzsKLQlVQVJUX1BVVF9NQ1IocG9ydCwgbWNyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi11YXJ0MDBfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKnRlcm1pb3MsCi0JCSAgIHN0cnVjdCB0ZXJtaW9zICpvbGQpCi17Ci0JdW5zaWduZWQgaW50IHVhcnRfbWMsIG9sZF9pZXMsIGJhdWQsIHF1b3Q7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qCi0JICogV2UgZG9uJ3Qgc3VwcG9ydCBDUkVBRCAoeWV0KQotCSAqLwotCXRlcm1pb3MtPmNfY2ZsYWcgfD0gQ1JFQUQ7Ci0KLQkvKgotCSAqIEFzayB0aGUgY29yZSB0byBjYWxjdWxhdGUgdGhlIGRpdmlzb3IgZm9yIHVzLgotCSAqLwotCWJhdWQgPSB1YXJ0X2dldF9iYXVkX3JhdGUocG9ydCwgdGVybWlvcywgb2xkLCAwLCBwb3J0LT51YXJ0Y2xrLzE2KTsgCi0JcXVvdCA9IHVhcnRfZ2V0X2Rpdmlzb3IocG9ydCwgYmF1ZCk7Ci0KLQkvKiBieXRlIHNpemUgYW5kIHBhcml0eSAqLwotCXN3aXRjaCAodGVybWlvcy0+Y19jZmxhZyAmIENTSVpFKSB7Ci0JY2FzZSBDUzU6Ci0JCXVhcnRfbWMgPSBVQVJUX01DX0NMU19DSEFSTEVOXzU7Ci0JCWJyZWFrOwotCWNhc2UgQ1M2OgotCQl1YXJ0X21jID0gVUFSVF9NQ19DTFNfQ0hBUkxFTl82OwotCQlicmVhazsKLQljYXNlIENTNzoKLQkJdWFydF9tYyA9IFVBUlRfTUNfQ0xTX0NIQVJMRU5fNzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDogLy8gQ1M4Ci0JCXVhcnRfbWMgPSBVQVJUX01DX0NMU19DSEFSTEVOXzg7Ci0JCWJyZWFrOwotCX0KLQlpZiAodGVybWlvcy0+Y19jZmxhZyAmIENTVE9QQikKLQkJdWFydF9tY3w9IFVBUlRfTUNfU1RfVFdPOwotCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgUEFSRU5CKSB7Ci0JCXVhcnRfbWMgfD0gVUFSVF9NQ19QRV9NU0s7Ci0JCWlmICghKHRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJPREQpKQotCQkJdWFydF9tYyB8PSBVQVJUX01DX0VQX01TSzsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCi0JLyoKLQkgKiBVcGRhdGUgdGhlIHBlci1wb3J0IHRpbWVvdXQuCi0JICovCi0JdWFydF91cGRhdGVfdGltZW91dChwb3J0LCB0ZXJtaW9zLT5jX2NmbGFnLCBiYXVkKTsKLQotCXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgPSBVQVJUX1JEU19PRV9NU0s7Ci0JaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJTlBDSykKLQkJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX1JEU19GRV9NU0sgfCBVQVJUX1JEU19QRV9NU0s7Ci0JaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiAoQlJLSU5UIHwgUEFSTVJLKSkKLQkJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX1JEU19CSV9NU0s7Ci0KLQkvKgotCSAqIENoYXJhY3RlcnMgdG8gaWdub3JlCi0JICovCi0JcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrID0gMDsKLQlpZiAodGVybWlvcy0+Y19pZmxhZyAmIElHTlBBUikKLQkJcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfUkRTX0ZFX01TSyB8IFVBUlRfUkRTX1BFX01TSzsKLQlpZiAodGVybWlvcy0+Y19pZmxhZyAmIElHTkJSSykgewotCQlwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVUFSVF9SRFNfQklfTVNLOwotCQkvKgotCQkgKiBJZiB3ZSdyZSBpZ25vcmluZyBwYXJpdHkgYW5kIGJyZWFrIGluZGljYXRvcnMsCi0JCSAqIGlnbm9yZSBvdmVycnVucyB0byAoZm9yIHJlYWwgcmF3IHN1cHBvcnQpLgotCQkgKi8KLQkJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJR05QQVIpCi0JCQlwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVUFSVF9SRFNfT0VfTVNLOwotCX0KLQotCS8qIGZpcnN0LCBkaXNhYmxlIGV2ZXJ5dGhpbmcgKi8KLQlvbGRfaWVzID0gVUFSVF9HRVRfSUVTKHBvcnQpOyAKLQotCWlmIChVQVJUX0VOQUJMRV9NUyhwb3J0LCB0ZXJtaW9zLT5jX2NmbGFnKSkKLQkJb2xkX2llcyB8PSBVQVJUX0lFU19NRV9NU0s7Ci0KLQkvKiBTZXQgYmF1ZCByYXRlICovCi0JVUFSVF9QVVRfRElWX0xPKHBvcnQsIChxdW90ICYgMHhmZikpOwotCVVBUlRfUFVUX0RJVl9ISShwb3J0LCAoKHF1b3QgJiAweGYwMCkgPj4gOCkpOwotCi0JVUFSVF9QVVRfTUMocG9ydCwgdWFydF9tYyk7Ci0JVUFSVF9QVVRfSUVTKHBvcnQsIG9sZF9pZXMpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IHVhcnQwMF9zdGFydHVwKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JaW50IHJlc3VsdDsKLQotCS8qCi0JICogQWxsb2NhdGUgdGhlIElSUQotCSAqLwotCXJlc3VsdCA9IHJlcXVlc3RfaXJxKHBvcnQtPmlycSwgdWFydDAwX2ludCwgMCwgInVhcnQwMCIsIHBvcnQpOwotCWlmIChyZXN1bHQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJSZXF1ZXN0IG9mIGlycSAlZCBmYWlsZWRcbiIsIHBvcnQtPmlycSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBGaW5hbGx5LCBlbmFibGUgaW50ZXJydXB0cy4gVXNlIHRoZSBUSUkgaW50ZXJydXB0IHRvIG1pbmltaXNlIAotCSAqIHRoZSBudW1iZXIgb2YgaW50ZXJydXB0cyBnZW5lcmF0ZWQuIElmIGhpZ2hlciBwZXJmb3JtYW5jZSBpcyAKLQkgKiBuZWVkZWQsIGNvbnNpZGVyIHVzaW5nIHRoZSBUSSBpbnRlcnJ1cHQgd2l0aCBhIHN1aXRhYmxlIEZJRk8KLQkgKiB0aHJlc2hvbGQKLQkgKi8KLQlVQVJUX1BVVF9JRVMocG9ydCwgVUFSVF9JRVNfUkVfTVNLIHwgVUFSVF9JRVNfVElFX01TSyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdWFydDAwX3NodXRkb3duKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JLyoKLQkgKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzLCBkaXNhYmxlIHRoZSBwb3J0Ci0JICovCi0JVUFSVF9QVVRfSUVDKHBvcnQsIDB4ZmYpOwotCi0JLyogZGlzYWJsZSBicmVhayBjb25kaXRpb24gYW5kIGZpZm9zICovCi0JVUFSVF9QVVRfTUNSKHBvcnQsIFVBUlRfR0VUX01DUihwb3J0KSAmflVBUlRfTUNSX0JSX01TSyk7Ci0KLSAgICAgICAgLyoKLQkgKiBGcmVlIHRoZSBpbnRlcnJ1cHQKLQkgKi8KLQlmcmVlX2lycShwb3J0LT5pcnEsIHBvcnQpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqdWFydDAwX3R5cGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQlyZXR1cm4gcG9ydC0+dHlwZSA9PSBQT1JUX1VBUlQwMCA/ICJBbHRlcmEgVUFSVDAwIiA6IE5VTEw7Ci19Ci0KLS8qCi0gKiBSZWxlYXNlIHRoZSBtZW1vcnkgcmVnaW9uKHMpIGJlaW5nIHVzZWQgYnkgJ3BvcnQnCi0gKi8KLXN0YXRpYyB2b2lkIHVhcnQwMF9yZWxlYXNlX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQlyZWxlYXNlX21lbV9yZWdpb24ocG9ydC0+bWFwYmFzZSwgVUFSVF9QT1JUX1NJWkUpOwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfQ0FNRUxPVAotCWlmIChwb3J0LT5tZW1iYXNlICE9ICh2b2lkKilJT19BRERSRVNTKEVYQ19VQVJUMDBfQkFTRSkpIHsKLQkJaW91bm1hcChwb3J0LT5tZW1iYXNlKTsKLQl9Ci0jZW5kaWYKLX0KLQotLyoKLSAqIFJlcXVlc3QgdGhlIG1lbW9yeSByZWdpb24ocykgYmVpbmcgdXNlZCBieSAncG9ydCcKLSAqLwotc3RhdGljIGludCB1YXJ0MDBfcmVxdWVzdF9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JcmV0dXJuIHJlcXVlc3RfbWVtX3JlZ2lvbihwb3J0LT5tYXBiYXNlLCBVQVJUX1BPUlRfU0laRSwgInNlcmlhbF91YXJ0MDAiKQotCQkJIT0gTlVMTCA/IDAgOiAtRUJVU1k7Ci19Ci0KLS8qCi0gKiBDb25maWd1cmUvYXV0b2NvbmZpZ3VyZSB0aGUgcG9ydC4KLSAqLwotc3RhdGljIHZvaWQgdWFydDAwX2NvbmZpZ19wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBmbGFncykKLXsKLQotCS8qCi0JICogTWFwIHRoZSBpbyBtZW1vcnkgaWYgdGhpcyBpcyBhIHNvZnQgdWFydAotCSAqLwotCWlmICghcG9ydC0+bWVtYmFzZSkKLQkJcG9ydC0+bWVtYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShwb3J0LT5tYXBiYXNlLFNaXzRLKTsKLQotCWlmICghcG9ydC0+bWVtYmFzZSkKLQkJcHJpbnRrKEtFUk5fRVJSICJzZXJpYWwwMDogY2Fubm90IG1hcCBpbyBtZW1vcnlcbiIpOwotCWVsc2UKLQkJcG9ydC0+dHlwZSA9IFBPUlRfVUFSVDAwOwotCi19Ci0KLS8qCi0gKiB2ZXJpZnkgdGhlIG5ldyBzZXJpYWxfc3RydWN0IChmb3IgVElPQ1NTRVJJQUwpLgotICovCi1zdGF0aWMgaW50IHVhcnQwMF92ZXJpZnlfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqc2VyKQotewotCWludCByZXQgPSAwOwotCWlmIChzZXItPnR5cGUgIT0gUE9SVF9VTktOT1dOICYmIHNlci0+dHlwZSAhPSBQT1JUX1VBUlQwMCkKLQkJcmV0ID0gLUVJTlZBTDsKLQlpZiAoc2VyLT5pcnEgPCAwIHx8IHNlci0+aXJxID49IE5SX0lSUVMpCi0JCXJldCA9IC1FSU5WQUw7Ci0JaWYgKHNlci0+YmF1ZF9iYXNlIDwgOTYwMCkKLQkJcmV0ID0gLUVJTlZBTDsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IHVhcnRfb3BzIHVhcnQwMF9wb3BzID0gewotCS50eF9lbXB0eQk9IHVhcnQwMF90eF9lbXB0eSwKLQkuc2V0X21jdHJsCT0gdWFydDAwX3NldF9tY3RybF9udWxsLAotCS5nZXRfbWN0cmwJPSB1YXJ0MDBfZ2V0X21jdHJsLAotCS5zdG9wX3R4CT0gdWFydDAwX3N0b3BfdHgsCi0JLnN0YXJ0X3R4CT0gdWFydDAwX3N0YXJ0X3R4LAotCS5zdG9wX3J4CT0gdWFydDAwX3N0b3BfcngsCi0JLmVuYWJsZV9tcwk9IHVhcnQwMF9lbmFibGVfbXMsCi0JLmJyZWFrX2N0bAk9IHVhcnQwMF9icmVha19jdGwsCi0JLnN0YXJ0dXAJPSB1YXJ0MDBfc3RhcnR1cCwKLQkuc2h1dGRvd24JPSB1YXJ0MDBfc2h1dGRvd24sCi0JLnNldF90ZXJtaW9zCT0gdWFydDAwX3NldF90ZXJtaW9zLAotCS50eXBlCQk9IHVhcnQwMF90eXBlLAotCS5yZWxlYXNlX3BvcnQJPSB1YXJ0MDBfcmVsZWFzZV9wb3J0LAotCS5yZXF1ZXN0X3BvcnQJPSB1YXJ0MDBfcmVxdWVzdF9wb3J0LAotCS5jb25maWdfcG9ydAk9IHVhcnQwMF9jb25maWdfcG9ydCwKLQkudmVyaWZ5X3BvcnQJPSB1YXJ0MDBfdmVyaWZ5X3BvcnQsCi19OwotCi0KLSNpZmRlZiBDT05GSUdfQVJDSF9DQU1FTE9UCi1zdGF0aWMgc3RydWN0IHVhcnRfcG9ydCBlcHhhMTBkYl9wb3J0ID0gewotCS5tZW1iYXNlCT0gKHZvaWQqKUlPX0FERFJFU1MoRVhDX1VBUlQwMF9CQVNFKSwKLQkubWFwYmFzZQk9IEVYQ19VQVJUMDBfQkFTRSwKLQkuaW90eXBlCQk9IFNFUklBTF9JT19NRU0sCi0JLmlycQkJPSBJUlFfVUFSVCwKLQkudWFydGNsawk9IEVYQ19BSEIyX0NMS19GUkVRVUVOQ1ksCi0JLmZpZm9zaXplCT0gMTYsCi0JLm9wcwkJPSAmdWFydDAwX3BvcHMsCi0JLmZsYWdzCQk9IEFTWU5DX0JPT1RfQVVUT0NPTkYsCi19OwotI2VuZGlmCi0KLQotI2lmZGVmIENPTkZJR19TRVJJQUxfVUFSVDAwX0NPTlNPTEUKLXN0YXRpYyB2b2lkIHVhcnQwMF9jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqcywgdW5zaWduZWQgY291bnQpCi17Ci0jaWZkZWYgQ09ORklHX0FSQ0hfQ0FNRUxPVAotCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSAmZXB4YTEwZGJfcG9ydDsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzLCBvbGRfaWVzOwotCWludCBpOwotCi0JLyoKLQkgKglGaXJzdCBzYXZlIHRoZSBDUiB0aGVuIGRpc2FibGUgdGhlIGludGVycnVwdHMKLQkgKi8KLQlvbGRfaWVzID0gVUFSVF9HRVRfSUVTKHBvcnQpOwotCVVBUlRfUFVUX0lFQyhwb3J0LDB4ZmYpOwotCi0JLyoKLQkgKglOb3csIGRvIGVhY2ggY2hhcmFjdGVyCi0JICovCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJZG8gewotCQkJc3RhdHVzID0gVUFSVF9HRVRfVFNSKHBvcnQpOwotCQl9IHdoaWxlICghVUFSVF9UWF9SRUFEWShzdGF0dXMpKTsKLQkJVUFSVF9QVVRfQ0hBUihwb3J0LCBzW2ldKTsKLQkJaWYgKHNbaV0gPT0gJ1xuJykgewotCQkJZG8gewotCQkJCXN0YXR1cyA9IFVBUlRfR0VUX1RTUihwb3J0KTsKLQkJCX0gd2hpbGUgKCFVQVJUX1RYX1JFQURZKHN0YXR1cykpOwotCQkJVUFSVF9QVVRfQ0hBUihwb3J0LCAnXHInKTsKLQkJfQotCX0KLQotCS8qCi0JICoJRmluYWxseSwgd2FpdCBmb3IgdHJhbnNtaXR0ZXIgdG8gYmVjb21lIGVtcHR5Ci0JICoJYW5kIHJlc3RvcmUgdGhlIElFUwotCSAqLwotCWRvIHsKLQkJc3RhdHVzID0gVUFSVF9HRVRfVFNSKHBvcnQpOwotCX0gd2hpbGUgKHN0YXR1cyAmIFVBUlRfVFNSX1RYX0xFVkVMX01TSyk7Ci0JVUFSVF9QVVRfSUVTKHBvcnQsIG9sZF9pZXMpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdAotdWFydDAwX2NvbnNvbGVfZ2V0X29wdGlvbnMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50ICpiYXVkLAotCQkJICAgaW50ICpwYXJpdHksIGludCAqYml0cykKLXsKLQl1bnNpZ25lZCBpbnQgdWFydF9tYywgcXVvdDsKLQotCXVhcnRfbWMgPSBVQVJUX0dFVF9NQyhwb3J0KTsKLQotCSpwYXJpdHkgPSAnbic7Ci0JaWYgKHVhcnRfbWMgJiBVQVJUX01DX1BFX01TSykgewotCQlpZiAodWFydF9tYyAmIFVBUlRfTUNfRVBfTVNLKQotCQkJKnBhcml0eSA9ICdlJzsKLQkJZWxzZQotCQkJKnBhcml0eSA9ICdvJzsKLQl9Ci0KLQlzd2l0Y2ggKHVhcnRfbWMgJiBVQVJUX01DX0NMU19NU0spIHsKLQljYXNlIFVBUlRfTUNfQ0xTX0NIQVJMRU5fNToKLQkJKmJpdHMgPSA1OwotCQlicmVhazsKLQljYXNlIFVBUlRfTUNfQ0xTX0NIQVJMRU5fNjoKLQkJKmJpdHMgPSA2OwotCQlicmVhazsKLQljYXNlIFVBUlRfTUNfQ0xTX0NIQVJMRU5fNzoKLQkJKmJpdHMgPSA3OwotCQlicmVhazsKLQljYXNlIFVBUlRfTUNfQ0xTX0NIQVJMRU5fODoKLQkJKmJpdHMgPSA4OwotCQlicmVhazsKLQl9Ci0JcXVvdCA9IFVBUlRfR0VUX0RJVl9MTyhwb3J0KSB8IChVQVJUX0dFVF9ESVZfSEkocG9ydCkgPDwgOCk7Ci0JKmJhdWQgPSBwb3J0LT51YXJ0Y2xrIC8gKDE2ICpxdW90ICk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHVhcnQwMF9jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjbywgY2hhciAqb3B0aW9ucykKLXsKLQlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0OwotCWludCBiYXVkID0gMTE1MjAwOwotCWludCBiaXRzID0gODsKLQlpbnQgcGFyaXR5ID0gJ24nOwotCWludCBmbG93ID0gJ24nOwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfQ0FNRUxPVAotCXBvcnQgPSAmZXB4YTEwZGJfcG9ydDsgICAgICAgICAgICAgOwotI2Vsc2UKLQlyZXR1cm4gLUVOT0RFVjsKLSNlbmRpZgotCWlmIChvcHRpb25zKQotCQl1YXJ0X3BhcnNlX29wdGlvbnMob3B0aW9ucywgJmJhdWQsICZwYXJpdHksICZiaXRzLCAmZmxvdyk7Ci0JZWxzZQotCQl1YXJ0MDBfY29uc29sZV9nZXRfb3B0aW9ucyhwb3J0LCAmYmF1ZCwgJnBhcml0eSwgJmJpdHMpOwotCi0JcmV0dXJuIHVhcnRfc2V0X29wdGlvbnMocG9ydCwgY28sIGJhdWQsIHBhcml0eSwgYml0cywgZmxvdyk7Ci19Ci0KLWV4dGVybiBzdHJ1Y3QgdWFydF9kcml2ZXIgdWFydDAwX3JlZzsKLXN0YXRpYyBzdHJ1Y3QgY29uc29sZSB1YXJ0MDBfY29uc29sZSA9IHsKLQkubmFtZQkJPSBTRVJJQUxfVUFSVDAwX05BTUUsCi0JLndyaXRlCQk9IHVhcnQwMF9jb25zb2xlX3dyaXRlLAotCS5kZXZpY2UJCT0gdWFydF9jb25zb2xlX2RldmljZSwKLQkuc2V0dXAJCT0gdWFydDAwX2NvbnNvbGVfc2V0dXAsCi0JLmZsYWdzCQk9IENPTl9QUklOVEJVRkZFUiwKLQkuaW5kZXgJCT0gMCwKLQkuZGF0YQkJPSAmdWFydDAwX3JlZywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHVhcnQwMF9jb25zb2xlX2luaXQodm9pZCkKLXsKLQlyZWdpc3Rlcl9jb25zb2xlKCZ1YXJ0MDBfY29uc29sZSk7Ci0JcmV0dXJuIDA7Ci19Ci1jb25zb2xlX2luaXRjYWxsKHVhcnQwMF9jb25zb2xlX2luaXQpOwotCi0jZGVmaW5lIFVBUlQwMF9DT05TT0xFCSZ1YXJ0MDBfY29uc29sZQotI2Vsc2UKLSNkZWZpbmUgVUFSVDAwX0NPTlNPTEUJTlVMTAotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgdWFydDAwX3JlZyA9IHsKLQkub3duZXIJCQk9IE5VTEwsCi0JLmRyaXZlcl9uYW1lCQk9IFNFUklBTF9VQVJUMDBfTkFNRSwKLQkuZGV2X25hbWUJCT0gU0VSSUFMX1VBUlQwMF9OQU1FLAotCS5tYWpvcgkJCT0gU0VSSUFMX1VBUlQwMF9NQUpPUiwKLQkubWlub3IJCQk9IFNFUklBTF9VQVJUMDBfTUlOT1IsCi0JLm5yCQkJPSBVQVJUX05SLAotCS5jb25zCQkJPSBVQVJUMDBfQ09OU09MRSwKLX07Ci0KLXN0cnVjdCBkZXZfcG9ydF9lbnRyeXsKLQl1bnNpZ25lZCBpbnQgYmFzZV9hZGRyOwotCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQ7Ci19OwotCi0jaWZkZWYgQ09ORklHX1BMRF9IT1RTV0FQCi0KLXN0YXRpYyBzdHJ1Y3QgZGV2X3BvcnRfZW50cnkgZGV2X3BvcnRfbWFwW1VBUlRfTlJdOwotCi0vKgotICogS2VlcCBhIG1hcHBpbmcgb2YgZGV2X2luZm8gYWRkcmVzc2VzIC0+IHBvcnQgbGluZXMgdG8gdXNlIHdoZW4KLSAqIHJlbW92aW5nIHBvcnRzIGRldj09TlVMTCBpbmRpY2F0ZXMgdW51c2VkIGVudHJ5Ci0gKi8KLQotc3RydWN0IHVhcnQwMF9wc19kYXRhewotCXVuc2lnbmVkIGludCBjbGs7Ci0JdW5zaWduZWQgaW50IGZpZm9zaXplOwotfTsKLQotaW50IHVhcnQwMF9hZGRfZGV2aWNlKHN0cnVjdCBwbGRoc19kZXZfaW5mbyogZGV2X2luZm8sIHZvaWQqIGRldl9wc19kYXRhKQotewotCXN0cnVjdCB1YXJ0MDBfcHNfZGF0YSogZGV2X3BzPWRldl9wc19kYXRhOwotCXN0cnVjdCB1YXJ0X3BvcnQgKiBwb3J0OwotCWludCBpLHJlc3VsdDsKLQotCWk9MDsKLQl3aGlsZShkZXZfcG9ydF9tYXBbaV0ucG9ydCkKLQkJaSsrOwotCi0JaWYoaT09VUFSVF9OUil7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInVhcnQwMDogTWF4aW11bSBudW1iZXIgb2YgcG9ydHMgcmVhY2hlZFxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCXBvcnQ9a21hbGxvYyhzaXplb2Yoc3RydWN0IHVhcnRfcG9ydCksR0ZQX0tFUk5FTCk7Ci0JaWYoIXBvcnQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcHJpbnRrKCJjbGs9JWQgZmlmbz0lZFxuIixkZXZfcHMtPmNsayxkZXZfcHMtPmZpZm9zaXplKTsKLQlwb3J0LT5tZW1iYXNlPTA7Ci0JcG9ydC0+bWFwYmFzZT1kZXZfaW5mby0+YmFzZV9hZGRyOwotCXBvcnQtPmlvdHlwZT1TRVJJQUxfSU9fTUVNOwotCXBvcnQtPmlycT1kZXZfaW5mby0+aXJxOwotCXBvcnQtPnVhcnRjbGs9ZGV2X3BzLT5jbGs7Ci0JcG9ydC0+Zmlmb3NpemU9ZGV2X3BzLT5maWZvc2l6ZTsKLQlwb3J0LT5vcHM9JnVhcnQwMF9wb3BzOwotCXBvcnQtPmxpbmU9aTsKLQlwb3J0LT5mbGFncz1BU1lOQ19CT09UX0FVVE9DT05GOwotCi0JcmVzdWx0PXVhcnRfYWRkX29uZV9wb3J0KCZ1YXJ0MDBfcmVnLCBwb3J0KTsKLQlpZihyZXN1bHQpewotCQlwcmludGsoInVhcnRfYWRkX29uZV9wb3J0IHJldHVybmVkICVkXG4iLHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCWRldl9wb3J0X21hcFtpXS5iYXNlX2FkZHI9ZGV2X2luZm8tPmJhc2VfYWRkcjsKLQlkZXZfcG9ydF9tYXBbaV0ucG9ydD1wb3J0OwotCXByaW50aygidWFydDAwOiBhZGRlZCBkZXZpY2UgYXQgJXggYXMgdHR5VUElZFxuIixkZXZfcG9ydF9tYXBbaV0uYmFzZV9hZGRyLGkpOwotCXJldHVybiAwOwotCi19Ci0KLWludCB1YXJ0MDBfcmVtb3ZlX2RldmljZXModm9pZCkKLXsKLQlpbnQgaSxyZXN1bHQ7Ci0KLQotCXJlc3VsdD0wOwotCWZvcihpPTE7aTxVQVJUX05SO2krKyl7Ci0JCWlmKGRldl9wb3J0X21hcFtpXS5iYXNlX2FkZHIpewotCQkJcmVzdWx0PXVhcnRfcmVtb3ZlX29uZV9wb3J0KCZ1YXJ0MDBfcmVnLCBkZXZfcG9ydF9tYXBbaV0ucG9ydCk7Ci0JCQlpZihyZXN1bHQpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQotCQkJLyogcG9ydCByZW1vdmVkIHN1Y2Vzc2Z1bGx5LCBzbyBub3cgdGlkeSB1cCAqLwotCQkJa2ZyZWUoZGV2X3BvcnRfbWFwW2ldLnBvcnQpOwotCQkJZGV2X3BvcnRfbWFwW2ldLmJhc2VfYWRkcj0wOwotCQkJZGV2X3BvcnRfbWFwW2ldLnBvcnQ9TlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLQotfQotCi1zdHJ1Y3QgcGxkX2hvdHN3YXBfb3BzIHVhcnQwMF9wbGRoc19vcHM9ewotCS5uYW1lCQk9ICJ1YXJ0MDAiLAotCS5hZGRfZGV2aWNlCT0gdWFydDAwX2FkZF9kZXZpY2UsCi0JLnJlbW92ZV9kZXZpY2VzCT0gdWFydDAwX3JlbW92ZV9kZXZpY2VzLAotfTsKLQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgX19pbml0IHVhcnQwMF9pbml0KHZvaWQpCi17Ci0JaW50IHJlc3VsdDsKLQotCXByaW50ayhLRVJOX0lORk8gIlNlcmlhbDogVUFSVDAwIGRyaXZlciAkUmV2aXNpb246IDEuMzUgJFxuIik7Ci0KLQlwcmludGsoS0VSTl9XQVJOSU5HICJzZXJpYWxfdWFydDAwOlVzaW5nIHRlbXBvcmFyeSBtYWpvci9taW5vciBwYWlycyIKLQkJIiAtIHRoZXNlIFdJTEwgY2hhbmdlIGluIHRoZSBmdXR1cmVcbiIpOwotCi0JcmVzdWx0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJnVhcnQwMF9yZWcpOwotCWlmIChyZXN1bHQpCi0JCXJldHVybiByZXN1bHQ7Ci0jaWZkZWYgQ09ORklHX0FSQ0hfQ0FNRUxPVAotCXJlc3VsdCA9IHVhcnRfYWRkX29uZV9wb3J0KCZ1YXJ0MDBfcmVnLCZlcHhhMTBkYl9wb3J0KTsKLSNlbmRpZgotCWlmIChyZXN1bHQpCi0JCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnVhcnQwMF9yZWcpOwotCi0jaWZkZWYgIENPTkZJR19QTERfSE9UU1dBUAotCXBsZGhzX3JlZ2lzdGVyX2RyaXZlcigmdWFydDAwX3BsZGhzX29wcyk7Ci0jZW5kaWYKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1fX2luaXRjYWxsKHVhcnQwMF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3ZyNDF4eF9zaXUuYyBiL2RyaXZlcnMvc2VyaWFsL3ZyNDF4eF9zaXUuYwppbmRleCA4NjVkNGRlLi5kNjE0OTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC92cjQxeHhfc2l1LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvdnI0MXh4X3NpdS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqICBEcml2ZXIgZm9yIE5FQyBWUjQxMDAgc2VyaWVzIFNlcmlhbCBJbnRlcmZhY2UgVW5pdC4KICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgIFlvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgIFlvaWNoaSBZdWFzYSA8eW9pY2hpX3l1YXNhQHRyaXBlYWtzLmNvLmpwPgogICoKICAqICBCYXNlZCBvbiBkcml2ZXJzL3NlcmlhbC84MjUwLmMsIGJ5IFJ1c3NlbGwgS2luZy4KICAqCkBAIC0zNzEsMTEgKzM3MSw2IEBACiAJbHNyID0gKnN0YXR1czsKIAogCWRvIHsKLQkJaWYgKHVubGlrZWx5KHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSkgewotCQkJaWYgKHR0eS0+bG93X2xhdGVuY3kpCi0JCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKLQkJfQotCiAJCWNoID0gc2l1X3JlYWQocG9ydCwgVUFSVF9SWCk7CiAJCXBvcnQtPmljb3VudC5yeCsrOwogCQlmbGFnID0gVFRZX05PUk1BTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2gvc3VwZXJoeXdheS9zdXBlcmh5d2F5LmMgYi9kcml2ZXJzL3NoL3N1cGVyaHl3YXkvc3VwZXJoeXdheS5jCmluZGV4IDdiZGFiMmEuLjk0YjIyOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2gvc3VwZXJoeXdheS9zdXBlcmh5d2F5LmMKKysrIGIvZHJpdmVycy9zaC9zdXBlcmh5d2F5L3N1cGVyaHl3YXkuYwpAQCAtMTc1LDggKzE3NSw2IEBACiB7CiAJZHJ2LT5kcnYubmFtZQk9IGRydi0+bmFtZTsKIAlkcnYtPmRydi5idXMJPSAmc3VwZXJoeXdheV9idXNfdHlwZTsKLQlkcnYtPmRydi5wcm9iZQk9IHN1cGVyaHl3YXlfZGV2aWNlX3Byb2JlOwotCWRydi0+ZHJ2LnJlbW92ZQk9IHN1cGVyaHl3YXlfZGV2aWNlX3JlbW92ZTsKIAogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJ2KTsKIH0KQEAgLTIxMyw2ICsyMTEsOCBAQAogI2lmZGVmIENPTkZJR19TWVNGUwogCS5kZXZfYXR0cnMJPSBzdXBlcmh5d2F5X2Rldl9hdHRycywKICNlbmRpZgorCS5wcm9iZQkJPSBzdXBlcmh5d2F5X2RldmljZV9wcm9iZSwKKwkucmVtb3ZlCQk9IHN1cGVyaHl3YXlfZGV2aWNlX3JlbW92ZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHN1cGVyaHl3YXlfYnVzX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc24vS2NvbmZpZyBiL2RyaXZlcnMvc24vS2NvbmZpZwppbmRleCAxM2I4ZDI0Li5kOTUyNjViMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvc24vS2NvbmZpZwpAQCAtMTcsNCArMTcsMTggQEAKIAlJZiB5b3UgaGF2ZSBhbiBTR0kgQWx0aXggd2l0aCBhbiBJT0M0LWJhc2VkCiAJSS9PIGNvbnRyb2xsZXIgc2F5IFkuICBPdGhlcndpc2Ugc2F5IE4uCiAKK2NvbmZpZyBTR0lfSU9DMworCXRyaXN0YXRlICJTR0kgSU9DMyBCYXNlIElPIHN1cHBvcnQiCisJZGVwZW5kcyBvbiAoSUE2NF9HRU5FUklDIHx8IElBNjRfU0dJX1NOMikKKwlkZWZhdWx0IG0KKwktLS1oZWxwLS0tCisJVGhpcyBvcHRpb24gZW5hYmxlcyBiYXNpYyBzdXBwb3J0IGZvciB0aGUgU0dJIElPQzMtYmFzZWQgQmFzZSBJTworCWNvbnRyb2xsZXIgY2FyZC4gIFRoaXMgb3B0aW9uIGRvZXMgbm90IGVuYWJsZSBhbnkgc3BlY2lmaWMKKwlmdW5jdGlvbnMgb24gc3VjaCBhIGNhcmQsIGJ1dCBwcm92aWRlcyBuZWNlc3NhcnkgaW5mcmFzdHJ1Y3R1cmUKKwlmb3Igb3RoZXIgZHJpdmVycyB0byB1dGlsaXplLgorCisJSWYgeW91IGhhdmUgYW4gU0dJIEFsdGl4IHdpdGggYW4gSU9DMy1iYXNlZAorCUkvTyBjb250cm9sbGVyIG9yIGEgUENJIElPQzMgc2VyaWFsIGNhcmQgc2F5IFkuCisJT3RoZXJ3aXNlIHNheSBOLgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NuL01ha2VmaWxlIGIvZHJpdmVycy9zbi9NYWtlZmlsZQppbmRleCBjMmEyODQxLi4yY2RhMDExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NuL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc24vTWFrZWZpbGUKQEAgLTQsMyArNCw0IEBACiAjCiAKIG9iai0kKENPTkZJR19TR0lfSU9DNCkgKz0gaW9jNC5vCitvYmotJChDT05GSUdfU0dJX0lPQzMpICs9IGlvYzMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zbi9pb2MzLmMgYi9kcml2ZXJzL3NuL2lvYzMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWEwMDlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zbi9pb2MzLmMKQEAgLTAsMCArMSw4NTEgQEAKKy8qCisgKiBTR0kgSU9DMyBtYXN0ZXIgZHJpdmVyIGFuZCBJUlEgZGVtdXhlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBTdGFuaXNsYXcgU2tvd3JvbmVrIDxza3lsYXJrQGxpbnV4LW1pcHMub3JnPgorICogSGVhdmlseSBiYXNlZCBvbiBzaW1pbGFyIHdvcmsgYnk6CisgKiAgIEJyZW50IENhc2F2YW50IDxiY2FzYXZhbkBzZ2kuY29tPiAtIElPQzQgbWFzdGVyIGRyaXZlcgorICogICBQYXQgR2VmcmUgPHBmZ0BzZ2kuY29tPiAtIElPQzMgc2VyaWFsIHBvcnQgSVJRIGRlbXV4ZXIKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jMy5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisKKyNkZWZpbmUgSU9DM19QQ0lfU0laRSAweDEwMDAwMAorCitzdGF0aWMgTElTVF9IRUFEKGlvYzNfZGV2aWNlcyk7CitzdGF0aWMgaW50IGlvYzNfY291bnRlcjsKK3N0YXRpYyBERUNMQVJFX1JXU0VNKGlvYzNfZGV2aWNlc19yd3NlbSk7CisKK3N0YXRpYyBzdHJ1Y3QgaW9jM19zdWJtb2R1bGUgKmlvYzNfc3VibW9kdWxlc1tJT0MzX01BWF9TVUJNT0RVTEVTXTsKK3N0YXRpYyBzdHJ1Y3QgaW9jM19zdWJtb2R1bGUgKmlvYzNfZXRoZXJuZXQ7CitzdGF0aWMgcndsb2NrX3QgaW9jM19zdWJtb2R1bGVzX2xvY2sgPSBSV19MT0NLX1VOTE9DS0VEOworCisvKiBOSUMgcHJvYmluZyBjb2RlICovCisKKyNkZWZpbmUgR1BDUl9NTEFOX0VOICAgIDB4MDAyMDAwMDAgICAgICAvKiBlbmFibGUgTUNSIHRvIHBpbiA4ICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbWNyX3BhY2sodW5zaWduZWQgcHVsc2UsIHVuc2lnbmVkIHNhbXBsZSkKK3sKKwlyZXR1cm4gKHB1bHNlIDw8IDEwKSB8IChzYW1wbGUgPDwgMik7Cit9CisKK3N0YXRpYyBpbnQgbmljX3dhaXQoc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBtY3I7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgICAgIG1jciA9ICh2b2xhdGlsZSB1bnNpZ25lZClpZGQtPnZtYS0+bWNyOworICAgICAgICB9IHdoaWxlICghKG1jciAmIDIpKTsKKworICAgICAgICByZXR1cm4gbWNyICYgMTsKK30KKworc3RhdGljIGludCBuaWNfcmVzZXQoc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZCkKK3sKKyAgICAgICAgaW50IHByZXNlbmNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWRkLT52bWEtPm1jciA9IG1jcl9wYWNrKDUwMCwgNjUpOworCXByZXNlbmNlID0gbmljX3dhaXQoaWRkKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwl1ZGVsYXkoNTAwKTsKKworICAgICAgICByZXR1cm4gcHJlc2VuY2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5pY19yZWFkX2JpdChzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkKQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZGQtPnZtYS0+bWNyID0gbWNyX3BhY2soNiwgMTMpOworCXJlc3VsdCA9IG5pY193YWl0KGlkZCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJdWRlbGF5KDUwMCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmljX3dyaXRlX2JpdChzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkLCBpbnQgYml0KQoreworCWlmIChiaXQpCisJCWlkZC0+dm1hLT5tY3IgPSBtY3JfcGFjayg2LCAxMTApOworCWVsc2UKKwkJaWRkLT52bWEtPm1jciA9IG1jcl9wYWNrKDgwLCAzMCk7CisKKwluaWNfd2FpdChpZGQpOworfQorCitzdGF0aWMgdW5zaWduZWQgbmljX3JlYWRfYnl0ZShzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkKQoreworCXVuc2lnbmVkIHJlc3VsdCA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlyZXN1bHQgPSAocmVzdWx0ID4+IDEpIHwgKG5pY19yZWFkX2JpdChpZGQpIDw8IDcpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgbmljX3dyaXRlX2J5dGUoc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZCwgaW50IGJ5dGUpCit7CisJaW50IGksIGJpdDsKKworCWZvciAoaSA9IDg7IGk7IGktLSkgeworCQliaXQgPSBieXRlICYgMTsKKwkJYnl0ZSA+Pj0gMTsKKworCQluaWNfd3JpdGVfYml0KGlkZCwgYml0KTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCituaWNfZmluZChzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkLCBpbnQgKmxhc3QsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlpbnQgYSwgYiwgaW5kZXgsIGRpc2M7CisKKwluaWNfcmVzZXQoaWRkKTsKKworCS8qIFNlYXJjaCBST00uICAqLworCW5pY193cml0ZV9ieXRlKGlkZCwgMHhGMCk7CisKKwkvKiBBbGdvcml0aG0gZnJvbSBgYEJvb2sgb2YgaUJ1dHRvbiBTdGFuZGFyZHMnJy4gICovCisJZm9yIChpbmRleCA9IDAsIGRpc2MgPSAwOyBpbmRleCA8IDY0OyBpbmRleCsrKSB7CisJCWEgPSBuaWNfcmVhZF9iaXQoaWRkKTsKKwkJYiA9IG5pY19yZWFkX2JpdChpZGQpOworCisJCWlmIChhICYmIGIpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIklPQzMgTklDIHNlYXJjaCBmYWlsZWQuXG4iKTsKKwkJCSpsYXN0ID0gMDsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFhICYmICFiKSB7CisJCQlpZiAoaW5kZXggPT0gKmxhc3QpIHsKKwkJCQlhZGRyIHw9IDFVTCA8PCBpbmRleDsKKwkJCX0gZWxzZSBpZiAoaW5kZXggPiAqbGFzdCkgeworCQkJCWFkZHIgJj0gfigxVUwgPDwgaW5kZXgpOworCQkJCWRpc2MgPSBpbmRleDsKKwkJCX0gZWxzZSBpZiAoKGFkZHIgJiAoMVVMIDw8IGluZGV4KSkgPT0gMCkKKwkJCQlkaXNjID0gaW5kZXg7CisJCQluaWNfd3JpdGVfYml0KGlkZCwgKGFkZHI+PmluZGV4KSYxKTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJaWYgKGEpCisJCQkJYWRkciB8PSAxVUwgPDwgaW5kZXg7CisJCQllbHNlCisJCQkJYWRkciAmPSB+KDFVTCA8PCBpbmRleCk7CisJCQluaWNfd3JpdGVfYml0KGlkZCwgYSk7CisJCQljb250aW51ZTsKKwkJfQorCX0KKwkqbGFzdCA9IGRpc2M7CisJcmV0dXJuIGFkZHI7Cit9CisKK3N0YXRpYyB2b2lkIG5pY19hZGRyKHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlpbnQgaW5kZXg7CisKKwluaWNfcmVzZXQoaWRkKTsKKwluaWNfd3JpdGVfYnl0ZShpZGQsIDB4RjApOworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IDY0OyBpbmRleCsrKSB7CisJCW5pY19yZWFkX2JpdChpZGQpOworCQluaWNfcmVhZF9iaXQoaWRkKTsKKwkJbmljX3dyaXRlX2JpdChpZGQsIChhZGRyPj5pbmRleCkmMSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjcmMxNl9ieXRlKHVuc2lnbmVkIGludCAqY3JjLCB1bnNpZ25lZCBjaGFyIGRiKQoreworCWludCBpOworCisJZm9yKGk9MDtpPDg7aSsrKSB7CisJCSpjcmMgPDw9IDE7CisJCWlmKChkYl4oKmNyYz4+MTYpKSAmIDEpCisJCQkqY3JjIF49IDB4ODAwNTsKKwkJZGIgPj49IDE7CisJfQorCSpjcmMgJj0gMHhGRkZGOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGNyYzE2X2FyZWEodW5zaWduZWQgY2hhciAqZGJzLCBpbnQgc2l6ZSwgdW5zaWduZWQgaW50IGNyYykKK3sKKwl3aGlsZShzaXplLS0pCisJCWNyYzE2X2J5dGUoJmNyYywgKihkYnMrKykpOworCXJldHVybiBjcmM7Cit9CisKK3N0YXRpYyB2b2lkIGNyYzhfYnl0ZSh1bnNpZ25lZCBpbnQgKmNyYywgdW5zaWduZWQgY2hhciBkYikKK3sKKwlpbnQgaSxmOworCisJZm9yKGk9MDtpPDg7aSsrKSB7CisJCWYgPSAoKmNyYyBeIGRiKSAmIDE7CisJCSpjcmMgPj49IDE7CisJCWRiID4+PSAxOworCQlpZihmKQorCQkJKmNyYyBePSAweDhjOworCX0KKwkqY3JjICY9IDB4ZmY7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3JjOF9hZGRyKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgY3JjID0gMHgwMDsKKworCWZvcihpPTA7aTw4O2krKykKKwkJY3JjOF9ieXRlKCZjcmMsIGFkZHI+PihpPDwzKSk7CisJcmV0dXJuIGNyYzsKK30KKworc3RhdGljIHZvaWQKK3JlYWRfcmVkaXJfcGFnZShzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkLCB1bnNpZ25lZCBsb25nIGFkZHIsIGludCBwYWdlLAorCQkJdW5zaWduZWQgY2hhciAqcmVkaXIsIHVuc2lnbmVkIGNoYXIgKmRhdGEpCit7CisJaW50IGxvb3BzID0gMTYsIGk7CisKKwl3aGlsZShyZWRpcltwYWdlXSAhPSAweEZGKSB7CisJCXBhZ2UgPSByZWRpcltwYWdlXV4weEZGOworCQlsb29wcy0tOworCQlpZihsb29wczwwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIklPQzM6IE5JQyBjaXJjdWxhciByZWRpcmVjdGlvblxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisJbG9vcHMgPSAzOworCXdoaWxlKGxvb3BzPjApIHsKKwkJbmljX2FkZHIoaWRkLCBhZGRyKTsKKwkJbmljX3dyaXRlX2J5dGUoaWRkLCAweEYwKTsKKwkJbmljX3dyaXRlX2J5dGUoaWRkLCAocGFnZSA8PCA1KSAmIDB4RTApOworCQluaWNfd3JpdGVfYnl0ZShpZGQsIChwYWdlID4+IDMpICYgMHgxRik7CisJCWZvcihpPTA7aTwweDIwO2krKykKKwkJCWRhdGFbaV0gPSBuaWNfcmVhZF9ieXRlKGlkZCk7CisJCWlmKGNyYzE2X2FyZWEoZGF0YSwgMHgyMCwgMHgwMDAwKSA9PSAweDgwMGQpCisJCQlyZXR1cm47CisJCWxvb3BzLS07CisJfQorCXByaW50ayhLRVJOX0VSUiAiSU9DMzogQ1JDIGVycm9yIGluIGRhdGEgcGFnZVxuIik7CisJZm9yKGk9MDtpPDB4MjA7aSsrKQorCQlkYXRhW2ldID0gMHgwMDsKK30KKworc3RhdGljIHZvaWQKK3JlYWRfcmVkaXJfbWFwKHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQkJIHVuc2lnbmVkIGNoYXIgKnJlZGlyKQoreworCWludCBpLGosbG9vcHMgPSAzLGNyY19vazsKKwl1bnNpZ25lZCBpbnQgY3JjOworCisJd2hpbGUobG9vcHM+MCkgeworCQljcmNfb2sgPSAxOworCQluaWNfYWRkcihpZGQsIGFkZHIpOworCQluaWNfd3JpdGVfYnl0ZShpZGQsIDB4QUEpOworCQluaWNfd3JpdGVfYnl0ZShpZGQsIDB4MDApOworCQluaWNfd3JpdGVfYnl0ZShpZGQsIDB4MDEpOworCQlmb3IoaT0wO2k8NjQ7aSs9OCkgeworCQkJZm9yKGo9MDtqPDg7aisrKQorCQkJCXJlZGlyW2kral0gPSBuaWNfcmVhZF9ieXRlKGlkZCk7CisJCQljcmMgPSBjcmMxNl9hcmVhKHJlZGlyK2ksIDgsIChpPT0wKT8weDg3MDc6MHgwMDAwKTsKKwkJCWNyYzE2X2J5dGUoJmNyYywgbmljX3JlYWRfYnl0ZShpZGQpKTsKKwkJCWNyYzE2X2J5dGUoJmNyYywgbmljX3JlYWRfYnl0ZShpZGQpKTsKKwkJCWlmKGNyYyAhPSAweDgwMGQpCisJCQkJY3JjX29rID0gMDsKKwkJfQorCQlpZihjcmNfb2spCisJCQlyZXR1cm47CisJCWxvb3BzLS07CisJfQorCXByaW50ayhLRVJOX0VSUiAiSU9DMzogQ1JDIGVycm9yIGluIHJlZGlyZWN0aW9uIHBhZ2VcbiIpOworCWZvcihpPTA7aTw2NDtpKyspCisJCXJlZGlyW2ldID0gMHhGRjsKK30KKworc3RhdGljIHZvaWQgcmVhZF9uaWMoc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZCwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCXVuc2lnbmVkIGNoYXIgcmVkaXJbNjRdOworCXVuc2lnbmVkIGNoYXIgZGF0YVs2NF0scGFydFszMl07CisJaW50IGksajsKKworCS8qIHJlYWQgcmVkaXJlY3Rpb25zICovCisJcmVhZF9yZWRpcl9tYXAoaWRkLCBhZGRyLCByZWRpcik7CisJLyogcmVhZCBkYXRhIHBhZ2VzICovCisJcmVhZF9yZWRpcl9wYWdlKGlkZCwgYWRkciwgMCwgcmVkaXIsIGRhdGEpOworCXJlYWRfcmVkaXJfcGFnZShpZGQsIGFkZHIsIDEsIHJlZGlyLCBkYXRhKzMyKTsKKwkvKiBhc3NlbWJsZSB0aGUgcGFydCAjICovCisJaj0wOworCWZvcihpPTA7aTwxOTtpKyspCisJCWlmKGRhdGFbaSsxMV0gIT0gJyAnKQorCQkJcGFydFtqKytdID0gZGF0YVtpKzExXTsKKwlmb3IoaT0wO2k8NjtpKyspCisJCWlmKGRhdGFbaSszMl0gIT0gJyAnKQorCQkJcGFydFtqKytdID0gZGF0YVtpKzMyXTsKKwlwYXJ0W2pdID0gMDsKKwkvKiBza2lwIE9jdGFuZSBwb3dlciBzdXBwbGllcyAqLworCWlmKCFzdHJuY21wKHBhcnQsICIwNjAtMDAzNS0iLCA5KSkKKwkJcmV0dXJuOworCWlmKCFzdHJuY21wKHBhcnQsICIwNjAtMDAzOC0iLCA5KSkKKwkJcmV0dXJuOworCXN0cmNweShpZGQtPm5pY19wYXJ0LCBwYXJ0KTsKKwkvKiBhc3NlbWJsZSB0aGUgc2VyaWFsICMgKi8KKwlqPTA7CisJZm9yKGk9MDtpPDEwO2krKykKKwkJaWYoZGF0YVtpKzFdICE9ICcgJykKKwkJCWlkZC0+bmljX3NlcmlhbFtqKytdID0gZGF0YVtpKzFdOworCWlkZC0+bmljX3NlcmlhbFtqXSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfbWFjKHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlpbnQgaSwgbG9vcHMgPSAzOworCXVuc2lnbmVkIGNoYXIgZGF0YVsxM107CisKKwl3aGlsZShsb29wcz4wKSB7CisJCW5pY19hZGRyKGlkZCwgYWRkcik7CisJCW5pY193cml0ZV9ieXRlKGlkZCwgMHhGMCk7CisJCW5pY193cml0ZV9ieXRlKGlkZCwgMHgwMCk7CisJCW5pY193cml0ZV9ieXRlKGlkZCwgMHgwMCk7CisJCW5pY19yZWFkX2J5dGUoaWRkKTsKKwkJZm9yKGk9MDtpPDEzO2krKykKKwkJCWRhdGFbaV0gPSBuaWNfcmVhZF9ieXRlKGlkZCk7CisJCWlmKGNyYzE2X2FyZWEoZGF0YSwgMTMsIDB4MDAwMCkgPT0gMHg4MDBkKSB7CisJCQlmb3IoaT0xMDtpPjQ7aS0tKQorCQkJCWlkZC0+bmljX21hY1sxMC1pXSA9IGRhdGFbaV07CisJCQlyZXR1cm47CisJCX0KKwkJbG9vcHMtLTsKKwl9CisJcHJpbnRrKEtFUk5fRVJSICJJT0MzOiBDUkMgZXJyb3IgaW4gTUFDIGFkZHJlc3NcbiIpOworCWZvcihpPTA7aTw2O2krKykKKwkJaWRkLT5uaWNfbWFjW2ldID0gMHgwMDsKK30KKworc3RhdGljIHZvaWQgcHJvYmVfbmljKHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQpCit7CisgICAgICAgIGludCBzYXZlID0gMCwgbG9vcHMgPSAzOworICAgICAgICB1bnNpZ25lZCBsb25nIGZpcnN0LCBhZGRyOworCisgICAgICAgIGlkZC0+dm1hLT5ncGNyX3MgPSBHUENSX01MQU5fRU47CisKKyAgICAgICAgd2hpbGUobG9vcHM+MCkgeworICAgICAgICAgICAgICAgIGlkZC0+bmljX3BhcnRbMF0gPSAwOworICAgICAgICAgICAgICAgIGlkZC0+bmljX3NlcmlhbFswXSA9IDA7CisgICAgICAgICAgICAgICAgYWRkciA9IGZpcnN0ID0gbmljX2ZpbmQoaWRkLCAmc2F2ZSwgMCk7CisgICAgICAgICAgICAgICAgaWYoIWZpcnN0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIHdoaWxlKDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNyYzhfYWRkcihhZGRyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGFkZHIgJiAweEZGKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwQjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX25pYyhpZGQsIGFkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg4OToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDkxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfbWFjKGlkZCwgYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgPSBuaWNfZmluZChpZGQsICZzYXZlLCBhZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFkZHIgPT0gZmlyc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9vcHMtLTsKKyAgICAgICAgfQorICAgICAgICBwcmludGsoS0VSTl9FUlIgIklPQzM6IENSQyBlcnJvciBpbiBOSUMgYWRkcmVzc1xuIik7Cit9CisKKy8qIEludGVycnVwdHMgKi8KKworc3RhdGljIGlubGluZSB2b2lkCit3cml0ZV9pcmVnKHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQsIHVpbnQzMl90IHZhbCwgaW50IHdoaWNoKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWRkLT5pcl9sb2NrLCBmbGFncyk7CisJc3dpdGNoICh3aGljaCkgeworCWNhc2UgSU9DM19XX0lFUzoKKwkJd3JpdGVsKHZhbCwgJmlkZC0+dm1hLT5zaW9faWVzKTsKKwkJYnJlYWs7CisJY2FzZSBJT0MzX1dfSUVDOgorCQl3cml0ZWwodmFsLCAmaWRkLT52bWEtPnNpb19pZWMpOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRkLT5pcl9sb2NrLCBmbGFncyk7Cit9CitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGdldF9wZW5kaW5nX2ludHJzKHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnOworCXVpbnQzMl90IGludHJzID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGQtPmlyX2xvY2ssIGZsYWcpOworCWludHJzID0gcmVhZGwoJmlkZC0+dm1hLT5zaW9faXIpOworCWludHJzICY9IHJlYWRsKCZpZGQtPnZtYS0+c2lvX2llcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRkLT5pcl9sb2NrLCBmbGFnKTsKKwlyZXR1cm4gaW50cnM7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpb2MzX2ludHJfaW8oaW50IGlycSwgdm9pZCAqYXJnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQgPSAoc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKilhcmc7CisJaW50IGhhbmRsZWQgPSAxLCBpZDsKKwl1bnNpZ25lZCBpbnQgcGVuZGluZzsKKworCXJlYWRfbG9ja19pcnFzYXZlKCZpb2MzX3N1Ym1vZHVsZXNfbG9jaywgZmxhZ3MpOworCisJaWYoaWRkLT5kdWFsX2lycSAmJiBpZGQtPnZtYS0+ZWlzcikgeworCQkvKiBzZW5kIEV0aGVybmV0IElSUSB0byB0aGUgZHJpdmVyICovCisJCWlmKGlvYzNfZXRoZXJuZXQgJiYgaWRkLT5hY3RpdmVbaW9jM19ldGhlcm5ldC0+aWRdICYmCisJCQkJCQlpb2MzX2V0aGVybmV0LT5pbnRyKSB7CisJCQloYW5kbGVkID0gaGFuZGxlZCAmJiAhaW9jM19ldGhlcm5ldC0+aW50cihpb2MzX2V0aGVybmV0LAorCQkJCQkJCWlkZCwgMCwgcmVncyk7CisJCX0KKwl9CisJcGVuZGluZyA9IGdldF9wZW5kaW5nX2ludHJzKGlkZCk7CS8qIGxvb2sgYXQgdGhlIElPIElSUXMgKi8KKworCWZvcihpZD0wO2lkPElPQzNfTUFYX1NVQk1PRFVMRVM7aWQrKykgeworCQlpZihpZGQtPmFjdGl2ZVtpZF0gJiYgaW9jM19zdWJtb2R1bGVzW2lkXQorCQkJCSYmIChwZW5kaW5nICYgaW9jM19zdWJtb2R1bGVzW2lkXS0+aXJxX21hc2spCisJCQkJJiYgaW9jM19zdWJtb2R1bGVzW2lkXS0+aW50cikgeworCQkJd3JpdGVfaXJlZyhpZGQsIGlvYzNfc3VibW9kdWxlc1tpZF0tPmlycV9tYXNrLAorCQkJCQkJCUlPQzNfV19JRUMpOworCQkJaWYoIWlvYzNfc3VibW9kdWxlc1tpZF0tPmludHIoaW9jM19zdWJtb2R1bGVzW2lkXSwKKwkJCQkgICBpZGQsIHBlbmRpbmcgJiBpb2MzX3N1Ym1vZHVsZXNbaWRdLT5pcnFfbWFzaywKKwkJCQkJcmVncykpCisJCQkJcGVuZGluZyAmPSB+aW9jM19zdWJtb2R1bGVzW2lkXS0+aXJxX21hc2s7CisJCQlpZiAoaW9jM19zdWJtb2R1bGVzW2lkXS0+cmVzZXRfbWFzaykKKwkJCQl3cml0ZV9pcmVnKGlkZCwgaW9jM19zdWJtb2R1bGVzW2lkXS0+aXJxX21hc2ssCisJCQkJCQkJSU9DM19XX0lFUyk7CisJCX0KKwl9CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmaW9jM19zdWJtb2R1bGVzX2xvY2ssIGZsYWdzKTsKKwlpZihwZW5kaW5nKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAiSU9DMzogUGVuZGluZyBJUlFzIDB4JTA4eCBkaXNjYXJkZWQgYW5kIGRpc2FibGVkXG4iLHBlbmRpbmcpOworCQl3cml0ZV9pcmVnKGlkZCwgcGVuZGluZywgSU9DM19XX0lFQyk7CisJCWhhbmRsZWQgPSAxOworCX0KKwlyZXR1cm4gaGFuZGxlZD9JUlFfSEFORExFRDpJUlFfTk9ORTsKK30KKworc3RhdGljIGlycXJldHVybl90IGlvYzNfaW50cl9ldGgoaW50IGlycSwgdm9pZCAqYXJnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQgPSAoc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKilhcmc7CisJaW50IGhhbmRsZWQgPSAxOworCisJaWYoIWlkZC0+ZHVhbF9pcnEpCisJCXJldHVybiBJUlFfTk9ORTsKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmaW9jM19zdWJtb2R1bGVzX2xvY2ssIGZsYWdzKTsKKwlpZihpb2MzX2V0aGVybmV0ICYmIGlkZC0+YWN0aXZlW2lvYzNfZXRoZXJuZXQtPmlkXQorCQkJCSYmIGlvYzNfZXRoZXJuZXQtPmludHIpCisJCWhhbmRsZWQgPSBoYW5kbGVkICYmICFpb2MzX2V0aGVybmV0LT5pbnRyKGlvYzNfZXRoZXJuZXQsIGlkZCwgMCwKKwkJCQkJCQkJcmVncyk7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmaW9jM19zdWJtb2R1bGVzX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gaGFuZGxlZD9JUlFfSEFORExFRDpJUlFfTk9ORTsKK30KKwordm9pZCBpb2MzX2VuYWJsZShzdHJ1Y3QgaW9jM19zdWJtb2R1bGUgKmlzLAorCQkJCXN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICppZGQsIHVuc2lnbmVkIGludCBpcnFzKQoreworCXdyaXRlX2lyZWcoaWRkLCBpcnFzICYgaXMtPmlycV9tYXNrLCBJT0MzX1dfSUVTKTsKK30KKwordm9pZCBpb2MzX2FjayhzdHJ1Y3QgaW9jM19zdWJtb2R1bGUgKmlzLCBzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkLAorCQkJCXVuc2lnbmVkIGludCBpcnFzKQoreworCXdyaXRlbChpcnFzICYgaXMtPmlycV9tYXNrLCAmaWRkLT52bWEtPnNpb19pcik7Cit9CisKK3ZvaWQgaW9jM19kaXNhYmxlKHN0cnVjdCBpb2MzX3N1Ym1vZHVsZSAqaXMsCisJCQkJc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZCwgdW5zaWduZWQgaW50IGlycXMpCit7CisJd3JpdGVfaXJlZyhpZGQsIGlycXMgJiBpcy0+aXJxX21hc2ssIElPQzNfV19JRUMpOworfQorCit2b2lkIGlvYzNfZ3Bjcl9zZXQoc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZCwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGQtPmdwaW9fbG9jaywgZmxhZ3MpOworCXdyaXRlbCh2YWwsICZpZGQtPnZtYS0+Z3Bjcl9zKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGQtPmdwaW9fbG9jaywgZmxhZ3MpOworfQorCisvKiBLZWVwIGl0IHNpbXBsZSwgc3R1cGlkISAqLworc3RhdGljIGludCBmaW5kX3Nsb3Qodm9pZCAqKnRhYiwgaW50IG1heCkKK3sKKwlpbnQgaTsKKwlmb3IoaT0wO2k8bWF4O2krKykKKwkJaWYoISh0YWJbaV0pKQorCQkJcmV0dXJuIGk7CisJcmV0dXJuIC0xOworfQorCisvKiBSZWdpc3RlciBhbiBJT0MzIHN1Ym1vZHVsZSAqLworaW50IGlvYzNfcmVnaXN0ZXJfc3VibW9kdWxlKHN0cnVjdCBpb2MzX3N1Ym1vZHVsZSAqaXMpCit7CisJc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZDsKKwlpbnQgYWxsb2NfaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmaW9jM19zdWJtb2R1bGVzX2xvY2ssIGZsYWdzKTsKKwlhbGxvY19pZCA9IGZpbmRfc2xvdCgodm9pZCAqKilpb2MzX3N1Ym1vZHVsZXMsIElPQzNfTUFYX1NVQk1PRFVMRVMpOworCWlmKGFsbG9jX2lkICE9IC0xKSB7CisJCWlvYzNfc3VibW9kdWxlc1thbGxvY19pZF0gPSBpczsKKwkJaWYoaXMtPmV0aGVybmV0KSB7CisJCQlpZihpb2MzX2V0aGVybmV0PT1OVUxMKQorCQkJCWlvYzNfZXRoZXJuZXQ9aXM7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgIklPQzMgRXRoZXJuZXQgbW9kdWxlIGFscmVhZHkgcmVnaXN0ZXJlZCFcbiIpOworCQl9CisJfQorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZpb2MzX3N1Ym1vZHVsZXNfbG9jaywgZmxhZ3MpOworCisJaWYoYWxsb2NfaWQgPT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSW5jcmVhc2UgSU9DM19NQVhfU1VCTU9EVUxFUyFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpcy0+aWQ9YWxsb2NfaWQ7CisKKwkvKiBJbml0aWFsaXplIHN1Ym1vZHVsZSBmb3IgZWFjaCBJT0MzICovCisJaWYgKCFpcy0+cHJvYmUpCisJCXJldHVybiAwOworCisJZG93bl9yZWFkKCZpb2MzX2RldmljZXNfcndzZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaWRkLCAmaW9jM19kZXZpY2VzLCBsaXN0KSB7CisJCS8qIHNldCB0byAxIGZvciBJUlFzIGluIHByb2JlICovCisJCWlkZC0+YWN0aXZlW2FsbG9jX2lkXSA9IDE7CisJCWlkZC0+YWN0aXZlW2FsbG9jX2lkXSA9ICFpcy0+cHJvYmUoaXMsIGlkZCk7CisJfQorCXVwX3JlYWQoJmlvYzNfZGV2aWNlc19yd3NlbSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVW5yZWdpc3RlciBhbiBJT0MzIHN1Ym1vZHVsZSAqLwordm9pZCBpb2MzX3VucmVnaXN0ZXJfc3VibW9kdWxlKHN0cnVjdCBpb2MzX3N1Ym1vZHVsZSAqaXMpCit7CisJc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJd3JpdGVfbG9ja19pcnFzYXZlKCZpb2MzX3N1Ym1vZHVsZXNfbG9jaywgZmxhZ3MpOworCWlmKGlvYzNfc3VibW9kdWxlc1tpcy0+aWRdPT1pcykKKwkJaW9jM19zdWJtb2R1bGVzW2lzLT5pZF09TlVMTDsKKwllbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJJT0MzIHN1Ym1vZHVsZSAlcyBoYXMgd3JvbmcgSUQuXG4iLGlzLT5uYW1lKTsKKwlpZihpb2MzX2V0aGVybmV0PT1pcykKKwkJaW9jM19ldGhlcm5ldCA9IE5VTEw7CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmlvYzNfc3VibW9kdWxlc19sb2NrLCBmbGFncyk7CisKKwkvKiBSZW1vdmUgc3VibW9kdWxlIGZvciBlYWNoIElPQzMgKi8KKwlkb3duX3JlYWQoJmlvYzNfZGV2aWNlc19yd3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpZGQsICZpb2MzX2RldmljZXMsIGxpc3QpCisJCWlmKGlkZC0+YWN0aXZlW2lzLT5pZF0pIHsKKwkJCWlmKGlzLT5yZW1vdmUpCisJCQkJaWYoaXMtPnJlbW92ZShpcywgaWRkKSkKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkgICAgICAgIiVzOiBJT0MzIHN1Ym1vZHVsZSAlcyByZW1vdmUgZmFpbGVkICIKKwkJCQkJICAgICAgICJmb3IgcGNpX2RldiAlcy5cbiIsCisJCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIG1vZHVsZV9uYW1lKGlzLT5vd25lciksCisJCQkJCSAgICAgICBwY2lfbmFtZShpZGQtPnBkZXYpKTsKKwkJCWlkZC0+YWN0aXZlW2lzLT5pZF0gPSAwOworCQkJaWYoaXMtPmlycV9tYXNrKQorCQkJCXdyaXRlX2lyZWcoaWRkLCBpcy0+aXJxX21hc2ssIElPQzNfV19JRUMpOworCQl9CisJdXBfcmVhZCgmaW9jM19kZXZpY2VzX3J3c2VtKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKgorICogRGV2aWNlIG1hbmFnZW1lbnQgKgorICoqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGNoYXIgKgoraW9jM19jbGFzc19uYW1lc1tdPXsidW5rbm93biIsICJJUDI3IEJhc2VJTyIsICJJUDMwIHN5c3RlbSIsICJNRU5FVCAxLzIvMyIsCisJCQkiTUVORVQgNCIsICJDQURkdW8iLCAiQWx0aXggU2VyaWFsIn07CisKK3N0YXRpYyBpbnQgaW9jM19jbGFzcyhzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkKQoreworCWludCByZXMgPSBJT0MzX0NMQVNTX05PTkU7CisJLyogTklDLWJhc2VkIGxvZ2ljICovCisJaWYoIXN0cm5jbXAoaWRkLT5uaWNfcGFydCwgIjAzMC0wODkxLSIsIDkpKQorCQlyZXMgPSBJT0MzX0NMQVNTX0JBU0VfSVAzMDsKKwlpZighc3RybmNtcChpZGQtPm5pY19wYXJ0LCAiMDMwLTExNTUtIiwgOSkpCisJCXJlcyA9IElPQzNfQ0xBU1NfQ0FERFVPOworCWlmKCFzdHJuY21wKGlkZC0+bmljX3BhcnQsICIwMzAtMTY1Ny0iLCA5KSkKKwkJcmVzID0gSU9DM19DTEFTU19TRVJJQUw7CisJaWYoIXN0cm5jbXAoaWRkLT5uaWNfcGFydCwgIjAzMC0xNjY0LSIsIDkpKQorCQlyZXMgPSBJT0MzX0NMQVNTX1NFUklBTDsKKwkvKiB0b3RhbCByYW5kb20gaGV1cmlzdGljcyAqLworI2lmZGVmIENPTkZJR19TR0lfSVAyNworCWlmKCFpZGQtPm5pY19wYXJ0WzBdKQorCQlyZXMgPSBJT0MzX0NMQVNTX0JBU0VfSVAyNzsKKyNlbmRpZgorCS8qIHByaW50IGVkdWNhdGlvbmFsIG1lc3NhZ2UgKi8KKwlwcmludGsoS0VSTl9JTkZPICJJT0MzIHBhcnQ6IFslc10sIHNlcmlhbDogWyVzXSA9PiBjbGFzcyAlc1xuIiwKKwkJCWlkZC0+bmljX3BhcnQsIGlkZC0+bmljX3NlcmlhbCwgaW9jM19jbGFzc19uYW1lc1tyZXNdKTsKKwlyZXR1cm4gcmVzOworfQorLyogQWRkcyBhIG5ldyBpbnN0YW5jZSBvZiBhbiBJT0MzIGNhcmQgKi8KK3N0YXRpYyBpbnQgaW9jM19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkOworCXVpbnQzMl90IHBjbWQ7CisJaW50IHJldCwgaWQ7CisKKwkvKiBFbmFibGUgSU9DMyBhbmQgdGFrZSBvd25lcnNoaXAgb2YgaXQgKi8KKwlpZiAoKHJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IEZhaWxlZCB0byBlbmFibGUgSU9DMyBkZXZpY2UgZm9yIHBjaV9kZXYgJXMuXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gb3V0OworCX0KKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworI2lmZGVmIFVTRV82NEJJVF9ETUEKKyAgICAgICAgcmV0ID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmZmZmZmZmZmZVTEwpOworICAgICAgICBpZiAoIXJldCkgeworICAgICAgICAgICAgICAgIHJldCA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmZmZmZmZmZmZVTEwpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5hYmxlIHRvIG9idGFpbiA2NCBiaXQgRE1BICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIGNvbnNpc3RlbnQgYWxsb2NhdGlvbnNcbiIsCisJCQkJX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICB9CisJfQorI2VuZGlmCisKKwkvKiBTZXQgdXAgcGVyLUlPQzMgZGF0YSAqLworCWlkZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpZGQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgSU9DMyBkYXRhIGZvciBwY2lfZGV2ICVzLlxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgcGNpX25hbWUocGRldikpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dF9pZGQ7CisJfQorCW1lbXNldChpZGQsIDAsIHNpemVvZihzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSkpOworCXNwaW5fbG9ja19pbml0KCZpZGQtPmlyX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZpZGQtPmdwaW9fbG9jayk7CisJaWRkLT5wZGV2ID0gcGRldjsKKworCS8qIE1hcCBhbGwgSU9DMyByZWdpc3RlcnMuICBUaGVzZSBhcmUgc2hhcmVkIGJldHdlZW4gc3ViZGV2aWNlcworCSAqIHNvIHRoZSBtYWluIElPQzMgbW9kdWxlIG1hbmFnZXMgdGhlbS4KKwkgKi8KKwlpZGQtPnBtYSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlpZiAoIWlkZC0+cG1hKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIlczogVW5hYmxlIHRvIGZpbmQgSU9DMyByZXNvdXJjZSAiCisJCSAgICAgICAiZm9yIHBjaV9kZXYgJXMuXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBwY2lfbmFtZShwZGV2KSk7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3BjaTsKKwl9CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpZGQtPnBtYSwgSU9DM19QQ0lfU0laRSwgImlvYzMiKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IFVuYWJsZSB0byByZXF1ZXN0IElPQzMgcmVnaW9uICIKKwkJICAgICAgICJmb3IgcGNpX2RldiAlcy5cbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIHBjaV9uYW1lKHBkZXYpKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXRfcGNpOworCX0KKwlpZGQtPnZtYSA9IGlvcmVtYXAoaWRkLT5wbWEsIElPQzNfUENJX1NJWkUpOworCWlmICghaWRkLT52bWEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiVzOiBVbmFibGUgdG8gcmVtYXAgSU9DMyByZWdpb24gIgorCQkgICAgICAgImZvciBwY2lfZGV2ICVzLlxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgcGNpX25hbWUocGRldikpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dF9taXNjX3JlZ2lvbjsKKwl9CisKKwkvKiBUcmFjayBQQ0ktZGV2aWNlIHNwZWNpZmljIGRhdGEgKi8KKwlwY2lfc2V0X2RydmRhdGEocGRldiwgaWRkKTsKKwlkb3duX3dyaXRlKCZpb2MzX2RldmljZXNfcndzZW0pOworCWxpc3RfYWRkKCZpZGQtPmxpc3QsICZpb2MzX2RldmljZXMpOworCWlkZC0+aWQgPSBpb2MzX2NvdW50ZXIrKzsKKwl1cF93cml0ZSgmaW9jM19kZXZpY2VzX3J3c2VtKTsKKworCWlkZC0+Z3Bkcl9zaGFkb3cgPSBpZGQtPnZtYS0+Z3BkcjsKKworCS8qIFJlYWQgSU9DMyBOSUMgY29udGVudHMgKi8KKwlwcm9iZV9uaWMoaWRkKTsKKworCS8qIERldGVjdCBJT0MzIGNsYXNzICovCisJaWRkLT5jbGFzcyA9IGlvYzNfY2xhc3MoaWRkKTsKKworCS8qIEluaXRpYWxpemUgSU9DMyAqLworICAgICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJnBjbWQpOworICAgICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgUENJX0NPTU1BTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtZCB8IFBDSV9DT01NQU5EX01FTU9SWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0NPTU1BTkRfUEFSSVRZIHwgUENJX0NPTU1BTkRfU0VSUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX1NDUl9EUk9QX01PREVfRU4pOworCisJd3JpdGVfaXJlZyhpZGQsIH4wLCBJT0MzX1dfSUVDKTsKKwl3cml0ZWwofjAsICZpZGQtPnZtYS0+c2lvX2lyKTsKKworCS8qIFNldCB1cCBJUlFzICovCisJaWYoaWRkLT5jbGFzcyA9PSBJT0MzX0NMQVNTX0JBU0VfSVAzMAorCQkJCXx8IGlkZC0+Y2xhc3MgPT0gSU9DM19DTEFTU19CQVNFX0lQMjcpIHsKKwkJd3JpdGVsKDAsICZpZGQtPnZtYS0+ZWllcik7CisJCXdyaXRlbCh+MCwgJmlkZC0+dm1hLT5laXNyKTsKKworCQlpZGQtPmR1YWxfaXJxID0gMTsKKwkJaWYgKCFyZXF1ZXN0X2lycShwZGV2LT5pcnEsIGlvYzNfaW50cl9ldGgsIFNBX1NISVJRLAorCQkJCSAiaW9jMy1ldGgiLCAodm9pZCAqKWlkZCkpIHsKKwkJCWlkZC0+aXJxX2V0aCA9IHBkZXYtPmlycTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXMgOiByZXF1ZXN0X2lycSBmYWlscyBmb3IgSVJRIDB4JXhcbiAiLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXywgcGRldi0+aXJxKTsKKwkJfQorCQlpZiAoIXJlcXVlc3RfaXJxKHBkZXYtPmlycSsyLCBpb2MzX2ludHJfaW8sIFNBX1NISVJRLAorCQkJCSAiaW9jMy1pbyIsICh2b2lkICopaWRkKSkgeworCQkJaWRkLT5pcnFfaW8gPSBwZGV2LT5pcnErMjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXMgOiByZXF1ZXN0X2lycSBmYWlscyBmb3IgSVJRIDB4JXhcbiAiLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXywgcGRldi0+aXJxKzIpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCFyZXF1ZXN0X2lycShwZGV2LT5pcnEsIGlvYzNfaW50cl9pbywgU0FfU0hJUlEsCisJCQkJICJpb2MzIiwgKHZvaWQgKilpZGQpKSB7CisJCQlpZGQtPmlycV9pbyA9IHBkZXYtPmlycTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXMgOiByZXF1ZXN0X2lycSBmYWlscyBmb3IgSVJRIDB4JXhcbiAiLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXywgcGRldi0+aXJxKTsKKwkJfQorCX0KKworCS8qIEFkZCB0aGlzIElPQzMgdG8gYWxsIHN1Ym1vZHVsZXMgKi8KKwlyZWFkX2xvY2soJmlvYzNfc3VibW9kdWxlc19sb2NrKTsKKwlmb3IoaWQ9MDtpZDxJT0MzX01BWF9TVUJNT0RVTEVTO2lkKyspCisJCWlmKGlvYzNfc3VibW9kdWxlc1tpZF0gJiYgaW9jM19zdWJtb2R1bGVzW2lkXS0+cHJvYmUpIHsKKwkJCWlkZC0+YWN0aXZlW2lkXSA9IDE7CisJCQlpZGQtPmFjdGl2ZVtpZF0gPSAhaW9jM19zdWJtb2R1bGVzW2lkXS0+cHJvYmUKKwkJCQkJCShpb2MzX3N1Ym1vZHVsZXNbaWRdLCBpZGQpOworCQl9CisJcmVhZF91bmxvY2soJmlvYzNfc3VibW9kdWxlc19sb2NrKTsKKworCXByaW50ayhLRVJOX0lORk8gIklPQzMgTWFzdGVyIERyaXZlciBsb2FkZWQgZm9yICVzXG4iLCBwY2lfbmFtZShwZGV2KSk7CisKKwlyZXR1cm4gMDsKKworb3V0X21pc2NfcmVnaW9uOgorCXJlbGVhc2VfcmVnaW9uKGlkZC0+cG1hLCBJT0MzX1BDSV9TSVpFKTsKK291dF9wY2k6CisJa2ZyZWUoaWRkKTsKK291dF9pZGQ6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIFJlbW92ZXMgYSBwYXJ0aWN1bGFyIGluc3RhbmNlIG9mIGFuIElPQzMgY2FyZC4gKi8KK3N0YXRpYyB2b2lkIGlvYzNfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCBpZDsKKwlzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqaWRkOworCisJaWRkID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJLyogUmVtb3ZlIHRoaXMgSU9DMyBmcm9tIGFsbCBzdWJtb2R1bGVzICovCisJcmVhZF9sb2NrKCZpb2MzX3N1Ym1vZHVsZXNfbG9jayk7CisJZm9yKGlkPTA7aWQ8SU9DM19NQVhfU1VCTU9EVUxFUztpZCsrKQorCQlpZihpZGQtPmFjdGl2ZVtpZF0pIHsKKwkJCWlmKGlvYzNfc3VibW9kdWxlc1tpZF0gJiYgaW9jM19zdWJtb2R1bGVzW2lkXS0+cmVtb3ZlKQorCQkJCWlmKGlvYzNfc3VibW9kdWxlc1tpZF0tPnJlbW92ZShpb2MzX3N1Ym1vZHVsZXNbaWRdLAorCQkJCQkJCQlpZGQpKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSAgICAgICAiJXM6IElPQzMgc3VibW9kdWxlIDB4JXMgcmVtb3ZlIGZhaWxlZCAiCisJCQkJCSAgICAgICAiZm9yIHBjaV9kZXYgJXMuXG4iLAorCQkJCQkgICAgICAgIF9fRlVOQ1RJT05fXywKKwkJCQkJCW1vZHVsZV9uYW1lKGlvYzNfc3VibW9kdWxlc1tpZF0tPm93bmVyKSwKKwkJCQkJICAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCQlpZGQtPmFjdGl2ZVtpZF0gPSAwOworCQl9CisJcmVhZF91bmxvY2soJmlvYzNfc3VibW9kdWxlc19sb2NrKTsKKworCS8qIENsZWFyIGFuZCBkaXNhYmxlIGFsbCBJUlFzICovCisJd3JpdGVfaXJlZyhpZGQsIH4wLCBJT0MzX1dfSUVDKTsKKwl3cml0ZWwofjAsICZpZGQtPnZtYS0+c2lvX2lyKTsKKworCS8qIFJlbGVhc2UgcmVzb3VyY2VzICovCisJZnJlZV9pcnEoaWRkLT5pcnFfaW8sICh2b2lkICopaWRkKTsKKwlpZihpZGQtPmR1YWxfaXJxKQorCQlmcmVlX2lycShpZGQtPmlycV9ldGgsICh2b2lkICopaWRkKTsKKwlpb3VubWFwKGlkZC0+dm1hKTsKKwlyZWxlYXNlX3JlZ2lvbihpZGQtPnBtYSwgSU9DM19QQ0lfU0laRSk7CisKKwkvKiBEaXNhYmxlIElPQzMgYW5kIHJlbGlucXVpc2ggKi8KKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwkvKiBSZW1vdmUgYW5kIGZyZWUgZHJpdmVyIGRhdGEgKi8KKwlkb3duX3dyaXRlKCZpb2MzX2RldmljZXNfcndzZW0pOworCWxpc3RfZGVsKCZpZGQtPmxpc3QpOworCXVwX3dyaXRlKCZpb2MzX2RldmljZXNfcndzZW0pOworCWtmcmVlKGlkZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpb2MzX2lkX3RhYmxlW10gPSB7CisJe1BDSV9WRU5ET1JfSURfU0dJLCBQQ0lfREVWSUNFX0lEX1NHSV9JT0MzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEfSwKKwl7MH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpb2MzX2RyaXZlciA9IHsKKwkubmFtZSA9ICJJT0MzIiwKKwkuaWRfdGFibGUgPSBpb2MzX2lkX3RhYmxlLAorCS5wcm9iZSA9IGlvYzNfcHJvYmUsCisJLnJlbW92ZSA9IGlvYzNfcmVtb3ZlLAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlvYzNfaWRfdGFibGUpOworCisvKioqKioqKioqKioqKioqKioqKioqCisgKiBNb2R1bGUgbWFuYWdlbWVudCAqCisgKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNb2R1bGUgbG9hZCAqLworc3RhdGljIGludCBfX2RldmluaXQgaW9jM19pbml0KHZvaWQpCit7CisJaWYgKGlhNjRfcGxhdGZvcm1faXMoInNuMiIpKQorCQlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaW9jM19kcml2ZXIpOworCXJldHVybiAwOworfQorCisvKiBNb2R1bGUgdW5sb2FkICovCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgaW9jM19leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpb2MzX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGlvYzNfaW5pdCk7Cittb2R1bGVfZXhpdChpb2MzX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTdGFuaXNsYXcgU2tvd3JvbmVrIDxza3lsYXJrQGxpbnV4LW1pcHMub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ0kgZHJpdmVyIGZvciBTR0kgSU9DMyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitFWFBPUlRfU1lNQk9MKGlvYzNfcmVnaXN0ZXJfc3VibW9kdWxlKTsKK0VYUE9SVF9TWU1CT0woaW9jM191bnJlZ2lzdGVyX3N1Ym1vZHVsZSk7CitFWFBPUlRfU1lNQk9MKGlvYzNfYWNrKTsKK0VYUE9SVF9TWU1CT0woaW9jM19ncGNyX3NldCk7CitFWFBPUlRfU1lNQk9MKGlvYzNfZGlzYWJsZSk7CitFWFBPUlRfU1lNQk9MKGlvYzNfZW5hYmxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL0tjb25maWcgYi9kcml2ZXJzL3NwaS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3N2RiZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9LY29uZmlnCkBAIC0wLDAgKzEsMTA5IEBACisjCisjIFNQSSBkcml2ZXIgY29uZmlndXJhdGlvbgorIworIyBOT1RFOiAgdGhlIHJlYXNvbiB0aGlzIGRvZXNuJ3Qgc2hvdyBTUEkgc2xhdmUgc3VwcG9ydCBpcyBtb3N0bHkgdGhhdAorIyBub2JvZHkncyBuZWVkZWQgYSBzbGF2ZSBzaWRlIEFQSSB5ZXQuICBUaGUgbWFzdGVyLXJvbGUgQVBJIGlzIG5vdAorIyBmdWxseSBhcHByb3ByaWF0ZSB0aGVyZSwgc28gaXQnZCBuZWVkIHNvbWUgdGhvdWdodCB0byBkbyB3ZWxsLgorIworbWVudSAiU1BJIHN1cHBvcnQiCisKK2NvbmZpZyBTUEkKKwlib29sICJTUEkgc3VwcG9ydCIKKwloZWxwCisJICBUaGUgIlNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSIgaXMgYSBsb3cgbGV2ZWwgc3luY2hyb25vdXMKKwkgIHByb3RvY29sLiAgQ2hpcHMgdGhhdCBzdXBwb3J0IFNQSSBjYW4gaGF2ZSBkYXRhIHRyYW5zZmVyIHJhdGVzCisJICB1cCB0byBzZXZlcmFsIHRlbnMgb2YgTWJpdC9zZWMuICBDaGlwcyBhcmUgYWRkcmVzc2VkIHdpdGggYQorCSAgY29udHJvbGxlciBhbmQgYSBjaGlwc2VsZWN0LiAgTW9zdCBTUEkgc2xhdmVzIGRvbid0IHN1cHBvcnQKKwkgIGR5bmFtaWMgZGV2aWNlIGRpc2NvdmVyeTsgc29tZSBhcmUgZXZlbiB3cml0ZS1vbmx5IG9yIHJlYWQtb25seS4KKworCSAgU1BJIGlzIHdpZGVseSB1c2VkIGJ5IG1pY3JvY29udG9sbGVycyB0byB0YWxrIHdpdGggc2Vuc29ycywKKwkgIGVlcHJvbSBhbmQgZmxhc2ggbWVtb3J5LCBjb2RlY3MgYW5kIHZhcmlvdXMgb3RoZXIgY29udHJvbGxlcgorCSAgY2hpcHMsIGFuYWxvZyB0byBkaWdpdGFsIChhbmQgZC10by1hKSBjb252ZXJ0ZXJzLCBhbmQgbW9yZS4KKwkgIE1NQyBhbmQgU0QgY2FyZHMgY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIFNQSSBwcm90b2NvbDsgYW5kIGZvcgorCSAgRGF0YUZsYXNoIGNhcmRzIHVzZWQgaW4gTU1DIHNvY2tldHMsIFNQSSBtdXN0IGFsd2F5cyBiZSB1c2VkLgorCisJICBTUEkgaXMgb25lIG9mIGEgZmFtaWx5IG9mIHNpbWlsYXIgcHJvdG9jb2xzIHVzaW5nIGEgZm91ciB3aXJlCisJICBpbnRlcmZhY2UgKHNlbGVjdCwgY2xvY2ssIGRhdGEgaW4sIGRhdGEgb3V0KSBpbmNsdWRpbmcgTWljcm93aXJlCisJICAoaGFsZiBkdXBsZXgpLCBTU1AsIFNTSSwgYW5kIFBTUC4gIFRoaXMgZHJpdmVyIGZyYW1ld29yayBzaG91bGQKKwkgIHdvcmsgd2l0aCBtb3N0IHN1Y2ggZGV2aWNlcyBhbmQgY29udHJvbGxlcnMuCisKK2NvbmZpZyBTUElfREVCVUcKKwlib29sZWFuICJEZWJ1ZyBzdXBwb3J0IGZvciBTUEkgZHJpdmVycyIKKwlkZXBlbmRzIG9uIFNQSSAmJiBERUJVR19LRVJORUwKKwloZWxwCisJICBTYXkgInllcyIgdG8gZW5hYmxlIGRlYnVnIG1lc3NhZ2luZyAobGlrZSBkZXZfZGJnIGFuZCBwcl9kZWJ1ZyksCisJICBzeXNmcywgYW5kIGRlYnVnZnMgc3VwcG9ydCBpbiBTUEkgY29udHJvbGxlciBhbmQgcHJvdG9jb2wgZHJpdmVycy4KKworIworIyBNQVNURVIgc2lkZSAuLi4gdGFsa2luZyB0byBkaXNjcmV0ZSBTUEkgc2xhdmUgY2hpcHMgaW5jbHVkaW5nIG1pY3JvY29udHJvbGxlcnMKKyMKKworY29uZmlnIFNQSV9NQVNURVIKKyMJYm9vbGVhbiAiU1BJIE1hc3RlciBTdXBwb3J0IgorCWJvb2xlYW4KKwlkZWZhdWx0IFNQSQorCWhlbHAKKwkgIElmIHlvdXIgc3lzdGVtIGhhcyBhbiBtYXN0ZXItY2FwYWJsZSBTUEkgY29udHJvbGxlciAod2hpY2gKKwkgIHByb3ZpZGVzIHRoZSBjbG9jayBhbmQgY2hpcHNlbGVjdCksIHlvdSBjYW4gZW5hYmxlIHRoYXQKKwkgIGNvbnRyb2xsZXIgYW5kIHRoZSBwcm90b2NvbCBkcml2ZXJzIGZvciB0aGUgU1BJIHNsYXZlIGNoaXBzCisJICB0aGF0IGFyZSBjb25uZWN0ZWQuCisKK2NvbW1lbnQgIlNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXJzIgorCWRlcGVuZHMgb24gU1BJX01BU1RFUgorCitjb25maWcgU1BJX0JJVEJBTkcKKwl0cmlzdGF0ZSAiQml0YmFuZ2luZyBTUEkgbWFzdGVyIgorCWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBXaXRoIGEgZmV3IEdQSU8gcGlucywgeW91ciBzeXN0ZW0gY2FuIGJpdGJhbmcgdGhlIFNQSSBwcm90b2NvbC4KKwkgIFNlbGVjdCB0aGlzIHRvIGdldCBTUEkgc3VwcG9ydCB0aHJvdWdoIEkvTyBwaW5zIChHUElPLCBwYXJhbGxlbAorCSAgcG9ydCwgZXRjKS4gIE9yLCBzb21lIHN5c3RlbXMnIFNQSSBtYXN0ZXIgY29udHJvbGxlciBkcml2ZXJzIHVzZQorCSAgdGhpcyBjb2RlIHRvIG1hbmFnZSB0aGUgcGVyLXdvcmQgb3IgcGVyLXRyYW5zZmVyIGFjY2Vzc2VzIHRvIHRoZQorCSAgaGFyZHdhcmUgc2hpZnQgcmVnaXN0ZXJzLgorCisJICBUaGlzIGlzIGxpYnJhcnkgY29kZSwgYW5kIGlzIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgYnkgZHJpdmVycyB0aGF0CisJICBuZWVkIGl0LiAgWW91IG9ubHkgbmVlZCB0byBzZWxlY3QgdGhpcyBleHBsaWNpdGx5IHRvIHN1cHBvcnQgZHJpdmVyCisJICBtb2R1bGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhpcyBrZXJuZWwgdHJlZS4KKworY29uZmlnIFNQSV9CVVRURVJGTFkKKwl0cmlzdGF0ZSAiUGFyYWxsZWwgcG9ydCBhZGFwdGVyIGZvciBBVlIgQnV0dGVyZmx5IChERVZFTE9QTUVOVCkiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIFBBUlBPUlQgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IFNQSV9CSVRCQU5HCisJaGVscAorCSAgVGhpcyB1c2VzIGEgY3VzdG9tIHBhcmFsbGVsIHBvcnQgY2FibGUgdG8gY29ubmVjdCB0byBhbiBBVlIKKwkgIEJ1dHRlcmZseSA8aHR0cDovL3d3dy5hdG1lbC5jb20vcHJvZHVjdHMvYXZyL2J1dHRlcmZseT4sIGFuCisJICBpbmV4cGVuc2l2ZSBiYXR0ZXJ5IHBvd2VyZWQgbWljcm9jb250cm9sbGVyIGV2YWx1YXRpb24gYm9hcmQuCisJICBUaGlzIHNhbWUgY2FibGUgY2FuIGJlIHVzZWQgdG8gZmxhc2ggbmV3IGZpcm13YXJlLgorCitjb25maWcgU1BJX0JVVFRFUkZMWQorCXRyaXN0YXRlICJQYXJhbGxlbCBwb3J0IGFkYXB0ZXIgZm9yIEFWUiBCdXR0ZXJmbHkgKERFVkVMT1BNRU5UKSIKKwlkZXBlbmRzIG9uIFNQSV9NQVNURVIgJiYgUEFSUE9SVCAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgU1BJX0JJVEJBTkcKKwloZWxwCisJICBUaGlzIHVzZXMgYSBjdXN0b20gcGFyYWxsZWwgcG9ydCBjYWJsZSB0byBjb25uZWN0IHRvIGFuIEFWUgorCSAgQnV0dGVyZmx5IDxodHRwOi8vd3d3LmF0bWVsLmNvbS9wcm9kdWN0cy9hdnIvYnV0dGVyZmx5PiwgYW4KKwkgIGluZXhwZW5zaXZlIGJhdHRlcnkgcG93ZXJlZCBtaWNyb2NvbnRyb2xsZXIgZXZhbHVhdGlvbiBib2FyZC4KKwkgIFRoaXMgc2FtZSBjYWJsZSBjYW4gYmUgdXNlZCB0byBmbGFzaCBuZXcgZmlybXdhcmUuCisKKyMKKyMgQWRkIG5ldyBTUEkgbWFzdGVyIGNvbnRyb2xsZXJzIGluIGFscGhhYmV0aWNhbCBvcmRlciBhYm92ZSB0aGlzIGxpbmUKKyMKKworCisjCisjIFRoZXJlIGFyZSBsb3RzIG9mIFNQSSBkZXZpY2UgdHlwZXMsIHdpdGggc2Vuc29ycyBhbmQgbWVtb3J5CisjIGJlaW5nIHByb2JhYmx5IHRoZSBtb3N0IHdpZGVseSB1c2VkIG9uZXMuCisjCitjb21tZW50ICJTUEkgUHJvdG9jb2wgTWFzdGVycyIKKwlkZXBlbmRzIG9uIFNQSV9NQVNURVIKKworCisjCisjIEFkZCBuZXcgU1BJIHByb3RvY29sIG1hc3RlcnMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyIGFib3ZlIHRoaXMgbGluZQorIworCisKKyMgKHNsYXZlIHN1cHBvcnQgd291bGQgZ28gaGVyZSkKKworZW5kbWVudSAjICJTUEkgc3VwcG9ydCIKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvTWFrZWZpbGUgYi9kcml2ZXJzL3NwaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmM4N2U4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvTWFrZWZpbGUKQEAgLTAsMCArMSwyNSBAQAorIworIyBNYWtlZmlsZSBmb3Iga2VybmVsIFNQSSBkcml2ZXJzLgorIworCitpZmVxICgkKENPTkZJR19TUElfREVCVUcpLHkpCitFWFRSQV9DRkxBR1MgKz0gLURERUJVRworZW5kaWYKKworIyBzbWFsbCBjb3JlLCBtb3N0bHkgdHJhbnNsYXRpbmcgYm9hcmQtc3BlY2lmaWMKKyMgY29uZmlnIGRlY2xhcmF0aW9ucyBpbnRvIGRyaXZlciBtb2RlbCBjb2RlCitvYmotJChDT05GSUdfU1BJX01BU1RFUikJCSs9IHNwaS5vCisKKyMgU1BJIG1hc3RlciBjb250cm9sbGVyIGRyaXZlcnMgKGJ1cykKK29iai0kKENPTkZJR19TUElfQklUQkFORykJCSs9IHNwaV9iaXRiYW5nLm8KK29iai0kKENPTkZJR19TUElfQlVUVEVSRkxZKQkJKz0gc3BpX2J1dHRlcmZseS5vCisjIAkuLi4gYWRkIGFib3ZlIHRoaXMgbGluZSAuLi4KKworIyBTUEkgcHJvdG9jb2wgZHJpdmVycyAoZGV2aWNlL2xpbmsgb24gYnVzKQorIyAJLi4uIGFkZCBhYm92ZSB0aGlzIGxpbmUgLi4uCisKKyMgU1BJIHNsYXZlIGNvbnRyb2xsZXIgZHJpdmVycyAodXBzdHJlYW0gbGluaykKKyMgCS4uLiBhZGQgYWJvdmUgdGhpcyBsaW5lIC4uLgorCisjIFNQSSBzbGF2ZSBkcml2ZXJzIChwcm90b2NvbCBmb3IgdGhhdCBsaW5rKQorIyAJLi4uIGFkZCBhYm92ZSB0aGlzIGxpbmUgLi4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MWM0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGkuYwpAQCAtMCwwICsxLDY0MiBAQAorLyoKKyAqIHNwaS5jIC0gU1BJIGluaXQvY29yZSBjb2RlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IERhdmlkIEJyb3duZWxsCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2F1dG9jb25mLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisKKy8qIFNQSSBidXN0eXBlIGFuZCBzcGlfbWFzdGVyIGNsYXNzIGFyZSByZWdpc3RlcmVkIGFmdGVyIGJvYXJkIGluaXQgY29kZQorICogcHJvdmlkZXMgdGhlIFNQSSBkZXZpY2UgdGFibGVzLCBlbnN1cmluZyB0aGF0IGJvdGggYXJlIHByZXNlbnQgYnkgdGhlCisgKiB0aW1lIGNvbnRyb2xsZXIgZHJpdmVyIHJlZ2lzdHJhdGlvbiBjYXVzZXMgc3BpX2RldmljZXMgdG8gImVudW1lcmF0ZSIuCisgKi8KK3N0YXRpYyB2b2lkIHNwaWRldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwljb25zdCBzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCisJLyogc3BpIG1hc3RlcnMgbWF5IGNsZWFudXAgZm9yIHJlbGVhc2VkIGRldmljZXMgKi8KKwlpZiAoc3BpLT5tYXN0ZXItPmNsZWFudXApCisJCXNwaS0+bWFzdGVyLT5jbGVhbnVwKHNwaSk7CisKKwlzcGlfbWFzdGVyX3B1dChzcGktPm1hc3Rlcik7CisJa2ZyZWUoZGV2KTsKK30KKworc3RhdGljIHNzaXplX3QKK21vZGFsaWFzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYSwgY2hhciAqYnVmKQoreworCWNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlCSpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBCVVNfSURfU0laRSArIDEsICIlc1xuIiwgc3BpLT5tb2RhbGlhcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBzcGlfZGV2X2F0dHJzW10gPSB7CisJX19BVFRSX1JPKG1vZGFsaWFzKSwKKwlfX0FUVFJfTlVMTCwKK307CisKKy8qIG1vZGFsaWFzIHN1cHBvcnQgbWFrZXMgIm1vZHByb2JlICRNT0RBTElBUyIgbmV3LXN0eWxlIGhvdHBsdWcgd29yaywKKyAqIGFuZCB0aGUgc3lzZnMgdmVyc2lvbiBtYWtlcyBjb2xkcGx1ZyB3b3JrIHRvby4KKyAqLworCitzdGF0aWMgaW50IHNwaV9tYXRjaF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCWNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlCSpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisKKwlyZXR1cm4gc3RybmNtcChzcGktPm1vZGFsaWFzLCBkcnYtPm5hbWUsIEJVU19JRF9TSVpFKSA9PSAwOworfQorCitzdGF0aWMgaW50IHNwaV91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICoqZW52cCwgaW50IG51bV9lbnZwLAorCQljaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSkKK3sKKwljb25zdCBzdHJ1Y3Qgc3BpX2RldmljZQkJKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKKworCWVudnBbMF0gPSBidWZmZXI7CisJc25wcmludGYoYnVmZmVyLCBidWZmZXJfc2l6ZSwgIk1PREFMSUFTPSVzIiwgc3BpLT5tb2RhbGlhcyk7CisJZW52cFsxXSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZglDT05GSUdfUE0KKworLyoKKyAqIE5PVEU6ICB0aGUgc3VzcGVuZCgpIG1ldGhvZCBmb3IgYW4gc3BpX21hc3RlciBjb250cm9sbGVyIGRyaXZlcgorICogc2hvdWxkIHZlcmlmeSB0aGF0IGFsbCBpdHMgY2hpbGQgZGV2aWNlcyBhcmUgbWFya2VkIGFzIHN1c3BlbmRlZDsKKyAqIHN1c3BlbmQgcmVxdWVzdHMgZGVsaXZlcmVkIHRocm91Z2ggc3lzZnMgcG93ZXIvc3RhdGUgZmlsZXMgZG9uJ3QKKyAqIGVuZm9yY2Ugc3VjaCBjb25zdHJhaW50cy4KKyAqLworc3RhdGljIGludCBzcGlfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQoreworCWludAkJCXZhbHVlOworCXN0cnVjdCBzcGlfZHJpdmVyCSpkcnYgPSB0b19zcGlfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKworCWlmICghZHJ2LT5zdXNwZW5kKQorCQlyZXR1cm4gMDsKKworCS8qIHN1c3BlbmQgd2lsbCBzdG9wIGlycXMgYW5kIGRtYTsgbm8gbW9yZSBpL28gKi8KKwl2YWx1ZSA9IGRydi0+c3VzcGVuZCh0b19zcGlfZGV2aWNlKGRldiksIG1lc3NhZ2UpOworCWlmICh2YWx1ZSA9PSAwKQorCQlkZXYtPnBvd2VyLnBvd2VyX3N0YXRlID0gbWVzc2FnZTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgc3BpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50CQkJdmFsdWU7CisJc3RydWN0IHNwaV9kcml2ZXIJKmRydiA9IHRvX3NwaV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCisJaWYgKCFkcnYtPnJlc3VtZSkKKwkJcmV0dXJuIDA7CisKKwkvKiByZXN1bWUgbWF5IHJlc3RhcnQgdGhlIGkvbyBxdWV1ZSAqLworCXZhbHVlID0gZHJ2LT5yZXN1bWUodG9fc3BpX2RldmljZShkZXYpKTsKKwlpZiAodmFsdWUgPT0gMCkKKwkJZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CisJcmV0dXJuIHZhbHVlOworfQorCisjZWxzZQorI2RlZmluZSBzcGlfc3VzcGVuZAlOVUxMCisjZGVmaW5lIHNwaV9yZXN1bWUJTlVMTAorI2VuZGlmCisKK3N0cnVjdCBidXNfdHlwZSBzcGlfYnVzX3R5cGUgPSB7CisJLm5hbWUJCT0gInNwaSIsCisJLmRldl9hdHRycwk9IHNwaV9kZXZfYXR0cnMsCisJLm1hdGNoCQk9IHNwaV9tYXRjaF9kZXZpY2UsCisJLnVldmVudAkJPSBzcGlfdWV2ZW50LAorCS5zdXNwZW5kCT0gc3BpX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzcGlfcmVzdW1lLAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNwaV9idXNfdHlwZSk7CisKKworc3RhdGljIGludCBzcGlfZHJ2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwljb25zdCBzdHJ1Y3Qgc3BpX2RyaXZlcgkJKnNkcnYgPSB0b19zcGlfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKworCXJldHVybiBzZHJ2LT5wcm9iZSh0b19zcGlfZGV2aWNlKGRldikpOworfQorCitzdGF0aWMgaW50IHNwaV9kcnZfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwljb25zdCBzdHJ1Y3Qgc3BpX2RyaXZlcgkJKnNkcnYgPSB0b19zcGlfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKworCXJldHVybiBzZHJ2LT5yZW1vdmUodG9fc3BpX2RldmljZShkZXYpKTsKK30KKworc3RhdGljIHZvaWQgc3BpX2Rydl9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY29uc3Qgc3RydWN0IHNwaV9kcml2ZXIJCSpzZHJ2ID0gdG9fc3BpX2RyaXZlcihkZXYtPmRyaXZlcik7CisKKwlzZHJ2LT5zaHV0ZG93bih0b19zcGlfZGV2aWNlKGRldikpOworfQorCitpbnQgc3BpX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3Qgc3BpX2RyaXZlciAqc2RydikKK3sKKwlzZHJ2LT5kcml2ZXIuYnVzID0gJnNwaV9idXNfdHlwZTsKKwlpZiAoc2Rydi0+cHJvYmUpCisJCXNkcnYtPmRyaXZlci5wcm9iZSA9IHNwaV9kcnZfcHJvYmU7CisJaWYgKHNkcnYtPnJlbW92ZSkKKwkJc2Rydi0+ZHJpdmVyLnJlbW92ZSA9IHNwaV9kcnZfcmVtb3ZlOworCWlmIChzZHJ2LT5zaHV0ZG93bikKKwkJc2Rydi0+ZHJpdmVyLnNodXRkb3duID0gc3BpX2Rydl9zaHV0ZG93bjsKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZzZHJ2LT5kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BpX3JlZ2lzdGVyX2RyaXZlcik7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFNQSSBkZXZpY2VzIHNob3VsZCBub3JtYWxseSBub3QgYmUgY3JlYXRlZCBieSBTUEkgZGV2aWNlIGRyaXZlcnM7IHRoYXQKKyAqIHdvdWxkIG1ha2UgdGhlbSBib2FyZC1zcGVjaWZpYy4gIFNpbWlsYXJseSB3aXRoIFNQSSBtYXN0ZXIgZHJpdmVycy4KKyAqIERldmljZSByZWdpc3RyYXRpb24gbm9ybWFsbHkgZ29lcyBpbnRvIGxpa2UgYXJjaC8uLi4vbWFjaC4uLi9ib2FyZC1ZWVkuYworICogd2l0aCBvdGhlciByZWFkb25seSAoZmxhc2hhYmxlKSBpbmZvcm1hdGlvbiBhYm91dCBtYWluYm9hcmQgZGV2aWNlcy4KKyAqLworCitzdHJ1Y3QgYm9hcmRpbmZvIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJdW5zaWduZWQJCW5fYm9hcmRfaW5mbzsKKwlzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8JYm9hcmRfaW5mb1swXTsKK307CisKK3N0YXRpYyBMSVNUX0hFQUQoYm9hcmRfbGlzdCk7CitzdGF0aWMgREVDTEFSRV9NVVRFWChib2FyZF9sb2NrKTsKKworCisvKiBPbiB0eXBpY2FsIG1haW5ib2FyZHMsIHRoaXMgaXMgcHVyZWx5IGludGVybmFsOyBhbmQgaXQncyBub3QgbmVlZGVkCisgKiBhZnRlciBib2FyZCBpbml0IGNyZWF0ZXMgdGhlIGhhcmQtd2lyZWQgZGV2aWNlcy4gIFNvbWUgZGV2ZWxvcG1lbnQKKyAqIHBsYXRmb3JtcyBtYXkgbm90IGJlIGFibGUgdG8gdXNlIHNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvIHRob3VnaCwgYW5kCisgKiB0aGlzIGlzIGV4cG9ydGVkIHNvIHRoYXQgZm9yIGV4YW1wbGUgYSBVU0Igb3IgcGFycG9ydCBiYXNlZCBhZGFwdGVyCisgKiBkcml2ZXIgY291bGQgYWRkIGRldmljZXMgKHdoaWNoIGl0IHdvdWxkIGxlYXJuIGFib3V0IG91dC1vZi1iYW5kKS4KKyAqLworc3RydWN0IHNwaV9kZXZpY2UgKl9faW5pdF9vcl9tb2R1bGUKK3NwaV9uZXdfZGV2aWNlKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyAqY2hpcCkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqcHJveHk7CisJc3RydWN0IGRldmljZQkJKmRldiA9IG1hc3Rlci0+Y2Rldi5kZXY7CisJaW50CQkJc3RhdHVzOworCisJLyogTk9URTogIGNhbGxlciBkaWQgYW55IGNoaXAtPmJ1c19udW0gY2hlY2tzIG5lY2Vzc2FyeSAqLworCisJaWYgKCFzcGlfbWFzdGVyX2dldChtYXN0ZXIpKQorCQlyZXR1cm4gTlVMTDsKKworCXByb3h5ID0ga3phbGxvYyhzaXplb2YgKnByb3h5LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByb3h5KSB7CisJCWRldl9lcnIoZGV2LCAiY2FuJ3QgYWxsb2MgZGV2IGZvciBjcyVkXG4iLAorCQkJY2hpcC0+Y2hpcF9zZWxlY3QpOworCQlnb3RvIGZhaWw7CisJfQorCXByb3h5LT5tYXN0ZXIgPSBtYXN0ZXI7CisJcHJveHktPmNoaXBfc2VsZWN0ID0gY2hpcC0+Y2hpcF9zZWxlY3Q7CisJcHJveHktPm1heF9zcGVlZF9oeiA9IGNoaXAtPm1heF9zcGVlZF9oejsKKwlwcm94eS0+aXJxID0gY2hpcC0+aXJxOworCXByb3h5LT5tb2RhbGlhcyA9IGNoaXAtPm1vZGFsaWFzOworCisJc25wcmludGYocHJveHktPmRldi5idXNfaWQsIHNpemVvZiBwcm94eS0+ZGV2LmJ1c19pZCwKKwkJCSIlcy4ldSIsIG1hc3Rlci0+Y2Rldi5jbGFzc19pZCwKKwkJCWNoaXAtPmNoaXBfc2VsZWN0KTsKKwlwcm94eS0+ZGV2LnBhcmVudCA9IGRldjsKKwlwcm94eS0+ZGV2LmJ1cyA9ICZzcGlfYnVzX3R5cGU7CisJcHJveHktPmRldi5wbGF0Zm9ybV9kYXRhID0gKHZvaWQgKikgY2hpcC0+cGxhdGZvcm1fZGF0YTsKKwlwcm94eS0+Y29udHJvbGxlcl9kYXRhID0gY2hpcC0+Y29udHJvbGxlcl9kYXRhOworCXByb3h5LT5jb250cm9sbGVyX3N0YXRlID0gTlVMTDsKKwlwcm94eS0+ZGV2LnJlbGVhc2UgPSBzcGlkZXZfcmVsZWFzZTsKKworCS8qIGRyaXZlcnMgbWF5IG1vZGlmeSB0aGlzIGRlZmF1bHQgaS9vIHNldHVwICovCisJc3RhdHVzID0gbWFzdGVyLT5zZXR1cChwcm94eSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJZGV2X2RiZyhkZXYsICJjYW4ndCAlcyAlcywgc3RhdHVzICVkXG4iLAorCQkJCSJzZXR1cCIsIHByb3h5LT5kZXYuYnVzX2lkLCBzdGF0dXMpOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogZHJpdmVyIGNvcmUgY2F0Y2hlcyBjYWxsZXJzIHRoYXQgbWlzYmVoYXZlIGJ5IGRlZmluaW5nCisJICogZGV2aWNlcyB0aGF0IGFscmVhZHkgZXhpc3QuCisJICovCisJc3RhdHVzID0gZGV2aWNlX3JlZ2lzdGVyKCZwcm94eS0+ZGV2KTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlkZXZfZGJnKGRldiwgImNhbid0ICVzICVzLCBzdGF0dXMgJWRcbiIsCisJCQkJImFkZCIsIHByb3h5LT5kZXYuYnVzX2lkLCBzdGF0dXMpOworCQlnb3RvIGZhaWw7CisJfQorCWRldl9kYmcoZGV2LCAicmVnaXN0ZXJlZCBjaGlsZCAlc1xuIiwgcHJveHktPmRldi5idXNfaWQpOworCXJldHVybiBwcm94eTsKKworZmFpbDoKKwlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworCWtmcmVlKHByb3h5KTsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwaV9uZXdfZGV2aWNlKTsKKworLyoKKyAqIEJvYXJkLXNwZWNpZmljIGVhcmx5IGluaXQgY29kZSBjYWxscyB0aGlzIChwcm9iYWJseSBkdXJpbmcgYXJjaF9pbml0Y2FsbCkKKyAqIHdpdGggc2VnbWVudHMgb2YgdGhlIFNQSSBkZXZpY2UgdGFibGUuICBBbnkgZGV2aWNlIG5vZGVzIGFyZSBjcmVhdGVkIGxhdGVyLAorICogYWZ0ZXIgdGhlIHJlbGV2YW50IHBhcmVudCBTUEkgY29udHJvbGxlciAoYnVzX251bSkgaXMgZGVmaW5lZC4gIFdlIGtlZXAKKyAqIHRoaXMgdGFibGUgb2YgZGV2aWNlcyBmb3JldmVyLCBzbyB0aGF0IHJlbG9hZGluZyBhIGNvbnRyb2xsZXIgZHJpdmVyIHdpbGwKKyAqIG5vdCBtYWtlIExpbnV4IGZvcmdldCBhYm91dCB0aGVzZSBoYXJkLXdpcmVkIGRldmljZXMuCisgKgorICogT3RoZXIgY29kZSBjYW4gYWxzbyBjYWxsIHRoaXMsIGUuZy4gYSBwYXJ0aWN1bGFyIGFkZC1vbiBib2FyZCBtaWdodCBwcm92aWRlCisgKiBTUEkgZGV2aWNlcyB0aHJvdWdoIGl0cyBleHBhbnNpb24gY29ubmVjdG9yLCBzbyBjb2RlIGluaXRpYWxpemluZyB0aGF0IGJvYXJkCisgKiB3b3VsZCBuYXR1cmFsbHkgZGVjbGFyZSBpdHMgU1BJIGRldmljZXMuCisgKgorICogVGhlIGJvYXJkIGluZm8gcGFzc2VkIGNhbiBzYWZlbHkgYmUgX19pbml0ZGF0YSAuLi4gYnV0IGJlIGNhcmVmdWwgb2YKKyAqIGFueSBlbWJlZGRlZCBwb2ludGVycyAocGxhdGZvcm1fZGF0YSwgZXRjKSwgdGhleSdyZSBjb3BpZWQgYXMtaXMuCisgKi8KK2ludCBfX2luaXQKK3NwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBjb25zdCAqaW5mbywgdW5zaWduZWQgbikKK3sKKwlzdHJ1Y3QgYm9hcmRpbmZvCSpiaTsKKworCWJpID0ga21hbGxvYyhzaXplb2YoKmJpKSArIG4gKiBzaXplb2YgKmluZm8sIEdGUF9LRVJORUwpOworCWlmICghYmkpCisJCXJldHVybiAtRU5PTUVNOworCWJpLT5uX2JvYXJkX2luZm8gPSBuOworCW1lbWNweShiaS0+Ym9hcmRfaW5mbywgaW5mbywgbiAqIHNpemVvZiAqaW5mbyk7CisKKwlkb3duKCZib2FyZF9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZiaS0+bGlzdCwgJmJvYXJkX2xpc3QpOworCXVwKCZib2FyZF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKTsKKworLyogRklYTUUgc29tZW9uZSBzaG91bGQgYWRkIHN1cHBvcnQgZm9yIGEgX19zZXR1cCgic3BpIiwgLi4uKSB0aGF0CisgKiBjcmVhdGVzIGJvYXJkIGluZm8gZnJvbSBrZXJuZWwgY29tbWFuZCBsaW5lcworICovCisKK3N0YXRpYyB2b2lkIF9faW5pdF9vcl9tb2R1bGUKK3NjYW5fYm9hcmRpbmZvKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpCit7CisJc3RydWN0IGJvYXJkaW5mbwkqYmk7CisJc3RydWN0IGRldmljZQkJKmRldiA9IG1hc3Rlci0+Y2Rldi5kZXY7CisKKwlkb3duKCZib2FyZF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJpLCAmYm9hcmRfbGlzdCwgbGlzdCkgeworCQlzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8JKmNoaXAgPSBiaS0+Ym9hcmRfaW5mbzsKKwkJdW5zaWduZWQJCW47CisKKwkJZm9yIChuID0gYmktPm5fYm9hcmRfaW5mbzsgbiA+IDA7IG4tLSwgY2hpcCsrKSB7CisJCQlpZiAoY2hpcC0+YnVzX251bSAhPSBtYXN0ZXItPmJ1c19udW0pCisJCQkJY29udGludWU7CisJCQkvKiBzb21lIGNvbnRyb2xsZXJzIG9ubHkgaGF2ZSBvbmUgY2hpcCwgc28gdGhleQorCQkJICogbWlnaHQgbm90IHVzZSBjaGlwc2VsZWN0cy4gIG90aGVyd2lzZSwgdGhlCisJCQkgKiBjaGlwc2VsZWN0cyBhcmUgbnVtYmVyZWQgMC4ubWF4LgorCQkJICovCisJCQlpZiAoY2hpcC0+Y2hpcF9zZWxlY3QgPj0gbWFzdGVyLT5udW1fY2hpcHNlbGVjdAorCQkJCQkmJiBtYXN0ZXItPm51bV9jaGlwc2VsZWN0KSB7CisJCQkJZGV2X2RiZyhkZXYsICJjcyVkID4gbWF4ICVkXG4iLAorCQkJCQljaGlwLT5jaGlwX3NlbGVjdCwKKwkJCQkJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQkodm9pZCkgc3BpX25ld19kZXZpY2UobWFzdGVyLCBjaGlwKTsKKwkJfQorCX0KKwl1cCgmYm9hcmRfbG9jayk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHNwaV9tYXN0ZXJfcmVsZWFzZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisKKwltYXN0ZXIgPSBjb250YWluZXJfb2YoY2Rldiwgc3RydWN0IHNwaV9tYXN0ZXIsIGNkZXYpOworCWtmcmVlKG1hc3Rlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3Mgc3BpX21hc3Rlcl9jbGFzcyA9IHsKKwkubmFtZQkJPSAic3BpX21hc3RlciIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWxlYXNlCT0gc3BpX21hc3Rlcl9yZWxlYXNlLAorfTsKKworCisvKioKKyAqIHNwaV9hbGxvY19tYXN0ZXIgLSBhbGxvY2F0ZSBTUEkgbWFzdGVyIGNvbnRyb2xsZXIKKyAqIEBkZXY6IHRoZSBjb250cm9sbGVyLCBwb3NzaWJseSB1c2luZyB0aGUgcGxhdGZvcm1fYnVzCisgKiBAc2l6ZTogaG93IG11Y2ggZHJpdmVyLXByaXZhdGUgZGF0YSB0byBwcmVhbGxvY2F0ZTsgdGhlIHBvaW50ZXIgdG8gdGhpcworICogCW1lbW9yeSBpcyBpbiB0aGUgY2xhc3NfZGF0YSBmaWVsZCBvZiB0aGUgcmV0dXJuZWQgY2xhc3NfZGV2aWNlLAorICoJYWNjZXNzaWJsZSB3aXRoIHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoKS4KKyAqCisgKiBUaGlzIGNhbGwgaXMgdXNlZCBvbmx5IGJ5IFNQSSBtYXN0ZXIgY29udHJvbGxlciBkcml2ZXJzLCB3aGljaCBhcmUgdGhlCisgKiBvbmx5IG9uZXMgZGlyZWN0bHkgdG91Y2hpbmcgY2hpcCByZWdpc3RlcnMuICBJdCdzIGhvdyB0aGV5IGFsbG9jYXRlCisgKiBhbiBzcGlfbWFzdGVyIHN0cnVjdHVyZSwgcHJpb3IgdG8gY2FsbGluZyBzcGlfYWRkX21hc3RlcigpLgorICoKKyAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgZnJvbSBjb250ZXh0IHRoYXQgY2FuIHNsZWVwLiAgSXQgcmV0dXJucyB0aGUgU1BJCisgKiBtYXN0ZXIgc3RydWN0dXJlIG9uIHN1Y2Nlc3MsIGVsc2UgTlVMTC4KKyAqCisgKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhc3NpZ25pbmcgdGhlIGJ1cyBudW1iZXIgYW5kIGluaXRpYWxpemluZworICogdGhlIG1hc3RlcidzIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgc3BpX2FkZF9tYXN0ZXIoKTsgYW5kIChhZnRlciBlcnJvcnMKKyAqIGFkZGluZyB0aGUgZGV2aWNlKSBjYWxsaW5nIHNwaV9tYXN0ZXJfcHV0KCkgdG8gcHJldmVudCBhIG1lbW9yeSBsZWFrLgorICovCitzdHJ1Y3Qgc3BpX21hc3RlciAqIF9faW5pdF9vcl9tb2R1bGUKK3NwaV9hbGxvY19tYXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBzaXplKQoreworCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIE5VTEw7CisKKwltYXN0ZXIgPSBremFsbG9jKHNpemUgKyBzaXplb2YgKm1hc3RlciwgU0xBQl9LRVJORUwpOworCWlmICghbWFzdGVyKQorCQlyZXR1cm4gTlVMTDsKKworCWNsYXNzX2RldmljZV9pbml0aWFsaXplKCZtYXN0ZXItPmNkZXYpOworCW1hc3Rlci0+Y2Rldi5jbGFzcyA9ICZzcGlfbWFzdGVyX2NsYXNzOworCW1hc3Rlci0+Y2Rldi5kZXYgPSBnZXRfZGV2aWNlKGRldik7CisJc3BpX21hc3Rlcl9zZXRfZGV2ZGF0YShtYXN0ZXIsICZtYXN0ZXJbMV0pOworCisJcmV0dXJuIG1hc3RlcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwaV9hbGxvY19tYXN0ZXIpOworCisvKioKKyAqIHNwaV9yZWdpc3Rlcl9tYXN0ZXIgLSByZWdpc3RlciBTUEkgbWFzdGVyIGNvbnRyb2xsZXIKKyAqIEBtYXN0ZXI6IGluaXRpYWxpemVkIG1hc3Rlciwgb3JpZ2luYWxseSBmcm9tIHNwaV9hbGxvY19tYXN0ZXIoKQorICoKKyAqIFNQSSBtYXN0ZXIgY29udHJvbGxlcnMgY29ubmVjdCB0byB0aGVpciBkcml2ZXJzIHVzaW5nIHNvbWUgbm9uLVNQSSBidXMsCisgKiBzdWNoIGFzIHRoZSBwbGF0Zm9ybSBidXMuICBUaGUgZmluYWwgc3RhZ2Ugb2YgcHJvYmUoKSBpbiB0aGF0IGNvZGUKKyAqIGluY2x1ZGVzIGNhbGxpbmcgc3BpX3JlZ2lzdGVyX21hc3RlcigpIHRvIGhvb2sgdXAgdG8gdGhpcyBTUEkgYnVzIGdsdWUuCisgKgorICogU1BJIGNvbnRyb2xsZXJzIHVzZSBib2FyZCBzcGVjaWZpYyAob2Z0ZW4gU09DIHNwZWNpZmljKSBidXMgbnVtYmVycywKKyAqIGFuZCBib2FyZC1zcGVjaWZpYyBhZGRyZXNzaW5nIGZvciBTUEkgZGV2aWNlcyBjb21iaW5lcyB0aG9zZSBudW1iZXJzCisgKiB3aXRoIGNoaXAgc2VsZWN0IG51bWJlcnMuICBTaW5jZSBTUEkgZG9lcyBub3QgZGlyZWN0bHkgc3VwcG9ydCBkeW5hbWljCisgKiBkZXZpY2UgaWRlbnRpZmljYXRpb24sIGJvYXJkcyBuZWVkIGNvbmZpZ3VyYXRpb24gdGFibGVzIHRlbGxpbmcgd2hpY2gKKyAqIGNoaXAgaXMgYXQgd2hpY2ggYWRkcmVzcy4KKyAqCisgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGZyb20gY29udGV4dCB0aGF0IGNhbiBzbGVlcC4gIEl0IHJldHVybnMgemVybyBvbgorICogc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgKGRyb3BwaW5nIHRoZSBtYXN0ZXIncyByZWZjb3VudCkuCisgKiBBZnRlciBhIHN1Y2Nlc3NmdWwgcmV0dXJuLCB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nCisgKiBzcGlfdW5yZWdpc3Rlcl9tYXN0ZXIoKS4KKyAqLworaW50IF9faW5pdF9vcl9tb2R1bGUKK3NwaV9yZWdpc3Rlcl9tYXN0ZXIoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKK3sKKwlzdGF0aWMgYXRvbWljX3QJCWR5bl9idXNfaWQgPSBBVE9NSUNfSU5JVCgwKTsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2ID0gbWFzdGVyLT5jZGV2LmRldjsKKwlpbnQJCQlzdGF0dXMgPSAtRU5PREVWOworCWludAkJCWR5bmFtaWMgPSAwOworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJLyogY29udmVudGlvbjogIGR5bmFtaWNhbGx5IGFzc2lnbmVkIGJ1cyBJRHMgY291bnQgZG93biBmcm9tIHRoZSBtYXggKi8KKwlpZiAobWFzdGVyLT5idXNfbnVtID09IDApIHsKKwkJbWFzdGVyLT5idXNfbnVtID0gYXRvbWljX2RlY19yZXR1cm4oJmR5bl9idXNfaWQpOworCQlkeW5hbWljID0gMTsKKwl9CisKKwkvKiByZWdpc3RlciB0aGUgZGV2aWNlLCB0aGVuIHVzZXJzcGFjZSB3aWxsIHNlZSBpdC4KKwkgKiByZWdpc3RyYXRpb24gZmFpbHMgaWYgdGhlIGJ1cyBJRCBpcyBpbiB1c2UuCisJICovCisJc25wcmludGYobWFzdGVyLT5jZGV2LmNsYXNzX2lkLCBzaXplb2YgbWFzdGVyLT5jZGV2LmNsYXNzX2lkLAorCQkic3BpJXUiLCBtYXN0ZXItPmJ1c19udW0pOworCXN0YXR1cyA9IGNsYXNzX2RldmljZV9hZGQoJm1hc3Rlci0+Y2Rldik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZG9uZTsKKwlkZXZfZGJnKGRldiwgInJlZ2lzdGVyZWQgbWFzdGVyICVzJXNcbiIsIG1hc3Rlci0+Y2Rldi5jbGFzc19pZCwKKwkJCWR5bmFtaWMgPyAiIChkeW5hbWljKSIgOiAiIik7CisKKwkvKiBwb3B1bGF0ZSBjaGlsZHJlbiBmcm9tIGFueSBzcGkgZGV2aWNlIHRhYmxlcyAqLworCXNjYW5fYm9hcmRpbmZvKG1hc3Rlcik7CisJc3RhdHVzID0gMDsKK2RvbmU6CisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwaV9yZWdpc3Rlcl9tYXN0ZXIpOworCisKK3N0YXRpYyBpbnQgX191bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqdW51c2VkKQoreworCS8qIG5vdGU6IGJlZm9yZSBhYm91dCAyLjYuMTQtcmMxIHRoaXMgd291bGQgY29ycnVwdCBtZW1vcnk6ICovCisJc3BpX3VucmVnaXN0ZXJfZGV2aWNlKHRvX3NwaV9kZXZpY2UoZGV2KSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc3BpX3VucmVnaXN0ZXJfbWFzdGVyIC0gdW5yZWdpc3RlciBTUEkgbWFzdGVyIGNvbnRyb2xsZXIKKyAqIEBtYXN0ZXI6IHRoZSBtYXN0ZXIgYmVpbmcgdW5yZWdpc3RlcmVkCisgKgorICogVGhpcyBjYWxsIGlzIHVzZWQgb25seSBieSBTUEkgbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVycywgd2hpY2ggYXJlIHRoZQorICogb25seSBvbmVzIGRpcmVjdGx5IHRvdWNoaW5nIGNoaXAgcmVnaXN0ZXJzLgorICoKKyAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgZnJvbSBjb250ZXh0IHRoYXQgY2FuIHNsZWVwLgorICovCit2b2lkIHNwaV91bnJlZ2lzdGVyX21hc3RlcihzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQoreworCSh2b2lkKSBkZXZpY2VfZm9yX2VhY2hfY2hpbGQobWFzdGVyLT5jZGV2LmRldiwgTlVMTCwgX191bnJlZ2lzdGVyKTsKKwljbGFzc19kZXZpY2VfdW5yZWdpc3RlcigmbWFzdGVyLT5jZGV2KTsKKwltYXN0ZXItPmNkZXYuZGV2ID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwaV91bnJlZ2lzdGVyX21hc3Rlcik7CisKKy8qKgorICogc3BpX2J1c251bV90b19tYXN0ZXIgLSBsb29rIHVwIG1hc3RlciBhc3NvY2lhdGVkIHdpdGggYnVzX251bQorICogQGJ1c19udW06IHRoZSBtYXN0ZXIncyBidXMgbnVtYmVyCisgKgorICogVGhpcyBjYWxsIG1heSBiZSB1c2VkIHdpdGggZGV2aWNlcyB0aGF0IGFyZSByZWdpc3RlcmVkIGFmdGVyCisgKiBhcmNoIGluaXQgdGltZS4gIEl0IHJldHVybnMgYSByZWZjb3VudGVkIHBvaW50ZXIgdG8gdGhlIHJlbGV2YW50CisgKiBzcGlfbWFzdGVyICh3aGljaCB0aGUgY2FsbGVyIG11c3QgcmVsZWFzZSksIG9yIE5VTEwgaWYgdGhlcmUgaXMKKyAqIG5vIHN1Y2ggbWFzdGVyIHJlZ2lzdGVyZWQuCisgKi8KK3N0cnVjdCBzcGlfbWFzdGVyICpzcGlfYnVzbnVtX3RvX21hc3Rlcih1MTYgYnVzX251bSkKK3sKKwlpZiAoYnVzX251bSkgeworCQljaGFyCQkJbmFtZVs4XTsKKwkJc3RydWN0IGtvYmplY3QJCSpidXM7CisKKwkJc25wcmludGYobmFtZSwgc2l6ZW9mIG5hbWUsICJzcGkldSIsIGJ1c19udW0pOworCQlidXMgPSBrc2V0X2ZpbmRfb2JqKCZzcGlfbWFzdGVyX2NsYXNzLnN1YnN5cy5rc2V0LCBuYW1lKTsKKwkJaWYgKGJ1cykKKwkJCXJldHVybiBjb250YWluZXJfb2YoYnVzLCBzdHJ1Y3Qgc3BpX21hc3RlciwgY2Rldi5rb2JqKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcGlfYnVzbnVtX3RvX21hc3Rlcik7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgc3BpX2NvbXBsZXRlKHZvaWQgKmFyZykKK3sKKwljb21wbGV0ZShhcmcpOworfQorCisvKioKKyAqIHNwaV9zeW5jIC0gYmxvY2tpbmcvc3luY2hyb25vdXMgU1BJIGRhdGEgdHJhbnNmZXJzCisgKiBAc3BpOiBkZXZpY2Ugd2l0aCB3aGljaCBkYXRhIHdpbGwgYmUgZXhjaGFuZ2VkCisgKiBAbWVzc2FnZTogZGVzY3JpYmVzIHRoZSBkYXRhIHRyYW5zZmVycworICoKKyAqIFRoaXMgY2FsbCBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBjb250ZXh0IHRoYXQgbWF5IHNsZWVwLiAgVGhlIHNsZWVwCisgKiBpcyBub24taW50ZXJydXB0aWJsZSwgYW5kIGhhcyBubyB0aW1lb3V0LiAgTG93LW92ZXJoZWFkIGNvbnRyb2xsZXIKKyAqIGRyaXZlcnMgbWF5IERNQSBkaXJlY3RseSBpbnRvIGFuZCBvdXQgb2YgdGhlIG1lc3NhZ2UgYnVmZmVycy4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIFNQSSBkZXZpY2UncyBjaGlwIHNlbGVjdCBpcyBhY3RpdmUgZHVyaW5nIHRoZSBtZXNzYWdlLAorICogYW5kIHRoZW4gaXMgbm9ybWFsbHkgZGlzYWJsZWQgYmV0d2VlbiBtZXNzYWdlcy4gIERyaXZlcnMgZm9yIHNvbWUKKyAqIGZyZXF1ZW50bHktdXNlZCBkZXZpY2VzIG1heSB3YW50IHRvIG1pbmltaXplIGNvc3RzIG9mIHNlbGVjdGluZyBhIGNoaXAsCisgKiBieSBsZWF2aW5nIGl0IHNlbGVjdGVkIGluIGFudGljaXBhdGlvbiB0aGF0IHRoZSBuZXh0IG1lc3NhZ2Ugd2lsbCBnbworICogdG8gdGhlIHNhbWUgY2hpcC4gIChUaGF0IG1heSBpbmNyZWFzZSBwb3dlciB1c2FnZS4pCisgKgorICogQWxzbywgdGhlIGNhbGxlciBpcyBndWFyYW50ZWVpbmcgdGhhdCB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAqIG1lc3NhZ2Ugd2lsbCBub3QgYmUgZnJlZWQgYmVmb3JlIHRoaXMgY2FsbCByZXR1cm5zLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIHRoZSBtZXNzYWdlIGNvdWxkIG5vdCBiZQorICogc3VibWl0dGVkLCBlbHNlIHplcm8uICBXaGVuIHRoZSB2YWx1ZSBpcyB6ZXJvLCB0aGVuIG1lc3NhZ2UtPnN0YXR1cyBpcworICogYWxzbyBkZWZpbmVkOiAgaXQncyB0aGUgY29tcGxldGlvbiBjb2RlIGZvciB0aGUgdHJhbnNmZXIsIGVpdGhlciB6ZXJvCisgKiBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgZnJvbSB0aGUgY29udHJvbGxlciBkcml2ZXIuCisgKi8KK2ludCBzcGlfc3luYyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc3NhZ2UpCit7CisJREVDTEFSRV9DT01QTEVUSU9OKGRvbmUpOworCWludCBzdGF0dXM7CisKKwltZXNzYWdlLT5jb21wbGV0ZSA9IHNwaV9jb21wbGV0ZTsKKwltZXNzYWdlLT5jb250ZXh0ID0gJmRvbmU7CisJc3RhdHVzID0gc3BpX2FzeW5jKHNwaSwgbWVzc2FnZSk7CisJaWYgKHN0YXR1cyA9PSAwKQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkb25lKTsKKwltZXNzYWdlLT5jb250ZXh0ID0gTlVMTDsKKwlyZXR1cm4gc3RhdHVzOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BpX3N5bmMpOworCisjZGVmaW5lCVNQSV9CVUZTSVoJKFNNUF9DQUNIRV9CWVRFUykKKworc3RhdGljIHU4CSpidWY7CisKKy8qKgorICogc3BpX3dyaXRlX3RoZW5fcmVhZCAtIFNQSSBzeW5jaHJvbm91cyB3cml0ZSBmb2xsb3dlZCBieSByZWFkCisgKiBAc3BpOiBkZXZpY2Ugd2l0aCB3aGljaCBkYXRhIHdpbGwgYmUgZXhjaGFuZ2VkCisgKiBAdHhidWY6IGRhdGEgdG8gYmUgd3JpdHRlbiAobmVlZCBub3QgYmUgZG1hLXNhZmUpCisgKiBAbl90eDogc2l6ZSBvZiB0eGJ1ZiwgaW4gYnl0ZXMKKyAqIEByeGJ1ZjogYnVmZmVyIGludG8gd2hpY2ggZGF0YSB3aWxsIGJlIHJlYWQKKyAqIEBuX3J4OiBzaXplIG9mIHJ4YnVmLCBpbiBieXRlcyAobmVlZCBub3QgYmUgZG1hLXNhZmUpCisgKgorICogVGhpcyBwZXJmb3JtcyBhIGhhbGYgZHVwbGV4IE1pY3JvV2lyZSBzdHlsZSB0cmFuc2FjdGlvbiB3aXRoIHRoZQorICogZGV2aWNlLCBzZW5kaW5nIHR4YnVmIGFuZCB0aGVuIHJlYWRpbmcgcnhidWYuICBUaGUgcmV0dXJuIHZhbHVlCisgKiBpcyB6ZXJvIGZvciBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJybm8gc3RhdHVzIGNvZGUuCisgKiBUaGlzIGNhbGwgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgY29udGV4dCB0aGF0IG1heSBzbGVlcC4KKyAqCisgKiBQYXJhbWV0ZXJzIHRvIHRoaXMgcm91dGluZSBhcmUgYWx3YXlzIGNvcGllZCB1c2luZyBhIHNtYWxsIGJ1ZmZlcjsKKyAqIHBlcmZvcm1hbmNlLXNlbnNpdGl2ZSBvciBidWxrIHRyYW5zZmVyIGNvZGUgc2hvdWxkIGluc3RlYWQgdXNlCisgKiBzcGlfe2FzeW5jLHN5bmN9KCkgY2FsbHMgd2l0aCBkbWEtc2FmZSBidWZmZXJzLgorICovCitpbnQgc3BpX3dyaXRlX3RoZW5fcmVhZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQljb25zdCB1OCAqdHhidWYsIHVuc2lnbmVkIG5fdHgsCisJCXU4ICpyeGJ1ZiwgdW5zaWduZWQgbl9yeCkKK3sKKwlzdGF0aWMgREVDTEFSRV9NVVRFWChsb2NrKTsKKworCWludAkJCXN0YXR1czsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UJbWVzc2FnZTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXhbMl07CisJdTgJCQkqbG9jYWxfYnVmOworCisJLyogVXNlIHByZWFsbG9jYXRlZCBETUEtc2FmZSBidWZmZXIuICBXZSBjYW4ndCBhdm9pZCBjb3B5aW5nIGhlcmUsCisJICogKGFzIGEgcHVyZSBjb252ZW5pZW5jZSB0aGluZyksIGJ1dCB3ZSBjYW4ga2VlcCBoZWFwIGNvc3RzCisJICogb3V0IG9mIHRoZSBob3QgcGF0aCAuLi4KKwkgKi8KKwlpZiAoKG5fdHggKyBuX3J4KSA+IFNQSV9CVUZTSVopCisJCXJldHVybiAtRUlOVkFMOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbWVzc2FnZSk7CisJbWVtc2V0KHgsIDAsIHNpemVvZiB4KTsKKwlpZiAobl90eCkgeworCQl4WzBdLmxlbiA9IG5fdHg7CisJCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4WzBdLCAmbWVzc2FnZSk7CisJfQorCWlmIChuX3J4KSB7CisJCXhbMV0ubGVuID0gbl9yeDsKKwkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhbMV0sICZtZXNzYWdlKTsKKwl9CisKKwkvKiAuLi4gdW5sZXNzIHNvbWVvbmUgZWxzZSBpcyB1c2luZyB0aGUgcHJlLWFsbG9jYXRlZCBidWZmZXIgKi8KKwlpZiAoZG93bl90cnlsb2NrKCZsb2NrKSkgeworCQlsb2NhbF9idWYgPSBrbWFsbG9jKFNQSV9CVUZTSVosIEdGUF9LRVJORUwpOworCQlpZiAoIWxvY2FsX2J1ZikKKwkJCXJldHVybiAtRU5PTUVNOworCX0gZWxzZQorCQlsb2NhbF9idWYgPSBidWY7CisKKwltZW1jcHkobG9jYWxfYnVmLCB0eGJ1Ziwgbl90eCk7CisJeFswXS50eF9idWYgPSBsb2NhbF9idWY7CisJeFsxXS5yeF9idWYgPSBsb2NhbF9idWYgKyBuX3R4OworCisJLyogZG8gdGhlIGkvbyAqLworCXN0YXR1cyA9IHNwaV9zeW5jKHNwaSwgJm1lc3NhZ2UpOworCWlmIChzdGF0dXMgPT0gMCkgeworCQltZW1jcHkocnhidWYsIHhbMV0ucnhfYnVmLCBuX3J4KTsKKwkJc3RhdHVzID0gbWVzc2FnZS5zdGF0dXM7CisJfQorCisJaWYgKHhbMF0udHhfYnVmID09IGJ1ZikKKwkJdXAoJmxvY2spOworCWVsc2UKKwkJa2ZyZWUobG9jYWxfYnVmKTsKKworCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcGlfd3JpdGVfdGhlbl9yZWFkKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBfX2luaXQgc3BpX2luaXQodm9pZCkKK3sKKwlpbnQJc3RhdHVzOworCisJYnVmID0ga21hbGxvYyhTUElfQlVGU0laLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBlcnIwOworCX0KKworCXN0YXR1cyA9IGJ1c19yZWdpc3Rlcigmc3BpX2J1c190eXBlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnIxOworCisJc3RhdHVzID0gY2xhc3NfcmVnaXN0ZXIoJnNwaV9tYXN0ZXJfY2xhc3MpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycjI7CisJcmV0dXJuIDA7CisKK2VycjI6CisJYnVzX3VucmVnaXN0ZXIoJnNwaV9idXNfdHlwZSk7CitlcnIxOgorCWtmcmVlKGJ1Zik7CisJYnVmID0gTlVMTDsKK2VycjA6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogYm9hcmRfaW5mbyBpcyBub3JtYWxseSByZWdpc3RlcmVkIGluIGFyY2hfaW5pdGNhbGwoKSwKKyAqIGJ1dCBldmVuIGVzc2VudGlhbCBkcml2ZXJzIHdhaXQgdGlsbCBsYXRlcgorICoKKyAqIFJFVklTSVQgb25seSBib2FyZGluZm8gcmVhbGx5IG5lZWRzIHN0YXRpYyBsaW5raW5nLiB0aGUgcmVzdCAoZGV2aWNlIGFuZAorICogZHJpdmVyIHJlZ2lzdHJhdGlvbikgX2NvdWxkXyBiZSBkeW5hbWljYWxseSBsaW5rZWQgKG1vZHVsYXIpIC4uLiBjb3N0cworICogaW5jbHVkZSBuZWVkaW5nIHRvIGhhdmUgYm9hcmRpbmZvIGRhdGEgc3RydWN0dXJlcyBiZSBtdWNoIG1vcmUgcHVibGljLgorICovCitzdWJzeXNfaW5pdGNhbGwoc3BpX2luaXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfYml0YmFuZy5jIGIvZHJpdmVycy9zcGkvc3BpX2JpdGJhbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDM3ZTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvc3BpX2JpdGJhbmcuYwpAQCAtMCwwICsxLDQ3MiBAQAorLyoKKyAqIHNwaV9iaXRiYW5nLmMgLSBwb2xsaW5nL2JpdGJhbmdpbmcgU1BJIG1hc3RlciBjb250cm9sbGVyIGRyaXZlciB1dGlsaXRpZXMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogRklSU1QgUEFSVCAoT1BUSU9OQUwpOiAgd29yZC1hdC1hLXRpbWUgc3BpX3RyYW5zZmVyIHN1cHBvcnQuCisgKiBVc2UgdGhpcyBmb3IgR1BJTyBvciBzaGlmdC1yZWdpc3RlciBsZXZlbCBoYXJkd2FyZSBBUElzLgorICoKKyAqIHNwaV9iaXRiYW5nX2NzIGlzIGluIHNwaV9kZXZpY2UtPmNvbnRyb2xsZXJfc3RhdGUsIHdoaWNoIGlzIHVuYXZhaWxhYmxlCisgKiB0byBnbHVlIGNvZGUuICBUaGVzZSBiaXRiYW5nIHNldHVwKCkgYW5kIGNsZWFudXAoKSByb3V0aW5lcyBhcmUgYWx3YXlzCisgKiB1c2VkLCB0aG91Z2ggbWF5YmUgdGhleSdyZSBjYWxsZWQgZnJvbSBjb250cm9sbGVyLWF3YXJlIGNvZGUuCisgKgorICogY2hpcHNlbGVjdCgpIGFuZCBmcmllbmRzIG1heSB1c2UgdXNlIHNwaV9kZXZpY2UtPmNvbnRyb2xsZXJfZGF0YSBhbmQKKyAqIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGFzIGFwcHJvcHJpYXRlLgorICoKKyAqCisgKiBOT1RFOiAgU1BJIGNvbnRyb2xsZXIgcGlucyBjYW4gb2Z0ZW4gYmUgdXNlZCBhcyBHUElPIHBpbnMgaW5zdGVhZCwKKyAqIHdoaWNoIG1lYW5zIHlvdSBjb3VsZCB1c2UgYSBiaXRiYW5nIGRyaXZlciBlaXRoZXIgdG8gZ2V0IGhhcmR3YXJlCisgKiB3b3JraW5nIHF1aWNrbHksIG9yIHRlc3RpbmcgZm9yIGRpZmZlcmVuY2VzIHRoYXQgYXJlbid0IHNwZWVkIHJlbGF0ZWQuCisgKi8KKworc3RydWN0IHNwaV9iaXRiYW5nX2NzIHsKKwl1bnNpZ25lZAluc2VjczsJLyogKGNsb2NrIGN5Y2xlIHRpbWUpLzIgKi8KKwl1MzIJCSgqdHhyeF93b3JkKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1bnNpZ25lZCBuc2VjcywKKwkJCQkJdTMyIHdvcmQsIHU4IGJpdHMpOworCXVuc2lnbmVkCSgqdHhyeF9idWZzKShzdHJ1Y3Qgc3BpX2RldmljZSAqLAorCQkJCQl1MzIgKCp0eHJ4X3dvcmQpKAorCQkJCQkJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQkJCXVuc2lnbmVkIG5zZWNzLAorCQkJCQkJdTMyIHdvcmQsIHU4IGJpdHMpLAorCQkJCQl1bnNpZ25lZCwgc3RydWN0IHNwaV90cmFuc2ZlciAqKTsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBiaXRiYW5nX3R4cnhfOCgKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpLAorCXUzMgkJCSgqdHhyeF93b3JkKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCQl1bnNpZ25lZCBuc2VjcywKKwkJCQkJdTMyIHdvcmQsIHU4IGJpdHMpLAorCXVuc2lnbmVkCQlucywKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSp0CispIHsKKwl1bnNpZ25lZAkJYml0cyA9IHNwaS0+Yml0c19wZXJfd29yZDsKKwl1bnNpZ25lZAkJY291bnQgPSB0LT5sZW47CisJY29uc3QgdTgJCSp0eCA9IHQtPnR4X2J1ZjsKKwl1OAkJCSpyeCA9IHQtPnJ4X2J1ZjsKKworCXdoaWxlIChsaWtlbHkoY291bnQgPiAwKSkgeworCQl1OAkJd29yZCA9IDA7CisKKwkJaWYgKHR4KQorCQkJd29yZCA9ICp0eCsrOworCQl3b3JkID0gdHhyeF93b3JkKHNwaSwgbnMsIHdvcmQsIGJpdHMpOworCQlpZiAocngpCisJCQkqcngrKyA9IHdvcmQ7CisJCWNvdW50IC09IDE7CisJfQorCXJldHVybiB0LT5sZW4gLSBjb3VudDsKK30KKworc3RhdGljIHVuc2lnbmVkIGJpdGJhbmdfdHhyeF8xNigKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpLAorCXUzMgkJCSgqdHhyeF93b3JkKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCQl1bnNpZ25lZCBuc2VjcywKKwkJCQkJdTMyIHdvcmQsIHU4IGJpdHMpLAorCXVuc2lnbmVkCQlucywKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSp0CispIHsKKwl1bnNpZ25lZAkJYml0cyA9IHNwaS0+Yml0c19wZXJfd29yZDsKKwl1bnNpZ25lZAkJY291bnQgPSB0LT5sZW47CisJY29uc3QgdTE2CQkqdHggPSB0LT50eF9idWY7CisJdTE2CQkJKnJ4ID0gdC0+cnhfYnVmOworCisJd2hpbGUgKGxpa2VseShjb3VudCA+IDEpKSB7CisJCXUxNgkJd29yZCA9IDA7CisKKwkJaWYgKHR4KQorCQkJd29yZCA9ICp0eCsrOworCQl3b3JkID0gdHhyeF93b3JkKHNwaSwgbnMsIHdvcmQsIGJpdHMpOworCQlpZiAocngpCisJCQkqcngrKyA9IHdvcmQ7CisJCWNvdW50IC09IDI7CisJfQorCXJldHVybiB0LT5sZW4gLSBjb3VudDsKK30KKworc3RhdGljIHVuc2lnbmVkIGJpdGJhbmdfdHhyeF8zMigKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpLAorCXUzMgkJCSgqdHhyeF93b3JkKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCQl1bnNpZ25lZCBuc2VjcywKKwkJCQkJdTMyIHdvcmQsIHU4IGJpdHMpLAorCXVuc2lnbmVkCQlucywKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSp0CispIHsKKwl1bnNpZ25lZAkJYml0cyA9IHNwaS0+Yml0c19wZXJfd29yZDsKKwl1bnNpZ25lZAkJY291bnQgPSB0LT5sZW47CisJY29uc3QgdTMyCQkqdHggPSB0LT50eF9idWY7CisJdTMyCQkJKnJ4ID0gdC0+cnhfYnVmOworCisJd2hpbGUgKGxpa2VseShjb3VudCA+IDMpKSB7CisJCXUzMgkJd29yZCA9IDA7CisKKwkJaWYgKHR4KQorCQkJd29yZCA9ICp0eCsrOworCQl3b3JkID0gdHhyeF93b3JkKHNwaSwgbnMsIHdvcmQsIGJpdHMpOworCQlpZiAocngpCisJCQkqcngrKyA9IHdvcmQ7CisJCWNvdW50IC09IDQ7CisJfQorCXJldHVybiB0LT5sZW4gLSBjb3VudDsKK30KKworLyoqCisgKiBzcGlfYml0YmFuZ19zZXR1cCAtIGRlZmF1bHQgc2V0dXAgZm9yIHBlci13b3JkIEkvTyBsb29wcworICovCitpbnQgc3BpX2JpdGJhbmdfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3Qgc3BpX2JpdGJhbmdfY3MJKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCXN0cnVjdCBzcGlfYml0YmFuZwkqYml0YmFuZzsKKworCWlmICghc3BpLT5tYXhfc3BlZWRfaHopCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFjcykgeworCQljcyA9IGt6YWxsb2Moc2l6ZW9mICpjcywgU0xBQl9LRVJORUwpOworCQlpZiAoIWNzKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXNwaS0+Y29udHJvbGxlcl9zdGF0ZSA9IGNzOworCX0KKwliaXRiYW5nID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisKKwlpZiAoIXNwaS0+Yml0c19wZXJfd29yZCkKKwkJc3BpLT5iaXRzX3Blcl93b3JkID0gODsKKworCS8qIHNwaV90cmFuc2ZlciBsZXZlbCBjYWxscyB0aGF0IHdvcmsgcGVyLXdvcmQgKi8KKwlpZiAoc3BpLT5iaXRzX3Blcl93b3JkIDw9IDgpCisJCWNzLT50eHJ4X2J1ZnMgPSBiaXRiYW5nX3R4cnhfODsKKwllbHNlIGlmIChzcGktPmJpdHNfcGVyX3dvcmQgPD0gMTYpCisJCWNzLT50eHJ4X2J1ZnMgPSBiaXRiYW5nX3R4cnhfMTY7CisJZWxzZSBpZiAoc3BpLT5iaXRzX3Blcl93b3JkIDw9IDMyKQorCQljcy0+dHhyeF9idWZzID0gYml0YmFuZ190eHJ4XzMyOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBwZXItd29yZCBzaGlmdCByZWdpc3RlciBhY2Nlc3MsIGluIGhhcmR3YXJlIG9yIGJpdGJhbmdpbmcgKi8KKwljcy0+dHhyeF93b3JkID0gYml0YmFuZy0+dHhyeF93b3JkW3NwaS0+bW9kZSAmIChTUElfQ1BPTHxTUElfQ1BIQSldOworCWlmICghY3MtPnR4cnhfd29yZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBuc2VjcyA9IChjbG9jayBwZXJpb2QpLzIgKi8KKwljcy0+bnNlY3MgPSAoMTAwMDAwMDAwMC8yKSAvIChzcGktPm1heF9zcGVlZF9oeik7CisJaWYgKGNzLT5uc2VjcyA+IE1BWF9VREVMQVlfTVMgKiAxMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldl9kYmcoJnNwaS0+ZGV2LCAiJXMsIG1vZGUgJWQsICV1IGJpdHMvdywgJXUgbnNlY1xuIiwKKwkJCV9fRlVOQ1RJT05fXywgc3BpLT5tb2RlICYgKFNQSV9DUE9MIHwgU1BJX0NQSEEpLAorCQkJc3BpLT5iaXRzX3Blcl93b3JkLCAyICogY3MtPm5zZWNzKTsKKworCS8qIE5PVEUgd2UgX25lZWRfIHRvIGNhbGwgY2hpcHNlbGVjdCgpIGVhcmx5LCBpZGVhbGx5IHdpdGggYWRhcHRlcgorCSAqIHNldHVwLCB1bmxlc3MgdGhlIGhhcmR3YXJlIGRlZmF1bHRzIGNvb3BlcmF0ZSB0byBhdm9pZCBjb25mdXNpb24KKwkgKiBiZXR3ZWVuIG5vcm1hbCAoYWN0aXZlIGxvdykgYW5kIGludmVydGVkIGNoaXBzZWxlY3RzLgorCSAqLworCisJLyogZGVzZWxlY3QgY2hpcCAobG93IG9yIGhpZ2gpICovCisJc3Bpbl9sb2NrKCZiaXRiYW5nLT5sb2NrKTsKKwlpZiAoIWJpdGJhbmctPmJ1c3kpIHsKKwkJYml0YmFuZy0+Y2hpcHNlbGVjdChzcGksIEJJVEJBTkdfQ1NfSU5BQ1RJVkUpOworCQluZGVsYXkoY3MtPm5zZWNzKTsKKwl9CisJc3Bpbl91bmxvY2soJmJpdGJhbmctPmxvY2spOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcGlfYml0YmFuZ19zZXR1cCk7CisKKy8qKgorICogc3BpX2JpdGJhbmdfY2xlYW51cCAtIGRlZmF1bHQgY2xlYW51cCBmb3IgcGVyLXdvcmQgSS9PIGxvb3BzCisgKi8KK3ZvaWQgc3BpX2JpdGJhbmdfY2xlYW51cChjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWtmcmVlKHNwaS0+Y29udHJvbGxlcl9zdGF0ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcGlfYml0YmFuZ19jbGVhbnVwKTsKKworc3RhdGljIGludCBzcGlfYml0YmFuZ19idWZzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCit7CisJc3RydWN0IHNwaV9iaXRiYW5nX2NzCSpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKwl1bnNpZ25lZAkJbnNlY3MgPSBjcy0+bnNlY3M7CisKKwlyZXR1cm4gY3MtPnR4cnhfYnVmcyhzcGksIGNzLT50eHJ4X3dvcmQsIG5zZWNzLCB0KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNFQ09ORCBQQVJUIC4uLiBzaW1wbGUgdHJhbnNmZXIgcXVldWUgcnVubmVyLgorICoKKyAqIFRoaXMgY29zdHMgYSB0YXNrIGNvbnRleHQgcGVyIGNvbnRyb2xsZXIsIHJ1bm5pbmcgdGhlIHF1ZXVlIGJ5CisgKiBwZXJmb3JtaW5nIGVhY2ggdHJhbnNmZXIgaW4gc2VxdWVuY2UuICBTbWFydGVyIGhhcmR3YXJlIGNhbiBxdWV1ZQorICogc2V2ZXJhbCBETUEgdHJhbnNmZXJzIGF0IG9uY2UsIGFuZCBwcm9jZXNzIHNldmVyYWwgY29udHJvbGxlciBxdWV1ZXMKKyAqIGluIHBhcmFsbGVsOyB0aGlzIGRyaXZlciBkb2Vzbid0IG1hdGNoIHN1Y2ggaGFyZHdhcmUgdmVyeSB3ZWxsLgorICoKKyAqIERyaXZlcnMgY2FuIHByb3ZpZGUgd29yZC1hdC1hLXRpbWUgaS9vIHByaW1pdGl2ZXMsIG9yIHByb3ZpZGUKKyAqIHRyYW5zZmVyLWF0LWEtdGltZSBvbmVzIHRvIGxldmVyYWdlIGRtYSBvciBmaWZvIGhhcmR3YXJlLgorICovCitzdGF0aWMgdm9pZCBiaXRiYW5nX3dvcmsodm9pZCAqX2JpdGJhbmcpCit7CisJc3RydWN0IHNwaV9iaXRiYW5nCSpiaXRiYW5nID0gX2JpdGJhbmc7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYml0YmFuZy0+bG9jaywgZmxhZ3MpOworCWJpdGJhbmctPmJ1c3kgPSAxOworCXdoaWxlICghbGlzdF9lbXB0eSgmYml0YmFuZy0+cXVldWUpKSB7CisJCXN0cnVjdCBzcGlfbWVzc2FnZQkqbTsKKwkJc3RydWN0IHNwaV9kZXZpY2UJKnNwaTsKKwkJdW5zaWduZWQJCW5zZWNzOworCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSp0ID0gTlVMTDsKKwkJdW5zaWduZWQJCXRtcDsKKwkJdW5zaWduZWQJCWNzX2NoYW5nZTsKKwkJaW50CQkJc3RhdHVzOworCisJCW0gPSBjb250YWluZXJfb2YoYml0YmFuZy0+cXVldWUubmV4dCwgc3RydWN0IHNwaV9tZXNzYWdlLAorCQkJCXF1ZXVlKTsKKwkJbGlzdF9kZWxfaW5pdCgmbS0+cXVldWUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRiYW5nLT5sb2NrLCBmbGFncyk7CisKKwkJLyogRklYTUUgdGhpcyBpcyBtYWRlLXVwIC4uLiB0aGUgY29ycmVjdCB2YWx1ZSBpcyBrbm93biB0bworCQkgKiB3b3JkLWF0LWEtdGltZSBiaXRiYW5nIGNvZGUsIGFuZCBwcmVzdW1hYmx5IGNoaXBzZWxlY3QoKQorCQkgKiBzaG91bGQgZW5mb3JjZSB0aGVzZSByZXF1aXJlbWVudHMgdG9vPworCQkgKi8KKwkJbnNlY3MgPSAxMDA7CisKKwkJc3BpID0gbS0+c3BpOworCQl0bXAgPSAwOworCQljc19jaGFuZ2UgPSAxOworCQlzdGF0dXMgPSAwOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkgKHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKwkJCWlmIChiaXRiYW5nLT5zaHV0ZG93bikgeworCQkJCXN0YXR1cyA9IC1FU0hVVERPV047CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIHNldCB1cCBkZWZhdWx0IGNsb2NrIHBvbGFyaXR5LCBhbmQgYWN0aXZhdGUgY2hpcDsKKwkJCSAqIHRoaXMgaW1wbGljaXRseSB1cGRhdGVzIGNsb2NrIGFuZCBzcGkgbW9kZXMgYXMKKwkJCSAqIHByZXZpb3VzbHkgcmVjb3JkZWQgZm9yIHRoaXMgZGV2aWNlIHZpYSBzZXR1cCgpLgorCQkJICogKGFuZCBhbHNvIGRlc2VsZWN0cyBhbnkgb3RoZXIgY2hpcCB0aGF0IG1pZ2h0IGJlCisJCQkgKiBzZWxlY3RlZCAuLi4pCisJCQkgKi8KKwkJCWlmIChjc19jaGFuZ2UpIHsKKwkJCQliaXRiYW5nLT5jaGlwc2VsZWN0KHNwaSwgQklUQkFOR19DU19BQ1RJVkUpOworCQkJCW5kZWxheShuc2Vjcyk7CisJCQl9CisJCQljc19jaGFuZ2UgPSB0LT5jc19jaGFuZ2U7CisJCQlpZiAoIXQtPnR4X2J1ZiAmJiAhdC0+cnhfYnVmICYmIHQtPmxlbikgeworCQkJCXN0YXR1cyA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIHRyYW5zZmVyIGRhdGEuICB0aGUgbG93ZXIgbGV2ZWwgY29kZSBoYW5kbGVzIGFueQorCQkJICogbmV3IGRtYSBtYXBwaW5ncyBpdCBuZWVkcy4gb3VyIGNhbGxlciBhbHdheXMgZ2F2ZQorCQkJICogdXMgZG1hLXNhZmUgYnVmZmVycy4KKwkJCSAqLworCQkJaWYgKHQtPmxlbikgeworCQkJCS8qIFJFVklTSVQgZG1hIEFQSSBzdGlsbCBuZWVkcyBhIGRlc2lnbmF0ZWQKKwkJCQkgKiBETUFfQUREUl9JTlZBTElEOyB+MCBtaWdodCBiZSBiZXR0ZXIuCisJCQkJICovCisJCQkJaWYgKCFtLT5pc19kbWFfbWFwcGVkKQorCQkJCQl0LT5yeF9kbWEgPSB0LT50eF9kbWEgPSAwOworCQkJCXN0YXR1cyA9IGJpdGJhbmctPnR4cnhfYnVmcyhzcGksIHQpOworCQkJfQorCQkJaWYgKHN0YXR1cyAhPSB0LT5sZW4pIHsKKwkJCQlpZiAoc3RhdHVzID4gMCkKKwkJCQkJc3RhdHVzID0gLUVNU0dTSVpFOworCQkJCWJyZWFrOworCQkJfQorCQkJbS0+YWN0dWFsX2xlbmd0aCArPSBzdGF0dXM7CisJCQlzdGF0dXMgPSAwOworCisJCQkvKiBwcm90b2NvbCB0d2Vha3MgYmVmb3JlIG5leHQgdHJhbnNmZXIgKi8KKwkJCWlmICh0LT5kZWxheV91c2VjcykKKwkJCQl1ZGVsYXkodC0+ZGVsYXlfdXNlY3MpOworCisJCQlpZiAoIWNzX2NoYW5nZSkKKwkJCQljb250aW51ZTsKKwkJCWlmICh0LT50cmFuc2Zlcl9saXN0Lm5leHQgPT0gJm0tPnRyYW5zZmVycykKKwkJCQlicmVhazsKKworCQkJLyogc29tZXRpbWVzIGEgc2hvcnQgbWlkLW1lc3NhZ2UgZGVzZWxlY3Qgb2YgdGhlIGNoaXAKKwkJCSAqIG1heSBiZSBuZWVkZWQgdG8gdGVybWluYXRlIGEgbW9kZSBvciBjb21tYW5kCisJCQkgKi8KKwkJCW5kZWxheShuc2Vjcyk7CisJCQliaXRiYW5nLT5jaGlwc2VsZWN0KHNwaSwgQklUQkFOR19DU19JTkFDVElWRSk7CisJCQluZGVsYXkobnNlY3MpOworCQl9CisKKwkJbS0+c3RhdHVzID0gc3RhdHVzOworCQltLT5jb21wbGV0ZShtLT5jb250ZXh0KTsKKworCQkvKiBub3JtYWxseSBkZWFjdGl2YXRlIGNoaXBzZWxlY3QgLi4uIHVubGVzcyBubyBlcnJvciBhbmQKKwkJICogY3NfY2hhbmdlIGhhcyBoaW50ZWQgdGhhdCB0aGUgbmV4dCBtZXNzYWdlIHdpbGwgcHJvYmFibHkKKwkJICogYmUgZm9yIHRoaXMgY2hpcCB0b28uCisJCSAqLworCQlpZiAoIShzdGF0dXMgPT0gMCAmJiBjc19jaGFuZ2UpKSB7CisJCQluZGVsYXkobnNlY3MpOworCQkJYml0YmFuZy0+Y2hpcHNlbGVjdChzcGksIEJJVEJBTkdfQ1NfSU5BQ1RJVkUpOworCQkJbmRlbGF5KG5zZWNzKTsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZiaXRiYW5nLT5sb2NrLCBmbGFncyk7CisJfQorCWJpdGJhbmctPmJ1c3kgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdGJhbmctPmxvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBzcGlfYml0YmFuZ190cmFuc2ZlciAtIGRlZmF1bHQgc3VibWl0IHRvIHRyYW5zZmVyIHF1ZXVlCisgKi8KK2ludCBzcGlfYml0YmFuZ190cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0pCit7CisJc3RydWN0IHNwaV9iaXRiYW5nCSpiaXRiYW5nOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisJbS0+YWN0dWFsX2xlbmd0aCA9IDA7CisJbS0+c3RhdHVzID0gLUVJTlBST0dSRVNTOworCisJYml0YmFuZyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCWlmIChiaXRiYW5nLT5zaHV0ZG93bikKKwkJcmV0dXJuIC1FU0hVVERPV047CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYml0YmFuZy0+bG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJm0tPnF1ZXVlLCAmYml0YmFuZy0+cXVldWUpOworCXF1ZXVlX3dvcmsoYml0YmFuZy0+d29ya3F1ZXVlLCAmYml0YmFuZy0+d29yayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0YmFuZy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcGlfYml0YmFuZ190cmFuc2Zlcik7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogc3BpX2JpdGJhbmdfc3RhcnQgLSBzdGFydCB1cCBhIHBvbGxlZC9iaXRiYW5naW5nIFNQSSBtYXN0ZXIgZHJpdmVyCisgKiBAYml0YmFuZzogZHJpdmVyIGhhbmRsZQorICoKKyAqIENhbGxlciBzaG91bGQgaGF2ZSB6ZXJvLWluaXRpYWxpemVkIGFsbCBwYXJ0cyBvZiB0aGUgc3RydWN0dXJlLCBhbmQgdGhlbgorICogcHJvdmlkZWQgY2FsbGJhY2tzIGZvciBjaGlwIHNlbGVjdGlvbiBhbmQgSS9PIGxvb3BzLiAgSWYgdGhlIG1hc3RlciBoYXMKKyAqIGEgdHJhbnNmZXIgbWV0aG9kLCBpdHMgZmluYWwgc3RlcCBzaG91bGQgY2FsbCBzcGlfYml0YmFuZ190cmFuc2Zlcjsgb3IsCisgKiB0aGF0J3MgdGhlIGRlZmF1bHQgaWYgdGhlIHRyYW5zZmVyIHJvdXRpbmUgaXMgbm90IGluaXRpYWxpemVkLiAgSXQgc2hvdWxkCisgKiBhbHNvIHNldCB1cCB0aGUgYnVzIG51bWJlciBhbmQgbnVtYmVyIG9mIGNoaXBzZWxlY3RzLgorICoKKyAqIEZvciBpL28gbG9vcHMsIHByb3ZpZGUgY2FsbGJhY2tzIGVpdGhlciBwZXItd29yZCAoZm9yIGJpdGJhbmdpbmcsIG9yIGZvcgorICogaGFyZHdhcmUgdGhhdCBiYXNpY2FsbHkgZXhwb3NlcyBhIHNoaWZ0IHJlZ2lzdGVyKSBvciBwZXItc3BpX3RyYW5zZmVyCisgKiAod2hpY2ggdGFrZXMgYmV0dGVyIGFkdmFudGFnZSBvZiBoYXJkd2FyZSBsaWtlIGZpZm9zIG9yIERNQSBlbmdpbmVzKS4KKyAqCisgKiBEcml2ZXJzIHVzaW5nIHBlci13b3JkIEkvTyBsb29wcyBzaG91bGQgdXNlIChvciBjYWxsKSBzcGlfYml0YmFuZ19zZXR1cCBhbmQKKyAqIHNwaV9iaXRiYW5nX2NsZWFudXAgdG8gaGFuZGxlIHRob3NlIHNwaSBtYXN0ZXIgbWV0aG9kcy4gIFRob3NlIG1ldGhvZHMgYXJlCisgKiB0aGUgZGVmYXVsdHMgaWYgdGhlIGJpdGJhbmctPnR4cnhfYnVmcyByb3V0aW5lIGlzbid0IGluaXRpYWxpemVkLgorICoKKyAqIFRoaXMgcm91dGluZSByZWdpc3RlcnMgdGhlIHNwaV9tYXN0ZXIsIHdoaWNoIHdpbGwgcHJvY2VzcyByZXF1ZXN0cyBpbiBhCisgKiBkZWRpY2F0ZWQgdGFzaywga2VlcGluZyBJUlFzIHVuYmxvY2tlZCBtb3N0IG9mIHRoZSB0aW1lLiAgVG8gc3RvcAorICogcHJvY2Vzc2luZyB0aG9zZSByZXF1ZXN0cywgY2FsbCBzcGlfYml0YmFuZ19zdG9wKCkuCisgKi8KK2ludCBzcGlfYml0YmFuZ19zdGFydChzdHJ1Y3Qgc3BpX2JpdGJhbmcgKmJpdGJhbmcpCit7CisJaW50CXN0YXR1czsKKworCWlmICghYml0YmFuZy0+bWFzdGVyIHx8ICFiaXRiYW5nLT5jaGlwc2VsZWN0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCUlOSVRfV09SSygmYml0YmFuZy0+d29yaywgYml0YmFuZ193b3JrLCBiaXRiYW5nKTsKKwlzcGluX2xvY2tfaW5pdCgmYml0YmFuZy0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmJpdGJhbmctPnF1ZXVlKTsKKworCWlmICghYml0YmFuZy0+bWFzdGVyLT50cmFuc2ZlcikKKwkJYml0YmFuZy0+bWFzdGVyLT50cmFuc2ZlciA9IHNwaV9iaXRiYW5nX3RyYW5zZmVyOworCWlmICghYml0YmFuZy0+dHhyeF9idWZzKSB7CisJCWJpdGJhbmctPnVzZV9kbWEgPSAwOworCQliaXRiYW5nLT50eHJ4X2J1ZnMgPSBzcGlfYml0YmFuZ19idWZzOworCQlpZiAoIWJpdGJhbmctPm1hc3Rlci0+c2V0dXApIHsKKwkJCWJpdGJhbmctPm1hc3Rlci0+c2V0dXAgPSBzcGlfYml0YmFuZ19zZXR1cDsKKwkJCWJpdGJhbmctPm1hc3Rlci0+Y2xlYW51cCA9IHNwaV9iaXRiYW5nX2NsZWFudXA7CisJCX0KKwl9IGVsc2UgaWYgKCFiaXRiYW5nLT5tYXN0ZXItPnNldHVwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHRoaXMgdGFzayBpcyB0aGUgb25seSB0aGluZyB0byB0b3VjaCB0aGUgU1BJIGJpdHMgKi8KKwliaXRiYW5nLT5idXN5ID0gMDsKKwliaXRiYW5nLT53b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgKKwkJCWJpdGJhbmctPm1hc3Rlci0+Y2Rldi5kZXYtPmJ1c19pZCk7CisJaWYgKGJpdGJhbmctPndvcmtxdWV1ZSA9PSBOVUxMKSB7CisJCXN0YXR1cyA9IC1FQlVTWTsKKwkJZ290byBlcnIxOworCX0KKworCS8qIGRyaXZlciBtYXkgZ2V0IGJ1c3kgYmVmb3JlIHJlZ2lzdGVyKCkgcmV0dXJucywgZXNwZWNpYWxseQorCSAqIGlmIHNvbWVvbmUgcmVnaXN0ZXJlZCBib2FyZGluZm8gZm9yIGRldmljZXMKKwkgKi8KKwlzdGF0dXMgPSBzcGlfcmVnaXN0ZXJfbWFzdGVyKGJpdGJhbmctPm1hc3Rlcik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyMjsKKworCXJldHVybiBzdGF0dXM7CisKK2VycjI6CisJZGVzdHJveV93b3JrcXVldWUoYml0YmFuZy0+d29ya3F1ZXVlKTsKK2VycjE6CisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwaV9iaXRiYW5nX3N0YXJ0KTsKKworLyoqCisgKiBzcGlfYml0YmFuZ19zdG9wIC0gc3RvcHMgdGhlIHRhc2sgcHJvdmlkaW5nIHNwaSBjb21tdW5pY2F0aW9uCisgKi8KK2ludCBzcGlfYml0YmFuZ19zdG9wKHN0cnVjdCBzcGlfYml0YmFuZyAqYml0YmFuZykKK3sKKwl1bnNpZ25lZAlsaW1pdCA9IDUwMDsKKworCXNwaW5fbG9ja19pcnEoJmJpdGJhbmctPmxvY2spOworCWJpdGJhbmctPnNodXRkb3duID0gMDsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmJpdGJhbmctPnF1ZXVlKSAmJiBsaW1pdC0tKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmYml0YmFuZy0+bG9jayk7CisKKwkJZGV2X2RiZyhiaXRiYW5nLT5tYXN0ZXItPmNkZXYuZGV2LCAid2FpdCBmb3IgcXVldWVcbiIpOworCQltc2xlZXAoMTApOworCisJCXNwaW5fbG9ja19pcnEoJmJpdGJhbmctPmxvY2spOworCX0KKwlzcGluX3VubG9ja19pcnEoJmJpdGJhbmctPmxvY2spOworCWlmICghbGlzdF9lbXB0eSgmYml0YmFuZy0+cXVldWUpKSB7CisJCWRldl9lcnIoYml0YmFuZy0+bWFzdGVyLT5jZGV2LmRldiwgInF1ZXVlIGRpZG4ndCBlbXB0eVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJZGVzdHJveV93b3JrcXVldWUoYml0YmFuZy0+d29ya3F1ZXVlKTsKKworCXNwaV91bnJlZ2lzdGVyX21hc3RlcihiaXRiYW5nLT5tYXN0ZXIpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcGlfYml0YmFuZ19zdG9wKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfYnV0dGVyZmx5LmMgYi9kcml2ZXJzL3NwaS9zcGlfYnV0dGVyZmx5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlhM2M1OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9idXR0ZXJmbHkuYwpAQCAtMCwwICsxLDQyMyBAQAorLyoKKyAqIHNwaV9idXR0ZXJmbHkuYyAtIHBhcnBvcnQtdG8tYnV0dGVyZmx5IGFkYXB0ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvZmxhc2guaD4KKworI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisKKworLyoKKyAqIFRoaXMgdXNlcyBTUEkgdG8gdGFsayB3aXRoIGFuICJBVlIgQnV0dGVyZmx5Iiwgd2hpY2ggaXMgYSAkVVMyMCBjYXJkCisgKiB3aXRoIGEgYmF0dGVyeSBwb3dlcmVkIEFWUiBtaWNyb2NvbnRyb2xsZXIgYW5kIGxvdHMgb2YgZ29vZGllcy4gIFlvdQorICogY2FuIHVzZSBHQ0MgdG8gZGV2ZWxvcCBmaXJtd2FyZSBmb3IgdGhpcy4KKyAqCisgKiBTZWUgRG9jdW1lbnRhdGlvbi9zcGkvYnV0dGVyZmx5IGZvciBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gYnVpbGQKKyAqIGFuZCB1c2UgdGhpcyBjdXN0b20gcGFyYWxsZWwgcG9ydCBjYWJsZS4KKyAqLworCisjdW5kZWYJSEFWRV9VU0kJLyogbnlldCAqLworCisKKy8qIERBVEEgb3V0cHV0IGJpdHMgKHBpbnMgMi4uOSA9PSBEMC4uRDcpICovCisjZGVmaW5lCWJ1dHRlcmZseV9ucmVzZXQgKDEgPDwgMSkJCS8qIHBpbiAzICovCisKKyNkZWZpbmUJc3BpX3Nja19iaXQJKDEgPDwgMCkJCS8qIHBpbiAyICovCisjZGVmaW5lCXNwaV9tb3NpX2JpdAkoMSA8PCA3KQkJLyogcGluIDkgKi8KKworI2RlZmluZQl1c2lfc2NrX2JpdAkoMSA8PCAzKQkJLyogcGluIDUgKi8KKyNkZWZpbmUJdXNpX21vc2lfYml0CSgxIDw8IDQpCQkvKiBwaW4gNiAqLworCisjZGVmaW5lCXZjY19iaXRzCSgoMSA8PCA2KSB8ICgxIDw8IDUpKQkvKiBwaW5zIDcsIDggKi8KKworLyogU1RBVFVTIGlucHV0IGJpdHMgKi8KKyNkZWZpbmUJc3BpX21pc29fYml0CVBBUlBPUlRfU1RBVFVTX0JVU1kJLyogcGluIDExICovCisKKyNkZWZpbmUJdXNpX21pc29fYml0CVBBUlBPUlRfU1RBVFVTX1BBUEVST1VUCS8qIHBpbiAxMiAqLworCisvKiBDT05UUk9MIG91dHB1dCBiaXRzICovCisjZGVmaW5lCXNwaV9jc19iaXQJUEFSUE9SVF9DT05UUk9MX1NFTEVDVAkvKiBwaW4gMTcgKi8KKy8qIFVTSSB1c2VzIG5vIGNoaXBzZWxlY3QgKi8KKworCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJ1dHRlcmZseSAqc3BpZGV2X3RvX3BwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJcmV0dXJuIHNwaS0+Y29udHJvbGxlcl9kYXRhOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc191c2lkZXYoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKyNpZmRlZglIQVZFX1VTSQorCXJldHVybiBzcGktPmNoaXBfc2VsZWN0ICE9IDE7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKKworc3RydWN0IGJ1dHRlcmZseSB7CisJLyogUkVWSVNJVCAuLi4gZm9yIG5vdywgdGhpcyBtdXN0IGJlIGZpcnN0ICovCisJc3RydWN0IHNwaV9iaXRiYW5nCWJpdGJhbmc7CisKKwlzdHJ1Y3QgcGFycG9ydAkJKnBvcnQ7CisJc3RydWN0IHBhcmRldmljZQkqcGQ7CisKKwl1OAkJCWxhc3RieXRlOworCisJc3RydWN0IHNwaV9kZXZpY2UJKmRhdGFmbGFzaDsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqYnV0dGVyZmx5OworCXN0cnVjdCBzcGlfYm9hcmRfaW5mbwlpbmZvWzJdOworCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogdGhlc2Ugcm91dGluZXMgbWF5IGJlIHNsb3dlciB0aGFuIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZXkncmUgaGlkaW5nCisgKiB0aGUgZmFjdCB0aGF0IHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IFNQSSBidXNzZXMgb24gdGhpcyBjYWJsZTogb25lCisgKiB0byB0aGUgRGF0YUZsYXNoIGNoaXAgKG9yIEFWUiBTUEkgY29udHJvbGxlciksIHRoZSBvdGhlciB0byB0aGUKKyAqIEFWUiBVU0kgY29udHJvbGxlci4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQKK3NldHNjayhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgaXNfb24pCit7CisJc3RydWN0IGJ1dHRlcmZseQkqcHAgPSBzcGlkZXZfdG9fcHAoc3BpKTsKKwl1OAkJCWJpdCwgYnl0ZSA9IHBwLT5sYXN0Ynl0ZTsKKworCWlmIChpc191c2lkZXYoc3BpKSkKKwkJYml0ID0gdXNpX3Nja19iaXQ7CisJZWxzZQorCQliaXQgPSBzcGlfc2NrX2JpdDsKKworCWlmIChpc19vbikKKwkJYnl0ZSB8PSBiaXQ7CisJZWxzZQorCQlieXRlICY9IH5iaXQ7CisJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCBieXRlKTsKKwlwcC0+bGFzdGJ5dGUgPSBieXRlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NldG1vc2koc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGlzX29uKQoreworCXN0cnVjdCBidXR0ZXJmbHkJKnBwID0gc3BpZGV2X3RvX3BwKHNwaSk7CisJdTgJCQliaXQsIGJ5dGUgPSBwcC0+bGFzdGJ5dGU7CisKKwlpZiAoaXNfdXNpZGV2KHNwaSkpCisJCWJpdCA9IHVzaV9tb3NpX2JpdDsKKwllbHNlCisJCWJpdCA9IHNwaV9tb3NpX2JpdDsKKworCWlmIChpc19vbikKKwkJYnl0ZSB8PSBiaXQ7CisJZWxzZQorCQlieXRlICY9IH5iaXQ7CisJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCBieXRlKTsKKwlwcC0+bGFzdGJ5dGUgPSBieXRlOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRtaXNvKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGJ1dHRlcmZseQkqcHAgPSBzcGlkZXZfdG9fcHAoc3BpKTsKKwlpbnQJCQl2YWx1ZTsKKwl1OAkJCWJpdDsKKworCWlmIChpc191c2lkZXYoc3BpKSkKKwkJYml0ID0gdXNpX21pc29fYml0OworCWVsc2UKKwkJYml0ID0gc3BpX21pc29fYml0OworCisJLyogb25seSBTVEFUVVNfQlVTWSBpcyBOT1QgbmVnYXRlZCAqLworCXZhbHVlID0gIShwYXJwb3J0X3JlYWRfc3RhdHVzKHBwLT5wb3J0KSAmIGJpdCk7CisJcmV0dXJuIChiaXQgPT0gUEFSUE9SVF9TVEFUVVNfQlVTWSkgPyB2YWx1ZSA6ICF2YWx1ZTsKK30KKworc3RhdGljIHZvaWQgYnV0dGVyZmx5X2NoaXBzZWxlY3Qoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IHZhbHVlKQoreworCXN0cnVjdCBidXR0ZXJmbHkJKnBwID0gc3BpZGV2X3RvX3BwKHNwaSk7CisKKwkvKiBzZXQgZGVmYXVsdCBjbG9jayBwb2xhcml0eSAqLworCWlmICh2YWx1ZSkKKwkJc2V0c2NrKHNwaSwgc3BpLT5tb2RlICYgU1BJX0NQT0wpOworCisJLyogbm8gY2hpcHNlbGVjdCBvbiB0aGlzIFVTSSBsaW5rIGNvbmZpZyAqLworCWlmIChpc191c2lkZXYoc3BpKSkKKwkJcmV0dXJuOworCisJLyogaGVyZSwgdmFsdWUgPT0gImFjdGl2YXRlIG9yIG5vdCIgKi8KKworCS8qIG1vc3QgUEFSUE9SVF9DT05UUk9MXyogYml0cyBhcmUgbmVnYXRlZCAqLworCWlmIChzcGlfY3NfYml0ID09IFBBUlBPUlRfQ09OVFJPTF9JTklUKQorCQl2YWx1ZSA9ICF2YWx1ZTsKKworCS8qIGhlcmUsIHZhbHVlID09ICJiaXQgdmFsdWUgdG8gd3JpdGUgaW4gY29udHJvbCByZWdpc3RlciIgICovCisKKwlwYXJwb3J0X2Zyb2JfY29udHJvbChwcC0+cG9ydCwgc3BpX2NzX2JpdCwgdmFsdWUgPyBzcGlfY3NfYml0IDogMCk7Cit9CisKKworLyogd2Ugb25seSBuZWVkZWQgdG8gaW1wbGVtZW50IG9uZSBtb2RlIGhlcmUsIGFuZCBjaG9vc2UgU1BJX01PREVfMCAqLworCisjZGVmaW5lCXNwaWRlbGF5KFgpCWRve313aGlsZSgwKQorLy8jZGVmaW5lCXNwaWRlbGF5CW5kZWxheQorCisjZGVmaW5lCUVYUEFORF9CSVRCQU5HX1RYUlgKKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KKworc3RhdGljIHUzMgorYnV0dGVyZmx5X3R4cnhfd29yZF9tb2RlMChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQl1bnNpZ25lZCBuc2VjcywKKwkJdTMyIHdvcmQsIHU4IGJpdHMpCit7CisJcmV0dXJuIGJpdGJhbmdfdHhyeF9iZV9jcGhhMChzcGksIG5zZWNzLCAwLCB3b3JkLCBiaXRzKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogb3ZlcnJpZGUgZGVmYXVsdCBwYXJ0aXRpb25pbmcgd2l0aCBjbWRsaW5lcGFydCAqLworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBhcnRpdGlvbnNbXSA9IHsgeworCS8qIEpGRlMyIHdhbnRzIHBhcnRpdGlvbnMgb2YgNCpOIGJsb2NrcyBmb3IgdGhpcyBkZXZpY2UgLi4uICovCisKKwkvKiBzZWN0b3IgMCA9IDggcGFnZXMgKiAyNjQgYnl0ZXMvcGFnZSAoMSBibG9jaykKKwkgKiBzZWN0b3IgMSA9IDI0OCBwYWdlcyAqIDI2NCBieXRlcy9wYWdlCisJICovCisJLm5hbWUJCT0gImJvb2trZWVwaW5nIiwJLy8gNjYgS0IKKwkub2Zmc2V0CQk9IDAsCisJLnNpemUJCT0gKDggKyAyNDgpICogMjY0LAorLy8JLm1hc2tfZmxhZ3MJPSBNVERfV1JJVEVBQkxFLAorfSwgeworCS8qIHNlY3RvciAyID0gMjU2IHBhZ2VzICogMjY0IGJ5dGVzL3BhZ2UKKwkgKiBzZWN0b3JzIDMtNSA9IDUxMiBwYWdlcyAqIDI2NCBieXRlcy9wYWdlCisJICovCisJLm5hbWUJCT0gImZpbGVzeXN0ZW0iLAkJLy8gNDYyIEtCCisJLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCisJLnNpemUJCT0gTVREUEFSVF9TSVpfRlVMTCwKK30gfTsKKworc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGZsYXNoID0geworCS5uYW1lCQk9ICJidXR0ZXJmbGFzaCIsCisJLnBhcnRzCQk9IHBhcnRpdGlvbnMsCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShwYXJ0aXRpb25zKSwKK307CisKKworLyogUkVWSVNJVCByZW1vdmUgdGhpcyB1Z2x5IGdsb2JhbCBhbmQgaXRzICJvbmx5IG9uZSIgbGltaXRhdGlvbiAqLworc3RhdGljIHN0cnVjdCBidXR0ZXJmbHkgKmJ1dHRlcmZseTsKKworc3RhdGljIHZvaWQgYnV0dGVyZmx5X2F0dGFjaChzdHJ1Y3QgcGFycG9ydCAqcCkKK3sKKwlzdHJ1Y3QgcGFyZGV2aWNlCSpwZDsKKwlpbnQJCQlzdGF0dXM7CisJc3RydWN0IGJ1dHRlcmZseQkqcHA7CisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2OworCisJaWYgKGJ1dHRlcmZseSkKKwkJcmV0dXJuOworCisJLyogUkVWSVNJVDogIHRoaXMganVzdCBfYXNzdW1lc18gYSBidXR0ZXJmbHkgaXMgdGhlcmUgLi4uIG5vIHByb2JlLAorCSAqIGFuZCBubyB3YXkgdG8gYmUgc2VsZWN0aXZlIGFib3V0IHdoYXQgaXQgYmluZHMgdG8uCisJICovCisKKwkvKiBGSVhNRSB3aGVyZSBzaG91bGQgbWFzdGVyLT5jZGV2LmRldiBjb21lIGZyb20/CisJICogZS5nLiAvc3lzL2J1cy9wbnAwLzAwOjBiLCBzb21lIFBDSSB0aGluZywgZXRjCisJICogc2V0dGluZyB1cCBhIHBsYXRmb3JtIGRldmljZSBsaWtlIHRoaXMgaXMgYW4gdWdseSBrbHVnZS4uLgorCSAqLworCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJidXR0ZXJmbHkiLCAtMSwgTlVMTCwgMCk7CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZiAqcHApOworCWlmICghbWFzdGVyKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisJcHAgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwkvKgorCSAqIFNQSSBhbmQgYml0YmFuZyBob29rdXAKKwkgKgorCSAqIHVzZSBkZWZhdWx0IHNldHVwKCksIGNsZWFudXAoKSwgYW5kIHRyYW5zZmVyKCkgbWV0aG9kczsgYW5kCisJICogb25seSBib3RoZXIgaW1wbGVtZW50aW5nIG1vZGUgMC4gIFN0YXJ0IGl0IGxhdGVyLgorCSAqLworCW1hc3Rlci0+YnVzX251bSA9IDQyOworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSAyOworCisJcHAtPmJpdGJhbmcubWFzdGVyID0gc3BpX21hc3Rlcl9nZXQobWFzdGVyKTsKKwlwcC0+Yml0YmFuZy5jaGlwc2VsZWN0ID0gYnV0dGVyZmx5X2NoaXBzZWxlY3Q7CisJcHAtPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzBdID0gYnV0dGVyZmx5X3R4cnhfd29yZF9tb2RlMDsKKworCS8qCisJICogcGFycG9ydCBob29rdXAKKwkgKi8KKwlwcC0+cG9ydCA9IHA7CisJcGQgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwLCAic3BpX2J1dHRlcmZseSIsCisJCQlOVUxMLCBOVUxMLCBOVUxMLAorCQkJMCAvKiBGTEFHUyAqLywgcHApOworCWlmICghcGQpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBjbGVhbjA7CisJfQorCXBwLT5wZCA9IHBkOworCisJc3RhdHVzID0gcGFycG9ydF9jbGFpbShwZCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gY2xlYW4xOworCisJLyoKKwkgKiBCdXR0ZXJmbHkgcmVzZXQsIHBvd2VydXAsIHJ1biBmaXJtd2FyZQorCSAqLworCXByX2RlYnVnKCIlczogcG93ZXJ1cC9yZXNldCBCdXR0ZXJmbHlcbiIsIHAtPm5hbWUpOworCisJLyogbkNTIGZvciBkYXRhZmxhc2ggKHRoaXMgYml0IGlzIGludmVydGVkIG9uIG91dHB1dCkgKi8KKwlwYXJwb3J0X2Zyb2JfY29udHJvbChwcC0+cG9ydCwgc3BpX2NzX2JpdCwgMCk7CisKKwkvKiBzdGFiaWxpemUgcG93ZXIgd2l0aCBjaGlwIGluIHJlc2V0IChuUkVTRVQpLCBhbmQKKwkgKiBib3RoIHNwaV9zY2tfYml0IGFuZCB1c2lfc2NrX2JpdCBjbGVhciAoQ1BPTD0wKQorCSAqLworCXBwLT5sYXN0Ynl0ZSB8PSB2Y2NfYml0czsKKwlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIHBwLT5sYXN0Ynl0ZSk7CisJbXNsZWVwKDUpOworCisJLyogdGFrZSBpdCBvdXQgb2YgcmVzZXQ7IGFzc3VtZSBsb25nIHJlc2V0IGRlbGF5ICovCisJcHAtPmxhc3RieXRlIHw9IGJ1dHRlcmZseV9ucmVzZXQ7CisJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCBwcC0+bGFzdGJ5dGUpOworCW1zbGVlcCgxMDApOworCisKKwkvKgorCSAqIFN0YXJ0IFNQSSAuLi4gZm9yIG5vdywgaGlkZSB0aGF0IHdlJ3JlIHR3byBwaHlzaWNhbCBidXNzZXMuCisJICovCisJc3RhdHVzID0gc3BpX2JpdGJhbmdfc3RhcnQoJnBwLT5iaXRiYW5nKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBjbGVhbjI7CisKKwkvKiBCdXMgMSBsZXRzIHVzIHRhbGsgdG8gYXQ0NWRiMDQxYiAoZmlybXdhcmUgZGlzYWJsZXMgQVZSKQorCSAqIG9yIEFWUiAoZmlybXdhcmUgcmVzZXRzIGF0NDUsIGFjdHMgYXMgc3BpIHNsYXZlKQorCSAqLworCXBwLT5pbmZvWzBdLm1heF9zcGVlZF9oeiA9IDE1ICogMTAwMCAqIDEwMDA7CisJc3RyY3B5KHBwLT5pbmZvWzBdLm1vZGFsaWFzLCAibXRkX2RhdGFmbGFzaCIpOworCXBwLT5pbmZvWzBdLnBsYXRmb3JtX2RhdGEgPSAmZmxhc2g7CisJcHAtPmluZm9bMF0uY2hpcF9zZWxlY3QgPSAxOworCXBwLT5pbmZvWzBdLmNvbnRyb2xsZXJfZGF0YSA9IHBwOworCXBwLT5kYXRhZmxhc2ggPSBzcGlfbmV3X2RldmljZShwcC0+Yml0YmFuZy5tYXN0ZXIsICZwcC0+aW5mb1swXSk7CisJaWYgKHBwLT5kYXRhZmxhc2gpCisJCXByX2RlYnVnKCIlczogZGF0YWZsYXNoIGF0ICVzXG4iLCBwLT5uYW1lLAorCQkJCXBwLT5kYXRhZmxhc2gtPmRldi5idXNfaWQpOworCisjaWZkZWYJSEFWRV9VU0kKKwkvKiBldmVuIG1vcmUgY3VzdG9tIEFWUiBmaXJtd2FyZSAqLworCXBwLT5pbmZvWzFdLm1heF9zcGVlZF9oeiA9IDEwIC8qID8/ICovICogMTAwMCAqIDEwMDA7CisJc3RyY3B5KHBwLT5pbmZvWzFdLm1vZGFsaWFzLCAiYnV0dGVyZmx5Iik7CisJLy8gcHAtPmluZm9bMV0ucGxhdGZvcm1fZGF0YSA9IC4uLiBUQkQgLi4uIDsKKwlwcC0+aW5mb1sxXS5jaGlwX3NlbGVjdCA9IDIsCisJcHAtPmluZm9bMV0uY29udHJvbGxlcl9kYXRhID0gcHA7CisJcHAtPmJ1dHRlcmZseSA9IHNwaV9uZXdfZGV2aWNlKHBwLT5iaXRiYW5nLm1hc3RlciwgJnBwLT5pbmZvWzFdKTsKKwlpZiAocHAtPmJ1dHRlcmZseSkKKwkJcHJfZGVidWcoIiVzOiBidXR0ZXJmbHkgYXQgJXNcbiIsIHAtPm5hbWUsCisJCQkJcHAtPmJ1dHRlcmZseS0+ZGV2LmJ1c19pZCk7CisKKwkvKiBGSVhNRSBzZXR1cCBBQ0sgZm9yIHRoZSBJUlEgbGluZSAuLi4gICovCisjZW5kaWYKKworCS8vIGRldl9pbmZvKF93aGF0P18sIC4uLikKKwlwcl9pbmZvKCIlczogQVZSIEJ1dHRlcmZseVxuIiwgcC0+bmFtZSk7CisJYnV0dGVyZmx5ID0gcHA7CisJcmV0dXJuOworCitjbGVhbjI6CisJLyogdHVybiBvZmYgVkNDICovCisJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCAwKTsKKworCXBhcnBvcnRfcmVsZWFzZShwcC0+cGQpOworY2xlYW4xOgorCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocGQpOworY2xlYW4wOgorCSh2b2lkKSBzcGlfbWFzdGVyX3B1dChwcC0+Yml0YmFuZy5tYXN0ZXIpOworZG9uZToKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKKwlwcl9kZWJ1ZygiJXM6IGJ1dHRlcmZseSBwcm9iZSwgZmFpbCAlZFxuIiwgcC0+bmFtZSwgc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgYnV0dGVyZmx5X2RldGFjaChzdHJ1Y3QgcGFycG9ydCAqcCkKK3sKKwlzdHJ1Y3QgYnV0dGVyZmx5CSpwcDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2OworCWludAkJCXN0YXR1czsKKworCS8qIEZJWE1FIHRoaXMgZ2xvYmFsIGlzIHVnbHkgLi4uIGJ1dCwgaG93IHRvIHF1aWNrbHkgZ2V0IGZyb20KKwkgKiB0aGUgcGFycG9ydCB0byB0aGUgInN0cnVjdCBidXR0ZXJmbHkiIGFzc29jaWF0ZWQgd2l0aCBpdD8KKwkgKiAib2xkIHNjaG9vbCIgZHJpdmVyLWludGVybmFsIGRldmljZSBsaXN0cz8KKwkgKi8KKwlpZiAoIWJ1dHRlcmZseSB8fCBidXR0ZXJmbHktPnBvcnQgIT0gcCkKKwkJcmV0dXJuOworCXBwID0gYnV0dGVyZmx5OworCWJ1dHRlcmZseSA9IE5VTEw7CisKKyNpZmRlZglIQVZFX1VTSQorCXNwaV91bnJlZ2lzdGVyX2RldmljZShwcC0+YnV0dGVyZmx5KTsKKwlwcC0+YnV0dGVyZmx5ID0gTlVMTDsKKyNlbmRpZgorCXNwaV91bnJlZ2lzdGVyX2RldmljZShwcC0+ZGF0YWZsYXNoKTsKKwlwcC0+ZGF0YWZsYXNoID0gTlVMTDsKKworCXN0YXR1cyA9IHNwaV9iaXRiYW5nX3N0b3AoJnBwLT5iaXRiYW5nKTsKKworCS8qIHR1cm4gb2ZmIFZDQyAqLworCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgMCk7CisJbXNsZWVwKDEwKTsKKworCXBhcnBvcnRfcmVsZWFzZShwcC0+cGQpOworCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocHAtPnBkKTsKKworCXBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UocHAtPmJpdGJhbmcubWFzdGVyLT5jZGV2LmRldik7CisKKwkodm9pZCkgc3BpX21hc3Rlcl9wdXQocHAtPmJpdGJhbmcubWFzdGVyKTsKKworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBhcnBvcnRfZHJpdmVyIGJ1dHRlcmZseV9kcml2ZXIgPSB7CisJLm5hbWUgPQkJInNwaV9idXR0ZXJmbHkiLAorCS5hdHRhY2ggPQlidXR0ZXJmbHlfYXR0YWNoLAorCS5kZXRhY2ggPQlidXR0ZXJmbHlfZGV0YWNoLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBidXR0ZXJmbHlfaW5pdCh2b2lkKQoreworCXJldHVybiBwYXJwb3J0X3JlZ2lzdGVyX2RyaXZlcigmYnV0dGVyZmx5X2RyaXZlcik7Cit9CitkZXZpY2VfaW5pdGNhbGwoYnV0dGVyZmx5X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYnV0dGVyZmx5X2V4aXQodm9pZCkKK3sKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZHJpdmVyKCZidXR0ZXJmbHlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGJ1dHRlcmZseV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL3NwZWVkdGNoLmMgYi9kcml2ZXJzL3VzYi9hdG0vc3BlZWR0Y2guYwppbmRleCBiMjgzMzYxLi5jMWI0N2Q3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vc3BlZWR0Y2guYworKysgYi9kcml2ZXJzL3VzYi9hdG0vc3BlZWR0Y2guYwpAQCAtNTMyLDkgKzUzMiw5IEBACiAJaW50IHJldCA9IGludF91cmItPnN0YXR1czsKIAogCS8qIFRoZSBtYWdpYyBpbnRlcnJ1cHQgZm9yICJ1cCBzdGF0ZSIgKi8KLQljb25zdCBzdGF0aWMgdW5zaWduZWQgY2hhciB1cF9pbnRbNl0gICA9IHsgMHhhMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCB9OworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHVwX2ludFs2XSAgID0geyAweGExLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwIH07CiAJLyogVGhlIG1hZ2ljIGludGVycnVwdCBmb3IgImRvd24gc3RhdGUiICovCi0JY29uc3Qgc3RhdGljIHVuc2lnbmVkIGNoYXIgZG93bl9pbnRbNl0gPSB7IDB4YTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBkb3duX2ludFs2XSA9IHsgMHhhMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OwogCiAJYXRtX2RiZyh1c2JhdG0sICIlcyBlbnRlcmVkXG4iLCBfX2Z1bmNfXyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYyBiL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYwppbmRleCA5YmFhNjI5Li43YWYxODgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmMKKysrIGIvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5jCkBAIC0yMDcsNyArMjA3LDcgQEAKICoqICB1cmJzICAqKgogKioqKioqKioqKioqLwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB1cmIgKnVzYmF0bV9wb3BfdXJiKHN0cnVjdCB1c2JhdG1fY2hhbm5lbCAqY2hhbm5lbCkKK3N0YXRpYyBzdHJ1Y3QgdXJiICp1c2JhdG1fcG9wX3VyYihzdHJ1Y3QgdXNiYXRtX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJc3RydWN0IHVyYiAqdXJiOwogCkBAIC0yMjQsNyArMjI0LDcgQEAKIAlyZXR1cm4gdXJiOwogfQogCi1zdGF0aWMgaW5saW5lIGludCB1c2JhdG1fc3VibWl0X3VyYihzdHJ1Y3QgdXJiICp1cmIpCitzdGF0aWMgaW50IHVzYmF0bV9zdWJtaXRfdXJiKHN0cnVjdCB1cmIgKnVyYikKIHsKIAlzdHJ1Y3QgdXNiYXRtX2NoYW5uZWwgKmNoYW5uZWwgPSB1cmItPmNvbnRleHQ7CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYwppbmRleCAyNDgyNzllLi5iOWZkMzlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCkBAIC0zMzUsMTQgKzMzNSw5IEBACiAKIAlkYmcoImFjbV9yeF90YXNrbGV0OiBwcm9jZXNpbmcgYnVmIDB4JXAsIHNpemUgPSAlZFxuIiwgYnVmLCBidWYtPnNpemUpOwogCi0JZm9yIChpID0gMDsgaSA8IGJ1Zi0+c2l6ZSAmJiAhYWNtLT50aHJvdHRsZTsgaSsrKSB7Ci0JCS8qIGlmIHdlIGluc2VydCBtb3JlIHRoYW4gVFRZX0ZMSVBCVUZfU0laRSBjaGFyYWN0ZXJzLAotCQkgICB3ZSBkcm9wIHRoZW0uICovCi0JCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkgewotCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKLSAJCX0KLQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBidWYtPmJhc2VbaV0sIDApOwotIAl9CisJdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBidWYtPnNpemUpOworCWlmICghYWNtLT50aHJvdHRsZSkKKwkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGJ1Zi0+YmFzZSwgYnVmLT5zaXplKTsKIAl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCiAJc3Bpbl9sb2NrKCZhY20tPnRocm90dGxlX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9pbm9kZS5jIGIvZHJpdmVycy91c2IvY29yZS9pbm9kZS5jCmluZGV4IGM0NGJiZWQuLjNjZjk0NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaW5vZGUuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMKQEAgLTE4NCwxMyArMTg0LDEzIEBACiAJYnVzLT5kX2lub2RlLT5pX2dpZCA9IGJ1c2dpZDsKIAlidXMtPmRfaW5vZGUtPmlfbW9kZSA9IFNfSUZESVIgfCBidXNtb2RlOwogCi0JZG93bigmYnVzLT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmYnVzLT5kX2lub2RlLT5pX211dGV4KTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kX3N1YmRpcnMsIGRfY2hpbGQpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRfc3ViZGlycywgZF91LmRfY2hpbGQpCiAJCWlmIChkZXYtPmRfaW5vZGUpCiAJCQl1cGRhdGVfZGV2KGRldik7CiAKLQl1cCgmYnVzLT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZidXMtPmRfaW5vZGUtPmlfbXV0ZXgpOwogfQogCiBzdGF0aWMgdm9pZCB1cGRhdGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKQEAgLTIwMSw5ICsyMDEsOSBAQAogCWlmICghcm9vdCkKIAkJcmV0dXJuOwogCi0JZG93bigmcm9vdC0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJnJvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShidXMsICZyb290LT5kX3N1YmRpcnMsIGRfY2hpbGQpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ1cywgJnJvb3QtPmRfc3ViZGlycywgZF91LmRfY2hpbGQpIHsKIAkJaWYgKGJ1cy0+ZF9pbm9kZSkgewogCQkJc3dpdGNoIChTX0lGTVQgJiBidXMtPmRfaW5vZGUtPmlfbW9kZSkgewogCQkJY2FzZSBTX0lGRElSOgpAQCAtMjE5LDcgKzIxOSw3IEBACiAJCX0KIAl9CiAKLQl1cCgmcm9vdC0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CiB9CiAKIHN0YXRpYyBpbnQgcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQpAQCAtMzE5LDcgKzMxOSw3IEBACiAJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CiAKIAlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZW50cnktPmRfc3ViZGlycykgewotCQlzdHJ1Y3QgZGVudHJ5ICpkZSA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGRlbnRyeSwgZF9jaGlsZCk7CisJCXN0cnVjdCBkZW50cnkgKmRlID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZGVudHJ5LCBkX3UuZF9jaGlsZCk7CiAJCWlmICh1c2Jmc19wb3NpdGl2ZShkZSkpIHsKIAkJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CiAJCQlyZXR1cm4gMDsKQEAgLTMzMywxMCArMzMzLDEwIEBACiBzdGF0aWMgaW50IHVzYmZzX3VubGluayAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOwotCWRvd24oJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCWRlbnRyeS0+ZF9pbm9kZS0+aV9ubGluay0tOwogCWRwdXQoZGVudHJ5KTsKLQl1cCgmaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAlkX2RlbGV0ZShkZW50cnkpOwogCXJldHVybiAwOwogfQpAQCAtMzQ2LDcgKzM0Niw3IEBACiAJaW50IGVycm9yID0gLUVOT1RFTVBUWTsKIAlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAotCWRvd24oJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCWRlbnRyeV91bmhhc2goZGVudHJ5KTsKIAlpZiAodXNiZnNfZW1wdHkoZGVudHJ5KSkgewogCQlkZW50cnktPmRfaW5vZGUtPmlfbmxpbmsgLT0gMjsKQEAgLTM1NSw3ICszNTUsNyBAQAogCQlkaXItPmlfbmxpbmstLTsKIAkJZXJyb3IgPSAwOwogCX0KLQl1cCgmaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAlpZiAoIWVycm9yKQogCQlkX2RlbGV0ZShkZW50cnkpOwogCWRwdXQoZGVudHJ5KTsKQEAgLTM4MCw3ICszODAsNyBAQAogewogCWxvZmZfdCByZXR2YWwgPSAtRUlOVkFMOwogCi0JZG93bigmZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJc3dpdGNoKG9yaWcpIHsKIAljYXNlIDA6CiAJCWlmIChvZmZzZXQgPiAwKSB7CkBAIC0zOTcsNyArMzk3LDcgQEAKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9Ci0JdXAoJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNDgwLDcgKzQ4MCw3IEBACiAJfQogCiAJKmRlbnRyeSA9IE5VTEw7Ci0JZG93bigmcGFyZW50LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKIAkqZGVudHJ5ID0gbG9va3VwX29uZV9sZW4obmFtZSwgcGFyZW50LCBzdHJsZW4obmFtZSkpOwogCWlmICghSVNfRVJSKGRlbnRyeSkpIHsKIAkJaWYgKChtb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKQpAQCAtNDg5LDcgKzQ4OSw3IEBACiAJCQllcnJvciA9IHVzYmZzX2NyZWF0ZSAocGFyZW50LT5kX2lub2RlLCAqZGVudHJ5LCBtb2RlKTsKIAl9IGVsc2UKIAkJZXJyb3IgPSBQVFJfRVJSKGRlbnRyeSk7Ci0JdXAoJnBhcmVudC0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKIAogCXJldHVybiBlcnJvcjsKIH0KQEAgLTUyOCw3ICs1MjgsNyBAQAogCWlmICghcGFyZW50IHx8ICFwYXJlbnQtPmRfaW5vZGUpCiAJCXJldHVybjsKIAotCWRvd24oJnBhcmVudC0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJaWYgKHVzYmZzX3Bvc2l0aXZlKGRlbnRyeSkpIHsKIAkJaWYgKGRlbnRyeS0+ZF9pbm9kZSkgewogCQkJaWYgKFNfSVNESVIoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQpAQCAtNTM4LDcgKzUzOCw3IEBACiAJCWRwdXQoZGVudHJ5KTsKIAkJfQogCX0KLQl1cCgmcGFyZW50LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMKaW5kZXggOGY0MDJmOC4uYWZjODRjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMKQEAgLTI1MzQsOSArMjUzNCw2IEBACiAJLmRyaXZlciAJPSB7CiAJCS5uYW1lCQk9IChjaGFyICopIHNob3J0bmFtZSwKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCQkvLyAuc2h1dGRvd24gPSAuLi4KLQkJLy8gLnN1c3BlbmQgPSAuLi4KLQkJLy8gLnJlc3VtZSA9IC4uLgogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKaW5kZXggMGNlYTk3OC4uZGU1OWM1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYwpAQCAtMTg5MSw3ICsxODkxLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOwotCWRvd24oJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCWN1cnJlbnQtPmZsYWdzIHw9IFBGX1NZTkNXUklURTsKIAlyYyA9IGZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0+aV9tYXBwaW5nKTsKIAllcnIgPSBmaWxwLT5mX29wLT5mc3luYyhmaWxwLCBmaWxwLT5mX2RlbnRyeSwgMSk7CkBAIC0xOTAxLDcgKzE5MDEsNyBAQAogCWlmICghcmMpCiAJCXJjID0gZXJyOwogCWN1cnJlbnQtPmZsYWdzICY9IH5QRl9TWU5DV1JJVEU7Ci0JdXAoJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJVkxEQkcoY3VybHVuLCAiZmRhdGFzeW5jIC0+ICVkXG4iLCByYyk7CiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYwppbmRleCA1YzQwOTgwLi45YTRlZGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYwpAQCAtMTU2MiwxMCArMTU2MiwxMCBAQAogCQlzcGluX3VubG9ja19pcnEgKCZkZXYtPmxvY2spOwogCiAJCS8qIGJyZWFrIGxpbmsgdG8gZGNhY2hlICovCi0JCWRvd24gKCZwYXJlbnQtPmlfc2VtKTsKKwkJbXV0ZXhfbG9jayAoJnBhcmVudC0+aV9tdXRleCk7CiAJCWRfZGVsZXRlIChkZW50cnkpOwogCQlkcHV0IChkZW50cnkpOwotCQl1cCAoJnBhcmVudC0+aV9zZW0pOworCQltdXRleF91bmxvY2sgKCZwYXJlbnQtPmlfbXV0ZXgpOwogCiAJCS8qIGZkcyBtYXkgc3RpbGwgYmUgb3BlbiAqLwogCQlnb3RvIHJlc3RhcnQ7CkBAIC0xNzM4LDkgKzE3MzgsNiBAQAogCiAJLmRyaXZlciAJPSB7CiAJCS5uYW1lCQk9IChjaGFyICopIHNob3J0bmFtZSwKLQkJLy8gLnNodXRkb3duID0gLi4uCi0JCS8vIC5zdXNwZW5kID0gLi4uCi0JCS8vIC5yZXN1bWUgPSAuLi4KIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3NlcmlhbC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3NlcmlhbC5jCmluZGV4IDY1ZTA4NGEuLmJhOWFjZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9zZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvc2VyaWFsLmMKQEAgLTM3NCw5ICszNzQsNiBAQAogCS5kaXNjb25uZWN0ID0JCWdzX2Rpc2Nvbm5lY3QsCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPQkJR1NfU0hPUlRfTkFNRSwKLQkJLyogLnNodXRkb3duID0gLi4uICovCi0JCS8qIC5zdXNwZW5kID0gLi4uICAqLwotCQkvKiAucmVzdW1lID0gLi4uICAgKi8KIAl9LAogfTsKIApAQCAtMTI3MSw2ICsxMjY4LDcgQEAKIAl1bnNpZ25lZCBpbnQgbGVuOwogCXN0cnVjdCBnc19wb3J0ICpwb3J0OwogCWludCByZXQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAogCS8qIFRFTVBPUkFSWSAtLSBvbmx5IHBvcnQgMCBpcyBzdXBwb3J0ZWQgcmlnaHQgbm93ICovCiAJcG9ydCA9IGRldi0+ZGV2X3BvcnRbMF07CkBAIC0xMjkwLDcgKzEyODgsMTAgQEAKIAkJZ290byBleGl0OwogCX0KIAotCWlmIChwb3J0LT5wb3J0X3R0eSA9PSBOVUxMKSB7CisKKwl0dHkgPSBwb3J0LT5wb3J0X3R0eTsKKworCWlmICh0dHkgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgImdzX3JlY3ZfcGFja2V0OiBwb3J0PSVkLCBOVUxMIHR0eSBwb2ludGVyXG4iLAogCQkJcG9ydC0+cG9ydF9udW0pOwogCQlyZXQgPSAtRUlPOwpAQCAtMTMwNCwyMCArMTMwNSwxMyBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCi0JbGVuID0gKHVuc2lnbmVkIGludCkoVFRZX0ZMSVBCVUZfU0laRSAtIHBvcnQtPnBvcnRfdHR5LT5mbGlwLmNvdW50KTsKLQlpZiAobGVuIDwgc2l6ZSkKLQkJc2l6ZSA9IGxlbjsKLQotCWlmIChzaXplID4gMCkgewotCQltZW1jcHkocG9ydC0+cG9ydF90dHktPmZsaXAuY2hhcl9idWZfcHRyLCBwYWNrZXQsIHNpemUpOwotCQlwb3J0LT5wb3J0X3R0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgKz0gc2l6ZTsKLQkJcG9ydC0+cG9ydF90dHktPmZsaXAuY291bnQgKz0gc2l6ZTsKKwlsZW4gPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIHNpemUpOworCWlmIChsZW4gPiAwKSB7CisJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBwYWNrZXQsIGxlbik7CiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHBvcnQtPnBvcnRfdHR5KTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5wb3J0X3R0eS0+cmVhZF93YWl0KTsKIAl9Ci0KIAlyZXQgPSAwOwotCiBleGl0OgogCXNwaW5fdW5sb2NrKCZwb3J0LT5wb3J0X2xvY2spOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvemVyby5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3plcm8uYwppbmRleCA2YzU4NjM2Li4yZmMxMTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvemVyby5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC96ZXJvLmMKQEAgLTEzMDMsOSArMTMwMyw2IEBACiAJLmRyaXZlciAJPSB7CiAJCS5uYW1lCQk9IChjaGFyICopIHNob3J0bmFtZSwKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCQkvLyAuc2h1dGRvd24gPSAuLi4KLQkJLy8gLnN1c3BlbmQgPSAuLi4KLQkJLy8gLnJlc3VtZSA9IC4uLgogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKaW5kZXggZWQxODk5ZC4uYmUzZmQ5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZwpAQCAtMTEsMTQgKzExLDE0IEBACiAJICBUaGUgRW5oYW5jZWQgSG9zdCBDb250cm9sbGVyIEludGVyZmFjZSAoRUhDSSkgaXMgc3RhbmRhcmQgZm9yIFVTQiAyLjAKIAkgICJoaWdoIHNwZWVkIiAoNDgwIE1iaXQvc2VjLCA2MCBNYnl0ZS9zZWMpIGhvc3QgY29udHJvbGxlciBoYXJkd2FyZS4KIAkgIElmIHlvdXIgVVNCIGhvc3QgY29udHJvbGxlciBzdXBwb3J0cyBVU0IgMi4wLCB5b3Ugd2lsbCBsaWtlbHkgd2FudCB0bwotCSAgY29uZmlndXJlIHRoaXMgSG9zdCBDb250cm9sbGVyIERyaXZlci4gIEF0IHRoaXMgd3JpdGluZywgdGhlIHByaW1hcnkKLQkgIGltcGxlbWVudGF0aW9uIG9mIEVIQ0kgaXMgYSBjaGlwIGZyb20gTkVDLCB3aWRlbHkgYXZhaWxhYmxlIGluIGFkZC1vbgotCSAgUENJIGNhcmRzLCBidXQgaW1wbGVtZW50YXRpb25zIGFyZSBpbiB0aGUgd29ya3MgZnJvbSBvdGhlciB2ZW5kb3JzCi0JICBpbmNsdWRpbmcgSW50ZWwgYW5kIFBoaWxpcHMuICBNb3RoZXJib2FyZCBzdXBwb3J0IGlzIGFwcGVhcmluZy4KKwkgIGNvbmZpZ3VyZSB0aGlzIEhvc3QgQ29udHJvbGxlciBEcml2ZXIuICBBdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcsIAorCSAgdGhlIHByaW1hcnkgaW1wbGVtZW50YXRpb24gb2YgRUhDSSBpcyBhIGNoaXAgZnJvbSBORUMsIHdpZGVseSBhdmFpbGFibGUKKwkgIGluIGFkZC1vbiBQQ0kgY2FyZHMsIGJ1dCBpbXBsZW1lbnRhdGlvbnMgYXJlIGluIHRoZSB3b3JrcyBmcm9tIG90aGVyIAorCSAgdmVuZG9ycyBpbmNsdWRpbmcgSW50ZWwgYW5kIFBoaWxpcHMuICBNb3RoZXJib2FyZCBzdXBwb3J0IGlzIGFwcGVhcmluZy4KIAogCSAgRUhDSSBjb250cm9sbGVycyBhcmUgcGFja2FnZWQgd2l0aCAiY29tcGFuaW9uIiBob3N0IGNvbnRyb2xsZXJzIChPSENJCiAJICBvciBVSENJKSB0byBoYW5kbGUgVVNCIDEuMSBkZXZpY2VzIGNvbm5lY3RlZCB0byByb290IGh1YiBwb3J0cy4gIFBvcnRzCi0JICB3aWxsIGNvbm5lY3QgdG8gRUhDSSBpZiBpdCB0aGUgZGV2aWNlIGlzIGhpZ2ggc3BlZWQsIG90aGVyd2lzZSB0aGV5CisJICB3aWxsIGNvbm5lY3QgdG8gRUhDSSBpZiB0aGUgZGV2aWNlIGlzIGhpZ2ggc3BlZWQsIG90aGVyd2lzZSB0aGV5CiAJICBjb25uZWN0IHRvIGEgY29tcGFuaW9uIGNvbnRyb2xsZXIuICBJZiB5b3UgY29uZmlndXJlIEVIQ0ksIHlvdSBzaG91bGQKIAkgIHByb2JhYmx5IGNvbmZpZ3VyZSB0aGUgT0hDSSAoZm9yIE5FQyBhbmQgc29tZSBvdGhlciB2ZW5kb3JzKSBVU0IgSG9zdAogCSAgQ29udHJvbGxlciBEcml2ZXIgb3IgVUhDSSAoZm9yIFZpYSBtb3RoZXJib2FyZHMpIEhvc3QgQ29udHJvbGxlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF1MXh4eC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF1MXh4eC5jCmluZGV4IGQ5Y2YzYjMuLjc3Y2Q2YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdTF4eHguYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktYXUxeHh4LmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1saDdhNDA0LmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktbGg3YTQwNC5jCmluZGV4IDM5NTljY2MuLjAwMjBlZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1saDdhNDA0LmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWxoN2E0MDQuYwpAQCAtMTcsNiArMTcsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KIAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktb21hcC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLW9tYXAuYwppbmRleCBjOWUyOWQ4Li4zNzg1YjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktb21hcC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1vbWFwLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4JLyogU0FfSU5URVJSVVBUICovCiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC0yNyw3ICsyOCw2IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2ZwZ2EuaD4KICNpbmNsdWRlIDxhc20vYXJjaC91c2IuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KIAogCiAvKiBPTUFQLTE1MTAgT0hDSSBoYXMgaXRzIG93biBNTVUgZm9yIERNQSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBwYy1zb2MuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wcGMtc29jLmMKaW5kZXggMmVjNmE3OC4uYjJhOGRmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBwYy1zb2MuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHBjLXNvYy5jCkBAIC0xNSw2ICsxNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogCiAvKiBjb25maWd1cmUgc28gYW4gSEMgZGV2aWNlIGFuZCBpZCBhcmUgYWx3YXlzIHByb3ZpZGVkICovCiAvKiBhbHdheXMgY2FsbGVkIHdpdGggcHJvY2VzcyBjb250ZXh0OyBzbGVlcGluZyBpcyBPSyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXMzYzI0MTAuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zM2MyNDEwLmMKaW5kZXggMzVjYzk0MC4uMzcyNTI3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXMzYzI0MTAuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktczNjMjQxMC5jCkBAIC0yMCw5ICsyMCw5IEBACiAqLwogCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KICNpbmNsdWRlIDxhc20vYXJjaC91c2ItY29udHJvbC5oPgogCiAjZGVmaW5lIHZhbGlkX3BvcnQoaWR4KSAoKGlkeCkgPT0gMSB8fCAoaWR4KSA9PSAyKQpAQCAtMzYzLDcgKzM2Myw2IEBACiAJCWdvdG8gZXJyMTsKIAl9CiAKLQljbGtfdXNlKGNsayk7CiAJczNjMjQxMF9zdGFydF9oYyhkZXYsIGhjZCk7CiAKIAloY2QtPnJlZ3MgPSBpb3JlbWFwKGhjZC0+cnNyY19zdGFydCwgaGNkLT5yc3JjX2xlbik7CkBAIC0zODQsNyArMzgzLDYgQEAKICBlcnIyOgogCXMzYzI0MTBfc3RvcF9oYyhkZXYpOwogCWlvdW5tYXAoaGNkLT5yZWdzKTsKLQljbGtfdW51c2UoY2xrKTsKIAljbGtfcHV0KGNsayk7CiAKICBlcnIxOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW1hZ2UvbWljcm90ZWsuYyBiL2RyaXZlcnMvdXNiL2ltYWdlL21pY3JvdGVrLmMKaW5kZXggNDU4ZjJhYy4uMjg1MzhkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW1hZ2UvbWljcm90ZWsuYworKysgYi9kcml2ZXJzL3VzYi9pbWFnZS9taWNyb3Rlay5jCkBAIC02NzQsNyArNjc0LDcgQEAKIAogCiAvKiBUaGVzZSBhcmUgdGFrZW4gZnJvbSB0aGUgbXNtVVNCLmluZiBmaWxlIG9uIHRoZSBXaW5kb3dzIGRyaXZlciBDRCAqLwotY29uc3Qgc3RhdGljIHN0cnVjdCB2ZW5kb3JfcHJvZHVjdCBtdHNfc3VwcG9ydGVkX3Byb2R1Y3RzW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCB2ZW5kb3JfcHJvZHVjdCBtdHNfc3VwcG9ydGVkX3Byb2R1Y3RzW10gPQogewogCXsgIlBoYW50b20gMzM2Q1giLAltdHNfc3VwX3Vua25vd259LAogCXsgIlBoYW50b20gMzM2Q1giLAltdHNfc3VwX3Vua25vd259LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2lucHV0L0tjb25maWcKaW5kZXggNTA5ZGQwYS4uNTI0NmIzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9LY29uZmlnCkBAIC0zNyw2ICszNywxNiBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBZLgogCitjb25maWcgVVNCX0hJRElOUFVUX1BPV0VSQk9PSworCWJvb2wgIkVuYWJsZSBzdXBwb3J0IGZvciBpQm9vay9Qb3dlckJvb2sgc3BlY2lhbCBrZXlzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gVVNCX0hJRElOUFVUCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciB0aGUgc3BlY2lhbCBrZXlzIChGbiwgTnVtbG9jaykgb24KKwkgIEFwcGxlIGlCb29rcyBhbmQgUG93ZXJCb29rcy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIEhJRF9GRgogCWJvb2wgIkZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBVU0JfSElESU5QVVQgJiYgRVhQRVJJTUVOVEFMCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9hcHBsZXRvdWNoLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9hcHBsZXRvdWNoLmMKaW5kZXggMTk0OWI1NC4uYzIyMmVkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvYXBwbGV0b3VjaC5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2FwcGxldG91Y2guYwpAQCAtNiw2ICs2LDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwNSAgICAgIFN0ZWxpYW4gUG9wIChzdGVsaWFuQHBvcGllcy5uZXQpCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUgICAgICBGcmFuayBBcm5vbGQgKGZyYW5rQHNjaXJvY2NvLTV2LXR1cmJvLmRlKQogICogQ29weXJpZ2h0IChDKSAyMDA1ICAgICAgUGV0ZXIgT3N0ZXJsdW5kIChwZXRlcm8yQHRlbGlhLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwNSAgICAgIE1pY2hhZWwgSGFuc2VsbWFubiAobGludXgta2VybmVsQGhhbnNtaS5jaCkKICAqCiAgKiBUaGFua3MgdG8gQWxleCBIYXJwZXIgPGJhc2lsaXNrQGZvb2JveC5uZXQ+IGZvciBoaXMgaW5wdXRzLgogICoKQEAgLTM4LDYgKzM5LDExIEBACiAvKiBBcHBsZSBoYXMgcG93ZXJib29rcyB3aGljaCBoYXZlIHRoZSBrZXlib2FyZCB3aXRoIGRpZmZlcmVudCBQcm9kdWN0IElEcyAqLwogI2RlZmluZSBBUFBMRV9WRU5ET1JfSUQJCTB4MDVBQwogCisvKiBUaGVzZSBuYW1lcyBjb21lIGZyb20gSW5mby5wbGlzdCBpbiBBcHBsZVVTQlRyYWNrcGFkLmtleHQgKi8KKyNkZWZpbmUgR0VZU0VSX0FOU0lfUFJPRFVDVF9JRAkweDAyMTQKKyNkZWZpbmUgR0VZU0VSX0lTT19QUk9EVUNUX0lECTB4MDIxNQorI2RlZmluZSBHRVlTRVJfSklTX1BST0RVQ1RfSUQJMHgwMjE2CisKICNkZWZpbmUgQVRQX0RFVklDRShwcm9kKQkJCQkJXAogCS5tYXRjaF9mbGFncyA9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFIHwJCVwKIAkJICAgICAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0NMQVNTIHwJCVwKQEAgLTUzLDEzICs1OSwxNyBAQAogCXsgQVRQX0RFVklDRSgweDAyMEYpIH0sCiAJeyBBVFBfREVWSUNFKDB4MDMwQSkgfSwKIAl7IEFUUF9ERVZJQ0UoMHgwMzBCKSB9LAotCXsgfQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KKworCS8qIFBvd2VyQm9va3MgT2N0IDIwMDUgKi8KKwl7IEFUUF9ERVZJQ0UoR0VZU0VSX0FOU0lfUFJPRFVDVF9JRCkgfSwKKwl7IEFUUF9ERVZJQ0UoR0VZU0VSX0lTT19QUk9EVUNUX0lEKSB9LAorCXsgQVRQX0RFVklDRShHRVlTRVJfSklTX1BST0RVQ1RfSUQpIH0sCisKKwkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgYXRwX3RhYmxlKTsKIAotLyogc2l6ZSBvZiBhIFVTQiB1cmIgdHJhbnNmZXIgKi8KLSNkZWZpbmUgQVRQX0RBVEFTSVpFCTgxCi0KIC8qCiAgKiBudW1iZXIgb2Ygc2Vuc29ycy4gTm90ZSB0aGF0IG9ubHkgMTYgaW5zdGVhZCBvZiAyNiBYIChob3Jpem9udGFsKQogICogc2Vuc29ycyBleGlzdCBvbiAxMiIgYW5kIDE1IiBQb3dlckJvb2tzLiBBbGwgbW9kZWxzIGhhdmUgMTYgWQpAQCAtMTA4LDYgKzExOCw4IEBACiAJc2lnbmVkIGNoYXIJCXh5X29sZFtBVFBfWFNFTlNPUlMgKyBBVFBfWVNFTlNPUlNdOwogCQkJCQkJLyogYWNjdW11bGF0ZWQgc2Vuc29ycyAqLwogCWludAkJCXh5X2FjY1tBVFBfWFNFTlNPUlMgKyBBVFBfWVNFTlNPUlNdOworCWludAkJCW92ZXJmbG93d2FybjsJLyogb3ZlcmZsb3cgd2FybmluZyBwcmludGVkPyAqLworCWludAkJCWRhdGFsZW47CS8qIHNpemUgb2YgYW4gVVNCIHVyYiB0cmFuc2ZlciAqLwogfTsKIAogI2RlZmluZSBkYmdfZHVtcChtc2csIHRhYikgXApAQCAtMTI0LDcgKzEzNiw3IEBACiAJCWlmIChkZWJ1ZykgcHJpbnRrKGZvcm1hdCwgIyNhKTsJCQkJXAogCX0gd2hpbGUgKDApCiAKLU1PRFVMRV9BVVRIT1IoIkpvaGFubmVzIEJlcmcsIFN0ZWxpYW4gUG9wLCBGcmFuayBBcm5vbGQiKTsKK01PRFVMRV9BVVRIT1IoIkpvaGFubmVzIEJlcmcsIFN0ZWxpYW4gUG9wLCBGcmFuayBBcm5vbGQsIE1pY2hhZWwgSGFuc2VsbWFubiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBcHBsZSBQb3dlckJvb2tzIFVTQiB0b3VjaHBhZCBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIApAQCAtMTMyLDYgKzE0NCwxNiBAQAogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkFjdGl2YXRlIGRlYnVnZ2luZyBvdXRwdXQiKTsKIAorLyogQ2hlY2tzIGlmIHRoZSBkZXZpY2UgYSBHZXlzZXIgMiAoQU5TSSwgSVNPLCBKSVMpICovCitzdGF0aWMgaW5saW5lIGludCBhdHBfaXNfZ2V5c2VyXzIoc3RydWN0IGF0cCAqZGV2KQoreworCWludDE2X3QgcHJvZHVjdElkID0gbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisKKwlyZXR1cm4gKHByb2R1Y3RJZCA9PSBHRVlTRVJfQU5TSV9QUk9EVUNUX0lEKSB8fAorCQkocHJvZHVjdElkID09IEdFWVNFUl9JU09fUFJPRFVDVF9JRCkgfHwKKwkJKHByb2R1Y3RJZCA9PSBHRVlTRVJfSklTX1BST0RVQ1RfSUQpOworfQorCiBzdGF0aWMgaW50IGF0cF9jYWxjdWxhdGVfYWJzKGludCAqeHlfc2Vuc29ycywgaW50IG5iX3NlbnNvcnMsIGludCBmYWN0LAogCQkJICAgICBpbnQgKnosIGludCAqZmluZ2VycykKIHsKQEAgLTE2OCwxMyArMTkwLDIwIEBACiBzdGF0aWMgdm9pZCBhdHBfY29tcGxldGUoc3RydWN0IHVyYiogdXJiLCBzdHJ1Y3QgcHRfcmVncyogcmVncykKIHsKIAlpbnQgeCwgeSwgeF96LCB5X3osIHhfZiwgeV9mOwotCWludCByZXR2YWwsIGk7CisJaW50IHJldHZhbCwgaSwgajsKIAlzdHJ1Y3QgYXRwICpkZXYgPSB1cmItPmNvbnRleHQ7CiAKIAlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CiAJY2FzZSAwOgogCQkvKiBzdWNjZXNzICovCiAJCWJyZWFrOworCWNhc2UgLUVPVkVSRkxPVzoKKwkJaWYoIWRldi0+b3ZlcmZsb3d3YXJuKSB7CisJCQlwcmludGsoImFwcGxldG91Y2g6IE9WRVJGTE9XIHdpdGggZGF0YSAiCisJCQkJImxlbmd0aCAlZCwgYWN0dWFsIGxlbmd0aCBpcyAlZFxuIiwKKwkJCQlkZXYtPmRhdGFsZW4sIGRldi0+dXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJCWRldi0+b3ZlcmZsb3d3YXJuID0gMTsKKwkJfQogCWNhc2UgLUVDT05OUkVTRVQ6CiAJY2FzZSAtRU5PRU5UOgogCWNhc2UgLUVTSFVURE9XTjoKQEAgLTE4OSwyMyArMjE4LDQ1IEBACiAJfQogCiAJLyogZHJvcCBpbmNvbXBsZXRlIGRhdGFzZXRzICovCi0JaWYgKGRldi0+dXJiLT5hY3R1YWxfbGVuZ3RoICE9IEFUUF9EQVRBU0laRSkgeworCWlmIChkZXYtPnVyYi0+YWN0dWFsX2xlbmd0aCAhPSBkZXYtPmRhdGFsZW4pIHsKIAkJZHByaW50aygiYXBwbGV0b3VjaDogaW5jb21wbGV0ZSBkYXRhIHBhY2thZ2UuXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAogCS8qIHJlb3JkZXIgdGhlIHNlbnNvcnMgdmFsdWVzICovCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQkvKiBYIHZhbHVlcyAqLwotCQlkZXYtPnh5X2N1cltpICAgICBdID0gZGV2LT5kYXRhWzUgKiBpICsgIDJdOwotCQlkZXYtPnh5X2N1cltpICsgIDhdID0gZGV2LT5kYXRhWzUgKiBpICsgIDRdOwotCQlkZXYtPnh5X2N1cltpICsgMTZdID0gZGV2LT5kYXRhWzUgKiBpICsgNDJdOwotCQlpZiAoaSA8IDIpCi0JCQlkZXYtPnh5X2N1cltpICsgMjRdID0gZGV2LT5kYXRhWzUgKiBpICsgNDRdOworCWlmIChhdHBfaXNfZ2V5c2VyXzIoZGV2KSkgeworCQltZW1zZXQoZGV2LT54eV9jdXIsIDAsIHNpemVvZihkZXYtPnh5X2N1cikpOwogCi0JCS8qIFkgdmFsdWVzICovCi0JCWRldi0+eHlfY3VyW2kgKyAyNl0gPSBkZXYtPmRhdGFbNSAqIGkgKyAgMV07Ci0JCWRldi0+eHlfY3VyW2kgKyAzNF0gPSBkZXYtPmRhdGFbNSAqIGkgKyAgM107CisJCS8qCisJCSAqIFRoZSB2YWx1ZXMgYXJlIGxhaWQgb3V0IGxpa2UgdGhpczoKKwkJICogWTEsIFkyLCAtLCBZMywgWTQsIC0sIC4uLiwgWDEsIFgyLCAtLCBYMywgWDQsIC0sIC4uLgorCQkgKiAnLScgaXMgYW4gdW51c2VkIHZhbHVlLgorCQkgKi8KKworCQkvKiByZWFkIFggdmFsdWVzICovCisJCWZvciAoaSA9IDAsIGogPSAxOTsgaSA8IDIwOyBpICs9IDIsIGogKz0gMykgeworCQkJZGV2LT54eV9jdXJbaV0gPSBkZXYtPmRhdGFbal07CisJCQlkZXYtPnh5X2N1cltpICsgMV0gPSBkZXYtPmRhdGFbaiArIDFdOworCQl9CisKKwkJLyogcmVhZCBZIHZhbHVlcyAqLworCQlmb3IgKGkgPSAwLCBqID0gMTsgaSA8IDk7IGkgKz0gMiwgaiArPSAzKSB7CisJCQlkZXYtPnh5X2N1cltBVFBfWFNFTlNPUlMgKyBpXSA9IGRldi0+ZGF0YVtqXTsKKwkJCWRldi0+eHlfY3VyW0FUUF9YU0VOU09SUyArIGkgKyAxXSA9IGRldi0+ZGF0YVtqICsgMV07CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQkvKiBYIHZhbHVlcyAqLworCQkJZGV2LT54eV9jdXJbaSAgICAgXSA9IGRldi0+ZGF0YVs1ICogaSArICAyXTsKKwkJCWRldi0+eHlfY3VyW2kgKyAgOF0gPSBkZXYtPmRhdGFbNSAqIGkgKyAgNF07CisJCQlkZXYtPnh5X2N1cltpICsgMTZdID0gZGV2LT5kYXRhWzUgKiBpICsgNDJdOworCQkJaWYgKGkgPCAyKQorCQkJCWRldi0+eHlfY3VyW2kgKyAyNF0gPSBkZXYtPmRhdGFbNSAqIGkgKyA0NF07CisKKwkJCS8qIFkgdmFsdWVzICovCisJCQlkZXYtPnh5X2N1cltpICsgMjZdID0gZGV2LT5kYXRhWzUgKiBpICsgIDFdOworCQkJZGV2LT54eV9jdXJbaSArIDM0XSA9IGRldi0+ZGF0YVs1ICogaSArICAzXTsKKwkJfQogCX0KIAogCWRiZ19kdW1wKCJzYW1wbGUiLCBkZXYtPnh5X2N1cik7CkBAIC0yMTYsMTYgKzI2NywyNCBAQAogCQlkZXYtPnhfb2xkID0gZGV2LT55X29sZCA9IC0xOwogCQltZW1jcHkoZGV2LT54eV9vbGQsIGRldi0+eHlfY3VyLCBzaXplb2YoZGV2LT54eV9vbGQpKTsKIAotCQkvKiAxNyIgUG93ZXJib29rcyBoYXZlIDEwIGV4dHJhIFggc2Vuc29ycyAqLwotCQlmb3IgKGkgPSAxNjsgaSA8IEFUUF9YU0VOU09SUzsgaSsrKQotCQkJaWYgKGRldi0+eHlfY3VyW2ldKSB7Ci0JCQkJcHJpbnRrKCJhcHBsZXRvdWNoOiAxN1wiIG1vZGVsIGRldGVjdGVkLlxuIik7CisJCS8qIDE3IiBQb3dlcmJvb2tzIGhhdmUgZXh0cmEgWCBzZW5zb3JzICovCisJCWZvciAoaSA9IChhdHBfaXNfZ2V5c2VyXzIoZGV2KT8xNToxNik7IGkgPCBBVFBfWFNFTlNPUlM7IGkrKykgeworCQkJaWYgKCFkZXYtPnh5X2N1cltpXSkgY29udGludWU7CisKKwkJCXByaW50aygiYXBwbGV0b3VjaDogMTdcIiBtb2RlbCBkZXRlY3RlZC5cbiIpOworCQkJaWYoYXRwX2lzX2dleXNlcl8yKGRldikpCisJCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LT5pbnB1dCwgQUJTX1gsIDAsCisJCQkJCQkgICAgICgyMCAtIDEpICoKKwkJCQkJCSAgICAgQVRQX1hGQUNUIC0gMSwKKwkJCQkJCSAgICAgQVRQX0ZVWlosIDApOworCQkJZWxzZQogCQkJCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldi0+aW5wdXQsIEFCU19YLCAwLAogCQkJCQkJICAgICAoQVRQX1hTRU5TT1JTIC0gMSkgKgogCQkJCQkJICAgICBBVFBfWEZBQ1QgLSAxLAogCQkJCQkJICAgICBBVFBfRlVaWiwgMCk7Ci0JCQkJYnJlYWs7Ci0JCQl9CisKKwkJCWJyZWFrOworCQl9CiAKIAkJZ290byBleGl0OwogCX0KQEAgLTI4Miw3ICszNDEsOCBAQAogCQltZW1zZXQoZGV2LT54eV9hY2MsIDAsIHNpemVvZihkZXYtPnh5X2FjYykpOwogCX0KIAotCWlucHV0X3JlcG9ydF9rZXkoZGV2LT5pbnB1dCwgQlROX0xFRlQsICEhZGV2LT5kYXRhWzgwXSk7CisJaW5wdXRfcmVwb3J0X2tleShkZXYtPmlucHV0LCBCVE5fTEVGVCwKKwkJCSAhIWRldi0+ZGF0YVtkZXYtPmRhdGFsZW4gLSAxXSk7CiAKIAlpbnB1dF9zeW5jKGRldi0+aW5wdXQpOwogCkBAIC0zNTMsNiArNDEzLDggQEAKIAogCWRldi0+dWRldiA9IHVkZXY7CiAJZGV2LT5pbnB1dCA9IGlucHV0X2RldjsKKwlkZXYtPm92ZXJmbG93d2FybiA9IDA7CisJZGV2LT5kYXRhbGVuID0gKGF0cF9pc19nZXlzZXJfMihkZXYpPzY0OjgxKTsKIAogCWRldi0+dXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldi0+dXJiKSB7CkBAIC0zNjAsNyArNDIyLDcgQEAKIAkJZ290byBlcnJfZnJlZV9kZXZzOwogCX0KIAotCWRldi0+ZGF0YSA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LT51ZGV2LCBBVFBfREFUQVNJWkUsIEdGUF9LRVJORUwsCisJZGV2LT5kYXRhID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYtPnVkZXYsIGRldi0+ZGF0YWxlbiwgR0ZQX0tFUk5FTCwKIAkJCQkgICAgICZkZXYtPnVyYi0+dHJhbnNmZXJfZG1hKTsKIAlpZiAoIWRldi0+ZGF0YSkgewogCQlyZXR2YWwgPSAtRU5PTUVNOwpAQCAtMzY5LDcgKzQzMSw3IEBACiAKIAl1c2JfZmlsbF9pbnRfdXJiKGRldi0+dXJiLCB1ZGV2LAogCQkJIHVzYl9yY3ZpbnRwaXBlKHVkZXYsIGludF9pbl9lbmRwb2ludEFkZHIpLAotCQkJIGRldi0+ZGF0YSwgQVRQX0RBVEFTSVpFLCBhdHBfY29tcGxldGUsIGRldiwgMSk7CisJCQkgZGV2LT5kYXRhLCBkZXYtPmRhdGFsZW4sIGF0cF9jb21wbGV0ZSwgZGV2LCAxKTsKIAogCXVzYl9tYWtlX3BhdGgodWRldiwgZGV2LT5waHlzLCBzaXplb2YoZGV2LT5waHlzKSk7CiAJc3RybGNhdChkZXYtPnBoeXMsICIvaW5wdXQwIiwgc2l6ZW9mKGRldi0+cGh5cykpOwpAQCAtMzg1LDE0ICs0NDcsMjUgQEAKIAogCXNldF9iaXQoRVZfQUJTLCBpbnB1dF9kZXYtPmV2Yml0KTsKIAotCS8qCi0JICogMTIiIGFuZCAxNSIgUG93ZXJib29rcyBvbmx5IGhhdmUgMTYgeCBzZW5zb3JzLAotCSAqIDE3IiBtb2RlbHMgYXJlIGRldGVjdGVkIGxhdGVyLgotCSAqLwotCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1gsIDAsCi0JCQkgICAgICgxNiAtIDEpICogQVRQX1hGQUNUIC0gMSwgQVRQX0ZVWlosIDApOwotCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1ksIDAsCi0JCQkgICAgIChBVFBfWVNFTlNPUlMgLSAxKSAqIEFUUF9ZRkFDVCAtIDEsIEFUUF9GVVpaLCAwKTsKKwlpZiAoYXRwX2lzX2dleXNlcl8yKGRldikpIHsKKwkJLyoKKwkJICogT2N0IDIwMDUgMTUiIFBvd2VyQm9va3MgaGF2ZSAxNSBYIHNlbnNvcnMsIDE3IiBhcmUgZGV0ZWN0ZWQKKwkJICogbGF0ZXIuCisJCSAqLworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19YLCAwLAorCQkJCSAgICAgKCgxNSAtIDEpICogQVRQX1hGQUNUKSAtIDEsIEFUUF9GVVpaLCAwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWSwgMCwKKwkJCQkgICAgICgoOSAtIDEpICogQVRQX1lGQUNUKSAtIDEsIEFUUF9GVVpaLCAwKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiAxMiIgYW5kIDE1IiBQb3dlcmJvb2tzIG9ubHkgaGF2ZSAxNiB4IHNlbnNvcnMsCisJCSAqIDE3IiBtb2RlbHMgYXJlIGRldGVjdGVkIGxhdGVyLgorCQkgKi8KKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWCwgMCwKKwkJCQkgICAgICgxNiAtIDEpICogQVRQX1hGQUNUIC0gMSwgQVRQX0ZVWlosIDApOworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19ZLCAwLAorCQkJCSAgICAgKEFUUF9ZU0VOU09SUyAtIDEpICogQVRQX1lGQUNUIC0gMSwgQVRQX0ZVWlosIDApOworCX0KIAlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19QUkVTU1VSRSwgMCwgQVRQX1BSRVNTVVJFLCAwLCAwKTsKIAogCXNldF9iaXQoRVZfS0VZLCBpbnB1dF9kZXYtPmV2Yml0KTsKQEAgLTQyNyw3ICs1MDAsNyBAQAogCQl1c2Jfa2lsbF91cmIoZGV2LT51cmIpOwogCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShkZXYtPmlucHV0KTsKIAkJdXNiX2ZyZWVfdXJiKGRldi0+dXJiKTsKLQkJdXNiX2J1ZmZlcl9mcmVlKGRldi0+dWRldiwgQVRQX0RBVEFTSVpFLAorCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LT51ZGV2LCBkZXYtPmRhdGFsZW4sCiAJCQkJZGV2LT5kYXRhLCBkZXYtPnVyYi0+dHJhbnNmZXJfZG1hKTsKIAkJa2ZyZWUoZGV2KTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWNvcmUuYwppbmRleCA1ZjUyOTc5Li5hOTFlNzJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1jb3JlLmMKQEAgLTE0NTAsNiArMTQ1MCw5IEBACiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfQVBQTEUJCTB4MDVhYwogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1BPV0VSTU9VU0UJMHgwMzA0CiAKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9DSEVSUlkJCTB4MDQ2YQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0NIRVJSWV9DWU1PVElPTgkweDAwMjMKKwogLyoKICAqIEFscGhhYmV0aWNhbGx5IHNvcnRlZCBibGFja2xpc3QgYnkgcXVpcmsgdHlwZS4KICAqLwpAQCAtMTU4MCw2ICsxNTgzLDE2IEBACiAJeyBVU0JfVkVORE9SX0lEX1NBSVRFSywgVVNCX0RFVklDRV9JRF9TQUlURUtfUlVNQkxFUEFELCBISURfUVVJUktfQkFEUEFEIH0sCiAJeyBVU0JfVkVORE9SX0lEX1RPUE1BWCwgVVNCX0RFVklDRV9JRF9UT1BNQVhfQ09CUkFQQUQsIEhJRF9RVUlSS19CQURQQUQgfSwKIAorCXsgVVNCX1ZFTkRPUl9JRF9DSEVSUlksIFVTQl9ERVZJQ0VfSURfQ0hFUlJZX0NZTU9USU9OLCBISURfUVVJUktfQ1lNT1RJT04gfSwKKworCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMjBFLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMjBGLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMjE0LCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMjE1LCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMjE2LCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMzBBLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMzBCLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCiAJeyAwLCAwIH0KIH07CiAKQEAgLTE2MjYsNiArMTYzOSwyMCBAQAogCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LCBoaWQtPmJ1ZnNpemUsIGhpZC0+Y3RybGJ1ZiwgaGlkLT5jdHJsYnVmX2RtYSk7CiB9CiAKKy8qCisgKiBDaGVycnkgQ3ltb3Rpb24ga2V5Ym9hcmQgaGF2ZSBhbiBpbnZhbGlkIEhJRCByZXBvcnQgZGVzY3JpcHRvciwKKyAqIHRoYXQgbmVlZHMgZml4aW5nIGJlZm9yZSB3ZSBjYW4gcGFyc2UgaXQuCisgKi8KKworc3RhdGljIHZvaWQgaGlkX2ZpeHVwX2N5bW90aW9uX2Rlc2NyaXB0b3IoY2hhciAqcmRlc2MsIGludCByc2l6ZSkKK3sKKwlpZiAocnNpemUgPj0gMTcgJiYgcmRlc2NbMTFdID09IDB4M2MgJiYgcmRlc2NbMTJdID09IDB4MDIpIHsKKwkJaW5mbygiRml4aW5nIHVwIENoZXJyeSBDeW1vdGlvbiByZXBvcnQgZGVzY3JpcHRvciIpOworCQlyZGVzY1sxMV0gPSByZGVzY1sxNl0gPSAweGZmOworCQlyZGVzY1sxMl0gPSByZGVzY1sxN10gPSAweDAzOworCX0KK30KKwogc3RhdGljIHN0cnVjdCBoaWRfZGV2aWNlICp1c2JfaGlkX2NvbmZpZ3VyZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKQEAgLTE2NzMsNiArMTcwMCw5IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAorCWlmICgocXVpcmtzICYgSElEX1FVSVJLX0NZTU9USU9OKSkKKwkJaGlkX2ZpeHVwX2N5bW90aW9uX2Rlc2NyaXB0b3IocmRlc2MsIHJzaXplKTsKKwogI2lmZGVmIERFQlVHX0RBVEEKIAlwcmludGsoS0VSTl9ERUJVRyBfX0ZJTEVfXyAiOiByZXBvcnQgZGVzY3JpcHRvciAoc2l6ZSAldSwgcmVhZCAlZCkgPSAiLCByc2l6ZSwgbik7CiAJZm9yIChuID0gMDsgbiA8IHJzaXplOyBuKyspCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtZGVidWcuaCBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1kZWJ1Zy5oCmluZGV4IGNlZWJhYjkuLjcwMmM0OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1kZWJ1Zy5oCkBAIC02ODEsNiArNjgxLDIxIEBACiAJW0tFWV9TRU5EXSA9ICJTZW5kIiwJCQlbS0VZX1JFUExZXSA9ICJSZXBseSIsCiAJW0tFWV9GT1JXQVJETUFJTF0gPSAiRm9yd2FyZE1haWwiLAlbS0VZX1NBVkVdID0gIlNhdmUiLAogCVtLRVlfRE9DVU1FTlRTXSA9ICJEb2N1bWVudHMiLAorCVtLRVlfRk5dID0gIkZuIiwJCQlbS0VZX0ZOX0VTQ10gPSAiRm4rRVNDIiwKKwlbS0VZX0ZOXzFdID0gIkZuKzEiLAkJCVtLRVlfRk5fMl0gPSAiRm4rMiIsCisJW0tFWV9GTl9CXSA9ICJGbitCIiwJCQlbS0VZX0ZOX0RdID0gIkZuK0QiLAorCVtLRVlfRk5fRV0gPSAiRm4rRSIsCQkJW0tFWV9GTl9GXSA9ICJGbitGIiwKKwlbS0VZX0ZOX1NdID0gIkZuK1MiLAorCVtLRVlfRk5fRjFdID0gIkZuK0YxIiwJCQlbS0VZX0ZOX0YyXSA9ICJGbitGMiIsCisJW0tFWV9GTl9GM10gPSAiRm4rRjMiLAkJCVtLRVlfRk5fRjRdID0gIkZuK0Y0IiwKKwlbS0VZX0ZOX0Y1XSA9ICJGbitGNSIsCQkJW0tFWV9GTl9GNl0gPSAiRm4rRjYiLAorCVtLRVlfRk5fRjddID0gIkZuK0Y3IiwJCQlbS0VZX0ZOX0Y4XSA9ICJGbitGOCIsCisJW0tFWV9GTl9GOV0gPSAiRm4rRjkiLAkJCVtLRVlfRk5fRjEwXSA9ICJGbitGMTAiLAorCVtLRVlfRk5fRjExXSA9ICJGbitGMTEiLAkJW0tFWV9GTl9GMTJdID0gIkZuK0YxMiIsCisJW0tFWV9LQkRJTExVTVRPR0dMRV0gPSAiS2JkSWxsdW1pbmF0aW9uVG9nZ2xlIiwKKwlbS0VZX0tCRElMTFVNRE9XTl0gPSAiS2JkSWxsdW1pbmF0aW9uRG93biIsCisJW0tFWV9LQkRJTExVTVVQXSA9ICJLYmRJbGx1bWluYXRpb25VcCIsCisJW0tFWV9TV0lUQ0hWSURFT01PREVdID0gIlN3aXRjaFZpZGVvTW9kZSIsCiB9OwogCiBzdGF0aWMgY2hhciAqcmVsYXRpdmVzW1JFTF9NQVggKyAxXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1pbnB1dC5jIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWlucHV0LmMKaW5kZXggMTkyYTAzYi4uY2IwZDgwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLWlucHV0LmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWlucHV0LmMKQEAgLTczLDYgKzczLDE2MCBAQAogI2RlZmluZSBtYXBfa2V5X2NsZWFyKGMpCWRvIHsgbWFwX2tleShjKTsgY2xlYXJfYml0KGMsIGJpdCk7IH0gd2hpbGUgKDApCiAjZGVmaW5lIG1hcF9mZl9lZmZlY3QoYykJZG8geyBzZXRfYml0KGMsIGlucHV0LT5mZmJpdCk7IH0gd2hpbGUgKDApCiAKKyNpZmRlZiBDT05GSUdfVVNCX0hJRElOUFVUX1BPV0VSQk9PSworCitzdHJ1Y3QgaGlkaW5wdXRfa2V5X3RyYW5zbGF0aW9uIHsKKwl1MTYgZnJvbTsKKwl1MTYgdG87CisJdTggZmxhZ3M7Cit9OworCisjZGVmaW5lIFBPV0VSQk9PS19GTEFHX0ZLRVkgMHgwMQorCitzdGF0aWMgc3RydWN0IGhpZGlucHV0X2tleV90cmFuc2xhdGlvbiBwb3dlcmJvb2tfZm5fa2V5c1tdID0geworCXsgS0VZX0JBQ0tTUEFDRSwgS0VZX0RFTEVURSB9LAorCXsgS0VZX0YxLAlLRVlfQlJJR0hUTkVTU0RPV04sCVBPV0VSQk9PS19GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GMiwJS0VZX0JSSUdIVE5FU1NVUCwJUE9XRVJCT09LX0ZMQUdfRktFWSB9LAorCXsgS0VZX0YzLAlLRVlfTVVURSwJCVBPV0VSQk9PS19GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GNCwJS0VZX1ZPTFVNRURPV04sCQlQT1dFUkJPT0tfRkxBR19GS0VZIH0sCisJeyBLRVlfRjUsCUtFWV9WT0xVTUVVUCwJCVBPV0VSQk9PS19GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GNiwJS0VZX05VTUxPQ0ssCQlQT1dFUkJPT0tfRkxBR19GS0VZIH0sCisJeyBLRVlfRjcsCUtFWV9TV0lUQ0hWSURFT01PREUsCVBPV0VSQk9PS19GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GOCwJS0VZX0tCRElMTFVNVE9HR0xFLAlQT1dFUkJPT0tfRkxBR19GS0VZIH0sCisJeyBLRVlfRjksCUtFWV9LQkRJTExVTURPV04sCVBPV0VSQk9PS19GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GMTAsCUtFWV9LQkRJTExVTVVQLAkJUE9XRVJCT09LX0ZMQUdfRktFWSB9LAorCXsgS0VZX1VQLAlLRVlfUEFHRVVQIH0sCisJeyBLRVlfRE9XTiwJS0VZX1BBR0VET1dOIH0sCisJeyBLRVlfTEVGVCwJS0VZX0hPTUUgfSwKKwl7IEtFWV9SSUdIVCwJS0VZX0VORCB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBoaWRpbnB1dF9rZXlfdHJhbnNsYXRpb24gcG93ZXJib29rX251bWxvY2tfa2V5c1tdID0geworCXsgS0VZX0osCUtFWV9LUDEgfSwKKwl7IEtFWV9LLAlLRVlfS1AyIH0sCisJeyBLRVlfTCwJS0VZX0tQMyB9LAorCXsgS0VZX1UsCUtFWV9LUDQgfSwKKwl7IEtFWV9JLAlLRVlfS1A1IH0sCisJeyBLRVlfTywJS0VZX0tQNiB9LAorCXsgS0VZXzcsCUtFWV9LUDcgfSwKKwl7IEtFWV84LAlLRVlfS1A4IH0sCisJeyBLRVlfOSwJS0VZX0tQOSB9LAorCXsgS0VZX00sCUtFWV9LUDAgfSwKKwl7IEtFWV9ET1QsCUtFWV9LUERPVCB9LAorCXsgS0VZX1NMQVNILAlLRVlfS1BQTFVTIH0sCisJeyBLRVlfU0VNSUNPTE9OLCBLRVlfS1BNSU5VUyB9LAorCXsgS0VZX1AsCUtFWV9LUEFTVEVSSVNLIH0sCisJeyBLRVlfTUlOVVMsCUtFWV9LUEVRVUFMIH0sCisJeyBLRVlfMCwJS0VZX0tQU0xBU0ggfSwKKwl7IEtFWV9GNiwJS0VZX05VTUxPQ0sgfSwKKwl7IEtFWV9LUEVOVEVSLAlLRVlfS1BFTlRFUiB9LAorCXsgS0VZX0JBQ0tTUEFDRSwgS0VZX0JBQ0tTUEFDRSB9LAorCXsgfQorfTsKKworc3RhdGljIGludCB1c2JoaWRfcGJfZm5tb2RlID0gMTsKK21vZHVsZV9wYXJhbV9uYW1lZChwYl9mbm1vZGUsIHVzYmhpZF9wYl9mbm1vZGUsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBiX2ZubW9kZSwKKwkiTW9kZSBvZiBmbiBrZXkgb24gUG93ZXJCb29rcyAoMCA9IGRpc2FibGVkLCAxID0gZmtleXNsYXN0LCAyID0gZmtleXNmaXJzdCkiKTsKKworc3RhdGljIHN0cnVjdCBoaWRpbnB1dF9rZXlfdHJhbnNsYXRpb24gKmZpbmRfdHJhbnNsYXRpb24oc3RydWN0IGhpZGlucHV0X2tleV90cmFuc2xhdGlvbiAqdGFibGUsIHUxNiBmcm9tKQoreworCXN0cnVjdCBoaWRpbnB1dF9rZXlfdHJhbnNsYXRpb24gKnRyYW5zOworCisJLyogTG9vayBmb3IgdGhlIHRyYW5zbGF0aW9uICovCisJZm9yICh0cmFucyA9IHRhYmxlOyB0cmFucy0+ZnJvbTsgdHJhbnMrKykKKwkJaWYgKHRyYW5zLT5mcm9tID09IGZyb20pCisJCQlyZXR1cm4gdHJhbnM7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBoaWRpbnB1dF9wYl9ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCwKKwkJCSAgICAgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIF9fczMyIHZhbHVlKQoreworCXN0cnVjdCBoaWRpbnB1dF9rZXlfdHJhbnNsYXRpb24gKnRyYW5zOworCisJaWYgKHVzYWdlLT5jb2RlID09IEtFWV9GTikgeworCQlpZiAodmFsdWUpIGhpZC0+cXVpcmtzIHw9ICBISURfUVVJUktfUE9XRVJCT09LX0ZOX09OOworCQllbHNlICAgICAgIGhpZC0+cXVpcmtzICY9IH5ISURfUVVJUktfUE9XRVJCT09LX0ZOX09OOworCisJCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgdXNhZ2UtPmNvZGUsIHZhbHVlKTsKKworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAodXNiaGlkX3BiX2ZubW9kZSkgeworCQlpbnQgZG9fdHJhbnNsYXRlOworCisJCXRyYW5zID0gZmluZF90cmFuc2xhdGlvbihwb3dlcmJvb2tfZm5fa2V5cywgdXNhZ2UtPmNvZGUpOworCQlpZiAodHJhbnMpIHsKKwkJCWlmICh0ZXN0X2JpdCh1c2FnZS0+Y29kZSwgaGlkLT5wYl9wcmVzc2VkX2ZuKSkKKwkJCQlkb190cmFuc2xhdGUgPSAxOworCQkJZWxzZSBpZiAodHJhbnMtPmZsYWdzICYgUE9XRVJCT09LX0ZMQUdfRktFWSkKKwkJCQlkb190cmFuc2xhdGUgPQorCQkJCQkodXNiaGlkX3BiX2ZubW9kZSA9PSAyICYmICAoaGlkLT5xdWlya3MgJiBISURfUVVJUktfUE9XRVJCT09LX0ZOX09OKSkgfHwKKwkJCQkJKHVzYmhpZF9wYl9mbm1vZGUgPT0gMSAmJiAhKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX1BPV0VSQk9PS19GTl9PTikpOworCQkJZWxzZQorCQkJCWRvX3RyYW5zbGF0ZSA9IChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19QT1dFUkJPT0tfRk5fT04pOworCisJCQlpZiAoZG9fdHJhbnNsYXRlKSB7CisJCQkJaWYgKHZhbHVlKQorCQkJCQlzZXRfYml0KHVzYWdlLT5jb2RlLCBoaWQtPnBiX3ByZXNzZWRfZm4pOworCQkJCWVsc2UKKwkJCQkJY2xlYXJfYml0KHVzYWdlLT5jb2RlLCBoaWQtPnBiX3ByZXNzZWRfZm4pOworCisJCQkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB0cmFucy0+dG8sIHZhbHVlKTsKKworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisKKwkJaWYgKHRlc3RfYml0KHVzYWdlLT5jb2RlLCBoaWQtPnBiX3ByZXNzZWRfbnVtbG9jaykgfHwKKwkJICAgIHRlc3RfYml0KExFRF9OVU1MLCBpbnB1dC0+bGVkKSkgeworCQkJdHJhbnMgPSBmaW5kX3RyYW5zbGF0aW9uKHBvd2VyYm9va19udW1sb2NrX2tleXMsIHVzYWdlLT5jb2RlKTsKKworCQkJaWYgKHRyYW5zKSB7CisJCQkJaWYgKHZhbHVlKQorCQkJCQlzZXRfYml0KHVzYWdlLT5jb2RlLCBoaWQtPnBiX3ByZXNzZWRfbnVtbG9jayk7CisJCQkJZWxzZQorCQkJCQljbGVhcl9iaXQodXNhZ2UtPmNvZGUsIGhpZC0+cGJfcHJlc3NlZF9udW1sb2NrKTsKKworCQkJCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgdHJhbnMtPnRvLCB2YWx1ZSk7CisJCQl9CisKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhpZGlucHV0X3BiX3NldHVwKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0KQoreworCXN0cnVjdCBoaWRpbnB1dF9rZXlfdHJhbnNsYXRpb24gKnRyYW5zOworCisJc2V0X2JpdChLRVlfTlVNTE9DSywgaW5wdXQtPmtleWJpdCk7CisKKwkvKiBFbmFibGUgYWxsIG5lZWRlZCBrZXlzICovCisJZm9yICh0cmFucyA9IHBvd2VyYm9va19mbl9rZXlzOyB0cmFucy0+ZnJvbTsgdHJhbnMrKykKKwkJc2V0X2JpdCh0cmFucy0+dG8sIGlucHV0LT5rZXliaXQpOworCisJZm9yICh0cmFucyA9IHBvd2VyYm9va19udW1sb2NrX2tleXM7IHRyYW5zLT5mcm9tOyB0cmFucysrKQorCQlzZXRfYml0KHRyYW5zLT50bywgaW5wdXQtPmtleWJpdCk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgaGlkaW5wdXRfcGJfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGlucHV0X2RldiAqaW5wdXQsCisJCQkJICAgIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhpZGlucHV0X3BiX3NldHVwKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0KQoreworfQorI2VuZGlmCisKIHN0YXRpYyB2b2lkIGhpZGlucHV0X2NvbmZpZ3VyZV91c2FnZShzdHJ1Y3QgaGlkX2lucHV0ICpoaWRpbnB1dCwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsCiAJCQkJICAgICBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSkKIHsKQEAgLTEzNSw4ICsyODksMTEgQEAKIAkJY2FzZSBISURfVVBfU0lNVUxBVElPTjoKIAogCQkJc3dpdGNoICh1c2FnZS0+aGlkICYgMHhmZmZmKSB7Ci0JCQkJY2FzZSAweGJhOiBtYXBfYWJzKEFCU19SVURERVIpOyBicmVhazsKKwkJCQljYXNlIDB4YmE6IG1hcF9hYnMoQUJTX1JVRERFUik7ICAgYnJlYWs7CiAJCQkJY2FzZSAweGJiOiBtYXBfYWJzKEFCU19USFJPVFRMRSk7IGJyZWFrOworCQkJCWNhc2UgMHhjNDogbWFwX2FicyhBQlNfR0FTKTsgICAgICBicmVhazsKKwkJCQljYXNlIDB4YzU6IG1hcF9hYnMoQUJTX0JSQUtFKTsgICAgYnJlYWs7CisJCQkJY2FzZSAweGM4OiBtYXBfYWJzKEFCU19XSEVFTCk7ICAgIGJyZWFrOwogCQkJCWRlZmF1bHQ6ICAgZ290byBpZ25vcmU7CiAJCQl9CiAJCQlicmVhazsKQEAgLTI4OSwxMSArNDQ2LDE5IEBACiAJCQkJY2FzZSAweDIyNjogbWFwX2tleV9jbGVhcihLRVlfU1RPUCk7CQlicmVhazsKIAkJCQljYXNlIDB4MjI3OiBtYXBfa2V5X2NsZWFyKEtFWV9SRUZSRVNIKTsJCWJyZWFrOwogCQkJCWNhc2UgMHgyMmE6IG1hcF9rZXlfY2xlYXIoS0VZX0JPT0tNQVJLUyk7CWJyZWFrOworCQkJCWNhc2UgMHgyMzM6IG1hcF9rZXlfY2xlYXIoS0VZX1NDUk9MTFVQKTsJYnJlYWs7CisJCQkJY2FzZSAweDIzNDogbWFwX2tleV9jbGVhcihLRVlfU0NST0xMRE9XTik7CWJyZWFrOwogCQkJCWNhc2UgMHgyMzg6IG1hcF9yZWwoUkVMX0hXSEVFTCk7CQlicmVhazsKIAkJCQljYXNlIDB4Mjc5OiBtYXBfa2V5X2NsZWFyKEtFWV9SRURPKTsJCWJyZWFrOwogCQkJCWNhc2UgMHgyODk6IG1hcF9rZXlfY2xlYXIoS0VZX1JFUExZKTsJCWJyZWFrOwogCQkJCWNhc2UgMHgyOGI6IG1hcF9rZXlfY2xlYXIoS0VZX0ZPUldBUkRNQUlMKTsJYnJlYWs7CiAJCQkJY2FzZSAweDI4YzogbWFwX2tleV9jbGVhcihLRVlfU0VORCk7CQlicmVhazsKKworCQkJCS8qIFJlcG9ydGVkIG9uIGEgQ2hlcnJ5IEN5bW90aW9uIGtleWJvYXJkICovCisJCQkJY2FzZSAweDMwMTogbWFwX2tleV9jbGVhcihLRVlfUFJPRzEpOwkJYnJlYWs7CisJCQkJY2FzZSAweDMwMjogbWFwX2tleV9jbGVhcihLRVlfUFJPRzIpOwkJYnJlYWs7CisJCQkJY2FzZSAweDMwMzogbWFwX2tleV9jbGVhcihLRVlfUFJPRzMpOwkJYnJlYWs7CisKIAkJCQlkZWZhdWx0OiAgICBnb3RvIGlnbm9yZTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMzI1LDcgKzQ5MCwxMiBAQAogCiAJCQlzZXRfYml0KEVWX1JFUCwgaW5wdXQtPmV2Yml0KTsKIAkJCXN3aXRjaCh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7Ci0JCQkJY2FzZSAweDAwMzogbWFwX2tleV9jbGVhcihLRVlfRk4pOwkJYnJlYWs7CisJCQkJY2FzZSAweDAwMzoKKwkJCQkJLyogVGhlIGZuIGtleSBvbiBBcHBsZSBQb3dlckJvb2tzICovCisJCQkJCW1hcF9rZXlfY2xlYXIoS0VZX0ZOKTsKKwkJCQkJaGlkaW5wdXRfcGJfc2V0dXAoaW5wdXQpOworCQkJCQlicmVhazsKKwogCQkJCWRlZmF1bHQ6ICAgIGdvdG8gaWdub3JlOwogCQkJfQogCQkJYnJlYWs7CkBAIC00ODIsNiArNjUyLDkgQEAKIAkJcmV0dXJuOwogCX0KIAorCWlmICgoaGlkLT5xdWlya3MgJiBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTikgJiYgaGlkaW5wdXRfcGJfZXZlbnQoaGlkLCBpbnB1dCwgdXNhZ2UsIHZhbHVlKSkKKwkJcmV0dXJuOworCiAJaWYgKHVzYWdlLT5oYXRfbWluIDwgdXNhZ2UtPmhhdF9tYXggfHwgdXNhZ2UtPmhhdF9kaXIpIHsKIAkJaW50IGhhdF9kaXIgPSB1c2FnZS0+aGF0X2RpcjsKIAkJaWYgKCFoYXRfZGlyKQpAQCAtNTI0LDcgKzY5Nyw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZigodXNhZ2UtPnR5cGUgPT0gRVZfS0VZKSAmJiAodXNhZ2UtPmNvZGUgPT0gMCkpIC8qIEtleSAwIGlzICJ1bmFzc2lnbmVkIiwgbm90IEtFWV9VTktOT1dOICovCisJaWYgKCh1c2FnZS0+dHlwZSA9PSBFVl9LRVkpICYmICh1c2FnZS0+Y29kZSA9PSAwKSkgLyogS2V5IDAgaXMgInVuYXNzaWduZWQiLCBub3QgS0VZX1VOS05PV04gKi8KIAkJcmV0dXJuOwogCiAJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB1c2FnZS0+Y29kZSwgdmFsdWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLmggYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQuaAppbmRleCBlZTQ4YTIyLi44YjBkNDM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQuaAorKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQuaApAQCAtMjM1LDE3ICsyMzUsMjAgQEAKICAqIEhJRCBkZXZpY2UgcXVpcmtzLgogICovCiAKLSNkZWZpbmUgSElEX1FVSVJLX0lOVkVSVAkJCTB4MDAxCi0jZGVmaW5lIEhJRF9RVUlSS19OT1RPVUNICQkJMHgwMDIKLSNkZWZpbmUgSElEX1FVSVJLX0lHTk9SRQkJCTB4MDA0Ci0jZGVmaW5lIEhJRF9RVUlSS19OT0dFVAkJCQkweDAwOAotI2RlZmluZSBISURfUVVJUktfSElEREVWCQkJMHgwMTAKLSNkZWZpbmUgSElEX1FVSVJLX0JBRFBBRAkJCTB4MDIwCi0jZGVmaW5lIEhJRF9RVUlSS19NVUxUSV9JTlBVVAkJCTB4MDQwCi0jZGVmaW5lIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS183CQkweDA4MAotI2RlZmluZSBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNQkJMHgxMDAKLSNkZWZpbmUgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLX09OCQkweDIwMAotI2RlZmluZSBISURfUVVJUktfMldIRUVMX1BPV0VSTU9VU0UJCTB4NDAwCisjZGVmaW5lIEhJRF9RVUlSS19JTlZFUlQJCQkweDAwMDAwMDAxCisjZGVmaW5lIEhJRF9RVUlSS19OT1RPVUNICQkJMHgwMDAwMDAwMgorI2RlZmluZSBISURfUVVJUktfSUdOT1JFCQkJMHgwMDAwMDAwNAorI2RlZmluZSBISURfUVVJUktfTk9HRVQJCQkJMHgwMDAwMDAwOAorI2RlZmluZSBISURfUVVJUktfSElEREVWCQkJMHgwMDAwMDAxMAorI2RlZmluZSBISURfUVVJUktfQkFEUEFECQkJMHgwMDAwMDAyMAorI2RlZmluZSBISURfUVVJUktfTVVMVElfSU5QVVQJCQkweDAwMDAwMDQwCisjZGVmaW5lIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS183CQkweDAwMDAwMDgwCisjZGVmaW5lIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS181CQkweDAwMDAwMTAwCisjZGVmaW5lIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS19PTgkJMHgwMDAwMDIwMAorI2RlZmluZSBISURfUVVJUktfMldIRUVMX1BPV0VSTU9VU0UJCTB4MDAwMDA0MDAKKyNkZWZpbmUgSElEX1FVSVJLX0NZTU9USU9OCQkJMHgwMDAwMDgwMAorI2RlZmluZSBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTgkJMHgwMDAwMTAwMAorI2RlZmluZSBISURfUVVJUktfUE9XRVJCT09LX0ZOX09OCQkweDAwMDAyMDAwCiAKIC8qCiAgKiBUaGlzIGlzIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQgb2YgdGhlIHBhcnNlci4gVGhpcyBpbmZvcm1hdGlvbiBpcwpAQCAtNDMxLDYgKzQzNCwxMSBAQAogCXZvaWQgKCpmZl9leGl0KShzdHJ1Y3QgaGlkX2RldmljZSopOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYWxsZWQgYnkgaGlkX2V4aXRfZmYoaGlkKSAqLwogCWludCAoKmZmX2V2ZW50KShzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCwKIAkJCXVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKTsKKworI2lmZGVmIENPTkZJR19VU0JfSElESU5QVVRfUE9XRVJCT09LCisJdW5zaWduZWQgbG9uZyBwYl9wcmVzc2VkX2ZuW05CSVRTKEtFWV9NQVgpXTsKKwl1bnNpZ25lZCBsb25nIHBiX3ByZXNzZWRfbnVtbG9ja1tOQklUUyhLRVlfTUFYKV07CisjZW5kaWYKIH07CiAKICNkZWZpbmUgSElEX0dMT0JBTF9TVEFDS19TSVpFIDQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3BpZC5jIGIvZHJpdmVycy91c2IvaW5wdXQvcGlkLmMKaW5kZXggMTllMDE1ZC4uZDlkOWY2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvcGlkLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvcGlkLmMKQEAgLTI1OSw3ICsyNTksNyBAQAogaW50IGhpZF9waWRfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQogewogCXN0cnVjdCBoaWRfZmZfcGlkICpwcml2YXRlOwotCXN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0ID0gbGlzdF9lbnRyeSgmaGlkLT5pbnB1dHMsIHN0cnVjdCBoaWRfaW5wdXQsIGxpc3QpOworCXN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0ID0gbGlzdF9lbnRyeShoaWQtPmlucHV0cy5uZXh0LCBzdHJ1Y3QgaGlkX2lucHV0LCBsaXN0KTsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYgPSBoaWRpbnB1dC0+aW5wdXQ7CiAKIAlwcml2YXRlID0gaGlkLT5mZl9wcml2YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhpZF9mZl9waWQpLCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbS5jCmluZGV4IDQ4ZGY0Y2YuLmQzZTE1ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvd2Fjb20uYwpAQCAtOTUsNyArOTUsNyBAQAogZW51bSB7CiAJUEVOUEFSVE5FUiA9IDAsCiAJR1JBUEhJUkUsCi0JRzQsCisJV0FDT01fRzQsCiAJUEwsCiAJSU5UVU9TLAogCUlOVFVPUzMsCkBAIC0zNzMsNyArMzczLDcgQEAKIAogCQkJY2FzZSAyOiAvKiBNb3VzZSB3aXRoIHdoZWVsICovCiAJCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9NSURETEUsIGRhdGFbMV0gJiAweDA0KTsKLQkJCQlpZiAod2Fjb20tPmZlYXR1cmVzLT50eXBlID09IEc0KSB7CisJCQkJaWYgKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA9PSBXQUNPTV9HNCkgewogCQkJCQlydyA9IGRhdGFbN10gJiAweDA0ID8gLShkYXRhWzddICYgMHgwMykgOiAoZGF0YVs3XSAmIDB4MDMpOwogCQkJCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1dIRUVMLCBydyk7CiAJCQkJfSBlbHNlCkBAIC0zODUsNyArMzg1LDcgQEAKIAkJCQlpZCA9IENVUlNPUl9ERVZJQ0VfSUQ7CiAJCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9MRUZULCBkYXRhWzFdICYgMHgwMSk7CiAJCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9SSUdIVCwgZGF0YVsxXSAmIDB4MDIpOwotCQkJCWlmICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPT0gRzQpCisJCQkJaWYgKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA9PSBXQUNPTV9HNCkKIAkJCQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ESVNUQU5DRSwgZGF0YVs2XSk7CiAJCQkJZWxzZQogCQkJCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX0RJU1RBTkNFLCBkYXRhWzddKTsKQEAgLTQxMCw3ICs0MTAsNyBAQAogCWlucHV0X3N5bmMoZGV2KTsKIAogCS8qIHNlbmQgcGFkIGRhdGEgKi8KLQlpZiAod2Fjb20tPmZlYXR1cmVzLT50eXBlID09IEc0KSB7CisJaWYgKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA9PSBXQUNPTV9HNCkgewogCQkvKiBmaXN0IHRpbWUgc2VuZGluZyBwYWQgZGF0YSAqLwogCQlpZiAod2Fjb20tPnRvb2xbMV0gIT0gQlROX1RPT0xfRklOR0VSKSB7CiAJCQl3YWNvbS0+aWRbMV0gPSAwOwpAQCAtNzEzLDggKzcxMyw4IEBACiAJeyAiV2Fjb20gR3JhcGhpcmUyIDV4NyIsIDgsICAxMzkxOCwgMTAyMDYsICA1MTEsIDMyLCBHUkFQSElSRSwgICB3YWNvbV9ncmFwaGlyZV9pcnEgfSwKIAl7ICJXYWNvbSBHcmFwaGlyZTMiLCAgICAgOCwgIDEwMjA4LCAgNzQyNCwgIDUxMSwgMzIsIEdSQVBISVJFLCAgIHdhY29tX2dyYXBoaXJlX2lycSB9LAogCXsgIldhY29tIEdyYXBoaXJlMyA2eDgiLCA4LCAgMTY3MDQsIDEyMDY0LCAgNTExLCAzMiwgR1JBUEhJUkUsICAgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCi0JeyAiV2Fjb20gR3JhcGhpcmU0IDR4NSIsIDgsICAxMDIwOCwgIDc0MjQsICA1MTEsIDMyLCBHNCwJIHdhY29tX2dyYXBoaXJlX2lycSB9LAotCXsgIldhY29tIEdyYXBoaXJlNCA2eDgiLCA4LCAgMTY3MDQsIDEyMDY0LCAgNTExLCAzMiwgRzQsCSB3YWNvbV9ncmFwaGlyZV9pcnEgfSwKKwl7ICJXYWNvbSBHcmFwaGlyZTQgNHg1IiwgOCwgIDEwMjA4LCAgNzQyNCwgIDUxMSwgMzIsIFdBQ09NX0c0LAkgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCisJeyAiV2Fjb20gR3JhcGhpcmU0IDZ4OCIsIDgsICAxNjcwNCwgMTIwNjQsICA1MTEsIDMyLCBXQUNPTV9HNCwJIHdhY29tX2dyYXBoaXJlX2lycSB9LAogCXsgIldhY29tIFZvbGl0byIsICAgICAgICA4LCAgIDUxMDQsICAzNzEyLCAgNTExLCAzMiwgR1JBUEhJUkUsICAgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCiAJeyAiV2Fjb20gUGVuU3RhdGlvbjIiLCAgIDgsICAgMzI1MCwgIDIzMjAsICAyNTUsIDMyLCBHUkFQSElSRSwgICB3YWNvbV9ncmFwaGlyZV9pcnEgfSwKIAl7ICJXYWNvbSBWb2xpdG8yIDR4NSIsICAgOCwgICA1MTA0LCAgMzcxMiwgIDUxMSwgMzIsIEdSQVBISVJFLCAgIHdhY29tX2dyYXBoaXJlX2lycSB9LApAQCAtODU5LDcgKzg1OSw3IEBACiAJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfUFJFU1NVUkUsIDAsIHdhY29tLT5mZWF0dXJlcy0+cHJlc3N1cmVfbWF4LCAwLCAwKTsKIAogCXN3aXRjaCAod2Fjb20tPmZlYXR1cmVzLT50eXBlKSB7Ci0JCWNhc2UgRzQ6CisJCWNhc2UgV0FDT01fRzQ6CiAJCQlpbnB1dF9kZXYtPmV2Yml0WzBdIHw9IEJJVChFVl9NU0MpOwogCQkJaW5wdXRfZGV2LT5tc2NiaXRbMF0gfD0gQklUKE1TQ19TRVJJQUwpOwogCQkJaW5wdXRfZGV2LT5rZXliaXRbTE9ORyhCVE5fRElHSSldIHw9IEJJVChCVE5fVE9PTF9GSU5HRVIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvZHNicjEwMC5jIGIvZHJpdmVycy91c2IvbWVkaWEvZHNicjEwMC5jCmluZGV4IDZhNTcwMGUuLjI1NjQ2ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21lZGlhL2RzYnIxMDAuYworKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9kc2JyMTAwLmMKQEAgLTEyNyw2ICsxMjcsNyBAQAogCS5vcGVuID0JCXVzYl9kc2JyMTAwX29wZW4sCiAJLnJlbGVhc2UgPSAgICAgCXVzYl9kc2JyMTAwX2Nsb3NlLAogCS5pb2N0bCA9ICAgICAgICB1c2JfZHNicjEwMF9pb2N0bCwKKwkuY29tcGF0X2lvY3RsID0gdjRsX2NvbXBhdF9pb2N0bDMyLAogCS5sbHNlZWsgPSAgICAgICBub19sbHNlZWssCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9vdjUxMS5jIGIvZHJpdmVycy91c2IvbWVkaWEvb3Y1MTEuYwppbmRleCAzYTBlOGNlLi44YWY2NjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tZWRpYS9vdjUxMS5jCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL292NTExLmMKQEAgLTQ3NzQsNiArNDc3NCw3IEBACiAJLnJlYWQgPQkJb3Y1MXhfdjRsMV9yZWFkLAogCS5tbWFwID0JCW92NTF4X3Y0bDFfbW1hcCwKIAkuaW9jdGwgPQlvdjUxeF92NGwxX2lvY3RsLAorCS5jb21wYXRfaW9jdGwgPSB2NGxfY29tcGF0X2lvY3RsMzIsCiAJLmxsc2VlayA9CW5vX2xsc2VlaywKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtaWYuYyBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtaWYuYwppbmRleCAwOWNhNjEyLi40ZjliMGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLWlmLmMKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1pZi5jCkBAIC0xNTQsNiArMTU0LDcgQEAKIAkucG9sbCA9CQlwd2NfdmlkZW9fcG9sbCwKIAkubW1hcCA9CQlwd2NfdmlkZW9fbW1hcCwKIAkuaW9jdGwgPSAgICAgICAgcHdjX3ZpZGVvX2lvY3RsLAorCS5jb21wYXRfaW9jdGwgPSB2NGxfY29tcGF0X2lvY3RsMzIsCiAJLmxsc2VlayA9ICAgICAgIG5vX2xsc2VlaywKIH07CiBzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBwd2NfdGVtcGxhdGUgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9zZTQwMS5jIGIvZHJpdmVycy91c2IvbWVkaWEvc2U0MDEuYwppbmRleCBiMmFlMjlhLi4yYmE1NjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tZWRpYS9zZTQwMS5jCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3NlNDAxLmMKQEAgLTExOTMsNiArMTE5Myw3IEBACiAgICAgICAgIC5yZWFkID0gICAgICAgICBzZTQwMV9yZWFkLAogICAgICAgICAubW1hcCA9ICAgICAgICAgc2U0MDFfbW1hcCwKIAkuaW9jdGwgPSAgICAgICAgc2U0MDFfaW9jdGwsCisJLmNvbXBhdF9pb2N0bCA9IHY0bF9jb21wYXRfaW9jdGwzMiwKIAkubGxzZWVrID0gICAgICAgbm9fbGxzZWVrLAogfTsKIHN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHNlNDAxX3RlbXBsYXRlID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvc3R2NjgwLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9zdHY2ODAuYwppbmRleCA3NzQwMzhiLi5iNDk3YTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tZWRpYS9zdHY2ODAuYworKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9zdHY2ODAuYwpAQCAtMTM0Myw2ICsxMzQzLDcgQEAKIAkucmVhZCA9CQlzdHY2ODBfcmVhZCwKIAkubW1hcCA9CQlzdHY2ODBfbW1hcCwKIAkuaW9jdGwgPSAgICAgICAgc3R2NjgwX2lvY3RsLAorCS5jb21wYXRfaW9jdGwgPSB2NGxfY29tcGF0X2lvY3RsMzIsCiAJLmxsc2VlayA9ICAgICAgIG5vX2xsc2VlaywKIH07CiBzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBzdHY2ODBfdGVtcGxhdGUgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS91c2J2aWRlby5jIGIvZHJpdmVycy91c2IvbWVkaWEvdXNidmlkZW8uYwppbmRleCA0YmQxMTMzLi42M2E3MmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tZWRpYS91c2J2aWRlby5jCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3VzYnZpZGVvLmMKQEAgLTk1Myw2ICs5NTMsNyBAQAogCS5yZWFkID0gICB1c2J2aWRlb192NGxfcmVhZCwKIAkubW1hcCA9ICAgdXNidmlkZW9fdjRsX21tYXAsCiAJLmlvY3RsID0gIHVzYnZpZGVvX3Y0bF9pb2N0bCwKKwkuY29tcGF0X2lvY3RsID0gdjRsX2NvbXBhdF9pb2N0bDMyLAogCS5sbHNlZWsgPSBub19sbHNlZWssCiB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCB2aWRlb19kZXZpY2UgdXNidmlkZW9fdGVtcGxhdGUgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS92aWNhbS5jIGIvZHJpdmVycy91c2IvbWVkaWEvdmljYW0uYwppbmRleCAxYzczMTU1Li41ZGYxNDQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tZWRpYS92aWNhbS5jCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3ZpY2FtLmMKQEAgLTEyMzYsNiArMTIzNiw3IEBACiAJLnJlYWQJCT0gdmljYW1fcmVhZCwKIAkubW1hcAkJPSB2aWNhbV9tbWFwLAogCS5pb2N0bAkJPSB2aWNhbV9pb2N0bCwKKwkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLAogCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvdzk5NjhjZi5jIGIvZHJpdmVycy91c2IvbWVkaWEvdzk5NjhjZi5jCmluZGV4IDM2MDVhNmYuLmJmZjk0MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21lZGlhL3c5OTY4Y2YuYworKysgYi9kcml2ZXJzL3VzYi9tZWRpYS93OTk2OGNmLmMKQEAgLTM0OTAsNiArMzQ5MCw3IEBACiAJLnJlbGVhc2UgPSB3OTk2OGNmX3JlbGVhc2UsCiAJLnJlYWQgPSAgICB3OTk2OGNmX3JlYWQsCiAJLmlvY3RsID0gICB3OTk2OGNmX2lvY3RsLAorCS5jb21wYXRfaW9jdGwgPSB2NGxfY29tcGF0X2lvY3RsMzIsCiAJLm1tYXAgPSAgICB3OTk2OGNmX21tYXAsCiAJLmxsc2VlayA9ICBub19sbHNlZWssCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL0tjb25maWcgYi9kcml2ZXJzL3VzYi9zZXJpYWwvS2NvbmZpZwppbmRleCAxNGY1NWZkLi5iZTVkYzgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvS2NvbmZpZwpAQCAtODQsNyArODQsNyBAQAogCiBjb25maWcgVVNCX1NFUklBTF9XSElURUhFQVQKIAl0cmlzdGF0ZSAiVVNCIENvbm5lY3RUZWNoIFdoaXRlSEVBVCBTZXJpYWwgRHJpdmVyIgotCWRlcGVuZHMgb24gVVNCX1NFUklBTCAmJiBCUk9LRU5fT05fU01QCisJZGVwZW5kcyBvbiBVU0JfU0VSSUFMCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBDb25uZWN0VGVjaCBXaGl0ZUhFQVQgNCBwb3J0CiAJICBVU0IgdG8gc2VyaWFsIGNvbnZlcnRlciBkZXZpY2UuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvYnVzLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYnVzLmMKaW5kZXggNjY0MTM5YS4uZTlmOWY0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2J1cy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9idXMuYwpAQCAtMzcsMTEgKzM3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IGJ1c190eXBlIHVzYl9zZXJpYWxfYnVzX3R5cGUgPSB7Ci0JLm5hbWUgPQkJInVzYi1zZXJpYWwiLAotCS5tYXRjaCA9CXVzYl9zZXJpYWxfZGV2aWNlX21hdGNoLAotfTsKLQogc3RhdGljIGludCB1c2Jfc2VyaWFsX2RldmljZV9wcm9iZSAoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCB1c2Jfc2VyaWFsX2RyaXZlciAqZHJpdmVyOwpAQCAtMTA5LDE0ICsxMDQsMTggQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCitzdHJ1Y3QgYnVzX3R5cGUgdXNiX3NlcmlhbF9idXNfdHlwZSA9IHsKKwkubmFtZSA9CQkidXNiLXNlcmlhbCIsCisJLm1hdGNoID0JdXNiX3NlcmlhbF9kZXZpY2VfbWF0Y2gsCisJLnByb2JlID0JdXNiX3NlcmlhbF9kZXZpY2VfcHJvYmUsCisJLnJlbW92ZSA9CXVzYl9zZXJpYWxfZGV2aWNlX3JlbW92ZSwKK307CisKIGludCB1c2Jfc2VyaWFsX2J1c19yZWdpc3RlcihzdHJ1Y3QgdXNiX3NlcmlhbF9kcml2ZXIgKmRyaXZlcikKIHsKIAlpbnQgcmV0dmFsOwogCiAJZHJpdmVyLT5kcml2ZXIuYnVzID0gJnVzYl9zZXJpYWxfYnVzX3R5cGU7Ci0JZHJpdmVyLT5kcml2ZXIucHJvYmUgPSB1c2Jfc2VyaWFsX2RldmljZV9wcm9iZTsKLQlkcml2ZXItPmRyaXZlci5yZW1vdmUgPSB1c2Jfc2VyaWFsX2RldmljZV9yZW1vdmU7Ci0KIAlyZXR2YWwgPSBkcml2ZXJfcmVnaXN0ZXIoJmRyaXZlci0+ZHJpdmVyKTsKIAogCXJldHVybiByZXR2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3liZXJqYWNrLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3liZXJqYWNrLmMKaW5kZXggNmQxOGQ0ZS4uMjM1N2IxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2N5YmVyamFjay5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jeWJlcmphY2suYwpAQCAtMzY0LDcgKzM2NCw2IEBACiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJc2hvcnQgdG9kbzsKLQlpbnQgaTsKIAlpbnQgcmVzdWx0OwogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CkBAIC0zODEsMTQgKzM4MCw4IEBACiAJCXJldHVybjsKIAl9CiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCkgewotCQlmb3IgKGkgPSAwOyBpIDwgdXJiLT5hY3R1YWxfbGVuZ3RoIDsgKytpKSB7Ci0JCQkvKiBpZiB3ZSBpbnNlcnQgbW9yZSB0aGFuIFRUWV9GTElQQlVGX1NJWkUgY2hhcmFjdGVycywgd2UgZHJvcCB0aGVtLiAqLwotCQkJaWYodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpIHsKLQkJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCQkJfQotCQkJLyogdGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1c2ggdGhlIGRhdGEgdGhyb3VnaCB1bmxlc3MgdHR5LT5sb3dfbGF0ZW5jeSBpcyBzZXQgKi8KLQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgZGF0YVtpXSwgMCk7Ci0JCX0KKwkJdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwgZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkgIAl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2N5cHJlc3NfbTguYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMKaW5kZXggYWYxODM1NS4uNjgwNjdmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2N5cHJlc3NfbTguYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3lwcmVzc19tOC5jCkBAIC0zNTcsNyArMzU3LDcgQEAKIAkJCX0gd2hpbGUgKHJldHZhbCAhPSA1ICYmIHJldHZhbCAhPSBFTk9ERVYpOwogCiAJCQlpZiAocmV0dmFsICE9IDUpIHsKLQkJCQllcnIoIiVzIC0gZmFpbGVkIHRvIHJldHJlaXZlIHNlcmlhbCBsaW5lIHNldHRpbmdzIC0gJWQiLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQkJZXJyKCIlcyAtIGZhaWxlZCB0byByZXRyaWV2ZSBzZXJpYWwgbGluZSBzZXR0aW5ncyAtICVkIiwgX19GVU5DVElPTl9fLCByZXR2YWwpOwogCQkJCXJldHVybiByZXR2YWw7CiAJCQl9IGVsc2UgewogCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC0xMjYzLDEyICsxMjYzLDEwIEBACiAKIAkvKiBwcm9jZXNzIHJlYWQgaWYgdGhlcmUgaXMgZGF0YSBvdGhlciB0aGFuIGxpbmUgc3RhdHVzICovCiAJaWYgKHR0eSAmJiAoYnl0ZXMgPiBpKSkgeworCQlieXRlcyA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgYnl0ZXMpOwogCQlmb3IgKDsgaSA8IGJ5dGVzIDsgKytpKSB7CiAJCQlkYmcoInB1c2hpbmcgYnl0ZSBudW1iZXIgJWQgLSAlZCAtICVjIiwgaSwgZGF0YVtpXSwKIAkJCQkJZGF0YVtpXSk7Ci0JCQlpZih0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkgewotCQkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7Ci0JCQl9CiAJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGRhdGFbaV0sIHR0eV9mbGFnKTsKIAkJfQogCQl0dHlfZmxpcF9idWZmZXJfcHVzaChwb3J0LT50dHkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2RpZ2lfYWNjZWxlcG9ydC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2RpZ2lfYWNjZWxlcG9ydC5jCmluZGV4IDhmYzQxNGIuLmIzZjc3NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9kaWdpX2FjY2VsZXBvcnQuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZGlnaV9hY2NlbGVwb3J0LmMKQEAgLTk0NiwxMyArOTQ2LDEwIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoICZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzICk7CiAKIAkvKiBzZW5kIGFueSBidWZmZXJlZCBjaGFycyBmcm9tIHRocm90dGxlIHRpbWUgb24gdG8gdHR5IHN1YnN5c3RlbSAqLwotCWxlbiA9IG1pbihwcml2LT5kcF9pbl9idWZfbGVuLCBUVFlfRkxJUEJVRl9TSVpFIC0gdHR5LT5mbGlwLmNvdW50ICk7CisKKwlsZW4gPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIHByaXYtPmRwX2luX2J1Zl9sZW4pOwogCWlmKCBsZW4gPiAwICkgewotCQltZW1jcHkoIHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIsIHByaXYtPmRwX2luX2J1ZiwgbGVuICk7Ci0JCW1lbWNweSggdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciwgcHJpdi0+ZHBfaW5fZmxhZ19idWYsIGxlbiApOwotCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyICs9IGxlbjsKLQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciArPSBsZW47Ci0JCXR0eS0+ZmxpcC5jb3VudCArPSBsZW47CisJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmdfZmxhZ3ModHR5LCBwcml2LT5kcF9pbl9idWYsIHByaXYtPmRwX2luX2ZsYWdfYnVmLCBsZW4pOwogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCggdHR5ICk7CiAJfQogCkBAIC0xODI3LDYgKzE4MjQsNyBAQAogCWludCBzdGF0dXMgPSAoKHVuc2lnbmVkIGNoYXIgKil1cmItPnRyYW5zZmVyX2J1ZmZlcilbMl07CiAJdW5zaWduZWQgY2hhciAqZGF0YSA9ICgodW5zaWduZWQgY2hhciAqKXVyYi0+dHJhbnNmZXJfYnVmZmVyKSszOwogCWludCBmbGFnLHRocm90dGxlZDsKKwlpbnQgaTsKIAogCS8qIGRvIG5vdCBwcm9jZXNzIGNhbGxiYWNrcyBvbiBjbG9zZWQgcG9ydHMgKi8KIAkvKiBidXQgZG8gY29udGludWUgdGhlIHJlYWQgY2hhaW4gKi8KQEAgLTE4ODUsMjAgKzE4ODMsMTggQEAKIAkJCX0KIAogCQl9IGVsc2UgewotCi0JCQlsZW4gPSBtaW4oIGxlbiwgVFRZX0ZMSVBCVUZfU0laRSAtIHR0eS0+ZmxpcC5jb3VudCApOwotCisJCQlsZW4gPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIGxlbik7CiAJCQlpZiggbGVuID4gMCApIHsKLQkJCQltZW1jcHkoIHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIsIGRhdGEsIGxlbiApOwotCQkJCW1lbXNldCggdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciwgZmxhZywgbGVuICk7Ci0JCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciArPSBsZW47Ci0JCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciArPSBsZW47Ci0JCQkJdHR5LT5mbGlwLmNvdW50ICs9IGxlbjsKKwkJCQkvKiBIb3QgcGF0aCAqLworCQkJCWlmKGZsYWcgPT0gVFRZX05PUk1BTCkKKwkJCQkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGRhdGEsIGxlbik7CisJCQkJZWxzZSB7CisJCQkJCWZvcihpID0gMDsgaSA8IGxlbjsgaSsrKQorCQkJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBkYXRhW2ldLCBmbGFnKTsKKwkJCQl9CiAJCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2goIHR0eSApOwogCQkJfQotCiAJCX0KLQogCX0KIAogCXNwaW5fdW5sb2NrKCAmcHJpdi0+ZHBfcG9ydF9sb2NrICk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZW1wZWcuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9lbXBlZy5jCmluZGV4IDc5YTc2NmUuLjYzZjdjNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9lbXBlZy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9lbXBlZy5jCkBAIC0zNDQsNyArMzQ0LDYgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7Ci0JaW50IGk7CiAJaW50IHJlc3VsdDsKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwpAQCAtMzU5LDE5ICszNTgsOCBAQAogCXR0eSA9IHBvcnQtPnR0eTsKIAogCWlmICh1cmItPmFjdHVhbF9sZW5ndGgpIHsKLQkJZm9yIChpID0gMDsgaSA8IHVyYi0+YWN0dWFsX2xlbmd0aCA7ICsraSkgewotCQkJLyogZ2IgLSAyMDAwLzExLzEzCi0JCQkgKiBJZiB3ZSBpbnNlcnQgdG9vIG1hbnkgY2hhcmFjdGVycyB3ZSdsbCBvdmVyZmxvdyB0aGUgYnVmZmVyLgotCQkJICogVGhpcyBtZWFucyB3ZSdsbCBsb3NlIGJ5dGVzIC0gRGVjaWRlZGx5IGJhZC4KLQkJCSAqLwotCQkJaWYodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpIHsKLQkJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCQkJCX0KLQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgZGF0YVtpXSwgMCk7Ci0JCX0KLQkJLyogZ2IgLSAyMDAwLzExLzEzCi0JCSAqIEdvZXMgc3RyYWlnaHQgdGhyb3VnaCBpbnN0ZWFkIG9mIHNjaGVkdWxpbmcgLSBpZiB0dHktPmxvd19sYXRlbmN5IGlzIHNldC4KLQkJICovCisJCXR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiAJCWJ5dGVzX2luICs9IHVyYi0+YWN0dWFsX2xlbmd0aDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCmluZGV4IGViODYzYjMuLjEwYmMxYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCkBAIC0xNjEwLDI0ICsxNjEwLDExIEBACiAJCQlsZW5ndGggPSAwOwogCQl9CiAKLQkJLyogaGF2ZSB0byBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcmZsb3cgdGhlIGJ1ZmZlcgotCQkgICB3aXRoIHR0eV9pbnNlcnRfZmxpcF9jaGFyJ3MgKi8KLQkJaWYgKHR0eS0+ZmxpcC5jb3VudCtsZW5ndGggPiBUVFlfRkxJUEJVRl9TSVpFKSB7Ci0JCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCQkJbmVlZF9mbGlwID0gMDsKLQotCQkJaWYgKHR0eS0+ZmxpcC5jb3VudCAhPSAwKSB7Ci0JCQkJLyogZmxpcCBkaWRuJ3Qgd29yaywgdGhpcyBoYXBwZW5zIHdoZW4gZnRkaV9wcm9jZXNzX3JlYWQoKSBpcwotCQkJCSAqIGNhbGxlZCBmcm9tIGZ0ZGlfdW50aHJvdHRsZSwgYmVjYXVzZSBUVFlfRE9OVF9GTElQIGlzIHNldCAqLwotCQkJCWRiZygiJXMgLSBmbGlwIGJ1ZmZlciBwdXNoIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KIAkJaWYgKHByaXYtPnJ4X2ZsYWdzICYgVEhST1RUTEVEKSB7CiAJCQlkYmcoIiVzIC0gdGhyb3R0bGVkIiwgX19GVU5DVElPTl9fKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmICh0dHktPmxkaXNjLnJlY2VpdmVfcm9vbSh0dHkpLXR0eS0+ZmxpcC5jb3VudCA8IGxlbmd0aCkgeworCQlpZiAodHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBsZW5ndGgpIDwgbGVuZ3RoKSB7CiAJCQkvKiBicmVhayBvdXQgJiB3YWl0IGZvciB0aHJvdHRsaW5nL3VudGhyb3R0bGluZyB0byBoYXBwZW4gKi8KIAkJCWRiZygiJXMgLSByZWNlaXZlIHJvb20gbG93IiwgX19GVU5DVElPTl9fKTsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2dhcm1pbl9ncHMuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9nYXJtaW5fZ3BzLmMKaW5kZXggNDUyZWZjZS4uZDZmNTVlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2dhcm1pbl9ncHMuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZ2FybWluX2dwcy5jCkBAIC0yNzUsMjMgKzI3NSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IGFjdHVhbF9sZW5ndGgpCiB7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPnR0eTsKLQlpbnQgaTsKIAogCWlmICh0dHkgJiYgYWN0dWFsX2xlbmd0aCkgewogCiAJCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgCiAJCQkJCV9fRlVOQ1RJT05fXywgYWN0dWFsX2xlbmd0aCwgZGF0YSk7CiAKLQkJZm9yIChpID0gMDsgaSA8IGFjdHVhbF9sZW5ndGggOyArK2kpIHsKLQkJCS8qIGlmIHdlIGluc2VydCBtb3JlIHRoYW4gVFRZX0ZMSVBCVUZfU0laRSBjaGFyYWN0ZXJzLAotCQkJICAgd2UgZHJvcCB0aGVtLiAqLwotCQkJaWYodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpIHsKLQkJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCQkJfQotCQkJLyogdGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1c2ggdGhlIGRhdGEgdGhyb3VnaCB1bmxlc3MKLQkJCSAgIHR0eS0+bG93X2xhdGVuY3kgaXMgc2V0ICovCi0JCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGRhdGFbaV0sIDApOwotCQl9CisJCXR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgYWN0dWFsX2xlbmd0aCk7CisJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBkYXRhLCBhY3R1YWxfbGVuZ3RoKTsKIAkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZ2VuZXJpYy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2dlbmVyaWMuYwppbmRleCA0ZGRhYzYyLi40NzZjZGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9nZW5lcmljLmMKQEAgLTI1NCw3ICsyNTQsNiBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7Ci0JaW50IGk7CiAJaW50IHJlc3VsdDsKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwpAQCAtMjY4LDE0ICsyNjcsOCBAQAogCiAJdHR5ID0gcG9ydC0+dHR5OwogCWlmICh0dHkgJiYgdXJiLT5hY3R1YWxfbGVuZ3RoKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCB1cmItPmFjdHVhbF9sZW5ndGggOyArK2kpIHsKLQkJCS8qIGlmIHdlIGluc2VydCBtb3JlIHRoYW4gVFRZX0ZMSVBCVUZfU0laRSBjaGFyYWN0ZXJzLCB3ZSBkcm9wIHRoZW0uICovCi0JCQlpZih0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkgewotCQkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7Ci0JCQl9Ci0JCQkvKiB0aGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHVzaCB0aGUgZGF0YSB0aHJvdWdoIHVubGVzcyB0dHktPmxvd19sYXRlbmN5IGlzIHNldCAqLwotCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBkYXRhW2ldLCAwKTsKLQkJfQorCQl0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBkYXRhLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCSAgCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaW9fZWRnZXBvcnQuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pb19lZGdlcG9ydC5jCmluZGV4IGZhZWRiZWIuLjNmMjllNmIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvaW9fZWRnZXBvcnQuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaW9fZWRnZXBvcnQuYwpAQCAtMTk2NSwyMCArMTk2NSwxNCBAQAogCWludCBjbnQ7CiAKIAlkbyB7Ci0JCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkgewotCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKLQkJCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkgewotCQkJCWRldl9lcnIoZGV2LCAiJXMgLSBkcm9wcGluZyBkYXRhLCAlZCBieXRlcyBsb3N0XG4iLAotCQkJCQlfX0ZVTkNUSU9OX18sIGxlbmd0aCk7Ci0JCQkJcmV0dXJuOwotCQkJfQorCQljbnQgPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIGxlbmd0aCk7CisJCWlmIChjbnQgPCBsZW5ndGgpIHsKKwkJCWRldl9lcnIoZGV2LCAiJXMgLSBkcm9wcGluZyBkYXRhLCAlZCBieXRlcyBsb3N0XG4iLAorCQkJCQlfX0ZVTkNUSU9OX18sIGxlbmd0aCAtIGNudCk7CisJCQlpZihjbnQgPT0gMCkKKwkJCQlicmVhazsKIAkJfQotCQljbnQgPSBtaW4obGVuZ3RoLCBUVFlfRkxJUEJVRl9TSVpFIC0gdHR5LT5mbGlwLmNvdW50KTsKLQkJbWVtY3B5KHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIsIGRhdGEsIGNudCk7Ci0JCW1lbXNldCh0dHktPmZsaXAuZmxhZ19idWZfcHRyLCAwLCBjbnQpOwotCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyICs9IGNudDsKLQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciArPSBjbnQ7Ci0JCXR0eS0+ZmxpcC5jb3VudCArPSBjbnQ7CisJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBkYXRhLCBjbnQpOwogCQlkYXRhICs9IGNudDsKIAkJbGVuZ3RoIC09IGNudDsKIAl9IHdoaWxlIChsZW5ndGggPiAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pb190aS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lvX3RpLmMKaW5kZXggMmVkZjljYWIuLmFmYzBmMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pb190aS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pb190aS5jCkBAIC0xODY1LDIwICsxODY1LDE0IEBACiAJaW50IGNudDsKIAogCWRvIHsKLQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSB7Ci0JCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSB7Ci0JCQkJZGV2X2VycihkZXYsICIlcyAtIGRyb3BwaW5nIGRhdGEsICVkIGJ5dGVzIGxvc3RcbiIsCi0JCQkJCV9fRlVOQ1RJT05fXywgbGVuZ3RoKTsKLQkJCQlyZXR1cm47Ci0JCQl9CisJCWNudCA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgbGVuZ3RoKTsKKwkJaWYgKGNudCA8IGxlbmd0aCkgeworCQkJZGV2X2VycihkZXYsICIlcyAtIGRyb3BwaW5nIGRhdGEsICVkIGJ5dGVzIGxvc3RcbiIsCisJCQkJX19GVU5DVElPTl9fLCBsZW5ndGggLSBjbnQpOworCQkJaWYoY250ID09IDApCisJCQkJYnJlYWs7CiAJCX0KLQkJY250ID0gbWluKGxlbmd0aCwgVFRZX0ZMSVBCVUZfU0laRSAtIHR0eS0+ZmxpcC5jb3VudCk7Ci0JCW1lbWNweSh0dHktPmZsaXAuY2hhcl9idWZfcHRyLCBkYXRhLCBjbnQpOwotCQltZW1zZXQodHR5LT5mbGlwLmZsYWdfYnVmX3B0ciwgMCwgY250KTsKLQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciArPSBjbnQ7Ci0JCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgKz0gY250OwotCQl0dHktPmZsaXAuY291bnQgKz0gY250OworCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwgZGF0YSwgY250KTsKIAkJZGF0YSArPSBjbnQ7CiAJCWxlbmd0aCAtPSBjbnQ7CiAJfSB3aGlsZSAobGVuZ3RoID4gMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXBhcS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lwYXEuYwppbmRleCAwNmQwN2NlLi45YTVjOTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXBhcS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pcGFxLmMKQEAgLTcxMSw3ICs3MTEsNyBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQJKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OwogCXVuc2lnbmVkIGNoYXIJCSpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7Ci0JaW50CQkJaSwgcmVzdWx0OworCWludAkJCXJlc3VsdDsKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwogCkBAIC03MjQsMTQgKzcyNCw4IEBACiAKIAl0dHkgPSBwb3J0LT50dHk7CiAJaWYgKHR0eSAmJiB1cmItPmFjdHVhbF9sZW5ndGgpIHsKLQkJZm9yIChpID0gMDsgaSA8IHVyYi0+YWN0dWFsX2xlbmd0aCA7ICsraSkgewotCQkJLyogaWYgd2UgaW5zZXJ0IG1vcmUgdGhhbiBUVFlfRkxJUEJVRl9TSVpFIGNoYXJhY3RlcnMsIHdlIGRyb3AgdGhlbS4gKi8KLQkJCWlmKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSB7Ci0JCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKLQkJCX0KLQkJCS8qIHRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXNoIHRoZSBkYXRhIHRocm91Z2ggdW5sZXNzIHR0eS0+bG93X2xhdGVuY3kgaXMgc2V0ICovCi0JCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGRhdGFbaV0sIDApOwotCQl9CisJCXR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiAJCWJ5dGVzX2luICs9IHVyYi0+YWN0dWFsX2xlbmd0aDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXB3LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXB3LmMKaW5kZXggMmRkMTkxZi4uZTc2MGE3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lwdy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pcHcuYwpAQCAtMTY2LDcgKzE2Niw2IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKLQlpbnQgaTsKIAlpbnQgcmVzdWx0OwogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CkBAIC0xODAsMTQgKzE3OSw4IEBACiAKIAl0dHkgPSBwb3J0LT50dHk7CiAJaWYgKHR0eSAmJiB1cmItPmFjdHVhbF9sZW5ndGgpIHsKLQkJZm9yIChpID0gMDsgaSA8IHVyYi0+YWN0dWFsX2xlbmd0aCA7ICsraSkgewotCQkJLyogaWYgd2UgaW5zZXJ0IG1vcmUgdGhhbiBUVFlfRkxJUEJVRl9TSVpFIGNoYXJhY3RlcnMsIHdlIGRyb3AgdGhlbS4gKi8KLQkJCWlmKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSB7Ci0JCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKLQkJCX0KLQkJCS8qIHRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXNoIHRoZSBkYXRhIHRocm91Z2ggdW5sZXNzIHR0eS0+bG93X2xhdGVuY3kgaXMgc2V0ICovCi0JCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGRhdGFbaV0sIDApOwotCQl9CisJCXR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tsNWt1c2IxMDUuYwppbmRleCA0ZTJmN2RmLi43ODMzNWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rbDVrdXNiMTA1LmMKQEAgLTY0OCw3ICs2NDgsNiBAQAogCQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywKIAkJCQkgICAgICB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOwogCX0gZWxzZSB7Ci0JCWludCBpOwogCQlpbnQgYnl0ZXNfc2VudCA9ICgoX191OCAqKSBkYXRhKVswXSArCiAJCQkJICgodW5zaWduZWQgaW50KSAoKF9fdTggKikgZGF0YSlbMV0gPDwgOCk7CiAJCXR0eSA9IHBvcnQtPnR0eTsKQEAgLTY2OSwxNiArNjY4LDggQEAKIAkJCWJ5dGVzX3NlbnQgPSB1cmItPmFjdHVhbF9sZW5ndGggLSAyOwogCQl9CiAKLQkJZm9yIChpID0gMjsgaSA8IDIrYnl0ZXNfc2VudDsgaSsrKSB7Ci0JCQkvKiBpZiB3ZSBpbnNlcnQgbW9yZSB0aGFuIFRUWV9GTElQQlVGX1NJWkUgY2hhcmFjdGVycywKLQkJCSAqIHdlIGRyb3AgdGhlbS4gKi8KLQkJCWlmKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSB7Ci0JCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKLQkJCX0KLQkJCS8qIHRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXNoIHRoZSBkYXRhIHRocm91Z2ggdW5sZXNzIAotCQkJICogdHR5LT5sb3dfbGF0ZW5jeSBpcyBzZXQgKi8KLQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgKChfX3U4KikgZGF0YSlbaV0sIDApOwotCQl9CisJCXR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgYnl0ZXNfc2VudCk7CisJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBkYXRhICsgMiwgYnl0ZXNfc2VudCk7CiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiAKIAkJLyogYWdhaW4gbG9ja2xlc3MsIGJ1dCBkZWJ1ZyBpbmZvIG9ubHkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rb2JpbF9zY3QuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rb2JpbF9zY3QuYwppbmRleCBkOWMyMWUyLi5iOGIyMTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva29iaWxfc2N0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tvYmlsX3NjdC5jCkBAIC0zNjUsNyArMzY1LDYgQEAKIAogc3RhdGljIHZvaWQga29iaWxfcmVhZF9pbnRfY2FsbGJhY2soIHN0cnVjdCB1cmIgKnB1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCWludCBpOwogCWludCByZXN1bHQ7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHB1cmItPmNvbnRleHQ7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKQEAgLTM5NywxNCArMzk2LDggQEAKIAkJKi8KIAkJLy8gRU5EIERFQlVHCiAKLQkJZm9yIChpID0gMDsgaSA8IHB1cmItPmFjdHVhbF9sZW5ndGg7ICsraSkgewotCQkJLy8gaWYgd2UgaW5zZXJ0IG1vcmUgdGhhbiBUVFlfRkxJUEJVRl9TSVpFIGNoYXJhY3RlcnMsIHdlIGRyb3AgdGhlbS4KLQkJCWlmKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSB7Ci0JCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKLQkJCX0KLQkJCS8vIHRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXNoIHRoZSBkYXRhIHRocm91Z2ggdW5sZXNzIHR0eS0+bG93X2xhdGVuY3kgaXMgc2V0Ci0JCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGRhdGFbaV0sIDApOwotCQl9CisJCXR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgcHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBkYXRhLCBwdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwppbmRleCAzZmQyNDA1Li41MmJkZjZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCkBAIC0zMjEsNyArMzIxLDcgQEAKIAogc3RhdGljIHZvaWQgb3B0aW9uX2luZGF0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JaW50IGksIGVycjsKKwlpbnQgZXJyOwogCWludCBlbmRwb2ludDsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0OwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CkBAIC0zMzgsMTEgKzMzOCw4IEBACiAJfSBlbHNlIHsKIAkJdHR5ID0gcG9ydC0+dHR5OwogCQlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgdXJiLT5hY3R1YWxfbGVuZ3RoIDsgKytpKSB7Ci0JCQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKQotCQkJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgZGF0YVtpXSwgMCk7Ci0JCQl9CisJCQl0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwgZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiAJCX0gZWxzZSB7CiAJCQlkYmcoIiVzOiBlbXB0eSByZWFkIHVyYiByZWNlaXZlZCIsIF9fRlVOQ1RJT05fXyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmMKaW5kZXggZjAzNzIxMC4uMGViODgzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuYwpAQCAtNDMsOCArNDMsNiBAQAogI2RlZmluZSBQTDIzMDNfQlVGX1NJWkUJCTEwMjQKICNkZWZpbmUgUEwyMzAzX1RNUF9CVUZfU0laRQkxMDI0CiAKLXN0YXRpYyBERUNMQVJFX01VVEVYKHBsMjMwM190bXBfYnVmX3NlbSk7Ci0KIHN0cnVjdCBwbDIzMDNfYnVmIHsKIAl1bnNpZ25lZCBpbnQJYnVmX3NpemU7CiAJY2hhcgkJKmJ1Zl9idWY7CkBAIC05MjQsMTYgKzkyMiwxMiBAQAogCiAJdHR5ID0gcG9ydC0+dHR5OwogCWlmICh0dHkgJiYgdXJiLT5hY3R1YWxfbGVuZ3RoKSB7CisJCXR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgdXJiLT5hY3R1YWxfbGVuZ3RoICsgMSk7CiAJCS8qIG92ZXJydW4gaXMgc3BlY2lhbCwgbm90IGFzc29jaWF0ZWQgd2l0aCBhIGNoYXIgKi8KIAkJaWYgKHN0YXR1cyAmIFVBUlRfT1ZFUlJVTl9FUlJPUikKIAkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pOwotCi0JCWZvciAoaSA9IDA7IGkgPCB1cmItPmFjdHVhbF9sZW5ndGg7ICsraSkgewotCQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSB7Ci0JCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKLQkJCX0KKwkJZm9yIChpID0gMDsgaSA8IHVyYi0+YWN0dWFsX2xlbmd0aDsgKytpKQogCQkJdHR5X2luc2VydF9mbGlwX2NoYXIgKHR0eSwgZGF0YVtpXSwgdHR5X2ZsYWcpOwotCQl9CiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoICh0dHkpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmMKaW5kZXggYWJiODMwYy4uYzE4ZGIzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jCkBAIC0xMjgwLDI0ICsxMjgwLDE4IEBACiAJaW50IGNudDsKIAogCWRvIHsKLQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSB7Ci0JCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSB7Ci0JCQkJZGV2X2VycihkZXYsICIlcyAtIGRyb3BwaW5nIGRhdGEsICVkIGJ5dGVzIGxvc3RcbiIsIF9fRlVOQ1RJT05fXywgbGVuZ3RoKTsKLQkJCQlyZXR1cm47Ci0JCQl9CisJCWNudCA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgbGVuZ3RoKTsKKwkJaWYgKGNudCA8IGxlbmd0aCkgeworCQkJZGV2X2VycihkZXYsICIlcyAtIGRyb3BwaW5nIGRhdGEsICVkIGJ5dGVzIGxvc3RcbiIsIF9fRlVOQ1RJT05fXywgbGVuZ3RoIC0gY250KTsKKwkJCWlmKGNudCA9PSAwKQorCQkJCWJyZWFrOwogCQl9Ci0JCWNudCA9IG1pbihsZW5ndGgsIFRUWV9GTElQQlVGX1NJWkUgLSB0dHktPmZsaXAuY291bnQpOwotCQltZW1jcHkodHR5LT5mbGlwLmNoYXJfYnVmX3B0ciwgZGF0YSwgY250KTsKLQkJbWVtc2V0KHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIsIDAsIGNudCk7Ci0JCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgKz0gY250OwotCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyICs9IGNudDsKLQkJdHR5LT5mbGlwLmNvdW50ICs9IGNudDsKKwkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGRhdGEsIGNudCk7CisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiAJCWRhdGEgKz0gY250OwogCQlsZW5ndGggLT0gY250OwogCX0gd2hpbGUgKGxlbmd0aCA+IDApOwogCi0JdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYwppbmRleCA4YmM4MzM3Li40ZGQ2ODY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKQEAgLTU4NCw3ICs1ODQsNyBAQAogCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZDsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9kcml2ZXIgKnQ7CiAKLQkvKiBMaXN0IHRyb3VnaCBrbm93IGRldmljZXMgYW5kIHNlZSBpZiB0aGUgdXNiIGlkIG1hdGNoZXMgKi8KKwkvKiBDaGVjayBpZiB0aGUgdXNiIGlkIG1hdGNoZXMgYSBrbm93biBkZXZpY2UgKi8KIAlsaXN0X2Zvcl9lYWNoKHAsICZ1c2Jfc2VyaWFsX2RyaXZlcl9saXN0KSB7CiAJCXQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCB1c2Jfc2VyaWFsX2RyaXZlciwgZHJpdmVyX2xpc3QpOwogCQlpZCA9IHVzYl9tYXRjaF9pZChpZmFjZSwgdC0+aWRfdGFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3Zpc29yLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdmlzb3IuYwppbmRleCA0OWIxZmJlLi5iY2UzZDU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdmlzb3IuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdmlzb3IuYwpAQCAtNDg4LDcgKzQ4OCw2IEBACiAJdW5zaWduZWQgY2hhciAqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaTsKIAlpbnQgdGhyb3R0bGVkOwogCWludCByZXN1bHQ7CiAKQEAgLTUwMywxNCArNTAyLDggQEAKIAogCXR0eSA9IHBvcnQtPnR0eTsKIAlpZiAodHR5ICYmIHVyYi0+YWN0dWFsX2xlbmd0aCkgewotCQlmb3IgKGkgPSAwOyBpIDwgdXJiLT5hY3R1YWxfbGVuZ3RoIDsgKytpKSB7Ci0JCQkvKiBpZiB3ZSBpbnNlcnQgbW9yZSB0aGFuIFRUWV9GTElQQlVGX1NJWkUgY2hhcmFjdGVycywgd2UgZHJvcCB0aGVtLiAqLwotCQkJaWYodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpIHsKLQkJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCQkJfQotCQkJLyogdGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1c2ggdGhlIGRhdGEgdGhyb3VnaCB1bmxlc3MgdHR5LT5sb3dfbGF0ZW5jeSBpcyBzZXQgKi8KLQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgZGF0YVtpXSwgMCk7Ci0JCX0KKwkJdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwgZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKIAl9CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC93aGl0ZWhlYXQuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC93aGl0ZWhlYXQuYwppbmRleCBhN2MzYzQ3Li41NTc0MTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvd2hpdGVoZWF0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3doaXRlaGVhdC5jCkBAIC0xNDM0LDcgKzE0MzQsOSBAQAogCQl1cmIgPSB3cmFwLT51cmI7CiAKIAkJaWYgKHR0eSAmJiB1cmItPmFjdHVhbF9sZW5ndGgpIHsKLQkJCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPiBUVFlfRkxJUEJVRl9TSVpFIC0gdHR5LT5mbGlwLmNvdW50KSB7CisJCQlpbnQgbGVuID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQkJLyogVGhpcyBzdHVmZiBjYW4gZ28gYXdheSBub3cgSSBzdXNwZWN0ICovCisJCQlpZiAodW5saWtlbHkobGVuIDwgdXJiLT5hY3R1YWxfbGVuZ3RoKSkgewogCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CiAJCQkJbGlzdF9hZGQodG1wLCAmaW5mby0+cnhfdXJiX3EpOwogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKQEAgLTE0NDIsMTEgKzE0NDQsOCBAQAogCQkJCXNjaGVkdWxlX3dvcmsoJmluZm8tPnJ4X3dvcmspOwogCQkJCXJldHVybjsKIAkJCX0KLQotCQkJbWVtY3B5KHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIsIHVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPmFjdHVhbF9sZW5ndGgpOwotCQkJdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciArPSB1cmItPmFjdHVhbF9sZW5ndGg7Ci0JCQl0dHktPmZsaXAuY291bnQgKz0gdXJiLT5hY3R1YWxfbGVuZ3RoOwotCQkJc2VudCArPSB1cmItPmFjdHVhbF9sZW5ndGg7CisJCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwgdXJiLT50cmFuc2Zlcl9idWZmZXIsIGxlbik7CisJCQlzZW50ICs9IGxlbjsKIAkJfQogCiAJCXVyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvLzY4MzI4ZmIuYyBiL2RyaXZlcnMvdmlkZW8vNjgzMjhmYi5jCmluZGV4IDNiMGRkYzUuLjc4NDg4YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vNjgzMjhmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vNjgzMjhmYi5jCkBAIC0xMDIsOCArMTAyLDcgQEAKIAkJCSB1X2ludCB0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIHN0YXRpYyBpbnQgbWM2OHgzMjhmYl9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKIAkJCSAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLXN0YXRpYyBpbnQgbWM2OHgzMjhmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKK3N0YXRpYyBpbnQgbWM2OHgzMjhmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiAKIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIG1jNjh4MzI4ZmJfb3BzID0gewogCS5mYl9jaGVja192YXIJPSBtYzY4eDMyOGZiX2NoZWNrX3ZhciwKQEAgLTM5OCw4ICszOTcsNyBAQAogICAgICAqICBNb3N0IGRyaXZlcnMgZG9uJ3QgbmVlZCB0aGVpciBvd24gbW1hcCBmdW5jdGlvbiAKICAgICAgKi8KIAotc3RhdGljIGludCBtYzY4eDMyOGZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmaWxlICpmaWxlLAotCQkgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCitzdGF0aWMgaW50IG1jNjh4MzI4ZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAjaWZuZGVmIE1NVQogCS8qIHRoaXMgaXMgdUNsaW51eCAobm8gTU1VKSBzcGVjaWZpYyBjb2RlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL0tjb25maWcKaW5kZXggY2M4ZTNiZi4uM2UxNTNkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwpAQCAtOTkzLDEyICs5OTMsNiBAQAogCSAgU2F5IFkgaWYgeW91IGhhdmUgYSBsYXB0b3Agd2l0aCBhbiBBVEkgUmFnZSBMVCBQUk8sIFJhZ2UgTW9iaWxpdHksCiAJICBSYWdlIFhDLCBvciBSYWdlIFhMIGNoaXBzZXQuCiAKLWNvbmZpZyBGQl9BVFlfWExfSU5JVAotCWJvb2wgIlJhZ2UgWEwgTm8tQklPUyBJbml0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBGQl9BVFlfQ1QKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgYm9vdGluZyBhIFJhZ2UgWEwgd2l0aG91dCBCSU9TIHN1cHBvcnQuCi0KIGNvbmZpZyBGQl9BVFlfR1gKIAlib29sICJNYWNoNjQgR1ggc3VwcG9ydCIgaWYgUENJCiAJZGVwZW5kcyBvbiBGQl9BVFkKQEAgLTExNTEsNyArMTE0NSw3IEBACiAKIGNvbmZpZyBGQl9DWUJMQQogCXRyaXN0YXRlICJDeWJlcmJsYWRlL2kxIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBGQiAmJiBQQ0kKKwlkZXBlbmRzIG9uIEZCICYmIFBDSSAmJiBYODZfMzIgJiYgITY0QklUCiAJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKIAlzZWxlY3QgVklERU9fU0VMRUNUCiAJLS0taGVscC0tLQpAQCAtMTM3Niw3ICsxMzcwLDcgQEAKIAogCSAgVGhpcyBkcml2ZXIgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUgKCA9IGNvZGUgd2hpY2ggY2FuIGJlCiAJICBpbnNlcnRlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBydW5uaW5nIGtlcm5lbCB3aGVuZXZlciB5b3Ugd2FudCkuIFRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHZmYi4gSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBweGFmYi4gSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwKIAkgIHNheSBNIGhlcmUgYW5kIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCkBAIC0xNDA5LDcgKzE0MDMsNyBAQAogCiAJICBUaGlzIGRyaXZlciBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZSAoID0gY29kZSB3aGljaCBjYW4gYmUKIAkgIGluc2VydGVkIGFuZCByZW1vdmVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdSB3YW50KS4gVGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdmZiLiBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLAorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHcxMDBmYi4gSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwKIAkgIHNheSBNIGhlcmUgYW5kIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2Fjb3JuZmIuYyBiL2RyaXZlcnMvdmlkZW8vYWNvcm5mYi5jCmluZGV4IDc1MGNlYmIuLmIwNTgyNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYWNvcm5mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYWNvcm5mYi5jCkBAIC04ODMsNyArODgzLDcgQEAKICAqIE5vdGUgdGhhdCB3ZSBhcmUgZW50ZXJlZCB3aXRoIHRoZSBrZXJuZWwgbG9ja2VkLgogICovCiBzdGF0aWMgaW50Ci1hY29ybmZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK2Fjb3JuZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJdW5zaWduZWQgbG9uZyBvZmYsIHN0YXJ0OwogCXUzMiBsZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2FtYmEtY2xjZC5jIGIvZHJpdmVycy92aWRlby9hbWJhLWNsY2QuYwppbmRleCBhM2MyYzQ1Li5iMjE4NzE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2FtYmEtY2xjZC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYW1iYS1jbGNkLmMKQEAgLTIxLDEyICsyMSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL2NsY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KIAogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hbWJhLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+Ci0KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYW1iYV9jbGNkLmg+CiAKICNkZWZpbmUgdG9fY2xjZChpbmZvKQljb250YWluZXJfb2YoaW5mbywgc3RydWN0IGNsY2RfZmIsIGZiKQogCkBAIC0zMDgsNyArMzA3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjbGNkZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZpbGUgKmZpbGUsCitzdGF0aWMgaW50IGNsY2RmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLAogCQkgICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGNsY2RfZmIgKmZiID0gdG9fY2xjZChpbmZvKTsKQEAgLTM0NiwxMCArMzQ1LDYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gY2xrX3VzZShmYi0+Y2xrKTsKLQlpZiAocmV0KQotCQlnb3RvIGZyZWVfY2xrOwotCiAJZmItPmZiLmZpeC5tbWlvX3N0YXJ0CT0gZmItPmRldi0+cmVzLnN0YXJ0OwogCWZiLT5mYi5maXgubW1pb19sZW4JPSBTWl80SzsKIApAQCAtMzU3LDcgKzM1Miw3IEBACiAJaWYgKCFmYi0+cmVncykgewogCQlwcmludGsoS0VSTl9FUlIgIkNMQ0Q6IHVuYWJsZSB0byByZW1hcCByZWdpc3RlcnNcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIHVudXNlX2NsazsKKwkJZ290byBmcmVlX2NsazsKIAl9CiAKIAlmYi0+ZmIuZmJvcHMJCT0gJmNsY2RmYl9vcHM7CkBAIC00MjcsOCArNDIyLDYgQEAKIAlwcmludGsoS0VSTl9FUlIgIkNMQ0Q6IGNhbm5vdCByZWdpc3RlciBmcmFtZWJ1ZmZlciAoJWQpXG4iLCByZXQpOwogCiAJaW91bm1hcChmYi0+cmVncyk7Ci0gdW51c2VfY2xrOgotCWNsa191bnVzZShmYi0+Y2xrKTsKICBmcmVlX2NsazoKIAljbGtfcHV0KGZiLT5jbGspOwogIG91dDoKQEAgLTQ4OSw3ICs0ODIsNiBAQAogCWNsY2RmYl9kaXNhYmxlKGZiKTsKIAl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZmYi0+ZmIpOwogCWlvdW5tYXAoZmItPnJlZ3MpOwotCWNsa191bnVzZShmYi0+Y2xrKTsKIAljbGtfcHV0KGZiLT5jbGspOwogCiAJZmItPmJvYXJkLT5yZW1vdmUoZmIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hbWlmYi5jIGIvZHJpdmVycy92aWRlby9hbWlmYi5jCmluZGV4IGQ1NDllMjEuLjMwMzNjNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYW1pZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2FtaWZiLmMKQEAgLTU5MCw2ICs1OTAsOCBAQAogI2RlZmluZSBoaWdodyh4KQkoKHVfbG9uZykoeCk+PjE2ICYgMHhmZmZmKQogI2RlZmluZSBsb3d3KHgpCQkoKHVfbG9uZykoeCkgJiAweGZmZmYpCiAKKyNkZWZpbmUgY3VzdG9tCQlhbWlnYV9jdXN0b20KKwogI2RlZmluZSBWQmxhbmtPbigpCWN1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFJ8SUZfQ09QRVIKICNkZWZpbmUgVkJsYW5rT2ZmKCkJY3VzdG9tLmludGVuYSA9IElGX0NPUEVSCiAKQEAgLTExMjksOSArMTEzMSw3IEBACiAJCQkgICBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEgKnJlZ2lvbik7CiBzdGF0aWMgdm9pZCBhbWlmYl9pbWFnZWJsaXQoc3RydWN0IGZiX2luZm8gKmluZm8sCiAJCQkgICAgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSk7Ci1zdGF0aWMgaW50IGFtaWZiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsCi0JCSAgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IGFtaWZiX2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiAKIAogCS8qCkBAIC0xMTY0LDggKzExNjQsOCBAQAogc3RhdGljIHZvaWQgYW1pX2luaXRfZGlzcGxheSh2b2lkKTsKIHN0YXRpYyB2b2lkIGFtaV9kb19ibGFuayh2b2lkKTsKIHN0YXRpYyBpbnQgYW1pX2dldF9maXhfY3Vyc29yaW5mbyhzdHJ1Y3QgZmJfZml4X2N1cnNvcmluZm8gKmZpeCk7Ci1zdGF0aWMgaW50IGFtaV9nZXRfdmFyX2N1cnNvcmluZm8oc3RydWN0IGZiX3Zhcl9jdXJzb3JpbmZvICp2YXIsIHVfY2hhciAqZGF0YSk7Ci1zdGF0aWMgaW50IGFtaV9zZXRfdmFyX2N1cnNvcmluZm8oc3RydWN0IGZiX3Zhcl9jdXJzb3JpbmZvICp2YXIsIHVfY2hhciAqZGF0YSk7CitzdGF0aWMgaW50IGFtaV9nZXRfdmFyX2N1cnNvcmluZm8oc3RydWN0IGZiX3Zhcl9jdXJzb3JpbmZvICp2YXIsIHVfY2hhciBfX3VzZXIgKmRhdGEpOworc3RhdGljIGludCBhbWlfc2V0X3Zhcl9jdXJzb3JpbmZvKHN0cnVjdCBmYl92YXJfY3Vyc29yaW5mbyAqdmFyLCB1X2NoYXIgX191c2VyICpkYXRhKTsKIHN0YXRpYyBpbnQgYW1pX2dldF9jdXJzb3JzdGF0ZShzdHJ1Y3QgZmJfY3Vyc29yc3RhdGUgKnN0YXRlKTsKIHN0YXRpYyBpbnQgYW1pX3NldF9jdXJzb3JzdGF0ZShzdHJ1Y3QgZmJfY3Vyc29yc3RhdGUgKnN0YXRlKTsKIHN0YXRpYyB2b2lkIGFtaV9zZXRfc3ByaXRlKHZvaWQpOwpAQCAtMjE3MCwxNSArMjE3MCwxNSBAQAogCSAqIEFtaWdhIEZyYW1lIEJ1ZmZlciBTcGVjaWZpYyBpb2N0bHMKIAkgKi8KIAotc3RhdGljIGludCBhbWlmYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLAotCQkgICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCitzdGF0aWMgaW50IGFtaWZiX2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJdW5pb24gewogCQlzdHJ1Y3QgZmJfZml4X2N1cnNvcmluZm8gZml4OwogCQlzdHJ1Y3QgZmJfdmFyX2N1cnNvcmluZm8gdmFyOwogCQlzdHJ1Y3QgZmJfY3Vyc29yc3RhdGUgc3RhdGU7CiAJfSBjcnNyOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWludCBpOwogCiAJc3dpdGNoIChjbWQpIHsKQEAgLTIxODYsMzMgKzIxODYsMzIgQEAKIAkJCWkgPSBhbWlfZ2V0X2ZpeF9jdXJzb3JpbmZvKCZjcnNyLmZpeCk7CiAJCQlpZiAoaSkKIAkJCQlyZXR1cm4gaTsKLQkJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjcnNyLmZpeCwKKwkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmNyc3IuZml4LAogCQkJCQkgICAgc2l6ZW9mKGNyc3IuZml4KSkgPyAtRUZBVUxUIDogMDsKIAogCQljYXNlIEZCSU9HRVRfVkNVUlNPUklORk86CiAJCQlpID0gYW1pX2dldF92YXJfY3Vyc29yaW5mbygmY3Jzci52YXIsCi0JCQkJKChzdHJ1Y3QgZmJfdmFyX2N1cnNvcmluZm8gKilhcmcpLT5kYXRhKTsKKwkJCQkoKHN0cnVjdCBmYl92YXJfY3Vyc29yaW5mbyBfX3VzZXIgKilhcmcpLT5kYXRhKTsKIAkJCWlmIChpKQogCQkJCXJldHVybiBpOwotCQkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNyc3IudmFyLAorCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmY3Jzci52YXIsCiAJCQkJCSAgICBzaXplb2YoY3Jzci52YXIpKSA/IC1FRkFVTFQgOiAwOwogCiAJCWNhc2UgRkJJT1BVVF9WQ1VSU09SSU5GTzoKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmY3Jzci52YXIsICh2b2lkICopYXJnLAotCQkJCQkgICBzaXplb2YoY3Jzci52YXIpKSkKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmY3Jzci52YXIsIGFyZ3AsIHNpemVvZihjcnNyLnZhcikpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJcmV0dXJuIGFtaV9zZXRfdmFyX2N1cnNvcmluZm8oJmNyc3IudmFyLAotCQkJCSgoc3RydWN0IGZiX3Zhcl9jdXJzb3JpbmZvICopYXJnKS0+ZGF0YSk7CisJCQkJKChzdHJ1Y3QgZmJfdmFyX2N1cnNvcmluZm8gX191c2VyICopYXJnKS0+ZGF0YSk7CiAKIAkJY2FzZSBGQklPR0VUX0NVUlNPUlNUQVRFOgogCQkJaSA9IGFtaV9nZXRfY3Vyc29yc3RhdGUoJmNyc3Iuc3RhdGUpOwogCQkJaWYgKGkpCiAJCQkJcmV0dXJuIGk7Ci0JCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY3Jzci5zdGF0ZSwKKwkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmNyc3Iuc3RhdGUsCiAJCQkJCSAgICBzaXplb2YoY3Jzci5zdGF0ZSkpID8gLUVGQVVMVCA6IDA7CiAKIAkJY2FzZSBGQklPUFVUX0NVUlNPUlNUQVRFOgotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjcnNyLnN0YXRlLCAodm9pZCAqKWFyZywKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmY3Jzci5zdGF0ZSwgYXJncCwKIAkJCQkJICAgc2l6ZW9mKGNyc3Iuc3RhdGUpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCXJldHVybiBhbWlfc2V0X2N1cnNvcnN0YXRlKCZjcnNyLnN0YXRlKTsKQEAgLTMzMjUsNyArMzMyNCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYW1pX2dldF92YXJfY3Vyc29yaW5mbyhzdHJ1Y3QgZmJfdmFyX2N1cnNvcmluZm8gKnZhciwgdV9jaGFyICpkYXRhKQorc3RhdGljIGludCBhbWlfZ2V0X3Zhcl9jdXJzb3JpbmZvKHN0cnVjdCBmYl92YXJfY3Vyc29yaW5mbyAqdmFyLCB1X2NoYXIgX191c2VyICpkYXRhKQogewogCXN0cnVjdCBhbWlmYl9wYXIgKnBhciA9ICZjdXJyZW50cGFyOwogCXJlZ2lzdGVyIHVfc2hvcnQgKmxzcHIsICpzc3ByOwpAQCAtMzM0NywxNCArMzM0NiwxNCBAQAogCXZhci0+eXNwb3QgPSBwYXItPmNyc3Iuc3BvdF95OwogCWlmIChzaXplID4gdmFyLT5oZWlnaHQqdmFyLT53aWR0aCkKIAkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7Ci0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCAodm9pZCAqKWRhdGEsIHNpemUpKQorCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZGF0YSwgc2l6ZSkpCiAJCXJldHVybiAtRUZBVUxUOwogCWRlbHRhID0gMTw8cGFyLT5jcnNyLmZtb2RlOwogCWxzcHIgPSBsb2ZzcHJpdGUgKyAoZGVsdGE8PDEpOwogCWlmIChwYXItPmJwbGNvbjAgJiBCUEMwX0xBQ0UpCiAJCXNzcHIgPSBzaGZzcHJpdGUgKyAoZGVsdGE8PDEpOwogCWVsc2UKLQkJc3NwciA9IDA7CisJCXNzcHIgPSBOVUxMOwogCWZvciAoaGVpZ2h0ID0gKHNob3J0KXZhci0+aGVpZ2h0LTE7IGhlaWdodCA+PSAwOyBoZWlnaHQtLSkgewogCQliaXRzID0gMDsgd29yZHMgPSBkZWx0YTsgZGF0YXdvcmRzID0gMDsKIAkJZm9yICh3aWR0aCA9IChzaG9ydCl2YXItPndpZHRoLTE7IHdpZHRoID49IDA7IHdpZHRoLS0pIHsKQEAgLTM0MDAsNyArMzM5OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYW1pX3NldF92YXJfY3Vyc29yaW5mbyhzdHJ1Y3QgZmJfdmFyX2N1cnNvcmluZm8gKnZhciwgdV9jaGFyICpkYXRhKQorc3RhdGljIGludCBhbWlfc2V0X3Zhcl9jdXJzb3JpbmZvKHN0cnVjdCBmYl92YXJfY3Vyc29yaW5mbyAqdmFyLCB1X2NoYXIgX191c2VyICpkYXRhKQogewogCXN0cnVjdCBhbWlmYl9wYXIgKnBhciA9ICZjdXJyZW50cGFyOwogCXJlZ2lzdGVyIHVfc2hvcnQgKmxzcHIsICpzc3ByOwpAQCAtMzQyNyw3ICszNDI2LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCF2YXItPmhlaWdodCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICh2b2lkICopZGF0YSwgdmFyLT53aWR0aCp2YXItPmhlaWdodCkpCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGRhdGEsIHZhci0+d2lkdGgqdmFyLT5oZWlnaHQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlkZWx0YSA9IDE8PGZtb2RlOwogCWxvZnNwcml0ZSA9IHNoZnNwcml0ZSA9ICh1X3Nob3J0ICopc3ByaXRlbWVtb3J5OwpAQCAtMzQ0MiwxMyArMzQ0MSwxMyBAQAogCQlpZiAoKCh2YXItPmhlaWdodCsyKTw8Zm1vZGU8PDIpID4gU1BSSVRFTUVNU0laRSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQltZW1zZXQobHNwciwgMCwgKHZhci0+aGVpZ2h0KzIpPDxmbW9kZTw8Mik7Ci0JCXNzcHIgPSAwOworCQlzc3ByID0gTlVMTDsKIAl9CiAJZm9yIChoZWlnaHQgPSAoc2hvcnQpdmFyLT5oZWlnaHQtMTsgaGVpZ2h0ID49IDA7IGhlaWdodC0tKSB7CiAJCWJpdHMgPSAxNjsgd29yZHMgPSBkZWx0YTsgZGF0YXdvcmRzID0gMDsKIAkJZm9yICh3aWR0aCA9IChzaG9ydCl2YXItPndpZHRoLTE7IHdpZHRoID49IDA7IHdpZHRoLS0pIHsKIAkJCXVuc2lnbmVkIGxvbmcgdGRhdGEgPSAwOwotCQkJZ2V0X3VzZXIodGRhdGEsIChjaGFyICopZGF0YSk7CisJCQlnZXRfdXNlcih0ZGF0YSwgZGF0YSk7CiAJCQlkYXRhKys7CiAjaWZkZWYgX19tYzY4MDAwX18KIAkJCWFzbSB2b2xhdGlsZSAoCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2FyY2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL2FyY2ZiLmMKaW5kZXggMjc4NGYwYS4uZGY4ZTU2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hcmNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXJjZmIuYwpAQCAtMzY2LDcgKzM2Niw4IEBACiAJfQogfQogCi12b2lkIGFyY2ZiX2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKnJlY3QpCitzdGF0aWMgdm9pZCBhcmNmYl9maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCSAgIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCkKIHsKIAlzdHJ1Y3QgYXJjZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKQEAgLTM3Niw3ICszNzcsOCBAQAogCWFyY2ZiX2xjZF91cGRhdGUocGFyLCByZWN0LT5keCwgcmVjdC0+ZHksIHJlY3QtPndpZHRoLCByZWN0LT5oZWlnaHQpOwogfQogCi12b2lkIGFyY2ZiX2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEgKmFyZWEpCitzdGF0aWMgdm9pZCBhcmNmYl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCSAgIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqYXJlYSkKIHsKIAlzdHJ1Y3QgYXJjZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKQEAgLTM4Niw3ICszODgsNyBAQAogCWFyY2ZiX2xjZF91cGRhdGUocGFyLCBhcmVhLT5keCwgYXJlYS0+ZHksIGFyZWEtPndpZHRoLCBhcmVhLT5oZWlnaHQpOwogfQogCi12b2lkIGFyY2ZiX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSkKK3N0YXRpYyB2b2lkIGFyY2ZiX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSkKIHsKIAlzdHJ1Y3QgYXJjZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKQEAgLTM5Nyw5ICszOTksOCBAQAogCQkJCWltYWdlLT5oZWlnaHQpOwogfQogCi1zdGF0aWMgaW50IGFyY2ZiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywKLQkJCSAgc3RydWN0IGZiX2luZm8gKmluZm8pCitzdGF0aWMgaW50IGFyY2ZiX2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlzdHJ1Y3QgYXJjZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2FzaWxpYW50ZmIuYyBiL2RyaXZlcnMvdmlkZW8vYXNpbGlhbnRmYi5jCmluZGV4IGM2NGRlNTkuLjY5Zjc1NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXNpbGlhbnRmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXNpbGlhbnRmYi5jCkBAIC01NDksNyArNTQ5LDcgQEAKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihhZGRyLCBzaXplLCAiYXNpbGlhbnRmYiIpKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JcCA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZih1MzIpICogMjU2LCAmZHAtPmRldik7CisJcCA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZih1MzIpICogMTYsICZkcC0+ZGV2KTsKIAlpZiAoIXApCXsKIAkJcmVsZWFzZV9tZW1fcmVnaW9uKGFkZHIsIHNpemUpOwogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXRhZmIuYyBiL2RyaXZlcnMvdmlkZW8vYXRhZmIuYwppbmRleCAxNWVjMTI5Li5lNjlhYjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0YWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9hdGFmYi5jCkBAIC0yNTcxLDggKzI1NzEsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1hdGFmYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcsIGludCBjb24sIHN0cnVjdCBmYl9pbmZvICppbmZvKQorYXRhZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN3aXRjaCAoY21kKSB7CiAjaWZkZWYgRkJDTURfR0VUX0NVUlJFTlRQQVIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9hdHkvTWFrZWZpbGUKaW5kZXggOWRlYzk2Mi4uMTg1MjEzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy92aWRlby9hdHkvTWFrZWZpbGUKQEAgLTUsNyArNSw2IEBACiBhdHlmYi15CQkJCTo9IGF0eWZiX2Jhc2UubyBtYWNoNjRfYWNjZWwubyBtYWNoNjRfY3Vyc29yLm8KIGF0eWZiLSQoQ09ORklHX0ZCX0FUWV9HWCkJKz0gbWFjaDY0X2d4Lm8KIGF0eWZiLSQoQ09ORklHX0ZCX0FUWV9DVCkJKz0gbWFjaDY0X2N0Lm8KLWF0eWZiLSQoQ09ORklHX0ZCX0FUWV9YTF9JTklUKSAgKz0geGxpbml0Lm8KIAogYXR5ZmItb2JqcwkJCTo9ICQoYXR5ZmIteSkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvYXR5MTI4ZmIuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0eTEyOGZiLmMKaW5kZXggZTY4NjE4NS4uYmZjOGE5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvYXR5MTI4ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHkxMjhmYi5jCkBAIC00MzEsOCArNDMxLDcgQEAKIHN0YXRpYyBpbnQgYXR5MTI4ZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCiAJCQkgICBzdHJ1Y3QgZmJfaW5mbyAqZmIpOwogc3RhdGljIGludCBhdHkxMjhmYl9ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICpmYik7Ci1zdGF0aWMgaW50IGF0eTEyOGZiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1X2ludCBjbWQsCi0JCQkgIHVfbG9uZyBhcmcsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgYXR5MTI4ZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVfaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogc3RhdGljIGludCBhdHkxMjhmYl9zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIAogICAgIC8qCkBAIC0yMTA4LDggKzIxMDcsNyBAQAogLyogaW4gcGFyYW06IHUzMioJYmFja2xpZ2h0IHZhbHVlOiAwIHRvIDE1ICovCiAjZGVmaW5lIEZCSU9fQVRZMTI4X1NFVF9NSVJST1IJX0lPVygnQCcsIDIsIF9fdTMyKQogCi1zdGF0aWMgaW50IGF0eTEyOGZiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1X2ludCBjbWQsCi0JCQkgIHVfbG9uZyBhcmcsIHN0cnVjdCBmYl9pbmZvICppbmZvKQorc3RhdGljIGludCBhdHkxMjhmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdV9pbnQgY21kLCB1X2xvbmcgYXJnKQogewogCXN0cnVjdCBhdHkxMjhmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1MzIgdmFsdWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYi5oIGIvZHJpdmVycy92aWRlby9hdHkvYXR5ZmIuaAppbmRleCAwOWRlMTczLi5lOWI3YTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiLmgKQEAgLTUwLDYgKzUwLDcgQEAKIAlpbnQgc2NsaywgbWNsaywgbWNsa19wbSwgeGNsazsKIAlpbnQgcmVmX2RpdjsKIAlpbnQgcmVmX2NsazsKKwlpbnQgZWNwX21heDsKIH07CiAKIHR5cGVkZWYgc3RydWN0IHsKQEAgLTM1NCw2ICszNTUsNSBAQAogCiBleHRlcm4gdm9pZCBhdHlfcmVzZXRfZW5naW5lKGNvbnN0IHN0cnVjdCBhdHlmYl9wYXIgKnBhcik7CiBleHRlcm4gdm9pZCBhdHlfaW5pdF9lbmdpbmUoc3RydWN0IGF0eWZiX3BhciAqcGFyLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci1leHRlcm4gaW50ICBhdHlmYl94bF9pbml0KHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIGV4dGVybiB2b2lkIGF0eV9zdF9wbGxfY3QoaW50IG9mZnNldCwgdTggdmFsLCBjb25zdCBzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIpOwogZXh0ZXJuIHU4ICAgYXR5X2xkX3BsbF9jdChpbnQgb2Zmc2V0LCBjb25zdCBzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jIGIvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jCmluZGV4IDNmZWZkYjBjLi40ODViZTM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jCkBAIC0xMDksOSArMTA5LDE4IEBACiAjZGVmaW5lIEdVSV9SRVNFUlZFCSgxICogUEFHRV9TSVpFKQogCiAvKiBGSVhNRTogcmVtb3ZlIHRoZSBGQUlMIGRlZmluaXRpb24gKi8KLSNkZWZpbmUgRkFJTChtc2cpIGRvIHsgcHJpbnRrKEtFUk5fQ1JJVCAiYXR5ZmI6ICIgbXNnICJcbiIpOyByZXR1cm4gLUVJTlZBTDsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgRkFJTF9NQVgobXNnLCB4LCBfbWF4XykgZG8geyBpZih4ID4gX21heF8pIHsgcHJpbnRrKEtFUk5fQ1JJVCAiYXR5ZmI6ICIgbXNnICIgJXgoJXgpXG4iLCB4LCBfbWF4Xyk7IHJldHVybiAtRUlOVkFMOyB9IH0gd2hpbGUgKDApCi0KKyNkZWZpbmUgRkFJTChtc2cpIGRvIHsgXAorCWlmICghKHZhci0+YWN0aXZhdGUgJiBGQl9BQ1RJVkFURV9URVNUKSkgXAorCQlwcmludGsoS0VSTl9DUklUICJhdHlmYjogIiBtc2cgIlxuIik7IFwKKwlyZXR1cm4gLUVJTlZBTDsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgRkFJTF9NQVgobXNnLCB4LCBfbWF4XykgZG8geyBcCisJaWYgKHggPiBfbWF4XykgeyBcCisJCWlmICghKHZhci0+YWN0aXZhdGUgJiBGQl9BQ1RJVkFURV9URVNUKSkgXAorCQkJcHJpbnRrKEtFUk5fQ1JJVCAiYXR5ZmI6ICIgbXNnICIgJXgoJXgpXG4iLCB4LCBfbWF4Xyk7IFwKKwkJcmV0dXJuIC1FSU5WQUw7IFwKKwl9IFwKK30gd2hpbGUgKDApCiAjaWZkZWYgREVCVUcKICNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCXByaW50ayhLRVJOX0RFQlVHICJhdHlmYjogIiBmbXQsICMjIGFyZ3MpCiAjZWxzZQpAQCAtMjI5LDEzICsyMzgsMTIgQEAKIAl1X2ludCB0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIHN0YXRpYyBpbnQgYXR5ZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIHN0YXRpYyBpbnQgYXR5ZmJfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci1zdGF0aWMgaW50IGF0eWZiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1X2ludCBjbWQsCi0JdV9sb25nIGFyZywgc3RydWN0IGZiX2luZm8gKmluZm8pOworc3RhdGljIGludCBhdHlmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdV9pbnQgY21kLCB1X2xvbmcgYXJnKTsKIGV4dGVybiB2b2lkIGF0eWZiX2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKnJlY3QpOwogZXh0ZXJuIHZvaWQgYXR5ZmJfY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqYXJlYSk7CiBleHRlcm4gdm9pZCBhdHlmYl9pbWFnZWJsaXQoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9pbWFnZSAqaW1hZ2UpOwogI2lmZGVmIF9fc3BhcmNfXwotc3RhdGljIGludCBhdHlmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworc3RhdGljIGludCBhdHlmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiAjZW5kaWYKIHN0YXRpYyBpbnQgYXR5ZmJfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiAKQEAgLTM0MCw2ICszNDgsNyBAQAogI2RlZmluZSBBVElfQ0hJUF8yNjRWVDMgICAgKE02NEZfVlQgfCBNNjRGX0lOVEVHUkFURUQgfCBNNjRGX1ZUX0JVUyB8IE02NEZfR1RCX0RTUCB8IE02NEZfU0RSQU1fTUFHSUNfUExMKQogI2RlZmluZSBBVElfQ0hJUF8yNjRWVDQgICAgKE02NEZfVlQgfCBNNjRGX0lOVEVHUkFURUQgICAgICAgICAgICAgICB8IE02NEZfR1RCX0RTUCkKIAorLyogRklYTUUgd2hhdCBpcyB0aGlzIGNoaXA/ICovCiAjZGVmaW5lIEFUSV9DSElQXzI2NExUICAgICAoTTY0Rl9HVCB8IE02NEZfSU5URUdSQVRFRCAgICAgICAgICAgICAgIHwgTTY0Rl9HVEJfRFNQKQogCiAvKiBtYWtlIHNldHMgc2hvcnRlciAqLwpAQCAtMzU5LDU4ICszNjgsNjAgQEAKIHN0YXRpYyBzdHJ1Y3QgewogCXUxNiBwY2lfaWQ7CiAJY29uc3QgY2hhciAqbmFtZTsKLQlpbnQgcGxsLCBtY2xrLCB4Y2xrOworCWludCBwbGwsIG1jbGssIHhjbGssIGVjcF9tYXg7CiAJdTMyIGZlYXR1cmVzOwogfSBhdHlfY2hpcHNbXSBfX2RldmluaXRkYXRhID0gewogI2lmZGVmIENPTkZJR19GQl9BVFlfR1gKIAkvKiBNYWNoNjQgR1ggKi8KLQl7IFBDSV9DSElQX01BQ0g2NEdYLCAiQVRJODg4R1gwMCAoTWFjaDY0IEdYKSIsIDEzNSwgNTAsIDUwLCBBVElfQ0hJUF84ODgwMEdYIH0sCi0JeyBQQ0lfQ0hJUF9NQUNINjRDWCwgIkFUSTg4OENYMDAgKE1hY2g2NCBDWCkiLCAxMzUsIDUwLCA1MCwgQVRJX0NISVBfODg4MDBDWCB9LAorCXsgUENJX0NISVBfTUFDSDY0R1gsICJBVEk4ODhHWDAwIChNYWNoNjQgR1gpIiwgMTM1LCA1MCwgNTAsIDAsIEFUSV9DSElQXzg4ODAwR1ggfSwKKwl7IFBDSV9DSElQX01BQ0g2NENYLCAiQVRJODg4Q1gwMCAoTWFjaDY0IENYKSIsIDEzNSwgNTAsIDUwLCAwLCBBVElfQ0hJUF84ODgwMENYIH0sCiAjZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9HWCAqLwogCiAjaWZkZWYgQ09ORklHX0ZCX0FUWV9DVAotCXsgUENJX0NISVBfTUFDSDY0Q1QsICJBVEkyNjRDVCAoTWFjaDY0IENUKSIsIDEzNSwgNjAsIDYwLCBBVElfQ0hJUF8yNjRDVCB9LAotCXsgUENJX0NISVBfTUFDSDY0RVQsICJBVEkyNjRFVCAoTWFjaDY0IEVUKSIsIDEzNSwgNjAsIDYwLCBBVElfQ0hJUF8yNjRFVCB9LAotCXsgUENJX0NISVBfTUFDSDY0VlQsICJBVEkyNjRWVD8gKE1hY2g2NCBWVCkiLCAxNzAsIDY3LCA2NywgQVRJX0NISVBfMjY0VlQgfSwKLQl7IFBDSV9DSElQX01BQ0g2NEdULCAiM0QgUkFHRSAoTWFjaDY0IEdUKSIsIDEzNSwgNjMsIDYzLCBBVElfQ0hJUF8yNjRHVCB9LAotCS8qIEZJWE1FIHsgLi4uQVRJXzI2NEdVLCBtYXliZSBBVElfQ0hJUF8yNjRHVERWRCB9LCAqLwotCXsgUENJX0NISVBfTUFDSDY0R1UsICIzRCBSQUdFIElJKyAoTWFjaDY0IEdUQikiLCAyMDAsIDY3LCA2NywgQVRJX0NISVBfMjY0R1RCICB9LAotCXsgUENJX0NISVBfTUFDSDY0VlUsICJBVEkyNjRWVEIgKE1hY2g2NCBWVSkiLCAyMDAsIDY3LCA2NywgQVRJX0NISVBfMjY0VlQzIH0sCisJeyBQQ0lfQ0hJUF9NQUNINjRDVCwgIkFUSTI2NENUIChNYWNoNjQgQ1QpIiwgMTM1LCA2MCwgNjAsIDAsIEFUSV9DSElQXzI2NENUIH0sCisJeyBQQ0lfQ0hJUF9NQUNINjRFVCwgIkFUSTI2NEVUIChNYWNoNjQgRVQpIiwgMTM1LCA2MCwgNjAsIDAsIEFUSV9DSElQXzI2NEVUIH0sCiAKLQl7IFBDSV9DSElQX01BQ0g2NExULCAiM0QgUkFHRSBMVCAoTWFjaDY0IExUKSIsIDEzNSwgNjMsIDYzLCBBVElfQ0hJUF8yNjRMVCB9LAotCSAvKiBGSVhNRSBjaGlwc2V0IG1heWJlIEFUSV9DSElQXzI2NExUUFJPID8gKi8KLQl7IFBDSV9DSElQX01BQ0g2NExHLCAiM0QgUkFHRSBMVC1HIChNYWNoNjQgTEcpIiwgMjMwLCA2MywgNjMsIEFUSV9DSElQXzI2NExURyB8IE02NEZfTFRfTENEX1JFR1MgfCBNNjRGX0czX1BCXzEwMjR4NzY4IH0sCisJLyogRklYTUUgd2hhdCBpcyB0aGlzIGNoaXA/ICovCisJeyBQQ0lfQ0hJUF9NQUNINjRMVCwgIkFUSTI2NExUIChNYWNoNjQgTFQpIiwgMTM1LCA2MywgNjMsIDAsIEFUSV9DSElQXzI2NExUIH0sCiAKLQl7IFBDSV9DSElQX01BQ0g2NFZWLCAiQVRJMjY0VlQ0IChNYWNoNjQgVlYpIiwgMjMwLCA4MywgODMsIEFUSV9DSElQXzI2NFZUNCB9LAorCXsgUENJX0NISVBfTUFDSDY0VlQsICJBVEkyNjRWVCAoTWFjaDY0IFZUKSIsIDE3MCwgNjcsIDY3LCA4MCwgQVRJX0NISVBfMjY0VlQgfSwKKwl7IFBDSV9DSElQX01BQ0g2NEdULCAiM0QgUkFHRSAoTWFjaDY0IEdUKSIsIDEzNSwgNjMsIDYzLCA4MCwgQVRJX0NISVBfMjY0R1QgfSwKIAotCXsgUENJX0NISVBfTUFDSDY0R1YsICIzRCBSQUdFIElJQyAoTWFjaDY0IEdWLCBQQ0kpIiwgMjMwLCA4MywgODMsIEFUSV9DSElQXzI2NEdUMkMgfSwKLQl7IFBDSV9DSElQX01BQ0g2NEdXLCAiM0QgUkFHRSBJSUMgKE1hY2g2NCBHVywgQUdQKSIsIDIzMCwgODMsIDgzLCBBVElfQ0hJUF8yNjRHVDJDIH0sCi0JeyBQQ0lfQ0hJUF9NQUNINjRHWSwgIjNEIFJBR0UgSUlDIChNYWNoNjQgR1ksIFBDSSkiLCAyMzAsIDgzLCA4MywgQVRJX0NISVBfMjY0R1QyQyB9LAotCXsgUENJX0NISVBfTUFDSDY0R1osICIzRCBSQUdFIElJQyAoTWFjaDY0IEdaLCBBR1ApIiwgMjMwLCA4MywgODMsIEFUSV9DSElQXzI2NEdUMkMgfSwKKwl7IFBDSV9DSElQX01BQ0g2NFZVLCAiQVRJMjY0VlQzIChNYWNoNjQgVlUpIiwgMjAwLCA2NywgNjcsIDgwLCBBVElfQ0hJUF8yNjRWVDMgfSwKKwl7IFBDSV9DSElQX01BQ0g2NEdVLCAiM0QgUkFHRSBJSSsgKE1hY2g2NCBHVSkiLCAyMDAsIDY3LCA2NywgMTAwLCBBVElfQ0hJUF8yNjRHVEIgfSwKIAotCXsgUENJX0NISVBfTUFDSDY0R0IsICIzRCBSQUdFIFBSTyAoTWFjaDY0IEdCLCBCR0EsIEFHUCkiLCAyMzAsIDEwMCwgMTAwLCBBVElfQ0hJUF8yNjRHVFBSTyB9LAotCXsgUENJX0NISVBfTUFDSDY0R0QsICIzRCBSQUdFIFBSTyAoTWFjaDY0IEdELCBCR0EsIEFHUCAxeCkiLCAyMzAsIDEwMCwgMTAwLCBBVElfQ0hJUF8yNjRHVFBSTyB9LAotCXsgUENJX0NISVBfTUFDSDY0R0ksICIzRCBSQUdFIFBSTyAoTWFjaDY0IEdJLCBCR0EsIFBDSSkiLCAyMzAsIDEwMCwgMTAwLCBBVElfQ0hJUF8yNjRHVFBSTyB8IE02NEZfTUFHSUNfVlJBTV9TSVpFIH0sCi0JeyBQQ0lfQ0hJUF9NQUNINjRHUCwgIjNEIFJBR0UgUFJPIChNYWNoNjQgR1AsIFBRRlAsIFBDSSkiLCAyMzAsIDEwMCwgMTAwLCBBVElfQ0hJUF8yNjRHVFBSTyB9LAotCXsgUENJX0NISVBfTUFDSDY0R1EsICIzRCBSQUdFIFBSTyAoTWFjaDY0IEdRLCBQUUZQLCBQQ0ksIGxpbWl0ZWQgM0QpIiwgMjMwLCAxMDAsIDEwMCwgQVRJX0NISVBfMjY0R1RQUk8gfSwKKwl7IFBDSV9DSElQX01BQ0g2NExHLCAiM0QgUkFHRSBMVCAoTWFjaDY0IExHKSIsIDIzMCwgNjMsIDYzLCAxMDAsIEFUSV9DSElQXzI2NExURyB8IE02NEZfTFRfTENEX1JFR1MgfCBNNjRGX0czX1BCXzEwMjR4NzY4IH0sCiAKLQl7IFBDSV9DSElQX01BQ0g2NExCLCAiM0QgUkFHRSBMVCBQUk8gKE1hY2g2NCBMQiwgQUdQKSIsIDIzNiwgNzUsIDEwMCwgQVRJX0NISVBfMjY0TFRQUk8gfSwKLQl7IFBDSV9DSElQX01BQ0g2NExELCAiM0QgUkFHRSBMVCBQUk8gKE1hY2g2NCBMRCwgQUdQKSIsIDIzMCwgMTAwLCAxMDAsIEFUSV9DSElQXzI2NExUUFJPIH0sCi0JeyBQQ0lfQ0hJUF9NQUNINjRMSSwgIjNEIFJBR0UgTFQgUFJPIChNYWNoNjQgTEksIFBDSSkiLCAyMzAsIDEwMCwgMTAwLCBBVElfQ0hJUF8yNjRMVFBSTyB8IE02NEZfRzNfUEJfMV8xIHwgTTY0Rl9HM19QQl8xMDI0eDc2OCB9LAotCXsgUENJX0NISVBfTUFDSDY0TFAsICIzRCBSQUdFIExUIFBSTyAoTWFjaDY0IExQLCBQQ0kpIiwgMjMwLCAxMDAsIDEwMCwgQVRJX0NISVBfMjY0TFRQUk8gfSwKLQl7IFBDSV9DSElQX01BQ0g2NExRLCAiM0QgUkFHRSBMVCBQUk8gKE1hY2g2NCBMUSwgUENJKSIsIDIzMCwgMTAwLCAxMDAsIEFUSV9DSElQXzI2NExUUFJPIH0sCisJeyBQQ0lfQ0hJUF9NQUNINjRWViwgIkFUSTI2NFZUNCAoTWFjaDY0IFZWKSIsIDIzMCwgODMsIDgzLCAxMDAsIEFUSV9DSElQXzI2NFZUNCB9LAogCi0JeyBQQ0lfQ0hJUF9NQUNINjRHTSwgIjNEIFJBR0UgWEwgKE1hY2g2NCBHTSwgQUdQKSIsIDIzMCwgODMsIDYzLCBBVElfQ0hJUF8yNjRYTCB9LAotCXsgUENJX0NISVBfTUFDSDY0R04sICIzRCBSQUdFIFhMIChNYWNoNjQgR04sIEFHUCkiLCAyMzAsIDgzLCA2MywgQVRJX0NISVBfMjY0WEwgfSwKLQl7IFBDSV9DSElQX01BQ0g2NEdPLCAiM0QgUkFHRSBYTCAoTWFjaDY0IEdPLCBQQ0ktNjYvQkdBKSIsIDIzMCwgODMsIDYzLCBBVElfQ0hJUF8yNjRYTCB9LAotCXsgUENJX0NISVBfTUFDSDY0R1IsICIzRCBSQUdFIFhMIChNYWNoNjQgR1IsIFBDSS0zM01IeikiLCAyMzUsIDgzLCA2MywgQVRJX0NISVBfMjY0WEwgfCBNNjRGX1NEUkFNX01BR0lDX1BMTCB9LAotCXsgUENJX0NISVBfTUFDSDY0R0wsICIzRCBSQUdFIFhMIChNYWNoNjQgR0wsIFBDSSkiLCAyMzAsIDgzLCA2MywgQVRJX0NISVBfMjY0WEwgfSwKLQl7IFBDSV9DSElQX01BQ0g2NEdTLCAiM0QgUkFHRSBYTCAoTWFjaDY0IEdTLCBQQ0kpIiwgMjMwLCA4MywgNjMsIEFUSV9DSElQXzI2NFhMIH0sCisJeyBQQ0lfQ0hJUF9NQUNINjRHViwgIjNEIFJBR0UgSUlDIChNYWNoNjQgR1YsIFBDSSkiLCAyMzAsIDgzLCA4MywgMTAwLCBBVElfQ0hJUF8yNjRHVDJDIH0sCisJeyBQQ0lfQ0hJUF9NQUNINjRHVywgIjNEIFJBR0UgSUlDIChNYWNoNjQgR1csIEFHUCkiLCAyMzAsIDgzLCA4MywgMTAwLCBBVElfQ0hJUF8yNjRHVDJDIH0sCisJeyBQQ0lfQ0hJUF9NQUNINjRHWSwgIjNEIFJBR0UgSUlDIChNYWNoNjQgR1ksIFBDSSkiLCAyMzAsIDgzLCA4MywgMTAwLCBBVElfQ0hJUF8yNjRHVDJDIH0sCisJeyBQQ0lfQ0hJUF9NQUNINjRHWiwgIjNEIFJBR0UgSUlDIChNYWNoNjQgR1osIEFHUCkiLCAyMzAsIDgzLCA4MywgMTAwLCBBVElfQ0hJUF8yNjRHVDJDIH0sCiAKLQl7IFBDSV9DSElQX01BQ0g2NExNLCAiM0QgUkFHRSBNb2JpbGl0eSBQL00gKE1hY2g2NCBMTSwgQUdQIDJ4KSIsIDIzMCwgODMsIDEyNSwgQVRJX0NISVBfTU9CSUxJVFkgfSwKLQl7IFBDSV9DSElQX01BQ0g2NExOLCAiM0QgUkFHRSBNb2JpbGl0eSBMIChNYWNoNjQgTE4sIEFHUCAyeCkiLCAyMzAsIDgzLCAxMjUsIEFUSV9DSElQX01PQklMSVRZIH0sCi0JeyBQQ0lfQ0hJUF9NQUNINjRMUiwgIjNEIFJBR0UgTW9iaWxpdHkgUC9NIChNYWNoNjQgTFIsIFBDSSkiLCAyMzAsIDgzLCAxMjUsIEFUSV9DSElQX01PQklMSVRZIH0sCi0JeyBQQ0lfQ0hJUF9NQUNINjRMUywgIjNEIFJBR0UgTW9iaWxpdHkgTCAoTWFjaDY0IExTLCBQQ0kpIiwgMjMwLCA4MywgMTI1LCBBVElfQ0hJUF9NT0JJTElUWSB9LAorCXsgUENJX0NISVBfTUFDSDY0R0IsICIzRCBSQUdFIFBSTyAoTWFjaDY0IEdCLCBCR0EsIEFHUCkiLCAyMzAsIDEwMCwgMTAwLCAxMjUsIEFUSV9DSElQXzI2NEdUUFJPIH0sCisJeyBQQ0lfQ0hJUF9NQUNINjRHRCwgIjNEIFJBR0UgUFJPIChNYWNoNjQgR0QsIEJHQSwgQUdQIDF4KSIsIDIzMCwgMTAwLCAxMDAsIDEyNSwgQVRJX0NISVBfMjY0R1RQUk8gfSwKKwl7IFBDSV9DSElQX01BQ0g2NEdJLCAiM0QgUkFHRSBQUk8gKE1hY2g2NCBHSSwgQkdBLCBQQ0kpIiwgMjMwLCAxMDAsIDEwMCwgMTI1LCBBVElfQ0hJUF8yNjRHVFBSTyB8IE02NEZfTUFHSUNfVlJBTV9TSVpFIH0sCisJeyBQQ0lfQ0hJUF9NQUNINjRHUCwgIjNEIFJBR0UgUFJPIChNYWNoNjQgR1AsIFBRRlAsIFBDSSkiLCAyMzAsIDEwMCwgMTAwLCAxMjUsIEFUSV9DSElQXzI2NEdUUFJPIH0sCisJeyBQQ0lfQ0hJUF9NQUNINjRHUSwgIjNEIFJBR0UgUFJPIChNYWNoNjQgR1EsIFBRRlAsIFBDSSwgbGltaXRlZCAzRCkiLCAyMzAsIDEwMCwgMTAwLCAxMjUsIEFUSV9DSElQXzI2NEdUUFJPIH0sCisKKwl7IFBDSV9DSElQX01BQ0g2NExCLCAiM0QgUkFHRSBMVCBQUk8gKE1hY2g2NCBMQiwgQUdQKSIsIDIzNiwgNzUsIDEwMCwgMTM1LCBBVElfQ0hJUF8yNjRMVFBSTyB9LAorCXsgUENJX0NISVBfTUFDSDY0TEQsICIzRCBSQUdFIExUIFBSTyAoTWFjaDY0IExELCBBR1ApIiwgMjMwLCAxMDAsIDEwMCwgMTM1LCBBVElfQ0hJUF8yNjRMVFBSTyB9LAorCXsgUENJX0NISVBfTUFDSDY0TEksICIzRCBSQUdFIExUIFBSTyAoTWFjaDY0IExJLCBQQ0kpIiwgMjMwLCAxMDAsIDEwMCwgMTM1LCBBVElfQ0hJUF8yNjRMVFBSTyB8IE02NEZfRzNfUEJfMV8xIHwgTTY0Rl9HM19QQl8xMDI0eDc2OCB9LAorCXsgUENJX0NISVBfTUFDSDY0TFAsICIzRCBSQUdFIExUIFBSTyAoTWFjaDY0IExQLCBQQ0kpIiwgMjMwLCAxMDAsIDEwMCwgMTM1LCBBVElfQ0hJUF8yNjRMVFBSTyB9LAorCXsgUENJX0NISVBfTUFDSDY0TFEsICIzRCBSQUdFIExUIFBSTyAoTWFjaDY0IExRLCBQQ0kpIiwgMjMwLCAxMDAsIDEwMCwgMTM1LCBBVElfQ0hJUF8yNjRMVFBSTyB9LAorCisJeyBQQ0lfQ0hJUF9NQUNINjRHTSwgIjNEIFJBR0UgWEwgKE1hY2g2NCBHTSwgQUdQIDJ4KSIsIDIzMCwgODMsIDYzLCAxMzUsIEFUSV9DSElQXzI2NFhMIH0sCisJeyBQQ0lfQ0hJUF9NQUNINjRHTiwgIjNEIFJBR0UgWEMgKE1hY2g2NCBHTiwgQUdQIDJ4KSIsIDIzMCwgODMsIDYzLCAxMzUsIEFUSV9DSElQXzI2NFhMIH0sCisJeyBQQ0lfQ0hJUF9NQUNINjRHTywgIjNEIFJBR0UgWEwgKE1hY2g2NCBHTywgUENJLTY2KSIsIDIzMCwgODMsIDYzLCAxMzUsIEFUSV9DSElQXzI2NFhMIH0sCisJeyBQQ0lfQ0hJUF9NQUNINjRHTCwgIjNEIFJBR0UgWEMgKE1hY2g2NCBHTCwgUENJLTY2KSIsIDIzMCwgODMsIDYzLCAxMzUsIEFUSV9DSElQXzI2NFhMIH0sCisJeyBQQ0lfQ0hJUF9NQUNINjRHUiwgIjNEIFJBR0UgWEwgKE1hY2g2NCBHUiwgUENJLTMzKSIsIDIzMCwgODMsIDYzLCAxMzUsIEFUSV9DSElQXzI2NFhMIHwgTTY0Rl9TRFJBTV9NQUdJQ19QTEwgfSwKKwl7IFBDSV9DSElQX01BQ0g2NEdTLCAiM0QgUkFHRSBYQyAoTWFjaDY0IEdTLCBQQ0ktMzMpIiwgMjMwLCA4MywgNjMsIDEzNSwgQVRJX0NISVBfMjY0WEwgfSwKKworCXsgUENJX0NISVBfTUFDSDY0TE0sICIzRCBSQUdFIE1vYmlsaXR5IFAvTSAoTWFjaDY0IExNLCBBR1AgMngpIiwgMjMwLCA4MywgMTI1LCAxMzUsIEFUSV9DSElQX01PQklMSVRZIH0sCisJeyBQQ0lfQ0hJUF9NQUNINjRMTiwgIjNEIFJBR0UgTW9iaWxpdHkgTCAoTWFjaDY0IExOLCBBR1AgMngpIiwgMjMwLCA4MywgMTI1LCAxMzUsIEFUSV9DSElQX01PQklMSVRZIH0sCisJeyBQQ0lfQ0hJUF9NQUNINjRMUiwgIjNEIFJBR0UgTW9iaWxpdHkgUC9NIChNYWNoNjQgTFIsIFBDSSkiLCAyMzAsIDgzLCAxMjUsIDEzNSwgQVRJX0NISVBfTU9CSUxJVFkgfSwKKwl7IFBDSV9DSElQX01BQ0g2NExTLCAiM0QgUkFHRSBNb2JpbGl0eSBMIChNYWNoNjQgTFMsIFBDSSkiLCAyMzAsIDgzLCAxMjUsIDEzNSwgQVRJX0NISVBfTU9CSUxJVFkgfSwKICNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0NUICovCiB9OwogCkBAIC00MzEsNiArNDQyLDcgQEAKIAlwYXItPnBsbF9saW1pdHMucGxsX21heCA9IGF0eV9jaGlwc1tpXS5wbGw7CiAJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSBhdHlfY2hpcHNbaV0ubWNsazsKIAlwYXItPnBsbF9saW1pdHMueGNsayA9IGF0eV9jaGlwc1tpXS54Y2xrOworCXBhci0+cGxsX2xpbWl0cy5lY3BfbWF4ID0gYXR5X2NoaXBzW2ldLmVjcF9tYXg7CiAJcGFyLT5mZWF0dXJlcyA9IGF0eV9jaGlwc1tpXS5mZWF0dXJlczsKIAogCWNoaXBfaWQgPSBhdHlfbGRfbGUzMihDT05GSUdfQ0hJUF9JRCwgcGFyKTsKQEAgLTQ1MCwzOSArNDYyLDYzIEBACiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRkJfQVRZX0NUCiAJY2FzZSBQQ0lfQ0hJUF9NQUNINjRWVDoKLQkJcmV2ICY9IDB4Yzc7Ci0JCWlmKHJldiA9PSAweDAwKSB7Ci0JCQluYW1lID0gIkFUSTI2NFZUQTMgKE1hY2g2NCBWVCkiOwotCQkJcGFyLT5wbGxfbGltaXRzLnBsbF9tYXggPSAxNzA7Ci0JCQlwYXItPnBsbF9saW1pdHMubWNsayA9IDY3OwotCQkJcGFyLT5wbGxfbGltaXRzLnhjbGsgPSA2NzsKLQkJCXBhci0+ZmVhdHVyZXMgPSBBVElfQ0hJUF8yNjRWVDsKLQkJfSBlbHNlIGlmKHJldiA9PSAweDQwKSB7Ci0JCQluYW1lID0gIkFUSTI2NFZUQTQgKE1hY2g2NCBWVCkiOworCQlzd2l0Y2ggKHJldiAmIDB4MDcpIHsKKwkJY2FzZSAweDAwOgorCQkJc3dpdGNoIChyZXYgJiAweGMwKSB7CisJCQljYXNlIDB4MDA6CisJCQkJbmFtZSA9ICJBVEkyNjRWVCAoQTMpIChNYWNoNjQgVlQpIjsKKwkJCQlwYXItPnBsbF9saW1pdHMucGxsX21heCA9IDE3MDsKKwkJCQlwYXItPnBsbF9saW1pdHMubWNsayA9IDY3OworCQkJCXBhci0+cGxsX2xpbWl0cy54Y2xrID0gNjc7CisJCQkJcGFyLT5wbGxfbGltaXRzLmVjcF9tYXggPSA4MDsKKwkJCQlwYXItPmZlYXR1cmVzID0gQVRJX0NISVBfMjY0VlQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4NDA6CisJCQkJbmFtZSA9ICJBVEkyNjRWVDIgKEE0KSAoTWFjaDY0IFZUKSI7CisJCQkJcGFyLT5wbGxfbGltaXRzLnBsbF9tYXggPSAyMDA7CisJCQkJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSA2NzsKKwkJCQlwYXItPnBsbF9saW1pdHMueGNsayA9IDY3OworCQkJCXBhci0+cGxsX2xpbWl0cy5lY3BfbWF4ID0gODA7CisJCQkJcGFyLT5mZWF0dXJlcyA9IEFUSV9DSElQXzI2NFZUIHwgTTY0Rl9NQUdJQ19QT1NURElWOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMHgwMToKKwkJCW5hbWUgPSAiQVRJMjY0VlQzIChCMSkgKE1hY2g2NCBWVCkiOwogCQkJcGFyLT5wbGxfbGltaXRzLnBsbF9tYXggPSAyMDA7CiAJCQlwYXItPnBsbF9saW1pdHMubWNsayA9IDY3OwogCQkJcGFyLT5wbGxfbGltaXRzLnhjbGsgPSA2NzsKLQkJCXBhci0+ZmVhdHVyZXMgPSBBVElfQ0hJUF8yNjRWVCB8IE02NEZfTUFHSUNfUE9TVERJVjsKLQkJfSBlbHNlIHsKLQkJCW5hbWUgPSAiQVRJMjY0VlRCIChNYWNoNjQgVlQpIjsKLQkJCXBhci0+cGxsX2xpbWl0cy5wbGxfbWF4ID0gMjAwOwotCQkJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSA2NzsKLQkJCXBhci0+cGxsX2xpbWl0cy54Y2xrID0gNjc7CisJCQlwYXItPnBsbF9saW1pdHMuZWNwX21heCA9IDgwOwogCQkJcGFyLT5mZWF0dXJlcyA9IEFUSV9DSElQXzI2NFZUQjsKKwkJCWJyZWFrOworCQljYXNlIDB4MDI6CisJCQluYW1lID0gIkFUSTI2NFZUMyAoQjIpIChNYWNoNjQgVlQpIjsKKwkJCXBhci0+cGxsX2xpbWl0cy5wbGxfbWF4ID0gMjAwOworCQkJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSA2NzsKKwkJCXBhci0+cGxsX2xpbWl0cy54Y2xrID0gNjc7CisJCQlwYXItPnBsbF9saW1pdHMuZWNwX21heCA9IDgwOworCQkJcGFyLT5mZWF0dXJlcyA9IEFUSV9DSElQXzI2NFZUMzsKKwkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgUENJX0NISVBfTUFDSDY0R1Q6Ci0JCXJldiAmPSAweDA3OwotCQlpZihyZXYgPT0gMHgwMSkgeworCQlzd2l0Y2ggKHJldiAmIDB4MDcpIHsKKwkJY2FzZSAweDAxOgorCQkJbmFtZSA9ICIzRCBSQUdFIElJIChNYWNoNjQgR1QpIjsKIAkJCXBhci0+cGxsX2xpbWl0cy5wbGxfbWF4ID0gMTcwOwogCQkJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSA2NzsKIAkJCXBhci0+cGxsX2xpbWl0cy54Y2xrID0gNjc7CisJCQlwYXItPnBsbF9saW1pdHMuZWNwX21heCA9IDgwOwogCQkJcGFyLT5mZWF0dXJlcyA9IEFUSV9DSElQXzI2NEdUQjsKLQkJfSBlbHNlIGlmKHJldiA9PSAweDAyKSB7CisJCQlicmVhazsKKwkJY2FzZSAweDAyOgorCQkJbmFtZSA9ICIzRCBSQUdFIElJKyAoTWFjaDY0IEdUKSI7CiAJCQlwYXItPnBsbF9saW1pdHMucGxsX21heCA9IDIwMDsKIAkJCXBhci0+cGxsX2xpbWl0cy5tY2xrID0gNjc7CiAJCQlwYXItPnBsbF9saW1pdHMueGNsayA9IDY3OworCQkJcGFyLT5wbGxfbGltaXRzLmVjcF9tYXggPSAxMDA7CiAJCQlwYXItPmZlYXR1cmVzID0gQVRJX0NISVBfMjY0R1RCOworCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAjZW5kaWYKQEAgLTY5Miw3ICs3MjgsNyBAQAogCQlhdHlfc3RfbGNkKExDRF9HRU5fQ05UTCwgKGNydGMtPmxjZF9nZW5fY250bCAmIH5DUlRDX1JXX1NFTEVDVCkgfAogCQkJKFNIQURPV19FTiB8IFNIQURPV19SV19FTiksIHBhcik7CiAKLQkJRFBSSU5USygic2V0IHNlY29uZGFyeSBDUlQgdG8gJWl4JWkgJWMlY1xuIiwKKwkJRFBSSU5USygic2V0IHNoYWRvdyBDUlQgdG8gJWl4JWkgJWMlY1xuIiwKIAkJICAgICgoKChjcnRjLT5zaGFkb3dfaF90b3RfZGlzcD4+MTYpICYgMHhmZikgKyAxKTw8MyksICgoKGNydGMtPnNoYWRvd192X3RvdF9kaXNwPj4xNikgJiAweDdmZikgKyAxKSwKIAkJICAgIChjcnRjLT5zaGFkb3dfaF9zeW5jX3N0cnRfd2lkICYgMHgyMDAwMDApPydOJzonUCcsIChjcnRjLT5zaGFkb3dfdl9zeW5jX3N0cnRfd2lkICYgMHgyMDAwMDApPydOJzonUCcpOwogCkBAIC04NDAsMTEgKzg3NiwxNCBAQAogCQkJICAga25vdyBpZiBvbmUgaXMgY29ubmVjdGVkLiBTbyBpdCdzIGJldHRlciB0byBmYWlsIHRoZW4uCiAJCQkgKi8KIAkJCWlmIChjcnRjLT5sY2RfZ2VuX2NudGwgJiBDUlRfT04pIHsKLQkJCQlQUklOVEtJKCJEaXNhYmxlIGxjZCBwYW5lbCwgYmVjYXVzZSB2aWRlbyBtb2RlIGRvZXMgbm90IGZpdC5cbiIpOworCQkJCWlmICghKHZhci0+YWN0aXZhdGUgJiBGQl9BQ1RJVkFURV9URVNUKSkKKwkJCQkJUFJJTlRLSSgiRGlzYWJsZSBMQ0QgcGFuZWwsIGJlY2F1c2UgdmlkZW8gbW9kZSBkb2VzIG5vdCBmaXQuXG4iKTsKIAkJCQljcnRjLT5sY2RfZ2VuX2NudGwgJj0gfkxDRF9PTjsKIAkJCQkvKmF0eV9zdF9sY2QoTENEX0dFTl9DTlRMLCBjcnRjLT5sY2RfZ2VuX2NudGwsIHBhcik7Ki8KIAkJCX0gZWxzZSB7Ci0JCQkJRkFJTCgiVmlkZW8gbW9kZSBleGNlZWRzIHNpemUgb2YgbGNkIHBhbmVsLlxuQ29ubmVjdCB0aGlzIGNvbXB1dGVyIHRvIGEgY29udmVudGlvbmFsIG1vbml0b3IgaWYgeW91IHJlYWxseSBuZWVkIHRoaXMgbW9kZS4iKTsKKwkJCQlpZiAoISh2YXItPmFjdGl2YXRlICYgRkJfQUNUSVZBVEVfVEVTVCkpCisJCQkJCVBSSU5US0UoIlZpZGVvIG1vZGUgZXhjZWVkcyBzaXplIG9mIExDRCBwYW5lbC5cbkNvbm5lY3QgdGhpcyBjb21wdXRlciB0byBhIGNvbnZlbnRpb25hbCBtb25pdG9yIGlmIHlvdSByZWFsbHkgbmVlZCB0aGlzIG1vZGUuXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJfQogCX0KQEAgLTg1OCw5ICs4OTcsOSBAQAogCQl2bW9kZSAmPSB+KEZCX1ZNT0RFX0RPVUJMRSB8IEZCX1ZNT0RFX0lOVEVSTEFDRUQpOwogCiAJCS8qIFRoaXMgaXMgaG9ycm9yISBXaGVuIHdlIHNpbXVsYXRlLCBzYXkgNjQweDQ4MCBvbiBhbiA4MDB4NjAwCi0JCSAgIGxjZCBtb25pdG9yLCB0aGUgQ1JUQyBzaG91bGQgYmUgcHJvZ3JhbW1lZCA4MDB4NjAwIHZhbHVlcyBmb3IKKwkJICAgTENEIG1vbml0b3IsIHRoZSBDUlRDIHNob3VsZCBiZSBwcm9ncmFtbWVkIDgwMHg2MDAgdmFsdWVzIGZvcgogCQkgICB0aGUgbm9uIHZpc2libGUgcGFydCwgYnV0IDY0MHg0ODAgZm9yIHRoZSB2aXNpYmxlIHBhcnQuCi0JCSAgIFRoaXMgY29kZSBoYXMgYmVlbiB0ZXN0ZWQgb24gYSBsYXB0b3Agd2l0aCBpdCdzIDE0MDB4MTA1MCBsY2QKKwkJICAgVGhpcyBjb2RlIGhhcyBiZWVuIHRlc3RlZCBvbiBhIGxhcHRvcCB3aXRoIGl0J3MgMTQwMHgxMDUwIExDRAogCQkgICBtb25pdG9yIGFuZCBhIGNvbnZlbnRpb25hbCBtb25pdG9yIGJvdGggc3dpdGNoZWQgb24uCiAJCSAgIFRlc3RlZCBtb2RlczogMTI4MHgxMDI0LCAxMTUyeDg2NCwgMTAyNHg3NjgsIDgwMHg2MDAsCiAJCSAgICB3b3JrcyB3aXRoIGxpdHRsZSBnbGl0Y2hlcyBhbHNvIHdpdGggRE9VQkxFU0NBTiBtb2RlcwpAQCAtOTU1LDE2ICs5OTQsNiBAQAogCQl2ZGlzcGxheSA9IHlyZXM7CiAJCWlmKHZtb2RlICYgRkJfVk1PREVfRE9VQkxFKQogCQkJdmRpc3BsYXkgPDw9IDE7Ci0JCWlmKHZtb2RlICYgRkJfVk1PREVfSU5URVJMQUNFRCkgewotCQkJdmRpc3BsYXkgPj49IDE7Ci0KLQkJCS8qIFRoZSBwcmVmZXJlZCBtb2RlIGZvciB0aGUgbGNkIGlzIG5vdCBpbnRlcmxhY2VkLCBzbyBkaXNhYmxlIGl0IGlmCi0JCQkgICBpdCB3YXMgZW5hYmxlZC4gRm9yIGRvdWJsZXNjYW4gdGhlcmUgaXMgbm8gcHJvYmxlbSwgYmVjYXVzZSB3ZSBjYW4KLQkJCSAgIGNvbXBlbnNhdGUgZm9yIGl0IGluIHRoZSBoYXJkd2FyZSBzdHJldGNoaW5nICh3ZSBzdHJldGNoIGhhbGYgYXMgbXVjaCkKLQkJCSAqLwotCQkJdm1vZGUgJj0gfkZCX1ZNT0RFX0lOVEVSTEFDRUQ7Ci0JCQkvKmNydGMtPmdlbl9jbnRsICY9IH5DUlRDX0lOVEVSTEFDRV9FTjsqLwotCQl9CiAJCWNydGMtPmdlbl9jbnRsICY9IH4oQ1JUQzJfRU4gfCBDUlRDMl9QSVhfV0lEVEgpOwogCQljcnRjLT5sY2RfZ2VuX2NudGwgJj0gfihIT1JaX0RJVkJZMl9FTiB8IERJU19IT1JfQ1JUX0RJVkJZMiB8CiAJCQkvKlRWQ0xLX1BNX0VOIHwgVkNMS19EQUNfUE1fRU4gfCovCkBAIC05ODAsNyArMTAwOSw3IEBACiAJCWNydGMtPmhvcnpfc3RyZXRjaGluZyAmPQogCQkJfihIT1JaX1NUUkVUQ0hfUkFUSU8gfCBIT1JaX1NUUkVUQ0hfTE9PUCB8IEFVVE9fSE9SWl9SQVRJTyB8CiAJCQlIT1JaX1NUUkVUQ0hfTU9ERSB8IEhPUlpfU1RSRVRDSF9FTik7Ci0JCWlmICh4cmVzIDwgcGFyLT5sY2Rfd2lkdGgpIHsKKwkJaWYgKHhyZXMgPCBwYXItPmxjZF93aWR0aCAmJiBjcnRjLT5sY2RfZ2VuX2NudGwgJiBMQ0RfT04pIHsKIAkJCWRvIHsKIAkJCQkvKgogCQkJCSogVGhlIGhvcml6b250YWwgYmxlbmRlciBtaXNiZWhhdmVzIHdoZW4gSERpc3BsYXkgaXMgbGVzcyB0aGFuIGEKQEAgLTEwNDIsNyArMTA3MSw3IEBACiAJCQl9IHdoaWxlICgwKTsKIAkJfQogCi0JCWlmICh2ZGlzcGxheSA8IHBhci0+bGNkX2hlaWdodCkgeworCQlpZiAodmRpc3BsYXkgPCBwYXItPmxjZF9oZWlnaHQgJiYgY3J0Yy0+bGNkX2dlbl9jbnRsICYgTENEX09OKSB7CiAJCQljcnRjLT52ZXJ0X3N0cmV0Y2hpbmcgPSAoVkVSVF9TVFJFVENIX1VTRTAgfCBWRVJUX1NUUkVUQ0hfRU4gfAogCQkJCSgoKHZkaXNwbGF5ICogKFZFUlRfU1RSRVRDSF9SQVRJTzAgKyAxKSkgLyBwYXItPmxjZF9oZWlnaHQpICYgVkVSVF9TVFJFVENIX1JBVElPMCkpOwogCkBAIC0xMDY1LDkgKzEwOTQsOCBAQAogI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QgKi8KIAogCWlmIChNNjRfSEFTKE1BR0lDX0ZJRk8pKSB7Ci0JCS8qIE5vdCBWVEIvR1RCICovCi0JCS8qIEZJWE1FOiBtYWdpYyBGSUZPIHZhbHVlcyAqLwotCQljcnRjLT5nZW5fY250bCB8PSAoYXR5X2xkX2xlMzIoQ1JUQ19HRU5fQ05UTCwgcGFyKSAmIENSVEMyX1BJWF9XSURUSCk7CisJCS8qIEZJWE1FOiBkaXNwbGF5IEZJRk8gbG93IHdhdGVybWFyayB2YWx1ZXMgKi8KKwkJY3J0Yy0+Z2VuX2NudGwgfD0gKGF0eV9sZF9sZTMyKENSVENfR0VOX0NOVEwsIHBhcikgJiBDUlRDX0ZJRk9fTFdNKTsKIAl9CiAJY3J0Yy0+ZHBfcGl4X3dpZHRoID0gZHBfcGl4X3dpZHRoOwogCWNydGMtPmRwX2NoYWluX21hc2sgPSBkcF9jaGFpbl9tYXNrOwpAQCAtMTE4NCw3ICsxMjEyLDggQEAKIAkJdmFyLT50cmFuc3AubGVuZ3RoID0gODsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJRkFJTCgiSW52YWxpZCBwaXhlbCB3aWR0aCIpOworCQlQUklOVEtFKCJJbnZhbGlkIHBpeGVsIHdpZHRoXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogb3V0cHV0ICovCkBAIC0xMjQxLDcgKzEyNzAsOCBAQAogCXBpeGNsb2NrID0gYXR5ZmJfZ2V0X3BpeGNsb2NrKHZhciwgcGFyKTsKIAogCWlmIChwaXhjbG9jayA9PSAwKSB7Ci0JCUZBSUwoIkludmFsaWQgcGl4Y2xvY2siKTsKKwkJUFJJTlRLRSgiSW52YWxpZCBwaXhjbG9ja1xuIik7CisJCXJldHVybiAtRUlOVkFMOwogCX0gZWxzZSB7CiAJCWlmKChlcnIgPSBwYXItPnBsbF9vcHMtPnZhcl90b19wbGwoaW5mbywgcGl4Y2xvY2ssIHZhci0+Yml0c19wZXJfcGl4ZWwsICZwYXItPnBsbCkpKQogCQkJcmV0dXJuIGVycjsKQEAgLTE0NDYsNyArMTQ3Niw5IEBACiAJcGl4Y2xvY2sgPSBhdHlmYl9nZXRfcGl4Y2xvY2sodmFyLCBwYXIpOwogCiAJaWYgKHBpeGNsb2NrID09IDApIHsKLQkJRkFJTCgiSW52YWxpZCBwaXhjbG9jayIpOworCQlpZiAoISh2YXItPmFjdGl2YXRlICYgRkJfQUNUSVZBVEVfVEVTVCkpCisJCQlQUklOVEtFKCJJbnZhbGlkIHBpeGNsb2NrXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfSBlbHNlIHsKIAkJaWYoKGVyciA9IHBhci0+cGxsX29wcy0+dmFyX3RvX3BsbChpbmZvLCBwaXhjbG9jaywgdmFyLT5iaXRzX3Blcl9waXhlbCwgJnBsbCkpKQogCQkJcmV0dXJuIGVycjsKQEAgLTE3MDYsOCArMTczOCw3IEBACiAjZGVmaW5lIEZCSU9fV0FJVEZPUlZTWU5DIF9JT1coJ0YnLCAweDIwLCBfX3UzMikKICNlbmRpZgogCi1zdGF0aWMgaW50IGF0eWZiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1X2ludCBjbWQsCi0JdV9sb25nIGFyZywgc3RydWN0IGZiX2luZm8gKmluZm8pCitzdGF0aWMgaW50IGF0eWZiX2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1X2ludCBjbWQsIHVfbG9uZyBhcmcpCiB7CiAJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwogI2lmZGVmIF9fc3BhcmNfXwpAQCAtMTgxMiw3ICsxODQzLDcgQEAKIH0KIAogI2lmZGVmIF9fc3BhcmNfXwotc3RhdGljIGludCBhdHlmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCitzdGF0aWMgaW50IGF0eWZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKIAl1bnNpZ25lZCBpbnQgc2l6ZSwgcGFnZSwgbWFwX3NpemUgPSAwOwpAQCAtMjI5MSwxMCArMjMyMiw2IEBACiAJCXBhci0+ZGFjX29wcyA9ICZhdHlfZGFjX2N0OwogCQlwYXItPnBsbF9vcHMgPSAmYXR5X3BsbF9jdDsKIAkJcGFyLT5idXNfdHlwZSA9IFBDSTsKLSNpZmRlZiBDT05GSUdfRkJfQVRZX1hMX0lOSVQKLQkJaWYgKElTX1hMKHBhci0+cGNpX2lkKSkKLQkJCWF0eWZiX3hsX2luaXQoaW5mbyk7Ci0jZW5kaWYKIAkJcGFyLT5yYW1fdHlwZSA9IChhdHlfbGRfbGUzMihDT05GSUdfU1RBVDAsIHBhcikgJiAweDA3KTsKIAkJcmFtbmFtZSA9IGF0eV9jdF9yYW1bcGFyLT5yYW1fdHlwZV07CiAJCS8qIGZvciBtYW55IGNoaXBzLCB0aGUgbWNsayBpcyA2NyBNSHogZm9yIFNEUkFNLCA2MyBNSHogb3RoZXJ3aXNlICovCkBAIC0yNjM4LDE2ICsyNjY1LDE2IEBACiBzdGF0aWMgaW50IGF0eWZiX2JsYW5rKGludCBibGFuaywgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwotCXU4IGdlbl9jbnRsOworCXUzMiBnZW5fY250bDsKIAogCWlmIChwYXItPmxvY2tfYmxhbmsgfHwgcGFyLT5hc2xlZXApCiAJCXJldHVybiAwOwogCiAjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCi0JaWYgKChfbWFjaGluZSA9PSBfTUFDSF9QbWFjKSAmJiBibGFuaykKKwlpZiAoKF9tYWNoaW5lID09IF9NQUNIX1BtYWMpICYmIGJsYW5rID4gRkJfQkxBTktfTk9STUFMKQogCQlzZXRfYmFja2xpZ2h0X2VuYWJsZSgwKTsKICNlbGlmIGRlZmluZWQoQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRCkKLQlpZiAocGFyLT5sY2RfdGFibGUgJiYgYmxhbmsgJiYKKwlpZiAocGFyLT5sY2RfdGFibGUgJiYgYmxhbmsgPiBGQl9CTEFOS19OT1JNQUwgJiYKIAkgICAgKGF0eV9sZF9sY2QoTENEX0dFTl9DTlRMLCBwYXIpICYgTENEX09OKSkgewogCQl1MzIgcG0gPSBhdHlfbGRfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBhcik7CiAJCXBtICY9IH5QV1JfQkxPTjsKQEAgLTI2NTUsMzEgKzI2ODIsMzEgQEAKIAl9CiAjZW5kaWYKIAotCWdlbl9jbnRsID0gYXR5X2xkXzgoQ1JUQ19HRU5fQ05UTCwgcGFyKTsKKwlnZW5fY250bCA9IGF0eV9sZF9sZTMyKENSVENfR0VOX0NOVEwsIHBhcik7CiAJc3dpdGNoIChibGFuaykgewogICAgICAgICAJY2FzZSBGQl9CTEFOS19VTkJMQU5LOgotCQkJZ2VuX2NudGwgJj0gfigweDRjKTsKKwkJCWdlbl9jbnRsICY9IH4weDQwMDAwNGM7CiAJCQlicmVhazsKIAkJY2FzZSBGQl9CTEFOS19OT1JNQUw6Ci0JCQlnZW5fY250bCB8PSAweDQwOworCQkJZ2VuX2NudGwgfD0gMHg0MDAwMDQwOwogCQkJYnJlYWs7CiAJCWNhc2UgRkJfQkxBTktfVlNZTkNfU1VTUEVORDoKLQkJCWdlbl9jbnRsIHw9IDB4ODsKKwkJCWdlbl9jbnRsIHw9IDB4NDAwMDA0ODsKIAkJCWJyZWFrOwogCQljYXNlIEZCX0JMQU5LX0hTWU5DX1NVU1BFTkQ6Ci0JCQlnZW5fY250bCB8PSAweDQ7CisJCQlnZW5fY250bCB8PSAweDQwMDAwNDQ7CiAJCQlicmVhazsKIAkJY2FzZSBGQl9CTEFOS19QT1dFUkRPV046Ci0JCQlnZW5fY250bCB8PSAweDRjOworCQkJZ2VuX2NudGwgfD0gMHg0MDAwMDRjOwogCQkJYnJlYWs7CiAJfQotCWF0eV9zdF84KENSVENfR0VOX0NOVEwsIGdlbl9jbnRsLCBwYXIpOworCWF0eV9zdF9sZTMyKENSVENfR0VOX0NOVEwsIGdlbl9jbnRsLCBwYXIpOwogCiAjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCi0JaWYgKChfbWFjaGluZSA9PSBfTUFDSF9QbWFjKSAmJiAhYmxhbmspCisJaWYgKChfbWFjaGluZSA9PSBfTUFDSF9QbWFjKSAmJiBibGFuayA8PSBGQl9CTEFOS19OT1JNQUwpCiAJCXNldF9iYWNrbGlnaHRfZW5hYmxlKDEpOwogI2VsaWYgZGVmaW5lZChDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEKQotCWlmIChwYXItPmxjZF90YWJsZSAmJiAhYmxhbmsgJiYKKwlpZiAocGFyLT5sY2RfdGFibGUgJiYgYmxhbmsgPD0gRkJfQkxBTktfTk9STUFMICYmCiAJICAgIChhdHlfbGRfbGNkKExDRF9HRU5fQ05UTCwgcGFyKSAmIExDRF9PTikpIHsKIAkJdTMyIHBtID0gYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpOwogCQlwbSB8PSBQV1JfQkxPTjsKQEAgLTMxNTcsMTUgKzMxODQsMTUgQEAKIAkJCXJlZnJlc2hfcmF0ZXNfYnVmLCBsY2RfcmVmcmVzaF9yYXRlc1tkZWZhdWx0X3JlZnJlc2hfcmF0ZV0pOwogCQlwYXItPmxjZF9yZWZyZXNocmF0ZSA9IGxjZF9yZWZyZXNoX3JhdGVzW2RlZmF1bHRfcmVmcmVzaF9yYXRlXTsKIAkJLyogV2Ugbm93IG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSBjcnRjIHBhcmFtZXRlcnMgZm9yIHRoZQotCQkgKiBsY2QgbW9uaXRvci4gVGhpcyBpcyB0cmlja3ksIGJlY2F1c2UgdGhleSBhcmUgbm90IHN0b3JlZAorCQkgKiBMQ0QgbW9uaXRvci4gVGhpcyBpcyB0cmlja3ksIGJlY2F1c2UgdGhleSBhcmUgbm90IHN0b3JlZAogCQkgKiBpbmRpdmlkdWFsbHkgaW4gdGhlIEJJT1MuIEluc3RlYWQsIHRoZSBCSU9TIGNvbnRhaW5zIGEKIAkJICogdGFibGUgb2YgZGlzcGxheSBtb2RlcyB0aGF0IHdvcmsgZm9yIHRoaXMgbW9uaXRvci4KIAkJICoKIAkJICogVGhlIGlkZWEgaXMgdGhhdCB3ZSBzZWFyY2ggZm9yIGEgbW9kZSBvZiB0aGUgc2FtZSBkaW1lbnNpb25zCi0JCSAqIGFzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBsY2QgbW9uaXRvci4gU2F5IG91ciBsY2QgbW9uaXRvcgorCQkgKiBhcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgTENEIG1vbml0b3IuIFNheSBvdXIgTENEIG1vbml0b3IKIAkJICogaXMgODAweDYwMCBwaXhlbHMsIHdlIHNlYXJjaCBmb3IgYSA4MDB4NjAwIG1vbml0b3IuCiAJCSAqIFRoZSBDUlRDIHBhcmFtZXRlcnMgd2UgZmluZCBoZXJlIGFyZSB0aGUgb25lcyB0aGF0IHdlIG5lZWQKLQkJICogdG8gdXNlIHRvIHNpbXVsYXRlIG90aGVyIHJlc29sdXRpb25zIG9uIHRoZSBsY2Qgc2NyZWVuLgorCQkgKiB0byB1c2UgdG8gc2ltdWxhdGUgb3RoZXIgcmVzb2x1dGlvbnMgb24gdGhlIExDRCBzY3JlZW4uCiAJCSAqLwogCQlsY2Rtb2RlcHRyID0gKHUxNiAqKShwYXItPmxjZF90YWJsZSArIDY0KTsKIAkJd2hpbGUgKCpsY2Rtb2RlcHRyICE9IDApIHsKQEAgLTM0NzIsNyArMzQ5OSw3IEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGF0eWZiX2F0YXJpX3Byb2JlKHZvaWQpCiB7Ci0Jc3RydWN0IGF0eV9wYXIgKnBhcjsKKwlzdHJ1Y3QgYXR5ZmJfcGFyICpwYXI7CiAJc3RydWN0IGZiX2luZm8gKmluZm87CiAJaW50IG02NF9udW07CiAJdTMyIGNsb2NrX3I7CkBAIC0zNjkyLDkgKzM3MTksNyBAQAogICAgIGF0eWZiX3NldHVwKG9wdGlvbik7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19QQ0kKICAgICBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhdHlmYl9kcml2ZXIpOwotI2VuZGlmCiAjaWZkZWYgQ09ORklHX0FUQVJJCiAgICAgYXR5ZmJfYXRhcmlfcHJvYmUoKTsKICNlbmRpZgpAQCAtMzcwMyw5ICszNzI4LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGF0eWZiX2V4aXQodm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfUENJCiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhdHlmYl9kcml2ZXIpOwotI2VuZGlmCiB9CiAKIG1vZHVsZV9pbml0KGF0eWZiX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvbWFjaDY0X2N0LmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9tYWNoNjRfY3QuYwppbmRleCA5YmRiMmFhLi5lNzA1NjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9tYWNoNjRfY3QuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9tYWNoNjRfY3QuYwpAQCAtMjA2LDkgKzIwNiw3IEBACiB7CiAJdTMyIHE7CiAJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwotI2lmZGVmIERFQlVHCiAJaW50IHBsbHZjbGs7Ci0jZW5kaWYKIAogCS8qIEZJWE1FOiB1c2UgdGhlIFZUQi9HVEIgL3szLDYsMTJ9IHBvc3QgZGl2aWRlcnMgaWYgdGhleSdyZSBiZXR0ZXIgc3VpdGVkICovCiAJcSA9IHBhci0+cmVmX2Nsa19wZXIgKiBwbGwtPnBsbF9yZWZfZGl2ICogNCAvIHZjbGtfcGVyOwpAQCAtMjIzLDEzICsyMjEsMjYgQEAKIAlwbGwtPnZjbGtfcG9zdF9kaXZfcmVhbCA9IHBvc3RkaXZpZGVyc1twbGwtPnZjbGtfcG9zdF9kaXZdOwogCS8vICAgIHBsbC0+dmNsa19wb3N0X2RpdiA8PD0gNjsKIAlwbGwtPnZjbGtfZmJfZGl2ID0gcSAqIHBsbC0+dmNsa19wb3N0X2Rpdl9yZWFsIC8gODsKLSNpZmRlZiBERUJVRwogCXBsbHZjbGsgPSAoMTAwMDAwMCAqIDIgKiBwbGwtPnZjbGtfZmJfZGl2KSAvCiAJCShwYXItPnJlZl9jbGtfcGVyICogcGxsLT5wbGxfcmVmX2Rpdik7CisjaWZkZWYgREVCVUcKIAlwcmludGsoImF0eWZiKCVzKTogcGxsdmNsaz0lZCBNSHosIHZjbGs9JWQgTUh6XG4iLAogCQlfX0ZVTkNUSU9OX18sIHBsbHZjbGssIHBsbHZjbGsgLyBwbGwtPnZjbGtfcG9zdF9kaXZfcmVhbCk7CiAjZW5kaWYKIAlwbGwtPnBsbF92Y2xrX2NudGwgPSAweDAzOyAvKiBWQ0xLID0gUExMX1ZDTEsvVkNMS3hfUE9TVCAqLworCisJLyogU2V0IEVDUCAoc2NhbGVyL292ZXJsYXkgY2xvY2spIGRpdmlkZXIgKi8KKwlpZiAocGFyLT5wbGxfbGltaXRzLmVjcF9tYXgpIHsKKwkJaW50IGVjcCA9IHBsbHZjbGsgLyBwbGwtPnZjbGtfcG9zdF9kaXZfcmVhbDsKKwkJaW50IGVjcF9kaXYgPSAwOworCisJCXdoaWxlIChlY3AgPiBwYXItPnBsbF9saW1pdHMuZWNwX21heCAmJiBlY3BfZGl2IDwgMikgeworCQkJZWNwID4+PSAxOworCQkJZWNwX2RpdisrOworCQl9CisJCXBsbC0+cGxsX3ZjbGtfY250bCB8PSBlY3BfZGl2IDw8IDQ7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYXNlLmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYmFzZS5jCmluZGV4IDE1NmRiODQuLmM5ZjBjNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYXNlLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2Jhc2UuYwpAQCAtODY0LDggKzg2NCw4IEBACiB9CiAKIAotc3RhdGljIGludCByYWRlb25mYl9pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZiX2luZm8gKmluZm8pCitzdGF0aWMgaW50IHJhZGVvbmZiX2lvY3RsIChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewogICAgICAgICBzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8gPSBpbmZvLT5wYXI7CiAJdW5zaWduZWQgaW50IHRtcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9tb25pdG9yLmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fbW9uaXRvci5jCmluZGV4IGVhN2M4NjMuLjdmOTgzOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9tb25pdG9yLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX21vbml0b3IuYwpAQCAtNDIzLDcgKzQyMyw3IEBACiAvKgogICogUHJvYmUgZGlzcGxheSBvbiBib3RoIHByaW1hcnkgYW5kIHNlY29uZGFyeSBjYXJkJ3MgY29ubmVjdG9yIChpZiBhbnkpCiAgKiBieSB2YXJpb3VzIGF2YWlsYWJsZSB0ZWNobmlxdWVzIChpMmMsIE9GIGRldmljZSB0cmVlLCBCSU9TLCAuLi4pIGFuZAotICogdHJ5IHRvIHJldHJlaXZlIEVESUQuIFRoZSBhbGdvcml0aG0gaGVyZSBjb21lcyBmcm9tIFhGcmVlJ3MgcmFkZW9uCisgKiB0cnkgdG8gcmV0cmlldmUgRURJRC4gVGhlIGFsZ29yaXRobSBoZXJlIGNvbWVzIGZyb20gWEZyZWUncyByYWRlb24KICAqIGRyaXZlcgogICovCiB2b2lkIF9fZGV2aW5pdCByYWRlb25fcHJvYmVfc2NyZWVucyhzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fcG0uYyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9wbS5jCmluZGV4IDA5N2Q2NjguLjU1Njg5NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9wbS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9wbS5jCkBAIC0yNzM0LDcgKzI3MzQsNyBAQAogCSAqIEJJT1MgZG9lcyB0aG8uIFJpZ2h0IG5vdywgYWxsIHRoaXMgUE0gc3R1ZmYgaXMgcG1hYy1vbmx5IGZvciB0aGF0CiAJICogcmVhc29uLiAtLUJlbkgKIAkgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19QTSkgJiYgZGVmaW5lZChDT05GSUdfUFBDX09GKQorI2lmIGRlZmluZWQoQ09ORklHX1BNKSAmJiBkZWZpbmVkKENPTkZJR19QUENfUE1BQykKIAlpZiAoX21hY2hpbmUgPT0gX01BQ0hfUG1hYyAmJiByaW5mby0+b2Zfbm9kZSkgewogCQlpZiAocmluZm8tPmlzX21vYmlsaXR5ICYmIHJpbmZvLT5wbV9yZWcgJiYKIAkJICAgIHJpbmZvLT5mYW1pbHkgPD0gQ0hJUF9GQU1JTFlfUlYyNTApCkBAIC0yNzc4LDEyICsyNzc4LDEyIEBACiAJCU9VVFJFRyhUVl9EQUNfQ05UTCwgSU5SRUcoVFZfREFDX0NOVEwpIHwgMHgwNzAwMDAwMCk7CiAjZW5kaWYKIAl9Ci0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUE0pICYmIGRlZmluZWQoQ09ORklHX1BQQ19PRikgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19QTSkgJiYgZGVmaW5lZChDT05GSUdfUFBDX1BNQUMpICovCiB9CiAKIHZvaWQgcmFkZW9uZmJfcG1fZXhpdChzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8pCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfUE0pICYmIGRlZmluZWQoQ09ORklHX1BQQ19PRikKKyNpZiBkZWZpbmVkKENPTkZJR19QTSkgJiYgZGVmaW5lZChDT05GSUdfUFBDX1BNQUMpCiAJaWYgKHJpbmZvLT5wbV9tb2RlICE9IHJhZGVvbl9wbV9ub25lKQogCQlwbWFjX3NldF9lYXJseV92aWRlb19yZXN1bWUoTlVMTCwgTlVMTCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L3hsaW5pdC5jIGIvZHJpdmVycy92aWRlby9hdHkveGxpbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODVjYmYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy92aWRlby9hdHkveGxpbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyoKLSAqICBBVEkgUmFnZSBYTCBJbml0aWFsaXphdGlvbi4gU3VwcG9ydCBmb3IgWHBlcnQ5OCBhbmQgVmljdG9yaWEKLSAqICBQQ0kgY2FyZHMuCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMiBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSAqICBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KLSAqICAgICAgICAgCXN0ZXZlbEBtdmlzdGEuY29tIG9yIHNvdXJjZUBtdmlzdGEuY29tCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPiAKLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZmIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8dmlkZW8vbWFjaDY0Lmg+Ci0jaW5jbHVkZSAiYXR5ZmIuaCIKLQotI2RlZmluZSBNUExMX0dBSU4gICAgICAgMHhhZAotI2RlZmluZSBWUExMX0dBSU4gICAgICAgMHhkNQotCi1lbnVtIHsKLQlWSUNUT1JJQSA9IDAsCi0JWFBFUlQ5OCwKLQlOVU1fWExfQ0FSRFMKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgYXR5X3BsbF9vcHMgYXR5X3BsbF9jdDsKLQotI2RlZmluZSBERUZBVUxUX0NBUkQgWFBFUlQ5OAotc3RhdGljIGludCB4bF9jYXJkID0gREVGQVVMVF9DQVJEOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHhsX2NhcmRfY2ZnX3QgewotCWludCByZWZfY3J5c3RhbDsgLy8gMTBeNCBIegotCWludCBtZW1fdHlwZTsKLQlpbnQgbWVtX3NpemU7Ci0JdTMyIG1lbV9jbnRsOwotCXUzMiBleHRfbWVtX2NudGw7Ci0JdTMyIG1lbV9hZGRyX2NvbmZpZzsKLQl1MzIgYnVzX2NudGw7Ci0JdTMyIGRhY19jbnRsOwotCXUzMiBod19kZWJ1ZzsKLQl1MzIgY3VzdG9tX21hY3JvX2NudGw7Ci0JdTggIGRsbDJfY250bDsKLQl1OCAgcGxsX3ljbGtfY250bDsKLX0gY2FyZF9jZmdbTlVNX1hMX0NBUkRTXSA9IHsKLQkvLyBWSUNUT1JJQQotCXsJMjcwMCwgU0RSQU0sIDB4ODAwMDAwLAotCQkweDEwNzU3QTNCLCAweDY0MDAwQzgxLCAweDAwMTEwMjAyLCAweDdiMzNBMDQwLAotCQkweDgyMDEwMTAyLCAweDQ4ODAzODAwLCAweDAwNUUwMTc5LAotCQkweDUwLCAweDI1Ci0JfSwKLQkvLyBYUEVSVDk4Ci0JewkxNDMyLCAgV1JBTSwgMHg4MDAwMDAsCi0JCTB4MDAxNjVBMkIsIDB4RTAwMDBDRjEsIDB4MDAyMDAyMTMsIDB4NzMzM0EwMDEsCi0JCTB4ODAwMDAwMEEsIDB4NDg4MzM4MDAsIDB4MDA3RjA3NzksCi0JCTB4MTAsIDB4MTkKLQl9Ci19OwotCSAgCi10eXBlZGVmIHN0cnVjdCB7Ci0JdTggbGNkX3JlZzsKLQl1MzIgdmFsOwotfSBsY2RfdGJsX3Q7Ci0KLXN0YXRpYyBjb25zdCBsY2RfdGJsX3QgbGNkX3RibFtdID0gewotCXsgMHgwMSwJMHgwMDA1MjBDMCB9LAotCXsgMHgwOCwJMHgwMjAwMDQwOCB9LAotCXsgMHgwMywJMHgwMDAwMEYwMCB9LAotCXsgMHgwMCwJMHgwMDAwMDAwMCB9LAotCXsgMHgwMiwJMHgwMDAwMDAwMCB9LAotCXsgMHgwNCwJMHgwMDAwMDAwMCB9LAotCXsgMHgwNSwJMHgwMDAwMDAwMCB9LAotCXsgMHgwNiwJMHgwMDAwMDAwMCB9LAotCXsgMHgzMywJMHgwMDAwMDAwMCB9LAotCXsgMHgzNCwJMHgwMDAwMDAwMCB9LAotCXsgMHgzNSwJMHgwMDAwMDAwMCB9LAotCXsgMHgzNiwJMHgwMDAwMDAwMCB9LAotCXsgMHgzNywJMHgwMDAwMDAwMCB9Ci19OwotCi1zdGF0aWMgdm9pZCByZXNldF9ndWkoc3RydWN0IGF0eWZiX3BhciAqcGFyKQotewotCWF0eV9zdF84KEdFTl9URVNUX0NOVEwrMSwgMHgwMSwgcGFyKTsKLQlhdHlfc3RfOChHRU5fVEVTVF9DTlRMKzEsIDB4MDAsIHBhcik7Ci0JYXR5X3N0XzgoR0VOX1RFU1RfQ05UTCsxLCAweDAyLCBwYXIpOwotCW1kZWxheSg1KTsKLX0KLQotc3RhdGljIHZvaWQgcmVzZXRfc2RyYW0oc3RydWN0IGF0eWZiX3BhciAqcGFyKQotewotCXU4IHRlbXA7Ci0KLQl0ZW1wID0gYXR5X2xkXzgoRVhUX01FTV9DTlRMLCBwYXIpOwotCXRlbXAgfD0gMHgwMjsKLQlhdHlfc3RfOChFWFRfTUVNX0NOVEwsIHRlbXAsIHBhcik7IC8vIE1FTV9TRFJBTV9SRVNFVCA9IDFiCi0JdGVtcCB8PSAweDA4OwotCWF0eV9zdF84KEVYVF9NRU1fQ05UTCwgdGVtcCwgcGFyKTsgLy8gTUVNX0NZQ19URVNUICAgID0gMTBiCi0JdGVtcCB8PSAweDBjOwotCWF0eV9zdF84KEVYVF9NRU1fQ05UTCwgdGVtcCwgcGFyKTsgLy8gTUVNX0NZQ19URVNUICAgID0gMTFiCi0JbWRlbGF5KDUpOwotCXRlbXAgJj0gMHhmMzsKLQlhdHlfc3RfOChFWFRfTUVNX0NOVEwsIHRlbXAsIHBhcik7IC8vIE1FTV9DWUNfVEVTVCAgICA9IDAwYgotCXRlbXAgJj0gMHhmZDsKLQlhdHlfc3RfOChFWFRfTUVNX0NOVEwsIHRlbXAsIHBhcik7IC8vIE1FTV9TRFJBTV9SRVNUICA9IDBiCi0JbWRlbGF5KDUpOwotfQotCi1zdGF0aWMgdm9pZCBpbml0X2RsbChzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIpCi17Ci0JLy8gZW5hYmxlIERMTAotCWF0eV9zdF9wbGxfY3QoUExMX0dFTl9DTlRMLAotCQkgICBhdHlfbGRfcGxsX2N0KFBMTF9HRU5fQ05UTCwgcGFyKSAmIDB4N2YsCi0JCSAgIHBhcik7Ci0KLQkvLyByZXNldCBETEwKLQlhdHlfc3RfcGxsX2N0KERMTF9DTlRMLCAweDgyLCBwYXIpOwotCWF0eV9zdF9wbGxfY3QoRExMX0NOVEwsIDB4RTIsIHBhcik7Ci0JbWRlbGF5KDUpOwotCWF0eV9zdF9wbGxfY3QoRExMX0NOVEwsIDB4ODIsIHBhcik7Ci0JbWRlbGF5KDYpOwotfQotCi1zdGF0aWMgdm9pZCByZXNldF9jbG9ja3Moc3RydWN0IGF0eWZiX3BhciAqcGFyLCBzdHJ1Y3QgcGxsX2N0ICpwbGwsCi0JCQkgaW50IGhzeW5jX2VuYikKLXsKLQlyZXNldF9ndWkocGFyKTsKLQlhdHlfc3RfcGxsX2N0KE1DTEtfRkJfRElWLCBwbGwtPm1jbGtfZmJfZGl2LCBwYXIpOwotCWF0eV9zdF9wbGxfY3QoU0NMS19GQl9ESVYsIHBsbC0+c2Nsa19mYl9kaXYsIHBhcik7Ci0KLQltZGVsYXkoMTUpOwotCWluaXRfZGxsKHBhcik7Ci0JYXR5X3N0XzgoR0VOX1RFU1RfQ05UTCsxLCAweDAwLCBwYXIpOwotCW1kZWxheSg1KTsKLQlhdHlfc3RfOChDUlRDX0dFTl9DTlRMKzMsIDB4MDQsIHBhcik7Ci0JbWRlbGF5KDYpOwotCXJlc2V0X3NkcmFtKHBhcik7Ci0JYXR5X3N0XzgoQ1JUQ19HRU5fQ05UTCszLAotCQkgaHN5bmNfZW5iID8gMHgwMCA6IDB4MDQsIHBhcik7Ci0KLQlhdHlfc3RfcGxsX2N0KFNQTExfQ05UTDIsIHBsbC0+c3BsbF9jbnRsMiwgcGFyKTsKLQlhdHlfc3RfcGxsX2N0KFBMTF9HRU5fQ05UTCwgcGxsLT5wbGxfZ2VuX2NudGwsIHBhcik7Ci0JYXR5X3N0X3BsbF9jdChQTExfVkNMS19DTlRMLCBwbGwtPnBsbF92Y2xrX2NudGwsIHBhcik7Ci19Ci0KLWludCBhdHlmYl94bF9pbml0KHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCWNvbnN0IHN0cnVjdCB4bF9jYXJkX2NmZ190ICogY2FyZCA9ICZjYXJkX2NmZ1t4bF9jYXJkXTsKLQlzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7Ci0JdW5pb24gYXR5X3BsbCBwbGw7Ci0JaW50IGVycjsKLQl1MzIgdGVtcDsKLQkKLQlhdHlfc3RfOChDT05GSUdfU1RBVDAsIDB4ODUsIHBhcik7Ci0JbWRlbGF5KDEwKTsKLQotCS8qCi0JICogVGhlIGZvbGxvd2luZyBuZWVkcyB0byBiZSBzZXQgYmVmb3JlIHRoZSBjYWxsCi0JICogdG8gdmFyX3RvX3BsbCgpIGJlbG93LiBUaGV5J2xsIGJlIHJlLXNldCBhZ2FpbgotCSAqIHRvIHRoZSBzYW1lIHZhbHVlcyBpbiBhdHlfaW5pdCgpLgotCSAqLwotCXBhci0+cmVmX2Nsa19wZXIgPSAxMDAwMDAwMDBVTC9jYXJkLT5yZWZfY3J5c3RhbDsKLQlwYXItPnJhbV90eXBlID0gY2FyZC0+bWVtX3R5cGU7Ci0JaW5mby0+Zml4LnNtZW1fbGVuID0gY2FyZC0+bWVtX3NpemU7Ci0JaWYgKHhsX2NhcmQgPT0gVklDVE9SSUEpIHsKLQkJLy8gdGhlIE1DTEssIFhDTEsgYXJlIDEyME1IeiBvbiB2aWN0b3JpYSBjYXJkCi0JCXBhci0+bWNsa19wZXIgPSAxMDAwMDAwLzEyMDsKLQkJcGFyLT54Y2xrX3BlciA9IDEwMDAwMDAvMTIwOwotCQlwYXItPmZlYXR1cmVzICY9IH5NNjRGX01GQl9GT1JDRV80OwotCX0KLQkKLQkvKgotCSAqIENhbGN1bGF0ZSBtY2xrIGFuZCB4Y2xrIGRpdmlkZXJzLCBldGMuIFRoZSBwYXNzZWQKLQkgKiBwaXhjbG9jayBhbmQgYnBwIHZhbHVlcyBkb24ndCBtYXR0ZXIgeWV0LCB0aGUgdmNsawotCSAqIGlzbid0IHByb2dyYW1tZWQgdW50aWwgbGF0ZXIuCi0JICovCi0JaWYgKChlcnIgPSBhdHlfcGxsX2N0LnZhcl90b19wbGwoaW5mbywgMzk3MjYsIDgsICZwbGwpKSkKLQkJcmV0dXJuIGVycjsKLQotCWF0eV9zdF9wbGxfY3QoTFZEU19DTlRMMCwgMHgwMCwgcGFyKTsKLQlhdHlfc3RfcGxsX2N0KERMTDJfQ05UTCwgY2FyZC0+ZGxsMl9jbnRsLCBwYXIpOwotCWF0eV9zdF9wbGxfY3QoVjJQTExfQ05UTCwgMHgxMCwgcGFyKTsKLQlhdHlfc3RfcGxsX2N0KE1QTExfQ05UTCwgTVBMTF9HQUlOLCBwYXIpOwotCWF0eV9zdF9wbGxfY3QoVlBMTF9DTlRMLCBWUExMX0dBSU4sIHBhcik7Ci0JYXR5X3N0X3BsbF9jdChQTExfVkNMS19DTlRMLCAweDAwLCBwYXIpOwotCWF0eV9zdF9wbGxfY3QoVkZDX0NOVEwsIDB4MUIsIHBhcik7Ci0JYXR5X3N0X3BsbF9jdChQTExfUkVGX0RJViwgcGxsLmN0LnBsbF9yZWZfZGl2LCBwYXIpOwotCWF0eV9zdF9wbGxfY3QoUExMX0VYVF9DTlRMLCBwbGwuY3QucGxsX2V4dF9jbnRsLCBwYXIpOwotCWF0eV9zdF9wbGxfY3QoU1BMTF9DTlRMMiwgMHgwMywgcGFyKTsKLQlhdHlfc3RfcGxsX2N0KFBMTF9HRU5fQ05UTCwgMHg0NCwgcGFyKTsKLQotCXJlc2V0X2Nsb2NrcyhwYXIsICZwbGwuY3QsIDApOwotCW1kZWxheSgxMCk7Ci0KLQlhdHlfc3RfcGxsX2N0KFZDTEtfUE9TVF9ESVYsIDB4MDMsIHBhcik7Ci0JYXR5X3N0X3BsbF9jdChWQ0xLMF9GQl9ESVYsIDB4REEsIHBhcik7Ci0JYXR5X3N0X3BsbF9jdChWQ0xLX1BPU1RfRElWLCAweDBGLCBwYXIpOwotCWF0eV9zdF9wbGxfY3QoVkNMSzFfRkJfRElWLCAweEY1LCBwYXIpOwotCWF0eV9zdF9wbGxfY3QoVkNMS19QT1NUX0RJViwgMHgzRiwgcGFyKTsKLQlhdHlfc3RfcGxsX2N0KFBMTF9FWFRfQ05UTCwgMHg0MCB8IHBsbC5jdC5wbGxfZXh0X2NudGwsIHBhcik7Ci0JYXR5X3N0X3BsbF9jdChWQ0xLMl9GQl9ESVYsIDB4MDAsIHBhcik7Ci0JYXR5X3N0X3BsbF9jdChWQ0xLX1BPU1RfRElWLCAweEZGLCBwYXIpOwotCWF0eV9zdF9wbGxfY3QoUExMX0VYVF9DTlRMLCAweEMwIHwgcGxsLmN0LnBsbF9leHRfY250bCwgcGFyKTsKLQlhdHlfc3RfcGxsX2N0KFZDTEszX0ZCX0RJViwgMHgwMCwgcGFyKTsKLQotCWF0eV9zdF84KEJVU19DTlRMLCAweDAxLCBwYXIpOwotCWF0eV9zdF9sZTMyKEJVU19DTlRMLCBjYXJkLT5idXNfY250bCB8IDB4MDgwMDAwMDAsIHBhcik7Ci0KLQlhdHlfc3RfbGUzMihDUlRDX0dFTl9DTlRMLCAweDA0MDAwMjAwLCBwYXIpOwotCWF0eV9zdF9sZTE2KENPTkZJR19TVEFUMCwgMHgwMDIwLCBwYXIpOwotCWF0eV9zdF9sZTMyKE1FTV9DTlRMLCAweDEwMTUxQTMzLCBwYXIpOwotCWF0eV9zdF9sZTMyKEVYVF9NRU1fQ05UTCwgMHhFMDAwMEMwMSwgcGFyKTsKLQlhdHlfc3RfbGUxNihDUlRDX0dFTl9DTlRMKzIsIDB4MDAwMCwgcGFyKTsKLQlhdHlfc3RfbGUzMihEQUNfQ05UTCwgY2FyZC0+ZGFjX2NudGwsIHBhcik7Ci0JYXR5X3N0X2xlMTYoR0VOX1RFU1RfQ05UTCwgMHgwMTAwLCBwYXIpOwotCWF0eV9zdF9sZTMyKENVU1RPTV9NQUNST19DTlRMLCAweDAwM0MwMTcxLCBwYXIpOwotCWF0eV9zdF9sZTMyKE1FTV9CVUZfQ05UTCwgMHgwMDM4Mjg0OCwgcGFyKTsKLQotCWF0eV9zdF9sZTMyKEhXX0RFQlVHLCBjYXJkLT5od19kZWJ1ZywgcGFyKTsKLQlhdHlfc3RfbGUxNihNRU1fQUREUl9DT05GSUcsIDB4MDAwMCwgcGFyKTsKLQlhdHlfc3RfbGUxNihHUF9JTysyLCAweDAwMDAsIHBhcik7Ci0JYXR5X3N0X2xlMTYoR0VOX1RFU1RfQ05UTCwgMHgwMDAwLCBwYXIpOwotCWF0eV9zdF9sZTE2KEVYVF9EQUNfUkVHUysyLCAweDAwMDAsIHBhcik7Ci0JYXR5X3N0X2xlMzIoQ1JUQ19JTlRfQ05UTCwgMHgwMDAwMDAwMCwgcGFyKTsKLQlhdHlfc3RfbGUzMihUSU1FUl9DT05GSUcsIDB4MDAwMDAwMDAsIHBhcik7Ci0JYXR5X3N0X2xlMzIoMHhFQywgMHgwMDAwMDAwMCwgcGFyKTsKLQlhdHlfc3RfbGUzMigweEZDLCAweDAwMDAwMDAwLCBwYXIpOwotCi0jaWYgZGVmaW5lZCAoQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRCkKLQl7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxjZF90YmwpOyBpKyspCi0JCQlhdHlfc3RfbGNkKGxjZF90YmxbaV0ubGNkX3JlZywgbGNkX3RibFtpXS52YWwsIHBhcik7Ci0JfQotI2VuZGlmCi0KLQlhdHlfc3RfbGUxNihDT05GSUdfU1RBVDAsIDB4MDBBNCwgcGFyKTsKLQltZGVsYXkoMTApOwotCi0JYXR5X3N0XzgoQlVTX0NOVEwrMSwgMHhBMCwgcGFyKTsKLQltZGVsYXkoMTApOwotCQotCXJlc2V0X2Nsb2NrcyhwYXIsICZwbGwuY3QsIDEpOwotCW1kZWxheSgxMCk7Ci0KLQkvLyBzb21ldGhpbmcgYWJvdXQgcG93ZXIgbWFuYWdlbWVudAotCWF0eV9zdF84KExDRF9JTkRFWCwgMHgwOCwgcGFyKTsKLQlhdHlfc3RfOChMQ0RfREFUQSwgMHgwQSwgcGFyKTsKLQlhdHlfc3RfOChMQ0RfSU5ERVgsIDB4MDgsIHBhcik7Ci0JYXR5X3N0XzgoTENEX0RBVEErMywgMHgwMiwgcGFyKTsKLQlhdHlfc3RfOChMQ0RfSU5ERVgsIDB4MDgsIHBhcik7Ci0JYXR5X3N0XzgoTENEX0RBVEEsIDB4MEIsIHBhcik7Ci0JbWRlbGF5KDIpOwotCQotCS8vIGVuYWJsZSBkaXNwbGF5IHJlcXVlc3RzLCBlbmFibGUgQ1JUQwotCWF0eV9zdF84KENSVENfR0VOX0NOVEwrMywgMHgwMiwgcGFyKTsKLQkvLyBkaXNhYmxlIGRpc3BsYXkKLQlhdHlfc3RfOChDUlRDX0dFTl9DTlRMLCAweDQwLCBwYXIpOwotCS8vIGRpc2FibGUgZGlzcGxheSByZXF1ZXN0cywgZGlzYWJsZSBDUlRDCi0JYXR5X3N0XzgoQ1JUQ19HRU5fQ05UTCszLCAweDA0LCBwYXIpOwotCW1kZWxheSgxMCk7Ci0KLQlhdHlfc3RfcGxsX2N0KFBMTF9ZQ0xLX0NOVEwsIDB4MjUsIHBhcik7Ci0KLQlhdHlfc3RfbGUxNihDVVNUT01fTUFDUk9fQ05UTCwgMHgwMTc5LCBwYXIpOwotCWF0eV9zdF9sZTE2KENVU1RPTV9NQUNST19DTlRMKzIsIDB4MDA1RSwgcGFyKTsKLQlhdHlfc3RfbGUxNihDVVNUT01fTUFDUk9fQ05UTCsyLCBjYXJkLT5jdXN0b21fbWFjcm9fY250bD4+MTYsIHBhcik7Ci0JYXR5X3N0XzgoQ1VTVE9NX01BQ1JPX0NOVEwrMSwKLQkJIChjYXJkLT5jdXN0b21fbWFjcm9fY250bD4+OCkgJiAweGZmLCBwYXIpOwotCi0JYXR5X3N0X2xlMzIoTUVNX0FERFJfQ09ORklHLCBjYXJkLT5tZW1fYWRkcl9jb25maWcsIHBhcik7Ci0JYXR5X3N0X2xlMzIoTUVNX0NOVEwsIGNhcmQtPm1lbV9jbnRsLCBwYXIpOwotCWF0eV9zdF9sZTMyKEVYVF9NRU1fQ05UTCwgY2FyZC0+ZXh0X21lbV9jbnRsLCBwYXIpOwotCi0JYXR5X3N0XzgoQ09ORklHX1NUQVQwLCAweEEwIHwgY2FyZC0+bWVtX3R5cGUsIHBhcik7Ci0KLQlhdHlfc3RfcGxsX2N0KFBMTF9ZQ0xLX0NOVEwsIDB4MDEsIHBhcik7Ci0JbWRlbGF5KDE1KTsKLQlhdHlfc3RfcGxsX2N0KFBMTF9ZQ0xLX0NOVEwsIGNhcmQtPnBsbF95Y2xrX2NudGwsIHBhcik7Ci0JbWRlbGF5KDEpOwotCQotCXJlc2V0X2Nsb2NrcyhwYXIsICZwbGwuY3QsIDApOwotCW1kZWxheSg1MCk7Ci0JcmVzZXRfY2xvY2tzKHBhciwgJnBsbC5jdCwgMCk7Ci0JbWRlbGF5KDUwKTsKLQotCS8vIGVuYWJsZSBleHRlbmRlZCByZWdpc3RlciBibG9jawotCWF0eV9zdF84KEJVU19DTlRMKzMsIDB4N0IsIHBhcik7Ci0JbWRlbGF5KDEpOwotCS8vIGRpc2FibGUgZXh0ZW5kZWQgcmVnaXN0ZXIgYmxvY2sKLQlhdHlfc3RfOChCVVNfQ05UTCszLCAweDczLCBwYXIpOwotCi0JYXR5X3N0XzgoQ09ORklHX1NUQVQwLCAweDgwIHwgY2FyZC0+bWVtX3R5cGUsIHBhcik7Ci0KLQkvLyBkaXNhYmxlIGRpc3BsYXkgcmVxdWVzdHMsIGRpc2FibGUgQ1JUQwotCWF0eV9zdF84KENSVENfR0VOX0NOVEwrMywgMHgwNCwgcGFyKTsKLQkvLyBkaXNhYmxlIG1hcHBpbmcgcmVnaXN0ZXJzIGluIFZHQSBhcGVydHVyZQotCWF0eV9zdF84KENPTkZJR19DTlRMLCBhdHlfbGRfOChDT05GSUdfQ05UTCwgcGFyKSAmIH4weDA0LCBwYXIpOwotCW1kZWxheSg1MCk7Ci0JLy8gZW5hYmxlIGRpc3BsYXkgcmVxdWVzdHMsIGVuYWJsZSBDUlRDCi0JYXR5X3N0XzgoQ1JUQ19HRU5fQ05UTCszLCAweDAyLCBwYXIpOwotCi0JLy8gbWFrZSBHUElPJ3MgMTQsMTUsMTYgYWxsIGlucHV0cwotCWF0eV9zdF84KExDRF9JTkRFWCwgMHgwNywgcGFyKTsKLQlhdHlfc3RfOChMQ0RfREFUQSszLCAweDAwLCBwYXIpOwotCi0JLy8gZW5hYmxlIHRoZSBkaXNwbGF5Ci0JYXR5X3N0XzgoQ1JUQ19HRU5fQ05UTCwgMHgwMCwgcGFyKTsKLQltZGVsYXkoMTcpOwotCS8vIHJlc2V0IHRoZSBtZW1vcnkgY29udHJvbGxlcgotCWF0eV9zdF84KEdFTl9URVNUX0NOVEwrMSwgMHgwMiwgcGFyKTsKLQltZGVsYXkoMTUpOwotCWF0eV9zdF84KEdFTl9URVNUX0NOVEwrMSwgMHgwMCwgcGFyKTsKLQltZGVsYXkoMzApOwotCi0JLy8gZW5hYmxlIGV4dGVuZGVkIHJlZ2lzdGVyIGJsb2NrCi0JYXR5X3N0XzgoQlVTX0NOVEwrMywKLQkJICh1OCkoYXR5X2xkXzgoQlVTX0NOVEwrMywgcGFyKSB8IDB4MDgpLAotCQkgcGFyKTsKLQkvLyBzZXQgRklGTyBzaXplIHRvIDUxMiAoUElPKQotCWF0eV9zdF9sZTMyKEdVSV9DTlRMLAotCQkgICAgYXR5X2xkX2xlMzIoR1VJX0NOVEwsIHBhcikgJiB+MHgzLAotCQkgICAgcGFyKTsKLQotCS8vIGVuYWJsZSBDUlQgYW5kIGRpc2FibGUgbGNkCi0JYXR5X3N0XzgoTENEX0lOREVYLCAweDAxLCBwYXIpOwotCXRlbXAgPSBhdHlfbGRfbGUzMihMQ0RfREFUQSwgcGFyKTsKLQl0ZW1wID0gKHRlbXAgfCAweDAxKSAmIH4weDAyOwotCWF0eV9zdF9sZTMyKExDRF9EQVRBLCB0ZW1wLCBwYXIpOwotCXJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F1MTEwMGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2F1MTEwMGZiLmMKaW5kZXggYTUxMjk4MC4uMjQwNjg5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdTExMDBmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXUxMTAwZmIuYwpAQCAtMzc5LDcgKzM3OSw3IEBACiAgKiBNYXAgdmlkZW8gbWVtb3J5IGluIHVzZXIgc3BhY2UuIFdlIGRvbid0IHVzZSB0aGUgZ2VuZXJpYyBmYl9tbWFwIG1ldGhvZCBtYWlubHkKICAqIHRvIGFsbG93IHRoZSB1c2Ugb2YgdGhlIFRMQiBzdHJlYW1pbmcgZmxhZyAoQ0NBPTYpCiAgKi8KLWludCBhdTExMDBmYl9mYl9tbWFwKHN0cnVjdCBmYl9pbmZvICpmYmksIHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK2ludCBhdTExMDBmYl9mYl9tbWFwKHN0cnVjdCBmYl9pbmZvICpmYmksIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXN0cnVjdCBhdTExMDBmYl9kZXZpY2UgKmZiZGV2ID0gdG9fYXUxMTAwZmJfZGV2aWNlKGZiaSk7CiAJdW5zaWduZWQgaW50IGxlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2NvcmdpX2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9jb3JnaV9ibC5jCmluZGV4IDZhMjE5YjIuLmQwYWFmNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2NvcmdpX2JsLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvY29yZ2lfYmwuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgogCiAjaW5jbHVkZSA8YXNtL2FyY2gvc2hhcnBzbC5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zaGFycHNsX3BtLmg+CiAKICNkZWZpbmUgQ09SR0lfREVGQVVMVF9JTlRFTlNJVFkJCTB4MWYKICNkZWZpbmUgQ09SR0lfTElNSVRfTUFTSwkJMHgwYgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9idzIuYyBiL2RyaXZlcnMvdmlkZW8vYncyLmMKaW5kZXggOTI0OGZlMS4uYzAyOWRiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9idzIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2J3Mi5jCkBAIC0zNSw5ICszNSw4IEBACiAKIHN0YXRpYyBpbnQgYncyX2JsYW5rKGludCwgc3RydWN0IGZiX2luZm8gKik7CiAKLXN0YXRpYyBpbnQgYncyX21tYXAoc3RydWN0IGZiX2luZm8gKiwgc3RydWN0IGZpbGUgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwotc3RhdGljIGludCBidzJfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwKLQkJICAgICB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgZmJfaW5mbyAqKTsKK3N0YXRpYyBpbnQgYncyX21tYXAoc3RydWN0IGZiX2luZm8gKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOworc3RhdGljIGludCBidzJfaW9jdGwoc3RydWN0IGZiX2luZm8gKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKIAogLyoKICAqICBGcmFtZSBidWZmZXIgb3BlcmF0aW9ucwpAQCAtMTY5LDcgKzE2OCw3IEBACiAJeyAuc2l6ZSA9IDAgfQogfTsKIAotc3RhdGljIGludCBidzJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorc3RhdGljIGludCBidzJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGJ3Ml9wYXIgKnBhciA9IChzdHJ1Y3QgYncyX3BhciAqKWluZm8tPnBhcjsKIApAQCAtMTgxLDggKzE4MCw3IEBACiAJCQkJICB2bWEpOwogfQogCi1zdGF0aWMgaW50IGJ3Ml9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJICAgICB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZiX2luZm8gKmluZm8pCitzdGF0aWMgaW50IGJ3Ml9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGJ3Ml9wYXIgKnBhciA9IChzdHJ1Y3QgYncyX3BhciAqKSBpbmZvLT5wYXI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY2cxNC5jIGIvZHJpdmVycy92aWRlby9jZzE0LmMKaW5kZXggYTU2MTQ3MS4uNjNiNmM3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jZzE0LmMKKysrIGIvZHJpdmVycy92aWRlby9jZzE0LmMKQEAgLTMxLDkgKzMxLDggQEAKIHN0YXRpYyBpbnQgY2cxNF9zZXRjb2xyZWcodW5zaWduZWQsIHVuc2lnbmVkLCB1bnNpZ25lZCwgdW5zaWduZWQsCiAJCQkgdW5zaWduZWQsIHN0cnVjdCBmYl9pbmZvICopOwogCi1zdGF0aWMgaW50IGNnMTRfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqLCBzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7Ci1zdGF0aWMgaW50IGNnMTRfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwKLQkJICAgICAgdW5zaWduZWQgbG9uZywgc3RydWN0IGZiX2luZm8gKik7CitzdGF0aWMgaW50IGNnMTRfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CitzdGF0aWMgaW50IGNnMTRfaW9jdGwoc3RydWN0IGZiX2luZm8gKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKIHN0YXRpYyBpbnQgY2cxNF9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKiwgc3RydWN0IGZiX2luZm8gKik7CiAKIC8qCkBAIC0yNjgsNyArMjY3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjZzE0X21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3N0YXRpYyBpbnQgY2cxNF9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlzdHJ1Y3QgY2cxNF9wYXIgKnBhciA9IChzdHJ1Y3QgY2cxNF9wYXIgKikgaW5mby0+cGFyOwogCkBAIC0yNzcsOCArMjc2LDcgQEAKIAkJCQkgIHBhci0+aW9zcGFjZSwgdm1hKTsKIH0KIAotc3RhdGljIGludCBjZzE0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZiX2luZm8gKmluZm8pCitzdGF0aWMgaW50IGNnMTRfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBjZzE0X3BhciAqcGFyID0gKHN0cnVjdCBjZzE0X3BhciAqKSBpbmZvLT5wYXI7CiAJc3RydWN0IGNnMTRfcmVncyBfX2lvbWVtICpyZWdzID0gcGFyLT5yZWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jZzMuYyBiL2RyaXZlcnMvdmlkZW8vY2czLmMKaW5kZXggOWZjZDg5Ni4uM2RlNmUxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jZzMuYworKysgYi9kcml2ZXJzL3ZpZGVvL2NnMy5jCkBAIC0zMyw5ICszMyw4IEBACiAJCQkgdW5zaWduZWQsIHN0cnVjdCBmYl9pbmZvICopOwogc3RhdGljIGludCBjZzNfYmxhbmsoaW50LCBzdHJ1Y3QgZmJfaW5mbyAqKTsKIAotc3RhdGljIGludCBjZzNfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqLCBzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7Ci1zdGF0aWMgaW50IGNnM19pb2N0bChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LAotCQkgICAgIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBmYl9pbmZvICopOworc3RhdGljIGludCBjZzNfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CitzdGF0aWMgaW50IGNnM19pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwogCiAvKgogICogIEZyYW1lIGJ1ZmZlciBvcGVyYXRpb25zCkBAIC0yMzAsNyArMjI5LDcgQEAKIAl7IC5zaXplID0gMCB9CiB9OwogCi1zdGF0aWMgaW50IGNnM19tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCitzdGF0aWMgaW50IGNnM19tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlzdHJ1Y3QgY2czX3BhciAqcGFyID0gKHN0cnVjdCBjZzNfcGFyICopaW5mby0+cGFyOwogCkBAIC0yNDAsOCArMjM5LDcgQEAKIAkJCQkgIHZtYSk7CiB9CiAKLXN0YXRpYyBpbnQgY2czX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgY2czX2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgY2czX3BhciAqcGFyID0gKHN0cnVjdCBjZzNfcGFyICopIGluZm8tPnBhcjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jZzYuYyBiL2RyaXZlcnMvdmlkZW8vY2c2LmMKaW5kZXggMDUwODM1ZTMuLjdhYWI5MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY2c2LmMKKysrIGIvZHJpdmVycy92aWRlby9jZzYuYwpAQCAtMzYsOSArMzYsOCBAQAogc3RhdGljIHZvaWQgY2c2X2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqLCBjb25zdCBzdHJ1Y3QgZmJfaW1hZ2UgKik7CiBzdGF0aWMgdm9pZCBjZzZfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKiwgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICopOwogc3RhdGljIGludCBjZzZfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqKTsKLXN0YXRpYyBpbnQgY2c2X21tYXAoc3RydWN0IGZiX2luZm8gKiwgc3RydWN0IGZpbGUgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwotc3RhdGljIGludCBjZzZfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwKLQkJICAgICB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgZmJfaW5mbyAqKTsKK3N0YXRpYyBpbnQgY2c2X21tYXAoc3RydWN0IGZiX2luZm8gKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOworc3RhdGljIGludCBjZzZfaW9jdGwoc3RydWN0IGZiX2luZm8gKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKIAogLyoKICAqICBGcmFtZSBidWZmZXIgb3BlcmF0aW9ucwpAQCAtNTI0LDcgKzUyMyw3IEBACiAJeyAuc2l6ZQk9IDAgfQogfTsKIAotc3RhdGljIGludCBjZzZfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorc3RhdGljIGludCBjZzZfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGNnNl9wYXIgKnBhciA9IChzdHJ1Y3QgY2c2X3BhciAqKWluZm8tPnBhcjsKIApAQCAtNTM0LDggKzUzMyw3IEBACiAJCQkJICB2bWEpOwogfQogCi1zdGF0aWMgaW50IGNnNl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJICAgICB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZiX2luZm8gKmluZm8pCitzdGF0aWMgaW50IGNnNl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGNnNl9wYXIgKnBhciA9IChzdHJ1Y3QgY2c2X3BhciAqKSBpbmZvLT5wYXI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9LY29uZmlnIGIvZHJpdmVycy92aWRlby9jb25zb2xlL0tjb25maWcKaW5kZXggYTVkMDllMS4uNmVlNDQ5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL0tjb25maWcKQEAgLTYsNyArNiw3IEBACiAKIGNvbmZpZyBWR0FfQ09OU09MRQogCWJvb2wgIlZHQSB0ZXh0IGNvbnNvbGUiIGlmIEVNQkVEREVEIHx8ICFYODYKLQlkZXBlbmRzIG9uICFBUkNIX0FDT1JOICYmICFBUkNIX0VCU0ExMTAgJiYgITR4eCAmJiAhOHh4ICYmICFTUEFSQyAmJiAhTTY4SyAmJiAhUEFSSVNDICYmICFBUkNIX1ZFUlNBVElMRQorCWRlcGVuZHMgb24gIUFSQ0hfQUNPUk4gJiYgIUFSQ0hfRUJTQTExMCAmJiAhNHh4ICYmICE4eHggJiYgIVNQQVJDICYmICFNNjhLICYmICFQQVJJU0MgJiYgIUZSViAmJiAhQVJDSF9WRVJTQVRJTEUKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBTYXlpbmcgWSBoZXJlIHdpbGwgYWxsb3cgeW91IHRvIHVzZSBMaW51eCBpbiB0ZXh0IG1vZGUgdGhyb3VnaCBhCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvYml0YmxpdC5jIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2JpdGJsaXQuYwppbmRleCBlNjVmYzNlLi5lZWE0MjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvYml0YmxpdC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9iaXRibGl0LmMKQEAgLTIzNCwxNCArMjM0LDE0IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBiaXRfY3Vyc29yKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGZiX2luZm8gKmluZm8sCi0JCSAgICAgICBzdHJ1Y3QgZGlzcGxheSAqcCwgaW50IG1vZGUsIGludCBzb2Z0YmFja19saW5lcywgaW50IGZnLCBpbnQgYmcpCitzdGF0aWMgdm9pZCBiaXRfY3Vyc29yKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGZiX2luZm8gKmluZm8sIGludCBtb2RlLAorCQkgICAgICAgaW50IHNvZnRiYWNrX2xpbmVzLCBpbnQgZmcsIGludCBiZykKIHsKIAlzdHJ1Y3QgZmJfY3Vyc29yIGN1cnNvcjsKLQlzdHJ1Y3QgZmJjb25fb3BzICpvcHMgPSAoc3RydWN0IGZiY29uX29wcyAqKSBpbmZvLT5mYmNvbl9wYXI7CisJc3RydWN0IGZiY29uX29wcyAqb3BzID0gaW5mby0+ZmJjb25fcGFyOwogCXVuc2lnbmVkIHNob3J0IGNoYXJtYXNrID0gdmMtPnZjX2hpX2ZvbnRfbWFzayA/IDB4MWZmIDogMHhmZjsKIAlpbnQgdyA9ICh2Yy0+dmNfZm9udC53aWR0aCArIDcpID4+IDMsIGM7Ci0JaW50IHkgPSByZWFsX3kocCwgdmMtPnZjX3kpOworCWludCB5ID0gcmVhbF95KG9wcy0+cCwgdmMtPnZjX3kpOwogCWludCBhdHRyaWJ1dGUsIHVzZV9zdyA9ICh2Yy0+dmNfY3Vyc29yX3R5cGUgJiAweDEwKTsKIAlpbnQgZXJyID0gMTsKIAljaGFyICpzcmM7CkBAIC0zMTAsNyArMzEwLDcgQEAKIAl9CiAKIAlpZiAoY3Vyc29yLnNldCAmIEZCX0NVUl9TRVRTSVpFIHx8Ci0JICAgIHZjLT52Y19jdXJzb3JfdHlwZSAhPSBwLT5jdXJzb3Jfc2hhcGUgfHwKKwkgICAgdmMtPnZjX2N1cnNvcl90eXBlICE9IG9wcy0+cC0+Y3Vyc29yX3NoYXBlIHx8CiAJICAgIG9wcy0+Y3Vyc29yX3N0YXRlLm1hc2sgPT0gTlVMTCB8fAogCSAgICBvcHMtPmN1cnNvcl9yZXNldCkgewogCQljaGFyICptYXNrID0ga21hbGxvYyh3KnZjLT52Y19mb250LmhlaWdodCwgR0ZQX0FUT01JQyk7CkBAIC0zMjMsMTAgKzMyMywxMCBAQAogCQlrZnJlZShvcHMtPmN1cnNvcl9zdGF0ZS5tYXNrKTsKIAkJb3BzLT5jdXJzb3Jfc3RhdGUubWFzayA9IG1hc2s7CiAKLQkJcC0+Y3Vyc29yX3NoYXBlID0gdmMtPnZjX2N1cnNvcl90eXBlOworCQlvcHMtPnAtPmN1cnNvcl9zaGFwZSA9IHZjLT52Y19jdXJzb3JfdHlwZTsKIAkJY3Vyc29yLnNldCB8PSBGQl9DVVJfU0VUU0hBUEU7CiAKLQkJc3dpdGNoIChwLT5jdXJzb3Jfc2hhcGUgJiBDVVJfSFdNQVNLKSB7CisJCXN3aXRjaCAob3BzLT5wLT5jdXJzb3Jfc2hhcGUgJiBDVVJfSFdNQVNLKSB7CiAJCWNhc2UgQ1VSX05PTkU6CiAJCQljdXJfaGVpZ2h0ID0gMDsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmMgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb24uYwppbmRleCAzNjYwZTUxLi4wNDFkMDY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb24uYworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb24uYwpAQCAtMjA5LDEzICsyMDksMTMgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEVfUk9UQVRJT04KLXN0YXRpYyBpbmxpbmUgdm9pZCBmYmNvbl9zZXRfcm90YXRpb24oc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBkaXNwbGF5ICpwKQorc3RhdGljIGlubGluZSB2b2lkIGZiY29uX3NldF9yb3RhdGlvbihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgZmJjb25fb3BzICpvcHMgPSBpbmZvLT5mYmNvbl9wYXI7CiAKIAlpZiAoIShpbmZvLT5mbGFncyAmIEZCSU5GT19NSVNDX1RJTEVCTElUVElORykgJiYKLQkgICAgcC0+Y29uX3JvdGF0ZSA8IDQpCi0JCW9wcy0+cm90YXRlID0gcC0+Y29uX3JvdGF0ZTsKKwkgICAgb3BzLT5wLT5jb25fcm90YXRlIDwgNCkKKwkJb3BzLT5yb3RhdGUgPSBvcHMtPnAtPmNvbl9yb3RhdGU7CiAJZWxzZQogCQlvcHMtPnJvdGF0ZSA9IDA7CiB9CkBAIC0yNjUsNyArMjY1LDcgQEAKIAlmYmNvbl9zZXRfYWxsX3ZjcyhpbmZvKTsKIH0KICNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgZmJjb25fc2V0X3JvdGF0aW9uKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZGlzcGxheSAqcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYmNvbl9zZXRfcm90YXRpb24oc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGZiY29uX29wcyAqb3BzID0gaW5mby0+ZmJjb25fcGFyOwogCkBAIC00MDIsNyArNDAyLDcgQEAKIAljID0gc2NyX3JlYWR3KCh1MTYgKikgdmMtPnZjX3Bvcyk7CiAJbW9kZSA9ICghb3BzLT5jdXJzb3JfZmxhc2ggfHwgb3BzLT5jdXJzb3Jfc3RhdGUuZW5hYmxlKSA/CiAJCUNNX0VSQVNFIDogQ01fRFJBVzsKLQlvcHMtPmN1cnNvcih2YywgaW5mbywgcCwgbW9kZSwgc29mdGJhY2tfbGluZXMsIGdldF9jb2xvcih2YywgaW5mbywgYywgMSksCisJb3BzLT5jdXJzb3IodmMsIGluZm8sIG1vZGUsIHNvZnRiYWNrX2xpbmVzLCBnZXRfY29sb3IodmMsIGluZm8sIGMsIDEpLAogCQkgICAgZ2V0X2NvbG9yKHZjLCBpbmZvLCBjLCAwKSk7CiAJcmVsZWFzZV9jb25zb2xlX3NlbSgpOwogfQpAQCAtNjQ3LDI5ICs2NDcsMjcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19GQl9USUxFQkxJVFRJTkcKLXN0YXRpYyB2b2lkIHNldF9ibGl0dGluZ190eXBlKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGZiX2luZm8gKmluZm8sCi0JCQkgICAgICBzdHJ1Y3QgZGlzcGxheSAqcCkKK3N0YXRpYyB2b2lkIHNldF9ibGl0dGluZ190eXBlKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGZiY29uX29wcyAqb3BzID0gaW5mby0+ZmJjb25fcGFyOwogCi0Jb3BzLT5wID0gKHApID8gcCA6ICZmYl9kaXNwbGF5W3ZjLT52Y19udW1dOworCW9wcy0+cCA9ICZmYl9kaXNwbGF5W3ZjLT52Y19udW1dOwogCiAJaWYgKChpbmZvLT5mbGFncyAmIEZCSU5GT19NSVNDX1RJTEVCTElUVElORykpCi0JCWZiY29uX3NldF90aWxlb3BzKHZjLCBpbmZvLCBwLCBvcHMpOworCQlmYmNvbl9zZXRfdGlsZW9wcyh2YywgaW5mbyk7CiAJZWxzZSB7Ci0JCWZiY29uX3NldF9yb3RhdGlvbihpbmZvLCBvcHMtPnApOworCQlmYmNvbl9zZXRfcm90YXRpb24oaW5mbyk7CiAJCWZiY29uX3NldF9iaXRvcHMob3BzKTsKIAl9CiB9CiAjZWxzZQotc3RhdGljIHZvaWQgc2V0X2JsaXR0aW5nX3R5cGUoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKLQkJCSAgICAgIHN0cnVjdCBkaXNwbGF5ICpwKQorc3RhdGljIHZvaWQgc2V0X2JsaXR0aW5nX3R5cGUoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgZmJjb25fb3BzICpvcHMgPSBpbmZvLT5mYmNvbl9wYXI7CiAKIAlpbmZvLT5mbGFncyAmPSB+RkJJTkZPX01JU0NfVElMRUJMSVRUSU5HOwotCW9wcy0+cCA9IChwKSA/IHAgOiAmZmJfZGlzcGxheVt2Yy0+dmNfbnVtXTsKLQlmYmNvbl9zZXRfcm90YXRpb24oaW5mbywgb3BzLT5wKTsKKwlvcHMtPnAgPSAmZmJfZGlzcGxheVt2Yy0+dmNfbnVtXTsKKwlmYmNvbl9zZXRfcm90YXRpb24oaW5mbyk7CiAJZmJjb25fc2V0X2JpdG9wcyhvcHMpOwogfQogI2VuZGlmIC8qIENPTkZJR19NSVNDX1RJTEVCTElUVElORyAqLwpAQCAtNjg5LDE1ICs2ODcsMTQgQEAKIAkJZXJyID0gLUVOT0RFVjsKIAogCWlmICghZXJyKSB7Ci0JCW9wcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmYmNvbl9vcHMpLCBHRlBfS0VSTkVMKTsKKwkJb3BzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZiY29uX29wcyksIEdGUF9LRVJORUwpOwogCQlpZiAoIW9wcykKIAkJCWVyciA9IC1FTk9NRU07CiAJfQogCiAJaWYgKCFlcnIpIHsKLQkJbWVtc2V0KG9wcywgMCwgc2l6ZW9mKHN0cnVjdCBmYmNvbl9vcHMpKTsKIAkJaW5mby0+ZmJjb25fcGFyID0gb3BzOwotCQlzZXRfYmxpdHRpbmdfdHlwZSh2YywgaW5mbywgTlVMTCk7CisJCXNldF9ibGl0dGluZ190eXBlKHZjLCBpbmZvKTsKIAl9CiAKIAlpZiAoZXJyKSB7CkBAIC05MjEsMTkgKzkxOCwxOCBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlvcHMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZmJjb25fb3BzKSwgR0ZQX0tFUk5FTCk7CisJb3BzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZiY29uX29wcyksIEdGUF9LRVJORUwpOwogCWlmICghb3BzKSB7CiAJCW1vZHVsZV9wdXQob3duZXIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQltZW1zZXQob3BzLCAwLCBzaXplb2Yoc3RydWN0IGZiY29uX29wcykpOwogCW9wcy0+Y3VycmNvbiA9IC0xOwogCW9wcy0+Z3JhcGhpY3MgPSAxOwogCW9wcy0+Y3VyX3JvdGF0ZSA9IC0xOwogCWluZm8tPmZiY29uX3BhciA9IG9wczsKIAlwLT5jb25fcm90YXRlID0gcm90YXRlOwotCXNldF9ibGl0dGluZ190eXBlKHZjLCBpbmZvLCBOVUxMKTsKKwlzZXRfYmxpdHRpbmdfdHlwZSh2YywgaW5mbyk7CiAKIAlpZiAoaW5mby0+Zml4LnR5cGUgIT0gRkJfVFlQRV9URVhUKSB7CiAJCWlmIChmYmNvbl9zb2Z0YmFja19zaXplKSB7CkBAIC0xMDkzLDcgKzEwODksNyBAQAogCiAJb3BzID0gaW5mby0+ZmJjb25fcGFyOwogCXAtPmNvbl9yb3RhdGUgPSByb3RhdGU7Ci0Jc2V0X2JsaXR0aW5nX3R5cGUodmMsIGluZm8sIE5VTEwpOworCXNldF9ibGl0dGluZ190eXBlKHZjLCBpbmZvKTsKIAogCWNvbHMgPSB2Yy0+dmNfY29sczsKIAlyb3dzID0gdmMtPnZjX3Jvd3M7CkBAIC0xMTEwLDcgKzExMDYsNyBAQAogCSAqCiAJICogV2UgbmVlZCB0byBkbyBpdCBpbiBmYmNvbl9pbml0KCkgdG8gcHJldmVudCBzY3JlZW4gY29ycnVwdGlvbi4KIAkgKi8KLQlpZiAoQ09OX0lTX1ZJU0lCTEUodmMpKSB7CisJaWYgKENPTl9JU19WSVNJQkxFKHZjKSAmJiB2Yy0+dmNfbW9kZSA9PSBLRF9URVhUKSB7CiAJCWlmIChpbmZvLT5mYm9wcy0+ZmJfc2V0X3BhciAmJgogCQkgICAgIShvcHMtPmZsYWdzICYgRkJDT05fRkxBR1NfSU5JVCkpCiAJCQlpbmZvLT5mYm9wcy0+ZmJfc2V0X3BhcihpbmZvKTsKQEAgLTExNDEsOSArMTEzNyw5IEBACiAJaWYgKHZjID09IHN2YyAmJiBzb2Z0YmFja19idWYpCiAJCWZiY29uX3VwZGF0ZV9zb2Z0YmFjayh2Yyk7CiAKLQlpZiAob3BzLT5yb3RhdGVfZm9udCAmJiBvcHMtPnJvdGF0ZV9mb250KGluZm8sIHZjLCBwKSkgeworCWlmIChvcHMtPnJvdGF0ZV9mb250ICYmIG9wcy0+cm90YXRlX2ZvbnQoaW5mbywgdmMpKSB7CiAJCW9wcy0+cm90YXRlID0gRkJfUk9UQVRFX1VSOwotCQlzZXRfYmxpdHRpbmdfdHlwZSh2YywgaW5mbywgcCk7CisJCXNldF9ibGl0dGluZ190eXBlKHZjLCBpbmZvKTsKIAl9CiAKIH0KQEAgLTEyNDMsNyArMTIzOSw2IEBACiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSByZWdpc3RlcmVkX2ZiW2NvbjJmYl9tYXBbdmMtPnZjX251bV1dOwogCXN0cnVjdCBmYmNvbl9vcHMgKm9wcyA9IGluZm8tPmZiY29uX3BhcjsKLQlzdHJ1Y3QgZGlzcGxheSAqcCA9ICZmYl9kaXNwbGF5W3ZjLT52Y19udW1dOwogCWludCB5OwogIAlpbnQgYyA9IHNjcl9yZWFkdygodTE2ICopIHZjLT52Y19wb3MpOwogCkBAIC0xMjYwLDcgKzEyNTUsNyBAQAogCQl5ID0gMDsKIAl9CiAKLQlvcHMtPmN1cnNvcih2YywgaW5mbywgcCwgbW9kZSwgeSwgZ2V0X2NvbG9yKHZjLCBpbmZvLCBjLCAxKSwKKwlvcHMtPmN1cnNvcih2YywgaW5mbywgbW9kZSwgeSwgZ2V0X2NvbG9yKHZjLCBpbmZvLCBjLCAxKSwKIAkJICAgIGdldF9jb2xvcih2YywgaW5mbywgYywgMCkpOwogCXZibF9jdXJzb3JfY250ID0gQ1VSU09SX0RSQVdfREVMQVk7CiB9CkBAIC0xNDExLDE2ICsxNDA2LDEzIEBACiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSByZWdpc3RlcmVkX2ZiW2NvbjJmYl9tYXBbdmMtPnZjX251bV1dOwogCXN0cnVjdCBmYmNvbl9vcHMgKm9wcyA9IGluZm8tPmZiY29uX3BhcjsKIAlzdHJ1Y3QgZGlzcGxheSAqcCA9ICZmYl9kaXNwbGF5W3ZjLT52Y19udW1dOwotCWludCByZWRyYXcgPSAwOwogCiAJcC0+eXNjcm9sbCArPSBjb3VudDsKKwogCWlmIChwLT55c2Nyb2xsID4gcC0+dnJvd3MgLSB2Yy0+dmNfcm93cykgewogCQlwLT55c2Nyb2xsIC09IHAtPnZyb3dzIC0gdmMtPnZjX3Jvd3M7Ci0JCXJlZHJhdyA9IDE7Ci0JfQotCi0JaWYgKHJlZHJhdykKIAkJZmJjb25fcmVkcmF3X21vdmUodmMsIHAsIHQgKyBjb3VudCwgdmMtPnZjX3Jvd3MgLSBjb3VudCwgdCk7CisJfQogCiAJb3BzLT52YXIueG9mZnNldCA9IDA7CiAJb3BzLT52YXIueW9mZnNldCA9IHAtPnlzY3JvbGwgKiB2Yy0+dmNfZm9udC5oZWlnaHQ7CkBAIC0xNDYyLDE2ICsxNDU0LDEzIEBACiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSByZWdpc3RlcmVkX2ZiW2NvbjJmYl9tYXBbdmMtPnZjX251bV1dOwogCXN0cnVjdCBmYmNvbl9vcHMgKm9wcyA9IGluZm8tPmZiY29uX3BhcjsKIAlzdHJ1Y3QgZGlzcGxheSAqcCA9ICZmYl9kaXNwbGF5W3ZjLT52Y19udW1dOwotCWludCByZWRyYXcgPSAwOwogCiAJcC0+eXNjcm9sbCAtPSBjb3VudDsKKwogCWlmIChwLT55c2Nyb2xsIDwgMCkgewogCQlwLT55c2Nyb2xsICs9IHAtPnZyb3dzIC0gdmMtPnZjX3Jvd3M7Ci0JCXJlZHJhdyA9IDE7Ci0JfQotCi0JaWYgKHJlZHJhdykKIAkJZmJjb25fcmVkcmF3X21vdmUodmMsIHAsIHQsIHZjLT52Y19yb3dzIC0gY291bnQsIHQgKyBjb3VudCk7CisJfQogCiAJb3BzLT52YXIueG9mZnNldCA9IDA7CiAJb3BzLT52YXIueW9mZnNldCA9IHAtPnlzY3JvbGwgKiB2Yy0+dmNfZm9udC5oZWlnaHQ7CkBAIC0xOTY4LDcgKzE5NTcsOCBAQAogCQlkaXZpZGVzKHlwYW4sIHZjLT52Y19mb250LmhlaWdodCkgJiYgdnlyZXMgPiB5cmVzOwogCWludCBnb29kX3dyYXAgPSAoY2FwICYgRkJJTkZPX0hXQUNDRUxfWVdSQVApICYmCiAJCWRpdmlkZXMoeXdyYXAsIHZjLT52Y19mb250LmhlaWdodCkgJiYKLQkJZGl2aWRlcyh2Yy0+dmNfZm9udC5oZWlnaHQsIHZ5cmVzKTsKKwkJZGl2aWRlcyh2Yy0+dmNfZm9udC5oZWlnaHQsIHZ5cmVzKSAmJgorCQlkaXZpZGVzKHZjLT52Y19mb250LmhlaWdodCwgeXJlcyk7CiAJaW50IHJlYWRpbmdfZmFzdCA9IGNhcCAmIEZCSU5GT19SRUFEU19GQVNUOwogCWludCBmYXN0X2NvcHlhcmVhID0gKGNhcCAmIEZCSU5GT19IV0FDQ0VMX0NPUFlBUkVBKSAmJgogCQkhKGNhcCAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKTsKQEAgLTIxMDcsMTYgKzIwOTcsMTkgQEAKIAkJCQkgaW5mby0+ZmxhZ3MgJiBGQklORk9fTUlTQ19BTFdBWVNfU0VUUEFSKSkgewogCQlpZiAoaW5mby0+ZmJvcHMtPmZiX3NldF9wYXIpCiAJCQlpbmZvLT5mYm9wcy0+ZmJfc2V0X3BhcihpbmZvKTsKLQkJZmJjb25fZGVsX2N1cnNvcl90aW1lcihvbGRfaW5mbyk7Ci0JCWZiY29uX2FkZF9jdXJzb3JfdGltZXIoaW5mbyk7CisKKwkJaWYgKG9sZF9pbmZvICE9IGluZm8pIHsKKwkJCWZiY29uX2RlbF9jdXJzb3JfdGltZXIob2xkX2luZm8pOworCQkJZmJjb25fYWRkX2N1cnNvcl90aW1lcihpbmZvKTsKKwkJfQogCX0KIAotCXNldF9ibGl0dGluZ190eXBlKHZjLCBpbmZvLCBwKTsKKwlzZXRfYmxpdHRpbmdfdHlwZSh2YywgaW5mbyk7CiAJb3BzLT5jdXJzb3JfcmVzZXQgPSAxOwogCi0JaWYgKG9wcy0+cm90YXRlX2ZvbnQgJiYgb3BzLT5yb3RhdGVfZm9udChpbmZvLCB2YywgcCkpIHsKKwlpZiAob3BzLT5yb3RhdGVfZm9udCAmJiBvcHMtPnJvdGF0ZV9mb250KGluZm8sIHZjKSkgewogCQlvcHMtPnJvdGF0ZSA9IEZCX1JPVEFURV9VUjsKLQkJc2V0X2JsaXR0aW5nX3R5cGUodmMsIGluZm8sIHApOworCQlzZXRfYmxpdHRpbmdfdHlwZSh2YywgaW5mbyk7CiAJfQogCiAJdmMtPnZjX2Nhbl9kb19jb2xvciA9IChmYl9nZXRfY29sb3JfZGVwdGgoJmluZm8tPnZhciwgJmluZm8tPmZpeCkhPTEpOwpAQCAtMjczOSw3ICsyNzMyLDcgQEAKIAkJcmV0dXJuOwogCiAJcCA9ICZmYl9kaXNwbGF5W3ZjLT52Y19udW1dOwotCXNldF9ibGl0dGluZ190eXBlKHZjLCBpbmZvLCBwKTsKKwlzZXRfYmxpdHRpbmdfdHlwZSh2YywgaW5mbyk7CiAKIAlpZiAoQ09OX0lTX1ZJU0lCTEUodmMpKSB7CiAJCXZhcl90b19kaXNwbGF5KHAsICZpbmZvLT52YXIsIGluZm8pOwpAQCAtMjc4MSw3ICsyNzc0LDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCXAgPSAmZmJfZGlzcGxheVt2Yy0+dmNfbnVtXTsKLQkJc2V0X2JsaXR0aW5nX3R5cGUodmMsIGluZm8sIHApOworCQlzZXRfYmxpdHRpbmdfdHlwZSh2YywgaW5mbyk7CiAJCXZhcl90b19kaXNwbGF5KHAsICZpbmZvLT52YXIsIGluZm8pOwogCQljb2xzID0gRkJDT05fU1dBUChvcHMtPnJvdGF0ZSwgaW5mby0+dmFyLnhyZXMsIGluZm8tPnZhci55cmVzKTsKIAkJcm93cyA9IEZCQ09OX1NXQVAob3BzLT5yb3RhdGUsIGluZm8tPnZhci55cmVzLCBpbmZvLT52YXIueHJlcyk7CkBAIC0yODA2LDYgKzI3OTksOCBAQAogCQkJCWZiY29uX3VwZGF0ZV9zb2Z0YmFjayh2Yyk7CiAJCX0KIAl9CisKKwlvcHMtPnAgPSAmZmJfZGlzcGxheVtvcHMtPmN1cnJjb25dOwogfQogCiBzdGF0aWMgaW50IGZiY29uX21vZGVfZGVsZXRlZChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5oIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmgKaW5kZXggNjg5MmU3Zi4uYzM4YzNkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmgKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmgKQEAgLTYyLDEyICs2MiwxMCBAQAogCQkgICAgICBpbnQgZmcsIGludCBiZyk7CiAJdm9pZCAoKmNsZWFyX21hcmdpbnMpKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGZiX2luZm8gKmluZm8sCiAJCQkgICAgICBpbnQgYm90dG9tX29ubHkpOwotCXZvaWQgKCpjdXJzb3IpKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGZiX2luZm8gKmluZm8sCi0JCSAgICAgICBzdHJ1Y3QgZGlzcGxheSAqcCwgaW50IG1vZGUsIGludCBzb2Z0YmFja19saW5lcywKLQkJICAgICAgIGludCBmZywgaW50IGJnKTsKKwl2b2lkICgqY3Vyc29yKShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgbW9kZSwKKwkJICAgICAgIGludCBzb2Z0YmFja19saW5lcywgaW50IGZnLCBpbnQgYmcpOwogCWludCAgKCp1cGRhdGVfc3RhcnQpKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLQlpbnQgICgqcm90YXRlX2ZvbnQpKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgdmNfZGF0YSAqdmMsCi0JCQkgICAgc3RydWN0IGRpc3BsYXkgKnApOworCWludCAgKCpyb3RhdGVfZm9udCkoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCB2Y19kYXRhICp2Yyk7CiAJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZhcjsgIC8qIGNvcHkgb2YgdGhlIGN1cnJlbnQgZmJfdmFyX3NjcmVlbmluZm8gKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdCBjdXJzb3JfdGltZXI7IC8qIEN1cnNvciB0aW1lciAqLwogCXN0cnVjdCBmYl9jdXJzb3IgY3Vyc29yX3N0YXRlOwpAQCAtMTczLDggKzE3MSw3IEBACiAjZGVmaW5lIFNDUk9MTF9QQU5fUkVEUkFXICAweDAwNQogCiAjaWZkZWYgQ09ORklHX0ZCX1RJTEVCTElUVElORwotZXh0ZXJuIHZvaWQgZmJjb25fc2V0X3RpbGVvcHMoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKLQkJCSAgICAgIHN0cnVjdCBkaXNwbGF5ICpwLCBzdHJ1Y3QgZmJjb25fb3BzICpvcHMpOworZXh0ZXJuIHZvaWQgZmJjb25fc2V0X3RpbGVvcHMoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiAjZW5kaWYKIGV4dGVybiB2b2lkIGZiY29uX3NldF9iaXRvcHMoc3RydWN0IGZiY29uX29wcyAqb3BzKTsKIGV4dGVybiBpbnQgIHNvZnRfY3Vyc29yKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmJfY3Vyc29yICpjdXJzb3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uX2Njdy5jIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uX2Njdy5jCmluZGV4IDQ5NTJiNjYuLjk5MDI4OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbl9jY3cuYworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb25fY2N3LmMKQEAgLTIxOSwxOSArMjE5LDE4IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBjY3dfY3Vyc29yKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGZiX2luZm8gKmluZm8sCi0JCSAgICAgIHN0cnVjdCBkaXNwbGF5ICpwLCBpbnQgbW9kZSwgaW50IHNvZnRiYWNrX2xpbmVzLAotCQkgICAgICBpbnQgZmcsIGludCBiZykKK3N0YXRpYyB2b2lkIGNjd19jdXJzb3Ioc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IG1vZGUsCisJCSAgICAgICBpbnQgc29mdGJhY2tfbGluZXMsIGludCBmZywgaW50IGJnKQogewogCXN0cnVjdCBmYl9jdXJzb3IgY3Vyc29yOwotCXN0cnVjdCBmYmNvbl9vcHMgKm9wcyA9IChzdHJ1Y3QgZmJjb25fb3BzICopIGluZm8tPmZiY29uX3BhcjsKKwlzdHJ1Y3QgZmJjb25fb3BzICpvcHMgPSBpbmZvLT5mYmNvbl9wYXI7CiAJdW5zaWduZWQgc2hvcnQgY2hhcm1hc2sgPSB2Yy0+dmNfaGlfZm9udF9tYXNrID8gMHgxZmYgOiAweGZmOwogCWludCB3ID0gKHZjLT52Y19mb250LmhlaWdodCArIDcpID4+IDMsIGM7Ci0JaW50IHkgPSByZWFsX3kocCwgdmMtPnZjX3kpOworCWludCB5ID0gcmVhbF95KG9wcy0+cCwgdmMtPnZjX3kpOwogCWludCBhdHRyaWJ1dGUsIHVzZV9zdyA9ICh2Yy0+dmNfY3Vyc29yX3R5cGUgJiAweDEwKTsKIAlpbnQgZXJyID0gMSwgZHgsIGR5OwogCWNoYXIgKnNyYzsKLQl1MzIgdnlyZXMgPSBHRVRWWVJFUyhwLT5zY3JvbGxtb2RlLCBpbmZvKTsKKwl1MzIgdnlyZXMgPSBHRVRWWVJFUyhvcHMtPnAtPnNjcm9sbG1vZGUsIGluZm8pOwogCiAJaWYgKCFvcHMtPmZvbnRidWZmZXIpCiAJCXJldHVybjsKQEAgLTMwMyw3ICszMDIsNyBAQAogCX0KIAogCWlmIChjdXJzb3Iuc2V0ICYgRkJfQ1VSX1NFVFNJWkUgfHwKLQkgICAgdmMtPnZjX2N1cnNvcl90eXBlICE9IHAtPmN1cnNvcl9zaGFwZSB8fAorCSAgICB2Yy0+dmNfY3Vyc29yX3R5cGUgIT0gb3BzLT5wLT5jdXJzb3Jfc2hhcGUgfHwKIAkgICAgb3BzLT5jdXJzb3Jfc3RhdGUubWFzayA9PSBOVUxMIHx8CiAJICAgIG9wcy0+Y3Vyc29yX3Jlc2V0KSB7CiAJCWNoYXIgKnRtcCwgKm1hc2sgPSBrbWFsbG9jKHcqdmMtPnZjX2ZvbnQud2lkdGgsIEdGUF9BVE9NSUMpOwpAQCAtMzIzLDEwICszMjIsMTAgQEAKIAkJa2ZyZWUob3BzLT5jdXJzb3Jfc3RhdGUubWFzayk7CiAJCW9wcy0+Y3Vyc29yX3N0YXRlLm1hc2sgPSBtYXNrOwogCi0JCXAtPmN1cnNvcl9zaGFwZSA9IHZjLT52Y19jdXJzb3JfdHlwZTsKKwkJb3BzLT5wLT5jdXJzb3Jfc2hhcGUgPSB2Yy0+dmNfY3Vyc29yX3R5cGU7CiAJCWN1cnNvci5zZXQgfD0gRkJfQ1VSX1NFVFNIQVBFOwogCi0JCXN3aXRjaCAocC0+Y3Vyc29yX3NoYXBlICYgQ1VSX0hXTUFTSykgeworCQlzd2l0Y2ggKG9wcy0+cC0+Y3Vyc29yX3NoYXBlICYgQ1VSX0hXTUFTSykgewogCQljYXNlIENVUl9OT05FOgogCQkJY3VyX2hlaWdodCA9IDA7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbl9jdy5jIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uX2N3LmMKaW5kZXggNmQ5MmI4NC4uZDQ0YzVmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uX2N3LmMKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uX2N3LmMKQEAgLTIwMywxOSArMjAzLDE4IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBjd19jdXJzb3Ioc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKLQkJICAgICAgc3RydWN0IGRpc3BsYXkgKnAsIGludCBtb2RlLCBpbnQgc29mdGJhY2tfbGluZXMsCi0JCSAgICAgIGludCBmZywgaW50IGJnKQorc3RhdGljIHZvaWQgY3dfY3Vyc29yKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGZiX2luZm8gKmluZm8sIGludCBtb2RlLAorCQkgICAgICBpbnQgc29mdGJhY2tfbGluZXMsIGludCBmZywgaW50IGJnKQogewogCXN0cnVjdCBmYl9jdXJzb3IgY3Vyc29yOwotCXN0cnVjdCBmYmNvbl9vcHMgKm9wcyA9IChzdHJ1Y3QgZmJjb25fb3BzICopIGluZm8tPmZiY29uX3BhcjsKKwlzdHJ1Y3QgZmJjb25fb3BzICpvcHMgPSBpbmZvLT5mYmNvbl9wYXI7CiAJdW5zaWduZWQgc2hvcnQgY2hhcm1hc2sgPSB2Yy0+dmNfaGlfZm9udF9tYXNrID8gMHgxZmYgOiAweGZmOwogCWludCB3ID0gKHZjLT52Y19mb250LmhlaWdodCArIDcpID4+IDMsIGM7Ci0JaW50IHkgPSByZWFsX3kocCwgdmMtPnZjX3kpOworCWludCB5ID0gcmVhbF95KG9wcy0+cCwgdmMtPnZjX3kpOwogCWludCBhdHRyaWJ1dGUsIHVzZV9zdyA9ICh2Yy0+dmNfY3Vyc29yX3R5cGUgJiAweDEwKTsKIAlpbnQgZXJyID0gMSwgZHgsIGR5OwogCWNoYXIgKnNyYzsKLQl1MzIgdnhyZXMgPSBHRVRWWFJFUyhwLT5zY3JvbGxtb2RlLCBpbmZvKTsKKwl1MzIgdnhyZXMgPSBHRVRWWFJFUyhvcHMtPnAtPnNjcm9sbG1vZGUsIGluZm8pOwogCiAJaWYgKCFvcHMtPmZvbnRidWZmZXIpCiAJCXJldHVybjsKQEAgLTI4Nyw3ICsyODYsNyBAQAogCX0KIAogCWlmIChjdXJzb3Iuc2V0ICYgRkJfQ1VSX1NFVFNJWkUgfHwKLQkgICAgdmMtPnZjX2N1cnNvcl90eXBlICE9IHAtPmN1cnNvcl9zaGFwZSB8fAorCSAgICB2Yy0+dmNfY3Vyc29yX3R5cGUgIT0gb3BzLT5wLT5jdXJzb3Jfc2hhcGUgfHwKIAkgICAgb3BzLT5jdXJzb3Jfc3RhdGUubWFzayA9PSBOVUxMIHx8CiAJICAgIG9wcy0+Y3Vyc29yX3Jlc2V0KSB7CiAJCWNoYXIgKnRtcCwgKm1hc2sgPSBrbWFsbG9jKHcqdmMtPnZjX2ZvbnQud2lkdGgsIEdGUF9BVE9NSUMpOwpAQCAtMzA3LDEwICszMDYsMTAgQEAKIAkJa2ZyZWUob3BzLT5jdXJzb3Jfc3RhdGUubWFzayk7CiAJCW9wcy0+Y3Vyc29yX3N0YXRlLm1hc2sgPSBtYXNrOwogCi0JCXAtPmN1cnNvcl9zaGFwZSA9IHZjLT52Y19jdXJzb3JfdHlwZTsKKwkJb3BzLT5wLT5jdXJzb3Jfc2hhcGUgPSB2Yy0+dmNfY3Vyc29yX3R5cGU7CiAJCWN1cnNvci5zZXQgfD0gRkJfQ1VSX1NFVFNIQVBFOwogCi0JCXN3aXRjaCAocC0+Y3Vyc29yX3NoYXBlICYgQ1VSX0hXTUFTSykgeworCQlzd2l0Y2ggKG9wcy0+cC0+Y3Vyc29yX3NoYXBlICYgQ1VSX0hXTUFTSykgewogCQljYXNlIENVUl9OT05FOgogCQkJY3VyX2hlaWdodCA9IDA7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbl9yb3RhdGUuYyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbl9yb3RhdGUuYwppbmRleCBlYzBkZDhmLi4yZGMwOTFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb25fcm90YXRlLmMKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uX3JvdGF0ZS5jCkBAIC0xOCw4ICsxOCw3IEBACiAjaW5jbHVkZSAiZmJjb24uaCIKICNpbmNsdWRlICJmYmNvbl9yb3RhdGUuaCIKIAotc3RhdGljIGludCBmYmNvbl9yb3RhdGVfZm9udChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZjX2RhdGEgKnZjLAotCQkJICAgICBzdHJ1Y3QgZGlzcGxheSAqcCkKK3N0YXRpYyBpbnQgZmJjb25fcm90YXRlX2ZvbnQoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCB2Y19kYXRhICp2YykKIHsKIAlzdHJ1Y3QgZmJjb25fb3BzICpvcHMgPSBpbmZvLT5mYmNvbl9wYXI7CiAJaW50IGxlbiwgZXJyID0gMDsKQEAgLTI4LDEyICsyNywxMiBAQAogCXU4ICpkc3Q7CiAKIAlpZiAodmMtPnZjX2ZvbnQuZGF0YSA9PSBvcHMtPmZvbnRkYXRhICYmCi0JICAgIHAtPmNvbl9yb3RhdGUgPT0gb3BzLT5jdXJfcm90YXRlKQorCSAgICBvcHMtPnAtPmNvbl9yb3RhdGUgPT0gb3BzLT5jdXJfcm90YXRlKQogCQlnb3RvIGZpbmlzaGVkOwogCiAJc3JjID0gb3BzLT5mb250ZGF0YSA9IHZjLT52Y19mb250LmRhdGE7Ci0Jb3BzLT5jdXJfcm90YXRlID0gcC0+Y29uX3JvdGF0ZTsKLQlsZW4gPSAoIXAtPnVzZXJmb250KSA/IDI1NiA6IEZOVENIQVJDTlQoc3JjKTsKKwlvcHMtPmN1cl9yb3RhdGUgPSBvcHMtPnAtPmNvbl9yb3RhdGU7CisJbGVuID0gKCFvcHMtPnAtPnVzZXJmb250KSA/IDI1NiA6IEZOVENIQVJDTlQoc3JjKTsKIAlzX2NlbGxzaXplID0gKCh2Yy0+dmNfZm9udC53aWR0aCArIDcpLzgpICoKIAkJdmMtPnZjX2ZvbnQuaGVpZ2h0OwogCWRfY2VsbHNpemUgPSBzX2NlbGxzaXplOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uX3JvdGF0ZS5oIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uX3JvdGF0ZS5oCmluZGV4IDFiOGY5MmYuLjc1YmU1Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbl9yb3RhdGUuaAorKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb25fcm90YXRlLmgKQEAgLTExLDggKzExLDYgQEAKICNpZm5kZWYgX0ZCQ09OX1JPVEFURV9ICiAjZGVmaW5lIF9GQkNPTl9ST1RBVEVfSAogCi0jZGVmaW5lIEZOVENIQVJDTlQoZmQpCSgoKGludCAqKShmZCkpWy0zXSkKLQogI2RlZmluZSBHRVRWWVJFUyhzLGkpICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAocyA9PSBTQ1JPTExfUkVEUkFXIHx8IHMgPT0gU0NST0xMX01PVkUpID8gXAogICAgICAgICAoaSktPnZhci55cmVzIDogKGkpLT52YXIueXJlc192aXJ0dWFsOyB9KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uX3VkLmMgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb25fdWQuYwppbmRleCA5ZGQwNTllLi5mNTZlZDA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb25fdWQuYworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb25fdWQuYwpAQCAtMjQ5LDIwICsyNDksMTkgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHVkX2N1cnNvcihzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBmYl9pbmZvICppbmZvLAotCQkgICAgICBzdHJ1Y3QgZGlzcGxheSAqcCwgaW50IG1vZGUsIGludCBzb2Z0YmFja19saW5lcywKLQkJICAgICAgaW50IGZnLCBpbnQgYmcpCitzdGF0aWMgdm9pZCB1ZF9jdXJzb3Ioc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IG1vZGUsCisJCSAgICAgIGludCBzb2Z0YmFja19saW5lcywgaW50IGZnLCBpbnQgYmcpCiB7CiAJc3RydWN0IGZiX2N1cnNvciBjdXJzb3I7Ci0Jc3RydWN0IGZiY29uX29wcyAqb3BzID0gKHN0cnVjdCBmYmNvbl9vcHMgKikgaW5mby0+ZmJjb25fcGFyOworCXN0cnVjdCBmYmNvbl9vcHMgKm9wcyA9IGluZm8tPmZiY29uX3BhcjsKIAl1bnNpZ25lZCBzaG9ydCBjaGFybWFzayA9IHZjLT52Y19oaV9mb250X21hc2sgPyAweDFmZiA6IDB4ZmY7CiAJaW50IHcgPSAodmMtPnZjX2ZvbnQud2lkdGggKyA3KSA+PiAzLCBjOwotCWludCB5ID0gcmVhbF95KHAsIHZjLT52Y195KTsKKwlpbnQgeSA9IHJlYWxfeShvcHMtPnAsIHZjLT52Y195KTsKIAlpbnQgYXR0cmlidXRlLCB1c2Vfc3cgPSAodmMtPnZjX2N1cnNvcl90eXBlICYgMHgxMCk7CiAJaW50IGVyciA9IDEsIGR4LCBkeTsKIAljaGFyICpzcmM7Ci0JdTMyIHZ5cmVzID0gR0VUVllSRVMocC0+c2Nyb2xsbW9kZSwgaW5mbyk7Ci0JdTMyIHZ4cmVzID0gR0VUVlhSRVMocC0+c2Nyb2xsbW9kZSwgaW5mbyk7CisJdTMyIHZ5cmVzID0gR0VUVllSRVMob3BzLT5wLT5zY3JvbGxtb2RlLCBpbmZvKTsKKwl1MzIgdnhyZXMgPSBHRVRWWFJFUyhvcHMtPnAtPnNjcm9sbG1vZGUsIGluZm8pOwogCiAJaWYgKCFvcHMtPmZvbnRidWZmZXIpCiAJCXJldHVybjsKQEAgLTMzNCw3ICszMzMsNyBAQAogCX0KIAogCWlmIChjdXJzb3Iuc2V0ICYgRkJfQ1VSX1NFVFNJWkUgfHwKLQkgICAgdmMtPnZjX2N1cnNvcl90eXBlICE9IHAtPmN1cnNvcl9zaGFwZSB8fAorCSAgICB2Yy0+dmNfY3Vyc29yX3R5cGUgIT0gb3BzLT5wLT5jdXJzb3Jfc2hhcGUgfHwKIAkgICAgb3BzLT5jdXJzb3Jfc3RhdGUubWFzayA9PSBOVUxMIHx8CiAJICAgIG9wcy0+Y3Vyc29yX3Jlc2V0KSB7CiAJCWNoYXIgKm1hc2sgPSBrbWFsbG9jKHcqdmMtPnZjX2ZvbnQuaGVpZ2h0LCBHRlBfQVRPTUlDKTsKQEAgLTM0NywxMCArMzQ2LDEwIEBACiAJCWtmcmVlKG9wcy0+Y3Vyc29yX3N0YXRlLm1hc2spOwogCQlvcHMtPmN1cnNvcl9zdGF0ZS5tYXNrID0gbWFzazsKIAotCQlwLT5jdXJzb3Jfc2hhcGUgPSB2Yy0+dmNfY3Vyc29yX3R5cGU7CisJCW9wcy0+cC0+Y3Vyc29yX3NoYXBlID0gdmMtPnZjX2N1cnNvcl90eXBlOwogCQljdXJzb3Iuc2V0IHw9IEZCX0NVUl9TRVRTSEFQRTsKIAotCQlzd2l0Y2ggKHAtPmN1cnNvcl9zaGFwZSAmIENVUl9IV01BU0spIHsKKwkJc3dpdGNoIChvcHMtPnAtPmN1cnNvcl9zaGFwZSAmIENVUl9IV01BU0spIHsKIAkJY2FzZSBDVVJfTk9ORToKIAkJCWN1cl9oZWlnaHQgPSAwOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvc29mdGN1cnNvci5jIGIvZHJpdmVycy92aWRlby9jb25zb2xlL3NvZnRjdXJzb3IuYwppbmRleCA4NTI5YmYwLi4zOTU3ZmM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvc29mdGN1cnNvci5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9zb2Z0Y3Vyc29yLmMKQEAgLTE3LDYgKzE3LDggQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCisjaW5jbHVkZSAiZmJjb24uaCIKKwogaW50IHNvZnRfY3Vyc29yKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmJfY3Vyc29yICpjdXJzb3IpCiB7CiAJdW5zaWduZWQgaW50IHNjYW5fYWxpZ24gPSBpbmZvLT5waXhtYXAuc2Nhbl9hbGlnbiAtIDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvdGlsZWJsaXQuYyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS90aWxlYmxpdC5jCmluZGV4IGNiMjUzMjQuLjE1MzM1MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS90aWxlYmxpdC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS90aWxlYmxpdC5jCkBAIC04MCw5ICs4MCw4IEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZCB0aWxlX2N1cnNvcihzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBmYl9pbmZvICppbmZvLAotCQkJc3RydWN0IGRpc3BsYXkgKnAsIGludCBtb2RlLCBpbnQgc29mdGJhY2tfbGluZXMsCi0JCQlpbnQgZmcsIGludCBiZykKK3N0YXRpYyB2b2lkIHRpbGVfY3Vyc29yKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGZiX2luZm8gKmluZm8sIGludCBtb2RlLAorCQkJaW50IHNvZnRiYWNrX2xpbmVzLCBpbnQgZmcsIGludCBiZykKIHsKIAlzdHJ1Y3QgZmJfdGlsZWN1cnNvciBjdXJzb3I7CiAJaW50IHVzZV9zdyA9ICh2Yy0+dmNfY3Vyc29yX3R5cGUgJiAweDAxKTsKQEAgLTEzMCwxMCArMTI5LDEwIEBACiAJcmV0dXJuIGVycjsKIH0KIAotdm9pZCBmYmNvbl9zZXRfdGlsZW9wcyhzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBmYl9pbmZvICppbmZvLAotCQkgICAgICAgc3RydWN0IGRpc3BsYXkgKnAsIHN0cnVjdCBmYmNvbl9vcHMgKm9wcykKK3ZvaWQgZmJjb25fc2V0X3RpbGVvcHMoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgZmJfdGlsZW1hcCBtYXA7CisJc3RydWN0IGZiY29uX29wcyAqb3BzID0gaW5mby0+ZmJjb25fcGFyOwogCiAJb3BzLT5ibW92ZSA9IHRpbGVfYm1vdmU7CiAJb3BzLT5jbGVhciA9IHRpbGVfY2xlYXI7CkBAIC0xNDIsMTMgKzE0MSwxMyBAQAogCW9wcy0+Y3Vyc29yID0gdGlsZV9jdXJzb3I7CiAJb3BzLT51cGRhdGVfc3RhcnQgPSB0aWxlX3VwZGF0ZV9zdGFydDsKIAotCWlmIChwKSB7CisJaWYgKG9wcy0+cCkgewogCQltYXAud2lkdGggPSB2Yy0+dmNfZm9udC53aWR0aDsKIAkJbWFwLmhlaWdodCA9IHZjLT52Y19mb250LmhlaWdodDsKIAkJbWFwLmRlcHRoID0gMTsKLQkJbWFwLmxlbmd0aCA9IChwLT51c2VyZm9udCkgPwotCQkJRk5UQ0hBUkNOVChwLT5mb250ZGF0YSkgOiAyNTY7Ci0JCW1hcC5kYXRhID0gcC0+Zm9udGRhdGE7CisJCW1hcC5sZW5ndGggPSAob3BzLT5wLT51c2VyZm9udCkgPworCQkJRk5UQ0hBUkNOVChvcHMtPnAtPmZvbnRkYXRhKSA6IDI1NjsKKwkJbWFwLmRhdGEgPSBvcHMtPnAtPmZvbnRkYXRhOwogCQlpbmZvLT50aWxlb3BzLT5mYl9zZXR0aWxlKGluZm8sICZtYXApOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS92Z2Fjb24uYyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS92Z2Fjb24uYwppbmRleCAxNjdkZTM5Li4xMmQ5MzI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvdmdhY29uLmMKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL3ZnYWNvbi5jCkBAIC01Niw2ICs1Niw4IEBACiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHZnYV9sb2NrKTsKIHN0YXRpYyBpbnQgY3Vyc29yX3NpemVfbGFzdGZyb207CiBzdGF0aWMgaW50IGN1cnNvcl9zaXplX2xhc3R0bzsKK3N0YXRpYyB1MzIgdmdhY29uX3hyZXM7CitzdGF0aWMgdTMyIHZnYWNvbl95cmVzOwogc3RhdGljIHN0cnVjdCB2Z2FzdGF0ZSBzdGF0ZTsKIAogI2RlZmluZSBCTEFOSyAweDAwMjAKQEAgLTY5LDcgKzcxLDcgQEAKICAqIGFwcGVhci4KICAqLwogI3VuZGVmIFRSSURFTlRfR0xJVENICi0KKyNkZWZpbmUgVkdBX0ZPTlRXSURUSCAgICAgICA4ICAgLyogVkdBIGRvZXMgbm90IHN1cHBvcnQgZm9udHdpZHRocyAhPSA4ICovCiAvKgogICogIEludGVyZmFjZSB1c2VkIGJ5IHRoZSB3b3JsZAogICovCkBAIC0zMjUsNiArMzI3LDEwIEBACiAJCXZnYV9zY2FuX2xpbmVzID0KIAkJICAgIHZnYV92aWRlb19mb250X2hlaWdodCAqIHZnYV92aWRlb19udW1fbGluZXM7CiAJfQorCisJdmdhY29uX3hyZXMgPSBPUklHX1ZJREVPX0NPTFMgKiBWR0FfRk9OVFdJRFRIOworCXZnYWNvbl95cmVzID0gdmdhX3NjYW5fbGluZXM7CisKIAlyZXR1cm4gZGlzcGxheV9kZXNjOwogfQogCkBAIC01MDMsMTAgKzUwOSwxOCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IHNjYW5saW5lcyA9IGhlaWdodCAqIGMtPnZjX2ZvbnQuaGVpZ2h0OwotCXU4IHNjYW5saW5lc19sbywgcjcsIHZzeW5jX2VuZCwgbW9kZTsKKwl1OCBzY2FubGluZXNfbG8sIHI3LCB2c3luY19lbmQsIG1vZGUsIG1heF9zY2FuOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnZnYV9sb2NrLCBmbGFncyk7CiAKKwlvdXRiX3AoVkdBX0NSVENfTUFYX1NDQU4sIHZnYV92aWRlb19wb3J0X3JlZyk7CisJbWF4X3NjYW4gPSBpbmJfcCh2Z2FfdmlkZW9fcG9ydF92YWwpOworCisJaWYgKG1heF9zY2FuICYgMHg4MCkKKwkJc2NhbmxpbmVzIDw8PSAxOworCisJdmdhY29uX3hyZXMgPSB3aWR0aCAqIFZHQV9GT05UV0lEVEg7CisJdmdhY29uX3lyZXMgPSBoZWlnaHQgKiBjLT52Y19mb250LmhlaWdodDsKIAlvdXRiX3AoVkdBX0NSVENfTU9ERSwgdmdhX3ZpZGVvX3BvcnRfcmVnKTsKIAltb2RlID0gaW5iX3AodmdhX3ZpZGVvX3BvcnRfdmFsKTsKIApAQCAtNTUxLDYgKzU2NSwxMCBAQAogCiBzdGF0aWMgaW50IHZnYWNvbl9zd2l0Y2goc3RydWN0IHZjX2RhdGEgKmMpCiB7CisJaW50IHggPSBjLT52Y19jb2xzICogVkdBX0ZPTlRXSURUSDsKKwlpbnQgeSA9IGMtPnZjX3Jvd3MgKiBjLT52Y19mb250LmhlaWdodDsKKwlpbnQgcm93cyA9IE9SSUdfVklERU9fTElORVMgKiB2Z2FfZGVmYXVsdF9mb250X2hlaWdodC8KKwkJYy0+dmNfZm9udC5oZWlnaHQ7CiAJLyoKIAkgKiBXZSBuZWVkIHRvIHNhdmUgc2NyZWVuIHNpemUgaGVyZSBhcyBpdCdzIHRoZSBvbmx5IHdheQogCSAqIHdlIGNhbiBzcG90IHRoZSBzY3JlZW4gaGFzIGJlZW4gcmVzaXplZCBhbmQgd2UgbmVlZCB0bwpAQCAtNTY2LDEwICs1ODQsMTEgQEAKIAkJc2NyX21lbWNweXcoKHUxNiAqKSBjLT52Y19vcmlnaW4sICh1MTYgKikgYy0+dmNfc2NyZWVuYnVmLAogCQkJICAgIGMtPnZjX3NjcmVlbmJ1Zl9zaXplID4gdmdhX3ZyYW1fc2l6ZSA/CiAJCQkJdmdhX3ZyYW1fc2l6ZSA6IGMtPnZjX3NjcmVlbmJ1Zl9zaXplKTsKLQkJaWYgKCEodmdhX3ZpZGVvX251bV9jb2x1bW5zICUgMikgJiYKLQkJICAgIHZnYV92aWRlb19udW1fY29sdW1ucyA8PSBPUklHX1ZJREVPX0NPTFMgJiYKLQkJICAgIHZnYV92aWRlb19udW1fbGluZXMgPD0gKE9SSUdfVklERU9fTElORVMgKgotCQkJdmdhX2RlZmF1bHRfZm9udF9oZWlnaHQpIC8gYy0+dmNfZm9udC5oZWlnaHQpCisKKwkJaWYgKCh2Z2Fjb25feHJlcyAhPSB4IHx8IHZnYWNvbl95cmVzICE9IHkpICYmCisJCSAgICAoISh2Z2FfdmlkZW9fbnVtX2NvbHVtbnMgJSAyKSAmJgorCQkgICAgIHZnYV92aWRlb19udW1fY29sdW1ucyA8PSBPUklHX1ZJREVPX0NPTFMgJiYKKwkJICAgICB2Z2FfdmlkZW9fbnVtX2xpbmVzIDw9IHJvd3MpKQogCQkJdmdhY29uX2RvcmVzaXplKGMsIGMtPnZjX2NvbHMsIGMtPnZjX3Jvd3MpOwogCX0KIApAQCAtOTkzLDcgKzEwMTIsOCBAQAogCWlmICh2Z2FfdmlkZW9fdHlwZSA8IFZJREVPX1RZUEVfRUdBTSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoZm9udC0+d2lkdGggIT0gOCB8fCAoY2hhcmNvdW50ICE9IDI1NiAmJiBjaGFyY291bnQgIT0gNTEyKSkKKwlpZiAoZm9udC0+d2lkdGggIT0gVkdBX0ZPTlRXSURUSCB8fAorCSAgICAoY2hhcmNvdW50ICE9IDI1NiAmJiBjaGFyY291bnQgIT0gNTEyKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyYyA9IHZnYWNvbl9kb19mb250X29wKCZzdGF0ZSwgZm9udC0+ZGF0YSwgMSwgY2hhcmNvdW50ID09IDUxMik7CkBAIC0xMDEwLDcgKzEwMzAsNyBAQAogCWlmICh2Z2FfdmlkZW9fdHlwZSA8IFZJREVPX1RZUEVfRUdBTSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlmb250LT53aWR0aCA9IDg7CisJZm9udC0+d2lkdGggPSBWR0FfRk9OVFdJRFRIOwogCWZvbnQtPmhlaWdodCA9IGMtPnZjX2ZvbnQuaGVpZ2h0OwogCWZvbnQtPmNoYXJjb3VudCA9IHZnYV81MTJfY2hhcnMgPyA1MTIgOiAyNTY7CiAJaWYgKCFmb250LT5kYXRhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb250cm9sZmIuYyBiL2RyaXZlcnMvdmlkZW8vY29udHJvbGZiLmMKaW5kZXggNDAzZDE3My4uNjU1MzAxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb250cm9sZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnRyb2xmYi5jCkBAIC0xMjgsMTcgKzEyOCwxMSBAQAogc3RhdGljIGludCBjb250cm9sZmJfc2V0Y29scmVnKHVfaW50IHJlZ25vLCB1X2ludCByZWQsIHVfaW50IGdyZWVuLCB1X2ludCBibHVlLAogCXVfaW50IHRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pOwogc3RhdGljIGludCBjb250cm9sZmJfYmxhbmsoaW50IGJsYW5rX21vZGUsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLXN0YXRpYyBpbnQgY29udHJvbGZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmaWxlICpmaWxlLAorc3RhdGljIGludCBjb250cm9sZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiBzdGF0aWMgaW50IGNvbnRyb2xmYl9zZXRfcGFyIChzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiBzdGF0aWMgaW50IGNvbnRyb2xmYl9jaGVja192YXIgKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiAKLS8qCi0gKiBpbml0aXRpYWxpemF0aW9uCi0gKi8KLWludCBjb250cm9sX2luaXQodm9pZCk7Ci12b2lkIGNvbnRyb2xfc2V0dXAoY2hhciAqKTsKLQogLyoqKioqKioqKioqKioqKioqKioqIFByb3RvdHlwZXMgZm9yIGludGVybmFsIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZCBzZXRfY29udHJvbF9jbG9jayh1bnNpZ25lZCBjaGFyICpwYXJhbXMpOwpAQCAtMjg2LDcgKzI4MCw3IEBACiAgKiBmb3IgY29udHJvbGZiLgogICogTm90ZSB0aGVyZSdzIG5vIGxvY2tpbmcgaW4gaGVyZTsgaXQncyBkb25lIGluIGZiX21tYXAoKSBpbiBmYm1lbS5jLgogICovCi1zdGF0aWMgaW50IGNvbnRyb2xmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKK3N0YXRpYyBpbnQgY29udHJvbGZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogICAgICAgIHVuc2lnbmVkIGxvbmcgb2ZmLCBzdGFydDsKQEAgLTU1MCw5ICs1NDQsNDYgQEAKIAogCiAvKgotICogQ2FsbGVkIGZyb20gZmJtZW0uYyBmb3IgcHJvYmluZyAmIGluaXRpYWxpemluZworICogUGFyc2UgdXNlciBzcGVmaWNpZWQgb3B0aW9ucyAoYHZpZGVvPWNvbnRyb2xmYjonKQogICovCi1pbnQgX19pbml0IGNvbnRyb2xfaW5pdCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGNvbnRyb2xfc2V0dXAoY2hhciAqb3B0aW9ucykKK3sKKwljaGFyICp0aGlzX29wdDsKKworCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCisJCXJldHVybjsKKworCXdoaWxlICgodGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidm1vZGU6IiwgNikpIHsKKwkJCWludCB2bW9kZSA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0KzYsIE5VTEwsIDApOworCQkJaWYgKHZtb2RlID4gMCAmJiB2bW9kZSA8PSBWTU9ERV9NQVggJiYKKwkJCSAgICBjb250cm9sX21hY19tb2Rlc1t2bW9kZSAtIDFdLm1bMV0gPj0gMCkKKwkJCQlkZWZhdWx0X3Ztb2RlID0gdm1vZGU7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJjbW9kZToiLCA2KSkgeworCQkJaW50IGRlcHRoID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQrNiwgTlVMTCwgMCk7CisJCQlzd2l0Y2ggKGRlcHRoKSB7CisJCQkgY2FzZSBDTU9ERV84OgorCQkJIGNhc2UgQ01PREVfMTY6CisJCQkgY2FzZSBDTU9ERV8zMjoKKwkJCSAJZGVmYXVsdF9jbW9kZSA9IGRlcHRoOworCQkJIAlicmVhazsKKwkJCSBjYXNlIDg6CisJCQkJZGVmYXVsdF9jbW9kZSA9IENNT0RFXzg7CisJCQkJYnJlYWs7CisJCQkgY2FzZSAxNToKKwkJCSBjYXNlIDE2OgorCQkJCWRlZmF1bHRfY21vZGUgPSBDTU9ERV8xNjsKKwkJCQlicmVhazsKKwkJCSBjYXNlIDI0OgorCQkJIGNhc2UgMzI6CisJCQkJZGVmYXVsdF9jbW9kZSA9IENNT0RFXzMyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBjb250cm9sX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwogCWNoYXIgKm9wdGlvbiA9IE5VTEw7CkBAIC02NTEsMTUgKzY4MiwxNiBAQAogc3RhdGljIGludCBfX2luaXQgY29udHJvbF9vZl9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCiB7CiAJc3RydWN0IGZiX2luZm9fY29udHJvbAkqcDsKLQl1bnNpZ25lZCBsb25nCQlhZGRyOwotCWludAkJCWk7CisJc3RydWN0IHJlc291cmNlCQlmYl9yZXMsIHJlZ19yZXM7CiAKIAlpZiAoY29udHJvbF9mYikgewogCQlwcmludGsoS0VSTl9FUlIgImNvbnRyb2xmYjogb25seSBvbmUgY29udHJvbCBpcyBzdXBwb3J0ZWRcbiIpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KLQlpZihkcC0+bl9hZGRycyAhPSAyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZXhwZWN0aW5nIDIgYWRkcmVzcyBmb3IgY29udHJvbCAoZ290ICVkKSIsIGRwLT5uX2FkZHJzKTsKKworCWlmIChvZl9wY2lfYWRkcmVzc190b19yZXNvdXJjZShkcCwgMiwgJmZiX3JlcykgfHwKKwkgICAgb2ZfcGNpX2FkZHJlc3NfdG9fcmVzb3VyY2UoZHAsIDEsICZyZWdfcmVzKSkgeworCQlwcmludGsoS0VSTl9FUlIgImNhbid0IGdldCAyIGFkZHJlc3NlcyBmb3IgY29udHJvbFxuIik7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCXAgPSBrbWFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOwpAQCAtNjY5LDE4ICs3MDEsMTIgQEAKIAltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CiAKIAkvKiBNYXAgaW4gZnJhbWUgYnVmZmVyIGFuZCByZWdpc3RlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgZHAtPm5fYWRkcnM7ICsraSkgewotCQlhZGRyID0gZHAtPmFkZHJzW2ldLmFkZHJlc3M7Ci0JCWlmIChkcC0+YWRkcnNbaV0uc2l6ZSA+PSAweDgwMDAwMCkgewotCQkJcC0+ZmJfb3JpZ19iYXNlID0gYWRkcjsKLQkJCXAtPmZiX29yaWdfc2l6ZSA9IGRwLT5hZGRyc1tpXS5zaXplOwotCQkJLyogdXNlIHRoZSBiaWctZW5kaWFuIGFwZXJ0dXJlICg/PykgKi8KLQkJCXAtPmZyYW1lX2J1ZmZlcl9waHlzID0gYWRkciArIDB4ODAwMDAwOwotCQl9IGVsc2UgewotCQkJcC0+Y29udHJvbF9yZWdzX3BoeXMgPSBhZGRyOwotCQkJcC0+Y29udHJvbF9yZWdzX3NpemUgPSBkcC0+YWRkcnNbaV0uc2l6ZTsKLQkJfQotCX0KKwlwLT5mYl9vcmlnX2Jhc2UgPSBmYl9yZXMuc3RhcnQ7CisJcC0+ZmJfb3JpZ19zaXplID0gZmJfcmVzLmVuZCAtIGZiX3Jlcy5zdGFydCArIDE7CisJLyogdXNlIHRoZSBiaWctZW5kaWFuIGFwZXJ0dXJlICg/PykgKi8KKwlwLT5mcmFtZV9idWZmZXJfcGh5cyA9IGZiX3Jlcy5zdGFydCArIDB4ODAwMDAwOworCXAtPmNvbnRyb2xfcmVnc19waHlzID0gcmVnX3Jlcy5zdGFydDsKKwlwLT5jb250cm9sX3JlZ3Nfc2l6ZSA9IHJlZ19yZXMuZW5kIC0gcmVnX3Jlcy5zdGFydCArIDE7CiAKIAlpZiAoIXAtPmZiX29yaWdfYmFzZSB8fAogCSAgICAhcmVxdWVzdF9tZW1fcmVnaW9uKHAtPmZiX29yaWdfYmFzZSxwLT5mYl9vcmlnX3NpemUsImNvbnRyb2xmYiIpKSB7CkBAIC0xMDU5LDQzICsxMDg1LDMgQEAKIH0KIAogCi0vKgotICogUGFyc2UgdXNlciBzcGVmaWNpZWQgb3B0aW9ucyAoYHZpZGVvPWNvbnRyb2xmYjonKQotICovCi12b2lkIF9faW5pdCBjb250cm9sX3NldHVwKGNoYXIgKm9wdGlvbnMpCi17Ci0JY2hhciAqdGhpc19vcHQ7Ci0KLQlpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQotCQlyZXR1cm47Ci0KLQl3aGlsZSAoKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7Ci0JCWlmICghc3RybmNtcCh0aGlzX29wdCwgInZtb2RlOiIsIDYpKSB7Ci0JCQlpbnQgdm1vZGUgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCs2LCBOVUxMLCAwKTsKLQkJCWlmICh2bW9kZSA+IDAgJiYgdm1vZGUgPD0gVk1PREVfTUFYICYmCi0JCQkgICAgY29udHJvbF9tYWNfbW9kZXNbdm1vZGUgLSAxXS5tWzFdID49IDApCi0JCQkJZGVmYXVsdF92bW9kZSA9IHZtb2RlOwotCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAiY21vZGU6IiwgNikpIHsKLQkJCWludCBkZXB0aCA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0KzYsIE5VTEwsIDApOwotCQkJc3dpdGNoIChkZXB0aCkgewotCQkJIGNhc2UgQ01PREVfODoKLQkJCSBjYXNlIENNT0RFXzE2OgotCQkJIGNhc2UgQ01PREVfMzI6Ci0JCQkgCWRlZmF1bHRfY21vZGUgPSBkZXB0aDsKLQkJCSAJYnJlYWs7Ci0JCQkgY2FzZSA4OgotCQkJCWRlZmF1bHRfY21vZGUgPSBDTU9ERV84OwotCQkJCWJyZWFrOwotCQkJIGNhc2UgMTU6Ci0JCQkgY2FzZSAxNjoKLQkJCQlkZWZhdWx0X2Ntb2RlID0gQ01PREVfMTY7Ci0JCQkJYnJlYWs7Ci0JCQkgY2FzZSAyNDoKLQkJCSBjYXNlIDMyOgotCQkJCWRlZmF1bHRfY21vZGUgPSBDTU9ERV8zMjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jeWJlcjIwMDBmYi5jIGIvZHJpdmVycy92aWRlby9jeWJlcjIwMDBmYi5jCmluZGV4IGE5MzAwZjkuLjU1YTM1MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY3liZXIyMDAwZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2N5YmVyMjAwMGZiLmMKQEAgLTUwLDcgKzUwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY3libGFmYi5jIGIvZHJpdmVycy92aWRlby9jeWJsYWZiLmMKaW5kZXggMDNmYmU4My4uMmI5NzI0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jeWJsYWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9jeWJsYWZiLmMKQEAgLTcsMTEgKzcsMTIgQEAKICAqCXRyaWRlbnRmYi5jIGJ5IEphbmkgTW9ub3NlcwogICoJc2VlIGZpbGVzIGFib3ZlIGZvciBmdXJ0aGVyIGNyZWRpdHMKICAqCi0gKiBUT0RPOgotICoKICAqLwogCiAjZGVmaW5lIENZQkxBRkJfREVCVUcgMAorI2RlZmluZSBDWUJMQUZCX0tEX0dSQVBISUNTX1FVSVJLIDEKKworI2RlZmluZSBDWUJMQUZCX1BJWE1BUFNJWkUgODE5MgogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0yMiw3ICsyMyw3IEBACiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8dmlkZW8vY3libGFmYi5oPgogCi0jZGVmaW5lIFZFUlNJT04gIjAuNTQiCisjZGVmaW5lIFZFUlNJT04gIjAuNjIiCiAKIHN0cnVjdCBjeWJsYWZiX3BhciB7CiAJdTMyIHBzZXVkb19wYWxbMTZdOwpAQCAtMzIsNyArMzMsOSBAQAogc3RhdGljIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBjeWJsYWZiX2ZpeCBfX2RldmluaXRkYXRhID0gewogCS5pZCA9ICJDeUJsYSIsCiAJLnR5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFMsCisJLnhwYW5zdGVwID0gMSwKIAkueXBhbnN0ZXAgPSAxLAorCS55d3JhcHN0ZXAgPSAxLAogCS52aXN1YWwgPSBGQl9WSVNVQUxfUFNFVURPQ09MT1IsCiAJLmFjY2VsID0gRkJfQUNDRUxfTk9ORSwKIH07CkBAIC00Myw4ICs0Niw5IEBACiBzdGF0aWMgaW50IGZwIF9fZGV2aW5pdGRhdGE7CiBzdGF0aWMgaW50IGNydCBfX2RldmluaXRkYXRhOwogc3RhdGljIGludCBtZW1zaXplIF9fZGV2aW5pdGRhdGE7Ci1zdGF0aWMgaW50IHZlc2FmYiBfX2RldmluaXRkYXRhOwogCitzdGF0aWMgaW50IGJhc2VzdHJpZGU7CitzdGF0aWMgaW50IHZlc2FmYjsKIHN0YXRpYyBpbnQgbmF0aXZleDsKIHN0YXRpYyBpbnQgY2VudGVyOwogc3RhdGljIGludCBzdHJldGNoOwpAQCAtNTIsMjYgKzU2LDUwIEBACiBzdGF0aWMgaW50IHBjaXJiID0gMTsKIHN0YXRpYyBpbnQgcGNpd3IgPSAxOwogc3RhdGljIGludCBwY2lyciA9IDE7CitzdGF0aWMgaW50IGRpc2FibGVkOwogc3RhdGljIGludCB2ZXJib3NpdHk7CiBzdGF0aWMgaW50IGRpc3BsYXl0eXBlOwogCi1zdGF0aWMgdm9pZCBfX2lvbWVtICogaW9fdmlydDsgLy8gaW9zcGFjZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzCitzdGF0aWMgdm9pZCBfX2lvbWVtICppb192aXJ0OwkvLyBpb3NwYWNlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MKIAotbW9kdWxlX3BhcmFtKG1vZGUsY2hhcnAsMCk7Ci1tb2R1bGVfcGFyYW0oYnBwLGludCwwKTsKLW1vZHVsZV9wYXJhbShyZWYsaW50LDApOwotbW9kdWxlX3BhcmFtKGZwLGludCwwKTsKLW1vZHVsZV9wYXJhbShjcnQsaW50LDApOwotbW9kdWxlX3BhcmFtKG5hdGl2ZXgsaW50LDApOwotbW9kdWxlX3BhcmFtKGNlbnRlcixpbnQsMCk7Ci1tb2R1bGVfcGFyYW0oc3RyZXRjaCxpbnQsMCk7Ci1tb2R1bGVfcGFyYW0ocGNpd2IsaW50LDApOwotbW9kdWxlX3BhcmFtKHBjaXJiLGludCwwKTsKLW1vZHVsZV9wYXJhbShwY2l3cixpbnQsMCk7Ci1tb2R1bGVfcGFyYW0ocGNpcnIsaW50LDApOwotbW9kdWxlX3BhcmFtKG1lbXNpemUsaW50LDApOwotbW9kdWxlX3BhcmFtKHZlcmJvc2l0eSxpbnQsMCk7Ci1tb2R1bGVfcGFyYW0odmVzYWZiLGludCwwKTsKK21vZHVsZV9wYXJhbShtb2RlLCBjaGFycCwgMCk7Cittb2R1bGVfcGFyYW0oYnBwLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJlZiwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShmcCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjcnQsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obmF0aXZleCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjZW50ZXIsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oc3RyZXRjaCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShwY2l3YiwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShwY2lyYiwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShwY2l3ciwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShwY2lyciwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShtZW1zaXplLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHZlcmJvc2l0eSwgaW50LCAwKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFdlbGwsIHdlIGhhdmUgdG8gZml4IHRoZSB1cHBlciBsYXllcnMuCisvLyBVbnRpbCB0aGlzIGhhcyBiZWVuIGRvbmUsIHdlIHdvcmsgYXJvdW5kCisvLyB0aGUgYnVncy4KKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZiAoQ1lCTEFGQl9LRF9HUkFQSElDU19RVUlSSyAmJiBDWUJMQUZCX0RFQlVHKQorCWlmIChkaXNhYmxlZCkgeyBcCisJCXByaW50aygiKioqKioqKipcbiIpO1wKKwkJZHVtcF9zdGFjaygpO1wKKwkJcmV0dXJuIHZhbDtcCisJfQorCisjZWxpZiBDWUJMQUZCX0tEX0dSQVBISUNTX1FVSVJLCisjZGVmaW5lIEtEX0dSQVBISUNTX1JFVFVSTih2YWwpXAorCWlmIChkaXNhYmxlZCkge1wKKwkJcmV0dXJuIHZhbDtcCisJfQorI2Vsc2UKKyNkZWZpbmUgS0RfR1JBUEhJQ1NfUkVUVVJOKHZhbCkKKyNlbmRpZgogCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLwpAQCAtNzksMTAgKzEwNywxMCBAQAogLy8KIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotI2RlZmluZSBvdXQ4KHIsdikgd3JpdGViKHYsaW9fdmlydCtyKQotI2RlZmluZSBvdXQzMihyLHYpIHdyaXRlbCh2LGlvX3ZpcnQrcikKLSNkZWZpbmUgaW44KHIpIHJlYWRiKGlvX3ZpcnQrcikKLSNkZWZpbmUgaW4zMihyKSByZWFkbChpb192aXJ0K3IpCisjZGVmaW5lIG91dDgociwgdikgd3JpdGViKHYsIGlvX3ZpcnQgKyByKQorI2RlZmluZSBvdXQzMihyLCB2KSB3cml0ZWwodiwgaW9fdmlydCArIHIpCisjZGVmaW5lIGluOChyKSByZWFkYihpb192aXJ0ICsgcikKKyNkZWZpbmUgaW4zMihyKSByZWFkbChpb192aXJ0ICsgcikKIAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8KQEAgLTkwLDQ3ICsxMTgsNDcgQEAKIC8vCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByZWFkM1g0KGludCByZWcpCitzdGF0aWMgaW5saW5lIHU4IHJlYWQzWDQodTMyIHJlZykKIHsKLQlvdXQ4KDB4M0Q0LHJlZyk7CisJb3V0OCgweDNENCwgcmVnKTsKIAlyZXR1cm4gaW44KDB4M0Q1KTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHJlYWQzQzQoaW50IHJlZykKK3N0YXRpYyBpbmxpbmUgdTggcmVhZDNDNCh1MzIgcmVnKQogewotCW91dDgoMHgzQzQscmVnKTsKKwlvdXQ4KDB4M0M0LCByZWcpOwogCXJldHVybiBpbjgoMHgzQzUpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmVhZDNDRShpbnQgcmVnKQorc3RhdGljIGlubGluZSB1OCByZWFkM0NFKHUzMiByZWcpCiB7Ci0Jb3V0OCgweDNDRSxyZWcpOworCW91dDgoMHgzQ0UsIHJlZyk7CiAJcmV0dXJuIGluOCgweDNDRik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZTNYNChpbnQgcmVnLHVuc2lnbmVkIGNoYXIgdmFsKQorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlM1g0KHUzMiByZWcsIHU4IHZhbCkKIHsKLQlvdXQ4KDB4M0Q0LHJlZyk7Ci0Jb3V0OCgweDNENSx2YWwpOworCW91dDgoMHgzRDQsIHJlZyk7CisJb3V0OCgweDNENSwgdmFsKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlM0M0KGludCByZWcsdW5zaWduZWQgY2hhciB2YWwpCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGUzQzQodTMyIHJlZywgdTggdmFsKQogewotCW91dDgoMHgzQzQscmVnKTsKLQlvdXQ4KDB4M0M1LHZhbCk7CisJb3V0OCgweDNDNCwgcmVnKTsKKwlvdXQ4KDB4M0M1LCB2YWwpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGUzQ0UoaW50IHJlZyx1bnNpZ25lZCBjaGFyIHZhbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZTNDRSh1MzIgcmVnLCB1OCB2YWwpCiB7Ci0Jb3V0OCgweDNDRSxyZWcpOwotCW91dDgoMHgzQ0YsdmFsKTsKKwlvdXQ4KDB4M0NFLCByZWcpOworCW91dDgoMHgzQ0YsIHZhbCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZTNDMChpbnQgcmVnLHVuc2lnbmVkIGNoYXIgdmFsKQorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlM0MwKHUzMiByZWcsIHU4IHZhbCkKIHsKLQlpbjgoMHgzREEpOwkvLyByZWFkIHRvIHJlc2V0IGluZGV4Ci0Jb3V0OCgweDNDMCxyZWcpOwotCW91dDgoMHgzQzAsdmFsKTsKKwlpbjgoMHgzREEpOwkJLy8gcmVhZCB0byByZXNldCBpbmRleAorCW91dDgoMHgzQzAsIHJlZyk7CisJb3V0OCgweDNDMCwgdmFsKTsKIH0KIAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xMzksNTggKzE2Nyw2MiBAQAogLy8KIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX21taW8odm9pZCkKK3N0YXRpYyB2b2lkIGVuYWJsZV9tbWlvKHZvaWQpCiB7Ci0JaW50IHRtcDsKKwl1OCB0bXA7CiAKLQlvdXRiKDB4MEIsMHgzQzQpOworCW91dGIoMHgwQiwgMHgzQzQpOwogCWluYigweDNDNSk7CQkvLyBTZXQgTkVXIG1vZGUKLQlvdXRiKFNSMEUsMHgzQzQpOwkvLyB3cml0ZSBlbmFibGUgYSBsb3Qgb2YgZXh0ZW5kZWQgcG9ydHMKLQlvdXRiKDB4ODAsMHgzQzUpOworCW91dGIoU1IwRSwgMHgzQzQpOwkvLyB3cml0ZSBlbmFibGUgYSBsb3Qgb2YgZXh0ZW5kZWQgcG9ydHMKKwlvdXRiKDB4ODAsIDB4M0M1KTsKIAotCW91dGIoU1IxMSwweDNDNCk7CS8vIHdyaXRlIGVuYWJsZSB0aG9zZSBleHRlbmRlZCBwb3J0cyB0aGF0Ci0Jb3V0YigweDg3LDB4M0M1KTsJLy8gYXJlIG5vdCBhZmZlY3RlZCBieSBTUjBFX05ldworCW91dGIoU1IxMSwgMHgzQzQpOwkvLyB3cml0ZSBlbmFibGUgdGhvc2UgZXh0ZW5kZWQgcG9ydHMgdGhhdAorCW91dGIoMHg4NywgMHgzQzUpOwkvLyBhcmUgbm90IGFmZmVjdGVkIGJ5IFNSMEVfTmV3CiAKLQlvdXRiKENSMUUsMHgzZDQpOwkvLyBjbGVhciB3cml0ZSBwcm90ZWN0IGJpdCBmb3IgcG9ydCAweDNjMgotCXRtcD1pbmIoMHgzZDUpICYgMHhCRjsKLQlvdXRiKENSMUUsMHgzZDQpOwotCW91dGIodG1wLDB4M2Q1KTsKKwlvdXRiKENSMUUsIDB4M2Q0KTsJLy8gY2xlYXIgd3JpdGUgcHJvdGVjdCBiaXQgZm9yIHBvcnQgMHgzYzIKKwl0bXAgPSBpbmIoMHgzZDUpICYgMHhCRjsKKwlvdXRiKENSMUUsIDB4M2Q0KTsKKwlvdXRiKHRtcCwgMHgzZDUpOwogCi0Jb3V0YihDUjM5LDB4M0Q0KTsKLQlvdXRiKGluYigweDNENSl8MHgwMSwweDNENSk7IC8vIEVuYWJsZSBtbWlvLCBldmVyeXRoaW5nIGVsc2UgdW50b3VjaGVkCisJb3V0YihDUjM5LCAweDNENCk7CisJb3V0YihpbmIoMHgzRDUpIHwgMHgwMSwgMHgzRDUpOyAvLyBFbmFibGUgbW1pbwogfQogCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vCiAvLyBTZXQgcGl4ZWwgY2xvY2sgVkNMSzEKLS8vICAgLSBtdWx0aXBsaWVycyBzZXQgZWxzd2hlcmUKLS8vICAgLSBmcmVxIGluIHVuaXRzIG9mIDAuMDEgTUh6CisvLyAtIG11bHRpcGxpZXJzIHNldCBlbHN3aGVyZQorLy8gLSBmcmVxIGluIHVuaXRzIG9mIDAuMDEgTUh6CisvLworLy8gSGFyZHdhcmUgYnVnOiBTUjE4ID49IDI1MCBpcyBicm9rZW4gZm9yIHRoZQorLy8JCSBjeWJlcmJsYWRlL2kxCiAvLwogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIHN0YXRpYyB2b2lkIHNldF92Y2xrKHN0cnVjdCBjeWJsYWZiX3BhciAqcGFyLCBpbnQgZnJlcSkKIHsKLQl1MzIgbSxuLGs7Ci0JaW50IGYsZmksZCxkaTsKLQl1OCBsbz0wLGhpPTA7CisJdTMyIG0sIG4sIGs7CisJaW50IGYsIGZpLCBkLCBkaTsKKwl1OCBsbyA9IDAsIGhpID0gMDsKIAogCWQgPSAyMDAwOwogCWsgPSBmcmVxID49IDEwMDAwID8gMCA6IGZyZXEgPj0gNTAwMCA/IDEgOiBmcmVxID49IDI1MDAgPyAyIDogMzsKLQlmb3IobSA9IDA7bTw2NDttKyspCi0JZm9yKG4gPSAwO248MjUwO24rKykgeyAvLyBtYXggMjQ5IGlzIGEgaGFyZHdhcmUgbGltaXQgZm9yIGN5YmxhL2kxICEKLQkJZmkgPSAoaW50KSgoKDU4NjQ3MjcqKG4rOCkpLygobSsyKSooMTw8aykpKT4+MTIpOwotCQlpZiAoKGRpID0gYWJzKGZpIC0gZnJlcSkpIDwgZCkgewotCQkJZCA9IGRpOwotCQkJZiA9IGZpOwotCQkJbG8gPSAodTgpIG47Ci0JCQloaSA9ICh1OCkgKChrPDw2KSB8IG0pOworCWZvciAobSA9IDA7IG0gPCA2NDsgbSsrKQorCQlmb3IgKG4gPSAwOyBuIDwgMjUwOyBuKyspIHsKKwkJCWZpID0gKGludCkoKCg1ODY0NzI3ICogKG4gKyA4KSkgLworCQkJCSAgICAoKG0gKyAyKSAqICgxIDw8IGspKSkgPj4gMTIpOworCQkJaWYgKChkaSA9IGFicyhmaSAtIGZyZXEpKSA8IGQpIHsKKwkJCQlkID0gZGk7CisJCQkJZiA9IGZpOworCQkJCWxvID0gKHU4KSBuOworCQkJCWhpID0gKHU4KSAoKGsgPDwgNikgfCBtKTsKKwkJCX0KIAkJfQotCX0KLQl3cml0ZTNDNChTUjE5LGhpKTsKLQl3cml0ZTNDNChTUjE4LGxvKTsKLQlpZih2ZXJib3NpdHkgPiAxKQorCXdyaXRlM0M0KFNSMTksIGhpKTsKKwl3cml0ZTNDNChTUjE4LCBsbyk7CisJaWYgKHZlcmJvc2l0eSA+IDApCiAJCW91dHB1dCgicGl4Y2xvY2sgPSAlZC4lMDJkIE1Ieiwgay9tL24gJXggJXggJXhcbiIsCi0JCWZyZXEvMTAwLGZyZXElMTAwLChoaSYweGMwKT4+NixoaSYweDNmLGxvKTsKKwkJICAgICAgIGZyZXEgLyAxMDAsIGZyZXEgJSAxMDAsIChoaSAmIDB4YzApID4+IDYsIGhpICYgMHgzZiwgbG8pOwogfQogCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTk5LDgzICsyMzEsODMgQEAKIC8vCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1zdGF0aWMgdm9pZCBjeWJsYWZiX3NldHVwX0dFKGludCBwaXRjaCxpbnQgYnBwKQorc3RhdGljIHZvaWQgY3libGFmYl9zZXR1cF9HRShpbnQgcGl0Y2gsIGludCBicHApCiB7Ci0JaW50IGJhc2UgPSAocGl0Y2g+PjMpPDwyMDsKKwlLRF9HUkFQSElDU19SRVRVUk4oKTsKIAogCXN3aXRjaCAoYnBwKSB7Ci0JCWNhc2UgIDg6IGJhc2UgfD0gKDA8PDI5KTsgYnJlYWs7Ci0JCWNhc2UgMTU6IGJhc2UgfD0gKDU8PDI5KTsgYnJlYWs7Ci0JCWNhc2UgMTY6IGJhc2UgfD0gKDE8PDI5KTsgYnJlYWs7Ci0JCWNhc2UgMjQ6Ci0JCWNhc2UgMzI6IGJhc2UgfD0gKDI8PDI5KTsgYnJlYWs7CisJY2FzZSA4OgorCQliYXNlc3RyaWRlID0gKChwaXRjaCA+PiAzKSA8PCAyMCkgfCAoMCA8PCAyOSk7CisJCWJyZWFrOworCWNhc2UgMTU6CisJCWJhc2VzdHJpZGUgPSAoKHBpdGNoID4+IDMpIDw8IDIwKSB8ICg1IDw8IDI5KTsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJYmFzZXN0cmlkZSA9ICgocGl0Y2ggPj4gMykgPDwgMjApIHwgKDEgPDwgMjkpOworCQlicmVhazsKKwljYXNlIDI0OgorCWNhc2UgMzI6CisJCWJhc2VzdHJpZGUgPSAoKHBpdGNoID4+IDMpIDw8IDIwKSB8ICgyIDw8IDI5KTsKKwkJYnJlYWs7CiAJfQogCi0Jd3JpdGUzWDQoQ1IzNiwweDkwKTsJLy8gcmVzZXQgR0UKLQl3cml0ZTNYNChDUjM2LDB4ODApOwkvLyBlbmFibGUgR0UKLQotCW91dDMyKEdFMjQsMTw8Nyk7CS8vIHJlc2V0IGFsbCBHRSBwb2ludGVycwotCW91dDMyKEdFMjQsMCk7Ci0KLQl3cml0ZTNYNChDUjJELDB4MDApOwkvLyBHRSBUaW1pbmlncywgbm8gZGVsYXlzCi0KLQlvdXQzMihHRUI4LGJhc2UpOyAvLyBEZXN0aW5hdGlvbiBTdHJpZGUgLyBCdWZmZXIgQmFzZSAwLCBwIDEzMwotCW91dDMyKEdFQkMsYmFzZSk7IC8vIERlc3RpbmF0aW9uIFN0cmlkZSAvIEJ1ZmZlciBCYXNlIDEsIHAgMTMzCi0Jb3V0MzIoR0VDMCxiYXNlKTsgLy8gRGVzdGluYXRpb24gU3RyaWRlIC8gQnVmZmVyIEJhc2UgMiwgcCAxMzMKLQlvdXQzMihHRUM0LGJhc2UpOyAvLyBEZXN0aW5hdGlvbiBTdHJpZGUgLyBCdWZmZXIgQmFzZSAzLCBwIDEzMwotCW91dDMyKEdFQzgsYmFzZSk7IC8vIFNvdXJjZSBTdHJpZGUgLyBCdWZmZXIgQmFzZSAwLCBwIDEzMwotCW91dDMyKEdFQ0MsYmFzZSk7IC8vIFNvdXJjZSBTdHJpZGUgLyBCdWZmZXIgQmFzZSAxLCBwIDEzMwotCW91dDMyKEdFRDAsYmFzZSk7IC8vIFNvdXJjZSBTdHJpZGUgLyBCdWZmZXIgQmFzZSAyLCBwIDEzMwotCW91dDMyKEdFRDQsYmFzZSk7IC8vIFNvdXJjZSBTdHJpZGUgLyBCdWZmZXIgQmFzZSAzLCBwIDEzMwotCW91dDMyKEdFNkMsMCk7CSAgLy8gUGF0dGVybiBhbmQgU3R5bGUsIHAgMTI5LCBvaworCXdyaXRlM1g0KENSMzYsIDB4OTApOwkvLyByZXNldCBHRQorCXdyaXRlM1g0KENSMzYsIDB4ODApOwkvLyBlbmFibGUgR0UKKwlvdXQzMihHRTI0LCAxIDw8IDcpOwkvLyByZXNldCBhbGwgR0UgcG9pbnRlcnMgYnkgdG9nZ2xpbmcKKwlvdXQzMihHRTI0LCAwKTsgCS8vICAgZDcgb2YgR0UyNAorCXdyaXRlM1g0KENSMkQsIDB4MDApOwkvLyBHRSBUaW1pbmlncywgbm8gZGVsYXlzCisJb3V0MzIoR0U2QywgMCk7IAkvLyBQYXR0ZXJuIGFuZCBTdHlsZSwgcCAxMjksIG9rCiB9CiAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLwotLy8gQWx0aG91Z2ggdGhpcyBpcyBhIC5mYl9zeW5jIGZ1bmN0aW9uIHRoYXQgY291bGQgYmUgZW5hYmxlZCBpbgotLy8gY3libGFmYl9vcHMsIHdlIGRvIG5vdCBpbmNsdWRlIGl0IHRoZXJlLiBXZSBzeW5jIGltbWVkaWF0ZWx5IGJlZm9yZQotLy8gbmV3IEdFIG9wZXJhdGlvbnMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KKy8vIEN5YmVyYmxhZGUgc3BlY2lmaWMgc3luY2luZworLy8KKy8vICAgQSB0aW1lb3V0IG1pZ2h0IGJlIGNhdXNlZCBieSBkaXNhYmxlZCBtbWlvLgorLy8gICBDYXVzZToKKy8vICAgICAtIGJpdCBDUjM5ICYgMSA9PSAwIHVwb24gcmV0dXJuLCBYIHRyaWRlbnQgZHJpdmVyIGJ1ZworLy8gICAgIC0ga2RtIGJ1ZyAoS0RfR1JBUEhJQ1Mgbm90IHNldCBvbiBmaXJzdCBzd2l0Y2gpCisvLyAgICAgLSBrZXJuZWwgZGVzaWduIGZsYXcgKGl0IGJlbGlldmVzIGluIHRoZSBjb3JyZWN0bmVzcworLy8JIG9mIGtkbS9YCisvLyAgIEZpcnN0IHdlIHRyeSB0byBzeW5jIGlnbm9yaW5nIHRoYXQgcHJvYmxlbSwgYXMgbW9zdCBvZiB0aGUKKy8vICAgdGltZSB0aGF0IHdpbGwgc3VjY2VlZCBpbW1lZGlhdGVseSBhbmQgdGhlIGVuYWJsZV9tbWlvKCkKKy8vICAgd291bGQgb25seSBkZWdyYWRlIHBlcmZvcm1hbmNlLgogLy8KIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIHN0YXRpYyBpbnQgY3libGFmYl9zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCWludCBzdGF0dXMsIGk9MTAwMDAwOwotCXdoaWxlKCAoKHN0YXR1cz1pbjMyKEdFMjApKSAmIDB4RkE4MDAwMDApICYmIGkgIT0gMCkKKwl1MzIgc3RhdHVzLCBpID0gMTAwMDAwOworCisJS0RfR1JBUEhJQ1NfUkVUVVJOKDApOworCisJd2hpbGUgKCgoc3RhdHVzID0gaW4zMihHRTIwKSkgJiAweEZlODAwMDAwKSAmJiBpICE9IDApCiAJCWktLTsKIAogCWlmIChpID09IDApIHsKLQkJLy8gVGhlIHRpbWVvdXQgbWlnaHQgYmUgY2F1c2VkIGJ5IGRpc2FibGVkIG1taW8uCi0JCS8vIENhdXNlOgotCQkvLyAgIC0gYml0IENSMzkgJiAxID09IDAgdXBvbiByZXR1cm4sIFggdHJpZGVudCBkcml2ZXIgYnVnCi0JCS8vICAgLSBrZG0gYnVnIChLRF9HUkFQSElDUyBub3Qgc2V0IG9uIGZpcnN0IHN3aXRjaCkKLQkJLy8gICAtIGtlcm5lbCBkZXNpZ24gZmxhdyAoaXQgYmVsaWV2ZXMgaW4gdGhlIGNvcnJlY3RuZXNzCi0JCS8vICAgICBvZiBrZG0vWAotCQkvLyBTbyB3ZSBtYWtlIHN1cmUgdGhhdCBtbWlvIGlzIGVuYWJsZWQgZmlyc3QgLi4uCiAJCWVuYWJsZV9tbWlvKCk7Ci0vLwkJc2hvd190cmFjZShOVUxMLCZzdGF0dXMpOwotCQlpPTEwMDAwMDA7Ci0JCXdoaWxlKCAoKHN0YXR1cz1pbjMyKEdFMjApKSAmIDB4RkE4MDAwMDApICYmIGkgIT0gMCkKKwkJaSA9IDEwMDAwMDA7CisJCXdoaWxlICgoKHN0YXR1cyA9IGluMzIoR0UyMCkpICYgMHhGQTgwMDAwMCkgJiYgaSAhPSAwKQogCQkJaS0tOwogCQlpZiAoaSA9PSAwKSB7Ci0JCQlvdXRwdXQoIkdFIFRpbWVvdXQsIHN0YXR1czogJXhcbiIsc3RhdHVzKTsKLQkJCWlmKHN0YXR1cyAmIDB4ODAwMDAwMDApCisJCQlvdXRwdXQoIkdFIFRpbWVvdXQsIHN0YXR1czogJXhcbiIsIHN0YXR1cyk7CisJCQlpZiAoc3RhdHVzICYgMHg4MDAwMDAwMCkKIAkJCQlvdXRwdXQoIkJyZXNlbmhhbSBFbmdpbmUgOiBCdXN5XG4iKTsKLQkJCWlmKHN0YXR1cyAmIDB4NDAwMDAwMDApCisJCQlpZiAoc3RhdHVzICYgMHg0MDAwMDAwMCkKIAkJCQlvdXRwdXQoIlNldHVwIEVuZ2luZSAgICAgOiBCdXN5XG4iKTsKLQkJCWlmKHN0YXR1cyAmIDB4MjAwMDAwMDApCisJCQlpZiAoc3RhdHVzICYgMHgyMDAwMDAwMCkKIAkJCQlvdXRwdXQoIlNQIC8gRFBFICAgICAgICAgOiBCdXN5XG4iKTsKLQkJCWlmKHN0YXR1cyAmIDB4MTAwMDAwMDApCisJCQlpZiAoc3RhdHVzICYgMHgxMDAwMDAwMCkKIAkJCQlvdXRwdXQoIk1lbW9yeSBJbnRlcmZhY2UgOiBCdXN5XG4iKTsKLQkJCWlmKHN0YXR1cyAmIDB4MDgwMDAwMDApCisJCQlpZiAoc3RhdHVzICYgMHgwODAwMDAwMCkKIAkJCQlvdXRwdXQoIkNvbSBMc3QgUHJvYyAgICAgOiBCdXN5XG4iKTsKLQkJCWlmKHN0YXR1cyAmIDB4MDQwMDAwMDApCisJCQlpZiAoc3RhdHVzICYgMHgwNDAwMDAwMCkKIAkJCQlvdXRwdXQoIkJsb2NrIFdyaXRlICAgICAgOiBCdXN5XG4iKTsKLQkJCWlmKHN0YXR1cyAmIDB4MDIwMDAwMDApCisJCQlpZiAoc3RhdHVzICYgMHgwMjAwMDAwMCkKIAkJCQlvdXRwdXQoIkNvbW1hbmQgQnVmZmVyICAgOiBGdWxsXG4iKTsKLQkJCWlmKHN0YXR1cyAmIDB4MDEwMDAwMDApCisJCQlpZiAoc3RhdHVzICYgMHgwMTAwMDAwMCkKIAkJCQlvdXRwdXQoIlJFU0VSVkVEICAgICAgICAgOiBCdXN5XG4iKTsKLQkJCWlmKHN0YXR1cyAmIDB4MDA4MDAwMDApCisJCQlpZiAoc3RhdHVzICYgMHgwMDgwMDAwMCkKIAkJCQlvdXRwdXQoIlBDSSBXcml0ZSBCdWZmZXIgOiBCdXN5XG4iKTsKIAkJCWN5YmxhZmJfc2V0dXBfR0UoaW5mby0+dmFyLnhyZXMsCiAJCQkJCSBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpOwpAQCAtMjkxLDE0MiArMzIzLDE5MyBAQAogLy8KIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLXN0YXRpYyB2b2lkIGN5YmxhZmJfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKiBpbmZvLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKmZyKQorc3RhdGljIHZvaWQgY3libGFmYl9maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpmcikKIHsKLQlpbnQgYnBwID0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOwotCWludCBjb2w7CisJdTMyIGJwcCA9IGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCwgY29sLCBkZXN0eSwgaGVpZ2h0OworCisJS0RfR1JBUEhJQ1NfUkVUVVJOKCk7CiAKIAlzd2l0Y2ggKGJwcCkgewotCQlkZWZhdWx0OgotCQljYXNlIDg6IGNvbCA9IGZyLT5jb2xvcjsKLQkJCWNvbCB8PSBjb2wgPDw4OwotCQkJY29sIHw9IGNvbCA8PDE2OwotCQkJYnJlYWs7Ci0JCWNhc2UgMTY6IGNvbCA9ICgodTMyICopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbZnItPmNvbG9yXTsKLQkJCSBjb2wgfD0gY29sIDw8MTY7Ci0JCQkgYnJlYWs7Ci0JCWNhc2UgMzI6IGNvbCA9ICgodTMyICopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbZnItPmNvbG9yXTsKLQkJCSBicmVhazsKKwlkZWZhdWx0OgorCWNhc2UgODoKKwkJY29sID0gZnItPmNvbG9yOworCQljb2wgfD0gY29sIDw8IDg7CisJCWNvbCB8PSBjb2wgPDwgMTY7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWNvbCA9ICgodTMyICopIChpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW2ZyLT5jb2xvcl07CisJCWNvbCB8PSBjb2wgPDwgMTY7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCWNvbCA9ICgodTMyICopIChpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW2ZyLT5jb2xvcl07CisJCWJyZWFrOwogCX0KIAotCWN5YmxhZmJfc3luYyhpbmZvKTsKLQotCW91dDMyKEdFNjAsY29sKTsKLQlvdXQzMihHRTQ4LGZyLT5yb3AgPyAweDY2OlJPUF9TKTsKLQlvdXQzMihHRTQ0LDB4MjAwMDAwMDB8MTw8MTl8MTw8NHwyPDwyKTsKLQlvdXQzMihHRTA4LHBvaW50KGZyLT5keCxmci0+ZHkpKTsKLQlvdXQzMihHRTBDLHBvaW50KGZyLT5keCtmci0+d2lkdGgtMSxmci0+ZHkrZnItPmhlaWdodC0xKSk7Ci0KKwlkZXN0eSA9IGZyLT5keTsKKwloZWlnaHQgPSBmci0+aGVpZ2h0OworCXdoaWxlIChoZWlnaHQpIHsKKwkJb3V0MzIoR0VCOCwgYmFzZXN0cmlkZSB8ICgoZGVzdHkgKiBpbmZvLT52YXIueHJlc192aXJ0dWFsICoKKwkJCQkJICAgYnBwKSA+PiA2KSk7CisJCW91dDMyKEdFNjAsIGNvbCk7CisJCW91dDMyKEdFNDgsIGZyLT5yb3AgPyAweDY2IDogUk9QX1MpOworCQlvdXQzMihHRTQ0LCAweDIwMDAwMDAwIHwgMSA8PCAxOSB8IDEgPDwgNCB8IDIgPDwgMik7CisJCW91dDMyKEdFMDgsIHBvaW50KGZyLT5keCwgMCkpOworCQlvdXQzMihHRTBDLCBwb2ludChmci0+ZHggKyBmci0+d2lkdGggLSAxLAorCQkJCSAgaGVpZ2h0ID4gNDA5NiA/IDQwOTUgOiBoZWlnaHQgLSAxKSk7CisJCWlmIChsaWtlbHkoaGVpZ2h0IDw9IDQwOTYpKQorCQkJcmV0dXJuOworCQlkZXN0eSArPSA0MDk2OworCQloZWlnaHQgLT0gNDA5NjsKKwl9CiB9CiAKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8KIC8vIEN5YmVyYmxhZGUgc3BlY2lmaWMgY29weWFyZWEKIC8vCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVGhpcyBmdW5jdGlvbiBzaWxlbnRseSBhc3N1bWVzIHRoYXQgaXQgbmV2ZXIKKy8vIHdpbGwgYmUgY2FsbGVkIHdpdGggd2lkdGggb3IgaGVpZ2h0IGV4Y2VlZGluZworLy8gNDA5Ni4KKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1zdGF0aWMgdm9pZCBjeWJsYWZiX2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvICppbmZvLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEgKmNhKQorc3RhdGljIHZvaWQgY3libGFmYl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICpjYSkKIHsKLQlfX3UzMiBzMSxzMixkMSxkMjsKLQlpbnQgZGlyZWN0aW9uOworCXUzMiBzMSwgczIsIGQxLCBkMiwgZGlyZWN0aW9uOwogCi0JczEgPSBwb2ludChjYS0+c3gsY2EtPnN5KTsKLQlzMiA9IHBvaW50KGNhLT5zeCtjYS0+d2lkdGgtMSxjYS0+c3krY2EtPmhlaWdodC0xKTsKLQlkMSA9IHBvaW50KGNhLT5keCxjYS0+ZHkpOwotCWQyID0gcG9pbnQoY2EtPmR4K2NhLT53aWR0aC0xLGNhLT5keStjYS0+aGVpZ2h0LTEpOworCUtEX0dSQVBISUNTX1JFVFVSTigpOworCisJczEgPSBwb2ludChjYS0+c3gsIDApOworCXMyID0gcG9pbnQoY2EtPnN4ICsgY2EtPndpZHRoIC0gMSwgY2EtPmhlaWdodCAtIDEpOworCWQxID0gcG9pbnQoY2EtPmR4LCAwKTsKKwlkMiA9IHBvaW50KGNhLT5keCArIGNhLT53aWR0aCAtIDEsIGNhLT5oZWlnaHQgLSAxKTsKKwogCWlmICgoY2EtPnN5ID4gY2EtPmR5KSB8fCAoKGNhLT5zeSA9PSBjYS0+ZHkpICYmIChjYS0+c3ggPiBjYS0+ZHgpKSkKIAkJZGlyZWN0aW9uID0gMDsKIAllbHNlCiAJCWRpcmVjdGlvbiA9IDI7CiAKLQljeWJsYWZiX3N5bmMoaW5mbyk7Ci0KLQlvdXQzMihHRTQ0LDB4YTAwMDAwMDB8MTw8MTl8MTw8MnxkaXJlY3Rpb24pOwotCW91dDMyKEdFMDAsZGlyZWN0aW9uP3MyOnMxKTsKLQlvdXQzMihHRTA0LGRpcmVjdGlvbj9zMTpzMik7Ci0Jb3V0MzIoR0UwOCxkaXJlY3Rpb24/ZDI6ZDEpOwotCW91dDMyKEdFMEMsZGlyZWN0aW9uP2QxOmQyKTsKLQorCW91dDMyKEdFQjgsIGJhc2VzdHJpZGUgfCAoKGNhLT5keSAqIGluZm8tPnZhci54cmVzX3ZpcnR1YWwgKgorCQkJCSAgIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgPj4gNikpOworCW91dDMyKEdFQzgsIGJhc2VzdHJpZGUgfCAoKGNhLT5zeSAqIGluZm8tPnZhci54cmVzX3ZpcnR1YWwgKgorCQkJCSAgIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgPj4gNikpOworCW91dDMyKEdFNDQsIDB4YTAwMDAwMDAgfCAxIDw8IDE5IHwgMSA8PCAyIHwgZGlyZWN0aW9uKTsKKwlvdXQzMihHRTAwLCBkaXJlY3Rpb24gPyBzMiA6IHMxKTsKKwlvdXQzMihHRTA0LCBkaXJlY3Rpb24gPyBzMSA6IHMyKTsKKwlvdXQzMihHRTA4LCBkaXJlY3Rpb24gPyBkMiA6IGQxKTsKKwlvdXQzMihHRTBDLCBkaXJlY3Rpb24gPyBkMSA6IGQyKTsKIH0KIAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8KIC8vIEN5YmVyYmxhZGUgc3BlY2lmaWMgaW1hZ2VibGl0CiAvLwotLy8gQWNjZWxlcmF0ZWQgZm9yIHRoZSBtb3N0IHVzdWFsIGNhc2UsIGJsaXR0aW5nIDEtYml0IGRlZXAgY2hhcmFjdGVyCi0vLyBjaGFyYWN0ZXIgaW1hZ2VzLiBFdmVyeXRoaW5nIGVsc2UgaXMgcGFzc2VkIHRvIHRoZSBnZW5lcmljIGltYWdlYmxpdC4KKy8vIEFjY2VsZXJhdGVkIGZvciB0aGUgbW9zdCB1c3VhbCBjYXNlLCBibGl0dGluZyAxIC0gYml0IGRlZXAKKy8vIGNoYXJhY3RlciBpbWFnZXMuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBwYXNzZWQgdG8gdGhlIGdlbmVyaWMgaW1hZ2VibGl0CisvLyB1bmxlc3MgaXQgaXMgc28gaW5zYW5lIHRoYXQgaXQgaXMgYmV0dGVyIHRvIHByaW50ayBhbiBhbGVydC4KKy8vCisvLyBIYXJkd2FyZSBidWc6IF9OZXZlcl8gYmxpdCBhY3Jvc3MgcGl4ZWwgY29sdW1uIDIwNDgsIHRoYXQgd2lsbCBsb2NrCisvLyB0aGUgc3lzdGVtLiBXZSBzcGxpdCB0aG9zZSBibGl0IHJlcXVlc3RzIGludG8gdGhyZWUgYmxpdHRpbmcKKy8vIG9wZXJhdGlvbnMuCiAvLwogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBzdGF0aWMgdm9pZCBjeWJsYWZiX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKIAkJCSAgICAgIGNvbnN0IHN0cnVjdCBmYl9pbWFnZSAqaW1hZ2UpCiB7Ci0KIAl1MzIgZmdjb2wsIGJnY29sOworCXUzMiAqcGQgPSAodTMyICopIGltYWdlLT5kYXRhOworCXUzMiBicHAgPSBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWw7CiAKLQlpbnQgaTsKLQlpbnQgYnBwID0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOwotCWludCBpbmRleCA9IDA7Ci0JaW50IGluZGV4X2VuZD1pbWFnZS0+aGVpZ2h0ICogaW1hZ2UtPndpZHRoIC8gODsKLQlpbnQgd2lkdGhfZGRzPWltYWdlLT53aWR0aCAvIDMyOwotCWludCB3aWR0aF9kYnM9aW1hZ2UtPndpZHRoICUgMzI7CisJS0RfR1JBUEhJQ1NfUkVUVVJOKCk7CiAKLQlpZiAoaW1hZ2UtPmRlcHRoICE9IDEgfHwgYnBwIDwgOCB8fCBicHAgPiAzMiB8fCBicHAgJSA4ICE9IDAgfHwKLQkgICAgaW1hZ2UtPndpZHRoICUgOCAhPSAwIHx8IGltYWdlLT53aWR0aCA9PSAwIHx8IGltYWdlLT5oZWlnaHQgPT0gMCkgewotCQljZmJfaW1hZ2VibGl0KGluZm8saW1hZ2UpOworCS8vIFVzZWQgb25seSBmb3IgZHJhd2luZyB0aGUgcGVuZ3VpbmUgKGltYWdlLT5kZXB0aCA+IDEpCisJaWYgKGltYWdlLT5kZXB0aCAhPSAxKSB7CisJCWNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCQlyZXR1cm47CisJfQorCS8vIFRoYXQgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IGl0IHdvdWxkIGJlIGZhdGFsCisJaWYgKGltYWdlLT53aWR0aCA9PSAwIHx8IGltYWdlLT5oZWlnaHQgPT0gMCkgeworCQlvdXRwdXQoImltYWdlYmxpdDogd2lkdGgvaGVpZ2h0IDAgZGV0ZWN0ZWRcbiIpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX1RSVUVDT0xPUiB8fAogCSAgICBpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9ESVJFQ1RDT0xPUikgewotCQlmZ2NvbCA9ICgodTMyKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtpbWFnZS0+ZmdfY29sb3JdOwotCQliZ2NvbCA9ICgodTMyKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtpbWFnZS0+YmdfY29sb3JdOworCQlmZ2NvbCA9ICgodTMyICopIChpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW2ltYWdlLT5mZ19jb2xvcl07CisJCWJnY29sID0gKCh1MzIgKikgKGluZm8tPnBzZXVkb19wYWxldHRlKSlbaW1hZ2UtPmJnX2NvbG9yXTsKIAl9IGVsc2UgewogCQlmZ2NvbCA9IGltYWdlLT5mZ19jb2xvcjsKIAkJYmdjb2wgPSBpbWFnZS0+YmdfY29sb3I7CiAJfQogCiAJc3dpdGNoIChicHApIHsKLQkJY2FzZSA4OgotCQkJZmdjb2wgfD0gZmdjb2wgPDw4OyBmZ2NvbCB8PSBmZ2NvbCA8PDE2OwotCQkJYmdjb2wgfD0gYmdjb2wgPDw4OyBiZ2NvbCB8PSBiZ2NvbCA8PDE2OwotCQkJYnJlYWs7Ci0JCWNhc2UgMTY6Ci0JCQlmZ2NvbCB8PSBmZ2NvbCA8PDE2OwotCQkJYmdjb2wgfD0gYmdjb2wgPDwxNjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJIGJyZWFrOworCWNhc2UgODoKKwkJZmdjb2wgfD0gZmdjb2wgPDwgODsKKwkJYmdjb2wgfD0gYmdjb2wgPDwgODsKKwljYXNlIDE2OgorCQlmZ2NvbCB8PSBmZ2NvbCA8PCAxNjsKKwkJYmdjb2wgfD0gYmdjb2wgPDwgMTY7CisJZGVmYXVsdDoKKwkJYnJlYWs7CiAJfQogCi0JY3libGFmYl9zeW5jKGluZm8pOworCW91dDMyKEdFQjgsIGJhc2VzdHJpZGUgfCAoKGltYWdlLT5keSAqIGluZm8tPnZhci54cmVzX3ZpcnR1YWwgKgorCQkJCSAgIGJwcCkgPj4gNikpOworCW91dDMyKEdFNjAsIGZnY29sKTsKKwlvdXQzMihHRTY0LCBiZ2NvbCk7CiAKLQlvdXQzMihHRTYwLGZnY29sKTsKLQlvdXQzMihHRTY0LGJnY29sKTsKLQlvdXQzMihHRTQ0LDB4YTAwMDAwMDAgfCAxPDwyMCB8IDE8PDE5KTsKLQlvdXQzMihHRTA4LHBvaW50KGltYWdlLT5keCxpbWFnZS0+ZHkpKTsKLQlvdXQzMihHRTBDLHBvaW50KGltYWdlLT5keCtpbWFnZS0+d2lkdGgtMSxpbWFnZS0+ZHkraW1hZ2UtPmhlaWdodC0xKSk7CisJaWYgKCEoaW1hZ2UtPmR4IDwgMjA0OCAmJiAoaW1hZ2UtPmR4ICsgaW1hZ2UtPndpZHRoIC0gMSkgPj0gMjA0OCkpIHsKKwkJdTMyIGRkcyA9ICgoaW1hZ2UtPndpZHRoICsgMzEpID4+IDUpICogaW1hZ2UtPmhlaWdodDsKKwkJb3V0MzIoR0U0NCwgMHhhMDAwMDAwMCB8IDEgPDwgMjAgfCAxIDw8IDE5KTsKKwkJb3V0MzIoR0UwOCwgcG9pbnQoaW1hZ2UtPmR4LCAwKSk7CisJCW91dDMyKEdFMEMsIHBvaW50KGltYWdlLT5keCArIGltYWdlLT53aWR0aCAtIDEsCisJCQkJICBpbWFnZS0+aGVpZ2h0IC0gMSkpOworCQl3aGlsZSAoZGRzLS0pCisJCQlvdXQzMihHRTlDLCAqcGQrKyk7CisJfSBlbHNlIHsKKwkJaW50IGksIGo7CisJCXUzMiBkZHN0b3RhbCA9IChpbWFnZS0+d2lkdGggKyAzMSkgPj4gNTsKKwkJdTMyIGRkc2xlZnQgPSAoMjA0OCAtIGltYWdlLT5keCArIDMxKSA+PiA1OworCQl1MzIgc2tpcGxlZnQgPSBkZHN0b3RhbCAtIGRkc2xlZnQ7CiAKLQl3aGlsZShpbmRleCA8IGluZGV4X2VuZCkgewotCQljb25zdCBjaGFyICpwID0gaW1hZ2UtPmRhdGEgKyBpbmRleDsKLQkJZm9yKGk9MDtpPHdpZHRoX2RkcztpKyspIHsKLQkJCW91dDMyKEdFOUMsKih1MzIqKXApOwotCQkJcCs9NDsKLQkJCWluZGV4Kz00OworCQlvdXQzMihHRTQ0LCAweGEwMDAwMDAwIHwgMSA8PCAyMCB8IDEgPDwgMTkpOworCQlvdXQzMihHRTA4LCBwb2ludChpbWFnZS0+ZHgsIDApKTsKKwkJb3V0MzIoR0UwQywgcG9pbnQoMjA0OCAtIDEsIGltYWdlLT5oZWlnaHQgLSAxKSk7CisJCWZvciAoaSA9IDA7IGkgPCBpbWFnZS0+aGVpZ2h0OyBpKyspIHsKKwkJCWZvciAoaiA9IDA7IGogPCBkZHNsZWZ0OyBqKyspCisJCQkJb3V0MzIoR0U5QywgKnBkKyspOworCQkJcGQgKz0gc2tpcGxlZnQ7CiAJCX0KLQkJc3dpdGNoKHdpZHRoX2RicykgewotCQljYXNlIDA6IGJyZWFrOwotCQljYXNlIDg6CW91dDMyKEdFOUMsKih1OCopcCk7Ci0JCQlpbmRleCs9MTsKLQkJCWJyZWFrOwotCQljYXNlIDE2OiBvdXQzMihHRTlDLCoodTE2KilwKTsKLQkJCWluZGV4Kz0yOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjQ6IG91dDMyKEdFOUMsKih1MTYqKXAgfCAqKHU4KikocCsyKTw8MTYpOwotCQkJaW5kZXgrPTM7Ci0JCQlicmVhazsKKworCQlpZiAoaW1hZ2UtPmR4ICUgMzIpIHsKKwkJCW91dDMyKEdFNDQsIDB4YTAwMDAwMDAgfCAxIDw8IDIwIHwgMSA8PCAxOSk7CisJCQlvdXQzMihHRTA4LCBwb2ludCgyMDQ4LCAwKSk7CisJCQlpZiAoaW1hZ2UtPndpZHRoID4gZGRzbGVmdCA8PCA1KQorCQkJCW91dDMyKEdFMEMsIHBvaW50KGltYWdlLT5keCArIChkZHNsZWZ0IDw8IDUpIC0KKwkJCQkJCSAgMSwgaW1hZ2UtPmhlaWdodCAtIDEpKTsKKwkJCWVsc2UKKwkJCQlvdXQzMihHRTBDLCBwb2ludChpbWFnZS0+ZHggKyBpbWFnZS0+d2lkdGggLSAxLAorCQkJCQkJICBpbWFnZS0+aGVpZ2h0IC0gMSkpOworCQkJcGQgPSAoKHUzMiAqKSBpbWFnZS0+ZGF0YSkgKyBkZHN0b3RhbCAtIHNraXBsZWZ0IC0gMTsKKwkJCWZvciAoaSA9IDA7IGkgPCBpbWFnZS0+aGVpZ2h0OyBpKyspIHsKKwkJCQlvdXQzMihHRTlDLCBzd2FiMzIoc3dhYjMyKCpwZCkgPDwgKCgzMiAtCisJCQkJCSAgICAoaW1hZ2UtPmR4ICYgMzEpKSAmIDMxKSkpOworCQkJCXBkICs9IGRkc3RvdGFsOworCQkJfQorCQl9CisKKwkJaWYgKHNraXBsZWZ0KSB7CisJCQlvdXQzMihHRTQ0LCAweGEwMDAwMDAwIHwgMSA8PCAyMCB8IDEgPDwgMTkpOworCQkJb3V0MzIoR0UwOCwgcG9pbnQoaW1hZ2UtPmR4ICsgKGRkc2xlZnQgPDwgNSksIDApKTsKKwkJCW91dDMyKEdFMEMsIHBvaW50KGltYWdlLT5keCArIGltYWdlLT53aWR0aCAtIDEsCisJCQkJCSAgaW1hZ2UtPmhlaWdodCAtIDEpKTsKKwkJCXBkID0gKHUzMiAqKSBpbWFnZS0+ZGF0YTsKKwkJCWZvciAoaSA9IDA7IGkgPCBpbWFnZS0+aGVpZ2h0OyBpKyspIHsKKwkJCQlwZCArPSBkZHNsZWZ0OworCQkJCWZvciAoaiA9IDA7IGogPCBza2lwbGVmdDsgaisrKQorCQkJCQlvdXQzMihHRTlDLCAqcGQrKyk7CisJCQl9CiAJCX0KIAl9CiB9CkBAIC00NDMsNyArNTI2LDYgQEAKIAkJCSAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJaW50IGJwcCA9IHZhci0+Yml0c19wZXJfcGl4ZWw7Ci0JaW50IHMsdCxtYXh2eXJlczsKIAogCS8vCiAJLy8gd2UgdHJ5IHRvIHN1cHBvcnQgOCwgMTYsIDI0IGFuZCAzMiBicHAgbW9kZXMsCkBAIC00NTMsOSArNTM1LDkgQEAKIAkvLyAoVGhpcyBpcyB3aGF0IHRyaWRlbnRmYiBkb2VzIC4uLiB3aWxsIGJlIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZSkKIAkvLwogCS8vCi0JaWYgKCBicHAgJSA4ICE9IDAgfHwgYnBwIDwgOCB8fCBicHAgPjMyKQorCWlmIChicHAgJSA4ICE9IDAgfHwgYnBwIDwgOCB8fCBicHAgPiAzMikKIAkJYnBwID0gODsKLQlpZiAoYnBwID09IDI0ICkKKwlpZiAoYnBwID09IDI0KQogCQlicHAgPSB2YXItPmJpdHNfcGVyX3BpeGVsID0gMzI7CiAKIAkvLwpAQCAtNDcyLDY1ICs1NTQsOTMgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvLwotCS8vIHhyZXMgIT0geHJlc192aXJ0dWFsIGlzIGJyb2tlbiwgZmFpbCBpZiBzdWNoIGFuCi0JLy8gdW51c3VhbCBtb2RlIGlzIHJlcXVlc3RlZAorCS8vIHdlIGRvIG5vdCBhbGxvdyB2Y2xrIHRvIGV4Y2VlZCAyMzAgTUh6LiBJZiB0aGUgcmVxdWVzdGVkCisJLy8gdmNsayBpcyB0b28gaGlnaCwgd2UgZGVmYXVsdCB0byAyMDAgTUh6CiAJLy8KLQlpZiAodmFyLT54cmVzICE9IHZhci0+eHJlc192aXJ0dWFsKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoKGJwcCA9PSAzMiA/IDIwMDAwMDAwMCA6IDEwMDAwMDAwMCkgLyB2YXItPnBpeGNsb2NrID4gMjMwMDApCisJCXZhci0+cGl4Y2xvY2sgPSAoYnBwID09IDMyID8gMjAwMDAwMDAwIDogMTAwMDAwMDAwKSAvIDIwMDAwOwogCiAJLy8KLQkvLyB3ZSBkbyBub3QgYWxsb3cgdmNsayB0byBleGNlZWQgMjMwIE1IegorCS8vIGVuZm9yY2UgKGh8dilzeW5jX2xlbiBsaW1pdHMKIAkvLwotCWlmICgoYnBwPT0zMiA/IDIwMDAwMDAwMCA6IDEwMDAwMDAwMCkgLyB2YXItPnBpeGNsb2NrID4gMjMwMDApCi0JCXJldHVybiAtRUlOVkFMOworCXZhci0+aHN5bmNfbGVuICY9IH43OworCWlmKHZhci0+aHN5bmNfbGVuID4gMjQ4KQorCQl2YXItPmhzeW5jX2xlbiA9IDI0ODsKKworCXZhci0+dnN5bmNfbGVuICY9IDE1OwogCiAJLy8KLQkvLyBjYWxjIG1heCB5cmVzX3ZpcnR1YWwgdGhhdCB3b3VsZCBmaXQgaW4gbWVtb3J5Ci0JLy8gYW5kIG1heCB5cmVzX3ZpcnR1YWwgdGhhdCBjb3VsZCBiZSB1c2VkIGZvciBzY3JvbGxpbmcKLQkvLyBhbmQgdXNlIG1pbmltdW0gb2YgdGhlIHJlc3VsdHMgYXMgbWF4dnlyZXMKKwkvLyBFbmZvcmNlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGhhcmR3YXJlIGxpbWl0cy4KKwkvLyAxNjAweDEyMDAgaXMgbWVudGlvbmVkIGFzIGEgbWF4aW11bSwgYnV0IGhpZ2hlciByZXNvbHV0aW9ucyBjb3VsZAorCS8vIHdvcmsgd2l0aCBzbG93IHJlZnJlc2gsIHNtYWxsIG1hcmdpbnMgYW5kIHNob3J0IHN5bmMuCiAJLy8KLQkvLyBhZGp1c3QgdnlyZXNfdmlydHVhbCB0byBtYXh2eXJlcyBpZiBuZWNlc3NhcnkKLQkvLyBmYWlsIGlmIHJlcXVlc3RlZCB5cmVzIGlzIGJpZ2dlciB0aGFuIG1heHZ5cmVzCi0JLy8KLQlzID0gKDB4MWZmZmZmIC8gKHZhci0+eHJlcyAqIGJwcC84KSkgKyB2YXItPnlyZXM7Ci0JdCA9IGluZm8tPmZpeC5zbWVtX2xlbiAvICh2YXItPnhyZXMgKiBicHAvOCk7Ci0JbWF4dnlyZXMgPSB0IDwgcyA/IHQgOiBzOwotCWlmIChtYXh2eXJlcyA8IHZhci0+eXJlc192aXJ0dWFsKQotCQl2YXItPnlyZXNfdmlydHVhbD1tYXh2eXJlczsKLQlpZiAobWF4dnlyZXMgPCB2YXItPnlyZXMpCisJdmFyLT54cmVzICY9IH43OworCisJaWYgKCgodmFyLT54cmVzICsgdmFyLT5sZWZ0X21hcmdpbiArIHZhci0+cmlnaHRfbWFyZ2luICsKKwkJCXZhci0+aHN5bmNfbGVuKSA+IChicHAgPT0gMzIgPyAyMDQwIDogNDA4OCkpIHx8CisJCQkoKHZhci0+eXJlcyArIHZhci0+dXBwZXJfbWFyZ2luICsgdmFyLT5sb3dlcl9tYXJnaW4gKworCQkJdmFyLT52c3luY19sZW4pID4gMjA0NykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc3dpdGNoIChicHApIHsKLQkJY2FzZSA4OgotCQkJdmFyLT5yZWQub2Zmc2V0ID0gMDsKLQkJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gMDsKLQkJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOwotCQkJdmFyLT5yZWQubGVuZ3RoID0gNjsKLQkJCXZhci0+Z3JlZW4ubGVuZ3RoID0gNjsKLQkJCXZhci0+Ymx1ZS5sZW5ndGggPSA2OwotCQkJYnJlYWs7Ci0JCWNhc2UgMTY6Ci0JCQl2YXItPnJlZC5vZmZzZXQgPSAxMTsKLQkJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gNTsKLQkJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOwotCQkJdmFyLT5yZWQubGVuZ3RoID0gNTsKLQkJCXZhci0+Z3JlZW4ubGVuZ3RoID0gNjsKLQkJCXZhci0+Ymx1ZS5sZW5ndGggPSA1OwotCQkJYnJlYWs7Ci0JCWNhc2UgMzI6Ci0JCQl2YXItPnJlZC5vZmZzZXQgPSAxNjsKLQkJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gODsKLQkJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOwotCQkJdmFyLT5yZWQubGVuZ3RoID0gODsKLQkJCXZhci0+Z3JlZW4ubGVuZ3RoID0gODsKLQkJCXZhci0+Ymx1ZS5sZW5ndGggPSA4OwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6CisJaWYgKCh2YXItPnhyZXMgPiAxNjAwKSB8fCAodmFyLT55cmVzID4gMTIwMCkpCisJCW91dHB1dCgiTW9kZSAlZHglZCBleGNlZWRzIGRvY3VtZW50ZWQgbGltaXRzLlxuIiwKKwkJCQkJICAgdmFyLT54cmVzLCB2YXItPnlyZXMpOworCS8vCisJLy8gdHJ5IHRvIGJlIHNtYXJ0IGFib3V0ICh4fHkpcmVzX3ZpcnR1YWwgcHJvYmxlbXMuCisJLy8KKwlpZiAodmFyLT54cmVzID4gdmFyLT54cmVzX3ZpcnR1YWwpCisJCXZhci0+eHJlc192aXJ0dWFsID0gdmFyLT54cmVzOworCWlmICh2YXItPnlyZXMgPiB2YXItPnlyZXNfdmlydHVhbCkKKwkJdmFyLT55cmVzX3ZpcnR1YWwgPSB2YXItPnlyZXM7CisKKwlpZiAoYnBwID09IDggfHwgYnBwID09IDE2KSB7CisJCWlmICh2YXItPnhyZXNfdmlydHVhbCA+IDQwODgpCisJCQl2YXItPnhyZXNfdmlydHVhbCA9IDQwODg7CisJfSBlbHNlIHsKKwkJaWYgKHZhci0+eHJlc192aXJ0dWFsID4gMjA0MCkKKwkJCXZhci0+eHJlc192aXJ0dWFsID0gMjA0MDsKKwl9CisJdmFyLT54cmVzX3ZpcnR1YWwgJj0gfjc7CisJd2hpbGUgKHZhci0+eHJlc192aXJ0dWFsICogdmFyLT55cmVzX3ZpcnR1YWwgKiBicHAgLyA4ID4KKwkgICAgICAgaW5mby0+Zml4LnNtZW1fbGVuKSB7CisJCWlmICh2YXItPnlyZXNfdmlydHVhbCA+IHZhci0+eXJlcykKKwkJCXZhci0+eXJlc192aXJ0dWFsLS07CisJCWVsc2UgaWYgKHZhci0+eHJlc192aXJ0dWFsID4gdmFyLT54cmVzKQorCQkJdmFyLT54cmVzX3ZpcnR1YWwgLT0gODsKKwkJZWxzZQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0dXJuIDA7CisJc3dpdGNoIChicHApIHsKKwljYXNlIDg6CisJCXZhci0+cmVkLm9mZnNldCA9IDA7CisJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gMDsKKwkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CisJCXZhci0+cmVkLmxlbmd0aCA9IDY7CisJCXZhci0+Z3JlZW4ubGVuZ3RoID0gNjsKKwkJdmFyLT5ibHVlLmxlbmd0aCA9IDY7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCXZhci0+cmVkLm9mZnNldCA9IDExOworCQl2YXItPmdyZWVuLm9mZnNldCA9IDU7CisJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOworCQl2YXItPnJlZC5sZW5ndGggPSA1OworCQl2YXItPmdyZWVuLmxlbmd0aCA9IDY7CisJCXZhci0+Ymx1ZS5sZW5ndGggPSA1OworCQlicmVhazsKKwljYXNlIDMyOgorCQl2YXItPnJlZC5vZmZzZXQgPSAxNjsKKwkJdmFyLT5ncmVlbi5vZmZzZXQgPSA4OworCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKKwkJdmFyLT5yZWQubGVuZ3RoID0gODsKKwkJdmFyLT5ncmVlbi5sZW5ndGggPSA4OworCQl2YXItPmJsdWUubGVuZ3RoID0gODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCisJcmV0dXJuIDA7CiB9CiAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC01NDMsMjMgKzY1MywyNSBAQAogLy8gaXQsIHNvIGl0IGlzIGFsc28gc2FmZSB0byBiZSB1c2VkIGhlcmUuIEJUVzogZGF0YXNoZWV0IENSMEUgb24gcGFnZQogLy8gOTAgcmVhbGx5IGlzIENSMUUsIHRoZSByZWFsIENSRSBpcyBkb2N1bWVudGVkIG9uIHBhZ2UgNzIuCiAvLworLy8gQlVUOgorLy8KKy8vIEFzIG9mIGludGVybmFsIHZlcnNpb24gMC42MCB3ZSBkbyBub3QgdXNlIHZnYSBwYW5uaW5nIGFueSBsb25nZXIuCisvLyBWZ2EgcGFubmluZyBkaWQgbm90IGFsbG93IHVzIHRoZSB1c2Ugb2YgYWxsIGF2YWlsYWJsZSB2aWRlbyBtZW1vcnkKKy8vIGFuZCB0aHVzIHByZXZlbnRlZCB5d3JhcCBzY3JvbGxpbmcuIFdlIGRvIHVzZSB0aGUgInJpZ2h0IHZpZXciCisvLyByZWdpc3RlciBub3cuCisvLworLy8KIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIHN0YXRpYyBpbnQgY3libGFmYl9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKIAkJCSAgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCUtEX0dSQVBISUNTX1JFVFVSTigwKTsKIAotCW9mZnNldD0odmFyLT54b2Zmc2V0Kyh2YXItPnlvZmZzZXQqdmFyLT54cmVzKSkqdmFyLT5iaXRzX3Blcl9waXhlbC8zMjsKIAlpbmZvLT52YXIueG9mZnNldCA9IHZhci0+eG9mZnNldDsKIAlpbmZvLT52YXIueW9mZnNldCA9IHZhci0+eW9mZnNldDsKLQotCXdyaXRlM1g0KENSMEQsb2Zmc2V0ICYgMHhGRik7Ci0Jd3JpdGUzWDQoQ1IwQywob2Zmc2V0ICYgMHhGRjAwKSA+PiA4KTsKLQl3cml0ZTNYNChDUjFFLChyZWFkM1g0KENSMUUpICYgMHhERikgfCAoKG9mZnNldCAmIDB4MTAwMDApID4+IDExKSk7Ci0Jd3JpdGUzWDQoQ1IyNywocmVhZDNYNChDUjI3KSAmIDB4RjgpIHwgKChvZmZzZXQgJiAweEUwMDAwKSA+PiAxNykpOwotCXdyaXRlM1g0KENSMkIsKHJlYWQzWDQoQ1IyQikgJiAweERGKSB8ICgob2Zmc2V0ICYgMHgxMDAwMDApID4+IDE1KSk7Ci0KKwlvdXQzMihHRTEwLCAweDgwMDAwMDAwIHwgKCh2YXItPnhvZmZzZXQgKyAodmFyLT55b2Zmc2V0ICoKKwkJICAgIHZhci0+eHJlc192aXJ0dWFsKSkgKiB2YXItPmJpdHNfcGVyX3BpeGVsIC8gMzIpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTc4LDU5ICs2OTAsOTkgQEAKIAkJcmV0dXJuOwogCiAJcHJpbnRrKCJcbiIpOwotCWZvcihpPTA7IGk8PTB4ZmY7IGkrKykgewotCQlvdXRiKGksMHgzZDQpOwotCQlwcmludGsoIkNSJTAyeD0lMDJ4ICIsaSxpbmIoMHgzZDUpKTsKLQkJaWYgKGklMTY9PTE1KQorCWZvciAoaSA9IDA7IGkgPD0gMHhmZjsgaSsrKSB7CisJCW91dGIoaSwgMHgzZDQpOworCQlwcmludGsoIkNSJTAyeD0lMDJ4ICIsIGksIGluYigweDNkNSkpOworCQlpZiAoaSAlIDE2ID09IDE1KQogCQkJcHJpbnRrKCJcbiIpOwogCX0KIAotCW91dGIoMHgzMCwweDNjZSk7Ci0Jb3V0YihpbmIoMHgzY2YpIHwgMHg0MCwweDNjZik7Ci0JZm9yKGk9MDsgaTw9MHgxZjsgaSsrKSB7Ci0JCWlmIChpPT0wIHx8IChpPjIgJiYgaTw4KSB8fCBpPT0weDEwIHx8IGk9PTB4MTEgfHwgaT09MHgxNikgewotCQkJb3V0YihpLDB4M2Q0KTsKLQkJCXByaW50aygiQ1IlMDJ4PSUwMnggIixpLGluYigweDNkNSkpOworCW91dGIoMHgzMCwgMHgzY2UpOworCW91dGIoaW5iKDB4M2NmKSB8IDB4NDAsIDB4M2NmKTsKKwlmb3IgKGkgPSAwOyBpIDw9IDB4MWY7IGkrKykgeworCQlpZiAoaSA9PSAwIHx8IChpID4gMiAmJiBpIDwgOCkgfHwgaSA9PSAweDEwIHx8IGkgPT0gMHgxMQorCQkgICAgfHwgaSA9PSAweDE2KSB7CisJCQlvdXRiKGksIDB4M2Q0KTsKKwkJCXByaW50aygiQ1IlMDJ4PSUwMnggIiwgaSwgaW5iKDB4M2Q1KSk7CiAJCX0gZWxzZQogCQkJcHJpbnRrKCItLS0tLS0tICIpOwotCQlpZiAoaSUxNj09MTUpCisJCWlmIChpICUgMTYgPT0gMTUpCiAJCQlwcmludGsoIlxuIik7CiAJfQotCW91dGIoMHgzMCwweDNjZSk7Ci0Jb3V0YihpbmIoMHgzY2YpICYgMHhiZiwweDNjZik7CisJb3V0YigweDMwLCAweDNjZSk7CisJb3V0YihpbmIoMHgzY2YpICYgMHhiZiwgMHgzY2YpOwogCiAJcHJpbnRrKCJcbiIpOwotCWZvcihpPTA7IGk8PTB4N2Y7IGkrKykgewotCQlvdXRiKGksMHgzY2UpOwotCQlwcmludGsoIkdSJTAyeD0lMDJ4ICIsaSxpbmIoMHgzY2YpKTsKLQkJaWYgKGklMTY9PTE1KQorCWZvciAoaSA9IDA7IGkgPD0gMHg3ZjsgaSsrKSB7CisJCW91dGIoaSwgMHgzY2UpOworCQlwcmludGsoIkdSJTAyeD0lMDJ4ICIsIGksIGluYigweDNjZikpOworCQlpZiAoaSAlIDE2ID09IDE1KQogCQkJcHJpbnRrKCJcbiIpOwogCX0KIAogCXByaW50aygiXG4iKTsKLQlmb3IoaT0wOyBpPD0weGZmOyBpKyspIHsKLQkJb3V0YihpLDB4M2M0KTsKLQkJcHJpbnRrKCJTUiUwMng9JTAyeCAiLGksaW5iKDB4M2M1KSk7Ci0JCWlmIChpJTE2PT0xNSkKKwlmb3IgKGkgPSAwOyBpIDw9IDB4ZmY7IGkrKykgeworCQlvdXRiKGksIDB4M2M0KTsKKwkJcHJpbnRrKCJTUiUwMng9JTAyeCAiLCBpLCBpbmIoMHgzYzUpKTsKKwkJaWYgKGkgJSAxNiA9PSAxNSkKIAkJCXByaW50aygiXG4iKTsKIAl9CiAKIAlwcmludGsoIlxuIik7Ci0JZm9yKGk9MDsgaSA8PSAweDFGOyBpKyspIHsKLQkJaW5iKDB4M2RhKTsgLy8gbmV4dCBhY2Nlc3MgaXMgaW5kZXghCi0JCW91dGIoaSwweDNjMCk7Ci0JCXByaW50aygiQVIlMDJ4PSUwMnggIixpLGluYigweDNjMSkpOwotCQlpZiAoaSUxNj09MTUpCisJZm9yIChpID0gMDsgaSA8PSAweDFGOyBpKyspIHsKKwkJaW5iKDB4M2RhKTsJLy8gbmV4dCBhY2Nlc3MgaXMgaW5kZXghCisJCW91dGIoaSwgMHgzYzApOworCQlwcmludGsoIkFSJTAyeD0lMDJ4ICIsIGksIGluYigweDNjMSkpOworCQlpZiAoaSAlIDE2ID09IDE1KQogCQkJcHJpbnRrKCJcbiIpOwogCX0KIAlwcmludGsoIlxuIik7CiAKLQlpbmIoMHgzREEpOwkJCS8vIHJlc2V0IGludGVybmFsIGZsYWcgdG8gM2MwIGluZGV4Ci0Jb3V0YigweDIwLDB4M0MwKTsJCS8vIGVuYWJsZSBhdHRyCisJaW5iKDB4M0RBKTsJCS8vIHJlc2V0IGludGVybmFsIGZsYWcgdG8gM2MwIGluZGV4CisJb3V0YigweDIwLCAweDNDMCk7CS8vIGVuYWJsZSBhdHRyCiAKIAlyZXR1cm47CiB9CiAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBTYXZlIFN0YXRlCisvLworLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hpbGUgYSBzd2l0Y2ggdG8gS0RfVEVYVCBpcyBpbiBwcm9ncmVzcywKKy8vIGJlZm9yZSBhbnkgb2YgdGhlIG90aGVyIGZ1bmN0aW9ucyBhcmUgY2FsbGVkLgorLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIHZvaWQgY3libGFmYl9zYXZlX3N0YXRlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBjeWJsYWZiX3BhciAqcGFyID0gaW5mby0+cGFyOworCWlmICh2ZXJib3NpdHkgPiAwKQorCQlvdXRwdXQoIlN3aXRjaGluZyB0byBLRF9URVhUXG4iKTsKKwlkaXNhYmxlZCA9IDA7CisJcmVnZHVtcChwYXIpOworCWVuYWJsZV9tbWlvKCk7CisJcmV0dXJuOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gUmVzdG9yZSBTdGF0ZQorLy8KKy8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoaWxlIGEgc3dpdGNoIHRvIEtEX0dSQVBISUNTIGlzIGluIHByb2dyZXNzLAorLy8gV2UgaGF2ZSB0byB0dXJuIG9uIHZnYSBzdHlsZSBwYW5uaW5nIHJlZ2lzdGVycyBhZ2FpbiBiZWNhdXNlIHRoZQorLy8gdHJpZGVudCBkcml2ZXIgb2YgWCBkb2VzIG5vdCBrbm93IGFib3V0IEdFMTAuCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgdm9pZCBjeWJsYWZiX3Jlc3RvcmVfc3RhdGUoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJaWYgKHZlcmJvc2l0eSA+IDApCisJCW91dHB1dCgiU3dpdGNoaW5nIHRvIEtEX0dSQVBISUNTXG4iKTsKKwlvdXQzMihHRTEwLCAwKTsKKwlkaXNhYmxlZCA9IDE7CisJcmV0dXJuOworfQorCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLwogLy8gU2V0IGhhcmR3YXJlIHRvIHJlcXVlc3RlZCB2aWRlbyBtb2RlCkBAIC02NDAsMzIgKzc5MiwzNCBAQAogc3RhdGljIGludCBjeWJsYWZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGN5YmxhZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7Ci0JdTMyCi0JaHRvdGFsLGhkaXNwZW5kLGhzeW5jc3RhcnQsaHN5bmNlbmQsaGJsYW5rc3RhcnQsaGJsYW5rZW5kLHByZWVuZGZldGNoLAotCQl2dG90YWwsdmRpc3BlbmQsdnN5bmNzdGFydCx2c3luY2VuZCx2YmxhbmtzdGFydCx2YmxhbmtlbmQ7CisJdTMyIGh0b3RhbCwgaGRpc3BlbmQsIGhzeW5jc3RhcnQsIGhzeW5jZW5kLCBoYmxhbmtzdGFydCwKKwkgICAgaGJsYW5rZW5kLCBwcmVlbmRmZXRjaCwgdnRvdGFsLCB2ZGlzcGVuZCwgdnN5bmNzdGFydCwKKwkgICAgdnN5bmNlbmQsIHZibGFua3N0YXJ0LCB2YmxhbmtlbmQ7CiAJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmaW5mby0+dmFyOwogCWludCBicHAgPSB2YXItPmJpdHNfcGVyX3BpeGVsOwogCWludCBpOwogCisJS0RfR1JBUEhJQ1NfUkVUVVJOKDApOworCiAJaWYgKHZlcmJvc2l0eSA+IDApCiAJCW91dHB1dCgiU3dpdGNoaW5nIHRvIG5ldyBtb2RlOiAiCiAJCSAgICAgICAiZmJzZXQgLWcgJWQgJWQgJWQgJWQgJWQgLXQgJWQgJWQgJWQgJWQgJWQgJWQgJWRcbiIsCi0JCQl2YXItPnhyZXMsdmFyLT55cmVzLHZhci0+eHJlc192aXJ0dWFsLAotCQkJdmFyLT55cmVzX3ZpcnR1YWwsdmFyLT5iaXRzX3Blcl9waXhlbCx2YXItPnBpeGNsb2NrLAotCQkJdmFyLT5sZWZ0X21hcmdpbix2YXItPnJpZ2h0X21hcmdpbix2YXItPnVwcGVyX21hcmdpbiwKLQkJCXZhci0+bG93ZXJfbWFyZ2luLHZhci0+aHN5bmNfbGVuLHZhci0+dnN5bmNfbGVuKTsKKwkJICAgICAgIHZhci0+eHJlcywgdmFyLT55cmVzLCB2YXItPnhyZXNfdmlydHVhbCwKKwkJICAgICAgIHZhci0+eXJlc192aXJ0dWFsLCB2YXItPmJpdHNfcGVyX3BpeGVsLCB2YXItPnBpeGNsb2NrLAorCQkgICAgICAgdmFyLT5sZWZ0X21hcmdpbiwgdmFyLT5yaWdodF9tYXJnaW4sIHZhci0+dXBwZXJfbWFyZ2luLAorCQkgICAgICAgdmFyLT5sb3dlcl9tYXJnaW4sIHZhci0+aHN5bmNfbGVuLCB2YXItPnZzeW5jX2xlbik7CiAKIAlodG90YWwgPSAodmFyLT54cmVzICsgdmFyLT5sZWZ0X21hcmdpbiArIHZhci0+cmlnaHRfbWFyZ2luICsKLQkJCQkJCSB2YXItPmhzeW5jX2xlbikgLyA4IC0gNTsKLQloZGlzcGVuZCA9IHZhci0+eHJlcy84IC0gMTsKLQloc3luY3N0YXJ0ID0gKHZhci0+eHJlcyArIHZhci0+cmlnaHRfbWFyZ2luKS84OwotCWhzeW5jZW5kID0gdmFyLT5oc3luY19sZW4vODsKKwkJICB2YXItPmhzeW5jX2xlbikgLyA4IC0gNTsKKwloZGlzcGVuZCA9IHZhci0+eHJlcyAvIDggLSAxOworCWhzeW5jc3RhcnQgPSAodmFyLT54cmVzICsgdmFyLT5yaWdodF9tYXJnaW4pIC8gODsKKwloc3luY2VuZCA9IHZhci0+aHN5bmNfbGVuIC8gODsKIAloYmxhbmtzdGFydCA9IGhkaXNwZW5kICsgMTsKIAloYmxhbmtlbmQgPSBodG90YWwgKyAzOyAvLyBzaG91bGQgYmUgaHRvdGFsICsgNSwgYmlvcyBkb2VzIGl0IHRoaXMgd2F5Ci0JcHJlZW5kZmV0Y2ggPSAoKHZhci0+eHJlcyA+PiAzKSArIDEpICogKChicHArMSkgPj4gMyk7CisJcHJlZW5kZmV0Y2ggPSAoKHZhci0+eHJlcyA+PiAzKSArIDEpICogKChicHAgKyAxKSA+PiAzKTsKIAogCXZ0b3RhbCA9IHZhci0+eXJlcyArIHZhci0+dXBwZXJfbWFyZ2luICsgdmFyLT5sb3dlcl9tYXJnaW4gKwotCQkJCQkJIHZhci0+dnN5bmNfbGVuIC0gMjsKKwkJCQkJCQl2YXItPnZzeW5jX2xlbiAtIDI7CiAJdmRpc3BlbmQgPSB2YXItPnlyZXMgLSAxOwogCXZzeW5jc3RhcnQgPSB2YXItPnlyZXMgKyB2YXItPmxvd2VyX21hcmdpbjsKIAl2YmxhbmtzdGFydCA9IHZhci0+eXJlczsKQEAgLTY3NCwxMDEgKzgyOCw5OSBAQAogCiAJZW5hYmxlX21taW8oKTsJCS8vIG5lY2Vzc2FyeSEgLi4uIGNoZWNrIFggLi4uCiAKLQl3cml0ZTNYNChDUjExLHJlYWQzWDQoQ1IxMSkgJiAweDdGKTsgLy8gdW5sb2NrIGNyMDAgLi4gY3IwNworCXdyaXRlM1g0KENSMTEsIHJlYWQzWDQoQ1IxMSkgJiAweDdGKTsJLy8gdW5sb2NrIGNyMDAgLi4gY3IwNwogCi0Jd3JpdGUzQ0UoR1IzMCw4KTsKKwl3cml0ZTNDRShHUjMwLCA4KTsKIAogCWlmICgoZGlzcGxheXR5cGUgPT0gRElTUExBWV9GUCkgJiYgdmFyLT54cmVzIDwgbmF0aXZleCkgewogCiAJCS8vIHN0cmV0Y2ggb3IgY2VudGVyID8KIAotCQlvdXQ4KDB4M0MyLDB4RUIpOworCQlvdXQ4KDB4M0MyLCAweEVCKTsKIAotCQl3cml0ZTNDRShHUjMwLHJlYWQzQ0UoR1IzMCkgfCAweDgxKTsgLy8gc2hhZG93IG1vZGUgb24KKwkJd3JpdGUzQ0UoR1IzMCwgcmVhZDNDRShHUjMwKSB8IDB4ODEpOwkvLyBzaGFkb3cgbW9kZSBvbgogCiAJCWlmIChjZW50ZXIpIHsKLQkJCXdyaXRlM0NFKEdSNTIsKHJlYWQzQ0UoR1I1MikgJiAweDdDKSB8IDB4ODApOwotCQkJd3JpdGUzQ0UoR1I1MywocmVhZDNDRShHUjUzKSAmIDB4N0MpIHwgMHg4MCk7Ci0JCX0KLQkJZWxzZSBpZiAoc3RyZXRjaCkgewotCQkJd3JpdGUzQ0UoR1I1RCwwKTsKLQkJCXdyaXRlM0NFKEdSNTIsKHJlYWQzQ0UoR1I1MikgJiAweDdDKSB8IDEpOwotCQkJd3JpdGUzQ0UoR1I1MywocmVhZDNDRShHUjUzKSAmIDB4N0MpIHwgMSk7CisJCQl3cml0ZTNDRShHUjUyLCAocmVhZDNDRShHUjUyKSAmIDB4N0MpIHwgMHg4MCk7CisJCQl3cml0ZTNDRShHUjUzLCAocmVhZDNDRShHUjUzKSAmIDB4N0MpIHwgMHg4MCk7CisJCX0gZWxzZSBpZiAoc3RyZXRjaCkgeworCQkJd3JpdGUzQ0UoR1I1RCwgMCk7CisJCQl3cml0ZTNDRShHUjUyLCAocmVhZDNDRShHUjUyKSAmIDB4N0MpIHwgMSk7CisJCQl3cml0ZTNDRShHUjUzLCAocmVhZDNDRShHUjUzKSAmIDB4N0MpIHwgMSk7CiAJCX0KIAogCX0gZWxzZSB7Ci0JCW91dDgoMHgzQzIsMHgyQik7Ci0JCXdyaXRlM0NFKEdSMzAsOCk7CisJCW91dDgoMHgzQzIsIDB4MkIpOworCQl3cml0ZTNDRShHUjMwLCA4KTsKIAl9CiAKIAkvLwogCS8vIFNldHVwIENSeHggcmVncwogCS8vCiAKLQl3cml0ZTNYNChDUjAwLGh0b3RhbCAmIDB4RkYpOwotCXdyaXRlM1g0KENSMDEsaGRpc3BlbmQgJiAweEZGKTsKLQl3cml0ZTNYNChDUjAyLGhibGFua3N0YXJ0ICYgMHhGRik7Ci0Jd3JpdGUzWDQoQ1IwMyxoYmxhbmtlbmQgJiAweDFGKTsKLQl3cml0ZTNYNChDUjA0LGhzeW5jc3RhcnQgJiAweEZGKTsKLQl3cml0ZTNYNChDUjA1LChoc3luY2VuZCAmIDB4MUYpIHwgKChoYmxhbmtlbmQgJiAweDIwKTw8MikpOwotCXdyaXRlM1g0KENSMDYsdnRvdGFsICYgMHhGRik7Ci0Jd3JpdGUzWDQoQ1IwNywodnRvdGFsICYgMHgxMDApID4+IDggfAotCQkgICAgICAodmRpc3BlbmQgJiAweDEwMCkgPj4gNyB8Ci0JCSAgICAgICh2c3luY3N0YXJ0ICYgMHgxMDApID4+IDYgfAotCQkgICAgICAodmJsYW5rc3RhcnQgJiAweDEwMCkgPj4gNSB8Ci0JCSAgICAgIDB4MTAgfAotCQkgICAgICAodnRvdGFsICYgMHgyMDApID4+IDQgfAotCQkgICAgICAodmRpc3BlbmQgJiAweDIwMCkgPj4gMyB8Ci0JCSAgICAgICh2c3luY3N0YXJ0ICYgMHgyMDApID4+IDIpOwotCXdyaXRlM1g0KENSMDgsMCk7Ci0Jd3JpdGUzWDQoQ1IwOSwodmJsYW5rc3RhcnQgJiAweDIwMCkgPj4gNCB8IDB4NDAgfCAgLy8gRklYICEhIQotCQkgICAgICAoKGluZm8tPnZhci52bW9kZSAmIEZCX1ZNT0RFX0RPVUJMRSkgPyAweDgwIDogMCkpOwotCXdyaXRlM1g0KENSMEEsMCk7ICAvLyBJbml0IHRvIHNvbWUgcmVhc29uYWJsZSBkZWZhdWx0Ci0Jd3JpdGUzWDQoQ1IwQiwwKTsgIC8vIEluaXQgdG8gc29tZSByZWFzb25hYmxlIGRlZmF1bHQKLQl3cml0ZTNYNChDUjBDLDApOyAgLy8gT2Zmc2V0IDAKLQl3cml0ZTNYNChDUjBELDApOyAgLy8gT2Zmc2V0IDAKLQl3cml0ZTNYNChDUjBFLDApOyAgLy8gSW5pdCB0byBzb21lIHJlYXNvbmFibGUgZGVmYXVsdAotCXdyaXRlM1g0KENSMEYsMCk7ICAvLyBJbml0IHRvIHNvbWUgcmVhc29uYWJsZSBkZWZhdWx0Ci0Jd3JpdGUzWDQoQ1IxMCx2c3luY3N0YXJ0ICYgMHhGRik7Ci0Jd3JpdGUzWDQoQ1IxMSwodnN5bmNlbmQgJiAweDBGKSk7Ci0Jd3JpdGUzWDQoQ1IxMix2ZGlzcGVuZCAmIDB4RkYpOwotCXdyaXRlM1g0KENSMTMsKChpbmZvLT52YXIueHJlcyAqIGJwcCkvKDQqMTYpKSAmIDB4RkYpOwotCXdyaXRlM1g0KENSMTQsMHg0MCk7ICAvLyBkb3VibGUgd29yZCBtb2RlCi0Jd3JpdGUzWDQoQ1IxNSx2YmxhbmtzdGFydCAmIDB4RkYpOwotCXdyaXRlM1g0KENSMTYsdmJsYW5rZW5kICYgMHhGRik7Ci0Jd3JpdGUzWDQoQ1IxNywweEMzKTsKLQl3cml0ZTNYNChDUjE4LDB4RkYpOworCXdyaXRlM1g0KENSMDAsIGh0b3RhbCAmIDB4RkYpOworCXdyaXRlM1g0KENSMDEsIGhkaXNwZW5kICYgMHhGRik7CisJd3JpdGUzWDQoQ1IwMiwgaGJsYW5rc3RhcnQgJiAweEZGKTsKKwl3cml0ZTNYNChDUjAzLCBoYmxhbmtlbmQgJiAweDFGKTsKKwl3cml0ZTNYNChDUjA0LCBoc3luY3N0YXJ0ICYgMHhGRik7CisJd3JpdGUzWDQoQ1IwNSwgKGhzeW5jZW5kICYgMHgxRikgfCAoKGhibGFua2VuZCAmIDB4MjApIDw8IDIpKTsKKwl3cml0ZTNYNChDUjA2LCB2dG90YWwgJiAweEZGKTsKKwl3cml0ZTNYNChDUjA3LCAodnRvdGFsICYgMHgxMDApID4+IDggfAorCQkgICAgICAgKHZkaXNwZW5kICYgMHgxMDApID4+IDcgfAorCQkgICAgICAgKHZzeW5jc3RhcnQgJiAweDEwMCkgPj4gNiB8CisJCSAgICAgICAodmJsYW5rc3RhcnQgJiAweDEwMCkgPj4gNSB8CisJCSAgICAgICAweDEwIHwKKwkJICAgICAgICh2dG90YWwgJiAweDIwMCkgPj4gNCB8CisJCSAgICAgICAodmRpc3BlbmQgJiAweDIwMCkgPj4gMyB8ICh2c3luY3N0YXJ0ICYgMHgyMDApID4+IDIpOworCXdyaXRlM1g0KENSMDgsIDApOworCXdyaXRlM1g0KENSMDksICh2YmxhbmtzdGFydCAmIDB4MjAwKSA+PiA0IHwgMHg0MCB8CS8vIEZJWCAhISEKKwkJICAgICAgICgoaW5mby0+dmFyLnZtb2RlICYgRkJfVk1PREVfRE9VQkxFKSA/IDB4ODAgOiAwKSk7CisJd3JpdGUzWDQoQ1IwQSwgMCk7CS8vIEluaXQgdG8gc29tZSByZWFzb25hYmxlIGRlZmF1bHQKKwl3cml0ZTNYNChDUjBCLCAwKTsJLy8gSW5pdCB0byBzb21lIHJlYXNvbmFibGUgZGVmYXVsdAorCXdyaXRlM1g0KENSMEMsIDApOwkvLyBPZmZzZXQgMAorCXdyaXRlM1g0KENSMEQsIDApOwkvLyBPZmZzZXQgMAorCXdyaXRlM1g0KENSMEUsIDApOwkvLyBJbml0IHRvIHNvbWUgcmVhc29uYWJsZSBkZWZhdWx0CisJd3JpdGUzWDQoQ1IwRiwgMCk7CS8vIEluaXQgdG8gc29tZSByZWFzb25hYmxlIGRlZmF1bHQKKwl3cml0ZTNYNChDUjEwLCB2c3luY3N0YXJ0ICYgMHhGRik7CisJd3JpdGUzWDQoQ1IxMSwgKHZzeW5jZW5kICYgMHgwRikpOworCXdyaXRlM1g0KENSMTIsIHZkaXNwZW5kICYgMHhGRik7CisJd3JpdGUzWDQoQ1IxMywgKChpbmZvLT52YXIueHJlc192aXJ0dWFsICogYnBwKSAvICg0ICogMTYpKSAmIDB4RkYpOworCXdyaXRlM1g0KENSMTQsIDB4NDApOwkvLyBkb3VibGUgd29yZCBtb2RlCisJd3JpdGUzWDQoQ1IxNSwgdmJsYW5rc3RhcnQgJiAweEZGKTsKKwl3cml0ZTNYNChDUjE2LCB2YmxhbmtlbmQgJiAweEZGKTsKKwl3cml0ZTNYNChDUjE3LCAweEUzKTsKKwl3cml0ZTNYNChDUjE4LCAweEZGKTsKIAkvLwkgQ1IxOTogbmVlZGVkIGZvciBpbnRlcmxhY2VkIG1vZGVzIC4uLiBpZ25vcmUgaXQgZm9yIG5vdwotCXdyaXRlM1g0KENSMUEsMHgwNyk7IC8vIEFyYml0cmF0aW9uIENvbnRyb2wgQ291bnRlciAxCi0Jd3JpdGUzWDQoQ1IxQiwweDA3KTsgLy8gQXJiaXRyYXRpb24gQ29udHJvbCBDb3VudGVyIDIKLQl3cml0ZTNYNChDUjFDLDB4MDcpOyAvLyBBcmJpdHJhdGlvbiBDb250cm9sIENvdW50ZXIgMwotCXdyaXRlM1g0KENSMUQsMHgwMCk7IC8vIERvbid0IGtub3csIGRvZXNuJ3QgaHVydCA7LSkKLQl3cml0ZTNYNChDUjFFLChpbmZvLT52YXIudm1vZGUgJiBGQl9WTU9ERV9JTlRFUkxBQ0VEKSA/IDB4ODQgOiAweDgwKTsKKwl3cml0ZTNYNChDUjFBLCAweDA3KTsJLy8gQXJiaXRyYXRpb24gQ29udHJvbCBDb3VudGVyIDEKKwl3cml0ZTNYNChDUjFCLCAweDA3KTsJLy8gQXJiaXRyYXRpb24gQ29udHJvbCBDb3VudGVyIDIKKwl3cml0ZTNYNChDUjFDLCAweDA3KTsJLy8gQXJiaXRyYXRpb24gQ29udHJvbCBDb3VudGVyIDMKKwl3cml0ZTNYNChDUjFELCAweDAwKTsJLy8gRG9uJ3Qga25vdywgZG9lc24ndCBodXJ0IDsgLSkKKwl3cml0ZTNYNChDUjFFLCAoaW5mby0+dmFyLnZtb2RlICYgRkJfVk1PREVfSU5URVJMQUNFRCkgPyAweDg0IDogMHg4MCk7CiAJLy8JIENSMUY6IGRvIG5vdCBzZXQsIGNvbnRhaW5zIEJJT1MgaW5mbyBhYm91dCBtZW1zaXplCi0Jd3JpdGUzWDQoQ1IyMCwweDIwKTsgLy8gZW5hYmUgd3IgYnVmLCBkaXNhYmxlIDE2Yml0IHBsYW5hciBtb2RlCi0Jd3JpdGUzWDQoQ1IyMSwweDIwKTsgLy8gZW5hYmxlIGxpbmVhciBtZW1vcnkgYWNjZXNzCisJd3JpdGUzWDQoQ1IyMCwgMHgyMCk7CS8vIGVuYWJlIHdyIGJ1ZiwgZGlzYWJsZSAxNmJpdCBwbGFuYXIgbW9kZQorCXdyaXRlM1g0KENSMjEsIDB4MjApOwkvLyBlbmFibGUgbGluZWFyIG1lbW9yeSBhY2Nlc3MKIAkvLwkgQ1IyMjogUk8gY3B1IGxhdGNoIHJlYWRiYWNrCiAJLy8JIENSMjM6ID8/PwogCS8vCSBDUjI0OiBSTyBBUiBmbGFnIHN0YXRlCiAJLy8JIENSMjU6IFJBTURBQyBydyB0aW1pbmcsIHBjbGsgYnVmZmVyIHRyaXN0YXRlIGNvbnRyb2wgPz8/PwogCS8vCSBDUjI2OiA/Pz8KLQl3cml0ZTNYNChDUjI3LCh2ZGlzcGVuZCAmIDB4NDAwKSA+PiA2IHwKLQkJICAgICAgKHZzeW5jc3RhcnQgJiAweDQwMCkgPj4gNSB8Ci0JCSAgICAgICh2YmxhbmtzdGFydCAmIDB4NDAwKSA+PiA0IHwKLQkJICAgICAgKHZ0b3RhbCAmIDB4NDAwKSA+PiAzIHwKLQkJICAgICAgMHg4KTsKKwl3cml0ZTNYNChDUjI3LCAodmRpc3BlbmQgJiAweDQwMCkgPj4gNiB8CisJCSAgICAgICAodnN5bmNzdGFydCAmIDB4NDAwKSA+PiA1IHwKKwkJICAgICAgICh2YmxhbmtzdGFydCAmIDB4NDAwKSA+PiA0IHwKKwkJICAgICAgICh2dG90YWwgJiAweDQwMCkgPj4gMyB8CisJCSAgICAgICAweDgpOwogCS8vCSBDUjI4OiA/Pz8KLQl3cml0ZTNYNChDUjI5LChyZWFkM1g0KENSMjkpICYgMHhDRikgfAotCQkgICAgICAoKCgoaW5mby0+dmFyLnhyZXMgKiBicHApIC8gKDQqMTYpKSAmIDB4MzAwKSA+PjQpKTsKLQl3cml0ZTNYNChDUjJBLHJlYWQzWDQoQ1IyQSkgfCAweDQwKTsKLQl3cml0ZTNYNChDUjJCLChodG90YWwgJiAweDEwMCkgPj4gOCB8Ci0JCSAgICAgIChoZGlzcGVuZCAmIDB4MTAwKSA+PiA3IHwKLQkJICAgICAgLy8gKDB4MDAgJiAweDEwMCkgPj4gNiB8CSBoaW50ZXJsYWNlIHBhcmEgYml0IDggPz8/Ci0JCSAgICAgIChoc3luY3N0YXJ0ICYgMHgxMDApID4+IDUgfAotCQkgICAgICAoaGJsYW5rc3RhcnQgJiAweDEwMCkgPj4gNCk7CisJd3JpdGUzWDQoQ1IyOSwgKHJlYWQzWDQoQ1IyOSkgJiAweENGKSB8ICgoKChpbmZvLT52YXIueHJlc192aXJ0dWFsICoKKwkJCWJwcCkgLyAoNCAqIDE2KSkgJiAweDMwMCkgPj4gNCkpOworCXdyaXRlM1g0KENSMkEsIHJlYWQzWDQoQ1IyQSkgfCAweDQwKTsKKwl3cml0ZTNYNChDUjJCLCAoaHRvdGFsICYgMHgxMDApID4+IDggfAorCQkgICAgICAgKGhkaXNwZW5kICYgMHgxMDApID4+IDcgfAorCQkgICAgICAgLy8gKDB4MDAgJiAweDEwMCkgPj4gNiB8ICAgaGludGVybGFjZSBwYXJhIGJpdCA4ID8/PworCQkgICAgICAgKGhzeW5jc3RhcnQgJiAweDEwMCkgPj4gNSB8CisJCSAgICAgICAoaGJsYW5rc3RhcnQgJiAweDEwMCkgPj4gNCk7CiAJLy8JIENSMkM6ID8/PwogCS8vCSBDUjJEOiBpbml0aWFsaXplZCBpbiBjeWJsYWZiX3NldHVwX0dFKCkKLQl3cml0ZTNYNChDUjJGLDB4OTIpOyAvLyBjb25zZXJ2YXRpdmUsIGJldHRlciBzaWduYWwgcXVhbGl0eQorCXdyaXRlM1g0KENSMkYsIDB4OTIpOwkvLyBjb25zZXJ2YXRpdmUsIGJldHRlciBzaWduYWwgcXVhbGl0eQogCS8vCSBDUjMwOiByZXNlcnZlZAogCS8vCSBDUjMxOiByZXNlcnZlZAogCS8vCSBDUjMyOiByZXNlcnZlZApAQCAtNzc3LDk2ICs5MjksMTE2IEBACiAJLy8JIENSMzU6IGRpc2FibGVkIGluIENSMzYKIAkvLwkgQ1IzNjogaW5pdGlhbGl6ZWQgaW4gY3libGFmYl9zZXR1cF9HRQogCS8vCSBDUjM3OiBpMmMsIGlnbm9yZSBmb3Igbm93Ci0Jd3JpdGUzWDQoQ1IzOCwoYnBwID09IDgpID8gMHgwMCA6CS8vCi0JCSAgICAgIChicHAgPT0gMTYpID8gMHgwNSA6CS8vIGhpZ2hjb2xvcgotCQkgICAgICAoYnBwID09IDI0KSA/IDB4MjkgOgkvLyBwYWNrZWQgMjRiaXQgdHJ1ZWNvbG9yCi0JCSAgICAgIChicHAgPT0gMzIpID8gMHgwOSA6IDApOwkvLyB0cnVlY29sb3IsIDE2IGJpdCBwaXhlbGJ1cwotCXdyaXRlM1g0KENSMzksMHgwMSB8CQkJLy8gTU1JTyBlbmFibGUKLQkJICAgICAgKHBjaXJiID8gMHgwMiA6IDApIHwgLy8gcGNpIHJlYWQgYnVyc3QgZW5hYmxlCi0JCSAgICAgIChwY2l3YiA/IDB4MDQgOiAwKSk7IC8vIHBjaSB3cml0ZSBidXJzdCBlbmFibGUKLQl3cml0ZTNYNChDUjU1LDB4MUYgfCAvLyBwY2kgY2xvY2tzICogMiBmb3IgU1RPUCMgZHVyaW5nIDFzdCBkYXRhIHBoYXNlCi0JCSAgICAgIChwY2lyciA/IDB4NDAgOiAwKSB8IC8vIHBjaSByZWFkIHJldHJ5IGVuYWJsZQotCQkgICAgICAocGNpd3IgPyAweDgwIDogMCkpOyAvLyBwY2kgd3JpdGUgcmV0cnkgZW5hYmxlCi0Jd3JpdGUzWDQoQ1I1NixwcmVlbmRmZXRjaCA+PiA4IDwgMiA/IChwcmVlbmRmZXRjaCA+PiA4ICYgMHgwMSl8MiA6IDApOwotCXdyaXRlM1g0KENSNTcscHJlZW5kZmV0Y2ggPj4gOCA8IDIgPyBwcmVlbmRmZXRjaCAmIDB4ZmYgOiAwKTsKLQl3cml0ZTNYNChDUjU4LDB4ODIpOwkvLyBCaW9zIGRvZXMgdGhpcyAuLi4uIGRvbid0IGtub3cgbW9yZQorCXdyaXRlM1g0KENSMzgsIChicHAgPT0gOCkgPyAweDAwIDoJLy8KKwkJICAgICAgIChicHAgPT0gMTYpID8gMHgwNSA6CS8vIGhpZ2hjb2xvcgorCQkgICAgICAgKGJwcCA9PSAyNCkgPyAweDI5IDoJLy8gcGFja2VkIDI0Yml0IHRydWVjb2xvcgorCQkgICAgICAgKGJwcCA9PSAzMikgPyAweDA5IDogMCk7IC8vIHRydWVjb2xvciwgMTYgYml0IHBpeGVsYnVzCisJd3JpdGUzWDQoQ1IzOSwgMHgwMSB8CS8vIE1NSU8gZW5hYmxlCisJCSAgICAgICAocGNpcmIgPyAweDAyIDogMCkgfAkvLyBwY2kgcmVhZCBidXJzdCBlbmFibGUKKwkJICAgICAgIChwY2l3YiA/IDB4MDQgOiAwKSk7CS8vIHBjaSB3cml0ZSBidXJzdCBlbmFibGUKKwl3cml0ZTNYNChDUjU1LCAweDFGIHwgLy8gcGNpIGNsb2NrcyAqIDIgZm9yIFNUT1AjIGR1cmluZyAxc3QgZGF0YSBwaGFzZQorCQkgICAgICAgKHBjaXJyID8gMHg0MCA6IDApIHwJLy8gcGNpIHJlYWQgcmV0cnkgZW5hYmxlCisJCSAgICAgICAocGNpd3IgPyAweDgwIDogMCkpOwkvLyBwY2kgd3JpdGUgcmV0cnkgZW5hYmxlCisJd3JpdGUzWDQoQ1I1NiwgcHJlZW5kZmV0Y2ggPj4gOCA8IDIgPyAocHJlZW5kZmV0Y2ggPj4gOCAmIDB4MDEpIHwgMgorCQkJCQkgICAgOiAwKTsKKwl3cml0ZTNYNChDUjU3LCBwcmVlbmRmZXRjaCA+PiA4IDwgMiA/IHByZWVuZGZldGNoICYgMHhmZiA6IDApOworCXdyaXRlM1g0KENSNTgsIDB4ODIpOwkvLyBCaW9zIGRvZXMgdGhpcyAuLi4uIGRvbid0IGtub3cgbW9yZQogCS8vCiAJLy8gU2V0dXAgU1J4eCByZWdzCiAJLy8KLQl3cml0ZTNDNChTUjAwLDMpOwotCXdyaXRlM0M0KFNSMDEsMSk7CS8vc2V0IGNoYXIgY2xvY2sgOCBkb3RzIHdpZGUKLQl3cml0ZTNDNChTUjAyLDB4MEYpOwkvL2VuYWJsZSA0IG1hcHMgbmVlZGVkIGluIGNoYWluNCBtb2RlCi0Jd3JpdGUzQzQoU1IwMywwKTsJLy9ubyBjaGFyYWN0ZXIgbWFwIHNlbGVjdAotCXdyaXRlM0M0KFNSMDQsMHgwRSk7CS8vbWVtb3J5IG1vZGU6IGV4dCBtZW0sIGV2ZW4sIGNoYWluNAorCXdyaXRlM0M0KFNSMDAsIDMpOworCXdyaXRlM0M0KFNSMDEsIDEpOwkvL3NldCBjaGFyIGNsb2NrIDggZG90cyB3aWRlCisJd3JpdGUzQzQoU1IwMiwgMHgwRik7CS8vZW5hYmxlIDQgbWFwcyBuZWVkZWQgaW4gY2hhaW40IG1vZGUKKwl3cml0ZTNDNChTUjAzLCAwKTsJLy9ubyBjaGFyYWN0ZXIgbWFwIHNlbGVjdAorCXdyaXRlM0M0KFNSMDQsIDB4MEUpOwkvL21lbW9yeSBtb2RlOiBleHQgbWVtLCBldmVuLCBjaGFpbjQKIAotCW91dDgoMHgzQzQsMHgwYik7CisJb3V0OCgweDNDNCwgMHgwYik7CiAJaW44KDB4M0M1KTsJCS8vIFNldCBORVcgbW9kZQotCXdyaXRlM0M0KFNSMEQsMHgwMCk7CS8vIHRlc3QgLi4uIGNoZWNrCisJd3JpdGUzQzQoU1IwRCwgMHgwMCk7CS8vIHRlc3QgLi4uIGNoZWNrCiAKLQlzZXRfdmNsayhwYXIsKGJwcD09MzIgPyAyMDAwMDAwMDAgOiAxMDAwMDAwMDApLwotCQkgaW5mby0+dmFyLnBpeGNsb2NrKTsgLy9TUjE4LFNSMTkKKwlzZXRfdmNsayhwYXIsIChicHAgPT0gMzIgPyAyMDAwMDAwMDAgOiAxMDAwMDAwMDApCisJCQkJCS8gaW5mby0+dmFyLnBpeGNsb2NrKTsJLy9TUjE4LCBTUjE5CiAKIAkvLwogCS8vIFNldHVwIEdSeHggcmVncwogCS8vCi0Jd3JpdGUzQ0UoR1IwMCwweDAwKTsJLy8gdGVzdCAuLi4gY2hlY2sKLQl3cml0ZTNDRShHUjAxLDB4MDApOwkvLyB0ZXN0IC4uLiBjaGVjawotCXdyaXRlM0NFKEdSMDIsMHgwMCk7CS8vIHRlc3QgLi4uIGNoZWNrCi0Jd3JpdGUzQ0UoR1IwMywweDAwKTsJLy8gdGVzdCAuLi4gY2hlY2sKLQl3cml0ZTNDRShHUjA0LDB4MDApOwkvLyB0ZXN0IC4uLiBjaGVjawotCXdyaXRlM0NFKEdSMDUsMHg0MCk7CS8vIG5vIENHQSBjb21wYXQsYWxsb3cgMjU2IGNvbAotCXdyaXRlM0NFKEdSMDYsMHgwNSk7CS8vIGdyYXBoaWNzIG1vZGUKLQl3cml0ZTNDRShHUjA3LDB4MEYpOwkvLyBwbGFuZXM/Ci0Jd3JpdGUzQ0UoR1IwOCwweEZGKTsJLy8gdGVzdCAuLi4gY2hlY2sKLQl3cml0ZTNDRShHUjBGLChicHA9PTMyKT8weDFBOjB4MTIpOyAvLyBkaXYgdmNsayBieSAyIGlmIDMyYnBwLCBjaGFpbjQKLQl3cml0ZTNDRShHUjIwLDB4QzApOwkvLyB0ZXN0IC4uLiBjaGVjawotCXdyaXRlM0NFKEdSMkYsMHhBMCk7CS8vIFBDTEsgPSBWQ0xLLCBubyBza2V3LAorCXdyaXRlM0NFKEdSMDAsIDB4MDApOwkvLyB0ZXN0IC4uLiBjaGVjaworCXdyaXRlM0NFKEdSMDEsIDB4MDApOwkvLyB0ZXN0IC4uLiBjaGVjaworCXdyaXRlM0NFKEdSMDIsIDB4MDApOwkvLyB0ZXN0IC4uLiBjaGVjaworCXdyaXRlM0NFKEdSMDMsIDB4MDApOwkvLyB0ZXN0IC4uLiBjaGVjaworCXdyaXRlM0NFKEdSMDQsIDB4MDApOwkvLyB0ZXN0IC4uLiBjaGVjaworCXdyaXRlM0NFKEdSMDUsIDB4NDApOwkvLyBubyBDR0EgY29tcGF0LCBhbGxvdyAyNTYgY29sCisJd3JpdGUzQ0UoR1IwNiwgMHgwNSk7CS8vIGdyYXBoaWNzIG1vZGUKKwl3cml0ZTNDRShHUjA3LCAweDBGKTsJLy8gcGxhbmVzPworCXdyaXRlM0NFKEdSMDgsIDB4RkYpOwkvLyB0ZXN0IC4uLiBjaGVjaworCXdyaXRlM0NFKEdSMEYsIChicHAgPT0gMzIpID8gMHgxQSA6IDB4MTIpOyAvLyB2Y2xrIC8gMiBpZiAzMmJwcCwgY2hhaW40CisJd3JpdGUzQ0UoR1IyMCwgMHhDMCk7CS8vIHRlc3QgLi4uIGNoZWNrCisJd3JpdGUzQ0UoR1IyRiwgMHhBMCk7CS8vIFBDTEsgPSBWQ0xLLCBubyBza2V3LAogCiAJLy8KIAkvLyBTZXR1cCBBUnh4IHJlZ3MKIAkvLwotCWZvcihpID0gMDtpIDwgMHgxMDtpKyspIC8vIHNldCBBUjAwIC4uIEFSMGYKLQkJd3JpdGUzQzAoaSxpKTsKLQl3cml0ZTNDMChBUjEwLDB4NDEpOwkvLyBncmFwaGljcyBtb2RlIGFuZCBzdXBwb3J0IDI1NiBjb2xvciBtb2RlcwotCXdyaXRlM0MwKEFSMTIsMHgwRik7CS8vIHBsYW5lcwotCXdyaXRlM0MwKEFSMTMsMCk7CS8vIGhvcml6b250YWwgcGVsIHBhbm5pbmcKKwlmb3IgKGkgPSAwOyBpIDwgMHgxMDsgaSsrKQkvLyBzZXQgQVIwMCAuLiBBUjBmCisJCXdyaXRlM0MwKGksIGkpOworCXdyaXRlM0MwKEFSMTAsIDB4NDEpOwkvLyBncmFwaGljcyBtb2RlIGFuZCBzdXBwb3J0IDI1NiBjb2xvciBtb2RlcworCXdyaXRlM0MwKEFSMTIsIDB4MEYpOwkvLyBwbGFuZXMKKwl3cml0ZTNDMChBUjEzLCAwKTsJLy8gaG9yaXpvbnRhbCBwZWwgcGFubmluZwogCWluOCgweDNEQSk7CQkvLyByZXNldCBpbnRlcm5hbCBmbGFnIHRvIDNjMCBpbmRleAotCW91dDgoMHgzQzAsMHgyMCk7CS8vIGVuYWJsZSBhdHRyCisJb3V0OCgweDNDMCwgMHgyMCk7CS8vIGVuYWJsZSBhdHRyCiAKIAkvLwogCS8vIFNldHVwIGhpZGRlbiBSQU1EQUMgY29tbWFuZCByZWdpc3RlcgogCS8vCi0JaW44KDB4M0M4KTsgIC8vIHRoZXNlIHJlYWRzIGFyZQotCWluOCgweDNDNik7ICAvLyBuZWNlc3NhcnkgdG8KLQlpbjgoMHgzQzYpOyAgLy8gdW5tYXNrIHRoZSBSQU1EQUMKLQlpbjgoMHgzQzYpOyAgLy8gY29tbWFuZCByZWcsIG90aGVyd2lzZQotCWluOCgweDNDNik7ICAvLyB3ZSB3b3VsZCB3cml0ZSB0aGUgcGl4ZWxtYXNrIHJlZyEKLQlvdXQ4KDB4M0M2LChicHAgPT0gIDgpID8gMHgwMCA6IAkvLyAyNTYgY29sb3JzCi0JCSAgIChicHAgPT0gMTUpID8gMHgxMCA6IAkvLwotCQkgICAoYnBwID09IDE2KSA/IDB4MzAgOiAJLy8gaGljb2xvcgotCQkgICAoYnBwID09IDI0KSA/IDB4RDAgOiAJLy8gdHJ1ZWNvbG9yCi0JCSAgIChicHAgPT0gMzIpID8gMHhEMCA6IDApOwkvLyB0cnVlY29sb3IKKwlpbjgoMHgzQzgpOwkJLy8gdGhlc2UgcmVhZHMgYXJlCisJaW44KDB4M0M2KTsJCS8vIG5lY2Vzc2FyeSB0bworCWluOCgweDNDNik7CQkvLyB1bm1hc2sgdGhlIFJBTURBQworCWluOCgweDNDNik7CQkvLyBjb21tYW5kIHJlZywgb3RoZXJ3aXNlCisJaW44KDB4M0M2KTsJCS8vIHdlIHdvdWxkIHdyaXRlIHRoZSBwaXhlbG1hc2sgcmVnIQorCW91dDgoMHgzQzYsIChicHAgPT0gOCkgPyAweDAwIDogLy8gMjU2IGNvbG9ycworCSAgICAgKGJwcCA9PSAxNSkgPyAweDEwIDoJLy8KKwkgICAgIChicHAgPT0gMTYpID8gMHgzMCA6CS8vIGhpY29sb3IKKwkgICAgIChicHAgPT0gMjQpID8gMHhEMCA6CS8vIHRydWVjb2xvcgorCSAgICAgKGJwcCA9PSAzMikgPyAweEQwIDogMCk7CS8vIHRydWVjb2xvcgogCWluOCgweDNDOCk7CiAKIAkvLwogCS8vIEdSMzEgaXMgbm90IG1lbnRpb25lZCBpbiB0aGUgZGF0YXNoZWV0CiAJLy8KIAlpZiAoZGlzcGxheXR5cGUgPT0gRElTUExBWV9GUCkKLQkJd3JpdGUzQ0UoR1IzMSwocmVhZDNDRShHUjMxKSAmIDB4OEYpIHwKKwkJd3JpdGUzQ0UoR1IzMSwgKHJlYWQzQ0UoR1IzMSkgJiAweDhGKSB8CiAJCQkgKChpbmZvLT52YXIueXJlcyA+IDEwMjQpID8gMHg1MCA6Ci0JCQkgKGluZm8tPnZhci55cmVzID4gICA3NjgpID8gMHgzMCA6Ci0JCQkgKGluZm8tPnZhci55cmVzID4gICA2MDApID8gMHgyMCA6Ci0JCQkgKGluZm8tPnZhci55cmVzID4gICA0ODApID8gMHgxMCA6IDApKTsKKwkJCSAgKGluZm8tPnZhci55cmVzID4gNzY4KSA/IDB4MzAgOgorCQkJICAoaW5mby0+dmFyLnlyZXMgPiA2MDApID8gMHgyMCA6CisJCQkgIChpbmZvLT52YXIueXJlcyA+IDQ4MCkgPyAweDEwIDogMCkpOwogCiAJaW5mby0+Zml4LnZpc3VhbCA9IChicHAgPT0gOCkgPyBGQl9WSVNVQUxfUFNFVURPQ09MT1IKIAkJCQkgICAgICA6IEZCX1ZJU1VBTF9UUlVFQ09MT1I7Ci0JaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gaW5mby0+dmFyLnhyZXMgKiAoYnBwID4+IDMpOwotCWluZm8tPmNtYXAubGVuID0gKGJwcCA9PSA4KSA/IDI1NjogMTY7CisJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gaW5mby0+dmFyLnhyZXNfdmlydHVhbCAqIChicHAgPj4gMyk7CisJaW5mby0+Y21hcC5sZW4gPSAoYnBwID09IDgpID8gMjU2IDogMTY7CiAKIAkvLwogCS8vIGluaXQgYWNjZWxlcmF0aW9uIGVuZ2luZQogCS8vCi0JY3libGFmYl9zZXR1cF9HRShpbmZvLT52YXIueHJlcyxpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpOworCWN5YmxhZmJfc2V0dXBfR0UoaW5mby0+dmFyLnhyZXNfdmlydHVhbCwgaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKTsKKworCS8vCisJLy8gU2V0L2NsZWFyIGZsYWdzIHRvIGFsbG93IHByb3BlciBzY3JvbGwgbW9kZSBzZWxlY3Rpb24uCisJLy8KKwlpZiAodmFyLT54cmVzID09IHZhci0+eHJlc192aXJ0dWFsKQorCQlpbmZvLT5mbGFncyAmPSB+RkJJTkZPX0hXQUNDRUxfWFBBTjsKKwllbHNlCisJCWluZm8tPmZsYWdzIHw9IEZCSU5GT19IV0FDQ0VMX1hQQU47CisKKwlpZiAodmFyLT55cmVzID09IHZhci0+eXJlc192aXJ0dWFsKQorCQlpbmZvLT5mbGFncyAmPSB+RkJJTkZPX0hXQUNDRUxfWVBBTjsKKwllbHNlCisJCWluZm8tPmZsYWdzIHw9IEZCSU5GT19IV0FDQ0VMX1lQQU47CisKKwlpZiAoaW5mby0+Zml4LnNtZW1fbGVuICE9CisJICAgIHZhci0+eHJlc192aXJ0dWFsICogdmFyLT55cmVzX3ZpcnR1YWwgKiBicHAgLyA4KQorCQlpbmZvLT5mbGFncyAmPSB+RkJJTkZPX0hXQUNDRUxfWVdSQVA7CisJZWxzZQorCQlpbmZvLT5mbGFncyB8PSBGQklORk9fSFdBQ0NFTF9ZV1JBUDsKIAogCXJlZ2R1bXAocGFyKTsKIApAQCAtODg1LDI3ICsxMDU3LDI3IEBACiB7CiAJaW50IGJwcCA9IGluZm8tPnZhci5iaXRzX3Blcl9waXhlbDsKIAorCUtEX0dSQVBISUNTX1JFVFVSTigwKTsKKwogCWlmIChyZWdubyA+PSBpbmZvLT5jbWFwLmxlbikKIAkJcmV0dXJuIDE7CiAKIAlpZiAoYnBwID09IDgpIHsKLQkJb3V0OCgweDNDNiwweEZGKTsKLQkJb3V0OCgweDNDOCxyZWdubyk7Ci0JCW91dDgoMHgzQzkscmVkPj4xMCk7Ci0JCW91dDgoMHgzQzksZ3JlZW4+PjEwKTsKLQkJb3V0OCgweDNDOSxibHVlPj4xMCk7CisJCW91dDgoMHgzQzYsIDB4RkYpOworCQlvdXQ4KDB4M0M4LCByZWdubyk7CisJCW91dDgoMHgzQzksIHJlZCA+PiAxMCk7CisJCW91dDgoMHgzQzksIGdyZWVuID4+IDEwKTsKKwkJb3V0OCgweDNDOSwgYmx1ZSA+PiAxMCk7CiAKLQl9IGVsc2UgaWYgKGJwcCA9PSAxNikJCQkJLy8gUkdCIDU2NQotCQkoKHUzMiopaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlZ25vXSA9Ci0JCQkocmVkICYgMHhGODAwKSB8Ci0JCQkoKGdyZWVuICYgMHhGQzAwKSA+PiA1KSB8Ci0JCQkoKGJsdWUgJiAweEY4MDApID4+IDExKTsKLQllbHNlIGlmIChicHAgPT0gMzIpCQkJCS8vIEFSR0IgODg4OAotCQkoKHUzMiopaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlZ25vXSA9Ci0JCQkoKHRyYW5zcCAmIDB4RkYwMCkgPDwxNikgfAotCQkJKChyZWQgJiAweEZGMDApIDw8IDgpIHwKLQkJCSgoZ3JlZW4gJiAweEZGMDApKSB8Ci0JCQkoKGJsdWUgJiAweEZGMDApPj44KTsKKwl9IGVsc2UgaWYgKGJwcCA9PSAxNikJLy8gUkdCIDU2NQorCQkoKHUzMiAqKSBpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnbm9dID0KKwkJICAgIChyZWQgJiAweEY4MDApIHwKKwkJICAgICgoZ3JlZW4gJiAweEZDMDApID4+IDUpIHwgKChibHVlICYgMHhGODAwKSA+PiAxMSk7CisJZWxzZSBpZiAoYnBwID09IDMyKQkvLyBBUkdCIDg4ODgKKwkJKCh1MzIgKikgaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlZ25vXSA9CisJCSAgICAoKHRyYW5zcCAmIDB4RkYwMCkgPDwgMTYpIHwKKwkJICAgICgocmVkICYgMHhGRjAwKSA8PCA4KSB8CisJCSAgICAoKGdyZWVuICYgMHhGRjAwKSkgfCAoKGJsdWUgJiAweEZGMDApID4+IDgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05MTgsNDAgKzEwOTAsNDEgQEAKIAogc3RhdGljIGludCBjeWJsYWZiX2JsYW5rKGludCBibGFua19tb2RlLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQl1bnNpZ25lZCBjaGFyIFBNQ29udCxEUE1TQ29udDsKKwl1bnNpZ25lZCBjaGFyIFBNQ29udCwgRFBNU0NvbnQ7CisKKwlLRF9HUkFQSElDU19SRVRVUk4oMCk7CiAKIAlpZiAoZGlzcGxheXR5cGUgPT0gRElTUExBWV9GUCkKIAkJcmV0dXJuIDA7CiAKLQlvdXQ4KDB4ODNDOCwweDA0KTsgCQkvLyBEUE1TIENvbnRyb2wKKwlvdXQ4KDB4ODNDOCwgMHgwNCk7CS8vIERQTVMgQ29udHJvbAogCVBNQ29udCA9IGluOCgweDgzQzYpICYgMHhGQzsKIAogCURQTVNDb250ID0gcmVhZDNDRShHUjIzKSAmIDB4RkM7CiAKLQlzd2l0Y2ggKGJsYW5rX21vZGUpCi0JewotCWNhc2UgRkJfQkxBTktfVU5CTEFOSzogICAgICAgLy8gU2NyZWVuOiBPbiwgSFN5bmM6IE9uLCBWU3luYzogT24KLQljYXNlIEZCX0JMQU5LX05PUk1BTDoJICAgICAvLyBTY3JlZW46IE9mZiwgSFN5bmM6IE9uLCBWU3luYzogT24KKwlzd2l0Y2ggKGJsYW5rX21vZGUpIHsKKwljYXNlIEZCX0JMQU5LX1VOQkxBTks6CS8vIFNjcmVlbjogT24sIEhTeW5jOiBPbiwgVlN5bmM6IE9uCisJY2FzZSBGQl9CTEFOS19OT1JNQUw6CS8vIFNjcmVlbjogT2ZmLCBIU3luYzogT24sIFZTeW5jOiBPbgogCQlQTUNvbnQgfD0gMHgwMzsKIAkJRFBNU0NvbnQgfD0gMHgwMDsKIAkJYnJlYWs7Ci0JY2FzZSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EOiAvLyBTY3JlZW46IE9mZiwgSFN5bmM6IE9mZiwgVlN5bmM6IE9uCisJY2FzZSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EOgkvLyBTY3JlZW46IE9mZiwgSFN5bmM6IE9mZiwgVlN5bmM6IE9uCiAJCVBNQ29udCB8PSAweDAyOwogCQlEUE1TQ29udCB8PSAweDAxOwogCQlicmVhazsKLQljYXNlIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ6IC8vIFNjcmVlbjogT2ZmLCBIU3luYzogT24sIFZTeW5jOiBPZmYKKwljYXNlIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ6CS8vIFNjcmVlbjogT2ZmLCBIU3luYzogT24sIFZTeW5jOiBPZmYKIAkJUE1Db250IHw9IDB4MDI7CiAJCURQTVNDb250IHw9IDB4MDI7CiAJCWJyZWFrOwotCWNhc2UgRkJfQkxBTktfUE9XRVJET1dOOiAgICAgLy8gU2NyZWVuOiBPZmYsIEhTeW5jOiBPZmYsIFZTeW5jOiBPZmYKKwljYXNlIEZCX0JMQU5LX1BPV0VSRE9XTjoJLy8gU2NyZWVuOiBPZmYsIEhTeW5jOiBPZmYsIFZTeW5jOiBPZmYKIAkJUE1Db250IHw9IDB4MDA7CiAJCURQTVNDb250IHw9IDB4MDM7CiAJCWJyZWFrOwogCX0KIAotCXdyaXRlM0NFKEdSMjMsRFBNU0NvbnQpOwotCW91dDgoMHg4M0M4LDQpOwotCW91dDgoMHg4M0M2LFBNQ29udCk7CisJd3JpdGUzQ0UoR1IyMywgRFBNU0NvbnQpOworCW91dDgoMHg4M0M4LCA0KTsKKwlvdXQ4KDB4ODNDNiwgUE1Db250KTsKIAkvLwogCS8vIGxldCBmYmNvbiBkbyBhIHNvZnRibGFuayBmb3IgdXMKIAkvLwpAQCAtOTU5LDE1ICsxMTMyLDE4IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIGN5YmxhZmJfb3BzIF9fZGV2aW5pdGRhdGEgPSB7Ci0JLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLmZiX3NldGNvbHJlZyA9IGN5YmxhZmJfc2V0Y29scmVnLAogCS5mYl9wYW5fZGlzcGxheSA9IGN5YmxhZmJfcGFuX2Rpc3BsYXksCiAJLmZiX2JsYW5rID0gY3libGFmYl9ibGFuaywKIAkuZmJfY2hlY2tfdmFyID0gY3libGFmYl9jaGVja192YXIsCiAJLmZiX3NldF9wYXIgPSBjeWJsYWZiX3NldF9wYXIsCiAJLmZiX2ZpbGxyZWN0ID0gY3libGFmYl9maWxscmVjdCwKLQkuZmJfY29weWFyZWE9IGN5YmxhZmJfY29weWFyZWEsCisJLmZiX2NvcHlhcmVhID0gY3libGFmYl9jb3B5YXJlYSwKIAkuZmJfaW1hZ2VibGl0ID0gY3libGFmYl9pbWFnZWJsaXQsCisJLmZiX3N5bmMgPSBjeWJsYWZiX3N5bmMsCisJLmZiX3Jlc3RvcmVfc3RhdGUgPSBjeWJsYWZiX3Jlc3RvcmVfc3RhdGUsCisJLmZiX3NhdmVfc3RhdGUgPSBjeWJsYWZiX3NhdmVfc3RhdGUsCiB9OwogCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC05ODYsNzQgKzExNjIsODkgQEAKIAogc3RhdGljIGludCBfX2RldmluaXQgZ2V0c3RhcnR1cG1vZGUoc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0JdTMyCWh0b3RhbCxoZGlzcGVuZCxoc3luY3N0YXJ0LGhzeW5jZW5kLGhibGFua3N0YXJ0LGhibGFua2VuZCwKLQkJdnRvdGFsLHZkaXNwZW5kLHZzeW5jc3RhcnQsdnN5bmNlbmQsdmJsYW5rc3RhcnQsdmJsYW5rZW5kLAotCQljcjAwLGNyMDEsY3IwMixjcjAzLGNyMDQsY3IwNSxjcjJiLAotCQljcjA2LGNyMDcsY3IwOSxjcjEwLGNyMTEsY3IxMixjcjE1LGNyMTYsY3IyNywKLQkJY3IzOCwKLQkJc3IwZCxzcjE4LHNyMTksCi0JCWdyMGYsCi0JCWZpLHB4Y2xrZGl2LHZjbGtkaXYsdG1wLGk7CisJdTMyIGh0b3RhbCwgaGRpc3BlbmQsIGhzeW5jc3RhcnQsIGhzeW5jZW5kLCBoYmxhbmtzdGFydCwgaGJsYW5rZW5kLAorCSAgICB2dG90YWwsIHZkaXNwZW5kLCB2c3luY3N0YXJ0LCB2c3luY2VuZCwgdmJsYW5rc3RhcnQsIHZibGFua2VuZCwKKwkgICAgY3IwMCwgY3IwMSwgY3IwMiwgY3IwMywgY3IwNCwgY3IwNSwgY3IyYiwKKwkgICAgY3IwNiwgY3IwNywgY3IwOSwgY3IxMCwgY3IxMSwgY3IxMiwgY3IxNSwgY3IxNiwgY3IyNywKKwkgICAgY3IzOCwgc3IwZCwgc3IxOCwgc3IxOSwgZ3IwZiwgZmksIHB4Y2xrZGl2LCB2Y2xrZGl2LCB0bXAsIGk7CiAKIAlzdHJ1Y3QgbW9kdXMgewotCQlpbnQgeHJlczsgaW50IHlyZXM7IGludCB2eXJlczsgaW50IGJwcDsgaW50IHB4Y2xrOwotCQlpbnQgbGVmdF9tYXJnaW47IGludCByaWdodF9tYXJnaW47IGludCB1cHBlcl9tYXJnaW47Ci0JCWludCBsb3dlcl9tYXJnaW47IGludCBoc3luY19sZW47IGludCB2c3luY19sZW47Ci0JfSAgbW9kZWRiWzVdID0gewotCQl7ICAgMCwJICAwLCA4MDAwLCAwLCAwLCAgIDAsICAwLCAgMCwgMCwgICAwLCAgMH0sCi0JCXsgNjQwLAk0ODAsIDM3NTYsIDAsIDAsIC00MCwgMjQsIDE3LCAwLCAyMTYsICAzfSwKLQkJeyA4MDAsCTYwMCwgMzIyMSwgMCwgMCwgIDk2LCAyNCwgMTQsIDAsIDEzNiwgMTF9LAotCQl7MTAyNCwJNzY4LCAyODE1LCAwLCAwLCAxNDQsIDI0LCAyOSwgMCwgMTIwLCAgM30sCi0JCXsxMjgwLCAxMDI0LCAyNjYyLCAwLCAwLCAyMzIsIDE2LCAzOSwgMCwgMTYwLCAgM30KKwkJaW50IHhyZXM7IGludCB2eHJlczsgaW50IHlyZXM7IGludCB2eXJlczsKKwkJaW50IGJwcDsgaW50IHB4Y2xrOworCQlpbnQgbGVmdF9tYXJnaW47IGludCByaWdodF9tYXJnaW47CisJCWludCB1cHBlcl9tYXJnaW47IGludCBsb3dlcl9tYXJnaW47CisJCWludCBoc3luY19sZW47IGludCB2c3luY19sZW47CisJfSBtb2RlZGJbNV0gPSB7CisJCXsKKwkJMCwgMjA0OCwgMCwgNDA5NiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sIHsKKwkJNjQwLCAyMDQ4LCA0ODAsIDQwOTYsIDAsIDAsIC00MCwgMjQsIDE3LCAwLCAyMTYsIDN9LCB7CisJCTgwMCwgMjA0OCwgNjAwLCA0MDk2LCAwLCAwLCA5NiwgMjQsIDE0LCAwLCAxMzYsIDExfSwgeworCQkxMDI0LCAyMDQ4LCA3NjgsIDQwOTYsIDAsIDAsIDE0NCwgMjQsIDI5LCAwLCAxMjAsIDN9LCB7CisJCTEyODAsIDIwNDgsIDEwMjQsIDQwOTYsIDAsIDAsIDIzMiwgMTYsIDM5LCAwLCAxNjAsIDN9CiAJfTsKIAotCW91dGIoMHgwMCwweDNkNCk7IGNyMDA9aW5iKDB4M2Q1KTsgb3V0YigweDAxLDB4M2Q0KTsgY3IwMT1pbmIoMHgzZDUpOwotCW91dGIoMHgwMiwweDNkNCk7IGNyMDI9aW5iKDB4M2Q1KTsgb3V0YigweDAzLDB4M2Q0KTsgY3IwMz1pbmIoMHgzZDUpOwotCW91dGIoMHgwNCwweDNkNCk7IGNyMDQ9aW5iKDB4M2Q1KTsgb3V0YigweDA1LDB4M2Q0KTsgY3IwNT1pbmIoMHgzZDUpOwotCW91dGIoMHgwNiwweDNkNCk7IGNyMDY9aW5iKDB4M2Q1KTsgb3V0YigweDA3LDB4M2Q0KTsgY3IwNz1pbmIoMHgzZDUpOwotCW91dGIoMHgwOSwweDNkNCk7IGNyMDk9aW5iKDB4M2Q1KTsgb3V0YigweDEwLDB4M2Q0KTsgY3IxMD1pbmIoMHgzZDUpOwotCW91dGIoMHgxMSwweDNkNCk7IGNyMTE9aW5iKDB4M2Q1KTsgb3V0YigweDEyLDB4M2Q0KTsgY3IxMj1pbmIoMHgzZDUpOwotCW91dGIoMHgxNSwweDNkNCk7IGNyMTU9aW5iKDB4M2Q1KTsgb3V0YigweDE2LDB4M2Q0KTsgY3IxNj1pbmIoMHgzZDUpOwotCW91dGIoMHgyNywweDNkNCk7IGNyMjc9aW5iKDB4M2Q1KTsgb3V0YigweDJiLDB4M2Q0KTsgY3IyYj1pbmIoMHgzZDUpOwotCW91dGIoMHgzOCwweDNkNCk7IGNyMzg9aW5iKDB4M2Q1KTsgb3V0YigweDBiLDB4M2M0KTsgaW5iKDB4M2M1KTsKLQlvdXRiKDB4MGQsMHgzYzQpOyBzcjBkPWluYigweDNjNSk7IG91dGIoMHgxOCwweDNjNCk7IHNyMTg9aW5iKDB4M2M1KTsKLQlvdXRiKDB4MTksMHgzYzQpOyBzcjE5PWluYigweDNjNSk7IG91dGIoMHgwZiwweDNjZSk7IGdyMGY9aW5iKDB4M2NmKTsKKwlvdXRiKDB4MDAsIDB4M2Q0KTsgY3IwMCA9IGluYigweDNkNSk7CisJb3V0YigweDAxLCAweDNkNCk7IGNyMDEgPSBpbmIoMHgzZDUpOworCW91dGIoMHgwMiwgMHgzZDQpOyBjcjAyID0gaW5iKDB4M2Q1KTsKKwlvdXRiKDB4MDMsIDB4M2Q0KTsgY3IwMyA9IGluYigweDNkNSk7CisJb3V0YigweDA0LCAweDNkNCk7IGNyMDQgPSBpbmIoMHgzZDUpOworCW91dGIoMHgwNSwgMHgzZDQpOyBjcjA1ID0gaW5iKDB4M2Q1KTsKKwlvdXRiKDB4MDYsIDB4M2Q0KTsgY3IwNiA9IGluYigweDNkNSk7CisJb3V0YigweDA3LCAweDNkNCk7IGNyMDcgPSBpbmIoMHgzZDUpOworCW91dGIoMHgwOSwgMHgzZDQpOyBjcjA5ID0gaW5iKDB4M2Q1KTsKKwlvdXRiKDB4MTAsIDB4M2Q0KTsgY3IxMCA9IGluYigweDNkNSk7CisJb3V0YigweDExLCAweDNkNCk7IGNyMTEgPSBpbmIoMHgzZDUpOworCW91dGIoMHgxMiwgMHgzZDQpOyBjcjEyID0gaW5iKDB4M2Q1KTsKKwlvdXRiKDB4MTUsIDB4M2Q0KTsgY3IxNSA9IGluYigweDNkNSk7CisJb3V0YigweDE2LCAweDNkNCk7IGNyMTYgPSBpbmIoMHgzZDUpOworCW91dGIoMHgyNywgMHgzZDQpOyBjcjI3ID0gaW5iKDB4M2Q1KTsKKwlvdXRiKDB4MmIsIDB4M2Q0KTsgY3IyYiA9IGluYigweDNkNSk7CisJb3V0YigweDM4LCAweDNkNCk7IGNyMzggPSBpbmIoMHgzZDUpOwogCi0JaHRvdGFsCSAgICA9IGNyMDAgfCAoY3IyYiAmIDB4MDEpIDw8IDg7Ci0JaGRpc3BlbmQgICAgPSBjcjAxIHwgKGNyMmIgJiAweDAyKSA8PCA3OworCW91dGIoMHgwYiwgMHgzYzQpOworCWluYigweDNjNSk7CisKKwlvdXRiKDB4MGQsIDB4M2M0KTsgc3IwZCA9IGluYigweDNjNSk7CisJb3V0YigweDE4LCAweDNjNCk7IHNyMTggPSBpbmIoMHgzYzUpOworCW91dGIoMHgxOSwgMHgzYzQpOyBzcjE5ID0gaW5iKDB4M2M1KTsKKwlvdXRiKDB4MGYsIDB4M2NlKTsgZ3IwZiA9IGluYigweDNjZik7CisKKwlodG90YWwgPSBjcjAwIHwgKGNyMmIgJiAweDAxKSA8PCA4OworCWhkaXNwZW5kID0gY3IwMSB8IChjcjJiICYgMHgwMikgPDwgNzsKIAloYmxhbmtzdGFydCA9IGNyMDIgfCAoY3IyYiAmIDB4MTApIDw8IDQ7Ci0JaGJsYW5rZW5kICAgPSAoY3IwMyAmIDB4MWYpIHwgKGNyMDUgJiAweDgwKSA+PiAyOwotCWhzeW5jc3RhcnQgID0gY3IwNCB8IChjcjJiICYgMHgwOCkgPDwgNTsKLQloc3luY2VuZCAgICA9IGNyMDUgJiAweDFmOworCWhibGFua2VuZCA9IChjcjAzICYgMHgxZikgfCAoY3IwNSAmIDB4ODApID4+IDI7CisJaHN5bmNzdGFydCA9IGNyMDQgfCAoY3IyYiAmIDB4MDgpIDw8IDU7CisJaHN5bmNlbmQgPSBjcjA1ICYgMHgxZjsKIAogCW1vZGVkYlswXS54cmVzID0gaGJsYW5rc3RhcnQgKiA4OwogCW1vZGVkYlswXS5oc3luY19sZW4gPSBoc3luY2VuZCAqIDg7CiAJbW9kZWRiWzBdLnJpZ2h0X21hcmdpbiA9IGhzeW5jc3RhcnQgKiA4IC0gbW9kZWRiWzBdLnhyZXM7CiAJbW9kZWRiWzBdLmxlZnRfbWFyZ2luID0gKGh0b3RhbCArIDUpICogOCAtIG1vZGVkYlswXS54cmVzIC0KLQkJbW9kZWRiWzBdLnJpZ2h0X21hcmdpbiAtIG1vZGVkYlswXS5oc3luY19sZW47CisJICAgIG1vZGVkYlswXS5yaWdodF9tYXJnaW4gLSBtb2RlZGJbMF0uaHN5bmNfbGVuOwogCi0JdnRvdGFsCSAgICA9IGNyMDYgfCAoY3IwNyAmIDB4MDEpIDw8IDggfCAoY3IwNyAmIDB4MjApIDw8IDQKLQkJCSAgIHwgKGNyMjcgJiAweDgwKSA8PCAzOwotCXZkaXNwZW5kICAgID0gY3IxMiB8IChjcjA3ICYgMHgwMikgPDwgNyB8IChjcjA3ICYgMHg0MCkgPDwgMwotCQkJICAgfCAoY3IyNyAmIDB4MTApIDw8IDY7Ci0JdnN5bmNzdGFydCAgPSBjcjEwIHwgKGNyMDcgJiAweDA0KSA8PCA2IHwgKGNyMDcgJiAweDgwKSA8PCAyCi0JCQkgICB8IChjcjI3ICYgMHgyMCkgPDwgNTsKLQl2c3luY2VuZCAgICA9IGNyMTEgJiAweDBmOworCXZ0b3RhbCA9IGNyMDYgfCAoY3IwNyAmIDB4MDEpIDw8IDggfCAoY3IwNyAmIDB4MjApIDw8IDQKKwkgICAgfCAoY3IyNyAmIDB4ODApIDw8IDM7CisJdmRpc3BlbmQgPSBjcjEyIHwgKGNyMDcgJiAweDAyKSA8PCA3IHwgKGNyMDcgJiAweDQwKSA8PCAzCisJICAgIHwgKGNyMjcgJiAweDEwKSA8PCA2OworCXZzeW5jc3RhcnQgPSBjcjEwIHwgKGNyMDcgJiAweDA0KSA8PCA2IHwgKGNyMDcgJiAweDgwKSA8PCAyCisJICAgIHwgKGNyMjcgJiAweDIwKSA8PCA1OworCXZzeW5jZW5kID0gY3IxMSAmIDB4MGY7CiAJdmJsYW5rc3RhcnQgPSBjcjE1IHwgKGNyMDcgJiAweDA4KSA8PCA1IHwgKGNyMDkgJiAweDIwKSA8PCA0Ci0JCQkgICB8IChjcjI3ICYgMHg0MCkgPDwgNDsKLQl2YmxhbmtlbmQgICA9IGNyMTY7CisJICAgIHwgKGNyMjcgJiAweDQwKSA8PCA0OworCXZibGFua2VuZCA9IGNyMTY7CiAKLQltb2RlZGJbMF0ueXJlcwkgICAgICAgPSB2ZGlzcGVuZCArIDE7Ci0JbW9kZWRiWzBdLnZzeW5jX2xlbiAgICA9IHZzeW5jZW5kOworCW1vZGVkYlswXS55cmVzID0gdmRpc3BlbmQgKyAxOworCW1vZGVkYlswXS52c3luY19sZW4gPSB2c3luY2VuZDsKIAltb2RlZGJbMF0ubG93ZXJfbWFyZ2luID0gdnN5bmNzdGFydCAtIG1vZGVkYlswXS55cmVzOwogCW1vZGVkYlswXS51cHBlcl9tYXJnaW4gPSB2dG90YWwgLSBtb2RlZGJbMF0ueXJlcyAtCi0JCW1vZGVkYlswXS5sb3dlcl9tYXJnaW4gLSBtb2RlZGJbMF0udnN5bmNfbGVuICsgMjsKKwkgICAgbW9kZWRiWzBdLmxvd2VyX21hcmdpbiAtIG1vZGVkYlswXS52c3luY19sZW4gKyAyOwogCiAJdG1wID0gY3IzOCAmIDB4M2M7CiAJbW9kZWRiWzBdLmJwcCA9IHRtcCA9PSAwID8gOCA6IHRtcCA9PSA0ID8gMTYgOiB0bXAgPT0gMjggPyAyNCA6Ci0JCQl0bXAgPT0gOCA/IDMyIDogODsKKwkgICAgdG1wID09IDggPyAzMiA6IDg7CiAKLQlmaSA9ICgoNTg2NDcyNyooc3IxOCs4KSkvKCgoc3IxOSYweDNmKSsyKSooMTw8KChzcjE5JjB4YzApPj42KSkpKT4+MTI7CisJZmkgPSAoKDU4NjQ3MjcgKiAoc3IxOCArIDgpKSAvCisJICAgICAgKCgoc3IxOSAmIDB4M2YpICsgMikgKiAoMSA8PCAoKHNyMTkgJiAweGMwKSA+PiA2KSkpKSA+PiAxMjsKIAlweGNsa2RpdiA9ICgoZ3IwZiAmIDB4MDgpID4+IDMgfCAoZ3IwZiAmIDB4NDApID4+IDUpICsgMTsKIAl0bXAgPSBzcjBkICYgMHgwNjsKIAl2Y2xrZGl2ID0gdG1wID09IDAgPyAyIDogdG1wID09IDIgPyA0IDogdG1wID09IDQgPyA4IDogMzsgLy8gKiAyICEKQEAgLTEwNjIsMTAgKzEyNTMsMTAgQEAKIAlpZiAodmVyYm9zaXR5ID4gMCkKIAkJb3V0cHV0KCJkZXRlY3RlZCBzdGFydHVwIG1vZGU6ICIKIAkJICAgICAgICJmYnNldCAtZyAlZCAlZCAlZCA/Pz8gJWQgLXQgJWQgJWQgJWQgJWQgJWQgJWQgJWRcbiIsCi0JCSAgICAgICBtb2RlZGJbMF0ueHJlcyxtb2RlZGJbMF0ueXJlcyxtb2RlZGJbMF0ueHJlcywKLQkJICAgICAgIG1vZGVkYlswXS5icHAsbW9kZWRiWzBdLnB4Y2xrLG1vZGVkYlswXS5sZWZ0X21hcmdpbiwKLQkJICAgICAgIG1vZGVkYlswXS5yaWdodF9tYXJnaW4sbW9kZWRiWzBdLnVwcGVyX21hcmdpbiwKLQkJICAgICAgIG1vZGVkYlswXS5sb3dlcl9tYXJnaW4sbW9kZWRiWzBdLmhzeW5jX2xlbiwKKwkJICAgICAgIG1vZGVkYlswXS54cmVzLCBtb2RlZGJbMF0ueXJlcywgbW9kZWRiWzBdLnhyZXMsCisJCSAgICAgICBtb2RlZGJbMF0uYnBwLCBtb2RlZGJbMF0ucHhjbGssIG1vZGVkYlswXS5sZWZ0X21hcmdpbiwKKwkJICAgICAgIG1vZGVkYlswXS5yaWdodF9tYXJnaW4sIG1vZGVkYlswXS51cHBlcl9tYXJnaW4sCisJCSAgICAgICBtb2RlZGJbMF0ubG93ZXJfbWFyZ2luLCBtb2RlZGJbMF0uaHN5bmNfbGVuLAogCQkgICAgICAgbW9kZWRiWzBdLnZzeW5jX2xlbik7CiAKIAkvLwpAQCAtMTA3MywzNiArMTI2NCwzOSBAQAogCS8vIGRvIG5vdCB3YW50IHRvIGRvIGl0IGluIGFub3RoZXIgd2F5IQogCS8vCiAKLQl0cnlhZ2FpbjoKKyAgICAgIHRyeWFnYWluOgogCiAJaSA9IChtb2RlID09IE5VTEwpID8gMCA6Ci0JICAgICFzdHJuY21wKG1vZGUsIjY0MHg0ODAiLDcpID8gMSA6Ci0JICAgICFzdHJuY21wKG1vZGUsIjgwMHg2MDAiLDcpID8gMiA6Ci0JICAgICFzdHJuY21wKG1vZGUsIjEwMjR4NzY4Iiw4KSA/IDMgOgotCSAgICAhc3RybmNtcChtb2RlLCIxMjgweDEwMjQiLDkpID8gNCA6IDA7CisJICAgICFzdHJuY21wKG1vZGUsICI2NDB4NDgwIiwgNykgPyAxIDoKKwkgICAgIXN0cm5jbXAobW9kZSwgIjgwMHg2MDAiLCA3KSA/IDIgOgorCSAgICAhc3RybmNtcChtb2RlLCAiMTAyNHg3NjgiLCA4KSA/IDMgOgorCSAgICAhc3RybmNtcChtb2RlLCAiMTI4MHgxMDI0IiwgOSkgPyA0IDogMDsKIAogCXJlZiA9IChyZWYgPCA1MCkgPyA1MCA6IChyZWYgPiA4NSkgPyA4NSA6IHJlZjsKIAotCWlmKGk9PTApIHsKKwlpZiAoaSA9PSAwKSB7CiAJCWluZm8tPnZhci5waXhjbG9jayA9IG1vZGVkYltpXS5weGNsazsKIAkJaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID0gbW9kZWRiW2ldLmJwcDsKIAl9IGVsc2UgewogCQlpbmZvLT52YXIucGl4Y2xvY2sgPSAoMTAwMDAwMDAwIC8KLQkJCSgobW9kZWRiW2ldLmxlZnRfbWFyZ2luICsgbW9kZWRiW2ldLnhyZXMgKwotCQkJICBtb2RlZGJbaV0ucmlnaHRfbWFyZ2luICsgbW9kZWRiW2ldLmhzeW5jX2xlbgotCQkJICkgKiAoCi0JCQkgIG1vZGVkYltpXS51cHBlcl9tYXJnaW4gKyBtb2RlZGJbaV0ueXJlcyArCi0JCQkgIG1vZGVkYltpXS5sb3dlcl9tYXJnaW4gKyBtb2RlZGJbaV0udnN5bmNfbGVuCi0JCQkgKSAqCi0JCQkgIHJlZiAvIDEwMDAwCi0JCQkpKTsKKwkJCQkgICAgICAoKG1vZGVkYltpXS5sZWZ0X21hcmdpbiArCisJCQkJCW1vZGVkYltpXS54cmVzICsKKwkJCQkJbW9kZWRiW2ldLnJpZ2h0X21hcmdpbiArCisJCQkJCW1vZGVkYltpXS5oc3luY19sZW4pICoKKwkJCQkgICAgICAgKG1vZGVkYltpXS51cHBlcl9tYXJnaW4gKworCQkJCQltb2RlZGJbaV0ueXJlcyArCisJCQkJCW1vZGVkYltpXS5sb3dlcl9tYXJnaW4gKworCQkJCQltb2RlZGJbaV0udnN5bmNfbGVuKSAqIHJlZiAvIDEwMDAwKSk7CiAJCWluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA9IGJwcDsKIAl9CiAKIAlpbmZvLT52YXIubGVmdF9tYXJnaW4gPSBtb2RlZGJbaV0ubGVmdF9tYXJnaW47CiAJaW5mby0+dmFyLnJpZ2h0X21hcmdpbiA9IG1vZGVkYltpXS5yaWdodF9tYXJnaW47CiAJaW5mby0+dmFyLnhyZXMgPSBtb2RlZGJbaV0ueHJlczsKLQlpbmZvLT52YXIueHJlc192aXJ0dWFsID0gbW9kZWRiW2ldLnhyZXM7CisJaWYgKCEobW9kZWRiW2ldLnlyZXMgPT0gMTI4MCAmJiBtb2RlZGJbaV0uYnBwID09IDMyKSkKKwkJaW5mby0+dmFyLnhyZXNfdmlydHVhbCA9IG1vZGVkYltpXS52eHJlczsKKwllbHNlCisJCWluZm8tPnZhci54cmVzX3ZpcnR1YWwgPSBtb2RlZGJbaV0ueHJlczsKIAlpbmZvLT52YXIueG9mZnNldCA9IDA7CiAJaW5mby0+dmFyLmhzeW5jX2xlbiA9IG1vZGVkYltpXS5oc3luY19sZW47CiAJaW5mby0+dmFyLnVwcGVyX21hcmdpbiA9IG1vZGVkYltpXS51cHBlcl9tYXJnaW47CkBAIC0xMTE0LDMzICsxMzA4LDMyIEBACiAJaW5mby0+dmFyLnN5bmMgPSAwOwogCWluZm8tPnZhci52bW9kZSA9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQ7CiAKLQlpZihjeWJsYWZiX2NoZWNrX3ZhcigmaW5mby0+dmFyLGluZm8pKSB7Ci0JCS8vIDY0MHg0ODAtOEA3NSBzaG91bGQgcmVhbGx5IG5ldmVyIGZhaWwuIE9uZSBjYXNlIHdvdWxkCisJaWYgKGN5YmxhZmJfY2hlY2tfdmFyKCZpbmZvLT52YXIsIGluZm8pKSB7CisJCS8vIDY0MHg0ODAgLSA4QDc1IHNob3VsZCByZWFsbHkgbmV2ZXIgZmFpbC4gT25lIGNhc2Ugd291bGQKIAkJLy8gYmUgZnAgPT0gMSBhbmQgbmF0aXZleCA8IDY0MCAuLi4gZ2l2ZSB1cCB0aGVuCi0JCWlmKGk9PTEgJiYgYnBwID09IDggJiYgcmVmID09IDc1KXsKKwkJaWYgKGkgPT0gMSAmJiBicHAgPT0gOCAmJiByZWYgPT0gNzUpIHsKIAkJCW91dHB1dCgiQ2FuJ3QgZmluZCBhIHZhbGlkIG1vZGUgOi0oXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCS8vIE91ciBkZXRlY3RlZCBtb2RlIGlzIHVubGlrZWx5IHRvIGZhaWwuIElmIGl0IGRvZXMsCi0JCS8vIHRyeSA2NDB4NDgwLThANzUgLi4uCi0JCWlmKGk9PTApIHsKLQkJCW1vZGU9IjY0MHg0ODAiOwotCQkJYnBwPTg7Ci0JCQlyZWY9NzU7CisJCS8vIHRyeSA2NDB4NDgwIC0gOEA3NSAuLi4KKwkJaWYgKGkgPT0gMCkgeworCQkJbW9kZSA9ICI2NDB4NDgwIjsKKwkJCWJwcCA9IDg7CisJCQlyZWYgPSA3NTsKIAkJCW91dHB1dCgiRGV0ZWN0ZWQgbW9kZSBmYWlsZWQgY2hlY2tfdmFyISAiCi0JCQkgICAgICAgIlRyeWluZyA2NDB4NDgwLThANzVcbiIpOworCQkJICAgICAgICJUcnlpbmcgNjQweDQ4MCAtIDhANzVcbiIpOwogCQkJZ290byB0cnlhZ2FpbjsKIAkJfQogCQkvLyBBIHNwZWNpZmllZCB2aWRlbyBtb2RlIGZhaWxlZCBmb3Igc29tZSByZWFzb24uCiAJCS8vIFRyeSB0aGUgc3RhcnR1cCBtb2RlIGZpcnN0CiAJCW91dHB1dCgiU3BlY2lmaWVkIG1vZGUgJyVzJyBmYWlsZWQgY2hlY2shICIKLQkJCSJGYWxsaW5nIGJhY2sgdG8gc3RhcnR1cCBtb2RlLlxuIixtb2RlKTsKLQkJbW9kZT1OVUxMOworCQkgICAgICAgIkZhbGxpbmcgYmFjayB0byBzdGFydHVwIG1vZGUuXG4iLCBtb2RlKTsKKwkJbW9kZSA9IE5VTEw7CiAJCWdvdG8gdHJ5YWdhaW47CiAJfQogCiAJcmV0dXJuIDA7Ci0KIH0KIAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTE2MCwyMSArMTM1MywyOCBAQAogCWVsc2UgewogCQl0bXAgPSByZWFkM1g0KENSMUYpICYgMHgwRjsKIAkJc3dpdGNoICh0bXApIHsKLQkJCWNhc2UgMHgwMzogayA9IDEgKiBNYjsgYnJlYWs7Ci0JCQljYXNlIDB4MDc6IGsgPSAyICogTWI7IGJyZWFrOwotCQkJY2FzZSAweDBGOiBrID0gNCAqIE1iOyBicmVhazsKLQkJCWNhc2UgMHgwNDogayA9IDggKiBNYjsgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWsgPSAxICogTWI7Ci0JCQkJb3V0cHV0KCJVbmtub3duIG1lbW9yeSBzaXplIGNvZGUgJXggaW4gQ1IxRi4iCi0JCQkJICAgICAgICIgV2UgZGVmYXVsdCB0byAxIE1iIGZvciBub3csIHBsZWFzZSIKLQkJCQkgICAgICAgIiBkbyBwcm92aWRlIGEgbWVtc2l6ZSBwYXJhbWV0ZXIhXG4iLAotCQkJCSAgICAgICB0bXApOworCQljYXNlIDB4MDM6CisJCQlrID0gMSAqIDEwMjQgKiAxMDI0OworCQkJYnJlYWs7CisJCWNhc2UgMHgwNzoKKwkJCWsgPSAyICogMTAyNCAqIDEwMjQ7CisJCQlicmVhazsKKwkJY2FzZSAweDBGOgorCQkJayA9IDQgKiAxMDI0ICogMTAyNDsKKwkJCWJyZWFrOworCQljYXNlIDB4MDQ6CisJCQlrID0gOCAqIDEwMjQgKiAxMDI0OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlrID0gMSAqIDEwMjQgKiAxMDI0OworCQkJb3V0cHV0KCJVbmtub3duIG1lbW9yeSBzaXplIGNvZGUgJXggaW4gQ1IxRi4iCisJCQkgICAgICAgIiBXZSBkZWZhdWx0IHRvIDEgTWIgZm9yIG5vdywgcGxlYXNlIgorCQkJICAgICAgICIgZG8gcHJvdmlkZSBhIG1lbXNpemUgcGFyYW1ldGVyIVxuIiwgdG1wKTsKIAkJfQogCX0KIAogCWlmICh2ZXJib3NpdHkgPiAwKQotCQlvdXRwdXQoImZyYW1lYnVmZmVyIHNpemUgPSAlZCBLYlxuIixrL0tiKTsKKwkJb3V0cHV0KCJmcmFtZWJ1ZmZlciBzaXplID0gJWQgS2JcbiIsIGsgLyBLYik7CiAJcmV0dXJuIGs7CiB9CiAKQEAgLTExOTIsNyArMTM5Miw3IEBACiAJCXJldHVybiBESVNQTEFZX0ZQOwogCWlmIChjcnQpCiAJCXJldHVybiBESVNQTEFZX0NSVDsKLQlyZXR1cm4gKHJlYWQzQ0UoR1IzMykgJiAweDEwKT9ESVNQTEFZX0ZQOkRJU1BMQVlfQ1JUOworCXJldHVybiAocmVhZDNDRShHUjMzKSAmIDB4MTApID8gRElTUExBWV9GUCA6IERJU1BMQVlfQ1JUOwogfQogCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTEyMDMsNyArMTQwMyw3IEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGdldF9uYXRpdmV4KHZvaWQpCiB7Ci0JaW50IHgseSx0bXA7CisJaW50IHgsIHksIHRtcDsKIAogCWlmIChuYXRpdmV4KQogCQlyZXR1cm4gbmF0aXZleDsKQEAgLTEyMTEsMjkgKzE0MTEsNDUgQEAKIAl0bXAgPSAocmVhZDNDRShHUjUyKSA+PiA0KSAmIDM7CiAKIAlzd2l0Y2ggKHRtcCkgewotCQljYXNlIDA6ICB4ID0gMTI4MDsgeSA9IDEwMjQ7IGJyZWFrOwotCQljYXNlIDI6ICB4ID0gMTAyNDsgeSA9IDc2ODsgIGJyZWFrOwotCQljYXNlIDM6ICB4ID0gODAwOyAgeSA9IDYwMDsgIGJyZWFrOwotCQljYXNlIDQ6ICB4ID0gMTQwMDsgeSA9IDEwNTA7IGJyZWFrOwotCQljYXNlIDE6Ci0JCWRlZmF1bHQ6IHggPSA2NDA7ICB5ID0gNDgwOyAgYnJlYWs7CisJY2FzZSAwOiB4ID0gMTI4MDsgeSA9IDEwMjQ7CisJCWJyZWFrOworCWNhc2UgMjogeCA9IDEwMjQ7IHkgPSA3Njg7CisJCWJyZWFrOworCWNhc2UgMzogeCA9IDgwMDsgIHkgPSA2MDA7CisJCWJyZWFrOworCWNhc2UgNDogeCA9IDE0MDA7IHkgPSAxMDUwOworCQlicmVhazsKKwljYXNlIDE6CisJZGVmYXVsdDoKKwkJeCA9IDY0MDsgeSA9IDQ4MDsKKwkJYnJlYWs7CiAJfQogCiAJaWYgKHZlcmJvc2l0eSA+IDApCi0JCW91dHB1dCgiJWR4JWQgZmxhdCBwYW5lbCBmb3VuZFxuIix4LHkpOworCQlvdXRwdXQoIiVkeCVkIGZsYXQgcGFuZWwgZm91bmRcbiIsIHgsIHkpOwogCXJldHVybiB4OwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBjeWJsYV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKiBkZXYsCi0JCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqIGlkKQorc3RhdGljIGludCBfX2RldmluaXQgY3libGFfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm87CiAJc3RydWN0IGN5YmxhZmJfcGFyICpwYXI7CiAKLQlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBjeWJsYWZiX3BhciksJmRldi0+ZGV2KTsKLQorCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGN5YmxhZmJfcGFyKSwgJmRldi0+ZGV2KTsKIAlpZiAoIWluZm8pCi0JCWdvdG8gZXJyb3V0X2FsbG9jOworCQlnb3RvIGVycm91dF9hbGxvY19pbmZvOworCisJaW5mby0+cGl4bWFwLmFkZHIgPSBremFsbG9jKENZQkxBRkJfUElYTUFQU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvLT5waXhtYXAuYWRkcikgeworCQlvdXRwdXQoImFsbG9jYXRpb24gb2YgcGl4bWFwIGJ1ZmZlciBmYWlsZWQhXG4iKTsKKwkJZ290byBlcnJvdXRfYWxsb2NfcGl4bWFwOworCX0KKwlpbmZvLT5waXhtYXAuc2l6ZSA9IENZQkxBRkJfUElYTUFQU0laRSAtIDQ7CisJaW5mby0+cGl4bWFwLmJ1Zl9hbGlnbiA9IDQ7CisJaW5mby0+cGl4bWFwLmFjY2Vzc19hbGlnbiA9IDMyOworCWluZm8tPnBpeG1hcC5mbGFncyA9IEZCX1BJWE1BUF9TWVNURU07CisJaW5mby0+cGl4bWFwLnNjYW5fYWxpZ24gPSA0OwogCiAJcGFyID0gaW5mby0+cGFyOwogCXBhci0+b3BzID0gY3libGFmYl9vcHM7CkBAIC0xMjQ2LDI2ICsxNDYyLDMxIEBACiAJCW91dHB1dCgiY291bGQgbm90IGVuYWJsZSBkZXZpY2UhXG4iKTsKIAkJZ290byBlcnJvdXRfZW5hYmxlOwogCX0KLQogCS8vIG1pZ2h0IGFscmVhZHkgYmUgcmVxdWVzdGVkIGJ5IHZnYSBjb25zb2xlIG9yIHZlc2FmYiwKIAkvLyBzbyB3ZSBkbyBjYXJlIGFib3V0IHN1Y2Nlc3MKLQlyZXF1ZXN0X3JlZ2lvbigweDNjMCwzMiwiY3libGFmYiIpOworCWlmICghcmVxdWVzdF9yZWdpb24oMHgzYzAsIDB4MjAsICJjeWJsYWZiIikpIHsKKwkJb3V0cHV0KCJyZWdpb24gMHgzYzAvMHgyMCBhbHJlYWR5IHJlc2VydmVkXG4iKTsKKwkJdmVzYWZiIHw9IDE7CiAKKwl9CiAJLy8KIAkvLyBHcmFwaGljcyBFbmdpbmUgUmVnaXN0ZXJzCiAJLy8KLQlyZXF1ZXN0X3JlZ2lvbihHRUJhc2UsMHgxMDAsImN5YmxhZmIiKTsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKEdFQmFzZSwgMHgxMDAsICJjeWJsYWZiIikpIHsKKwkJb3V0cHV0KCJyZWdpb24gJSN4LzB4MTAwIGFscmVhZHkgcmVzZXJ2ZWRcbiIsIEdFQmFzZSk7CisJCXZlc2FmYiB8PSAyOworCX0KIAogCXJlZ2R1bXAocGFyKTsKIAogCWVuYWJsZV9tbWlvKCk7CiAKIAkvLyBzZXR1cCBNTUlPIHJlZ2lvbgotCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwxKTsKKwlpbmZvLT5maXgubW1pb19zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDEpOwogCWluZm8tPmZpeC5tbWlvX2xlbiA9IDB4MjAwMDA7CiAKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihpbmZvLT5maXgubW1pb19zdGFydCwKLQkJCQlpbmZvLT5maXgubW1pb19sZW4sImN5YmxhZmIiKSkgeworCQkJCWluZm8tPmZpeC5tbWlvX2xlbiwgImN5YmxhZmIiKSkgewogCQlvdXRwdXQoInJlcXVlc3RfbWVtX3JlZ2lvbiBmYWlsZWQgZm9yIG1taW8gcmVnaW9uIVxuIik7CiAJCWdvdG8gZXJyb3V0X21taW9fcmVxbWVtOwogCX0KQEAgLTEyNzYsMTggKzE0OTcsMTcgQEAKIAkJb3V0cHV0KCJpb3JlbWFwIGZhaWxlZCBmb3IgbW1pbyByZWdpb25cbiIpOwogCQlnb3RvIGVycm91dF9tbWlvX3JlbWFwOwogCX0KLQogCS8vIHNldHVwIGZyYW1lYnVmZmVyIG1lbW9yeSAuLi4gbWlnaHQgYWxyZWFkeSBiZSByZXF1ZXN0ZWQKIAkvLyBieSB2ZXNhZmIuIE5vdCB0byBmYWlsIGluIGNhc2Ugb2YgYW4gdW5zdWNjZXNzZnVsIHJlcXVlc3QKLQkvLyBpcyB1c2VmdWwgZm9yIHRoZSBkZXZlbG9wbWVudCBjeWNsZQotCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwwKTsKKwkvLyBpcyB1c2VmdWwgaWYgYm90aCBhcmUgbG9hZGVkLgorCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCk7CiAJaW5mby0+Zml4LnNtZW1fbGVuID0gZ2V0X21lbXNpemUoKTsKIAogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGluZm8tPmZpeC5zbWVtX3N0YXJ0LAotCQkJCWluZm8tPmZpeC5zbWVtX2xlbiwiY3libGFmYiIpKSB7Ci0JCW91dHB1dCgicmVxdWVzdF9tZW1fcmVnaW9uIGZhaWxlZCBmb3Igc21lbSByZWdpb24hXG4iKTsKLQkJaWYgKCF2ZXNhZmIpCi0JCQlnb3RvIGVycm91dF9zbWVtX3JlcTsKKwkJCQlpbmZvLT5maXguc21lbV9sZW4sICJjeWJsYWZiIikpIHsKKwkJb3V0cHV0KCJyZWdpb24gJSNseC8lI3ggYWxyZWFkeSByZXNlcnZlZFxuIiwKKwkJICAgICAgIGluZm8tPmZpeC5zbWVtX3N0YXJ0LCBpbmZvLT5maXguc21lbV9sZW4pOworCQl2ZXNhZmIgfD0gNDsKIAl9CiAKIAlpbmZvLT5zY3JlZW5fYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShpbmZvLT5maXguc21lbV9zdGFydCwKQEAgLTEzMDAsMzEgKzE1MjAsMzAgQEAKIAogCWRpc3BsYXl0eXBlID0gZ2V0X2Rpc3BsYXl0eXBlKCk7CiAKLQlpZihkaXNwbGF5dHlwZSA9PSBESVNQTEFZX0ZQKQorCWlmIChkaXNwbGF5dHlwZSA9PSBESVNQTEFZX0ZQKQogCQluYXRpdmV4ID0gZ2V0X25hdGl2ZXgoKTsKIAotCS8vCi0JLy8gRkJJTkZPX0hXQUNDRUxfWVdSQVAgICAgLi4uLiBkb2VzIG5vdCB3b3JrIChjb3VsZCBiZSBtYWRlIHRvIHdvcms/KQotCS8vIEZCSU5GT19QQVJUSUFMX1BBTl9PSyAgIC4uLi4gaXMgbm90IG9rCi0JLy8gRkJJTkZPX1JFQURTX0ZBU1QJICAgLi4uLiBpcyBuZWNlc3NhcnkgZm9yIG9wdGltYWwgc2Nyb2xsaW5nCi0JLy8KLQlpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUIHwgRkJJTkZPX0hXQUNDRUxfWVBBTgotCQkgICAgICB8IEZCSU5GT19IV0FDQ0VMX0NPUFlBUkVBIHwgRkJJTkZPX0hXQUNDRUxfRklMTFJFQ1QKLQkJICAgICAgfCBGQklORk9fSFdBQ0NFTF9JTUFHRUJMSVQgfCBGQklORk9fUkVBRFNfRkFTVDsKKwlpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUCisJCSAgICB8IEZCSU5GT19IV0FDQ0VMX0NPUFlBUkVBCisJCSAgICB8IEZCSU5GT19IV0FDQ0VMX0ZJTExSRUNUCisJCSAgICB8IEZCSU5GT19IV0FDQ0VMX0lNQUdFQkxJVAorCQkgICAgfCBGQklORk9fUkVBRFNfRkFTVAorLy8JCSAgICB8IEZCSU5GT19QQVJUSUFMX1BBTl9PSworCQkgICAgfCBGQklORk9fTUlTQ19BTFdBWVNfU0VUUEFSOwogCiAJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBwYXItPnBzZXVkb19wYWw7CiAKLQlpZihnZXRzdGFydHVwbW9kZShpbmZvKSkKKwlpZiAoZ2V0c3RhcnR1cG1vZGUoaW5mbykpCiAJCWdvdG8gZXJyb3V0X2ZpbmRtb2RlOwogCi0JZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwyNTYsMCk7CisJZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMjU2LCAwKTsKIAogCWlmIChyZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKSkgewogCQlvdXRwdXQoIkNvdWxkIG5vdCByZWdpc3RlciBDeUJsYSBmcmFtZWJ1ZmZlclxuIik7CiAJCWdvdG8gZXJyb3V0X3JlZ2lzdGVyOwogCX0KIAotCXBjaV9zZXRfZHJ2ZGF0YShkZXYsaW5mbyk7CisJcGNpX3NldF9kcnZkYXRhKGRldiwgaW5mbyk7CiAKIAkvLwogCS8vIG5vcm1hbCBleGl0IGFuZCBlcnJvciBwYXRocwpAQCAtMTMzMiwyMyArMTU1MSwyNCBAQAogCiAJcmV0dXJuIDA7CiAKLSBlcnJvdXRfcmVnaXN0ZXI6Ci0gZXJyb3V0X2ZpbmRtb2RlOgorICAgICAgZXJyb3V0X3JlZ2lzdGVyOgorICAgICAgZXJyb3V0X2ZpbmRtb2RlOgogCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOwotIGVycm91dF9zbWVtX3JlbWFwOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihpbmZvLT5maXguc21lbV9zdGFydCwKLQkJCSAgIGluZm8tPmZpeC5zbWVtX2xlbik7Ci0gZXJyb3V0X3NtZW1fcmVxOgorICAgICAgZXJyb3V0X3NtZW1fcmVtYXA6CisJaWYgKCEodmVzYWZiICYgNCkpCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihpbmZvLT5maXguc21lbV9zdGFydCwgaW5mby0+Zml4LnNtZW1fbGVuKTsKIAlpb3VubWFwKGlvX3ZpcnQpOwotIGVycm91dF9tbWlvX3JlbWFwOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihpbmZvLT5maXgubW1pb19zdGFydCwKLQkJCSAgIGluZm8tPmZpeC5tbWlvX2xlbik7Ci0gZXJyb3V0X21taW9fcmVxbWVtOgotLy8JcmVsZWFzZV9yZWdpb24oMHgzYzAsMzIpOwotIGVycm91dF9lbmFibGU6CisgICAgICBlcnJvdXRfbW1pb19yZW1hcDoKKwlyZWxlYXNlX21lbV9yZWdpb24oaW5mby0+Zml4Lm1taW9fc3RhcnQsIGluZm8tPmZpeC5tbWlvX2xlbik7CisgICAgICBlcnJvdXRfbW1pb19yZXFtZW06CisJaWYgKCEodmVzYWZiICYgMSkpCisJCXJlbGVhc2VfcmVnaW9uKDB4M2MwLCAzMik7CisgICAgICBlcnJvdXRfZW5hYmxlOgorCWtmcmVlKGluZm8tPnBpeG1hcC5hZGRyKTsKKyAgICAgIGVycm91dF9hbGxvY19waXhtYXA6CiAJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKLSBlcnJvdXRfYWxsb2M6Ci0Jb3V0cHV0KCJDeWJsYUZCIHZlcnNpb24gJXMgYWJvcnRpbmcgaW5pdC5cbiIsVkVSU0lPTik7CisgICAgICBlcnJvdXRfYWxsb2NfaW5mbzoKKwlvdXRwdXQoIkN5YmxhRkIgdmVyc2lvbiAlcyBhYm9ydGluZyBpbml0LlxuIiwgVkVSU0lPTik7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKQEAgLTEzNTksMzUgKzE1NzksNDEgQEAKIAl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOwogCWlvdW5tYXAoaW9fdmlydCk7CiAJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKGluZm8tPmZpeC5zbWVtX3N0YXJ0LGluZm8tPmZpeC5zbWVtX2xlbik7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKGluZm8tPmZpeC5tbWlvX3N0YXJ0LGluZm8tPmZpeC5tbWlvX2xlbik7CisJaWYgKCEodmVzYWZiICYgNCkpCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihpbmZvLT5maXguc21lbV9zdGFydCwgaW5mby0+Zml4LnNtZW1fbGVuKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oaW5mby0+Zml4Lm1taW9fc3RhcnQsIGluZm8tPmZpeC5tbWlvX2xlbik7CiAJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKKwlpZiAoISh2ZXNhZmIgJiAyKSkKKwkJcmVsZWFzZV9yZWdpb24oR0VCYXNlLCAweDEwMCk7CisJaWYgKCEodmVzYWZiICYgMSkpCisJCXJlbGVhc2VfcmVnaW9uKDB4M2MwLCAzMik7CisJa2ZyZWUoaW5mby0+cGl4bWFwLmFkZHIpOwogCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7Ci0Jb3V0cHV0KCJDeWJsYUZCIHZlcnNpb24gJXMgbm9ybWFsIGV4aXQuXG4iLFZFUlNJT04pOworCW91dHB1dCgiQ3libGFGQiB2ZXJzaW9uICVzIG5vcm1hbCBleGl0LlxuIiwgVkVSU0lPTik7CiB9CiAKIC8vCiAvLyBMaXN0IG9mIGJvYXJkcyB0aGF0IHdlIGFyZSB0cnlpbmcgdG8gc3VwcG9ydAogLy8KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjeWJsYV9kZXZpY2VzW10gPSB7Ci0Je1BDSV9WRU5ET1JfSURfVFJJREVOVCxDWUJFUkJMQURFaTEsUENJX0FOWV9JRCxQQ0lfQU5ZX0lELDAsMCwwfSwKKwl7UENJX1ZFTkRPUl9JRF9UUklERU5ULCBDWUJFUkJMQURFaTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAogCXswLH0KIH07CiAKLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLGN5YmxhX2RldmljZXMpOworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGN5YmxhX2RldmljZXMpOwogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY3libGFmYl9wY2lfZHJpdmVyID0gewotCS5uYW1lCQk9ICJjeWJsYWZiIiwKLQkuaWRfdGFibGUJPSBjeWJsYV9kZXZpY2VzLAotCS5wcm9iZQkJPSBjeWJsYV9wY2lfcHJvYmUsCi0JLnJlbW92ZSAJPSBfX2RldmV4aXRfcChjeWJsYV9wY2lfcmVtb3ZlKQorCS5uYW1lID0gImN5YmxhZmIiLAorCS5pZF90YWJsZSA9IGN5YmxhX2RldmljZXMsCisJLnByb2JlID0gY3libGFfcGNpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChjeWJsYV9wY2lfcmVtb3ZlKQogfTsKIAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLwogLy8ga2VybmVsIGNvbW1hbmQgbGluZSBleGFtcGxlOgogLy8KLS8vCXZpZGVvPWN5YmxhZmI6MTI4MHgxMDI0LGJwcD0xNixyZWY9NTAgLi4uCisvLwl2aWRlbz1jeWJsYWZiOjEyODB4MTAyNCwgYnBwPTE2LCByZWY9NTAgLi4uCiAvLwogLy8gbW9kcHJvYmUgY29tbWFuZCBsaW5lIGV4YW1wbGU6CiAvLwpAQCAtMTQwMSw0NiArMTYyNyw0NiBAQAogCWNoYXIgKm9wdGlvbnMgPSBOVUxMOwogCWNoYXIgKm9wdDsKIAotCWlmIChmYl9nZXRfb3B0aW9ucygiY3libGFmYiIsJm9wdGlvbnMpKQorCWlmIChmYl9nZXRfb3B0aW9ucygiY3libGFmYiIsICZvcHRpb25zKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAob3B0aW9ucyAmJiAqb3B0aW9ucykKLQkJd2hpbGUoKG9wdCA9IHN0cnNlcCgmb3B0aW9ucywiLCIpKSAhPSBOVUxMICkgewotCQkJaWYgKCEqb3B0KSBjb250aW51ZTsKLQkJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwiYnBwPSIsNCkpCi0JCQkJYnBwID0gc2ltcGxlX3N0cnRvdWwob3B0KzQsTlVMTCwwKTsKLQkJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwicmVmPSIsNCkpCi0JCQkJcmVmID0gc2ltcGxlX3N0cnRvdWwob3B0KzQsTlVMTCwwKTsKLQkJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwiZnAiLDIpKQorCQl3aGlsZSAoKG9wdCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQkJaWYgKCEqb3B0KQorCQkJCWNvbnRpbnVlOworCQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCAiYnBwPSIsIDQpKQorCQkJCWJwcCA9IHNpbXBsZV9zdHJ0b3VsKG9wdCArIDQsIE5VTEwsIDApOworCQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCAicmVmPSIsIDQpKQorCQkJCXJlZiA9IHNpbXBsZV9zdHJ0b3VsKG9wdCArIDQsIE5VTEwsIDApOworCQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCAiZnAiLCAyKSkKIAkJCQlkaXNwbGF5dHlwZSA9IERJU1BMQVlfRlA7Ci0JCQllbHNlIGlmICghc3RybmNtcChvcHQsImNydCIsMykpCisJCQllbHNlIGlmICghc3RybmNtcChvcHQsICJjcnQiLCAzKSkKIAkJCQlkaXNwbGF5dHlwZSA9IERJU1BMQVlfQ1JUOwotCQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCJuYXRpdmV4PSIsOCkpCi0JCQkJbmF0aXZleCA9IHNpbXBsZV9zdHJ0b3VsKG9wdCs4LE5VTEwsMCk7Ci0JCQllbHNlIGlmICghc3RybmNtcChvcHQsImNlbnRlciIsNikpCisJCQllbHNlIGlmICghc3RybmNtcChvcHQsICJuYXRpdmV4PSIsIDgpKQorCQkJCW5hdGl2ZXggPSBzaW1wbGVfc3RydG91bChvcHQgKyA4LCBOVUxMLCAwKTsKKwkJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwgImNlbnRlciIsIDYpKQogCQkJCWNlbnRlciA9IDE7Ci0JCQllbHNlIGlmICghc3RybmNtcChvcHQsInN0cmV0Y2giLDcpKQorCQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCAic3RyZXRjaCIsIDcpKQogCQkJCXN0cmV0Y2ggPSAxOwotCQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCJwY2l3Yj0iLDYpKQotCQkJCXBjaXdiID0gc2ltcGxlX3N0cnRvdWwob3B0KzYsTlVMTCwwKTsKLQkJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwicGNpcmI9Iiw2KSkKLQkJCQlwY2lyYiA9IHNpbXBsZV9zdHJ0b3VsKG9wdCs2LE5VTEwsMCk7Ci0JCQllbHNlIGlmICghc3RybmNtcChvcHQsInBjaXdyPSIsNikpCi0JCQkJcGNpd3IgPSBzaW1wbGVfc3RydG91bChvcHQrNixOVUxMLDApOwotCQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCJwY2lycj0iLDYpKQotCQkJCXBjaXJyID0gc2ltcGxlX3N0cnRvdWwob3B0KzYsTlVMTCwwKTsKLQkJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwibWVtc2l6ZT0iLDgpKQotCQkJCW1lbXNpemUgPSBzaW1wbGVfc3RydG91bChvcHQrOCxOVUxMLDApOwotCQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCJ2ZXJib3NpdHk9IiwxMCkpCi0JCQkJdmVyYm9zaXR5ID0gc2ltcGxlX3N0cnRvdWwob3B0KzEwLE5VTEwsMCk7Ci0JCQllbHNlIGlmICghc3RybmNtcChvcHQsInZlc2FmYiIsNikpCi0JCQkJdmVzYWZiID0gMTsKKwkJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwgInBjaXdiPSIsIDYpKQorCQkJCXBjaXdiID0gc2ltcGxlX3N0cnRvdWwob3B0ICsgNiwgTlVMTCwgMCk7CisJCQllbHNlIGlmICghc3RybmNtcChvcHQsICJwY2lyYj0iLCA2KSkKKwkJCQlwY2lyYiA9IHNpbXBsZV9zdHJ0b3VsKG9wdCArIDYsIE5VTEwsIDApOworCQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCAicGNpd3I9IiwgNikpCisJCQkJcGNpd3IgPSBzaW1wbGVfc3RydG91bChvcHQgKyA2LCBOVUxMLCAwKTsKKwkJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwgInBjaXJyPSIsIDYpKQorCQkJCXBjaXJyID0gc2ltcGxlX3N0cnRvdWwob3B0ICsgNiwgTlVMTCwgMCk7CisJCQllbHNlIGlmICghc3RybmNtcChvcHQsICJtZW1zaXplPSIsIDgpKQorCQkJCW1lbXNpemUgPSBzaW1wbGVfc3RydG91bChvcHQgKyA4LCBOVUxMLCAwKTsKKwkJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwgInZlcmJvc2l0eT0iLCAxMCkpCisJCQkJdmVyYm9zaXR5ID0gc2ltcGxlX3N0cnRvdWwob3B0ICsgMTAsIE5VTEwsIDApOwogCQkJZWxzZQogCQkJCW1vZGUgPSBvcHQ7CiAJCX0KICNlbmRpZgotCW91dHB1dCgiQ3libGFGQiB2ZXJzaW9uICVzIGluaXRpYWxpemluZ1xuIixWRVJTSU9OKTsKKwlvdXRwdXQoIkN5YmxhRkIgdmVyc2lvbiAlcyBpbml0aWFsaXppbmdcbiIsIFZFUlNJT04pOwogCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmN5YmxhZmJfcGNpX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmN5YmxhZmJfcGNpX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjeWJsYWZiX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJjdnQuYyBiL2RyaXZlcnMvdmlkZW8vZmJjdnQuYwppbmRleCAwYjZhZjAwLi5hYzkwODgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ZiY3Z0LmMKKysrIGIvZHJpdmVycy92aWRlby9mYmN2dC5jCkBAIC0yMTQsMTIgKzIxNCwxMSBAQAogewogCXUzMiBwaXhjb3VudCwgcGl4Y291bnRfbW9kOwogCWludCBjbnQgPSAyNTUsIG9mZnNldCA9IDAsIHJlYWQgPSAwOwotCXU4ICpidWYgPSBrbWFsbG9jKDI1NiwgR0ZQX0tFUk5FTCk7CisJdTggKmJ1ZiA9IGt6YWxsb2MoMjU2LCBHRlBfS0VSTkVMKTsKIAogCWlmICghYnVmKQogCQlyZXR1cm47CiAKLQltZW1zZXQoYnVmLCAwLCAyNTYpOwogCXBpeGNvdW50ID0gKGN2dC0+eHJlcyAqIChjdnQtPnlyZXMvY3Z0LT5pbnRlcmxhY2UpKS8xMDAwMDAwOwogCXBpeGNvdW50X21vZCA9IChjdnQtPnhyZXMgKiAoY3Z0LT55cmVzL2N2dC0+aW50ZXJsYWNlKSkgJSAxMDAwMDAwOwogCXBpeGNvdW50X21vZCAvPSAxMDAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYm1lbS5jIGIvZHJpdmVycy92aWRlby9mYm1lbS5jCmluZGV4IDEwZGZkZjAuLmQyZGVkZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJtZW0uYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMKQEAgLTU4OSwxNyArNTg5LDE5IEBACiAJCXJldHVybiBpbmZvLT5mYm9wcy0+ZmJfcmVhZChmaWxlLCBidWYsIGNvdW50LCBwcG9zKTsKIAkKIAl0b3RhbF9zaXplID0gaW5mby0+c2NyZWVuX3NpemU7CisKIAlpZiAodG90YWxfc2l6ZSA9PSAwKQogCQl0b3RhbF9zaXplID0gaW5mby0+Zml4LnNtZW1fbGVuOwogCiAJaWYgKHAgPj0gdG90YWxfc2l6ZSkKLQkgICAgcmV0dXJuIDA7CisJCXJldHVybiAwOworCiAJaWYgKGNvdW50ID49IHRvdGFsX3NpemUpCi0JICAgIGNvdW50ID0gdG90YWxfc2l6ZTsKKwkJY291bnQgPSB0b3RhbF9zaXplOworCiAJaWYgKGNvdW50ICsgcCA+IHRvdGFsX3NpemUpCiAJCWNvdW50ID0gdG90YWxfc2l6ZSAtIHA7CiAKLQljbnQgPSAwOwogCWJ1ZmZlciA9IGttYWxsb2MoKGNvdW50ID4gUEFHRV9TSVpFKSA/IFBBR0VfU0laRSA6IGNvdW50LAogCQkJIEdGUF9LRVJORUwpOwogCWlmICghYnVmZmVyKQpAQCAtNjM2LDYgKzYzOCw3IEBACiAJfQogCiAJa2ZyZWUoYnVmZmVyKTsKKwogCXJldHVybiAoZXJyKSA/IGVyciA6IGNudDsKIH0KIApAQCAtNjQ4LDcgKzY1MSw3IEBACiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSByZWdpc3RlcmVkX2ZiW2ZiaWR4XTsKIAl1MzIgKmJ1ZmZlciwgKnNyYzsKIAl1MzIgX19pb21lbSAqZHN0OwotCWludCBjLCBpLCBjbnQgPSAwLCBlcnI7CisJaW50IGMsIGksIGNudCA9IDAsIGVyciA9IDA7CiAJdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplOwogCiAJaWYgKCFpbmZvIHx8ICFpbmZvLT5zY3JlZW5fYmFzZSkKQEAgLTY2MSwxOSArNjY0LDE5IEBACiAJCXJldHVybiBpbmZvLT5mYm9wcy0+ZmJfd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgcHBvcyk7CiAJCiAJdG90YWxfc2l6ZSA9IGluZm8tPnNjcmVlbl9zaXplOworCiAJaWYgKHRvdGFsX3NpemUgPT0gMCkKIAkJdG90YWxfc2l6ZSA9IGluZm8tPmZpeC5zbWVtX2xlbjsKIAogCWlmIChwID4gdG90YWxfc2l6ZSkKLQkgICAgcmV0dXJuIC1FTk9TUEM7CisJCXJldHVybiAwOworCiAJaWYgKGNvdW50ID49IHRvdGFsX3NpemUpCi0JICAgIGNvdW50ID0gdG90YWxfc2l6ZTsKLQllcnIgPSAwOwotCWlmIChjb3VudCArIHAgPiB0b3RhbF9zaXplKSB7Ci0JICAgIGNvdW50ID0gdG90YWxfc2l6ZSAtIHA7Ci0JICAgIGVyciA9IC1FTk9TUEM7Ci0JfQotCWNudCA9IDA7CisJCWNvdW50ID0gdG90YWxfc2l6ZTsKKworCWlmIChjb3VudCArIHAgPiB0b3RhbF9zaXplKQorCQljb3VudCA9IHRvdGFsX3NpemUgLSBwOworCiAJYnVmZmVyID0ga21hbGxvYygoY291bnQgPiBQQUdFX1NJWkUpID8gUEFHRV9TSVpFIDogY291bnQsCiAJCQkgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWZmZXIpCkBAIC02ODcsMTIgKzY5MCwxNSBAQAogCXdoaWxlIChjb3VudCkgewogCQljID0gKGNvdW50ID4gUEFHRV9TSVpFKSA/IFBBR0VfU0laRSA6IGNvdW50OwogCQlzcmMgPSBidWZmZXI7CisKIAkJaWYgKGNvcHlfZnJvbV91c2VyKHNyYywgYnVmLCBjKSkgewogCQkJZXJyID0gLUVGQVVMVDsKIAkJCWJyZWFrOwogCQl9CisKIAkJZm9yIChpID0gYyA+PiAyOyBpLS07ICkKIAkJCWZiX3dyaXRlbCgqc3JjKyssIGRzdCsrKTsKKwogCQlpZiAoYyAmIDMpIHsKIAkJCXU4ICpzcmM4ID0gKHU4ICopIHNyYzsKIAkJCXU4IF9faW9tZW0gKmRzdDggPSAodTggX19pb21lbSAqKSBkc3Q7CkBAIC03MDIsMTEgKzcwOCwxMyBAQAogCiAJCQlkc3QgPSAodTMyIF9faW9tZW0gKikgZHN0ODsKIAkJfQorCiAJCSpwcG9zICs9IGM7CiAJCWJ1ZiArPSBjOwogCQljbnQgKz0gYzsKIAkJY291bnQgLT0gYzsKIAl9CisKIAlrZnJlZShidWZmZXIpOwogCiAJcmV0dXJuIChlcnIpID8gZXJyIDogY250OwpAQCAtOTQ5LDcgKzk1Nyw3IEBACiAJZGVmYXVsdDoKIAkJaWYgKGZiLT5mYl9pb2N0bCA9PSBOVUxMKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiBmYi0+ZmJfaW9jdGwoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBpbmZvKTsKKwkJcmV0dXJuIGZiLT5mYl9pb2N0bChpbmZvLCBjbWQsIGFyZyk7CiAJfQogfQogCkBAIC0xMDk5LDcgKzExMDcsNyBAQAogCiAJZGVmYXVsdDoKIAkJaWYgKGZiLT5mYl9jb21wYXRfaW9jdGwpCi0JCQlyZXQgPSBmYi0+ZmJfY29tcGF0X2lvY3RsKGZpbGUsIGNtZCwgYXJnLCBpbmZvKTsKKwkJCXJldCA9IGZiLT5mYl9jb21wYXRfaW9jdGwoaW5mbywgY21kLCBhcmcpOwogCQlicmVhazsKIAl9CiAJdW5sb2NrX2tlcm5lbCgpOwpAQCAtMTEyNyw3ICsxMTM1LDcgQEAKIAlpZiAoZmItPmZiX21tYXApIHsKIAkJaW50IHJlczsKIAkJbG9ja19rZXJuZWwoKTsKLQkJcmVzID0gZmItPmZiX21tYXAoaW5mbywgZmlsZSwgdm1hKTsKKwkJcmVzID0gZmItPmZiX21tYXAoaW5mbywgdm1hKTsKIAkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gcmVzOwogCX0KQEAgLTEyMjYsNiArMTIzNCw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCWlmICghdHJ5X21vZHVsZV9nZXQoaW5mby0+ZmJvcHMtPm93bmVyKSkKIAkJcmV0dXJuIC1FTk9ERVY7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5mbzsKIAlpZiAoaW5mby0+ZmJvcHMtPmZiX29wZW4pIHsKIAkJcmVzID0gaW5mby0+ZmJvcHMtPmZiX29wZW4oaW5mbywxKTsKIAkJaWYgKHJlcykKQEAgLTEyMzcsMTEgKzEyNDYsOSBAQAogc3RhdGljIGludCAKIGZiX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JaW50IGZiaWR4ID0gaW1pbm9yKGlub2RlKTsKLQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgZmJfaW5mbyAqIGNvbnN0IGluZm8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAlsb2NrX2tlcm5lbCgpOwotCWluZm8gPSByZWdpc3RlcmVkX2ZiW2ZiaWR4XTsKIAlpZiAoaW5mby0+ZmJvcHMtPmZiX3JlbGVhc2UpCiAJCWluZm8tPmZib3BzLT5mYl9yZWxlYXNlKGluZm8sMSk7CiAJbW9kdWxlX3B1dChpbmZvLT5mYm9wcy0+b3duZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYm1vbi5jIGIvZHJpdmVycy92aWRlby9mYm1vbi5jCmluZGV4IGZjNzk2NWIuLjdjNzRlNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJtb24uYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZibW9uLmMKQEAgLTMxNywyNiArMzE3LDI5IEBACiBzdGF0aWMgdm9pZCBjYWxjX21vZGVfdGltaW5ncyhpbnQgeHJlcywgaW50IHlyZXMsIGludCByZWZyZXNoLAogCQkJICAgICAgc3RydWN0IGZiX3ZpZGVvbW9kZSAqbW9kZSkKIHsKLQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmFyOwotCXN0cnVjdCBmYl9pbmZvIGluZm87CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXI7CiAJCi0JbWVtc2V0KCZ2YXIsIDAsIHNpemVvZihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8pKTsKLQl2YXIueHJlcyA9IHhyZXM7Ci0JdmFyLnlyZXMgPSB5cmVzOwotCWZiX2dldF9tb2RlKEZCX1ZTWU5DVElNSU5HUyB8IEZCX0lHTk9SRU1PTiwgCi0JCSAgICByZWZyZXNoLCAmdmFyLCAmaW5mbyk7Ci0JbW9kZS0+eHJlcyA9IHhyZXM7Ci0JbW9kZS0+eXJlcyA9IHlyZXM7Ci0JbW9kZS0+cGl4Y2xvY2sgPSB2YXIucGl4Y2xvY2s7Ci0JbW9kZS0+cmVmcmVzaCA9IHJlZnJlc2g7Ci0JbW9kZS0+bGVmdF9tYXJnaW4gPSB2YXIubGVmdF9tYXJnaW47Ci0JbW9kZS0+cmlnaHRfbWFyZ2luID0gdmFyLnJpZ2h0X21hcmdpbjsKLQltb2RlLT51cHBlcl9tYXJnaW4gPSB2YXIudXBwZXJfbWFyZ2luOwotCW1vZGUtPmxvd2VyX21hcmdpbiA9IHZhci5sb3dlcl9tYXJnaW47Ci0JbW9kZS0+aHN5bmNfbGVuID0gdmFyLmhzeW5jX2xlbjsKLQltb2RlLT52c3luY19sZW4gPSB2YXIudnN5bmNfbGVuOwotCW1vZGUtPnZtb2RlID0gMDsKLQltb2RlLT5zeW5jID0gMDsKKwl2YXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8pLCBHRlBfS0VSTkVMKTsKKworCWlmICh2YXIpIHsKKwkJdmFyLT54cmVzID0geHJlczsKKwkJdmFyLT55cmVzID0geXJlczsKKwkJZmJfZ2V0X21vZGUoRkJfVlNZTkNUSU1JTkdTIHwgRkJfSUdOT1JFTU9OLAorCQkJICAgIHJlZnJlc2gsIHZhciwgTlVMTCk7CisJCW1vZGUtPnhyZXMgPSB4cmVzOworCQltb2RlLT55cmVzID0geXJlczsKKwkJbW9kZS0+cGl4Y2xvY2sgPSB2YXItPnBpeGNsb2NrOworCQltb2RlLT5yZWZyZXNoID0gcmVmcmVzaDsKKwkJbW9kZS0+bGVmdF9tYXJnaW4gPSB2YXItPmxlZnRfbWFyZ2luOworCQltb2RlLT5yaWdodF9tYXJnaW4gPSB2YXItPnJpZ2h0X21hcmdpbjsKKwkJbW9kZS0+dXBwZXJfbWFyZ2luID0gdmFyLT51cHBlcl9tYXJnaW47CisJCW1vZGUtPmxvd2VyX21hcmdpbiA9IHZhci0+bG93ZXJfbWFyZ2luOworCQltb2RlLT5oc3luY19sZW4gPSB2YXItPmhzeW5jX2xlbjsKKwkJbW9kZS0+dnN5bmNfbGVuID0gdmFyLT52c3luY19sZW47CisJCW1vZGUtPnZtb2RlID0gMDsKKwkJbW9kZS0+c3luYyA9IDA7CisJCWtmcmVlKHZhcik7CisJfQogfQogCiBzdGF0aWMgaW50IGdldF9lc3RfdGltaW5nKHVuc2lnbmVkIGNoYXIgKmJsb2NrLCBzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlKQpAQCAtNTI1LDEwICs1MjgsOSBAQAogCXVuc2lnbmVkIGNoYXIgKmJsb2NrOwogCWludCBudW0gPSAwLCBpOwogCi0JbW9kZSA9IGttYWxsb2MoNTAgKiBzaXplb2Yoc3RydWN0IGZiX3ZpZGVvbW9kZSksIEdGUF9LRVJORUwpOworCW1vZGUgPSBremFsbG9jKDUwICogc2l6ZW9mKHN0cnVjdCBmYl92aWRlb21vZGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAobW9kZSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQobW9kZSwgMCwgNTAgKiBzaXplb2Yoc3RydWN0IGZiX3ZpZGVvbW9kZSkpOwogCiAJaWYgKGVkaWQgPT0gTlVMTCB8fCAhZWRpZF9jaGVja3N1bShlZGlkKSB8fCAKIAkgICAgIWVkaWRfY2hlY2tfaGVhZGVyKGVkaWQpKSB7CkBAIC0xMTA1LDE1ICsxMTA3LDIxIEBACiAgKi8gCiBpbnQgZmJfZ2V0X21vZGUoaW50IGZsYWdzLCB1MzIgdmFsLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IF9fZmJfdGltaW5ncyB0aW1pbmdzOworCXN0cnVjdCBfX2ZiX3RpbWluZ3MgKnRpbWluZ3M7CiAJdTMyIGludGVybGFjZSA9IDEsIGRzY2FuID0gMTsKLQl1MzIgaGZtaW4sIGhmbWF4LCB2Zm1pbiwgdmZtYXgsIGRjbGttaW4sIGRjbGttYXg7CisJdTMyIGhmbWluLCBoZm1heCwgdmZtaW4sIHZmbWF4LCBkY2xrbWluLCBkY2xrbWF4LCBlcnIgPSAwOworCisKKwl0aW1pbmdzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IF9fZmJfdGltaW5ncyksIEdGUF9LRVJORUwpOworCisJaWYgKCF0aW1pbmdzKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIAogCSAqIElmIG1vbnNwZWNzIGFyZSBpbnZhbGlkLCB1c2UgdmFsdWVzIHRoYXQgYXJlIGVub3VnaAogCSAqIGZvciA2NDB4NDgwQDYwCiAJICovCi0JaWYgKCFpbmZvLT5tb25zcGVjcy5oZm1heCB8fCAhaW5mby0+bW9uc3BlY3MudmZtYXggfHwKKwlpZiAoIWluZm8gfHwgIWluZm8tPm1vbnNwZWNzLmhmbWF4IHx8ICFpbmZvLT5tb25zcGVjcy52Zm1heCB8fAogCSAgICAhaW5mby0+bW9uc3BlY3MuZGNsa21heCB8fAogCSAgICBpbmZvLT5tb25zcGVjcy5oZm1heCA8IGluZm8tPm1vbnNwZWNzLmhmbWluIHx8CiAJICAgIGluZm8tPm1vbnNwZWNzLnZmbWF4IDwgaW5mby0+bW9uc3BlY3MudmZtaW4gfHwKQEAgLTExMzAsNjUgKzExMzgsNjYgQEAKIAkJZGNsa21heCA9IGluZm8tPm1vbnNwZWNzLmRjbGttYXg7CiAJfQogCi0JbWVtc2V0KCZ0aW1pbmdzLCAwLCBzaXplb2Yoc3RydWN0IF9fZmJfdGltaW5ncykpOwotCXRpbWluZ3MuaGFjdGl2ZSA9IHZhci0+eHJlczsKLQl0aW1pbmdzLnZhY3RpdmUgPSB2YXItPnlyZXM7CisJdGltaW5ncy0+aGFjdGl2ZSA9IHZhci0+eHJlczsKKwl0aW1pbmdzLT52YWN0aXZlID0gdmFyLT55cmVzOwogCWlmICh2YXItPnZtb2RlICYgRkJfVk1PREVfSU5URVJMQUNFRCkgeyAKLQkJdGltaW5ncy52YWN0aXZlIC89IDI7CisJCXRpbWluZ3MtPnZhY3RpdmUgLz0gMjsKIAkJaW50ZXJsYWNlID0gMjsKIAl9CiAJaWYgKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9ET1VCTEUpIHsKLQkJdGltaW5ncy52YWN0aXZlICo9IDI7CisJCXRpbWluZ3MtPnZhY3RpdmUgKj0gMjsKIAkJZHNjYW4gPSAyOwogCX0KIAogCXN3aXRjaCAoZmxhZ3MgJiB+RkJfSUdOT1JFTU9OKSB7CiAJY2FzZSBGQl9NQVhUSU1JTkdTOiAvKiBtYXhpbWl6ZSByZWZyZXNoIHJhdGUgKi8KLQkJdGltaW5ncy5oZnJlcSA9IGhmbWF4OwotCQlmYl90aW1pbmdzX2hmcmVxKCZ0aW1pbmdzKTsKLQkJaWYgKHRpbWluZ3MudmZyZXEgPiB2Zm1heCkgewotCQkJdGltaW5ncy52ZnJlcSA9IHZmbWF4OwotCQkJZmJfdGltaW5nc192ZnJlcSgmdGltaW5ncyk7CisJCXRpbWluZ3MtPmhmcmVxID0gaGZtYXg7CisJCWZiX3RpbWluZ3NfaGZyZXEodGltaW5ncyk7CisJCWlmICh0aW1pbmdzLT52ZnJlcSA+IHZmbWF4KSB7CisJCQl0aW1pbmdzLT52ZnJlcSA9IHZmbWF4OworCQkJZmJfdGltaW5nc192ZnJlcSh0aW1pbmdzKTsKIAkJfQotCQlpZiAodGltaW5ncy5kY2xrID4gZGNsa21heCkgewotCQkJdGltaW5ncy5kY2xrID0gZGNsa21heDsKLQkJCWZiX3RpbWluZ3NfZGNsaygmdGltaW5ncyk7CisJCWlmICh0aW1pbmdzLT5kY2xrID4gZGNsa21heCkgeworCQkJdGltaW5ncy0+ZGNsayA9IGRjbGttYXg7CisJCQlmYl90aW1pbmdzX2RjbGsodGltaW5ncyk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBGQl9WU1lOQ1RJTUlOR1M6IC8qIHZyZWZyZXNoIGRyaXZlbiAqLwotCQl0aW1pbmdzLnZmcmVxID0gdmFsOwotCQlmYl90aW1pbmdzX3ZmcmVxKCZ0aW1pbmdzKTsKKwkJdGltaW5ncy0+dmZyZXEgPSB2YWw7CisJCWZiX3RpbWluZ3NfdmZyZXEodGltaW5ncyk7CiAJCWJyZWFrOwogCWNhc2UgRkJfSFNZTkNUSU1JTkdTOiAvKiBoc3luYyBkcml2ZW4gKi8KLQkJdGltaW5ncy5oZnJlcSA9IHZhbDsKLQkJZmJfdGltaW5nc19oZnJlcSgmdGltaW5ncyk7CisJCXRpbWluZ3MtPmhmcmVxID0gdmFsOworCQlmYl90aW1pbmdzX2hmcmVxKHRpbWluZ3MpOwogCQlicmVhazsKIAljYXNlIEZCX0RDTEtUSU1JTkdTOiAvKiBwaXhlbGNsb2NrIGRyaXZlbiAqLwotCQl0aW1pbmdzLmRjbGsgPSBQSUNPUzJLSFoodmFsKSAqIDEwMDA7Ci0JCWZiX3RpbWluZ3NfZGNsaygmdGltaW5ncyk7CisJCXRpbWluZ3MtPmRjbGsgPSBQSUNPUzJLSFoodmFsKSAqIDEwMDA7CisJCWZiX3RpbWluZ3NfZGNsayh0aW1pbmdzKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWVyciA9IC1FSU5WQUw7CiAJCQogCX0gCiAJCi0JaWYgKCEoZmxhZ3MgJiBGQl9JR05PUkVNT04pICYmIAotCSAgICAodGltaW5ncy52ZnJlcSA8IHZmbWluIHx8IHRpbWluZ3MudmZyZXEgPiB2Zm1heCB8fCAKLQkgICAgIHRpbWluZ3MuaGZyZXEgPCBoZm1pbiB8fCB0aW1pbmdzLmhmcmVxID4gaGZtYXggfHwKLQkgICAgIHRpbWluZ3MuZGNsayA8IGRjbGttaW4gfHwgdGltaW5ncy5kY2xrID4gZGNsa21heCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdmFyLT5waXhjbG9jayA9IEtIWjJQSUNPUyh0aW1pbmdzLmRjbGsvMTAwMCk7Ci0JdmFyLT5oc3luY19sZW4gPSAodGltaW5ncy5odG90YWwgKiA4KS8xMDA7Ci0JdmFyLT5yaWdodF9tYXJnaW4gPSAodGltaW5ncy5oYmxhbmsvMikgLSB2YXItPmhzeW5jX2xlbjsKLQl2YXItPmxlZnRfbWFyZ2luID0gdGltaW5ncy5oYmxhbmsgLSB2YXItPnJpZ2h0X21hcmdpbiAtIHZhci0+aHN5bmNfbGVuOworCWlmIChlcnIgfHwgKCEoZmxhZ3MgJiBGQl9JR05PUkVNT04pICYmCisJICAgICh0aW1pbmdzLT52ZnJlcSA8IHZmbWluIHx8IHRpbWluZ3MtPnZmcmVxID4gdmZtYXggfHwKKwkgICAgIHRpbWluZ3MtPmhmcmVxIDwgaGZtaW4gfHwgdGltaW5ncy0+aGZyZXEgPiBoZm1heCB8fAorCSAgICAgdGltaW5ncy0+ZGNsayA8IGRjbGttaW4gfHwgdGltaW5ncy0+ZGNsayA+IGRjbGttYXgpKSkgeworCQllcnIgPSAtRUlOVkFMOworCX0gZWxzZSB7CisJCXZhci0+cGl4Y2xvY2sgPSBLSFoyUElDT1ModGltaW5ncy0+ZGNsay8xMDAwKTsKKwkJdmFyLT5oc3luY19sZW4gPSAodGltaW5ncy0+aHRvdGFsICogOCkvMTAwOworCQl2YXItPnJpZ2h0X21hcmdpbiA9ICh0aW1pbmdzLT5oYmxhbmsvMikgLSB2YXItPmhzeW5jX2xlbjsKKwkJdmFyLT5sZWZ0X21hcmdpbiA9IHRpbWluZ3MtPmhibGFuayAtIHZhci0+cmlnaHRfbWFyZ2luIC0KKwkJCXZhci0+aHN5bmNfbGVuOworCQl2YXItPnZzeW5jX2xlbiA9ICgzICogaW50ZXJsYWNlKS9kc2NhbjsKKwkJdmFyLT5sb3dlcl9tYXJnaW4gPSAoMSAqIGludGVybGFjZSkvZHNjYW47CisJCXZhci0+dXBwZXJfbWFyZ2luID0gKHRpbWluZ3MtPnZibGFuayAqIGludGVybGFjZSkvZHNjYW4gLQorCQkJKHZhci0+dnN5bmNfbGVuICsgdmFyLT5sb3dlcl9tYXJnaW4pOworCX0KIAkKLQl2YXItPnZzeW5jX2xlbiA9ICgzICogaW50ZXJsYWNlKS9kc2NhbjsKLQl2YXItPmxvd2VyX21hcmdpbiA9ICgxICogaW50ZXJsYWNlKS9kc2NhbjsKLQl2YXItPnVwcGVyX21hcmdpbiA9ICh0aW1pbmdzLnZibGFuayAqIGludGVybGFjZSkvZHNjYW4gLSAKLQkJKHZhci0+dnN5bmNfbGVuICsgdmFyLT5sb3dlcl9tYXJnaW4pOwotCQotCXJldHVybiAwOworCWtmcmVlKHRpbWluZ3MpOworCXJldHVybiBlcnI7CiB9CiAjZWxzZQogaW50IGZiX3BhcnNlX2VkaWQodW5zaWduZWQgY2hhciAqZWRpZCwgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2Zic3lzZnMuYyBiL2RyaXZlcnMvdmlkZW8vZmJzeXNmcy5jCmluZGV4IDA4ZGFjOTUuLjZkMjYwNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJzeXNmcy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZmJzeXNmcy5jCkBAIC00MywxMCArNDMsMTEgQEAKIAlpZiAoc2l6ZSkKIAkJZmJfaW5mb19zaXplICs9IFBBRERJTkc7CiAKLQlwID0ga21hbGxvYyhmYl9pbmZvX3NpemUgKyBzaXplLCBHRlBfS0VSTkVMKTsKKwlwID0ga3phbGxvYyhmYl9pbmZvX3NpemUgKyBzaXplLCBHRlBfS0VSTkVMKTsKKwogCWlmICghcCkKIAkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KHAsIDAsIGZiX2luZm9fc2l6ZSArIHNpemUpOworCiAJaW5mbyA9IChzdHJ1Y3QgZmJfaW5mbyAqKSBwOwogCiAJaWYgKHNpemUpCkBAIC0xMDYsOCArMTA3LDcgQEAKIHN0YXRpYyBzc2l6ZV90IHN0b3JlX21vZGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjb25zdCBjaGFyICogYnVmLAogCQkJICBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPQotCQkoc3RydWN0IGZiX2luZm8gKiljbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKIAljaGFyIG1zdHJbMTAwXTsKIAlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmFyOwogCXN0cnVjdCBmYl9tb2RlbGlzdCAqbW9kZWxpc3Q7CkBAIC0xMzcsOCArMTM3LDcgQEAKIAogc3RhdGljIHNzaXplX3Qgc2hvd19tb2RlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQogewotCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0KLQkJKHN0cnVjdCBmYl9pbmZvICopY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CiAKIAlpZiAoIWZiX2luZm8tPm1vZGUpCiAJCXJldHVybiAwOwpAQCAtMTQ5LDggKzE0OCw3IEBACiBzdGF0aWMgc3NpemVfdCBzdG9yZV9tb2RlcyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNvbnN0IGNoYXIgKiBidWYsCiAJCQkgICBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPQotCQkoc3RydWN0IGZiX2luZm8gKiljbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKIAlMSVNUX0hFQUQob2xkX2xpc3QpOwogCWludCBpID0gY291bnQgLyBzaXplb2Yoc3RydWN0IGZiX3ZpZGVvbW9kZSk7CiAKQEAgLTE3NCw4ICsxNzIsNyBAQAogCiBzdGF0aWMgc3NpemVfdCBzaG93X21vZGVzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQogewotCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0KLQkJKHN0cnVjdCBmYl9pbmZvICopY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CiAJdW5zaWduZWQgaW50IGk7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zOwogCXN0cnVjdCBmYl9tb2RlbGlzdCAqbW9kZWxpc3Q7CkBAIC0xOTMsOCArMTkwLDcgQEAKIHN0YXRpYyBzc2l6ZV90IHN0b3JlX2JwcChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNvbnN0IGNoYXIgKiBidWYsCiAJCQkgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0KLQkJKHN0cnVjdCBmYl9pbmZvICopY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CiAJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZhcjsKIAljaGFyICoqIGxhc3QgPSBOVUxMOwogCWludCBlcnI7CkBAIC0yMDgsOCArMjA0LDcgQEAKIAogc3RhdGljIHNzaXplX3Qgc2hvd19icHAoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPQotCQkoc3RydWN0IGZiX2luZm8gKiljbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgZmJfaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKTsKIH0KIApAQCAtMjgwLDggKzI3NSw3IEBACiBzdGF0aWMgc3NpemVfdCBzdG9yZV92aXJ0dWFsKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwKIAkJCSAgICAgY29uc3QgY2hhciAqIGJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0KLQkJKHN0cnVjdCBmYl9pbmZvICopY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CiAJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZhcjsKIAljaGFyICpsYXN0ID0gTlVMTDsKIAlpbnQgZXJyOwpAQCAtMzAwLDE2ICsyOTQsMTQgQEAKIAogc3RhdGljIHNzaXplX3Qgc2hvd192aXJ0dWFsKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQogewotCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0KLQkJKHN0cnVjdCBmYl9pbmZvICopY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWQsJWRcbiIsIGZiX2luZm8tPnZhci54cmVzX3ZpcnR1YWwsCiAJCQlmYl9pbmZvLT52YXIueXJlc192aXJ0dWFsKTsKIH0KIAogc3RhdGljIHNzaXplX3Qgc2hvd19zdHJpZGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPQotCQkoc3RydWN0IGZiX2luZm8gKiljbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgZmJfaW5mby0+Zml4LmxpbmVfbGVuZ3RoKTsKIH0KIApAQCAtMzIwLDcgKzMxMiw3IEBACiBzdGF0aWMgc3NpemVfdCBzdG9yZV9jbWFwKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY29uc3QgY2hhciAqYnVmLAogCQkJICBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSAoc3RydWN0IGZiX2luZm8gKiljbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKIAlpbnQgcmMsIGksIHN0YXJ0LCBsZW5ndGgsIHRyYW5zcCA9IDA7CiAKIAlpZiAoKGNvdW50ID4gUEFHRV9TSVpFKSB8fCAoKGNvdW50ICUgMTYpICE9IDApKQpAQCAtMzgwLDggKzM3Miw3IEBACiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfY21hcChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9Ci0JCShzdHJ1Y3QgZmJfaW5mbyAqKWNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisJc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOwogCXVuc2lnbmVkIGludCBpOwogCiAJaWYgKCFmYl9pbmZvLT5jbWFwLnJlZCB8fCAhZmJfaW5mby0+Y21hcC5ibHVlIHx8CkBAIC00MDUsOCArMzk2LDcgQEAKIHN0YXRpYyBzc2l6ZV90IHN0b3JlX2JsYW5rKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY29uc3QgY2hhciAqIGJ1ZiwKIAkJCSAgIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9Ci0JCShzdHJ1Y3QgZmJfaW5mbyAqKWNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisJc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOwogCWNoYXIgKmxhc3QgPSBOVUxMOwogCWludCBlcnI7CiAKQEAgLTQyMiw0MSArNDEyLDQwIEBACiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfYmxhbmsoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCiB7Ci0vLwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IChzdHJ1Y3QgZmJfaW5mbyAqKWNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisvLwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHN0b3JlX2NvbnNvbGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLAogCQkJICAgICBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpCiB7Ci0vLwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IChzdHJ1Y3QgZmJfaW5mbyAqKWNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisvLwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfY29uc29sZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNoYXIgKmJ1ZikKIHsKLS8vCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gKHN0cnVjdCBmYl9pbmZvICopY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKy8vCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3Qgc3RvcmVfY3Vyc29yKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwKIAkJCSAgICBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpCiB7Ci0vLwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IChzdHJ1Y3QgZmJfaW5mbyAqKWNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisvLwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfY3Vyc29yKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQogewotLy8Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSAoc3RydWN0IGZiX2luZm8gKiljbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworLy8Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBzdG9yZV9wYW4oc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjb25zdCBjaGFyICogYnVmLAogCQkJIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9Ci0JCShzdHJ1Y3QgZmJfaW5mbyAqKWNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisJc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOwogCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2YXI7CiAJY2hhciAqbGFzdCA9IE5VTEw7CiAJaW50IGVycjsKQEAgLTQ3OSwxOSArNDY4LDQwIEBACiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfcGFuKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQogewotCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0KLQkJKHN0cnVjdCBmYl9pbmZvICopY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWQsJWRcbiIsIGZiX2luZm8tPnZhci54b2Zmc2V0LAogCQkJZmJfaW5mby0+dmFyLnhvZmZzZXQpOwogfQogCiBzdGF0aWMgc3NpemVfdCBzaG93X25hbWUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSAoc3RydWN0IGZiX2luZm8gKiljbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKIAogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBmYl9pbmZvLT5maXguaWQpOwogfQogCitzdGF0aWMgc3NpemVfdCBzdG9yZV9mYnN0YXRlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwl1MzIgc3RhdGU7CisJY2hhciAqbGFzdCA9IE5VTEw7CisKKwlzdGF0ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmxhc3QsIDApOworCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCWZiX3NldF9zdXNwZW5kKGZiX2luZm8sIChpbnQpc3RhdGUpOworCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19mYnN0YXRlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQoreworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgZmJfaW5mby0+c3RhdGUpOworfQorCiBzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgY2xhc3NfZGV2aWNlX2F0dHJzW10gPSB7CiAJX19BVFRSKGJpdHNfcGVyX3BpeGVsLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfYnBwLCBzdG9yZV9icHApLAogCV9fQVRUUihibGFuaywgU19JUlVHT3xTX0lXVVNSLCBzaG93X2JsYW5rLCBzdG9yZV9ibGFuayksCkBAIC01MDcsNiArNTE3LDcgQEAKIAlfX0FUVFIocm90YXRlLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfcm90YXRlLCBzdG9yZV9yb3RhdGUpLAogCV9fQVRUUihjb25fcm90YXRlLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfY29uX3JvdGF0ZSwgc3RvcmVfY29uX3JvdGF0ZSksCiAJX19BVFRSKGNvbl9yb3RhdGVfYWxsLCBTX0lXVVNSLCBOVUxMLCBzdG9yZV9jb25fcm90YXRlX2FsbCksCisJX19BVFRSKHN0YXRlLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfZmJzdGF0ZSwgc3RvcmVfZmJzdGF0ZSksCiB9OwogCiBpbnQgZmJfaW5pdF9jbGFzc19kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmZiX2luZm8pCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ZmYi5jIGIvZHJpdmVycy92aWRlby9mZmIuYwppbmRleCBjNDg3MGQ1Li45YzliMjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ZmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZmZiLmMKQEAgLTM3LDkgKzM3LDggQEAKIHN0YXRpYyB2b2lkIGZmYl9maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqLCBjb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKik7CiBzdGF0aWMgdm9pZCBmZmJfY29weWFyZWEoc3RydWN0IGZiX2luZm8gKiwgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICopOwogc3RhdGljIGludCBmZmJfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqKTsKLXN0YXRpYyBpbnQgZmZiX21tYXAoc3RydWN0IGZiX2luZm8gKiwgc3RydWN0IGZpbGUgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwotc3RhdGljIGludCBmZmJfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwKLQkJICAgICB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgZmJfaW5mbyAqKTsKK3N0YXRpYyBpbnQgZmZiX21tYXAoc3RydWN0IGZiX2luZm8gKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOworc3RhdGljIGludCBmZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKIHN0YXRpYyBpbnQgZmZiX3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqLCBzdHJ1Y3QgZmJfaW5mbyAqKTsKIAogLyoKQEAgLTgzOSw3ICs4MzgsNyBAQAogCXsgLnNpemUgPSAwIH0KIH07CiAKLXN0YXRpYyBpbnQgZmZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3N0YXRpYyBpbnQgZmZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXN0cnVjdCBmZmJfcGFyICpwYXIgPSAoc3RydWN0IGZmYl9wYXIgKilpbmZvLT5wYXI7CiAKQEAgLTg0OCw4ICs4NDcsNyBAQAogCQkJCSAgMCwgdm1hKTsKIH0KIAotc3RhdGljIGludCBmZmJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCSAgICAgdW5zaWduZWQgbG9uZyBhcmcsIHN0cnVjdCBmYl9pbmZvICppbmZvKQorc3RhdGljIGludCBmZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBmZmJfcGFyICpwYXIgPSAoc3RydWN0IGZmYl9wYXIgKikgaW5mby0+cGFyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2diZWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2diZWZiLmMKaW5kZXggZDc0NGM1MS4uMzhkMjI3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nYmVmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZ2JlZmIuYwpAQCAtOTc5LDcgKzk3OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ2JlZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZpbGUgKmZpbGUsCitzdGF0aWMgaW50IGdiZWZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sCiAJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAl1bnNpZ25lZCBsb25nIHNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CkBAIC0xMDAwLDcgKzEwMDAsNiBAQAogCQlwZ3Byb3RfZmIocGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkpOwogCiAJdm1hLT52bV9mbGFncyB8PSBWTV9JTyB8IFZNX1JFU0VSVkVEOwotCXZtYS0+dm1fZmlsZSA9IGZpbGU7CiAKIAkvKiBsb29rIGZvciB0aGUgc3RhcnRpbmcgdGlsZSAqLwogCXRpbGUgPSAmZ2JlX3RpbGVzLmNwdVtvZmZzZXQgPj4gVElMRV9TSElGVF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2dlb2RlL2d4MWZiX2NvcmUuYyBiL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ3gxZmJfY29yZS5jCmluZGV4IDhlOGRhNzQuLjIwZTY5MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ3gxZmJfY29yZS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ3gxZmJfY29yZS5jCkBAIC0yMTUsMTEgKzIxNSwxMSBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKGRldiwgMSwgImd4MWZiICh2aWRlbykiKTsKKwlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb24oZGV2LCAwLCAiZ3gxZmIgKHZpZGVvKSIpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCXBhci0+dmlkX3JlZ3MgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDEpLAotCQkJCXBjaV9yZXNvdXJjZV9sZW4oZGV2LCAxKSk7CisJcGFyLT52aWRfcmVncyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCksCisJCQkJcGNpX3Jlc291cmNlX2xlbihkZXYsIDApKTsKIAlpZiAoIXBhci0+dmlkX3JlZ3MpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0yMjksMTIgKzIyOSw5IEBACiAJaWYgKCFwYXItPmRjX3JlZ3MpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKGRldiwgMCwgImd4MWZiIChmcmFtZSBidWZmZXIpIik7Ci0JaWYgKHJldCA8IDAgKQotCQlyZXR1cm4gLUVCVVNZOwogCWlmICgoZmJfbGVuID0gZ3gxX2ZyYW1lX2J1ZmZlcl9zaXplKCkpIDwgMCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKKwlpbmZvLT5maXguc21lbV9zdGFydCA9IGd4X2Jhc2UgKyAweDgwMDAwMDsKIAlpbmZvLT5maXguc21lbV9sZW4gPSBmYl9sZW47CiAJaW5mby0+c2NyZWVuX2Jhc2UgPSBpb3JlbWFwKGluZm8tPmZpeC5zbWVtX3N0YXJ0LCBpbmZvLT5maXguc21lbV9sZW4pOwogCWlmICghaW5mby0+c2NyZWVuX2Jhc2UpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2hnYWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2hnYWZiLmMKaW5kZXggYjM3Y2VhNy4uNGUzOTAzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9oZ2FmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaGdhZmIuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS92Z2EuaD4KIApAQCAtMTA3LDcgKzEwOCw3IEBACiAKIC8qIEZyYW1lYnVmZmVyIGRyaXZlciBzdHJ1Y3R1cmVzICovCiAKLXN0YXRpYyBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gaGdhX2RlZmF1bHRfdmFyID0geworc3RhdGljIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBfX2luaXRkYXRhIGhnYV9kZWZhdWx0X3ZhciA9IHsKIAkueHJlcwkJPSA3MjAsCiAJLnlyZXMgCQk9IDM0OCwKIAkueHJlc192aXJ0dWFsIAk9IDcyMCwKQEAgLTEyMSw3ICsxMjIsNyBAQAogCS53aWR0aCAJCT0gLTEsCiB9OwogCi1zdGF0aWMgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIGhnYV9maXggPSB7CitzdGF0aWMgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIF9faW5pdGRhdGEgaGdhX2ZpeCA9IHsKIAkuaWQgCQk9ICJIR0EiLAogCS50eXBlIAkJPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFMsCS8qIChub3Qgc3VyZSkgKi8KIAkudmlzdWFsIAk9IEZCX1ZJU1VBTF9NT05PMTAsCkBAIC0xMzEsOCArMTMyLDYgQEAKIAkuYWNjZWwgCQk9IEZCX0FDQ0VMX05PTkUKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZmJfaW5mbyBmYl9pbmZvOwotCiAvKiBEb24ndCBhc3N1bWUgdGhhdCB0dHkxIHdpbGwgYmUgdGhlIGluaXRpYWwgY3VycmVudCBjb25zb2xlLiAqLwogc3RhdGljIGludCByZWxlYXNlX2lvX3BvcnQgPSAwOwogc3RhdGljIGludCByZWxlYXNlX2lvX3BvcnRzID0gMDsKQEAgLTU0OSwxMCArNTQ4LDkgQEAKIAkgKiAgSW5pdGlhbGl6YXRpb24KIAkgKi8KIAotc3RhdGljIGludCBfX2luaXQgaGdhZmJfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgaGdhZmJfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2aWNlKQogewotCWlmIChmYl9nZXRfb3B0aW9ucygiaGdhZmIiLCBOVUxMKSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJc3RydWN0IGZiX2luZm8gKmluZm87CiAKIAlpZiAoISBoZ2FfY2FyZF9kZXRlY3QoKSkgewogCQlwcmludGsoS0VSTl9JTkZPICJoZ2FmYjogSEdBIGNhcmQgbm90IGRldGVjdGVkLlxuIik7CkBAIC01NjQsNDEgKzU2Miw5NSBAQAogCXByaW50ayhLRVJOX0lORk8gImhnYWZiOiAlcyB3aXRoICVsZEsgb2YgbWVtb3J5IGRldGVjdGVkLlxuIiwKIAkJaGdhX3R5cGVfbmFtZSwgaGdhX3ZyYW1fbGVuLzEwMjQpOwogCisJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKDAsIE5VTEwpOworCWlmICghaW5mbykgeworCQlpb3VubWFwKGhnYV92cmFtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCiAJaGdhX2ZpeC5zbWVtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpaGdhX3ZyYW07CiAJaGdhX2ZpeC5zbWVtX2xlbiA9IGhnYV92cmFtX2xlbjsKIAotCWZiX2luZm8uZmxhZ3MgPSBGQklORk9fREVGQVVMVCB8IEZCSU5GT19IV0FDQ0VMX1lQQU47Ci0JZmJfaW5mby52YXIgPSBoZ2FfZGVmYXVsdF92YXI7Ci0JZmJfaW5mby5maXggPSBoZ2FfZml4OwotCWZiX2luZm8ubW9uc3BlY3MuaGZtaW4gPSAwOwotCWZiX2luZm8ubW9uc3BlY3MuaGZtYXggPSAwOwotCWZiX2luZm8ubW9uc3BlY3MudmZtaW4gPSAxMDAwMDsKLQlmYl9pbmZvLm1vbnNwZWNzLnZmbWF4ID0gMTAwMDA7Ci0JZmJfaW5mby5tb25zcGVjcy5kcG1zID0gMDsKLQlmYl9pbmZvLmZib3BzID0gJmhnYWZiX29wczsKLQlmYl9pbmZvLnNjcmVlbl9iYXNlID0gaGdhX3ZyYW07CisJaW5mby0+ZmxhZ3MgPSBGQklORk9fREVGQVVMVCB8IEZCSU5GT19IV0FDQ0VMX1lQQU47CisJaW5mby0+dmFyID0gaGdhX2RlZmF1bHRfdmFyOworCWluZm8tPmZpeCA9IGhnYV9maXg7CisJaW5mby0+bW9uc3BlY3MuaGZtaW4gPSAwOworCWluZm8tPm1vbnNwZWNzLmhmbWF4ID0gMDsKKwlpbmZvLT5tb25zcGVjcy52Zm1pbiA9IDEwMDAwOworCWluZm8tPm1vbnNwZWNzLnZmbWF4ID0gMTAwMDA7CisJaW5mby0+bW9uc3BlY3MuZHBtcyA9IDA7CisJaW5mby0+ZmJvcHMgPSAmaGdhZmJfb3BzOworCWluZm8tPnNjcmVlbl9iYXNlID0gaGdhX3ZyYW07CiAKLSAgICAgICAgaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZmYl9pbmZvKSA8IDApIHsKKyAgICAgICAgaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pIDwgMCkgeworCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogCQlpb3VubWFwKGhnYV92cmFtKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImZiJWQ6ICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2VcbiIsCi0gICAgICAgICAgICAgICBmYl9pbmZvLm5vZGUsIGZiX2luZm8uZml4LmlkKTsKKyAgICAgICAgICAgICAgIGluZm8tPm5vZGUsIGluZm8tPmZpeC5pZCk7CisJZGV2X3NldF9kcnZkYXRhKGRldmljZSwgaW5mbyk7CiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBNT0RVTEUKLXN0YXRpYyB2b2lkIF9fZXhpdCBoZ2FmYl9leGl0KHZvaWQpCitzdGF0aWMgaW50IGhnYWZiX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKKwogCWhnYV90eHRfbW9kZSgpOwogCWhnYV9jbGVhcl9zY3JlZW4oKTsKLQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZmYl9pbmZvKTsKKworCWlmIChpbmZvKSB7CisJCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CisJCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CisJfQorCiAJaW91bm1hcChoZ2FfdnJhbSk7Ci0JaWYgKHJlbGVhc2VfaW9fcG9ydHMpIHJlbGVhc2VfcmVnaW9uKDB4M2IwLCAxMik7Ci0JaWYgKHJlbGVhc2VfaW9fcG9ydCkgcmVsZWFzZV9yZWdpb24oMHgzYmYsIDEpOworCisJaWYgKHJlbGVhc2VfaW9fcG9ydHMpCisJCXJlbGVhc2VfcmVnaW9uKDB4M2IwLCAxMik7CisKKwlpZiAocmVsZWFzZV9pb19wb3J0KQorCQlyZWxlYXNlX3JlZ2lvbigweDNiZiwgMSk7CisKKwlyZXR1cm4gMDsKIH0KLSNlbmRpZgorCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgaGdhZmJfZHJpdmVyID0geworCS5uYW1lID0gImhnYWZiIiwKKwkuYnVzICA9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUgPSBoZ2FmYl9wcm9iZSwKKwkucmVtb3ZlID0gaGdhZmJfcmVtb3ZlLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaGdhZmJfZGV2aWNlID0geworCS5uYW1lID0gImhnYWZiIiwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGhnYWZiX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKGZiX2dldF9vcHRpb25zKCJoZ2FmYiIsIE5VTEwpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IGRyaXZlcl9yZWdpc3RlcigmaGdhZmJfZHJpdmVyKTsKKworCWlmICghcmV0KSB7CisJCXJldCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmaGdhZmJfZGV2aWNlKTsKKwkJaWYgKHJldCkKKwkJCWRyaXZlcl91bnJlZ2lzdGVyKCZoZ2FmYl9kcml2ZXIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBoZ2FmYl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJmhnYWZiX2RldmljZSk7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmhnYWZiX2RyaXZlcik7Cit9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqCkBAIC02MTMsNyArNjY1LDQgQEAKIG1vZHVsZV9wYXJhbShub2xvZ28sIGJvb2wsIDApOwogTU9EVUxFX1BBUk1fREVTQyhub2xvZ28sICJEaXNhYmxlcyBzdGFydHVwIGxvZ28gaWYgIT0gMCAoZGVmYXVsdD0wKSIpOwogbW9kdWxlX2luaXQoaGdhZmJfaW5pdCk7Ci0KLSNpZmRlZiBNT0RVTEUKIG1vZHVsZV9leGl0KGhnYWZiX2V4aXQpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMC1pMmMuYyBiL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwLWkyYy5jCmluZGV4IGM2MWJhZDAuLmJkNDEwZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwLWkyYy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwLWkyYy5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZmIuaD4KICNpbmNsdWRlICJpODEwLmgiCiAjaW5jbHVkZSAiaTgxMF9yZWdzLmgiCisjaW5jbHVkZSAiaTgxMF9tYWluLmgiCiAjaW5jbHVkZSAiLi4vZWRpZC5oIgogCiAjZGVmaW5lIEk4MTBfRERDIDB4NTAKQEAgLTQyLDcgKzQzLDcgQEAKIAogc3RhdGljIHZvaWQgaTgxMGkyY19zZXRzY2wodm9pZCAqZGF0YSwgaW50IHN0YXRlKQogewotICAgICAgICBzdHJ1Y3QgaTgxMGZiX2kyY19jaGFuICAgICpjaGFuID0gKHN0cnVjdCBpODEwZmJfaTJjX2NoYW4gKilkYXRhOworICAgICAgICBzdHJ1Y3QgaTgxMGZiX2kyY19jaGFuICAgICpjaGFuID0gZGF0YTsKICAgICAgICAgc3RydWN0IGk4MTBmYl9wYXIgICAgICAgICAqcGFyID0gY2hhbi0+cGFyOwogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgX19pb21lbSAqbW1pbyA9IHBhci0+bW1pb19zdGFydF92aXJ0dWFsOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMF9hY2NlbC5jIGIvZHJpdmVycy92aWRlby9pODEwL2k4MTBfYWNjZWwuYwppbmRleCA2NGNkMWM4Li43Njc2NGVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMF9hY2NlbC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwX2FjY2VsLmMKQEAgLTE0LDYgKzE0LDcgQEAKIAogI2luY2x1ZGUgImk4MTBfcmVncy5oIgogI2luY2x1ZGUgImk4MTAuaCIKKyNpbmNsdWRlICJpODEwX21haW4uaCIKIAogc3RhdGljIHUzMiBpODEwZmJfcm9wW10gPSB7CiAJQ09MT1JfQ09QWV9ST1AsIC8qIFJPUF9DT1BZICovCkBAIC01Nyw3ICs1OCw3IEBACiAgKi8JCiBzdGF0aWMgaW5saW5lIGludCB3YWl0X2Zvcl9zcGFjZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdTMyIHNwYWNlKQogewotCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSAoc3RydWN0IGk4MTBmYl9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJdTMyIGhlYWQsIGNvdW50ID0gV0FJVF9DT1VOVCwgdGFpbDsKIAl1OCBfX2lvbWVtICptbWlvID0gcGFyLT5tbWlvX3N0YXJ0X3ZpcnR1YWw7CiAKQEAgLTg4LDcgKzg5LDcgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgd2FpdF9mb3JfZW5naW5lX2lkbGUoc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IChzdHJ1Y3QgaTgxMGZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1OCBfX2lvbWVtICptbWlvID0gcGFyLT5tbWlvX3N0YXJ0X3ZpcnR1YWw7CiAJaW50IGNvdW50ID0gV0FJVF9DT1VOVDsKIApAQCAtMTE2LDcgKzExNyw3IEBACiAgKi8gCiBzdGF0aWMgaW5saW5lIHUzMiBiZWdpbl9pcmluZyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdTMyIHNwYWNlKQogewotCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSAoc3RydWN0IGk4MTBmYl9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKIAlpZiAocGFyLT5kZXZfZmxhZ3MgJiBBTFdBWVNfU1lOQykgCiAJCXdhaXRfZm9yX2VuZ2luZV9pZGxlKGluZm8pOwpAQCAtMTYxLDcgKzE2Miw3IEBACiAJCQkJICAgIGludCB4ZGlyLCBpbnQgc3JjLCBpbnQgZGVzdCwgaW50IHJvcCwgCiAJCQkJICAgIGludCBibGl0X2JwcCwgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IChzdHJ1Y3QgaTgxMGZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAogCWlmIChiZWdpbl9pcmluZyhpbmZvLCAyNCArIElSSU5HX1BBRCkpIHJldHVybjsKIApAQCAtMTk1LDcgKzE5Niw3IEBACiAJCQkgICAgICBpbnQgcm9wLCBpbnQgd2hhdCwgaW50IGJsaXRfYnBwLCAKIAkJCSAgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSAoc3RydWN0IGk4MTBmYl9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKIAlpZiAoYmVnaW5faXJpbmcoaW5mbywgMjQgKyBJUklOR19QQUQpKSByZXR1cm47CiAKQEAgLTIzNiw3ICsyMzcsNyBAQAogCQkJCQkgIGludCBkZXN0LCBjb25zdCB1MzIgKnNyYywgaW50IGJnLAogCQkJCQkgIGludCBmZywgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IChzdHJ1Y3QgaTgxMGZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAogCWlmIChiZWdpbl9pcmluZyhpbmZvLCAyNCArIChkc2l6ZSA8PCAyKSArIElSSU5HX1BBRCkpIHJldHVybjsKIApAQCAtMjU0LDcgKzI1NSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsb2FkX2Zyb250KGludCBvZmZzZXQsIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSAoc3RydWN0IGk4MTBmYl9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKIAlpZiAoYmVnaW5faXJpbmcoaW5mbywgOCArIElSSU5HX1BBRCkpIHJldHVybjsKIApAQCAtMjk2LDcgKzI5Nyw3IEBACiAKIHZvaWQgaTgxMGZiX2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKnJlY3QpCiB7Ci0Jc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IChzdHJ1Y3QgaTgxMGZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1MzIgZHgsIGR5LCB3aWR0aCwgaGVpZ2h0LCBkZXN0LCByb3AgPSAwLCBjb2xvciA9IDA7CiAKIAlpZiAoIWluZm8tPnZhci5hY2NlbF9mbGFncyB8fCBwYXItPmRldl9mbGFncyAmIExPQ0tVUCB8fApAQCAtMzIyLDcgKzMyMyw3IEBACiAJCiB2b2lkIGk4MTBmYl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICpyZWdpb24pIAogewotCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSAoc3RydWN0IGk4MTBmYl9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJdTMyIHN4LCBzeSwgZHgsIGR5LCBwaXRjaCwgd2lkdGgsIGhlaWdodCwgc3JjLCBkZXN0LCB4ZGlyOwogCiAJaWYgKCFpbmZvLT52YXIuYWNjZWxfZmxhZ3MgfHwgcGFyLT5kZXZfZmxhZ3MgJiBMT0NLVVAgfHwKQEAgLTM2MSw3ICszNjIsNyBAQAogCiB2b2lkIGk4MTBmYl9pbWFnZWJsaXQoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9pbWFnZSAqaW1hZ2UpCiB7Ci0Jc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IChzdHJ1Y3QgaTgxMGZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1MzIgZmcgPSAwLCBiZyA9IDAsIHNpemUsIGRzdDsKIAkKIAlpZiAoIWluZm8tPnZhci5hY2NlbF9mbGFncyB8fCBwYXItPmRldl9mbGFncyAmIExPQ0tVUCB8fApAQCAtMzk3LDcgKzM5OCw3IEBACiAKIGludCBpODEwZmJfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyID0gKHN0cnVjdCBpODEwZmJfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCQogCWlmICghaW5mby0+dmFyLmFjY2VsX2ZsYWdzIHx8IHBhci0+ZGV2X2ZsYWdzICYgTE9DS1VQKQogCQlyZXR1cm4gMDsKQEAgLTQwNyw3ICs0MDgsNyBAQAogCiB2b2lkIGk4MTBmYl9sb2FkX2Zyb250KHUzMiBvZmZzZXQsIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSAoc3RydWN0IGk4MTBmYl9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJdTggX19pb21lbSAqbW1pbyA9IHBhci0+bW1pb19zdGFydF92aXJ0dWFsOwogCiAJaWYgKCFpbmZvLT52YXIuYWNjZWxfZmxhZ3MgfHwgcGFyLT5kZXZfZmxhZ3MgJiBMT0NLVVApCkBAIC00MjcsNyArNDI4LDcgQEAKICAqLwogdm9pZCBpODEwZmJfaW5pdF9yaW5nYnVmZmVyKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSAoc3RydWN0IGk4MTBmYl9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJdTMyIHRtcDEsIHRtcDI7CiAJdTggX19pb21lbSAqbW1pbyA9IHBhci0+bW1pb19zdGFydF92aXJ0dWFsOwogCQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pODEwL2k4MTBfZ3RmLmMgYi9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMF9ndGYuYwppbmRleCA2NGYwODdhLi45NzQzZDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMF9ndGYuYworKysgYi9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMF9ndGYuYwpAQCAtMTQsNiArMTQsNyBAQAogCiAjaW5jbHVkZSAiaTgxMF9yZWdzLmgiCiAjaW5jbHVkZSAiaTgxMC5oIgorI2luY2x1ZGUgImk4MTBfbWFpbi5oIgogCiAvKgogICogRklGTyBhbmQgV2F0ZXJtYXJrIHRhYmxlcyAtIGJhc2VkIGFsbW9zdCB3aG9sbHkgb24gaTgxMF93bWFyay5jIGluIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pODEwL2k4MTBfbWFpbi5jIGIvZHJpdmVycy92aWRlby9pODEwL2k4MTBfbWFpbi5jCmluZGV4IGMwYzk3NGIuLjI2NmQwYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwX21haW4uYworKysgYi9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMF9tYWluLmMKQEAgLTQyLDIwICs0Miw2MiBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KICNpbmNsdWRlIDxsaW51eC9yZXNvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgotCi0jaWZkZWYgQ09ORklHX01UUlIKLSNpbmNsdWRlIDxhc20vbXRyci5oPgotI2VuZGlmIAotCiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIAogI2luY2x1ZGUgImk4MTBfcmVncy5oIgogI2luY2x1ZGUgImk4MTAuaCIKICNpbmNsdWRlICJpODEwX21haW4uaCIKIAorLyoKKyAqIHZvZmZzZXQgLSBmcmFtZWJ1ZmZlciBvZmZzZXQgaW4gTWlCIGZyb20gYXBlcnR1cmUgc3RhcnQgYWRkcmVzcy4gIEluIG9yZGVyIGZvcgorICogdGhlIGRyaXZlciB0byB3b3JrIHdpdGggWCwgd2UgbXVzdCB0cnkgdG8gdXNlIG1lbW9yeSBob2xlcyBsZWZ0IHVudG91Y2hlZCBieSBYLiBUaGUKKyAqIGZvbGxvd2luZyB0YWJsZSBsaXN0cyB3aGVyZSBYJ3MgZGlmZmVyZW50IHN1cmZhY2VzIHN0YXJ0IGF0LgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogOiAgICAgICAgICAgICAgICA6ICA2NCBNaUIgICAgIDogMzIgTWlCICAgICAgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogOiBGcm9udEJ1ZmZlciAgICA6ICAgMCAgICAgICAgIDogIDAgICAgICAgICAgOgorICogOiBEZXB0aEJ1ZmZlciAgICA6ICAgNDggICAgICAgIDogIDE2ICAgICAgICAgOgorICogOiBCYWNrQnVmZmVyICAgICA6ICAgNTYgICAgICAgIDogIDI0ICAgICAgICAgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNvIGZvciBjaGlwc2V0cyB3aXRoIDY0IE1pQiBBcGVydHVyZSBzaXplcywgMzIgTWlCIGZvciB2X29mZnNldCBpcyBva2F5LCBhbGxvd2luZyB1cCB0bworICogMTUgKyAxIE1pQiBvZiBGcmFtZWJ1ZmZlciBtZW1vcnkuICBGb3IgMzIgTWlCIEFwZXJ0dXJlIHNpemVzLCBhIHZfb2Zmc2V0IG9mIDggTWlCIHNob3VsZAorICogd29yaywgYWxsb3dpbmcgNyArIDEgTWlCIG9mIEZyYW1lYnVmZmVyIG1lbW9yeS4KKyAqIE5vdGUsIHRoZSBzaXplIG9mIHRoZSBob2xlIG1heSBjaGFuZ2UgZGVwZW5kaW5nIG9uIGhvdyBtdWNoIG1lbW9yeSB5b3UgYWxsb2NhdGUgdG8gWCwKKyAqIGFuZCBob3cgdGhlIG1lbW9yeSBpcyBzcGxpdCB1cCBiZXR3ZWVuIHRoZXNlIHN1cmZhY2VzLgorICoKKyAqIE5vdGU6IEFueXRpbWUgdGhlIERlcHRoQnVmZmVyIG9yIEZyb250QnVmZmVyIGlzIG92ZXJsYXBwZWQsIFggd291bGQgc3RpbGwgcnVuIGJ1dCB3aXRoCisgKiBEUkkgZGlzYWJsZWQuICBCdXQgaWYgdGhlIEZyb250YnVmZmVyIGlzIG92ZXJsYXBwZWQsIFggd2lsbCBmYWlsIHRvIGxvYWQuCisgKgorICogRXhwZXJpbWVudCB3aXRoIHZfb2Zmc2V0IHRvIGZpbmQgb3V0IHdoaWNoIHdvcmtzIGJlc3QgZm9yIHlvdS4KKyAqLworc3RhdGljIHUzMiB2X29mZnNldF9kZWZhdWx0IF9faW5pdGRhdGE7IC8qIEZvciAzMiBNaUIgQXBlciBzaXplLCA4IHNob3VsZCBiZSB0aGUgZGVmYXVsdCAqLworc3RhdGljIHUzMiB2b2Zmc2V0ICAgICAgICAgIF9faW5pdGRhdGEgPSAwOworCitzdGF0aWMgaW50IGk4MTBmYl9jdXJzb3Ioc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmYl9jdXJzb3IgKmN1cnNvcik7CitzdGF0aWMgaW50ICBfX2RldmluaXQgaTgxMGZiX2luaXRfcGNpIChzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50cnkpOworc3RhdGljIHZvaWQgX19leGl0IGk4MTBmYl9yZW1vdmVfcGNpKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworc3RhdGljIGludCBpODEwZmJfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworc3RhdGljIGludCBpODEwZmJfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworCisvKiBDaGlwc2V0IFNwZWNpZmljIEZ1bmN0aW9ucyAqLworc3RhdGljIGludCBpODEwZmJfc2V0X3BhciAgICAoc3RydWN0IGZiX2luZm8gKmluZm8pOworc3RhdGljIGludCBpODEwZmJfZ2V0Y29scmVnICAodTggcmVnbm8sIHU4ICpyZWQsIHU4ICpncmVlbiwgdTggKmJsdWUsCisJCQkgICAgICB1OCAqdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IGk4MTBmYl9zZXRjb2xyZWcgICh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwgdW5zaWduZWQgYmx1ZSwKKwkJCSAgICAgIHVuc2lnbmVkIHRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pOworc3RhdGljIGludCBpODEwZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaTgxMGZiX2JsYW5rICAgICAgKGludCBibGFua19tb2RlLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CisKKy8qIEluaXRpYWxpemF0aW9uICovCitzdGF0aWMgdm9pZCBpODEwZmJfcmVsZWFzZV9yZXNvdXJjZSAgICAgICAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBpODEwZmJfcGFyICpwYXIpOworCiAvKiBQQ0kgKi8KIHN0YXRpYyBjb25zdCBjaGFyICppODEwX3BjaV9saXN0W10gX19kZXZpbml0ZGF0YSA9IHsKIAkiSW50ZWwoUikgODEwIEZyYW1lYnVmZmVyIERldmljZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCkBAIC03NzYsNyArODE4LDcgQEAKIAogc3RhdGljIHZvaWQgaTgxMF9sb2FkX2N1cnNvcl9jb2xvcnMoaW50IGZnLCBpbnQgYmcsIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSAoc3RydWN0IGk4MTBmYl9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJdTggX19pb21lbSAqbW1pbyA9IHBhci0+bW1pb19zdGFydF92aXJ0dWFsOwogCXU4IHJlZCwgZ3JlZW4sIGJsdWUsIHRyYW5zLCB0ZW1wOwogCkBAIC05NDksNyArOTkxLDcgQEAKIHN0YXRpYyBpbnQgaTgxMF9jaGVja19wYXJhbXMoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIAogCQkJICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyID0gKHN0cnVjdCBpODEwZmJfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCWludCBsaW5lX2xlbmd0aCwgdmlkbWVtLCBtb2RlX3ZhbGlkID0gMCwgcmV0dmFsID0gMDsKIAl1MzIgdnlyZXMgPSB2YXItPnlyZXNfdmlydHVhbCwgdnhyZXMgPSB2YXItPnhyZXNfdmlydHVhbDsKIAkvKgpAQCAtMTA0Myw3ICsxMDg1LDcgQEAKICAqLwogc3RhdGljIGludCBlbmNvZGVfZml4KHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4LCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyID0gKHN0cnVjdCBpODEwZmJfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCiAgICAgCW1lbXNldChmaXgsIDAsIHNpemVvZihzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8pKTsKIApAQCAtMTE1NCw3ICsxMTk2LDcgQEAKIHN0YXRpYyBpbnQgaTgxMGZiX2dldGNvbHJlZyh1OCByZWdubywgdTggKnJlZCwgdTggKmdyZWVuLCB1OCAqYmx1ZSwgCiAJCQkgICAgdTggKnRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IChzdHJ1Y3QgaTgxMGZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1OCBfX2lvbWVtICptbWlvID0gcGFyLT5tbWlvX3N0YXJ0X3ZpcnR1YWw7CiAJdTggdGVtcDsKIApAQCAtMTE5Myw3ICsxMjM1LDcgQEAKIAogc3RhdGljIGludCBpODEwZmJfb3BlbihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpCiB7Ci0Jc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IChzdHJ1Y3QgaTgxMGZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1MzIgY291bnQgPSBhdG9taWNfcmVhZCgmcGFyLT51c2VfY291bnQpOwogCQogCWlmIChjb3VudCA9PSAwKSB7CkBAIC0xMjEyLDcgKzEyNTQsNyBAQAogCiBzdGF0aWMgaW50IGk4MTBmYl9yZWxlYXNlKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcikKIHsKLQlzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyID0gKHN0cnVjdCBpODEwZmJfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXUzMiBjb3VudDsKIAkKIAljb3VudCA9IGF0b21pY19yZWFkKCZwYXItPnVzZV9jb3VudCk7CkBAIC0xMjM0LDcgKzEyNzYsNyBAQAogCQkJICAgIHVuc2lnbmVkIGJsdWUsIHVuc2lnbmVkIHRyYW5zcCwgCiAJCQkgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IChzdHJ1Y3QgaTgxMGZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1OCBfX2lvbWVtICptbWlvID0gcGFyLT5tbWlvX3N0YXJ0X3ZpcnR1YWw7CiAJdTggdGVtcDsKIAlpbnQgaTsKQEAgLTEzMjgsNyArMTM3MCw3IEBACiBzdGF0aWMgaW50IGk4MTBmYl9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgCiAJCQkgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyID0gKHN0cnVjdCBpODEwZmJfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXUzMiB0b3RhbDsKIAkKIAl0b3RhbCA9IHZhci0+eG9mZnNldCAqIHBhci0+ZGVwdGggKyAKQEAgLTEzNDAsNyArMTM4Miw3IEBACiAKIHN0YXRpYyBpbnQgaTgxMGZiX2JsYW5rIChpbnQgYmxhbmtfbW9kZSwgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IChzdHJ1Y3QgaTgxMGZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1OCBfX2lvbWVtICptbWlvID0gcGFyLT5tbWlvX3N0YXJ0X3ZpcnR1YWw7CiAJaW50IG1vZGUgPSAwLCBwd3IsIHNjcl9vZmYgPSAwOwogCQpAQCAtMTM4NSw3ICsxNDI3LDcgQEAKIAogc3RhdGljIGludCBpODEwZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyID0gKHN0cnVjdCBpODEwZmJfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCiAJZGVjb2RlX3ZhcigmaW5mby0+dmFyLCBwYXIpOwogCWk4MTBfbG9hZF9yZWdzKHBhcik7CkBAIC0xNDI5LDcgKzE0NzEsNyBAQAogCiBzdGF0aWMgaW50IGk4MTBmYl9jdXJzb3Ioc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmYl9jdXJzb3IgKmN1cnNvcikKIHsKLQlzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyID0gKHN0cnVjdCBpODEwZmJfcGFyICopaW5mby0+cGFyOworCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJdTggX19pb21lbSAqbW1pbyA9IHBhci0+bW1pb19zdGFydF92aXJ0dWFsOwogCiAJaWYgKCFwYXItPmRldl9mbGFncyAmIExPQ0tVUCkKQEAgLTE1MTYsMzYgKzE1NTgsMjkgQEAKIHN0YXRpYyBpbnQgaTgxMGZiX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IChzdHJ1Y3QgaTgxMGZiX3BhciAqKSBpbmZvLT5wYXI7Ci0JaW50IGJsYW5rID0gMCwgcHJldl9zdGF0ZSA9IHBhci0+Y3VyX3N0YXRlOwotCi0JaWYgKHN0YXRlLmV2ZW50ID09IHByZXZfc3RhdGUpCi0JCXJldHVybiAwOworCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKIAlwYXItPmN1cl9zdGF0ZSA9IHN0YXRlLmV2ZW50OwogCi0Jc3dpdGNoIChzdGF0ZS5ldmVudCkgewotCWNhc2UgMToKLQkJYmxhbmsgPSBWRVNBX1ZTWU5DX1NVU1BFTkQ7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJYmxhbmsgPSBWRVNBX0hTWU5DX1NVU1BFTkQ7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJYmxhbmsgPSBWRVNBX1BPV0VSRE9XTjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHN0YXRlLmV2ZW50ID09IFBNX0VWRU5UX0ZSRUVaRSkgeworCQlkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOworCQlyZXR1cm4gMDsKIAl9Ci0JaW5mby0+ZmJvcHMtPmZiX2JsYW5rKGJsYW5rLCBpbmZvKTsKIAotCWlmICghcHJldl9zdGF0ZSkgeyAKLQkJYWdwX3VuYmluZF9tZW1vcnkocGFyLT5pODEwX2d0dC5pODEwX2ZiX21lbW9yeSk7Ci0JCWFncF91bmJpbmRfbWVtb3J5KHBhci0+aTgxMF9ndHQuaTgxMF9jdXJzb3JfbWVtb3J5KTsKLQkJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7Ci0JfQorCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwlmYl9zZXRfc3VzcGVuZChpbmZvLCAxKTsKKworCWlmIChpbmZvLT5mYm9wcy0+ZmJfc3luYykKKwkJaW5mby0+ZmJvcHMtPmZiX3N5bmMoaW5mbyk7CisKKwlpODEwZmJfYmxhbmsoRkJfQkxBTktfUE9XRVJET1dOLCBpbmZvKTsKKwlhZ3BfdW5iaW5kX21lbW9yeShwYXItPmk4MTBfZ3R0Lmk4MTBfZmJfbWVtb3J5KTsKKwlhZ3BfdW5iaW5kX21lbW9yeShwYXItPmk4MTBfZ3R0Lmk4MTBfY3Vyc29yX21lbW9yeSk7CisKIAlwY2lfc2F2ZV9zdGF0ZShkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBwY2lfY2hvb3NlX3N0YXRlKGRldiwgc3RhdGUpKTsKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE1NTMsMjMgKzE1ODgsMjkgQEAKIHN0YXRpYyBpbnQgaTgxMGZiX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqZGV2KSAKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSAoc3RydWN0IGk4MTBmYl9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBpODEwZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisJaW50IGN1cl9zdGF0ZSA9IHBhci0+Y3VyX3N0YXRlOwogCi0JaWYgKHBhci0+Y3VyX3N0YXRlID09IDApCisJcGFyLT5jdXJfc3RhdGUgPSBQTV9FVkVOVF9PTjsKKworCWlmIChjdXJfc3RhdGUgPT0gUE1fRVZFTlRfRlJFRVpFKSB7CisJCXBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBQQ0lfRDApOwogCQlyZXR1cm4gMDsKKwl9CiAKLQlwY2lfcmVzdG9yZV9zdGF0ZShkZXYpOworCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShkZXYpOwogCXBjaV9lbmFibGVfZGV2aWNlKGRldik7CisJcGNpX3NldF9tYXN0ZXIoZGV2KTsKIAlhZ3BfYmluZF9tZW1vcnkocGFyLT5pODEwX2d0dC5pODEwX2ZiX21lbW9yeSwKIAkJCXBhci0+ZmIub2Zmc2V0KTsKIAlhZ3BfYmluZF9tZW1vcnkocGFyLT5pODEwX2d0dC5pODEwX2N1cnNvcl9tZW1vcnksCiAJCQlwYXItPmN1cnNvcl9oZWFwLm9mZnNldCk7Ci0KKwlpODEwZmJfc2V0X3BhcihpbmZvKTsKKwlmYl9zZXRfc3VzcGVuZCAoaW5mbywgMCk7CiAJaW5mby0+ZmJvcHMtPmZiX2JsYW5rKFZFU0FfTk9fQkxBTktJTkcsIGluZm8pOwotCi0JcGFyLT5jdXJfc3RhdGUgPSAwOwotCisJcmVsZWFzZV9jb25zb2xlX3NlbSgpOwogCXJldHVybiAwOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNjEwLDcgKzE2NTEsNyBAQAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBpODEwX2FsbG9jX2FncF9tZW0oc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IChzdHJ1Y3QgaTgxMGZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlpbnQgc2l6ZTsKIAlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2U7CiAJCkBAIC0yMDc0LDcgKzIxMTUsNyBAQAogc3RhdGljIHZvaWQgX19leGl0IGk4MTBmYl9yZW1vdmVfcGNpKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyID0gKHN0cnVjdCBpODEwZmJfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgaTgxMGZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCiAJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsgIAogCWk4MTBmYl9yZWxlYXNlX3Jlc291cmNlKGluZm8sIHBhcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMF9tYWluLmggYi9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMF9tYWluLmgKaW5kZXggMDYwNzJhNi4uNTFkNGYzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9pODEwL2k4MTBfbWFpbi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwX21haW4uaApAQCAtMTQsNTUgKzE0LDYgQEAKICNpZm5kZWYgX19JODEwX01BSU5fSF9fCiAjZGVmaW5lIF9fSTgxMF9NQUlOX0hfXwogCi1zdGF0aWMgaW50ICBfX2RldmluaXQgaTgxMGZiX2luaXRfcGNpIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCAKLQkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudHJ5KTsKLXN0YXRpYyB2b2lkIF9fZXhpdCBpODEwZmJfcmVtb3ZlX3BjaShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLXN0YXRpYyBpbnQgaTgxMGZiX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLXN0YXRpYyBpbnQgaTgxMGZiX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLQotLyoKLSAqIHZvZmZzZXQgLSBmcmFtZWJ1ZmZlciBvZmZzZXQgaW4gTWlCIGZyb20gYXBlcnR1cmUgc3RhcnQgYWRkcmVzcy4gIEluIG9yZGVyIGZvcgotICogdGhlIGRyaXZlciB0byB3b3JrIHdpdGggWCwgd2UgbXVzdCB0cnkgdG8gdXNlIG1lbW9yeSBob2xlcyBsZWZ0IHVudG91Y2hlZCBieSBYLiBUaGUgCi0gKiBmb2xsb3dpbmcgdGFibGUgbGlzdHMgd2hlcmUgWCdzIGRpZmZlcmVudCBzdXJmYWNlcyBzdGFydCBhdC4gIAotICogCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDogICAgICAgICAgICAgICAgOiAgNjQgTWlCICAgICA6IDMyIE1pQiAgICAgIDoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDogRnJvbnRCdWZmZXIgICAgOiAgIDAgICAgICAgICA6ICAwICAgICAgICAgIDoKLSAqIDogRGVwdGhCdWZmZXIgICAgOiAgIDQ4ICAgICAgICA6ICAxNiAgICAgICAgIDoKLSAqIDogQmFja0J1ZmZlciAgICAgOiAgIDU2ICAgICAgICA6ICAyNCAgICAgICAgIDoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBTbyBmb3IgY2hpcHNldHMgd2l0aCA2NCBNaUIgQXBlcnR1cmUgc2l6ZXMsIDMyIE1pQiBmb3Igdl9vZmZzZXQgaXMgb2theSwgYWxsb3dpbmcgdXAgdG8KLSAqIDE1ICsgMSBNaUIgb2YgRnJhbWVidWZmZXIgbWVtb3J5LiAgRm9yIDMyIE1pQiBBcGVydHVyZSBzaXplcywgYSB2X29mZnNldCBvZiA4IE1pQiBzaG91bGQKLSAqIHdvcmssIGFsbG93aW5nIDcgKyAxIE1pQiBvZiBGcmFtZWJ1ZmZlciBtZW1vcnkuCi0gKiBOb3RlLCB0aGUgc2l6ZSBvZiB0aGUgaG9sZSBtYXkgY2hhbmdlIGRlcGVuZGluZyBvbiBob3cgbXVjaCBtZW1vcnkgeW91IGFsbG9jYXRlIHRvIFgsCi0gKiBhbmQgaG93IHRoZSBtZW1vcnkgaXMgc3BsaXQgdXAgYmV0d2VlbiB0aGVzZSBzdXJmYWNlcy4gIAotICoKLSAqIE5vdGU6IEFueXRpbWUgdGhlIERlcHRoQnVmZmVyIG9yIEZyb250QnVmZmVyIGlzIG92ZXJsYXBwZWQsIFggd291bGQgc3RpbGwgcnVuIGJ1dCB3aXRoCi0gKiBEUkkgZGlzYWJsZWQuICBCdXQgaWYgdGhlIEZyb250YnVmZmVyIGlzIG92ZXJsYXBwZWQsIFggd2lsbCBmYWlsIHRvIGxvYWQuCi0gKiAKLSAqIEV4cGVyaW1lbnQgd2l0aCB2X29mZnNldCB0byBmaW5kIG91dCB3aGljaCB3b3JrcyBiZXN0IGZvciB5b3UuCi0gKi8KLXN0YXRpYyB1MzIgdl9vZmZzZXRfZGVmYXVsdCBfX2luaXRkYXRhOyAvKiBGb3IgMzIgTWlCIEFwZXIgc2l6ZSwgOCBzaG91bGQgYmUgdGhlIGRlZmF1bHQgKi8KLXN0YXRpYyB1MzIgdm9mZnNldCAgICAgICAgICBfX2luaXRkYXRhID0gMDsKLQotc3RhdGljIGludCBpODEwZmJfY3Vyc29yKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmJfY3Vyc29yICpjdXJzb3IpOwotCi0vKiBDaGlwc2V0IFNwZWNpZmljIEZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBpODEwZmJfc2V0X3BhciAgICAoc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCBpODEwZmJfZ2V0Y29scmVnICAodTggcmVnbm8sIHU4ICpyZWQsIHU4ICpncmVlbiwgdTggKmJsdWUsCi0JCQkgICAgICB1OCAqdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci1zdGF0aWMgaW50IGk4MTBmYl9zZXRjb2xyZWcgICh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwgdW5zaWduZWQgYmx1ZSwKLQkJCSAgICAgIHVuc2lnbmVkIHRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCBpODEwZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLXN0YXRpYyBpbnQgaTgxMGZiX2JsYW5rICAgICAgKGludCBibGFua19tb2RlLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci0KLS8qIEluaXRpYWxpemF0aW9uICovCi1zdGF0aWMgdm9pZCBpODEwZmJfcmVsZWFzZV9yZXNvdXJjZSAgICAgICAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBpODEwZmJfcGFyICpwYXIpOwotZXh0ZXJuIGludCBfX2luaXQgYWdwX2ludGVsX2luaXQodm9pZCk7Ci0KLQogLyogVmlkZW8gVGltaW5ncyAqLwogZXh0ZXJuIHZvaWQgcm91bmRfb2ZmX3hyZXMgICAgICAgICAodTMyICp4cmVzKTsKIGV4dGVybiB2b2lkIHJvdW5kX29mZl95cmVzICAgICAgICAgKHUzMiAqeHJlcywgdTMyICp5cmVzKTsKQEAgLTEwMSw3ICs1Miw3IEBACiAKIC8qIENvbmRpdGlvbmFscyAqLwogI2lmZGVmIENPTkZJR19YODYKLWlubGluZSB2b2lkIGZsdXNoX2NhY2hlKHZvaWQpCitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfY2FjaGUodm9pZCkKIHsKIAlhc20gdm9sYXRpbGUgKCJ3YmludmQiOjo6Im1lbW9yeSIpOwogfQpAQCAtMTEwLDcgKzYxLDkgQEAKICNlbmRpZiAKIAogI2lmZGVmIENPTkZJR19NVFJSCi0jZGVmaW5lIEtFUk5FTF9IQVNfTVRSUiAxCisKKyNpbmNsdWRlIDxhc20vbXRyci5oPgorCiBzdGF0aWMgaW5saW5lIHZvaWQgX19kZXZpbml0IHNldF9tdHJyKHN0cnVjdCBpODEwZmJfcGFyICpwYXIpCiB7CiAJcGFyLT5tdHJyX3JlZyA9IG10cnJfYWRkKCh1MzIpIHBhci0+YXBlcnR1cmUucGh5c2ljYWwsIApAQCAtMTI4LDcgKzgxLDYgQEAKIAkJCSBwYXItPmFwZXJ0dXJlLnNpemUpOyAKIH0KICNlbHNlCi0jZGVmaW5lIEtFUk5FTF9IQVNfTVRSUiAwCiAjZGVmaW5lIHNldF9tdHJyKHgpIHByaW50aygic2V0X210cnI6IE1UUlIgaXMgZGlzYWJsZWQgaW4gdGhlIGtlcm5lbFxuIikKIAogI2RlZmluZSB1bnNldF9tdHJyKHgpIGRvIHsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaWdhZmIuYyBiL2RyaXZlcnMvdmlkZW8vaWdhZmIuYwppbmRleCBlMzI2ZjQ0Li42Yjg4MDUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2lnYWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9pZ2FmYi5jCkBAIC0yMTksNyArMjE5LDcgQEAKIH0KIAogI2lmZGVmIF9fc3BhcmNfXwotc3RhdGljIGludCBpZ2FmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKK3N0YXRpYyBpbnQgaWdhZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKIAkJICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGlnYV9wYXIgKnBhciA9IChzdHJ1Y3QgaWdhX3BhciAqKWluZm8tPnBhcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaW1zdHRmYi5jIGIvZHJpdmVycy92aWRlby9pbXN0dGZiLmMKaW5kZXggN2ZiZTI0Mi4uYWQ0MTZhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9pbXN0dGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9pbXN0dGZiLmMKQEAgLTMyMyw2ICszMjMsNyBAQAogCXVuc2lnbmVkIGxvbmcgY21hcF9yZWdzX3BoeXM7CiAJX191OCAqY21hcF9yZWdzOwogCV9fdTMyIHJhbWRhYzsKKwlfX3UzMiBwYWxldHRlWzE2XTsKIH07CiAgCiBlbnVtIHsKQEAgLTY1Nyw3ICs2NTgsNyBAQAogc3RhdGljIHZvaWQKIHNldF9pbXN0dF9yZWd2YWxzIChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdV9pbnQgYnBwKQogewotCXN0cnVjdCBpbXN0dF9wYXIgKnBhciA9IChzdHJ1Y3QgaW1zdHRfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgaW1zdHRfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJc3RydWN0IGltc3R0X3JlZ3ZhbHMgKmluaXQgPSAmcGFyLT5pbml0OwogCV9fdTMyIGN0bCwgcGl0Y2gsIGJ5dGVzd2FwLCBzY3I7CiAKQEAgLTc0OSw3ICs3NTAsNyBAQAogc3RhdGljIGlubGluZSB2b2lkCiBzZXRfb2Zmc2V0IChzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGltc3R0X3BhciAqcGFyID0gKHN0cnVjdCBpbXN0dF9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBpbXN0dF9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlfX3UzMiBvZmYgPSB2YXItPnlvZmZzZXQgKiAoaW5mby0+Zml4LmxpbmVfbGVuZ3RoID4+IDMpCiAJCSAgICArICgodmFyLT54b2Zmc2V0ICogKHZhci0+Yml0c19wZXJfcGl4ZWwgPj4gMykpID4+IDMpOwogCXdyaXRlX3JlZ19sZTMyKHBhci0+ZGNfcmVncywgU1NSLCBvZmYpOwpAQCAtODYzLDcgKzg2NCw3IEBACiBzdGF0aWMgaW50CiBpbXN0dGZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pIAogewotCXN0cnVjdCBpbXN0dF9wYXIgKnBhciA9IChzdHJ1Y3QgaW1zdHRfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgaW1zdHRfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJCQogCWlmICghY29tcHV0ZV9pbXN0dF9yZWd2YWxzKHBhciwgaW5mby0+dmFyLnhyZXMsIGluZm8tPnZhci55cmVzKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC04ODEsNyArODgyLDcgQEAKIGltc3R0ZmJfc2V0Y29scmVnICh1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwgdV9pbnQgYmx1ZSwKIAkJICAgdV9pbnQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgaW1zdHRfcGFyICpwYXIgPSAoc3RydWN0IGltc3R0X3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IGltc3R0X3BhciAqcGFyID0gaW5mby0+cGFyOwogCXVfaW50IGJwcCA9IGluZm8tPnZhci5iaXRzX3Blcl9waXhlbDsKIAogCWlmIChyZWdubyA+IDI1NSkKQEAgLTkwNSwxNCArOTA2LDE3IEBACiAJaWYgKHJlZ25vIDwgMTYpCiAJCXN3aXRjaCAoYnBwKSB7CiAJCQljYXNlIDE2OgotCQkJCSgodTE2ICopaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlZ25vXSA9IChyZWdubyA8PCAoaW5mby0+dmFyLmdyZWVuLmxlbmd0aCA9PSA1ID8gMTAgOiAxMSkpIHwgKHJlZ25vIDw8IDUpIHwgcmVnbm87CisJCQkJcGFyLT5wYWxldHRlW3JlZ25vXSA9CisJCQkJCShyZWdubyA8PCAoaW5mby0+dmFyLmdyZWVuLmxlbmd0aCA9PQorCQkJCQk1ID8gMTAgOiAxMSkpIHwgKHJlZ25vIDw8IDUpIHwgcmVnbm87CiAJCQkJYnJlYWs7CiAJCQljYXNlIDI0OgotCQkJCSgodTMyICopaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlZ25vXSA9IChyZWdubyA8PCAxNikgfCAocmVnbm8gPDwgOCkgfCByZWdubzsKKwkJCQlwYXItPnBhbGV0dGVbcmVnbm9dID0KKwkJCQkJKHJlZ25vIDw8IDE2KSB8IChyZWdubyA8PCA4KSB8IHJlZ25vOwogCQkJCWJyZWFrOwogCQkJY2FzZSAzMjogewogCQkJCWludCBpID0gKHJlZ25vIDw8IDgpIHwgcmVnbm87Ci0JCQkJKCh1MzIgKilpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnbm9dID0gKGkgPDwgMTYpIHwgaTsKKwkJCQlwYXItPnBhbGV0dGVbcmVnbm9dID0gKGkgPDwgMTYpIHxpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC05MzUsNyArOTM5LDcgQEAKIHN0YXRpYyBpbnQgCiBpbXN0dGZiX2JsYW5rKGludCBibGFuaywgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGltc3R0X3BhciAqcGFyID0gKHN0cnVjdCBpbXN0dF9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBpbXN0dF9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlfX3UzMiBjdHJsOwogCiAJY3RybCA9IHJlYWRfcmVnX2xlMzIocGFyLT5kY19yZWdzLCBTVEdDVEwpOwpAQCAtOTg5LDcgKzk5Myw3IEBACiBzdGF0aWMgdm9pZAogaW1zdHRmYl9maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KQogeyAKLQlzdHJ1Y3QgaW1zdHRfcGFyICpwYXIgPSAoc3RydWN0IGltc3R0X3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IGltc3R0X3BhciAqcGFyID0gaW5mby0+cGFyOwogCV9fdTMyIEJwcCwgbGluZV9waXRjaCwgYmdjLCBkeCwgZHksIHdpZHRoLCBoZWlnaHQ7CiAKIAliZ2MgPSByZWN0LT5jb2xvcjsKQEAgLTEwMzMsNyArMTAzNyw3IEBACiBzdGF0aWMgdm9pZAogaW1zdHRmYl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICphcmVhKQogewotCXN0cnVjdCBpbXN0dF9wYXIgKnBhciA9IChzdHJ1Y3QgaW1zdHRfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgaW1zdHRfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJX191MzIgQnBwLCBsaW5lX3BpdGNoLCBmYl9vZmZzZXRfb2xkLCBmYl9vZmZzZXRfbmV3LCBzcCwgZHBfb2N0bDsKICAJX191MzIgY250LCBibHRjdGwsIHN4LCBzeSwgZHgsIGR5LCBoZWlnaHQsIHdpZHRoOwogCkBAIC0xMTk1LDcgKzExOTksNyBAQAogc3RhdGljIGludCAKIGltc3R0ZmJfY3Vyc29yKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmJfY3Vyc29yICpjdXJzb3IpCiB7Ci0Jc3RydWN0IGltc3R0X3BhciAqcGFyID0gKHN0cnVjdCBpbXN0dF9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBpbXN0dF9wYXIgKnBhciA9IGluZm8tPnBhcjsKICAgICAgICAgdTMyIGZsYWdzID0gY3Vyc29yLT5zZXQsIGZnLCBiZywgeHgsIHl5OwogCiAJaWYgKGN1cnNvci0+ZGVzdCA9PSBOVUxMICYmIGN1cnNvci0+cm9wID09IFJPUF9YT1IpCkBAIC0xMjYzLDEwICsxMjY3LDkgQEAKICNkZWZpbmUgRkJJTVNUVF9HRVRJRFhSRUcJMHg1NDU0MDYKIAogc3RhdGljIGludAotaW1zdHRmYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdV9pbnQgY21kLAotCSAgICAgIHVfbG9uZyBhcmcsIHN0cnVjdCBmYl9pbmZvICppbmZvKQoraW1zdHRmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdV9pbnQgY21kLCB1X2xvbmcgYXJnKQogewotCXN0cnVjdCBpbXN0dF9wYXIgKnBhciA9IChzdHJ1Y3QgaW1zdHRfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgaW1zdHRfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJX191MzIgcmVnWzJdOwogCV9fdTggaWR4WzJdOwpAQCAtMTM1MCw3ICsxMzUzLDcgQEAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdAogaW5pdF9pbXN0dChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgaW1zdHRfcGFyICpwYXIgPSAoc3RydWN0IGltc3R0X3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IGltc3R0X3BhciAqcGFyID0gaW5mby0+cGFyOwogCV9fdTMyIGksIHRtcCwgKmlwLCAqZW5kOwogCiAJdG1wID0gcmVhZF9yZWdfbGUzMihwYXItPmRjX3JlZ3MsIFBSQyk7CkBAIC0xNDEzLDcgKzE0MTYsNyBAQAogCWlmICgoaW5mby0+dmFyLnhyZXMgKiBpbmZvLT52YXIueXJlcykgKiAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID4+IDMpID4gaW5mby0+Zml4LnNtZW1fbGVuCiAJICAgIHx8ICEoY29tcHV0ZV9pbXN0dF9yZWd2YWxzKHBhciwgaW5mby0+dmFyLnhyZXMsIGluZm8tPnZhci55cmVzKSkpIHsKIAkJcHJpbnRrKCJpbXN0dGZiOiAldXgldXgldSBub3Qgc3VwcG9ydGVkXG4iLCBpbmZvLT52YXIueHJlcywgaW5mby0+dmFyLnlyZXMsIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCk7Ci0JCWtmcmVlKGluZm8pOworCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNDQ5LDcgKzE0NTIsNyBAQAogCWZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDAsIDApOwogCiAJaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pIDwgMCkgewotCQlrZnJlZShpbmZvKTsKKwkJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTQ3NCwyNiArMTQ3NywyMSBAQAogCQlwcmludGsoS0VSTl9FUlIgImltc3R0ZmI6IG5vIE9GIG5vZGUgZm9yIHBjaSBkZXZpY2VcbiIpOwogI2VuZGlmIC8qIENPTkZJR19QUENfT0YgKi8KIAotCXNpemUgPSBzaXplb2Yoc3RydWN0IGZiX2luZm8pICsgc2l6ZW9mKHN0cnVjdCBpbXN0dF9wYXIpICsKLQkJc2l6ZW9mKHUzMikgKiAxNjsKLQotCWluZm8gPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGltc3R0X3BhciksICZwZGV2LT5kZXYpOwogCiAJaWYgKCFpbmZvKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaW1zdHRmYjogQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JbWVtc2V0KGluZm8sIDAsIHNpemUpOwotCi0JcGFyID0gKHN0cnVjdCBpbXN0dF9wYXIgKikgKGluZm8gKyAxKTsKKwlwYXIgPSBpbmZvLT5wYXI7CiAKIAlhZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAwKTsKIAlzaXplID0gcGNpX3Jlc291cmNlX2xlbiAocGRldiwgMCk7CiAKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihhZGRyLCBzaXplLCAiaW1zdHRmYiIpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaW1zdHRmYjogQ2FuJ3QgcmVzZXJ2ZSBtZW1vcnkgcmVnaW9uXG4iKTsKLQkJa2ZyZWUoaW5mbyk7CisJCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTUxNiwxNCArMTUxNCwxMyBAQAogCX0KIAogCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gYWRkcjsKLQlpbmZvLT5zY3JlZW5fYmFzZSA9IChfX3U4ICopaW9yZW1hcChhZGRyLCBwYXItPnJhbWRhYyA9PSBJQk0gPyAweDQwMDAwMCA6IDB4ODAwMDAwKTsKKwlpbmZvLT5zY3JlZW5fYmFzZSA9IChfX3U4ICopaW9yZW1hcChhZGRyLCBwYXItPnJhbWRhYyA9PSBJQk0gPworCQkJCQkgICAgMHg0MDAwMDAgOiAweDgwMDAwMCk7CiAJaW5mby0+Zml4Lm1taW9fc3RhcnQgPSBhZGRyICsgMHg4MDAwMDA7CiAJcGFyLT5kY19yZWdzID0gaW9yZW1hcChhZGRyICsgMHg4MDAwMDAsIDB4MTAwMCk7CiAJcGFyLT5jbWFwX3JlZ3NfcGh5cyA9IGFkZHIgKyAweDg0MDAwMDsKIAlwYXItPmNtYXBfcmVncyA9IChfX3U4ICopaW9yZW1hcChhZGRyICsgMHg4NDAwMDAsIDB4MTAwMCk7Ci0JaW5mby0+cGFyID0gcGFyOwotCWluZm8tPnBzZXVkb19wYWxldHRlID0gKHZvaWQgKikgKHBhciArIDEpOwotCWluZm8tPmRldmljZSA9ICZwZGV2LT5kZXY7CisJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBwYXItPnBhbGV0dGU7CiAJaW5pdF9pbXN0dChpbmZvKTsKIAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBpbmZvKTsKQEAgLTE1MzQsNyArMTUzMSw3IEBACiBpbXN0dGZiX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgaW1zdHRfcGFyICpwYXIgPSAoc3RydWN0IGltc3R0X3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IGltc3R0X3BhciAqcGFyID0gaW5mby0+cGFyOwogCWludCBzaXplID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKIAogCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CkBAIC0xNTQyLDcgKzE1MzksNyBAQAogCWlvdW5tYXAocGFyLT5kY19yZWdzKTsKIAlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKIAlyZWxlYXNlX21lbV9yZWdpb24oaW5mby0+Zml4LnNtZW1fc3RhcnQsIHNpemUpOwotCWtmcmVlKGluZm8pOworCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CiB9CiAKICNpZm5kZWYgTU9EVUxFCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2lteGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2lteGZiLmMKaW5kZXggNTkyNGNjMi4uMTcxOGJhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9pbXhmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaW14ZmIuYwpAQCAtNTU0LDcgKzU1NCw3IEBACiAKIAlpbmYgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlpZighaW5mKSB7Ci0JCWRldl9lcnIoZGV2LCJObyBwbGF0Zm9ybV9kYXRhIGF2YWlsYWJsZVxuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwiTm8gcGxhdGZvcm1fZGF0YSBhdmFpbGFibGVcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTU3OSw3ICs1NzksNyBAQAogCWlmICghaW5mLT5maXhlZF9zY3JlZW5fY3B1KSB7CiAJCXJldCA9IGlteGZiX21hcF92aWRlb19tZW1vcnkoaW5mbyk7CiAJCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHZpZGVvIFJBTTogJWRcbiIsIHJldCk7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgdmlkZW8gUkFNOiAlZFxuIiwgcmV0KTsKIAkJCXJldCA9IC1FTk9NRU07CiAJCQlnb3RvIGZhaWxlZF9tYXA7CiAJCX0KQEAgLTYwOCw3ICs2MDgsNyBAQAogCWlteGZiX3NldF9wYXIoaW5mbyk7CiAJcmV0ID0gcmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgZnJhbWVidWZmZXJcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgZnJhbWVidWZmZXJcbiIpOwogCQlnb3RvIGZhaWxlZF9yZWdpc3RlcjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiZHJ2LmMgYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmRydi5jCmluZGV4IDAwOTA1NDQuLjZiOGJkM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiZHJ2LmMKKysrIGIvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJkcnYuYwpAQCAtMTU3LDkgKzE1Nyw4IEBACiAKIHN0YXRpYyBpbnQgaW50ZWxmYl9zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIAotc3RhdGljIGludCBpbnRlbGZiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLAotCQkJIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaW50ZWxmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGludGVsZmJfcGNpX3JlZ2lzdGVyKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwpAQCAtMTM4MCw4ICsxMzc5LDcgQEAKIAogLyogV2hlbi9pZiB3ZSBoYXZlIG91ciBvd24gaW9jdGxzLiAqLwogc3RhdGljIGludAotaW50ZWxmYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkgICAgICB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZiX2luZm8gKmluZm8pCitpbnRlbGZiX2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlpbnQgcmV0dmFsID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9reXJvL1NURzQwMDBJbml0RGV2aWNlLmMgYi9kcml2ZXJzL3ZpZGVvL2t5cm8vU1RHNDAwMEluaXREZXZpY2UuYwppbmRleCA3ZTMzY2QzMC4uYWI1Mjg1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9reXJvL1NURzQwMDBJbml0RGV2aWNlLmMKKysrIGIvZHJpdmVycy92aWRlby9reXJvL1NURzQwMDBJbml0RGV2aWNlLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAogI2luY2x1ZGUgIlNURzQwMDBSZWcuaCIKKyNpbmNsdWRlICJTVEc0MDAwSW50ZXJmYWNlLmgiCiAKIC8qIFNEUkFNIGZpeGVkIHNldHRpbmdzICovCiAjZGVmaW5lIFNEUkFNX0NGR18wICAgMHg0OUExCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2t5cm8vU1RHNDAwMEludGVyZmFjZS5oIGIvZHJpdmVycy92aWRlby9reXJvL1NURzQwMDBJbnRlcmZhY2UuaAppbmRleCBlNzViM2I0Li5iN2M4M2Q1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2t5cm8vU1RHNDAwMEludGVyZmFjZS5oCisrKyBiL2RyaXZlcnMvdmlkZW8va3lyby9TVEc0MDAwSW50ZXJmYWNlLmgKQEAgLTExLDcgKzExLDggQEAKICNpZm5kZWYgX1NURzQwMDBJTlRFUkZBQ0VfSAogI2RlZmluZSBfU1RHNDAwMElOVEVSRkFDRV9ICiAKLXN0cnVjdCBwY2lfZGV2OworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPHZpZGVvL2t5cm8uaD4KIAogLyoKICAqIFJhbWRhYyBTZXR1cApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9reXJvL1NURzQwMDBPdmVybGF5RGV2aWNlLmMgYi9kcml2ZXJzL3ZpZGVvL2t5cm8vU1RHNDAwME92ZXJsYXlEZXZpY2UuYwppbmRleCAyYWU5YmFmLi5hOGM5NzEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2t5cm8vU1RHNDAwME92ZXJsYXlEZXZpY2UuYworKysgYi9kcml2ZXJzL3ZpZGVvL2t5cm8vU1RHNDAwME92ZXJsYXlEZXZpY2UuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpbmNsdWRlICJTVEc0MDAwUmVnLmgiCisjaW5jbHVkZSAiU1RHNDAwMEludGVyZmFjZS5oIgogCiAvKiBIVyBEZWZpbmVzICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8va3lyby9mYmRldi5jIGIvZHJpdmVycy92aWRlby9reXJvL2ZiZGV2LmMKaW5kZXggNWViNGQ1Yy4uNDc3YWQyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9reXJvL2ZiZGV2LmMKKysrIGIvZHJpdmVycy92aWRlby9reXJvL2ZiZGV2LmMKQEAgLTczLDggKzczLDYgQEAKIAkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qga3lyb2ZiX2luZm8gKmN1cnJlbnRwYXI7Ci0KIHR5cGVkZWYgc3RydWN0IHsKIAlTVEc0MDAwUkVHIF9faW9tZW0gKnBTVEdSZWc7CS8qIFZpcnR1YWwgYWRkcmVzcyBvZiBQQ0kgcmVnaXN0ZXIgcmVnaW9uICovCiAJdTMyIHVsTmV4dEZyZWVWaWRNZW07CS8qIE9mZnNldCBmcm9tIHN0YXJ0IG9mIHZpZCBtZW0gdG8gbmV4dCBmcmVlIHJlZ2lvbiAqLwpAQCAtMzA5LDcgKzMwNyw3IEBACiAvKiBBY2Nlc3NvcnMgKi8KIHN0YXRpYyBpbnQga3lyb19kZXZfdmlkZW9fbW9kZV9zZXQoc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGt5cm9mYl9pbmZvICpwYXIgPSAoc3RydWN0IGt5cm9mYl9pbmZvICopaW5mby0+cGFyOworCXN0cnVjdCBreXJvZmJfaW5mbyAqcGFyID0gaW5mby0+cGFyOwogCiAJLyogVHVybiBvZmYgZGlzcGxheSAqLwogCVN0b3BWVEcoZGV2aWNlSW5mby5wU1RHUmVnKTsKQEAgLTQwMiw3ICs0MDAsNyBAQAogCiBzdGF0aWMgaW50IGt5cm9mYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCBreXJvZmJfaW5mbyAqcGFyID0gKHN0cnVjdCBreXJvZmJfaW5mbyAqKWluZm8tPnBhcjsKKwlzdHJ1Y3Qga3lyb2ZiX2luZm8gKnBhciA9IGluZm8tPnBhcjsKIAogCWlmICh2YXItPmJpdHNfcGVyX3BpeGVsICE9IDE2ICYmIHZhci0+Yml0c19wZXJfcGl4ZWwgIT0gMzIpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAia3lyb2ZiOiBkZXB0aCBub3Qgc3VwcG9ydGVkOiAldVxuIiwgdmFyLT5iaXRzX3Blcl9waXhlbCk7CkBAIC00NzgsNyArNDc2LDcgQEAKIAogc3RhdGljIGludCBreXJvZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3Qga3lyb2ZiX2luZm8gKnBhciA9IChzdHJ1Y3Qga3lyb2ZiX2luZm8gKilpbmZvLT5wYXI7CisJc3RydWN0IGt5cm9mYl9pbmZvICpwYXIgPSBpbmZvLT5wYXI7CiAJdW5zaWduZWQgbG9uZyBsaW5lY2xvY2s7CiAJdW5zaWduZWQgbG9uZyBmcmFtZWNsb2NrOwogCkBAIC01MzYsMjAgKzUzNCwyMiBAQAogc3RhdGljIGludCBreXJvZmJfc2V0Y29scmVnKHVfaW50IHJlZ25vLCB1X2ludCByZWQsIHVfaW50IGdyZWVuLAogCQkJICAgIHVfaW50IGJsdWUsIHVfaW50IHRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CisJc3RydWN0IGt5cm9mYl9pbmZvICpwYXIgPSBpbmZvLT5wYXI7CisKIAlpZiAocmVnbm8gPiAyNTUpCiAJCXJldHVybiAxOwkvKiBJbnZhbGlkIHJlZ2lzdGVyICovCiAKIAlpZiAocmVnbm8gPCAxNikgewogCQlzd2l0Y2ggKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgewogCQljYXNlIDE2OgotCQkJKCh1MTYqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9CisJCQlwYXItPnBhbGV0dGVbcmVnbm9dID0KIAkJCSAgICAgKHJlZCAgICYgMHhmODAwKSB8CiAJCQkgICAgKChncmVlbiAmIDB4ZmMwMCkgPj4gNSkgfAogCQkJICAgICgoYmx1ZSAgJiAweGY4MDApID4+IDExKTsKIAkJCWJyZWFrOwogCQljYXNlIDMyOgogCQkJcmVkID4+PSA4OyBncmVlbiA+Pj0gODsgYmx1ZSA+Pj0gODsgdHJhbnNwID4+PSA4OwotCQkJKCh1MzIqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9CisJCQlwYXItPnBhbGV0dGVbcmVnbm9dID0KIAkJCSAgICAodHJhbnNwIDw8IDI0KSB8IChyZWQgPDwgMTYpIHwgKGdyZWVuIDw8IDgpIHwgYmx1ZTsKIAkJCWJyZWFrOwogCQl9CkBAIC01ODYsOSArNTg2LDggQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IGt5cm9mYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLAotCQkJc3RydWN0IGZiX2luZm8gKmluZm8pCitzdGF0aWMgaW50IGt5cm9mYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCW92ZXJsYXlfY3JlYXRlIG9sX2NyZWF0ZTsKIAlvdmVybGF5X3ZpZXdwb3J0X3NldCBvbF92aWV3cG9ydF9zZXQ7CkBAIC02NzUsNiArNjc0LDcgQEAKIAkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm87CisJc3RydWN0IGt5cm9mYl9pbmZvICpjdXJyZW50cGFyOwogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKIAlpbnQgZXJyOwogCkBAIC02ODMsMTQgKzY4MywxMSBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNpemUgPSBzaXplb2Yoc3RydWN0IGZiX2luZm8pICsgc2l6ZW9mKHN0cnVjdCBreXJvZmJfaW5mbykgKyAxNiAqIHNpemVvZih1MzIpOwotCWluZm8gPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGt5cm9mYl9pbmZvKSwgJnBkZXYtPmRldik7CiAJaWYgKCFpbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW1lbXNldChpbmZvLCAwLCBzaXplKTsKLQotCWN1cnJlbnRwYXIgPSAoc3RydWN0IGt5cm9mYl9pbmZvICopKGluZm8gKyAxKTsKKwljdXJyZW50cGFyID0gaW5mby0+cGFyOwogCiAJa3lyb19maXguc21lbV9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKIAlreXJvX2ZpeC5zbWVtX2xlbiAgID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKQEAgLTcxNiw4ICs3MTMsNyBAQAogCiAJaW5mby0+ZmJvcHMJCT0gJmt5cm9mYl9vcHM7CiAJaW5mby0+Zml4CQk9IGt5cm9fZml4OwotCWluZm8tPnBhcgkJPSBjdXJyZW50cGFyOwotCWluZm8tPnBzZXVkb19wYWxldHRlCT0gKHZvaWQgKikoY3VycmVudHBhciArIDEpOworCWluZm8tPnBzZXVkb19wYWxldHRlCT0gY3VycmVudHBhci0+cGFsZXR0ZTsKIAlpbmZvLT5mbGFncwkJPSBGQklORk9fREVGQVVMVDsKIAogCVNldENvcmVDbG9ja1BMTChkZXZpY2VJbmZvLnBTVEdSZWcsIHBkZXYpOwpAQCAtNzQxLDcgKzczNyw2IEBACiAKIAlmYl9tZW1zZXQoaW5mby0+c2NyZWVuX2Jhc2UsIDAsIHNpemUpOwogCi0JaW5mby0+ZGV2aWNlID0gJnBkZXYtPmRldjsKIAlpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbykgPCAwKQogCQlnb3RvIG91dF91bm1hcDsKIApAQCAtNzU3LDcgKzc1Miw3IEBACiBvdXRfdW5tYXA6CiAJaW91bm1hcChjdXJyZW50cGFyLT5yZWdiYXNlKTsKIAlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKLQlrZnJlZShpbmZvKTsKKwlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogCiAJcmV0dXJuIC1FSU5WQUw7CiB9CkBAIC03NjUsNyArNzYwLDcgQEAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBreXJvZmJfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBreXJvZmJfaW5mbyAqcGFyID0gKHN0cnVjdCBreXJvZmJfaW5mbyAqKWluZm8tPnBhcjsKKwlzdHJ1Y3Qga3lyb2ZiX2luZm8gKnBhciA9IGluZm8tPnBhcjsKIAogCS8qIFJlc2V0IHRoZSBib2FyZCAqLwogCVN0b3BWVEcoZGV2aWNlSW5mby5wU1RHUmVnKTsKQEAgLTc4OSw3ICs3ODQsNyBAQAogCiAJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0Ja2ZyZWUoaW5mbyk7CisJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQga3lyb2ZiX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbGVvLmMgYi9kcml2ZXJzL3ZpZGVvL2xlby5jCmluZGV4IDQ5NDI4N2YuLmEyM2NmZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbGVvLmMKKysrIGIvZHJpdmVycy92aWRlby9sZW8uYwpAQCAtMzIsOSArMzIsOCBAQAogCQkJIHVuc2lnbmVkLCBzdHJ1Y3QgZmJfaW5mbyAqKTsKIHN0YXRpYyBpbnQgbGVvX2JsYW5rKGludCwgc3RydWN0IGZiX2luZm8gKik7CiAKLXN0YXRpYyBpbnQgbGVvX21tYXAoc3RydWN0IGZiX2luZm8gKiwgc3RydWN0IGZpbGUgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwotc3RhdGljIGludCBsZW9faW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwKLQkJICAgICB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgZmJfaW5mbyAqKTsKK3N0YXRpYyBpbnQgbGVvX21tYXAoc3RydWN0IGZiX2luZm8gKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOworc3RhdGljIGludCBsZW9faW9jdGwoc3RydWN0IGZiX2luZm8gKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKIHN0YXRpYyBpbnQgbGVvX3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqLCBzdHJ1Y3QgZmJfaW5mbyAqKTsKIAogLyoKQEAgLTM2Myw3ICszNjIsNyBAQAogCXsgLnNpemUgPSAwIH0KIH07CiAKLXN0YXRpYyBpbnQgbGVvX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3N0YXRpYyBpbnQgbGVvX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXN0cnVjdCBsZW9fcGFyICpwYXIgPSAoc3RydWN0IGxlb19wYXIgKilpbmZvLT5wYXI7CiAKQEAgLTM3Myw4ICszNzIsNyBAQAogCQkJCSAgdm1hKTsKIH0KIAotc3RhdGljIGludCBsZW9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCSAgICAgdW5zaWduZWQgbG9uZyBhcmcsIHN0cnVjdCBmYl9pbmZvICppbmZvKQorc3RhdGljIGludCBsZW9faW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBsZW9fcGFyICpwYXIgPSAoc3RydWN0IGxlb19wYXIgKikgaW5mby0+cGFyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2xvZ28vTWFrZWZpbGUgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vTWFrZWZpbGUKaW5kZXggZDAyNDRjMDQuLjRlZjVjZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbG9nby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vTWFrZWZpbGUKQEAgLTE2LDcgKzE2LDcgQEAKIAogIyBIb3cgdG8gZ2VuZXJhdGUgbG9nbydzCiAKLSMgVXNlIGxvZ28tY2ZpbGVzIHRvIHJldHJlaXZlIGxpc3Qgb2YgLmMgZmlsZXMgdG8gYmUgYnVpbHQKKyMgVXNlIGxvZ28tY2ZpbGVzIHRvIHJldHJpZXZlIGxpc3Qgb2YgLmMgZmlsZXMgdG8gYmUgYnVpbHQKIGxvZ28tY2ZpbGVzID0gJChub3RkaXIgJChwYXRzdWJzdCAlLiQoMiksICUuYywgXAogICAgICAgICAgICAgICAkKHdpbGRjYXJkICQoc3JjdHJlZSkvJChzcmMpLyokKDEpLiQoMikpKSkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYWNmYi5jIGIvZHJpdmVycy92aWRlby9tYWNmYi5jCmluZGV4IGNmYzc0OGUuLmU2Y2JkOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWFjZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL21hY2ZiLmMKQEAgLTYwOSwxOCArNjA5LDE5IEBACiAJfQogfQogCi12b2lkIF9faW5pdCBtYWNmYl9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBtYWNmYl9pbml0KHZvaWQpCiB7CiAJaW50IHZpZGVvX2NtYXBfbGVuLCB2aWRlb19pc19udWJ1cyA9IDA7CiAJc3RydWN0IG51YnVzX2RldiogbmRldiA9IE5VTEw7CiAJY2hhciAqb3B0aW9uID0gTlVMTDsKKwlpbnQgZXJyOwogCiAJaWYgKGZiX2dldF9vcHRpb25zKCJtYWNmYiIsICZvcHRpb24pKQogCQlyZXR1cm4gLUVOT0RFVjsKIAltYWNmYl9zZXR1cChvcHRpb24pOwogCiAJaWYgKCFNQUNIX0lTX01BQykgCi0JCXJldHVybjsKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBUaGVyZSBjYW4gb25seSBiZSBvbmUgaW50ZXJuYWwgdmlkZW8gY29udHJvbGxlciBhbnl3YXkgc28KIAkgICB3ZSdyZSBub3QgdG9vIHdvcnJpZWQgYWJvdXQgdGhpcyAqLwpAQCAtOTU4LDExICs5NTksMTEgQEAKIAogCWZiX2FsbG9jX2NtYXAoJmZiX2luZm8uY21hcCwgdmlkZW9fY21hcF9sZW4sIDApOwogCQotCWlmIChyZWdpc3Rlcl9mcmFtZWJ1ZmZlcigmZmJfaW5mbykgPCAwKQotCQlyZXR1cm47Ci0KLQlwcmludGsoImZiJWQ6ICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2VcbiIsCi0JICAgICAgIGZiX2luZm8ubm9kZSwgZmJfaW5mby5maXguaWQpOworCWVyciA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZmYl9pbmZvKTsKKwlpZiAoIWVycikKKwkJcHJpbnRrKCJmYiVkOiAlcyBmcmFtZSBidWZmZXIgZGV2aWNlXG4iLAorCQkgICAgICAgZmJfaW5mby5ub2RlLCBmYl9pbmZvLmZpeC5pZCk7CisJcmV0dXJuIGVycjsKIH0KIAogbW9kdWxlX2luaXQobWFjZmJfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmMgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmMKaW5kZXggMWU3NGY0Yy4uNDA1NWZmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYmFzZS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2Jhc2UuYwpAQCAtODY1LDkgKzg2NSw4IEBACiAJLm5hbWUJID0gIlBhbmVsbGluayBvdXRwdXQiLAogfTsKIAotc3RhdGljIGludCBtYXRyb3hmYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsCi0JCQkgIHN0cnVjdCBmYl9pbmZvICppbmZvKQorc3RhdGljIGludCBtYXRyb3hmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJTUlORk9fRlJPTV9JTkZPKGluZm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYmFzZS5oIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYmFzZS5oCmluZGV4IGE4YzQ3YWQuLjNhM2UxODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2Jhc2UuaAorKysgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmgKQEAgLTUwLDggKzUwLDYgQEAKICNpbmNsdWRlIDxhc20vbXRyci5oPgogI2VuZGlmCiAKLSNpbmNsdWRlICIuLi9jb25zb2xlL2ZiY29uLmgiCi0KICNpZiBkZWZpbmVkKENPTkZJR19QUENfUE1BQykKICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CkBAIC0zNTEsOCArMzQ5LDYgQEAKIAkJICAgICAgfSBvdXRwdXQ7CiB9OwogCi1leHRlcm4gc3RydWN0IGRpc3BsYXkgZmJfZGlzcGxheVtdOwotCiBzdHJ1Y3QgbWF0cm94X3N3aXRjaDsKIHN0cnVjdCBtYXRyb3hmYl9kcml2ZXI7CiBzdHJ1Y3QgbWF0cm94ZmJfZGhfZmJfaW5mbzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2NydGMyLmMgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9jcnRjMi5jCmluZGV4IGQ1MmQ3ZDguLjI3ZWI0YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2NydGMyLmMKKysrIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfY3J0YzIuYwpAQCAtNDE5LDExICs0MTksMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtYXRyb3hmYl9kaF9pb2N0bChzdHJ1Y3QgaW5vZGUqIGlub2RlLAotCQlzdHJ1Y3QgZmlsZSogZmlsZSwKK3N0YXRpYyBpbnQgbWF0cm94ZmJfZGhfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sCiAJCXVuc2lnbmVkIGludCBjbWQsCi0JCXVuc2lnbmVkIGxvbmcgYXJnLAotCQlzdHJ1Y3QgZmJfaW5mbyogaW5mbykgeworCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKICNkZWZpbmUgbTJpbmZvIChjb250YWluZXJfb2YoaW5mbywgc3RydWN0IG1hdHJveGZiX2RoX2ZiX2luZm8sIGZiY29uKSkKIAlNSU5GT19GUk9NKG0yaW5mby0+cHJpbWFyeV9kZXYpOwogCkBAIC00NTcsNyArNDU2LDcgQEAKIAkJY2FzZSBNQVRST1hGQl9HRVRfT1VUUFVUX01PREU6CiAJCWNhc2UgTUFUUk9YRkJfR0VUX0FMTF9PVVRQVVRTOgogCQkJewotCQkJCXJldHVybiBBQ0NFU1NfRkJJTkZPKGZiY29uLmZib3BzKS0+ZmJfaW9jdGwoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCAmQUNDRVNTX0ZCSU5GTyhmYmNvbikpOworCQkJCXJldHVybiBBQ0NFU1NfRkJJTkZPKGZiY29uLmZib3BzKS0+ZmJfaW9jdGwoJkFDQ0VTU19GQklORk8oZmJjb24pLCBjbWQsIGFyZyk7CiAJCQl9CiAJCWNhc2UgTUFUUk9YRkJfU0VUX09VVFBVVF9DT05ORUNUSU9OOgogCQkJewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfZzQ1MC5jIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfZzQ1MC5jCmluZGV4IDM1MDA4YWYuLmMxMjJkODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2c0NTAuYworKysgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9nNDUwLmMKQEAgLTIwLDYgKzIwLDggQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogCisjaW5jbHVkZSAibWF0cm94ZmJfZzQ1MC5oIgorCiAvKiBEZWZpbml0aW9uIG9mIHRoZSB2YXJpb3VzIGNvbnRyb2xzICovCiBzdHJ1Y3QgbWN0bCB7CiAJc3RydWN0IHY0bDJfcXVlcnljdHJsIGRlc2M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9tYXZlbi5jIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfbWF2ZW4uYwppbmRleCBhMWYyYzVlLi42MDE5NzEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9tYXZlbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX21hdmVuLmMKQEAgLTk2OCw3ICs5NjgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBtYXZlbl9wcm9ncmFtX3RpbW1pbmcoc3RydWN0IG1hdmVuX2RhdGEqIG1kLAorc3RhdGljIGludCBtYXZlbl9wcm9ncmFtX3RpbW1pbmcoc3RydWN0IG1hdmVuX2RhdGEqIG1kLAogCQljb25zdCBzdHJ1Y3QgbWF2ZW5yZWdzKiBtKSB7CiAJc3RydWN0IGkyY19jbGllbnQqIGMgPSBtZC0+Y2xpZW50OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9taXNjLmMgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9taXNjLmMKaW5kZXggZDlkM2U5Zi4uNDU1YTQ2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfbWlzYy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX21pc2MuYwpAQCAtMTkyLDExICsxOTIsOCBAQAogCXVuc2lnbmVkIGludCB3ZDsKIAl1bnNpZ25lZCBpbnQgZGl2aWRlcjsKIAlpbnQgaTsKLQlpbnQgZndpZHRoOwogCXN0cnVjdCBtYXRyb3hfaHdfc3RhdGUgKiBjb25zdCBodyA9ICZBQ0NFU1NfRkJJTkZPKGh3KTsKIAotCWZ3aWR0aCA9IDg7Ci0KIAlEQkcoX19GVU5DVElPTl9fKQogCiAJaHctPlNFUVswXSA9IDB4MDA7CkBAIC0yMzUsMTAgKzIzMiw3IEBACiAJaHctPkFUVFJbMTZdID0gMHg0MTsKIAlody0+QVRUUlsxN10gPSAweEZGOwogCWh3LT5BVFRSWzE4XSA9IDB4MEY7Ci0JaWYgKGZ3aWR0aCA9PSA5KQotCQlody0+QVRUUlsxOV0gPSAweDA4OwotCWVsc2UKLQkJaHctPkFUVFJbMTldID0gMHgwMDsKKwlody0+QVRUUlsxOV0gPSAweDAwOwogCWh3LT5BVFRSWzIwXSA9IDB4MDA7CiAKIAloZCA9IG0tPkhEaXNwbGF5ID4+IDM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL25lb2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL25lb2ZiLmMKaW5kZXggODQ4NmU3Ny4uNzQ3NjAyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9uZW9mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbmVvZmIuYwpAQCAtNDg1LDcgKzQ4NSw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IG5lbzIyMDBfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgbmVvZmJfcGFyICpwYXIgPSAoc3RydWN0IG5lb2ZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IG5lb2ZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCWludCB3YWl0Y3ljbGVzOwogCiAJd2hpbGUgKHJlYWRsKCZwYXItPm5lbzIyMDAtPmJsdFN0YXQpICYgMSkKQEAgLTUyNSw3ICs1MjUsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIG5lbzIyMDBfYWNjZWxfaW5pdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKIAkJCQkgICAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKIHsKLQlzdHJ1Y3QgbmVvZmJfcGFyICpwYXIgPSAoc3RydWN0IG5lb2ZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IG5lb2ZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCU5lbzIyMDAgX19pb21lbSAqbmVvMjIwMCA9IHBhci0+bmVvMjIwMDsKIAl1MzIgYmx0TW9kLCBwaXRjaDsKIApAQCAtNTYwLDcgKzU2MCw3IEBACiBzdGF0aWMgaW50CiBuZW9mYl9vcGVuKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcikKIHsKLQlzdHJ1Y3QgbmVvZmJfcGFyICpwYXIgPSAoc3RydWN0IG5lb2ZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IG5lb2ZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCWludCBjbnQgPSBhdG9taWNfcmVhZCgmcGFyLT5yZWZfY291bnQpOwogCiAJaWYgKCFjbnQpIHsKQEAgLTU3NSw3ICs1NzUsNyBAQAogc3RhdGljIGludAogbmVvZmJfcmVsZWFzZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpCiB7Ci0Jc3RydWN0IG5lb2ZiX3BhciAqcGFyID0gKHN0cnVjdCBuZW9mYl9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBuZW9mYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlpbnQgY250ID0gYXRvbWljX3JlYWQoJnBhci0+cmVmX2NvdW50KTsKIAogCWlmICghY250KQpAQCAtNTkwLDcgKzU5MCw3IEBACiBzdGF0aWMgaW50CiBuZW9mYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCBuZW9mYl9wYXIgKnBhciA9IChzdHJ1Y3QgbmVvZmJfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgbmVvZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJdW5zaWduZWQgaW50IHBpeGNsb2NrID0gdmFyLT5waXhjbG9jazsKIAlzdHJ1Y3QgeHRpbWluZ3MgdGltaW5nczsKIAlpbnQgbWVtbGVuLCB2cmFtbGVuOwpAQCAtNzU3LDcgKzc1Nyw3IEBACiAKIHN0YXRpYyBpbnQgbmVvZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgbmVvZmJfcGFyICpwYXIgPSAoc3RydWN0IG5lb2ZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IG5lb2ZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXN0cnVjdCB4dGltaW5ncyB0aW1pbmdzOwogCXVuc2lnbmVkIGNoYXIgdGVtcDsKIAlpbnQgaSwgY2xvY2tfaGkgPSAwOwpAQCAtODUzLDcgKzg1Myw3IEBACiAJLyogSWYgdGhlIHVzZXIgZGlkIG5vdCBzcGVjaWZ5IGFueSBkaXNwbGF5IGRldmljZXMsIHRoZW4uLi4gKi8KIAlpZiAocGFyLT5QYW5lbERpc3BDbnRsUmVnMSA9PSAweDAwKSB7CiAJCS8qIERlZmF1bHQgdG8gaW50ZXJuYWwgKGkuZS4sIExDRCkgb25seS4gKi8KLQkJcGFyLT5QYW5lbERpc3BDbnRsUmVnMSB8PSAweDAyOworCQlwYXItPlBhbmVsRGlzcENudGxSZWcxID0gdmdhX3JnZngoTlVMTCwgMHgyMCkgJiAweDAzOwogCX0KIAogCS8qIElmIHdlIGFyZSB1c2luZyBhIGZpeGVkIG1vZGUsIHRoZW4gdGVsbCB0aGUgY2hpcCB3ZSBhcmUuICovCkBAIC0xMjE2LDcgKzEyMTYsNyBAQAogc3RhdGljIHZvaWQgbmVvZmJfdXBkYXRlX3N0YXJ0KHN0cnVjdCBmYl9pbmZvICppbmZvLAogCQkJICAgICAgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQogewotCXN0cnVjdCBuZW9mYl9wYXIgKnBhciA9IChzdHJ1Y3QgbmVvZmJfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgbmVvZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJc3RydWN0IHZnYXN0YXRlICpzdGF0ZSA9ICZwYXItPnN0YXRlOwogCWludCBvbGRFeHRDUlREaXNwQWRkcjsKIAlpbnQgQmFzZTsKQEAgLTEzMzEsNyArMTMzMSw3IEBACiAJICogIHdtcy4uLkVuYWJsZSBWRVNBIERQTVMgY29tcGF0aWJsZSBwb3dlcmRvd24gbW9kZQogCSAqICBydW4gInNldHRlcm0gLXBvd2Vyc2F2ZSBwb3dlcmRvd24iIHRvIHRha2UgYWR2YW50YWdlCiAJICovCi0Jc3RydWN0IG5lb2ZiX3BhciAqcGFyID0gKHN0cnVjdCBuZW9mYl9wYXIgKilpbmZvLT5wYXI7CisJc3RydWN0IG5lb2ZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCWludCBzZXFmbGFncywgbGNkZmxhZ3MsIGRwbXNmbGFncywgcmVnOwogCiAJc3dpdGNoIChibGFua19tb2RlKSB7CkBAIC0xNDA0LDcgKzE0MDQsNyBAQAogc3RhdGljIHZvaWQKIG5lbzIyMDBfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCkKIHsKLQlzdHJ1Y3QgbmVvZmJfcGFyICpwYXIgPSAoc3RydWN0IG5lb2ZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IG5lb2ZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXVfbG9uZyBkc3QsIHJvcDsKIAogCWRzdCA9IHJlY3QtPmR4ICsgcmVjdC0+ZHkgKiBpbmZvLT52YXIueHJlc192aXJ0dWFsOwpAQCAtMTQ0MCw3ICsxNDQwLDcgQEAKIG5lbzIyMDBfY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqYXJlYSkKIHsKIAl1MzIgc3ggPSBhcmVhLT5zeCwgc3kgPSBhcmVhLT5zeSwgZHggPSBhcmVhLT5keCwgZHkgPSBhcmVhLT5keTsKLQlzdHJ1Y3QgbmVvZmJfcGFyICpwYXIgPSAoc3RydWN0IG5lb2ZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IG5lb2ZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXVfbG9uZyBzcmMsIGRzdCwgYmx0Q250bDsKIAogCWJsdENudGwgPSBORU9fQkMzX0ZJRk9fRU4gfCBORU9fQkMzX1NLSVBfTUFQUElORyB8IDB4MEMwMDAwOwpAQCAtMTQ3Miw3ICsxNDcyLDcgQEAKIHN0YXRpYyB2b2lkCiBuZW8yMjAwX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSkKIHsKLQlzdHJ1Y3QgbmVvZmJfcGFyICpwYXIgPSAoc3RydWN0IG5lb2ZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IG5lb2ZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCWludCBzX3BpdGNoID0gKGltYWdlLT53aWR0aCAqIGltYWdlLT5kZXB0aCArIDcpID4+IDM7CiAJaW50IHNjYW5fYWxpZ24gPSBpbmZvLT5waXhtYXAuc2Nhbl9hbGlnbiAtIDE7CiAJaW50IGJ1Zl9hbGlnbiA9IGluZm8tPnBpeG1hcC5idWZfYWxpZ24gLSAxOwpAQCAtMTY4Niw3ICsxNjg2LDcgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0IG5lb19tYXBfbW1pbyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKIAkJCQkgIHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IG5lb2ZiX3BhciAqcGFyID0gKHN0cnVjdCBuZW9mYl9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBuZW9mYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAogCURCRygibmVvX21hcF9tbWlvIik7CiAKQEAgLTE3MzMsNyArMTczMyw3IEBACiAKIHN0YXRpYyB2b2lkIG5lb191bm1hcF9tbWlvKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCBuZW9mYl9wYXIgKnBhciA9IChzdHJ1Y3QgbmVvZmJfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgbmVvZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKIAlEQkcoIm5lb191bm1hcF9tbWlvIik7CiAKQEAgLTE3OTYsNyArMTc5Niw3IEBACiAKICNpZmRlZiBDT05GSUdfTVRSUgogCXsKLQkJc3RydWN0IG5lb2ZiX3BhciAqcGFyID0gKHN0cnVjdCBuZW9mYl9wYXIgKikgaW5mby0+cGFyOworCQlzdHJ1Y3QgbmVvZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKIAkJbXRycl9kZWwocGFyLT5tdHJyLCBpbmZvLT5maXguc21lbV9zdGFydCwKIAkJCSBpbmZvLT5maXguc21lbV9sZW4pOwpAQCAtMTgxMSw3ICsxODExLDcgQEAKIAogc3RhdGljIGludCBfX2RldmluaXQgbmVvX3NjYW5fbW9uaXRvcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgbmVvZmJfcGFyICpwYXIgPSAoc3RydWN0IG5lb2ZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IG5lb2ZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXVuc2lnbmVkIGNoYXIgdHlwZSwgZGlzcGxheTsKIAlpbnQgdzsKIApAQCAtMTg5MCw3ICsxODkwLDcgQEAKIAogc3RhdGljIGludCBfX2RldmluaXQgbmVvX2luaXRfaHcoc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IG5lb2ZiX3BhciAqcGFyID0gKHN0cnVjdCBuZW9mYl9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBuZW9mYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlpbnQgdmlkZW9SYW0gPSA4OTY7CiAJaW50IG1heENsb2NrID0gNjUwMDA7CiAJaW50IEN1cnNvck1lbSA9IDEwMjQ7CkBAIC0yMDE0LDcgKzIwMTQsNyBAQAogCXN0cnVjdCBmYl9pbmZvICppbmZvOwogCXN0cnVjdCBuZW9mYl9wYXIgKnBhcjsKIAotCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IG5lb2ZiX3BhcikgKyBzaXplb2YodTMyKSAqIDI1NiwgJmRldi0+ZGV2KTsKKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZW9mYl9wYXIpLCAmZGV2LT5kZXYpOwogCiAJaWYgKCFpbmZvKQogCQlyZXR1cm4gTlVMTDsKQEAgLTIwODEsNyArMjA4MSw3IEBACiAJaW5mby0+Zml4LmFjY2VsID0gaWQtPmRyaXZlcl9kYXRhOwogCiAJaW5mby0+ZmJvcHMgPSAmbmVvZmJfb3BzOwotCWluZm8tPnBzZXVkb19wYWxldHRlID0gKHZvaWQgKikgKHBhciArIDEpOworCWluZm8tPnBzZXVkb19wYWxldHRlID0gcGFyLT5wYWxldHRlOwogCXJldHVybiBpbmZvOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9ody5jIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfaHcuYwppbmRleCBiOTg5MzU4Li45OWMzYThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9ody5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2h3LmMKQEAgLTUyLDYgKzUyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlICJudl90eXBlLmgiCiAjaW5jbHVkZSAibnZfbG9jYWwuaCIKKyNpbmNsdWRlICJudl9wcm90by5oIgogCiB2b2lkIE5WTG9ja1VubG9jayhzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyLCBpbnQgTG9jaykKIHsKQEAgLTg0OCw3ICs4NDksNyBAQAogCQkgICAgaW50IHdpZHRoLAogCQkgICAgaW50IGhEaXNwbGF5U2l6ZSwgaW50IGhlaWdodCwgaW50IGRvdENsb2NrLCBpbnQgZmxhZ3MpCiB7Ci0JaW50IHBpeGVsRGVwdGgsIFZDbGs7CisJaW50IHBpeGVsRGVwdGgsIFZDbGsgPSAwOwogCS8qCiAJICogU2F2ZSBtb2RlIHBhcmFtZXRlcnMuCiAJICovCkBAIC05MzgsMTUgKzkzOSwyNCBAQAogCiAJaWYgKHBhci0+QXJjaGl0ZWN0dXJlID09IE5WX0FSQ0hfMDQpIHsKIAkJTlZfV1IzMihwYXItPlBGQiwgMHgwMjAwLCBzdGF0ZS0+Y29uZmlnKTsKLQl9IGVsc2UgaWYgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDA5MCkgewotCQlmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykgewotCQkJTlZfV1IzMihwYXItPlBGQiwgMHgwNjAwICsgKGkgKiAweDEwKSwgMCk7Ci0JCQlOVl9XUjMyKHBhci0+UEZCLCAweDA2MDQgKyAoaSAqIDB4MTApLCBwYXItPkZiTWFwU2l6ZSAtIDEpOwotCQl9Ci0JfSBlbHNlIHsKKwl9IGVsc2UgaWYgKChwYXItPkFyY2hpdGVjdHVyZSA8IE5WX0FSQ0hfNDApIHx8CisJCSAgIChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDA0MCkgewogCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAJCQlOVl9XUjMyKHBhci0+UEZCLCAweDAyNDAgKyAoaSAqIDB4MTApLCAwKTsKLQkJCU5WX1dSMzIocGFyLT5QRkIsIDB4MDI0NCArIChpICogMHgxMCksIHBhci0+RmJNYXBTaXplIC0gMSk7CisJCQlOVl9XUjMyKHBhci0+UEZCLCAweDAyNDQgKyAoaSAqIDB4MTApLAorCQkJCXBhci0+RmJNYXBTaXplIC0gMSk7CisJCX0KKwl9IGVsc2UgeworCQlpbnQgcmVnaW9ucyA9IDEyOworCisJCWlmICgoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMDkwKSB8fAorCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDFEMCkgfHwKKwkJICAgICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyOTApKQorCQkJcmVnaW9ucyA9IDE1OworCQlmb3IoaSA9IDA7IGkgPCByZWdpb25zOyBpKyspIHsKKwkJCU5WX1dSMzIocGFyLT5QRkIsIDB4MDYwMCArIChpICogMHgxMCksIDApOworCQkJTlZfV1IzMihwYXItPlBGQiwgMHgwNjA0ICsgKGkgKiAweDEwKSwKKwkJCQlwYXItPkZiTWFwU2l6ZSAtIDEpOwogCQl9CiAJfQogCkBAIC0xMTgyLDExICsxMTkyLDE3IEBACiAJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDA2MDgsIDB4RkZGRkZGRkYpOwogCQl9IGVsc2UgewogCQkJaWYgKHBhci0+QXJjaGl0ZWN0dXJlID49IE5WX0FSQ0hfNDApIHsKKwkJCQl1MzIgdG1wOworCiAJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHgwMDg0LCAweDQwMTI4N2MwKTsKIAkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDAwOEMsIDB4NjBkZTgwNTEpOwogCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsIDB4MDA5MCwgMHgwMDAwODAwMCk7CiAJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHgwNjEwLCAweDAwYmUzYzVmKTsKIAorCQkJCXRtcCA9IE5WX1JEMzIocGFyLT5SRUdTLCAweDE1NDApICYgMHhmZjsKKwkJCQlmb3IoaSA9IDA7IHRtcCAmJiAhKHRtcCAmIDEpOyB0bXAgPj49IDEsIGkrKyk7CisJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHg1MDAwLCBpKTsKKwogCQkJCWlmICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAwNDApIHsKIAkJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHgwOWIwLAogCQkJCQkJMHg4MzI4MGZmZik7CkBAIC0xMjExLDYgKzEyMjcsNyBAQAogCQkJCQkJMHhmZmZmN2ZmZik7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgMHgwMEMwOgorCQkJCWNhc2UgMHgwMTIwOgogCQkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDA4MjgsCiAJCQkJCQkweDAwNzU5NmZmKTsKIAkJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHgwODJDLApAQCAtMTI0NSw2ICsxMjYyLDcgQEAKIAkJCQkJCTB4MDAxMDAwMDApOwogCQkJCQlicmVhazsKIAkJCQljYXNlIDB4MDA5MDoKKwkJCQljYXNlIDB4MDI5MDoKIAkJCQkJTlZfV1IzMihwYXItPlBSQU1EQUMsIDB4MDYwOCwKIAkJCQkJCU5WX1JEMzIocGFyLT5QUkFNREFDLCAweDA2MDgpIHwKIAkJCQkJCTB4MDAxMDAwMDApOwpAQCAtMTMxMCwxNCArMTMyOCw0NCBAQAogCQkJCX0KIAkJCX0KIAotCQkJaWYgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDA5MCkgewotCQkJCWZvciAoaSA9IDA7IGkgPCA2MDsgaSsrKQotCQkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDBEMDAgKyBpLAotCQkJCQkJTlZfUkQzMihwYXItPlBGQiwgMHgwNjAwICsgaSkpOworCQkJaWYgKChwYXItPkFyY2hpdGVjdHVyZSA8IE5WX0FSQ0hfNDApIHx8CisJCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDA0MCkpIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDA5MDAgKyBpKjQsCisJCQkJCQlOVl9SRDMyKHBhci0+UEZCLCAweDAyNDAgK2kqNCkpOworCQkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDY5MDAgKyBpKjQsCisJCQkJCQlOVl9SRDMyKHBhci0+UEZCLCAweDAyNDAgK2kqNCkpOworCQkJCX0KIAkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0JCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsIDB4MDkwMCArIGksCi0JCQkJCQlOVl9SRDMyKHBhci0+UEZCLCAweDAyNDAgKyBpKSk7CisJCQkJaWYgKCgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAwOTApIHx8CisJCQkJICAgICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAxRDApIHx8CisJCQkJICAgICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyOTApKSB7CisJCQkJCWZvciAoaSA9IDA7IGkgPCA2MDsgaSsrKSB7CisJCQkJCQlOVl9XUjMyKHBhci0+UEdSQVBILAorCQkJCQkJCTB4MEQwMCArIGkqNCwKKwkJCQkJCQlOVl9SRDMyKHBhci0+UEZCLAorCQkJCQkJCQkweDA2MDAgKyBpKjQpKTsKKwkJCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsCisJCQkJCQkJMHg2OTAwICsgaSo0LAorCQkJCQkJCU5WX1JEMzIocGFyLT5QRkIsCisJCQkJCQkJCTB4MDYwMCArIGkqNCkpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJZm9yIChpID0gMDsgaSA8IDQ4OyBpKyspIHsKKwkJCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsCisJCQkJCQkJMHgwOTAwICsgaSo0LAorCQkJCQkJCU5WX1JEMzIocGFyLT5QRkIsCisJCQkJCQkJCTB4MDYwMCArIGkqNCkpOworCQkJCQkJaWYoKChwYXItPkNoaXBzZXQgJiAweGZmZjApCisJCQkJCQkgICAgIT0gMHgwMTYwKSAmJgorCQkJCQkJICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApCisJCQkJCQkgICAgIT0gMHgwMjIwKSkKKwkJCQkJCQlOVl9XUjMyKHBhci0+UEdSQVBILAorCQkJCQkJCQkweDY5MDAgKyBpKjQsCisJCQkJCQkJCU5WX1JEMzIocGFyLT5QRkIsCisJCQkJCQkJCQkweDA2MDAgKyBpKjQpKTsKKwkJCQkJfQorCQkJCX0KIAkJCX0KIAogCQkJaWYgKHBhci0+QXJjaGl0ZWN0dXJlID49IE5WX0FSQ0hfNDApIHsKQEAgLTEzMzgsNyArMTM4Niw5IEBACiAJCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsIDB4MDg2OCwKIAkJCQkJCXBhci0+RmJNYXBTaXplIC0gMSk7CiAJCQkJfSBlbHNlIHsKLQkJCQkJaWYoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMDkwKSB7CisJCQkJCWlmICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAwOTAgfHwKKwkJCQkJICAgIChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDFEMCB8fAorCQkJCQkgICAgKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMjkwKSB7CiAJCQkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDBERjAsCiAJCQkJCQkJTlZfUkQzMihwYXItPlBGQiwgMHgwMjAwKSk7CiAJCQkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDBERjQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9pMmMuYyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2kyYy5jCmluZGV4IDEyZjI4ODQuLmJkOWVjYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2kyYy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2kyYy5jCkBAIC00Niw3ICs0Niw3IEBACiAKIHN0YXRpYyB2b2lkIG52aWRpYV9ncGlvX3NldHNkYSh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCiB7Ci0Jc3RydWN0IG52aWRpYV9pMmNfY2hhbiAqY2hhbiA9IChzdHJ1Y3QgbnZpZGlhX2kyY19jaGFuICopZGF0YTsKKwlzdHJ1Y3QgbnZpZGlhX2kyY19jaGFuICpjaGFuID0gZGF0YTsKIAlzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyID0gY2hhbi0+cGFyOwogCXUzMiB2YWw7CiAKQEAgLTY0LDcgKzY0LDcgQEAKIAogc3RhdGljIGludCBudmlkaWFfZ3Bpb19nZXRzY2wodm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgbnZpZGlhX2kyY19jaGFuICpjaGFuID0gKHN0cnVjdCBudmlkaWFfaTJjX2NoYW4gKilkYXRhOworCXN0cnVjdCBudmlkaWFfaTJjX2NoYW4gKmNoYW4gPSBkYXRhOwogCXN0cnVjdCBudmlkaWFfcGFyICpwYXIgPSBjaGFuLT5wYXI7CiAJdTMyIHZhbCA9IDA7CiAKQEAgLTc5LDcgKzc5LDcgQEAKIAogc3RhdGljIGludCBudmlkaWFfZ3Bpb19nZXRzZGEodm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgbnZpZGlhX2kyY19jaGFuICpjaGFuID0gKHN0cnVjdCBudmlkaWFfaTJjX2NoYW4gKilkYXRhOworCXN0cnVjdCBudmlkaWFfaTJjX2NoYW4gKmNoYW4gPSBkYXRhOwogCXN0cnVjdCBudmlkaWFfcGFyICpwYXIgPSBjaGFuLT5wYXI7CiAJdTMyIHZhbCA9IDA7CiAKQEAgLTEzNiwxMyArMTM2LDEzIEBACiAJcGFyLT5jaGFuWzJdLnBhciA9IHBhcjsKIAogCXBhci0+Y2hhblswXS5kZGNfYmFzZSA9IDB4M2U7Ci0JbnZpZGlhX3NldHVwX2kyY19idXMoJnBhci0+Y2hhblswXSwgIkJVUzEiKTsKKwludmlkaWFfc2V0dXBfaTJjX2J1cygmcGFyLT5jaGFuWzBdLCAibnZpZGlhICMwIik7CiAKIAlwYXItPmNoYW5bMV0uZGRjX2Jhc2UgPSAweDM2OwotCW52aWRpYV9zZXR1cF9pMmNfYnVzKCZwYXItPmNoYW5bMV0sICJCVVMyIik7CisJbnZpZGlhX3NldHVwX2kyY19idXMoJnBhci0+Y2hhblsxXSwgIm52aWRpYSAjMSIpOwogCiAJcGFyLT5jaGFuWzJdLmRkY19iYXNlID0gMHg1MDsKLQludmlkaWFfc2V0dXBfaTJjX2J1cygmcGFyLT5jaGFuWzJdLCAiQlVTMyIpOworCW52aWRpYV9zZXR1cF9pMmNfYnVzKCZwYXItPmNoYW5bMl0sICJudmlkaWEgIzIiKTsKIH0KIAogdm9pZCBudmlkaWFfZGVsZXRlX2kyY19idXNzZXMoc3RydWN0IG52aWRpYV9wYXIgKnBhcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3Byb3RvLmggYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9wcm90by5oCmluZGV4IDMzNTMxMDMuLmIxNDlhNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3Byb3RvLmgKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfcHJvdG8uaApAQCAtNCw3ICs0LDcgQEAKICNkZWZpbmUgX19OVl9QUk9UT19IX18KIAogLyogaW4gbnZfc2V0dXAuYyAqLwotdm9pZCBOVkNvbW1vblNldHVwKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK2ludCBOVkNvbW1vblNldHVwKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIHZvaWQgTlZXcml0ZUNydGMoc3RydWN0IG52aWRpYV9wYXIgKnBhciwgdTggaW5kZXgsIHU4IHZhbHVlKTsKIHU4IE5WUmVhZENydGMoc3RydWN0IG52aWRpYV9wYXIgKnBhciwgdTggaW5kZXgpOwogdm9pZCBOVldyaXRlR3Ioc3RydWN0IG52aWRpYV9wYXIgKnBhciwgdTggaW5kZXgsIHU4IHZhbHVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3NldHVwLmMgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9zZXR1cC5jCmluZGV4IDFmMDZhOWYuLmExOGE5YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3NldHVwLmMKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfc2V0dXAuYwpAQCAtMjg1LDI4ICsyODUsMzQgQEAKIAkJCXBhci0+Q3J5c3RhbEZyZXFLSHogPSAyNzAwMDsKIAl9CiAKLQlwYXItPkN1cnNvclN0YXJ0ID0gKHBhci0+UmFtQW1vdW50S0J5dGVzIC0gOTYpICogMTAyNDsKIAlwYXItPkNVUlNPUiA9IE5VTEw7CS8qIGNhbid0IHNldCB0aGlzIGhlcmUgKi8KIAlwYXItPk1pblZDbG9ja0ZyZXFLSHogPSAxMjAwMDsKIAlwYXItPk1heFZDbG9ja0ZyZXFLSHogPSBwYXItPnR3b1N0YWdlUExMID8gNDAwMDAwIDogMzUwMDAwOwogfQogCi12b2lkIE5WQ29tbW9uU2V0dXAoc3RydWN0IGZiX2luZm8gKmluZm8pCitpbnQgTlZDb21tb25TZXR1cChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyID0gaW5mby0+cGFyOwotCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2YXI7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXI7CiAJdTE2IGltcGxlbWVudGF0aW9uID0gcGFyLT5DaGlwc2V0ICYgMHgwZmYwOwogCXU4ICplZGlkQSA9IE5VTEwsICplZGlkQiA9IE5VTEw7Ci0Jc3RydWN0IGZiX21vbnNwZWNzIG1vbml0b3JBLCBtb25pdG9yQjsKKwlzdHJ1Y3QgZmJfbW9uc3BlY3MgKm1vbml0b3JBLCAqbW9uaXRvckI7CiAJc3RydWN0IGZiX21vbnNwZWNzICptb25BID0gTlVMTCwgKm1vbkIgPSBOVUxMOwogCWludCBtb2JpbGUgPSAwOwogCWludCB0dkEgPSAwOwogCWludCB0dkIgPSAwOwogCWludCBGbGF0UGFuZWwgPSAtMTsJLyogcmVhbGx5IG1lYW5zIHRoZSBDUlRDIGlzIHNsYXZlZCAqLwogCWludCBUZWxldmlzaW9uID0gMDsKKwlpbnQgZXJyID0gMDsKIAotCW1lbXNldCgmbW9uaXRvckEsIDAsIHNpemVvZihzdHJ1Y3QgZmJfbW9uc3BlY3MpKTsKLQltZW1zZXQoJm1vbml0b3JCLCAwLCBzaXplb2Yoc3RydWN0IGZiX21vbnNwZWNzKSk7CisJdmFyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvKSwgR0ZQX0tFUk5FTCk7CisJbW9uaXRvckEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZmJfbW9uc3BlY3MpLCBHRlBfS0VSTkVMKTsKKwltb25pdG9yQiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmYl9tb25zcGVjcyksIEdGUF9LRVJORUwpOworCisJaWYgKCF2YXIgfHwgIW1vbml0b3JBIHx8ICFtb25pdG9yQikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGRvbmU7CisJfQogCiAJcGFyLT5QUkFNSU4gPSBwYXItPlJFR1MgKyAoMHgwMDcxMDAwMCAvIDQpOwogCXBhci0+UENSVEMwID0gcGFyLT5SRUdTICsgKDB4MDA2MDAwMDAgLyA0KTsKQEAgLTM4Miw2ICszODgsOCBAQAogCWNhc2UgMHgwMTQ2OgogCWNhc2UgMHgwMTQ3OgogCWNhc2UgMHgwMTQ4OgorCWNhc2UgMHgwMDk4OgorCWNhc2UgMHgwMDk5OgogCQltb2JpbGUgPSAxOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtNDA2LDkgKzQxNCw5IEBACiAJCXBhci0+Q1JUQ251bWJlciA9IDA7CiAJCWlmIChudmlkaWFfcHJvYmVfaTJjX2Nvbm5lY3RvcihpbmZvLCAxLCAmZWRpZEEpKQogCQkJbnZpZGlhX3Byb2JlX29mX2Nvbm5lY3RvcihpbmZvLCAxLCAmZWRpZEEpOwotCQlpZiAoZWRpZEEgJiYgIWZiX3BhcnNlX2VkaWQoZWRpZEEsICZ2YXIpKSB7CisJCWlmIChlZGlkQSAmJiAhZmJfcGFyc2VfZWRpZChlZGlkQSwgdmFyKSkgewogCQkJcHJpbnRrKCJudmlkaWFmYjogRURJRCBmb3VuZCBmcm9tIEJVUzFcbiIpOwotCQkJbW9uQSA9ICZtb25pdG9yQTsKKwkJCW1vbkEgPSBtb25pdG9yQTsKIAkJCWZiX2VkaWRfdG9fbW9uc3BlY3MoZWRpZEEsIG1vbkEpOwogCQkJRmxhdFBhbmVsID0gKG1vbkEtPmlucHV0ICYgRkJfRElTUF9EREkpID8gMSA6IDA7CiAKQEAgLTQ5NCwxNyArNTAyLDE3IEBACiAKIAkJaWYgKG52aWRpYV9wcm9iZV9pMmNfY29ubmVjdG9yKGluZm8sIDEsICZlZGlkQSkpCiAJCQludmlkaWFfcHJvYmVfb2ZfY29ubmVjdG9yKGluZm8sIDEsICZlZGlkQSk7Ci0JCWlmIChlZGlkQSAmJiAhZmJfcGFyc2VfZWRpZChlZGlkQSwgJnZhcikpIHsKKwkJaWYgKGVkaWRBICYmICFmYl9wYXJzZV9lZGlkKGVkaWRBLCB2YXIpKSB7CiAJCQlwcmludGsoIm52aWRpYWZiOiBFRElEIGZvdW5kIGZyb20gQlVTMVxuIik7Ci0JCQltb25BID0gJm1vbml0b3JBOworCQkJbW9uQSA9IG1vbml0b3JBOwogCQkJZmJfZWRpZF90b19tb25zcGVjcyhlZGlkQSwgbW9uQSk7CiAJCX0KIAogCQlpZiAobnZpZGlhX3Byb2JlX2kyY19jb25uZWN0b3IoaW5mbywgMiwgJmVkaWRCKSkKIAkJCW52aWRpYV9wcm9iZV9vZl9jb25uZWN0b3IoaW5mbywgMiwgJmVkaWRCKTsKLQkJaWYgKGVkaWRCICYmICFmYl9wYXJzZV9lZGlkKGVkaWRCLCAmdmFyKSkgeworCQlpZiAoZWRpZEIgJiYgIWZiX3BhcnNlX2VkaWQoZWRpZEIsIHZhcikpIHsKIAkJCXByaW50aygibnZpZGlhZmI6IEVESUQgZm91bmQgZnJvbSBCVVMyXG4iKTsKLQkJCW1vbkIgPSAmbW9uaXRvckI7CisJCQltb25CID0gbW9uaXRvckI7CiAJCQlmYl9lZGlkX3RvX21vbnNwZWNzKGVkaWRCLCBtb25CKTsKIAkJfQogCkBAIC02MzksNCArNjQ3LDkgQEAKIAogCWtmcmVlKGVkaWRBKTsKIAlrZnJlZShlZGlkQik7Citkb25lOgorCWtmcmVlKHZhcik7CisJa2ZyZWUobW9uaXRvckEpOworCWtmcmVlKG1vbml0b3JCKTsKKwlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZpZGlhLmMgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udmlkaWEuYwppbmRleCBiZWUwOWM2Li5kYmNiODk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udmlkaWEuYworKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udmlkaWEuYwpAQCAtMjg0LDYgKzI4NCwxNiBAQAogCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKIAl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfNjIwMCwKIAkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lFX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV82ODAwX0FMVDEsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJRV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfNjYwMF9BTFQxLAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSUVfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFXzY2MDBfQUxUMiwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lFX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV82MjAwX0FMVDEsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJRV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfNjgwMF9HVCwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCiAJe1BDSV9WRU5ET1JfSURfTlZJRElBLCAweDAyNTIsCiAJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAogCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgMHgwMzEzLApAQCAtNDE4LDYgKzQyOCw3IEBACiBzdGF0aWMgaW50IG5vc2NhbGUgX19kZXZpbml0ZGF0YSA9IDA7CiBzdGF0aWMgaW50IHBhbmVsdHdlYWsgX19kZXZpbml0ZGF0YSA9IDA7CiBzdGF0aWMgaW50IHZyYW0gX19kZXZpbml0ZGF0YSA9IDA7CitzdGF0aWMgaW50IGJwcCBfX2RldmluaXRkYXRhID0gODsKICNpZmRlZiBDT05GSUdfTVRSUgogc3RhdGljIGludCBub210cnIgX19kZXZpbml0ZGF0YSA9IDA7CiAjZW5kaWYKQEAgLTQ4NSw3ICs0OTYsNyBAQAogCiBzdGF0aWMgaW50IG52aWRpYV9zZXRfYmFja2xpZ2h0X2VuYWJsZShpbnQgb24sIGludCBsZXZlbCwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyID0gKHN0cnVjdCBudmlkaWFfcGFyICopZGF0YTsKKwlzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyID0gZGF0YTsKIAl1MzIgdG1wX3BjcnQsIHRtcF9wbWMsIGZwY29udHJvbDsKIAogCXRtcF9wbWMgPSBOVl9SRDMyKHBhci0+UE1DLCAweDEwRjApICYgMHgwMDAwRkZGRjsKQEAgLTEzODIsMjQgKzEzOTMsMzYgQEAKIAkJCQkgaW5mby0+bW9uc3BlY3MubW9kZWRiX2xlbiwgJmluZm8tPm1vZGVsaXN0KTsKIAlmYl92YXJfdG9fdmlkZW9tb2RlKCZtb2RlZGIsICZudmlkaWFmYl9kZWZhdWx0X3Zhcik7CiAKKwlzd2l0Y2ggKGJwcCkgeworCWNhc2UgMCAuLi4gODoKKwkJYnBwID0gODsKKwkJYnJlYWs7CisJY2FzZSA5IC4uLiAxNjoKKwkJYnBwID0gMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJwcCA9IDMyOworCQlicmVhazsKKwl9CisKIAlpZiAoc3BlY3MtPm1vZGVkYiAhPSBOVUxMKSB7CiAJCXN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGVkYjsKIAogCQltb2RlZGIgPSBmYl9maW5kX2Jlc3RfZGlzcGxheShzcGVjcywgJmluZm8tPm1vZGVsaXN0KTsKIAkJZmJfdmlkZW9tb2RlX3RvX3ZhcigmbnZpZGlhZmJfZGVmYXVsdF92YXIsIG1vZGVkYik7Ci0JCW52aWRpYWZiX2RlZmF1bHRfdmFyLmJpdHNfcGVyX3BpeGVsID0gODsKKwkJbnZpZGlhZmJfZGVmYXVsdF92YXIuYml0c19wZXJfcGl4ZWwgPSBicHA7CiAJfSBlbHNlIGlmIChwYXItPmZwV2lkdGggJiYgcGFyLT5mcEhlaWdodCkgewogCQljaGFyIGJ1ZlsxNl07CiAKIAkJbWVtc2V0KGJ1ZiwgMCwgMTYpOwogCQlzbnByaW50ZihidWYsIDE1LCAiJWR4JWRNUiIsIHBhci0+ZnBXaWR0aCwgcGFyLT5mcEhlaWdodCk7CiAJCWZiX2ZpbmRfbW9kZSgmbnZpZGlhZmJfZGVmYXVsdF92YXIsIGluZm8sIGJ1Ziwgc3BlY3MtPm1vZGVkYiwKLQkJCSAgICAgc3BlY3MtPm1vZGVkYl9sZW4sICZtb2RlZGIsIDgpOworCQkJICAgICBzcGVjcy0+bW9kZWRiX2xlbiwgJm1vZGVkYiwgYnBwKTsKIAl9CiAKIAlpZiAobW9kZV9vcHRpb24pCiAJCWZiX2ZpbmRfbW9kZSgmbnZpZGlhZmJfZGVmYXVsdF92YXIsIGluZm8sIG1vZGVfb3B0aW9uLAotCQkJICAgICBzcGVjcy0+bW9kZWRiLCBzcGVjcy0+bW9kZWRiX2xlbiwgJm1vZGVkYiwgOCk7CisJCQkgICAgIHNwZWNzLT5tb2RlZGIsIHNwZWNzLT5tb2RlZGJfbGVuLCAmbW9kZWRiLCBicHApOwogCiAJaW5mby0+dmFyID0gbnZpZGlhZmJfZGVmYXVsdF92YXI7CiAJaW5mby0+Zml4LnZpc3VhbCA9IChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPT0gOCkgPwpAQCAtMTQ0OCwxMSArMTQ3MSwzNCBAQAogCXJldHVybiBudmlkaWFmYl9jaGVja192YXIoJmluZm8tPnZhciwgaW5mbyk7CiB9CiAKLXN0YXRpYyB1MzIgX19kZXZpbml0IG52aWRpYV9nZXRfYXJjaChzdHJ1Y3QgcGNpX2RldiAqcGQpCitzdGF0aWMgdTMyIF9fZGV2aW5pdCBudmlkaWFfZ2V0X2NoaXBzZXQoc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CisJc3RydWN0IG52aWRpYV9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwl1MzIgaWQgPSAocGFyLT5wY2lfZGV2LT52ZW5kb3IgPDwgMTYpIHwgcGFyLT5wY2lfZGV2LT5kZXZpY2U7CisKKwlwcmludGsoIm52aWRpYWZiOiBQQ0kgaWQgLSAleFxuIiwgaWQpOworCWlmICgoaWQgJiAweGZmZjApID09IDB4MDBmMCkgeworCQkvKiBwY2ktZSAqLworCQlwcmludGsoIm52aWRpYWZiOiBQQ0ktRSBjYXJkXG4iKTsKKwkJaWQgPSBOVl9SRDMyKHBhci0+UkVHUywgMHgxODAwKTsKKworCQlpZiAoKGlkICYgMHgwMDAwZmZmZikgPT0gMHgwMDAwMTBERSkKKwkJCWlkID0gMHgxMERFMDAwMCB8IChpZCA+PiAxNik7CisJCWVsc2UgaWYgKChpZCAmIDB4ZmZmZjAwMDApID09IDB4REUxMDAwMDApIC8qIHdyb25nIGVuZGlhbiAqLworCQkJaWQgPSAweDEwREUwMDAwIHwgKChpZCA8PCA4KSAmIDB4MDAwMGZmMDApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGlkID4+IDgpICYgMHgwMDAwMDBmZik7CisJfQorCisJcHJpbnRrKCJudmlkaWFmYjogQWN0dWFsIGlkIC0gJXhcbiIsIGlkKTsKKwlyZXR1cm4gaWQ7Cit9CisKK3N0YXRpYyB1MzIgX19kZXZpbml0IG52aWRpYV9nZXRfYXJjaChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXUzMiBhcmNoID0gMDsKIAotCXN3aXRjaCAocGQtPmRldmljZSAmIDB4MGZmMCkgeworCXN3aXRjaCAocGFyLT5DaGlwc2V0ICYgMHgwZmYwKSB7CiAJY2FzZSAweDAxMDA6CQkvKiBHZUZvcmNlIDI1NiAqLwogCWNhc2UgMHgwMTEwOgkJLyogR2VGb3JjZTIgTVggKi8KIAljYXNlIDB4MDE1MDoJCS8qIEdlRm9yY2UyICovCkBAIC0xNDg1LDYgKzE1MzEsOCBAQAogCWNhc2UgMHgwMjEwOgogCWNhc2UgMHgwMjIwOgogCWNhc2UgMHgwMjMwOgorCWNhc2UgMHgwMjkwOgorCWNhc2UgMHgwMzkwOgogCQlhcmNoID0gTlZfQVJDSF80MDsKIAkJYnJlYWs7CiAJY2FzZSAweDAwMjA6CQkvKiBUTlQsIFROVDIgKi8KQEAgLTE1MTMsNyArMTU2MSw3IEBACiAJaWYgKCFpbmZvKQogCQlnb3RvIGVycl9vdXQ7CiAKLQlwYXIgPSAoc3RydWN0IG52aWRpYV9wYXIgKilpbmZvLT5wYXI7CisJcGFyID0gaW5mby0+cGFyOwogCXBhci0+cGNpX2RldiA9IHBkOwogCiAJaW5mby0+cGl4bWFwLmFkZHIgPSBrbWFsbG9jKDggKiAxMDI0LCBHRlBfS0VSTkVMKTsKQEAgLTE1MzMsMTggKzE1ODEsNiBAQAogCQlnb3RvIGVycl9vdXRfcmVxdWVzdDsKIAl9CiAKLQlwYXItPkFyY2hpdGVjdHVyZSA9IG52aWRpYV9nZXRfYXJjaChwZCk7Ci0KLQlwYXItPkNoaXBzZXQgPSAocGQtPnZlbmRvciA8PCAxNikgfCBwZC0+ZGV2aWNlOwotCXByaW50ayhLRVJOX0lORk8gUEZYICJuVmlkaWEgZGV2aWNlL2NoaXBzZXQgJVhcbiIsIHBhci0+Q2hpcHNldCk7Ci0KLQlpZiAocGFyLT5BcmNoaXRlY3R1cmUgPT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bmtub3duIE5WX0FSQ0hcbiIpOwotCQlnb3RvIGVycl9vdXRfZnJlZV9iYXNlMDsKLQl9Ci0KLQlzcHJpbnRmKG52aWRpYWZiX2ZpeC5pZCwgIk5WJXgiLCAocGQtPmRldmljZSAmIDB4MGZmMCkgPj4gNCk7Ci0KIAlwYXItPkZsYXRQYW5lbCA9IGZsYXRwYW5lbDsKIAlpZiAoZmxhdHBhbmVsID09IDEpCiAJCXByaW50ayhLRVJOX0lORk8gUEZYICJmbGF0cGFuZWwgc3VwcG9ydCBlbmFibGVkXG4iKTsKQEAgLTE1NzAsNyArMTYwNiwxOSBAQAogCQlnb3RvIGVycl9vdXRfZnJlZV9iYXNlMDsKIAl9CiAKLQlOVkNvbW1vblNldHVwKGluZm8pOworCXBhci0+Q2hpcHNldCA9IG52aWRpYV9nZXRfY2hpcHNldChpbmZvKTsKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiblZpZGlhIGRldmljZS9jaGlwc2V0ICVYXG4iLCBwYXItPkNoaXBzZXQpOworCXBhci0+QXJjaGl0ZWN0dXJlID0gbnZpZGlhX2dldF9hcmNoKGluZm8pOworCisJaWYgKHBhci0+QXJjaGl0ZWN0dXJlID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5rbm93biBOVl9BUkNIXG4iKTsKKwkJZ290byBlcnJfb3V0X2FyY2g7CisJfQorCisJc3ByaW50ZihudmlkaWFmYl9maXguaWQsICJOViV4IiwgKHBkLT5kZXZpY2UgJiAweDBmZjApID4+IDQpOworCisJaWYgKE5WQ29tbW9uU2V0dXAoaW5mbykpCisJCWdvdG8gZXJyX291dF9hcmNoOwogCiAJcGFyLT5GYkFkZHJlc3MgPSBudmlkaWFmYl9maXguc21lbV9zdGFydDsKIAlwYXItPkZiTWFwU2l6ZSA9IHBhci0+UmFtQW1vdW50S0J5dGVzICogMTAyNDsKQEAgLTE1ODEsMTAgKzE2MjksMTUgQEAKIAlpZiAocGFyLT5GYk1hcFNpemUgPiA2NCAqIDEwMjQgKiAxMDI0KQogCQlwYXItPkZiTWFwU2l6ZSA9IDY0ICogMTAyNCAqIDEwMjQ7CiAKLQlwYXItPkZiVXNhYmxlU2l6ZSA9IHBhci0+RmJNYXBTaXplIC0gKDEyOCAqIDEwMjQpOworCWlmKHBhci0+QXJjaGl0ZWN0dXJlID49IE5WX0FSQ0hfNDApCisgIAkgICAgICAgIHBhci0+RmJVc2FibGVTaXplID0gcGFyLT5GYk1hcFNpemUgLSAoNTYwICogMTAyNCk7CisJZWxzZQorCQlwYXItPkZiVXNhYmxlU2l6ZSA9IHBhci0+RmJNYXBTaXplIC0gKDEyOCAqIDEwMjQpOwogCXBhci0+U2NyYXRjaEJ1ZmZlclNpemUgPSAocGFyLT5BcmNoaXRlY3R1cmUgPCBOVl9BUkNIXzEwKSA/IDggKiAxMDI0IDoKIAkgICAgMTYgKiAxMDI0OwogCXBhci0+U2NyYXRjaEJ1ZmZlclN0YXJ0ID0gcGFyLT5GYlVzYWJsZVNpemUgLSBwYXItPlNjcmF0Y2hCdWZmZXJTaXplOworCXBhci0+Q3Vyc29yU3RhcnQgPSBwYXItPkZiVXNhYmxlU2l6ZSArICgzMiAqIDEwMjQpOworCiAJaW5mby0+c2NyZWVuX2Jhc2UgPSBpb3JlbWFwKG52aWRpYWZiX2ZpeC5zbWVtX3N0YXJ0LCBwYXItPkZiTWFwU2l6ZSk7CiAJaW5mby0+c2NyZWVuX3NpemUgPSBwYXItPkZiVXNhYmxlU2l6ZTsKIAludmlkaWFmYl9maXguc21lbV9sZW4gPSBwYXItPlJhbUFtb3VudEtCeXRlcyAqIDEwMjQ7CkBAIC0xNjQwLDIxICsxNjkzLDIyIEBACiAJTlZUUkFDRV9MRUFWRSgpOwogCXJldHVybiAwOwogCi0gICAgICBlcnJfb3V0X2lvdW5tYXBfZmI6CitlcnJfb3V0X2lvdW5tYXBfZmI6CiAJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7Ci0gICAgICBlcnJfb3V0X2ZyZWVfYmFzZTE6CitlcnJfb3V0X2ZyZWVfYmFzZTE6CiAJZmJfZGVzdHJveV9tb2RlZGIoaW5mby0+bW9uc3BlY3MubW9kZWRiKTsKIAludmlkaWFfZGVsZXRlX2kyY19idXNzZXMocGFyKTsKK2Vycl9vdXRfYXJjaDoKIAlpb3VubWFwKHBhci0+UkVHUyk7Ci0gICAgICBlcnJfb3V0X2ZyZWVfYmFzZTA6CitlcnJfb3V0X2ZyZWVfYmFzZTA6CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZCk7Ci0gICAgICBlcnJfb3V0X3JlcXVlc3Q6CitlcnJfb3V0X3JlcXVlc3Q6CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkKTsKLSAgICAgIGVycl9vdXRfZW5hYmxlOgorZXJyX291dF9lbmFibGU6CiAJa2ZyZWUoaW5mby0+cGl4bWFwLmFkZHIpOwotICAgICAgZXJyX291dF9rZnJlZToKK2Vycl9vdXRfa2ZyZWU6CiAJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKLSAgICAgIGVycl9vdXQ6CitlcnJfb3V0OgogCXJldHVybiAtRU5PREVWOwogfQogCkBAIC0xNzI5LDYgKzE3ODMsOCBAQAogI2VuZGlmCiAJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJmcGRpdGhlcjoiLCA5KSkgewogCQkJZnBkaXRoZXIgPSBzaW1wbGVfc3RydG9sKHRoaXNfb3B0KzksIE5VTEwsIDApOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAiYnBwOiIsIDQpKSB7CisJCQlicHAgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCs0LCBOVUxMLCAwKTsKIAkJfSBlbHNlCiAJCQltb2RlX29wdGlvbiA9IHRoaXNfb3B0OwogCX0KQEAgLTE4MDQsNiArMTg2MCwxMSBAQAogTU9EVUxFX1BBUk1fREVTQyh2cmFtLAogCQkgImFtb3VudCBvZiBmcmFtZWJ1ZmZlciBtZW1vcnkgdG8gcmVtYXAgaW4gTWlCIgogCQkgIihkZWZhdWx0PTAgLSByZW1hcCBlbnRpcmUgbWVtb3J5KSIpOworbW9kdWxlX3BhcmFtKG1vZGVfb3B0aW9uLCBjaGFycCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1vZGVfb3B0aW9uLCAiU3BlY2lmeSBpbml0aWFsIHZpZGVvIG1vZGUiKTsKK21vZHVsZV9wYXJhbShicHAsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGJwcCwgInBpeGVsIHdpZHRoIGluIGJpdHMiCisJCSAiKGRlZmF1bHQ9OCkiKTsKICNpZmRlZiBDT05GSUdfTVRSUgogbW9kdWxlX3BhcmFtKG5vbXRyciwgYm9vbCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKG5vbXRyciwgIkRpc2FibGVzIE1UUlIgc3VwcG9ydCAoMCBvciAxPWRpc2FibGVkKSAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29mZmIuYyBiL2RyaXZlcnMvdmlkZW8vb2ZmYi5jCmluZGV4IDAwZDg3ZjUuLmFkMTQzNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb2ZmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb2ZmYi5jCkBAIC0yMjMsNiArMjIzLDcgQEAKIGludCBfX2luaXQgb2ZmYl9pbml0KHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IE5VTEwsICpib290X2Rpc3AgPSBOVUxMOworCiAjaWYgZGVmaW5lZChDT05GSUdfQk9PVFhfVEVYVCkgJiYgZGVmaW5lZChDT05GSUdfUFBDMzIpCiAJc3RydWN0IGRldmljZV9ub2RlICptYWNvc19kaXNwbGF5ID0gTlVMTDsKICNlbmRpZgpAQCAtMjM0LDYwICsyMzUsNTQgQEAKIAlpZiAoYm9vdF9pbmZvcyAhPSAwKSB7CiAJCXVuc2lnbmVkIGxvbmcgYWRkciA9CiAJCSAgICAodW5zaWduZWQgbG9uZykgYm9vdF9pbmZvcy0+ZGlzcERldmljZUJhc2U7CisJCXUzMiAqYWRkcnA7CisJCXU2NCBkYWRkciwgZHNpemU7CisJCXVuc2lnbmVkIGludCBmbGFnczsKKwogCQkvKiBmaW5kIHRoZSBkZXZpY2Ugbm9kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWNvcyBkaXNwbGF5ICovCiAJCXdoaWxlICgoZHAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShkcCwgImRpc3BsYXkiKSkpIHsKIAkJCWludCBpOwotCQkJLyoKLQkJCSAqIEdycnIuLi4gIEl0IGxvb2tzIGxpa2UgdGhlIE1hY09TIEFUSSBkcml2ZXIKLQkJCSAqIG11bmdlcyB0aGUgYXNzaWduZWQtYWRkcmVzc2VzIHByb3BlcnR5IChidXQKLQkJCSAqIHRoZSBBQVBMLGFkZHJlc3MgdmFsdWUgaXMgT0spLgotCQkJICovCi0JCQlpZiAoc3RybmNtcChkcC0+bmFtZSwgIkFUWSwiLCA0KSA9PSAwCi0JCQkgICAgJiYgZHAtPm5fYWRkcnMgPT0gMSkgewotCQkJCXVuc2lnbmVkIGludCAqYXAgPQotCQkJCSAgICAodW5zaWduZWQgaW50ICopIGdldF9wcm9wZXJ0eShkcCwKLQkJCQkJCQkJICAiQUFQTCxhZGRyZXNzIiwKLQkJCQkJCQkJICBOVUxMKTsKLQkJCQlpZiAoYXAgIT0gTlVMTCkgewotCQkJCQlkcC0+YWRkcnNbMF0uYWRkcmVzcyA9ICphcDsKLQkJCQkJZHAtPmFkZHJzWzBdLnNpemUgPSAweDAxMDAwMDAwOwotCQkJCX0KLQkJCX0KIAogCQkJLyoKLQkJCSAqIFRoZSBMVFBybyBvbiB0aGUgTG9tYmFyZCBwb3dlcmJvb2sgaGFzIG5vIGFkZHJlc3NlcwotCQkJICogb24gdGhlIGRpc3BsYXkgbm9kZXMsIHRoZXkgYXJlIG9uIHRoZWlyIHBhcmVudC4KKwkJCSAqIExvb2sgZm9yIGFuIEFBUEwsYWRkcmVzcyBwcm9wZXJ0eSBmaXJzdC4KIAkJCSAqLwotCQkJaWYgKGRwLT5uX2FkZHJzID09IDAKLQkJCSAgICAmJiBkZXZpY2VfaXNfY29tcGF0aWJsZShkcCwgIkFUWSwyNjRMVFBybyIpKSB7Ci0JCQkJaW50IG5hOwotCQkJCXVuc2lnbmVkIGludCAqYXAgPSAodW5zaWduZWQgaW50ICopCi0JCQkJICAgIGdldF9wcm9wZXJ0eShkcCwgIkFBUEwsYWRkcmVzcyIsICZuYSk7Ci0JCQkJaWYgKGFwICE9IDApCi0JCQkJCWZvciAobmEgLz0gc2l6ZW9mKHVuc2lnbmVkIGludCk7Ci0JCQkJCSAgICAgbmEgPiAwOyAtLW5hLCArK2FwKQotCQkJCQkJaWYgKCphcCA8PSBhZGRyCi0JCQkJCQkgICAgJiYgYWRkciA8Ci0JCQkJCQkgICAgKmFwICsgMHgxMDAwMDAwKQotCQkJCQkJCWdvdG8gZm91bmRpdDsKKwkJCXVuc2lnbmVkIGludCBuYTsKKwkJCXVuc2lnbmVkIGludCAqYXAgPQorCQkJCSh1bnNpZ25lZCBpbnQgKilnZXRfcHJvcGVydHkoZHAsICJBQVBMLGFkZHJlc3MiLAorCQkJCQkJCSAgICAgJm5hKTsKKwkJCWlmIChhcCAhPSAwKSB7CisJCQkJZm9yIChuYSAvPSBzaXplb2YodW5zaWduZWQgaW50KTsgbmEgPiAwOworCQkJCSAgICAgLS1uYSwgKythcCkKKwkJCQkJaWYgKCphcCA8PSBhZGRyICYmCisJCQkJCSAgICBhZGRyIDwgKmFwICsgMHgxMDAwMDAwKSB7CisJCQkJCQltYWNvc19kaXNwbGF5ID0gZHA7CisJCQkJCQlnb3RvIGZvdW5kaXQ7CisJCQkJCX0KIAkJCX0KIAogCQkJLyoKIAkJCSAqIFNlZSBpZiB0aGUgZGlzcGxheSBhZGRyZXNzIGlzIGluIG9uZSBvZiB0aGUgYWRkcmVzcwogCQkJICogcmFuZ2VzIGZvciB0aGlzIGRpc3BsYXkuCiAJCQkgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBkcC0+bl9hZGRyczsgKytpKSB7Ci0JCQkJaWYgKGRwLT5hZGRyc1tpXS5hZGRyZXNzIDw9IGFkZHIKLQkJCQkgICAgJiYgYWRkciA8Ci0JCQkJICAgIGRwLT5hZGRyc1tpXS5hZGRyZXNzICsKLQkJCQkgICAgZHAtPmFkZHJzW2ldLnNpemUpCisJCQlpID0gMDsKKwkJCWZvciAoOzspIHsKKwkJCQlhZGRycCA9IG9mX2dldF9hZGRyZXNzKGRwLCBpKyssICZkc2l6ZSwgJmZsYWdzKTsKKwkJCQlpZiAoYWRkcnAgPT0gTlVMTCkKIAkJCQkJYnJlYWs7CisJCQkJaWYgKCEoZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkpCisJCQkJCWNvbnRpbnVlOworCQkJCWRhZGRyID0gb2ZfdHJhbnNsYXRlX2FkZHJlc3MoZHAsIGFkZHJwKTsKKwkJCQlpZiAoZGFkZHIgPT0gT0ZfQkFEX0FERFIpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChkYWRkciA8PSBhZGRyICYmIGFkZHIgPCAoZGFkZHIgKyBkc2l6ZSkpIHsKKwkJCQkJbWFjb3NfZGlzcGxheSA9IGRwOworCQkJCQlnb3RvIGZvdW5kaXQ7CisJCQkJfQogCQkJfQotCQkJaWYgKGkgPCBkcC0+bl9hZGRycykgewotCQkJICAgICAgZm91bmRpdDoKKwkJZm91bmRpdDoKKwkJCWlmIChtYWNvc19kaXNwbGF5KSB7CiAJCQkJcHJpbnRrKEtFUk5fSU5GTyAiTWFjT1MgZGlzcGxheSBpcyAlc1xuIiwKIAkJCQkgICAgICAgZHAtPmZ1bGxfbmFtZSk7Ci0JCQkJbWFjb3NfZGlzcGxheSA9IGRwOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC0zMjYsOCArMzIxLDEwIEBACiAJaW50ICpwcCwgaTsKIAl1bnNpZ25lZCBpbnQgbGVuOwogCWludCB3aWR0aCA9IDY0MCwgaGVpZ2h0ID0gNDgwLCBkZXB0aCA9IDgsIHBpdGNoOwotCXVuc2lnbmVkIGludCByc2l6ZSwgKnVwOwotCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9IDA7CisJdW5zaWduZWQgaW50IGZsYWdzLCByc2l6ZSwgKnVwOworCXU2NCBhZGRyZXNzID0gT0ZfQkFEX0FERFI7CisJdTMyICphZGRycDsKKwl1NjQgYXNpemU7CiAKIAlpZiAoKHBwID0gKGludCAqKSBnZXRfcHJvcGVydHkoZHAsICJkZXB0aCIsICZsZW4pKSAhPSBOVUxMCiAJICAgICYmIGxlbiA9PSBzaXplb2YoaW50KSkKQEAgLTM2Myw3ICszNjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCSAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocGRldikgewotICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNiAmJiBhZGRyZXNzID09IDA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNiAmJiBhZGRyZXNzID09IE9GX0JBRF9BRERSOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCBpKSAmCiAJCQkJICAgIElPUkVTT1VSQ0VfTUVNKSAmJgogCQkJCSAgIChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGkpID49IHJzaXplKSkKQEAgLTM3NCwyNyArMzcxLDMzIEBACiAgICAgICAgIH0KICNlbmRpZiAvKiBDT05GSUdfUENJICovCiAKLQlpZiAoYWRkcmVzcyA9PSAwICYmCi0JICAgICh1cCA9ICh1bnNpZ25lZCAqKSBnZXRfcHJvcGVydHkoZHAsICJhZGRyZXNzIiwgJmxlbikpICE9IE5VTEwgJiYKLQkgICAgbGVuID09IHNpemVvZih1bnNpZ25lZCkpCi0JCWFkZHJlc3MgPSAodV9sb25nKSAqIHVwOwotCWlmIChhZGRyZXNzID09IDApIHsKLQkJZm9yIChpID0gMDsgaSA8IGRwLT5uX2FkZHJzOyArK2kpCi0JCQlpZiAoZHAtPmFkZHJzW2ldLnNpemUgPj0KLQkJCSAgICBwaXRjaCAqIGhlaWdodCAqIGRlcHRoIC8gOCkKLQkJCQlicmVhazsKLQkJaWYgKGkgPj0gZHAtPm5fYWRkcnMpIHsKKyAgICAgICAvKiBUaGlzIG9uZSBpcyBkb2RneSwgd2UgbWF5IGRyb3AgaXQgLi4uICovCisgICAgICAgaWYgKGFkZHJlc3MgPT0gT0ZfQkFEX0FERFIgJiYKKwkgICAodXAgPSAodW5zaWduZWQgKikgZ2V0X3Byb3BlcnR5KGRwLCAiYWRkcmVzcyIsICZsZW4pKSAhPSBOVUxMICYmCisJICAgbGVuID09IHNpemVvZih1bnNpZ25lZCBpbnQpKQorCSAgICAgICBhZGRyZXNzID0gKHU2NCkgKiB1cDsKKworICAgICAgIGlmIChhZGRyZXNzID09IE9GX0JBRF9BRERSKSB7CisJICAgICAgIGZvciAoaSA9IDA7IChhZGRycCA9IG9mX2dldF9hZGRyZXNzKGRwLCBpLCAmYXNpemUsICZmbGFncykpCisJCQkgICAgIT0gTlVMTDsgaSsrKSB7CisJCSAgICAgICBpZiAoIShmbGFncyAmIElPUkVTT1VSQ0VfTUVNKSkKKwkJCSAgICAgICBjb250aW51ZTsKKwkJICAgICAgIGlmIChhc2l6ZSA+PSBwaXRjaCAqIGhlaWdodCAqIGRlcHRoIC8gOCkKKwkJCSAgICAgICBicmVhazsKKwkgICAgICAgfQorCQlpZiAoYWRkcnAgPT0gTlVMTCkgewogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkgICAgICAgIm5vIGZyYW1lYnVmZmVyIGFkZHJlc3MgZm91bmQgZm9yICVzXG4iLAogCQkJICAgICAgIGRwLT5mdWxsX25hbWUpOwogCQkJcmV0dXJuOwogCQl9Ci0KLQkJYWRkcmVzcyA9ICh1X2xvbmcpIGRwLT5hZGRyc1tpXS5hZGRyZXNzOwotCi0jaWZkZWYgQ09ORklHX1BQQzY0Ci0JCWFkZHJlc3MgKz0gKChzdHJ1Y3QgcGNpX2RuICopZHAtPmRhdGEpLT5waGItPnBjaV9tZW1fb2Zmc2V0OwotI2VuZGlmCisJCWFkZHJlc3MgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhkcCwgYWRkcnApOworCQlpZiAoYWRkcmVzcyA9PSBPRl9CQURfQUREUikgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgImNhbid0IHRyYW5zbGF0ZSBmcmFtZWJ1ZmZlciBhZGRyZXNzIGZvciAlc1xuIiwKKwkJCSAgICAgICBkcC0+ZnVsbF9uYW1lKTsKKwkJCXJldHVybjsKKwkJfQogCiAJCS8qIGtsdWRnZSBmb3IgdmFsa3lyaWUgKi8KIAkJaWYgKHN0cmNtcChkcC0+bmFtZSwgInZhbGt5cmllIikgPT0gMCkKQEAgLTQ1OSw3ICs0NjIsOSBAQAogCiAJcGFyLT5jbWFwX3R5cGUgPSBjbWFwX3Vua25vd247CiAJaWYgKGRlcHRoID09IDgpIHsKLQkJLyogWFhYIGtsdWRnZSBmb3IgYXRpICovCisKKwkJLyogUGFsZXR0ZSBoYWNrcyBkaXNhYmxlZCBmb3Igbm93ICovCisjaWYgMAogCQlpZiAoZHAgJiYgIXN0cm5jbXAobmFtZSwgIkFUWSxSYWdlMTI4IiwgMTEpKSB7CiAJCQl1bnNpZ25lZCBsb25nIHJlZ2Jhc2UgPSBkcC0+YWRkcnNbMl0uYWRkcmVzczsKIAkJCXBhci0+Y21hcF9hZHIgPSBpb3JlbWFwKHJlZ2Jhc2UsIDB4MUZGRik7CkBAIC00OTAsNiArNDk1LDcgQEAKIAkJCXBhci0+Y21hcF9hZHIgPSBpb3JlbWFwKHJlZ2Jhc2UgKyAweDYwMDAsIDB4MTAwMCk7CiAJCQlwYXItPmNtYXBfdHlwZSA9IGNtYXBfZ3h0MjAwMDsKIAkJfQorI2VuZGlmCiAJCWZpeC0+dmlzdWFsID0gcGFyLT5jbWFwX2FkciA/IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUgogCQkgICAgOiBGQl9WSVNVQUxfU1RBVElDX1BTRVVET0NPTE9SOwogCX0gZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wOTEwMC5jIGIvZHJpdmVycy92aWRlby9wOTEwMC5jCmluZGV4IGIyNTFlNzUuLjBkMTk1NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcDkxMDAuYworKysgYi9kcml2ZXJzL3ZpZGVvL3A5MTAwLmMKQEAgLTMxLDkgKzMxLDggQEAKIAkJCSAgIHVuc2lnbmVkLCBzdHJ1Y3QgZmJfaW5mbyAqKTsKIHN0YXRpYyBpbnQgcDkxMDBfYmxhbmsoaW50LCBzdHJ1Y3QgZmJfaW5mbyAqKTsKIAotc3RhdGljIGludCBwOTEwMF9tbWFwKHN0cnVjdCBmYl9pbmZvICosIHN0cnVjdCBmaWxlICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKLXN0YXRpYyBpbnQgcDkxMDBfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBmYl9pbmZvICopOworc3RhdGljIGludCBwOTEwMF9tbWFwKHN0cnVjdCBmYl9pbmZvICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKK3N0YXRpYyBpbnQgcDkxMDBfaW9jdGwoc3RydWN0IGZiX2luZm8gKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKIAogLyoKICAqICBGcmFtZSBidWZmZXIgb3BlcmF0aW9ucwpAQCAtMjIyLDcgKzIyMSw3IEBACiAJeyAwLAkJCTAsCQkwCQkgICAgfQogfTsKIAotc3RhdGljIGludCBwOTEwMF9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCitzdGF0aWMgaW50IHA5MTAwX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXN0cnVjdCBwOTEwMF9wYXIgKnBhciA9IChzdHJ1Y3QgcDkxMDBfcGFyICopaW5mby0+cGFyOwogCkBAIC0yMzIsOCArMjMxLDggQEAKIAkJCQkgIHZtYSk7CiB9CiAKLXN0YXRpYyBpbnQgcDkxMDBfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZiX2luZm8gKmluZm8pCitzdGF0aWMgaW50IHA5MTAwX2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgY21kLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IHA5MTAwX3BhciAqcGFyID0gKHN0cnVjdCBwOTEwMF9wYXIgKikgaW5mby0+cGFyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYyBiL2RyaXZlcnMvdmlkZW8vcGxhdGludW1mYi5jCmluZGV4IGNhNDA4MmEuLjMzNWUzNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcGxhdGludW1mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcGxhdGludW1mYi5jCkBAIC02OSw2ICs2OSw4IEBACiAJdW5zaWduZWQgbG9uZwkJCXRvdGFsX3ZyYW07CiAJaW50CQkJCWNsa3R5cGU7CiAJaW50CQkJCWRhY3R5cGU7CisKKwlzdHJ1Y3QgcmVzb3VyY2UJCQlyc3JjX2ZiLCByc3JjX3JlZzsKIH07CiAKIC8qCkBAIC05Nyw5ICs5OSw2IEBACiAgKiBJbnRlcmZhY2UgdXNlZCBieSB0aGUgd29ybGQKICAqLwogCi1pbnQgcGxhdGludW1mYl9pbml0KHZvaWQpOwotaW50IHBsYXRpbnVtZmJfc2V0dXAoY2hhciopOwotCiBzdGF0aWMgc3RydWN0IGZiX29wcyBwbGF0aW51bWZiX29wcyA9IHsKIAkub3duZXIgPQlUSElTX01PRFVMRSwKIAkuZmJfY2hlY2tfdmFyCT0gcGxhdGludW1mYl9jaGVja192YXIsCkBAIC0xMzgsMTMgKzEzNywxNSBAQAogCiAJaW5pdCA9IHBsYXRpbnVtX3JlZ19pbml0W3BpbmZvLT52bW9kZS0xXTsKIAkKLQlpZiAocGluZm8tPnZtb2RlID09IDEzICYmIHBpbmZvLT5jbW9kZSA+IDApCi0JCW9mZnNldCA9IDB4MTA7CisgCWlmICgocGluZm8tPnZtb2RlID09IFZNT0RFXzgzMl82MjRfNzUpICYmIChwaW5mby0+Y21vZGUgPiBDTU9ERV84KSkKKyAgCQlvZmZzZXQgPSAweDEwOworCiAJaW5mby0+c2NyZWVuX2Jhc2UgPSBwaW5mby0+ZnJhbWVfYnVmZmVyICsgaW5pdC0+ZmJfb2Zmc2V0ICsgb2Zmc2V0OwogCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gKHBpbmZvLT5mcmFtZV9idWZmZXJfcGh5cykgKyBpbml0LT5mYl9vZmZzZXQgKyBvZmZzZXQ7CiAJaW5mby0+Zml4LnZpc3VhbCA9IChwaW5mby0+Y21vZGUgPT0gQ01PREVfOCkgPwogCQlGQl9WSVNVQUxfUFNFVURPQ09MT1IgOiBGQl9WSVNVQUxfRElSRUNUQ09MT1I7Ci0JaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gdm1vZGVfYXR0cnNbcGluZm8tPnZtb2RlLTFdLmhyZXMgKiAoMTw8cGluZm8tPmNtb2RlKSArIG9mZnNldDsKKyAJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gdm1vZGVfYXR0cnNbcGluZm8tPnZtb2RlLTFdLmhyZXMgKiAoMTw8cGluZm8tPmNtb2RlKQorCQkrIG9mZnNldDsKIAlwcmludGsoImxpbmVfbGVuZ3RoOiAleFxuIiwgaW5mby0+Zml4LmxpbmVfbGVuZ3RoKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTIyMSw3ICsyMjIsOSBAQAogc3RhdGljIGlubGluZSBpbnQgcGxhdGludW1fdnJhbV9yZXFkKGludCB2aWRlb19tb2RlLCBpbnQgY29sb3JfbW9kZSkKIHsKIAlyZXR1cm4gdm1vZGVfYXR0cnNbdmlkZW9fbW9kZS0xXS52cmVzICoKLQkgICAgICAgKHZtb2RlX2F0dHJzW3ZpZGVvX21vZGUtMV0uaHJlcyAqICgxPDxjb2xvcl9tb2RlKSArIDB4MjApICsweDEwMDA7CisJICAgICAgICh2bW9kZV9hdHRyc1t2aWRlb19tb2RlLTFdLmhyZXMgKiAoMTw8Y29sb3JfbW9kZSkgKworCQkoKHZpZGVvX21vZGUgPT0gVk1PREVfODMyXzYyNF83NSkgJiYKKwkJIChjb2xvcl9tb2RlID4gQ01PREVfOCkpID8gMHgxMCA6IDB4MjApICsgMHgxMDAwOwogfQogCiAjZGVmaW5lIFNUT1JFX0QyKGEsIGQpIHsgXApAQCAtNDgxLDcgKzQ4NCw3IEBACiAvKiAKICAqIFBhcnNlIHVzZXIgc3BlZmljaWVkIG9wdGlvbnMgKGB2aWRlbz1wbGF0aW51bWZiOicpCiAgKi8KLWludCBfX2luaXQgcGxhdGludW1mYl9zZXR1cChjaGFyICpvcHRpb25zKQorc3RhdGljIGludCBfX2luaXQgcGxhdGludW1mYl9zZXR1cChjaGFyICpvcHRpb25zKQogewogCWNoYXIgKnRoaXNfb3B0OwogCkBAIC01MjIsMTkgKzUyNSwxNSBAQAogI2RlZmluZSBpbnZhbGlkYXRlX2NhY2hlKGFkZHIpCiAjZW5kaWYKIAotc3RhdGljIGludCBfX2RldmluaXQgcGxhdGludW1mYl9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlKiBvZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBsYXRpbnVtZmJfcHJvYmUoc3RydWN0IG9mX2RldmljZSogb2RldiwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUJKmRwID0gb2Rldi0+bm9kZTsKIAlzdHJ1Y3QgZmJfaW5mbwkJKmluZm87CiAJc3RydWN0IGZiX2luZm9fcGxhdGludW0JKnBpbmZvOwotCXVuc2lnbmVkIGxvbmcJCWFkZHIsIHNpemU7CiAJdm9sYXRpbGUgX191OAkJKmZidWZmZXI7Ci0JaW50CQkJaSwgYmFuazAsIGJhbmsxLCBiYW5rMiwgYmFuazMsIHJjOworCWludAkJCWJhbmswLCBiYW5rMSwgYmFuazIsIGJhbmszLCByYzsKIAotCWlmIChkcC0+bl9hZGRycyAhPSAyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZXhwZWN0aW5nIDIgYWRkcmVzcyBmb3IgcGxhdGludW0gKGdvdCAlZCkiLCBkcC0+bl9hZGRycyk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQogCXByaW50ayhLRVJOX0lORk8gInBsYXRpbnVtZmI6IEZvdW5kIEFwcGxlIFBsYXRpbnVtIHZpZGVvIGhhcmR3YXJlXG4iKTsKIAogCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2YoKnBpbmZvKSwgJm9kZXYtPmRldik7CkBAIC01NDIsMjYgKzU0MSwzOSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAlwaW5mbyA9IGluZm8tPnBhcjsKIAotCS8qIE1hcCBpbiBmcmFtZSBidWZmZXIgYW5kIHJlZ2lzdGVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBkcC0+bl9hZGRyczsgKytpKSB7Ci0JCWFkZHIgPSBkcC0+YWRkcnNbaV0uYWRkcmVzczsKLQkJc2l6ZSA9IGRwLT5hZGRyc1tpXS5zaXplOwotCQkvKiBMZXQncyBhc3N1bWUgd2UgY2FuIHJlcXVlc3QgZWl0aGVyIGFsbCBvciBub3RoaW5nICovCi0JCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGFkZHIsIHNpemUsICJwbGF0aW51bWZiIikpIHsKLQkJCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7Ci0JCQlyZXR1cm4gLUVOWElPOwotCQl9Ci0JCWlmIChzaXplID49IDB4NDAwMDAwKSB7Ci0JCQkvKiBmcmFtZSBidWZmZXIgLSBtYXAgb25seSA0TUIgKi8KLQkJCXBpbmZvLT5mcmFtZV9idWZmZXJfcGh5cyA9IGFkZHI7Ci0JCQlwaW5mby0+ZnJhbWVfYnVmZmVyID0gX19pb3JlbWFwKGFkZHIsIDB4NDAwMDAwLCBfUEFHRV9XUklURVRIUlUpOwotCQkJcGluZm8tPmJhc2VfZnJhbWVfYnVmZmVyID0gcGluZm8tPmZyYW1lX2J1ZmZlcjsKLQkJfSBlbHNlIHsKLQkJCS8qIHJlZ2lzdGVycyAqLwotCQkJcGluZm8tPnBsYXRpbnVtX3JlZ3NfcGh5cyA9IGFkZHI7Ci0JCQlwaW5mby0+cGxhdGludW1fcmVncyA9IGlvcmVtYXAoYWRkciwgc2l6ZSk7Ci0JCX0KKwlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShkcCwgMCwgJnBpbmZvLT5yc3JjX3JlZykgfHwKKwkgICAgb2ZfYWRkcmVzc190b19yZXNvdXJjZShkcCwgMSwgJnBpbmZvLT5yc3JjX2ZiKSkgeworCQlwcmludGsoS0VSTl9FUlIgInBsYXRpbnVtZmI6IENhbid0IGdldCByZXNvdXJjZXNcbiIpOworCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOworCQlyZXR1cm4gLUVOWElPOwogCX0KKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihwaW5mby0+cnNyY19yZWcuc3RhcnQsCisJCQkJcGluZm8tPnJzcmNfcmVnLnN0YXJ0IC0KKwkJCQlwaW5mby0+cnNyY19yZWcuZW5kICsgMSwKKwkJCQkicGxhdGludW1mYiByZWdpc3RlcnMiKSkgeworCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihwaW5mby0+cnNyY19mYi5zdGFydCwKKwkJCQlwaW5mby0+cnNyY19mYi5zdGFydAorCQkJCS0gcGluZm8tPnJzcmNfZmIuZW5kICsgMSwKKwkJCQkicGxhdGludW1mYiBmcmFtZWJ1ZmZlciIpKSB7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihwaW5mby0+cnNyY19yZWcuc3RhcnQsCisJCQkJICAgcGluZm8tPnJzcmNfcmVnLmVuZCAtCisJCQkJICAgcGluZm8tPnJzcmNfcmVnLnN0YXJ0ICsgMSk7CisJCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJLyogZnJhbWUgYnVmZmVyIC0gbWFwIG9ubHkgNE1CICovCisJcGluZm8tPmZyYW1lX2J1ZmZlcl9waHlzID0gcGluZm8tPnJzcmNfZmIuc3RhcnQ7CisJcGluZm8tPmZyYW1lX2J1ZmZlciA9IF9faW9yZW1hcChwaW5mby0+cnNyY19mYi5zdGFydCwgMHg0MDAwMDAsCisJCQkJCV9QQUdFX1dSSVRFVEhSVSk7CisJcGluZm8tPmJhc2VfZnJhbWVfYnVmZmVyID0gcGluZm8tPmZyYW1lX2J1ZmZlcjsKKworCS8qIHJlZ2lzdGVycyAqLworCXBpbmZvLT5wbGF0aW51bV9yZWdzX3BoeXMgPSBwaW5mby0+cnNyY19yZWcuc3RhcnQ7CisJcGluZm8tPnBsYXRpbnVtX3JlZ3MgPSBpb3JlbWFwKHBpbmZvLT5yc3JjX3JlZy5zdGFydCwgMHgxMDAwKTsKIAogCXBpbmZvLT5jbWFwX3JlZ3NfcGh5cyA9IDB4ZjMwMWIwMDA7CS8qIFhYWCBub3QgaW4gcHJvbT8gKi8KIAlyZXF1ZXN0X21lbV9yZWdpb24ocGluZm8tPmNtYXBfcmVnc19waHlzLCAweDEwMDAsICJwbGF0aW51bWZiIGNtYXAiKTsKQEAgLTYyNCwxOCArNjM2LDE2IEBACiB7CiAJc3RydWN0IGZiX2luZm8JCSppbmZvID0gZGV2X2dldF9kcnZkYXRhKCZvZGV2LT5kZXYpOwogCXN0cnVjdCBmYl9pbmZvX3BsYXRpbnVtCSpwaW5mbyA9IGluZm8tPnBhcjsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gb2Rldi0+bm9kZTsKLQl1bnNpZ25lZCBsb25nIGFkZHIsIHNpemU7Ci0JaW50IGk7CiAJCiAgICAgICAgIHVucmVnaXN0ZXJfZnJhbWVidWZmZXIgKGluZm8pOwogCQogCS8qIFVubWFwIGZyYW1lIGJ1ZmZlciBhbmQgcmVnaXN0ZXJzICovCi0JZm9yIChpID0gMDsgaSA8IGRwLT5uX2FkZHJzOyArK2kpIHsKLQkJYWRkciA9IGRwLT5hZGRyc1tpXS5hZGRyZXNzOwotCQlzaXplID0gZHAtPmFkZHJzW2ldLnNpemU7Ci0JCXJlbGVhc2VfbWVtX3JlZ2lvbihhZGRyLCBzaXplKTsKLQl9CisJcmVsZWFzZV9tZW1fcmVnaW9uKHBpbmZvLT5yc3JjX2ZiLnN0YXJ0LAorCQkJICAgcGluZm8tPnJzcmNfZmIuZW5kIC0KKwkJCSAgIHBpbmZvLT5yc3JjX2ZiLnN0YXJ0ICsgMSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHBpbmZvLT5yc3JjX3JlZy5zdGFydCwKKwkJCSAgIHBpbmZvLT5yc3JjX3JlZy5lbmQgLQorCQkJICAgcGluZm8tPnJzcmNfcmVnLnN0YXJ0ICsgMSk7CiAJaW91bm1hcChwaW5mby0+ZnJhbWVfYnVmZmVyKTsKIAlpb3VubWFwKHBpbmZvLT5wbGF0aW51bV9yZWdzKTsKIAlyZWxlYXNlX21lbV9yZWdpb24ocGluZm8tPmNtYXBfcmVnc19waHlzLCAweDEwMDApOwpAQCAtNjYyLDcgKzY3Miw3IEBACiAJLnJlbW92ZQkJPSBwbGF0aW51bWZiX3JlbW92ZSwKIH07CiAKLWludCBfX2luaXQgcGxhdGludW1mYl9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBwbGF0aW51bWZiX2luaXQodm9pZCkKIHsKICNpZm5kZWYgTU9EVUxFCiAJY2hhciAqb3B0aW9uID0gTlVMTDsKQEAgLTY3Niw3ICs2ODYsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIF9fZXhpdCBwbGF0aW51bWZiX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBwbGF0aW51bWZiX2V4aXQodm9pZCkKIHsKIAlvZl91bnJlZ2lzdGVyX2RyaXZlcigmcGxhdGludW1fZHJpdmVyKTsJCiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuaCBiL2RyaXZlcnMvdmlkZW8vcGxhdGludW1mYi5oCmluZGV4IDI4MzRmYzEuLmY2YmQ3N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcGxhdGludW1mYi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vcGxhdGludW1mYi5oCkBAIC0xNTgsNyArMTU4LDkgQEAKIC8qIDgzMng2MjQsIDc1SHogKDEzKSAqLwogc3RhdGljIHN0cnVjdCBwbGF0aW51bV9yZWd2YWxzIHBsYXRpbnVtX3JlZ19pbml0XzEzID0gewogCTB4NzAsCi0JeyA4NjQsIDE2ODAsIDMzNjAgfSwJLyogTWFjT1MgZG9lcyAxNjgwIGluc3RlYWQgb2YgMTY5NiB0byBmaXQgMTZicHAgaW4gMU1CICovCisJeyA4NjQsIDE2ODAsIDMzNDQgfSwJLyogTWFjT1MgZG9lcyAxNjgwIGluc3RlYWQgb2YgMTY5NiB0byBmaXQgMTZicHAgaW4gMU1CLAorCQkJCSAqIGFuZCB3ZSB1c2UgMzM0NCBpbnN0ZWFkIG9mIDMzNjAgdG8gZml0IGluIDJNYgorCQkJCSAqLwogCXsgMHhmZjAsIDQsIDAsIDAsIDAsIDAsIDB4Mjk5LCAwLAogCSAgMCwgMHgyMWUsIDB4MTIwLCAweDEwLCAweDIzZiwgMHgxZiwgMHgyNSwgMHgzNywKIAkgIDB4OGEsIDB4MjJhLCAweDIzZSwgMHg1MzYsIDB4NTM0LCA0LCA5LCAweDUyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wbTJmYi5jIGIvZHJpdmVycy92aWRlby9wbTJmYi5jCmluZGV4IDAyNzdjZTAuLjVmZTE5NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcG0yZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3BtMmZiLmMKQEAgLTkxLDYgKzkxLDcgQEAKIAl1MzIJCW1lbV9jb25maWc7CS8qIE1lbUNvbmZpZyByZWcgYXQgcHJvYmUgKi8KIAl1MzIJCW1lbV9jb250cm9sOwkvKiBNZW1Db250cm9sIHJlZyBhdCBwcm9iZSAqLwogCXUzMgkJYm9vdF9hZGRyZXNzOwkvKiBCb290QWRkcmVzcyByZWcgYXQgcHJvYmUgKi8KKwl1MzIgICAgICAgICAgICAgcGFsZXR0ZVsxNl07CiB9OwogCiAvKgpAQCAtNjc0LDcgKzY3NSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgcG0yZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgcG0yZmJfcGFyICpwYXIgPSAoc3RydWN0IHBtMmZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IHBtMmZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXUzMiBwaXhjbG9jazsKIAl1MzIgd2lkdGgsIGhlaWdodCwgZGVwdGg7CiAJdTMyIGhzc3RhcnQsIGhzZW5kLCBoYmVuZCwgaHRvdGFsOwpAQCAtODU0LDcgKzg1NSw3IEBACiAJCQkgICB1bnNpZ25lZCBibHVlLCB1bnNpZ25lZCB0cmFuc3AsCiAJCQkgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgcG0yZmJfcGFyICpwYXIgPSAoc3RydWN0IHBtMmZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IHBtMmZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCiAJaWYgKHJlZ25vID49IGluZm8tPmNtYXAubGVuKSAgLyogbm8uIG9mIGh3IHJlZ2lzdGVycyAqLwogCQlyZXR1cm4gMTsKQEAgLTkyOSw3ICs5MzAsNyBAQAogICAgCQljYXNlIDE2OgogCQljYXNlIDI0OgogCQljYXNlIDMyOgkKLSAgICAgICAgICAgCQkoKHUzMiopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0gdjsKKyAgICAgICAgICAgCQlwYXItPnBhbGV0dGVbcmVnbm9dID0gdjsKIAkJCWJyZWFrOwogCQl9CiAJCXJldHVybiAwOwpAQCAtOTU1LDcgKzk1Niw3IEBACiBzdGF0aWMgaW50IHBtMmZiX3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAogCQkJICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgcG0yZmJfcGFyICpwID0gKHN0cnVjdCBwbTJmYl9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBwbTJmYl9wYXIgKnAgPSBpbmZvLT5wYXI7CiAJdTMyIGJhc2U7CiAJdTMyIGRlcHRoOwogCXUzMiB4cmVzOwpAQCAtOTg3LDcgKzk4OCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgcG0yZmJfYmxhbmsoaW50IGJsYW5rX21vZGUsIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCBwbTJmYl9wYXIgKnBhciA9IChzdHJ1Y3QgcG0yZmJfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgcG0yZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJdTMyIHZpZGVvID0gcGFyLT52aWRlbzsKIAogCURQUklOVEsoImJsYW5rX21vZGUgJWRcbiIsIGJsYW5rX21vZGUpOwpAQCAtMTA1NCw4ICsxMDU1LDcgQEAKIHsKIAlzdHJ1Y3QgcG0yZmJfcGFyICpkZWZhdWx0X3BhcjsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKLQlpbnQgc2l6ZSwgZXJyOwotCWludCBlcnJfcmV0dmFsID0gLUVOWElPOworCWludCBlcnIsIGVycl9yZXR2YWwgPSAtRU5YSU87CiAKIAllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAoIGVyciApIHsKQEAgLTEwNjMsMTEgKzEwNjMsMTAgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzaXplID0gc2l6ZW9mKHN0cnVjdCBwbTJmYl9wYXIpICsgMjU2ICogc2l6ZW9mKHUzMik7Ci0JaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemUsICZwZGV2LT5kZXYpOworCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IHBtMmZiX3BhciksICZwZGV2LT5kZXYpOwogCWlmICggIWluZm8gKQogCQlyZXR1cm4gLUVOT01FTTsKLQlkZWZhdWx0X3BhciA9IChzdHJ1Y3QgcG0yZmJfcGFyICopIGluZm8tPnBhcjsKKwlkZWZhdWx0X3BhciA9IGluZm8tPnBhcjsKIAogCXN3aXRjaCAocGRldi0+ZGV2aWNlKSB7CiAJY2FzZSAgUENJX0RFVklDRV9JRF9USV9UVlA0MDIwOgpAQCAtMTE3MSw3ICsxMTcwLDcgQEAKIAogCWluZm8tPmZib3BzCQk9ICZwbTJmYl9vcHM7CiAJaW5mby0+Zml4CQk9IHBtMmZiX2ZpeDsgCQotCWluZm8tPnBzZXVkb19wYWxldHRlCT0gKHZvaWQgKikoZGVmYXVsdF9wYXIgKyAxKTsgCisJaW5mby0+cHNldWRvX3BhbGV0dGUJPSBkZWZhdWx0X3Bhci0+cGFsZXR0ZTsKIAlpbmZvLT5mbGFncwkJPSBGQklORk9fREVGQVVMVCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJJTkZPX0hXQUNDRUxfWVBBTjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wbTNmYi5jIGIvZHJpdmVycy92aWRlby9wbTNmYi5jCmluZGV4IDJlMTFiNjAuLjBlNzhkZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcG0zZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3BtM2ZiLmMKQEAgLTY1Nyw5ICs2NTcsNyBAQAogc3RhdGljIHZvaWQgcG0zZmJfZGV0ZWN0KHZvaWQpOwogc3RhdGljIGludCBwbTNmYl9wYW5fZGlzcGxheShjb25zdCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKIAkJCSAgICAgc3RydWN0IGZiX2luZm9fZ2VuICppbmZvKTsKLXN0YXRpYyBpbnQgcG0zZmJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIHVfaW50IGNtZCwgdV9sb25nIGFyZywgaW50IGNvbiwKLQkJICAgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgcG0zZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVfaW50IGNtZCwgdV9sb25nIGFyZyk7CiAKIAogLyogdGhlIHN0cnVjdCB0aGF0IGhvbGQgdGhlbSB0b2dldGhlciAqLwpAQCAtMzQzOCw5ICszNDM2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwbTNmYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQgY21kLCB1X2xvbmcgYXJnLCBpbnQgY29uLAotCQkgICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCitzdGF0aWMgaW50IHBtM2ZiX2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1X2ludCBjbWQsIHVfbG9uZyBhcmcpCiB7CiAJc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbyA9IChzdHJ1Y3QgcG0zZmJfaW5mbyAqKSBpbmZvOwogCXUzMiBjbSwgaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcG1hZy1hYS1mYi5jIGIvZHJpdmVycy92aWRlby9wbWFnLWFhLWZiLmMKaW5kZXggMjhkMWZlNS4uZDkyZjM1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9wbWFnLWFhLWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wbWFnLWFhLWZiLmMKQEAgLTI5OSw4ICsyOTksNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBhYWZiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1MzIgY21kLAotCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZywgaW50IGNvbiwgc3RydWN0IGZiX2luZm8gKmluZm8pCitzdGF0aWMgaW50IGFhZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHUzMiBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCS8qIFRPRE86IE5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KIAlyZXR1cm4gLUVOT0lPQ1RMQ01EOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9weGFmYi5jIGIvZHJpdmVycy92aWRlby9weGFmYi5jCmluZGV4IDlmYzEwYjkuLjUzYWQ2MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcHhhZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3B4YWZiLmMKQEAgLTM5NSw3ICszOTUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHB4YWZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmaWxlICpmaWxlLAorc3RhdGljIGludCBweGFmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLAogCQkgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlzdHJ1Y3QgcHhhZmJfaW5mbyAqZmJpID0gKHN0cnVjdCBweGFmYl9pbmZvICopaW5mbzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcmFkZW9uZmIuYyBiL2RyaXZlcnMvdmlkZW8vcmFkZW9uZmIuYwppbmRleCA2MDAzMThmLi5kYjlmYjkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3JhZGVvbmZiLmMKKysrIGIvZHJpdmVycy92aWRlby9yYWRlb25mYi5jCkBAIC0xNDk3LDggKzE0OTcsOCBAQAogfQogCiAKLXN0YXRpYyBpbnQgcmFkZW9uZmJfaW9jdGwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmcsIHN0cnVjdCBmYl9pbmZvICppbmZvKQorc3RhdGljIGludCByYWRlb25mYl9pb2N0bCAoc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKICAgICAgICAgc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvID0gKHN0cnVjdCByYWRlb25mYl9pbmZvICopIGluZm87CiAJdW5zaWduZWQgaW50IHRtcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcml2YS9mYmRldi5jIGIvZHJpdmVycy92aWRlby9yaXZhL2ZiZGV2LmMKaW5kZXggM2U5Zjk2ZS4uNmMxOWFiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9yaXZhL2ZiZGV2LmMKKysrIGIvZHJpdmVycy92aWRlby9yaXZhL2ZiZGV2LmMKQEAgLTYzMCw3ICs2MzAsNyBAQAogCWludCBicHAsIHdpZHRoLCBoRGlzcGxheVNpemUsIGhEaXNwbGF5LCBoU3RhcnQsCiAJICAgIGhFbmQsIGhUb3RhbCwgaGVpZ2h0LCB2RGlzcGxheSwgdlN0YXJ0LCB2RW5kLCB2VG90YWwsIGRvdENsb2NrOwogCWludCBoQmxhbmtTdGFydCwgaEJsYW5rRW5kLCB2QmxhbmtTdGFydCwgdkJsYW5rRW5kOwotCXN0cnVjdCByaXZhX3BhciAqcGFyID0gKHN0cnVjdCByaXZhX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IHJpdmFfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJc3RydWN0IHJpdmFfcmVncyBuZXdtb2RlOwogCQogCU5WVFJBQ0VfRU5URVIoKTsKQEAgLTkyNSw3ICs5MjUsNyBAQAogCiBzdGF0aWMgdm9pZCByaXZhX3NldHVwX2FjY2VsKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCByaXZhX3BhciAqcGFyID0gKHN0cnVjdCByaXZhX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IHJpdmFfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKIAlSSVZBX0ZJRk9fRlJFRShwYXItPnJpdmEsIENsaXAsIDIpOwogCU5WX1dSMzIoJnBhci0+cml2YS5DbGlwLT5Ub3BMZWZ0LCAwLCAweDApOwpAQCAtOTc5LDcgKzk3OSw3IEBACiAjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCiBzdGF0aWMgaW50IHJpdmFfc2V0X2JhY2tsaWdodF9lbmFibGUoaW50IG9uLCBpbnQgbGV2ZWwsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IHJpdmFfcGFyICpwYXIgPSAoc3RydWN0IHJpdmFfcGFyICopZGF0YTsKKwlzdHJ1Y3Qgcml2YV9wYXIgKnBhciA9IGRhdGE7CiAJVTAzMiB0bXBfcGNydCwgdG1wX3BtYzsKIAogCXRtcF9wbWMgPSBwYXItPnJpdmEuUE1DWzB4MTBGMC80XSAmIDB4MDAwMEZGRkY7CkBAIC0xMDA4LDcgKzEwMDgsNyBAQAogCiBzdGF0aWMgaW50IHJpdmFmYl9vcGVuKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcikKIHsKLQlzdHJ1Y3Qgcml2YV9wYXIgKnBhciA9IChzdHJ1Y3Qgcml2YV9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCByaXZhX3BhciAqcGFyID0gaW5mby0+cGFyOwogCWludCBjbnQgPSBhdG9taWNfcmVhZCgmcGFyLT5yZWZfY291bnQpOwogCiAJTlZUUkFDRV9FTlRFUigpOwpAQCAtMTAzNCw3ICsxMDM0LDcgQEAKIAogc3RhdGljIGludCByaXZhZmJfcmVsZWFzZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpCiB7Ci0Jc3RydWN0IHJpdmFfcGFyICpwYXIgPSAoc3RydWN0IHJpdmFfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3Qgcml2YV9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlpbnQgY250ID0gYXRvbWljX3JlYWQoJnBhci0+cmVmX2NvdW50KTsKIAogCU5WVFJBQ0VfRU5URVIoKTsKQEAgLTEwNTcsNyArMTA1Nyw3IEBACiBzdGF0aWMgaW50IHJpdmFmYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGU7Ci0Jc3RydWN0IHJpdmFfcGFyICpwYXIgPSAoc3RydWN0IHJpdmFfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3Qgcml2YV9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlpbnQgbm9tLCBkZW47CQkvKiB0cmFuc2xhdGluZyBmcm9tIHBpeGVscy0+Ynl0ZXMgKi8KIAlpbnQgbW9kZV92YWxpZCA9IDA7CiAJCkBAIC0xMTY2LDcgKzExNjYsNyBAQAogCiBzdGF0aWMgaW50IHJpdmFmYl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCByaXZhX3BhciAqcGFyID0gKHN0cnVjdCByaXZhX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IHJpdmFfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKIAlOVlRSQUNFX0VOVEVSKCk7CiAJLyogdmdhSFd1bmxvY2soKSArIHJpdmEgdW5sb2NrICgweDdGKSAqLwpAQCAtMTIwNSw0MyArMTIwNSwxOSBAQAogc3RhdGljIGludCByaXZhZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCiAJCQkgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3Qgcml2YV9wYXIgKnBhciA9IChzdHJ1Y3Qgcml2YV9wYXIgKilpbmZvLT5wYXI7CisJc3RydWN0IHJpdmFfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJdW5zaWduZWQgaW50IGJhc2U7CiAKIAlOVlRSQUNFX0VOVEVSKCk7Ci0JaWYgKHZhci0+eG9mZnNldCA+ICh2YXItPnhyZXNfdmlydHVhbCAtIHZhci0+eHJlcykpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICh2YXItPnlvZmZzZXQgPiAodmFyLT55cmVzX3ZpcnR1YWwgLSB2YXItPnlyZXMpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICh2YXItPnZtb2RlICYgRkJfVk1PREVfWVdSQVApIHsKLQkJaWYgKHZhci0+eW9mZnNldCA8IDAKLQkJICAgIHx8IHZhci0+eW9mZnNldCA+PSBpbmZvLT52YXIueXJlc192aXJ0dWFsCi0JCSAgICB8fCB2YXItPnhvZmZzZXQpIHJldHVybiAtRUlOVkFMOwotCX0gZWxzZSB7Ci0JCWlmICh2YXItPnhvZmZzZXQgKyBpbmZvLT52YXIueHJlcyA+IGluZm8tPnZhci54cmVzX3ZpcnR1YWwgfHwKLQkJICAgIHZhci0+eW9mZnNldCArIGluZm8tPnZhci55cmVzID4gaW5mby0+dmFyLnlyZXNfdmlydHVhbCkKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQogCWJhc2UgPSB2YXItPnlvZmZzZXQgKiBpbmZvLT5maXgubGluZV9sZW5ndGggKyB2YXItPnhvZmZzZXQ7Ci0KIAlwYXItPnJpdmEuU2V0U3RhcnRBZGRyZXNzKCZwYXItPnJpdmEsIGJhc2UpOwotCi0JaW5mby0+dmFyLnhvZmZzZXQgPSB2YXItPnhvZmZzZXQ7Ci0JaW5mby0+dmFyLnlvZmZzZXQgPSB2YXItPnlvZmZzZXQ7Ci0KLQlpZiAodmFyLT52bW9kZSAmIEZCX1ZNT0RFX1lXUkFQKQotCQlpbmZvLT52YXIudm1vZGUgfD0gRkJfVk1PREVfWVdSQVA7Ci0JZWxzZQotCQlpbmZvLT52YXIudm1vZGUgJj0gfkZCX1ZNT0RFX1lXUkFQOwogCU5WVFJBQ0VfTEVBVkUoKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCByaXZhZmJfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3Qgcml2YV9wYXIgKnBhcj0gKHN0cnVjdCByaXZhX3BhciAqKWluZm8tPnBhcjsKKwlzdHJ1Y3Qgcml2YV9wYXIgKnBhcj0gaW5mby0+cGFyOwogCXVuc2lnbmVkIGNoYXIgdG1wLCB2ZXNhOwogCiAJdG1wID0gU0VRaW4ocGFyLCAweDAxKSAmIH4weDIwOwkvKiBzY3JlZW4gb24vb2ZmICovCkBAIC0xMzA0LDcgKzEyODAsNyBAQAogCQkJICB1bnNpZ25lZCBibHVlLCB1bnNpZ25lZCB0cmFuc3AsCiAJCQkgIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCByaXZhX3BhciAqcGFyID0gKHN0cnVjdCByaXZhX3BhciAqKWluZm8tPnBhcjsKKwlzdHJ1Y3Qgcml2YV9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlSSVZBX0hXX0lOU1QgKmNoaXAgPSAmcGFyLT5yaXZhOwogCWludCBpOwogCkBAIC0xMzkzLDcgKzEzNjksNyBAQAogICovCiBzdGF0aWMgdm9pZCByaXZhZmJfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCkKIHsKLQlzdHJ1Y3Qgcml2YV9wYXIgKnBhciA9IChzdHJ1Y3Qgcml2YV9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCByaXZhX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXVfaW50IGNvbG9yLCByb3AgPSAwOwogCiAJaWYgKChpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSkgewpAQCAtMTQ0OSw3ICsxNDI1LDcgQEAKICAqLwogc3RhdGljIHZvaWQgcml2YWZiX2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEgKnJlZ2lvbikKIHsKLQlzdHJ1Y3Qgcml2YV9wYXIgKnBhciA9IChzdHJ1Y3Qgcml2YV9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCByaXZhX3BhciAqcGFyID0gaW5mby0+cGFyOwogCiAJaWYgKChpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSkgewogCQljZmJfY29weWFyZWEoaW5mbywgcmVnaW9uKTsKQEAgLTE0OTUsNyArMTQ3MSw3IEBACiBzdGF0aWMgdm9pZCByaXZhZmJfaW1hZ2VibGl0KHN0cnVjdCBmYl9pbmZvICppbmZvLCAKIAkJCSAgICAgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSkKIHsKLQlzdHJ1Y3Qgcml2YV9wYXIgKnBhciA9IChzdHJ1Y3Qgcml2YV9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCByaXZhX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXUzMiBmZ3ggPSAwLCBiZ3ggPSAwLCB3aWR0aCwgdG1wOwogCXU4ICpjZGF0ID0gKHU4ICopIGltYWdlLT5kYXRhOwogCXZvbGF0aWxlIHUzMiBfX2lvbWVtICpkOwpAQCAtMTU4MCw3ICsxNTU2LDcgQEAKICAqLwogc3RhdGljIGludCByaXZhZmJfY3Vyc29yKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmJfY3Vyc29yICpjdXJzb3IpCiB7Ci0Jc3RydWN0IHJpdmFfcGFyICpwYXIgPSAoc3RydWN0IHJpdmFfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3Qgcml2YV9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1OCBkYXRhW01BWF9DVVJTICogTUFYX0NVUlMvOF07CiAJaW50IGksIHNldCA9IGN1cnNvci0+c2V0OwogCXUxNiBmZywgYmc7CkBAIC0xNjY0LDcgKzE2NDAsNyBAQAogCiBzdGF0aWMgaW50IHJpdmFmYl9zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCByaXZhX3BhciAqcGFyID0gKHN0cnVjdCByaXZhX3BhciAqKWluZm8tPnBhcjsKKwlzdHJ1Y3Qgcml2YV9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAogCXdhaXRfZm9yX2lkbGUocGFyKTsKIAlyZXR1cm4gMDsKQEAgLTE2OTYsNyArMTY3Miw3IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCByaXZhX3NldF9mYmluZm8oc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJdW5zaWduZWQgaW50IGNtYXBfbGVuOwotCXN0cnVjdCByaXZhX3BhciAqcGFyID0gKHN0cnVjdCByaXZhX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IHJpdmFfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKIAlOVlRSQUNFX0VOVEVSKCk7CiAJaW5mby0+ZmxhZ3MgPSBGQklORk9fREVGQVVMVApAQCAtMTczMyw3ICsxNzA5LDcgQEAKICNpZmRlZiBDT05GSUdfUFBDX09GCiBzdGF0aWMgaW50IF9fZGV2aW5pdCByaXZhX2dldF9FRElEX09GKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgcGNpX2RldiAqcGQpCiB7Ci0Jc3RydWN0IHJpdmFfcGFyICpwYXIgPSAoc3RydWN0IHJpdmFfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3Qgcml2YV9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwogCXVuc2lnbmVkIGNoYXIgKnBlZGlkID0gTlVMTDsKIAl1bnNpZ25lZCBjaGFyICpkaXNwdHlwZSA9IE5VTEw7CkBAIC0xNzY3LDcgKzE3NDMsNyBAQAogI2lmIGRlZmluZWQoQ09ORklHX0ZCX1JJVkFfSTJDKSAmJiAhZGVmaW5lZChDT05GSUdfUFBDX09GKQogc3RhdGljIGludCBfX2RldmluaXQgcml2YV9nZXRfRURJRF9pMmMoc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IHJpdmFfcGFyICpwYXIgPSAoc3RydWN0IHJpdmFfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3Qgcml2YV9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmFyOwogCWludCBpOwogCkBAIC0xODM3LDcgKzE4MTMsNyBAQAogc3RhdGljIHZvaWQgX19kZXZpbml0IHJpdmFfZ2V0X2VkaWRpbmZvKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyID0gJnJpdmFmYl9kZWZhdWx0X3ZhcjsKLQlzdHJ1Y3Qgcml2YV9wYXIgKnBhciA9IChzdHJ1Y3Qgcml2YV9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCByaXZhX3BhciAqcGFyID0gaW5mby0+cGFyOwogCiAJZmJfZWRpZF90b19tb25zcGVjcyhwYXItPkVESUQsICZpbmZvLT5tb25zcGVjcyk7CiAJZmJfdmlkZW9tb2RlX3RvX21vZGVsaXN0KGluZm8tPm1vbnNwZWNzLm1vZGVkYiwgaW5mby0+bW9uc3BlY3MubW9kZWRiX2xlbiwKQEAgLTE5MDksNyArMTg4NSw3IEBACiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX3JldDsKIAl9Ci0JZGVmYXVsdF9wYXIgPSAoc3RydWN0IHJpdmFfcGFyICopIGluZm8tPnBhcjsKKwlkZWZhdWx0X3BhciA9IGluZm8tPnBhcjsKIAlkZWZhdWx0X3Bhci0+cGRldiA9IHBkOwogCiAJaW5mby0+cGl4bWFwLmFkZHIgPSBrbWFsbG9jKDggKiAxMDI0LCBHRlBfS0VSTkVMKTsKQEAgLTIwNzAsNyArMjA0Niw3IEBACiAKIGVycl9pb3VubWFwX3NjcmVlbl9iYXNlOgogI2lmZGVmIENPTkZJR19GQl9SSVZBX0kyQwotCXJpdmFfZGVsZXRlX2kyY19idXNzZXMoKHN0cnVjdCByaXZhX3BhciAqKSBpbmZvLT5wYXIpOworCXJpdmFfZGVsZXRlX2kyY19idXNzZXMoaW5mby0+cGFyKTsKICNlbmRpZgogCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOwogZXJyX2lvdW5tYXBfcHJhbWluOgpAQCAtMjA5Myw3ICsyMDY5LDcgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCByaXZhZmJfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZCkKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZCk7Ci0Jc3RydWN0IHJpdmFfcGFyICpwYXIgPSAoc3RydWN0IHJpdmFfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3Qgcml2YV9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAkKIAlOVlRSQUNFX0VOVEVSKCk7CiAJaWYgKCFpbmZvKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9yaXZhL3JpdmFmYi1pMmMuYyBiL2RyaXZlcnMvdmlkZW8vcml2YS9yaXZhZmItaTJjLmMKaW5kZXggNzcxNTFkOC4uOGIxOTY3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9yaXZhL3JpdmFmYi1pMmMuYworKysgYi9kcml2ZXJzL3ZpZGVvL3JpdmEvcml2YWZiLWkyYy5jCkBAIC0zMCw3ICszMCw3IEBACiAKIHN0YXRpYyB2b2lkIHJpdmFfZ3Bpb19zZXRzY2wodm9pZCogZGF0YSwgaW50IHN0YXRlKQogewotCXN0cnVjdCByaXZhX2kyY19jaGFuIAkqY2hhbiA9IChzdHJ1Y3Qgcml2YV9pMmNfY2hhbiAqKWRhdGE7CisJc3RydWN0IHJpdmFfaTJjX2NoYW4gCSpjaGFuID0gZGF0YTsKIAlzdHJ1Y3Qgcml2YV9wYXIgCSpwYXIgPSBjaGFuLT5wYXI7CiAJdTMyCQkJdmFsOwogCkBAIC00OCw3ICs0OCw3IEBACiAKIHN0YXRpYyB2b2lkIHJpdmFfZ3Bpb19zZXRzZGEodm9pZCogZGF0YSwgaW50IHN0YXRlKQogewotCXN0cnVjdCByaXZhX2kyY19jaGFuIAkqY2hhbiA9IChzdHJ1Y3Qgcml2YV9pMmNfY2hhbiAqKWRhdGE7CisJc3RydWN0IHJpdmFfaTJjX2NoYW4gCSpjaGFuID0gZGF0YTsKIAlzdHJ1Y3Qgcml2YV9wYXIgCSpwYXIgPSBjaGFuLT5wYXI7CiAJdTMyCQkJdmFsOwogCkBAIC02Niw3ICs2Niw3IEBACiAKIHN0YXRpYyBpbnQgcml2YV9ncGlvX2dldHNjbCh2b2lkKiBkYXRhKQogewotCXN0cnVjdCByaXZhX2kyY19jaGFuIAkqY2hhbiA9IChzdHJ1Y3Qgcml2YV9pMmNfY2hhbiAqKWRhdGE7CisJc3RydWN0IHJpdmFfaTJjX2NoYW4gCSpjaGFuID0gZGF0YTsKIAlzdHJ1Y3Qgcml2YV9wYXIgCSpwYXIgPSBjaGFuLT5wYXI7CiAJdTMyCQkJdmFsID0gMDsKIApAQCAtODEsNyArODEsNyBAQAogCiBzdGF0aWMgaW50IHJpdmFfZ3Bpb19nZXRzZGEodm9pZCogZGF0YSkKIHsKLQlzdHJ1Y3Qgcml2YV9pMmNfY2hhbiAJKmNoYW4gPSAoc3RydWN0IHJpdmFfaTJjX2NoYW4gKilkYXRhOworCXN0cnVjdCByaXZhX2kyY19jaGFuIAkqY2hhbiA9IGRhdGE7CiAJc3RydWN0IHJpdmFfcGFyIAkqcGFyID0gY2hhbi0+cGFyOwogCXUzMgkJCXZhbCA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vczNjMjQxMGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3MzYzI0MTBmYi5jCmluZGV4IGNlNmU3NDkuLmQ1NzRkZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vczNjMjQxMGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9zM2MyNDEwZmIuYwpAQCAtODcsNiArODcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC05Niw3ICs5Nyw2IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1sY2QuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxhc20vYXJjaC9mYi5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgogCiAjaWZkZWYgQ09ORklHX1BNCiAjaW5jbHVkZSA8bGludXgvcG0uaD4KQEAgLTU1Miw3ICs1NTIsNyBAQAogICogczNjMjQxMGZiX2luaXRfcmVnaXN0ZXJzIC0gSW5pdGlhbGlzZSBhbGwgTENELXJlbGF0ZWQgcmVnaXN0ZXJzCiAgKi8KIAotaW50IHMzYzI0MTBmYl9pbml0X3JlZ2lzdGVycyhzdHJ1Y3QgczNjMjQxMGZiX2luZm8gKmZiaSkKK3N0YXRpYyBpbnQgczNjMjQxMGZiX2luaXRfcmVnaXN0ZXJzKHN0cnVjdCBzM2MyNDEwZmJfaW5mbyAqZmJpKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTYzNCw3ICs2MzQsNyBAQAogCiBzdGF0aWMgY2hhciBkcml2ZXJfbmFtZVtdPSJzM2MyNDEwZmIiOwogCi1pbnQgX19pbml0IHMzYzI0MTBmYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2luaXQgczNjMjQxMGZiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHMzYzI0MTBmYl9pbmZvICppbmZvOwogCXN0cnVjdCBmYl9pbmZvCSAgICpmYmluZm87CkBAIC02NjcsOCArNjY3LDYgQEAKIAlpbmZvLT5mYiA9IGZiaW5mbzsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBmYmluZm8pOwogCi0JczNjMjQxMGZiX2luaXRfcmVnaXN0ZXJzKGluZm8pOwotCiAJZHByaW50aygiZGV2aW5pdFxuIik7CiAKIAlzdHJjcHkoZmJpbmZvLT5maXguaWQsIGRyaXZlcl9uYW1lKTsKQEAgLTcwMSw4ICs2OTksOCBAQAogCWZiaW5mby0+dmFyLnlyZXNfdmlydHVhbCAgICA9IG1hY2hfaW5mby0+eXJlcy5kZWZ2YWw7CiAJZmJpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgID0gbWFjaF9pbmZvLT5icHAuZGVmdmFsOwogCi0JZmJpbmZvLT52YXIudXBwZXJfbWFyZ2luICAgID0gUzNDMjQxMF9MQ0RDT04yX0dFVF9WQlBEKG1yZWdzLT5sY2Rjb24yKSArMTsKLQlmYmluZm8tPnZhci5sb3dlcl9tYXJnaW4gICAgPSBTM0MyNDEwX0xDRENPTjJfR0VUX1ZGUEQobXJlZ3MtPmxjZGNvbjIpICsxOworCWZiaW5mby0+dmFyLnVwcGVyX21hcmdpbiAgICA9IFMzQzI0MTBfTENEQ09OMl9HRVRfVkJQRChtcmVncy0+bGNkY29uMikgKyAxOworCWZiaW5mby0+dmFyLmxvd2VyX21hcmdpbiAgICA9IFMzQzI0MTBfTENEQ09OMl9HRVRfVkZQRChtcmVncy0+bGNkY29uMikgKyAxOwogCWZiaW5mby0+dmFyLnZzeW5jX2xlbgkgICAgPSBTM0MyNDEwX0xDRENPTjJfR0VUX1ZTUFcobXJlZ3MtPmxjZGNvbjIpICsgMTsKIAogCWZiaW5mby0+dmFyLmxlZnRfbWFyZ2luCSAgICA9IFMzQzI0MTBfTENEQ09OM19HRVRfSEZQRChtcmVncy0+bGNkY29uMykgKyAxOwpAQCAtNzQ2LDcgKzc0NCw2IEBACiAJCWdvdG8gcmVsZWFzZV9pcnE7CiAJfQogCi0JY2xrX3VzZShpbmZvLT5jbGspOwogCWNsa19lbmFibGUoaW5mby0+Y2xrKTsKIAlkcHJpbnRrKCJnb3QgYW5kIGVuYWJsZWQgY2xvY2tcbiIpOwogCkBAIC03ODMsNyArNzgwLDYgQEAKIAlzM2MyNDEwZmJfdW5tYXBfdmlkZW9fbWVtb3J5KGluZm8pOwogcmVsZWFzZV9jbG9jazoKIAljbGtfZGlzYWJsZShpbmZvLT5jbGspOwotCWNsa191bnVzZShpbmZvLT5jbGspOwogCWNsa19wdXQoaW5mby0+Y2xrKTsKIHJlbGVhc2VfaXJxOgogCWZyZWVfaXJxKGlycSxpbmZvKTsKQEAgLTgyOCw3ICs4MjQsNiBAQAogCiAgCWlmIChpbmZvLT5jbGspIHsKICAJCWNsa19kaXNhYmxlKGluZm8tPmNsayk7Ci0gCQljbGtfdW51c2UoaW5mby0+Y2xrKTsKICAJCWNsa19wdXQoaW5mby0+Y2xrKTsKICAJCWluZm8tPmNsayA9IE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zYTExMDBmYi5jIGIvZHJpdmVycy92aWRlby9zYTExMDBmYi5jCmluZGV4IDJlYTEzNTQuLjhhODkzY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2ExMTAwZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3NhMTEwMGZiLmMKQEAgLTE3OCw3ICsxNzgsNiBAQAogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9hc3NhYmV0Lmg+CkBAIC04MTYsNyArODE1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzYTExMDBmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKK3N0YXRpYyBpbnQgc2ExMTAwZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKIAkJCSBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlzdHJ1Y3Qgc2ExMTAwZmJfaW5mbyAqZmJpID0gKHN0cnVjdCBzYTExMDBmYl9pbmZvICopaW5mbzsKQEAgLTE0NTUsNyArMTQ1NCwxMSBAQAogc3RhdGljIGludCBfX2luaXQgc2ExMTAwZmJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgc2ExMTAwZmJfaW5mbyAqZmJpOwotCWludCByZXQ7CisJaW50IHJldCwgaXJxOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDw9IDApCisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oMHhiMDEwMDAwMCwgMHgxMDAwMCwgIkxDRCIpKQogCQlyZXR1cm4gLUVCVVNZOwpAQCAtMTQ3MCw3ICsxNDczLDcgQEAKIAlpZiAocmV0KQogCQlnb3RvIGZhaWxlZDsKIAotCXJldCA9IHJlcXVlc3RfaXJxKElSUV9MQ0QsIHNhMTEwMGZiX2hhbmRsZV9pcnEsIFNBX0lOVEVSUlVQVCwKKwlyZXQgPSByZXF1ZXN0X2lycShpcnEsIHNhMTEwMGZiX2hhbmRsZV9pcnEsIFNBX0lOVEVSUlVQVCwKIAkJCSAgIkxDRCIsIGZiaSk7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9FUlIgInNhMTEwMGZiOiByZXF1ZXN0X2lycSBmYWlsZWQ6ICVkXG4iLCByZXQpOwpAQCAtMTQ5Miw3ICsxNDk1LDcgQEAKIAogCXJldCA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZmYmktPmZiKTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBmYWlsZWQ7CisJCWdvdG8gZXJyX2ZyZWVfaXJxOwogCiAjaWZkZWYgQ09ORklHX0NQVV9GUkVRCiAJZmJpLT5mcmVxX3RyYW5zaXRpb24ubm90aWZpZXJfY2FsbCA9IHNhMTEwMGZiX2ZyZXFfdHJhbnNpdGlvbjsKQEAgLTE1MDQsNyArMTUwNyw5IEBACiAJLyogVGhpcyBkcml2ZXIgY2Fubm90IGJlIHVubG9hZGVkIGF0IHRoZSBtb21lbnQgKi8KIAlyZXR1cm4gMDsKIAotZmFpbGVkOgorIGVycl9mcmVlX2lycToKKwlmcmVlX2lycShpcnEsIGZiaSk7CisgZmFpbGVkOgogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCWtmcmVlKGZiaSk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKDB4YjAxMDAwMDAsIDB4MTAwMDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmItaTJjLmMgYi9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYi1pMmMuYwppbmRleCAzYzk4NDU3Li4wMDcxOWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYi1pMmMuYworKysgYi9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYi1pMmMuYwpAQCAtNDksNyArNDksNyBAQAogCiBzdGF0aWMgdm9pZCBzYXZhZ2U0X2dwaW9fc2V0c2NsKHZvaWQgKmRhdGEsIGludCB2YWwpCiB7Ci0Jc3RydWN0IHNhdmFnZWZiX2kyY19jaGFuICpjaGFuID0gKHN0cnVjdCBzYXZhZ2VmYl9pMmNfY2hhbiAqKWRhdGE7CisJc3RydWN0IHNhdmFnZWZiX2kyY19jaGFuICpjaGFuID0gZGF0YTsKIAl1bnNpZ25lZCBpbnQgcjsKIAogCXIgPSByZWFkbChjaGFuLT5pb2FkZHIgKyBjaGFuLT5yZWcpOwpAQCAtNjMsNyArNjMsNyBAQAogCiBzdGF0aWMgdm9pZCBzYXZhZ2U0X2dwaW9fc2V0c2RhKHZvaWQgKmRhdGEsIGludCB2YWwpCiB7Ci0Jc3RydWN0IHNhdmFnZWZiX2kyY19jaGFuICpjaGFuID0gKHN0cnVjdCBzYXZhZ2VmYl9pMmNfY2hhbiAqKWRhdGE7CisJc3RydWN0IHNhdmFnZWZiX2kyY19jaGFuICpjaGFuID0gZGF0YTsKIAogCXVuc2lnbmVkIGludCByOwogCXIgPSByZWFkbChjaGFuLT5pb2FkZHIgKyBjaGFuLT5yZWcpOwpAQCAtNzcsMjEgKzc3LDIxIEBACiAKIHN0YXRpYyBpbnQgc2F2YWdlNF9ncGlvX2dldHNjbCh2b2lkICpkYXRhKQogewotCXN0cnVjdCBzYXZhZ2VmYl9pMmNfY2hhbiAqY2hhbiA9IChzdHJ1Y3Qgc2F2YWdlZmJfaTJjX2NoYW4gKilkYXRhOworCXN0cnVjdCBzYXZhZ2VmYl9pMmNfY2hhbiAqY2hhbiA9IGRhdGE7CiAKIAlyZXR1cm4gKDAgIT0gKHJlYWRsKGNoYW4tPmlvYWRkciArIGNoYW4tPnJlZykgJiBTQVZBR0U0X0kyQ19TQ0xfSU4pKTsKIH0KIAogc3RhdGljIGludCBzYXZhZ2U0X2dwaW9fZ2V0c2RhKHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IHNhdmFnZWZiX2kyY19jaGFuICpjaGFuID0gKHN0cnVjdCBzYXZhZ2VmYl9pMmNfY2hhbiAqKWRhdGE7CisJc3RydWN0IHNhdmFnZWZiX2kyY19jaGFuICpjaGFuID0gZGF0YTsKIAogCXJldHVybiAoMCAhPSAocmVhZGwoY2hhbi0+aW9hZGRyICsgY2hhbi0+cmVnKSAmIFNBVkFHRTRfSTJDX1NEQV9JTikpOwogfQogCiBzdGF0aWMgdm9pZCBwcm9zYXZhZ2VfZ3Bpb19zZXRzY2wodm9pZCogZGF0YSwgaW50IHZhbCkKIHsKLQlzdHJ1Y3Qgc2F2YWdlZmJfaTJjX2NoYW4gKmNoYW4gPSAoc3RydWN0IHNhdmFnZWZiX2kyY19jaGFuICopZGF0YTsKKwlzdHJ1Y3Qgc2F2YWdlZmJfaTJjX2NoYW4gKmNoYW4gPSBkYXRhOwogCXUzMgkJCSAgcjsKIAogCVNFVF9DUl9JWChjaGFuLT5pb2FkZHIsIGNoYW4tPnJlZyk7CkBAIC0xMDcsNyArMTA3LDcgQEAKIAogc3RhdGljIHZvaWQgcHJvc2F2YWdlX2dwaW9fc2V0c2RhKHZvaWQqIGRhdGEsIGludCB2YWwpCiB7Ci0Jc3RydWN0IHNhdmFnZWZiX2kyY19jaGFuICpjaGFuID0gKHN0cnVjdCBzYXZhZ2VmYl9pMmNfY2hhbiAqKWRhdGE7CisJc3RydWN0IHNhdmFnZWZiX2kyY19jaGFuICpjaGFuID0gZGF0YTsKIAl1bnNpZ25lZCBpbnQgcjsKIAogCVNFVF9DUl9JWChjaGFuLT5pb2FkZHIsIGNoYW4tPnJlZyk7CkBAIC0xMjMsNyArMTIzLDcgQEAKIAogc3RhdGljIGludCBwcm9zYXZhZ2VfZ3Bpb19nZXRzY2wodm9pZCogZGF0YSkKIHsKLQlzdHJ1Y3Qgc2F2YWdlZmJfaTJjX2NoYW4gKmNoYW4gPSAoc3RydWN0IHNhdmFnZWZiX2kyY19jaGFuICopZGF0YTsKKwlzdHJ1Y3Qgc2F2YWdlZmJfaTJjX2NoYW4gKmNoYW4gPSBkYXRhOwogCiAJU0VUX0NSX0lYKGNoYW4tPmlvYWRkciwgY2hhbi0+cmVnKTsKIAlyZXR1cm4gKDAgIT0gKEdFVF9DUl9EQVRBKGNoYW4tPmlvYWRkcikgJiBQUk9TQVZBR0VfSTJDX1NDTF9JTikpOwpAQCAtMTMxLDcgKzEzMSw3IEBACiAKIHN0YXRpYyBpbnQgcHJvc2F2YWdlX2dwaW9fZ2V0c2RhKHZvaWQqIGRhdGEpCiB7Ci0Jc3RydWN0IHNhdmFnZWZiX2kyY19jaGFuICpjaGFuID0gKHN0cnVjdCBzYXZhZ2VmYl9pMmNfY2hhbiAqKWRhdGE7CisJc3RydWN0IHNhdmFnZWZiX2kyY19jaGFuICpjaGFuID0gZGF0YTsKIAogCVNFVF9DUl9JWChjaGFuLT5pb2FkZHIsIGNoYW4tPnJlZyk7CiAJcmV0dXJuICgwICE9IChHRVRfQ1JfREFUQShjaGFuLT5pb2FkZHIpICYgUFJPU0FWQUdFX0kyQ19TREFfSU4pKTsKQEAgLTE0MCwxMCArMTQwLDkgQEAKIHN0YXRpYyBpbnQgc2F2YWdlX3NldHVwX2kyY19idXMoc3RydWN0IHNhdmFnZWZiX2kyY19jaGFuICpjaGFuLAogCQkJCWNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JaW50ICgqYWRkX2J1cykoc3RydWN0IGkyY19hZGFwdGVyICopID0gc3ltYm9sX2dldChpMmNfYml0X2FkZF9idXMpOwogCWludCByYyA9IDA7CiAKLQlpZiAoYWRkX2J1cyAmJiBjaGFuLT5wYXIpIHsKKwlpZiAoY2hhbi0+cGFyKSB7CiAJCXN0cmNweShjaGFuLT5hZGFwdGVyLm5hbWUsIG5hbWUpOwogCQljaGFuLT5hZGFwdGVyLm93bmVyCQk9IFRISVNfTU9EVUxFOwogCQljaGFuLT5hZGFwdGVyLmlkCQk9IEkyQ19IV19CX1NBVkFHRTsKQEAgLTE2MSw3ICsxNjAsNyBAQAogCQljaGFuLT5hbGdvLnNldHNjbChjaGFuLCAxKTsKIAkJdWRlbGF5KDIwKTsKIAotCQlyYyA9IGFkZF9idXMoJmNoYW4tPmFkYXB0ZXIpOworCQlyYyA9IGkyY19iaXRfYWRkX2J1cygmY2hhbi0+YWRhcHRlcik7CiAKIAkJaWYgKHJjID09IDApCiAJCQlkZXZfZGJnKCZjaGFuLT5wYXItPnBjaWRldi0+ZGV2LApAQCAtMTY5LDggKzE2OCw2IEBACiAJCWVsc2UKIAkJCWRldl93YXJuKCZjaGFuLT5wYXItPnBjaWRldi0+ZGV2LAogCQkJCSAiRmFpbGVkIHRvIHJlZ2lzdGVyIEkyQyBidXMgJXMuXG4iLCBuYW1lKTsKLQotCQlzeW1ib2xfcHV0KGkyY19iaXRfYWRkX2J1cyk7CiAJfSBlbHNlCiAJCWNoYW4tPnBhciA9IE5VTEw7CiAKQEAgLTE3OSw3ICsxNzYsNyBAQAogCiB2b2lkIHNhdmFnZWZiX2NyZWF0ZV9pMmNfYnVzc2VzKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciA9IChzdHJ1Y3Qgc2F2YWdlZmJfcGFyICopaW5mby0+cGFyOworCXN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlwYXItPmNoYW4ucGFyCT0gcGFyOwogCiAJc3dpdGNoKGluZm8tPmZpeC5hY2NlbCkgewpAQCAtMTkzLDYgKzE5MCw3IEBACiAJCXBhci0+Y2hhbi5hbGdvLmdldHNjbCA9IHByb3NhdmFnZV9ncGlvX2dldHNjbDsKIAkJYnJlYWs7CiAJY2FzZSBGQl9BQ0NFTF9TQVZBR0U0OgorCWNhc2UgRkJfQUNDRUxfU0FWQUdFMjAwMDoKIAkJcGFyLT5jaGFuLnJlZyAgICAgICAgID0gMHhmZjIwOwogCQlwYXItPmNoYW4uaW9hZGRyICAgICAgPSBwYXItPm1taW8udmJhc2U7CiAJCXBhci0+Y2hhbi5hbGdvLnNldHNkYSA9IHNhdmFnZTRfZ3Bpb19zZXRzZGE7CkBAIC0yMDksMTQgKzIwNywxMCBAQAogCiB2b2lkIHNhdmFnZWZiX2RlbGV0ZV9pMmNfYnVzc2VzKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciA9IChzdHJ1Y3Qgc2F2YWdlZmJfcGFyICopaW5mby0+cGFyOwotCWludCAoKmRlbF9idXMpKHN0cnVjdCBpMmNfYWRhcHRlciAqKSA9Ci0JCXN5bWJvbF9nZXQoaTJjX2JpdF9kZWxfYnVzKTsKKwlzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKLQlpZiAoZGVsX2J1cyAmJiBwYXItPmNoYW4ucGFyKSB7Ci0JCWRlbF9idXMoJnBhci0+Y2hhbi5hZGFwdGVyKTsKLQkJc3ltYm9sX3B1dChpMmNfYml0X2RlbF9idXMpOwotCX0KKwlpZiAocGFyLT5jaGFuLnBhcikKKwkJaTJjX2JpdF9kZWxfYnVzKCZwYXItPmNoYW4uYWRhcHRlcik7CiAKIAlwYXItPmNoYW4ucGFyID0gTlVMTDsKIH0KQEAgLTIyNCw4ICsyMTgsNiBAQAogc3RhdGljIHU4ICpzYXZhZ2VfZG9fcHJvYmVfaTJjX2VkaWQoc3RydWN0IHNhdmFnZWZiX2kyY19jaGFuICpjaGFuKQogewogCXU4IHN0YXJ0ID0gMHgwOwotCWludCAoKnRyYW5zZmVyKShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiwgc3RydWN0IGkyY19tc2cgKiwgaW50KSA9Ci0JCXN5bWJvbF9nZXQoaTJjX3RyYW5zZmVyKTsKIAlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CiAJCXsKIAkJCS5hZGRyCT0gU0FWQUdFX0REQywKQEAgLTIzOSwyMSArMjMxLDE5IEBACiAJfTsKIAl1OCAqYnVmID0gTlVMTDsKIAotCWlmICh0cmFuc2ZlciAmJiBjaGFuLT5wYXIpIHsKKwlpZiAoY2hhbi0+cGFyKSB7CiAJCWJ1ZiA9IGttYWxsb2MoRURJRF9MRU5HVEgsIEdGUF9LRVJORUwpOwogCiAJCWlmIChidWYpIHsKIAkJCW1zZ3NbMV0uYnVmID0gYnVmOwogCi0JCQlpZiAodHJhbnNmZXIoJmNoYW4tPmFkYXB0ZXIsIG1zZ3MsIDIpICE9IDIpIHsKKwkJCWlmIChpMmNfdHJhbnNmZXIoJmNoYW4tPmFkYXB0ZXIsIG1zZ3MsIDIpICE9IDIpIHsKIAkJCQlkZXZfZGJnKCZjaGFuLT5wYXItPnBjaWRldi0+ZGV2LAogCQkJCQkiVW5hYmxlIHRvIHJlYWQgRURJRCBibG9jay5cbiIpOwogCQkJCWtmcmVlKGJ1Zik7CiAJCQkJYnVmID0gTlVMTDsKIAkJCX0KIAkJfQotCi0JCXN5bWJvbF9wdXQoaTJjX3RyYW5zZmVyKTsKIAl9CiAKIAlyZXR1cm4gYnVmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmJfYWNjZWwuYyBiL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2FjY2VsLmMKaW5kZXggYmFjOGVhMy4uYmJjYzA1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmJfYWNjZWwuYworKysgYi9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9hY2NlbC5jCkBAIC0yMSw3ICsyMSw3IEBACiAKIGludCBzYXZhZ2VmYl9zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciA9IChzdHJ1Y3Qgc2F2YWdlZmJfcGFyICopaW5mby0+cGFyOworCXN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAogCXBhci0+U2F2YWdlV2FpdElkbGUocGFyKTsKIAlyZXR1cm4gMDsKQEAgLTI5LDcgKzI5LDcgQEAKIAogdm9pZCBzYXZhZ2VmYl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICpyZWdpb24pCiB7Ci0Jc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gKHN0cnVjdCBzYXZhZ2VmYl9wYXIgKilpbmZvLT5wYXI7CisJc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCWludCBzeCA9IHJlZ2lvbi0+c3gsIGR4ID0gcmVnaW9uLT5keDsKIAlpbnQgc3kgPSByZWdpb24tPnN5LCBkeSA9IHJlZ2lvbi0+ZHk7CiAJaW50IGNtZDsKQEAgLTYzLDcgKzYzLDcgQEAKIAogdm9pZCBzYXZhZ2VmYl9maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KQogewotCXN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciA9IChzdHJ1Y3Qgc2F2YWdlZmJfcGFyICopaW5mby0+cGFyOworCXN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlpbnQgY21kLCBjb2xvcjsKIAogCWlmICghcmVjdC0+d2lkdGggfHwgIXJlY3QtPmhlaWdodCkKQEAgLTkwLDcgKzkwLDcgQEAKIAogdm9pZCBzYXZhZ2VmYl9pbWFnZWJsaXQoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9pbWFnZSAqaW1hZ2UpCiB7Ci0Jc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gKHN0cnVjdCBzYXZhZ2VmYl9wYXIgKilpbmZvLT5wYXI7CisJc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCWludCBmZywgYmcsIHNpemUsIGksIHdpZHRoOwogCWludCBjbWQ7CiAJdTMyICpzcmMgPSAodTMyICopIGltYWdlLT5kYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmJfZHJpdmVyLmMgYi9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYwppbmRleCAwOWUyZjI4Li5hYjcyN2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYwpAQCAtNjg2LDcgKzY4Niw3IEBACiBzdGF0aWMgaW50IHNhdmFnZWZiX2NoZWNrX3ZhciAoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICAgKnZhciwKIAkJCSAgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIgPSAoc3RydWN0IHNhdmFnZWZiX3BhciAqKWluZm8tPnBhcjsKKwlzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJaW50IG1lbWxlbiwgdnJhbWxlbiwgbW9kZV92YWxpZCA9IDA7CiAKIAlEQkcoInNhdmFnZWZiX2NoZWNrX3ZhciIpOwpAQCAtMTAyNSw3ICsxMDI1LDcgQEAKIAkJCSAgICAgIHVuc2lnbmVkICAgICAgICB0cmFuc3AsCiAJCQkgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIgPSAoc3RydWN0IHNhdmFnZWZiX3BhciAqKWluZm8tPnBhcjsKKwlzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKIAlpZiAocmVnbm8gPj0gTlJfUEFMRVRURSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMzI4LDcgKzEzMjgsNyBAQAogI2lmIGRlZmluZWQoQ09ORklHX0ZCX1NBVkFHRV9BQ0NFTCkKIHN0YXRpYyB2b2lkIHNhdmFnZWZiX3NldF9jbGlwKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotICAgIHN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciA9IChzdHJ1Y3Qgc2F2YWdlZmJfcGFyICopaW5mby0+cGFyOworICAgIHN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKICAgICBpbnQgY21kOwogCiAgICAgY21kID0gQkNJX0NNRF9OT1AgfCBCQ0lfQ01EX0NMSVBfTkVXOwpAQCAtMTM0Miw3ICsxMzQyLDcgQEAKIAogc3RhdGljIGludCBzYXZhZ2VmYl9zZXRfcGFyIChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIgPSAoc3RydWN0IHNhdmFnZWZiX3BhciAqKWluZm8tPnBhcjsKKwlzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmaW5mby0+dmFyOwogCWludCBlcnI7CiAKQEAgLTEzODEsMjkgKzEzODEsOSBAQAogc3RhdGljIGludCBzYXZhZ2VmYl9wYW5fZGlzcGxheSAoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCiAJCQkJIHN0cnVjdCBmYl9pbmZvICAgICAgICAgICAqaW5mbykKIHsKLQlzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIgPSAoc3RydWN0IHNhdmFnZWZiX3BhciAqKWluZm8tPnBhcjsKLQl1X2ludCB5X2JvdHRvbTsKLQotCXlfYm90dG9tID0gdmFyLT55b2Zmc2V0OwotCi0JaWYgKCEodmFyLT52bW9kZSAmIEZCX1ZNT0RFX1lXUkFQKSkKLQkJeV9ib3R0b20gKz0gdmFyLT55cmVzOwotCi0JaWYgKHZhci0+eG9mZnNldCA+ICh2YXItPnhyZXNfdmlydHVhbCAtIHZhci0+eHJlcykpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICh5X2JvdHRvbSA+IGluZm8tPnZhci55cmVzX3ZpcnR1YWwpCi0JCXJldHVybiAtRUlOVkFMOworCXN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAogCXNhdmFnZWZiX3VwZGF0ZV9zdGFydCAocGFyLCB2YXIpOwotCi0JaW5mby0+dmFyLnhvZmZzZXQgPSB2YXItPnhvZmZzZXQ7Ci0JaW5mby0+dmFyLnlvZmZzZXQgPSB2YXItPnlvZmZzZXQ7Ci0KLQlpZiAodmFyLT52bW9kZSAmIEZCX1ZNT0RFX1lXUkFQKQotCQlpbmZvLT52YXIudm1vZGUgfD0gRkJfVk1PREVfWVdSQVA7Ci0JZWxzZQotCQlpbmZvLT52YXIudm1vZGUgJj0gfkZCX1ZNT0RFX1lXUkFQOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1MzQsNyArMTUxNCw3IEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNhdmFnZV9tYXBfbW1pbyAoc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gKHN0cnVjdCBzYXZhZ2VmYl9wYXIgKilpbmZvLT5wYXI7CisJc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCURCRyAoInNhdmFnZV9tYXBfbW1pbyIpOwogCiAJaWYgKFMzX1NBVkFHRTNEX1NFUklFUyAocGFyLT5jaGlwKSkKQEAgLTE1NjcsNyArMTU0Nyw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBzYXZhZ2VfdW5tYXBfbW1pbyAoc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gKHN0cnVjdCBzYXZhZ2VmYl9wYXIgKilpbmZvLT5wYXI7CisJc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCURCRyAoInNhdmFnZV91bm1hcF9tbWlvIik7CiAKIAlzYXZhZ2VfZGlzYWJsZV9tbWlvKHBhcik7CkBAIC0xNTgxLDcgKzE1NjEsNyBAQAogc3RhdGljIGludCBfX2RldmluaXQgc2F2YWdlX21hcF92aWRlbyAoc3RydWN0IGZiX2luZm8gKmluZm8sCiAJCQkJICAgICAgIGludCB2aWRlb19sZW4pCiB7Ci0Jc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gKHN0cnVjdCBzYXZhZ2VmYl9wYXIgKilpbmZvLT5wYXI7CisJc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCWludCByZXNvdXJjZTsKIAogCURCRygic2F2YWdlX21hcF92aWRlbyIpOwpAQCAtMTYxOSw3ICsxNTk5LDcgQEAKIAogc3RhdGljIHZvaWQgX19kZXZpbml0IHNhdmFnZV91bm1hcF92aWRlbyAoc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gKHN0cnVjdCBzYXZhZ2VmYl9wYXIgKilpbmZvLT5wYXI7CisJc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCiAJREJHKCJzYXZhZ2VfdW5tYXBfdmlkZW8iKTsKIApAQCAtMTg2OSw3ICsxODQ5LDcgQEAKIAkJCQkJICBzdHJ1Y3QgcGNpX2RldiAqZGV2LAogCQkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKLQlzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIgPSAoc3RydWN0IHNhdmFnZWZiX3BhciAqKWluZm8tPnBhcjsKKwlzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJaW50IGVyciA9IDA7CiAKIAlwYXItPnBjaWRldiAgPSBkZXY7CkBAIC0yMTM5LDggKzIxMTksNyBAQAogCiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgc2F2YWdlZmJfcmVtb3ZlIChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCXN0cnVjdCBmYl9pbmZvICppbmZvID0KLQkJKHN0cnVjdCBmYl9pbmZvICopcGNpX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKIAogCURCRygic2F2YWdlZmJfcmVtb3ZlIik7CiAKQEAgLTIxNzQsOSArMjE1Myw4IEBACiAKIHN0YXRpYyBpbnQgc2F2YWdlZmJfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCXN0cnVjdCBmYl9pbmZvICppbmZvID0KLQkJKHN0cnVjdCBmYl9pbmZvICopcGNpX2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gKHN0cnVjdCBzYXZhZ2VmYl9wYXIgKilpbmZvLT5wYXI7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKIAlEQkcoInNhdmFnZWZiX3N1c3BlbmQiKTsKIApAQCAtMjIxMCw5ICsyMTg4LDggQEAKIAogc3RhdGljIGludCBzYXZhZ2VmYl9yZXN1bWUgKHN0cnVjdCBwY2lfZGV2KiBkZXYpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmluZm8gPQotCQkoc3RydWN0IGZiX2luZm8gKilwY2lfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3Qgc2F2YWdlZmJfcGFyICpwYXIgPSAoc3RydWN0IHNhdmFnZWZiX3BhciAqKWluZm8tPnBhcjsKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlpbnQgY3VyX3N0YXRlID0gcGFyLT5wbV9zdGF0ZTsKIAogCURCRygic2F2YWdlX3Jlc3VtZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zYnVzbGliLmMgYi9kcml2ZXJzL3ZpZGVvL3NidXNsaWIuYwppbmRleCAzYTc0YTYzZC4uYTRkN2NjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zYnVzbGliLmMKKysrIGIvZHJpdmVycy92aWRlby9zYnVzbGliLmMKQEAgLTE5OSw4ICsxOTksNyBAQAogI2RlZmluZSBGQklPUFVUQ01BUDMyCV9JT1coJ0YnLCAzLCBzdHJ1Y3QgZmJjbWFwMzIpCiAjZGVmaW5lIEZCSU9HRVRDTUFQMzIJX0lPVygnRicsIDQsIHN0cnVjdCBmYmNtYXAzMikKIAotc3RhdGljIGludCBmYmlvZ2V0cHV0Y21hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZiX2luZm8gKmluZm8sCi0JCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBmYmlvZ2V0cHV0Y21hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGZiY21hcDMyIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlzdHJ1Y3QgZmJjbWFwIF9fdXNlciAqcCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcCkpOwpAQCAtMjE2LDEwICsyMTUsMTAgQEAKIAlyZXQgfD0gcHV0X3VzZXIoY29tcGF0X3B0cihhZGRyKSwgJnAtPmJsdWUpOwogCWlmIChyZXQpCiAJCXJldHVybiAtRUZBVUxUOwotCXJldHVybiBpbmZvLT5mYm9wcy0+ZmJfaW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJcmV0dXJuIGluZm8tPmZib3BzLT5mYl9pb2N0bChpbmZvLAogCQkJKGNtZCA9PSBGQklPUFVUQ01BUDMyKSA/CiAJCQlGQklPUFVUQ01BUF9TUEFSQyA6IEZCSU9HRVRDTUFQX1NQQVJDLAotCQkJKHVuc2lnbmVkIGxvbmcpcCwgaW5mbyk7CisJCQkodW5zaWduZWQgbG9uZylwKTsKIH0KIAogc3RydWN0IGZiY3Vyc29yMzIgewpAQCAtMjM2LDggKzIzNSw3IEBACiAjZGVmaW5lIEZCSU9TQ1VSU09SMzIJX0lPVygnRicsIDI0LCBzdHJ1Y3QgZmJjdXJzb3IzMikKICNkZWZpbmUgRkJJT0dDVVJTT1IzMglfSU9XKCdGJywgMjUsIHN0cnVjdCBmYmN1cnNvcjMyKQogCi1zdGF0aWMgaW50IGZiaW9nc2N1cnNvcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZiX2luZm8gKmluZm8sCi0JCXVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBmYmlvZ3NjdXJzb3Ioc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBmYmN1cnNvciBfX3VzZXIgKnAgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnApKTsKIAlzdHJ1Y3QgZmJjdXJzb3IzMiBfX3VzZXIgKmFyZ3AgPSAgKHZvaWQgX191c2VyICopYXJnOwpAQCAtMjYwLDEyICsyNTgsMTAgQEAKIAlyZXQgfD0gcHV0X3VzZXIoY29tcGF0X3B0cihhZGRyKSwgJnAtPmltYWdlKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gaW5mby0+ZmJvcHMtPmZiX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAotCQkJRkJJT1NDVVJTT1IsICh1bnNpZ25lZCBsb25nKXAsIGluZm8pOworCXJldHVybiBpbmZvLT5mYm9wcy0+ZmJfaW9jdGwoaW5mbywgRkJJT1NDVVJTT1IsICh1bnNpZ25lZCBsb25nKXApOwogfQogCi1sb25nIHNidXNmYl9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCXVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK2ludCBzYnVzZmJfY29tcGF0X2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgRkJJT0dUWVBFOgpAQCAtMjc4LDE0ICsyNzQsMTMgQEAKIAljYXNlIEZCSU9TQ1VSUE9TOgogCWNhc2UgRkJJT0dDVVJQT1M6CiAJY2FzZSBGQklPR0NVUk1BWDoKLQkJcmV0dXJuIGluZm8tPmZib3BzLT5mYl9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwKLQkJCQlmaWxlLCBjbWQsIGFyZywgaW5mbyk7CisJCXJldHVybiBpbmZvLT5mYm9wcy0+ZmJfaW9jdGwoaW5mbywgY21kLCBhcmcpOwogCWNhc2UgRkJJT1BVVENNQVAzMjoKLQkJcmV0dXJuIGZiaW9nZXRwdXRjbWFwKGZpbGUsIGluZm8sIGNtZCwgYXJnKTsKKwkJcmV0dXJuIGZiaW9nZXRwdXRjbWFwKGluZm8sIGNtZCwgYXJnKTsKIAljYXNlIEZCSU9HRVRDTUFQMzI6Ci0JCXJldHVybiBmYmlvZ2V0cHV0Y21hcChmaWxlLCBpbmZvLCBjbWQsIGFyZyk7CisJCXJldHVybiBmYmlvZ2V0cHV0Y21hcChpbmZvLCBjbWQsIGFyZyk7CiAJY2FzZSBGQklPU0NVUlNPUjMyOgotCQlyZXR1cm4gZmJpb2dzY3Vyc29yKGZpbGUsIGluZm8sIGFyZyk7CisJCXJldHVybiBmYmlvZ3NjdXJzb3IoaW5mbywgYXJnKTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2J1c2xpYi5oIGIvZHJpdmVycy92aWRlby9zYnVzbGliLmgKaW5kZXggYjQ3MGU1Mi4uNDkyODI4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zYnVzbGliLmgKKysrIGIvZHJpdmVycy92aWRlby9zYnVzbGliLmgKQEAgLTIwLDcgKzIwLDcgQEAKIGludCBzYnVzZmJfaW9jdGxfaGVscGVyKHVuc2lnbmVkIGxvbmcgY21kLCB1bnNpZ25lZCBsb25nIGFyZywKIAkJCXN0cnVjdCBmYl9pbmZvICppbmZvLAogCQkJaW50IHR5cGUsIGludCBmYl9kZXB0aCwgdW5zaWduZWQgbG9uZyBmYl9zaXplKTsKLWxvbmcgc2J1c2ZiX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJdW5zaWduZWQgbG9uZyBhcmcsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK2ludCBzYnVzZmJfY29tcGF0X2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgY21kLAorCQl1bnNpZ25lZCBsb25nIGFyZyk7CiAKICNlbmRpZiAvKiBfU0JVU0xJQl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NnaXZ3ZmIuYyBiL2RyaXZlcnMvdmlkZW8vc2dpdndmYi5jCmluZGV4IDcwNTQ2NjAuLjJlNmRmMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2dpdndmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2dpdndmYi5jCkBAIC0xMTUsNyArMTE1LDcgQEAKIHN0YXRpYyBpbnQgc2dpdndmYl9zZXRjb2xyZWcodV9pbnQgcmVnbm8sIHVfaW50IHJlZCwgdV9pbnQgZ3JlZW4sCiAJCQkgICAgIHVfaW50IGJsdWUsIHVfaW50IHRyYW5zcCwKIAkJCSAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCBzZ2l2d2ZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmaWxlICpmaWxlLAorc3RhdGljIGludCBzZ2l2d2ZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sCiAJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiAKIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIHNnaXZ3ZmJfb3BzID0gewpAQCAtNzA2LDcgKzcwNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2dpdndmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKK3N0YXRpYyBpbnQgc2dpdndmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLAogCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJdW5zaWduZWQgbG9uZyBzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OwpAQCAtNzIzLDcgKzcyMyw2IEBACiAJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIG9mZnNldCA+PiBQQUdFX1NISUZULAogCQkJCQkJc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQogCQlyZXR1cm4gLUVBR0FJTjsKLQl2bWEtPnZtX2ZpbGUgPSBmaWxlOwogCXByaW50ayhLRVJOX0RFQlVHICJzZ2l2d2ZiOiBtbWFwIGZyYW1lYnVmZmVyIFAoJWx4KS0+ViglbHgpXG4iLAogCSAgICAgICBvZmZzZXQsIHZtYS0+dm1fc3RhcnQpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zaXMvc2lzX21haW4uYyBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19tYWluLmMKaW5kZXggZGVhMWE0Ni4uOGFkZjViZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaXMvc2lzX21haW4uYworKysgYi9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfbWFpbi5jCkBAIC0xNzQzLDEzICsxNzQzLDE0IEBACiAKIC8qIC0tLS0tLS0tLS0tIEZCRGV2IHJlbGF0ZWQgcm91dGluZXMgZm9yIGFsbCBzZXJpZXMgLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50Ci1zaXNmYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCSAgICBpbnQgY29uLAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTUpCitzdGF0aWMgaW50CXNpc2ZiX2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKQorI2Vsc2UKK3N0YXRpYyBpbnQJc2lzZmJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsCisJCQkJc3RydWN0IGZiX2luZm8gKmluZm8pCiAjZW5kaWYKLQkgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IHNpc192aWRlb19pbmZvCSppdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopaW5mby0+cGFyOwogCXN0cnVjdCBzaXNfbWVtcmVxCXNpc21lbXJlcTsKQEAgLTE5MjQsMTkgKzE5MjUsNiBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgU0lTX05FV19DT05GSUdfQ09NUEFUCi1zdGF0aWMgbG9uZwotc2lzZmJfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZiX2luZm8gKmluZm8pCi17Ci0JaW50IHJldDsKLQotCWxvY2tfa2VybmVsKCk7Ci0JcmV0ID0gc2lzZmJfaW9jdGwoTlVMTCwgZiwgY21kLCBhcmcsIGluZm8pOwotCXVubG9ja19rZXJuZWwoKTsKLQlyZXR1cm4gcmV0OwotfQotI2VuZGlmCi0KIHN0YXRpYyBpbnQKIHNpc2ZiX2dldF9maXgoc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXgsIGludCBjb24sIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewpAQCAtMjAwNyw3ICsxOTk1LDcgQEAKICNlbmRpZgogCS5mYl9zeW5jCT0gZmJjb25fc2lzX3N5bmMsCiAjaWZkZWYgU0lTX05FV19DT05GSUdfQ09NUEFUCi0JLmZiX2NvbXBhdF9pb2N0bD0gc2lzZmJfY29tcGF0X2lvY3RsLAorCS5mYl9jb21wYXRfaW9jdGw9IHNpc2ZiX2lvY3RsLAogI2VuZGlmCiAJLmZiX2lvY3RsCT0gc2lzZmJfaW9jdGwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfbWFpbi5oIGIvZHJpdmVycy92aWRlby9zaXMvc2lzX21haW4uaAppbmRleCA0NDViY2JiLi43MGI2ZGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfbWFpbi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19tYWluLmgKQEAgLTcyNyw5ICs3MjcsMTQgQEAKICNlbmRpZgogCiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTUpCitzdGF0aWMgaW50CXNpc2ZiX2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKKyNlbHNlCiBzdGF0aWMgaW50CXNpc2ZiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLAogCQkJCXN0cnVjdCBmYl9pbmZvICppbmZvKTsKKyNlbmRpZgogc3RhdGljIGludAlzaXNmYl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIHN0YXRpYyBpbnQJc2lzZmJfYmxhbmsoaW50IGJsYW5rLAogCQkJCXN0cnVjdCBmYl9pbmZvICppbmZvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2tlbGV0b25mYi5jIGIvZHJpdmVycy92aWRlby9za2VsZXRvbmZiLmMKaW5kZXggYTAxZTdlY2MuLjliNzA3NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2tlbGV0b25mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2tlbGV0b25mYi5jCkBAIC0xMTUsNyArMTE1LDggQEAKICAgICAvKgogICAgICAqICBJZiB5b3VyIGRyaXZlciBzdXBwb3J0cyBtdWx0aXBsZSBib2FyZHMgb3IgaXQgc3VwcG9ydHMgbXVsdGlwbGUgCiAgICAgICogIGZyYW1lYnVmZmVycywgeW91IHNob3VsZCBtYWtlIHRoZXNlIGFycmF5cywgb3IgYWxsb2NhdGUgdGhlbSAKLSAgICAgKiAgZHluYW1pY2FsbHkgKHVzaW5nIGttYWxsb2MoKSkuIAorICAgICAqICBkeW5hbWljYWxseSB1c2luZyBmcmFtZWJ1ZmZlcl9hbGxvYygpIGFuZCBmcmVlIHRoZW0gd2l0aAorICAgICAqICBmcmFtZWJ1ZmZlcl9yZWxlYXNlKCkuCiAgICAgICovIAogc3RhdGljIHN0cnVjdCBmYl9pbmZvIGluZm87CiAKQEAgLTE3OSwxOCArMTgwLDMxIEBACiAgKglpbnRlbnQgdG8gb25seSB0ZXN0IGEgbW9kZSBhbmQgbm90IGFjdHVhbGx5IHNldCBpdC4gVGhlIHN0dWZmIGluIAogICoJbW9kZWRiLmMgaXMgYSBleGFtcGxlIG9mIHRoaXMuIElmIHRoZSB2YXIgcGFzc2VkIGluIGlzIHNsaWdodGx5IAogICoJb2ZmIGJ5IHdoYXQgdGhlIGhhcmR3YXJlIGNhbiBzdXBwb3J0IHRoZW4gd2UgYWx0ZXIgdGhlIHZhciBQQVNTRUQgaW4KLSAqCXRvIHdoYXQgd2UgY2FuIGRvLiBJZiB0aGUgaGFyZHdhcmUgZG9lc24ndCBzdXBwb3J0IG1vZGUgY2hhbmdlIAotICogCWEgLUVJTlZBTCB3aWxsIGJlIHJldHVybmVkIGJ5IHRoZSB1cHBlciBsYXllcnMuIFlvdSBkb24ndCBuZWVkIHRvIAotICoJaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24gdGhlbi4gSWYgeW91IGhhcmR3YXJlIGRvZXNuJ3Qgc3VwcG9ydCAKLSAqCWNoYW5naW5nIHRoZSByZXNvbHV0aW9uIHRoZW4gdGhpcyBmdW5jdGlvbiBpcyBub3QgbmVlZGVkLiBJbiB0aGlzCi0gKgljYXNlIHRoZSBkcml2ZXIgd291ZGwganVzdCBwcm92aWRlIGEgdmFyIHRoYXQgcmVwcmVzZW50cyB0aGUgc3RhdGljCi0gKglzdGF0ZSB0aGUgc2NyZWVuIGlzIGluLgorICoJdG8gd2hhdCB3ZSBjYW4gZG8uCisgKgorICogICAgICBGb3IgdmFsdWVzIHRoYXQgYXJlIG9mZiwgdGhpcyBmdW5jdGlvbiBtdXN0IHJvdW5kIHRoZW0gX3VwXyB0byB0aGUKKyAqICAgICAgbmV4dCB2YWx1ZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUuICBJZiB0aGUgdmFsdWUgaXMKKyAqICAgICAgZ3JlYXRlciB0aGFuIHRoZSBoaWdoZXN0IHZhbHVlIHN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUsIHRoZW4gdGhpcworICogICAgICBmdW5jdGlvbiBtdXN0IHJldHVybiAtRUlOVkFMLgorICoKKyAqICAgICAgRXhjZXB0aW9uIHRvIHRoZSBhYm92ZSBydWxlOiAgU29tZSBkcml2ZXJzIGhhdmUgYSBmaXhlZCBtb2RlLCBpZSwKKyAqICAgICAgdGhlIGhhcmR3YXJlIGlzIGFscmVhZHkgc2V0IGF0IGJvb3QgdXAsIGFuZCBjYW5ub3QgYmUgY2hhbmdlZC4gIEluCisgKiAgICAgIHRoaXMgY2FzZSwgaXQgaXMgbW9yZSBhY2NlcHRhYmxlIHRoYXQgdGhpcyBmdW5jdGlvbiBqdXN0IHJldHVybgorICogICAgICBhIGNvcHkgb2YgdGhlIGN1cnJlbnRseSB3b3JraW5nIHZhciAoaW5mby0+dmFyKS4gQmV0dGVyIGlzIHRvIG5vdAorICogICAgICBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiwgYXMgdGhlIHVwcGVyIGxheWVyIHdpbGwgZG8gdGhlIGNvcHlpbmcKKyAqICAgICAgb2YgdGhlIGN1cnJlbnQgdmFyIGZvciB5b3UuCisgKgorICogICAgICBOb3RlOiAgVGhpcyBpcyB0aGUgb25seSBmdW5jdGlvbiB3aGVyZSB0aGUgY29udGVudHMgb2YgdmFyIGNhbiBiZQorICogICAgICBmcmVlbHkgYWRqdXN0ZWQgYWZ0ZXIgdGhlIGRyaXZlciBoYXMgYmVlbiByZWdpc3RlcmVkLiBJZiB5b3UgZmluZAorICogICAgICB0aGF0IHlvdSBoYXZlIGNvZGUgb3V0c2lkZSBvZiB0aGlzIGZ1bmN0aW9uIHRoYXQgYWx0ZXJzIHRoZSBjb250ZW50CisgKiAgICAgIG9mIHZhciwgdGhlbiB5b3UgYXJlIGRvaW5nIHNvbWV0aGluZyB3cm9uZy4gIE5vdGUgYWxzbyB0aGF0IHRoZQorICogICAgICBjb250ZW50cyBvZiBpbmZvLT52YXIgbXVzdCBiZSBsZWZ0IHVudG91Y2hlZCBhdCBhbGwgdGltZXMgYWZ0ZXIKKyAqICAgICAgZHJpdmVyIHJlZ2lzdHJhdGlvbi4KICAqCiAgKglSZXR1cm5zIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLCBvciB6ZXJvIG9uIHN1Y2Nlc3MuCiAgKi8KIHN0YXRpYyBpbnQgeHh4ZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLSAgICBjb25zdCBzdHJ1Y3QgeHh4X3BhciAqcGFyID0gKGNvbnN0IHN0cnVjdCB4eHhfcGFyICopIGluZm8tPnBhcjsKICAgICAvKiAuLi4gKi8KICAgICByZXR1cm4gMDsJICAgCQogfQpAQCAtMjA0LDE0ICsyMTgsMzkgQEAKICAqCWZiX2ZpeF9zY3JlZW5pbmZvIHN0b3JlZCBpbiBmYl9pbmZvLiBJdCBkb2Vzbid0IG5vdCBhbHRlciB2YXIgaW4gCiAgKglmYl9pbmZvIHNpbmNlIHdlIGFyZSB1c2luZyB0aGF0IGRhdGEuIFRoaXMgbWVhbnMgd2UgZGVwZW5kIG9uIHRoZQogICoJZGF0YSBpbiB2YXIgaW5zaWRlIGZiX2luZm8gdG8gYmUgc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZS4gCi0gKgl4eHhmYl9jaGVja192YXIgaXMgYWx3YXlzIGNhbGxlZCBiZWZvcmUgeHh4ZmJfc2V0X3BhciB0byBlbnN1cmUgdGhpcy4KKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgYWxzbyB1c2VkIHRvIHJlY292ZXIvcmVzdG9yZSB0aGUgaGFyZHdhcmUgdG8gYQorICogICAgICBrbm93biB3b3JraW5nIHN0YXRlLgorICoKKyAqCXh4eGZiX2NoZWNrX3ZhciBpcyBhbHdheXMgY2FsbGVkIGJlZm9yZSB4eHhmYl9zZXRfcGFyIHRvIGVuc3VyZSB0aGF0CisgKiAgICAgIHRoZSBjb250ZW50cyBvZiB2YXIgaXMgYWx3YXlzIHZhbGlkLgorICoKICAqCUFnYWluIGlmIHlvdSBjYW4ndCBjaGFuZ2UgdGhlIHJlc29sdXRpb24geW91IGRvbid0IG5lZWQgdGhpcyBmdW5jdGlvbi4KICAqCisgKiAgICAgIEhvd2V2ZXIsIGV2ZW4gaWYgeW91ciBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IG1vZGUgY2hhbmdpbmcsCisgKiAgICAgIGEgc2V0X3BhciBtaWdodCBiZSBuZWVkZWQgdG8gYXQgbGVhc3QgaW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUgdG8KKyAqICAgICAgYSBrbm93biB3b3JraW5nIHN0YXRlLCBlc3BlY2lhbGx5IGlmIGl0IGNhbWUgYmFjayBmcm9tIGFub3RoZXIKKyAqICAgICAgcHJvY2VzcyB0aGF0IGFsc28gbW9kaWZpZXMgdGhlIHNhbWUgaGFyZHdhcmUsIHN1Y2ggYXMgWC4KKyAqCisgKiAgICAgIElmIHRoaXMgaXMgdGhlIGNhc2UsIGEgY29tYmluYXRpb24gc3VjaCBhcyB0aGUgZm9sbG93aW5nIHNob3VsZCB3b3JrOgorICoKKyAqICAgICAgc3RhdGljIGludCB4eHhmYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCisgKiAgICAgIHsKKyAqICAgICAgICAgICAgICAqdmFyID0gaW5mby0+dmFyOworICogICAgICAgICAgICAgIHJldHVybiAwOworICogICAgICB9CisgKgorICogICAgICBzdGF0aWMgaW50IHh4eGZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pCisgKiAgICAgIHsKKyAqICAgICAgICAgICAgICBpbml0IHlvdXIgaGFyZHdhcmUgaGVyZQorICogICAgICB9CisgKgogICoJUmV0dXJucyBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvciwgb3IgemVybyBvbiBzdWNjZXNzLgogICovCiBzdGF0aWMgaW50IHh4eGZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0gICAgc3RydWN0IHh4eF9wYXIgKnBhciA9IChzdHJ1Y3QgeHh4X3BhciAqKSBpbmZvLT5wYXI7CisgICAgc3RydWN0IHh4eF9wYXIgKnBhciA9IGluZm8tPnBhcjsKICAgICAvKiAuLi4gKi8KICAgICByZXR1cm4gMDsJCiB9CkBAIC0yNTgsNzAgKzI5NywxMTAgQEAKICAgICAgKiAgIHZhci0+e2NvbG9yfS5vZmZzZXQgY29udGFpbnMgc3RhcnQgb2YgYml0ZmllbGQKICAgICAgKiAgIHZhci0+e2NvbG9yfS5sZW5ndGggY29udGFpbnMgbGVuZ3RoIG9mIGJpdGZpZWxkCiAgICAgICogICB7aGFyZHdhcmVzcGVjaWZpY30gY29udGFpbnMgd2lkdGggb2YgREFDCi0gICAgICogICBjbWFwW1hdIGlzIHByb2dyYW1tZWQgdG8gKFggPDwgcmVkLm9mZnNldCkgfCAoWCA8PCBncmVlbi5vZmZzZXQpIHwgKFggPDwgYmx1ZS5vZmZzZXQpCisgICAgICogICBwc2V1ZG9fcGFsZXR0ZVtYXSBpcyBwcm9ncmFtbWVkIHRvIChYIDw8IHJlZC5vZmZzZXQpIHwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFggPDwgZ3JlZW4ub2Zmc2V0KSB8CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYIDw8IGJsdWUub2Zmc2V0KQogICAgICAqICAgUkFNREFDW1hdIGlzIHByb2dyYW1tZWQgdG8gKHJlZCwgZ3JlZW4sIGJsdWUpCisgICAgICogICBjb2xvciBkZXB0aCA9IFNVTSh2YXItPntjb2xvcn0ubGVuZ3RoKQogICAgICAqCiAgICAgICogUHNldWRvY29sb3I6Ci0gICAgICogICAgdXNlcyBvZmZzZXQgPSAwICYmIGxlbmd0aCA9IERBQyByZWdpc3RlciB3aWR0aC4KICAgICAgKiAgICB2YXItPntjb2xvcn0ub2Zmc2V0IGlzIDAKLSAgICAgKiAgICB2YXItPntjb2xvcn0ubGVuZ3RoIGNvbnRhaW5zIHdpZGh0IG9mIERBQwotICAgICAqICAgIGNtYXAgaXMgbm90IHVzZWQKLSAgICAgKiAgICBEQUNbWF0gaXMgcHJvZ3JhbW1lZCB0byAocmVkLCBncmVlbiwgYmx1ZSkKKyAgICAgKiAgICB2YXItPntjb2xvcn0ubGVuZ3RoIGNvbnRhaW5zIHdpZHRoIG9mIERBQyBvciB0aGUgbnVtYmVyIG9mIHVuaXF1ZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzIGF2YWlsYWJsZSAoY29sb3IgZGVwdGgpCisgICAgICogICAgcHNldWRvX3BhbGV0dGUgaXMgbm90IHVzZWQKKyAgICAgKiAgICBSQU1EQUNbWF0gaXMgcHJvZ3JhbW1lZCB0byAocmVkLCBncmVlbiwgYmx1ZSkKKyAgICAgKiAgICBjb2xvciBkZXB0aCA9IHZhci0+e2NvbG9yfS5sZW5ndGgKKyAgICAgKgorICAgICAqIFN0YXRpYyBwc2V1ZG9jb2xvcjoKKyAgICAgKiAgICBzYW1lIGFzIFBzZXVkb2NvbG9yLCBidXQgdGhlIFJBTURBQyBpcyBub3QgcHJvZ3JhbW1lZCAocmVhZC1vbmx5KQorICAgICAqCisgICAgICogTW9ubzAxL01vbm8xMDoKKyAgICAgKiAgICBIYXMgb25seSAyIHZhbHVlcywgYmxhY2sgb24gd2hpdGUgb3Igd2hpdGUgb24gYmxhY2sgKGZnIG9uIGJnKSwKKyAgICAgKiAgICB2YXItPntjb2xvcn0ub2Zmc2V0IGlzIDAKKyAgICAgKiAgICB3aGl0ZSA9ICgxIDw8IHZhci0+e2NvbG9yfS5sZW5ndGgpIC0gMSwgYmxhY2sgPSAwCisgICAgICogICAgcHNldWRvX3BhbGV0dGUgaXMgbm90IHVzZWQKKyAgICAgKiAgICBSQU1EQUMgZG9lcyBub3QgZXhpc3QKKyAgICAgKiAgICBjb2xvciBkZXB0aCBpcyBhbHdheXMgMgorICAgICAqCiAgICAgICogVHJ1ZWNvbG9yOgogICAgICAqICAgIGRvZXMgbm90IHVzZSBSQU1EQUMgKHVzdWFsbHkgaGFzIDMgb2YgdGhlbSkuCiAgICAgICogICAgdmFyLT57Y29sb3J9Lm9mZnNldCBjb250YWlucyBzdGFydCBvZiBiaXRmaWVsZAogICAgICAqICAgIHZhci0+e2NvbG9yfS5sZW5ndGggY29udGFpbnMgbGVuZ3RoIG9mIGJpdGZpZWxkCi0gICAgICogICAgY21hcCBpcyBwcm9ncmFtbWVkIHRvIChyZWQgPDwgcmVkLm9mZnNldCkgfCAoZ3JlZW4gPDwgZ3JlZW4ub2Zmc2V0KSB8Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgKGJsdWUgPDwgYmx1ZS5vZmZzZXQpIHwgKHRyYW5zcCA8PCB0cmFuc3Aub2Zmc2V0KQorICAgICAqICAgIHBzZXVkb19wYWxldHRlIGlzIHByb2dyYW1tZWQgdG8gKHJlZCA8PCByZWQub2Zmc2V0KSB8CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JlZW4gPDwgZ3JlZW4ub2Zmc2V0KSB8CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSA8PCBibHVlLm9mZnNldCkgfAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyYW5zcCA8PCB0cmFuc3Aub2Zmc2V0KQogICAgICAqICAgIFJBTURBQyBkb2VzIG5vdCBleGlzdAorICAgICAqICAgIGNvbG9yIGRlcHRoID0gU1VNKHZhci0+e2NvbG9yfS5sZW5ndGh9KQorICAgICAqCisgICAgICogIFRoZSBjb2xvciBkZXB0aCBpcyB1c2VkIGJ5IGZiY29uIGZvciBjaG9vc2luZyB0aGUgbG9nbyBhbmQgYWxzbworICAgICAqICBmb3IgY29sb3IgcGFsZXR0ZSB0cmFuc2Zvcm1hdGlvbiBpZiBjb2xvciBkZXB0aCA8IDQKKyAgICAgKgorICAgICAqICBBcyBjYW4gYmUgc2VlbiBmcm9tIHRoZSBhYm92ZSwgdGhlIGZpZWxkIGJpdHNfcGVyX3BpeGVsIGlzIF9OT1RfCisgICAgICogIGEgY3JpdGVyaWEgZm9yIGRlc2NyaWJpbmcgdGhlIGNvbG9yIHZpc3VhbC4KKyAgICAgKgorICAgICAqICBBIGNvbW1vbiBtaXN0YWtlIGlzIGFzc3VtaW5nIHRoYXQgYml0c19wZXJfcGl4ZWwgPD0gOCBpcyBwc2V1ZG9jb2xvciwKKyAgICAgKiAgYW5kIGhpZ2hlciB0aGFuIHRoYXQsIHRydWUvZGlyZWN0Y29sb3IuICBUaGlzIGlzIGluY29ycmVjdCwgb25lIG5lZWRzCisgICAgICogIHRvIGxvb2sgYXQgdGhlIGZpeC0+dmlzdWFsLgorICAgICAqCisgICAgICogIEFub3RoZXIgY29tbW9uIG1pc3Rha2UgaXMgdXNpbmcgYml0c19wZXJfcGl4ZWwgdG8gY2FsY3VsYXRlIHRoZSBjb2xvcgorICAgICAqICBkZXB0aC4gIFRoZSBiaXRzX3Blcl9waXhlbCBmaWVsZCBkb2VzIG5vdCBkaXJlY3RseSB0cmFuc2xhdGUgdG8gY29sb3IKKyAgICAgKiAgZGVwdGguIFlvdSBoYXZlIHRvIGNvbXB1dGUgZm9yIHRoZSBjb2xvciBkZXB0aCAodXNpbmcgdGhlIGNvbG9yCisgICAgICogIGJpdGZpZWxkcykgYW5kIGZpeC0+dmlzdWFsIGFzIHNlZW4gYWJvdmUuCisgICAgICovCisKKyAgICAvKgorICAgICAqIFRoaXMgaXMgdGhlIHBvaW50IHdoZXJlIHRoZSBjb2xvciBpcyBjb252ZXJ0ZWQgdG8gc29tZXRoaW5nIHRoYXQKKyAgICAgKiBpcyBhY2NlcHRhYmxlIGJ5IHRoZSBoYXJkd2FyZS4KICAgICAgKi8KICNkZWZpbmUgQ05WVF9UT0hXKHZhbCx3aWR0aCkgKCgoKHZhbCk8PCh3aWR0aCkpKzB4N0ZGRi0odmFsKSk+PjE2KQotICAgIHN3aXRjaCAoaW5mby0+Zml4LnZpc3VhbCkgewotICAgICAgIGNhc2UgRkJfVklTVUFMX1RSVUVDT0xPUjoKLSAgICAgICBjYXNlIEZCX1ZJU1VBTF9QU0VVRE9DT0xPUjoKLSAgICAgICAgICAgICAgIHJlZCA9IENOVlRfVE9IVyhyZWQsIGluZm8tPnZhci5yZWQubGVuZ3RoKTsKLSAgICAgICAgICAgICAgIGdyZWVuID0gQ05WVF9UT0hXKGdyZWVuLCBpbmZvLT52YXIuZ3JlZW4ubGVuZ3RoKTsKLSAgICAgICAgICAgICAgIGJsdWUgPSBDTlZUX1RPSFcoYmx1ZSwgaW5mby0+dmFyLmJsdWUubGVuZ3RoKTsKLSAgICAgICAgICAgICAgIHRyYW5zcCA9IENOVlRfVE9IVyh0cmFuc3AsIGluZm8tPnZhci50cmFuc3AubGVuZ3RoKTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgIGNhc2UgRkJfVklTVUFMX0RJUkVDVENPTE9SOgotCSAgICAgICAvKiBleGFtcGxlIGhlcmUgYXNzdW1lcyA4IGJpdCBEQUMuIE1pZ2h0IGJlIGRpZmZlcmVudCAKLQkJKiBmb3IgeW91ciBoYXJkd2FyZSAqLwkKLSAgICAgICAgICAgICAgIHJlZCA9IENOVlRfVE9IVyhyZWQsIDgpOyAgICAgICAKLSAgICAgICAgICAgICAgIGdyZWVuID0gQ05WVF9UT0hXKGdyZWVuLCA4KTsKLSAgICAgICAgICAgICAgIGJsdWUgPSBDTlZUX1RPSFcoYmx1ZSwgOCk7Ci0gICAgICAgICAgICAgICAvKiBoZXksIHRoZXJlIGlzIGJ1ZyBpbiB0cmFuc3AgaGFuZGxpbmcuLi4gKi8KLSAgICAgICAgICAgICAgIHRyYW5zcCA9IENOVlRfVE9IVyh0cmFuc3AsIDgpOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQorICAgIHJlZCA9IENOVlRfVE9IVyhyZWQsIGluZm8tPnZhci5yZWQubGVuZ3RoKTsKKyAgICBncmVlbiA9IENOVlRfVE9IVyhncmVlbiwgaW5mby0+dmFyLmdyZWVuLmxlbmd0aCk7CisgICAgYmx1ZSA9IENOVlRfVE9IVyhibHVlLCBpbmZvLT52YXIuYmx1ZS5sZW5ndGgpOworICAgIHRyYW5zcCA9IENOVlRfVE9IVyh0cmFuc3AsIGluZm8tPnZhci50cmFuc3AubGVuZ3RoKTsKICN1bmRlZiBDTlZUX1RPSFcKLSAgICAvKiBUcnVlY29sb3IgaGFzIGhhcmR3YXJlIGluZGVwZW5kZW50IHBhbGV0dGUgKi8KLSAgICBpZiAoaW5mby0+Zml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfVFJVRUNPTE9SKSB7Ci0gICAgICAgdTMyIHY7CisgICAgLyoKKyAgICAgKiBUaGlzIGlzIHRoZSBwb2ludCB3aGVyZSB0aGUgZnVuY3Rpb24gZmVlZHMgdGhlIGNvbG9yIHRvIHRoZSBoYXJkd2FyZQorICAgICAqIHBhbGV0dGUgYWZ0ZXIgY29udmVydGluZyB0aGUgY29sb3JzIHRvIHNvbWV0aGluZyBhY2NlcHRhYmxlIGJ5CisgICAgICogdGhlIGhhcmR3YXJlLiBOb3RlLCBvbmx5IEZCX1ZJU1VBTF9ESVJFQ1RDT0xPUiBhbmQKKyAgICAgKiBGQl9WSVNVQUxfUFNFVURPQ09MT1IgdmlzdWFscyBuZWVkIHRvIHdyaXRlIHRvIHRoZSBoYXJkd2FyZSBwYWxldHRlLgorICAgICAqIElmIHlvdSBoYXZlIGNvZGUgdGhhdCB3cml0ZXMgdG8gdGhlIGhhcmR3YXJlIENMVVQsIGFuZCBpdCdzIG5vdAorICAgICAqIGFueSBvZiB0aGUgYWJvdmUgdmlzdWFscywgdGhlbiB5b3UgYXJlIGRvaW5nIHNvbWV0aGluZyB3cm9uZy4KKyAgICAgKi8KKyAgICBpZiAoaW5mby0+Zml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfRElSRUNUQ09MT1IgfHwKKwlpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9UUlVFQ09MT1IpCisJICAgIHdyaXRlX3tyZWR8Z3JlZW58Ymx1ZXx0cmFuc3B9X3RvX2NsdXQoKTsKIAotICAgICAgIGlmIChyZWdubyA+PSAxNikKLSAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgLyogVGhpcyBpcyB0aGUgcG9pbnQgd2VyZSB5b3UgbmVlZCB0byBmaWxsIHVwIHRoZSBjb250ZW50cyBvZgorICAgICAqIGluZm8tPnBzZXVkb19wYWxldHRlLiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIF9vbmx5XyBieSBmYmNvbiwgdGh1cworICAgICAqIGl0IG9ubHkgY29udGFpbnMgMTYgZW50cmllcyB0byBtYXRjaCB0aGUgbnVtYmVyIG9mIGNvbG9ycyBzdXBwb3J0ZWQKKyAgICAgKiBieSB0aGUgY29uc29sZS4gVGhlIHBzZXVkb19wYWxldHRlIGlzIHVzZWQgb25seSBpZiB0aGUgdmlzdWFsIGlzCisgICAgICogaW4gZGlyZWN0Y29sb3Igb3IgdHJ1ZWNvbG9yIG1vZGUuICBXaXRoIG90aGVyIHZpc3VhbHMsIHRoZQorICAgICAqIHBzZXVkb19wYWxldHRlIGlzIG5vdCB1c2VkLiAoVGhpcyBtaWdodCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4pCisgICAgICoKKyAgICAgKiBUaGUgY29udGVudHMgb2YgdGhlIHBzZXVkb19wYWxldHRlIGlzIGluIHJhdyBwaXhlbCBmb3JtYXQuICBJZSwgZWFjaAorICAgICAqIGVudHJ5IGNhbiBiZSB3cml0dGVuIGRpcmVjdGx5IHRvIHRoZSBmcmFtZWJ1ZmZlciB3aXRob3V0IGFueSBjb252ZXJzaW9uLgorICAgICAqIFRoZSBwc2V1ZG9fcGFsZXR0ZSBpcyAodm9pZCAqKS4gIEhvd2V2ZXIsIGlmIHVzaW5nIHRoZSBnZW5lcmljCisgICAgICogZHJhd2luZyBmdW5jdGlvbnMgKGNmYl9pbWFnZWJsaXQsIGNmYl9maWxscmVjdCksIHRoZSBwc2V1ZG9fcGFsZXR0ZQorICAgICAqIG11c3QgYmUgY2FzdGVkIHRvICh1MzIgKikgX3JlZ2FyZGxlc3NfIG9mIHRoZSBiaXRzIHBlciBwaXhlbC4gSWYgdGhlCisgICAgICogZHJpdmVyIGlzIHVzaW5nIGl0cyBvd24gZHJhd2luZyBmdW5jdGlvbnMsIHRoZW4gaXQgY2FuIHVzZSB3aGF0ZXZlcgorICAgICAqIHNpemUgaXQgd2FudHMuCisgICAgICovCisgICAgaWYgKGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX1RSVUVDT0xPUiB8fAorCWluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX0RJUkVDVENPTE9SKSB7CisJICAgIHUzMiB2OwogCi0gICAgICAgdiA9IChyZWQgPDwgaW5mby0+dmFyLnJlZC5vZmZzZXQpIHwKLSAgICAgICAgICAgKGdyZWVuIDw8IGluZm8tPnZhci5ncmVlbi5vZmZzZXQpIHwKLSAgICAgICAgICAgKGJsdWUgPDwgaW5mby0+dmFyLmJsdWUub2Zmc2V0KSB8Ci0gICAgICAgICAgICh0cmFuc3AgPDwgaW5mby0+dmFyLnRyYW5zcC5vZmZzZXQpOworCSAgICBpZiAocmVnbm8gPj0gMTYpCisJCSAgICByZXR1cm4gLUVJTlZBTDsKIAotICAgICAgIHN3aXRjaCAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7Ci0JCWNhc2UgODoKLQkJCS8qIFllcyBzb21lIGhhbmQgaGVsZCBkZXZpY2VzIGhhdmUgdGhpcy4gKi8gCi0gICAgICAgICAgIAkJKCh1OCopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0gdjsKLQkJCWJyZWFrOwkKLSAgIAkJY2FzZSAxNjoKLSAgICAgICAgICAgCQkoKHUxNiopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0gdjsKLQkJCWJyZWFrOwotCQljYXNlIDI0OgotCQljYXNlIDMyOgkKLSAgICAgICAgICAgCQkoKHUzMiopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0gdjsKLQkJCWJyZWFrOwotICAgICAgIH0KLSAgICAgICByZXR1cm4gMDsKKwkgICAgdiA9IChyZWQgPDwgaW5mby0+dmFyLnJlZC5vZmZzZXQpIHwKKwkJICAgIChncmVlbiA8PCBpbmZvLT52YXIuZ3JlZW4ub2Zmc2V0KSB8CisJCSAgICAoYmx1ZSA8PCBpbmZvLT52YXIuYmx1ZS5vZmZzZXQpIHwKKwkJICAgICh0cmFuc3AgPDwgaW5mby0+dmFyLnRyYW5zcC5vZmZzZXQpOworCisJICAgICgodTMyKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPSB2OwogICAgIH0KKwogICAgIC8qIC4uLiAqLwogICAgIHJldHVybiAwOwogfQpAQCAtMzQwLDYgKzQxOSwxNyBAQAogc3RhdGljIGludCB4eHhmYl9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKIAkJCSAgICAgY29uc3Qgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CisgICAgLyoKKyAgICAgKiBJZiB5b3VyIGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgcGFubmluZywgX2RvXyBfbm90XyBpbXBsZW1lbnQgdGhpcworICAgICAqIGZ1bmN0aW9uLiBDcmVhdGluZyBhIGR1bW15IGZ1bmN0aW9uIHdpbGwganVzdCBjb25mdXNlIHVzZXIgYXBwcy4KKyAgICAgKi8KKworICAgIC8qCisgICAgICogTm90ZSB0aGF0IGV2ZW4gaWYgdGhpcyBmdW5jdGlvbiBpcyBmdWxseSBmdW5jdGlvbmFsLCBhIHNldHRpbmcgb2YKKyAgICAgKiAwIGluIGJvdGggeHBhbnN0ZXAgYW5kIHlwYW5zdGVwIG1lYW5zIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsIG5ldmVyCisgICAgICogZ2V0IGNhbGxlZC4KKyAgICAgKi8KKwogICAgIC8qIC4uLiAqLwogICAgIHJldHVybiAwOwogfQpAQCAtMzQ5LDE1ICs0MzksMjAgQEAKICAqICAgICAgQGJsYW5rX21vZGU6IHRoZSBibGFuayBtb2RlIHdlIHdhbnQuIAogICogICAgICBAaW5mbzogZnJhbWUgYnVmZmVyIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgYSBzaW5nbGUgZnJhbWUgYnVmZmVyCiAgKgotICogICAgICBCbGFuayB0aGUgc2NyZWVuIGlmIGJsYW5rX21vZGUgIT0gMCwgZWxzZSB1bmJsYW5rLiBSZXR1cm4gMCBpZgotICogICAgICBibGFua2luZyBzdWNjZWVkZWQsICE9IDAgaWYgdW4tL2JsYW5raW5nIGZhaWxlZCBkdWUgdG8gZS5nLiBhIAotICogICAgICB2aWRlbyBtb2RlIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBpdC4gSW1wbGVtZW50cyBWRVNBIHN1c3BlbmQKLSAqICAgICAgYW5kIHBvd2VyZG93biBtb2RlcyBvbiBoYXJkd2FyZSB0aGF0IHN1cHBvcnRzIGRpc2FibGluZyBoc3luYy92c3luYzoKLSAqICAgICAgYmxhbmtfbW9kZSA9PSAyOiBzdXNwZW5kIHZzeW5jCi0gKiAgICAgIGJsYW5rX21vZGUgPT0gMzogc3VzcGVuZCBoc3luYwotICogICAgICBibGFua19tb2RlID09IDQ6IHBvd2VyZG93bgorICogICAgICBCbGFuayB0aGUgc2NyZWVuIGlmIGJsYW5rX21vZGUgIT0gRkJfQkxBTktfVU5CTEFOSywgZWxzZSB1bmJsYW5rLgorICogICAgICBSZXR1cm4gMCBpZiBibGFua2luZyBzdWNjZWVkZWQsICE9IDAgaWYgdW4tL2JsYW5raW5nIGZhaWxlZCBkdWUgdG8KKyAqICAgICAgZS5nLiBhIHZpZGVvIG1vZGUgd2hpY2ggZG9lc24ndCBzdXBwb3J0IGl0LgogICoKLSAqICAgICAgUmV0dXJucyBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvciwgb3IgemVybyBvbiBzdWNjZXNzLgorICogICAgICBJbXBsZW1lbnRzIFZFU0Egc3VzcGVuZCBhbmQgcG93ZXJkb3duIG1vZGVzIG9uIGhhcmR3YXJlIHRoYXQgc3VwcG9ydHMKKyAqICAgICAgZGlzYWJsaW5nIGhzeW5jL3ZzeW5jOgorICoKKyAqICAgICAgRkJfQkxBTktfTk9STUFMID0gZGlzcGxheSBpcyBibGFua2VkLCBzeW5jcyBhcmUgb24uCisgKiAgICAgIEZCX0JMQU5LX0hTWU5DX1NVU1BFTkQgPSBoc3luYyBvZmYKKyAqICAgICAgRkJfQkxBTktfVlNZTkNfU1VTUEVORCA9IHZzeW5jIG9mZgorICogICAgICBGQl9CTEFOS19QT1dFUkRPV04gPSAgaHN5bmMgYW5kIHZzeW5jIG9mZgorICoKKyAqICAgICAgSWYgaW1wbGVtZW50aW5nIHRoaXMgZnVuY3Rpb24sIGF0IGxlYXN0IHN1cHBvcnQgRkJfQkxBTktfVU5CTEFOSy4KKyAqICAgICAgUmV0dXJuICEwIGZvciBhbnkgbW9kZXMgdGhhdCBhcmUgdW5pbXBsZW1lbnRlZC4KICAqCiAgKi8KIHN0YXRpYyBpbnQgeHh4ZmJfYmxhbmsoaW50IGJsYW5rX21vZGUsIGNvbnN0IHN0cnVjdCBmYl9pbmZvICppbmZvKQpAQCAtNDU0LDYgKzU0OSwxNCBAQAogICoJQGRhdGE6IFRoZSBhY3R1YWwgZGF0YSB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgaW1hZ2Ugb24gdGhlIGRpc3BsYXkuCiAgKglAY21hcDogVGhlIGNvbG9ybWFwIHVzZWQgZm9yIGNvbG9yIGltYWdlcy4gICAKICAqLworCisvKgorICogVGhlIGdlbmVyaWMgZnVuY3Rpb24sIGNmYl9pbWFnZWJsaXQsIGV4cGVjdHMgdGhhdCB0aGUgYml0bWFwIHNjYW5saW5lcyBhcmUKKyAqIHBhZGRlZCB0byB0aGUgbmV4dCBieXRlLiAgTW9zdCBoYXJkd2FyZSBhY2NlbGVyYXRvcnMgbWF5IHJlcXVpcmUgcGFkZGluZyB0bworICogdGhlIG5leHQgdTE2IG9yIHRoZSBuZXh0IHUzMi4gIElmIHRoYXQgaXMgdGhlIGNhc2UsIHRoZSBkcml2ZXIgY2FuIHNwZWNpZnkKKyAqIHRoaXMgYnkgc2V0dGluZyBpbmZvLT5waXhtYXAuc2Nhbl9hbGlnbiA9IDIgb3IgNC4gIFNlZSBhIG1vcmUKKyAqIGNvbXByZWhlbnNpdmUgZGVzY3JpcHRpb24gb2YgdGhlIHBpeG1hcCBiZWxvdy4KKyAqLwogfQogCiAvKioKQEAgLTUxNyw2ICs2MjAsNyBAQAogICovCiB2b2lkIHh4eGZiX3JvdGF0ZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IGFuZ2xlKQogeworLyogV2lsbCBiZSBkZXByZWNhdGVkICovCiB9CiAKIC8qKgpAQCAtNTQwLDYgKzY0NCw5IEBACiAgKgkJICAgICBzbyB3ZSBjYW4gaGF2ZSBjb25zaXN0ZW50IGRpc3BsYXkgb3V0cHV0LiAKICAqCiAgKiAgICAgIEBpbmZvOiBmcmFtZSBidWZmZXIgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIHNpbmdsZSBmcmFtZSBidWZmZXIKKyAqCisgKiAgICAgIElmIHRoZSBkcml2ZXIgaGFzIGltcGxlbWVudGVkIGl0cyBvd24gaGFyZHdhcmUtYmFzZWQgZHJhd2luZyBmdW5jdGlvbiwKKyAqICAgICAgaW1wbGVtZW50aW5nIHRoaXMgZnVuY3Rpb24gaXMgaGlnaGx5IHJlY29tbWVuZGVkLgogICovCiB2b2lkIHh4eGZiX3N5bmMoc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CkBAIC01NDksMjAgKzY1NiwyNSBAQAogICAgICAqICBJbml0aWFsaXphdGlvbgogICAgICAqLwogCi1pbnQgX19pbml0IHh4eGZiX2luaXQodm9pZCkKKy8qIHN0YXRpYyBpbnQgX19pbml0IHh4ZmJfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKmRldmljZSkgLS0gZm9yIHBsYXRmb3JtIGRldnMgKi8KK3N0YXRpYyBpbnQgX19pbml0IHh4eGZiX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkgICAgICBjb25zdF9zdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogeworICAgIHN0cnVjdCBmYl9pbmZvICppbmZvOworICAgIHN0cnVjdCB4eHhfcGFyICpwYXI7CisgICAgc3RydWN0IGRldmljZSA9ICZkZXYtPmRldjsgLyogZm9yIHBjaSBkcml2ZXJzICovCiAgICAgaW50IGNtYXBfbGVuLCByZXR2YWw7CQogICAgCiAgICAgLyoKLSAgICAgKiAgRm9yIGtlcm5lbCBib290IG9wdGlvbnMgKGluICd2aWRlbz14eHhmYjo8b3B0aW9ucz4nIGZvcm1hdCkKKyAgICAgKiBEeW5hbWljYWxseSBhbGxvY2F0ZSBpbmZvIGFuZCBwYXIKICAgICAgKi8KLSNpZm5kZWYgTU9EVUxFCi0gICAgY2hhciAqb3B0aW9uID0gTlVMTDsKKyAgICBpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCB4eHhfcGFyKSwgZGV2aWNlKTsKIAotICAgIGlmIChmYl9nZXRfb3B0aW9ucygieHh4ZmIiLCAmb3B0aW9uKSkKLQkgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgeHh4ZmJfc2V0dXAob3B0aW9uKTsKLSNlbmRpZgorICAgIGlmICghaW5mbykgeworCSAgICAvKiBnb3RvIGVycm9yIHBhdGggKi8KKyAgICB9CisKKyAgICBwYXIgPSBpbmZvLT5wYXI7CiAKICAgICAvKiAKICAgICAgKiBIZXJlIHdlIHNldCB0aGUgc2NyZWVuX2Jhc2UgdG8gdGhlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MKQEAgLTU3MCwxOCArNjgyLDg3IEBACiAgICAgICogZnJvbSB0aGUgYnVzIGxheWVyIGFuZCB0aGVuIHRyYW5zbGF0ZSBpdCB0byB2aXJ0dWFsIG1lbW9yeQogICAgICAqIHNwYWNlIHZpYSBpb3JlbWFwLiBDb25zdWx0IGlvcG9ydC5oLiAKICAgICAgKi8KLSAgICBpbmZvLnNjcmVlbl9iYXNlID0gZnJhbWVidWZmZXJfdmlydHVhbF9tZW1vcnk7CQotICAgIGluZm8uZmJvcHMgPSAmeHh4ZmJfb3BzOwotICAgIGluZm8uZml4ID0geHh4ZmJfZml4OwotICAgIGluZm8ucHNldWRvX3BhbGV0dGUgPSBwc2V1ZG9fcGFsZXR0ZTsKLQorICAgIGluZm8tPnNjcmVlbl9iYXNlID0gZnJhbWVidWZmZXJfdmlydHVhbF9tZW1vcnk7CisgICAgaW5mby0+ZmJvcHMgPSAmeHh4ZmJfb3BzOworICAgIGluZm8tPmZpeCA9IHh4eGZiX2ZpeDsgLyogdGhpcyB3aWxsIGJlIHRoZSBvbmx5IHRpbWUgeHh4ZmJfZml4IHdpbGwgYmUKKwkJCSAgICAqIHVzZWQsIHNvIG1hcmsgaXQgYXMgX19pbml0ZGF0YQorCQkJICAgICovCisgICAgaW5mby0+cHNldWRvX3BhbGV0dGUgPSBwc2V1ZG9fcGFsZXR0ZTsgLyogVGhlIHBzZXVkb3BhbGV0dGUgaXMgYW4KKwkJCQkJICAgICogMTYtbWVtYmVyIGFycmF5CisJCQkJCSAgICAqLwogICAgIC8qCiAgICAgICogU2V0IHVwIGZsYWdzIHRvIGluZGljYXRlIHdoYXQgc29ydCBvZiBhY2NlbGVyYXRpb24geW91cgogICAgICAqIGRyaXZlciBjYW4gcHJvdmlkZSAocGFuL3dyYXAvY29weWFyZWEvZXRjLikgYW5kIHdoZXRoZXIgaXQKICAgICAgKiBpcyBhIG1vZHVsZSAtLSBzZWUgRkJJTkZPXyogaW4gaW5jbHVkZS9saW51eC9mYi5oCisgICAgICoKKyAgICAgKiBJZiB5b3VyIGhhcmR3YXJlIGNhbiBzdXBwb3J0IGFueSBvZiB0aGUgaGFyZHdhcmUgYWNjZWxlcmF0ZWQgZnVuY3Rpb25zCisgICAgICogZmJjb24gcGVyZm9ybWFuY2Ugd2lsbCBpbXByb3ZlIGlmIGluZm8tPmZsYWdzIGlzIHNldCBwcm9wZXJseS4KKyAgICAgKgorICAgICAqIEZCSU5GT19IV0FDQ0VMX0NPUFlBUkVBIC0gaGFyZHdhcmUgbW92ZXMKKyAgICAgKiBGQklORk9fSFdBQ0NFTF9GSUxMUkVDVCAtIGhhcmR3YXJlIGZpbGxzCisgICAgICogRkJJTkZPX0hXQUNDRUxfSU1BR0VCTElUIC0gaGFyZHdhcmUgbW9uby0+Y29sb3IgZXhwYW5zaW9uCisgICAgICogRkJJTkZPX0hXQUNDRUxfWVBBTiAtIGhhcmR3YXJlIGNhbiBwYW4gZGlzcGxheSBpbiB5LWF4aXMKKyAgICAgKiBGQklORk9fSFdBQ0NFTF9ZV1JBUCAtIGhhcmR3YXJlIGNhbiB3cmFwIGRpc3BsYXkgaW4geS1heGlzCisgICAgICogRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQgLSBzdXBwb3J0cyBoYXJkd2FyZSBhY2NlbHMsIGJ1dCBkaXNhYmxlZAorICAgICAqIEZCSU5GT19SRUFEU19GQVNUIC0gaWYgc2V0LCBwcmVmZXIgbW92ZXMgb3ZlciBtb25vLT5jb2xvciBleHBhbnNpb24KKyAgICAgKiBGQklORk9fTUlTQ19USUxFQkxJVFRJTkcgLSBoYXJkd2FyZSBjYW4gZG8gdGlsZSBibGl0cworICAgICAqCisgICAgICogTk9URTogVGhlc2UgYXJlIGZvciBmYmNvbiB1c2Ugb25seS4KICAgICAgKi8KLSAgICBpbmZvLmZsYWdzID0gRkJJTkZPX0RFRkFVTFQ7Ci0gICAgaW5mby5wYXIgPSBjdXJyZW50X3BhcjsKKyAgICBpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUOworCisvKioqKioqKioqKioqKioqKioqKioqIFRoaXMgc3RhZ2UgaXMgb3B0aW9uYWwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAvKgorICAgICAqIFRoZSBzdHJ1Y3QgcGl4bWFwIGlzIGEgc2NyYXRjaCBwYWQgZm9yIHRoZSBkcmF3aW5nIGZ1bmN0aW9ucy4gVGhpcworICAgICAqIGlzIHdoZXJlIHRoZSBtb25vY2hyb21lIGJpdG1hcCBpcyBjb25zdHJ1Y3RlZCBieSB0aGUgaGlnaGVyIGxheWVycworICAgICAqIGFuZCB0aGVuIHBhc3NlZCB0byB0aGUgYWNjZWxlcmF0b3IuICBGb3IgZHJpdmVycyB0aGF0IHVzZXMKKyAgICAgKiBjZmJfaW1hZ2VibGl0LCB5b3UgY2FuIHNraXAgdGhpcyBwYXJ0LiAgRm9yIHRob3NlIHRoYXQgaGF2ZSBhIG1vcmUKKyAgICAgKiByaWdvcm91cyByZXF1aXJlbWVudCwgdGhpcyBzdGFnZSBpcyBuZWVkZWQKKyAgICAgKi8KKworICAgIC8qIFBJWE1BUF9TSVpFIHNob3VsZCBiZSBzbWFsbCBlbm91Z2ggdG8gb3B0aW1pemUgZHJhd2luZywgYnV0IG5vdAorICAgICAqIGxhcmdlIGVub3VnaCB0aGF0IG1lbW9yeSBpcyB3YXN0ZWQuICBBIHNhZmUgc2l6ZSBpcworICAgICAqIChtYXhfeHJlcyAqIG1heF9mb250X2hlaWdodC84KS4gbWF4X3hyZXMgaXMgZHJpdmVyIGRlcGVuZGVudCwKKyAgICAgKiBtYXhfZm9udF9oZWlnaHQgaXMgMzIuCisgICAgICovCisgICAgaW5mby0+cGl4bWFwLmFkZHIgPSBrbWFsbG9jKFBJWE1BUF9TSVpFLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIWluZm8tPnBpeG1hcC5hZGRyKSB7CisJICAgIC8qIGdvdG8gZXJyb3IgKi8KKyAgICB9CisKKyAgICBpbmZvLT5waXhtYXAuc2l6ZSA9IFBJWE1BUF9TSVpFOworCisgICAgLyoKKyAgICAgKiBGQl9QSVhNQVBfU1lTVEVNIC0gbWVtb3J5IGlzIGluIHN5c3RlbSByYW0KKyAgICAgKiBGQl9QSVhNQVBfSU8gICAgIC0gbWVtb3J5IGlzIGlvbWFwcGVkCisgICAgICogRkJfUElYTUFQX1NZTkMgICAtIGlmIHNldCwgd2lsbCBjYWxsIGZiX3N5bmMoKSBwZXIgYWNjZXNzIHRvIHBpeG1hcCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdXN1YWxseSBpZiBGQl9QSVhNQVBfSU8gaXMgc2V0LgorICAgICAqCisgICAgICogQ3VycmVudGx5LCBGQl9QSVhNQVBfSU8gaXMgdW5pbXBsZW1lbnRlZC4KKyAgICAgKi8KKyAgICBpbmZvLT5waXhtYXAuZmxhZ3MgPSBGQl9QSVhNQVBfU1lTVEVNOworCisgICAgLyoKKyAgICAgKiBzY2FuX2FsaWduIGlzIHRoZSBudW1iZXIgb2YgcGFkZGluZyBmb3IgZWFjaCBzY2FubGluZS4gIEl0IGlzIGluIGJ5dGVzLgorICAgICAqIFRodXMgZm9yIGFjY2VsZXJhdG9ycyB0aGF0IG5lZWQgcGFkZGluZyB0byB0aGUgbmV4dCB1MzIsIHB1dCA0IGhlcmUuCisgICAgICovCisgICAgaW5mby0+cGl4bWFwLnNjYW5fYWxpZ24gPSA0OworCisgICAgLyoKKyAgICAgKiBidWZfYWxpZ24gaXMgdGhlIGFtb3VudCB0byBiZSBwYWRkZWQgZm9yIHRoZSBidWZmZXIuIEZvciBleGFtcGxlLAorICAgICAqIHRoZSBpODEwZmIgbmVlZHMgYSBzY2FuX2FsaWduIG9mIDIgYnV0IGV4cGVjdHMgaXQgdG8gYmUgZmVkIHdpdGgKKyAgICAgKiBkd29yZHMsIHNvIGEgYnVmX2FsaWduID0gNCBpcyByZXF1aXJlZC4KKyAgICAgKi8KKyAgICBpbmZvLT5waXhtYXAuYnVmX2FsaWduID0gNDsKKworICAgIC8qIGFjY2Vzc19hbGlnbiBpcyBob3cgbWFueSBiaXRzIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBmcmFtZWJ1ZmZlcgorICAgICAqIGllLiBzb21lIGVwc29uIGNhcmRzIGFsbG93IDE2LWJpdCBhY2Nlc3Mgb25seS4gIE1vc3QgZHJpdmVycyB3aWxsCisgICAgICogYmUgc2FmZSB3aXRoIHUzMiBoZXJlLgorICAgICAqCisgICAgICogTk9URTogVGhpcyBmaWVsZCBpcyBjdXJyZW50bHkgdW51c2VkLgorICAgICAqLworICAgIGluZm8tPnBpeG1hcC5zY2FuX2FsaWduID0gMzIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFbmQgb3B0aW9uYWwgc3RhZ2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAgICAgLyoKICAgICAgKiBUaGlzIHNob3VsZCBnaXZlIGEgcmVhc29uYWJsZSBkZWZhdWx0IHZpZGVvIG1vZGUuIFRoZSBmb2xsb3dpbmcgaXMKQEAgLTU5MCw0MyArNzcxLDE0NiBAQAogICAgIGlmICghbW9kZV9vcHRpb24pCiAJbW9kZV9vcHRpb24gPSAiNjQweDQ4MEA2MCI7CSAJCiAKLSAgICByZXR2YWwgPSBmYl9maW5kX21vZGUoJmluZm8udmFyLCAmaW5mbywgbW9kZV9vcHRpb24sIE5VTEwsIDAsIE5VTEwsIDgpOworICAgIHJldHZhbCA9IGZiX2ZpbmRfbW9kZShpbmZvLT52YXIsIGluZm8sIG1vZGVfb3B0aW9uLCBOVUxMLCAwLCBOVUxMLCA4KTsKICAgCiAgICAgaWYgKCFyZXR2YWwgfHwgcmV0dmFsID09IDQpCiAJcmV0dXJuIC1FSU5WQUw7CQkJCiAKICAgICAvKiBUaGlzIGhhcyB0byBiZWVuIGRvbmUgISEhICovCQotICAgIGZiX2FsbG9jX2NtYXAoJmluZm8uY21hcCwgY21hcF9sZW4sIDApOworICAgIGZiX2FsbG9jX2NtYXAoaW5mby0+Y21hcCwgY21hcF9sZW4sIDApOwogCQogICAgIC8qIAogICAgICAqIFRoZSBmb2xsb3dpbmcgaXMgZG9uZSBpbiB0aGUgY2FzZSBvZiBoYXZpbmcgaGFyZHdhcmUgd2l0aCBhIHN0YXRpYyAKICAgICAgKiBtb2RlLiBJZiB3ZSBhcmUgc2V0dGluZyB0aGUgbW9kZSBvdXJzZWx2ZXMgd2UgZG9uJ3QgY2FsbCB0aGlzLiAKICAgICAgKi8JCi0gICAgaW5mby52YXIgPSB4eHhmYl92YXI7Ci0JCi0gICAgaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZpbmZvKSA8IDApCisgICAgaW5mby0+dmFyID0geHh4ZmJfdmFyOworCisgICAgLyoKKyAgICAgKiBGb3IgZHJpdmVycyB0aGF0IGNhbi4uLgorICAgICAqLworICAgIHh4eGZiX2NoZWNrX3ZhcigmaW5mby0+dmFyLCBpbmZvKTsKKworICAgIC8qCisgICAgICogRG9lcyBhIGNhbGwgdG8gZmJfc2V0X3BhcigpIGJlZm9yZSByZWdpc3Rlcl9mcmFtZWJ1ZmZlciBuZWVkZWQ/ICBUaGlzCisgICAgICogd2lsbCBkZXBlbmQgb24geW91IGFuZCB0aGUgaGFyZHdhcmUuICBJZiB5b3UgYXJlIHN1cmUgdGhhdCB5b3VyIGRyaXZlcgorICAgICAqIGlzIHRoZSBvbmx5IGRldmljZSBpbiB0aGUgc3lzdGVtLCBhIGNhbGwgdG8gZmJfc2V0X3BhcigpIGlzIHNhZmUuCisgICAgICoKKyAgICAgKiBIYXJkd2FyZSBpbiB4ODYgc3lzdGVtcyBoYXMgYSBWR0EgY29yZS4gIENhbGxpbmcgc2V0X3BhcigpIGF0IHRoaXMKKyAgICAgKiBwb2ludCB3aWxsIGNvcnJ1cHQgdGhlIFZHQSBjb25zb2xlLCBzbyBpdCBtaWdodCBiZSBzYWZlciB0byBza2lwIGEKKyAgICAgKiBjYWxsIHRvIHNldF9wYXIgaGVyZSBhbmQganVzdCBhbGxvdyBmYmNvbiB0byBkbyBpdCBmb3IgeW91LgorICAgICAqLworICAgIC8qIHh4eGZiX3NldF9wYXIoaW5mbyk7ICovCisKKyAgICBpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbykgPCAwKQogCXJldHVybiAtRUlOVkFMOwotICAgIHByaW50ayhLRVJOX0lORk8gImZiJWQ6ICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2VcbiIsIGluZm8ubm9kZSwKLQkgICBpbmZvLmZpeC5pZCk7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAiZmIlZDogJXMgZnJhbWUgYnVmZmVyIGRldmljZVxuIiwgaW5mby0+bm9kZSwKKwkgICBpbmZvLT5maXguaWQpOworICAgIHBjaV9zZXRfZHJ2ZGF0YShkZXYsIGluZm8pOyAvKiBvciBkZXZfc2V0X2RydmRhdGEoZGV2aWNlLCBpbmZvKSAqLwogICAgIHJldHVybiAwOwogfQogCiAgICAgLyoKICAgICAgKiAgQ2xlYW51cAogICAgICAqLwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgeHh4ZmJfY2xlYW51cCh2b2lkKQorLyogc3RhdGljIHZvaWQgX19leGl0IHh4eGZiX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpICovCitzdGF0aWMgdm9pZCBfX2V4aXQgeHh4ZmJfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0gICAgLyoKLSAgICAgKiAgSWYgeW91ciBkcml2ZXIgc3VwcG9ydHMgbXVsdGlwbGUgYm9hcmRzLCB5b3Ugc2hvdWxkIHVucmVnaXN0ZXIgYW5kCi0gICAgICogIGNsZWFuIHVwIGFsbCBpbnN0YW5jZXMuCi0gICAgICovCisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2Rydl9kYXRhKGRldik7CisJLyogb3IgZGV2X2dldF9kcnZfZGF0YShkZXZpY2UpOyAqLwogCi0gICAgdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKLSAgICBmYl9kZWFsbG9jX2NtYXAoJmluZm8uY21hcCk7Ci0gICAgLyogLi4uICovCisJaWYgKGluZm8pIHsKKwkJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKKwkJZmJfZGVhbGxvY19jbWFwKCZpbmZvLmNtYXApOworCQkvKiAuLi4gKi8KKwkJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAorI2lmIENPTkZJR19QQ0kKKy8qIEZvciBQQ0kgZHJpdmVycyAqLworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHh4eGZiX2RyaXZlciA9IHsKKwkubmFtZSA9CQkieHh4ZmIiLAorCS5pZF90YWJsZSA9CXh4eGZiX2RldmljZXMsCisJLnByb2JlID0JeHh4ZmJfcHJvYmUsCisJLnJlbW92ZSA9CV9fZGV2ZXhpdF9wKHh4eGZiX3JlbW92ZSksCisJLnN1c3BlbmQgPSAgICAgIHh4eGZiX3N1c3BlbmQsIC8qIG9wdGlvbmFsICovCisJLnJlc3VtZSA9ICAgICAgIHh4eGZiX3Jlc3VtZSwgIC8qIG9wdGlvbmFsICovCit9OworCitzdGF0aWMgaW50IF9faW5pdCB4eHhmYl9pbml0KHZvaWQpCit7CisJLyoKKwkgKiAgRm9yIGtlcm5lbCBib290IG9wdGlvbnMgKGluICd2aWRlbz14eHhmYjo8b3B0aW9ucz4nIGZvcm1hdCkKKwkgKi8KKyNpZm5kZWYgTU9EVUxFCisJY2hhciAqb3B0aW9uID0gTlVMTDsKKworCWlmIChmYl9nZXRfb3B0aW9ucygieHh4ZmIiLCAmb3B0aW9uKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJeHh4ZmJfc2V0dXAob3B0aW9uKTsKKyNlbmRpZgorCisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnh4eGZiX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB4eHhmYl9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ4eHhmYl9kcml2ZXIpOworfQorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKy8qIGZvciBwbGF0Zm9ybSBkZXZpY2VzICovCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgeHh4ZmJfZHJpdmVyID0geworCS5uYW1lID0gInh4eGZiIiwKKwkuYnVzICA9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUgPSB4eHhmYl9wcm9iZSwKKwkucmVtb3ZlID0geHh4ZmJfcmVtb3ZlLAorCS5zdXNwZW5kID0geHh4ZmJfc3VzcGVuZCwgLyogb3B0aW9uYWwgKi8KKwkucmVzdW1lID0geHh4ZmJfcmVzdW1lLCAgIC8qIG9wdGlvbmFsICovCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB4eHhmYl9kZXZpY2UgPSB7CisJLm5hbWUgPSAieHh4ZmIiLAorfTsKKworc3RhdGljIGludCBfX2luaXQgeHh4ZmJfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisJLyoKKwkgKiAgRm9yIGtlcm5lbCBib290IG9wdGlvbnMgKGluICd2aWRlbz14eHhmYjo8b3B0aW9ucz4nIGZvcm1hdCkKKwkgKi8KKyNpZm5kZWYgTU9EVUxFCisJY2hhciAqb3B0aW9uID0gTlVMTDsKKworCWlmIChmYl9nZXRfb3B0aW9ucygieHh4ZmIiLCAmb3B0aW9uKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJeHh4ZmJfc2V0dXAob3B0aW9uKTsKKyNlbmRpZgorCXJldCA9IGRyaXZlcl9yZWdpc3RlcigmeHh4ZmJfZHJpdmVyKTsKKworCWlmICghcmV0KSB7CisJCXJldCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmeHh4ZmJfZGV2aWNlKTsKKwkJaWYgKHJldCkKKwkJCWRyaXZlcl91bnJlZ2lzdGVyKCZ4eHhmYl9kcml2ZXIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB4eHhmYl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJnh4eGZiX2RldmljZSk7CisJZHJpdmVyX3VucmVnaXN0ZXIoJnh4eGZiX2RyaXZlcik7Cit9CisjZW5kaWYKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX2luaXQoeHh4ZmJfaW5pdCk7Cittb2R1bGVfZXhpdCh4eHhmYl9leGl0KTsKKworCiAgICAgLyoKICAgICAgKiAgU2V0dXAKICAgICAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc3N0ZmIuYyBiL2RyaXZlcnMvdmlkZW8vc3N0ZmIuYwppbmRleCBlMGYxNGRmLi45OTkyMWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NzdGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9zc3RmYi5jCkBAIC0zODIsNyArMzgyLDcgQEAKIHN0YXRpYyBpbnQgc3N0ZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAogCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3Qgc3N0ZmJfcGFyICpwYXIgPSAoc3RydWN0IHNzdGZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IHNzdGZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCWludCBoU3luY09mZiAgID0gdmFyLT54cmVzICsgdmFyLT5yaWdodF9tYXJnaW4gKyB2YXItPmxlZnRfbWFyZ2luOwogCWludCB2U3luY09mZiAgID0gdmFyLT55cmVzICsgdmFyLT5sb3dlcl9tYXJnaW4gKyB2YXItPnVwcGVyX21hcmdpbjsKIAlpbnQgdkJhY2tQb3JjaCA9IHZhci0+bGVmdF9tYXJnaW4sIHlEaW0gPSB2YXItPnlyZXM7CkBAIC01NDIsNyArNTQyLDcgQEAKICAqLwogc3RhdGljIGludCBzc3RmYl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCBzc3RmYl9wYXIgKnBhciA9IChzdHJ1Y3Qgc3N0ZmJfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3Qgc3N0ZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJdTMyIGxmYm1vZGUsIGZiaWluaXQxLCBmYmlpbml0MiwgZmJpaW5pdDMsIGZiaWluaXQ1LCBmYmlpbml0Nj0wOwogCXN0cnVjdCBwY2lfZGV2ICpzc3RfZGV2ID0gcGFyLT5kZXY7CiAJdW5zaWduZWQgaW50IGZyZXE7CkBAIC03NDgsMTMgKzc0OCwxNCBAQAogc3RhdGljIGludCBzc3RmYl9zZXRjb2xyZWcodV9pbnQgcmVnbm8sIHVfaW50IHJlZCwgdV9pbnQgZ3JlZW4sIHVfaW50IGJsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2ludCB0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKQogeworCXN0cnVjdCBzc3RmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1MzIgY29sOwogCiAJZl9kZGRwcmludGsoInNzdGZiX3NldGNvbHJlZ1xuIik7CiAJZl9kZGRwcmludGsoIiUtMmQgcmdidDogJSN4LCAlI3gsICUjeCwgJSN4XG4iLAogCSAgICAgICAgICAgIHJlZ25vLCByZWQsIGdyZWVuLCBibHVlLCB0cmFuc3ApOwotCWlmIChyZWdubyA+PSAxNikKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHJlZ25vID4gMTUpCisJCXJldHVybiAwOwogCiAJcmVkICAgID4+PSAoMTYgLSBpbmZvLT52YXIucmVkLmxlbmd0aCk7CiAJZ3JlZW4gID4+PSAoMTYgLSBpbmZvLT52YXIuZ3JlZW4ubGVuZ3RoKTsKQEAgLTc2NSwxNSArNzY2LDE0IEBACiAJICAgIHwgKGJsdWUgIDw8IGluZm8tPnZhci5ibHVlLm9mZnNldCkKIAkgICAgfCAodHJhbnNwIDw8IGluZm8tPnZhci50cmFuc3Aub2Zmc2V0KTsKIAkKLQkoKHUzMiAqKWluZm8tPnBzZXVkb19wYWxldHRlKVtyZWdub10gPSBjb2w7CisJcGFyLT5wYWxldHRlW3JlZ25vXSA9IGNvbDsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNzdGZiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICB1X2ludCBjbWQsIHVfbG9uZyBhcmcsIHN0cnVjdCBmYl9pbmZvICppbmZvICkKK3N0YXRpYyBpbnQgc3N0ZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVfaW50IGNtZCwgdV9sb25nIGFyZykKIHsKLQlzdHJ1Y3Qgc3N0ZmJfcGFyICpwYXIgPSAoc3RydWN0IHNzdGZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IHNzdGZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXN0cnVjdCBwY2lfZGV2ICpzc3RfZGV2ID0gcGFyLT5kZXY7CiAJdTMyIGZiaWluaXQwLCB0bXAsIHZhbDsKIAl1X2xvbmcgcDsKQEAgLTgzMCw3ICs4MzAsNyBAQAogI2lmIDAKIHN0YXRpYyB2b2lkIHNzdGZiX2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEgKmFyZWEpCiB7Ci0Jc3RydWN0IHNzdGZiX3BhciAqcGFyID0gKHN0cnVjdCBzc3RmYl9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBzc3RmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1MzIgc3RyaWRlID0gaW5mby0+Zml4LmxpbmVfbGVuZ3RoOwogICAgCiAJaWYgKCFJU19WT09ET08yKHBhcikpCkBAIC04NTUsNyArODU1LDcgQEAKICAqLwogc3RhdGljIHZvaWQgc3N0ZmJfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCkgCiB7Ci0Jc3RydWN0IHNzdGZiX3BhciAqcGFyID0gKHN0cnVjdCBzc3RmYl9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBzc3RmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1MzIgc3RyaWRlID0gaW5mby0+Zml4LmxpbmVfbGVuZ3RoOwogCiAJaWYgKCFJU19WT09ET08yKHBhcikpCkBAIC05MjUsNyArOTI1LDcgQEAKIAogc3RhdGljIGludCBfX2RldmluaXQgc3N0X2RldGVjdF9hdHQoc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IHNzdGZiX3BhciAqcGFyID0gKHN0cnVjdCBzc3RmYl9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBzc3RmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlpbnQgaSwgbWlyLCBkaXI7CiAKIAlmb3IgKGk9MDsgaTwzOyBpKyspIHsKQEAgLTk1MCw3ICs5NTAsNyBAQAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzc3RfZGV0ZWN0X3RpKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCBzc3RmYl9wYXIgKnBhciA9IChzdHJ1Y3Qgc3N0ZmJfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3Qgc3N0ZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJaW50IGksIG1pciwgZGlyOwogCiAJZm9yIChpID0gMDsgaTwzOyBpKyspIHsKQEAgLTk4Niw3ICs5ODYsNyBAQAogICovCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzc3RfZGV0ZWN0X2ljcyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3Qgc3N0ZmJfcGFyICpwYXIgPSAoc3RydWN0IHNzdGZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IHNzdGZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCWludCBtX2NsazBfMSwgbV9jbGswXzcsIG1fY2xrMV9iOwogCWludCBuX2NsazBfMSwgbl9jbGswXzcsIG5fY2xrMV9iOwogCWludCBpOwpAQCAtMTAyMyw3ICsxMDIzLDcgQEAKIHN0YXRpYyBpbnQgc3N0X3NldF9wbGxfYXR0X3RpKHN0cnVjdCBmYl9pbmZvICppbmZvLCAKIAkJY29uc3Qgc3RydWN0IHBsbF90aW1pbmcgKnQsIGNvbnN0IGludCBjbG9jaykKIHsKLQlzdHJ1Y3Qgc3N0ZmJfcGFyICpwYXIgPSAoc3RydWN0IHNzdGZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IHNzdGZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXU4IGNyMCwgY2M7CiAKIAkvKiBlbmFibGUgaW5kZXhlZCBtb2RlICovCkBAIC0xMDc3LDcgKzEwNzcsNyBAQAogc3RhdGljIGludCBzc3Rfc2V0X3BsbF9pY3Moc3RydWN0IGZiX2luZm8gKmluZm8sCiAJCWNvbnN0IHN0cnVjdCBwbGxfdGltaW5nICp0LCBjb25zdCBpbnQgY2xvY2spCiB7Ci0Jc3RydWN0IHNzdGZiX3BhciAqcGFyID0gKHN0cnVjdCBzc3RmYl9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBzc3RmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1OCBwbGxfY3RybDsKIAogCXNzdF9kYWNfd3JpdGUoREFDUkVHX0lDU19QTExSTUEsIERBQ1JFR19JQ1NfUExMX0NUUkwpOwpAQCAtMTExNCw3ICsxMTE0LDcgQEAKIAogc3RhdGljIHZvaWQgc3N0X3NldF92aWRtb2RfYXR0X3RpKHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBpbnQgYnBwKQogewotCXN0cnVjdCBzc3RmYl9wYXIgKnBhciA9IChzdHJ1Y3Qgc3N0ZmJfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3Qgc3N0ZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJdTggY3IwOwogCiAJc3N0X2RhY193cml0ZShEQUNSRUdfV01BLCAwKTsgCS8qIGJhY2tkb29yICovCkBAIC0xMTQ5LDcgKzExNDksNyBAQAogCiBzdGF0aWMgdm9pZCBzc3Rfc2V0X3ZpZG1vZF9pY3Moc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IGludCBicHApCiB7Ci0Jc3RydWN0IHNzdGZiX3BhciAqcGFyID0gKHN0cnVjdCBzc3RmYl9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBzc3RmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAogCXN3aXRjaChicHApIHsKIAljYXNlIDE2OgpAQCAtMTMwOCw3ICsxMzA4LDcgQEAKIAogc3RhdGljIHZvaWQgIF9fZGV2ZXhpdCBzc3Rfc2h1dGRvd24oc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IHNzdGZiX3BhciAqcGFyID0gKHN0cnVjdCBzc3RmYl9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBzc3RmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gcGFyLT5kZXY7CiAJc3RydWN0IHBsbF90aW1pbmcgZ2Z4X3RpbWluZ3M7CiAJaW50IEZvdXQ7CkBAIC0xMzk0LDEyICsxMzk0LDYgQEAKIAlzdHJ1Y3Qgc3N0X3NwZWMgKnNwZWM7CiAJaW50IGVycjsKIAotCXN0cnVjdCBhbGxfaW5mbyB7Ci0JCXN0cnVjdCBmYl9pbmZvIGluZm87Ci0JCXN0cnVjdCBzc3RmYl9wYXIgcGFyOwotCQl1MzIgcHNldWRvX3BhbGV0dGVbMTZdOwotCX0gKmFsbDsKLQkKIAkvKiBFbmFibGUgZGV2aWNlIGluIFBDSSBjb25maWcuICovCiAJaWYgKChlcnI9cGNpX2VuYWJsZV9kZXZpY2UocGRldikpKSB7CiAJCWVwcmludGsoImNhbm5vdCBlbmFibGUgZGV2aWNlXG4iKTsKQEAgLTE0MDcsMTQgKzE0MDEsMTMgQEAKIAl9CiAKIAkvKiBBbGxvY2F0ZSB0aGUgZmIgYW5kIHBhciBzdHJ1Y3R1cmVzLiAgKi8KLQlhbGwgPSBrbWFsbG9jKHNpemVvZigqYWxsKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhbGwpCisJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3Qgc3N0ZmJfcGFyKSwgJnBkZXYtPmRldik7CisJaWYgKCFpbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQoYWxsLCAwLCBzaXplb2YoKmFsbCkpOwotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBhbGwpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGluZm8pOwogCQotCWluZm8gPSAmYWxsLT5pbmZvOwotCXBhciAgPSBpbmZvLT5wYXIgPSAmYWxsLT5wYXI7CisJcGFyICA9IGluZm8tPnBhcjsKIAlmaXggID0gJmluZm8tPmZpeDsKIAkKIAlwYXItPnR5cGUgPSBpZC0+ZHJpdmVyX2RhdGE7CkBAIC0xNDcxLDcgKzE0NjQsNyBAQAogCiAJaW5mby0+ZmxhZ3MJPSBGQklORk9fREVGQVVMVDsKIAlpbmZvLT5mYm9wcwk9ICZzc3RmYl9vcHM7Ci0JaW5mby0+cHNldWRvX3BhbGV0dGUgPSAmYWxsLT5wc2V1ZG9fcGFsZXR0ZTsKKwlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IHBhci0+cGFsZXR0ZTsKIAogCWZpeC0+dHlwZQk9IEZCX1RZUEVfUEFDS0VEX1BJWEVMUzsKIAlmaXgtPnZpc3VhbAk9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CkBAIC0xNTI3LDcgKzE1MjAsNyBAQAogZmFpbF9mYl9tZW06CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGZpeC0+bW1pb19zdGFydCwgaW5mby0+Zml4Lm1taW9fbGVuKTsKIGZhaWxfbW1pb19tZW06Ci0Ja2ZyZWUoaW5mbyk7CisJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIAlyZXR1cm4gLUVOWElPOyAJLyogbm8gdm9vZG9vIGRldGVjdGVkICovCiB9CiAKQEAgLTE1MzcsNyArMTUzMCw3IEBACiAJc3RydWN0IGZiX2luZm8gKmluZm87CiAKIAlpbmZvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCXBhciA9IChzdHJ1Y3Qgc3N0ZmJfcGFyICopIGluZm8tPnBhcjsKKwlwYXIgPSBpbmZvLT5wYXI7CiAJCiAJc3N0X3NodXRkb3duKGluZm8pOwogCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CkBAIC0xNTQ1LDcgKzE1MzgsNyBAQAogCWlvdW5tYXAocGFyLT5tbWlvX3ZiYXNlKTsKIAlyZWxlYXNlX21lbV9yZWdpb24oaW5mby0+Zml4LnNtZW1fc3RhcnQsIDB4NDAwMDAwKTsKIAlyZWxlYXNlX21lbV9yZWdpb24oaW5mby0+Zml4Lm1taW9fc3RhcnQsIGluZm8tPmZpeC5tbWlvX2xlbik7Ci0Ja2ZyZWUoaW5mbyk7CisJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIH0KIAogCkBAIC0xNjEzLDcgKzE2MDYsNyBAQAogCiAJY29uc3QgaW50IHBjaV9zID0gc2l6ZW9mKHBjaV9yZWdzKS9zaXplb2YocGNpX3JlZ3NbMF0pOwogCWNvbnN0IGludCBzc3RfcyA9IHNpemVvZihzc3RfcmVncykvc2l6ZW9mKHNzdF9yZWdzWzBdKTsKLQlzdHJ1Y3Qgc3N0ZmJfcGFyICpwYXIgPSAoc3RydWN0IHNzdGZiX3BhciAqKSBpbmZvLT5wYXI7CisJc3RydWN0IHNzdGZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBwYXItPmRldjsKIAl1MzIgcGNpX3Jlc1twY2lfc107CiAJdTMyIHNzdF9yZXNbc3N0X3NdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zdGlmYi5jIGIvZHJpdmVycy92aWRlby9zdGlmYi5jCmluZGV4IGZiYjE3MzMuLjU2ZDcxZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc3RpZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3N0aWZiLmMKQEAgLTMsNyArMyw3IEBACiAgKiBMb3cgbGV2ZWwgRnJhbWUgYnVmZmVyIGRyaXZlciBmb3IgSFAgd29ya3N0YXRpb25zIHdpdGggCiAgKiBTVEkgKHN0YW5kYXJkIHRleHQgaW50ZXJmYWNlKSB2aWRlbyBmaXJtd2FyZS4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBIZWxnZSBEZWxsZXIgPGRlbGxlckBnbXguZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBIZWxnZSBEZWxsZXIgPGRlbGxlckBnbXguZGU+CiAgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMDEgVGhvbWFzIEJvZ2VuZG9lcmZlciA8dHNib2dlbmRAYWxwaGEuZnJhbmtlbi5kZT4KICAqIAogICogQmFzZWQgb246CkBAIC03MywxNiArNzMsMTMgQEAKICNpbmNsdWRlICJzdGljb3JlLmgiCiAKIC8qIFJFR0lPTl9CQVNFKGZiX2luZm8sIGluZGV4KSByZXR1cm5zIHRoZSB2aXJ0dWFsIGFkZHJlc3MgZm9yIHJlZ2lvbiA8aW5kZXg+ICovCi0jaWZkZWYgX19MUDY0X18KLSAgI2RlZmluZSBSRUdJT05fQkFTRShmYl9pbmZvLCBpbmRleCkgXAotCShmYl9pbmZvLT5zdGktPmdsb2JfY2ZnLT5yZWdpb25fcHRyc1tpbmRleF0gfCAweGZmZmZmZmZmMDAwMDAwMDApCi0jZWxzZQotICAjZGVmaW5lIFJFR0lPTl9CQVNFKGZiX2luZm8sIGluZGV4KSBcCi0JZmJfaW5mby0+c3RpLT5nbG9iX2NmZy0+cmVnaW9uX3B0cnNbaW5kZXhdCi0jZW5kaWYKKyNkZWZpbmUgUkVHSU9OX0JBU0UoZmJfaW5mbywgaW5kZXgpIFwKKwlGX0VYVEVORChmYl9pbmZvLT5zdGktPmdsb2JfY2ZnLT5yZWdpb25fcHRyc1tpbmRleF0pCiAKICNkZWZpbmUgTkdMRURFVkRFUFJPTV9DUlRfUkVHSU9OIDEKIAorI2RlZmluZSBOUl9QQUxFVFRFIDI1NgorCiB0eXBlZGVmIHN0cnVjdCB7CiAJX19zMzIJdmlkZW9fY29uZmlnX3JlZzsKIAlfX3MzMgltaXNjX3ZpZGVvX3N0YXJ0OwpAQCAtMTEyLDcgKzEwOSw3IEBACiAJbmdsZV9yb21fdCBuZ2xlX3JvbTsKIAlzdHJ1Y3Qgc3RpX3N0cnVjdCAqc3RpOwogCWludCBkZXZpY2VTcGVjaWZpY0NvbmZpZzsKLQl1MzIgcHNldWRvX3BhbGV0dGVbMjU2XTsKKwl1MzIgcHNldWRvX3BhbGV0dGVbMTZdOwogfTsKIAogc3RhdGljIGludCBfX2luaXRkYXRhIHN0aWZiX2JwcF9wcmVmW01BWF9TVElfUk9NU107CkBAIC0zNTIsMTAgKzM0OSwxMCBAQAogI2RlZmluZSBJU184ODhfREVWSUNFKGZiKSBcCiAJKCEoSVNfMjRfREVWSUNFKGZiKSkpCiAKLSNkZWZpbmUgR0VUX0ZJRk9fU0xPVFMoZmIsIGNudCwgbnVtc2xvdHMpCQkJXAotewl3aGlsZSAoY250IDwgbnVtc2xvdHMpIAkJCQkJXAorI2RlZmluZSBHRVRfRklGT19TTE9UUyhmYiwgY250LCBudW1zbG90cykJXAorewl3aGlsZSAoY250IDwgbnVtc2xvdHMpIAkJCVwKIAkJY250ID0gUkVBRF9XT1JEKGZiLCBSRUdfMzQpOwlcCi0JY250IC09IG51bXNsb3RzOwkJCQkJXAorCWNudCAtPSBudW1zbG90czsJCQlcCiB9CiAKICNkZWZpbmUJICAgIEluZGV4ZWREY2QJMAkvKiBQaXhlbCBkYXRhIGlzIGluZGV4ZWQgKHBzZXVkbykgY29sb3IgKi8KQEAgLTk5NSw3ICs5OTIsNyBAQAogCXN0cnVjdCBzdGlmYl9pbmZvICpmYiA9IChzdHJ1Y3Qgc3RpZmJfaW5mbyAqKSBpbmZvOwogCXUzMiBjb2xvcjsKIAotCWlmIChyZWdubyA+PSAyNTYpICAvKiBuby4gb2YgaHcgcmVnaXN0ZXJzICovCisJaWYgKHJlZ25vID49IE5SX1BBTEVUVEUpCiAJCXJldHVybiAxOwogCiAJcmVkICAgPj49IDg7CkBAIC0xMDA1LDggKzEwMDIsOCBAQAogCURFQlVHX09GRigpOwogCiAJU1RBUlRfSU1BR0VfQ09MT1JNQVBfQUNDRVNTKGZiKTsKLQkKLQlpZiAoZmItPmluZm8udmFyLmdyYXlzY2FsZSkgeworCisJaWYgKHVubGlrZWx5KGZiLT5pbmZvLnZhci5ncmF5c2NhbGUpKSB7CiAJCS8qIGdyYXkgPSAwLjMwKlIgKyAwLjU5KkcgKyAwLjExKkIgKi8KIAkJY29sb3IgPSAoKHJlZCAqIDc3KSArCiAJCQkgKGdyZWVuICogMTUxKSArCkBAIC0xMDE3LDE3ICsxMDE0LDE3IEBACiAJCQkgKGJsdWUpKTsKIAl9CiAKLQlpZiAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDMyKSB7Ci0JCSgodTMyICopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0KLQkJCShyZWQgICA8PCBpbmZvLT52YXIucmVkLm9mZnNldCkgICB8Ci0JCQkoZ3JlZW4gPDwgaW5mby0+dmFyLmdyZWVuLm9mZnNldCkgfAotCQkJKGJsdWUgIDw8IGluZm8tPnZhci5ibHVlLm9mZnNldCk7Ci0JfSBlbHNlIHsKLQkJKCh1MzIgKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPSByZWdubzsKKwlpZiAoZmItPmluZm8uZml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfRElSRUNUQ09MT1IpIHsKKwkJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmZmItPmluZm8udmFyOworCQlpZiAocmVnbm8gPCAxNikKKwkJCSgodTMyICopZmItPmluZm8ucHNldWRvX3BhbGV0dGUpW3JlZ25vXSA9CisJCQkJcmVnbm8gPDwgdmFyLT5yZWQub2Zmc2V0IHwKKwkJCQlyZWdubyA8PCB2YXItPmdyZWVuLm9mZnNldCB8CisJCQkJcmVnbm8gPDwgdmFyLT5ibHVlLm9mZnNldDsKIAl9CiAKIAlXUklURV9JTUFHRV9DT0xPUihmYiwgcmVnbm8sIGNvbG9yKTsKLQkKKwogCWlmIChmYi0+aWQgPT0gUzkwMDBfSURfSENSWCkgewogCQlOZ2xlTHV0Qmx0Q3RsIGx1dEJsdEN0bDsKIApAQCAtMTA2Niw5ICsxMDYzLDkgQEAKIAljYXNlIFM5MDAwX0lEX0hDUlg6CiAJCUhZUEVSX0VOQUJMRV9ESVNBQkxFX0RJU1BMQVkoZmIsIGVuYWJsZSk7CiAJCWJyZWFrOwotCWNhc2UgUzkwMDBfSURfQTE2NTlBOjsJLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBTOTAwMF9JRF9USU1CRVI6OwotCWNhc2UgQ1JYMjRfT1ZFUkxBWV9QTEFORVM6OworCWNhc2UgUzkwMDBfSURfQTE2NTlBOgkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFM5MDAwX0lEX1RJTUJFUjoKKwljYXNlIENSWDI0X09WRVJMQVlfUExBTkVTOgogCWRlZmF1bHQ6CiAJCUVOQUJMRV9ESVNBQkxFX0RJU1BMQVkoZmIsIGVuYWJsZSk7CiAJCWJyZWFrOwpAQCAtMTI1MCwxMiArMTI0NywxMCBAQAogCQltZW1zZXQoJmZiLT5uZ2xlX3JvbSwgMCwgc2l6ZW9mKGZiLT5uZ2xlX3JvbSkpOwogCQlpZiAoKGZiLT5zdGktPnJlZ2lvbnNfcGh5c1swXSAmIDB4ZmMwMDAwMDApID09CiAJCSAgICAoZmItPnN0aS0+cmVnaW9uc19waHlzWzJdICYgMHhmYzAwMDAwMCkpCi0JCQlzdGlfcm9tX2FkZHJlc3MgPSBmYi0+c3RpLT5yZWdpb25zX3BoeXNbMF07CisJCQlzdGlfcm9tX2FkZHJlc3MgPSBGX0VYVEVORChmYi0+c3RpLT5yZWdpb25zX3BoeXNbMF0pOwogCQllbHNlCi0JCQlzdGlfcm9tX2FkZHJlc3MgPSBmYi0+c3RpLT5yZWdpb25zX3BoeXNbMV07Ci0jaWZkZWYgX19MUDY0X18KLQkgICAgICAgIHN0aV9yb21fYWRkcmVzcyB8PSAweGZmZmZmZmZmMDAwMDAwMDA7Ci0jZW5kaWYKKwkJCXN0aV9yb21fYWRkcmVzcyA9IEZfRVhURU5EKGZiLT5zdGktPnJlZ2lvbnNfcGh5c1sxXSk7CisKIAkJZmItPmRldmljZVNwZWNpZmljQ29uZmlnID0gZ3NjX3JlYWRsKHN0aV9yb21fYWRkcmVzcyk7CiAJCWlmIChJU18yNF9ERVZJQ0UoZmIpKSB7CiAJCQlpZiAoYnBwX3ByZWYgPT0gOCB8fCBicHBfcHJlZiA9PSAzMikKQEAgLTEzMTUsNyArMTMxMCw3IEBACiAJCWJyZWFrOwogCSAgICBjYXNlIDMyOgogCQlmaXgtPnR5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7Ci0JCWZpeC0+dmlzdWFsID0gRkJfVklTVUFMX1RSVUVDT0xPUjsKKwkJZml4LT52aXN1YWwgPSBGQl9WSVNVQUxfRElSRUNUQ09MT1I7CiAJCXZhci0+cmVkLmxlbmd0aCA9IHZhci0+Z3JlZW4ubGVuZ3RoID0gdmFyLT5ibHVlLmxlbmd0aCA9IHZhci0+dHJhbnNwLmxlbmd0aCA9IDg7CiAJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOwogCQl2YXItPmdyZWVuLm9mZnNldCA9IDg7CkBAIC0xMzM3LDcgKzEzMzIsNyBAQAogCWluZm8tPnBzZXVkb19wYWxldHRlID0gJmZiLT5wc2V1ZG9fcGFsZXR0ZTsKIAogCS8qIFRoaXMgaGFzIHRvIGJlZW4gZG9uZSAhISEgKi8KLQlmYl9hbGxvY19jbWFwKCZpbmZvLT5jbWFwLCAyNTYsIDApOworCWZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIE5SX1BBTEVUVEUsIDApOwogCXN0aWZiX2luaXRfZGlzcGxheShmYik7CiAKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihmaXgtPnNtZW1fc3RhcnQsIGZpeC0+c21lbV9sZW4sICJzdGlmYiBmYiIpKSB7CkBAIC0xNDg4LDcgKzE0ODMsMyBAQAogTU9EVUxFX0FVVEhPUigiSGVsZ2UgRGVsbGVyIDxkZWxsZXJAZ214LmRlPiwgVGhvbWFzIEJvZ2VuZG9lcmZlciA8dHNib2dlbmRAYWxwaGEuZnJhbmtlbi5kZT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRnJhbWVidWZmZXIgZHJpdmVyIGZvciBIUCdzIE5HTEUgc2VyaWVzIGdyYXBoaWNzIGNhcmRzIGluIEhQIFBBUklTQyBtYWNoaW5lcyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotCi1NT0RVTEVfUEFSTShicHAsICJpIik7Ci1NT0RVTEVfUEFSTV9ERVNDKG1lbSwgIkJpdHMgcGVyIHBpeGVsIChkZWZhdWx0OiA4KSIpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3RjeC5jIGIvZHJpdmVycy92aWRlby90Y3guYwppbmRleCAyYjI3YjQ0Li45NWI5MTgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3RjeC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdGN4LmMKQEAgLTMzLDkgKzMzLDggQEAKIAkJCSB1bnNpZ25lZCwgc3RydWN0IGZiX2luZm8gKik7CiBzdGF0aWMgaW50IHRjeF9ibGFuayhpbnQsIHN0cnVjdCBmYl9pbmZvICopOwogCi1zdGF0aWMgaW50IHRjeF9tbWFwKHN0cnVjdCBmYl9pbmZvICosIHN0cnVjdCBmaWxlICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKLXN0YXRpYyBpbnQgdGN4X2lvY3RsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsCi0JCSAgICAgdW5zaWduZWQgbG9uZywgc3RydWN0IGZiX2luZm8gKik7CitzdGF0aWMgaW50IHRjeF9tbWFwKHN0cnVjdCBmYl9pbmZvICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKK3N0YXRpYyBpbnQgdGN4X2lvY3RsKHN0cnVjdCBmYl9pbmZvICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CiBzdGF0aWMgaW50IHRjeF9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKiwgc3RydWN0IGZiX2luZm8gKik7CiAKIC8qCkBAIC0zMDIsNyArMzAxLDcgQEAKIAl7IC5zaXplID0gMCB9CiB9OwogCi1zdGF0aWMgaW50IHRjeF9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCitzdGF0aWMgaW50IHRjeF9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlzdHJ1Y3QgdGN4X3BhciAqcGFyID0gKHN0cnVjdCB0Y3hfcGFyICopaW5mby0+cGFyOwogCkBAIC0zMTIsOCArMzExLDggQEAKIAkJCQkgIHZtYSk7CiB9CiAKLXN0YXRpYyBpbnQgdGN4X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgdGN4X2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgY21kLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCB0Y3hfcGFyICpwYXIgPSAoc3RydWN0IHRjeF9wYXIgKikgaW5mby0+cGFyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3RkZnhmYi5jIGIvZHJpdmVycy92aWRlby90ZGZ4ZmIuYwppbmRleCA5ZDUzMzg3Li4zZTdiYWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3RkZnhmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdGRmeGZiLmMKQEAgLTI5MSw3ICsyOTEsNyBAQAogIAogc3RhdGljIGludCBiYW5zaGVlX3dhaXRfaWRsZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgdGRmeF9wYXIgKnBhciA9IChzdHJ1Y3QgdGRmeF9wYXIgKikgaW5mby0+cGFyOyAKKwlzdHJ1Y3QgdGRmeF9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlpbnQgaSA9IDA7CiAKIAliYW5zaGVlX21ha2Vfcm9vbShwYXIsIDEpOwpAQCAtMzY0LDcgKzM2NCw3IEBACiAKIHN0YXRpYyB2b2lkIGRvX3dyaXRlX3JlZ3Moc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBiYW5zaGVlX3JlZyogcmVnKSAKIHsKLQlzdHJ1Y3QgdGRmeF9wYXIgKnBhciA9IChzdHJ1Y3QgdGRmeF9wYXIgKikgaW5mby0+cGFyOyAKKwlzdHJ1Y3QgdGRmeF9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlpbnQgaTsKIAogCWJhbnNoZWVfd2FpdF9pZGxlKGluZm8pOwpAQCAtNDY5LDcgKzQ2OSw3IEBACiAKIHN0YXRpYyBpbnQgdGRmeGZiX2NoZWNrX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcixzdHJ1Y3QgZmJfaW5mbyAqaW5mbykgCiB7Ci0Jc3RydWN0IHRkZnhfcGFyICpwYXIgPSAoc3RydWN0IHRkZnhfcGFyICopIGluZm8tPnBhcjsgCisJc3RydWN0IHRkZnhfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJdTMyIGxwaXRjaDsKIAogCWlmICh2YXItPmJpdHNfcGVyX3BpeGVsICE9IDggICYmIHZhci0+Yml0c19wZXJfcGl4ZWwgIT0gMTYgJiYKQEAgLTU1OCw3ICs1NTgsNyBAQAogCiBzdGF0aWMgaW50IHRkZnhmYl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCB0ZGZ4X3BhciAqcGFyID0gKHN0cnVjdCB0ZGZ4X3BhciAqKSBpbmZvLT5wYXI7CQorCXN0cnVjdCB0ZGZ4X3BhciAqcGFyID0gaW5mby0+cGFyOwogCXUzMiBoZGlzcGVuZCwgaHN5bmNzdGEsIGhzeW5jZW5kLCBodG90YWw7CiAJdTMyIGhkLCBocywgaGUsIGh0LCBoYnMsIGhiZTsKIAl1MzIgdmQsIHZzLCB2ZSwgdnQsIHZicywgdmJlOwpAQCAtNzgwLDcgKzc4MCw3IEBACiBzdGF0aWMgaW50IHRkZnhmYl9zZXRjb2xyZWcodW5zaWduZWQgcmVnbm8sIHVuc2lnbmVkIHJlZCwgdW5zaWduZWQgZ3JlZW4sICAKIAkJCSAgICB1bnNpZ25lZCBibHVlLHVuc2lnbmVkIHRyYW5zcCxzdHJ1Y3QgZmJfaW5mbyAqaW5mbykgCiB7Ci0Jc3RydWN0IHRkZnhfcGFyICpwYXIgPSAoc3RydWN0IHRkZnhfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgdGRmeF9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1MzIgcmdiY29sOwogICAgCiAJaWYgKHJlZ25vID49IGluZm8tPmNtYXAubGVuIHx8IHJlZ25vID4gMjU1KSByZXR1cm4gMTsKQEAgLTc5NCwxMSArNzk0LDE1IEBACiAJCQlicmVhazsKIAkJLyogVHJ1ZWNvbG9yIGhhcyBubyBoYXJkd2FyZSBjb2xvciBwYWxldHRlcy4gKi8KIAkJY2FzZSBGQl9WSVNVQUxfVFJVRUNPTE9SOgotCQkJcmdiY29sID0gKENOVlRfVE9IVyggcmVkLCBpbmZvLT52YXIucmVkLmxlbmd0aCkgPDwgaW5mby0+dmFyLnJlZC5vZmZzZXQpIHwKLQkJCQkgKENOVlRfVE9IVyggZ3JlZW4sIGluZm8tPnZhci5ncmVlbi5sZW5ndGgpIDw8IGluZm8tPnZhci5ncmVlbi5vZmZzZXQpIHwKLQkJCQkgKENOVlRfVE9IVyggYmx1ZSwgaW5mby0+dmFyLmJsdWUubGVuZ3RoKSA8PCBpbmZvLT52YXIuYmx1ZS5vZmZzZXQpIHwKLQkJCQkgKENOVlRfVE9IVyggdHJhbnNwLCBpbmZvLT52YXIudHJhbnNwLmxlbmd0aCkgPDwgaW5mby0+dmFyLnRyYW5zcC5vZmZzZXQpOwotCQkJCSgodTMyKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPSByZ2Jjb2w7CisJCQlyZ2Jjb2wgPSAoQ05WVF9UT0hXKCByZWQsIGluZm8tPnZhci5yZWQubGVuZ3RoKSA8PAorCQkJCSAgaW5mby0+dmFyLnJlZC5vZmZzZXQpIHwKKwkJCQkgKENOVlRfVE9IVyggZ3JlZW4sIGluZm8tPnZhci5ncmVlbi5sZW5ndGgpIDw8CisJCQkJICBpbmZvLT52YXIuZ3JlZW4ub2Zmc2V0KSB8CisJCQkJIChDTlZUX1RPSFcoIGJsdWUsIGluZm8tPnZhci5ibHVlLmxlbmd0aCkgPDwKKwkJCQkgIGluZm8tPnZhci5ibHVlLm9mZnNldCkgfAorCQkJCSAoQ05WVF9UT0hXKCB0cmFuc3AsIGluZm8tPnZhci50cmFuc3AubGVuZ3RoKSA8PAorCQkJCSAgaW5mby0+dmFyLnRyYW5zcC5vZmZzZXQpOworCQkJCXBhci0+cGFsZXR0ZVtyZWdub10gPSByZ2Jjb2w7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCURQUklOVEsoImJhZCBkZXB0aCAldVxuIiwgaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKTsKQEAgLTgxMCw3ICs4MTQsNyBAQAogLyogMCB1bmJsYW5rLCAxIGJsYW5rLCAyIG5vIHZzeW5jLCAzIG5vIGhzeW5jLCA0IG9mZiAqLwogc3RhdGljIGludCB0ZGZ4ZmJfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsgCi0Jc3RydWN0IHRkZnhfcGFyICpwYXIgPSAoc3RydWN0IHRkZnhfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgdGRmeF9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1MzIgZGFjbW9kZSwgc3RhdGUgPSAwLCB2Z2FibGFuayA9IDA7CiAKIAlkYWNtb2RlID0gdGRmeF9pbmwocGFyLCBEQUNNT0RFKTsKQEAgLTg1NSw3ICs4NTksNyBAQAogc3RhdGljIGludCB0ZGZ4ZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCiAJCQkgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykgCiB7Ci0Jc3RydWN0IHRkZnhfcGFyICpwYXIgPSAoc3RydWN0IHRkZnhfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgdGRmeF9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1MzIgYWRkcjsgIAkKIAogCWlmIChub3BhbiB8fCB2YXItPnhvZmZzZXQgfHwgKHZhci0+eW9mZnNldCA+IHZhci0+eXJlc192aXJ0dWFsKSkKQEAgLTg3OCw3ICs4ODIsNyBAQAogICovCiBzdGF0aWMgdm9pZCB0ZGZ4ZmJfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCkgCiB7Ci0Jc3RydWN0IHRkZnhfcGFyICpwYXIgPSAoc3RydWN0IHRkZnhfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgdGRmeF9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1MzIgYnBwID0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOwogCXUzMiBzdHJpZGUgPSBpbmZvLT5maXgubGluZV9sZW5ndGg7CiAJdTMyIGZtdD0gc3RyaWRlIHwgKChicHArKChicHA9PTgpID8gMCA6IDgpKSA8PCAxMyk7IApAQCAtODk0LDcgKzg5OCw3IEBACiAJaWYgKGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX1BTRVVET0NPTE9SKSB7CiAJCXRkZnhfb3V0bChwYXIsCUNPTE9SRk9SRSwgcmVjdC0+Y29sb3IpOwogCX0gZWxzZSB7IC8qIEZCX1ZJU1VBTF9UUlVFQ09MT1IgKi8KLQkJdGRmeF9vdXRsKHBhciwgQ09MT1JGT1JFLCAoKHUzMiopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVjdC0+Y29sb3JdKTsKKwkJdGRmeF9vdXRsKHBhciwgQ09MT1JGT1JFLCBwYXItPnBhbGV0dGVbcmVjdC0+Y29sb3JdKTsKIAl9CiAJdGRmeF9vdXRsKHBhciwJQ09NTUFORF8yRCwgQ09NTUFORF8yRF9GSUxMUkVDVCB8ICh0ZGZ4X3JvcCA8PCAyNCkpOwogCXRkZnhfb3V0bChwYXIsCURTVFNJWkUsICAgIHJlY3QtPndpZHRoIHwgKHJlY3QtPmhlaWdodCA8PCAxNikpOwpAQCAtOTA2LDcgKzkxMCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHRkZnhmYl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICphcmVhKSAgCiB7Ci0Jc3RydWN0IHRkZnhfcGFyICpwYXIgPSAoc3RydWN0IHRkZnhfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgdGRmeF9wYXIgKnBhciA9IGluZm8tPnBhcjsKICAgIAl1MzIgc3ggPSBhcmVhLT5zeCwgc3kgPSBhcmVhLT5zeSwgZHggPSBhcmVhLT5keCwgZHkgPSBhcmVhLT5keTsKIAl1MzIgYnBwID0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOwogCXUzMiBzdHJpZGUgPSBpbmZvLT5maXgubGluZV9sZW5ndGg7CkBAIC05MzgsNyArOTQyLDcgQEAKIAogc3RhdGljIHZvaWQgdGRmeGZiX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSkgCiB7Ci0Jc3RydWN0IHRkZnhfcGFyICpwYXIgPSAoc3RydWN0IHRkZnhfcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgdGRmeF9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlpbnQgc2l6ZSA9IGltYWdlLT5oZWlnaHQgKiAoKGltYWdlLT53aWR0aCAqIGltYWdlLT5kZXB0aCArIDcpPj4zKTsKIAlpbnQgZmlmb19mcmVlOwogCWludCBpLCBzdHJpZGUgPSBpbmZvLT5maXgubGluZV9sZW5ndGg7CkBAIC05NjEsOCArOTY1LDEwIEBACiAJCQkJYnJlYWs7CiAJCQljYXNlIEZCX1ZJU1VBTF9UUlVFQ09MT1I6CiAJCQlkZWZhdWx0OgotCQkJCXRkZnhfb3V0bChwYXIsIENPTE9SRk9SRSwgKCh1MzIqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW2ltYWdlLT5mZ19jb2xvcl0pOwotCQkJCXRkZnhfb3V0bChwYXIsIENPTE9SQkFDSywgKCh1MzIqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW2ltYWdlLT5iZ19jb2xvcl0pOworCQkJCXRkZnhfb3V0bChwYXIsIENPTE9SRk9SRSwKKwkJCQkJICBwYXItPnBhbGV0dGVbaW1hZ2UtPmZnX2NvbG9yXSk7CisJCQkJdGRmeF9vdXRsKHBhciwgQ09MT1JCQUNLLAorCQkJCQkgIHBhci0+cGFsZXR0ZVtpbWFnZS0+YmdfY29sb3JdKTsKIAkJfQogI2lmZGVmIF9fQklHX0VORElBTgogCQlzcmNmbXQgPSAweDQwMDAwMCB8IEJJVCgyMCk7CkBAIC0xMDA3LDcgKzEwMTMsNyBAQAogI2lmZGVmIFRERlhfSEFSRFdBUkVfQ1VSU09SCiBzdGF0aWMgaW50IHRkZnhmYl9jdXJzb3Ioc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmYl9jdXJzb3IgKmN1cnNvcikKIHsKLQlzdHJ1Y3QgdGRmeF9wYXIgKnBhciA9IChzdHJ1Y3QgdGRmeF9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCB0ZGZ4X3BhciAqcGFyID0gaW5mby0+cGFyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKgpAQCAtMTE1NywxOCArMTE2MywxNyBAQAogewogCXN0cnVjdCB0ZGZ4X3BhciAqZGVmYXVsdF9wYXI7CiAJc3RydWN0IGZiX2luZm8gKmluZm87Ci0JaW50IHNpemUsIGVyciwgbHBpdGNoOworCWludCBlcnIsIGxwaXRjaDsKIAogCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldikpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInRkZnhmYjogQ2FuJ3QgZW5hYmxlIHBkZXY6ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNpemUgPSBzaXplb2Yoc3RydWN0IHRkZnhfcGFyKSsyNTYqc2l6ZW9mKHUzMik7CisJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3QgdGRmeF9wYXIpLCAmcGRldi0+ZGV2KTsKIAotCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplLCAmcGRldi0+ZGV2KTsKLQotCWlmICghaW5mbykJcmV0dXJuIC1FTk9NRU07CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKIAkJCiAJZGVmYXVsdF9wYXIgPSBpbmZvLT5wYXI7CiAgCkBAIC0xMjQ4LDcgKzEyNTMsNyBAQAogICAgCiAJaW5mby0+ZmJvcHMJCT0gJnRkZnhmYl9vcHM7CiAJaW5mby0+Zml4CQk9IHRkZnhfZml4OyAJCi0JaW5mby0+cHNldWRvX3BhbGV0dGUJPSAodm9pZCAqKShkZWZhdWx0X3BhciArIDEpOyAKKwlpbmZvLT5wc2V1ZG9fcGFsZXR0ZQk9IGRlZmF1bHRfcGFyLT5wYWxldHRlOwogCWluZm8tPmZsYWdzCQk9IEZCSU5GT19ERUZBVUxUIHwgRkJJTkZPX0hXQUNDRUxfWVBBTjsKICNpZmRlZiBDT05GSUdfRkJfM0RGWF9BQ0NFTAogCWluZm8tPmZsYWdzICAgICAgICAgICAgIHw9IEZCSU5GT19IV0FDQ0VMX0ZJTExSRUNUIHwKQEAgLTEzMDcsNyArMTMxMiw3IEBACiB9CiAKICNpZm5kZWYgTU9EVUxFCi12b2lkIHRkZnhmYl9zZXR1cChjaGFyICpvcHRpb25zKQorc3RhdGljIHZvaWQgdGRmeGZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCiB7CiAJY2hhciogdGhpc19vcHQ7CiAKQEAgLTEzNDAsNyArMTM0NSw3IEBACiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgdGRmeGZiX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgdGRmeF9wYXIgKnBhciA9IChzdHJ1Y3QgdGRmeF9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCB0ZGZ4X3BhciAqcGFyID0gaW5mby0+cGFyOwogCiAJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKIAlpb3VubWFwKHBhci0+cmVnYmFzZV92aXJ0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmFsa3lyaWVmYi5jIGIvZHJpdmVycy92aWRlby92YWxreXJpZWZiLmMKaW5kZXggY2U5N2VjOC4uMmJkZWI0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92YWxreXJpZWZiLmMKKysrIGIvZHJpdmVycy92aWRlby92YWxreXJpZWZiLmMKQEAgLTM0MiwxOSArMzQyLDE5IEBACiAjZWxzZSAvKiBwcGMgKCFDT05GSUdfTUFDKSAqLwogCXsKIAkJc3RydWN0IGRldmljZV9ub2RlICpkcDsKKwkJc3RydWN0IHJlc291cmNlIHI7CiAKLQkJZHAgPSBmaW5kX2RldmljZXMoInZhbGt5cmllIik7CisJCWRwID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInZhbGt5cmllIik7CiAJCWlmIChkcCA9PSAwKQogCQkJcmV0dXJuIDA7CiAKLQkJaWYgKGRwLT5uX2FkZHJzICE9IDEpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZXhwZWN0aW5nIDEgYWRkcmVzcyBmb3IgdmFsa3lyaWUgKGdvdCAlZClcbiIsCi0JCQkgICAgICAgZHAtPm5fYWRkcnMpOworCQlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShkcCwgMCwgJnIpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImNhbid0IGZpbmQgYWRkcmVzcyBmb3IgdmFsa3lyaWVcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAotCQlmcmFtZV9idWZmZXJfcGh5cyA9IGRwLT5hZGRyc1swXS5hZGRyZXNzOwotCQljbWFwX3JlZ3NfcGh5cyA9IGRwLT5hZGRyc1swXS5hZGRyZXNzKzB4MzA0MDAwOworCQlmcmFtZV9idWZmZXJfcGh5cyA9IHIuc3RhcnQ7CisJCWNtYXBfcmVnc19waHlzID0gci5zdGFydCArIDB4MzA0MDAwOwogCQlmbGFncyA9IF9QQUdFX1dSSVRFVEhSVTsKIAl9CiAjZW5kaWYgLyogcHBjICghQ09ORklHX01BQykgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmVzYWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3Zlc2FmYi5jCmluZGV4IDNlNThkZGMuLjg5ODJlNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdmVzYWZiLmMKKysrIGIvZHJpdmVycy92aWRlby92ZXNhZmIuYwpAQCAtNTcsNyArNTcsNiBAQAogc3RhdGljIHZvaWQgICAgICAgICAgICAoKnBtaV9zdGFydCkodm9pZCk7CiBzdGF0aWMgdm9pZCAgICAgICAgICAgICgqcG1pX3BhbCkodm9pZCk7CiBzdGF0aWMgaW50ICAgICAgICAgICAgIGRlcHRoOwotc3RhdGljIGludCAgICAgICAgICAgICB2Z2FfY29tcGF0OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtNjcsMTUgKzY2LDYgQEAKICNpZmRlZiBfX2kzODZfXwogCWludCBvZmZzZXQ7CiAKLQlpZiAoIXlwYW4pCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICh2YXItPnhvZmZzZXQpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICh2YXItPnlvZmZzZXQgPiB2YXItPnlyZXNfdmlydHVhbCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKCh5cGFuPT0xKSAmJiB2YXItPnlvZmZzZXQrdmFyLT55cmVzID4gdmFyLT55cmVzX3ZpcnR1YWwpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJb2Zmc2V0ID0gKHZhci0+eW9mZnNldCAqIGluZm8tPmZpeC5saW5lX2xlbmd0aCArIHZhci0+eG9mZnNldCkgLyA0OwogCiAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKApAQCAtOTAsMzcgKzgwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB2ZXNhZmJfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQlpbnQgZXJyID0gMTsKLQotCWlmICh2Z2FfY29tcGF0KSB7Ci0JCWludCBsb29wID0gMTAwMDA7Ci0JCXU4IHNlcSA9IDAsIGNydGMxNyA9IDA7Ci0KLQkJaWYgKGJsYW5rID09IEZCX0JMQU5LX1BPV0VSRE9XTikgewotCQkJc2VxID0gMHgyMDsKLQkJCWNydGMxNyA9IDB4MDA7Ci0JCQllcnIgPSAwOwotCQl9IGVsc2UgewotCQkJc2VxID0gMHgwMDsKLQkJCWNydGMxNyA9IDB4ODA7Ci0JCQllcnIgPSAoYmxhbmsgPT0gRkJfQkxBTktfVU5CTEFOSykgPyAwIDogLUVJTlZBTDsKLQkJfQotCi0JCXZnYV93c2VxKE5VTEwsIDB4MDAsIDB4MDEpOwotCQlzZXEgfD0gdmdhX3JzZXEoTlVMTCwgMHgwMSkgJiB+MHgyMDsKLQkJdmdhX3dzZXEoTlVMTCwgMHgwMCwgc2VxKTsKLQotCQljcnRjMTcgfD0gdmdhX3JjcnQoTlVMTCwgMHgxNykgJiB+MHg4MDsKLQkJd2hpbGUgKGxvb3AtLSk7Ci0JCXZnYV93Y3J0KE5VTEwsIDB4MTcsIGNydGMxNyk7Ci0JCXZnYV93c2VxKE5VTEwsIDB4MDAsIDB4MDMpOwotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KIHN0YXRpYyB2b2lkIHZlc2Ffc2V0cGFsZXR0ZShpbnQgcmVnbm8sIHVuc2lnbmVkIHJlZCwgdW5zaWduZWQgZ3JlZW4sCiAJCQkgICAgdW5zaWduZWQgYmx1ZSkKIHsKQEAgLTIwNSw3ICsxNjQsNiBAQAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZmJfc2V0Y29scmVnCT0gdmVzYWZiX3NldGNvbHJlZywKIAkuZmJfcGFuX2Rpc3BsYXkJPSB2ZXNhZmJfcGFuX2Rpc3BsYXksCi0JLmZiX2JsYW5rICAgICAgID0gdmVzYWZiX2JsYW5rLAogCS5mYl9maWxscmVjdAk9IGNmYl9maWxscmVjdCwKIAkuZmJfY29weWFyZWEJPSBjZmJfY29weWFyZWEsCiAJLmZiX2ltYWdlYmxpdAk9IGNmYl9pbWFnZWJsaXQsCkBAIC00NTksOSArNDE3LDggQEAKIAlpbmZvLT5mbGFncyA9IEZCSU5GT19GTEFHX0RFRkFVTFQgfAogCQkoeXBhbikgPyBGQklORk9fSFdBQ0NFTF9ZUEFOIDogMDsKIAotCXZnYV9jb21wYXQgPSAoc2NyZWVuX2luZm8uY2FwYWJpbGl0aWVzICYgMikgPyAwIDogMTsKLQlwcmludGsoInZlc2FmYjogTW9kZSBpcyAlc1ZHQSBjb21wYXRpYmxlXG4iLAotCSAgICAgICAodmdhX2NvbXBhdCkgPyAiIiA6ICJub3QgIik7CisJaWYgKCF5cGFuKQorCQlpbmZvLT5mYm9wcy0+ZmJfcGFuX2Rpc3BsYXkgPSBOVUxMOwogCiAJaWYgKGZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDI1NiwgMCkgPCAwKSB7CiAJCWVyciA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZmYi5jIGIvZHJpdmVycy92aWRlby92ZmIuYwppbmRleCBmZmExYWQ0Li41MzIwOGNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdmZiLmMKQEAgLTgxLDcgKzgxLDcgQEAKIAkJCSB1X2ludCB0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIHN0YXRpYyBpbnQgdmZiX3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAogCQkJICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCB2ZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZpbGUgKmZpbGUsCitzdGF0aWMgaW50IHZmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLAogCQkgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwogCiBzdGF0aWMgc3RydWN0IGZiX29wcyB2ZmJfb3BzID0gewpAQCAtMzY4LDcgKzM2OCw3IEBACiAgICAgICogIE1vc3QgZHJpdmVycyBkb24ndCBuZWVkIHRoZWlyIG93biBtbWFwIGZ1bmN0aW9uIAogICAgICAqLwogCi1zdGF0aWMgaW50IHZmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKK3N0YXRpYyBpbnQgdmZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sCiAJCSAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmdhMTZmYi5jIGIvZHJpdmVycy92aWRlby92Z2ExNmZiLmMKaW5kZXggMjI2YWU4YS4uZjNmMTZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92Z2ExNmZiLmMKKysrIGIvZHJpdmVycy92aWRlby92Z2ExNmZiLmMKQEAgLTcwNSwxNSArNzA1LDcgQEAKIHN0YXRpYyBpbnQgdmdhMTZmYl9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKIAkJCSAgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykgCiB7Ci0JaWYgKHZhci0+eG9mZnNldCArIGluZm8tPnZhci54cmVzID4gaW5mby0+dmFyLnhyZXNfdmlydHVhbCB8fAotCSAgICB2YXItPnlvZmZzZXQgKyBpbmZvLT52YXIueXJlcyA+IGluZm8tPnZhci55cmVzX3ZpcnR1YWwpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJdmdhMTZmYl9wYW5fdmFyKGluZm8sIHZhcik7Ci0KLQlpbmZvLT52YXIueG9mZnNldCA9IHZhci0+eG9mZnNldDsKLQlpbmZvLT52YXIueW9mZnNldCA9IHZhci0+eW9mZnNldDsKLQlpbmZvLT52YXIudm1vZGUgJj0gfkZCX1ZNT0RFX1lXUkFQOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZnYXN0YXRlLmMgYi9kcml2ZXJzL3ZpZGVvL3ZnYXN0YXRlLmMKaW5kZXggZDllMDFkYS4uMTUxNzllYyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92Z2FzdGF0ZS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdmdhc3RhdGUuYwpAQCAtMzU2LDEwICszNTYsMTEgQEAKIHsKIAlzdHJ1Y3QgcmVnc3RhdGUgKnNhdmVkOwogCi0Jc2F2ZWQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVnc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlzYXZlZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZWdzdGF0ZSksIEdGUF9LRVJORUwpOworCiAJaWYgKHNhdmVkID09IE5VTEwpCiAJCXJldHVybiAxOwotCW1lbXNldCAoc2F2ZWQsIDAsIHNpemVvZihzdHJ1Y3QgcmVnc3RhdGUpKTsKKwogCXN0YXRlLT52aWRzdGF0ZSA9ICh2b2lkICopc2F2ZWQ7CiAJCQogCWlmIChzdGF0ZS0+ZmxhZ3MgJiBWR0FfU0FWRV9DTUFQKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL0tjb25maWcgYi9kcml2ZXJzL3cxL0tjb25maWcKaW5kZXggOWExZTAwZC4uNGJhZjYxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdzEvS2NvbmZpZwpAQCAtMyw3ICszLDcgQEAKIGNvbmZpZyBXMQogCXRyaXN0YXRlICJEYWxsYXMncyAxLXdpcmUgc3VwcG9ydCIKIAktLS1oZWxwLS0tCi0JICBEYWxsYXMncyAxLXdpcmUgYnVzIGlzIHVzZWZ1bGwgdG8gY29ubmVjdCBzbG93IDEtcGluIGRldmljZXMKKwkgIERhbGxhcydzIDEtd2lyZSBidXMgaXMgdXNlZnVsIHRvIGNvbm5lY3Qgc2xvdyAxLXBpbiBkZXZpY2VzCiAJICBzdWNoIGFzIGlCdXR0b25zIGFuZCB0aGVybWFsIHNlbnNvcnMuCiAKIAkgIElmIHlvdSB3YW50IFcxIHN1cHBvcnQsIHlvdSBzaG91bGQgc2F5IFkgaGVyZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvem9ycm8vcHJvYy5jIGIvZHJpdmVycy96b3Jyby9wcm9jLmMKaW5kZXggMWE0MDljMi4uN2FhMmQzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy96b3Jyby9wcm9jLmMKKysrIGIvZHJpdmVycy96b3Jyby9wcm9jLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKIH0KIAogc3RhdGljIHNzaXplX3QKLXByb2NfYnVzX3pvcnJvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQorcHJvY19idXNfem9ycm9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBpbm9kZSAqaW5vID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShpbm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy96b3Jyby96b3Jyby1kcml2ZXIuYyBiL2RyaXZlcnMvem9ycm8vem9ycm8tZHJpdmVyLmMKaW5kZXggY2NiYTIyNy4uZmNiZWU3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy96b3Jyby96b3Jyby1kcml2ZXIuYworKysgYi9kcml2ZXJzL3pvcnJvL3pvcnJvLWRyaXZlci5jCkBAIC03Nyw3ICs3Nyw2IEBACiAJLyogaW5pdGlhbGl6ZSBjb21tb24gZHJpdmVyIGZpZWxkcyAqLwogCWRydi0+ZHJpdmVyLm5hbWUgPSBkcnYtPm5hbWU7CiAJZHJ2LT5kcml2ZXIuYnVzID0gJnpvcnJvX2J1c190eXBlOwotCWRydi0+ZHJpdmVyLnByb2JlID0gem9ycm9fZGV2aWNlX3Byb2JlOwogCiAJLyogcmVnaXN0ZXIgd2l0aCBjb3JlICovCiAJY291bnQgPSBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKQEAgLTEzMiw3ICsxMzEsOCBAQAogCiBzdHJ1Y3QgYnVzX3R5cGUgem9ycm9fYnVzX3R5cGUgPSB7CiAJLm5hbWUJPSAiem9ycm8iLAotCS5tYXRjaAk9IHpvcnJvX2J1c19tYXRjaAorCS5tYXRjaAk9IHpvcnJvX2J1c19tYXRjaCwKKwkucHJvYmUJPSB6b3Jyb19kZXZpY2VfcHJvYmUsCiB9OwogCiAKZGlmZiAtLWdpdCBhL2ZzLzlwLzlwLmMgYi9mcy85cC85cC5jCmluZGV4IGU4NDdmNTAuLjFhNmQwODcgMTAwNjQ0Ci0tLSBhL2ZzLzlwLzlwLmMKKysrIGIvZnMvOXAvOXAuYwpAQCAtMSw4ICsxLDkgQEAKIC8qCiAgKiAgbGludXgvZnMvOXAvOXAuYwogICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIDlQMjAwMCBmdW5jdGlvbnMKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHRvIHBlcmZvcm0gc3luY2hyb25vdXMgOVAgY2FsbHMKICAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IGJ5IExhdGNoZXNhciBJb25rb3YgPGx1Y2hvQGlvbmtvdi5uZXQ+CiAgKiAgQ29weXJpZ2h0IChDKSAyMDA0IGJ5IEVyaWMgVmFuIEhlbnNiZXJnZW4gPGVyaWN2aEBnbWFpbC5jb20+CiAgKiAgQ29weXJpZ2h0IChDKSAyMDAyIGJ5IFJvbiBNaW5uaWNoIDxybWlubmljaEBsYW5sLmdvdj4KICAqCkBAIC0zMyw2ICszNCw3IEBACiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ2OWZzLmgiCiAjaW5jbHVkZSAiOXAuaCIKKyNpbmNsdWRlICJjb252LmgiCiAjaW5jbHVkZSAibXV4LmgiCiAKIC8qKgpAQCAtNDYsMTYgKzQ4LDIxIEBACiAKIGludAogdjlmc190X3ZlcnNpb24oc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdTMyIG1zaXplLAotCSAgICAgICBjaGFyICp2ZXJzaW9uLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKmZjYWxsKQorCSAgICAgICBjaGFyICp2ZXJzaW9uLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKnJjcCkKIHsKLQlzdHJ1Y3Qgdjlmc19mY2FsbCBtc2c7CisJaW50IHJldDsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqdGM7CiAKIAlkcHJpbnRrKERFQlVHXzlQLCAibXNpemU6ICVkIHZlcnNpb246ICVzXG4iLCBtc2l6ZSwgdmVyc2lvbik7Ci0JbXNnLmlkID0gVFZFUlNJT047Ci0JbXNnLnBhcmFtcy50dmVyc2lvbi5tc2l6ZSA9IG1zaXplOwotCW1zZy5wYXJhbXMudHZlcnNpb24udmVyc2lvbiA9IHZlcnNpb247CisJdGMgPSB2OWZzX2NyZWF0ZV90dmVyc2lvbihtc2l6ZSwgdmVyc2lvbik7CiAKLQlyZXR1cm4gdjlmc19tdXhfcnBjKHY5c2VzLCAmbXNnLCBmY2FsbCk7CisJaWYgKCFJU19FUlIodGMpKSB7CisJCXJldCA9IHY5ZnNfbXV4X3JwYyh2OXNlcy0+bXV4LCB0YywgcmNwKTsKKwkJa2ZyZWUodGMpOworCX0gZWxzZQorCQlyZXQgPSBQVFJfRVJSKHRjKTsKKworCXJldHVybiByZXQ7CiB9CiAKIC8qKgpAQCAtNzEsMTkgKzc4LDQ1IEBACiAKIGludAogdjlmc190X2F0dGFjaChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBjaGFyICp1bmFtZSwgY2hhciAqYW5hbWUsCi0JICAgICAgdTMyIGZpZCwgdTMyIGFmaWQsIHN0cnVjdCB2OWZzX2ZjYWxsICoqZmNhbGwpCisJICAgICAgdTMyIGZpZCwgdTMyIGFmaWQsIHN0cnVjdCB2OWZzX2ZjYWxsICoqcmNwKQogewotCXN0cnVjdCB2OWZzX2ZjYWxsIG1zZzsKKwlpbnQgcmV0OworCXN0cnVjdCB2OWZzX2ZjYWxsKiB0YzsKIAogCWRwcmludGsoREVCVUdfOVAsICJ1bmFtZSAnJXMnIGFuYW1lICclcycgZmlkICVkIGFmaWQgJWRcbiIsIHVuYW1lLAogCQlhbmFtZSwgZmlkLCBhZmlkKTsKLQltc2cuaWQgPSBUQVRUQUNIOwotCW1zZy5wYXJhbXMudGF0dGFjaC5maWQgPSBmaWQ7Ci0JbXNnLnBhcmFtcy50YXR0YWNoLmFmaWQgPSBhZmlkOwotCW1zZy5wYXJhbXMudGF0dGFjaC51bmFtZSA9IHVuYW1lOwotCW1zZy5wYXJhbXMudGF0dGFjaC5hbmFtZSA9IGFuYW1lOwogCi0JcmV0dXJuIHY5ZnNfbXV4X3JwYyh2OXNlcywgJm1zZywgZmNhbGwpOworCXRjID0gdjlmc19jcmVhdGVfdGF0dGFjaChmaWQsIGFmaWQsIHVuYW1lLCBhbmFtZSk7CisJaWYgKCFJU19FUlIodGMpKSB7CisJCXJldCA9IHY5ZnNfbXV4X3JwYyh2OXNlcy0+bXV4LCB0YywgcmNwKTsKKwkJa2ZyZWUodGMpOworCX0gZWxzZQorCQlyZXQgPSBQVFJfRVJSKHRjKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHY5ZnNfdF9jbHVua19jYih2b2lkICphLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqdGMsCisJc3RydWN0IHY5ZnNfZmNhbGwgKnJjLCBpbnQgZXJyKQoreworCWludCBmaWQ7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlczsKKworCWlmIChlcnIpCisJCXJldHVybjsKKworCWZpZCA9IHRjLT5wYXJhbXMudGNsdW5rLmZpZDsKKwlrZnJlZSh0Yyk7CisKKwlpZiAoIXJjKQorCQlyZXR1cm47CisKKwlkcHJpbnRrKERFQlVHXzlQLCAidGNhbGwgaWQgJWQgcmNhbGwgaWQgJWRcbiIsIHRjLT5pZCwgcmMtPmlkKTsKKwl2OXNlcyA9IGE7CisJaWYgKHJjLT5pZCA9PSBSQ0xVTkspCisJCXY5ZnNfcHV0X2lkcG9vbChmaWQsICZ2OXNlcy0+ZmlkcG9vbCk7CisKKwlrZnJlZShyYyk7CiB9CiAKIC8qKgpAQCAtOTUsMTYgKzEyOCwyNSBAQAogICovCiAKIGludAotdjlmc190X2NsdW5rKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBmaWQsCi0JICAgICBzdHJ1Y3Qgdjlmc19mY2FsbCAqKmZjYWxsKQordjlmc190X2NsdW5rKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBmaWQpCiB7Ci0Jc3RydWN0IHY5ZnNfZmNhbGwgbXNnOworCWludCByZXQ7CisJc3RydWN0IHY5ZnNfZmNhbGwgKnRjLCAqcmM7CiAKIAlkcHJpbnRrKERFQlVHXzlQLCAiZmlkICVkXG4iLCBmaWQpOwotCW1zZy5pZCA9IFRDTFVOSzsKLQltc2cucGFyYW1zLnRjbHVuay5maWQgPSBmaWQ7CiAKLQlyZXR1cm4gdjlmc19tdXhfcnBjKHY5c2VzLCAmbXNnLCBmY2FsbCk7CisJcmMgPSBOVUxMOworCXRjID0gdjlmc19jcmVhdGVfdGNsdW5rKGZpZCk7CisJaWYgKCFJU19FUlIodGMpKQorCQlyZXQgPSB2OWZzX211eF9ycGModjlzZXMtPm11eCwgdGMsICZyYyk7CisJZWxzZQorCQlyZXQgPSBQVFJfRVJSKHRjKTsKKworCWlmIChyZXQpCisJCWRwcmludGsoREVCVUdfRVJST1IsICJmYWlsZWQgZmlkICVkIGVyciAlZFxuIiwgZmlkLCByZXQpOworCisJdjlmc190X2NsdW5rX2NiKHY5c2VzLCB0YywgcmMsIHJldCk7CisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC0xMTQsMTQgKzE1NiwyMSBAQAogICoKICAqLwogCi1pbnQgdjlmc190X2ZsdXNoKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUxNiB0YWcpCitpbnQgdjlmc190X2ZsdXNoKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUxNiBvbGR0YWcpCiB7Ci0Jc3RydWN0IHY5ZnNfZmNhbGwgbXNnOworCWludCByZXQ7CisJc3RydWN0IHY5ZnNfZmNhbGwgKnRjOwogCi0JZHByaW50ayhERUJVR185UCwgIm9sZHRhZyAlZFxuIiwgdGFnKTsKLQltc2cuaWQgPSBURkxVU0g7Ci0JbXNnLnBhcmFtcy50Zmx1c2gub2xkdGFnID0gdGFnOwotCXJldHVybiB2OWZzX211eF9ycGModjlzZXMsICZtc2csIE5VTEwpOworCWRwcmludGsoREVCVUdfOVAsICJvbGR0YWcgJWRcbiIsIG9sZHRhZyk7CisKKwl0YyA9IHY5ZnNfY3JlYXRlX3RmbHVzaChvbGR0YWcpOworCWlmICghSVNfRVJSKHRjKSkgeworCQlyZXQgPSB2OWZzX211eF9ycGModjlzZXMtPm11eCwgdGMsIE5VTEwpOworCQlrZnJlZSh0Yyk7CisJfSBlbHNlCisJCXJldCA9IFBUUl9FUlIodGMpOworCisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC0xMzMsMTcgKzE4MiwyMiBAQAogICovCiAKIGludAotdjlmc190X3N0YXQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdTMyIGZpZCwgc3RydWN0IHY5ZnNfZmNhbGwgKipmY2FsbCkKK3Y5ZnNfdF9zdGF0KHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBmaWQsIHN0cnVjdCB2OWZzX2ZjYWxsICoqcmNwKQogewotCXN0cnVjdCB2OWZzX2ZjYWxsIG1zZzsKKwlpbnQgcmV0OworCXN0cnVjdCB2OWZzX2ZjYWxsICp0YzsKIAogCWRwcmludGsoREVCVUdfOVAsICJmaWQgJWRcbiIsIGZpZCk7Ci0JaWYgKGZjYWxsKQotCQkqZmNhbGwgPSBOVUxMOwogCi0JbXNnLmlkID0gVFNUQVQ7Ci0JbXNnLnBhcmFtcy50c3RhdC5maWQgPSBmaWQ7Ci0JcmV0dXJuIHY5ZnNfbXV4X3JwYyh2OXNlcywgJm1zZywgZmNhbGwpOworCXJldCA9IC1FTk9NRU07CisJdGMgPSB2OWZzX2NyZWF0ZV90c3RhdChmaWQpOworCWlmICghSVNfRVJSKHRjKSkgeworCQlyZXQgPSB2OWZzX211eF9ycGModjlzZXMtPm11eCwgdGMsIHJjcCk7CisJCWtmcmVlKHRjKTsKKwl9IGVsc2UKKwkJcmV0ID0gUFRSX0VSUih0Yyk7CisKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTE1NywxNiArMjExLDIxIEBACiAKIGludAogdjlmc190X3dzdGF0KHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBmaWQsCi0JICAgICBzdHJ1Y3Qgdjlmc19zdGF0ICpzdGF0LCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKmZjYWxsKQorCSAgICAgc3RydWN0IHY5ZnNfd3N0YXQgKndzdGF0LCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKnJjcCkKIHsKLQlzdHJ1Y3Qgdjlmc19mY2FsbCBtc2c7CisJaW50IHJldDsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqdGM7CiAKLQlkcHJpbnRrKERFQlVHXzlQLCAiZmlkICVkIGxlbmd0aCAlZFxuIiwgZmlkLCAoaW50KXN0YXQtPmxlbmd0aCk7Ci0JbXNnLmlkID0gVFdTVEFUOwotCW1zZy5wYXJhbXMudHdzdGF0LmZpZCA9IGZpZDsKLQltc2cucGFyYW1zLnR3c3RhdC5zdGF0ID0gc3RhdDsKKwlkcHJpbnRrKERFQlVHXzlQLCAiZmlkICVkXG4iLCBmaWQpOwogCi0JcmV0dXJuIHY5ZnNfbXV4X3JwYyh2OXNlcywgJm1zZywgZmNhbGwpOworCXRjID0gdjlmc19jcmVhdGVfdHdzdGF0KGZpZCwgd3N0YXQsIHY5c2VzLT5leHRlbmRlZCk7CisJaWYgKCFJU19FUlIodGMpKSB7CisJCXJldCA9IHY5ZnNfbXV4X3JwYyh2OXNlcy0+bXV4LCB0YywgcmNwKTsKKwkJa2ZyZWUodGMpOworCX0gZWxzZQorCQlyZXQgPSBQVFJfRVJSKHRjKTsKKworCXJldHVybiByZXQ7CiB9CiAKIC8qKgpAQCAtMTgzLDIzICsyNDIsMjcgQEAKIAogaW50CiB2OWZzX3Rfd2FsayhzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MzIgZmlkLCB1MzIgbmV3ZmlkLAotCSAgICBjaGFyICpuYW1lLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKmZjYWxsKQorCSAgICBjaGFyICpuYW1lLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKnJjcCkKIHsKLQlzdHJ1Y3Qgdjlmc19mY2FsbCBtc2c7CisJaW50IHJldDsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqdGM7CisJaW50IG53bmFtZTsKIAogCWRwcmludGsoREVCVUdfOVAsICJmaWQgJWQgbmV3ZmlkICVkIHduYW1lICclcydcbiIsIGZpZCwgbmV3ZmlkLCBuYW1lKTsKLQltc2cuaWQgPSBUV0FMSzsKLQltc2cucGFyYW1zLnR3YWxrLmZpZCA9IGZpZDsKLQltc2cucGFyYW1zLnR3YWxrLm5ld2ZpZCA9IG5ld2ZpZDsKIAotCWlmIChuYW1lKSB7Ci0JCW1zZy5wYXJhbXMudHdhbGsubnduYW1lID0gMTsKLQkJbXNnLnBhcmFtcy50d2Fsay53bmFtZXMgPSAmbmFtZTsKLQl9IGVsc2UgewotCQltc2cucGFyYW1zLnR3YWxrLm53bmFtZSA9IDA7Ci0JfQorCWlmIChuYW1lKQorCQlud25hbWUgPSAxOworCWVsc2UKKwkJbnduYW1lID0gMDsKIAotCXJldHVybiB2OWZzX211eF9ycGModjlzZXMsICZtc2csIGZjYWxsKTsKKwl0YyA9IHY5ZnNfY3JlYXRlX3R3YWxrKGZpZCwgbmV3ZmlkLCBud25hbWUsICZuYW1lKTsKKwlpZiAoIUlTX0VSUih0YykpIHsKKwkJcmV0ID0gdjlmc19tdXhfcnBjKHY5c2VzLT5tdXgsIHRjLCByY3ApOworCQlrZnJlZSh0Yyk7CisJfSBlbHNlCisJCXJldCA9IFBUUl9FUlIodGMpOworCisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC0yMTQsMTkgKzI3NywyMSBAQAogCiBpbnQKIHY5ZnNfdF9vcGVuKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBmaWQsIHU4IG1vZGUsCi0JICAgIHN0cnVjdCB2OWZzX2ZjYWxsICoqZmNhbGwpCisJICAgIHN0cnVjdCB2OWZzX2ZjYWxsICoqcmNwKQogewotCXN0cnVjdCB2OWZzX2ZjYWxsIG1zZzsKLQlsb25nIGVycm9ybm8gPSAtMTsKKwlpbnQgcmV0OworCXN0cnVjdCB2OWZzX2ZjYWxsICp0YzsKIAogCWRwcmludGsoREVCVUdfOVAsICJmaWQgJWQgbW9kZSAlZFxuIiwgZmlkLCBtb2RlKTsKLQltc2cuaWQgPSBUT1BFTjsKLQltc2cucGFyYW1zLnRvcGVuLmZpZCA9IGZpZDsKLQltc2cucGFyYW1zLnRvcGVuLm1vZGUgPSBtb2RlOwogCi0JZXJyb3JubyA9IHY5ZnNfbXV4X3JwYyh2OXNlcywgJm1zZywgZmNhbGwpOworCXRjID0gdjlmc19jcmVhdGVfdG9wZW4oZmlkLCBtb2RlKTsKKwlpZiAoIUlTX0VSUih0YykpIHsKKwkJcmV0ID0gdjlmc19tdXhfcnBjKHY5c2VzLT5tdXgsIHRjLCByY3ApOworCQlrZnJlZSh0Yyk7CisJfSBlbHNlCisJCXJldCA9IFBUUl9FUlIodGMpOwogCi0JcmV0dXJuIGVycm9ybm87CisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC0yMzksMTQgKzMwNCwyMSBAQAogCiBpbnQKIHY5ZnNfdF9yZW1vdmUoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdTMyIGZpZCwKLQkgICAgICBzdHJ1Y3Qgdjlmc19mY2FsbCAqKmZjYWxsKQorCSAgICAgIHN0cnVjdCB2OWZzX2ZjYWxsICoqcmNwKQogewotCXN0cnVjdCB2OWZzX2ZjYWxsIG1zZzsKKwlpbnQgcmV0OworCXN0cnVjdCB2OWZzX2ZjYWxsICp0YzsKIAogCWRwcmludGsoREVCVUdfOVAsICJmaWQgJWRcbiIsIGZpZCk7Ci0JbXNnLmlkID0gVFJFTU9WRTsKLQltc2cucGFyYW1zLnRyZW1vdmUuZmlkID0gZmlkOwotCXJldHVybiB2OWZzX211eF9ycGModjlzZXMsICZtc2csIGZjYWxsKTsKKworCXRjID0gdjlmc19jcmVhdGVfdHJlbW92ZShmaWQpOworCWlmICghSVNfRVJSKHRjKSkgeworCQlyZXQgPSB2OWZzX211eF9ycGModjlzZXMtPm11eCwgdGMsIHJjcCk7CisJCWtmcmVlKHRjKTsKKwl9IGVsc2UKKwkJcmV0ID0gUFRSX0VSUih0Yyk7CisKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTI2MiwyMCArMzM0LDIyIEBACiAKIGludAogdjlmc190X2NyZWF0ZShzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MzIgZmlkLCBjaGFyICpuYW1lLAotCSAgICAgIHUzMiBwZXJtLCB1OCBtb2RlLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKmZjYWxsKQorCSAgICAgIHUzMiBwZXJtLCB1OCBtb2RlLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKnJjcCkKIHsKLQlzdHJ1Y3Qgdjlmc19mY2FsbCBtc2c7CisJaW50IHJldDsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqdGM7CiAKIAlkcHJpbnRrKERFQlVHXzlQLCAiZmlkICVkIG5hbWUgJyVzJyBwZXJtICV4IG1vZGUgJWRcbiIsCiAJCWZpZCwgbmFtZSwgcGVybSwgbW9kZSk7CiAKLQltc2cuaWQgPSBUQ1JFQVRFOwotCW1zZy5wYXJhbXMudGNyZWF0ZS5maWQgPSBmaWQ7Ci0JbXNnLnBhcmFtcy50Y3JlYXRlLm5hbWUgPSBuYW1lOwotCW1zZy5wYXJhbXMudGNyZWF0ZS5wZXJtID0gcGVybTsKLQltc2cucGFyYW1zLnRjcmVhdGUubW9kZSA9IG1vZGU7CisJdGMgPSB2OWZzX2NyZWF0ZV90Y3JlYXRlKGZpZCwgbmFtZSwgcGVybSwgbW9kZSk7CisJaWYgKCFJU19FUlIodGMpKSB7CisJCXJldCA9IHY5ZnNfbXV4X3JwYyh2OXNlcy0+bXV4LCB0YywgcmNwKTsKKwkJa2ZyZWUodGMpOworCX0gZWxzZQorCQlyZXQgPSBQVFJfRVJSKHRjKTsKIAotCXJldHVybiB2OWZzX211eF9ycGModjlzZXMsICZtc2csIGZjYWxsKTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTI5MCwzMSArMzY0LDI5IEBACiAKIGludAogdjlmc190X3JlYWQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdTMyIGZpZCwgdTY0IG9mZnNldCwKLQkgICAgdTMyIGNvdW50LCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKmZjYWxsKQorCSAgICB1MzIgY291bnQsIHN0cnVjdCB2OWZzX2ZjYWxsICoqcmNwKQogewotCXN0cnVjdCB2OWZzX2ZjYWxsIG1zZzsKLQlzdHJ1Y3Qgdjlmc19mY2FsbCAqcmMgPSBOVUxMOwotCWxvbmcgZXJyb3JubyA9IC0xOworCWludCByZXQ7CisJc3RydWN0IHY5ZnNfZmNhbGwgKnRjLCAqcmM7CiAKLQlkcHJpbnRrKERFQlVHXzlQLCAiZmlkICVkIG9mZnNldCAweCVseCBjb3VudCAweCV4XG4iLCBmaWQsCi0JCShsb25nIHVuc2lnbmVkIGludClvZmZzZXQsIGNvdW50KTsKLQltc2cuaWQgPSBUUkVBRDsKLQltc2cucGFyYW1zLnRyZWFkLmZpZCA9IGZpZDsKLQltc2cucGFyYW1zLnRyZWFkLm9mZnNldCA9IG9mZnNldDsKLQltc2cucGFyYW1zLnRyZWFkLmNvdW50ID0gY291bnQ7Ci0JZXJyb3JubyA9IHY5ZnNfbXV4X3JwYyh2OXNlcywgJm1zZywgJnJjKTsKKwlkcHJpbnRrKERFQlVHXzlQLCAiZmlkICVkIG9mZnNldCAweCVsbHV4IGNvdW50IDB4JXhcbiIsIGZpZCwKKwkJKGxvbmcgbG9uZyB1bnNpZ25lZCkgb2Zmc2V0LCBjb3VudCk7CiAKLQlpZiAoIWVycm9ybm8pIHsKLQkJZXJyb3JubyA9IHJjLT5wYXJhbXMucnJlYWQuY291bnQ7Ci0JCWR1bXBfZGF0YShyYy0+cGFyYW1zLnJyZWFkLmRhdGEsIHJjLT5wYXJhbXMucnJlYWQuY291bnQpOwotCX0KKwl0YyA9IHY5ZnNfY3JlYXRlX3RyZWFkKGZpZCwgb2Zmc2V0LCBjb3VudCk7CisJaWYgKCFJU19FUlIodGMpKSB7CisJCXJldCA9IHY5ZnNfbXV4X3JwYyh2OXNlcy0+bXV4LCB0YywgJnJjKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSByYy0+cGFyYW1zLnJyZWFkLmNvdW50OworCQlpZiAocmNwKQorCQkJKnJjcCA9IHJjOworCQllbHNlCisJCQlrZnJlZShyYyk7CiAKLQlpZiAoZmNhbGwpCi0JCSpmY2FsbCA9IHJjOwotCWVsc2UKLQkJa2ZyZWUocmMpOworCQlrZnJlZSh0Yyk7CisJfSBlbHNlCisJCXJldCA9IFBUUl9FUlIodGMpOwogCi0JcmV0dXJuIGVycm9ybm87CisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC0zMjgsMzIgKzQwMCwzMCBAQAogICovCiAKIGludAotdjlmc190X3dyaXRlKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBmaWQsCi0JICAgICB1NjQgb2Zmc2V0LCB1MzIgY291bnQsIHZvaWQgKmRhdGEsIHN0cnVjdCB2OWZzX2ZjYWxsICoqZmNhbGwpCit2OWZzX3Rfd3JpdGUoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdTMyIGZpZCwgdTY0IG9mZnNldCwgdTMyIGNvdW50LAorCWNvbnN0IGNoYXIgX191c2VyICpkYXRhLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKnJjcCkKIHsKLQlzdHJ1Y3Qgdjlmc19mY2FsbCBtc2c7Ci0Jc3RydWN0IHY5ZnNfZmNhbGwgKnJjID0gTlVMTDsKLQlsb25nIGVycm9ybm8gPSAtMTsKKwlpbnQgcmV0OworCXN0cnVjdCB2OWZzX2ZjYWxsICp0YywgKnJjOwogCi0JZHByaW50ayhERUJVR185UCwgImZpZCAlZCBvZmZzZXQgMHglbGx4IGNvdW50IDB4JXhcbiIsIGZpZCwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylvZmZzZXQsIGNvdW50KTsKLQlkdW1wX2RhdGEoZGF0YSwgY291bnQpOworCWRwcmludGsoREVCVUdfOVAsICJmaWQgJWQgb2Zmc2V0IDB4JWxsdXggY291bnQgMHgleFxuIiwgZmlkLAorCQkobG9uZyBsb25nIHVuc2lnbmVkKSBvZmZzZXQsIGNvdW50KTsKIAotCW1zZy5pZCA9IFRXUklURTsKLQltc2cucGFyYW1zLnR3cml0ZS5maWQgPSBmaWQ7Ci0JbXNnLnBhcmFtcy50d3JpdGUub2Zmc2V0ID0gb2Zmc2V0OwotCW1zZy5wYXJhbXMudHdyaXRlLmNvdW50ID0gY291bnQ7Ci0JbXNnLnBhcmFtcy50d3JpdGUuZGF0YSA9IGRhdGE7CisJdGMgPSB2OWZzX2NyZWF0ZV90d3JpdGUoZmlkLCBvZmZzZXQsIGNvdW50LCBkYXRhKTsKKwlpZiAoIUlTX0VSUih0YykpIHsKKwkJcmV0ID0gdjlmc19tdXhfcnBjKHY5c2VzLT5tdXgsIHRjLCAmcmMpOwogCi0JZXJyb3JubyA9IHY5ZnNfbXV4X3JwYyh2OXNlcywgJm1zZywgJnJjKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSByYy0+cGFyYW1zLnJ3cml0ZS5jb3VudDsKKwkJaWYgKHJjcCkKKwkJCSpyY3AgPSByYzsKKwkJZWxzZQorCQkJa2ZyZWUocmMpOwogCi0JaWYgKCFlcnJvcm5vKQotCQllcnJvcm5vID0gcmMtPnBhcmFtcy5yd3JpdGUuY291bnQ7CisJCWtmcmVlKHRjKTsKKwl9IGVsc2UKKwkJcmV0ID0gUFRSX0VSUih0Yyk7CiAKLQlpZiAoZmNhbGwpCi0JCSpmY2FsbCA9IHJjOwotCWVsc2UKLQkJa2ZyZWUocmMpOwotCi0JcmV0dXJuIGVycm9ybm87CisJcmV0dXJuIHJldDsKIH0KKwpkaWZmIC0tZ2l0IGEvZnMvOXAvOXAuaCBiL2ZzLzlwLzlwLmgKaW5kZXggZjU1NDI0Mi4uMGNkMzc0ZCAxMDA2NDQKLS0tIGEvZnMvOXAvOXAuaAorKysgYi9mcy85cC85cC5oCkBAIC0zLDYgKzMsNyBAQAogICoKICAqIDlQIHByb3RvY29sIGRlZmluaXRpb25zLgogICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgYnkgTGF0Y2hlc2FyIElvbmtvdiA8bHVjaG9AaW9ua292Lm5ldD4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgUm9uIE1pbm5pY2ggPHJtaW5uaWNoQGxhbmwuZ292PgogICoKQEAgLTEwMCw5ICsxMDEsMTggQEAKIAlWOUZTX1FURklMRSA9IDB4MDAsCiB9OwogCisjZGVmaW5lIFY5RlNfTk9UQUcJKHUxNikofjApCisjZGVmaW5lIFY5RlNfTk9GSUQJKHUzMikofjApCisjZGVmaW5lIFY5RlNfTUFYV0VMRU0JMTYKKwogLyogYW1wbGUgcm9vbSBmb3IgVHdyaXRlL1JyZWFkIGhlYWRlciAoaW91bml0KSAqLwogI2RlZmluZSBWOUZTX0lPSERSU1oJMjQKIAorc3RydWN0IHY5ZnNfc3RyIHsKKwl1MTYgbGVuOworCWNoYXIgKnN0cjsKK307CisKIC8qIHFpZHMgYXJlIHRoZSB1bmlxdWUgSUQgZm9yIGEgZmlsZSAobGlrZSBhbiBpbm9kZSAqLwogc3RydWN0IHY5ZnNfcWlkIHsKIAl1OCB0eXBlOwpAQCAtMTIwLDYgKzEzMCwyOSBAQAogCXUzMiBhdGltZTsKIAl1MzIgbXRpbWU7CiAJdTY0IGxlbmd0aDsKKwlzdHJ1Y3Qgdjlmc19zdHIgbmFtZTsKKwlzdHJ1Y3Qgdjlmc19zdHIgdWlkOworCXN0cnVjdCB2OWZzX3N0ciBnaWQ7CisJc3RydWN0IHY5ZnNfc3RyIG11aWQ7CisJc3RydWN0IHY5ZnNfc3RyIGV4dGVuc2lvbjsJLyogOXAyMDAwLnUgZXh0ZW5zaW9ucyAqLworCXUzMiBuX3VpZDsJCS8qIDlwMjAwMC51IGV4dGVuc2lvbnMgKi8KKwl1MzIgbl9naWQ7CQkvKiA5cDIwMDAudSBleHRlbnNpb25zICovCisJdTMyIG5fbXVpZDsJCS8qIDlwMjAwMC51IGV4dGVuc2lvbnMgKi8KK307CisKKy8qIGZpbGUgbWV0YWRhdGEgKHN0YXQpIHN0cnVjdHVyZSB1c2VkIHRvIGNyZWF0ZSBUd3N0YXQgbWVzc2FnZQorICAgVGhlIGlzIHNpbWlsYXIgdG8gdjlmc19zdGF0LCBidXQgdGhlIHN0cmluZ3MgZG9uJ3QgcG9pbnQgdG8KKyAgIHRoZSBzYW1lIG1lbW9yeSBibG9jayBhbmQgc2hvdWxkIGJlIGZyZWVkIHNlcGFyYXRlbHkKKyovCitzdHJ1Y3Qgdjlmc193c3RhdCB7CisJdTE2IHNpemU7CisJdTE2IHR5cGU7CisJdTMyIGRldjsKKwlzdHJ1Y3Qgdjlmc19xaWQgcWlkOworCXUzMiBtb2RlOworCXUzMiBhdGltZTsKKwl1MzIgbXRpbWU7CisJdTY0IGxlbmd0aDsKIAljaGFyICpuYW1lOwogCWNoYXIgKnVpZDsKIAljaGFyICpnaWQ7CkBAIC0xMjgsMjUgKzE2MSwyNCBAQAogCXUzMiBuX3VpZDsJCS8qIDlwMjAwMC51IGV4dGVuc2lvbnMgKi8KIAl1MzIgbl9naWQ7CQkvKiA5cDIwMDAudSBleHRlbnNpb25zICovCiAJdTMyIG5fbXVpZDsJCS8qIDlwMjAwMC51IGV4dGVuc2lvbnMgKi8KLQljaGFyIGRhdGFbMF07CiB9OwogCiAvKiBTdHJ1Y3R1cmVzIGZvciBQcm90b2NvbCBPcGVyYXRpb25zICovCiAKIHN0cnVjdCBUdmVyc2lvbiB7CiAJdTMyIG1zaXplOwotCWNoYXIgKnZlcnNpb247CisJc3RydWN0IHY5ZnNfc3RyIHZlcnNpb247CiB9OwogCiBzdHJ1Y3QgUnZlcnNpb24gewogCXUzMiBtc2l6ZTsKLQljaGFyICp2ZXJzaW9uOworCXN0cnVjdCB2OWZzX3N0ciB2ZXJzaW9uOwogfTsKIAogc3RydWN0IFRhdXRoIHsKIAl1MzIgYWZpZDsKLQljaGFyICp1bmFtZTsKLQljaGFyICphbmFtZTsKKwlzdHJ1Y3Qgdjlmc19zdHIgdW5hbWU7CisJc3RydWN0IHY5ZnNfc3RyIGFuYW1lOwogfTsKIAogc3RydWN0IFJhdXRoIHsKQEAgLTE1NCwxMiArMTg2LDEyIEBACiB9OwogCiBzdHJ1Y3QgUmVycm9yIHsKLQljaGFyICplcnJvcjsKKwlzdHJ1Y3Qgdjlmc19zdHIgZXJyb3I7CiAJdTMyIGVycm5vOwkJLyogOXAyMDAwLnUgZXh0ZW5zaW9uICovCiB9OwogCiBzdHJ1Y3QgVGZsdXNoIHsKLQl1MzIgb2xkdGFnOworCXUxNiBvbGR0YWc7CiB9OwogCiBzdHJ1Y3QgUmZsdXNoIHsKQEAgLTE2OCw4ICsyMDAsOCBAQAogc3RydWN0IFRhdHRhY2ggewogCXUzMiBmaWQ7CiAJdTMyIGFmaWQ7Ci0JY2hhciAqdW5hbWU7Ci0JY2hhciAqYW5hbWU7CisJc3RydWN0IHY5ZnNfc3RyIHVuYW1lOworCXN0cnVjdCB2OWZzX3N0ciBhbmFtZTsKIH07CiAKIHN0cnVjdCBSYXR0YWNoIHsKQEAgLTE3OSwxMyArMjExLDEzIEBACiBzdHJ1Y3QgVHdhbGsgewogCXUzMiBmaWQ7CiAJdTMyIG5ld2ZpZDsKLQl1MzIgbnduYW1lOwotCWNoYXIgKip3bmFtZXM7CisJdTE2IG53bmFtZTsKKwlzdHJ1Y3Qgdjlmc19zdHIgd25hbWVzWzE2XTsKIH07CiAKIHN0cnVjdCBSd2FsayB7Ci0JdTMyIG53cWlkOwotCXN0cnVjdCB2OWZzX3FpZCAqd3FpZHM7CisJdTE2IG53cWlkOworCXN0cnVjdCB2OWZzX3FpZCB3cWlkc1sxNl07CiB9OwogCiBzdHJ1Y3QgVG9wZW4gewpAQCAtMjAwLDcgKzIzMiw3IEBACiAKIHN0cnVjdCBUY3JlYXRlIHsKIAl1MzIgZmlkOwotCWNoYXIgKm5hbWU7CisJc3RydWN0IHY5ZnNfc3RyIG5hbWU7CiAJdTMyIHBlcm07CiAJdTggbW9kZTsKIH07CkBAIC0yNTEsMTIgKzI4MywxMiBAQAogfTsKIAogc3RydWN0IFJzdGF0IHsKLQlzdHJ1Y3Qgdjlmc19zdGF0ICpzdGF0OworCXN0cnVjdCB2OWZzX3N0YXQgc3RhdDsKIH07CiAKIHN0cnVjdCBUd3N0YXQgewogCXUzMiBmaWQ7Ci0Jc3RydWN0IHY5ZnNfc3RhdCAqc3RhdDsKKwlzdHJ1Y3Qgdjlmc19zdGF0IHN0YXQ7CiB9OwogCiBzdHJ1Y3QgUndzdGF0IHsKQEAgLTI3MSw2ICszMDMsNyBAQAogCXUzMiBzaXplOwogCXU4IGlkOwogCXUxNiB0YWc7CisJdm9pZCAqc2RhdGE7CiAKIAl1bmlvbiB7CiAJCXN0cnVjdCBUdmVyc2lvbiB0dmVyc2lvbjsKQEAgLTMwMyw3ICszMzYsOSBAQAogCX0gcGFyYW1zOwogfTsKIAotI2RlZmluZSBGQ0FMTF9FUlJPUihmY2FsbCkgKGZjYWxsID8gZmNhbGwtPnBhcmFtcy5yZXJyb3IuZXJyb3IgOiAiIikKKyNkZWZpbmUgUFJJTlRfRkNBTExfRVJST1IocywgZmNhbGwpIGRwcmludGsoREVCVUdfRVJST1IsICIlczogJS4qc1xuIiwgcywgXAorCWZjYWxsP2ZjYWxsLT5wYXJhbXMucmVycm9yLmVycm9yLmxlbjowLCBcCisJZmNhbGw/ZmNhbGwtPnBhcmFtcy5yZXJyb3IuZXJyb3Iuc3RyOiIiKTsKIAogaW50IHY5ZnNfdF92ZXJzaW9uKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBtc2l6ZSwKIAkJICAgY2hhciAqdmVyc2lvbiwgc3RydWN0IHY5ZnNfZmNhbGwgKipyY2FsbCk7CkBAIC0zMTEsOCArMzQ2LDcgQEAKIGludCB2OWZzX3RfYXR0YWNoKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIGNoYXIgKnVuYW1lLCBjaGFyICphbmFtZSwKIAkJICB1MzIgZmlkLCB1MzIgYWZpZCwgc3RydWN0IHY5ZnNfZmNhbGwgKipyY2FsbCk7CiAKLWludCB2OWZzX3RfY2x1bmsoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdTMyIGZpZCwKLQkJIHN0cnVjdCB2OWZzX2ZjYWxsICoqcmNhbGwpOworaW50IHY5ZnNfdF9jbHVuayhzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MzIgZmlkKTsKIAogaW50IHY5ZnNfdF9mbHVzaChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MTYgb2xkdGFnKTsKIApAQCAtMzIwLDcgKzM1NCw3IEBACiAJCXN0cnVjdCB2OWZzX2ZjYWxsICoqcmNhbGwpOwogCiBpbnQgdjlmc190X3dzdGF0KHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBmaWQsCi0JCSBzdHJ1Y3Qgdjlmc19zdGF0ICpzdGF0LCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKnJjYWxsKTsKKwkJIHN0cnVjdCB2OWZzX3dzdGF0ICp3c3RhdCwgc3RydWN0IHY5ZnNfZmNhbGwgKipyY2FsbCk7CiAKIGludCB2OWZzX3Rfd2FsayhzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCB1MzIgZmlkLCB1MzIgbmV3ZmlkLAogCQljaGFyICpuYW1lLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKnJjYWxsKTsKQEAgLTMzOCw0ICszNzIsNSBAQAogCQl1NjQgb2Zmc2V0LCB1MzIgY291bnQsIHN0cnVjdCB2OWZzX2ZjYWxsICoqcmNhbGwpOwogCiBpbnQgdjlmc190X3dyaXRlKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBmaWQsIHU2NCBvZmZzZXQsCi0JCSB1MzIgY291bnQsIHZvaWQgKmRhdGEsIHN0cnVjdCB2OWZzX2ZjYWxsICoqcmNhbGwpOworCQkgdTMyIGNvdW50LCBjb25zdCBjaGFyIF9fdXNlciAqIGRhdGEsCisJCSBzdHJ1Y3Qgdjlmc19mY2FsbCAqKnJjYWxsKTsKZGlmZiAtLWdpdCBhL2ZzLzlwL01ha2VmaWxlIGIvZnMvOXAvTWFrZWZpbGUKaW5kZXggZTRlNGZmZS4uMmY0Y2U0MyAxMDA2NDQKLS0tIGEvZnMvOXAvTWFrZWZpbGUKKysrIGIvZnMvOXAvTWFrZWZpbGUKQEAgLTEsMTcgKzEsMTggQEAKIG9iai0kKENPTkZJR185UF9GUykgOj0gOXAyMDAwLm8KIAogOXAyMDAwLW9ianMgOj0gXAorCXRyYW5zX2ZkLm8gXAorCXRyYW5zX3NvY2subyBcCisJbXV4Lm8gXAorCTlwLm8gXAorCWNvbnYubyBcCiAJdmZzX3N1cGVyLm8gXAogCXZmc19pbm9kZS5vIFwKKwl2ZnNfYWRkci5vIFwKIAl2ZnNfZmlsZS5vIFwKIAl2ZnNfZGlyLm8gXAogCXZmc19kZW50cnkubyBcCiAJZXJyb3IubyBcCi0JbXV4Lm8gXAotCXRyYW5zX2ZkLm8gXAotCXRyYW5zX3NvY2subyBcCi0JOXAubyBcCi0JY29udi5vIFwKIAl2OWZzLm8gXAogCWZpZC5vCiAKZGlmZiAtLWdpdCBhL2ZzLzlwL2NvbnYuYyBiL2ZzLzlwL2NvbnYuYwppbmRleCAxODEyMWFmLi4zMmE5Zjk5IDEwMDY0NAotLS0gYS9mcy85cC9jb252LmMKKysrIGIvZnMvOXAvY29udi5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgotCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInY5ZnMuaCIKICNpbmNsdWRlICI5cC5oIgpAQCAtNTYsMjAgKzU2LDIzIEBACiAJcmV0dXJuIGJ1Zi0+cCA+IGJ1Zi0+ZXA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGJ1Zl9jaGVja19zaXplKHN0cnVjdCBjYnVmICpidWYsIGludCBsZW4pCitzdGF0aWMgaW50IGJ1Zl9jaGVja19zaXplKHN0cnVjdCBjYnVmICpidWYsIGludCBsZW4pCiB7Ci0JaWYgKGJ1Zi0+cCtsZW4gPiBidWYtPmVwKSB7CisJaWYgKGJ1Zi0+cCArIGxlbiA+IGJ1Zi0+ZXApIHsKIAkJaWYgKGJ1Zi0+cCA8IGJ1Zi0+ZXApIHsKLQkJCWVwcmludGsoS0VSTl9FUlIsICJidWZmZXIgb3ZlcmZsb3dcbiIpOworCQkJZXByaW50ayhLRVJOX0VSUiwgImJ1ZmZlciBvdmVyZmxvdzogd2FudCAlZCBoYXMgJWRcbiIsCisJCQkJbGVuLCAoaW50KShidWYtPmVwIC0gYnVmLT5wKSk7CisJCQlkdW1wX3N0YWNrKCk7CiAJCQlidWYtPnAgPSBidWYtPmVwICsgMTsKLQkJCXJldHVybiAwOwogCQl9CisKKwkJcmV0dXJuIDA7CiAJfQogCiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqYnVmX2FsbG9jKHN0cnVjdCBjYnVmICpidWYsIGludCBsZW4pCitzdGF0aWMgdm9pZCAqYnVmX2FsbG9jKHN0cnVjdCBjYnVmICpidWYsIGludCBsZW4pCiB7CiAJdm9pZCAqcmV0ID0gTlVMTDsKIApAQCAtODEsNyArODQsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBidWZfcHV0X2ludDgoc3RydWN0IGNidWYgKmJ1ZiwgdTggdmFsKQorc3RhdGljIHZvaWQgYnVmX3B1dF9pbnQ4KHN0cnVjdCBjYnVmICpidWYsIHU4IHZhbCkKIHsKIAlpZiAoYnVmX2NoZWNrX3NpemUoYnVmLCAxKSkgewogCQlidWYtPnBbMF0gPSB2YWw7CkBAIC04OSw3ICs5Miw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYnVmX3B1dF9pbnQxNihzdHJ1Y3QgY2J1ZiAqYnVmLCB1MTYgdmFsKQorc3RhdGljIHZvaWQgYnVmX3B1dF9pbnQxNihzdHJ1Y3QgY2J1ZiAqYnVmLCB1MTYgdmFsKQogewogCWlmIChidWZfY2hlY2tfc2l6ZShidWYsIDIpKSB7CiAJCSooX19sZTE2ICopIGJ1Zi0+cCA9IGNwdV90b19sZTE2KHZhbCk7CkBAIC05Nyw3ICsxMDAsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGJ1Zl9wdXRfaW50MzIoc3RydWN0IGNidWYgKmJ1ZiwgdTMyIHZhbCkKK3N0YXRpYyB2b2lkIGJ1Zl9wdXRfaW50MzIoc3RydWN0IGNidWYgKmJ1ZiwgdTMyIHZhbCkKIHsKIAlpZiAoYnVmX2NoZWNrX3NpemUoYnVmLCA0KSkgewogCQkqKF9fbGUzMiAqKWJ1Zi0+cCA9IGNwdV90b19sZTMyKHZhbCk7CkBAIC0xMDUsNyArMTA4LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBidWZfcHV0X2ludDY0KHN0cnVjdCBjYnVmICpidWYsIHU2NCB2YWwpCitzdGF0aWMgdm9pZCBidWZfcHV0X2ludDY0KHN0cnVjdCBjYnVmICpidWYsIHU2NCB2YWwpCiB7CiAJaWYgKGJ1Zl9jaGVja19zaXplKGJ1ZiwgOCkpIHsKIAkJKihfX2xlNjQgKilidWYtPnAgPSBjcHVfdG9fbGU2NCh2YWwpOwpAQCAtMTEzLDcgKzExNiw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYnVmX3B1dF9zdHJpbmduKHN0cnVjdCBjYnVmICpidWYsIGNvbnN0IGNoYXIgKnMsIHUxNiBzbGVuKQorc3RhdGljIHZvaWQgYnVmX3B1dF9zdHJpbmduKHN0cnVjdCBjYnVmICpidWYsIGNvbnN0IGNoYXIgKnMsIHUxNiBzbGVuKQogewogCWlmIChidWZfY2hlY2tfc2l6ZShidWYsIHNsZW4gKyAyKSkgewogCQlidWZfcHV0X2ludDE2KGJ1Ziwgc2xlbik7CkBAIC0xMjcsMTUgKzEzMCw3IEBACiAJYnVmX3B1dF9zdHJpbmduKGJ1Ziwgcywgc3RybGVuKHMpKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGJ1Zl9wdXRfZGF0YShzdHJ1Y3QgY2J1ZiAqYnVmLCB2b2lkICpkYXRhLCB1MzIgZGF0YWxlbikKLXsKLQlpZiAoYnVmX2NoZWNrX3NpemUoYnVmLCBkYXRhbGVuKSkgewotCQltZW1jcHkoYnVmLT5wLCBkYXRhLCBkYXRhbGVuKTsKLQkJYnVmLT5wICs9IGRhdGFsZW47Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHU4IGJ1Zl9nZXRfaW50OChzdHJ1Y3QgY2J1ZiAqYnVmKQorc3RhdGljIHU4IGJ1Zl9nZXRfaW50OChzdHJ1Y3QgY2J1ZiAqYnVmKQogewogCXU4IHJldCA9IDA7CiAKQEAgLTE0Nyw3ICsxNDIsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTE2IGJ1Zl9nZXRfaW50MTYoc3RydWN0IGNidWYgKmJ1ZikKK3N0YXRpYyB1MTYgYnVmX2dldF9pbnQxNihzdHJ1Y3QgY2J1ZiAqYnVmKQogewogCXUxNiByZXQgPSAwOwogCkBAIC0xNTksNyArMTU0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiBidWZfZ2V0X2ludDMyKHN0cnVjdCBjYnVmICpidWYpCitzdGF0aWMgdTMyIGJ1Zl9nZXRfaW50MzIoc3RydWN0IGNidWYgKmJ1ZikKIHsKIAl1MzIgcmV0ID0gMDsKIApAQCAtMTcxLDcgKzE2Niw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGlubGluZSB1NjQgYnVmX2dldF9pbnQ2NChzdHJ1Y3QgY2J1ZiAqYnVmKQorc3RhdGljIHU2NCBidWZfZ2V0X2ludDY0KHN0cnVjdCBjYnVmICpidWYpCiB7CiAJdTY0IHJldCA9IDA7CiAKQEAgLTE4Myw4NiArMTc4LDM3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLWJ1Zl9nZXRfc3RyaW5nKHN0cnVjdCBjYnVmICpidWYsIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQorc3RhdGljIHZvaWQgYnVmX2dldF9zdHIoc3RydWN0IGNidWYgKmJ1Ziwgc3RydWN0IHY5ZnNfc3RyICp2c3RyKQogewotCXUxNiBsZW4gPSAwOwotCi0JbGVuID0gYnVmX2dldF9pbnQxNihidWYpOwotCWlmICghYnVmX2NoZWNrX292ZXJmbG93KGJ1ZikgJiYgYnVmX2NoZWNrX3NpemUoYnVmLCBsZW4pICYmIGxlbisxPmRhdGFsZW4pIHsKLQkJbWVtY3B5KGRhdGEsIGJ1Zi0+cCwgbGVuKTsKLQkJZGF0YVtsZW5dID0gMDsKLQkJYnVmLT5wICs9IGxlbjsKLQkJbGVuKys7CisJdnN0ci0+bGVuID0gYnVmX2dldF9pbnQxNihidWYpOworCWlmICghYnVmX2NoZWNrX292ZXJmbG93KGJ1ZikgJiYgYnVmX2NoZWNrX3NpemUoYnVmLCB2c3RyLT5sZW4pKSB7CisJCXZzdHItPnN0ciA9IGJ1Zi0+cDsKKwkJYnVmLT5wICs9IHZzdHItPmxlbjsKKwl9IGVsc2UgeworCQl2c3RyLT5sZW4gPSAwOworCQl2c3RyLT5zdHIgPSBOVUxMOwogCX0KLQotCXJldHVybiBsZW47CiB9CiAKLXN0YXRpYyBpbmxpbmUgY2hhciAqYnVmX2dldF9zdHJpbmdiKHN0cnVjdCBjYnVmICpidWYsIHN0cnVjdCBjYnVmICpzYnVmKQorc3RhdGljIHZvaWQgYnVmX2dldF9xaWQoc3RydWN0IGNidWYgKmJ1ZnAsIHN0cnVjdCB2OWZzX3FpZCAqcWlkKQogewotCWNoYXIgKnJldDsKLQl1MTYgbGVuOwotCi0JcmV0ID0gTlVMTDsKLQlsZW4gPSBidWZfZ2V0X2ludDE2KGJ1Zik7Ci0KLQlpZiAoIWJ1Zl9jaGVja19vdmVyZmxvdyhidWYpICYmIGJ1Zl9jaGVja19zaXplKGJ1ZiwgbGVuKSAmJgotCQlidWZfY2hlY2tfc2l6ZShzYnVmLCBsZW4rMSkpIHsKLQotCQltZW1jcHkoc2J1Zi0+cCwgYnVmLT5wLCBsZW4pOwotCQlzYnVmLT5wW2xlbl0gPSAwOwotCQlyZXQgPSBzYnVmLT5wOwotCQlidWYtPnAgKz0gbGVuOwotCQlzYnVmLT5wICs9IGxlbiArIDE7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYnVmX2dldF9kYXRhKHN0cnVjdCBjYnVmICpidWYsIHZvaWQgKmRhdGEsIGludCBkYXRhbGVuKQotewotCWludCByZXQgPSAwOwotCi0JaWYgKGJ1Zl9jaGVja19zaXplKGJ1ZiwgZGF0YWxlbikpIHsKLQkJbWVtY3B5KGRhdGEsIGJ1Zi0+cCwgZGF0YWxlbik7Ci0JCWJ1Zi0+cCArPSBkYXRhbGVuOwotCQlyZXQgPSBkYXRhbGVuOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqYnVmX2dldF9kYXRhYihzdHJ1Y3QgY2J1ZiAqYnVmLCBzdHJ1Y3QgY2J1ZiAqZGJ1ZiwKLQkJCQkgIGludCBkYXRhbGVuKQotewotCWNoYXIgKnJldCA9IE5VTEw7Ci0JaW50IG4gPSAwOwotCi0JaWYgKGJ1Zl9jaGVja19zaXplKGRidWYsIGRhdGFsZW4pKSB7Ci0JCW4gPSBidWZfZ2V0X2RhdGEoYnVmLCBkYnVmLT5wLCBkYXRhbGVuKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlyZXQgPSBkYnVmLT5wOwotCQkJZGJ1Zi0+cCArPSBuOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKKwlxaWQtPnR5cGUgPSBidWZfZ2V0X2ludDgoYnVmcCk7CisJcWlkLT52ZXJzaW9uID0gYnVmX2dldF9pbnQzMihidWZwKTsKKwlxaWQtPnBhdGggPSBidWZfZ2V0X2ludDY0KGJ1ZnApOwogfQogCiAvKioKLSAqIHY5ZnNfc2l6ZV9zdGF0IC0gY2FsY3VsYXRlIHRoZSBzaXplIG9mIGEgdmFyaWFibGUgbGVuZ3RoIHN0YXQgc3RydWN0Ci0gKiBAdjlzZXM6IHNlc3Npb24gaW5mb3JtYXRpb24KKyAqIHY5ZnNfc2l6ZV93c3RhdCAtIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBhIHZhcmlhYmxlIGxlbmd0aCBzdGF0IHN0cnVjdAogICogQHN0YXQ6IG1ldGFkYXRhIChzdGF0KSBzdHJ1Y3R1cmUKKyAqIEBleHRlbmRlZDogbm9uLXplcm8gaWYgOVAyMDAwLnUKICAqCiAgKi8KIAotc3RhdGljIGludCB2OWZzX3NpemVfc3RhdChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLAotCQkJICBzdHJ1Y3Qgdjlmc19zdGF0ICpzdGF0KQorc3RhdGljIGludCB2OWZzX3NpemVfd3N0YXQoc3RydWN0IHY5ZnNfd3N0YXQgKndzdGF0LCBpbnQgZXh0ZW5kZWQpCiB7CiAJaW50IHNpemUgPSAwOwogCi0JaWYgKHN0YXQgPT0gTlVMTCkgeworCWlmICh3c3RhdCA9PSBOVUxMKSB7CiAJCWVwcmludGsoS0VSTl9FUlIsICJ2OWZzX3NpemVfc3RhdDogZ290IGEgTlVMTCBzdGF0IHBvaW50ZXJcbiIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yNzksODIgKzIyNSwzOCBAQAogCSAgICA4ICsJCQkvKiBsZW5ndGhbOF0gKi8KIAkgICAgODsJCQkvKiBtaW5pbXVtIHN1bSBvZiBzdHJpbmcgbGVuZ3RocyAqLwogCi0JaWYgKHN0YXQtPm5hbWUpCi0JCXNpemUgKz0gc3RybGVuKHN0YXQtPm5hbWUpOwotCWlmIChzdGF0LT51aWQpCi0JCXNpemUgKz0gc3RybGVuKHN0YXQtPnVpZCk7Ci0JaWYgKHN0YXQtPmdpZCkKLQkJc2l6ZSArPSBzdHJsZW4oc3RhdC0+Z2lkKTsKLQlpZiAoc3RhdC0+bXVpZCkKLQkJc2l6ZSArPSBzdHJsZW4oc3RhdC0+bXVpZCk7CisJaWYgKHdzdGF0LT5uYW1lKQorCQlzaXplICs9IHN0cmxlbih3c3RhdC0+bmFtZSk7CisJaWYgKHdzdGF0LT51aWQpCisJCXNpemUgKz0gc3RybGVuKHdzdGF0LT51aWQpOworCWlmICh3c3RhdC0+Z2lkKQorCQlzaXplICs9IHN0cmxlbih3c3RhdC0+Z2lkKTsKKwlpZiAod3N0YXQtPm11aWQpCisJCXNpemUgKz0gc3RybGVuKHdzdGF0LT5tdWlkKTsKIAotCWlmICh2OXNlcy0+ZXh0ZW5kZWQpIHsKKwlpZiAoZXh0ZW5kZWQpIHsKIAkJc2l6ZSArPSA0ICsJLyogbl91aWRbNF0gKi8KIAkJICAgIDQgKwkJLyogbl9naWRbNF0gKi8KIAkJICAgIDQgKwkJLyogbl9tdWlkWzRdICovCiAJCSAgICAyOwkJLyogc3RyaW5nIGxlbmd0aCBvZiBleHRlbnNpb25bNF0gKi8KLQkJaWYgKHN0YXQtPmV4dGVuc2lvbikKLQkJCXNpemUgKz0gc3RybGVuKHN0YXQtPmV4dGVuc2lvbik7CisJCWlmICh3c3RhdC0+ZXh0ZW5zaW9uKQorCQkJc2l6ZSArPSBzdHJsZW4od3N0YXQtPmV4dGVuc2lvbik7CiAJfQogCiAJcmV0dXJuIHNpemU7CiB9CiAKIC8qKgotICogc2VyaWFsaXplX3N0YXQgLSBzYWZlbHkgZm9ybWF0IGEgc3RhdCBzdHJ1Y3R1cmUgZm9yIHRyYW5zbWlzc2lvbgotICogQHY5c2VzOiBzZXNzaW9uIGluZm8KLSAqIEBzdGF0OiBtZXRhZGF0YSAoc3RhdCkgc3RydWN0dXJlCi0gKiBAYnVmcDogYnVmZmVyIHRvIHNlcmlhbGl6ZSBzdHJ1Y3R1cmUgaW50bwotICoKLSAqLwotCi1zdGF0aWMgaW50Ci1zZXJpYWxpemVfc3RhdChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBzdHJ1Y3Qgdjlmc19zdGF0ICpzdGF0LAotCSAgICAgICBzdHJ1Y3QgY2J1ZiAqYnVmcCkKLXsKLQlidWZfcHV0X2ludDE2KGJ1ZnAsIHN0YXQtPnNpemUpOwotCWJ1Zl9wdXRfaW50MTYoYnVmcCwgc3RhdC0+dHlwZSk7Ci0JYnVmX3B1dF9pbnQzMihidWZwLCBzdGF0LT5kZXYpOwotCWJ1Zl9wdXRfaW50OChidWZwLCBzdGF0LT5xaWQudHlwZSk7Ci0JYnVmX3B1dF9pbnQzMihidWZwLCBzdGF0LT5xaWQudmVyc2lvbik7Ci0JYnVmX3B1dF9pbnQ2NChidWZwLCBzdGF0LT5xaWQucGF0aCk7Ci0JYnVmX3B1dF9pbnQzMihidWZwLCBzdGF0LT5tb2RlKTsKLQlidWZfcHV0X2ludDMyKGJ1ZnAsIHN0YXQtPmF0aW1lKTsKLQlidWZfcHV0X2ludDMyKGJ1ZnAsIHN0YXQtPm10aW1lKTsKLQlidWZfcHV0X2ludDY0KGJ1ZnAsIHN0YXQtPmxlbmd0aCk7Ci0KLQlidWZfcHV0X3N0cmluZyhidWZwLCBzdGF0LT5uYW1lKTsKLQlidWZfcHV0X3N0cmluZyhidWZwLCBzdGF0LT51aWQpOwotCWJ1Zl9wdXRfc3RyaW5nKGJ1ZnAsIHN0YXQtPmdpZCk7Ci0JYnVmX3B1dF9zdHJpbmcoYnVmcCwgc3RhdC0+bXVpZCk7Ci0KLQlpZiAodjlzZXMtPmV4dGVuZGVkKSB7Ci0JCWJ1Zl9wdXRfc3RyaW5nKGJ1ZnAsIHN0YXQtPmV4dGVuc2lvbik7Ci0JCWJ1Zl9wdXRfaW50MzIoYnVmcCwgc3RhdC0+bl91aWQpOwotCQlidWZfcHV0X2ludDMyKGJ1ZnAsIHN0YXQtPm5fZ2lkKTsKLQkJYnVmX3B1dF9pbnQzMihidWZwLCBzdGF0LT5uX211aWQpOwotCX0KLQotCWlmIChidWZfY2hlY2tfb3ZlcmZsb3coYnVmcCkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIHN0YXQtPnNpemU7Ci19Ci0KLS8qKgotICogZGVzZXJpYWxpemVfc3RhdCAtIHNhZmVseSBkZWNvZGUgYSByZWNpZXZlZCBtZXRhZGF0YSAoc3RhdCkgc3RydWN0dXJlCi0gKiBAdjlzZXM6IHNlc3Npb24gaW5mbworICogYnVmX2dldF9zdGF0IC0gc2FmZWx5IGRlY29kZSBhIHJlY2lldmVkIG1ldGFkYXRhIChzdGF0KSBzdHJ1Y3R1cmUKICAqIEBidWZwOiBidWZmZXIgdG8gZGVzZXJpYWxpemUKICAqIEBzdGF0OiBtZXRhZGF0YSAoc3RhdCkgc3RydWN0dXJlCi0gKiBAZGJ1ZnA6IGJ1ZmZlciB0byBkZXNlcmlhbGl6ZSB2YXJpYWJsZSBzdHJpbmdzIGludG8KKyAqIEBleHRlbmRlZDogbm9uLXplcm8gaWYgOVAyMDAwLnUKICAqCiAgKi8KIAotc3RhdGljIGlubGluZSBpbnQKLWRlc2VyaWFsaXplX3N0YXQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgc3RydWN0IGNidWYgKmJ1ZnAsCi0JCSBzdHJ1Y3Qgdjlmc19zdGF0ICpzdGF0LCBzdHJ1Y3QgY2J1ZiAqZGJ1ZnApCitzdGF0aWMgdm9pZAorYnVmX2dldF9zdGF0KHN0cnVjdCBjYnVmICpidWZwLCBzdHJ1Y3Qgdjlmc19zdGF0ICpzdGF0LCBpbnQgZXh0ZW5kZWQpCiB7Ci0KIAlzdGF0LT5zaXplID0gYnVmX2dldF9pbnQxNihidWZwKTsKIAlzdGF0LT50eXBlID0gYnVmX2dldF9pbnQxNihidWZwKTsKIAlzdGF0LT5kZXYgPSBidWZfZ2V0X2ludDMyKGJ1ZnApOwpAQCAtMzY1LDI4MiArMjY3LDgyIEBACiAJc3RhdC0+YXRpbWUgPSBidWZfZ2V0X2ludDMyKGJ1ZnApOwogCXN0YXQtPm10aW1lID0gYnVmX2dldF9pbnQzMihidWZwKTsKIAlzdGF0LT5sZW5ndGggPSBidWZfZ2V0X2ludDY0KGJ1ZnApOwotCXN0YXQtPm5hbWUgPSBidWZfZ2V0X3N0cmluZ2IoYnVmcCwgZGJ1ZnApOwotCXN0YXQtPnVpZCA9IGJ1Zl9nZXRfc3RyaW5nYihidWZwLCBkYnVmcCk7Ci0Jc3RhdC0+Z2lkID0gYnVmX2dldF9zdHJpbmdiKGJ1ZnAsIGRidWZwKTsKLQlzdGF0LT5tdWlkID0gYnVmX2dldF9zdHJpbmdiKGJ1ZnAsIGRidWZwKTsKKwlidWZfZ2V0X3N0cihidWZwLCAmc3RhdC0+bmFtZSk7CisJYnVmX2dldF9zdHIoYnVmcCwgJnN0YXQtPnVpZCk7CisJYnVmX2dldF9zdHIoYnVmcCwgJnN0YXQtPmdpZCk7CisJYnVmX2dldF9zdHIoYnVmcCwgJnN0YXQtPm11aWQpOwogCi0JaWYgKHY5c2VzLT5leHRlbmRlZCkgewotCQlzdGF0LT5leHRlbnNpb24gPSBidWZfZ2V0X3N0cmluZ2IoYnVmcCwgZGJ1ZnApOworCWlmIChleHRlbmRlZCkgeworCQlidWZfZ2V0X3N0cihidWZwLCAmc3RhdC0+ZXh0ZW5zaW9uKTsKIAkJc3RhdC0+bl91aWQgPSBidWZfZ2V0X2ludDMyKGJ1ZnApOwogCQlzdGF0LT5uX2dpZCA9IGJ1Zl9nZXRfaW50MzIoYnVmcCk7CiAJCXN0YXQtPm5fbXVpZCA9IGJ1Zl9nZXRfaW50MzIoYnVmcCk7CiAJfQotCi0JaWYgKGJ1Zl9jaGVja19vdmVyZmxvdyhidWZwKSB8fCBidWZfY2hlY2tfb3ZlcmZsb3coZGJ1ZnApKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBzdGF0LT5zaXplICsgMjsKLX0KLQotLyoqCi0gKiBkZXNlcmlhbGl6ZV9zdGF0YiAtIHdyYXBwZXIgZm9yIGRlY29kaW5nIGEgcmVjZWl2ZWQgbWV0YWRhdGEgc3RydWN0dXJlCi0gKiBAdjlzZXM6IHNlc3Npb24gaW5mbwotICogQGJ1ZnA6IGJ1ZmZlciB0byBkZXNlcmlhbGl6ZQotICogQGRidWZwOiBidWZmZXIgdG8gZGVzZXJpYWxpemUgdmFyaWFibGUgc3RyaW5ncyBpbnRvCi0gKgotICovCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHY5ZnNfc3RhdCAqZGVzZXJpYWxpemVfc3RhdGIoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvCi0JCQkJCQkgICp2OXNlcywgc3RydWN0IGNidWYgKmJ1ZnAsCi0JCQkJCQkgIHN0cnVjdCBjYnVmICpkYnVmcCkKLXsKLQlzdHJ1Y3Qgdjlmc19zdGF0ICpyZXQgPSBidWZfYWxsb2MoZGJ1ZnAsIHNpemVvZihzdHJ1Y3Qgdjlmc19zdGF0KSk7Ci0KLQlpZiAocmV0KSB7Ci0JCWludCBuID0gZGVzZXJpYWxpemVfc3RhdCh2OXNlcywgYnVmcCwgcmV0LCBkYnVmcCk7Ci0JCWlmIChuIDw9IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwogfQogCiAvKioKICAqIHY5ZnNfZGVzZXJpYWxpemVfc3RhdCAtIGRlY29kZSBhIHJlY2VpdmVkIG1ldGFkYXRhIHN0cnVjdHVyZQotICogQHY5c2VzOiBzZXNzaW9uIGluZm8KICAqIEBidWY6IGJ1ZmZlciB0byBkZXNlcmlhbGl6ZQogICogQGJ1ZmxlbjogbGVuZ3RoIG9mIHJlY2VpdmVkIGJ1ZmZlcgogICogQHN0YXQ6IG1ldGFkYXRhIHN0cnVjdHVyZSB0byBkZWNvZGUgaW50bwotICogQHN0YXRsZW46IGxlbmd0aCBvZiBkZXN0aW5hdGlvbiBtZXRhZGF0YSBzdHJ1Y3R1cmUKKyAqIEBleHRlbmRlZDogbm9uLXplcm8gaWYgOVAyMDAwLnUKICAqCisgKiBOb3RlOiBzdGF0IHdpbGwgcG9pbnQgdG8gdGhlIGJ1ZiByZWdpb24uCiAgKi8KIAogaW50Ci12OWZzX2Rlc2VyaWFsaXplX3N0YXQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdm9pZCAqYnVmLAotCQkgICAgICB1MzIgYnVmbGVuLCBzdHJ1Y3Qgdjlmc19zdGF0ICpzdGF0LCB1MzIgc3RhdGxlbikKK3Y5ZnNfZGVzZXJpYWxpemVfc3RhdCh2b2lkICpidWYsIHUzMiBidWZsZW4sIHN0cnVjdCB2OWZzX3N0YXQgKnN0YXQsCisJCWludCBleHRlbmRlZCkKIHsKIAlzdHJ1Y3QgY2J1ZiBidWZmZXI7CiAJc3RydWN0IGNidWYgKmJ1ZnAgPSAmYnVmZmVyOwotCXN0cnVjdCBjYnVmIGRidWZmZXI7Ci0Jc3RydWN0IGNidWYgKmRidWZwID0gJmRidWZmZXI7CisJdW5zaWduZWQgY2hhciAqcDsKIAogCWJ1Zl9pbml0KGJ1ZnAsIGJ1ZiwgYnVmbGVuKTsKLQlidWZfaW5pdChkYnVmcCwgKGNoYXIgKilzdGF0ICsgc2l6ZW9mKHN0cnVjdCB2OWZzX3N0YXQpLAotCQkgc3RhdGxlbiAtIHNpemVvZihzdHJ1Y3Qgdjlmc19zdGF0KSk7Ci0KLQlyZXR1cm4gZGVzZXJpYWxpemVfc3RhdCh2OXNlcywgYnVmcCwgc3RhdCwgZGJ1ZnApOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotdjlmc19zaXplX2ZjYWxsKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHN0cnVjdCB2OWZzX2ZjYWxsICpmY2FsbCkKLXsKLQlpbnQgc2l6ZSA9IDQgKyAxICsgMjsJLyogc2l6ZVs0XSBtc2dbMV0gdGFnWzJdICovCi0JaW50IGkgPSAwOwotCi0Jc3dpdGNoIChmY2FsbC0+aWQpIHsKLQlkZWZhdWx0OgotCQllcHJpbnRrKEtFUk5fRVJSLCAiYmFkIG1zZyB0eXBlICVkXG4iLCBmY2FsbC0+aWQpOwotCQlyZXR1cm4gMDsKLQljYXNlIFRWRVJTSU9OOgkJLyogbXNpemVbNF0gdmVyc2lvbltzXSAqLwotCQlzaXplICs9IDQgKyAyICsgc3RybGVuKGZjYWxsLT5wYXJhbXMudHZlcnNpb24udmVyc2lvbik7Ci0JCWJyZWFrOwotCWNhc2UgVEFVVEg6CQkvKiBhZmlkWzRdIHVuYW1lW3NdIGFuYW1lW3NdICovCi0JCXNpemUgKz0gNCArIDIgKyBzdHJsZW4oZmNhbGwtPnBhcmFtcy50YXV0aC51bmFtZSkgKwotCQkgICAgMiArIHN0cmxlbihmY2FsbC0+cGFyYW1zLnRhdXRoLmFuYW1lKTsKLQkJYnJlYWs7Ci0JY2FzZSBURkxVU0g6CQkvKiBvbGR0YWdbMl0gKi8KLQkJc2l6ZSArPSAyOwotCQlicmVhazsKLQljYXNlIFRBVFRBQ0g6CQkvKiBmaWRbNF0gYWZpZFs0XSB1bmFtZVtzXSBhbmFtZVtzXSAqLwotCQlzaXplICs9IDQgKyA0ICsgMiArIHN0cmxlbihmY2FsbC0+cGFyYW1zLnRhdHRhY2gudW5hbWUpICsKLQkJICAgIDIgKyBzdHJsZW4oZmNhbGwtPnBhcmFtcy50YXR0YWNoLmFuYW1lKTsKLQkJYnJlYWs7Ci0JY2FzZSBUV0FMSzoJCS8qIGZpZFs0XSBuZXdmaWRbNF0gbnduYW1lWzJdIG53bmFtZSood25hbWVbc10pICovCi0JCXNpemUgKz0gNCArIDQgKyAyOwotCQkvKiBub3cgY29tcHV0ZSB0b3RhbCBmb3IgdGhlIGFycmF5IG9mIG5hbWVzICovCi0JCWZvciAoaSA9IDA7IGkgPCBmY2FsbC0+cGFyYW1zLnR3YWxrLm53bmFtZTsgaSsrKQotCQkJc2l6ZSArPSAyICsgc3RybGVuKGZjYWxsLT5wYXJhbXMudHdhbGsud25hbWVzW2ldKTsKLQkJYnJlYWs7Ci0JY2FzZSBUT1BFTjoJCS8qIGZpZFs0XSBtb2RlWzFdICovCi0JCXNpemUgKz0gNCArIDE7Ci0JCWJyZWFrOwotCWNhc2UgVENSRUFURToJCS8qIGZpZFs0XSBuYW1lW3NdIHBlcm1bNF0gbW9kZVsxXSAqLwotCQlzaXplICs9IDQgKyAyICsgc3RybGVuKGZjYWxsLT5wYXJhbXMudGNyZWF0ZS5uYW1lKSArIDQgKyAxOwotCQlicmVhazsKLQljYXNlIFRSRUFEOgkJLyogZmlkWzRdIG9mZnNldFs4XSBjb3VudFs0XSAqLwotCQlzaXplICs9IDQgKyA4ICsgNDsKLQkJYnJlYWs7Ci0JY2FzZSBUV1JJVEU6CQkvKiBmaWRbNF0gb2Zmc2V0WzhdIGNvdW50WzRdIGRhdGFbY291bnRdICovCi0JCXNpemUgKz0gNCArIDggKyA0ICsgZmNhbGwtPnBhcmFtcy50d3JpdGUuY291bnQ7Ci0JCWJyZWFrOwotCWNhc2UgVENMVU5LOgkJLyogZmlkWzRdICovCi0JCXNpemUgKz0gNDsKLQkJYnJlYWs7Ci0JY2FzZSBUUkVNT1ZFOgkJLyogZmlkWzRdICovCi0JCXNpemUgKz0gNDsKLQkJYnJlYWs7Ci0JY2FzZSBUU1RBVDoJCS8qIGZpZFs0XSAqLwotCQlzaXplICs9IDQ7Ci0JCWJyZWFrOwotCWNhc2UgVFdTVEFUOgkJLyogZmlkWzRdIHN0YXRbbl0gKi8KLQkJZmNhbGwtPnBhcmFtcy50d3N0YXQuc3RhdC0+c2l6ZSA9Ci0JCSAgICB2OWZzX3NpemVfc3RhdCh2OXNlcywgZmNhbGwtPnBhcmFtcy50d3N0YXQuc3RhdCk7Ci0JCXNpemUgKz0gNCArIDIgKyAyICsgZmNhbGwtPnBhcmFtcy50d3N0YXQuc3RhdC0+c2l6ZTsKLQl9Ci0JcmV0dXJuIHNpemU7Ci19Ci0KLS8qCi0gKiB2OWZzX3NlcmlhbGl6ZV9mY2FsbCAtIG1hcnNoYWxsIGZjYWxsIHN0cnVjdCBpbnRvIGEgcGFja2V0Ci0gKiBAdjlzZXM6IHNlc3Npb24gaW5mb3JtYXRpb24KLSAqIEBmY2FsbDogc3RydWN0dXJlIHRvIGNvbnZlcnQKLSAqIEBkYXRhOiBidWZmZXIgdG8gc2VyaWFsaXplIGZjYWxsIGludG8KLSAqIEBkYXRhbGVuOiBsZW5ndGggb2YgYnVmZmVyIHRvIHNlcmlhbGl6ZSBmY2FsbCBpbnRvCi0gKgotICovCi0KLWludAotdjlmc19zZXJpYWxpemVfZmNhbGwoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsLAotCQkgICAgIHZvaWQgKmRhdGEsIHUzMiBkYXRhbGVuKQotewotCWludCBpID0gMDsKLQlzdHJ1Y3Qgdjlmc19zdGF0ICpzdGF0ID0gTlVMTDsKLQlzdHJ1Y3QgY2J1ZiBidWZmZXI7Ci0Jc3RydWN0IGNidWYgKmJ1ZnAgPSAmYnVmZmVyOwotCi0JYnVmX2luaXQoYnVmcCwgZGF0YSwgZGF0YWxlbik7Ci0KLQlpZiAoIWZjYWxsKSB7Ci0JCWVwcmludGsoS0VSTl9FUlIsICJubyBmY2FsbFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWZjYWxsLT5zaXplID0gdjlmc19zaXplX2ZjYWxsKHY5c2VzLCBmY2FsbCk7Ci0KLQlidWZfcHV0X2ludDMyKGJ1ZnAsIGZjYWxsLT5zaXplKTsKLQlidWZfcHV0X2ludDgoYnVmcCwgZmNhbGwtPmlkKTsKLQlidWZfcHV0X2ludDE2KGJ1ZnAsIGZjYWxsLT50YWcpOwotCi0JZHByaW50ayhERUJVR19DT05WLCAic2l6ZSAlZCBpZCAlZCB0YWcgJWRcbiIsIGZjYWxsLT5zaXplLCBmY2FsbC0+aWQsCi0JCWZjYWxsLT50YWcpOwotCi0JLyogbm93IGVuY29kZSBpdCAqLwotCXN3aXRjaCAoZmNhbGwtPmlkKSB7Ci0JZGVmYXVsdDoKLQkJZXByaW50ayhLRVJOX0VSUiwgImJhZCBtc2cgdHlwZTogJWRcbiIsIGZjYWxsLT5pZCk7Ci0JCXJldHVybiAtRVBST1RPOwotCWNhc2UgVFZFUlNJT046Ci0JCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50dmVyc2lvbi5tc2l6ZSk7Ci0JCWJ1Zl9wdXRfc3RyaW5nKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudHZlcnNpb24udmVyc2lvbik7Ci0JCWJyZWFrOwotCWNhc2UgVEFVVEg6Ci0JCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50YXV0aC5hZmlkKTsKLQkJYnVmX3B1dF9zdHJpbmcoYnVmcCwgZmNhbGwtPnBhcmFtcy50YXV0aC51bmFtZSk7Ci0JCWJ1Zl9wdXRfc3RyaW5nKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudGF1dGguYW5hbWUpOwotCQlicmVhazsKLQljYXNlIFRGTFVTSDoKLQkJYnVmX3B1dF9pbnQxNihidWZwLCBmY2FsbC0+cGFyYW1zLnRmbHVzaC5vbGR0YWcpOwotCQlicmVhazsKLQljYXNlIFRBVFRBQ0g6Ci0JCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50YXR0YWNoLmZpZCk7Ci0JCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50YXR0YWNoLmFmaWQpOwotCQlidWZfcHV0X3N0cmluZyhidWZwLCBmY2FsbC0+cGFyYW1zLnRhdHRhY2gudW5hbWUpOwotCQlidWZfcHV0X3N0cmluZyhidWZwLCBmY2FsbC0+cGFyYW1zLnRhdHRhY2guYW5hbWUpOwotCQlicmVhazsKLQljYXNlIFRXQUxLOgotCQlidWZfcHV0X2ludDMyKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudHdhbGsuZmlkKTsKLQkJYnVmX3B1dF9pbnQzMihidWZwLCBmY2FsbC0+cGFyYW1zLnR3YWxrLm5ld2ZpZCk7Ci0JCWJ1Zl9wdXRfaW50MTYoYnVmcCwgZmNhbGwtPnBhcmFtcy50d2Fsay5ud25hbWUpOwotCQlmb3IgKGkgPSAwOyBpIDwgZmNhbGwtPnBhcmFtcy50d2Fsay5ud25hbWU7IGkrKykKLQkJCWJ1Zl9wdXRfc3RyaW5nKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudHdhbGsud25hbWVzW2ldKTsKLQkJYnJlYWs7Ci0JY2FzZSBUT1BFTjoKLQkJYnVmX3B1dF9pbnQzMihidWZwLCBmY2FsbC0+cGFyYW1zLnRvcGVuLmZpZCk7Ci0JCWJ1Zl9wdXRfaW50OChidWZwLCBmY2FsbC0+cGFyYW1zLnRvcGVuLm1vZGUpOwotCQlicmVhazsKLQljYXNlIFRDUkVBVEU6Ci0JCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50Y3JlYXRlLmZpZCk7Ci0JCWJ1Zl9wdXRfc3RyaW5nKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudGNyZWF0ZS5uYW1lKTsKLQkJYnVmX3B1dF9pbnQzMihidWZwLCBmY2FsbC0+cGFyYW1zLnRjcmVhdGUucGVybSk7Ci0JCWJ1Zl9wdXRfaW50OChidWZwLCBmY2FsbC0+cGFyYW1zLnRjcmVhdGUubW9kZSk7Ci0JCWJyZWFrOwotCWNhc2UgVFJFQUQ6Ci0JCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50cmVhZC5maWQpOwotCQlidWZfcHV0X2ludDY0KGJ1ZnAsIGZjYWxsLT5wYXJhbXMudHJlYWQub2Zmc2V0KTsKLQkJYnVmX3B1dF9pbnQzMihidWZwLCBmY2FsbC0+cGFyYW1zLnRyZWFkLmNvdW50KTsKLQkJYnJlYWs7Ci0JY2FzZSBUV1JJVEU6Ci0JCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50d3JpdGUuZmlkKTsKLQkJYnVmX3B1dF9pbnQ2NChidWZwLCBmY2FsbC0+cGFyYW1zLnR3cml0ZS5vZmZzZXQpOwotCQlidWZfcHV0X2ludDMyKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudHdyaXRlLmNvdW50KTsKLQkJYnVmX3B1dF9kYXRhKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudHdyaXRlLmRhdGEsCi0JCQkgICAgIGZjYWxsLT5wYXJhbXMudHdyaXRlLmNvdW50KTsKLQkJYnJlYWs7Ci0JY2FzZSBUQ0xVTks6Ci0JCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50Y2x1bmsuZmlkKTsKLQkJYnJlYWs7Ci0JY2FzZSBUUkVNT1ZFOgotCQlidWZfcHV0X2ludDMyKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudHJlbW92ZS5maWQpOwotCQlicmVhazsKLQljYXNlIFRTVEFUOgotCQlidWZfcHV0X2ludDMyKGJ1ZnAsIGZjYWxsLT5wYXJhbXMudHN0YXQuZmlkKTsKLQkJYnJlYWs7Ci0JY2FzZSBUV1NUQVQ6Ci0JCWJ1Zl9wdXRfaW50MzIoYnVmcCwgZmNhbGwtPnBhcmFtcy50d3N0YXQuZmlkKTsKLQkJc3RhdCA9IGZjYWxsLT5wYXJhbXMudHdzdGF0LnN0YXQ7Ci0KLQkJYnVmX3B1dF9pbnQxNihidWZwLCBzdGF0LT5zaXplICsgMik7Ci0JCXNlcmlhbGl6ZV9zdGF0KHY5c2VzLCBzdGF0LCBidWZwKTsKLQkJYnJlYWs7Ci0JfQorCXAgPSBidWZwLT5wOworCWJ1Zl9nZXRfc3RhdChidWZwLCBzdGF0LCBleHRlbmRlZCk7CiAKIAlpZiAoYnVmX2NoZWNrX292ZXJmbG93KGJ1ZnApKQotCQlyZXR1cm4gLUVJTzsKLQotCXJldHVybiBmY2FsbC0+c2l6ZTsKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gYnVmcC0+cCAtIHA7CiB9CiAKIC8qKgogICogZGVzZXJpYWxpemVfZmNhbGwgLSB1bm1hcnNoYWwgYSByZXNwb25zZQotICogQHY5c2VzOiBzZXNzaW9uIGluZm9ybWF0aW9uCi0gKiBAbXNnc2l6ZTogc2l6ZSBvZiByY2FsbCBtZXNzYWdlCiAgKiBAYnVmOiByZWNpZXZlZCBidWZmZXIKICAqIEBidWZsZW46IGxlbmd0aCBvZiByZWNlaXZlZCBidWZmZXIKICAqIEByY2FsbDogZmNhbGwgc3RydWN0dXJlIHRvIHBvcHVsYXRlCiAgKiBAcmNhbGxsZW46IGxlbmd0aCBvZiBmY2FsbCBzdHJ1Y3R1cmUgdG8gcG9wdWxhdGUKKyAqIEBleHRlbmRlZDogbm9uLXplcm8gaWYgOVAyMDAwLnUKICAqCiAgKi8KIAogaW50Ci12OWZzX2Rlc2VyaWFsaXplX2ZjYWxsKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBtc2dzaXplLAotCQkgICAgICAgdm9pZCAqYnVmLCB1MzIgYnVmbGVuLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqcmNhbGwsCi0JCSAgICAgICBpbnQgcmNhbGxsZW4pCit2OWZzX2Rlc2VyaWFsaXplX2ZjYWxsKHZvaWQgKmJ1ZiwgdTMyIGJ1Zmxlbiwgc3RydWN0IHY5ZnNfZmNhbGwgKnJjYWxsLAorCQkgICAgICAgaW50IGV4dGVuZGVkKQogewogCiAJc3RydWN0IGNidWYgYnVmZmVyOwogCXN0cnVjdCBjYnVmICpidWZwID0gJmJ1ZmZlcjsKLQlzdHJ1Y3QgY2J1ZiBkYnVmZmVyOwotCXN0cnVjdCBjYnVmICpkYnVmcCA9ICZkYnVmZmVyOwogCWludCBpID0gMDsKIAogCWJ1Zl9pbml0KGJ1ZnAsIGJ1ZiwgYnVmbGVuKTsKLQlidWZfaW5pdChkYnVmcCwgKGNoYXIgKilyY2FsbCArIHNpemVvZihzdHJ1Y3Qgdjlmc19mY2FsbCksCi0JCSByY2FsbGxlbiAtIHNpemVvZihzdHJ1Y3Qgdjlmc19mY2FsbCkpOwogCi0JcmNhbGwtPnNpemUgPSBtc2dzaXplOworCXJjYWxsLT5zaXplID0gYnVmX2dldF9pbnQzMihidWZwKTsKIAlyY2FsbC0+aWQgPSBidWZfZ2V0X2ludDgoYnVmcCk7CiAJcmNhbGwtPnRhZyA9IGJ1Zl9nZXRfaW50MTYoYnVmcCk7CiAKIAlkcHJpbnRrKERFQlVHX0NPTlYsICJzaXplICVkIGlkICVkIHRhZyAlZFxuIiwgcmNhbGwtPnNpemUsIHJjYWxsLT5pZCwKIAkJcmNhbGwtPnRhZyk7CisKIAlzd2l0Y2ggKHJjYWxsLT5pZCkgewogCWRlZmF1bHQ6CiAJCWVwcmludGsoS0VSTl9FUlIsICJ1bmtub3duIG1lc3NhZ2UgdHlwZTogJWRcbiIsIHJjYWxsLT5pZCk7CiAJCXJldHVybiAtRVBST1RPOwogCWNhc2UgUlZFUlNJT046CiAJCXJjYWxsLT5wYXJhbXMucnZlcnNpb24ubXNpemUgPSBidWZfZ2V0X2ludDMyKGJ1ZnApOwotCQlyY2FsbC0+cGFyYW1zLnJ2ZXJzaW9uLnZlcnNpb24gPSBidWZfZ2V0X3N0cmluZ2IoYnVmcCwgZGJ1ZnApOworCQlidWZfZ2V0X3N0cihidWZwLCAmcmNhbGwtPnBhcmFtcy5ydmVyc2lvbi52ZXJzaW9uKTsKIAkJYnJlYWs7CiAJY2FzZSBSRkxVU0g6CiAJCWJyZWFrOwpAQCAtNjUxLDM0ICszNTMsMjcgQEAKIAkJYnJlYWs7CiAJY2FzZSBSV0FMSzoKIAkJcmNhbGwtPnBhcmFtcy5yd2Fsay5ud3FpZCA9IGJ1Zl9nZXRfaW50MTYoYnVmcCk7Ci0JCXJjYWxsLT5wYXJhbXMucndhbGsud3FpZHMgPSBidWZfYWxsb2MoZGJ1ZnAsCi0JCSAgICAgIHJjYWxsLT5wYXJhbXMucndhbGsubndxaWQgKiBzaXplb2Yoc3RydWN0IHY5ZnNfcWlkKSk7Ci0JCWlmIChyY2FsbC0+cGFyYW1zLnJ3YWxrLndxaWRzKQotCQkJZm9yIChpID0gMDsgaSA8IHJjYWxsLT5wYXJhbXMucndhbGsubndxaWQ7IGkrKykgewotCQkJCXJjYWxsLT5wYXJhbXMucndhbGsud3FpZHNbaV0udHlwZSA9Ci0JCQkJICAgIGJ1Zl9nZXRfaW50OChidWZwKTsKLQkJCQlyY2FsbC0+cGFyYW1zLnJ3YWxrLndxaWRzW2ldLnZlcnNpb24gPQotCQkJCSAgICBidWZfZ2V0X2ludDE2KGJ1ZnApOwotCQkJCXJjYWxsLT5wYXJhbXMucndhbGsud3FpZHNbaV0ucGF0aCA9Ci0JCQkJICAgIGJ1Zl9nZXRfaW50NjQoYnVmcCk7Ci0JCQl9CisJCWlmIChyY2FsbC0+cGFyYW1zLnJ3YWxrLm53cWlkID4gVjlGU19NQVhXRUxFTSkgeworCQkJZXByaW50ayhLRVJOX0VSUiwgIlJ3YWxrIHdpdGggbW9yZSB0aGFuICVkIHFpZHM6ICVkXG4iLAorCQkJCVY5RlNfTUFYV0VMRU0sIHJjYWxsLT5wYXJhbXMucndhbGsubndxaWQpOworCQkJcmV0dXJuIC1FUFJPVE87CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgcmNhbGwtPnBhcmFtcy5yd2Fsay5ud3FpZDsgaSsrKQorCQkJYnVmX2dldF9xaWQoYnVmcCwgJnJjYWxsLT5wYXJhbXMucndhbGsud3FpZHNbaV0pOwogCQlicmVhazsKIAljYXNlIFJPUEVOOgotCQlyY2FsbC0+cGFyYW1zLnJvcGVuLnFpZC50eXBlID0gYnVmX2dldF9pbnQ4KGJ1ZnApOwotCQlyY2FsbC0+cGFyYW1zLnJvcGVuLnFpZC52ZXJzaW9uID0gYnVmX2dldF9pbnQzMihidWZwKTsKLQkJcmNhbGwtPnBhcmFtcy5yb3Blbi5xaWQucGF0aCA9IGJ1Zl9nZXRfaW50NjQoYnVmcCk7CisJCWJ1Zl9nZXRfcWlkKGJ1ZnAsICZyY2FsbC0+cGFyYW1zLnJvcGVuLnFpZCk7CiAJCXJjYWxsLT5wYXJhbXMucm9wZW4uaW91bml0ID0gYnVmX2dldF9pbnQzMihidWZwKTsKIAkJYnJlYWs7CiAJY2FzZSBSQ1JFQVRFOgotCQlyY2FsbC0+cGFyYW1zLnJjcmVhdGUucWlkLnR5cGUgPSBidWZfZ2V0X2ludDgoYnVmcCk7Ci0JCXJjYWxsLT5wYXJhbXMucmNyZWF0ZS5xaWQudmVyc2lvbiA9IGJ1Zl9nZXRfaW50MzIoYnVmcCk7Ci0JCXJjYWxsLT5wYXJhbXMucmNyZWF0ZS5xaWQucGF0aCA9IGJ1Zl9nZXRfaW50NjQoYnVmcCk7CisJCWJ1Zl9nZXRfcWlkKGJ1ZnAsICZyY2FsbC0+cGFyYW1zLnJjcmVhdGUucWlkKTsKIAkJcmNhbGwtPnBhcmFtcy5yY3JlYXRlLmlvdW5pdCA9IGJ1Zl9nZXRfaW50MzIoYnVmcCk7CiAJCWJyZWFrOwogCWNhc2UgUlJFQUQ6CiAJCXJjYWxsLT5wYXJhbXMucnJlYWQuY291bnQgPSBidWZfZ2V0X2ludDMyKGJ1ZnApOwotCQlyY2FsbC0+cGFyYW1zLnJyZWFkLmRhdGEgPSBidWZfZ2V0X2RhdGFiKGJ1ZnAsIGRidWZwLAotCQkJcmNhbGwtPnBhcmFtcy5ycmVhZC5jb3VudCk7CisJCXJjYWxsLT5wYXJhbXMucnJlYWQuZGF0YSA9IGJ1ZnAtPnA7CisJCWJ1Zl9jaGVja19zaXplKGJ1ZnAsIHJjYWxsLT5wYXJhbXMucnJlYWQuY291bnQpOwogCQlicmVhazsKIAljYXNlIFJXUklURToKIAkJcmNhbGwtPnBhcmFtcy5yd3JpdGUuY291bnQgPSBidWZfZ2V0X2ludDMyKGJ1ZnApOwpAQCAtNjg5LDIwICszODQsNDQzIEBACiAJCWJyZWFrOwogCWNhc2UgUlNUQVQ6CiAJCWJ1Zl9nZXRfaW50MTYoYnVmcCk7Ci0JCXJjYWxsLT5wYXJhbXMucnN0YXQuc3RhdCA9Ci0JCSAgICBkZXNlcmlhbGl6ZV9zdGF0Yih2OXNlcywgYnVmcCwgZGJ1ZnApOworCQlidWZfZ2V0X3N0YXQoYnVmcCwgJnJjYWxsLT5wYXJhbXMucnN0YXQuc3RhdCwgZXh0ZW5kZWQpOwogCQlicmVhazsKIAljYXNlIFJXU1RBVDoKIAkJYnJlYWs7CiAJY2FzZSBSRVJST1I6Ci0JCXJjYWxsLT5wYXJhbXMucmVycm9yLmVycm9yID0gYnVmX2dldF9zdHJpbmdiKGJ1ZnAsIGRidWZwKTsKLQkJaWYgKHY5c2VzLT5leHRlbmRlZCkKKwkJYnVmX2dldF9zdHIoYnVmcCwgJnJjYWxsLT5wYXJhbXMucmVycm9yLmVycm9yKTsKKwkJaWYgKGV4dGVuZGVkKQogCQkJcmNhbGwtPnBhcmFtcy5yZXJyb3IuZXJybm8gPSBidWZfZ2V0X2ludDE2KGJ1ZnApOwogCQlicmVhazsKIAl9CiAKLQlpZiAoYnVmX2NoZWNrX292ZXJmbG93KGJ1ZnApIHx8IGJ1Zl9jaGVja19vdmVyZmxvdyhkYnVmcCkpCisJaWYgKGJ1Zl9jaGVja19vdmVyZmxvdyhidWZwKSkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiYnVmZmVyIG92ZXJmbG93XG4iKTsKIAkJcmV0dXJuIC1FSU87CisJfQogCi0JcmV0dXJuIHJjYWxsLT5zaXplOworCXJldHVybiBidWZwLT5wIC0gYnVmcC0+c3A7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2OWZzX3B1dF9pbnQ4KHN0cnVjdCBjYnVmICpidWZwLCB1OCB2YWwsIHU4ICogcCkKK3sKKwkqcCA9IHZhbDsKKwlidWZfcHV0X2ludDgoYnVmcCwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHY5ZnNfcHV0X2ludDE2KHN0cnVjdCBjYnVmICpidWZwLCB1MTYgdmFsLCB1MTYgKiBwKQoreworCSpwID0gdmFsOworCWJ1Zl9wdXRfaW50MTYoYnVmcCwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHY5ZnNfcHV0X2ludDMyKHN0cnVjdCBjYnVmICpidWZwLCB1MzIgdmFsLCB1MzIgKiBwKQoreworCSpwID0gdmFsOworCWJ1Zl9wdXRfaW50MzIoYnVmcCwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHY5ZnNfcHV0X2ludDY0KHN0cnVjdCBjYnVmICpidWZwLCB1NjQgdmFsLCB1NjQgKiBwKQoreworCSpwID0gdmFsOworCWJ1Zl9wdXRfaW50NjQoYnVmcCwgdmFsKTsKK30KKworc3RhdGljIHZvaWQKK3Y5ZnNfcHV0X3N0cihzdHJ1Y3QgY2J1ZiAqYnVmcCwgY2hhciAqZGF0YSwgc3RydWN0IHY5ZnNfc3RyICpzdHIpCit7CisJaWYgKGRhdGEpIHsKKwkJc3RyLT5sZW4gPSBzdHJsZW4oZGF0YSk7CisJCXN0ci0+c3RyID0gYnVmcC0+cDsKKwl9IGVsc2UgeworCQlzdHItPmxlbiA9IDA7CisJCXN0ci0+c3RyID0gTlVMTDsKKwl9CisKKwlidWZfcHV0X3N0cmluZ24oYnVmcCwgZGF0YSwgc3RyLT5sZW4pOworfQorCitzdGF0aWMgaW50Cit2OWZzX3B1dF91c2VyX2RhdGEoc3RydWN0IGNidWYgKmJ1ZnAsIGNvbnN0IGNoYXIgX191c2VyICogZGF0YSwgaW50IGNvdW50LAorCQkgICB1bnNpZ25lZCBjaGFyICoqcGRhdGEpCit7CisJKnBkYXRhID0gYnVmX2FsbG9jKGJ1ZnAsIGNvdW50KTsKKwlyZXR1cm4gY29weV9mcm9tX3VzZXIoKnBkYXRhLCBkYXRhLCBjb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkCit2OWZzX3B1dF93c3RhdChzdHJ1Y3QgY2J1ZiAqYnVmcCwgc3RydWN0IHY5ZnNfd3N0YXQgKndzdGF0LAorCSAgICAgICBzdHJ1Y3Qgdjlmc19zdGF0ICpzdGF0LCBpbnQgc3RhdHN6LCBpbnQgZXh0ZW5kZWQpCit7CisJdjlmc19wdXRfaW50MTYoYnVmcCwgc3RhdHN6LCAmc3RhdC0+c2l6ZSk7CisJdjlmc19wdXRfaW50MTYoYnVmcCwgd3N0YXQtPnR5cGUsICZzdGF0LT50eXBlKTsKKwl2OWZzX3B1dF9pbnQzMihidWZwLCB3c3RhdC0+ZGV2LCAmc3RhdC0+ZGV2KTsKKwl2OWZzX3B1dF9pbnQ4KGJ1ZnAsIHdzdGF0LT5xaWQudHlwZSwgJnN0YXQtPnFpZC50eXBlKTsKKwl2OWZzX3B1dF9pbnQzMihidWZwLCB3c3RhdC0+cWlkLnZlcnNpb24sICZzdGF0LT5xaWQudmVyc2lvbik7CisJdjlmc19wdXRfaW50NjQoYnVmcCwgd3N0YXQtPnFpZC5wYXRoLCAmc3RhdC0+cWlkLnBhdGgpOworCXY5ZnNfcHV0X2ludDMyKGJ1ZnAsIHdzdGF0LT5tb2RlLCAmc3RhdC0+bW9kZSk7CisJdjlmc19wdXRfaW50MzIoYnVmcCwgd3N0YXQtPmF0aW1lLCAmc3RhdC0+YXRpbWUpOworCXY5ZnNfcHV0X2ludDMyKGJ1ZnAsIHdzdGF0LT5tdGltZSwgJnN0YXQtPm10aW1lKTsKKwl2OWZzX3B1dF9pbnQ2NChidWZwLCB3c3RhdC0+bGVuZ3RoLCAmc3RhdC0+bGVuZ3RoKTsKKworCXY5ZnNfcHV0X3N0cihidWZwLCB3c3RhdC0+bmFtZSwgJnN0YXQtPm5hbWUpOworCXY5ZnNfcHV0X3N0cihidWZwLCB3c3RhdC0+dWlkLCAmc3RhdC0+dWlkKTsKKwl2OWZzX3B1dF9zdHIoYnVmcCwgd3N0YXQtPmdpZCwgJnN0YXQtPmdpZCk7CisJdjlmc19wdXRfc3RyKGJ1ZnAsIHdzdGF0LT5tdWlkLCAmc3RhdC0+bXVpZCk7CisKKwlpZiAoZXh0ZW5kZWQpIHsKKwkJdjlmc19wdXRfc3RyKGJ1ZnAsIHdzdGF0LT5leHRlbnNpb24sICZzdGF0LT5leHRlbnNpb24pOworCQl2OWZzX3B1dF9pbnQzMihidWZwLCB3c3RhdC0+bl91aWQsICZzdGF0LT5uX3VpZCk7CisJCXY5ZnNfcHV0X2ludDMyKGJ1ZnAsIHdzdGF0LT5uX2dpZCwgJnN0YXQtPm5fZ2lkKTsKKwkJdjlmc19wdXRfaW50MzIoYnVmcCwgd3N0YXQtPm5fbXVpZCwgJnN0YXQtPm5fbXVpZCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHY5ZnNfZmNhbGwgKgordjlmc19jcmVhdGVfY29tbW9uKHN0cnVjdCBjYnVmICpidWZwLCB1MzIgc2l6ZSwgdTggaWQpCit7CisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjOworCisJc2l6ZSArPSA0ICsgMSArIDI7CS8qIHNpemVbNF0gaWRbMV0gdGFnWzJdICovCisJZmMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdjlmc19mY2FsbCkgKyBzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZjKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWZjLT5zZGF0YSA9IChjaGFyICopZmMgKyBzaXplb2YoKmZjKTsKKworCWJ1Zl9pbml0KGJ1ZnAsIChjaGFyICopZmMtPnNkYXRhLCBzaXplKTsKKwl2OWZzX3B1dF9pbnQzMihidWZwLCBzaXplLCAmZmMtPnNpemUpOworCXY5ZnNfcHV0X2ludDgoYnVmcCwgaWQsICZmYy0+aWQpOworCXY5ZnNfcHV0X2ludDE2KGJ1ZnAsIFY5RlNfTk9UQUcsICZmYy0+dGFnKTsKKworCXJldHVybiBmYzsKK30KKwordm9pZCB2OWZzX3NldF90YWcoc3RydWN0IHY5ZnNfZmNhbGwgKmZjLCB1MTYgdGFnKQoreworCWZjLT50YWcgPSB0YWc7CisJKihfX2xlMTYgKikgKGZjLT5zZGF0YSArIDUpID0gY3B1X3RvX2xlMTYodGFnKTsKK30KKworc3RydWN0IHY5ZnNfZmNhbGwgKnY5ZnNfY3JlYXRlX3R2ZXJzaW9uKHUzMiBtc2l6ZSwgY2hhciAqdmVyc2lvbikKK3sKKwlpbnQgc2l6ZTsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqZmM7CisJc3RydWN0IGNidWYgYnVmZmVyOworCXN0cnVjdCBjYnVmICpidWZwID0gJmJ1ZmZlcjsKKworCXNpemUgPSA0ICsgMiArIHN0cmxlbih2ZXJzaW9uKTsJLyogbXNpemVbNF0gdmVyc2lvbltzXSAqLworCWZjID0gdjlmc19jcmVhdGVfY29tbW9uKGJ1ZnAsIHNpemUsIFRWRVJTSU9OKTsKKwlpZiAoSVNfRVJSKGZjKSkKKwkJZ290byBlcnJvcjsKKworCXY5ZnNfcHV0X2ludDMyKGJ1ZnAsIG1zaXplLCAmZmMtPnBhcmFtcy50dmVyc2lvbi5tc2l6ZSk7CisJdjlmc19wdXRfc3RyKGJ1ZnAsIHZlcnNpb24sICZmYy0+cGFyYW1zLnR2ZXJzaW9uLnZlcnNpb24pOworCisJaWYgKGJ1Zl9jaGVja19vdmVyZmxvdyhidWZwKSkgeworCQlrZnJlZShmYyk7CisJCWZjID0gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisgICAgICBlcnJvcjoKKwlyZXR1cm4gZmM7Cit9CisKK3N0cnVjdCB2OWZzX2ZjYWxsICp2OWZzX2NyZWF0ZV90YXV0aCh1MzIgYWZpZCwgY2hhciAqdW5hbWUsIGNoYXIgKmFuYW1lKQoreworCWludCBzaXplOworCXN0cnVjdCB2OWZzX2ZjYWxsICpmYzsKKwlzdHJ1Y3QgY2J1ZiBidWZmZXI7CisJc3RydWN0IGNidWYgKmJ1ZnAgPSAmYnVmZmVyOworCisJc2l6ZSA9IDQgKyAyICsgc3RybGVuKHVuYW1lKSArIDIgKyBzdHJsZW4oYW5hbWUpOwkvKiBhZmlkWzRdIHVuYW1lW3NdIGFuYW1lW3NdICovCisJZmMgPSB2OWZzX2NyZWF0ZV9jb21tb24oYnVmcCwgc2l6ZSwgVEFVVEgpOworCWlmIChJU19FUlIoZmMpKQorCQlnb3RvIGVycm9yOworCisJdjlmc19wdXRfaW50MzIoYnVmcCwgYWZpZCwgJmZjLT5wYXJhbXMudGF1dGguYWZpZCk7CisJdjlmc19wdXRfc3RyKGJ1ZnAsIHVuYW1lLCAmZmMtPnBhcmFtcy50YXV0aC51bmFtZSk7CisJdjlmc19wdXRfc3RyKGJ1ZnAsIGFuYW1lLCAmZmMtPnBhcmFtcy50YXV0aC5hbmFtZSk7CisKKwlpZiAoYnVmX2NoZWNrX292ZXJmbG93KGJ1ZnApKSB7CisJCWtmcmVlKGZjKTsKKwkJZmMgPSBFUlJfUFRSKC1FTk9NRU0pOworCX0KKyAgICAgIGVycm9yOgorCXJldHVybiBmYzsKK30KKworc3RydWN0IHY5ZnNfZmNhbGwgKgordjlmc19jcmVhdGVfdGF0dGFjaCh1MzIgZmlkLCB1MzIgYWZpZCwgY2hhciAqdW5hbWUsIGNoYXIgKmFuYW1lKQoreworCWludCBzaXplOworCXN0cnVjdCB2OWZzX2ZjYWxsICpmYzsKKwlzdHJ1Y3QgY2J1ZiBidWZmZXI7CisJc3RydWN0IGNidWYgKmJ1ZnAgPSAmYnVmZmVyOworCisJc2l6ZSA9IDQgKyA0ICsgMiArIHN0cmxlbih1bmFtZSkgKyAyICsgc3RybGVuKGFuYW1lKTsJLyogZmlkWzRdIGFmaWRbNF0gdW5hbWVbc10gYW5hbWVbc10gKi8KKwlmYyA9IHY5ZnNfY3JlYXRlX2NvbW1vbihidWZwLCBzaXplLCBUQVRUQUNIKTsKKwlpZiAoSVNfRVJSKGZjKSkKKwkJZ290byBlcnJvcjsKKworCXY5ZnNfcHV0X2ludDMyKGJ1ZnAsIGZpZCwgJmZjLT5wYXJhbXMudGF0dGFjaC5maWQpOworCXY5ZnNfcHV0X2ludDMyKGJ1ZnAsIGFmaWQsICZmYy0+cGFyYW1zLnRhdHRhY2guYWZpZCk7CisJdjlmc19wdXRfc3RyKGJ1ZnAsIHVuYW1lLCAmZmMtPnBhcmFtcy50YXR0YWNoLnVuYW1lKTsKKwl2OWZzX3B1dF9zdHIoYnVmcCwgYW5hbWUsICZmYy0+cGFyYW1zLnRhdHRhY2guYW5hbWUpOworCisgICAgICBlcnJvcjoKKwlyZXR1cm4gZmM7Cit9CisKK3N0cnVjdCB2OWZzX2ZjYWxsICp2OWZzX2NyZWF0ZV90Zmx1c2godTE2IG9sZHRhZykKK3sKKwlpbnQgc2l6ZTsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqZmM7CisJc3RydWN0IGNidWYgYnVmZmVyOworCXN0cnVjdCBjYnVmICpidWZwID0gJmJ1ZmZlcjsKKworCXNpemUgPSAyOwkJLyogb2xkdGFnWzJdICovCisJZmMgPSB2OWZzX2NyZWF0ZV9jb21tb24oYnVmcCwgc2l6ZSwgVEZMVVNIKTsKKwlpZiAoSVNfRVJSKGZjKSkKKwkJZ290byBlcnJvcjsKKworCXY5ZnNfcHV0X2ludDE2KGJ1ZnAsIG9sZHRhZywgJmZjLT5wYXJhbXMudGZsdXNoLm9sZHRhZyk7CisKKwlpZiAoYnVmX2NoZWNrX292ZXJmbG93KGJ1ZnApKSB7CisJCWtmcmVlKGZjKTsKKwkJZmMgPSBFUlJfUFRSKC1FTk9NRU0pOworCX0KKyAgICAgIGVycm9yOgorCXJldHVybiBmYzsKK30KKworc3RydWN0IHY5ZnNfZmNhbGwgKnY5ZnNfY3JlYXRlX3R3YWxrKHUzMiBmaWQsIHUzMiBuZXdmaWQsIHUxNiBud25hbWUsCisJCQkJICAgICBjaGFyICoqd25hbWVzKQoreworCWludCBpLCBzaXplOworCXN0cnVjdCB2OWZzX2ZjYWxsICpmYzsKKwlzdHJ1Y3QgY2J1ZiBidWZmZXI7CisJc3RydWN0IGNidWYgKmJ1ZnAgPSAmYnVmZmVyOworCisJaWYgKG53bmFtZSA+IFY5RlNfTUFYV0VMRU0pIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgIm53bmFtZSA+ICVkXG4iLCBWOUZTX01BWFdFTEVNKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2l6ZSA9IDQgKyA0ICsgMjsJLyogZmlkWzRdIG5ld2ZpZFs0XSBud25hbWVbMl0gLi4uICovCisJZm9yIChpID0gMDsgaSA8IG53bmFtZTsgaSsrKSB7CisJCXNpemUgKz0gMiArIHN0cmxlbih3bmFtZXNbaV0pOwkvKiB3bmFtZVtzXSAqLworCX0KKworCWZjID0gdjlmc19jcmVhdGVfY29tbW9uKGJ1ZnAsIHNpemUsIFRXQUxLKTsKKwlpZiAoSVNfRVJSKGZjKSkKKwkJZ290byBlcnJvcjsKKworCXY5ZnNfcHV0X2ludDMyKGJ1ZnAsIGZpZCwgJmZjLT5wYXJhbXMudHdhbGsuZmlkKTsKKwl2OWZzX3B1dF9pbnQzMihidWZwLCBuZXdmaWQsICZmYy0+cGFyYW1zLnR3YWxrLm5ld2ZpZCk7CisJdjlmc19wdXRfaW50MTYoYnVmcCwgbnduYW1lLCAmZmMtPnBhcmFtcy50d2Fsay5ud25hbWUpOworCWZvciAoaSA9IDA7IGkgPCBud25hbWU7IGkrKykgeworCQl2OWZzX3B1dF9zdHIoYnVmcCwgd25hbWVzW2ldLCAmZmMtPnBhcmFtcy50d2Fsay53bmFtZXNbaV0pOworCX0KKworCWlmIChidWZfY2hlY2tfb3ZlcmZsb3coYnVmcCkpIHsKKwkJa2ZyZWUoZmMpOworCQlmYyA9IEVSUl9QVFIoLUVOT01FTSk7CisJfQorICAgICAgZXJyb3I6CisJcmV0dXJuIGZjOworfQorCitzdHJ1Y3Qgdjlmc19mY2FsbCAqdjlmc19jcmVhdGVfdG9wZW4odTMyIGZpZCwgdTggbW9kZSkKK3sKKwlpbnQgc2l6ZTsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqZmM7CisJc3RydWN0IGNidWYgYnVmZmVyOworCXN0cnVjdCBjYnVmICpidWZwID0gJmJ1ZmZlcjsKKworCXNpemUgPSA0ICsgMTsJCS8qIGZpZFs0XSBtb2RlWzFdICovCisJZmMgPSB2OWZzX2NyZWF0ZV9jb21tb24oYnVmcCwgc2l6ZSwgVE9QRU4pOworCWlmIChJU19FUlIoZmMpKQorCQlnb3RvIGVycm9yOworCisJdjlmc19wdXRfaW50MzIoYnVmcCwgZmlkLCAmZmMtPnBhcmFtcy50b3Blbi5maWQpOworCXY5ZnNfcHV0X2ludDgoYnVmcCwgbW9kZSwgJmZjLT5wYXJhbXMudG9wZW4ubW9kZSk7CisKKwlpZiAoYnVmX2NoZWNrX292ZXJmbG93KGJ1ZnApKSB7CisJCWtmcmVlKGZjKTsKKwkJZmMgPSBFUlJfUFRSKC1FTk9NRU0pOworCX0KKyAgICAgIGVycm9yOgorCXJldHVybiBmYzsKK30KKworc3RydWN0IHY5ZnNfZmNhbGwgKnY5ZnNfY3JlYXRlX3RjcmVhdGUodTMyIGZpZCwgY2hhciAqbmFtZSwgdTMyIHBlcm0sIHU4IG1vZGUpCit7CisJaW50IHNpemU7CisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjOworCXN0cnVjdCBjYnVmIGJ1ZmZlcjsKKwlzdHJ1Y3QgY2J1ZiAqYnVmcCA9ICZidWZmZXI7CisKKwlzaXplID0gNCArIDIgKyBzdHJsZW4obmFtZSkgKyA0ICsgMTsJLyogZmlkWzRdIG5hbWVbc10gcGVybVs0XSBtb2RlWzFdICovCisJZmMgPSB2OWZzX2NyZWF0ZV9jb21tb24oYnVmcCwgc2l6ZSwgVENSRUFURSk7CisJaWYgKElTX0VSUihmYykpCisJCWdvdG8gZXJyb3I7CisKKwl2OWZzX3B1dF9pbnQzMihidWZwLCBmaWQsICZmYy0+cGFyYW1zLnRjcmVhdGUuZmlkKTsKKwl2OWZzX3B1dF9zdHIoYnVmcCwgbmFtZSwgJmZjLT5wYXJhbXMudGNyZWF0ZS5uYW1lKTsKKwl2OWZzX3B1dF9pbnQzMihidWZwLCBwZXJtLCAmZmMtPnBhcmFtcy50Y3JlYXRlLnBlcm0pOworCXY5ZnNfcHV0X2ludDgoYnVmcCwgbW9kZSwgJmZjLT5wYXJhbXMudGNyZWF0ZS5tb2RlKTsKKworCWlmIChidWZfY2hlY2tfb3ZlcmZsb3coYnVmcCkpIHsKKwkJa2ZyZWUoZmMpOworCQlmYyA9IEVSUl9QVFIoLUVOT01FTSk7CisJfQorICAgICAgZXJyb3I6CisJcmV0dXJuIGZjOworfQorCitzdHJ1Y3Qgdjlmc19mY2FsbCAqdjlmc19jcmVhdGVfdHJlYWQodTMyIGZpZCwgdTY0IG9mZnNldCwgdTMyIGNvdW50KQoreworCWludCBzaXplOworCXN0cnVjdCB2OWZzX2ZjYWxsICpmYzsKKwlzdHJ1Y3QgY2J1ZiBidWZmZXI7CisJc3RydWN0IGNidWYgKmJ1ZnAgPSAmYnVmZmVyOworCisJc2l6ZSA9IDQgKyA4ICsgNDsJLyogZmlkWzRdIG9mZnNldFs4XSBjb3VudFs0XSAqLworCWZjID0gdjlmc19jcmVhdGVfY29tbW9uKGJ1ZnAsIHNpemUsIFRSRUFEKTsKKwlpZiAoSVNfRVJSKGZjKSkKKwkJZ290byBlcnJvcjsKKworCXY5ZnNfcHV0X2ludDMyKGJ1ZnAsIGZpZCwgJmZjLT5wYXJhbXMudHJlYWQuZmlkKTsKKwl2OWZzX3B1dF9pbnQ2NChidWZwLCBvZmZzZXQsICZmYy0+cGFyYW1zLnRyZWFkLm9mZnNldCk7CisJdjlmc19wdXRfaW50MzIoYnVmcCwgY291bnQsICZmYy0+cGFyYW1zLnRyZWFkLmNvdW50KTsKKworCWlmIChidWZfY2hlY2tfb3ZlcmZsb3coYnVmcCkpIHsKKwkJa2ZyZWUoZmMpOworCQlmYyA9IEVSUl9QVFIoLUVOT01FTSk7CisJfQorICAgICAgZXJyb3I6CisJcmV0dXJuIGZjOworfQorCitzdHJ1Y3Qgdjlmc19mY2FsbCAqdjlmc19jcmVhdGVfdHdyaXRlKHUzMiBmaWQsIHU2NCBvZmZzZXQsIHUzMiBjb3VudCwKKwkJCQkgICAgICBjb25zdCBjaGFyIF9fdXNlciAqIGRhdGEpCit7CisJaW50IHNpemUsIGVycjsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqZmM7CisJc3RydWN0IGNidWYgYnVmZmVyOworCXN0cnVjdCBjYnVmICpidWZwID0gJmJ1ZmZlcjsKKworCXNpemUgPSA0ICsgOCArIDQgKyBjb3VudDsJLyogZmlkWzRdIG9mZnNldFs4XSBjb3VudFs0XSBkYXRhW2NvdW50XSAqLworCWZjID0gdjlmc19jcmVhdGVfY29tbW9uKGJ1ZnAsIHNpemUsIFRXUklURSk7CisJaWYgKElTX0VSUihmYykpCisJCWdvdG8gZXJyb3I7CisKKwl2OWZzX3B1dF9pbnQzMihidWZwLCBmaWQsICZmYy0+cGFyYW1zLnR3cml0ZS5maWQpOworCXY5ZnNfcHV0X2ludDY0KGJ1ZnAsIG9mZnNldCwgJmZjLT5wYXJhbXMudHdyaXRlLm9mZnNldCk7CisJdjlmc19wdXRfaW50MzIoYnVmcCwgY291bnQsICZmYy0+cGFyYW1zLnR3cml0ZS5jb3VudCk7CisJZXJyID0gdjlmc19wdXRfdXNlcl9kYXRhKGJ1ZnAsIGRhdGEsIGNvdW50LCAmZmMtPnBhcmFtcy50d3JpdGUuZGF0YSk7CisJaWYgKGVycikgeworCQlrZnJlZShmYyk7CisJCWZjID0gRVJSX1BUUihlcnIpOworCX0KKworCWlmIChidWZfY2hlY2tfb3ZlcmZsb3coYnVmcCkpIHsKKwkJa2ZyZWUoZmMpOworCQlmYyA9IEVSUl9QVFIoLUVOT01FTSk7CisJfQorICAgICAgZXJyb3I6CisJcmV0dXJuIGZjOworfQorCitzdHJ1Y3Qgdjlmc19mY2FsbCAqdjlmc19jcmVhdGVfdGNsdW5rKHUzMiBmaWQpCit7CisJaW50IHNpemU7CisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjOworCXN0cnVjdCBjYnVmIGJ1ZmZlcjsKKwlzdHJ1Y3QgY2J1ZiAqYnVmcCA9ICZidWZmZXI7CisKKwlzaXplID0gNDsJCS8qIGZpZFs0XSAqLworCWZjID0gdjlmc19jcmVhdGVfY29tbW9uKGJ1ZnAsIHNpemUsIFRDTFVOSyk7CisJaWYgKElTX0VSUihmYykpCisJCWdvdG8gZXJyb3I7CisKKwl2OWZzX3B1dF9pbnQzMihidWZwLCBmaWQsICZmYy0+cGFyYW1zLnRjbHVuay5maWQpOworCisJaWYgKGJ1Zl9jaGVja19vdmVyZmxvdyhidWZwKSkgeworCQlrZnJlZShmYyk7CisJCWZjID0gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisgICAgICBlcnJvcjoKKwlyZXR1cm4gZmM7Cit9CisKK3N0cnVjdCB2OWZzX2ZjYWxsICp2OWZzX2NyZWF0ZV90cmVtb3ZlKHUzMiBmaWQpCit7CisJaW50IHNpemU7CisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjOworCXN0cnVjdCBjYnVmIGJ1ZmZlcjsKKwlzdHJ1Y3QgY2J1ZiAqYnVmcCA9ICZidWZmZXI7CisKKwlzaXplID0gNDsJCS8qIGZpZFs0XSAqLworCWZjID0gdjlmc19jcmVhdGVfY29tbW9uKGJ1ZnAsIHNpemUsIFRSRU1PVkUpOworCWlmIChJU19FUlIoZmMpKQorCQlnb3RvIGVycm9yOworCisJdjlmc19wdXRfaW50MzIoYnVmcCwgZmlkLCAmZmMtPnBhcmFtcy50cmVtb3ZlLmZpZCk7CisKKwlpZiAoYnVmX2NoZWNrX292ZXJmbG93KGJ1ZnApKSB7CisJCWtmcmVlKGZjKTsKKwkJZmMgPSBFUlJfUFRSKC1FTk9NRU0pOworCX0KKyAgICAgIGVycm9yOgorCXJldHVybiBmYzsKK30KKworc3RydWN0IHY5ZnNfZmNhbGwgKnY5ZnNfY3JlYXRlX3RzdGF0KHUzMiBmaWQpCit7CisJaW50IHNpemU7CisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjOworCXN0cnVjdCBjYnVmIGJ1ZmZlcjsKKwlzdHJ1Y3QgY2J1ZiAqYnVmcCA9ICZidWZmZXI7CisKKwlzaXplID0gNDsJCS8qIGZpZFs0XSAqLworCWZjID0gdjlmc19jcmVhdGVfY29tbW9uKGJ1ZnAsIHNpemUsIFRTVEFUKTsKKwlpZiAoSVNfRVJSKGZjKSkKKwkJZ290byBlcnJvcjsKKworCXY5ZnNfcHV0X2ludDMyKGJ1ZnAsIGZpZCwgJmZjLT5wYXJhbXMudHN0YXQuZmlkKTsKKworCWlmIChidWZfY2hlY2tfb3ZlcmZsb3coYnVmcCkpIHsKKwkJa2ZyZWUoZmMpOworCQlmYyA9IEVSUl9QVFIoLUVOT01FTSk7CisJfQorICAgICAgZXJyb3I6CisJcmV0dXJuIGZjOworfQorCitzdHJ1Y3Qgdjlmc19mY2FsbCAqdjlmc19jcmVhdGVfdHdzdGF0KHUzMiBmaWQsIHN0cnVjdCB2OWZzX3dzdGF0ICp3c3RhdCwKKwkJCQkgICAgICBpbnQgZXh0ZW5kZWQpCit7CisJaW50IHNpemUsIHN0YXRzejsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqZmM7CisJc3RydWN0IGNidWYgYnVmZmVyOworCXN0cnVjdCBjYnVmICpidWZwID0gJmJ1ZmZlcjsKKworCXN0YXRzeiA9IHY5ZnNfc2l6ZV93c3RhdCh3c3RhdCwgZXh0ZW5kZWQpOworCXNpemUgPSA0ICsgMiArIDIgKyBzdGF0c3o7CS8qIGZpZFs0XSBzdGF0W25dICovCisJZmMgPSB2OWZzX2NyZWF0ZV9jb21tb24oYnVmcCwgc2l6ZSwgVFdTVEFUKTsKKwlpZiAoSVNfRVJSKGZjKSkKKwkJZ290byBlcnJvcjsKKworCXY5ZnNfcHV0X2ludDMyKGJ1ZnAsIGZpZCwgJmZjLT5wYXJhbXMudHdzdGF0LmZpZCk7CisJYnVmX3B1dF9pbnQxNihidWZwLCBzdGF0c3ogKyAyKTsKKwl2OWZzX3B1dF93c3RhdChidWZwLCB3c3RhdCwgJmZjLT5wYXJhbXMudHdzdGF0LnN0YXQsIHN0YXRzeiwgZXh0ZW5kZWQpOworCisJaWYgKGJ1Zl9jaGVja19vdmVyZmxvdyhidWZwKSkgeworCQlrZnJlZShmYyk7CisJCWZjID0gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisgICAgICBlcnJvcjoKKwlyZXR1cm4gZmM7CiB9CmRpZmYgLS1naXQgYS9mcy85cC9jb252LmggYi9mcy85cC9jb252LmgKaW5kZXggZWU4NDk2MS4uMjZhNzM2ZSAxMDA2NDQKLS0tIGEvZnMvOXAvY29udi5oCisrKyBiL2ZzLzlwL2NvbnYuaApAQCAtMSw4ICsxLDkgQEAKIC8qCiAgKiBsaW51eC9mcy85cC9jb252LmgKICAqCi0gKiA5UCBwcm90b2NvbCBjb252ZXJzaW9uIGRlZmluaXRpb25zCisgKiA5UCBwcm90b2NvbCBjb252ZXJzaW9uIGRlZmluaXRpb25zLgogICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgYnkgTGF0Y2hlc2FyIElvbmtvdiA8bHVjaG9AaW9ua292Lm5ldD4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgUm9uIE1pbm5pY2ggPHJtaW5uaWNoQGxhbmwuZ292PgogICoKQEAgLTI0LDEzICsyNSwyNyBAQAogICoKICAqLwogCi1pbnQgdjlmc19kZXNlcmlhbGl6ZV9zdGF0KHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqLCB2b2lkICpidWYsCi0JCQkgIHUzMiBidWZsZW4sIHN0cnVjdCB2OWZzX3N0YXQgKnN0YXQsIHUzMiBzdGF0bGVuKTsKLWludCB2OWZzX3NlcmlhbGl6ZV9mY2FsbChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKiwgc3RydWN0IHY5ZnNfZmNhbGwgKnRjYWxsLAotCQkJIHZvaWQgKmJ1ZiwgdTMyIGJ1Zmxlbik7Ci1pbnQgdjlmc19kZXNlcmlhbGl6ZV9mY2FsbChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKiwgdTMyIG1zZ2xlbiwKLQkJCSAgIHZvaWQgKmJ1ZiwgdTMyIGJ1Zmxlbiwgc3RydWN0IHY5ZnNfZmNhbGwgKnJjYWxsLAotCQkJICAgaW50IHJjYWxsbGVuKTsKK2ludCB2OWZzX2Rlc2VyaWFsaXplX3N0YXQodm9pZCAqYnVmLCB1MzIgYnVmbGVuLCBzdHJ1Y3Qgdjlmc19zdGF0ICpzdGF0LAorCWludCBleHRlbmRlZCk7CitpbnQgdjlmc19kZXNlcmlhbGl6ZV9mY2FsbCh2b2lkICpidWYsIHUzMiBidWZsZW4sIHN0cnVjdCB2OWZzX2ZjYWxsICpyY2FsbCwKKwlpbnQgZXh0ZW5kZWQpOwogCi0vKiB0aGlzIG9uZSBpcyBhY3R1YWxseSBpbiBlcnJvci5jIHJpZ2h0IG5vdyAqLwotaW50IHY5ZnNfZXJyc3RyMmVycm5vKGNoYXIgKmVycnN0cik7Cit2b2lkIHY5ZnNfc2V0X3RhZyhzdHJ1Y3Qgdjlmc19mY2FsbCAqZmMsIHUxNiB0YWcpOworCitzdHJ1Y3Qgdjlmc19mY2FsbCAqdjlmc19jcmVhdGVfdHZlcnNpb24odTMyIG1zaXplLCBjaGFyICp2ZXJzaW9uKTsKK3N0cnVjdCB2OWZzX2ZjYWxsICp2OWZzX2NyZWF0ZV90YXV0aCh1MzIgYWZpZCwgY2hhciAqdW5hbWUsIGNoYXIgKmFuYW1lKTsKK3N0cnVjdCB2OWZzX2ZjYWxsICp2OWZzX2NyZWF0ZV90YXR0YWNoKHUzMiBmaWQsIHUzMiBhZmlkLCBjaGFyICp1bmFtZSwKKwljaGFyICphbmFtZSk7CitzdHJ1Y3Qgdjlmc19mY2FsbCAqdjlmc19jcmVhdGVfdGZsdXNoKHUxNiBvbGR0YWcpOworc3RydWN0IHY5ZnNfZmNhbGwgKnY5ZnNfY3JlYXRlX3R3YWxrKHUzMiBmaWQsIHUzMiBuZXdmaWQsIHUxNiBud25hbWUsCisJY2hhciAqKnduYW1lcyk7CitzdHJ1Y3Qgdjlmc19mY2FsbCAqdjlmc19jcmVhdGVfdG9wZW4odTMyIGZpZCwgdTggbW9kZSk7CitzdHJ1Y3Qgdjlmc19mY2FsbCAqdjlmc19jcmVhdGVfdGNyZWF0ZSh1MzIgZmlkLCBjaGFyICpuYW1lLCB1MzIgcGVybSwgdTggbW9kZSk7CitzdHJ1Y3Qgdjlmc19mY2FsbCAqdjlmc19jcmVhdGVfdHJlYWQodTMyIGZpZCwgdTY0IG9mZnNldCwgdTMyIGNvdW50KTsKK3N0cnVjdCB2OWZzX2ZjYWxsICp2OWZzX2NyZWF0ZV90d3JpdGUodTMyIGZpZCwgdTY0IG9mZnNldCwgdTMyIGNvdW50LAorCWNvbnN0IGNoYXIgX191c2VyICpkYXRhKTsKK3N0cnVjdCB2OWZzX2ZjYWxsICp2OWZzX2NyZWF0ZV90Y2x1bmsodTMyIGZpZCk7CitzdHJ1Y3Qgdjlmc19mY2FsbCAqdjlmc19jcmVhdGVfdHJlbW92ZSh1MzIgZmlkKTsKK3N0cnVjdCB2OWZzX2ZjYWxsICp2OWZzX2NyZWF0ZV90c3RhdCh1MzIgZmlkKTsKK3N0cnVjdCB2OWZzX2ZjYWxsICp2OWZzX2NyZWF0ZV90d3N0YXQodTMyIGZpZCwgc3RydWN0IHY5ZnNfd3N0YXQgKndzdGF0LAorCWludCBleHRlbmRlZCk7CmRpZmYgLS1naXQgYS9mcy85cC9kZWJ1Zy5oIGIvZnMvOXAvZGVidWcuaAppbmRleCA0NDQ1ZjA2Li5mZTU1MTAzIDEwMDY0NAotLS0gYS9mcy85cC9kZWJ1Zy5oCisrKyBiL2ZzLzlwL2RlYnVnLmgKQEAgLTUxLDE2ICs1MSwyMyBAQAogI2lmIERFQlVHX0RVTVBfUEtUCiBzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9kYXRhKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQogewotCWludCBpLCBqOwotCWludCBsZW4gPSBkYXRhbGVuOworCWludCBpLCBuOworCWNoYXIgYnVmWzUqOF07CiAKLQlwcmludGsoS0VSTl9ERUJVRyAiZGF0YSAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHsKLQkJZm9yIChqID0gMDsgKGogPCA0KSAmJiAoaSArIGogPCBsZW4pOyBqKyspCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJTAyeCIsIGRhdGFbaSArIGpdKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiAiKTsKKwluID0gMDsKKwlpID0gMDsKKwl3aGlsZSAoaSA8IGRhdGFsZW4pIHsKKwkJbiArPSBzbnByaW50ZihidWYrbiwgc2l6ZW9mKGJ1ZiktbiwgIiUwMngiLCBkYXRhW2krK10pOworCQlpZiAoaSU0ID09IDApCisJCQluICs9IHNucHJpbnRmKGJ1ZituLCBzaXplb2YoYnVmKS1uLCAiICIpOworCisJCWlmIChpJTE2ID09IDApIHsKKwkJCWRwcmludGsoREVCVUdfRVJST1IsICIlc1xuIiwgYnVmKTsKKwkJCW4gPSAwOworCQl9CiAJfQotCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOworCisJZHByaW50ayhERUJVR19FUlJPUiwgIiVzXG4iLCBidWYpOwogfQogI2Vsc2UJCQkJLyogREVCVUdfRFVNUF9QS1QgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX2RhdGEoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4pCmRpZmYgLS1naXQgYS9mcy85cC9lcnJvci5jIGIvZnMvOXAvZXJyb3IuYwppbmRleCA4MzRjYjE3Li5lNGI2ZjhmIDEwMDY0NAotLS0gYS9mcy85cC9lcnJvci5jCisrKyBiL2ZzLzlwL2Vycm9yLmMKQEAgLTMzLDcgKzMzLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJlcnJvci5oIgpAQCAtNTUsNyArNTQsOCBAQAogCiAJLyogbG9hZCBpbml0aWFsIGVycm9yIG1hcCBpbnRvIGhhc2ggdGFibGUgKi8KIAlmb3IgKGMgPSBlcnJtYXA7IGMtPm5hbWUgIT0gTlVMTDsgYysrKSB7Ci0JCWJ1Y2tldCA9IGpoYXNoKGMtPm5hbWUsIHN0cmxlbihjLT5uYW1lKSwgMCkgJSBFUlJIQVNIU1o7CisJCWMtPm5hbWVsZW4gPSBzdHJsZW4oYy0+bmFtZSk7CisJCWJ1Y2tldCA9IGpoYXNoKGMtPm5hbWUsIGMtPm5hbWVsZW4sIDApICUgRVJSSEFTSFNaOwogCQlJTklUX0hMSVNUX05PREUoJmMtPmxpc3QpOwogCQlobGlzdF9hZGRfaGVhZCgmYy0+bGlzdCwgJmhhc2hfZXJybWFwW2J1Y2tldF0pOwogCX0KQEAgLTY5LDE1ICs2OSwxNSBAQAogICoKICAqLwogCi1pbnQgdjlmc19lcnJzdHIyZXJybm8oY2hhciAqZXJyc3RyKQoraW50IHY5ZnNfZXJyc3RyMmVycm5vKGNoYXIgKmVycnN0ciwgaW50IGxlbikKIHsKIAlpbnQgZXJybm8gPSAwOwogCXN0cnVjdCBobGlzdF9ub2RlICpwID0gTlVMTDsKIAlzdHJ1Y3QgZXJyb3JtYXAgKmMgPSBOVUxMOwotCWludCBidWNrZXQgPSBqaGFzaChlcnJzdHIsIHN0cmxlbihlcnJzdHIpLCAwKSAlIEVSUkhBU0hTWjsKKwlpbnQgYnVja2V0ID0gamhhc2goZXJyc3RyLCBsZW4sIDApICUgRVJSSEFTSFNaOwogCiAJaGxpc3RfZm9yX2VhY2hfZW50cnkoYywgcCwgJmhhc2hfZXJybWFwW2J1Y2tldF0sIGxpc3QpIHsKLQkJaWYgKCFzdHJjbXAoYy0+bmFtZSwgZXJyc3RyKSkgeworCQlpZiAoYy0+bmFtZWxlbj09bGVuICYmICFtZW1jbXAoYy0+bmFtZSwgZXJyc3RyLCBsZW4pKSB7CiAJCQllcnJubyA9IGMtPnZhbDsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9mcy85cC9lcnJvci5oIGIvZnMvOXAvZXJyb3IuaAppbmRleCA3OGY4OWFjLi5hOTc5NGU4IDEwMDY0NAotLS0gYS9mcy85cC9lcnJvci5oCisrKyBiL2ZzLzlwL2Vycm9yLmgKQEAgLTM2LDYgKzM2LDcgQEAKIAljaGFyICpuYW1lOwogCWludCB2YWw7CiAKKwlpbnQgbmFtZWxlbjsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSBsaXN0OwogfTsKIApAQCAtMTc1LDQgKzE3NiwzIEBACiB9OwogCiBleHRlcm4gaW50IHY5ZnNfZXJyb3JfaW5pdCh2b2lkKTsKLWV4dGVybiBpbnQgdjlmc19lcnJzdHIyZXJybm8oY2hhciAqZXJyc3RyKTsKZGlmZiAtLWdpdCBhL2ZzLzlwL2ZpZC5jIGIvZnMvOXAvZmlkLmMKaW5kZXggZDk1Zjg2Mi4uZWRhNDQ5NyAxMDA2NDQKLS0tIGEvZnMvOXAvZmlkLmMKKysrIGIvZnMvOXAvZmlkLmMKQEAgLTMxLDkgKzMxLDYgQEAKICNpbmNsdWRlICJ2OWZzLmgiCiAjaW5jbHVkZSAiOXAuaCIKICNpbmNsdWRlICJ2OWZzX3Zmcy5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC5oIgotI2luY2x1ZGUgIm11eC5oIgotI2luY2x1ZGUgImNvbnYuaCIKICNpbmNsdWRlICJmaWQuaCIKIAogLyoqCkBAIC0xNjQsNyArMTYxLDcgQEAKIAlyZXR1cm4gdjlmc19maWRfY3JlYXRlKGRlbnRyeSwgdjlzZXMsIGZpZG51bSwgMCk7CiAKIGNsdW5rX2ZpZDoKLQl2OWZzX3RfY2x1bmsodjlzZXMsIGZpZG51bSwgTlVMTCk7CisJdjlmc190X2NsdW5rKHY5c2VzLCBmaWRudW0pOwogCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzLzlwL211eC5jIGIvZnMvOXAvbXV4LmMKaW5kZXggODgzNWI1Ny4uOTQ1Y2IzNiAxMDA2NDQKLS0tIGEvZnMvOXAvbXV4LmMKKysrIGIvZnMvOXAvbXV4LmMKQEAgLTQsNyArNCw3IEBACiAgKiBQcm90b2NvbCBNdWx0aXBsZXhlcgogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4KLSAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgTGF0Y2hlc2FyIElvbmtvdiA8bHVjaG9AaW9ua292Lm5ldD4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBieSBMYXRjaGVzYXIgSW9ua292IDxsdWNob0Bpb25rb3YubmV0PgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0yOCw0NDggKzI4LDk0MyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ2OWZzLmgiCiAjaW5jbHVkZSAiOXAuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKICNpbmNsdWRlICJjb252LmgiCisjaW5jbHVkZSAidHJhbnNwb3J0LmgiCiAjaW5jbHVkZSAibXV4LmgiCiAKLS8qKgotICogZHByaW50Y29uZCAtIHByaW50IGNvbmRpdGlvbiBvZiBzZXNzaW9uIGluZm8KLSAqIEB2OXNlczogc2Vzc2lvbiBpbmZvIHN0cnVjdHVyZQotICogQHJlcTogUlBDIHJlcXVlc3Qgc3RydWN0dXJlCi0gKgotICovCisjZGVmaW5lIEVSUkVRRkxVU0gJMQorI2RlZmluZSBTQ0hFRF9USU1FT1VUCTEwCisjZGVmaW5lIE1BWFBPTExXQUREUgkyCiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1kcHJpbnRjb25kKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHN0cnVjdCB2OWZzX3JwY3JlcSAqcmVxKQorZW51bSB7CisJUndvcmtzY2hlZCA9IDEsCQkvKiByZWFkIHdvcmsgc2NoZWR1bGVkIG9yIHJ1bm5pbmcgKi8KKwlScGVuZGluZyA9IDIsCQkvKiBjYW4gcmVhZCAqLworCVd3b3Jrc2NoZWQgPSA0LAkJLyogd3JpdGUgd29yayBzY2hlZHVsZWQgb3IgcnVubmluZyAqLworCVdwZW5kaW5nID0gOCwJCS8qIGNhbiB3cml0ZSAqLworfTsKKworc3RydWN0IHY5ZnNfbXV4X3BvbGxfdGFzazsKKworc3RydWN0IHY5ZnNfcmVxIHsKKwlpbnQgdGFnOworCXN0cnVjdCB2OWZzX2ZjYWxsICp0Y2FsbDsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqcmNhbGw7CisJaW50IGVycjsKKwl2OWZzX211eF9yZXFfY2FsbGJhY2sgY2I7CisJdm9pZCAqY2JhOworCXN0cnVjdCBsaXN0X2hlYWQgcmVxX2xpc3Q7Cit9OworCitzdHJ1Y3Qgdjlmc19tdXhfZGF0YSB7CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgbXV4X2xpc3Q7CisJc3RydWN0IHY5ZnNfbXV4X3BvbGxfdGFzayAqcG9sbF90YXNrOworCWludCBtc2l6ZTsKKwl1bnNpZ25lZCBjaGFyICpleHRlbmRlZDsKKwlzdHJ1Y3Qgdjlmc190cmFuc3BvcnQgKnRyYW5zOworCXN0cnVjdCB2OWZzX2lkcG9vbCB0aWRwb29sOworCWludCBlcnI7CisJd2FpdF9xdWV1ZV9oZWFkX3QgZXF1ZXVlOworCXN0cnVjdCBsaXN0X2hlYWQgcmVxX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCB1bnNlbnRfcmVxX2xpc3Q7CisJc3RydWN0IHY5ZnNfZmNhbGwgKnJjYWxsOworCWludCBycG9zOworCWNoYXIgKnJidWY7CisJaW50IHdwb3M7CisJaW50IHdzaXplOworCWNoYXIgKndidWY7CisJd2FpdF9xdWV1ZV90IHBvbGxfd2FpdFtNQVhQT0xMV0FERFJdOworCXdhaXRfcXVldWVfaGVhZF90ICpwb2xsX3dhZGRyW01BWFBPTExXQUREUl07CisJcG9sbF90YWJsZSBwdDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcnE7CisJc3RydWN0IHdvcmtfc3RydWN0IHdxOworCXVuc2lnbmVkIGxvbmcgd3NjaGVkOworfTsKKworc3RydWN0IHY5ZnNfbXV4X3BvbGxfdGFzayB7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCXN0cnVjdCBsaXN0X2hlYWQgbXV4X2xpc3Q7CisJaW50IG11eG51bTsKK307CisKK3N0cnVjdCB2OWZzX211eF9ycGMgeworCXN0cnVjdCB2OWZzX211eF9kYXRhICptOworCXN0cnVjdCB2OWZzX3JlcSAqcmVxOworCWludCBlcnI7CisJc3RydWN0IHY5ZnNfZmNhbGwgKnJjYWxsOworCXdhaXRfcXVldWVfaGVhZF90IHdxdWV1ZTsKK307CisKK3N0YXRpYyBpbnQgdjlmc19wb2xsX3Byb2Modm9pZCAqKTsKK3N0YXRpYyB2b2lkIHY5ZnNfcmVhZF93b3JrKHZvaWQgKik7CitzdGF0aWMgdm9pZCB2OWZzX3dyaXRlX3dvcmsodm9pZCAqKTsKK3N0YXRpYyB2b2lkIHY5ZnNfcG9sbHdhaXQoc3RydWN0IGZpbGUgKmZpbHAsIHdhaXRfcXVldWVfaGVhZF90ICogd2FpdF9hZGRyZXNzLAorCQkJICBwb2xsX3RhYmxlICogcCk7CitzdGF0aWMgdTE2IHY5ZnNfbXV4X2dldF90YWcoc3RydWN0IHY5ZnNfbXV4X2RhdGEgKik7CitzdGF0aWMgdm9pZCB2OWZzX211eF9wdXRfdGFnKHN0cnVjdCB2OWZzX211eF9kYXRhICosIHUxNik7CisKK3N0YXRpYyBERUNMQVJFX01VVEVYKHY5ZnNfbXV4X3Rhc2tfbG9jayk7CitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnY5ZnNfbXV4X3dxOworCitzdGF0aWMgaW50IHY5ZnNfbXV4X251bTsKK3N0YXRpYyBpbnQgdjlmc19tdXhfcG9sbF90YXNrX251bTsKK3N0YXRpYyBzdHJ1Y3Qgdjlmc19tdXhfcG9sbF90YXNrIHY5ZnNfbXV4X3BvbGxfdGFza3NbMTAwXTsKKworaW50IHY5ZnNfbXV4X2dsb2JhbF9pbml0KHZvaWQpCiB7Ci0JZHByaW50ayhERUJVR19NVVgsICJjb25kaXRpb246ICVkLCAlcFxuIiwgdjlzZXMtPnRyYW5zcG9ydC0+c3RhdHVzLAotCQlyZXEtPnJjYWxsKTsKLQlyZXR1cm4gMDsKLX0KKwlpbnQgaTsKIAotLyoqCi0gKiB4cmVhZCAtIGZvcmNlIHJlYWQgb2YgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcwotICogQHY5c2VzOiBzZXNzaW9uIGluZm8gc3RydWN0dXJlCi0gKiBAcHRyOiBwb2ludGVyIHRvIGJ1ZmZlcgotICogQHN6OiBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAotICoKLSAqIENodWNrIENyYW5vciBDUy01MzMgcHJvamVjdDEKLSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHY5ZnNfbXV4X3BvbGxfdGFza3MpOyBpKyspCisJCXY5ZnNfbXV4X3BvbGxfdGFza3NbaV0udGFzayA9IE5VTEw7CiAKLXN0YXRpYyBpbnQgeHJlYWQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIHN6KQotewotCWludCByZCA9IDA7Ci0JaW50IHJldCA9IDA7Ci0Jd2hpbGUgKHJkIDwgc3opIHsKLQkJcmV0ID0gdjlzZXMtPnRyYW5zcG9ydC0+cmVhZCh2OXNlcy0+dHJhbnNwb3J0LCBwdHIsIHN6IC0gcmQpOwotCQlpZiAocmV0IDw9IDApIHsKLQkJCWRwcmludGsoREVCVUdfRVJST1IsICJ4cmVhZCBlcnJubyAlZFxuIiwgcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJcmQgKz0gcmV0OwotCQlwdHIgKz0gcmV0OwotCX0KLQlyZXR1cm4gKHJkKTsKLX0KLQotLyoqCi0gKiByZWFkX21lc3NhZ2UgLSByZWFkIGEgZnVsbCA5UDIwMDAgZmNhbGwgcGFja2V0Ci0gKiBAdjlzZXM6IHNlc3Npb24gaW5mbyBzdHJ1Y3R1cmUKLSAqIEByY2FsbDogZmNhbGwgc3RydWN0dXJlIHRvIHJlYWQgaW50bwotICogQHJjYWxsbGVuOiBzaXplIG9mIGZjYWxsIGJ1ZmZlcgotICoKLSAqLwotCi1zdGF0aWMgaW50Ci1yZWFkX21lc3NhZ2Uoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywKLQkgICAgIHN0cnVjdCB2OWZzX2ZjYWxsICpyY2FsbCwgaW50IHJjYWxsbGVuKQotewotCXVuc2lnbmVkIGNoYXIgYnVmWzRdOwotCXZvaWQgKmRhdGE7Ci0JaW50IHNpemUgPSAwOwotCWludCByZXMgPSAwOwotCi0JcmVzID0geHJlYWQodjlzZXMsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCWlmIChyZXMgPCAwKSB7Ci0JCWRwcmludGsoREVCVUdfRVJST1IsCi0JCQkiUmVhZGluZyBvZiBjb3VudCBmaWVsZCBmYWlsZWQgcmV0dXJuZWQ6ICVkXG4iLCByZXMpOwotCQlyZXR1cm4gcmVzOwotCX0KLQotCWlmIChyZXMgPCA0KSB7Ci0JCWRwcmludGsoREVCVUdfRVJST1IsCi0JCQkiUmVhZGluZyBvZiBjb3VudCBmaWVsZCBmYWlsZWQgcmV0dXJuZWQ6ICVkXG4iLCByZXMpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlzaXplID0gYnVmWzBdIHwgKGJ1ZlsxXSA8PCA4KSB8IChidWZbMl0gPDwgMTYpIHwgKGJ1ZlszXSA8PCAyNCk7Ci0JZHByaW50ayhERUJVR19NVVgsICJnb3QgYSBwYWNrZXQgY291bnQ6ICVkXG4iLCBzaXplKTsKLQotCS8qIGFkanVzdCBmb3IgdGhlIGZvdXIgYnl0ZXMgb2Ygc2l6ZSAqLwotCXNpemUgLT0gNDsKLQotCWlmIChzaXplID4gdjlzZXMtPm1heGRhdGEpIHsKLQkJZHByaW50ayhERUJVR19FUlJPUiwgInBhY2tldCB0b28gYmlnOiAlZFxuIiwgc2l6ZSk7Ci0JCXJldHVybiAtRTJCSUc7Ci0JfQotCi0JZGF0YSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkYXRhKSB7Ci0JCWVwcmludGsoS0VSTl9XQVJOSU5HLCAib3V0IG9mIG1lbW9yeVxuIik7CisJdjlmc19tdXhfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJ2OWZzIik7CisJaWYgKCF2OWZzX211eF93cSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcmVzID0geHJlYWQodjlzZXMsIGRhdGEsIHNpemUpOwotCWlmIChyZXMgPCBzaXplKSB7Ci0JCWRwcmludGsoREVCVUdfRVJST1IsICJSZWFkaW5nIG9mIGZjYWxsIGZhaWxlZCByZXR1cm5lZDogJWRcbiIsCi0JCQlyZXMpOwotCQlrZnJlZShkYXRhKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQkvKiB3ZSBub3cgaGF2ZSBhbiBpbi1tZW1vcnkgc3RyaW5nIHRoYXQgaXMgdGhlIHJlcGx5LgotCSAqIGRlc2VyaWFsaXplIGl0LiBUaGVyZSBpcyB2ZXJ5IGxpdHRsZSB0byBnbyB3cm9uZyBhdCB0aGlzIHBvaW50Ci0JICogc2F2ZSBmb3Igdjlmc19hbGxvYyBlcnJvcnMuCi0JICovCi0JcmVzID0gdjlmc19kZXNlcmlhbGl6ZV9mY2FsbCh2OXNlcywgc2l6ZSwgZGF0YSwgdjlzZXMtPm1heGRhdGEsCi0JCQkJICAgICByY2FsbCwgcmNhbGxsZW4pOwotCi0Ja2ZyZWUoZGF0YSk7Ci0KLQlpZiAocmVzIDwgMCkKLQkJcmV0dXJuIHJlczsKIAogCXJldHVybiAwOwogfQogCi0vKioKLSAqIHY5ZnNfcmVjdiAtIHJlY2VpdmUgYW4gUlBDIHJlc3BvbnNlIGZvciBhIHBhcnRpY3VsYXIgdGFnCi0gKiBAdjlzZXM6IHNlc3Npb24gaW5mbyBzdHJ1Y3R1cmUKLSAqIEByZXE6IFJQQyByZXF1ZXN0IHN0cnVjdHVyZQotICoKLSAqLwotCi1zdGF0aWMgaW50IHY5ZnNfcmVjdihzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBzdHJ1Y3Qgdjlmc19ycGNyZXEgKnJlcSkKK3ZvaWQgdjlmc19tdXhfZ2xvYmFsX2V4aXQodm9pZCkKIHsKLQlpbnQgcmV0ID0gMDsKLQotCWRwcmludGsoREVCVUdfTVVYLCAid2FpdGluZyBmb3IgcmVzcG9uc2U6ICVkXG4iLCByZXEtPnRjYWxsLT50YWcpOwotCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh2OXNlcy0+cmVhZF93YWl0LAotCQkgICAgICAgKCh2OXNlcy0+dHJhbnNwb3J0LT5zdGF0dXMgIT0gQ29ubmVjdGVkKSB8fAotCQkJKHJlcS0+cmNhbGwgIT0gMCkgfHwgKHJlcS0+ZXJyIDwgMCkgfHwKLQkJCWRwcmludGNvbmQodjlzZXMsIHJlcSkpKTsKLQotCWRwcmludGsoREVCVUdfTVVYLCAiZ290IGl0OiByY2FsbCAlcFxuIiwgcmVxLT5yY2FsbCk7Ci0KLQlzcGluX2xvY2soJnY5c2VzLT5tdXhsb2NrKTsKLQlsaXN0X2RlbCgmcmVxLT5uZXh0KTsKLQlzcGluX3VubG9jaygmdjlzZXMtPm11eGxvY2spOwotCi0JaWYgKHJlcS0+ZXJyIDwgMCkKLQkJcmV0dXJuIHJlcS0+ZXJyOwotCi0JaWYgKHY5c2VzLT50cmFuc3BvcnQtPnN0YXR1cyA9PSBEaXNjb25uZWN0ZWQpCi0JCXJldHVybiAtRUNPTk5SRVNFVDsKLQotCXJldHVybiByZXQ7CisJZGVzdHJveV93b3JrcXVldWUodjlmc19tdXhfd3EpOwogfQogCiAvKioKLSAqIHY5ZnNfc2VuZCAtIHNlbmQgYSA5UCByZXF1ZXN0Ci0gKiBAdjlzZXM6IHNlc3Npb24gaW5mbyBzdHJ1Y3R1cmUKLSAqIEByZXE6IFJQQyByZXF1ZXN0IHRvIHNlbmQKKyAqIHY5ZnNfbXV4X2NhbGNfcG9sbF9wcm9jcyAtIGNhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBwb2xsaW5nIHByb2NzCisgKiBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIG1vdW50ZWQgdjlmcyBmaWxlc3lzdGVtcy4KICAqCisgKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHNxcnQgb2YgdGhlIG51bWJlciBvZiBtb3VudHMuCiAgKi8KLQotc3RhdGljIGludCB2OWZzX3NlbmQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgc3RydWN0IHY5ZnNfcnBjcmVxICpyZXEpCitpbmxpbmUgaW50IHY5ZnNfbXV4X2NhbGNfcG9sbF9wcm9jcyhpbnQgbXV4bnVtKQogewotCWludCByZXQgPSAtMTsKLQl2b2lkICpkYXRhID0gTlVMTDsKLQlzdHJ1Y3Qgdjlmc19mY2FsbCAqdGNhbGwgPSByZXEtPnRjYWxsOworCWludCBuOwogCi0JZGF0YSA9IGttYWxsb2ModjlzZXMtPm1heGRhdGEgKyBWOUZTX0lPSERSU1osIEdGUF9LRVJORUwpOwotCWlmICghZGF0YSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQl0Y2FsbC0+c2l6ZSA9IDA7CS8qIGVuZm9yY2Ugc2l6ZSByZWNhbGN1bGF0aW9uICovCi0JcmV0ID0KLQkgICAgdjlmc19zZXJpYWxpemVfZmNhbGwodjlzZXMsIHRjYWxsLCBkYXRhLAotCQkJCSB2OXNlcy0+bWF4ZGF0YSArIFY5RlNfSU9IRFJTWik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZnJlZV9kYXRhOwotCi0Jc3Bpbl9sb2NrKCZ2OXNlcy0+bXV4bG9jayk7Ci0JbGlzdF9hZGQoJnJlcS0+bmV4dCwgJnY5c2VzLT5tdXhfZmNhbGxzKTsKLQlzcGluX3VubG9jaygmdjlzZXMtPm11eGxvY2spOwotCi0JZHByaW50ayhERUJVR19NVVgsICJzZW5kaW5nIG1lc3NhZ2U6IHRhZyAlZCBzaXplICVkXG4iLCB0Y2FsbC0+dGFnLAotCQl0Y2FsbC0+c2l6ZSk7Ci0JcmV0ID0gdjlzZXMtPnRyYW5zcG9ydC0+d3JpdGUodjlzZXMtPnRyYW5zcG9ydCwgZGF0YSwgdGNhbGwtPnNpemUpOwotCi0JaWYgKHJldCAhPSB0Y2FsbC0+c2l6ZSkgewotCQlzcGluX2xvY2soJnY5c2VzLT5tdXhsb2NrKTsKLQkJbGlzdF9kZWwoJnJlcS0+bmV4dCk7Ci0JCWtmcmVlKHJlcS0+cmNhbGwpOwotCi0JCXNwaW5fdW5sb2NrKCZ2OXNlcy0+bXV4bG9jayk7Ci0JCWlmIChyZXQgPj0gMCkKLQkJCXJldCA9IC1FUkVNT1RFSU87Ci0JfSBlbHNlCi0JCXJldCA9IDA7Ci0KLSAgICAgIGZyZWVfZGF0YToKLQlrZnJlZShkYXRhKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIHY5ZnNfbXV4X3JwYyAtIHNlbmQgYSByZXF1ZXN0LCByZWNlaXZlIGEgcmVzcG9uc2UKLSAqIEB2OXNlczogc2Vzc2lvbiBpbmZvIHN0cnVjdHVyZQotICogQHRjYWxsOiBmY2FsbCB0byBzZW5kCi0gKiBAcmNhbGw6IGJ1ZmZlciB0byBwbGFjZSByZXNwb25zZSBpbnRvCi0gKgotICovCi0KLWxvbmcKLXY5ZnNfbXV4X3JwYyhzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqdGNhbGwsCi0JICAgICBzdHJ1Y3Qgdjlmc19mY2FsbCAqKnJjYWxsKQotewotCWludCB0aWQgPSAtMTsKLQlzdHJ1Y3Qgdjlmc19mY2FsbCAqZmNhbGwgPSBOVUxMOwotCXN0cnVjdCB2OWZzX3JwY3JlcSByZXE7Ci0JaW50IHJldCA9IC0xOwotCi0JaWYgKCF2OXNlcykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIXY5c2VzLT50cmFuc3BvcnQgfHwgdjlzZXMtPnRyYW5zcG9ydC0+c3RhdHVzICE9IENvbm5lY3RlZCkKLQkJcmV0dXJuIC1FSU87Ci0KLQlpZiAocmNhbGwpCi0JCSpyY2FsbCA9IE5VTEw7Ci0KLQlpZiAodGNhbGwtPmlkICE9IFRWRVJTSU9OKSB7Ci0JCXRpZCA9IHY5ZnNfZ2V0X2lkcG9vbCgmdjlzZXMtPnRpZHBvb2wpOwotCQlpZiAodGlkIDwgMCkKLQkJCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXRjYWxsLT50YWcgPSB0aWQ7Ci0KLQlyZXEudGNhbGwgPSB0Y2FsbDsKLQlyZXEuZXJyID0gMDsKLQlyZXEucmNhbGwgPSBOVUxMOwotCi0JcmV0ID0gdjlmc19zZW5kKHY5c2VzLCAmcmVxKTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCWlmICh0Y2FsbC0+aWQgIT0gVFZFUlNJT04pCi0JCQl2OWZzX3B1dF9pZHBvb2wodGlkLCAmdjlzZXMtPnRpZHBvb2wpOwotCQlkcHJpbnRrKERFQlVHX01VWCwgImVycm9yICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IHY5ZnNfcmVjdih2OXNlcywgJnJlcSk7Ci0KLQlmY2FsbCA9IHJlcS5yY2FsbDsKLQotCWRwcmludGsoREVCVUdfTVVYLCAicmVjZWl2ZWQ6IHRhZz0leCwgcmV0PSVkXG4iLCB0Y2FsbC0+dGFnLCByZXQpOwotCWlmIChyZXQgPT0gLUVSRVNUQVJUU1lTKSB7Ci0JCWlmICh2OXNlcy0+dHJhbnNwb3J0LT5zdGF0dXMgIT0gRGlzY29ubmVjdGVkCi0JCSAgICAmJiB0Y2FsbC0+aWQgIT0gVEZMVVNIKSB7Ci0JCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JCQlkcHJpbnRrKERFQlVHX01VWCwgImZsdXNoaW5nIHRoZSB0YWc6ICVkXG4iLAotCQkJCXRjYWxsLT50YWcpOwotCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1NJR1BFTkRJTkcpOwotCQkJdjlmc190X2ZsdXNoKHY5c2VzLCB0Y2FsbC0+dGFnKTsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7Ci0JCQlyZWNhbGNfc2lncGVuZGluZygpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywKLQkJCQkJICAgICAgIGZsYWdzKTsKLQkJCWRwcmludGsoREVCVUdfTVVYLCAiZmx1c2hpbmcgZG9uZVxuIik7Ci0JCX0KLQotCQlnb3RvIHJlbGVhc2VfcmVxOwotCX0gZWxzZSBpZiAocmV0IDwgMCkKLQkJZ290byByZWxlYXNlX3JlcTsKLQotCWlmICghZmNhbGwpCi0JCXJldCA9IC1FSU87Ci0JZWxzZSB7Ci0JCWlmIChmY2FsbC0+aWQgPT0gUkVSUk9SKSB7Ci0JCQlyZXQgPSB2OWZzX2VycnN0cjJlcnJubyhmY2FsbC0+cGFyYW1zLnJlcnJvci5lcnJvcik7Ci0JCQlpZiAocmV0ID09IDApIHsJLyogc3RyaW5nIG1hdGNoIGZhaWxlZCAqLwotCQkJCWlmIChmY2FsbC0+cGFyYW1zLnJlcnJvci5lcnJubykKLQkJCQkJcmV0ID0gLShmY2FsbC0+cGFyYW1zLnJlcnJvci5lcnJubyk7Ci0JCQkJZWxzZQotCQkJCQlyZXQgPSAtRVNFUlZFUkZBVUxUOwotCQkJfQotCQl9IGVsc2UgaWYgKGZjYWxsLT5pZCAhPSB0Y2FsbC0+aWQgKyAxKSB7Ci0JCQlkcHJpbnRrKERFQlVHX0VSUk9SLAotCQkJCSJmY2FsbCBtaXNtYXRjaDogZXhwZWN0ZWQgJWQsIGdvdCAlZFxuIiwKLQkJCQl0Y2FsbC0+aWQgKyAxLCBmY2FsbC0+aWQpOwotCQkJcmV0ID0gLUVJTzsKLQkJfQotCX0KLQotICAgICAgcmVsZWFzZV9yZXE6Ci0JaWYgKHRjYWxsLT5pZCAhPSBUVkVSU0lPTikKLQkJdjlmc19wdXRfaWRwb29sKHRpZCwgJnY5c2VzLT50aWRwb29sKTsKLQlpZiAocmNhbGwpCi0JCSpyY2FsbCA9IGZjYWxsOworCWlmICh2OWZzX211eF9wb2xsX3Rhc2tfbnVtKQorCQluID0gbXV4bnVtIC8gdjlmc19tdXhfcG9sbF90YXNrX251bSArCisJCSAgICAobXV4bnVtICUgdjlmc19tdXhfcG9sbF90YXNrX251bSA/IDEgOiAwKTsKIAllbHNlCi0JCWtmcmVlKGZjYWxsKTsKKwkJbiA9IDE7CiAKLQlyZXR1cm4gcmV0OworCWlmIChuID4gQVJSQVlfU0laRSh2OWZzX211eF9wb2xsX3Rhc2tzKSkKKwkJbiA9IEFSUkFZX1NJWkUodjlmc19tdXhfcG9sbF90YXNrcyk7CisKKwlyZXR1cm4gbjsKIH0KIAotLyoqCi0gKiB2OWZzX211eF9jYW5jZWxfcmVxdWVzdHMgLSBjYW5jZWxzIGFsbCBwZW5kaW5nIHJlcXVlc3RzCi0gKgotICogQHY5c2VzOiBzZXNzaW9uIGluZm8gc3RydWN0dXJlCi0gKiBAZXJyOiBlcnJvciBjb2RlIHRvIHJldHVybiB0byB0aGUgcmVxdWVzdHMKLSAqLwotdm9pZCB2OWZzX211eF9jYW5jZWxfcmVxdWVzdHMoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgaW50IGVycikKK3N0YXRpYyBpbnQgdjlmc19tdXhfcG9sbF9zdGFydChzdHJ1Y3Qgdjlmc19tdXhfZGF0YSAqbSkKIHsKLQlzdHJ1Y3Qgdjlmc19ycGNyZXEgKnJwdHI7Ci0Jc3RydWN0IHY5ZnNfcnBjcmVxICpycmVxOworCWludCBpLCBuOworCXN0cnVjdCB2OWZzX211eF9wb2xsX3Rhc2sgKnZwdCwgKnZwdGxhc3Q7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwcHJvYzsKIAotCWRwcmludGsoREVCVUdfTVVYLCAiICVkXG4iLCBlcnIpOwotCXNwaW5fbG9jaygmdjlzZXMtPm11eGxvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShycmVxLCBycHRyLCAmdjlzZXMtPm11eF9mY2FsbHMsIG5leHQpIHsKLQkJcnJlcS0+ZXJyID0gZXJyOworCWRwcmludGsoREVCVUdfTVVYLCAibXV4ICVwIG11eG51bSAlZCBwcm9jbnVtICVkXG4iLCBtLCB2OWZzX211eF9udW0sCisJCXY5ZnNfbXV4X3BvbGxfdGFza19udW0pOworCXVwKCZ2OWZzX211eF90YXNrX2xvY2spOworCisJbiA9IHY5ZnNfbXV4X2NhbGNfcG9sbF9wcm9jcyh2OWZzX211eF9udW0gKyAxKTsKKwlpZiAobiA+IHY5ZnNfbXV4X3BvbGxfdGFza19udW0pIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodjlmc19tdXhfcG9sbF90YXNrcyk7IGkrKykgeworCQkJaWYgKHY5ZnNfbXV4X3BvbGxfdGFza3NbaV0udGFzayA9PSBOVUxMKSB7CisJCQkJdnB0ID0gJnY5ZnNfbXV4X3BvbGxfdGFza3NbaV07CisJCQkJZHByaW50ayhERUJVR19NVVgsICJjcmVhdGUgcHJvYyAlcFxuIiwgdnB0KTsKKwkJCQlwcHJvYyA9IGt0aHJlYWRfY3JlYXRlKHY5ZnNfcG9sbF9wcm9jLCB2cHQsCisJCQkJCQkgICAidjlmcy1wb2xsIik7CisKKwkJCQlpZiAoIUlTX0VSUihwcHJvYykpIHsKKwkJCQkJdnB0LT50YXNrID0gcHByb2M7CisJCQkJCUlOSVRfTElTVF9IRUFEKCZ2cHQtPm11eF9saXN0KTsKKwkJCQkJdnB0LT5tdXhudW0gPSAwOworCQkJCQl2OWZzX211eF9wb2xsX3Rhc2tfbnVtKys7CisJCQkJCXdha2VfdXBfcHJvY2Vzcyh2cHQtPnRhc2spOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChpID49IEFSUkFZX1NJWkUodjlmc19tdXhfcG9sbF90YXNrcykpCisJCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAid2FybmluZzogbm8gZnJlZSBwb2xsIHNsb3RzXG4iKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJnY5c2VzLT5tdXhsb2NrKTsKLQl3YWtlX3VwX2FsbCgmdjlzZXMtPnJlYWRfd2FpdCk7CisKKwluID0gKHY5ZnNfbXV4X251bSArIDEpIC8gdjlmc19tdXhfcG9sbF90YXNrX251bSArCisJICAgICgodjlmc19tdXhfbnVtICsgMSkgJSB2OWZzX211eF9wb2xsX3Rhc2tfbnVtID8gMSA6IDApOworCisJdnB0bGFzdCA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodjlmc19tdXhfcG9sbF90YXNrcyk7IGkrKykgeworCQl2cHQgPSAmdjlmc19tdXhfcG9sbF90YXNrc1tpXTsKKwkJaWYgKHZwdC0+dGFzayAhPSBOVUxMKSB7CisJCQl2cHRsYXN0ID0gdnB0OworCQkJaWYgKHZwdC0+bXV4bnVtIDwgbikgeworCQkJCWRwcmludGsoREVCVUdfTVVYLCAicHV0IGluIHByb2MgJWRcbiIsIGkpOworCQkJCWxpc3RfYWRkKCZtLT5tdXhfbGlzdCwgJnZwdC0+bXV4X2xpc3QpOworCQkJCXZwdC0+bXV4bnVtKys7CisJCQkJbS0+cG9sbF90YXNrID0gdnB0OworCQkJCW1lbXNldCgmbS0+cG9sbF93YWRkciwgMCwgc2l6ZW9mKG0tPnBvbGxfd2FkZHIpKTsKKwkJCQlpbml0X3BvbGxfZnVuY3B0cigmbS0+cHQsIHY5ZnNfcG9sbHdhaXQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGkgPj0gQVJSQVlfU0laRSh2OWZzX211eF9wb2xsX3Rhc2tzKSkgeworCQlpZiAodnB0bGFzdCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJZHByaW50ayhERUJVR19NVVgsICJwdXQgaW4gcHJvYyAlZFxuIiwgaSk7CisJCWxpc3RfYWRkKCZtLT5tdXhfbGlzdCwgJnZwdGxhc3QtPm11eF9saXN0KTsKKwkJdnB0bGFzdC0+bXV4bnVtKys7CisJCW0tPnBvbGxfdGFzayA9IHZwdGxhc3Q7CisJCW1lbXNldCgmbS0+cG9sbF93YWRkciwgMCwgc2l6ZW9mKG0tPnBvbGxfd2FkZHIpKTsKKwkJaW5pdF9wb2xsX2Z1bmNwdHIoJm0tPnB0LCB2OWZzX3BvbGx3YWl0KTsKKwl9CisKKwl2OWZzX211eF9udW0rKzsKKwlkb3duKCZ2OWZzX211eF90YXNrX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHY5ZnNfbXV4X3BvbGxfc3RvcChzdHJ1Y3Qgdjlmc19tdXhfZGF0YSAqbSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgdjlmc19tdXhfcG9sbF90YXNrICp2cHQ7CisKKwl1cCgmdjlmc19tdXhfdGFza19sb2NrKTsKKwl2cHQgPSBtLT5wb2xsX3Rhc2s7CisJbGlzdF9kZWwoJm0tPm11eF9saXN0KTsKKwlmb3IoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG0tPnBvbGxfd2FkZHIpOyBpKyspIHsKKwkJaWYgKG0tPnBvbGxfd2FkZHJbaV0gIT0gTlVMTCkgeworCQkJcmVtb3ZlX3dhaXRfcXVldWUobS0+cG9sbF93YWRkcltpXSwgJm0tPnBvbGxfd2FpdFtpXSk7CisJCQltLT5wb2xsX3dhZGRyW2ldID0gTlVMTDsKKwkJfQorCX0KKwl2cHQtPm11eG51bS0tOworCWlmICghdnB0LT5tdXhudW0pIHsKKwkJZHByaW50ayhERUJVR19NVVgsICJkZXN0cm95IHByb2MgJXBcbiIsIHZwdCk7CisJCXNlbmRfc2lnKFNJR0tJTEwsIHZwdC0+dGFzaywgMSk7CisJCXZwdC0+dGFzayA9IE5VTEw7CisJCXY5ZnNfbXV4X3BvbGxfdGFza19udW0tLTsKKwl9CisJdjlmc19tdXhfbnVtLS07CisJZG93bigmdjlmc19tdXhfdGFza19sb2NrKTsKIH0KIAogLyoqCi0gKiB2OWZzX3JlY3Zwcm9jIC0ga3Byb2MgdG8gaGFuZGxlIGRlbXVsdGlwbGV4aW5nIHJlc3BvbnNlcwotICogQGRhdGE6IHNlc3Npb24gaW5mbyBzdHJ1Y3R1cmUKKyAqIHY5ZnNfbXV4X2luaXQgLSBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgcGVyLXNlc3Npb24gbXV4IGRhdGEKKyAqIENyZWF0ZXMgdGhlIHBvbGxpbmcgdGFzayBpZiB0aGlzIGlzIHRoZSBmaXJzdCBzZXNzaW9uLgogICoKKyAqIEB0cmFucyAtIHRyYW5zcG9ydCBzdHJ1Y3R1cmUKKyAqIEBtc2l6ZSAtIG1heGltdW0gbWVzc2FnZSBzaXplCisgKiBAZXh0ZW5kZWQgLSBwb2ludGVyIHRvIHRoZSBleHRlbmRlZCBmbGFnCiAgKi8KLQotc3RhdGljIGludCB2OWZzX3JlY3Zwcm9jKHZvaWQgKmRhdGEpCitzdHJ1Y3Qgdjlmc19tdXhfZGF0YSAqdjlmc19tdXhfaW5pdChzdHJ1Y3Qgdjlmc190cmFuc3BvcnQgKnRyYW5zLCBpbnQgbXNpemUsCisJCQkJICAgIHVuc2lnbmVkIGNoYXIgKmV4dGVuZGVkKQogewotCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMgPSAoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICopZGF0YTsKLQlzdHJ1Y3Qgdjlmc19mY2FsbCAqcmNhbGwgPSBOVUxMOwotCXN0cnVjdCB2OWZzX3JwY3JlcSAqcnB0cjsKLQlzdHJ1Y3Qgdjlmc19ycGNyZXEgKnJlcTsKLQlzdHJ1Y3Qgdjlmc19ycGNyZXEgKnJyZXE7Ci0JaW50IGVyciA9IDA7CisJaW50IGksIG47CisJc3RydWN0IHY5ZnNfbXV4X2RhdGEgKm0sICptdG1wOwogCi0JYWxsb3dfc2lnbmFsKFNJR0tJTEwpOwotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JY29tcGxldGUoJnY5c2VzLT5wcm9jY21wbCk7Ci0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYgZXJyID49IDApIHsKLQkJcmVxID0gcnB0ciA9IHJyZXEgPSBOVUxMOworCWRwcmludGsoREVCVUdfTVVYLCAidHJhbnNwb3J0ICVwIG1zaXplICVkXG4iLCB0cmFucywgbXNpemUpOworCW0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdjlmc19tdXhfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghbSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQkJcmNhbGwgPSBrbWFsbG9jKHY5c2VzLT5tYXhkYXRhICsgVjlGU19JT0hEUlNaLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFyY2FsbCkgewotCQkJZXByaW50ayhLRVJOX0VSUiwgIm5vIG1lbW9yeSBmb3IgYnVmZmVyc1xuIik7CisJc3Bpbl9sb2NrX2luaXQoJm0tPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZtLT5tdXhfbGlzdCk7CisJbS0+bXNpemUgPSBtc2l6ZTsKKwltLT5leHRlbmRlZCA9IGV4dGVuZGVkOworCW0tPnRyYW5zID0gdHJhbnM7CisJaWRyX2luaXQoJm0tPnRpZHBvb2wucG9vbCk7CisJaW5pdF9NVVRFWCgmbS0+dGlkcG9vbC5sb2NrKTsKKwltLT5lcnIgPSAwOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm0tPmVxdWV1ZSk7CisJSU5JVF9MSVNUX0hFQUQoJm0tPnJlcV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmbS0+dW5zZW50X3JlcV9saXN0KTsKKwltLT5yY2FsbCA9IE5VTEw7CisJbS0+cnBvcyA9IDA7CisJbS0+cmJ1ZiA9IE5VTEw7CisJbS0+d3BvcyA9IG0tPndzaXplID0gMDsKKwltLT53YnVmID0gTlVMTDsKKwlJTklUX1dPUksoJm0tPnJxLCB2OWZzX3JlYWRfd29yaywgbSk7CisJSU5JVF9XT1JLKCZtLT53cSwgdjlmc193cml0ZV93b3JrLCBtKTsKKwltLT53c2NoZWQgPSAwOworCW1lbXNldCgmbS0+cG9sbF93YWRkciwgMCwgc2l6ZW9mKG0tPnBvbGxfd2FkZHIpKTsKKwltLT5wb2xsX3Rhc2sgPSBOVUxMOworCW4gPSB2OWZzX211eF9wb2xsX3N0YXJ0KG0pOworCWlmIChuKQorCQlyZXR1cm4gRVJSX1BUUihuKTsKKworCW4gPSB0cmFucy0+cG9sbCh0cmFucywgJm0tPnB0KTsKKwlpZiAobiAmIFBPTExJTikgeworCQlkcHJpbnRrKERFQlVHX01VWCwgIm11eCAlcCBjYW4gcmVhZFxuIiwgbSk7CisJCXNldF9iaXQoUnBlbmRpbmcsICZtLT53c2NoZWQpOworCX0KKworCWlmIChuICYgUE9MTE9VVCkgeworCQlkcHJpbnRrKERFQlVHX01VWCwgIm11eCAlcCBjYW4gd3JpdGVcbiIsIG0pOworCQlzZXRfYml0KFdwZW5kaW5nLCAmbS0+d3NjaGVkKTsKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG0tPnBvbGxfd2FkZHIpOyBpKyspIHsKKwkJaWYgKElTX0VSUihtLT5wb2xsX3dhZGRyW2ldKSkgeworCQkJdjlmc19tdXhfcG9sbF9zdG9wKG0pOworCQkJbXRtcCA9ICh2b2lkICopbS0+cG9sbF93YWRkcjsJLyogdGhlIGVycm9yIGNvZGUgKi8KKwkJCWtmcmVlKG0pOworCQkJbSA9IG10bXA7CiAJCQlicmVhazsKIAkJfQotCi0JCWVyciA9IHJlYWRfbWVzc2FnZSh2OXNlcywgcmNhbGwsIHY5c2VzLT5tYXhkYXRhICsgVjlGU19JT0hEUlNaKTsKLQkJc3Bpbl9sb2NrKCZ2OXNlcy0+bXV4bG9jayk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocnJlcSwgcnB0ciwgJnY5c2VzLT5tdXhfZmNhbGxzLCBuZXh0KSB7Ci0JCQkJcnJlcS0+ZXJyID0gZXJyOwotCQkJfQotCQkJaWYoZXJyICE9IC1FUkVTVEFSVFNZUykKLQkJCQllcHJpbnRrKEtFUk5fRVJSLAotCQkJCQkiVHJhbnNwb3J0IGVycm9yIHdoaWxlIHJlYWRpbmcgbWVzc2FnZSAlZFxuIiwgZXJyKTsKLQkJfSBlbHNlIHsKLQkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShycmVxLCBycHRyLCAmdjlzZXMtPm11eF9mY2FsbHMsIG5leHQpIHsKLQkJCQlpZiAocnJlcS0+dGNhbGwtPnRhZyA9PSByY2FsbC0+dGFnKSB7Ci0JCQkJCXJlcSA9IHJyZXE7Ci0JCQkJCXJlcS0+cmNhbGwgPSByY2FsbDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHJlcSAmJiAocmVxLT50Y2FsbC0+aWQgPT0gVEZMVVNIKSkgewotCQkJc3RydWN0IHY5ZnNfcnBjcmVxICp0cmVxID0gTlVMTDsKLQkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0cmVxLCBycHRyLCAmdjlzZXMtPm11eF9mY2FsbHMsIG5leHQpIHsKLQkJCQlpZiAodHJlcS0+dGNhbGwtPnRhZyA9PQotCQkJCSAgICByZXEtPnRjYWxsLT5wYXJhbXMudGZsdXNoLm9sZHRhZykgewotCQkJCQlsaXN0X2RlbCgmcnB0ci0+bmV4dCk7Ci0JCQkJCWtmcmVlKHRyZXEtPnJjYWxsKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3Bpbl91bmxvY2soJnY5c2VzLT5tdXhsb2NrKTsKLQotCQlpZiAoIXJlcSkgewotCQkJaWYgKGVyciA+PSAwKQotCQkJCWRwcmludGsoREVCVUdfRVJST1IsCi0JCQkJCSJ1bmV4cGVjdGVkIHJlc3BvbnNlOiBpZCAlZCB0YWcgJWRcbiIsCi0JCQkJCXJjYWxsLT5pZCwgcmNhbGwtPnRhZyk7Ci0KLQkJCWtmcmVlKHJjYWxsKTsKLQkJfQotCi0JCXdha2VfdXBfYWxsKCZ2OXNlcy0+cmVhZF93YWl0KTsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAl9CiAKLQl2OXNlcy0+dHJhbnNwb3J0LT5jbG9zZSh2OXNlcy0+dHJhbnNwb3J0KTsKLQotCS8qIEluZm9ybSBhbGwgcGVuZGluZyBwcm9jZXNzZXMgYWJvdXQgdGhlIGZhaWx1cmUgKi8KLQl3YWtlX3VwX2FsbCgmdjlzZXMtPnJlYWRfd2FpdCk7Ci0KLQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCWNvbXBsZXRlKCZ2OXNlcy0+cHJvY2NtcGwpOwotCi0JZHByaW50ayhERUJVR19NVVgsICJyZWN2cHJvYzogZW5kXG4iKTsKLQl2OXNlcy0+cmVjdnByb2MgPSBOVUxMOwotCi0JcmV0dXJuIGVyciA+PSAwOworCXJldHVybiBtOwogfQogCiAvKioKLSAqIHY5ZnNfbXV4X2luaXQgLSBpbml0aWFsaXplIG11bHRpcGxleGVyIChzcGF3biBrcHJvYykKLSAqIEB2OXNlczogc2Vzc2lvbiBpbmZvIHN0cnVjdHVyZQotICogQGRldl9uYW1lOiBtb3VudCBkZXZpY2UgaW5mb3JtYXRpb24gKHRvIGNyZWF0ZSB1bmlxdWUga3Byb2MpCi0gKgorICogdjlmc19tdXhfZGVzdHJveSAtIGNhbmNlbHMgYWxsIHBlbmRpbmcgcmVxdWVzdHMgYW5kIGZyZWVzIG11eCByZXNvdXJjZXMKICAqLwotCi1pbnQgdjlmc19tdXhfaW5pdChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBjb25zdCBjaGFyICpkZXZfbmFtZSkKK3ZvaWQgdjlmc19tdXhfZGVzdHJveShzdHJ1Y3Qgdjlmc19tdXhfZGF0YSAqbSkKIHsKLQljaGFyIHByb2NuYW1lWzYwXTsKKwlkcHJpbnRrKERFQlVHX01VWCwgIm11eCAlcCBwcmV2ICVwIG5leHQgJXBcbiIsIG0sCisJCW0tPm11eF9saXN0LnByZXYsIG0tPm11eF9saXN0Lm5leHQpOworCXY5ZnNfbXV4X2NhbmNlbChtLCAtRUNPTk5SRVNFVCk7CiAKLQlzdHJuY3B5KHByb2NuYW1lLCBkZXZfbmFtZSwgc2l6ZW9mKHByb2NuYW1lKSk7Ci0JcHJvY25hbWVbc2l6ZW9mKHByb2NuYW1lKSAtIDFdID0gMDsKLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnY5c2VzLT5yZWFkX3dhaXQpOwotCWluaXRfY29tcGxldGlvbigmdjlzZXMtPmZjcmVhZCk7Ci0JaW5pdF9jb21wbGV0aW9uKCZ2OXNlcy0+cHJvY2NtcGwpOwotCXNwaW5fbG9ja19pbml0KCZ2OXNlcy0+bXV4bG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJnY5c2VzLT5tdXhfZmNhbGxzKTsKLQl2OXNlcy0+cmVjdnByb2MgPSBOVUxMOwotCXY5c2VzLT5jdXJmY2FsbCA9IE5VTEw7Ci0KLQl2OXNlcy0+cmVjdnByb2MgPSBrdGhyZWFkX2NyZWF0ZSh2OWZzX3JlY3Zwcm9jLCB2OXNlcywKLQkJCQkJICJ2OWZzX3JlY3Zwcm9jICVzIiwgcHJvY25hbWUpOwotCi0JaWYgKElTX0VSUih2OXNlcy0+cmVjdnByb2MpKSB7Ci0JCWVwcmludGsoS0VSTl9FUlIsICJjYW5ub3QgY3JlYXRlIHJlY2VpdmluZyB0aHJlYWRcbiIpOwotCQl2OWZzX3Nlc3Npb25fY2xvc2UodjlzZXMpOwotCQlyZXR1cm4gLUVDT05OQUJPUlRFRDsKKwlpZiAoIWxpc3RfZW1wdHkoJm0tPnJlcV9saXN0KSkgeworCQkvKiB3YWl0IHVudGlsIGFsbCBwcm9jZXNzZXMgd2FpdGluZyBvbiB0aGlzIHNlc3Npb24gZXhpdCAqLworCQlkcHJpbnRrKERFQlVHX01VWCwgIm11eCAlcCB3YWl0aW5nIGZvciBlbXB0eSByZXF1ZXN0IHF1ZXVlXG4iLAorCQkJbSk7CisJCXdhaXRfZXZlbnRfdGltZW91dChtLT5lcXVldWUsIChsaXN0X2VtcHR5KCZtLT5yZXFfbGlzdCkpLCA1MDAwKTsKKwkJZHByaW50ayhERUJVR19NVVgsICJtdXggJXAgcmVxdWVzdCBxdWV1ZSBlbXB0eTogJWRcbiIsIG0sCisJCQlsaXN0X2VtcHR5KCZtLT5yZXFfbGlzdCkpOwogCX0KIAotCXdha2VfdXBfcHJvY2Vzcyh2OXNlcy0+cmVjdnByb2MpOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJnY5c2VzLT5wcm9jY21wbCk7CisJdjlmc19tdXhfcG9sbF9zdG9wKG0pOworCW0tPnRyYW5zID0gTlVMTDsKIAorCWtmcmVlKG0pOworfQorCisvKioKKyAqIHY5ZnNfcG9sbHdhaXQgLSBjYWxsZWQgYnkgZmlsZXMgcG9sbCBvcGVyYXRpb24gdG8gYWRkIHY5ZnMtcG9sbCB0YXNrCisgKiAJdG8gZmlsZXMgd2FpdCBxdWV1ZQorICovCitzdGF0aWMgdm9pZAordjlmc19wb2xsd2FpdChzdHJ1Y3QgZmlsZSAqZmlscCwgd2FpdF9xdWV1ZV9oZWFkX3QgKiB3YWl0X2FkZHJlc3MsCisJICAgICAgcG9sbF90YWJsZSAqIHApCit7CisJaW50IGk7CisJc3RydWN0IHY5ZnNfbXV4X2RhdGEgKm07CisKKwltID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCB2OWZzX211eF9kYXRhLCBwdCk7CisJZm9yKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtLT5wb2xsX3dhZGRyKTsgaSsrKQorCQlpZiAobS0+cG9sbF93YWRkcltpXSA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwlpZiAoaSA+PSBBUlJBWV9TSVpFKG0tPnBvbGxfd2FkZHIpKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJub3QgZW5vdWdoIHdhaXRfYWRkcmVzcyBzbG90c1xuIik7CisJCXJldHVybjsKKwl9CisKKwltLT5wb2xsX3dhZGRyW2ldID0gd2FpdF9hZGRyZXNzOworCisJaWYgKCF3YWl0X2FkZHJlc3MpIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgIm5vIHdhaXRfYWRkcmVzc1xuIik7CisJCW0tPnBvbGxfd2FkZHJbaV0gPSBFUlJfUFRSKC1FSU8pOworCQlyZXR1cm47CisJfQorCisJaW5pdF93YWl0cXVldWVfZW50cnkoJm0tPnBvbGxfd2FpdFtpXSwgbS0+cG9sbF90YXNrLT50YXNrKTsKKwlhZGRfd2FpdF9xdWV1ZSh3YWl0X2FkZHJlc3MsICZtLT5wb2xsX3dhaXRbaV0pOworfQorCisvKioKKyAqIHY5ZnNfcG9sbF9tdXggLSBwb2xscyBhIG11eCBhbmQgc2NoZWR1bGVzIHJlYWQgb3Igd3JpdGUgd29ya3MgaWYgbmVjZXNzYXJ5CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB2OWZzX3BvbGxfbXV4KHN0cnVjdCB2OWZzX211eF9kYXRhICptKQoreworCWludCBuOworCisJaWYgKG0tPmVyciA8IDApCisJCXJldHVybjsKKworCW4gPSBtLT50cmFucy0+cG9sbChtLT50cmFucywgTlVMTCk7CisJaWYgKG4gPCAwIHx8IG4gJiAoUE9MTEVSUiB8IFBPTExIVVAgfCBQT0xMTlZBTCkpIHsKKwkJZHByaW50ayhERUJVR19NVVgsICJlcnJvciBtdXggJXAgZXJyICVkXG4iLCBtLCBuKTsKKwkJaWYgKG4gPj0gMCkKKwkJCW4gPSAtRUNPTk5SRVNFVDsKKwkJdjlmc19tdXhfY2FuY2VsKG0sIG4pOworCX0KKworCWlmIChuICYgUE9MTElOKSB7CisJCXNldF9iaXQoUnBlbmRpbmcsICZtLT53c2NoZWQpOworCQlkcHJpbnRrKERFQlVHX01VWCwgIm11eCAlcCBjYW4gcmVhZFxuIiwgbSk7CisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChSd29ya3NjaGVkLCAmbS0+d3NjaGVkKSkgeworCQkJZHByaW50ayhERUJVR19NVVgsICJzY2hlZHVsZSByZWFkIHdvcmsgbXV4ICVwXG4iLCBtKTsKKwkJCXF1ZXVlX3dvcmsodjlmc19tdXhfd3EsICZtLT5ycSk7CisJCX0KKwl9CisKKwlpZiAobiAmIFBPTExPVVQpIHsKKwkJc2V0X2JpdChXcGVuZGluZywgJm0tPndzY2hlZCk7CisJCWRwcmludGsoREVCVUdfTVVYLCAibXV4ICVwIGNhbiB3cml0ZVxuIiwgbSk7CisJCWlmICgobS0+d3NpemUgfHwgIWxpc3RfZW1wdHkoJm0tPnVuc2VudF9yZXFfbGlzdCkpCisJCSAgICAmJiAhdGVzdF9hbmRfc2V0X2JpdChXd29ya3NjaGVkLCAmbS0+d3NjaGVkKSkgeworCQkJZHByaW50ayhERUJVR19NVVgsICJzY2hlZHVsZSB3cml0ZSB3b3JrIG11eCAlcFxuIiwgbSk7CisJCQlxdWV1ZV93b3JrKHY5ZnNfbXV4X3dxLCAmbS0+d3EpOworCQl9CisJfQorfQorCisvKioKKyAqIHY5ZnNfcG9sbF9wcm9jIC0gcG9sbHMgYWxsIHY5ZnMgdHJhbnNwb3J0cyBmb3IgbmV3IGV2ZW50cyBhbmQgcXVldWVzCisgKiAJdGhlIGFwcHJvcHJpYXRlIHdvcmsgdG8gdGhlIHdvcmsgcXVldWUKKyAqLworc3RhdGljIGludCB2OWZzX3BvbGxfcHJvYyh2b2lkICphKQoreworCXN0cnVjdCB2OWZzX211eF9kYXRhICptLCAqbXRtcDsKKwlzdHJ1Y3Qgdjlmc19tdXhfcG9sbF90YXNrICp2cHQ7CisKKwl2cHQgPSBhOworCWRwcmludGsoREVCVUdfTVVYLCAic3RhcnQgJXAgJXBcbiIsIGN1cnJlbnQsIHZwdCk7CisJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtLCBtdG1wLCAmdnB0LT5tdXhfbGlzdCwgbXV4X2xpc3QpIHsKKwkJCXY5ZnNfcG9sbF9tdXgobSk7CisJCX0KKworCQlkcHJpbnRrKERFQlVHX01VWCwgInNsZWVwaW5nLi4uXG4iKTsKKwkJc2NoZWR1bGVfdGltZW91dChTQ0hFRF9USU1FT1VUICogSFopOworCX0KKworCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlkcHJpbnRrKERFQlVHX01VWCwgImZpbmlzaFxuIik7CiAJcmV0dXJuIDA7CiB9CisKKy8qKgorICogdjlmc193cml0ZV93b3JrIC0gY2FsbGVkIHdoZW4gYSB0cmFuc3BvcnQgY2FuIHNlbmQgc29tZSBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIHY5ZnNfd3JpdGVfd29yayh2b2lkICphKQoreworCWludCBuLCBlcnI7CisJc3RydWN0IHY5ZnNfbXV4X2RhdGEgKm07CisJc3RydWN0IHY5ZnNfcmVxICpyZXE7CisKKwltID0gYTsKKworCWlmIChtLT5lcnIgPCAwKSB7CisJCWNsZWFyX2JpdChXd29ya3NjaGVkLCAmbS0+d3NjaGVkKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghbS0+d3NpemUpIHsKKwkJaWYgKGxpc3RfZW1wdHkoJm0tPnVuc2VudF9yZXFfbGlzdCkpIHsKKwkJCWNsZWFyX2JpdChXd29ya3NjaGVkLCAmbS0+d3NjaGVkKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXNwaW5fbG9jaygmbS0+bG9jayk7CisJCXJlcSA9CisJCSAgICBsaXN0X2VudHJ5KG0tPnVuc2VudF9yZXFfbGlzdC5uZXh0LCBzdHJ1Y3Qgdjlmc19yZXEsCisJCQkgICAgICAgcmVxX2xpc3QpOworCQlsaXN0X21vdmVfdGFpbCgmcmVxLT5yZXFfbGlzdCwgJm0tPnJlcV9saXN0KTsKKwkJbS0+d2J1ZiA9IHJlcS0+dGNhbGwtPnNkYXRhOworCQltLT53c2l6ZSA9IHJlcS0+dGNhbGwtPnNpemU7CisJCW0tPndwb3MgPSAwOworCQlkdW1wX2RhdGEobS0+d2J1ZiwgbS0+d3NpemUpOworCQlzcGluX3VubG9jaygmbS0+bG9jayk7CisJfQorCisJZHByaW50ayhERUJVR19NVVgsICJtdXggJXAgcG9zICVkIHNpemUgJWRcbiIsIG0sIG0tPndwb3MsIG0tPndzaXplKTsKKwljbGVhcl9iaXQoV3BlbmRpbmcsICZtLT53c2NoZWQpOworCWVyciA9IG0tPnRyYW5zLT53cml0ZShtLT50cmFucywgbS0+d2J1ZiArIG0tPndwb3MsIG0tPndzaXplIC0gbS0+d3Bvcyk7CisJZHByaW50ayhERUJVR19NVVgsICJtdXggJXAgc2VudCAlZCBieXRlc1xuIiwgbSwgZXJyKTsKKwlpZiAoZXJyID09IC1FQUdBSU4pIHsKKwkJY2xlYXJfYml0KFd3b3Jrc2NoZWQsICZtLT53c2NoZWQpOworCQlyZXR1cm47CisJfQorCisJaWYgKGVyciA8PSAwKQorCQlnb3RvIGVycm9yOworCisJbS0+d3BvcyArPSBlcnI7CisJaWYgKG0tPndwb3MgPT0gbS0+d3NpemUpCisJCW0tPndwb3MgPSBtLT53c2l6ZSA9IDA7CisKKwlpZiAobS0+d3NpemUgPT0gMCAmJiAhbGlzdF9lbXB0eSgmbS0+dW5zZW50X3JlcV9saXN0KSkgeworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFdwZW5kaW5nLCAmbS0+d3NjaGVkKSkKKwkJCW4gPSBQT0xMT1VUOworCQllbHNlCisJCQluID0gbS0+dHJhbnMtPnBvbGwobS0+dHJhbnMsIE5VTEwpOworCisJCWlmIChuICYgUE9MTE9VVCkgeworCQkJZHByaW50ayhERUJVR19NVVgsICJzY2hlZHVsZSB3cml0ZSB3b3JrIG11eCAlcFxuIiwgbSk7CisJCQlxdWV1ZV93b3JrKHY5ZnNfbXV4X3dxLCAmbS0+d3EpOworCQl9IGVsc2UKKwkJCWNsZWFyX2JpdChXd29ya3NjaGVkLCAmbS0+d3NjaGVkKTsKKwl9IGVsc2UKKwkJY2xlYXJfYml0KFd3b3Jrc2NoZWQsICZtLT53c2NoZWQpOworCisJcmV0dXJuOworCisgICAgICBlcnJvcjoKKwl2OWZzX211eF9jYW5jZWwobSwgZXJyKTsKKwljbGVhcl9iaXQoV3dvcmtzY2hlZCwgJm0tPndzY2hlZCk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfcmVxdWVzdChzdHJ1Y3Qgdjlmc19tdXhfZGF0YSAqbSwgc3RydWN0IHY5ZnNfcmVxICpyZXEpCit7CisJaW50IGVjb2RlLCB0YWc7CisJc3RydWN0IHY5ZnNfc3RyICplbmFtZTsKKworCXRhZyA9IHJlcS0+dGFnOworCWlmIChyZXEtPnJjYWxsLT5pZCA9PSBSRVJST1IgJiYgIXJlcS0+ZXJyKSB7CisJCWVjb2RlID0gcmVxLT5yY2FsbC0+cGFyYW1zLnJlcnJvci5lcnJubzsKKwkJZW5hbWUgPSAmcmVxLT5yY2FsbC0+cGFyYW1zLnJlcnJvci5lcnJvcjsKKworCQlkcHJpbnRrKERFQlVHX01VWCwgIlJlcnJvciAlLipzXG4iLCBlbmFtZS0+bGVuLCBlbmFtZS0+c3RyKTsKKworCQlpZiAoKm0tPmV4dGVuZGVkKQorCQkJcmVxLT5lcnIgPSAtZWNvZGU7CisKKwkJaWYgKCFyZXEtPmVycikgeworCQkJcmVxLT5lcnIgPSB2OWZzX2VycnN0cjJlcnJubyhlbmFtZS0+c3RyLCBlbmFtZS0+bGVuKTsKKworCQkJaWYgKCFyZXEtPmVycikgewkvKiBzdHJpbmcgbWF0Y2ggZmFpbGVkICovCisJCQkJUFJJTlRfRkNBTExfRVJST1IoInVua25vd24gZXJyb3IiLCByZXEtPnJjYWxsKTsKKwkJCX0KKworCQkJaWYgKCFyZXEtPmVycikKKwkJCQlyZXEtPmVyciA9IC1FU0VSVkVSRkFVTFQ7CisJCX0KKwl9IGVsc2UgaWYgKHJlcS0+dGNhbGwgJiYgcmVxLT5yY2FsbC0+aWQgIT0gcmVxLT50Y2FsbC0+aWQgKyAxKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJmY2FsbCBtaXNtYXRjaDogZXhwZWN0ZWQgJWQsIGdvdCAlZFxuIiwKKwkJCXJlcS0+dGNhbGwtPmlkICsgMSwgcmVxLT5yY2FsbC0+aWQpOworCQlpZiAoIXJlcS0+ZXJyKQorCQkJcmVxLT5lcnIgPSAtRUlPOworCX0KKworCWlmIChyZXEtPmNiICYmIHJlcS0+ZXJyICE9IEVSUkVRRkxVU0gpIHsKKwkJZHByaW50ayhERUJVR19NVVgsICJjYWxsaW5nIGNhbGxiYWNrIHRjYWxsICVwIHJjYWxsICVwXG4iLAorCQkJcmVxLT50Y2FsbCwgcmVxLT5yY2FsbCk7CisKKwkJKCpyZXEtPmNiKSAocmVxLT5jYmEsIHJlcS0+dGNhbGwsIHJlcS0+cmNhbGwsIHJlcS0+ZXJyKTsKKwkJcmVxLT5jYiA9IE5VTEw7CisJfSBlbHNlCisJCWtmcmVlKHJlcS0+cmNhbGwpOworCisJdjlmc19tdXhfcHV0X3RhZyhtLCB0YWcpOworCisJd2FrZV91cCgmbS0+ZXF1ZXVlKTsKKwlrZnJlZShyZXEpOworfQorCisvKioKKyAqIHY5ZnNfcmVhZF93b3JrIC0gY2FsbGVkIHdoZW4gdGhlcmUgaXMgc29tZSBkYXRhIHRvIGJlIHJlYWQgZnJvbSBhIHRyYW5zcG9ydAorICovCitzdGF0aWMgdm9pZCB2OWZzX3JlYWRfd29yayh2b2lkICphKQoreworCWludCBuLCBlcnI7CisJc3RydWN0IHY5ZnNfbXV4X2RhdGEgKm07CisJc3RydWN0IHY5ZnNfcmVxICpyZXEsICpycHRyLCAqcnJlcTsKKwlzdHJ1Y3Qgdjlmc19mY2FsbCAqcmNhbGw7CisJY2hhciAqcmJ1ZjsKKworCW0gPSBhOworCisJaWYgKG0tPmVyciA8IDApCisJCXJldHVybjsKKworCXJjYWxsID0gTlVMTDsKKwlkcHJpbnRrKERFQlVHX01VWCwgInN0YXJ0IG11eCAlcCBwb3MgJWRcbiIsIG0sIG0tPnJwb3MpOworCisJaWYgKCFtLT5yY2FsbCkgeworCQltLT5yY2FsbCA9CisJCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdjlmc19mY2FsbCkgKyBtLT5tc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghbS0+cmNhbGwpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJbS0+cmJ1ZiA9IChjaGFyICopbS0+cmNhbGwgKyBzaXplb2Yoc3RydWN0IHY5ZnNfZmNhbGwpOworCQltLT5ycG9zID0gMDsKKwl9CisKKwljbGVhcl9iaXQoUnBlbmRpbmcsICZtLT53c2NoZWQpOworCWVyciA9IG0tPnRyYW5zLT5yZWFkKG0tPnRyYW5zLCBtLT5yYnVmICsgbS0+cnBvcywgbS0+bXNpemUgLSBtLT5ycG9zKTsKKwlkcHJpbnRrKERFQlVHX01VWCwgIm11eCAlcCBnb3QgJWQgYnl0ZXNcbiIsIG0sIGVycik7CisJaWYgKGVyciA9PSAtRUFHQUlOKSB7CisJCWNsZWFyX2JpdChSd29ya3NjaGVkLCAmbS0+d3NjaGVkKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChlcnIgPD0gMCkKKwkJZ290byBlcnJvcjsKKworCW0tPnJwb3MgKz0gZXJyOworCXdoaWxlIChtLT5ycG9zID4gNCkgeworCQluID0gbGUzMl90b19jcHUoKihfX2xlMzIgKikgbS0+cmJ1Zik7CisJCWlmIChuID49IG0tPm1zaXplKSB7CisJCQlkcHJpbnRrKERFQlVHX0VSUk9SLAorCQkJCSJyZXF1ZXN0ZWQgcGFja2V0IHNpemUgdG9vIGJpZzogJWRcbiIsIG4pOworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlpZiAobS0+cnBvcyA8IG4pCisJCQlicmVhazsKKworCQlkdW1wX2RhdGEobS0+cmJ1Ziwgbik7CisJCWVyciA9CisJCSAgICB2OWZzX2Rlc2VyaWFsaXplX2ZjYWxsKG0tPnJidWYsIG4sIG0tPnJjYWxsLCAqbS0+ZXh0ZW5kZWQpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCXJjYWxsID0gbS0+cmNhbGw7CisJCXJidWYgPSBtLT5yYnVmOworCQlpZiAobS0+cnBvcyA+IG4pIHsKKwkJCW0tPnJjYWxsID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHY5ZnNfZmNhbGwpICsgbS0+bXNpemUsCisJCQkJCSAgIEdGUF9LRVJORUwpOworCQkJaWYgKCFtLT5yY2FsbCkgeworCQkJCWVyciA9IC1FTk9NRU07CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKworCQkJbS0+cmJ1ZiA9IChjaGFyICopbS0+cmNhbGwgKyBzaXplb2Yoc3RydWN0IHY5ZnNfZmNhbGwpOworCQkJbWVtbW92ZShtLT5yYnVmLCByYnVmICsgbiwgbS0+cnBvcyAtIG4pOworCQkJbS0+cnBvcyAtPSBuOworCQl9IGVsc2UgeworCQkJbS0+cmNhbGwgPSBOVUxMOworCQkJbS0+cmJ1ZiA9IE5VTEw7CisJCQltLT5ycG9zID0gMDsKKwkJfQorCisJCWRwcmludGsoREVCVUdfTVVYLCAibXV4ICVwIGZjYWxsIGlkICVkIHRhZyAlZFxuIiwgbSwgcmNhbGwtPmlkLAorCQkJcmNhbGwtPnRhZyk7CisKKwkJcmVxID0gTlVMTDsKKwkJc3Bpbl9sb2NrKCZtLT5sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJyZXEsIHJwdHIsICZtLT5yZXFfbGlzdCwgcmVxX2xpc3QpIHsKKwkJCWlmIChycmVxLT50YWcgPT0gcmNhbGwtPnRhZykgeworCQkJCXJlcSA9IHJyZXE7CisJCQkJcmVxLT5yY2FsbCA9IHJjYWxsOworCQkJCWxpc3RfZGVsKCZyZXEtPnJlcV9saXN0KTsKKwkJCQlzcGluX3VubG9jaygmbS0+bG9jayk7CisJCQkJcHJvY2Vzc19yZXF1ZXN0KG0sIHJlcSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJfQorCisJCWlmICghcmVxKSB7CisJCQlzcGluX3VubG9jaygmbS0+bG9jayk7CisJCQlpZiAoZXJyID49IDAgJiYgcmNhbGwtPmlkICE9IFJGTFVTSCkKKwkJCQlkcHJpbnRrKERFQlVHX0VSUk9SLAorCQkJCQkidW5leHBlY3RlZCByZXNwb25zZSBtdXggJXAgaWQgJWQgdGFnICVkXG4iLAorCQkJCQltLCByY2FsbC0+aWQsIHJjYWxsLT50YWcpOworCQkJa2ZyZWUocmNhbGwpOworCQl9CisJfQorCisJaWYgKCFsaXN0X2VtcHR5KCZtLT5yZXFfbGlzdCkpIHsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChScGVuZGluZywgJm0tPndzY2hlZCkpCisJCQluID0gUE9MTElOOworCQllbHNlCisJCQluID0gbS0+dHJhbnMtPnBvbGwobS0+dHJhbnMsIE5VTEwpOworCisJCWlmIChuICYgUE9MTElOKSB7CisJCQlkcHJpbnRrKERFQlVHX01VWCwgInNjaGVkdWxlIHJlYWQgd29yayBtdXggJXBcbiIsIG0pOworCQkJcXVldWVfd29yayh2OWZzX211eF93cSwgJm0tPnJxKTsKKwkJfSBlbHNlCisJCQljbGVhcl9iaXQoUndvcmtzY2hlZCwgJm0tPndzY2hlZCk7CisJfSBlbHNlCisJCWNsZWFyX2JpdChSd29ya3NjaGVkLCAmbS0+d3NjaGVkKTsKKworCXJldHVybjsKKworICAgICAgZXJyb3I6CisJdjlmc19tdXhfY2FuY2VsKG0sIGVycik7CisJY2xlYXJfYml0KFJ3b3Jrc2NoZWQsICZtLT53c2NoZWQpOworfQorCisvKioKKyAqIHY5ZnNfc2VuZF9yZXF1ZXN0IC0gc2VuZCA5UCByZXF1ZXN0CisgKiBUaGUgZnVuY3Rpb24gY2FuIHNsZWVwIHVudGlsIHRoZSByZXF1ZXN0IGlzIHNjaGVkdWxlZCBmb3Igc2VuZGluZy4KKyAqIFRoZSBmdW5jdGlvbiBjYW4gYmUgaW50ZXJydXB0ZWQuIFJldHVybiBmcm9tIHRoZSBmdW5jdGlvbiBpcyBub3QKKyAqIGEgZ3VhcmFudGVlIHRoYXQgdGhlIHJlcXVlc3QgaXMgc2VudCBzdWNjZXNmdWxseS4gQ2FuIHJldHVybiBlcnJvcnMKKyAqIHRoYXQgY2FuIGJlIHJldHJpZXZlZCBieSBQVFJfRVJSIG1hY3Jvcy4KKyAqCisgKiBAbTogbXV4IGRhdGEKKyAqIEB0YzogcmVxdWVzdCB0byBiZSBzZW50CisgKiBAY2I6IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiByZXNwb25zZSBpcyByZWNlaXZlZAorICogQGNiYTogcGFyYW1ldGVyIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgdjlmc19yZXEgKnY5ZnNfc2VuZF9yZXF1ZXN0KHN0cnVjdCB2OWZzX211eF9kYXRhICptLAorCQkJCQkgIHN0cnVjdCB2OWZzX2ZjYWxsICp0YywKKwkJCQkJICB2OWZzX211eF9yZXFfY2FsbGJhY2sgY2IsIHZvaWQgKmNiYSkKK3sKKwlpbnQgbjsKKwlzdHJ1Y3Qgdjlmc19yZXEgKnJlcTsKKworCWRwcmludGsoREVCVUdfTVVYLCAibXV4ICVwIHRhc2sgJXAgdGNhbGwgJXAgaWQgJWRcbiIsIG0sIGN1cnJlbnQsCisJCXRjLCB0Yy0+aWQpOworCWlmIChtLT5lcnIgPCAwKQorCQlyZXR1cm4gRVJSX1BUUihtLT5lcnIpOworCisJcmVxID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHY5ZnNfcmVxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXEpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWYgKHRjLT5pZCA9PSBUVkVSU0lPTikKKwkJbiA9IFY5RlNfTk9UQUc7CisJZWxzZQorCQluID0gdjlmc19tdXhfZ2V0X3RhZyhtKTsKKworCWlmIChuIDwgMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwl2OWZzX3NldF90YWcodGMsIG4pOworCisJcmVxLT50YWcgPSBuOworCXJlcS0+dGNhbGwgPSB0YzsKKwlyZXEtPnJjYWxsID0gTlVMTDsKKwlyZXEtPmVyciA9IDA7CisJcmVxLT5jYiA9IGNiOworCXJlcS0+Y2JhID0gY2JhOworCisJc3Bpbl9sb2NrKCZtLT5sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZyZXEtPnJlcV9saXN0LCAmbS0+dW5zZW50X3JlcV9saXN0KTsKKwlzcGluX3VubG9jaygmbS0+bG9jayk7CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFdwZW5kaW5nLCAmbS0+d3NjaGVkKSkKKwkJbiA9IFBPTExPVVQ7CisJZWxzZQorCQluID0gbS0+dHJhbnMtPnBvbGwobS0+dHJhbnMsIE5VTEwpOworCisJaWYgKG4gJiBQT0xMT1VUICYmICF0ZXN0X2FuZF9zZXRfYml0KFd3b3Jrc2NoZWQsICZtLT53c2NoZWQpKQorCQlxdWV1ZV93b3JrKHY5ZnNfbXV4X3dxLCAmbS0+d3EpOworCisJcmV0dXJuIHJlcTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit2OWZzX211eF9mbHVzaF9jYih2b2lkICphLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqdGMsIHN0cnVjdCB2OWZzX2ZjYWxsICpyYywKKwkJICBpbnQgZXJyKQoreworCXY5ZnNfbXV4X3JlcV9jYWxsYmFjayBjYjsKKwlpbnQgdGFnOworCXN0cnVjdCB2OWZzX211eF9kYXRhICptOworCXN0cnVjdCB2OWZzX3JlcSAqcmVxLCAqcnB0cjsKKworCW0gPSBhOworCWRwcmludGsoREVCVUdfTVVYLCAibXV4ICVwIHRjICVwIHJjICVwIGVyciAlZCBvbGR0YWcgJWRcbiIsIG0sIHRjLAorCQlyYywgZXJyLCB0Yy0+cGFyYW1zLnRmbHVzaC5vbGR0YWcpOworCisJc3Bpbl9sb2NrKCZtLT5sb2NrKTsKKwljYiA9IE5VTEw7CisJdGFnID0gdGMtPnBhcmFtcy50Zmx1c2gub2xkdGFnOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIHJwdHIsICZtLT5yZXFfbGlzdCwgcmVxX2xpc3QpIHsKKwkJaWYgKHJlcS0+dGFnID09IHRhZykgeworCQkJbGlzdF9kZWwoJnJlcS0+cmVxX2xpc3QpOworCQkJaWYgKHJlcS0+Y2IpIHsKKwkJCQljYiA9IHJlcS0+Y2I7CisJCQkJcmVxLT5jYiA9IE5VTEw7CisJCQkJc3Bpbl91bmxvY2soJm0tPmxvY2spOworCQkJCSgqY2IpIChyZXEtPmNiYSwgcmVxLT50Y2FsbCwgcmVxLT5yY2FsbCwKKwkJCQkgICAgICAgcmVxLT5lcnIpOworCQkJfQorCQkJa2ZyZWUocmVxKTsKKwkJCXdha2VfdXAoJm0tPmVxdWV1ZSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghY2IpCisJCXNwaW5fdW5sb2NrKCZtLT5sb2NrKTsKKworCXY5ZnNfbXV4X3B1dF90YWcobSwgdGFnKTsKKwlrZnJlZSh0Yyk7CisJa2ZyZWUocmMpOworfQorCitzdGF0aWMgdm9pZAordjlmc19tdXhfZmx1c2hfcmVxdWVzdChzdHJ1Y3Qgdjlmc19tdXhfZGF0YSAqbSwgc3RydWN0IHY5ZnNfcmVxICpyZXEpCit7CisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjOworCisJZHByaW50ayhERUJVR19NVVgsICJtdXggJXAgcmVxICVwIHRhZyAlZFxuIiwgbSwgcmVxLCByZXEtPnRhZyk7CisKKwlmYyA9IHY5ZnNfY3JlYXRlX3RmbHVzaChyZXEtPnRhZyk7CisJdjlmc19zZW5kX3JlcXVlc3QobSwgZmMsIHY5ZnNfbXV4X2ZsdXNoX2NiLCBtKTsKK30KKworc3RhdGljIHZvaWQKK3Y5ZnNfbXV4X3JwY19jYih2b2lkICphLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqdGMsIHN0cnVjdCB2OWZzX2ZjYWxsICpyYywgaW50IGVycikKK3sKKwlzdHJ1Y3Qgdjlmc19tdXhfcnBjICpyOworCisJaWYgKGVyciA9PSBFUlJFUUZMVVNIKSB7CisJCWRwcmludGsoREVCVUdfTVVYLCAiZXJyIHJlcSBmbHVzaFxuIik7CisJCXJldHVybjsKKwl9CisKKwlyID0gYTsKKwlkcHJpbnRrKERFQlVHX01VWCwgIm11eCAlcCByZXEgJXAgdGMgJXAgcmMgJXAgZXJyICVkXG4iLCByLT5tLCByLT5yZXEsCisJCXRjLCByYywgZXJyKTsKKwlyLT5yY2FsbCA9IHJjOworCXItPmVyciA9IGVycjsKKwl3YWtlX3VwKCZyLT53cXVldWUpOworfQorCisvKioKKyAqIHY5ZnNfbXV4X3JwYyAtIHNlbmRzIDlQIHJlcXVlc3QgYW5kIHdhaXRzIHVudGlsIGEgcmVzcG9uc2UgaXMgYXZhaWxhYmxlLgorICoJVGhlIGZ1bmN0aW9uIGNhbiBiZSBpbnRlcnJ1cHRlZC4KKyAqIEBtOiBtdXggZGF0YQorICogQHRjOiByZXF1ZXN0IHRvIGJlIHNlbnQKKyAqIEByYzogcG9pbnRlciB3aGVyZSBhIHBvaW50ZXIgdG8gdGhlIHJlc3BvbnNlIGlzIHN0b3JlZAorICovCitpbnQKK3Y5ZnNfbXV4X3JwYyhzdHJ1Y3Qgdjlmc19tdXhfZGF0YSAqbSwgc3RydWN0IHY5ZnNfZmNhbGwgKnRjLAorCSAgICAgc3RydWN0IHY5ZnNfZmNhbGwgKipyYykKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHY5ZnNfcmVxICpyZXE7CisJc3RydWN0IHY5ZnNfbXV4X3JwYyByOworCisJci5lcnIgPSAwOworCXIucmNhbGwgPSBOVUxMOworCXIubSA9IG07CisJaW5pdF93YWl0cXVldWVfaGVhZCgmci53cXVldWUpOworCisJaWYgKHJjKQorCQkqcmMgPSBOVUxMOworCisJcmVxID0gdjlmc19zZW5kX3JlcXVlc3QobSwgdGMsIHY5ZnNfbXV4X3JwY19jYiwgJnIpOworCWlmIChJU19FUlIocmVxKSkgeworCQllcnIgPSBQVFJfRVJSKHJlcSk7CisJCWRwcmludGsoREVCVUdfTVVYLCAiZXJyb3IgJWRcbiIsIGVycik7CisJCXJldHVybiBQVFJfRVJSKHJlcSk7CisJfQorCisJci5yZXEgPSByZXE7CisJZHByaW50ayhERUJVR19NVVgsICJtdXggJXAgdGMgJXAgdGFnICVkIHJwYyAlcCByZXEgJXBcbiIsIG0sIHRjLAorCQlyZXEtPnRhZywgJnIsIHJlcSk7CisJZXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHIud3F1ZXVlLCByLnJjYWxsICE9IE5VTEwgfHwgci5lcnIgPCAwKTsKKwlpZiAoci5lcnIgPCAwKQorCQllcnIgPSByLmVycjsKKworCWlmIChlcnIgPT0gLUVSRVNUQVJUU1lTICYmIG0tPnRyYW5zLT5zdGF0dXMgPT0gQ29ubmVjdGVkICYmIG0tPmVyciA9PSAwKSB7CisJCXNwaW5fbG9jaygmbS0+bG9jayk7CisJCXJlcS0+dGNhbGwgPSBOVUxMOworCQlyZXEtPmVyciA9IEVSUkVRRkxVU0g7CisJCXNwaW5fdW5sb2NrKCZtLT5sb2NrKTsKKworCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfU0lHUEVORElORyk7CisJCXY5ZnNfbXV4X2ZsdXNoX3JlcXVlc3QobSwgcmVxKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKKwkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCX0KKworCWlmICghZXJyKSB7CisJCWlmIChyLnJjYWxsKQorCQkJZHByaW50ayhERUJVR19NVVgsICJnb3QgcmVzcG9uc2UgaWQgJWQgdGFnICVkXG4iLAorCQkJCXIucmNhbGwtPmlkLCByLnJjYWxsLT50YWcpOworCisJCWlmIChyYykKKwkJCSpyYyA9IHIucmNhbGw7CisJCWVsc2UKKwkJCWtmcmVlKHIucmNhbGwpOworCX0gZWxzZSB7CisJCWtmcmVlKHIucmNhbGwpOworCQlkcHJpbnRrKERFQlVHX01VWCwgImdvdCBlcnJvciAlZFxuIiwgZXJyKTsKKwkJaWYgKGVyciA+IDApCisJCQllcnIgPSAtRUlPOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogdjlmc19tdXhfcnBjbmIgLSBzZW5kcyA5UCByZXF1ZXN0IHdpdGhvdXQgd2FpdGluZyBmb3IgcmVzcG9uc2UuCisgKiBAbTogbXV4IGRhdGEKKyAqIEB0YzogcmVxdWVzdCB0byBiZSBzZW50CisgKiBAY2I6IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHJlc3BvbnNlIGFycml2ZXMKKyAqIEBjYmE6IHZhbHVlIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCisgKi8KK2ludCB2OWZzX211eF9ycGNuYihzdHJ1Y3Qgdjlmc19tdXhfZGF0YSAqbSwgc3RydWN0IHY5ZnNfZmNhbGwgKnRjLAorCQkgICB2OWZzX211eF9yZXFfY2FsbGJhY2sgY2IsIHZvaWQgKmEpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgdjlmc19yZXEgKnJlcTsKKworCXJlcSA9IHY5ZnNfc2VuZF9yZXF1ZXN0KG0sIHRjLCBjYiwgYSk7CisJaWYgKElTX0VSUihyZXEpKSB7CisJCWVyciA9IFBUUl9FUlIocmVxKTsKKwkJZHByaW50ayhERUJVR19NVVgsICJlcnJvciAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIFBUUl9FUlIocmVxKTsKKwl9CisKKwlkcHJpbnRrKERFQlVHX01VWCwgIm11eCAlcCB0YyAlcCB0YWcgJWRcbiIsIG0sIHRjLCByZXEtPnRhZyk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdjlmc19tdXhfY2FuY2VsIC0gY2FuY2VsIGFsbCBwZW5kaW5nIHJlcXVlc3RzIHdpdGggZXJyb3IKKyAqIEBtOiBtdXggZGF0YQorICogQGVycjogZXJyb3IgY29kZQorICovCit2b2lkIHY5ZnNfbXV4X2NhbmNlbChzdHJ1Y3Qgdjlmc19tdXhfZGF0YSAqbSwgaW50IGVycikKK3sKKwlzdHJ1Y3Qgdjlmc19yZXEgKnJlcSwgKnJ0bXA7CisJTElTVF9IRUFEKGNhbmNlbF9saXN0KTsKKworCWRwcmludGsoREVCVUdfTVVYLCAibXV4ICVwIGVyciAlZFxuIiwgbSwgZXJyKTsKKwltLT5lcnIgPSBlcnI7CisJc3Bpbl9sb2NrKCZtLT5sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCBydG1wLCAmbS0+cmVxX2xpc3QsIHJlcV9saXN0KSB7CisJCWxpc3RfbW92ZSgmcmVxLT5yZXFfbGlzdCwgJmNhbmNlbF9saXN0KTsKKwl9CisJc3Bpbl91bmxvY2soJm0tPmxvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgcnRtcCwgJmNhbmNlbF9saXN0LCByZXFfbGlzdCkgeworCQlsaXN0X2RlbCgmcmVxLT5yZXFfbGlzdCk7CisJCWlmICghcmVxLT5lcnIpCisJCQlyZXEtPmVyciA9IGVycjsKKworCQlpZiAocmVxLT5jYikKKwkJCSgqcmVxLT5jYikgKHJlcS0+Y2JhLCByZXEtPnRjYWxsLCByZXEtPnJjYWxsLCByZXEtPmVycik7CisJCWVsc2UKKwkJCWtmcmVlKHJlcS0+cmNhbGwpOworCisJCWtmcmVlKHJlcSk7CisJfQorCisJd2FrZV91cCgmbS0+ZXF1ZXVlKTsKK30KKworc3RhdGljIHUxNiB2OWZzX211eF9nZXRfdGFnKHN0cnVjdCB2OWZzX211eF9kYXRhICptKQoreworCWludCB0YWc7CisKKwl0YWcgPSB2OWZzX2dldF9pZHBvb2woJm0tPnRpZHBvb2wpOworCWlmICh0YWcgPCAwKQorCQlyZXR1cm4gVjlGU19OT1RBRzsKKwllbHNlCisJCXJldHVybiAodTE2KSB0YWc7Cit9CisKK3N0YXRpYyB2b2lkIHY5ZnNfbXV4X3B1dF90YWcoc3RydWN0IHY5ZnNfbXV4X2RhdGEgKm0sIHUxNiB0YWcpCit7CisJaWYgKHRhZyAhPSBWOUZTX05PVEFHICYmIHY5ZnNfY2hlY2tfaWRwb29sKHRhZywgJm0tPnRpZHBvb2wpKQorCQl2OWZzX3B1dF9pZHBvb2wodGFnLCAmbS0+dGlkcG9vbCk7Cit9CmRpZmYgLS1naXQgYS9mcy85cC9tdXguaCBiL2ZzLzlwL211eC5oCmluZGV4IDQ5OTRjYjEuLjk0NzNiODQgMTAwNjQ0Ci0tLSBhL2ZzLzlwL211eC5oCisrKyBiL2ZzLzlwL211eC5oCkBAIC0zLDYgKzMsNyBAQAogICoKICAqIE11bHRpcGxleGVyIERlZmluaXRpb25zCiAgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBieSBMYXRjaGVzYXIgSW9ua292IDxsdWNob0Bpb25rb3YubmV0PgogICogIENvcHlyaWdodCAoQykgMjAwNCBieSBFcmljIFZhbiBIZW5zYmVyZ2VuIDxlcmljdmhAZ21haWwuY29tPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMjMsMTkgKzI0LDM1IEBACiAgKgogICovCiAKLS8qIHN0cnVjdHVyZSB0byBtYW5hZ2UgZWFjaCBSUEMgdHJhbnNhY3Rpb24gKi8KK3N0cnVjdCB2OWZzX211eF9kYXRhOwogCi1zdHJ1Y3Qgdjlmc19ycGNyZXEgewotCXN0cnVjdCB2OWZzX2ZjYWxsICp0Y2FsbDsKLQlzdHJ1Y3Qgdjlmc19mY2FsbCAqcmNhbGw7Ci0JaW50IGVycjsJLyogZXJyb3IgY29kZSBpZiByZXNwb25zZSBmYWlsZWQgKi8KKy8qKgorICogdjlmc19tdXhfcmVxX2NhbGxiYWNrIC0gY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUKKyAqIHJlc3BvbnNlIG9mIGEgcmVxdWVzdCBpcyByZWNlaXZlZC4gVGhlIGNhbGxiYWNrIGlzIGNhbGxlZCBmcm9tCisgKiBhIHdvcmtxdWV1ZSBhbmQgc2hvdWxkbid0IGJsb2NrLgorICoKKyAqIEBhIC0gdGhlIHBvaW50ZXIgdGhhdCB3YXMgc3BlY2lmaWVkIHdoZW4gdGhlIHJlcXVlc3Qgd2FzIHNlbmQgdG8gYmUKKyAqICAgICAgcGFzc2VkIHRvIHRoZSBjYWxsYmFjaworICogQHRjIC0gcmVxdWVzdCBjYWxsCisgKiBAcmMgLSByZXNwb25zZSBjYWxsCisgKiBAZXJyIC0gZXJyb3IgY29kZSAobm9uLXplcm8gaWYgZXJyb3Igb2NjdXJlZCkKKyAqLwordHlwZWRlZiB2b2lkICgqdjlmc19tdXhfcmVxX2NhbGxiYWNrKSh2b2lkICphLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqdGMsCisJc3RydWN0IHY5ZnNfZmNhbGwgKnJjLCBpbnQgZXJyKTsKIAotCS8qIFhYWCAtIGNvdWxkIHdlIHB1dCBzY2F0dGVyL2dhdGhlciBidWZmZXJzIGhlcmU/ICovCitpbnQgdjlmc19tdXhfZ2xvYmFsX2luaXQodm9pZCk7Cit2b2lkIHY5ZnNfbXV4X2dsb2JhbF9leGl0KHZvaWQpOwogCi0Jc3RydWN0IGxpc3RfaGVhZCBuZXh0OwotfTsKK3N0cnVjdCB2OWZzX211eF9kYXRhICp2OWZzX211eF9pbml0KHN0cnVjdCB2OWZzX3RyYW5zcG9ydCAqdHJhbnMsIGludCBtc2l6ZSwKKwl1bnNpZ25lZCBjaGFyICpleHRlbmRlZCk7Cit2b2lkIHY5ZnNfbXV4X2Rlc3Ryb3koc3RydWN0IHY5ZnNfbXV4X2RhdGEgKik7CiAKLWludCB2OWZzX211eF9pbml0KHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIGNvbnN0IGNoYXIgKmRldl9uYW1lKTsKLWxvbmcgdjlmc19tdXhfcnBjKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsCi0JCSAgc3RydWN0IHY5ZnNfZmNhbGwgKnRjYWxsLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqKnJjYWxsKTsKLXZvaWQgdjlmc19tdXhfY2FuY2VsX3JlcXVlc3RzKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIGludCBlcnIpOworaW50IHY5ZnNfbXV4X3NlbmQoc3RydWN0IHY5ZnNfbXV4X2RhdGEgKm0sIHN0cnVjdCB2OWZzX2ZjYWxsICp0Yyk7CitzdHJ1Y3Qgdjlmc19mY2FsbCAqdjlmc19tdXhfcmVjdihzdHJ1Y3Qgdjlmc19tdXhfZGF0YSAqbSk7CitpbnQgdjlmc19tdXhfcnBjKHN0cnVjdCB2OWZzX211eF9kYXRhICptLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqdGMsIHN0cnVjdCB2OWZzX2ZjYWxsICoqcmMpOworaW50IHY5ZnNfbXV4X3JwY25iKHN0cnVjdCB2OWZzX211eF9kYXRhICptLCBzdHJ1Y3Qgdjlmc19mY2FsbCAqdGMsCisJdjlmc19tdXhfcmVxX2NhbGxiYWNrIGNiLCB2b2lkICphKTsKKwordm9pZCB2OWZzX211eF9mbHVzaChzdHJ1Y3Qgdjlmc19tdXhfZGF0YSAqbSwgaW50IHNlbmRmbHVzaCk7Cit2b2lkIHY5ZnNfbXV4X2NhbmNlbChzdHJ1Y3Qgdjlmc19tdXhfZGF0YSAqbSwgaW50IGVycik7CitpbnQgdjlmc19lcnJzdHIyZXJybm8oY2hhciAqZXJyc3RyLCBpbnQgbGVuKTsKZGlmZiAtLWdpdCBhL2ZzLzlwL3RyYW5zX2ZkLmMgYi9mcy85cC90cmFuc19mZC5jCmluZGV4IDYzYjU4Y2UuLjFhMjhlZjkgMTAwNjQ0Ci0tLSBhL2ZzLzlwL3RyYW5zX2ZkLmMKKysrIGIvZnMvOXAvdHJhbnNfZmQuYwpAQCAtMyw2ICszLDcgQEAKICAqCiAgKiBGaWxlIERlc2NyaXB0b3IgVHJhbnNwb3J0IExheWVyCiAgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBieSBMYXRjaGVzYXIgSW9ua292IDxsdWNob0Bpb25rb3YubmV0PgogICogIENvcHlyaWdodCAoQykgMjAwNSBieSBFcmljIFZhbiBIZW5zYmVyZ2VuIDxlcmljdmhAZ21haWwuY29tPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMTA2LDkgKzEwNyw2IEBACiAJCXJldHVybiAtRU5PUFJPVE9PUFQ7CiAJfQogCi0Jc2VtYV9pbml0KCZ0cmFucy0+d3JpdGVsb2NrLCAxKTsKLQlzZW1hX2luaXQoJnRyYW5zLT5yZWFkbG9jaywgMSk7Ci0KIAl0cyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2OWZzX3RyYW5zX2ZkKSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIXRzKQpAQCAtMTQ4LDEyICsxNDYsMTIgQEAKIAlpZiAoIXRyYW5zKQogCQlyZXR1cm47CiAKLQl0cmFucy0+c3RhdHVzID0gRGlzY29ubmVjdGVkOwotCXRzID0gdHJhbnMtPnByaXY7CisJdHMgPSB4Y2hnKCZ0cmFucy0+cHJpdiwgTlVMTCk7CiAKIAlpZiAoIXRzKQogCQlyZXR1cm47CiAKKwl0cmFucy0+c3RhdHVzID0gRGlzY29ubmVjdGVkOwogCWlmICh0cy0+aW5fZmlsZSkKIAkJZnB1dCh0cy0+aW5fZmlsZSk7CiAKQEAgLTE2MywxMCArMTYxLDU1IEBACiAJa2ZyZWUodHMpOwogfQogCitzdGF0aWMgdW5zaWduZWQgaW50Cit2OWZzX2ZkX3BvbGwoc3RydWN0IHY5ZnNfdHJhbnNwb3J0ICp0cmFucywgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICpwdCkKK3sKKwlpbnQgcmV0LCBuOworCXN0cnVjdCB2OWZzX3RyYW5zX2ZkICp0czsKKwltbV9zZWdtZW50X3Qgb2xkZnM7CisKKwlpZiAoIXRyYW5zKQorCQlyZXR1cm4gLUVJTzsKKworCXRzID0gdHJhbnMtPnByaXY7CisJaWYgKHRyYW5zLT5zdGF0dXMgIT0gQ29ubmVjdGVkIHx8ICF0cykKKwkJcmV0dXJuIC1FSU87CisKKwlvbGRmcyA9IGdldF9mcygpOworCXNldF9mcyhnZXRfZHMoKSk7CisKKwlpZiAoIXRzLT5pbl9maWxlLT5mX29wIHx8ICF0cy0+aW5fZmlsZS0+Zl9vcC0+cG9sbCkgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVuZDsKKwl9CisKKwlyZXQgPSB0cy0+aW5fZmlsZS0+Zl9vcC0+cG9sbCh0cy0+aW5fZmlsZSwgcHQpOworCisJaWYgKHRzLT5vdXRfZmlsZSAhPSB0cy0+aW5fZmlsZSkgeworCQlpZiAoIXRzLT5vdXRfZmlsZS0+Zl9vcCB8fCAhdHMtPm91dF9maWxlLT5mX29wLT5wb2xsKSB7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBlbmQ7CisJCX0KKworCQluID0gdHMtPm91dF9maWxlLT5mX29wLT5wb2xsKHRzLT5vdXRfZmlsZSwgcHQpOworCisJCXJldCAmPSB+UE9MTE9VVDsKKwkJbiAmPSB+UE9MTElOOworCisJCXJldCB8PSBuOworCX0KKworZW5kOgorCXNldF9mcyhvbGRmcyk7CisJcmV0dXJuIHJldDsKK30KKworCiBzdHJ1Y3Qgdjlmc190cmFuc3BvcnQgdjlmc190cmFuc19mZCA9IHsKIAkuaW5pdCA9IHY5ZnNfZmRfaW5pdCwKIAkud3JpdGUgPSB2OWZzX2ZkX3NlbmQsCiAJLnJlYWQgPSB2OWZzX2ZkX3JlY3YsCiAJLmNsb3NlID0gdjlmc19mZF9jbG9zZSwKKwkucG9sbCA9IHY5ZnNfZmRfcG9sbCwKIH07CiAKZGlmZiAtLWdpdCBhL2ZzLzlwL3RyYW5zX3NvY2suYyBiL2ZzLzlwL3RyYW5zX3NvY2suYwppbmRleCA2YTlhNzVkLi40NGU4MzA2IDEwMDY0NAotLS0gYS9mcy85cC90cmFuc19zb2NrLmMKKysrIGIvZnMvOXAvdHJhbnNfc29jay5jCkBAIC0zLDYgKzMsNyBAQAogICoKICAqIFNvY2tldCBUcmFuc3BvcnQgTGF5ZXIKICAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgYnkgTGF0Y2hlc2FyIElvbmtvdiA8bHVjaG9AaW9ua292Lm5ldD4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4KICAqICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMiBieSBSb24gTWlubmljaCA8cm1pbm5pY2hAc2Fybm9mZi5jb20+CiAgKiAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IGJ5IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgpAQCAtMzYsNiArMzcsNyBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5ldC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KIAogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAidjlmcy5oIgpAQCAtNDUsNiArNDcsNyBAQAogCiBzdHJ1Y3Qgdjlmc190cmFuc19zb2NrIHsKIAlzdHJ1Y3Qgc29ja2V0ICpzOworCXN0cnVjdCBmaWxlICpmaWxwOwogfTsKIAogLyoqCkBAIC01Nyw0MSArNjAsMjYgQEAKIAogc3RhdGljIGludCB2OWZzX3NvY2tfcmVjdihzdHJ1Y3Qgdjlmc190cmFuc3BvcnQgKnRyYW5zLCB2b2lkICp2LCBpbnQgbGVuKQogewotCXN0cnVjdCBtc2doZHIgbXNnOwotCXN0cnVjdCBrdmVjIGlvdjsKLQlpbnQgcmVzdWx0OwotCW1tX3NlZ21lbnRfdCBvbGRmczsKLQlzdHJ1Y3Qgdjlmc190cmFuc19zb2NrICp0cyA9IHRyYW5zID8gdHJhbnMtPnByaXYgOiBOVUxMOworCWludCByZXQ7CisJc3RydWN0IHY5ZnNfdHJhbnNfc29jayAqdHM7CiAKLQlpZiAodHJhbnMtPnN0YXR1cyA9PSBEaXNjb25uZWN0ZWQpCisJaWYgKCF0cmFucyB8fCB0cmFucy0+c3RhdHVzID09IERpc2Nvbm5lY3RlZCkgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiZGlzY29ubmVjdGVkIC4uLlxuIik7CiAJCXJldHVybiAtRVJFTU9URUlPOworCX0KIAotCXJlc3VsdCA9IC1FSU5WQUw7CisJdHMgPSB0cmFucy0+cHJpdjsKIAotCW9sZGZzID0gZ2V0X2ZzKCk7Ci0Jc2V0X2ZzKGdldF9kcygpKTsKKwlpZiAoISh0cy0+ZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKQorCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiYmxvY2tpbmcgcmVhZCAuLi5cbiIpOwogCi0JaW92Lmlvdl9iYXNlID0gdjsKLQlpb3YuaW92X2xlbiA9IGxlbjsKLQltc2cubXNnX25hbWUgPSBOVUxMOwotCW1zZy5tc2dfbmFtZWxlbiA9IDA7Ci0JbXNnLm1zZ19pb3ZsZW4gPSAxOwotCW1zZy5tc2dfY29udHJvbCA9IE5VTEw7Ci0JbXNnLm1zZ19jb250cm9sbGVuID0gMDsKLQltc2cubXNnX25hbWVsZW4gPSAwOwotCW1zZy5tc2dfZmxhZ3MgPSBNU0dfTk9TSUdOQUw7Ci0KLQlyZXN1bHQgPSBrZXJuZWxfcmVjdm1zZyh0cy0+cywgJm1zZywgJmlvdiwgMSwgbGVuLCAwKTsKLQotCWRwcmludGsoREVCVUdfVFJBTlMsICJzb2NrZXQgc3RhdGUgJWRcbiIsIHRzLT5zLT5zdGF0ZSk7Ci0Jc2V0X2ZzKG9sZGZzKTsKLQotCWlmIChyZXN1bHQgPD0gMCkgewotCQlpZiAocmVzdWx0ICE9IC1FUkVTVEFSVFNZUykKKwlyZXQgPSBrZXJuZWxfcmVhZCh0cy0+ZmlscCwgdHMtPmZpbHAtPmZfcG9zLCB2LCBsZW4pOworCWlmIChyZXQgPD0gMCkgeworCQlpZiAocmV0ICE9IC1FUkVTVEFSVFNZUyAmJiByZXQgIT0gLUVBR0FJTikKIAkJCXRyYW5zLT5zdGF0dXMgPSBEaXNjb25uZWN0ZWQ7CiAJfQogCi0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTEwNCw0MCArOTIsNzIgQEAKIAogc3RhdGljIGludCB2OWZzX3NvY2tfc2VuZChzdHJ1Y3Qgdjlmc190cmFuc3BvcnQgKnRyYW5zLCB2b2lkICp2LCBpbnQgbGVuKQogewotCXN0cnVjdCBrdmVjIGlvdjsKLQlzdHJ1Y3QgbXNnaGRyIG1zZzsKLQlpbnQgcmVzdWx0ID0gLTE7CisJaW50IHJldDsKIAltbV9zZWdtZW50X3Qgb2xkZnM7Ci0Jc3RydWN0IHY5ZnNfdHJhbnNfc29jayAqdHMgPSB0cmFucyA/IHRyYW5zLT5wcml2IDogTlVMTDsKKwlzdHJ1Y3Qgdjlmc190cmFuc19zb2NrICp0czsKIAotCWRwcmludGsoREVCVUdfVFJBTlMsICJTZW5kaW5nIHBhY2tldCBzaXplICVkICgleClcbiIsIGxlbiwgbGVuKTsKLQlkdW1wX2RhdGEodiwgbGVuKTsKKwlpZiAoIXRyYW5zIHx8IHRyYW5zLT5zdGF0dXMgPT0gRGlzY29ubmVjdGVkKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJkaXNjb25uZWN0ZWQgLi4uXG4iKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQogCi0JZG93bigmdHJhbnMtPndyaXRlbG9jayk7CisJdHMgPSB0cmFucy0+cHJpdjsKKwlpZiAoIXRzKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJubyB0cmFuc3BvcnQgLi4uXG4iKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCisJaWYgKCEodHMtPmZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKKwkJZHByaW50ayhERUJVR19FUlJPUiwgImJsb2NraW5nIHdyaXRlIC4uLlxuIik7CiAKIAlvbGRmcyA9IGdldF9mcygpOwogCXNldF9mcyhnZXRfZHMoKSk7Ci0JaW92Lmlvdl9iYXNlID0gdjsKLQlpb3YuaW92X2xlbiA9IGxlbjsKLQltc2cubXNnX25hbWUgPSBOVUxMOwotCW1zZy5tc2dfbmFtZWxlbiA9IDA7Ci0JbXNnLm1zZ19pb3ZsZW4gPSAxOwotCW1zZy5tc2dfY29udHJvbCA9IE5VTEw7Ci0JbXNnLm1zZ19jb250cm9sbGVuID0gMDsKLQltc2cubXNnX25hbWVsZW4gPSAwOwotCW1zZy5tc2dfZmxhZ3MgPSBNU0dfTk9TSUdOQUw7Ci0JcmVzdWx0ID0ga2VybmVsX3NlbmRtc2codHMtPnMsICZtc2csICZpb3YsIDEsIGxlbik7CisJcmV0ID0gdmZzX3dyaXRlKHRzLT5maWxwLCAodm9pZCBfX3VzZXIgKil2LCBsZW4sICZ0cy0+ZmlscC0+Zl9wb3MpOwogCXNldF9mcyhvbGRmcyk7CiAKLQlpZiAocmVzdWx0IDwgMCkgewotCQlpZiAocmVzdWx0ICE9IC1FUkVTVEFSVFNZUykKKwlpZiAocmV0IDwgMCkgeworCQlpZiAocmV0ICE9IC1FUkVTVEFSVFNZUykKIAkJCXRyYW5zLT5zdGF0dXMgPSBEaXNjb25uZWN0ZWQ7CiAJfQogCi0JdXAoJnRyYW5zLT53cml0ZWxvY2spOwotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCB2OWZzX3NvY2tfcG9sbChzdHJ1Y3Qgdjlmc190cmFuc3BvcnQgKnRyYW5zLAorCXN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqcHQpIHsKKworCWludCByZXQ7CisJc3RydWN0IHY5ZnNfdHJhbnNfc29jayAqdHM7CisJbW1fc2VnbWVudF90IG9sZGZzOworCisJaWYgKCF0cmFucykgeworCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAibm8gdHJhbnNwb3J0XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJdHMgPSB0cmFucy0+cHJpdjsKKwlpZiAodHJhbnMtPnN0YXR1cyAhPSBDb25uZWN0ZWQgfHwgIXRzKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJ0cmFuc3BvcnQgZGlzY29ubmVjdGVkOiAlZFxuIiwgdHJhbnMtPnN0YXR1cyk7CisJCXJldHVybiAtRUlPOworCX0KKworCW9sZGZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKGdldF9kcygpKTsKKworCWlmICghdHMtPmZpbHAtPmZfb3AgfHwgIXRzLT5maWxwLT5mX29wLT5wb2xsKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJubyBwb2xsIG9wZXJhdGlvblxuIik7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZW5kOworCX0KKworCXJldCA9IHRzLT5maWxwLT5mX29wLT5wb2xsKHRzLT5maWxwLCBwdCk7CisKK2VuZDoKKwlzZXRfZnMob2xkZnMpOworCXJldHVybiByZXQ7Cit9CisKKwogLyoqCiAgKiB2OWZzX3RjcF9pbml0IC0gaW5pdGlhbGl6ZSBUQ1Agc29ja2V0CiAgKiBAdjlzZXM6IHNlc3Npb24gaW5mb3JtYXRpb24KQEAgLTE1NCw5ICsxNzQsOSBAQAogCWludCByYyA9IDA7CiAJc3RydWN0IHY5ZnNfdHJhbnNfc29jayAqdHMgPSBOVUxMOwogCXN0cnVjdCB2OWZzX3RyYW5zcG9ydCAqdHJhbnMgPSB2OXNlcy0+dHJhbnNwb3J0OworCWludCBmZDsKIAotCXNlbWFfaW5pdCgmdHJhbnMtPndyaXRlbG9jaywgMSk7Ci0Jc2VtYV9pbml0KCZ0cmFucy0+cmVhZGxvY2ssIDEpOworCXRyYW5zLT5zdGF0dXMgPSBEaXNjb25uZWN0ZWQ7CiAKIAl0cyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2OWZzX3RyYW5zX3NvY2spLCBHRlBfS0VSTkVMKTsKIApAQCAtMTY1LDYgKzE4NSw3IEBACiAKIAl0cmFucy0+cHJpdiA9IHRzOwogCXRzLT5zID0gTlVMTDsKKwl0cy0+ZmlscCA9IE5VTEw7CiAKIAlpZiAoIWFkZHIpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTg1LDcgKzIwNiwxOCBAQAogCQlyZXR1cm4gcmM7CiAJfQogCWNzb2NrZXQtPnNrLT5za19hbGxvY2F0aW9uID0gR0ZQX05PSU87CisKKwlmZCA9IHNvY2tfbWFwX2ZkKGNzb2NrZXQpOworCWlmIChmZCA8IDApIHsKKwkJc29ja19yZWxlYXNlKGNzb2NrZXQpOworCQlrZnJlZSh0cyk7CisJCXRyYW5zLT5wcml2ID0gTlVMTDsKKwkJcmV0dXJuIGZkOworCX0KKwogCXRzLT5zID0gY3NvY2tldDsKKwl0cy0+ZmlscCA9IGZnZXQoZmQpOworCXRzLT5maWxwLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CiAJdHJhbnMtPnN0YXR1cyA9IENvbm5lY3RlZDsKIAogCXJldHVybiAwOwpAQCAtMjAzLDcgKzIzNSw3IEBACiB2OWZzX3VuaXhfaW5pdChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKIAkgICAgICAgY2hhciAqZGF0YSkKIHsKLQlpbnQgcmM7CisJaW50IHJjLCBmZDsKIAlzdHJ1Y3Qgc29ja2V0ICpjc29ja2V0OwogCXN0cnVjdCBzb2NrYWRkcl91biBzdW5fc2VydmVyOwogCXN0cnVjdCB2OWZzX3RyYW5zcG9ydCAqdHJhbnM7CkBAIC0yMTMsNiArMjQ1LDggQEAKIAljc29ja2V0ID0gTlVMTDsKIAl0cmFucyA9IHY5c2VzLT50cmFuc3BvcnQ7CiAKKwl0cmFucy0+c3RhdHVzID0gRGlzY29ubmVjdGVkOworCiAJaWYgKHN0cmxlbihkZXZfbmFtZSkgPiBVTklYX1BBVEhfTUFYKSB7CiAJCWVwcmludGsoS0VSTl9FUlIsICJ2OWZzX3RyYW5zX3VuaXg6IGFkZHJlc3MgdG9vIGxvbmc6ICVzXG4iLAogCQkJZGV2X25hbWUpOwpAQCAtMjI1LDkgKzI1OSw3IEBACiAKIAl0cmFucy0+cHJpdiA9IHRzOwogCXRzLT5zID0gTlVMTDsKLQotCXNlbWFfaW5pdCgmdHJhbnMtPndyaXRlbG9jaywgMSk7Ci0Jc2VtYV9pbml0KCZ0cmFucy0+cmVhZGxvY2ssIDEpOworCXRzLT5maWxwID0gTlVMTDsKIAogCXN1bl9zZXJ2ZXIuc3VuX2ZhbWlseSA9IFBGX1VOSVg7CiAJc3RyY3B5KHN1bl9zZXJ2ZXIuc3VuX3BhdGgsIGRldl9uYW1lKTsKQEAgLTI0MSw3ICsyNzMsMTggQEAKIAkJcmV0dXJuIHJjOwogCX0KIAljc29ja2V0LT5zay0+c2tfYWxsb2NhdGlvbiA9IEdGUF9OT0lPOworCisJZmQgPSBzb2NrX21hcF9mZChjc29ja2V0KTsKKwlpZiAoZmQgPCAwKSB7CisJCXNvY2tfcmVsZWFzZShjc29ja2V0KTsKKwkJa2ZyZWUodHMpOworCQl0cmFucy0+cHJpdiA9IE5VTEw7CisJCXJldHVybiBmZDsKKwl9CisKIAl0cy0+cyA9IGNzb2NrZXQ7CisJdHMtPmZpbHAgPSBmZ2V0KGZkKTsKKwl0cy0+ZmlscC0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOwogCXRyYW5zLT5zdGF0dXMgPSBDb25uZWN0ZWQ7CiAKIAlyZXR1cm4gMDsKQEAgLTI2MiwxMiArMzA1LDExIEBACiAKIAl0cyA9IHRyYW5zLT5wcml2OwogCi0JaWYgKCh0cykgJiYgKHRzLT5zKSkgewotCQlkcHJpbnRrKERFQlVHX1RSQU5TLCAiY2xvc2luZyB0aGUgc29ja2V0ICVwXG4iLCB0cy0+cyk7Ci0JCXNvY2tfcmVsZWFzZSh0cy0+cyk7CisJaWYgKCh0cykgJiYgKHRzLT5maWxwKSkgeworCQlmcHV0KHRzLT5maWxwKTsKKwkJdHMtPmZpbHAgPSBOVUxMOwogCQl0cy0+cyA9IE5VTEw7CiAJCXRyYW5zLT5zdGF0dXMgPSBEaXNjb25uZWN0ZWQ7Ci0JCWRwcmludGsoREVCVUdfVFJBTlMsICJzb2NrZXQgY2xvc2VkXG4iKTsKIAl9CiAKIAlrZnJlZSh0cyk7CkBAIC0yODAsNiArMzIyLDcgQEAKIAkud3JpdGUgPSB2OWZzX3NvY2tfc2VuZCwKIAkucmVhZCA9IHY5ZnNfc29ja19yZWN2LAogCS5jbG9zZSA9IHY5ZnNfc29ja19jbG9zZSwKKwkucG9sbCA9IHY5ZnNfc29ja19wb2xsLAogfTsKIAogc3RydWN0IHY5ZnNfdHJhbnNwb3J0IHY5ZnNfdHJhbnNfdW5peCA9IHsKQEAgLTI4Nyw0ICszMzAsNSBAQAogCS53cml0ZSA9IHY5ZnNfc29ja19zZW5kLAogCS5yZWFkID0gdjlmc19zb2NrX3JlY3YsCiAJLmNsb3NlID0gdjlmc19zb2NrX2Nsb3NlLAorCS5wb2xsID0gdjlmc19zb2NrX3BvbGwsCiB9OwpkaWZmIC0tZ2l0IGEvZnMvOXAvdHJhbnNwb3J0LmggYi9mcy85cC90cmFuc3BvcnQuaAppbmRleCA5ZTljZDQxLi45MWZjZGI5IDEwMDY0NAotLS0gYS9mcy85cC90cmFuc3BvcnQuaAorKysgYi9mcy85cC90cmFuc3BvcnQuaApAQCAtMyw2ICszLDcgQEAKICAqCiAgKiBUcmFuc3BvcnQgRGVmaW5pdGlvbgogICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgYnkgTGF0Y2hlc2FyIElvbmtvdiA8bHVjaG9AaW9ua292Lm5ldD4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTMxLDE0ICszMiwxMyBAQAogCiBzdHJ1Y3Qgdjlmc190cmFuc3BvcnQgewogCWVudW0gdjlmc190cmFuc3BvcnRfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3Qgc2VtYXBob3JlIHdyaXRlbG9jazsKLQlzdHJ1Y3Qgc2VtYXBob3JlIHJlYWRsb2NrOwogCXZvaWQgKnByaXY7CiAKIAlpbnQgKCppbml0KSAoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICosIGNvbnN0IGNoYXIgKiwgY2hhciAqKTsKIAlpbnQgKCp3cml0ZSkgKHN0cnVjdCB2OWZzX3RyYW5zcG9ydCAqLCB2b2lkICosIGludCk7CiAJaW50ICgqcmVhZCkgKHN0cnVjdCB2OWZzX3RyYW5zcG9ydCAqLCB2b2lkICosIGludCk7CiAJdm9pZCAoKmNsb3NlKSAoc3RydWN0IHY5ZnNfdHJhbnNwb3J0ICopOworCXVuc2lnbmVkIGludCAoKnBvbGwpKHN0cnVjdCB2OWZzX3RyYW5zcG9ydCAqLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKik7CiB9OwogCiBleHRlcm4gc3RydWN0IHY5ZnNfdHJhbnNwb3J0IHY5ZnNfdHJhbnNfdGNwOwpkaWZmIC0tZ2l0IGEvZnMvOXAvdjlmcy5jIGIvZnMvOXAvdjlmcy5jCmluZGV4IDQxOGMzNzQuLjUyNTBjNDIgMTAwNjQ0Ci0tLSBhL2ZzLzlwL3Y5ZnMuYworKysgYi9mcy85cC92OWZzLmMKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlICJ2OWZzX3Zmcy5oIgogI2luY2x1ZGUgInRyYW5zcG9ydC5oIgogI2luY2x1ZGUgIm11eC5oIgotI2luY2x1ZGUgImNvbnYuaCIKIAogLyogVE9ETzogc3lzZnMgb3IgZGVidWdmcyBpbnRlcmZhY2UgKi8KIGludCB2OWZzX2RlYnVnX2xldmVsID0gMDsJLyogZmVhdHVyZS1yaWZpYyBnbG9iYWwgZGVidWcgbGV2ZWwgICovCkBAIC0yMTMsNyArMjEyLDggQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCWVycm9yID0gaWRyX2dldF9uZXcoJnAtPnBvb2wsIE5VTEwsICZpKTsKKwkvKiBubyBuZWVkIHRvIHN0b3JlIGV4YWN0bHkgcCwgd2UganVzdCBuZWVkIHNvbWV0aGluZyBub24tbnVsbCAqLworCWVycm9yID0gaWRyX2dldF9uZXcoJnAtPnBvb2wsIHAsICZpKTsKIAl1cCgmcC0+bG9jayk7CiAKIAlpZiAoZXJyb3IgPT0gLUVBR0FJTikKQEAgLTI0Myw2ICsyNDMsMTYgQEAKIH0KIAogLyoqCisgKiB2OWZzX2NoZWNrX2lkcG9vbCAtIGNoZWNrIGlmIHRoZSBzcGVjaWZpZWQgaWQgaXMgYXZhaWxhYmxlCisgKiBAaWQgLSBpZCB0byBjaGVjaworICogQHAgLSBwb29sCisgKi8KK2ludCB2OWZzX2NoZWNrX2lkcG9vbChpbnQgaWQsIHN0cnVjdCB2OWZzX2lkcG9vbCAqcCkKK3sKKwlyZXR1cm4gaWRyX2ZpbmQoJnAtPnBvb2wsIGlkKSAhPSBOVUxMOworfQorCisvKioKICAqIHY5ZnNfc2Vzc2lvbl9pbml0IC0gaW5pdGlhbGl6ZSBzZXNzaW9uCiAgKiBAdjlzZXM6IHNlc3Npb24gaW5mb3JtYXRpb24gc3RydWN0dXJlCiAgKiBAZGV2X25hbWU6IGRldmljZSBiZWluZyBtb3VudGVkCkBAIC0yNTksNiArMjY5LDcgQEAKIAlpbnQgbiA9IDA7CiAJaW50IG5ld2ZpZCA9IC0xOwogCWludCByZXR2YWwgPSAtRUlOVkFMOworCXN0cnVjdCB2OWZzX3N0ciAqdmVyc2lvbjsKIAogCXY5c2VzLT5uYW1lID0gX19nZXRuYW1lKCk7CiAJaWYgKCF2OXNlcy0+bmFtZSkKQEAgLTI4MSw5ICsyOTIsNiBAQAogCS8qIGlkIHBvb2xzIHRoYXQgYXJlIHNlc3Npb24tZGVwZW5kZW50OiBGSURzIGFuZCBUSURzICovCiAJaWRyX2luaXQoJnY5c2VzLT5maWRwb29sLnBvb2wpOwogCWluaXRfTVVURVgoJnY5c2VzLT5maWRwb29sLmxvY2spOwotCWlkcl9pbml0KCZ2OXNlcy0+dGlkcG9vbC5wb29sKTsKLQlpbml0X01VVEVYKCZ2OXNlcy0+dGlkcG9vbC5sb2NrKTsKLQogCiAJc3dpdGNoICh2OXNlcy0+cHJvdG8pIHsKIAljYXNlIFBST1RPX1RDUDoKQEAgLTMyMCw3ICszMjgsMTIgQEAKIAl2OXNlcy0+c2h1dGRvd24gPSAwOwogCXY5c2VzLT5zZXNzaW9uX2h1bmcgPSAwOwogCi0JaWYgKChyZXR2YWwgPSB2OWZzX211eF9pbml0KHY5c2VzLCBkZXZfbmFtZSkpIDwgMCkgeworCXY5c2VzLT5tdXggPSB2OWZzX211eF9pbml0KHY5c2VzLT50cmFuc3BvcnQsIHY5c2VzLT5tYXhkYXRhICsgVjlGU19JT0hEUlNaLAorCQkmdjlzZXMtPmV4dGVuZGVkKTsKKworCWlmIChJU19FUlIodjlzZXMtPm11eCkpIHsKKwkJcmV0dmFsID0gUFRSX0VSUih2OXNlcy0+bXV4KTsKKwkJdjlzZXMtPm11eCA9IE5VTEw7CiAJCWRwcmludGsoREVCVUdfRVJST1IsICJwcm9ibGVtIGluaXRpYWxpemluZyBtdXhcbiIpOwogCQlnb3RvIFNlc3NDbGVhblVwOwogCX0KQEAgLTMzOSwxMyArMzUyLDE2IEBACiAJCQlnb3RvIEZyZWVGY2FsbDsKIAkJfQogCi0JCS8qIFJlYWxseSBzaG91bGQgY2hlY2sgZm9yIDlQMSBhbmQgcmVwb3J0IGVycm9yICovCi0JCWlmICghc3RyY21wKGZjYWxsLT5wYXJhbXMucnZlcnNpb24udmVyc2lvbiwgIjlQMjAwMC51IikpIHsKKwkJdmVyc2lvbiA9ICZmY2FsbC0+cGFyYW1zLnJ2ZXJzaW9uLnZlcnNpb247CisJCWlmICh2ZXJzaW9uLT5sZW49PTggJiYgIW1lbWNtcCh2ZXJzaW9uLT5zdHIsICI5UDIwMDAudSIsIDgpKSB7CiAJCQlkcHJpbnRrKERFQlVHXzlQLCAiOVAyMDAwIFVOSVggZXh0ZW5zaW9ucyBlbmFibGVkXG4iKTsKIAkJCXY5c2VzLT5leHRlbmRlZCA9IDE7Ci0JCX0gZWxzZSB7CisJCX0gZWxzZSBpZiAodmVyc2lvbi0+bGVuPT02ICYmICFtZW1jbXAodmVyc2lvbi0+c3RyLCAiOVAyMDAwIiwgNikpIHsKIAkJCWRwcmludGsoREVCVUdfOVAsICI5UDIwMDAgbGVnYWN5IG1vZGUgZW5hYmxlZFxuIik7CiAJCQl2OXNlcy0+ZXh0ZW5kZWQgPSAwOworCQl9IGVsc2UgeworCQkJcmV0dmFsID0gLUVSRU1PVEVJTzsKKwkJCWdvdG8gRnJlZUZjYWxsOwogCQl9CiAKIAkJbiA9IGZjYWxsLT5wYXJhbXMucnZlcnNpb24ubXNpemU7CkBAIC0zODEsNyArMzk3LDcgQEAKIAl9CiAKIAlpZiAodjlzZXMtPmFmaWQgIT0gfjApIHsKLQkJaWYgKHY5ZnNfdF9jbHVuayh2OXNlcywgdjlzZXMtPmFmaWQsIE5VTEwpKQorCQlpZiAodjlmc190X2NsdW5rKHY5c2VzLCB2OXNlcy0+YWZpZCkpCiAJCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiY2x1bmsgZmFpbGVkXG4iKTsKIAl9CiAKQEAgLTQwMywxMyArNDE5LDE2IEBACiAKIHZvaWQgdjlmc19zZXNzaW9uX2Nsb3NlKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMpCiB7Ci0JaWYgKHY5c2VzLT5yZWN2cHJvYykgewotCQlzZW5kX3NpZyhTSUdLSUxMLCB2OXNlcy0+cmVjdnByb2MsIDEpOwotCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ2OXNlcy0+cHJvY2NtcGwpOworCWlmICh2OXNlcy0+bXV4KSB7CisJCXY5ZnNfbXV4X2Rlc3Ryb3kodjlzZXMtPm11eCk7CisJCXY5c2VzLT5tdXggPSBOVUxMOwogCX0KIAotCWlmICh2OXNlcy0+dHJhbnNwb3J0KQorCWlmICh2OXNlcy0+dHJhbnNwb3J0KSB7CiAJCXY5c2VzLT50cmFuc3BvcnQtPmNsb3NlKHY5c2VzLT50cmFuc3BvcnQpOworCQlrZnJlZSh2OXNlcy0+dHJhbnNwb3J0KTsKKwkJdjlzZXMtPnRyYW5zcG9ydCA9IE5VTEw7CisJfQogCiAJX19wdXRuYW1lKHY5c2VzLT5uYW1lKTsKIAlfX3B1dG5hbWUodjlzZXMtPnJlbW90ZW5hbWUpOwpAQCAtNDIwLDggKzQzOSw5IEBACiAgKiAJYW5kIGNhbmNlbCBhbGwgcGVuZGluZyByZXF1ZXN0cy4KICAqLwogdm9pZCB2OWZzX3Nlc3Npb25fY2FuY2VsKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMpIHsKKwlkcHJpbnRrKERFQlVHX0VSUk9SLCAiY2FuY2VsIHNlc3Npb24gJXBcbiIsIHY5c2VzKTsKIAl2OXNlcy0+dHJhbnNwb3J0LT5zdGF0dXMgPSBEaXNjb25uZWN0ZWQ7Ci0Jdjlmc19tdXhfY2FuY2VsX3JlcXVlc3RzKHY5c2VzLCAtRUlPKTsKKwl2OWZzX211eF9jYW5jZWwodjlzZXMtPm11eCwgLUVJTyk7CiB9CiAKIGV4dGVybiBpbnQgdjlmc19lcnJvcl9pbml0KHZvaWQpOwpAQCAtNDMzLDExICs0NTMsMTcgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF92OWZzKHZvaWQpCiB7CisJaW50IHJldDsKKwogCXY5ZnNfZXJyb3JfaW5pdCgpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiSW5zdGFsbGluZyB2OWZzIDlQMjAwMCBmaWxlIHN5c3RlbSBzdXBwb3J0XG4iKTsKIAotCXJldHVybiByZWdpc3Rlcl9maWxlc3lzdGVtKCZ2OWZzX2ZzX3R5cGUpOworCXJldCA9IHY5ZnNfbXV4X2dsb2JhbF9pbml0KCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnY5ZnNfZnNfdHlwZSk7CisKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTQ0Nyw2ICs0NzMsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF92OWZzKHZvaWQpCiB7CisJdjlmc19tdXhfZ2xvYmFsX2V4aXQoKTsKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnY5ZnNfZnNfdHlwZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzLzlwL3Y5ZnMuaCBiL2ZzLzlwL3Y5ZnMuaAppbmRleCA0NWRjZWY0Li5mMzM3ZGE3IDEwMDY0NAotLS0gYS9mcy85cC92OWZzLmgKKysrIGIvZnMvOXAvdjlmcy5oCkBAIC01NywyNCArNTcsMTQgQEAKIAogCS8qIGJvb2sga2VlcGluZyAqLwogCXN0cnVjdCB2OWZzX2lkcG9vbCBmaWRwb29sOwkvKiBUaGUgRklEIHBvb2wgZm9yIGZpbGUgZGVzY3JpcHRvcnMgKi8KLQlzdHJ1Y3Qgdjlmc19pZHBvb2wgdGlkcG9vbDsJLyogVGhlIFRJRCBwb29sIGZvciB0cmFuc2FjdGlvbnMgaWRzICovCiAKLQkvKiB0cmFuc3BvcnQgaW5mb3JtYXRpb24gKi8KIAlzdHJ1Y3Qgdjlmc190cmFuc3BvcnQgKnRyYW5zcG9ydDsKKwlzdHJ1Y3Qgdjlmc19tdXhfZGF0YSAqbXV4OwogCiAJaW50IGlucHJvZ3Jlc3M7CQkvKiBzZXNzaW9uIGluIHByb2dyZXNzID0+IHRydWUgKi8KIAlpbnQgc2h1dGRvd247CQkvKiBzZXNzaW9uIHNodXR0aW5nIGRvd24uIG5vIG1vcmUgYXR0YWNoZXMuICovCiAJdW5zaWduZWQgY2hhciBzZXNzaW9uX2h1bmc7Ci0KLQkvKiBtdXggcHJpdmF0ZSBkYXRhICovCi0Jc3RydWN0IHY5ZnNfZmNhbGwgKmN1cmZjYWxsOwotCXdhaXRfcXVldWVfaGVhZF90IHJlYWRfd2FpdDsKLQlzdHJ1Y3QgY29tcGxldGlvbiBmY3JlYWQ7Ci0Jc3RydWN0IGNvbXBsZXRpb24gcHJvY2NtcGw7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICpyZWN2cHJvYzsKLQotCXNwaW5sb2NrX3QgbXV4bG9jazsKLQlzdHJ1Y3QgbGlzdF9oZWFkIG11eF9mY2FsbHM7CisJc3RydWN0IGRlbnRyeSAqZGVidWdmc19kaXI7CiB9OwogCiAvKiBwb3NzaWJsZSB2YWx1ZXMgb2YgLT5wcm90byAqLwpAQCAtODQsMTEgKzc0LDE0IEBACiAJUFJPVE9fRkQsCiB9OwogCitleHRlcm4gc3RydWN0IGRlbnRyeSAqdjlmc19kZWJ1Z2ZzX3Jvb3Q7CisKIGludCB2OWZzX3Nlc3Npb25faW5pdChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKiwgY29uc3QgY2hhciAqLCBjaGFyICopOwogc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OWZzX2lub2RlMnY5c2VzKHN0cnVjdCBpbm9kZSAqKTsKIHZvaWQgdjlmc19zZXNzaW9uX2Nsb3NlKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMpOwogaW50IHY5ZnNfZ2V0X2lkcG9vbChzdHJ1Y3Qgdjlmc19pZHBvb2wgKnApOwogdm9pZCB2OWZzX3B1dF9pZHBvb2woaW50IGlkLCBzdHJ1Y3Qgdjlmc19pZHBvb2wgKnApOworaW50IHY5ZnNfY2hlY2tfaWRwb29sKGludCBpZCwgc3RydWN0IHY5ZnNfaWRwb29sICpwKTsKIHZvaWQgdjlmc19zZXNzaW9uX2NhbmNlbChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzKTsKIAogI2RlZmluZSBWOUZTX01BR0lDIDB4MDEwMjE5OTcKZGlmZiAtLWdpdCBhL2ZzLzlwL3Y5ZnNfdmZzLmggYi9mcy85cC92OWZzX3Zmcy5oCmluZGV4IDJmMmNlYTcuLjY5Y2YyOTAgMTAwNjQ0Ci0tLSBhL2ZzLzlwL3Y5ZnNfdmZzLmgKKysrIGIvZnMvOXAvdjlmc192ZnMuaApAQCAtMzksMTUgKzM5LDE1IEBACiAgKi8KIAogZXh0ZXJuIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHY5ZnNfZnNfdHlwZTsKK2V4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHY5ZnNfYWRkcl9vcGVyYXRpb25zOwogZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdjlmc19maWxlX29wZXJhdGlvbnM7CiBleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2OWZzX2Rpcl9vcGVyYXRpb25zOwogZXh0ZXJuIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyB2OWZzX2RlbnRyeV9vcGVyYXRpb25zOwogCiBzdHJ1Y3QgaW5vZGUgKnY5ZnNfZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBtb2RlKTsKIGlub190IHY5ZnNfcWlkMmlubyhzdHJ1Y3Qgdjlmc19xaWQgKnFpZCk7Ci12b2lkIHY5ZnNfbWlzdGF0Mmlub2RlKHN0cnVjdCB2OWZzX3N0YXQgKiwgc3RydWN0IGlub2RlICosCi0JCSAgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7Cit2b2lkIHY5ZnNfc3RhdDJpbm9kZShzdHJ1Y3Qgdjlmc19zdGF0ICosIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CiBpbnQgdjlmc19kaXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CiBpbnQgdjlmc19maWxlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotdm9pZCB2OWZzX2lub2RlMm1pc3RhdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgdjlmc19zdGF0ICptaXN0YXQpOwordm9pZCB2OWZzX2lub2RlMnN0YXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHY5ZnNfc3RhdCAqc3RhdCk7CiB2b2lkIHY5ZnNfZGVudHJ5X3JlbGVhc2Uoc3RydWN0IGRlbnRyeSAqKTsKZGlmZiAtLWdpdCBhL2ZzLzlwL3Zmc19hZGRyLmMgYi9mcy85cC92ZnNfYWRkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMDBmYjUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy85cC92ZnNfYWRkci5jCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogIGxpbnV4L2ZzLzlwL3Zmc19hZGRyLmMKKyAqCisgKiBUaGlzIGZpbGUgY29udGlhbnMgdmZzIGFkZHJlc3MgKG1tYXApIG9wcyBmb3IgOVAyMDAwLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgYnkgRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgUm9uIE1pbm5pY2ggPHJtaW5uaWNoQGxhbmwuZ292PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvOgorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICogIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IKKyAqICBCb3N0b24sIE1BICAwMjExMS0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInY5ZnMuaCIKKyNpbmNsdWRlICI5cC5oIgorI2luY2x1ZGUgInY5ZnNfdmZzLmgiCisjaW5jbHVkZSAiZmlkLmgiCisKKy8qKgorICogdjlmc192ZnNfcmVhZHBhZ2UgLSByZWFkIGFuIGVudGlyZSBwYWdlIGluIGZyb20gOVAKKyAqCisgKiBAZmlsZTogZmlsZSBiZWluZyByZWFkCisgKiBAcGFnZTogc3RydWN0dXJlIHRvIHBhZ2UKKyAqCisgKi8KKworc3RhdGljIGludCB2OWZzX3Zmc19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJY2hhciAqYnVmZmVyID0gTlVMTDsKKwlpbnQgcmV0dmFsID0gLUVJTzsKKwlsb2ZmX3Qgb2Zmc2V0ID0gcGFnZV9vZmZzZXQocGFnZSk7CisJaW50IGNvdW50ID0gUEFHRV9DQUNIRV9TSVpFOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhpbm9kZSk7CisJaW50IHJzaXplID0gdjlzZXMtPm1heGRhdGEgLSBWOUZTX0lPSERSU1o7CisJc3RydWN0IHY5ZnNfZmlkICp2OWYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsID0gTlVMTDsKKwlpbnQgZmlkID0gdjlmLT5maWQ7CisJaW50IHRvdGFsID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCWJ1ZmZlciA9IGttYXAocGFnZSk7CisJZG8geworCQlpZiAoY291bnQgPCByc2l6ZSkKKwkJCXJzaXplID0gY291bnQ7CisKKwkJcmVzdWx0ID0gdjlmc190X3JlYWQodjlzZXMsIGZpZCwgb2Zmc2V0LCByc2l6ZSwgJmZjYWxsKTsKKworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ2OWZzX3RfcmVhZCByZXR1cm5lZCAlZFxuIiwKKwkJCSAgICAgICByZXN1bHQpOworCisJCQlrZnJlZShmY2FsbCk7CisJCQlnb3RvIFVubWFwQW5kVW5sb2NrOworCQl9IGVsc2UKKwkJCW9mZnNldCArPSByZXN1bHQ7CisKKwkJbWVtY3B5KGJ1ZmZlciwgZmNhbGwtPnBhcmFtcy5ycmVhZC5kYXRhLCByZXN1bHQpOworCisJCWNvdW50IC09IHJlc3VsdDsKKwkJYnVmZmVyICs9IHJlc3VsdDsKKwkJdG90YWwgKz0gcmVzdWx0OworCisJCWtmcmVlKGZjYWxsKTsKKworCQlpZiAocmVzdWx0IDwgcnNpemUpCisJCQlicmVhazsKKwl9IHdoaWxlIChjb3VudCk7CisKKwltZW1zZXQoYnVmZmVyLCAwLCBjb3VudCk7CisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCXJldHZhbCA9IDA7CisKK1VubWFwQW5kVW5sb2NrOgorCWt1bm1hcChwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHY5ZnNfYWRkcl9vcGVyYXRpb25zID0geworICAgICAgLnJlYWRwYWdlID0gdjlmc192ZnNfcmVhZHBhZ2UsCit9OwpkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX2RlbnRyeS5jIGIvZnMvOXAvdmZzX2RlbnRyeS5jCmluZGV4IGE2YWE5NDcuLjJkZDgwNmQgMTAwNjQ0Ci0tLSBhL2ZzLzlwL3Zmc19kZW50cnkuYworKysgYi9mcy85cC92ZnNfZGVudHJ5LmMKQEAgLTQwLDcgKzQwLDYgQEAKICNpbmNsdWRlICJ2OWZzLmgiCiAjaW5jbHVkZSAiOXAuaCIKICNpbmNsdWRlICJ2OWZzX3Zmcy5oIgotI2luY2x1ZGUgImNvbnYuaCIKICNpbmNsdWRlICJmaWQuaCIKIAogLyoqCkBAIC05NSwyNCArOTQsMjIgQEAKIAogdm9pZCB2OWZzX2RlbnRyeV9yZWxlYXNlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKKwlpbnQgZXJyOworCiAJZHByaW50ayhERUJVR19WRlMsICIgZGVudHJ5OiAlcyAoJXApXG4iLCBkZW50cnktPmRfaW5hbWUsIGRlbnRyeSk7CiAKIAlpZiAoZGVudHJ5LT5kX2ZzZGF0YSAhPSBOVUxMKSB7CiAJCXN0cnVjdCBsaXN0X2hlYWQgKmZpZF9saXN0ID0gZGVudHJ5LT5kX2ZzZGF0YTsKIAkJc3RydWN0IHY5ZnNfZmlkICp0ZW1wID0gTlVMTDsKIAkJc3RydWN0IHY5ZnNfZmlkICpjdXJyZW50X2ZpZCA9IE5VTEw7Ci0JCXN0cnVjdCB2OWZzX2ZjYWxsICpmY2FsbCA9IE5VTEw7CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGN1cnJlbnRfZmlkLCB0ZW1wLCBmaWRfbGlzdCwgbGlzdCkgewotCQkJaWYgKHY5ZnNfdF9jbHVuawotCQkJICAgIChjdXJyZW50X2ZpZC0+djlzZXMsIGN1cnJlbnRfZmlkLT5maWQsICZmY2FsbCkpCi0JCQkJZHByaW50ayhERUJVR19FUlJPUiwgImNsdW5rIGZhaWxlZDogJXNcbiIsCi0JCQkJCUZDQUxMX0VSUk9SKGZjYWxsKSk7CisJCQllcnIgPSB2OWZzX3RfY2x1bmsoY3VycmVudF9maWQtPnY5c2VzLCBjdXJyZW50X2ZpZC0+ZmlkKTsKIAotCQkJdjlmc19wdXRfaWRwb29sKGN1cnJlbnRfZmlkLT5maWQsCi0JCQkJCSZjdXJyZW50X2ZpZC0+djlzZXMtPmZpZHBvb2wpOworCQkJaWYgKGVyciA8IDApCisJCQkJZHByaW50ayhERUJVR19FUlJPUiwgImNsdW5rIGZhaWxlZDogJWQgbmFtZSAlc1xuIiwKKwkJCQkJZXJyLCBkZW50cnktPmRfaW5hbWUpOwogCi0JCQlrZnJlZShmY2FsbCk7CiAJCQl2OWZzX2ZpZF9kZXN0cm95KGN1cnJlbnRfZmlkKTsKIAkJfQogCmRpZmYgLS1naXQgYS9mcy85cC92ZnNfZGlyLmMgYi9mcy85cC92ZnNfZGlyLmMKaW5kZXggNTdhNDNiOC4uYWU2ZDAzMiAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX2Rpci5jCisrKyBiL2ZzLzlwL3Zmc19kaXIuYwpAQCAtMzcsOCArMzcsOCBAQAogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAidjlmcy5oIgogI2luY2x1ZGUgIjlwLmgiCi0jaW5jbHVkZSAidjlmc192ZnMuaCIKICNpbmNsdWRlICJjb252LmgiCisjaW5jbHVkZSAidjlmc192ZnMuaCIKICNpbmNsdWRlICJmaWQuaCIKIAogLyoqCkBAIC03NCwyMCArNzQsMTYgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoaW5vZGUpOwogCXN0cnVjdCB2OWZzX2ZpZCAqZmlsZSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBpbnQgaSwgbjsKKwl1bnNpZ25lZCBpbnQgaSwgbiwgczsKIAlpbnQgZmlkID0gLTE7CiAJaW50IHJldCA9IDA7Ci0Jc3RydWN0IHY5ZnNfc3RhdCAqbWkgPSBOVUxMOworCXN0cnVjdCB2OWZzX3N0YXQgc3RhdDsKIAlpbnQgb3ZlciA9IDA7CiAKIAlkcHJpbnRrKERFQlVHX1ZGUywgIm5hbWUgJXNcbiIsIGZpbHAtPmZfZGVudHJ5LT5kX25hbWUubmFtZSk7CiAKIAlmaWQgPSBmaWxlLT5maWQ7CiAKLQltaSA9IGttYWxsb2ModjlzZXMtPm1heGRhdGEsIEdGUF9LRVJORUwpOwotCWlmICghbWkpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJaWYgKGZpbGUtPnJkaXJfZmNhbGwgJiYgKGZpbHAtPmZfcG9zICE9IGZpbGUtPnJkaXJfcG9zKSkgewogCQlrZnJlZShmaWxlLT5yZGlyX2ZjYWxsKTsKIAkJZmlsZS0+cmRpcl9mY2FsbCA9IE5VTEw7CkBAIC05NywyMCArOTMsMjAgQEAKIAkJbiA9IGZpbGUtPnJkaXJfZmNhbGwtPnBhcmFtcy5ycmVhZC5jb3VudDsKIAkJaSA9IGZpbGUtPnJkaXJfZnBvczsKIAkJd2hpbGUgKGkgPCBuKSB7Ci0JCQlpbnQgcyA9IHY5ZnNfZGVzZXJpYWxpemVfc3RhdCh2OXNlcywKLQkJCQkgIGZpbGUtPnJkaXJfZmNhbGwtPnBhcmFtcy5ycmVhZC5kYXRhICsgaSwKLQkJCSAgICAgICAgICBuIC0gaSwgbWksIHY5c2VzLT5tYXhkYXRhKTsKKwkJCXMgPSB2OWZzX2Rlc2VyaWFsaXplX3N0YXQoCisJCQkJZmlsZS0+cmRpcl9mY2FsbC0+cGFyYW1zLnJyZWFkLmRhdGEgKyBpLAorCQkJCW4gLSBpLCAmc3RhdCwgdjlzZXMtPmV4dGVuZGVkKTsKIAogCQkJaWYgKHMgPT0gMCkgewogCQkJCWRwcmludGsoREVCVUdfRVJST1IsCi0JCQkJCSJlcnJvciB3aGlsZSBkZXNlcmlhbGl6aW5nIG1pc3RhdFxuIik7CisJCQkJCSJlcnJvciB3aGlsZSBkZXNlcmlhbGl6aW5nIHN0YXRcbiIpOwogCQkJCXJldCA9IC1FSU87CiAJCQkJZ290byBGcmVlU3RydWN0czsKIAkJCX0KIAotCQkJb3ZlciA9IGZpbGxkaXIoZGlyZW50LCBtaS0+bmFtZSwgc3RybGVuKG1pLT5uYW1lKSwKLQkJCQkgICAgZmlscC0+Zl9wb3MsIHY5ZnNfcWlkMmlubygmbWktPnFpZCksCi0JCQkJICAgIGR0X3R5cGUobWkpKTsKKwkJCW92ZXIgPSBmaWxsZGlyKGRpcmVudCwgc3RhdC5uYW1lLnN0ciwgc3RhdC5uYW1lLmxlbiwKKwkJCQkgICAgZmlscC0+Zl9wb3MsIHY5ZnNfcWlkMmlubygmc3RhdC5xaWQpLAorCQkJCSAgICBkdF90eXBlKCZzdGF0KSk7CiAKIAkJCWlmIChvdmVyKSB7CiAJCQkJZmlsZS0+cmRpcl9mcG9zID0gaTsKQEAgLTEzMCw3ICsxMjYsNyBAQAogCiAJd2hpbGUgKCFvdmVyKSB7CiAJCXJldCA9IHY5ZnNfdF9yZWFkKHY5c2VzLCBmaWQsIGZpbHAtPmZfcG9zLAotCQkJCQkgICAgdjlzZXMtPm1heGRhdGEtVjlGU19JT0hEUlNaLCAmZmNhbGwpOworCQkJdjlzZXMtPm1heGRhdGEtVjlGU19JT0hEUlNaLCAmZmNhbGwpOwogCQlpZiAocmV0IDwgMCkgewogCQkJZHByaW50ayhERUJVR19FUlJPUiwgImVycm9yIHdoaWxlIHJlYWRpbmc6ICVkOiAlcFxuIiwKIAkJCQlyZXQsIGZjYWxsKTsKQEAgLTE0MSwxOSArMTM3LDE4IEBACiAJCW4gPSByZXQ7CiAJCWkgPSAwOwogCQl3aGlsZSAoaSA8IG4pIHsKLQkJCWludCBzID0gdjlmc19kZXNlcmlhbGl6ZV9zdGF0KHY5c2VzLAotCQkJICAgICAgICAgIGZjYWxsLT5wYXJhbXMucnJlYWQuZGF0YSArIGksIG4gLSBpLCBtaSwKLQkJCSAgICAgICAgICB2OXNlcy0+bWF4ZGF0YSk7CisJCQlzID0gdjlmc19kZXNlcmlhbGl6ZV9zdGF0KGZjYWxsLT5wYXJhbXMucnJlYWQuZGF0YSArIGksCisJCQkJbiAtIGksICZzdGF0LCB2OXNlcy0+ZXh0ZW5kZWQpOwogCiAJCQlpZiAocyA9PSAwKSB7CiAJCQkJZHByaW50ayhERUJVR19FUlJPUiwKLQkJCQkJImVycm9yIHdoaWxlIGRlc2VyaWFsaXppbmcgbWlzdGF0XG4iKTsKKwkJCQkJImVycm9yIHdoaWxlIGRlc2VyaWFsaXppbmcgc3RhdFxuIik7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9CiAKLQkJCW92ZXIgPSBmaWxsZGlyKGRpcmVudCwgbWktPm5hbWUsIHN0cmxlbihtaS0+bmFtZSksCi0JCQkJICAgIGZpbHAtPmZfcG9zLCB2OWZzX3FpZDJpbm8oJm1pLT5xaWQpLAotCQkJCSAgICBkdF90eXBlKG1pKSk7CisJCQlvdmVyID0gZmlsbGRpcihkaXJlbnQsIHN0YXQubmFtZS5zdHIsIHN0YXQubmFtZS5sZW4sCisJCQkJICAgIGZpbHAtPmZfcG9zLCB2OWZzX3FpZDJpbm8oJnN0YXQucWlkKSwKKwkJCQkgICAgZHRfdHlwZSgmc3RhdCkpOwogCiAJCQlpZiAob3ZlcikgewogCQkJCWZpbGUtPnJkaXJfZmNhbGwgPSBmY2FsbDsKQEAgLTE3Miw3ICsxNjcsNiBAQAogCiAgICAgICBGcmVlU3RydWN0czoKIAlrZnJlZShmY2FsbCk7Ci0Ja2ZyZWUobWkpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE5MywxOCArMTg3LDE1IEBACiAJCWZpZC0+ZmlkKTsKIAlmaWRudW0gPSBmaWQtPmZpZDsKIAotCWZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0+aV9tYXBwaW5nKTsKLQlmaWxlbWFwX2ZkYXRhd2FpdChpbm9kZS0+aV9tYXBwaW5nKTsKKwlmaWxlbWFwX3dyaXRlX2FuZF93YWl0KGlub2RlLT5pX21hcHBpbmcpOwogCiAJaWYgKGZpZG51bSA+PSAwKSB7CiAJCWRwcmludGsoREVCVUdfVkZTLCAiZmlkb3BlbjogJWQgdjlmLT5maWQ6ICVkXG4iLCBmaWQtPmZpZG9wZW4sCiAJCQlmaWQtPmZpZCk7CiAKLQkJaWYgKHY5ZnNfdF9jbHVuayh2OXNlcywgZmlkbnVtLCBOVUxMKSkKKwkJaWYgKHY5ZnNfdF9jbHVuayh2OXNlcywgZmlkbnVtKSkKIAkJCWRwcmludGsoREVCVUdfRVJST1IsICJjbHVuayBmYWlsZWRcbiIpOwogCi0JCXY5ZnNfcHV0X2lkcG9vbChmaWQtPmZpZCwgJnY5c2VzLT5maWRwb29sKTsKLQogCQlrZnJlZShmaWQtPnJkaXJfZmNhbGwpOwogCQlrZnJlZShmaWQpOwogCmRpZmYgLS1naXQgYS9mcy85cC92ZnNfZmlsZS5jIGIvZnMvOXAvdmZzX2ZpbGUuYwppbmRleCA4OWM4NDlkLi5jN2UxNGQ5IDEwMDY0NAotLS0gYS9mcy85cC92ZnNfZmlsZS5jCisrKyBiL2ZzLzlwL3Zmc19maWxlLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+CkBAIC0xMTcsOSArMTE4LDcgQEAKIAogCQlyZXN1bHQgPSB2OWZzX3Rfb3Blbih2OXNlcywgbmV3ZmlkLCBvcGVuX21vZGUsICZmY2FsbCk7CiAJCWlmIChyZXN1bHQgPCAwKSB7Ci0JCQlkcHJpbnRrKERFQlVHX0VSUk9SLAotCQkJCSJvcGVuIGZhaWxlZCwgb3Blbl9tb2RlIDB4JXg6ICVzXG4iLCBvcGVuX21vZGUsCi0JCQkJRkNBTExfRVJST1IoZmNhbGwpKTsKKwkJCVBSSU5UX0ZDQUxMX0VSUk9SKCJvcGVuIGZhaWxlZCIsIGZjYWxsKTsKIAkJCWtmcmVlKGZjYWxsKTsKIAkJCXJldHVybiByZXN1bHQ7CiAJCX0KQEAgLTE2NSw4ICsxNjQsNyBAQAogCQlyZXR1cm4gLUVOT0xDSzsKIAogCWlmICgoSVNfU0VUTEsoY21kKSB8fCBJU19TRVRMS1coY21kKSkgJiYgZmwtPmZsX3R5cGUgIT0gRl9VTkxDSykgewotCQlmaWxlbWFwX2ZkYXRhd3JpdGUoaW5vZGUtPmlfbWFwcGluZyk7Ci0JCWZpbGVtYXBfZmRhdGF3YWl0KGlub2RlLT5pX21hcHBpbmcpOworCQlmaWxlbWFwX3dyaXRlX2FuZF93YWl0KGlub2RlLT5pX21hcHBpbmcpOwogCQlpbnZhbGlkYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhKTsKIAl9CiAKQEAgLTI1Nyw3ICsyNTUsNiBAQAogCWludCByZXN1bHQgPSAtRUlPOwogCWludCByc2l6ZSA9IDA7CiAJaW50IHRvdGFsID0gMDsKLQljaGFyICpidWY7CiAKIAlkcHJpbnRrKERFQlVHX1ZGUywgImRhdGEgJXAgY291bnQgJWQgb2Zmc2V0ICV4XG4iLCBkYXRhLCAoaW50KWNvdW50LAogCQkoaW50KSpvZmZzZXQpOwpAQCAtMjY1LDI4ICsyNjIsMTQgQEAKIAlpZiAodjlmaWQtPmlvdW5pdCAhPSAwICYmIHJzaXplID4gdjlmaWQtPmlvdW5pdCkKIAkJcnNpemUgPSB2OWZpZC0+aW91bml0OwogCi0JYnVmID0ga21hbGxvYyh2OXNlcy0+bWF4ZGF0YSAtIFY5RlNfSU9IRFJTWiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJZG8gewogCQlpZiAoY291bnQgPCByc2l6ZSkKIAkJCXJzaXplID0gY291bnQ7CiAKLQkJcmVzdWx0ID0gY29weV9mcm9tX3VzZXIoYnVmLCBkYXRhLCByc2l6ZSk7Ci0JCWlmIChyZXN1bHQpIHsKLQkJCWRwcmludGsoREVCVUdfRVJST1IsICJQcm9ibGVtIGNvcHlpbmcgZnJvbSB1c2VyXG4iKTsKLQkJCWtmcmVlKGJ1Zik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCWR1bXBfZGF0YShidWYsIHJzaXplKTsKLQkJcmVzdWx0ID0gdjlmc190X3dyaXRlKHY5c2VzLCBmaWQsICpvZmZzZXQsIHJzaXplLCBidWYsICZmY2FsbCk7CisJCXJlc3VsdCA9IHY5ZnNfdF93cml0ZSh2OXNlcywgZmlkLCAqb2Zmc2V0LCByc2l6ZSwgZGF0YSwgJmZjYWxsKTsKIAkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCWVwcmludGsoS0VSTl9FUlIsICJlcnJvciB3aGlsZSB3cml0aW5nOiAlcyglZClcbiIsCi0JCQkJRkNBTExfRVJST1IoZmNhbGwpLCByZXN1bHQpOworCQkJUFJJTlRfRkNBTExfRVJST1IoImVycm9yIHdoaWxlIHdyaXRpbmciLCBmY2FsbCk7CiAJCQlrZnJlZShmY2FsbCk7Ci0JCQlrZnJlZShidWYpOwogCQkJcmV0dXJuIHJlc3VsdDsKIAkJfSBlbHNlCiAJCQkqb2Zmc2V0ICs9IHJlc3VsdDsKQEAgLTMwNiw3ICsyODksOSBAQAogCQl0b3RhbCArPSByZXN1bHQ7CiAJfSB3aGlsZSAoY291bnQpOwogCi0Ja2ZyZWUoYnVmKTsKKwlpZihpbm9kZS0+aV9tYXBwaW5nLT5ucnBhZ2VzKQorCQlpbnZhbGlkYXRlX2lub2RlX3BhZ2VzMihpbm9kZS0+aV9tYXBwaW5nKTsKKwogCXJldHVybiB0b3RhbDsKIH0KIApAQCAtMzE3LDQgKzMwMiw1IEBACiAJLm9wZW4gPSB2OWZzX2ZpbGVfb3BlbiwKIAkucmVsZWFzZSA9IHY5ZnNfZGlyX3JlbGVhc2UsCiAJLmxvY2sgPSB2OWZzX2ZpbGVfbG9jaywKKwkubW1hcCA9IGdlbmVyaWNfZmlsZV9tbWFwLAogfTsKZGlmZiAtLWdpdCBhL2ZzLzlwL3Zmc19pbm9kZS5jIGIvZnMvOXAvdmZzX2lub2RlLmMKaW5kZXggMGVhOTY1Yy4uOTFmNTUyNCAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX2lub2RlLmMKKysrIGIvZnMvOXAvdmZzX2lub2RlLmMKQEAgLTQwLDcgKzQwLDYgQEAKICNpbmNsdWRlICJ2OWZzLmgiCiAjaW5jbHVkZSAiOXAuaCIKICNpbmNsdWRlICJ2OWZzX3Zmcy5oIgotI2luY2x1ZGUgImNvbnYuaCIKICNpbmNsdWRlICJmaWQuaCIKIAogc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CkBAIC0xMjcsMTAwICsxMjYsMzIgQEAKIH0KIAogLyoqCi0gKiB2OWZzX2JsYW5rX21pc3RhdCAtIGhlbHBlciBmdW5jdGlvbiB0byBzZXR1cCBhIDlQIHN0YXQgc3RydWN0dXJlCisgKiB2OWZzX2JsYW5rX3dzdGF0IC0gaGVscGVyIGZ1bmN0aW9uIHRvIHNldHVwIGEgOVAgc3RhdCBzdHJ1Y3R1cmUKICAqIEB2OXNlczogOVAgc2Vzc2lvbiBpbmZvIChmb3IgZGV0ZXJtaW5pbmcgZXh0ZW5kZWQgbW9kZSkKLSAqIEBtaXN0YXQ6IHN0cnVjdHVyZSB0byBpbml0aWFsaXplCisgKiBAd3N0YXQ6IHN0cnVjdHVyZSB0byBpbml0aWFsaXplCiAgKgogICovCiAKIHN0YXRpYyB2b2lkCi12OWZzX2JsYW5rX21pc3RhdChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBzdHJ1Y3Qgdjlmc19zdGF0ICptaXN0YXQpCit2OWZzX2JsYW5rX3dzdGF0KHN0cnVjdCB2OWZzX3dzdGF0ICp3c3RhdCkKIHsKLQltaXN0YXQtPnR5cGUgPSB+MDsKLQltaXN0YXQtPmRldiA9IH4wOwotCW1pc3RhdC0+cWlkLnR5cGUgPSB+MDsKLQltaXN0YXQtPnFpZC52ZXJzaW9uID0gfjA7Ci0JKigobG9uZyBsb25nICopJm1pc3RhdC0+cWlkLnBhdGgpID0gfjA7Ci0JbWlzdGF0LT5tb2RlID0gfjA7Ci0JbWlzdGF0LT5hdGltZSA9IH4wOwotCW1pc3RhdC0+bXRpbWUgPSB+MDsKLQltaXN0YXQtPmxlbmd0aCA9IH4wOwotCW1pc3RhdC0+bmFtZSA9IG1pc3RhdC0+ZGF0YTsKLQltaXN0YXQtPnVpZCA9IG1pc3RhdC0+ZGF0YTsKLQltaXN0YXQtPmdpZCA9IG1pc3RhdC0+ZGF0YTsKLQltaXN0YXQtPm11aWQgPSBtaXN0YXQtPmRhdGE7Ci0JaWYgKHY5c2VzLT5leHRlbmRlZCkgewotCQltaXN0YXQtPm5fdWlkID0gfjA7Ci0JCW1pc3RhdC0+bl9naWQgPSB+MDsKLQkJbWlzdGF0LT5uX211aWQgPSB+MDsKLQkJbWlzdGF0LT5leHRlbnNpb24gPSBtaXN0YXQtPmRhdGE7Ci0JfQotCSptaXN0YXQtPmRhdGEgPSAwOwotfQotCi0vKioKLSAqIHY5ZnNfbWlzdGF0MnVuaXggLSBjb252ZXJ0IG1pc3RhdCB0byB1bml4IHN0YXQKLSAqIEBtaXN0YXQ6IFBsYW4gOSBtZXRhZGF0YSAobWlzdGF0KSBzdHJ1Y3R1cmUKLSAqIEBidWY6IHVuaXggbWV0YWRhdGEgKHN0YXQpIHN0cnVjdHVyZSB0byBwb3B1bGF0ZQotICogQHNiOiBzdXBlcmJsb2NrCi0gKgotICovCi0KLXN0YXRpYyB2b2lkCi12OWZzX21pc3RhdDJ1bml4KHN0cnVjdCB2OWZzX3N0YXQgKm1pc3RhdCwgc3RydWN0IHN0YXQgKmJ1ZiwKLQkJIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCi17Ci0Jc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyA9IHNiID8gc2ItPnNfZnNfaW5mbyA6IE5VTEw7Ci0KLQlidWYtPnN0X25saW5rID0gMTsKLQotCWJ1Zi0+c3RfYXRpbWUgPSBtaXN0YXQtPmF0aW1lOwotCWJ1Zi0+c3RfbXRpbWUgPSBtaXN0YXQtPm10aW1lOwotCWJ1Zi0+c3RfY3RpbWUgPSBtaXN0YXQtPm10aW1lOwotCi0JYnVmLT5zdF91aWQgPSAodW5zaWduZWQgc2hvcnQpLTE7Ci0JYnVmLT5zdF9naWQgPSAodW5zaWduZWQgc2hvcnQpLTE7Ci0KLQlpZiAodjlzZXMgJiYgdjlzZXMtPmV4dGVuZGVkKSB7Ci0JCS8qIFRPRE86IHN0cmluZyB0byB1aWQgbWFwcGluZyB2aWEgdXNlci1zcGFjZSBkYWVtb24gKi8KLQkJaWYgKG1pc3RhdC0+bl91aWQgIT0gLTEpCi0JCQlzc2NhbmYobWlzdGF0LT51aWQsICIleCIsICh1bnNpZ25lZCBpbnQgKikmYnVmLT5zdF91aWQpOwotCi0JCWlmIChtaXN0YXQtPm5fZ2lkICE9IC0xKQotCQkJc3NjYW5mKG1pc3RhdC0+Z2lkLCAiJXgiLCAodW5zaWduZWQgaW50ICopJmJ1Zi0+c3RfZ2lkKTsKLQl9Ci0KLQlpZiAoYnVmLT5zdF91aWQgPT0gKHVuc2lnbmVkIHNob3J0KS0xKQotCQlidWYtPnN0X3VpZCA9IHY5c2VzLT51aWQ7Ci0JaWYgKGJ1Zi0+c3RfZ2lkID09ICh1bnNpZ25lZCBzaG9ydCktMSkKLQkJYnVmLT5zdF9naWQgPSB2OXNlcy0+Z2lkOwotCi0JYnVmLT5zdF9tb2RlID0gcDltb2RlMnVuaXhtb2RlKHY5c2VzLCBtaXN0YXQtPm1vZGUpOwotCWlmICgoU19JU0JMSyhidWYtPnN0X21vZGUpKSB8fCAoU19JU0NIUihidWYtPnN0X21vZGUpKSkgewotCQljaGFyIHR5cGUgPSAwOwotCQlpbnQgbWFqb3IgPSAtMTsKLQkJaW50IG1pbm9yID0gLTE7Ci0JCXNzY2FuZihtaXN0YXQtPmV4dGVuc2lvbiwgIiVjICV1ICV1IiwgJnR5cGUsICZtYWpvciwgJm1pbm9yKTsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgJ2MnOgotCQkJYnVmLT5zdF9tb2RlICY9IH5TX0lGQkxLOwotCQkJYnVmLT5zdF9tb2RlIHw9IFNfSUZDSFI7Ci0JCQlicmVhazsKLQkJY2FzZSAnYic6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWRwcmludGsoREVCVUdfRVJST1IsICJVbmtub3duIHNwZWNpYWwgdHlwZSAlYyAoJXMpXG4iLAotCQkJCXR5cGUsIG1pc3RhdC0+ZXh0ZW5zaW9uKTsKLQkJfTsKLQkJYnVmLT5zdF9yZGV2ID0gTUtERVYobWFqb3IsIG1pbm9yKTsKLQl9IGVsc2UKLQkJYnVmLT5zdF9yZGV2ID0gMDsKLQotCWJ1Zi0+c3Rfc2l6ZSA9IG1pc3RhdC0+bGVuZ3RoOwotCi0JYnVmLT5zdF9ibGtzaXplID0gc2ItPnNfYmxvY2tzaXplOwotCWJ1Zi0+c3RfYmxvY2tzID0KLQkgICAgKGJ1Zi0+c3Rfc2l6ZSArIGJ1Zi0+c3RfYmxrc2l6ZSAtIDEpID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCXdzdGF0LT50eXBlID0gfjA7CisJd3N0YXQtPmRldiA9IH4wOworCXdzdGF0LT5xaWQudHlwZSA9IH4wOworCXdzdGF0LT5xaWQudmVyc2lvbiA9IH4wOworCSooKGxvbmcgbG9uZyAqKSZ3c3RhdC0+cWlkLnBhdGgpID0gfjA7CisJd3N0YXQtPm1vZGUgPSB+MDsKKwl3c3RhdC0+YXRpbWUgPSB+MDsKKwl3c3RhdC0+bXRpbWUgPSB+MDsKKwl3c3RhdC0+bGVuZ3RoID0gfjA7CisJd3N0YXQtPm5hbWUgPSBOVUxMOworCXdzdGF0LT51aWQgPSBOVUxMOworCXdzdGF0LT5naWQgPSBOVUxMOworCXdzdGF0LT5tdWlkID0gTlVMTDsKKwl3c3RhdC0+bl91aWQgPSB+MDsKKwl3c3RhdC0+bl9naWQgPSB+MDsKKwl3c3RhdC0+bl9tdWlkID0gfjA7CisJd3N0YXQtPmV4dGVuc2lvbiA9IE5VTEw7CiB9CiAKIC8qKgpAQCAtMjQ2LDYgKzE3Nyw3IEBACiAJCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJCWlub2RlLT5pX3JkZXYgPSAwOwogCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnY5ZnNfYWRkcl9vcGVyYXRpb25zOwogCiAJCXN3aXRjaCAobW9kZSAmIFNfSUZNVCkgewogCQljYXNlIFNfSUZJRk86CkBAIC0zMTIsMTIgKzI0NCwxMiBAQAogCXN0cnVjdCBpbm9kZSAqZmlsZV9pbm9kZSA9IE5VTEw7CiAJc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsID0gTlVMTDsKIAlzdHJ1Y3Qgdjlmc19xaWQgcWlkOwotCXN0cnVjdCBzdGF0IG5ld3N0YXQ7CiAJaW50IGRpcmZpZG51bSA9IC0xOwogCWxvbmcgbmV3ZmlkID0gLTE7CiAJaW50IHJlc3VsdCA9IDA7CiAJdW5zaWduZWQgaW50IGlvdW5pdCA9IDA7CiAJaW50IHdmaWRubyA9IC0xOworCWludCBlcnI7CiAKIAlwZXJtID0gdW5peG1vZGUycDltb2RlKHY5c2VzLCBwZXJtKTsKIApAQCAtMzQ5LDU3ICsyODEsNjQgQEAKIAogCXJlc3VsdCA9IHY5ZnNfdF93YWxrKHY5c2VzLCBkaXJmaWRudW0sIG5ld2ZpZCwgTlVMTCwgJmZjYWxsKTsKIAlpZiAocmVzdWx0IDwgMCkgewotCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiY2xvbmUgZXJyb3I6ICVzXG4iLCBGQ0FMTF9FUlJPUihmY2FsbCkpOworCQlQUklOVF9GQ0FMTF9FUlJPUigiY2xvbmUgZXJyb3IiLCBmY2FsbCk7CiAJCXY5ZnNfcHV0X2lkcG9vbChuZXdmaWQsICZ2OXNlcy0+ZmlkcG9vbCk7CiAJCW5ld2ZpZCA9IC0xOwogCQlnb3RvIENsZWFuVXBGaWQ7CiAJfQogCiAJa2ZyZWUoZmNhbGwpOworCWZjYWxsID0gTlVMTDsKIAogCXJlc3VsdCA9IHY5ZnNfdF9jcmVhdGUodjlzZXMsIG5ld2ZpZCwgKGNoYXIgKilmaWxlX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCQkgICAgICAgcGVybSwgb3Blbl9tb2RlLCAmZmNhbGwpOwogCWlmIChyZXN1bHQgPCAwKSB7Ci0JCWRwcmludGsoREVCVUdfRVJST1IsICJjcmVhdGUgZmFpbHM6ICVzKCVkKVxuIiwKLQkJCUZDQUxMX0VSUk9SKGZjYWxsKSwgcmVzdWx0KTsKLQorCQlQUklOVF9GQ0FMTF9FUlJPUigiY3JlYXRlIGZhaWxzIiwgZmNhbGwpOwogCQlnb3RvIENsZWFuVXBGaWQ7CiAJfQogCiAJaW91bml0ID0gZmNhbGwtPnBhcmFtcy5yY3JlYXRlLmlvdW5pdDsKIAlxaWQgPSBmY2FsbC0+cGFyYW1zLnJjcmVhdGUucWlkOwogCWtmcmVlKGZjYWxsKTsKKwlmY2FsbCA9IE5VTEw7CiAKLQlmaWQgPSB2OWZzX2ZpZF9jcmVhdGUoZmlsZV9kZW50cnksIHY5c2VzLCBuZXdmaWQsIDEpOwotCWRwcmludGsoREVCVUdfVkZTLCAiZmlkICVwICVkXG4iLCBmaWQsIGZpZC0+ZmlkY3JlYXRlKTsKLQlpZiAoIWZpZCkgewotCQlyZXN1bHQgPSAtRU5PTUVNOwotCQlnb3RvIENsZWFuVXBGaWQ7CisJaWYgKCEocGVybSZWOUZTX0RNRElSKSkgeworCQlmaWQgPSB2OWZzX2ZpZF9jcmVhdGUoZmlsZV9kZW50cnksIHY5c2VzLCBuZXdmaWQsIDEpOworCQlkcHJpbnRrKERFQlVHX1ZGUywgImZpZCAlcCAlZFxuIiwgZmlkLCBmaWQtPmZpZGNyZWF0ZSk7CisJCWlmICghZmlkKSB7CisJCQlyZXN1bHQgPSAtRU5PTUVNOworCQkJZ290byBDbGVhblVwRmlkOworCQl9CisKKwkJZmlkLT5xaWQgPSBxaWQ7CisJCWZpZC0+aW91bml0ID0gaW91bml0OworCX0gZWxzZSB7CisJCWVyciA9IHY5ZnNfdF9jbHVuayh2OXNlcywgbmV3ZmlkKTsKKwkJbmV3ZmlkID0gLTE7CisJCWlmIChlcnIgPCAwKQorCQkJZHByaW50ayhERUJVR19FUlJPUiwgImNsdW5rIGZvciBta2RpciBmYWlsZWQ6ICVkXG4iLCBlcnIpOwogCX0KIAotCWZpZC0+cWlkID0gcWlkOwotCWZpZC0+aW91bml0ID0gaW91bml0OwotCiAJLyogd2FsayB0byB0aGUgbmV3bHkgY3JlYXRlZCBmaWxlIGFuZCBwdXQgdGhlIGZpZCBpbiB0aGUgZGVudHJ5ICovCiAJd2ZpZG5vID0gdjlmc19nZXRfaWRwb29sKCZ2OXNlcy0+ZmlkcG9vbCk7Ci0JaWYgKG5ld2ZpZCA8IDApIHsKKwlpZiAod2ZpZG5vIDwgMCkgewogCQllcHJpbnRrKEtFUk5fV0FSTklORywgIm5vIGZyZWUgZmlkcyBhdmFpbGFibGVcbiIpOwogCQlyZXR1cm4gLUVOT1NQQzsKIAl9CiAKIAlyZXN1bHQgPSB2OWZzX3Rfd2Fsayh2OXNlcywgZGlyZmlkbnVtLCB3Zmlkbm8sCi0JCShjaGFyICopIGZpbGVfZGVudHJ5LT5kX25hbWUubmFtZSwgTlVMTCk7CisJCShjaGFyICopIGZpbGVfZGVudHJ5LT5kX25hbWUubmFtZSwgJmZjYWxsKTsKIAlpZiAocmVzdWx0IDwgMCkgewotCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiY2xvbmUgZXJyb3I6ICVzXG4iLCBGQ0FMTF9FUlJPUihmY2FsbCkpOworCQlQUklOVF9GQ0FMTF9FUlJPUigiY2xvbmUgZXJyb3IiLCBmY2FsbCk7CiAJCXY5ZnNfcHV0X2lkcG9vbCh3Zmlkbm8sICZ2OXNlcy0+ZmlkcG9vbCk7CiAJCXdmaWRubyA9IC0xOwogCQlnb3RvIENsZWFuVXBGaWQ7CiAJfQorCWtmcmVlKGZjYWxsKTsKKwlmY2FsbCA9IE5VTEw7CiAKIAlpZiAoIXY5ZnNfZmlkX2NyZWF0ZShmaWxlX2RlbnRyeSwgdjlzZXMsIHdmaWRubywgMCkpIHsKLQkJaWYgKCF2OWZzX3RfY2x1bmsodjlzZXMsIG5ld2ZpZCwgJmZjYWxsKSkgewotCQkJdjlmc19wdXRfaWRwb29sKHdmaWRubywgJnY5c2VzLT5maWRwb29sKTsKLQkJfQorCQl2OWZzX3B1dF9pZHBvb2wod2ZpZG5vLCAmdjlzZXMtPmZpZHBvb2wpOwogCiAJCWdvdG8gQ2xlYW5VcEZpZDsKIAl9CkBAIC00MDksNjIgKzM0OCw0MyBAQAogCSAgICAocGVybSAmIFY5RlNfRE1ERVZJQ0UpKQogCQlyZXR1cm4gMDsKIAotCXJlc3VsdCA9IHY5ZnNfdF9zdGF0KHY5c2VzLCBuZXdmaWQsICZmY2FsbCk7CisJcmVzdWx0ID0gdjlmc190X3N0YXQodjlzZXMsIHdmaWRubywgJmZjYWxsKTsKIAlpZiAocmVzdWx0IDwgMCkgewotCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAic3RhdCBlcnJvcjogJXMoJWQpXG4iLCBGQ0FMTF9FUlJPUihmY2FsbCksCi0JCQlyZXN1bHQpOworCQlQUklOVF9GQ0FMTF9FUlJPUigic3RhdCBlcnJvciIsIGZjYWxsKTsKIAkJZ290byBDbGVhblVwRmlkOwogCX0KIAotCXY5ZnNfbWlzdGF0MnVuaXgoZmNhbGwtPnBhcmFtcy5yc3RhdC5zdGF0LCAmbmV3c3RhdCwgc2IpOwogCi0JZmlsZV9pbm9kZSA9IHY5ZnNfZ2V0X2lub2RlKHNiLCBuZXdzdGF0LnN0X21vZGUpOworCWZpbGVfaW5vZGUgPSB2OWZzX2dldF9pbm9kZShzYiwKKwkJcDltb2RlMnVuaXhtb2RlKHY5c2VzLCBmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQubW9kZSkpOworCiAJaWYgKCghZmlsZV9pbm9kZSkgfHwgSVNfRVJSKGZpbGVfaW5vZGUpKSB7CiAJCWRwcmludGsoREVCVUdfRVJST1IsICJjcmVhdGUgaW5vZGUgZmFpbGVkXG4iKTsKIAkJcmVzdWx0ID0gLUVCQURGOwogCQlnb3RvIENsZWFuVXBGaWQ7CiAJfQogCi0Jdjlmc19taXN0YXQyaW5vZGUoZmNhbGwtPnBhcmFtcy5yc3RhdC5zdGF0LCBmaWxlX2lub2RlLCBzYik7CisJdjlmc19zdGF0Mmlub2RlKCZmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQsIGZpbGVfaW5vZGUsIHNiKTsKIAlrZnJlZShmY2FsbCk7CiAJZmNhbGwgPSBOVUxMOwogCWZpbGVfZGVudHJ5LT5kX29wID0gJnY5ZnNfZGVudHJ5X29wZXJhdGlvbnM7CiAJZF9pbnN0YW50aWF0ZShmaWxlX2RlbnRyeSwgZmlsZV9pbm9kZSk7CiAKLQlpZiAocGVybSAmIFY5RlNfRE1ESVIpIHsKLQkJaWYgKCF2OWZzX3RfY2x1bmsodjlzZXMsIG5ld2ZpZCwgJmZjYWxsKSkKLQkJCXY5ZnNfcHV0X2lkcG9vbChuZXdmaWQsICZ2OXNlcy0+ZmlkcG9vbCk7Ci0JCWVsc2UKLQkJCWRwcmludGsoREVCVUdfRVJST1IsICJjbHVuayBmb3IgbWtkaXIgZmFpbGVkOiAlc1xuIiwKLQkJCQlGQ0FMTF9FUlJPUihmY2FsbCkpOwotCQlrZnJlZShmY2FsbCk7Ci0JCWZpZC0+Zmlkb3BlbiA9IDA7Ci0JCWZpZC0+ZmlkY3JlYXRlID0gMDsKLQkJZF9kcm9wKGZpbGVfZGVudHJ5KTsKLQl9Ci0KIAlyZXR1cm4gMDsKIAogICAgICAgQ2xlYW5VcEZpZDoKIAlrZnJlZShmY2FsbCk7CisJZmNhbGwgPSBOVUxMOwogCiAJaWYgKG5ld2ZpZCA+PSAwKSB7Ci0JCWlmICghdjlmc190X2NsdW5rKHY5c2VzLCBuZXdmaWQsICZmY2FsbCkpCi0JCQl2OWZzX3B1dF9pZHBvb2wobmV3ZmlkLCAmdjlzZXMtPmZpZHBvb2wpOwotCQllbHNlCi0JCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiY2x1bmsgZmFpbGVkOiAlc1xuIiwKLQkJCQlGQ0FMTF9FUlJPUihmY2FsbCkpOwotCi0JCWtmcmVlKGZjYWxsKTsKKyAJCWVyciA9IHY5ZnNfdF9jbHVuayh2OXNlcywgbmV3ZmlkKTsKKyAJCWlmIChlcnIgPCAwKQorIAkJCWRwcmludGsoREVCVUdfRVJST1IsICJjbHVuayBmYWlsZWQ6ICVkXG4iLCBlcnIpOwogCX0KIAlpZiAod2ZpZG5vID49IDApIHsKLQkJaWYgKCF2OWZzX3RfY2x1bmsodjlzZXMsIHdmaWRubywgJmZjYWxsKSkKLQkJCXY5ZnNfcHV0X2lkcG9vbCh3Zmlkbm8sICZ2OXNlcy0+ZmlkcG9vbCk7Ci0JCWVsc2UKLQkJCWRwcmludGsoREVCVUdfRVJST1IsICJjbHVuayBmYWlsZWQ6ICVzXG4iLAotCQkJCUZDQUxMX0VSUk9SKGZjYWxsKSk7Ci0KLQkJa2ZyZWUoZmNhbGwpOworIAkJZXJyID0gdjlmc190X2NsdW5rKHY5c2VzLCB3Zmlkbm8pOworIAkJaWYgKGVyciA8IDApCisgCQkJZHByaW50ayhERUJVR19FUlJPUiwgImNsdW5rIGZhaWxlZDogJWRcbiIsIGVycik7CiAJfQogCXJldHVybiByZXN1bHQ7CiB9CkBAIC01MDksMTAgKzQyOSw5IEBACiAJfQogCiAJcmVzdWx0ID0gdjlmc190X3JlbW92ZSh2OXNlcywgZmlkLCAmZmNhbGwpOwotCWlmIChyZXN1bHQgPCAwKQotCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAicmVtb3ZlIG9mIGZpbGUgZmFpbHM6ICVzKCVkKVxuIiwKLQkJCUZDQUxMX0VSUk9SKGZjYWxsKSwgcmVzdWx0KTsKLQllbHNlIHsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlQUklOVF9GQ0FMTF9FUlJPUigicmVtb3ZlIGZhaWxzIiwgZmNhbGwpOworCX0gZWxzZSB7CiAJCXY5ZnNfcHV0X2lkcG9vbChmaWQsICZ2OXNlcy0+ZmlkcG9vbCk7CiAJCXY5ZnNfZmlkX2Rlc3Ryb3kodjlmaWQpOwogCX0KQEAgLTU2Nyw3ICs0ODYsNiBAQAogCXN0cnVjdCB2OWZzX2ZpZCAqZmlkOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsID0gTlVMTDsKLQlzdHJ1Y3Qgc3RhdCBuZXdzdGF0OwogCWludCBkaXJmaWRudW0gPSAtMTsKIAlpbnQgbmV3ZmlkID0gLTE7CiAJaW50IHJlc3VsdCA9IDA7CkBAIC02MjAsOCArNTM4LDggQEAKIAkJZ290byBGcmVlRmNhbGw7CiAJfQogCi0Jdjlmc19taXN0YXQydW5peChmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQsICZuZXdzdGF0LCBzYik7Ci0JaW5vZGUgPSB2OWZzX2dldF9pbm9kZShzYiwgbmV3c3RhdC5zdF9tb2RlKTsKKwlpbm9kZSA9IHY5ZnNfZ2V0X2lub2RlKHNiLCBwOW1vZGUydW5peG1vZGUodjlzZXMsCisJCWZjYWxsLT5wYXJhbXMucnN0YXQuc3RhdC5tb2RlKSk7CiAKIAlpZiAoSVNfRVJSKGlub2RlKSAmJiAoUFRSX0VSUihpbm9kZSkgPT0gLUVOT1NQQykpIHsKIAkJZXByaW50ayhLRVJOX1dBUk5JTkcsICJpbm9kZSBhbGxvYyBmYWlsZXMsIHJldHVybnMgJWxkXG4iLApAQCAtNjMxLDcgKzU0OSw3IEBACiAJCWdvdG8gRnJlZUZjYWxsOwogCX0KIAotCWlub2RlLT5pX2lubyA9IHY5ZnNfcWlkMmlubygmZmNhbGwtPnBhcmFtcy5yc3RhdC5zdGF0LT5xaWQpOworCWlub2RlLT5pX2lubyA9IHY5ZnNfcWlkMmlubygmZmNhbGwtPnBhcmFtcy5yc3RhdC5zdGF0LnFpZCk7CiAKIAlmaWQgPSB2OWZzX2ZpZF9jcmVhdGUoZGVudHJ5LCB2OXNlcywgbmV3ZmlkLCAwKTsKIAlpZiAoZmlkID09IE5VTEwpIHsKQEAgLTY0MCwxMCArNTU4LDEwIEBACiAJCWdvdG8gRnJlZUZjYWxsOwogCX0KIAotCWZpZC0+cWlkID0gZmNhbGwtPnBhcmFtcy5yc3RhdC5zdGF0LT5xaWQ7CisJZmlkLT5xaWQgPSBmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQucWlkOwogCiAJZGVudHJ5LT5kX29wID0gJnY5ZnNfZGVudHJ5X29wZXJhdGlvbnM7Ci0Jdjlmc19taXN0YXQyaW5vZGUoZmNhbGwtPnBhcmFtcy5yc3RhdC5zdGF0LCBpbm9kZSwgaW5vZGUtPmlfc2IpOworCXY5ZnNfc3RhdDJpbm9kZSgmZmNhbGwtPnBhcmFtcy5yc3RhdC5zdGF0LCBpbm9kZSwgaW5vZGUtPmlfc2IpOwogCiAJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAJa2ZyZWUoZmNhbGwpOwpAQCAtNjk5LDcgKzYxNyw3IEBACiAJICAgIHY5ZnNfZmlkX2xvb2t1cChvbGRfZGVudHJ5LT5kX3BhcmVudCk7CiAJc3RydWN0IHY5ZnNfZmlkICpuZXdkaXJmaWQgPQogCSAgICB2OWZzX2ZpZF9sb29rdXAobmV3X2RlbnRyeS0+ZF9wYXJlbnQpOwotCXN0cnVjdCB2OWZzX3N0YXQgKm1pc3RhdCA9IGttYWxsb2ModjlzZXMtPm1heGRhdGEsIEdGUF9LRVJORUwpOworCXN0cnVjdCB2OWZzX3dzdGF0IHdzdGF0OwogCXN0cnVjdCB2OWZzX2ZjYWxsICpmY2FsbCA9IE5VTEw7CiAJaW50IGZpZCA9IC0xOwogCWludCBvbGRkaXJmaWRudW0gPSAtMTsKQEAgLTcwOCw5ICs2MjYsNiBAQAogCiAJZHByaW50ayhERUJVR19WRlMsICJcbiIpOwogCi0JaWYgKCFtaXN0YXQpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJaWYgKCghb2xkZmlkKSB8fCAoIW9sZGRpcmZpZCkgfHwgKCFuZXdkaXJmaWQpKSB7CiAJCWRwcmludGsoREVCVUdfRVJST1IsICJwcm9ibGVtIHdpdGggYXJndW1lbnRzXG4iKTsKIAkJcmV0dXJuIC1FQkFERjsKQEAgLTczNCwzMyArNjQ5LDIyIEBACiAJCWdvdG8gRnJlZUZjYWxsbkJhaWw7CiAJfQogCi0Jdjlmc19ibGFua19taXN0YXQodjlzZXMsIG1pc3RhdCk7CisJdjlmc19ibGFua193c3RhdCgmd3N0YXQpOworCXdzdGF0Lm11aWQgPSB2OXNlcy0+bmFtZTsKKwl3c3RhdC5uYW1lID0gKGNoYXIgKikgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWU7CiAKLQlzdHJjcHkobWlzdGF0LT5kYXRhICsgMSwgdjlzZXMtPm5hbWUpOwotCW1pc3RhdC0+bmFtZSA9IG1pc3RhdC0+ZGF0YSArIDEgKyBzdHJsZW4odjlzZXMtPm5hbWUpOwotCi0JaWYgKG5ld19kZW50cnktPmRfbmFtZS5sZW4gPgotCSAgICAodjlzZXMtPm1heGRhdGEgLSBzdHJsZW4odjlzZXMtPm5hbWUpIC0gc2l6ZW9mKHN0cnVjdCB2OWZzX3N0YXQpKSkgewotCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAibmV3IG5hbWUgdG9vIGxvbmdcbiIpOwotCQlnb3RvIEZyZWVGY2FsbG5CYWlsOwotCX0KLQotCXN0cmNweShtaXN0YXQtPm5hbWUsIG5ld19kZW50cnktPmRfbmFtZS5uYW1lKTsKLQlyZXR2YWwgPSB2OWZzX3Rfd3N0YXQodjlzZXMsIGZpZCwgbWlzdGF0LCAmZmNhbGwpOworCXJldHZhbCA9IHY5ZnNfdF93c3RhdCh2OXNlcywgZmlkLCAmd3N0YXQsICZmY2FsbCk7CiAKICAgICAgIEZyZWVGY2FsbG5CYWlsOgotCWtmcmVlKG1pc3RhdCk7Ci0KIAlpZiAocmV0dmFsIDwgMCkKLQkJZHByaW50ayhERUJVR19FUlJPUiwgInY5ZnNfdF93c3RhdCBlcnJvcjogJXNcbiIsCi0JCQlGQ0FMTF9FUlJPUihmY2FsbCkpOworCQlQUklOVF9GQ0FMTF9FUlJPUigid3N0YXQgZXJyb3IiLCBmY2FsbCk7CiAKIAlrZnJlZShmY2FsbCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIAogLyoqCi0gKiB2OWZzX3Zmc19nZXRhdHRyIC0gcmV0cmVpdmUgZmlsZSBtZXRhZGF0YQorICogdjlmc192ZnNfZ2V0YXR0ciAtIHJldHJpZXZlIGZpbGUgbWV0YWRhdGEKICAqIEBtbnQgLSBtb3VudCBpbmZvcm1hdGlvbgogICogQGRlbnRyeSAtIGZpbGUgdG8gZ2V0IGF0dHJpYnV0ZXMgb24KICAqIEBzdGF0IC0gbWV0YWRhdGEgc3RydWN0dXJlIHRvIHBvcHVsYXRlCkBAIC03ODgsNyArNjkyLDcgQEAKIAlpZiAoZXJyIDwgMCkKIAkJZHByaW50ayhERUJVR19FUlJPUiwgInN0YXQgZXJyb3JcbiIpOwogCWVsc2UgewotCQl2OWZzX21pc3RhdDJpbm9kZShmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQsIGRlbnRyeS0+ZF9pbm9kZSwKKwkJdjlmc19zdGF0Mmlub2RlKCZmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQsIGRlbnRyeS0+ZF9pbm9kZSwKIAkJCQkgIGRlbnRyeS0+ZF9pbm9kZS0+aV9zYik7CiAJCWdlbmVyaWNfZmlsbGF0dHIoZGVudHJ5LT5kX2lub2RlLCBzdGF0KTsKIAl9CkBAIC04MDksNTcgKzcxMyw0NCBAQAogCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRlbnRyeS0+ZF9pbm9kZSk7CiAJc3RydWN0IHY5ZnNfZmlkICpmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5KTsKIAlzdHJ1Y3Qgdjlmc19mY2FsbCAqZmNhbGwgPSBOVUxMOwotCXN0cnVjdCB2OWZzX3N0YXQgKm1pc3RhdCA9IGttYWxsb2ModjlzZXMtPm1heGRhdGEsIEdGUF9LRVJORUwpOworCXN0cnVjdCB2OWZzX3dzdGF0IHdzdGF0OwogCWludCByZXMgPSAtRVBFUk07CiAKIAlkcHJpbnRrKERFQlVHX1ZGUywgIlxuIik7CiAKLQlpZiAoIW1pc3RhdCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlpZiAoIWZpZCkgewogCQlkcHJpbnRrKERFQlVHX0VSUk9SLAogCQkJIkNvdWxkbid0IGZpbmQgZmlkIGFzc29jaWF0ZWQgd2l0aCBkZW50cnlcbiIpOwogCQlyZXR1cm4gLUVCQURGOwogCX0KIAotCXY5ZnNfYmxhbmtfbWlzdGF0KHY5c2VzLCBtaXN0YXQpOworCXY5ZnNfYmxhbmtfd3N0YXQoJndzdGF0KTsKIAlpZiAoaWF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKQotCQltaXN0YXQtPm1vZGUgPSB1bml4bW9kZTJwOW1vZGUodjlzZXMsIGlhdHRyLT5pYV9tb2RlKTsKKwkJd3N0YXQubW9kZSA9IHVuaXhtb2RlMnA5bW9kZSh2OXNlcywgaWF0dHItPmlhX21vZGUpOwogCiAJaWYgKGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfTVRJTUUpCi0JCW1pc3RhdC0+bXRpbWUgPSBpYXR0ci0+aWFfbXRpbWUudHZfc2VjOworCQl3c3RhdC5tdGltZSA9IGlhdHRyLT5pYV9tdGltZS50dl9zZWM7CiAKIAlpZiAoaWF0dHItPmlhX3ZhbGlkICYgQVRUUl9BVElNRSkKLQkJbWlzdGF0LT5hdGltZSA9IGlhdHRyLT5pYV9hdGltZS50dl9zZWM7CisJCXdzdGF0LmF0aW1lID0gaWF0dHItPmlhX2F0aW1lLnR2X3NlYzsKIAogCWlmIChpYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpCi0JCW1pc3RhdC0+bGVuZ3RoID0gaWF0dHItPmlhX3NpemU7CisJCXdzdGF0Lmxlbmd0aCA9IGlhdHRyLT5pYV9zaXplOwogCiAJaWYgKHY5c2VzLT5leHRlbmRlZCkgewotCQljaGFyICpwdHIgPSBtaXN0YXQtPmRhdGErMTsKKwkJaWYgKGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfVUlEKQorCQkJd3N0YXQubl91aWQgPSBpYXR0ci0+aWFfdWlkOwogCi0JCWlmIChpYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCkgewotCQkJbWlzdGF0LT51aWQgPSBwdHI7Ci0JCQlwdHIgKz0gMStzcHJpbnRmKHB0ciwgIiUwOHgiLCBpYXR0ci0+aWFfdWlkKTsKLQkJCW1pc3RhdC0+bl91aWQgPSBpYXR0ci0+aWFfdWlkOwotCQl9Ci0KLQkJaWYgKGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfR0lEKSB7Ci0JCQltaXN0YXQtPmdpZCA9IHB0cjsKLQkJCXB0ciArPSAxK3NwcmludGYocHRyLCAiJTA4eCIsIGlhdHRyLT5pYV9naWQpOwotCQkJbWlzdGF0LT5uX2dpZCA9IGlhdHRyLT5pYV9naWQ7Ci0JCX0KKwkJaWYgKGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfR0lEKQorCQkJd3N0YXQubl9naWQgPSBpYXR0ci0+aWFfZ2lkOwogCX0KIAotCXJlcyA9IHY5ZnNfdF93c3RhdCh2OXNlcywgZmlkLT5maWQsIG1pc3RhdCwgJmZjYWxsKTsKKwlyZXMgPSB2OWZzX3Rfd3N0YXQodjlzZXMsIGZpZC0+ZmlkLCAmd3N0YXQsICZmY2FsbCk7CiAKIAlpZiAocmVzIDwgMCkKLQkJZHByaW50ayhERUJVR19FUlJPUiwgIndzdGF0IGVycm9yOiAlc1xuIiwgRkNBTExfRVJST1IoZmNhbGwpKTsKKwkJUFJJTlRfRkNBTExfRVJST1IoIndzdGF0IGVycm9yIiwgZmNhbGwpOwogCi0Ja2ZyZWUobWlzdGF0KTsKIAlrZnJlZShmY2FsbCk7Ci0KIAlpZiAocmVzID49IDApCiAJCXJlcyA9IGlub2RlX3NldGF0dHIoZGVudHJ5LT5kX2lub2RlLCBpYXR0cik7CiAKQEAgLTg2Nyw1MSArNzU4LDQ3IEBACiB9CiAKIC8qKgotICogdjlmc19taXN0YXQyaW5vZGUgLSBwb3B1bGF0ZSBhbiBpbm9kZSBzdHJ1Y3R1cmUgd2l0aCBtaXN0YXQgaW5mbwotICogQG1pc3RhdDogUGxhbiA5IG1ldGFkYXRhIChtaXN0YXQpIHN0cnVjdHVyZQorICogdjlmc19zdGF0Mmlub2RlIC0gcG9wdWxhdGUgYW4gaW5vZGUgc3RydWN0dXJlIHdpdGggbWlzdGF0IGluZm8KKyAqIEBzdGF0OiBQbGFuIDkgbWV0YWRhdGEgKG1pc3RhdCkgc3RydWN0dXJlCiAgKiBAaW5vZGU6IGlub2RlIHRvIHBvcHVsYXRlCiAgKiBAc2I6IHN1cGVyYmxvY2sgb2YgZmlsZXN5c3RlbQogICoKICAqLwogCiB2b2lkCi12OWZzX21pc3RhdDJpbm9kZShzdHJ1Y3Qgdjlmc19zdGF0ICptaXN0YXQsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCSAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3Y5ZnNfc3RhdDJpbm9kZShzdHJ1Y3Qgdjlmc19zdGF0ICpzdGF0LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CisJaW50IG47CisJY2hhciBleHRbMzJdOwogCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMgPSBzYi0+c19mc19pbmZvOwogCiAJaW5vZGUtPmlfbmxpbmsgPSAxOwogCi0JaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gbWlzdGF0LT5hdGltZTsKLQlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBtaXN0YXQtPm10aW1lOwotCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IG1pc3RhdC0+bXRpbWU7CisJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gc3RhdC0+YXRpbWU7CisJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gc3RhdC0+bXRpbWU7CisJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gc3RhdC0+bXRpbWU7CiAKLQlpbm9kZS0+aV91aWQgPSAtMTsKLQlpbm9kZS0+aV9naWQgPSAtMTsKKwlpbm9kZS0+aV91aWQgPSB2OXNlcy0+dWlkOworCWlub2RlLT5pX2dpZCA9IHY5c2VzLT5naWQ7CiAKIAlpZiAodjlzZXMtPmV4dGVuZGVkKSB7Ci0JCS8qIFRPRE86IHN0cmluZyB0byB1aWQgbWFwcGluZyB2aWEgdXNlci1zcGFjZSBkYWVtb24gKi8KLQkJaW5vZGUtPmlfdWlkID0gbWlzdGF0LT5uX3VpZDsKLQkJaW5vZGUtPmlfZ2lkID0gbWlzdGF0LT5uX2dpZDsKLQotCQlpZiAobWlzdGF0LT5uX3VpZCA9PSAtMSkKLQkJCXNzY2FuZihtaXN0YXQtPnVpZCwgIiV4IiwgJmlub2RlLT5pX3VpZCk7Ci0KLQkJaWYgKG1pc3RhdC0+bl9naWQgPT0gLTEpCi0JCQlzc2NhbmYobWlzdGF0LT5naWQsICIleCIsICZpbm9kZS0+aV9naWQpOworCQlpbm9kZS0+aV91aWQgPSBzdGF0LT5uX3VpZDsKKwkJaW5vZGUtPmlfZ2lkID0gc3RhdC0+bl9naWQ7CiAJfQogCi0JaWYgKGlub2RlLT5pX3VpZCA9PSAtMSkKLQkJaW5vZGUtPmlfdWlkID0gdjlzZXMtPnVpZDsKLQlpZiAoaW5vZGUtPmlfZ2lkID09IC0xKQotCQlpbm9kZS0+aV9naWQgPSB2OXNlcy0+Z2lkOwotCi0JaW5vZGUtPmlfbW9kZSA9IHA5bW9kZTJ1bml4bW9kZSh2OXNlcywgbWlzdGF0LT5tb2RlKTsKKwlpbm9kZS0+aV9tb2RlID0gcDltb2RlMnVuaXhtb2RlKHY5c2VzLCBzdGF0LT5tb2RlKTsKIAlpZiAoKFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpIHx8IChTX0lTQ0hSKGlub2RlLT5pX21vZGUpKSkgewogCQljaGFyIHR5cGUgPSAwOwogCQlpbnQgbWFqb3IgPSAtMTsKIAkJaW50IG1pbm9yID0gLTE7Ci0JCXNzY2FuZihtaXN0YXQtPmV4dGVuc2lvbiwgIiVjICV1ICV1IiwgJnR5cGUsICZtYWpvciwgJm1pbm9yKTsKKworCQluID0gc3RhdC0+ZXh0ZW5zaW9uLmxlbjsKKwkJaWYgKG4gPiBzaXplb2YoZXh0KS0xKQorCQkJbiA9IHNpemVvZihleHQpLTE7CisJCW1lbW1vdmUoZXh0LCBzdGF0LT5leHRlbnNpb24uc3RyLCBuKTsKKwkJZXh0W25dID0gMDsKKwkJc3NjYW5mKGV4dCwgIiVjICV1ICV1IiwgJnR5cGUsICZtYWpvciwgJm1pbm9yKTsKIAkJc3dpdGNoICh0eXBlKSB7CiAJCWNhc2UgJ2MnOgogCQkJaW5vZGUtPmlfbW9kZSAmPSB+U19JRkJMSzsKQEAgLTkyMCwxNCArODA3LDE0IEBACiAJCWNhc2UgJ2InOgogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiVW5rbm93biBzcGVjaWFsIHR5cGUgJWMgKCVzKVxuIiwKLQkJCQl0eXBlLCBtaXN0YXQtPmV4dGVuc2lvbik7CisJCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiVW5rbm93biBzcGVjaWFsIHR5cGUgJWMgKCUuKnMpXG4iLAorCQkJCXR5cGUsIHN0YXQtPmV4dGVuc2lvbi5sZW4sIHN0YXQtPmV4dGVuc2lvbi5zdHIpOwogCQl9OwogCQlpbm9kZS0+aV9yZGV2ID0gTUtERVYobWFqb3IsIG1pbm9yKTsKIAl9IGVsc2UKIAkJaW5vZGUtPmlfcmRldiA9IDA7CiAKLQlpbm9kZS0+aV9zaXplID0gbWlzdGF0LT5sZW5ndGg7CisJaW5vZGUtPmlfc2l6ZSA9IHN0YXQtPmxlbmd0aDsKIAogCWlub2RlLT5pX2Jsa3NpemUgPSBzYi0+c19ibG9ja3NpemU7CiAJaW5vZGUtPmlfYmxvY2tzID0KQEAgLTk1NSw3MSArODQyLDYgQEAKIH0KIAogLyoqCi0gKiB2OWZzX3Zmc19zeW1saW5rIC0gaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBzeW1saW5rcwotICogQGRpcjogZGlyZWN0b3J5IGlub2RlIGNvbnRhaW5pbmcgc3ltbGluawotICogQGRlbnRyeTogZGVudHJ5IGZvciBzeW1saW5rCi0gKiBAc3ltbmFtZTogc3ltbGluayBkYXRhCi0gKgotICogU2VlIDlQMjAwMC51IFJGQyBmb3IgbW9yZSBpbmZvcm1hdGlvbgotICoKLSAqLwotCi1zdGF0aWMgaW50Ci12OWZzX3Zmc19zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKnN5bW5hbWUpCi17Ci0JaW50IHJldHZhbCA9IC1FUEVSTTsKLQlzdHJ1Y3Qgdjlmc19maWQgKm5ld2ZpZDsKLQlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhkaXIpOwotCXN0cnVjdCB2OWZzX2ZjYWxsICpmY2FsbCA9IE5VTEw7Ci0Jc3RydWN0IHY5ZnNfc3RhdCAqbWlzdGF0ID0ga21hbGxvYyh2OXNlcy0+bWF4ZGF0YSwgR0ZQX0tFUk5FTCk7Ci0KLQlkcHJpbnRrKERFQlVHX1ZGUywgIiAlbHUsJXMsJXNcbiIsIGRpci0+aV9pbm8sIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCi0JCXN5bW5hbWUpOwotCi0JaWYgKCFtaXN0YXQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKCF2OXNlcy0+ZXh0ZW5kZWQpIHsKLQkJZHByaW50ayhERUJVR19FUlJPUiwgIm5vdCBleHRlbmRlZFxuIik7Ci0JCWdvdG8gRnJlZUZjYWxsOwotCX0KLQotCS8qIGlzc3VlIGEgY3JlYXRlICovCi0JcmV0dmFsID0gdjlmc19jcmVhdGUoZGlyLCBkZW50cnksIFNfSUZMTkssIDApOwotCWlmIChyZXR2YWwgIT0gMCkKLQkJZ290byBGcmVlRmNhbGw7Ci0KLQluZXdmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5KTsKLQotCS8qIGlzc3VlIGEgdHdzdGF0ICovCi0Jdjlmc19ibGFua19taXN0YXQodjlzZXMsIG1pc3RhdCk7Ci0Jc3RyY3B5KG1pc3RhdC0+ZGF0YSArIDEsIHN5bW5hbWUpOwotCW1pc3RhdC0+ZXh0ZW5zaW9uID0gbWlzdGF0LT5kYXRhICsgMTsKLQlyZXR2YWwgPSB2OWZzX3Rfd3N0YXQodjlzZXMsIG5ld2ZpZC0+ZmlkLCBtaXN0YXQsICZmY2FsbCk7Ci0JaWYgKHJldHZhbCA8IDApIHsKLQkJZHByaW50ayhERUJVR19FUlJPUiwgInY5ZnNfdF93c3RhdCBlcnJvcjogJXNcbiIsCi0JCQlGQ0FMTF9FUlJPUihmY2FsbCkpOwotCQlnb3RvIEZyZWVGY2FsbDsKLQl9Ci0KLQlrZnJlZShmY2FsbCk7Ci0KLQlpZiAodjlmc190X2NsdW5rKHY5c2VzLCBuZXdmaWQtPmZpZCwgJmZjYWxsKSkgewotCQlkcHJpbnRrKERFQlVHX0VSUk9SLCAiY2x1bmsgZm9yIHN5bWxpbmsgZmFpbGVkOiAlc1xuIiwKLQkJCUZDQUxMX0VSUk9SKGZjYWxsKSk7Ci0JCWdvdG8gRnJlZUZjYWxsOwotCX0KLQotCWRfZHJvcChkZW50cnkpOwkJLyogRklEIC0gd2lsbCB0aGlzIGFsc28gY2x1bms/ICovCi0KLSAgICAgIEZyZWVGY2FsbDoKLQlrZnJlZShtaXN0YXQpOwotCWtmcmVlKGZjYWxsKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgogICogdjlmc19yZWFkbGluayAtIHJlYWQgYSBzeW1saW5rJ3MgbG9jYXRpb24gKGludGVybmFsIHZlcnNpb24pCiAgKiBAZGVudHJ5OiBkZW50cnkgZm9yIHN5bWxpbmsKICAqIEBidWZmZXI6IGJ1ZmZlciB0byBsb2FkIHN5bWxpbmsgbG9jYXRpb24gaW50bwpAQCAtMTA1OCwxNiArODgwLDE3IEBACiAJaWYgKCFmY2FsbCkKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAoIShmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQtPm1vZGUgJiBWOUZTX0RNU1lNTElOSykpIHsKKwlpZiAoIShmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQubW9kZSAmIFY5RlNfRE1TWU1MSU5LKSkgewogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIEZyZWVGY2FsbDsKIAl9CiAKIAkvKiBjb3B5IGV4dGVuc2lvbiBidWZmZXIgaW50byBidWZmZXIgKi8KLQlpZiAoc3RybGVuKGZjYWxsLT5wYXJhbXMucnN0YXQuc3RhdC0+ZXh0ZW5zaW9uKSA8IGJ1ZmxlbikKLQkJYnVmbGVuID0gc3RybGVuKGZjYWxsLT5wYXJhbXMucnN0YXQuc3RhdC0+ZXh0ZW5zaW9uKTsKKwlpZiAoZmNhbGwtPnBhcmFtcy5yc3RhdC5zdGF0LmV4dGVuc2lvbi5sZW4gPCBidWZsZW4pCisJCWJ1ZmxlbiA9IGZjYWxsLT5wYXJhbXMucnN0YXQuc3RhdC5leHRlbnNpb24ubGVuOwogCi0JbWVtY3B5KGJ1ZmZlciwgZmNhbGwtPnBhcmFtcy5yc3RhdC5zdGF0LT5leHRlbnNpb24sIGJ1ZmxlbiArIDEpOworCW1lbWNweShidWZmZXIsIGZjYWxsLT5wYXJhbXMucnN0YXQuc3RhdC5leHRlbnNpb24uc3RyLCBidWZsZW4gLSAxKTsKKwlidWZmZXJbYnVmbGVuLTFdID0gMDsKIAogCXJldHZhbCA9IGJ1ZmxlbjsKIApAQCAtMTE1Nyw2ICs5ODAsNzcgQEAKIAkJX19wdXRuYW1lKHMpOwogfQogCitzdGF0aWMgaW50IHY5ZnNfdmZzX21rc3BlY2lhbChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCWludCBtb2RlLCBjb25zdCBjaGFyICpleHRlbnNpb24pCit7CisJaW50IGVyciwgcmV0dmFsOworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXM7CisJc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsOworCXN0cnVjdCB2OWZzX2ZpZCAqZmlkOworCXN0cnVjdCB2OWZzX3dzdGF0IHdzdGF0OworCisJdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRpcik7CisJcmV0dmFsID0gLUVQRVJNOworCWZjYWxsID0gTlVMTDsKKworCWlmICghdjlzZXMtPmV4dGVuZGVkKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJub3QgZXh0ZW5kZWRcbiIpOworCQlnb3RvIGZyZWVfbWVtOworCX0KKworCS8qIGlzc3VlIGEgY3JlYXRlICovCisJcmV0dmFsID0gdjlmc19jcmVhdGUoZGlyLCBkZW50cnksIG1vZGUsIDApOworCWlmIChyZXR2YWwgIT0gMCkKKwkJZ290byBmcmVlX21lbTsKKworCWZpZCA9IHY5ZnNfZmlkX2dldF9jcmVhdGVkKGRlbnRyeSk7CisJaWYgKCFmaWQpIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgImNvdWxkbid0IHJlc29sdmUgZmlkIGZyb20gZGVudHJ5XG4iKTsKKwkJZ290byBmcmVlX21lbTsKKwl9CisKKwkvKiBpc3N1ZSBhIFR3c3RhdCAqLworCXY5ZnNfYmxhbmtfd3N0YXQoJndzdGF0KTsKKwl3c3RhdC5tdWlkID0gdjlzZXMtPm5hbWU7CisJd3N0YXQuZXh0ZW5zaW9uID0gKGNoYXIgKikgZXh0ZW5zaW9uOworCXJldHZhbCA9IHY5ZnNfdF93c3RhdCh2OXNlcywgZmlkLT5maWQsICZ3c3RhdCwgJmZjYWxsKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlQUklOVF9GQ0FMTF9FUlJPUigid3N0YXQgZXJyb3IiLCBmY2FsbCk7CisJCWdvdG8gZnJlZV9tZW07CisJfQorCisJZXJyID0gdjlmc190X2NsdW5rKHY5c2VzLCBmaWQtPmZpZCk7CisJaWYgKGVyciA8IDApIHsKKwkJZHByaW50ayhERUJVR19FUlJPUiwgImNsdW5rIGZhaWxlZDogJWRcbiIsIGVycik7CisJCWdvdG8gZnJlZV9tZW07CisJfQorCisJZF9kcm9wKGRlbnRyeSk7CQkvKiBGSUQgLSB3aWxsIHRoaXMgYWxzbyBjbHVuaz8gKi8KKworZnJlZV9tZW06CisJa2ZyZWUoZmNhbGwpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogdjlmc192ZnNfc3ltbGluayAtIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgc3ltbGlua3MKKyAqIEBkaXI6IGRpcmVjdG9yeSBpbm9kZSBjb250YWluaW5nIHN5bWxpbmsKKyAqIEBkZW50cnk6IGRlbnRyeSBmb3Igc3ltbGluaworICogQHN5bW5hbWU6IHN5bWxpbmsgZGF0YQorICoKKyAqIFNlZSA5UDIwMDAudSBSRkMgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqCisgKi8KKworc3RhdGljIGludAordjlmc192ZnNfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpzeW1uYW1lKQoreworCWRwcmludGsoREVCVUdfVkZTLCAiICVsdSwlcywlc1xuIiwgZGlyLT5pX2lubywgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJc3ltbmFtZSk7CisKKwlyZXR1cm4gdjlmc192ZnNfbWtzcGVjaWFsKGRpciwgZGVudHJ5LCBTX0lGTE5LLCBzeW1uYW1lKTsKK30KKwogLyoqCiAgKiB2OWZzX3Zmc19saW5rIC0gY3JlYXRlIGEgaGFyZGxpbmsKICAqIEBvbGRfZGVudHJ5OiBkZW50cnkgZm9yIGZpbGUgdG8gbGluayB0bwpAQCAtMTE3Myw2NCArMTA2NywyNCBAQAogdjlmc192ZnNfbGluayhzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRpciwKIAkgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7Ci0JaW50IHJldHZhbCA9IC1FUEVSTTsKLQlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhkaXIpOwotCXN0cnVjdCB2OWZzX2ZjYWxsICpmY2FsbCA9IE5VTEw7Ci0Jc3RydWN0IHY5ZnNfc3RhdCAqbWlzdGF0ID0ga21hbGxvYyh2OXNlcy0+bWF4ZGF0YSwgR0ZQX0tFUk5FTCk7Ci0Jc3RydWN0IHY5ZnNfZmlkICpvbGRmaWQgPSB2OWZzX2ZpZF9sb29rdXAob2xkX2RlbnRyeSk7Ci0Jc3RydWN0IHY5ZnNfZmlkICpuZXdmaWQgPSBOVUxMOwotCWNoYXIgKnN5bW5hbWUgPSBfX2dldG5hbWUoKTsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCB2OWZzX2ZpZCAqb2xkZmlkOworCWNoYXIgKm5hbWU7CiAKIAlkcHJpbnRrKERFQlVHX1ZGUywgIiAlbHUsJXMsJXNcbiIsIGRpci0+aV9pbm8sIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCW9sZF9kZW50cnktPmRfbmFtZS5uYW1lKTsKIAotCWlmICghdjlzZXMtPmV4dGVuZGVkKSB7Ci0JCWRwcmludGsoREVCVUdfRVJST1IsICJub3QgZXh0ZW5kZWRcbiIpOwotCQlnb3RvIEZyZWVNZW07CisJb2xkZmlkID0gdjlmc19maWRfbG9va3VwKG9sZF9kZW50cnkpOworCWlmICghb2xkZmlkKSB7CisJCWRwcmludGsoREVCVUdfRVJST1IsICJjYW4ndCBmaW5kIG9sZGZpZFxuIik7CisJCXJldHVybiAtRVBFUk07CiAJfQogCi0JLyogZ2V0IGZpZCBvZiBvbGRfZGVudHJ5ICovCi0Jc3ByaW50ZihzeW1uYW1lLCAiaGFyZGxpbmsoJWQpXG4iLCBvbGRmaWQtPmZpZCk7CisJbmFtZSA9IF9fZ2V0bmFtZSgpOworCXNwcmludGYobmFtZSwgImhhcmRsaW5rKCVkKVxuIiwgb2xkZmlkLT5maWQpOworCXJldHZhbCA9IHY5ZnNfdmZzX21rc3BlY2lhbChkaXIsIGRlbnRyeSwgVjlGU19ETUxJTkssIG5hbWUpOworCV9fcHV0bmFtZShuYW1lKTsKIAotCS8qIGlzc3VlIGEgY3JlYXRlICovCi0JcmV0dmFsID0gdjlmc19jcmVhdGUoZGlyLCBkZW50cnksIFY5RlNfRE1MSU5LLCAwKTsKLQlpZiAocmV0dmFsICE9IDApCi0JCWdvdG8gRnJlZU1lbTsKLQotCW5ld2ZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkZW50cnkpOwotCWlmICghbmV3ZmlkKSB7Ci0JCWRwcmludGsoREVCVUdfRVJST1IsICJjb3VsZG4ndCByZXNvbHZlIGZpZCBmcm9tIGRlbnRyeVxuIik7Ci0JCWdvdG8gRnJlZU1lbTsKLQl9Ci0KLQkvKiBpc3N1ZSBhIHR3c3RhdCAqLwotCXY5ZnNfYmxhbmtfbWlzdGF0KHY5c2VzLCBtaXN0YXQpOwotCXN0cmNweShtaXN0YXQtPmRhdGEgKyAxLCBzeW1uYW1lKTsKLQltaXN0YXQtPmV4dGVuc2lvbiA9IG1pc3RhdC0+ZGF0YSArIDE7Ci0JcmV0dmFsID0gdjlmc190X3dzdGF0KHY5c2VzLCBuZXdmaWQtPmZpZCwgbWlzdGF0LCAmZmNhbGwpOwotCWlmIChyZXR2YWwgPCAwKSB7Ci0JCWRwcmludGsoREVCVUdfRVJST1IsICJ2OWZzX3Rfd3N0YXQgZXJyb3I6ICVzXG4iLAotCQkJRkNBTExfRVJST1IoZmNhbGwpKTsKLQkJZ290byBGcmVlTWVtOwotCX0KLQotCWtmcmVlKGZjYWxsKTsKLQotCWlmICh2OWZzX3RfY2x1bmsodjlzZXMsIG5ld2ZpZC0+ZmlkLCAmZmNhbGwpKSB7Ci0JCWRwcmludGsoREVCVUdfRVJST1IsICJjbHVuayBmb3Igc3ltbGluayBmYWlsZWQ6ICVzXG4iLAotCQkJRkNBTExfRVJST1IoZmNhbGwpKTsKLQkJZ290byBGcmVlTWVtOwotCX0KLQotCWRfZHJvcChkZW50cnkpOwkJLyogRklEIC0gd2lsbCB0aGlzIGFsc28gY2x1bms/ICovCi0KLQlrZnJlZShmY2FsbCk7Ci0JZmNhbGwgPSBOVUxMOwotCi0gICAgICBGcmVlTWVtOgotCWtmcmVlKG1pc3RhdCk7Ci0Ja2ZyZWUoZmNhbGwpOwotCV9fcHV0bmFtZShzeW1uYW1lKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0xMjQ2LDgyICsxMTAwLDMwIEBACiBzdGF0aWMgaW50CiB2OWZzX3Zmc19ta25vZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwgZGV2X3QgcmRldikKIHsKLQlpbnQgcmV0dmFsID0gLUVQRVJNOwotCXN0cnVjdCB2OWZzX2ZpZCAqbmV3ZmlkOwotCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRpcik7Ci0Jc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsID0gTlVMTDsKLQlzdHJ1Y3Qgdjlmc19zdGF0ICptaXN0YXQgPSBrbWFsbG9jKHY5c2VzLT5tYXhkYXRhLCBHRlBfS0VSTkVMKTsKLQljaGFyICpzeW1uYW1lID0gX19nZXRuYW1lKCk7CisJaW50IHJldHZhbDsKKwljaGFyICpuYW1lOwogCiAJZHByaW50ayhERUJVR19WRlMsICIgJWx1LCVzIG1vZGU6ICV4IE1BSk9SOiAldSBNSU5PUjogJXVcbiIsIGRpci0+aV9pbm8sCiAJCWRlbnRyeS0+ZF9uYW1lLm5hbWUsIG1vZGUsIE1BSk9SKHJkZXYpLCBNSU5PUihyZGV2KSk7CiAKLQlpZiAoIW1pc3RhdCkKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCFuZXdfdmFsaWRfZGV2KHJkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICghbmV3X3ZhbGlkX2RldihyZGV2KSkgewotCQlyZXR2YWwgPSAtRUlOVkFMOwotCQlnb3RvIEZyZWVNZW07Ci0JfQotCi0JaWYgKCF2OXNlcy0+ZXh0ZW5kZWQpIHsKLQkJZHByaW50ayhERUJVR19FUlJPUiwgIm5vdCBleHRlbmRlZFxuIik7Ci0JCWdvdG8gRnJlZU1lbTsKLQl9Ci0KLQkvKiBpc3N1ZSBhIGNyZWF0ZSAqLwotCXJldHZhbCA9IHY5ZnNfY3JlYXRlKGRpciwgZGVudHJ5LCBtb2RlLCAwKTsKLQotCWlmIChyZXR2YWwgIT0gMCkKLQkJZ290byBGcmVlTWVtOwotCi0JbmV3ZmlkID0gdjlmc19maWRfbG9va3VwKGRlbnRyeSk7Ci0JaWYgKCFuZXdmaWQpIHsKLQkJZHByaW50ayhERUJVR19FUlJPUiwgImNvdWRuJ3QgcmVzb3ZlIGZpZCBmcm9tIGRlbnRyeVxuIik7Ci0JCXJldHZhbCA9IC1FSU5WQUw7Ci0JCWdvdG8gRnJlZU1lbTsKLQl9Ci0KKwluYW1lID0gX19nZXRuYW1lKCk7CiAJLyogYnVpbGQgZXh0ZW5zaW9uICovCiAJaWYgKFNfSVNCTEsobW9kZSkpCi0JCXNwcmludGYoc3ltbmFtZSwgImIgJXUgJXUiLCBNQUpPUihyZGV2KSwgTUlOT1IocmRldikpOworCQlzcHJpbnRmKG5hbWUsICJiICV1ICV1IiwgTUFKT1IocmRldiksIE1JTk9SKHJkZXYpKTsKIAllbHNlIGlmIChTX0lTQ0hSKG1vZGUpKQotCQlzcHJpbnRmKHN5bW5hbWUsICJjICV1ICV1IiwgTUFKT1IocmRldiksIE1JTk9SKHJkZXYpKTsKKwkJc3ByaW50ZihuYW1lLCAiYyAldSAldSIsIE1BSk9SKHJkZXYpLCBNSU5PUihyZGV2KSk7CiAJZWxzZSBpZiAoU19JU0ZJRk8obW9kZSkpCi0JCTsJLyogRE8gTk9USElORyAqLworCQkqbmFtZSA9IDA7CiAJZWxzZSB7Ci0JCXJldHZhbCA9IC1FSU5WQUw7Ci0JCWdvdG8gRnJlZU1lbTsKKwkJX19wdXRuYW1lKG5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoIVNfSVNGSUZPKG1vZGUpKSB7Ci0JCS8qIGlzc3VlIGEgdHdzdGF0ICovCi0JCXY5ZnNfYmxhbmtfbWlzdGF0KHY5c2VzLCBtaXN0YXQpOwotCQlzdHJjcHkobWlzdGF0LT5kYXRhICsgMSwgc3ltbmFtZSk7Ci0JCW1pc3RhdC0+ZXh0ZW5zaW9uID0gbWlzdGF0LT5kYXRhICsgMTsKLQkJcmV0dmFsID0gdjlmc190X3dzdGF0KHY5c2VzLCBuZXdmaWQtPmZpZCwgbWlzdGF0LCAmZmNhbGwpOwotCQlpZiAocmV0dmFsIDwgMCkgewotCQkJZHByaW50ayhERUJVR19FUlJPUiwgInY5ZnNfdF93c3RhdCBlcnJvcjogJXNcbiIsCi0JCQkJRkNBTExfRVJST1IoZmNhbGwpKTsKLQkJCWdvdG8gRnJlZU1lbTsKLQkJfQotCX0KLQotCS8qIG5lZWQgdG8gdXBkYXRlIGRjYWNoZSBzbyB3ZSBzaG93IHVwICovCi0Ja2ZyZWUoZmNhbGwpOwotCi0JaWYgKHY5ZnNfdF9jbHVuayh2OXNlcywgbmV3ZmlkLT5maWQsICZmY2FsbCkpIHsKLQkJZHByaW50ayhERUJVR19FUlJPUiwgImNsdW5rIGZvciBzeW1saW5rIGZhaWxlZDogJXNcbiIsCi0JCQlGQ0FMTF9FUlJPUihmY2FsbCkpOwotCQlnb3RvIEZyZWVNZW07Ci0JfQotCi0JZF9kcm9wKGRlbnRyeSk7CQkvKiBGSUQgLSB3aWxsIHRoaXMgYWxzbyBjbHVuaz8gKi8KLQotICAgICAgRnJlZU1lbToKLQlrZnJlZShtaXN0YXQpOwotCWtmcmVlKGZjYWxsKTsKLQlfX3B1dG5hbWUoc3ltbmFtZSk7CisJcmV0dmFsID0gdjlmc192ZnNfbWtzcGVjaWFsKGRpciwgZGVudHJ5LCBtb2RlLCBuYW1lKTsKKwlfX3B1dG5hbWUobmFtZSk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX3N1cGVyLmMgYi9mcy85cC92ZnNfc3VwZXIuYwppbmRleCA4MmM1YjAwLi4yYzRmYTc1IDEwMDY0NAotLS0gYS9mcy85cC92ZnNfc3VwZXIuYworKysgYi9mcy85cC92ZnNfc3VwZXIuYwpAQCAtNDQsNyArNDQsNiBAQAogI2luY2x1ZGUgInY5ZnMuaCIKICNpbmNsdWRlICI5cC5oIgogI2luY2x1ZGUgInY5ZnNfdmZzLmgiCi0jaW5jbHVkZSAiY29udi5oIgogI2luY2x1ZGUgImZpZC5oIgogCiBzdGF0aWMgdm9pZCB2OWZzX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKQEAgLTkyLDcgKzkxLDcgQEAKIAlzYi0+c19vcCA9ICZ2OWZzX3N1cGVyX29wczsKIAogCXNiLT5zX2ZsYWdzID0gZmxhZ3MgfCBNU19BQ1RJVkUgfCBNU19TWU5DSFJPTk9VUyB8IE1TX0RJUlNZTkMgfAotCSAgICBNU19OT0RJUkFUSU1FIHwgTVNfTk9BVElNRTsKKwkgICAgTVNfTk9BVElNRTsKIH0KIAogLyoqCkBAIC0xMjMsMTIgKzEyMiwxMyBAQAogCiAJZHByaW50ayhERUJVR19WRlMsICIgXG4iKTsKIAotCXY5c2VzID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJdjlzZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXY5c2VzKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCWlmICgobmV3ZmlkID0gdjlmc19zZXNzaW9uX2luaXQodjlzZXMsIGRldl9uYW1lLCBkYXRhKSkgPCAwKSB7CiAJCWRwcmludGsoREVCVUdfRVJST1IsICJwcm9ibGVtIGluaXRpYXRpbmcgc2Vzc2lvblxuIik7CisJCWtmcmVlKHY5c2VzKTsKIAkJcmV0dXJuIEVSUl9QVFIobmV3ZmlkKTsKIAl9CiAKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCXN0YXRfcmVzdWx0ID0gdjlmc190X3N0YXQodjlzZXMsIG5ld2ZpZCwgJmZjYWxsKTsKIAlpZiAoc3RhdF9yZXN1bHQgPCAwKSB7CiAJCWRwcmludGsoREVCVUdfRVJST1IsICJzdGF0IGVycm9yXG4iKTsKLQkJdjlmc190X2NsdW5rKHY5c2VzLCBuZXdmaWQsIE5VTEwpOworCQl2OWZzX3RfY2x1bmsodjlzZXMsIG5ld2ZpZCk7CiAJCXY5ZnNfcHV0X2lkcG9vbChuZXdmaWQsICZ2OXNlcy0+ZmlkcG9vbCk7CiAJfSBlbHNlIHsKIAkJLyogU2V0dXAgdGhlIFJvb3QgSW5vZGUgKi8KQEAgLTE2NywxMCArMTY3LDEwIEBACiAJCQlnb3RvIHB1dF9iYWNrX3NiOwogCQl9CiAKLQkJcm9vdF9maWQtPnFpZCA9IGZjYWxsLT5wYXJhbXMucnN0YXQuc3RhdC0+cWlkOworCQlyb290X2ZpZC0+cWlkID0gZmNhbGwtPnBhcmFtcy5yc3RhdC5zdGF0LnFpZDsKIAkJcm9vdC0+ZF9pbm9kZS0+aV9pbm8gPQotCQkgICAgdjlmc19xaWQyaW5vKCZmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQtPnFpZCk7Ci0JCXY5ZnNfbWlzdGF0Mmlub2RlKGZjYWxsLT5wYXJhbXMucnN0YXQuc3RhdCwgcm9vdC0+ZF9pbm9kZSwgc2IpOworCQkgICAgdjlmc19xaWQyaW5vKCZmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQucWlkKTsKKwkJdjlmc19zdGF0Mmlub2RlKCZmY2FsbC0+cGFyYW1zLnJzdGF0LnN0YXQsIHJvb3QtPmRfaW5vZGUsIHNiKTsKIAl9CiAKIAlrZnJlZShmY2FsbCk7CmRpZmYgLS1naXQgYS9mcy9LY29uZmlnIGIvZnMvS2NvbmZpZwppbmRleCAzODJlM2IyLi5lZjc4ZTNhIDEwMDY0NAotLS0gYS9mcy9LY29uZmlnCisrKyBiL2ZzL0tjb25maWcKQEAgLTc5OCw3ICs3OTgsNyBAQAogCiBjb25maWcgUFJPQ19WTUNPUkUKICAgICAgICAgYm9vbCAiL3Byb2Mvdm1jb3JlIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0gICAgICAgIGRlcGVuZHMgb24gUFJPQ19GUyAmJiBFTUJFRERFRCAmJiBFWFBFUklNRU5UQUwgJiYgQ1JBU0hfRFVNUAorICAgICAgICBkZXBlbmRzIG9uIFBST0NfRlMgJiYgRVhQRVJJTUVOVEFMICYmIENSQVNIX0RVTVAKICAgICAgICAgaGVscAogICAgICAgICBFeHBvcnRzIHRoZSBkdW1wIGltYWdlIG9mIGNyYXNoZWQga2VybmVsIGluIEVMRiBmb3JtYXQuCiAKZGlmZiAtLWdpdCBhL2ZzL0tjb25maWcuYmluZm10IGIvZnMvS2NvbmZpZy5iaW5mbXQKaW5kZXggMTc1YjJlOC4uZjNkM2Q4MSAxMDA2NDQKLS0tIGEvZnMvS2NvbmZpZy5iaW5mbXQKKysrIGIvZnMvS2NvbmZpZy5iaW5mbXQKQEAgLTEsNiArMSw2IEBACiBjb25maWcgQklORk1UX0VMRgogCWJvb2wgIktlcm5lbCBzdXBwb3J0IGZvciBFTEYgYmluYXJpZXMiCi0JZGVwZW5kcyBvbiBNTVUKKwlkZXBlbmRzIG9uIE1NVSAmJiAoQlJPS0VOIHx8ICFGUlYpCiAJZGVmYXVsdCB5CiAJLS0taGVscC0tLQogCSAgRUxGIChFeGVjdXRhYmxlIGFuZCBMaW5rYWJsZSBGb3JtYXQpIGlzIGEgZm9ybWF0IGZvciBsaWJyYXJpZXMgYW5kCmRpZmYgLS1naXQgYS9mcy9NYWtlZmlsZSBiL2ZzL01ha2VmaWxlCmluZGV4IDczNjc2MTEuLjFkYjcxMTMgMTAwNjQ0Ci0tLSBhL2ZzL01ha2VmaWxlCisrKyBiL2ZzL01ha2VmaWxlCkBAIC0xMCwxMSArMTAsMTEgQEAKIAkJaW9jdGwubyByZWFkZGlyLm8gc2VsZWN0Lm8gZmlmby5vIGxvY2tzLm8gZGNhY2hlLm8gaW5vZGUubyBcCiAJCWF0dHIubyBiYWRfaW5vZGUubyBmaWxlLm8gZmlsZXN5c3RlbXMubyBuYW1lc3BhY2UubyBhaW8ubyBcCiAJCXNlcV9maWxlLm8geGF0dHIubyBsaWJmcy5vIGZzLXdyaXRlYmFjay5vIG1wYWdlLm8gZGlyZWN0LWlvLm8gXAotCQlpb3ByaW8ubyBwbm9kZS5vCisJCWlvcHJpby5vIHBub2RlLm8gZHJvcF9jYWNoZXMubwogCiBvYmotJChDT05GSUdfSU5PVElGWSkJCSs9IGlub3RpZnkubwogb2JqLSQoQ09ORklHX0VQT0xMKQkJKz0gZXZlbnRwb2xsLm8KLW9iai0kKENPTkZJR19DT01QQVQpCQkrPSBjb21wYXQubworb2JqLSQoQ09ORklHX0NPTVBBVCkJCSs9IGNvbXBhdC5vIGNvbXBhdF9pb2N0bC5vCiAKIG5mc2QtJChDT05GSUdfTkZTRCkJCTo9IG5mc2N0bC5vCiBvYmoteQkJCQkrPSAkKG5mc2QteSkgJChuZnNkLW0pCmRpZmYgLS1naXQgYS9mcy9hZmZzL2lub2RlLmMgYi9mcy9hZmZzL2lub2RlLmMKaW5kZXggOWViZTg4MS4uNDRkNDM5YyAxMDA2NDQKLS0tIGEvZnMvYWZmcy9pbm9kZS5jCisrKyBiL2ZzL2FmZnMvaW5vZGUuYwpAQCAtMjQ0LDEwICsyNDQsMTAgQEAKIAlwcl9kZWJ1ZygiQUZGUzogcHV0X2lub2RlKGlubz0lbHUsIG5saW5rPSV1KVxuIiwgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9ubGluayk7CiAJYWZmc19mcmVlX3ByZWFsbG9jKGlub2RlKTsKIAlpZiAoYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSA9PSAxKSB7Ci0JCWRvd24oJmlub2RlLT5pX3NlbSk7CisJCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAkJaWYgKGlub2RlLT5pX3NpemUgIT0gQUZGU19JKGlub2RlKS0+bW11X3ByaXZhdGUpCiAJCQlhZmZzX3RydW5jYXRlKGlub2RlKTsKLQkJdXAoJmlub2RlLT5pX3NlbSk7CisJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZnMvYWZzL2Ntc2VydmljZS5jIGIvZnMvYWZzL2Ntc2VydmljZS5jCmluZGV4IDBhNTdmZDcuLjllZWY2YmYgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9jbXNlcnZpY2UuYworKysgYi9mcy9hZnMvY21zZXJ2aWNlLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogCV9TUlhBRlNDTV94eHh4X3QgZnVuYzsKIAlpbnQgZGllOwogCi0JcHJpbnRrKCJrQUZTOiBTdGFydGVkIGthZnNjbWQgJWRcbiIsIGN1cnJlbnQtPnBpZCk7CisJcHJpbnRrKEtFUk5fSU5GTyAia0FGUzogU3RhcnRlZCBrYWZzY21kICVkXG4iLCBjdXJyZW50LT5waWQpOwogCiAJZGFlbW9uaXplKCJrYWZzY21kIik7CiAKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9kaXIuYyBiL2ZzL2Fmcy9kaXIuYwppbmRleCA2NjgyZDZkLi41YzYxYzI0IDEwMDY0NAotLS0gYS9mcy9hZnMvZGlyLmMKKysrIGIvZnMvYWZzL2Rpci5jCkBAIC0xMzcsNyArMTM3LDcgQEAKICNlbmRpZgogCiAJLyogZGV0ZXJtaW5lIGhvdyBtYW55IG1hZ2ljIG51bWJlcnMgdGhlcmUgc2hvdWxkIGJlIGluIHRoaXMgcGFnZSAqLwotCWxhdHRlciA9IGRpci0+aV9zaXplIC0gKHBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpOworCWxhdHRlciA9IGRpci0+aV9zaXplIC0gcGFnZV9vZmZzZXQocGFnZSk7CiAJaWYgKGxhdHRlciA+PSBQQUdFX1NJWkUpCiAJCXF0eSA9IFBBR0VfU0laRTsKIAllbHNlCmRpZmYgLS1naXQgYS9mcy9hZnMvdm9sdW1lLmggYi9mcy9hZnMvdm9sdW1lLmgKaW5kZXggMWU2OTE4OC4uYmZkY2YxOSAxMDA2NDQKLS0tIGEvZnMvYWZzL3ZvbHVtZS5oCisrKyBiL2ZzL2Fmcy92b2x1bWUuaApAQCAtMTgsOCArMTgsNiBAQAogI2luY2x1ZGUgImthZnNhc3luY2QuaCIKICNpbmNsdWRlICJjYWNoZS5oIgogCi0jZGVmaW5lIF9fcGFja2VkIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpCi0KIHR5cGVkZWYgZW51bSB7CiAJQUZTX1ZMVVBEX1NMRUVQLAkJLyogc2xlZXBpbmcgd2FpdGluZyBmb3IgdXBkYXRlIHRpbWVyIHRvIGZpcmUgKi8KIAlBRlNfVkxVUERfUEVORElORywJCS8qIG9uIHBlbmRpbmcgcXVldWUgKi8KQEAgLTExNSw3ICsxMTMsNyBAQAogCXN0cnVjdCBjYWNoZWZzX2Nvb2tpZQkqY2FjaGU7CQkvKiBjYWNoaW5nIGNvb2tpZSAqLwogI2VuZGlmCiAJYWZzX3ZvbGlkX3QJCXZpZDsJCS8qIHZvbHVtZSBJRCAqLwotCWFmc192b2x0eXBlX3QgX19wYWNrZWQJdHlwZTsJCS8qIHR5cGUgb2Ygdm9sdW1lICovCisJYWZzX3ZvbHR5cGVfdAkJdHlwZTsJCS8qIHR5cGUgb2Ygdm9sdW1lICovCiAJY2hhcgkJCXR5cGVfZm9yY2U7CS8qIGZvcmNlIHZvbHVtZSB0eXBlIChzdXBwcmVzcyBSL08gLT4gUi9XKSAqLwogCXVuc2lnbmVkIHNob3J0CQluc2VydmVyczsJLyogbnVtYmVyIG9mIHNlcnZlciBzbG90cyBmaWxsZWQgKi8KIAl1bnNpZ25lZCBzaG9ydAkJcmpzZXJ2ZXJzOwkvKiBudW1iZXIgb2Ygc2VydmVycyBkaXNjYXJkZWQgZHVlIHRvIC1FTk9NRURJVU0gKi8KZGlmZiAtLWdpdCBhL2ZzL2Fpby5jIGIvZnMvYWlvLmMKaW5kZXggNWEyOGI2OS4uYWVjMmIxOSAxMDA2NDQKLS0tIGEvZnMvYWlvLmMKKysrIGIvZnMvYWlvLmMKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KLSNpbmNsdWRlIDxsaW51eC9yY3VyZWYuaD4KIAogI2luY2x1ZGUgPGFzbS9rbWFwX3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTUxNCw3ICs1MTMsNyBAQAogCS8qIE11c3QgYmUgZG9uZSB1bmRlciB0aGUgbG9jayB0byBzZXJpYWxpc2UgYWdhaW5zdCBjYW5jZWxsYXRpb24uCiAJICogQ2FsbCB0aGlzIGFpb19mcHV0IGFzIGl0IGR1cGxpY2F0ZXMgZnB1dCB2aWEgdGhlIGZwdXRfd29yay4KIAkgKi8KLQlpZiAodW5saWtlbHkocmN1cmVmX2RlY19hbmRfdGVzdCgmcmVxLT5raV9maWxwLT5mX2NvdW50KSkpIHsKKwlpZiAodW5saWtlbHkoYXRvbWljX2RlY19hbmRfdGVzdCgmcmVxLT5raV9maWxwLT5mX2NvdW50KSkpIHsKIAkJZ2V0X2lvY3R4KGN0eCk7CiAJCXNwaW5fbG9jaygmZnB1dF9sb2NrKTsKIAkJbGlzdF9hZGQoJnJlcS0+a2lfbGlzdCwgJmZwdXRfaGVhZCk7CmRpZmYgLS1naXQgYS9mcy9hdHRyLmMgYi9mcy9hdHRyLmMKaW5kZXggNjdiY2Q5Yi4uOTdkZTk0NiAxMDA2NDQKLS0tIGEvZnMvYXR0ci5jCisrKyBiL2ZzL2F0dHIuYwpAQCAtMTAsMTEgKzEwLDExIEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9mc25vdGlmeS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KIAogLyogVGFrZW4gb3ZlciBmcm9tIHRoZSBvbGQgY29kZS4uLiAqLwogCkBAIC02NywyMCArNjcsMTIgQEAKIGludCBpbm9kZV9zZXRhdHRyKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgaWF0dHIgKiBhdHRyKQogewogCXVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHItPmlhX3ZhbGlkOwotCWludCBlcnJvciA9IDA7CiAKLQlpZiAoaWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKLQkJaWYgKGF0dHItPmlhX3NpemUgIT0gaV9zaXplX3JlYWQoaW5vZGUpKSB7Ci0JCQllcnJvciA9IHZtdHJ1bmNhdGUoaW5vZGUsIGF0dHItPmlhX3NpemUpOwotCQkJaWYgKGVycm9yIHx8IChpYV92YWxpZCA9PSBBVFRSX1NJWkUpKQotCQkJCWdvdG8gb3V0OwotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIFdlIHNraXBwZWQgdGhlIHRydW5jYXRlIGJ1dCBtdXN0IHN0aWxsIHVwZGF0ZQotCQkJICogdGltZXN0YW1wcwotCQkJICovCi0JCQlpYV92YWxpZCB8PSBBVFRSX01USU1FfEFUVFJfQ1RJTUU7Ci0JCX0KKwlpZiAoaWFfdmFsaWQgJiBBVFRSX1NJWkUgJiYKKwkgICAgYXR0ci0+aWFfc2l6ZSAhPSBpX3NpemVfcmVhZChpbm9kZSkpIHsKKwkJaW50IGVycm9yID0gdm10cnVuY2F0ZShpbm9kZSwgYXR0ci0+aWFfc2l6ZSk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKIAl9CiAKIAlpZiAoaWFfdmFsaWQgJiBBVFRSX1VJRCkKQEAgLTEwNCw4ICs5Niw4IEBACiAJCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCX0KIAltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKLW91dDoKLQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woaW5vZGVfc2V0YXR0cik7CiAKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mcy9yb290LmMgYi9mcy9hdXRvZnMvcm9vdC5jCmluZGV4IGExYWIxYzAuLjg3MGUyY2YzIDEwMDY0NAotLS0gYS9mcy9hdXRvZnMvcm9vdC5jCisrKyBiL2ZzL2F1dG9mcy9yb290LmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KQEAgLTIyOSw5ICsyMzAsOSBAQAogCWRlbnRyeS0+ZF9mbGFncyB8PSBEQ0FDSEVfQVVUT0ZTX1BFTkRJTkc7CiAJZF9hZGQoZGVudHJ5LCBOVUxMKTsKIAotCXVwKCZkaXItPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmRpci0+aV9tdXRleCk7CiAJYXV0b2ZzX3JldmFsaWRhdGUoZGVudHJ5LCBuZCk7Ci0JZG93bigmZGlyLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmZGlyLT5pX211dGV4KTsKIAogCS8qCiAJICogSWYgd2UgYXJlIHN0aWxsIHBlbmRpbmcsIGNoZWNrIGlmIHdlIGhhZCB0byBoYW5kbGUKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvYXV0b2ZzX2kuaCBiL2ZzL2F1dG9mczQvYXV0b2ZzX2kuaAppbmRleCBmY2E4M2UyLi4zODViZWQwIDEwMDY0NAotLS0gYS9mcy9hdXRvZnM0L2F1dG9mc19pLmgKKysrIGIvZnMvYXV0b2ZzNC9hdXRvZnNfaS5oCkBAIC0yMDksNyArMjA5LDcgQEAKIAlzdHJ1Y3QgZGVudHJ5ICpjaGlsZDsKIAlpbnQgcmV0ID0gMDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZkZW50cnktPmRfc3ViZGlycywgZF9jaGlsZCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmZGVudHJ5LT5kX3N1YmRpcnMsIGRfdS5kX2NoaWxkKQogCQlpZiAoc2ltcGxlX3Bvc2l0aXZlKGNoaWxkKSkKIAkJCWdvdG8gb3V0OwogCXJldCA9IDE7CmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L2V4cGlyZS5jIGIvZnMvYXV0b2ZzNC9leHBpcmUuYwppbmRleCBmZWI2YWM0Li5kYzM5NTg5IDEwMDY0NAotLS0gYS9mcy9hdXRvZnM0L2V4cGlyZS5jCisrKyBiL2ZzL2F1dG9mczQvZXhwaXJlLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCW5leHQgPSB0aGlzX3BhcmVudC0+ZF9zdWJkaXJzLm5leHQ7CiByZXN1bWU6CiAJd2hpbGUgKG5leHQgIT0gJnRoaXNfcGFyZW50LT5kX3N1YmRpcnMpIHsKLQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgZGVudHJ5LCBkX2NoaWxkKTsKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgZGVudHJ5LCBkX3UuZF9jaGlsZCk7CiAKIAkJLyogTmVnYXRpdmUgZGVudHJ5IC0gZ2l2ZSB1cCAqLwogCQlpZiAoIXNpbXBsZV9wb3NpdGl2ZShkZW50cnkpKSB7CkBAIC0xMzgsNyArMTM4LDcgQEAKIAl9CiAKIAlpZiAodGhpc19wYXJlbnQgIT0gdG9wKSB7Ci0JCW5leHQgPSB0aGlzX3BhcmVudC0+ZF9jaGlsZC5uZXh0OworCQluZXh0ID0gdGhpc19wYXJlbnQtPmRfdS5kX2NoaWxkLm5leHQ7CiAJCXRoaXNfcGFyZW50ID0gdGhpc19wYXJlbnQtPmRfcGFyZW50OwogCQlnb3RvIHJlc3VtZTsKIAl9CkBAIC0xNjMsNyArMTYzLDcgQEAKIAluZXh0ID0gdGhpc19wYXJlbnQtPmRfc3ViZGlycy5uZXh0OwogcmVzdW1lOgogCXdoaWxlIChuZXh0ICE9ICZ0aGlzX3BhcmVudC0+ZF9zdWJkaXJzKSB7Ci0JCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IGRlbnRyeSwgZF9jaGlsZCk7CisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IGRlbnRyeSwgZF91LmRfY2hpbGQpOwogCiAJCS8qIE5lZ2F0aXZlIGRlbnRyeSAtIGdpdmUgdXAgKi8KIAkJaWYgKCFzaW1wbGVfcG9zaXRpdmUoZGVudHJ5KSkgewpAQCAtMTk5LDcgKzE5OSw3IEBACiAJfQogCiAJaWYgKHRoaXNfcGFyZW50ICE9IHBhcmVudCkgewotCQluZXh0ID0gdGhpc19wYXJlbnQtPmRfY2hpbGQubmV4dDsKKwkJbmV4dCA9IHRoaXNfcGFyZW50LT5kX3UuZF9jaGlsZC5uZXh0OwogCQl0aGlzX3BhcmVudCA9IHRoaXNfcGFyZW50LT5kX3BhcmVudDsKIAkJZ290byByZXN1bWU7CiAJfQpAQCAtMjM4LDcgKzIzOCw3IEBACiAJLyogT24gZXhpdCBmcm9tIHRoZSBsb29wIGV4cGlyZSBpcyBzZXQgdG8gYSBkZ290IGRlbnRyeQogCSAqIHRvIGV4cGlyZSBvciBpdCdzIE5VTEwgKi8KIAl3aGlsZSAoIG5leHQgIT0gJnJvb3QtPmRfc3ViZGlycyApIHsKLQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgZGVudHJ5LCBkX2NoaWxkKTsKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgZGVudHJ5LCBkX3UuZF9jaGlsZCk7CiAKIAkJLyogTmVnYXRpdmUgZGVudHJ5IC0gZ2l2ZSB1cCAqLwogCQlpZiAoICFzaW1wbGVfcG9zaXRpdmUoZGVudHJ5KSApIHsKQEAgLTMwMiw3ICszMDIsNyBAQAogCQkJZXhwaXJlZCwgKGludClleHBpcmVkLT5kX25hbWUubGVuLCBleHBpcmVkLT5kX25hbWUubmFtZSk7CiAJCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOwogCQlsaXN0X2RlbCgmZXhwaXJlZC0+ZF9wYXJlbnQtPmRfc3ViZGlycyk7Ci0JCWxpc3RfYWRkKCZleHBpcmVkLT5kX3BhcmVudC0+ZF9zdWJkaXJzLCAmZXhwaXJlZC0+ZF9jaGlsZCk7CisJCWxpc3RfYWRkKCZleHBpcmVkLT5kX3BhcmVudC0+ZF9zdWJkaXJzLCAmZXhwaXJlZC0+ZF91LmRfY2hpbGQpOwogCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOwogCQlyZXR1cm4gZXhwaXJlZDsKIAl9CmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L2lub2RlLmMgYi9mcy9hdXRvZnM0L2lub2RlLmMKaW5kZXggODE4YjM3Yi4uMmQzMDgyOCAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzNC9pbm9kZS5jCisrKyBiL2ZzL2F1dG9mczQvaW5vZGUuYwpAQCAtOTEsNyArOTEsNyBAQAogCW5leHQgPSB0aGlzX3BhcmVudC0+ZF9zdWJkaXJzLm5leHQ7CiByZXN1bWU6CiAJd2hpbGUgKG5leHQgIT0gJnRoaXNfcGFyZW50LT5kX3N1YmRpcnMpIHsKLQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgZGVudHJ5LCBkX2NoaWxkKTsKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgZGVudHJ5LCBkX3UuZF9jaGlsZCk7CiAKIAkJLyogTmVnYXRpdmUgZGVudHJ5IC0gZG9uYHQgY2FyZSAqLwogCQlpZiAoIXNpbXBsZV9wb3NpdGl2ZShkZW50cnkpKSB7CkBAIC0xMTcsNyArMTE3LDcgQEAKIAlpZiAodGhpc19wYXJlbnQgIT0gc2JpLT5yb290KSB7CiAJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IHRoaXNfcGFyZW50OwogCi0JCW5leHQgPSB0aGlzX3BhcmVudC0+ZF9jaGlsZC5uZXh0OworCQluZXh0ID0gdGhpc19wYXJlbnQtPmRfdS5kX2NoaWxkLm5leHQ7CiAJCXRoaXNfcGFyZW50ID0gdGhpc19wYXJlbnQtPmRfcGFyZW50OwogCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOwogCQlEUFJJTlRLKCJwYXJlbnQgZGVudHJ5ICVwICUuKnMiLApkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC9yb290LmMgYi9mcy9hdXRvZnM0L3Jvb3QuYwppbmRleCAyYTc3MWVjLi42MmQ4ZDRhIDEwMDY0NAotLS0gYS9mcy9hdXRvZnM0L3Jvb3QuYworKysgYi9mcy9hdXRvZnM0L3Jvb3QuYwpAQCAtMTIsNiArMTIsNyBAQAogICoKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgpAQCAtODYsNyArODcsNyBAQAogCiAvKiBVcGRhdGUgdXNhZ2UgZnJvbSBoZXJlIHRvIHRvcCBvZiB0cmVlLCBzbyB0aGF0IHNjYW4gb2YKICAgIHRvcC1sZXZlbCBkaXJlY3RvcmllcyB3aWxsIGdpdmUgYSB1c2VmdWwgcmVzdWx0ICovCi1zdGF0aWMgdm9pZCBhdXRvZnM0X3VwZGF0ZV91c2FnZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCitzdGF0aWMgdm9pZCBhdXRvZnM0X3VwZGF0ZV91c2FnZShzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCXN0cnVjdCBkZW50cnkgKnRvcCA9IGRlbnRyeS0+ZF9zYi0+c19yb290OwogCkBAIC05NSw3ICs5Niw3IEBACiAJCXN0cnVjdCBhdXRvZnNfaW5mbyAqaW5vID0gYXV0b2ZzNF9kZW50cnlfaW5vKGRlbnRyeSk7CiAKIAkJaWYgKGlubykgewotCQkJdXBkYXRlX2F0aW1lKGRlbnRyeS0+ZF9pbm9kZSk7CisJCQl0b3VjaF9hdGltZShtbnQsIGRlbnRyeSk7CiAJCQlpbm8tPmxhc3RfdXNlZCA9IGppZmZpZXM7CiAJCX0KIAl9CkBAIC0xNDMsNyArMTQ0LDggQEAKIAkJCX0KIAogCQkJd2hpbGUoMSkgewotCQkJCXN0cnVjdCBkZW50cnkgKmRlID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZGVudHJ5LCBkX2NoaWxkKTsKKwkJCQlzdHJ1Y3QgZGVudHJ5ICpkZSA9IGxpc3RfZW50cnkobGlzdCwKKwkJCQkJCXN0cnVjdCBkZW50cnksIGRfdS5kX2NoaWxkKTsKIAogCQkJCWlmICghZF91bmhhc2hlZChkZSkgJiYgZGUtPmRfaW5vZGUpIHsKIAkJCQkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKQEAgLTE5Myw2ICsxOTUsOCBAQAogCQlpZiAoIWVtcHR5KQogCQkJZF9pbnZhbGlkYXRlKGRlbnRyeSk7CiAKKwkJbmQuZGVudHJ5ID0gZGVudHJ5OworCQluZC5tbnQgPSBtbnQ7CiAJCW5kLmZsYWdzID0gTE9PS1VQX0RJUkVDVE9SWTsKIAkJc3RhdHVzID0gKGRlbnRyeS0+ZF9vcC0+ZF9yZXZhbGlkYXRlKShkZW50cnksICZuZCk7CiAKQEAgLTI4OCwxMCArMjkyLDEwIEBACiAJcmV0dXJuIGF1dG9mczRfZGNhY2hlX3JlYWRkaXIoZmlsZSwgZGlyZW50LCBmaWxsZGlyKTsKIH0KIAotc3RhdGljIGludCB0cnlfdG9fZmlsbF9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCAKLQkJCSAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCQkgICAgICBzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwgaW50IGZsYWdzKQorc3RhdGljIGludCB0cnlfdG9fZmlsbF9kZW50cnkoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGZsYWdzKQogeworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBtbnQtPm1udF9zYjsKKwlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSA9IGF1dG9mczRfc2JpKHNiKTsKIAlzdHJ1Y3QgYXV0b2ZzX2luZm8gKmRlX2luZm8gPSBhdXRvZnM0X2RlbnRyeV9pbm8oZGVudHJ5KTsKIAlpbnQgc3RhdHVzID0gMDsKIApAQCAtMzY2LDcgKzM3MCw3IEBACiAJLyogV2UgZG9uJ3QgdXBkYXRlIHRoZSB1c2FnZXMgZm9yIHRoZSBhdXRvZnMgZGFlbW9uIGl0c2VsZiwgdGhpcwogCSAgIGlzIG5lY2Vzc2FyeSBmb3IgcmVjdXJzaXZlIGF1dG9mcyBtb3VudHMgKi8KIAlpZiAoIWF1dG9mczRfb3pfbW9kZShzYmkpKQotCQlhdXRvZnM0X3VwZGF0ZV91c2FnZShkZW50cnkpOworCQlhdXRvZnM0X3VwZGF0ZV91c2FnZShtbnQsIGRlbnRyeSk7CiAKIAlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKIAlkZW50cnktPmRfZmxhZ3MgJj0gfkRDQUNIRV9BVVRPRlNfUEVORElORzsKQEAgLTM5MSw3ICszOTUsNyBAQAogCS8qIFBlbmRpbmcgZGVudHJ5ICovCiAJaWYgKGF1dG9mczRfaXNwZW5kaW5nKGRlbnRyeSkpIHsKIAkJaWYgKCFvel9tb2RlKQotCQkJc3RhdHVzID0gdHJ5X3RvX2ZpbGxfZGVudHJ5KGRlbnRyeSwgZGlyLT5pX3NiLCBzYmksIGZsYWdzKTsKKwkJCXN0YXR1cyA9IHRyeV90b19maWxsX2RlbnRyeShuZC0+bW50LCBkZW50cnksIGZsYWdzKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAKQEAgLTQwOCwxNCArNDEyLDE0IEBACiAJCQkgZGVudHJ5LCBkZW50cnktPmRfbmFtZS5sZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOwogCQlpZiAoIW96X21vZGUpCi0JCQlzdGF0dXMgPSB0cnlfdG9fZmlsbF9kZW50cnkoZGVudHJ5LCBkaXItPmlfc2IsIHNiaSwgZmxhZ3MpOworCQkJc3RhdHVzID0gdHJ5X3RvX2ZpbGxfZGVudHJ5KG5kLT5tbnQsIGRlbnRyeSwgZmxhZ3MpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOwogCiAJLyogVXBkYXRlIHRoZSB1c2FnZSBsaXN0ICovCiAJaWYgKCFvel9tb2RlKQotCQlhdXRvZnM0X3VwZGF0ZV91c2FnZShkZW50cnkpOworCQlhdXRvZnM0X3VwZGF0ZV91c2FnZShuZC0+bW50LCBkZW50cnkpOwogCiAJcmV0dXJuIDE7CiB9CkBAIC00ODgsOSArNDkyLDkgQEAKIAlkX2FkZChkZW50cnksIE5VTEwpOwogCiAJaWYgKGRlbnRyeS0+ZF9vcCAmJiBkZW50cnktPmRfb3AtPmRfcmV2YWxpZGF0ZSkgewotCQl1cCgmZGlyLT5pX3NlbSk7CisJCW11dGV4X3VubG9jaygmZGlyLT5pX211dGV4KTsKIAkJKGRlbnRyeS0+ZF9vcC0+ZF9yZXZhbGlkYXRlKShkZW50cnksIG5kKTsKLQkJZG93bigmZGlyLT5pX3NlbSk7CisJCW11dGV4X2xvY2soJmRpci0+aV9tdXRleCk7CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9hb3V0LmMgYi9mcy9iaW5mbXRfYW91dC5jCmluZGV4IDcyMDExODIuLmYzMTIxMDMgMTAwNjQ0Ci0tLSBhL2ZzL2JpbmZtdF9hb3V0LmMKKysrIGIvZnMvYmluZm10X2FvdXQuYwpAQCAtMzMsOCArMzMsNiBAQAogc3RhdGljIGludCBsb2FkX2FvdXRfbGlicmFyeShzdHJ1Y3QgZmlsZSopOwogc3RhdGljIGludCBhb3V0X2NvcmVfZHVtcChsb25nIHNpZ25yLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIHN0cnVjdCBmaWxlICpmaWxlKTsKIAotZXh0ZXJuIHZvaWQgZHVtcF90aHJlYWQoc3RydWN0IHB0X3JlZ3MgKiwgc3RydWN0IHVzZXIgKik7Ci0KIHN0YXRpYyBzdHJ1Y3QgbGludXhfYmluZm10IGFvdXRfZm9ybWF0ID0gewogCS5tb2R1bGUJCT0gVEhJU19NT0RVTEUsCiAJLmxvYWRfYmluYXJ5CT0gbG9hZF9hb3V0X2JpbmFyeSwKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9lbGYuYyBiL2ZzL2JpbmZtdF9lbGYuYwppbmRleCBmMzZmMjIxLi4xYjExN2E0IDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfZWxmLmMKKysrIGIvZnMvYmluZm10X2VsZi5jCkBAIC01OCw3ICs1OCw3IEBACiAgKiBJZiB3ZSBkb24ndCBzdXBwb3J0IGNvcmUgZHVtcGluZywgdGhlbiBzdXBwbHkgYSBOVUxMIHNvIHdlCiAgKiBkb24ndCBldmVuIHRyeS4KICAqLwotI2lmZGVmIFVTRV9FTEZfQ09SRV9EVU1QCisjaWYgZGVmaW5lZChVU0VfRUxGX0NPUkVfRFVNUCkgJiYgZGVmaW5lZChDT05GSUdfRUxGX0NPUkUpCiBzdGF0aWMgaW50IGVsZl9jb3JlX2R1bXAobG9uZyBzaWduciwgc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpOwogI2Vsc2UKICNkZWZpbmUgZWxmX2NvcmVfZHVtcAlOVUxMCkBAIC0yODgsMTEgKzI4OCwxNyBAQAogCQkJc3RydWN0IGVsZl9waGRyICplcHBudCwgaW50IHByb3QsIGludCB0eXBlKQogewogCXVuc2lnbmVkIGxvbmcgbWFwX2FkZHI7CisJdW5zaWduZWQgbG9uZyBwYWdlb2Zmc2V0ID0gRUxGX1BBR0VPRkZTRVQoZXBwbnQtPnBfdmFkZHIpOwogCiAJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQltYXBfYWRkciA9IGRvX21tYXAoZmlsZXAsIEVMRl9QQUdFU1RBUlQoYWRkciksCi0JCQkgICBlcHBudC0+cF9maWxlc3ogKyBFTEZfUEFHRU9GRlNFVChlcHBudC0+cF92YWRkciksIHByb3QsIHR5cGUsCi0JCQkgICBlcHBudC0+cF9vZmZzZXQgLSBFTEZfUEFHRU9GRlNFVChlcHBudC0+cF92YWRkcikpOworCS8qIG1tYXAoKSB3aWxsIHJldHVybiAtRUlOVkFMIGlmIGdpdmVuIGEgemVybyBzaXplLCBidXQgYQorCSAqIHNlZ21lbnQgd2l0aCB6ZXJvIGZpbGVzaXplIGlzIHBlcmZlY3RseSB2YWxpZCAqLworCWlmIChlcHBudC0+cF9maWxlc3ogKyBwYWdlb2Zmc2V0KQorCQltYXBfYWRkciA9IGRvX21tYXAoZmlsZXAsIEVMRl9QQUdFU1RBUlQoYWRkciksCisJCQkJICAgZXBwbnQtPnBfZmlsZXN6ICsgcGFnZW9mZnNldCwgcHJvdCwgdHlwZSwKKwkJCQkgICBlcHBudC0+cF9vZmZzZXQgLSBwYWdlb2Zmc2V0KTsKKwllbHNlCisJCW1hcF9hZGRyID0gRUxGX1BBR0VTVEFSVChhZGRyKTsKIAl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAlyZXR1cm4obWFwX2FkZHIpOwogfQpAQCAtNjE2LDcgKzYyMiw3IEBACiAJCQkJZ290byBvdXRfZnJlZV9maWxlOwogCiAJCQlyZXR2YWwgPSAtRU5PTUVNOwotCQkJZWxmX2ludGVycHJldGVyID0gKGNoYXIgKikga21hbGxvYyhlbGZfcHBudC0+cF9maWxlc3osCisJCQllbGZfaW50ZXJwcmV0ZXIgPSBrbWFsbG9jKGVsZl9wcG50LT5wX2ZpbGVzeiwKIAkJCQkJCQkgICBHRlBfS0VSTkVMKTsKIAkJCWlmICghZWxmX2ludGVycHJldGVyKQogCQkJCWdvdG8gb3V0X2ZyZWVfZmlsZTsKQEAgLTExMDcsNyArMTExMyw3IEBACiAgKiBOb3RlIHRoYXQgc29tZSBwbGF0Zm9ybXMgc3RpbGwgdXNlIHRyYWRpdGlvbmFsIGNvcmUgZHVtcHMgYW5kIG5vdAogICogdGhlIEVMRiBjb3JlIGR1bXAuICBFYWNoIHBsYXRmb3JtIGNhbiBzZWxlY3QgaXQgYXMgYXBwcm9wcmlhdGUuCiAgKi8KLSNpZmRlZiBVU0VfRUxGX0NPUkVfRFVNUAorI2lmIGRlZmluZWQoVVNFX0VMRl9DT1JFX0RVTVApICYmIGRlZmluZWQoQ09ORklHX0VMRl9DT1JFKQogCiAvKgogICogRUxGIGNvcmUgZHVtcGVyCkBAIC0xMjEyLDcgKzEyMTgsNyBAQAogCWlmICghZHVtcF9zZWVrKGZpbGUsIChvZmYpKSkgXAogCQlnb3RvIGVuZF9jb3JlZHVtcDsKIAotc3RhdGljIGlubGluZSB2b2lkIGZpbGxfZWxmX2hlYWRlcihzdHJ1Y3QgZWxmaGRyICplbGYsIGludCBzZWdzKQorc3RhdGljIHZvaWQgZmlsbF9lbGZfaGVhZGVyKHN0cnVjdCBlbGZoZHIgKmVsZiwgaW50IHNlZ3MpCiB7CiAJbWVtY3B5KGVsZi0+ZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKTsKIAllbGYtPmVfaWRlbnRbRUlfQ0xBU1NdID0gRUxGX0NMQVNTOwpAQCAtMTIzNyw3ICsxMjQzLDcgQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBmaWxsX2VsZl9ub3RlX3BoZHIoc3RydWN0IGVsZl9waGRyICpwaGRyLCBpbnQgc3osIG9mZl90IG9mZnNldCkKK3N0YXRpYyB2b2lkIGZpbGxfZWxmX25vdGVfcGhkcihzdHJ1Y3QgZWxmX3BoZHIgKnBoZHIsIGludCBzeiwgb2ZmX3Qgb2Zmc2V0KQogewogCXBoZHItPnBfdHlwZSA9IFBUX05PVEU7CiAJcGhkci0+cF9vZmZzZXQgPSBvZmZzZXQ7CkBAIC0xNjI4LDE3ICsxNjM0LDE3IEBACiAJRUxGX0NPUkVfV1JJVEVfRVhUUkFfREFUQTsKICNlbmRpZgogCi0JaWYgKChvZmZfdCkgZmlsZS0+Zl9wb3MgIT0gb2Zmc2V0KSB7CisJaWYgKChvZmZfdClmaWxlLT5mX3BvcyAhPSBvZmZzZXQpIHsKIAkJLyogU2FuaXR5IGNoZWNrICovCi0JCXByaW50aygiZWxmX2NvcmVfZHVtcDogZmlsZS0+Zl9wb3MgKCVsZCkgIT0gb2Zmc2V0ICglbGQpXG4iLAotCQkgICAgICAgKG9mZl90KSBmaWxlLT5mX3Bvcywgb2Zmc2V0KTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZWxmX2NvcmVfZHVtcDogZmlsZS0+Zl9wb3MgKCVsZCkgIT0gb2Zmc2V0ICglbGQpXG4iLAorCQkgICAgICAgKG9mZl90KWZpbGUtPmZfcG9zLCBvZmZzZXQpOwogCX0KIAogZW5kX2NvcmVkdW1wOgogCXNldF9mcyhmcyk7CiAKIGNsZWFudXA6Ci0Jd2hpbGUoIWxpc3RfZW1wdHkoJnRocmVhZF9saXN0KSkgeworCXdoaWxlICghbGlzdF9lbXB0eSgmdGhyZWFkX2xpc3QpKSB7CiAJCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCA9IHRocmVhZF9saXN0Lm5leHQ7CiAJCWxpc3RfZGVsKHRtcCk7CiAJCWtmcmVlKGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgZWxmX3RocmVhZF9zdGF0dXMsIGxpc3QpKTsKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9lbGZfZmRwaWMuYyBiL2ZzL2JpbmZtdF9lbGZfZmRwaWMuYwppbmRleCBlMDM0NGY2Li41YjMwNzZlIDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfZWxmX2ZkcGljLmMKKysrIGIvZnMvYmluZm10X2VsZl9mZHBpYy5jCkBAIC0xODcsNyArMTg3LDcgQEAKIAkJCQlnb3RvIGVycm9yOwogCiAJCQkvKiByZWFkIHRoZSBuYW1lIG9mIHRoZSBpbnRlcnByZXRlciBpbnRvIG1lbW9yeSAqLwotCQkJaW50ZXJwcmV0ZXJfbmFtZSA9IChjaGFyICopIGttYWxsb2MocGhkci0+cF9maWxlc3osIEdGUF9LRVJORUwpOworCQkJaW50ZXJwcmV0ZXJfbmFtZSA9IGttYWxsb2MocGhkci0+cF9maWxlc3osIEdGUF9LRVJORUwpOwogCQkJaWYgKCFpbnRlcnByZXRlcl9uYW1lKQogCQkJCWdvdG8gZXJyb3I7CiAKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9mbGF0LmMgYi9mcy9iaW5mbXRfZmxhdC5jCmluZGV4IDlkNjYyNTguLjEwOGQ1NmJiIDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfZmxhdC5jCisrKyBiL2ZzL2JpbmZtdF9mbGF0LmMKQEAgLTc3LDggKzc3LDYgQEAKIHN0YXRpYyBpbnQgbG9hZF9mbGF0X2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICosIHN0cnVjdCBwdF9yZWdzICogcmVncyk7CiBzdGF0aWMgaW50IGZsYXRfY29yZV9kdW1wKGxvbmcgc2lnbnIsIHN0cnVjdCBwdF9yZWdzICogcmVncywgc3RydWN0IGZpbGUgKmZpbGUpOwogCi1leHRlcm4gdm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgdXNlciAqKTsKLQogc3RhdGljIHN0cnVjdCBsaW51eF9iaW5mbXQgZmxhdF9mb3JtYXQgPSB7CiAJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKIAkubG9hZF9iaW5hcnkJPSBsb2FkX2ZsYXRfYmluYXJ5LApAQCAtNDQ0LDE5ICs0NDIsMjIgQEAKIAlmbGFncyAgICAgPSBudG9obChoZHItPmZsYWdzKTsKIAlyZXYgICAgICAgPSBudG9obChoZHItPnJldik7CiAKLQlpZiAoZmxhZ3MgJiBGTEFUX0ZMQUdfS1RSQUNFKQotCQlwcmludGsoIkJJTkZNVF9GTEFUOiBMb2FkaW5nIGZpbGU6ICVzXG4iLCBicHJtLT5maWxlbmFtZSk7Ci0KLQlpZiAoc3RybmNtcChoZHItPm1hZ2ljLCAiYkZMVCIsIDQpIHx8Ci0JCQkocmV2ICE9IEZMQVRfVkVSU0lPTiAmJiByZXYgIT0gT0xEX0ZMQVRfVkVSU0lPTikpIHsKKwlpZiAoc3RybmNtcChoZHItPm1hZ2ljLCAiYkZMVCIsIDQpKSB7CiAJCS8qCiAJCSAqIGJlY2F1c2UgYSBsb3Qgb2YgcGVvcGxlIGRvIG5vdCBtYW5hZ2UgdG8gcHJvZHVjZSBnb29kCiAJCSAqIGZsYXQgYmluYXJpZXMsICB3ZSBsZWF2ZSB0aGlzIHByaW50ayB0byBoZWxwIHRoZW0gcmVhbGlzZQogCQkgKiB0aGUgcHJvYmxlbS4gIFdlIG9ubHkgcHJpbnQgdGhlIGVycm9yIGlmIGl0cyBub3QgYSBzY3JpcHQgZmlsZQogCQkgKi8KIAkJaWYgKHN0cm5jbXAoaGRyLT5tYWdpYywgIiMhIiwgMikpCi0JCQlwcmludGsoIkJJTkZNVF9GTEFUOiBiYWQgbWFnaWMvcmV2ICgweCV4LCBuZWVkIDB4JXgpXG4iLAotCQkJCQlyZXYsIChpbnQpIEZMQVRfVkVSU0lPTik7CisJCQlwcmludGsoIkJJTkZNVF9GTEFUOiBiYWQgaGVhZGVyIG1hZ2ljXG4iKTsKKwkJcmV0dXJuIC1FTk9FWEVDOworCX0KKworCWlmIChmbGFncyAmIEZMQVRfRkxBR19LVFJBQ0UpCisJCXByaW50aygiQklORk1UX0ZMQVQ6IExvYWRpbmcgZmlsZTogJXNcbiIsIGJwcm0tPmZpbGVuYW1lKTsKKworCWlmIChyZXYgIT0gRkxBVF9WRVJTSU9OICYmIHJldiAhPSBPTERfRkxBVF9WRVJTSU9OKSB7CisJCXByaW50aygiQklORk1UX0ZMQVQ6IGJhZCBmbGF0IGZpbGUgdmVyc2lvbiAweCV4IChzdXBwb3J0ZWQgMHgleCBhbmQgMHgleClcbiIsIHJldiwgRkxBVF9WRVJTSU9OLCBPTERfRkxBVF9WRVJTSU9OKTsKIAkJcmV0dXJuIC1FTk9FWEVDOwogCX0KIAkKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9taXNjLmMgYi9mcy9iaW5mbXRfbWlzYy5jCmluZGV4IDI1NjhlYjQuLjZhN2I3MzAgMTAwNjQ0Ci0tLSBhL2ZzL2JpbmZtdF9taXNjLmMKKysrIGIvZnMvYmluZm10X21pc2MuYwpAQCAtMjY0LDcgKzI2NCw3IEBACiAJcmV0dXJuIHAgLSBmcm9tOwogfQogCi1zdGF0aWMgaW5saW5lIGNoYXIgKiBjaGVja19zcGVjaWFsX2ZsYWdzIChjaGFyICogc2ZzLCBOb2RlICogZSkKK3N0YXRpYyBjaGFyICogY2hlY2tfc3BlY2lhbF9mbGFncyAoY2hhciAqIHNmcywgTm9kZSAqIGUpCiB7CiAJY2hhciAqIHAgPSBzZnM7CiAJaW50IGNvbnQgPSAxOwpAQCAtNTg4LDExICs1ODgsMTEgQEAKIAkJY2FzZSAyOiBzZXRfYml0KEVuYWJsZWQsICZlLT5mbGFncyk7CiAJCQlicmVhazsKIAkJY2FzZSAzOiByb290ID0gZGdldChmaWxlLT5mX3Zmc21udC0+bW50X3NiLT5zX3Jvb3QpOwotCQkJZG93bigmcm9vdC0+ZF9pbm9kZS0+aV9zZW0pOworCQkJbXV0ZXhfbG9jaygmcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAKIAkJCWtpbGxfbm9kZShlKTsKIAotCQkJdXAoJnJvb3QtPmRfaW5vZGUtPmlfc2VtKTsKKwkJCW11dGV4X3VubG9jaygmcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJCQlkcHV0KHJvb3QpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6IHJldHVybiByZXM7CkBAIC02MjIsNyArNjIyLDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoZSk7CiAKIAlyb290ID0gZGdldChzYi0+c19yb290KTsKLQlkb3duKCZyb290LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJZGVudHJ5ID0gbG9va3VwX29uZV9sZW4oZS0+bmFtZSwgcm9vdCwgc3RybGVuKGUtPm5hbWUpKTsKIAllcnIgPSBQVFJfRVJSKGRlbnRyeSk7CiAJaWYgKElTX0VSUihkZW50cnkpKQpAQCAtNjU4LDcgKzY1OCw3IEBACiBvdXQyOgogCWRwdXQoZGVudHJ5KTsKIG91dDoKLQl1cCgmcm9vdC0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJZHB1dChyb290KTsKIAogCWlmIChlcnIpIHsKQEAgLTcwMywxMiArNzAzLDEyIEBACiAJCWNhc2UgMTogZW5hYmxlZCA9IDA7IGJyZWFrOwogCQljYXNlIDI6IGVuYWJsZWQgPSAxOyBicmVhazsKIAkJY2FzZSAzOiByb290ID0gZGdldChmaWxlLT5mX3Zmc21udC0+bW50X3NiLT5zX3Jvb3QpOwotCQkJZG93bigmcm9vdC0+ZF9pbm9kZS0+aV9zZW0pOworCQkJbXV0ZXhfbG9jaygmcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAKIAkJCXdoaWxlICghbGlzdF9lbXB0eSgmZW50cmllcykpCiAJCQkJa2lsbF9ub2RlKGxpc3RfZW50cnkoZW50cmllcy5uZXh0LCBOb2RlLCBsaXN0KSk7CiAKLQkJCXVwKCZyb290LT5kX2lub2RlLT5pX3NlbSk7CisJCQltdXRleF91bmxvY2soJnJvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCQkJZHB1dChyb290KTsKIAkJZGVmYXVsdDogcmV0dXJuIHJlczsKIAl9CmRpZmYgLS1naXQgYS9mcy9iaW8uYyBiL2ZzL2Jpby5jCmluZGV4IGRmZTI0MmEyLi5iYmM0NDJiIDEwMDY0NAotLS0gYS9mcy9iaW8uYworKysgYi9mcy9iaW8uYwpAQCAtMTIzLDkgKzEyMywxMCBAQAogCWJpb19mcmVlKGJpbywgZnNfYmlvX3NldCk7CiB9CiAKLWlubGluZSB2b2lkIGJpb19pbml0KHN0cnVjdCBiaW8gKmJpbykKK3ZvaWQgYmlvX2luaXQoc3RydWN0IGJpbyAqYmlvKQogewogCWJpby0+YmlfbmV4dCA9IE5VTEw7CisJYmlvLT5iaV9iZGV2ID0gTlVMTDsKIAliaW8tPmJpX2ZsYWdzID0gMSA8PCBCSU9fVVBUT0RBVEU7CiAJYmlvLT5iaV9ydyA9IDA7CiAJYmlvLT5iaV92Y250ID0gMDsKQEAgLTI1Miw3ICsyNTMsNyBAQAogICoJdGhlIGFjdHVhbCBkYXRhIGl0IHBvaW50cyB0by4gUmVmZXJlbmNlIGNvdW50IG9mIHJldHVybmVkCiAgKiAJYmlvIHdpbGwgYmUgb25lLgogICovCi1pbmxpbmUgdm9pZCBfX2Jpb19jbG9uZShzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBiaW8gKmJpb19zcmMpCit2b2lkIF9fYmlvX2Nsb25lKHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGJpbyAqYmlvX3NyYykKIHsKIAlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBiZGV2X2dldF9xdWV1ZShiaW9fc3JjLT5iaV9iZGV2KTsKIApkaWZmIC0tZ2l0IGEvZnMvYmxvY2tfZGV2LmMgYi9mcy9ibG9ja19kZXYuYwppbmRleCBlMGRmOTRjLi42ZTUwMzQ2IDEwMDY0NAotLS0gYS9mcy9ibG9ja19kZXYuYworKysgYi9mcy9ibG9ja19kZXYuYwpAQCAtMjAyLDcgKzIwMiw3IEBACiAJbG9mZl90IHNpemU7CiAJbG9mZl90IHJldHZhbDsKIAotCWRvd24oJmJkX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmYmRfaW5vZGUtPmlfbXV0ZXgpOwogCXNpemUgPSBpX3NpemVfcmVhZChiZF9pbm9kZSk7CiAKIAlzd2l0Y2ggKG9yaWdpbikgewpAQCAtMjE5LDcgKzIxOSw3IEBACiAJCX0KIAkJcmV0dmFsID0gb2Zmc2V0OwogCX0KLQl1cCgmYmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmJkX2lub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCQpkaWZmIC0tZ2l0IGEvZnMvYnVmZmVyLmMgYi9mcy9idWZmZXIuYwppbmRleCA1Mjg3YmUxLi4zZGM3MTJmIDEwMDY0NAotLS0gYS9mcy9idWZmZXIuYworKysgYi9mcy9idWZmZXIuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KQEAgLTE1MywxNCArMTU0LDggQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChiZGV2KSB7Ci0JCWludCBlcnI7Ci0KLQkJcmV0ID0gZmlsZW1hcF9mZGF0YXdyaXRlKGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcpOwotCQllcnIgPSBmaWxlbWFwX2ZkYXRhd2FpdChiZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nKTsKLQkJaWYgKCFyZXQpCi0JCQlyZXQgPSBlcnI7Ci0JfQorCWlmIChiZGV2KQorCQlyZXQgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0KGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKHN5bmNfYmxvY2tkZXYpOwpAQCAtMzU4LDExICszNTMsMTEgQEAKIAkgKiBXZSBuZWVkIHRvIHByb3RlY3QgYWdhaW5zdCBjb25jdXJyZW50IHdyaXRlcnMsCiAJICogd2hpY2ggY291bGQgY2F1c2UgbGl2ZWxvY2tzIGluIGZzeW5jX2J1ZmZlcnNfbGlzdAogCSAqLwotCWRvd24oJm1hcHBpbmctPmhvc3QtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZtYXBwaW5nLT5ob3N0LT5pX211dGV4KTsKIAllcnIgPSBmaWxlLT5mX29wLT5mc3luYyhmaWxlLCBmaWxlLT5mX2RlbnRyeSwgZGF0YXN5bmMpOwogCWlmICghcmV0KQogCQlyZXQgPSBlcnI7Ci0JdXAoJm1hcHBpbmctPmhvc3QtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJm1hcHBpbmctPmhvc3QtPmlfbXV0ZXgpOwogCWVyciA9IGZpbGVtYXBfZmRhdGF3YWl0KG1hcHBpbmcpOwogCWlmICghcmV0KQogCQlyZXQgPSBlcnI7CkBAIC0xMDMyLDcgKzEwMjcsNyBAQAogCQkvKiBMaW5rIHRoZSBidWZmZXIgdG8gaXRzIHBhZ2UgKi8KIAkJc2V0X2JoX3BhZ2UoYmgsIHBhZ2UsIG9mZnNldCk7CiAKLQkJYmgtPmJfZW5kX2lvID0gTlVMTDsKKwkJaW5pdF9idWZmZXIoYmgsIE5VTEwsIE5VTEwpOwogCX0KIAlyZXR1cm4gaGVhZDsKIC8qCkBAIC0xMTcwLDcgKzExNjUsNyBAQAogICogc29tZSBvZiB0aG9zZSBidWZmZXJzIG1heSBiZSBhbGlhc2VzIG9mIGZpbGVzeXN0ZW0gZGF0YS4KICAqIGdyb3dfZGV2X3BhZ2UoKSB3aWxsIGdvIEJVRygpIGlmIHRoaXMgaGFwcGVucy4KICAqLwotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbnQKIGdyb3dfYnVmZmVycyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBibG9jaywgaW50IHNpemUpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CkBAIC0xMzk2LDcgKzEzOTEsNyBAQAogLyoKICAqIExvb2sgdXAgdGhlIGJoIGluIHRoaXMgY3B1J3MgTFJVLiAgSWYgaXQncyB0aGVyZSwgbW92ZSBpdCB0byB0aGUgaGVhZC4KICAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqCiBsb29rdXBfYmhfbHJ1KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IGJsb2NrLCBpbnQgc2l6ZSkKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJldCA9IE5VTEw7CkBAIC0xNTQ2LDcgKzE1NDEsNyBAQAogLyoKICAqIENhbGxlZCB3aGVuIHRydW5jYXRpbmcgYSBidWZmZXIgb24gYSBwYWdlIGNvbXBsZXRlbHkuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBkaXNjYXJkX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3N0YXRpYyB2b2lkIGRpc2NhcmRfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQogewogCWxvY2tfYnVmZmVyKGJoKTsKIAljbGVhcl9idWZmZXJfZGlydHkoYmgpOwpAQCAtMTc2OCw3ICsxNzYzLDcgQEAKIAkgKiBoYW5kbGUgdGhhdCBoZXJlIGJ5IGp1c3QgY2xlYW5pbmcgdGhlbS4KIAkgKi8KIAotCWJsb2NrID0gcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKTsKKwlibG9jayA9IChzZWN0b3JfdClwYWdlLT5pbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGlub2RlLT5pX2Jsa2JpdHMpOwogCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CiAJYmggPSBoZWFkOwogCkBAIC0yMTYwLDExICsyMTU1LDEyIEBACiAgKiB0cnVuY2F0ZXMuICBVc2VzIHByZXBhcmUvY29tbWl0X3dyaXRlIHRvIGFsbG93IHRoZSBmaWxlc3lzdGVtIHRvCiAgKiBkZWFsIHdpdGggdGhlIGhvbGUuICAKICAqLwotaW50IGdlbmVyaWNfY29udF9leHBhbmQoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHNpemUpCitzdGF0aWMgaW50IF9fZ2VuZXJpY19jb250X2V4cGFuZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgc2l6ZSwKKwkJCQkgcGdvZmZfdCBpbmRleCwgdW5zaWduZWQgaW50IG9mZnNldCkKIHsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JdW5zaWduZWQgbG9uZyBpbmRleCwgb2Zmc2V0LCBsaW1pdDsKKwl1bnNpZ25lZCBsb25nIGxpbWl0OwogCWludCBlcnI7CiAKIAllcnIgPSAtRUZCSUc7CkBAIC0yMTc2LDI0ICsyMTcyLDI0IEBACiAJaWYgKHNpemUgPiBpbm9kZS0+aV9zYi0+c19tYXhieXRlcykKIAkJZ290byBvdXQ7CiAKLQlvZmZzZXQgPSAoc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUtMSkpOyAvKiBXaXRoaW4gcGFnZSAqLwotCi0JLyogdWdoLiAgaW4gcHJlcGFyZS9jb21taXRfd3JpdGUsIGlmIGZyb209PXRvPT1zdGFydCBvZiBibG9jaywgd2UgCi0JKiogc2tpcCB0aGUgcHJlcGFyZS4gIG1ha2Ugc3VyZSB3ZSBuZXZlciBzZW5kIGFuIG9mZnNldCBmb3IgdGhlIHN0YXJ0Ci0JKiogb2YgYSBibG9jawotCSovCi0JaWYgKChvZmZzZXQgJiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpID09IDApIHsKLQkJb2Zmc2V0Kys7Ci0JfQotCWluZGV4ID0gc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCWVyciA9IC1FTk9NRU07CiAJcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCk7CiAJaWYgKCFwYWdlKQogCQlnb3RvIG91dDsKIAllcnIgPSBtYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCBvZmZzZXQsIG9mZnNldCk7Ci0JaWYgKCFlcnIpIHsKLQkJZXJyID0gbWFwcGluZy0+YV9vcHMtPmNvbW1pdF93cml0ZShOVUxMLCBwYWdlLCBvZmZzZXQsIG9mZnNldCk7CisJaWYgKGVycikgeworCQkvKgorCQkgKiAtPnByZXBhcmVfd3JpdGUoKSBtYXkgaGF2ZSBpbnN0YW50aWF0ZWQgYSBmZXcgYmxvY2tzCisJCSAqIG91dHNpZGUgaV9zaXplLiAgVHJpbSB0aGVzZSBvZmYgYWdhaW4uCisJCSAqLworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQl2bXRydW5jYXRlKGlub2RlLCBpbm9kZS0+aV9zaXplKTsKKwkJZ290byBvdXQ7CiAJfQorCisJZXJyID0gbWFwcGluZy0+YV9vcHMtPmNvbW1pdF93cml0ZShOVUxMLCBwYWdlLCBvZmZzZXQsIG9mZnNldCk7CisKIAl1bmxvY2tfcGFnZShwYWdlKTsKIAlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJaWYgKGVyciA+IDApCkBAIC0yMjAyLDYgKzIxOTgsMzYgQEAKIAlyZXR1cm4gZXJyOwogfQogCitpbnQgZ2VuZXJpY19jb250X2V4cGFuZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgc2l6ZSkKK3sKKwlwZ29mZl90IGluZGV4OworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisKKwlvZmZzZXQgPSAoc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7IC8qIFdpdGhpbiBwYWdlICovCisKKwkvKiB1Z2guICBpbiBwcmVwYXJlL2NvbW1pdF93cml0ZSwgaWYgZnJvbT09dG89PXN0YXJ0IG9mIGJsb2NrLCB3ZQorCSoqIHNraXAgdGhlIHByZXBhcmUuICBtYWtlIHN1cmUgd2UgbmV2ZXIgc2VuZCBhbiBvZmZzZXQgZm9yIHRoZSBzdGFydAorCSoqIG9mIGEgYmxvY2sKKwkqLworCWlmICgob2Zmc2V0ICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSA9PSAwKSB7CisJCS8qIGNhbGxlciBtdXN0IGhhbmRsZSB0aGlzIGV4dHJhIGJ5dGUuICovCisJCW9mZnNldCsrOworCX0KKwlpbmRleCA9IHNpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworCXJldHVybiBfX2dlbmVyaWNfY29udF9leHBhbmQoaW5vZGUsIHNpemUsIGluZGV4LCBvZmZzZXQpOworfQorCitpbnQgZ2VuZXJpY19jb250X2V4cGFuZF9zaW1wbGUoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHNpemUpCit7CisJbG9mZl90IHBvcyA9IHNpemUgLSAxOworCXBnb2ZmX3QgaW5kZXggPSBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkgKyAxOworCisJLyogcHJlcGFyZS9jb21taXRfd3JpdGUgY2FuIGhhbmRsZSBldmVuIGlmIGZyb209PXRvPT1zdGFydCBvZiBibG9jay4gKi8KKwlyZXR1cm4gX19nZW5lcmljX2NvbnRfZXhwYW5kKGlub2RlLCBzaXplLCBpbmRleCwgb2Zmc2V0KTsKK30KKwogLyoKICAqIEZvciBtb3JvbmljIGZpbGVzeXN0ZW1zIHRoYXQgZG8gbm90IGFsbG93IGhvbGVzIGluIGZpbGUuCiAgKiBXZSBtYXkgaGF2ZSB0byBleHRlbmQgdGhlIGZpbGUuCkBAIC0yMzEzLDcgKzIzMzksNyBAQAogCV9fYmxvY2tfY29tbWl0X3dyaXRlKGlub2RlLHBhZ2UsZnJvbSx0byk7CiAJLyoKIAkgKiBObyBuZWVkIHRvIHVzZSBpX3NpemVfcmVhZCgpIGhlcmUsIHRoZSBpX3NpemUKLQkgKiBjYW5ub3QgY2hhbmdlIHVuZGVyIHVzIGJlY2F1c2Ugd2UgaG9sZCBpX3NlbS4KKwkgKiBjYW5ub3QgY2hhbmdlIHVuZGVyIHVzIGJlY2F1c2Ugd2UgaG9sZCBpX211dGV4LgogCSAqLwogCWlmIChwb3MgPiBpbm9kZS0+aV9zaXplKSB7CiAJCWlfc2l6ZV93cml0ZShpbm9kZSwgcG9zKTsKQEAgLTI2MTAsNyArMjYzNiw3IEBACiAJcGdvZmZfdCBpbmRleCA9IGZyb20gPj4gUEFHRV9DQUNIRV9TSElGVDsKIAl1bnNpZ25lZCBvZmZzZXQgPSBmcm9tICYgKFBBR0VfQ0FDSEVfU0laRS0xKTsKIAl1bnNpZ25lZCBibG9ja3NpemU7Ci0JcGdvZmZfdCBpYmxvY2s7CisJc2VjdG9yX3QgaWJsb2NrOwogCXVuc2lnbmVkIGxlbmd0aCwgcG9zOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwogCXN0cnVjdCBwYWdlICpwYWdlOwpAQCAtMjYyNiw3ICsyNjUyLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlsZW5ndGggPSBibG9ja3NpemUgLSBsZW5ndGg7Ci0JaWJsb2NrID0gaW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKTsKKwlpYmxvY2sgPSAoc2VjdG9yX3QpaW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKTsKIAkKIAlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4KTsKIAllcnIgPSAtRU5PTUVNOwpAQCAtMzE0NSw2ICszMTcxLDcgQEAKIEVYUE9SVF9TWU1CT0woZ2VuZXJpY19ibG9ja19ibWFwKTsKIEVYUE9SVF9TWU1CT0woZ2VuZXJpY19jb21taXRfd3JpdGUpOwogRVhQT1JUX1NZTUJPTChnZW5lcmljX2NvbnRfZXhwYW5kKTsKK0VYUE9SVF9TWU1CT0woZ2VuZXJpY19jb250X2V4cGFuZF9zaW1wbGUpOwogRVhQT1JUX1NZTUJPTChpbml0X2J1ZmZlcik7CiBFWFBPUlRfU1lNQk9MKGludmFsaWRhdGVfYmRldik7CiBFWFBPUlRfU1lNQk9MKGxsX3J3X2Jsb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL2NoYXJfZGV2LmMgYi9mcy9jaGFyX2Rldi5jCmluZGV4IDNiMWIxZWUuLjIxMTk1YzQgMTAwNjQ0Ci0tLSBhL2ZzL2NoYXJfZGV2LmMKKysrIGIvZnMvY2hhcl9kZXYuYwpAQCAtMzUsNyArMzUsNyBAQAogCXVuc2lnbmVkIGludCBtYWpvcjsKIAl1bnNpZ25lZCBpbnQgYmFzZW1pbm9yOwogCWludCBtaW5vcmN0OwotCWNvbnN0IGNoYXIgKm5hbWU7CisJY2hhciBuYW1lWzY0XTsKIAlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzOwogCXN0cnVjdCBjZGV2ICpjZGV2OwkJLyogd2lsbCBkaWUgKi8KIH0gKmNocmRldnNbTUFYX1BST0JFX0hBU0hdOwpAQCAtNDYsMzQgKzQ2LDg0IEBACiAJcmV0dXJuIG1ham9yICUgTUFYX1BST0JFX0hBU0g7CiB9CiAKLS8qIGdldCBjaGFyIGRldmljZSBuYW1lcyBpbiBzb21ld2hhdCByYW5kb20gb3JkZXIgKi8KLWludCBnZXRfY2hyZGV2X2xpc3QoY2hhciAqcGFnZSkKK3N0cnVjdCBjaHJkZXZfaW5mbyB7CisJaW50IGluZGV4OworCXN0cnVjdCBjaGFyX2RldmljZV9zdHJ1Y3QgKmNkOworfTsKKwordm9pZCAqZ2V0X25leHRfY2hyZGV2KHZvaWQgKmRldikKK3sKKwlzdHJ1Y3QgY2hyZGV2X2luZm8gKmluZm87CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaW5mbykKKwkJCWdvdG8gb3V0OworCQlpbmZvLT5pbmRleD0wOworCQlpbmZvLT5jZCA9IGNocmRldnNbaW5mby0+aW5kZXhdOworCQlpZiAoaW5mby0+Y2QpCisJCQlnb3RvIG91dDsKKwl9IGVsc2UgeworCQlpbmZvID0gZGV2OworCX0KKworCXdoaWxlIChpbmZvLT5pbmRleCA8IEFSUkFZX1NJWkUoY2hyZGV2cykpIHsKKwkJaWYgKGluZm8tPmNkKQorCQkJaW5mby0+Y2QgPSBpbmZvLT5jZC0+bmV4dDsKKwkJaWYgKGluZm8tPmNkKQorCQkJZ290byBvdXQ7CisJCS8qCisJCSAqIE5vIGRldmljZXMgb24gdGhpcyBjaGFpbiwgbW92ZSB0byB0aGUgbmV4dAorCQkgKi8KKwkJaW5mby0+aW5kZXgrKzsKKwkJaW5mby0+Y2QgPSAoaW5mby0+aW5kZXggPCBBUlJBWV9TSVpFKGNocmRldnMpKSA/CisJCQljaHJkZXZzW2luZm8tPmluZGV4XSA6IE5VTEw7CisJCWlmIChpbmZvLT5jZCkKKwkJCWdvdG8gb3V0OworCX0KKworb3V0OgorCXJldHVybiBpbmZvOworfQorCit2b2lkICphY3F1aXJlX2NocmRldl9saXN0KHZvaWQpCit7CisJZG93bigmY2hyZGV2c19sb2NrKTsKKwlyZXR1cm4gZ2V0X25leHRfY2hyZGV2KE5VTEwpOworfQorCit2b2lkIHJlbGVhc2VfY2hyZGV2X2xpc3Qodm9pZCAqZGV2KQoreworCXVwKCZjaHJkZXZzX2xvY2spOworCWtmcmVlKGRldik7Cit9CisKKworaW50IGNvdW50X2NocmRldl9saXN0KHZvaWQpCiB7CiAJc3RydWN0IGNoYXJfZGV2aWNlX3N0cnVjdCAqY2Q7Ci0JaW50IGksIGxlbjsKKwlpbnQgaSwgY291bnQ7CiAKLQlsZW4gPSBzcHJpbnRmKHBhZ2UsICJDaGFyYWN0ZXIgZGV2aWNlczpcbiIpOworCWNvdW50ID0gMDsKIAotCWRvd24oJmNocmRldnNfbG9jayk7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2hyZGV2cykgOyBpKyspIHsKLQkJZm9yIChjZCA9IGNocmRldnNbaV07IGNkOyBjZCA9IGNkLT5uZXh0KSB7Ci0JCQkvKgotCQkJICogaWYgdGhlIGN1cnJlbnQgbmFtZSwgcGx1cyB0aGUgNSBleHRyYSBjaGFyYWN0ZXJzCi0JCQkgKiBpbiB0aGUgZGV2aWNlIGxpbmUgZm9yIHRoaXMgZW50cnkKLQkJCSAqIHdvdWxkIHJ1biB1cyBvZmYgdGhlIHBhZ2UsIHdlJ3JlIGRvbmUKLQkJCSAqLwotCQkJaWYgKChsZW4rc3RybGVuKGNkLT5uYW1lKSArIDUpID49IFBBR0VfU0laRSkKLQkJCQlnb3RvIHBhZ2VfZnVsbDsKLQotCi0JCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIiUzZCAlc1xuIiwKLQkJCQkgICAgICAgY2QtPm1ham9yLCBjZC0+bmFtZSk7Ci0JCX0KKwkJZm9yIChjZCA9IGNocmRldnNbaV07IGNkOyBjZCA9IGNkLT5uZXh0KQorCQkJY291bnQrKzsKIAl9Ci1wYWdlX2Z1bGw6Ci0JdXAoJmNocmRldnNfbG9jayk7CiAKLQlyZXR1cm4gbGVuOworCXJldHVybiBjb3VudDsKK30KKworaW50IGdldF9jaHJkZXZfaW5mbyh2b2lkICpkZXYsIGludCAqbWFqb3IsIGNoYXIgKipuYW1lKQoreworCXN0cnVjdCBjaHJkZXZfaW5mbyAqaW5mbyA9IGRldjsKKworCWlmIChpbmZvLT5jZCA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKworCSptYWpvciA9IGluZm8tPmNkLT5tYWpvcjsKKwkqbmFtZSA9IGluZm8tPmNkLT5uYW1lOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTIxLDcgKzE3MSw3IEBACiAJY2QtPm1ham9yID0gbWFqb3I7CiAJY2QtPmJhc2VtaW5vciA9IGJhc2VtaW5vcjsKIAljZC0+bWlub3JjdCA9IG1pbm9yY3Q7Ci0JY2QtPm5hbWUgPSBuYW1lOworCXN0cm5jcHkoY2QtPm5hbWUsbmFtZSwgNjQpOwogCiAJaSA9IG1ham9yX3RvX2luZGV4KG1ham9yKTsKIApkaWZmIC0tZ2l0IGEvZnMvY2lmcy9DSEFOR0VTIGIvZnMvY2lmcy9DSEFOR0VTCmluZGV4IDk0M2VmOWIuLmQzMzUwMTUgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvQ0hBTkdFUworKysgYi9mcy9jaWZzL0NIQU5HRVMKQEAgLTEsMyArMSwxMSBAQAorVmVyc2lvbiAxLjQwCistLS0tLS0tLS0tLS0KK1VzZSBmc3VpZCAoZnNnaWQpIG1vcmUgY29uc2lzdGVudGx5IGluc3RlYWQgb2YgdWlkIChnaWQpLiBJbXByb3ZlIHBlcmZvcm1hbmNlCitvZiByZWFkcGFnZXMgYnkgZWxpbWluYXRpbmcgb25lIGV4dHJhIG1lbWNweS4gQWxsb3cgdXBkYXRlIG9mIGZpbGUgc2l6ZQorZnJvbSByZW1vdGUgc2VydmVyIGV2ZW4gaWYgZmlsZSBpcyBvcGVuIGZvciB3cml0ZSBhcyBsb25nIGFzIG1vdW50IGlzCitkaXJlY3Rpby4gIFJlY29nbml6ZSBzaGFyZSBtb2RlIHNlY3VyaXR5IGFuZCBzZW5kIE5UTE0gZW5jcnlwdGVkIHBhc3N3b3JkCitvbiB0cmVlIGNvbm5lY3QgaWYgc2hhcmUgbW9kZSBuZWdvdGlhdGVkLgorCiBWZXJzaW9uIDEuMzkKIC0tLS0tLS0tLS0tLQogRGVmZXIgY2xvc2Ugb2YgYSBmaWxlIGhhbmRsZSBzbGlnaHRseSBpZiBwZW5kaW5nIHdyaXRlcyBkZXBlbmQgb24gdGhhdCBoYW5kbGUKQEAgLTcsNiArMTUsOCBAQAogQ0lGUyBVbml4IEV4dGVuc2lvbnMuICBGaXggc2V0ZmFjbC9nZXRmYWNsIG9uIGJpZ2VuZGlhbi4gVGltZW91dCBuZWdhdGl2ZQogZGVudHJpZXMgc28gZmlsZXMgdGhhdCB0aGUgY2xpZW50IHNlZXMgYXMgZGVsZXRlZCBidXQgdGhhdCBsYXRlciBnZXQgY3JlYXRlZAogb24gdGhlIHNlcnZlciB3aWxsIGJlIHJlY29nbml6ZWQuICBBZGQgY2xpZW50IHNpZGUgcGVybWlzc2lvbiBjaGVjayBvbiBzZXRhdHRyLgorVGltZW91dCBzdHVjayByZXF1ZXN0cyBiZXR0ZXIgKHdoZXJlIHNlcnZlciBoYXMgbmV2ZXIgcmVzcG9uZGVkIG9yIHNlbnQgY29ycnVwdAorcmVzcG9uc2VzKQogCiBWZXJzaW9uIDEuMzgKIC0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9SRUFETUUgYi9mcy9jaWZzL1JFQURNRQppbmRleCBlNWQwOWEyLi5iMDA3MGQxIDEwMDY0NAotLS0gYS9mcy9jaWZzL1JFQURNRQorKysgYi9mcy9jaWZzL1JFQURNRQpAQCAtNDM2LDcgKzQzNiwxNyBAQAogCQlTRlUgZG9lcykuICBJbiB0aGUgZnV0dXJlIHRoZSBib3R0b20gOSBiaXRzIG9mIHRoZSBtb2RlCiAJCW1vZGUgYWxzbyB3aWxsIGJlIGVtdWxhdGVkIHVzaW5nIHF1ZXJpZXMgb2YgdGhlIHNlY3VyaXR5CiAJCWRlc2NyaXB0b3IgKEFDTCkuCi0JCQorc2VjCQlTZWN1cml0eSBtb2RlLiAgQWxsb3dlZCB2YWx1ZXMgYXJlOgorCQkJbm9uZQlhdHRlbXB0IHRvIGNvbm5lY3Rpb24gYXMgYSBudWxsIHVzZXIgKG5vIG5hbWUpCisJCQlrcmI1ICAgIFVzZSBLZXJiZXJvcyB2ZXJzaW9uIDUgYXV0aGVudGljYXRpb24KKwkJCWtyYjVpICAgVXNlIEtlcmJlcm9zIGF1dGhlbnRpY2F0aW9uIGFuZCBwYWNrZXQgc2lnbmluZworCQkJbnRsbSAgICBVc2UgTlRMTSBwYXNzd29yZCBoYXNoaW5nIChkZWZhdWx0KQorCQkJbnRsbWkgICBVc2UgTlRMTSBwYXNzd29yZCBoYXNoaW5nIHdpdGggc2lnbmluZyAoaWYKKwkJCQkvcHJvYy9mcy9jaWZzL1BhY2tldFNpZ25pbmdFbmFibGVkIG9uIG9yIGlmCisJCQkJc2VydmVyIHJlcXVpcmVzIHNpZ25pbmcgYWxzbyBjYW4gYmUgdGhlIGRlZmF1bHQpIAorCQkJbnRsbXYyICBVc2UgTlRMTXYyIHBhc3N3b3JkIGhhc2hpbmcgICAgICAKKwkJCW50bG12MmkgVXNlIE5UTE12MiBwYXNzd29yZCBoYXNoaW5nIHdpdGggcGFja2V0IHNpZ25pbmcKKwogVGhlIG1vdW50LmNpZnMgbW91bnQgaGVscGVyIGFsc28gYWNjZXB0cyBhIGZldyBtb3VudCBvcHRpb25zIGJlZm9yZSAtbwogaW5jbHVkaW5nOgogCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNfZGVidWcuYyBiL2ZzL2NpZnMvY2lmc19kZWJ1Zy5jCmluZGV4IDIyYTQ0NGEuLmY0MTI0YTMgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc19kZWJ1Zy5jCisrKyBiL2ZzL2NpZnMvY2lmc19kZWJ1Zy5jCkBAIC0yMTksNiArMjE5LDEwIEBACiAKICAgICAgICAgaWYgKGMgPT0gJzEnIHx8IGMgPT0gJ3knIHx8IGMgPT0gJ1knIHx8IGMgPT0gJzAnKSB7CiAJCXJlYWRfbG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisjaWZkZWYgQ09ORklHX0NJRlNfU1RBVFMyCisJCWF0b21pY19zZXQoJnRvdEJ1ZkFsbG9jQ291bnQsIDApOworCQlhdG9taWNfc2V0KCZ0b3RTbUJ1ZkFsbG9jQ291bnQsIDApOworI2VuZGlmIC8qIENPTkZJR19DSUZTX1NUQVRTMiAqLwogCQlsaXN0X2Zvcl9lYWNoKHRtcCwgJkdsb2JhbFRyZWVDb25uZWN0aW9uTGlzdCkgewogCQkJdGNvbiA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvLAogCQkJCQljaWZzQ29ubmVjdGlvbkxpc3QpOwpAQCAtMjc2LDYgKzI4MCwxNCBAQAogCQkJc21CdWZBbGxvY0NvdW50LmNvdW50ZXIsY2lmc19taW5fc21hbGwpOwogCWxlbmd0aCArPSBpdGVtX2xlbmd0aDsKIAlidWYgKz0gaXRlbV9sZW5ndGg7CisjaWZkZWYgQ09ORklHX0NJRlNfU1RBVFMyCisgICAgICAgIGl0ZW1fbGVuZ3RoID0gc3ByaW50ZihidWYsICJUb3RhbCBMYXJnZSAlZCBTbWFsbCAlZCBBbGxvY2F0aW9uc1xuIiwKKwkJCQlhdG9taWNfcmVhZCgmdG90QnVmQWxsb2NDb3VudCksCisJCSAgICAgICAgICAgICAgICBhdG9taWNfcmVhZCgmdG90U21CdWZBbGxvY0NvdW50KSk7CisJbGVuZ3RoICs9IGl0ZW1fbGVuZ3RoOworCWJ1ZiArPSBpdGVtX2xlbmd0aDsKKyNlbmRpZiAvKiBDT05GSUdfQ0lGU19TVEFUUzIgKi8KKwogCWl0ZW1fbGVuZ3RoID0gCiAJCXNwcmludGYoYnVmLCJPcGVyYXRpb25zIChNSURzKTogJWRcbiIsCiAJCQltaWRDb3VudC5jb3VudGVyKTsKQEAgLTM4OSw4ICs0MDEsOCBAQAogc3RhdGljIHdyaXRlX3Byb2NfdCBudGxtdjJfZW5hYmxlZF93cml0ZTsKIHN0YXRpYyByZWFkX3Byb2NfdCBwYWNrZXRfc2lnbmluZ19lbmFibGVkX3JlYWQ7CiBzdGF0aWMgd3JpdGVfcHJvY190IHBhY2tldF9zaWduaW5nX2VuYWJsZWRfd3JpdGU7Ci1zdGF0aWMgcmVhZF9wcm9jX3QgcXVvdGFFbmFibGVkX3JlYWQ7Ci1zdGF0aWMgd3JpdGVfcHJvY190IHF1b3RhRW5hYmxlZF93cml0ZTsKK3N0YXRpYyByZWFkX3Byb2NfdCBleHBlcmltRW5hYmxlZF9yZWFkOworc3RhdGljIHdyaXRlX3Byb2NfdCBleHBlcmltRW5hYmxlZF93cml0ZTsKIHN0YXRpYyByZWFkX3Byb2NfdCBsaW51eEV4dGVuc2lvbnNFbmFibGVkX3JlYWQ7CiBzdGF0aWMgd3JpdGVfcHJvY190IGxpbnV4RXh0ZW5zaW9uc0VuYWJsZWRfd3JpdGU7CiAKQEAgLTQzMCw5ICs0NDIsOSBAQAogCQlwZGUtPndyaXRlX3Byb2MgPSBvcGxvY2tFbmFibGVkX3dyaXRlOwogCiAJcGRlID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiRXhwZXJpbWVudGFsIiwgMCwgcHJvY19mc19jaWZzLAotCQkJCXF1b3RhRW5hYmxlZF9yZWFkLCBOVUxMKTsKKwkJCQlleHBlcmltRW5hYmxlZF9yZWFkLCBOVUxMKTsKIAlpZiAocGRlKQotCQlwZGUtPndyaXRlX3Byb2MgPSBxdW90YUVuYWJsZWRfd3JpdGU7CisJCXBkZS0+d3JpdGVfcHJvYyA9IGV4cGVyaW1FbmFibGVkX3dyaXRlOwogCiAJcGRlID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiTGludXhFeHRlbnNpb25zRW5hYmxlZCIsIDAsIHByb2NfZnNfY2lmcywKIAkJCQlsaW51eEV4dGVuc2lvbnNFbmFibGVkX3JlYWQsIE5VTEwpOwpAQCAtNTc0LDE0ICs1ODYsMTMgQEAKIH0KIAogc3RhdGljIGludAotcXVvdGFFbmFibGVkX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCitleHBlcmltRW5hYmxlZF9yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAogICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7CiAgICAgICAgIGludCBsZW47CiAKICAgICAgICAgbGVuID0gc3ByaW50ZihwYWdlLCAiJWRcbiIsIGV4cGVyaW1FbmFibGVkKTsKLS8qIGNvdWxkIGFsc28gY2hlY2sgaWYgcXVvdGFzIGFyZSBlbmFibGVkIGluIGtlcm5lbAotCWFzIGEgd2hvbGUgZmlyc3QgKi8KKwogICAgICAgICBsZW4gLT0gb2ZmOwogICAgICAgICAqc3RhcnQgPSBwYWdlICsgb2ZmOwogCkBAIC01OTYsMjEgKzYwNywyMyBAQAogICAgICAgICByZXR1cm4gbGVuOwogfQogc3RhdGljIGludAotcXVvdGFFbmFibGVkX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorZXhwZXJpbUVuYWJsZWRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCiB7Ci0gICAgICAgIGNoYXIgYzsKLSAgICAgICAgaW50IHJjOworCWNoYXIgYzsKKwlpbnQgcmM7CiAKLSAgICAgICAgcmMgPSBnZXRfdXNlcihjLCBidWZmZXIpOwotICAgICAgICBpZiAocmMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJjOwotICAgICAgICBpZiAoYyA9PSAnMCcgfHwgYyA9PSAnbicgfHwgYyA9PSAnTicpCi0gICAgICAgICAgICAgICAgZXhwZXJpbUVuYWJsZWQgPSAwOwotICAgICAgICBlbHNlIGlmIChjID09ICcxJyB8fCBjID09ICd5JyB8fCBjID09ICdZJykKLSAgICAgICAgICAgICAgICBleHBlcmltRW5hYmxlZCA9IDE7CisJcmMgPSBnZXRfdXNlcihjLCBidWZmZXIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCWlmIChjID09ICcwJyB8fCBjID09ICduJyB8fCBjID09ICdOJykKKwkJZXhwZXJpbUVuYWJsZWQgPSAwOworCWVsc2UgaWYgKGMgPT0gJzEnIHx8IGMgPT0gJ3knIHx8IGMgPT0gJ1knKQorCQlleHBlcmltRW5hYmxlZCA9IDE7CisJZWxzZSBpZiAoYyA9PSAnMicpCisJCWV4cGVyaW1FbmFibGVkID0gMjsKIAotICAgICAgICByZXR1cm4gY291bnQ7CisJcmV0dXJuIGNvdW50OwogfQogCiBzdGF0aWMgaW50CkBAIC02MjAsOCArNjMzLDYgQEAKICAgICAgICAgaW50IGxlbjsKIAogICAgICAgICBsZW4gPSBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgbGludXhFeHRFbmFibGVkKTsKLS8qIGNvdWxkIGFsc28gY2hlY2sgaWYgcXVvdGFzIGFyZSBlbmFibGVkIGluIGtlcm5lbAotCWFzIGEgd2hvbGUgZmlyc3QgKi8KICAgICAgICAgbGVuIC09IG9mZjsKICAgICAgICAgKnN0YXJ0ID0gcGFnZSArIG9mZjsKIApkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzX2ZzX3NiLmggYi9mcy9jaWZzL2NpZnNfZnNfc2IuaAppbmRleCBmNzk5ZjZmLi5hZDU4ZWIwIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNfZnNfc2IuaAorKysgYi9mcy9jaWZzL2NpZnNfZnNfc2IuaApAQCAtMjQsOSArMjQsMTAgQEAKICNkZWZpbmUgQ0lGU19NT1VOVF9ESVJFQ1RfSU8gICAgOCAvKiBkbyBub3Qgd3JpdGUgbm9yIHJlYWQgdGhyb3VnaCBwYWdlIGNhY2hlICovCiAjZGVmaW5lIENJRlNfTU9VTlRfTk9fWEFUVFIgIDB4MTAgLyogaWYgc2V0IC0gZGlzYWJsZSB4YXR0ciBzdXBwb3J0ICovCiAjZGVmaW5lIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSIDB4MjAgLyogcmVtYXAgaWxsZWdhbCBjaGFycyBpbiBmaWxlbmFtZXMgKi8KLSNkZWZpbmUgQ0lGU19NT1VOVF9QT1NJWF9QQVRIUyAweDQwIC8qIE5lZ290aWF0ZSBwb3NpeCBwYXRobmFtZXMgaWYgcG9zc2libGUuICovCi0jZGVmaW5lIENJRlNfTU9VTlRfVU5YX0VNVUwgICAgMHg4MCAvKiBOZXR3b3JrIGNvbXBhdCB3aXRoIFNGVW5peCBlbXVsYXRpb24gKi8KKyNkZWZpbmUgQ0lGU19NT1VOVF9QT1NJWF9QQVRIUwkweDQwIC8qIE5lZ290aWF0ZSBwb3NpeCBwYXRobmFtZXMgaWYgcG9zc2libGUuICovCisjZGVmaW5lIENJRlNfTU9VTlRfVU5YX0VNVUwJMHg4MCAvKiBOZXR3b3JrIGNvbXBhdCB3aXRoIFNGVW5peCBlbXVsYXRpb24gKi8KICNkZWZpbmUgQ0lGU19NT1VOVF9OT19CUkwJMHgxMDAgLyogTm8gc2VuZGluZyBieXRlIHJhbmdlIGxvY2tzIHRvIHNydiAqLworI2RlZmluZSBDSUZTX01PVU5UX0NJRlNfQUNMCTB4MjAwIC8qIHNlbmQgQUNMIHJlcXVlc3RzIHRvIG5vbi1QT1NJWCBzcnYgKi8KIAogc3RydWN0IGNpZnNfc2JfaW5mbyB7CiAJc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbjsJLyogcHJpbWFyeSBtb3VudCAqLwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzX3VuaXVwci5oIGIvZnMvY2lmcy9jaWZzX3VuaXVwci5oCmluZGV4IGRlY2QxMzguLmRhMmFkNWIgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc191bml1cHIuaAorKysgYi9mcy9jaWZzL2NpZnNfdW5pdXByLmgKQEAgLTI0Miw3ICsyNDIsNyBAQAogLyoKICAqIExvd2VyIENhc2UgUmFuZ2UKICAqLwotY29uc3Qgc3RhdGljIHN0cnVjdCBVbmlDYXNlUmFuZ2UgQ2lmc1VuaUxvd2VyUmFuZ2VbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgVW5pQ2FzZVJhbmdlIENpZnNVbmlMb3dlclJhbmdlW10gPSB7CiAJMHgwMzgwLCAweDAzYWIsIFVuaUNhc2VSYW5nZUwwMzgwLAogCTB4MDQwMCwgMHgwNDJmLCBVbmlDYXNlUmFuZ2VMMDQwMCwKIAkweDA0OTAsIDB4MDRjYiwgVW5pQ2FzZVJhbmdlTDA0OTAsCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNhY2wuaCBiL2ZzL2NpZnMvY2lmc2FjbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNzc2YWMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL2NpZnNhY2wuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogICBmcy9jaWZzL2NpZnNhY2wuaAorICoKKyAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwNQorICogICBBdXRob3Iocyk6IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKQorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfQ0lGU0FDTF9ICisjZGVmaW5lIF9DSUZTQUNMX0gKKworc3RydWN0IGNpZnNfc2lkIHsKKwlfX3U4IHJldmlzaW9uOyAvKiByZXZpc2lvbiBsZXZlbCAqLworCV9fdTggbnVtX3N1YmF1dGhzOworCV9fdTggYXV0aG9yaXR5WzZdOworCV9fdTMyIHN1Yl9hdXRoWzRdOworCS8qIG5leHQgc3ViX2F1dGggaWYgYW55IC4uLiAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogZXZlcnlvbmUgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgY2lmc19zaWQgc2lkX2V2ZXJ5b25lOworLyogZ3JvdXAgdXNlcnMgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgY2lmc19zaWQgc2lkX3VzZXI7CisKKyNlbmRpZiAvKiBfQ0lGU0FDTF9IICovCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNlbmNyeXB0LmMgYi9mcy9jaWZzL2NpZnNlbmNyeXB0LmMKaW5kZXggZmUyYmI3Yy4uYTJjMjQ4NSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZW5jcnlwdC5jCisrKyBiL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgIGZzL2NpZnMvY2lmc2VuY3J5cHQuYwogICoKLSAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMworICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgIENvcnAuLCAyMDA1CiAgKiAgIEF1dGhvcihzKTogU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pCiAgKgogICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtODIsNiArODIsNTkgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyBpbnQgY2lmc19jYWxjX3NpZ25hdHVyZTIoY29uc3Qgc3RydWN0IGt2ZWMgKiBpb3YsIGludCBuX3ZlYywKKwkJCQljb25zdCBjaGFyICoga2V5LCBjaGFyICogc2lnbmF0dXJlKQoreworICAgICAgICBzdHJ1Y3QgIE1ENUNvbnRleHQgY29udGV4dDsKKworICAgICAgICBpZigoaW92ID09IE5VTEwpIHx8IChzaWduYXR1cmUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgTUQ1SW5pdCgmY29udGV4dCk7CisgICAgICAgIE1ENVVwZGF0ZSgmY29udGV4dCxrZXksQ0lGU19TRVNTSU9OX0tFWV9TSVpFKzE2KTsKKworLyogICAgICAgIE1ENVVwZGF0ZSgmY29udGV4dCxjaWZzX3BkdS0+UHJvdG9jb2wsY2lmc19wZHUtPnNtYl9idWZfbGVuZ3RoKTsgKi8gLyogQkIgRklYTUUgQkIgKi8KKworICAgICAgICBNRDVGaW5hbChzaWduYXR1cmUsJmNvbnRleHQpOworCisJcmV0dXJuIC1FT1BOT1RTVVBQOworLyogICAgICAgIHJldHVybiAwOyAqLworfQorCisKK2ludCBjaWZzX3NpZ25fc21iMihzdHJ1Y3Qga3ZlYyAqIGlvdiwgaW50IG5fdmVjLCBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsCisJCSAgIF9fdTMyICogcGV4cGVjdGVkX3Jlc3BvbnNlX3NlcXVlbmNlX251bWJlcikKK3sKKwlpbnQgcmMgPSAwOworCWNoYXIgc21iX3NpZ25hdHVyZVsyMF07CisJc3RydWN0IHNtYl9oZHIgKiBjaWZzX3BkdSA9IGlvdlswXS5pb3ZfYmFzZTsKKworCWlmKChjaWZzX3BkdSA9PSBOVUxMKSB8fCAoc2VydmVyID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmKChjaWZzX3BkdS0+RmxhZ3MyICYgU01CRkxHMl9TRUNVUklUWV9TSUdOQVRVUkUpID09IDApCisJCXJldHVybiByYzsKKworICAgICAgICBzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKyAgICAgICAgY2lmc19wZHUtPlNpZ25hdHVyZS5TZXF1ZW5jZS5TZXF1ZW5jZU51bWJlciA9IAorCQkJCWNwdV90b19sZTMyKHNlcnZlci0+c2VxdWVuY2VfbnVtYmVyKTsKKyAgICAgICAgY2lmc19wZHUtPlNpZ25hdHVyZS5TZXF1ZW5jZS5SZXNlcnZlZCA9IDA7CisKKyAgICAgICAgKnBleHBlY3RlZF9yZXNwb25zZV9zZXF1ZW5jZV9udW1iZXIgPSBzZXJ2ZXItPnNlcXVlbmNlX251bWJlcisrOworICAgICAgICBzZXJ2ZXItPnNlcXVlbmNlX251bWJlcisrOworICAgICAgICBzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCisgICAgICAgIHJjID0gY2lmc19jYWxjX3NpZ25hdHVyZTIoaW92LCBuX3ZlYywgc2VydmVyLT5tYWNfc2lnbmluZ19rZXksCisJCQkJICAgICAgc21iX3NpZ25hdHVyZSk7CisgICAgICAgIGlmKHJjKQorICAgICAgICAgICAgICAgIG1lbXNldChjaWZzX3BkdS0+U2lnbmF0dXJlLlNlY3VyaXR5U2lnbmF0dXJlLCAwLCA4KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1lbWNweShjaWZzX3BkdS0+U2lnbmF0dXJlLlNlY3VyaXR5U2lnbmF0dXJlLCBzbWJfc2lnbmF0dXJlLCA4KTsKKworICAgICAgICByZXR1cm4gcmM7CisKK30KKwogaW50IGNpZnNfdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3Qgc21iX2hkciAqIGNpZnNfcGR1LCBjb25zdCBjaGFyICogbWFjX2tleSwKIAlfX3UzMiBleHBlY3RlZF9zZXF1ZW5jZV9udW1iZXIpCiB7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNmcy5jIGIvZnMvY2lmcy9jaWZzZnMuYwppbmRleCAyYTEzYTJiLi43OWVlY2NkIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNmcy5jCisrKyBiL2ZzL2NpZnMvY2lmc2ZzLmMKQEAgLTUxMyw2ICs1MTMsMTcgQEAKIAlyZXR1cm4gd3JpdHRlbjsKIH0KIAorc3RhdGljIGxvZmZfdCBjaWZzX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKK3sKKwkvKiBvcmlnaW4gPT0gU0VFS19FTkQgPT4gd2UgbXVzdCByZXZhbGlkYXRlIHRoZSBjYWNoZWQgZmlsZSBsZW5ndGggKi8KKwlpZiAob3JpZ2luID09IDIpIHsKKwkJaW50IHJldHZhbCA9IGNpZnNfcmV2YWxpZGF0ZShmaWxlLT5mX2RlbnRyeSk7CisJCWlmIChyZXR2YWwgPCAwKQorCQkJcmV0dXJuIChsb2ZmX3QpcmV0dmFsOworCX0KKwlyZXR1cm4gcmVtb3RlX2xsc2VlayhmaWxlLCBvZmZzZXQsIG9yaWdpbik7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBjaWZzX2ZzX3R5cGUgPSB7CiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLm5hbWUgPSAiY2lmcyIsCkBAIC01ODYsNiArNTk3LDcgQEAKIAkuZmx1c2ggPSBjaWZzX2ZsdXNoLAogCS5tbWFwICA9IGNpZnNfZmlsZV9tbWFwLAogCS5zZW5kZmlsZSA9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZSwKKwkubGxzZWVrID0gY2lmc19sbHNlZWssCiAjaWZkZWYgQ09ORklHX0NJRlNfUE9TSVgKIAkuaW9jdGwJPSBjaWZzX2lvY3RsLAogI2VuZGlmIC8qIENPTkZJR19DSUZTX1BPU0lYICovCkBAIC02MDksNyArNjIxLDcgQEAKICNpZmRlZiBDT05GSUdfQ0lGU19QT1NJWAogCS5pb2N0bCAgPSBjaWZzX2lvY3RsLAogI2VuZGlmIC8qIENPTkZJR19DSUZTX1BPU0lYICovCi0KKwkubGxzZWVrID0gY2lmc19sbHNlZWssCiAjaWZkZWYgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMCiAJLmRpcl9ub3RpZnkgPSBjaWZzX2Rpcl9ub3RpZnksCiAjZW5kaWYgLyogQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMICovCkBAIC02MjcsNiArNjM5LDcgQEAKIAkuZmx1c2ggPSBjaWZzX2ZsdXNoLAogCS5tbWFwICA9IGNpZnNfZmlsZV9tbWFwLAogCS5zZW5kZmlsZSA9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZSwKKwkubGxzZWVrID0gY2lmc19sbHNlZWssCiAjaWZkZWYgQ09ORklHX0NJRlNfUE9TSVgKIAkuaW9jdGwJPSBjaWZzX2lvY3RsLAogI2VuZGlmIC8qIENPTkZJR19DSUZTX1BPU0lYICovCkBAIC02NDksNyArNjYyLDcgQEAKICNpZmRlZiBDT05GSUdfQ0lGU19QT1NJWAogCS5pb2N0bCAgPSBjaWZzX2lvY3RsLAogI2VuZGlmIC8qIENPTkZJR19DSUZTX1BPU0lYICovCi0KKwkubGxzZWVrID0gY2lmc19sbHNlZWssCiAjaWZkZWYgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMCiAJLmRpcl9ub3RpZnkgPSBjaWZzX2Rpcl9ub3RpZnksCiAjZW5kaWYgLyogQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMICovCkBAIC03MzMsNyArNzQ2LDcgQEAKIAkJa21lbV9jYWNoZV9kZXN0cm95KGNpZnNfcmVxX2NhY2hlcCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQkvKiAyNTYgKE1BWF9DSUZTX0hEUl9TSVpFIGJ5dGVzIGlzIGVub3VnaCBmb3IgbW9zdCBTTUIgcmVzcG9uc2VzIGFuZAorCS8qIE1BWF9DSUZTX1NNQUxMX0JVRkZFUl9TSVpFIGJ5dGVzIGlzIGVub3VnaCBmb3IgbW9zdCBTTUIgcmVzcG9uc2VzIGFuZAogCWFsbW9zdCBhbGwgaGFuZGxlIGJhc2VkIHJlcXVlc3RzIChidXQgbm90IHdyaXRlIHJlc3BvbnNlLCBub3IgaXMgaXQKIAlzdWZmaWNpZW50IGZvciBwYXRoIGJhc2VkIHJlcXVlc3RzKS4gIEEgc21hbGxlciBzaXplIHdvdWxkIGhhdmUKIAliZWVuIG1vcmUgZWZmaWNpZW50IChjb21wYWN0aW5nIG11bHRpcGxlIHNsYWIgaXRlbXMgb24gb25lIDRrIHBhZ2UpIApAQCAtNzQyLDcgKzc1NSw4IEBACiAJZWZmaWNpZW50IHRvIGFsbG9jIDEgcGVyIHBhZ2Ugb2ZmIHRoZSBzbGFiIGNvbXBhcmVkIHRvIDE3SyAoNXBhZ2UpIAogCWFsbG9jIG9mIGxhcmdlIGNpZnMgYnVmZmVycyBldmVuIHdoZW4gcGFnZSBkZWJ1Z2dpbmcgaXMgb24gKi8KIAljaWZzX3NtX3JlcV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiY2lmc19zbWFsbF9ycSIsCi0JCQlNQVhfQ0lGU19IRFJfU0laRSwgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMLCBOVUxMKTsKKwkJCU1BWF9DSUZTX1NNQUxMX0JVRkZFUl9TSVpFLCAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIAorCQkJTlVMTCwgTlVMTCk7CiAJaWYgKGNpZnNfc21fcmVxX2NhY2hlcCA9PSBOVUxMKSB7CiAJCW1lbXBvb2xfZGVzdHJveShjaWZzX3JlcV9wb29scCk7CiAJCWttZW1fY2FjaGVfZGVzdHJveShjaWZzX3JlcV9jYWNoZXApOwpAQCAtODYwLDkgKzg3NCw5IEBACiAJCQkJRGVsZXRlT3Bsb2NrUUVudHJ5KG9wbG9ja19pdGVtKTsKIAkJCQkvKiBjYW4gbm90IGdyYWIgaW5vZGUgc2VtIGhlcmUgc2luY2UgaXQgd291bGQKIAkJCQlkZWFkbG9jayB3aGVuIG9wbG9jayByZWNlaXZlZCBvbiBkZWxldGUgCi0JCQkJc2luY2UgdmZzX3VubGluayBob2xkcyB0aGUgaV9zZW0gYWNyb3NzCisJCQkJc2luY2UgdmZzX3VubGluayBob2xkcyB0aGUgaV9tdXRleCBhY3Jvc3MKIAkJCQl0aGUgY2FsbCAqLwotCQkJCS8qIGRvd24oJmlub2RlLT5pX3NlbSk7Ki8KKwkJCQkvKiBtdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ki8KIAkJCQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgewogCQkJCQlyYyA9IGZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0+aV9tYXBwaW5nKTsKIAkJCQkJaWYoQ0lGU19JKGlub2RlKS0+Y2xpZW50Q2FuQ2FjaGVSZWFkID09IDApIHsKQEAgLTg3MSw3ICs4ODUsNyBAQAogCQkJCQl9CiAJCQkJfSBlbHNlCiAJCQkJCXJjID0gMDsKLQkJCQkvKiB1cCgmaW5vZGUtPmlfc2VtKTsqLworCQkJCS8qIG11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOyovCiAJCQkJaWYgKHJjKQogCQkJCQlDSUZTX0koaW5vZGUpLT53cml0ZV9iZWhpbmRfcmMgPSByYzsKIAkJCQljRllJKDEsKCJPcGxvY2sgZmx1c2ggaW5vZGUgJXAgcmMgJWQiLGlub2RlLHJjKSk7CkBAIC05NTQsNiArOTY4LDEyIEBACiAJYXRvbWljX3NldCgmdGNvbkluZm9SZWNvbm5lY3RDb3VudCwgMCk7CiAKIAlhdG9taWNfc2V0KCZidWZBbGxvY0NvdW50LCAwKTsKKwlhdG9taWNfc2V0KCZzbUJ1ZkFsbG9jQ291bnQsIDApOworI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTMgorCWF0b21pY19zZXQoJnRvdEJ1ZkFsbG9jQ291bnQsIDApOworCWF0b21pY19zZXQoJnRvdFNtQnVmQWxsb2NDb3VudCwgMCk7CisjZW5kaWYgLyogQ09ORklHX0NJRlNfU1RBVFMyICovCisKIAlhdG9taWNfc2V0KCZtaWRDb3VudCwgMCk7CiAJR2xvYmFsQ3VycmVudFhpZCA9IDA7CiAJR2xvYmFsVG90YWxBY3RpdmVYaWQgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZnMuaCBiL2ZzL2NpZnMvY2lmc2ZzLmgKaW5kZXggOWVjNDBlMC4uODIxYThlYiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuaAorKysgYi9mcy9jaWZzL2NpZnNmcy5oCkBAIC05OSw1ICs5OSw1IEBACiBleHRlcm4gc3NpemVfdAljaWZzX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKiwgc2l6ZV90KTsKIGV4dGVybiBpbnQgY2lmc19pb2N0bCAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZXAsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgY29tbWFuZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotI2RlZmluZSBDSUZTX1ZFUlNJT04gICAiMS4zOSIKKyNkZWZpbmUgQ0lGU19WRVJTSU9OICAgIjEuNDAiCiAjZW5kaWYJCQkJLyogX0NJRlNGU19IICovCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNnbG9iLmggYi9mcy9jaWZzL2NpZnNnbG9iLmgKaW5kZXggMWJhMDhmOC4uN2JlZDI3NiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZ2xvYi5oCisrKyBiL2ZzL2NpZnMvY2lmc2dsb2IuaApAQCAtMjMzLDYgKzIzMyw4IEBACiAJYXRvbWljX3QgbnVtX2hhcmRsaW5rczsKIAlhdG9taWNfdCBudW1fc3ltbGlua3M7CiAJYXRvbWljX3QgbnVtX2xvY2tzOworCWF0b21pY190IG51bV9hY2xfZ2V0OworCWF0b21pY190IG51bV9hY2xfc2V0OwogI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTMgogCXVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lX3dyaXRlczsKIAl1bnNpZ25lZCBsb25nIGxvbmcgdGltZV9yZWFkczsKQEAgLTI4NSw2ICsyODcsNyBAQAogCXVuc2lnbmVkIGVuZE9mU2VhcmNoOjE7CiAJdW5zaWduZWQgZW1wdHlEaXI6MTsKIAl1bnNpZ25lZCB1bmljb2RlOjE7CisJdW5zaWduZWQgc21hbGxCdWY6MTsgLyogc28gd2Uga25vdyB3aGljaCBidWZfcmVsZWFzZSBmdW5jdGlvbiB0byBjYWxsICovCiB9OwogCiBzdHJ1Y3QgY2lmc0ZpbGVJbmZvIHsKQEAgLTQyMCw3ICs0MjMsMTIgQEAKICNkZWZpbmUgICBNSURfUkVTUE9OU0VfUkVDRUlWRUQgNAogI2RlZmluZSAgIE1JRF9SRVRSWV9ORUVERUQgICAgICA4IC8qIHNlc3Npb24gY2xvc2VkIHdoaWxlIHRoaXMgcmVxdWVzdCBvdXQgKi8KICNkZWZpbmUgICBNSURfTk9fUkVTUF9ORUVERUQgMHgxMAotI2RlZmluZSAgIE1JRF9TTUFMTF9CVUZGRVIgICAweDIwIC8qIDExMiBieXRlIHJlc3BvbnNlIGJ1ZmZlciBpbnN0ZWFkIG9mIDRLICovCisKKy8qIFR5cGVzIG9mIHJlc3BvbnNlIGJ1ZmZlciByZXR1cm5lZCBmcm9tIFNlbmRSZWNlaXZlMiAqLworI2RlZmluZSAgIENJRlNfTk9fQlVGRkVSICAgICAgICAwICAgIC8qIFJlc3BvbnNlIGJ1ZmZlciBub3QgcmV0dXJuZWQgKi8KKyNkZWZpbmUgICBDSUZTX1NNQUxMX0JVRkZFUiAgICAgMQorI2RlZmluZSAgIENJRlNfTEFSR0VfQlVGRkVSICAgICAyCisjZGVmaW5lICAgQ0lGU19JT1ZFQyAgICAgICAgICAgIDQgICAgLyogYXJyYXkgb2YgcmVzcG9uc2UgYnVmZmVycyAqLwogCiAvKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01MDUsOCArNTEzLDEyIEBACiBHTE9CQUxfRVhURVJOIGF0b21pY190IHRjb25JbmZvUmVjb25uZWN0Q291bnQ7CiAKIC8qIFZhcmlvdXMgRGVidWcgY291bnRlcnMgdG8gcmVtb3ZlIHNvbWVkYXkgKEJCKSAqLwotR0xPQkFMX0VYVEVSTiBhdG9taWNfdCBidWZBbGxvY0NvdW50OwotR0xPQkFMX0VYVEVSTiBhdG9taWNfdCBzbUJ1ZkFsbG9jQ291bnQ7ICAgICAgCitHTE9CQUxfRVhURVJOIGF0b21pY190IGJ1ZkFsbG9jQ291bnQ7ICAgIC8qIGN1cnJlbnQgbnVtYmVyIGFsbG9jYXRlZCAgKi8KKyNpZmRlZiBDT05GSUdfQ0lGU19TVEFUUzIKK0dMT0JBTF9FWFRFUk4gYXRvbWljX3QgdG90QnVmQWxsb2NDb3VudDsgLyogdG90YWwgYWxsb2NhdGVkIG92ZXIgYWxsIHRpbWUgKi8KK0dMT0JBTF9FWFRFUk4gYXRvbWljX3QgdG90U21CdWZBbGxvY0NvdW50OworI2VuZGlmCitHTE9CQUxfRVhURVJOIGF0b21pY190IHNtQnVmQWxsb2NDb3VudDsKIEdMT0JBTF9FWFRFUk4gYXRvbWljX3QgbWlkQ291bnQ7CiAKIC8qIE1pc2MgZ2xvYmFscyAqLwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzcGR1LmggYi9mcy9jaWZzL2NpZnNwZHUuaAppbmRleCAzM2UxODU5Li5jYzI0NzEwIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNwZHUuaAorKysgYi9mcy9jaWZzL2NpZnNwZHUuaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgIGZzL2NpZnMvY2lmc3BkdS5oCiAgKgotICogICBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgIENvcnAuLCAyMDAyCisgKiAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDIsMjAwNQogICogICBBdXRob3Iocyk6IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKQogICoKICAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTgwLDcgKzgwLDExIEBACiAjZGVmaW5lIE5UX1RSQU5TQUNUX0dFVF9VU0VSX1FVT1RBICAgIDB4MDcKICNkZWZpbmUgTlRfVFJBTlNBQ1RfU0VUX1VTRVJfUVVPVEEgICAgMHgwOAogCi0jZGVmaW5lIE1BWF9DSUZTX0hEUl9TSVpFIDI1NgkvKiBpcyBmdXR1cmUgY2hhaW5lZCBOVENyZWF0ZVhSZWFkWCBiaWdnZXI/ICovCisjZGVmaW5lIE1BWF9DSUZTX1NNQUxMX0JVRkZFUl9TSVpFIDQ0OCAvKiBiaWcgZW5vdWdoIGZvciBtb3N0ICovCisvKiBmdXR1cmUgY2hhaW5lZCBOVENyZWF0ZVhSZWFkWCBiaWdnZXIsIGJ1dCBmb3IgdGltZSBiZWluZyBOVENyZWF0ZVggYmlnZ2VzdCAqLworLyogYW1vbmcgdGhlIHJlcXVlc3RzIChOVENyZWF0ZVggcmVzcG9uc2UgaXMgYmlnZ2VyIHdpdGggd2N0IG9mIDM0KSAqLworI2RlZmluZSBNQVhfQ0lGU19IRFJfU0laRSAweDU4IC8qIDQgbGVuICsgMzIgaGRyICsgKDIqMjQgd2N0KSArIDIgYmN0ICsgMiBwYWQgKi8KKyNkZWZpbmUgQ0lGU19TTUFMTF9QQVRIIDEyMCAvKiBhbGxvd3MgZm9yICg0NDgtODgpLzMgKi8KIAogLyogaW50ZXJuYWwgY2lmcyB2ZnMgc3RydWN0dXJlcyAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01MjQsNyArNTI4LDcgQEAKIAkJLyogU1RSSU5HIFByaW1hcnlEb21haW4gKi8KIAkJLyogU1RSSU5HIE5hdGl2ZU9TICovCiAJCS8qIFNUUklORyBOYXRpdmVMYW5NYW4gKi8KLQl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIG9sZF9yZXE7CQkvKiBwcmUtTlRMTSAoTEFOTUFOMi4xKSByZXF1ZXN0IGZvcm1hdCAqLworCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgb2xkX3JlcTsgLyogcHJlLU5UTE0gKExBTk1BTjIuMSkgcmVxIGZvcm1hdCAqLwogCiAJc3RydWN0IHsJCS8qIGRlZmF1bHQgKE5UTE0pIHJlc3BvbnNlIGZvcm1hdCAqLwogCQlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDMgKi8KQEAgLTUzNiw3ICs1NDAsNyBAQAogCQl1bnNpZ25lZCBjaGFyIE5hdGl2ZU9TWzFdOwkvKiBmb2xsb3dlZCBieSAqLwogLyoJdW5zaWduZWQgY2hhciAqIE5hdGl2ZUxhbk1hbjsgKi8KIC8qICAgICAgdW5zaWduZWQgY2hhciAqIFByaW1hcnlEb21haW47ICovCi0JfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBvbGRfcmVzcDsJCS8qIHByZS1OVExNIChMQU5NQU4yLjEpIHJlc3BvbnNlIGZvcm1hdCAqLworCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgb2xkX3Jlc3A7IC8qIHByZS1OVExNIChMQU5NQU4yLjEpIHJlc3BvbnNlICovCiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIFNFU1NJT05fU0VUVVBfQU5EWDsKIAogI2RlZmluZSBDSUZTX05FVFdPUktfT1BTWVMgIkNJRlMgVkZTIENsaWVudCBmb3IgTGludXgiCkBAIC0xMDAzLDEwICsxMDA3LDQ5IEBACiAKIC8qIGVtcHR5IHdjdCByZXNwb25zZSB0byBzZXRhdHRyICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBOVCBUcmFuc2FjdCBzdHJ1Y3R1cmUgZGVmaW50aW9ucyBmb2xsb3cgICAgICAgICAqLwotLyogQ3VycmVudGx5IG9ubHkgaW9jdGwgYW5kIG5vdGlmeSBhcmUgaW1wbGVtZW50ZWQgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5UIFRyYW5zYWN0IHN0cnVjdHVyZSBkZWZpbnRpb25zIGZvbGxvdyAgICAgICAgICAgICAqLworLyogQ3VycmVudGx5IG9ubHkgaW9jdGwsIGFjbCAoZ2V0IHNlY3VyaXR5IGRlc2NyaXB0b3IpICovICAKKy8qIGFuZCBub3RpZnkgYXJlIGltcGxlbWVudGVkICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX250cmFuc2FjdF9yZXEgeworICAgICAgICBzdHJ1Y3Qgc21iX2hkciBoZHI7IC8qIHdjdCA+PSAxOSAqLworICAgICAgICBfX3U4IE1heFNldHVwQ291bnQ7CisgICAgICAgIF9fdTE2IFJlc2VydmVkOworICAgICAgICBfX2xlMzIgVG90YWxQYXJhbWV0ZXJDb3VudDsKKyAgICAgICAgX19sZTMyIFRvdGFsRGF0YUNvdW50OworICAgICAgICBfX2xlMzIgTWF4UGFyYW1ldGVyQ291bnQ7CisgICAgICAgIF9fbGUzMiBNYXhEYXRhQ291bnQ7CisgICAgICAgIF9fbGUzMiBQYXJhbWV0ZXJDb3VudDsKKyAgICAgICAgX19sZTMyIFBhcmFtZXRlck9mZnNldDsKKyAgICAgICAgX19sZTMyIERhdGFDb3VudDsKKyAgICAgICAgX19sZTMyIERhdGFPZmZzZXQ7CisgICAgICAgIF9fdTggU2V0dXBDb3VudDsgLyogZm91ciBzZXR1cCB3b3JkcyBmb2xsb3cgc3ViY29tbWFuZCAqLworICAgICAgICAvKiBTTklBIHNwZWMgaW5jb3JyZWN0bHkgaW5jbHVkZWQgc3B1cmlvdXMgcGFkIGhlcmUgKi8KKyAgICAgICAgX19sZTE2IFN1YkNvbW1hbmQ7IC8qIDIgPSBJT0NUTC9GU0NUTCAqLworCS8qIFNldHVwQ291bnQgd29yZHMgZm9sbG93IHRoZW4gKi8gCisgICAgICAgIF9fbGUxNiBCeXRlQ291bnQ7CisgICAgICAgIF9fdTggUGFkWzNdOworICAgICAgICBfX3U4IFBhcm1zWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBOVFJBTlNBQ1RfUkVROworCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX250cmFuc2FjdF9yc3AgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsgICAgIC8qIHdjdCA9IDE4ICovCisJX191OCBSZXNlcnZlZFszXTsKKwlfX2xlMzIgVG90YWxQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMzIgVG90YWxEYXRhQ291bnQ7CisJX19sZTMyIFBhcmFtZXRlckNvdW50OworCV9fbGUzMiBQYXJhbWV0ZXJPZmZzZXQ7CisJX19sZTMyIFBhcmFtZXRlckRpc3BsYWNlbWVudDsKKwlfX2xlMzIgRGF0YUNvdW50OworCV9fbGUzMiBEYXRhT2Zmc2V0OworCV9fbGUzMiBEYXRhRGlzcGxhY2VtZW50OworCV9fdTggU2V0dXBDb3VudDsgICAvKiAwICovCisJX191MTYgQnl0ZUNvdW50OworICAgICAgICAvKiBfX3U4IFBhZFszXTsgKi8KKwkvKiBwYXJtcyBhbmQgZGF0YSBmb2xsb3cgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgTlRSQU5TQUNUX1JTUDsKKwogdHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbl9pb2N0bF9yZXEgewogCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMjMgKi8KIAlfX3U4IE1heFNldHVwQ291bnQ7CkBAIC0xMDIxLDExICsxMDY0LDExIEBACiAJX19sZTMyIERhdGFPZmZzZXQ7CiAJX191OCBTZXR1cENvdW50OyAvKiBmb3VyIHNldHVwIHdvcmRzIGZvbGxvdyBzdWJjb21tYW5kICovCiAJLyogU05JQSBzcGVjIGluY29ycmVjdGx5IGluY2x1ZGVkIHNwdXJpb3VzIHBhZCBoZXJlICovCi0JX19sZTE2IFN1YkNvbW1hbmQ7LyogMiA9IElPQ1RML0ZTQ1RMICovCisJX19sZTE2IFN1YkNvbW1hbmQ7IC8qIDIgPSBJT0NUTC9GU0NUTCAqLwogCV9fbGUzMiBGdW5jdGlvbkNvZGU7CiAJX191MTYgRmlkOwotCV9fdTggSXNGc2N0bDsgICAgLyogMSA9IEZpbGUgU3lzdGVtIENvbnRyb2wsIDAgPSBkZXZpY2UgY29udHJvbCAoSU9DVEwpKi8KLQlfX3U4IElzUm9vdEZsYWc7IC8qIDEgPSBhcHBseSBjb21tYW5kIHRvIHJvb3Qgb2Ygc2hhcmUgKG11c3QgYmUgREZTIHNoYXJlKSovCisJX191OCBJc0ZzY3RsOyAgLyogMSA9IEZpbGUgU3lzdGVtIENvbnRyb2wgMCA9IGRldmljZSBjb250cm9sIChJT0NUTCkgKi8KKwlfX3U4IElzUm9vdEZsYWc7IC8qIDEgPSBhcHBseSBjb21tYW5kIHRvIHJvb3Qgb2Ygc2hhcmUgKG11c3QgYmUgREZTKSAqLwogCV9fbGUxNiBCeXRlQ291bnQ7CiAJX191OCBQYWRbM107CiAJX191OCBEYXRhWzFdOwpAQCAtMTA0NSw5ICsxMDg4LDM1IEBACiAJX191OCBTZXR1cENvdW50OwkvKiAxICovCiAJX19sZTE2IFJldHVybmVkRGF0YUxlbjsKIAlfX3UxNiBCeXRlQ291bnQ7Ci0JX191OCBQYWRbM107CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIFRSQU5TQUNUX0lPQ1RMX1JTUDsKIAorI2RlZmluZSBDSUZTX0FDTF9PV05FUiAxCisjZGVmaW5lIENJRlNfQUNMX0dST1VQIDIKKyNkZWZpbmUgQ0lGU19BQ0xfREFDTCAgNAorI2RlZmluZSBDSUZTX0FDTF9TQUNMICA4CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb25fcXNlY19yZXEgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsgICAgIC8qIHdjdCA9IDE5ICovCisJX191OCBNYXhTZXR1cENvdW50OworCV9fdTE2IFJlc2VydmVkOworCV9fbGUzMiBUb3RhbFBhcmFtZXRlckNvdW50OworCV9fbGUzMiBUb3RhbERhdGFDb3VudDsKKwlfX2xlMzIgTWF4UGFyYW1ldGVyQ291bnQ7CisJX19sZTMyIE1heERhdGFDb3VudDsKKwlfX2xlMzIgUGFyYW1ldGVyQ291bnQ7CisJX19sZTMyIFBhcmFtZXRlck9mZnNldDsKKwlfX2xlMzIgRGF0YUNvdW50OworCV9fbGUzMiBEYXRhT2Zmc2V0OworCV9fdTggU2V0dXBDb3VudDsgLyogbm8gc2V0dXAgd29yZHMgZm9sbG93IHN1YmNvbW1hbmQgKi8KKwkvKiBTTklBIHNwZWMgaW5jb3JyZWN0bHkgaW5jbHVkZWQgc3B1cmlvdXMgcGFkIGhlcmUgKi8KKwlfX2xlMTYgU3ViQ29tbWFuZDsgLyogNiA9IFFVRVJZX1NFQ1VSSVRZX0RFU0MgKi8KKwlfX2xlMTYgQnl0ZUNvdW50OyAvKiBiY2MgPSAzICsgOCAqLworCV9fdTggUGFkWzNdOworCV9fdTE2IEZpZDsKKwlfX3UxNiBSZXNlcnZlZDI7CisJX19sZTMyIEFjbEZsYWdzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBRVUVSWV9TRUNfREVTQ19SRVE7CisKIHR5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb25fY2hhbmdlX25vdGlmeV9yZXEgewogCXN0cnVjdCBzbWJfaGRyIGhkcjsgICAgIC8qIHdjdCA9IDIzICovCiAJX191OCBNYXhTZXR1cENvdW50OwpAQCAtMTA2OCwxMCArMTEzNywxMiBAQAogCV9fdTggV2F0Y2hUcmVlOyAgLyogMSA9IE1vbml0b3Igc3ViZGlyZWN0b3JpZXMgKi8KIAlfX3U4IFJlc2VydmVkMjsKIAlfX2xlMTYgQnl0ZUNvdW50OwotLyogX191OCBQYWRbM107Ki8KKy8qIAlfX3U4IFBhZFszXTsqLwogLyoJX191OCBEYXRhWzFdOyovCiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIFRSQU5TQUNUX0NIQU5HRV9OT1RJRllfUkVROwogCisvKiBCQiBldmVudHVhbGx5IGNoYW5nZSB0byB1c2UgZ2VuZXJpYyBudHJhbnNhY3QgcnNwIHN0cnVjdCAKKyAgICAgIGFuZCB2YWxpZGF0aW9uIHJvdXRpbmUgKi8KIHR5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb25fY2hhbmdlX25vdGlmeV9yc3AgewogCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTggKi8KIAlfX3U4IFJlc2VydmVkWzNdOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzcHJvdG8uaCBiL2ZzL2NpZnMvY2lmc3Byb3RvLmgKaW5kZXggMWI3M2Y0Zi4uM2MwM2FhZCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzcHJvdG8uaAorKysgYi9mcy9jaWZzL2NpZnNwcm90by5oCkBAIC00OCw4ICs0OCw4IEBACiAJCQlzdHJ1Y3Qgc21iX2hkciAqIC8qIG91dCAqLyAsCiAJCQlpbnQgKiAvKiBieXRlcyByZXR1cm5lZCAqLyAsIGNvbnN0IGludCBsb25nX29wKTsKIGV4dGVybiBpbnQgU2VuZFJlY2VpdmUyKGNvbnN0IHVuc2lnbmVkIGludCAvKiB4aWQgKi8gLCBzdHJ1Y3QgY2lmc1Nlc0luZm8gKiwKLQkJCXN0cnVjdCBrdmVjICosIGludCAvKiBudmVjICovLAotCQkJaW50ICogLyogYnl0ZXMgcmV0dXJuZWQgKi8gLCBjb25zdCBpbnQgbG9uZ19vcCk7CisJCQlzdHJ1Y3Qga3ZlYyAqLCBpbnQgLyogbnZlYyB0byBzZW5kICovLCAKKwkJCWludCAqIC8qIHR5cGUgb2YgYnVmIHJldHVybmVkICovICwgY29uc3QgaW50IGxvbmdfb3ApOwogZXh0ZXJuIGludCBjaGVja1NNQmhkcihzdHJ1Y3Qgc21iX2hkciAqc21iLCBfX3UxNiBtaWQpOwogZXh0ZXJuIGludCBjaGVja1NNQihzdHJ1Y3Qgc21iX2hkciAqc21iLCBfX3UxNiBtaWQsIGludCBsZW5ndGgpOwogZXh0ZXJuIGludCBpc192YWxpZF9vcGxvY2tfYnJlYWsoc3RydWN0IHNtYl9oZHIgKnNtYik7CkBAIC05MywxMSArOTMsMTIgQEAKIAkJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKik7CiAKIGV4dGVybiBpbnQgQ0lGU0ZpbmRGaXJzdChjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAotICAgICAgICAgICAgY29uc3QgY2hhciAqc2VhcmNoTmFtZSwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlLAotICAgICAgICAgICAgX191MTYgKnNlYXJjaEhhbmRsZSwgc3RydWN0IGNpZnNfc2VhcmNoX2luZm8gKiBwc3JjaF9pbmYsIGludCBtYXAsIGNvbnN0IGNoYXIgZGlyc2VwKTsKKwkJY29uc3QgY2hhciAqc2VhcmNoTmFtZSwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlLAorCQlfX3UxNiAqc2VhcmNoSGFuZGxlLCBzdHJ1Y3QgY2lmc19zZWFyY2hfaW5mbyAqIHBzcmNoX2luZiwgCisJCWludCBtYXAsIGNvbnN0IGNoYXIgZGlyc2VwKTsKIAogZXh0ZXJuIGludCBDSUZTRmluZE5leHQoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKLSAgICAgICAgICAgIF9fdTE2IHNlYXJjaEhhbmRsZSwgc3RydWN0IGNpZnNfc2VhcmNoX2luZm8gKiBwc3JjaF9pbmYpOworCQlfX3UxNiBzZWFyY2hIYW5kbGUsIHN0cnVjdCBjaWZzX3NlYXJjaF9pbmZvICogcHNyY2hfaW5mKTsKIAogZXh0ZXJuIGludCBDSUZTRmluZENsb3NlKGNvbnN0IGludCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKIAkJCWNvbnN0IF9fdTE2IHNlYXJjaF9oYW5kbGUpOwpAQCAtMjMwLDE5ICsyMzEsMTggQEAKIAkJCWNvbnN0IGludCBzbWJfZmlsZV9pZCk7CiAKIGV4dGVybiBpbnQgQ0lGU1NNQlJlYWQoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKLQkJCWNvbnN0IGludCBuZXRmaWQsIHVuc2lnbmVkIGludCBjb3VudCwKLQkJCWNvbnN0IF9fdTY0IGxzZWVrLCB1bnNpZ25lZCBpbnQgKm5ieXRlcywgY2hhciAqKmJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbmV0ZmlkLCB1bnNpZ25lZCBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX3U2NCBsc2VlaywgdW5zaWduZWQgaW50ICpuYnl0ZXMsIGNoYXIgKipidWYsCisJCQlpbnQgKiByZXR1cm5fYnVmX3R5cGUpOwogZXh0ZXJuIGludCBDSUZTU01CV3JpdGUoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKIAkJCWNvbnN0IGludCBuZXRmaWQsIGNvbnN0IHVuc2lnbmVkIGludCBjb3VudCwKIAkJCWNvbnN0IF9fdTY0IGxzZWVrLCB1bnNpZ25lZCBpbnQgKm5ieXRlcywKIAkJCWNvbnN0IGNoYXIgKmJ1ZiwgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsIAogCQkJY29uc3QgaW50IGxvbmdfb3ApOwotI2lmZGVmIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTAogZXh0ZXJuIGludCBDSUZTU01CV3JpdGUyKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCiAJCQljb25zdCBpbnQgbmV0ZmlkLCBjb25zdCB1bnNpZ25lZCBpbnQgY291bnQsCiAJCQljb25zdCBfX3U2NCBvZmZzZXQsIHVuc2lnbmVkIGludCAqbmJ5dGVzLCAKIAkJCXN0cnVjdCBrdmVjICppb3YsIGNvbnN0IGludCBudmVjLCBjb25zdCBpbnQgbG9uZ19vcCk7Ci0jZW5kaWYgLyogQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMICovCiBleHRlcm4gaW50IENJRlNHZXRTcnZJbm9kZU51bWJlcihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAogCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2VhcmNoTmFtZSwgX191NjQgKiBpbm9kZV9udW1iZXIsCiAJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UsIApAQCAtMjY5LDYgKzI2OSw4IEBACiBleHRlcm4gaW50IGNpZnNfcmVjb25uZWN0KHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlcik7CiAKIGV4dGVybiBpbnQgY2lmc19zaWduX3NtYihzdHJ1Y3Qgc21iX2hkciAqLCBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICosX191MzIgKik7CitleHRlcm4gaW50IGNpZnNfc2lnbl9zbWIyKHN0cnVjdCBrdmVjICppb3YsIGludCBuX3ZlYywgc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqLAorCQkJICBfX3UzMiAqKTsKIGV4dGVybiBpbnQgY2lmc192ZXJpZnlfc2lnbmF0dXJlKHN0cnVjdCBzbWJfaGRyICosIGNvbnN0IGNoYXIgKiBtYWNfa2V5LAogCV9fdTMyIGV4cGVjdGVkX3NlcXVlbmNlX251bWJlcik7CiBleHRlcm4gaW50IGNpZnNfY2FsY3VsYXRlX21hY19rZXkoY2hhciAqIGtleSxjb25zdCBjaGFyICogcm4sY29uc3QgY2hhciAqIHBhc3MpOwpAQCAtMjk3LDYgKzI5OSw5IEBACiAJCWNvbnN0IGNoYXIgKmZpbGVOYW1lLCBjb25zdCBjaGFyICogZWFfbmFtZSwgCiAJCWNvbnN0IHZvaWQgKiBlYV92YWx1ZSwgY29uc3QgX191MTYgZWFfdmFsdWVfbGVuLCAKIAkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlLCBpbnQgcmVtYXBfc3BlY2lhbF9jaGFycyk7CitleHRlcm4gaW50IENJRlNTTUJHZXRDSUZTQUNMKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCQlfX3UxNiBmaWQsIGNoYXIgKmFjbF9pbmYsIGNvbnN0IGludCBidWZsZW4sCisJCQljb25zdCBpbnQgYWNsX3R5cGUgLyogQUNDRVNTIHZzLiBERUZBVUxUICovKTsKIGV4dGVybiBpbnQgQ0lGU1NNQkdldFBvc2l4QUNMKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCiAJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlYXJjaE5hbWUsCiAJCWNoYXIgKmFjbF9pbmYsIGNvbnN0IGludCBidWZsZW4sY29uc3QgaW50IGFjbF90eXBlLApkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzc21iLmMgYi9mcy9jaWZzL2NpZnNzbWIuYwppbmRleCA2ODY3ZTU1Li4yMTczMjNiIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNzbWIuYworKysgYi9mcy9jaWZzL2NpZnNzbWIuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgImNpZnNwcm90by5oIgogI2luY2x1ZGUgImNpZnNfdW5pY29kZS5oIgogI2luY2x1ZGUgImNpZnNfZGVidWcuaCIKKyNpbmNsdWRlICJjaWZzYWNsLmgiCiAKICNpZmRlZiBDT05GSUdfQ0lGU19QT1NJWAogc3RhdGljIHN0cnVjdCB7CkBAIC0zNzIsOCArMzczLDEwIEBACiAJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCiAJCQkgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOwogCWlmIChyYyA9PSAwKSB7Ci0JCXNlcnZlci0+c2VjTW9kZSA9IHBTTUJyLT5TZWN1cml0eU1vZGU7CQotCQlzZXJ2ZXItPnNlY1R5cGUgPSBOVExNOyAvKiBCQiBvdmVycmlkZSBkZWZhdWx0IGZvciAKKwkJc2VydmVyLT5zZWNNb2RlID0gcFNNQnItPlNlY3VyaXR5TW9kZTsKKwkJaWYoKHNlcnZlci0+c2VjTW9kZSAmIFNFQ01PREVfVVNFUikgPT0gMCkKKwkJCWNGWUkoMSwoInNoYXJlIG1vZGUgc2VjdXJpdHkiKSk7CisJCXNlcnZlci0+c2VjVHlwZSA9IE5UTE07IC8qIEJCIG92ZXJyaWRlIGRlZmF1bHQgZm9yCiAJCQkJCSAgIE5UTE12MiBvciBrZXJiZXJvcyB2NSAqLwogCQkvKiBvbmUgYnl0ZSAtIG5vIG5lZWQgdG8gY29udmVydCB0aGlzIG9yIEVuY3J5cHRpb25LZXlMZW4KIAkJICAgZnJvbSBsaXR0bGUgZW5kaWFuICovCkBAIC0zODMsNyArMzg2LDcgQEAKIAkJCW1pbihsZTMyX3RvX2NwdShwU01Cci0+TWF4QnVmZmVyU2l6ZSksCiAJCQkoX191MzIpIENJRlNNYXhCdWZTaXplICsgTUFYX0NJRlNfSERSX1NJWkUpOwogCQlzZXJ2ZXItPm1heFJ3ID0gbGUzMl90b19jcHUocFNNQnItPk1heFJhd1NpemUpOwotCQljRllJKDAsICgiTWF4IGJ1ZiA9ICVkICIsIHNlcy0+c2VydmVyLT5tYXhCdWYpKTsKKwkJY0ZZSSgwLCAoIk1heCBidWYgPSAlZCIsIHNlcy0+c2VydmVyLT5tYXhCdWYpKTsKIAkJR0VUVTMyKHNlcy0+c2VydmVyLT5zZXNzaWQpID0gbGUzMl90b19jcHUocFNNQnItPlNlc3Npb25LZXkpOwogCQlzZXJ2ZXItPmNhcGFiaWxpdGllcyA9IGxlMzJfdG9fY3B1KHBTTUJyLT5DYXBhYmlsaXRpZXMpOwogCQlzZXJ2ZXItPnRpbWVab25lID0gbGUxNl90b19jcHUocFNNQnItPlNlcnZlclRpbWVab25lKTsJCkBAIC00MTEsOCArNDE0LDcgQEAKIAkJCQkJCShzZXJ2ZXItPnNlcnZlcl9HVUlELAogCQkJCQkJcFNNQnItPnUuZXh0ZW5kZWRfcmVzcG9uc2UuCiAJCQkJCQlHVUlELCAxNikgIT0gMCkgewotCQkJCQkJY0ZZSSgxLAotCQkJCQkJICAgICAoIlVJRCBvZiBzZXJ2ZXIgZG9lcyBub3QgbWF0Y2ggcHJldmlvdXMgY29ubmVjdGlvbiB0byBzYW1lIGlwIGFkZHJlc3MiKSk7CisJCQkJCQljRllJKDEsICgic2VydmVyIFVJRCBjaGFuZ2VkIikpOwogCQkJCQkJbWVtY3B5KHNlcnZlci0+CiAJCQkJCQkJc2VydmVyX0dVSUQsCiAJCQkJCQkJcFNNQnItPnUuCkBAIC05NTgsMjEgKzk2MCwxOSBAQAogCXJldHVybiByYzsKIH0KIAotLyogSWYgbm8gYnVmZmVyIHBhc3NlZCBpbiwgdGhlbiBjYWxsZXIgd2FudHMgdG8gZG8gdGhlIGNvcHkKLQlhcyBpbiB0aGUgY2FzZSBvZiByZWFkcGFnZXMgc28gdGhlIFNNQiBidWZmZXIgbXVzdCBiZQotCWZyZWVkIGJ5IHRoZSBjYWxsZXIgKi8KLQogaW50CiBDSUZTU01CUmVhZChjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAotCSAgICBjb25zdCBpbnQgbmV0ZmlkLCBjb25zdCB1bnNpZ25lZCBpbnQgY291bnQsCi0JICAgIGNvbnN0IF9fdTY0IGxzZWVrLCB1bnNpZ25lZCBpbnQgKm5ieXRlcywgY2hhciAqKmJ1ZikKKyAgICAgICAgICAgIGNvbnN0IGludCBuZXRmaWQsIGNvbnN0IHVuc2lnbmVkIGludCBjb3VudCwKKyAgICAgICAgICAgIGNvbnN0IF9fdTY0IGxzZWVrLCB1bnNpZ25lZCBpbnQgKm5ieXRlcywgY2hhciAqKmJ1ZiwKKwkgICAgaW50ICogcGJ1Zl90eXBlKQogewogCWludCByYyA9IC1FQUNDRVM7CiAJUkVBRF9SRVEgKnBTTUIgPSBOVUxMOwogCVJFQURfUlNQICpwU01CciA9IE5VTEw7CiAJY2hhciAqcFJlYWREYXRhID0gTlVMTDsKLQlpbnQgYnl0ZXNfcmV0dXJuZWQ7CiAJaW50IHdjdDsKKwlpbnQgcmVzcF9idWZfdHlwZSA9IDA7CisJc3RydWN0IGt2ZWMgaW92WzFdOwogCiAJY0ZZSSgxLCgiUmVhZGluZyAlZCBieXRlcyBvbiBmaWQgJWQiLGNvdW50LG5ldGZpZCkpOwogCWlmKHRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX0xBUkdFX0ZJTEVTKQpAQCAtOTgxLDggKzk4MSw3IEBACiAJCXdjdCA9IDEwOyAvKiBvbGQgc3R5bGUgcmVhZCAqLwogCiAJKm5ieXRlcyA9IDA7Ci0JcmMgPSBzbWJfaW5pdChTTUJfQ09NX1JFQURfQU5EWCwgd2N0LCB0Y29uLCAodm9pZCAqKikgJnBTTUIsCi0JCSAgICAgICh2b2lkICoqKSAmcFNNQnIpOworCXJjID0gc21hbGxfc21iX2luaXQoU01CX0NPTV9SRUFEX0FORFgsIHdjdCwgdGNvbiwgKHZvaWQgKiopICZwU01CKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApAQCAtOTkwLDEzICs5ODksMTMgQEAKIAlpZiAodGNvbi0+c2VzLT5zZXJ2ZXIgPT0gTlVMTCkKIAkJcmV0dXJuIC1FQ09OTkFCT1JURUQ7CiAKLQlwU01CLT5BbmRYQ29tbWFuZCA9IDB4RkY7CS8qIG5vbmUgKi8KKwlwU01CLT5BbmRYQ29tbWFuZCA9IDB4RkY7ICAgICAgIC8qIG5vbmUgKi8KIAlwU01CLT5GaWQgPSBuZXRmaWQ7CiAJcFNNQi0+T2Zmc2V0TG93ID0gY3B1X3RvX2xlMzIobHNlZWsgJiAweEZGRkZGRkZGKTsKIAlpZih3Y3QgPT0gMTIpCiAJCXBTTUItPk9mZnNldEhpZ2ggPSBjcHVfdG9fbGUzMihsc2VlayA+PiAzMik7Ci0gICAgICAgIGVsc2UgaWYoKGxzZWVrID4+IDMyKSA+IDApIC8qIGNhbiBub3QgaGFuZGxlIHRoaXMgYmlnIG9mZnNldCBmb3Igb2xkICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU87CisJZWxzZSBpZigobHNlZWsgPj4gMzIpID4gMCkgLyogY2FuIG5vdCBoYW5kbGUgdGhpcyBiaWcgb2Zmc2V0IGZvciBvbGQgKi8KKwkJcmV0dXJuIC1FSU87CiAKIAlwU01CLT5SZW1haW5pbmcgPSAwOwogCXBTTUItPk1heENvdW50ID0gY3B1X3RvX2xlMTYoY291bnQgJiAweEZGRkYpOwpAQCAtMTAwNSwxNCArMTAwNCwxOCBAQAogCQlwU01CLT5CeXRlQ291bnQgPSAwOyAgLyogbm8gbmVlZCB0byBkbyBsZSBjb252ZXJzaW9uIHNpbmNlIDAgKi8KIAllbHNlIHsKIAkJLyogb2xkIHN0eWxlIHJlYWQgKi8KLQkJc3RydWN0IHNtYl9jb21fcmVhZHhfcmVxICogcFNNQlcgPSAKKwkJc3RydWN0IHNtYl9jb21fcmVhZHhfcmVxICogcFNNQlcgPQogCQkJKHN0cnVjdCBzbWJfY29tX3JlYWR4X3JlcSAqKXBTTUI7Ci0JCXBTTUJXLT5CeXRlQ291bnQgPSAwOwkKKwkJcFNNQlctPkJ5dGVDb3VudCA9IDA7CiAJfQotCQotCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAotCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKworCWlvdlswXS5pb3ZfYmFzZSA9IChjaGFyICopcFNNQjsKKwlpb3ZbMF0uaW92X2xlbiA9IHBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArIDQ7CisJcmMgPSBTZW5kUmVjZWl2ZTIoeGlkLCB0Y29uLT5zZXMsIGlvdiwgCisJCQkgIDEgLyogbnVtIGlvdmVjcyAqLywKKwkJCSAgJnJlc3BfYnVmX3R5cGUsIDApOyAKIAljaWZzX3N0YXRzX2luYygmdGNvbi0+bnVtX3JlYWRzKTsKKwlwU01CciA9IChSRUFEX1JTUCAqKWlvdlswXS5pb3ZfYmFzZTsKIAlpZiAocmMpIHsKIAkJY0VSUk9SKDEsICgiU2VuZCBlcnJvciBpbiByZWFkID0gJWQiLCByYykpOwogCX0gZWxzZSB7CkBAIC0xMDIyLDMzICsxMDI1LDQzIEBACiAJCSpuYnl0ZXMgPSBkYXRhX2xlbmd0aDsKIAogCQkvKmNoZWNrIHRoYXQgRGF0YUxlbmd0aCB3b3VsZCBub3QgZ28gYmV5b25kIGVuZCBvZiBTTUIgKi8KLQkJaWYgKChkYXRhX2xlbmd0aCA+IENJRlNNYXhCdWZTaXplKSAKKwkJaWYgKChkYXRhX2xlbmd0aCA+IENJRlNNYXhCdWZTaXplKQogCQkJCXx8IChkYXRhX2xlbmd0aCA+IGNvdW50KSkgewogCQkJY0ZZSSgxLCgiYmFkIGxlbmd0aCAlZCBmb3IgY291bnQgJWQiLGRhdGFfbGVuZ3RoLGNvdW50KSk7CiAJCQlyYyA9IC1FSU87CiAJCQkqbmJ5dGVzID0gMDsKIAkJfSBlbHNlIHsKLQkJCXBSZWFkRGF0YSA9Ci0JCQkgICAgKGNoYXIgKikgKCZwU01Cci0+aGRyLlByb3RvY29sKSArCisJCQlwUmVhZERhdGEgPSAoY2hhciAqKSAoJnBTTUJyLT5oZHIuUHJvdG9jb2wpICsKIAkJCSAgICBsZTE2X3RvX2NwdShwU01Cci0+RGF0YU9mZnNldCk7Ci0vKgkJCWlmKHJjID0gY29weV90b191c2VyKGJ1ZiwgcFJlYWREYXRhLCBkYXRhX2xlbmd0aCkpIHsKLQkJCQljRVJST1IoMSwoIkZhdWx0aW5nIG9uIHJlYWQgcmMgPSAlZCIscmMpKTsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQl9Ki8gLyogY2FuIG5vdCB1c2UgY29weV90b191c2VyIHdoZW4gdXNpbmcgcGFnZSBjYWNoZSovCisvKiAgICAgICAgICAgICAgICAgICAgICBpZihyYyA9IGNvcHlfdG9fdXNlcihidWYsIHBSZWFkRGF0YSwgZGF0YV9sZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNFUlJPUigxLCgiRmF1bHRpbmcgb24gcmVhZCByYyA9ICVkIixyYykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9Ki8gLyogY2FuIG5vdCB1c2UgY29weV90b191c2VyIHdoZW4gdXNpbmcgcGFnZSBjYWNoZSovCiAJCQlpZigqYnVmKQotCQkJICAgIG1lbWNweSgqYnVmLHBSZWFkRGF0YSxkYXRhX2xlbmd0aCk7CisJCQkJbWVtY3B5KCpidWYscFJlYWREYXRhLGRhdGFfbGVuZ3RoKTsKIAkJfQogCX0KLQlpZigqYnVmKQotCQljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOwotCWVsc2UKLQkJKmJ1ZiA9IChjaGFyICopcFNNQjsKIAotCS8qIE5vdGU6IE9uIC1FQUdBSU4gZXJyb3Igb25seSBjYWxsZXIgY2FuIHJldHJ5IG9uIGhhbmRsZSBiYXNlZCBjYWxscyAKKwljaWZzX3NtYWxsX2J1Zl9yZWxlYXNlKHBTTUIpOworCWlmKCpidWYpIHsKKwkJaWYocmVzcF9idWZfdHlwZSA9PSBDSUZTX1NNQUxMX0JVRkZFUikKKwkJCWNpZnNfc21hbGxfYnVmX3JlbGVhc2UoaW92WzBdLmlvdl9iYXNlKTsKKwkJZWxzZSBpZihyZXNwX2J1Zl90eXBlID09IENJRlNfTEFSR0VfQlVGRkVSKQorCQkJY2lmc19idWZfcmVsZWFzZShpb3ZbMF0uaW92X2Jhc2UpOworCX0gZWxzZSAvKiByZXR1cm4gYnVmZmVyIHRvIGNhbGxlciB0byBmcmVlICovIC8qIEJCIEZJWE1FIGhvdyBkbyB3ZSB0ZWxsIGNhbGxlciBpZiBpdCBpcyBub3QgYSBsYXJnZSBidWZmZXIgKi8geworCQkqYnVmID0gaW92WzBdLmlvdl9iYXNlOworCQlpZihyZXNwX2J1Zl90eXBlID09IENJRlNfU01BTExfQlVGRkVSKQorCQkJKnBidWZfdHlwZSA9IENJRlNfU01BTExfQlVGRkVSOworCQllbHNlIGlmKHJlc3BfYnVmX3R5cGUgPT0gQ0lGU19MQVJHRV9CVUZGRVIpCisJCQkqcGJ1Zl90eXBlID0gQ0lGU19MQVJHRV9CVUZGRVI7CisJfQorCisJLyogTm90ZTogT24gLUVBR0FJTiBlcnJvciBvbmx5IGNhbGxlciBjYW4gcmV0cnkgb24gaGFuZGxlIGJhc2VkIGNhbGxzCiAJCXNpbmNlIGZpbGUgaGFuZGxlIHBhc3NlZCBpbiBubyBsb25nZXIgdmFsaWQgKi8KIAlyZXR1cm4gcmM7CiB9CiAKKwogaW50CiBDSUZTU01CV3JpdGUoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKIAkgICAgIGNvbnN0IGludCBuZXRmaWQsIGNvbnN0IHVuc2lnbmVkIGludCBjb3VudCwKQEAgLTExNTUsNyArMTE2OCw2IEBACiAJcmV0dXJuIHJjOwogfQogCi0jaWZkZWYgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMCiBpbnQKIENJRlNTTUJXcml0ZTIoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKIAkgICAgIGNvbnN0IGludCBuZXRmaWQsIGNvbnN0IHVuc2lnbmVkIGludCBjb3VudCwKQEAgLTExNjQsMTAgKzExNzYsMTAgQEAKIHsKIAlpbnQgcmMgPSAtRUFDQ0VTOwogCVdSSVRFX1JFUSAqcFNNQiA9IE5VTEw7Ci0JaW50IGJ5dGVzX3JldHVybmVkLCB3Y3Q7CisJaW50IHdjdDsKIAlpbnQgc21iX2hkcl9sZW47CisJaW50IHJlc3BfYnVmX3R5cGUgPSAwOwogCi0JLyogQkIgcmVtb3ZlbWUgQkIgKi8KIAljRllJKDEsKCJ3cml0ZTIgYXQgJWxsZCAlZCBieXRlcyIsIChsb25nIGxvbmcpb2Zmc2V0LCBjb3VudCkpOwogCiAJaWYodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfTEFSR0VfRklMRVMpCkBAIC0xMjEwLDIyICsxMjIyLDM0IEBACiAJCXBTTUJXLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihjb3VudCArIDUpOwogCX0KIAlpb3ZbMF0uaW92X2Jhc2UgPSBwU01COwotCWlvdlswXS5pb3ZfbGVuID0gc21iX2hkcl9sZW4gKyA0OworCWlmKHdjdCA9PSAxNCkKKwkJaW92WzBdLmlvdl9sZW4gPSBzbWJfaGRyX2xlbiArIDQ7CisJZWxzZSAvKiB3Y3QgPT0gMTIgcGFkIGJpZ2dlciBieSBmb3VyIGJ5dGVzICovCisJCWlvdlswXS5pb3ZfbGVuID0gc21iX2hkcl9sZW4gKyA4OworCQogCi0JcmMgPSBTZW5kUmVjZWl2ZTIoeGlkLCB0Y29uLT5zZXMsIGlvdiwgbl92ZWMgKyAxLCAmYnl0ZXNfcmV0dXJuZWQsCisJcmMgPSBTZW5kUmVjZWl2ZTIoeGlkLCB0Y29uLT5zZXMsIGlvdiwgbl92ZWMgKyAxLCAmcmVzcF9idWZfdHlwZSwKIAkJCSAgbG9uZ19vcCk7CiAJY2lmc19zdGF0c19pbmMoJnRjb24tPm51bV93cml0ZXMpOwogCWlmIChyYykgewogCQljRllJKDEsICgiU2VuZCBlcnJvciBXcml0ZTIgPSAlZCIsIHJjKSk7CiAJCSpuYnl0ZXMgPSAwOworCX0gZWxzZSBpZihyZXNwX2J1Zl90eXBlID09IDApIHsKKwkJLyogcHJlc3VtYWJseSB0aGlzIGNhbiBub3QgaGFwcGVuLCBidXQgYmVzdCB0byBiZSBzYWZlICovCisJCXJjID0gLUVJTzsKKwkJKm5ieXRlcyA9IDA7CiAJfSBlbHNlIHsKLQkJV1JJVEVfUlNQICogcFNNQnIgPSAoV1JJVEVfUlNQICopcFNNQjsKKwkJV1JJVEVfUlNQICogcFNNQnIgPSAoV1JJVEVfUlNQICopaW92WzBdLmlvdl9iYXNlOwogCQkqbmJ5dGVzID0gbGUxNl90b19jcHUocFNNQnItPkNvdW50SGlnaCk7CiAJCSpuYnl0ZXMgPSAoKm5ieXRlcykgPDwgMTY7CiAJCSpuYnl0ZXMgKz0gbGUxNl90b19jcHUocFNNQnItPkNvdW50KTsKLQl9CisJfSAKIAogCWNpZnNfc21hbGxfYnVmX3JlbGVhc2UocFNNQik7CisJaWYocmVzcF9idWZfdHlwZSA9PSBDSUZTX1NNQUxMX0JVRkZFUikKKwkJY2lmc19zbWFsbF9idWZfcmVsZWFzZShpb3ZbMF0uaW92X2Jhc2UpOworCWVsc2UgaWYocmVzcF9idWZfdHlwZSA9PSBDSUZTX0xBUkdFX0JVRkZFUikKKwkJY2lmc19idWZfcmVsZWFzZShpb3ZbMF0uaW92X2Jhc2UpOwogCiAJLyogTm90ZTogT24gLUVBR0FJTiBlcnJvciBvbmx5IGNhbGxlciBjYW4gcmV0cnkgb24gaGFuZGxlIGJhc2VkIGNhbGxzIAogCQlzaW5jZSBmaWxlIGhhbmRsZSBwYXNzZWQgaW4gbm8gbG9uZ2VyIHZhbGlkICovCkBAIC0xMjM0LDggKzEyNTgsNiBAQAogfQogCiAKLSNlbmRpZiAvKiBDSUZTX0VYUEVSSU1FTlRBTCAqLwotCiBpbnQKIENJRlNTTUJMb2NrKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCiAJICAgIGNvbnN0IF9fdTE2IHNtYl9maWxlX2lkLCBjb25zdCBfX3U2NCBsZW4sCkBAIC0xOTA2LDYgKzE5MjgsOTAgQEAKIAlyZXR1cm4gcmM7CiB9CiAKKy8qIEluaXRpYWxpemUgTlQgVFJBTlNBQ1QgU01CIGludG8gc21hbGwgc21iIHJlcXVlc3QgYnVmZmVyLgorICAgVGhpcyBhc3N1bWVzIHRoYXQgYWxsIE5UIFRSQU5TQUNUUyB0aGF0IHdlIGluaXQgaGVyZSBoYXZlCisgICB0b3RhbCBwYXJtIGFuZCBkYXRhIHVuZGVyIGFib3V0IDQwMCBieXRlcyAodG8gZml0IGluIHNtYWxsIGNpZnMKKyAgIGJ1ZmZlciBzaXplKSwgd2hpY2ggaXMgdGhlIGNhc2Ugc28gZmFyLCBpdCBlYXNpbHkgZml0cy4gTkI6CisJU2V0dXAgd29yZHMgdGhlbXNlbHZlcyBhbmQgQnl0ZUNvdW50CisJTWF4U2V0dXBDb3VudCAoc2l6ZSBvZiByZXR1cm5lZCBzZXR1cCBhcmVhKSBhbmQKKwlNYXhQYXJhbWV0ZXJDb3VudCAocmV0dXJuZWQgcGFybXMgc2l6ZSkgbXVzdCBiZSBzZXQgYnkgY2FsbGVyICovCitzdGF0aWMgaW50IAorc21iX2luaXRfbnRyYW5zYWN0KGNvbnN0IF9fdTE2IHN1Yl9jb21tYW5kLCBjb25zdCBpbnQgc2V0dXBfY291bnQsCisJCSAgIGNvbnN0IGludCBwYXJtX2xlbiwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJICAgdm9pZCAqKiByZXRfYnVmKQoreworCWludCByYzsKKwlfX3UzMiB0ZW1wX29mZnNldDsKKwlzdHJ1Y3Qgc21iX2NvbV9udHJhbnNhY3RfcmVxICogcFNNQjsKKworCXJjID0gc21hbGxfc21iX2luaXQoU01CX0NPTV9OVF9UUkFOU0FDVCwgMTkgKyBzZXR1cF9jb3VudCwgdGNvbiwKKwkJCQkodm9pZCAqKikmcFNNQik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJKnJldF9idWYgPSAodm9pZCAqKXBTTUI7CisJcFNNQi0+UmVzZXJ2ZWQgPSAwOworCXBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUzMihwYXJtX2xlbik7CisJcFNNQi0+VG90YWxEYXRhQ291bnQgID0gMDsKKwlwU01CLT5NYXhEYXRhQ291bnQgPSBjcHVfdG9fbGUzMigodGNvbi0+c2VzLT5zZXJ2ZXItPm1heEJ1ZiAtCisJCQkJCSAgTUFYX0NJRlNfSERSX1NJWkUpICYgMHhGRkZGRkYwMCk7CisJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50OworCXBTTUItPkRhdGFDb3VudCAgPSBwU01CLT5Ub3RhbERhdGFDb3VudDsKKwl0ZW1wX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzbWJfY29tX250cmFuc2FjdF9yZXEsIFBhcm1zKSArCisJCQkoc2V0dXBfY291bnQgKiAyKSAtIDQgLyogZm9yIHJmYzEwMDEgbGVuZ3RoIGl0c2VsZiAqLzsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUzMih0ZW1wX29mZnNldCk7CisJcFNNQi0+RGF0YU9mZnNldCA9IGNwdV90b19sZTMyKHRlbXBfb2Zmc2V0ICsgcGFybV9sZW4pOworCXBTTUItPlNldHVwQ291bnQgPSBzZXR1cF9jb3VudDsgLyogbm8gbmVlZCB0byBsZSBjb252ZXJ0IGJ5dGUgZmllbGRzICovCisJcFNNQi0+U3ViQ29tbWFuZCA9IGNwdV90b19sZTE2KHN1Yl9jb21tYW5kKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordmFsaWRhdGVfbnRyYW5zYWN0KGNoYXIgKiBidWYsIGNoYXIgKiogcHBwYXJtLCBjaGFyICoqIHBwZGF0YSwKKwkJICAgaW50ICogcGRhdGFsZW4sIGludCAqIHBwYXJtbGVuKQoreworCWNoYXIgKiBlbmRfb2Zfc21iOworCV9fdTMyIGRhdGFfY291bnQsIGRhdGFfb2Zmc2V0LCBwYXJtX2NvdW50LCBwYXJtX29mZnNldDsKKwlzdHJ1Y3Qgc21iX2NvbV9udHJhbnNhY3RfcnNwICogcFNNQnI7CisKKwlpZihidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwU01CciA9IChzdHJ1Y3Qgc21iX2NvbV9udHJhbnNhY3RfcnNwICopYnVmOworCisJLyogQnl0ZUNvdW50IHdhcyBjb252ZXJ0ZWQgZnJvbSBsaXR0bGUgZW5kaWFuIGluIFNlbmRSZWNlaXZlICovCisJZW5kX29mX3NtYiA9IDIgLyogc2l6ZW9mIGJ5dGUgY291bnQgKi8gKyBwU01Cci0+Qnl0ZUNvdW50ICsgCisJCQkoY2hhciAqKSZwU01Cci0+Qnl0ZUNvdW50OworCisJCQorCWRhdGFfb2Zmc2V0ID0gbGUzMl90b19jcHUocFNNQnItPkRhdGFPZmZzZXQpOworCWRhdGFfY291bnQgPSBsZTMyX3RvX2NwdShwU01Cci0+RGF0YUNvdW50KTsKKyAgICAgICAgcGFybV9vZmZzZXQgPSBsZTMyX3RvX2NwdShwU01Cci0+UGFyYW1ldGVyT2Zmc2V0KTsKKwlwYXJtX2NvdW50ID0gbGUzMl90b19jcHUocFNNQnItPlBhcmFtZXRlckNvdW50KTsKKworCSpwcHBhcm0gPSAoY2hhciAqKSZwU01Cci0+aGRyLlByb3RvY29sICsgcGFybV9vZmZzZXQ7CisJKnBwZGF0YSA9IChjaGFyICopJnBTTUJyLT5oZHIuUHJvdG9jb2wgKyBkYXRhX29mZnNldDsKKworCS8qIHNob3VsZCB3ZSBhbHNvIGNoZWNrIHRoYXQgcGFybSBhbmQgZGF0YSBhcmVhcyBkbyBub3Qgb3ZlcmxhcD8gKi8KKwlpZigqcHBwYXJtID4gZW5kX29mX3NtYikgeworCQljRllJKDEsKCJwYXJtcyBzdGFydCBhZnRlciBlbmQgb2Ygc21iIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYocGFybV9jb3VudCArICpwcHBhcm0gPiBlbmRfb2Zfc21iKSB7CisJCWNGWUkoMSwoInBhcm0gZW5kIGFmdGVyIGVuZCBvZiBzbWIiKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZigqcHBkYXRhID4gZW5kX29mX3NtYikgeworCQljRllJKDEsKCJkYXRhIHN0YXJ0cyBhZnRlciBlbmQgb2Ygc21iIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYoZGF0YV9jb3VudCArICpwcGRhdGEgPiBlbmRfb2Zfc21iKSB7CisJCWNGWUkoMSwoImRhdGEgJXAgKyBjb3VudCAlZCAoJXApIGVuZHMgYWZ0ZXIgZW5kIG9mIHNtYiAlcCBzdGFydCAlcCIsCisJCQkqcHBkYXRhLCBkYXRhX2NvdW50LCAoZGF0YV9jb3VudCArICpwcGRhdGEpLCBlbmRfb2Zfc21iLCBwU01CcikpOyAgLyogQkIgRklYTUUgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmKHBhcm1fY291bnQgKyBkYXRhX2NvdW50ID4gcFNNQnItPkJ5dGVDb3VudCkgeworCQljRllJKDEsKCJwYXJtIGNvdW50IGFuZCBkYXRhIGNvdW50IGxhcmdlciB0aGFuIFNNQiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCiBpbnQKIENJRlNTTUJRdWVyeVJlcGFyc2VMaW5rSW5mbyhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAogCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2VhcmNoTmFtZSwKQEAgLTE5MjgsNyArMjAzNCw4IEBACiAJcFNNQi0+VG90YWxEYXRhQ291bnQgPSAwOwogCXBTTUItPk1heFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMzIoMik7CiAJLyogQkIgZmluZCBleGFjdCBkYXRhIGNvdW50IG1heCBmcm9tIHNlc3Mgc3RydWN0dXJlIEJCICovCi0JcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMzIoNDAwMCk7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMzIoKHRjb24tPnNlcy0+c2VydmVyLT5tYXhCdWYgLQorCQkJCQkgIE1BWF9DSUZTX0hEUl9TSVpFKSAmIDB4RkZGRkZGMDApOwogCXBTTUItPk1heFNldHVwQ291bnQgPSA0OwogCXBTTUItPlJlc2VydmVkID0gMDsKIAlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSAwOwpAQCAtMTk1NSw3ICsyMDYyLDkgQEAKIAkJCXJjID0gLUVJTzsJLyogYmFkIHNtYiAqLwogCQllbHNlIHsKIAkJCWlmKGRhdGFfY291bnQgJiYgKGRhdGFfY291bnQgPCAyMDQ4KSkgewotCQkJCWNoYXIgKiBlbmRfb2Zfc21iID0gcFNNQnItPkJ5dGVDb3VudCArIChjaGFyICopJnBTTUJyLT5CeXRlQ291bnQ7CisJCQkJY2hhciAqIGVuZF9vZl9zbWIgPSAyIC8qIHNpemVvZiBieXRlIGNvdW50ICovICsKKwkJCQkJCXBTTUJyLT5CeXRlQ291bnQgKworCQkJCQkJKGNoYXIgKikmcFNNQnItPkJ5dGVDb3VudDsKIAogCQkJCXN0cnVjdCByZXBhcnNlX2RhdGEgKiByZXBhcnNlX2J1ZiA9IChzdHJ1Y3QgcmVwYXJzZV9kYXRhICopCiAJCQkJCSgoY2hhciAqKSZwU01Cci0+aGRyLlByb3RvY29sICsgZGF0YV9vZmZzZXQpOwpAQCAtMjE5OSw2ICsyMzA4LDcgQEAKIAogCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAogCQkoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJY2lmc19zdGF0c19pbmMoJnRjb24tPm51bV9hY2xfZ2V0KTsKIAlpZiAocmMpIHsKIAkJY0ZZSSgxLCAoIlNlbmQgZXJyb3IgaW4gUXVlcnkgUE9TSVggQUNMID0gJWQiLCByYykpOwogCX0gZWxzZSB7CkBAIC0yMzg2LDYgKzI0OTYsOTIgQEAKIAogI2VuZGlmIC8qIENPTkZJR19QT1NJWCAqLwogCisKKy8qIHNlY3VyaXR5IGlkIGZvciBldmVyeW9uZSAqLworY29uc3Qgc3RydWN0IGNpZnNfc2lkIHNpZF9ldmVyeW9uZSA9IHsxLCAxLCB7MCwgMCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwfX07CisvKiBncm91cCB1c2VycyAqLworY29uc3Qgc3RydWN0IGNpZnNfc2lkIHNpZF91c2VyID0gezEsIDIgLCB7MCwgMCwgMCwgMCwgMCwgNX0sIHszMiwgNTQ1LCAwLCAwfX07CisKKy8qIENvbnZlcnQgQ0lGUyBBQ0wgdG8gUE9TSVggZm9ybSAqLworc3RhdGljIGludCBwYXJzZV9zZWNfZGVzYyhzdHJ1Y3QgY2lmc19zaWQgKiBwc2VjX2Rlc2MsIGludCBhY2xfbGVuKQoreworCXJldHVybiAwOworfQorCisvKiBHZXQgU2VjdXJpdHkgRGVzY3JpcHRvciAoYnkgaGFuZGxlKSBmcm9tIHJlbW90ZSBzZXJ2ZXIgZm9yIGEgZmlsZSBvciBkaXIgKi8KK2ludAorQ0lGU1NNQkdldENJRlNBQ0woY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwgX191MTYgZmlkLAorICAgICAgICAgLyogIEJCIGZpeCB1cCByZXR1cm4gaW5mbyAqLyBjaGFyICphY2xfaW5mLCBjb25zdCBpbnQgYnVmbGVuLCAKKwkJICBjb25zdCBpbnQgYWNsX3R5cGUgLyogQUNDRVNTL0RFRkFVTFQgbm90IHN1cmUgaW1wbGljYXRpb24gKi8pCit7CisJaW50IHJjID0gMDsKKwlpbnQgYnVmX3R5cGUgPSAwOworCVFVRVJZX1NFQ19ERVNDX1JFUSAqIHBTTUI7CisJc3RydWN0IGt2ZWMgaW92WzFdOworCisJY0ZZSSgxLCAoIkdldENpZnNBQ0wiKSk7CisKKwlyYyA9IHNtYl9pbml0X250cmFuc2FjdChOVF9UUkFOU0FDVF9RVUVSWV9TRUNVUklUWV9ERVNDLCAwLCAKKwkJCTggLyogcGFybSBsZW4gKi8sIHRjb24sICh2b2lkICoqKSAmcFNNQik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTMyKDQpOworCS8qIEJCIFRFU1Qgd2l0aCBiaWcgYWNscyB0aGF0IG1pZ2h0IG5lZWQgdG8gYmUgZS5nLiBsYXJnZXIgdGhhbiAxNksgKi8KKwlwU01CLT5NYXhTZXR1cENvdW50ID0gMDsKKwlwU01CLT5GaWQgPSBmaWQ7IC8qIGZpbGUgaGFuZGxlIGFsd2F5cyBsZSAqLworCXBTTUItPkFjbEZsYWdzID0gY3B1X3RvX2xlMzIoQ0lGU19BQ0xfT1dORVIgfCBDSUZTX0FDTF9HUk9VUCB8CisJCQkJICAgICBDSUZTX0FDTF9EQUNMKTsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNigxMSk7IC8qIDMgYnl0ZXMgcGFkICsgOCBieXRlcyBwYXJtICovCisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IDExOworCWlvdlswXS5pb3ZfYmFzZSA9IChjaGFyICopcFNNQjsKKwlpb3ZbMF0uaW92X2xlbiA9IHBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArIDQ7CisKKwlyYyA9IFNlbmRSZWNlaXZlMih4aWQsIHRjb24tPnNlcywgaW92LCAxIC8qIG51bSBpb3ZlYyAqLywgJmJ1Zl90eXBlLCAwKTsKKwljaWZzX3N0YXRzX2luYygmdGNvbi0+bnVtX2FjbF9nZXQpOworCWlmIChyYykgeworCQljRllJKDEsICgiU2VuZCBlcnJvciBpbiBRdWVyeVNlY0Rlc2MgPSAlZCIsIHJjKSk7CisJfSBlbHNlIHsgICAgICAgICAgICAgICAgLyogZGVjb2RlIHJlc3BvbnNlICovCisJCXN0cnVjdCBjaWZzX3NpZCAqIHBzZWNfZGVzYzsKKwkJX19sZTMyICogcGFybTsKKwkJaW50IHBhcm1fbGVuOworCQlpbnQgZGF0YV9sZW47CisJCWludCBhY2xfbGVuOworCQlzdHJ1Y3Qgc21iX2NvbV9udHJhbnNhY3RfcnNwICogcFNNQnI7CisKKy8qIHZhbGlkYXRlX250dHJhbnNhY3QgKi8KKwkJcmMgPSB2YWxpZGF0ZV9udHJhbnNhY3QoaW92WzBdLmlvdl9iYXNlLCAoY2hhciAqKikmcGFybSwgCisJCQkJCShjaGFyICoqKSZwc2VjX2Rlc2MsCisJCQkJCSZwYXJtX2xlbiwgJmRhdGFfbGVuKTsKKwkJCisJCWlmKHJjKQorCQkJZ290byBxc2VjX291dDsKKwkJcFNNQnIgPSAoc3RydWN0IHNtYl9jb21fbnRyYW5zYWN0X3JzcCAqKWlvdlswXS5pb3ZfYmFzZTsKKworCQljRVJST1IoMSwoInNtYiAlcCBwYXJtICVwIGRhdGEgJXAiLHBTTUJyLHBhcm0scHNlY19kZXNjKSk7ICAvKiBCQiByZW1vdmVtZSBCQiAqLworCisJCWlmIChsZTMyX3RvX2NwdShwU01Cci0+UGFyYW1ldGVyQ291bnQpICE9IDQpIHsKKwkJCXJjID0gLUVJTzsgICAgICAvKiBiYWQgc21iICovCisJCQlnb3RvIHFzZWNfb3V0OworCQl9CisKKy8qIEJCIGNoZWNrIHRoYXQgZGF0YSBhcmVhIGlzIG1pbmltdW0gbGVuZ3RoIGFuZCBhcyBiaWcgYXMgYWNsX2xlbiAqLworCisJCWFjbF9sZW4gPSBsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKXBhcm0pOworCQkvKiBCQiBjaGVjayBpZihhY2xfbGVuID4gYnVmc2l6ZSkgKi8KKworCQlwYXJzZV9zZWNfZGVzYyhwc2VjX2Rlc2MsIGFjbF9sZW4pOworCX0KK3FzZWNfb3V0OgorCWlmKGJ1Zl90eXBlID09IENJRlNfU01BTExfQlVGRkVSKQorCQljaWZzX3NtYWxsX2J1Zl9yZWxlYXNlKGlvdlswXS5pb3ZfYmFzZSk7CisJZWxzZSBpZihidWZfdHlwZSA9PSBDSUZTX0xBUkdFX0JVRkZFUikKKwkJY2lmc19idWZfcmVsZWFzZShpb3ZbMF0uaW92X2Jhc2UpOworCWNpZnNfc21hbGxfYnVmX3JlbGVhc2UocFNNQik7CisJcmV0dXJuIHJjOworfQorCisKIC8qIExlZ2FjeSBRdWVyeSBQYXRoIEluZm9ybWF0aW9uIGNhbGwgZm9yIGxvb2t1cCB0byBvbGQgc2VydmVycyBzdWNoCiAgICBhcyBXaW45eC9XaW5NRSAqLwogaW50IFNNQlF1ZXJ5SW5mb3JtYXRpb24oY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKQEAgLTQyODQsNyArNDQ4MCw3IEBACiB7CiAJaW50IHJjID0gMDsKIAlzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbl9jaGFuZ2Vfbm90aWZ5X3JlcSAqIHBTTUIgPSBOVUxMOwotCXN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uX2NoYW5nZV9ub3RpZnlfcnNwICogcFNNQnIgPSBOVUxMOworCXN0cnVjdCBzbWJfY29tX250cmFuc2FjdGlvbl9jaGFuZ2Vfbm90aWZ5X3JzcCAqIHBTTUJyID0gTlVMTDsKIAlzdHJ1Y3QgZGlyX25vdGlmeV9yZXEgKmRub3RpZnlfcmVxOwogCWludCBieXRlc19yZXR1cm5lZDsKIApAQCAtNDI5OSw2ICs0NDk1LDEwIEBACiAJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUzMigyKTsKIAkvKiBCQiBmaW5kIGV4YWN0IGRhdGEgY291bnQgbWF4IGZyb20gc2VzcyBzdHJ1Y3R1cmUgQkIgKi8KIAlwU01CLT5NYXhEYXRhQ291bnQgPSAwOyAvKiBzYW1lIGluIGxpdHRsZSBlbmRpYW4gb3IgYmUgKi8KKy8qIEJCIFZFUklGWSB2ZXJpZnkgd2hpY2ggaXMgY29ycmVjdCBmb3IgYWJvdmUgQkIgKi8KKwlwU01CLT5NYXhEYXRhQ291bnQgPSBjcHVfdG9fbGUzMigodGNvbi0+c2VzLT5zZXJ2ZXItPm1heEJ1ZiAtCisJCQkJCSAgICAgTUFYX0NJRlNfSERSX1NJWkUpICYgMHhGRkZGRkYwMCk7CisKIAlwU01CLT5NYXhTZXR1cENvdW50ID0gNDsKIAlwU01CLT5SZXNlcnZlZCA9IDA7CiAJcFNNQi0+UGFyYW1ldGVyT2Zmc2V0ID0gMDsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY29ubmVjdC5jIGIvZnMvY2lmcy9jb25uZWN0LmMKaW5kZXggYzQ2N2RlOC4uODhmNjBhYSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jb25uZWN0LmMKKysrIGIvZnMvY2lmcy9jb25uZWN0LmMKQEAgLTc2LDEyICs3NiwxOSBAQAogCXVuc2lnbmVkIHNldHVpZHM6MTsKIAl1bnNpZ25lZCBub3Blcm06MTsKIAl1bnNpZ25lZCBub19wc3hfYWNsOjE7IC8qIHNldCBpZiBwb3NpeCBhY2wgc3VwcG9ydCBzaG91bGQgYmUgZGlzYWJsZWQgKi8KKwl1bnNpZ25lZCBjaWZzX2FjbDoxOwogCXVuc2lnbmVkIG5vX3hhdHRyOjE7ICAgLyogc2V0IGlmIHhhdHRyIChFQSkgc3VwcG9ydCBzaG91bGQgYmUgZGlzYWJsZWQqLwogCXVuc2lnbmVkIHNlcnZlcl9pbm86MTsgLyogdXNlIGlub2RlIG51bWJlcnMgZnJvbSBzZXJ2ZXIgaWUgVW5pcXVlSWQgKi8KIAl1bnNpZ25lZCBkaXJlY3RfaW86MTsKIAl1bnNpZ25lZCByZW1hcDoxOyAgIC8qIHNldCB0byByZW1hcCBzZXZlbiByZXNlcnZlZCBjaGFycyBpbiBmaWxlbmFtZXMgKi8KIAl1bnNpZ25lZCBwb3NpeF9wYXRoczoxOyAgIC8qIHVuc2V0IHRvIG5vdCBhc2sgZm9yIHBvc2l4IHBhdGhuYW1lcy4gKi8KIAl1bnNpZ25lZCBzZnVfZW11bDoxOworCXVuc2lnbmVkIGtyYjU6MTsKKwl1bnNpZ25lZCBudGxtOjE7CisJdW5zaWduZWQgbnRsbXYyOjE7CisJdW5zaWduZWQgbnVsbGF1dGg6MTsgLyogYXR0ZW1wdCB0byBhdXRoZW50aWNhdGUgd2l0aCBudWxsIHVzZXIgKi8KKwl1bnNpZ25lZCBzaWduOjE7CisJdW5zaWduZWQgc2VhbDoxOyAgICAgLyogZW5jcnlwdCAqLwogCXVuc2lnbmVkIG5vY2FzZTsgICAgIC8qIHJlcXVlc3QgY2FzZSBpbnNlbnNpdGl2ZSBmaWxlbmFtZXMgKi8KIAl1bnNpZ25lZCBub2JybDsgICAgICAvKiBkaXNhYmxlIHNlbmRpbmcgYnl0ZSByYW5nZSBsb2NrcyB0byBzcnYgKi8KIAl1bnNpZ25lZCBpbnQgcnNpemU7CkBAIC01MDgsNyArNTE1LDcgQEAKIAkJLyogZWxzZSBsZW5ndGggb2sgKi8KIAkJcmVjb25uZWN0ID0gMDsKIAotCQlpZihwZHVfbGVuZ3RoID4gTUFYX0NJRlNfSERSX1NJWkUgLSA0KSB7CisJCWlmKHBkdV9sZW5ndGggPiBNQVhfQ0lGU19TTUFMTF9CVUZGRVJfU0laRSAtIDQpIHsKIAkJCWlzTGFyZ2VCdWYgPSBUUlVFOwogCQkJbWVtY3B5KGJpZ2J1Ziwgc21hbGxidWYsIDQpOwogCQkJc21iX2J1ZmZlciA9IGJpZ2J1ZjsKQEAgLTc3Nyw3ICs3ODQsNyBAQAogCiAJLyogdm9sLT5yZXRyeSBkZWZhdWx0IGlzIDAgKGkuZS4gInNvZnQiIGxpbWl0ZWQgcmV0cnkgbm90IGhhcmQgcmV0cnkpICovCiAJdm9sLT5ydyA9IFRSVUU7Ci0KKwl2b2wtPm50bG0gPSBUUlVFOwogCS8qIGRlZmF1bHQgaXMgYWx3YXlzIHRvIHJlcXVlc3QgcG9zaXggcGF0aHMuICovCiAJdm9sLT5wb3NpeF9wYXRocyA9IDE7CiAKQEAgLTkwMyw2ICs5MTAsMzkgQEAKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDSUZTOiBpcCBhZGRyZXNzIHRvbyBsb25nXG4iKTsKIAkJCQlyZXR1cm4gMTsKIAkJCX0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJzZWMiLCAzKSA9PSAwKSB7IAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKSB7CisJCQkJY0VSUk9SKDEsKCJubyBzZWN1cml0eSB2YWx1ZSBzcGVjaWZpZWQiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuaWNtcCh2YWx1ZSwgImtyYjVpIiwgNSkgPT0gMCkgeworCQkJCXZvbC0+c2lnbiA9IDE7CisJCQkJdm9sLT5rcmI1ID0gMTsKKwkJCX0gZWxzZSBpZiAoc3RybmljbXAodmFsdWUsICJrcmI1cCIsIDUpID09IDApIHsKKwkJCQkvKiB2b2wtPnNlYWwgPSAxOyAKKwkJCQkgICB2b2wtPmtyYjUgPSAxOyAqLworCQkJCWNFUlJPUigxLCgiS3JiNSBjaWZzIHByaXZhY3kgbm90IHN1cHBvcnRlZCIpKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0gZWxzZSBpZiAoc3RybmljbXAodmFsdWUsICJrcmI1IiwgNCkgPT0gMCkgeworCQkJCXZvbC0+a3JiNSA9IDE7CisJCQl9IGVsc2UgaWYgKHN0cm5pY21wKHZhbHVlLCAibnRsbXYyaSIsIDcpID09IDApIHsKKwkJCQl2b2wtPm50bG12MiA9IDE7CisJCQkJdm9sLT5zaWduID0gMTsKKwkJCX0gZWxzZSBpZiAoc3RybmljbXAodmFsdWUsICJudGxtdjIiLCA2KSA9PSAwKSB7CisJCQkJdm9sLT5udGxtdjIgPSAxOworCQkJfSBlbHNlIGlmIChzdHJuaWNtcCh2YWx1ZSwgIm50bG1pIiwgNSkgPT0gMCkgeworCQkJCXZvbC0+bnRsbSA9IDE7CisJCQkJdm9sLT5zaWduID0gMTsKKwkJCX0gZWxzZSBpZiAoc3RybmljbXAodmFsdWUsICJudGxtIiwgNCkgPT0gMCkgeworCQkJCS8qIG50bG0gaXMgZGVmYXVsdCBzbyBjYW4gYmUgdHVybmVkIG9mZiB0b28gKi8KKwkJCQl2b2wtPm50bG0gPSAxOworCQkJfSBlbHNlIGlmIChzdHJuaWNtcCh2YWx1ZSwgIm5vbnRsbSIsIDYpID09IDApIHsKKwkJCQl2b2wtPm50bG0gPSAwOworCQkJfSBlbHNlIGlmIChzdHJuaWNtcCh2YWx1ZSwgIm5vbmUiLCA0KSA9PSAwKSB7CisJCQkJdm9sLT5udWxsYXV0aCA9IDE7IAorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY0VSUk9SKDEsKCJiYWQgc2VjdXJpdHkgb3B0aW9uOiAlcyIsIHZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQogCQl9IGVsc2UgaWYgKChzdHJuaWNtcChkYXRhLCAidW5jIiwgMykgPT0gMCkKIAkJCSAgIHx8IChzdHJuaWNtcChkYXRhLCAidGFyZ2V0IiwgNikgPT0gMCkKIAkJCSAgIHx8IChzdHJuaWNtcChkYXRhLCAicGF0aCIsIDQpID09IDApKSB7CkBAIC0xMTIwLDYgKzExNjAsMTAgQEAKIAkJCXZvbC0+c2VydmVyX2lubyA9IDE7CiAJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgIm5vc2VydmVyaW5vIiw5KSA9PSAwKSB7CiAJCQl2b2wtPnNlcnZlcl9pbm8gPSAwOworCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJjaWZzYWNsIiw3KSA9PSAwKSB7CisJCQl2b2wtPmNpZnNfYWNsID0gMTsKKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAibm9jaWZzYWNsIiwgOSkgPT0gMCkgeworCQkJdm9sLT5jaWZzX2FjbCA9IDA7CiAJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgImFjbCIsMykgPT0gMCkgewogCQkJdm9sLT5ub19wc3hfYWNsID0gMDsKIAkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAibm9hY2wiLDUpID09IDApIHsKQEAgLTE1NDYsNyArMTU5MCw3IEBACiAJCWNGWUkoMSwgKCJVc2VybmFtZTogJXMgIiwgdm9sdW1lX2luZm8udXNlcm5hbWUpKTsKIAogCX0gZWxzZSB7Ci0JCWNpZnNlcnJvcigiTm8gdXNlcm5hbWUgc3BlY2lmaWVkICIpOworCQljaWZzZXJyb3IoIk5vIHVzZXJuYW1lIHNwZWNpZmllZCIpOwogICAgICAgICAvKiBJbiB1c2Vyc3BhY2UgbW91bnQgaGVscGVyIHdlIGNhbiBnZXQgdXNlciBuYW1lIGZyb20gYWx0ZXJuYXRlCiAgICAgICAgICAgIGxvY2F0aW9ucyBzdWNoIGFzIGVudiB2YXJpYWJsZXMgYW5kIGZpbGVzIG9uIGRpc2sgKi8KIAkJa2ZyZWUodm9sdW1lX2luZm8uVU5DKTsKQEAgLTE1ODcsNyArMTYzMSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0gZWxzZSAvKiB3aGljaCBzZXJ2ZXJzIERGUyByb290IHdvdWxkIHdlIGNvbmVjdCB0byAqLyB7CiAJCWNFUlJPUigxLAotCQkgICAgICAgKCJDSUZTIG1vdW50IGVycm9yOiBObyBVTkMgcGF0aCAoZS5nLiAtbyB1bmM9Ly8xOTIuMTY4LjEuMTAwL3B1YmxpYykgc3BlY2lmaWVkICAiKSk7CisJCSAgICAgICAoIkNJRlMgbW91bnQgZXJyb3I6IE5vIFVOQyBwYXRoIChlLmcuIC1vIHVuYz0vLzE5Mi4xNjguMS4xMDAvcHVibGljKSBzcGVjaWZpZWQiKSk7CiAJCWtmcmVlKHZvbHVtZV9pbmZvLlVOQyk7CiAJCWtmcmVlKHZvbHVtZV9pbmZvLnBhc3N3b3JkKTsKIAkJRnJlZVhpZCh4aWQpOwpAQCAtMTYyNiw3ICsxNjcwLDcgQEAKIAogCiAJaWYgKHNydlRjcCkgewotCQljRllJKDEsICgiRXhpc3RpbmcgdGNwIHNlc3Npb24gd2l0aCBzZXJ2ZXIgZm91bmQgIikpOyAgICAgICAgICAgICAgICAKKwkJY0ZZSSgxLCAoIkV4aXN0aW5nIHRjcCBzZXNzaW9uIHdpdGggc2VydmVyIGZvdW5kIikpOyAgICAgICAgICAgICAgICAKIAl9IGVsc2UgewkvKiBjcmVhdGUgc29ja2V0ICovCiAJCWlmKHZvbHVtZV9pbmZvLnBvcnQpCiAJCQlzaW5fc2VydmVyLnNpbl9wb3J0ID0gaHRvbnModm9sdW1lX2luZm8ucG9ydCk7CkBAIC0xNjg5LDExICsxNzMzLDExIEBACiAKIAlpZiAoZXhpc3RpbmdDaWZzU2VzKSB7CiAJCXBTZXNJbmZvID0gZXhpc3RpbmdDaWZzU2VzOwotCQljRllJKDEsICgiRXhpc3Rpbmcgc21iIHNlc3MgZm91bmQgIikpOworCQljRllJKDEsICgiRXhpc3Rpbmcgc21iIHNlc3MgZm91bmQiKSk7CiAJCWtmcmVlKHZvbHVtZV9pbmZvLnBhc3N3b3JkKTsKIAkJLyogdm9sdW1lX2luZm8uVU5DIGZyZWVkIGF0IGVuZCBvZiBmdW5jdGlvbiAqLwogCX0gZWxzZSBpZiAoIXJjKSB7Ci0JCWNGWUkoMSwgKCJFeGlzdGluZyBzbWIgc2VzcyBub3QgZm91bmQgIikpOworCQljRllJKDEsICgiRXhpc3Rpbmcgc21iIHNlc3Mgbm90IGZvdW5kIikpOwogCQlwU2VzSW5mbyA9IHNlc0luZm9BbGxvYygpOwogCQlpZiAocFNlc0luZm8gPT0gTlVMTCkKIAkJCXJjID0gLUVOT01FTTsKQEAgLTE3NTEsNyArMTc5NSw4IEBACiAJCWNpZnNfc2ItPm1udF9naWQgPSB2b2x1bWVfaW5mby5saW51eF9naWQ7CiAJCWNpZnNfc2ItPm1udF9maWxlX21vZGUgPSB2b2x1bWVfaW5mby5maWxlX21vZGU7CiAJCWNpZnNfc2ItPm1udF9kaXJfbW9kZSA9IHZvbHVtZV9pbmZvLmRpcl9tb2RlOwotCQljRllJKDEsKCJmaWxlIG1vZGU6IDB4JXggIGRpciBtb2RlOiAweCV4IixjaWZzX3NiLT5tbnRfZmlsZV9tb2RlLGNpZnNfc2ItPm1udF9kaXJfbW9kZSkpOworCQljRllJKDEsKCJmaWxlIG1vZGU6IDB4JXggIGRpciBtb2RlOiAweCV4IiwKKwkJCWNpZnNfc2ItPm1udF9maWxlX21vZGUsY2lmc19zYi0+bW50X2Rpcl9tb2RlKSk7CiAKIAkJaWYodm9sdW1lX2luZm8ubm9wZXJtKQogCQkJY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgfD0gQ0lGU19NT1VOVF9OT19QRVJNOwpAQCAtMTc2Nyw2ICsxODEyLDggQEAKIAkJCWNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzIHw9IENJRlNfTU9VTlRfVU5YX0VNVUw7CiAJCWlmKHZvbHVtZV9pbmZvLm5vYnJsKQogCQkJY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgfD0gQ0lGU19NT1VOVF9OT19CUkw7CisJCWlmKHZvbHVtZV9pbmZvLmNpZnNfYWNsKQorCQkJY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgfD0gQ0lGU19NT1VOVF9DSUZTX0FDTDsKIAogCQlpZih2b2x1bWVfaW5mby5kaXJlY3RfaW8pIHsKIAkJCWNGWUkoMSwoIm1vdW50aW5nIHNoYXJlIHVzaW5nIGRpcmVjdCBpL28iKSk7CkBAIC0xNzc3LDcgKzE4MjQsNyBAQAogCQkgICAgZmluZF91bmMoc2luX3NlcnZlci5zaW5fYWRkci5zX2FkZHIsIHZvbHVtZV9pbmZvLlVOQywKIAkJCSAgICAgdm9sdW1lX2luZm8udXNlcm5hbWUpOwogCQlpZiAodGNvbikgewotCQkJY0ZZSSgxLCAoIkZvdW5kIG1hdGNoIG9uIFVOQyBwYXRoICIpKTsKKwkJCWNGWUkoMSwgKCJGb3VuZCBtYXRjaCBvbiBVTkMgcGF0aCIpKTsKIAkJCS8qIHdlIGNhbiBoYXZlIG9ubHkgb25lIHJldHJ5IHZhbHVlIGZvciBhIGNvbm5lY3Rpb24KIAkJCSAgIHRvIGEgc2hhcmUgc28gZm9yIHJlc291cmNlcyBtb3VudGVkIG1vcmUgdGhhbiBvbmNlCiAJCQkgICB0byB0aGUgc2FtZSBzZXJ2ZXIgc2hhcmUgdGhlIGxhc3QgdmFsdWUgcGFzc2VkIGluIApAQCAtMTkyNiw3ICsxOTczLDcgQEAKIAlfX3UzMiBjYXBhYmlsaXRpZXM7CiAJX191MTYgY291bnQ7CiAKLQljRllJKDEsICgiSW4gc2Vzc3NldHVwICIpKTsKKwljRllJKDEsICgiSW4gc2Vzc3NldHVwIikpOwogCWlmKHNlcyA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAl1c2VyID0gc2VzLT51c2VyTmFtZTsKQEAgLTMyMDIsOSArMzI0OSwyNiBAQAogCiAJcFNNQi0+QW5kWENvbW1hbmQgPSAweEZGOwogCXBTTUItPkZsYWdzID0gY3B1X3RvX2xlMTYoVENPTl9FWFRFTkRFRF9TRUNJTkZPKTsKLQlwU01CLT5QYXNzd29yZExlbmd0aCA9IGNwdV90b19sZTE2KDEpOwkvKiBtaW5pbXVtICovCiAJYmNjX3B0ciA9ICZwU01CLT5QYXNzd29yZFswXTsKLQliY2NfcHRyKys7CQkvKiBza2lwIHBhc3N3b3JkICovCisJaWYoKHNlcy0+c2VydmVyLT5zZWNNb2RlKSAmIFNFQ01PREVfVVNFUikgeworCQlwU01CLT5QYXNzd29yZExlbmd0aCA9IGNwdV90b19sZTE2KDEpOwkvKiBtaW5pbXVtICovCisJCWJjY19wdHIrKzsgICAgICAgICAgICAgIC8qIHNraXAgcGFzc3dvcmQgKi8KKwl9IGVsc2UgeworCQlwU01CLT5QYXNzd29yZExlbmd0aCA9IGNwdV90b19sZTE2KENJRlNfU0VTU0lPTl9LRVlfU0laRSk7CisJCS8qIEJCIEZJWE1FIGFkZCBjb2RlIHRvIGZhaWwgdGhpcyBpZiBOVExNdjIgb3IgS2VyYmVyb3MKKwkJICAgc3BlY2lmaWVkIGFzIHJlcXVpcmVkICh3aGVuIHRoYXQgc3VwcG9ydCBpcyBhZGRlZCB0bworCQkgICB0aGUgdmZzIGluIHRoZSBmdXR1cmUpIGFzIG9ubHkgTlRMTSBvciB0aGUgbXVjaAorCQkgICB3ZWFrZXIgTEFOTUFOICh3aGljaCB3ZSBkbyBub3Qgc2VuZCkgaXMgYWNjZXB0ZWQKKwkJICAgYnkgU2FtYmEgKG5vdCBzdXJlIHdoZXRoZXIgb3RoZXIgc2VydmVycyBhbGxvdworCQkgICBOVExNdjIgcGFzc3dvcmQgaGVyZSkgKi8KKwkJU01CTlRlbmNyeXB0KHNlcy0+cGFzc3dvcmQsCisJCQkgICAgIHNlcy0+c2VydmVyLT5jcnlwdEtleSwKKwkJCSAgICAgYmNjX3B0cik7CisKKwkJYmNjX3B0ciArPSBDSUZTX1NFU1NJT05fS0VZX1NJWkU7CisJCSpiY2NfcHRyID0gMDsKKwkJYmNjX3B0cisrOyAvKiBhbGlnbiAqLworCX0KIAogCWlmKHNlcy0+c2VydmVyLT5zZWNNb2RlICYgKFNFQ01PREVfU0lHTl9SRVFVSVJFRCB8IFNFQ01PREVfU0lHTl9FTkFCTEVEKSkKIAkJc21iX2J1ZmZlci0+RmxhZ3MyIHw9IFNNQkZMRzJfU0VDVVJJVFlfU0lHTkFUVVJFOwpAQCAtMzIyMiw3ICszMjg2LDYgQEAKIAkJYmNjX3B0ciArPSAyICogbGVuZ3RoOwkvKiBjb252ZXJ0IG51bSBvZiAxNiBiaXQgd29yZHMgdG8gYnl0ZXMgKi8KIAkJYmNjX3B0ciArPSAyOwkvKiBza2lwIHRyYWlsaW5nIG51bGwgKi8KIAl9IGVsc2UgewkJLyogQVNDSUkgKi8KLQogCQlzdHJjcHkoYmNjX3B0ciwgdHJlZSk7CiAJCWJjY19wdHIgKz0gc3RybGVuKHRyZWUpICsgMTsKIAl9CmRpZmYgLS1naXQgYS9mcy9jaWZzL2Rpci5jIGIvZnMvY2lmcy9kaXIuYwppbmRleCAzMmNjOTZjLi5mZWQ1NWUzIDEwMDY0NAotLS0gYS9mcy9jaWZzL2Rpci5jCisrKyBiL2ZzL2NpZnMvZGlyLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogICB2ZnMgb3BlcmF0aW9ucyB0aGF0IGRlYWwgd2l0aCBkZW50cmllcwogICogCi0gKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDIsMjAwMworICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgIENvcnAuLCAyMDAyLDIwMDUKICAqICAgQXV0aG9yKHMpOiBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkKICAqCiAgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0yMDAsOCArMjAwLDggQEAKIAkJCShvcGxvY2sgJiBDSUZTX0NSRUFURV9BQ1RJT04pKQogCQkJaWYoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1NFVF9VSUQpIHsKIAkJCQlDSUZTU01CVW5peFNldFBlcm1zKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgbW9kZSwKLQkJCQkJKF9fdTY0KWN1cnJlbnQtPmV1aWQsCi0JCQkJCShfX3U2NCljdXJyZW50LT5lZ2lkLAorCQkJCQkoX191NjQpY3VycmVudC0+ZnN1aWQsCisJCQkJCShfX3U2NCljdXJyZW50LT5mc2dpZCwKIAkJCQkJMCAvKiBkZXYgKi8sCiAJCQkJCWNpZnNfc2ItPmxvY2FsX25scywgCiAJCQkJCWNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgCkBAIC0zMjUsNyArMzI1LDcgQEAKIAllbHNlIGlmIChwVGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkgewogCQlpZihjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfU0VUX1VJRCkgewogCQkJcmMgPSBDSUZTU01CVW5peFNldFBlcm1zKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwKLQkJCQltb2RlLChfX3U2NCljdXJyZW50LT5ldWlkLChfX3U2NCljdXJyZW50LT5lZ2lkLAorCQkJCW1vZGUsKF9fdTY0KWN1cnJlbnQtPmZzdWlkLChfX3U2NCljdXJyZW50LT5mc2dpZCwKIAkJCQlkZXZpY2VfbnVtYmVyLCBjaWZzX3NiLT5sb2NhbF9ubHMsCiAJCQkJY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiAKIAkJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9maWxlLmMgYi9mcy9jaWZzL2ZpbGUuYwppbmRleCAxNGExYzcyLi43N2M5OTBmMCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9maWxlLmMKKysrIGIvZnMvY2lmcy9maWxlLmMKQEAgLTEyNyw4ICsxMjcsNyBAQAogCQlpZiAoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZykgewogCQkvKiBCQiBubyBuZWVkIHRvIGxvY2sgaW5vZGUgdW50aWwgYWZ0ZXIgaW52YWxpZGF0ZQogCQkgICBzaW5jZSBuYW1laSBjb2RlIHNob3VsZCBhbHJlYWR5IGhhdmUgaXQgbG9ja2VkPyAqLwotCQkJZmlsZW1hcF9mZGF0YXdyaXRlKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcpOwotCQkJZmlsZW1hcF9mZGF0YXdhaXQoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZyk7CisJCQlmaWxlbWFwX3dyaXRlX2FuZF93YWl0KGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcpOwogCQl9CiAJCWNGWUkoMSwgKCJpbnZhbGlkYXRpbmcgcmVtb3RlIGlub2RlIHNpbmNlIG9wZW4gZGV0ZWN0ZWQgaXQgIgogCQkJICJjaGFuZ2VkIikpOwpAQCAtNDE5LDggKzQxOCw3IEBACiAJCXBDaWZzSW5vZGUgPSBDSUZTX0koaW5vZGUpOwogCQlpZiAocENpZnNJbm9kZSkgewogCQkJaWYgKGNhbl9mbHVzaCkgewotCQkJCWZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0+aV9tYXBwaW5nKTsKLQkJCQlmaWxlbWFwX2ZkYXRhd2FpdChpbm9kZS0+aV9tYXBwaW5nKTsKKwkJCQlmaWxlbWFwX3dyaXRlX2FuZF93YWl0KGlub2RlLT5pX21hcHBpbmcpOwogCQkJLyogdGVtcG9yYXJpbHkgZGlzYWJsZSBjYWNoaW5nIHdoaWxlIHdlCiAJCQkgICBnbyB0byBzZXJ2ZXIgdG8gZ2V0IGlub2RlIGluZm8gKi8KIAkJCQlwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZUFsbCA9IEZBTFNFOwpAQCAtNTU1LDEzICs1NTMsMTMgQEAKIAkJfQogCQlwdG1wID0gcENGaWxlU3RydWN0LT5zcmNoX2luZi5udHdya19idWZfc3RhcnQ7CiAJCWlmIChwdG1wKSB7Ci0gICAvKiBCQiByZW1vdmVtZSBCQiAqLwljRllJKDEsICgiZnJlZWluZyBzbWIgYnVmIGluIHNyY2ggc3RydWN0IGluIGNsb3NlZGlyIikpOworCQkJY0ZZSSgxLCAoImNsb3NlZGlyIGZyZWUgc21iIGJ1ZiBpbiBzcmNoIHN0cnVjdCIpKTsKIAkJCXBDRmlsZVN0cnVjdC0+c3JjaF9pbmYubnR3cmtfYnVmX3N0YXJ0ID0gTlVMTDsKIAkJCWNpZnNfYnVmX3JlbGVhc2UocHRtcCk7CiAJCX0KIAkJcHRtcCA9IHBDRmlsZVN0cnVjdC0+c2VhcmNoX3Jlc3VtZV9uYW1lOwogCQlpZiAocHRtcCkgewotICAgLyogQkIgcmVtb3ZlbWUgQkIgKi8JY0ZZSSgxLCAoImZyZWVpbmcgcmVzdW1lIG5hbWUgaW4gY2xvc2VkaXIiKSk7CisJCQljRllJKDEsICgiY2xvc2VkaXIgZnJlZSByZXN1bWUgbmFtZSIpKTsKIAkJCXBDRmlsZVN0cnVjdC0+c2VhcmNoX3Jlc3VtZV9uYW1lID0gTlVMTDsKIAkJCWtmcmVlKHB0bXApOwogCQl9CkBAIC04NzAsMTAgKzg2OCw5IEBACiAJCQkJaWYgKHJjICE9IDApCiAJCQkJCWJyZWFrOwogCQkJfQotI2lmZGVmIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTAogCQkJLyogQkIgRklYTUUgV2UgY2FuIG5vdCBzaWduIGFjcm9zcyB0d28gYnVmZmVycyB5ZXQgKi8KLQkJCWlmKChleHBlcmltRW5hYmxlZCkgJiYgKChwVGNvbi0+c2VzLT5zZXJ2ZXItPnNlY01vZGUgJiAKLQkJCSAoU0VDTU9ERV9TSUdOX1JFUVVJUkVEIHwgU0VDTU9ERV9TSUdOX0VOQUJMRUQpKSA9PSAwKSkgeworCQkJaWYoKHBUY29uLT5zZXMtPnNlcnZlci0+c2VjTW9kZSAmIAorCQkJIChTRUNNT0RFX1NJR05fUkVRVUlSRUQgfCBTRUNNT0RFX1NJR05fRU5BQkxFRCkpID09IDApIHsKIAkJCQlzdHJ1Y3Qga3ZlYyBpb3ZbMl07CiAJCQkJdW5zaWduZWQgaW50IGxlbjsKIApAQCAtODg5LDcgKzg4Niw2IEBACiAJCQkJCQlpb3YsIDEsIGxvbmdfb3ApOwogCQkJfSBlbHNlCiAJCQkvKiBCQiBGSVhNRSBmaXh1cCBpbmRlbnRhdGlvbiBvZiBsaW5lIGJlbG93ICovCi0jZW5kaWYJCQkKIAkJCXJjID0gQ0lGU1NNQldyaXRlKHhpZCwgcFRjb24sCiAJCQkJIG9wZW5fZmlsZS0+bmV0ZmlkLAogCQkJCSBtaW5fdChjb25zdCBpbnQsIGNpZnNfc2ItPndzaXplLCAKQEAgLTEwMjYsNyArMTAyMiw2IEBACiAJcmV0dXJuIHJjOwogfQogCi0jaWZkZWYgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMCiBzdGF0aWMgaW50IGNpZnNfd3JpdGVwYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJCSAgIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQogewpAQCAtMTIyOSw3ICsxMjI0LDYgQEAKIAogCXJldHVybiByYzsKIH0KLSNlbmRpZgogCiBzdGF0aWMgaW50IGNpZnNfd3JpdGVwYWdlKHN0cnVjdCBwYWdlKiBwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKIHsKQEAgLTE0MjgsNiArMTQyMiw3IEBACiAJCXJjID0gLUVBR0FJTjsKIAkJc21iX3JlYWRfZGF0YSA9IE5VTEw7CiAJCXdoaWxlIChyYyA9PSAtRUFHQUlOKSB7CisJCQlpbnQgYnVmX3R5cGUgPSBDSUZTX05PX0JVRkZFUjsKIAkJCWlmICgob3Blbl9maWxlLT5pbnZhbGlkSGFuZGxlKSAmJiAKIAkJCSAgICAoIW9wZW5fZmlsZS0+Y2xvc2VQZW5kKSkgewogCQkJCXJjID0gY2lmc19yZW9wZW5fZmlsZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwKQEAgLTE0MzYsMjAgKzE0MzEsMjIgQEAKIAkJCQkJYnJlYWs7CiAJCQl9CiAJCQlyYyA9IENJRlNTTUJSZWFkKHhpZCwgcFRjb24sCi0JCQkJCW9wZW5fZmlsZS0+bmV0ZmlkLAotCQkJCQljdXJyZW50X3JlYWRfc2l6ZSwgKnBvZmZzZXQsCi0JCQkJCSZieXRlc19yZWFkLCAmc21iX3JlYWRfZGF0YSk7CisJCQkJCSBvcGVuX2ZpbGUtPm5ldGZpZCwKKwkJCQkJIGN1cnJlbnRfcmVhZF9zaXplLCAqcG9mZnNldCwKKwkJCQkJICZieXRlc19yZWFkLCAmc21iX3JlYWRfZGF0YSwKKwkJCQkJICZidWZfdHlwZSk7CiAJCQlwU01CciA9IChzdHJ1Y3Qgc21iX2NvbV9yZWFkX3JzcCAqKXNtYl9yZWFkX2RhdGE7CiAJCQlpZiAoY29weV90b191c2VyKGN1cnJlbnRfb2Zmc2V0LCAKIAkJCQkJIHNtYl9yZWFkX2RhdGEgKyA0IC8qIFJGQzEwMDEgaGRyICovCiAJCQkJCSArIGxlMTZfdG9fY3B1KHBTTUJyLT5EYXRhT2Zmc2V0KSwgCiAJCQkJCSBieXRlc19yZWFkKSkgewogCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlGcmVlWGlkKHhpZCk7Ci0JCQkJcmV0dXJuIHJjOwotICAgICAgICAgICAgfQorCQkJfQogCQkJaWYgKHNtYl9yZWFkX2RhdGEpIHsKLQkJCQljaWZzX2J1Zl9yZWxlYXNlKHNtYl9yZWFkX2RhdGEpOworCQkJCWlmKGJ1Zl90eXBlID09IENJRlNfU01BTExfQlVGRkVSKQorCQkJCQljaWZzX3NtYWxsX2J1Zl9yZWxlYXNlKHNtYl9yZWFkX2RhdGEpOworCQkJCWVsc2UgaWYoYnVmX3R5cGUgPT0gQ0lGU19MQVJHRV9CVUZGRVIpCisJCQkJCWNpZnNfYnVmX3JlbGVhc2Uoc21iX3JlYWRfZGF0YSk7CiAJCQkJc21iX3JlYWRfZGF0YSA9IE5VTEw7CiAJCQl9CiAJCX0KQEAgLTE0ODIsNiArMTQ3OSw3IEBACiAJaW50IHhpZDsKIAljaGFyICpjdXJyZW50X29mZnNldDsKIAlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpvcGVuX2ZpbGU7CisJaW50IGJ1Zl90eXBlID0gQ0lGU19OT19CVUZGRVI7CiAKIAl4aWQgPSBHZXRYaWQoKTsKIAljaWZzX3NiID0gQ0lGU19TQihmaWxlLT5mX2RlbnRyeS0+ZF9zYik7CkBAIC0xNTE4LDkgKzE1MTYsMTAgQEAKIAkJCQkJYnJlYWs7CiAJCQl9CiAJCQlyYyA9IENJRlNTTUJSZWFkKHhpZCwgcFRjb24sCi0JCQkJCW9wZW5fZmlsZS0+bmV0ZmlkLAotCQkJCQljdXJyZW50X3JlYWRfc2l6ZSwgKnBvZmZzZXQsCi0JCQkJCSZieXRlc19yZWFkLCAmY3VycmVudF9vZmZzZXQpOworCQkJCQkgb3Blbl9maWxlLT5uZXRmaWQsCisJCQkJCSBjdXJyZW50X3JlYWRfc2l6ZSwgKnBvZmZzZXQsCisJCQkJCSAmYnl0ZXNfcmVhZCwgJmN1cnJlbnRfb2Zmc2V0LAorCQkJCQkgJmJ1Zl90eXBlKTsKIAkJfQogCQlpZiAocmMgfHwgKGJ5dGVzX3JlYWQgPT0gMCkpIHsKIAkJCWlmICh0b3RhbF9yZWFkKSB7CkBAIC0xNjE4LDYgKzE2MTcsNyBAQAogCXN0cnVjdCBzbWJfY29tX3JlYWRfcnNwICpwU01CcjsKIAlzdHJ1Y3QgcGFnZXZlYyBscnVfcHZlYzsKIAlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpvcGVuX2ZpbGU7CisJaW50IGJ1Zl90eXBlID0gQ0lGU19OT19CVUZGRVI7CiAKIAl4aWQgPSBHZXRYaWQoKTsKIAlpZiAoZmlsZS0+cHJpdmF0ZV9kYXRhID09IE5VTEwpIHsKQEAgLTE2NzQsMTQgKzE2NzQsMTcgQEAKIAkJCX0KIAogCQkJcmMgPSBDSUZTU01CUmVhZCh4aWQsIHBUY29uLAotCQkJCQlvcGVuX2ZpbGUtPm5ldGZpZCwKLQkJCQkJcmVhZF9zaXplLCBvZmZzZXQsCi0JCQkJCSZieXRlc19yZWFkLCAmc21iX3JlYWRfZGF0YSk7Ci0KKwkJCQkJIG9wZW5fZmlsZS0+bmV0ZmlkLAorCQkJCQkgcmVhZF9zaXplLCBvZmZzZXQsCisJCQkJCSAmYnl0ZXNfcmVhZCwgJnNtYl9yZWFkX2RhdGEsCisJCQkJCSAmYnVmX3R5cGUpOwogCQkJLyogQkIgbW9yZSBSQyBjaGVja3MgPyAqLwogCQkJaWYgKHJjPT0gLUVBR0FJTikgewogCQkJCWlmIChzbWJfcmVhZF9kYXRhKSB7Ci0JCQkJCWNpZnNfYnVmX3JlbGVhc2Uoc21iX3JlYWRfZGF0YSk7CisJCQkJCWlmKGJ1Zl90eXBlID09IENJRlNfU01BTExfQlVGRkVSKQorCQkJCQkJY2lmc19zbWFsbF9idWZfcmVsZWFzZShzbWJfcmVhZF9kYXRhKTsKKwkJCQkJZWxzZSBpZihidWZfdHlwZSA9PSBDSUZTX0xBUkdFX0JVRkZFUikKKwkJCQkJCWNpZnNfYnVmX3JlbGVhc2Uoc21iX3JlYWRfZGF0YSk7CiAJCQkJCXNtYl9yZWFkX2RhdGEgPSBOVUxMOwogCQkJCX0KIAkJCX0KQEAgLTE3MzgsNyArMTc0MSwxMCBAQAogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKHNtYl9yZWFkX2RhdGEpIHsKLQkJCWNpZnNfYnVmX3JlbGVhc2Uoc21iX3JlYWRfZGF0YSk7CisJCQlpZihidWZfdHlwZSA9PSBDSUZTX1NNQUxMX0JVRkZFUikKKwkJCQljaWZzX3NtYWxsX2J1Zl9yZWxlYXNlKHNtYl9yZWFkX2RhdGEpOworCQkJZWxzZSBpZihidWZfdHlwZSA9PSBDSUZTX0xBUkdFX0JVRkZFUikKKwkJCQljaWZzX2J1Zl9yZWxlYXNlKHNtYl9yZWFkX2RhdGEpOwogCQkJc21iX3JlYWRfZGF0YSA9IE5VTEw7CiAJCX0KIAkJYnl0ZXNfcmVhZCA9IDA7CkBAIC0xNzQ4LDcgKzE3NTQsMTAgQEAKIAogLyogbmVlZCB0byBmcmVlIHNtYl9yZWFkX2RhdGEgYnVmIGJlZm9yZSBleGl0ICovCiAJaWYgKHNtYl9yZWFkX2RhdGEpIHsKLQkJY2lmc19idWZfcmVsZWFzZShzbWJfcmVhZF9kYXRhKTsKKwkJaWYoYnVmX3R5cGUgPT0gQ0lGU19TTUFMTF9CVUZGRVIpCisJCQljaWZzX3NtYWxsX2J1Zl9yZWxlYXNlKHNtYl9yZWFkX2RhdGEpOworCQllbHNlIGlmKGJ1Zl90eXBlID09IENJRlNfTEFSR0VfQlVGRkVSKQorCQkJY2lmc19idWZfcmVsZWFzZShzbWJfcmVhZF9kYXRhKTsKIAkJc21iX3JlYWRfZGF0YSA9IE5VTEw7CiAJfSAKIApAQCAtMTgyNywxMCArMTgzNiwyMCBAQAogCQlvcGVuX2ZpbGUgPSAgZmluZF93cml0YWJsZV9maWxlKGNpZnNJbm9kZSk7CiAgCiAJaWYob3Blbl9maWxlKSB7CisJCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisKIAkJLyogdGhlcmUgaXMgbm90IGFjdHVhbGx5IGEgd3JpdGUgcGVuZGluZyBzbyBsZXQKIAkJdGhpcyBoYW5kbGUgZ28gZnJlZSBhbmQgYWxsb3cgaXQgdG8KIAkJYmUgY2xvc2FibGUgaWYgbmVlZGVkICovCiAJCWF0b21pY19kZWMoJm9wZW5fZmlsZS0+d3J0UGVuZGluZyk7CisKKwkJY2lmc19zYiA9IENJRlNfU0IoY2lmc0lub2RlLT52ZnNfaW5vZGUuaV9zYik7CisJCWlmICggY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX0RJUkVDVF9JTyApIHsKKwkJCS8qIHNpbmNlIG5vIHBhZ2UgY2FjaGUgdG8gY29ycnVwdCBvbiBkaXJlY3RpbyAKKwkJCXdlIGNhbiBjaGFuZ2Ugc2l6ZSBzYWZlbHkgKi8KKwkJCXJldHVybiAxOworCQl9CisKIAkJcmV0dXJuIDA7CiAJfSBlbHNlCiAJCXJldHVybiAxOwpAQCAtMTg3NSw5ICsxODk0LDcgQEAKIAkucmVhZHBhZ2UgPSBjaWZzX3JlYWRwYWdlLAogCS5yZWFkcGFnZXMgPSBjaWZzX3JlYWRwYWdlcywKIAkud3JpdGVwYWdlID0gY2lmc193cml0ZXBhZ2UsCi0jaWZkZWYgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMCiAJLndyaXRlcGFnZXMgPSBjaWZzX3dyaXRlcGFnZXMsCi0jZW5kaWYKIAkucHJlcGFyZV93cml0ZSA9IGNpZnNfcHJlcGFyZV93cml0ZSwKIAkuY29tbWl0X3dyaXRlID0gY2lmc19jb21taXRfd3JpdGUsCiAJLnNldF9wYWdlX2RpcnR5ID0gX19zZXRfcGFnZV9kaXJ0eV9ub2J1ZmZlcnMsCmRpZmYgLS1naXQgYS9mcy9jaWZzL2lub2RlLmMgYi9mcy9jaWZzL2lub2RlLmMKaW5kZXggNDExYzFmNy4uNTkzNTk5MSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9pbm9kZS5jCisrKyBiL2ZzL2NpZnMvaW5vZGUuYwpAQCAtMjI5LDExICsyMjksMTIgQEAKIAkJCSBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmCiAJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOwogCWlmIChyYz09MCkgeworCQlpbnQgYnVmX3R5cGUgPSBDSUZTX05PX0JVRkZFUjsKIAkJCS8qIFJlYWQgaGVhZGVyICovCiAJCXJjID0gQ0lGU1NNQlJlYWQoeGlkLCBwVGNvbiwKIAkJCSAgICAgICAgIG5ldGZpZCwKIAkJCQkgMjQgLyogbGVuZ3RoICovLCAwIC8qIG9mZnNldCAqLywKLQkJCQkgJmJ5dGVzX3JlYWQsICZwYnVmKTsKKwkJCQkgJmJ5dGVzX3JlYWQsICZwYnVmLCAmYnVmX3R5cGUpOwogCQlpZigocmMgPT0gMCkgJiYgKGJ5dGVzX3JlYWQgPj0gOCkpIHsKIAkJCWlmKG1lbWNtcCgiSW50eEJMSyIsIHBidWYsIDgpID09IDApIHsKIAkJCQljRllJKDEsKCJCbG9jayBkZXZpY2UiKSk7CkBAIC0yNjcsNyArMjY4LDcgQEAKIAkJfSBlbHNlIHsKIAkJCWlub2RlLT5pX21vZGUgfD0gU19JRlJFRzsgLyogdGhlbiBpdCBpcyBhIGZpbGUgKi8KIAkJCXJjID0gLUVPUE5PVFNVUFA7IC8qIG9yIHNvbWUgdW5rbm93biBTRlUgdHlwZSAqLwkKLQkJfQorCQl9CQkKIAkJQ0lGU1NNQkNsb3NlKHhpZCwgcFRjb24sIG5ldGZpZCk7CiAJfQogCXJldHVybiByYzsKQEAgLTc1MCw4ICs3NTEsOCBAQAogCQkJaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9TRVRfVUlEKSB7CiAJCQkJQ0lGU1NNQlVuaXhTZXRQZXJtcyh4aWQsIHBUY29uLCBmdWxsX3BhdGgsCiAJCQkJCQkgICAgbW9kZSwKLQkJCQkJCSAgICAoX191NjQpY3VycmVudC0+ZXVpZCwKLQkJCQkJCSAgICAoX191NjQpY3VycmVudC0+ZWdpZCwKKwkJCQkJCSAgICAoX191NjQpY3VycmVudC0+ZnN1aWQsCisJCQkJCQkgICAgKF9fdTY0KWN1cnJlbnQtPmZzZ2lkLAogCQkJCQkJICAgIDAgLyogZGV2X3QgKi8sCiAJCQkJCQkgICAgY2lmc19zYi0+bG9jYWxfbmxzLAogCQkJCQkJICAgIGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYKQEAgLTEwNDAsOSArMTA0MSw5IEBACiAJfQogCiAJLyogY2FuIG5vdCBncmFiIHRoaXMgc2VtIHNpbmNlIGtlcm5lbCBmaWxlc3lzIGxvY2tpbmcgZG9jdW1lbnRhdGlvbgotCSAgIGluZGljYXRlcyBpX3NlbSBtYXkgYmUgdGFrZW4gYnkgdGhlIGtlcm5lbCBvbiBsb29rdXAgYW5kIHJlbmFtZQotCSAgIHdoaWNoIGNvdWxkIGRlYWRsb2NrIGlmIHdlIGdyYWIgdGhlIGlfc2VtIGhlcmUgYXMgd2VsbCAqLwotLyoJZG93bigmZGlyZW50cnktPmRfaW5vZGUtPmlfc2VtKTsqLworCSAgIGluZGljYXRlcyBpX211dGV4IG1heSBiZSB0YWtlbiBieSB0aGUga2VybmVsIG9uIGxvb2t1cCBhbmQgcmVuYW1lCisJICAgd2hpY2ggY291bGQgZGVhZGxvY2sgaWYgd2UgZ3JhYiB0aGUgaV9tdXRleCBoZXJlIGFzIHdlbGwgKi8KKy8qCW11dGV4X2xvY2soJmRpcmVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsqLwogCS8qIG5lZWQgdG8gd3JpdGUgb3V0IGRpcnR5IHBhZ2VzIGhlcmUgICovCiAJaWYgKGRpcmVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcpIHsKIAkJLyogZG8gd2UgbmVlZCB0byBsb2NrIGlub2RlIHVudGlsIGFmdGVyIGludmFsaWRhdGUgY29tcGxldGVzCkBAIC0xMDY2LDcgKzEwNjcsNyBAQAogCQkJfQogCQl9CiAJfQotLyoJdXAoJmRpcmVudHJ5LT5kX2lub2RlLT5pX3NlbSk7ICovCisvKgltdXRleF91bmxvY2soJmRpcmVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsgKi8KIAkKIAlrZnJlZShmdWxsX3BhdGgpOwogCUZyZWVYaWQoeGlkKTsKQEAgLTExNDgsOCArMTE0OSw3IEBACiAJLyogQkIgY2hlY2sgaWYgd2UgbmVlZCB0byByZWZyZXNoIGlub2RlIGZyb20gc2VydmVyIG5vdyA/IEJCICovCiAKIAkvKiBuZWVkIHRvIGZsdXNoIGRhdGEgYmVmb3JlIGNoYW5naW5nIGZpbGUgc2l6ZSBvbiBzZXJ2ZXIgKi8KLQlmaWxlbWFwX2ZkYXRhd3JpdGUoZGlyZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZyk7Ci0JZmlsZW1hcF9mZGF0YXdhaXQoZGlyZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZyk7CisJZmlsZW1hcF93cml0ZV9hbmRfd2FpdChkaXJlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nKTsKIAogCWlmIChhdHRycy0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKIAkJLyogVG8gYXZvaWQgc3B1cmlvdXMgb3Bsb2NrIGJyZWFrcyBmcm9tIHNlcnZlciwgaW4gdGhlIGNhc2Ugb2YKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvbWlzYy5jIGIvZnMvY2lmcy9taXNjLmMKaW5kZXggOTRiYWY2Yy4uODEyYzZiYiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9taXNjLmMKKysrIGIvZnMvY2lmcy9taXNjLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogICBmcy9jaWZzL21pc2MuYwogICoKLSAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMiwyMDA0CisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDIsMjAwNQogICogICBBdXRob3Iocyk6IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKQogICoKICAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTE2MSw2ICsxNjEsOSBAQAogCWlmIChyZXRfYnVmKSB7CiAJCW1lbXNldChyZXRfYnVmLCAwLCBzaXplb2Yoc3RydWN0IHNtYl9oZHIpICsgMyk7CiAJCWF0b21pY19pbmMoJmJ1ZkFsbG9jQ291bnQpOworI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTMgorCQlhdG9taWNfaW5jKCZ0b3RCdWZBbGxvY0NvdW50KTsKKyNlbmRpZiAvKiBDT05GSUdfQ0lGU19TVEFUUzIgKi8KIAl9CiAKIAlyZXR1cm4gcmV0X2J1ZjsKQEAgLTE5NSw2ICsxOTgsMTAgQEAKIAkvKiBObyBuZWVkIHRvIGNsZWFyIG1lbW9yeSBoZXJlLCBjbGVhcmVkIGluIGhlYWRlciBhc3NlbWJsZSAqLwogCS8qCW1lbXNldChyZXRfYnVmLCAwLCBzaXplb2Yoc3RydWN0IHNtYl9oZHIpICsgMjcpOyovCiAJCWF0b21pY19pbmMoJnNtQnVmQWxsb2NDb3VudCk7CisjaWZkZWYgQ09ORklHX0NJRlNfU1RBVFMyCisJCWF0b21pY19pbmMoJnRvdFNtQnVmQWxsb2NDb3VudCk7CisjZW5kaWYgLyogQ09ORklHX0NJRlNfU1RBVFMyICovCisKIAl9CiAJcmV0dXJuIHJldF9idWY7CiB9CkBAIC0yOTIsNyArMjk5LDcgQEAKIAlzdHJ1Y3QgY2lmc1Nlc0luZm8gKiBzZXM7CiAJY2hhciAqdGVtcCA9IChjaGFyICopIGJ1ZmZlcjsKIAotCW1lbXNldCh0ZW1wLDAsTUFYX0NJRlNfSERSX1NJWkUpOworCW1lbXNldCh0ZW1wLDAsMjU2KTsgLyogYmlnZ2VyIHRoYW4gTUFYX0NJRlNfSERSX1NJWkUgKi8KIAogCWJ1ZmZlci0+c21iX2J1Zl9sZW5ndGggPQogCSAgICAoMiAqIHdvcmRfY291bnQpICsgc2l6ZW9mIChzdHJ1Y3Qgc21iX2hkcikgLQpAQCAtMzQ4LDEyICszNTUsMTIgQEAKIAkJLyogIEJCIEFkZCBzdXBwb3J0IGZvciBlc3RhYmxpc2hpbmcgbmV3IHRDb24gYW5kIFNNQiBTZXNzaW9uICAqLwogCQkvKiAgICAgIHdpdGggdXNlcmlkL3Bhc3N3b3JkIHBhaXJzIGZvdW5kIG9uIHRoZSBzbWIgc2Vzc2lvbiAgICovIAogCQkvKglmb3Igb3RoZXIgdGFyZ2V0IHRjcC9pcCBhZGRyZXNzZXMgCQlCQiAgICAqLwotCQkJCWlmKGN1cnJlbnQtPnVpZCAhPSB0cmVlQ29uLT5zZXMtPmxpbnV4X3VpZCkgewotCQkJCQljRllJKDEsKCJNdWx0aXVzZXIgbW9kZSBhbmQgVUlEIGRpZCBub3QgbWF0Y2ggdGNvbiB1aWQgIikpOworCQkJCWlmKGN1cnJlbnQtPmZzdWlkICE9IHRyZWVDb24tPnNlcy0+bGludXhfdWlkKSB7CisJCQkJCWNGWUkoMSwoIk11bHRpdXNlciBtb2RlIGFuZCBVSUQgZGlkIG5vdCBtYXRjaCB0Y29uIHVpZCIpKTsKIAkJCQkJcmVhZF9sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKIAkJCQkJbGlzdF9mb3JfZWFjaCh0ZW1wX2l0ZW0sICZHbG9iYWxTTUJTZXNzaW9uTGlzdCkgewogCQkJCQkJc2VzID0gbGlzdF9lbnRyeSh0ZW1wX2l0ZW0sIHN0cnVjdCBjaWZzU2VzSW5mbywgY2lmc1Nlc3Npb25MaXN0KTsKLQkJCQkJCWlmKHNlcy0+bGludXhfdWlkID09IGN1cnJlbnQtPnVpZCkgeworCQkJCQkJaWYoc2VzLT5saW51eF91aWQgPT0gY3VycmVudC0+ZnN1aWQpIHsKIAkJCQkJCQlpZihzZXMtPnNlcnZlciA9PSB0cmVlQ29uLT5zZXMtPnNlcnZlcikgewogCQkJCQkJCQljRllJKDEsKCJmb3VuZCBtYXRjaGluZyB1aWQgc3Vic3RpdHV0ZSByaWdodCBzbWJfdWlkIikpOyAgCiAJCQkJCQkJCWJ1ZmZlci0+VWlkID0gc2VzLT5TdWlkOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9yZWFkZGlyLmMgYi9mcy9jaWZzL3JlYWRkaXIuYwppbmRleCA5YmRhYWVjLi4yODhjYzA0IDEwMDY0NAotLS0gYS9mcy9jaWZzL3JlYWRkaXIuYworKysgYi9mcy9jaWZzL3JlYWRkaXIuYwpAQCAtMjE0LDggKzIxNCw3IEBACiAJCQl0bXBfaW5vZGUtPmlfZm9wID0gJmNpZnNfZmlsZV9ub2JybF9vcHM7CiAJCWVsc2UKIAkJCXRtcF9pbm9kZS0+aV9mb3AgPSAmY2lmc19maWxlX29wczsKLQkJaWYoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX05PX0JSTCkKLQkJCXRtcF9pbm9kZS0+aV9mb3AtPmxvY2sgPSBOVUxMOworCiAJCXRtcF9pbm9kZS0+aV9kYXRhLmFfb3BzID0gJmNpZnNfYWRkcl9vcHM7CiAJCWlmKChjaWZzX3NiLT50Y29uKSAmJiAoY2lmc19zYi0+dGNvbi0+c2VzKSAmJgogCQkgICAoY2lmc19zYi0+dGNvbi0+c2VzLT5zZXJ2ZXItPm1heEJ1ZiA8CkBAIC0zMjcsMTIgKzMyNiwxOCBAQAogCWlmIChTX0lTUkVHKHRtcF9pbm9kZS0+aV9tb2RlKSkgewogCQljRllJKDEsICgiRmlsZSBpbm9kZSIpKTsKIAkJdG1wX2lub2RlLT5pX29wID0gJmNpZnNfZmlsZV9pbm9kZV9vcHM7Ci0JCWlmKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9ESVJFQ1RfSU8pCi0JCQl0bXBfaW5vZGUtPmlfZm9wID0gJmNpZnNfZmlsZV9kaXJlY3Rfb3BzOworCisJCWlmKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9ESVJFQ1RfSU8pIHsKKwkJCWlmKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9OT19CUkwpCisJCQkJdG1wX2lub2RlLT5pX2ZvcCA9ICZjaWZzX2ZpbGVfZGlyZWN0X25vYnJsX29wczsKKwkJCWVsc2UKKwkJCQl0bXBfaW5vZGUtPmlfZm9wID0gJmNpZnNfZmlsZV9kaXJlY3Rfb3BzOworCQkKKwkJfSBlbHNlIGlmKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9OT19CUkwpCisJCQl0bXBfaW5vZGUtPmlfZm9wID0gJmNpZnNfZmlsZV9ub2JybF9vcHM7CiAJCWVsc2UKIAkJCXRtcF9pbm9kZS0+aV9mb3AgPSAmY2lmc19maWxlX29wczsKLQkJaWYoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX05PX0JSTCkKLQkJCXRtcF9pbm9kZS0+aV9mb3AtPmxvY2sgPSBOVUxMOworCiAJCXRtcF9pbm9kZS0+aV9kYXRhLmFfb3BzID0gJmNpZnNfYWRkcl9vcHM7CiAJCWlmKChjaWZzX3NiLT50Y29uKSAmJiAoY2lmc19zYi0+dGNvbi0+c2VzKSAmJgogCQkgICAoY2lmc19zYi0+dGNvbi0+c2VzLT5zZXJ2ZXItPm1heEJ1ZiA8IApkaWZmIC0tZ2l0IGEvZnMvY2lmcy9yZmMxMDAycGR1LmggYi9mcy9jaWZzL3JmYzEwMDJwZHUuaAppbmRleCA5MjIyMDMzLi5hZWRlNjA2IDEwMDY0NAotLS0gYS9mcy9jaWZzL3JmYzEwMDJwZHUuaAorKysgYi9mcy9jaWZzL3JmYzEwMDJwZHUuaApAQCAtMjQsMTEgKzI0LDExIEBACiAvKiBOQjogdW5saWtlIHNtYi9jaWZzIHBhY2tldHMsIHRoZSBSRkMxMDAyIHN0cnVjdHVyZXMgYXJlIGJpZyBlbmRpYW4gKi8KIAogCS8qIFJGQyAxMDAyIHNlc3Npb24gcGFja2V0IHR5cGVzICovCi0jZGVmaW5lIFJGQzEwMDJfU0VTU0lPTl9NRVNBU0FHRSAweDAwCisjZGVmaW5lIFJGQzEwMDJfU0VTU0lPTl9NRVNTQUdFIDB4MDAKICNkZWZpbmUgUkZDMTAwMl9TRVNTSU9OX1JFUVVFU1QgIDB4ODEKICNkZWZpbmUgUkZDMTAwMl9QT1NJVElWRV9TRVNTSU9OX1JFU1BPTlNFIDB4ODIKICNkZWZpbmUgUkZDMTAwMl9ORUdBVElWRV9TRVNTSU9OX1JFU1BPTlNFIDB4ODMKLSNkZWZpbmUgUkZDMTAwMl9SRVRBUkdFVF9TRVNTSU9OX1JFU1BPTlNFIDB4ODMKKyNkZWZpbmUgUkZDMTAwMl9SRVRBUkdFVF9TRVNTSU9OX1JFU1BPTlNFIDB4ODQKICNkZWZpbmUgUkZDMTAwMl9TRVNTSU9OX0tFRVBfQUxJVkUgMHg4NQogCiAJLyogUkZDIDEwMDIgZmxhZ3MgKG9ubHkgb25lIGRlZmluZWQgKi8KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvdHJhbnNwb3J0LmMgYi9mcy9jaWZzL3RyYW5zcG9ydC5jCmluZGV4IGY4ODcxMTkuLjdiOTg3OTIgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvdHJhbnNwb3J0LmMKKysrIGIvZnMvY2lmcy90cmFuc3BvcnQuYwpAQCAtMjA2LDcgKzIwNiw2IEBACiAJcmV0dXJuIHJjOwogfQogCi0jaWZkZWYgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMCiBzdGF0aWMgaW50CiBzbWJfc2VuZDIoc3RydWN0IHNvY2tldCAqc3NvY2tldCwgc3RydWN0IGt2ZWMgKmlvdiwgaW50IG5fdmVjLAogCSAgc3RydWN0IHNvY2thZGRyICpzaW4pCkBAIC0yOTksNyArMjk4LDcgQEAKIAogaW50CiBTZW5kUmVjZWl2ZTIoY29uc3QgdW5zaWduZWQgaW50IHhpZCwgc3RydWN0IGNpZnNTZXNJbmZvICpzZXMsIAotCSAgICAgc3RydWN0IGt2ZWMgKmlvdiwgaW50IG5fdmVjLCBpbnQgKnBieXRlc19yZXR1cm5lZCwKKwkgICAgIHN0cnVjdCBrdmVjICppb3YsIGludCBuX3ZlYywgaW50ICogcFJlc3BCdWZUeXBlIC8qIHJldCAqLywgCiAJICAgICBjb25zdCBpbnQgbG9uZ19vcCkKIHsKIAlpbnQgcmMgPSAwOwpAQCAtMzA3LDYgKzMwNiw4IEBACiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCXN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkUTsKIAlzdHJ1Y3Qgc21iX2hkciAqaW5fYnVmID0gaW92WzBdLmlvdl9iYXNlOworCQorCSpwUmVzcEJ1ZlR5cGUgPSBDSUZTX05PX0JVRkZFUjsgIC8qIG5vIHJlc3BvbnNlIGJ1ZiB5ZXQgKi8KIAogCWlmIChzZXMgPT0gTlVMTCkgewogCQljRVJST1IoMSwoIk51bGwgc21iIHNlc3Npb24iKSk7CkBAIC0zOTIsOCArMzkzLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0vKiBCQiBGSVhNRSAqLwotLyogCXJjID0gY2lmc19zaWduX3NtYjIoaW92LCBuX3ZlYywgc2VzLT5zZXJ2ZXIsICZtaWRRLT5zZXF1ZW5jZV9udW1iZXIpOyAqLworIAlyYyA9IGNpZnNfc2lnbl9zbWIyKGlvdiwgbl92ZWMsIHNlcy0+c2VydmVyLCAmbWlkUS0+c2VxdWVuY2VfbnVtYmVyKTsKIAogCW1pZFEtPm1pZFN0YXRlID0gTUlEX1JFUVVFU1RfU1VCTUlUVEVEOwogI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTMgpAQCAtNDg5LDIxICs0ODksMjMgQEAKIAkJCXJlY2VpdmVfbGVuLCB4aWQpKTsKIAkJcmMgPSAtRUlPOwogCX0gZWxzZSB7CQkvKiByY3ZkIGZyYW1lIGlzIG9rICovCi0KIAkJaWYgKG1pZFEtPnJlc3BfYnVmICYmIAogCQkJKG1pZFEtPm1pZFN0YXRlID09IE1JRF9SRVNQT05TRV9SRUNFSVZFRCkpIHsKLQkJCWluX2J1Zi0+c21iX2J1Zl9sZW5ndGggPSByZWNlaXZlX2xlbjsKLQkJCS8qIEJCIHZlcmlmeSB0aGF0IGxlbmd0aCB3b3VsZCBub3Qgb3ZlcnJ1biBzbWFsbCBidWYgKi8KLQkJCW1lbWNweSgoY2hhciAqKWluX2J1ZiArIDQsCi0JCQkgICAgICAgKGNoYXIgKiltaWRRLT5yZXNwX2J1ZiArIDQsCi0JCQkgICAgICAgcmVjZWl2ZV9sZW4pOwogCi0JCQlkdW1wX3NtYihpbl9idWYsIDgwKTsKKwkJCWlvdlswXS5pb3ZfYmFzZSA9IChjaGFyICopbWlkUS0+cmVzcF9idWY7CisJCQlpZihtaWRRLT5sYXJnZUJ1ZikKKwkJCQkqcFJlc3BCdWZUeXBlID0gQ0lGU19MQVJHRV9CVUZGRVI7CisJCQllbHNlCisJCQkJKnBSZXNwQnVmVHlwZSA9IENJRlNfU01BTExfQlVGRkVSOworCQkJaW92WzBdLmlvdl9sZW4gPSByZWNlaXZlX2xlbiArIDQ7CisJCQlpb3ZbMV0uaW92X2xlbiA9IDA7CisKKwkJCWR1bXBfc21iKG1pZFEtPnJlc3BfYnVmLCA4MCk7CiAJCQkvKiBjb252ZXJ0IHRoZSBsZW5ndGggaW50byBhIG1vcmUgdXNhYmxlIGZvcm0gKi8KIAkJCWlmKChyZWNlaXZlX2xlbiA+IDI0KSAmJgogCQkJICAgKHNlcy0+c2VydmVyLT5zZWNNb2RlICYgKFNFQ01PREVfU0lHTl9SRVFVSVJFRCB8CiAJCQkJCVNFQ01PREVfU0lHTl9FTkFCTEVEKSkpIHsKLQkJCQlyYyA9IGNpZnNfdmVyaWZ5X3NpZ25hdHVyZShpbl9idWYsCisJCQkJcmMgPSBjaWZzX3ZlcmlmeV9zaWduYXR1cmUobWlkUS0+cmVzcF9idWYsCiAJCQkJCQlzZXMtPnNlcnZlci0+bWFjX3NpZ25pbmdfa2V5LAogCQkJCQkJbWlkUS0+c2VxdWVuY2VfbnVtYmVyKzEpOwogCQkJCWlmKHJjKSB7CkBAIC01MTIsMTggKzUxNCwxOSBAQAogCQkJCX0KIAkJCX0KIAotCQkJKnBieXRlc19yZXR1cm5lZCA9IGluX2J1Zi0+c21iX2J1Zl9sZW5ndGg7Ci0KIAkJCS8qIEJCIHNwZWNpYWwgY2FzZSByZWNvbm5lY3QgdGlkIGFuZCB1aWQgaGVyZT8gKi8KIAkJCS8qIEJCIHNwZWNpYWwgY2FzZSBFcnJiYWRwYXNzd29yZCBhbmQgcHdkZXhwaXJlZCBoZXJlICovCi0JCQlyYyA9IG1hcF9zbWJfdG9fbGludXhfZXJyb3IoaW5fYnVmKTsKKwkJCXJjID0gbWFwX3NtYl90b19saW51eF9lcnJvcihtaWRRLT5yZXNwX2J1Zik7CiAKIAkJCS8qIGNvbnZlcnQgQnl0ZUNvdW50IGlmIG5lY2Vzc2FyeSAqLwogCQkJaWYgKHJlY2VpdmVfbGVuID49CiAJCQkgICAgc2l6ZW9mIChzdHJ1Y3Qgc21iX2hkcikgLQogCQkJICAgIDQgLyogZG8gbm90IGNvdW50IFJGQzEwMDEgaGVhZGVyICovICArCi0JCQkgICAgKDIgKiBpbl9idWYtPldvcmRDb3VudCkgKyAyIC8qIGJjYyAqLyApCi0JCQkJQkNDKGluX2J1ZikgPSBsZTE2X3RvX2NwdShCQ0NfTEUoaW5fYnVmKSk7CisJCQkgICAgKDIgKiBtaWRRLT5yZXNwX2J1Zi0+V29yZENvdW50KSArIDIgLyogYmNjICovICkKKwkJCQlCQ0MobWlkUS0+cmVzcF9idWYpID0gCisJCQkJCWxlMTZfdG9fY3B1KEJDQ19MRShtaWRRLT5yZXNwX2J1ZikpOworCQkJbWlkUS0+cmVzcF9idWYgPSBOVUxMOyAgLyogbWFyayBpdCBzbyB3aWxsIG5vdCBiZSBmcmVlZAorCQkJCQkJYnkgRGVsZXRlTWlkUUVudHJ5ICovCiAJCX0gZWxzZSB7CiAJCQlyYyA9IC1FSU87CiAJCQljRllJKDEsKCJCYWQgTUlEIHN0YXRlPyIpKTsKQEAgLTU0OSw3ICs1NTIsNiBAQAogCiAJcmV0dXJuIHJjOwogfQotI2VuZGlmIC8qIENJRlNfRVhQRVJJTUVOVEFMICovCiAKIGludAogU2VuZFJlY2VpdmUoY29uc3QgdW5zaWduZWQgaW50IHhpZCwgc3RydWN0IGNpZnNTZXNJbmZvICpzZXMsCkBAIC03OTAsNyArNzkyLDcgQEAKIAkJCQlCQ0Mob3V0X2J1ZikgPSBsZTE2X3RvX2NwdShCQ0NfTEUob3V0X2J1ZikpOwogCQl9IGVsc2UgewogCQkJcmMgPSAtRUlPOwotCQkJY0VSUk9SKDEsKCJCYWQgTUlEIHN0YXRlPyAiKSk7CisJCQljRVJST1IoMSwoIkJhZCBNSUQgc3RhdGU/IikpOwogCQl9CiAJfQogY2lmc19ub19yZXNwb25zZV9leGl0OgpkaWZmIC0tZ2l0IGEvZnMvY2lmcy94YXR0ci5jIGIvZnMvY2lmcy94YXR0ci5jCmluZGV4IGYzNzVmODcuLjc3N2UzMzYgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMveGF0dHIuYworKysgYi9mcy9jaWZzL3hhdHRyLmMKQEAgLTI1NCw3ICsyNTQsOCBAQAogCQlyYyA9IENJRlNTTUJRdWVyeUVBKHhpZCxwVGNvbixmdWxsX3BhdGgsZWFfbmFtZSxlYV92YWx1ZSwKIAkJCWJ1Zl9zaXplLCBjaWZzX3NiLT5sb2NhbF9ubHMsCiAJCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKLQl9IGVsc2UgaWYoc3RybmNtcChlYV9uYW1lLFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1Msc3RybGVuKFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MpKSA9PSAwKSB7CisJfSBlbHNlIGlmKHN0cm5jbXAoZWFfbmFtZSxQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTLAorCQkJICBzdHJsZW4oUE9TSVhfQUNMX1hBVFRSX0FDQ0VTUykpID09IDApIHsKICNpZmRlZiBDT05GSUdfQ0lGU19QT1NJWAogCQlpZihzYi0+c19mbGFncyAmIE1TX1BPU0lYQUNMKQogCQkJcmMgPSBDSUZTU01CR2V0UG9zaXhBQ0woeGlkLCBwVGNvbiwgZnVsbF9wYXRoLApAQCAtMjYyLDEwICsyNjMsMjcgQEAKIAkJCQljaWZzX3NiLT5sb2NhbF9ubHMsCiAJCQkJY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiAKIAkJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOworLyoJCWVsc2UgaWYoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX0NJRlNfQUNMKSB7CisJCQlfX3UxNiBmaWQ7CisJCQlpbnQgb3Bsb2NrID0gRkFMU0U7CisJCQlyYyA9IENJRlNTTUJPcGVuKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwKKwkJCQkJIEZJTEVfT1BFTiwgR0VORVJJQ19SRUFELCAwLCAmZmlkLAorCQkJCQkgJm9wbG9jaywgTlVMTCwgY2lmc19zYi0+bG9jYWxfbmxzLAorCQkJCQkgY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJgorCQkJCQkgQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOworCQkJaWYocmMgPT0gMCkgeworCQkJCXJjID0gQ0lGU1NNQkdldENJRlNBQ0woeGlkLCBwVGNvbiwgZmlkLAorCQkJCQllYV92YWx1ZSwgYnVmX3NpemUsCisJCQkJCUFDTF9UWVBFX0FDQ0VTUyk7CisJCQkJQ0lGU1NNQkNsb3NlKHhpZCwgcFRjb24sIGZpZCkKKwkJCX0KKwkJfSAqLyAgLyogQkIgZW5hYmxlIGFmdGVyIGZpeGluZyB1cCByZXR1cm4gZGF0YSAqLworICAgICAgICAgICAgICAgICAgCQkKICNlbHNlIAogCQljRllJKDEsKCJxdWVyeSBQT1NJWCBBQ0wgbm90IHN1cHBvcnRlZCB5ZXQiKSk7CiAjZW5kaWYgLyogQ09ORklHX0NJRlNfUE9TSVggKi8KLQl9IGVsc2UgaWYoc3RybmNtcChlYV9uYW1lLFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxULHN0cmxlbihQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVCkpID09IDApIHsKKwl9IGVsc2UgaWYoc3RybmNtcChlYV9uYW1lLFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxULAorCQkJICBzdHJsZW4oUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQpKSA9PSAwKSB7CiAjaWZkZWYgQ09ORklHX0NJRlNfUE9TSVgKIAkJaWYoc2ItPnNfZmxhZ3MgJiBNU19QT1NJWEFDTCkKIAkJCXJjID0gQ0lGU1NNQkdldFBvc2l4QUNMKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwKZGlmZiAtLWdpdCBhL2ZzL2NvZGEvY2FjaGUuYyBiL2ZzL2NvZGEvY2FjaGUuYwppbmRleCA4MDA3MmZkLi5jNjA3ZDkyIDEwMDY0NAotLS0gYS9mcy9jb2RhL2NhY2hlLmMKKysrIGIvZnMvY29kYS9jYWNoZS5jCkBAIC05Myw3ICs5Myw3IEBACiAJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CiAJbGlzdF9mb3JfZWFjaChjaGlsZCwgJnBhcmVudC0+ZF9zdWJkaXJzKQogCXsKLQkJZGUgPSBsaXN0X2VudHJ5KGNoaWxkLCBzdHJ1Y3QgZGVudHJ5LCBkX2NoaWxkKTsKKwkJZGUgPSBsaXN0X2VudHJ5KGNoaWxkLCBzdHJ1Y3QgZGVudHJ5LCBkX3UuZF9jaGlsZCk7CiAJCS8qIGRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIG5lZ2F0aXZlIGRlbnRyaWVzICovCiAJCWlmICggISBkZS0+ZF9pbm9kZSApIAogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9mcy9jb2RhL2Rpci5jIGIvZnMvY29kYS9kaXIuYwppbmRleCAyMzkxNzY2Li44ZjFhNTE3IDEwMDY0NAotLS0gYS9mcy9jb2RhL2Rpci5jCisrKyBiL2ZzL2NvZGEvZGlyLmMKQEAgLTQ1Myw3ICs0NTMsNyBAQAogCWNvZGFfdmZzX3N0YXQucmVhZGRpcisrOwogCiAJaG9zdF9pbm9kZSA9IGhvc3RfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7Ci0JZG93bigmaG9zdF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmhvc3RfaW5vZGUtPmlfbXV0ZXgpOwogCWhvc3RfZmlsZS0+Zl9wb3MgPSBjb2RhX2ZpbGUtPmZfcG9zOwogCiAJaWYgKCFob3N0X2ZpbGUtPmZfb3AtPnJlYWRkaXIpIHsKQEAgLTQ3NSw3ICs0NzUsNyBAQAogCX0KIG91dDoKIAljb2RhX2ZpbGUtPmZfcG9zID0gaG9zdF9maWxlLT5mX3BvczsKLQl1cCgmaG9zdF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmaG9zdF9pbm9kZS0+aV9tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZnMvY29kYS9maWxlLmMgYi9mcy9jb2RhL2ZpbGUuYwppbmRleCBlNmJjMDIyLi4zMGI0NjMwIDEwMDY0NAotLS0gYS9mcy9jb2RhL2ZpbGUuYworKysgYi9mcy9jb2RhL2ZpbGUuYwpAQCAtNzcsMTQgKzc3LDE0IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaG9zdF9pbm9kZSA9IGhvc3RfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7Ci0JZG93bigmY29kYV9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmNvZGFfaW5vZGUtPmlfbXV0ZXgpOwogCiAJcmV0ID0gaG9zdF9maWxlLT5mX29wLT53cml0ZShob3N0X2ZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOwogCiAJY29kYV9pbm9kZS0+aV9zaXplID0gaG9zdF9pbm9kZS0+aV9zaXplOwogCWNvZGFfaW5vZGUtPmlfYmxvY2tzID0gKGNvZGFfaW5vZGUtPmlfc2l6ZSArIDUxMSkgPj4gOTsKIAljb2RhX2lub2RlLT5pX210aW1lID0gY29kYV9pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7Ci0JdXAoJmNvZGFfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmNvZGFfaW5vZGUtPmlfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI3Miw5ICsyNzIsOSBAQAogCWlmIChob3N0X2ZpbGUtPmZfb3AgJiYgaG9zdF9maWxlLT5mX29wLT5mc3luYykgewogCQlob3N0X2RlbnRyeSA9IGhvc3RfZmlsZS0+Zl9kZW50cnk7CiAJCWhvc3RfaW5vZGUgPSBob3N0X2RlbnRyeS0+ZF9pbm9kZTsKLQkJZG93bigmaG9zdF9pbm9kZS0+aV9zZW0pOworCQltdXRleF9sb2NrKCZob3N0X2lub2RlLT5pX211dGV4KTsKIAkJZXJyID0gaG9zdF9maWxlLT5mX29wLT5mc3luYyhob3N0X2ZpbGUsIGhvc3RfZGVudHJ5LCBkYXRhc3luYyk7Ci0JCXVwKCZob3N0X2lub2RlLT5pX3NlbSk7CisJCW11dGV4X3VubG9jaygmaG9zdF9pbm9kZS0+aV9tdXRleCk7CiAJfQogCiAJaWYgKCAhZXJyICYmICFkYXRhc3luYyApIHsKZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdC5jIGIvZnMvY29tcGF0LmMKaW5kZXggNTVhYzAzMi4uZmYwYmFmYyAxMDA2NDQKLS0tIGEvZnMvY29tcGF0LmMKKysrIGIvZnMvY29tcGF0LmMKQEAgLTUzLDYgKzUzLDggQEAKICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CiAKK2V4dGVybiB2b2lkIHNpZ3NldF9mcm9tX2NvbXBhdChzaWdzZXRfdCAqc2V0LCBjb21wYXRfc2lnc2V0X3QgKmNvbXBhdCk7CisKIC8qCiAgKiBOb3QgYWxsIGFyY2hpdGVjdHVyZXMgaGF2ZSBzeXNfdXRpbWUsIHNvIGltcGxlbWVudCB0aGlzIGluIHRlcm1zCiAgKiBvZiBzeXNfdXRpbWVzLgpAQCAtNjgsMTAgKzcwLDEwIEBACiAJCXR2WzBdLnR2X3VzZWMgPSAwOwogCQl0dlsxXS50dl91c2VjID0gMDsKIAl9Ci0JcmV0dXJuIGRvX3V0aW1lcyhmaWxlbmFtZSwgdCA/IHR2IDogTlVMTCk7CisJcmV0dXJuIGRvX3V0aW1lcyhBVF9GRENXRCwgZmlsZW5hbWUsIHQgPyB0diA6IE5VTEwpOwogfQogCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c191dGltZXMoY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICp0KQorYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZnV0aW1lc2F0KGludCBkZmQsIGNoYXIgX191c2VyICpmaWxlbmFtZSwgc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqdCkKIHsKIAlzdHJ1Y3QgdGltZXZhbCB0dlsyXTsKIApAQCAtODIsMTQgKzg0LDE5IEBACiAJCSAgICBnZXRfdXNlcih0dlsxXS50dl91c2VjLCAmdFsxXS50dl91c2VjKSkKIAkJCXJldHVybiAtRUZBVUxUOyAKIAl9IAotCXJldHVybiBkb191dGltZXMoZmlsZW5hbWUsIHQgPyB0diA6IE5VTEwpOworCXJldHVybiBkb191dGltZXMoZGZkLCBmaWxlbmFtZSwgdCA/IHR2IDogTlVMTCk7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3V0aW1lcyhjaGFyIF9fdXNlciAqZmlsZW5hbWUsIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKnQpCit7CisJcmV0dXJuIGNvbXBhdF9zeXNfZnV0aW1lc2F0KEFUX0ZEQ1dELCBmaWxlbmFtZSwgdCk7CiB9CiAKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX25ld3N0YXQoY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwKIAkJc3RydWN0IGNvbXBhdF9zdGF0IF9fdXNlciAqc3RhdGJ1ZikKIHsKIAlzdHJ1Y3Qga3N0YXQgc3RhdDsKLQlpbnQgZXJyb3IgPSB2ZnNfc3RhdChmaWxlbmFtZSwgJnN0YXQpOworCWludCBlcnJvciA9IHZmc19zdGF0X2ZkKEFUX0ZEQ1dELCBmaWxlbmFtZSwgJnN0YXQpOwogCiAJaWYgKCFlcnJvcikKIAkJZXJyb3IgPSBjcF9jb21wYXRfc3RhdCgmc3RhdCwgc3RhdGJ1Zik7CkBAIC0xMDAsMTMgKzEwNywzNCBAQAogCQlzdHJ1Y3QgY29tcGF0X3N0YXQgX191c2VyICpzdGF0YnVmKQogewogCXN0cnVjdCBrc3RhdCBzdGF0OwotCWludCBlcnJvciA9IHZmc19sc3RhdChmaWxlbmFtZSwgJnN0YXQpOworCWludCBlcnJvciA9IHZmc19sc3RhdF9mZChBVF9GRENXRCwgZmlsZW5hbWUsICZzdGF0KTsKIAogCWlmICghZXJyb3IpCiAJCWVycm9yID0gY3BfY29tcGF0X3N0YXQoJnN0YXQsIHN0YXRidWYpOwogCXJldHVybiBlcnJvcjsKIH0KIAorYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbmV3ZnN0YXRhdChpbnQgZGZkLCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsCisJCXN0cnVjdCBjb21wYXRfc3RhdCBfX3VzZXIgKnN0YXRidWYsIGludCBmbGFnKQoreworCXN0cnVjdCBrc3RhdCBzdGF0OworCWludCBlcnJvciA9IC1FSU5WQUw7CisKKwlpZiAoKGZsYWcgJiB+QVRfU1lNTElOS19OT0ZPTExPVykgIT0gMCkKKwkJZ290byBvdXQ7CisKKwlpZiAoZmxhZyAmIEFUX1NZTUxJTktfTk9GT0xMT1cpCisJCWVycm9yID0gdmZzX2xzdGF0X2ZkKGRmZCwgZmlsZW5hbWUsICZzdGF0KTsKKwllbHNlCisJCWVycm9yID0gdmZzX3N0YXRfZmQoZGZkLCBmaWxlbmFtZSwgJnN0YXQpOworCisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSBjcF9jb21wYXRfc3RhdCgmc3RhdCwgc3RhdGJ1Zik7CisKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX25ld2ZzdGF0KHVuc2lnbmVkIGludCBmZCwKIAkJc3RydWN0IGNvbXBhdF9zdGF0IF9fdXNlciAqIHN0YXRidWYpCiB7CkBAIC00OTQsOSArNTIyLDIxIEBACiAJCXJldCA9IHN5c19mY250bChmZCwgY21kLCAodW5zaWduZWQgbG9uZykmZik7CiAJCXNldF9mcyhvbGRfZnMpOwogCQlpZiAoY21kID09IEZfR0VUTEsgJiYgcmV0ID09IDApIHsKLQkJCWlmICgoZi5sX3N0YXJ0ID49IENPTVBBVF9PRkZfVF9NQVgpIHx8Ci0JCQkgICAgKChmLmxfc3RhcnQgKyBmLmxfbGVuKSA+IENPTVBBVF9PRkZfVF9NQVgpKQorCQkJLyogR0VUTEsgd2FzIHN1Y2Nlc3NmdWxlIGFuZCB3ZSBuZWVkIHRvIHJldHVybiB0aGUgZGF0YS4uLgorCQkJICogYnV0IGl0IG5lZWRzIHRvIGZpdCBpbiB0aGUgY29tcGF0IHN0cnVjdHVyZS4KKwkJCSAqIGxfc3RhcnQgc2hvdWxkbid0IGJlIHRvbyBiaWcsIHVubGVzcyB0aGUgb3JpZ2luYWwKKwkJCSAqIHN0YXJ0ICsgZW5kIGlzIGdyZWF0ZXIgdGhhbiBDT01QQVRfT0ZGX1RfTUFYLCBpbiB3aGljaAorCQkJICogY2FzZSB0aGUgYXBwIHdhcyBhc2tpbmcgZm9yIHRyb3VibGUsIHNvIHdlIHJldHVybgorCQkJICogLUVPVkVSRkxPVyBpbiB0aGF0IGNhc2UuCisJCQkgKiBsX2xlbiBjb3VsZCBiZSB0b28gYmlnLCBpbiB3aGljaCBjYXNlIHdlIGp1c3QgdHJ1bmNhdGUgaXQsCisJCQkgKiBhbmQgb25seSBhbGxvdyB0aGUgYXBwIHRvIHNlZSB0aGF0IHBhcnQgb2YgdGhlIGNvbmZsaWN0aW5nCisJCQkgKiBsb2NrIHRoYXQgbWlnaHQgbWFrZSBzZW5zZSB0byBpdCBhbnl3YXkKKwkJCSAqLworCisJCQlpZiAoZi5sX3N0YXJ0ID4gQ09NUEFUX09GRl9UX01BWCkKIAkJCQlyZXQgPSAtRU9WRVJGTE9XOworCQkJaWYgKGYubF9sZW4gPiBDT01QQVRfT0ZGX1RfTUFYKQorCQkJCWYubF9sZW4gPSBDT01QQVRfT0ZGX1RfTUFYOwogCQkJaWYgKHJldCA9PSAwKQogCQkJCXJldCA9IHB1dF9jb21wYXRfZmxvY2soJmYsIGNvbXBhdF9wdHIoYXJnKSk7CiAJCX0KQEAgLTUxNSw5ICs1NTUsMTEgQEAKIAkJCQkodW5zaWduZWQgbG9uZykmZik7CiAJCXNldF9mcyhvbGRfZnMpOwogCQlpZiAoY21kID09IEZfR0VUTEs2NCAmJiByZXQgPT0gMCkgewotCQkJaWYgKChmLmxfc3RhcnQgPj0gQ09NUEFUX0xPRkZfVF9NQVgpIHx8Ci0JCQkgICAgKChmLmxfc3RhcnQgKyBmLmxfbGVuKSA+IENPTVBBVF9MT0ZGX1RfTUFYKSkKKwkJCS8qIG5lZWQgdG8gcmV0dXJuIGxvY2sgaW5mb3JtYXRpb24gLSBzZWUgYWJvdmUgZm9yIGNvbW1lbnRhcnkgKi8KKwkJCWlmIChmLmxfc3RhcnQgPiBDT01QQVRfTE9GRl9UX01BWCkKIAkJCQlyZXQgPSAtRU9WRVJGTE9XOworCQkJaWYgKGYubF9sZW4gPiBDT01QQVRfTE9GRl9UX01BWCkKKwkJCQlmLmxfbGVuID0gQ09NUEFUX0xPRkZfVF9NQVg7CiAJCQlpZiAocmV0ID09IDApCiAJCQkJcmV0ID0gcHV0X2NvbXBhdF9mbG9jazY0KCZmLCBjb21wYXRfcHRyKGFyZykpOwogCQl9CkBAIC0xMjc2LDcgKzEzMTgsMTcgQEAKIGFzbWxpbmthZ2UgbG9uZwogY29tcGF0X3N5c19vcGVuKGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwgaW50IGZsYWdzLCBpbnQgbW9kZSkKIHsKLQlyZXR1cm4gZG9fc3lzX29wZW4oZmlsZW5hbWUsIGZsYWdzLCBtb2RlKTsKKwlyZXR1cm4gZG9fc3lzX29wZW4oQVRfRkRDV0QsIGZpbGVuYW1lLCBmbGFncywgbW9kZSk7Cit9CisKKy8qCisgKiBFeGFjdGx5IGxpa2UgZnMvb3Blbi5jOnN5c19vcGVuYXQoKSwgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCBzZXQgdGhlCisgKiBPX0xBUkdFRklMRSBmbGFnLgorICovCithc21saW5rYWdlIGxvbmcKK2NvbXBhdF9zeXNfb3BlbmF0KGludCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwgaW50IGZsYWdzLCBpbnQgbW9kZSkKK3sKKwlyZXR1cm4gZG9fc3lzX29wZW4oZGZkLCBmaWxlbmFtZSwgZmxhZ3MsIG1vZGUpOwogfQogCiAvKgpAQCAtMTUyMyw3ICsxNTc1LDcgQEAKICAqIE9vbywgbmFzdHkuICBXZSBuZWVkIGhlcmUgdG8gZnJvYiAzMi1iaXQgdW5zaWduZWQgbG9uZ3MgdG8KICAqIDY0LWJpdCB1bnNpZ25lZCBsb25ncy4KICAqLwotc3RhdGljIGlubGluZQorc3RhdGljCiBpbnQgY29tcGF0X2dldF9mZF9zZXQodW5zaWduZWQgbG9uZyBuciwgY29tcGF0X3Vsb25nX3QgX191c2VyICp1ZmRzZXQsCiAJCQl1bnNpZ25lZCBsb25nICpmZHNldCkKIHsKQEAgLTE1NTYsNyArMTYwOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUKK3N0YXRpYwogdm9pZCBjb21wYXRfc2V0X2ZkX3NldCh1bnNpZ25lZCBsb25nIG5yLCBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKnVmZHNldCwKIAkJCXVuc2lnbmVkIGxvbmcgKmZkc2V0KQogewpAQCAtMTYwNywzNiArMTY1OSwxNCBAQAogI2RlZmluZSBNQVhfU0VMRUNUX1NFQ09ORFMgXAogCSgodW5zaWduZWQgbG9uZykgKE1BWF9TQ0hFRFVMRV9USU1FT1VUIC8gSFopLTEpCiAKLWFzbWxpbmthZ2UgbG9uZwotY29tcGF0X3N5c19zZWxlY3QoaW50IG4sIGNvbXBhdF91bG9uZ190IF9fdXNlciAqaW5wLCBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKm91dHAsCi0JCWNvbXBhdF91bG9uZ190IF9fdXNlciAqZXhwLCBzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICp0dnApCitpbnQgY29tcGF0X2NvcmVfc3lzX3NlbGVjdChpbnQgbiwgY29tcGF0X3Vsb25nX3QgX191c2VyICppbnAsCisJY29tcGF0X3Vsb25nX3QgX191c2VyICpvdXRwLCBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKmV4cCwgczY0ICp0aW1lb3V0KQogewogCWZkX3NldF9iaXRzIGZkczsKIAljaGFyICpiaXRzOwotCWxvbmcgdGltZW91dDsKIAlpbnQgc2l6ZSwgbWF4X2Zkc2V0LCByZXQgPSAtRUlOVkFMOwogCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAKLQl0aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7Ci0JaWYgKHR2cCkgewotCQl0aW1lX3Qgc2VjLCB1c2VjOwotCi0JCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB0dnAsIHNpemVvZigqdHZwKSkKLQkJICAgIHx8IF9fZ2V0X3VzZXIoc2VjLCAmdHZwLT50dl9zZWMpCi0JCSAgICB8fCBfX2dldF91c2VyKHVzZWMsICZ0dnAtPnR2X3VzZWMpKSB7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJZ290byBvdXRfbm9mZHM7Ci0JCX0KLQotCQlpZiAoc2VjIDwgMCB8fCB1c2VjIDwgMCkKLQkJCWdvdG8gb3V0X25vZmRzOwotCi0JCWlmICgodW5zaWduZWQgbG9uZykgc2VjIDwgTUFYX1NFTEVDVF9TRUNPTkRTKSB7Ci0JCQl0aW1lb3V0ID0gUk9VTkRfVVAodXNlYywgMTAwMDAwMC9IWik7Ci0JCQl0aW1lb3V0ICs9IHNlYyAqICh1bnNpZ25lZCBsb25nKSBIWjsKLQkJfQotCX0KLQogCWlmIChuIDwgMCkKIAkJZ290byBvdXRfbm9mZHM7CiAKQEAgLTE2NzMsMTkgKzE3MDMsNyBAQAogCXplcm9fZmRfc2V0KG4sIGZkcy5yZXNfb3V0KTsKIAl6ZXJvX2ZkX3NldChuLCBmZHMucmVzX2V4KTsKIAotCXJldCA9IGRvX3NlbGVjdChuLCAmZmRzLCAmdGltZW91dCk7Ci0KLQlpZiAodHZwICYmICEoY3VycmVudC0+cGVyc29uYWxpdHkgJiBTVElDS1lfVElNRU9VVFMpKSB7Ci0JCXRpbWVfdCBzZWMgPSAwLCB1c2VjID0gMDsKLQkJaWYgKHRpbWVvdXQpIHsKLQkJCXNlYyA9IHRpbWVvdXQgLyBIWjsKLQkJCXVzZWMgPSB0aW1lb3V0ICUgSFo7Ci0JCQl1c2VjICo9ICgxMDAwMDAwL0haKTsKLQkJfQotCQlpZiAocHV0X3VzZXIoc2VjLCAmdHZwLT50dl9zZWMpIHx8Ci0JCSAgICBwdXRfdXNlcih1c2VjLCAmdHZwLT50dl91c2VjKSkKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JfQorCXJldCA9IGRvX3NlbGVjdChuLCAmZmRzLCB0aW1lb3V0KTsKIAogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKQEAgLTE3MDYsNiArMTcyNCwyMjQgQEAKIAlyZXR1cm4gcmV0OwogfQogCithc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zZWxlY3QoaW50IG4sIGNvbXBhdF91bG9uZ190IF9fdXNlciAqaW5wLAorCWNvbXBhdF91bG9uZ190IF9fdXNlciAqb3V0cCwgY29tcGF0X3Vsb25nX3QgX191c2VyICpleHAsCisJc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqdHZwKQoreworCXM2NCB0aW1lb3V0ID0gLTE7CisJc3RydWN0IGNvbXBhdF90aW1ldmFsIHR2OworCWludCByZXQ7CisKKwlpZiAodHZwKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdHYsIHR2cCwgc2l6ZW9mKHR2KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAodHYudHZfc2VjIDwgMCB8fCB0di50dl91c2VjIDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qIENhc3QgdG8gdTY0IHRvIG1ha2UgR0NDIHN0b3AgY29tcGxhaW5pbmcgKi8KKwkJaWYgKCh1NjQpdHYudHZfc2VjID49ICh1NjQpTUFYX0lOVDY0X1NFQ09ORFMpCisJCQl0aW1lb3V0ID0gLTE7CS8qIGluZmluaXRlICovCisJCWVsc2UgeworCQkJdGltZW91dCA9IFJPVU5EX1VQKHR2LnR2X3VzZWMsIDEwMDAwMDAvSFopOworCQkJdGltZW91dCArPSB0di50dl9zZWMgKiBIWjsKKwkJfQorCX0KKworCXJldCA9IGNvbXBhdF9jb3JlX3N5c19zZWxlY3QobiwgaW5wLCBvdXRwLCBleHAsICZ0aW1lb3V0KTsKKworCWlmICh0dnApIHsKKwkJaWYgKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgU1RJQ0tZX1RJTUVPVVRTKQorCQkJZ290byBzdGlja3k7CisJCXR2LnR2X3VzZWMgPSBqaWZmaWVzX3RvX3VzZWNzKGRvX2RpdigoKih1NjQqKSZ0aW1lb3V0KSwgSFopKTsKKwkJdHYudHZfc2VjID0gdGltZW91dDsKKwkJaWYgKGNvcHlfdG9fdXNlcih0dnAsICZ0diwgc2l6ZW9mKHR2KSkpIHsKK3N0aWNreToKKwkJCS8qCisJCQkgKiBJZiBhbiBhcHBsaWNhdGlvbiBwdXRzIGl0cyB0aW1ldmFsIGluIHJlYWQtb25seQorCQkJICogbWVtb3J5LCB3ZSBkb24ndCB3YW50IHRoZSBMaW51eC1zcGVjaWZpYyB1cGRhdGUgdG8KKwkJCSAqIHRoZSB0aW1ldmFsIHRvIGNhdXNlIGEgZmF1bHQgYWZ0ZXIgdGhlIHNlbGVjdCBoYXMKKwkJCSAqIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIEhvd2V2ZXIsIGJlY2F1c2Ugd2UncmUgbm90CisJCQkgKiB1cGRhdGluZyB0aGUgdGltZXZhbCwgd2UgY2FuJ3QgcmVzdGFydCB0aGUgc3lzdGVtCisJCQkgKiBjYWxsLgorCQkJICovCisJCQlpZiAocmV0ID09IC1FUkVTVEFSVE5PSEFORCkKKwkJCQlyZXQgPSAtRUlOVFI7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgVElGX1JFU1RPUkVfU0lHTUFTSworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfcHNlbGVjdDcoaW50IG4sIGNvbXBhdF91bG9uZ190IF9fdXNlciAqaW5wLAorCWNvbXBhdF91bG9uZ190IF9fdXNlciAqb3V0cCwgY29tcGF0X3Vsb25nX3QgX191c2VyICpleHAsCisJc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnRzcCwgY29tcGF0X3NpZ3NldF90IF9fdXNlciAqc2lnbWFzaywKKwljb21wYXRfc2l6ZV90IHNpZ3NldHNpemUpCit7CisJY29tcGF0X3NpZ3NldF90IHNzMzI7CisJc2lnc2V0X3Qga3NpZ21hc2ssIHNpZ3NhdmVkOworCWxvbmcgdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOworCXN0cnVjdCBjb21wYXRfdGltZXNwZWMgdHM7CisJaW50IHJldDsKKworCWlmICh0c3ApIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0cywgdHNwLCBzaXplb2YodHMpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmICh0cy50dl9zZWMgPCAwIHx8IHRzLnR2X25zZWMgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHNpZ21hc2spIHsKKwkJaWYgKHNpZ3NldHNpemUgIT0gc2l6ZW9mKGNvbXBhdF9zaWdzZXRfdCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzczMyLCBzaWdtYXNrLCBzaXplb2Yoc3MzMikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXNpZ3NldF9mcm9tX2NvbXBhdCgma3NpZ21hc2ssICZzczMyKTsKKworCQlzaWdkZWxzZXRtYXNrKCZrc2lnbWFzaywgc2lnbWFzayhTSUdLSUxMKXxzaWdtYXNrKFNJR1NUT1ApKTsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZrc2lnbWFzaywgJnNpZ3NhdmVkKTsKKwl9CisKKwlkbyB7CisJCWlmICh0c3ApIHsKKwkJCWlmICgodW5zaWduZWQgbG9uZyl0cy50dl9zZWMgPCBNQVhfU0VMRUNUX1NFQ09ORFMpIHsKKwkJCQl0aW1lb3V0ID0gUk9VTkRfVVAodHMudHZfbnNlYywgMTAwMDAwMDAwMC9IWik7CisJCQkJdGltZW91dCArPSB0cy50dl9zZWMgKiAodW5zaWduZWQgbG9uZylIWjsKKwkJCQl0cy50dl9zZWMgPSAwOworCQkJCXRzLnR2X25zZWMgPSAwOworCQkJfSBlbHNlIHsKKwkJCQl0cy50dl9zZWMgLT0gTUFYX1NFTEVDVF9TRUNPTkRTOworCQkJCXRpbWVvdXQgPSBNQVhfU0VMRUNUX1NFQ09ORFMgKiBIWjsKKwkJCX0KKwkJfQorCisJCXJldCA9IGNvbXBhdF9jb3JlX3N5c19zZWxlY3QobiwgaW5wLCBvdXRwLCBleHAsICZ0aW1lb3V0KTsKKworCX0gd2hpbGUgKCFyZXQgJiYgIXRpbWVvdXQgJiYgdHNwICYmICh0cy50dl9zZWMgfHwgdHMudHZfbnNlYykpOworCisJaWYgKHRzcCAmJiAhKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgU1RJQ0tZX1RJTUVPVVRTKSkgeworCQl0cy50dl9zZWMgKz0gdGltZW91dCAvIEhaOworCQl0cy50dl9uc2VjICs9ICh0aW1lb3V0ICUgSFopICogKDEwMDAwMDAwMDAvSFopOworCQlpZiAodHMudHZfbnNlYyA+PSAxMDAwMDAwMDAwKSB7CisJCQl0cy50dl9zZWMrKzsKKwkJCXRzLnR2X25zZWMgLT0gMTAwMDAwMDAwMDsKKwkJfQorCQkodm9pZCljb3B5X3RvX3VzZXIodHNwLCAmdHMsIHNpemVvZih0cykpOworCX0KKworCWlmIChyZXQgPT0gLUVSRVNUQVJUTk9IQU5EKSB7CisJCS8qCisJCSAqIERvbid0IHJlc3RvcmUgdGhlIHNpZ25hbCBtYXNrIHlldC4gTGV0IGRvX3NpZ25hbCgpIGRlbGl2ZXIKKwkJICogdGhlIHNpZ25hbCBvbiB0aGUgd2F5IGJhY2sgdG8gdXNlcnNwYWNlLCBiZWZvcmUgdGhlIHNpZ25hbAorCQkgKiBtYXNrIGlzIHJlc3RvcmVkLgorCQkgKi8KKwkJaWYgKHNpZ21hc2spIHsKKwkJCW1lbWNweSgmY3VycmVudC0+c2F2ZWRfc2lnbWFzaywgJnNpZ3NhdmVkLAorCQkJCQlzaXplb2Yoc2lnc2F2ZWQpKTsKKwkJCXNldF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwkJfQorCX0gZWxzZSBpZiAoc2lnbWFzaykKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZzaWdzYXZlZCwgTlVMTCk7CisKKwlyZXR1cm4gcmV0OworfQorCithc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19wc2VsZWN0NihpbnQgbiwgY29tcGF0X3Vsb25nX3QgX191c2VyICppbnAsCisJY29tcGF0X3Vsb25nX3QgX191c2VyICpvdXRwLCBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKmV4cCwKKwlzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqdHNwLCB2b2lkIF9fdXNlciAqc2lnKQoreworCWNvbXBhdF9zaXplX3Qgc2lnc2V0c2l6ZSA9IDA7CisJY29tcGF0X3VwdHJfdCB1cCA9IDA7CisKKwlpZiAoc2lnKSB7CisJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBzaWcsCisJCQkJc2l6ZW9mKGNvbXBhdF91cHRyX3QpK3NpemVvZihjb21wYXRfc2l6ZV90KSkgfHwKKwkJICAgIAlfX2dldF91c2VyKHVwLCAoY29tcGF0X3VwdHJfdCBfX3VzZXIgKilzaWcpIHx8CisJCSAgICAJX19nZXRfdXNlcihzaWdzZXRzaXplLAorCQkJCShjb21wYXRfc2l6ZV90IF9fdXNlciAqKShzaWcrc2l6ZW9mKHVwKSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiBjb21wYXRfc3lzX3BzZWxlY3Q3KG4sIGlucCwgb3V0cCwgZXhwLCB0c3AsIGNvbXBhdF9wdHIodXApLAorCQkJCQlzaWdzZXRzaXplKTsKK30KKworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfcHBvbGwoc3RydWN0IHBvbGxmZCBfX3VzZXIgKnVmZHMsCisJdW5zaWduZWQgaW50IG5mZHMsIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICp0c3AsCisJY29uc3QgY29tcGF0X3NpZ3NldF90IF9fdXNlciAqc2lnbWFzaywgY29tcGF0X3NpemVfdCBzaWdzZXRzaXplKQoreworCWNvbXBhdF9zaWdzZXRfdCBzczMyOworCXNpZ3NldF90IGtzaWdtYXNrLCBzaWdzYXZlZDsKKwlzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIHRzOworCXM2NCB0aW1lb3V0ID0gLTE7CisJaW50IHJldDsKKworCWlmICh0c3ApIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0cywgdHNwLCBzaXplb2YodHMpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCS8qIFdlIGFzc3VtZSB0aGF0IHRzLnR2X3NlYyBpcyBhbHdheXMgbG93ZXIgdGhhbgorCQkgICB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdGhhdCBjYW4gYmUgZXhwcmVzc2VkIGluCisJCSAgIGFuIHM2NC4gT3RoZXJ3aXNlIHRoZSBjb21waWxlciBiaXRjaGVzIGF0IHVzICovCisJCXRpbWVvdXQgPSBST1VORF9VUCh0cy50dl9uc2VjLCAxMDAwMDAwMDAwL0haKTsKKwkJdGltZW91dCArPSB0cy50dl9zZWMgKiBIWjsKKwl9CisKKwlpZiAoc2lnbWFzaykgeworCQlpZiAoc2lnc2V0c2l6ZSB8PSBzaXplb2YoY29tcGF0X3NpZ3NldF90KSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnNzMzIsIHNpZ21hc2ssIHNpemVvZihzczMyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc2lnc2V0X2Zyb21fY29tcGF0KCZrc2lnbWFzaywgJnNzMzIpOworCisJCXNpZ2RlbHNldG1hc2soJmtzaWdtYXNrLCBzaWdtYXNrKFNJR0tJTEwpfHNpZ21hc2soU0lHU1RPUCkpOworCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmtzaWdtYXNrLCAmc2lnc2F2ZWQpOworCX0KKworCXJldCA9IGRvX3N5c19wb2xsKHVmZHMsIG5mZHMsICZ0aW1lb3V0KTsKKworCS8qIFdlIGNhbiByZXN0YXJ0IHRoaXMgc3lzY2FsbCwgdXN1YWxseSAqLworCWlmIChyZXQgPT0gLUVJTlRSKSB7CisJCS8qCisJCSAqIERvbid0IHJlc3RvcmUgdGhlIHNpZ25hbCBtYXNrIHlldC4gTGV0IGRvX3NpZ25hbCgpIGRlbGl2ZXIKKwkJICogdGhlIHNpZ25hbCBvbiB0aGUgd2F5IGJhY2sgdG8gdXNlcnNwYWNlLCBiZWZvcmUgdGhlIHNpZ25hbAorCQkgKiBtYXNrIGlzIHJlc3RvcmVkLgorCQkgKi8KKwkJaWYgKHNpZ21hc2spIHsKKwkJCW1lbWNweSgmY3VycmVudC0+c2F2ZWRfc2lnbWFzaywgJnNpZ3NhdmVkLAorCQkJCXNpemVvZihzaWdzYXZlZCkpOworCQkJc2V0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOworCQl9CisJCXJldCA9IC1FUkVTVEFSVE5PSEFORDsKKwl9IGVsc2UgaWYgKHNpZ21hc2spCisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmc2lnc2F2ZWQsIE5VTEwpOworCisJaWYgKHRzcCAmJiB0aW1lb3V0ID49IDApIHsKKwkJaWYgKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgU1RJQ0tZX1RJTUVPVVRTKQorCQkJZ290byBzdGlja3k7CisJCS8qIFllcywgd2Uga25vdyBpdCdzIGFjdHVhbGx5IGFuIHM2NCwgYnV0IGl0J3MgYWxzbyBwb3NpdGl2ZS4gKi8KKwkJdHMudHZfbnNlYyA9IGppZmZpZXNfdG9fdXNlY3MoZG9fZGl2KCgqKHU2NCopJnRpbWVvdXQpLCBIWikpICogMTAwMDsKKwkJdHMudHZfc2VjID0gdGltZW91dDsKKwkJaWYgKGNvcHlfdG9fdXNlcih0c3AsICZ0cywgc2l6ZW9mKHRzKSkpIHsKK3N0aWNreToKKwkJCS8qCisJCQkgKiBJZiBhbiBhcHBsaWNhdGlvbiBwdXRzIGl0cyB0aW1ldmFsIGluIHJlYWQtb25seQorCQkJICogbWVtb3J5LCB3ZSBkb24ndCB3YW50IHRoZSBMaW51eC1zcGVjaWZpYyB1cGRhdGUgdG8KKwkJCSAqIHRoZSB0aW1ldmFsIHRvIGNhdXNlIGEgZmF1bHQgYWZ0ZXIgdGhlIHNlbGVjdCBoYXMKKwkJCSAqIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIEhvd2V2ZXIsIGJlY2F1c2Ugd2UncmUgbm90CisJCQkgKiB1cGRhdGluZyB0aGUgdGltZXZhbCwgd2UgY2FuJ3QgcmVzdGFydCB0aGUgc3lzdGVtCisJCQkgKiBjYWxsLgorCQkJICovCisJCQlpZiAocmV0ID09IC1FUkVTVEFSVE5PSEFORCAmJiB0aW1lb3V0ID49IDApCisJCQkJcmV0ID0gLUVJTlRSOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZiAvKiBUSUZfUkVTVE9SRV9TSUdNQVNLICovCisKICNpZiBkZWZpbmVkKENPTkZJR19ORlNEKSB8fCBkZWZpbmVkKENPTkZJR19ORlNEX01PRFVMRSkKIC8qIFN0dWZmIGZvciBORlMgc2VydmVyIHN5c2NhbGxzLi4uICovCiBzdHJ1Y3QgY29tcGF0X25mc2N0bF9zdmMgewpkaWZmIC0tZ2l0IGEvZnMvY29tcGF0X2lvY3RsLmMgYi9mcy9jb21wYXRfaW9jdGwuYwppbmRleCA0M2EyNTA4Li41ZGQwMjA3IDEwMDY0NAotLS0gYS9mcy9jb21wYXRfaW9jdGwuYworKysgYi9mcy9jb21wYXRfaW9jdGwuYwpAQCAtMTAsMTEgKzEwLDExIEBACiAgKiBpb2N0bHMuCiAgKi8KIAotI2lmZGVmIElOQ0xVREVTCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgpAQCAtODEsMTMgKzgxLDkgQEAKICNpbmNsdWRlIDxsaW51eC9jYXBpLmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KLS8qIFVnbHkgaGFjay4gKi8KLSN1bmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+Ci0jZGVmaW5lIF9fS0VSTkVMX18KICNpbmNsdWRlIDxzY3NpL3NnLmg+CiAKLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9taWkuaD4KQEAgLTk1LDcgKzkxLDYgQEAKICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtLWlvY3RsLmg+CiAKLSNpbmNsdWRlIDxhc20vbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CiAjaW5jbHVkZSA8bGludXgvbHAuaD4KICNpbmNsdWRlIDxsaW51eC9wcGRldi5oPgpAQCAtMTI3LDExICsxMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2R2Yi9kbXguaD4KICNpbmNsdWRlIDxsaW51eC9kdmIvZnJvbnRlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9kdmIvdmlkZW8uaD4KLQotI3VuZGVmIElOQ0xVREVTCi0jZW5kaWYKLQotI2lmZGVmIENPREUKKyNpbmNsdWRlIDxsaW51eC9scC5oPgogCiAvKiBBaWVlLiBTb21lb25lIGRvZXMgbm90IGZpbmQgYSBkaWZmZXJlbmNlIGJldHdlZW4gaW50IGFuZCBsb25nICovCiAjZGVmaW5lIEVYVDJfSU9DMzJfR0VURkxBR1MgICAgICAgICAgICAgICBfSU9SKCdmJywgMSwgaW50KQpAQCAtMTQ4LDYgKzEzOSwxMiBAQAogI2RlZmluZSBFWFQyX0lPQzMyX0dFVFZFUlNJT04gICAgICAgICAgICAgX0lPUigndicsIDEsIGludCkKICNkZWZpbmUgRVhUMl9JT0MzMl9TRVRWRVJTSU9OICAgICAgICAgICAgIF9JT1coJ3YnLCAyLCBpbnQpCiAKK3N0YXRpYyBpbnQgZG9faW9jdGwzMl9wb2ludGVyKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgZmlsZSAqZikKK3sKKwlyZXR1cm4gc3lzX2lvY3RsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKWNvbXBhdF9wdHIoYXJnKSk7Cit9CisKIHN0YXRpYyBpbnQgd19sb25nKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOwpAQCAtMjA3LDI0NCArMjA0LDYgQEAKIAlyZXR1cm4gc3lzX2lvY3RsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKWNvbXBhdF9wdHIoYXJnKSk7CiB9CiAKLXN0cnVjdCB2aWRlb190dW5lcjMyIHsKLQljb21wYXRfaW50X3QgdHVuZXI7Ci0JY2hhciBuYW1lWzMyXTsKLQljb21wYXRfdWxvbmdfdCByYW5nZWxvdywgcmFuZ2VoaWdoOwotCXUzMiBmbGFnczsJLyogSXQgaXMgcmVhbGx5IHUzMiBpbiB2aWRlb2Rldi5oICovCi0JdTE2IG1vZGUsIHNpZ25hbDsKLX07Ci0KLXN0YXRpYyBpbnQgZ2V0X3ZpZGVvX3R1bmVyMzIoc3RydWN0IHZpZGVvX3R1bmVyICprcCwgc3RydWN0IHZpZGVvX3R1bmVyMzIgX191c2VyICp1cCkKLXsKLQlpbnQgaTsKLQotCWlmKGdldF91c2VyKGtwLT50dW5lciwgJnVwLT50dW5lcikpCi0JCXJldHVybiAtRUZBVUxUOwotCWZvcihpID0gMDsgaSA8IDMyOyBpKyspCi0JCV9fZ2V0X3VzZXIoa3AtPm5hbWVbaV0sICZ1cC0+bmFtZVtpXSk7Ci0JX19nZXRfdXNlcihrcC0+cmFuZ2Vsb3csICZ1cC0+cmFuZ2Vsb3cpOwotCV9fZ2V0X3VzZXIoa3AtPnJhbmdlaGlnaCwgJnVwLT5yYW5nZWhpZ2gpOwotCV9fZ2V0X3VzZXIoa3AtPmZsYWdzLCAmdXAtPmZsYWdzKTsKLQlfX2dldF91c2VyKGtwLT5tb2RlLCAmdXAtPm1vZGUpOwotCV9fZ2V0X3VzZXIoa3AtPnNpZ25hbCwgJnVwLT5zaWduYWwpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHB1dF92aWRlb190dW5lcjMyKHN0cnVjdCB2aWRlb190dW5lciAqa3AsIHN0cnVjdCB2aWRlb190dW5lcjMyIF9fdXNlciAqdXApCi17Ci0JaW50IGk7Ci0KLQlpZihwdXRfdXNlcihrcC0+dHVuZXIsICZ1cC0+dHVuZXIpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlmb3IoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQlfX3B1dF91c2VyKGtwLT5uYW1lW2ldLCAmdXAtPm5hbWVbaV0pOwotCV9fcHV0X3VzZXIoa3AtPnJhbmdlbG93LCAmdXAtPnJhbmdlbG93KTsKLQlfX3B1dF91c2VyKGtwLT5yYW5nZWhpZ2gsICZ1cC0+cmFuZ2VoaWdoKTsKLQlfX3B1dF91c2VyKGtwLT5mbGFncywgJnVwLT5mbGFncyk7Ci0JX19wdXRfdXNlcihrcC0+bW9kZSwgJnVwLT5tb2RlKTsKLQlfX3B1dF91c2VyKGtwLT5zaWduYWwsICZ1cC0+c2lnbmFsKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IHZpZGVvX2J1ZmZlcjMyIHsKLQljb21wYXRfY2FkZHJfdCBiYXNlOwotCWNvbXBhdF9pbnRfdCBoZWlnaHQsIHdpZHRoLCBkZXB0aCwgYnl0ZXNwZXJsaW5lOwotfTsKLQotc3RhdGljIGludCBnZXRfdmlkZW9fYnVmZmVyMzIoc3RydWN0IHZpZGVvX2J1ZmZlciAqa3AsIHN0cnVjdCB2aWRlb19idWZmZXIzMiBfX3VzZXIgKnVwKQotewotCXUzMiB0bXA7Ci0KLQlpZiAoZ2V0X3VzZXIodG1wLCAmdXAtPmJhc2UpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCS8qIFRoaXMgaXMgYWN0dWFsbHkgYSBwaHlzaWNhbCBhZGRyZXNzIHN0b3JlZAotCSAqIGFzIGEgdm9pZCBwb2ludGVyLgotCSAqLwotCWtwLT5iYXNlID0gKHZvaWQgKikodW5zaWduZWQgbG9uZykgdG1wOwotCi0JX19nZXRfdXNlcihrcC0+aGVpZ2h0LCAmdXAtPmhlaWdodCk7Ci0JX19nZXRfdXNlcihrcC0+d2lkdGgsICZ1cC0+d2lkdGgpOwotCV9fZ2V0X3VzZXIoa3AtPmRlcHRoLCAmdXAtPmRlcHRoKTsKLQlfX2dldF91c2VyKGtwLT5ieXRlc3BlcmxpbmUsICZ1cC0+Ynl0ZXNwZXJsaW5lKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwdXRfdmlkZW9fYnVmZmVyMzIoc3RydWN0IHZpZGVvX2J1ZmZlciAqa3AsIHN0cnVjdCB2aWRlb19idWZmZXIzMiBfX3VzZXIgKnVwKQotewotCXUzMiB0bXAgPSAodTMyKSgodW5zaWduZWQgbG9uZylrcC0+YmFzZSk7Ci0KLQlpZihwdXRfdXNlcih0bXAsICZ1cC0+YmFzZSkpCi0JCXJldHVybiAtRUZBVUxUOwotCV9fcHV0X3VzZXIoa3AtPmhlaWdodCwgJnVwLT5oZWlnaHQpOwotCV9fcHV0X3VzZXIoa3AtPndpZHRoLCAmdXAtPndpZHRoKTsKLQlfX3B1dF91c2VyKGtwLT5kZXB0aCwgJnVwLT5kZXB0aCk7Ci0JX19wdXRfdXNlcihrcC0+Ynl0ZXNwZXJsaW5lLCAmdXAtPmJ5dGVzcGVybGluZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCB2aWRlb19jbGlwMzIgewotCXMzMiB4LCB5LCB3aWR0aCwgaGVpZ2h0OwkvKiBJdHMgcmVhbGx5IHMzMiBpbiB2aWRlb2Rldi5oICovCi0JY29tcGF0X2NhZGRyX3QgbmV4dDsKLX07Ci0KLXN0cnVjdCB2aWRlb193aW5kb3czMiB7Ci0JdTMyIHgsIHksIHdpZHRoLCBoZWlnaHQsIGNocm9tYWtleSwgZmxhZ3M7Ci0JY29tcGF0X2NhZGRyX3QgY2xpcHM7Ci0JY29tcGF0X2ludF90IGNsaXBjb3VudDsKLX07Ci0KLS8qIFlvdSBnZXQgYmFjayBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgY2xpcHMuLi4gKi8KLXN0YXRpYyBpbnQgcHV0X3ZpZGVvX3dpbmRvdzMyKHN0cnVjdCB2aWRlb193aW5kb3cgKmtwLCBzdHJ1Y3QgdmlkZW9fd2luZG93MzIgX191c2VyICp1cCkKLXsKLQlpZihwdXRfdXNlcihrcC0+eCwgJnVwLT54KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JX19wdXRfdXNlcihrcC0+eSwgJnVwLT55KTsKLQlfX3B1dF91c2VyKGtwLT53aWR0aCwgJnVwLT53aWR0aCk7Ci0JX19wdXRfdXNlcihrcC0+aGVpZ2h0LCAmdXAtPmhlaWdodCk7Ci0JX19wdXRfdXNlcihrcC0+Y2hyb21ha2V5LCAmdXAtPmNocm9tYWtleSk7Ci0JX19wdXRfdXNlcihrcC0+ZmxhZ3MsICZ1cC0+ZmxhZ3MpOwotCV9fcHV0X3VzZXIoa3AtPmNsaXBjb3VudCwgJnVwLT5jbGlwY291bnQpOwotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIFZJRElPQ0dUVU5FUjMyCQlfSU9XUigndicsNCwgc3RydWN0IHZpZGVvX3R1bmVyMzIpCi0jZGVmaW5lIFZJRElPQ1NUVU5FUjMyCQlfSU9XKCd2Jyw1LCBzdHJ1Y3QgdmlkZW9fdHVuZXIzMikKLSNkZWZpbmUgVklESU9DR1dJTjMyCQlfSU9SKCd2Jyw5LCBzdHJ1Y3QgdmlkZW9fd2luZG93MzIpCi0jZGVmaW5lIFZJRElPQ1NXSU4zMgkJX0lPVygndicsMTAsIHN0cnVjdCB2aWRlb193aW5kb3czMikKLSNkZWZpbmUgVklESU9DR0ZCVUYzMgkJX0lPUigndicsMTEsIHN0cnVjdCB2aWRlb19idWZmZXIzMikKLSNkZWZpbmUgVklESU9DU0ZCVUYzMgkJX0lPVygndicsMTIsIHN0cnVjdCB2aWRlb19idWZmZXIzMikKLSNkZWZpbmUgVklESU9DR0ZSRVEzMgkJX0lPUigndicsMTQsIHUzMikKLSNkZWZpbmUgVklESU9DU0ZSRVEzMgkJX0lPVygndicsMTUsIHUzMikKLQotZW51bSB7Ci0JTWF4Q2xpcHMgPSAofjBVLXNpemVvZihzdHJ1Y3QgdmlkZW9fd2luZG93KSkvc2l6ZW9mKHN0cnVjdCB2aWRlb19jbGlwKQotfTsKLQotc3RhdGljIGludCBkb19zZXRfd2luZG93KHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHZpZGVvX3dpbmRvdzMyIF9fdXNlciAqdXAgPSBjb21wYXRfcHRyKGFyZyk7Ci0Jc3RydWN0IHZpZGVvX3dpbmRvdyBfX3VzZXIgKnZ3OwotCXN0cnVjdCB2aWRlb19jbGlwIF9fdXNlciAqcDsKLQlpbnQgbmNsaXBzOwotCXUzMiBuOwotCi0JaWYgKGdldF91c2VyKG5jbGlwcywgJnVwLT5jbGlwY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCS8qIFBlY3VsaWFyIGludGVyZmFjZS4uLiAqLwotCWlmIChuY2xpcHMgPCAwKQotCQluY2xpcHMgPSBWSURFT19DTElQTUFQX1NJWkU7Ci0KLQlpZiAobmNsaXBzID4gTWF4Q2xpcHMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JdncgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2Yoc3RydWN0IHZpZGVvX3dpbmRvdykgKwotCQkJCSAgICBuY2xpcHMgKiBzaXplb2Yoc3RydWN0IHZpZGVvX2NsaXApKTsKLQotCXAgPSBuY2xpcHMgPyAoc3RydWN0IHZpZGVvX2NsaXAgX191c2VyICopKHZ3ICsgMSkgOiBOVUxMOwotCi0JaWYgKGdldF91c2VyKG4sICZ1cC0+eCkgfHwgcHV0X3VzZXIobiwgJnZ3LT54KSB8fAotCSAgICBnZXRfdXNlcihuLCAmdXAtPnkpIHx8IHB1dF91c2VyKG4sICZ2dy0+eSkgfHwKLQkgICAgZ2V0X3VzZXIobiwgJnVwLT53aWR0aCkgfHwgcHV0X3VzZXIobiwgJnZ3LT53aWR0aCkgfHwKLQkgICAgZ2V0X3VzZXIobiwgJnVwLT5oZWlnaHQpIHx8IHB1dF91c2VyKG4sICZ2dy0+aGVpZ2h0KSB8fAotCSAgICBnZXRfdXNlcihuLCAmdXAtPmNocm9tYWtleSkgfHwgcHV0X3VzZXIobiwgJnZ3LT5jaHJvbWFrZXkpIHx8Ci0JICAgIGdldF91c2VyKG4sICZ1cC0+ZmxhZ3MpIHx8IHB1dF91c2VyKG4sICZ2dy0+ZmxhZ3MpIHx8Ci0JICAgIGdldF91c2VyKG4sICZ1cC0+Y2xpcGNvdW50KSB8fCBwdXRfdXNlcihuLCAmdnctPmNsaXBjb3VudCkgfHwKLQkgICAgZ2V0X3VzZXIobiwgJnVwLT5jbGlwcykgfHwgcHV0X3VzZXIocCwgJnZ3LT5jbGlwcykpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKG5jbGlwcykgewotCQlzdHJ1Y3QgdmlkZW9fY2xpcDMyIF9fdXNlciAqdSA9IGNvbXBhdF9wdHIobik7Ci0JCWludCBpOwotCQlpZiAoIXUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJZm9yIChpID0gMDsgaSA8IG5jbGlwczsgaSsrLCB1KyssIHArKykgewotCQkJczMyIHY7Ci0JCQlpZiAoZ2V0X3VzZXIodiwgJnUtPngpIHx8Ci0JCQkgICAgcHV0X3VzZXIodiwgJnAtPngpIHx8Ci0JCQkgICAgZ2V0X3VzZXIodiwgJnUtPnkpIHx8Ci0JCQkgICAgcHV0X3VzZXIodiwgJnAtPnkpIHx8Ci0JCQkgICAgZ2V0X3VzZXIodiwgJnUtPndpZHRoKSB8fAotCQkJICAgIHB1dF91c2VyKHYsICZwLT53aWR0aCkgfHwKLQkJCSAgICBnZXRfdXNlcih2LCAmdS0+aGVpZ2h0KSB8fAotCQkJICAgIHB1dF91c2VyKHYsICZwLT5oZWlnaHQpIHx8Ci0JCQkgICAgcHV0X3VzZXIoTlVMTCwgJnAtPm5leHQpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JfQotCi0JcmV0dXJuIHN5c19pb2N0bChmZCwgVklESU9DU1dJTiwgKHVuc2lnbmVkIGxvbmcpcCk7Ci19Ci0KLXN0YXRpYyBpbnQgZG9fdmlkZW9faW9jdGwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB2aWRlb190dW5lciB2dDsKLQkJc3RydWN0IHZpZGVvX2J1ZmZlciB2YjsKLQkJc3RydWN0IHZpZGVvX3dpbmRvdyB2dzsKLQkJdW5zaWduZWQgbG9uZyB2eDsKLQl9IGthcmc7Ci0JbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOwotCXZvaWQgX191c2VyICp1cCA9IGNvbXBhdF9wdHIoYXJnKTsKLQlpbnQgZXJyID0gMDsKLQotCS8qIEZpcnN0LCBjb252ZXJ0IHRoZSBjb21tYW5kLiAqLwotCXN3aXRjaChjbWQpIHsKLQljYXNlIFZJRElPQ0dUVU5FUjMyOiBjbWQgPSBWSURJT0NHVFVORVI7IGJyZWFrOwotCWNhc2UgVklESU9DU1RVTkVSMzI6IGNtZCA9IFZJRElPQ1NUVU5FUjsgYnJlYWs7Ci0JY2FzZSBWSURJT0NHV0lOMzI6IGNtZCA9IFZJRElPQ0dXSU47IGJyZWFrOwotCWNhc2UgVklESU9DR0ZCVUYzMjogY21kID0gVklESU9DR0ZCVUY7IGJyZWFrOwotCWNhc2UgVklESU9DU0ZCVUYzMjogY21kID0gVklESU9DU0ZCVUY7IGJyZWFrOwotCWNhc2UgVklESU9DR0ZSRVEzMjogY21kID0gVklESU9DR0ZSRVE7IGJyZWFrOwotCWNhc2UgVklESU9DU0ZSRVEzMjogY21kID0gVklESU9DU0ZSRVE7IGJyZWFrOwotCX07Ci0KLQlzd2l0Y2goY21kKSB7Ci0JY2FzZSBWSURJT0NTVFVORVI6Ci0JY2FzZSBWSURJT0NHVFVORVI6Ci0JCWVyciA9IGdldF92aWRlb190dW5lcjMyKCZrYXJnLnZ0LCB1cCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NTRkJVRjoKLQkJZXJyID0gZ2V0X3ZpZGVvX2J1ZmZlcjMyKCZrYXJnLnZiLCB1cCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NTRlJFUToKLQkJZXJyID0gZ2V0X3VzZXIoa2FyZy52eCwgKHUzMiBfX3VzZXIgKil1cCk7Ci0JCWJyZWFrOwotCX07Ci0JaWYoZXJyKQotCQlnb3RvIG91dDsKLQotCXNldF9mcyhLRVJORUxfRFMpOwotCWVyciA9IHN5c19pb2N0bChmZCwgY21kLCAodW5zaWduZWQgbG9uZykma2FyZyk7Ci0Jc2V0X2ZzKG9sZF9mcyk7Ci0KLQlpZihlcnIgPT0gMCkgewotCQlzd2l0Y2goY21kKSB7Ci0JCWNhc2UgVklESU9DR1RVTkVSOgotCQkJZXJyID0gcHV0X3ZpZGVvX3R1bmVyMzIoJmthcmcudnQsIHVwKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVklESU9DR1dJTjoKLQkJCWVyciA9IHB1dF92aWRlb193aW5kb3czMigma2FyZy52dywgdXApOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBWSURJT0NHRkJVRjoKLQkJCWVyciA9IHB1dF92aWRlb19idWZmZXIzMigma2FyZy52YiwgdXApOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBWSURJT0NHRlJFUToKLQkJCWVyciA9IHB1dF91c2VyKCgodTMyKWthcmcudngpLCAodTMyIF9fdXNlciAqKXVwKTsKLQkJCWJyZWFrOwotCQl9OwotCX0KLW91dDoKLQlyZXR1cm4gZXJyOwotfQotCiBzdHJ1Y3QgY29tcGF0X2RteF9ldmVudCB7CiAJZG14X2V2ZW50X3QJZXZlbnQ7CiAJY29tcGF0X3RpbWVfdAl0aW1lU3RhbXA7CkBAIC0xMTU4LDYgKzkxNyw0MCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0cnVjdCBjb21wYXRfc2dfcmVxX2luZm8geyAvKiB1c2VkIGJ5IFNHX0dFVF9SRVFVRVNUX1RBQkxFIGlvY3RsKCkgKi8KKwljaGFyIHJlcV9zdGF0ZTsKKwljaGFyIG9ycGhhbjsKKwljaGFyIHNnX2lvX293bmVkOworCWNoYXIgcHJvYmxlbTsKKwlpbnQgcGFja19pZDsKKwljb21wYXRfdXB0cl90IHVzcl9wdHI7CisJdW5zaWduZWQgaW50IGR1cmF0aW9uOworCWludCB1bnVzZWQ7Cit9OworCitzdGF0aWMgaW50IHNnX2dydF90cmFucyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBlcnIsIGk7CisJc2dfcmVxX2luZm9fdCAqcjsKKwlzdHJ1Y3QgY29tcGF0X3NnX3JlcV9pbmZvICpvID0gKHN0cnVjdCBjb21wYXRfc2dfcmVxX2luZm8gKilhcmc7CisJciA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZihzZ19yZXFfaW5mb190KSpTR19NQVhfUVVFVUUpOworCWVyciA9IHN5c19pb2N0bChmZCxjbWQsKHVuc2lnbmVkIGxvbmcpcik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZm9yIChpID0gMDsgaSA8IFNHX01BWF9RVUVVRTsgaSsrKSB7CisJCXZvaWQgX191c2VyICpwdHI7CisJCWludCBkOworCisJCWlmIChjb3B5X2luX3VzZXIobyArIGksIHIgKyBpLCBvZmZzZXRvZihzZ19yZXFfaW5mb190LCB1c3JfcHRyKSkgfHwKKwkJICAgIGdldF91c2VyKHB0ciwgJnJbaV0udXNyX3B0cikgfHwKKwkJICAgIGdldF91c2VyKGQsICZyW2ldLmR1cmF0aW9uKSB8fAorCQkgICAgcHV0X3VzZXIoKHUzMikodW5zaWduZWQgbG9uZykocHRyKSwgJm9baV0udXNyX3B0cikgfHwKKwkJICAgIHB1dF91c2VyKGQsICZvW2ldLmR1cmF0aW9uKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gZXJyOworfQorCiBzdHJ1Y3Qgc29ja19mcHJvZzMyIHsKIAl1bnNpZ25lZCBzaG9ydAlsZW47CiAJY29tcGF0X2NhZGRyX3QJZmlsdGVyOwpAQCAtMjcxMyw2ICsyNTA2LDQ5IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKKyNkZWZpbmUgUlRDX0lSUVBfUkVBRDMyCQlfSU9SKCdwJywgMHgwYiwgY29tcGF0X3Vsb25nX3QpCisjZGVmaW5lIFJUQ19JUlFQX1NFVDMyCQlfSU9XKCdwJywgMHgwYywgY29tcGF0X3Vsb25nX3QpCisjZGVmaW5lIFJUQ19FUE9DSF9SRUFEMzIJX0lPUigncCcsIDB4MGQsIGNvbXBhdF91bG9uZ190KQorI2RlZmluZSBSVENfRVBPQ0hfU0VUMzIJCV9JT1coJ3AnLCAweDBlLCBjb21wYXRfdWxvbmdfdCkKKworc3RhdGljIGludCBydGNfaW9jdGwodW5zaWduZWQgZmQsIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJbW1fc2VnbWVudF90IG9sZGZzID0gZ2V0X2ZzKCk7CisJY29tcGF0X3Vsb25nX3QgdmFsMzI7CisJdW5zaWduZWQgbG9uZyBrdmFsOworCWludCByZXQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUlRDX0lSUVBfUkVBRDMyOgorCWNhc2UgUlRDX0VQT0NIX1JFQUQzMjoKKwkJc2V0X2ZzKEtFUk5FTF9EUyk7CisJCXJldCA9IHN5c19pb2N0bChmZCwgKGNtZCA9PSBSVENfSVJRUF9SRUFEMzIpID8KKwkJCQkJUlRDX0lSUVBfUkVBRCA6IFJUQ19FUE9DSF9SRUFELAorCQkJCQkodW5zaWduZWQgbG9uZykma3ZhbCk7CisJCXNldF9mcyhvbGRmcyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQl2YWwzMiA9IGt2YWw7CisJCXJldHVybiBwdXRfdXNlcih2YWwzMiwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmcpOworCWNhc2UgUlRDX0lSUVBfU0VUMzI6CisJY2FzZSBSVENfRVBPQ0hfU0VUMzI6CisJCXJldCA9IGdldF91c2VyKHZhbDMyLCAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlrdmFsID0gdmFsMzI7CisKKwkJc2V0X2ZzKEtFUk5FTF9EUyk7CisJCXJldCA9IHN5c19pb2N0bChmZCwgKGNtZCA9PSBSVENfSVJRUF9TRVQzMikgPworCQkJCVJUQ19JUlFQX1NFVCA6IFJUQ19FUE9DSF9TRVQsCisJCQkJKHVuc2lnbmVkIGxvbmcpJmt2YWwpOworCQlzZXRfZnMob2xkZnMpOworCQlyZXR1cm4gcmV0OworCWRlZmF1bHQ6CisJCS8qIHVucmVhY2hlZCAqLworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KK30KKwogI2lmIGRlZmluZWQoQ09ORklHX05DUF9GUykgfHwgZGVmaW5lZChDT05GSUdfTkNQX0ZTX01PRFVMRSkKIHN0cnVjdCBuY3BfaW9jdGxfcmVxdWVzdF8zMiB7CiAJdTMyIGZ1bmN0aW9uOwpAQCAtMjkwMCwxMCArMjczNiwzNCBAQAogfQogI2VuZGlmCiAKLSN1bmRlZiBDT0RFCi0jZW5kaWYKK3N0YXRpYyBpbnQKK2xwX3RpbWVvdXRfdHJhbnModW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgKnRjID0gKHN0cnVjdCBjb21wYXRfdGltZXZhbCAqKWFyZzsKKwlzdHJ1Y3QgdGltZXZhbCAqdG4gPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKKwlzdHJ1Y3QgdGltZXZhbCB0czsKKwlpZiAoZ2V0X3VzZXIodHMudHZfc2VjLCAmdGMtPnR2X3NlYykgfHwKKwkgICAgZ2V0X3VzZXIodHMudHZfdXNlYywgJnRjLT50dl91c2VjKSB8fAorCSAgICBwdXRfdXNlcih0cy50dl9zZWMsICZ0bi0+dHZfc2VjKSB8fAorCSAgICBwdXRfdXNlcih0cy50dl91c2VjLCAmdG4tPnR2X3VzZWMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gc3lzX2lvY3RsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKXRuKTsKK30KIAotI2lmZGVmIERFQ0xBUkVTCisjZGVmaW5lIEhBTkRMRV9JT0NUTChjbWQsaGFuZGxlcikgXAorCXsgKGNtZCksIChpb2N0bF90cmFuc19oYW5kbGVyX3QpKGhhbmRsZXIpIH0sCisKKy8qIHBvaW50ZXIgdG8gY29tcGF0aWJsZSBzdHJ1Y3R1cmUgb3Igbm8gYXJndW1lbnQgKi8KKyNkZWZpbmUgQ09NUEFUSUJMRV9JT0NUTChjbWQpIFwKKwl7IChjbWQpLCBkb19pb2N0bDMyX3BvaW50ZXIgfSwKKworLyogYXJndW1lbnQgaXMgYW4gdW5zaWduZWQgbG9uZyBpbnRlZ2VyLCBub3QgYSBwb2ludGVyICovCisjZGVmaW5lIFVMT05HX0lPQ1RMKGNtZCkgXAorCXsgKGNtZCksIChpb2N0bF90cmFuc19oYW5kbGVyX3Qpc3lzX2lvY3RsIH0sCisKKworc3RydWN0IGlvY3RsX3RyYW5zIGlvY3RsX3N0YXJ0W10gPSB7CisjaW5jbHVkZSA8bGludXgvY29tcGF0X2lvY3RsLmg+CiBIQU5ETEVfSU9DVEwoTUVNUkVBRE9PQjMyLCBtdGRfcndfb29iKQogSEFORExFX0lPQ1RMKE1FTVdSSVRFT09CMzIsIG10ZF9yd19vb2IpCiAjaWZkZWYgQ09ORklHX05FVApAQCAtMjk4Myw2ICsyODQzLDcgQEAKIEhBTkRMRV9JT0NUTChGREdFVEZEQ1NUQVQzMiwgZmRfaW9jdGxfdHJhbnMpCiBIQU5ETEVfSU9DVEwoRkRXRVJST1JHRVQzMiwgZmRfaW9jdGxfdHJhbnMpCiBIQU5ETEVfSU9DVEwoU0dfSU8sc2dfaW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoU0dfR0VUX1JFUVVFU1RfVEFCTEUsIHNnX2dydF90cmFucykKIEhBTkRMRV9JT0NUTChQUFBJT0NHSURMRTMyLCBwcHBfaW9jdGxfdHJhbnMpCiBIQU5ETEVfSU9DVEwoUFBQSU9DU0NPTVBSRVNTMzIsIHBwcF9pb2N0bF90cmFucykKIEhBTkRMRV9JT0NUTChQUFBJT0NTUEFTUzMyLCBwcHBfc29ja19mcHJvZ19pb2N0bF90cmFucykKQEAgLTMwMTUsMTQgKzI4NzYsNiBAQAogI2lmZGVmIENPTkZJR19KQkRfREVCVUcKIEhBTkRMRV9JT0NUTChFWFQzX0lPQzMyX1dBSVRfRk9SX1JFQURPTkxZLCBkb19leHQzX2lvY3RsKQogI2VuZGlmCi1IQU5ETEVfSU9DVEwoVklESU9DR1RVTkVSMzIsIGRvX3ZpZGVvX2lvY3RsKQotSEFORExFX0lPQ1RMKFZJRElPQ1NUVU5FUjMyLCBkb192aWRlb19pb2N0bCkKLUhBTkRMRV9JT0NUTChWSURJT0NHV0lOMzIsIGRvX3ZpZGVvX2lvY3RsKQotSEFORExFX0lPQ1RMKFZJRElPQ1NXSU4zMiwgZG9fc2V0X3dpbmRvdykKLUhBTkRMRV9JT0NUTChWSURJT0NHRkJVRjMyLCBkb192aWRlb19pb2N0bCkKLUhBTkRMRV9JT0NUTChWSURJT0NTRkJVRjMyLCBkb192aWRlb19pb2N0bCkKLUhBTkRMRV9JT0NUTChWSURJT0NHRlJFUTMyLCBkb192aWRlb19pb2N0bCkKLUhBTkRMRV9JT0NUTChWSURJT0NTRlJFUTMyLCBkb192aWRlb19pb2N0bCkKIC8qIE9uZSBTTUIgaW9jdGwgbmVlZHMgdHJhbnNsYXRpb25zLiAqLwogI2RlZmluZSBTTUJfSU9DX0dFVE1PVU5UVUlEXzMyIF9JT1IoJ3UnLCAxLCBjb21wYXRfdWlkX3QpCiBIQU5ETEVfSU9DVEwoU01CX0lPQ19HRVRNT1VOVFVJRF8zMiwgZG9fc21iX2dldG1vdW50dWlkKQpAQCAtMzEwNCw2ICsyOTU3LDEwIEBACiBIQU5ETEVfSU9DVEwoU0lPQ0dJV0VOQ09ERSwgZG9fd2lyZWxlc3NfaW9jdGwpCiBIQU5ETEVfSU9DVEwoU0lPQ1NJRkJSLCBvbGRfYnJpZGdlX2lvY3RsKQogSEFORExFX0lPQ1RMKFNJT0NHSUZCUiwgb2xkX2JyaWRnZV9pb2N0bCkKK0hBTkRMRV9JT0NUTChSVENfSVJRUF9SRUFEMzIsIHJ0Y19pb2N0bCkKK0hBTkRMRV9JT0NUTChSVENfSVJRUF9TRVQzMiwgcnRjX2lvY3RsKQorSEFORExFX0lPQ1RMKFJUQ19FUE9DSF9SRUFEMzIsIHJ0Y19pb2N0bCkKK0hBTkRMRV9JT0NUTChSVENfRVBPQ0hfU0VUMzIsIHJ0Y19pb2N0bCkKIAogI2lmIGRlZmluZWQoQ09ORklHX05DUF9GUykgfHwgZGVmaW5lZChDT05GSUdfTkNQX0ZTX01PRFVMRSkKIEhBTkRMRV9JT0NUTChOQ1BfSU9DX05DUFJFUVVFU1RfMzIsIGRvX25jcF9uY3ByZXF1ZXN0KQpAQCAtMzEyMSw1ICsyOTc4LDE5IEBACiBIQU5ETEVfSU9DVEwoVklERU9fU1RJTExQSUNUVVJFLCBkb192aWRlb19zdGlsbHBpY3R1cmUpCiBIQU5ETEVfSU9DVEwoVklERU9fU0VUX1NQVV9QQUxFVFRFLCBkb192aWRlb19zZXRfc3B1X3BhbGV0dGUpCiAKLSN1bmRlZiBERUNMQVJFUwotI2VuZGlmCisvKiBwYXJwb3J0ICovCitDT01QQVRJQkxFX0lPQ1RMKExQVElNRSkKK0NPTVBBVElCTEVfSU9DVEwoTFBDSEFSKQorQ09NUEFUSUJMRV9JT0NUTChMUEFCT1JUT1BFTikKK0NPTVBBVElCTEVfSU9DVEwoTFBDQVJFRlVMKQorQ09NUEFUSUJMRV9JT0NUTChMUFdBSVQpCitDT01QQVRJQkxFX0lPQ1RMKExQU0VUSVJRKQorQ09NUEFUSUJMRV9JT0NUTChMUEdFVFNUQVRVUykKK0NPTVBBVElCTEVfSU9DVEwoTFBHRVRTVEFUVVMpCitDT01QQVRJQkxFX0lPQ1RMKExQUkVTRVQpCisvKkxQR0VUU1RBVFMgbm90IGltcGxlbWVudGVkLCBidXQgbm8ga2VybmVscyBzZWVtIHRvIGNvbXBpbGUgaXQgaW4gYW55d2F5cyovCitDT01QQVRJQkxFX0lPQ1RMKExQR0VURkxBR1MpCitIQU5ETEVfSU9DVEwoTFBTRVRUSU1FT1VULCBscF90aW1lb3V0X3RyYW5zKQorfTsKKworaW50IGlvY3RsX3RhYmxlX3NpemUgPSBBUlJBWV9TSVpFKGlvY3RsX3N0YXJ0KTsKZGlmZiAtLWdpdCBhL2ZzL2NvbmZpZ2ZzL2Rpci5jIGIvZnMvY29uZmlnZnMvZGlyLmMKaW5kZXggZTQ4YjUzOS4uYjY2OGVjNiAxMDA2NDQKLS0tIGEvZnMvY29uZmlnZnMvZGlyLmMKKysrIGIvZnMvY29uZmlnZnMvZGlyLmMKQEAgLTI4OCwxMCArMjg4LDEwIEBACiAKIC8qCiAgKiBPbmx5IHN1YmRpcmVjdG9yaWVzIGNvdW50IGhlcmUuICBGaWxlcyAoQ09ORklHRlNfTk9UX1BJTk5FRCkgYXJlCi0gKiBhdHRyaWJ1dGVzIGFuZCBhcmUgcmVtb3ZlZCBieSBybWRpcigpLiAgV2UgcmVjdXJzZSwgdGFraW5nIGlfc2VtCisgKiBhdHRyaWJ1dGVzIGFuZCBhcmUgcmVtb3ZlZCBieSBybWRpcigpLiAgV2UgcmVjdXJzZSwgdGFraW5nIGlfbXV0ZXgKICAqIG9uIGFsbCBjaGlsZHJlbiB0aGF0IGFyZSBjYW5kaWRhdGVzIGZvciBkZWZhdWx0IGRldGFjaC4gIElmIHRoZQogICogcmVzdWx0IGlzIGNsZWFuLCB0aGVuIGNvbmZpZ2ZzX2RldGFjaF9ncm91cCgpIHdpbGwgaGFuZGxlIGRyb3BwaW5nCi0gKiBpX3NlbS4gIElmIHRoZXJlIGlzIGFuIGVycm9yLCB0aGUgY2FsbGVyIHdpbGwgY2xlYW4gdXAgdGhlIGlfc2VtCisgKiBpX211dGV4LiAgSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRoZSBjYWxsZXIgd2lsbCBjbGVhbiB1cCB0aGUgaV9tdXRleAogICogaG9sZGVycyB2aWEgY29uZmlnZnNfZGV0YWNoX3JvbGxiYWNrKCkuCiAgKi8KIHN0YXRpYyBpbnQgY29uZmlnZnNfZGV0YWNoX3ByZXAoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQpAQCAtMzA5LDggKzMwOSw4IEBACiAJCWlmIChzZC0+c190eXBlICYgQ09ORklHRlNfTk9UX1BJTk5FRCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoc2QtPnNfdHlwZSAmIENPTkZJR0ZTX1VTRVRfREVGQVVMVCkgewotCQkJZG93bigmc2QtPnNfZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7Ci0JCQkvKiBNYXJrIHRoYXQgd2UndmUgdGFrZW4gaV9zZW0gKi8KKwkJCW11dGV4X2xvY2soJnNkLT5zX2RlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CisJCQkvKiBNYXJrIHRoYXQgd2UndmUgdGFrZW4gaV9tdXRleCAqLwogCQkJc2QtPnNfdHlwZSB8PSBDT05GSUdGU19VU0VUX0RST1BQSU5HOwogCiAJCQlyZXQgPSBjb25maWdmc19kZXRhY2hfcHJlcChzZC0+c19kZW50cnkpOwpAQCAtMzI3LDcgKzMyNyw3IEBACiB9CiAKIC8qCi0gKiBXYWxrIHRoZSB0cmVlLCBkcm9wcGluZyBpX3NlbSB3aGVyZXZlciBDT05GSUdGU19VU0VUX0RST1BQSU5HIGlzCisgKiBXYWxrIHRoZSB0cmVlLCBkcm9wcGluZyBpX211dGV4IHdoZXJldmVyIENPTkZJR0ZTX1VTRVRfRFJPUFBJTkcgaXMKICAqIHNldC4KICAqLwogc3RhdGljIHZvaWQgY29uZmlnZnNfZGV0YWNoX3JvbGxiYWNrKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKQEAgLTM0MSw3ICszNDEsNyBAQAogCiAJCQlpZiAoc2QtPnNfdHlwZSAmIENPTkZJR0ZTX1VTRVRfRFJPUFBJTkcpIHsKIAkJCQlzZC0+c190eXBlICY9IH5DT05GSUdGU19VU0VUX0RST1BQSU5HOwotCQkJCXVwKCZzZC0+c19kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwkJCQltdXRleF91bmxvY2soJnNkLT5zX2RlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJCQl9CiAJCX0KIAl9CkBAIC00MjQsMTEgKzQyNCwxMSBAQAogCiAJCS8qCiAJCSAqIEZyb20gcm1kaXIvdW5yZWdpc3RlciwgYSBjb25maWdmc19kZXRhY2hfcHJlcCgpIHBhc3MKLQkJICogaGFzIHRha2VuIG91ciBpX3NlbSBmb3IgdXMuICBEcm9wIGl0LgorCQkgKiBoYXMgdGFrZW4gb3VyIGlfbXV0ZXggZm9yIHVzLiAgRHJvcCBpdC4KIAkJICogRnJvbSBta2Rpci9yZWdpc3RlciBjbGVhbnVwLCB0aGVyZSBpcyBubyBzZW0gaGVsZC4KIAkJICovCiAJCWlmIChzZC0+c190eXBlICYgQ09ORklHRlNfVVNFVF9EUk9QUElORykKLQkJCXVwKCZjaGlsZC0+ZF9pbm9kZS0+aV9zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZjaGlsZC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAKIAkJZF9kZWxldGUoY2hpbGQpOwogCQlkcHV0KGNoaWxkKTsKQEAgLTQ5MywxMSArNDkzLDExIEBACiAJCS8qIEZZSSwgd2UncmUgZmFraW5nIG1rZGlyIGhlcmUKIAkJICogSSdtIG5vdCBzdXJlIHdlIG5lZWQgdGhpcyBzZW1hcGhvcmUsIGFzIHdlJ3JlIGNhbGxlZAogCQkgKiBmcm9tIG91ciBwYXJlbnQncyBta2Rpci4gIFRoYXQgaG9sZHMgb3VyIHBhcmVudCdzCi0JCSAqIGlfc2VtLCBzbyBhZmFpayBsb29rdXAgY2Fubm90IGNvbnRpbnVlIHRocm91Z2ggb3VyCisJCSAqIGlfbXV0ZXgsIHNvIGFmYWlrIGxvb2t1cCBjYW5ub3QgY29udGludWUgdGhyb3VnaCBvdXIKIAkJICogcGFyZW50IHRvIGZpbmQgdXMsIGxldCBhbG9uZSBtZXNzIHdpdGggb3VyIHRyZWUuCi0JCSAqIFRoYXQgc2FpZCwgdGFraW5nIG91ciBpX3NlbSBpcyBjbG9zZXIgdG8gbWtkaXIKKwkJICogVGhhdCBzYWlkLCB0YWtpbmcgb3VyIGlfbXV0ZXggaXMgY2xvc2VyIHRvIG1rZGlyCiAJCSAqIGVtdWxhdGlvbiwgYW5kIHNob3VsZG4ndCBodXJ0LiAqLwotCQlkb3duKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwkJbXV0ZXhfbG9jaygmZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAogCQlmb3IgKGkgPSAwOyBncm91cC0+ZGVmYXVsdF9ncm91cHNbaV07IGkrKykgewogCQkJbmV3X2dyb3VwID0gZ3JvdXAtPmRlZmF1bHRfZ3JvdXBzW2ldOwpAQCAtNTA3LDcgKzUwNyw3IEBACiAJCQkJYnJlYWs7CiAJCX0KIAotCQl1cCgmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJCW11dGV4X3VubG9jaygmZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAl9CiAKIAlpZiAocmV0KQpAQCAtODU2LDcgKzg1Niw3IEBACiAJZG93bl93cml0ZSgmY29uZmlnZnNfcmVuYW1lX3NlbSk7CiAJcGFyZW50ID0gaXRlbS0+cGFyZW50LT5kZW50cnk7CiAKLQlkb3duKCZwYXJlbnQtPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZwYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCiAJbmV3X2RlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKG5ld19uYW1lLCBwYXJlbnQsIHN0cmxlbihuZXdfbmFtZSkpOwogCWlmICghSVNfRVJSKG5ld19kZW50cnkpKSB7CkBAIC04NzIsNyArODcyLDcgQEAKIAkJCWVycm9yID0gLUVFWElTVDsKIAkJZHB1dChuZXdfZGVudHJ5KTsKIAl9Ci0JdXAoJnBhcmVudC0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKIAl1cF93cml0ZSgmY29uZmlnZnNfcmVuYW1lX3NlbSk7CiAKIAlyZXR1cm4gZXJyb3I7CkBAIC04ODQsOSArODg0LDkgQEAKIAlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CiAJc3RydWN0IGNvbmZpZ2ZzX2RpcmVudCAqIHBhcmVudF9zZCA9IGRlbnRyeS0+ZF9mc2RhdGE7CiAKLQlkb3duKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNvbmZpZ2ZzX25ld19kaXJlbnQocGFyZW50X3NkLCBOVUxMKTsKLQl1cCgmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCiAJcmV0dXJuIGZpbGUtPnByaXZhdGVfZGF0YSA/IDAgOiAtRU5PTUVNOwogCkBAIC04OTcsOSArODk3LDkgQEAKIAlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CiAJc3RydWN0IGNvbmZpZ2ZzX2RpcmVudCAqIGN1cnNvciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAotCWRvd24oJmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJbGlzdF9kZWxfaW5pdCgmY3Vyc29yLT5zX3NpYmxpbmcpOwotCXVwKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAKIAlyZWxlYXNlX2NvbmZpZ2ZzX2RpcmVudChjdXJzb3IpOwogCkBAIC05NzUsNyArOTc1LDcgQEAKIHsKIAlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CiAKLQlkb3duKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCXN3aXRjaCAob3JpZ2luKSB7CiAJCWNhc2UgMToKIAkJCW9mZnNldCArPSBmaWxlLT5mX3BvczsKQEAgLTk4Myw3ICs5ODMsNyBAQAogCQkJaWYgKG9mZnNldCA+PSAwKQogCQkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJdXAoJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJCQltdXRleF91bmxvY2soJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAob2Zmc2V0ICE9IGZpbGUtPmZfcG9zKSB7CkBAIC0xMDA3LDcgKzEwMDcsNyBAQAogCQkJbGlzdF9hZGRfdGFpbCgmY3Vyc29yLT5zX3NpYmxpbmcsIHApOwogCQl9CiAJfQotCXVwKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJcmV0dXJuIG9mZnNldDsKIH0KIApAQCAtMTAzNyw3ICsxMDM3LDcgQEAKIAlzZCA9IGNvbmZpZ2ZzX3NiLT5zX3Jvb3QtPmRfZnNkYXRhOwogCWxpbmtfZ3JvdXAodG9fY29uZmlnX2dyb3VwKHNkLT5zX2VsZW1lbnQpLCBncm91cCk7CiAKLQlkb3duKCZjb25maWdmc19zYi0+c19yb290LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmY29uZmlnZnNfc2ItPnNfcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAKIAluYW1lLm5hbWUgPSBncm91cC0+Y2dfaXRlbS5jaV9uYW1lOwogCW5hbWUubGVuID0gc3RybGVuKG5hbWUubmFtZSk7CkBAIC0xMDU3LDcgKzEwNTcsNyBAQAogCWVsc2UKIAkJZF9kZWxldGUoZGVudHJ5KTsKIAotCXVwKCZjb25maWdmc19zYi0+c19yb290LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZjb25maWdmc19zYi0+c19yb290LT5kX2lub2RlLT5pX211dGV4KTsKIAogCWlmIChkZW50cnkpIHsKIAkgICAgZHB1dChkZW50cnkpOwpAQCAtMTA3OSwxOCArMTA3OSwxOCBAQAogCQlyZXR1cm47CiAJfQogCi0JZG93bigmY29uZmlnZnNfc2ItPnNfcm9vdC0+ZF9pbm9kZS0+aV9zZW0pOwotCWRvd24oJmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmNvbmZpZ2ZzX3NiLT5zX3Jvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOworCW11dGV4X2xvY2soJmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJaWYgKGNvbmZpZ2ZzX2RldGFjaF9wcmVwKGRlbnRyeSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJjb25maWdmczogVHJpZWQgdG8gdW5yZWdpc3RlciBub24tZW1wdHkgc3Vic3lzdGVtIVxuIik7CiAJfQogCWNvbmZpZ2ZzX2RldGFjaF9ncm91cCgmZ3JvdXAtPmNnX2l0ZW0pOwogCWRlbnRyeS0+ZF9pbm9kZS0+aV9mbGFncyB8PSBTX0RFQUQ7Ci0JdXAoJmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAogCWRfZGVsZXRlKGRlbnRyeSk7CiAKLQl1cCgmY29uZmlnZnNfc2ItPnNfcm9vdC0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmY29uZmlnZnNfc2ItPnNfcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAKIAlkcHV0KGRlbnRyeSk7CiAKZGlmZiAtLWdpdCBhL2ZzL2NvbmZpZ2ZzL2ZpbGUuYyBiL2ZzL2NvbmZpZ2ZzL2ZpbGUuYwppbmRleCBhZjFmZmM5Li5jMjZjZDYxIDEwMDY0NAotLS0gYS9mcy9jb25maWdmcy9maWxlLmMKKysrIGIvZnMvY29uZmlnZnMvZmlsZS5jCkBAIC0zMzYsOSArMzM2LDkgQEAKIAl1bW9kZV90IG1vZGUgPSAoYXR0ci0+Y2FfbW9kZSAmIFNfSUFMTFVHTykgfCBTX0lGUkVHOwogCWludCBlcnJvciA9IDA7CiAKLQlkb3duKCZkaXItPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZkaXItPmRfaW5vZGUtPmlfbXV0ZXgpOwogCWVycm9yID0gY29uZmlnZnNfbWFrZV9kaXJlbnQocGFyZW50X3NkLCBOVUxMLCAodm9pZCAqKSBhdHRyLCBtb2RlLCB0eXBlKTsKLQl1cCgmZGlyLT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZkaXItPmRfaW5vZGUtPmlfbXV0ZXgpOwogCiAJcmV0dXJuIGVycm9yOwogfQpkaWZmIC0tZ2l0IGEvZnMvY29uZmlnZnMvaW5vZGUuYyBiL2ZzL2NvbmZpZ2ZzL2lub2RlLmMKaW5kZXggNmIyNzRjNi4uNjU3N2M1OCAxMDA2NDQKLS0tIGEvZnMvY29uZmlnZnMvaW5vZGUuYworKysgYi9mcy9jb25maWdmcy9pbm9kZS5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIAogLyoKICAqIFVuaGFzaGVzIHRoZSBkZW50cnkgY29ycmVzcG9uZGluZyB0byBnaXZlbiBjb25maWdmc19kaXJlbnQKLSAqIENhbGxlZCB3aXRoIHBhcmVudCBpbm9kZSdzIGlfc2VtIGhlbGQuCisgKiBDYWxsZWQgd2l0aCBwYXJlbnQgaW5vZGUncyBpX211dGV4IGhlbGQuCiAgKi8KIHZvaWQgY29uZmlnZnNfZHJvcF9kZW50cnkoc3RydWN0IGNvbmZpZ2ZzX2RpcmVudCAqIHNkLCBzdHJ1Y3QgZGVudHJ5ICogcGFyZW50KQogewpAQCAtMTQ1LDcgKzE0NSw3IEBACiAJc3RydWN0IGNvbmZpZ2ZzX2RpcmVudCAqIHNkOwogCXN0cnVjdCBjb25maWdmc19kaXJlbnQgKiBwYXJlbnRfc2QgPSBkaXItPmRfZnNkYXRhOwogCi0JZG93bigmZGlyLT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmZGlyLT5kX2lub2RlLT5pX211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNkLCAmcGFyZW50X3NkLT5zX2NoaWxkcmVuLCBzX3NpYmxpbmcpIHsKIAkJaWYgKCFzZC0+c19lbGVtZW50KQogCQkJY29udGludWU7CkBAIC0xNTYsNyArMTU2LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCXVwKCZkaXItPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmRpci0+ZF9pbm9kZS0+aV9tdXRleCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZnMvZGNhY2hlLmMgYi9mcy9kY2FjaGUuYwppbmRleCAxN2U0MzkxMy4uODZiZGI5MyAxMDA2NDQKLS0tIGEvZnMvZGNhY2hlLmMKKysrIGIvZnMvZGNhY2hlLmMKQEAgLTcxLDcgKzcxLDcgQEAKIAogc3RhdGljIHZvaWQgZF9jYWxsYmFjayhzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgZGVudHJ5LCBkX3JjdSk7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgZGVudHJ5LCBkX3UuZF9yY3UpOwogCiAJaWYgKGRuYW1lX2V4dGVybmFsKGRlbnRyeSkpCiAJCWtmcmVlKGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwpAQCAtODYsNyArODYsNyBAQAogewogCWlmIChkZW50cnktPmRfb3AgJiYgZGVudHJ5LT5kX29wLT5kX3JlbGVhc2UpCiAJCWRlbnRyeS0+ZF9vcC0+ZF9yZWxlYXNlKGRlbnRyeSk7Ci0gCWNhbGxfcmN1KCZkZW50cnktPmRfcmN1LCBkX2NhbGxiYWNrKTsKKyAJY2FsbF9yY3UoJmRlbnRyeS0+ZF91LmRfcmN1LCBkX2NhbGxiYWNrKTsKIH0KIAogLyoKQEAgLTk0LDcgKzk0LDcgQEAKICAqIGRfaXB1dCgpIG9wZXJhdGlvbiBpZiBkZWZpbmVkLgogICogQ2FsbGVkIHdpdGggZGNhY2hlX2xvY2sgYW5kIHBlciBkZW50cnkgbG9jayBoZWxkLCBkcm9wcyBib3RoLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZGVudHJ5X2lwdXQoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKK3N0YXRpYyB2b2lkIGRlbnRyeV9pcHV0KHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAlpZiAoaW5vZGUpIHsKQEAgLTE5Myw3ICsxOTMsNyBAQAogICAJCQlsaXN0X2RlbCgmZGVudHJ5LT5kX2xydSk7CiAgIAkJCWRlbnRyeV9zdGF0Lm5yX3VudXNlZC0tOwogICAJCX0KLSAgCQlsaXN0X2RlbCgmZGVudHJ5LT5kX2NoaWxkKTsKKyAgCQlsaXN0X2RlbCgmZGVudHJ5LT5kX3UuZF9jaGlsZCk7CiAJCWRlbnRyeV9zdGF0Lm5yX2RlbnRyeS0tOwkvKiBGb3IgZF9mcmVlLCBiZWxvdyAqLwogCQkvKmRyb3BzIHRoZSBsb2NrcywgYXQgdGhhdCBwb2ludCBub2JvZHkgY2FuIHJlYWNoIHRoaXMgZGVudHJ5ICovCiAJCWRlbnRyeV9pcHV0KGRlbnRyeSk7CkBAIC0zNjcsNyArMzY3LDcgQEAKIAlzdHJ1Y3QgZGVudHJ5ICogcGFyZW50OwogCiAJX19kX2Ryb3AoZGVudHJ5KTsKLQlsaXN0X2RlbCgmZGVudHJ5LT5kX2NoaWxkKTsKKwlsaXN0X2RlbCgmZGVudHJ5LT5kX3UuZF9jaGlsZCk7CiAJZGVudHJ5X3N0YXQubnJfZGVudHJ5LS07CS8qIEZvciBkX2ZyZWUsIGJlbG93ICovCiAJZGVudHJ5X2lwdXQoZGVudHJ5KTsKIAlwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50OwpAQCAtNTE4LDcgKzUxOCw3IEBACiByZXN1bWU6CiAJd2hpbGUgKG5leHQgIT0gJnRoaXNfcGFyZW50LT5kX3N1YmRpcnMpIHsKIAkJc3RydWN0IGxpc3RfaGVhZCAqdG1wID0gbmV4dDsKLQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBkZW50cnksIGRfY2hpbGQpOworCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGRlbnRyeSwgZF91LmRfY2hpbGQpOwogCQluZXh0ID0gdG1wLT5uZXh0OwogCQkvKiBIYXZlIHdlIGZvdW5kIGEgbW91bnQgcG9pbnQgPyAqLwogCQlpZiAoZF9tb3VudHBvaW50KGRlbnRyeSkpCkBAIC01MzIsNyArNTMyLDcgQEAKIAkgKiBBbGwgZG9uZSBhdCB0aGlzIGxldmVsIC4uLiBhc2NlbmQgYW5kIHJlc3VtZSB0aGUgc2VhcmNoLgogCSAqLwogCWlmICh0aGlzX3BhcmVudCAhPSBwYXJlbnQpIHsKLQkJbmV4dCA9IHRoaXNfcGFyZW50LT5kX2NoaWxkLm5leHQ7IAorCQluZXh0ID0gdGhpc19wYXJlbnQtPmRfdS5kX2NoaWxkLm5leHQ7CiAJCXRoaXNfcGFyZW50ID0gdGhpc19wYXJlbnQtPmRfcGFyZW50OwogCQlnb3RvIHJlc3VtZTsKIAl9CkBAIC01NjksNyArNTY5LDcgQEAKIHJlc3VtZToKIAl3aGlsZSAobmV4dCAhPSAmdGhpc19wYXJlbnQtPmRfc3ViZGlycykgewogCQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAgPSBuZXh0OwotCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGRlbnRyeSwgZF9jaGlsZCk7CisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgZGVudHJ5LCBkX3UuZF9jaGlsZCk7CiAJCW5leHQgPSB0bXAtPm5leHQ7CiAKIAkJaWYgKCFsaXN0X2VtcHR5KCZkZW50cnktPmRfbHJ1KSkgewpAQCAtNjEwLDcgKzYxMCw3IEBACiAJICogQWxsIGRvbmUgYXQgdGhpcyBsZXZlbCAuLi4gYXNjZW5kIGFuZCByZXN1bWUgdGhlIHNlYXJjaC4KIAkgKi8KIAlpZiAodGhpc19wYXJlbnQgIT0gcGFyZW50KSB7Ci0JCW5leHQgPSB0aGlzX3BhcmVudC0+ZF9jaGlsZC5uZXh0OyAKKwkJbmV4dCA9IHRoaXNfcGFyZW50LT5kX3UuZF9jaGlsZC5uZXh0OwogCQl0aGlzX3BhcmVudCA9IHRoaXNfcGFyZW50LT5kX3BhcmVudDsKICNpZmRlZiBEQ0FDSEVfREVCVUcKIHByaW50ayhLRVJOX0RFQlVHICJzZWxlY3RfcGFyZW50OiBhc2NlbmRpbmcgdG8gJXMvJXMsIGZvdW5kPSVkXG4iLApAQCAtNzUzLDEyICs3NTMsMTIgQEAKIAkJZGVudHJ5LT5kX3BhcmVudCA9IGRnZXQocGFyZW50KTsKIAkJZGVudHJ5LT5kX3NiID0gcGFyZW50LT5kX3NiOwogCX0gZWxzZSB7Ci0JCUlOSVRfTElTVF9IRUFEKCZkZW50cnktPmRfY2hpbGQpOworCQlJTklUX0xJU1RfSEVBRCgmZGVudHJ5LT5kX3UuZF9jaGlsZCk7CiAJfQogCiAJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CiAJaWYgKHBhcmVudCkKLQkJbGlzdF9hZGQoJmRlbnRyeS0+ZF9jaGlsZCwgJnBhcmVudC0+ZF9zdWJkaXJzKTsKKwkJbGlzdF9hZGQoJmRlbnRyeS0+ZF91LmRfY2hpbGQsICZwYXJlbnQtPmRfc3ViZGlycyk7CiAJZGVudHJ5X3N0YXQubnJfZGVudHJ5Kys7CiAJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKIApAQCAtODA4LDEwICs4MDgsMTQgQEAKICAqCiAgKiBGaWxsIGluIGlub2RlIGluZm9ybWF0aW9uIGluIHRoZSBlbnRyeS4gT24gc3VjY2VzcywgaXQgcmV0dXJucyBOVUxMLgogICogSWYgYW4gdW5oYXNoZWQgYWxpYXMgb2YgImVudHJ5IiBhbHJlYWR5IGV4aXN0cywgdGhlbiB3ZSByZXR1cm4gdGhlCi0gKiBhbGlhc2VkIGRlbnRyeSBpbnN0ZWFkLgorICogYWxpYXNlZCBkZW50cnkgaW5zdGVhZCBhbmQgZHJvcCBvbmUgcmVmZXJlbmNlIHRvIGlub2RlLgogICoKICAqIE5vdGUgdGhhdCBpbiBvcmRlciB0byBhdm9pZCBjb25mbGljdHMgd2l0aCByZW5hbWUoKSBldGMsIHRoZSBjYWxsZXIKICAqIGhhZCBiZXR0ZXIgYmUgaG9sZGluZyB0aGUgcGFyZW50IGRpcmVjdG9yeSBzZW1hcGhvcmUuCisgKgorICogVGhpcyBhbHNvIGFzc3VtZXMgdGhhdCB0aGUgaW5vZGUgY291bnQgaGFzIGJlZW4gaW5jcmVtZW50ZWQKKyAqIChvciBvdGhlcndpc2Ugc2V0KSBieSB0aGUgY2FsbGVyIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgbm93CisgKiBpbiB1c2UgYnkgdGhlIGRjYWNoZS4KICAqLwogc3RydWN0IGRlbnRyeSAqZF9pbnN0YW50aWF0ZV91bmlxdWUoc3RydWN0IGRlbnRyeSAqZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CkBAIC04MzgsNiArODQyLDcgQEAKIAkJZGdldF9sb2NrZWQoYWxpYXMpOwogCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOwogCQlCVUdfT04oIWRfdW5oYXNoZWQoYWxpYXMpKTsKKwkJaXB1dChpbm9kZSk7CiAJCXJldHVybiBhbGlhczsKIAl9CiAJbGlzdF9hZGQoJmVudHJ5LT5kX2FsaWFzLCAmaW5vZGUtPmlfZGVudHJ5KTsKQEAgLTEzMTAsOCArMTMxNSw4IEBACiAJLyogVW5oYXNoIHRoZSB0YXJnZXQ6IGRwdXQoKSB3aWxsIHRoZW4gZ2V0IHJpZCBvZiBpdCAqLwogCV9fZF9kcm9wKHRhcmdldCk7CiAKLQlsaXN0X2RlbCgmZGVudHJ5LT5kX2NoaWxkKTsKLQlsaXN0X2RlbCgmdGFyZ2V0LT5kX2NoaWxkKTsKKwlsaXN0X2RlbCgmZGVudHJ5LT5kX3UuZF9jaGlsZCk7CisJbGlzdF9kZWwoJnRhcmdldC0+ZF91LmRfY2hpbGQpOwogCiAJLyogU3dpdGNoIHRoZSBuYW1lcy4uICovCiAJc3dpdGNoX25hbWVzKGRlbnRyeSwgdGFyZ2V0KTsKQEAgLTEzMjIsMTUgKzEzMjcsMTUgQEAKIAlpZiAoSVNfUk9PVChkZW50cnkpKSB7CiAJCWRlbnRyeS0+ZF9wYXJlbnQgPSB0YXJnZXQtPmRfcGFyZW50OwogCQl0YXJnZXQtPmRfcGFyZW50ID0gdGFyZ2V0OwotCQlJTklUX0xJU1RfSEVBRCgmdGFyZ2V0LT5kX2NoaWxkKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnRhcmdldC0+ZF91LmRfY2hpbGQpOwogCX0gZWxzZSB7CiAJCWRvX3N3aXRjaChkZW50cnktPmRfcGFyZW50LCB0YXJnZXQtPmRfcGFyZW50KTsKIAogCQkvKiBBbmQgYWRkIHRoZW0gYmFjayB0byB0aGUgKG5ldykgcGFyZW50IGxpc3RzICovCi0JCWxpc3RfYWRkKCZ0YXJnZXQtPmRfY2hpbGQsICZ0YXJnZXQtPmRfcGFyZW50LT5kX3N1YmRpcnMpOworCQlsaXN0X2FkZCgmdGFyZ2V0LT5kX3UuZF9jaGlsZCwgJnRhcmdldC0+ZF9wYXJlbnQtPmRfc3ViZGlycyk7CiAJfQogCi0JbGlzdF9hZGQoJmRlbnRyeS0+ZF9jaGlsZCwgJmRlbnRyeS0+ZF9wYXJlbnQtPmRfc3ViZGlycyk7CisJbGlzdF9hZGQoJmRlbnRyeS0+ZF91LmRfY2hpbGQsICZkZW50cnktPmRfcGFyZW50LT5kX3N1YmRpcnMpOwogCXNwaW5fdW5sb2NrKCZ0YXJnZXQtPmRfbG9jayk7CiAJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKIAl3cml0ZV9zZXF1bmxvY2soJnJlbmFtZV9sb2NrKTsKQEAgLTE1NjgsNyArMTU3Myw3IEBACiByZXN1bWU6CiAJd2hpbGUgKG5leHQgIT0gJnRoaXNfcGFyZW50LT5kX3N1YmRpcnMpIHsKIAkJc3RydWN0IGxpc3RfaGVhZCAqdG1wID0gbmV4dDsKLQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBkZW50cnksIGRfY2hpbGQpOworCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGRlbnRyeSwgZF91LmRfY2hpbGQpOwogCQluZXh0ID0gdG1wLT5uZXh0OwogCQlpZiAoZF91bmhhc2hlZChkZW50cnkpfHwhZGVudHJ5LT5kX2lub2RlKQogCQkJY29udGludWU7CkBAIC0xNTc5LDcgKzE1ODQsNyBAQAogCQlhdG9taWNfZGVjKCZkZW50cnktPmRfY291bnQpOwogCX0KIAlpZiAodGhpc19wYXJlbnQgIT0gcm9vdCkgewotCQluZXh0ID0gdGhpc19wYXJlbnQtPmRfY2hpbGQubmV4dDsgCisJCW5leHQgPSB0aGlzX3BhcmVudC0+ZF91LmRfY2hpbGQubmV4dDsKIAkJYXRvbWljX2RlYygmdGhpc19wYXJlbnQtPmRfY291bnQpOwogCQl0aGlzX3BhcmVudCA9IHRoaXNfcGFyZW50LT5kX3BhcmVudDsKIAkJZ290byByZXN1bWU7CmRpZmYgLS1naXQgYS9mcy9kY29va2llcy5jIGIvZnMvZGNvb2tpZXMuYwppbmRleCAwMmFhMGRkLi5mODI3NGE4IDEwMDY0NAotLS0gYS9mcy9kY29va2llcy5jCisrKyBiL2ZzL2Rjb29raWVzLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KZGlmZiAtLWdpdCBhL2ZzL2RlYnVnZnMvaW5vZGUuYyBiL2ZzL2RlYnVnZnMvaW5vZGUuYwppbmRleCBhODZhYzRhLi5kNGYxYTJjIDEwMDY0NAotLS0gYS9mcy9kZWJ1Z2ZzL2lub2RlLmMKKysrIGIvZnMvZGVidWdmcy9pbm9kZS5jCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAl9CiAKIAkqZGVudHJ5ID0gTlVMTDsKLQlkb3duKCZwYXJlbnQtPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZwYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCSpkZW50cnkgPSBsb29rdXBfb25lX2xlbihuYW1lLCBwYXJlbnQsIHN0cmxlbihuYW1lKSk7CiAJaWYgKCFJU19FUlIoZGVudHJ5KSkgewogCQlpZiAoKG1vZGUgJiBTX0lGTVQpID09IFNfSUZESVIpCkBAIC0xNTUsNyArMTU1LDcgQEAKIAkJCWVycm9yID0gZGVidWdmc19jcmVhdGUocGFyZW50LT5kX2lub2RlLCAqZGVudHJ5LCBtb2RlKTsKIAl9IGVsc2UKIAkJZXJyb3IgPSBQVFJfRVJSKGRlbnRyeSk7Ci0JdXAoJnBhcmVudC0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKIAogCXJldHVybiBlcnJvcjsKIH0KQEAgLTI3Myw3ICsyNzMsNyBAQAogCWlmICghcGFyZW50IHx8ICFwYXJlbnQtPmRfaW5vZGUpCiAJCXJldHVybjsKIAotCWRvd24oJnBhcmVudC0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJaWYgKGRlYnVnZnNfcG9zaXRpdmUoZGVudHJ5KSkgewogCQlpZiAoZGVudHJ5LT5kX2lub2RlKSB7CiAJCQlpZiAoU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCkBAIC0yODMsNyArMjgzLDcgQEAKIAkJZHB1dChkZW50cnkpOwogCQl9CiAJfQotCXVwKCZwYXJlbnQtPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJc2ltcGxlX3JlbGVhc2VfZnMoJmRlYnVnZnNfbW91bnQsICZkZWJ1Z2ZzX21vdW50X2NvdW50KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRlYnVnZnNfcmVtb3ZlKTsKZGlmZiAtLWdpdCBhL2ZzL2RldmZzL2Jhc2UuYyBiL2ZzL2RldmZzL2Jhc2UuYwppbmRleCAxMjc0NDIyLi5iNjIxNTIxIDEwMDY0NAotLS0gYS9mcy9kZXZmcy9iYXNlLmMKKysrIGIvZnMvZGV2ZnMvYmFzZS5jCkBAIC0yMTYyLDI3ICsyMTYyLDI3IEBACiAJICoKIAkgKiBtYWtlIHN1cmUgdGhhdAogCSAqICAgZF9pbnN0YW50aWF0ZSBhbHdheXMgcnVucyB1bmRlciBsb2NrCi0JICogICB3ZSByZWxlYXNlIGlfc2VtIGxvY2sgYmVmb3JlIGdvaW5nIHRvIHNsZWVwCisJICogICB3ZSByZWxlYXNlIGlfbXV0ZXggbG9jayBiZWZvcmUgZ29pbmcgdG8gc2xlZXAKIAkgKgogCSAqIHVuZm9ydHVuYXRlbHkgc29tZXRpbWVzIGRfcmV2YWxpZGF0ZSBpcyBjYWxsZWQgd2l0aAotCSAqIGFuZCBzb21ldGltZXMgd2l0aG91dCBpX3NlbSBsb2NrIGhlbGQuIFRoZSBmb2xsb3dpbmcgY2hlY2tzCisJICogYW5kIHNvbWV0aW1lcyB3aXRob3V0IGlfbXV0ZXggbG9jayBoZWxkLiBUaGUgZm9sbG93aW5nIGNoZWNrcwogCSAqIGF0dGVtcHQgdG8gZGVkdWNlIHdoZW4gd2UgbmVlZCB0byBhZGQgKGFuZCBkcm9wIHJlc3AuKSBsb2NrCiAJICogaGVyZS4gVGhpcyByZWxpZXMgb24gY3VycmVudCAoMi42LjIpIGNhbGxpbmcgY292ZW50aW9uczoKIAkgKgotCSAqICAgbG9va3VwX2hhc2ggaXMgYWx3YXlzIHJ1biB1bmRlciBpX3NlbSBhbmQgaXMgcGFzc2luZyBOVUxMCisJICogICBsb29rdXBfaGFzaCBpcyBhbHdheXMgcnVuIHVuZGVyIGlfbXV0ZXggYW5kIGlzIHBhc3NpbmcgTlVMTAogCSAqICAgYXMgbmQKIAkgKgotCSAqICAgb3BlbiguLi4sT19DUkVBVEUsLi4uKSBjYWxscyBfbG9va3VwX2hhc2ggdW5kZXIgaV9zZW0KKwkgKiAgIG9wZW4oLi4uLE9fQ1JFQVRFLC4uLikgY2FsbHMgX2xvb2t1cF9oYXNoIHVuZGVyIGlfbXV0ZXgKIAkgKiAgIGFuZCBzZXRzIGZsYWdzIHRvIExPT0tVUF9PUEVOfExPT0tVUF9DUkVBVEUKIAkgKgogCSAqICAgYWxsIG90aGVyIGludm9jYXRpb25zIG9mIC0+ZF9yZXZhbGlkYXRlIHNlZW0gdG8gaGFwcGVuCi0JICogICBvdXRzaWRlIG9mIGlfc2VtCisJICogICBvdXRzaWRlIG9mIGlfbXV0ZXgKIAkgKi8KIAluZWVkX2xvY2sgPSBuZCAmJgogCSAgICAoIShuZC0+ZmxhZ3MgJiBMT09LVVBfQ1JFQVRFKSB8fCAobmQtPmZsYWdzICYgTE9PS1VQX1BBUkVOVCkpOwogCiAJaWYgKG5lZWRfbG9jaykKLQkJZG93bigmZGlyLT5pX3NlbSk7CisJCW11dGV4X2xvY2soJmRpci0+aV9tdXRleCk7CiAKIAlpZiAoaXNfZGV2ZnNkX29yX2NoaWxkKGZzX2luZm8pKSB7CiAJCWRldmZzX2hhbmRsZV90IGRlID0gbG9va3VwX2luZm8tPmRlOwpAQCAtMjIyMSw5ICsyMjIxLDkgQEAKIAkJYWRkX3dhaXRfcXVldWUoJmxvb2t1cF9pbmZvLT53YWl0X3F1ZXVlLCAmd2FpdCk7CiAJCXJlYWRfdW5sb2NrKCZwYXJlbnQtPnUuZGlyLmxvY2spOwogCQkvKiBhdCB0aGlzIHBvaW50IGl0IGlzIGFsd2F5cyAoaG9wZWZ1bGx5KSBsb2NrZWQgKi8KLQkJdXAoJmRpci0+aV9zZW0pOworCQltdXRleF91bmxvY2soJmRpci0+aV9tdXRleCk7CiAJCXNjaGVkdWxlKCk7Ci0JCWRvd24oJmRpci0+aV9zZW0pOworCQltdXRleF9sb2NrKCZkaXItPmlfbXV0ZXgpOwogCQkvKgogCQkgKiBUaGlzIGRvZXMgbm90IG5lZWQgbm9yIHNob3VsZCByZW1vdmUgd2FpdCBmcm9tIHdhaXRfcXVldWUuCiAJCSAqIFdhaXQgcXVldWUgaGVhZCBpcyBuZXZlciByZXVzZWQgLSBub3RoaW5nIGlzIGV2ZXIgYWRkZWQgdG8gaXQKQEAgLTIyMzgsNyArMjIzOCw3IEBACiAKICAgICAgIG91dDoKIAlpZiAobmVlZF9sb2NrKQotCQl1cCgmZGlyLT5pX3NlbSk7CisJCW11dGV4X3VubG9jaygmZGlyLT5pX211dGV4KTsKIAlyZXR1cm4gMTsKIH0JCQkJLyogIEVuZCBGdW5jdGlvbiBkZXZmc19kX3JldmFsaWRhdGVfd2FpdCAgKi8KIApAQCAtMjI4NCw5ICsyMjg0LDkgQEAKIAkvKiAgVW5sb2NrIGRpcmVjdG9yeSBzZW1hcGhvcmUsIHdoaWNoIHdpbGwgcmVsZWFzZSBhbnkgd2FpdGVycy4gVGhleQogCSAgIHdpbGwgZ2V0IHRoZSBoYXNoZWQgZGVudHJ5LCBhbmQgbWF5IGJlIGZvcmNlZCB0byB3YWl0IGZvcgogCSAgIHJldmFsaWRhdGlvbiAgKi8KLQl1cCgmZGlyLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZkaXItPmlfbXV0ZXgpOwogCXdhaXRfZm9yX2RldmZzZF9maW5pc2hlZChmc19pbmZvKTsJLyogIElmIEknbSBub3QgZGV2ZnNkLCBtdXN0IHdhaXQgICovCi0JZG93bigmZGlyLT5pX3NlbSk7CS8qICBHcmFiIGl0IGFnYWluIGJlY2F1c2UgdGhlbSdzIHRoZSBydWxlcyAgKi8KKwltdXRleF9sb2NrKCZkaXItPmlfbXV0ZXgpOwkvKiAgR3JhYiBpdCBhZ2FpbiBiZWNhdXNlIHRoZW0ncyB0aGUgcnVsZXMgICovCiAJZGUgPSBsb29rdXBfaW5mby5kZTsKIAkvKiAgSWYgc29tZW9uZSBlbHNlIGhhcyBiZWVuIHNvIGtpbmQgYXMgdG8gbWFrZSB0aGUgaW5vZGUsIHdlIGdvIGhvbWUKIAkgICBlYXJseSAgKi8KZGlmZiAtLWdpdCBhL2ZzL2RldnB0cy9pbm9kZS5jIGIvZnMvZGV2cHRzL2lub2RlLmMKaW5kZXggZjJiZTQ0ZC4uYmZiOGEyMyAxMDA2NDQKLS0tIGEvZnMvZGV2cHRzL2lub2RlLmMKKysrIGIvZnMvZGV2cHRzL2lub2RlLmMKQEAgLTEzMCw3ICsxMzAsNyBAQAogewogCWNoYXIgc1sxMl07CiAJc3RydWN0IGRlbnRyeSAqcm9vdCA9IGRldnB0c19yb290OwotCWRvd24oJnJvb3QtPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZyb290LT5kX2lub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gbG9va3VwX29uZV9sZW4ocywgcm9vdCwgc3ByaW50ZihzLCAiJWQiLCBudW0pKTsKIH0KIApAQCAtMTYxLDcgKzE2MSw3IEBACiAJaWYgKCFJU19FUlIoZGVudHJ5KSAmJiAhZGVudHJ5LT5kX2lub2RlKQogCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCi0JdXAoJmRldnB0c19yb290LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZkZXZwdHNfcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE3OCw3ICsxNzgsNyBAQAogCQlkcHV0KGRlbnRyeSk7CiAJfQogCi0JdXAoJmRldnB0c19yb290LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZkZXZwdHNfcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAKIAlyZXR1cm4gdHR5OwogfQpAQCAtMTk2LDcgKzE5Niw3IEBACiAJCX0KIAkJZHB1dChkZW50cnkpOwogCX0KLQl1cCgmZGV2cHRzX3Jvb3QtPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmRldnB0c19yb290LT5kX2lub2RlLT5pX211dGV4KTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9kZXZwdHNfZnModm9pZCkKZGlmZiAtLWdpdCBhL2ZzL2RpcmVjdC1pby5jIGIvZnMvZGlyZWN0LWlvLmMKaW5kZXggMzkzMWU3Zi4uMzBkYmJkMSAxMDA2NDQKLS0tIGEvZnMvZGlyZWN0LWlvLmMKKysrIGIvZnMvZGlyZWN0LWlvLmMKQEAgLTU2LDcgKzU2LDcgQEAKICAqIGxvY2tfdHlwZSBpcyBESU9fTE9DS0lORyBmb3IgcmVndWxhciBmaWxlcyBvbiBkaXJlY3QtSU8tbmFpdmUgZmlsZXN5c3RlbXMuCiAgKiBUaGlzIGRldGVybWluZXMgd2hldGhlciB3ZSBuZWVkIHRvIGRvIHRoZSBmYW5jeSBsb2NraW5nIHdoaWNoIHByZXZlbnRzCiAgKiBkaXJlY3QtSU8gZnJvbSBiZWluZyBhYmxlIHRvIHJlYWQgdW5pbml0aWFsaXNlZCBkaXNrIGJsb2Nrcy4gIElmIGl0cyB6ZXJvCi0gKiAoYmxvY2tkZXYpIHRoaXMgbG9ja2luZyBpcyBub3QgZG9uZSwgYW5kIGlmIGl0IGlzIERJT19PV05fTE9DS0lORyBpX3NlbSBpcworICogKGJsb2NrZGV2KSB0aGlzIGxvY2tpbmcgaXMgbm90IGRvbmUsIGFuZCBpZiBpdCBpcyBESU9fT1dOX0xPQ0tJTkcgaV9tdXRleCBpcwogICogbm90IGhlbGQgZm9yIHRoZSBlbnRpcmUgZGlyZWN0IHdyaXRlICh0YWtlbiBicmllZmx5LCBpbml0aWFsbHksIGR1cmluZyBhCiAgKiBkaXJlY3QgcmVhZCB0aG91Z2gsIGJ1dCBpdHMgbmV2ZXIgaGVsZCBmb3IgdGhlIGR1cmF0aW9uIG9mIGEgZGlyZWN0LUlPKS4KICAqLwpAQCAtOTMwLDcgKzkzMCw3IEBACiB9CiAKIC8qCi0gKiBSZWxlYXNlcyBib3RoIGlfc2VtIGFuZCBpX2FsbG9jX3NlbQorICogUmVsZWFzZXMgYm90aCBpX211dGV4IGFuZCBpX2FsbG9jX3NlbQogICovCiBzdGF0aWMgc3NpemVfdAogZGlyZWN0X2lvX3dvcmtlcihpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlub2RlICppbm9kZSwgCkBAIC0xMDYyLDExICsxMDYyLDExIEBACiAKIAkvKgogCSAqIEFsbCBibG9jayBsb29rdXBzIGhhdmUgYmVlbiBwZXJmb3JtZWQuIEZvciBSRUFEIHJlcXVlc3RzCi0JICogd2UgY2FuIGxldCBpX3NlbSBnbyBub3cgdGhhdCBpdHMgYWNoaWV2ZWQgaXRzIHB1cnBvc2UKKwkgKiB3ZSBjYW4gbGV0IGlfbXV0ZXggZ28gbm93IHRoYXQgaXRzIGFjaGlldmVkIGl0cyBwdXJwb3NlCiAJICogb2YgcHJvdGVjdGluZyB1cyBmcm9tIGxvb2tpbmcgdXAgdW5pbml0aWFsaXplZCBibG9ja3MuCiAJICovCiAJaWYgKChydyA9PSBSRUFEKSAmJiAoZGlvLT5sb2NrX3R5cGUgPT0gRElPX0xPQ0tJTkcpKQotCQl1cCgmZGlvLT5pbm9kZS0+aV9zZW0pOworCQltdXRleF91bmxvY2soJmRpby0+aW5vZGUtPmlfbXV0ZXgpOwogCiAJLyoKIAkgKiBPSywgYWxsIEJJT3MgYXJlIHN1Ym1pdHRlZCwgc28gd2UgY2FuIGRlY3JlbWVudCBiaW9fY291bnQgdG8gdHJ1bHkKQEAgLTExNDUsMTggKzExNDUsMTggQEAKICAqIFRoZSBsb2NraW5nIHJ1bGVzIGFyZSBnb3Zlcm5lZCBieSB0aGUgZGlvX2xvY2tfdHlwZSBwYXJhbWV0ZXIuCiAgKgogICogRElPX05PX0xPQ0tJTkcgKG5vIGxvY2tpbmcsIGZvciByYXcgYmxvY2sgZGV2aWNlIGFjY2VzcykKLSAqIEZvciB3cml0ZXMsIGlfc2VtIGlzIG5vdCBoZWxkIG9uIGVudHJ5OyBpdCBpcyBuZXZlciB0YWtlbi4KKyAqIEZvciB3cml0ZXMsIGlfbXV0ZXggaXMgbm90IGhlbGQgb24gZW50cnk7IGl0IGlzIG5ldmVyIHRha2VuLgogICoKICAqIERJT19MT0NLSU5HIChzaW1wbGUgbG9ja2luZyBmb3IgcmVndWxhciBmaWxlcykKLSAqIEZvciB3cml0ZXMgd2UgYXJlIGNhbGxlZCB1bmRlciBpX3NlbSBhbmQgcmV0dXJuIHdpdGggaV9zZW0gaGVsZCwgZXZlbiB0aG91Z2gKKyAqIEZvciB3cml0ZXMgd2UgYXJlIGNhbGxlZCB1bmRlciBpX211dGV4IGFuZCByZXR1cm4gd2l0aCBpX211dGV4IGhlbGQsIGV2ZW4gdGhvdWdoCiAgKiBpdCBpcyBpbnRlcm5hbGx5IGRyb3BwZWQuCi0gKiBGb3IgcmVhZHMsIGlfc2VtIGlzIG5vdCBoZWxkIG9uIGVudHJ5LCBidXQgaXQgaXMgdGFrZW4gYW5kIGRyb3BwZWQgYmVmb3JlCisgKiBGb3IgcmVhZHMsIGlfbXV0ZXggaXMgbm90IGhlbGQgb24gZW50cnksIGJ1dCBpdCBpcyB0YWtlbiBhbmQgZHJvcHBlZCBiZWZvcmUKICAqIHJldHVybmluZy4KICAqCiAgKiBESU9fT1dOX0xPQ0tJTkcgKGZpbGVzeXN0ZW0gcHJvdmlkZXMgc3luY2hyb25pc2F0aW9uIGFuZCBoYW5kbGluZyBvZgogICoJdW5pbml0aWFsaXNlZCBkYXRhLCBhbGxvd2luZyBwYXJhbGxlbCBkaXJlY3QgcmVhZGVycyBhbmQgd3JpdGVycykKLSAqIEZvciB3cml0ZXMgd2UgYXJlIGNhbGxlZCB3aXRob3V0IGlfc2VtLCByZXR1cm4gd2l0aG91dCBpdCwgbmV2ZXIgdG91Y2ggaXQuCi0gKiBGb3IgcmVhZHMsIGlfc2VtIGlzIGhlbGQgb24gZW50cnkgYW5kIHdpbGwgYmUgcmVsZWFzZWQgYmVmb3JlIHJldHVybmluZy4KKyAqIEZvciB3cml0ZXMgd2UgYXJlIGNhbGxlZCB3aXRob3V0IGlfbXV0ZXgsIHJldHVybiB3aXRob3V0IGl0LCBuZXZlciB0b3VjaCBpdC4KKyAqIEZvciByZWFkcywgaV9tdXRleCBpcyBoZWxkIG9uIGVudHJ5IGFuZCB3aWxsIGJlIHJlbGVhc2VkIGJlZm9yZSByZXR1cm5pbmcuCiAgKgogICogQWRkaXRpb25hbCBpX2FsbG9jX3NlbSBsb2NraW5nIHJlcXVpcmVtZW50cyBkZXNjcmliZWQgaW5saW5lIGJlbG93LgogICovCkBAIC0xMjE0LDExICsxMjE0LDExIEBACiAJICogRm9yIGJsb2NrIGRldmljZSBhY2Nlc3MgRElPX05PX0xPQ0tJTkcgaXMgdXNlZCwKIAkgKgluZWl0aGVyIHJlYWRlcnMgbm9yIHdyaXRlcnMgZG8gYW55IGxvY2tpbmcgYXQgYWxsCiAJICogRm9yIHJlZ3VsYXIgZmlsZXMgdXNpbmcgRElPX0xPQ0tJTkcsCi0JICoJcmVhZGVycyBuZWVkIHRvIGdyYWIgaV9zZW0gYW5kIGlfYWxsb2Nfc2VtCi0JICoJd3JpdGVycyBuZWVkIHRvIGdyYWIgaV9hbGxvY19zZW0gb25seSAoaV9zZW0gaXMgYWxyZWFkeSBoZWxkKQorCSAqCXJlYWRlcnMgbmVlZCB0byBncmFiIGlfbXV0ZXggYW5kIGlfYWxsb2Nfc2VtCisJICoJd3JpdGVycyBuZWVkIHRvIGdyYWIgaV9hbGxvY19zZW0gb25seSAoaV9tdXRleCBpcyBhbHJlYWR5IGhlbGQpCiAJICogRm9yIHJlZ3VsYXIgZmlsZXMgdXNpbmcgRElPX09XTl9MT0NLSU5HLAogCSAqCW5laXRoZXIgcmVhZGVycyBub3Igd3JpdGVycyB0YWtlIGFueSBsb2NrcyBoZXJlCi0JICoJKGlfc2VtIGlzIGFscmVhZHkgaGVsZCBhbmQgcmVsZWFzZSBmb3Igd3JpdGVycyBoZXJlKQorCSAqCShpX211dGV4IGlzIGFscmVhZHkgaGVsZCBhbmQgcmVsZWFzZSBmb3Igd3JpdGVycyBoZXJlKQogCSAqLwogCWRpby0+bG9ja190eXBlID0gZGlvX2xvY2tfdHlwZTsKIAlpZiAoZGlvX2xvY2tfdHlwZSAhPSBESU9fTk9fTE9DS0lORykgewpAQCAtMTIyOCw3ICsxMjI4LDcgQEAKIAogCQkJbWFwcGluZyA9IGlvY2ItPmtpX2ZpbHAtPmZfbWFwcGluZzsKIAkJCWlmIChkaW9fbG9ja190eXBlICE9IERJT19PV05fTE9DS0lORykgewotCQkJCWRvd24oJmlub2RlLT5pX3NlbSk7CisJCQkJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQkJCXJlYWRlcl93aXRoX2lzZW0gPSAxOwogCQkJfQogCkBAIC0xMjQwLDcgKzEyNDAsNyBAQAogCQkJfQogCiAJCQlpZiAoZGlvX2xvY2tfdHlwZSA9PSBESU9fT1dOX0xPQ0tJTkcpIHsKLQkJCQl1cCgmaW5vZGUtPmlfc2VtKTsKKwkJCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAkJCQlyZWFkZXJfd2l0aF9pc2VtID0gMDsKIAkJCX0KIAkJfQpAQCAtMTI2Niw3ICsxMjY2LDcgQEAKIAogb3V0OgogCWlmIChyZWFkZXJfd2l0aF9pc2VtKQotCQl1cCgmaW5vZGUtPmlfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJaWYgKHJ3ICYgV1JJVEUpCiAJCWN1cnJlbnQtPmZsYWdzICY9IH5QRl9TWU5DV1JJVEU7CiAJcmV0dXJuIHJldHZhbDsKZGlmZiAtLWdpdCBhL2ZzL2RxdW90LmMgYi9mcy9kcXVvdC5jCmluZGV4IDJhNjJiM2QuLjE5NjZjODkgMTAwNjQ0Ci0tLSBhL2ZzL2RxdW90LmMKKysrIGIvZnMvZHF1b3QuYwpAQCAtNzcsNiArNzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMTAwLDcgKzEwMSw3IEBACiAgKiBvcGVyYXRpb24gaXMganVzdCByZWFkaW5nIHBvaW50ZXJzIGZyb20gaW5vZGUgKG9yIG5vdCB1c2luZyB0aGVtIGF0IGFsbCkgdGhlCiAgKiByZWFkIGxvY2sgaXMgZW5vdWdoLiBJZiBwb2ludGVycyBhcmUgYWx0ZXJlZCBmdW5jdGlvbiBtdXN0IGhvbGQgd3JpdGUgbG9jawogICogKHRoZXNlIGxvY2tpbmcgcnVsZXMgYWxzbyBhcHBseSBmb3IgU19OT1FVT1RBIGZsYWcgaW4gdGhlIGlub2RlIC0gbm90ZSB0aGF0Ci0gKiBmb3IgYWx0ZXJpbmcgdGhlIGZsYWcgaV9zZW0gaXMgYWxzbyBuZWVkZWQpLiAgSWYgb3BlcmF0aW9uIGlzIGhvbGRpbmcKKyAqIGZvciBhbHRlcmluZyB0aGUgZmxhZyBpX211dGV4IGlzIGFsc28gbmVlZGVkKS4gIElmIG9wZXJhdGlvbiBpcyBob2xkaW5nCiAgKiByZWZlcmVuY2UgdG8gZHF1b3QgaW4gb3RoZXIgd2F5IChlLmcuIHF1b3RhY3RsIG9wcykgaXQgbXVzdCBiZSBndWFyZGVkIGJ5CiAgKiBkcW9ub2ZmX3NlbS4KICAqIFRoaXMgbG9ja2luZyBhc3N1cmVzIHRoYXQ6CkBAIC0xMTcsOSArMTE4LDkgQEAKICAqIHNwaW5sb2NrIHRvIGludGVybmFsIGJ1ZmZlcnMgYmVmb3JlIHdyaXRpbmcuCiAgKgogICogTG9jayBvcmRlcmluZyAoaW5jbHVkaW5nIHJlbGF0ZWQgVkZTIGxvY2tzKSBpcyB0aGUgZm9sbG93aW5nOgotICogICBpX3NlbSA+IGRxb25vZmZfc2VtID4gaXBydW5lX3NlbSA+IGpvdXJuYWxfbG9jayA+IGRxcHRyX3NlbSA+CisgKiAgIGlfbXV0ZXggPiBkcW9ub2ZmX3NlbSA+IGlwcnVuZV9zZW0gPiBqb3VybmFsX2xvY2sgPiBkcXB0cl9zZW0gPgogICogICA+IGRxdW90LT5kcV9sb2NrID4gZHFpb19zZW0KLSAqIGlfc2VtIG9uIHF1b3RhIGZpbGVzIGlzIHNwZWNpYWwgKGl0J3MgYmVsb3cgZHFpb19zZW0pCisgKiBpX211dGV4IG9uIHF1b3RhIGZpbGVzIGlzIHNwZWNpYWwgKGl0J3MgYmVsb3cgZHFpb19zZW0pCiAgKi8KIAogc3RhdGljIERFRklORV9TUElOTE9DSyhkcV9saXN0X2xvY2spOwpAQCAtMTM2OSwxMSArMTM3MCwxMSBAQAogCQkJLyogSWYgcXVvdGEgd2FzIHJlZW5hYmxlZCBpbiB0aGUgbWVhbnRpbWUsIHdlIGhhdmUKIAkJCSAqIG5vdGhpbmcgdG8gZG8gKi8KIAkJCWlmICghc2JfaGFzX3F1b3RhX2VuYWJsZWQoc2IsIGNudCkpIHsKLQkJCQlkb3duKCZ0b3B1dGlub2RlW2NudF0tPmlfc2VtKTsKKwkJCQltdXRleF9sb2NrKCZ0b3B1dGlub2RlW2NudF0tPmlfbXV0ZXgpOwogCQkJCXRvcHV0aW5vZGVbY250XS0+aV9mbGFncyAmPSB+KFNfSU1NVVRBQkxFIHwKIAkJCQkgIFNfTk9BVElNRSB8IFNfTk9RVU9UQSk7CiAJCQkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJnRvcHV0aW5vZGVbY250XS0+aV9kYXRhLCAwKTsKLQkJCQl1cCgmdG9wdXRpbm9kZVtjbnRdLT5pX3NlbSk7CisJCQkJbXV0ZXhfdW5sb2NrKCZ0b3B1dGlub2RlW2NudF0tPmlfbXV0ZXgpOwogCQkJCW1hcmtfaW5vZGVfZGlydHkodG9wdXRpbm9kZVtjbnRdKTsKIAkJCQlpcHV0KHRvcHV0aW5vZGVbY250XSk7CiAJCQl9CkBAIC0xNDE3LDcgKzE0MTgsNyBAQAogCXdyaXRlX2lub2RlX25vdyhpbm9kZSwgMSk7CiAJLyogQW5kIG5vdyBmbHVzaCB0aGUgYmxvY2sgY2FjaGUgc28gdGhhdCBrZXJuZWwgc2VlcyB0aGUgY2hhbmdlcyAqLwogCWludmFsaWRhdGVfYmRldihzYi0+c19iZGV2LCAwKTsKLQlkb3duKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAlkb3duKCZkcW9wdC0+ZHFvbm9mZl9zZW0pOwogCWlmIChzYl9oYXNfcXVvdGFfZW5hYmxlZChzYiwgdHlwZSkpIHsKIAkJZXJyb3IgPSAtRUJVU1k7CkBAIC0xNDQ5LDcgKzE0NTAsNyBAQAogCQlnb3RvIG91dF9maWxlX2luaXQ7CiAJfQogCXVwKCZkcW9wdC0+ZHFpb19zZW0pOwotCXVwKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXNldF9lbmFibGVfZmxhZ3MoZHFvcHQsIHR5cGUpOwogCiAJYWRkX2RxdW90X3JlZihzYiwgdHlwZSk7CkBAIC0xNDcwLDcgKzE0NzEsNyBAQAogCQlpbm9kZS0+aV9mbGFncyB8PSBvbGRmbGFnczsKIAkJdXBfd3JpdGUoJmRxb3B0LT5kcXB0cl9zZW0pOwogCX0KLQl1cCgmaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIG91dF9mbXQ6CiAJcHV0X3F1b3RhX2Zvcm1hdChmbXQpOwogCmRpZmYgLS1naXQgYS9mcy9kcm9wX2NhY2hlcy5jIGIvZnMvZHJvcF9jYWNoZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTQ3NjIzCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZHJvcF9jYWNoZXMuYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogSW1wbGVtZW50IHRoZSBtYW51YWwgZHJvcC1hbGwtcGFnZWNhY2hlIGZ1bmN0aW9uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKworLyogQSBnbG9iYWwgdmFyaWFibGUgaXMgYSBiaXQgdWdseSwgYnV0IGl0IGtlZXBzIHRoZSBjb2RlIHNpbXBsZSAqLworaW50IHN5c2N0bF9kcm9wX2NhY2hlczsKKworc3RhdGljIHZvaWQgZHJvcF9wYWdlY2FjaGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCAmc2ItPnNfaW5vZGVzLCBpX3NiX2xpc3QpIHsKKwkJaWYgKGlub2RlLT5pX3N0YXRlICYgKElfRlJFRUlOR3xJX1dJTExfRlJFRSkpCisJCQljb250aW51ZTsKKwkJaW52YWxpZGF0ZV9pbm9kZV9wYWdlcyhpbm9kZS0+aV9tYXBwaW5nKTsKKwl9CisJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworfQorCit2b2lkIGRyb3BfcGFnZWNhY2hlKHZvaWQpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKworCXNwaW5fbG9jaygmc2JfbG9jayk7CityZXN0YXJ0OgorCWxpc3RfZm9yX2VhY2hfZW50cnkoc2IsICZzdXBlcl9ibG9ja3MsIHNfbGlzdCkgeworCQlzYi0+c19jb3VudCsrOworCQlzcGluX3VubG9jaygmc2JfbG9jayk7CisJCWRvd25fcmVhZCgmc2ItPnNfdW1vdW50KTsKKwkJaWYgKHNiLT5zX3Jvb3QpCisJCQlkcm9wX3BhZ2VjYWNoZV9zYihzYik7CisJCXVwX3JlYWQoJnNiLT5zX3Vtb3VudCk7CisJCXNwaW5fbG9jaygmc2JfbG9jayk7CisJCWlmIChfX3B1dF9zdXBlcl9hbmRfbmVlZF9yZXN0YXJ0KHNiKSkKKwkJCWdvdG8gcmVzdGFydDsKKwl9CisJc3Bpbl91bmxvY2soJnNiX2xvY2spOworfQorCit2b2lkIGRyb3Bfc2xhYih2b2lkKQoreworCWludCBucl9vYmplY3RzOworCisJZG8geworCQlucl9vYmplY3RzID0gc2hyaW5rX3NsYWIoMTAwMCwgR0ZQX0tFUk5FTCwgMTAwMCk7CisJfSB3aGlsZSAobnJfb2JqZWN0cyA+IDEwKTsKK30KKworaW50IGRyb3BfY2FjaGVzX3N5c2N0bF9oYW5kbGVyKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwlzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgsIGxvZmZfdCAqcHBvcykKK3sKKwlwcm9jX2RvaW50dmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGZpbGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTsKKwlpZiAod3JpdGUpIHsKKwkJaWYgKHN5c2N0bF9kcm9wX2NhY2hlcyAmIDEpCisJCQlkcm9wX3BhZ2VjYWNoZSgpOworCQlpZiAoc3lzY3RsX2Ryb3BfY2FjaGVzICYgMikKKwkJCWRyb3Bfc2xhYigpOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2Vmcy9zdXBlci5jIGIvZnMvZWZzL3N1cGVyLmMKaW5kZXggZDhkNWVhOS4uYWZjNDg5MSAxMDA2NDQKLS0tIGEvZnMvZWZzL3N1cGVyLmMKKysrIGIvZnMvZWZzL3N1cGVyLmMKQEAgLTIyMiwxMiArMjIyLDEzIEBACiAJCQlzYmxvY2spOwogI2VuZGlmCiAJfQotCXJldHVybihzYmxvY2spOworCXJldHVybiBzYmxvY2s7CiB9CiAKIHN0YXRpYyBpbnQgZWZzX3ZhbGlkYXRlX3N1cGVyKHN0cnVjdCBlZnNfc2JfaW5mbyAqc2IsIHN0cnVjdCBlZnNfc3VwZXIgKnN1cGVyKSB7CiAKLQlpZiAoIUlTX0VGU19NQUdJQyhiZTMyX3RvX2NwdShzdXBlci0+ZnNfbWFnaWMpKSkgcmV0dXJuIC0xOworCWlmICghSVNfRUZTX01BR0lDKGJlMzJfdG9fY3B1KHN1cGVyLT5mc19tYWdpYykpKQorCQlyZXR1cm4gLTE7CiAKIAlzYi0+ZnNfbWFnaWMgICAgID0gYmUzMl90b19jcHUoc3VwZXItPmZzX21hZ2ljKTsKIAlzYi0+dG90YWxfYmxvY2tzID0gYmUzMl90b19jcHUoc3VwZXItPmZzX3NpemUpOwpkaWZmIC0tZ2l0IGEvZnMvZXhlYy5jIGIvZnMvZXhlYy5jCmluZGV4IGU3NWE5NTQuLjA1NTM3OGQgMTAwNjQ0Ci0tLSBhL2ZzL2V4ZWMuYworKysgYi9mcy9leGVjLmMKQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCWludCBlcnI7CiAJc3RydWN0IGZpbGUgKmZpbGU7CiAKLQllcnIgPSBwYXRoX2xvb2t1cF9vcGVuKG5hbWUsIExPT0tVUF9GT0xMT1csICZuZCwgRk1PREVfUkVBRCk7CisJZXJyID0gcGF0aF9sb29rdXBfb3BlbihBVF9GRENXRCwgbmFtZSwgTE9PS1VQX0ZPTExPVywgJm5kLCBGTU9ERV9SRUFEKTsKIAlmaWxlID0gRVJSX1BUUihlcnIpOwogCiAJaWYgKCFlcnIpIHsKQEAgLTU3NSw3ICs1NzUsNyBAQAogICogZGlzdHVyYmluZyBvdGhlciBwcm9jZXNzZXMuICAoT3RoZXIgcHJvY2Vzc2VzIG1pZ2h0IHNoYXJlIHRoZSBzaWduYWwKICAqIHRhYmxlIHZpYSB0aGUgQ0xPTkVfU0lHSEFORCBvcHRpb24gdG8gY2xvbmUoKS4pCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGRlX3RocmVhZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3N0YXRpYyBpbnQgZGVfdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewogCXN0cnVjdCBzaWduYWxfc3RydWN0ICpzaWcgPSB0c2stPnNpZ25hbDsKIAlzdHJ1Y3Qgc2lnaGFuZF9zdHJ1Y3QgKm5ld3NpZ2hhbmQsICpvbGRzaWdoYW5kID0gdHNrLT5zaWdoYW5kOwpAQCAtNjMyLDEwICs2MzIsMTAgQEAKIAkJICogc3luY2hyb25pemUgd2l0aCBhbnkgZmlyaW5nIChieSBjYWxsaW5nIGRlbF90aW1lcl9zeW5jKQogCQkgKiBiZWZvcmUgd2UgY2FuIHNhZmVseSBsZXQgdGhlIG9sZCBncm91cCBsZWFkZXIgZGllLgogCQkgKi8KLQkJc2lnLT5yZWFsX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyljdXJyZW50OworCQlzaWctPnJlYWxfdGltZXIuZGF0YSA9IGN1cnJlbnQ7CiAJCXNwaW5fdW5sb2NrX2lycShsb2NrKTsKLQkJaWYgKGRlbF90aW1lcl9zeW5jKCZzaWctPnJlYWxfdGltZXIpKQotCQkJYWRkX3RpbWVyKCZzaWctPnJlYWxfdGltZXIpOworCQlpZiAoaHJ0aW1lcl9jYW5jZWwoJnNpZy0+cmVhbF90aW1lcikpCisJCQlocnRpbWVyX3Jlc3RhcnQoJnNpZy0+cmVhbF90aW1lcik7CiAJCXNwaW5fbG9ja19pcnEobG9jayk7CiAJfQogCXdoaWxlIChhdG9taWNfcmVhZCgmc2lnLT5jb3VudCkgPiBjb3VudCkgewpAQCAtNzYwLDcgKzc2MCw3IEBACiAJCXNwaW5fbG9jaygmb2xkc2lnaGFuZC0+c2lnbG9jayk7CiAJCXNwaW5fbG9jaygmbmV3c2lnaGFuZC0+c2lnbG9jayk7CiAKLQkJY3VycmVudC0+c2lnaGFuZCA9IG5ld3NpZ2hhbmQ7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihjdXJyZW50LT5zaWdoYW5kLCBuZXdzaWdoYW5kKTsKIAkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKIAogCQlzcGluX3VubG9jaygmbmV3c2lnaGFuZC0+c2lnbG9jayk7CkBAIC03NjgsNyArNzY4LDcgQEAKIAkJd3JpdGVfdW5sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CiAKIAkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJm9sZHNpZ2hhbmQtPmNvdW50KSkKLQkJCWttZW1fY2FjaGVfZnJlZShzaWdoYW5kX2NhY2hlcCwgb2xkc2lnaGFuZCk7CisJCQlzaWdoYW5kX2ZyZWUob2xkc2lnaGFuZCk7CiAJfQogCiAJQlVHX09OKCF0aHJlYWRfZ3JvdXBfbGVhZGVyKGN1cnJlbnQpKTsKQEAgLTc4MCw3ICs3ODAsNyBAQAogICogc28gdGhhdCBhIG5ldyBvbmUgY2FuIGJlIHN0YXJ0ZWQKICAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfb2xkX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcykKK3N0YXRpYyB2b2lkIGZsdXNoX29sZF9maWxlcyhzdHJ1Y3QgZmlsZXNfc3RydWN0ICogZmlsZXMpCiB7CiAJbG9uZyBqID0gLTE7CiAJc3RydWN0IGZkdGFibGUgKmZkdDsKQEAgLTk2NCw3ICs5NjQsNyBAQAogCiBFWFBPUlRfU1lNQk9MKHByZXBhcmVfYmlucHJtKTsKIAotc3RhdGljIGlubGluZSBpbnQgdW5zYWZlX2V4ZWMoc3RydWN0IHRhc2tfc3RydWN0ICpwKQorc3RhdGljIGludCB1bnNhZmVfZXhlYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJaW50IHVuc2FmZSA9IDA7CiAJaWYgKHAtPnB0cmFjZSAmIFBUX1BUUkFDRUQpIHsKQEAgLTE0NjIsNiArMTQ2Miw3IEBACiAJaWYgKCEoY3VycmVudC0+c2lnbmFsLT5mbGFncyAmIFNJR05BTF9HUk9VUF9FWElUKSkgewogCQljdXJyZW50LT5zaWduYWwtPmZsYWdzID0gU0lHTkFMX0dST1VQX0VYSVQ7CiAJCWN1cnJlbnQtPnNpZ25hbC0+Z3JvdXBfZXhpdF9jb2RlID0gZXhpdF9jb2RlOworCQljdXJyZW50LT5zaWduYWwtPmdyb3VwX3N0b3BfY291bnQgPSAwOwogCQlyZXR2YWwgPSAwOwogCX0KIAlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwpAQCAtMTQ3Nyw3ICsxNDc4LDYgQEAKIAkgKiBDbGVhciBhbnkgZmFsc2UgaW5kaWNhdGlvbiBvZiBwZW5kaW5nIHNpZ25hbHMgdGhhdCBtaWdodAogCSAqIGJlIHNlZW4gYnkgdGhlIGZpbGVzeXN0ZW0gY29kZSBjYWxsZWQgdG8gd3JpdGUgdGhlIGNvcmUgZmlsZS4KIAkgKi8KLQljdXJyZW50LT5zaWduYWwtPmdyb3VwX3N0b3BfY291bnQgPSAwOwogCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9TSUdQRU5ESU5HKTsKIAogCWlmIChjdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX0NPUkVdLnJsaW1fY3VyIDwgYmluZm10LT5taW5fY29yZWR1bXApCkBAIC0xNTA1LDcgKzE1MDUsNyBAQAogCQlnb3RvIGNsb3NlX2ZhaWw7CiAJaWYgKCFmaWxlLT5mX29wLT53cml0ZSkKIAkJZ290byBjbG9zZV9mYWlsOwotCWlmIChkb190cnVuY2F0ZShmaWxlLT5mX2RlbnRyeSwgMCwgZmlsZSkgIT0gMCkKKwlpZiAoZG9fdHJ1bmNhdGUoZmlsZS0+Zl9kZW50cnksIDAsIDAsIGZpbGUpICE9IDApCiAJCWdvdG8gY2xvc2VfZmFpbDsKIAogCXJldHZhbCA9IGJpbmZtdC0+Y29yZV9kdW1wKHNpZ25yLCByZWdzLCBmaWxlKTsKZGlmZiAtLWdpdCBhL2ZzL2V4cG9ydGZzL2V4cGZzLmMgYi9mcy9leHBvcnRmcy9leHBmcy5jCmluZGV4IGM0OWQ2MjUuLmIwNmI1NGYgMTAwNjQ0Ci0tLSBhL2ZzL2V4cG9ydGZzL2V4cGZzLmMKKysrIGIvZnMvZXhwb3J0ZnMvZXhwZnMuYwpAQCAtMTEsNiArMTEsMzMgQEAKIAogI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJncy4uLikgZG97fXdoaWxlKDApCiAKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKK2ZpbmRfYWNjZXB0YWJsZV9hbGlhcyhzdHJ1Y3QgZGVudHJ5ICpyZXN1bHQsCisJCWludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSksCisJCXZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCAqdG9wdXQgPSBOVUxMOworCisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZW50cnksICZyZXN1bHQtPmRfaW5vZGUtPmlfZGVudHJ5LCBkX2FsaWFzKSB7CisJCWRnZXRfbG9ja2VkKGRlbnRyeSk7CisJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCWlmICh0b3B1dCkKKwkJCWRwdXQodG9wdXQpOworCQlpZiAoZGVudHJ5ICE9IHJlc3VsdCAmJiBhY2NlcHRhYmxlKGNvbnRleHQsIGRlbnRyeSkpIHsKKwkJCWRwdXQocmVzdWx0KTsKKwkJCXJldHVybiBkZW50cnk7CisJCX0KKwkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJCXRvcHV0ID0gZGVudHJ5OworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCisJaWYgKHRvcHV0KQorCQlkcHV0KHRvcHV0KTsKKwlyZXR1cm4gTlVMTDsKK30KKwogLyoqCiAgKiBmaW5kX2V4cG9ydGVkX2RlbnRyeSAtIGhlbHBlciByb3V0aW5lIHRvIGltcGxlbWVudCBleHBvcnRfb3BlcmF0aW9ucy0+ZGVjb2RlX2ZoCiAgKiBAc2I6CQlUaGUgJnN1cGVyX2Jsb2NrIGlkZW50aWZ5aW5nIHRoZSBmaWxlc3lzdGVtCkBAIC01Miw4ICs3OSw3IEBACiAJc3RydWN0IGRlbnRyeSAqdGFyZ2V0X2RpcjsKIAlpbnQgZXJyOwogCXN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyAqbm9wcyA9IHNiLT5zX2V4cG9ydF9vcDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsZSwgKmhlYWQ7Ci0Jc3RydWN0IGRlbnRyeSAqdG9wdXQgPSBOVUxMOworCXN0cnVjdCBkZW50cnkgKmFsaWFzOwogCWludCBub3Byb2dyZXNzOwogCWNoYXIgbmJ1ZltOQU1FX01BWCsxXTsKIApAQCAtNzksMjcgKzEwNSwxMCBAQAogCQkJLyogdGhlcmUgaXMgbm8gb3RoZXIgZGVudHJ5LCBzbyBmYWlsICovCiAJCQlnb3RvIGVycl9yZXN1bHQ7CiAJCX0KLQkJLyogdHJ5IGFueSBvdGhlciBhbGlhc2VzICovCi0JCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOwotCQloZWFkID0gJnJlc3VsdC0+ZF9pbm9kZS0+aV9kZW50cnk7Ci0JCWxpc3RfZm9yX2VhY2gobGUsIGhlYWQpIHsKLQkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGxpc3RfZW50cnkobGUsIHN0cnVjdCBkZW50cnksIGRfYWxpYXMpOwotCQkJZGdldF9sb2NrZWQoZGVudHJ5KTsKLQkJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7Ci0JCQlpZiAodG9wdXQpCi0JCQkJZHB1dCh0b3B1dCk7Ci0JCQl0b3B1dCA9IE5VTEw7Ci0JCQlpZiAoZGVudHJ5ICE9IHJlc3VsdCAmJgotCQkJICAgIGFjY2VwdGFibGUoY29udGV4dCwgZGVudHJ5KSkgewotCQkJCWRwdXQocmVzdWx0KTsKLQkJCQlyZXR1cm4gZGVudHJ5OwotCQkJfQotCQkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7Ci0JCQl0b3B1dCA9IGRlbnRyeTsKLQkJfQotCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOwotCQlpZiAodG9wdXQpCi0JCQlkcHV0KHRvcHV0KTsKKworCQlhbGlhcyA9IGZpbmRfYWNjZXB0YWJsZV9hbGlhcyhyZXN1bHQsIGFjY2VwdGFibGUsIGNvbnRleHQpOworCQlpZiAoYWxpYXMpCisJCQlyZXR1cm4gYWxpYXM7CiAJfQkJCQogCiAJLyogSXQncyBhIGRpcmVjdG9yeSwgb3Igd2UgYXJlIHJlcXVpcmVkIHRvIGNvbmZpcm0gdGhlIGZpbGUncwpAQCAtMTc3LDkgKzE4Niw5IEBACiAJCQlzdHJ1Y3QgZGVudHJ5ICpwcGQ7CiAJCQlzdHJ1Y3QgZGVudHJ5ICpucGQ7CiAKLQkJCWRvd24oJnBkLT5kX2lub2RlLT5pX3NlbSk7CisJCQltdXRleF9sb2NrKCZwZC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJCQlwcGQgPSBDQUxMKG5vcHMsZ2V0X3BhcmVudCkocGQpOwotCQkJdXAoJnBkLT5kX2lub2RlLT5pX3NlbSk7CisJCQltdXRleF91bmxvY2soJnBkLT5kX2lub2RlLT5pX211dGV4KTsKIAogCQkJaWYgKElTX0VSUihwcGQpKSB7CiAJCQkJZXJyID0gUFRSX0VSUihwcGQpOwpAQCAtMjAxLDkgKzIxMCw5IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlkcHJpbnRrKCJmaW5kX2V4cG9ydGVkX2RlbnRyeTogZm91bmQgbmFtZTogJXNcbiIsIG5idWYpOwotCQkJZG93bigmcHBkLT5kX2lub2RlLT5pX3NlbSk7CisJCQltdXRleF9sb2NrKCZwcGQtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCQkJbnBkID0gbG9va3VwX29uZV9sZW4obmJ1ZiwgcHBkLCBzdHJsZW4obmJ1ZikpOwotCQkJdXAoJnBwZC0+ZF9pbm9kZS0+aV9zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZwcGQtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCQkJaWYgKElTX0VSUihucGQpKSB7CiAJCQkJZXJyID0gUFRSX0VSUihucGQpOwogCQkJCWRwcmludGsoImZpbmRfZXhwb3J0ZWRfZGVudHJ5OiBsb29rdXAgZmFpbGVkOiAlZFxuIiwgZXJyKTsKQEAgLTI0Miw5ICsyNTEsOSBAQAogCQlzdHJ1Y3QgZGVudHJ5ICpucmVzdWx0OwogCQllcnIgPSBDQUxMKG5vcHMsZ2V0X25hbWUpKHRhcmdldF9kaXIsIG5idWYsIHJlc3VsdCk7CiAJCWlmICghZXJyKSB7Ci0JCQlkb3duKCZ0YXJnZXRfZGlyLT5kX2lub2RlLT5pX3NlbSk7CisJCQltdXRleF9sb2NrKCZ0YXJnZXRfZGlyLT5kX2lub2RlLT5pX211dGV4KTsKIAkJCW5yZXN1bHQgPSBsb29rdXBfb25lX2xlbihuYnVmLCB0YXJnZXRfZGlyLCBzdHJsZW4obmJ1ZikpOwotCQkJdXAoJnRhcmdldF9kaXItPmRfaW5vZGUtPmlfc2VtKTsKKwkJCW11dGV4X3VubG9jaygmdGFyZ2V0X2Rpci0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJCQlpZiAoIUlTX0VSUihucmVzdWx0KSkgewogCQkJCWlmIChucmVzdWx0LT5kX2lub2RlKSB7CiAJCQkJCWRwdXQocmVzdWx0KTsKQEAgLTI1OCwyNiArMjY3LDEwIEBACiAJLyogbm93IHJlc3VsdCBpcyBwcm9wZXJseSBjb25uZWN0ZWQsIGl0IGlzIG91ciBiZXN0IGJldCAqLwogCWlmIChhY2NlcHRhYmxlKGNvbnRleHQsIHJlc3VsdCkpCiAJCXJldHVybiByZXN1bHQ7Ci0JLyogb25lIGxhc3QgdHJ5IG9mIHRoZSBhbGlhc2VzLi4gKi8KLQlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKLQl0b3B1dCA9IE5VTEw7Ci0JaGVhZCA9ICZyZXN1bHQtPmRfaW5vZGUtPmlfZGVudHJ5OwotCWxpc3RfZm9yX2VhY2gobGUsIGhlYWQpIHsKLQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gbGlzdF9lbnRyeShsZSwgc3RydWN0IGRlbnRyeSwgZF9hbGlhcyk7Ci0JCWRnZXRfbG9ja2VkKGRlbnRyeSk7Ci0JCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7Ci0JCWlmICh0b3B1dCkgZHB1dCh0b3B1dCk7Ci0JCWlmIChkZW50cnkgIT0gcmVzdWx0ICYmCi0JCSAgICBhY2NlcHRhYmxlKGNvbnRleHQsIGRlbnRyeSkpIHsKLQkJCWRwdXQocmVzdWx0KTsKLQkJCXJldHVybiBkZW50cnk7Ci0JCX0KLQkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7Ci0JCXRvcHV0ID0gZGVudHJ5OwotCX0KLQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOwotCWlmICh0b3B1dCkKLQkJZHB1dCh0b3B1dCk7CisKKwlhbGlhcyA9IGZpbmRfYWNjZXB0YWJsZV9hbGlhcyhyZXN1bHQsIGFjY2VwdGFibGUsIGNvbnRleHQpOworCWlmIChhbGlhcykKKwkJcmV0dXJuIGFsaWFzOwogCiAJLyogZHJhdCAtIEkganVzdCBjYW5ub3QgZmluZCBhbnl0aGluZyBhY2NlcHRhYmxlICovCiAJZHB1dChyZXN1bHQpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9hY2wuYyBiL2ZzL2V4dDIvYWNsLmMKaW5kZXggNmFmMmY0MS4uMzVhY2M0MyAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9hY2wuYworKysgYi9mcy9leHQyL2FjbC5jCkBAIC00LDYgKzQsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgQW5kcmVhcyBHcnVlbmJhY2hlciwgPGFncnVlbkBzdXNlLmRlPgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMTQ5LDcgKzE1MCw3IEBACiB9CiAKIC8qCi0gKiBpbm9kZS0+aV9zZW06IGRvbid0IGNhcmUKKyAqIGlub2RlLT5pX211dGV4OiBkb24ndCBjYXJlCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgcG9zaXhfYWNsICoKIGV4dDJfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKQEAgLTIxMSw3ICsyMTIsNyBAQAogfQogCiAvKgotICogaW5vZGUtPmlfc2VtOiBkb3duCisgKiBpbm9kZS0+aV9tdXRleDogZG93bgogICovCiBzdGF0aWMgaW50CiBleHQyX3NldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUsIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCkKQEAgLTMwMSw4ICszMDIsOCBAQAogLyoKICAqIEluaXRpYWxpemUgdGhlIEFDTHMgb2YgYSBuZXcgaW5vZGUuIENhbGxlZCBmcm9tIGV4dDJfbmV3X2lub2RlLgogICoKLSAqIGRpci0+aV9zZW06IGRvd24KLSAqIGlub2RlLT5pX3NlbTogdXAgKGFjY2VzcyB0byBpbm9kZSBpcyBzdGlsbCBleGNsdXNpdmUpCisgKiBkaXItPmlfbXV0ZXg6IGRvd24KKyAqIGlub2RlLT5pX211dGV4OiB1cCAoYWNjZXNzIHRvIGlub2RlIGlzIHN0aWxsIGV4Y2x1c2l2ZSkKICAqLwogaW50CiBleHQyX2luaXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyKQpAQCAtMzYxLDcgKzM2Miw3IEBACiAgKiBmb3IgZGlyZWN0b3JpZXMpIGFyZSBhZGRlZC4gVGhlcmUgYXJlIG5vIG1vcmUgYml0cyBhdmFpbGFibGUgaW4gdGhlCiAgKiBmaWxlIG1vZGUuCiAgKgotICogaW5vZGUtPmlfc2VtOiBkb3duCisgKiBpbm9kZS0+aV9tdXRleDogZG93bgogICovCiBpbnQKIGV4dDJfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqaW5vZGUpCmRpZmYgLS1naXQgYS9mcy9leHQyL2JhbGxvYy5jIGIvZnMvZXh0Mi9iYWxsb2MuYwppbmRleCBiYjY5MDgwLi4yYzAwOTUzIDEwMDY0NAotLS0gYS9mcy9leHQyL2JhbGxvYy5jCisrKyBiL2ZzL2V4dDIvYmFsbG9jLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAKIC8qCiAgKiBiYWxsb2MuYyBjb250YWlucyB0aGUgYmxvY2tzIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiByb3V0aW5lcwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9iaXRtYXAuYyBiL2ZzL2V4dDIvYml0bWFwLmMKaW5kZXggMjAxNDViNy4uZTk5ODNhMCAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9iaXRtYXAuYworKysgYi9mcy9leHQyL2JpdG1hcC5jCkBAIC03LDggKzcsMTIgQEAKICAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKICAqLwogCisjaWZkZWYgRVhUMkZTX0RFQlVHCisKICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogCisjaW5jbHVkZSAiZXh0Mi5oIgorCiBzdGF0aWMgaW50IG5pYmJsZW1hcFtdID0gezQsIDMsIDMsIDIsIDMsIDIsIDIsIDEsIDMsIDIsIDIsIDEsIDIsIDEsIDEsIDB9OwogCiB1bnNpZ25lZCBsb25nIGV4dDJfY291bnRfZnJlZSAoc3RydWN0IGJ1ZmZlcl9oZWFkICogbWFwLCB1bnNpZ25lZCBpbnQgbnVtY2hhcnMpCkBAIC0yMywzICsyNyw2IEBACiAJCQluaWJibGVtYXBbKG1hcC0+Yl9kYXRhW2ldID4+IDQpICYgMHhmXTsKIAlyZXR1cm4gKHN1bSk7CiB9CisKKyNlbmRpZiAgLyogIEVYVDJGU19ERUJVRyAgKi8KKwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9kaXIuYyBiL2ZzL2V4dDIvZGlyLmMKaW5kZXggNWI1ZjUyOC4uNzQ0MmJkZCAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9kaXIuYworKysgYi9mcy9leHQyL2Rpci5jCkBAIC01OTIsNyArNTkyLDcgQEAKIAkJZ290byBmYWlsOwogCX0KIAlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKLSAgICAgICBtZW1zZXQoa2FkZHIsIDAsIGNodW5rX3NpemUpOworCW1lbXNldChrYWRkciwgMCwgY2h1bmtfc2l6ZSk7CiAJZGUgPSAoc3RydWN0IGV4dDJfZGlyX2VudHJ5XzIgKilrYWRkcjsKIAlkZS0+bmFtZV9sZW4gPSAxOwogCWRlLT5yZWNfbGVuID0gY3B1X3RvX2xlMTYoRVhUMl9ESVJfUkVDX0xFTigxKSk7CmRpZmYgLS1naXQgYS9mcy9leHQyL2V4dDIuaCBiL2ZzL2V4dDIvZXh0Mi5oCmluZGV4IGU5NzdmODUuLjAwZGUwYTcgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvZXh0Mi5oCisrKyBiL2ZzL2V4dDIvZXh0Mi5oCkBAIC01Myw3ICs1Myw3IEBACiAjaWZkZWYgQ09ORklHX0VYVDJfRlNfWEFUVFIKIAkvKgogCSAqIEV4dGVuZGVkIGF0dHJpYnV0ZXMgY2FuIGJlIHJlYWQgaW5kZXBlbmRlbnRseSBvZiB0aGUgbWFpbiBmaWxlCi0JICogZGF0YS4gVGFraW5nIGlfc2VtIGV2ZW4gd2hlbiByZWFkaW5nIHdvdWxkIGNhdXNlIGNvbnRlbnRpb24KKwkgKiBkYXRhLiBUYWtpbmcgaV9tdXRleCBldmVuIHdoZW4gcmVhZGluZyB3b3VsZCBjYXVzZSBjb250ZW50aW9uCiAJICogYmV0d2VlbiByZWFkZXJzIG9mIEVBcyBhbmQgd3JpdGVycyBvZiByZWd1bGFyIGZpbGUgZGF0YSwgc28KIAkgKiBpbnN0ZWFkIHdlIHN5bmNocm9uaXplIG9uIHhhdHRyX3NlbSB3aGVuIHJlYWRpbmcgb3IgY2hhbmdpbmcKIAkgKiBFQXMuCmRpZmYgLS1naXQgYS9mcy9leHQyL2lvY3RsLmMgYi9mcy9leHQyL2lvY3RsLmMKaW5kZXggNzA5ZDg2Ny4uM2NhOWFmZCAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9pb2N0bC5jCisrKyBiL2ZzL2V4dDIvaW9jdGwuYwpAQCAtOCw2ICs4LDcgQEAKICAqLwogCiAjaW5jbHVkZSAiZXh0Mi5oIgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9uYW1laS5jIGIvZnMvZXh0Mi9uYW1laS5jCmluZGV4IGM1NTEzOTUuLmFkMTQzMmEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvbmFtZWkuYworKysgYi9mcy9leHQyL25hbWVpLmMKQEAgLTgzLDEwICs4Myw3IEBACiAJCWlmICghaW5vZGUpCiAJCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKIAl9Ci0JaWYgKGlub2RlKQotCQlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7Ci0JZF9hZGQoZGVudHJ5LCBpbm9kZSk7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlub2RlLCBkZW50cnkpOwogfQogCiBzdHJ1Y3QgZGVudHJ5ICpleHQyX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpCmRpZmYgLS1naXQgYS9mcy9leHQyL3N1cGVyLmMgYi9mcy9leHQyL3N1cGVyLmMKaW5kZXggNTIyZmE3MC4uOGQ2ODE5OCAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9zdXBlci5jCisrKyBiL2ZzL2V4dDIvc3VwZXIuYwpAQCAtMTE1Miw3ICsxMTUyLDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgdG1wX2JoOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAKLQlkb3duKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAl3aGlsZSAodG93cml0ZSA+IDApIHsKIAkJdG9jb3B5ID0gc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDwgdG93cml0ZSA/CiAJCQkJc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDogdG93cml0ZTsKQEAgLTExODksNyArMTE4OSw3IEBACiAJaW5vZGUtPmlfdmVyc2lvbisrOwogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Ci0JdXAoJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJcmV0dXJuIGxlbiAtIHRvd3JpdGU7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDIveGF0dHIuYyBiL2ZzL2V4dDIveGF0dHIuYwppbmRleCAwMDk5NDYyLi5hMmNhMzEwIDEwMDY0NAotLS0gYS9mcy9leHQyL3hhdHRyLmMKKysrIGIvZnMvZXh0Mi94YXR0ci5jCkBAIC0zMjUsNyArMzI1LDcgQEAKIC8qCiAgKiBJbm9kZSBvcGVyYXRpb24gbGlzdHhhdHRyKCkKICAqCi0gKiBkZW50cnktPmRfaW5vZGUtPmlfc2VtOiBkb24ndCBjYXJlCisgKiBkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXg6IGRvbid0IGNhcmUKICAqLwogc3NpemVfdAogZXh0Ml9saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQpAQCAtMzg5LDEwICszODksNiBAQAogCWVhX2lkZWJ1Zyhpbm9kZSwgIm5hbWU9JWQuJXMsIHZhbHVlPSVwLCB2YWx1ZV9sZW49JWxkIiwKIAkJICBuYW1lX2luZGV4LCBuYW1lLCB2YWx1ZSwgKGxvbmcpdmFsdWVfbGVuKTsKIAotCWlmIChJU19SRE9OTFkoaW5vZGUpKQotCQlyZXR1cm4gLUVST0ZTOwotCWlmIChJU19JTU1VVEFCTEUoaW5vZGUpIHx8IElTX0FQUEVORChpbm9kZSkpCi0JCXJldHVybiAtRVBFUk07CiAJaWYgKHZhbHVlID09IE5VTEwpCiAJCXZhbHVlX2xlbiA9IDA7CiAJaWYgKG5hbWUgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL2ZzL2V4dDIveGF0dHJfdHJ1c3RlZC5jIGIvZnMvZXh0Mi94YXR0cl90cnVzdGVkLmMKaW5kZXggNTJiMzBlZS4uZjI4YTZhNCAxMDA2NDQKLS0tIGEvZnMvZXh0Mi94YXR0cl90cnVzdGVkLmMKKysrIGIvZnMvZXh0Mi94YXR0cl90cnVzdGVkLmMKQEAgLTcsNiArNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2V4dDJfZnMuaD4KQEAgLTM4LDggKzM5LDYgQEAKIHsKIAlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCXJldHVybiAtRVBFUk07CiAJcmV0dXJuIGV4dDJfeGF0dHJfZ2V0KGlub2RlLCBFWFQyX1hBVFRSX0lOREVYX1RSVVNURUQsIG5hbWUsCiAJCQkgICAgICBidWZmZXIsIHNpemUpOwogfQpAQCAtNTAsOCArNDksNiBAQAogewogCWlmIChzdHJjbXAobmFtZSwgIiIpID09IDApCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJcmV0dXJuIC1FUEVSTTsKIAlyZXR1cm4gZXh0Ml94YXR0cl9zZXQoaW5vZGUsIEVYVDJfWEFUVFJfSU5ERVhfVFJVU1RFRCwgbmFtZSwKIAkJCSAgICAgIHZhbHVlLCBzaXplLCBmbGFncyk7CiB9CmRpZmYgLS1naXQgYS9mcy9leHQyL3hhdHRyX3VzZXIuYyBiL2ZzL2V4dDIveGF0dHJfdXNlci5jCmluZGV4IDBjMDNlYTEuLmYzODNlN2MgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIveGF0dHJfdXNlci5jCisrKyBiL2ZzL2V4dDIveGF0dHJfdXNlci5jCkBAIC0zNSwxNiArMzUsMTAgQEAKIGV4dDJfeGF0dHJfdXNlcl9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKIAkJICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7Ci0JaW50IGVycm9yOwotCiAJaWYgKHN0cmNtcChuYW1lLCAiIikgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCF0ZXN0X29wdChpbm9kZS0+aV9zYiwgWEFUVFJfVVNFUikpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKLQllcnJvciA9IHBlcm1pc3Npb24oaW5vZGUsIE1BWV9SRUFELCBOVUxMKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKLQogCXJldHVybiBleHQyX3hhdHRyX2dldChpbm9kZSwgRVhUMl9YQVRUUl9JTkRFWF9VU0VSLCBuYW1lLCBidWZmZXIsIHNpemUpOwogfQogCkBAIC01MiwxOCArNDYsMTAgQEAKIGV4dDJfeGF0dHJfdXNlcl9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKIAkJICAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQogewotCWludCBlcnJvcjsKLQogCWlmIChzdHJjbXAobmFtZSwgIiIpID09IDApCiAJCXJldHVybiAtRUlOVkFMOwogCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFhBVFRSX1VTRVIpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JaWYgKCAhU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJgotCSAgICAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgaW5vZGUtPmlfbW9kZSAmIFNfSVNWVFgpKQotCQlyZXR1cm4gLUVQRVJNOwotCWVycm9yID0gcGVybWlzc2lvbihpbm9kZSwgTUFZX1dSSVRFLCBOVUxMKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKIAogCXJldHVybiBleHQyX3hhdHRyX3NldChpbm9kZSwgRVhUMl9YQVRUUl9JTkRFWF9VU0VSLCBuYW1lLAogCQkJICAgICAgdmFsdWUsIHNpemUsIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvYWNsLmMgYi9mcy9leHQzL2FjbC5jCmluZGV4IDNhYzM4MjYuLjQ3YTlkYTIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvYWNsLmMKKysrIGIvZnMvZXh0My9hY2wuYwpAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZXh0M19qYmQuaD4KICNpbmNsdWRlIDxsaW51eC9leHQzX2ZzLmg+CkBAIC0xNTIsNyArMTUzLDcgQEAKIC8qCiAgKiBJbm9kZSBvcGVyYXRpb24gZ2V0X3Bvc2l4X2FjbCgpLgogICoKLSAqIGlub2RlLT5pX3NlbTogZG9uJ3QgY2FyZQorICogaW5vZGUtPmlfbXV0ZXg6IGRvbid0IGNhcmUKICAqLwogc3RhdGljIHN0cnVjdCBwb3NpeF9hY2wgKgogZXh0M19nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQpAQCAtMjE2LDcgKzIxNyw3IEBACiAvKgogICogU2V0IHRoZSBhY2Nlc3Mgb3IgZGVmYXVsdCBBQ0wgb2YgYW4gaW5vZGUuCiAgKgotICogaW5vZGUtPmlfc2VtOiBkb3duIHVubGVzcyBjYWxsZWQgZnJvbSBleHQzX25ld19pbm9kZQorICogaW5vZGUtPmlfbXV0ZXg6IGRvd24gdW5sZXNzIGNhbGxlZCBmcm9tIGV4dDNfbmV3X2lub2RlCiAgKi8KIHN0YXRpYyBpbnQKIGV4dDNfc2V0X2FjbChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwKQEAgLTMwNiw4ICszMDcsOCBAQAogLyoKICAqIEluaXRpYWxpemUgdGhlIEFDTHMgb2YgYSBuZXcgaW5vZGUuIENhbGxlZCBmcm9tIGV4dDNfbmV3X2lub2RlLgogICoKLSAqIGRpci0+aV9zZW06IGRvd24KLSAqIGlub2RlLT5pX3NlbTogdXAgKGFjY2VzcyB0byBpbm9kZSBpcyBzdGlsbCBleGNsdXNpdmUpCisgKiBkaXItPmlfbXV0ZXg6IGRvd24KKyAqIGlub2RlLT5pX211dGV4OiB1cCAoYWNjZXNzIHRvIGlub2RlIGlzIHN0aWxsIGV4Y2x1c2l2ZSkKICAqLwogaW50CiBleHQzX2luaXRfYWNsKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyKQpAQCAtMzY4LDcgKzM2OSw3IEBACiAgKiBmb3IgZGlyZWN0b3JpZXMpIGFyZSBhZGRlZC4gVGhlcmUgYXJlIG5vIG1vcmUgYml0cyBhdmFpbGFibGUgaW4gdGhlCiAgKiBmaWxlIG1vZGUuCiAgKgotICogaW5vZGUtPmlfc2VtOiBkb3duCisgKiBpbm9kZS0+aV9tdXRleDogZG93bgogICovCiBpbnQKIGV4dDNfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqaW5vZGUpCmRpZmYgLS1naXQgYS9mcy9leHQzL2JhbGxvYy5jIGIvZnMvZXh0My9iYWxsb2MuYwppbmRleCBhZTExNDhjLi42MjUwZmNkIDEwMDY0NAotLS0gYS9mcy9leHQzL2JhbGxvYy5jCisrKyBiL2ZzL2V4dDMvYmFsbG9jLmMKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9qYmQuaD4KICNpbmNsdWRlIDxsaW51eC9leHQzX2ZzLmg+CkBAIC0yMCw4ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogCi0jaW5jbHVkZSAiYml0bWFwLmgiCi0KIC8qCiAgKiBiYWxsb2MuYyBjb250YWlucyB0aGUgYmxvY2tzIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiByb3V0aW5lcwogICovCmRpZmYgLS1naXQgYS9mcy9leHQzL2JpdG1hcC5jIGIvZnMvZXh0My9iaXRtYXAuYwppbmRleCA1YjRiYTNlLi5jYjE2YjRjIDEwMDY0NAotLS0gYS9mcy9leHQzL2JpdG1hcC5jCisrKyBiL2ZzL2V4dDMvYml0bWFwLmMKQEAgLTcsOCArNywxMSBAQAogICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQogICovCiAKKyNpZmRlZiBFWFQzRlNfREVCVUcKKwogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+Ci0jaW5jbHVkZSAiYml0bWFwLmgiCisKKyNpbmNsdWRlICJleHQzX2ZzLmgiCiAKIHN0YXRpYyBpbnQgbmliYmxlbWFwW10gPSB7NCwgMywgMywgMiwgMywgMiwgMiwgMSwgMywgMiwgMiwgMSwgMiwgMSwgMSwgMH07CiAKQEAgLTI0LDMgKzI3LDYgQEAKIAkJCW5pYmJsZW1hcFsobWFwLT5iX2RhdGFbaV0gPj4gNCkgJiAweGZdOwogCXJldHVybiAoc3VtKTsKIH0KKworI2VuZGlmICAvKiAgRVhUM0ZTX0RFQlVHICAqLworCmRpZmYgLS1naXQgYS9mcy9leHQzL2JpdG1hcC5oIGIvZnMvZXh0My9iaXRtYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVlNTAzYS4uMDAwMDAwMAotLS0gYS9mcy9leHQzL2JpdG1hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0vKiAgbGludXgvZnMvZXh0My9iaXRtYXAuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0qLwotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBleHQzX2NvdW50X2ZyZWUgKHN0cnVjdCBidWZmZXJfaGVhZCAqLCB1bnNpZ25lZCBpbnQgKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvaWFsbG9jLmMgYi9mcy9leHQzL2lhbGxvYy5jCmluZGV4IDllNGEyNDMuLmRjODI2NDYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvaWFsbG9jLmMKKysrIGIvZnMvZXh0My9pYWxsb2MuYwpAQCAtMjYsNyArMjYsNiBAQAogCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCi0jaW5jbHVkZSAiYml0bWFwLmgiCiAjaW5jbHVkZSAieGF0dHIuaCIKICNpbmNsdWRlICJhY2wuaCIKIApAQCAtNjUxLDcgKzY1MCw3IEBACiAJLyogRXJyb3IgY2FzZXMgLSBlMmZzY2sgaGFzIGFscmVhZHkgY2xlYW5lZCB1cCBmb3IgdXMgKi8KIAlpZiAoaW5vID4gbWF4X2lubykgewogCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKLQkJCSAgICAgImJhZCBvcnBoYW4gaW5vICVsdSEgIGUyZnNjayB3YXMgcnVuP1xuIiwgaW5vKTsKKwkJCSAgICAgImJhZCBvcnBoYW4gaW5vICVsdSEgIGUyZnNjayB3YXMgcnVuPyIsIGlubyk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtNjYwLDcgKzY1OSw3IEBACiAJYml0bWFwX2JoID0gcmVhZF9pbm9kZV9iaXRtYXAoc2IsIGJsb2NrX2dyb3VwKTsKIAlpZiAoIWJpdG1hcF9iaCkgewogCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKLQkJCSAgICAgImlub2RlIGJpdG1hcCBlcnJvciBmb3Igb3JwaGFuICVsdVxuIiwgaW5vKTsKKwkJCSAgICAgImlub2RlIGJpdG1hcCBlcnJvciBmb3Igb3JwaGFuICVsdSIsIGlubyk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtNjcyLDcgKzY3MSw3IEBACiAJCQkhKGlub2RlID0gaWdldChzYiwgaW5vKSkgfHwgaXNfYmFkX2lub2RlKGlub2RlKSB8fAogCQkJTkVYVF9PUlBIQU4oaW5vZGUpID4gbWF4X2lubykgewogCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKLQkJCSAgICAgImJhZCBvcnBoYW4gaW5vZGUgJWx1ISAgZTJmc2NrIHdhcyBydW4/XG4iLCBpbm8pOworCQkJICAgICAiYmFkIG9ycGhhbiBpbm9kZSAlbHUhICBlMmZzY2sgd2FzIHJ1bj8iLCBpbm8pOwogCQlwcmludGsoS0VSTl9OT1RJQ0UgImV4dDNfdGVzdF9iaXQoYml0PSVkLCBibG9jaz0lbGx1KSA9ICVkXG4iLAogCQkgICAgICAgYml0LCAodW5zaWduZWQgbG9uZyBsb25nKWJpdG1hcF9iaC0+Yl9ibG9ja25yLAogCQkgICAgICAgZXh0M190ZXN0X2JpdChiaXQsIGJpdG1hcF9iaC0+Yl9kYXRhKSk7CmRpZmYgLS1naXQgYS9mcy9leHQzL2lvY3RsLmMgYi9mcy9leHQzL2lvY3RsLmMKaW5kZXggNzA2ZDY4Ni4uNTU2Y2Q1NSAxMDA2NDQKLS0tIGEvZnMvZXh0My9pb2N0bC5jCisrKyBiL2ZzL2V4dDMvaW9jdGwuYwpAQCAtOSw2ICs5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvamJkLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2V4dDNfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9leHQzX2piZC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KZGlmZiAtLWdpdCBhL2ZzL2V4dDMvbmFtZWkuYyBiL2ZzL2V4dDMvbmFtZWkuYwppbmRleCBiM2M2OTBhLi44YmQ4YWMwIDEwMDY0NAotLS0gYS9mcy9leHQzL25hbWVpLmMKKysrIGIvZnMvZXh0My9uYW1laS5jCkBAIC0xMDA1LDEwICsxMDA1LDcgQEAKIAkJaWYgKCFpbm9kZSkKIAkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwogCX0KLQlpZiAoaW5vZGUpCi0JCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKLQlkX2FkZChkZW50cnksIGlub2RlKTsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CiB9CiAKIApAQCAtMTQ3Niw3ICsxNDczLDcgQEAKIAkJaWYgKGxldmVscyAmJiAoZHhfZ2V0X2NvdW50KGZyYW1lcy0+ZW50cmllcykgPT0KIAkJCSAgICAgICBkeF9nZXRfbGltaXQoZnJhbWVzLT5lbnRyaWVzKSkpIHsKIAkJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAotCQkJCSAgICAgIkRpcmVjdG9yeSBpbmRleCBmdWxsIVxuIik7CisJCQkJICAgICAiRGlyZWN0b3J5IGluZGV4IGZ1bGwhIik7CiAJCQllcnIgPSAtRU5PU1BDOwogCQkJZ290byBjbGVhbnVwOwogCQl9CmRpZmYgLS1naXQgYS9mcy9leHQzL3Jlc2l6ZS5jIGIvZnMvZXh0My9yZXNpemUuYwppbmRleCA2MTA0YWQzLi4xMDQxZGFiIDEwMDY0NAotLS0gYS9mcy9leHQzL3Jlc2l6ZS5jCisrKyBiL2ZzL2V4dDMvcmVzaXplLmMKQEAgLTMxLDcgKzMxLDcgQEAKIAl1bnNpZ25lZCBzdGFydCA9IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCk7CiAJdW5zaWduZWQgZW5kID0gc3RhcnQgKyBpbnB1dC0+YmxvY2tzX2NvdW50OwogCXVuc2lnbmVkIGdyb3VwID0gaW5wdXQtPmdyb3VwOwotCXVuc2lnbmVkIGl0ZW5kID0gaW5wdXQtPmlub2RlX3RhYmxlICsgRVhUM19TQihzYiktPnNfaXRiX3Blcl9ncm91cDsKKwl1bnNpZ25lZCBpdGVuZCA9IGlucHV0LT5pbm9kZV90YWJsZSArIHNiaS0+c19pdGJfcGVyX2dyb3VwOwogCXVuc2lnbmVkIG92ZXJoZWFkID0gZXh0M19iZ19oYXNfc3VwZXIoc2IsIGdyb3VwKSA/CiAJCSgxICsgZXh0M19iZ19udW1fZ2RiKHNiLCBncm91cCkgKwogCQkgbGUxNl90b19jcHUoZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcykpIDogMDsKQEAgLTM0MCw3ICszNDAsNyBAQAogCXdoaWxlICgoZ3JwID0gZXh0M19saXN0X2JhY2t1cHMoc2IsICZ0aHJlZSwgJmZpdmUsICZzZXZlbikpIDwgZW5kKSB7CiAJCWlmIChsZTMyX3RvX2NwdSgqcCsrKSAhPSBncnAgKiBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpICsgYmxrKXsKIAkJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAotCQkJCSAgICAgInJlc2VydmVkIEdEVCAlbGQgbWlzc2luZyBncnAgJWQgKCVsZClcbiIsCisJCQkJICAgICAicmVzZXJ2ZWQgR0RUICVsZCBtaXNzaW5nIGdycCAlZCAoJWxkKSIsCiAJCQkJICAgICBibGssIGdycCwKIAkJCQkgICAgIGdycCAqIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikgKyBibGspOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zOTMsNyArMzkzLDcgQEAKIAlpZiAoRVhUM19TQihzYiktPnNfc2JoLT5iX2Jsb2NrbnIgIT0KIAkgICAgbGUzMl90b19jcHUoRVhUM19TQihzYiktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykpIHsKIAkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCi0JCQkid29uJ3QgcmVzaXplIHVzaW5nIGJhY2t1cCBzdXBlcmJsb2NrIGF0ICVsbHVcbiIsCisJCQkid29uJ3QgcmVzaXplIHVzaW5nIGJhY2t1cCBzdXBlcmJsb2NrIGF0ICVsbHUiLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylFWFQzX1NCKHNiKS0+c19zYmgtPmJfYmxvY2tucik7CiAJCXJldHVybiAtRVBFUk07CiAJfQpAQCAtNDE3LDcgKzQxNyw3IEBACiAJZGF0YSA9IChfX3UzMiAqKWRpbmQtPmJfZGF0YTsKIAlpZiAobGUzMl90b19jcHUoZGF0YVtnZGJfbnVtICUgRVhUM19BRERSX1BFUl9CTE9DSyhzYildKSAhPSBnZGJsb2NrKSB7CiAJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAotCQkJICAgICAibmV3IGdyb3VwICV1IEdEVCBibG9jayAlbHUgbm90IHJlc2VydmVkXG4iLAorCQkJICAgICAibmV3IGdyb3VwICV1IEdEVCBibG9jayAlbHUgbm90IHJlc2VydmVkIiwKIAkJCSAgICAgaW5wdXQtPmdyb3VwLCBnZGJsb2NrKTsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBleGl0X2RpbmQ7CkBAIC01NDAsNyArNTQwLDcgQEAKIAlmb3IgKHJlcyA9IDA7IHJlcyA8IHJlc2VydmVkX2dkYjsgcmVzKyssIGJsaysrKSB7CiAJCWlmIChsZTMyX3RvX2NwdSgqZGF0YSkgIT0gYmxrKSB7CiAJCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKLQkJCQkgICAgICJyZXNlcnZlZCBibG9jayAlbHUgbm90IGF0IG9mZnNldCAlbGRcbiIsCisJCQkJICAgICAicmVzZXJ2ZWQgYmxvY2sgJWx1IG5vdCBhdCBvZmZzZXQgJWxkIiwKIAkJCQkgICAgIGJsaywgKGxvbmcpKGRhdGEgLSAoX191MzIgKilkaW5kLT5iX2RhdGEpKTsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlnb3RvIGV4aXRfYmg7CkBAIC02ODMsNyArNjgzLDcgQEAKIAlpZiAoZXJyKSB7CiAJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAogCQkJICAgICAiY2FuJ3QgdXBkYXRlIGJhY2t1cCBmb3IgZ3JvdXAgJWQgKGVyciAlZCksICIKLQkJCSAgICAgImZvcmNpbmcgZnNjayBvbiBuZXh0IHJlYm9vdFxuIiwgZ3JvdXAsIGVycik7CisJCQkgICAgICJmb3JjaW5nIGZzY2sgb24gbmV4dCByZWJvb3QiLCBncm91cCwgZXJyKTsKIAkJc2JpLT5zX21vdW50X3N0YXRlICY9IH5FWFQzX1ZBTElEX0ZTOwogCQlzYmktPnNfZXMtPnNfc3RhdGUgJj0gfmNwdV90b19sZTE2KEVYVDNfVkFMSURfRlMpOwogCQltYXJrX2J1ZmZlcl9kaXJ0eShzYmktPnNfc2JoKTsKQEAgLTcyMiw3ICs3MjIsNyBAQAogCWlmIChnZGJfb2ZmID09IDAgJiYgIUVYVDNfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLAogCQkJCQlFWFQzX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUikpIHsKIAkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCi0JCQkgICAgICJDYW4ndCByZXNpemUgbm9uLXNwYXJzZSBmaWxlc3lzdGVtIGZ1cnRoZXJcbiIpOworCQkJICAgICAiQ2FuJ3QgcmVzaXplIG5vbi1zcGFyc2UgZmlsZXN5c3RlbSBmdXJ0aGVyIik7CiAJCXJldHVybiAtRVBFUk07CiAJfQogCkBAIC03MzAsMTMgKzczMCwxMyBAQAogCQlpZiAoIUVYVDNfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLAogCQkJCQkgICAgIEVYVDNfRkVBVFVSRV9DT01QQVRfUkVTSVpFX0lOT0RFKSl7CiAJCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKLQkJCQkgICAgICJObyByZXNlcnZlZCBHRFQgYmxvY2tzLCBjYW4ndCByZXNpemVcbiIpOworCQkJCSAgICAgIk5vIHJlc2VydmVkIEdEVCBibG9ja3MsIGNhbid0IHJlc2l6ZSIpOwogCQkJcmV0dXJuIC1FUEVSTTsKIAkJfQogCQlpbm9kZSA9IGlnZXQoc2IsIEVYVDNfUkVTSVpFX0lOTyk7CiAJCWlmICghaW5vZGUgfHwgaXNfYmFkX2lub2RlKGlub2RlKSkgewogCQkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCi0JCQkJICAgICAiRXJyb3Igb3BlbmluZyByZXNpemUgaW5vZGVcbiIpOworCQkJCSAgICAgIkVycm9yIG9wZW5pbmcgcmVzaXplIGlub2RlIik7CiAJCQlpcHV0KGlub2RlKTsKIAkJCXJldHVybiAtRU5PRU5UOwogCQl9CkBAIC03NjQsOSArNzY0LDkgQEAKIAl9CiAKIAlsb2NrX3N1cGVyKHNiKTsKLQlpZiAoaW5wdXQtPmdyb3VwICE9IEVYVDNfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudCkgeworCWlmIChpbnB1dC0+Z3JvdXAgIT0gc2JpLT5zX2dyb3Vwc19jb3VudCkgewogCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKLQkJCSAgICAgIm11bHRpcGxlIHJlc2l6ZXJzIHJ1biBvbiBmaWxlc3lzdGVtIVxuIik7CisJCQkgICAgICJtdWx0aXBsZSByZXNpemVycyBydW4gb24gZmlsZXN5c3RlbSEiKTsKIAkJZXJyID0gLUVCVVNZOwogCQlnb3RvIGV4aXRfam91cm5hbDsKIAl9CkBAIC03OTksNyArNzk5LDcgQEAKIAkgKiBkYXRhLiAgU28gd2UgbmVlZCB0byBiZSBjYXJlZnVsIHRvIHNldCBhbGwgb2YgdGhlIHJlbGV2YW50CiAJICogZ3JvdXAgZGVzY3JpcHRvciBkYXRhIGV0Yy4gKmJlZm9yZSogd2UgZW5hYmxlIHRoZSBncm91cC4KIAkgKgotCSAqIFRoZSBrZXkgZmllbGQgaGVyZSBpcyBFWFQzX1NCKHNiKS0+c19ncm91cHNfY291bnQ6IGFzIGxvbmcgYXMKKwkgKiBUaGUga2V5IGZpZWxkIGhlcmUgaXMgc2JpLT5zX2dyb3Vwc19jb3VudDogYXMgbG9uZyBhcwogCSAqIHRoYXQgcmV0YWlucyBpdHMgb2xkIHZhbHVlLCBub2JvZHkgaXMgZ29pbmcgdG8gYWNjZXNzIHRoZSBuZXcKIAkgKiBncm91cC4KIAkgKgpAQCAtODU5LDcgKzg1OSw3IEBACiAJc21wX3dtYigpOwogCiAJLyogVXBkYXRlIHRoZSBnbG9iYWwgZnMgc2l6ZSBmaWVsZHMgKi8KLQlFWFQzX1NCKHNiKS0+c19ncm91cHNfY291bnQrKzsKKwlzYmktPnNfZ3JvdXBzX2NvdW50Kys7CiAKIAlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBwcmltYXJ5KTsKIApAQCAtODc0LDcgKzg3NCw3IEBACiAJcGVyY3B1X2NvdW50ZXJfbW9kKCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyLAogCQkJICAgRVhUM19JTk9ERVNfUEVSX0dST1VQKHNiKSk7CiAKLQlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBFWFQzX1NCKHNiKS0+c19zYmgpOworCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIHNiaS0+c19zYmgpOwogCXNiLT5zX2RpcnQgPSAxOwogCiBleGl0X2pvdXJuYWw6CkBAIC05MzcsNyArOTM3LDcgQEAKIAogCWlmIChsYXN0ID09IDApIHsKIAkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCi0JCQkgICAgICJuZWVkIHRvIHVzZSBleHQyb25saW5lIHRvIHJlc2l6ZSBmdXJ0aGVyXG4iKTsKKwkJCSAgICAgIm5lZWQgdG8gdXNlIGV4dDJvbmxpbmUgdG8gcmVzaXplIGZ1cnRoZXIiKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CiAKQEAgLTk3Myw3ICs5NzMsNyBAQAogCWxvY2tfc3VwZXIoc2IpOwogCWlmIChvX2Jsb2Nrc19jb3VudCAhPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpKSB7CiAJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAotCQkJICAgICAibXVsdGlwbGUgcmVzaXplcnMgcnVuIG9uIGZpbGVzeXN0ZW0hXG4iKTsKKwkJCSAgICAgIm11bHRpcGxlIHJlc2l6ZXJzIHJ1biBvbiBmaWxlc3lzdGVtISIpOwogCQllcnIgPSAtRUJVU1k7CiAJCWdvdG8gZXhpdF9wdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZXh0My9zdXBlci5jIGIvZnMvZXh0My9zdXBlci5jCmluZGV4IDRlNjczMDYuLjU2YmY3NjUgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvc3VwZXIuYworKysgYi9mcy9leHQzL3N1cGVyLmMKQEAgLTQzLDcgKzQzLDggQEAKICNpbmNsdWRlICJhY2wuaCIKICNpbmNsdWRlICJuYW1laS5oIgogCi1zdGF0aWMgaW50IGV4dDNfbG9hZF9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqKTsKK3N0YXRpYyBpbnQgZXh0M19sb2FkX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICosCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgam91cm5hbF9kZXZudW0pOwogc3RhdGljIGludCBleHQzX2NyZWF0ZV9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqLAogCQkJICAgICAgIGludCk7CiBzdGF0aWMgdm9pZCBleHQzX2NvbW1pdF9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCkBAIC02MjgsNyArNjI5LDcgQEAKIAlPcHRfbm91aWQzMiwgT3B0X25vY2hlY2ssIE9wdF9kZWJ1ZywgT3B0X29sZGFsbG9jLCBPcHRfb3Jsb3YsCiAJT3B0X3VzZXJfeGF0dHIsIE9wdF9ub3VzZXJfeGF0dHIsIE9wdF9hY2wsIE9wdF9ub2FjbCwKIAlPcHRfcmVzZXJ2YXRpb24sIE9wdF9ub3Jlc2VydmF0aW9uLCBPcHRfbm9sb2FkLCBPcHRfbm9iaCwKLQlPcHRfY29tbWl0LCBPcHRfam91cm5hbF91cGRhdGUsIE9wdF9qb3VybmFsX2ludW0sCisJT3B0X2NvbW1pdCwgT3B0X2pvdXJuYWxfdXBkYXRlLCBPcHRfam91cm5hbF9pbnVtLCBPcHRfam91cm5hbF9kZXYsCiAJT3B0X2Fib3J0LCBPcHRfZGF0YV9qb3VybmFsLCBPcHRfZGF0YV9vcmRlcmVkLCBPcHRfZGF0YV93cml0ZWJhY2ssCiAJT3B0X3VzcmpxdW90YSwgT3B0X2dycGpxdW90YSwgT3B0X29mZnVzcmpxdW90YSwgT3B0X29mZmdycGpxdW90YSwKIAlPcHRfanFmbXRfdmZzb2xkLCBPcHRfanFmbXRfdmZzdjAsIE9wdF9xdW90YSwgT3B0X25vcXVvdGEsCkBAIC02NjYsNiArNjY3LDcgQEAKIAl7T3B0X2NvbW1pdCwgImNvbW1pdD0ldSJ9LAogCXtPcHRfam91cm5hbF91cGRhdGUsICJqb3VybmFsPXVwZGF0ZSJ9LAogCXtPcHRfam91cm5hbF9pbnVtLCAiam91cm5hbD0ldSJ9LAorCXtPcHRfam91cm5hbF9kZXYsICJqb3VybmFsX2Rldj0ldSJ9LAogCXtPcHRfYWJvcnQsICJhYm9ydCJ9LAogCXtPcHRfZGF0YV9qb3VybmFsLCAiZGF0YT1qb3VybmFsIn0sCiAJe09wdF9kYXRhX29yZGVyZWQsICJkYXRhPW9yZGVyZWQifSwKQEAgLTcwNSw4ICs3MDcsOSBAQAogCXJldHVybiBzYl9ibG9jazsKIH0KIAotc3RhdGljIGludCBwYXJzZV9vcHRpb25zIChjaGFyICogb3B0aW9ucywgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJCSAgdW5zaWduZWQgbG9uZyAqIGludW0sIHVuc2lnbmVkIGxvbmcgKm5fYmxvY2tzX2NvdW50LCBpbnQgaXNfcmVtb3VudCkKK3N0YXRpYyBpbnQgcGFyc2Vfb3B0aW9ucyAoY2hhciAqb3B0aW9ucywgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgdW5zaWduZWQgbG9uZyAqaW51bSwgdW5zaWduZWQgbG9uZyAqam91cm5hbF9kZXZudW0sCisJCQkgIHVuc2lnbmVkIGxvbmcgKm5fYmxvY2tzX2NvdW50LCBpbnQgaXNfcmVtb3VudCkKIHsKIAlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkgPSBFWFQzX1NCKHNiKTsKIAljaGFyICogcDsKQEAgLTgzOSw2ICs4NDIsMTYgQEAKIAkJCQlyZXR1cm4gMDsKIAkJCSppbnVtID0gb3B0aW9uOwogCQkJYnJlYWs7CisJCWNhc2UgT3B0X2pvdXJuYWxfZGV2OgorCQkJaWYgKGlzX3JlbW91bnQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGNhbm5vdCBzcGVjaWZ5ICIKKwkJCQkgICAgICAgImpvdXJuYWwgb24gcmVtb3VudFxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCSpqb3VybmFsX2Rldm51bSA9IG9wdGlvbjsKKwkJCWJyZWFrOwogCQljYXNlIE9wdF9ub2xvYWQ6CiAJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBOT0xPQUQpOwogCQkJYnJlYWs7CkBAIC0xMzMxLDYgKzEzNDQsNyBAQAogCXVuc2lnbmVkIGxvbmcgbG9naWNfc2JfYmxvY2s7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgam91cm5hbF9pbnVtID0gMDsKKwl1bnNpZ25lZCBsb25nIGpvdXJuYWxfZGV2bnVtID0gMDsKIAl1bnNpZ25lZCBsb25nIGRlZl9tb3VudF9vcHRzOwogCXN0cnVjdCBpbm9kZSAqcm9vdDsKIAlpbnQgYmxvY2tzaXplOwpAQCAtMTQxMSw3ICsxNDI1LDggQEAKIAogCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgUkVTRVJWQVRJT04pOwogCi0JaWYgKCFwYXJzZV9vcHRpb25zICgoY2hhciAqKSBkYXRhLCBzYiwgJmpvdXJuYWxfaW51bSwgTlVMTCwgMCkpCisJaWYgKCFwYXJzZV9vcHRpb25zICgoY2hhciAqKSBkYXRhLCBzYiwgJmpvdXJuYWxfaW51bSwgJmpvdXJuYWxfZGV2bnVtLAorCQkJICAgIE5VTEwsIDApKQogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAogCXNiLT5zX2ZsYWdzID0gKHNiLT5zX2ZsYWdzICYgfk1TX1BPU0lYQUNMKSB8CkBAIC0xNjIyLDcgKzE2MzcsNyBAQAogCSAqLwogCWlmICghdGVzdF9vcHQoc2IsIE5PTE9BRCkgJiYKIAkgICAgRVhUM19IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwpKSB7Ci0JCWlmIChleHQzX2xvYWRfam91cm5hbChzYiwgZXMpKQorCQlpZiAoZXh0M19sb2FkX2pvdXJuYWwoc2IsIGVzLCBqb3VybmFsX2Rldm51bSkpCiAJCQlnb3RvIGZhaWxlZF9tb3VudDI7CiAJfSBlbHNlIGlmIChqb3VybmFsX2ludW0pIHsKIAkJaWYgKGV4dDNfY3JlYXRlX2pvdXJuYWwoc2IsIGVzLCBqb3VybmFsX2ludW0pKQpAQCAtMTkwMiwxNSArMTkxNywyNCBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IGV4dDNfbG9hZF9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAotCQkJICAgICBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqIGVzKQorc3RhdGljIGludCBleHQzX2xvYWRfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICAgICBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXMsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgam91cm5hbF9kZXZudW0pCiB7CiAJam91cm5hbF90ICpqb3VybmFsOwogCWludCBqb3VybmFsX2ludW0gPSBsZTMyX3RvX2NwdShlcy0+c19qb3VybmFsX2ludW0pOwotCWRldl90IGpvdXJuYWxfZGV2ID0gbmV3X2RlY29kZV9kZXYobGUzMl90b19jcHUoZXMtPnNfam91cm5hbF9kZXYpKTsKKwlkZXZfdCBqb3VybmFsX2RldjsKIAlpbnQgZXJyID0gMDsKIAlpbnQgcmVhbGx5X3JlYWRfb25seTsKIAorCWlmIChqb3VybmFsX2Rldm51bSAmJgorCSAgICBqb3VybmFsX2Rldm51bSAhPSBsZTMyX3RvX2NwdShlcy0+c19qb3VybmFsX2RldikpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRVhUMy1mczogZXh0ZXJuYWwgam91cm5hbCBkZXZpY2UgbWFqb3IvbWlub3IgIgorCQkJIm51bWJlcnMgaGF2ZSBjaGFuZ2VkXG4iKTsKKwkJam91cm5hbF9kZXYgPSBuZXdfZGVjb2RlX2Rldihqb3VybmFsX2Rldm51bSk7CisJfSBlbHNlCisJCWpvdXJuYWxfZGV2ID0gbmV3X2RlY29kZV9kZXYobGUzMl90b19jcHUoZXMtPnNfam91cm5hbF9kZXYpKTsKKwogCXJlYWxseV9yZWFkX29ubHkgPSBiZGV2X3JlYWRfb25seShzYi0+c19iZGV2KTsKIAogCS8qCkBAIC0xOTY5LDYgKzE5OTMsMTYgQEAKIAogCUVYVDNfU0Ioc2IpLT5zX2pvdXJuYWwgPSBqb3VybmFsOwogCWV4dDNfY2xlYXJfam91cm5hbF9lcnIoc2IsIGVzKTsKKworCWlmIChqb3VybmFsX2Rldm51bSAmJgorCSAgICBqb3VybmFsX2Rldm51bSAhPSBsZTMyX3RvX2NwdShlcy0+c19qb3VybmFsX2RldikpIHsKKwkJZXMtPnNfam91cm5hbF9kZXYgPSBjcHVfdG9fbGUzMihqb3VybmFsX2Rldm51bSk7CisJCXNiLT5zX2RpcnQgPSAxOworCisJCS8qIE1ha2Ugc3VyZSB3ZSBmbHVzaCB0aGUgcmVjb3ZlcnkgZmxhZyB0byBkaXNrLiAqLworCQlleHQzX2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0yMTE2LDcgKzIxNTAsNyBAQAogCiBzdGF0aWMgdm9pZCBleHQzX3dyaXRlX3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKIHsKLQlpZiAoZG93bl90cnlsb2NrKCZzYi0+c19sb2NrKSA9PSAwKQorCWlmIChtdXRleF90cnlsb2NrKCZzYi0+c19sb2NrKSAhPSAwKQogCQlCVUcoKTsKIAlzYi0+c19kaXJ0ID0gMDsKIH0KQEAgLTIxOTcsNyArMjIzMSw3IEBACiAJLyoKIAkgKiBBbGxvdyB0aGUgImNoZWNrIiBvcHRpb24gdG8gYmUgcGFzc2VkIGFzIGEgcmVtb3VudCBvcHRpb24uCiAJICovCi0JaWYgKCFwYXJzZV9vcHRpb25zKGRhdGEsIHNiLCBOVUxMLCAmbl9ibG9ja3NfY291bnQsIDEpKSB7CisJaWYgKCFwYXJzZV9vcHRpb25zKGRhdGEsIHNiLCBOVUxMLCBOVUxMLCAmbl9ibG9ja3NfY291bnQsIDEpKSB7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gcmVzdG9yZV9vcHRzOwogCX0KQEAgLTI1NjcsNyArMjYwMSw3IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAloYW5kbGVfdCAqaGFuZGxlID0gam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOwogCi0JZG93bigmaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJd2hpbGUgKHRvd3JpdGUgPiAwKSB7CiAJCXRvY29weSA9IHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCA8IHRvd3JpdGUgPwogCQkJCXNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCA6IHRvd3JpdGU7CkBAIC0yNjEwLDcgKzI2NDQsNyBAQAogCWlub2RlLT5pX3ZlcnNpb24rKzsKIAlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKLQl1cCgmaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gbGVuIC0gdG93cml0ZTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZXh0My94YXR0ci5jIGIvZnMvZXh0My94YXR0ci5jCmluZGV4IDQzMGRlOWYuLmU4ZDYwYmYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMveGF0dHIuYworKysgYi9mcy9leHQzL3hhdHRyLmMKQEAgLTE0MCw3ICsxNDAsNyBAQAogLyoKICAqIElub2RlIG9wZXJhdGlvbiBsaXN0eGF0dHIoKQogICoKLSAqIGRlbnRyeS0+ZF9pbm9kZS0+aV9zZW06IGRvbid0IGNhcmUKKyAqIGRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleDogZG9uJ3QgY2FyZQogICovCiBzc2l6ZV90CiBleHQzX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCkBAIC05NDYsMTAgKzk0Niw2IEBACiAJfTsKIAlpbnQgZXJyb3I7CiAKLQlpZiAoSVNfUkRPTkxZKGlub2RlKSkKLQkJcmV0dXJuIC1FUk9GUzsKLQlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpKQotCQlyZXR1cm4gLUVQRVJNOwogCWlmICghbmFtZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHN0cmxlbihuYW1lKSA+IDI1NSkKZGlmZiAtLWdpdCBhL2ZzL2V4dDMveGF0dHJfdHJ1c3RlZC5jIGIvZnMvZXh0My94YXR0cl90cnVzdGVkLmMKaW5kZXggZjY4YmZkMS4uODZkOTFmMSAxMDA2NDQKLS0tIGEvZnMvZXh0My94YXR0cl90cnVzdGVkLmMKKysrIGIvZnMvZXh0My94YXR0cl90cnVzdGVkLmMKQEAgLTcsNiArNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2V4dDNfamJkLmg+CkBAIC0zOSw4ICs0MCw2IEBACiB7CiAJaWYgKHN0cmNtcChuYW1lLCAiIikgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQotCQlyZXR1cm4gLUVQRVJNOwogCXJldHVybiBleHQzX3hhdHRyX2dldChpbm9kZSwgRVhUM19YQVRUUl9JTkRFWF9UUlVTVEVELCBuYW1lLAogCQkJICAgICAgYnVmZmVyLCBzaXplKTsKIH0KQEAgLTUxLDggKzUwLDYgQEAKIHsKIAlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCXJldHVybiAtRVBFUk07CiAJcmV0dXJuIGV4dDNfeGF0dHJfc2V0KGlub2RlLCBFWFQzX1hBVFRSX0lOREVYX1RSVVNURUQsIG5hbWUsCiAJCQkgICAgICB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOwogfQpkaWZmIC0tZ2l0IGEvZnMvZXh0My94YXR0cl91c2VyLmMgYi9mcy9leHQzL3hhdHRyX3VzZXIuYwppbmRleCBlOTA3Y2FlLi5hODVhMGExIDEwMDY0NAotLS0gYS9mcy9leHQzL3hhdHRyX3VzZXIuYworKysgYi9mcy9leHQzL3hhdHRyX3VzZXIuYwpAQCAtMzcsMTYgKzM3LDEwIEBACiBleHQzX3hhdHRyX3VzZXJfZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCSAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQogewotCWludCBlcnJvcjsKLQogCWlmIChzdHJjbXAobmFtZSwgIiIpID09IDApCiAJCXJldHVybiAtRUlOVkFMOwogCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFhBVFRSX1VTRVIpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JZXJyb3IgPSBwZXJtaXNzaW9uKGlub2RlLCBNQVlfUkVBRCwgTlVMTCk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0KIAlyZXR1cm4gZXh0M194YXR0cl9nZXQoaW5vZGUsIEVYVDNfWEFUVFJfSU5ERVhfVVNFUiwgbmFtZSwgYnVmZmVyLCBzaXplKTsKIH0KIApAQCAtNTQsMTkgKzQ4LDEwIEBACiBleHQzX3hhdHRyX3VzZXJfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCSAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKLQlpbnQgZXJyb3I7Ci0KIAlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBYQVRUUl9VU0VSKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCWlmICggIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYKLQkgICAgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8IGlub2RlLT5pX21vZGUgJiBTX0lTVlRYKSkKLQkJcmV0dXJuIC1FUEVSTTsKLQllcnJvciA9IHBlcm1pc3Npb24oaW5vZGUsIE1BWV9XUklURSwgTlVMTCk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0KIAlyZXR1cm4gZXh0M194YXR0cl9zZXQoaW5vZGUsIEVYVDNfWEFUVFJfSU5ERVhfVVNFUiwgbmFtZSwKIAkJCSAgICAgIHZhbHVlLCBzaXplLCBmbGFncyk7CiB9CmRpZmYgLS1naXQgYS9mcy9mYXQvY2FjaGUuYyBiL2ZzL2ZhdC9jYWNoZS5jCmluZGV4IDc3YzI0ZmMuLjFhY2M5NDEgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9jYWNoZS5jCisrKyBiL2ZzL2ZhdC9jYWNoZS5jCkBAIC0yOTUsNyArMjk1LDggQEAKIAlyZXR1cm4gZGNsdXM7CiB9CiAKLWludCBmYXRfYm1hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBzZWN0b3IsIHNlY3Rvcl90ICpwaHlzKQoraW50IGZhdF9ibWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IHNlY3Rvciwgc2VjdG9yX3QgKnBoeXMsCisJICAgICB1bnNpZ25lZCBsb25nICptYXBwZWRfYmxvY2tzKQogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAlzdHJ1Y3QgbXNkb3Nfc2JfaW5mbyAqc2JpID0gTVNET1NfU0Ioc2IpOwpAQCAtMzAzLDkgKzMwNCwxMiBAQAogCWludCBjbHVzdGVyLCBvZmZzZXQ7CiAKIAkqcGh5cyA9IDA7CisJKm1hcHBlZF9ibG9ja3MgPSAwOwogCWlmICgoc2JpLT5mYXRfYml0cyAhPSAzMikgJiYgKGlub2RlLT5pX2lubyA9PSBNU0RPU19ST09UX0lOTykpIHsKLQkJaWYgKHNlY3RvciA8IChzYmktPmRpcl9lbnRyaWVzID4+IHNiaS0+ZGlyX3Blcl9ibG9ja19iaXRzKSkKKwkJaWYgKHNlY3RvciA8IChzYmktPmRpcl9lbnRyaWVzID4+IHNiaS0+ZGlyX3Blcl9ibG9ja19iaXRzKSkgewogCQkJKnBoeXMgPSBzZWN0b3IgKyBzYmktPmRpcl9zdGFydDsKKwkJCSptYXBwZWRfYmxvY2tzID0gMTsKKwkJfQogCQlyZXR1cm4gMDsKIAl9CiAJbGFzdF9ibG9jayA9IChNU0RPU19JKGlub2RlKS0+bW11X3ByaXZhdGUgKyAoc2ItPnNfYmxvY2tzaXplIC0gMSkpCkBAIC0zMTgsNyArMzIyLDExIEBACiAJY2x1c3RlciA9IGZhdF9ibWFwX2NsdXN0ZXIoaW5vZGUsIGNsdXN0ZXIpOwogCWlmIChjbHVzdGVyIDwgMCkKIAkJcmV0dXJuIGNsdXN0ZXI7Ci0JZWxzZSBpZiAoY2x1c3RlcikKKwllbHNlIGlmIChjbHVzdGVyKSB7CiAJCSpwaHlzID0gZmF0X2NsdXNfdG9fYmxrbnIoc2JpLCBjbHVzdGVyKSArIG9mZnNldDsKKwkJKm1hcHBlZF9ibG9ja3MgPSBzYmktPnNlY19wZXJfY2x1cyAtIG9mZnNldDsKKwkJaWYgKCptYXBwZWRfYmxvY2tzID4gbGFzdF9ibG9jayAtIHNlY3RvcikKKwkJCSptYXBwZWRfYmxvY2tzID0gbGFzdF9ibG9jayAtIHNlY3RvcjsKKwl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9mYXQvZGlyLmMgYi9mcy9mYXQvZGlyLmMKaW5kZXggYmE4MjQ5Ni4uZGIwZGU1YyAxMDA2NDQKLS0tIGEvZnMvZmF0L2Rpci5jCisrKyBiL2ZzL2ZhdC9kaXIuYwpAQCAtNDUsOCArNDUsOCBAQAogCWlmICgoc2JpLT5mYXRfYml0cyAhPSAzMikgJiYgKGRpci0+aV9pbm8gPT0gTVNET1NfUk9PVF9JTk8pKQogCQlyZXR1cm47CiAKLQliaCA9IHNiX2dldGJsayhzYiwgcGh5cyk7Ci0JaWYgKGJoICYmICFidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJYmggPSBzYl9maW5kX2dldF9ibG9jayhzYiwgcGh5cyk7CisJaWYgKGJoID09IE5VTEwgfHwgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKIAkJZm9yIChzZWMgPSAwOyBzZWMgPCBzYmktPnNlY19wZXJfY2x1czsgc2VjKyspCiAJCQlzYl9icmVhZGFoZWFkKHNiLCBwaHlzICsgc2VjKTsKIAl9CkBAIC02OCw4ICs2OCw4IEBACiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKIAlzZWN0b3JfdCBwaHlzLCBpYmxvY2s7Ci0JaW50IG9mZnNldDsKLQlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgbWFwcGVkX2Jsb2NrczsKKwlpbnQgZXJyLCBvZmZzZXQ7CiAKIG5leHQ6CiAJaWYgKCpiaCkKQEAgLTc3LDcgKzc3LDcgQEAKIAogCSpiaCA9IE5VTEw7CiAJaWJsb2NrID0gKnBvcyA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKLQllcnIgPSBmYXRfYm1hcChkaXIsIGlibG9jaywgJnBoeXMpOworCWVyciA9IGZhdF9ibWFwKGRpciwgaWJsb2NrLCAmcGh5cywgJm1hcHBlZF9ibG9ja3MpOwogCWlmIChlcnIgfHwgIXBoeXMpCiAJCXJldHVybiAtMTsJLyogYmV5b25kIEVPRiBvciBlcnJvciAqLwogCkBAIC00MTgsNyArNDE4LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1FWFBPUlRfU1lNQk9MKGZhdF9zZWFyY2hfbG9uZyk7CitFWFBPUlRfU1lNQk9MX0dQTChmYXRfc2VhcmNoX2xvbmcpOwogCiBzdHJ1Y3QgZmF0X2lvY3RsX2ZpbGxkaXJfY2FsbGJhY2sgewogCXN0cnVjdCBkaXJlbnQgX191c2VyICpkaXJlbnQ7CkBAIC03MjksMTMgKzcyOSwxMyBAQAogCiAJYnVmLmRpcmVudCA9IGQxOwogCWJ1Zi5yZXN1bHQgPSAwOwotCWRvd24oJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJldCA9IC1FTk9FTlQ7CiAJaWYgKCFJU19ERUFERElSKGlub2RlKSkgewogCQlyZXQgPSBfX2ZhdF9yZWFkZGlyKGlub2RlLCBmaWxwLCAmYnVmLCBmYXRfaW9jdGxfZmlsbGRpciwKIAkJCQkgICAgc2hvcnRfb25seSwgYm90aCk7CiAJfQotCXVwKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCWlmIChyZXQgPj0gMCkKIAkJcmV0ID0gYnVmLnJlc3VsdDsKIAlyZXR1cm4gcmV0OwpAQCAtNzgwLDcgKzc4MCw3IEBACiAJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKLUVYUE9SVF9TWU1CT0woZmF0X2dldF9kb3Rkb3RfZW50cnkpOworRVhQT1JUX1NZTUJPTF9HUEwoZmF0X2dldF9kb3Rkb3RfZW50cnkpOwogCiAvKiBTZWUgaWYgZGlyZWN0b3J5IGlzIGVtcHR5ICovCiBpbnQgZmF0X2Rpcl9lbXB0eShzdHJ1Y3QgaW5vZGUgKmRpcikKQEAgLTgwMyw3ICs4MDMsNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLUVYUE9SVF9TWU1CT0woZmF0X2Rpcl9lbXB0eSk7CitFWFBPUlRfU1lNQk9MX0dQTChmYXRfZGlyX2VtcHR5KTsKIAogLyoKICAqIGZhdF9zdWJkaXJzIGNvdW50cyB0aGUgbnVtYmVyIG9mIHN1Yi1kaXJlY3RvcmllcyBvZiBkaXIuIEl0IGNhbiBiZSBydW4KQEAgLTg0OSw3ICs4NDksNyBAQAogCXJldHVybiAtRU5PRU5UOwogfQogCi1FWFBPUlRfU1lNQk9MKGZhdF9zY2FuKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGZhdF9zY2FuKTsKIAogc3RhdGljIGludCBfX2ZhdF9yZW1vdmVfZW50cmllcyhzdHJ1Y3QgaW5vZGUgKmRpciwgbG9mZl90IHBvcywgaW50IG5yX3Nsb3RzKQogewpAQCAtOTM2LDcgKzkzNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLUVYUE9SVF9TWU1CT0woZmF0X3JlbW92ZV9lbnRyaWVzKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGZhdF9yZW1vdmVfZW50cmllcyk7CiAKIHN0YXRpYyBpbnQgZmF0X3plcm9lZF9jbHVzdGVyKHN0cnVjdCBpbm9kZSAqZGlyLCBzZWN0b3JfdCBibGtuciwgaW50IG5yX3VzZWQsCiAJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHMsIGludCBucl9iaHMpCkBAIC0xMDQ4LDcgKzEwNDgsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLUVYUE9SVF9TWU1CT0woZmF0X2FsbG9jX25ld19kaXIpOworRVhQT1JUX1NZTUJPTF9HUEwoZmF0X2FsbG9jX25ld19kaXIpOwogCiBzdGF0aWMgaW50IGZhdF9hZGRfbmV3X2VudHJpZXMoc3RydWN0IGlub2RlICpkaXIsIHZvaWQgKnNsb3RzLCBpbnQgbnJfc2xvdHMsCiAJCQkgICAgICAgaW50ICpucl9jbHVzdGVyLCBzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICoqZGUsCkBAIC0xMjY0LDQgKzEyNjQsNCBAQAogCXJldHVybiBlcnI7CiB9CiAKLUVYUE9SVF9TWU1CT0woZmF0X2FkZF9lbnRyaWVzKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGZhdF9hZGRfZW50cmllcyk7CmRpZmYgLS1naXQgYS9mcy9mYXQvZmF0ZW50LmMgYi9mcy9mYXQvZmF0ZW50LmMKaW5kZXggNDE2NGNkNS4uYTFhOWUwNCAxMDA2NDQKLS0tIGEvZnMvZmF0L2ZhdGVudC5jCisrKyBiL2ZzL2ZhdC9mYXRlbnQuYwpAQCAtNDc2LDYgKzQ3Niw3IEBACiAJCQkJc2JpLT5wcmV2X2ZyZWUgPSBlbnRyeTsKIAkJCQlpZiAoc2JpLT5mcmVlX2NsdXN0ZXJzICE9IC0xKQogCQkJCQlzYmktPmZyZWVfY2x1c3RlcnMtLTsKKwkJCQlzYi0+c19kaXJ0ID0gMTsKIAogCQkJCWNsdXN0ZXJbaWR4X2NsdXNdID0gZW50cnk7CiAJCQkJaWR4X2NsdXMrKzsKQEAgLTQ5Niw2ICs0OTcsNyBAQAogCiAJLyogQ291bGRuJ3QgYWxsb2NhdGUgdGhlIGZyZWUgZW50cmllcyAqLwogCXNiaS0+ZnJlZV9jbHVzdGVycyA9IDA7CisJc2ItPnNfZGlydCA9IDE7CiAJZXJyID0gLUVOT1NQQzsKIAogb3V0OgpAQCAtNTA5LDcgKzUxMSw2IEBACiAJfQogCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykKIAkJYnJlbHNlKGJoc1tpXSk7Ci0JZmF0X2NsdXN0ZXJzX2ZsdXNoKHNiKTsKIAogCWlmIChlcnIgJiYgaWR4X2NsdXMpCiAJCWZhdF9mcmVlX2NsdXN0ZXJzKGlub2RlLCBjbHVzdGVyWzBdKTsKQEAgLTU0Miw4ICs1NDMsMTAgQEAKIAkJfQogCiAJCW9wcy0+ZW50X3B1dCgmZmF0ZW50LCBGQVRfRU5UX0ZSRUUpOwotCQlpZiAoc2JpLT5mcmVlX2NsdXN0ZXJzICE9IC0xKQorCQlpZiAoc2JpLT5mcmVlX2NsdXN0ZXJzICE9IC0xKSB7CiAJCQlzYmktPmZyZWVfY2x1c3RlcnMrKzsKKwkJCXNiLT5zX2RpcnQgPSAxOworCQl9CiAKIAkJaWYgKG5yX2JocyArIGZhdGVudC5ucl9iaHMgPiBNQVhfQlVGX1BFUl9QQUdFKSB7CiAJCQlpZiAoc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUykgewpAQCAtNTc4LDcgKzU4MSw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotRVhQT1JUX1NZTUJPTChmYXRfZnJlZV9jbHVzdGVycyk7CitFWFBPUlRfU1lNQk9MX0dQTChmYXRfZnJlZV9jbHVzdGVycyk7CiAKIGludCBmYXRfY291bnRfZnJlZV9jbHVzdGVycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewpAQCAtNjA1LDYgKzYwOCw3IEBACiAJCX0gd2hpbGUgKGZhdF9lbnRfbmV4dChzYmksICZmYXRlbnQpKTsKIAl9CiAJc2JpLT5mcmVlX2NsdXN0ZXJzID0gZnJlZTsKKwlzYi0+c19kaXJ0ID0gMTsKIAlmYXRlbnRfYnJlbHNlKCZmYXRlbnQpOwogb3V0OgogCXVubG9ja19mYXQoc2JpKTsKZGlmZiAtLWdpdCBhL2ZzL2ZhdC9maWxlLmMgYi9mcy9mYXQvZmlsZS5jCmluZGV4IDcxMzQ0MDMuLmU5OWM1YTcgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9maWxlLmMKKysrIGIvZnMvZmF0L2ZpbGUuYwpAQCAtNiwxMSArNiwxMyBAQAogICogIHJlZ3VsYXIgZmlsZSBoYW5kbGluZyBwcmltaXRpdmVzIGZvciBmYXQtYmFzZWQgZmlsZXN5c3RlbXMKICAqLwogCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9tc2Rvc19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KIAogaW50IGZhdF9nZW5lcmljX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKQEAgLTQwLDcgKzQyLDcgQEAKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAKLQkJZG93bigmaW5vZGUtPmlfc2VtKTsKKwkJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCiAJCWlmIChJU19SRE9OTFkoaW5vZGUpKSB7CiAJCQllcnIgPSAtRVJPRlM7CkBAIC0xMDIsNyArMTA0LDcgQEAKIAkJTVNET1NfSShpbm9kZSktPmlfYXR0cnMgPSBhdHRyICYgQVRUUl9VTlVTRUQ7CiAJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCXVwOgotCQl1cCgmaW5vZGUtPmlfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJCXJldHVybiBlcnI7CiAJfQogCWRlZmF1bHQ6CkBAIC0xMjQsNiArMTI2LDI0IEBACiAJLnNlbmRmaWxlCT0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAogfTsKIAorc3RhdGljIGludCBmYXRfY29udF9leHBhbmQoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHNpemUpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCWxvZmZfdCBzdGFydCA9IGlub2RlLT5pX3NpemUsIGNvdW50ID0gc2l6ZSAtIGlub2RlLT5pX3NpemU7CisJaW50IGVycjsKKworCWVyciA9IGdlbmVyaWNfY29udF9leHBhbmRfc2ltcGxlKGlub2RlLCBzaXplKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCWlmIChJU19TWU5DKGlub2RlKSkKKwkJZXJyID0gc3luY19wYWdlX3JhbmdlX25vbG9jayhpbm9kZSwgbWFwcGluZywgc3RhcnQsIGNvdW50KTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCiBpbnQgZmF0X25vdGlmeV9jaGFuZ2Uoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCiB7CiAJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKGRlbnRyeS0+ZF9zYik7CkBAIC0xMzIsMTEgKzE1MiwxNyBAQAogCiAJbG9ja19rZXJuZWwoKTsKIAotCS8qIEZBVCBjYW5ub3QgdHJ1bmNhdGUgdG8gYSBsb25nZXIgZmlsZSAqLworCS8qCisJICogRXhwYW5kIHRoZSBmaWxlLiBTaW5jZSBpbm9kZV9zZXRhdHRyKCkgdXBkYXRlcyAtPmlfc2l6ZQorCSAqIGJlZm9yZSBjYWxsaW5nIHRoZSAtPnRydW5jYXRlKCksIGJ1dCBGQVQgbmVlZHMgdG8gZmlsbCB0aGUKKwkgKiBob2xlIGJlZm9yZSBpdC4KKwkgKi8KIAlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKIAkJaWYgKGF0dHItPmlhX3NpemUgPiBpbm9kZS0+aV9zaXplKSB7Ci0JCQllcnJvciA9IC1FUEVSTTsKLQkJCWdvdG8gb3V0OworCQkJZXJyb3IgPSBmYXRfY29udF9leHBhbmQoaW5vZGUsIGF0dHItPmlhX3NpemUpOworCQkJaWYgKGVycm9yIHx8IGF0dHItPmlhX3ZhbGlkID09IEFUVFJfU0laRSkKKwkJCQlnb3RvIG91dDsKKwkJCWF0dHItPmlhX3ZhbGlkICY9IH5BVFRSX1NJWkU7CiAJCX0KIAl9CiAKQEAgLTE3Myw3ICsxOTksNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotRVhQT1JUX1NZTUJPTChmYXRfbm90aWZ5X2NoYW5nZSk7CitFWFBPUlRfU1lNQk9MX0dQTChmYXRfbm90aWZ5X2NoYW5nZSk7CiAKIC8qIEZyZWUgYWxsIGNsdXN0ZXJzIGFmdGVyIHRoZSBza2lwJ3RoIGNsdXN0ZXIuICovCiBzdGF0aWMgaW50IGZhdF9mcmVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBza2lwKQpkaWZmIC0tZ2l0IGEvZnMvZmF0L2lub2RlLmMgYi9mcy9mYXQvaW5vZGUuYwppbmRleCBhMGY5YjlmLi5lN2Y0YWE3IDEwMDY0NAotLS0gYS9mcy9mYXQvaW5vZGUuYworKysgYi9mcy9mYXQvaW5vZGUuYwpAQCAtMTgsMTAgKzE4LDEyIEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9tc2Rvc19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tcGFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC92ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKICNpZm5kZWYgQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVApAQCAtNDgsNTEgKzUwLDk3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBmYXRfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywKLQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK3N0YXRpYyBpbnQgX19mYXRfZ2V0X2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssCisJCQkgICAgdW5zaWduZWQgbG9uZyAqbWF4X2Jsb2NrcywKKwkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKIAlzZWN0b3JfdCBwaHlzOwotCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBtYXBwZWRfYmxvY2tzOworCWludCBlcnIsIG9mZnNldDsKIAotCWVyciA9IGZhdF9ibWFwKGlub2RlLCBpYmxvY2ssICZwaHlzKTsKKwllcnIgPSBmYXRfYm1hcChpbm9kZSwgaWJsb2NrLCAmcGh5cywgJm1hcHBlZF9ibG9ja3MpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAJaWYgKHBoeXMpIHsKIAkJbWFwX2JoKGJoX3Jlc3VsdCwgc2IsIHBoeXMpOworCQkqbWF4X2Jsb2NrcyA9IG1pbihtYXBwZWRfYmxvY2tzLCAqbWF4X2Jsb2Nrcyk7CiAJCXJldHVybiAwOwogCX0KIAlpZiAoIWNyZWF0ZSkKIAkJcmV0dXJuIDA7CisKIAlpZiAoaWJsb2NrICE9IE1TRE9TX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA+PiBzYi0+c19ibG9ja3NpemVfYml0cykgewogCQlmYXRfZnNfcGFuaWMoc2IsICJjb3JydXB0ZWQgZmlsZSBzaXplIChpX3BvcyAlbGxkLCAlbGxkKSIsCiAJCQkgICAgIE1TRE9TX0koaW5vZGUpLT5pX3BvcywgTVNET1NfSShpbm9kZSktPm1tdV9wcml2YXRlKTsKIAkJcmV0dXJuIC1FSU87CiAJfQotCWlmICghKCh1bnNpZ25lZCBsb25nKWlibG9jayAmIChNU0RPU19TQihzYiktPnNlY19wZXJfY2x1cyAtIDEpKSkgeworCisJb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaWJsb2NrICYgKHNiaS0+c2VjX3Blcl9jbHVzIC0gMSk7CisJaWYgKCFvZmZzZXQpIHsKKwkJLyogVE9ETzogbXVsdGlwbGUgY2x1c3RlciBhbGxvY2F0aW9uIHdvdWxkIGJlIGRlc2lyYWJsZS4gKi8KIAkJZXJyID0gZmF0X2FkZF9jbHVzdGVyKGlub2RlKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAJfQotCU1TRE9TX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSArPSBzYi0+c19ibG9ja3NpemU7Ci0JZXJyID0gZmF0X2JtYXAoaW5vZGUsIGlibG9jaywgJnBoeXMpOworCS8qIGF2YWlsYWJsZSBibG9ja3Mgb24gdGhpcyBjbHVzdGVyICovCisJbWFwcGVkX2Jsb2NrcyA9IHNiaS0+c2VjX3Blcl9jbHVzIC0gb2Zmc2V0OworCisJKm1heF9ibG9ja3MgPSBtaW4obWFwcGVkX2Jsb2NrcywgKm1heF9ibG9ja3MpOworCU1TRE9TX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSArPSAqbWF4X2Jsb2NrcyA8PCBzYi0+c19ibG9ja3NpemVfYml0czsKKworCWVyciA9IGZhdF9ibWFwKGlub2RlLCBpYmxvY2ssICZwaHlzLCAmbWFwcGVkX2Jsb2Nrcyk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQlpZiAoIXBoeXMpCi0JCUJVRygpOworCUJVR19PTighcGh5cyk7CisJQlVHX09OKCptYXhfYmxvY2tzICE9IG1hcHBlZF9ibG9ja3MpOwogCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CiAJbWFwX2JoKGJoX3Jlc3VsdCwgc2IsIHBoeXMpOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGZhdF9nZXRfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywKKwkJCSAgdW5zaWduZWQgbG9uZyBtYXhfYmxvY2tzLAorCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJaW50IGVycjsKKworCWVyciA9IF9fZmF0X2dldF9ibG9ja3MoaW5vZGUsIGlibG9jaywgJm1heF9ibG9ja3MsIGJoX3Jlc3VsdCwgY3JlYXRlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWJoX3Jlc3VsdC0+Yl9zaXplID0gbWF4X2Jsb2NrcyA8PCBzYi0+c19ibG9ja3NpemVfYml0czsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmYXRfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywKKwkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MgPSAxOworCXJldHVybiBfX2ZhdF9nZXRfYmxvY2tzKGlub2RlLCBpYmxvY2ssICZtYXhfYmxvY2tzLCBiaF9yZXN1bHQsIGNyZWF0ZSk7Cit9CisKIHN0YXRpYyBpbnQgZmF0X3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCiB7CiAJcmV0dXJuIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZShwYWdlLCBmYXRfZ2V0X2Jsb2NrLCB3YmMpOwogfQogCitzdGF0aWMgaW50IGZhdF93cml0ZXBhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJICBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlyZXR1cm4gbXBhZ2Vfd3JpdGVwYWdlcyhtYXBwaW5nLCB3YmMsIGZhdF9nZXRfYmxvY2spOworfQorCiBzdGF0aWMgaW50IGZhdF9yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JcmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9wYWdlKHBhZ2UsIGZhdF9nZXRfYmxvY2spOworCXJldHVybiBtcGFnZV9yZWFkcGFnZShwYWdlLCBmYXRfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIGludCBmYXRfcmVhZHBhZ2VzKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCSBzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlcywgdW5zaWduZWQgbnJfcGFnZXMpCit7CisJcmV0dXJuIG1wYWdlX3JlYWRwYWdlcyhtYXBwaW5nLCBwYWdlcywgbnJfcGFnZXMsIGZhdF9nZXRfYmxvY2spOwogfQogCiBzdGF0aWMgaW50IGZhdF9wcmVwYXJlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKQEAgLTExNSw2ICsxNjMsMzQgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgc3NpemVfdCBmYXRfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKKwkJCSAgICAgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCisJaWYgKHJ3ID09IFdSSVRFKSB7CisJCS8qCisJCSAqIEZJWE1FOiBibG9ja2Rldl9kaXJlY3RfSU8oKSBkb2Vzbid0IHVzZSAtPnByZXBhcmVfd3JpdGUoKSwKKwkJICogc28gd2UgbmVlZCB0byB1cGRhdGUgdGhlIC0+bW11X3ByaXZhdGUgdG8gYmxvY2sgYm91bmRhcnkuCisJCSAqCisJCSAqIEJ1dCB3ZSBtdXN0IGZpbGwgdGhlIHJlbWFpbmluZyBhcmVhIG9yIGhvbGUgYnkgbnVsIGZvcgorCQkgKiB1cGRhdGluZyAtPm1tdV9wcml2YXRlLgorCQkgKi8KKwkJbG9mZl90IHNpemUgPSBvZmZzZXQgKyBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2Vncyk7CisJCWlmIChNU0RPU19JKGlub2RlKS0+bW11X3ByaXZhdGUgPCBzaXplKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBGQVQgbmVlZCB0byB1c2UgdGhlIERJT19MT0NLSU5HIGZvciBhdm9pZGluZyB0aGUgcmFjZQorCSAqIGNvbmRpdGlvbiBvZiBmYXRfZ2V0X2Jsb2NrKCkgYW5kIC0+dHJ1bmNhdGUoKS4KKwkgKi8KKwlyZXR1cm4gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaW5vZGUtPmlfc2ItPnNfYmRldiwgaW92LAorCQkJCSAgb2Zmc2V0LCBucl9zZWdzLCBmYXRfZ2V0X2Jsb2NrcywgTlVMTCk7Cit9CisKIHN0YXRpYyBzZWN0b3JfdCBfZmF0X2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHNlY3Rvcl90IGJsb2NrKQogewogCXJldHVybiBnZW5lcmljX2Jsb2NrX2JtYXAobWFwcGluZywgYmxvY2ssIGZhdF9nZXRfYmxvY2spOwpAQCAtMTIyLDEwICsxOTgsMTMgQEAKIAogc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZmF0X2FvcHMgPSB7CiAJLnJlYWRwYWdlCT0gZmF0X3JlYWRwYWdlLAorCS5yZWFkcGFnZXMJPSBmYXRfcmVhZHBhZ2VzLAogCS53cml0ZXBhZ2UJPSBmYXRfd3JpdGVwYWdlLAorCS53cml0ZXBhZ2VzCT0gZmF0X3dyaXRlcGFnZXMsCiAJLnN5bmNfcGFnZQk9IGJsb2NrX3N5bmNfcGFnZSwKIAkucHJlcGFyZV93cml0ZQk9IGZhdF9wcmVwYXJlX3dyaXRlLAogCS5jb21taXRfd3JpdGUJPSBmYXRfY29tbWl0X3dyaXRlLAorCS5kaXJlY3RfSU8JPSBmYXRfZGlyZWN0X0lPLAogCS5ibWFwCQk9IF9mYXRfYm1hcAogfTsKIApAQCAtMTgyLDcgKzI2MSw3IEBACiAJc3Bpbl91bmxvY2soJnNiaS0+aW5vZGVfaGFzaF9sb2NrKTsKIH0KIAotRVhQT1JUX1NZTUJPTChmYXRfYXR0YWNoKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGZhdF9hdHRhY2gpOwogCiB2b2lkIGZhdF9kZXRhY2goc3RydWN0IGlub2RlICppbm9kZSkKIHsKQEAgLTE5Myw3ICsyNzIsNyBAQAogCXNwaW5fdW5sb2NrKCZzYmktPmlub2RlX2hhc2hfbG9jayk7CiB9CiAKLUVYUE9SVF9TWU1CT0woZmF0X2RldGFjaCk7CitFWFBPUlRfU1lNQk9MX0dQTChmYXRfZGV0YWNoKTsKIAogc3RydWN0IGlub2RlICpmYXRfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBsb2ZmX3QgaV9wb3MpCiB7CkBAIC0zNDcsNyArNDI2LDcgQEAKIAlyZXR1cm4gaW5vZGU7CiB9CiAKLUVYUE9SVF9TWU1CT0woZmF0X2J1aWxkX2lub2RlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGZhdF9idWlsZF9pbm9kZSk7CiAKIHN0YXRpYyB2b2lkIGZhdF9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKQEAgLTM3NCwxMiArNDUzLDE3IEBACiAJdW5sb2NrX2tlcm5lbCgpOwogfQogCi1zdGF0aWMgdm9pZCBmYXRfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCitzdGF0aWMgdm9pZCBmYXRfd3JpdGVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQlzdHJ1Y3QgbXNkb3Nfc2JfaW5mbyAqc2JpID0gTVNET1NfU0Ioc2IpOworCXNiLT5zX2RpcnQgPSAwOwogCiAJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKQogCQlmYXRfY2x1c3RlcnNfZmx1c2goc2IpOworfQorCitzdGF0aWMgdm9pZCBmYXRfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKIAogCWlmIChzYmktPm5sc19kaXNrKSB7CiAJCXVubG9hZF9ubHMoc2JpLT5ubHNfZGlzayk7CkBAIC01MzcsNyArNjIxLDcgQEAKIAlyZXR1cm4gZmF0X3dyaXRlX2lub2RlKGlub2RlLCAxKTsKIH0KIAotRVhQT1JUX1NZTUJPTChmYXRfc3luY19pbm9kZSk7CitFWFBPUlRfU1lNQk9MX0dQTChmYXRfc3luY19pbm9kZSk7CiAKIHN0YXRpYyBpbnQgZmF0X3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB2ZnNtb3VudCAqbW50KTsKIHN0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBmYXRfc29wcyA9IHsKQEAgLTU0Niw2ICs2MzAsNyBAQAogCS53cml0ZV9pbm9kZQk9IGZhdF93cml0ZV9pbm9kZSwKIAkuZGVsZXRlX2lub2RlCT0gZmF0X2RlbGV0ZV9pbm9kZSwKIAkucHV0X3N1cGVyCT0gZmF0X3B1dF9zdXBlciwKKwkud3JpdGVfc3VwZXIJPSBmYXRfd3JpdGVfc3VwZXIsCiAJLnN0YXRmcwkJPSBmYXRfc3RhdGZzLAogCS5jbGVhcl9pbm9kZQk9IGZhdF9jbGVhcl9pbm9kZSwKIAkucmVtb3VudF9mcwk9IGZhdF9yZW1vdW50LApAQCAtMTM0Nyw3ICsxNDMyLDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLUVYUE9SVF9TWU1CT0woZmF0X2ZpbGxfc3VwZXIpOworRVhQT1JUX1NZTUJPTF9HUEwoZmF0X2ZpbGxfc3VwZXIpOwogCiBpbnQgX19pbml0IGZhdF9jYWNoZV9pbml0KHZvaWQpOwogdm9pZCBmYXRfY2FjaGVfZGVzdHJveSh2b2lkKTsKZGlmZiAtLWdpdCBhL2ZzL2ZhdC9taXNjLmMgYi9mcy9mYXQvbWlzYy5jCmluZGV4IDJhMGRmMjEuLjMyZmIwYTMgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9taXNjLmMKKysrIGIvZnMvZmF0L21pc2MuYwpAQCAtMzMsNyArMzMsNyBAQAogCX0KIH0KIAotRVhQT1JUX1NZTUJPTChmYXRfZnNfcGFuaWMpOworRVhQT1JUX1NZTUJPTF9HUEwoZmF0X2ZzX3BhbmljKTsKIAogLyogRmx1c2hlcyB0aGUgbnVtYmVyIG9mIGZyZWUgY2x1c3RlcnMgb24gRkFUMzIgKi8KIC8qIFhYWDogTmVlZCB0byB3cml0ZSBvbmUgcGVyIEZTSU5GTyBibG9jay4gIEN1cnJlbnRseSBvbmx5IHdyaXRlcyAxICovCkBAIC02Nyw4ICs2Nyw2IEBACiAJCWlmIChzYmktPnByZXZfZnJlZSAhPSAtMSkKIAkJCWZzaW5mby0+bmV4dF9jbHVzdGVyID0gY3B1X3RvX2xlMzIoc2JpLT5wcmV2X2ZyZWUpOwogCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7Ci0JCWlmIChzYi0+c19mbGFncyAmIE1TX1NZTkNIUk9OT1VTKQotCQkJc3luY19kaXJ0eV9idWZmZXIoYmgpOwogCX0KIAlicmVsc2UoYmgpOwogfQpAQCAtMTk0LDcgKzE5Miw3IEBACiAJKmRhdGUgPSBjcHVfdG9fbGUxNihubF9kYXktZGF5X25bbW9udGgtMV0rMSsobW9udGggPDwgNSkrKHllYXIgPDwgOSkpOwogfQogCi1FWFBPUlRfU1lNQk9MKGZhdF9kYXRlX3VuaXgyZG9zKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGZhdF9kYXRlX3VuaXgyZG9zKTsKIAogaW50IGZhdF9zeW5jX2JocyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHMsIGludCBucl9iaHMpCiB7CkBAIC0yMjIsNCArMjIwLDQgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1FWFBPUlRfU1lNQk9MKGZhdF9zeW5jX2Jocyk7CitFWFBPUlRfU1lNQk9MX0dQTChmYXRfc3luY19iaHMpOwpkaWZmIC0tZ2l0IGEvZnMvZmNudGwuYyBiL2ZzL2ZjbnRsLmMKaW5kZXggODYzYjQ2ZS4uNWY5Njc4NiAxMDA2NDQKLS0tIGEvZnMvZmNudGwuYworKysgYi9mcy9mY250bC5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2Rub3RpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTM1LDcgKzM2LDcgQEAKIAlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGdldF9jbG9zZV9vbl9leGVjKHVuc2lnbmVkIGludCBmZCkKK3N0YXRpYyBpbnQgZ2V0X2Nsb3NlX29uX2V4ZWModW5zaWduZWQgaW50IGZkKQogewogCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzID0gY3VycmVudC0+ZmlsZXM7CiAJc3RydWN0IGZkdGFibGUgKmZkdDsKQEAgLTQ1NywxMSArNDU4LDExIEBACiAJCQllbHNlCiAJCQkJc2kuc2lfYmFuZCA9IGJhbmRfdGFibGVbcmVhc29uIC0gUE9MTF9JTl07CiAJCQlzaS5zaV9mZCAgICA9IGZkOwotCQkJaWYgKCFzZW5kX2dyb3VwX3NpZ19pbmZvKGZvd24tPnNpZ251bSwgJnNpLCBwKSkKKwkJCWlmICghZ3JvdXBfc2VuZF9zaWdfaW5mbyhmb3duLT5zaWdudW0sICZzaSwgcCkpCiAJCQkJYnJlYWs7CiAJCS8qIGZhbGwtdGhyb3VnaDogZmFsbCBiYWNrIG9uIHRoZSBvbGQgcGxhaW4gU0lHSU8gc2lnbmFsICovCiAJCWNhc2UgMDoKLQkJCXNlbmRfZ3JvdXBfc2lnX2luZm8oU0lHSU8sIFNFTkRfU0lHX1BSSVYsIHApOworCQkJZ3JvdXBfc2VuZF9zaWdfaW5mbyhTSUdJTywgU0VORF9TSUdfUFJJViwgcCk7CiAJfQogfQogCkBAIC00OTUsNyArNDk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZvd25fc3RydWN0ICpmb3duKQogewogCWlmIChzaWdpb19wZXJtKHAsIGZvd24sIFNJR1VSRykpCi0JCXNlbmRfZ3JvdXBfc2lnX2luZm8oU0lHVVJHLCBTRU5EX1NJR19QUklWLCBwKTsKKwkJZ3JvdXBfc2VuZF9zaWdfaW5mbyhTSUdVUkcsIFNFTkRfU0lHX1BSSVYsIHApOwogfQogCiBpbnQgc2VuZF9zaWd1cmcoc3RydWN0IGZvd25fc3RydWN0ICpmb3duKQpkaWZmIC0tZ2l0IGEvZnMvZmlmby5jIGIvZnMvZmlmby5jCmluZGV4IDU0NTU5MTYuLjkyMzM3MWIgMTAwNjQ0Ci0tLSBhL2ZzL2ZpZm8uYworKysgYi9mcy9maWZvLmMKQEAgLTM1LDcgKzM1LDcgQEAKIAlpbnQgcmV0OwogCiAJcmV0ID0gLUVSRVNUQVJUU1lTOwotCWlmIChkb3duX2ludGVycnVwdGlibGUoUElQRV9TRU0oKmlub2RlKSkpCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZShQSVBFX01VVEVYKCppbm9kZSkpKQogCQlnb3RvIGVycl9ub2xvY2tfbm9jbGVhbnVwOwogCiAJaWYgKCFpbm9kZS0+aV9waXBlKSB7CkBAIC0xMTksNyArMTE5LDcgQEAKIAl9CiAKIAkvKiBPayEgKi8KLQl1cChQSVBFX1NFTSgqaW5vZGUpKTsKKwltdXRleF91bmxvY2soUElQRV9NVVRFWCgqaW5vZGUpKTsKIAlyZXR1cm4gMDsKIAogZXJyX3JkOgpAQCAtMTM5LDcgKzEzOSw3IEBACiAJCWZyZWVfcGlwZV9pbmZvKGlub2RlKTsKIAogZXJyX25vY2xlYW51cDoKLQl1cChQSVBFX1NFTSgqaW5vZGUpKTsKKwltdXRleF91bmxvY2soUElQRV9NVVRFWCgqaW5vZGUpKTsKIAogZXJyX25vbG9ja19ub2NsZWFudXA6CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2ZzL2ZpbGVfdGFibGUuYyBiL2ZzL2ZpbGVfdGFibGUuYwppbmRleCBjM2E1ZTJmLi43NjhiNTgxIDEwMDY0NAotLS0gYS9mcy9maWxlX3RhYmxlLmMKKysrIGIvZnMvZmlsZV90YWJsZS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXZlbnRwb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZnNub3RpZnkuaD4KIApAQCAtMTE3LDcgKzExOCw3IEBACiAKIHZvaWQgZmFzdGNhbGwgZnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlpZiAocmN1cmVmX2RlY19hbmRfdGVzdCgmZmlsZS0+Zl9jb3VudCkpCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmZpbGUtPmZfY291bnQpKQogCQlfX2ZwdXQoZmlsZSk7CiB9CiAKQEAgLTE2Niw3ICsxNjcsNyBAQAogCXJjdV9yZWFkX2xvY2soKTsKIAlmaWxlID0gZmNoZWNrX2ZpbGVzKGZpbGVzLCBmZCk7CiAJaWYgKGZpbGUpIHsKLQkJaWYgKCFyY3VyZWZfaW5jX2xmKCZmaWxlLT5mX2NvdW50KSkgeworCQlpZiAoIWF0b21pY19pbmNfbm90X3plcm8oJmZpbGUtPmZfY291bnQpKSB7CiAJCQkvKiBGaWxlIG9iamVjdCByZWYgY291bGRuJ3QgYmUgdGFrZW4gKi8KIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJcmV0dXJuIE5VTEw7CkBAIC0xOTgsNyArMTk5LDcgQEAKIAkJcmN1X3JlYWRfbG9jaygpOwogCQlmaWxlID0gZmNoZWNrX2ZpbGVzKGZpbGVzLCBmZCk7CiAJCWlmIChmaWxlKSB7Ci0JCQlpZiAocmN1cmVmX2luY19sZigmZmlsZS0+Zl9jb3VudCkpCisJCQlpZiAoYXRvbWljX2luY19ub3RfemVybygmZmlsZS0+Zl9jb3VudCkpCiAJCQkJKmZwdXRfbmVlZGVkID0gMTsKIAkJCWVsc2UKIAkJCQkvKiBEaWRuJ3QgZ2V0IHRoZSByZWZlcmVuY2UsIHNvbWVvbmUncyBmcmVlZCAqLwpAQCAtMjEzLDcgKzIxNCw3IEBACiAKIHZvaWQgcHV0X2ZpbHAoc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JaWYgKHJjdXJlZl9kZWNfYW5kX3Rlc3QoJmZpbGUtPmZfY291bnQpKSB7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmZpbGUtPmZfY291bnQpKSB7CiAJCXNlY3VyaXR5X2ZpbGVfZnJlZShmaWxlKTsKIAkJZmlsZV9raWxsKGZpbGUpOwogCQlmaWxlX2ZyZWUoZmlsZSk7CmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2ltbWVkLmMgYi9mcy9mcmVldnhmcy92eGZzX2ltbWVkLmMKaW5kZXggZDA0MDFkYzYuLjZmNWRmMTcgMTAwNjQ0Ci0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW1tZWQuYworKysgYi9mcy9mcmVldnhmcy92eGZzX2ltbWVkLmMKQEAgLTk5LDggKzk5LDggQEAKIHZ4ZnNfaW1tZWRfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZwLCBzdHJ1Y3QgcGFnZSAqcHApCiB7CiAJc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbwkqdmlwID0gVlhGU19JTk8ocHAtPm1hcHBpbmctPmhvc3QpOwotCXVfaW50NjRfdAkJb2Zmc2V0ID0gcHAtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JY2FkZHJfdAkJCWthZGRyOworCXVfaW50NjRfdAlvZmZzZXQgPSAodV9pbnQ2NF90KXBwLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOworCWNhZGRyX3QJCWthZGRyOwogCiAJa2FkZHIgPSBrbWFwKHBwKTsKIAltZW1jcHkoa2FkZHIsIHZpcC0+dmlpX2ltbWVkLnZpX2ltbWVkICsgb2Zmc2V0LCBQQUdFX0NBQ0hFX1NJWkUpOwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9kZXYuYyBiL2ZzL2Z1c2UvZGV2LmMKaW5kZXggZTA4YWI0Ny4uNDUyNmRhOCAxMDA2NDQKLS0tIGEvZnMvZnVzZS9kZXYuYworKysgYi9mcy9mdXNlL2Rldi5jCkBAIC0yMSwxOCArMjEsMTggQEAKIAogc3RhdGljIGttZW1fY2FjaGVfdCAqZnVzZV9yZXFfY2FjaGVwOwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBmdXNlX2Nvbm4gKmZ1c2VfZ2V0X2Nvbm4oc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgc3RydWN0IGZ1c2VfY29ubiAqZnVzZV9nZXRfY29ubihzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgZnVzZV9jb25uICpmYzsKIAlzcGluX2xvY2soJmZ1c2VfbG9jayk7CiAJZmMgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaWYgKGZjICYmICFmYy0+bW91bnRlZCkKKwlpZiAoZmMgJiYgIWZjLT5jb25uZWN0ZWQpCiAJCWZjID0gTlVMTDsKIAlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKIAlyZXR1cm4gZmM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBmdXNlX3JlcXVlc3RfaW5pdChzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKK3N0YXRpYyB2b2lkIGZ1c2VfcmVxdWVzdF9pbml0KHN0cnVjdCBmdXNlX3JlcSAqcmVxKQogewogCW1lbXNldChyZXEsIDAsIHNpemVvZigqcmVxKSk7CiAJSU5JVF9MSVNUX0hFQUQoJnJlcS0+bGlzdCk7CkBAIC01Myw3ICs1Myw3IEBACiAJa21lbV9jYWNoZV9mcmVlKGZ1c2VfcmVxX2NhY2hlcCwgcmVxKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGJsb2NrX3NpZ3Moc2lnc2V0X3QgKm9sZHNldCkKK3N0YXRpYyB2b2lkIGJsb2NrX3NpZ3Moc2lnc2V0X3QgKm9sZHNldCkKIHsKIAlzaWdzZXRfdCBtYXNrOwogCkBAIC02MSw3ICs2MSw3IEBACiAJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmbWFzaywgb2xkc2V0KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHJlc3RvcmVfc2lncyhzaWdzZXRfdCAqb2xkc2V0KQorc3RhdGljIHZvaWQgcmVzdG9yZV9zaWdzKHNpZ3NldF90ICpvbGRzZXQpCiB7CiAJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIG9sZHNldCwgTlVMTCk7CiB9CkBAIC0xMDksMTggKzEwOSwyNCBAQAogCWludCBpbnRyOwogCXNpZ3NldF90IG9sZHNldDsKIAorCWF0b21pY19pbmMoJmZjLT5udW1fd2FpdGluZyk7CiAJYmxvY2tfc2lncygmb2xkc2V0KTsKIAlpbnRyID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZmYy0+b3V0c3RhbmRpbmdfc2VtKTsKIAlyZXN0b3JlX3NpZ3MoJm9sZHNldCk7Ci0JcmV0dXJuIGludHIgPyBOVUxMIDogZG9fZ2V0X3JlcXVlc3QoZmMpOworCWlmIChpbnRyKSB7CisJCWF0b21pY19kZWMoJmZjLT5udW1fd2FpdGluZyk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gZG9fZ2V0X3JlcXVlc3QoZmMpOwogfQogCiBzdGF0aWMgdm9pZCBmdXNlX3B1dGJhY2tfcmVxdWVzdChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCiB7CiAJc3Bpbl9sb2NrKCZmdXNlX2xvY2spOwotCWlmIChyZXEtPnByZWFsbG9jYXRlZCkKKwlpZiAocmVxLT5wcmVhbGxvY2F0ZWQpIHsKKwkJYXRvbWljX2RlYygmZmMtPm51bV93YWl0aW5nKTsKIAkJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJmZjLT51bnVzZWRfbGlzdCk7Ci0JZWxzZQorCX0gZWxzZQogCQlmdXNlX3JlcXVlc3RfZnJlZShyZXEpOwogCiAJLyogSWYgd2UgYXJlIGluIGRlYnQgZGVjcmVhc2UgdGhhdCBmaXJzdCAqLwpAQCAtMTQ4LDQyICsxNTQsMjMgQEAKIAlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgcHJvY2Vzc19pbml0X3JlcGx5KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgZnVzZV9pbml0X291dCAqYXJnID0gJnJlcS0+bWlzYy5pbml0X291dDsKLQotCWlmIChhcmctPm1ham9yICE9IEZVU0VfS0VSTkVMX1ZFUlNJT04pCi0JCWZjLT5jb25uX2Vycm9yID0gMTsKLQllbHNlIHsKLQkJZmMtPm1pbm9yID0gYXJnLT5taW5vcjsKLQkJZmMtPm1heF93cml0ZSA9IGFyZy0+bWlub3IgPCA1ID8gNDA5NiA6IGFyZy0+bWF4X3dyaXRlOwotCX0KLQotCS8qIEFmdGVyIElOSVQgcmVwbHkgaXMgcmVjZWl2ZWQgb3RoZXIgcmVxdWVzdHMgY2FuIGdvCi0JICAgb3V0LiAgU28gZG8gKEZVU0VfTUFYX09VVFNUQU5ESU5HIC0gMSkgbnVtYmVyIG9mCi0JICAgdXAoKXMgb24gb3V0c3RhbmRpbmdfc2VtLiAgVGhlIGxhc3QgdXAoKSBpcyBkb25lIGluCi0JICAgZnVzZV9wdXRiYWNrX3JlcXVlc3QoKSAqLwotCWZvciAoaSA9IDE7IGkgPCBGVVNFX01BWF9PVVRTVEFORElORzsgaSsrKQotCQl1cCgmZmMtPm91dHN0YW5kaW5nX3NlbSk7Ci19Ci0KIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgcmVxdWVzdCBpcyBmaW5pc2hlZC4gIEVpdGhlciBhIHJlcGx5CiAgKiBoYXMgYXJyaXZlZCBvciBpdCB3YXMgaW50ZXJydXB0ZWQgKGFuZCBub3QgeWV0IHNlbnQpIG9yIHNvbWUgZXJyb3IKLSAqIG9jY3VycmVkIGR1cmluZyBjb21tdW5pY2F0aW9uIHdpdGggdXNlcnNwYWNlLCBvciB0aGUgZGV2aWNlIGZpbGUgd2FzCi0gKiBjbG9zZWQuICBJdCBkZWNyZWFzZXMgdGhlIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIHJlcXVlc3QuICBJbiBjYXNlCi0gKiBvZiBhIGJhY2tncm91bmQgcmVxdWVzdCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBzdG9yZWQgb2JqZWN0cyBhcmUKLSAqIHJlbGVhc2VkLiAgVGhlIHJlcXVlc3RlciB0aHJlYWQgaXMgd29rZW4gdXAgKGlmIHN0aWxsIHdhaXRpbmcpLCBhbmQKLSAqIGZpbmFsbHkgdGhlIHJlcXVlc3QgaXMgZWl0aGVyIGZyZWVkIG9yIHB1dCBvbiB0aGUgdW51c2VkX2xpc3QKKyAqIG9jY3VycmVkIGR1cmluZyBjb21tdW5pY2F0aW9uIHdpdGggdXNlcnNwYWNlLCBvciB0aGUgZGV2aWNlIGZpbGUKKyAqIHdhcyBjbG9zZWQuICBJbiBjYXNlIG9mIGEgYmFja2dyb3VuZCByZXF1ZXN0IHRoZSByZWZlcmVuY2UgdG8gdGhlCisgKiBzdG9yZWQgb2JqZWN0cyBhcmUgcmVsZWFzZWQuICBUaGUgcmVxdWVzdGVyIHRocmVhZCBpcyB3b2tlbiB1cCAoaWYKKyAqIHN0aWxsIHdhaXRpbmcpLCB0aGUgJ2VuZCcgY2FsbGJhY2sgaXMgY2FsbGVkIGlmIGdpdmVuLCBlbHNlIHRoZQorICogcmVmZXJlbmNlIHRvIHRoZSByZXF1ZXN0IGlzIHJlbGVhc2VkCiAgKgogICogQ2FsbGVkIHdpdGggZnVzZV9sb2NrLCB1bmxvY2tzIGl0CiAgKi8KIHN0YXRpYyB2b2lkIHJlcXVlc3RfZW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKIHsKLQlpbnQgcHV0YmFjazsKLQlyZXEtPmZpbmlzaGVkID0gMTsKLQlwdXRiYWNrID0gYXRvbWljX2RlY19hbmRfdGVzdCgmcmVxLT5jb3VudCk7CisJdm9pZCAoKmVuZCkgKHN0cnVjdCBmdXNlX2Nvbm4gKiwgc3RydWN0IGZ1c2VfcmVxICopID0gcmVxLT5lbmQ7CisJcmVxLT5lbmQgPSBOVUxMOworCWxpc3RfZGVsKCZyZXEtPmxpc3QpOworCXJlcS0+c3RhdGUgPSBGVVNFX1JFUV9GSU5JU0hFRDsKIAlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKIAlpZiAocmVxLT5iYWNrZ3JvdW5kKSB7CiAJCWRvd25fcmVhZCgmZmMtPnNicHV0X3NlbSk7CkBAIC0xOTIsMTggKzE3OSwxMCBAQAogCQl1cF9yZWFkKCZmYy0+c2JwdXRfc2VtKTsKIAl9CiAJd2FrZV91cCgmcmVxLT53YWl0cSk7Ci0JaWYgKHJlcS0+aW4uaC5vcGNvZGUgPT0gRlVTRV9JTklUKQotCQlwcm9jZXNzX2luaXRfcmVwbHkoZmMsIHJlcSk7Ci0JZWxzZSBpZiAocmVxLT5pbi5oLm9wY29kZSA9PSBGVVNFX1JFTEVBU0UgJiYgcmVxLT5pbm9kZSA9PSBOVUxMKSB7Ci0JCS8qIFNwZWNpYWwgY2FzZSBmb3IgZmFpbGVkIGlnZXQgaW4gQ1JFQVRFICovCi0JCXU2NCBub2RlaWQgPSByZXEtPmluLmgubm9kZWlkOwotCQlfX2Z1c2VfZ2V0X3JlcXVlc3QocmVxKTsKLQkJZnVzZV9yZXNldF9yZXF1ZXN0KHJlcSk7Ci0JCWZ1c2Vfc2VuZF9mb3JnZXQoZmMsIHJlcSwgbm9kZWlkLCAxKTsKLQkJcHV0YmFjayA9IDA7Ci0JfQotCWlmIChwdXRiYWNrKQotCQlmdXNlX3B1dGJhY2tfcmVxdWVzdChmYywgcmVxKTsKKwlpZiAoZW5kKQorCQllbmQoZmMsIHJlcSk7CisJZWxzZQorCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogfQogCiAvKgpAQCAtMjU0LDE0ICsyMzMsMTYgQEAKIAogCXNwaW5fdW5sb2NrKCZmdXNlX2xvY2spOwogCWJsb2NrX3NpZ3MoJm9sZHNldCk7Ci0Jd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHJlcS0+d2FpdHEsIHJlcS0+ZmluaXNoZWQpOworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShyZXEtPndhaXRxLCByZXEtPnN0YXRlID09IEZVU0VfUkVRX0ZJTklTSEVEKTsKIAlyZXN0b3JlX3NpZ3MoJm9sZHNldCk7CiAJc3Bpbl9sb2NrKCZmdXNlX2xvY2spOwotCWlmIChyZXEtPmZpbmlzaGVkKQorCWlmIChyZXEtPnN0YXRlID09IEZVU0VfUkVRX0ZJTklTSEVEICYmICFyZXEtPmludGVycnVwdGVkKQogCQlyZXR1cm47CiAKLQlyZXEtPm91dC5oLmVycm9yID0gLUVJTlRSOwotCXJlcS0+aW50ZXJydXB0ZWQgPSAxOworCWlmICghcmVxLT5pbnRlcnJ1cHRlZCkgeworCQlyZXEtPm91dC5oLmVycm9yID0gLUVJTlRSOworCQlyZXEtPmludGVycnVwdGVkID0gMTsKKwl9CiAJaWYgKHJlcS0+bG9ja2VkKSB7CiAJCS8qIFRoaXMgaXMgdW5pbnRlcnJ1cHRpYmxlIHNsZWVwLCBiZWNhdXNlIGRhdGEgaXMKIAkJICAgYmVpbmcgY29waWVkIHRvL2Zyb20gdGhlIGJ1ZmZlcnMgb2YgcmVxLiAgRHVyaW5nCkBAIC0yNzIsMTAgKzI1MywxMCBAQAogCQl3YWl0X2V2ZW50KHJlcS0+d2FpdHEsICFyZXEtPmxvY2tlZCk7CiAJCXNwaW5fbG9jaygmZnVzZV9sb2NrKTsKIAl9Ci0JaWYgKCFyZXEtPnNlbnQgJiYgIWxpc3RfZW1wdHkoJnJlcS0+bGlzdCkpIHsKKwlpZiAocmVxLT5zdGF0ZSA9PSBGVVNFX1JFUV9QRU5ESU5HKSB7CiAJCWxpc3RfZGVsKCZyZXEtPmxpc3QpOwogCQlfX2Z1c2VfcHV0X3JlcXVlc3QocmVxKTsKLQl9IGVsc2UgaWYgKCFyZXEtPmZpbmlzaGVkICYmIHJlcS0+c2VudCkKKwl9IGVsc2UgaWYgKHJlcS0+c3RhdGUgPT0gRlVTRV9SRVFfU0VOVCkKIAkJYmFja2dyb3VuZF9yZXF1ZXN0KGZjLCByZXEpOwogfQogCkBAIC0zMTAsNiArMjkxLDcgQEAKIAkJCWZjLT5vdXRzdGFuZGluZ19kZWJ0Kys7CiAJfQogCWxpc3RfYWRkX3RhaWwoJnJlcS0+bGlzdCwgJmZjLT5wZW5kaW5nKTsKKwlyZXEtPnN0YXRlID0gRlVTRV9SRVFfUEVORElORzsKIAl3YWtlX3VwKCZmYy0+d2FpdHEpOwogfQogCkBAIC0zNjIsMzQgKzM0NCwxMiBAQAogCXJlcXVlc3Rfc2VuZF9ub3dhaXQoZmMsIHJlcSk7CiB9CiAKLXZvaWQgZnVzZV9zZW5kX2luaXQoc3RydWN0IGZ1c2VfY29ubiAqZmMpCi17Ci0JLyogVGhpcyBpcyBjYWxsZWQgZnJvbSBmdXNlX3JlYWRfc3VwZXIoKSBzbyB0aGVyZSdzIGd1YXJhbnRlZWQKLQkgICB0byBiZSBhIHJlcXVlc3QgYXZhaWxhYmxlICovCi0Jc3RydWN0IGZ1c2VfcmVxICpyZXEgPSBkb19nZXRfcmVxdWVzdChmYyk7Ci0Jc3RydWN0IGZ1c2VfaW5pdF9pbiAqYXJnID0gJnJlcS0+bWlzYy5pbml0X2luOwotCWFyZy0+bWFqb3IgPSBGVVNFX0tFUk5FTF9WRVJTSU9OOwotCWFyZy0+bWlub3IgPSBGVVNFX0tFUk5FTF9NSU5PUl9WRVJTSU9OOwotCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX0lOSVQ7Ci0JcmVxLT5pbi5udW1hcmdzID0gMTsKLQlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZigqYXJnKTsKLQlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBhcmc7Ci0JcmVxLT5vdXQubnVtYXJncyA9IDE7Ci0JLyogVmFyaWFibGUgbGVuZ3RoIGFyZ3VlbWVudCB1c2VkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0JICAgd2l0aCBpbnRlcmZhY2UgdmVyc2lvbiA8IDcuNS4gIFJlc3Qgb2YgaW5pdF9vdXQgaXMgemVyb2VkCi0JICAgYnkgZG9fZ2V0X3JlcXVlc3QoKSwgc28gYSBzaG9ydCByZXBseSBpcyBub3QgYSBwcm9ibGVtICovCi0JcmVxLT5vdXQuYXJndmFyID0gMTsKLQlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yoc3RydWN0IGZ1c2VfaW5pdF9vdXQpOwotCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmcmVxLT5taXNjLmluaXRfb3V0OwotCXJlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKGZjLCByZXEpOwotfQotCiAvKgogICogTG9jayB0aGUgcmVxdWVzdC4gIFVwIHRvIHRoZSBuZXh0IHVubG9ja19yZXF1ZXN0KCkgdGhlcmUgbXVzdG4ndCBiZQogICogYW55dGhpbmcgdGhhdCBjb3VsZCBjYXVzZSBhIHBhZ2UtZmF1bHQuICBJZiB0aGUgcmVxdWVzdCB3YXMgYWxyZWFkeQogICogaW50ZXJydXB0ZWQgYmFpbCBvdXQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGxvY2tfcmVxdWVzdChzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKK3N0YXRpYyBpbnQgbG9ja19yZXF1ZXN0KHN0cnVjdCBmdXNlX3JlcSAqcmVxKQogewogCWludCBlcnIgPSAwOwogCWlmIChyZXEpIHsKQEAgLTQwOCw3ICszNjgsNyBAQAogICogcmVxdWVzdGVyIHRocmVhZCBpcyBjdXJyZW50bHkgd2FpdGluZyBmb3IgaXQgdG8gYmUgdW5sb2NrZWQsIHNvCiAgKiB3YWtlIGl0IHVwLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgdW5sb2NrX3JlcXVlc3Qoc3RydWN0IGZ1c2VfcmVxICpyZXEpCitzdGF0aWMgdm9pZCB1bmxvY2tfcmVxdWVzdChzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKIHsKIAlpZiAocmVxKSB7CiAJCXNwaW5fbG9jaygmZnVzZV9sb2NrKTsKQEAgLTQ0NCw3ICs0MDQsNyBAQAogfQogCiAvKiBVbm1hcCBhbmQgcHV0IHByZXZpb3VzIHBhZ2Ugb2YgdXNlcnNwYWNlIGJ1ZmZlciAqLwotc3RhdGljIGlubGluZSB2b2lkIGZ1c2VfY29weV9maW5pc2goc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MpCitzdGF0aWMgdm9pZCBmdXNlX2NvcHlfZmluaXNoKHN0cnVjdCBmdXNlX2NvcHlfc3RhdGUgKmNzKQogewogCWlmIChjcy0+bWFwYWRkcikgewogCQlrdW5tYXBfYXRvbWljKGNzLT5tYXBhZGRyLCBLTV9VU0VSMCk7CkBAIC00OTMsOCArNDUzLDcgQEAKIH0KIAogLyogRG8gYXMgbXVjaCBjb3B5IHRvL2Zyb20gdXNlcnNwYWNlIGJ1ZmZlciBhcyB3ZSBjYW4gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGZ1c2VfY29weV9kbyhzdHJ1Y3QgZnVzZV9jb3B5X3N0YXRlICpjcywgdm9pZCAqKnZhbCwKLQkJCSAgICAgICB1bnNpZ25lZCAqc2l6ZSkKK3N0YXRpYyBpbnQgZnVzZV9jb3B5X2RvKHN0cnVjdCBmdXNlX2NvcHlfc3RhdGUgKmNzLCB2b2lkICoqdmFsLCB1bnNpZ25lZCAqc2l6ZSkKIHsKIAl1bnNpZ25lZCBuY3B5ID0gbWluKCpzaXplLCBjcy0+bGVuKTsKIAlpZiAodmFsKSB7CkBAIC01MTQsOCArNDczLDggQEAKICAqIENvcHkgYSBwYWdlIGluIHRoZSByZXF1ZXN0IHRvL2Zyb20gdGhlIHVzZXJzcGFjZSBidWZmZXIuICBNdXN0IGJlCiAgKiBkb25lIGF0b21pY2FsbHkKICAqLwotc3RhdGljIGlubGluZSBpbnQgZnVzZV9jb3B5X3BhZ2Uoc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MsIHN0cnVjdCBwYWdlICpwYWdlLAotCQkJCSB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGNvdW50LCBpbnQgemVyb2luZykKK3N0YXRpYyBpbnQgZnVzZV9jb3B5X3BhZ2Uoc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGNvdW50LCBpbnQgemVyb2luZykKIHsKIAlpZiAocGFnZSAmJiB6ZXJvaW5nICYmIGNvdW50IDwgUEFHRV9TSVpFKSB7CiAJCXZvaWQgKm1hcGFkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMSk7CkBAIC01OTcsNyArNTU2LDcgQEAKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAogCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZSgmZmMtPndhaXRxLCAmd2FpdCk7Ci0Jd2hpbGUgKGZjLT5tb3VudGVkICYmIGxpc3RfZW1wdHkoJmZjLT5wZW5kaW5nKSkgeworCXdoaWxlIChmYy0+Y29ubmVjdGVkICYmIGxpc3RfZW1wdHkoJmZjLT5wZW5kaW5nKSkgewogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCQlicmVhazsKQEAgLTYzNywxNCArNTk2LDE1IEBACiAJCWdvdG8gZXJyX3VubG9jazsKIAlyZXF1ZXN0X3dhaXQoZmMpOwogCWVyciA9IC1FTk9ERVY7Ci0JaWYgKCFmYy0+bW91bnRlZCkKKwlpZiAoIWZjLT5jb25uZWN0ZWQpCiAJCWdvdG8gZXJyX3VubG9jazsKIAllcnIgPSAtRVJFU1RBUlRTWVM7CiAJaWYgKGxpc3RfZW1wdHkoJmZjLT5wZW5kaW5nKSkKIAkJZ290byBlcnJfdW5sb2NrOwogCiAJcmVxID0gbGlzdF9lbnRyeShmYy0+cGVuZGluZy5uZXh0LCBzdHJ1Y3QgZnVzZV9yZXEsIGxpc3QpOwotCWxpc3RfZGVsX2luaXQoJnJlcS0+bGlzdCk7CisJcmVxLT5zdGF0ZSA9IEZVU0VfUkVRX1JFQURJTkc7CisJbGlzdF9tb3ZlKCZyZXEtPmxpc3QsICZmYy0+aW8pOwogCiAJaW4gPSAmcmVxLT5pbjsKIAlyZXFzaXplID0gaW4tPmgubGVuOwpAQCAtNjc3LDggKzYzNyw4IEBACiAJaWYgKCFyZXEtPmlzcmVwbHkpCiAJCXJlcXVlc3RfZW5kKGZjLCByZXEpOwogCWVsc2UgewotCQlyZXEtPnNlbnQgPSAxOwotCQlsaXN0X2FkZF90YWlsKCZyZXEtPmxpc3QsICZmYy0+cHJvY2Vzc2luZyk7CisJCXJlcS0+c3RhdGUgPSBGVVNFX1JFUV9TRU5UOworCQlsaXN0X21vdmVfdGFpbCgmcmVxLT5saXN0LCAmZmMtPnByb2Nlc3NpbmcpOwogCQlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKIAl9CiAJcmV0dXJuIHJlcXNpemU7CkBAIC03NjYsMTcgKzcyNiwyMyBAQAogCQlnb3RvIGVycl9maW5pc2g7CiAKIAlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJZXJyID0gLUVOT0VOVDsKKwlpZiAoIWZjLT5jb25uZWN0ZWQpCisJCWdvdG8gZXJyX3VubG9jazsKKwogCXJlcSA9IHJlcXVlc3RfZmluZChmYywgb2gudW5pcXVlKTsKIAllcnIgPSAtRUlOVkFMOwogCWlmICghcmVxKQogCQlnb3RvIGVycl91bmxvY2s7CiAKLQlsaXN0X2RlbF9pbml0KCZyZXEtPmxpc3QpOwogCWlmIChyZXEtPmludGVycnVwdGVkKSB7Ci0JCXJlcXVlc3RfZW5kKGZjLCByZXEpOworCQlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKIAkJZnVzZV9jb3B5X2ZpbmlzaCgmY3MpOworCQlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJCXJlcXVlc3RfZW5kKGZjLCByZXEpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CisJbGlzdF9tb3ZlKCZyZXEtPmxpc3QsICZmYy0+aW8pOwogCXJlcS0+b3V0LmggPSBvaDsKIAlyZXEtPmxvY2tlZCA9IDE7CiAJY3MucmVxID0gcmVxOwpAQCAtODMwLDE5ICs3OTYsOTAgQEAKIAlyZXR1cm4gbWFzazsKIH0KIAotLyogQWJvcnQgYWxsIHJlcXVlc3RzIG9uIHRoZSBnaXZlbiBsaXN0IChwZW5kaW5nIG9yIHByb2Nlc3NpbmcpICovCisvKgorICogQWJvcnQgYWxsIHJlcXVlc3RzIG9uIHRoZSBnaXZlbiBsaXN0IChwZW5kaW5nIG9yIHByb2Nlc3NpbmcpCisgKgorICogVGhpcyBmdW5jdGlvbiByZWxlYXNlcyBhbmQgcmVhY3F1aXJlcyBmdXNlX2xvY2sKKyAqLwogc3RhdGljIHZvaWQgZW5kX3JlcXVlc3RzKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQogewogCXdoaWxlICghbGlzdF9lbXB0eShoZWFkKSkgewogCQlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKIAkJcmVxID0gbGlzdF9lbnRyeShoZWFkLT5uZXh0LCBzdHJ1Y3QgZnVzZV9yZXEsIGxpc3QpOwotCQlsaXN0X2RlbF9pbml0KCZyZXEtPmxpc3QpOwogCQlyZXEtPm91dC5oLmVycm9yID0gLUVDT05OQUJPUlRFRDsKIAkJcmVxdWVzdF9lbmQoZmMsIHJlcSk7CiAJCXNwaW5fbG9jaygmZnVzZV9sb2NrKTsKIAl9CiB9CiAKKy8qCisgKiBBYm9ydCByZXF1ZXN0cyB1bmRlciBJL08KKyAqCisgKiBUaGUgcmVxdWVzdHMgYXJlIHNldCB0byBpbnRlcnJ1cHRlZCBhbmQgZmluaXNoZWQsIGFuZCB0aGUgcmVxdWVzdAorICogd2FpdGVyIGlzIHdva2VuIHVwLiAgVGhpcyB3aWxsIG1ha2UgcmVxdWVzdF93YWl0X2Fuc3dlcigpIHdhaXQKKyAqIHVudGlsIHRoZSByZXF1ZXN0IGlzIHVubG9ja2VkIGFuZCB0aGVuIHJldHVybi4KKyAqCisgKiBJZiB0aGUgcmVxdWVzdCBpcyBhc3luY2hyb25vdXMsIHRoZW4gdGhlIGVuZCBmdW5jdGlvbiBuZWVkcyB0byBiZQorICogY2FsbGVkIGFmdGVyIHdhaXRpbmcgZm9yIHRoZSByZXF1ZXN0IHRvIGJlIHVubG9ja2VkIChpZiBpdCB3YXMKKyAqIGxvY2tlZCkuCisgKi8KK3N0YXRpYyB2b2lkIGVuZF9pb19yZXF1ZXN0cyhzdHJ1Y3QgZnVzZV9jb25uICpmYykKK3sKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmZjLT5pbykpIHsKKwkJc3RydWN0IGZ1c2VfcmVxICpyZXEgPQorCQkJbGlzdF9lbnRyeShmYy0+aW8ubmV4dCwgc3RydWN0IGZ1c2VfcmVxLCBsaXN0KTsKKwkJdm9pZCAoKmVuZCkgKHN0cnVjdCBmdXNlX2Nvbm4gKiwgc3RydWN0IGZ1c2VfcmVxICopID0gcmVxLT5lbmQ7CisKKwkJcmVxLT5pbnRlcnJ1cHRlZCA9IDE7CisJCXJlcS0+b3V0LmguZXJyb3IgPSAtRUNPTk5BQk9SVEVEOworCQlyZXEtPnN0YXRlID0gRlVTRV9SRVFfRklOSVNIRUQ7CisJCWxpc3RfZGVsX2luaXQoJnJlcS0+bGlzdCk7CisJCXdha2VfdXAoJnJlcS0+d2FpdHEpOworCQlpZiAoZW5kKSB7CisJCQlyZXEtPmVuZCA9IE5VTEw7CisJCQkvKiBUaGUgZW5kIGZ1bmN0aW9uIHdpbGwgY29uc3VtZSB0aGlzIHJlZmVyZW5jZSAqLworCQkJX19mdXNlX2dldF9yZXF1ZXN0KHJlcSk7CisJCQlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKKwkJCXdhaXRfZXZlbnQocmVxLT53YWl0cSwgIXJlcS0+bG9ja2VkKTsKKwkJCWVuZChmYywgcmVxKTsKKwkJCXNwaW5fbG9jaygmZnVzZV9sb2NrKTsKKwkJfQorCX0KK30KKworLyoKKyAqIEFib3J0IGFsbCByZXF1ZXN0cy4KKyAqCisgKiBFbWVyZ2VuY3kgZXhpdCBpbiBjYXNlIG9mIGEgbWFsaWNpb3VzIG9yIGFjY2lkZW50YWwgZGVhZGxvY2ssIG9yCisgKiBqdXN0IGEgaHVuZyBmaWxlc3lzdGVtLgorICoKKyAqIFRoZSBzYW1lIGVmZmVjdCBpcyB1c3VhbGx5IGFjaGlldmFibGUgdGhyb3VnaCBraWxsaW5nIHRoZQorICogZmlsZXN5c3RlbSBkYWVtb24gYW5kIGFsbCB1c2VycyBvZiB0aGUgZmlsZXN5c3RlbS4gIFRoZSBleGNlcHRpb24KKyAqIGlzIHRoZSBjb21iaW5hdGlvbiBvZiBhbiBhc3luY2hyb25vdXMgcmVxdWVzdCBhbmQgdGhlIHRyaWNreQorICogZGVhZGxvY2sgKHNlZSBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2Z1c2UudHh0KS4KKyAqCisgKiBEdXJpbmcgdGhlIGFib3J0aW5nLCBwcm9ncmVzc2lvbiBvZiByZXF1ZXN0cyBmcm9tIHRoZSBwZW5kaW5nIGFuZAorICogcHJvY2Vzc2luZyBsaXN0cyBvbnRvIHRoZSBpbyBsaXN0LCBhbmQgcHJvZ3Jlc3Npb24gb2YgbmV3IHJlcXVlc3RzCisgKiBvbnRvIHRoZSBwZW5kaW5nIGxpc3QgaXMgcHJldmVudGVkIGJ5IHJlcS0+Y29ubmVjdGVkIGJlaW5nIGZhbHNlLgorICoKKyAqIFByb2dyZXNzaW9uIG9mIHJlcXVlc3RzIHVuZGVyIEkvTyB0byB0aGUgcHJvY2Vzc2luZyBsaXN0IGlzCisgKiBwcmV2ZW50ZWQgYnkgdGhlIHJlcS0+aW50ZXJydXB0ZWQgZmxhZyBiZWluZyB0cnVlIGZvciB0aGVzZQorICogcmVxdWVzdHMuICBGb3IgdGhpcyByZWFzb24gcmVxdWVzdHMgb24gdGhlIGlvIGxpc3QgbXVzdCBiZSBhYm9ydGVkCisgKiBmaXJzdC4KKyAqLwordm9pZCBmdXNlX2Fib3J0X2Nvbm4oc3RydWN0IGZ1c2VfY29ubiAqZmMpCit7CisJc3Bpbl9sb2NrKCZmdXNlX2xvY2spOworCWlmIChmYy0+Y29ubmVjdGVkKSB7CisJCWZjLT5jb25uZWN0ZWQgPSAwOworCQllbmRfaW9fcmVxdWVzdHMoZmMpOworCQllbmRfcmVxdWVzdHMoZmMsICZmYy0+cGVuZGluZyk7CisJCWVuZF9yZXF1ZXN0cyhmYywgJmZjLT5wcm9jZXNzaW5nKTsKKwkJd2FrZV91cF9hbGwoJmZjLT53YWl0cSk7CisJfQorCXNwaW5fdW5sb2NrKCZmdXNlX2xvY2spOworfQorCiBzdGF0aWMgaW50IGZ1c2VfZGV2X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGZ1c2VfY29ubiAqZmM7CkBAIC04NTMsOSArODkwLDExIEBACiAJCWZjLT5jb25uZWN0ZWQgPSAwOwogCQllbmRfcmVxdWVzdHMoZmMsICZmYy0+cGVuZGluZyk7CiAJCWVuZF9yZXF1ZXN0cyhmYywgJmZjLT5wcm9jZXNzaW5nKTsKLQkJZnVzZV9yZWxlYXNlX2Nvbm4oZmMpOwogCX0KIAlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKKwlpZiAoZmMpCisJCWtvYmplY3RfcHV0KCZmYy0+a29iaik7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZnVzZS9kaXIuYyBiL2ZzL2Z1c2UvZGlyLmMKaW5kZXggNDE3YmNlZS4uMjFmZDU5YyAxMDA2NDQKLS0tIGEvZnMvZnVzZS9kaXIuYworKysgYi9mcy9mdXNlL2Rpci5jCkBAIC0yMyw4ICsyMyw3IEBACiAvKgogICogQ2FsY3VsYXRlIHRoZSB0aW1lIGluIGppZmZpZXMgdW50aWwgYSBkZW50cnkvYXR0cmlidXRlcyBhcmUgdmFsaWQKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRpbWVfdG9famlmZmllcyh1bnNpZ25lZCBsb25nIHNlYywKLQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgbnNlYykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVfdG9famlmZmllcyh1bnNpZ25lZCBsb25nIHNlYywgdW5zaWduZWQgbG9uZyBuc2VjKQogewogCXN0cnVjdCB0aW1lc3BlYyB0cyA9IHtzZWMsIG5zZWN9OwogCXJldHVybiBqaWZmaWVzICsgdGltZXNwZWNfdG9famlmZmllcygmdHMpOwpAQCAtMTU3LDcgKzE1Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGludmFsaWRfbm9kZWlkKHU2NCBub2RlaWQpCitzdGF0aWMgaW50IGludmFsaWRfbm9kZWlkKHU2NCBub2RlaWQpCiB7CiAJcmV0dXJuICFub2RlaWQgfHwgbm9kZWlkID09IEZVU0VfUk9PVF9JRDsKIH0KQEAgLTE2Niw3ICsxNjUsNyBAQAogCS5kX3JldmFsaWRhdGUJPSBmdXNlX2RlbnRyeV9yZXZhbGlkYXRlLAogfTsKIAotc3RhdGljIGlubGluZSBpbnQgdmFsaWRfbW9kZShpbnQgbSkKK3N0YXRpYyBpbnQgdmFsaWRfbW9kZShpbnQgbSkKIHsKIAlyZXR1cm4gU19JU1JFRyhtKSB8fCBTX0lTRElSKG0pIHx8IFNfSVNMTksobSkgfHwgU19JU0NIUihtKSB8fAogCQlTX0lTQkxLKG0pIHx8IFNfSVNGSUZPKG0pIHx8IFNfSVNTT0NLKG0pOwpAQCAtNzYzLDEzICs3NjIsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHNpemVfdCBmdXNlX3NlbmRfcmVhZGRpcihzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBwb3MsCi0JCQkJICAgICAgIHNpemVfdCBjb3VudCkKLXsKLQlyZXR1cm4gZnVzZV9zZW5kX3JlYWRfY29tbW9uKHJlcSwgZmlsZSwgaW5vZGUsIHBvcywgY291bnQsIDEpOwotfQotCiBzdGF0aWMgaW50IGZ1c2VfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZHN0YnVmLCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKIAlpbnQgZXJyOwpAQCAtNzkzLDcgKzc4NSw5IEBACiAJfQogCXJlcS0+bnVtX3BhZ2VzID0gMTsKIAlyZXEtPnBhZ2VzWzBdID0gcGFnZTsKLQluYnl0ZXMgPSBmdXNlX3NlbmRfcmVhZGRpcihyZXEsIGZpbGUsIGlub2RlLCBmaWxlLT5mX3BvcywgUEFHRV9TSVpFKTsKKwlmdXNlX3JlYWRfZmlsbChyZXEsIGZpbGUsIGlub2RlLCBmaWxlLT5mX3BvcywgUEFHRV9TSVpFLCBGVVNFX1JFQURESVIpOworCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwluYnl0ZXMgPSByZXEtPm91dC5hcmdzWzBdLnNpemU7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCWlmICghZXJyKQpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9maWxlLmMgYi9mcy9mdXNlL2ZpbGUuYwppbmRleCAwNWRlZGRkLi5hN2VmNWU3IDEwMDY0NAotLS0gYS9mcy9mdXNlL2ZpbGUuYworKysgYi9mcy9mdXNlL2ZpbGUuYwpAQCAtMTEzLDYgKzExMywxNCBAQAogCXJldHVybiBlcnI7CiB9CiAKKy8qIFNwZWNpYWwgY2FzZSBmb3IgZmFpbGVkIGlnZXQgaW4gQ1JFQVRFICovCitzdGF0aWMgdm9pZCBmdXNlX3JlbGVhc2VfZW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKK3sKKwl1NjQgbm9kZWlkID0gcmVxLT5pbi5oLm5vZGVpZDsKKwlmdXNlX3Jlc2V0X3JlcXVlc3QocmVxKTsKKwlmdXNlX3NlbmRfZm9yZ2V0KGZjLCByZXEsIG5vZGVpZCwgMSk7Cit9CisKIHZvaWQgZnVzZV9zZW5kX3JlbGVhc2Uoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX2ZpbGUgKmZmLAogCQkgICAgICAgdTY0IG5vZGVpZCwgc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZsYWdzLCBpbnQgaXNkaXIpCiB7CkBAIC0xMjgsNiArMTM2LDggQEAKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZnVzZV9yZWxlYXNlX2luKTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBpbmFyZzsKIAlyZXF1ZXN0X3NlbmRfYmFja2dyb3VuZChmYywgcmVxKTsKKwlpZiAoIWlub2RlKQorCQlyZXEtPmVuZCA9IGZ1c2VfcmVsZWFzZV9lbmQ7CiAJa2ZyZWUoZmYpOwogfQogCkBAIC0yNDAsMzggKzI1MCwzNSBAQAogCXJldHVybiBmdXNlX2ZzeW5jX2NvbW1vbihmaWxlLCBkZSwgZGF0YXN5bmMsIDApOwogfQogCi1zaXplX3QgZnVzZV9zZW5kX3JlYWRfY29tbW9uKHN0cnVjdCBmdXNlX3JlcSAqcmVxLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50LAotCQkJICAgICBpbnQgaXNkaXIpCit2b2lkIGZ1c2VfcmVhZF9maWxsKHN0cnVjdCBmdXNlX3JlcSAqcmVxLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCwgaW50IG9wY29kZSkKIHsKLQlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOwogCXN0cnVjdCBmdXNlX2ZpbGUgKmZmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBmdXNlX3JlYWRfaW4gaW5hcmc7CisJc3RydWN0IGZ1c2VfcmVhZF9pbiAqaW5hcmcgPSAmcmVxLT5taXNjLnJlYWRfaW47CiAKLQltZW1zZXQoJmluYXJnLCAwLCBzaXplb2Yoc3RydWN0IGZ1c2VfcmVhZF9pbikpOwotCWluYXJnLmZoID0gZmYtPmZoOwotCWluYXJnLm9mZnNldCA9IHBvczsKLQlpbmFyZy5zaXplID0gY291bnQ7Ci0JcmVxLT5pbi5oLm9wY29kZSA9IGlzZGlyID8gRlVTRV9SRUFERElSIDogRlVTRV9SRUFEOworCWluYXJnLT5maCA9IGZmLT5maDsKKwlpbmFyZy0+b2Zmc2V0ID0gcG9zOworCWluYXJnLT5zaXplID0gY291bnQ7CisJcmVxLT5pbi5oLm9wY29kZSA9IG9wY29kZTsKIAlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOwogCXJlcS0+aW5vZGUgPSBpbm9kZTsKIAlyZXEtPmZpbGUgPSBmaWxlOwogCXJlcS0+aW4ubnVtYXJncyA9IDE7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2Yoc3RydWN0IGZ1c2VfcmVhZF9pbik7Ci0JcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9IGluYXJnOwogCXJlcS0+b3V0LmFyZ3BhZ2VzID0gMTsKIAlyZXEtPm91dC5hcmd2YXIgPSAxOwogCXJlcS0+b3V0Lm51bWFyZ3MgPSAxOwogCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IGNvdW50OwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKLQlyZXR1cm4gcmVxLT5vdXQuYXJnc1swXS5zaXplOwogfQogCi1zdGF0aWMgaW5saW5lIHNpemVfdCBmdXNlX3NlbmRfcmVhZChzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBwb3MsCi0JCQkJICAgIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzaXplX3QgZnVzZV9zZW5kX3JlYWQoc3RydWN0IGZ1c2VfcmVxICpyZXEsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpCiB7Ci0JcmV0dXJuIGZ1c2Vfc2VuZF9yZWFkX2NvbW1vbihyZXEsIGZpbGUsIGlub2RlLCBwb3MsIGNvdW50LCAwKTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCWZ1c2VfcmVhZF9maWxsKHJlcSwgZmlsZSwgaW5vZGUsIHBvcywgY291bnQsIEZVU0VfUkVBRCk7CisJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCXJldHVybiByZXEtPm91dC5hcmdzWzBdLnNpemU7CiB9CiAKIHN0YXRpYyBpbnQgZnVzZV9yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCkBAIC0zMDQsMjEgKzMxMSwzMyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgZnVzZV9zZW5kX3JlYWRwYWdlcyhzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSkKK3N0YXRpYyB2b2lkIGZ1c2VfcmVhZHBhZ2VzX2VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCiB7Ci0JbG9mZl90IHBvcyA9IHBhZ2Vfb2Zmc2V0KHJlcS0+cGFnZXNbMF0pOwotCXNpemVfdCBjb3VudCA9IHJlcS0+bnVtX3BhZ2VzIDw8IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JdW5zaWduZWQgaTsKLQlyZXEtPm91dC5wYWdlX3plcm9pbmcgPSAxOwotCWZ1c2Vfc2VuZF9yZWFkKHJlcSwgZmlsZSwgaW5vZGUsIHBvcywgY291bnQpOworCWludCBpOworCisJZnVzZV9pbnZhbGlkYXRlX2F0dHIocmVxLT5wYWdlc1swXS0+bWFwcGluZy0+aG9zdCk7IC8qIGF0aW1lIGNoYW5nZWQgKi8KKwogCWZvciAoaSA9IDA7IGkgPCByZXEtPm51bV9wYWdlczsgaSsrKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0gcmVxLT5wYWdlc1tpXTsKIAkJaWYgKCFyZXEtPm91dC5oLmVycm9yKQogCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCQllbHNlCisJCQlTZXRQYWdlRXJyb3IocGFnZSk7CiAJCXVubG9ja19wYWdlKHBhZ2UpOwogCX0KLQlyZXR1cm4gcmVxLT5vdXQuaC5lcnJvcjsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworfQorCitzdGF0aWMgdm9pZCBmdXNlX3NlbmRfcmVhZHBhZ2VzKHN0cnVjdCBmdXNlX3JlcSAqcmVxLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJbG9mZl90IHBvcyA9IHBhZ2Vfb2Zmc2V0KHJlcS0+cGFnZXNbMF0pOworCXNpemVfdCBjb3VudCA9IHJlcS0+bnVtX3BhZ2VzIDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJcmVxLT5vdXQucGFnZV96ZXJvaW5nID0gMTsKKwlyZXEtPmVuZCA9IGZ1c2VfcmVhZHBhZ2VzX2VuZDsKKwlmdXNlX3JlYWRfZmlsbChyZXEsIGZpbGUsIGlub2RlLCBwb3MsIGNvdW50LCBGVVNFX1JFQUQpOworCXJlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKGZjLCByZXEpOwogfQogCiBzdHJ1Y3QgZnVzZV9yZWFkcGFnZXNfZGF0YSB7CkBAIC0zMzgsMTIgKzM1NywxMiBAQAogCSAgICAocmVxLT5udW1fcGFnZXMgPT0gRlVTRV9NQVhfUEFHRVNfUEVSX1JFUSB8fAogCSAgICAgKHJlcS0+bnVtX3BhZ2VzICsgMSkgKiBQQUdFX0NBQ0hFX1NJWkUgPiBmYy0+bWF4X3JlYWQgfHwKIAkgICAgIHJlcS0+cGFnZXNbcmVxLT5udW1fcGFnZXMgLSAxXS0+aW5kZXggKyAxICE9IHBhZ2UtPmluZGV4KSkgewotCQlpbnQgZXJyID0gZnVzZV9zZW5kX3JlYWRwYWdlcyhyZXEsIGRhdGEtPmZpbGUsIGlub2RlKTsKLQkJaWYgKGVycikgeworCQlmdXNlX3NlbmRfcmVhZHBhZ2VzKHJlcSwgZGF0YS0+ZmlsZSwgaW5vZGUpOworCQlkYXRhLT5yZXEgPSByZXEgPSBmdXNlX2dldF9yZXF1ZXN0KGZjKTsKKwkJaWYgKCFyZXEpIHsKIAkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJcmV0dXJuIGVycjsKKwkJCXJldHVybiAtRUlOVFI7CiAJCX0KLQkJZnVzZV9yZXNldF9yZXF1ZXN0KHJlcSk7CiAJfQogCXJlcS0+cGFnZXNbcmVxLT5udW1fcGFnZXNdID0gcGFnZTsKIAlyZXEtPm51bV9wYWdlcyArKzsKQEAgLTM2OCwxMCArMzg3LDggQEAKIAkJcmV0dXJuIC1FSU5UUjsKIAogCWVyciA9IHJlYWRfY2FjaGVfcGFnZXMobWFwcGluZywgcGFnZXMsIGZ1c2VfcmVhZHBhZ2VzX2ZpbGwsICZkYXRhKTsKLQlpZiAoIWVyciAmJiBkYXRhLnJlcS0+bnVtX3BhZ2VzKQotCQllcnIgPSBmdXNlX3NlbmRfcmVhZHBhZ2VzKGRhdGEucmVxLCBmaWxlLCBpbm9kZSk7Ci0JZnVzZV9wdXRfcmVxdWVzdChmYywgZGF0YS5yZXEpOwotCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGlub2RlKTsgLyogYXRpbWUgY2hhbmdlZCAqLworCWlmICghZXJyKQorCQlmdXNlX3NlbmRfcmVhZHBhZ2VzKGRhdGEucmVxLCBmaWxlLCBpbm9kZSk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNTYwLDkgKzU3Nyw5IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOwogCXNzaXplX3QgcmVzOwogCS8qIERvbid0IGFsbG93IHBhcmFsbGVsIHdyaXRlcyB0byB0aGUgc2FtZSBmaWxlICovCi0JZG93bigmaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJcmVzID0gZnVzZV9kaXJlY3RfaW8oZmlsZSwgYnVmLCBjb3VudCwgcHBvcywgMSk7Ci0JdXAoJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJcmV0dXJuIHJlczsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZnVzZS9mdXNlX2kuaCBiL2ZzL2Z1c2UvZnVzZV9pLmgKaW5kZXggNzRjOGQwOS4uNDZjZjkzMyAxMDA2NDQKLS0tIGEvZnMvZnVzZS9mdXNlX2kuaAorKysgYi9mcy9mdXNlL2Z1c2VfaS5oCkBAIC05NCw2ICs5NCwxMSBAQAogCS8qKiBIZWFkZXIgcmV0dXJuZWQgZnJvbSB1c2Vyc3BhY2UgKi8KIAlzdHJ1Y3QgZnVzZV9vdXRfaGVhZGVyIGg7CiAKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgYml0ZmllbGRzIGFyZSBub3QgY2hhbmdlZCBkdXJpbmcgdGhlIHJlcXVlc3QKKwkgKiBwcm9jZXNzaW5nCisJICovCisKIAkvKiogTGFzdCBhcmd1bWVudCBpcyB2YXJpYWJsZSBsZW5ndGggKGNhbiBiZSBzaG9ydGVyIHRoYW4KIAkgICAgYXJnLT5zaXplKSAqLwogCXVuc2lnbmVkIGFyZ3ZhcjoxOwpAQCAtMTExLDEyICsxMTYsMjMgQEAKIAlzdHJ1Y3QgZnVzZV9hcmcgYXJnc1szXTsKIH07CiAKKy8qKiBUaGUgcmVxdWVzdCBzdGF0ZSAqLworZW51bSBmdXNlX3JlcV9zdGF0ZSB7CisJRlVTRV9SRVFfSU5JVCA9IDAsCisJRlVTRV9SRVFfUEVORElORywKKwlGVVNFX1JFUV9SRUFESU5HLAorCUZVU0VfUkVRX1NFTlQsCisJRlVTRV9SRVFfRklOSVNIRUQKK307CisKK3N0cnVjdCBmdXNlX2Nvbm47CisKIC8qKgogICogQSByZXF1ZXN0IHRvIHRoZSBjbGllbnQKICAqLwogc3RydWN0IGZ1c2VfcmVxIHsKLQkvKiogVGhpcyBjYW4gYmUgb24gZWl0aGVyIHVudXNlZF9saXN0LCBwZW5kaW5nIG9yIHByb2Nlc3NpbmcKLQkgICAgbGlzdHMgaW4gZnVzZV9jb25uICovCisJLyoqIFRoaXMgY2FuIGJlIG9uIGVpdGhlciB1bnVzZWRfbGlzdCwgcGVuZGluZyBwcm9jZXNzaW5nIG9yCisJICAgIGlvIGxpc3RzIGluIGZ1c2VfY29ubiAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAogCS8qKiBFbnRyeSBvbiB0aGUgYmFja2dyb3VuZCBsaXN0ICovCkBAIC0xMjUsNiArMTQxLDEyIEBACiAJLyoqIHJlZmNvdW50ICovCiAJYXRvbWljX3QgY291bnQ7CiAKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgYml0ZmllbGRzIGFyZSBlaXRoZXIgc2V0IG9uY2UgYmVmb3JlIHRoZQorCSAqIHJlcXVlc3QgaXMgcXVldWVkIG9yIHNldHRpbmcvY2xlYXJpbmcgdGhlbSBpcyBwcm90ZWN0ZWQgYnkKKwkgKiBmdXNlX2xvY2sKKwkgKi8KKwogCS8qKiBUcnVlIGlmIHRoZSByZXF1ZXN0IGhhcyByZXBseSAqLwogCXVuc2lnbmVkIGlzcmVwbHk6MTsKIApAQCAtMTQwLDExICsxNjIsOCBAQAogCS8qKiBEYXRhIGlzIGJlaW5nIGNvcGllZCB0by9mcm9tIHRoZSByZXF1ZXN0ICovCiAJdW5zaWduZWQgbG9ja2VkOjE7CiAKLQkvKiogUmVxdWVzdCBoYXMgYmVlbiBzZW50IHRvIHVzZXJzcGFjZSAqLwotCXVuc2lnbmVkIHNlbnQ6MTsKLQotCS8qKiBUaGUgcmVxdWVzdCBpcyBmaW5pc2hlZCAqLwotCXVuc2lnbmVkIGZpbmlzaGVkOjE7CisJLyoqIFN0YXRlIG9mIHRoZSByZXF1ZXN0ICovCisJZW51bSBmdXNlX3JlcV9zdGF0ZSBzdGF0ZTsKIAogCS8qKiBUaGUgcmVxdWVzdCBpbnB1dCAqLwogCXN0cnVjdCBmdXNlX2luIGluOwpAQCAtMTYxLDYgKzE4MCw3IEBACiAJCXN0cnVjdCBmdXNlX3JlbGVhc2VfaW4gcmVsZWFzZV9pbjsKIAkJc3RydWN0IGZ1c2VfaW5pdF9pbiBpbml0X2luOwogCQlzdHJ1Y3QgZnVzZV9pbml0X291dCBpbml0X291dDsKKwkJc3RydWN0IGZ1c2VfcmVhZF9pbiByZWFkX2luOwogCX0gbWlzYzsKIAogCS8qKiBwYWdlIHZlY3RvciAqLwpAQCAtMTgwLDYgKzIwMCw5IEBACiAKIAkvKiogRmlsZSB1c2VkIGluIHRoZSByZXF1ZXN0IChvciBOVUxMKSAqLwogCXN0cnVjdCBmaWxlICpmaWxlOworCisJLyoqIFJlcXVlc3QgY29tcGxldGlvbiBjYWxsYmFjayAqLworCXZvaWQgKCplbmQpKHN0cnVjdCBmdXNlX2Nvbm4gKiwgc3RydWN0IGZ1c2VfcmVxICopOwogfTsKIAogLyoqCkBAIC0xOTAsOSArMjEzLDYgQEAKICAqIHVubW91bnRlZC4KICAqLwogc3RydWN0IGZ1c2VfY29ubiB7Ci0JLyoqIFJlZmVyZW5jZSBjb3VudCAqLwotCWludCBjb3VudDsKLQogCS8qKiBUaGUgdXNlciBpZCBmb3IgdGhpcyBtb3VudCAqLwogCXVpZF90IHVzZXJfaWQ7CiAKQEAgLTIxNyw2ICsyMzcsOSBAQAogCS8qKiBUaGUgbGlzdCBvZiByZXF1ZXN0cyBiZWluZyBwcm9jZXNzZWQgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHByb2Nlc3Npbmc7CiAKKwkvKiogVGhlIGxpc3Qgb2YgcmVxdWVzdHMgdW5kZXIgSS9PICovCisJc3RydWN0IGxpc3RfaGVhZCBpbzsKKwogCS8qKiBSZXF1ZXN0cyBwdXQgaW4gdGhlIGJhY2tncm91bmQgKFJFTEVBU0Ugb3IgYW55IG90aGVyCiAJICAgIGludGVycnVwdGVkIHJlcXVlc3QpICovCiAJc3RydWN0IGxpc3RfaGVhZCBiYWNrZ3JvdW5kOwpAQCAtMjM4LDE0ICsyNjEsMjIgQEAKIAl1NjQgcmVxY3RyOwogCiAJLyoqIE1vdW50IGlzIGFjdGl2ZSAqLwotCXVuc2lnbmVkIG1vdW50ZWQgOiAxOworCXVuc2lnbmVkIG1vdW50ZWQ7CiAKLQkvKiogQ29ubmVjdGlvbiBlc3RhYmxpc2hlZCAqLwotCXVuc2lnbmVkIGNvbm5lY3RlZCA6IDE7CisJLyoqIENvbm5lY3Rpb24gZXN0YWJsaXNoZWQsIGNsZWFyZWQgb24gdW1vdW50LCBjb25uZWN0aW9uCisJICAgIGFib3J0IGFuZCBkZXZpY2UgcmVsZWFzZSAqLworCXVuc2lnbmVkIGNvbm5lY3RlZDsKIAotCS8qKiBDb25uZWN0aW9uIGZhaWxlZCAodmVyc2lvbiBtaXNtYXRjaCkgKi8KKwkvKiogQ29ubmVjdGlvbiBmYWlsZWQgKHZlcnNpb24gbWlzbWF0Y2gpLiAgQ2Fubm90IHJhY2Ugd2l0aAorCSAgICBzZXR0aW5nIG90aGVyIGJpdGZpZWxkcyBzaW5jZSBpdCBpcyBvbmx5IHNldCBvbmNlIGluIElOSVQKKwkgICAgcmVwbHksIGJlZm9yZSBhbnkgb3RoZXIgcmVxdWVzdCwgYW5kIG5ldmVyIGNsZWFyZWQgKi8KIAl1bnNpZ25lZCBjb25uX2Vycm9yIDogMTsKIAorCS8qCisJICogVGhlIGZvbGxvd2luZyBiaXRmaWVsZHMgYXJlIG9ubHkgZm9yIG9wdGltaXphdGlvbiBwdXJwb3NlcworCSAqIGFuZCBoZW5jZSByYWNlcyBpbiBzZXR0aW5nIHRoZW0gd2lsbCBub3QgY2F1c2UgbWFsZnVuY3Rpb24KKwkgKi8KKwogCS8qKiBJcyBmc3luYyBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCiAJdW5zaWduZWQgbm9fZnN5bmMgOiAxOwogCkBAIC0yNzMsMjEgKzMwNCwyMiBAQAogCS8qKiBJcyBjcmVhdGUgbm90IGltcGxlbWVudGVkIGJ5IGZzPyAqLwogCXVuc2lnbmVkIG5vX2NyZWF0ZSA6IDE7CiAKKwkvKiogVGhlIG51bWJlciBvZiByZXF1ZXN0cyB3YWl0aW5nIGZvciBjb21wbGV0aW9uICovCisJYXRvbWljX3QgbnVtX3dhaXRpbmc7CisKIAkvKiogTmVnb3RpYXRlZCBtaW5vciB2ZXJzaW9uICovCiAJdW5zaWduZWQgbWlub3I7CiAKIAkvKiogQmFja2luZyBkZXYgaW5mbyAqLwogCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvIGJkaTsKLX07CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGZ1c2VfY29ubiAqKmdldF9mdXNlX2Nvbm5fc3VwZXJfcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQotewotCXJldHVybiAoc3RydWN0IGZ1c2VfY29ubiAqKikgJnNiLT5zX2ZzX2luZm87Ci19CisJLyoqIGtvYmplY3QgKi8KKwlzdHJ1Y3Qga29iamVjdCBrb2JqOworfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZnVzZV9jb25uICpnZXRfZnVzZV9jb25uX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0JcmV0dXJuICpnZXRfZnVzZV9jb25uX3N1cGVyX3Aoc2IpOworCXJldHVybiBzYi0+c19mc19pbmZvOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBmdXNlX2Nvbm4gKmdldF9mdXNlX2Nvbm4oc3RydWN0IGlub2RlICppbm9kZSkKQEAgLTI5NSw2ICszMjcsMTEgQEAKIAlyZXR1cm4gZ2V0X2Z1c2VfY29ubl9zdXBlcihpbm9kZS0+aV9zYik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGZ1c2VfY29ubiAqZ2V0X2Z1c2VfY29ubl9rb2JqKHN0cnVjdCBrb2JqZWN0ICpvYmopCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBmdXNlX2Nvbm4sIGtvYmopOworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBmdXNlX2lub2RlICpnZXRfZnVzZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXJldHVybiBjb250YWluZXJfb2YoaW5vZGUsIHN0cnVjdCBmdXNlX2lub2RlLCBpbm9kZSk7CkBAIC0zMzYsMTEgKzM3MywxMCBAQAogCQkgICAgICB1bnNpZ25lZCBsb25nIG5vZGVpZCwgdTY0IG5sb29rdXApOwogCiAvKioKLSAqIFNlbmQgUkVBRCBvciBSRUFERElSIHJlcXVlc3QKKyAqIEluaXRpYWxpemUgUkVBRCBvciBSRUFERElSIHJlcXVlc3QKICAqLwotc2l6ZV90IGZ1c2Vfc2VuZF9yZWFkX2NvbW1vbihzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCwKLQkJCSAgICAgaW50IGlzZGlyKTsKK3ZvaWQgZnVzZV9yZWFkX2ZpbGwoc3RydWN0IGZ1c2VfcmVxICpyZXEsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50LCBpbnQgb3Bjb2RlKTsKIAogLyoqCiAgKiBTZW5kIE9QRU4gb3IgT1BFTkRJUiByZXF1ZXN0CkBAIC0zOTUsMTIgKzQzMSw2IEBACiB2b2lkIGZ1c2VfY2hhbmdlX2F0dHJpYnV0ZXMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZ1c2VfYXR0ciAqYXR0cik7CiAKIC8qKgotICogQ2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gY2FuIGJlIHJlbGVhc2VkLCBhbmQgaWYgeWVzLCB0aGVuIGZyZWUgdGhlCi0gKiBjb25uZWN0aW9uIHN0cnVjdHVyZQotICovCi12b2lkIGZ1c2VfcmVsZWFzZV9jb25uKHN0cnVjdCBmdXNlX2Nvbm4gKmZjKTsKLQotLyoqCiAgKiBJbml0aWFsaXplIHRoZSBjbGllbnQgZGV2aWNlCiAgKi8KIGludCBmdXNlX2Rldl9pbml0KHZvaWQpOwpAQCAtNDU2LDYgKzQ4Niw5IEBACiAgKi8KIHZvaWQgZnVzZV9yZWxlYXNlX2JhY2tncm91bmQoc3RydWN0IGZ1c2VfcmVxICpyZXEpOwogCisvKiBBYm9ydCBhbGwgcmVxdWVzdHMgKi8KK3ZvaWQgZnVzZV9hYm9ydF9jb25uKHN0cnVjdCBmdXNlX2Nvbm4gKmZjKTsKKwogLyoqCiAgKiBHZXQgdGhlIGF0dHJpYnV0ZXMgb2YgYSBmaWxlCiAgKi8KQEAgLTQ2NSw4ICs0OTgsMyBAQAogICogSW52YWxpZGF0ZSBpbm9kZSBhdHRyaWJ1dGVzCiAgKi8KIHZvaWQgZnVzZV9pbnZhbGlkYXRlX2F0dHIoc3RydWN0IGlub2RlICppbm9kZSk7Ci0KLS8qKgotICogU2VuZCB0aGUgSU5JVCBtZXNzYWdlCi0gKi8KLXZvaWQgZnVzZV9zZW5kX2luaXQoc3RydWN0IGZ1c2VfY29ubiAqZmMpOwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9pbm9kZS5jIGIvZnMvZnVzZS9pbm9kZS5jCmluZGV4IDA0YzgwY2MuLmM3NTVhMDQgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvaW5vZGUuYworKysgYi9mcy9mdXNlL2lub2RlLmMKQEAgLTI0LDYgKzI0LDEzIEBACiAKIHNwaW5sb2NrX3QgZnVzZV9sb2NrOwogc3RhdGljIGttZW1fY2FjaGVfdCAqZnVzZV9pbm9kZV9jYWNoZXA7CitzdGF0aWMgc3RydWN0IHN1YnN5c3RlbSBjb25uZWN0aW9uc19zdWJzeXM7CisKK3N0cnVjdCBmdXNlX2Nvbm5fYXR0ciB7CisJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOworCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgZnVzZV9jb25uICosIGNoYXIgKik7CisJc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgZnVzZV9jb25uICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKK307CiAKICNkZWZpbmUgRlVTRV9TVVBFUl9NQUdJQyAweDY1NzM1NTQ2CiAKQEAgLTE4OSw2ICsxOTYsMTEgQEAKIAlyZXR1cm4gaW5vZGU7CiB9CiAKK3N0YXRpYyB2b2lkIGZ1c2VfdW1vdW50X2JlZ2luKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJZnVzZV9hYm9ydF9jb25uKGdldF9mdXNlX2Nvbm5fc3VwZXIoc2IpKTsKK30KKwogc3RhdGljIHZvaWQgZnVzZV9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm5fc3VwZXIoc2IpOwpAQCAtMjAwLDE0ICsyMTIsMTMgQEAKIAogCXNwaW5fbG9jaygmZnVzZV9sb2NrKTsKIAlmYy0+bW91bnRlZCA9IDA7Ci0JZmMtPnVzZXJfaWQgPSAwOwotCWZjLT5ncm91cF9pZCA9IDA7Ci0JZmMtPmZsYWdzID0gMDsKKwlmYy0+Y29ubmVjdGVkID0gMDsKKwlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKKwl1cF93cml0ZSgmZmMtPnNicHV0X3NlbSk7CiAJLyogRmx1c2ggYWxsIHJlYWRlcnMgb24gdGhpcyBmcyAqLwogCXdha2VfdXBfYWxsKCZmYy0+d2FpdHEpOwotCXVwX3dyaXRlKCZmYy0+c2JwdXRfc2VtKTsKLQlmdXNlX3JlbGVhc2VfY29ubihmYyk7Ci0Jc3Bpbl91bmxvY2soJmZ1c2VfbG9jayk7CisJa29iamVjdF9kZWwoJmZjLT5rb2JqKTsKKwlrb2JqZWN0X3B1dCgmZmMtPmtvYmopOwogfQogCiBzdGF0aWMgdm9pZCBjb252ZXJ0X2Z1c2Vfc3RhdGZzKHN0cnVjdCBrc3RhdGZzICpzdGJ1Ziwgc3RydWN0IGZ1c2Vfa3N0YXRmcyAqYXR0cikKQEAgLTM1Niw4ICszNjcsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV9jb25uKHN0cnVjdCBmdXNlX2Nvbm4gKmZjKQorc3RhdGljIHZvaWQgZnVzZV9jb25uX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCiB7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uX2tvYmooa29iaik7CisKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmZjLT51bnVzZWRfbGlzdCkpIHsKIAkJc3RydWN0IGZ1c2VfcmVxICpyZXE7CiAJCXJlcSA9IGxpc3RfZW50cnkoZmMtPnVudXNlZF9saXN0Lm5leHQsIHN0cnVjdCBmdXNlX3JlcSwgbGlzdCk7CkBAIC0zNjcsMzMgKzM4MCwyOCBAQAogCWtmcmVlKGZjKTsKIH0KIAotLyogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgZnVzZSBsb2NrIGhlbGQgKi8KLXZvaWQgZnVzZV9yZWxlYXNlX2Nvbm4oc3RydWN0IGZ1c2VfY29ubiAqZmMpCi17Ci0JZmMtPmNvdW50LS07Ci0JaWYgKCFmYy0+Y291bnQpCi0JCWZyZWVfY29ubihmYyk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgZnVzZV9jb25uICpuZXdfY29ubih2b2lkKQogewogCXN0cnVjdCBmdXNlX2Nvbm4gKmZjOwogCi0JZmMgPSBrbWFsbG9jKHNpemVvZigqZmMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoZmMgIT0gTlVMTCkgeworCWZjID0ga3phbGxvYyhzaXplb2YoKmZjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGZjKSB7CiAJCWludCBpOwotCQltZW1zZXQoZmMsIDAsIHNpemVvZigqZmMpKTsKIAkJaW5pdF93YWl0cXVldWVfaGVhZCgmZmMtPndhaXRxKTsKIAkJSU5JVF9MSVNUX0hFQUQoJmZjLT5wZW5kaW5nKTsKIAkJSU5JVF9MSVNUX0hFQUQoJmZjLT5wcm9jZXNzaW5nKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmZjLT5pbyk7CiAJCUlOSVRfTElTVF9IRUFEKCZmYy0+dW51c2VkX2xpc3QpOwogCQlJTklUX0xJU1RfSEVBRCgmZmMtPmJhY2tncm91bmQpOwotCQlzZW1hX2luaXQoJmZjLT5vdXRzdGFuZGluZ19zZW0sIDApOworCQlzZW1hX2luaXQoJmZjLT5vdXRzdGFuZGluZ19zZW0sIDEpOyAvKiBPbmUgZm9yIElOSVQgKi8KIAkJaW5pdF9yd3NlbSgmZmMtPnNicHV0X3NlbSk7CisJCWtvYmpfc2V0X2tzZXRfcyhmYywgY29ubmVjdGlvbnNfc3Vic3lzKTsKKwkJa29iamVjdF9pbml0KCZmYy0+a29iaik7CisJCWF0b21pY19zZXQoJmZjLT5udW1fd2FpdGluZywgMCk7CiAJCWZvciAoaSA9IDA7IGkgPCBGVVNFX01BWF9PVVRTVEFORElORzsgaSsrKSB7CiAJCQlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9IGZ1c2VfcmVxdWVzdF9hbGxvYygpOwogCQkJaWYgKCFyZXEpIHsKLQkJCQlmcmVlX2Nvbm4oZmMpOworCQkJCWtvYmplY3RfcHV0KCZmYy0+a29iaik7CiAJCQkJcmV0dXJuIE5VTEw7CiAJCQl9CiAJCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZmMtPnVudXNlZF9saXN0KTsKQEAgLTQwOCwyNSArNDE2LDMyIEBACiBzdGF0aWMgc3RydWN0IGZ1c2VfY29ubiAqZ2V0X2Nvbm4oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IGZ1c2VfY29ubiAqZmM7CisJaW50IGVycjsKIAorCWVyciA9IC1FSU5WQUw7CiAJaWYgKGZpbGUtPmZfb3AgIT0gJmZ1c2VfZGV2X29wZXJhdGlvbnMpCi0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCQlnb3RvIG91dF9lcnI7CisKKwllcnIgPSAtRU5PTUVNOwogCWZjID0gbmV3X2Nvbm4oKTsKLQlpZiAoZmMgPT0gTlVMTCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJaWYgKCFmYykKKwkJZ290byBvdXRfZXJyOworCiAJc3Bpbl9sb2NrKCZmdXNlX2xvY2spOwotCWlmIChmaWxlLT5wcml2YXRlX2RhdGEpIHsKLQkJZnJlZV9jb25uKGZjKTsKLQkJZmMgPSBFUlJfUFRSKC1FSU5WQUwpOwotCX0gZWxzZSB7Ci0JCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZjOwotCQkqZ2V0X2Z1c2VfY29ubl9zdXBlcl9wKHNiKSA9IGZjOwotCQlmYy0+bW91bnRlZCA9IDE7Ci0JCWZjLT5jb25uZWN0ZWQgPSAxOwotCQlmYy0+Y291bnQgPSAyOwotCX0KKwllcnIgPSAtRUlOVkFMOworCWlmIChmaWxlLT5wcml2YXRlX2RhdGEpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWtvYmplY3RfZ2V0KCZmYy0+a29iaik7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmM7CiAJc3Bpbl91bmxvY2soJmZ1c2VfbG9jayk7CiAJcmV0dXJuIGZjOworCisgb3V0X3VubG9jazoKKwlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKKwlrb2JqZWN0X3B1dCgmZmMtPmtvYmopOworIG91dF9lcnI6CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIAogc3RhdGljIHN0cnVjdCBpbm9kZSAqZ2V0X3Jvb3RfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbW9kZSkKQEAgLTQ0NSwxNiArNDYwLDc0IEBACiAJLnJlYWRfaW5vZGUJPSBmdXNlX3JlYWRfaW5vZGUsCiAJLmNsZWFyX2lub2RlCT0gZnVzZV9jbGVhcl9pbm9kZSwKIAkucHV0X3N1cGVyCT0gZnVzZV9wdXRfc3VwZXIsCisJLnVtb3VudF9iZWdpbgk9IGZ1c2VfdW1vdW50X2JlZ2luLAogCS5zdGF0ZnMJCT0gZnVzZV9zdGF0ZnMsCiAJLnNob3dfb3B0aW9ucwk9IGZ1c2Vfc2hvd19vcHRpb25zLAogfTsKIAorc3RhdGljIHZvaWQgcHJvY2Vzc19pbml0X3JlcGx5KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZnVzZV9pbml0X291dCAqYXJnID0gJnJlcS0+bWlzYy5pbml0X291dDsKKworCWlmIChyZXEtPm91dC5oLmVycm9yIHx8IGFyZy0+bWFqb3IgIT0gRlVTRV9LRVJORUxfVkVSU0lPTikKKwkJZmMtPmNvbm5fZXJyb3IgPSAxOworCWVsc2UgeworCQlmYy0+bWlub3IgPSBhcmctPm1pbm9yOworCQlmYy0+bWF4X3dyaXRlID0gYXJnLT5taW5vciA8IDUgPyA0MDk2IDogYXJnLT5tYXhfd3JpdGU7CisJfQorCisJLyogQWZ0ZXIgSU5JVCByZXBseSBpcyByZWNlaXZlZCBvdGhlciByZXF1ZXN0cyBjYW4gZ28KKwkgICBvdXQuICBTbyBkbyAoRlVTRV9NQVhfT1VUU1RBTkRJTkcgLSAxKSBudW1iZXIgb2YKKwkgICB1cCgpcyBvbiBvdXRzdGFuZGluZ19zZW0uICBUaGUgbGFzdCB1cCgpIGlzIGRvbmUgaW4KKwkgICBmdXNlX3B1dGJhY2tfcmVxdWVzdCgpICovCisJZm9yIChpID0gMTsgaSA8IEZVU0VfTUFYX09VVFNUQU5ESU5HOyBpKyspCisJCXVwKCZmYy0+b3V0c3RhbmRpbmdfc2VtKTsKKworCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7Cit9CisKK3N0YXRpYyB2b2lkIGZ1c2Vfc2VuZF9pbml0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjKQoreworCS8qIFRoaXMgaXMgY2FsbGVkIGZyb20gZnVzZV9yZWFkX3N1cGVyKCkgc28gdGhlcmUncyBndWFyYW50ZWVkCisJICAgdG8gYmUgZXhhY3RseSBvbmUgcmVxdWVzdCBhdmFpbGFibGUgKi8KKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9IGZ1c2VfZ2V0X3JlcXVlc3QoZmMpOworCXN0cnVjdCBmdXNlX2luaXRfaW4gKmFyZyA9ICZyZXEtPm1pc2MuaW5pdF9pbjsKKworCWFyZy0+bWFqb3IgPSBGVVNFX0tFUk5FTF9WRVJTSU9OOworCWFyZy0+bWlub3IgPSBGVVNFX0tFUk5FTF9NSU5PUl9WRVJTSU9OOworCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX0lOSVQ7CisJcmVxLT5pbi5udW1hcmdzID0gMTsKKwlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZigqYXJnKTsKKwlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBhcmc7CisJcmVxLT5vdXQubnVtYXJncyA9IDE7CisJLyogVmFyaWFibGUgbGVuZ3RoIGFyZ3VlbWVudCB1c2VkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisJICAgd2l0aCBpbnRlcmZhY2UgdmVyc2lvbiA8IDcuNS4gIFJlc3Qgb2YgaW5pdF9vdXQgaXMgemVyb2VkCisJICAgYnkgZG9fZ2V0X3JlcXVlc3QoKSwgc28gYSBzaG9ydCByZXBseSBpcyBub3QgYSBwcm9ibGVtICovCisJcmVxLT5vdXQuYXJndmFyID0gMTsKKwlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yoc3RydWN0IGZ1c2VfaW5pdF9vdXQpOworCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmcmVxLT5taXNjLmluaXRfb3V0OworCXJlcS0+ZW5kID0gcHJvY2Vzc19pbml0X3JlcGx5OworCXJlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKGZjLCByZXEpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGNvbm5faWQodm9pZCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGN0ciA9IDE7CisJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKKwlzcGluX2xvY2soJmZ1c2VfbG9jayk7CisJdmFsID0gY3RyKys7CisJc3Bpbl91bmxvY2soJmZ1c2VfbG9jayk7CisJcmV0dXJuIHZhbDsKK30KKwogc3RhdGljIGludCBmdXNlX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKIHsKIAlzdHJ1Y3QgZnVzZV9jb25uICpmYzsKIAlzdHJ1Y3QgaW5vZGUgKnJvb3Q7CiAJc3RydWN0IGZ1c2VfbW91bnRfZGF0YSBkOwogCXN0cnVjdCBmaWxlICpmaWxlOworCXN0cnVjdCBkZW50cnkgKnJvb3RfZGVudHJ5OwogCWludCBlcnI7CiAKIAlpZiAoIXBhcnNlX2Z1c2Vfb3B0KChjaGFyICopIGRhdGEsICZkKSkKQEAgLTQ4MiwyMyArNTU1LDQyIEBACiAJaWYgKGZjLT5tYXhfcmVhZCAvIFBBR0VfQ0FDSEVfU0laRSA8IGZjLT5iZGkucmFfcGFnZXMpCiAJCWZjLT5iZGkucmFfcGFnZXMgPSBmYy0+bWF4X3JlYWQgLyBQQUdFX0NBQ0hFX1NJWkU7CiAKKwkvKiBVc2VkIGJ5IGdldF9yb290X2lub2RlKCkgKi8KKwlzYi0+c19mc19pbmZvID0gZmM7CisKIAllcnIgPSAtRU5PTUVNOwogCXJvb3QgPSBnZXRfcm9vdF9pbm9kZShzYiwgZC5yb290bW9kZSk7Ci0JaWYgKHJvb3QgPT0gTlVMTCkKKwlpZiAoIXJvb3QpCiAJCWdvdG8gZXJyOwogCi0Jc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKLQlpZiAoIXNiLT5zX3Jvb3QpIHsKKwlyb290X2RlbnRyeSA9IGRfYWxsb2Nfcm9vdChyb290KTsKKwlpZiAoIXJvb3RfZGVudHJ5KSB7CiAJCWlwdXQocm9vdCk7CiAJCWdvdG8gZXJyOwogCX0KKworCWVyciA9IGtvYmplY3Rfc2V0X25hbWUoJmZjLT5rb2JqLCAiJWxsdSIsIGNvbm5faWQoKSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfcHV0X3Jvb3Q7CisKKwllcnIgPSBrb2JqZWN0X2FkZCgmZmMtPmtvYmopOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3B1dF9yb290OworCisJc2ItPnNfcm9vdCA9IHJvb3RfZGVudHJ5OworCXNwaW5fbG9jaygmZnVzZV9sb2NrKTsKKwlmYy0+bW91bnRlZCA9IDE7CisJZmMtPmNvbm5lY3RlZCA9IDE7CisJc3Bpbl91bmxvY2soJmZ1c2VfbG9jayk7CisKIAlmdXNlX3NlbmRfaW5pdChmYyk7CisKIAlyZXR1cm4gMDsKIAorIGVycl9wdXRfcm9vdDoKKwlkcHV0KHJvb3RfZGVudHJ5KTsKICBlcnI6Ci0Jc3Bpbl9sb2NrKCZmdXNlX2xvY2spOwotCWZ1c2VfcmVsZWFzZV9jb25uKGZjKTsKLQlzcGluX3VubG9jaygmZnVzZV9sb2NrKTsKKwlrb2JqZWN0X3B1dCgmZmMtPmtvYmopOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTUxNiw2ICs2MDgsNjkgQEAKIAkua2lsbF9zYgk9IGtpbGxfYW5vbl9zdXBlciwKIH07CiAKK3N0YXRpYyBzc2l6ZV90IGZ1c2VfY29ubl93YWl0aW5nX3Nob3coc3RydWN0IGZ1c2VfY29ubiAqZmMsIGNoYXIgKnBhZ2UpCit7CisJcmV0dXJuIHNwcmludGYocGFnZSwgIiVpXG4iLCBhdG9taWNfcmVhZCgmZmMtPm51bV93YWl0aW5nKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZ1c2VfY29ubl9hYm9ydF9zdG9yZShzdHJ1Y3QgZnVzZV9jb25uICpmYywgY29uc3QgY2hhciAqcGFnZSwKKwkJCQkgICAgIHNpemVfdCBjb3VudCkKK3sKKwlmdXNlX2Fib3J0X2Nvbm4oZmMpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBmdXNlX2Nvbm5fYXR0ciBmdXNlX2Nvbm5fd2FpdGluZyA9CisJX19BVFRSKHdhaXRpbmcsIDA0MDAsIGZ1c2VfY29ubl93YWl0aW5nX3Nob3csIE5VTEwpOworc3RhdGljIHN0cnVjdCBmdXNlX2Nvbm5fYXR0ciBmdXNlX2Nvbm5fYWJvcnQgPQorCV9fQVRUUihhYm9ydCwgMDYwMCwgTlVMTCwgZnVzZV9jb25uX2Fib3J0X3N0b3JlKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmZ1c2VfY29ubl9hdHRyc1tdID0geworCSZmdXNlX2Nvbm5fd2FpdGluZy5hdHRyLAorCSZmdXNlX2Nvbm5fYWJvcnQuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHNzaXplX3QgZnVzZV9jb25uX2F0dHJfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNoYXIgKnBhZ2UpCit7CisJc3RydWN0IGZ1c2VfY29ubl9hdHRyICpmY2EgPQorCQljb250YWluZXJfb2YoYXR0ciwgc3RydWN0IGZ1c2VfY29ubl9hdHRyLCBhdHRyKTsKKworCWlmIChmY2EtPnNob3cpCisJCXJldHVybiBmY2EtPnNob3coZ2V0X2Z1c2VfY29ubl9rb2JqKGtvYmopLCBwYWdlKTsKKwllbHNlCisJCXJldHVybiAtRUFDQ0VTOworfQorCitzdGF0aWMgc3NpemVfdCBmdXNlX2Nvbm5fYXR0cl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY29uc3QgY2hhciAqcGFnZSwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmdXNlX2Nvbm5fYXR0ciAqZmNhID0KKwkJY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBmdXNlX2Nvbm5fYXR0ciwgYXR0cik7CisKKwlpZiAoZmNhLT5zdG9yZSkKKwkJcmV0dXJuIGZjYS0+c3RvcmUoZ2V0X2Z1c2VfY29ubl9rb2JqKGtvYmopLCBwYWdlLCBjb3VudCk7CisJZWxzZQorCQlyZXR1cm4gLUVBQ0NFUzsKK30KKworc3RhdGljIHN0cnVjdCBzeXNmc19vcHMgZnVzZV9jb25uX3N5c2ZzX29wcyA9IHsKKwkuc2hvdwk9ICZmdXNlX2Nvbm5fYXR0cl9zaG93LAorCS5zdG9yZQk9ICZmdXNlX2Nvbm5fYXR0cl9zdG9yZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGt0eXBlX2Z1c2VfY29ubiA9IHsKKwkucmVsZWFzZQk9IGZ1c2VfY29ubl9yZWxlYXNlLAorCS5zeXNmc19vcHMJPSAmZnVzZV9jb25uX3N5c2ZzX29wcywKKwkuZGVmYXVsdF9hdHRycwk9IGZ1c2VfY29ubl9hdHRycywKK307CisKK3N0YXRpYyBkZWNsX3N1YnN5cyhmdXNlLCBOVUxMLCBOVUxMKTsKK3N0YXRpYyBkZWNsX3N1YnN5cyhjb25uZWN0aW9ucywgJmt0eXBlX2Z1c2VfY29ubiwgTlVMTCk7CisKIHN0YXRpYyB2b2lkIGZ1c2VfaW5vZGVfaW5pdF9vbmNlKHZvaWQgKmZvbywga21lbV9jYWNoZV90ICpjYWNoZXAsCiAJCQkJIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CkBAIC01NTMsNiArNzA4LDM0IEBACiAJa21lbV9jYWNoZV9kZXN0cm95KGZ1c2VfaW5vZGVfY2FjaGVwKTsKIH0KIAorc3RhdGljIGludCBmdXNlX3N5c2ZzX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJa3NldF9zZXRfa3NldF9zKCZmdXNlX3N1YnN5cywgZnNfc3Vic3lzKTsKKwllcnIgPSBzdWJzeXN0ZW1fcmVnaXN0ZXIoJmZ1c2Vfc3Vic3lzKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9lcnI7CisKKwlrc2V0X3NldF9rc2V0X3MoJmNvbm5lY3Rpb25zX3N1YnN5cywgZnVzZV9zdWJzeXMpOworCWVyciA9IHN1YnN5c3RlbV9yZWdpc3RlcigmY29ubmVjdGlvbnNfc3Vic3lzKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mdXNlX3VucmVnaXN0ZXI7CisKKwlyZXR1cm4gMDsKKworIG91dF9mdXNlX3VucmVnaXN0ZXI6CisJc3Vic3lzdGVtX3VucmVnaXN0ZXIoJmZ1c2Vfc3Vic3lzKTsKKyBvdXRfZXJyOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGZ1c2Vfc3lzZnNfY2xlYW51cCh2b2lkKQoreworCXN1YnN5c3RlbV91bnJlZ2lzdGVyKCZjb25uZWN0aW9uc19zdWJzeXMpOworCXN1YnN5c3RlbV91bnJlZ2lzdGVyKCZmdXNlX3N1YnN5cyk7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IGZ1c2VfaW5pdCh2b2lkKQogewogCWludCByZXM7CkBAIC01NjksOCArNzUyLDE0IEBACiAJaWYgKHJlcykKIAkJZ290byBlcnJfZnNfY2xlYW51cDsKIAorCXJlcyA9IGZ1c2Vfc3lzZnNfaW5pdCgpOworCWlmIChyZXMpCisJCWdvdG8gZXJyX2Rldl9jbGVhbnVwOworCiAJcmV0dXJuIDA7CiAKKyBlcnJfZGV2X2NsZWFudXA6CisJZnVzZV9kZXZfY2xlYW51cCgpOwogIGVycl9mc19jbGVhbnVwOgogCWZ1c2VfZnNfY2xlYW51cCgpOwogIGVycjoKQEAgLTU4MSw2ICs3NzAsNyBAQAogewogCXByaW50ayhLRVJOX0RFQlVHICJmdXNlIGV4aXRcbiIpOwogCisJZnVzZV9zeXNmc19jbGVhbnVwKCk7CiAJZnVzZV9mc19jbGVhbnVwKCk7CiAJZnVzZV9kZXZfY2xlYW51cCgpOwogfQpkaWZmIC0tZ2l0IGEvZnMvaGZzL2JmaW5kLmMgYi9mcy9oZnMvYmZpbmQuYwppbmRleCA4OTQ1MGFlLi5mMTNmMTQ5IDEwMDY0NAotLS0gYS9mcy9oZnMvYmZpbmQuYworKysgYi9mcy9oZnMvYmZpbmQuYwpAQCAtNjQsNyArNjQsNiBAQAogCQllbHNlCiAJCQllID0gcmVjIC0gMTsKIAl9IHdoaWxlIChiIDw9IGUpOwotCS8vcHJpbnRrKCIlZDogJWQsJWQsJWRcbiIsIGJub2RlLT50aGlzLCBiLCBlLCByZWMpOwogCWlmIChyZWMgIT0gZSAmJiBlID49IDApIHsKIAkJbGVuID0gaGZzX2JyZWNfbGVub2ZmKGJub2RlLCBlLCAmb2ZmKTsKIAkJa2V5bGVuID0gaGZzX2JyZWNfa2V5bGVuKGJub2RlLCBlKTsKQEAgLTEyNyw3ICsxMjYsNyBAQAogCXJldHVybiByZXM7CiAKIGludmFsaWQ6Ci0JcHJpbnRrKCJIRlM6IGluY29uc2lzdGVuY3kgaW4gQipUcmVlICglZCwlZCwlZCwldSwldSlcbiIsCisJcHJpbnRrKEtFUk5fRVJSICJoZnM6IGluY29uc2lzdGVuY3kgaW4gQipUcmVlICglZCwlZCwlZCwldSwldSlcbiIsCiAJCWhlaWdodCwgYm5vZGUtPmhlaWdodCwgYm5vZGUtPnR5cGUsIG5pZHgsIHBhcmVudCk7CiAJcmVzID0gLUVJTzsKIHJlbGVhc2U6CmRpZmYgLS1naXQgYS9mcy9oZnMvYm5vZGUuYyBiL2ZzL2hmcy9ibm9kZS5jCmluZGV4IDNkNWNkYzYuLmE3YTdkNzcgMTAwNjQ0Ci0tLSBhL2ZzL2hmcy9ibm9kZS5jCisrKyBiL2ZzL2hmcy9ibm9kZS5jCkBAIC0xOTgsNyArMTk4LDcgQEAKIAogCS8vIG1vdmUgZG93bj8KIAlpZiAoIW5vZGUtPnByZXYgJiYgIW5vZGUtPm5leHQpIHsKLQkJcHJpbnRrKCJoZnNfYnRyZWVfZGVsX2xldmVsXG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImhmc19idHJlZV9kZWxfbGV2ZWxcbiIpOwogCX0KIAlpZiAoIW5vZGUtPnBhcmVudCkgewogCQl0cmVlLT5yb290ID0gMDsKQEAgLTIxOSw3ICsyMTksNyBAQAogCXN0cnVjdCBoZnNfYm5vZGUgKm5vZGU7CiAKIAlpZiAoY25pZCA+PSB0cmVlLT5ub2RlX2NvdW50KSB7Ci0JCXByaW50aygiSEZTOiByZXF1ZXN0IGZvciBub24tZXhpc3RlbnQgbm9kZSAlZCBpbiBCKlRyZWVcbiIsIGNuaWQpOworCQlwcmludGsoS0VSTl9FUlIgImhmczogcmVxdWVzdCBmb3Igbm9uLWV4aXN0ZW50IG5vZGUgJWQgaW4gQipUcmVlXG4iLCBjbmlkKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0yNDIsNyArMjQyLDcgQEAKIAlsb2ZmX3Qgb2ZmOwogCiAJaWYgKGNuaWQgPj0gdHJlZS0+bm9kZV9jb3VudCkgewotCQlwcmludGsoIkhGUzogcmVxdWVzdCBmb3Igbm9uLWV4aXN0ZW50IG5vZGUgJWQgaW4gQipUcmVlXG4iLCBjbmlkKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IHJlcXVlc3QgZm9yIG5vbi1leGlzdGVudCBub2RlICVkIGluIEIqVHJlZVxuIiwgY25pZCk7CiAJCXJldHVybiBOVUxMOwogCX0KIApkaWZmIC0tZ2l0IGEvZnMvaGZzL2JyZWMuYyBiL2ZzL2hmcy9icmVjLmMKaW5kZXggN2Q4ZmZmMi4uNWM4N2NmNCAxMDA2NDQKLS0tIGEvZnMvaGZzL2JyZWMuYworKysgYi9mcy9oZnMvYnJlYy5jCkBAIC0zNjIsNyArMzYyLDcgQEAKIAkJZW5kX29mZiA9IGhmc19ibm9kZV9yZWFkX3UxNihwYXJlbnQsIGVuZF9yZWNfb2ZmKTsKIAkJaWYgKGVuZF9yZWNfb2ZmIC0gZW5kX29mZiA8IGRpZmYpIHsKIAotCQkJcHJpbnRrKCJzcGxpdHRpbmcgaW5kZXggbm9kZS4uLlxuIik7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiaGZzOiBzcGxpdHRpbmcgaW5kZXggbm9kZS4uLlxuIik7CiAJCQlmZC0+Ym5vZGUgPSBwYXJlbnQ7CiAJCQluZXdfbm9kZSA9IGhmc19ibm9kZV9zcGxpdChmZCk7CiAJCQlpZiAoSVNfRVJSKG5ld19ub2RlKSkKZGlmZiAtLWdpdCBhL2ZzL2hmcy9idHJlZS5jIGIvZnMvaGZzL2J0cmVlLmMKaW5kZXggMzk0NzI1ZS4uN2JiMTFlZCAxMDA2NDQKLS0tIGEvZnMvaGZzL2J0cmVlLmMKKysrIGIvZnMvaGZzL2J0cmVlLmMKQEAgLTExMSw3ICsxMTEsNyBAQAogCQl3aGlsZSAoKG5vZGUgPSB0cmVlLT5ub2RlX2hhc2hbaV0pKSB7CiAJCQl0cmVlLT5ub2RlX2hhc2hbaV0gPSBub2RlLT5uZXh0X2hhc2g7CiAJCQlpZiAoYXRvbWljX3JlYWQoJm5vZGUtPnJlZmNudCkpCi0JCQkJcHJpbnRrKCJIRlM6IG5vZGUgJWQ6JWQgc3RpbGwgaGFzICVkIHVzZXIocykhXG4iLAorCQkJCXByaW50ayhLRVJOX0VSUiAiaGZzOiBub2RlICVkOiVkIHN0aWxsIGhhcyAlZCB1c2VyKHMpIVxuIiwKIAkJCQkJbm9kZS0+dHJlZS0+Y25pZCwgbm9kZS0+dGhpcywgYXRvbWljX3JlYWQoJm5vZGUtPnJlZmNudCkpOwogCQkJaGZzX2Jub2RlX2ZyZWUobm9kZSk7CiAJCQl0cmVlLT5ub2RlX2hhc2hfY250LS07CkBAIC0yNTIsNyArMjUyLDcgQEAKIAkJa3VubWFwKCpwYWdlcCk7CiAJCW5pZHggPSBub2RlLT5uZXh0OwogCQlpZiAoIW5pZHgpIHsKLQkJCXByaW50aygiY3JlYXRlIG5ldyBibWFwIG5vZGUuLi5cbiIpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgImhmczogY3JlYXRlIG5ldyBibWFwIG5vZGUuLi5cbiIpOwogCQkJbmV4dF9ub2RlID0gaGZzX2JtYXBfbmV3X2JtYXAobm9kZSwgaWR4KTsKIAkJfSBlbHNlCiAJCQluZXh0X25vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCBuaWR4KTsKQEAgLTI5Miw3ICsyOTIsNyBAQAogCQloZnNfYm5vZGVfcHV0KG5vZGUpOwogCQlpZiAoIWkpIHsKIAkJCS8qIHBhbmljICovOwotCQkJcHJpbnRrKCJIRlM6IHVuYWJsZSB0byBmcmVlIGJub2RlICV1LiBibWFwIG5vdCBmb3VuZCFcbiIsIG5vZGUtPnRoaXMpOworCQkJcHJpbnRrKEtFUk5fQ1JJVCAiaGZzOiB1bmFibGUgdG8gZnJlZSBibm9kZSAldS4gYm1hcCBub3QgZm91bmQhXG4iLCBub2RlLT50aGlzKTsKIAkJCXJldHVybjsKIAkJfQogCQlub2RlID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgaSk7CkBAIC0zMDAsNyArMzAwLDcgQEAKIAkJCXJldHVybjsKIAkJaWYgKG5vZGUtPnR5cGUgIT0gSEZTX05PREVfTUFQKSB7CiAJCQkvKiBwYW5pYyAqLzsKLQkJCXByaW50aygiSEZTOiBpbnZhbGlkIGJtYXAgZm91bmQhICgldSwlZClcbiIsIG5vZGUtPnRoaXMsIG5vZGUtPnR5cGUpOworCQkJcHJpbnRrKEtFUk5fQ1JJVCAiaGZzOiBpbnZhbGlkIGJtYXAgZm91bmQhICgldSwlZClcbiIsIG5vZGUtPnRoaXMsIG5vZGUtPnR5cGUpOwogCQkJaGZzX2Jub2RlX3B1dChub2RlKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtMzEzLDcgKzMxMyw3IEBACiAJbSA9IDEgPDwgKH5uaWR4ICYgNyk7CiAJYnl0ZSA9IGRhdGFbb2ZmXTsKIAlpZiAoIShieXRlICYgbSkpIHsKLQkJcHJpbnRrKCJIRlM6IHRyeWluZyB0byBmcmVlIGZyZWUgYm5vZGUgJXUoJWQpXG4iLCBub2RlLT50aGlzLCBub2RlLT50eXBlKTsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiaGZzOiB0cnlpbmcgdG8gZnJlZSBmcmVlIGJub2RlICV1KCVkKVxuIiwgbm9kZS0+dGhpcywgbm9kZS0+dHlwZSk7CiAJCWt1bm1hcChwYWdlKTsKIAkJaGZzX2Jub2RlX3B1dChub2RlKTsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZnMvaGZzL2NhdGFsb2cuYyBiL2ZzL2hmcy9jYXRhbG9nLmMKaW5kZXggMmZjZDY3OS4uYmE4NTE1NyAxMDA2NDQKLS0tIGEvZnMvaGZzL2NhdGFsb2cuYworKysgYi9mcy9oZnMvY2F0YWxvZy5jCkBAIC0xODQsNyArMTg0LDcgQEAKIAogCXR5cGUgPSByZWMudHlwZTsKIAlpZiAodHlwZSAhPSBIRlNfQ0RSX1RIRCAmJiB0eXBlICE9IEhGU19DRFJfRlRIKSB7Ci0JCXByaW50aygiSEZTLWZzOiBGb3VuZCBiYWQgdGhyZWFkIHJlY29yZCBpbiBjYXRhbG9nXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IGZvdW5kIGJhZCB0aHJlYWQgcmVjb3JkIGluIGNhdGFsb2dcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2hmcy9kaXIuYyBiL2ZzL2hmcy9kaXIuYwppbmRleCBlMWYyNGJlLi41MzRlNWE3IDEwMDY0NAotLS0gYS9mcy9oZnMvZGlyLmMKKysrIGIvZnMvaGZzL2Rpci5jCkBAIC04MSwxMiArODEsMTIgQEAKIAljYXNlIDE6CiAJCWhmc19ibm9kZV9yZWFkKGZkLmJub2RlLCAmZW50cnksIGZkLmVudHJ5b2Zmc2V0LCBmZC5lbnRyeWxlbmd0aCk7CiAJCWlmIChlbnRyeS50eXBlICE9IEhGU19DRFJfVEhEKSB7Ci0JCQlwcmludGsoIkhGUzogYmFkIGNhdGFsb2cgZm9sZGVyIHRocmVhZFxuIik7CisJCQlwcmludGsoS0VSTl9FUlIgImhmczogYmFkIGNhdGFsb2cgZm9sZGVyIHRocmVhZFxuIik7CiAJCQllcnIgPSAtRUlPOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJLy9pZiAoZmQuZW50cnlsZW5ndGggPCBIRlNfTUlOX1RIUkVBRF9TWikgewotCQkvLwlwcmludGsoIkhGUzogdHJ1bmNhdGVkIGNhdGFsb2cgdGhyZWFkXG4iKTsKKwkJLy8JcHJpbnRrKEtFUk5fRVJSICJoZnM6IHRydW5jYXRlZCBjYXRhbG9nIHRocmVhZFxuIik7CiAJCS8vCWVyciA9IC1FSU87CiAJCS8vCWdvdG8gb3V0OwogCQkvL30KQEAgLTEwNSw3ICsxMDUsNyBAQAogCiAJZm9yICg7OykgewogCQlpZiAoYmUzMl90b19jcHUoZmQua2V5LT5jYXQuUGFySUQpICE9IGlub2RlLT5pX2lubykgewotCQkJcHJpbnRrKCJIRlM6IHdhbGtlZCBwYXN0IGVuZCBvZiBkaXJcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IHdhbGtlZCBwYXN0IGVuZCBvZiBkaXJcbiIpOwogCQkJZXJyID0gLUVJTzsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0xMTQsNyArMTE0LDcgQEAKIAkJbGVuID0gaGZzX21hYzJhc2Moc2IsIHN0cmJ1ZiwgJmZkLmtleS0+Y2F0LkNOYW1lKTsKIAkJaWYgKHR5cGUgPT0gSEZTX0NEUl9ESVIpIHsKIAkJCWlmIChmZC5lbnRyeWxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaGZzX2NhdF9kaXIpKSB7Ci0JCQkJcHJpbnRrKCJIRlM6IHNtYWxsIGRpciBlbnRyeVxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IHNtYWxsIGRpciBlbnRyeVxuIik7CiAJCQkJZXJyID0gLUVJTzsKIAkJCQlnb3RvIG91dDsKIAkJCX0KQEAgLTEyMyw3ICsxMjMsNyBAQAogCQkJCWJyZWFrOwogCQl9IGVsc2UgaWYgKHR5cGUgPT0gSEZTX0NEUl9GSUwpIHsKIAkJCWlmIChmZC5lbnRyeWxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaGZzX2NhdF9maWxlKSkgewotCQkJCXByaW50aygiSEZTOiBzbWFsbCBmaWxlIGVudHJ5XG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgImhmczogc21hbGwgZmlsZSBlbnRyeVxuIik7CiAJCQkJZXJyID0gLUVJTzsKIAkJCQlnb3RvIG91dDsKIAkJCX0KQEAgLTEzMSw3ICsxMzEsNyBAQAogCQkJCSAgICBiZTMyX3RvX2NwdShlbnRyeS5maWxlLkZsTnVtKSwgRFRfUkVHKSkKIAkJCQlicmVhazsKIAkJfSBlbHNlIHsKLQkJCXByaW50aygiSEZTOiBiYWQgY2F0YWxvZyBlbnRyeSB0eXBlICVkXG4iLCB0eXBlKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiaGZzOiBiYWQgY2F0YWxvZyBlbnRyeSB0eXBlICVkXG4iLCB0eXBlKTsKIAkJCWVyciA9IC1FSU87CiAJCQlnb3RvIG91dDsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMvaGZzL2hmc19mcy5oIGIvZnMvaGZzL2hmc19mcy5oCmluZGV4IGNjNWRjZDUuLjE4Y2U0N2EgMTAwNjQ0Ci0tLSBhL2ZzL2hmcy9oZnNfZnMuaAorKysgYi9mcy9oZnMvaGZzX2ZzLmgKQEAgLTM1LDkgKzM1LDYgQEAKICNkZWZpbmUgZHByaW50KGZsZywgZm10LCBhcmdzLi4uKSBcCiAJaWYgKGZsZyAmIERCR19NQVNLKSBwcmludGsoZm10ICwgIyMgYXJncykKIAotI2RlZmluZSBoZnNfd2Fybihmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgZm9ybWF0ICwgIyMgYXJncykKLSNkZWZpbmUgaGZzX2Vycm9yKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSIGZvcm1hdCAsICMjIGFyZ3MpCi0KIC8qCiAgKiBzdHJ1Y3QgaGZzX2lub2RlX2luZm8KICAqCmRpZmYgLS1naXQgYS9mcy9oZnMvaW5vZGUuYyBiL2ZzL2hmcy9pbm9kZS5jCmluZGV4IGQ0OTkzOTNhLi4zOWZkODViIDEwMDY0NAotLS0gYS9mcy9oZnMvaW5vZGUuYworKysgYi9mcy9oZnMvaW5vZGUuYwpAQCAtOTUsNyArOTUsNiBAQAogCQl9IHdoaWxlICgtLWkgJiYgbmlkeCA8IHRyZWUtPm5vZGVfY291bnQpOwogCQlzcGluX3VubG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKIAl9Ci0JLy9wcmludGsoInJlbGVhc2VwYWdlOiAlbHUsJXggPSAlZFxuIiwgcGFnZS0+aW5kZXgsIG1hc2ssIHJlcyk7CiAJcmV0dXJuIHJlcyA/IHRyeV90b19mcmVlX2J1ZmZlcnMocGFnZSkgOiAwOwogfQogCkBAIC01NDcsMTMgKzU0NiwxMyBAQAogCWlmIChhdG9taWNfcmVhZCgmZmlsZS0+Zl9jb3VudCkgIT0gMCkKIAkJcmV0dXJuIDA7CiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJkhGU19JKGlub2RlKS0+b3BlbmNudCkpIHsKLQkJZG93bigmaW5vZGUtPmlfc2VtKTsKKwkJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQloZnNfZmlsZV90cnVuY2F0ZShpbm9kZSk7CiAJCS8vaWYgKGlub2RlLT5pX2ZsYWdzICYgU19ERUFEKSB7CiAJCS8vCWhmc19kZWxldGVfY2F0KGlub2RlLT5pX2lubywgSEZTUExVU19TQihzYikuaGlkZGVuX2RpciwgTlVMTCk7CiAJCS8vCWhmc19kZWxldGVfaW5vZGUoaW5vZGUpOwogCQkvL30KLQkJdXAoJmlub2RlLT5pX3NlbSk7CisJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2hmcy9tZGIuYyBiL2ZzL2hmcy9tZGIuYwppbmRleCAwYTQ3M2Y3Li5iNDY1MWUxIDEwMDY0NAotLS0gYS9mcy9oZnMvbWRiLmMKKysrIGIvZnMvaGZzL21kYi5jCkBAIC00Nyw3ICs0Nyw3IEBACiAJCQkqc3RhcnQgPSAoc2VjdG9yX3QpdGUuY2R0ZV9hZGRyLmxiYSA8PCAyOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJcHJpbnRrKEtFUk5fRVJSICJIRlM6IEludmFsaWQgc2Vzc2lvbiBudW1iZXIgb3IgdHlwZSBvZiB0cmFja1xuIik7CisJCXByaW50ayhLRVJOX0VSUiAiaGZzOiBpbnZhbGlkIHNlc3Npb24gbnVtYmVyIG9yIHR5cGUgb2YgdHJhY2tcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJbXNfaW5mby5hZGRyX2Zvcm1hdCA9IENEUk9NX0xCQTsKQEAgLTEwMCw3ICsxMDAsNyBAQAogCiAJSEZTX1NCKHNiKS0+YWxsb2NfYmxrc3ogPSBzaXplID0gYmUzMl90b19jcHUobWRiLT5kckFsQmxrU2l6KTsKIAlpZiAoIXNpemUgfHwgKHNpemUgJiAoSEZTX1NFQ1RPUl9TSVpFIC0gMSkpKSB7Ci0JCWhmc193YXJuKCJoZnNfZnM6IGJhZCBhbGxvY2F0aW9uIGJsb2NrIHNpemUgJWRcbiIsIHNpemUpOworCQlwcmludGsoS0VSTl9FUlIgImhmczogYmFkIGFsbG9jYXRpb24gYmxvY2sgc2l6ZSAlZFxuIiwgc2l6ZSk7CiAJCWdvdG8gb3V0X2JoOwogCX0KIApAQCAtMTE3LDcgKzExNyw3IEBACiAJCXNpemUgPj49IDE7CiAJYnJlbHNlKGJoKTsKIAlpZiAoIXNiX3NldF9ibG9ja3NpemUoc2IsIHNpemUpKSB7Ci0JCXByaW50aygiaGZzX2ZzOiB1bmFibGUgdG8gc2V0IGJsb2Nrc2l6ZSB0byAldVxuIiwgc2l6ZSk7CisJCXByaW50ayhLRVJOX0VSUiAiaGZzOiB1bmFibGUgdG8gc2V0IGJsb2Nrc2l6ZSB0byAldVxuIiwgc2l6ZSk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMTYxLDggKzE2MSw4IEBACiAJfQogCiAJaWYgKCFIRlNfU0Ioc2IpLT5hbHRfbWRiKSB7Ci0JCWhmc193YXJuKCJoZnNfZnM6IHVuYWJsZSB0byBsb2NhdGUgYWx0ZXJuYXRlIE1EQlxuIik7Ci0JCWhmc193YXJuKCJoZnNfZnM6IGNvbnRpbnVpbmcgd2l0aG91dCBhbiBhbHRlcm5hdGUgTURCXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGZzOiB1bmFibGUgdG8gbG9jYXRlIGFsdGVybmF0ZSBNREJcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZnM6IGNvbnRpbnVpbmcgd2l0aG91dCBhbiBhbHRlcm5hdGUgTURCXG4iKTsKIAl9CiAKIAlIRlNfU0Ioc2IpLT5iaXRtYXAgPSAoX19iZTMyICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBQQUdFX1NJWkUgPCA4MTkyID8gMSA6IDApOwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJd2hpbGUgKHNpemUpIHsKIAkJYmggPSBzYl9icmVhZChzYiwgb2ZmID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKIAkJaWYgKCFiaCkgewotCQkJaGZzX3dhcm4oImhmc19mczogdW5hYmxlIHRvIHJlYWQgdm9sdW1lIGJpdG1hcFxuIik7CisJCQlwcmludGsoS0VSTl9FUlIgImhmczogdW5hYmxlIHRvIHJlYWQgdm9sdW1lIGJpdG1hcFxuIik7CiAJCQlnb3RvIG91dDsKIAkJfQogCQlvZmYyID0gb2ZmICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpOwpAQCAtMTkxLDIzICsxOTEsMjMgQEAKIAogCUhGU19TQihzYiktPmV4dF90cmVlID0gaGZzX2J0cmVlX29wZW4oc2IsIEhGU19FWFRfQ05JRCwgaGZzX2V4dF9rZXljbXApOwogCWlmICghSEZTX1NCKHNiKS0+ZXh0X3RyZWUpIHsKLQkJaGZzX3dhcm4oImhmc19mczogdW5hYmxlIHRvIG9wZW4gZXh0ZW50IHRyZWVcbiIpOworCQlwcmludGsoS0VSTl9FUlIgImhmczogdW5hYmxlIHRvIG9wZW4gZXh0ZW50IHRyZWVcbiIpOwogCQlnb3RvIG91dDsKIAl9CiAJSEZTX1NCKHNiKS0+Y2F0X3RyZWUgPSBoZnNfYnRyZWVfb3BlbihzYiwgSEZTX0NBVF9DTklELCBoZnNfY2F0X2tleWNtcCk7CiAJaWYgKCFIRlNfU0Ioc2IpLT5jYXRfdHJlZSkgewotCQloZnNfd2FybigiaGZzX2ZzOiB1bmFibGUgdG8gb3BlbiBjYXRhbG9nIHRyZWVcbiIpOworCQlwcmludGsoS0VSTl9FUlIgImhmczogdW5hYmxlIHRvIG9wZW4gY2F0YWxvZyB0cmVlXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCiAJYXR0cmliID0gbWRiLT5kckF0cmI7CiAJaWYgKCEoYXR0cmliICYgY3B1X3RvX2JlMTYoSEZTX1NCX0FUVFJJQl9VTk1OVCkpKSB7Ci0JCWhmc193YXJuKCJIRlMtZnMgd2FybmluZzogRmlsZXN5c3RlbSB3YXMgbm90IGNsZWFubHkgdW5tb3VudGVkLCAiCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImhmczogZmlsZXN5c3RlbSB3YXMgbm90IGNsZWFubHkgdW5tb3VudGVkLCAiCiAJCQkgInJ1bm5pbmcgZnNjay5oZnMgaXMgcmVjb21tZW5kZWQuICBtb3VudGluZyByZWFkLW9ubHkuXG4iKTsKIAkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOwogCX0KIAlpZiAoKGF0dHJpYiAmIGNwdV90b19iZTE2KEhGU19TQl9BVFRSSUJfU0xPQ0spKSkgewotCQloZnNfd2FybigiSEZTLWZzOiBGaWxlc3lzdGVtIGlzIG1hcmtlZCBsb2NrZWQsIG1vdW50aW5nIHJlYWQtb25seS5cbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZnM6IGZpbGVzeXN0ZW0gaXMgbWFya2VkIGxvY2tlZCwgbW91bnRpbmcgcmVhZC1vbmx5LlxuIik7CiAJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKIAl9CiAJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CkBAIC0zMDMsNyArMzAzLDcgQEAKIAkJd2hpbGUgKHNpemUpIHsKIAkJCWJoID0gc2JfYnJlYWQoc2IsIGJsb2NrKTsKIAkJCWlmICghYmgpIHsKLQkJCQloZnNfd2FybigiaGZzX2ZzOiB1bmFibGUgdG8gcmVhZCB2b2x1bWUgYml0bWFwXG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgImhmczogdW5hYmxlIHRvIHJlYWQgdm9sdW1lIGJpdG1hcFxuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlsZW4gPSBtaW4oKGludClzYi0+c19ibG9ja3NpemUgLSBvZmYsIHNpemUpOwpkaWZmIC0tZ2l0IGEvZnMvaGZzL3N1cGVyLmMgYi9mcy9oZnMvc3VwZXIuYwppbmRleCBjNTA3NGFlLi4xMTgxZDExIDEwMDY0NAotLS0gYS9mcy9oZnMvc3VwZXIuYworKysgYi9mcy9oZnMvc3VwZXIuYwpAQCAtMTAxLDEyICsxMDEsMTIgQEAKIAkJcmV0dXJuIDA7CiAJaWYgKCEoKmZsYWdzICYgTVNfUkRPTkxZKSkgewogCQlpZiAoIShIRlNfU0Ioc2IpLT5tZGItPmRyQXRyYiAmIGNwdV90b19iZTE2KEhGU19TQl9BVFRSSUJfVU5NTlQpKSkgewotCQkJcHJpbnRrKCJIRlMtZnMgd2FybmluZzogRmlsZXN5c3RlbSB3YXMgbm90IGNsZWFubHkgdW5tb3VudGVkLCAiCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZnM6IGZpbGVzeXN0ZW0gd2FzIG5vdCBjbGVhbmx5IHVubW91bnRlZCwgIgogCQkJICAgICAgICJydW5uaW5nIGZzY2suaGZzIGlzIHJlY29tbWVuZGVkLiAgbGVhdmluZyByZWFkLW9ubHkuXG4iKTsKIAkJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKIAkJCSpmbGFncyB8PSBNU19SRE9OTFk7CiAJCX0gZWxzZSBpZiAoSEZTX1NCKHNiKS0+bWRiLT5kckF0cmIgJiBjcHVfdG9fYmUxNihIRlNfU0JfQVRUUklCX1NMT0NLKSkgewotCQkJcHJpbnRrKCJIRlMtZnM6IEZpbGVzeXN0ZW0gaXMgbWFya2VkIGxvY2tlZCwgbGVhdmluZyByZWFkLW9ubHkuXG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImhmczogZmlsZXN5c3RlbSBpcyBtYXJrZWQgbG9ja2VkLCBsZWF2aW5nIHJlYWQtb25seS5cbiIpOwogCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOwogCQkJKmZsYWdzIHw9IE1TX1JET05MWTsKIAkJfQpAQCAtMjI5LDIxICsyMjksMjEgQEAKIAkJc3dpdGNoICh0b2tlbikgewogCQljYXNlIG9wdF91aWQ6CiAJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmdG1wKSkgewotCQkJCXByaW50aygiSEZTOiB1aWQgcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpOworCQkJCXByaW50ayhLRVJOX0VSUiAiaGZzOiB1aWQgcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJaHNiLT5zX3VpZCA9ICh1aWRfdCl0bXA7CiAJCQlicmVhazsKIAkJY2FzZSBvcHRfZ2lkOgogCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJnRtcCkpIHsKLQkJCQlwcmludGsoIkhGUzogZ2lkIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgImhmczogZ2lkIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCWhzYi0+c19naWQgPSAoZ2lkX3QpdG1wOwogCQkJYnJlYWs7CiAJCWNhc2Ugb3B0X3VtYXNrOgogCQkJaWYgKG1hdGNoX29jdGFsKCZhcmdzWzBdLCAmdG1wKSkgewotCQkJCXByaW50aygiSEZTOiB1bWFzayByZXF1aXJlcyBhIHZhbHVlXG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgImhmczogdW1hc2sgcmVxdWlyZXMgYSB2YWx1ZVxuIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQloc2ItPnNfZmlsZV91bWFzayA9ICh1bW9kZV90KXRtcDsKQEAgLTI1MSwzOSArMjUxLDM5IEBACiAJCQlicmVhazsKIAkJY2FzZSBvcHRfZmlsZV91bWFzazoKIAkJCWlmIChtYXRjaF9vY3RhbCgmYXJnc1swXSwgJnRtcCkpIHsKLQkJCQlwcmludGsoIkhGUzogZmlsZV91bWFzayByZXF1aXJlcyBhIHZhbHVlXG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgImhmczogZmlsZV91bWFzayByZXF1aXJlcyBhIHZhbHVlXG4iKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCWhzYi0+c19maWxlX3VtYXNrID0gKHVtb2RlX3QpdG1wOwogCQkJYnJlYWs7CiAJCWNhc2Ugb3B0X2Rpcl91bWFzazoKIAkJCWlmIChtYXRjaF9vY3RhbCgmYXJnc1swXSwgJnRtcCkpIHsKLQkJCQlwcmludGsoIkhGUzogZGlyX3VtYXNrIHJlcXVpcmVzIGEgdmFsdWVcbiIpOworCQkJCXByaW50ayhLRVJOX0VSUiAiaGZzOiBkaXJfdW1hc2sgcmVxdWlyZXMgYSB2YWx1ZVxuIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQloc2ItPnNfZGlyX3VtYXNrID0gKHVtb2RlX3QpdG1wOwogCQkJYnJlYWs7CiAJCWNhc2Ugb3B0X3BhcnQ6CiAJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmaHNiLT5wYXJ0KSkgewotCQkJCXByaW50aygiSEZTOiBwYXJ0IHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgImhmczogcGFydCByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBvcHRfc2Vzc2lvbjoKIAkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZoc2ItPnNlc3Npb24pKSB7Ci0JCQkJcHJpbnRrKCJIRlM6IHNlc3Npb24gcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpOworCQkJCXByaW50ayhLRVJOX0VSUiAiaGZzOiBzZXNzaW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIG9wdF90eXBlOgogCQkJaWYgKG1hdGNoX2ZvdXJjaGFyKCZhcmdzWzBdLCAmaHNiLT5zX3R5cGUpKSB7Ci0JCQkJcHJpbnRrKCJIRlMrLWZzOiB0eXBlIHJlcXVpcmVzIGEgNCBjaGFyYWN0ZXIgdmFsdWVcbiIpOworCQkJCXByaW50ayhLRVJOX0VSUiAiaGZzOiB0eXBlIHJlcXVpcmVzIGEgNCBjaGFyYWN0ZXIgdmFsdWVcbiIpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2Ugb3B0X2NyZWF0b3I6CiAJCQlpZiAobWF0Y2hfZm91cmNoYXIoJmFyZ3NbMF0sICZoc2ItPnNfY3JlYXRvcikpIHsKLQkJCQlwcmludGsoIkhGUystZnM6IGNyZWF0b3IgcmVxdWlyZXMgYSA0IGNoYXJhY3RlciB2YWx1ZVxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IGNyZWF0b3IgcmVxdWlyZXMgYSA0IGNoYXJhY3RlciB2YWx1ZVxuIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlicmVhazsKQEAgLTI5MiwxMyArMjkyLDEzIEBACiAJCQlicmVhazsKIAkJY2FzZSBvcHRfY29kZXBhZ2U6CiAJCQlpZiAoaHNiLT5ubHNfZGlzaykgewotCQkJCXByaW50aygiSEZTKy1mczogdW5hYmxlIHRvIGNoYW5nZSBjb2RlcGFnZVxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IHVuYWJsZSB0byBjaGFuZ2UgY29kZXBhZ2VcbiIpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJcCA9IG1hdGNoX3N0cmR1cCgmYXJnc1swXSk7CiAJCQloc2ItPm5sc19kaXNrID0gbG9hZF9ubHMocCk7CiAJCQlpZiAoIWhzYi0+bmxzX2Rpc2spIHsKLQkJCQlwcmludGsoIkhGUystZnM6IHVuYWJsZSB0byBsb2FkIGNvZGVwYWdlIFwiJXNcIlxuIiwgcCk7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IHVuYWJsZSB0byBsb2FkIGNvZGVwYWdlIFwiJXNcIlxuIiwgcCk7CiAJCQkJa2ZyZWUocCk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CkBAIC0zMDYsMTMgKzMwNiwxMyBAQAogCQkJYnJlYWs7CiAJCWNhc2Ugb3B0X2lvY2hhcnNldDoKIAkJCWlmIChoc2ItPm5sc19pbykgewotCQkJCXByaW50aygiSEZTOiB1bmFibGUgdG8gY2hhbmdlIGlvY2hhcnNldFxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IHVuYWJsZSB0byBjaGFuZ2UgaW9jaGFyc2V0XG4iKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCXAgPSBtYXRjaF9zdHJkdXAoJmFyZ3NbMF0pOwogCQkJaHNiLT5ubHNfaW8gPSBsb2FkX25scyhwKTsKIAkJCWlmICghaHNiLT5ubHNfaW8pIHsKLQkJCQlwcmludGsoIkhGUzogdW5hYmxlIHRvIGxvYWQgaW9jaGFyc2V0IFwiJXNcIlxuIiwgcCk7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IHVuYWJsZSB0byBsb2FkIGlvY2hhcnNldCBcIiVzXCJcbiIsIHApOwogCQkJCWtmcmVlKHApOwogCQkJCXJldHVybiAwOwogCQkJfQpAQCAtMzI2LDcgKzMyNiw3IEBACiAJaWYgKGhzYi0+bmxzX2Rpc2sgJiYgIWhzYi0+bmxzX2lvKSB7CiAJCWhzYi0+bmxzX2lvID0gbG9hZF9ubHNfZGVmYXVsdCgpOwogCQlpZiAoIWhzYi0+bmxzX2lvKSB7Ci0JCQlwcmludGsoIkhGUzogdW5hYmxlIHRvIGxvYWQgZGVmYXVsdCBpb2NoYXJzZXRcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IHVuYWJsZSB0byBsb2FkIGRlZmF1bHQgaW9jaGFyc2V0XG4iKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtMzY0LDcgKzM2NCw3IEBACiAKIAlyZXMgPSAtRUlOVkFMOwogCWlmICghcGFyc2Vfb3B0aW9ucygoY2hhciAqKWRhdGEsIHNiaSkpIHsKLQkJaGZzX3dhcm4oImhmc19mczogdW5hYmxlIHRvIHBhcnNlIG1vdW50IG9wdGlvbnMuXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IHVuYWJsZSB0byBwYXJzZSBtb3VudCBvcHRpb25zLlxuIik7CiAJCWdvdG8gYmFpbDsKIAl9CiAKQEAgLTM3NSw3ICszNzUsNyBAQAogCXJlcyA9IGhmc19tZGJfZ2V0KHNiKTsKIAlpZiAocmVzKSB7CiAJCWlmICghc2lsZW50KQotCQkJaGZzX3dhcm4oIlZGUzogQ2FuJ3QgZmluZCBhIEhGUyBmaWxlc3lzdGVtIG9uIGRldiAlcy5cbiIsCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZnM6IGNhbid0IGZpbmQgYSBIRlMgZmlsZXN5c3RlbSBvbiBkZXYgJXMuXG4iLAogCQkJCWhmc19tZGJfbmFtZShzYikpOwogCQlyZXMgPSAtRUlOVkFMOwogCQlnb3RvIGJhaWw7CkBAIC00MDcsNyArNDA3LDcgQEAKIGJhaWxfaXB1dDoKIAlpcHV0KHJvb3RfaW5vZGUpOwogYmFpbF9ub19yb290OgotCWhmc193YXJuKCJoZnNfZnM6IGdldCByb290IGlub2RlIGZhaWxlZC5cbiIpOworCXByaW50ayhLRVJOX0VSUiAiaGZzOiBnZXQgcm9vdCBpbm9kZSBmYWlsZWQuXG4iKTsKIGJhaWw6CiAJaGZzX21kYl9wdXQoc2IpOwogCXJldHVybiByZXM7CkBAIC00NTQsNyArNDU0LDcgQEAKIHsKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmhmc19mc190eXBlKTsKIAlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGhmc19pbm9kZV9jYWNoZXApKQotCQlwcmludGsoS0VSTl9JTkZPICJoZnNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJoZnNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdF9oZnNfZnMpCmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL2JmaW5kLmMgYi9mcy9oZnNwbHVzL2JmaW5kLmMKaW5kZXggMjU3Y2RkZS4uNTAwN2E0MSAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9iZmluZC5jCisrKyBiL2ZzL2hmc3BsdXMvYmZpbmQuYwpAQCAtNjQsNyArNjQsNiBAQAogCQllbHNlCiAJCQllID0gcmVjIC0gMTsKIAl9IHdoaWxlIChiIDw9IGUpOwotCS8vcHJpbnRrKCIlZDogJWQsJWQsJWRcbiIsIGJub2RlLT50aGlzLCBiLCBlLCByZWMpOwogCWlmIChyZWMgIT0gZSAmJiBlID49IDApIHsKIAkJbGVuID0gaGZzX2JyZWNfbGVub2ZmKGJub2RlLCBlLCAmb2ZmKTsKIAkJa2V5bGVuID0gaGZzX2JyZWNfa2V5bGVuKGJub2RlLCBlKTsKQEAgLTEyNyw3ICsxMjYsNyBAQAogCXJldHVybiByZXM7CiAKIGludmFsaWQ6Ci0JcHJpbnRrKCJIRlMrLWZzOiBpbmNvbnNpc3RlbmN5IGluIEIqVHJlZSAoJWQsJWQsJWQsJXUsJXUpXG4iLAorCXByaW50ayhLRVJOX0VSUiAiaGZzOiBpbmNvbnNpc3RlbmN5IGluIEIqVHJlZSAoJWQsJWQsJWQsJXUsJXUpXG4iLAogCQloZWlnaHQsIGJub2RlLT5oZWlnaHQsIGJub2RlLT50eXBlLCBuaWR4LCBwYXJlbnQpOwogCXJlcyA9IC1FSU87CiByZWxlYXNlOgpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9iaXRtYXAuYyBiL2ZzL2hmc3BsdXMvYml0bWFwLmMKaW5kZXggYzdkMzE2NC4uOWZiNTE2MyAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9iaXRtYXAuYworKysgYi9mcy9oZnNwbHVzL2JpdG1hcC5jCkBAIC0yOSw3ICsyOSw3IEBACiAJCXJldHVybiBzaXplOwogCiAJZHByaW50KERCR19CSVRNQVAsICJibG9ja19hbGxvY2F0ZTogJXUsJXUsJXVcbiIsIHNpemUsIG9mZnNldCwgbGVuKTsKLQlkb3duKCZIRlNQTFVTX1NCKHNiKS5hbGxvY19maWxlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmSEZTUExVU19TQihzYikuYWxsb2NfZmlsZS0+aV9tdXRleCk7CiAJbWFwcGluZyA9IEhGU1BMVVNfU0Ioc2IpLmFsbG9jX2ZpbGUtPmlfbWFwcGluZzsKIAlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIG9mZnNldCAvIFBBR0VfQ0FDSEVfQklUUywKIAkJCSAgICAgICAoZmlsbGVyX3QgKiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIE5VTEwpOwpAQCAtMTQzLDcgKzE0Myw3IEBACiAJc2ItPnNfZGlydCA9IDE7CiAJZHByaW50KERCR19CSVRNQVAsICItPiAldSwldVxuIiwgc3RhcnQsICptYXgpOwogb3V0OgotCXVwKCZIRlNQTFVTX1NCKHNiKS5hbGxvY19maWxlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZIRlNQTFVTX1NCKHNiKS5hbGxvY19maWxlLT5pX211dGV4KTsKIAlyZXR1cm4gc3RhcnQ7CiB9CiAKQEAgLTE2NCw3ICsxNjQsNyBAQAogCWlmICgob2Zmc2V0ICsgY291bnQpID4gSEZTUExVU19TQihzYikudG90YWxfYmxvY2tzKQogCQlyZXR1cm4gLTI7CiAKLQlkb3duKCZIRlNQTFVTX1NCKHNiKS5hbGxvY19maWxlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmSEZTUExVU19TQihzYikuYWxsb2NfZmlsZS0+aV9tdXRleCk7CiAJbWFwcGluZyA9IEhGU1BMVVNfU0Ioc2IpLmFsbG9jX2ZpbGUtPmlfbWFwcGluZzsKIAlwbnIgPSBvZmZzZXQgLyBQQUdFX0NBQ0hFX0JJVFM7CiAJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBwbnIsIChmaWxsZXJfdCAqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CkBAIC0yMTUsNyArMjE1LDcgQEAKIAlrdW5tYXAocGFnZSk7CiAJSEZTUExVU19TQihzYikuZnJlZV9ibG9ja3MgKz0gbGVuOwogCXNiLT5zX2RpcnQgPSAxOwotCXVwKCZIRlNQTFVTX1NCKHNiKS5hbGxvY19maWxlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZIRlNQTFVTX1NCKHNiKS5hbGxvY19maWxlLT5pX211dGV4KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9ibm9kZS5jIGIvZnMvaGZzcGx1cy9ibm9kZS5jCmluZGV4IDkzMGNkOTIuLjhmMDdlOGYgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvYm5vZGUuYworKysgYi9mcy9oZnNwbHVzL2Jub2RlLmMKQEAgLTM1OCw3ICszNTgsNyBAQAogCiAJLy8gbW92ZSBkb3duPwogCWlmICghbm9kZS0+cHJldiAmJiAhbm9kZS0+bmV4dCkgewotCQlwcmludGsoImhmc19idHJlZV9kZWxfbGV2ZWxcbiIpOworCQlwcmludGsoS0VSTl9ERUJVRyAiaGZzX2J0cmVlX2RlbF9sZXZlbFxuIik7CiAJfQogCWlmICghbm9kZS0+cGFyZW50KSB7CiAJCXRyZWUtPnJvb3QgPSAwOwpAQCAtMzc5LDcgKzM3OSw3IEBACiAJc3RydWN0IGhmc19ibm9kZSAqbm9kZTsKIAogCWlmIChjbmlkID49IHRyZWUtPm5vZGVfY291bnQpIHsKLQkJcHJpbnRrKCJIRlMrLWZzOiByZXF1ZXN0IGZvciBub24tZXhpc3RlbnQgbm9kZSAlZCBpbiBCKlRyZWVcbiIsIGNuaWQpOworCQlwcmludGsoS0VSTl9FUlIgImhmczogcmVxdWVzdCBmb3Igbm9uLWV4aXN0ZW50IG5vZGUgJWQgaW4gQipUcmVlXG4iLCBjbmlkKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC00MDIsNyArNDAyLDcgQEAKIAlsb2ZmX3Qgb2ZmOwogCiAJaWYgKGNuaWQgPj0gdHJlZS0+bm9kZV9jb3VudCkgewotCQlwcmludGsoIkhGUystZnM6IHJlcXVlc3QgZm9yIG5vbi1leGlzdGVudCBub2RlICVkIGluIEIqVHJlZVxuIiwgY25pZCk7CisJCXByaW50ayhLRVJOX0VSUiAiaGZzOiByZXF1ZXN0IGZvciBub24tZXhpc3RlbnQgbm9kZSAlZCBpbiBCKlRyZWVcbiIsIGNuaWQpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTU3Niw4ICs1NzYsOSBAQAogCW5vZGUgPSBoZnNfYm5vZGVfZmluZGhhc2godHJlZSwgbnVtKTsKIAlzcGluX3VubG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKIAlpZiAobm9kZSkgewotCQlwcmludGsoIm5ldyBub2RlICV1IGFscmVhZHkgaGFzaGVkP1xuIiwgbnVtKTsKLQkJQlVHKCk7CisJCXByaW50ayhLRVJOX0NSSVQgIm5ldyBub2RlICV1IGFscmVhZHkgaGFzaGVkP1xuIiwgbnVtKTsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIG5vZGU7CiAJfQogCW5vZGUgPSBfX2hmc19ibm9kZV9jcmVhdGUodHJlZSwgbnVtKTsKIAlpZiAoIW5vZGUpCmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL2JyZWMuYyBiL2ZzL2hmc3BsdXMvYnJlYy5jCmluZGV4IDBjY2VmMmEuLmM4OGU1ZDcgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvYnJlYy5jCisrKyBiL2ZzL2hmc3BsdXMvYnJlYy5jCkBAIC0zNjAsNyArMzYwLDcgQEAKIAkJZW5kX29mZiA9IGhmc19ibm9kZV9yZWFkX3UxNihwYXJlbnQsIGVuZF9yZWNfb2ZmKTsKIAkJaWYgKGVuZF9yZWNfb2ZmIC0gZW5kX29mZiA8IGRpZmYpIHsKIAotCQkJcHJpbnRrKCJzcGxpdHRpbmcgaW5kZXggbm9kZS4uLlxuIik7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiaGZzOiBzcGxpdHRpbmcgaW5kZXggbm9kZS4uLlxuIik7CiAJCQlmZC0+Ym5vZGUgPSBwYXJlbnQ7CiAJCQluZXdfbm9kZSA9IGhmc19ibm9kZV9zcGxpdChmZCk7CiAJCQlpZiAoSVNfRVJSKG5ld19ub2RlKSkKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvYnRyZWUuYyBiL2ZzL2hmc3BsdXMvYnRyZWUuYwppbmRleCA0NDMyNmFhLi5hNjdlZGZhIDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL2J0cmVlLmMKKysrIGIvZnMvaGZzcGx1cy9idHJlZS5jCkBAIC0zMSwxNyArMzEsOCBAQAogCiAJaW5pdF9NVVRFWCgmdHJlZS0+dHJlZV9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmdHJlZS0+aGFzaF9sb2NrKTsKLQkvKiBTZXQgdGhlIGNvcnJlY3QgY29tcGFyZSBmdW5jdGlvbiAqLwogCXRyZWUtPnNiID0gc2I7CiAJdHJlZS0+Y25pZCA9IGlkOwotCWlmIChpZCA9PSBIRlNQTFVTX0VYVF9DTklEKSB7Ci0JCXRyZWUtPmtleWNtcCA9IGhmc3BsdXNfZXh0X2NtcF9rZXk7Ci0JfSBlbHNlIGlmIChpZCA9PSBIRlNQTFVTX0NBVF9DTklEKSB7Ci0JCXRyZWUtPmtleWNtcCA9IGhmc3BsdXNfY2F0X2NtcF9rZXk7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKCJIRlMrLWZzOiB1bmtub3duIEIqVHJlZSByZXF1ZXN0ZWRcbiIpOwotCQlnb3RvIGZyZWVfdHJlZTsKLQl9CiAJdHJlZS0+aW5vZGUgPSBpZ2V0KHNiLCBpZCk7CiAJaWYgKCF0cmVlLT5pbm9kZSkKIAkJZ290byBmcmVlX3RyZWU7CkBAIC02NCw2ICs1NSwyMCBAQAogCXRyZWUtPm1heF9rZXlfbGVuID0gYmUxNl90b19jcHUoaGVhZC0+bWF4X2tleV9sZW4pOwogCXRyZWUtPmRlcHRoID0gYmUxNl90b19jcHUoaGVhZC0+ZGVwdGgpOwogCisJLyogU2V0IHRoZSBjb3JyZWN0IGNvbXBhcmUgZnVuY3Rpb24gKi8KKwlpZiAoaWQgPT0gSEZTUExVU19FWFRfQ05JRCkgeworCQl0cmVlLT5rZXljbXAgPSBoZnNwbHVzX2V4dF9jbXBfa2V5OworCX0gZWxzZSBpZiAoaWQgPT0gSEZTUExVU19DQVRfQ05JRCkgeworCQlpZiAoKEhGU1BMVVNfU0Ioc2IpLmZsYWdzICYgSEZTUExVU19TQl9IRlNYKSAmJgorCQkgICAgKGhlYWQtPmtleV90eXBlID09IEhGU1BMVVNfS0VZX0JJTkFSWSkpCisJCQl0cmVlLT5rZXljbXAgPSBoZnNwbHVzX2NhdF9iaW5fY21wX2tleTsKKwkJZWxzZQorCQkJdHJlZS0+a2V5Y21wID0gaGZzcGx1c19jYXRfY2FzZV9jbXBfa2V5OworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGZzOiB1bmtub3duIEIqVHJlZSByZXF1ZXN0ZWRcbiIpOworCQlnb3RvIGZhaWxfcGFnZTsKKwl9CisKIAlzaXplID0gdHJlZS0+bm9kZV9zaXplOwogCWlmICghc2l6ZSB8fCBzaXplICYgKHNpemUgLSAxKSkKIAkJZ290byBmYWlsX3BhZ2U7CkBAIC05OSw3ICsxMDQsNyBAQAogCQl3aGlsZSAoKG5vZGUgPSB0cmVlLT5ub2RlX2hhc2hbaV0pKSB7CiAJCQl0cmVlLT5ub2RlX2hhc2hbaV0gPSBub2RlLT5uZXh0X2hhc2g7CiAJCQlpZiAoYXRvbWljX3JlYWQoJm5vZGUtPnJlZmNudCkpCi0JCQkJcHJpbnRrKCJIRlMrOiBub2RlICVkOiVkIHN0aWxsIGhhcyAlZCB1c2VyKHMpIVxuIiwKKwkJCQlwcmludGsoS0VSTl9DUklUICJoZnM6IG5vZGUgJWQ6JWQgc3RpbGwgaGFzICVkIHVzZXIocykhXG4iLAogCQkJCQlub2RlLT50cmVlLT5jbmlkLCBub2RlLT50aGlzLCBhdG9taWNfcmVhZCgmbm9kZS0+cmVmY250KSk7CiAJCQloZnNfYm5vZGVfZnJlZShub2RlKTsKIAkJCXRyZWUtPm5vZGVfaGFzaF9jbnQtLTsKQEAgLTIyMywxMCArMjI4LDYgQEAKIAkJCQkJCXRyZWUtPmZyZWVfbm9kZXMtLTsKIAkJCQkJCW1hcmtfaW5vZGVfZGlydHkodHJlZS0+aW5vZGUpOwogCQkJCQkJaGZzX2Jub2RlX3B1dChub2RlKTsKLQkJCQkJCWlmICghaWR4KSB7Ci0JCQkJCQkJcHJpbnRrKCJ1bmV4cGVjdGVkIGlkeCAldSAoJXUpXG4iLCBpZHgsIG5vZGUtPnRoaXMpOwotCQkJCQkJCUJVRygpOwotCQkJCQkJfQogCQkJCQkJcmV0dXJuIGhmc19ibm9kZV9jcmVhdGUodHJlZSwgaWR4KTsKIAkJCQkJfQogCQkJCX0KQEAgLTI0Miw3ICsyNDMsNyBAQAogCQlrdW5tYXAoKnBhZ2VwKTsKIAkJbmlkeCA9IG5vZGUtPm5leHQ7CiAJCWlmICghbmlkeCkgewotCQkJcHJpbnRrKCJjcmVhdGUgbmV3IGJtYXAgbm9kZS4uLlxuIik7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiaGZzOiBjcmVhdGUgbmV3IGJtYXAgbm9kZS4uLlxuIik7CiAJCQluZXh0X25vZGUgPSBoZnNfYm1hcF9uZXdfYm1hcChub2RlLCBpZHgpOwogCQl9IGVsc2UKIAkJCW5leHRfbm9kZSA9IGhmc19ibm9kZV9maW5kKHRyZWUsIG5pZHgpOwpAQCAtMjg0LDcgKzI4NSw3IEBACiAJCWhmc19ibm9kZV9wdXQobm9kZSk7CiAJCWlmICghaSkgewogCQkJLyogcGFuaWMgKi87Ci0JCQlwcmludGsoIkhGUzogdW5hYmxlIHRvIGZyZWUgYm5vZGUgJXUuIGJtYXAgbm90IGZvdW5kIVxuIiwgbm9kZS0+dGhpcyk7CisJCQlwcmludGsoS0VSTl9DUklUICJoZnM6IHVuYWJsZSB0byBmcmVlIGJub2RlICV1LiBibWFwIG5vdCBmb3VuZCFcbiIsIG5vZGUtPnRoaXMpOwogCQkJcmV0dXJuOwogCQl9CiAJCW5vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCBpKTsKQEAgLTI5Miw3ICsyOTMsNyBAQAogCQkJcmV0dXJuOwogCQlpZiAobm9kZS0+dHlwZSAhPSBIRlNfTk9ERV9NQVApIHsKIAkJCS8qIHBhbmljICovOwotCQkJcHJpbnRrKCJIRlM6IGludmFsaWQgYm1hcCBmb3VuZCEgKCV1LCVkKVxuIiwgbm9kZS0+dGhpcywgbm9kZS0+dHlwZSk7CisJCQlwcmludGsoS0VSTl9DUklUICJoZnM6IGludmFsaWQgYm1hcCBmb3VuZCEgKCV1LCVkKVxuIiwgbm9kZS0+dGhpcywgbm9kZS0+dHlwZSk7CiAJCQloZnNfYm5vZGVfcHV0KG5vZGUpOwogCQkJcmV0dXJuOwogCQl9CkBAIC0zMDUsNyArMzA2LDcgQEAKIAltID0gMSA8PCAofm5pZHggJiA3KTsKIAlieXRlID0gZGF0YVtvZmZdOwogCWlmICghKGJ5dGUgJiBtKSkgewotCQlwcmludGsoIkhGUzogdHJ5aW5nIHRvIGZyZWUgZnJlZSBibm9kZSAldSglZClcbiIsIG5vZGUtPnRoaXMsIG5vZGUtPnR5cGUpOworCQlwcmludGsoS0VSTl9DUklUICJoZnM6IHRyeWluZyB0byBmcmVlIGZyZWUgYm5vZGUgJXUoJWQpXG4iLCBub2RlLT50aGlzLCBub2RlLT50eXBlKTsKIAkJa3VubWFwKHBhZ2UpOwogCQloZnNfYm5vZGVfcHV0KG5vZGUpOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL2NhdGFsb2cuYyBiL2ZzL2hmc3BsdXMvY2F0YWxvZy5jCmluZGV4IDk0NzEyNzkuLmYyZDdjNDkgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvY2F0YWxvZy5jCisrKyBiL2ZzL2hmc3BsdXMvY2F0YWxvZy5jCkBAIC0xMyw3ICsxMyw4IEBACiAjaW5jbHVkZSAiaGZzcGx1c19mcy5oIgogI2luY2x1ZGUgImhmc3BsdXNfcmF3LmgiCiAKLWludCBoZnNwbHVzX2NhdF9jbXBfa2V5KGhmc3BsdXNfYnRyZWVfa2V5ICprMSwgaGZzcGx1c19idHJlZV9rZXkgKmsyKQoraW50IGhmc3BsdXNfY2F0X2Nhc2VfY21wX2tleShjb25zdCBoZnNwbHVzX2J0cmVlX2tleSAqazEsCisJCQkgICAgIGNvbnN0IGhmc3BsdXNfYnRyZWVfa2V5ICprMikKIHsKIAlfX2JlMzIgazFwLCBrMnA7CiAKQEAgLTIyLDcgKzIzLDIwIEBACiAJaWYgKGsxcCAhPSBrMnApCiAJCXJldHVybiBiZTMyX3RvX2NwdShrMXApIDwgYmUzMl90b19jcHUoazJwKSA/IC0xIDogMTsKIAotCXJldHVybiBoZnNwbHVzX3VuaXN0cmNtcCgmazEtPmNhdC5uYW1lLCAmazItPmNhdC5uYW1lKTsKKwlyZXR1cm4gaGZzcGx1c19zdHJjYXNlY21wKCZrMS0+Y2F0Lm5hbWUsICZrMi0+Y2F0Lm5hbWUpOworfQorCitpbnQgaGZzcGx1c19jYXRfYmluX2NtcF9rZXkoY29uc3QgaGZzcGx1c19idHJlZV9rZXkgKmsxLAorCQkJICAgIGNvbnN0IGhmc3BsdXNfYnRyZWVfa2V5ICprMikKK3sKKwlfX2JlMzIgazFwLCBrMnA7CisKKwlrMXAgPSBrMS0+Y2F0LnBhcmVudDsKKwlrMnAgPSBrMi0+Y2F0LnBhcmVudDsKKwlpZiAoazFwICE9IGsycCkKKwkJcmV0dXJuIGJlMzJfdG9fY3B1KGsxcCkgPCBiZTMyX3RvX2NwdShrMnApID8gLTEgOiAxOworCisJcmV0dXJuIGhmc3BsdXNfc3RyY21wKCZrMS0+Y2F0Lm5hbWUsICZrMi0+Y2F0Lm5hbWUpOwogfQogCiB2b2lkIGhmc3BsdXNfY2F0X2J1aWxkX2tleShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBoZnNwbHVzX2J0cmVlX2tleSAqa2V5LApAQCAtODAsOCArOTQsMTEgQEAKIAkJbWVtc2V0KGZvbGRlciwgMCwgc2l6ZW9mKCpmb2xkZXIpKTsKIAkJZm9sZGVyLT50eXBlID0gY3B1X3RvX2JlMTYoSEZTUExVU19GT0xERVIpOwogCQlmb2xkZXItPmlkID0gY3B1X3RvX2JlMzIoaW5vZGUtPmlfaW5vKTsKLQkJZm9sZGVyLT5jcmVhdGVfZGF0ZSA9IGZvbGRlci0+Y29udGVudF9tb2RfZGF0ZSA9Ci0JCQlmb2xkZXItPmF0dHJpYnV0ZV9tb2RfZGF0ZSA9IGZvbGRlci0+YWNjZXNzX2RhdGUgPSBoZnNwX25vdzJtdCgpOworCQlIRlNQTFVTX0koaW5vZGUpLmNyZWF0ZV9kYXRlID0KKwkJCWZvbGRlci0+Y3JlYXRlX2RhdGUgPQorCQkJZm9sZGVyLT5jb250ZW50X21vZF9kYXRlID0KKwkJCWZvbGRlci0+YXR0cmlidXRlX21vZF9kYXRlID0KKwkJCWZvbGRlci0+YWNjZXNzX2RhdGUgPSBoZnNwX25vdzJtdCgpOwogCQloZnNwbHVzX3NldF9wZXJtcyhpbm9kZSwgJmZvbGRlci0+cGVybWlzc2lvbnMpOwogCQlpZiAoaW5vZGUgPT0gSEZTUExVU19TQihpbm9kZS0+aV9zYikuaGlkZGVuX2RpcikKIAkJCS8qIGludmlzaWJsZSBhbmQgbmFtZWxvY2tlZCAqLwpAQCAtOTUsMTggKzExMiwyNyBAQAogCQlmaWxlLT50eXBlID0gY3B1X3RvX2JlMTYoSEZTUExVU19GSUxFKTsKIAkJZmlsZS0+ZmxhZ3MgPSBjcHVfdG9fYmUxNihIRlNQTFVTX0ZJTEVfVEhSRUFEX0VYSVNUUyk7CiAJCWZpbGUtPmlkID0gY3B1X3RvX2JlMzIoY25pZCk7Ci0JCWZpbGUtPmNyZWF0ZV9kYXRlID0gZmlsZS0+Y29udGVudF9tb2RfZGF0ZSA9Ci0JCQlmaWxlLT5hdHRyaWJ1dGVfbW9kX2RhdGUgPSBmaWxlLT5hY2Nlc3NfZGF0ZSA9IGhmc3Bfbm93Mm10KCk7CisJCUhGU1BMVVNfSShpbm9kZSkuY3JlYXRlX2RhdGUgPQorCQkJZmlsZS0+Y3JlYXRlX2RhdGUgPQorCQkJZmlsZS0+Y29udGVudF9tb2RfZGF0ZSA9CisJCQlmaWxlLT5hdHRyaWJ1dGVfbW9kX2RhdGUgPQorCQkJZmlsZS0+YWNjZXNzX2RhdGUgPSBoZnNwX25vdzJtdCgpOwogCQlpZiAoY25pZCA9PSBpbm9kZS0+aV9pbm8pIHsKIAkJCWhmc3BsdXNfc2V0X3Blcm1zKGlub2RlLCAmZmlsZS0+cGVybWlzc2lvbnMpOwotCQkJZmlsZS0+dXNlcl9pbmZvLmZkVHlwZSA9IGNwdV90b19iZTMyKEhGU1BMVVNfU0IoaW5vZGUtPmlfc2IpLnR5cGUpOwotCQkJZmlsZS0+dXNlcl9pbmZvLmZkQ3JlYXRvciA9IGNwdV90b19iZTMyKEhGU1BMVVNfU0IoaW5vZGUtPmlfc2IpLmNyZWF0b3IpOworCQkJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCQlmaWxlLT51c2VyX2luZm8uZmRUeXBlID0gY3B1X3RvX2JlMzIoSEZTUF9TWU1MSU5LX1RZUEUpOworCQkJCWZpbGUtPnVzZXJfaW5mby5mZENyZWF0b3IgPSBjcHVfdG9fYmUzMihIRlNQX1NZTUxJTktfQ1JFQVRPUik7CisJCQl9IGVsc2UgeworCQkJCWZpbGUtPnVzZXJfaW5mby5mZFR5cGUgPSBjcHVfdG9fYmUzMihIRlNQTFVTX1NCKGlub2RlLT5pX3NiKS50eXBlKTsKKwkJCQlmaWxlLT51c2VyX2luZm8uZmRDcmVhdG9yID0gY3B1X3RvX2JlMzIoSEZTUExVU19TQihpbm9kZS0+aV9zYikuY3JlYXRvcik7CisJCQl9CiAJCQlpZiAoKGZpbGUtPnBlcm1pc3Npb25zLnJvb3RmbGFncyB8IGZpbGUtPnBlcm1pc3Npb25zLnVzZXJmbGFncykgJiBIRlNQTFVTX0ZMR19JTU1VVEFCTEUpCiAJCQkJZmlsZS0+ZmxhZ3MgfD0gY3B1X3RvX2JlMTYoSEZTUExVU19GSUxFX0xPQ0tFRCk7CiAJCX0gZWxzZSB7CiAJCQlmaWxlLT51c2VyX2luZm8uZmRUeXBlID0gY3B1X3RvX2JlMzIoSEZTUF9IQVJETElOS19UWVBFKTsKIAkJCWZpbGUtPnVzZXJfaW5mby5mZENyZWF0b3IgPSBjcHVfdG9fYmUzMihIRlNQX0hGU1BMVVNfQ1JFQVRPUik7CiAJCQlmaWxlLT51c2VyX2luZm8uZmRGbGFncyA9IGNwdV90b19iZTE2KDB4MTAwKTsKKwkJCWZpbGUtPmNyZWF0ZV9kYXRlID0gSEZTUExVU19JKEhGU1BMVVNfU0IoaW5vZGUtPmlfc2IpLmhpZGRlbl9kaXIpLmNyZWF0ZV9kYXRlOwogCQkJZmlsZS0+cGVybWlzc2lvbnMuZGV2ID0gY3B1X3RvX2JlMzIoSEZTUExVU19JKGlub2RlKS5kZXYpOwogCQl9CiAJCXJldHVybiBzaXplb2YoKmZpbGUpOwpAQCAtMTM5LDcgKzE2NSw3IEBACiAKIAl0eXBlID0gYmUxNl90b19jcHUodG1wLnR5cGUpOwogCWlmICh0eXBlICE9IEhGU1BMVVNfRk9MREVSX1RIUkVBRCAmJiB0eXBlICE9IEhGU1BMVVNfRklMRV9USFJFQUQpIHsKLQkJcHJpbnRrKCJIRlMrLWZzOiBGb3VuZCBiYWQgdGhyZWFkIHJlY29yZCBpbiBjYXRhbG9nXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IGZvdW5kIGJhZCB0aHJlYWQgcmVjb3JkIGluIGNhdGFsb2dcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvZGlyLmMgYi9mcy9oZnNwbHVzL2Rpci5jCmluZGV4IDUwYzhmNDRiLi4wMWE2ZmUzIDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL2Rpci5jCisrKyBiL2ZzL2hmc3BsdXMvZGlyLmMKQEAgLTY2LDI1ICs2NiwzMiBAQAogCQl9CiAJCWNuaWQgPSBiZTMyX3RvX2NwdShlbnRyeS5maWxlLmlkKTsKIAkJaWYgKGVudHJ5LmZpbGUudXNlcl9pbmZvLmZkVHlwZSA9PSBjcHVfdG9fYmUzMihIRlNQX0hBUkRMSU5LX1RZUEUpICYmCi0JCSAgICBlbnRyeS5maWxlLnVzZXJfaW5mby5mZENyZWF0b3IgPT0gY3B1X3RvX2JlMzIoSEZTUF9IRlNQTFVTX0NSRUFUT1IpKSB7CisJCSAgICBlbnRyeS5maWxlLnVzZXJfaW5mby5mZENyZWF0b3IgPT0gY3B1X3RvX2JlMzIoSEZTUF9IRlNQTFVTX0NSRUFUT1IpICYmCisJCSAgICAoZW50cnkuZmlsZS5jcmVhdGVfZGF0ZSA9PSBIRlNQTFVTX0koSEZTUExVU19TQihzYikuaGlkZGVuX2RpcikuY3JlYXRlX2RhdGUgfHwKKwkJICAgICBlbnRyeS5maWxlLmNyZWF0ZV9kYXRlID09IEhGU1BMVVNfSShzYi0+c19yb290LT5kX2lub2RlKS5jcmVhdGVfZGF0ZSkgJiYKKwkJICAgIEhGU1BMVVNfU0Ioc2IpLmhpZGRlbl9kaXIpIHsKIAkJCXN0cnVjdCBxc3RyIHN0cjsKIAkJCWNoYXIgbmFtZVszMl07CiAKIAkJCWlmIChkZW50cnktPmRfZnNkYXRhKSB7Ci0JCQkJZXJyID0gLUVOT0VOVDsKLQkJCQlpbm9kZSA9IE5VTEw7Ci0JCQkJZ290byBvdXQ7CisJCQkJLyoKKwkJCQkgKiBXZSBmb3VuZCBhIGxpbmsgcG9pbnRpbmcgdG8gYW5vdGhlciBsaW5rLAorCQkJCSAqIHNvIGlnbm9yZSBpdCBhbmQgdHJlYXQgaXQgYXMgcmVndWxhciBmaWxlLgorCQkJCSAqLworCQkJCWNuaWQgPSAodW5zaWduZWQgbG9uZylkZW50cnktPmRfZnNkYXRhOworCQkJCWxpbmtpZCA9IDA7CisJCQl9IGVsc2UgeworCQkJCWRlbnRyeS0+ZF9mc2RhdGEgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWNuaWQ7CisJCQkJbGlua2lkID0gYmUzMl90b19jcHUoZW50cnkuZmlsZS5wZXJtaXNzaW9ucy5kZXYpOworCQkJCXN0ci5sZW4gPSBzcHJpbnRmKG5hbWUsICJpTm9kZSVkIiwgbGlua2lkKTsKKwkJCQlzdHIubmFtZSA9IG5hbWU7CisJCQkJaGZzcGx1c19jYXRfYnVpbGRfa2V5KHNiLCBmZC5zZWFyY2hfa2V5LCBIRlNQTFVTX1NCKHNiKS5oaWRkZW5fZGlyLT5pX2lubywgJnN0cik7CisJCQkJZ290byBhZ2FpbjsKIAkJCX0KLQkJCWRlbnRyeS0+ZF9mc2RhdGEgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWNuaWQ7Ci0JCQlsaW5raWQgPSBiZTMyX3RvX2NwdShlbnRyeS5maWxlLnBlcm1pc3Npb25zLmRldik7Ci0JCQlzdHIubGVuID0gc3ByaW50ZihuYW1lLCAiaU5vZGUlZCIsIGxpbmtpZCk7Ci0JCQlzdHIubmFtZSA9IG5hbWU7Ci0JCQloZnNwbHVzX2NhdF9idWlsZF9rZXkoc2IsIGZkLnNlYXJjaF9rZXksIEhGU1BMVVNfU0Ioc2IpLmhpZGRlbl9kaXItPmlfaW5vLCAmc3RyKTsKLQkJCWdvdG8gYWdhaW47CiAJCX0gZWxzZSBpZiAoIWRlbnRyeS0+ZF9mc2RhdGEpCiAJCQlkZW50cnktPmRfZnNkYXRhID0gKHZvaWQgKikodW5zaWduZWQgbG9uZyljbmlkOwogCX0gZWxzZSB7Ci0JCXByaW50aygiSEZTKy1mczogSWxsZWdhbCBjYXRhbG9nIGVudHJ5IHR5cGUgaW4gbG9va3VwXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IGludmFsaWQgY2F0YWxvZyBlbnRyeSB0eXBlIGluIGxvb2t1cFxuIik7CiAJCWVyciA9IC1FSU87CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC0xMzIsMTIgKzEzOSwxMiBAQAogCWNhc2UgMToKIAkJaGZzX2Jub2RlX3JlYWQoZmQuYm5vZGUsICZlbnRyeSwgZmQuZW50cnlvZmZzZXQsIGZkLmVudHJ5bGVuZ3RoKTsKIAkJaWYgKGJlMTZfdG9fY3B1KGVudHJ5LnR5cGUpICE9IEhGU1BMVVNfRk9MREVSX1RIUkVBRCkgewotCQkJcHJpbnRrKCJIRlMrLWZzOiBiYWQgY2F0YWxvZyBmb2xkZXIgdGhyZWFkXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiaGZzOiBiYWQgY2F0YWxvZyBmb2xkZXIgdGhyZWFkXG4iKTsKIAkJCWVyciA9IC1FSU87CiAJCQlnb3RvIG91dDsKIAkJfQogCQlpZiAoZmQuZW50cnlsZW5ndGggPCBIRlNQTFVTX01JTl9USFJFQURfU1opIHsKLQkJCXByaW50aygiSEZTKy1mczogdHJ1bmNhdGVkIGNhdGFsb2cgdGhyZWFkXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiaGZzOiB0cnVuY2F0ZWQgY2F0YWxvZyB0aHJlYWRcbiIpOwogCQkJZXJyID0gLUVJTzsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0xNTYsNyArMTYzLDcgQEAKIAogCWZvciAoOzspIHsKIAkJaWYgKGJlMzJfdG9fY3B1KGZkLmtleS0+Y2F0LnBhcmVudCkgIT0gaW5vZGUtPmlfaW5vKSB7Ci0JCQlwcmludGsoIkhGUystZnM6IHdhbGtlZCBwYXN0IGVuZCBvZiBkaXJcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IHdhbGtlZCBwYXN0IGVuZCBvZiBkaXJcbiIpOwogCQkJZXJyID0gLUVJTzsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0xNjgsNyArMTc1LDcgQEAKIAkJCWdvdG8gb3V0OwogCQlpZiAodHlwZSA9PSBIRlNQTFVTX0ZPTERFUikgewogCQkJaWYgKGZkLmVudHJ5bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2NhdF9mb2xkZXIpKSB7Ci0JCQkJcHJpbnRrKCJIRlMrLWZzOiBzbWFsbCBkaXIgZW50cnlcbiIpOworCQkJCXByaW50ayhLRVJOX0VSUiAiaGZzOiBzbWFsbCBkaXIgZW50cnlcbiIpOwogCQkJCWVyciA9IC1FSU87CiAJCQkJZ290byBvdXQ7CiAJCQl9CkBAIC0xODAsNyArMTg3LDcgQEAKIAkJCQlicmVhazsKIAkJfSBlbHNlIGlmICh0eXBlID09IEhGU1BMVVNfRklMRSkgewogCQkJaWYgKGZkLmVudHJ5bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2NhdF9maWxlKSkgewotCQkJCXByaW50aygiSEZTKy1mczogc21hbGwgZmlsZSBlbnRyeVxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IHNtYWxsIGZpbGUgZW50cnlcbiIpOwogCQkJCWVyciA9IC1FSU87CiAJCQkJZ290byBvdXQ7CiAJCQl9CkBAIC0xODgsNyArMTk1LDcgQEAKIAkJCQkgICAgYmUzMl90b19jcHUoZW50cnkuZmlsZS5pZCksIERUX1JFRykpCiAJCQkJYnJlYWs7CiAJCX0gZWxzZSB7Ci0JCQlwcmludGsoIkhGUystZnM6IGJhZCBjYXRhbG9nIGVudHJ5IHR5cGVcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IGJhZCBjYXRhbG9nIGVudHJ5IHR5cGVcbiIpOwogCQkJZXJyID0gLUVJTzsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0zMzAsNyArMzM3LDggQEAKIAlpZiAocmVzKQogCQlyZXR1cm4gcmVzOwogCi0JaW5vZGUtPmlfbmxpbmstLTsKKwlpZiAoaW5vZGUtPmlfbmxpbmsgPiAwKQorCQlpbm9kZS0+aV9ubGluay0tOwogCWhmc3BsdXNfZGVsZXRlX2lub2RlKGlub2RlKTsKIAlpZiAoaW5vZGUtPmlfaW5vICE9IGNuaWQgJiYgIWlub2RlLT5pX25saW5rKSB7CiAJCWlmICghYXRvbWljX3JlYWQoJkhGU1BMVVNfSShpbm9kZSkub3BlbmNudCkpIHsKQEAgLTMzOSw3ICszNDcsOCBAQAogCQkJCWhmc3BsdXNfZGVsZXRlX2lub2RlKGlub2RlKTsKIAkJfSBlbHNlCiAJCQlpbm9kZS0+aV9mbGFncyB8PSBTX0RFQUQ7Ci0JfQorCX0gZWxzZQorCQlpbm9kZS0+aV9ubGluayA9IDA7CiAJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwogCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL2V4dGVudHMuYyBiL2ZzL2hmc3BsdXMvZXh0ZW50cy5jCmluZGV4IGUzZmY1NmEuLjFhNzQ4MDAgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvZXh0ZW50cy5jCisrKyBiL2ZzL2hmc3BsdXMvZXh0ZW50cy5jCkBAIC0xNiw3ICsxNiw4IEBACiAjaW5jbHVkZSAiaGZzcGx1c19yYXcuaCIKIAogLyogQ29tcGFyZSB0d28gZXh0ZW50cyBrZXlzLCByZXR1cm5zIDAgb24gc2FtZSwgcG9zL25lZyBmb3IgZGlmZmVyZW5jZSAqLwotaW50IGhmc3BsdXNfZXh0X2NtcF9rZXkoaGZzcGx1c19idHJlZV9rZXkgKmsxLCBoZnNwbHVzX2J0cmVlX2tleSAqazIpCitpbnQgaGZzcGx1c19leHRfY21wX2tleShjb25zdCBoZnNwbHVzX2J0cmVlX2tleSAqazEsCisJCQljb25zdCBoZnNwbHVzX2J0cmVlX2tleSAqazIpCiB7CiAJX19iZTMyIGsxaWQsIGsyaWQ7CiAJX19iZTMyIGsxcywgazJzOwpAQCAtMzQ5LDEwICszNTAsOSBAQAogCiAJaWYgKEhGU1BMVVNfU0Ioc2IpLmFsbG9jX2ZpbGUtPmlfc2l6ZSAqIDggPCBIRlNQTFVTX1NCKHNiKS50b3RhbF9ibG9ja3MgLSBIRlNQTFVTX1NCKHNiKS5mcmVlX2Jsb2NrcyArIDgpIHsKIAkJLy8gZXh0ZW5kIGFsbG9jIGZpbGUKLQkJcHJpbnRrKCJleHRlbmQgYWxsb2MgZmlsZSEgKCVMdSwldSwldSlcbiIsIEhGU1BMVVNfU0Ioc2IpLmFsbG9jX2ZpbGUtPmlfc2l6ZSAqIDgsCisJCXByaW50ayhLRVJOX0VSUiAiaGZzOiBleHRlbmQgYWxsb2MgZmlsZSEgKCVMdSwldSwldSlcbiIsIEhGU1BMVVNfU0Ioc2IpLmFsbG9jX2ZpbGUtPmlfc2l6ZSAqIDgsCiAJCQlIRlNQTFVTX1NCKHNiKS50b3RhbF9ibG9ja3MsIEhGU1BMVVNfU0Ioc2IpLmZyZWVfYmxvY2tzKTsKIAkJcmV0dXJuIC1FTk9TUEM7Ci0JCS8vQlVHKCk7CiAJfQogCiAJZG93bigmSEZTUExVU19JKGlub2RlKS5leHRlbnRzX2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9oZnNwbHVzX2ZzLmggYi9mcy9oZnNwbHVzL2hmc3BsdXNfZnMuaAppbmRleCBkZjE2ZmNiLi43YWUzOTM2IDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL2hmc3BsdXNfZnMuaAorKysgYi9mcy9oZnNwbHVzL2hmc3BsdXNfZnMuaApAQCAtMzYsNyArMzYsNyBAQAogI2RlZmluZSBIRlNQTFVTX1RZUEVfREFUQSAweDAwCiAjZGVmaW5lIEhGU1BMVVNfVFlQRV9SU1JDIDB4RkYKIAotdHlwZWRlZiBpbnQgKCpidHJlZV9rZXljbXApKGhmc3BsdXNfYnRyZWVfa2V5ICosIGhmc3BsdXNfYnRyZWVfa2V5ICopOwordHlwZWRlZiBpbnQgKCpidHJlZV9rZXljbXApKGNvbnN0IGhmc3BsdXNfYnRyZWVfa2V5ICosIGNvbnN0IGhmc3BsdXNfYnRyZWVfa2V5ICopOwogCiAjZGVmaW5lIE5PREVfSEFTSF9TSVpFCTI1NgogCkBAIC0xNDMsMTUgKzE0MywxMyBAQAogCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWF0b21pY190IGlub2RlX2NudDsKLQl1MzIgbGFzdF9pbm9kZV9jbnQ7Ci0KIAlzdHJ1Y3QgaGxpc3RfaGVhZCByc3JjX2lub2RlczsKIH07CiAKICNkZWZpbmUgSEZTUExVU19TQl9XUklURUJBQ0tVUAkweDAwMDEKICNkZWZpbmUgSEZTUExVU19TQl9OT0RFQ09NUE9TRQkweDAwMDIKICNkZWZpbmUgSEZTUExVU19TQl9GT1JDRQkweDAwMDQKKyNkZWZpbmUgSEZTUExVU19TQl9IRlNYCQkweDAwMDgKIAogCiBzdHJ1Y3QgaGZzcGx1c19pbm9kZV9pbmZvIHsKQEAgLTE2OCw2ICsxNjYsNyBAQAogCXN0cnVjdCBpbm9kZSAqcnNyY19pbm9kZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJX19iZTMyIGNyZWF0ZV9kYXRlOwogCS8qIERldmljZSBudW1iZXIgaW4gaGZzcGx1c19wZXJtaXNzaW9ucyBpbiBjYXRhbG9nICovCiAJdTMyIGRldjsKIAkvKiBCU0Qgc3lzdGVtIGFuZCB1c2VyIGZpbGUgZmxhZ3MgKi8KQEAgLTMwNiw3ICszMDUsOCBAQAogaW50IGhmc19icmVjX2dvdG8oc3RydWN0IGhmc19maW5kX2RhdGEgKiwgaW50KTsKIAogLyogY2F0YWxvZy5jICovCi1pbnQgaGZzcGx1c19jYXRfY21wX2tleShoZnNwbHVzX2J0cmVlX2tleSAqLCBoZnNwbHVzX2J0cmVlX2tleSAqKTsKK2ludCBoZnNwbHVzX2NhdF9jYXNlX2NtcF9rZXkoY29uc3QgaGZzcGx1c19idHJlZV9rZXkgKiwgY29uc3QgaGZzcGx1c19idHJlZV9rZXkgKik7CitpbnQgaGZzcGx1c19jYXRfYmluX2NtcF9rZXkoY29uc3QgaGZzcGx1c19idHJlZV9rZXkgKiwgY29uc3QgaGZzcGx1c19idHJlZV9rZXkgKik7CiB2b2lkIGhmc3BsdXNfY2F0X2J1aWxkX2tleShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBoZnNwbHVzX2J0cmVlX2tleSAqLCB1MzIsIHN0cnVjdCBxc3RyICopOwogaW50IGhmc3BsdXNfZmluZF9jYXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHUzMiwgc3RydWN0IGhmc19maW5kX2RhdGEgKik7CiBpbnQgaGZzcGx1c19jcmVhdGVfY2F0KHUzMiwgc3RydWN0IGlub2RlICosIHN0cnVjdCBxc3RyICosIHN0cnVjdCBpbm9kZSAqKTsKQEAgLTMxNSw3ICszMTUsNyBAQAogCQkgICAgICAgc3RydWN0IGlub2RlICosIHN0cnVjdCBxc3RyICopOwogCiAvKiBleHRlbnRzLmMgKi8KLWludCBoZnNwbHVzX2V4dF9jbXBfa2V5KGhmc3BsdXNfYnRyZWVfa2V5ICosIGhmc3BsdXNfYnRyZWVfa2V5ICopOworaW50IGhmc3BsdXNfZXh0X2NtcF9rZXkoY29uc3QgaGZzcGx1c19idHJlZV9rZXkgKiwgY29uc3QgaGZzcGx1c19idHJlZV9rZXkgKik7CiB2b2lkIGhmc3BsdXNfZXh0X3dyaXRlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKik7CiBpbnQgaGZzcGx1c19nZXRfYmxvY2soc3RydWN0IGlub2RlICosIHNlY3Rvcl90LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgaW50KTsKIGludCBoZnNwbHVzX2ZyZWVfZm9yayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdTMyLCBzdHJ1Y3QgaGZzcGx1c19mb3JrX3JhdyAqLCBpbnQpOwpAQCAtMzUzLDcgKzM1Myw4IEBACiBleHRlcm4gdTE2IGhmc3BsdXNfY29tcG9zZV90YWJsZVtdOwogCiAvKiB1bmljb2RlLmMgKi8KLWludCBoZnNwbHVzX3VuaXN0cmNtcChjb25zdCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKiwgY29uc3Qgc3RydWN0IGhmc3BsdXNfdW5pc3RyICopOworaW50IGhmc3BsdXNfc3RyY2FzZWNtcChjb25zdCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKiwgY29uc3Qgc3RydWN0IGhmc3BsdXNfdW5pc3RyICopOworaW50IGhmc3BsdXNfc3RyY21wKGNvbnN0IHN0cnVjdCBoZnNwbHVzX3VuaXN0ciAqLCBjb25zdCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKik7CiBpbnQgaGZzcGx1c191bmkyYXNjKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKiwgY2hhciAqLCBpbnQgKik7CiBpbnQgaGZzcGx1c19hc2MydW5pKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKiwgY29uc3QgY2hhciAqLCBpbnQpOwogCmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL2hmc3BsdXNfcmF3LmggYi9mcy9oZnNwbHVzL2hmc3BsdXNfcmF3LmgKaW5kZXggYjRmYmVkNi4uNDkyMDU1MyAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9oZnNwbHVzX3Jhdy5oCisrKyBiL2ZzL2hmc3BsdXMvaGZzcGx1c19yYXcuaApAQCAtMjIsOCArMjIsMTAgQEAKICNkZWZpbmUgSEZTUExVU19TRUNUT1JfU0hJRlQgICAgICAgICA5CiAjZGVmaW5lIEhGU1BMVVNfVk9MSEVBRF9TRUNUT1IgICAgICAgMgogI2RlZmluZSBIRlNQTFVTX1ZPTEhFQURfU0lHICAgICAweDQ4MmIKKyNkZWZpbmUgSEZTUExVU19WT0xIRUFEX1NJR1ggICAgMHg0ODU4CiAjZGVmaW5lIEhGU1BMVVNfU1VQRVJfTUFHSUMgICAgIDB4NDgyYgotI2RlZmluZSBIRlNQTFVTX0NVUlJFTlRfVkVSU0lPTiAgICAgIDQKKyNkZWZpbmUgSEZTUExVU19NSU5fVkVSU0lPTiAgICAgICAgICA0CisjZGVmaW5lIEhGU1BMVVNfQ1VSUkVOVF9WRVJTSU9OICAgICAgNQogCiAjZGVmaW5lIEhGU1BfV1JBUF9NQUdJQyAgICAgICAgIDB4NDI0NAogI2RlZmluZSBIRlNQX1dSQVBfQVRUUklCX1NMT0NLICAweDgwMDAKQEAgLTQxLDYgKzQzLDkgQEAKICNkZWZpbmUgSEZTUF9IQVJETElOS19UWVBFCTB4Njg2YzZlNmIJLyogJ2hsbmsnICovCiAjZGVmaW5lIEhGU1BfSEZTUExVU19DUkVBVE9SCTB4Njg2NjczMmIJLyogJ2hmcysnICovCiAKKyNkZWZpbmUgSEZTUF9TWU1MSU5LX1RZUEUJMHg3MzZjNmU2YgkvKiAnc2xuaycgKi8KKyNkZWZpbmUgSEZTUF9TWU1MSU5LX0NSRUFUT1IJMHg3MjY4NjE3MAkvKiAncmhhcCcgKi8KKwogI2RlZmluZSBIRlNQX01PVU5UX1ZFUlNJT04JMHg0ODJiNGM3OAkvKiAnSCtMeCcgKi8KIAogLyogU3RydWN0dXJlcyB1c2VkIG9uIGRpc2sgKi8KQEAgLTE2MSw3ICsxNjYsNyBAQAogCXUxNiByZXNlcnZlZDE7CiAJX19iZTMyIGNsdW1wX3NpemU7CiAJdTggYnRyZWVfdHlwZTsKLQl1OCByZXNlcnZlZDI7CisJdTgga2V5X3R5cGU7CiAJX19iZTMyIGF0dHJpYnV0ZXM7CiAJdTMyIHJlc2VydmVkM1sxNl07CiB9IF9fcGFja2VkOwpAQCAtMTg2LDYgKzE5MSwxMCBAQAogI2RlZmluZSBIRlNQTFVTX0VYQ0hfQ05JRAkJMTUJLyogRXhjaGFuZ2VGaWxlcyB0ZW1wIGlkICovCiAjZGVmaW5lIEhGU1BMVVNfRklSU1RVU0VSX0NOSUQJCTE2CS8qIGZpcnN0IGF2YWlsYWJsZSB1c2VyIGlkICovCiAKKy8qIGJ0cmVlIGtleSB0eXBlICovCisjZGVmaW5lIEhGU1BMVVNfS0VZX0NBU0VGT0xESU5HCQkweENGCS8qIGNhc2UtaW5zZW5zaXRpdmUgKi8KKyNkZWZpbmUgSEZTUExVU19LRVlfQklOQVJZCQkweEJDCS8qIGNhc2Utc2Vuc2l0aXZlICovCisKIC8qIEhGUysgY2F0YWxvZyBlbnRyeSBrZXkgKi8KIHN0cnVjdCBoZnNwbHVzX2NhdF9rZXkgewogCV9fYmUxNiBrZXlfbGVuOwpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9pbm9kZS5jIGIvZnMvaGZzcGx1cy9pbm9kZS5jCmluZGV4IGZjOTg1ODMuLjEyZWQyYjcgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvaW5vZGUuYworKysgYi9mcy9oZnNwbHVzL2lub2RlLmMKQEAgLTE4LDEzICsxOCwxMSBAQAogCiBzdGF0aWMgaW50IGhmc3BsdXNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQogewotCS8vcHJpbnRrKCJyZWFkcGFnZTogJWx1XG4iLCBwYWdlLT5pbmRleCk7CiAJcmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9wYWdlKHBhZ2UsIGhmc3BsdXNfZ2V0X2Jsb2NrKTsKIH0KIAogc3RhdGljIGludCBoZnNwbHVzX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCiB7Ci0JLy9wcmludGsoIndyaXRlcGFnZTogJWx1XG4iLCBwYWdlLT5pbmRleCk7CiAJcmV0dXJuIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZShwYWdlLCBoZnNwbHVzX2dldF9ibG9jaywgd2JjKTsKIH0KIApAQCAtOTIsNyArOTAsNiBAQAogCQl9IHdoaWxlICgtLWkgJiYgbmlkeCA8IHRyZWUtPm5vZGVfY291bnQpOwogCQlzcGluX3VubG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKIAl9Ci0JLy9wcmludGsoInJlbGVhc2VwYWdlOiAlbHUsJXggPSAlZFxuIiwgcGFnZS0+aW5kZXgsIG1hc2ssIHJlcyk7CiAJcmV0dXJuIHJlcyA/IHRyeV90b19mcmVlX2J1ZmZlcnMocGFnZSkgOiAwOwogfQogCkBAIC0xODIsMTEgKzE3OSw2IEBACiAJaWdyYWIoZGlyKTsKIAlobGlzdF9hZGRfaGVhZCgmaW5vZGUtPmlfaGFzaCwgJkhGU1BMVVNfU0Ioc2IpLnJzcmNfaW5vZGVzKTsKIAltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKLQl7Ci0Jdm9pZCBoZnNwbHVzX2lub2RlX2NoZWNrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwotCWF0b21pY19pbmMoJkhGU1BMVVNfU0Ioc2IpLmlub2RlX2NudCk7Ci0JaGZzcGx1c19pbm9kZV9jaGVjayhzYik7Ci0JfQogb3V0OgogCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwogCXJldHVybiBOVUxMOwpAQCAtMjc2LDEzICsyNjgsMTMgQEAKIAlpZiAoYXRvbWljX3JlYWQoJmZpbGUtPmZfY291bnQpICE9IDApCiAJCXJldHVybiAwOwogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZIRlNQTFVTX0koaW5vZGUpLm9wZW5jbnQpKSB7Ci0JCWRvd24oJmlub2RlLT5pX3NlbSk7CisJCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAkJaGZzcGx1c19maWxlX3RydW5jYXRlKGlub2RlKTsKIAkJaWYgKGlub2RlLT5pX2ZsYWdzICYgU19ERUFEKSB7CiAJCQloZnNwbHVzX2RlbGV0ZV9jYXQoaW5vZGUtPmlfaW5vLCBIRlNQTFVTX1NCKHNiKS5oaWRkZW5fZGlyLCBOVUxMKTsKIAkJCWhmc3BsdXNfZGVsZXRlX2lub2RlKGlub2RlKTsKIAkJfQotCQl1cCgmaW5vZGUtPmlfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMzE3LDExICszMDksNiBAQAogCWlmICghaW5vZGUpCiAJCXJldHVybiBOVUxMOwogCi0JewotCXZvaWQgaGZzcGx1c19pbm9kZV9jaGVjayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKLQlhdG9taWNfaW5jKCZIRlNQTFVTX1NCKHNiKS5pbm9kZV9jbnQpOwotCWhmc3BsdXNfaW5vZGVfY2hlY2soc2IpOwotCX0KIAlpbm9kZS0+aV9pbm8gPSBIRlNQTFVTX1NCKHNiKS5uZXh0X2NuaWQrKzsKIAlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAlpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKQEAgLTQ0NCw3ICs0MzEsOCBAQAogCQlpbm9kZS0+aV9zaXplID0gMiArIGJlMzJfdG9fY3B1KGZvbGRlci0+dmFsZW5jZSk7CiAJCWlub2RlLT5pX2F0aW1lID0gaGZzcF9tdDJ1dChmb2xkZXItPmFjY2Vzc19kYXRlKTsKIAkJaW5vZGUtPmlfbXRpbWUgPSBoZnNwX210MnV0KGZvbGRlci0+Y29udGVudF9tb2RfZGF0ZSk7Ci0JCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWU7CisJCWlub2RlLT5pX2N0aW1lID0gaGZzcF9tdDJ1dChmb2xkZXItPmF0dHJpYnV0ZV9tb2RfZGF0ZSk7CisJCUhGU1BMVVNfSShpbm9kZSkuY3JlYXRlX2RhdGUgPSBmb2xkZXItPmNyZWF0ZV9kYXRlOwogCQlIRlNQTFVTX0koaW5vZGUpLmZzX2Jsb2NrcyA9IDA7CiAJCWlub2RlLT5pX29wID0gJmhmc3BsdXNfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAJCWlub2RlLT5pX2ZvcCA9ICZoZnNwbHVzX2Rpcl9vcGVyYXRpb25zOwpAQCAtNDc1LDkgKzQ2MywxMCBAQAogCQl9CiAJCWlub2RlLT5pX2F0aW1lID0gaGZzcF9tdDJ1dChmaWxlLT5hY2Nlc3NfZGF0ZSk7CiAJCWlub2RlLT5pX210aW1lID0gaGZzcF9tdDJ1dChmaWxlLT5jb250ZW50X21vZF9kYXRlKTsKLQkJaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZTsKKwkJaW5vZGUtPmlfY3RpbWUgPSBoZnNwX210MnV0KGZpbGUtPmF0dHJpYnV0ZV9tb2RfZGF0ZSk7CisJCUhGU1BMVVNfSShpbm9kZSkuY3JlYXRlX2RhdGUgPSBmaWxlLT5jcmVhdGVfZGF0ZTsKIAl9IGVsc2UgewotCQlwcmludGsoIkhGUystZnM6IGJhZCBjYXRhbG9nIGVudHJ5IHVzZWQgdG8gY3JlYXRlIGlub2RlXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IGJhZCBjYXRhbG9nIGVudHJ5IHVzZWQgdG8gY3JlYXRlIGlub2RlXG4iKTsKIAkJcmVzID0gLUVJTzsKIAl9CiAJcmV0dXJuIHJlczsKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvaW9jdGwuYyBiL2ZzL2hmc3BsdXMvaW9jdGwuYwppbmRleCBlMDdhYTA5Li4xM2NmODQ4IDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL2lvY3RsLmMKKysrIGIvZnMvaGZzcGx1cy9pb2N0bC5jCkBAIC0xMiw2ICsxMiw3IEBACiAgKiBoZnNwbHVzIGlvY3RscwogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL29wdGlvbnMuYyBiL2ZzL2hmc3BsdXMvb3B0aW9ucy5jCmluZGV4IDkzNWRhZmIuLmRjNjRmYWMgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvb3B0aW9ucy5jCisrKyBiL2ZzL2hmc3BsdXMvb3B0aW9ucy5jCkBAIC04Myw1OCArODMsNTggQEAKIAkJc3dpdGNoICh0b2tlbikgewogCQljYXNlIG9wdF9jcmVhdG9yOgogCQkJaWYgKG1hdGNoX2ZvdXJjaGFyKCZhcmdzWzBdLCAmc2JpLT5jcmVhdG9yKSkgewotCQkJCXByaW50aygiSEZTKy1mczogY3JlYXRvciByZXF1aXJlcyBhIDQgY2hhcmFjdGVyIHZhbHVlXG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgImhmczogY3JlYXRvciByZXF1aXJlcyBhIDQgY2hhcmFjdGVyIHZhbHVlXG4iKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIG9wdF90eXBlOgogCQkJaWYgKG1hdGNoX2ZvdXJjaGFyKCZhcmdzWzBdLCAmc2JpLT50eXBlKSkgewotCQkJCXByaW50aygiSEZTKy1mczogdHlwZSByZXF1aXJlcyBhIDQgY2hhcmFjdGVyIHZhbHVlXG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgImhmczogdHlwZSByZXF1aXJlcyBhIDQgY2hhcmFjdGVyIHZhbHVlXG4iKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIG9wdF91bWFzazoKIAkJCWlmIChtYXRjaF9vY3RhbCgmYXJnc1swXSwgJnRtcCkpIHsKLQkJCQlwcmludGsoIkhGUystZnM6IHVtYXNrIHJlcXVpcmVzIGEgdmFsdWVcbiIpOworCQkJCXByaW50ayhLRVJOX0VSUiAiaGZzOiB1bWFzayByZXF1aXJlcyBhIHZhbHVlXG4iKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCXNiaS0+dW1hc2sgPSAodW1vZGVfdCl0bXA7CiAJCQlicmVhazsKIAkJY2FzZSBvcHRfdWlkOgogCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJnRtcCkpIHsKLQkJCQlwcmludGsoIkhGUystZnM6IHVpZCByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IHVpZCByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlzYmktPnVpZCA9ICh1aWRfdCl0bXA7CiAJCQlicmVhazsKIAkJY2FzZSBvcHRfZ2lkOgogCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJnRtcCkpIHsKLQkJCQlwcmludGsoIkhGUystZnM6IGdpZCByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IGdpZCByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlzYmktPmdpZCA9IChnaWRfdCl0bXA7CiAJCQlicmVhazsKIAkJY2FzZSBvcHRfcGFydDoKIAkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZzYmktPnBhcnQpKSB7Ci0JCQkJcHJpbnRrKCJIRlMrLWZzOiBwYXJ0IHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgImhmczogcGFydCByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBvcHRfc2Vzc2lvbjoKIAkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZzYmktPnNlc3Npb24pKSB7Ci0JCQkJcHJpbnRrKCJIRlMrLWZzOiBzZXNzaW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgImhmczogc2Vzc2lvbiByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBvcHRfbmxzOgogCQkJaWYgKHNiaS0+bmxzKSB7Ci0JCQkJcHJpbnRrKCJIRlMrLWZzOiB1bmFibGUgdG8gY2hhbmdlIG5scyBtYXBwaW5nXG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgImhmczogdW5hYmxlIHRvIGNoYW5nZSBubHMgbWFwcGluZ1xuIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlwID0gbWF0Y2hfc3RyZHVwKCZhcmdzWzBdKTsKIAkJCXNiaS0+bmxzID0gbG9hZF9ubHMocCk7CiAJCQlpZiAoIXNiaS0+bmxzKSB7Ci0JCQkJcHJpbnRrKCJIRlMrLWZzOiB1bmFibGUgdG8gbG9hZCBubHMgbWFwcGluZyBcIiVzXCJcbiIsIHApOworCQkJCXByaW50ayhLRVJOX0VSUiAiaGZzOiB1bmFibGUgdG8gbG9hZCBubHMgbWFwcGluZyBcIiVzXCJcbiIsIHApOwogCQkJCWtmcmVlKHApOwogCQkJCXJldHVybiAwOwogCQkJfQpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9zdXBlci5jIGIvZnMvaGZzcGx1cy9zdXBlci5jCmluZGV4IDZkYWFmN2MuLjc4NDNmNzkgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvc3VwZXIuYworKysgYi9mcy9oZnNwbHVzL3N1cGVyLmMKQEAgLTIyLDI5ICsyMiwxMiBAQAogCiAjaW5jbHVkZSAiaGZzcGx1c19mcy5oIgogCi12b2lkIGhmc3BsdXNfaW5vZGVfY2hlY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKLXsKLSNpZiAwCi0JdTMyIGNudCA9IGF0b21pY19yZWFkKCZIRlNQTFVTX1NCKHNiKS5pbm9kZV9jbnQpOwotCXUzMiBsYXN0X2NudCA9IEhGU1BMVVNfU0Ioc2IpLmxhc3RfaW5vZGVfY250OwotCi0JaWYgKGNudCA8PSAobGFzdF9jbnQgLyAyKSB8fAotCSAgICBjbnQgPj0gKGxhc3RfY250ICogMikpIHsKLQkJSEZTUExVU19TQihzYikubGFzdF9pbm9kZV9jbnQgPSBjbnQ7Ci0JCXByaW50aygiaW5vZGVfY2hlY2s6ICV1LCV1LCV1XG4iLCBjbnQsIGxhc3RfY250LAotCQkJSEZTUExVU19TQihzYikuY2F0X3RyZWUgPyBIRlNQTFVTX1NCKHNiKS5jYXRfdHJlZS0+bm9kZV9oYXNoX2NudCA6IDApOwotCX0KLSNlbmRpZgotfQotCiBzdGF0aWMgdm9pZCBoZnNwbHVzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSBmZDsKIAlzdHJ1Y3QgaGZzcGx1c192aCAqdmhkcjsKIAlpbnQgZXJyOwogCi0JYXRvbWljX2luYygmSEZTUExVU19TQihpbm9kZS0+aV9zYikuaW5vZGVfY250KTsKLQloZnNwbHVzX2lub2RlX2NoZWNrKGlub2RlLT5pX3NiKTsKIAlJTklUX0xJU1RfSEVBRCgmSEZTUExVU19JKGlub2RlKS5vcGVuX2Rpcl9saXN0KTsKIAlpbml0X01VVEVYKCZIRlNQTFVTX0koaW5vZGUpLmV4dGVudHNfbG9jayk7CiAJSEZTUExVU19JKGlub2RlKS5mbGFncyA9IDA7CkBAIC0xNTUsMTIgKzEzOCwxMCBAQAogc3RhdGljIHZvaWQgaGZzcGx1c19jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWRwcmludChEQkdfSU5PREUsICJoZnNwbHVzX2NsZWFyX2lub2RlOiAlbHVcbiIsIGlub2RlLT5pX2lubyk7Ci0JYXRvbWljX2RlYygmSEZTUExVU19TQihpbm9kZS0+aV9zYikuaW5vZGVfY250KTsKIAlpZiAoSEZTUExVU19JU19SU1JDKGlub2RlKSkgewogCQlIRlNQTFVTX0koSEZTUExVU19JKGlub2RlKS5yc3JjX2lub2RlKS5yc3JjX2lub2RlID0gTlVMTDsKIAkJaXB1dChIRlNQTFVTX0koaW5vZGUpLnJzcmNfaW5vZGUpOwogCX0KLQloZnNwbHVzX2lub2RlX2NoZWNrKGlub2RlLT5pX3NiKTsKIH0KIAogc3RhdGljIHZvaWQgaGZzcGx1c193cml0ZV9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQpAQCAtMTg4LDcgKzE2OSw3IEBACiAJCQlibG9jayA9IEhGU1BMVVNfU0Ioc2IpLmJsb2Nrb2Zmc2V0OwogCQkJYmxvY2sgKz0gKEhGU1BMVVNfU0Ioc2IpLnNlY3RfY291bnQgLSAyKSA+PiAoc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KTsKIAkJCW9mZnNldCA9ICgoSEZTUExVU19TQihzYikuc2VjdF9jb3VudCAtIDIpIDw8IDkpICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpOwotCQkJcHJpbnRrKCJiYWNrdXA6ICV1LCV1LCV1LCV1XG4iLCBIRlNQTFVTX1NCKHNiKS5ibG9ja29mZnNldCwKKwkJCXByaW50ayhLRVJOX0RFQlVHICJoZnM6IGJhY2t1cDogJXUsJXUsJXUsJXVcbiIsIEhGU1BMVVNfU0Ioc2IpLmJsb2Nrb2Zmc2V0LAogCQkJCUhGU1BMVVNfU0Ioc2IpLnNlY3RfY291bnQsIGJsb2NrLCBvZmZzZXQpOwogCQkJYmggPSBzYl9icmVhZChzYiwgYmxvY2spOwogCQkJaWYgKGJoKSB7CkBAIC0xOTgsNyArMTc5LDcgQEAKIAkJCQkJbWFya19idWZmZXJfZGlydHkoYmgpOwogCQkJCQlicmVsc2UoYmgpOwogCQkJCX0gZWxzZQotCQkJCQlwcmludGsoImJhY2t1cCBub3QgZm91bmQhXG4iKTsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGZzOiBiYWNrdXAgbm90IGZvdW5kIVxuIik7CiAJCQl9CiAJCX0KIAkJSEZTUExVU19TQihzYikuZmxhZ3MgJj0gfkhGU1BMVVNfU0JfV1JJVEVCQUNLVVA7CkBAIC0yNTksMTggKzI0MCwxOCBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJaWYgKCEodmhkci0+YXR0cmlidXRlcyAmIGNwdV90b19iZTMyKEhGU1BMVVNfVk9MX1VOTU5UKSkpIHsKLQkJCXByaW50aygiSEZTKy1mcyB3YXJuaW5nOiBGaWxlc3lzdGVtIHdhcyBub3QgY2xlYW5seSB1bm1vdW50ZWQsICIKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImhmczogZmlsZXN5c3RlbSB3YXMgbm90IGNsZWFubHkgdW5tb3VudGVkLCAiCiAJCQkgICAgICAgInJ1bm5pbmcgZnNjay5oZnNwbHVzIGlzIHJlY29tbWVuZGVkLiAgbGVhdmluZyByZWFkLW9ubHkuXG4iKTsKIAkJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKIAkJCSpmbGFncyB8PSBNU19SRE9OTFk7CiAJCX0gZWxzZSBpZiAoc2JpLmZsYWdzICYgSEZTUExVU19TQl9GT1JDRSkgewogCQkJLyogbm90aGluZyAqLwogCQl9IGVsc2UgaWYgKHZoZHItPmF0dHJpYnV0ZXMgJiBjcHVfdG9fYmUzMihIRlNQTFVTX1ZPTF9TT0ZUTE9DSykpIHsKLQkJCXByaW50aygiSEZTKy1mczogRmlsZXN5c3RlbSBpcyBtYXJrZWQgbG9ja2VkLCBsZWF2aW5nIHJlYWQtb25seS5cbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGZzOiBmaWxlc3lzdGVtIGlzIG1hcmtlZCBsb2NrZWQsIGxlYXZpbmcgcmVhZC1vbmx5LlxuIik7CiAJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CiAJCQkqZmxhZ3MgfD0gTVNfUkRPTkxZOwogCQl9IGVsc2UgaWYgKHZoZHItPmF0dHJpYnV0ZXMgJiBjcHVfdG9fYmUzMihIRlNQTFVTX1ZPTF9KT1VSTkFMRUQpKSB7Ci0JCQlwcmludGsoIkhGUystZnM6IEZpbGVzeXN0ZW0gaXMgbWFya2VkIGpvdXJuYWxlZCwgbGVhdmluZyByZWFkLW9ubHkuXG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImhmczogZmlsZXN5c3RlbSBpcyBtYXJrZWQgam91cm5hbGVkLCBsZWF2aW5nIHJlYWQtb25seS5cbiIpOwogCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOwogCQkJKmZsYWdzIHw9IE1TX1JET05MWTsKIAkJfQpAQCAtMzExLDggKzI5Miw3IEBACiAJSU5JVF9ITElTVF9IRUFEKCZzYmktPnJzcmNfaW5vZGVzKTsKIAloZnNwbHVzX2ZpbGxfZGVmYXVsdHMoc2JpKTsKIAlpZiAoIWhmc3BsdXNfcGFyc2Vfb3B0aW9ucyhkYXRhLCBzYmkpKSB7Ci0JCWlmICghc2lsZW50KQotCQkJcHJpbnRrKCJIRlMrLWZzOiB1bmFibGUgdG8gcGFyc2UgbW91bnQgb3B0aW9uc1xuIik7CisJCXByaW50ayhLRVJOX0VSUiAiaGZzOiB1bmFibGUgdG8gcGFyc2UgbW91bnQgb3B0aW9uc1xuIik7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gY2xlYW51cDsKIAl9CkBAIC0zMjEsNyArMzAxLDcgQEAKIAlubHMgPSBzYmktPm5sczsKIAlzYmktPm5scyA9IGxvYWRfbmxzKCJ1dGY4Iik7CiAJaWYgKCFzYmktPm5scykgewotCQlwcmludGsoIkhGUys6IHVuYWJsZSB0byBsb2FkIG5scyBmb3IgdXRmOFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiaGZzOiB1bmFibGUgdG8gbG9hZCBubHMgZm9yIHV0ZjhcbiIpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGNsZWFudXA7CiAJfQpAQCAtMzI5LDE3ICszMDksMTcgQEAKIAkvKiBHcmFiIHRoZSB2b2x1bWUgaGVhZGVyICovCiAJaWYgKGhmc3BsdXNfcmVhZF93cmFwcGVyKHNiKSkgewogCQlpZiAoIXNpbGVudCkKLQkJCXByaW50aygiSEZTKy1mczogdW5hYmxlIHRvIGZpbmQgSEZTKyBzdXBlcmJsb2NrXG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImhmczogdW5hYmxlIHRvIGZpbmQgSEZTKyBzdXBlcmJsb2NrXG4iKTsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBjbGVhbnVwOwogCX0KIAl2aGRyID0gSEZTUExVU19TQihzYikuc192aGRyOwogCiAJLyogQ29weSBwYXJ0cyBvZiB0aGUgdm9sdW1lIGhlYWRlciBpbnRvIHRoZSBzdXBlcmJsb2NrICovCi0Jc2ItPnNfbWFnaWMgPSBiZTE2X3RvX2NwdSh2aGRyLT5zaWduYXR1cmUpOwotCWlmIChiZTE2X3RvX2NwdSh2aGRyLT52ZXJzaW9uKSAhPSBIRlNQTFVTX0NVUlJFTlRfVkVSU0lPTikgewotCQlpZiAoIXNpbGVudCkKLQkJCXByaW50aygiSEZTKy1mczogd3JvbmcgZmlsZXN5c3RlbSB2ZXJzaW9uXG4iKTsKKwlzYi0+c19tYWdpYyA9IEhGU1BMVVNfVk9MSEVBRF9TSUc7CisJaWYgKGJlMTZfdG9fY3B1KHZoZHItPnZlcnNpb24pIDwgSEZTUExVU19NSU5fVkVSU0lPTiB8fAorCSAgICBiZTE2X3RvX2NwdSh2aGRyLT52ZXJzaW9uKSA+IEhGU1BMVVNfQ1VSUkVOVF9WRVJTSU9OKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGZzOiB3cm9uZyBmaWxlc3lzdGVtIHZlcnNpb25cbiIpOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCUhGU1BMVVNfU0Ioc2IpLnRvdGFsX2Jsb2NrcyA9IGJlMzJfdG9fY3B1KHZoZHItPnRvdGFsX2Jsb2Nrcyk7CkBAIC0zNjAsMjAgKzM0MCwxNyBAQAogCXNiLT5zX21heGJ5dGVzID0gTUFYX0xGU19GSUxFU0laRTsKIAogCWlmICghKHZoZHItPmF0dHJpYnV0ZXMgJiBjcHVfdG9fYmUzMihIRlNQTFVTX1ZPTF9VTk1OVCkpKSB7Ci0JCWlmICghc2lsZW50KQotCQkJcHJpbnRrKCJIRlMrLWZzIHdhcm5pbmc6IEZpbGVzeXN0ZW0gd2FzIG5vdCBjbGVhbmx5IHVubW91bnRlZCwgIgotCQkJICAgICAgICJydW5uaW5nIGZzY2suaGZzcGx1cyBpcyByZWNvbW1lbmRlZC4gIG1vdW50aW5nIHJlYWQtb25seS5cbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZnM6IEZpbGVzeXN0ZW0gd2FzIG5vdCBjbGVhbmx5IHVubW91bnRlZCwgIgorCQkgICAgICAgInJ1bm5pbmcgZnNjay5oZnNwbHVzIGlzIHJlY29tbWVuZGVkLiAgbW91bnRpbmcgcmVhZC1vbmx5LlxuIik7CiAJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKIAl9IGVsc2UgaWYgKHNiaS0+ZmxhZ3MgJiBIRlNQTFVTX1NCX0ZPUkNFKSB7CiAJCS8qIG5vdGhpbmcgKi8KIAl9IGVsc2UgaWYgKHZoZHItPmF0dHJpYnV0ZXMgJiBjcHVfdG9fYmUzMihIRlNQTFVTX1ZPTF9TT0ZUTE9DSykpIHsKLQkJaWYgKCFzaWxlbnQpCi0JCQlwcmludGsoIkhGUystZnM6IEZpbGVzeXN0ZW0gaXMgbWFya2VkIGxvY2tlZCwgbW91bnRpbmcgcmVhZC1vbmx5LlxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImhmczogRmlsZXN5c3RlbSBpcyBtYXJrZWQgbG9ja2VkLCBtb3VudGluZyByZWFkLW9ubHkuXG4iKTsKIAkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOwogCX0gZWxzZSBpZiAodmhkci0+YXR0cmlidXRlcyAmIGNwdV90b19iZTMyKEhGU1BMVVNfVk9MX0pPVVJOQUxFRCkpIHsKLQkJaWYgKCFzaWxlbnQpCi0JCQlwcmludGsoIkhGUystZnM6IHdyaXRlIGFjY2VzcyB0byBhIGpvdW5hbGVkIGZpbGVzeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCwgIgotCQkJICAgICAgICJ1c2UgdGhlIGZvcmNlIG9wdGlvbiBhdCB5b3VyIG93biByaXNrLCBtb3VudGluZyByZWFkLW9ubHkuXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGZzOiB3cml0ZSBhY2Nlc3MgdG8gYSBqb3VuYWxlZCBmaWxlc3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQsICIKKwkJICAgICAgICJ1c2UgdGhlIGZvcmNlIG9wdGlvbiBhdCB5b3VyIG93biByaXNrLCBtb3VudGluZyByZWFkLW9ubHkuXG4iKTsKIAkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOwogCX0KIAlzYmktPmZsYWdzICY9IH5IRlNQTFVTX1NCX0ZPUkNFOwpAQCAtMzgxLDIxICszNTgsMTggQEAKIAkvKiBMb2FkIG1ldGFkYXRhIG9iamVjdHMgKEIqVHJlZXMpICovCiAJSEZTUExVU19TQihzYikuZXh0X3RyZWUgPSBoZnNfYnRyZWVfb3BlbihzYiwgSEZTUExVU19FWFRfQ05JRCk7CiAJaWYgKCFIRlNQTFVTX1NCKHNiKS5leHRfdHJlZSkgewotCQlpZiAoIXNpbGVudCkKLQkJCXByaW50aygiSEZTKy1mczogZmFpbGVkIHRvIGxvYWQgZXh0ZW50cyBmaWxlXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IGZhaWxlZCB0byBsb2FkIGV4dGVudHMgZmlsZVxuIik7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAJSEZTUExVU19TQihzYikuY2F0X3RyZWUgPSBoZnNfYnRyZWVfb3BlbihzYiwgSEZTUExVU19DQVRfQ05JRCk7CiAJaWYgKCFIRlNQTFVTX1NCKHNiKS5jYXRfdHJlZSkgewotCQlpZiAoIXNpbGVudCkKLQkJCXByaW50aygiSEZTKy1mczogZmFpbGVkIHRvIGxvYWQgY2F0YWxvZyBmaWxlXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IGZhaWxlZCB0byBsb2FkIGNhdGFsb2cgZmlsZVxuIik7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAlIRlNQTFVTX1NCKHNiKS5hbGxvY19maWxlID0gaWdldChzYiwgSEZTUExVU19BTExPQ19DTklEKTsKIAlpZiAoIUhGU1BMVVNfU0Ioc2IpLmFsbG9jX2ZpbGUpIHsKLQkJaWYgKCFzaWxlbnQpCi0JCQlwcmludGsoIkhGUystZnM6IGZhaWxlZCB0byBsb2FkIGFsbG9jYXRpb24gZmlsZVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiaGZzOiBmYWlsZWQgdG8gbG9hZCBhbGxvY2F0aW9uIGZpbGVcbiIpOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCkBAIC00MDMsOCArMzc3LDcgQEAKIAlyb290ID0gaWdldChzYiwgSEZTUExVU19ST09UX0NOSUQpOwogCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CiAJaWYgKCFzYi0+c19yb290KSB7Ci0JCWlmICghc2lsZW50KQotCQkJcHJpbnRrKCJIRlMrLWZzOiBmYWlsZWQgdG8gbG9hZCByb290IGRpcmVjdG9yeVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiaGZzOiBmYWlsZWQgdG8gbG9hZCByb290IGRpcmVjdG9yeVxuIik7CiAJCWlwdXQocm9vdCk7CiAJCWdvdG8gY2xlYW51cDsKIAl9CkBAIC00MzgsNyArNDExLDcgQEAKIAlzeW5jX2RpcnR5X2J1ZmZlcihIRlNQTFVTX1NCKHNiKS5zX3ZoYmgpOwogCiAJaWYgKCFIRlNQTFVTX1NCKHNiKS5oaWRkZW5fZGlyKSB7Ci0JCXByaW50aygiSEZTKzogY3JlYXRlIGhpZGRlbiBkaXIuLi5cbiIpOworCQlwcmludGsoS0VSTl9ERUJVRyAiaGZzOiBjcmVhdGUgaGlkZGVuIGRpci4uLlxuIik7CiAJCUhGU1BMVVNfU0Ioc2IpLmhpZGRlbl9kaXIgPSBoZnNwbHVzX25ld19pbm9kZShzYiwgU19JRkRJUik7CiAJCWhmc3BsdXNfY3JlYXRlX2NhdChIRlNQTFVTX1NCKHNiKS5oaWRkZW5fZGlyLT5pX2lubywgc2ItPnNfcm9vdC0+ZF9pbm9kZSwKIAkJCQkgICAmc3RyLCBIRlNQTFVTX1NCKHNiKS5oaWRkZW5fZGlyKTsKQEAgLTUxOCw3ICs0OTEsNyBAQAogewogCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmaGZzcGx1c19mc190eXBlKTsKIAlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGhmc3BsdXNfaW5vZGVfY2FjaGVwKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaGZzcGx1c19pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworCQlwcmludGsoS0VSTl9FUlIgImhmc3BsdXNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdF9oZnNwbHVzX2ZzKQpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy91bmljb2RlLmMgYi9mcy9oZnNwbHVzL3VuaWNvZGUuYwppbmRleCAwNjBjNjkwLi42ODljOGJkIDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL3VuaWNvZGUuYworKysgYi9mcy9oZnNwbHVzL3VuaWNvZGUuYwpAQCAtMjgsNyArMjgsOCBAQAogfQogCiAvKiBDb21wYXJlIHVuaWNvZGUgc3RyaW5ncywgcmV0dXJuIHZhbHVlcyBsaWtlIG5vcm1hbCBzdHJjbXAgKi8KLWludCBoZnNwbHVzX3VuaXN0cmNtcChjb25zdCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKnMxLCBjb25zdCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKnMyKQoraW50IGhmc3BsdXNfc3RyY2FzZWNtcChjb25zdCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKnMxLAorCQkgICAgICAgY29uc3Qgc3RydWN0IGhmc3BsdXNfdW5pc3RyICpzMikKIHsKIAl1MTYgbGVuMSwgbGVuMiwgYzEsIGMyOwogCWNvbnN0IGhmc3BsdXNfdW5pY2hyICpwMSwgKnAyOwpAQCAtNTksNiArNjAsMzMgQEAKIAl9CiB9CiAKKy8qIENvbXBhcmUgbmFtZXMgYXMgYSBzZXF1ZW5jZSBvZiAxNi1iaXQgdW5zaWduZWQgaW50ZWdlcnMgKi8KK2ludCBoZnNwbHVzX3N0cmNtcChjb25zdCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKnMxLAorCQkgICBjb25zdCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKnMyKQoreworCXUxNiBsZW4xLCBsZW4yLCBjMSwgYzI7CisJY29uc3QgaGZzcGx1c191bmljaHIgKnAxLCAqcDI7CisJaW50IGxlbjsKKworCWxlbjEgPSBiZTE2X3RvX2NwdShzMS0+bGVuZ3RoKTsKKwlsZW4yID0gYmUxNl90b19jcHUoczItPmxlbmd0aCk7CisJcDEgPSBzMS0+dW5pY29kZTsKKwlwMiA9IHMyLT51bmljb2RlOworCisJZm9yIChsZW4gPSBtaW4obGVuMSwgbGVuMik7IGxlbiA+IDA7IGxlbi0tKSB7CisJCWMxID0gYmUxNl90b19jcHUoKnAxKTsKKwkJYzIgPSBiZTE2X3RvX2NwdSgqcDIpOworCQlpZiAoYzEgIT0gYzIpCisJCQlyZXR1cm4gYzEgPCBjMiA/IC0xIDogMTsKKwkJcDErKzsKKwkJcDIrKzsKKwl9CisKKwlyZXR1cm4gbGVuMSA8IGxlbjIgPyAtMSA6CisJICAgICAgIGxlbjEgPiBsZW4yID8gMSA6IDA7Cit9CisKKwogI2RlZmluZSBIYW5ndWxfU0Jhc2UJMHhhYzAwCiAjZGVmaW5lIEhhbmd1bF9MQmFzZQkweDExMDAKICNkZWZpbmUgSGFuZ3VsX1ZCYXNlCTB4MTE2MQpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy93cmFwcGVyLmMgYi9mcy9oZnNwbHVzL3dyYXBwZXIuYwppbmRleCA5NTQ1NWU4Li43MmNhYjc4IDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL3dyYXBwZXIuYworKysgYi9mcy9oZnNwbHVzL3dyYXBwZXIuYwpAQCAtMjgsOCArMjgsMTEgQEAKIHsKIAl1MzIgZXh0ZW50OwogCXUxNiBhdHRyaWI7CisJX19iZTE2IHNpZzsKIAotCWlmIChiZTE2X3RvX2NwdSgqKF9fYmUxNiAqKShidWZwdHIgKyBIRlNQX1dSQVBPRkZfRU1CRURTSUcpKSAhPSBIRlNQTFVTX1ZPTEhFQURfU0lHKQorCXNpZyA9ICooX19iZTE2ICopKGJ1ZnB0ciArIEhGU1BfV1JBUE9GRl9FTUJFRFNJRyk7CisJaWYgKHNpZyAhPSBjcHVfdG9fYmUxNihIRlNQTFVTX1ZPTEhFQURfU0lHKSAmJgorCSAgICBzaWcgIT0gY3B1X3RvX2JlMTYoSEZTUExVU19WT0xIRUFEX1NJR1gpKQogCQlyZXR1cm4gMDsKIAogCWF0dHJpYiA9IGJlMTZfdG9fY3B1KCooX19iZTE2ICopKGJ1ZnB0ciArIEhGU1BfV1JBUE9GRl9BVFRSSUIpKTsKQEAgLTcwLDcgKzczLDcgQEAKIAkJCSpzdGFydCA9IChzZWN0b3JfdCl0ZS5jZHRlX2FkZHIubGJhIDw8IDI7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQlwcmludGsoS0VSTl9FUlIgIkhGUzogSW52YWxpZCBzZXNzaW9uIG51bWJlciBvciB0eXBlIG9mIHRyYWNrXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IGludmFsaWQgc2Vzc2lvbiBudW1iZXIgb3IgdHlwZSBvZiB0cmFja1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAltc19pbmZvLmFkZHJfZm9ybWF0ID0gQ0RST01fTEJBOwpAQCAtMTE0LDYgKzExNywxMCBAQAogCQl9CiAJCWlmICh2aGRyLT5zaWduYXR1cmUgPT0gY3B1X3RvX2JlMTYoSEZTUExVU19WT0xIRUFEX1NJRykpCiAJCQlicmVhazsKKwkJaWYgKHZoZHItPnNpZ25hdHVyZSA9PSBjcHVfdG9fYmUxNihIRlNQTFVTX1ZPTEhFQURfU0lHWCkpIHsKKwkJCUhGU1BMVVNfU0Ioc2IpLmZsYWdzIHw9IEhGU1BMVVNfU0JfSEZTWDsKKwkJCWJyZWFrOworCQl9CiAJCWJyZWxzZShiaCk7CiAKIAkJLyogY2hlY2sgZm9yIGEgcGFydGl0aW9uIGJsb2NrCkBAIC0xNDMsNyArMTUwLDcgQEAKIAkJYmxvY2tzaXplID4+PSAxOwogCiAJaWYgKHNiX3NldF9ibG9ja3NpemUoc2IsIGJsb2Nrc2l6ZSkgIT0gYmxvY2tzaXplKSB7Ci0JCXByaW50aygiSEZTKzogdW5hYmxlIHRvIGJsb2Nrc2l6ZSB0byAldSFcbiIsIGJsb2Nrc2l6ZSk7CisJCXByaW50ayhLRVJOX0VSUiAiaGZzOiB1bmFibGUgdG8gc2V0IGJsb2Nrc2l6ZSB0byAldSFcbiIsIGJsb2Nrc2l6ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTU4LDcgKzE2NSw5IEBACiAJCXJldHVybiAtRUlPOwogCiAJLyogc2hvdWxkIHN0aWxsIGJlIHRoZSBzYW1lLi4uICovCi0JaWYgKGJlMTZfdG9fY3B1KHZoZHItPnNpZ25hdHVyZSkgIT0gSEZTUExVU19WT0xIRUFEX1NJRykKKwlpZiAodmhkci0+c2lnbmF0dXJlICE9IChIRlNQTFVTX1NCKHNiKS5mbGFncyAmIEhGU1BMVVNfU0JfSEZTWCA/CisJCQkJY3B1X3RvX2JlMTYoSEZTUExVU19WT0xIRUFEX1NJR1gpIDoKKwkJCQljcHVfdG9fYmUxNihIRlNQTFVTX1ZPTEhFQURfU0lHKSkpCiAJCWdvdG8gZXJyb3I7CiAJSEZTUExVU19TQihzYikuc192aGJoID0gYmg7CiAJSEZTUExVU19TQihzYikuc192aGRyID0gdmhkcjsKZGlmZiAtLWdpdCBhL2ZzL2hwZnMvZGlyLmMgYi9mcy9ocGZzL2Rpci5jCmluZGV4IDAyMTdjM2EuLjU1OTFmOTYgMTAwNjQ0Ci0tLSBhL2ZzL2hwZnMvZGlyLmMKKysrIGIvZnMvaHBmcy9kaXIuYwpAQCAtMzIsMTkgKzMyLDE5IEBACiAKIAkvKnByaW50aygiZGlyIGxzZWVrXG4iKTsqLwogCWlmIChuZXdfb2ZmID09IDAgfHwgbmV3X29mZiA9PSAxIHx8IG5ld19vZmYgPT0gMTEgfHwgbmV3X29mZiA9PSAxMiB8fCBuZXdfb2ZmID09IDEzKSBnb3RvIG9rOwotCWRvd24oJmktPmlfc2VtKTsKKwltdXRleF9sb2NrKCZpLT5pX211dGV4KTsKIAlwb3MgPSAoKGxvZmZfdCkgaHBmc19kZV9hc19kb3duX2FzX3Bvc3NpYmxlKHMsIGhwZnNfaW5vZGUtPmlfZG5vKSA8PCA0KSArIDE7CiAJd2hpbGUgKHBvcyAhPSBuZXdfb2ZmKSB7CiAJCWlmIChtYXBfcG9zX2RpcmVudChpLCAmcG9zLCAmcWJoKSkgaHBmc19icmVsc2U0KCZxYmgpOwogCQllbHNlIGdvdG8gZmFpbDsKIAkJaWYgKHBvcyA9PSAxMikgZ290byBmYWlsOwogCX0KLQl1cCgmaS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmaS0+aV9tdXRleCk7CiBvazoKIAl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIGZpbHAtPmZfcG9zID0gbmV3X29mZjsKIGZhaWw6Ci0JdXAoJmktPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmktPmlfbXV0ZXgpOwogCS8qcHJpbnRrKCJpbGxlZ2FsIGxzZWVrOiAlMDE2bGx4XG4iLCBuZXdfb2ZmKTsqLwogCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gLUVTUElQRTsKZGlmZiAtLWdpdCBhL2ZzL2hwcGZzL2hwcGZzX2tlcm4uYyBiL2ZzL2hwcGZzL2hwcGZzX2tlcm4uYwppbmRleCA1MjkzMDkxLi5hNDRkYzU4IDEwMDY0NAotLS0gYS9mcy9ocHBmcy9ocHBmc19rZXJuLmMKKysrIGIvZnMvaHBwZnMvaHBwZnNfa2Vybi5jCkBAIC0xNzEsMTIgKzE3MSwxMiBAQAogCiAJZXJyID0gLUVOT01FTTsKIAlwYXJlbnQgPSBIUFBGU19JKGlubyktPnByb2NfZGVudHJ5OwotCWRvd24oJnBhcmVudC0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJcHJvY19kZW50cnkgPSBkX2xvb2t1cChwYXJlbnQsICZkZW50cnktPmRfbmFtZSk7CiAJaWYocHJvY19kZW50cnkgPT0gTlVMTCl7CiAJCXByb2NfZGVudHJ5ID0gZF9hbGxvYyhwYXJlbnQsICZkZW50cnktPmRfbmFtZSk7CiAJCWlmKHByb2NfZGVudHJ5ID09IE5VTEwpewotCQkJdXAoJnBhcmVudC0+ZF9pbm9kZS0+aV9zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZwYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJbmV3ID0gKCpwYXJlbnQtPmRfaW5vZGUtPmlfb3AtPmxvb2t1cCkocGFyZW50LT5kX2lub2RlLApAQCAtMTg2LDcgKzE4Niw3IEBACiAJCQlwcm9jX2RlbnRyeSA9IG5ldzsKIAkJfQogCX0KLQl1cCgmcGFyZW50LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCiAJaWYoSVNfRVJSKHByb2NfZGVudHJ5KSkKIAkJcmV0dXJuKHByb2NfZGVudHJ5KTsKZGlmZiAtLWdpdCBhL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jIGIvZnMvaHVnZXRsYmZzL2lub2RlLmMKaW5kZXggOGM0MTMxNS4uZjU2ODEwMiAxMDA2NDQKLS0tIGEvZnMvaHVnZXRsYmZzL2lub2RlLmMKKysrIGIvZnMvaHVnZXRsYmZzL2lub2RlLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdldmVjLmg+CkBAIC0xMTgsNyArMTE5LDcgQEAKIAogCXZtYV9sZW4gPSAobG9mZl90KSh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpOwogCi0JZG93bigmaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJZmlsZV9hY2Nlc3NlZChmaWxlKTsKIAl2bWEtPnZtX2ZsYWdzIHw9IFZNX0hVR0VUTEIgfCBWTV9SRVNFUlZFRDsKIAl2bWEtPnZtX29wcyA9ICZodWdldGxiX3ZtX29wczsKQEAgLTEzMyw3ICsxMzQsNyBAQAogCWlmIChpbm9kZS0+aV9zaXplIDwgbGVuKQogCQlpbm9kZS0+aV9zaXplID0gbGVuOwogb3V0OgotCXVwKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTQwMSw3ICs0MDIsNyBAQAogCQlpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0maHVnZXRsYmZzX2JhY2tpbmdfZGV2X2luZm87CiAJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAkJaW5mbyA9IEhVR0VUTEJGU19JKGlub2RlKTsKLQkJbXBvbF9zaGFyZWRfcG9saWN5X2luaXQoJmluZm8tPnBvbGljeSk7CisJCW1wb2xfc2hhcmVkX3BvbGljeV9pbml0KCZpbmZvLT5wb2xpY3ksIE1QT0xfREVGQVVMVCwgTlVMTCk7CiAJCXN3aXRjaCAobW9kZSAmIFNfSUZNVCkgewogCQlkZWZhdWx0OgogCQkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBtb2RlLCBkZXYpOwpkaWZmIC0tZ2l0IGEvZnMvaW5vZGUuYyBiL2ZzL2lub2RlLmMKaW5kZXggZDhkMDRiZC4uMTA4MTM4ZCAxMDA2NDQKLS0tIGEvZnMvaW5vZGUuYworKysgYi9mcy9pbm9kZS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KIAogLyoKICAqIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKQEAgLTE5Miw3ICsxOTMsNyBAQAogCUlOSVRfSExJU1RfTk9ERSgmaW5vZGUtPmlfaGFzaCk7CiAJSU5JVF9MSVNUX0hFQUQoJmlub2RlLT5pX2RlbnRyeSk7CiAJSU5JVF9MSVNUX0hFQUQoJmlub2RlLT5pX2RldmljZXMpOwotCXNlbWFfaW5pdCgmaW5vZGUtPmlfc2VtLCAxKTsKKwltdXRleF9pbml0KCZpbm9kZS0+aV9tdXRleCk7CiAJaW5pdF9yd3NlbSgmaW5vZGUtPmlfYWxsb2Nfc2VtKTsKIAlJTklUX1JBRElYX1RSRUUoJmlub2RlLT5pX2RhdGEucGFnZV90cmVlLCBHRlBfQVRPTUlDKTsKIAlyd2xvY2tfaW5pdCgmaW5vZGUtPmlfZGF0YS50cmVlX2xvY2spOwpAQCAtNzcwLDcgKzc3MSw3IEBACiAgKgogICogTm90ZSwgQHRlc3QgaXMgY2FsbGVkIHdpdGggdGhlIGlub2RlX2xvY2sgaGVsZCwgc28gY2FuJ3Qgc2xlZXAuCiAgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlub2RlICppZmluZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorc3RhdGljIHN0cnVjdCBpbm9kZSAqaWZpbmQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQsIGludCAoKnRlc3QpKHN0cnVjdCBpbm9kZSAqLCB2b2lkICopLAogCQl2b2lkICpkYXRhLCBjb25zdCBpbnQgd2FpdCkKIHsKQEAgLTgwNCw3ICs4MDUsNyBAQAogICoKICAqIE90aGVyd2lzZSBOVUxMIGlzIHJldHVybmVkLgogICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpbm9kZSAqaWZpbmRfZmFzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorc3RhdGljIHN0cnVjdCBpbm9kZSAqaWZpbmRfZmFzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCwgdW5zaWduZWQgbG9uZyBpbm8pCiB7CiAJc3RydWN0IGlub2RlICppbm9kZTsKQEAgLTExNzYsMjQgKzExNzcsMzUgQEAKIEVYUE9SVF9TWU1CT0woYm1hcCk7CiAKIC8qKgotICoJdXBkYXRlX2F0aW1lCS0JdXBkYXRlIHRoZSBhY2Nlc3MgdGltZQorICoJdG91Y2hfYXRpbWUJLQl1cGRhdGUgdGhlIGFjY2VzcyB0aW1lCisgKglAbW50OiBtb3VudCB0aGUgaW5vZGUgaXMgYWNjZXNzZWQgb24KICAqCUBpbm9kZTogaW5vZGUgYWNjZXNzZWQKICAqCiAgKglVcGRhdGUgdGhlIGFjY2Vzc2VkIHRpbWUgb24gYW4gaW5vZGUgYW5kIG1hcmsgaXQgZm9yIHdyaXRlYmFjay4KICAqCVRoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseSBoYW5kbGVzIHJlYWQgb25seSBmaWxlIHN5c3RlbXMgYW5kIG1lZGlhLAogICoJYXMgd2VsbCBhcyB0aGUgIm5vYXRpbWUiIGZsYWcgYW5kIGlub2RlIHNwZWNpZmljICJub2F0aW1lIiBtYXJrZXJzLgogICovCi12b2lkIHVwZGF0ZV9hdGltZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQordm9pZCB0b3VjaF9hdGltZShzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogeworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHRpbWVzcGVjIG5vdzsKIAotCWlmIChJU19OT0FUSU1FKGlub2RlKSkKLQkJcmV0dXJuOwotCWlmIChJU19OT0RJUkFUSU1FKGlub2RlKSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKQotCQlyZXR1cm47CiAJaWYgKElTX1JET05MWShpbm9kZSkpCiAJCXJldHVybjsKIAorCWlmICgoaW5vZGUtPmlfZmxhZ3MgJiBTX05PQVRJTUUpIHx8CisJICAgIChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX05PQVRJTUUpIHx8CisJICAgICgoaW5vZGUtPmlfc2ItPnNfZmxhZ3MgJiBNU19OT0RJUkFUSU1FKSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBXZSBtYXkgaGF2ZSBhIE5VTEwgdmZzbW91bnQgd2hlbiBjb21pbmcgZnJvbSBORlNECisJICovCisJaWYgKG1udCAmJgorCSAgICAoKG1udC0+bW50X2ZsYWdzICYgTU5UX05PQVRJTUUpIHx8CisJICAgICAoKG1udC0+bW50X2ZsYWdzICYgTU5UX05PRElSQVRJTUUpICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpKSkKKwkJcmV0dXJuOworCiAJbm93ID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKIAlpZiAoIXRpbWVzcGVjX2VxdWFsKCZpbm9kZS0+aV9hdGltZSwgJm5vdykpIHsKIAkJaW5vZGUtPmlfYXRpbWUgPSBub3c7CkBAIC0xMjAxLDE5ICsxMjEzLDIzIEBACiAJfQogfQogCi1FWFBPUlRfU1lNQk9MKHVwZGF0ZV9hdGltZSk7CitFWFBPUlRfU1lNQk9MKHRvdWNoX2F0aW1lKTsKIAogLyoqCi0gKglpbm9kZV91cGRhdGVfdGltZQktCXVwZGF0ZSBtdGltZSBhbmQgY3RpbWUgdGltZQotICoJQGlub2RlOiBpbm9kZSBhY2Nlc3NlZAotICoJQGN0aW1lX3RvbzogdXBkYXRlIGN0aW1lIHRvbworICoJZmlsZV91cGRhdGVfdGltZQktCXVwZGF0ZSBtdGltZSBhbmQgY3RpbWUgdGltZQorICoJQGZpbGU6IGZpbGUgYWNjZXNzZWQKICAqCi0gKglVcGRhdGUgdGhlIG10aW1lIHRpbWUgb24gYW4gaW5vZGUgYW5kIG1hcmsgaXQgZm9yIHdyaXRlYmFjay4KLSAqCVdoZW4gY3RpbWVfdG9vIGlzIHNwZWNpZmllZCB1cGRhdGUgdGhlIGN0aW1lIHRvby4KKyAqCVVwZGF0ZSB0aGUgbXRpbWUgYW5kIGN0aW1lIG1lbWJlcnMgb2YgYW4gaW5vZGUgYW5kIG1hcmsgdGhlIGlub2RlCisgKglmb3Igd3JpdGViYWNrLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgZXhjbHVzaXZlbHkgZm9yCisgKgl1c2FnZSBpbiB0aGUgZmlsZSB3cml0ZSBwYXRoIG9mIGZpbGVzeXN0ZW1zLCBhbmQgZmlsZXN5c3RlbXMgbWF5CisgKgljaG9vc2UgdG8gZXhwbGljaXRseSBpZ25vcmUgdXBkYXRlIHZpYSB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlCisgKglTX05PQ1RJTUUgaW5vZGUgZmxhZywgZS5nLiBmb3IgbmV0d29yayBmaWxlc3lzdGVtIHdoZXJlIHRoZXNlCisgKgl0aW1lc3RhbXBzIGFyZSBoYW5kbGVkIGJ5IHRoZSBzZXJ2ZXIuCiAgKi8KIAotdm9pZCBpbm9kZV91cGRhdGVfdGltZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgY3RpbWVfdG9vKQordm9pZCBmaWxlX3VwZGF0ZV90aW1lKHN0cnVjdCBmaWxlICpmaWxlKQogeworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgdGltZXNwZWMgbm93OwogCWludCBzeW5jX2l0ID0gMDsKIApAQCAtMTIyNywxNiArMTI0MywxNSBAQAogCQlzeW5jX2l0ID0gMTsKIAlpbm9kZS0+aV9tdGltZSA9IG5vdzsKIAotCWlmIChjdGltZV90b28pIHsKLQkJaWYgKCF0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfY3RpbWUsICZub3cpKQotCQkJc3luY19pdCA9IDE7Ci0JCWlub2RlLT5pX2N0aW1lID0gbm93OwotCX0KKwlpZiAoIXRpbWVzcGVjX2VxdWFsKCZpbm9kZS0+aV9jdGltZSwgJm5vdykpCisJCXN5bmNfaXQgPSAxOworCWlub2RlLT5pX2N0aW1lID0gbm93OworCiAJaWYgKHN5bmNfaXQpCiAJCW1hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSk7CiB9CiAKLUVYUE9SVF9TWU1CT0woaW5vZGVfdXBkYXRlX3RpbWUpOworRVhQT1JUX1NZTUJPTChmaWxlX3VwZGF0ZV90aW1lKTsKIAogaW50IGlub2RlX25lZWRzX3N5bmMoc3RydWN0IGlub2RlICppbm9kZSkKIHsKZGlmZiAtLWdpdCBhL2ZzL2lub3RpZnkuYyBiL2ZzL2lub3RpZnkuYwppbmRleCAyZmVjYjdhLi44NzhjY2NhIDEwMDY0NAotLS0gYS9mcy9pbm90aWZ5LmMKKysrIGIvZnMvaW5vdGlmeS5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogI2luY2x1ZGUgPGxpbnV4L2lub3RpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogCiAjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgogCmRpZmYgLS1naXQgYS9mcy9pb2N0bC5jIGIvZnMvaW9jdGwuYwppbmRleCA1NjkyMDkxLi5mOGFlZWMzIDEwMDY0NAotLS0gYS9mcy9pb2N0bC5jCisrKyBiL2ZzL2lvY3RsLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CmRpZmYgLS1naXQgYS9mcy9pb3ByaW8uYyBiL2ZzL2lvcHJpby5jCmluZGV4IDRiZjFjNjMuLmNhNzcwMDggMTAwNjQ0Ci0tLSBhL2ZzL2lvcHJpby5jCisrKyBiL2ZzL2lvcHJpby5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wcmlvLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAKIHN0YXRpYyBpbnQgc2V0X3Rhc2tfaW9wcmlvKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IGlvcHJpbykKZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL25hbWVpLmMgYi9mcy9pc29mcy9uYW1laS5jCmluZGV4IGUzN2U4MmIuLmU3YmEwYzMgMTAwNjQ0Ci0tLSBhL2ZzL2lzb2ZzL25hbWVpLmMKKysrIGIvZnMvaXNvZnMvbmFtZWkuYwpAQCAtMTg1LDggKzE4NSw1IEBACiAJCX0KIAl9CiAJdW5sb2NrX2tlcm5lbCgpOwotCWlmIChpbm9kZSkKLQkJcmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlub2RlLCBkZW50cnkpOwotCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwotCXJldHVybiBOVUxMOworCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2piZC9jaGVja3BvaW50LmMgYi9mcy9qYmQvY2hlY2twb2ludC5jCmluZGV4IGNiM2NlZjUuLmU2MjY1YTAgMTAwNjQ0Ci0tLSBhL2ZzL2piZC9jaGVja3BvaW50LmMKKysrIGIvZnMvamJkL2NoZWNrcG9pbnQuYwpAQCAtMzM4LDcgKzMzOCw3IEBACiAJICogZG9uZSAobWF5YmUgaXQncyBhIG5ldyB0cmFuc2FjdGlvbiwgYnV0IGl0IGZlbGwgYXQgdGhlIHNhbWUKIAkgKiBhZGRyZXNzKS4KIAkgKi8KLSAJaWYgKGpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgPT0gdHJhbnNhY3Rpb24gfHwKKyAJaWYgKGpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgPT0gdHJhbnNhY3Rpb24gJiYKIAkJCXRyYW5zYWN0aW9uLT50X3RpZCA9PSB0aGlzX3RpZCkgewogCQlpbnQgYmF0Y2hfY291bnQgPSAwOwogCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tOUl9CQVRDSF07CmRpZmYgLS1naXQgYS9mcy9qYmQvY29tbWl0LmMgYi9mcy9qYmQvY29tbWl0LmMKaW5kZXggMDAyYWQyYi4uMjllNjJkOSAxMDA2NDQKLS0tIGEvZnMvamJkL2NvbW1pdC5jCisrKyBiL2ZzL2piZC9jb21taXQuYwpAQCAtODI5LDcgKzgyOSw4IEBACiAJam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uID0gTlVMTDsKIAlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKIAotCWlmIChjb21taXRfdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0ID09IE5VTEwpIHsKKwlpZiAoY29tbWl0X3RyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCA9PSBOVUxMICYmCisJICAgIGNvbW1pdF90cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2lvX2xpc3QgPT0gTlVMTCkgewogCQlfX2pvdXJuYWxfZHJvcF90cmFuc2FjdGlvbihqb3VybmFsLCBjb21taXRfdHJhbnNhY3Rpb24pOwogCX0gZWxzZSB7CiAJCWlmIChqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMvaW5vZGUtdjIzLmMgYi9mcy9qZmZzL2lub2RlLXYyMy5jCmluZGV4IDNkY2M2ZDIuLmZjMzg1NWEgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMvaW5vZGUtdjIzLmMKKysrIGIvZnMvamZmcy9pbm9kZS12MjMuYwpAQCAtNzU3LDcgKzc1Nyw3IEBACiAKIAlyZWFkX2xlbiA9IDA7CiAJcmVzdWx0ID0gMDsKLQlvZmZzZXQgPSBwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOworCW9mZnNldCA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpOwogCiAJa21hcChwYWdlKTsKIAlidWYgPSBwYWdlX2FkZHJlc3MocGFnZSk7CkBAIC0xNDE1LDcgKzE0MTUsNyBAQAogCSAqIFRoaXMgd2lsbCBuZXZlciB0cmlnZ2VyIHdpdGggc2FuZSBwYWdlIHNpemVzLiAgbGVhdmUgaXQgaW4KIAkgKiBhbnl3YXksIHNpbmNlIEknbSB0aGlua2luZyBhYm91dCBob3cgdG8gbWVyZ2UgbGFyZ2VyIHdyaXRlcwogCSAqICh0aGUgY3VycmVudCBpZGVhIGlzIHRvIHBva2UgYSB0aHJlYWQgdGhhdCBkb2VzIHRoZSBhY3R1YWwKLQkgKiBJL08gYW5kIHN0YXJ0cyBieSBkb2luZyBhIGRvd24oJmlub2RlLT5pX3NlbSkuICB0aGVuIHdlCisJICogSS9PIGFuZCBzdGFydHMgYnkgZG9pbmcgYSBtdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCkuICB0aGVuIHdlCiAJICogd291bGQgbmVlZCB0byBnZXQgdGhlIHBhZ2UgY2FjaGUgcGFnZXMgYW5kIGhhdmUgYSBsaXN0IG9mCiAJICogSS9PIHJlcXVlc3RzIGFuZCBkbyB3cml0ZS1tZXJnaW5nIGhlcmUuCiAJICogLS0gcHJ1bXBmCkBAIC0xNTQ1LDcgKzE1NDUsNyBAQAogewogICAgICAgIHZvaWQgKmFkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSkgKyBmcm9tOwogICAgICAgIC8qIFhYWDogUEFHRV9DQUNIRV9TSElGVCBvciBQQUdFX1NISUZUICovCi0gICAgICAgbG9mZl90IHBvcyA9IChwYWdlLT5pbmRleDw8UEFHRV9DQUNIRV9TSElGVCkgKyBmcm9tOworICAgICAgIGxvZmZfdCBwb3MgPSBwYWdlX29mZnNldChwYWdlKSArIGZyb207CiAKICAgICAgICByZXR1cm4gamZmc19maWxlX3dyaXRlKGZpbHAsIGFkZHIsIHRvLWZyb20sICZwb3MpOwogfSAvKiBqZmZzX2NvbW1pdF93cml0ZSgpICovCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9idWlsZC5jIGIvZnMvamZmczIvYnVpbGQuYwppbmRleCBmZmYxMDhiLi43MGY3YTg5IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9idWlsZC5jCisrKyBiL2ZzL2pmZnMyL2J1aWxkLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAkgICAgIGljID0gbmV4dF9pbm9kZSgmaSwgaWMsIChjKSkpCiAKIAotc3RhdGljIGlubGluZSB2b2lkIGpmZnMyX2J1aWxkX2lub2RlX3Bhc3MxKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLAorc3RhdGljIHZvaWQgamZmczJfYnVpbGRfaW5vZGVfcGFzczEoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsCiAJCQkJCXN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqaWMpCiB7CiAJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZDsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2ZzLmMgYi9mcy9qZmZzMi9mcy5jCmluZGV4IGQwZmNjNWYuLjA5ZTVkMTAgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2ZzLmMKKysrIGIvZnMvamZmczIvZnMuYwpAQCAtMTEsNiArMTEsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9ub2RlbGlzdC5jIGIvZnMvamZmczIvbm9kZWxpc3QuYwppbmRleCBjNzllZWJiLi5iNjM1ZTE2IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9ub2RlbGlzdC5jCisrKyBiL2ZzL2pmZnMyL25vZGVsaXN0LmMKQEAgLTEzNCw3ICsxMzQsNyBAQAogLyoKICAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplcyBhIG5ldyBmcmFnbWVudC4KICAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICogbmV3X2ZyYWdtZW50KHN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICpmbiwgdWludDMyX3Qgb2ZzLCB1aW50MzJfdCBzaXplKQorc3RhdGljIHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKiBuZXdfZnJhZ21lbnQoc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmZuLCB1aW50MzJfdCBvZnMsIHVpbnQzMl90IHNpemUpCiB7CiAJc3RydWN0IGpmZnMyX25vZGVfZnJhZyAqbmV3ZnJhZzsKIApAQCAtNTEzLDcgKzUxMyw3IEBACiAgKgogICogQ2hlY2tzIHRoZSBub2RlIGlmIHdlIGFyZSBpbiB0aGUgY2hlY2tpbmcgc3RhZ2UuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX25vZGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCBzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRuKQorc3RhdGljIGludCBjaGVja19ub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwgc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICp0bikKIHsKIAlpbnQgcmV0OwogCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2RtYXAuYyBiL2ZzL2pmcy9qZnNfZG1hcC5jCmluZGV4IDY4MDAwYTUuLjI5NjdiNzMgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfZG1hcC5jCisrKyBiL2ZzL2pmcy9qZnNfZG1hcC5jCkBAIC0zMDIsOCArMzAyLDcgQEAKIAkvKgogCSAqIHdyaXRlIG91dCBkaXJ0eSBwYWdlcyBvZiBibWFwCiAJICovCi0JZmlsZW1hcF9mZGF0YXdyaXRlKGlwYm1hcC0+aV9tYXBwaW5nKTsKLQlmaWxlbWFwX2ZkYXRhd2FpdChpcGJtYXAtPmlfbWFwcGluZyk7CisJZmlsZW1hcF93cml0ZV9hbmRfd2FpdChpcGJtYXAtPmlfbWFwcGluZyk7CiAKIAlkaVdyaXRlU3BlY2lhbChpcGJtYXAsIDApOwogCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2ltYXAuYyBiL2ZzL2pmcy9qZnNfaW1hcC5jCmluZGV4IDI4MjAxYjEuLjMxYjRhYTEgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfaW1hcC5jCisrKyBiL2ZzL2pmcy9qZnNfaW1hcC5jCkBAIC0yNjUsOCArMjY1LDcgQEAKIAkvKgogCSAqIHdyaXRlIG91dCBkaXJ0eSBwYWdlcyBvZiBpbWFwCiAJICovCi0JZmlsZW1hcF9mZGF0YXdyaXRlKGlwaW1hcC0+aV9tYXBwaW5nKTsKLQlmaWxlbWFwX2ZkYXRhd2FpdChpcGltYXAtPmlfbWFwcGluZyk7CisJZmlsZW1hcF93cml0ZV9hbmRfd2FpdChpcGltYXAtPmlfbWFwcGluZyk7CiAKIAlkaVdyaXRlU3BlY2lhbChpcGltYXAsIDApOwogCkBAIC01NjUsOCArNTY0LDcgQEAKIAkJamZzX2VycigiZGlGcmVlU3BlY2lhbCBjYWxsZWQgd2l0aCBOVUxMIGlwISIpOwogCQlyZXR1cm47CiAJfQotCWZpbGVtYXBfZmRhdGF3cml0ZShpcC0+aV9tYXBwaW5nKTsKLQlmaWxlbWFwX2ZkYXRhd2FpdChpcC0+aV9tYXBwaW5nKTsKKwlmaWxlbWFwX3dyaXRlX2FuZF93YWl0KGlwLT5pX21hcHBpbmcpOwogCXRydW5jYXRlX2lub2RlX3BhZ2VzKGlwLT5pX21hcHBpbmcsIDApOwogCWlwdXQoaXApOwogfQpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19pbmNvcmUuaCBiL2ZzL2pmcy9qZnNfaW5jb3JlLmgKaW5kZXggYzBmZDdiMy4uZGMyMWE1YiAxMDA2NDQKLS0tIGEvZnMvamZzL2pmc19pbmNvcmUuaAorKysgYi9mcy9qZnMvamZzX2luY29yZS5oCkBAIC01OCw3ICs1OCw3IEBACiAJLyoKIAkgKiByZHdybG9jayBzZXJpYWxpemVzIHh0cmVlIGJldHdlZW4gcmVhZHMgJiB3cml0ZXMgYW5kIHN5bmNocm9uaXplcwogCSAqIGNoYW5nZXMgdG8gc3BlY2lhbCBpbm9kZXMuICBJdCdzIHVzZSB3b3VsZCBiZSByZWR1bmRhbnQgb24KLQkgKiBkaXJlY3RvcmllcyBzaW5jZSB0aGUgaV9zZW0gdGFrZW4gaW4gdGhlIFZGUyBpcyBzdWZmaWNpZW50LgorCSAqIGRpcmVjdG9yaWVzIHNpbmNlIHRoZSBpX211dGV4IHRha2VuIGluIHRoZSBWRlMgaXMgc3VmZmljaWVudC4KIAkgKi8KIAlzdHJ1Y3Qgcndfc2VtYXBob3JlIHJkd3Jsb2NrOwogCS8qCkBAIC02OCw3ICs2OCw3IEBACiAJICogaW5vZGUgaXMgYmxvY2tlZCBpbiB0eEJlZ2luIG9yIFR4QmVnaW5Bbm9uCiAJICovCiAJc3RydWN0IHNlbWFwaG9yZSBjb21taXRfc2VtOwotCS8qIHhhdHRyX3NlbSBhbGxvd3MgdXMgdG8gYWNjZXNzIHRoZSB4YXR0cnMgd2l0aG91dCB0YWtpbmcgaV9zZW0gKi8KKwkvKiB4YXR0cl9zZW0gYWxsb3dzIHVzIHRvIGFjY2VzcyB0aGUgeGF0dHJzIHdpdGhvdXQgdGFraW5nIGlfbXV0ZXggKi8KIAlzdHJ1Y3Qgcndfc2VtYXBob3JlIHhhdHRyX3NlbTsKIAlsaWRfdAl4dGxpZDsJCS8qIGxpZCBvZiB4dHJlZSBsb2NrIG9uIGRpcmVjdG9yeSAqLwogI2lmZGVmIENPTkZJR19KRlNfUE9TSVhfQUNMCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX3R4bm1nci5jIGIvZnMvamZzL2pmc190eG5tZ3IuYwppbmRleCBiNjYwYzkzLi4yZGRiNmI4IDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX3R4bm1nci5jCisrKyBiL2ZzL2pmcy9qZnNfdHhubWdyLmMKQEAgLTEyMzEsMTAgKzEyMzEsOCBAQAogCQkgKiB3aGVuIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgaXQgYXQgYWxsLgogCQkgKgogCQkgKiBpZiAoKCFTX0lTRElSKGlwLT5pX21vZGUpKQotCQkgKiAgICAmJiAodGJsay0+ZmxhZyAmIENPTU1JVF9ERUxFVEUpID09IDApIHsKLQkJICoJZmlsZW1hcF9mZGF0YXdyaXRlKGlwLT5pX21hcHBpbmcpOwotCQkgKglmaWxlbWFwX2ZkYXRhd2FpdChpcC0+aV9tYXBwaW5nKTsKLQkJICogfQorCQkgKiAgICAmJiAodGJsay0+ZmxhZyAmIENPTU1JVF9ERUxFVEUpID09IDApCisJCSAqCWZpbGVtYXBfd3JpdGVfYW5kX3dhaXQoaXAtPmlfbWFwcGluZyk7CiAJCSAqLwogCiAJCS8qCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX3Vtb3VudC5jIGIvZnMvamZzL2pmc191bW91bnQuYwppbmRleCA1Y2Y5MTc4Li4yMWVhZjdhIDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX3Vtb3VudC5jCisrKyBiL2ZzL2pmcy9qZnNfdW1vdW50LmMKQEAgLTEwOCw4ICsxMDgsNyBAQAogCSAqIE1ha2Ugc3VyZSBhbGwgbWV0YWRhdGEgbWFrZXMgaXQgdG8gZGlzayBiZWZvcmUgd2UgbWFyawogCSAqIHRoZSBzdXBlcmJsb2NrIGFzIGNsZWFuCiAJICovCi0JZmlsZW1hcF9mZGF0YXdyaXRlKHNiaS0+ZGlyZWN0X2lub2RlLT5pX21hcHBpbmcpOwotCWZpbGVtYXBfZmRhdGF3YWl0KHNiaS0+ZGlyZWN0X2lub2RlLT5pX21hcHBpbmcpOworCWZpbGVtYXBfd3JpdGVfYW5kX3dhaXQoc2JpLT5kaXJlY3RfaW5vZGUtPmlfbWFwcGluZyk7CiAKIAkvKgogCSAqIGVuc3VyZSBhbGwgZmlsZSBzeXN0ZW0gZmlsZSBwYWdlcyBhcmUgcHJvcGFnYXRlZCB0byB0aGVpcgpAQCAtMTYxLDggKzE2MCw3IEBACiAJICogbWFyayB0aGUgc3VwZXJibG9jayBjbGVhbiBiZWZvcmUgZXZlcnl0aGluZyBpcyBmbHVzaGVkIHRvCiAJICogZGlzay4KIAkgKi8KLQlmaWxlbWFwX2ZkYXRhd3JpdGUoc2JpLT5kaXJlY3RfaW5vZGUtPmlfbWFwcGluZyk7Ci0JZmlsZW1hcF9mZGF0YXdhaXQoc2JpLT5kaXJlY3RfaW5vZGUtPmlfbWFwcGluZyk7CisJZmlsZW1hcF93cml0ZV9hbmRfd2FpdChzYmktPmRpcmVjdF9pbm9kZS0+aV9tYXBwaW5nKTsKIAogCXVwZGF0ZVN1cGVyKHNiLCBGTV9DTEVBTik7CiAKZGlmZiAtLWdpdCBhL2ZzL2pmcy9yZXNpemUuYyBiL2ZzL2pmcy9yZXNpemUuYwppbmRleCBjNmRjMjU0Li40NTE4MDM2IDEwMDY0NAotLS0gYS9mcy9qZnMvcmVzaXplLmMKKysrIGIvZnMvamZzL3Jlc2l6ZS5jCkBAIC0zNzYsOCArMzc2LDcgQEAKIAkgKiBieSB0eENvbW1pdCgpOwogCSAqLwogCWZpbGVtYXBfZmRhdGF3YWl0KGlwYm1hcC0+aV9tYXBwaW5nKTsKLQlmaWxlbWFwX2ZkYXRhd3JpdGUoaXBibWFwLT5pX21hcHBpbmcpOwotCWZpbGVtYXBfZmRhdGF3YWl0KGlwYm1hcC0+aV9tYXBwaW5nKTsKKwlmaWxlbWFwX3dyaXRlX2FuZF93YWl0KGlwYm1hcC0+aV9tYXBwaW5nKTsKIAlkaVdyaXRlU3BlY2lhbChpcGJtYXAsIDApOwogCiAJbmV3UGFnZSA9IG5QYWdlczsJLyogZmlyc3QgbmV3IHBhZ2UgbnVtYmVyICovCmRpZmYgLS1naXQgYS9mcy9qZnMvc3VwZXIuYyBiL2ZzL2pmcy9zdXBlci5jCmluZGV4IDQyMjZhZjMuLjhkMzFmMTMgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9zdXBlci5jCisrKyBiL2ZzL2pmcy9zdXBlci5jCkBAIC01MDIsOCArNTAyLDcgQEAKIAkJamZzX2VycigiamZzX3Vtb3VudCBmYWlsZWQgd2l0aCByZXR1cm4gY29kZSAlZCIsIHJjKTsKIAl9CiBvdXRfbW91bnRfZmFpbGVkOgotCWZpbGVtYXBfZmRhdGF3cml0ZShzYmktPmRpcmVjdF9pbm9kZS0+aV9tYXBwaW5nKTsKLQlmaWxlbWFwX2ZkYXRhd2FpdChzYmktPmRpcmVjdF9pbm9kZS0+aV9tYXBwaW5nKTsKKwlmaWxlbWFwX3dyaXRlX2FuZF93YWl0KHNiaS0+ZGlyZWN0X2lub2RlLT5pX21hcHBpbmcpOwogCXRydW5jYXRlX2lub2RlX3BhZ2VzKHNiaS0+ZGlyZWN0X2lub2RlLT5pX21hcHBpbmcsIDApOwogCW1ha2VfYmFkX2lub2RlKHNiaS0+ZGlyZWN0X2lub2RlKTsKIAlpcHV0KHNiaS0+ZGlyZWN0X2lub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL2pmcy94YXR0ci5jIGIvZnMvamZzL3hhdHRyLmMKaW5kZXggMjNhYTUwNi4uZjIzMDQ4ZiAxMDA2NDQKLS0tIGEvZnMvamZzL3hhdHRyLmMKKysrIGIvZnMvamZzL3hhdHRyLmMKQEAgLTE3LDYgKzE3LDcgQEAKICAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICAqLwogCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KICNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2xfeGF0dHIuaD4KQEAgLTgzLDIxICs4NCw2IEBACiAjZGVmaW5lIEVBX05FVwkJMHgwMDA0CiAjZGVmaW5lIEVBX01BTExPQwkweDAwMDgKIAotLyogTmFtZXNwYWNlcyAqLwotI2RlZmluZSBYQVRUUl9TWVNURU1fUFJFRklYICJzeXN0ZW0uIgotI2RlZmluZSBYQVRUUl9TWVNURU1fUFJFRklYX0xFTiAoc2l6ZW9mIChYQVRUUl9TWVNURU1fUFJFRklYKSAtIDEpCi0KLSNkZWZpbmUgWEFUVFJfVVNFUl9QUkVGSVggInVzZXIuIgotI2RlZmluZSBYQVRUUl9VU0VSX1BSRUZJWF9MRU4gKHNpemVvZiAoWEFUVFJfVVNFUl9QUkVGSVgpIC0gMSkKLQotI2RlZmluZSBYQVRUUl9PUzJfUFJFRklYICJvczIuIgotI2RlZmluZSBYQVRUUl9PUzJfUFJFRklYX0xFTiAoc2l6ZW9mIChYQVRUUl9PUzJfUFJFRklYKSAtIDEpCi0KLS8qIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCBpcyBkZWZpbmVkIGluIGluY2x1ZGUvbGludXgveGF0dHIuaCAqLwotI2RlZmluZSBYQVRUUl9TRUNVUklUWV9QUkVGSVhfTEVOIChzaXplb2YgKFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCkgLSAxKQotCi0jZGVmaW5lIFhBVFRSX1RSVVNURURfUFJFRklYICJ0cnVzdGVkLiIKLSNkZWZpbmUgWEFUVFJfVFJVU1RFRF9QUkVGSVhfTEVOIChzaXplb2YgKFhBVFRSX1RSVVNURURfUFJFRklYKSAtIDEpCiAKIC8qCiAgKiBUaGVzZSB0aHJlZSByb3V0aW5lcyBhcmUgdXNlZCB0byByZWNvZ25pemUgb24tZGlzayBleHRlbmRlZCBhdHRyaWJ1dGVzCkBAIC03NzMsMzYgKzc1OSwyMyBAQAogc3RhdGljIGludCBjYW5fc2V0X3hhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCB2YWx1ZV9sZW4pCiB7Ci0JaWYgKElTX1JET05MWShpbm9kZSkpCi0JCXJldHVybiAtRVJPRlM7Ci0KLQlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JaWYoc3RybmNtcChuYW1lLCBYQVRUUl9TWVNURU1fUFJFRklYLCBYQVRUUl9TWVNURU1fUFJFRklYX0xFTikgPT0gMCkKLQkJLyoKLQkJICogInN5c3RlbS4qIgotCQkgKi8KKwlpZiAoIXN0cm5jbXAobmFtZSwgWEFUVFJfU1lTVEVNX1BSRUZJWCwgWEFUVFJfU1lTVEVNX1BSRUZJWF9MRU4pKQogCQlyZXR1cm4gY2FuX3NldF9zeXN0ZW1feGF0dHIoaW5vZGUsIG5hbWUsIHZhbHVlLCB2YWx1ZV9sZW4pOwogCi0JaWYoc3RybmNtcChuYW1lLCBYQVRUUl9UUlVTVEVEX1BSRUZJWCwgWEFUVFJfVFJVU1RFRF9QUkVGSVhfTEVOKSA9PSAwKQotCQlyZXR1cm4gKGNhcGFibGUoQ0FQX1NZU19BRE1JTikgPyAwIDogLUVQRVJNKTsKLQotI2lmZGVmIENPTkZJR19KRlNfU0VDVVJJVFkKLQlpZiAoc3RybmNtcChuYW1lLCBYQVRUUl9TRUNVUklUWV9QUkVGSVgsIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWF9MRU4pCi0JICAgID09IDApCi0JCXJldHVybiAwOwkvKiBMZWF2ZSBpdCB0byB0aGUgc2VjdXJpdHkgbW9kdWxlICovCi0jZW5kaWYKLQkJCi0JaWYoKHN0cm5jbXAobmFtZSwgWEFUVFJfVVNFUl9QUkVGSVgsIFhBVFRSX1VTRVJfUFJFRklYX0xFTikgIT0gMCkgJiYKLQkgICAoc3RybmNtcChuYW1lLCBYQVRUUl9PUzJfUFJFRklYLCBYQVRUUl9PUzJfUFJFRklYX0xFTikgIT0gMCkpCisJLyoKKwkgKiBEb24ndCBhbGxvdyBzZXR0aW5nIGFuIGF0dHJpYnV0ZSBpbiBhbiB1bmtub3duIG5hbWVzcGFjZS4KKwkgKi8KKwlpZiAoc3RybmNtcChuYW1lLCBYQVRUUl9UUlVTVEVEX1BSRUZJWCwgWEFUVFJfVFJVU1RFRF9QUkVGSVhfTEVOKSAmJgorCSAgICBzdHJuY21wKG5hbWUsIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCwgWEFUVFJfU0VDVVJJVFlfUFJFRklYX0xFTikgJiYKKwkgICAgc3RybmNtcChuYW1lLCBYQVRUUl9VU0VSX1BSRUZJWCwgWEFUVFJfVVNFUl9QUkVGSVhfTEVOKSAmJgorCSAgICBzdHJuY21wKG5hbWUsIFhBVFRSX09TMl9QUkVGSVgsIFhBVFRSX09TMl9QUkVGSVhfTEVOKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmCiAJICAgICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fCBpbm9kZS0+aV9tb2RlICZTX0lTVlRYKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCXJldHVybiBwZXJtaXNzaW9uKGlub2RlLCBNQVlfV1JJVEUsIE5VTEwpOworCXJldHVybiAwOwogfQogCiBpbnQgX19qZnNfc2V0eGF0dHIodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLApAQCAtOTcyLDIyICs5NDUsNiBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBjYW5fZ2V0X3hhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0jaWZkZWYgQ09ORklHX0pGU19TRUNVUklUWQotCWlmKHN0cm5jbXAobmFtZSwgWEFUVFJfU0VDVVJJVFlfUFJFRklYLCBYQVRUUl9TRUNVUklUWV9QUkVGSVhfTEVOKSA9PSAwKQotCQlyZXR1cm4gMDsKLSNlbmRpZgotCi0JaWYoc3RybmNtcChuYW1lLCBYQVRUUl9UUlVTVEVEX1BSRUZJWCwgWEFUVFJfVFJVU1RFRF9QUkVGSVhfTEVOKSA9PSAwKQotCQlyZXR1cm4gKGNhcGFibGUoQ0FQX1NZU19BRE1JTikgPyAwIDogLUVQRVJNKTsKLQotCWlmKHN0cm5jbXAobmFtZSwgWEFUVFJfU1lTVEVNX1BSRUZJWCwgWEFUVFJfU1lTVEVNX1BSRUZJWF9MRU4pID09IDApCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIHBlcm1pc3Npb24oaW5vZGUsIE1BWV9SRUFELCBOVUxMKTsKLX0KLQogc3NpemVfdCBfX2pmc19nZXR4YXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpkYXRhLAogCQkgICAgICAgc2l6ZV90IGJ1Zl9zaXplKQogewpAQCAtOTk4LDEyICs5NTUsOCBAQAogCXNzaXplX3Qgc2l6ZTsKIAlpbnQgbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKIAljaGFyICpvczJuYW1lID0gTlVMTDsKLQlpbnQgcmM7CiAJY2hhciAqdmFsdWU7CiAKLQlpZiAoKHJjID0gY2FuX2dldF94YXR0cihpbm9kZSwgbmFtZSkpKQotCQlyZXR1cm4gcmM7Ci0KIAlpZiAoc3RybmNtcChuYW1lLCBYQVRUUl9PUzJfUFJFRklYLCBYQVRUUl9PUzJfUFJFRklYX0xFTikgPT0gMCkgewogCQlvczJuYW1lID0ga21hbGxvYyhuYW1lbGVuIC0gWEFUVFJfT1MyX1BSRUZJWF9MRU4gKyAxLAogCQkJCSAgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9mcy9saWJmcy5jIGIvZnMvbGliZnMuYwppbmRleCA1ODEwMWRmLi42M2MwMjBlIDEwMDY0NAotLS0gYS9mcy9saWJmcy5jCisrKyBiL2ZzL2xpYmZzLmMKQEAgLTc0LDcgKzc0LDcgQEAKIAogbG9mZl90IGRjYWNoZV9kaXJfbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pCiB7Ci0JZG93bigmZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJc3dpdGNoIChvcmlnaW4pIHsKIAkJY2FzZSAxOgogCQkJb2Zmc2V0ICs9IGZpbGUtPmZfcG9zOwpAQCAtODIsNyArODIsNyBAQAogCQkJaWYgKG9mZnNldCA+PSAwKQogCQkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJdXAoJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJCQltdXRleF91bmxvY2soJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAob2Zmc2V0ICE9IGZpbGUtPmZfcG9zKSB7CkBAIC05MywyMCArOTMsMjAgQEAKIAkJCWxvZmZfdCBuID0gZmlsZS0+Zl9wb3MgLSAyOwogCiAJCQlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKLQkJCWxpc3RfZGVsKCZjdXJzb3ItPmRfY2hpbGQpOworCQkJbGlzdF9kZWwoJmN1cnNvci0+ZF91LmRfY2hpbGQpOwogCQkJcCA9IGZpbGUtPmZfZGVudHJ5LT5kX3N1YmRpcnMubmV4dDsKIAkJCXdoaWxlIChuICYmIHAgIT0gJmZpbGUtPmZfZGVudHJ5LT5kX3N1YmRpcnMpIHsKIAkJCQlzdHJ1Y3QgZGVudHJ5ICpuZXh0OwotCQkJCW5leHQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBkZW50cnksIGRfY2hpbGQpOworCQkJCW5leHQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBkZW50cnksIGRfdS5kX2NoaWxkKTsKIAkJCQlpZiAoIWRfdW5oYXNoZWQobmV4dCkgJiYgbmV4dC0+ZF9pbm9kZSkKIAkJCQkJbi0tOwogCQkJCXAgPSBwLT5uZXh0OwogCQkJfQotCQkJbGlzdF9hZGRfdGFpbCgmY3Vyc29yLT5kX2NoaWxkLCBwKTsKKwkJCWxpc3RfYWRkX3RhaWwoJmN1cnNvci0+ZF91LmRfY2hpbGQsIHApOwogCQkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKIAkJfQogCX0KLQl1cCgmZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gb2Zmc2V0OwogfQogCkBAIC0xMjYsNyArMTI2LDcgQEAKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKIAlzdHJ1Y3QgZGVudHJ5ICpjdXJzb3IgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcCwgKnEgPSAmY3Vyc29yLT5kX2NoaWxkOworCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpxID0gJmN1cnNvci0+ZF91LmRfY2hpbGQ7CiAJaW5vX3QgaW5vOwogCWludCBpID0gZmlscC0+Zl9wb3M7CiAKQEAgLTE1Myw3ICsxNTMsNyBAQAogCQkJfQogCQkJZm9yIChwPXEtPm5leHQ7IHAgIT0gJmRlbnRyeS0+ZF9zdWJkaXJzOyBwPXAtPm5leHQpIHsKIAkJCQlzdHJ1Y3QgZGVudHJ5ICpuZXh0OwotCQkJCW5leHQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBkZW50cnksIGRfY2hpbGQpOworCQkJCW5leHQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBkZW50cnksIGRfdS5kX2NoaWxkKTsKIAkJCQlpZiAoZF91bmhhc2hlZChuZXh0KSB8fCAhbmV4dC0+ZF9pbm9kZSkKIAkJCQkJY29udGludWU7CiAKQEAgLTI2MSw3ICsyNjEsNyBAQAogCWludCByZXQgPSAwOwogCiAJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZCwgJmRlbnRyeS0+ZF9zdWJkaXJzLCBkX2NoaWxkKQorCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZkZW50cnktPmRfc3ViZGlycywgZF91LmRfY2hpbGQpCiAJCWlmIChzaW1wbGVfcG9zaXRpdmUoY2hpbGQpKQogCQkJZ290byBvdXQ7CiAJcmV0ID0gMTsKQEAgLTM1Niw3ICszNTYsNyBAQAogCiAJLyoKIAkgKiBObyBuZWVkIHRvIHVzZSBpX3NpemVfcmVhZCgpIGhlcmUsIHRoZSBpX3NpemUKLQkgKiBjYW5ub3QgY2hhbmdlIHVuZGVyIHVzIGJlY2F1c2Ugd2UgaG9sZCB0aGUgaV9zZW0uCisJICogY2Fubm90IGNoYW5nZSB1bmRlciB1cyBiZWNhdXNlIHdlIGhvbGQgdGhlIGlfbXV0ZXguCiAJICovCiAJaWYgKHBvcyA+IGlub2RlLT5pX3NpemUpCiAJCWlfc2l6ZV93cml0ZShpbm9kZSwgcG9zKTsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3hkci5jIGIvZnMvbG9ja2QveGRyLmMKaW5kZXggZjAxZTljMC4uMjAwZmJkYSAxMDA2NDQKLS0tIGEvZnMvbG9ja2QveGRyLmMKKysrIGIvZnMvbG9ja2QveGRyLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIC8qCiAgKiBYRFIgZnVuY3Rpb25zIGZvciBiYXNpYyBOTE0gdHlwZXMKICAqLwotc3RhdGljIGlubGluZSB1MzIgKm5sbV9kZWNvZGVfY29va2llKHUzMiAqcCwgc3RydWN0IG5sbV9jb29raWUgKmMpCitzdGF0aWMgdTMyICpubG1fZGVjb2RlX2Nvb2tpZSh1MzIgKnAsIHN0cnVjdCBubG1fY29va2llICpjKQogewogCXVuc2lnbmVkIGludAlsZW47CiAKQEAgLTc5LDcgKzc5LDcgQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgKgorc3RhdGljIHUzMiAqCiBubG1fZGVjb2RlX2ZoKHUzMiAqcCwgc3RydWN0IG5mc19maCAqZikKIHsKIAl1bnNpZ25lZCBpbnQJbGVuOwpAQCAtMTE5LDcgKzExOSw3IEBACiAJcmV0dXJuIHhkcl9lbmNvZGVfbmV0b2JqKHAsIG9oKTsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgKgorc3RhdGljIHUzMiAqCiBubG1fZGVjb2RlX2xvY2sodTMyICpwLCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2spCiB7CiAJc3RydWN0IGZpbGVfbG9jawkqZmwgPSAmbG9jay0+Zmw7CmRpZmYgLS1naXQgYS9mcy9sb2Nrcy5jIGIvZnMvbG9ja3MuYwppbmRleCBmYjMyZDYyLi45MDllYWI4IDEwMDY0NAotLS0gYS9mcy9sb2Nrcy5jCisrKyBiL2ZzL2xvY2tzLmMKQEAgLTE1NCw3ICsxNTQsNyBAQAogfQogCiAvKiBGcmVlIGEgbG9jayB3aGljaCBpcyBub3QgaW4gdXNlLiAqLwotc3RhdGljIGlubGluZSB2b2lkIGxvY2tzX2ZyZWVfbG9jayhzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3N0YXRpYyB2b2lkIGxvY2tzX2ZyZWVfbG9jayhzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKIHsKIAlpZiAoZmwgPT0gTlVMTCkgewogCQlCVUcoKTsKQEAgLTQ3NSw4ICs0NzUsNyBAQAogLyoKICAqIENoZWNrIHdoZXRoZXIgdHdvIGxvY2tzIGhhdmUgdGhlIHNhbWUgb3duZXIuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1wb3NpeF9zYW1lX293bmVyKHN0cnVjdCBmaWxlX2xvY2sgKmZsMSwgc3RydWN0IGZpbGVfbG9jayAqZmwyKQorc3RhdGljIGludCBwb3NpeF9zYW1lX293bmVyKHN0cnVjdCBmaWxlX2xvY2sgKmZsMSwgc3RydWN0IGZpbGVfbG9jayAqZmwyKQogewogCWlmIChmbDEtPmZsX2xtb3BzICYmIGZsMS0+ZmxfbG1vcHMtPmZsX2NvbXBhcmVfb3duZXIpCiAJCXJldHVybiBmbDItPmZsX2xtb3BzID09IGZsMS0+ZmxfbG1vcHMgJiYKQEAgLTQ4Nyw3ICs0ODYsNyBAQAogLyogUmVtb3ZlIHdhaXRlciBmcm9tIGJsb2NrZXIncyBibG9jayBsaXN0LgogICogV2hlbiBibG9ja2VyIGVuZHMgdXAgcG9pbnRpbmcgdG8gaXRzZWxmIHRoZW4gdGhlIGxpc3QgaXMgZW1wdHkuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2xvY2tzX2RlbGV0ZV9ibG9jayhzdHJ1Y3QgZmlsZV9sb2NrICp3YWl0ZXIpCitzdGF0aWMgdm9pZCBfX2xvY2tzX2RlbGV0ZV9ibG9jayhzdHJ1Y3QgZmlsZV9sb2NrICp3YWl0ZXIpCiB7CiAJbGlzdF9kZWxfaW5pdCgmd2FpdGVyLT5mbF9ibG9jayk7CiAJbGlzdF9kZWxfaW5pdCgmd2FpdGVyLT5mbF9saW5rKTsKZGlmZiAtLWdpdCBhL2ZzL21iY2FjaGUuYyBiL2ZzL21iY2FjaGUuYwppbmRleCAwZjFlNDUzLi5mNWJiZTRjIDEwMDY0NAotLS0gYS9mcy9tYmNhY2hlLmMKKysrIGIvZnMvbWJjYWNoZS5jCkBAIC0xMjYsNyArMTI2LDcgQEAKIH0KIAogCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyB2b2lkCiBfX21iX2NhY2hlX2VudHJ5X3VuaGFzaChzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlKQogewogCWludCBuOwpAQCAtMTM5LDcgKzEzOSw3IEBACiB9CiAKIAotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogX19tYl9jYWNoZV9lbnRyeV9mb3JnZXQoc3RydWN0IG1iX2NhY2hlX2VudHJ5ICpjZSwgZ2ZwX3QgZ2ZwX21hc2spCiB7CiAJc3RydWN0IG1iX2NhY2hlICpjYWNoZSA9IGNlLT5lX2NhY2hlOwpAQCAtMTU4LDcgKzE1OCw3IEBACiB9CiAKIAotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogX19tYl9jYWNoZV9lbnRyeV9yZWxlYXNlX3VubG9jayhzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlKQogewogCS8qIFdha2UgdXAgYWxsIHByb2Nlc3NlcyBxdWV1aW5nIGZvciB0aGlzIGNhY2hlIGVudHJ5LiAqLwpkaWZmIC0tZ2l0IGEvZnMvbXBhZ2UuYyBiL2ZzL21wYWdlLmMKaW5kZXggZjFkMmQwMi4uZTQzMWNiMyAxMDA2NDQKLS0tIGEvZnMvbXBhZ2UuYworKysgYi9mcy9tcGFnZS5jCkBAIC0xODQsNyArMTg0LDcgQEAKIAlpZiAocGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKIAkJZ290byBjb25mdXNlZDsKIAotCWJsb2NrX2luX2ZpbGUgPSBwYWdlLT5pbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGJsa2JpdHMpOworCWJsb2NrX2luX2ZpbGUgPSAoc2VjdG9yX3QpcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBibGtiaXRzKTsKIAlsYXN0X2Jsb2NrID0gKGlfc2l6ZV9yZWFkKGlub2RlKSArIGJsb2Nrc2l6ZSAtIDEpID4+IGJsa2JpdHM7CiAKIAliaC5iX3BhZ2UgPSBwYWdlOwpAQCAtNDY2LDcgKzQ2Niw3IEBACiAJICogVGhlIHBhZ2UgaGFzIG5vIGJ1ZmZlcnM6IG1hcCBpdCB0byBkaXNrCiAJICovCiAJQlVHX09OKCFQYWdlVXB0b2RhdGUocGFnZSkpOwotCWJsb2NrX2luX2ZpbGUgPSBwYWdlLT5pbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGJsa2JpdHMpOworCWJsb2NrX2luX2ZpbGUgPSAoc2VjdG9yX3QpcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBibGtiaXRzKTsKIAlsYXN0X2Jsb2NrID0gKGlfc2l6ZSAtIDEpID4+IGJsa2JpdHM7CiAJbWFwX2JoLmJfcGFnZSA9IHBhZ2U7CiAJZm9yIChwYWdlX2Jsb2NrID0gMDsgcGFnZV9ibG9jayA8IGJsb2Nrc19wZXJfcGFnZTsgKSB7CmRpZmYgLS1naXQgYS9mcy9uYW1laS5jIGIvZnMvbmFtZWkuYwppbmRleCA2ZGJiZDQyLi40YWNkYWMwIDEwMDY0NAotLS0gYS9mcy9uYW1laS5jCisrKyBiL2ZzL25hbWVpLmMKQEAgLTI4LDcgKzI4LDEwIEBACiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8YXNtL25hbWVpLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApAQCAtMTEyLDcgKzExNSw3IEBACiAgKiBQT1NJWC4xIDIuNDogYW4gZW1wdHkgcGF0aG5hbWUgaXMgaW52YWxpZCAoRU5PRU5UKS4KICAqIFBBVEhfTUFYIGluY2x1ZGVzIHRoZSBudWwgdGVybWluYXRvciAtLVJSLgogICovCi1zdGF0aWMgaW5saW5lIGludCBkb19nZXRuYW1lKGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwgY2hhciAqcGFnZSkKK3N0YXRpYyBpbnQgZG9fZ2V0bmFtZShjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsIGNoYXIgKnBhZ2UpCiB7CiAJaW50IHJldHZhbDsKIAl1bnNpZ25lZCBsb25nIGxlbiA9IFBBVEhfTUFYOwpAQCAtMzk1LDcgKzM5OCw3IEBACiAgKiBzaG9ydC1jdXQgREFDIGZhaWxzLCB0aGVuIGNhbGwgcGVybWlzc2lvbigpIHRvIGRvIG1vcmUKICAqIGNvbXBsZXRlIHBlcm1pc3Npb24gY2hlY2suCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGV4ZWNfcGVybWlzc2lvbl9saXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCitzdGF0aWMgaW50IGV4ZWNfcGVybWlzc2lvbl9saXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewogCXVtb2RlX3QJbW9kZSA9IGlub2RlLT5pX21vZGU7CkBAIC00MzgsNyArNDQxLDcgQEAKIAlzdHJ1Y3QgZGVudHJ5ICogcmVzdWx0OwogCXN0cnVjdCBpbm9kZSAqZGlyID0gcGFyZW50LT5kX2lub2RlOwogCi0JZG93bigmZGlyLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmZGlyLT5pX211dGV4KTsKIAkvKgogCSAqIEZpcnN0IHJlLWRvIHRoZSBjYWNoZWQgbG9va3VwIGp1c3QgaW4gY2FzZSBpdCB3YXMgY3JlYXRlZAogCSAqIHdoaWxlIHdlIHdhaXRlZCBmb3IgdGhlIGRpcmVjdG9yeSBzZW1hcGhvcmUuLgpAQCAtNDY0LDcgKzQ2Nyw3IEBACiAJCQllbHNlCiAJCQkJcmVzdWx0ID0gZGVudHJ5OwogCQl9Ci0JCXVwKCZkaXItPmlfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZkaXItPmlfbXV0ZXgpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApAQCAtNDcyLDcgKzQ3NSw3IEBACiAJICogVWhodWghIE5hc3R5IGNhc2U6IHRoZSBjYWNoZSB3YXMgcmUtcG9wdWxhdGVkIHdoaWxlCiAJICogd2Ugd2FpdGVkIG9uIHRoZSBzZW1hcGhvcmUuIE5lZWQgdG8gcmV2YWxpZGF0ZS4KIAkgKi8KLQl1cCgmZGlyLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZkaXItPmlfbXV0ZXgpOwogCWlmIChyZXN1bHQtPmRfb3AgJiYgcmVzdWx0LT5kX29wLT5kX3JldmFsaWRhdGUpIHsKIAkJaWYgKCFyZXN1bHQtPmRfb3AtPmRfcmV2YWxpZGF0ZShyZXN1bHQsIG5kKSAmJiAhZF9pbnZhbGlkYXRlKHJlc3VsdCkpIHsKIAkJCWRwdXQocmVzdWx0KTsKQEAgLTQ4NSw3ICs0ODgsNyBAQAogc3RhdGljIGludCBfX2VtdWxfbG9va3VwX2RlbnRyeShjb25zdCBjaGFyICosIHN0cnVjdCBuYW1laWRhdGEgKik7CiAKIC8qIFNNUC1zYWZlICovCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQKIHdhbGtfaW5pdF9yb290KGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewogCXJlYWRfbG9jaygmY3VycmVudC0+ZnMtPmxvY2spOwpAQCAtNTAzLDcgKzUwNiw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IF9fdmZzX2ZvbGxvd19saW5rKHN0cnVjdCBuYW1laWRhdGEgKm5kLCBjb25zdCBjaGFyICpsaW5rKQorc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgX192ZnNfZm9sbG93X2xpbmsoc3RydWN0IG5hbWVpZGF0YSAqbmQsIGNvbnN0IGNoYXIgKmxpbmspCiB7CiAJaW50IHJlcyA9IDA7CiAJY2hhciAqbmFtZTsKQEAgLTU0Myw3ICs1NDYsNyBAQAogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50IF9fZG9fZm9sbG93X2xpbmsoc3RydWN0IHBhdGggKnBhdGgsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQorc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgX19kb19mb2xsb3dfbGluayhzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CiAJaW50IGVycm9yOwogCXZvaWQgKmNvb2tpZTsKQEAgLTY4OSw3ICs2OTIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZm9sbG93X2RvdGRvdChzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBmb2xsb3dfZG90ZG90KHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewogCXdoaWxlKDEpIHsKIAkJc3RydWN0IHZmc21vdW50ICpwYXJlbnQ7CkBAIC0xMDYyLDcgKzEwNjUsOCBAQAogfQogCiAvKiBSZXR1cm5zIDAgYW5kIG5kIHdpbGwgYmUgdmFsaWQgb24gc3VjY2VzczsgUmV0dW5zIGVycm9yLCBvdGhlcndpc2UuICovCi1pbnQgZmFzdGNhbGwgcGF0aF9sb29rdXAoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3N0YXRpYyBpbnQgZmFzdGNhbGwgZG9fcGF0aF9sb29rdXAoaW50IGRmZCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewogCWludCByZXR2YWwgPSAwOwogCkBAIC0xMDgyLDkgKzEwODYsMzggQEAKIAkJfQogCQluZC0+bW50ID0gbW50Z2V0KGN1cnJlbnQtPmZzLT5yb290bW50KTsKIAkJbmQtPmRlbnRyeSA9IGRnZXQoY3VycmVudC0+ZnMtPnJvb3QpOwotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChkZmQgPT0gQVRfRkRDV0QpIHsKIAkJbmQtPm1udCA9IG1udGdldChjdXJyZW50LT5mcy0+cHdkbW50KTsKIAkJbmQtPmRlbnRyeSA9IGRnZXQoY3VycmVudC0+ZnMtPnB3ZCk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGZpbGUgKmZpbGU7CisJCWludCBmcHV0X25lZWRlZDsKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCisJCWZpbGUgPSBmZ2V0X2xpZ2h0KGRmZCwgJmZwdXRfbmVlZGVkKTsKKwkJaWYgKCFmaWxlKSB7CisJCQlyZXR2YWwgPSAtRUJBREY7CisJCQlnb3RvIG91dF9mYWlsOworCQl9CisKKwkJZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisKKwkJaWYgKCFTX0lTRElSKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkgeworCQkJcmV0dmFsID0gLUVOT1RESVI7CisJCQlmcHV0X2xpZ2h0KGZpbGUsIGZwdXRfbmVlZGVkKTsKKwkJCWdvdG8gb3V0X2ZhaWw7CisJCX0KKworCQlyZXR2YWwgPSBmaWxlX3Blcm1pc3Npb24oZmlsZSwgTUFZX0VYRUMpOworCQlpZiAocmV0dmFsKSB7CisJCQlmcHV0X2xpZ2h0KGZpbGUsIGZwdXRfbmVlZGVkKTsKKwkJCWdvdG8gb3V0X2ZhaWw7CisJCX0KKworCQluZC0+bW50ID0gbW50Z2V0KGZpbGUtPmZfdmZzbW50KTsKKwkJbmQtPmRlbnRyeSA9IGRnZXQoZGVudHJ5KTsKKworCQlmcHV0X2xpZ2h0KGZpbGUsIGZwdXRfbmVlZGVkKTsKIAl9CiAJcmVhZF91bmxvY2soJmN1cnJlbnQtPmZzLT5sb2NrKTsKIAljdXJyZW50LT50b3RhbF9saW5rX2NvdW50ID0gMDsKQEAgLTEwOTMsMTEgKzExMjYsMTkgQEAKIAlpZiAodW5saWtlbHkoY3VycmVudC0+YXVkaXRfY29udGV4dAogCQkgICAgICYmIG5kICYmIG5kLT5kZW50cnkgJiYgbmQtPmRlbnRyeS0+ZF9pbm9kZSkpCiAJCWF1ZGl0X2lub2RlKG5hbWUsIG5kLT5kZW50cnktPmRfaW5vZGUsIGZsYWdzKTsKK291dF9mYWlsOgogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQgX19wYXRoX2xvb2t1cF9pbnRlbnRfb3Blbihjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgbG9va3VwX2ZsYWdzLAotCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgaW50IG9wZW5fZmxhZ3MsIGludCBjcmVhdGVfbW9kZSkKK2ludCBmYXN0Y2FsbCBwYXRoX2xvb2t1cChjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCisJCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlyZXR1cm4gZG9fcGF0aF9sb29rdXAoQVRfRkRDV0QsIG5hbWUsIGZsYWdzLCBuZCk7Cit9CisKK3N0YXRpYyBpbnQgX19wYXRoX2xvb2t1cF9pbnRlbnRfb3BlbihpbnQgZGZkLCBjb25zdCBjaGFyICpuYW1lLAorCQl1bnNpZ25lZCBpbnQgbG9va3VwX2ZsYWdzLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCwKKwkJaW50IG9wZW5fZmxhZ3MsIGludCBjcmVhdGVfbW9kZSkKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlscCA9IGdldF9lbXB0eV9maWxwKCk7CiAJaW50IGVycjsKQEAgLTExMDcsNyArMTE0OCw3IEBACiAJbmQtPmludGVudC5vcGVuLmZpbGUgPSBmaWxwOwogCW5kLT5pbnRlbnQub3Blbi5mbGFncyA9IG9wZW5fZmxhZ3M7CiAJbmQtPmludGVudC5vcGVuLmNyZWF0ZV9tb2RlID0gY3JlYXRlX21vZGU7Ci0JZXJyID0gcGF0aF9sb29rdXAobmFtZSwgbG9va3VwX2ZsYWdzfExPT0tVUF9PUEVOLCBuZCk7CisJZXJyID0gZG9fcGF0aF9sb29rdXAoZGZkLCBuYW1lLCBsb29rdXBfZmxhZ3N8TE9PS1VQX09QRU4sIG5kKTsKIAlpZiAoSVNfRVJSKG5kLT5pbnRlbnQub3Blbi5maWxlKSkgewogCQlpZiAoZXJyID09IDApIHsKIAkJCWVyciA9IFBUUl9FUlIobmQtPmludGVudC5vcGVuLmZpbGUpOwpAQCAtMTEyNSwxMCArMTE2NiwxMCBAQAogICogQG5kOiBwb2ludGVyIHRvIG5hbWVpZGF0YQogICogQG9wZW5fZmxhZ3M6IG9wZW4gaW50ZW50IGZsYWdzCiAgKi8KLWludCBwYXRoX2xvb2t1cF9vcGVuKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBsb29rdXBfZmxhZ3MsCitpbnQgcGF0aF9sb29rdXBfb3BlbihpbnQgZGZkLCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgbG9va3VwX2ZsYWdzLAogCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgaW50IG9wZW5fZmxhZ3MpCiB7Ci0JcmV0dXJuIF9fcGF0aF9sb29rdXBfaW50ZW50X29wZW4obmFtZSwgbG9va3VwX2ZsYWdzLCBuZCwKKwlyZXR1cm4gX19wYXRoX2xvb2t1cF9pbnRlbnRfb3BlbihkZmQsIG5hbWUsIGxvb2t1cF9mbGFncywgbmQsCiAJCQlvcGVuX2ZsYWdzLCAwKTsKIH0KIApAQCAtMTE0MCwxMiArMTE4MSwxMiBAQAogICogQG9wZW5fZmxhZ3M6IG9wZW4gaW50ZW50IGZsYWdzCiAgKiBAY3JlYXRlX21vZGU6IGNyZWF0ZSBpbnRlbnQgZmxhZ3MKICAqLwotc3RhdGljIGludCBwYXRoX2xvb2t1cF9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IGxvb2t1cF9mbGFncywKLQkJCSAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kLCBpbnQgb3Blbl9mbGFncywKLQkJCSAgICAgIGludCBjcmVhdGVfbW9kZSkKK3N0YXRpYyBpbnQgcGF0aF9sb29rdXBfY3JlYXRlKGludCBkZmQsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbG9va3VwX2ZsYWdzLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCwKKwkJCSAgICAgIGludCBvcGVuX2ZsYWdzLCBpbnQgY3JlYXRlX21vZGUpCiB7Ci0JcmV0dXJuIF9fcGF0aF9sb29rdXBfaW50ZW50X29wZW4obmFtZSwgbG9va3VwX2ZsYWdzfExPT0tVUF9DUkVBVEUsIG5kLAotCQkJb3Blbl9mbGFncywgY3JlYXRlX21vZGUpOworCXJldHVybiBfX3BhdGhfbG9va3VwX2ludGVudF9vcGVuKGRmZCwgbmFtZSwgbG9va3VwX2ZsYWdzfExPT0tVUF9DUkVBVEUsCisJCQluZCwgb3Blbl9mbGFncywgY3JlYXRlX21vZGUpOwogfQogCiBpbnQgX191c2VyX3BhdGhfbG9va3VwX29wZW4oY29uc3QgY2hhciBfX3VzZXIgKm5hbWUsIHVuc2lnbmVkIGludCBsb29rdXBfZmxhZ3MsCkBAIC0xMTU1LDcgKzExOTYsNyBAQAogCWludCBlcnIgPSBQVFJfRVJSKHRtcCk7CiAKIAlpZiAoIUlTX0VSUih0bXApKSB7Ci0JCWVyciA9IF9fcGF0aF9sb29rdXBfaW50ZW50X29wZW4odG1wLCBsb29rdXBfZmxhZ3MsIG5kLCBvcGVuX2ZsYWdzLCAwKTsKKwkJZXJyID0gX19wYXRoX2xvb2t1cF9pbnRlbnRfb3BlbihBVF9GRENXRCwgdG1wLCBsb29rdXBfZmxhZ3MsIG5kLCBvcGVuX2ZsYWdzLCAwKTsKIAkJcHV0bmFtZSh0bXApOwogCX0KIAlyZXR1cm4gZXJyOwpAQCAtMTI0NywxOCArMTI4OCwyNCBAQAogICogdGhhdCBuYW1laSBmb2xsb3dzIGxpbmtzLCB3aGlsZSBsbmFtZWkgZG9lcyBub3QuCiAgKiBTTVAtc2FmZQogICovCi1pbnQgZmFzdGNhbGwgX191c2VyX3dhbGsoY29uc3QgY2hhciBfX3VzZXIgKm5hbWUsIHVuc2lnbmVkIGZsYWdzLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK2ludCBmYXN0Y2FsbCBfX3VzZXJfd2Fsa19mZChpbnQgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqbmFtZSwgdW5zaWduZWQgZmxhZ3MsCisJCQkgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CiAJY2hhciAqdG1wID0gZ2V0bmFtZShuYW1lKTsKIAlpbnQgZXJyID0gUFRSX0VSUih0bXApOwogCiAJaWYgKCFJU19FUlIodG1wKSkgewotCQllcnIgPSBwYXRoX2xvb2t1cCh0bXAsIGZsYWdzLCBuZCk7CisJCWVyciA9IGRvX3BhdGhfbG9va3VwKGRmZCwgdG1wLCBmbGFncywgbmQpOwogCQlwdXRuYW1lKHRtcCk7CiAJfQogCXJldHVybiBlcnI7CiB9CiAKK2ludCBmYXN0Y2FsbCBfX3VzZXJfd2Fsayhjb25zdCBjaGFyIF9fdXNlciAqbmFtZSwgdW5zaWduZWQgZmxhZ3MsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXJldHVybiBfX3VzZXJfd2Fsa19mZChBVF9GRENXRCwgbmFtZSwgZmxhZ3MsIG5kKTsKK30KKwogLyoKICAqIEl0J3MgaW5saW5lLCBzbyBwZW5hbHR5IGZvciBmaWxlc3lzdGVtcyB0aGF0IGRvbid0IHVzZSBzdGlja3kgYml0IGlzCiAgKiBtaW5pbWFsLgpAQCAtMTI5Myw3ICsxMzQwLDcgQEAKICAqIDEwLiBXZSBkb24ndCBhbGxvdyByZW1vdmFsIG9mIE5GUyBzaWxseXJlbmFtZWQgZmlsZXM7IGl0J3MgaGFuZGxlZCBieQogICogICAgIG5mc19hc3luY191bmxpbmsoKS4KICAqLwotc3RhdGljIGlubGluZSBpbnQgbWF5X2RlbGV0ZShzdHJ1Y3QgaW5vZGUgKmRpcixzdHJ1Y3QgZGVudHJ5ICp2aWN0aW0saW50IGlzZGlyKQorc3RhdGljIGludCBtYXlfZGVsZXRlKHN0cnVjdCBpbm9kZSAqZGlyLHN0cnVjdCBkZW50cnkgKnZpY3RpbSxpbnQgaXNkaXIpCiB7CiAJaW50IGVycm9yOwogCkBAIC0xMzY2LDcgKzE0MTMsNyBAQAogCXN0cnVjdCBkZW50cnkgKnA7CiAKIAlpZiAocDEgPT0gcDIpIHsKLQkJZG93bigmcDEtPmRfaW5vZGUtPmlfc2VtKTsKKwkJbXV0ZXhfbG9jaygmcDEtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTEzNzQsMzAgKzE0MjEsMzAgQEAKIAogCWZvciAocCA9IHAxOyBwLT5kX3BhcmVudCAhPSBwOyBwID0gcC0+ZF9wYXJlbnQpIHsKIAkJaWYgKHAtPmRfcGFyZW50ID09IHAyKSB7Ci0JCQlkb3duKCZwMi0+ZF9pbm9kZS0+aV9zZW0pOwotCQkJZG93bigmcDEtPmRfaW5vZGUtPmlfc2VtKTsKKwkJCW11dGV4X2xvY2soJnAyLT5kX2lub2RlLT5pX211dGV4KTsKKwkJCW11dGV4X2xvY2soJnAxLT5kX2lub2RlLT5pX211dGV4KTsKIAkJCXJldHVybiBwOwogCQl9CiAJfQogCiAJZm9yIChwID0gcDI7IHAtPmRfcGFyZW50ICE9IHA7IHAgPSBwLT5kX3BhcmVudCkgewogCQlpZiAocC0+ZF9wYXJlbnQgPT0gcDEpIHsKLQkJCWRvd24oJnAxLT5kX2lub2RlLT5pX3NlbSk7Ci0JCQlkb3duKCZwMi0+ZF9pbm9kZS0+aV9zZW0pOworCQkJbXV0ZXhfbG9jaygmcDEtPmRfaW5vZGUtPmlfbXV0ZXgpOworCQkJbXV0ZXhfbG9jaygmcDItPmRfaW5vZGUtPmlfbXV0ZXgpOwogCQkJcmV0dXJuIHA7CiAJCX0KIAl9CiAKLQlkb3duKCZwMS0+ZF9pbm9kZS0+aV9zZW0pOwotCWRvd24oJnAyLT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmcDEtPmRfaW5vZGUtPmlfbXV0ZXgpOworCW11dGV4X2xvY2soJnAyLT5kX2lub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gTlVMTDsKIH0KIAogdm9pZCB1bmxvY2tfcmVuYW1lKHN0cnVjdCBkZW50cnkgKnAxLCBzdHJ1Y3QgZGVudHJ5ICpwMikKIHsKLQl1cCgmcDEtPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJnAxLT5kX2lub2RlLT5pX211dGV4KTsKIAlpZiAocDEgIT0gcDIpIHsKLQkJdXAoJnAyLT5kX2lub2RlLT5pX3NlbSk7CisJCW11dGV4X3VubG9jaygmcDItPmRfaW5vZGUtPmlfbXV0ZXgpOwogCQl1cCgmcDEtPmRfaW5vZGUtPmlfc2ItPnNfdmZzX3JlbmFtZV9zZW0pOwogCX0KIH0KQEAgLTE0OTEsNyArMTUzOCw3IEBACiAJCWlmICghZXJyb3IpIHsKIAkJCURRVU9UX0lOSVQoaW5vZGUpOwogCQkJCi0JCQllcnJvciA9IGRvX3RydW5jYXRlKGRlbnRyeSwgMCwgTlVMTCk7CisJCQllcnJvciA9IGRvX3RydW5jYXRlKGRlbnRyeSwgMCwgQVRUUl9NVElNRXxBVFRSX0NUSU1FLCBOVUxMKTsKIAkJfQogCQlwdXRfd3JpdGVfYWNjZXNzKGlub2RlKTsKIAkJaWYgKGVycm9yKQpAQCAtMTUxNyw3ICsxNTY0LDggQEAKICAqIGZvciBzeW1saW5rcyAod2hlcmUgdGhlIHBlcm1pc3Npb25zIGFyZSBjaGVja2VkIGxhdGVyKS4KICAqIFNNUC1zYWZlCiAgKi8KLWludCBvcGVuX25hbWVpKGNvbnN0IGNoYXIgKiBwYXRobmFtZSwgaW50IGZsYWcsIGludCBtb2RlLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK2ludCBvcGVuX25hbWVpKGludCBkZmQsIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgZmxhZywKKwkJaW50IG1vZGUsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewogCWludCBhY2NfbW9kZSwgZXJyb3I7CiAJc3RydWN0IHBhdGggcGF0aDsKQEAgLTE1MzksNyArMTU4Nyw4IEBACiAJICogVGhlIHNpbXBsZXN0IGNhc2UgLSBqdXN0IGEgcGxhaW4gbG9va3VwLgogCSAqLwogCWlmICghKGZsYWcgJiBPX0NSRUFUKSkgewotCQllcnJvciA9IHBhdGhfbG9va3VwX29wZW4ocGF0aG5hbWUsIGxvb2t1cF9mbGFncyhmbGFnKSwgbmQsIGZsYWcpOworCQllcnJvciA9IHBhdGhfbG9va3VwX29wZW4oZGZkLCBwYXRobmFtZSwgbG9va3VwX2ZsYWdzKGZsYWcpLAorCQkJCQkgbmQsIGZsYWcpOwogCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4gZXJyb3I7CiAJCWdvdG8gb2s7CkBAIC0xNTQ4LDcgKzE1OTcsNyBAQAogCS8qCiAJICogQ3JlYXRlIC0gd2UgbmVlZCB0byBrbm93IHRoZSBwYXJlbnQuCiAJICovCi0JZXJyb3IgPSBwYXRoX2xvb2t1cF9jcmVhdGUocGF0aG5hbWUsIExPT0tVUF9QQVJFTlQsIG5kLCBmbGFnLCBtb2RlKTsKKwllcnJvciA9IHBhdGhfbG9va3VwX2NyZWF0ZShkZmQscGF0aG5hbWUsTE9PS1VQX1BBUkVOVCxuZCxmbGFnLG1vZGUpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCkBAIC0xNTYzLDE0ICsxNjEyLDE0IEBACiAKIAlkaXIgPSBuZC0+ZGVudHJ5OwogCW5kLT5mbGFncyAmPSB+TE9PS1VQX1BBUkVOVDsKLQlkb3duKCZkaXItPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZkaXItPmRfaW5vZGUtPmlfbXV0ZXgpOwogCXBhdGguZGVudHJ5ID0gbG9va3VwX2hhc2gobmQpOwogCXBhdGgubW50ID0gbmQtPm1udDsKIAogZG9fbGFzdDoKIAllcnJvciA9IFBUUl9FUlIocGF0aC5kZW50cnkpOwogCWlmIChJU19FUlIocGF0aC5kZW50cnkpKSB7Ci0JCXVwKCZkaXItPmRfaW5vZGUtPmlfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZkaXItPmRfaW5vZGUtPmlfbXV0ZXgpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xNTc5LDcgKzE2MjgsNyBAQAogCQlpZiAoIUlTX1BPU0lYQUNMKGRpci0+ZF9pbm9kZSkpCiAJCQltb2RlICY9IH5jdXJyZW50LT5mcy0+dW1hc2s7CiAJCWVycm9yID0gdmZzX2NyZWF0ZShkaXItPmRfaW5vZGUsIHBhdGguZGVudHJ5LCBtb2RlLCBuZCk7Ci0JCXVwKCZkaXItPmRfaW5vZGUtPmlfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZkaXItPmRfaW5vZGUtPmlfbXV0ZXgpOwogCQlkcHV0KG5kLT5kZW50cnkpOwogCQluZC0+ZGVudHJ5ID0gcGF0aC5kZW50cnk7CiAJCWlmIChlcnJvcikKQEAgLTE1OTMsNyArMTY0Miw3IEBACiAJLyoKIAkgKiBJdCBhbHJlYWR5IGV4aXN0cy4KIAkgKi8KLQl1cCgmZGlyLT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZkaXItPmRfaW5vZGUtPmlfbXV0ZXgpOwogCiAJZXJyb3IgPSAtRUVYSVNUOwogCWlmIChmbGFnICYgT19FWENMKQpAQCAtMTY2NSw3ICsxNzE0LDcgQEAKIAkJZ290byBleGl0OwogCX0KIAlkaXIgPSBuZC0+ZGVudHJ5OwotCWRvd24oJmRpci0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmRpci0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJcGF0aC5kZW50cnkgPSBsb29rdXBfaGFzaChuZCk7CiAJcGF0aC5tbnQgPSBuZC0+bW50OwogCV9fcHV0bmFtZShuZC0+bGFzdC5uYW1lKTsKQEAgLTE2ODAsMTMgKzE3MjksMTMgQEAKICAqIFNpbXBsZSBmdW5jdGlvbiB0byBsb29rdXAgYW5kIHJldHVybiBhIGRlbnRyeSBhbmQgY3JlYXRlIGl0CiAgKiBpZiBpdCBkb2Vzbid0IGV4aXN0LiAgSXMgU01QLXNhZmUuCiAgKgotICogUmV0dXJucyB3aXRoIG5kLT5kZW50cnktPmRfaW5vZGUtPmlfc2VtIGxvY2tlZC4KKyAqIFJldHVybnMgd2l0aCBuZC0+ZGVudHJ5LT5kX2lub2RlLT5pX211dGV4IGxvY2tlZC4KICAqLwogc3RydWN0IGRlbnRyeSAqbG9va3VwX2NyZWF0ZShzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgaW50IGlzX2RpcikKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBFUlJfUFRSKC1FRVhJU1QpOwogCi0JZG93bigmbmQtPmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJm5kLT5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCS8qCiAJICogWXVja3kgbGFzdCBjb21wb25lbnQgb3Igbm8gbGFzdCBjb21wb25lbnQgYXQgYWxsPwogCSAqIChmb28vLiwgZm9vLy4uLCAvLy8vLykKQEAgLTE3NDMsNyArMTc5Miw4IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX21rbm9kKGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUsIGludCBtb2RlLCB1bnNpZ25lZCBkZXYpCithc21saW5rYWdlIGxvbmcgc3lzX21rbm9kYXQoaW50IGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBpbnQgbW9kZSwKKwkJCQl1bnNpZ25lZCBkZXYpCiB7CiAJaW50IGVycm9yID0gMDsKIAljaGFyICogdG1wOwpAQCAtMTc1Niw3ICsxODA2LDcgQEAKIAlpZiAoSVNfRVJSKHRtcCkpCiAJCXJldHVybiBQVFJfRVJSKHRtcCk7CiAKLQllcnJvciA9IHBhdGhfbG9va3VwKHRtcCwgTE9PS1VQX1BBUkVOVCwgJm5kKTsKKwllcnJvciA9IGRvX3BhdGhfbG9va3VwKGRmZCwgdG1wLCBMT09LVVBfUEFSRU5ULCAmbmQpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7CiAJZGVudHJ5ID0gbG9va3VwX2NyZWF0ZSgmbmQsIDApOwpAQCAtMTc4NCw3ICsxODM0LDcgQEAKIAkJfQogCQlkcHV0KGRlbnRyeSk7CiAJfQotCXVwKCZuZC5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJm5kLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJcGF0aF9yZWxlYXNlKCZuZCk7CiBvdXQ6CiAJcHV0bmFtZSh0bXApOwpAQCAtMTc5Miw2ICsxODQyLDExIEBACiAJcmV0dXJuIGVycm9yOwogfQogCithc21saW5rYWdlIGxvbmcgc3lzX21rbm9kKGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwgaW50IG1vZGUsIHVuc2lnbmVkIGRldikKK3sKKwlyZXR1cm4gc3lzX21rbm9kYXQoQVRfRkRDV0QsIGZpbGVuYW1lLCBtb2RlLCBkZXYpOworfQorCiBpbnQgdmZzX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQogewogCWludCBlcnJvciA9IG1heV9jcmVhdGUoZGlyLCBkZW50cnksIE5VTEwpOwpAQCAtMTgxNCw3ICsxODY5LDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfbWtkaXIoY29uc3QgY2hhciBfX3VzZXIgKiBwYXRobmFtZSwgaW50IG1vZGUpCithc21saW5rYWdlIGxvbmcgc3lzX21rZGlyYXQoaW50IGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKnBhdGhuYW1lLCBpbnQgbW9kZSkKIHsKIAlpbnQgZXJyb3IgPSAwOwogCWNoYXIgKiB0bXA7CkBAIC0xODI1LDcgKzE4ODAsNyBAQAogCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CiAJCXN0cnVjdCBuYW1laWRhdGEgbmQ7CiAKLQkJZXJyb3IgPSBwYXRoX2xvb2t1cCh0bXAsIExPT0tVUF9QQVJFTlQsICZuZCk7CisJCWVycm9yID0gZG9fcGF0aF9sb29rdXAoZGZkLCB0bXAsIExPT0tVUF9QQVJFTlQsICZuZCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0OwogCQlkZW50cnkgPSBsb29rdXBfY3JlYXRlKCZuZCwgMSk7CkBAIC0xODM2LDcgKzE4OTEsNyBAQAogCQkJZXJyb3IgPSB2ZnNfbWtkaXIobmQuZGVudHJ5LT5kX2lub2RlLCBkZW50cnksIG1vZGUpOwogCQkJZHB1dChkZW50cnkpOwogCQl9Ci0JCXVwKCZuZC5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZuZC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCQlwYXRoX3JlbGVhc2UoJm5kKTsKIG91dDoKIAkJcHV0bmFtZSh0bXApOwpAQCAtMTg0NSw2ICsxOTAwLDExIEBACiAJcmV0dXJuIGVycm9yOwogfQogCithc21saW5rYWdlIGxvbmcgc3lzX21rZGlyKGNvbnN0IGNoYXIgX191c2VyICpwYXRobmFtZSwgaW50IG1vZGUpCit7CisJcmV0dXJuIHN5c19ta2RpcmF0KEFUX0ZEQ1dELCBwYXRobmFtZSwgbW9kZSk7Cit9CisKIC8qCiAgKiBXZSB0cnkgdG8gZHJvcCB0aGUgZGVudHJ5IGVhcmx5OiB3ZSBzaG91bGQgaGF2ZQogICogYSB1c2FnZSBjb3VudCBvZiAyIGlmIHdlJ3JlIHRoZSBvbmx5IHVzZXIgb2YgdGhpcwpAQCAtMTg4NSw3ICsxOTQ1LDcgQEAKIAogCURRVU9UX0lOSVQoZGlyKTsKIAotCWRvd24oJmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJZGVudHJ5X3VuaGFzaChkZW50cnkpOwogCWlmIChkX21vdW50cG9pbnQoZGVudHJ5KSkKIAkJZXJyb3IgPSAtRUJVU1k7CkBAIC0xODk3LDcgKzE5NTcsNyBAQAogCQkJCWRlbnRyeS0+ZF9pbm9kZS0+aV9mbGFncyB8PSBTX0RFQUQ7CiAJCX0KIAl9Ci0JdXAoJmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAlpZiAoIWVycm9yKSB7CiAJCWRfZGVsZXRlKGRlbnRyeSk7CiAJfQpAQCAtMTkwNiw3ICsxOTY2LDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfcm1kaXIoY29uc3QgY2hhciBfX3VzZXIgKiBwYXRobmFtZSkKK3N0YXRpYyBsb25nIGRvX3JtZGlyKGludCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICpwYXRobmFtZSkKIHsKIAlpbnQgZXJyb3IgPSAwOwogCWNoYXIgKiBuYW1lOwpAQCAtMTkxNyw3ICsxOTc3LDcgQEAKIAlpZihJU19FUlIobmFtZSkpCiAJCXJldHVybiBQVFJfRVJSKG5hbWUpOwogCi0JZXJyb3IgPSBwYXRoX2xvb2t1cChuYW1lLCBMT09LVVBfUEFSRU5ULCAmbmQpOworCWVycm9yID0gZG9fcGF0aF9sb29rdXAoZGZkLCBuYW1lLCBMT09LVVBfUEFSRU5ULCAmbmQpOwogCWlmIChlcnJvcikKIAkJZ290byBleGl0OwogCkBAIC0xOTMyLDE0ICsxOTkyLDE0IEBACiAJCQllcnJvciA9IC1FQlVTWTsKIAkJCWdvdG8gZXhpdDE7CiAJfQotCWRvd24oJm5kLmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJm5kLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJZGVudHJ5ID0gbG9va3VwX2hhc2goJm5kKTsKIAllcnJvciA9IFBUUl9FUlIoZGVudHJ5KTsKIAlpZiAoIUlTX0VSUihkZW50cnkpKSB7CiAJCWVycm9yID0gdmZzX3JtZGlyKG5kLmRlbnRyeS0+ZF9pbm9kZSwgZGVudHJ5KTsKIAkJZHB1dChkZW50cnkpOwogCX0KLQl1cCgmbmQuZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZuZC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogZXhpdDE6CiAJcGF0aF9yZWxlYXNlKCZuZCk7CiBleGl0OgpAQCAtMTk0Nyw2ICsyMDA3LDExIEBACiAJcmV0dXJuIGVycm9yOwogfQogCithc21saW5rYWdlIGxvbmcgc3lzX3JtZGlyKGNvbnN0IGNoYXIgX191c2VyICpwYXRobmFtZSkKK3sKKwlyZXR1cm4gZG9fcm1kaXIoQVRfRkRDV0QsIHBhdGhuYW1lKTsKK30KKwogaW50IHZmc191bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlpbnQgZXJyb3IgPSBtYXlfZGVsZXRlKGRpciwgZGVudHJ5LCAwKTsKQEAgLTE5NTksNyArMjAyNCw3IEBACiAKIAlEUVVPVF9JTklUKGRpcik7CiAKLQlkb3duKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCWlmIChkX21vdW50cG9pbnQoZGVudHJ5KSkKIAkJZXJyb3IgPSAtRUJVU1k7CiAJZWxzZSB7CkBAIC0xOTY3LDcgKzIwMzIsNyBAQAogCQlpZiAoIWVycm9yKQogCQkJZXJyb3IgPSBkaXItPmlfb3AtPnVubGluayhkaXIsIGRlbnRyeSk7CiAJfQotCXVwKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAKIAkvKiBXZSBkb24ndCBkX2RlbGV0ZSgpIE5GUyBzaWxseXJlbmFtZWQgZmlsZXMtLXRoZXkgc3RpbGwgZXhpc3QuICovCiAJaWYgKCFlcnJvciAmJiAhKGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9ORlNGU19SRU5BTUVEKSkgewpAQCAtMTk3OSwxMSArMjA0NCwxMSBAQAogCiAvKgogICogTWFrZSBzdXJlIHRoYXQgdGhlIGFjdHVhbCB0cnVuY2F0aW9uIG9mIHRoZSBmaWxlIHdpbGwgb2NjdXIgb3V0c2lkZSBpdHMKLSAqIGRpcmVjdG9yeSdzIGlfc2VtLiAgVHJ1bmNhdGUgY2FuIHRha2UgYSBsb25nIHRpbWUgaWYgdGhlcmUgaXMgYSBsb3Qgb2YKKyAqIGRpcmVjdG9yeSdzIGlfbXV0ZXguICBUcnVuY2F0ZSBjYW4gdGFrZSBhIGxvbmcgdGltZSBpZiB0aGVyZSBpcyBhIGxvdCBvZgogICogd3JpdGVvdXQgaGFwcGVuaW5nLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBwcmV2ZW50IGFjY2VzcyB0byB0aGUgZGlyZWN0b3J5CiAgKiB3aGlsZSB3YWl0aW5nIG9uIHRoZSBJL08uCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfdW5saW5rKGNvbnN0IGNoYXIgX191c2VyICogcGF0aG5hbWUpCitzdGF0aWMgbG9uZyBkb191bmxpbmthdChpbnQgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqcGF0aG5hbWUpCiB7CiAJaW50IGVycm9yID0gMDsKIAljaGFyICogbmFtZTsKQEAgLTE5OTUsMTMgKzIwNjAsMTMgQEAKIAlpZihJU19FUlIobmFtZSkpCiAJCXJldHVybiBQVFJfRVJSKG5hbWUpOwogCi0JZXJyb3IgPSBwYXRoX2xvb2t1cChuYW1lLCBMT09LVVBfUEFSRU5ULCAmbmQpOworCWVycm9yID0gZG9fcGF0aF9sb29rdXAoZGZkLCBuYW1lLCBMT09LVVBfUEFSRU5ULCAmbmQpOwogCWlmIChlcnJvcikKIAkJZ290byBleGl0OwogCWVycm9yID0gLUVJU0RJUjsKIAlpZiAobmQubGFzdF90eXBlICE9IExBU1RfTk9STSkKIAkJZ290byBleGl0MTsKLQlkb3duKCZuZC5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZuZC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCWRlbnRyeSA9IGxvb2t1cF9oYXNoKCZuZCk7CiAJZXJyb3IgPSBQVFJfRVJSKGRlbnRyeSk7CiAJaWYgKCFJU19FUlIoZGVudHJ5KSkgewpAQCAtMjAxNSw3ICsyMDgwLDcgQEAKIAlleGl0MjoKIAkJZHB1dChkZW50cnkpOwogCX0KLQl1cCgmbmQuZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZuZC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCWlmIChpbm9kZSkKIAkJaXB1dChpbm9kZSk7CS8qIHRydW5jYXRlIHRoZSBpbm9kZSBoZXJlICovCiBleGl0MToKQEAgLTIwMzAsNiArMjA5NSwyMiBAQAogCWdvdG8gZXhpdDI7CiB9CiAKK2FzbWxpbmthZ2UgbG9uZyBzeXNfdW5saW5rYXQoaW50IGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKnBhdGhuYW1lLCBpbnQgZmxhZykKK3sKKwlpZiAoKGZsYWcgJiB+QVRfUkVNT1ZFRElSKSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChmbGFnICYgQVRfUkVNT1ZFRElSKQorCQlyZXR1cm4gZG9fcm1kaXIoZGZkLCBwYXRobmFtZSk7CisKKwlyZXR1cm4gZG9fdW5saW5rYXQoZGZkLCBwYXRobmFtZSk7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfdW5saW5rKGNvbnN0IGNoYXIgX191c2VyICpwYXRobmFtZSkKK3sKKwlyZXR1cm4gZG9fdW5saW5rYXQoQVRfRkRDV0QsIHBhdGhuYW1lKTsKK30KKwogaW50IHZmc19zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm9sZG5hbWUsIGludCBtb2RlKQogewogCWludCBlcnJvciA9IG1heV9jcmVhdGUoZGlyLCBkZW50cnksIE5VTEwpOwpAQCAtMjA1MSw3ICsyMTMyLDggQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfc3ltbGluayhjb25zdCBjaGFyIF9fdXNlciAqIG9sZG5hbWUsIGNvbnN0IGNoYXIgX191c2VyICogbmV3bmFtZSkKK2FzbWxpbmthZ2UgbG9uZyBzeXNfc3ltbGlua2F0KGNvbnN0IGNoYXIgX191c2VyICpvbGRuYW1lLAorCQkJICAgICAgaW50IG5ld2RmZCwgY29uc3QgY2hhciBfX3VzZXIgKm5ld25hbWUpCiB7CiAJaW50IGVycm9yID0gMDsKIAljaGFyICogZnJvbTsKQEAgLTIwNjYsNyArMjE0OCw3IEBACiAJCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAkJc3RydWN0IG5hbWVpZGF0YSBuZDsKIAotCQllcnJvciA9IHBhdGhfbG9va3VwKHRvLCBMT09LVVBfUEFSRU5ULCAmbmQpOworCQllcnJvciA9IGRvX3BhdGhfbG9va3VwKG5ld2RmZCwgdG8sIExPT0tVUF9QQVJFTlQsICZuZCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0OwogCQlkZW50cnkgPSBsb29rdXBfY3JlYXRlKCZuZCwgMCk7CkBAIC0yMDc1LDcgKzIxNTcsNyBAQAogCQkJZXJyb3IgPSB2ZnNfc3ltbGluayhuZC5kZW50cnktPmRfaW5vZGUsIGRlbnRyeSwgZnJvbSwgU19JQUxMVUdPKTsKIAkJCWRwdXQoZGVudHJ5KTsKIAkJfQotCQl1cCgmbmQuZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJCW11dGV4X3VubG9jaygmbmQuZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAkJcGF0aF9yZWxlYXNlKCZuZCk7CiBvdXQ6CiAJCXB1dG5hbWUodG8pOwpAQCAtMjA4NCw2ICsyMTY2LDExIEBACiAJcmV0dXJuIGVycm9yOwogfQogCithc21saW5rYWdlIGxvbmcgc3lzX3N5bWxpbmsoY29uc3QgY2hhciBfX3VzZXIgKm9sZG5hbWUsIGNvbnN0IGNoYXIgX191c2VyICpuZXduYW1lKQoreworCXJldHVybiBzeXNfc3ltbGlua2F0KG9sZG5hbWUsIEFUX0ZEQ1dELCBuZXduYW1lKTsKK30KKwogaW50IHZmc19saW5rKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOwpAQCAtMjExMywxMCArMjIwMCwxMCBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCi0JZG93bigmb2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJm9sZF9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCURRVU9UX0lOSVQoZGlyKTsKIAllcnJvciA9IGRpci0+aV9vcC0+bGluayhvbGRfZGVudHJ5LCBkaXIsIG5ld19kZW50cnkpOwotCXVwKCZvbGRfZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZvbGRfZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAlpZiAoIWVycm9yKQogCQlmc25vdGlmeV9jcmVhdGUoZGlyLCBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJcmV0dXJuIGVycm9yOwpAQCAtMjEzMSw3ICsyMjE4LDggQEAKICAqIHdpdGggbGludXggMi4wLCBhbmQgdG8gYXZvaWQgaGFyZC1saW5raW5nIHRvIGRpcmVjdG9yaWVzCiAgKiBhbmQgb3RoZXIgc3BlY2lhbCBmaWxlcy4gIC0tQURNCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfbGluayhjb25zdCBjaGFyIF9fdXNlciAqIG9sZG5hbWUsIGNvbnN0IGNoYXIgX191c2VyICogbmV3bmFtZSkKK2FzbWxpbmthZ2UgbG9uZyBzeXNfbGlua2F0KGludCBvbGRkZmQsIGNvbnN0IGNoYXIgX191c2VyICpvbGRuYW1lLAorCQkJICAgaW50IG5ld2RmZCwgY29uc3QgY2hhciBfX3VzZXIgKm5ld25hbWUpCiB7CiAJc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeTsKIAlzdHJ1Y3QgbmFtZWlkYXRhIG5kLCBvbGRfbmQ7CkBAIC0yMTQyLDEwICsyMjMwLDEwIEBACiAJaWYgKElTX0VSUih0bykpCiAJCXJldHVybiBQVFJfRVJSKHRvKTsKIAotCWVycm9yID0gX191c2VyX3dhbGsob2xkbmFtZSwgMCwgJm9sZF9uZCk7CisJZXJyb3IgPSBfX3VzZXJfd2Fsa19mZChvbGRkZmQsIG9sZG5hbWUsIDAsICZvbGRfbmQpOwogCWlmIChlcnJvcikKIAkJZ290byBleGl0OwotCWVycm9yID0gcGF0aF9sb29rdXAodG8sIExPT0tVUF9QQVJFTlQsICZuZCk7CisJZXJyb3IgPSBkb19wYXRoX2xvb2t1cChuZXdkZmQsIHRvLCBMT09LVVBfUEFSRU5ULCAmbmQpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7CiAJZXJyb3IgPSAtRVhERVY7CkBAIC0yMTU3LDcgKzIyNDUsNyBAQAogCQllcnJvciA9IHZmc19saW5rKG9sZF9uZC5kZW50cnksIG5kLmRlbnRyeS0+ZF9pbm9kZSwgbmV3X2RlbnRyeSk7CiAJCWRwdXQobmV3X2RlbnRyeSk7CiAJfQotCXVwKCZuZC5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJm5kLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiBvdXRfcmVsZWFzZToKIAlwYXRoX3JlbGVhc2UoJm5kKTsKIG91dDoKQEAgLTIxNjgsNiArMjI1NiwxMSBAQAogCXJldHVybiBlcnJvcjsKIH0KIAorYXNtbGlua2FnZSBsb25nIHN5c19saW5rKGNvbnN0IGNoYXIgX191c2VyICpvbGRuYW1lLCBjb25zdCBjaGFyIF9fdXNlciAqbmV3bmFtZSkKK3sKKwlyZXR1cm4gc3lzX2xpbmthdChBVF9GRENXRCwgb2xkbmFtZSwgQVRfRkRDV0QsIG5ld25hbWUpOworfQorCiAvKgogICogVGhlIHdvcnN0IG9mIGFsbCBuYW1lc3BhY2Ugb3BlcmF0aW9ucyAtIHJlbmFtaW5nIGRpcmVjdG9yeS4gIlBlcnZlcnRlZCIKICAqIGRvZXNuJ3QgZXZlbiBzdGFydCB0byBkZXNjcmliZSBpdC4gU29tZWJvZHkgaW4gVUNCIGhhZCBhIGhlY2sgb2YgYSB0cmlwLi4uCkBAIC0yMTc4LDcgKzIyNzEsNyBAQAogICoJICAgc2ItPnNfdmZzX3JlbmFtZV9zZW0uIFdlIG1pZ2h0IGJlIG1vcmUgYWNjdXJhdGUsIGJ1dCB0aGF0J3MgYW5vdGhlcgogICoJICAgc3RvcnkuCiAgKgljKSB3ZSBoYXZlIHRvIGxvY2sgX3RocmVlXyBvYmplY3RzIC0gcGFyZW50cyBhbmQgdmljdGltIChpZiBpdCBleGlzdHMpLgotICoJICAgQW5kIHRoYXQgLSBhZnRlciB3ZSBnb3QgLT5pX3NlbSBvbiBwYXJlbnRzICh1bnRpbCB0aGVuIHdlIGRvbid0IGtub3cKKyAqCSAgIEFuZCB0aGF0IC0gYWZ0ZXIgd2UgZ290IC0+aV9tdXRleCBvbiBwYXJlbnRzICh1bnRpbCB0aGVuIHdlIGRvbid0IGtub3cKICAqCSAgIHdoZXRoZXIgdGhlIHRhcmdldCBleGlzdHMpLiAgU29sdXRpb246IHRyeSB0byBiZSBzbWFydCB3aXRoIGxvY2tpbmcKICAqCSAgIG9yZGVyIGZvciBpbm9kZXMuICBXZSByZWx5IG9uIHRoZSBmYWN0IHRoYXQgdHJlZSB0b3BvbG9neSBtYXkgY2hhbmdlCiAgKgkgICBvbmx5IHVuZGVyIC0+c192ZnNfcmVuYW1lX3NlbSBfYW5kXyB0aGF0IHBhcmVudCBvZiB0aGUgb2JqZWN0IHdlCkBAIC0yMTk1LDkgKzIyODgsOSBAQAogICoJICAgc3R1ZmYgaW50byBWRlMpLCBidXQgdGhlIGZvcm1lciBpcyBub3QgZ29pbmcgYXdheS4gU29sdXRpb246IHRoZSBzYW1lCiAgKgkgICB0cmljayBhcyBpbiBybWRpcigpLgogICoJZSkgY29udmVyc2lvbiBmcm9tIGZoYW5kbGUgdG8gZGVudHJ5IG1heSBjb21lIGluIHRoZSB3cm9uZyBtb21lbnQgLSB3aGVuCi0gKgkgICB3ZSBhcmUgcmVtb3ZpbmcgdGhlIHRhcmdldC4gU29sdXRpb246IHdlIHdpbGwgaGF2ZSB0byBncmFiIC0+aV9zZW0KKyAqCSAgIHdlIGFyZSByZW1vdmluZyB0aGUgdGFyZ2V0LiBTb2x1dGlvbjogd2Ugd2lsbCBoYXZlIHRvIGdyYWIgLT5pX211dGV4CiAgKgkgICBpbiB0aGUgZmhhbmRsZV90b19kZW50cnkgY29kZS4gW0ZJWE1FIC0gY3VycmVudCBuZnNmaC5jIHJlbGllcyBvbgotICoJICAgLT5pX3NlbSBvbiBwYXJlbnRzLCB3aGljaCB3b3JrcyBidXQgbGVhZHMgdG8gc29tZSB0cnVlbHkgZXhjZXNzaXZlCisgKgkgICAtPmlfbXV0ZXggb24gcGFyZW50cywgd2hpY2ggd29ya3MgYnV0IGxlYWRzIHRvIHNvbWUgdHJ1ZWx5IGV4Y2Vzc2l2ZQogICoJICAgbG9ja2luZ10uCiAgKi8KIHN0YXRpYyBpbnQgdmZzX3JlbmFtZV9kaXIoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LApAQCAtMjIyMiw3ICsyMzE1LDcgQEAKIAogCXRhcmdldCA9IG5ld19kZW50cnktPmRfaW5vZGU7CiAJaWYgKHRhcmdldCkgewotCQlkb3duKCZ0YXJnZXQtPmlfc2VtKTsKKwkJbXV0ZXhfbG9jaygmdGFyZ2V0LT5pX211dGV4KTsKIAkJZGVudHJ5X3VuaGFzaChuZXdfZGVudHJ5KTsKIAl9CiAJaWYgKGRfbW91bnRwb2ludChvbGRfZGVudHJ5KXx8ZF9tb3VudHBvaW50KG5ld19kZW50cnkpKQpAQCAtMjIzMiw3ICsyMzI1LDcgQEAKIAlpZiAodGFyZ2V0KSB7CiAJCWlmICghZXJyb3IpCiAJCQl0YXJnZXQtPmlfZmxhZ3MgfD0gU19ERUFEOwotCQl1cCgmdGFyZ2V0LT5pX3NlbSk7CisJCW11dGV4X3VubG9jaygmdGFyZ2V0LT5pX211dGV4KTsKIAkJaWYgKGRfdW5oYXNoZWQobmV3X2RlbnRyeSkpCiAJCQlkX3JlaGFzaChuZXdfZGVudHJ5KTsKIAkJZHB1dChuZXdfZGVudHJ5KTsKQEAgLTIyNTUsNyArMjM0OCw3IEBACiAJZGdldChuZXdfZGVudHJ5KTsKIAl0YXJnZXQgPSBuZXdfZGVudHJ5LT5kX2lub2RlOwogCWlmICh0YXJnZXQpCi0JCWRvd24oJnRhcmdldC0+aV9zZW0pOworCQltdXRleF9sb2NrKCZ0YXJnZXQtPmlfbXV0ZXgpOwogCWlmIChkX21vdW50cG9pbnQob2xkX2RlbnRyeSl8fGRfbW91bnRwb2ludChuZXdfZGVudHJ5KSkKIAkJZXJyb3IgPSAtRUJVU1k7CiAJZWxzZQpAQCAtMjI2Niw3ICsyMzU5LDcgQEAKIAkJCWRfbW92ZShvbGRfZGVudHJ5LCBuZXdfZGVudHJ5KTsKIAl9CiAJaWYgKHRhcmdldCkKLQkJdXAoJnRhcmdldC0+aV9zZW0pOworCQltdXRleF91bmxvY2soJnRhcmdldC0+aV9tdXRleCk7CiAJZHB1dChuZXdfZGVudHJ5KTsKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0yMzE0LDcgKzI0MDcsOCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZG9fcmVuYW1lKGNvbnN0IGNoYXIgKiBvbGRuYW1lLCBjb25zdCBjaGFyICogbmV3bmFtZSkKK3N0YXRpYyBpbnQgZG9fcmVuYW1lKGludCBvbGRkZmQsIGNvbnN0IGNoYXIgKm9sZG5hbWUsCisJCQlpbnQgbmV3ZGZkLCBjb25zdCBjaGFyICpuZXduYW1lKQogewogCWludCBlcnJvciA9IDA7CiAJc3RydWN0IGRlbnRyeSAqIG9sZF9kaXIsICogbmV3X2RpcjsKQEAgLTIzMjIsMTEgKzI0MTYsMTEgQEAKIAlzdHJ1Y3QgZGVudHJ5ICogdHJhcDsKIAlzdHJ1Y3QgbmFtZWlkYXRhIG9sZG5kLCBuZXduZDsKIAotCWVycm9yID0gcGF0aF9sb29rdXAob2xkbmFtZSwgTE9PS1VQX1BBUkVOVCwgJm9sZG5kKTsKKwllcnJvciA9IGRvX3BhdGhfbG9va3VwKG9sZGRmZCwgb2xkbmFtZSwgTE9PS1VQX1BBUkVOVCwgJm9sZG5kKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXhpdDsKIAotCWVycm9yID0gcGF0aF9sb29rdXAobmV3bmFtZSwgTE9PS1VQX1BBUkVOVCwgJm5ld25kKTsKKwllcnJvciA9IGRvX3BhdGhfbG9va3VwKG5ld2RmZCwgbmV3bmFtZSwgTE9PS1VQX1BBUkVOVCwgJm5ld25kKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXhpdDE7CiAKQEAgLTIzOTAsNyArMjQ4NCw4IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3JlbmFtZShjb25zdCBjaGFyIF9fdXNlciAqIG9sZG5hbWUsIGNvbnN0IGNoYXIgX191c2VyICogbmV3bmFtZSkKK2FzbWxpbmthZ2UgbG9uZyBzeXNfcmVuYW1lYXQoaW50IG9sZGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKm9sZG5hbWUsCisJCQkgICAgIGludCBuZXdkZmQsIGNvbnN0IGNoYXIgX191c2VyICpuZXduYW1lKQogewogCWludCBlcnJvcjsKIAljaGFyICogZnJvbTsKQEAgLTI0MDIsMTMgKzI0OTcsMTggQEAKIAl0byA9IGdldG5hbWUobmV3bmFtZSk7CiAJZXJyb3IgPSBQVFJfRVJSKHRvKTsKIAlpZiAoIUlTX0VSUih0bykpIHsKLQkJZXJyb3IgPSBkb19yZW5hbWUoZnJvbSx0byk7CisJCWVycm9yID0gZG9fcmVuYW1lKG9sZGRmZCwgZnJvbSwgbmV3ZGZkLCB0byk7CiAJCXB1dG5hbWUodG8pOwogCX0KIAlwdXRuYW1lKGZyb20pOwogCXJldHVybiBlcnJvcjsKIH0KIAorYXNtbGlua2FnZSBsb25nIHN5c19yZW5hbWUoY29uc3QgY2hhciBfX3VzZXIgKm9sZG5hbWUsIGNvbnN0IGNoYXIgX191c2VyICpuZXduYW1lKQoreworCXJldHVybiBzeXNfcmVuYW1lYXQoQVRfRkRDV0QsIG9sZG5hbWUsIEFUX0ZEQ1dELCBuZXduYW1lKTsKK30KKwogaW50IHZmc19yZWFkbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgX191c2VyICpidWZmZXIsIGludCBidWZsZW4sIGNvbnN0IGNoYXIgKmxpbmspCiB7CiAJaW50IGxlbjsKQEAgLTI1NTIsNiArMjY1Miw3IEBACiB9OwogCiBFWFBPUlRfU1lNQk9MKF9fdXNlcl93YWxrKTsKK0VYUE9SVF9TWU1CT0woX191c2VyX3dhbGtfZmQpOwogRVhQT1JUX1NZTUJPTChmb2xsb3dfZG93bik7CiBFWFBPUlRfU1lNQk9MKGZvbGxvd191cCk7CiBFWFBPUlRfU1lNQk9MKGdldF93cml0ZV9hY2Nlc3MpOyAvKiBiaW5mbXRfYW91dCAqLwpkaWZmIC0tZ2l0IGEvZnMvbmFtZXNwYWNlLmMgYi9mcy9uYW1lc3BhY2UuYwppbmRleCAyMDE5ODk5Zi4uY2U5N2JlYyAxMDA2NDQKLS0tIGEvZnMvbmFtZXNwYWNlLmMKKysrIGIvZnMvbmFtZXNwYWNlLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9hY2N0Lmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZXNwYWNlLmg+CkBAIC00Nyw2ICs0OCwxMCBAQAogc3RhdGljIGttZW1fY2FjaGVfdCAqbW50X2NhY2hlOwogc3RhdGljIHN0cnVjdCByd19zZW1hcGhvcmUgbmFtZXNwYWNlX3NlbTsKIAorLyogL3N5cy9mcyAqLworZGVjbF9zdWJzeXMoZnMsIE5VTEwsIE5VTEwpOworRVhQT1JUX1NZTUJPTF9HUEwoZnNfc3Vic3lzKTsKKwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhhc2goc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAl1bnNpZ25lZCBsb25nIHRtcCA9ICgodW5zaWduZWQgbG9uZyltbnQgLyBMMV9DQUNIRV9CWVRFUyk7CkBAIC0zNTUsMTQgKzM2MCwxNCBAQAogCQl7IE1TX1NZTkNIUk9OT1VTLCAiLHN5bmMiIH0sCiAJCXsgTVNfRElSU1lOQywgIixkaXJzeW5jIiB9LAogCQl7IE1TX01BTkRMT0NLLCAiLG1hbmQiIH0sCi0JCXsgTVNfTk9BVElNRSwgIixub2F0aW1lIiB9LAotCQl7IE1TX05PRElSQVRJTUUsICIsbm9kaXJhdGltZSIgfSwKIAkJeyAwLCBOVUxMIH0KIAl9OwogCXN0YXRpYyBzdHJ1Y3QgcHJvY19mc19pbmZvIG1udF9pbmZvW10gPSB7CiAJCXsgTU5UX05PU1VJRCwgIixub3N1aWQiIH0sCiAJCXsgTU5UX05PREVWLCAiLG5vZGV2IiB9LAogCQl7IE1OVF9OT0VYRUMsICIsbm9leGVjIiB9LAorCQl7IE1OVF9OT0FUSU1FLCAiLG5vYXRpbWUiIH0sCisJCXsgTU5UX05PRElSQVRJTUUsICIsbm9kaXJhdGltZSIgfSwKIAkJeyAwLCBOVUxMIH0KIAl9OwogCXN0cnVjdCBwcm9jX2ZzX2luZm8gKmZzX2luZm9wOwpAQCAtNDUxLDcgKzQ1Niw3IEBACiB2b2lkIHJlbGVhc2VfbW91bnRzKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7CiAJc3RydWN0IHZmc21vdW50ICptbnQ7Ci0Jd2hpbGUoIWxpc3RfZW1wdHkoaGVhZCkpIHsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKIAkJbW50ID0gbGlzdF9lbnRyeShoZWFkLT5uZXh0LCBzdHJ1Y3QgdmZzbW91bnQsIG1udF9oYXNoKTsKIAkJbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfaGFzaCk7CiAJCWlmIChtbnQtPm1udF9wYXJlbnQgIT0gbW50KSB7CkBAIC04MTQsNyArODE5LDcgQEAKIAkJcmV0dXJuIC1FTk9URElSOwogCiAJZXJyID0gLUVOT0VOVDsKLQlkb3duKCZuZC0+ZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmbmQtPmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJaWYgKElTX0RFQURESVIobmQtPmRlbnRyeS0+ZF9pbm9kZSkpCiAJCWdvdG8gb3V0X3VubG9jazsKIApAQCAtODI2LDcgKzgzMSw3IEBACiAJaWYgKElTX1JPT1QobmQtPmRlbnRyeSkgfHwgIWRfdW5oYXNoZWQobmQtPmRlbnRyeSkpCiAJCWVyciA9IGF0dGFjaF9yZWN1cnNpdmVfbW50KG1udCwgbmQsIE5VTEwpOwogb3V0X3VubG9jazoKLQl1cCgmbmQtPmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmbmQtPmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJaWYgKCFlcnIpCiAJCXNlY3VyaXR5X3NiX3Bvc3RfYWRkbW91bnQobW50LCBuZCk7CiAJcmV0dXJuIGVycjsKQEAgLTk2Miw3ICs5NjcsNyBAQAogCQlnb3RvIG91dDsKIAogCWVyciA9IC1FTk9FTlQ7Ci0JZG93bigmbmQtPmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJm5kLT5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCWlmIChJU19ERUFERElSKG5kLT5kZW50cnktPmRfaW5vZGUpKQogCQlnb3RvIG91dDE7CiAKQEAgLTEwMDQsNyArMTAwOSw3IEBACiAJbGlzdF9kZWxfaW5pdCgmb2xkX25kLm1udC0+bW50X2V4cGlyZSk7CiAJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOwogb3V0MToKLQl1cCgmbmQtPmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmbmQtPmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiBvdXQ6CiAJdXBfd3JpdGUoJm5hbWVzcGFjZV9zZW0pOwogCWlmICghZXJyKQpAQCAtMTI4Niw3ICsxMjkxLDEzIEBACiAJCW1udF9mbGFncyB8PSBNTlRfTk9ERVY7CiAJaWYgKGZsYWdzICYgTVNfTk9FWEVDKQogCQltbnRfZmxhZ3MgfD0gTU5UX05PRVhFQzsKLQlmbGFncyAmPSB+KE1TX05PU1VJRCB8IE1TX05PRVhFQyB8IE1TX05PREVWIHwgTVNfQUNUSVZFKTsKKwlpZiAoZmxhZ3MgJiBNU19OT0FUSU1FKQorCQltbnRfZmxhZ3MgfD0gTU5UX05PQVRJTUU7CisJaWYgKGZsYWdzICYgTVNfTk9ESVJBVElNRSkKKwkJbW50X2ZsYWdzIHw9IE1OVF9OT0RJUkFUSU1FOworCisJZmxhZ3MgJj0gfihNU19OT1NVSUQgfCBNU19OT0VYRUMgfCBNU19OT0RFViB8IE1TX0FDVElWRSB8CisJCSAgIE1TX05PQVRJTUUgfCBNU19OT0RJUkFUSU1FKTsKIAogCS8qIC4uLiBhbmQgZ2V0IHRoZSBtb3VudHBvaW50ICovCiAJcmV0dmFsID0gcGF0aF9sb29rdXAoZGlyX25hbWUsIExPT0tVUF9GT0xMT1csICZuZCk7CkBAIC0xNTI2LDYgKzE1MzcsMTAgQEAKICAqIHBvaW50ZWQgdG8gYnkgcHV0X29sZCBtdXN0IHlpZWxkIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBuZXdfcm9vdC4gTm8gb3RoZXIKICAqIGZpbGUgc3lzdGVtIG1heSBiZSBtb3VudGVkIG9uIHB1dF9vbGQuIEFmdGVyIGFsbCwgbmV3X3Jvb3QgaXMgYSBtb3VudHBvaW50LgogICoKKyAqIEFsc28sIHRoZSBjdXJyZW50IHJvb3QgY2Fubm90IGJlIG9uIHRoZSAncm9vdGZzJyAoaW5pdGlhbCByYW1mcykgZmlsZXN5c3RlbS4KKyAqIFNlZSBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3JhbWZzLXJvb3Rmcy1pbml0cmFtZnMudHh0IGZvciBhbHRlcm5hdGl2ZXMKKyAqIGluIHRoaXMgc2l0dWF0aW9uLgorICoKICAqIE5vdGVzOgogICogIC0gd2UgZG9uJ3QgbW92ZSByb290L2N3ZCBpZiB0aGV5IGFyZSBub3QgYXQgdGhlIHJvb3QgKHJlYXNvbjogaWYgc29tZXRoaW5nCiAgKiAgICBjYXJlZCBlbm91Z2ggdG8gY2hhbmdlIHRoZW0sIGl0J3MgcHJvYmFibHkgd3JvbmcgdG8gZm9yY2UgdGhlbSBlbHNld2hlcmUpCkBAIC0xNTY5LDcgKzE1ODQsNyBAQAogCXVzZXJfbmQuZGVudHJ5ID0gZGdldChjdXJyZW50LT5mcy0+cm9vdCk7CiAJcmVhZF91bmxvY2soJmN1cnJlbnQtPmZzLT5sb2NrKTsKIAlkb3duX3dyaXRlKCZuYW1lc3BhY2Vfc2VtKTsKLQlkb3duKCZvbGRfbmQuZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmb2xkX25kLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJZXJyb3IgPSAtRUlOVkFMOwogCWlmIChJU19NTlRfU0hBUkVEKG9sZF9uZC5tbnQpIHx8CiAJCUlTX01OVF9TSEFSRUQobmV3X25kLm1udC0+bW50X3BhcmVudCkgfHwKQEAgLTE2MjIsNyArMTYzNyw3IEBACiAJcGF0aF9yZWxlYXNlKCZyb290X3BhcmVudCk7CiAJcGF0aF9yZWxlYXNlKCZwYXJlbnRfbmQpOwogb3V0MjoKLQl1cCgmb2xkX25kLmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmb2xkX25kLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJdXBfd3JpdGUoJm5hbWVzcGFjZV9zZW0pOwogCXBhdGhfcmVsZWFzZSgmdXNlcl9uZCk7CiAJcGF0aF9yZWxlYXNlKCZvbGRfbmQpOwpAQCAtMTcxNCw2ICsxNzI5LDcgQEAKIAkJaS0tOwogCX0gd2hpbGUgKGkpOwogCXN5c2ZzX2luaXQoKTsKKwlzdWJzeXN0ZW1fcmVnaXN0ZXIoJmZzX3N1YnN5cyk7CiAJaW5pdF9yb290ZnMoKTsKIAlpbml0X21vdW50X3RyZWUoKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL25jcGZzL2Rpci5jIGIvZnMvbmNwZnMvZGlyLmMKaW5kZXggYTlmN2E4YS4uY2ZkNzZmNCAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvZGlyLmMKKysrIGIvZnMvbmNwZnMvZGlyLmMKQEAgLTM2NSw3ICszNjUsNyBAQAogCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOwogCW5leHQgPSBwYXJlbnQtPmRfc3ViZGlycy5uZXh0OwogCXdoaWxlIChuZXh0ICE9ICZwYXJlbnQtPmRfc3ViZGlycykgewotCQlkZW50ID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgZGVudHJ5LCBkX2NoaWxkKTsKKwkJZGVudCA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IGRlbnRyeSwgZF91LmRfY2hpbGQpOwogCQlpZiAoKHVuc2lnbmVkIGxvbmcpZGVudC0+ZF9mc2RhdGEgPT0gZnBvcykgewogCQkJaWYgKGRlbnQtPmRfaW5vZGUpCiAJCQkJZGdldF9sb2NrZWQoZGVudCk7CmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9maWxlLmMgYi9mcy9uY3Bmcy9maWxlLmMKaW5kZXggNDk0N2Q5Yi4uOTczYjQ0NCAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvZmlsZS5jCisrKyBiL2ZzL25jcGZzL2ZpbGUuYwpAQCAtMjYyLDcgKzI2Miw3IEBACiAJfQogCXZmcmVlKGJvdW5jZWJ1ZmZlcik7CiAKLQlpbm9kZV91cGRhdGVfdGltZShpbm9kZSwgMSk7CisJZmlsZV91cGRhdGVfdGltZShmaWxlKTsKIAogCSpwcG9zID0gcG9zOwogCmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9pbm9kZS5jIGIvZnMvbmNwZnMvaW5vZGUuYwppbmRleCA4Yzg4MzkyLi5kMjc3YTU4IDEwMDY0NAotLS0gYS9mcy9uY3Bmcy9pbm9kZS5jCisrKyBiL2ZzL25jcGZzL2lub2RlLmMKQEAgLTcxNiwxMCArNzE2LDggQEAKIAlmcHV0KHNlcnZlci0+bmNwX2ZpbHApOwogCWtpbGxfcHJvYyhzZXJ2ZXItPm0ud2RvZ19waWQsIFNJR1RFUk0sIDEpOwogCi0JaWYgKHNlcnZlci0+cHJpdi5kYXRhKSAKLQkJbmNwX2tmcmVlX3Moc2VydmVyLT5wcml2LmRhdGEsIHNlcnZlci0+cHJpdi5sZW4pOwotCWlmIChzZXJ2ZXItPmF1dGgub2JqZWN0X25hbWUpCi0JCW5jcF9rZnJlZV9zKHNlcnZlci0+YXV0aC5vYmplY3RfbmFtZSwgc2VydmVyLT5hdXRoLm9iamVjdF9uYW1lX2xlbik7CisJa2ZyZWUoc2VydmVyLT5wcml2LmRhdGEpOworCWtmcmVlKHNlcnZlci0+YXV0aC5vYmplY3RfbmFtZSk7CiAJdmZyZWUoc2VydmVyLT5wYWNrZXQpOwogCXNiLT5zX2ZzX2luZm8gPSBOVUxMOwogCWtmcmVlKHNlcnZlcik7CkBAIC05NTgsMTEgKzk1Niw2IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotI2lmZGVmIERFQlVHX05DUF9NQUxMT0MKLWludCBuY3BfbWFsbG9jZWQ7Ci1pbnQgbmNwX2N1cnJlbnRfbWFsbG9jZWQ7Ci0jZW5kaWYKLQogc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqbmNwX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKIAlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQogewpAQCAtOTgxLDEwICs5NzQsNiBAQAogCWludCBlcnI7CiAJRFBSSU5USygibmNwZnM6IGluaXRfbW9kdWxlIGNhbGxlZFxuIik7CiAKLSNpZmRlZiBERUJVR19OQ1BfTUFMTE9DCi0JbmNwX21hbGxvY2VkID0gMDsKLQluY3BfY3VycmVudF9tYWxsb2NlZCA9IDA7Ci0jZW5kaWYKIAllcnIgPSBpbml0X2lub2RlY2FjaGUoKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDE7CkBAIC0xMDAzLDEwICs5OTIsNiBAQAogCURQUklOVEsoIm5jcGZzOiBjbGVhbnVwX21vZHVsZSBjYWxsZWRcbiIpOwogCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmbmNwX2ZzX3R5cGUpOwogCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOwotI2lmZGVmIERFQlVHX05DUF9NQUxMT0MKLQlQUklOVEsoIm5jcF9tYWxsb2NlZDogJWRcbiIsIG5jcF9tYWxsb2NlZCk7Ci0JUFJJTlRLKCJuY3BfY3VycmVudF9tYWxsb2NlZDogJWRcbiIsIG5jcF9jdXJyZW50X21hbGxvY2VkKTsKLSNlbmRpZgogfQogCiBtb2R1bGVfaW5pdChpbml0X25jcF9mcykKZGlmZiAtLWdpdCBhL2ZzL25jcGZzL2lvY3RsLmMgYi9mcy9uY3Bmcy9pb2N0bC5jCmluZGV4IGZkM2VmZGMuLmViMzgxM2EgMTAwNjQ0Ci0tLSBhL2ZzL25jcGZzL2lvY3RsLmMKKysrIGIvZnMvbmNwZnMvaW9jdGwuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CkBAIC01MTcsMTAgKzUxOCwxMSBAQAogCQkJaWYgKHVzZXIub2JqZWN0X25hbWVfbGVuID4gTkNQX09CSkVDVF9OQU1FX01BWF9MRU4pCiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQlpZiAodXNlci5vYmplY3RfbmFtZV9sZW4pIHsKLQkJCQluZXduYW1lID0gbmNwX2ttYWxsb2ModXNlci5vYmplY3RfbmFtZV9sZW4sIEdGUF9VU0VSKTsKLQkJCQlpZiAoIW5ld25hbWUpIHJldHVybiAtRU5PTUVNOworCQkJCW5ld25hbWUgPSBrbWFsbG9jKHVzZXIub2JqZWN0X25hbWVfbGVuLCBHRlBfVVNFUik7CisJCQkJaWYgKCFuZXduYW1lKQorCQkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCQlpZiAoY29weV9mcm9tX3VzZXIobmV3bmFtZSwgdXNlci5vYmplY3RfbmFtZSwgdXNlci5vYmplY3RfbmFtZV9sZW4pKSB7Ci0JCQkJCW5jcF9rZnJlZV9zKG5ld25hbWUsIHVzZXIub2JqZWN0X25hbWVfbGVuKTsKKwkJCQkJa2ZyZWUobmV3bmFtZSk7CiAJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCX0KIAkJCX0gZWxzZSB7CkBAIC01MzksOCArNTQxLDggQEAKIAkJCXNlcnZlci0+cHJpdi5sZW4gPSAwOwogCQkJc2VydmVyLT5wcml2LmRhdGEgPSBOVUxMOwogCQkJLyogbGVhdmUgY3JpdGljYWwgc2VjdGlvbiAqLwotCQkJaWYgKG9sZHByaXZhdGUpIG5jcF9rZnJlZV9zKG9sZHByaXZhdGUsIG9sZHByaXZhdGVsZW4pOwotCQkJaWYgKG9sZG5hbWUpIG5jcF9rZnJlZV9zKG9sZG5hbWUsIG9sZG5hbWVsZW4pOworCQkJa2ZyZWUob2xkcHJpdmF0ZSk7CisJCQlrZnJlZShvbGRuYW1lKTsKIAkJCXJldHVybiAwOwogCQl9CiAJY2FzZSBOQ1BfSU9DX0dFVFBSSVZBVEVEQVRBOgpAQCAtNTgwLDEwICs1ODIsMTEgQEAKIAkJCWlmICh1c2VyLmxlbiA+IE5DUF9QUklWQVRFX0RBVEFfTUFYX0xFTikKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCWlmICh1c2VyLmxlbikgewotCQkJCW5ldyA9IG5jcF9rbWFsbG9jKHVzZXIubGVuLCBHRlBfVVNFUik7Ci0JCQkJaWYgKCFuZXcpIHJldHVybiAtRU5PTUVNOworCQkJCW5ldyA9IGttYWxsb2ModXNlci5sZW4sIEdGUF9VU0VSKTsKKwkJCQlpZiAoIW5ldykKKwkJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQkJaWYgKGNvcHlfZnJvbV91c2VyKG5ldywgdXNlci5kYXRhLCB1c2VyLmxlbikpIHsKLQkJCQkJbmNwX2tmcmVlX3MobmV3LCB1c2VyLmxlbik7CisJCQkJCWtmcmVlKG5ldyk7CiAJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCX0KIAkJCX0gZWxzZSB7CkBAIC01OTUsNyArNTk4LDcgQEAKIAkJCXNlcnZlci0+cHJpdi5sZW4gPSB1c2VyLmxlbjsKIAkJCXNlcnZlci0+cHJpdi5kYXRhID0gbmV3OwogCQkJLyogbGVhdmUgY3JpdGljYWwgc2VjdGlvbiAqLwotCQkJaWYgKG9sZCkgbmNwX2tmcmVlX3Mob2xkLCBvbGRsZW4pOworCQkJa2ZyZWUob2xkKTsKIAkJCXJldHVybiAwOwogCQl9CiAKZGlmZiAtLWdpdCBhL2ZzL25jcGZzL25jcGxpYl9rZXJuZWwuaCBiL2ZzL25jcGZzL25jcGxpYl9rZXJuZWwuaAppbmRleCA5ZTRkYzMwLi43OTllNWMyIDEwMDY0NAotLS0gYS9mcy9uY3Bmcy9uY3BsaWJfa2VybmVsLmgKKysrIGIvZnMvbmNwZnMvbmNwbGliX2tlcm5lbC5oCkBAIC0xOTYsNyArMTk2LDcgQEAKIAlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKIAluZXh0ID0gcGFyZW50LT5kX3N1YmRpcnMubmV4dDsKIAl3aGlsZSAobmV4dCAhPSAmcGFyZW50LT5kX3N1YmRpcnMpIHsKLQkJZGVudHJ5ID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgZGVudHJ5LCBkX2NoaWxkKTsKKwkJZGVudHJ5ID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgZGVudHJ5LCBkX3UuZF9jaGlsZCk7CiAKIAkJaWYgKGRlbnRyeS0+ZF9mc2RhdGEgPT0gTlVMTCkKIAkJCW5jcF9hZ2VfZGVudHJ5KHNlcnZlciwgZGVudHJ5KTsKQEAgLTIxOCw3ICsyMTgsNyBAQAogCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOwogCW5leHQgPSBwYXJlbnQtPmRfc3ViZGlycy5uZXh0OwogCXdoaWxlIChuZXh0ICE9ICZwYXJlbnQtPmRfc3ViZGlycykgewotCQlkZW50cnkgPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCBkZW50cnksIGRfY2hpbGQpOworCQlkZW50cnkgPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCBkZW50cnksIGRfdS5kX2NoaWxkKTsKIAkJZGVudHJ5LT5kX2ZzZGF0YSA9IE5VTEw7CiAJCW5jcF9hZ2VfZGVudHJ5KHNlcnZlciwgZGVudHJ5KTsKIAkJbmV4dCA9IG5leHQtPm5leHQ7CmRpZmYgLS1naXQgYS9mcy9uZnMvZGlyLmMgYi9mcy9uZnMvZGlyLmMKaW5kZXggZTkyNTUxOS4uYTE1NTRiZSAxMDA2NDQKLS0tIGEvZnMvbmZzL2Rpci5jCisrKyBiL2ZzL25mcy9kaXIuYwpAQCAtMTk0LDcgKzE5NCw3IEBACiAJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwogCS8qIEVuc3VyZSBjb25zaXN0ZW50IHBhZ2UgYWxpZ25tZW50IG9mIHRoZSBkYXRhLgogCSAqIE5vdGU6IGFzc3VtZXMgd2UgaGF2ZSBleGNsdXNpdmUgYWNjZXNzIHRvIHRoaXMgbWFwcGluZyBlaXRoZXIKLQkgKgkgdGhyb3VnaCBpbm9kZS0+aV9zZW0gb3Igc29tZSBvdGhlciBtZWNoYW5pc20uCisJICoJIHRocm91Z2ggaW5vZGUtPmlfbXV0ZXggb3Igc29tZSBvdGhlciBtZWNoYW5pc20uCiAJICovCiAJaWYgKHBhZ2UtPmluZGV4ID09IDApCiAJCWludmFsaWRhdGVfaW5vZGVfcGFnZXMyX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIFBBR0VfQ0FDSEVfU0laRSwgLTEpOwpAQCAtNTczLDcgKzU3Myw3IEBACiAKIGxvZmZfdCBuZnNfbGxzZWVrX2RpcihzdHJ1Y3QgZmlsZSAqZmlscCwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKIHsKLQlkb3duKCZmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAlzd2l0Y2ggKG9yaWdpbikgewogCQljYXNlIDE6CiAJCQlvZmZzZXQgKz0gZmlscC0+Zl9wb3M7CkBAIC01ODksNyArNTg5LDcgQEAKIAkJKChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqKWZpbHAtPnByaXZhdGVfZGF0YSktPmRpcl9jb29raWUgPSAwOwogCX0KIG91dDoKLQl1cCgmZmlscC0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gb2Zmc2V0OwogfQogCkBAIC0xMDAxLDcgKzEwMDEsNyBAQAogCW9wZW5mbGFncyAmPSB+KE9fQ1JFQVR8T19UUlVOQyk7CiAKIAkvKgotCSAqIE5vdGU6IHdlJ3JlIG5vdCBob2xkaW5nIGlub2RlLT5pX3NlbSBhbmQgc28gbWF5IGJlIHJhY2luZyB3aXRoCisJICogTm90ZTogd2UncmUgbm90IGhvbGRpbmcgaW5vZGUtPmlfbXV0ZXggYW5kIHNvIG1heSBiZSByYWNpbmcgd2l0aAogCSAqIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGRpcmVjdG9yeS4gV2UgdGhlcmVmb3JlIHNhdmUgdGhlCiAJICogY2hhbmdlIGF0dHJpYnV0ZSAqYmVmb3JlKiB3ZSBkbyB0aGUgUlBDIGNhbGwuCiAJICovCkBAIC0xMDUxLDcgKzEwNTEsNyBAQAogCQlyZXR1cm4gZGVudHJ5OwogCWlmICghZGVzYy0+cGx1cyB8fCAhKGVudHJ5LT5mYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUikpCiAJCXJldHVybiBOVUxMOwotCS8qIE5vdGU6IGNhbGxlciBpcyBhbHJlYWR5IGhvbGRpbmcgdGhlIGRpci0+aV9zZW0hICovCisJLyogTm90ZTogY2FsbGVyIGlzIGFscmVhZHkgaG9sZGluZyB0aGUgZGlyLT5pX211dGV4ISAqLwogCWRlbnRyeSA9IGRfYWxsb2MocGFyZW50LCAmbmFtZSk7CiAJaWYgKGRlbnRyeSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL2ZzL25mcy9pbm9kZS5jIGIvZnMvbmZzL2lub2RlLmMKaW5kZXggZTdiZDBkOS4uYTc3ZWU5NSAxMDA2NDQKLS0tIGEvZnMvbmZzL2lub2RlLmMKKysrIGIvZnMvbmZzL2lub2RlLmMKQEAgLTY0NCwxMCArNjQ0LDcgQEAKIAlpZiAobWFwcGluZy0+bnJwYWdlcyA9PSAwKQogCQlyZXR1cm4gMDsKIAl1bm1hcF9tYXBwaW5nX3JhbmdlKG1hcHBpbmcsIDAsIDAsIDApOwotCXJldCA9IGZpbGVtYXBfZmRhdGF3cml0ZShtYXBwaW5nKTsKLQlpZiAocmV0ICE9IDApCi0JCWdvdG8gb3V0OwotCXJldCA9IGZpbGVtYXBfZmRhdGF3YWl0KG1hcHBpbmcpOworCXJldCA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXQobWFwcGluZyk7CiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIG91dDsKIAlyZXQgPSBuZnNfd2JfYWxsKG1hcHBpbmctPmhvc3QpOwpAQCAtODY0LDggKzg2MSw3IEBACiAJbmZzX2JlZ2luX2RhdGFfdXBkYXRlKGlub2RlKTsKIAkvKiBXcml0ZSBhbGwgZGlydHkgZGF0YSBpZiB3ZSdyZSBjaGFuZ2luZyBmaWxlIHBlcm1pc3Npb25zIG9yIHNpemUgKi8KIAlpZiAoKGF0dHItPmlhX3ZhbGlkICYgKEFUVFJfTU9ERXxBVFRSX1VJRHxBVFRSX0dJRHxBVFRSX1NJWkUpKSAhPSAwKSB7Ci0JCWlmIChmaWxlbWFwX2ZkYXRhd3JpdGUoaW5vZGUtPmlfbWFwcGluZykgPT0gMCkKLQkJCWZpbGVtYXBfZmRhdGF3YWl0KGlub2RlLT5pX21hcHBpbmcpOworCQlmaWxlbWFwX3dyaXRlX2FuZF93YWl0KGlub2RlLT5pX21hcHBpbmcpOwogCQluZnNfd2JfYWxsKGlub2RlKTsKIAl9CiAJLyoKQEAgLTk1NCwxMSArOTUwLDIwIEBACiAKIAkvKiBGbHVzaCBvdXQgd3JpdGVzIHRvIHRoZSBzZXJ2ZXIgaW4gb3JkZXIgdG8gdXBkYXRlIGMvbXRpbWUgKi8KIAluZnNfc3luY19pbm9kZShpbm9kZSwgMCwgMCwgRkxVU0hfV0FJVHxGTFVTSF9OT0NPTU1JVCk7Ci0JaWYgKF9fSVNfRkxHKGlub2RlLCBNU19OT0FUSU1FKSkKKworCS8qCisJICogV2UgbWF5IGZvcmNlIGEgZ2V0YXR0ciBpZiB0aGUgdXNlciBjYXJlcyBhYm91dCBhdGltZS4KKwkgKgorCSAqIE5vdGUgdGhhdCB3ZSBvbmx5IGhhdmUgdG8gY2hlY2sgdGhlIHZmc21vdW50IGZsYWdzIGhlcmU6CisJICogIC0gTkZTIGFsd2F5cyBzZXRzIFNfTk9BVElNRSBieSBzbyBjaGVja2luZyBpdCB3b3VsZCBnaXZlIGEKKwkgKiAgICBib2d1cyByZXN1bHQKKwkgKiAgLSBORlMgbmV2ZXIgc2V0cyBNU19OT0FUSU1FIG9yIE1TX05PRElSQVRJTUUgc28gdGhlcmUgaXMKKwkgKiAgICBubyBwb2ludCBpbiBjaGVja2luZyB0aG9zZS4KKwkgKi8KKyAJaWYgKChtbnQtPm1udF9mbGFncyAmIE1OVF9OT0FUSU1FKSB8fAorIAkgICAgKChtbnQtPm1udF9mbGFncyAmIE1OVF9OT0RJUkFUSU1FKSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKSkKIAkJbmVlZF9hdGltZSA9IDA7Ci0JZWxzZSBpZiAoX19JU19GTEcoaW5vZGUsIE1TX05PRElSQVRJTUUpICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCi0JCW5lZWRfYXRpbWUgPSAwOwotCS8qIFdlIG1heSBmb3JjZSBhIGdldGF0dHIgaWYgdGhlIHVzZXIgY2FyZXMgYWJvdXQgYXRpbWUgKi8KKwogCWlmIChuZWVkX2F0aW1lKQogCQllcnIgPSBfX25mc19yZXZhbGlkYXRlX2lub2RlKE5GU19TRVJWRVIoaW5vZGUpLCBpbm9kZSk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mc3Jvb3QuYyBiL2ZzL25mcy9uZnNyb290LmMKaW5kZXggOTg1Y2M1My4uZTg5N2UwMCAxMDA2NDQKLS0tIGEvZnMvbmZzL25mc3Jvb3QuYworKysgYi9mcy9uZnMvbmZzcm9vdC5jCkBAIC0yNzUsNyArMjc1LDkgQEAKIAkJCWNhc2UgT3B0X25vYWNsOgogCQkJCW5mc19kYXRhLmZsYWdzIHw9IE5GU19NT1VOVF9OT0FDTDsKIAkJCQlicmVhazsKLQkJCWRlZmF1bHQgOiAKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUm9vdC1ORlM6IHVua25vd24gIgorCQkJCQkib3B0aW9uOiAlc1xuIiwgcCk7CiAJCQkJcmV0dXJuIDA7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9mcy9uZnNjdGwuYyBiL2ZzL25mc2N0bC5jCmluZGV4IDBiMTQ5MzguLjBkNGNmOTQgMTAwNjQ0Ci0tLSBhL2ZzL25mc2N0bC5jCisrKyBiL2ZzL25mc2N0bC5jCkBAIC01LDYgKzUsNyBAQAogICoKICAqLwogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0cHJvYy5jIGIvZnMvbmZzZC9uZnM0cHJvYy5jCmluZGV4IDM2MWI0MDAuLmEwMGZlODYgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHByb2MuYworKysgYi9mcy9uZnNkL25mczRwcm9jLmMKQEAgLTE5Miw2ICsxOTIsMTQgQEAKIAl9CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7CisKKwkvKiBPcGVub3duZXIgaXMgbm93IHNldCwgc28gc2VxdWVuY2UgaWQgd2lsbCBnZXQgYnVtcGVkLiAgTm93IHdlIG5lZWQKKwkgKiB0aGVzZSBjaGVja3MgYmVmb3JlIHdlIGRvIGFueSBjcmVhdGVzOiAqLworCWlmIChuZnM0X2luX2dyYWNlKCkgJiYgb3Blbi0+b3BfY2xhaW1fdHlwZSAhPSBORlM0X09QRU5fQ0xBSU1fUFJFVklPVVMpCisJCXJldHVybiBuZnNlcnJfZ3JhY2U7CisJaWYgKCFuZnM0X2luX2dyYWNlKCkgJiYgb3Blbi0+b3BfY2xhaW1fdHlwZSA9PSBORlM0X09QRU5fQ0xBSU1fUFJFVklPVVMpCisJCXJldHVybiBuZnNlcnJfbm9fZ3JhY2U7CisKIAlzd2l0Y2ggKG9wZW4tPm9wX2NsYWltX3R5cGUpIHsKIAkJY2FzZSBORlM0X09QRU5fQ0xBSU1fREVMRUdBVEVfQ1VSOgogCQkJc3RhdHVzID0gbmZzZXJyX2ludmFsOwpAQCAtMjEwLDYgKzIxOCw3IEBACiAJCQkJZ290byBvdXQ7CiAJCQlicmVhazsKIAkJY2FzZSBORlM0X09QRU5fQ0xBSU1fUFJFVklPVVM6CisJCQlvcGVuLT5vcF9zdGF0ZW93bmVyLT5zb19jb25maXJtZWQgPSAxOwogCQkJLyoKIAkJCSAqIFRoZSBDVVJSRU5UX0ZIIGlzIGFscmVhZHkgc2V0IHRvIHRoZSBmaWxlIGJlaW5nCiAJCQkgKiBvcGVuZWQuICAoMSkgc2V0IG9wZW4tPm9wX2NpbmZvLCAoMikgc2V0CkBAIC0yMjEsNiArMjMwLDcgQEAKIAkJCQlnb3RvIG91dDsKIAkJCWJyZWFrOwogICAgICAgICAgICAgIAljYXNlIE5GUzRfT1BFTl9DTEFJTV9ERUxFR0FURV9QUkVWOgorCQkJb3Blbi0+b3Bfc3RhdGVvd25lci0+c29fY29uZmlybWVkID0gMTsKIAkJCXByaW50aygiTkZTRDogdW5zdXBwb3J0ZWQgT1BFTiBjbGFpbSB0eXBlICVkXG4iLAogCQkJCW9wZW4tPm9wX2NsYWltX3R5cGUpOwogCQkJc3RhdHVzID0gbmZzZXJyX25vdHN1cHA7CkBAIC01ODQsMzEgKzU5NCwyMyBAQAogewogCWludCBzdGF0dXMgPSBuZnNfb2s7CiAKLQlpZiAoIWN1cnJlbnRfZmgtPmZoX2RlbnRyeSkKLQkJcmV0dXJuIG5mc2Vycl9ub2ZpbGVoYW5kbGU7Ci0KLQlzdGF0dXMgPSBuZnNfb2s7CiAJaWYgKHNldGF0dHItPnNhX2lhdHRyLmlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CiAJCW5mczRfbG9ja19zdGF0ZSgpOwotCQlpZiAoKHN0YXR1cyA9IG5mczRfcHJlcHJvY2Vzc19zdGF0ZWlkX29wKGN1cnJlbnRfZmgsCi0JCQkJCQkmc2V0YXR0ci0+c2Ffc3RhdGVpZCwKLQkJCQkJCUNIRUNLX0ZIIHwgV1JfU1RBVEUsIE5VTEwpKSkgewotCQkJZHByaW50aygiTkZTRDogbmZzZDRfc2V0YXR0cjogY291bGRuJ3QgcHJvY2VzcyBzdGF0ZWlkIVxuIik7Ci0JCQlnb3RvIG91dF91bmxvY2s7Ci0JCX0KKwkJc3RhdHVzID0gbmZzNF9wcmVwcm9jZXNzX3N0YXRlaWRfb3AoY3VycmVudF9maCwKKwkJCSZzZXRhdHRyLT5zYV9zdGF0ZWlkLCBDSEVDS19GSCB8IFdSX1NUQVRFLCBOVUxMKTsKIAkJbmZzNF91bmxvY2tfc3RhdGUoKTsKKwkJaWYgKHN0YXR1cykgeworCQkJZHByaW50aygiTkZTRDogbmZzZDRfc2V0YXR0cjogY291bGRuJ3QgcHJvY2VzcyBzdGF0ZWlkISIpOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQogCX0KIAlzdGF0dXMgPSBuZnNfb2s7CiAJaWYgKHNldGF0dHItPnNhX2FjbCAhPSBOVUxMKQogCQlzdGF0dXMgPSBuZnNkNF9zZXRfbmZzNF9hY2wocnFzdHAsIGN1cnJlbnRfZmgsIHNldGF0dHItPnNhX2FjbCk7CiAJaWYgKHN0YXR1cykKLQkJZ290byBvdXQ7CisJCXJldHVybiBzdGF0dXM7CiAJc3RhdHVzID0gbmZzZF9zZXRhdHRyKHJxc3RwLCBjdXJyZW50X2ZoLCAmc2V0YXR0ci0+c2FfaWF0dHIsCiAJCQkJMCwgKHRpbWVfdCkwKTsKLW91dDoKLQlyZXR1cm4gc3RhdHVzOwotb3V0X3VubG9jazoKLQluZnM0X3VubG9ja19zdGF0ZSgpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTYyNiwxNSArNjI4LDE3IEBACiAJCXJldHVybiBuZnNlcnJfaW52YWw7CiAKIAluZnM0X2xvY2tfc3RhdGUoKTsKLQlpZiAoKHN0YXR1cyA9IG5mczRfcHJlcHJvY2Vzc19zdGF0ZWlkX29wKGN1cnJlbnRfZmgsIHN0YXRlaWQsCi0JCQkJCUNIRUNLX0ZIIHwgV1JfU1RBVEUsICZmaWxwKSkpIHsKLQkJZHByaW50aygiTkZTRDogbmZzZDRfd3JpdGU6IGNvdWxkbid0IHByb2Nlc3Mgc3RhdGVpZCFcbiIpOwotCQlnb3RvIG91dDsKLQl9CisJc3RhdHVzID0gbmZzNF9wcmVwcm9jZXNzX3N0YXRlaWRfb3AoY3VycmVudF9maCwgc3RhdGVpZCwKKwkJCQkJQ0hFQ0tfRkggfCBXUl9TVEFURSwgJmZpbHApOwogCWlmIChmaWxwKQogCQlnZXRfZmlsZShmaWxwKTsKIAluZnM0X3VubG9ja19zdGF0ZSgpOwogCisJaWYgKHN0YXR1cykgeworCQlkcHJpbnRrKCJORlNEOiBuZnNkNF93cml0ZTogY291bGRuJ3QgcHJvY2VzcyBzdGF0ZWlkIVxuIik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCiAJd3JpdGUtPndyX2J5dGVzX3dyaXR0ZW4gPSB3cml0ZS0+d3JfYnVmbGVuOwogCXdyaXRlLT53cl9ob3dfd3JpdHRlbiA9IHdyaXRlLT53cl9zdGFibGVfaG93OwogCXAgPSAodTMyICopd3JpdGUtPndyX3ZlcmlmaWVyLmRhdGE7CkBAIC02NTAsOSArNjU0LDYgQEAKIAlpZiAoc3RhdHVzID09IG5mc2Vycl9zeW1saW5rKQogCQlzdGF0dXMgPSBuZnNlcnJfaW52YWw7CiAJcmV0dXJuIHN0YXR1czsKLW91dDoKLQluZnM0X3VubG9ja19zdGF0ZSgpOwotCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qIFRoaXMgcm91dGluZSBuZXZlciByZXR1cm5zIE5GU19PSyEgIElmIHRoZXJlIGFyZSBubyBvdGhlciBlcnJvcnMsIGl0CkBAIC03NjgsNiArNzY5LDggQEAKIAl3aGlsZSAoIXN0YXR1cyAmJiByZXNwLT5vcGNudCA8IGFyZ3MtPm9wY250KSB7CiAJCW9wID0gJmFyZ3MtPm9wc1tyZXNwLT5vcGNudCsrXTsKIAorCQlkcHJpbnRrKCJuZnN2NCBjb21wb3VuZCBvcCAjJWQ6ICVkXG4iLCByZXNwLT5vcGNudCwgb3AtPm9wbnVtKTsKKwogCQkvKgogCQkgKiBUaGUgWERSIGRlY29kZSByb3V0aW5lcyBtYXkgaGF2ZSBwcmUtc2V0IG9wLT5zdGF0dXM7CiAJCSAqIGZvciBleGFtcGxlLCBpZiB0aGVyZSBpcyBhIG1pc2NlbGxhbmVvdXMgWERSIGVycm9yCkBAIC03OTIsMTcgKzc5NSwxMyBAQAogCQkvKiBBbGwgb3BlcmF0aW9ucyBleGNlcHQgUkVORVcsIFNFVENMSUVOVElELCBSRVNUT1JFRkgKIAkJKiBTRVRDTElFTlRJRF9DT05GSVJNLCBQVVRGSCBhbmQgUFVUUk9PVEZICiAJCSogcmVxdWlyZSBhIHZhbGlkIGN1cnJlbnQgZmlsZWhhbmRsZQotCQkqCi0JCSogU0VUQVRUUiBOT0ZJTEVIQU5ETEUgZXJyb3IgaGFuZGxlZCBpbiBuZnNkNF9zZXRhdHRyCi0JCSogZHVlIHRvIHJlcXVpcmVkIHJldHVybmVkIGJpdG1hcCBhcmd1bWVudAogCQkqLwogCQlpZiAoKCFjdXJyZW50X2ZoLT5maF9kZW50cnkpICYmCiAJCSAgICEoKG9wLT5vcG51bSA9PSBPUF9QVVRGSCkgfHwgKG9wLT5vcG51bSA9PSBPUF9QVVRST09URkgpIHx8CiAJCSAgIChvcC0+b3BudW0gPT0gT1BfU0VUQ0xJRU5USUQpIHx8CiAJCSAgIChvcC0+b3BudW0gPT0gT1BfU0VUQ0xJRU5USURfQ09ORklSTSkgfHwKIAkJICAgKG9wLT5vcG51bSA9PSBPUF9SRU5FVykgfHwgKG9wLT5vcG51bSA9PSBPUF9SRVNUT1JFRkgpIHx8Ci0JCSAgIChvcC0+b3BudW0gPT0gT1BfUkVMRUFTRV9MT0NLT1dORVIpIHx8Ci0JCSAgIChvcC0+b3BudW0gPT0gT1BfU0VUQVRUUikpKSB7CisJCSAgIChvcC0+b3BudW0gPT0gT1BfUkVMRUFTRV9MT0NLT1dORVIpKSkgewogCQkJb3AtPnN0YXR1cyA9IG5mc2Vycl9ub2ZpbGVoYW5kbGU7CiAJCQlnb3RvIGVuY29kZV9vcDsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0cmVjb3Zlci5jIGIvZnMvbmZzZC9uZnM0cmVjb3Zlci5jCmluZGV4IDk1NGNmODkuLjA2ZGE3NTAgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHJlY292ZXIuYworKysgYi9mcy9uZnNkL25mczRyZWNvdmVyLmMKQEAgLTEyMSw5ICsxMjEsOSBAQAogc3RhdGljIHZvaWQKIG5mc2Q0X3N5bmNfcmVjX2Rpcih2b2lkKQogewotCWRvd24oJnJlY19kaXIuZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmcmVjX2Rpci5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCW5mc2Rfc3luY19kaXIocmVjX2Rpci5kZW50cnkpOwotCXVwKCZyZWNfZGlyLmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmcmVjX2Rpci5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogfQogCiBpbnQKQEAgLTE0Myw3ICsxNDMsNyBAQAogCW5mczRfc2F2ZV91c2VyKCZ1aWQsICZnaWQpOwogCiAJLyogbG9jayB0aGUgcGFyZW50ICovCi0JZG93bigmcmVjX2Rpci5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZyZWNfZGlyLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAKIAlkZW50cnkgPSBsb29rdXBfb25lX2xlbihkbmFtZSwgcmVjX2Rpci5kZW50cnksIEhFWERJUl9MRU4tMSk7CiAJaWYgKElTX0VSUihkZW50cnkpKSB7CkBAIC0xNTksNyArMTU5LDcgQEAKIG91dF9wdXQ6CiAJZHB1dChkZW50cnkpOwogb3V0X3VubG9jazoKLQl1cCgmcmVjX2Rpci5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJnJlY19kaXIuZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAlpZiAoc3RhdHVzID09IDApIHsKIAkJY2xwLT5jbF9maXJzdHN0YXRlID0gMTsKIAkJbmZzZDRfc3luY19yZWNfZGlyKCk7CkBAIC0yMjIsOCArMjIyLDcgQEAKIAogCW5mczRfc2F2ZV91c2VyKCZ1aWQsICZnaWQpOwogCi0JZmlscCA9IGRlbnRyeV9vcGVuKGRnZXQoZGlyKSwgbW50Z2V0KHJlY19kaXIubW50KSwKLQkJCU9fUkRXUik7CisJZmlscCA9IGRlbnRyeV9vcGVuKGRnZXQoZGlyKSwgbW50Z2V0KHJlY19kaXIubW50KSwgT19SRE9OTFkpOwogCXN0YXR1cyA9IFBUUl9FUlIoZmlscCk7CiAJaWYgKElTX0VSUihmaWxwKSkKIAkJZ290byBvdXQ7CkBAIC0yNTksOSArMjU4LDkgQEAKIAkJcHJpbnRrKCJuZnNkNDogbm9uLWZpbGUgZm91bmQgaW4gY2xpZW50IHJlY292ZXJ5IGRpcmVjdG9yeVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlkb3duKCZkaXItPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZkaXItPmRfaW5vZGUtPmlfbXV0ZXgpOwogCXN0YXR1cyA9IHZmc191bmxpbmsoZGlyLT5kX2lub2RlLCBkZW50cnkpOwotCXVwKCZkaXItPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmRpci0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjc0LDkgKzI3Myw5IEBACiAJICogYW55IHJlZ3VsYXIgZmlsZXMgYW55d2F5LCBqdXN0IGluIGNhc2UgdGhlIGRpcmVjdG9yeSB3YXMgY3JlYXRlZCBieQogCSAqIGEga2VybmVsIGZyb20gdGhlIGZ1dHVyZS4uLi4gKi8KIAluZnNkNF9saXN0X3JlY19kaXIoZGVudHJ5LCBuZnNkNF9yZW1vdmVfY2xpZF9maWxlKTsKLQlkb3duKCZkaXItPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZkaXItPmRfaW5vZGUtPmlfbXV0ZXgpOwogCXN0YXR1cyA9IHZmc19ybWRpcihkaXItPmRfaW5vZGUsIGRlbnRyeSk7Ci0JdXAoJmRpci0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmZGlyLT5kX2lub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0yODgsOSArMjg3LDkgQEAKIAogCWRwcmludGsoIk5GU0Q6IG5mc2Q0X3VubGlua19jbGlkX2Rpci4gbmFtZSAlLipzXG4iLCBuYW1sZW4sIG5hbWUpOwogCi0JZG93bigmcmVjX2Rpci5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZyZWNfZGlyLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJZGVudHJ5ID0gbG9va3VwX29uZV9sZW4obmFtZSwgcmVjX2Rpci5kZW50cnksIG5hbWxlbik7Ci0JdXAoJnJlY19kaXIuZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZyZWNfZGlyLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJaWYgKElTX0VSUihkZW50cnkpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoZGVudHJ5KTsKIAkJcmV0dXJuIHN0YXR1czsKQEAgLTQwMCw5ICszOTksMTAgQEAKIAogCW5mczRfc2F2ZV91c2VyKCZ1aWQsICZnaWQpOwogCi0Jc3RhdHVzID0gcGF0aF9sb29rdXAocmVjX2Rpcm5hbWUsIExPT0tVUF9GT0xMT1csICZyZWNfZGlyKTsKLQlpZiAoc3RhdHVzID09IC1FTk9FTlQpCi0JCXByaW50aygiTkZTRDogcmVjb3ZlcnkgZGlyZWN0b3J5ICVzIGRvZXNuJ3QgZXhpc3RcbiIsCisJc3RhdHVzID0gcGF0aF9sb29rdXAocmVjX2Rpcm5hbWUsIExPT0tVUF9GT0xMT1cgfCBMT09LVVBfRElSRUNUT1JZLAorCQkJJnJlY19kaXIpOworCWlmIChzdGF0dXMpCisJCXByaW50aygiTkZTRDogdW5hYmxlIHRvIGZpbmQgcmVjb3ZlcnkgZGlyZWN0b3J5ICVzXG4iLAogCQkJCXJlY19kaXJuYW1lKTsKIAogCWlmICghc3RhdHVzKQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0c3RhdGUuYyBiL2ZzL25mc2QvbmZzNHN0YXRlLmMKaW5kZXggNmJiZWZkMC4uMTE0M2NmYiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0c3RhdGUuYworKysgYi9mcy9uZnNkL25mczRzdGF0ZS5jCkBAIC0xMDg4LDcgKzEwODgsNyBAQAogCXNvcC0+c29fc2VxaWQgPSBvcGVuLT5vcF9zZXFpZDsKIAlzb3AtPnNvX2NvbmZpcm1lZCA9IDA7CiAJcnAgPSAmc29wLT5zb19yZXBsYXk7Ci0JcnAtPnJwX3N0YXR1cyA9IE5GU0VSUl9TRVJWRVJGQVVMVDsKKwlycC0+cnBfc3RhdHVzID0gbmZzZXJyX3NlcnZlcmZhdWx0OwogCXJwLT5ycF9idWZsZW4gPSAwOwogCXJwLT5ycF9idWYgPSBycC0+cnBfaWJ1ZjsKIAlyZXR1cm4gc29wOwpAQCAtMTE3OCw3ICsxMTc4LDYgQEAKIAkJbG9ja3NfcmVtb3ZlX3Bvc2l4KGZpbHAsIChmbF9vd25lcl90KSBzdHAtPnN0X3N0YXRlb3duZXIpOwogCXB1dF9uZnM0X2ZpbGUoc3RwLT5zdF9maWxlKTsKIAlrbWVtX2NhY2hlX2ZyZWUoc3RhdGVpZF9zbGFiLCBzdHApOwotCXN0cCA9IE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMTkxLDIyICsxMTkwLDYgQEAKIAlzb3AtPnNvX3RpbWUgPSBnZXRfc2Vjb25kcygpOwogfQogCi1zdGF0aWMgdm9pZAotcmVsZWFzZV9zdGF0ZV9vd25lcihzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHAsIGludCBmbGFnKQotewotCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcCA9IHN0cC0+c3Rfc3RhdGVvd25lcjsKLQotCWRwcmludGsoIk5GU0Q6IHJlbGVhc2Vfc3RhdGVfb3duZXJcbiIpOwotCXJlbGVhc2Vfc3RhdGVpZChzdHAsIGZsYWcpOwotCi0JLyogcGxhY2UgdW51c2VkIG5mczRfc3RhdGVvd25lcnMgb24gc29fY2xvc2VfbHJ1IGxpc3QgdG8gYmUKLQkgKiByZWxlYXNlZCBieSB0aGUgbGF1bmRyb21hdCBzZXJ2aWNlIGFmdGVyIHRoZSBsZWFzZSBwZXJpb2QKLQkgKiB0byBlbmFibGUgdXMgdG8gaGFuZGxlIENMT1NFIHJlcGxheQotCSAqLwotCWlmIChzb3AtPnNvX2NvbmZpcm1lZCAmJiBsaXN0X2VtcHR5KCZzb3AtPnNvX3N0YXRlaWRzKSkKLQkJbW92ZV90b19jbG9zZV9scnUoc29wKTsKLX0KLQogc3RhdGljIGludAogY21wX293bmVyX3N0cihzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3AsIHN0cnVjdCB4ZHJfbmV0b2JqICpvd25lciwgY2xpZW50aWRfdCAqY2xpZCkgewogCXJldHVybiAoKHNvcC0+c29fb3duZXIubGVuID09IG93bmVyLT5sZW4pICYmIApAQCAtMTQ0Niw5MiArMTQyOSw2MSBAQAogfTsKIAogCi0vKgotICogbmZzZDRfcHJvY2Vzc19vcGVuMSgpCi0gKiAJbG9va3VwIHN0YXRlb3duZXIuCi0gKiAJCWZvdW5kOgotICogCQkJY2hlY2sgY29uZmlybWVkIAotICogCQkJCWNvbmZpcm1lZDoKLSAqIAkJCQkJY2hlY2sgc2VxaWQKLSAqIAkJCQlub3QgY29uZmlybWVkOgotICogCQkJCQlkZWxldGUgb3duZXIKLSAqIAkJCQkJY3JlYXRlIG5ldyBvd25lcgotICogCQlub3Rmb3VuZDoKLSAqIAkJCXZlcmlmeSBjbGllbnRpZAotICogCQkJY3JlYXRlIG5ldyBvd25lcgotICoKLSAqIGNhbGxlZCB3aXRoIG5mczRfbG9ja19zdGF0ZSgpIGhlbGQuCi0gKi8KIGludAogbmZzZDRfcHJvY2Vzc19vcGVuMShzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbikKIHsKLQlpbnQgc3RhdHVzOwogCWNsaWVudGlkX3QgKmNsaWVudGlkID0gJm9wZW4tPm9wX2NsaWVudGlkOwogCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgc3RyaGFzaHZhbDsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3AgPSBOVUxMOwogCi0Jc3RhdHVzID0gbmZzZXJyX2ludmFsOwogCWlmICghY2hlY2tfbmFtZShvcGVuLT5vcF9vd25lcikpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gbmZzZXJyX2ludmFsOwogCiAJaWYgKFNUQUxFX0NMSUVOVElEKCZvcGVuLT5vcF9jbGllbnRpZCkpCiAJCXJldHVybiBuZnNlcnJfc3RhbGVfY2xpZW50aWQ7CiAKIAlzdHJoYXNodmFsID0gb3duZXJzdHJfaGFzaHZhbChjbGllbnRpZC0+Y2xfaWQsIG9wZW4tPm9wX293bmVyKTsKIAlzb3AgPSBmaW5kX29wZW5zdGF0ZW93bmVyX3N0cihzdHJoYXNodmFsLCBvcGVuKTsKLQlpZiAoc29wKSB7Ci0JCW9wZW4tPm9wX3N0YXRlb3duZXIgPSBzb3A7Ci0JCS8qIGNoZWNrIGZvciByZXBsYXkgKi8KLQkJaWYgKG9wZW4tPm9wX3NlcWlkID09IHNvcC0+c29fc2VxaWQgLSAxKXsKLQkJCWlmIChzb3AtPnNvX3JlcGxheS5ycF9idWZsZW4pCi0JCQkJcmV0dXJuIE5GU0VSUl9SRVBMQVlfTUU7Ci0JCQllbHNlIHsKLQkJCQkvKiBUaGUgb3JpZ2luYWwgT1BFTiBmYWlsZWQgc28gc3BlY3RhY3VsYXJseQotCQkJCSAqIHRoYXQgd2UgZG9uJ3QgZXZlbiBoYXZlIHJlcGxheSBkYXRhIHNhdmVkIQotCQkJCSAqIFRoZXJlZm9yZSwgd2UgaGF2ZSBubyBjaG9pY2UgYnV0IHRvIGNvbnRpbnVlCi0JCQkJICogcHJvY2Vzc2luZyB0aGlzIE9QRU47IHByZXN1bWFibHksIHdlJ2xsCi0JCQkJICogZmFpbCBhZ2FpbiBmb3IgdGhlIHNhbWUgcmVhc29uLgotCQkJCSAqLwotCQkJCWRwcmludGsoIm5mc2Q0X3Byb2Nlc3Nfb3BlbjE6IgotCQkJCQkiIHJlcGxheSB3aXRoIG5vIHJlcGxheSBjYWNoZVxuIik7Ci0JCQkJZ290byByZW5ldzsKLQkJCX0KLQkJfSBlbHNlIGlmIChzb3AtPnNvX2NvbmZpcm1lZCkgewotCQkJaWYgKG9wZW4tPm9wX3NlcWlkID09IHNvcC0+c29fc2VxaWQpCi0JCQkJZ290byByZW5ldzsKLQkJCXN0YXR1cyA9IG5mc2Vycl9iYWRfc2VxaWQ7Ci0JCQlnb3RvIG91dDsKLQkJfSBlbHNlIHsKLQkJCS8qIElmIHdlIGdldCBoZXJlLCB3ZSByZWNlaXZlZCBhbiBPUEVOIGZvciBhbgotCQkJICogdW5jb25maXJtZWQgbmZzNF9zdGF0ZW93bmVyLiBTaW5jZSB0aGUgc2VxaWQncyBhcmUKLQkJCSAqIGRpZmZlcmVudCwgcHVyZ2UgdGhlIGV4aXN0aW5nIG5mczRfc3RhdGVvd25lciwgYW5kCi0JCQkgKiBpbnN0YW50aWF0ZSBhIG5ldyBvbmUuCi0JCQkgKi8KLQkJCWNscCA9IHNvcC0+c29fY2xpZW50OwotCQkJcmVsZWFzZV9zdGF0ZW93bmVyKHNvcCk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBuZnM0X3N0YXRlb3duZXIgbm90IGZvdW5kLgotCQkgKiBWZXJpZnkgY2xpZW50aWQgYW5kIGluc3RhbnRpYXRlIG5ldyBuZnM0X3N0YXRlb3duZXIuCi0JCSAqIElmIHZlcmlmeSBmYWlscyB0aGlzIGlzIHByZXN1bWFibHkgdGhlIHJlc3VsdCBvZiB0aGUKLQkJICogY2xpZW50J3MgbGVhc2UgZXhwaXJpbmcuCi0JCSAqLwotCQlzdGF0dXMgPSBuZnNlcnJfZXhwaXJlZDsKKwlvcGVuLT5vcF9zdGF0ZW93bmVyID0gc29wOworCWlmICghc29wKSB7CisJCS8qIE1ha2Ugc3VyZSB0aGUgY2xpZW50J3MgbGVhc2UgaGFzbid0IGV4cGlyZWQuICovCiAJCWNscCA9IGZpbmRfY29uZmlybWVkX2NsaWVudChjbGllbnRpZCk7CiAJCWlmIChjbHAgPT0gTlVMTCkKLQkJCWdvdG8gb3V0OworCQkJcmV0dXJuIG5mc2Vycl9leHBpcmVkOworCQlnb3RvIHJlbmV3OwogCX0KLQlzdGF0dXMgPSBuZnNlcnJfcmVzb3VyY2U7Ci0Jc29wID0gYWxsb2NfaW5pdF9vcGVuX3N0YXRlb3duZXIoc3RyaGFzaHZhbCwgY2xwLCBvcGVuKTsKLQlpZiAoc29wID09IE5VTEwpCi0JCWdvdG8gb3V0OwotCW9wZW4tPm9wX3N0YXRlb3duZXIgPSBzb3A7CisJaWYgKCFzb3AtPnNvX2NvbmZpcm1lZCkgeworCQkvKiBSZXBsYWNlIHVuY29uZmlybWVkIG93bmVycyB3aXRob3V0IGNoZWNraW5nIGZvciByZXBsYXkuICovCisJCWNscCA9IHNvcC0+c29fY2xpZW50OworCQlyZWxlYXNlX3N0YXRlb3duZXIoc29wKTsKKwkJb3Blbi0+b3Bfc3RhdGVvd25lciA9IE5VTEw7CisJCWdvdG8gcmVuZXc7CisJfQorCWlmIChvcGVuLT5vcF9zZXFpZCA9PSBzb3AtPnNvX3NlcWlkIC0gMSkgeworCQlpZiAoc29wLT5zb19yZXBsYXkucnBfYnVmbGVuKQorCQkJcmV0dXJuIE5GU0VSUl9SRVBMQVlfTUU7CisJCS8qIFRoZSBvcmlnaW5hbCBPUEVOIGZhaWxlZCBzbyBzcGVjdGFjdWxhcmx5CisJCSAqIHRoYXQgd2UgZG9uJ3QgZXZlbiBoYXZlIHJlcGxheSBkYXRhIHNhdmVkIQorCQkgKiBUaGVyZWZvcmUsIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBjb250aW51ZQorCQkgKiBwcm9jZXNzaW5nIHRoaXMgT1BFTjsgcHJlc3VtYWJseSwgd2UnbGwKKwkJICogZmFpbCBhZ2FpbiBmb3IgdGhlIHNhbWUgcmVhc29uLgorCQkgKi8KKwkJZHByaW50aygibmZzZDRfcHJvY2Vzc19vcGVuMTogcmVwbGF5IHdpdGggbm8gcmVwbGF5IGNhY2hlXG4iKTsKKwkJZ290byByZW5ldzsKKwl9CisJaWYgKG9wZW4tPm9wX3NlcWlkICE9IHNvcC0+c29fc2VxaWQpCisJCXJldHVybiBuZnNlcnJfYmFkX3NlcWlkOwogcmVuZXc6Ci0Jc3RhdHVzID0gbmZzX29rOworCWlmIChvcGVuLT5vcF9zdGF0ZW93bmVyID09IE5VTEwpIHsKKwkJc29wID0gYWxsb2NfaW5pdF9vcGVuX3N0YXRlb3duZXIoc3RyaGFzaHZhbCwgY2xwLCBvcGVuKTsKKwkJaWYgKHNvcCA9PSBOVUxMKQorCQkJcmV0dXJuIG5mc2Vycl9yZXNvdXJjZTsKKwkJb3Blbi0+b3Bfc3RhdGVvd25lciA9IHNvcDsKKwl9CisJbGlzdF9kZWxfaW5pdCgmc29wLT5zb19jbG9zZV9scnUpOwogCXJlbmV3X2NsaWVudChzb3AtPnNvX2NsaWVudCk7Ci1vdXQ6Ci0JcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gbmZzX29rOwogfQogCiBzdGF0aWMgaW5saW5lIGludApAQCAtMTY0OCw3ICsxNjAwLDcgQEAKIAlpZiAoIW9wZW4tPm9wX3RydW5jYXRlKQogCQlyZXR1cm4gMDsKIAlpZiAoIShvcGVuLT5vcF9zaGFyZV9hY2Nlc3MgJiBORlM0X1NIQVJFX0FDQ0VTU19XUklURSkpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gbmZzZXJyX2ludmFsOwogCXJldHVybiBuZnNkX3NldGF0dHIocnFzdHAsIGZoLCAmaWF0dHIsIDAsICh0aW1lX3QpMCk7CiB9CiAKQEAgLTE2NTcsMjYgKzE2MDksMjYgQEAKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlscCA9IHN0cC0+c3RfdmZzX2ZpbGU7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOwotCXVuc2lnbmVkIGludCBzaGFyZV9hY2Nlc3M7CisJdW5zaWduZWQgaW50IHNoYXJlX2FjY2VzcywgbmV3X3dyaXRlcjsKIAlpbnQgc3RhdHVzOwogCiAJc2V0X2FjY2Vzcygmc2hhcmVfYWNjZXNzLCBzdHAtPnN0X2FjY2Vzc19ibWFwKTsKLQlzaGFyZV9hY2Nlc3MgPSB+c2hhcmVfYWNjZXNzOwotCXNoYXJlX2FjY2VzcyAmPSBvcGVuLT5vcF9zaGFyZV9hY2Nlc3M7CisJbmV3X3dyaXRlciA9ICh+c2hhcmVfYWNjZXNzKSAmIG9wZW4tPm9wX3NoYXJlX2FjY2VzcworCQkJJiBORlM0X1NIQVJFX0FDQ0VTU19XUklURTsKIAotCWlmICghKHNoYXJlX2FjY2VzcyAmIE5GUzRfU0hBUkVfQUNDRVNTX1dSSVRFKSkKLQkJcmV0dXJuIG5mc2Q0X3RydW5jYXRlKHJxc3RwLCBjdXJfZmgsIG9wZW4pOwotCi0Jc3RhdHVzID0gZ2V0X3dyaXRlX2FjY2Vzcyhpbm9kZSk7Ci0JaWYgKHN0YXR1cykKLQkJcmV0dXJuIG5mc2Vycm5vKHN0YXR1cyk7CisJaWYgKG5ld193cml0ZXIpIHsKKwkJc3RhdHVzID0gZ2V0X3dyaXRlX2FjY2Vzcyhpbm9kZSk7CisJCWlmIChzdGF0dXMpCisJCQlyZXR1cm4gbmZzZXJybm8oc3RhdHVzKTsKKwl9CiAJc3RhdHVzID0gbmZzZDRfdHJ1bmNhdGUocnFzdHAsIGN1cl9maCwgb3Blbik7CiAJaWYgKHN0YXR1cykgewotCQlwdXRfd3JpdGVfYWNjZXNzKGlub2RlKTsKKwkJaWYgKG5ld193cml0ZXIpCisJCQlwdXRfd3JpdGVfYWNjZXNzKGlub2RlKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAJLyogcmVtZW1iZXIgdGhlIG9wZW4gKi8KLQlmaWxwLT5mX21vZGUgPSAoZmlscC0+Zl9tb2RlIHwgRk1PREVfV1JJVEUpICYgfkZNT0RFX1JFQUQ7CisJZmlscC0+Zl9tb2RlIHw9IG9wZW4tPm9wX3NoYXJlX2FjY2VzczsKIAlzZXRfYml0KG9wZW4tPm9wX3NoYXJlX2FjY2VzcywgJnN0cC0+c3RfYWNjZXNzX2JtYXApOwogCXNldF9iaXQob3Blbi0+b3Bfc2hhcmVfZGVueSwgJnN0cC0+c3RfZGVueV9ibWFwKTsKIApAQCAtMTc4MCwxMiArMTczMiw2IEBACiAJc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHAgPSBOVUxMOwogCWludCBzdGF0dXM7CiAKLQlpZiAobmZzNF9pbl9ncmFjZSgpICYmIG9wZW4tPm9wX2NsYWltX3R5cGUgIT0gTkZTNF9PUEVOX0NMQUlNX1BSRVZJT1VTKQotCQlyZXR1cm4gbmZzZXJyX2dyYWNlOwotCi0JaWYgKCFuZnM0X2luX2dyYWNlKCkgJiYgb3Blbi0+b3BfY2xhaW1fdHlwZSA9PSBORlM0X09QRU5fQ0xBSU1fUFJFVklPVVMpCi0JCXJldHVybiBuZnNlcnJfbm9fZ3JhY2U7Ci0KIAlzdGF0dXMgPSBuZnNlcnJfaW52YWw7CiAJaWYgKCFURVNUX0FDQ0VTUyhvcGVuLT5vcF9zaGFyZV9hY2Nlc3MpIHx8ICFURVNUX0RFTlkob3Blbi0+b3Bfc2hhcmVfZGVueSkpCiAJCWdvdG8gb3V0OwpAQCAtMjQyMywxNSArMjM2OSwxOSBAQAogCQkJCQlDSEVDS19GSCB8IE9QRU5fU1RBVEUgfCBDTE9TRV9TVEFURSwKIAkJCQkJJmNsb3NlLT5jbF9zdGF0ZW93bmVyLCAmc3RwLCBOVUxMKSkpCiAJCWdvdG8gb3V0OyAKLQkvKgotCSogIFJldHVybiBzdWNjZXNzLCBidXQgZmlyc3QgdXBkYXRlIHRoZSBzdGF0ZWlkLgotCSovCiAJc3RhdHVzID0gbmZzX29rOwogCXVwZGF0ZV9zdGF0ZWlkKCZzdHAtPnN0X3N0YXRlaWQpOwogCW1lbWNweSgmY2xvc2UtPmNsX3N0YXRlaWQsICZzdHAtPnN0X3N0YXRlaWQsIHNpemVvZihzdGF0ZWlkX3QpKTsKIAotCS8qIHJlbGVhc2Vfc3RhdGVfb3duZXIoKSBjYWxscyBuZnNkX2Nsb3NlKCkgaWYgbmVlZGVkICovCi0JcmVsZWFzZV9zdGF0ZV9vd25lcihzdHAsIE9QRU5fU1RBVEUpOworCS8qIHJlbGVhc2Vfc3RhdGVpZCgpIGNhbGxzIG5mc2RfY2xvc2UoKSBpZiBuZWVkZWQgKi8KKwlyZWxlYXNlX3N0YXRlaWQoc3RwLCBPUEVOX1NUQVRFKTsKKworCS8qIHBsYWNlIHVudXNlZCBuZnM0X3N0YXRlb3duZXJzIG9uIHNvX2Nsb3NlX2xydSBsaXN0IHRvIGJlCisJICogcmVsZWFzZWQgYnkgdGhlIGxhdW5kcm9tYXQgc2VydmljZSBhZnRlciB0aGUgbGVhc2UgcGVyaW9kCisJICogdG8gZW5hYmxlIHVzIHRvIGhhbmRsZSBDTE9TRSByZXBsYXkKKwkgKi8KKwlpZiAobGlzdF9lbXB0eSgmY2xvc2UtPmNsX3N0YXRlb3duZXItPnNvX3N0YXRlaWRzKSkKKwkJbW92ZV90b19jbG9zZV9scnUoY2xvc2UtPmNsX3N0YXRlb3duZXIpOwogb3V0OgogCWlmIChjbG9zZS0+Y2xfc3RhdGVvd25lcikgewogCQluZnM0X2dldF9zdGF0ZW93bmVyKGNsb3NlLT5jbF9zdGF0ZW93bmVyKTsKQEAgLTI2MzMsNyArMjU4Myw3IEBACiAJc29wLT5zb19zZXFpZCA9IGxvY2stPmxrX25ld19sb2NrX3NlcWlkICsgMTsKIAlzb3AtPnNvX2NvbmZpcm1lZCA9IDE7CiAJcnAgPSAmc29wLT5zb19yZXBsYXk7Ci0JcnAtPnJwX3N0YXR1cyA9IE5GU0VSUl9TRVJWRVJGQVVMVDsKKwlycC0+cnBfc3RhdHVzID0gbmZzZXJyX3NlcnZlcmZhdWx0OwogCXJwLT5ycF9idWZsZW4gPSAwOwogCXJwLT5ycF9idWYgPSBycC0+cnBfaWJ1ZjsKIAlyZXR1cm4gc29wOwpAQCAtMjcwMCw2ICsyNjUwLDExIEBACiAJaWYgKGNoZWNrX2xvY2tfbGVuZ3RoKGxvY2stPmxrX29mZnNldCwgbG9jay0+bGtfbGVuZ3RoKSkKIAkJIHJldHVybiBuZnNlcnJfaW52YWw7CiAKKwlpZiAoKHN0YXR1cyA9IGZoX3ZlcmlmeShycXN0cCwgY3VycmVudF9maCwgU19JRlJFRywgTUFZX0xPQ0spKSkgeworCQlkcHJpbnRrKCJORlNEOiBuZnNkNF9sb2NrOiBwZXJtaXNzaW9uIGRlbmllZCFcbiIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwogCW5mczRfbG9ja19zdGF0ZSgpOwogCiAJaWYgKGxvY2stPmxrX2lzX25ldykgewpAQCAtMjcyMCwxMSArMjY3NSwxMSBAQAogCQkJCSAgICAgICAgbG9jay0+bGtfbmV3X29wZW5fc2VxaWQsCiAJCSAgICAgICAgICAgICAgICAgICAgICAgICZsb2NrLT5sa19uZXdfb3Blbl9zdGF0ZWlkLAogCQkgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19GSCB8IE9QRU5fU1RBVEUsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICZsb2NrLT5sa19zdGF0ZW93bmVyLCAmb3Blbl9zdHAsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICZsb2NrLT5sa19yZXBsYXlfb3duZXIsICZvcGVuX3N0cCwKIAkJCQkJbG9jayk7CiAJCWlmIChzdGF0dXMpCiAJCQlnb3RvIG91dDsKLQkJb3Blbl9zb3AgPSBsb2NrLT5sa19zdGF0ZW93bmVyOworCQlvcGVuX3NvcCA9IGxvY2stPmxrX3JlcGxheV9vd25lcjsKIAkJLyogY3JlYXRlIGxvY2tvd25lciBhbmQgbG9jayBzdGF0ZWlkICovCiAJCWZwID0gb3Blbl9zdHAtPnN0X2ZpbGU7CiAJCXN0cmhhc2h2YWwgPSBsb2NrX293bmVyc3RyX2hhc2h2YWwoZnAtPmZpX2lub2RlLCAKQEAgLTI3MzksMjkgKzI2OTQsMjIgQEAKIAkJaWYgKGxvY2tfc29wID09IE5VTEwpCiAJCQlnb3RvIG91dDsKIAkJbG9ja19zdHAgPSBhbGxvY19pbml0X2xvY2tfc3RhdGVpZChsb2NrX3NvcCwgZnAsIG9wZW5fc3RwKTsKLQkJaWYgKGxvY2tfc3RwID09IE5VTEwpIHsKLQkJCXJlbGVhc2Vfc3RhdGVvd25lcihsb2NrX3NvcCk7CisJCWlmIChsb2NrX3N0cCA9PSBOVUxMKQogCQkJZ290byBvdXQ7Ci0JCX0KIAl9IGVsc2UgewogCQkvKiBsb2NrIChsb2NrIG93bmVyICsgbG9jayBzdGF0ZWlkKSBhbHJlYWR5IGV4aXN0cyAqLwogCQlzdGF0dXMgPSBuZnM0X3ByZXByb2Nlc3Nfc2VxaWRfb3AoY3VycmVudF9maCwKIAkJCQkgICAgICAgbG9jay0+bGtfb2xkX2xvY2tfc2VxaWQsIAogCQkJCSAgICAgICAmbG9jay0+bGtfb2xkX2xvY2tfc3RhdGVpZCwgCiAJCQkJICAgICAgIENIRUNLX0ZIIHwgTE9DS19TVEFURSwgCi0JCQkJICAgICAgICZsb2NrLT5sa19zdGF0ZW93bmVyLCAmbG9ja19zdHAsIGxvY2spOworCQkJCSAgICAgICAmbG9jay0+bGtfcmVwbGF5X293bmVyLCAmbG9ja19zdHAsIGxvY2spOwogCQlpZiAoc3RhdHVzKQogCQkJZ290byBvdXQ7Ci0JCWxvY2tfc29wID0gbG9jay0+bGtfc3RhdGVvd25lcjsKKwkJbG9ja19zb3AgPSBsb2NrLT5sa19yZXBsYXlfb3duZXI7CiAJfQotCS8qIGxvY2stPmxrX3N0YXRlb3duZXIgYW5kIGxvY2tfc3RwIGhhdmUgYmVlbiBjcmVhdGVkIG9yIGZvdW5kICovCisJLyogbG9jay0+bGtfcmVwbGF5X293bmVyIGFuZCBsb2NrX3N0cCBoYXZlIGJlZW4gY3JlYXRlZCBvciBmb3VuZCAqLwogCWZpbHAgPSBsb2NrX3N0cC0+c3RfdmZzX2ZpbGU7CiAKLQlpZiAoKHN0YXR1cyA9IGZoX3ZlcmlmeShycXN0cCwgY3VycmVudF9maCwgU19JRlJFRywgTUFZX0xPQ0spKSkgewotCQlkcHJpbnRrKCJORlNEOiBuZnNkNF9sb2NrOiBwZXJtaXNzaW9uIGRlbmllZCFcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KIAlzdGF0dXMgPSBuZnNlcnJfZ3JhY2U7CiAJaWYgKG5mczRfaW5fZ3JhY2UoKSAmJiAhbG9jay0+bGtfcmVjbGFpbSkKIAkJZ290byBvdXQ7CkBAIC0yODAyLDggKzI3NTAsNiBAQAogCSovCiAKIAlzdGF0dXMgPSBwb3NpeF9sb2NrX2ZpbGUoZmlscCwgJmZpbGVfbG9jayk7Ci0JaWYgKGZpbGVfbG9jay5mbF9vcHMgJiYgZmlsZV9sb2NrLmZsX29wcy0+ZmxfcmVsZWFzZV9wcml2YXRlKQotCQlmaWxlX2xvY2suZmxfb3BzLT5mbF9yZWxlYXNlX3ByaXZhdGUoJmZpbGVfbG9jayk7CiAJZHByaW50aygiTkZTRDogbmZzZDRfbG9jazogcG9zaXhfbG9ja19maWxlIHN0YXR1cyAlZFxuIixzdGF0dXMpOwogCXN3aXRjaCAoLXN0YXR1cykgewogCWNhc2UgMDogLyogc3VjY2VzcyEgKi8KQEAgLTI4MTUsOSArMjc2MSwxMiBAQAogCQlnb3RvIGNvbmZsaWN0aW5nX2xvY2s7CiAJY2FzZSAoRURFQURMSyk6CiAJCXN0YXR1cyA9IG5mc2Vycl9kZWFkbG9jazsKLQlkZWZhdWx0OiAgICAgICAgCiAJCWRwcmludGsoIk5GU0Q6IG5mc2Q0X2xvY2s6IHBvc2l4X2xvY2tfZmlsZSgpIGZhaWxlZCEgc3RhdHVzICVkXG4iLHN0YXR1cyk7Ci0JCWdvdG8gb3V0X2Rlc3Ryb3lfbmV3X3N0YXRlaWQ7CisJCWdvdG8gb3V0OworCWRlZmF1bHQ6ICAgICAgICAKKwkJc3RhdHVzID0gbmZzZXJybm8oc3RhdHVzKTsKKwkJZHByaW50aygiTkZTRDogbmZzZDRfbG9jazogcG9zaXhfbG9ja19maWxlKCkgZmFpbGVkISBzdGF0dXMgJWRcbiIsc3RhdHVzKTsKKwkJZ290byBvdXQ7CiAJfQogCiBjb25mbGljdGluZ19sb2NrOgpAQCAtMjgzMSwyMCArMjc4MCwxMiBAQAogCQlnb3RvIG91dDsKIAl9CiAJbmZzNF9zZXRfbG9ja19kZW5pZWQoY29uZmxvY2ssICZsb2NrLT5sa19kZW5pZWQpOwotCi1vdXRfZGVzdHJveV9uZXdfc3RhdGVpZDoKLQlpZiAobG9jay0+bGtfaXNfbmV3KSB7Ci0JCWRwcmludGsoIk5GU0Q6IG5mc2Q0X2xvY2s6IGRlc3Ryb3kgbmV3IHN0YXRlaWQhXG4iKTsKLQkJLyoKLQkJICogQW4gZXJyb3IgZW5jb3VudGVyZWQgYWZ0ZXIgaW5zdGFudGlhdGlvbiBvZiB0aGUgbmV3Ci0JCSAqIHN0YXRlaWQgaGFzIGZvcmNlZCB1cyB0byBkZXN0cm95IGl0LgotCQkgKi8KLQkJcmVsZWFzZV9zdGF0ZV9vd25lcihsb2NrX3N0cCwgTE9DS19TVEFURSk7Ci0JfQogb3V0OgotCWlmIChsb2NrLT5sa19zdGF0ZW93bmVyKSB7Ci0JCW5mczRfZ2V0X3N0YXRlb3duZXIobG9jay0+bGtfc3RhdGVvd25lcik7Ci0JCSpyZXBsYXlfb3duZXIgPSBsb2NrLT5sa19zdGF0ZW93bmVyOworCWlmIChzdGF0dXMgJiYgbG9jay0+bGtfaXNfbmV3ICYmIGxvY2tfc29wKQorCQlyZWxlYXNlX3N0YXRlb3duZXIobG9ja19zb3ApOworCWlmIChsb2NrLT5sa19yZXBsYXlfb3duZXIpIHsKKwkJbmZzNF9nZXRfc3RhdGVvd25lcihsb2NrLT5sa19yZXBsYXlfb3duZXIpOworCQkqcmVwbGF5X293bmVyID0gbG9jay0+bGtfcmVwbGF5X293bmVyOwogCX0KIAluZnM0X3VubG9ja19zdGF0ZSgpOwogCXJldHVybiBzdGF0dXM7CkBAIC0yOTc3LDggKzI5MTgsNiBAQAogCSogIFRyeSB0byB1bmxvY2sgdGhlIGZpbGUgaW4gdGhlIFZGUy4KIAkqLwogCXN0YXR1cyA9IHBvc2l4X2xvY2tfZmlsZShmaWxwLCAmZmlsZV9sb2NrKTsgCi0JaWYgKGZpbGVfbG9jay5mbF9vcHMgJiYgZmlsZV9sb2NrLmZsX29wcy0+ZmxfcmVsZWFzZV9wcml2YXRlKQotCQlmaWxlX2xvY2suZmxfb3BzLT5mbF9yZWxlYXNlX3ByaXZhdGUoJmZpbGVfbG9jayk7CiAJaWYgKHN0YXR1cykgewogCQlkcHJpbnRrKCJORlNEOiBuZnM0X2xvY2t1OiBwb3NpeF9sb2NrX2ZpbGUgZmFpbGVkIVxuIik7CiAJCWdvdG8gb3V0X25mc2VycjsKQEAgLTMwMTYsOSArMjk1NSwxMCBAQAogCiAJbG9ja19rZXJuZWwoKTsKIAlmb3IgKGZscHAgPSAmaW5vZGUtPmlfZmxvY2s7ICpmbHBwICE9IE5VTEw7IGZscHAgPSAmKCpmbHBwKS0+ZmxfbmV4dCkgewotCQlpZiAoKCpmbHBwKS0+Zmxfb3duZXIgPT0gKGZsX293bmVyX3QpbG93bmVyKQorCQlpZiAoKCpmbHBwKS0+Zmxfb3duZXIgPT0gKGZsX293bmVyX3QpbG93bmVyKSB7CiAJCQlzdGF0dXMgPSAxOwogCQkJZ290byBvdXQ7CisJCX0KIAl9CiBvdXQ6CiAJdW5sb2NrX2tlcm5lbCgpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0eGRyLmMgYi9mcy9uZnNkL25mczR4ZHIuYwppbmRleCBkY2Q2NzMxLi42OWQzNTAxIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczR4ZHIuYworKysgYi9mcy9uZnNkL25mczR4ZHIuYwpAQCAtNTI4LDcgKzUyOCw3IEBACiB7CiAJREVDT0RFX0hFQUQ7CiAKLQlsb2NrLT5sa19zdGF0ZW93bmVyID0gTlVMTDsKKwlsb2NrLT5sa19yZXBsYXlfb3duZXIgPSBOVUxMOwogCS8qCiAJKiB0eXBlLCByZWNsYWltKGJvb2xlYW4pLCBvZmZzZXQsIGxlbmd0aCwgbmV3X2xvY2tfb3duZXIoYm9vbGVhbikKIAkqLwpAQCAtMTc2NCwxMCArMTc2NCwxMSBAQAogCQkgKi8KIAkJaWYgKCEoY2QtPnJkX2JtdmFsWzBdICYgRkFUVFI0X1dPUkQwX1JEQVRUUl9FUlJPUikpCiAJCQlnb3RvIGZhaWw7Ci0JCW5mc2VyciA9IG5mc2Vycl90b29zbWFsbDsKIAkJcCA9IG5mc2Q0X2VuY29kZV9yZGF0dHJfZXJyb3IocCwgYnVmbGVuLCBuZnNlcnIpOwotCQlpZiAocCA9PSBOVUxMKQorCQlpZiAocCA9PSBOVUxMKSB7CisJCQluZnNlcnIgPSBuZnNlcnJfdG9vc21hbGw7CiAJCQlnb3RvIGZhaWw7CisJCX0KIAl9CiAJY2QtPmJ1ZmxlbiAtPSAocCAtIGNkLT5idWZmZXIpOwogCWNkLT5idWZmZXIgPSBwOwpAQCAtMTg5NSw3ICsxODk2LDYgQEAKIHN0YXRpYyB2b2lkCiBuZnNkNF9lbmNvZGVfbG9jayhzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9sb2NrICpsb2NrKQogewotCiAJRU5DT0RFX1NFUUlEX09QX0hFQUQ7CiAKIAlpZiAoIW5mc2VycikgewpAQCAtMTkwNiw3ICsxOTA2LDcgQEAKIAl9IGVsc2UgaWYgKG5mc2VyciA9PSBuZnNlcnJfZGVuaWVkKQogCQluZnNkNF9lbmNvZGVfbG9ja19kZW5pZWQocmVzcCwgJmxvY2stPmxrX2RlbmllZCk7CiAKLQlFTkNPREVfU0VRSURfT1BfVEFJTChsb2NrLT5sa19zdGF0ZW93bmVyKTsKKwlFTkNPREVfU0VRSURfT1BfVEFJTChsb2NrLT5sa19yZXBsYXlfb3duZXIpOwogfQogCiBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNwcm9jLmMgYi9mcy9uZnNkL25mc3Byb2MuYwppbmRleCAwYWExYjk2Li4zZTZiNzVjIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mc3Byb2MuYworKysgYi9mcy9uZnNkL25mc3Byb2MuYwpAQCAtMzYsNiArMzYsMjIgQEAKIAlyZXR1cm4gbmZzX29rOwogfQogCitzdGF0aWMgaW50CituZnNkX3JldHVybl9hdHRycyhpbnQgZXJyLCBzdHJ1Y3QgbmZzZF9hdHRyc3RhdCAqcmVzcCkKK3sKKwlpZiAoZXJyKSByZXR1cm4gZXJyOworCXJldHVybiBuZnNlcnJubyh2ZnNfZ2V0YXR0cihyZXNwLT5maC5maF9leHBvcnQtPmV4X21udCwKKwkJCQkgICAgcmVzcC0+ZmguZmhfZGVudHJ5LAorCQkJCSAgICAmcmVzcC0+c3RhdCkpOworfQorc3RhdGljIGludAorbmZzZF9yZXR1cm5fZGlyb3AoaW50IGVyciwgc3RydWN0IG5mc2RfZGlyb3ByZXMgKnJlc3ApCit7CisJaWYgKGVycikgcmV0dXJuIGVycjsKKwlyZXR1cm4gbmZzZXJybm8odmZzX2dldGF0dHIocmVzcC0+ZmguZmhfZXhwb3J0LT5leF9tbnQsCisJCQkJICAgIHJlc3AtPmZoLmZoX2RlbnRyeSwKKwkJCQkgICAgJnJlc3AtPnN0YXQpKTsKK30KIC8qCiAgKiBHZXQgYSBmaWxlJ3MgYXR0cmlidXRlcwogICogTi5CLiBBZnRlciB0aGlzIGNhbGwgcmVzcC0+ZmggbmVlZHMgYW4gZmhfcHV0CkBAIC00NCwxMCArNjAsMTIgQEAKIG5mc2RfcHJvY19nZXRhdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX2ZoYW5kbGUgICphcmdwLAogCQkJCQkgIHN0cnVjdCBuZnNkX2F0dHJzdGF0ICpyZXNwKQogeworCWludCBuZnNlcnI7CiAJZHByaW50aygibmZzZDogR0VUQVRUUiAgJXNcbiIsIFNWQ0ZIX2ZtdCgmYXJncC0+ZmgpKTsKIAogCWZoX2NvcHkoJnJlc3AtPmZoLCAmYXJncC0+ZmgpOwotCXJldHVybiBmaF92ZXJpZnkocnFzdHAsICZyZXNwLT5maCwgMCwgTUFZX05PUCk7CisJbmZzZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCAmcmVzcC0+ZmgsIDAsIE1BWV9OT1ApOworCXJldHVybiBuZnNkX3JldHVybl9hdHRycyhuZnNlcnIsIHJlc3ApOwogfQogCiAvKgpAQCAtNTgsMTIgKzc2LDE0IEBACiBuZnNkX3Byb2Nfc2V0YXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF9zYXR0cmFyZ3MgKmFyZ3AsCiAJCQkJCSAgc3RydWN0IG5mc2RfYXR0cnN0YXQgICpyZXNwKQogeworCWludCBuZnNlcnI7CiAJZHByaW50aygibmZzZDogU0VUQVRUUiAgJXMsIHZhbGlkPSV4LCBzaXplPSVsZFxuIiwKIAkJU1ZDRkhfZm10KCZhcmdwLT5maCksCiAJCWFyZ3AtPmF0dHJzLmlhX3ZhbGlkLCAobG9uZykgYXJncC0+YXR0cnMuaWFfc2l6ZSk7CiAKIAlmaF9jb3B5KCZyZXNwLT5maCwgJmFyZ3AtPmZoKTsKLQlyZXR1cm4gbmZzZF9zZXRhdHRyKHJxc3RwLCAmcmVzcC0+ZmgsICZhcmdwLT5hdHRycywwLCAodGltZV90KTApOworCW5mc2VyciA9IG5mc2Rfc2V0YXR0cihycXN0cCwgJnJlc3AtPmZoLCAmYXJncC0+YXR0cnMsMCwgKHRpbWVfdCkwKTsKKwlyZXR1cm4gbmZzZF9yZXR1cm5fYXR0cnMobmZzZXJyLCByZXNwKTsKIH0KIAogLyoKQEAgLTg2LDcgKzEwNiw3IEBACiAJCQkJICZyZXNwLT5maCk7CiAKIAlmaF9wdXQoJmFyZ3AtPmZoKTsKLQlyZXR1cm4gbmZzZXJyOworCXJldHVybiBuZnNkX3JldHVybl9kaXJvcChuZnNlcnIsIHJlc3ApOwogfQogCiAvKgpAQCAtMTQyLDcgKzE2MiwxMCBAQAogCQkJICAgCSAgYXJncC0+dmVjLCBhcmdwLT52bGVuLAogCQkJCSAgJnJlc3AtPmNvdW50KTsKIAotCXJldHVybiBuZnNlcnI7CisJaWYgKG5mc2VycikgcmV0dXJuIG5mc2VycjsKKwlyZXR1cm4gbmZzZXJybm8odmZzX2dldGF0dHIocmVzcC0+ZmguZmhfZXhwb3J0LT5leF9tbnQsCisJCQkJICAgIHJlc3AtPmZoLmZoX2RlbnRyeSwKKwkJCQkgICAgJnJlc3AtPnN0YXQpKTsKIH0KIAogLyoKQEAgLTE2NSw3ICsxODgsNyBAQAogCQkJCSAgIGFyZ3AtPnZlYywgYXJncC0+dmxlbiwKIAkJCQkgICBhcmdwLT5sZW4sCiAJCQkJICAgJnN0YWJsZSk7Ci0JcmV0dXJuIG5mc2VycjsKKwlyZXR1cm4gbmZzZF9yZXR1cm5fYXR0cnMobmZzZXJyLCByZXNwKTsKIH0KIAogLyoKQEAgLTMyMiw3ICszNDUsNyBAQAogCiBkb25lOgogCWZoX3B1dChkaXJmaHApOwotCXJldHVybiBuZnNlcnI7CisJcmV0dXJuIG5mc2RfcmV0dXJuX2Rpcm9wKG5mc2VyciwgcmVzcCk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTQyNSw3ICs0NDgsNyBAQAogCW5mc2VyciA9IG5mc2RfY3JlYXRlKHJxc3RwLCAmYXJncC0+ZmgsIGFyZ3AtPm5hbWUsIGFyZ3AtPmxlbiwKIAkJCQkgICAgJmFyZ3AtPmF0dHJzLCBTX0lGRElSLCAwLCAmcmVzcC0+ZmgpOwogCWZoX3B1dCgmYXJncC0+ZmgpOwotCXJldHVybiBuZnNlcnI7CisJcmV0dXJuIG5mc2RfcmV0dXJuX2Rpcm9wKG5mc2VyciwgcmVzcCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc3hkci5jIGIvZnMvbmZzZC9uZnN4ZHIuYwppbmRleCBhYTdiYjQxLi5lM2EwNzk3IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mc3hkci5jCisrKyBiL2ZzL25mc2QvbmZzeGRyLmMKQEAgLTM3LDcgKzM3LDcgQEAKIC8qCiAgKiBYRFIgZnVuY3Rpb25zIGZvciBiYXNpYyBORlMgdHlwZXMKICAqLwotc3RhdGljIGlubGluZSB1MzIgKgorc3RhdGljIHUzMiAqCiBkZWNvZGVfZmgodTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCiB7CiAJZmhfaW5pdChmaHAsIE5GU19GSFNJWkUpOwpAQCAtMTUxLDcgKzE1MSw3IEBACiAJcmV0dXJuIHA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyICoKK3N0YXRpYyB1MzIgKgogZW5jb2RlX2ZhdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwLAogCSAgICAgc3RydWN0IGtzdGF0ICpzdGF0KQogewpkaWZmIC0tZ2l0IGEvZnMvbmZzZC92ZnMuYyBiL2ZzL25mc2QvdmZzLmMKaW5kZXggZGY0MDE5Zi4uNTMyMGU1YSAxMDA2NDQKLS0tIGEvZnMvbmZzZC92ZnMuYworKysgYi9mcy9uZnNkL3Zmcy5jCkBAIC00OCw4ICs0OCw4IEBACiAjaW5jbHVkZSA8bGludXgvZnNub3RpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2wuaD4KICNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2xfeGF0dHIuaD4KLSNpZmRlZiBDT05GSUdfTkZTRF9WNAogI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CisjaWZkZWYgQ09ORklHX05GU0RfVjQKICNpbmNsdWRlIDxsaW51eC9uZnM0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmZzNF9hY2wuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNkX2lkbWFwLmg+CkBAIC0zNjUsOCArMzY1LDMwIEBACiAJZ290byBvdXQ7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19ORlNEX1Y0KQorI2lmIGRlZmluZWQoQ09ORklHX05GU0RfVjJfQUNMKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTkZTRF9WM19BQ0wpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19ORlNEX1Y0KQorc3RhdGljIHNzaXplX3QgbmZzZF9nZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmtleSwgdm9pZCAqKmJ1ZikKK3sKKwlzc2l6ZV90IGJ1ZmxlbjsKKwlpbnQgZXJyb3I7CiAKKwlidWZsZW4gPSB2ZnNfZ2V0eGF0dHIoZGVudHJ5LCBrZXksIE5VTEwsIDApOworCWlmIChidWZsZW4gPD0gMCkKKwkJcmV0dXJuIGJ1ZmxlbjsKKworCSpidWYgPSBrbWFsbG9jKGJ1ZmxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCEqYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVycm9yID0gdmZzX2dldHhhdHRyKGRlbnRyeSwga2V5LCAqYnVmLCBidWZsZW4pOworCWlmIChlcnJvciA8IDApCisJCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gYnVmbGVuOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19ORlNEX1Y0KQogc3RhdGljIGludAogc2V0X25mc3Y0X2FjbF9vbmUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcG9zaXhfYWNsICpwYWNsLCBjaGFyICprZXkpCiB7CkBAIC0zNzQsNyArMzk2LDYgQEAKIAlzaXplX3QgYnVmbGVuOwogCWNoYXIgKmJ1ZiA9IE5VTEw7CiAJaW50IGVycm9yID0gMDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCiAJYnVmbGVuID0gcG9zaXhfYWNsX3hhdHRyX3NpemUocGFjbC0+YV9jb3VudCk7CiAJYnVmID0ga21hbGxvYyhidWZsZW4sIEdGUF9LRVJORUwpOwpAQCAtMzg4LDE1ICs0MDksNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQllcnJvciA9IC1FT1BOT1RTVVBQOwotCWlmIChpbm9kZS0+aV9vcCAmJiBpbm9kZS0+aV9vcC0+c2V0eGF0dHIpIHsKLQkJZG93bigmaW5vZGUtPmlfc2VtKTsKLQkJc2VjdXJpdHlfaW5vZGVfc2V0eGF0dHIoZGVudHJ5LCBrZXksIGJ1ZiwgbGVuLCAwKTsKLQkJZXJyb3IgPSBpbm9kZS0+aV9vcC0+c2V0eGF0dHIoZGVudHJ5LCBrZXksIGJ1ZiwgbGVuLCAwKTsKLQkJaWYgKCFlcnJvcikKLQkJCXNlY3VyaXR5X2lub2RlX3Bvc3Rfc2V0eGF0dHIoZGVudHJ5LCBrZXksIGJ1ZiwgbGVuLCAwKTsKLQkJdXAoJmlub2RlLT5pX3NlbSk7Ci0JfQorCWVycm9yID0gdmZzX3NldHhhdHRyKGRlbnRyeSwga2V5LCBidWYsIGxlbiwgMCk7CiBvdXQ6CiAJa2ZyZWUoYnVmKTsKIAlyZXR1cm4gZXJyb3I7CkBAIC00NTUsNDQgKzQ2OCwxOSBAQAogc3RhdGljIHN0cnVjdCBwb3NpeF9hY2wgKgogX2dldF9wb3NpeF9hY2woc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICprZXkpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKLQljaGFyICpidWYgPSBOVUxMOwotCWludCBidWZsZW4sIGVycm9yID0gMDsKKwl2b2lkICpidWYgPSBOVUxMOwogCXN0cnVjdCBwb3NpeF9hY2wgKnBhY2wgPSBOVUxMOworCWludCBidWZsZW47CiAKLQllcnJvciA9IC1FT1BOT1RTVVBQOwotCWlmIChpbm9kZS0+aV9vcCA9PSBOVUxMKQotCQlnb3RvIG91dF9lcnI7Ci0JaWYgKGlub2RlLT5pX29wLT5nZXR4YXR0ciA9PSBOVUxMKQotCQlnb3RvIG91dF9lcnI7Ci0KLQllcnJvciA9IHNlY3VyaXR5X2lub2RlX2dldHhhdHRyKGRlbnRyeSwga2V5KTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0X2VycjsKLQotCWJ1ZmxlbiA9IGlub2RlLT5pX29wLT5nZXR4YXR0cihkZW50cnksIGtleSwgTlVMTCwgMCk7Ci0JaWYgKGJ1ZmxlbiA8PSAwKSB7Ci0JCWVycm9yID0gYnVmbGVuIDwgMCA/IGJ1ZmxlbiA6IC1FTk9EQVRBOwotCQlnb3RvIG91dF9lcnI7Ci0JfQotCi0JYnVmID0ga21hbGxvYyhidWZsZW4sIEdGUF9LRVJORUwpOwotCWlmIChidWYgPT0gTlVMTCkgewotCQllcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X2VycjsKLQl9Ci0KLQllcnJvciA9IGlub2RlLT5pX29wLT5nZXR4YXR0cihkZW50cnksIGtleSwgYnVmLCBidWZsZW4pOwotCWlmIChlcnJvciA8IDApCi0JCWdvdG8gb3V0X2VycjsKKwlidWZsZW4gPSBuZnNkX2dldHhhdHRyKGRlbnRyeSwga2V5LCAmYnVmKTsKKwlpZiAoIWJ1ZmxlbikKKwkJYnVmbGVuID0gLUVOT0RBVEE7CisJaWYgKGJ1ZmxlbiA8PSAwKQorCQlyZXR1cm4gRVJSX1BUUihidWZsZW4pOwogCiAJcGFjbCA9IHBvc2l4X2FjbF9mcm9tX3hhdHRyKGJ1ZiwgYnVmbGVuKTsKLSBvdXQ6CiAJa2ZyZWUoYnVmKTsKIAlyZXR1cm4gcGFjbDsKLSBvdXRfZXJyOgotCXBhY2wgPSBFUlJfUFRSKGVycm9yKTsKLQlnb3RvIG91dDsKIH0KIAogaW50CkBAIC03MjIsMTQgKzcxMCwxNSBAQAogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkcC0+ZF9pbm9kZTsKIAlpbnQgKCpmc3luYykgKHN0cnVjdCBmaWxlICosIHN0cnVjdCBkZW50cnkgKiwgaW50KTsKLQlpbnQgZXJyID0gbmZzX29rOworCWludCBlcnI7CiAKLQlmaWxlbWFwX2ZkYXRhd3JpdGUoaW5vZGUtPmlfbWFwcGluZyk7Ci0JaWYgKGZvcCAmJiAoZnN5bmMgPSBmb3AtPmZzeW5jKSkKLQkJZXJyPWZzeW5jKGZpbHAsIGRwLCAwKTsKLQlmaWxlbWFwX2ZkYXRhd2FpdChpbm9kZS0+aV9tYXBwaW5nKTsKKwllcnIgPSBmaWxlbWFwX2ZkYXRhd3JpdGUoaW5vZGUtPmlfbWFwcGluZyk7CisJaWYgKGVyciA9PSAwICYmIGZvcCAmJiAoZnN5bmMgPSBmb3AtPmZzeW5jKSkKKwkJZXJyID0gZnN5bmMoZmlscCwgZHAsIDApOworCWlmIChlcnIgPT0gMCkKKwkJZXJyID0gZmlsZW1hcF9mZGF0YXdhaXQoaW5vZGUtPmlfbWFwcGluZyk7CiAKLQlyZXR1cm4gbmZzZXJybm8oZXJyKTsKKwlyZXR1cm4gZXJyOwogfQogCQogCkBAIC03MzksMTcgKzcyOCwxNyBAQAogICAgICAgICBpbnQgZXJyOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKIAlkcHJpbnRrKCJuZnNkOiBzeW5jIGZpbGUgJXNcbiIsIGZpbHAtPmZfZGVudHJ5LT5kX25hbWUubmFtZSk7Ci0JZG93bigmaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJZXJyPW5mc2RfZG9zeW5jKGZpbHAsIGZpbHAtPmZfZGVudHJ5LCBmaWxwLT5mX29wKTsKLQl1cCgmaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAogCXJldHVybiBlcnI7CiB9CiAKLXZvaWQKK2ludAogbmZzZF9zeW5jX2RpcihzdHJ1Y3QgZGVudHJ5ICpkcCkKIHsKLQluZnNkX2Rvc3luYyhOVUxMLCBkcCwgZHAtPmRfaW5vZGUtPmlfZm9wKTsKKwlyZXR1cm4gbmZzZF9kb3N5bmMoTlVMTCwgZHAsIGRwLT5kX2lub2RlLT5pX2ZvcCk7CiB9CiAKIC8qCkBAIC04MjYsNyArODE1LDcgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbnQKIG5mc2RfdmZzX3JlYWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKICAgICAgICAgICAgICAgbG9mZl90IG9mZnNldCwgc3RydWN0IGt2ZWMgKnZlYywgaW50IHZsZW4sIHVuc2lnbmVkIGxvbmcgKmNvdW50KQogewpAQCAtODg1LDEyICs4NzQsMTIgQEAKIAlzdHJ1Y3QgaWF0dHIJaWE7CiAJaWEuaWFfdmFsaWQgPSBBVFRSX0tJTExfU1VJRCB8IEFUVFJfS0lMTF9TR0lEOwogCi0JZG93bigmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAlub3RpZnlfY2hhbmdlKGRlbnRyeSwgJmlhKTsKLQl1cCgmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogfQogCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGludAogbmZzZF92ZnNfd3JpdGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCQlsb2ZmX3Qgb2Zmc2V0LCBzdHJ1Y3Qga3ZlYyAqdmVjLCBpbnQgdmxlbiwKIAkgICAJCQl1bnNpZ25lZCBsb25nIGNudCwgaW50ICpzdGFibGVwKQpAQCAtOTAyLDkgKzg5MSw5IEBACiAJaW50CQkJZXJyID0gMDsKIAlpbnQJCQlzdGFibGUgPSAqc3RhYmxlcDsKIAorI2lmZGVmIE1TTkZTCiAJZXJyID0gbmZzZXJyX3Blcm07CiAKLSNpZmRlZiBNU05GUwogCWlmICgoZmhwLT5maF9leHBvcnQtPmV4X2ZsYWdzICYgTkZTRVhQX01TTkZTKSAmJgogCQkoIWxvY2tfbWF5X3dyaXRlKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBvZmZzZXQsIGNudCkpKQogCQlnb3RvIG91dDsKQEAgLTEwNzYsNyArMTA2NSw3IEBACiAJCXJldHVybiBlcnI7CiAJaWYgKEVYX0lTU1lOQyhmaHAtPmZoX2V4cG9ydCkpIHsKIAkJaWYgKGZpbGUtPmZfb3AgJiYgZmlsZS0+Zl9vcC0+ZnN5bmMpIHsKLQkJCWVyciA9IG5mc2Rfc3luYyhmaWxlKTsKKwkJCWVyciA9IG5mc2Vycm5vKG5mc2Rfc3luYyhmaWxlKSk7CiAJCX0gZWxzZSB7CiAJCQllcnIgPSBuZnNlcnJfbm90c3VwcDsKIAkJfQpAQCAtMTE0NCw3ICsxMTMzLDcgQEAKIAkJCQkibmZzZF9jcmVhdGU6IHBhcmVudCAlcy8lcyBub3QgbG9ja2VkIVxuIiwKIAkJCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwKIAkJCQlkZW50cnktPmRfbmFtZS5uYW1lKTsKLQkJCWVyciA9IC1FSU87CisJCQllcnIgPSBuZnNlcnJfaW87CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KQEAgLTExODcsNyArMTE3Niw3IEBACiAJCWdvdG8gb3V0X25mc2VycjsKIAogCWlmIChFWF9JU1NZTkMoZmhwLT5maF9leHBvcnQpKSB7Ci0JCW5mc2Rfc3luY19kaXIoZGVudHJ5KTsKKwkJZXJyID0gbmZzZXJybm8obmZzZF9zeW5jX2RpcihkZW50cnkpKTsKIAkJd3JpdGVfaW5vZGVfbm93KGRjaGlsZC0+ZF9pbm9kZSwgMSk7CiAJfQogCkBAIC0xMTk3LDkgKzExODYsMTEgQEAKIAkgKiBzZW5kIGFsb25nIHRoZSBnaWQgd2hlbiBpdCB0cmllcyB0byBpbXBsZW1lbnQgc2V0Z2lkCiAJICogZGlyZWN0b3JpZXMgdmlhIE5GUy4KIAkgKi8KLQllcnIgPSAwOwotCWlmICgoaWFwLT5pYV92YWxpZCAmPSB+KEFUVFJfVUlEfEFUVFJfR0lEfEFUVFJfTU9ERSkpICE9IDApCi0JCWVyciA9IG5mc2Rfc2V0YXR0cihycXN0cCwgcmVzZmhwLCBpYXAsIDAsICh0aW1lX3QpMCk7CisJaWYgKChpYXAtPmlhX3ZhbGlkICY9IH4oQVRUUl9VSUR8QVRUUl9HSUR8QVRUUl9NT0RFKSkgIT0gMCkgeworCQlpbnQgZXJyMiA9IG5mc2Rfc2V0YXR0cihycXN0cCwgcmVzZmhwLCBpYXAsIDAsICh0aW1lX3QpMCk7CisJCWlmIChlcnIyKQorCQkJZXJyID0gZXJyMjsKKwl9CiAJLyoKIAkgKiBVcGRhdGUgdGhlIGZpbGUgaGFuZGxlIHRvIGdldCB0aGUgbmV3IGlub2RlIGluZm8uCiAJICovCkBAIC0xMzE4LDE3ICsxMzA5LDEwIEBACiAJCWdvdG8gb3V0X25mc2VycjsKIAogCWlmIChFWF9JU1NZTkMoZmhwLT5maF9leHBvcnQpKSB7Ci0JCW5mc2Rfc3luY19kaXIoZGVudHJ5KTsKKwkJZXJyID0gbmZzZXJybm8obmZzZF9zeW5jX2RpcihkZW50cnkpKTsKIAkJLyogc2V0YXR0ciB3aWxsIHN5bmMgdGhlIGNoaWxkIChvciBub3QpICovCiAJfQogCi0JLyoKLQkgKiBVcGRhdGUgdGhlIGZpbGVoYW5kbGUgdG8gZ2V0IHRoZSBuZXcgaW5vZGUgaW5mby4KLQkgKi8KLQllcnIgPSBmaF91cGRhdGUocmVzZmhwKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKLQogCWlmIChjcmVhdGVtb2RlID09IE5GUzNfQ1JFQVRFX0VYQ0xVU0lWRSkgewogCQkvKiBDcmFtIHRoZSB2ZXJpZmllciBpbnRvIGF0aW1lL210aW1lL21vZGUgKi8KIAkJaWFwLT5pYV92YWxpZCA9IEFUVFJfTVRJTUV8QVRUUl9BVElNRQpAQCAtMTM0OSw4ICsxMzMzLDE3IEBACiAJICogaW1wbGVtZW50IHNldGdpZCBkaXJlY3RvcmllcyB2aWEgTkZTLiBDbGVhciBvdXQgYWxsIHRoYXQgY3J1ZnQuCiAJICovCiAgc2V0X2F0dHI6Ci0JaWYgKChpYXAtPmlhX3ZhbGlkICY9IH4oQVRUUl9VSUR8QVRUUl9HSUQpKSAhPSAwKQotIAkJZXJyID0gbmZzZF9zZXRhdHRyKHJxc3RwLCByZXNmaHAsIGlhcCwgMCwgKHRpbWVfdCkwKTsKKwlpZiAoKGlhcC0+aWFfdmFsaWQgJj0gfihBVFRSX1VJRHxBVFRSX0dJRCkpICE9IDApIHsKKyAJCWludCBlcnIyID0gbmZzZF9zZXRhdHRyKHJxc3RwLCByZXNmaHAsIGlhcCwgMCwgKHRpbWVfdCkwKTsKKwkJaWYgKGVycjIpCisJCQllcnIgPSBlcnIyOworCX0KKworCS8qCisJICogVXBkYXRlIHRoZSBmaWxlaGFuZGxlIHRvIGdldCB0aGUgbmV3IGlub2RlIGluZm8uCisJICovCisJaWYgKCFlcnIpCisJCWVyciA9IGZoX3VwZGF0ZShyZXNmaHApOwogCiAgb3V0OgogCWZoX3VubG9jayhmaHApOwpAQCAtMTQ1OSwxMCArMTQ1MiwxMCBAQAogCX0gZWxzZQogCQllcnIgPSB2ZnNfc3ltbGluayhkZW50cnktPmRfaW5vZGUsIGRuZXcsIHBhdGgsIG1vZGUpOwogCi0JaWYgKCFlcnIpIHsKKwlpZiAoIWVycikKIAkJaWYgKEVYX0lTU1lOQyhmaHAtPmZoX2V4cG9ydCkpCi0JCQluZnNkX3N5bmNfZGlyKGRlbnRyeSk7Ci0JfSBlbHNlCisJCQllcnIgPSBuZnNkX3N5bmNfZGlyKGRlbnRyeSk7CisJaWYgKGVycikKIAkJZXJyID0gbmZzZXJybm8oZXJyKTsKIAlmaF91bmxvY2soZmhwKTsKIApAQCAtMTUxOCw3ICsxNTExLDcgQEAKIAllcnIgPSB2ZnNfbGluayhkb2xkLCBkaXJwLCBkbmV3KTsKIAlpZiAoIWVycikgewogCQlpZiAoRVhfSVNTWU5DKGZmaHAtPmZoX2V4cG9ydCkpIHsKLQkJCW5mc2Rfc3luY19kaXIoZGRpcik7CisJCQllcnIgPSBuZnNlcnJubyhuZnNkX3N5bmNfZGlyKGRkaXIpKTsKIAkJCXdyaXRlX2lub2RlX25vdyhkZXN0LCAxKTsKIAkJfQogCX0gZWxzZSB7CkBAIC0xNjAyLDEzICsxNTk1LDE0IEBACiAJaWYgKChmZmhwLT5maF9leHBvcnQtPmV4X2ZsYWdzICYgTkZTRVhQX01TTkZTKSAmJgogCQkoKGF0b21pY19yZWFkKCZvZGVudHJ5LT5kX2NvdW50KSA+IDEpCiAJCSB8fCAoYXRvbWljX3JlYWQoJm5kZW50cnktPmRfY291bnQpID4gMSkpKSB7Ci0JCQllcnIgPSBuZnNlcnJfcGVybTsKKwkJCWVyciA9IC1FUEVSTTsKIAl9IGVsc2UKICNlbmRpZgogCWVyciA9IHZmc19yZW5hbWUoZmRpciwgb2RlbnRyeSwgdGRpciwgbmRlbnRyeSk7CiAJaWYgKCFlcnIgJiYgRVhfSVNTWU5DKHRmaHAtPmZoX2V4cG9ydCkpIHsKLQkJbmZzZF9zeW5jX2Rpcih0ZGVudHJ5KTsKLQkJbmZzZF9zeW5jX2RpcihmZGVudHJ5KTsKKwkJZXJyID0gbmZzZF9zeW5jX2Rpcih0ZGVudHJ5KTsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSBuZnNkX3N5bmNfZGlyKGZkZW50cnkpOwogCX0KIAogIG91dF9kcHV0X25ldzoKQEAgLTE2NzMsNyArMTY2Nyw3IEBACiAjaWZkZWYgTVNORlMKIAkJaWYgKChmaHAtPmZoX2V4cG9ydC0+ZXhfZmxhZ3MgJiBORlNFWFBfTVNORlMpICYmCiAJCQkoYXRvbWljX3JlYWQoJnJkZW50cnktPmRfY291bnQpID4gMSkpIHsKLQkJCWVyciA9IG5mc2Vycl9wZXJtOworCQkJZXJyID0gLUVQRVJNOwogCQl9IGVsc2UKICNlbmRpZgogCQllcnIgPSB2ZnNfdW5saW5rKGRpcnAsIHJkZW50cnkpOwpAQCAtMTY4MywxNyArMTY3NywxNCBAQAogCiAJZHB1dChyZGVudHJ5KTsKIAotCWlmIChlcnIpCi0JCWdvdG8gb3V0X25mc2VycjsKLQlpZiAoRVhfSVNTWU5DKGZocC0+ZmhfZXhwb3J0KSkgCi0JCW5mc2Rfc3luY19kaXIoZGVudHJ5KTsKLQotb3V0OgotCXJldHVybiBlcnI7CisJaWYgKGVyciA9PSAwICYmCisJICAgIEVYX0lTU1lOQyhmaHAtPmZoX2V4cG9ydCkpCisJCQllcnIgPSBuZnNkX3N5bmNfZGlyKGRlbnRyeSk7CiAKIG91dF9uZnNlcnI6CiAJZXJyID0gbmZzZXJybm8oZXJyKTsKLQlnb3RvIG91dDsKK291dDoKKwlyZXR1cm4gZXJyOwogfQogCiAvKgpAQCAtMTg4NCwzOSArMTg3NSwyNSBAQAogCXNzaXplX3Qgc2l6ZTsKIAlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CiAKLQlpZiAoIUlTX1BPU0lYQUNMKGlub2RlKSB8fCAhaW5vZGUtPmlfb3AgfHwgIWlub2RlLT5pX29wLT5nZXR4YXR0cikKKwlpZiAoIUlTX1BPU0lYQUNMKGlub2RlKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApOwotCXN3aXRjaCh0eXBlKSB7Ci0JCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgotCQkJbmFtZSA9IFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1M7Ci0JCQlicmVhazsKLQkJY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgotCQkJbmFtZSA9IFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKKwkJbmFtZSA9IFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1M7CisJCWJyZWFrOworCWNhc2UgQUNMX1RZUEVfREVGQVVMVDoKKwkJbmFtZSA9IFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7CiAJfQogCi0Jc2l6ZSA9IGlub2RlLT5pX29wLT5nZXR4YXR0cihmaHAtPmZoX2RlbnRyeSwgbmFtZSwgTlVMTCwgMCk7CisJc2l6ZSA9IG5mc2RfZ2V0eGF0dHIoZmhwLT5maF9kZW50cnksIG5hbWUsICZ2YWx1ZSk7CisJaWYgKHNpemUgPCAwKQorCQlyZXR1cm4gRVJSX1BUUihzaXplKTsKIAotCWlmIChzaXplIDwgMCkgewotCQlhY2wgPSBFUlJfUFRSKHNpemUpOwotCQlnb3RvIGdldG91dDsKLQl9IGVsc2UgaWYgKHNpemUgPiAwKSB7Ci0JCXZhbHVlID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCF2YWx1ZSkgewotCQkJYWNsID0gRVJSX1BUUigtRU5PTUVNKTsKLQkJCWdvdG8gZ2V0b3V0OwotCQl9Ci0JCXNpemUgPSBpbm9kZS0+aV9vcC0+Z2V0eGF0dHIoZmhwLT5maF9kZW50cnksIG5hbWUsIHZhbHVlLCBzaXplKTsKLQkJaWYgKHNpemUgPCAwKSB7Ci0JCQlhY2wgPSBFUlJfUFRSKHNpemUpOwotCQkJZ290byBnZXRvdXQ7Ci0JCX0KLQl9CiAJYWNsID0gcG9zaXhfYWNsX2Zyb21feGF0dHIodmFsdWUsIHNpemUpOwotCi1nZXRvdXQ6CiAJa2ZyZWUodmFsdWUpOwogCXJldHVybiBhY2w7CiB9CkBAIC0xOTU3LDE2ICsxOTM0LDEzIEBACiAJfSBlbHNlCiAJCXNpemUgPSAwOwogCi0JaWYgKCFmaHAtPmZoX2xvY2tlZCkKLQkJZmhfbG9jayhmaHApOyAgLyogdW5sb2NraW5nIGlzIGRvbmUgYXV0b21hdGljYWxseSAqLwogCWlmIChzaXplKQotCQllcnJvciA9IGlub2RlLT5pX29wLT5zZXR4YXR0cihmaHAtPmZoX2RlbnRyeSwgbmFtZSwKLQkJCQkJICAgICAgdmFsdWUsIHNpemUsIDApOworCQllcnJvciA9IHZmc19zZXR4YXR0cihmaHAtPmZoX2RlbnRyeSwgbmFtZSwgdmFsdWUsIHNpemUsIDApOwogCWVsc2UgewogCQlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgdHlwZSA9PSBBQ0xfVFlQRV9ERUZBVUxUKQogCQkJZXJyb3IgPSAwOwogCQllbHNlIHsKLQkJCWVycm9yID0gaW5vZGUtPmlfb3AtPnJlbW92ZXhhdHRyKGZocC0+ZmhfZGVudHJ5LCBuYW1lKTsKKwkJCWVycm9yID0gdmZzX3JlbW92ZXhhdHRyKGZocC0+ZmhfZGVudHJ5LCBuYW1lKTsKIAkJCWlmIChlcnJvciA9PSAtRU5PREFUQSkKIAkJCQllcnJvciA9IDA7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL250ZnMvYXR0cmliLmMgYi9mcy9udGZzL2F0dHJpYi5jCmluZGV4IGVkYTA1NmIuLjk0ODBhMDUgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvYXR0cmliLmMKKysrIGIvZnMvbnRmcy9hdHRyaWIuYwpAQCAtMTUzMiw3ICsxNTMyLDcgQEAKICAqIE5PVEUgdG8gc2VsZjogTm8gY2hhbmdlcyBpbiB0aGUgYXR0cmlidXRlIGxpc3QgYXJlIHJlcXVpcmVkIHRvIG1vdmUgZnJvbQogICoJCSBhIHJlc2lkZW50IHRvIGEgbm9uLXJlc2lkZW50IGF0dHJpYnV0ZS4KICAqCi0gKiBMb2NraW5nOiAtIFRoZSBjYWxsZXIgbXVzdCBob2xkIGlfc2VtIG9uIHRoZSBpbm9kZS4KKyAqIExvY2tpbmc6IC0gVGhlIGNhbGxlciBtdXN0IGhvbGQgaV9tdXRleCBvbiB0aGUgaW5vZGUuCiAgKi8KIGludCBudGZzX2F0dHJfbWFrZV9ub25fcmVzaWRlbnQobnRmc19pbm9kZSAqbmksIGNvbnN0IHUzMiBkYXRhX3NpemUpCiB7CkBAIC0xNzI4LDcgKzE3MjgsNyBAQAogCS8qCiAJICogVGhpcyBuZWVkcyB0byBiZSBsYXN0IHNpbmNlIHRoZSBhZGRyZXNzIHNwYWNlIG9wZXJhdGlvbnMgLT5yZWFkcGFnZQogCSAqIGFuZCAtPndyaXRlcGFnZSBjYW4gcnVuIGNvbmN1cnJlbnRseSB3aXRoIHVzIGFzIHRoZXkgYXJlIG5vdAotCSAqIHNlcmlhbGl6ZWQgb24gaV9zZW0uICBOb3RlLCB3ZSBhcmUgbm90IGFsbG93ZWQgdG8gZmFpbCBvbmNlIHdlIGZsaXAKKwkgKiBzZXJpYWxpemVkIG9uIGlfbXV0ZXguICBOb3RlLCB3ZSBhcmUgbm90IGFsbG93ZWQgdG8gZmFpbCBvbmNlIHdlIGZsaXAKIAkgKiB0aGlzIHN3aXRjaCwgd2hpY2ggaXMgYW5vdGhlciByZWFzb24gdG8gZG8gdGhpcyBsYXN0LgogCSAqLwogCU5Jbm9TZXROb25SZXNpZGVudChuaSk7CmRpZmYgLS1naXQgYS9mcy9udGZzL2Rpci5jIGIvZnMvbnRmcy9kaXIuYwppbmRleCA3OTVjM2QxLi5iMDY5MGQ0IDEwMDY0NAotLS0gYS9mcy9udGZzL2Rpci5jCisrKyBiL2ZzL250ZnMvZGlyLmMKQEAgLTY5LDcgKzY5LDcgQEAKICAqIHdvcmsgYnV0IHdlIGRvbid0IGNhcmUgZm9yIGhvdyBxdWlja2x5IG9uZSBjYW4gYWNjZXNzIHRoZW0uIFRoaXMgYWxzbyBmaXhlcwogICogdGhlIGRjYWNoZSBhbGlhc2luZyBpc3N1ZXMuCiAgKgotICogTG9ja2luZzogIC0gQ2FsbGVyIG11c3QgaG9sZCBpX3NlbSBvbiB0aGUgZGlyZWN0b3J5LgorICogTG9ja2luZzogIC0gQ2FsbGVyIG11c3QgaG9sZCBpX211dGV4IG9uIHRoZSBkaXJlY3RvcnkuCiAgKgkgICAgIC0gRWFjaCBwYWdlIGNhY2hlIHBhZ2UgaW4gdGhlIGluZGV4IGFsbG9jYXRpb24gbWFwcGluZyBtdXN0IGJlCiAgKgkgICAgICAgbG9ja2VkIHdoaWxzdCBiZWluZyBhY2Nlc3NlZCBvdGhlcndpc2Ugd2UgbWF5IGZpbmQgYSBjb3JydXB0CiAgKgkgICAgICAgcGFnZSBkdWUgdG8gaXQgYmVpbmcgdW5kZXIgLT53cml0ZXBhZ2UgYXQgdGhlIG1vbWVudCB3aGljaApAQCAtMTA4NSwxMSArMTA4NSwxMSBAQAogICogV2hpbGUgdGhpcyB3aWxsIHJldHVybiB0aGUgbmFtZXMgaW4gcmFuZG9tIG9yZGVyIHRoaXMgZG9lc24ndCBtYXR0ZXIgZm9yCiAgKiAtPnJlYWRkaXIgYnV0IE9UT0ggcmVzdWx0cyBpbiBhIGZhc3RlciAtPnJlYWRkaXIuCiAgKgotICogVkZTIGNhbGxzIC0+cmVhZGRpciB3aXRob3V0IEJLTCBidXQgd2l0aCBpX3NlbSBoZWxkLiBUaGlzIHByb3RlY3RzIHRoZSBWRlMKKyAqIFZGUyBjYWxscyAtPnJlYWRkaXIgd2l0aG91dCBCS0wgYnV0IHdpdGggaV9tdXRleCBoZWxkLiBUaGlzIHByb3RlY3RzIHRoZSBWRlMKICAqIHBhcnRzIChlLmcuIC0+Zl9wb3MgYW5kIC0+aV9zaXplLCBhbmQgaXQgYWxzbyBwcm90ZWN0cyBhZ2FpbnN0IGRpcmVjdG9yeQogICogbW9kaWZpY2F0aW9ucykuCiAgKgotICogTG9ja2luZzogIC0gQ2FsbGVyIG11c3QgaG9sZCBpX3NlbSBvbiB0aGUgZGlyZWN0b3J5LgorICogTG9ja2luZzogIC0gQ2FsbGVyIG11c3QgaG9sZCBpX211dGV4IG9uIHRoZSBkaXJlY3RvcnkuCiAgKgkgICAgIC0gRWFjaCBwYWdlIGNhY2hlIHBhZ2UgaW4gdGhlIGluZGV4IGFsbG9jYXRpb24gbWFwcGluZyBtdXN0IGJlCiAgKgkgICAgICAgbG9ja2VkIHdoaWxzdCBiZWluZyBhY2Nlc3NlZCBvdGhlcndpc2Ugd2UgbWF5IGZpbmQgYSBjb3JydXB0CiAgKgkgICAgICAgcGFnZSBkdWUgdG8gaXQgYmVpbmcgdW5kZXIgLT53cml0ZXBhZ2UgYXQgdGhlIG1vbWVudCB3aGljaApAQCAtMTUyMCw3ICsxNTIwLDcgQEAKICAqIE5vdGU6IEluIHRoZSBwYXN0IEBmaWxwIGNvdWxkIGJlIE5VTEwgc28gd2UgaWdub3JlIGl0IGFzIHdlIGRvbid0IG5lZWQgaXQKICAqIGFueXdheS4KICAqCi0gKiBMb2NraW5nOiBDYWxsZXIgbXVzdCBob2xkIGlfc2VtIG9uIHRoZSBpbm9kZS4KKyAqIExvY2tpbmc6IENhbGxlciBtdXN0IGhvbGQgaV9tdXRleCBvbiB0aGUgaW5vZGUuCiAgKgogICogVE9ETzogV2Ugc2hvdWxkIHByb2JhYmx5IGFsc28gd3JpdGUgYWxsIGF0dHJpYnV0ZS9pbmRleCBpbm9kZXMgYXNzb2NpYXRlZAogICogd2l0aCB0aGlzIGlub2RlIGJ1dCBzaW5jZSB3ZSBoYXZlIG5vIHNpbXBsZSB3YXkgb2YgZ2V0dGluZyB0byB0aGVtIHdlIGlnbm9yZQpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9maWxlLmMgYi9mcy9udGZzL2ZpbGUuYwppbmRleCA3Mjc1MzM4Li5mYjQxM2QzIDEwMDY0NAotLS0gYS9mcy9udGZzL2ZpbGUuYworKysgYi9mcy9udGZzL2ZpbGUuYwpAQCAtMTA2LDcgKzEwNiw3IEBACiAgKiB0aGlzIGlzIHRoZSBjYXNlLCB0aGUgbmVjZXNzYXJ5IHplcm9pbmcgd2lsbCBhbHNvIGhhdmUgaGFwcGVuZWQgYW5kIHRoYXQgYWxsCiAgKiBtZXRhZGF0YSBpcyBzZWxmLWNvbnNpc3RlbnQuCiAgKgotICogTG9ja2luZzogaV9zZW0gb24gdGhlIHZmcyBpbm9kZSBjb3Jyc2Vwb25zaW5kIHRvIHRoZSBudGZzIGlub2RlIEBuaSBtdXN0IGJlCisgKiBMb2NraW5nOiBpX211dGV4IG9uIHRoZSB2ZnMgaW5vZGUgY29ycnNlcG9uc2luZCB0byB0aGUgbnRmcyBpbm9kZSBAbmkgbXVzdCBiZQogICoJICAgIGhlbGQgYnkgdGhlIGNhbGxlci4KICAqLwogc3RhdGljIGludCBudGZzX2F0dHJfZXh0ZW5kX2luaXRpYWxpemVkKG50ZnNfaW5vZGUgKm5pLCBjb25zdCBzNjQgbmV3X2luaXRfc2l6ZSwKQEAgLTQ3Myw3ICs0NzMsNyBAQAogICogQGJ5dGVzOgludW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbgogICoKICAqIFRoaXMgaXMgY2FsbGVkIGZvciBub24tcmVzaWRlbnQgYXR0cmlidXRlcyBmcm9tIG50ZnNfZmlsZV9idWZmZXJlZF93cml0ZSgpCi0gKiB3aXRoIGlfc2VtIGhlbGQgb24gdGhlIGlub2RlIChAcGFnZXNbMF0tPm1hcHBpbmctPmhvc3QpLiAgVGhlcmUgYXJlCisgKiB3aXRoIGlfbXV0ZXggaGVsZCBvbiB0aGUgaW5vZGUgKEBwYWdlc1swXS0+bWFwcGluZy0+aG9zdCkuICBUaGVyZSBhcmUKICAqIEBucl9wYWdlcyBwYWdlcyBpbiBAcGFnZXMgd2hpY2ggYXJlIGxvY2tlZCBidXQgbm90IGttYXAoKXBlZC4gIFRoZSBzb3VyY2UKICAqIGRhdGEgaGFzIG5vdCB5ZXQgYmVlbiBjb3BpZWQgaW50byB0aGUgQHBhZ2VzLgogICogCkBAIC0xNjM3LDcgKzE2MzcsNyBAQAogICogQHBvczoJYnl0ZSBwb3NpdGlvbiBpbiBmaWxlIGF0IHdoaWNoIHRoZSB3cml0ZSBiZWdpbnMKICAqIEBieXRlczoJbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4KICAqCi0gKiBUaGlzIGlzIGNhbGxlZCBmcm9tIG50ZnNfZmlsZV9idWZmZXJlZF93cml0ZSgpIHdpdGggaV9zZW0gaGVsZCBvbiB0aGUgaW5vZGUKKyAqIFRoaXMgaXMgY2FsbGVkIGZyb20gbnRmc19maWxlX2J1ZmZlcmVkX3dyaXRlKCkgd2l0aCBpX211dGV4IGhlbGQgb24gdGhlIGlub2RlCiAgKiAoQHBhZ2VzWzBdLT5tYXBwaW5nLT5ob3N0KS4gIFRoZXJlIGFyZSBAbnJfcGFnZXMgcGFnZXMgaW4gQHBhZ2VzIHdoaWNoIGFyZQogICogbG9ja2VkIGJ1dCBub3Qga21hcCgpcGVkLiAgVGhlIHNvdXJjZSBkYXRhIGhhcyBhbHJlYWR5IGJlZW4gY29waWVkIGludG8gdGhlCiAgKiBAcGFnZS4gIG50ZnNfcHJlcGFyZV9wYWdlc19mb3Jfbm9uX3Jlc2lkZW50X3dyaXRlKCkgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZQpAQCAtMTgxNCw3ICsxODE0LDcgQEAKIC8qKgogICogbnRmc19maWxlX2J1ZmZlcmVkX3dyaXRlIC0KICAqCi0gKiBMb2NraW5nOiBUaGUgdmZzIGlzIGhvbGRpbmcgLT5pX3NlbSBvbiB0aGUgaW5vZGUuCisgKiBMb2NraW5nOiBUaGUgdmZzIGlzIGhvbGRpbmcgLT5pX211dGV4IG9uIHRoZSBpbm9kZS4KICAqLwogc3RhdGljIHNzaXplX3QgbnRmc19maWxlX2J1ZmZlcmVkX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwKIAkJY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIHVuc2lnbmVkIGxvbmcgbnJfc2VncywKQEAgLTIxNzMsNyArMjE3Myw3IEBACiAJZXJyID0gcmVtb3ZlX3N1aWQoZmlsZS0+Zl9kZW50cnkpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCWlub2RlX3VwZGF0ZV90aW1lKGlub2RlLCAxKTsKKwlmaWxlX3VwZGF0ZV90aW1lKGZpbGUpOwogCXdyaXR0ZW4gPSBudGZzX2ZpbGVfYnVmZmVyZWRfd3JpdGUoaW9jYiwgaW92LCBucl9zZWdzLCBwb3MsIHBwb3MsCiAJCQljb3VudCk7CiBvdXQ6CkBAIC0yMTk2LDkgKzIxOTYsOSBAQAogCiAJQlVHX09OKGlvY2ItPmtpX3BvcyAhPSBwb3MpOwogCi0JZG93bigmaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJcmV0ID0gbnRmc19maWxlX2Fpb193cml0ZV9ub2xvY2soaW9jYiwgJmxvY2FsX2lvdiwgMSwgJmlvY2ItPmtpX3Bvcyk7Ci0JdXAoJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJaWYgKHJldCA+IDAgJiYgKChmaWxlLT5mX2ZsYWdzICYgT19TWU5DKSB8fCBJU19TWU5DKGlub2RlKSkpIHsKIAkJaW50IGVyciA9IHN5bmNfcGFnZV9yYW5nZShpbm9kZSwgbWFwcGluZywgcG9zLCByZXQpOwogCQlpZiAoZXJyIDwgMCkKQEAgLTIyMjEsMTIgKzIyMjEsMTIgQEAKIAlzdHJ1Y3Qga2lvY2Iga2lvY2I7CiAJc3NpemVfdCByZXQ7CiAKLQlkb3duKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAlpbml0X3N5bmNfa2lvY2IoJmtpb2NiLCBmaWxlKTsKIAlyZXQgPSBudGZzX2ZpbGVfYWlvX3dyaXRlX25vbG9jaygma2lvY2IsIGlvdiwgbnJfc2VncywgcHBvcyk7CiAJaWYgKHJldCA9PSAtRUlPQ0JRVUVVRUQpCiAJCXJldCA9IHdhaXRfb25fc3luY19raW9jYigma2lvY2IpOwotCXVwKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCWlmIChyZXQgPiAwICYmICgoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykgfHwgSVNfU1lOQyhpbm9kZSkpKSB7CiAJCWludCBlcnIgPSBzeW5jX3BhZ2VfcmFuZ2UoaW5vZGUsIG1hcHBpbmcsICpwcG9zIC0gcmV0LCByZXQpOwogCQlpZiAoZXJyIDwgMCkKQEAgLTIyNjksNyArMjI2OSw3IEBACiAgKiBOb3RlOiBJbiB0aGUgcGFzdCBAZmlscCBjb3VsZCBiZSBOVUxMIHNvIHdlIGlnbm9yZSBpdCBhcyB3ZSBkb24ndCBuZWVkIGl0CiAgKiBhbnl3YXkuCiAgKgotICogTG9ja2luZzogQ2FsbGVyIG11c3QgaG9sZCBpX3NlbSBvbiB0aGUgaW5vZGUuCisgKiBMb2NraW5nOiBDYWxsZXIgbXVzdCBob2xkIGlfbXV0ZXggb24gdGhlIGlub2RlLgogICoKICAqIFRPRE86IFdlIHNob3VsZCBwcm9iYWJseSBhbHNvIHdyaXRlIGFsbCBhdHRyaWJ1dGUvaW5kZXggaW5vZGVzIGFzc29jaWF0ZWQKICAqIHdpdGggdGhpcyBpbm9kZSBidXQgc2luY2Ugd2UgaGF2ZSBubyBzaW1wbGUgd2F5IG9mIGdldHRpbmcgdG8gdGhlbSB3ZSBpZ25vcmUKZGlmZiAtLWdpdCBhL2ZzL250ZnMvaW5kZXguYyBiL2ZzL250ZnMvaW5kZXguYwppbmRleCA4ZjJkNTcyLi45ZjU0MjdjIDEwMDY0NAotLS0gYS9mcy9udGZzL2luZGV4LmMKKysrIGIvZnMvbnRmcy9pbmRleC5jCkBAIC0zMiw3ICszMiw3IEBACiAgKiBBbGxvY2F0ZSBhIG5ldyBpbmRleCBjb250ZXh0LCBpbml0aWFsaXplIGl0IHdpdGggQGlkeF9uaSBhbmQgcmV0dXJuIGl0LgogICogUmV0dXJuIE5VTEwgaWYgYWxsb2NhdGlvbiBmYWlsZWQuCiAgKgotICogTG9ja2luZzogIENhbGxlciBtdXN0IGhvbGQgaV9zZW0gb24gdGhlIGluZGV4IGlub2RlLgorICogTG9ja2luZzogIENhbGxlciBtdXN0IGhvbGQgaV9tdXRleCBvbiB0aGUgaW5kZXggaW5vZGUuCiAgKi8KIG50ZnNfaW5kZXhfY29udGV4dCAqbnRmc19pbmRleF9jdHhfZ2V0KG50ZnNfaW5vZGUgKmlkeF9uaSkKIHsKQEAgLTUwLDcgKzUwLDcgQEAKICAqCiAgKiBSZWxlYXNlIHRoZSBpbmRleCBjb250ZXh0IEBpY3R4LCByZWxlYXNpbmcgYWxsIGFzc29jaWF0ZWQgcmVzb3VyY2VzLgogICoKLSAqIExvY2tpbmc6ICBDYWxsZXIgbXVzdCBob2xkIGlfc2VtIG9uIHRoZSBpbmRleCBpbm9kZS4KKyAqIExvY2tpbmc6ICBDYWxsZXIgbXVzdCBob2xkIGlfbXV0ZXggb24gdGhlIGluZGV4IGlub2RlLgogICovCiB2b2lkIG50ZnNfaW5kZXhfY3R4X3B1dChudGZzX2luZGV4X2NvbnRleHQgKmljdHgpCiB7CkBAIC0xMDYsNyArMTA2LDcgQEAKICAqIG9yIG50ZnNfaW5kZXhfZW50cnlfd3JpdGUoKSBiZWZvcmUgdGhlIGNhbGwgdG8gbnRmc19pbmRleF9jdHhfcHV0KCkgdG8KICAqIGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2VzIGFyZSB3cml0dGVuIHRvIGRpc2suCiAgKgotICogTG9ja2luZzogIC0gQ2FsbGVyIG11c3QgaG9sZCBpX3NlbSBvbiB0aGUgaW5kZXggaW5vZGUuCisgKiBMb2NraW5nOiAgLSBDYWxsZXIgbXVzdCBob2xkIGlfbXV0ZXggb24gdGhlIGluZGV4IGlub2RlLgogICoJICAgICAtIEVhY2ggcGFnZSBjYWNoZSBwYWdlIGluIHRoZSBpbmRleCBhbGxvY2F0aW9uIG1hcHBpbmcgbXVzdCBiZQogICoJICAgICAgIGxvY2tlZCB3aGlsc3QgYmVpbmcgYWNjZXNzZWQgb3RoZXJ3aXNlIHdlIG1heSBmaW5kIGEgY29ycnVwdAogICoJICAgICAgIHBhZ2UgZHVlIHRvIGl0IGJlaW5nIHVuZGVyIC0+d3JpdGVwYWdlIGF0IHRoZSBtb21lbnQgd2hpY2gKZGlmZiAtLWdpdCBhL2ZzL250ZnMvaW5vZGUuYyBiL2ZzL250ZnMvaW5vZGUuYwppbmRleCBiMjRmNGM0Li5lYTFiZDNmIDEwMDY0NAotLS0gYS9mcy9udGZzL2lub2RlLmMKKysrIGIvZnMvbnRmcy9pbm9kZS5jCkBAIC0yMTI1LDEzICsyMTI1LDEzIEBACiAJCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKHZpKTsKIAkJaWYgKE5Jbm9JbmRleEFsbG9jUHJlc2VudChuaSkpIHsKIAkJCXN0cnVjdCBpbm9kZSAqYnZpID0gTlVMTDsKLQkJCWRvd24oJnZpLT5pX3NlbSk7CisJCQltdXRleF9sb2NrKCZ2aS0+aV9tdXRleCk7CiAJCQlpZiAoYXRvbWljX3JlYWQoJnZpLT5pX2NvdW50KSA9PSAyKSB7CiAJCQkJYnZpID0gbmktPml0eXBlLmluZGV4LmJtcF9pbm87CiAJCQkJaWYgKGJ2aSkKIAkJCQkJbmktPml0eXBlLmluZGV4LmJtcF9pbm8gPSBOVUxMOwogCQkJfQotCQkJdXAoJnZpLT5pX3NlbSk7CisJCQltdXRleF91bmxvY2soJnZpLT5pX211dGV4KTsKIAkJCWlmIChidmkpCiAJCQkJaXB1dChidmkpOwogCQl9CkBAIC0yMzExLDcgKzIzMTEsNyBAQAogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1lcnJubyBvbiBlcnJvci4KICAqCi0gKiBDYWxsZWQgd2l0aCAtPmlfc2VtIGhlbGQuICBJbiBhbGwgYnV0IG9uZSBjYXNlIC0+aV9hbGxvY19zZW0gaXMgaGVsZCBmb3IKKyAqIENhbGxlZCB3aXRoIC0+aV9tdXRleCBoZWxkLiAgSW4gYWxsIGJ1dCBvbmUgY2FzZSAtPmlfYWxsb2Nfc2VtIGlzIGhlbGQgZm9yCiAgKiB3cml0aW5nLiAgVGhlIG9ubHkgY2FzZSBpbiB0aGUga2VybmVsIHdoZXJlIC0+aV9hbGxvY19zZW0gaXMgbm90IGhlbGQgaXMKICAqIG1tL2ZpbGVtYXAuYzo6Z2VuZXJpY19maWxlX2J1ZmZlcmVkX3dyaXRlKCkgd2hlcmUgdm10cnVuY2F0ZSgpIGlzIGNhbGxlZAogICogd2l0aCB0aGUgY3VycmVudCBpX3NpemUgYXMgdGhlIG9mZnNldC4gIFRoZSBhbmFsb2dvdXMgcGxhY2UgaW4gTlRGUyBpcyBpbgpAQCAtMjc2Nyw3ICsyNzY3LDI1IEBACiAJdXBfd3JpdGUoJm5pLT5ydW5saXN0LmxvY2spOwogZG9uZToKIAkvKiBVcGRhdGUgdGhlIG10aW1lIGFuZCBjdGltZSBvbiB0aGUgYmFzZSBpbm9kZS4gKi8KLQlpbm9kZV91cGRhdGVfdGltZShWRlNfSShiYXNlX25pKSwgMSk7CisJLyogbm9ybWFsbHkgLT50cnVuY2F0ZSBzaG91bGRuJ3QgdXBkYXRlIGN0aW1lIG9yIG10aW1lLAorCSAqIGJ1dCBudGZzIGRpZCBiZWZvcmUgc28gaXQgZ290IGEgY29weSAmIHBhc3RlIHZlcnNpb24KKwkgKiBvZiBmaWxlX3VwZGF0ZV90aW1lLiAgb25lIGRheSBzb21lb25lIHNob3VsZCBmaXggdGhpcworCSAqIGZvciByZWFsLgorCSAqLworCWlmICghSVNfTk9DTVRJTUUoVkZTX0koYmFzZV9uaSkpICYmICFJU19SRE9OTFkoVkZTX0koYmFzZV9uaSkpKSB7CisJCXN0cnVjdCB0aW1lc3BlYyBub3cgPSBjdXJyZW50X2ZzX3RpbWUoVkZTX0koYmFzZV9uaSktPmlfc2IpOworCQlpbnQgc3luY19pdCA9IDA7CisKKwkJaWYgKCF0aW1lc3BlY19lcXVhbCgmVkZTX0koYmFzZV9uaSktPmlfbXRpbWUsICZub3cpIHx8CisJCSAgICAhdGltZXNwZWNfZXF1YWwoJlZGU19JKGJhc2VfbmkpLT5pX2N0aW1lLCAmbm93KSkKKwkJCXN5bmNfaXQgPSAxOworCQlWRlNfSShiYXNlX25pKS0+aV9tdGltZSA9IG5vdzsKKwkJVkZTX0koYmFzZV9uaSktPmlfY3RpbWUgPSBub3c7CisKKwkJaWYgKHN5bmNfaXQpCisJCQltYXJrX2lub2RlX2RpcnR5X3N5bmMoVkZTX0koYmFzZV9uaSkpOworCX0KKwogCWlmIChsaWtlbHkoIWVycikpIHsKIAkJTklub0NsZWFyVHJ1bmNhdGVGYWlsZWQobmkpOwogCQludGZzX2RlYnVnKCJEb25lLiIpOwpAQCAtMjgzMSw3ICsyODQ5LDcgQEAKICAqIFdlIGFsc28gYWJvcnQgYWxsIGNoYW5nZXMgb2YgdXNlciwgZ3JvdXAsIGFuZCBtb2RlIGFzIHdlIGRvIG5vdCBpbXBsZW1lbnQKICAqIHRoZSBOVEZTIEFDTHMgeWV0LgogICoKLSAqIENhbGxlZCB3aXRoIC0+aV9zZW0gaGVsZC4gIEZvciB0aGUgQVRUUl9TSVpFIChpLmUuIC0+dHJ1bmNhdGUpIGNhc2UsIGFsc28KKyAqIENhbGxlZCB3aXRoIC0+aV9tdXRleCBoZWxkLiAgRm9yIHRoZSBBVFRSX1NJWkUgKGkuZS4gLT50cnVuY2F0ZSkgY2FzZSwgYWxzbwogICogY2FsbGVkIHdpdGggLT5pX2FsbG9jX3NlbSBoZWxkIGZvciB3cml0aW5nLgogICoKICAqIEJhc2ljYWxseSB0aGlzIGlzIGEgY29weSBvZiBnZW5lcmljIG5vdGlmeV9jaGFuZ2UoKSBhbmQgaW5vZGVfc2V0YXR0cigpCmRpZmYgLS1naXQgYS9mcy9udGZzL25hbWVpLmMgYi9mcy9udGZzL25hbWVpLmMKaW5kZXggMzUxZGJjMy4uNWVhOWViOSAxMDA2NDQKLS0tIGEvZnMvbnRmcy9uYW1laS5jCisrKyBiL2ZzL250ZnMvbmFtZWkuYwpAQCAtOTYsNyArOTYsNyBAQAogICogICAgbmFtZS4gV2UgdGhlbiBjb252ZXJ0IHRoZSBuYW1lIHRvIHRoZSBjdXJyZW50IE5MUyBjb2RlIHBhZ2UsIGFuZCBwcm9jZWVkCiAgKiAgICBzZWFyY2hpbmcgZm9yIGEgZGVudHJ5IHdpdGggdGhpcyBuYW1lLCBldGMsIGFzIGluIGNhc2UgMiksIGFib3ZlLgogICoKLSAqIExvY2tpbmc6IENhbGxlciBtdXN0IGhvbGQgaV9zZW0gb24gdGhlIGRpcmVjdG9yeS4KKyAqIExvY2tpbmc6IENhbGxlciBtdXN0IGhvbGQgaV9tdXRleCBvbiB0aGUgZGlyZWN0b3J5LgogICovCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqbnRmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXJfaW5vLCBzdHJ1Y3QgZGVudHJ5ICpkZW50LAogCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKQEAgLTI1NCw3ICsyNTQsNyBAQAogCW5sc19uYW1lLmhhc2ggPSBmdWxsX25hbWVfaGFzaChubHNfbmFtZS5uYW1lLCBubHNfbmFtZS5sZW4pOwogCiAJLyoKLQkgKiBOb3RlOiBObyBuZWVkIGZvciBkZW50LT5kX2xvY2sgbG9jayBhcyBpX3NlbSBpcyBoZWxkIG9uIHRoZQorCSAqIE5vdGU6IE5vIG5lZWQgZm9yIGRlbnQtPmRfbG9jayBsb2NrIGFzIGlfbXV0ZXggaXMgaGVsZCBvbiB0aGUKIAkgKiBwYXJlbnQgaW5vZGUuCiAJICovCiAKQEAgLTM3NCw3ICszNzQsNyBAQAogICogVGhlIGNvZGUgaXMgYmFzZWQgb24gdGhlIGV4dDMgLT5nZXRfcGFyZW50KCkgaW1wbGVtZW50YXRpb24gZm91bmQgaW4KICAqIGZzL2V4dDMvbmFtZWkuYzo6ZXh0M19nZXRfcGFyZW50KCkuCiAgKgotICogTm90ZTogbnRmc19nZXRfcGFyZW50KCkgaXMgY2FsbGVkIHdpdGggQGNoaWxkX2RlbnQtPmRfaW5vZGUtPmlfc2VtIGRvd24uCisgKiBOb3RlOiBudGZzX2dldF9wYXJlbnQoKSBpcyBjYWxsZWQgd2l0aCBAY2hpbGRfZGVudC0+ZF9pbm9kZS0+aV9tdXRleCBkb3duLgogICoKICAqIFJldHVybiB0aGUgZGVudHJ5IG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9uIHN1Y2Nlc3Mgb3IgdGhlIGVycm9yIGNvZGUgb24KICAqIGVycm9yIChJU19FUlIoKSBpcyB0cnVlKS4KZGlmZiAtLWdpdCBhL2ZzL250ZnMvcXVvdGEuYyBiL2ZzL250ZnMvcXVvdGEuYwppbmRleCA4MzNkZjJhLi5kMGVmNDE4IDEwMDY0NAotLS0gYS9mcy9udGZzL3F1b3RhLmMKKysrIGIvZnMvbnRmcy9xdW90YS5jCkBAIC00OCw3ICs0OCw3IEBACiAJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlF1b3RhIGlub2RlcyBhcmUgbm90IG9wZW4uIik7CiAJCXJldHVybiBGQUxTRTsKIAl9Ci0JZG93bigmdm9sLT5xdW90YV9xX2luby0+aV9zZW0pOworCW11dGV4X2xvY2soJnZvbC0+cXVvdGFfcV9pbm8tPmlfbXV0ZXgpOwogCWljdHggPSBudGZzX2luZGV4X2N0eF9nZXQoTlRGU19JKHZvbC0+cXVvdGFfcV9pbm8pKTsKIAlpZiAoIWljdHgpIHsKIAkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGdldCBpbmRleCBjb250ZXh0LiIpOwpAQCAtOTgsNyArOTgsNyBAQAogCW50ZnNfaW5kZXhfZW50cnlfbWFya19kaXJ0eShpY3R4KTsKIHNldF9kb25lOgogCW50ZnNfaW5kZXhfY3R4X3B1dChpY3R4KTsKLQl1cCgmdm9sLT5xdW90YV9xX2luby0+aV9zZW0pOworCW11dGV4X3VubG9jaygmdm9sLT5xdW90YV9xX2luby0+aV9tdXRleCk7CiAJLyoKIAkgKiBXZSBzZXQgdGhlIGZsYWcgc28gd2UgZG8gbm90IHRyeSB0byBtYXJrIHRoZSBxdW90YXMgb3V0IG9mIGRhdGUKIAkgKiBhZ2FpbiBvbiByZW1vdW50LgpAQCAtMTEwLDcgKzExMCw3IEBACiBlcnJfb3V0OgogCWlmIChpY3R4KQogCQludGZzX2luZGV4X2N0eF9wdXQoaWN0eCk7Ci0JdXAoJnZvbC0+cXVvdGFfcV9pbm8tPmlfc2VtKTsKKwltdXRleF91bmxvY2soJnZvbC0+cXVvdGFfcV9pbm8tPmlfbXV0ZXgpOwogCXJldHVybiBGQUxTRTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvbnRmcy9zdXBlci5jIGIvZnMvbnRmcy9zdXBlci5jCmluZGV4IDZjMTZkYjkuLmMzYTNmMWEgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvc3VwZXIuYworKysgYi9mcy9udGZzL3N1cGVyLmMKQEAgLTQ0Myw4ICs0NDMsOCBAQAogCiAJbnRmc19kZWJ1ZygiRW50ZXJpbmcgd2l0aCByZW1vdW50IG9wdGlvbnMgc3RyaW5nOiAlcyIsIG9wdCk7CiAjaWZuZGVmIE5URlNfUlcKLQkvKiBGb3IgcmVhZC1vbmx5IGNvbXBpbGVkIGRyaXZlciwgZW5mb3JjZSBhbGwgcmVhZC1vbmx5IGZsYWdzLiAqLwotCSpmbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKwkvKiBGb3IgcmVhZC1vbmx5IGNvbXBpbGVkIGRyaXZlciwgZW5mb3JjZSByZWFkLW9ubHkgZmxhZy4gKi8KKwkqZmxhZ3MgfD0gTVNfUkRPTkxZOwogI2Vsc2UgLyogTlRGU19SVyAqLwogCS8qCiAJICogRm9yIHRoZSByZWFkLXdyaXRlIGNvbXBpbGVkIGRyaXZlciwgaWYgd2UgYXJlIHJlbW91bnRpbmcgcmVhZC13cml0ZSwKQEAgLTEyMTMsMTAgKzEyMTMsMTAgQEAKIAkgKiBGaW5kIHRoZSBpbm9kZSBudW1iZXIgZm9yIHRoZSBoaWJlcm5hdGlvbiBmaWxlIGJ5IGxvb2tpbmcgdXAgdGhlCiAJICogZmlsZW5hbWUgaGliZXJmaWwuc3lzIGluIHRoZSByb290IGRpcmVjdG9yeS4KIAkgKi8KLQlkb3duKCZ2b2wtPnJvb3RfaW5vLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmdm9sLT5yb290X2luby0+aV9tdXRleCk7CiAJbXJlZiA9IG50ZnNfbG9va3VwX2lub2RlX2J5X25hbWUoTlRGU19JKHZvbC0+cm9vdF9pbm8pLCBoaWJlcmZpbCwgMTIsCiAJCQkmbmFtZSk7Ci0JdXAoJnZvbC0+cm9vdF9pbm8tPmlfc2VtKTsKKwltdXRleF91bmxvY2soJnZvbC0+cm9vdF9pbm8tPmlfbXV0ZXgpOwogCWlmIChJU19FUlJfTVJFRihtcmVmKSkgewogCQlyZXQgPSBNUkVGX0VSUihtcmVmKTsKIAkJLyogSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIFdpbmRvd3MgaXMgbm90IGhpYmVybmF0ZWQuICovCkBAIC0xMzA3LDEwICsxMzA3LDEwIEBACiAJICogRmluZCB0aGUgaW5vZGUgbnVtYmVyIGZvciB0aGUgcXVvdGEgZmlsZSBieSBsb29raW5nIHVwIHRoZSBmaWxlbmFtZQogCSAqICRRdW90YSBpbiB0aGUgZXh0ZW5kZWQgc3lzdGVtIGZpbGVzIGRpcmVjdG9yeSAkRXh0ZW5kLgogCSAqLwotCWRvd24oJnZvbC0+ZXh0ZW5kX2luby0+aV9zZW0pOworCW11dGV4X2xvY2soJnZvbC0+ZXh0ZW5kX2luby0+aV9tdXRleCk7CiAJbXJlZiA9IG50ZnNfbG9va3VwX2lub2RlX2J5X25hbWUoTlRGU19JKHZvbC0+ZXh0ZW5kX2lubyksIFF1b3RhLCA2LAogCQkJJm5hbWUpOwotCXVwKCZ2b2wtPmV4dGVuZF9pbm8tPmlfc2VtKTsKKwltdXRleF91bmxvY2soJnZvbC0+ZXh0ZW5kX2luby0+aV9tdXRleCk7CiAJaWYgKElTX0VSUl9NUkVGKG1yZWYpKSB7CiAJCS8qCiAJCSAqIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBxdW90YXMgYXJlIGRpc2FibGVkIGFuZCBoYXZlCkBAIC0xMzkwLDEwICsxMzkwLDEwIEBACiAJICogRmluZCB0aGUgaW5vZGUgbnVtYmVyIGZvciB0aGUgdHJhbnNhY3Rpb24gbG9nIGZpbGUgYnkgbG9va2luZyB1cCB0aGUKIAkgKiBmaWxlbmFtZSAkVXNuSnJubCBpbiB0aGUgZXh0ZW5kZWQgc3lzdGVtIGZpbGVzIGRpcmVjdG9yeSAkRXh0ZW5kLgogCSAqLwotCWRvd24oJnZvbC0+ZXh0ZW5kX2luby0+aV9zZW0pOworCW11dGV4X2xvY2soJnZvbC0+ZXh0ZW5kX2luby0+aV9tdXRleCk7CiAJbXJlZiA9IG50ZnNfbG9va3VwX2lub2RlX2J5X25hbWUoTlRGU19JKHZvbC0+ZXh0ZW5kX2lubyksIFVzbkpybmwsIDgsCiAJCQkmbmFtZSk7Ci0JdXAoJnZvbC0+ZXh0ZW5kX2luby0+aV9zZW0pOworCW11dGV4X3VubG9jaygmdm9sLT5leHRlbmRfaW5vLT5pX211dGV4KTsKIAlpZiAoSVNfRVJSX01SRUYobXJlZikpIHsKIAkJLyoKIAkJICogSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRyYW5zYWN0aW9uIGxvZ2dpbmcgaXMgZGlzYWJsZWQsCkBAIC0xNzIxLDcgKzE3MjEsNyBAQAogCQkJCQkJZXMzKTsKIAkJCQlnb3RvIGlwdXRfbWlycl9lcnJfb3V0OwogCQkJfQotCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CiAJCQludGZzX2Vycm9yKHNiLCAiJXMuICBNb3VudGluZyByZWFkLW9ubHklcyIsCiAJCQkJCSF2b2wtPm1mdG1pcnJfaW5vID8gZXMxIDogZXMyLCBlczMpOwogCQl9IGVsc2UKQEAgLTE4MzcsNyArMTgzNyw3IEBACiAJCQkJCQllczEsIGVzMik7CiAJCQkJZ290byBpcHV0X3ZvbF9lcnJfb3V0OwogCQkJfQotCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CiAJCQludGZzX2Vycm9yKHNiLCAiJXMuICBNb3VudGluZyByZWFkLW9ubHklcyIsIGVzMSwgZXMyKTsKIAkJfSBlbHNlCiAJCQludGZzX3dhcm5pbmcoc2IsICIlcy4gIFdpbGwgbm90IGJlIGFibGUgdG8gcmVtb3VudCAiCkBAIC0xODc0LDcgKzE4NzQsNyBAQAogCQkJCX0KIAkJCQlnb3RvIGlwdXRfbG9nZmlsZV9lcnJfb3V0OwogCQkJfQotCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CiAJCQludGZzX2Vycm9yKHNiLCAiJXMuICBNb3VudGluZyByZWFkLW9ubHklcyIsIGVzMSwgZXMyKTsKIAkJfSBlbHNlCiAJCQludGZzX3dhcm5pbmcoc2IsICIlcy4gIFdpbGwgbm90IGJlIGFibGUgdG8gcmVtb3VudCAiCkBAIC0xOTE5LDcgKzE5MTksNyBAQAogCQkJCQkJZXMxLCBlczIpOwogCQkJCWdvdG8gaXB1dF9yb290X2Vycl9vdXQ7CiAJCQl9Ci0JCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKwkJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKIAkJCW50ZnNfZXJyb3Ioc2IsICIlcy4gIE1vdW50aW5nIHJlYWQtb25seSVzIiwgZXMxLCBlczIpOwogCQl9IGVsc2UKIAkJCW50ZnNfd2FybmluZyhzYiwgIiVzLiAgV2lsbCBub3QgYmUgYWJsZSB0byByZW1vdW50ICIKQEAgLTE5NDMsNyArMTk0Myw3IEBACiAJCQlnb3RvIGlwdXRfcm9vdF9lcnJfb3V0OwogCQl9CiAJCW50ZnNfZXJyb3Ioc2IsICIlcy4gIE1vdW50aW5nIHJlYWQtb25seSVzIiwgZXMxLCBlczIpOwotCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOwogCQkvKgogCQkgKiBEbyBub3Qgc2V0IE5Wb2xFcnJvcnMoKSBiZWNhdXNlIG50ZnNfcmVtb3VudCgpIG1pZ2h0IG1hbmFnZQogCQkgKiB0byBzZXQgdGhlIGRpcnR5IGZsYWcgaW4gd2hpY2ggY2FzZSBhbGwgd291bGQgYmUgd2VsbC4KQEAgLTE5NzAsNyArMTk3MCw3IEBACiAJCQlnb3RvIGlwdXRfcm9vdF9lcnJfb3V0OwogCQl9CiAJCW50ZnNfZXJyb3Ioc2IsICIlcy4gIE1vdW50aW5nIHJlYWQtb25seSVzIiwgZXMxLCBlczIpOwotCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOwogCQlOVm9sU2V0RXJyb3JzKHZvbCk7CiAJfQogI2VuZGlmCkBAIC0xOTg5LDcgKzE5ODksNyBAQAogCQkJZ290byBpcHV0X3Jvb3RfZXJyX291dDsKIAkJfQogCQludGZzX2Vycm9yKHNiLCAiJXMuICBNb3VudGluZyByZWFkLW9ubHklcyIsIGVzMSwgZXMyKTsKLQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CisJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKIAkJTlZvbFNldEVycm9ycyh2b2wpOwogCX0KICNlbmRpZiAvKiBOVEZTX1JXICovCkBAIC0yMDMwLDcgKzIwMzAsNyBAQAogCQkJCQkJZXMxLCBlczIpOwogCQkJCWdvdG8gaXB1dF9xdW90YV9lcnJfb3V0OwogCQkJfQotCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CiAJCQludGZzX2Vycm9yKHNiLCAiJXMuICBNb3VudGluZyByZWFkLW9ubHklcyIsIGVzMSwgZXMyKTsKIAkJfSBlbHNlCiAJCQludGZzX3dhcm5pbmcoc2IsICIlcy4gIFdpbGwgbm90IGJlIGFibGUgdG8gcmVtb3VudCAiCkBAIC0yMDUzLDcgKzIwNTMsNyBAQAogCQkJZ290byBpcHV0X3F1b3RhX2Vycl9vdXQ7CiAJCX0KIAkJbnRmc19lcnJvcihzYiwgIiVzLiAgTW91bnRpbmcgcmVhZC1vbmx5JXMiLCBlczEsIGVzMik7Ci0JCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWSB8IE1TX05PQVRJTUUgfCBNU19OT0RJUkFUSU1FOworCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CiAJCU5Wb2xTZXRFcnJvcnModm9sKTsKIAl9CiAJLyoKQEAgLTIwNzQsNyArMjA3NCw3IEBACiAJCQkJCQllczEsIGVzMik7CiAJCQkJZ290byBpcHV0X3VzbmpybmxfZXJyX291dDsKIAkJCX0KLQkJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWSB8IE1TX05PQVRJTUUgfCBNU19OT0RJUkFUSU1FOworCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOwogCQkJbnRmc19lcnJvcihzYiwgIiVzLiAgTW91bnRpbmcgcmVhZC1vbmx5JXMiLCBlczEsIGVzMik7CiAJCX0gZWxzZQogCQkJbnRmc193YXJuaW5nKHNiLCAiJXMuICBXaWxsIG5vdCBiZSBhYmxlIHRvIHJlbW91bnQgIgpAQCAtMjA5Nyw3ICsyMDk3LDcgQEAKIAkJCWdvdG8gaXB1dF91c25qcm5sX2Vycl9vdXQ7CiAJCX0KIAkJbnRmc19lcnJvcihzYiwgIiVzLiAgTW91bnRpbmcgcmVhZC1vbmx5JXMiLCBlczEsIGVzMik7Ci0JCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWSB8IE1TX05PQVRJTUUgfCBNU19OT0RJUkFUSU1FOworCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CiAJCU5Wb2xTZXRFcnJvcnModm9sKTsKIAl9CiAjZW5kaWYgLyogTlRGU19SVyAqLwpAQCAtMjMxMiw5ICsyMzEyLDkgQEAKIAlpZiAoIWxpc3RfZW1wdHkoJnNiLT5zX2RpcnR5KSkgewogCQljb25zdCBjaGFyICpzMSwgKnMyOwogCi0JCWRvd24oJnZvbC0+bWZ0X2luby0+aV9zZW0pOworCQltdXRleF9sb2NrKCZ2b2wtPm1mdF9pbm8tPmlfbXV0ZXgpOwogCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcyh2b2wtPm1mdF9pbm8tPmlfbWFwcGluZywgMCk7Ci0JCXVwKCZ2b2wtPm1mdF9pbm8tPmlfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZ2b2wtPm1mdF9pbm8tPmlfbXV0ZXgpOwogCQl3cml0ZV9pbm9kZV9ub3codm9sLT5tZnRfaW5vLCAxKTsKIAkJaWYgKCFsaXN0X2VtcHR5KCZzYi0+c19kaXJ0eSkpIHsKIAkJCXN0YXRpYyBjb25zdCBjaGFyICpfczEgPSAiaW5vZGVzIjsKQEAgLTI2ODksNyArMjY4OSw3IEBACiAKIAludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKICNpZm5kZWYgTlRGU19SVwotCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWSB8IE1TX05PQVRJTUUgfCBNU19OT0RJUkFUSU1FOworCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKICNlbmRpZiAvKiAhIE5URlNfUlcgKi8KIAkvKiBBbGxvY2F0ZSBhIG5ldyBudGZzX3ZvbHVtZSBhbmQgcGxhY2UgaXQgaW4gc2ItPnNfZnNfaW5mby4gKi8KIAlzYi0+c19mc19pbmZvID0ga21hbGxvYyhzaXplb2YobnRmc192b2x1bWUpLCBHRlBfTk9GUyk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hbGxvYy5jIGIvZnMvb2NmczIvYWxsb2MuYwppbmRleCA0NjVmNzk3Li42Yjk4MTJkIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hbGxvYy5jCisrKyBiL2ZzL29jZnMyL2FsbG9jLmMKQEAgLTk2Niw3ICs5NjYsNyBAQAogCW1sb2dfZW50cnkoInN0YXJ0X2JsayA9ICUiTUxGdTY0IiwgbnVtX2NsdXN0ZXJzID0gJXVcbiIsIHN0YXJ0X2JsaywKIAkJICAgbnVtX2NsdXN0ZXJzKTsKIAotCUJVR19PTighZG93bl90cnlsb2NrKCZ0bF9pbm9kZS0+aV9zZW0pKTsKKwlCVUdfT04obXV0ZXhfdHJ5bG9jaygmdGxfaW5vZGUtPmlfbXV0ZXgpKTsKIAogCXN0YXJ0X2NsdXN0ZXIgPSBvY2ZzMl9ibG9ja3NfdG9fY2x1c3RlcnMob3NiLT5zYiwgc3RhcnRfYmxrKTsKIApAQCAtMTEwOCw3ICsxMTA4LDcgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi0vKiBFeHBlY3RzIHlvdSB0byBhbHJlYWR5IGJlIGhvbGRpbmcgdGxfaW5vZGUtPmlfc2VtICovCisvKiBFeHBlY3RzIHlvdSB0byBhbHJlYWR5IGJlIGhvbGRpbmcgdGxfaW5vZGUtPmlfbXV0ZXggKi8KIHN0YXRpYyBpbnQgX19vY2ZzMl9mbHVzaF90cnVuY2F0ZV9sb2coc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCiB7CiAJaW50IHN0YXR1czsKQEAgLTExMjMsNyArMTEyMyw3IEBACiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIAotCUJVR19PTighZG93bl90cnlsb2NrKCZ0bF9pbm9kZS0+aV9zZW0pKTsKKwlCVUdfT04obXV0ZXhfdHJ5bG9jaygmdGxfaW5vZGUtPmlfbXV0ZXgpKTsKIAogCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgdGxfYmgtPmJfZGF0YTsKIAl0bCA9ICZkaS0+aWQyLmlfZGVhbGxvYzsKQEAgLTExOTgsOSArMTE5OCw5IEBACiAJaW50IHN0YXR1czsKIAlzdHJ1Y3QgaW5vZGUgKnRsX2lub2RlID0gb3NiLT5vc2JfdGxfaW5vZGU7CiAKLQlkb3duKCZ0bF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJnRsX2lub2RlLT5pX211dGV4KTsKIAlzdGF0dXMgPSBfX29jZnMyX2ZsdXNoX3RydW5jYXRlX2xvZyhvc2IpOwotCXVwKCZ0bF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmdGxfaW5vZGUtPmlfbXV0ZXgpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTEzNjMsNyArMTM2Myw3IEBACiAJbWxvZygwLCAiY2xlYW51cCAldSByZWNvcmRzIGZyb20gJSJNTEZ1NjQiXG4iLCBudW1fcmVjcywKIAkgICAgIHRsX2NvcHktPmlfYmxrbm8pOwogCi0JZG93bigmdGxfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZ0bF9pbm9kZS0+aV9tdXRleCk7CiAJZm9yKGkgPSAwOyBpIDwgbnVtX3JlY3M7IGkrKykgewogCQlpZiAob2NmczJfdHJ1bmNhdGVfbG9nX25lZWRzX2ZsdXNoKG9zYikpIHsKIAkJCXN0YXR1cyA9IF9fb2NmczJfZmx1c2hfdHJ1bmNhdGVfbG9nKG9zYik7CkBAIC0xMzk1LDcgKzEzOTUsNyBAQAogCX0KIAogYmFpbF91cDoKLQl1cCgmdGxfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJnRsX2lub2RlLT5pX211dGV4KTsKIAogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CkBAIC0xODQwLDcgKzE4NDAsNyBAQAogCiAJbWxvZygwLCAiY2x1c3RlcnNfdG9fZGVsID0gJXUgaW4gdGhpcyBwYXNzXG4iLCBjbHVzdGVyc190b19kZWwpOwogCi0JZG93bigmdGxfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZ0bF9pbm9kZS0+aV9tdXRleCk7CiAJdGxfc2VtID0gMTsKIAkvKiBvY2ZzMl90cnVuY2F0ZV9sb2dfbmVlZHNfZmx1c2ggZ3VhcmFudGVlcyB1cyBhdCBsZWFzdCBvbmUKIAkgKiByZWNvcmQgaXMgZnJlZSBmb3IgdXNlLiBJZiB0aGVyZSBpc24ndCBhbnksIHdlIGZsdXNoIHRvIGdldApAQCAtMTg3NSw3ICsxODc1LDcgQEAKIAkJZ290byBiYWlsOwogCX0KIAotCXVwKCZ0bF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmdGxfaW5vZGUtPmlfbXV0ZXgpOwogCXRsX3NlbSA9IDA7CiAKIAlvY2ZzMl9jb21taXRfdHJhbnMoaGFuZGxlKTsKQEAgLTE4OTAsNyArMTg5MCw3IEBACiAJb2NmczJfc2NoZWR1bGVfdHJ1bmNhdGVfbG9nX2ZsdXNoKG9zYiwgMSk7CiAKIAlpZiAodGxfc2VtKQotCQl1cCgmdGxfaW5vZGUtPmlfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZ0bF9pbm9kZS0+aV9tdXRleCk7CiAKIAlpZiAoaGFuZGxlKQogCQlvY2ZzMl9jb21taXRfdHJhbnMoaGFuZGxlKTsKQEAgLTE5OTQsNyArMTk5NCw3IEBACiAJCQlnb3RvIGJhaWw7CiAJCX0KIAotCQlkb3duKCZleHRfYWxsb2NfaW5vZGUtPmlfc2VtKTsKKwkJbXV0ZXhfbG9jaygmZXh0X2FsbG9jX2lub2RlLT5pX211dGV4KTsKIAkJKCp0YyktPnRjX2V4dF9hbGxvY19pbm9kZSA9IGV4dF9hbGxvY19pbm9kZTsKIAogCQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soZXh0X2FsbG9jX2lub2RlLApAQCAtMjAyNiw3ICsyMDI2LDcgQEAKIAkJaWYgKHRjLT50Y19leHRfYWxsb2NfbG9ja2VkKQogCQkJb2NmczJfbWV0YV91bmxvY2sodGMtPnRjX2V4dF9hbGxvY19pbm9kZSwgMSk7CiAKLQkJdXAoJnRjLT50Y19leHRfYWxsb2NfaW5vZGUtPmlfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZ0Yy0+dGNfZXh0X2FsbG9jX2lub2RlLT5pX211dGV4KTsKIAkJaXB1dCh0Yy0+dGNfZXh0X2FsbG9jX2lub2RlKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvbWFza2xvZy5oIGIvZnMvb2NmczIvY2x1c3Rlci9tYXNrbG9nLmgKaW5kZXggZjVlZjVlYS4uZThjNTZhMyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvY2x1c3Rlci9tYXNrbG9nLmgKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9tYXNrbG9nLmgKQEAgLTIxMiwxMSArMjEyLDEwIEBACiAJbWxvZyhNTF9FTlRSWSwgIkVOVFJZOlxuIik7CQkJCQlcCiB9IHdoaWxlICgwKQogCi0vKiBXZSBkaXNhYmxlIHRoaXMgZm9yIG9sZCBjb21waWxlcnMgc2luY2UgdGhleSBkb24ndCBoYXZlIHN1cHBvcnQgZm9yCi0gKiBfX2J1aWx0aW5fdHlwZXNfY29tcGF0aWJsZV9wLgorLyoKKyAqIFdlIGRpc2FibGUgdGhpcyBmb3Igc3BhcnNlLgogICovCi0jaWYgKF9fR05VQ19fID4gMyB8fCAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+PSAxKSkgJiYgXAotICAgICFkZWZpbmVkKF9fQ0hFQ0tFUl9fKQorI2lmICFkZWZpbmVkKF9fQ0hFQ0tFUl9fKQogI2RlZmluZSBtbG9nX2V4aXQoc3QpIGRvIHsJCQkJCQkgICAgIFwKIAlpZiAoX19idWlsdGluX3R5cGVzX2NvbXBhdGlibGVfcCh0eXBlb2Yoc3QpLCB1bnNpZ25lZCBsb25nKSkJICAgICBcCiAJCW1sb2coTUxfRVhJVCwgIkVYSVQ6ICVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpIChzdCkpOwkgICAgIFwKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvbm9kZW1hbmFnZXIuYyBiL2ZzL29jZnMyL2NsdXN0ZXIvbm9kZW1hbmFnZXIuYwppbmRleCA1ZmQ2MGMxLi5jZjc4MjhmIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL25vZGVtYW5hZ2VyLmMKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9ub2RlbWFuYWdlci5jCkBAIC02NTMsNyArNjUzLDcgQEAKIAlzdHJ1Y3QgY29uZmlnX2dyb3VwICpvMmhiX2dyb3VwID0gTlVMTCwgKnJldCA9IE5VTEw7CiAJdm9pZCAqZGVmcyA9IE5VTEw7CiAKLQkvKiB0aGlzIHJ1bnMgdW5kZXIgdGhlIHBhcmVudCBkaXIncyBpX3NlbTsgdGhlcmUgY2FuIGJlIG9ubHkKKwkvKiB0aGlzIHJ1bnMgdW5kZXIgdGhlIHBhcmVudCBkaXIncyBpX211dGV4OyB0aGVyZSBjYW4gYmUgb25seQogCSAqIG9uZSBjYWxsZXIgaW4gaGVyZSBhdCBhIHRpbWUgKi8KIAlpZiAobzJubV9zaW5nbGVfY2x1c3RlcikKIAkJZ290byBvdXQ7IC8qIEVOT1NQQyAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGlyLmMgYi9mcy9vY2ZzMi9kaXIuYwppbmRleCA4NTZlMjBhLi41NzE1OGZhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kaXIuYworKysgYi9mcy9vY2ZzMi9kaXIuYwpAQCAtMjAyLDcgKzIwMiw3IEBACiB9CiAKIC8qCi0gKiBOT1RFOiB0aGlzIHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIHdpdGggcGFyZW50IGRpciBpX3NlbSB0YWtlbi4KKyAqIE5PVEU6IHRoaXMgc2hvdWxkIGFsd2F5cyBiZSBjYWxsZWQgd2l0aCBwYXJlbnQgZGlyIGlfbXV0ZXggdGFrZW4uCiAgKi8KIGludCBvY2ZzMl9maW5kX2ZpbGVzX29uX2Rpc2soY29uc3QgY2hhciAqbmFtZSwKIAkJCSAgICAgaW50IG5hbWVsZW4sCkBAIC0yNDUsNyArMjQ1LDcgQEAKICAqIFJldHVybiAwIGlmIHRoZSBuYW1lIGRvZXMgbm90IGV4aXN0CiAgKiBSZXR1cm4gLUVFWElTVCBpZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBuYW1lCiAgKgotICogQ2FsbGVycyBzaG91bGQgaGF2ZSBpX3NlbSArIGEgY2x1c3RlciBsb2NrIG9uIGRpcgorICogQ2FsbGVycyBzaG91bGQgaGF2ZSBpX211dGV4ICsgYSBjbHVzdGVyIGxvY2sgb24gZGlyCiAgKi8KIGludCBvY2ZzMl9jaGVja19kaXJfZm9yX2VudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLAogCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2ZpbGUuYyBiL2ZzL29jZnMyL2ZpbGUuYwppbmRleCA3MmFlOWUzLi5lYWYzM2NhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9maWxlLmMKKysrIGIvZnMvb2NmczIvZmlsZS5jCkBAIC0yMyw2ICsyMyw3IEBACiAgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNDkyLDcgKzQ5Myw3IEBACiAJfQogCiAJLyogYmxvY2tzIHBlb3BlIGluIHJlYWQvd3JpdGUgZnJvbSByZWFkaW5nIG91ciBhbGxvY2F0aW9uCi0JICogdW50aWwgd2UncmUgZG9uZSBjaGFuZ2luZyBpdC4gV2UgZGVwZW5kIG9uIGlfc2VtIHRvIGJsb2NrCisJICogdW50aWwgd2UncmUgZG9uZSBjaGFuZ2luZyBpdC4gV2UgZGVwZW5kIG9uIGlfbXV0ZXggdG8gYmxvY2sKIAkgKiBvdGhlciBleHRlbmQvdHJ1bmNhdGUgY2FsbHMgd2hpbGUgd2UncmUgaGVyZS4gT3JkZXJpbmcgd3J0CiAJICogc3RhcnRfdHJhbnMgaXMgaW1wb3J0YW50IGhlcmUgLS0gYWx3YXlzIGRvIGl0IGJlZm9yZSEgKi8KIAlkb3duX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKQEAgLTk1OCw4ICs5NTksOCBAQAogCQlmaWxwLT5mX2ZsYWdzICY9IH5PX0RJUkVDVDsKICNlbmRpZgogCi0JZG93bigmaW5vZGUtPmlfc2VtKTsKLQkvKiB0byBtYXRjaCBzZXRhdHRyJ3MgaV9zZW0gLT4gaV9hbGxvY19zZW0gLT4gcndfbG9jayBvcmRlcmluZyAqLworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKwkvKiB0byBtYXRjaCBzZXRhdHRyJ3MgaV9tdXRleCAtPiBpX2FsbG9jX3NlbSAtPiByd19sb2NrIG9yZGVyaW5nICovCiAJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX0RJUkVDVCkgewogCQloYXZlX2FsbG9jX3NlbSA9IDE7CiAJCWRvd25fcmVhZCgmaW5vZGUtPmlfYWxsb2Nfc2VtKTsKQEAgLTExMjMsNyArMTEyNCw3IEBACiAJCXVwX3JlYWQoJmlub2RlLT5pX2FsbG9jX3NlbSk7CiAJaWYgKHJ3X2xldmVsICE9IC0xKSAKIAkJb2NmczJfcndfdW5sb2NrKGlub2RlLCByd19sZXZlbCk7Ci0JdXAoJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAKIAltbG9nX2V4aXQocmV0KTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvaW5vZGUuYyBiL2ZzL29jZnMyL2lub2RlLmMKaW5kZXggYTkxYmE0ZC4uZDRlY2MwNiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvaW5vZGUuYworKysgYi9mcy9vY2ZzMi9pbm9kZS5jCkBAIC00ODUsMTAgKzQ4NSwxMCBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0JZG93bigmaW5vZGVfYWxsb2NfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZpbm9kZV9hbGxvY19pbm9kZS0+aV9tdXRleCk7CiAJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGlub2RlX2FsbG9jX2lub2RlLCBOVUxMLCAmaW5vZGVfYWxsb2NfYmgsIDEpOwogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXVwKCZpbm9kZV9hbGxvY19pbm9kZS0+aV9zZW0pOworCQltdXRleF91bmxvY2soJmlub2RlX2FsbG9jX2lub2RlLT5pX211dGV4KTsKIAogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTUzNiw3ICs1MzYsNyBAQAogCW9jZnMyX2NvbW1pdF90cmFucyhoYW5kbGUpOwogYmFpbF91bmxvY2s6CiAJb2NmczJfbWV0YV91bmxvY2soaW5vZGVfYWxsb2NfaW5vZGUsIDEpOwotCXVwKCZpbm9kZV9hbGxvY19pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmaW5vZGVfYWxsb2NfaW5vZGUtPmlfbXV0ZXgpOwogCWJyZWxzZShpbm9kZV9hbGxvY19iaCk7CiBiYWlsOgogCWlwdXQoaW5vZGVfYWxsb2NfaW5vZGUpOwpAQCAtNTY3LDEwICs1NjcsMTAgQEAKIAkvKiBMb2NrIHRoZSBvcnBoYW4gZGlyLiBUaGUgbG9jayB3aWxsIGJlIGhlbGQgZm9yIHRoZSBlbnRpcmUKIAkgKiBkZWxldGVfaW5vZGUgb3BlcmF0aW9uLiBXZSBkbyB0aGlzIG5vdyB0byBhdm9pZCByYWNlcyB3aXRoCiAJICogcmVjb3ZlcnkgY29tcGxldGlvbiBvbiBvdGhlciBub2Rlcy4gKi8KLQlkb3duKCZvcnBoYW5fZGlyX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmb3JwaGFuX2Rpcl9pbm9kZS0+aV9tdXRleCk7CiAJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKG9ycGhhbl9kaXJfaW5vZGUsIE5VTEwsICZvcnBoYW5fZGlyX2JoLCAxKTsKIAlpZiAoc3RhdHVzIDwgMCkgewotCQl1cCgmb3JwaGFuX2Rpcl9pbm9kZS0+aV9zZW0pOworCQltdXRleF91bmxvY2soJm9ycGhhbl9kaXJfaW5vZGUtPmlfbXV0ZXgpOwogCiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwpAQCAtNTkzLDcgKzU5Myw3IEBACiAKIGJhaWxfdW5sb2NrX2RpcjoKIAlvY2ZzMl9tZXRhX3VubG9jayhvcnBoYW5fZGlyX2lub2RlLCAxKTsKLQl1cCgmb3JwaGFuX2Rpcl9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmb3JwaGFuX2Rpcl9pbm9kZS0+aV9tdXRleCk7CiAJYnJlbHNlKG9ycGhhbl9kaXJfYmgpOwogYmFpbDoKIAlpcHV0KG9ycGhhbl9kaXJfaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvam91cm5hbC5jIGIvZnMvb2NmczIvam91cm5hbC5jCmluZGV4IDA0NDI4MDQuLjMwM2M4ZDkgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2pvdXJuYWwuYworKysgYi9mcy9vY2ZzMi9qb3VybmFsLmMKQEAgLTIxNiw3ICsyMTYsNyBAQAogCWF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KTsKIAogCS8qIHdlJ3JlIG9idmlvdXNseSBjaGFuZ2luZyBpdC4uLiAqLwotCWRvd24oJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCiAJLyogc2FuaXR5IGNoZWNrICovCiAJQlVHX09OKE9DRlMyX0koaW5vZGUpLT5pcF9oYW5kbGUpOwpAQCAtMjQxLDcgKzI0MSw3IEBACiAJCU9DRlMyX0koaW5vZGUpLT5pcF9oYW5kbGUgPSBOVUxMOwogCQlsaXN0X2RlbF9pbml0KCZPQ0ZTMl9JKGlub2RlKS0+aXBfaGFuZGxlX2xpc3QpOwogCi0JCXVwKCZpbm9kZS0+aV9zZW0pOworCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAkJaXB1dChpbm9kZSk7CiAJfQogfQpAQCAtMTQzMywxMCArMTQzMywxMCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlkb3duKCZvcnBoYW5fZGlyX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmb3JwaGFuX2Rpcl9pbm9kZS0+aV9tdXRleCk7CiAJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKG9ycGhhbl9kaXJfaW5vZGUsIE5VTEwsIE5VTEwsIDApOwogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXVwKCZvcnBoYW5fZGlyX2lub2RlLT5pX3NlbSk7CisJCW11dGV4X3VubG9jaygmb3JwaGFuX2Rpcl9pbm9kZS0+aV9tdXRleCk7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTQ1MSw3ICsxNDUxLDcgQEAKIAkJaWYgKCFiaCkKIAkJCXN0YXR1cyA9IC1FSU5WQUw7CiAJCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQl1cCgmb3JwaGFuX2Rpcl9pbm9kZS0+aV9zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZvcnBoYW5fZGlyX2lub2RlLT5pX211dGV4KTsKIAkJCWlmIChiaCkKIAkJCQlicmVsc2UoYmgpOwogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtMTQ2NSw3ICsxNDY1LDcgQEAKIAogCQkJaWYgKCFvY2ZzMl9jaGVja19kaXJfZW50cnkob3JwaGFuX2Rpcl9pbm9kZSwKIAkJCQkJCSAgZGUsIGJoLCBsb2NhbCkpIHsKLQkJCQl1cCgmb3JwaGFuX2Rpcl9pbm9kZS0+aV9zZW0pOworCQkJCW11dGV4X3VubG9jaygmb3JwaGFuX2Rpcl9pbm9kZS0+aV9tdXRleCk7CiAJCQkJc3RhdHVzID0gLUVJTlZBTDsKIAkJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQkJYnJlbHNlKGJoKTsKQEAgLTE1MDksNyArMTUwOSw3IEBACiAJCX0KIAkJYnJlbHNlKGJoKTsKIAl9Ci0JdXAoJm9ycGhhbl9kaXJfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJm9ycGhhbl9kaXJfaW5vZGUtPmlfbXV0ZXgpOwogCiAJb2NmczJfbWV0YV91bmxvY2sob3JwaGFuX2Rpcl9pbm9kZSwgMCk7CiAJaGF2ZV9kaXNrX2xvY2sgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvbG9jYWxhbGxvYy5jIGIvZnMvb2NmczIvbG9jYWxhbGxvYy5jCmluZGV4IGZlMzczYTIuLjE0OWIzNTEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2xvY2FsYWxsb2MuYworKysgYi9mcy9vY2ZzMi9sb2NhbGFsbG9jLmMKQEAgLTMzNCw3ICszMzQsNyBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0JZG93bigmaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAKIAlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKG9zYiwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAogCQkJCSAgJmFsbG9jX2JoLCAwLCBpbm9kZSk7CkBAIC0zNjcsNyArMzY3LDcgQEAKIAkJYnJlbHNlKGFsbG9jX2JoKTsKIAogCWlmIChpbm9kZSkgewotCQl1cCgmaW5vZGUtPmlfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJCWlwdXQoaW5vZGUpOwogCX0KIApAQCAtNDQ2LDcgKzQ0Niw3IEBACiAKIC8qCiAgKiBtYWtlIHN1cmUgd2UndmUgZ290IGF0IGxlYXN0IGJpdHN3YW50ZWQgY29udGlndW91cyBiaXRzIGluIHRoZQotICogbG9jYWwgYWxsb2MuIFlvdSBsb3NlIHRoZW0gd2hlbiB5b3UgZHJvcCBpX3NlbS4KKyAqIGxvY2FsIGFsbG9jLiBZb3UgbG9zZSB0aGVtIHdoZW4geW91IGRyb3AgaV9tdXRleC4KICAqCiAgKiBXZSB3aWxsIGFkZCBvdXJzZWx2ZXMgdG8gdGhlIHRyYW5zYWN0aW9uIHBhc3NlZCBpbiwgYnV0IG1heSBzdGFydAogICogb3VyIG93biBpbiBvcmRlciB0byBzaGlmdCB3aW5kb3dzLgpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvbW1hcC5jIGIvZnMvb2NmczIvbW1hcC5jCmluZGV4IGFmZGVlYzQuLjg0M2NmOWQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL21tYXAuYworKysgYi9mcy9vY2ZzMi9tbWFwLmMKQEAgLTgwLDEyICs4MCw4IEBACiAJLm5vcGFnZSA9IG9jZnMyX25vcGFnZSwKIH07CiAKLWludCBvY2ZzMl9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLAotCSAgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK2ludCBvY2ZzMl9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmc7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7Ci0KIAkvKiBXZSBkb24ndCB3YW50IHRvIHN1cHBvcnQgc2hhcmVkIHdyaXRhYmxlIG1hcHBpbmdzIHlldC4gKi8KIAlpZiAoKCh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKSB8fCAodm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFKSkKIAkgICAgJiYgKCh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHx8ICh2bWEtPnZtX2ZsYWdzICYgVk1fTUFZV1JJVEUpKSkgewpAQCAtOTUsNyArOTEsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQl1cGRhdGVfYXRpbWUoaW5vZGUpOworCWZpbGVfYWNjZXNzZWQoZmlsZSk7CiAJdm1hLT52bV9vcHMgPSAmb2NmczJfZmlsZV92bV9vcHM7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdXBlci5jIGIvZnMvb2NmczIvc3VwZXIuYwppbmRleCA0OGJmN2YwLi4zNjRkNjRiIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdXBlci5jCisrKyBiL2ZzL29jZnMyL3N1cGVyLmMKQEAgLTE2OSw3ICsxNjksNyBAQAogICovCiBzdGF0aWMgdm9pZCBvY2ZzMl93cml0ZV9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCWlmIChkb3duX3RyeWxvY2soJnNiLT5zX2xvY2spID09IDApCisJaWYgKG11dGV4X3RyeWxvY2soJnNiLT5zX2xvY2spICE9IDApCiAJCUJVRygpOwogCXNiLT5zX2RpcnQgPSAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvb3Blbi5jIGIvZnMvb3Blbi5jCmluZGV4IGY1M2E1YjkuLjcwZTAyMzAgMTAwNjQ0Ci0tLSBhL2ZzL29wZW4uYworKysgYi9mcy9vcGVuLmMKQEAgLTE2LDkgKzE2LDExIEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KQEAgLTE5NCw3ICsxOTYsOCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotaW50IGRvX3RydW5jYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgbG9mZl90IGxlbmd0aCwgc3RydWN0IGZpbGUgKmZpbHApCitpbnQgZG9fdHJ1bmNhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBsb2ZmX3QgbGVuZ3RoLCB1bnNpZ25lZCBpbnQgdGltZV9hdHRycywKKwlzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBpYXR0ciBuZXdhdHRyczsKQEAgLTIwNCwxOSArMjA3LDE5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJbmV3YXR0cnMuaWFfc2l6ZSA9IGxlbmd0aDsKLQluZXdhdHRycy5pYV92YWxpZCA9IEFUVFJfU0laRSB8IEFUVFJfQ1RJTUU7CisJbmV3YXR0cnMuaWFfdmFsaWQgPSBBVFRSX1NJWkUgfCB0aW1lX2F0dHJzOwogCWlmIChmaWxwKSB7CiAJCW5ld2F0dHJzLmlhX2ZpbGUgPSBmaWxwOwogCQluZXdhdHRycy5pYV92YWxpZCB8PSBBVFRSX0ZJTEU7CiAJfQogCi0JZG93bigmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAllcnIgPSBub3RpZnlfY2hhbmdlKGRlbnRyeSwgJm5ld2F0dHJzKTsKLQl1cCgmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgbG9uZyBkb19zeXNfdHJ1bmNhdGUoY29uc3QgY2hhciBfX3VzZXIgKiBwYXRoLCBsb2ZmX3QgbGVuZ3RoKQorc3RhdGljIGxvbmcgZG9fc3lzX3RydW5jYXRlKGNvbnN0IGNoYXIgX191c2VyICogcGF0aCwgbG9mZl90IGxlbmd0aCkKIHsKIAlzdHJ1Y3QgbmFtZWlkYXRhIG5kOwogCXN0cnVjdCBpbm9kZSAqIGlub2RlOwpAQCAtMjY2LDcgKzI2OSw3IEBACiAJZXJyb3IgPSBsb2Nrc192ZXJpZnlfdHJ1bmNhdGUoaW5vZGUsIE5VTEwsIGxlbmd0aCk7CiAJaWYgKCFlcnJvcikgewogCQlEUVVPVF9JTklUKGlub2RlKTsKLQkJZXJyb3IgPSBkb190cnVuY2F0ZShuZC5kZW50cnksIGxlbmd0aCwgTlVMTCk7CisJCWVycm9yID0gZG9fdHJ1bmNhdGUobmQuZGVudHJ5LCBsZW5ndGgsIDAsIE5VTEwpOwogCX0KIAlwdXRfd3JpdGVfYWNjZXNzKGlub2RlKTsKIApAQCAtMjgyLDcgKzI4NSw3IEBACiAJcmV0dXJuIGRvX3N5c190cnVuY2F0ZShwYXRoLCAobG9uZylsZW5ndGgpOwogfQogCi1zdGF0aWMgaW5saW5lIGxvbmcgZG9fc3lzX2Z0cnVuY2F0ZSh1bnNpZ25lZCBpbnQgZmQsIGxvZmZfdCBsZW5ndGgsIGludCBzbWFsbCkKK3N0YXRpYyBsb25nIGRvX3N5c19mdHJ1bmNhdGUodW5zaWduZWQgaW50IGZkLCBsb2ZmX3QgbGVuZ3RoLCBpbnQgc21hbGwpCiB7CiAJc3RydWN0IGlub2RlICogaW5vZGU7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwpAQCAtMzE4LDcgKzMyMSw3IEBACiAKIAllcnJvciA9IGxvY2tzX3ZlcmlmeV90cnVuY2F0ZShpbm9kZSwgZmlsZSwgbGVuZ3RoKTsKIAlpZiAoIWVycm9yKQotCQllcnJvciA9IGRvX3RydW5jYXRlKGRlbnRyeSwgbGVuZ3RoLCBmaWxlKTsKKwkJZXJyb3IgPSBkb190cnVuY2F0ZShkZW50cnksIGxlbmd0aCwgMCwgZmlsZSk7CiBvdXRfcHV0ZjoKIAlmcHV0KGZpbGUpOwogb3V0OgpAQCAtMzgxLDcgKzM4NCw3IEBACiAKIAkJZXJyb3IgPSBnZXRfdXNlcihuZXdhdHRycy5pYV9hdGltZS50dl9zZWMsICZ0aW1lcy0+YWN0aW1lKTsKIAkJbmV3YXR0cnMuaWFfYXRpbWUudHZfbnNlYyA9IDA7Ci0JCWlmICghZXJyb3IpIAorCQlpZiAoIWVycm9yKQogCQkJZXJyb3IgPSBnZXRfdXNlcihuZXdhdHRycy5pYV9tdGltZS50dl9zZWMsICZ0aW1lcy0+bW9kdGltZSk7CiAJCW5ld2F0dHJzLmlhX210aW1lLnR2X25zZWMgPSAwOwogCQlpZiAoZXJyb3IpCkBAIC0zOTcsOSArNDAwLDkgQEAKIAkJICAgIChlcnJvciA9IHZmc19wZXJtaXNzaW9uKCZuZCwgTUFZX1dSSVRFKSkgIT0gMCkKIAkJCWdvdG8gZHB1dF9hbmRfb3V0OwogCX0KLQlkb3duKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAllcnJvciA9IG5vdGlmeV9jaGFuZ2UobmQuZGVudHJ5LCAmbmV3YXR0cnMpOwotCXVwKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogZHB1dF9hbmRfb3V0OgogCXBhdGhfcmVsZWFzZSgmbmQpOwogb3V0OgpAQCAtNDEyLDE0ICs0MTUsMTQgQEAKICAqIG11c3QgYmUgb3duZXIgb3IgaGF2ZSB3cml0ZSBwZXJtaXNzaW9uLgogICogRWxzZSwgdXBkYXRlIGZyb20gKnRpbWVzLCBtdXN0IGJlIG93bmVyIG9yIHN1cGVyIHVzZXIuCiAgKi8KLWxvbmcgZG9fdXRpbWVzKGNoYXIgX191c2VyICogZmlsZW5hbWUsIHN0cnVjdCB0aW1ldmFsICogdGltZXMpCitsb25nIGRvX3V0aW1lcyhpbnQgZGZkLCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsIHN0cnVjdCB0aW1ldmFsICp0aW1lcykKIHsKIAlpbnQgZXJyb3I7CiAJc3RydWN0IG5hbWVpZGF0YSBuZDsKIAlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKIAlzdHJ1Y3QgaWF0dHIgbmV3YXR0cnM7CiAKLQllcnJvciA9IHVzZXJfcGF0aF93YWxrKGZpbGVuYW1lLCAmbmQpOworCWVycm9yID0gX191c2VyX3dhbGtfZmQoZGZkLCBmaWxlbmFtZSwgTE9PS1VQX0ZPTExPVywgJm5kKTsKIAogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7CkBAIC00NTAsMjIgKzQ1MywyNyBAQAogCQkgICAgKGVycm9yID0gdmZzX3Blcm1pc3Npb24oJm5kLCBNQVlfV1JJVEUpKSAhPSAwKQogCQkJZ290byBkcHV0X2FuZF9vdXQ7CiAJfQotCWRvd24oJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCWVycm9yID0gbm90aWZ5X2NoYW5nZShuZC5kZW50cnksICZuZXdhdHRycyk7Ci0JdXAoJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiBkcHV0X2FuZF9vdXQ6CiAJcGF0aF9yZWxlYXNlKCZuZCk7CiBvdXQ6CiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3V0aW1lcyhjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCBzdHJ1Y3QgdGltZXZhbCBfX3VzZXIgKiB1dGltZXMpCithc21saW5rYWdlIGxvbmcgc3lzX2Z1dGltZXNhdChpbnQgZGZkLCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsIHN0cnVjdCB0aW1ldmFsIF9fdXNlciAqdXRpbWVzKQogewogCXN0cnVjdCB0aW1ldmFsIHRpbWVzWzJdOwogCiAJaWYgKHV0aW1lcyAmJiBjb3B5X2Zyb21fdXNlcigmdGltZXMsIHV0aW1lcywgc2l6ZW9mKHRpbWVzKSkpCiAJCXJldHVybiAtRUZBVUxUOwotCXJldHVybiBkb191dGltZXMoZmlsZW5hbWUsIHV0aW1lcyA/IHRpbWVzIDogTlVMTCk7CisJcmV0dXJuIGRvX3V0aW1lcyhkZmQsIGZpbGVuYW1lLCB1dGltZXMgPyB0aW1lcyA6IE5VTEwpOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX3V0aW1lcyhjaGFyIF9fdXNlciAqZmlsZW5hbWUsIHN0cnVjdCB0aW1ldmFsIF9fdXNlciAqdXRpbWVzKQoreworCXJldHVybiBzeXNfZnV0aW1lc2F0KEFUX0ZEQ1dELCBmaWxlbmFtZSwgdXRpbWVzKTsKIH0KIAogCkBAIC00NzQsNyArNDgyLDcgQEAKICAqIFdlIGRvIHRoaXMgYnkgdGVtcG9yYXJpbHkgY2xlYXJpbmcgYWxsIEZTLXJlbGF0ZWQgY2FwYWJpbGl0aWVzIGFuZAogICogc3dpdGNoaW5nIHRoZSBmc3VpZC9mc2dpZCBhcm91bmQgdG8gdGhlIHJlYWwgb25lcy4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19hY2Nlc3MoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgaW50IG1vZGUpCithc21saW5rYWdlIGxvbmcgc3lzX2ZhY2Nlc3NhdChpbnQgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsIGludCBtb2RlKQogewogCXN0cnVjdCBuYW1laWRhdGEgbmQ7CiAJaW50IG9sZF9mc3VpZCwgb2xkX2ZzZ2lkOwpAQCAtNTA0LDcgKzUxMiw3IEBACiAJZWxzZQogCQljdXJyZW50LT5jYXBfZWZmZWN0aXZlID0gY3VycmVudC0+Y2FwX3Blcm1pdHRlZDsKIAotCXJlcyA9IF9fdXNlcl93YWxrKGZpbGVuYW1lLCBMT09LVVBfRk9MTE9XfExPT0tVUF9BQ0NFU1MsICZuZCk7CisJcmVzID0gX191c2VyX3dhbGtfZmQoZGZkLCBmaWxlbmFtZSwgTE9PS1VQX0ZPTExPV3xMT09LVVBfQUNDRVNTLCAmbmQpOwogCWlmICghcmVzKSB7CiAJCXJlcyA9IHZmc19wZXJtaXNzaW9uKCZuZCwgbW9kZSk7CiAJCS8qIFN1UyB2MiByZXF1aXJlcyB3ZSByZXBvcnQgYSByZWFkIG9ubHkgZnMgdG9vICovCkBAIC01MjEsNiArNTI5LDExIEBACiAJcmV0dXJuIHJlczsKIH0KIAorYXNtbGlua2FnZSBsb25nIHN5c19hY2Nlc3MoY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBpbnQgbW9kZSkKK3sKKwlyZXR1cm4gc3lzX2ZhY2Nlc3NhdChBVF9GRENXRCwgZmlsZW5hbWUsIG1vZGUpOworfQorCiBhc21saW5rYWdlIGxvbmcgc3lzX2NoZGlyKGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUpCiB7CiAJc3RydWN0IG5hbWVpZGF0YSBuZDsKQEAgLTYxOSwxMyArNjMyLDEzIEBACiAJZXJyID0gLUVQRVJNOwogCWlmIChJU19JTU1VVEFCTEUoaW5vZGUpIHx8IElTX0FQUEVORChpbm9kZSkpCiAJCWdvdG8gb3V0X3B1dGY7Ci0JZG93bigmaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJaWYgKG1vZGUgPT0gKG1vZGVfdCkgLTEpCiAJCW1vZGUgPSBpbm9kZS0+aV9tb2RlOwogCW5ld2F0dHJzLmlhX21vZGUgPSAobW9kZSAmIFNfSUFMTFVHTykgfCAoaW5vZGUtPmlfbW9kZSAmIH5TX0lBTExVR08pOwogCW5ld2F0dHJzLmlhX3ZhbGlkID0gQVRUUl9NT0RFIHwgQVRUUl9DVElNRTsKIAllcnIgPSBub3RpZnlfY2hhbmdlKGRlbnRyeSwgJm5ld2F0dHJzKTsKLQl1cCgmaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAogb3V0X3B1dGY6CiAJZnB1dChmaWxlKTsKQEAgLTYzMywxNCArNjQ2LDE1IEBACiAJcmV0dXJuIGVycjsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19jaG1vZChjb25zdCBjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCBtb2RlX3QgbW9kZSkKK2FzbWxpbmthZ2UgbG9uZyBzeXNfZmNobW9kYXQoaW50IGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLAorCQkJICAgICBtb2RlX3QgbW9kZSkKIHsKIAlzdHJ1Y3QgbmFtZWlkYXRhIG5kOwogCXN0cnVjdCBpbm9kZSAqIGlub2RlOwogCWludCBlcnJvcjsKIAlzdHJ1Y3QgaWF0dHIgbmV3YXR0cnM7CiAKLQllcnJvciA9IHVzZXJfcGF0aF93YWxrKGZpbGVuYW1lLCAmbmQpOworCWVycm9yID0gX191c2VyX3dhbGtfZmQoZGZkLCBmaWxlbmFtZSwgTE9PS1VQX0ZPTExPVywgJm5kKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwogCWlub2RlID0gbmQuZGVudHJ5LT5kX2lub2RlOwpAQCAtNjUzLDEzICs2NjcsMTMgQEAKIAlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpKQogCQlnb3RvIGRwdXRfYW5kX291dDsKIAotCWRvd24oJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCWlmIChtb2RlID09IChtb2RlX3QpIC0xKQogCQltb2RlID0gaW5vZGUtPmlfbW9kZTsKIAluZXdhdHRycy5pYV9tb2RlID0gKG1vZGUgJiBTX0lBTExVR08pIHwgKGlub2RlLT5pX21vZGUgJiB+U19JQUxMVUdPKTsKIAluZXdhdHRycy5pYV92YWxpZCA9IEFUVFJfTU9ERSB8IEFUVFJfQ1RJTUU7CiAJZXJyb3IgPSBub3RpZnlfY2hhbmdlKG5kLmRlbnRyeSwgJm5ld2F0dHJzKTsKLQl1cCgmaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAogZHB1dF9hbmRfb3V0OgogCXBhdGhfcmVsZWFzZSgmbmQpOwpAQCAtNjY3LDYgKzY4MSwxMSBAQAogCXJldHVybiBlcnJvcjsKIH0KIAorYXNtbGlua2FnZSBsb25nIHN5c19jaG1vZChjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsIG1vZGVfdCBtb2RlKQoreworCXJldHVybiBzeXNfZmNobW9kYXQoQVRfRkRDV0QsIGZpbGVuYW1lLCBtb2RlKTsKK30KKwogc3RhdGljIGludCBjaG93bl9jb21tb24oc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgdWlkX3QgdXNlciwgZ2lkX3QgZ3JvdXApCiB7CiAJc3RydWN0IGlub2RlICogaW5vZGU7CkBAIC02OTUsOSArNzE0LDkgQEAKIAl9CiAJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKQogCQluZXdhdHRycy5pYV92YWxpZCB8PSBBVFRSX0tJTExfU1VJRHxBVFRSX0tJTExfU0dJRDsKLQlkb3duKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAllcnJvciA9IG5vdGlmeV9jaGFuZ2UoZGVudHJ5LCAmbmV3YXR0cnMpOwotCXVwKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogb3V0OgogCXJldHVybiBlcnJvcjsKIH0KQEAgLTcxNSw2ICs3MzQsMjYgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKK2FzbWxpbmthZ2UgbG9uZyBzeXNfZmNob3duYXQoaW50IGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCB1aWRfdCB1c2VyLAorCQkJICAgICBnaWRfdCBncm91cCwgaW50IGZsYWcpCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCWludCBmb2xsb3c7CisKKwlpZiAoKGZsYWcgJiB+QVRfU1lNTElOS19OT0ZPTExPVykgIT0gMCkKKwkJZ290byBvdXQ7CisKKwlmb2xsb3cgPSAoZmxhZyAmIEFUX1NZTUxJTktfTk9GT0xMT1cpID8gMCA6IExPT0tVUF9GT0xMT1c7CisJZXJyb3IgPSBfX3VzZXJfd2Fsa19mZChkZmQsIGZpbGVuYW1lLCBmb2xsb3csICZuZCk7CisJaWYgKCFlcnJvcikgeworCQllcnJvciA9IGNob3duX2NvbW1vbihuZC5kZW50cnksIHVzZXIsIGdyb3VwKTsKKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJfQorb3V0OgorCXJldHVybiBlcnJvcjsKK30KKwogYXNtbGlua2FnZSBsb25nIHN5c19sY2hvd24oY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgdWlkX3QgdXNlciwgZ2lkX3QgZ3JvdXApCiB7CiAJc3RydWN0IG5hbWVpZGF0YSBuZDsKQEAgLTgxOCw3ICs4NTcsOCBAQAogICogZm9yIHRoZSBpbnRlcm5hbCByb3V0aW5lcyAoaWUgb3Blbl9uYW1laSgpL2ZvbGxvd19saW5rKCkgZXRjKS4gMDAgaXMKICAqIHVzZWQgYnkgc3ltbGlua3MuCiAgKi8KLXN0cnVjdCBmaWxlICpmaWxwX29wZW4oY29uc3QgY2hhciAqIGZpbGVuYW1lLCBpbnQgZmxhZ3MsIGludCBtb2RlKQorc3RhdGljIHN0cnVjdCBmaWxlICpkb19maWxwX29wZW4oaW50IGRmZCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBmbGFncywKKwkJCQkgaW50IG1vZGUpCiB7CiAJaW50IG5hbWVpX2ZsYWdzLCBlcnJvcjsKIAlzdHJ1Y3QgbmFtZWlkYXRhIG5kOwpAQCAtODI3LDEyICs4NjcsMTcgQEAKIAlpZiAoKG5hbWVpX2ZsYWdzKzEpICYgT19BQ0NNT0RFKQogCQluYW1laV9mbGFncysrOwogCi0JZXJyb3IgPSBvcGVuX25hbWVpKGZpbGVuYW1lLCBuYW1laV9mbGFncywgbW9kZSwgJm5kKTsKKwllcnJvciA9IG9wZW5fbmFtZWkoZGZkLCBmaWxlbmFtZSwgbmFtZWlfZmxhZ3MsIG1vZGUsICZuZCk7CiAJaWYgKCFlcnJvcikKIAkJcmV0dXJuIG5hbWVpZGF0YV90b19maWxwKCZuZCwgZmxhZ3MpOwogCiAJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwogfQorCitzdHJ1Y3QgZmlsZSAqZmlscF9vcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MsIGludCBtb2RlKQoreworCXJldHVybiBkb19maWxwX29wZW4oQVRfRkRDV0QsIGZpbGVuYW1lLCBmbGFncywgbW9kZSk7Cit9CiBFWFBPUlRfU1lNQk9MKGZpbHBfb3Blbik7CiAKIC8qKgpAQCAtOTcwLDcgKzEwMTUsNyBAQAogCiBFWFBPUlRfU1lNQk9MKGdldF91bnVzZWRfZmQpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19wdXRfdW51c2VkX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzLCB1bnNpZ25lZCBpbnQgZmQpCitzdGF0aWMgdm9pZCBfX3B1dF91bnVzZWRfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMsIHVuc2lnbmVkIGludCBmZCkKIHsKIAlzdHJ1Y3QgZmR0YWJsZSAqZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CiAJX19GRF9DTFIoZmQsIGZkdC0+b3Blbl9mZHMpOwpAQCAtOTg5LDcgKzEwMzQsNyBAQAogRVhQT1JUX1NZTUJPTChwdXRfdW51c2VkX2ZkKTsKIAogLyoKLSAqIEluc3RhbGwgYSBmaWxlIHBvaW50ZXIgaW4gdGhlIGZkIGFycmF5LiAgCisgKiBJbnN0YWxsIGEgZmlsZSBwb2ludGVyIGluIHRoZSBmZCBhcnJheS4KICAqCiAgKiBUaGUgVkZTIGlzIGZ1bGwgb2YgcGxhY2VzIHdoZXJlIHdlIGRyb3AgdGhlIGZpbGVzIGxvY2sgYmV0d2VlbgogICogc2V0dGluZyB0aGUgb3Blbl9mZHMgYml0bWFwIGFuZCBpbnN0YWxsaW5nIHRoZSBmaWxlIGluIHRoZSBmaWxlCkBAIC0xMDE0LDcgKzEwNTksNyBAQAogCiBFWFBPUlRfU1lNQk9MKGZkX2luc3RhbGwpOwogCi1sb25nIGRvX3N5c19vcGVuKGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwgaW50IGZsYWdzLCBpbnQgbW9kZSkKK2xvbmcgZG9fc3lzX29wZW4oaW50IGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MsIGludCBtb2RlKQogewogCWNoYXIgKnRtcCA9IGdldG5hbWUoZmlsZW5hbWUpOwogCWludCBmZCA9IFBUUl9FUlIodG1wKTsKQEAgLTEwMjIsNyArMTA2Nyw3IEBACiAJaWYgKCFJU19FUlIodG1wKSkgewogCQlmZCA9IGdldF91bnVzZWRfZmQoKTsKIAkJaWYgKGZkID49IDApIHsKLQkJCXN0cnVjdCBmaWxlICpmID0gZmlscF9vcGVuKHRtcCwgZmxhZ3MsIG1vZGUpOworCQkJc3RydWN0IGZpbGUgKmYgPSBkb19maWxwX29wZW4oZGZkLCB0bXAsIGZsYWdzLCBtb2RlKTsKIAkJCWlmIChJU19FUlIoZikpIHsKIAkJCQlwdXRfdW51c2VkX2ZkKGZkKTsKIAkJCQlmZCA9IFBUUl9FUlIoZik7CkBAIC0xMDQxLDEwICsxMDg2LDIwIEBACiAJaWYgKGZvcmNlX29fbGFyZ2VmaWxlKCkpCiAJCWZsYWdzIHw9IE9fTEFSR0VGSUxFOwogCi0JcmV0dXJuIGRvX3N5c19vcGVuKGZpbGVuYW1lLCBmbGFncywgbW9kZSk7CisJcmV0dXJuIGRvX3N5c19vcGVuKEFUX0ZEQ1dELCBmaWxlbmFtZSwgZmxhZ3MsIG1vZGUpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc3lzX29wZW4pOwogCithc21saW5rYWdlIGxvbmcgc3lzX29wZW5hdChpbnQgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsIGludCBmbGFncywKKwkJCSAgIGludCBtb2RlKQoreworCWlmIChmb3JjZV9vX2xhcmdlZmlsZSgpKQorCQlmbGFncyB8PSBPX0xBUkdFRklMRTsKKworCXJldHVybiBkb19zeXNfb3BlbihkZmQsIGZpbGVuYW1lLCBmbGFncywgbW9kZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzeXNfb3BlbmF0KTsKKwogI2lmbmRlZiBfX2FscGhhX18KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvS2NvbmZpZyBiL2ZzL3BhcnRpdGlvbnMvS2NvbmZpZwppbmRleCBlMjI3YTA0Li5jOWE0NzgwIDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL0tjb25maWcKKysrIGIvZnMvcGFydGl0aW9ucy9LY29uZmlnCkBAIC0yMSwyNiArMjEsMzAgQEAKIAkgIFN1cHBvcnQgaGFyZCBkaXNrcyBwYXJ0aXRpb25lZCB1bmRlciBBY29ybiBvcGVyYXRpbmcgc3lzdGVtcy4KIAogY29uZmlnIEFDT1JOX1BBUlRJVElPTl9DVU1BTkEKLQlib29sICJDdW1hbmEgcGFydGl0aW9uIHN1cHBvcnQiIGlmIFBBUlRJVElPTl9BRFZBTkNFRCAmJiBBQ09STl9QQVJUSVRJT04KKwlib29sICJDdW1hbmEgcGFydGl0aW9uIHN1cHBvcnQiIGlmIFBBUlRJVElPTl9BRFZBTkNFRAogCWRlZmF1bHQgeSBpZiBBUkNIX0FDT1JOCisJZGVwZW5kcyBvbiBBQ09STl9QQVJUSVRJT04KIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBoYXJkIGRpc2tzIHVuZGVyIExpbnV4IHdoaWNoCiAJICB3ZXJlIHBhcnRpdGlvbmVkIHVzaW5nIHRoZSBDdW1hbmEgaW50ZXJmYWNlIG9uIEFjb3JuIG1hY2hpbmVzLgogCiBjb25maWcgQUNPUk5fUEFSVElUSU9OX0VFU09YCi0JYm9vbCAiRUVTT1ggcGFydGl0aW9uIHN1cHBvcnQiIGlmIFBBUlRJVElPTl9BRFZBTkNFRCAmJiBBQ09STl9QQVJUSVRJT04KKwlib29sICJFRVNPWCBwYXJ0aXRpb24gc3VwcG9ydCIgaWYgUEFSVElUSU9OX0FEVkFOQ0VECiAJZGVmYXVsdCB5IGlmIEFSQ0hfQUNPUk4KKwlkZXBlbmRzIG9uIEFDT1JOX1BBUlRJVElPTgogCiBjb25maWcgQUNPUk5fUEFSVElUSU9OX0lDUwotCWJvb2wgIklDUyBwYXJ0aXRpb24gc3VwcG9ydCIgaWYgUEFSVElUSU9OX0FEVkFOQ0VEICYmIEFDT1JOX1BBUlRJVElPTgorCWJvb2wgIklDUyBwYXJ0aXRpb24gc3VwcG9ydCIgaWYgUEFSVElUSU9OX0FEVkFOQ0VECiAJZGVmYXVsdCB5IGlmIEFSQ0hfQUNPUk4KKwlkZXBlbmRzIG9uIEFDT1JOX1BBUlRJVElPTgogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIGhhcmQgZGlza3MgdW5kZXIgTGludXggd2hpY2gKIAkgIHdlcmUgcGFydGl0aW9uZWQgdXNpbmcgdGhlIElDUyBpbnRlcmZhY2Ugb24gQWNvcm4gbWFjaGluZXMuCiAKIGNvbmZpZyBBQ09STl9QQVJUSVRJT05fQURGUwotCWJvb2wgIk5hdGl2ZSBmaWxlY29yZSBwYXJ0aXRpb24gc3VwcG9ydCIgaWYgUEFSVElUSU9OX0FEVkFOQ0VEICYmIEFDT1JOX1BBUlRJVElPTgorCWJvb2wgIk5hdGl2ZSBmaWxlY29yZSBwYXJ0aXRpb24gc3VwcG9ydCIgaWYgUEFSVElUSU9OX0FEVkFOQ0VECiAJZGVmYXVsdCB5IGlmIEFSQ0hfQUNPUk4KKwlkZXBlbmRzIG9uIEFDT1JOX1BBUlRJVElPTgogCWhlbHAKIAkgIFRoZSBBY29ybiBEaXNjIEZpbGluZyBTeXN0ZW0gaXMgdGhlIHN0YW5kYXJkIGZpbGUgc3lzdGVtIG9mIHRoZQogCSAgUmlzY09TIG9wZXJhdGluZyBzeXN0ZW0gd2hpY2ggcnVucyBvbiBBY29ybidzIEFSTS1iYXNlZCBSaXNjIFBDCkBAIC00OCwxNSArNTIsMTcgQEAKIAkgIGBZJyBoZXJlLCBMaW51eCB3aWxsIHN1cHBvcnQgZGlzayBwYXJ0aXRpb25zIGNyZWF0ZWQgdW5kZXIgQURGUy4KIAogY29uZmlnIEFDT1JOX1BBUlRJVElPTl9QT1dFUlRFQwotCWJvb2wgIlBvd2VyVGVjIHBhcnRpdGlvbiBzdXBwb3J0IiBpZiBQQVJUSVRJT05fQURWQU5DRUQgJiYgQUNPUk5fUEFSVElUSU9OCisJYm9vbCAiUG93ZXJUZWMgcGFydGl0aW9uIHN1cHBvcnQiIGlmIFBBUlRJVElPTl9BRFZBTkNFRAogCWRlZmF1bHQgeSBpZiBBUkNIX0FDT1JOCisJZGVwZW5kcyBvbiBBQ09STl9QQVJUSVRJT04KIAloZWxwCiAJICBTdXBwb3J0IHJlYWRpbmcgcGFydGl0aW9uIHRhYmxlcyBjcmVhdGVkIG9uIEFjb3JuIG1hY2hpbmVzIHVzaW5nCiAJICB0aGUgUG93ZXJUZWMgU0NTSSBkcml2ZS4KIAogY29uZmlnIEFDT1JOX1BBUlRJVElPTl9SSVNDSVgKLQlib29sICJSSVNDaVggcGFydGl0aW9uIHN1cHBvcnQiIGlmIFBBUlRJVElPTl9BRFZBTkNFRCAmJiBBQ09STl9QQVJUSVRJT04KKwlib29sICJSSVNDaVggcGFydGl0aW9uIHN1cHBvcnQiIGlmIFBBUlRJVElPTl9BRFZBTkNFRAogCWRlZmF1bHQgeSBpZiBBUkNIX0FDT1JOCisJZGVwZW5kcyBvbiBBQ09STl9QQVJUSVRJT04KIAloZWxwCiAJICBPbmNlIHVwb24gYSB0aW1lLCB0aGVyZSB3YXMgYSBuYXRpdmUgVW5peCBwb3J0IGZvciB0aGUgQWNvcm4gc2VyaWVzCiAJICBvZiBtYWNoaW5lcyBjYWxsZWQgUklTQ2lYLiAgSWYgeW91IHNheSAnWScgaGVyZSwgTGludXggd2lsbCBiZSBhYmxlCkBAIC0yMTYsNiArMjIyLDEzIEBACiAJICBnaXZlbiBieSB0aGUgdGFyIHByb2dyYW0gKCJtYW4gdGFyIiBvciBwcmVmZXJhYmx5ICJpbmZvIHRhciIpLiBJZgogCSAgeW91IGRvbid0IGtub3cgd2hhdCBhbGwgdGhpcyBpcyBhYm91dCwgc2F5IE4uCiAKK2NvbmZpZyBLQVJNQV9QQVJUSVRJT04KKwlib29sICJLYXJtYSBQYXJ0aXRpb24gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBBUlRJVElPTl9BRFZBTkNFRAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdvdWxkIGxpa2UgdG8gbW91bnQgdGhlIFJpbyBLYXJtYSBNUDMgcGxheWVyLCBhcyBpdAorCSAgdXNlcyBhIHByb3ByaWV0YXJ5IHBhcnRpdGlvbiB0YWJsZS4KKwogY29uZmlnIEVGSV9QQVJUSVRJT04KIAlib29sICJFRkkgR1VJRCBQYXJ0aXRpb24gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBBUlRJVElPTl9BRFZBTkNFRApAQCAtMjI0LDUgKzIzNywzIEBACiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBoYXJkIGRpc2tzIHVuZGVyIExpbnV4IHdoaWNoCiAJICB3ZXJlIHBhcnRpdGlvbmVkIHVzaW5nIEVGSSBHUFQuICBQcmVzZW50bHkgb25seSB1c2VmdWwgb24gdGhlCiAJICBJQS02NCBwbGF0Zm9ybS4KLQotIyAgICAgIGRlZmluZV9ib29sIENPTkZJR19BQ09STl9QQVJUSVRJT05fQ1VNQU5BIHkKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvTWFrZWZpbGUgYi9mcy9wYXJ0aXRpb25zL01ha2VmaWxlCmluZGV4IDY2ZDVjYzIuLjQyYzdkMzggMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvTWFrZWZpbGUKKysrIGIvZnMvcGFydGl0aW9ucy9NYWtlZmlsZQpAQCAtMTcsMyArMTcsNCBAQAogb2JqLSQoQ09ORklHX1VMVFJJWF9QQVJUSVRJT04pICs9IHVsdHJpeC5vCiBvYmotJChDT05GSUdfSUJNX1BBUlRJVElPTikgKz0gaWJtLm8KIG9iai0kKENPTkZJR19FRklfUEFSVElUSU9OKSArPSBlZmkubworb2JqLSQoQ09ORklHX0tBUk1BX1BBUlRJVElPTikgKz0ga2FybWEubwpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9jaGVjay5jIGIvZnMvcGFydGl0aW9ucy9jaGVjay5jCmluZGV4IDc4ODFjZTAuLmY5MjRmNDUgMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvY2hlY2suYworKysgYi9mcy9wYXJ0aXRpb25zL2NoZWNrLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlICJpYm0uaCIKICNpbmNsdWRlICJ1bHRyaXguaCIKICNpbmNsdWRlICJlZmkuaCIKKyNpbmNsdWRlICJrYXJtYS5oIgogCiAjaWZkZWYgQ09ORklHX0JMS19ERVZfTUQKIGV4dGVybiB2b2lkIG1kX2F1dG9kZXRlY3RfZGV2KGRldl90IGRldik7CkBAIC0xMDMsNiArMTA0LDkgQEAKICNpZmRlZiBDT05GSUdfSUJNX1BBUlRJVElPTgogCWlibV9wYXJ0aXRpb24sCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfS0FSTUFfUEFSVElUSU9OCisJa2FybWFfcGFydGl0aW9uLAorI2VuZGlmCiAJTlVMTAogfTsKICAKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMva2FybWEuYyBiL2ZzL3BhcnRpdGlvbnMva2FybWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzZkODliCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcGFydGl0aW9ucy9rYXJtYS5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiAgZnMvcGFydGl0aW9ucy9rYXJtYS5jCisgKiAgUmlvIEthcm1hIHBhcnRpdGlvbiBpbmZvLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgQm9iIENvcGVsYW5kIChtZUBib2Jjb3BlbGFuZC5jb20pCisgKiAgYmFzZWQgb24gb3NmLmMKKyAqLworCisjaW5jbHVkZSAiY2hlY2suaCIKKyNpbmNsdWRlICJrYXJtYS5oIgorCitpbnQga2FybWFfcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJaW50IGk7CisJaW50IHNsb3QgPSAxOworCVNlY3RvciBzZWN0OworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJc3RydWN0IGRpc2tsYWJlbCB7CisJCXU4IGRfcmVzZXJ2ZWRbMjcwXTsKKwkJc3RydWN0IGRfcGFydGl0aW9uIHsKKwkJCV9fbGUzMiBwX3JlczsKKwkJCXU4IHBfZnN0eXBlOworCQkJdTggcF9yZXMyWzNdOworCQkJX19sZTMyIHBfb2Zmc2V0OworCQkJX19sZTMyIHBfc2l6ZTsKKwkJfSBkX3BhcnRpdGlvbnNbMl07CisJCXU4IGRfYmxhbmtbMjA4XTsKKwkJX19sZTE2IGRfbWFnaWM7CisJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSAqbGFiZWw7CisJc3RydWN0IGRfcGFydGl0aW9uICpwOworCisJZGF0YSA9IHJlYWRfZGV2X3NlY3RvcihiZGV2LCAwLCAmc2VjdCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLTE7CisKKwlsYWJlbCA9IChzdHJ1Y3QgZGlza2xhYmVsICopZGF0YTsKKwlpZiAobGUxNl90b19jcHUobGFiZWwtPmRfbWFnaWMpICE9IEtBUk1BX0xBQkVMX01BR0lDKSB7CisJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwID0gbGFiZWwtPmRfcGFydGl0aW9uczsKKwlmb3IgKGkgPSAwIDsgaSA8IDI7IGkrKywgcCsrKSB7CisJCWlmIChzbG90ID09IHN0YXRlLT5saW1pdCkKKwkJCWJyZWFrOworCisJCWlmIChwLT5wX2ZzdHlwZSA9PSAweDRkICYmIGxlMzJfdG9fY3B1KHAtPnBfc2l6ZSkpIHsKKwkJCXB1dF9wYXJ0aXRpb24oc3RhdGUsIHNsb3QsIGxlMzJfdG9fY3B1KHAtPnBfb2Zmc2V0KSwKKwkJCQlsZTMyX3RvX2NwdShwLT5wX3NpemUpKTsKKwkJfQorCQlzbG90Kys7CisJfQorCXByaW50aygiXG4iKTsKKwlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwlyZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9rYXJtYS5oIGIvZnMvcGFydGl0aW9ucy9rYXJtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZjdkM2YKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL2thcm1hLmgKQEAgLTAsMCArMSw4IEBACisvKgorICogIGZzL3BhcnRpdGlvbnMva2FybWEuaAorICovCisKKyNkZWZpbmUgS0FSTUFfTEFCRUxfTUFHSUMJCTB4QUI1NgorCitpbnQga2FybWFfcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpOworCmRpZmYgLS1naXQgYS9mcy9waXBlLmMgYi9mcy9waXBlLmMKaW5kZXggNjZhYTBiOS4uZDcyMjU3OSAxMDA2NDQKLS0tIGEvZnMvcGlwZS5jCisrKyBiL2ZzL3BpcGUuYwpAQCAtNDQsMTMgKzQ0LDEzIEBACiAJICogaXMgY29uc2lkZXJlZCBhIG5vbmludGVyYWN0aXZlIHdhaXQ6CiAJICovCiAJcHJlcGFyZV90b193YWl0KFBJUEVfV0FJVCgqaW5vZGUpLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFfFRBU0tfTk9OSU5URVJBQ1RJVkUpOwotCXVwKFBJUEVfU0VNKCppbm9kZSkpOworCW11dGV4X3VubG9jayhQSVBFX01VVEVYKCppbm9kZSkpOwogCXNjaGVkdWxlKCk7CiAJZmluaXNoX3dhaXQoUElQRV9XQUlUKCppbm9kZSksICZ3YWl0KTsKLQlkb3duKFBJUEVfU0VNKCppbm9kZSkpOworCW11dGV4X2xvY2soUElQRV9NVVRFWCgqaW5vZGUpKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbnQKIHBpcGVfaW92X2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBzdHJ1Y3QgaW92ZWMgKmlvdiwgdW5zaWduZWQgbG9uZyBsZW4pCiB7CiAJdW5zaWduZWQgbG9uZyBjb3B5OwpAQCAtNzAsNyArNzAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGludAogcGlwZV9pb3ZfY29weV90b191c2VyKHN0cnVjdCBpb3ZlYyAqaW92LCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIGxlbikKIHsKIAl1bnNpZ25lZCBsb25nIGNvcHk7CkBAIC0xMzYsNyArMTM2LDcgQEAKIAogCWRvX3dha2V1cCA9IDA7CiAJcmV0ID0gMDsKLQlkb3duKFBJUEVfU0VNKCppbm9kZSkpOworCW11dGV4X2xvY2soUElQRV9NVVRFWCgqaW5vZGUpKTsKIAlpbmZvID0gaW5vZGUtPmlfcGlwZTsKIAlmb3IgKDs7KSB7CiAJCWludCBidWZzID0gaW5mby0+bnJidWZzOwpAQCAtMjAwLDcgKzIwMCw3IEBACiAJCX0KIAkJcGlwZV93YWl0KGlub2RlKTsKIAl9Ci0JdXAoUElQRV9TRU0oKmlub2RlKSk7CisJbXV0ZXhfdW5sb2NrKFBJUEVfTVVURVgoKmlub2RlKSk7CiAJLyogU2lnbmFsIHdyaXRlcnMgYXN5bmNocm9ub3VzbHkgdGhhdCB0aGVyZSBpcyBtb3JlIHJvb20uICAqLwogCWlmIChkb193YWtldXApIHsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKFBJUEVfV0FJVCgqaW5vZGUpKTsKQEAgLTIzNyw3ICsyMzcsNyBAQAogCiAJZG9fd2FrZXVwID0gMDsKIAlyZXQgPSAwOwotCWRvd24oUElQRV9TRU0oKmlub2RlKSk7CisJbXV0ZXhfbG9jayhQSVBFX01VVEVYKCppbm9kZSkpOwogCWluZm8gPSBpbm9kZS0+aV9waXBlOwogCiAJaWYgKCFQSVBFX1JFQURFUlMoKmlub2RlKSkgewpAQCAtMzQxLDEzICszNDEsMTMgQEAKIAkJUElQRV9XQUlUSU5HX1dSSVRFUlMoKmlub2RlKS0tOwogCX0KIG91dDoKLQl1cChQSVBFX1NFTSgqaW5vZGUpKTsKKwltdXRleF91bmxvY2soUElQRV9NVVRFWCgqaW5vZGUpKTsKIAlpZiAoZG9fd2FrZXVwKSB7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZShQSVBFX1dBSVQoKmlub2RlKSk7CiAJCWtpbGxfZmFzeW5jKFBJUEVfRkFTWU5DX1JFQURFUlMoKmlub2RlKSwgU0lHSU8sIFBPTExfSU4pOwogCX0KIAlpZiAocmV0ID4gMCkKLQkJaW5vZGVfdXBkYXRlX3RpbWUoaW5vZGUsIDEpOwkvKiBtdGltZSBhbmQgY3RpbWUgKi8KKwkJZmlsZV91cGRhdGVfdGltZShmaWxwKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zODEsNyArMzgxLDcgQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJCWNhc2UgRklPTlJFQUQ6Ci0JCQlkb3duKFBJUEVfU0VNKCppbm9kZSkpOworCQkJbXV0ZXhfbG9jayhQSVBFX01VVEVYKCppbm9kZSkpOwogCQkJaW5mbyA9ICBpbm9kZS0+aV9waXBlOwogCQkJY291bnQgPSAwOwogCQkJYnVmID0gaW5mby0+Y3VyYnVmOwpAQCAtMzkwLDcgKzM5MCw3IEBACiAJCQkJY291bnQgKz0gaW5mby0+YnVmc1tidWZdLmxlbjsKIAkJCQlidWYgPSAoYnVmKzEpICYgKFBJUEVfQlVGRkVSUy0xKTsKIAkJCX0KLQkJCXVwKFBJUEVfU0VNKCppbm9kZSkpOworCQkJbXV0ZXhfdW5sb2NrKFBJUEVfTVVURVgoKmlub2RlKSk7CiAJCQlyZXR1cm4gcHV0X3VzZXIoY291bnQsIChpbnQgX191c2VyICopYXJnKTsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtNDMzLDcgKzQzMyw3IEBACiBzdGF0aWMgaW50CiBwaXBlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGRlY3IsIGludCBkZWN3KQogewotCWRvd24oUElQRV9TRU0oKmlub2RlKSk7CisJbXV0ZXhfbG9jayhQSVBFX01VVEVYKCppbm9kZSkpOwogCVBJUEVfUkVBREVSUygqaW5vZGUpIC09IGRlY3I7CiAJUElQRV9XUklURVJTKCppbm9kZSkgLT0gZGVjdzsKIAlpZiAoIVBJUEVfUkVBREVSUygqaW5vZGUpICYmICFQSVBFX1dSSVRFUlMoKmlub2RlKSkgewpAQCAtNDQzLDcgKzQ0Myw3IEBACiAJCWtpbGxfZmFzeW5jKFBJUEVfRkFTWU5DX1JFQURFUlMoKmlub2RlKSwgU0lHSU8sIFBPTExfSU4pOwogCQlraWxsX2Zhc3luYyhQSVBFX0ZBU1lOQ19XUklURVJTKCppbm9kZSksIFNJR0lPLCBQT0xMX09VVCk7CiAJfQotCXVwKFBJUEVfU0VNKCppbm9kZSkpOworCW11dGV4X3VubG9jayhQSVBFX01VVEVYKCppbm9kZSkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NTQsOSArNDU0LDkgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CiAJaW50IHJldHZhbDsKIAotCWRvd24oUElQRV9TRU0oKmlub2RlKSk7CisJbXV0ZXhfbG9jayhQSVBFX01VVEVYKCppbm9kZSkpOwogCXJldHZhbCA9IGZhc3luY19oZWxwZXIoZmQsIGZpbHAsIG9uLCBQSVBFX0ZBU1lOQ19SRUFERVJTKCppbm9kZSkpOwotCXVwKFBJUEVfU0VNKCppbm9kZSkpOworCW11dGV4X3VubG9jayhQSVBFX01VVEVYKCppbm9kZSkpOwogCiAJaWYgKHJldHZhbCA8IDApCiAJCXJldHVybiByZXR2YWw7CkBAIC00NzEsOSArNDcxLDkgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CiAJaW50IHJldHZhbDsKIAotCWRvd24oUElQRV9TRU0oKmlub2RlKSk7CisJbXV0ZXhfbG9jayhQSVBFX01VVEVYKCppbm9kZSkpOwogCXJldHZhbCA9IGZhc3luY19oZWxwZXIoZmQsIGZpbHAsIG9uLCBQSVBFX0ZBU1lOQ19XUklURVJTKCppbm9kZSkpOwotCXVwKFBJUEVfU0VNKCppbm9kZSkpOworCW11dGV4X3VubG9jayhQSVBFX01VVEVYKCppbm9kZSkpOwogCiAJaWYgKHJldHZhbCA8IDApCiAJCXJldHVybiByZXR2YWw7CkBAIC00ODgsMTQgKzQ4OCwxNCBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgcmV0dmFsOwogCi0JZG93bihQSVBFX1NFTSgqaW5vZGUpKTsKKwltdXRleF9sb2NrKFBJUEVfTVVURVgoKmlub2RlKSk7CiAKIAlyZXR2YWwgPSBmYXN5bmNfaGVscGVyKGZkLCBmaWxwLCBvbiwgUElQRV9GQVNZTkNfUkVBREVSUygqaW5vZGUpKTsKIAogCWlmIChyZXR2YWwgPj0gMCkKIAkJcmV0dmFsID0gZmFzeW5jX2hlbHBlcihmZCwgZmlscCwgb24sIFBJUEVfRkFTWU5DX1dSSVRFUlMoKmlub2RlKSk7CiAKLQl1cChQSVBFX1NFTSgqaW5vZGUpKTsKKwltdXRleF91bmxvY2soUElQRV9NVVRFWCgqaW5vZGUpKTsKIAogCWlmIChyZXR2YWwgPCAwKQogCQlyZXR1cm4gcmV0dmFsOwpAQCAtNTM0LDkgKzUzNCw5IEBACiB7CiAJLyogV2UgY291bGQgaGF2ZSBwZXJoYXBzIHVzZWQgYXRvbWljX3QsIGJ1dCB0aGlzIGFuZCBmcmllbmRzCiAJICAgYmVsb3cgYXJlIHRoZSBvbmx5IHBsYWNlcy4gIFNvIGl0IGRvZXNuJ3Qgc2VlbSB3b3J0aHdoaWxlLiAgKi8KLQlkb3duKFBJUEVfU0VNKCppbm9kZSkpOworCW11dGV4X2xvY2soUElQRV9NVVRFWCgqaW5vZGUpKTsKIAlQSVBFX1JFQURFUlMoKmlub2RlKSsrOwotCXVwKFBJUEVfU0VNKCppbm9kZSkpOworCW11dGV4X3VubG9jayhQSVBFX01VVEVYKCppbm9kZSkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NDQsOSArNTQ0LDkgQEAKIHN0YXRpYyBpbnQKIHBpcGVfd3JpdGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkb3duKFBJUEVfU0VNKCppbm9kZSkpOworCW11dGV4X2xvY2soUElQRV9NVVRFWCgqaW5vZGUpKTsKIAlQSVBFX1dSSVRFUlMoKmlub2RlKSsrOwotCXVwKFBJUEVfU0VNKCppbm9kZSkpOworCW11dGV4X3VubG9jayhQSVBFX01VVEVYKCppbm9kZSkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NTQsMTIgKzU1NCwxMiBAQAogc3RhdGljIGludAogcGlwZV9yZHdyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JZG93bihQSVBFX1NFTSgqaW5vZGUpKTsKKwltdXRleF9sb2NrKFBJUEVfTVVURVgoKmlub2RlKSk7CiAJaWYgKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCiAJCVBJUEVfUkVBREVSUygqaW5vZGUpKys7CiAJaWYgKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQogCQlQSVBFX1dSSVRFUlMoKmlub2RlKSsrOwotCXVwKFBJUEVfU0VNKCppbm9kZSkpOworCW11dGV4X3VubG9jayhQSVBFX01VVEVYKCppbm9kZSkpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9wbm9kZS5jIGIvZnMvcG5vZGUuYwppbmRleCBhZWVlYzhiLi5mMTg3MWY3IDEwMDY0NAotLS0gYS9mcy9wbm9kZS5jCisrKyBiL2ZzL3Bub2RlLmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogCQlzdHJ1Y3QgdmZzbW91bnQgKm5leHQ7CiAJCXN0cnVjdCB2ZnNtb3VudCAqbWFzdGVyID0gbS0+bW50X21hc3RlcjsKIAotCQlpZiAoIG1hc3RlciA9PSBvcmlnaW4tPm1udF9tYXN0ZXIgKSB7CisJCWlmIChtYXN0ZXIgPT0gb3JpZ2luLT5tbnRfbWFzdGVyKSB7CiAJCQluZXh0ID0gbmV4dF9wZWVyKG0pOwogCQkJcmV0dXJuICgobmV4dCA9PSBvcmlnaW4pID8gTlVMTCA6IG5leHQpOwogCQl9IGVsc2UgaWYgKG0tPm1udF9zbGF2ZS5uZXh0ICE9ICZtYXN0ZXItPm1udF9zbGF2ZV9saXN0KQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9hcnJheS5jIGIvZnMvcHJvYy9hcnJheS5jCmluZGV4IDVlOTI1MWY2Li43ZWIxYmQ3IDEwMDY0NAotLS0gYS9mcy9wcm9jL2FycmF5LmMKKysrIGIvZnMvcHJvYy9hcnJheS5jCkBAIC0zMzAsNyArMzMwLDcgQEAKIAl1bnNpZ25lZCBsb25nICBtaW5fZmx0ID0gMCwgIG1hal9mbHQgPSAwOwogCWNwdXRpbWVfdCBjdXRpbWUsIGNzdGltZSwgdXRpbWUsIHN0aW1lOwogCXVuc2lnbmVkIGxvbmcgcnNzbGltID0gMDsKLQl1bnNpZ25lZCBsb25nIGl0X3JlYWxfdmFsdWUgPSAwOworCURFRklORV9LVElNRShpdF9yZWFsX3ZhbHVlKTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQ7CiAJY2hhciB0Y29tbVtzaXplb2YodGFzay0+Y29tbSldOwogCkBAIC0zODYsNyArMzg2LDcgQEAKIAkJCXV0aW1lID0gY3B1dGltZV9hZGQodXRpbWUsIHRhc2stPnNpZ25hbC0+dXRpbWUpOwogCQkJc3RpbWUgPSBjcHV0aW1lX2FkZChzdGltZSwgdGFzay0+c2lnbmFsLT5zdGltZSk7CiAJCX0KLQkJaXRfcmVhbF92YWx1ZSA9IHRhc2stPnNpZ25hbC0+aXRfcmVhbF92YWx1ZTsKKwkJaXRfcmVhbF92YWx1ZSA9IHRhc2stPnNpZ25hbC0+cmVhbF90aW1lci5leHBpcmVzOwogCX0KIAlwcGlkID0gcGlkX2FsaXZlKHRhc2spID8gdGFzay0+Z3JvdXBfbGVhZGVyLT5yZWFsX3BhcmVudC0+dGdpZCA6IDA7CiAJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwpAQCAtNDM1LDcgKzQzNSw3IEBACiAJCXByaW9yaXR5LAogCQluaWNlLAogCQludW1fdGhyZWFkcywKLQkJamlmZmllc190b19jbG9ja190KGl0X3JlYWxfdmFsdWUpLAorCQkobG9uZykga3RpbWVfdG9fY2xvY2tfdChpdF9yZWFsX3ZhbHVlKSwKIAkJc3RhcnRfdGltZSwKIAkJdnNpemUsCiAJCW1tID8gZ2V0X21tX3JzcyhtbSkgOiAwLApkaWZmIC0tZ2l0IGEvZnMvcHJvYy9iYXNlLmMgYi9mcy9wcm9jL2Jhc2UuYwppbmRleCA2MzQzNTVlLi4yMGZlYjc1IDEwMDY0NAotLS0gYS9mcy9wcm9jL2Jhc2UuYworKysgYi9mcy9wcm9jL2Jhc2UuYwpAQCAtNTUsNiArNTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KZGlmZiAtLWdpdCBhL2ZzL3Byb2MvZ2VuZXJpYy5jIGIvZnMvcHJvYy9nZW5lcmljLmMKaW5kZXggNzJiNDMxZC4uMjBlNWM0NSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9nZW5lcmljLmMKKysrIGIvZnMvcHJvYy9nZW5lcmljLmMKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwogc3RhdGljIHNzaXplX3QgcHJvY19maWxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCiAJCQkgICAgICBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpOwogc3RhdGljIHNzaXplX3QgcHJvY19maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLApkaWZmIC0tZ2l0IGEvZnMvcHJvYy9pbm9kZS5jIGIvZnMvcHJvYy9pbm9kZS5jCmluZGV4IGU2YTgxOGEuLjY1NzNmMzEgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvaW5vZGUuYworKysgYi9mcy9wcm9jL2lub2RlLmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotZXh0ZXJuIHZvaWQgZnJlZV9wcm9jX2VudHJ5KHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKTsKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqIGRlX2dldChzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlKQogewpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9pbnRlcm5hbC5oIGIvZnMvcHJvYy9pbnRlcm5hbC5oCmluZGV4IDNlNTUxOTguLjk1YTFjZjMgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvaW50ZXJuYWwuaAorKysgYi9mcy9wcm9jL2ludGVybmFsLmgKQEAgLTM3LDYgKzM3LDEwIEBACiBleHRlcm4gaW50IHByb2NfcGlkX3N0YXR1cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgY2hhciAqKTsKIGV4dGVybiBpbnQgcHJvY19waWRfc3RhdG0oc3RydWN0IHRhc2tfc3RydWN0ICosIGNoYXIgKik7CiAKK3ZvaWQgZnJlZV9wcm9jX2VudHJ5KHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGUpOworCitpbnQgcHJvY19pbml0X2lub2RlY2FjaGUodm9pZCk7CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRhc2tfc3RydWN0ICpwcm9jX3Rhc2soc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlyZXR1cm4gUFJPQ19JKGlub2RlKS0+dGFzazsKZGlmZiAtLWdpdCBhL2ZzL3Byb2Mva2NvcmUuYyBiL2ZzL3Byb2Mva2NvcmUuYwppbmRleCAxYzdkYTk4Li5hZGMyY2Q5IDEwMDY0NAotLS0gYS9mcy9wcm9jL2tjb3JlLmMKKysrIGIvZnMvcHJvYy9rY29yZS5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KICNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9lbGYuaD4KICNpbmNsdWRlIDxsaW51eC9lbGZjb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9wcm9jX2RldnRyZWUuYyBiL2ZzL3Byb2MvcHJvY19kZXZ0cmVlLmMKaW5kZXggZmIxMTdiNy4uOWJkZDA3NyAxMDA2NDQKLS0tIGEvZnMvcHJvYy9wcm9jX2RldnRyZWUuYworKysgYi9mcy9wcm9jL3Byb2NfZGV2dHJlZS5jCkBAIC04MSw2ICs4MSwzMCBAQAogCV9fcHJvY19kZXZpY2VfdHJlZV9hZGRfcHJvcChwZGUsIHByb3ApOwogfQogCit2b2lkIHByb2NfZGV2aWNlX3RyZWVfcmVtb3ZlX3Byb3Aoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUsCisJCQkJICBzdHJ1Y3QgcHJvcGVydHkgKnByb3ApCit7CisJcmVtb3ZlX3Byb2NfZW50cnkocHJvcC0+bmFtZSwgcGRlKTsKK30KKwordm9pZCBwcm9jX2RldmljZV90cmVlX3VwZGF0ZV9wcm9wKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlLAorCQkJCSAgc3RydWN0IHByb3BlcnR5ICpuZXdwcm9wLAorCQkJCSAgc3RydWN0IHByb3BlcnR5ICpvbGRwcm9wKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50OworCisJZm9yIChlbnQgPSBwZGUtPnN1YmRpcjsgZW50ICE9IE5VTEw7IGVudCA9IGVudC0+bmV4dCkKKwkJaWYgKGVudC0+ZGF0YSA9PSBvbGRwcm9wKQorCQkJYnJlYWs7CisJaWYgKGVudCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImRldmljZS10cmVlOiBwcm9wZXJ0eSBcIiVzXCIgIgorCQkgICAgICAgIiBkb2VzIG5vdCBleGlzdFxuIiwgb2xkcHJvcC0+bmFtZSk7CisJfSBlbHNlIHsKKwkJZW50LT5kYXRhID0gbmV3cHJvcDsKKwkJZW50LT5zaXplID0gbmV3cHJvcC0+bGVuZ3RoOworCX0KK30KKwogLyoKICAqIFByb2Nlc3MgYSBub2RlLCBhZGRpbmcgZW50cmllcyBmb3IgaXRzIGNoaWxkcmVuIGFuZCBpdHMgcHJvcGVydGllcy4KICAqLwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9wcm9jX21pc2MuYyBiL2ZzL3Byb2MvcHJvY19taXNjLmMKaW5kZXggNWI2YjBiNi4uOGY4MDE0MiAxMDA2NDQKLS0tIGEvZnMvcHJvYy9wcm9jX21pc2MuYworKysgYi9mcy9wcm9jL3Byb2NfbWlzYy5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CkBAIC02Miw3ICs2Myw2IEBACiAgKi8KIGV4dGVybiBpbnQgZ2V0X2hhcmR3YXJlX2xpc3QoY2hhciAqKTsKIGV4dGVybiBpbnQgZ2V0X3N0cmFtX2xpc3QoY2hhciAqKTsKLWV4dGVybiBpbnQgZ2V0X2NocmRldl9saXN0KGNoYXIgKik7CiBleHRlcm4gaW50IGdldF9maWxlc3lzdGVtX2xpc3QoY2hhciAqKTsKIGV4dGVybiBpbnQgZ2V0X2V4ZWNfZG9tYWluX2xpc3QoY2hhciAqKTsKIGV4dGVybiBpbnQgZ2V0X2RtYV9saXN0KGNoYXIgKik7CkBAIC0yNDgsNiArMjQ4LDE1NCBAQAogewogCXJldHVybiBzZXFfb3BlbihmaWxlLCAmY3B1aW5mb19vcCk7CiB9CisKK2VudW0gZGV2aW5mb19zdGF0ZXMgeworCUNIUl9IRFIsCisJQ0hSX0xJU1QsCisJQkxLX0hEUiwKKwlCTEtfTElTVCwKKwlERVZJTkZPX0RPTkUKK307CisKK3N0cnVjdCBkZXZpbmZvX3N0YXRlIHsKKwl2b2lkICpjaHJkZXY7CisJdm9pZCAqYmxrZGV2OworCXVuc2lnbmVkIGludCBudW1fcmVjb3JkczsKKwl1bnNpZ25lZCBpbnQgY3VyX3JlY29yZDsKKwllbnVtIGRldmluZm9fc3RhdGVzIHN0YXRlOworfTsKKworc3RhdGljIHZvaWQgKmRldmluZm9fc3RhcnQoc3RydWN0IHNlcV9maWxlICpmLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgZGV2aW5mb19zdGF0ZSAqaW5mbyA9IGYtPnByaXZhdGU7CisKKwlpZiAoKnBvcykgeworCQlpZiAoKGluZm8pICYmICgqcG9zIDw9IGluZm8tPm51bV9yZWNvcmRzKSkKKwkJCXJldHVybiBpbmZvOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJZi0+cHJpdmF0ZSA9IGluZm87CisJaW5mby0+Y2hyZGV2ID0gYWNxdWlyZV9jaHJkZXZfbGlzdCgpOworCWluZm8tPmJsa2RldiA9IGFjcXVpcmVfYmxrZGV2X2xpc3QoKTsKKwlpbmZvLT5zdGF0ZSA9IENIUl9IRFI7CisJaW5mby0+bnVtX3JlY29yZHMgPSBjb3VudF9jaHJkZXZfbGlzdCgpOworCWluZm8tPm51bV9yZWNvcmRzICs9IGNvdW50X2Jsa2Rldl9saXN0KCk7CisJaW5mby0+bnVtX3JlY29yZHMgKz0gMjsgLyogQ2hhcmFjdGVyIGFuZCBCbG9jayBoZWFkZXJzICovCisJKnBvcyA9IDE7CisJaW5mby0+Y3VyX3JlY29yZCA9ICpwb3M7CisJcmV0dXJuIGluZm87Cit9CisKK3N0YXRpYyB2b2lkICpkZXZpbmZvX25leHQoc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlpbnQgaWR1bW15OworCWNoYXIgKm5kdW1teTsKKwlzdHJ1Y3QgZGV2aW5mb19zdGF0ZSAqaW5mbyA9IGYtPnByaXZhdGU7CisKKwlzd2l0Y2ggKGluZm8tPnN0YXRlKSB7CisJCWNhc2UgQ0hSX0hEUjoKKwkJCWluZm8tPnN0YXRlID0gQ0hSX0xJU1Q7CisJCQkoKnBvcykrKzsKKwkJCS8qZmFsbHRocm91Z2gqLworCQljYXNlIENIUl9MSVNUOgorCQkJaWYgKGdldF9jaHJkZXZfaW5mbyhpbmZvLT5jaHJkZXYsJmlkdW1teSwmbmR1bW15KSkgeworCQkJCS8qCisJCQkJICogVGhlIGNoYXJhY3RlciBkZXYgbGlzdCBpcyBjb21wbGV0ZQorCQkJCSAqLworCQkJCWluZm8tPnN0YXRlID0gQkxLX0hEUjsKKwkJCX0gZWxzZSB7CisJCQkJaW5mby0+Y2hyZGV2ID0gZ2V0X25leHRfY2hyZGV2KGluZm8tPmNocmRldik7CisJCQl9CisJCQkoKnBvcykrKzsKKwkJCWJyZWFrOworCQljYXNlIEJMS19IRFI6CisJCQlpbmZvLT5zdGF0ZSA9IEJMS19MSVNUOworCQkJKCpwb3MpKys7CisJCQlicmVhazsKKwkJY2FzZSBCTEtfTElTVDoKKwkJCWlmIChnZXRfYmxrZGV2X2luZm8oaW5mby0+YmxrZGV2LCZpZHVtbXksJm5kdW1teSkpIHsKKwkJCQkvKgorCQkJCSAqIFRoZSBibG9jayBkZXYgbGlzdCBpcyBjb21wbGV0ZQorCQkJCSAqLworCQkJCWluZm8tPnN0YXRlID0gREVWSU5GT19ET05FOworCQkJfSBlbHNlIHsKKwkJCQlpbmZvLT5ibGtkZXYgPSBnZXRfbmV4dF9ibGtkZXYoaW5mby0+YmxrZGV2KTsKKwkJCX0KKwkJCSgqcG9zKSsrOworCQkJYnJlYWs7CisJCWNhc2UgREVWSU5GT19ET05FOgorCQkJKCpwb3MpKys7CisJCQlpbmZvLT5jdXJfcmVjb3JkID0gKnBvczsKKwkJCWluZm8gPSBOVUxMOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisJaWYgKGluZm8pCisJCWluZm8tPmN1cl9yZWNvcmQgPSAqcG9zOworCXJldHVybiBpbmZvOworfQorCitzdGF0aWMgdm9pZCBkZXZpbmZvX3N0b3Aoc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2KQoreworCXN0cnVjdCBkZXZpbmZvX3N0YXRlICppbmZvID0gZi0+cHJpdmF0ZTsKKworCWlmIChpbmZvKSB7CisJCXJlbGVhc2VfY2hyZGV2X2xpc3QoaW5mby0+Y2hyZGV2KTsKKwkJcmVsZWFzZV9ibGtkZXZfbGlzdChpbmZvLT5ibGtkZXYpOworCQlmLT5wcml2YXRlID0gTlVMTDsKKwkJa2ZyZWUoaW5mbyk7CisJfQorfQorCitzdGF0aWMgaW50IGRldmluZm9fc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKmFyZykKK3sKKwlpbnQgbWFqb3I7CisJY2hhciAqbmFtZTsKKwlzdHJ1Y3QgZGV2aW5mb19zdGF0ZSAqaW5mbyA9IGYtPnByaXZhdGU7CisKKwlzd2l0Y2goaW5mby0+c3RhdGUpIHsKKwkJY2FzZSBDSFJfSERSOgorCQkJc2VxX3ByaW50ZihmLCJDaGFyYWN0ZXIgZGV2aWNlczpcbiIpOworCQkJLyogZmFsbHRocm91Z2ggKi8KKwkJY2FzZSBDSFJfTElTVDoKKwkJCWlmICghZ2V0X2NocmRldl9pbmZvKGluZm8tPmNocmRldiwmbWFqb3IsJm5hbWUpKQorCQkJCXNlcV9wcmludGYoZiwiJTNkICVzXG4iLG1ham9yLG5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgQkxLX0hEUjoKKwkJCXNlcV9wcmludGYoZiwiXG5CbG9jayBkZXZpY2VzOlxuIik7CisJCQkvKiBmYWxsdGhyb3VnaCAqLworCQljYXNlIEJMS19MSVNUOgorCQkJaWYgKCFnZXRfYmxrZGV2X2luZm8oaW5mby0+YmxrZGV2LCZtYWpvciwmbmFtZSkpCisJCQkJc2VxX3ByaW50ZihmLCIlM2QgJXNcbiIsbWFqb3IsbmFtZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBkZXZpbmZvX29wID0geworCS5zdGFydCAgPSBkZXZpbmZvX3N0YXJ0LAorCS5uZXh0ICAgPSBkZXZpbmZvX25leHQsCisJLnN0b3AgICA9IGRldmluZm9fc3RvcCwKKwkuc2hvdyAgID0gZGV2aW5mb19zaG93LAorfTsKKworc3RhdGljIGludCBkZXZpbmZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZkZXZpbmZvX29wKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19kZXZpbmZvX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gZGV2aW5mb19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2NwdWluZm9fb3BlcmF0aW9ucyA9IHsKIAkub3BlbgkJPSBjcHVpbmZvX29wZW4sCiAJLnJlYWQJCT0gc2VxX3JlYWQsCkBAIC0zMjMsNiArNDcxLDcgQEAKIH07CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19TTEFCCiBleHRlcm4gc3RydWN0IHNlcV9vcGVyYXRpb25zIHNsYWJpbmZvX29wOwogZXh0ZXJuIHNzaXplX3Qgc2xhYmluZm9fd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CiBzdGF0aWMgaW50IHNsYWJpbmZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCkBAIC0zMzYsNiArNDg1LDcgQEAKIAkubGxzZWVrCQk9IHNlcV9sc2VlaywKIAkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAogfTsKKyNlbmRpZgogCiBzdGF0aWMgaW50IHNob3dfc3RhdChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCiB7CkBAIC00NDgsMTQgKzU5OCw2IEBACiAJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKLXN0YXRpYyBpbnQgZGV2aWNlc19yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCQkJIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0JaW50IGxlbiA9IGdldF9jaHJkZXZfbGlzdChwYWdlKTsKLQlsZW4gKz0gZ2V0X2Jsa2Rldl9saXN0KHBhZ2UrbGVuLCBsZW4pOwotCXJldHVybiBwcm9jX2NhbGNfbWV0cmljcyhwYWdlLCBzdGFydCwgb2ZmLCBjb3VudCwgZW9mLCBsZW4pOwotfQotCiAvKgogICogL3Byb2MvaW50ZXJydXB0cwogICovCkBAIC01ODAsNyArNzIyLDYgQEAKICNpZmRlZiBDT05GSUdfU1RSQU1fUFJPQwogCQl7InN0cmFtIiwJc3RyYW1fcmVhZF9wcm9jfSwKICNlbmRpZgotCQl7ImRldmljZXMiLAlkZXZpY2VzX3JlYWRfcHJvY30sCiAJCXsiZmlsZXN5c3RlbXMiLAlmaWxlc3lzdGVtc19yZWFkX3Byb2N9LAogCQl7ImNtZGxpbmUiLAljbWRsaW5lX3JlYWRfcHJvY30sCiAJCXsibG9ja3MiLAlsb2Nrc19yZWFkX3Byb2N9LApAQCAtNTk2LDExICs3MzcsMTQgQEAKIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJrbXNnIiwgU19JUlVTUiwgJnByb2Nfcm9vdCk7CiAJaWYgKGVudHJ5KQogCQllbnRyeS0+cHJvY19mb3BzID0gJnByb2Nfa21zZ19vcGVyYXRpb25zOworCWNyZWF0ZV9zZXFfZW50cnkoImRldmljZXMiLCAwLCAmcHJvY19kZXZpbmZvX29wZXJhdGlvbnMpOwogCWNyZWF0ZV9zZXFfZW50cnkoImNwdWluZm8iLCAwLCAmcHJvY19jcHVpbmZvX29wZXJhdGlvbnMpOwogCWNyZWF0ZV9zZXFfZW50cnkoInBhcnRpdGlvbnMiLCAwLCAmcHJvY19wYXJ0aXRpb25zX29wZXJhdGlvbnMpOwogCWNyZWF0ZV9zZXFfZW50cnkoInN0YXQiLCAwLCAmcHJvY19zdGF0X29wZXJhdGlvbnMpOwogCWNyZWF0ZV9zZXFfZW50cnkoImludGVycnVwdHMiLCAwLCAmcHJvY19pbnRlcnJ1cHRzX29wZXJhdGlvbnMpOworI2lmZGVmIENPTkZJR19TTEFCCiAJY3JlYXRlX3NlcV9lbnRyeSgic2xhYmluZm8iLFNfSVdVU1J8U19JUlVHTywmcHJvY19zbGFiaW5mb19vcGVyYXRpb25zKTsKKyNlbmRpZgogCWNyZWF0ZV9zZXFfZW50cnkoImJ1ZGR5aW5mbyIsU19JUlVHTywgJmZyYWdtZW50YXRpb25fZmlsZV9vcGVyYXRpb25zKTsKIAljcmVhdGVfc2VxX2VudHJ5KCJ2bXN0YXQiLFNfSVJVR08sICZwcm9jX3Ztc3RhdF9maWxlX29wZXJhdGlvbnMpOwogCWNyZWF0ZV9zZXFfZW50cnkoInpvbmVpbmZvIixTX0lSVUdPLCAmcHJvY196b25laW5mb19maWxlX29wZXJhdGlvbnMpOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9yb290LmMgYi9mcy9wcm9jL3Jvb3QuYwppbmRleCBhZWYxNDhmLi42ODg5NjI4IDEwMDY0NAotLS0gYS9mcy9wcm9jL3Jvb3QuYworKysgYi9mcy9wcm9jL3Jvb3QuYwpAQCAtMTgsNiArMTgsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfbmV0LCAqcHJvY19uZXRfc3RhdCwgKnByb2NfYnVzLCAqcHJvY19yb290X2ZzLCAqcHJvY19yb290X2RyaXZlcjsKIAogI2lmZGVmIENPTkZJR19TWVNDVEwKQEAgLTM2LDcgKzM4LDYgQEAKIAkua2lsbF9zYgk9IGtpbGxfYW5vbl9zdXBlciwKIH07CiAKLWV4dGVybiBpbnQgX19pbml0IHByb2NfaW5pdF9pbm9kZWNhY2hlKHZvaWQpOwogdm9pZCBfX2luaXQgcHJvY19yb290X2luaXQodm9pZCkKIHsKIAlpbnQgZXJyID0gcHJvY19pbml0X2lub2RlY2FjaGUoKTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvdGFza19tbXUuYyBiL2ZzL3Byb2MvdGFza19tbXUuYwppbmRleCA1MGJkNWE4Zi4uMGVhYWQ0MSAxMDA2NDQKLS0tIGEvZnMvcHJvYy90YXNrX21tdS5jCisrKyBiL2ZzL3Byb2MvdGFza19tbXUuYwpAQCAtMzkwLDEyOSArMzkwLDEyIEBACiB9OwogCiAjaWZkZWYgQ09ORklHX05VTUEKLQotc3RydWN0IG51bWFfbWFwcyB7Ci0JdW5zaWduZWQgbG9uZyBwYWdlczsKLQl1bnNpZ25lZCBsb25nIGFub247Ci0JdW5zaWduZWQgbG9uZyBtYXBwZWQ7Ci0JdW5zaWduZWQgbG9uZyBtYXBjb3VudF9tYXg7Ci0JdW5zaWduZWQgbG9uZyBub2RlW01BWF9OVU1OT0RFU107Ci19OwotCi0vKgotICogQ2FsY3VsYXRlIG51bWEgbm9kZSBtYXBzIGZvciBhIHZtYQotICovCi1zdGF0aWMgc3RydWN0IG51bWFfbWFwcyAqZ2V0X251bWFfbWFwcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl1bnNpZ25lZCBsb25nIHZhZGRyOwotCXN0cnVjdCBudW1hX21hcHMgKm1kID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG51bWFfbWFwcyksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFtZCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWQtPnBhZ2VzID0gMDsKLQltZC0+YW5vbiA9IDA7Ci0JbWQtPm1hcHBlZCA9IDA7Ci0JbWQtPm1hcGNvdW50X21heCA9IDA7Ci0JZm9yX2VhY2hfbm9kZShpKQotCQltZC0+bm9kZVtpXSA9MDsKLQotIAlmb3IgKHZhZGRyID0gdm1hLT52bV9zdGFydDsgdmFkZHIgPCB2bWEtPnZtX2VuZDsgdmFkZHIgKz0gUEFHRV9TSVpFKSB7Ci0JCXBhZ2UgPSBmb2xsb3dfcGFnZSh2bWEsIHZhZGRyLCAwKTsKLQkJaWYgKHBhZ2UpIHsKLQkJCWludCBjb3VudCA9IHBhZ2VfbWFwY291bnQocGFnZSk7Ci0KLQkJCWlmIChjb3VudCkKLQkJCQltZC0+bWFwcGVkKys7Ci0JCQlpZiAoY291bnQgPiBtZC0+bWFwY291bnRfbWF4KQotCQkJCW1kLT5tYXBjb3VudF9tYXggPSBjb3VudDsKLQkJCW1kLT5wYWdlcysrOwotCQkJaWYgKFBhZ2VBbm9uKHBhZ2UpKQotCQkJCW1kLT5hbm9uKys7Ci0JCQltZC0+bm9kZVtwYWdlX3RvX25pZChwYWdlKV0rKzsKLQkJfQotCQljb25kX3Jlc2NoZWQoKTsKLQl9Ci0JcmV0dXJuIG1kOwotfQotCi1zdGF0aWMgaW50IHNob3dfbnVtYV9tYXAoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQotewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IG0tPnByaXZhdGU7Ci0Jc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSB2OwotCXN0cnVjdCBtZW1wb2xpY3kgKnBvbDsKLQlzdHJ1Y3QgbnVtYV9tYXBzICptZDsKLQlzdHJ1Y3Qgem9uZSAqKno7Ci0JaW50IG47Ci0JaW50IGZpcnN0OwotCi0JaWYgKCF2bWEtPnZtX21tKQotCQlyZXR1cm4gMDsKLQotCW1kID0gZ2V0X251bWFfbWFwcyh2bWEpOwotCWlmICghbWQpCi0JCXJldHVybiAwOwotCi0Jc2VxX3ByaW50ZihtLCAiJTA4bHgiLCB2bWEtPnZtX3N0YXJ0KTsKLQlwb2wgPSBnZXRfdm1hX3BvbGljeSh0YXNrLCB2bWEsIHZtYS0+dm1fc3RhcnQpOwotCS8qIFByaW50IHBvbGljeSAqLwotCXN3aXRjaCAocG9sLT5wb2xpY3kpIHsKLQljYXNlIE1QT0xfUFJFRkVSUkVEOgotCQlzZXFfcHJpbnRmKG0sICIgcHJlZmVyPSVkIiwgcG9sLT52LnByZWZlcnJlZF9ub2RlKTsKLQkJYnJlYWs7Ci0JY2FzZSBNUE9MX0JJTkQ6Ci0JCXNlcV9wcmludGYobSwgIiBiaW5kPXsiKTsKLQkJZmlyc3QgPSAxOwotCQlmb3IgKHogPSBwb2wtPnYuem9uZWxpc3QtPnpvbmVzOyAqejsgeisrKSB7Ci0KLQkJCWlmICghZmlyc3QpCi0JCQkJc2VxX3B1dGMobSwgJywnKTsKLQkJCWVsc2UKLQkJCQlmaXJzdCA9IDA7Ci0JCQlzZXFfcHJpbnRmKG0sICIlZC8lcyIsICgqeiktPnpvbmVfcGdkYXQtPm5vZGVfaWQsCi0JCQkJCSgqeiktPm5hbWUpOwotCQl9Ci0JCXNlcV9wdXRjKG0sICd9Jyk7Ci0JCWJyZWFrOwotCWNhc2UgTVBPTF9JTlRFUkxFQVZFOgotCQlzZXFfcHJpbnRmKG0sICIgaW50ZXJsZWF2ZT17Iik7Ci0JCWZpcnN0ID0gMTsKLQkJZm9yX2VhY2hfbm9kZShuKSB7Ci0JCQlpZiAobm9kZV9pc3NldChuLCBwb2wtPnYubm9kZXMpKSB7Ci0JCQkJaWYgKCFmaXJzdCkKLQkJCQkJc2VxX3B1dGMobSwnLCcpOwotCQkJCWVsc2UKLQkJCQkJZmlyc3QgPSAwOwotCQkJCXNlcV9wcmludGYobSwgIiVkIixuKTsKLQkJCX0KLQkJfQotCQlzZXFfcHV0YyhtLCAnfScpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlzZXFfcHJpbnRmKG0sIiBkZWZhdWx0Iik7Ci0JCWJyZWFrOwotCX0KLQlzZXFfcHJpbnRmKG0sICIgTWF4UmVmPSVsdSBQYWdlcz0lbHUgTWFwcGVkPSVsdSIsCi0JCQltZC0+bWFwY291bnRfbWF4LCBtZC0+cGFnZXMsIG1kLT5tYXBwZWQpOwotCWlmIChtZC0+YW5vbikKLQkJc2VxX3ByaW50ZihtLCIgQW5vbj0lbHUiLG1kLT5hbm9uKTsKLQotCWZvcl9lYWNoX29ubGluZV9ub2RlKG4pIHsKLQkJaWYgKG1kLT5ub2RlW25dKQotCQkJc2VxX3ByaW50ZihtLCAiIE4lZD0lbHUiLCBuLCBtZC0+bm9kZVtuXSk7Ci0JfQotCXNlcV9wdXRjKG0sICdcbicpOwotCWtmcmVlKG1kKTsKLQlpZiAobS0+Y291bnQgPCBtLT5zaXplKSAgLyogdm1hIGlzIGNvcGllZCBzdWNjZXNzZnVsbHkgKi8KLQkJbS0+dmVyc2lvbiA9ICh2bWEgIT0gZ2V0X2dhdGVfdm1hKHRhc2spKSA/IHZtYS0+dm1fc3RhcnQgOiAwOwotCXJldHVybiAwOwotfQorZXh0ZXJuIGludCBzaG93X251bWFfbWFwKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdik7CiAKIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBwcm9jX3BpZF9udW1hX21hcHNfb3AgPSB7Ci0JLnN0YXJ0CT0gbV9zdGFydCwKLQkubmV4dAk9IG1fbmV4dCwKLQkuc3RvcAk9IG1fc3RvcCwKLQkuc2hvdwk9IHNob3dfbnVtYV9tYXAKKyAgICAgICAgLnN0YXJ0ICA9IG1fc3RhcnQsCisgICAgICAgIC5uZXh0ICAgPSBtX25leHQsCisgICAgICAgIC5zdG9wICAgPSBtX3N0b3AsCisgICAgICAgIC5zaG93ICAgPSBzaG93X251bWFfbWFwCiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9wcm9jL3ZtY29yZS5jIGIvZnMvcHJvYy92bWNvcmUuYwppbmRleCAzYjJlN2I2OS4uNDA2M2ZiMyAxMDA2NDQKLS0tIGEvZnMvcHJvYy92bWNvcmUuYworKysgYi9mcy9wcm9jL3ZtY29yZS5jCkBAIC0xNCw3ICsxNCw2IEBACiAjaW5jbHVkZSA8bGludXgvYS5vdXQuaD4KICNpbmNsdWRlIDxsaW51eC9lbGYuaD4KICNpbmNsdWRlIDxsaW51eC9lbGZjb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMzUsMTEgKzM0LDE0IEBACiAvKiBUb3RhbCBzaXplIG9mIHZtY29yZSBmaWxlLiAqLwogc3RhdGljIHU2NCB2bWNvcmVfc2l6ZTsKIAorLyogU3RvcmVzIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGVsZiBoZWFkZXIgb2YgY3Jhc2ggaW1hZ2UuICovCit1bnNpZ25lZCBsb25nIGxvbmcgZWxmY29yZWhkcl9hZGRyID0gRUxGQ09SRV9BRERSX01BWDsKKwogc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3ZtY29yZSA9IE5VTEw7CiAKIC8qIFJlYWRzIGEgcGFnZSBmcm9tIHRoZSBvbGRtZW0gZGV2aWNlIGZyb20gZ2l2ZW4gb2Zmc2V0LiAqLwogc3RhdGljIHNzaXplX3QgcmVhZF9mcm9tX29sZG1lbShjaGFyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCSAgICAgbG9mZl90ICpwcG9zLCBpbnQgdXNlcmJ1ZikKKwkJCQl1NjQgKnBwb3MsIGludCB1c2VyYnVmKQogewogCXVuc2lnbmVkIGxvbmcgcGZuLCBvZmZzZXQ7CiAJc2l6ZV90IG5yX2J5dGVzOwpkaWZmIC0tZ2l0IGEvZnMvcXVvdGEuYyBiL2ZzL3F1b3RhLmMKaW5kZXggNjEyZTA0ZC4uYmE5ZTBiZiAxMDA2NDQKLS0tIGEvZnMvcXVvdGEuYworKysgYi9mcy9xdW90YS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CiAKIC8qIENoZWNrIHZhbGlkaXR5IG9mIGdlbmVyaWMgcXVvdGFjdGwgY29tbWFuZHMgKi8KQEAgLTE2OCw3ICsxNjksNyBAQAogCXN5bmNfYmxvY2tkZXYoc2ItPnNfYmRldik7CiAKIAkvKiBOb3cgd2hlbiBldmVyeXRoaW5nIGlzIHdyaXR0ZW4gd2UgY2FuIGRpc2NhcmQgdGhlIHBhZ2VjYWNoZSBzbwotCSAqIHRoYXQgdXNlcnNwYWNlIHNlZXMgdGhlIGNoYW5nZXMuIFdlIG5lZWQgaV9zZW0gYW5kIHNvIHdlIGNvdWxkCisJICogdGhhdCB1c2Vyc3BhY2Ugc2VlcyB0aGUgY2hhbmdlcy4gV2UgbmVlZCBpX211dGV4IGFuZCBzbyB3ZSBjb3VsZAogCSAqIG5vdCBkbyBpdCBpbnNpZGUgZHFvbm9mZl9zZW0uIE1vcmVvdmVyIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bGwKIAkgKiBhYm91dCByYWNlcyB3aXRoIHF1b3Rhb2ZmKCkgKHRoYXQgaXMgdGhlIHJlYXNvbiB3aHkgd2UgaGF2ZSBvd24KIAkgKiByZWZlcmVuY2UgdG8gaW5vZGUpLiAqLwpAQCAtMTg0LDkgKzE4NSw5IEBACiAJdXAoJnNiX2Rxb3B0KHNiKS0+ZHFvbm9mZl9zZW0pOwogCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgewogCQlpZiAoZGlzY2FyZFtjbnRdKSB7Ci0JCQlkb3duKCZkaXNjYXJkW2NudF0tPmlfc2VtKTsKKwkJCW11dGV4X2xvY2soJmRpc2NhcmRbY250XS0+aV9tdXRleCk7CiAJCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmZGlzY2FyZFtjbnRdLT5pX2RhdGEsIDApOwotCQkJdXAoJmRpc2NhcmRbY250XS0+aV9zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZkaXNjYXJkW2NudF0tPmlfbXV0ZXgpOwogCQkJaXB1dChkaXNjYXJkW2NudF0pOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZnMvcXVvdGFfdjIuYyBiL2ZzL3F1b3RhX3YyLmMKaW5kZXggN2FmY2JiMS4uYTRlZjkxYiAxMDA2NDQKLS0tIGEvZnMvcXVvdGFfdjIuYworKysgYi9mcy9xdW90YV92Mi5jCkBAIC0zNSw3ICszNSw4IEBACiAgCiAJc2l6ZSA9IHNiLT5zX29wLT5xdW90YV9yZWFkKHNiLCB0eXBlLCAoY2hhciAqKSZkcWhlYWQsIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWhlYWRlciksIDApOwogCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWhlYWRlcikpIHsKLQkJcHJpbnRrKCJmYWlsZWQgcmVhZFxuIik7CisJCXByaW50aygicXVvdGFfdjI6IGZhaWxlZCByZWFkIGV4cGVjdGVkPSVkIGdvdD0lZFxuIiwKKwkJCXNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWhlYWRlciksIHNpemUpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKGxlMzJfdG9fY3B1KGRxaGVhZC5kcWhfbWFnaWMpICE9IHF1b3RhX21hZ2ljc1t0eXBlXSB8fApkaWZmIC0tZ2l0IGEvZnMvcmVhZF93cml0ZS5jIGIvZnMvcmVhZF93cml0ZS5jCmluZGV4IGRmMzQ2OGEuLjNmN2ExYTYgMTAwNjQ0Ci0tLSBhL2ZzL3JlYWRfd3JpdGUuYworKysgYi9mcy9yZWFkX3dyaXRlLmMKQEAgLTMzLDcgKzMzLDcgQEAKIAlsb25nIGxvbmcgcmV0dmFsOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CiAKLQlkb3duKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAlzd2l0Y2ggKG9yaWdpbikgewogCQljYXNlIDI6CiAJCQlvZmZzZXQgKz0gaW5vZGUtPmlfc2l6ZTsKQEAgLTQ5LDcgKzQ5LDcgQEAKIAkJfQogCQlyZXR2YWwgPSBvZmZzZXQ7CiAJfQotCXVwKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiByZXR2YWw7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3JlYWRkaXIuYyBiL2ZzL3JlYWRkaXIuYwppbmRleCBiMDM1NzliLi5iNjEwOTMyIDEwMDY0NAotLS0gYS9mcy9yZWFkZGlyLmMKKysrIGIvZnMvcmVhZGRpci5jCkBAIC0zMCwxMyArMzAsMTMgQEAKIAlpZiAocmVzKQogCQlnb3RvIG91dDsKIAotCWRvd24oJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJlcyA9IC1FTk9FTlQ7CiAJaWYgKCFJU19ERUFERElSKGlub2RlKSkgewogCQlyZXMgPSBmaWxlLT5mX29wLT5yZWFkZGlyKGZpbGUsIGJ1ZiwgZmlsbGVyKTsKIAkJZmlsZV9hY2Nlc3NlZChmaWxlKTsKIAl9Ci0JdXAoJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiBvdXQ6CiAJcmV0dXJuIHJlczsKIH0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2ZpbGUuYyBiL2ZzL3JlaXNlcmZzL2ZpbGUuYwppbmRleCA3ODkyYTg2Li5hZDZmYTk2IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9maWxlLmMKKysrIGIvZnMvcmVpc2VyZnMvZmlsZS5jCkBAIC00OSw3ICs0OSw3IEBACiAJfQogCiAJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7Ci0JZG93bigmaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJLyogZnJlZWluZyBwcmVhbGxvY2F0aW9uIG9ubHkgaW52b2x2ZXMgcmVsb2dnaW5nIGJsb2NrcyB0aGF0CiAJICogYXJlIGFscmVhZHkgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uICBwcmVhbGxvY2F0aW9uIGdldHMKIAkgKiBmcmVlZCBhdCB0aGUgZW5kIG9mIGVhY2ggdHJhbnNhY3Rpb24sIHNvIGl0IGlzIGltcG9zc2libGUgZm9yCkBAIC0xMDAsNyArMTAwLDcgQEAKIAkJZXJyID0gcmVpc2VyZnNfdHJ1bmNhdGVfZmlsZShpbm9kZSwgMCk7CiAJfQogICAgICAgb3V0OgotCXVwKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTEzNDIsNyArMTM0Miw3IEBACiAJaWYgKHVubGlrZWx5KCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZiwgY291bnQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlkb3duKCZpbm9kZS0+aV9zZW0pOwkvLyBsb2NrcyB0aGUgZW50aXJlIGZpbGUgZm9yIGp1c3QgdXMKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CS8vIGxvY2tzIHRoZSBlbnRpcmUgZmlsZSBmb3IganVzdCB1cwogCiAJcG9zID0gKnBwb3M7CiAKQEAgLTEzNjAsNyArMTM2MCw3IEBACiAJaWYgKHJlcykKIAkJZ290byBvdXQ7CiAKLQlpbm9kZV91cGRhdGVfdGltZShpbm9kZSwgMSk7CS8qIEJvdGggbXRpbWUgYW5kIGN0aW1lICovCisJZmlsZV91cGRhdGVfdGltZShmaWxlKTsKIAogCS8vIE9rLCB3ZSBhcmUgZG9uZSB3aXRoIGFsbCB0aGUgY2hlY2tzLgogCkBAIC0xNTMyLDEyICsxNTMyLDEyIEBACiAJCSAgICBnZW5lcmljX29zeW5jX2lub2RlKGlub2RlLCBmaWxlLT5mX21hcHBpbmcsCiAJCQkJCU9TWU5DX01FVEFEQVRBIHwgT1NZTkNfREFUQSk7CiAKLQl1cCgmaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAlyZWlzZXJmc19hc3luY19wcm9ncmVzc193YWl0KGlub2RlLT5pX3NiKTsKIAlyZXR1cm4gKGFscmVhZHlfd3JpdHRlbiAhPSAwKSA/IGFscmVhZHlfd3JpdHRlbiA6IHJlczsKIAogICAgICAgb3V0OgotCXVwKCZpbm9kZS0+aV9zZW0pOwkvLyB1bmxvY2sgdGhlIGZpbGUgb24gZXhpdC4KKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsJLy8gdW5sb2NrIHRoZSBmaWxlIG9uIGV4aXQuCiAJcmV0dXJuIHJlczsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvaW5vZGUuYyBiL2ZzL3JlaXNlcmZzL2lub2RlLmMKaW5kZXggYTVlM2EwZC4uZmZhMzRiOCAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvaW5vZGUuYworKysgYi9mcy9yZWlzZXJmcy9pbm9kZS5jCkBAIC00MCwxMiArNDAsMTIgQEAKIAogCS8qIFRoZSA9IDAgaGFwcGVucyB3aGVuIHdlIGFib3J0IGNyZWF0aW5nIGEgbmV3IGlub2RlIGZvciBzb21lIHJlYXNvbiBsaWtlIGxhY2sgb2Ygc3BhY2UuLiAqLwogCWlmICghKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpICYmIElOT0RFX1BLRVkoaW5vZGUpLT5rX29iamVjdGlkICE9IDApIHsJLyogYWxzbyBoYW5kbGVzIGJhZF9pbm9kZSBjYXNlICovCi0JCWRvd24oJmlub2RlLT5pX3NlbSk7CisJCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAogCQlyZWlzZXJmc19kZWxldGVfeGF0dHJzKGlub2RlKTsKIAogCQlpZiAoam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCBqYmVnaW5fY291bnQpKSB7Ci0JCQl1cCgmaW5vZGUtPmlfc2VtKTsKKwkJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKQEAgLTU5LDExICs1OSwxMSBAQAogCQkJRFFVT1RfRlJFRV9JTk9ERShpbm9kZSk7CiAKIAkJaWYgKGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCkpIHsKLQkJCXVwKCZpbm9kZS0+aV9zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCXVwKCZpbm9kZS0+aV9zZW0pOworCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAogCQkvKiBjaGVjayByZXR1cm4gdmFsdWUgZnJvbSByZWlzZXJmc19kZWxldGVfb2JqZWN0IGFmdGVyCiAJCSAqIGVuZGluZyB0aGUgdHJhbnNhY3Rpb24KQEAgLTU1MSw3ICs1NTEsNyBAQAogCiAJLyogd2UgZG9uJ3QgaGF2ZSB0byBtYWtlIHN1cmUgdGhlIGNvbnZlcnNpb24gZGlkIG5vdCBoYXBwZW4gd2hpbGUKIAkgKiogd2Ugd2VyZSBsb2NraW5nIHRoZSBwYWdlIGJlY2F1c2UgYW55b25lIHRoYXQgY291bGQgY29udmVydAotCSAqKiBtdXN0IGZpcnN0IHRha2UgaV9zZW0uCisJICoqIG11c3QgZmlyc3QgdGFrZSBpX211dGV4LgogCSAqKgogCSAqKiBXZSBtdXN0IGZpeCB0aGUgdGFpbCBwYWdlIGZvciB3cml0aW5nIGJlY2F1c2UgaXQgbWlnaHQgaGF2ZSBidWZmZXJzCiAJICoqIHRoYXQgYXJlIG1hcHBlZCwgYnV0IGhhdmUgYSBibG9jayBudW1iZXIgb2YgMC4gIFRoaXMgaW5kaWNhdGVzIHRhaWwKQEAgLTU4Niw3ICs1ODYsNyBAQAogCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCiAjaWZkZWYgUkVJU0VSRlNfUFJFQUxMT0NBVEUKLQlpZiAoIShmbGFncyAmIEdFVF9CTE9DS19OT19JU0VNKSkgeworCWlmICghKGZsYWdzICYgR0VUX0JMT0NLX05PX0lNVVgpKSB7CiAJCXJldHVybiByZWlzZXJmc19uZXdfdW5mX2Jsb2NrbnJzMih0aCwgaW5vZGUsIGFsbG9jYXRlZF9ibG9ja19uciwKIAkJCQkJCSAgcGF0aCwgYmxvY2spOwogCX0KQEAgLTIzMTgsNyArMjMxOCw3IEBACiAJLyogdGhpcyBpcyB3aGVyZSB3ZSBmaWxsIGluIGhvbGVzIGluIHRoZSBmaWxlLiAqLwogCWlmICh1c2VfZ2V0X2Jsb2NrKSB7CiAJCXJldHZhbCA9IHJlaXNlcmZzX2dldF9ibG9jayhpbm9kZSwgYmxvY2ssIGJoX3Jlc3VsdCwKLQkJCQkJICAgIEdFVF9CTE9DS19DUkVBVEUgfCBHRVRfQkxPQ0tfTk9fSVNFTQorCQkJCQkgICAgR0VUX0JMT0NLX0NSRUFURSB8IEdFVF9CTE9DS19OT19JTVVYCiAJCQkJCSAgICB8IEdFVF9CTE9DS19OT19EQU5HTEUpOwogCQlpZiAoIXJldHZhbCkgewogCQkJaWYgKCFidWZmZXJfbWFwcGVkKGJoX3Jlc3VsdCkKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2lvY3RsLmMgYi9mcy9yZWlzZXJmcy9pb2N0bC5jCmluZGV4IDgxZmMwMDIuLjc0NWM4ODEgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2lvY3RsLmMKKysrIGIvZnMvcmVpc2VyZnMvaW9jdGwuYwpAQCAtMiw2ICsyLDcgQEAKICAqIENvcHlyaWdodCAyMDAwIGJ5IEhhbnMgUmVpc2VyLCBsaWNlbnNpbmcgZ292ZXJuZWQgYnkgcmVpc2VyZnMvUkVBRE1FCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgpAQCAtMTIwLDcgKzEyMSw3IEBACiAJLyogd2UgbmVlZCB0byBtYWtlIHN1cmUgbm9ib2R5IGlzIGNoYW5naW5nIHRoZSBmaWxlIHNpemUgYmVuZWF0aAogCSAqKiB1cwogCSAqLwotCWRvd24oJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCiAJd3JpdGVfZnJvbSA9IGlub2RlLT5pX3NpemUgJiAoYmxvY2tzaXplIC0gMSk7CiAJLyogaWYgd2UgYXJlIG9uIGEgYmxvY2sgYm91bmRhcnksIHdlIGFyZSBhbHJlYWR5IHVucGFja2VkLiAgKi8KQEAgLTE1Niw3ICsxNTcsNyBAQAogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAogICAgICAgb3V0OgotCXVwKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CiAJcmV0dXJuIHJldHZhbDsKIH0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2pvdXJuYWwuYyBiL2ZzL3JlaXNlcmZzL2pvdXJuYWwuYwppbmRleCAzZjE3ZWY4Li40NDkxZmNmIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9qb3VybmFsLmMKKysrIGIvZnMvcmVpc2VyZnMvam91cm5hbC5jCkBAIC0zOTI1LDEwICszOTI1LDEzIEBACiAJCWZsdXNoID0gMTsKIAl9CiAjaWZkZWYgUkVJU0VSRlNfUFJFQUxMT0NBVEUKLQkvKiBxdW90YSBvcHMgbWlnaHQgbmVlZCB0byBuZXN0LCBzZXR1cCB0aGUgam91cm5hbF9pbmZvIHBvaW50ZXIgZm9yIHRoZW0gKi8KKwkvKiBxdW90YSBvcHMgbWlnaHQgbmVlZCB0byBuZXN0LCBzZXR1cCB0aGUgam91cm5hbF9pbmZvIHBvaW50ZXIgZm9yIHRoZW0KKwkgKiBhbmQgcmFpc2UgdGhlIHJlZmNvdW50IHNvIHRoYXQgaXQgaXMgPiAwLiAqLwogCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoOworCXRoLT50X3JlZmNvdW50Kys7CiAJcmVpc2VyZnNfZGlzY2FyZF9hbGxfcHJlYWxsb2ModGgpOwkvKiBpdCBzaG91bGQgbm90IGludm9sdmUgbmV3IGJsb2NrcyBpbnRvCiAJCQkJCQkgKiB0aGUgdHJhbnNhY3Rpb24gKi8KKwl0aC0+dF9yZWZjb3VudC0tOwogCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoLT50X2hhbmRsZV9zYXZlOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL25hbWVpLmMgYi9mcy9yZWlzZXJmcy9uYW1laS5jCmluZGV4IDM1NDkwNjcuLjhmOGQ4ZDAgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL25hbWVpLmMKKysrIGIvZnMvcmVpc2VyZnMvbmFtZWkuYwpAQCAtMzc1LDExICszNzUsNyBAQAogCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAl9CiAKLQlpZiAoaW5vZGUpCi0JCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKLQotCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwotCXJldHVybiBOVUxMOworCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKIH0KIAogLyogCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9zdXBlci5jIGIvZnMvcmVpc2VyZnMvc3VwZXIuYwppbmRleCA0MmFmYjViLi4zOTdkOTU5IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9zdXBlci5jCisrKyBiL2ZzL3JlaXNlcmZzL3N1cGVyLmMKQEAgLTIyMTEsNyArMjIxMSw3IEBACiAJc2l6ZV90IHRvd3JpdGUgPSBsZW47CiAJc3RydWN0IGJ1ZmZlcl9oZWFkIHRtcF9iaCwgKmJoOwogCi0JZG93bigmaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJd2hpbGUgKHRvd3JpdGUgPiAwKSB7CiAJCXRvY29weSA9IHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCA8IHRvd3JpdGUgPwogCQkgICAgc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDogdG93cml0ZTsKQEAgLTIyNTAsNyArMjI1MCw3IEBACiAJaW5vZGUtPmlfdmVyc2lvbisrOwogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Ci0JdXAoJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJcmV0dXJuIGxlbiAtIHRvd3JpdGU7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3RhaWxfY29udmVyc2lvbi5jIGIvZnMvcmVpc2VyZnMvdGFpbF9jb252ZXJzaW9uLmMKaW5kZXggYzkyZTEyNC4uMTk2ZTk3MSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvdGFpbF9jb252ZXJzaW9uLmMKKysrIGIvZnMvcmVpc2VyZnMvdGFpbF9jb252ZXJzaW9uLmMKQEAgLTIwNSw3ICsyMDUsNyBAQAogCQkJCQkgMSkgKiBwX3Nfc2ItPnNfYmxvY2tzaXplOwogCXBvczEgPSBwb3M7CiAKLQkvLyB3ZSBhcmUgcHJvdGVjdGVkIGJ5IGlfc2VtLiBUaGUgdGFpbCBjYW4gbm90IGRpc2FwcGVyLCBub3QKKwkvLyB3ZSBhcmUgcHJvdGVjdGVkIGJ5IGlfbXV0ZXguIFRoZSB0YWlsIGNhbiBub3QgZGlzYXBwZXIsIG5vdAogCS8vIGFwcGVuZCBjYW4gYmUgZG9uZSBlaXRoZXIKIAkvLyB3ZSBhcmUgaW4gdHJ1bmNhdGUgb3IgcGFja2luZyB0YWlsIGluIGZpbGVfcmVsZWFzZQogCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy94YXR0ci5jIGIvZnMvcmVpc2VyZnMveGF0dHIuYwppbmRleCAwMjA5MWVhLi5jYzA2MWJmIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy94YXR0ci5jCisrKyBiL2ZzL3JlaXNlcmZzL3hhdHRyLmMKQEAgLTMwLDYgKzMwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpAQCAtNjcsMTEgKzY4LDExIEBACiAJCWdvdG8gb3V0OwogCX0gZWxzZSBpZiAoIXhhcm9vdC0+ZF9pbm9kZSkgewogCQlpbnQgZXJyOwotCQlkb3duKCZwcml2cm9vdC0+ZF9pbm9kZS0+aV9zZW0pOworCQltdXRleF9sb2NrKCZwcml2cm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJCWVyciA9CiAJCSAgICBwcml2cm9vdC0+ZF9pbm9kZS0+aV9vcC0+bWtkaXIocHJpdnJvb3QtPmRfaW5vZGUsIHhhcm9vdCwKIAkJCQkJCSAgIDA3MDApOwotCQl1cCgmcHJpdnJvb3QtPmRfaW5vZGUtPmlfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZwcml2cm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAKIAkJaWYgKGVycikgewogCQkJZHB1dCh4YXJvb3QpOwpAQCAtMjE5LDcgKzIyMCw3IEBACiAJfSBlbHNlIGlmIChmbGFncyAmIFhBVFRSX1JFUExBQ0UgfHwgZmxhZ3MgJiBGTF9SRUFET05MWSkgewogCQlnb3RvIG91dDsKIAl9IGVsc2UgewotCQkvKiBpbm9kZS0+aV9zZW0gaXMgZG93biwgc28gbm90aGluZyBlbHNlIGNhbiB0cnkgdG8gY3JlYXRlCisJCS8qIGlub2RlLT5pX211dGV4IGlzIGRvd24sIHNvIG5vdGhpbmcgZWxzZSBjYW4gdHJ5IHRvIGNyZWF0ZQogCQkgKiB0aGUgc2FtZSB4YXR0ciAqLwogCQllcnIgPSB4YWRpci0+ZF9pbm9kZS0+aV9vcC0+Y3JlYXRlKHhhZGlyLT5kX2lub2RlLCB4YWZpbGUsCiAJCQkJCQkgICAwNzAwIHwgU19JRlJFRywgTlVMTCk7CkBAIC0yNjgsNyArMjY5LDcgQEAKICAqIGFuZCBkb24ndCBtZXNzIHdpdGggZi0+Zl9wb3MsIGJ1dCB0aGUgaWRlYSBpcyB0aGUgc2FtZS4gIERvIHNvbWUKICAqIGFjdGlvbiBvbiBlYWNoIGFuZCBldmVyeSBlbnRyeSBpbiB0aGUgZGlyZWN0b3J5LgogICoKLSAqIHdlJ3JlIGNhbGxlZCB3aXRoIGlfc2VtIGhlbGQsIHNvIHRoZXJlIGFyZSBubyB3b3JyaWVzIGFib3V0IHRoZSBkaXJlY3RvcnkKKyAqIHdlJ3JlIGNhbGxlZCB3aXRoIGlfbXV0ZXggaGVsZCwgc28gdGhlcmUgYXJlIG5vIHdvcnJpZXMgYWJvdXQgdGhlIGRpcmVjdG9yeQogICogY2hhbmdpbmcgdW5kZXJuZWF0aCB1cy4KICAqLwogc3RhdGljIGludCBfX3hhdHRyX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCkBAIC00MjYsNyArNDI3LDcgQEAKIAlpbnQgcmVzID0gLUVOT1RESVI7CiAJaWYgKCFmaWxlLT5mX29wIHx8ICFmaWxlLT5mX29wLT5yZWFkZGlyKQogCQlnb3RvIG91dDsKLQlkb3duKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIC8vICAgICAgICBkb3duKCZpbm9kZS0+aV96b21iaWUpOwogCXJlcyA9IC1FTk9FTlQ7CiAJaWYgKCFJU19ERUFERElSKGlub2RlKSkgewpAQCAtNDM1LDcgKzQzNiw3IEBACiAJCXVubG9ja19rZXJuZWwoKTsKIAl9CiAvLyAgICAgICAgdXAoJmlub2RlLT5pX3pvbWJpZSk7Ci0JdXAoJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAgICAgICBvdXQ6CiAJcmV0dXJuIHJlczsKIH0KQEAgLTQ4MCw3ICs0ODEsNyBAQAogLyogR2VuZXJpYyBleHRlbmRlZCBhdHRyaWJ1dGUgb3BlcmF0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIGJ5IHhhIHBsdWdpbnMgKi8KIAogLyoKLSAqIGlub2RlLT5pX3NlbTogZG93bgorICogaW5vZGUtPmlfbXV0ZXg6IGRvd24KICAqLwogaW50CiByZWlzZXJmc194YXR0cl9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqYnVmZmVyLApAQCAtNDk3LDEyICs0OTgsNiBAQAogCXN0cnVjdCBpYXR0ciBuZXdhdHRyczsKIAlfX3UzMiB4YWhhc2ggPSAwOwogCi0JaWYgKElTX1JET05MWShpbm9kZSkpCi0JCXJldHVybiAtRVJPRlM7Ci0KLQlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpKQotCQlyZXR1cm4gLUVQRVJNOwotCiAJaWYgKGdldF9pbm9kZV9zZF92ZXJzaW9uKGlub2RlKSA9PSBTVEFUX0RBVEFfVjEpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIApAQCAtNTM1LDcgKzUzMCw3IEBACiAJLyogUmVzaXplIGl0IHNvIHdlJ3JlIG9rIHRvIHdyaXRlIHRoZXJlICovCiAJbmV3YXR0cnMuaWFfc2l6ZSA9IGJ1ZmZlcl9zaXplOwogCW5ld2F0dHJzLmlhX3ZhbGlkID0gQVRUUl9TSVpFIHwgQVRUUl9DVElNRTsKLQlkb3duKCZ4aW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZ4aW5vZGUtPmlfbXV0ZXgpOwogCWVyciA9IG5vdGlmeV9jaGFuZ2UoZnAtPmZfZGVudHJ5LCAmbmV3YXR0cnMpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2ZpbHA7CkBAIC01OTgsNyArNTkzLDcgQEAKIAl9CiAKICAgICAgIG91dF9maWxwOgotCXVwKCZ4aW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJnhpbm9kZS0+aV9tdXRleCk7CiAJZnB1dChmcCk7CiAKICAgICAgIG91dDoKQEAgLTYwNiw3ICs2MDEsNyBAQAogfQogCiAvKgotICogaW5vZGUtPmlfc2VtOiBkb3duCisgKiBpbm9kZS0+aV9tdXRleDogZG93bgogICovCiBpbnQKIHJlaXNlcmZzX3hhdHRyX2dldChjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWZmZXIsCkBAIC03NTgsOSArNzUzLDYgQEAKIAlzdHJ1Y3QgZGVudHJ5ICpkaXI7CiAJaW50IGVycjsKIAotCWlmIChJU19SRE9OTFkoaW5vZGUpKQotCQlyZXR1cm4gLUVST0ZTOwotCiAJZGlyID0gb3Blbl94YV9kaXIoaW5vZGUsIEZMX1JFQURPTkxZKTsKIAlpZiAoSVNfRVJSKGRpcikpIHsKIAkJZXJyID0gUFRSX0VSUihkaXIpOwpAQCAtNzkzLDcgKzc4NSw3IEBACiAKIH0KIAotLyogVGhpcyBpcyBjYWxsZWQgdy8gaW5vZGUtPmlfc2VtIGRvd25lZCAqLworLyogVGhpcyBpcyBjYWxsZWQgdy8gaW5vZGUtPmlfbXV0ZXggZG93bmVkICovCiBpbnQgcmVpc2VyZnNfZGVsZXRlX3hhdHRycyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXN0cnVjdCBmaWxlICpmcDsKQEAgLTk0Niw3ICs5MzgsNyBAQAogCiAvKgogICogSW5vZGUgb3BlcmF0aW9uIGdldHhhdHRyKCkKLSAqIFByZWxpbWluYXJ5IGxvY2tpbmc6IHdlIGRvd24gZGVudHJ5LT5kX2lub2RlLT5pX3NlbQorICogUHJlbGltaW5hcnkgbG9ja2luZzogd2UgZG93biBkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgKICAqLwogc3NpemVfdAogcmVpc2VyZnNfZ2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLApAQCAtOTcwLDcgKzk2Miw3IEBACiAvKgogICogSW5vZGUgb3BlcmF0aW9uIHNldHhhdHRyKCkKICAqCi0gKiBkZW50cnktPmRfaW5vZGUtPmlfc2VtIGRvd24KKyAqIGRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCBkb3duCiAgKi8KIGludAogcmVpc2VyZnNfc2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwKQEAgLTk4NCwxMiArOTc2LDYgQEAKIAkgICAgZ2V0X2lub2RlX3NkX3ZlcnNpb24oZGVudHJ5LT5kX2lub2RlKSA9PSBTVEFUX0RBVEFfVjEpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCWlmIChJU19SRE9OTFkoZGVudHJ5LT5kX2lub2RlKSkKLQkJcmV0dXJuIC1FUk9GUzsKLQotCWlmIChJU19JTU1VVEFCTEUoZGVudHJ5LT5kX2lub2RlKSB8fCBJU19BUFBFTkQoZGVudHJ5LT5kX2lub2RlKSkKLQkJcmV0dXJuIC1FUk9GUzsKLQogCXJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJfaShkZW50cnktPmRfaW5vZGUpOwogCWxvY2sgPSAhaGFzX3hhdHRyX2RpcihkZW50cnktPmRfaW5vZGUpOwogCWlmIChsb2NrKQpAQCAtMTAwOCw3ICs5OTQsNyBAQAogLyoKICAqIElub2RlIG9wZXJhdGlvbiByZW1vdmV4YXR0cigpCiAgKgotICogZGVudHJ5LT5kX2lub2RlLT5pX3NlbSBkb3duCisgKiBkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXggZG93bgogICovCiBpbnQgcmVpc2VyZnNfcmVtb3ZleGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lKQogewpAQCAtMTAxOSwxMiArMTAwNSw2IEBACiAJICAgIGdldF9pbm9kZV9zZF92ZXJzaW9uKGRlbnRyeS0+ZF9pbm9kZSkgPT0gU1RBVF9EQVRBX1YxKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlpZiAoSVNfUkRPTkxZKGRlbnRyeS0+ZF9pbm9kZSkpCi0JCXJldHVybiAtRVJPRlM7Ci0KLQlpZiAoSVNfSU1NVVRBQkxFKGRlbnRyeS0+ZF9pbm9kZSkgfHwgSVNfQVBQRU5EKGRlbnRyeS0+ZF9pbm9kZSkpCi0JCXJldHVybiAtRVBFUk07Ci0KIAlyZWlzZXJmc193cml0ZV9sb2NrX3hhdHRyX2koZGVudHJ5LT5kX2lub2RlKTsKIAlyZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzKGRlbnRyeS0+ZF9zYik7CiAKQEAgLTEwOTEsNyArMTA3MSw3IEBACiAvKgogICogSW5vZGUgb3BlcmF0aW9uIGxpc3R4YXR0cigpCiAgKgotICogUHJlbGltaW5hcnkgbG9ja2luZzogd2UgZG93biBkZW50cnktPmRfaW5vZGUtPmlfc2VtCisgKiBQcmVsaW1pbmFyeSBsb2NraW5nOiB3ZSBkb3duIGRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleAogICovCiBzc2l6ZV90IHJlaXNlcmZzX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQogewpAQCAtMTI4OSw5ICsxMjY5LDkgQEAKIAkJaWYgKCFJU19FUlIoZGVudHJ5KSkgewogCQkJaWYgKCEobW91bnRfZmxhZ3MgJiBNU19SRE9OTFkpICYmICFkZW50cnktPmRfaW5vZGUpIHsKIAkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKLQkJCQlkb3duKCZpbm9kZS0+aV9zZW0pOworCQkJCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAkJCQllcnIgPSBpbm9kZS0+aV9vcC0+bWtkaXIoaW5vZGUsIGRlbnRyeSwgMDcwMCk7Ci0JCQkJdXAoJmlub2RlLT5pX3NlbSk7CisJCQkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJCQkJaWYgKGVycikgewogCQkJCQlkcHV0KGRlbnRyeSk7CiAJCQkJCWRlbnRyeSA9IE5VTEw7CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy94YXR0cl9hY2wuYyBiL2ZzL3JlaXNlcmZzL3hhdHRyX2FjbC5jCmluZGV4IGE0N2FjOWEuLjQzZGUzYmEgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3hhdHRyX2FjbC5jCisrKyBiL2ZzL3JlaXNlcmZzL3hhdHRyX2FjbC5jCkBAIC0xLDMgKzEsNCBAQAorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CkBAIC0xNzQsNyArMTc1LDcgQEAKIC8qCiAgKiBJbm9kZSBvcGVyYXRpb24gZ2V0X3Bvc2l4X2FjbCgpLgogICoKLSAqIGlub2RlLT5pX3NlbTogZG93bgorICogaW5vZGUtPmlfbXV0ZXg6IGRvd24KICAqIEJLTCBoZWxkIFtiZWZvcmUgMi41LnhdCiAgKi8KIHN0cnVjdCBwb3NpeF9hY2wgKnJlaXNlcmZzX2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCkBAIC0yMzcsNyArMjM4LDcgQEAKIC8qCiAgKiBJbm9kZSBvcGVyYXRpb24gc2V0X3Bvc2l4X2FjbCgpLgogICoKLSAqIGlub2RlLT5pX3NlbTogZG93bgorICogaW5vZGUtPmlfbXV0ZXg6IGRvd24KICAqIEJLTCBoZWxkIFtiZWZvcmUgMi41LnhdCiAgKi8KIHN0YXRpYyBpbnQKQEAgLTMxMiw3ICszMTMsNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotLyogZGlyLT5pX3NlbTogZG93biwKKy8qIGRpci0+aV9tdXRleDogbG9ja2VkLAogICogaW5vZGUgaXMgbmV3IGFuZCBub3QgcmVsZWFzZWQgaW50byB0aGUgd2lsZCB5ZXQgKi8KIGludAogcmVpc2VyZnNfaW5oZXJpdF9kZWZhdWx0X2FjbChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LApkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMveGF0dHJfdHJ1c3RlZC5jIGIvZnMvcmVpc2VyZnMveGF0dHJfdHJ1c3RlZC5jCmluZGV4IDI1MDFmN2UuLjAyNGE5MzggMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3hhdHRyX3RydXN0ZWQuYworKysgYi9mcy9yZWlzZXJmcy94YXR0cl90cnVzdGVkLmMKQEAgLTEsNCArMSw1IEBACiAjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3hhdHRyX3VzZXIuYyBiL2ZzL3JlaXNlcmZzL3hhdHRyX3VzZXIuYwppbmRleCA1MTQ1ODA0Li4wNzNmMzkzIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy94YXR0cl91c2VyLmMKKysrIGIvZnMvcmVpc2VyZnMveGF0dHJfdXNlci5jCkBAIC0xNiwxOCArMTYsMTAgQEAKIHVzZXJfZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7CiAKLQlpbnQgZXJyb3I7Ci0KIAlpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1VTRVJfUFJFRklYKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlpZiAoIXJlaXNlcmZzX3hhdHRyc191c2VyKGlub2RlLT5pX3NiKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JZXJyb3IgPSByZWlzZXJmc19wZXJtaXNzaW9uX2xvY2tlZChpbm9kZSwgTUFZX1JFQUQsIE5VTEwpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCiAJcmV0dXJuIHJlaXNlcmZzX3hhdHRyX2dldChpbm9kZSwgbmFtZSwgYnVmZmVyLCBzaXplKTsKIH0KIApAQCAtMzYsNDMgKzI4LDIxIEBACiAJIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCiB7CiAKLQlpbnQgZXJyb3I7Ci0KIAlpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1VTRVJfUFJFRklYKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoIXJlaXNlcmZzX3hhdHRyc191c2VyKGlub2RlLT5pX3NiKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmCi0JICAgICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fCBpbm9kZS0+aV9tb2RlICYgU19JU1ZUWCkpCi0JCXJldHVybiAtRVBFUk07Ci0KLQllcnJvciA9IHJlaXNlcmZzX3Blcm1pc3Npb25fbG9ja2VkKGlub2RlLCBNQVlfV1JJVEUsIE5VTEwpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCiAJcmV0dXJuIHJlaXNlcmZzX3hhdHRyX3NldChpbm9kZSwgbmFtZSwgYnVmZmVyLCBzaXplLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgdXNlcl9kZWwoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlpbnQgZXJyb3I7Ci0KIAlpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1VTRVJfUFJFRklYKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoIXJlaXNlcmZzX3hhdHRyc191c2VyKGlub2RlLT5pX3NiKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmCi0JICAgICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fCBpbm9kZS0+aV9tb2RlICYgU19JU1ZUWCkpCi0JCXJldHVybiAtRVBFUk07Ci0KLQllcnJvciA9IHJlaXNlcmZzX3Blcm1pc3Npb25fbG9ja2VkKGlub2RlLCBNQVlfV1JJVEUsIE5VTEwpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3JlbGF5ZnMvYnVmZmVycy5jIGIvZnMvcmVsYXlmcy9idWZmZXJzLmMKaW5kZXggODRlMjFmZi4uMTAxODc4MSAxMDA2NDQKLS0tIGEvZnMvcmVsYXlmcy9idWZmZXJzLmMKKysrIGIvZnMvcmVsYXlmcy9idWZmZXJzLmMKQEAgLTE4NSw1ICsxODUsNiBAQAogdm9pZCByZWxheV9yZW1vdmVfYnVmKHN0cnVjdCBrcmVmICprcmVmKQogewogCXN0cnVjdCByY2hhbl9idWYgKmJ1ZiA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgcmNoYW5fYnVmLCBrcmVmKTsKLQlyZWxheWZzX3JlbW92ZShidWYtPmRlbnRyeSk7CisJYnVmLT5jaGFuLT5jYi0+cmVtb3ZlX2J1Zl9maWxlKGJ1Zi0+ZGVudHJ5KTsKKwlyZWxheV9kZXN0cm95X2J1ZihidWYpOwogfQpkaWZmIC0tZ2l0IGEvZnMvcmVsYXlmcy9pbm9kZS5jIGIvZnMvcmVsYXlmcy9pbm9kZS5jCmluZGV4IDBmN2Y4OGQuLjM4MzUyMzAgMTAwNjQ0Ci0tLSBhL2ZzL3JlbGF5ZnMvaW5vZGUuYworKysgYi9mcy9yZWxheWZzL2lub2RlLmMKQEAgLTI2LDMxICsyNiwyMiBAQAogCiBzdGF0aWMgc3RydWN0IHZmc21vdW50ICoJCXJlbGF5ZnNfbW91bnQ7CiBzdGF0aWMgaW50CQkJCXJlbGF5ZnNfbW91bnRfY291bnQ7Ci1zdGF0aWMga21lbV9jYWNoZV90ICoJCQlyZWxheWZzX2lub2RlX2NhY2hlcDsKIAogc3RhdGljIHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvCQlyZWxheWZzX2JhY2tpbmdfZGV2X2luZm8gPSB7CiAJLnJhX3BhZ2VzCT0gMCwJLyogTm8gcmVhZGFoZWFkICovCiAJLmNhcGFiaWxpdGllcwk9IEJESV9DQVBfTk9fQUNDVF9ESVJUWSB8IEJESV9DQVBfTk9fV1JJVEVCQUNLLAogfTsKIAotc3RhdGljIHN0cnVjdCBpbm9kZSAqcmVsYXlmc19nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vZGUsCi0JCQkJICAgICAgIHN0cnVjdCByY2hhbiAqY2hhbikKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKnJlbGF5ZnNfZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICAgIGludCBtb2RlLAorIAkJCQkgICAgICAgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcywKKwkJCQkgICAgICAgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgcmNoYW5fYnVmICpidWYgPSBOVUxMOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAKLQlpZiAoU19JU1JFRyhtb2RlKSkgewotCQlCVUdfT04oIWNoYW4pOwotCQlidWYgPSByZWxheV9jcmVhdGVfYnVmKGNoYW4pOwotCQlpZiAoIWJ1ZikKLQkJCXJldHVybiBOVUxMOwotCX0KLQogCWlub2RlID0gbmV3X2lub2RlKHNiKTsKLQlpZiAoIWlub2RlKSB7Ci0JCXJlbGF5X2Rlc3Ryb3lfYnVmKGJ1Zik7CisJaWYgKCFpbm9kZSkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJaW5vZGUtPmlfdWlkID0gMDsKQEAgLTYxLDggKzUyLDkgQEAKIAlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJc3dpdGNoIChtb2RlICYgU19JRk1UKSB7CiAJY2FzZSBTX0lGUkVHOgotCQlpbm9kZS0+aV9mb3AgPSAmcmVsYXlmc19maWxlX29wZXJhdGlvbnM7Ci0JCVJFTEFZRlNfSShpbm9kZSktPmJ1ZiA9IGJ1ZjsKKwkJaW5vZGUtPmlfZm9wID0gZm9wczsKKwkJaWYgKGRhdGEpCisJCQlpbm9kZS0+dS5nZW5lcmljX2lwID0gZGF0YTsKIAkJYnJlYWs7CiAJY2FzZSBTX0lGRElSOgogCQlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CkBAIC04Myw3ICs3NSw4IEBACiAgKglAbmFtZTogdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gY3JlYXRlCiAgKglAcGFyZW50OiBwYXJlbnQgZGlyZWN0b3J5CiAgKglAbW9kZTogbW9kZQotICoJQGNoYW46IHJlbGF5IGNoYW5uZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlCisgKglAZm9wczogZmlsZSBvcGVyYXRpb25zIHRvIHVzZSBmb3IgdGhlIGZpbGUKKyAqCUBkYXRhOiB1c2VyLWFzc29jaWF0ZWQgZGF0YSBmb3IgdGhpcyBmaWxlCiAgKgogICoJUmV0dXJucyB0aGUgbmV3IGRlbnRyeSwgTlVMTCBvbiBmYWlsdXJlCiAgKgpAQCAtOTIsNyArODUsOCBAQAogc3RhdGljIHN0cnVjdCBkZW50cnkgKnJlbGF5ZnNfY3JlYXRlX2VudHJ5KGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJCSAgIHN0cnVjdCBkZW50cnkgKnBhcmVudCwKIAkJCQkJICAgaW50IG1vZGUsCi0JCQkJCSAgIHN0cnVjdCByY2hhbiAqY2hhbikKKwkJCQkJICAgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcywKKwkJCQkJICAgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpkOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CkBAIC0xMTUsNyArMTA5LDcgQEAKIAl9CiAKIAlwYXJlbnQgPSBkZ2V0KHBhcmVudCk7Ci0JZG93bigmcGFyZW50LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKIAlkID0gbG9va3VwX29uZV9sZW4obmFtZSwgcGFyZW50LCBzdHJsZW4obmFtZSkpOwogCWlmIChJU19FUlIoZCkpIHsKIAkJZCA9IE5VTEw7CkBAIC0xMjcsNyArMTIxLDcgQEAKIAkJZ290byByZWxlYXNlX21vdW50OwogCX0KIAotCWlub2RlID0gcmVsYXlmc19nZXRfaW5vZGUocGFyZW50LT5kX2lub2RlLT5pX3NiLCBtb2RlLCBjaGFuKTsKKwlpbm9kZSA9IHJlbGF5ZnNfZ2V0X2lub2RlKHBhcmVudC0+ZF9pbm9kZS0+aV9zYiwgbW9kZSwgZm9wcywgZGF0YSk7CiAJaWYgKCFpbm9kZSkgewogCQlkID0gTlVMTDsKIAkJZ290byByZWxlYXNlX21vdW50OwpAQCAtMTQ1LDcgKzEzOSw3IEBACiAJc2ltcGxlX3JlbGVhc2VfZnMoJnJlbGF5ZnNfbW91bnQsICZyZWxheWZzX21vdW50X2NvdW50KTsKIAogZXhpdDoKLQl1cCgmcGFyZW50LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCWRwdXQocGFyZW50KTsKIAlyZXR1cm4gZDsKIH0KQEAgLTE1NSwyMCArMTQ5LDI2IEBACiAgKglAbmFtZTogdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gY3JlYXRlCiAgKglAcGFyZW50OiBwYXJlbnQgZGlyZWN0b3J5CiAgKglAbW9kZTogbW9kZSwgaWYgbm90IHNwZWNpZWQgdGhlIGRlZmF1bHQgcGVybXMgYXJlIHVzZWQKLSAqCUBjaGFuOiBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZQorICoJQGZvcHM6IGZpbGUgb3BlcmF0aW9ucyB0byB1c2UgZm9yIHRoZSBmaWxlCisgKglAZGF0YTogdXNlci1hc3NvY2lhdGVkIGRhdGEgZm9yIHRoaXMgZmlsZQogICoKICAqCVJldHVybnMgZmlsZSBkZW50cnkgaWYgc3VjY2Vzc2Z1bCwgTlVMTCBvdGhlcndpc2UuCiAgKgogICoJVGhlIGZpbGUgd2lsbCBiZSBjcmVhdGVkIHVzZXIgciBvbiBiZWhhbGYgb2YgY3VycmVudCB1c2VyLgogICovCi1zdHJ1Y3QgZGVudHJ5ICpyZWxheWZzX2NyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZW50cnkgKnBhcmVudCwKLQkJCQkgICBpbnQgbW9kZSwgc3RydWN0IHJjaGFuICpjaGFuKQorc3RydWN0IGRlbnRyeSAqcmVsYXlmc19jcmVhdGVfZmlsZShjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgIHN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJCQkgICBpbnQgbW9kZSwKKwkJCQkgICBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzLAorCQkJCSAgIHZvaWQgKmRhdGEpCiB7CisJQlVHX09OKCFmb3BzKTsKKwogCWlmICghbW9kZSkKIAkJbW9kZSA9IFNfSVJVU1I7CiAJbW9kZSA9IChtb2RlICYgU19JQUxMVUdPKSB8IFNfSUZSRUc7CiAKLQlyZXR1cm4gcmVsYXlmc19jcmVhdGVfZW50cnkobmFtZSwgcGFyZW50LCBtb2RlLCBjaGFuKTsKKwlyZXR1cm4gcmVsYXlmc19jcmVhdGVfZW50cnkobmFtZSwgcGFyZW50LCBtb2RlLCBmb3BzLCBkYXRhKTsKIH0KIAogLyoqCkBAIC0xODMsNyArMTgzLDcgQEAKIHN0cnVjdCBkZW50cnkgKnJlbGF5ZnNfY3JlYXRlX2Rpcihjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQpCiB7CiAJaW50IG1vZGUgPSBTX0lGRElSIHwgU19JUldYVSB8IFNfSVJVR08gfCBTX0lYVUdPOwotCXJldHVybiByZWxheWZzX2NyZWF0ZV9lbnRyeShuYW1lLCBwYXJlbnQsIG1vZGUsIE5VTEwpOworCXJldHVybiByZWxheWZzX2NyZWF0ZV9lbnRyeShuYW1lLCBwYXJlbnQsIG1vZGUsIE5VTEwsIE5VTEwpOwogfQogCiAvKioKQEAgLTIwNCw3ICsyMDQsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXBhcmVudCA9IGRnZXQocGFyZW50KTsKLQlkb3duKCZwYXJlbnQtPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZwYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCWlmIChkZW50cnktPmRfaW5vZGUpIHsKIAkJaWYgKFNfSVNESVIoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQogCQkJZXJyb3IgPSBzaW1wbGVfcm1kaXIocGFyZW50LT5kX2lub2RlLCBkZW50cnkpOwpAQCAtMjE1LDcgKzIxNSw3IEBACiAJfQogCWlmICghZXJyb3IpCiAJCWRwdXQoZGVudHJ5KTsKLQl1cCgmcGFyZW50LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCWRwdXQocGFyZW50KTsKIAogCWlmICghZXJyb3IpCkBAIC0yMjUsNiArMjI1LDE3IEBACiB9CiAKIC8qKgorICoJcmVsYXlmc19yZW1vdmVfZmlsZSAtIHJlbW92ZSBhIGZpbGUgZnJvbSByZWxheSBmaWxlc3lzdGVtCisgKglAZGVudHJ5OiBkaXJlY3RvcnkgZGVudHJ5CisgKgorICoJUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG5lZ2F0aXZlIG90aGVyd2lzZS4KKyAqLworaW50IHJlbGF5ZnNfcmVtb3ZlX2ZpbGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXJldHVybiByZWxheWZzX3JlbW92ZShkZW50cnkpOworfQorCisvKioKICAqCXJlbGF5ZnNfcmVtb3ZlX2RpciAtIHJlbW92ZSBhIGRpcmVjdG9yeSBpbiB0aGUgcmVsYXkgZmlsZXN5c3RlbQogICoJQGRlbnRyeTogZGlyZWN0b3J5IGRlbnRyeQogICoKQEAgLTIzNiw0NSArMjQ3LDQ1IEBACiB9CiAKIC8qKgotICoJcmVsYXlmc19vcGVuIC0gb3BlbiBmaWxlIG9wIGZvciByZWxheWZzIGZpbGVzCisgKglyZWxheV9maWxlX29wZW4gLSBvcGVuIGZpbGUgb3AgZm9yIHJlbGF5IGZpbGVzCiAgKglAaW5vZGU6IHRoZSBpbm9kZQogICoJQGZpbHA6IHRoZSBmaWxlCiAgKgogICoJSW5jcmVtZW50cyB0aGUgY2hhbm5lbCBidWZmZXIgcmVmY291bnQuCiAgKi8KLXN0YXRpYyBpbnQgcmVsYXlmc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIGludCByZWxheV9maWxlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0Jc3RydWN0IHJjaGFuX2J1ZiAqYnVmID0gUkVMQVlGU19JKGlub2RlKS0+YnVmOworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZiA9IGlub2RlLT51LmdlbmVyaWNfaXA7CiAJa3JlZl9nZXQoJmJ1Zi0+a3JlZik7CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gYnVmOwogCiAJcmV0dXJuIDA7CiB9CiAKIC8qKgotICoJcmVsYXlmc19tbWFwIC0gbW1hcCBmaWxlIG9wIGZvciByZWxheWZzIGZpbGVzCisgKglyZWxheV9maWxlX21tYXAgLSBtbWFwIGZpbGUgb3AgZm9yIHJlbGF5IGZpbGVzCiAgKglAZmlscDogdGhlIGZpbGUKICAqCUB2bWE6IHRoZSB2bWEgZGVzY3JpYmluZyB3aGF0IHRvIG1hcAogICoKICAqCUNhbGxzIHVwb24gcmVsYXlfbW1hcF9idWYgdG8gbWFwIHRoZSBmaWxlIGludG8gdXNlciBzcGFjZS4KICAqLwotc3RhdGljIGludCByZWxheWZzX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorc3RhdGljIGludCByZWxheV9maWxlX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKLQlyZXR1cm4gcmVsYXlfbW1hcF9idWYoUkVMQVlGU19JKGlub2RlKS0+YnVmLCB2bWEpOworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlyZXR1cm4gcmVsYXlfbW1hcF9idWYoYnVmLCB2bWEpOwogfQogCiAvKioKLSAqCXJlbGF5ZnNfcG9sbCAtIHBvbGwgZmlsZSBvcCBmb3IgcmVsYXlmcyBmaWxlcworICoJcmVsYXlfZmlsZV9wb2xsIC0gcG9sbCBmaWxlIG9wIGZvciByZWxheSBmaWxlcwogICoJQGZpbHA6IHRoZSBmaWxlCiAgKglAd2FpdDogcG9sbCB0YWJsZQogICoKICAqCVBvbGwgaW1wbGVtZW50aW9uLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHJlbGF5ZnNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgcG9sbF90YWJsZSAqd2FpdCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVsYXlfZmlsZV9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBwb2xsX3RhYmxlICp3YWl0KQogewogCXVuc2lnbmVkIGludCBtYXNrID0gMDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7Ci0Jc3RydWN0IHJjaGFuX2J1ZiAqYnVmID0gUkVMQVlGU19JKGlub2RlKS0+YnVmOworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAogCWlmIChidWYtPmZpbmFsaXplZCkKIAkJcmV0dXJuIFBPTExFUlI7CkBAIC0yODksMjcgKzMwMCwyNyBAQAogfQogCiAvKioKLSAqCXJlbGF5ZnNfcmVsZWFzZSAtIHJlbGVhc2UgZmlsZSBvcCBmb3IgcmVsYXlmcyBmaWxlcworICoJcmVsYXlfZmlsZV9yZWxlYXNlIC0gcmVsZWFzZSBmaWxlIG9wIGZvciByZWxheSBmaWxlcwogICoJQGlub2RlOiB0aGUgaW5vZGUKICAqCUBmaWxwOiB0aGUgZmlsZQogICoKICAqCURlY3JlbWVudHMgdGhlIGNoYW5uZWwgcmVmY291bnQsIGFzIHRoZSBmaWxlc3lzdGVtIGlzCiAgKglubyBsb25nZXIgdXNpbmcgaXQuCiAgKi8KLXN0YXRpYyBpbnQgcmVsYXlmc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIGludCByZWxheV9maWxlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0Jc3RydWN0IHJjaGFuX2J1ZiAqYnVmID0gUkVMQVlGU19JKGlub2RlKS0+YnVmOworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlrcmVmX3B1dCgmYnVmLT5rcmVmLCByZWxheV9yZW1vdmVfYnVmKTsKIAogCXJldHVybiAwOwogfQogCiAvKioKLSAqCXJlbGF5ZnNfcmVhZF9jb25zdW1lIC0gdXBkYXRlIHRoZSBjb25zdW1lZCBjb3VudCBmb3IgdGhlIGJ1ZmZlcgorICoJcmVsYXlfZmlsZV9yZWFkX2NvbnN1bWUgLSB1cGRhdGUgdGhlIGNvbnN1bWVkIGNvdW50IGZvciB0aGUgYnVmZmVyCiAgKi8KLXN0YXRpYyB2b2lkIHJlbGF5ZnNfcmVhZF9jb25zdW1lKHN0cnVjdCByY2hhbl9idWYgKmJ1ZiwKLQkJCQkgc2l6ZV90IHJlYWRfcG9zLAotCQkJCSBzaXplX3QgYnl0ZXNfY29uc3VtZWQpCitzdGF0aWMgdm9pZCByZWxheV9maWxlX3JlYWRfY29uc3VtZShzdHJ1Y3QgcmNoYW5fYnVmICpidWYsCisJCQkJICAgIHNpemVfdCByZWFkX3BvcywKKwkJCQkgICAgc2l6ZV90IGJ5dGVzX2NvbnN1bWVkKQogewogCXNpemVfdCBzdWJidWZfc2l6ZSA9IGJ1Zi0+Y2hhbi0+c3ViYnVmX3NpemU7CiAJc2l6ZV90IG5fc3ViYnVmcyA9IGJ1Zi0+Y2hhbi0+bl9zdWJidWZzOwpAQCAtMzMyLDkgKzM0Myw5IEBACiB9CiAKIC8qKgotICoJcmVsYXlmc19yZWFkX2F2YWlsIC0gYm9vbGVhbiwgYXJlIHRoZXJlIHVuY29uc3VtZWQgYnl0ZXMgYXZhaWxhYmxlPworICoJcmVsYXlfZmlsZV9yZWFkX2F2YWlsIC0gYm9vbGVhbiwgYXJlIHRoZXJlIHVuY29uc3VtZWQgYnl0ZXMgYXZhaWxhYmxlPwogICovCi1zdGF0aWMgaW50IHJlbGF5ZnNfcmVhZF9hdmFpbChzdHJ1Y3QgcmNoYW5fYnVmICpidWYsIHNpemVfdCByZWFkX3BvcykKK3N0YXRpYyBpbnQgcmVsYXlfZmlsZV9yZWFkX2F2YWlsKHN0cnVjdCByY2hhbl9idWYgKmJ1Ziwgc2l6ZV90IHJlYWRfcG9zKQogewogCXNpemVfdCBieXRlc19wcm9kdWNlZCwgYnl0ZXNfY29uc3VtZWQsIHdyaXRlX29mZnNldDsKIAlzaXplX3Qgc3ViYnVmX3NpemUgPSBidWYtPmNoYW4tPnN1YmJ1Zl9zaXplOwpAQCAtMzY1LDE2ICszNzYsMTYgQEAKIAlpZiAoYnl0ZXNfcHJvZHVjZWQgPT0gYnl0ZXNfY29uc3VtZWQpCiAJCXJldHVybiAwOwogCi0JcmVsYXlmc19yZWFkX2NvbnN1bWUoYnVmLCByZWFkX3BvcywgMCk7CisJcmVsYXlfZmlsZV9yZWFkX2NvbnN1bWUoYnVmLCByZWFkX3BvcywgMCk7CiAKIAlyZXR1cm4gMTsKIH0KIAogLyoqCi0gKglyZWxheWZzX3JlYWRfc3ViYnVmX2F2YWlsIC0gcmV0dXJuIGJ5dGVzIGF2YWlsYWJsZSBpbiBzdWItYnVmZmVyCisgKglyZWxheV9maWxlX3JlYWRfc3ViYnVmX2F2YWlsIC0gcmV0dXJuIGJ5dGVzIGF2YWlsYWJsZSBpbiBzdWItYnVmZmVyCiAgKi8KLXN0YXRpYyBzaXplX3QgcmVsYXlmc19yZWFkX3N1YmJ1Zl9hdmFpbChzaXplX3QgcmVhZF9wb3MsCi0JCQkJCXN0cnVjdCByY2hhbl9idWYgKmJ1ZikKK3N0YXRpYyBzaXplX3QgcmVsYXlfZmlsZV9yZWFkX3N1YmJ1Zl9hdmFpbChzaXplX3QgcmVhZF9wb3MsCisJCQkJCSAgIHN0cnVjdCByY2hhbl9idWYgKmJ1ZikKIHsKIAlzaXplX3QgcGFkZGluZywgYXZhaWwgPSAwOwogCXNpemVfdCByZWFkX3N1YmJ1ZiwgcmVhZF9vZmZzZXQsIHdyaXRlX3N1YmJ1Ziwgd3JpdGVfb2Zmc2V0OwpAQCAtMzk2LDE0ICs0MDcsMTQgQEAKIH0KIAogLyoqCi0gKglyZWxheWZzX3JlYWRfc3RhcnRfcG9zIC0gZmluZCB0aGUgZmlyc3QgYXZhaWxhYmxlIGJ5dGUgdG8gcmVhZAorICoJcmVsYXlfZmlsZV9yZWFkX3N0YXJ0X3BvcyAtIGZpbmQgdGhlIGZpcnN0IGF2YWlsYWJsZSBieXRlIHRvIHJlYWQKICAqCiAgKglJZiB0aGUgcmVhZF9wb3MgaXMgaW4gdGhlIG1pZGRsZSBvZiBwYWRkaW5nLCByZXR1cm4gdGhlCiAgKglwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYWN0dWFsbHkgYXZhaWxhYmxlIGJ5dGUsIG90aGVyd2lzZQogICoJcmV0dXJuIHRoZSBvcmlnaW5hbCB2YWx1ZS4KICAqLwotc3RhdGljIHNpemVfdCByZWxheWZzX3JlYWRfc3RhcnRfcG9zKHNpemVfdCByZWFkX3BvcywKLQkJCQkgICAgIHN0cnVjdCByY2hhbl9idWYgKmJ1ZikKK3N0YXRpYyBzaXplX3QgcmVsYXlfZmlsZV9yZWFkX3N0YXJ0X3BvcyhzaXplX3QgcmVhZF9wb3MsCisJCQkJCXN0cnVjdCByY2hhbl9idWYgKmJ1ZikKIHsKIAlzaXplX3QgcmVhZF9zdWJidWYsIHBhZGRpbmcsIHBhZGRpbmdfc3RhcnQsIHBhZGRpbmdfZW5kOwogCXNpemVfdCBzdWJidWZfc2l6ZSA9IGJ1Zi0+Y2hhbi0+c3ViYnVmX3NpemU7CkBAIC00MjIsMTEgKzQzMywxMSBAQAogfQogCiAvKioKLSAqCXJlbGF5ZnNfcmVhZF9lbmRfcG9zIC0gcmV0dXJuIHRoZSBuZXcgcmVhZCBwb3NpdGlvbgorICoJcmVsYXlfZmlsZV9yZWFkX2VuZF9wb3MgLSByZXR1cm4gdGhlIG5ldyByZWFkIHBvc2l0aW9uCiAgKi8KLXN0YXRpYyBzaXplX3QgcmVsYXlmc19yZWFkX2VuZF9wb3Moc3RydWN0IHJjaGFuX2J1ZiAqYnVmLAotCQkJCSAgIHNpemVfdCByZWFkX3BvcywKLQkJCQkgICBzaXplX3QgY291bnQpCitzdGF0aWMgc2l6ZV90IHJlbGF5X2ZpbGVfcmVhZF9lbmRfcG9zKHN0cnVjdCByY2hhbl9idWYgKmJ1ZiwKKwkJCQkgICAgICBzaXplX3QgcmVhZF9wb3MsCisJCQkJICAgICAgc2l6ZV90IGNvdW50KQogewogCXNpemVfdCByZWFkX3N1YmJ1ZiwgcGFkZGluZywgZW5kX3BvczsKIAlzaXplX3Qgc3ViYnVmX3NpemUgPSBidWYtPmNoYW4tPnN1YmJ1Zl9zaXplOwpAQCAtNDQ1LDcgKzQ1Niw3IEBACiB9CiAKIC8qKgotICoJcmVsYXlmc19yZWFkIC0gcmVhZCBmaWxlIG9wIGZvciByZWxheWZzIGZpbGVzCisgKglyZWxheV9maWxlX3JlYWQgLSByZWFkIGZpbGUgb3AgZm9yIHJlbGF5IGZpbGVzCiAgKglAZmlscDogdGhlIGZpbGUKICAqCUBidWZmZXI6IHRoZSB1c2Vyc3BhY2UgYnVmZmVyCiAgKglAY291bnQ6IG51bWJlciBvZiBieXRlcyB0byByZWFkCkBAIC00NTQsMjMgKzQ2NSwyMyBAQAogICoJUmVhZHMgY291bnQgYnl0ZXMgb3IgdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgaW4gdGhlCiAgKgljdXJyZW50IHN1Yi1idWZmZXIgYmVpbmcgcmVhZCwgd2hpY2hldmVyIGlzIHNtYWxsZXIuCiAgKi8KLXN0YXRpYyBzc2l6ZV90IHJlbGF5ZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCSAgICBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkJICAgIHNpemVfdCBjb3VudCwKLQkJCSAgICBsb2ZmX3QgKnBwb3MpCitzdGF0aWMgc3NpemVfdCByZWxheV9maWxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgICAgICAgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgICBzaXplX3QgY291bnQsCisJCQkgICAgICAgbG9mZl90ICpwcG9zKQogeworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7Ci0Jc3RydWN0IHJjaGFuX2J1ZiAqYnVmID0gUkVMQVlGU19JKGlub2RlKS0+YnVmOwogCXNpemVfdCByZWFkX3N0YXJ0LCBhdmFpbDsKIAlzc2l6ZV90IHJldCA9IDA7CiAJdm9pZCAqZnJvbTsKIAotCWRvd24oJmlub2RlLT5pX3NlbSk7Ci0JaWYoIXJlbGF5ZnNfcmVhZF9hdmFpbChidWYsICpwcG9zKSkKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJaWYoIXJlbGF5X2ZpbGVfcmVhZF9hdmFpbChidWYsICpwcG9zKSkKIAkJZ290byBvdXQ7CiAKLQlyZWFkX3N0YXJ0ID0gcmVsYXlmc19yZWFkX3N0YXJ0X3BvcygqcHBvcywgYnVmKTsKLQlhdmFpbCA9IHJlbGF5ZnNfcmVhZF9zdWJidWZfYXZhaWwocmVhZF9zdGFydCwgYnVmKTsKKwlyZWFkX3N0YXJ0ID0gcmVsYXlfZmlsZV9yZWFkX3N0YXJ0X3BvcygqcHBvcywgYnVmKTsKKwlhdmFpbCA9IHJlbGF5X2ZpbGVfcmVhZF9zdWJidWZfYXZhaWwocmVhZF9zdGFydCwgYnVmKTsKIAlpZiAoIWF2YWlsKQogCQlnb3RvIG91dDsKIApAQCAtNDgwLDU4ICs0OTEsMjUgQEAKIAkJcmV0ID0gLUVGQVVMVDsKIAkJZ290byBvdXQ7CiAJfQotCXJlbGF5ZnNfcmVhZF9jb25zdW1lKGJ1ZiwgcmVhZF9zdGFydCwgY291bnQpOwotCSpwcG9zID0gcmVsYXlmc19yZWFkX2VuZF9wb3MoYnVmLCByZWFkX3N0YXJ0LCBjb3VudCk7CisJcmVsYXlfZmlsZV9yZWFkX2NvbnN1bWUoYnVmLCByZWFkX3N0YXJ0LCBjb3VudCk7CisJKnBwb3MgPSByZWxheV9maWxlX3JlYWRfZW5kX3BvcyhidWYsIHJlYWRfc3RhcnQsIGNvdW50KTsKIG91dDoKLQl1cCgmaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCi0vKioKLSAqCXJlbGF5ZnMgYWxsb2NfaW5vZGUoKSBpbXBsZW1lbnRhdGlvbgotICovCi1zdGF0aWMgc3RydWN0IGlub2RlICpyZWxheWZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCi17Ci0Jc3RydWN0IHJlbGF5ZnNfaW5vZGVfaW5mbyAqcCA9IGttZW1fY2FjaGVfYWxsb2MocmVsYXlmc19pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKLQlpZiAoIXApCi0JCXJldHVybiBOVUxMOwotCXAtPmJ1ZiA9IE5VTEw7Ci0KLQlyZXR1cm4gJnAtPnZmc19pbm9kZTsKLX0KLQotLyoqCi0gKglyZWxheWZzIGRlc3Ryb3lfaW5vZGUoKSBpbXBsZW1lbnRhdGlvbgotICovCi1zdGF0aWMgdm9pZCByZWxheWZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlpZiAoUkVMQVlGU19JKGlub2RlKS0+YnVmKQotCQlyZWxheV9kZXN0cm95X2J1ZihSRUxBWUZTX0koaW5vZGUpLT5idWYpOwotCi0Ja21lbV9jYWNoZV9mcmVlKHJlbGF5ZnNfaW5vZGVfY2FjaGVwLCBSRUxBWUZTX0koaW5vZGUpKTsKLX0KLQotc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKnAsIGttZW1fY2FjaGVfdCAqY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXN0cnVjdCByZWxheWZzX2lub2RlX2luZm8gKmkgPSBwOwotCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWSB8IFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09IFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikKLQkJaW5vZGVfaW5pdF9vbmNlKCZpLT52ZnNfaW5vZGUpOwotfQotCi1zdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlbGF5ZnNfZmlsZV9vcGVyYXRpb25zID0gewotCS5vcGVuCQk9IHJlbGF5ZnNfb3BlbiwKLQkucG9sbAkJPSByZWxheWZzX3BvbGwsCi0JLm1tYXAJCT0gcmVsYXlmc19tbWFwLAotCS5yZWFkCQk9IHJlbGF5ZnNfcmVhZCwKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVsYXlfZmlsZV9vcGVyYXRpb25zID0geworCS5vcGVuCQk9IHJlbGF5X2ZpbGVfb3BlbiwKKwkucG9sbAkJPSByZWxheV9maWxlX3BvbGwsCisJLm1tYXAJCT0gcmVsYXlfZmlsZV9tbWFwLAorCS5yZWFkCQk9IHJlbGF5X2ZpbGVfcmVhZCwKIAkubGxzZWVrCQk9IG5vX2xsc2VlaywKLQkucmVsZWFzZQk9IHJlbGF5ZnNfcmVsZWFzZSwKKwkucmVsZWFzZQk9IHJlbGF5X2ZpbGVfcmVsZWFzZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyByZWxheWZzX29wcyA9IHsKIAkuc3RhdGZzCQk9IHNpbXBsZV9zdGF0ZnMsCiAJLmRyb3BfaW5vZGUJPSBnZW5lcmljX2RlbGV0ZV9pbm9kZSwKLQkuYWxsb2NfaW5vZGUJPSByZWxheWZzX2FsbG9jX2lub2RlLAotCS5kZXN0cm95X2lub2RlCT0gcmVsYXlmc19kZXN0cm95X2lub2RlLAogfTsKIAogc3RhdGljIGludCByZWxheWZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHZvaWQgKiBkYXRhLCBpbnQgc2lsZW50KQpAQCAtNTQ0LDcgKzUyMiw3IEBACiAJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSBQQUdFX0NBQ0hFX1NISUZUOwogCXNiLT5zX21hZ2ljID0gUkVMQVlGU19NQUdJQzsKIAlzYi0+c19vcCA9ICZyZWxheWZzX29wczsKLQlpbm9kZSA9IHJlbGF5ZnNfZ2V0X2lub2RlKHNiLCBtb2RlLCBOVUxMKTsKKwlpbm9kZSA9IHJlbGF5ZnNfZ2V0X2lub2RlKHNiLCBtb2RlLCBOVUxMLCBOVUxMKTsKIAogCWlmICghaW5vZGUpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNTc1LDMzICs1NTMsMjcgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9yZWxheWZzX2ZzKHZvaWQpCiB7Ci0JaW50IGVycjsKLQotCXJlbGF5ZnNfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoInJlbGF5ZnNfaW5vZGVfY2FjaGUiLAotCQkJCXNpemVvZihzdHJ1Y3QgcmVsYXlmc19pbm9kZV9pbmZvKSwgMCwKLQkJCQkwLCBpbml0X29uY2UsIE5VTEwpOwotCWlmICghcmVsYXlmc19pbm9kZV9jYWNoZXApCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmcmVsYXlmc19mc190eXBlKTsKLQlpZiAoZXJyKQotCQlrbWVtX2NhY2hlX2Rlc3Ryb3kocmVsYXlmc19pbm9kZV9jYWNoZXApOwotCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmcmVsYXlmc19mc190eXBlKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGV4aXRfcmVsYXlmc19mcyh2b2lkKQogeworCisKKworCisKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnJlbGF5ZnNfZnNfdHlwZSk7Ci0Ja21lbV9jYWNoZV9kZXN0cm95KHJlbGF5ZnNfaW5vZGVfY2FjaGVwKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdF9yZWxheWZzX2ZzKQogbW9kdWxlX2V4aXQoZXhpdF9yZWxheWZzX2ZzKQogCi1FWFBPUlRfU1lNQk9MX0dQTChyZWxheWZzX2ZpbGVfb3BlcmF0aW9ucyk7CitFWFBPUlRfU1lNQk9MX0dQTChyZWxheV9maWxlX29wZXJhdGlvbnMpOwogRVhQT1JUX1NZTUJPTF9HUEwocmVsYXlmc19jcmVhdGVfZGlyKTsKIEVYUE9SVF9TWU1CT0xfR1BMKHJlbGF5ZnNfcmVtb3ZlX2Rpcik7CitFWFBPUlRfU1lNQk9MX0dQTChyZWxheWZzX2NyZWF0ZV9maWxlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHJlbGF5ZnNfcmVtb3ZlX2ZpbGUpOwogCiBNT0RVTEVfQVVUSE9SKCJUb20gWmFudXNzaSA8emFudXNzaUB1cy5pYm0uY29tPiBhbmQgS2FyaW0gWWFnaG1vdXIgPGthcmltQG9wZXJzeXMuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJSZWxheSBGaWxlc3lzdGVtIik7CmRpZmYgLS1naXQgYS9mcy9yZWxheWZzL3JlbGF5LmMgYi9mcy9yZWxheWZzL3JlbGF5LmMKaW5kZXggMmE2ZjdmMS4uYWJmM2NlYSAxMDA2NDQKLS0tIGEvZnMvcmVsYXlmcy9yZWxheS5jCisrKyBiL2ZzL3JlbGF5ZnMvcmVsYXkuYwpAQCAtODAsMTEgKzgwLDM0IEBACiB7CiB9CiAKKy8qCisgKiBjcmVhdGVfYnVmX2ZpbGVfY3JlYXRlKCkgZGVmYXVsdCBjYWxsYmFjay4gIENyZWF0ZXMgZmlsZSB0byByZXByZXNlbnQgYnVmLgorICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqY3JlYXRlX2J1Zl9maWxlX2RlZmF1bHRfY2FsbGJhY2soY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCQkJCQkgICAgICAgc3RydWN0IGRlbnRyeSAqcGFyZW50LAorCQkJCQkJICAgICAgIGludCBtb2RlLAorCQkJCQkJICAgICAgIHN0cnVjdCByY2hhbl9idWYgKmJ1ZiwKKwkJCQkJCSAgICAgICBpbnQgKmlzX2dsb2JhbCkKK3sKKwlyZXR1cm4gcmVsYXlmc19jcmVhdGVfZmlsZShmaWxlbmFtZSwgcGFyZW50LCBtb2RlLAorCQkJCSAgICZyZWxheV9maWxlX29wZXJhdGlvbnMsIGJ1Zik7Cit9CisKKy8qCisgKiByZW1vdmVfYnVmX2ZpbGUoKSBkZWZhdWx0IGNhbGxiYWNrLiAgUmVtb3ZlcyBmaWxlIHJlcHJlc2VudGluZyByZWxheSBidWZmZXIuCisgKi8KK3N0YXRpYyBpbnQgcmVtb3ZlX2J1Zl9maWxlX2RlZmF1bHRfY2FsbGJhY2soc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXJldHVybiByZWxheWZzX3JlbW92ZShkZW50cnkpOworfQorCiAvKiByZWxheSBjaGFubmVsIGRlZmF1bHQgY2FsbGJhY2tzICovCiBzdGF0aWMgc3RydWN0IHJjaGFuX2NhbGxiYWNrcyBkZWZhdWx0X2NoYW5uZWxfY2FsbGJhY2tzID0gewogCS5zdWJidWZfc3RhcnQgPSBzdWJidWZfc3RhcnRfZGVmYXVsdF9jYWxsYmFjaywKIAkuYnVmX21hcHBlZCA9IGJ1Zl9tYXBwZWRfZGVmYXVsdF9jYWxsYmFjaywKIAkuYnVmX3VubWFwcGVkID0gYnVmX3VubWFwcGVkX2RlZmF1bHRfY2FsbGJhY2ssCisJLmNyZWF0ZV9idWZfZmlsZSA9IGNyZWF0ZV9idWZfZmlsZV9kZWZhdWx0X2NhbGxiYWNrLAorCS5yZW1vdmVfYnVmX2ZpbGUgPSByZW1vdmVfYnVmX2ZpbGVfZGVmYXVsdF9jYWxsYmFjaywKIH07CiAKIC8qKgpAQCAtMTQ4LDE0ICsxNzEsMTYgQEAKIHZvaWQgcmVsYXlfcmVzZXQoc3RydWN0IHJjaGFuICpjaGFuKQogewogCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCByY2hhbl9idWYgKnByZXYgPSBOVUxMOwogCiAJaWYgKCFjaGFuKQogCQlyZXR1cm47CiAKIAlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7Ci0JCWlmICghY2hhbi0+YnVmW2ldKQotCQkJY29udGludWU7CisJCWlmICghY2hhbi0+YnVmW2ldIHx8IGNoYW4tPmJ1ZltpXSA9PSBwcmV2KQorCQkJYnJlYWs7CiAJCV9fcmVsYXlfcmVzZXQoY2hhbi0+YnVmW2ldLCAwKTsKKwkJcHJldiA9IGNoYW4tPmJ1ZltpXTsKIAl9CiB9CiAKQEAgLTE2NiwxNyArMTkxLDI3IEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgcmNoYW5fYnVmICpyZWxheV9vcGVuX2J1ZihzdHJ1Y3QgcmNoYW4gKmNoYW4sCiAJCQkJCWNvbnN0IGNoYXIgKmZpbGVuYW1lLAotCQkJCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQpCisJCQkJCXN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJCQkJaW50ICppc19nbG9iYWwpCiB7CiAJc3RydWN0IHJjaGFuX2J1ZiAqYnVmOwogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAotCS8qIENyZWF0ZSBmaWxlIGluIGZzICovCi0JZGVudHJ5ID0gcmVsYXlmc19jcmVhdGVfZmlsZShmaWxlbmFtZSwgcGFyZW50LCBTX0lSVVNSLCBjaGFuKTsKLQlpZiAoIWRlbnRyeSkKLQkJcmV0dXJuIE5VTEw7CisJaWYgKCppc19nbG9iYWwpCisJCXJldHVybiBjaGFuLT5idWZbMF07CiAKLQlidWYgPSBSRUxBWUZTX0koZGVudHJ5LT5kX2lub2RlKS0+YnVmOworIAlidWYgPSByZWxheV9jcmVhdGVfYnVmKGNoYW4pOworIAlpZiAoIWJ1ZikKKyAJCXJldHVybiBOVUxMOworCisJLyogQ3JlYXRlIGZpbGUgaW4gZnMgKi8KKyAJZGVudHJ5ID0gY2hhbi0+Y2ItPmNyZWF0ZV9idWZfZmlsZShmaWxlbmFtZSwgcGFyZW50LCBTX0lSVVNSLAorIAkJCQkJICAgYnVmLCBpc19nbG9iYWwpOworIAlpZiAoIWRlbnRyeSkgeworIAkJcmVsYXlfZGVzdHJveV9idWYoYnVmKTsKKwkJcmV0dXJuIE5VTEw7CisgCX0KKwogCWJ1Zi0+ZGVudHJ5ID0gZGVudHJ5OwogCV9fcmVsYXlfcmVzZXQoYnVmLCAxKTsKIApAQCAtMjE0LDYgKzI0OSwxMCBAQAogCQljYi0+YnVmX21hcHBlZCA9IGJ1Zl9tYXBwZWRfZGVmYXVsdF9jYWxsYmFjazsKIAlpZiAoIWNiLT5idWZfdW5tYXBwZWQpCiAJCWNiLT5idWZfdW5tYXBwZWQgPSBidWZfdW5tYXBwZWRfZGVmYXVsdF9jYWxsYmFjazsKKwlpZiAoIWNiLT5jcmVhdGVfYnVmX2ZpbGUpCisJCWNiLT5jcmVhdGVfYnVmX2ZpbGUgPSBjcmVhdGVfYnVmX2ZpbGVfZGVmYXVsdF9jYWxsYmFjazsKKwlpZiAoIWNiLT5yZW1vdmVfYnVmX2ZpbGUpCisJCWNiLT5yZW1vdmVfYnVmX2ZpbGUgPSByZW1vdmVfYnVmX2ZpbGVfZGVmYXVsdF9jYWxsYmFjazsKIAljaGFuLT5jYiA9IGNiOwogfQogCkBAIC0yNDEsNiArMjgwLDcgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAlzdHJ1Y3QgcmNoYW4gKmNoYW47CiAJY2hhciAqdG1wbmFtZTsKKwlpbnQgaXNfZ2xvYmFsID0gMDsKIAogCWlmICghYmFzZV9maWxlbmFtZSkKIAkJcmV0dXJuIE5VTEw7CkBAIC0yNjUsNyArMzA1LDggQEAKIAogCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgewogCQlzcHJpbnRmKHRtcG5hbWUsICIlcyVkIiwgYmFzZV9maWxlbmFtZSwgaSk7Ci0JCWNoYW4tPmJ1ZltpXSA9IHJlbGF5X29wZW5fYnVmKGNoYW4sIHRtcG5hbWUsIHBhcmVudCk7CisJCWNoYW4tPmJ1ZltpXSA9IHJlbGF5X29wZW5fYnVmKGNoYW4sIHRtcG5hbWUsIHBhcmVudCwKKwkJCQkJICAgICAgJmlzX2dsb2JhbCk7CiAJCWNoYW4tPmJ1ZltpXS0+Y3B1ID0gaTsKIAkJaWYgKCFjaGFuLT5idWZbaV0pCiAJCQlnb3RvIGZyZWVfYnVmczsKQEAgLTI3OSw2ICszMjAsOCBAQAogCQlpZiAoIWNoYW4tPmJ1ZltpXSkKIAkJCWJyZWFrOwogCQlyZWxheV9jbG9zZV9idWYoY2hhbi0+YnVmW2ldKTsKKwkJaWYgKGlzX2dsb2JhbCkKKwkJCWJyZWFrOwogCX0KIAlrZnJlZSh0bXBuYW1lKTsKIApAQCAtMzg4LDE0ICs0MzEsMTYgQEAKIHZvaWQgcmVsYXlfY2xvc2Uoc3RydWN0IHJjaGFuICpjaGFuKQogewogCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCByY2hhbl9idWYgKnByZXYgPSBOVUxMOwogCiAJaWYgKCFjaGFuKQogCQlyZXR1cm47CiAKIAlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7Ci0JCWlmICghY2hhbi0+YnVmW2ldKQotCQkJY29udGludWU7CisJCWlmICghY2hhbi0+YnVmW2ldIHx8IGNoYW4tPmJ1ZltpXSA9PSBwcmV2KQorCQkJYnJlYWs7CiAJCXJlbGF5X2Nsb3NlX2J1ZihjaGFuLT5idWZbaV0pOworCQlwcmV2ID0gY2hhbi0+YnVmW2ldOwogCX0KIAogCWlmIChjaGFuLT5sYXN0X3Rvb2JpZykKQEAgLTQxNSwxNCArNDYwLDE2IEBACiB2b2lkIHJlbGF5X2ZsdXNoKHN0cnVjdCByY2hhbiAqY2hhbikKIHsKIAl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgcmNoYW5fYnVmICpwcmV2ID0gTlVMTDsKIAogCWlmICghY2hhbikKIAkJcmV0dXJuOwogCiAJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgewotCQlpZiAoIWNoYW4tPmJ1ZltpXSkKLQkJCWNvbnRpbnVlOworCQlpZiAoIWNoYW4tPmJ1ZltpXSB8fCBjaGFuLT5idWZbaV0gPT0gcHJldikKKwkJCWJyZWFrOwogCQlyZWxheV9zd2l0Y2hfc3ViYnVmKGNoYW4tPmJ1ZltpXSwgMCk7CisJCXByZXYgPSBjaGFuLT5idWZbaV07CiAJfQogfQogCmRpZmYgLS1naXQgYS9mcy9yZWxheWZzL3JlbGF5LmggYi9mcy9yZWxheWZzL3JlbGF5LmgKaW5kZXggNzAzNTAzZi4uMDk5M2QzZSAxMDA2NDQKLS0tIGEvZnMvcmVsYXlmcy9yZWxheS5oCisrKyBiL2ZzL3JlbGF5ZnMvcmVsYXkuaApAQCAtMSwxMCArMSw2IEBACiAjaWZuZGVmIF9SRUxBWV9ICiAjZGVmaW5lIF9SRUxBWV9ICiAKLXN0cnVjdCBkZW50cnkgKnJlbGF5ZnNfY3JlYXRlX2ZpbGUoY29uc3QgY2hhciAqbmFtZSwKLQkJCQkgICBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsCi0JCQkJICAgaW50IG1vZGUsCi0JCQkJICAgc3RydWN0IHJjaGFuICpjaGFuKTsKIGV4dGVybiBpbnQgcmVsYXlmc19yZW1vdmUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKIGV4dGVybiBpbnQgcmVsYXlfYnVmX2VtcHR5KHN0cnVjdCByY2hhbl9idWYgKmJ1Zik7CiBleHRlcm4gdm9pZCByZWxheV9kZXN0cm95X2NoYW5uZWwoc3RydWN0IGtyZWYgKmtyZWYpOwpkaWZmIC0tZ2l0IGEvZnMvcm9tZnMvaW5vZGUuYyBiL2ZzL3JvbWZzL2lub2RlLmMKaW5kZXggYzc0ZjM4Mi4uMGExMzg1OSAxMDA2NDQKLS0tIGEvZnMvcm9tZnMvaW5vZGUuYworKysgYi9mcy9yb21mcy9pbm9kZS5jCkBAIC00MTgsNyArNDE4LDcgQEAKIHJvbWZzX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqIHBhZ2UpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQsIGF2YWlsLCByZWFkbGVuOworCWxvZmZfdCBvZmZzZXQsIGF2YWlsLCByZWFkbGVuOwogCXZvaWQgKmJ1ZjsKIAlpbnQgcmVzdWx0ID0gLUVJTzsKIApAQCAtNDI5LDggKzQyOSw4IEBACiAJCWdvdG8gZXJyX291dDsKIAogCS8qIDMyIGJpdCB3YXJuaW5nIC0tIGJ1dCBub3QgZm9yIHVzIDopICovCi0Jb2Zmc2V0ID0gcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKLQlpZiAob2Zmc2V0IDwgaW5vZGUtPmlfc2l6ZSkgeworCW9mZnNldCA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpOworCWlmIChvZmZzZXQgPCBpX3NpemVfcmVhZChpbm9kZSkpIHsKIAkJYXZhaWwgPSBpbm9kZS0+aV9zaXplLW9mZnNldDsKIAkJcmVhZGxlbiA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGF2YWlsLCBQQUdFX1NJWkUpOwogCQlpZiAocm9tZnNfY29weWZyb20oaW5vZGUsIGJ1ZiwgUk9NRlNfSShpbm9kZSktPmlfZGF0YW9mZnNldCtvZmZzZXQsIHJlYWRsZW4pID09IHJlYWRsZW4pIHsKZGlmZiAtLWdpdCBhL2ZzL3NlbGVjdC5jIGIvZnMvc2VsZWN0LmMKaW5kZXggZjEwYTEwMy4uYzBmMDJkMyAxMDA2NDQKLS0tIGEvZnMvc2VsZWN0LmMKKysrIGIvZnMvc2VsZWN0LmMKQEAgLTE3OSwxMiArMTc5LDExIEBACiAjZGVmaW5lIFBPTExPVVRfU0VUIChQT0xMV1JCQU5EIHwgUE9MTFdSTk9STSB8IFBPTExPVVQgfCBQT0xMRVJSKQogI2RlZmluZSBQT0xMRVhfU0VUIChQT0xMUFJJKQogCi1pbnQgZG9fc2VsZWN0KGludCBuLCBmZF9zZXRfYml0cyAqZmRzLCBsb25nICp0aW1lb3V0KQoraW50IGRvX3NlbGVjdChpbnQgbiwgZmRfc2V0X2JpdHMgKmZkcywgczY0ICp0aW1lb3V0KQogewogCXN0cnVjdCBwb2xsX3dxdWV1ZXMgdGFibGU7CiAJcG9sbF90YWJsZSAqd2FpdDsKIAlpbnQgcmV0dmFsLCBpOwotCWxvbmcgX190aW1lb3V0ID0gKnRpbWVvdXQ7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJcmV0dmFsID0gbWF4X3NlbGVjdF9mZChuLCBmZHMpOwpAQCAtMTk2LDExICsxOTUsMTIgQEAKIAogCXBvbGxfaW5pdHdhaXQoJnRhYmxlKTsKIAl3YWl0ID0gJnRhYmxlLnB0OwotCWlmICghX190aW1lb3V0KQorCWlmICghKnRpbWVvdXQpCiAJCXdhaXQgPSBOVUxMOwogCXJldHZhbCA9IDA7CiAJZm9yICg7OykgewogCQl1bnNpZ25lZCBsb25nICpyaW5wLCAqcm91dHAsICpyZXhwLCAqaW5wLCAqb3V0cCwgKmV4cDsKKwkJbG9uZyBfX3RpbWVvdXQ7CiAKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIApAQCAtMjU1LDIyICsyNTUsMzIgQEAKIAkJCQkqcmV4cCA9IHJlc19leDsKIAkJfQogCQl3YWl0ID0gTlVMTDsKLQkJaWYgKHJldHZhbCB8fCAhX190aW1lb3V0IHx8IHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlpZiAocmV0dmFsIHx8ICEqdGltZW91dCB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCWJyZWFrOwogCQlpZih0YWJsZS5lcnJvcikgewogCQkJcmV0dmFsID0gdGFibGUuZXJyb3I7CiAJCQlicmVhazsKIAkJfQorCisJCWlmICgqdGltZW91dCA8IDApIHsKKwkJCS8qIFdhaXQgaW5kZWZpbml0ZWx5ICovCisJCQlfX3RpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwkJfSBlbHNlIGlmICh1bmxpa2VseSgqdGltZW91dCA+PSAoczY0KU1BWF9TQ0hFRFVMRV9USU1FT1VUIC0gMSkpIHsKKwkJCS8qIFdhaXQgZm9yIGxvbmdlciB0aGFuIE1BWF9TQ0hFRFVMRV9USU1FT1VULiBEbyBpdCBpbiBhIGxvb3AgKi8KKwkJCV9fdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUIC0gMTsKKwkJCSp0aW1lb3V0IC09IF9fdGltZW91dDsKKwkJfSBlbHNlIHsKKwkJCV9fdGltZW91dCA9ICp0aW1lb3V0OworCQkJKnRpbWVvdXQgPSAwOworCQl9CiAJCV9fdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQoX190aW1lb3V0KTsKKwkJaWYgKCp0aW1lb3V0ID49IDApCisJCQkqdGltZW91dCArPSBfX3RpbWVvdXQ7CiAJfQogCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAogCXBvbGxfZnJlZXdhaXQoJnRhYmxlKTsKIAotCS8qCi0JICogVXAtdG8tZGF0ZSB0aGUgY2FsbGVyIHRpbWVvdXQuCi0JICovCi0JKnRpbWVvdXQgPSBfX3RpbWVvdXQ7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMjk1LDM2ICszMDUsMTQgQEAKICNkZWZpbmUgTUFYX1NFTEVDVF9TRUNPTkRTIFwKIAkoKHVuc2lnbmVkIGxvbmcpIChNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKS0xKQogCi1hc21saW5rYWdlIGxvbmcKLXN5c19zZWxlY3QoaW50IG4sIGZkX3NldCBfX3VzZXIgKmlucCwgZmRfc2V0IF9fdXNlciAqb3V0cCwgZmRfc2V0IF9fdXNlciAqZXhwLCBzdHJ1Y3QgdGltZXZhbCBfX3VzZXIgKnR2cCkKK3N0YXRpYyBpbnQgY29yZV9zeXNfc2VsZWN0KGludCBuLCBmZF9zZXQgX191c2VyICppbnAsIGZkX3NldCBfX3VzZXIgKm91dHAsCisJCQkgICBmZF9zZXQgX191c2VyICpleHAsIHM2NCAqdGltZW91dCkKIHsKIAlmZF9zZXRfYml0cyBmZHM7CiAJY2hhciAqYml0czsKLQlsb25nIHRpbWVvdXQ7CiAJaW50IHJldCwgc2l6ZSwgbWF4X2Zkc2V0OwogCXN0cnVjdCBmZHRhYmxlICpmZHQ7CiAKLQl0aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7Ci0JaWYgKHR2cCkgewotCQl0aW1lX3Qgc2VjLCB1c2VjOwotCi0JCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB0dnAsIHNpemVvZigqdHZwKSkKLQkJICAgIHx8IF9fZ2V0X3VzZXIoc2VjLCAmdHZwLT50dl9zZWMpCi0JCSAgICB8fCBfX2dldF91c2VyKHVzZWMsICZ0dnAtPnR2X3VzZWMpKSB7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJZ290byBvdXRfbm9mZHM7Ci0JCX0KLQotCQlyZXQgPSAtRUlOVkFMOwotCQlpZiAoc2VjIDwgMCB8fCB1c2VjIDwgMCkKLQkJCWdvdG8gb3V0X25vZmRzOwotCi0JCWlmICgodW5zaWduZWQgbG9uZykgc2VjIDwgTUFYX1NFTEVDVF9TRUNPTkRTKSB7Ci0JCQl0aW1lb3V0ID0gUk9VTkRfVVAodXNlYywgMTAwMDAwMC9IWik7Ci0JCQl0aW1lb3V0ICs9IHNlYyAqICh1bnNpZ25lZCBsb25nKSBIWjsKLQkJfQotCX0KLQogCXJldCA9IC1FSU5WQUw7CiAJaWYgKG4gPCAwKQogCQlnb3RvIG91dF9ub2ZkczsKQEAgLTM2MiwxOCArMzUwLDcgQEAKIAl6ZXJvX2ZkX3NldChuLCBmZHMucmVzX291dCk7CiAJemVyb19mZF9zZXQobiwgZmRzLnJlc19leCk7CiAKLQlyZXQgPSBkb19zZWxlY3QobiwgJmZkcywgJnRpbWVvdXQpOwotCi0JaWYgKHR2cCAmJiAhKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgU1RJQ0tZX1RJTUVPVVRTKSkgewotCQl0aW1lX3Qgc2VjID0gMCwgdXNlYyA9IDA7Ci0JCWlmICh0aW1lb3V0KSB7Ci0JCQlzZWMgPSB0aW1lb3V0IC8gSFo7Ci0JCQl1c2VjID0gdGltZW91dCAlIEhaOwotCQkJdXNlYyAqPSAoMTAwMDAwMC9IWik7Ci0JCX0KLQkJcHV0X3VzZXIoc2VjLCAmdHZwLT50dl9zZWMpOwotCQlwdXRfdXNlcih1c2VjLCAmdHZwLT50dl91c2VjKTsKLQl9CisJcmV0ID0gZG9fc2VsZWN0KG4sICZmZHMsIHRpbWVvdXQpOwogCiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwpAQCAtMzk1LDYgKzM3MiwxNTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCithc21saW5rYWdlIGxvbmcgc3lzX3NlbGVjdChpbnQgbiwgZmRfc2V0IF9fdXNlciAqaW5wLCBmZF9zZXQgX191c2VyICpvdXRwLAorCQkJZmRfc2V0IF9fdXNlciAqZXhwLCBzdHJ1Y3QgdGltZXZhbCBfX3VzZXIgKnR2cCkKK3sKKwlzNjQgdGltZW91dCA9IC0xOworCXN0cnVjdCB0aW1ldmFsIHR2OworCWludCByZXQ7CisKKwlpZiAodHZwKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdHYsIHR2cCwgc2l6ZW9mKHR2KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAodHYudHZfc2VjIDwgMCB8fCB0di50dl91c2VjIDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qIENhc3QgdG8gdTY0IHRvIG1ha2UgR0NDIHN0b3AgY29tcGxhaW5pbmcgKi8KKwkJaWYgKCh1NjQpdHYudHZfc2VjID49ICh1NjQpTUFYX0lOVDY0X1NFQ09ORFMpCisJCQl0aW1lb3V0ID0gLTE7CS8qIGluZmluaXRlICovCisJCWVsc2UgeworCQkJdGltZW91dCA9IFJPVU5EX1VQKHR2LnR2X3VzZWMsIFVTRUNfUEVSX1NFQy9IWik7CisJCQl0aW1lb3V0ICs9IHR2LnR2X3NlYyAqIEhaOworCQl9CisJfQorCisJcmV0ID0gY29yZV9zeXNfc2VsZWN0KG4sIGlucCwgb3V0cCwgZXhwLCAmdGltZW91dCk7CisKKwlpZiAodHZwKSB7CisJCWlmIChjdXJyZW50LT5wZXJzb25hbGl0eSAmIFNUSUNLWV9USU1FT1VUUykKKwkJCWdvdG8gc3RpY2t5OworCQl0di50dl91c2VjID0gamlmZmllc190b191c2Vjcyhkb19kaXYoKCoodTY0KikmdGltZW91dCksIEhaKSk7CisJCXR2LnR2X3NlYyA9IHRpbWVvdXQ7CisJCWlmIChjb3B5X3RvX3VzZXIodHZwLCAmdHYsIHNpemVvZih0dikpKSB7CitzdGlja3k6CisJCQkvKgorCQkJICogSWYgYW4gYXBwbGljYXRpb24gcHV0cyBpdHMgdGltZXZhbCBpbiByZWFkLW9ubHkKKwkJCSAqIG1lbW9yeSwgd2UgZG9uJ3Qgd2FudCB0aGUgTGludXgtc3BlY2lmaWMgdXBkYXRlIHRvCisJCQkgKiB0aGUgdGltZXZhbCB0byBjYXVzZSBhIGZhdWx0IGFmdGVyIHRoZSBzZWxlY3QgaGFzCisJCQkgKiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiBIb3dldmVyLCBiZWNhdXNlIHdlJ3JlIG5vdAorCQkJICogdXBkYXRpbmcgdGhlIHRpbWV2YWwsIHdlIGNhbid0IHJlc3RhcnQgdGhlIHN5c3RlbQorCQkJICogY2FsbC4KKwkJCSAqLworCQkJaWYgKHJldCA9PSAtRVJFU1RBUlROT0hBTkQpCisJCQkJcmV0ID0gLUVJTlRSOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIFRJRl9SRVNUT1JFX1NJR01BU0sKK2FzbWxpbmthZ2UgbG9uZyBzeXNfcHNlbGVjdDcoaW50IG4sIGZkX3NldCBfX3VzZXIgKmlucCwgZmRfc2V0IF9fdXNlciAqb3V0cCwKKwkJZmRfc2V0IF9fdXNlciAqZXhwLCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICp0c3AsCisJCWNvbnN0IHNpZ3NldF90IF9fdXNlciAqc2lnbWFzaywgc2l6ZV90IHNpZ3NldHNpemUpCit7CisJczY0IHRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwlzaWdzZXRfdCBrc2lnbWFzaywgc2lnc2F2ZWQ7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCWludCByZXQ7CisKKwlpZiAodHNwKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdHMsIHRzcCwgc2l6ZW9mKHRzKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAodHMudHZfc2VjIDwgMCB8fCB0cy50dl9uc2VjIDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qIENhc3QgdG8gdTY0IHRvIG1ha2UgR0NDIHN0b3AgY29tcGxhaW5pbmcgKi8KKwkJaWYgKCh1NjQpdHMudHZfc2VjID49ICh1NjQpTUFYX0lOVDY0X1NFQ09ORFMpCisJCQl0aW1lb3V0ID0gLTE7CS8qIGluZmluaXRlICovCisJCWVsc2UgeworCQkJdGltZW91dCA9IFJPVU5EX1VQKHRzLnR2X25zZWMsIE5TRUNfUEVSX1NFQy9IWik7CisJCQl0aW1lb3V0ICs9IHRzLnR2X3NlYyAqIEhaOworCQl9CisJfQorCisJaWYgKHNpZ21hc2spIHsKKwkJLyogWFhYOiBEb24ndCBwcmVjbHVkZSBoYW5kbGluZyBkaWZmZXJlbnQgc2l6ZWQgc2lnc2V0X3Qncy4gICovCisJCWlmIChzaWdzZXRzaXplICE9IHNpemVvZihzaWdzZXRfdCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZrc2lnbWFzaywgc2lnbWFzaywgc2l6ZW9mKGtzaWdtYXNrKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlzaWdkZWxzZXRtYXNrKCZrc2lnbWFzaywgc2lnbWFzayhTSUdLSUxMKXxzaWdtYXNrKFNJR1NUT1ApKTsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZrc2lnbWFzaywgJnNpZ3NhdmVkKTsKKwl9CisKKwlyZXQgPSBjb3JlX3N5c19zZWxlY3QobiwgaW5wLCBvdXRwLCBleHAsICZ0aW1lb3V0KTsKKworCWlmICh0c3ApIHsKKwkJaWYgKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgU1RJQ0tZX1RJTUVPVVRTKQorCQkJZ290byBzdGlja3k7CisJCXRzLnR2X25zZWMgPSBqaWZmaWVzX3RvX3VzZWNzKGRvX2RpdigoKih1NjQqKSZ0aW1lb3V0KSwgSFopKSAqIDEwMDA7CisJCXRzLnR2X3NlYyA9IHRpbWVvdXQ7CisJCWlmIChjb3B5X3RvX3VzZXIodHNwLCAmdHMsIHNpemVvZih0cykpKSB7CitzdGlja3k6CisJCQkvKgorCQkJICogSWYgYW4gYXBwbGljYXRpb24gcHV0cyBpdHMgdGltZXZhbCBpbiByZWFkLW9ubHkKKwkJCSAqIG1lbW9yeSwgd2UgZG9uJ3Qgd2FudCB0aGUgTGludXgtc3BlY2lmaWMgdXBkYXRlIHRvCisJCQkgKiB0aGUgdGltZXZhbCB0byBjYXVzZSBhIGZhdWx0IGFmdGVyIHRoZSBzZWxlY3QgaGFzCisJCQkgKiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiBIb3dldmVyLCBiZWNhdXNlIHdlJ3JlIG5vdAorCQkJICogdXBkYXRpbmcgdGhlIHRpbWV2YWwsIHdlIGNhbid0IHJlc3RhcnQgdGhlIHN5c3RlbQorCQkJICogY2FsbC4KKwkJCSAqLworCQkJaWYgKHJldCA9PSAtRVJFU1RBUlROT0hBTkQpCisJCQkJcmV0ID0gLUVJTlRSOworCQl9CisJfQorCisJaWYgKHJldCA9PSAtRVJFU1RBUlROT0hBTkQpIHsKKwkJLyoKKwkJICogRG9uJ3QgcmVzdG9yZSB0aGUgc2lnbmFsIG1hc2sgeWV0LiBMZXQgZG9fc2lnbmFsKCkgZGVsaXZlcgorCQkgKiB0aGUgc2lnbmFsIG9uIHRoZSB3YXkgYmFjayB0byB1c2Vyc3BhY2UsIGJlZm9yZSB0aGUgc2lnbmFsCisJCSAqIG1hc2sgaXMgcmVzdG9yZWQuCisJCSAqLworCQlpZiAoc2lnbWFzaykgeworCQkJbWVtY3B5KCZjdXJyZW50LT5zYXZlZF9zaWdtYXNrLCAmc2lnc2F2ZWQsCisJCQkJCXNpemVvZihzaWdzYXZlZCkpOworCQkJc2V0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOworCQl9CisJfSBlbHNlIGlmIChzaWdtYXNrKQorCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJnNpZ3NhdmVkLCBOVUxMKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBNb3N0IGFyY2hpdGVjdHVyZXMgY2FuJ3QgaGFuZGxlIDctYXJndW1lbnQgc3lzY2FsbHMuIFNvIHdlIHByb3ZpZGUgYQorICogNi1hcmd1bWVudCB2ZXJzaW9uIHdoZXJlIHRoZSBzaXh0aCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUKKyAqIHdoaWNoIGhhcyBhIHBvaW50ZXIgdG8gdGhlIHNpZ3NldF90IGl0c2VsZiBmb2xsb3dlZCBieSBhIHNpemVfdCBjb250YWluaW5nCisgKiB0aGUgc2lnc2V0IHNpemUuCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfcHNlbGVjdDYoaW50IG4sIGZkX3NldCBfX3VzZXIgKmlucCwgZmRfc2V0IF9fdXNlciAqb3V0cCwKKwlmZF9zZXQgX191c2VyICpleHAsIHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnRzcCwgdm9pZCBfX3VzZXIgKnNpZykKK3sKKwlzaXplX3Qgc2lnc2V0c2l6ZSA9IDA7CisJc2lnc2V0X3QgX191c2VyICp1cCA9IE5VTEw7CisKKwlpZiAoc2lnKSB7CisJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBzaWcsIHNpemVvZih2b2lkICopK3NpemVvZihzaXplX3QpKQorCQkgICAgfHwgX19nZXRfdXNlcih1cCwgKHNpZ3NldF90ICogX191c2VyICopc2lnKQorCQkgICAgfHwgX19nZXRfdXNlcihzaWdzZXRzaXplLAorCQkJCShzaXplX3QgKiBfX3VzZXIpKHNpZytzaXplb2Yodm9pZCAqKSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHN5c19wc2VsZWN0NyhuLCBpbnAsIG91dHAsIGV4cCwgdHNwLCB1cCwgc2lnc2V0c2l6ZSk7Cit9CisjZW5kaWYgLyogVElGX1JFU1RPUkVfU0lHTUFTSyAqLworCiBzdHJ1Y3QgcG9sbF9saXN0IHsKIAlzdHJ1Y3QgcG9sbF9saXN0ICpuZXh0OwogCWludCBsZW47CkBAIC00MzYsMTYgKzU2MSwxOSBAQAogfQogCiBzdGF0aWMgaW50IGRvX3BvbGwodW5zaWduZWQgaW50IG5mZHMsICBzdHJ1Y3QgcG9sbF9saXN0ICpsaXN0LAotCQkJc3RydWN0IHBvbGxfd3F1ZXVlcyAqd2FpdCwgbG9uZyB0aW1lb3V0KQorCQkgICBzdHJ1Y3QgcG9sbF93cXVldWVzICp3YWl0LCBzNjQgKnRpbWVvdXQpCiB7CiAJaW50IGNvdW50ID0gMDsKIAlwb2xsX3RhYmxlKiBwdCA9ICZ3YWl0LT5wdDsKIAotCWlmICghdGltZW91dCkKKwkvKiBPcHRpbWlzZSB0aGUgbm8td2FpdCBjYXNlICovCisJaWYgKCEoKnRpbWVvdXQpKQogCQlwdCA9IE5VTEw7CiAgCiAJZm9yICg7OykgewogCQlzdHJ1Y3QgcG9sbF9saXN0ICp3YWxrOworCQlsb25nIF9fdGltZW91dDsKKwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQl3YWxrID0gbGlzdDsKIAkJd2hpbGUod2FsayAhPSBOVUxMKSB7CkBAIC00NTMsMTggKzU4MSwzNiBAQAogCQkJd2FsayA9IHdhbGstPm5leHQ7CiAJCX0KIAkJcHQgPSBOVUxMOwotCQlpZiAoY291bnQgfHwgIXRpbWVvdXQgfHwgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCWlmIChjb3VudCB8fCAhKnRpbWVvdXQgfHwgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCQlicmVhazsKIAkJY291bnQgPSB3YWl0LT5lcnJvcjsKIAkJaWYgKGNvdW50KQogCQkJYnJlYWs7Ci0JCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCisJCWlmICgqdGltZW91dCA8IDApIHsKKwkJCS8qIFdhaXQgaW5kZWZpbml0ZWx5ICovCisJCQlfX3RpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwkJfSBlbHNlIGlmICh1bmxpa2VseSgqdGltZW91dCA+PSAoczY0KU1BWF9TQ0hFRFVMRV9USU1FT1VULTEpKSB7CisJCQkvKgorCQkJICogV2FpdCBmb3IgbG9uZ2VyIHRoYW4gTUFYX1NDSEVEVUxFX1RJTUVPVVQuIERvIGl0IGluCisJCQkgKiBhIGxvb3AKKwkJCSAqLworCQkJX190aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQgLSAxOworCQkJKnRpbWVvdXQgLT0gX190aW1lb3V0OworCQl9IGVsc2UgeworCQkJX190aW1lb3V0ID0gKnRpbWVvdXQ7CisJCQkqdGltZW91dCA9IDA7CisJCX0KKworCQlfX3RpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KF9fdGltZW91dCk7CisJCWlmICgqdGltZW91dCA+PSAwKQorCQkJKnRpbWVvdXQgKz0gX190aW1lb3V0OwogCX0KIAlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJcmV0dXJuIGNvdW50OwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3BvbGwoc3RydWN0IHBvbGxmZCBfX3VzZXIgKiB1ZmRzLCB1bnNpZ25lZCBpbnQgbmZkcywgbG9uZyB0aW1lb3V0KQoraW50IGRvX3N5c19wb2xsKHN0cnVjdCBwb2xsZmQgX191c2VyICp1ZmRzLCB1bnNpZ25lZCBpbnQgbmZkcywgczY0ICp0aW1lb3V0KQogewogCXN0cnVjdCBwb2xsX3dxdWV1ZXMgdGFibGU7CiAgCWludCBmZGNvdW50LCBlcnI7CkBAIC00ODIsMTQgKzYyOCw2IEBACiAJaWYgKG5mZHMgPiBtYXhfZmRzZXQgJiYgbmZkcyA+IE9QRU5fTUFYKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICh0aW1lb3V0KSB7Ci0JCS8qIENhcmVmdWwgYWJvdXQgb3ZlcmZsb3cgaW4gdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMgKi8KLQkJaWYgKCh1bnNpZ25lZCBsb25nKSB0aW1lb3V0IDwgTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWikKLQkJCXRpbWVvdXQgPSAodW5zaWduZWQgbG9uZykodGltZW91dCpIWis5OTkpLzEwMDArMTsKLQkJZWxzZSAvKiBOZWdhdGl2ZSBvciBvdmVyZmxvdyAqLwotCQkJdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOwotCX0KLQogCXBvbGxfaW5pdHdhaXQoJnRhYmxlKTsKIAogCWhlYWQgPSBOVUxMOwpAQCAtNTE5LDYgKzY1Nyw3IEBACiAJCX0KIAkJaSAtPSBwcC0+bGVuOwogCX0KKwogCWZkY291bnQgPSBkb19wb2xsKG5mZHMsIGhlYWQsICZ0YWJsZSwgdGltZW91dCk7CiAKIAkvKiBPSywgbm93IGNvcHkgdGhlIHJldmVudHMgZmllbGRzIGJhY2sgdG8gdXNlciBzcGFjZS4gKi8KQEAgLTU0NywzICs2ODYsOTggQEAKIAlwb2xsX2ZyZWV3YWl0KCZ0YWJsZSk7CiAJcmV0dXJuIGVycjsKIH0KKworYXNtbGlua2FnZSBsb25nIHN5c19wb2xsKHN0cnVjdCBwb2xsZmQgX191c2VyICp1ZmRzLCB1bnNpZ25lZCBpbnQgbmZkcywKKwkJCWxvbmcgdGltZW91dF9tc2VjcykKK3sKKwlzNjQgdGltZW91dF9qaWZmaWVzID0gMDsKKworCWlmICh0aW1lb3V0X21zZWNzKSB7CisjaWYgSFogPiAxMDAwCisJCS8qIFdlIGNhbiBvbmx5IG92ZXJmbG93IGlmIEhaID4gMTAwMCAqLworCQlpZiAodGltZW91dF9tc2VjcyAvIDEwMDAgPiAoczY0KTB4N2ZmZmZmZmZmZmZmZmZmZlVMTCAvIChzNjQpSFopCisJCQl0aW1lb3V0X2ppZmZpZXMgPSAtMTsKKwkJZWxzZQorI2VuZGlmCisJCQl0aW1lb3V0X2ppZmZpZXMgPSBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXRfbXNlY3MpOworCX0KKworCXJldHVybiBkb19zeXNfcG9sbCh1ZmRzLCBuZmRzLCAmdGltZW91dF9qaWZmaWVzKTsKK30KKworI2lmZGVmIFRJRl9SRVNUT1JFX1NJR01BU0sKK2FzbWxpbmthZ2UgbG9uZyBzeXNfcHBvbGwoc3RydWN0IHBvbGxmZCBfX3VzZXIgKnVmZHMsIHVuc2lnbmVkIGludCBuZmRzLAorCXN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnRzcCwgY29uc3Qgc2lnc2V0X3QgX191c2VyICpzaWdtYXNrLAorCXNpemVfdCBzaWdzZXRzaXplKQoreworCXNpZ3NldF90IGtzaWdtYXNrLCBzaWdzYXZlZDsKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJczY0IHRpbWVvdXQgPSAtMTsKKwlpbnQgcmV0OworCisJaWYgKHRzcCkgeworCQlpZiAoY29weV9mcm9tX3VzZXIoJnRzLCB0c3AsIHNpemVvZih0cykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJLyogQ2FzdCB0byB1NjQgdG8gbWFrZSBHQ0Mgc3RvcCBjb21wbGFpbmluZyAqLworCQlpZiAoKHU2NCl0cy50dl9zZWMgPj0gKHU2NClNQVhfSU5UNjRfU0VDT05EUykKKwkJCXRpbWVvdXQgPSAtMTsJLyogaW5maW5pdGUgKi8KKwkJZWxzZSB7CisJCQl0aW1lb3V0ID0gUk9VTkRfVVAodHMudHZfbnNlYywgTlNFQ19QRVJfU0VDL0haKTsKKwkJCXRpbWVvdXQgKz0gdHMudHZfc2VjICogSFo7CisJCX0KKwl9CisKKwlpZiAoc2lnbWFzaykgeworCQkvKiBYWFg6IERvbid0IHByZWNsdWRlIGhhbmRsaW5nIGRpZmZlcmVudCBzaXplZCBzaWdzZXRfdCdzLiAgKi8KKwkJaWYgKHNpZ3NldHNpemUgIT0gc2l6ZW9mKHNpZ3NldF90KSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmtzaWdtYXNrLCBzaWdtYXNrLCBzaXplb2Yoa3NpZ21hc2spKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXNpZ2RlbHNldG1hc2soJmtzaWdtYXNrLCBzaWdtYXNrKFNJR0tJTEwpfHNpZ21hc2soU0lHU1RPUCkpOworCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmtzaWdtYXNrLCAmc2lnc2F2ZWQpOworCX0KKworCXJldCA9IGRvX3N5c19wb2xsKHVmZHMsIG5mZHMsICZ0aW1lb3V0KTsKKworCS8qIFdlIGNhbiByZXN0YXJ0IHRoaXMgc3lzY2FsbCwgdXN1YWxseSAqLworCWlmIChyZXQgPT0gLUVJTlRSKSB7CisJCS8qCisJCSAqIERvbid0IHJlc3RvcmUgdGhlIHNpZ25hbCBtYXNrIHlldC4gTGV0IGRvX3NpZ25hbCgpIGRlbGl2ZXIKKwkJICogdGhlIHNpZ25hbCBvbiB0aGUgd2F5IGJhY2sgdG8gdXNlcnNwYWNlLCBiZWZvcmUgdGhlIHNpZ25hbAorCQkgKiBtYXNrIGlzIHJlc3RvcmVkLgorCQkgKi8KKwkJaWYgKHNpZ21hc2spIHsKKwkJCW1lbWNweSgmY3VycmVudC0+c2F2ZWRfc2lnbWFzaywgJnNpZ3NhdmVkLAorCQkJCQlzaXplb2Yoc2lnc2F2ZWQpKTsKKwkJCXNldF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwkJfQorCQlyZXQgPSAtRVJFU1RBUlROT0hBTkQ7CisJfSBlbHNlIGlmIChzaWdtYXNrKQorCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJnNpZ3NhdmVkLCBOVUxMKTsKKworCWlmICh0c3AgJiYgdGltZW91dCA+PSAwKSB7CisJCWlmIChjdXJyZW50LT5wZXJzb25hbGl0eSAmIFNUSUNLWV9USU1FT1VUUykKKwkJCWdvdG8gc3RpY2t5OworCQkvKiBZZXMsIHdlIGtub3cgaXQncyBhY3R1YWxseSBhbiBzNjQsIGJ1dCBpdCdzIGFsc28gcG9zaXRpdmUuICovCisJCXRzLnR2X25zZWMgPSBqaWZmaWVzX3RvX3VzZWNzKGRvX2RpdigoKih1NjQqKSZ0aW1lb3V0KSwgSFopKSAqIDEwMDA7CisJCXRzLnR2X3NlYyA9IHRpbWVvdXQ7CisJCWlmIChjb3B5X3RvX3VzZXIodHNwLCAmdHMsIHNpemVvZih0cykpKSB7CisJCXN0aWNreToKKwkJCS8qCisJCQkgKiBJZiBhbiBhcHBsaWNhdGlvbiBwdXRzIGl0cyB0aW1ldmFsIGluIHJlYWQtb25seQorCQkJICogbWVtb3J5LCB3ZSBkb24ndCB3YW50IHRoZSBMaW51eC1zcGVjaWZpYyB1cGRhdGUgdG8KKwkJCSAqIHRoZSB0aW1ldmFsIHRvIGNhdXNlIGEgZmF1bHQgYWZ0ZXIgdGhlIHNlbGVjdCBoYXMKKwkJCSAqIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIEhvd2V2ZXIsIGJlY2F1c2Ugd2UncmUgbm90CisJCQkgKiB1cGRhdGluZyB0aGUgdGltZXZhbCwgd2UgY2FuJ3QgcmVzdGFydCB0aGUgc3lzdGVtCisJCQkgKiBjYWxsLgorCQkJICovCisJCQlpZiAocmV0ID09IC1FUkVTVEFSVE5PSEFORCAmJiB0aW1lb3V0ID49IDApCisJCQkJcmV0ID0gLUVJTlRSOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZiAvKiBUSUZfUkVTVE9SRV9TSUdNQVNLICovCmRpZmYgLS1naXQgYS9mcy9zbWJmcy9NYWtlZmlsZSBiL2ZzL3NtYmZzL01ha2VmaWxlCmluZGV4IDkzMjQ2YjcuLjY2NzNlZTggMTAwNjQ0Ci0tLSBhL2ZzL3NtYmZzL01ha2VmaWxlCisrKyBiL2ZzL3NtYmZzL01ha2VmaWxlCkBAIC0xMyw3ICsxMyw2IEBACiBFWFRSQV9DRkxBR1MgKz0gLURTTUJGU19QQVJBTk9JQQogI0VYVFJBX0NGTEFHUyArPSAtRFNNQkZTX0RFQlVHCiAjRVhUUkFfQ0ZMQUdTICs9IC1EU01CRlNfREVCVUdfVkVSQk9TRQotI0VYVFJBX0NGTEFHUyArPSAtRERFQlVHX1NNQl9NQUxMT0MKICNFWFRSQV9DRkxBR1MgKz0gLURERUJVR19TTUJfVElNRVNUQU1QCiAjRVhUUkFfQ0ZMQUdTICs9IC1XZXJyb3IKIApkaWZmIC0tZ2l0IGEvZnMvc21iZnMvY2FjaGUuYyBiL2ZzL3NtYmZzL2NhY2hlLmMKaW5kZXggZjNlNmI4MS4uNzRiODZkOSAxMDA2NDQKLS0tIGEvZnMvc21iZnMvY2FjaGUuYworKysgYi9mcy9zbWJmcy9jYWNoZS5jCkBAIC02Niw3ICs2Niw3IEBACiAJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CiAJbmV4dCA9IHBhcmVudC0+ZF9zdWJkaXJzLm5leHQ7CiAJd2hpbGUgKG5leHQgIT0gJnBhcmVudC0+ZF9zdWJkaXJzKSB7Ci0JCWRlbnRyeSA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IGRlbnRyeSwgZF9jaGlsZCk7CisJCWRlbnRyeSA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IGRlbnRyeSwgZF91LmRfY2hpbGQpOwogCQlkZW50cnktPmRfZnNkYXRhID0gTlVMTDsKIAkJc21iX2FnZV9kZW50cnkoc2VydmVyLCBkZW50cnkpOwogCQluZXh0ID0gbmV4dC0+bmV4dDsKQEAgLTEwMCw3ICsxMDAsNyBAQAogCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOwogCW5leHQgPSBwYXJlbnQtPmRfc3ViZGlycy5uZXh0OwogCXdoaWxlIChuZXh0ICE9ICZwYXJlbnQtPmRfc3ViZGlycykgewotCQlkZW50ID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgZGVudHJ5LCBkX2NoaWxkKTsKKwkJZGVudCA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IGRlbnRyeSwgZF91LmRfY2hpbGQpOwogCQlpZiAoKHVuc2lnbmVkIGxvbmcpZGVudC0+ZF9mc2RhdGEgPT0gZnBvcykgewogCQkJaWYgKGRlbnQtPmRfaW5vZGUpCiAJCQkJZGdldF9sb2NrZWQoZGVudCk7CmRpZmYgLS1naXQgYS9mcy9zbWJmcy9maWxlLmMgYi9mcy9zbWJmcy9maWxlLmMKaW5kZXggYjRmY2ZhOC4uNzA0MmU2MiAxMDA2NDQKLS0tIGEvZnMvc21iZnMvZmlsZS5jCisrKyBiL2ZzL3NtYmZzL2ZpbGUuYwpAQCAtMjA5LDggKzIwOSw4IEBACiB7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CiAKLQlERUJVRzEoIiglcy8lcyAlZEAlbGQpXG4iLCBERU5UUllfUEFUSChkZW50cnkpLCAKLQkgICAgICAgY291bnQsIChwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKStvZmZzZXQpOworCURFQlVHMSgiKCVzLyVzICVkQCVsbGQpXG4iLCBERU5UUllfUEFUSChkZW50cnkpLCBjb3VudCwKKwkJKCh1bnNpZ25lZCBsb25nIGxvbmcpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyBvZmZzZXQpOwogCiAJcmV0dXJuIHNtYl93cml0ZXBhZ2Vfc3luYyhkZW50cnktPmRfaW5vZGUsIHBhZ2UsIG9mZnNldCwgY291bnQpOwogfQpAQCAtMzc0LDggKzM3NCw3IEBACiAJCS8qIFdlIG11c3QgZmx1c2ggYW55IGRpcnR5IHBhZ2VzIG5vdyBhcyB3ZSB3b24ndCBiZSBhYmxlIHRvCiAJCSAgIHdyaXRlIGFueXRoaW5nIGFmdGVyIGNsb3NlLiBtbWFwIGNhbiB0cmlnZ2VyIHRoaXMuCiAJCSAgICJvcGVuZXJzIiBzaG91bGQgcGVyaGFwcyBpbmNsdWRlIG1tYXAnZXJzIC4uLiAqLwotCQlmaWxlbWFwX2ZkYXRhd3JpdGUoaW5vZGUtPmlfbWFwcGluZyk7Ci0JCWZpbGVtYXBfZmRhdGF3YWl0KGlub2RlLT5pX21hcHBpbmcpOworCQlmaWxlbWFwX3dyaXRlX2FuZF93YWl0KGlub2RlLT5pX21hcHBpbmcpOwogCQlzbWJfY2xvc2UoaW5vZGUpOwogCX0KIAl1bmxvY2tfa2VybmVsKCk7CmRpZmYgLS1naXQgYS9mcy9zbWJmcy9pbm9kZS5jIGIvZnMvc21iZnMvaW5vZGUuYwppbmRleCAxMGI5OTQ0Li4wMmUzZTgyIDEwMDY0NAotLS0gYS9mcy9zbWJmcy9pbm9kZS5jCisrKyBiL2ZzL3NtYmZzL2lub2RlLmMKQEAgLTQ4NywxMSArNDg3LDExIEBACiAJaWYgKHNlcnZlci0+Y29ubl9waWQpCiAJCWtpbGxfcHJvYyhzZXJ2ZXItPmNvbm5fcGlkLCBTSUdURVJNLCAxKTsKIAotCXNtYl9rZnJlZShzZXJ2ZXItPm9wcyk7CisJa2ZyZWUoc2VydmVyLT5vcHMpOwogCXNtYl91bmxvYWRfbmxzKHNlcnZlcik7CiAJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CiAJc21iX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKLQlzbWJfa2ZyZWUoc2VydmVyKTsKKwlrZnJlZShzZXJ2ZXIpOwogfQogCiBzdGF0aWMgaW50IHNtYl9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnJhd19kYXRhLCBpbnQgc2lsZW50KQpAQCAtNTE5LDExICs1MTksMTAgQEAKIAlzYi0+c19vcCA9ICZzbWJfc29wczsKIAlzYi0+c190aW1lX2dyYW4gPSAxMDA7CiAKLQlzZXJ2ZXIgPSBzbWJfa21hbGxvYyhzaXplb2Yoc3RydWN0IHNtYl9zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJc2VydmVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNtYl9zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzZXJ2ZXIpCiAJCWdvdG8gb3V0X25vX3NlcnZlcjsKIAlzYi0+c19mc19pbmZvID0gc2VydmVyOwotCW1lbXNldChzZXJ2ZXIsIDAsIHNpemVvZihzdHJ1Y3Qgc21iX3NiX2luZm8pKTsKIAogCXNlcnZlci0+c3VwZXJfYmxvY2sgPSBzYjsKIAlzZXJ2ZXItPm1udCA9IE5VTEw7CkBAIC01NDIsOCArNTQxLDggQEAKIAkvKiBGSVhNRTogbW92ZSB0aGVzZSB0byB0aGUgc21iX3NiX2luZm8gc3RydWN0ICovCiAJVkVSQk9TRSgiYWxsb2MgY2h1bmsgPSAlZFxuIiwgc2l6ZW9mKHN0cnVjdCBzbWJfb3BzKSArCiAJCXNpemVvZihzdHJ1Y3Qgc21iX21vdW50X2RhdGFfa2VybmVsKSk7Ci0JbWVtID0gc21iX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbWJfb3BzKSArCi0JCQkgIHNpemVvZihzdHJ1Y3Qgc21iX21vdW50X2RhdGFfa2VybmVsKSwgR0ZQX0tFUk5FTCk7CisJbWVtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNtYl9vcHMpICsKKwkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbWJfbW91bnRfZGF0YV9rZXJuZWwpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1lbSkKIAkJZ290byBvdXRfbm9fbWVtOwogCkBAIC02MjEsMTIgKzYyMCwxMiBAQAogb3V0X25vX3NtYmlvZDoKIAlzbWJfdW5sb2FkX25scyhzZXJ2ZXIpOwogb3V0X2JhZF9vcHRpb246Ci0Jc21iX2tmcmVlKG1lbSk7CisJa2ZyZWUobWVtKTsKIG91dF9ub19tZW06CiAJaWYgKCFzZXJ2ZXItPm1udCkKIAkJcHJpbnRrKEtFUk5fRVJSICJzbWJfZmlsbF9zdXBlcjogYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKIAlzYi0+c19mc19pbmZvID0gTlVMTDsKLQlzbWJfa2ZyZWUoc2VydmVyKTsKKwlrZnJlZShzZXJ2ZXIpOwogCWdvdG8gb3V0X2ZhaWw7CiBvdXRfd3JvbmdfZGF0YToKIAlwcmludGsoS0VSTl9FUlIgInNtYmZzOiBtb3VudF9kYXRhIHZlcnNpb24gJWQgaXMgbm90IHN1cHBvcnRlZFxuIiwgdmVyKTsKQEAgLTY5Nyw4ICs2OTYsNyBAQAogCQkJREVOVFJZX1BBVEgoZGVudHJ5KSwKIAkJCShsb25nKSBpbm9kZS0+aV9zaXplLCAobG9uZykgYXR0ci0+aWFfc2l6ZSk7CiAKLQkJZmlsZW1hcF9mZGF0YXdyaXRlKGlub2RlLT5pX21hcHBpbmcpOwotCQlmaWxlbWFwX2ZkYXRhd2FpdChpbm9kZS0+aV9tYXBwaW5nKTsKKwkJZmlsZW1hcF93cml0ZV9hbmRfd2FpdChpbm9kZS0+aV9tYXBwaW5nKTsKIAogCQllcnJvciA9IHNtYl9vcGVuKGRlbnRyeSwgT19XUk9OTFkpOwogCQlpZiAoZXJyb3IpCkBAIC03ODMsMTIgKzc4MSw2IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi0jaWZkZWYgREVCVUdfU01CX01BTExPQwotaW50IHNtYl9tYWxsb2NlZDsKLWludCBzbWJfY3VycmVudF9rbWFsbG9jZWQ7Ci1pbnQgc21iX2N1cnJlbnRfdm1hbGxvY2VkOwotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNtYl9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCiAJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKIHsKQEAgLTgwOCwxMiArODAwLDYgQEAKIAlpbnQgZXJyOwogCURFQlVHMSgicmVnaXN0ZXJpbmcgLi4uXG4iKTsKIAotI2lmZGVmIERFQlVHX1NNQl9NQUxMT0MKLQlzbWJfbWFsbG9jZWQgPSAwOwotCXNtYl9jdXJyZW50X2ttYWxsb2NlZCA9IDA7Ci0Jc21iX2N1cnJlbnRfdm1hbGxvY2VkID0gMDsKLSNlbmRpZgotCiAJZXJyID0gaW5pdF9pbm9kZWNhY2hlKCk7CiAJaWYgKGVycikKIAkJZ290byBvdXRfaW5vZGU7CkBAIC04MzgsMTEgKzgyNCw2IEBACiAJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZzbWJfZnNfdHlwZSk7CiAJc21iX2Rlc3Ryb3lfcmVxdWVzdF9jYWNoZSgpOwogCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOwotI2lmZGVmIERFQlVHX1NNQl9NQUxMT0MKLQlwcmludGsoS0VSTl9ERUJVRyAic21iX21hbGxvY2VkOiAlZFxuIiwgc21iX21hbGxvY2VkKTsKLQlwcmludGsoS0VSTl9ERUJVRyAic21iX2N1cnJlbnRfa21hbGxvY2VkOiAlZFxuIixzbWJfY3VycmVudF9rbWFsbG9jZWQpOwotCXByaW50ayhLRVJOX0RFQlVHICJzbWJfY3VycmVudF92bWFsbG9jZWQ6ICVkXG4iLHNtYl9jdXJyZW50X3ZtYWxsb2NlZCk7Ci0jZW5kaWYKIH0KIAogbW9kdWxlX2luaXQoaW5pdF9zbWJfZnMpCmRpZmYgLS1naXQgYS9mcy9zbWJmcy9wcm9jLmMgYi9mcy9zbWJmcy9wcm9jLmMKaW5kZXggMzhhYjU1OC4uYjFiODc4YiAxMDA2NDQKLS0tIGEvZnMvc21iZnMvcHJvYy5jCisrKyBiL2ZzL3NtYmZzL3Byb2MuYwpAQCAtOCw2ICs4LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KQEAgLTMxMTMsNyArMzExNCw3IEBACiAJTFNFVChkYXRhLCAzMiwgU01CX1RJTUVfTk9fQ0hBTkdFKTsKIAlMU0VUKGRhdGEsIDQwLCBTTUJfVUlEX05PX0NIQU5HRSk7CiAJTFNFVChkYXRhLCA0OCwgU01CX0dJRF9OT19DSEFOR0UpOwotCUxTRVQoZGF0YSwgNTYsIHNtYl9maWxldHlwZV9mcm9tX21vZGUoYXR0ci0+aWFfbW9kZSkpOworCURTRVQoZGF0YSwgNTYsIHNtYl9maWxldHlwZV9mcm9tX21vZGUoYXR0ci0+aWFfbW9kZSkpOwogCUxTRVQoZGF0YSwgNjAsIG1ham9yKTsKIAlMU0VUKGRhdGEsIDY4LCBtaW5vcik7CiAJTFNFVChkYXRhLCA3NiwgMCk7CmRpZmYgLS1naXQgYS9mcy9zbWJmcy9yZXF1ZXN0LmMgYi9mcy9zbWJmcy9yZXF1ZXN0LmMKaW5kZXggYTBmMjk2ZC4uYzcxYzM3NSAxMDA2NDQKLS0tIGEvZnMvc21iZnMvcmVxdWVzdC5jCisrKyBiL2ZzL3NtYmZzL3JlcXVlc3QuYwpAQCAtNjgsNyArNjgsNyBAQAogCQlnb3RvIG91dDsKIAogCWlmIChidWZzaXplID4gMCkgewotCQlidWYgPSBzbWJfa21hbGxvYyhidWZzaXplLCBHRlBfTk9GUyk7CisJCWJ1ZiA9IGttYWxsb2MoYnVmc2l6ZSwgR0ZQX05PRlMpOwogCQlpZiAoIWJ1ZikgewogCQkJa21lbV9jYWNoZV9mcmVlKHJlcV9jYWNoZXAsIHJlcSk7CiAJCQlyZXR1cm4gTlVMTDsKQEAgLTEyNCw5ICsxMjQsOCBAQAogewogCWF0b21pY19kZWMoJnJlcS0+cnFfc2VydmVyLT5ucl9yZXF1ZXN0cyk7CiAJaWYgKHJlcS0+cnFfYnVmZmVyICYmICEocmVxLT5ycV9mbGFncyAmIFNNQl9SRVFfU1RBVElDKSkKLQkJc21iX2tmcmVlKHJlcS0+cnFfYnVmZmVyKTsKLQlpZiAocmVxLT5ycV90cmFuczJidWZmZXIpCi0JCXNtYl9rZnJlZShyZXEtPnJxX3RyYW5zMmJ1ZmZlcik7CisJCWtmcmVlKHJlcS0+cnFfYnVmZmVyKTsKKwlrZnJlZShyZXEtPnJxX3RyYW5zMmJ1ZmZlcik7CiAJa21lbV9jYWNoZV9mcmVlKHJlcV9jYWNoZXAsIHJlcSk7CiB9CiAKQEAgLTE4Myw4ICsxODIsNyBAQAogCXJlcS0+cnFfZXJyID0gMDsKIAlyZXEtPnJxX2Vycm5vID0gMDsKIAlyZXEtPnJxX2ZyYWdtZW50ID0gMDsKLQlpZiAocmVxLT5ycV90cmFuczJidWZmZXIpCi0JCXNtYl9rZnJlZShyZXEtPnJxX3RyYW5zMmJ1ZmZlcik7CisJa2ZyZWUocmVxLT5ycV90cmFuczJidWZmZXIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NDcsMTAgKzY0NSw5IEBACiAJCQlnb3RvIG91dF90b29fbG9uZzsKIAogCQlyZXEtPnJxX3RyYW5zMmJ1ZnNpemUgPSBidWZfbGVuOwotCQlyZXEtPnJxX3RyYW5zMmJ1ZmZlciA9IHNtYl9rbWFsbG9jKGJ1Zl9sZW4sIEdGUF9OT0ZTKTsKKwkJcmVxLT5ycV90cmFuczJidWZmZXIgPSBremFsbG9jKGJ1Zl9sZW4sIEdGUF9OT0ZTKTsKIAkJaWYgKCFyZXEtPnJxX3RyYW5zMmJ1ZmZlcikKIAkJCWdvdG8gb3V0X25vX21lbTsKLQkJbWVtc2V0KHJlcS0+cnFfdHJhbnMyYnVmZmVyLCAwLCBidWZfbGVuKTsKIAogCQlyZXEtPnJxX3Bhcm0gPSByZXEtPnJxX3RyYW5zMmJ1ZmZlcjsKIAkJcmVxLT5ycV9kYXRhID0gcmVxLT5ycV90cmFuczJidWZmZXIgKyBwYXJtX3RvdDsKZGlmZiAtLWdpdCBhL2ZzL3N0YXQuYyBiL2ZzL3N0YXQuYwppbmRleCBiOGEwZTUxLi4yNDIxMWIwIDEwMDY0NAotLS0gYS9mcy9zdGF0LmMKKysrIGIvZnMvc3RhdC5jCkBAIC02MywxMiArNjMsMTIgQEAKIAogRVhQT1JUX1NZTUJPTCh2ZnNfZ2V0YXR0cik7CiAKLWludCB2ZnNfc3RhdChjaGFyIF9fdXNlciAqbmFtZSwgc3RydWN0IGtzdGF0ICpzdGF0KQoraW50IHZmc19zdGF0X2ZkKGludCBkZmQsIGNoYXIgX191c2VyICpuYW1lLCBzdHJ1Y3Qga3N0YXQgKnN0YXQpCiB7CiAJc3RydWN0IG5hbWVpZGF0YSBuZDsKIAlpbnQgZXJyb3I7CiAKLQllcnJvciA9IHVzZXJfcGF0aF93YWxrKG5hbWUsICZuZCk7CisJZXJyb3IgPSBfX3VzZXJfd2Fsa19mZChkZmQsIG5hbWUsIExPT0tVUF9GT0xMT1csICZuZCk7CiAJaWYgKCFlcnJvcikgewogCQllcnJvciA9IHZmc19nZXRhdHRyKG5kLm1udCwgbmQuZGVudHJ5LCBzdGF0KTsKIAkJcGF0aF9yZWxlYXNlKCZuZCk7CkBAIC03NiwxNCArNzYsMTkgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKK2ludCB2ZnNfc3RhdChjaGFyIF9fdXNlciAqbmFtZSwgc3RydWN0IGtzdGF0ICpzdGF0KQoreworCXJldHVybiB2ZnNfc3RhdF9mZChBVF9GRENXRCwgbmFtZSwgc3RhdCk7Cit9CisKIEVYUE9SVF9TWU1CT0wodmZzX3N0YXQpOwogCi1pbnQgdmZzX2xzdGF0KGNoYXIgX191c2VyICpuYW1lLCBzdHJ1Y3Qga3N0YXQgKnN0YXQpCitpbnQgdmZzX2xzdGF0X2ZkKGludCBkZmQsIGNoYXIgX191c2VyICpuYW1lLCBzdHJ1Y3Qga3N0YXQgKnN0YXQpCiB7CiAJc3RydWN0IG5hbWVpZGF0YSBuZDsKIAlpbnQgZXJyb3I7CiAKLQllcnJvciA9IHVzZXJfcGF0aF93YWxrX2xpbmsobmFtZSwgJm5kKTsKKwllcnJvciA9IF9fdXNlcl93YWxrX2ZkKGRmZCwgbmFtZSwgMCwgJm5kKTsKIAlpZiAoIWVycm9yKSB7CiAJCWVycm9yID0gdmZzX2dldGF0dHIobmQubW50LCBuZC5kZW50cnksIHN0YXQpOwogCQlwYXRoX3JlbGVhc2UoJm5kKTsKQEAgLTkxLDYgKzk2LDExIEBACiAJcmV0dXJuIGVycm9yOwogfQogCitpbnQgdmZzX2xzdGF0KGNoYXIgX191c2VyICpuYW1lLCBzdHJ1Y3Qga3N0YXQgKnN0YXQpCit7CisJcmV0dXJuIHZmc19sc3RhdF9mZChBVF9GRENXRCwgbmFtZSwgc3RhdCk7Cit9CisKIEVYUE9SVF9TWU1CT0wodmZzX2xzdGF0KTsKIAogaW50IHZmc19mc3RhdCh1bnNpZ25lZCBpbnQgZmQsIHN0cnVjdCBrc3RhdCAqc3RhdCkKQEAgLTE1MSw3ICsxNjEsNyBAQAogYXNtbGlua2FnZSBsb25nIHN5c19zdGF0KGNoYXIgX191c2VyICogZmlsZW5hbWUsIHN0cnVjdCBfX29sZF9rZXJuZWxfc3RhdCBfX3VzZXIgKiBzdGF0YnVmKQogewogCXN0cnVjdCBrc3RhdCBzdGF0OwotCWludCBlcnJvciA9IHZmc19zdGF0KGZpbGVuYW1lLCAmc3RhdCk7CisJaW50IGVycm9yID0gdmZzX3N0YXRfZmQoQVRfRkRDV0QsIGZpbGVuYW1lLCAmc3RhdCk7CiAKIAlpZiAoIWVycm9yKQogCQllcnJvciA9IGNwX29sZF9zdGF0KCZzdGF0LCBzdGF0YnVmKTsKQEAgLTE2MSw3ICsxNzEsNyBAQAogYXNtbGlua2FnZSBsb25nIHN5c19sc3RhdChjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCBzdHJ1Y3QgX19vbGRfa2VybmVsX3N0YXQgX191c2VyICogc3RhdGJ1ZikKIHsKIAlzdHJ1Y3Qga3N0YXQgc3RhdDsKLQlpbnQgZXJyb3IgPSB2ZnNfbHN0YXQoZmlsZW5hbWUsICZzdGF0KTsKKwlpbnQgZXJyb3IgPSB2ZnNfbHN0YXRfZmQoQVRfRkRDV0QsIGZpbGVuYW1lLCAmc3RhdCk7CiAKIAlpZiAoIWVycm9yKQogCQllcnJvciA9IGNwX29sZF9zdGF0KCZzdGF0LCBzdGF0YnVmKTsKQEAgLTIyOSwyNyArMjM5LDUwIEBACiAJcmV0dXJuIGNvcHlfdG9fdXNlcihzdGF0YnVmLCZ0bXAsc2l6ZW9mKHRtcCkpID8gLUVGQVVMVCA6IDA7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfbmV3c3RhdChjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCBzdHJ1Y3Qgc3RhdCBfX3VzZXIgKiBzdGF0YnVmKQorYXNtbGlua2FnZSBsb25nIHN5c19uZXdzdGF0KGNoYXIgX191c2VyICpmaWxlbmFtZSwgc3RydWN0IHN0YXQgX191c2VyICpzdGF0YnVmKQogewogCXN0cnVjdCBrc3RhdCBzdGF0OwotCWludCBlcnJvciA9IHZmc19zdGF0KGZpbGVuYW1lLCAmc3RhdCk7CisJaW50IGVycm9yID0gdmZzX3N0YXRfZmQoQVRfRkRDV0QsIGZpbGVuYW1lLCAmc3RhdCk7CiAKIAlpZiAoIWVycm9yKQogCQllcnJvciA9IGNwX25ld19zdGF0KCZzdGF0LCBzdGF0YnVmKTsKIAogCXJldHVybiBlcnJvcjsKIH0KLWFzbWxpbmthZ2UgbG9uZyBzeXNfbmV3bHN0YXQoY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgc3RydWN0IHN0YXQgX191c2VyICogc3RhdGJ1ZikKKworYXNtbGlua2FnZSBsb25nIHN5c19uZXdsc3RhdChjaGFyIF9fdXNlciAqZmlsZW5hbWUsIHN0cnVjdCBzdGF0IF9fdXNlciAqc3RhdGJ1ZikKIHsKIAlzdHJ1Y3Qga3N0YXQgc3RhdDsKLQlpbnQgZXJyb3IgPSB2ZnNfbHN0YXQoZmlsZW5hbWUsICZzdGF0KTsKKwlpbnQgZXJyb3IgPSB2ZnNfbHN0YXRfZmQoQVRfRkRDV0QsIGZpbGVuYW1lLCAmc3RhdCk7CiAKIAlpZiAoIWVycm9yKQogCQllcnJvciA9IGNwX25ld19zdGF0KCZzdGF0LCBzdGF0YnVmKTsKIAogCXJldHVybiBlcnJvcjsKIH0KLWFzbWxpbmthZ2UgbG9uZyBzeXNfbmV3ZnN0YXQodW5zaWduZWQgaW50IGZkLCBzdHJ1Y3Qgc3RhdCBfX3VzZXIgKiBzdGF0YnVmKQorCithc21saW5rYWdlIGxvbmcgc3lzX25ld2ZzdGF0YXQoaW50IGRmZCwgY2hhciBfX3VzZXIgKmZpbGVuYW1lLAorCQkJCXN0cnVjdCBzdGF0IF9fdXNlciAqc3RhdGJ1ZiwgaW50IGZsYWcpCit7CisJc3RydWN0IGtzdGF0IHN0YXQ7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKworCWlmICgoZmxhZyAmIH5BVF9TWU1MSU5LX05PRk9MTE9XKSAhPSAwKQorCQlnb3RvIG91dDsKKworCWlmIChmbGFnICYgQVRfU1lNTElOS19OT0ZPTExPVykKKwkJZXJyb3IgPSB2ZnNfbHN0YXRfZmQoZGZkLCBmaWxlbmFtZSwgJnN0YXQpOworCWVsc2UKKwkJZXJyb3IgPSB2ZnNfc3RhdF9mZChkZmQsIGZpbGVuYW1lLCAmc3RhdCk7CisKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IGNwX25ld19zdGF0KCZzdGF0LCBzdGF0YnVmKTsKKworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19uZXdmc3RhdCh1bnNpZ25lZCBpbnQgZmQsIHN0cnVjdCBzdGF0IF9fdXNlciAqc3RhdGJ1ZikKIHsKIAlzdHJ1Y3Qga3N0YXQgc3RhdDsKIAlpbnQgZXJyb3IgPSB2ZnNfZnN0YXQoZmQsICZzdGF0KTsKQEAgLTI2MCw3ICsyOTMsOCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19yZWFkbGluayhjb25zdCBjaGFyIF9fdXNlciAqIHBhdGgsIGNoYXIgX191c2VyICogYnVmLCBpbnQgYnVmc2l6KQorYXNtbGlua2FnZSBsb25nIHN5c19yZWFkbGlua2F0KGludCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICpwYXRoLAorCQkJCWNoYXIgX191c2VyICpidWYsIGludCBidWZzaXopCiB7CiAJc3RydWN0IG5hbWVpZGF0YSBuZDsKIAlpbnQgZXJyb3I7CkBAIC0yNjgsNyArMzAyLDcgQEAKIAlpZiAoYnVmc2l6IDw9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZXJyb3IgPSB1c2VyX3BhdGhfd2Fsa19saW5rKHBhdGgsICZuZCk7CisJZXJyb3IgPSBfX3VzZXJfd2Fsa19mZChkZmQsIHBhdGgsIDAsICZuZCk7CiAJaWYgKCFlcnJvcikgewogCQlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IG5kLmRlbnRyeS0+ZF9pbm9kZTsKIApAQCAtMjg1LDYgKzMxOSwxMiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAorYXNtbGlua2FnZSBsb25nIHN5c19yZWFkbGluayhjb25zdCBjaGFyIF9fdXNlciAqcGF0aCwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQlpbnQgYnVmc2l6KQoreworCXJldHVybiBzeXNfcmVhZGxpbmthdChBVF9GRENXRCwgcGF0aCwgYnVmLCBidWZzaXopOworfQorCiAKIC8qIC0tLS0tLS0tLS0gTEZTLTY0IC0tLS0tLS0tLS0tICovCiAjaWZkZWYgX19BUkNIX1dBTlRfU1RBVDY0CmRpZmYgLS1naXQgYS9mcy9zdXBlci5jIGIvZnMvc3VwZXIuYwppbmRleCA1YTM0N2E0Zi4uYzE3N2I5MiAxMDA2NDQKLS0tIGEvZnMvc3VwZXIuYworKysgYi9mcy9zdXBlci5jCkBAIC03Miw3ICs3Miw3IEBACiAJCUlOSVRfSExJU1RfSEVBRCgmcy0+c19hbm9uKTsKIAkJSU5JVF9MSVNUX0hFQUQoJnMtPnNfaW5vZGVzKTsKIAkJaW5pdF9yd3NlbSgmcy0+c191bW91bnQpOwotCQlzZW1hX2luaXQoJnMtPnNfbG9jaywgMSk7CisJCW11dGV4X2luaXQoJnMtPnNfbG9jayk7CiAJCWRvd25fd3JpdGUoJnMtPnNfdW1vdW50KTsKIAkJcy0+c19jb3VudCA9IFNfQklBUzsKIAkJYXRvbWljX3NldCgmcy0+c19hY3RpdmUsIDEpOwpAQCAtNzAwLDggKzcwMCw3IEBACiAKIAkJcy0+c19mbGFncyA9IGZsYWdzOwogCQlzdHJsY3B5KHMtPnNfaWQsIGJkZXZuYW1lKGJkZXYsIGIpLCBzaXplb2Yocy0+c19pZCkpOwotCQlzLT5zX29sZF9ibG9ja3NpemUgPSBibG9ja19zaXplKGJkZXYpOwotCQlzYl9zZXRfYmxvY2tzaXplKHMsIHMtPnNfb2xkX2Jsb2Nrc2l6ZSk7CisJCXNiX3NldF9ibG9ja3NpemUocywgYmxvY2tfc2l6ZShiZGV2KSk7CiAJCWVycm9yID0gZmlsbF9zdXBlcihzLCBkYXRhLCBmbGFncyAmIE1TX1ZFUkJPU0UgPyAxIDogMCk7CiAJCWlmIChlcnJvcikgewogCQkJdXBfd3JpdGUoJnMtPnNfdW1vdW50KTsKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL2Rpci5jIGIvZnMvc3lzZnMvZGlyLmMKaW5kZXggZDM2NzgwMy4uNDliZDIxOSAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvZGlyLmMKKysrIGIvZnMvc3lzZnMvZGlyLmMKQEAgLTk5LDcgKzk5LDcgQEAKIAlpbnQgZXJyb3I7CiAJdW1vZGVfdCBtb2RlID0gU19JRkRJUnwgU19JUldYVSB8IFNfSVJVR08gfCBTX0lYVUdPOwogCi0JZG93bigmcC0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJnAtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCSpkID0gbG9va3VwX29uZV9sZW4obiwgcCwgc3RybGVuKG4pKTsKIAlpZiAoIUlTX0VSUigqZCkpIHsKIAkJZXJyb3IgPSBzeXNmc19tYWtlX2RpcmVudChwLT5kX2ZzZGF0YSwgKmQsIGssIG1vZGUsIFNZU0ZTX0RJUik7CkBAIC0xMjIsNyArMTIyLDcgQEAKIAkJZHB1dCgqZCk7CiAJfSBlbHNlCiAJCWVycm9yID0gUFRSX0VSUigqZCk7Ci0JdXAoJnAtPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJnAtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMjQ2LDcgKzI0Niw3IEBACiAJc3RydWN0IGRlbnRyeSAqIHBhcmVudCA9IGRnZXQoZC0+ZF9wYXJlbnQpOwogCXN0cnVjdCBzeXNmc19kaXJlbnQgKiBzZDsKIAotCWRvd24oJnBhcmVudC0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJZF9kZWxldGUoZCk7CiAJc2QgPSBkLT5kX2ZzZGF0YTsKICAJbGlzdF9kZWxfaW5pdCgmc2QtPnNfc2libGluZyk7CkBAIC0yNTcsNyArMjU3LDcgQEAKIAlwcl9kZWJ1ZygiIG8gJXMgcmVtb3ZpbmcgZG9uZSAoJWQpXG4iLGQtPmRfbmFtZS5uYW1lLAogCQkgYXRvbWljX3JlYWQoJmQtPmRfY291bnQpKTsKIAotCXVwKCZwYXJlbnQtPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJZHB1dChwYXJlbnQpOwogfQogCkBAIC0yODYsNyArMjg2LDcgQEAKIAkJcmV0dXJuOwogCiAJcHJfZGVidWcoInN5c2ZzICVzOiByZW1vdmluZyBkaXJcbiIsZGVudHJ5LT5kX25hbWUubmFtZSk7Ci0JZG93bigmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAlwYXJlbnRfc2QgPSBkZW50cnktPmRfZnNkYXRhOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzZCwgdG1wLCAmcGFyZW50X3NkLT5zX2NoaWxkcmVuLCBzX3NpYmxpbmcpIHsKIAkJaWYgKCFzZC0+c19lbGVtZW50IHx8ICEoc2QtPnNfdHlwZSAmIFNZU0ZTX05PVF9QSU5ORUQpKQpAQCAtMjk1LDcgKzI5NSw3IEBACiAJCXN5c2ZzX2Ryb3BfZGVudHJ5KHNkLCBkZW50cnkpOwogCQlzeXNmc19wdXQoc2QpOwogCX0KLQl1cCgmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCiAJcmVtb3ZlX2RpcihkZW50cnkpOwogCS8qKgpAQCAtMzE4LDcgKzMxOCw3IEBACiAJZG93bl93cml0ZSgmc3lzZnNfcmVuYW1lX3NlbSk7CiAJcGFyZW50ID0ga29iai0+cGFyZW50LT5kZW50cnk7CiAKLQlkb3duKCZwYXJlbnQtPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZwYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCiAJbmV3X2RlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKG5ld19uYW1lLCBwYXJlbnQsIHN0cmxlbihuZXdfbmFtZSkpOwogCWlmICghSVNfRVJSKG5ld19kZW50cnkpKSB7CkBAIC0zMzQsNyArMzM0LDcgQEAKIAkJCWVycm9yID0gLUVFWElTVDsKIAkJZHB1dChuZXdfZGVudHJ5KTsKIAl9Ci0JdXAoJnBhcmVudC0+ZF9pbm9kZS0+aV9zZW0pOwkKKwltdXRleF91bmxvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJdXBfd3JpdGUoJnN5c2ZzX3JlbmFtZV9zZW0pOwogCiAJcmV0dXJuIGVycm9yOwpAQCAtMzQ1LDkgKzM0NSw5IEBACiAJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OwogCXN0cnVjdCBzeXNmc19kaXJlbnQgKiBwYXJlbnRfc2QgPSBkZW50cnktPmRfZnNkYXRhOwogCi0JZG93bigmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBzeXNmc19uZXdfZGlyZW50KHBhcmVudF9zZCwgTlVMTCk7Ci0JdXAoJmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAogCXJldHVybiBmaWxlLT5wcml2YXRlX2RhdGEgPyAwIDogLUVOT01FTTsKIApAQCAtMzU4LDkgKzM1OCw5IEBACiAJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OwogCXN0cnVjdCBzeXNmc19kaXJlbnQgKiBjdXJzb3IgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKLQlkb3duKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCWxpc3RfZGVsX2luaXQoJmN1cnNvci0+c19zaWJsaW5nKTsKLQl1cCgmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCiAJcmVsZWFzZV9zeXNmc19kaXJlbnQoY3Vyc29yKTsKIApAQCAtNDM2LDcgKzQzNiw3IEBACiB7CiAJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OwogCi0JZG93bigmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAlzd2l0Y2ggKG9yaWdpbikgewogCQljYXNlIDE6CiAJCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7CkBAIC00NDQsNyArNDQ0LDcgQEAKIAkJCWlmIChvZmZzZXQgPj0gMCkKIAkJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXVwKCZmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKG9mZnNldCAhPSBmaWxlLT5mX3BvcykgewpAQCAtNDY4LDcgKzQ2OCw3IEBACiAJCQlsaXN0X2FkZF90YWlsKCZjdXJzb3ItPnNfc2libGluZywgcCk7CiAJCX0KIAl9Ci0JdXAoJmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gb2Zmc2V0OwogfQogCkBAIC00ODMsNCArNDgzLDMgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHN5c2ZzX2NyZWF0ZV9kaXIpOwogRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfcmVtb3ZlX2Rpcik7CiBFWFBPUlRfU1lNQk9MX0dQTChzeXNmc19yZW5hbWVfZGlyKTsKLQpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZmlsZS5jIGIvZnMvc3lzZnMvZmlsZS5jCmluZGV4IDQwMTNkNzkuLmQwZTNkODQgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL2ZpbGUuYworKysgYi9mcy9zeXNmcy9maWxlLmMKQEAgLTM2NCw5ICszNjQsOSBAQAogCXVtb2RlX3QgbW9kZSA9IChhdHRyLT5tb2RlICYgU19JQUxMVUdPKSB8IFNfSUZSRUc7CiAJaW50IGVycm9yID0gMDsKIAotCWRvd24oJmRpci0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmRpci0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJZXJyb3IgPSBzeXNmc19tYWtlX2RpcmVudChwYXJlbnRfc2QsIE5VTEwsICh2b2lkICopIGF0dHIsIG1vZGUsIHR5cGUpOwotCXVwKCZkaXItPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmRpci0+ZF9pbm9kZS0+aV9tdXRleCk7CiAKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0zOTgsNyArMzk4LDcgQEAKIAlzdHJ1Y3QgZGVudHJ5ICogdmljdGltOwogCWludCByZXMgPSAtRU5PRU5UOwogCi0JZG93bigmZGlyLT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmZGlyLT5kX2lub2RlLT5pX211dGV4KTsKIAl2aWN0aW0gPSBsb29rdXBfb25lX2xlbihhdHRyLT5uYW1lLCBkaXIsIHN0cmxlbihhdHRyLT5uYW1lKSk7CiAJaWYgKCFJU19FUlIodmljdGltKSkgewogCQkvKiBtYWtlIHN1cmUgZGVudHJ5IGlzIHJlYWxseSB0aGVyZSAqLwpAQCAtNDIwLDcgKzQyMCw3IEBACiAJCSAqLwogCQlkcHV0KHZpY3RpbSk7CiAJfQotCXVwKCZkaXItPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmRpci0+ZF9pbm9kZS0+aV9tdXRleCk7CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtNDQxLDIyICs0NDEsMjIgQEAKIAlzdHJ1Y3QgaWF0dHIgbmV3YXR0cnM7CiAJaW50IHJlcyA9IC1FTk9FTlQ7CiAKLQlkb3duKCZkaXItPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZkaXItPmRfaW5vZGUtPmlfbXV0ZXgpOwogCXZpY3RpbSA9IGxvb2t1cF9vbmVfbGVuKGF0dHItPm5hbWUsIGRpciwgc3RybGVuKGF0dHItPm5hbWUpKTsKIAlpZiAoIUlTX0VSUih2aWN0aW0pKSB7CiAJCWlmICh2aWN0aW0tPmRfaW5vZGUgJiYKIAkJICAgICh2aWN0aW0tPmRfcGFyZW50LT5kX2lub2RlID09IGRpci0+ZF9pbm9kZSkpIHsKIAkJCWlub2RlID0gdmljdGltLT5kX2lub2RlOwotCQkJZG93bigmaW5vZGUtPmlfc2VtKTsKKwkJCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAkJCW5ld2F0dHJzLmlhX21vZGUgPSAobW9kZSAmIFNfSUFMTFVHTykgfAogCQkJCQkJKGlub2RlLT5pX21vZGUgJiB+U19JQUxMVUdPKTsKIAkJCW5ld2F0dHJzLmlhX3ZhbGlkID0gQVRUUl9NT0RFIHwgQVRUUl9DVElNRTsKIAkJCXJlcyA9IG5vdGlmeV9jaGFuZ2UodmljdGltLCAmbmV3YXR0cnMpOwotCQkJdXAoJmlub2RlLT5pX3NlbSk7CisJCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAkJfQogCQlkcHV0KHZpY3RpbSk7CiAJfQotCXVwKCZkaXItPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmRpci0+ZF9pbm9kZS0+aV9tdXRleCk7CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtNDgwLDQgKzQ4MCwzIEBACiBFWFBPUlRfU1lNQk9MX0dQTChzeXNmc19jcmVhdGVfZmlsZSk7CiBFWFBPUlRfU1lNQk9MX0dQTChzeXNmc19yZW1vdmVfZmlsZSk7CiBFWFBPUlRfU1lNQk9MX0dQTChzeXNmc191cGRhdGVfZmlsZSk7Ci0KZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL2lub2RlLmMgYi9mcy9zeXNmcy9pbm9kZS5jCmluZGV4IDk3MGEzM2YuLjY4OWY3YmMgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL2lub2RlLmMKKysrIGIvZnMvc3lzZnMvaW5vZGUuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgInN5c2ZzLmgiCiAKIGV4dGVybiBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzeXNmc19zYjsKQEAgLTIwMSw3ICsyMDIsNyBAQAogCiAvKgogICogVW5oYXNoZXMgdGhlIGRlbnRyeSBjb3JyZXNwb25kaW5nIHRvIGdpdmVuIHN5c2ZzX2RpcmVudAotICogQ2FsbGVkIHdpdGggcGFyZW50IGlub2RlJ3MgaV9zZW0gaGVsZC4KKyAqIENhbGxlZCB3aXRoIHBhcmVudCBpbm9kZSdzIGlfbXV0ZXggaGVsZC4KICAqLwogdm9pZCBzeXNmc19kcm9wX2RlbnRyeShzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogc2QsIHN0cnVjdCBkZW50cnkgKiBwYXJlbnQpCiB7CkBAIC0yMzIsNyArMjMzLDcgQEAKIAkJLyogbm8gaW5vZGUgbWVhbnMgdGhpcyBoYXNuJ3QgYmVlbiBtYWRlIHZpc2libGUgeWV0ICovCiAJCXJldHVybjsKIAotCWRvd24oJmRpci0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmRpci0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzZCwgJnBhcmVudF9zZC0+c19jaGlsZHJlbiwgc19zaWJsaW5nKSB7CiAJCWlmICghc2QtPnNfZWxlbWVudCkKIAkJCWNvbnRpbnVlOwpAQCAtMjQzLDcgKzI0NCw1IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQl1cCgmZGlyLT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZkaXItPmRfaW5vZGUtPmlfbXV0ZXgpOwogfQotCi0KZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL3N5bWxpbmsuYyBiL2ZzL3N5c2ZzL3N5bWxpbmsuYwppbmRleCBkZTQwMmZhLi5lMzhkNjMzIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9zeW1saW5rLmMKKysrIGIvZnMvc3lzZnMvc3ltbGluay5jCkBAIC04Niw5ICs4Niw5IEBACiAKIAlCVUdfT04oIWtvYmogfHwgIWtvYmotPmRlbnRyeSB8fCAhbmFtZSk7CiAKLQlkb3duKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCWVycm9yID0gc3lzZnNfYWRkX2xpbmsoZGVudHJ5LCBuYW1lLCB0YXJnZXQpOwotCXVwKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0xNzcsNCArMTc3LDMgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfY3JlYXRlX2xpbmspOwogRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfcmVtb3ZlX2xpbmspOwotCmRpZmYgLS1naXQgYS9mcy9zeXN2L0NoYW5nZUxvZyBiL2ZzL3N5c3YvQ2hhbmdlTG9nCmluZGV4IDE4ZTM0ODcuLmY0MDNmOGIgMTAwNjQ0Ci0tLSBhL2ZzL3N5c3YvQ2hhbmdlTG9nCisrKyBiL2ZzL3N5c3YvQ2hhbmdlTG9nCkBAIC01NCw3ICs1NCw3IEBACiAJICAoc3lzdl9yZWFkX3N1cGVyKTogTGlrZXdpc2UuCiAJICAodjdfcmVhZF9zdXBlcik6IExpa2V3aXNlLgogCi1TdW4gRGVjIDMwIDIwMDEgIE1hbmZyZWQgU3ByYXVsICA8bWFuZnJlZHNAY29sb3JmdWxsaWZlLmNvbT4KK1N1biBEZWMgMzAgMjAwMSAgTWFuZnJlZCBTcHJhdWwgIDxtYW5mcmVkQGNvbG9yZnVsbGlmZS5jb20+CiAKIAkqIGRpci5jIChkaXJfY29tbWl0X2NodW5rKTogRG8gbm90IHNldCBkaXItPmlfdmVyc2lvbi4KIAkoc3lzdl9yZWFkZGlyKTogTGlrZXdpc2UuCmRpZmYgLS1naXQgYS9mcy9zeXN2L2Rpci5jIGIvZnMvc3lzdi9kaXIuYwppbmRleCA2OWEwODVhLi5jY2U4YjA1IDEwMDY0NAotLS0gYS9mcy9zeXN2L2Rpci5jCisrKyBiL2ZzL3N5c3YvZGlyLmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogCQkJb2Zmc2V0ID0gKGNoYXIgKilkZSAtIGthZGRyOwogCiAJCQlvdmVyID0gZmlsbGRpcihkaXJlbnQsIG5hbWUsIHN0cm5sZW4obmFtZSxTWVNWX05BTUVMRU4pLAotCQkJCQkobjw8UEFHRV9DQUNIRV9TSElGVCkgfCBvZmZzZXQsCisJCQkJCSgobG9mZl90KW48PFBBR0VfQ0FDSEVfU0hJRlQpIHwgb2Zmc2V0LAogCQkJCQlmczE2X3RvX2NwdShTWVNWX1NCKHNiKSwgZGUtPmlub2RlKSwKIAkJCQkJRFRfVU5LTk9XTik7CiAJCQlpZiAob3ZlcikgewpAQCAtMTE1LDcgKzExNSw3IEBACiAJfQogCiBkb25lOgotCWZpbHAtPmZfcG9zID0gKG4gPDwgUEFHRV9DQUNIRV9TSElGVCkgfCBvZmZzZXQ7CisJZmlscC0+Zl9wb3MgPSAoKGxvZmZfdCluIDw8IFBBR0VfQ0FDSEVfU0hJRlQpIHwgb2Zmc2V0OwogCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL3VkZi9iYWxsb2MuYyBiL2ZzL3VkZi9iYWxsb2MuYwppbmRleCA2NTk4YTUwLi40ZmFlNTdkIDEwMDY0NAotLS0gYS9mcy91ZGYvYmFsbG9jLmMKKysrIGIvZnMvdWRmL2JhbGxvYy5jCkBAIC00MSw3ICs0MSw3IEBACiAjZGVmaW5lIHVpbnQoeCkgeHVpbnQoeCkKICNkZWZpbmUgeHVpbnQoeCkgX19sZSAjIyB4CiAKLWV4dGVybiBpbmxpbmUgaW50IGZpbmRfbmV4dF9vbmVfYml0ICh2b2lkICogYWRkciwgaW50IHNpemUsIGludCBvZmZzZXQpCitzdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfb25lX2JpdCAodm9pZCAqIGFkZHIsIGludCBzaXplLCBpbnQgb2Zmc2V0KQogewogCXVpbnRCUExfdCAqIHAgPSAoKHVpbnRCUExfdCAqKSBhZGRyKSArIChvZmZzZXQgLyBCSVRTX1BFUl9MT05HKTsKIAlpbnQgcmVzdWx0ID0gb2Zmc2V0ICYgfihCSVRTX1BFUl9MT05HLTEpOwpkaWZmIC0tZ2l0IGEvZnMvdWRmL2ZpbGUuYyBiL2ZzL3VkZi9maWxlLmMKaW5kZXggOGEzODgyOC4uYTZmMmFjYyAxMDA2NDQKLS0tIGEvZnMvdWRmL2ZpbGUuYworKysgYi9mcy91ZGYvZmlsZS5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4gLyogbWVtc2V0ICovCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CmRpZmYgLS1naXQgYS9mcy91ZGYvaW5vZGUuYyBiL2ZzL3VkZi9pbm9kZS5jCmluZGV4IDQwMTRmMTcuLjM5NWU1ODIgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9pbm9kZS5jCisrKyBiL2ZzL3VkZi9pbm9kZS5jCkBAIC0xOTU3LDExICsxOTU3LDYgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IGlub2RlX2JtYXA6IGJsb2NrIDwgMFxuIik7CiAJCXJldHVybiAtMTsKIAl9Ci0JaWYgKCFpbm9kZSkKLQl7Ci0JCXByaW50ayhLRVJOX0VSUiAidWRmOiBpbm9kZV9ibWFwOiBOVUxMIGlub2RlXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KIAogCSpleHRvZmZzZXQgPSAwOwogCSplbGVuID0gMDsKZGlmZiAtLWdpdCBhL2ZzL3Vmcy9iYWxsb2MuYyBiL2ZzL3Vmcy9iYWxsb2MuYwppbmRleCBmYWYxNTEyLi4zYWRhOWRjIDEwMDY0NAotLS0gYS9mcy91ZnMvYmFsbG9jLmMKKysrIGIvZnMvdWZzL2JhbGxvYy5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KQEAgLTQ4LDcgKzQ5LDcgQEAKIAkKIAlzYiA9IGlub2RlLT5pX3NiOwogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7Ci0JdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KFVTUElfVUJIKTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QodXNwaSk7CiAJCiAJVUZTRCgoIkVOVEVSLCBmcmFnbWVudCAldSwgY291bnQgJXVcbiIsIGZyYWdtZW50LCBjb3VudCkpCiAJCkBAIC04MCw4ICs4MSw5IEBACiAJZm9yIChpID0gYml0OyBpIDwgZW5kX2JpdDsgaSsrKSB7CiAJCWlmICh1YmhfaXNjbHIgKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIGkpKQogCQkJdWJoX3NldGJpdCAoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgaSk7Ci0JCWVsc2UgdWZzX2Vycm9yIChzYiwgInVmc19mcmVlX2ZyYWdtZW50cyIsCi0JCQkiYml0IGFscmVhZHkgY2xlYXJlZCBmb3IgZnJhZ21lbnQgJXUiLCBpKTsKKwkJZWxzZSAKKwkJCXVmc19lcnJvciAoc2IsICJ1ZnNfZnJlZV9mcmFnbWVudHMiLAorCQkJCSAgICJiaXQgYWxyZWFkeSBjbGVhcmVkIGZvciBmcmFnbWVudCAldSIsIGkpOwogCX0KIAkKIAlEUVVPVF9GUkVFX0JMT0NLIChpbm9kZSwgY291bnQpOwpAQCAtMTQyLDcgKzE0NCw3IEBACiAJCiAJc2IgPSBpbm9kZS0+aV9zYjsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwotCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KHVzcGkpOwogCiAJVUZTRCgoIkVOVEVSLCBmcmFnbWVudCAldSwgY291bnQgJXVcbiIsIGZyYWdtZW50LCBjb3VudCkpCiAJCkBAIC0yNDYsNyArMjQ4LDcgQEAKIAkKIAlzYiA9IGlub2RlLT5pX3NiOwogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7Ci0JdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KFVTUElfVUJIKTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QodXNwaSk7CiAJKmVyciA9IC1FTk9TUEM7CiAKIAlsb2NrX3N1cGVyIChzYik7CkBAIC00MDYsNyArNDA4LDcgQEAKIAkKIAlzYiA9IGlub2RlLT5pX3NiOwogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7Ci0JdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0IChVU1BJX1VCSCk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0ICh1c3BpKTsKIAljb3VudCA9IG5ld2NvdW50IC0gb2xkY291bnQ7CiAJCiAJY2dubyA9IHVmc19kdG9nKGZyYWdtZW50KTsKQEAgLTQ4OSw3ICs0OTEsNyBAQAogCiAJc2IgPSBpbm9kZS0+aV9zYjsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwotCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KHVzcGkpOwogCW9sZGNnID0gY2dubzsKIAkKIAkvKgpAQCAtNjA1LDcgKzYwNyw3IEBACiAKIAlzYiA9IGlub2RlLT5pX3NiOwogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7Ci0JdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KFVTUElfVUJIKTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QodXNwaSk7CiAJdWNnID0gdWJoX2dldF91Y2coVUNQSV9VQkgpOwogCiAJaWYgKGdvYWwgPT0gMCkgewpAQCAtNjYyLDcgKzY2NCw3IEBACiAJVUZTRCgoIkVOVEVSLCBjZyAldSwgZ29hbCAldSwgY291bnQgJXVcbiIsIHVjcGktPmNfY2d4LCBnb2FsLCBjb3VudCkpCiAKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwotCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCAoVVNQSV9VQkgpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCAodXNwaSk7CiAJdWNnID0gdWJoX2dldF91Y2coVUNQSV9VQkgpOwogCiAJaWYgKGdvYWwpCmRpZmYgLS1naXQgYS9mcy91ZnMvaWFsbG9jLmMgYi9mcy91ZnMvaWFsbG9jLmMKaW5kZXggMDkzODk0NS4uYzdhNDdlZCAxMDA2NDQKLS0tIGEvZnMvdWZzL2lhbGxvYy5jCisrKyBiL2ZzL3Vmcy9pYWxsb2MuYwpAQCAtNzIsNyArNzIsNyBAQAogCiAJc2IgPSBpbm9kZS0+aV9zYjsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwotCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KHVzcGkpOwogCQogCWlubyA9IGlub2RlLT5pX2lubzsKIApAQCAtMTY3LDcgKzE2Nyw3IEBACiAJdWZzaSA9IFVGU19JKGlub2RlKTsKIAlzYmkgPSBVRlNfU0Ioc2IpOwogCXVzcGkgPSBzYmktPnNfdXNwaTsKLQl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QoVVNQSV9VQkgpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCh1c3BpKTsKIAogCWxvY2tfc3VwZXIgKHNiKTsKIApkaWZmIC0tZ2l0IGEvZnMvdWZzL2lub2RlLmMgYi9mcy91ZnMvaW5vZGUuYwppbmRleCA1NWY0YWExLi5lMGMwNGUzIDEwMDY0NAotLS0gYS9mcy91ZnMvaW5vZGUuYworKysgYi9mcy91ZnMvaW5vZGUuYwpAQCAtNjEsNyArNjEsNyBAQAogCWludCBuID0gMDsKIAogCi0JVUZTRCgoInB0cnM9dXNwaS0+c19hcGIgPSAlZCxkb3VibGVfYmxvY2tzPSVkIFxuIixwdHJzLGRvdWJsZV9ibG9ja3MpKTsKKwlVRlNEKCgicHRycz11c3BpLT5zX2FwYiA9ICVkLGRvdWJsZV9ibG9ja3M9JWxkIFxuIixwdHJzLGRvdWJsZV9ibG9ja3MpKTsKIAlpZiAoaV9ibG9jayA8IDApIHsKIAkJdWZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsICJ1ZnNfYmxvY2tfdG9fcGF0aCIsICJibG9jayA8IDAiKTsKIAl9IGVsc2UgaWYgKGlfYmxvY2sgPCBkaXJlY3RfYmxvY2tzKSB7CkBAIC0xMDQsNyArMTA0LDcgQEAKIAl1bnNpZ25lZCBmbGFncyA9IFVGU19TQihzYiktPnNfZmxhZ3M7CiAJdTY0IHRlbXAgPSAwTDsKIAotCVVGU0QoKCI6IGZyYWcgPSAlbHUgIGRlcHRoID0gJWRcbiIsZnJhZyxkZXB0aCkpOworCVVGU0QoKCI6IGZyYWcgPSAlbGx1ICBkZXB0aCA9ICVkXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWZyYWcsIGRlcHRoKSk7CiAJVUZTRCgoIjogdXNwaS0+c19mcGJzaGlmdCA9ICVkICx1c3BpLT5zX2FwYm1hc2sgPSAleCwgbWFzaz0lbGx4XG4iLHVzcGktPnNfZnBic2hpZnQsdXNwaS0+c19hcGJtYXNrLG1hc2spKTsKIAogCWlmIChkZXB0aCA9PSAwKQpAQCAtMzY1LDkgKzM2NSwxMCBAQAogCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CiAJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwogCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCVVGU0QoKCJyZXN1bHQgJXVcbiIsIHRtcCArIGJsb2Nrb2ZmKSk7CiBvdXQ6CiAJYnJlbHNlIChiaCk7Ci0JVUZTRCgoIkVYSVQsIHJlc3VsdCAldVxuIiwgdG1wICsgYmxvY2tvZmYpKQorCVVGU0QoKCJFWElUXG4iKSk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMzg2LDcgKzM4Nyw3IEBACiAJCiAJaWYgKCFjcmVhdGUpIHsKIAkJcGh5czY0ID0gdWZzX2ZyYWdfbWFwKGlub2RlLCBmcmFnbWVudCk7Ci0JCVVGU0QoKCJwaHlzNjQgPSAlbHUgXG4iLHBoeXM2NCkpOworCQlVRlNEKCgicGh5czY0ID0gJWxsdSBcbiIscGh5czY0KSk7CiAJCWlmIChwaHlzNjQpCiAJCQltYXBfYmgoYmhfcmVzdWx0LCBzYiwgcGh5czY0KTsKIAkJcmV0dXJuIDA7CkBAIC00MDEsNyArNDAyLDcgQEAKIAogCWxvY2tfa2VybmVsKCk7CiAKLQlVRlNEKCgiRU5URVIsIGlubyAlbHUsIGZyYWdtZW50ICV1XG4iLCBpbm9kZS0+aV9pbm8sIGZyYWdtZW50KSkKKwlVRlNEKCgiRU5URVIsIGlubyAlbHUsIGZyYWdtZW50ICVsbHVcbiIsIGlub2RlLT5pX2lubywgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFnbWVudCkpCiAJaWYgKGZyYWdtZW50IDwgMCkKIAkJZ290byBhYm9ydF9uZWdhdGl2ZTsKIAlpZiAoZnJhZ21lbnQgPgpkaWZmIC0tZ2l0IGEvZnMvdWZzL3N1cGVyLmMgYi9mcy91ZnMvc3VwZXIuYwppbmRleCA1NDgyOGViLi5kNGFhY2VlIDEwMDY0NAotLS0gYS9mcy91ZnMvc3VwZXIuYworKysgYi9mcy91ZnMvc3VwZXIuYwpAQCAtMjIxLDcgKzIyMSw3IEBACiAJdmFfbGlzdCBhcmdzOwogCiAJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKLQl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QoVVNQSV9VQkgpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCh1c3BpKTsKIAkKIAlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKIAkJdXNiMS0+ZnNfY2xlYW4gPSBVRlNfRlNCQUQ7CkBAIC0yNTMsNyArMjUzLDcgQEAKIAl2YV9saXN0IGFyZ3M7CiAJCiAJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKLQl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QoVVNQSV9VQkgpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCh1c3BpKTsKIAkKIAlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKIAkJdXNiMS0+ZnNfY2xlYW4gPSBVRlNfRlNCQUQ7CkBAIC00MjAsMjEgKzQyMCwxOCBAQAogCQlpZiAoaSArIHVzcGktPnNfZnBiID4gYmxrcykKIAkJCXNpemUgPSAoYmxrcyAtIGkpICogdXNwaS0+c19mc2l6ZTsKIAotCQlpZiAoKGZsYWdzICYgVUZTX1RZUEVfTUFTSykgPT0gVUZTX1RZUEVfVUZTMikgeworCQlpZiAoKGZsYWdzICYgVUZTX1RZUEVfTUFTSykgPT0gVUZTX1RZUEVfVUZTMikgCiAJCQl1YmggPSB1YmhfYnJlYWQoc2IsCiAJCQkJZnM2NF90b19jcHUoc2IsIHVzYi0+ZnNfdTExLmZzX3UyLmZzX2NzYWRkcikgKyBpLCBzaXplKTsKLQkJCWlmICghdWJoKQotCQkJCWdvdG8gZmFpbGVkOwotCQkJdWJoX3ViaGNweW1lbSAoc3BhY2UsIHViaCwgc2l6ZSk7Ci0JCQlzYmktPnNfY3NwW3Vmc19mcmFnc3RvYmxrcyhpKV09KHN0cnVjdCB1ZnNfY3N1bSAqKXNwYWNlOwotCQl9Ci0JCWVsc2UgeworCQllbHNlIAogCQkJdWJoID0gdWJoX2JyZWFkKHNiLCB1c3BpLT5zX2NzYWRkciArIGksIHNpemUpOwotCQkJaWYgKCF1YmgpCi0JCQkJZ290byBmYWlsZWQ7Ci0JCQl1YmhfdWJoY3B5bWVtKHNwYWNlLCB1YmgsIHNpemUpOwotCQkJc2JpLT5zX2NzcFt1ZnNfZnJhZ3N0b2Jsa3MoaSldPShzdHJ1Y3QgdWZzX2NzdW0gKilzcGFjZTsKLQkJfQorCQkKKwkJaWYgKCF1YmgpCisJCQlnb3RvIGZhaWxlZDsKKworCQl1YmhfdWJoY3B5bWVtIChzcGFjZSwgdWJoLCBzaXplKTsKKwkJc2JpLT5zX2NzcFt1ZnNfZnJhZ3N0b2Jsa3MoaSldPShzdHJ1Y3QgdWZzX2NzdW0gKilzcGFjZTsKKwogCQlzcGFjZSArPSBzaXplOwogCQl1YmhfYnJlbHNlICh1YmgpOwogCQl1YmggPSBOVUxMOwpAQCAtNTM5LDYgKzUzNiw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZTsKIAl1bnNpZ25lZCBibG9ja19zaXplLCBzdXBlcl9ibG9ja19zaXplOwogCXVuc2lnbmVkIGZsYWdzOworCXVuc2lnbmVkIHN1cGVyX2Jsb2NrX29mZnNldDsKIAogCXVzcGkgPSBOVUxMOwogCXViaCA9IE5VTEw7CkBAIC01ODYsMTAgKzU4NCwxMSBAQAogCWlmICghdXNwaSkKIAkJZ290byBmYWlsZWQ7CiAKKwlzdXBlcl9ibG9ja19vZmZzZXQ9VUZTX1NCTE9DSzsKKwogCS8qIEtlZXAgMkdpZyBmaWxlIGxpbWl0LiBTb21lIFVGUyB2YXJpYW50cyBuZWVkIHRvIG92ZXJyaWRlIAogCSAgIHRoaXMgYnV0IGFzIEkgZG9uJ3Qga25vdyB3aGljaCBJJ2xsIGxldCB0aG9zZSBpbiB0aGUga25vdyBsb29zZW4KIAkgICB0aGUgcnVsZXMgKi8KLQkgICAKIAlzd2l0Y2ggKHNiaS0+c19tb3VudF9vcHQgJiBVRlNfTU9VTlRfVUZTVFlQRSkgewogCWNhc2UgVUZTX01PVU5UX1VGU1RZUEVfNDRCU0Q6CiAJCVVGU0QoKCJ1ZnN0eXBlPTQ0YnNkXG4iKSkKQEAgLTYwMSw3ICs2MDAsOCBAQAogCQlmbGFncyB8PSBVRlNfREVfNDRCU0QgfCBVRlNfVUlEXzQ0QlNEIHwgVUZTX1NUXzQ0QlNEIHwgVUZTX0NHXzQ0QlNEOwogCQlicmVhazsKIAljYXNlIFVGU19NT1VOVF9VRlNUWVBFX1VGUzI6Ci0JCVVGU0QoKCJ1ZnN0eXBlPXVmczJcbiIpKQorCQlVRlNEKCgidWZzdHlwZT11ZnMyXG4iKSk7CisJCXN1cGVyX2Jsb2NrX29mZnNldD1TQkxPQ0tfVUZTMjsKIAkJdXNwaS0+c19mc2l6ZSA9IGJsb2NrX3NpemUgPSA1MTI7CiAJCXVzcGktPnNfZm1hc2sgPSB+KDUxMiAtIDEpOwogCQl1c3BpLT5zX2ZzaGlmdCA9IDk7CkBAIC03MjUsMTkgKzcyNSwxNiBAQAogCS8qCiAJICogcmVhZCB1ZnMgc3VwZXIgYmxvY2sgZnJvbSBkZXZpY2UKIAkgKi8KLQlpZiAoIChmbGFncyAmIFVGU19UWVBFX01BU0spID09IFVGU19UWVBFX1VGUzIpIHsKLQkJdWJoID0gdWJoX2JyZWFkX3VzcGkodXNwaSwgc2IsIHVzcGktPnNfc2JiYXNlICsgU0JMT0NLX1VGUzIvYmxvY2tfc2l6ZSwgc3VwZXJfYmxvY2tfc2l6ZSk7Ci0JfQotCWVsc2UgewotCQl1YmggPSB1YmhfYnJlYWRfdXNwaSh1c3BpLCBzYiwgdXNwaS0+c19zYmJhc2UgKyBVRlNfU0JMT0NLL2Jsb2NrX3NpemUsIHN1cGVyX2Jsb2NrX3NpemUpOwotCX0KKworCXViaCA9IHViaF9icmVhZF91c3BpKHVzcGksIHNiLCB1c3BpLT5zX3NiYmFzZSArIHN1cGVyX2Jsb2NrX29mZnNldC9ibG9ja19zaXplLCBzdXBlcl9ibG9ja19zaXplKTsKKwkKIAlpZiAoIXViaCkgCiAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKIAogCQotCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7Ci0JdXNiMiA9IHViaF9nZXRfdXNiX3NlY29uZChVU1BJX1VCSCk7Ci0JdXNiMyA9IHViaF9nZXRfdXNiX3RoaXJkKFVTUElfVUJIKTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QodXNwaSk7CisJdXNiMiA9IHViaF9nZXRfdXNiX3NlY29uZCh1c3BpKTsKKwl1c2IzID0gdWJoX2dldF91c2JfdGhpcmQodXNwaSk7CiAJdXNiICA9IChzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrICopCiAJCSgoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKXVzcGkpLT5iaFswXS0+Yl9kYXRhIDsKIApAQCAtMTAwNiw4ICsxMDAzLDggQEAKIAlVRlNEKCgiRU5URVJcbiIpKQogCWZsYWdzID0gVUZTX1NCKHNiKS0+c19mbGFnczsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwotCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7Ci0JdXNiMyA9IHViaF9nZXRfdXNiX3RoaXJkKFVTUElfVUJIKTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QodXNwaSk7CisJdXNiMyA9IHViaF9nZXRfdXNiX3RoaXJkKHVzcGkpOwogCiAJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CiAJCXVzYjEtPmZzX3RpbWUgPSBjcHVfdG9fZnMzMihzYiwgZ2V0X3NlY29uZHMoKSk7CkBAIC0xMDQ5LDggKzEwNDYsOCBAQAogCQogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CiAJZmxhZ3MgPSBVRlNfU0Ioc2IpLT5zX2ZsYWdzOwotCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7Ci0JdXNiMyA9IHViaF9nZXRfdXNiX3RoaXJkKFVTUElfVUJIKTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QodXNwaSk7CisJdXNiMyA9IHViaF9nZXRfdXNiX3RoaXJkKHVzcGkpOwogCQogCS8qCiAJICogQWxsb3cgdGhlICJjaGVjayIgb3B0aW9uIHRvIGJlIHBhc3NlZCBhcyBhIHJlbW91bnQgb3B0aW9uLgpAQCAtMTEyNCw3ICsxMTIxLDcgQEAKIAlsb2NrX2tlcm5lbCgpOwogCiAJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKLQl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QgKFVTUElfVUJIKTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QgKHVzcGkpOwogCXVzYiAgPSAoc3RydWN0IHVmc19zdXBlcl9ibG9jayAqKQogCQkoKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKil1c3BpKS0+YmhbMF0tPmJfZGF0YSA7CiAJCkBAIC0xMjc1LDcgKzEyNzIsNyBAQAogCXNpemVfdCB0b3dyaXRlID0gbGVuOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAKLQlkb3duKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAl3aGlsZSAodG93cml0ZSA+IDApIHsKIAkJdG9jb3B5ID0gc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDwgdG93cml0ZSA/CiAJCQkJc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDogdG93cml0ZTsKQEAgLTEyOTYsMTQgKzEyOTMsMTYgQEAKIAkJYmxrKys7CiAJfQogb3V0OgotCWlmIChsZW4gPT0gdG93cml0ZSkKKwlpZiAobGVuID09IHRvd3JpdGUpIHsKKwkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJCXJldHVybiBlcnI7CisJfQogCWlmIChpbm9kZS0+aV9zaXplIDwgb2ZmK2xlbi10b3dyaXRlKQogCQlpX3NpemVfd3JpdGUoaW5vZGUsIG9mZitsZW4tdG93cml0ZSk7CiAJaW5vZGUtPmlfdmVyc2lvbisrOwogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwogCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwotCXVwKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiBsZW4gLSB0b3dyaXRlOwogfQogCmRpZmYgLS1naXQgYS9mcy91ZnMvdXRpbC5oIGIvZnMvdWZzL3V0aWwuaAppbmRleCBiMjY0MDA3Li40OGQ2ZDliIDEwMDY0NAotLS0gYS9mcy91ZnMvdXRpbC5oCisrKyBiL2ZzL3Vmcy91dGlsLmgKQEAgLTI0OSwxOCArMjQ5LDI4IEBACiAKIAogLyoKLSAqIG1hY3JvcyB0byBnZXQgaW1wb3J0YW50IHN0cnVjdHVyZXMgZnJvbSB1ZnNfYnVmZmVyX2hlYWQKKyAqIG1hY3JvcyBhbmQgaW5saW5lIGZ1bmN0aW9uIHRvIGdldCBpbXBvcnRhbnQgc3RydWN0dXJlcyBmcm9tIHVmc19zYl9wcml2YXRlX2luZm8KICAqLwotI2RlZmluZSB1YmhfZ2V0X3VzYl9maXJzdCh1YmgpIFwKLQkoKHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgKikoKHViaCktPmJoWzBdLT5iX2RhdGEpKQogCi0jZGVmaW5lIHViaF9nZXRfdXNiX3NlY29uZCh1YmgpIFwKLQkoKHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfc2Vjb25kICopKHViaCktPiBcCi0JYmhbVUZTX1NFQ1RPUl9TSVpFID4+IHVzcGktPnNfZnNoaWZ0XS0+Yl9kYXRhICsgKFVGU19TRUNUT1JfU0laRSAmIH51c3BpLT5zX2ZtYXNrKSkKK3N0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0X3VzYl9vZmZzZXQoc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKnVzcGksCisJCQkJICAgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJCisJaW5kZXggPSBvZmZzZXQgPj4gdXNwaS0+c19mc2hpZnQ7CisJb2Zmc2V0ICY9IH51c3BpLT5zX2ZtYXNrOworCXJldHVybiB1c3BpLT5zX3ViaC5iaFtpbmRleF0tPmJfZGF0YSArIG9mZnNldDsKK30KIAotI2RlZmluZSB1YmhfZ2V0X3VzYl90aGlyZCh1YmgpIFwKLQkoKHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfdGhpcmQgKikoKHViaCktPiBcCi0JYmhbVUZTX1NFQ1RPUl9TSVpFKjIgPj4gdXNwaS0+c19mc2hpZnRdLT5iX2RhdGEgKyAoVUZTX1NFQ1RPUl9TSVpFKjIgJiB+dXNwaS0+c19mbWFzaykpKQorI2RlZmluZSB1YmhfZ2V0X3VzYl9maXJzdCh1c3BpKSBcCisJKChzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICopZ2V0X3VzYl9vZmZzZXQoKHVzcGkpLCAwKSkKKworI2RlZmluZSB1YmhfZ2V0X3VzYl9zZWNvbmQodXNwaSkgXAorCSgoc3RydWN0IHVmc19zdXBlcl9ibG9ja19zZWNvbmQgKilnZXRfdXNiX29mZnNldCgodXNwaSksIFVGU19TRUNUT1JfU0laRSkpCisKKyNkZWZpbmUgdWJoX2dldF91c2JfdGhpcmQodXNwaSkJXAorCSgoc3RydWN0IHVmc19zdXBlcl9ibG9ja190aGlyZCAqKWdldF91c2Jfb2Zmc2V0KCh1c3BpKSwgMipVRlNfU0VDVE9SX1NJWkUpKQorCiAKICNkZWZpbmUgdWJoX2dldF91Y2codWJoKSBcCiAJKChzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwICopKCh1YmgpLT5iaFswXS0+Yl9kYXRhKSkKZGlmZiAtLWdpdCBhL2ZzL3hhdHRyLmMgYi9mcy94YXR0ci5jCmluZGV4IGJjYzIxNTYuLjgwZWNhN2QgMTAwNjQ0Ci0tLSBhL2ZzL3hhdHRyLmMKKysrIGIvZnMveGF0dHIuYwpAQCAtMTksNiArMTksMTQ5IEBACiAjaW5jbHVkZSA8bGludXgvZnNub3RpZnkuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCisKKy8qCisgKiBDaGVjayBwZXJtaXNzaW9ucyBmb3IgZXh0ZW5kZWQgYXR0cmlidXRlIGFjY2Vzcy4gIFRoaXMgaXMgYSBiaXQgY29tcGxpY2F0ZWQKKyAqIGJlY2F1c2UgZGlmZmVyZW50IG5hbWVzcGFjZXMgaGF2ZSB2ZXJ5IGRpZmZlcmVudCBydWxlcy4KKyAqLworc3RhdGljIGludAoreGF0dHJfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbWFzaykKK3sKKwkvKgorCSAqIFdlIGNhbiBuZXZlciBzZXQgb3IgcmVtb3ZlIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSBvbiBhIHJlYWQtb25seQorCSAqIGZpbGVzeXN0ZW0gIG9yIG9uIGFuIGltbXV0YWJsZSAvIGFwcGVuZC1vbmx5IGlub2RlLgorCSAqLworCWlmIChtYXNrICYgTUFZX1dSSVRFKSB7CisJCWlmIChJU19SRE9OTFkoaW5vZGUpKQorCQkJcmV0dXJuIC1FUk9GUzsKKwkJaWYgKElTX0lNTVVUQUJMRShpbm9kZSkgfHwgSVNfQVBQRU5EKGlub2RlKSkKKwkJCXJldHVybiAtRVBFUk07CisJfQorCisJLyoKKwkgKiBObyByZXN0cmljdGlvbiBmb3Igc2VjdXJpdHkuKiBhbmQgc3lzdGVtLiogZnJvbSB0aGUgVkZTLiAgRGVjaXNpb24KKwkgKiBvbiB0aGVzZSBpcyBsZWZ0IHRvIHRoZSB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0gLyBzZWN1cml0eSBtb2R1bGUuCisJICovCisJaWYgKCFzdHJuY21wKG5hbWUsIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCwgWEFUVFJfU0VDVVJJVFlfUFJFRklYX0xFTikgfHwKKwkgICAgIXN0cm5jbXAobmFtZSwgWEFUVFJfU1lTVEVNX1BSRUZJWCwgWEFUVFJfU1lTVEVNX1BSRUZJWF9MRU4pKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogVGhlIHRydXN0ZWQuKiBuYW1lc3BhY2UgY2FuIG9ubHkgYWNjZXNzZWQgYnkgYSBwcml2aWxlZ3VlZCB1c2VyLgorCSAqLworCWlmICghc3RybmNtcChuYW1lLCBYQVRUUl9UUlVTVEVEX1BSRUZJWCwgWEFUVFJfVFJVU1RFRF9QUkVGSVhfTEVOKSkKKwkJcmV0dXJuIChjYXBhYmxlKENBUF9TWVNfQURNSU4pID8gMCA6IC1FUEVSTSk7CisKKwlpZiAoIXN0cm5jbXAobmFtZSwgWEFUVFJfVVNFUl9QUkVGSVgsIFhBVFRSX1VTRVJfUFJFRklYX0xFTikpIHsKKwkJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmCisJCSAgICAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgaW5vZGUtPmlfbW9kZSAmIFNfSVNWVFgpKQorCQkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyZXR1cm4gcGVybWlzc2lvbihpbm9kZSwgbWFzaywgTlVMTCk7Cit9CisKK2ludAordmZzX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqbmFtZSwgdm9pZCAqdmFsdWUsCisJCXNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHhhdHRyX3Blcm1pc3Npb24oaW5vZGUsIG5hbWUsIE1BWV9XUklURSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9zZXR4YXR0cihkZW50cnksIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKwllcnJvciA9IC1FT1BOT1RTVVBQOworCWlmIChpbm9kZS0+aV9vcC0+c2V0eGF0dHIpIHsKKwkJZXJyb3IgPSBpbm9kZS0+aV9vcC0+c2V0eGF0dHIoZGVudHJ5LCBuYW1lLCB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworCQlpZiAoIWVycm9yKSB7CisJCQlmc25vdGlmeV94YXR0cihkZW50cnkpOworCQkJc2VjdXJpdHlfaW5vZGVfcG9zdF9zZXR4YXR0cihkZW50cnksIG5hbWUsIHZhbHVlLAorCQkJCQkJICAgICBzaXplLCBmbGFncyk7CisJCX0KKwl9IGVsc2UgaWYgKCFzdHJuY21wKG5hbWUsIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCwKKwkJCQlYQVRUUl9TRUNVUklUWV9QUkVGSVhfTEVOKSkgeworCQljb25zdCBjaGFyICpzdWZmaXggPSBuYW1lICsgWEFUVFJfU0VDVVJJVFlfUFJFRklYX0xFTjsKKwkJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9zZXRzZWN1cml0eShpbm9kZSwgc3VmZml4LCB2YWx1ZSwKKwkJCQkJCSAgIHNpemUsIGZsYWdzKTsKKwkJaWYgKCFlcnJvcikKKwkJCWZzbm90aWZ5X3hhdHRyKGRlbnRyeSk7CisJfQorb3V0OgorCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZmc19zZXR4YXR0cik7CisKK3NzaXplX3QKK3Zmc19nZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKm5hbWUsIHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnJvcjsKKworCWVycm9yID0geGF0dHJfcGVybWlzc2lvbihpbm9kZSwgbmFtZSwgTUFZX1JFQUQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9nZXR4YXR0cihkZW50cnksIG5hbWUpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKGlub2RlLT5pX29wLT5nZXR4YXR0cikKKwkJZXJyb3IgPSBpbm9kZS0+aV9vcC0+Z2V0eGF0dHIoZGVudHJ5LCBuYW1lLCB2YWx1ZSwgc2l6ZSk7CisJZWxzZQorCQllcnJvciA9IC1FT1BOT1RTVVBQOworCisJaWYgKCFzdHJuY21wKG5hbWUsIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCwKKwkJCQlYQVRUUl9TRUNVUklUWV9QUkVGSVhfTEVOKSkgeworCQljb25zdCBjaGFyICpzdWZmaXggPSBuYW1lICsgWEFUVFJfU0VDVVJJVFlfUFJFRklYX0xFTjsKKwkJaW50IHJldCA9IHNlY3VyaXR5X2lub2RlX2dldHNlY3VyaXR5KGlub2RlLCBzdWZmaXgsIHZhbHVlLAorCQkJCQkJICAgICBzaXplLCBlcnJvcik7CisJCS8qCisJCSAqIE9ubHkgb3ZlcndyaXRlIHRoZSByZXR1cm4gdmFsdWUgaWYgYSBzZWN1cml0eSBtb2R1bGUKKwkJICogaXMgYWN0dWFsbHkgYWN0aXZlLgorCQkgKi8KKwkJaWYgKHJldCAhPSAtRU9QTk9UU1VQUCkKKwkJCWVycm9yID0gcmV0OworCX0KKworCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZmc19nZXR4YXR0cik7CisKK2ludAordmZzX3JlbW92ZXhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnJvcjsKKworCWlmICghaW5vZGUtPmlfb3AtPnJlbW92ZXhhdHRyKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwllcnJvciA9IHhhdHRyX3Blcm1pc3Npb24oaW5vZGUsIG5hbWUsIE1BWV9XUklURSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IHNlY3VyaXR5X2lub2RlX3JlbW92ZXhhdHRyKGRlbnRyeSwgbmFtZSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJZXJyb3IgPSBpbm9kZS0+aV9vcC0+cmVtb3ZleGF0dHIoZGVudHJ5LCBuYW1lKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKworCWlmICghZXJyb3IpCisJCWZzbm90aWZ5X3hhdHRyKGRlbnRyeSk7CisJcmV0dXJuIGVycm9yOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmZzX3JlbW92ZXhhdHRyKTsKKworCiAvKgogICogRXh0ZW5kZWQgYXR0cmlidXRlIFNFVCBvcGVyYXRpb25zCiAgKi8KQEAgLTUxLDI5ICsxOTQsNyBAQAogCQl9CiAJfQogCi0JZG93bigmZC0+ZF9pbm9kZS0+aV9zZW0pOwotCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfc2V0eGF0dHIoZCwga25hbWUsIGt2YWx1ZSwgc2l6ZSwgZmxhZ3MpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXQ7Ci0JZXJyb3IgPSAtRU9QTk9UU1VQUDsKLQlpZiAoZC0+ZF9pbm9kZS0+aV9vcCAmJiBkLT5kX2lub2RlLT5pX29wLT5zZXR4YXR0cikgewotCQllcnJvciA9IGQtPmRfaW5vZGUtPmlfb3AtPnNldHhhdHRyKGQsIGtuYW1lLCBrdmFsdWUsCi0JCQkJCQkgICBzaXplLCBmbGFncyk7Ci0JCWlmICghZXJyb3IpIHsKLQkJCWZzbm90aWZ5X3hhdHRyKGQpOwotCQkJc2VjdXJpdHlfaW5vZGVfcG9zdF9zZXR4YXR0cihkLCBrbmFtZSwga3ZhbHVlLAotCQkJCQkJICAgICBzaXplLCBmbGFncyk7Ci0JCX0KLQl9IGVsc2UgaWYgKCFzdHJuY21wKGtuYW1lLCBYQVRUUl9TRUNVUklUWV9QUkVGSVgsCi0JCQkgICAgc2l6ZW9mIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCAtIDEpKSB7Ci0JCWNvbnN0IGNoYXIgKnN1ZmZpeCA9IGtuYW1lICsgc2l6ZW9mIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCAtIDE7Ci0JCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfc2V0c2VjdXJpdHkoZC0+ZF9pbm9kZSwgc3VmZml4LCBrdmFsdWUsCi0JCQkJCQkgICBzaXplLCBmbGFncyk7Ci0JCWlmICghZXJyb3IpCi0JCQlmc25vdGlmeV94YXR0cihkKTsKLQl9Ci1vdXQ6Ci0JdXAoJmQtPmRfaW5vZGUtPmlfc2VtKTsKKwllcnJvciA9IHZmc19zZXR4YXR0cihkLCBrbmFtZSwga3ZhbHVlLCBzaXplLCBmbGFncyk7CiAJa2ZyZWUoa3ZhbHVlKTsKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0xNDcsMjIgKzI2OCw3IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQllcnJvciA9IHNlY3VyaXR5X2lub2RlX2dldHhhdHRyKGQsIGtuYW1lKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0OwotCWVycm9yID0gLUVPUE5PVFNVUFA7Ci0JaWYgKGQtPmRfaW5vZGUtPmlfb3AgJiYgZC0+ZF9pbm9kZS0+aV9vcC0+Z2V0eGF0dHIpCi0JCWVycm9yID0gZC0+ZF9pbm9kZS0+aV9vcC0+Z2V0eGF0dHIoZCwga25hbWUsIGt2YWx1ZSwgc2l6ZSk7Ci0KLQlpZiAoIXN0cm5jbXAoa25hbWUsIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCwKLQkJICAgICBzaXplb2YgWEFUVFJfU0VDVVJJVFlfUFJFRklYIC0gMSkpIHsKLQkJY29uc3QgY2hhciAqc3VmZml4ID0ga25hbWUgKyBzaXplb2YgWEFUVFJfU0VDVVJJVFlfUFJFRklYIC0gMTsKLQkJaW50IHJ2ID0gc2VjdXJpdHlfaW5vZGVfZ2V0c2VjdXJpdHkoZC0+ZF9pbm9kZSwgc3VmZml4LCBrdmFsdWUsCi0JCQkJCQkgICAgc2l6ZSwgZXJyb3IpOwotCQkvKiBTZWN1cml0eSBtb2R1bGUgYWN0aXZlOiBvdmVyd3JpdGUgZXJyb3IgdmFsdWUgKi8KLQkJaWYgKHJ2ICE9IC1FT1BOT1RTVVBQKQotCQkJZXJyb3IgPSBydjsKLQl9CisJZXJyb3IgPSB2ZnNfZ2V0eGF0dHIoZCwga25hbWUsIGt2YWx1ZSwgc2l6ZSk7CiAJaWYgKGVycm9yID4gMCkgewogCQlpZiAoc2l6ZSAmJiBjb3B5X3RvX3VzZXIodmFsdWUsIGt2YWx1ZSwgZXJyb3IpKQogCQkJZXJyb3IgPSAtRUZBVUxUOwpAQCAtMTcxLDcgKzI3Nyw2IEBACiAJCSAgIHRoYW4gWEFUVFJfU0laRV9NQVggYnl0ZXMuIE5vdCBwb3NzaWJsZS4gKi8KIAkJZXJyb3IgPSAtRTJCSUc7CiAJfQotb3V0OgogCWtmcmVlKGt2YWx1ZSk7CiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMzE4LDE5ICs0MjMsNyBAQAogCWlmIChlcnJvciA8IDApCiAJCXJldHVybiBlcnJvcjsKIAotCWVycm9yID0gLUVPUE5PVFNVUFA7Ci0JaWYgKGQtPmRfaW5vZGUtPmlfb3AgJiYgZC0+ZF9pbm9kZS0+aV9vcC0+cmVtb3ZleGF0dHIpIHsKLQkJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9yZW1vdmV4YXR0cihkLCBrbmFtZSk7Ci0JCWlmIChlcnJvcikKLQkJCWdvdG8gb3V0OwotCQlkb3duKCZkLT5kX2lub2RlLT5pX3NlbSk7Ci0JCWVycm9yID0gZC0+ZF9pbm9kZS0+aV9vcC0+cmVtb3ZleGF0dHIoZCwga25hbWUpOwotCQl1cCgmZC0+ZF9pbm9kZS0+aV9zZW0pOwotCQlpZiAoIWVycm9yKQotCQkJZnNub3RpZnlfeGF0dHIoZCk7Ci0JfQotb3V0OgotCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gdmZzX3JlbW92ZXhhdHRyKGQsIGtuYW1lKTsKIH0KIAogYXNtbGlua2FnZSBsb25nCmRpZmYgLS1naXQgYS9mcy94ZnMvS2J1aWxkIGIvZnMveGZzL0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTY2ZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL0tidWlsZApAQCAtMCwwICsxLDYgQEAKKyMKKyMgVGhlIHhmcyBwZW9wbGUgbGlrZSB0byBzaGFyZSBNYWtlZmlsZSB3aXRoIDIuNiBhbmQgMi40LgorIyBVdGlsaXNlIGZpbGUgbmFtZWQgS2J1aWxkIGZpbGUgd2hpY2ggaGFzIHByZWNlZGVuY2Ugb3ZlciBNYWtlZmlsZS4KKyMKKworaW5jbHVkZSAkKHNyY3RyZWUpLyQob2JqKS9NYWtlZmlsZS1saW51eC0yLjYKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYvbXV0ZXguaCBiL2ZzL3hmcy9saW51eC0yLjYvbXV0ZXguaAppbmRleCBjZTc3M2Q4Li4yYTg4ZDU2IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L211dGV4LmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi9tdXRleC5oCkBAIC0xOCwyMiArMTgsOCBAQAogI2lmbmRlZiBfX1hGU19TVVBQT1JUX01VVEVYX0hfXwogI2RlZmluZSBfX1hGU19TVVBQT1JUX01VVEVYX0hfXwogCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAotLyoKLSAqIE1hcCB0aGUgbXV0ZXgnZXMgZnJvbSBJUklYIHRvIExpbnV4IHNlbWFwaG9yZXMuCi0gKgotICogRGVzdHJveSBqdXN0IHNpbXBseSBpbml0aWFsaXplcyB0byAtOTkgd2hpY2ggc2hvdWxkIGJsb2NrIGFsbCBvdGhlcgotICogY2FsbGVycy4KLSAqLwotI2RlZmluZSBNVVRFWF9ERUZBVUxUCQkweDAKLXR5cGVkZWYgc3RydWN0IHNlbWFwaG9yZQltdXRleF90OwotCi0jZGVmaW5lIG11dGV4X2luaXQobG9jaywgdHlwZSwgbmFtZSkJCXNlbWFfaW5pdChsb2NrLCAxKQotI2RlZmluZSBtdXRleF9kZXN0cm95KGxvY2spCQkJc2VtYV9pbml0KGxvY2ssIC05OSkKLSNkZWZpbmUgbXV0ZXhfbG9jayhsb2NrLCBudW0pCQkJZG93bihsb2NrKQotI2RlZmluZSBtdXRleF90cnlsb2NrKGxvY2spCQkJKGRvd25fdHJ5bG9jayhsb2NrKSA/IDAgOiAxKQotI2RlZmluZSBtdXRleF91bmxvY2sobG9jaykJCQl1cChsb2NrKQordHlwZWRlZiBzdHJ1Y3QgbXV0ZXggbXV0ZXhfdDsKIAogI2VuZGlmIC8qIF9fWEZTX1NVUFBPUlRfTVVURVhfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMKaW5kZXggOTRkM2NkZi4uMTIwNjI2NyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYwpAQCAtNDAsMTEgKzQwLDEwIEBACiAjaW5jbHVkZSAieGZzX3J3LmgiCiAjaW5jbHVkZSAieGZzX2lvbWFwLmgiCiAjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdldmVjLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAKIFNUQVRJQyB2b2lkIHhmc19jb3VudF9wYWdlX3N0YXRlKHN0cnVjdCBwYWdlICosIGludCAqLCBpbnQgKiwgaW50ICopOwotU1RBVElDIHZvaWQgeGZzX2NvbnZlcnRfcGFnZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHBhZ2UgKiwgeGZzX2lvbWFwX3QgKiwKLQkJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsIHZvaWQgKiwgaW50LCBpbnQpOwogCiAjaWYgZGVmaW5lZChYRlNfUldfVFJBQ0UpCiB2b2lkCkBAIC01NSwxNyArNTQsMTUgQEAKIAlpbnQJCW1hc2spCiB7CiAJeGZzX2lub2RlX3QJKmlwOwotCWJodl9kZXNjX3QJKmJkcDsKIAl2bm9kZV90CQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKIAlsb2ZmX3QJCWlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwotCWxvZmZfdAkJb2Zmc2V0ID0gKGxvZmZfdClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOworCWxvZmZfdAkJb2Zmc2V0ID0gcGFnZV9vZmZzZXQocGFnZSk7CiAJaW50CQlkZWxhbGxvYyA9IC0xLCB1bm1hcHBlZCA9IC0xLCB1bndyaXR0ZW4gPSAtMTsKIAogCWlmIChwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQogCQl4ZnNfY291bnRfcGFnZV9zdGF0ZShwYWdlLCAmZGVsYWxsb2MsICZ1bm1hcHBlZCwgJnVud3JpdHRlbik7CiAKLQliZHAgPSB2bl9iaHZfbG9va3VwKFZOX0JIVl9IRUFEKHZwKSwgJnhmc192bm9kZW9wcyk7Ci0JaXAgPSBYRlNfQkhWVE9JKGJkcCk7CisJaXAgPSB4ZnNfdnRvaSh2cCk7CiAJaWYgKCFpcC0+aV9yd3RyYWNlKQogCQlyZXR1cm47CiAKQEAgLTEwMywxNSArMTAwLDU2IEBACiAJCXF1ZXVlX3dvcmsoeGZzZGF0YWRfd29ya3F1ZXVlLCAmaW9lbmQtPmlvX3dvcmspOwogfQogCisvKgorICogV2UncmUgbm93IGZpbmlzaGVkIGZvciBnb29kIHdpdGggdGhpcyBpb2VuZCBzdHJ1Y3R1cmUuCisgKiBVcGRhdGUgdGhlIHBhZ2Ugc3RhdGUgdmlhIHRoZSBhc3NvY2lhdGVkIGJ1ZmZlcl9oZWFkcywKKyAqIHJlbGVhc2UgaG9sZHMgb24gdGhlIGlub2RlIGFuZCBiaW8sIGFuZCBmaW5hbGx5IGZyZWUKKyAqIHVwIG1lbW9yeS4gIERvIG5vdCB1c2UgdGhlIGlvZW5kIGFmdGVyIHRoaXMuCisgKi8KIFNUQVRJQyB2b2lkCiB4ZnNfZGVzdHJveV9pb2VuZCgKIAl4ZnNfaW9lbmRfdAkJKmlvZW5kKQogeworCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsICpuZXh0OworCisJZm9yIChiaCA9IGlvZW5kLT5pb19idWZmZXJfaGVhZDsgYmg7IGJoID0gbmV4dCkgeworCQluZXh0ID0gYmgtPmJfcHJpdmF0ZTsKKwkJYmgtPmJfZW5kX2lvKGJoLCBpb2VuZC0+aW9fdXB0b2RhdGUpOworCX0KKwogCXZuX2lvd2FrZShpb2VuZC0+aW9fdm5vZGUpOwogCW1lbXBvb2xfZnJlZShpb2VuZCwgeGZzX2lvZW5kX3Bvb2wpOwogfQogCiAvKgorICogQnVmZmVyZWQgSU8gd3JpdGUgY29tcGxldGlvbiBmb3IgZGVsYXllZCBhbGxvY2F0ZSBleHRlbnRzLgorICogVE9ETzogVXBkYXRlIG9uZGlzayBpc2l6ZSBub3cgdGhhdCB3ZSBrbm93IHRoZSBmaWxlIGRhdGEKKyAqIGhhcyBiZWVuIGZsdXNoZWQgKGkuZS4gdGhlIG5vdG9yaW91cyAiTlVMTCBmaWxlIiBwcm9ibGVtKS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19lbmRfYmlvX2RlbGFsbG9jKAorCXZvaWQJCQkqZGF0YSkKK3sKKwl4ZnNfaW9lbmRfdAkJKmlvZW5kID0gZGF0YTsKKworCXhmc19kZXN0cm95X2lvZW5kKGlvZW5kKTsKK30KKworLyoKKyAqIEJ1ZmZlcmVkIElPIHdyaXRlIGNvbXBsZXRpb24gZm9yIHJlZ3VsYXIsIHdyaXR0ZW4gZXh0ZW50cy4KKyAqLworU1RBVElDIHZvaWQKK3hmc19lbmRfYmlvX3dyaXR0ZW4oCisJdm9pZAkJCSpkYXRhKQoreworCXhmc19pb2VuZF90CQkqaW9lbmQgPSBkYXRhOworCisJeGZzX2Rlc3Ryb3lfaW9lbmQoaW9lbmQpOworfQorCisvKgorICogSU8gd3JpdGUgY29tcGxldGlvbiBmb3IgdW53cml0dGVuIGV4dGVudHMuCisgKgogICogSXNzdWUgdHJhbnNhY3Rpb25zIHRvIGNvbnZlcnQgYSBidWZmZXIgcmFuZ2UgZnJvbSB1bndyaXR0ZW4KICAqIHRvIHdyaXR0ZW4gZXh0ZW50cy4KICAqLwpAQCAtMTIzLDIxICsxNjEsMTAgQEAKIAl2bm9kZV90CQkJKnZwID0gaW9lbmQtPmlvX3Zub2RlOwogCXhmc19vZmZfdAkJb2Zmc2V0ID0gaW9lbmQtPmlvX29mZnNldDsKIAlzaXplX3QJCQlzaXplID0gaW9lbmQtPmlvX3NpemU7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaCwgKm5leHQ7CiAJaW50CQkJZXJyb3I7CiAKIAlpZiAoaW9lbmQtPmlvX3VwdG9kYXRlKQogCQlWT1BfQk1BUCh2cCwgb2Zmc2V0LCBzaXplLCBCTUFQSV9VTldSSVRURU4sIE5VTEwsIE5VTEwsIGVycm9yKTsKLQotCS8qIGlvZW5kLT5pb19idWZmZXJfaGVhZCBpcyBvbmx5IG5vbi1OVUxMIGZvciBidWZmZXJlZCBJL08gKi8KLQlmb3IgKGJoID0gaW9lbmQtPmlvX2J1ZmZlcl9oZWFkOyBiaDsgYmggPSBuZXh0KSB7Ci0JCW5leHQgPSBiaC0+Yl9wcml2YXRlOwotCi0JCWJoLT5iX2VuZF9pbyA9IE5VTEw7Ci0JCWNsZWFyX2J1ZmZlcl91bndyaXR0ZW4oYmgpOwotCQllbmRfYnVmZmVyX2FzeW5jX3dyaXRlKGJoLCBpb2VuZC0+aW9fdXB0b2RhdGUpOwotCX0KLQogCXhmc19kZXN0cm95X2lvZW5kKGlvZW5kKTsKIH0KIApAQCAtMTQ5LDcgKzE3Niw4IEBACiAgKi8KIFNUQVRJQyB4ZnNfaW9lbmRfdCAqCiB4ZnNfYWxsb2NfaW9lbmQoCi0Jc3RydWN0IGlub2RlCQkqaW5vZGUpCisJc3RydWN0IGlub2RlCQkqaW5vZGUsCisJdW5zaWduZWQgaW50CQl0eXBlKQogewogCXhmc19pb2VuZF90CQkqaW9lbmQ7CiAKQEAgLTE2Miw0NSArMTkwLDI1IEBACiAJICovCiAJYXRvbWljX3NldCgmaW9lbmQtPmlvX3JlbWFpbmluZywgMSk7CiAJaW9lbmQtPmlvX3VwdG9kYXRlID0gMTsgLyogY2xlYXJlZCBpZiBhbnkgSS9PIGZhaWxzICovCisJaW9lbmQtPmlvX2xpc3QgPSBOVUxMOworCWlvZW5kLT5pb190eXBlID0gdHlwZTsKIAlpb2VuZC0+aW9fdm5vZGUgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKIAlpb2VuZC0+aW9fYnVmZmVyX2hlYWQgPSBOVUxMOworCWlvZW5kLT5pb19idWZmZXJfdGFpbCA9IE5VTEw7CiAJYXRvbWljX2luYygmaW9lbmQtPmlvX3Zub2RlLT52X2lvY291bnQpOwogCWlvZW5kLT5pb19vZmZzZXQgPSAwOwogCWlvZW5kLT5pb19zaXplID0gMDsKIAotCUlOSVRfV09SSygmaW9lbmQtPmlvX3dvcmssIHhmc19lbmRfYmlvX3Vud3JpdHRlbiwgaW9lbmQpOworCWlmICh0eXBlID09IElPTUFQX1VOV1JJVFRFTikKKwkJSU5JVF9XT1JLKCZpb2VuZC0+aW9fd29yaywgeGZzX2VuZF9iaW9fdW53cml0dGVuLCBpb2VuZCk7CisJZWxzZSBpZiAodHlwZSA9PSBJT01BUF9ERUxBWSkKKwkJSU5JVF9XT1JLKCZpb2VuZC0+aW9fd29yaywgeGZzX2VuZF9iaW9fZGVsYWxsb2MsIGlvZW5kKTsKKwllbHNlCisJCUlOSVRfV09SSygmaW9lbmQtPmlvX3dvcmssIHhmc19lbmRfYmlvX3dyaXR0ZW4sIGlvZW5kKTsKIAogCXJldHVybiBpb2VuZDsKIH0KIAotdm9pZAotbGludmZzX3Vud3JpdHRlbl9kb25lKAotCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsCi0JaW50CQkJdXB0b2RhdGUpCi17Ci0JeGZzX2lvZW5kX3QJCSppb2VuZCA9IGJoLT5iX3ByaXZhdGU7Ci0Jc3RhdGljIHNwaW5sb2NrX3QJdW53cml0dGVuX2RvbmVfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKLQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQotCUFTU0VSVChidWZmZXJfdW53cml0dGVuKGJoKSk7Ci0JYmgtPmJfZW5kX2lvID0gTlVMTDsKLQotCWlmICghdXB0b2RhdGUpCi0JCWlvZW5kLT5pb191cHRvZGF0ZSA9IDA7Ci0KLQkvKgotCSAqIERlZXAgbWFnaWMgaGVyZS4gIFdlIHJldXNlIGJfcHJpdmF0ZSBpbiB0aGUgYnVmZmVyX2hlYWRzIHRvIGJ1aWxkCi0JICogYSBjaGFpbiBmb3IgY29tcGxldGluZyB0aGUgSS9PIGZyb20gdXNlciBjb250ZXh0IGFmdGVyIHdlJ3ZlIGlzc3VlZAotCSAqIGEgdHJhbnNhY3Rpb24gdG8gY29udmVydCB0aGUgdW53cml0dGVuIGV4dGVudC4KLQkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdW53cml0dGVuX2RvbmVfbG9jaywgZmxhZ3MpOwotCWJoLT5iX3ByaXZhdGUgPSBpb2VuZC0+aW9fYnVmZmVyX2hlYWQ7Ci0JaW9lbmQtPmlvX2J1ZmZlcl9oZWFkID0gYmg7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdW53cml0dGVuX2RvbmVfbG9jaywgZmxhZ3MpOwotCi0JeGZzX2ZpbmlzaF9pb2VuZChpb2VuZCk7Ci19Ci0KIFNUQVRJQyBpbnQKIHhmc19tYXBfYmxvY2tzKAogCXN0cnVjdCBpbm9kZQkJKmlub2RlLApAQCAtMjE4LDEzOCArMjI2LDI4MyBAQAogCXJldHVybiAtZXJyb3I7CiB9CiAKLS8qCi0gKiBGaW5kcyB0aGUgY29ycmVzcG9uZGluZyBtYXBwaW5nIGluIGJsb2NrIEBtYXAgYXJyYXkgb2YgdGhlCi0gKiBnaXZlbiBAb2Zmc2V0IHdpdGhpbiBhIEBwYWdlLgotICovCi1TVEFUSUMgeGZzX2lvbWFwX3QgKgoteGZzX29mZnNldF90b19tYXAoCi0Jc3RydWN0IHBhZ2UJCSpwYWdlLAorU1RBVElDIGlubGluZSBpbnQKK3hmc19pb21hcF92YWxpZCgKIAl4ZnNfaW9tYXBfdAkJKmlvbWFwcCwKLQl1bnNpZ25lZCBsb25nCQlvZmZzZXQpCisJbG9mZl90CQkJb2Zmc2V0KQogewotCWxvZmZfdAkJCWZ1bGxfb2Zmc2V0OwkvKiBvZmZzZXQgZnJvbSBzdGFydCBvZiBmaWxlICovCisJcmV0dXJuIG9mZnNldCA+PSBpb21hcHAtPmlvbWFwX29mZnNldCAmJgorCQlvZmZzZXQgPCBpb21hcHAtPmlvbWFwX29mZnNldCArIGlvbWFwcC0+aW9tYXBfYnNpemU7Cit9CiAKLQlBU1NFUlQob2Zmc2V0IDwgUEFHRV9DQUNIRV9TSVpFKTsKKy8qCisgKiBCSU8gY29tcGxldGlvbiBoYW5kbGVyIGZvciBidWZmZXJlZCBJTy4KKyAqLworU1RBVElDIGludAoreGZzX2VuZF9iaW8oCisJc3RydWN0IGJpbwkJKmJpbywKKwl1bnNpZ25lZCBpbnQJCWJ5dGVzX2RvbmUsCisJaW50CQkJZXJyb3IpCit7CisJeGZzX2lvZW5kX3QJCSppb2VuZCA9IGJpby0+YmlfcHJpdmF0ZTsKIAotCWZ1bGxfb2Zmc2V0ID0gcGFnZS0+aW5kZXg7CQkvKiBOQjogdXNpbmcgNjRiaXQgbnVtYmVyICovCi0JZnVsbF9vZmZzZXQgPDw9IFBBR0VfQ0FDSEVfU0hJRlQ7CS8qIG9mZnNldCBmcm9tIGZpbGUgc3RhcnQgKi8KLQlmdWxsX29mZnNldCArPSBvZmZzZXQ7CQkJLyogb2Zmc2V0IGZyb20gcGFnZSBzdGFydCAqLworCWlmIChiaW8tPmJpX3NpemUpCisJCXJldHVybiAxOwogCi0JaWYgKGZ1bGxfb2Zmc2V0IDwgaW9tYXBwLT5pb21hcF9vZmZzZXQpCi0JCXJldHVybiBOVUxMOwotCWlmIChpb21hcHAtPmlvbWFwX29mZnNldCArIChpb21hcHAtPmlvbWFwX2JzaXplIC0xKSA+PSBmdWxsX29mZnNldCkKLQkJcmV0dXJuIGlvbWFwcDsKLQlyZXR1cm4gTlVMTDsKKwlBU1NFUlQoaW9lbmQpOworCUFTU0VSVChhdG9taWNfcmVhZCgmYmlvLT5iaV9jbnQpID49IDEpOworCisJLyogVG9zcyBiaW8gYW5kIHBhc3Mgd29yayBvZmYgdG8gYW4geGZzZGF0YWQgdGhyZWFkICovCisJaWYgKCF0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKSkKKwkJaW9lbmQtPmlvX3VwdG9kYXRlID0gMDsKKwliaW8tPmJpX3ByaXZhdGUgPSBOVUxMOworCWJpby0+YmlfZW5kX2lvID0gTlVMTDsKKworCWJpb19wdXQoYmlvKTsKKwl4ZnNfZmluaXNoX2lvZW5kKGlvZW5kKTsKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIHZvaWQKK3hmc19zdWJtaXRfaW9lbmRfYmlvKAorCXhmc19pb2VuZF90CSppb2VuZCwKKwlzdHJ1Y3QgYmlvCSpiaW8pCit7CisJYXRvbWljX2luYygmaW9lbmQtPmlvX3JlbWFpbmluZyk7CisKKwliaW8tPmJpX3ByaXZhdGUgPSBpb2VuZDsKKwliaW8tPmJpX2VuZF9pbyA9IHhmc19lbmRfYmlvOworCisJc3VibWl0X2JpbyhXUklURSwgYmlvKTsKKwlBU1NFUlQoIWJpb19mbGFnZ2VkKGJpbywgQklPX0VPUE5PVFNVUFApKTsKKwliaW9fcHV0KGJpbyk7Cit9CisKK1NUQVRJQyBzdHJ1Y3QgYmlvICoKK3hmc19hbGxvY19pb2VuZF9iaW8oCisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaCkKK3sKKwlzdHJ1Y3QgYmlvCQkqYmlvOworCWludAkJCW52ZWNzID0gYmlvX2dldF9ucl92ZWNzKGJoLT5iX2JkZXYpOworCisJZG8geworCQliaW8gPSBiaW9fYWxsb2MoR0ZQX05PSU8sIG52ZWNzKTsKKwkJbnZlY3MgPj49IDE7CisJfSB3aGlsZSAoIWJpbyk7CisKKwlBU1NFUlQoYmlvLT5iaV9wcml2YXRlID09IE5VTEwpOworCWJpby0+Ymlfc2VjdG9yID0gYmgtPmJfYmxvY2tuciAqIChiaC0+Yl9zaXplID4+IDkpOworCWJpby0+YmlfYmRldiA9IGJoLT5iX2JkZXY7CisJYmlvX2dldChiaW8pOworCXJldHVybiBiaW87Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfc3RhcnRfYnVmZmVyX3dyaXRlYmFjaygKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoKQoreworCUFTU0VSVChidWZmZXJfbWFwcGVkKGJoKSk7CisJQVNTRVJUKGJ1ZmZlcl9sb2NrZWQoYmgpKTsKKwlBU1NFUlQoIWJ1ZmZlcl9kZWxheShiaCkpOworCUFTU0VSVCghYnVmZmVyX3Vud3JpdHRlbihiaCkpOworCisJbWFya19idWZmZXJfYXN5bmNfd3JpdGUoYmgpOworCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfc3RhcnRfcGFnZV93cml0ZWJhY2soCisJc3RydWN0IHBhZ2UJCSpwYWdlLAorCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLAorCWludAkJCWNsZWFyX2RpcnR5LAorCWludAkJCWJ1ZmZlcnMpCit7CisJQVNTRVJUKFBhZ2VMb2NrZWQocGFnZSkpOworCUFTU0VSVCghUGFnZVdyaXRlYmFjayhwYWdlKSk7CisJc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCWlmIChjbGVhcl9kaXJ0eSkKKwkJY2xlYXJfcGFnZV9kaXJ0eShwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlpZiAoIWJ1ZmZlcnMpIHsKKwkJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCQl3YmMtPnBhZ2VzX3NraXBwZWQrKzsJLyogV2UgZGlkbid0IHdyaXRlIHRoaXMgcGFnZSAqLworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgYmlvX2FkZF9idWZmZXIoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXJldHVybiBiaW9fYWRkX3BhZ2UoYmlvLCBiaC0+Yl9wYWdlLCBiaC0+Yl9zaXplLCBiaF9vZmZzZXQoYmgpKTsKK30KKworLyoKKyAqIFN1Ym1pdCBhbGwgb2YgdGhlIGJpb3MgZm9yIGFsbCBvZiB0aGUgaW9lbmRzIHdlIGhhdmUgc2F2ZWQgdXAsIGNvdmVyaW5nIHRoZQorICogaW5pdGlhbCB3cml0ZXBhZ2UgcGFnZSBhbmQgYWxzbyBhbnkgcHJvYmVkIHBhZ2VzLgorICoKKyAqIEJlY2F1c2Ugd2UgbWF5IGhhdmUgbXVsdGlwbGUgaW9lbmRzIHNwYW5uaW5nIGEgcGFnZSwgd2UgbmVlZCB0byBzdGFydAorICogd3JpdGViYWNrIG9uIGFsbCB0aGUgYnVmZmVycyBiZWZvcmUgd2Ugc3VibWl0IHRoZW0gZm9yIEkvTy4gSWYgd2UgbWFyayB0aGUKKyAqIGJ1ZmZlcnMgYXMgd2UgZ290LCB0aGVuIHdlIGNhbiBlbmQgdXAgd2l0aCBhIHBhZ2UgdGhhdCBvbmx5IGhhcyBidWZmZXJzCisgKiBtYXJrZWQgYXN5bmMgd3JpdGUgYW5kIEkvTyBjb21wbGV0ZSBvbiBjYW4gb2NjdXIgYmVmb3JlIHdlIG1hcmsgdGhlIG90aGVyCisgKiBidWZmZXJzIGFzeW5jIHdyaXRlLgorICoKKyAqIFRoZSBlbmQgcmVzdWx0IG9mIHRoaXMgaXMgdGhhdCB3ZSB0cmlwIGEgYnVnIGluIGVuZF9wYWdlX3dyaXRlYmFjaygpIGJlY2F1c2UKKyAqIHdlIGNhbGwgaXQgdHdpY2UgZm9yIHRoZSBvbmUgcGFnZSBhcyB0aGUgY29kZSBpbiBlbmRfYnVmZmVyX2FzeW5jX3dyaXRlKCkKKyAqIGFzc3VtZXMgdGhhdCBhbGwgYnVmZmVycyBvbiB0aGUgcGFnZSBhcmUgc3RhcnRlZCBhdCB0aGUgc2FtZSB0aW1lLgorICoKKyAqIFRoZSBmaXggaXMgdHdvIHBhc3NlcyBhY3Jvc3MgdGhlIGlvZW5kIGxpc3QgLSBvbmUgdG8gc3RhcnQgd3JpdGViYWNrIG9uIHRoZQorICogYnVmZmVyaGVhZHMsIGFuZCB0aGVuIHRoZSBzZWNvbmQgb25lIHN1Ym1pdCB0aGVtIGZvciBJL08uCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfc3VibWl0X2lvZW5kKAorCXhmc19pb2VuZF90CQkqaW9lbmQpCit7CisJeGZzX2lvZW5kX3QJCSpoZWFkID0gaW9lbmQ7CisJeGZzX2lvZW5kX3QJCSpuZXh0OworCXN0cnVjdCBidWZmZXJfaGVhZAkqYmg7CisJc3RydWN0IGJpbwkJKmJpbzsKKwlzZWN0b3JfdAkJbGFzdGJsb2NrID0gMDsKKworCS8qIFBhc3MgMSAtIHN0YXJ0IHdyaXRlYmFjayAqLworCWRvIHsKKwkJbmV4dCA9IGlvZW5kLT5pb19saXN0OworCQlmb3IgKGJoID0gaW9lbmQtPmlvX2J1ZmZlcl9oZWFkOyBiaDsgYmggPSBiaC0+Yl9wcml2YXRlKSB7CisJCQl4ZnNfc3RhcnRfYnVmZmVyX3dyaXRlYmFjayhiaCk7CisJCX0KKwl9IHdoaWxlICgoaW9lbmQgPSBuZXh0KSAhPSBOVUxMKTsKKworCS8qIFBhc3MgMiAtIHN1Ym1pdCBJL08gKi8KKwlpb2VuZCA9IGhlYWQ7CisJZG8geworCQluZXh0ID0gaW9lbmQtPmlvX2xpc3Q7CisJCWJpbyA9IE5VTEw7CisKKwkJZm9yIChiaCA9IGlvZW5kLT5pb19idWZmZXJfaGVhZDsgYmg7IGJoID0gYmgtPmJfcHJpdmF0ZSkgeworCisJCQlpZiAoIWJpbykgeworIHJldHJ5OgorCQkJCWJpbyA9IHhmc19hbGxvY19pb2VuZF9iaW8oYmgpOworCQkJfSBlbHNlIGlmIChiaC0+Yl9ibG9ja25yICE9IGxhc3RibG9jayArIDEpIHsKKwkJCQl4ZnNfc3VibWl0X2lvZW5kX2Jpbyhpb2VuZCwgYmlvKTsKKwkJCQlnb3RvIHJldHJ5OworCQkJfQorCisJCQlpZiAoYmlvX2FkZF9idWZmZXIoYmlvLCBiaCkgIT0gYmgtPmJfc2l6ZSkgeworCQkJCXhmc19zdWJtaXRfaW9lbmRfYmlvKGlvZW5kLCBiaW8pOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisKKwkJCWxhc3RibG9jayA9IGJoLT5iX2Jsb2NrbnI7CisJCX0KKwkJaWYgKGJpbykKKwkJCXhmc19zdWJtaXRfaW9lbmRfYmlvKGlvZW5kLCBiaW8pOworCQl4ZnNfZmluaXNoX2lvZW5kKGlvZW5kKTsKKwl9IHdoaWxlICgoaW9lbmQgPSBuZXh0KSAhPSBOVUxMKTsKK30KKworLyoKKyAqIENhbmNlbCBzdWJtaXNzaW9uIG9mIGFsbCBidWZmZXJfaGVhZHMgc28gZmFyIGluIHRoaXMgZW5kaW8uCisgKiBUb3NzIHRoZSBlbmRpbyB0b28uICBPbmx5IGV2ZXIgY2FsbGVkIGZvciB0aGUgaW5pdGlhbCBwYWdlCisgKiBpbiBhIHdyaXRlcGFnZSByZXF1ZXN0LCBzbyBvbmx5IGV2ZXIgb25lIHBhZ2UuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfY2FuY2VsX2lvZW5kKAorCXhmc19pb2VuZF90CQkqaW9lbmQpCit7CisJeGZzX2lvZW5kX3QJCSpuZXh0OworCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsICpuZXh0X2JoOworCisJZG8geworCQluZXh0ID0gaW9lbmQtPmlvX2xpc3Q7CisJCWJoID0gaW9lbmQtPmlvX2J1ZmZlcl9oZWFkOworCQlkbyB7CisJCQluZXh0X2JoID0gYmgtPmJfcHJpdmF0ZTsKKwkJCWNsZWFyX2J1ZmZlcl9hc3luY193cml0ZShiaCk7CisJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJfSB3aGlsZSAoKGJoID0gbmV4dF9iaCkgIT0gTlVMTCk7CisKKwkJdm5faW93YWtlKGlvZW5kLT5pb192bm9kZSk7CisJCW1lbXBvb2xfZnJlZShpb2VuZCwgeGZzX2lvZW5kX3Bvb2wpOworCX0gd2hpbGUgKChpb2VuZCA9IG5leHQpICE9IE5VTEwpOworfQorCisvKgorICogVGVzdCB0byBzZWUgaWYgd2UndmUgYmVlbiBidWlsZGluZyB1cCBhIGNvbXBsZXRpb24gc3RydWN0dXJlIGZvcgorICogZWFybGllciBidWZmZXJzIC0tIGlmIHNvLCB3ZSB0cnkgdG8gYXBwZW5kIHRvIHRoaXMgaW9lbmQgaWYgd2UKKyAqIGNhbiwgb3RoZXJ3aXNlIHdlIGZpbmlzaCBvZmYgYW55IGN1cnJlbnQgaW9lbmQgYW5kIHN0YXJ0IGFub3RoZXIuCisgKiBSZXR1cm4gdHJ1ZSBpZiB3ZSd2ZSBmaW5pc2hlZCB0aGUgZ2l2ZW4gaW9lbmQuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYWRkX3RvX2lvZW5kKAorCXN0cnVjdCBpbm9kZQkJKmlub2RlLAorCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsCisJeGZzX29mZl90CQlvZmZzZXQsCisJdW5zaWduZWQgaW50CQl0eXBlLAorCXhmc19pb2VuZF90CQkqKnJlc3VsdCwKKwlpbnQJCQluZWVkX2lvZW5kKQoreworCXhmc19pb2VuZF90CQkqaW9lbmQgPSAqcmVzdWx0OworCisJaWYgKCFpb2VuZCB8fCBuZWVkX2lvZW5kIHx8IHR5cGUgIT0gaW9lbmQtPmlvX3R5cGUpIHsKKwkJeGZzX2lvZW5kX3QJKnByZXZpb3VzID0gKnJlc3VsdDsKKworCQlpb2VuZCA9IHhmc19hbGxvY19pb2VuZChpbm9kZSwgdHlwZSk7CisJCWlvZW5kLT5pb19vZmZzZXQgPSBvZmZzZXQ7CisJCWlvZW5kLT5pb19idWZmZXJfaGVhZCA9IGJoOworCQlpb2VuZC0+aW9fYnVmZmVyX3RhaWwgPSBiaDsKKwkJaWYgKHByZXZpb3VzKQorCQkJcHJldmlvdXMtPmlvX2xpc3QgPSBpb2VuZDsKKwkJKnJlc3VsdCA9IGlvZW5kOworCX0gZWxzZSB7CisJCWlvZW5kLT5pb19idWZmZXJfdGFpbC0+Yl9wcml2YXRlID0gYmg7CisJCWlvZW5kLT5pb19idWZmZXJfdGFpbCA9IGJoOworCX0KKworCWJoLT5iX3ByaXZhdGUgPSBOVUxMOworCWlvZW5kLT5pb19zaXplICs9IGJoLT5iX3NpemU7CiB9CiAKIFNUQVRJQyB2b2lkCiB4ZnNfbWFwX2F0X29mZnNldCgKLQlzdHJ1Y3QgcGFnZQkJKnBhZ2UsCiAJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaCwKLQl1bnNpZ25lZCBsb25nCQlvZmZzZXQsCisJbG9mZl90CQkJb2Zmc2V0LAogCWludAkJCWJsb2NrX2JpdHMsCiAJeGZzX2lvbWFwX3QJCSppb21hcHApCiB7CiAJeGZzX2RhZGRyX3QJCWJuOwotCWxvZmZfdAkJCWRlbHRhOwogCWludAkJCXNlY3Rvcl9zaGlmdDsKIAogCUFTU0VSVCghKGlvbWFwcC0+aW9tYXBfZmxhZ3MgJiBJT01BUF9IT0xFKSk7CiAJQVNTRVJUKCEoaW9tYXBwLT5pb21hcF9mbGFncyAmIElPTUFQX0RFTEFZKSk7CiAJQVNTRVJUKGlvbWFwcC0+aW9tYXBfYm4gIT0gSU9NQVBfREFERFJfTlVMTCk7CiAKLQlkZWx0YSA9IHBhZ2UtPmluZGV4OwotCWRlbHRhIDw8PSBQQUdFX0NBQ0hFX1NISUZUOwotCWRlbHRhICs9IG9mZnNldDsKLQlkZWx0YSAtPSBpb21hcHAtPmlvbWFwX29mZnNldDsKLQlkZWx0YSA+Pj0gYmxvY2tfYml0czsKLQogCXNlY3Rvcl9zaGlmdCA9IGJsb2NrX2JpdHMgLSBCQlNISUZUOwotCWJuID0gaW9tYXBwLT5pb21hcF9ibiA+PiBzZWN0b3Jfc2hpZnQ7Ci0JYm4gKz0gZGVsdGE7Ci0JQlVHX09OKCFibiAmJiAhKGlvbWFwcC0+aW9tYXBfZmxhZ3MgJiBJT01BUF9SRUFMVElNRSkpOworCWJuID0gKGlvbWFwcC0+aW9tYXBfYm4gPj4gc2VjdG9yX3NoaWZ0KSArCisJICAgICAgKChvZmZzZXQgLSBpb21hcHAtPmlvbWFwX29mZnNldCkgPj4gYmxvY2tfYml0cyk7CisKKwlBU1NFUlQoYm4gfHwgKGlvbWFwcC0+aW9tYXBfZmxhZ3MgJiBJT01BUF9SRUFMVElNRSkpOwogCUFTU0VSVCgoYm4gPDwgc2VjdG9yX3NoaWZ0KSA+PSBpb21hcHAtPmlvbWFwX2JuKTsKIAogCWxvY2tfYnVmZmVyKGJoKTsKIAliaC0+Yl9ibG9ja25yID0gYm47Ci0JYmgtPmJfYmRldiA9IGlvbWFwcC0+aW9tYXBfdGFyZ2V0LT5wYnJfYmRldjsKKwliaC0+Yl9iZGV2ID0gaW9tYXBwLT5pb21hcF90YXJnZXQtPmJ0X2JkZXY7CiAJc2V0X2J1ZmZlcl9tYXBwZWQoYmgpOwogCWNsZWFyX2J1ZmZlcl9kZWxheShiaCk7CisJY2xlYXJfYnVmZmVyX3Vud3JpdHRlbihiaCk7CiB9CiAKIC8qCi0gKiBMb29rIGZvciBhIHBhZ2UgYXQgaW5kZXggd2hpY2ggaXMgdW5sb2NrZWQgYW5kIGNvbnRhaW5zIG91cgotICogdW53cml0dGVuIGV4dGVudCBmbGFnZ2VkIGJ1ZmZlcnMgYXQgaXRzIGhlYWQuICBSZXR1cm5zIHBhZ2UKLSAqIGxvY2tlZCBhbmQgd2l0aCBhbiBleHRyYSByZWZlcmVuY2UgY291bnQsIGFuZCBsZW5ndGggb2YgdGhlCi0gKiB1bndyaXR0ZW4gZXh0ZW50IGNvbXBvbmVudCBvbiB0aGlzIHBhZ2UgdGhhdCB3ZSBjYW4gd3JpdGUsCi0gKiBpbiB1bml0cyBvZiBmaWxlc3lzdGVtIGJsb2Nrcy4KLSAqLwotU1RBVElDIHN0cnVjdCBwYWdlICoKLXhmc19wcm9iZV91bndyaXR0ZW5fcGFnZSgKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZQkqbWFwcGluZywKLQlwZ29mZl90CQkJaW5kZXgsCi0JeGZzX2lvbWFwX3QJCSppb21hcHAsCi0JeGZzX2lvZW5kX3QJCSppb2VuZCwKLQl1bnNpZ25lZCBsb25nCQltYXhfb2Zmc2V0LAotCXVuc2lnbmVkIGxvbmcJCSpmc2JzLAotCXVuc2lnbmVkIGludCAgICAgICAgICAgIGJiaXRzKQotewotCXN0cnVjdCBwYWdlCQkqcGFnZTsKLQotCXBhZ2UgPSBmaW5kX3RyeWxvY2tfcGFnZShtYXBwaW5nLCBpbmRleCk7Ci0JaWYgKCFwYWdlKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSkKLQkJZ290byBvdXQ7Ci0KLQlpZiAocGFnZS0+bWFwcGluZyAmJiBwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7Ci0JCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsICpoZWFkOwotCQl1bnNpZ25lZCBsb25nCQlwX29mZnNldCA9IDA7Ci0KLQkJKmZzYnMgPSAwOwotCQliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7Ci0JCWRvIHsKLQkJCWlmICghYnVmZmVyX3Vud3JpdHRlbihiaCkgfHwgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoIXhmc19vZmZzZXRfdG9fbWFwKHBhZ2UsIGlvbWFwcCwgcF9vZmZzZXQpKQotCQkJCWJyZWFrOwotCQkJaWYgKHBfb2Zmc2V0ID49IG1heF9vZmZzZXQpCi0JCQkJYnJlYWs7Ci0JCQl4ZnNfbWFwX2F0X29mZnNldChwYWdlLCBiaCwgcF9vZmZzZXQsIGJiaXRzLCBpb21hcHApOwotCQkJc2V0X2J1ZmZlcl91bndyaXR0ZW5faW8oYmgpOwotCQkJYmgtPmJfcHJpdmF0ZSA9IGlvZW5kOwotCQkJcF9vZmZzZXQgKz0gYmgtPmJfc2l6ZTsKLQkJCSgqZnNicykrKzsKLQkJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKLQotCQlpZiAocF9vZmZzZXQpCi0JCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLW91dDoKLQl1bmxvY2tfcGFnZShwYWdlKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIExvb2sgZm9yIGEgcGFnZSBhdCBpbmRleCB3aGljaCBpcyB1bmxvY2tlZCBhbmQgbm90IG1hcHBlZAotICogeWV0IC0gY2x1c3RlcmluZyBmb3IgbW1hcCB3cml0ZSBjYXNlLgorICogTG9vayBmb3IgYSBwYWdlIGF0IGluZGV4IHRoYXQgaXMgc3VpdGFibGUgZm9yIGNsdXN0ZXJpbmcuCiAgKi8KIFNUQVRJQyB1bnNpZ25lZCBpbnQKLXhmc19wcm9iZV91bm1hcHBlZF9wYWdlKAotCXN0cnVjdCBhZGRyZXNzX3NwYWNlCSptYXBwaW5nLAotCXBnb2ZmX3QJCQlpbmRleCwKLQl1bnNpZ25lZCBpbnQJCXBnX29mZnNldCkKK3hmc19wcm9iZV9wYWdlKAorCXN0cnVjdCBwYWdlCQkqcGFnZSwKKwl1bnNpZ25lZCBpbnQJCXBnX29mZnNldCwKKwlpbnQJCQltYXBwZWQpCiB7Ci0Jc3RydWN0IHBhZ2UJCSpwYWdlOwogCWludAkJCXJldCA9IDA7CiAKLQlwYWdlID0gZmluZF90cnlsb2NrX3BhZ2UobWFwcGluZywgaW5kZXgpOwotCWlmICghcGFnZSkKLQkJcmV0dXJuIDA7CiAJaWYgKFBhZ2VXcml0ZWJhY2socGFnZSkpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gMDsKIAogCWlmIChwYWdlLT5tYXBwaW5nICYmIFBhZ2VEaXJ0eShwYWdlKSkgewogCQlpZiAocGFnZV9oYXNfYnVmZmVycyhwYWdlKSkgewpAQCAtMzU3LDc5ICs1MTAsMTAxIEBACiAKIAkJCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKIAkJCWRvIHsKLQkJCQlpZiAoYnVmZmVyX21hcHBlZChiaCkgfHwgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQkJCQlicmVhazsKKwkJCQlpZiAobWFwcGVkICE9IGJ1ZmZlcl9tYXBwZWQoYmgpKQogCQkJCQlicmVhazsKIAkJCQlyZXQgKz0gYmgtPmJfc2l6ZTsKIAkJCQlpZiAocmV0ID49IHBnX29mZnNldCkKIAkJCQkJYnJlYWs7CiAJCQl9IHdoaWxlICgoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOwogCQl9IGVsc2UKLQkJCXJldCA9IFBBR0VfQ0FDSEVfU0laRTsKKwkJCXJldCA9IG1hcHBlZCA/IDAgOiBQQUdFX0NBQ0hFX1NJWkU7CiAJfQogCi1vdXQ6Ci0JdW5sb2NrX3BhZ2UocGFnZSk7CiAJcmV0dXJuIHJldDsKIH0KIAotU1RBVElDIHVuc2lnbmVkIGludAoteGZzX3Byb2JlX3VubWFwcGVkX2NsdXN0ZXIoCitTVEFUSUMgc2l6ZV90Cit4ZnNfcHJvYmVfY2x1c3RlcigKIAlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKIAlzdHJ1Y3QgcGFnZQkJKnN0YXJ0cGFnZSwKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoLAotCXN0cnVjdCBidWZmZXJfaGVhZAkqaGVhZCkKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmhlYWQsCisJaW50CQkJbWFwcGVkKQogeworCXN0cnVjdCBwYWdldmVjCQlwdmVjOwogCXBnb2ZmX3QJCQl0aW5kZXgsIHRsYXN0LCB0bG9mZjsKLQl1bnNpZ25lZCBpbnQJCXBnX29mZnNldCwgbGVuLCB0b3RhbCA9IDA7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UJKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCXNpemVfdAkJCXRvdGFsID0gMDsKKwlpbnQJCQlkb25lID0gMCwgaTsKIAogCS8qIEZpcnN0IHN1bSBmb3J3YXJkcyBpbiB0aGlzIHBhZ2UgKi8KIAlkbyB7Ci0JCWlmIChidWZmZXJfbWFwcGVkKGJoKSkKLQkJCWJyZWFrOworCQlpZiAobWFwcGVkICE9IGJ1ZmZlcl9tYXBwZWQoYmgpKQorCQkJcmV0dXJuIHRvdGFsOwogCQl0b3RhbCArPSBiaC0+Yl9zaXplOwogCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CiAKLQkvKiBJZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHBhZ2UsIHN1bSBmb3J3YXJkcyBpbgotCSAqIGZvbGxvd2luZyBwYWdlcy4KLQkgKi8KLQlpZiAoYmggPT0gaGVhZCkgewotCQl0bGFzdCA9IGlfc2l6ZV9yZWFkKGlub2RlKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCQkvKiBQcnVuZSB0aGlzIGJhY2sgdG8gYXZvaWQgcGF0aG9sb2dpY2FsIGJlaGF2aW9yICovCi0JCXRsb2ZmID0gbWluKHRsYXN0LCBzdGFydHBhZ2UtPmluZGV4ICsgNjQpOwotCQlmb3IgKHRpbmRleCA9IHN0YXJ0cGFnZS0+aW5kZXggKyAxOyB0aW5kZXggPCB0bG9mZjsgdGluZGV4KyspIHsKLQkJCWxlbiA9IHhmc19wcm9iZV91bm1hcHBlZF9wYWdlKG1hcHBpbmcsIHRpbmRleCwKLQkJCQkJCQlQQUdFX0NBQ0hFX1NJWkUpOwotCQkJaWYgKCFsZW4pCi0JCQkJcmV0dXJuIHRvdGFsOworCS8qIGlmIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgcGFnZSwgc3VtIGZvcndhcmRzIGluIGZvbGxvd2luZyBwYWdlcyAqLworCXRsYXN0ID0gaV9zaXplX3JlYWQoaW5vZGUpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJdGluZGV4ID0gc3RhcnRwYWdlLT5pbmRleCArIDE7CisKKwkvKiBQcnVuZSB0aGlzIGJhY2sgdG8gYXZvaWQgcGF0aG9sb2dpY2FsIGJlaGF2aW9yICovCisJdGxvZmYgPSBtaW4odGxhc3QsIHN0YXJ0cGFnZS0+aW5kZXggKyA2NCk7CisKKwlwYWdldmVjX2luaXQoJnB2ZWMsIDApOworCXdoaWxlICghZG9uZSAmJiB0aW5kZXggPD0gdGxvZmYpIHsKKwkJdW5zaWduZWQgbGVuID0gbWluX3QocGdvZmZfdCwgUEFHRVZFQ19TSVpFLCB0bGFzdCAtIHRpbmRleCArIDEpOworCisJCWlmICghcGFnZXZlY19sb29rdXAoJnB2ZWMsIGlub2RlLT5pX21hcHBpbmcsIHRpbmRleCwgbGVuKSkKKwkJCWJyZWFrOworCisJCWZvciAoaSA9IDA7IGkgPCBwYWdldmVjX2NvdW50KCZwdmVjKTsgaSsrKSB7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB2ZWMucGFnZXNbaV07CisJCQlzaXplX3QgcGdfb2Zmc2V0LCBsZW4gPSAwOworCisJCQlpZiAodGluZGV4ID09IHRsYXN0KSB7CisJCQkJcGdfb2Zmc2V0ID0KKwkJCQkgICAgaV9zaXplX3JlYWQoaW5vZGUpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCQkJCWlmICghcGdfb2Zmc2V0KSB7CisJCQkJCWRvbmUgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlwZ19vZmZzZXQgPSBQQUdFX0NBQ0hFX1NJWkU7CisKKwkJCWlmIChwYWdlLT5pbmRleCA9PSB0aW5kZXggJiYgIVRlc3RTZXRQYWdlTG9ja2VkKHBhZ2UpKSB7CisJCQkJbGVuID0geGZzX3Byb2JlX3BhZ2UocGFnZSwgcGdfb2Zmc2V0LCBtYXBwZWQpOworCQkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJfQorCisJCQlpZiAoIWxlbikgeworCQkJCWRvbmUgPSAxOworCQkJCWJyZWFrOworCQkJfQorCiAJCQl0b3RhbCArPSBsZW47CisJCQl0aW5kZXgrKzsKIAkJfQotCQlpZiAodGluZGV4ID09IHRsYXN0ICYmCi0JCSAgICAocGdfb2Zmc2V0ID0gaV9zaXplX3JlYWQoaW5vZGUpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSkgewotCQkJdG90YWwgKz0geGZzX3Byb2JlX3VubWFwcGVkX3BhZ2UobWFwcGluZywKLQkJCQkJCQl0aW5kZXgsIHBnX29mZnNldCk7Ci0JCX0KKworCQlwYWdldmVjX3JlbGVhc2UoJnB2ZWMpOworCQljb25kX3Jlc2NoZWQoKTsKIAl9CisKIAlyZXR1cm4gdG90YWw7CiB9CiAKIC8qCi0gKiBQcm9iZSBmb3IgYSBnaXZlbiBwYWdlIChpbmRleCkgaW4gdGhlIGlub2RlIGFuZCB0ZXN0IGlmIGl0IGlzIGRlbGF5ZWQKLSAqIGFuZCB3aXRob3V0IHVud3JpdHRlbiBidWZmZXJzLiAgUmV0dXJucyBwYWdlIGxvY2tlZCBhbmQgd2l0aCBhbiBleHRyYQotICogcmVmZXJlbmNlIGNvdW50LgorICogVGVzdCBpZiBhIGdpdmVuIHBhZ2UgaXMgc3VpdGFibGUgZm9yIHdyaXRpbmcgYXMgcGFydCBvZiBhbiB1bndyaXR0ZW4KKyAqIG9yIGRlbGF5ZWQgYWxsb2NhdGUgZXh0ZW50LgogICovCi1TVEFUSUMgc3RydWN0IHBhZ2UgKgoteGZzX3Byb2JlX2RlbGFsbG9jX3BhZ2UoCi0Jc3RydWN0IGlub2RlCQkqaW5vZGUsCi0JcGdvZmZfdAkJCWluZGV4KQorU1RBVElDIGludAoreGZzX2lzX2RlbGF5ZWRfcGFnZSgKKwlzdHJ1Y3QgcGFnZQkJKnBhZ2UsCisJdW5zaWduZWQgaW50CQl0eXBlKQogewotCXN0cnVjdCBwYWdlCQkqcGFnZTsKLQotCXBhZ2UgPSBmaW5kX3RyeWxvY2tfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpbmRleCk7Ci0JaWYgKCFwYWdlKQotCQlyZXR1cm4gTlVMTDsKIAlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSkKLQkJZ290byBvdXQ7CisJCXJldHVybiAwOwogCiAJaWYgKHBhZ2UtPm1hcHBpbmcgJiYgcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkgewogCQlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoLCAqaGVhZDsKQEAgLTQzNywyNDMgKzYxMiwxNTYgQEAKIAogCQliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CiAJCWRvIHsKLQkJCWlmIChidWZmZXJfdW53cml0dGVuKGJoKSkgewotCQkJCWFjY2VwdGFibGUgPSAwOworCQkJaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpKQorCQkJCWFjY2VwdGFibGUgPSAodHlwZSA9PSBJT01BUF9VTldSSVRURU4pOworCQkJZWxzZSBpZiAoYnVmZmVyX2RlbGF5KGJoKSkKKwkJCQlhY2NlcHRhYmxlID0gKHR5cGUgPT0gSU9NQVBfREVMQVkpOworCQkJZWxzZSBpZiAoYnVmZmVyX21hcHBlZChiaCkpCisJCQkJYWNjZXB0YWJsZSA9ICh0eXBlID09IDApOworCQkJZWxzZQogCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChidWZmZXJfZGVsYXkoYmgpKSB7Ci0JCQkJYWNjZXB0YWJsZSA9IDE7Ci0JCQl9CiAJCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CiAKIAkJaWYgKGFjY2VwdGFibGUpCi0JCQlyZXR1cm4gcGFnZTsKKwkJCXJldHVybiAxOwogCX0KIAotb3V0OgotCXVubG9ja19wYWdlKHBhZ2UpOwotCXJldHVybiBOVUxMOwotfQotCi1TVEFUSUMgaW50Ci14ZnNfbWFwX3Vud3JpdHRlbigKLQlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKLQlzdHJ1Y3QgcGFnZQkJKnN0YXJ0X3BhZ2UsCi0Jc3RydWN0IGJ1ZmZlcl9oZWFkCSpoZWFkLAotCXN0cnVjdCBidWZmZXJfaGVhZAkqY3VyciwKLQl1bnNpZ25lZCBsb25nCQlwX29mZnNldCwKLQlpbnQJCQlibG9ja19iaXRzLAotCXhmc19pb21hcF90CQkqaW9tYXBwLAotCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLAotCWludAkJCXN0YXJ0aW8sCi0JaW50CQkJYWxsX2JoKQotewotCXN0cnVjdCBidWZmZXJfaGVhZAkqYmggPSBjdXJyOwotCXhmc19pb21hcF90CQkqdG1wOwotCXhmc19pb2VuZF90CQkqaW9lbmQ7Ci0JbG9mZl90CQkJb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcJCW5ibG9ja3MgPSAwOwotCi0Jb2Zmc2V0ID0gc3RhcnRfcGFnZS0+aW5kZXg7Ci0Jb2Zmc2V0IDw8PSBQQUdFX0NBQ0hFX1NISUZUOwotCW9mZnNldCArPSBwX29mZnNldDsKLQotCWlvZW5kID0geGZzX2FsbG9jX2lvZW5kKGlub2RlKTsKLQotCS8qIEZpcnN0IG1hcCBmb3J3YXJkcyBpbiB0aGUgcGFnZSBjb25zZWN1dGl2ZSBidWZmZXJzCi0JICogY292ZXJpbmcgdGhpcyB1bndyaXR0ZW4gZXh0ZW50Ci0JICovCi0JZG8gewotCQlpZiAoIWJ1ZmZlcl91bndyaXR0ZW4oYmgpKQotCQkJYnJlYWs7Ci0JCXRtcCA9IHhmc19vZmZzZXRfdG9fbWFwKHN0YXJ0X3BhZ2UsIGlvbWFwcCwgcF9vZmZzZXQpOwotCQlpZiAoIXRtcCkKLQkJCWJyZWFrOwotCQl4ZnNfbWFwX2F0X29mZnNldChzdGFydF9wYWdlLCBiaCwgcF9vZmZzZXQsIGJsb2NrX2JpdHMsIGlvbWFwcCk7Ci0JCXNldF9idWZmZXJfdW53cml0dGVuX2lvKGJoKTsKLQkJYmgtPmJfcHJpdmF0ZSA9IGlvZW5kOwotCQlwX29mZnNldCArPSBiaC0+Yl9zaXplOwotCQluYmxvY2tzKys7Ci0JfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKLQotCWF0b21pY19hZGQobmJsb2NrcywgJmlvZW5kLT5pb19yZW1haW5pbmcpOwotCi0JLyogSWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBwYWdlLCBtYXAgZm9yd2FyZHMgaW4gYW55Ci0JICogZm9sbG93aW5nIHBhZ2VzIHdoaWNoIGFyZSBhbHNvIGNvdmVyZWQgYnkgdGhpcyBleHRlbnQuCi0JICovCi0JaWYgKGJoID09IGhlYWQpIHsKLQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UJKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwotCQlwZ29mZl90CQkJdGluZGV4LCB0bG9mZiwgdGxhc3Q7Ci0JCXVuc2lnbmVkIGxvbmcJCWJzOwotCQl1bnNpZ25lZCBpbnQJCXBnX29mZnNldCwgYmJpdHMgPSBpbm9kZS0+aV9ibGtiaXRzOwotCQlzdHJ1Y3QgcGFnZQkJKnBhZ2U7Ci0KLQkJdGxhc3QgPSBpX3NpemVfcmVhZChpbm9kZSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQkJdGxvZmYgPSAoaW9tYXBwLT5pb21hcF9vZmZzZXQgKyBpb21hcHAtPmlvbWFwX2JzaXplKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCQl0bG9mZiA9IG1pbih0bGFzdCwgdGxvZmYpOwotCQlmb3IgKHRpbmRleCA9IHN0YXJ0X3BhZ2UtPmluZGV4ICsgMTsgdGluZGV4IDwgdGxvZmY7IHRpbmRleCsrKSB7Ci0JCQlwYWdlID0geGZzX3Byb2JlX3Vud3JpdHRlbl9wYWdlKG1hcHBpbmcsCi0JCQkJCQl0aW5kZXgsIGlvbWFwcCwgaW9lbmQsCi0JCQkJCQlQQUdFX0NBQ0hFX1NJWkUsICZicywgYmJpdHMpOwotCQkJaWYgKCFwYWdlKQotCQkJCWJyZWFrOwotCQkJbmJsb2NrcyArPSBiczsKLQkJCWF0b21pY19hZGQoYnMsICZpb2VuZC0+aW9fcmVtYWluaW5nKTsKLQkJCXhmc19jb252ZXJ0X3BhZ2UoaW5vZGUsIHBhZ2UsIGlvbWFwcCwgd2JjLCBpb2VuZCwKLQkJCQkJCQlzdGFydGlvLCBhbGxfYmgpOwotCQkJLyogc3RvcCBpZiBjb252ZXJ0aW5nIHRoZSBuZXh0IHBhZ2UgbWlnaHQgYWRkCi0JCQkgKiBlbm91Z2ggYmxvY2tzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgYnl0ZQotCQkJICogY291bnQgd29uJ3QgZml0IGluIG91ciB1bG9uZyBwYWdlIGJ1ZiBsZW5ndGggKi8KLQkJCWlmIChuYmxvY2tzID49ICgoVUxPTkdfTUFYIC0gUEFHRV9TSVpFKSA+PiBibG9ja19iaXRzKSkKLQkJCQlnb3RvIGVub3VnaDsKLQkJfQotCi0JCWlmICh0aW5kZXggPT0gdGxhc3QgJiYKLQkJICAgIChwZ19vZmZzZXQgPSAoaV9zaXplX3JlYWQoaW5vZGUpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSkpIHsKLQkJCXBhZ2UgPSB4ZnNfcHJvYmVfdW53cml0dGVuX3BhZ2UobWFwcGluZywKLQkJCQkJCQl0aW5kZXgsIGlvbWFwcCwgaW9lbmQsCi0JCQkJCQkJcGdfb2Zmc2V0LCAmYnMsIGJiaXRzKTsKLQkJCWlmIChwYWdlKSB7Ci0JCQkJbmJsb2NrcyArPSBiczsKLQkJCQlhdG9taWNfYWRkKGJzLCAmaW9lbmQtPmlvX3JlbWFpbmluZyk7Ci0JCQkJeGZzX2NvbnZlcnRfcGFnZShpbm9kZSwgcGFnZSwgaW9tYXBwLCB3YmMsIGlvZW5kLAotCQkJCQkJCXN0YXJ0aW8sIGFsbF9iaCk7Ci0JCQkJaWYgKG5ibG9ja3MgPj0gKChVTE9OR19NQVggLSBQQUdFX1NJWkUpID4+IGJsb2NrX2JpdHMpKQotCQkJCQlnb3RvIGVub3VnaDsKLQkJCX0KLQkJfQotCX0KLQotZW5vdWdoOgotCWlvZW5kLT5pb19zaXplID0gKHhmc19vZmZfdCluYmxvY2tzIDw8IGJsb2NrX2JpdHM7Ci0JaW9lbmQtPmlvX29mZnNldCA9IG9mZnNldDsKLQl4ZnNfZmluaXNoX2lvZW5kKGlvZW5kKTsKIAlyZXR1cm4gMDsKIH0KIAotU1RBVElDIHZvaWQKLXhmc19zdWJtaXRfcGFnZSgKLQlzdHJ1Y3QgcGFnZQkJKnBhZ2UsCi0Jc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsCi0Jc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaF9hcnJbXSwKLQlpbnQJCQliaF9jb3VudCwKLQlpbnQJCQlwcm9iZWRfcGFnZSwKLQlpbnQJCQljbGVhcl9kaXJ0eSkKLXsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoOwotCWludAkJCWk7Ci0KLQlCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7Ci0JaWYgKGJoX2NvdW50KQotCQlzZXRfcGFnZV93cml0ZWJhY2socGFnZSk7Ci0JaWYgKGNsZWFyX2RpcnR5KQotCQljbGVhcl9wYWdlX2RpcnR5KHBhZ2UpOwotCXVubG9ja19wYWdlKHBhZ2UpOwotCi0JaWYgKGJoX2NvdW50KSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBiaF9jb3VudDsgaSsrKSB7Ci0JCQliaCA9IGJoX2FycltpXTsKLQkJCW1hcmtfYnVmZmVyX2FzeW5jX3dyaXRlKGJoKTsKLQkJCWlmIChidWZmZXJfdW53cml0dGVuKGJoKSkKLQkJCQlzZXRfYnVmZmVyX3Vud3JpdHRlbl9pbyhiaCk7Ci0JCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKLQkJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7Ci0JCX0KLQotCQlmb3IgKGkgPSAwOyBpIDwgYmhfY291bnQ7IGkrKykKLQkJCXN1Ym1pdF9iaChXUklURSwgYmhfYXJyW2ldKTsKLQotCQlpZiAocHJvYmVkX3BhZ2UgJiYgY2xlYXJfZGlydHkpCi0JCQl3YmMtPm5yX3RvX3dyaXRlLS07CS8qIFdyb3RlIGFuICJleHRyYSIgcGFnZSAqLwotCX0KLX0KLQogLyoKICAqIEFsbG9jYXRlICYgbWFwIGJ1ZmZlcnMgZm9yIHBhZ2UgZ2l2ZW4gdGhlIGV4dGVudCBtYXAuIFdyaXRlIGl0IG91dC4KICAqIGV4Y2VwdCBmb3IgdGhlIG9yaWdpbmFsIHBhZ2Ugb2YgYSB3cml0ZXBhZ2UsIHRoaXMgaXMgY2FsbGVkIG9uCiAgKiBkZWxhbGxvYy91bndyaXR0ZW4gcGFnZXMgb25seSwgZm9yIHRoZSBvcmlnaW5hbCBwYWdlIGl0IGlzIHBvc3NpYmxlCiAgKiB0aGF0IHRoZSBwYWdlIGhhcyBubyBtYXBwaW5nIGF0IGFsbC4KICAqLwotU1RBVElDIHZvaWQKK1NUQVRJQyBpbnQKIHhmc19jb252ZXJ0X3BhZ2UoCiAJc3RydWN0IGlub2RlCQkqaW5vZGUsCiAJc3RydWN0IHBhZ2UJCSpwYWdlLAotCXhmc19pb21hcF90CQkqaW9tYXBwLAorCWxvZmZfdAkJCXRpbmRleCwKKwl4ZnNfaW9tYXBfdAkJKm1wLAorCXhmc19pb2VuZF90CQkqKmlvZW5kcCwKIAlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYywKLQl2b2lkCQkJKnByaXZhdGUsCiAJaW50CQkJc3RhcnRpbywKIAlpbnQJCQlhbGxfYmgpCiB7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaF9hcnJbTUFYX0JVRl9QRVJfUEFHRV0sICpiaCwgKmhlYWQ7Ci0JeGZzX2lvbWFwX3QJCSptcCA9IGlvbWFwcCwgKnRtcDsKLQl1bnNpZ25lZCBsb25nCQlvZmZzZXQsIGVuZF9vZmZzZXQ7Ci0JaW50CQkJaW5kZXggPSAwOworCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsICpoZWFkOworCXhmc19vZmZfdAkJZW5kX29mZnNldDsKKwl1bnNpZ25lZCBsb25nCQlwX29mZnNldDsKKwl1bnNpZ25lZCBpbnQJCXR5cGU7CiAJaW50CQkJYmJpdHMgPSBpbm9kZS0+aV9ibGtiaXRzOwogCWludAkJCWxlbiwgcGFnZV9kaXJ0eTsKKwlpbnQJCQljb3VudCA9IDAsIGRvbmUgPSAwLCB1cHRvZGF0ZSA9IDE7CisgCXhmc19vZmZfdAkJb2Zmc2V0ID0gcGFnZV9vZmZzZXQocGFnZSk7CiAKLQllbmRfb2Zmc2V0ID0gKGlfc2l6ZV9yZWFkKGlub2RlKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7CisJaWYgKHBhZ2UtPmluZGV4ICE9IHRpbmRleCkKKwkJZ290byBmYWlsOworCWlmIChUZXN0U2V0UGFnZUxvY2tlZChwYWdlKSkKKwkJZ290byBmYWlsOworCWlmIChQYWdlV3JpdGViYWNrKHBhZ2UpKQorCQlnb3RvIGZhaWxfdW5sb2NrX3BhZ2U7CisJaWYgKHBhZ2UtPm1hcHBpbmcgIT0gaW5vZGUtPmlfbWFwcGluZykKKwkJZ290byBmYWlsX3VubG9ja19wYWdlOworCWlmICgheGZzX2lzX2RlbGF5ZWRfcGFnZShwYWdlLCAoKmlvZW5kcCktPmlvX3R5cGUpKQorCQlnb3RvIGZhaWxfdW5sb2NrX3BhZ2U7CiAKIAkvKgogCSAqIHBhZ2VfZGlydHkgaXMgaW5pdGlhbGx5IGEgY291bnQgb2YgYnVmZmVycyBvbiB0aGUgcGFnZSBiZWZvcmUKIAkgKiBFT0YgYW5kIGlzIGRlY3JlbWVtdGVkIGFzIHdlIG1vdmUgZWFjaCBpbnRvIGEgY2xlYW5hYmxlIHN0YXRlLgorCSAqCisJICogRGVyaXZhdGlvbjoKKwkgKgorCSAqIEVuZCBvZmZzZXQgaXMgdGhlIGhpZ2hlc3Qgb2Zmc2V0IHRoYXQgdGhpcyBwYWdlIHNob3VsZCByZXByZXNlbnQuCisJICogSWYgd2UgYXJlIG9uIHRoZSBsYXN0IHBhZ2UsIChlbmRfb2Zmc2V0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKQorCSAqIHdpbGwgZXZhbHVhdGUgbm9uLXplcm8gYW5kIGJlIGxlc3MgdGhhbiBQQUdFX0NBQ0hFX1NJWkUgYW5kCisJICogaGVuY2UgZ2l2ZSB1cyB0aGUgY29ycmVjdCBwYWdlX2RpcnR5IGNvdW50LiBPbiBhbnkgb3RoZXIgcGFnZSwKKwkgKiBpdCB3aWxsIGJlIHplcm8gYW5kIGluIHRoYXQgY2FzZSB3ZSBuZWVkIHBhZ2VfZGlydHkgdG8gYmUgdGhlCisJICogY291bnQgb2YgYnVmZmVycyBvbiB0aGUgcGFnZS4KIAkgKi8KLQlsZW4gPSAxIDw8IGlub2RlLT5pX2Jsa2JpdHM7Ci0JZW5kX29mZnNldCA9IG1heChlbmRfb2Zmc2V0LCBQQUdFX0NBQ0hFX1NJWkUpOwotCWVuZF9vZmZzZXQgPSByb3VuZHVwKGVuZF9vZmZzZXQsIGxlbik7Ci0JcGFnZV9kaXJ0eSA9IGVuZF9vZmZzZXQgLyBsZW47CisJZW5kX29mZnNldCA9IG1pbl90KHVuc2lnbmVkIGxvbmcgbG9uZywKKwkJCSh4ZnNfb2ZmX3QpKHBhZ2UtPmluZGV4ICsgMSkgPDwgUEFHRV9DQUNIRV9TSElGVCwKKwkJCWlfc2l6ZV9yZWFkKGlub2RlKSk7CiAKLQlvZmZzZXQgPSAwOworCWxlbiA9IDEgPDwgaW5vZGUtPmlfYmxrYml0czsKKwlwX29mZnNldCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGVuZF9vZmZzZXQgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSksCisJCQkJCVBBR0VfQ0FDSEVfU0laRSk7CisJcF9vZmZzZXQgPSBwX29mZnNldCA/IHJvdW5kdXAocF9vZmZzZXQsIGxlbikgOiBQQUdFX0NBQ0hFX1NJWkU7CisJcGFnZV9kaXJ0eSA9IHBfb2Zmc2V0IC8gbGVuOworCiAJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOwogCWRvIHsKIAkJaWYgKG9mZnNldCA+PSBlbmRfb2Zmc2V0KQogCQkJYnJlYWs7Ci0JCWlmICghKFBhZ2VVcHRvZGF0ZShwYWdlKSB8fCBidWZmZXJfdXB0b2RhdGUoYmgpKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoYnVmZmVyX21hcHBlZChiaCkgJiYgYWxsX2JoICYmCi0JCSAgICAhKGJ1ZmZlcl91bndyaXR0ZW4oYmgpIHx8IGJ1ZmZlcl9kZWxheShiaCkpKSB7Ci0JCQlpZiAoc3RhcnRpbykgewotCQkJCWxvY2tfYnVmZmVyKGJoKTsKLQkJCQliaF9hcnJbaW5kZXgrK10gPSBiaDsKLQkJCQlwYWdlX2RpcnR5LS07Ci0JCQl9CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCXVwdG9kYXRlID0gMDsKKwkJaWYgKCEoUGFnZVVwdG9kYXRlKHBhZ2UpIHx8IGJ1ZmZlcl91cHRvZGF0ZShiaCkpKSB7CisJCQlkb25lID0gMTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCXRtcCA9IHhmc19vZmZzZXRfdG9fbWFwKHBhZ2UsIG1wLCBvZmZzZXQpOwotCQlpZiAoIXRtcCkKLQkJCWNvbnRpbnVlOwotCQlBU1NFUlQoISh0bXAtPmlvbWFwX2ZsYWdzICYgSU9NQVBfSE9MRSkpOwotCQlBU1NFUlQoISh0bXAtPmlvbWFwX2ZsYWdzICYgSU9NQVBfREVMQVkpKTsKIAotCQkvKiBJZiB0aGlzIGlzIGEgbmV3IHVud3JpdHRlbiBleHRlbnQgYnVmZmVyIChpLmUuIG9uZQotCQkgKiB0aGF0IHdlIGhhdmVuJ3QgcGFzc2VkIGluIHByaXZhdGUgZGF0YSBmb3IsIHdlIG11c3QKLQkJICogbm93IG1hcCB0aGlzIGJ1ZmZlciB0b28uCi0JCSAqLwotCQlpZiAoYnVmZmVyX3Vud3JpdHRlbihiaCkgJiYgIWJoLT5iX2VuZF9pbykgewotCQkJQVNTRVJUKHRtcC0+aW9tYXBfZmxhZ3MgJiBJT01BUF9VTldSSVRURU4pOwotCQkJeGZzX21hcF91bndyaXR0ZW4oaW5vZGUsIHBhZ2UsIGhlYWQsIGJoLCBvZmZzZXQsCi0JCQkJCWJiaXRzLCB0bXAsIHdiYywgc3RhcnRpbywgYWxsX2JoKTsKLQkJfSBlbHNlIGlmICghIChidWZmZXJfdW53cml0dGVuKGJoKSAmJiBidWZmZXJfbG9ja2VkKGJoKSkpIHsKLQkJCXhmc19tYXBfYXRfb2Zmc2V0KHBhZ2UsIGJoLCBvZmZzZXQsIGJiaXRzLCB0bXApOwotCQkJaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpKSB7Ci0JCQkJc2V0X2J1ZmZlcl91bndyaXR0ZW5faW8oYmgpOwotCQkJCWJoLT5iX3ByaXZhdGUgPSBwcml2YXRlOwotCQkJCUFTU0VSVChwcml2YXRlKTsKKwkJaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpIHx8IGJ1ZmZlcl9kZWxheShiaCkpIHsKKwkJCWlmIChidWZmZXJfdW53cml0dGVuKGJoKSkKKwkJCQl0eXBlID0gSU9NQVBfVU5XUklUVEVOOworCQkJZWxzZQorCQkJCXR5cGUgPSBJT01BUF9ERUxBWTsKKworCQkJaWYgKCF4ZnNfaW9tYXBfdmFsaWQobXAsIG9mZnNldCkpIHsKKwkJCQlkb25lID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJQVNTRVJUKCEobXAtPmlvbWFwX2ZsYWdzICYgSU9NQVBfSE9MRSkpOworCQkJQVNTRVJUKCEobXAtPmlvbWFwX2ZsYWdzICYgSU9NQVBfREVMQVkpKTsKKworCQkJeGZzX21hcF9hdF9vZmZzZXQoYmgsIG9mZnNldCwgYmJpdHMsIG1wKTsKKwkJCWlmIChzdGFydGlvKSB7CisJCQkJeGZzX2FkZF90b19pb2VuZChpbm9kZSwgYmgsIG9mZnNldCwKKwkJCQkJCXR5cGUsIGlvZW5kcCwgZG9uZSk7CisJCQl9IGVsc2UgeworCQkJCXNldF9idWZmZXJfZGlydHkoYmgpOworCQkJCXVubG9ja19idWZmZXIoYmgpOworCQkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCX0KKwkJCXBhZ2VfZGlydHktLTsKKwkJCWNvdW50Kys7CisJCX0gZWxzZSB7CisJCQl0eXBlID0gMDsKKwkJCWlmIChidWZmZXJfbWFwcGVkKGJoKSAmJiBhbGxfYmggJiYgc3RhcnRpbykgeworCQkJCWxvY2tfYnVmZmVyKGJoKTsKKwkJCQl4ZnNfYWRkX3RvX2lvZW5kKGlub2RlLCBiaCwgb2Zmc2V0LAorCQkJCQkJdHlwZSwgaW9lbmRwLCBkb25lKTsKKwkJCQljb3VudCsrOworCQkJCXBhZ2VfZGlydHktLTsKKwkJCX0gZWxzZSB7CisJCQkJZG9uZSA9IDE7CiAJCQl9CiAJCX0KLQkJaWYgKHN0YXJ0aW8pIHsKLQkJCWJoX2FycltpbmRleCsrXSA9IGJoOwotCQl9IGVsc2UgewotCQkJc2V0X2J1ZmZlcl9kaXJ0eShiaCk7Ci0JCQl1bmxvY2tfYnVmZmVyKGJoKTsKLQkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKLQkJfQotCQlwYWdlX2RpcnR5LS07CiAJfSB3aGlsZSAob2Zmc2V0ICs9IGxlbiwgKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKIAotCWlmIChzdGFydGlvICYmIGluZGV4KSB7Ci0JCXhmc19zdWJtaXRfcGFnZShwYWdlLCB3YmMsIGJoX2FyciwgaW5kZXgsIDEsICFwYWdlX2RpcnR5KTsKLQl9IGVsc2UgewotCQl1bmxvY2tfcGFnZShwYWdlKTsKKwlpZiAodXB0b2RhdGUgJiYgYmggPT0gaGVhZCkKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCisJaWYgKHN0YXJ0aW8pIHsKKwkJaWYgKGNvdW50KSB7CisJCQlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpOworCisJCQliZGkgPSBpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOworCQkJaWYgKGJkaV93cml0ZV9jb25nZXN0ZWQoYmRpKSkgeworCQkJCXdiYy0+ZW5jb3VudGVyZWRfY29uZ2VzdGlvbiA9IDE7CisJCQkJZG9uZSA9IDE7CisJCQl9IGVsc2UgaWYgKC0td2JjLT5ucl90b193cml0ZSA8PSAwKSB7CisJCQkJZG9uZSA9IDE7CisJCQl9CisJCX0KKwkJeGZzX3N0YXJ0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UsIHdiYywgIXBhZ2VfZGlydHksIGNvdW50KTsKIAl9CisKKwlyZXR1cm4gZG9uZTsKKyBmYWlsX3VubG9ja19wYWdlOgorCXVubG9ja19wYWdlKHBhZ2UpOworIGZhaWw6CisJcmV0dXJuIDE7CiB9CiAKIC8qCkBAIC02ODUsMTkgKzc3MywzMSBAQAogCXN0cnVjdCBpbm9kZQkJKmlub2RlLAogCXBnb2ZmX3QJCQl0aW5kZXgsCiAJeGZzX2lvbWFwX3QJCSppb21hcHAsCisJeGZzX2lvZW5kX3QJCSoqaW9lbmRwLAogCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLAogCWludAkJCXN0YXJ0aW8sCiAJaW50CQkJYWxsX2JoLAogCXBnb2ZmX3QJCQl0bGFzdCkKIHsKLQlzdHJ1Y3QgcGFnZQkJKnBhZ2U7CisJc3RydWN0IHBhZ2V2ZWMJCXB2ZWM7CisJaW50CQkJZG9uZSA9IDAsIGk7CiAKLQlmb3IgKDsgdGluZGV4IDw9IHRsYXN0OyB0aW5kZXgrKykgewotCQlwYWdlID0geGZzX3Byb2JlX2RlbGFsbG9jX3BhZ2UoaW5vZGUsIHRpbmRleCk7Ci0JCWlmICghcGFnZSkKKwlwYWdldmVjX2luaXQoJnB2ZWMsIDApOworCXdoaWxlICghZG9uZSAmJiB0aW5kZXggPD0gdGxhc3QpIHsKKwkJdW5zaWduZWQgbGVuID0gbWluX3QocGdvZmZfdCwgUEFHRVZFQ19TSVpFLCB0bGFzdCAtIHRpbmRleCArIDEpOworCisJCWlmICghcGFnZXZlY19sb29rdXAoJnB2ZWMsIGlub2RlLT5pX21hcHBpbmcsIHRpbmRleCwgbGVuKSkKIAkJCWJyZWFrOwotCQl4ZnNfY29udmVydF9wYWdlKGlub2RlLCBwYWdlLCBpb21hcHAsIHdiYywgTlVMTCwKLQkJCQlzdGFydGlvLCBhbGxfYmgpOworCisJCWZvciAoaSA9IDA7IGkgPCBwYWdldmVjX2NvdW50KCZwdmVjKTsgaSsrKSB7CisJCQlkb25lID0geGZzX2NvbnZlcnRfcGFnZShpbm9kZSwgcHZlYy5wYWdlc1tpXSwgdGluZGV4KyssCisJCQkJCWlvbWFwcCwgaW9lbmRwLCB3YmMsIHN0YXJ0aW8sIGFsbF9iaCk7CisJCQlpZiAoZG9uZSkKKwkJCQlicmVhazsKKwkJfQorCisJCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CisJCWNvbmRfcmVzY2hlZCgpOwogCX0KIH0KIApAQCAtNzI4LDE4ICs4MjgsMjIgQEAKIAlpbnQJCXN0YXJ0aW8sCiAJaW50CQl1bm1hcHBlZCkgLyogYWxzbyBpbXBsaWVzIHBhZ2UgdXB0b2RhdGUgKi8KIHsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoX2FycltNQVhfQlVGX1BFUl9QQUdFXSwgKmJoLCAqaGVhZDsKLQl4ZnNfaW9tYXBfdAkJKmlvbXAsIGlvbWFwOworCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsICpoZWFkOworCXhmc19pb21hcF90CQlpb21hcDsKKwl4ZnNfaW9lbmRfdAkJKmlvZW5kID0gTlVMTCwgKmlvaGVhZCA9IE5VTEw7CiAJbG9mZl90CQkJb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIHBfb2Zmc2V0ID0gMDsKKwl1bnNpZ25lZCBpbnQJCXR5cGU7CiAJX191aW50NjRfdCAgICAgICAgICAgICAgZW5kX29mZnNldDsKIAlwZ29mZl90ICAgICAgICAgICAgICAgICBlbmRfaW5kZXgsIGxhc3RfaW5kZXgsIHRsYXN0OwotCWludAkJCWxlbiwgZXJyLCBpLCBjbnQgPSAwLCB1cHRvZGF0ZSA9IDE7Ci0JaW50CQkJZmxhZ3M7Ci0JaW50CQkJcGFnZV9kaXJ0eTsKKwlzc2l6ZV90CQkJc2l6ZSwgbGVuOworCWludAkJCWZsYWdzLCBlcnIsIGlvbWFwX3ZhbGlkID0gMCwgdXB0b2RhdGUgPSAxOworCWludAkJCXBhZ2VfZGlydHksIGNvdW50ID0gMCwgdHJ5bG9ja19mbGFnID0gMDsKKwlpbnQJCQlhbGxfYmggPSB1bm1hcHBlZDsKIAogCS8qIHdhaXQgZm9yIG90aGVyIElPIHRocmVhZHM/ICovCi0JZmxhZ3MgPSAoc3RhcnRpbyAmJiB3YmMtPnN5bmNfbW9kZSAhPSBXQl9TWU5DX05PTkUpID8gMCA6IEJNQVBJX1RSWUxPQ0s7CisJaWYgKHN0YXJ0aW8gJiYgKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfTk9ORSAmJiB3YmMtPm5vbmJsb2NraW5nKSkKKwkJdHJ5bG9ja19mbGFnIHw9IEJNQVBJX1RSWUxPQ0s7CiAKIAkvKiBJcyB0aGlzIHBhZ2UgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpbGU/ICovCiAJb2Zmc2V0ID0gaV9zaXplX3JlYWQoaW5vZGUpOwpAQCAtNzU0LDE2MSArODU4LDE3MyBAQAogCQl9CiAJfQogCi0JZW5kX29mZnNldCA9IG1pbl90KHVuc2lnbmVkIGxvbmcgbG9uZywKLQkJCShsb2ZmX3QpKHBhZ2UtPmluZGV4ICsgMSkgPDwgUEFHRV9DQUNIRV9TSElGVCwgb2Zmc2V0KTsKLQlvZmZzZXQgPSAobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0KIAkvKgogCSAqIHBhZ2VfZGlydHkgaXMgaW5pdGlhbGx5IGEgY291bnQgb2YgYnVmZmVycyBvbiB0aGUgcGFnZSBiZWZvcmUKIAkgKiBFT0YgYW5kIGlzIGRlY3JlbWVtdGVkIGFzIHdlIG1vdmUgZWFjaCBpbnRvIGEgY2xlYW5hYmxlIHN0YXRlLgotCSAqLworCSAqCisJICogRGVyaXZhdGlvbjoKKwkgKgorCSAqIEVuZCBvZmZzZXQgaXMgdGhlIGhpZ2hlc3Qgb2Zmc2V0IHRoYXQgdGhpcyBwYWdlIHNob3VsZCByZXByZXNlbnQuCisJICogSWYgd2UgYXJlIG9uIHRoZSBsYXN0IHBhZ2UsIChlbmRfb2Zmc2V0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKQorCSAqIHdpbGwgZXZhbHVhdGUgbm9uLXplcm8gYW5kIGJlIGxlc3MgdGhhbiBQQUdFX0NBQ0hFX1NJWkUgYW5kCisJICogaGVuY2UgZ2l2ZSB1cyB0aGUgY29ycmVjdCBwYWdlX2RpcnR5IGNvdW50LiBPbiBhbnkgb3RoZXIgcGFnZSwKKwkgKiBpdCB3aWxsIGJlIHplcm8gYW5kIGluIHRoYXQgY2FzZSB3ZSBuZWVkIHBhZ2VfZGlydHkgdG8gYmUgdGhlCisJICogY291bnQgb2YgYnVmZmVycyBvbiB0aGUgcGFnZS4KKyAJICovCisJZW5kX29mZnNldCA9IG1pbl90KHVuc2lnbmVkIGxvbmcgbG9uZywKKwkJCSh4ZnNfb2ZmX3QpKHBhZ2UtPmluZGV4ICsgMSkgPDwgUEFHRV9DQUNIRV9TSElGVCwgb2Zmc2V0KTsKIAlsZW4gPSAxIDw8IGlub2RlLT5pX2Jsa2JpdHM7Ci0JcF9vZmZzZXQgPSBtYXgocF9vZmZzZXQsIFBBR0VfQ0FDSEVfU0laRSk7Ci0JcF9vZmZzZXQgPSByb3VuZHVwKHBfb2Zmc2V0LCBsZW4pOworCXBfb2Zmc2V0ID0gbWluX3QodW5zaWduZWQgbG9uZywgZW5kX29mZnNldCAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSwKKwkJCQkJUEFHRV9DQUNIRV9TSVpFKTsKKwlwX29mZnNldCA9IHBfb2Zmc2V0ID8gcm91bmR1cChwX29mZnNldCwgbGVuKSA6IFBBR0VfQ0FDSEVfU0laRTsKIAlwYWdlX2RpcnR5ID0gcF9vZmZzZXQgLyBsZW47CiAKLQlpb21wID0gTlVMTDsKLQlwX29mZnNldCA9IDA7CiAJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCW9mZnNldCA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpOworCWZsYWdzID0gLTE7CisJdHlwZSA9IDA7CisKKwkvKiBUT0RPOiBjbGVhbnVwIGNvdW50IGFuZCBwYWdlX2RpcnR5ICovCiAKIAlkbyB7CiAJCWlmIChvZmZzZXQgPj0gZW5kX29mZnNldCkKIAkJCWJyZWFrOwogCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCiAJCQl1cHRvZGF0ZSA9IDA7Ci0JCWlmICghKFBhZ2VVcHRvZGF0ZShwYWdlKSB8fCBidWZmZXJfdXB0b2RhdGUoYmgpKSAmJiAhc3RhcnRpbykKKwkJaWYgKCEoUGFnZVVwdG9kYXRlKHBhZ2UpIHx8IGJ1ZmZlcl91cHRvZGF0ZShiaCkpICYmICFzdGFydGlvKSB7CisJCQkvKgorCQkJICogdGhlIGlvbWFwIGlzIGFjdHVhbGx5IHN0aWxsIHZhbGlkLCBidXQgdGhlIGlvZW5kCisJCQkgKiBpc24ndC4gIHNob3VsZG4ndCBoYXBwZW4gdG9vIG9mdGVuLgorCQkJICovCisJCQlpb21hcF92YWxpZCA9IDA7CiAJCQljb250aW51ZTsKLQotCQlpZiAoaW9tcCkgewotCQkJaW9tcCA9IHhmc19vZmZzZXRfdG9fbWFwKHBhZ2UsICZpb21hcCwgcF9vZmZzZXQpOwogCQl9CiAKKwkJaWYgKGlvbWFwX3ZhbGlkKQorCQkJaW9tYXBfdmFsaWQgPSB4ZnNfaW9tYXBfdmFsaWQoJmlvbWFwLCBvZmZzZXQpOworCiAJCS8qCiAJCSAqIEZpcnN0IGNhc2UsIG1hcCBhbiB1bndyaXR0ZW4gZXh0ZW50IGFuZCBwcmVwYXJlIGZvcgogCQkgKiBleHRlbnQgc3RhdGUgY29udmVyc2lvbiB0cmFuc2FjdGlvbiBvbiBjb21wbGV0aW9uLgotCQkgKi8KLQkJaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpKSB7Ci0JCQlpZiAoIXN0YXJ0aW8pCi0JCQkJY29udGludWU7Ci0JCQlpZiAoIWlvbXApIHsKLQkJCQllcnIgPSB4ZnNfbWFwX2Jsb2Nrcyhpbm9kZSwgb2Zmc2V0LCBsZW4sICZpb21hcCwKLQkJCQkJCUJNQVBJX1dSSVRFfEJNQVBJX0lHTlNUQVRFKTsKLQkJCQlpZiAoZXJyKSB7Ci0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJfQotCQkJCWlvbXAgPSB4ZnNfb2Zmc2V0X3RvX21hcChwYWdlLCAmaW9tYXAsCi0JCQkJCQkJCXBfb2Zmc2V0KTsKLQkJCX0KLQkJCWlmIChpb21wKSB7Ci0JCQkJaWYgKCFiaC0+Yl9lbmRfaW8pIHsKLQkJCQkJZXJyID0geGZzX21hcF91bndyaXR0ZW4oaW5vZGUsIHBhZ2UsCi0JCQkJCQkJaGVhZCwgYmgsIHBfb2Zmc2V0LAotCQkJCQkJCWlub2RlLT5pX2Jsa2JpdHMsIGlvbXAsCi0JCQkJCQkJd2JjLCBzdGFydGlvLCB1bm1hcHBlZCk7Ci0JCQkJCWlmIChlcnIpIHsKLQkJCQkJCWdvdG8gZXJyb3I7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlzZXRfYml0KEJIX0xvY2ssICZiaC0+Yl9zdGF0ZSk7Ci0JCQkJfQotCQkJCUJVR19PTighYnVmZmVyX2xvY2tlZChiaCkpOwotCQkJCWJoX2FycltjbnQrK10gPSBiaDsKLQkJCQlwYWdlX2RpcnR5LS07Ci0JCQl9Ci0JCS8qCisJCSAqCiAJCSAqIFNlY29uZCBjYXNlLCBhbGxvY2F0ZSBzcGFjZSBmb3IgYSBkZWxhbGxvYyBidWZmZXIuCiAJCSAqIFdlIGNhbiByZXR1cm4gRUFHQUlOIGhlcmUgaW4gdGhlIHJlbGVhc2UgcGFnZSBjYXNlLgotCQkgKi8KLQkJfSBlbHNlIGlmIChidWZmZXJfZGVsYXkoYmgpKSB7Ci0JCQlpZiAoIWlvbXApIHsKLQkJCQllcnIgPSB4ZnNfbWFwX2Jsb2Nrcyhpbm9kZSwgb2Zmc2V0LCBsZW4sICZpb21hcCwKLQkJCQkJCUJNQVBJX0FMTE9DQVRFIHwgZmxhZ3MpOwotCQkJCWlmIChlcnIpIHsKLQkJCQkJZ290byBlcnJvcjsKLQkJCQl9Ci0JCQkJaW9tcCA9IHhmc19vZmZzZXRfdG9fbWFwKHBhZ2UsICZpb21hcCwKLQkJCQkJCQkJcF9vZmZzZXQpOworCQkgKgorCQkgKiBUaGlyZCBjYXNlLCBhbiB1bm1hcHBlZCBidWZmZXIgd2FzIGZvdW5kLCBhbmQgd2UgYXJlCisJCSAqIGluIGEgcGF0aCB3aGVyZSB3ZSBuZWVkIHRvIHdyaXRlIHRoZSB3aG9sZSBwYWdlIG91dC4KKyAJCSAqLworCQlpZiAoYnVmZmVyX3Vud3JpdHRlbihiaCkgfHwgYnVmZmVyX2RlbGF5KGJoKSB8fAorCQkgICAgKChidWZmZXJfdXB0b2RhdGUoYmgpIHx8IFBhZ2VVcHRvZGF0ZShwYWdlKSkgJiYKKwkJICAgICAhYnVmZmVyX21hcHBlZChiaCkgJiYgKHVubWFwcGVkIHx8IHN0YXJ0aW8pKSkgeworCQkgICAgIAkvKgorCQkJICogTWFrZSBzdXJlIHdlIGRvbid0IHVzZSBhIHJlYWQtb25seSBpb21hcAorCQkJICovCisJCSAgICAgCWlmIChmbGFncyA9PSBCTUFQSV9SRUFEKQorCQkJCWlvbWFwX3ZhbGlkID0gMDsKKworCQkJaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpKSB7CisJCQkJdHlwZSA9IElPTUFQX1VOV1JJVFRFTjsKKwkJCQlmbGFncyA9IEJNQVBJX1dSSVRFfEJNQVBJX0lHTlNUQVRFOworCQkJfSBlbHNlIGlmIChidWZmZXJfZGVsYXkoYmgpKSB7CisJCQkJdHlwZSA9IElPTUFQX0RFTEFZOworCQkJCWZsYWdzID0gQk1BUElfQUxMT0NBVEU7CisJCQkJaWYgKCFzdGFydGlvKQorCQkJCQlmbGFncyB8PSB0cnlsb2NrX2ZsYWc7CisJCQl9IGVsc2UgeworCQkJCXR5cGUgPSBJT01BUF9ORVc7CisJCQkJZmxhZ3MgPSBCTUFQSV9XUklURXxCTUFQSV9NTUFQOwogCQkJfQotCQkJaWYgKGlvbXApIHsKLQkJCQl4ZnNfbWFwX2F0X29mZnNldChwYWdlLCBiaCwgcF9vZmZzZXQsCi0JCQkJCQlpbm9kZS0+aV9ibGtiaXRzLCBpb21wKTsKKworCQkJaWYgKCFpb21hcF92YWxpZCkgeworCQkJCWlmICh0eXBlID09IElPTUFQX05FVykgeworCQkJCQlzaXplID0geGZzX3Byb2JlX2NsdXN0ZXIoaW5vZGUsCisJCQkJCQkJcGFnZSwgYmgsIGhlYWQsIDApOworCQkJCX0gZWxzZSB7CisJCQkJCXNpemUgPSBsZW47CisJCQkJfQorCisJCQkJZXJyID0geGZzX21hcF9ibG9ja3MoaW5vZGUsIG9mZnNldCwgc2l6ZSwKKwkJCQkJCSZpb21hcCwgZmxhZ3MpOworCQkJCWlmIChlcnIpCisJCQkJCWdvdG8gZXJyb3I7CisJCQkJaW9tYXBfdmFsaWQgPSB4ZnNfaW9tYXBfdmFsaWQoJmlvbWFwLCBvZmZzZXQpOworCQkJfQorCQkJaWYgKGlvbWFwX3ZhbGlkKSB7CisJCQkJeGZzX21hcF9hdF9vZmZzZXQoYmgsIG9mZnNldCwKKwkJCQkJCWlub2RlLT5pX2Jsa2JpdHMsICZpb21hcCk7CiAJCQkJaWYgKHN0YXJ0aW8pIHsKLQkJCQkJYmhfYXJyW2NudCsrXSA9IGJoOworCQkJCQl4ZnNfYWRkX3RvX2lvZW5kKGlub2RlLCBiaCwgb2Zmc2V0LAorCQkJCQkJCXR5cGUsICZpb2VuZCwKKwkJCQkJCQkhaW9tYXBfdmFsaWQpOwogCQkJCX0gZWxzZSB7CiAJCQkJCXNldF9idWZmZXJfZGlydHkoYmgpOwogCQkJCQl1bmxvY2tfYnVmZmVyKGJoKTsKIAkJCQkJbWFya19idWZmZXJfZGlydHkoYmgpOwogCQkJCX0KIAkJCQlwYWdlX2RpcnR5LS07CisJCQkJY291bnQrKzsKKwkJCX0KKwkJfSBlbHNlIGlmIChidWZmZXJfdXB0b2RhdGUoYmgpICYmIHN0YXJ0aW8pIHsKKwkJCS8qCisJCQkgKiB3ZSBnb3QgaGVyZSBiZWNhdXNlIHRoZSBidWZmZXIgaXMgYWxyZWFkeSBtYXBwZWQuCisJCQkgKiBUaGF0IG1lYW5zIGl0IG11c3QgYWxyZWFkeSBoYXZlIGV4dGVudHMgYWxsb2NhdGVkCisJCQkgKiB1bmRlcm5lYXRoIGl0LiBNYXAgdGhlIGV4dGVudCBieSByZWFkaW5nIGl0LgorCQkJICovCisJCQlpZiAoIWlvbWFwX3ZhbGlkIHx8IHR5cGUgIT0gMCkgeworCQkJCWZsYWdzID0gQk1BUElfUkVBRDsKKwkJCQlzaXplID0geGZzX3Byb2JlX2NsdXN0ZXIoaW5vZGUsIHBhZ2UsIGJoLAorCQkJCQkJCQloZWFkLCAxKTsKKwkJCQllcnIgPSB4ZnNfbWFwX2Jsb2Nrcyhpbm9kZSwgb2Zmc2V0LCBzaXplLAorCQkJCQkJJmlvbWFwLCBmbGFncyk7CisJCQkJaWYgKGVycikKKwkJCQkJZ290byBlcnJvcjsKKwkJCQlpb21hcF92YWxpZCA9IHhmc19pb21hcF92YWxpZCgmaW9tYXAsIG9mZnNldCk7CisJCQl9CisKKwkJCXR5cGUgPSAwOworCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEJIX0xvY2ssICZiaC0+Yl9zdGF0ZSkpIHsKKwkJCQlBU1NFUlQoYnVmZmVyX21hcHBlZChiaCkpOworCQkJCWlmIChpb21hcF92YWxpZCkKKwkJCQkJYWxsX2JoID0gMTsKKwkJCQl4ZnNfYWRkX3RvX2lvZW5kKGlub2RlLCBiaCwgb2Zmc2V0LCB0eXBlLAorCQkJCQkJJmlvZW5kLCAhaW9tYXBfdmFsaWQpOworCQkJCXBhZ2VfZGlydHktLTsKKwkJCQljb3VudCsrOworCQkJfSBlbHNlIHsKKwkJCQlpb21hcF92YWxpZCA9IDA7CiAJCQl9CiAJCX0gZWxzZSBpZiAoKGJ1ZmZlcl91cHRvZGF0ZShiaCkgfHwgUGFnZVVwdG9kYXRlKHBhZ2UpKSAmJgogCQkJICAgKHVubWFwcGVkIHx8IHN0YXJ0aW8pKSB7Ci0KLQkJCWlmICghYnVmZmVyX21hcHBlZChiaCkpIHsKLQkJCQlpbnQJc2l6ZTsKLQotCQkJCS8qCi0JCQkJICogR2V0dGluZyBoZXJlIGltcGxpZXMgYW4gdW5tYXBwZWQgYnVmZmVyCi0JCQkJICogd2FzIGZvdW5kLCBhbmQgd2UgYXJlIGluIGEgcGF0aCB3aGVyZSB3ZQotCQkJCSAqIG5lZWQgdG8gd3JpdGUgdGhlIHdob2xlIHBhZ2Ugb3V0LgotCQkJCSAqLwotCQkJCWlmICghaW9tcCkgewotCQkJCQlzaXplID0geGZzX3Byb2JlX3VubWFwcGVkX2NsdXN0ZXIoCi0JCQkJCQkJaW5vZGUsIHBhZ2UsIGJoLCBoZWFkKTsKLQkJCQkJZXJyID0geGZzX21hcF9ibG9ja3MoaW5vZGUsIG9mZnNldCwKLQkJCQkJCQlzaXplLCAmaW9tYXAsCi0JCQkJCQkJQk1BUElfV1JJVEV8Qk1BUElfTU1BUCk7Ci0JCQkJCWlmIChlcnIpIHsKLQkJCQkJCWdvdG8gZXJyb3I7Ci0JCQkJCX0KLQkJCQkJaW9tcCA9IHhmc19vZmZzZXRfdG9fbWFwKHBhZ2UsICZpb21hcCwKLQkJCQkJCQkJICAgICBwX29mZnNldCk7Ci0JCQkJfQotCQkJCWlmIChpb21wKSB7Ci0JCQkJCXhmc19tYXBfYXRfb2Zmc2V0KHBhZ2UsCi0JCQkJCQkJYmgsIHBfb2Zmc2V0LAotCQkJCQkJCWlub2RlLT5pX2Jsa2JpdHMsIGlvbXApOwotCQkJCQlpZiAoc3RhcnRpbykgewotCQkJCQkJYmhfYXJyW2NudCsrXSA9IGJoOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc2V0X2J1ZmZlcl9kaXJ0eShiaCk7Ci0JCQkJCQl1bmxvY2tfYnVmZmVyKGJoKTsKLQkJCQkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKLQkJCQkJfQotCQkJCQlwYWdlX2RpcnR5LS07Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzdGFydGlvKSB7Ci0JCQkJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaCkgJiYKLQkJCQkgICAgIXRlc3RfYW5kX3NldF9iaXQoQkhfTG9jaywgJmJoLT5iX3N0YXRlKSkgewotCQkJCQliaF9hcnJbY250KytdID0gYmg7Ci0JCQkJCXBhZ2VfZGlydHktLTsKLQkJCQl9Ci0JCQl9CisJCQlpb21hcF92YWxpZCA9IDA7CiAJCX0KLQl9IHdoaWxlIChvZmZzZXQgKz0gbGVuLCBwX29mZnNldCArPSBsZW4sCi0JCSgoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpKTsKKworCQlpZiAoIWlvaGVhZCkKKwkJCWlvaGVhZCA9IGlvZW5kOworCisJfSB3aGlsZSAob2Zmc2V0ICs9IGxlbiwgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCkpOwogCiAJaWYgKHVwdG9kYXRlICYmIGJoID09IGhlYWQpCiAJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIAotCWlmIChzdGFydGlvKSB7Ci0JCXhmc19zdWJtaXRfcGFnZShwYWdlLCB3YmMsIGJoX2FyciwgY250LCAwLCAhcGFnZV9kaXJ0eSk7Ci0JfQorCWlmIChzdGFydGlvKQorCQl4ZnNfc3RhcnRfcGFnZV93cml0ZWJhY2socGFnZSwgd2JjLCAxLCBjb3VudCk7CiAKLQlpZiAoaW9tcCkgewotCQlvZmZzZXQgPSAoaW9tcC0+aW9tYXBfb2Zmc2V0ICsgaW9tcC0+aW9tYXBfYnNpemUgLSAxKSA+PgorCWlmIChpb2VuZCAmJiBpb21hcF92YWxpZCkgeworCQlvZmZzZXQgPSAoaW9tYXAuaW9tYXBfb2Zmc2V0ICsgaW9tYXAuaW9tYXBfYnNpemUgLSAxKSA+PgogCQkJCQlQQUdFX0NBQ0hFX1NISUZUOwogCQl0bGFzdCA9IG1pbl90KHBnb2ZmX3QsIG9mZnNldCwgbGFzdF9pbmRleCk7Ci0JCXhmc19jbHVzdGVyX3dyaXRlKGlub2RlLCBwYWdlLT5pbmRleCArIDEsIGlvbXAsIHdiYywKLQkJCQkJc3RhcnRpbywgdW5tYXBwZWQsIHRsYXN0KTsKKwkJeGZzX2NsdXN0ZXJfd3JpdGUoaW5vZGUsIHBhZ2UtPmluZGV4ICsgMSwgJmlvbWFwLCAmaW9lbmQsCisJCQkJCXdiYywgc3RhcnRpbywgYWxsX2JoLCB0bGFzdCk7CiAJfQogCisJaWYgKGlvaGVhZCkKKwkJeGZzX3N1Ym1pdF9pb2VuZChpb2hlYWQpOworCiAJcmV0dXJuIHBhZ2VfZGlydHk7CiAKIGVycm9yOgotCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgewotCQl1bmxvY2tfYnVmZmVyKGJoX2FycltpXSk7Ci0JfQorCWlmIChpb2hlYWQpCisJCXhmc19jYW5jZWxfaW9lbmQoaW9oZWFkKTsKIAogCS8qCiAJICogSWYgaXQncyBkZWxhbGxvYyBhbmQgd2UgaGF2ZSBub3doZXJlIHRvIHB1dCBpdCwKQEAgLTkxNiw5ICsxMDMyLDggQEAKIAkgKiB1cyB0byB0cnkgYWdhaW4uCiAJICovCiAJaWYgKGVyciAhPSAtRUFHQUlOKSB7Ci0JCWlmICghdW5tYXBwZWQpIHsKKwkJaWYgKCF1bm1hcHBlZCkKIAkJCWJsb2NrX2ludmFsaWRhdGVwYWdlKHBhZ2UsIDApOwotCQl9CiAJCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOwogCX0KIAlyZXR1cm4gZXJyOwpAQCAtOTgyLDcgKzEwOTcsNyBAQAogCX0KIAogCS8qIElmIHRoaXMgaXMgYSByZWFsdGltZSBmaWxlLCBkYXRhIG1pZ2h0IGJlIG9uIGEgbmV3IGRldmljZSAqLwotCWJoX3Jlc3VsdC0+Yl9iZGV2ID0gaW9tYXAuaW9tYXBfdGFyZ2V0LT5wYnJfYmRldjsKKwliaF9yZXN1bHQtPmJfYmRldiA9IGlvbWFwLmlvbWFwX3RhcmdldC0+YnRfYmRldjsKIAogCS8qIElmIHdlIHByZXZpb3VzbHkgYWxsb2NhdGVkIGEgYmxvY2sgb3V0IGJleW9uZCBlb2YgYW5kCiAJICogd2UgYXJlIG5vdyBjb21pbmcgYmFjayB0byB1c2UgaXQgdGhlbiB3ZSB3aWxsIG5lZWQgdG8KQEAgLTEwOTQsMTAgKzEyMDksMTAgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiAtZXJyb3I7CiAKLQlpb2NiLT5wcml2YXRlID0geGZzX2FsbG9jX2lvZW5kKGlub2RlKTsKKwlpb2NiLT5wcml2YXRlID0geGZzX2FsbG9jX2lvZW5kKGlub2RlLCBJT01BUF9VTldSSVRURU4pOwogCiAJcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPX293bl9sb2NraW5nKHJ3LCBpb2NiLCBpbm9kZSwKLQkJaW9tYXAuaW9tYXBfdGFyZ2V0LT5wYnJfYmRldiwKKwkJaW9tYXAuaW9tYXBfdGFyZ2V0LT5idF9iZGV2LAogCQlpb3YsIG9mZnNldCwgbnJfc2VncywKIAkJbGludmZzX2dldF9ibG9ja3NfZGlyZWN0LAogCQlsaW52ZnNfZW5kX2lvX2RpcmVjdCk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmgKaW5kZXggNDcyMDc1OC4uNTUzMzlkZCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuaApAQCAtMjMsMTQgKzIzLDI0IEBACiAKIHR5cGVkZWYgdm9pZCAoKnhmc19pb2VuZF9mdW5jX3QpKHZvaWQgKik7CiAKKy8qCisgKiB4ZnNfaW9lbmQgc3RydWN0IG1hbmFnZXMgbGFyZ2UgZXh0ZW50IHdyaXRlcyBmb3IgWEZTLgorICogSXQgY2FuIG1hbmFnZSBzZXZlcmFsIG11bHRpLXBhZ2UgYmlvJ3MgYXQgb25jZS4KKyAqLwogdHlwZWRlZiBzdHJ1Y3QgeGZzX2lvZW5kIHsKKwlzdHJ1Y3QgeGZzX2lvZW5kCSppb19saXN0OwkvKiBuZXh0IGlvZW5kIGluIGNoYWluICovCisJdW5zaWduZWQgaW50CQlpb190eXBlOwkvKiBkZWxhbGxvYyAvIHVud3JpdHRlbiAqLwogCXVuc2lnbmVkIGludAkJaW9fdXB0b2RhdGU7CS8qIEkvTyBzdGF0dXMgcmVnaXN0ZXIgKi8KIAlhdG9taWNfdAkJaW9fcmVtYWluaW5nOwkvKiBob2xkIGNvdW50ICovCiAJc3RydWN0IHZub2RlCQkqaW9fdm5vZGU7CS8qIGZpbGUgYmVpbmcgd3JpdHRlbiB0byAqLwogCXN0cnVjdCBidWZmZXJfaGVhZAkqaW9fYnVmZmVyX2hlYWQ7LyogYnVmZmVyIGxpbmtlZCBsaXN0IGhlYWQgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmlvX2J1ZmZlcl90YWlsOy8qIGJ1ZmZlciBsaW5rZWQgbGlzdCB0YWlsICovCiAJc2l6ZV90CQkJaW9fc2l6ZTsJLyogc2l6ZSBvZiB0aGUgZXh0ZW50ICovCiAJeGZzX29mZl90CQlpb19vZmZzZXQ7CS8qIG9mZnNldCBpbiB0aGUgZmlsZSAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdAlpb193b3JrOwkvKiB4ZnNkYXRhZCB3b3JrIHF1ZXVlICovCiB9IHhmc19pb2VuZF90OwogCitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBsaW52ZnNfYW9wczsKK2V4dGVybiBpbnQgbGludmZzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKiwgc2VjdG9yX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOworCiAjZW5kaWYgLyogX19YRlNfSU9QU19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKaW5kZXggNmZlMjFkMi4uZTQ0YjdjMSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKQEAgLTMxLDc2ICszMSw3NyBAQAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlICJ4ZnNfbGludXguaCIKIAotU1RBVElDIGttZW1fY2FjaGVfdCAqcGFnZWJ1Zl96b25lOwotU1RBVElDIGttZW1fc2hha2VyX3QgcGFnZWJ1Zl9zaGFrZTsKK1NUQVRJQyBrbWVtX3pvbmVfdCAqeGZzX2J1Zl96b25lOworU1RBVElDIGttZW1fc2hha2VyX3QgeGZzX2J1Zl9zaGFrZTsKK1NUQVRJQyBpbnQgeGZzYnVmZCh2b2lkICopOwogU1RBVElDIGludCB4ZnNidWZkX3dha2V1cChpbnQsIGdmcF90KTsKLVNUQVRJQyB2b2lkIHBhZ2VidWZfZGVsd3JpX3F1ZXVlKHhmc19idWZfdCAqLCBpbnQpOworU1RBVElDIHZvaWQgeGZzX2J1Zl9kZWx3cmlfcXVldWUoeGZzX2J1Zl90ICosIGludCk7CiAKIFNUQVRJQyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqeGZzbG9nZF93b3JrcXVldWU7CiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqeGZzZGF0YWRfd29ya3F1ZXVlOwogCi0jaWZkZWYgUEFHRUJVRl9UUkFDRQorI2lmZGVmIFhGU19CVUZfVFJBQ0UKIHZvaWQKLXBhZ2VidWZfdHJhY2UoCi0JeGZzX2J1Zl90CSpwYiwKK3hmc19idWZfdHJhY2UoCisJeGZzX2J1Zl90CSpicCwKIAljaGFyCQkqaWQsCiAJdm9pZAkJKmRhdGEsCiAJdm9pZAkJKnJhKQogewotCWt0cmFjZV9lbnRlcihwYWdlYnVmX3RyYWNlX2J1ZiwKLQkJcGIsIGlkLAotCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKXBiLT5wYl9mbGFncywKLQkJKHZvaWQgKikodW5zaWduZWQgbG9uZylwYi0+cGJfaG9sZC5jb3VudGVyLAotCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKXBiLT5wYl9zZW1hLmNvdW50LmNvdW50ZXIsCisJa3RyYWNlX2VudGVyKHhmc19idWZfdHJhY2VfYnVmLAorCQlicCwgaWQsCisJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpYnAtPmJfZmxhZ3MsCisJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpYnAtPmJfaG9sZC5jb3VudGVyLAorCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKWJwLT5iX3NlbWEuY291bnQuY291bnRlciwKIAkJKHZvaWQgKiljdXJyZW50LAogCQlkYXRhLCByYSwKLQkJKHZvaWQgKikodW5zaWduZWQgbG9uZykoKHBiLT5wYl9maWxlX29mZnNldD4+MzIpICYgMHhmZmZmZmZmZiksCi0JCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpKHBiLT5wYl9maWxlX29mZnNldCAmIDB4ZmZmZmZmZmYpLAotCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKXBiLT5wYl9idWZmZXJfbGVuZ3RoLAorCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKSgoYnAtPmJfZmlsZV9vZmZzZXQ+PjMyKSAmIDB4ZmZmZmZmZmYpLAorCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKShicC0+Yl9maWxlX29mZnNldCAmIDB4ZmZmZmZmZmYpLAorCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKWJwLT5iX2J1ZmZlcl9sZW5ndGgsCiAJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogfQota3RyYWNlX3QgKnBhZ2VidWZfdHJhY2VfYnVmOwotI2RlZmluZSBQQUdFQlVGX1RSQUNFX1NJWkUJNDA5NgotI2RlZmluZSBQQl9UUkFDRShwYiwgaWQsIGRhdGEpCVwKLQlwYWdlYnVmX3RyYWNlKHBiLCBpZCwgKHZvaWQgKilkYXRhLCAodm9pZCAqKV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSkKK2t0cmFjZV90ICp4ZnNfYnVmX3RyYWNlX2J1ZjsKKyNkZWZpbmUgWEZTX0JVRl9UUkFDRV9TSVpFCTQwOTYKKyNkZWZpbmUgWEJfVFJBQ0UoYnAsIGlkLCBkYXRhKQlcCisJeGZzX2J1Zl90cmFjZShicCwgaWQsICh2b2lkICopZGF0YSwgKHZvaWQgKilfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpCiAjZWxzZQotI2RlZmluZSBQQl9UUkFDRShwYiwgaWQsIGRhdGEpCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgWEJfVFJBQ0UoYnAsIGlkLCBkYXRhKQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotI2lmZGVmIFBBR0VCVUZfTE9DS19UUkFDS0lORwotIyBkZWZpbmUgUEJfU0VUX09XTkVSKHBiKQkoKHBiKS0+cGJfbGFzdF9ob2xkZXIgPSBjdXJyZW50LT5waWQpCi0jIGRlZmluZSBQQl9DTEVBUl9PV05FUihwYikJKChwYiktPnBiX2xhc3RfaG9sZGVyID0gLTEpCi0jIGRlZmluZSBQQl9HRVRfT1dORVIocGIpCSgocGIpLT5wYl9sYXN0X2hvbGRlcikKKyNpZmRlZiBYRlNfQlVGX0xPQ0tfVFJBQ0tJTkcKKyMgZGVmaW5lIFhCX1NFVF9PV05FUihicCkJKChicCktPmJfbGFzdF9ob2xkZXIgPSBjdXJyZW50LT5waWQpCisjIGRlZmluZSBYQl9DTEVBUl9PV05FUihicCkJKChicCktPmJfbGFzdF9ob2xkZXIgPSAtMSkKKyMgZGVmaW5lIFhCX0dFVF9PV05FUihicCkJKChicCktPmJfbGFzdF9ob2xkZXIpCiAjZWxzZQotIyBkZWZpbmUgUEJfU0VUX09XTkVSKHBiKQlkbyB7IH0gd2hpbGUgKDApCi0jIGRlZmluZSBQQl9DTEVBUl9PV05FUihwYikJZG8geyB9IHdoaWxlICgwKQotIyBkZWZpbmUgUEJfR0VUX09XTkVSKHBiKQlkbyB7IH0gd2hpbGUgKDApCisjIGRlZmluZSBYQl9TRVRfT1dORVIoYnApCWRvIHsgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIFhCX0NMRUFSX09XTkVSKGJwKQlkbyB7IH0gd2hpbGUgKDApCisjIGRlZmluZSBYQl9HRVRfT1dORVIoYnApCWRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCi0jZGVmaW5lIHBiX3RvX2dmcChmbGFncykgXAotCSgoKChmbGFncykgJiBQQkZfUkVBRF9BSEVBRCkgPyBfX0dGUF9OT1JFVFJZIDogXAotCSAgKChmbGFncykgJiBQQkZfRE9OVF9CTE9DSykgPyBHRlBfTk9GUyA6IEdGUF9LRVJORUwpIHwgX19HRlBfTk9XQVJOKQorI2RlZmluZSB4Yl90b19nZnAoZmxhZ3MpIFwKKwkoKCgoZmxhZ3MpICYgWEJGX1JFQURfQUhFQUQpID8gX19HRlBfTk9SRVRSWSA6IFwKKwkgICgoZmxhZ3MpICYgWEJGX0RPTlRfQkxPQ0spID8gR0ZQX05PRlMgOiBHRlBfS0VSTkVMKSB8IF9fR0ZQX05PV0FSTikKIAotI2RlZmluZSBwYl90b19rbShmbGFncykgXAotCSAoKChmbGFncykgJiBQQkZfRE9OVF9CTE9DSykgPyBLTV9OT0ZTIDogS01fU0xFRVApCisjZGVmaW5lIHhiX3RvX2ttKGZsYWdzKSBcCisJICgoKGZsYWdzKSAmIFhCRl9ET05UX0JMT0NLKSA/IEtNX05PRlMgOiBLTV9TTEVFUCkKIAotI2RlZmluZSBwYWdlYnVmX2FsbG9jYXRlKGZsYWdzKSBcCi0Ja21lbV96b25lX2FsbG9jKHBhZ2VidWZfem9uZSwgcGJfdG9fa20oZmxhZ3MpKQotI2RlZmluZSBwYWdlYnVmX2RlYWxsb2NhdGUocGIpIFwKLQlrbWVtX3pvbmVfZnJlZShwYWdlYnVmX3pvbmUsIChwYikpOworI2RlZmluZSB4ZnNfYnVmX2FsbG9jYXRlKGZsYWdzKSBcCisJa21lbV96b25lX2FsbG9jKHhmc19idWZfem9uZSwgeGJfdG9fa20oZmxhZ3MpKQorI2RlZmluZSB4ZnNfYnVmX2RlYWxsb2NhdGUoYnApIFwKKwlrbWVtX3pvbmVfZnJlZSh4ZnNfYnVmX3pvbmUsIChicCkpOwogCiAvKgotICogUGFnZSBSZWdpb24gaW50ZXJmYWNlcy4KKyAqCVBhZ2UgUmVnaW9uIGludGVyZmFjZXMuCiAgKgotICogRm9yIHBhZ2VzIGluIGZpbGVzeXN0ZW1zIHdoZXJlIHRoZSBibG9ja3NpemUgaXMgc21hbGxlciB0aGFuIHRoZQotICogcGFnZXNpemUsIHdlIHVzZSB0aGUgcGFnZS0+cHJpdmF0ZSBmaWVsZCAobG9uZykgdG8gaG9sZCBhIGJpdG1hcAotICogb2YgdXB0b2RhdGUgcmVnaW9ucyB3aXRoaW4gdGhlIHBhZ2UuCisgKglGb3IgcGFnZXMgaW4gZmlsZXN5c3RlbXMgd2hlcmUgdGhlIGJsb2Nrc2l6ZSBpcyBzbWFsbGVyIHRoYW4gdGhlCisgKglwYWdlc2l6ZSwgd2UgdXNlIHRoZSBwYWdlLT5wcml2YXRlIGZpZWxkIChsb25nKSB0byBob2xkIGEgYml0bWFwCisgKiAJb2YgdXB0b2RhdGUgcmVnaW9ucyB3aXRoaW4gdGhlIHBhZ2UuCiAgKgotICogRWFjaCBzdWNoIHJlZ2lvbiBpcyAiYnl0ZXMgcGVyIHBhZ2UgLyBiaXRzIHBlciBsb25nIiBieXRlcyBsb25nLgorICoJRWFjaCBzdWNoIHJlZ2lvbiBpcyAiYnl0ZXMgcGVyIHBhZ2UgLyBiaXRzIHBlciBsb25nIiBieXRlcyBsb25nLgogICoKLSAqIE5CUFBSID09IG51bWJlci1vZi1ieXRlcy1wZXItcGFnZS1yZWdpb24KLSAqIEJUT1BSID09IGJ5dGVzLXRvLXBhZ2UtcmVnaW9uIChyb3VuZGVkIHVwKQotICogQlRPUFJUID09IGJ5dGVzLXRvLXBhZ2UtcmVnaW9uLXRydW5jYXRlZCAocm91bmRlZCBkb3duKQorICoJTkJQUFIgPT0gbnVtYmVyLW9mLWJ5dGVzLXBlci1wYWdlLXJlZ2lvbgorICoJQlRPUFIgPT0gYnl0ZXMtdG8tcGFnZS1yZWdpb24gKHJvdW5kZWQgdXApCisgKglCVE9QUlQgPT0gYnl0ZXMtdG8tcGFnZS1yZWdpb24tdHJ1bmNhdGVkIChyb3VuZGVkIGRvd24pCiAgKi8KICNpZiAoQklUU19QRVJfTE9ORyA9PSAzMikKICNkZWZpbmUgUFJTSElGVAkJKFBBR0VfQ0FDSEVfU0hJRlQgLSA1KQkvKiAoMzIgPT0gMTw8NSkgKi8KQEAgLTE1OSw3ICsxNjAsNyBAQAogfQogCiAvKgotICogTWFwcGluZyBvZiBtdWx0aS1wYWdlIGJ1ZmZlcnMgaW50byBjb250aWd1b3VzIHZpcnR1YWwgc3BhY2UKKyAqCU1hcHBpbmcgb2YgbXVsdGktcGFnZSBidWZmZXJzIGludG8gY29udGlndW91cyB2aXJ0dWFsIHNwYWNlCiAgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgYV9saXN0IHsKQEAgLTE3Miw3ICsxNzMsNyBAQAogU1RBVElDIERFRklORV9TUElOTE9DSyhhc19sb2NrKTsKIAogLyoKLSAqIFRyeSB0byBiYXRjaCB2dW5tYXBzIGJlY2F1c2UgdGhleSBhcmUgY29zdGx5LgorICoJVHJ5IHRvIGJhdGNoIHZ1bm1hcHMgYmVjYXVzZSB0aGV5IGFyZSBjb3N0bHkuCiAgKi8KIFNUQVRJQyB2b2lkCiBmcmVlX2FkZHJlc3MoCkBAIC0yMTUsODMgKzIxNiw4MyBAQAogfQogCiAvKgotICoJSW50ZXJuYWwgcGFnZWJ1ZiBvYmplY3QgbWFuaXB1bGF0aW9uCisgKglJbnRlcm5hbCB4ZnNfYnVmX3Qgb2JqZWN0IG1hbmlwdWxhdGlvbgogICovCiAKIFNUQVRJQyB2b2lkCi1fcGFnZWJ1Zl9pbml0aWFsaXplKAotCXhmc19idWZfdAkJKnBiLAorX3hmc19idWZfaW5pdGlhbGl6ZSgKKwl4ZnNfYnVmX3QJCSpicCwKIAl4ZnNfYnVmdGFyZ190CQkqdGFyZ2V0LAotCWxvZmZfdAkJCXJhbmdlX2Jhc2UsCisJeGZzX29mZl90CQlyYW5nZV9iYXNlLAogCXNpemVfdAkJCXJhbmdlX2xlbmd0aCwKLQlwYWdlX2J1Zl9mbGFnc190CWZsYWdzKQorCXhmc19idWZfZmxhZ3NfdAkJZmxhZ3MpCiB7CiAJLyoKLQkgKiBXZSBkb24ndCB3YW50IGNlcnRhaW4gZmxhZ3MgdG8gYXBwZWFyIGluIHBiLT5wYl9mbGFncy4KKwkgKiBXZSBkb24ndCB3YW50IGNlcnRhaW4gZmxhZ3MgdG8gYXBwZWFyIGluIGJfZmxhZ3MuCiAJICovCi0JZmxhZ3MgJj0gfihQQkZfTE9DS3xQQkZfTUFQUEVEfFBCRl9ET05UX0JMT0NLfFBCRl9SRUFEX0FIRUFEKTsKKwlmbGFncyAmPSB+KFhCRl9MT0NLfFhCRl9NQVBQRUR8WEJGX0RPTlRfQkxPQ0t8WEJGX1JFQURfQUhFQUQpOwogCi0JbWVtc2V0KHBiLCAwLCBzaXplb2YoeGZzX2J1Zl90KSk7Ci0JYXRvbWljX3NldCgmcGItPnBiX2hvbGQsIDEpOwotCWluaXRfTVVURVhfTE9DS0VEKCZwYi0+cGJfaW9kb25lc2VtYSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnBiLT5wYl9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmcGItPnBiX2hhc2hfbGlzdCk7Ci0JaW5pdF9NVVRFWF9MT0NLRUQoJnBiLT5wYl9zZW1hKTsgLyogaGVsZCwgbm8gd2FpdGVycyAqLwotCVBCX1NFVF9PV05FUihwYik7Ci0JcGItPnBiX3RhcmdldCA9IHRhcmdldDsKLQlwYi0+cGJfZmlsZV9vZmZzZXQgPSByYW5nZV9iYXNlOworCW1lbXNldChicCwgMCwgc2l6ZW9mKHhmc19idWZfdCkpOworCWF0b21pY19zZXQoJmJwLT5iX2hvbGQsIDEpOworCWluaXRfTVVURVhfTE9DS0VEKCZicC0+Yl9pb2RvbmVzZW1hKTsKKwlJTklUX0xJU1RfSEVBRCgmYnAtPmJfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmJwLT5iX2hhc2hfbGlzdCk7CisJaW5pdF9NVVRFWF9MT0NLRUQoJmJwLT5iX3NlbWEpOyAvKiBoZWxkLCBubyB3YWl0ZXJzICovCisJWEJfU0VUX09XTkVSKGJwKTsKKwlicC0+Yl90YXJnZXQgPSB0YXJnZXQ7CisJYnAtPmJfZmlsZV9vZmZzZXQgPSByYW5nZV9iYXNlOwogCS8qCiAJICogU2V0IGJ1ZmZlcl9sZW5ndGggYW5kIGNvdW50X2Rlc2lyZWQgdG8gdGhlIHNhbWUgdmFsdWUgaW5pdGlhbGx5LgogCSAqIEkvTyByb3V0aW5lcyBzaG91bGQgdXNlIGNvdW50X2Rlc2lyZWQsIHdoaWNoIHdpbGwgYmUgdGhlIHNhbWUgaW4KIAkgKiBtb3N0IGNhc2VzIGJ1dCBtYXkgYmUgcmVzZXQgKGUuZy4gWEZTIHJlY292ZXJ5KS4KIAkgKi8KLQlwYi0+cGJfYnVmZmVyX2xlbmd0aCA9IHBiLT5wYl9jb3VudF9kZXNpcmVkID0gcmFuZ2VfbGVuZ3RoOwotCXBiLT5wYl9mbGFncyA9IGZsYWdzOwotCXBiLT5wYl9ibiA9IFhGU19CVUZfREFERFJfTlVMTDsKLQlhdG9taWNfc2V0KCZwYi0+cGJfcGluX2NvdW50LCAwKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwYi0+cGJfd2FpdGVycyk7CisJYnAtPmJfYnVmZmVyX2xlbmd0aCA9IGJwLT5iX2NvdW50X2Rlc2lyZWQgPSByYW5nZV9sZW5ndGg7CisJYnAtPmJfZmxhZ3MgPSBmbGFnczsKKwlicC0+Yl9ibiA9IFhGU19CVUZfREFERFJfTlVMTDsKKwlhdG9taWNfc2V0KCZicC0+Yl9waW5fY291bnQsIDApOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJwLT5iX3dhaXRlcnMpOwogCi0JWEZTX1NUQVRTX0lOQyhwYl9jcmVhdGUpOwotCVBCX1RSQUNFKHBiLCAiaW5pdGlhbGl6ZSIsIHRhcmdldCk7CisJWEZTX1NUQVRTX0lOQyh4Yl9jcmVhdGUpOworCVhCX1RSQUNFKGJwLCAiaW5pdGlhbGl6ZSIsIHRhcmdldCk7CiB9CiAKIC8qCi0gKiBBbGxvY2F0ZSBhIHBhZ2UgYXJyYXkgY2FwYWJsZSBvZiBob2xkaW5nIGEgc3BlY2lmaWVkIG51bWJlcgotICogb2YgcGFnZXMsIGFuZCBwb2ludCB0aGUgcGFnZSBidWYgYXQgaXQuCisgKglBbGxvY2F0ZSBhIHBhZ2UgYXJyYXkgY2FwYWJsZSBvZiBob2xkaW5nIGEgc3BlY2lmaWVkIG51bWJlcgorICoJb2YgcGFnZXMsIGFuZCBwb2ludCB0aGUgcGFnZSBidWYgYXQgaXQuCiAgKi8KIFNUQVRJQyBpbnQKLV9wYWdlYnVmX2dldF9wYWdlcygKLQl4ZnNfYnVmX3QJCSpwYiwKK194ZnNfYnVmX2dldF9wYWdlcygKKwl4ZnNfYnVmX3QJCSpicCwKIAlpbnQJCQlwYWdlX2NvdW50LAotCXBhZ2VfYnVmX2ZsYWdzX3QJZmxhZ3MpCisJeGZzX2J1Zl9mbGFnc190CQlmbGFncykKIHsKIAkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgcGFnZSBsaXN0ICovCi0JaWYgKHBiLT5wYl9wYWdlcyA9PSBOVUxMKSB7Ci0JCXBiLT5wYl9vZmZzZXQgPSBwYWdlX2J1Zl9wb2ZmKHBiLT5wYl9maWxlX29mZnNldCk7Ci0JCXBiLT5wYl9wYWdlX2NvdW50ID0gcGFnZV9jb3VudDsKLQkJaWYgKHBhZ2VfY291bnQgPD0gUEJfUEFHRVMpIHsKLQkJCXBiLT5wYl9wYWdlcyA9IHBiLT5wYl9wYWdlX2FycmF5OworCWlmIChicC0+Yl9wYWdlcyA9PSBOVUxMKSB7CisJCWJwLT5iX29mZnNldCA9IHhmc19idWZfcG9mZihicC0+Yl9maWxlX29mZnNldCk7CisJCWJwLT5iX3BhZ2VfY291bnQgPSBwYWdlX2NvdW50OworCQlpZiAocGFnZV9jb3VudCA8PSBYQl9QQUdFUykgeworCQkJYnAtPmJfcGFnZXMgPSBicC0+Yl9wYWdlX2FycmF5OwogCQl9IGVsc2UgewotCQkJcGItPnBiX3BhZ2VzID0ga21lbV9hbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKgotCQkJCQlwYWdlX2NvdW50LCBwYl90b19rbShmbGFncykpOwotCQkJaWYgKHBiLT5wYl9wYWdlcyA9PSBOVUxMKQorCQkJYnAtPmJfcGFnZXMgPSBrbWVtX2FsbG9jKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqCisJCQkJCXBhZ2VfY291bnQsIHhiX3RvX2ttKGZsYWdzKSk7CisJCQlpZiAoYnAtPmJfcGFnZXMgPT0gTlVMTCkKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQotCQltZW1zZXQocGItPnBiX3BhZ2VzLCAwLCBzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBwYWdlX2NvdW50KTsKKwkJbWVtc2V0KGJwLT5iX3BhZ2VzLCAwLCBzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBwYWdlX2NvdW50KTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKIC8qCi0gKglGcmVlcyBwYl9wYWdlcyBpZiBpdCB3YXMgbWFsbG9jZWQuCisgKglGcmVlcyBiX3BhZ2VzIGlmIGl0IHdhcyBhbGxvY2F0ZWQuCiAgKi8KIFNUQVRJQyB2b2lkCi1fcGFnZWJ1Zl9mcmVlX3BhZ2VzKAorX3hmc19idWZfZnJlZV9wYWdlcygKIAl4ZnNfYnVmX3QJKmJwKQogewotCWlmIChicC0+cGJfcGFnZXMgIT0gYnAtPnBiX3BhZ2VfYXJyYXkpIHsKLQkJa21lbV9mcmVlKGJwLT5wYl9wYWdlcywKLQkJCSAgYnAtPnBiX3BhZ2VfY291bnQgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKikpOworCWlmIChicC0+Yl9wYWdlcyAhPSBicC0+Yl9wYWdlX2FycmF5KSB7CisJCWttZW1fZnJlZShicC0+Yl9wYWdlcywKKwkJCSAgYnAtPmJfcGFnZV9jb3VudCAqIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSk7CiAJfQogfQogCkBAIC0yOTksNzkgKzMwMCw3OSBAQAogICoJUmVsZWFzZXMgdGhlIHNwZWNpZmllZCBidWZmZXIuCiAgKgogICogCVRoZSBtb2RpZmljYXRpb24gc3RhdGUgb2YgYW55IGFzc29jaWF0ZWQgcGFnZXMgaXMgbGVmdCB1bmNoYW5nZWQuCi0gKiAJVGhlIGJ1ZmZlciBtb3N0IG5vdCBiZSBvbiBhbnkgaGFzaCAtIHVzZSBwYWdlYnVmX3JlbGUgaW5zdGVhZCBmb3IKKyAqIAlUaGUgYnVmZmVyIG1vc3Qgbm90IGJlIG9uIGFueSBoYXNoIC0gdXNlIHhmc19idWZfcmVsZSBpbnN0ZWFkIGZvcgogICogCWhhc2hlZCBhbmQgcmVmY291bnRlZCBidWZmZXJzCiAgKi8KIHZvaWQKLXBhZ2VidWZfZnJlZSgKK3hmc19idWZfZnJlZSgKIAl4ZnNfYnVmX3QJCSpicCkKIHsKLQlQQl9UUkFDRShicCwgImZyZWUiLCAwKTsKKwlYQl9UUkFDRShicCwgImZyZWUiLCAwKTsKIAotCUFTU0VSVChsaXN0X2VtcHR5KCZicC0+cGJfaGFzaF9saXN0KSk7CisJQVNTRVJUKGxpc3RfZW1wdHkoJmJwLT5iX2hhc2hfbGlzdCkpOwogCi0JaWYgKGJwLT5wYl9mbGFncyAmIF9QQkZfUEFHRV9DQUNIRSkgeworCWlmIChicC0+Yl9mbGFncyAmIF9YQkZfUEFHRV9DQUNIRSkgewogCQl1aW50CQlpOwogCi0JCWlmICgoYnAtPnBiX2ZsYWdzICYgUEJGX01BUFBFRCkgJiYgKGJwLT5wYl9wYWdlX2NvdW50ID4gMSkpCi0JCQlmcmVlX2FkZHJlc3MoYnAtPnBiX2FkZHIgLSBicC0+cGJfb2Zmc2V0KTsKKwkJaWYgKChicC0+Yl9mbGFncyAmIFhCRl9NQVBQRUQpICYmIChicC0+Yl9wYWdlX2NvdW50ID4gMSkpCisJCQlmcmVlX2FkZHJlc3MoYnAtPmJfYWRkciAtIGJwLT5iX29mZnNldCk7CiAKLQkJZm9yIChpID0gMDsgaSA8IGJwLT5wYl9wYWdlX2NvdW50OyBpKyspCi0JCQlwYWdlX2NhY2hlX3JlbGVhc2UoYnAtPnBiX3BhZ2VzW2ldKTsKLQkJX3BhZ2VidWZfZnJlZV9wYWdlcyhicCk7Ci0JfSBlbHNlIGlmIChicC0+cGJfZmxhZ3MgJiBfUEJGX0tNRU1fQUxMT0MpIHsKKwkJZm9yIChpID0gMDsgaSA8IGJwLT5iX3BhZ2VfY291bnQ7IGkrKykKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShicC0+Yl9wYWdlc1tpXSk7CisJCV94ZnNfYnVmX2ZyZWVfcGFnZXMoYnApOworCX0gZWxzZSBpZiAoYnAtPmJfZmxhZ3MgJiBfWEJGX0tNRU1fQUxMT0MpIHsKIAkJIC8qCi0JCSAgKiBYWFgoaGNoKTogYnAtPnBiX2NvdW50X2Rlc2lyZWQgbWlnaHQgYmUgaW5jb3JyZWN0IChzZWUKLQkJICAqIHBhZ2VidWZfYXNzb2NpYXRlX21lbW9yeSBmb3IgZGV0YWlscyksIGJ1dCBmb3J0dW5hdGVseQorCQkgICogWFhYKGhjaCk6IGJwLT5iX2NvdW50X2Rlc2lyZWQgbWlnaHQgYmUgaW5jb3JyZWN0IChzZWUKKwkJICAqIHhmc19idWZfYXNzb2NpYXRlX21lbW9yeSBmb3IgZGV0YWlscyksIGJ1dCBmb3J0dW5hdGVseQogCQkgICogdGhlIExpbnV4IHZlcnNpb24gb2Yga21lbV9mcmVlIGlnbm9yZXMgdGhlIGxlbiBhcmd1bWVudC4uCiAJCSAgKi8KLQkJa21lbV9mcmVlKGJwLT5wYl9hZGRyLCBicC0+cGJfY291bnRfZGVzaXJlZCk7Ci0JCV9wYWdlYnVmX2ZyZWVfcGFnZXMoYnApOworCQlrbWVtX2ZyZWUoYnAtPmJfYWRkciwgYnAtPmJfY291bnRfZGVzaXJlZCk7CisJCV94ZnNfYnVmX2ZyZWVfcGFnZXMoYnApOwogCX0KIAotCXBhZ2VidWZfZGVhbGxvY2F0ZShicCk7CisJeGZzX2J1Zl9kZWFsbG9jYXRlKGJwKTsKIH0KIAogLyoKICAqCUZpbmRzIGFsbCBwYWdlcyBmb3IgYnVmZmVyIGluIHF1ZXN0aW9uIGFuZCBidWlsZHMgaXQncyBwYWdlIGxpc3QuCiAgKi8KIFNUQVRJQyBpbnQKLV9wYWdlYnVmX2xvb2t1cF9wYWdlcygKK194ZnNfYnVmX2xvb2t1cF9wYWdlcygKIAl4ZnNfYnVmX3QJCSpicCwKIAl1aW50CQkJZmxhZ3MpCiB7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UJKm1hcHBpbmcgPSBicC0+cGJfdGFyZ2V0LT5wYnJfbWFwcGluZzsKLQlzaXplX3QJCQlibG9ja3NpemUgPSBicC0+cGJfdGFyZ2V0LT5wYnJfYnNpemU7Ci0Jc2l6ZV90CQkJc2l6ZSA9IGJwLT5wYl9jb3VudF9kZXNpcmVkOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlCSptYXBwaW5nID0gYnAtPmJfdGFyZ2V0LT5idF9tYXBwaW5nOworCXNpemVfdAkJCWJsb2Nrc2l6ZSA9IGJwLT5iX3RhcmdldC0+YnRfYnNpemU7CisJc2l6ZV90CQkJc2l6ZSA9IGJwLT5iX2NvdW50X2Rlc2lyZWQ7CiAJc2l6ZV90CQkJbmJ5dGVzLCBvZmZzZXQ7Ci0JZ2ZwX3QJCQlnZnBfbWFzayA9IHBiX3RvX2dmcChmbGFncyk7CisJZ2ZwX3QJCQlnZnBfbWFzayA9IHhiX3RvX2dmcChmbGFncyk7CiAJdW5zaWduZWQgc2hvcnQJCXBhZ2VfY291bnQsIGk7CiAJcGdvZmZfdAkJCWZpcnN0OwotCWxvZmZfdAkJCWVuZDsKKwl4ZnNfb2ZmX3QJCWVuZDsKIAlpbnQJCQllcnJvcjsKIAotCWVuZCA9IGJwLT5wYl9maWxlX29mZnNldCArIGJwLT5wYl9idWZmZXJfbGVuZ3RoOwotCXBhZ2VfY291bnQgPSBwYWdlX2J1Zl9idG9jKGVuZCkgLSBwYWdlX2J1Zl9idG9jdChicC0+cGJfZmlsZV9vZmZzZXQpOworCWVuZCA9IGJwLT5iX2ZpbGVfb2Zmc2V0ICsgYnAtPmJfYnVmZmVyX2xlbmd0aDsKKwlwYWdlX2NvdW50ID0geGZzX2J1Zl9idG9jKGVuZCkgLSB4ZnNfYnVmX2J0b2N0KGJwLT5iX2ZpbGVfb2Zmc2V0KTsKIAotCWVycm9yID0gX3BhZ2VidWZfZ2V0X3BhZ2VzKGJwLCBwYWdlX2NvdW50LCBmbGFncyk7CisJZXJyb3IgPSBfeGZzX2J1Zl9nZXRfcGFnZXMoYnAsIHBhZ2VfY291bnQsIGZsYWdzKTsKIAlpZiAodW5saWtlbHkoZXJyb3IpKQogCQlyZXR1cm4gZXJyb3I7Ci0JYnAtPnBiX2ZsYWdzIHw9IF9QQkZfUEFHRV9DQUNIRTsKKwlicC0+Yl9mbGFncyB8PSBfWEJGX1BBR0VfQ0FDSEU7CiAKLQlvZmZzZXQgPSBicC0+cGJfb2Zmc2V0OwotCWZpcnN0ID0gYnAtPnBiX2ZpbGVfb2Zmc2V0ID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJb2Zmc2V0ID0gYnAtPmJfb2Zmc2V0OworCWZpcnN0ID0gYnAtPmJfZmlsZV9vZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAotCWZvciAoaSA9IDA7IGkgPCBicC0+cGJfcGFnZV9jb3VudDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGJwLT5iX3BhZ2VfY291bnQ7IGkrKykgewogCQlzdHJ1Y3QgcGFnZQkqcGFnZTsKIAkJdWludAkJcmV0cmllcyA9IDA7CiAKIAkgICAgICByZXRyeToKIAkJcGFnZSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UobWFwcGluZywgZmlyc3QgKyBpLCBnZnBfbWFzayk7CiAJCWlmICh1bmxpa2VseShwYWdlID09IE5VTEwpKSB7Ci0JCQlpZiAoZmxhZ3MgJiBQQkZfUkVBRF9BSEVBRCkgewotCQkJCWJwLT5wYl9wYWdlX2NvdW50ID0gaTsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgYnAtPnBiX3BhZ2VfY291bnQ7IGkrKykKLQkJCQkJdW5sb2NrX3BhZ2UoYnAtPnBiX3BhZ2VzW2ldKTsKKwkJCWlmIChmbGFncyAmIFhCRl9SRUFEX0FIRUFEKSB7CisJCQkJYnAtPmJfcGFnZV9jb3VudCA9IGk7CisJCQkJZm9yIChpID0gMDsgaSA8IGJwLT5iX3BhZ2VfY291bnQ7IGkrKykKKwkJCQkJdW5sb2NrX3BhZ2UoYnAtPmJfcGFnZXNbaV0pOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQogCkBAIC0zODcsMTMgKzM4OCwxMyBAQAogCQkJCQkiZGVhZGxvY2sgaW4gJXMgKG1vZGU6MHgleClcbiIsCiAJCQkJCV9fRlVOQ1RJT05fXywgZ2ZwX21hc2spOwogCi0JCQlYRlNfU1RBVFNfSU5DKHBiX3BhZ2VfcmV0cmllcyk7CisJCQlYRlNfU1RBVFNfSU5DKHhiX3BhZ2VfcmV0cmllcyk7CiAJCQl4ZnNidWZkX3dha2V1cCgwLCBnZnBfbWFzayk7CiAJCQlibGtfY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi81MCk7CiAJCQlnb3RvIHJldHJ5OwogCQl9CiAKLQkJWEZTX1NUQVRTX0lOQyhwYl9wYWdlX2ZvdW5kKTsKKwkJWEZTX1NUQVRTX0lOQyh4Yl9wYWdlX2ZvdW5kKTsKIAogCQluYnl0ZXMgPSBtaW5fdChzaXplX3QsIHNpemUsIFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldCk7CiAJCXNpemUgLT0gbmJ5dGVzOwpAQCAtNDAxLDI3ICs0MDIsMjcgQEAKIAkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKIAkJCXBhZ2VfY291bnQtLTsKIAkJCWlmIChibG9ja3NpemUgPj0gUEFHRV9DQUNIRV9TSVpFKSB7Ci0JCQkJaWYgKGZsYWdzICYgUEJGX1JFQUQpCi0JCQkJCWJwLT5wYl9sb2NrZWQgPSAxOworCQkJCWlmIChmbGFncyAmIFhCRl9SRUFEKQorCQkJCQlicC0+Yl9sb2NrZWQgPSAxOwogCQkJfSBlbHNlIGlmICghUGFnZVByaXZhdGUocGFnZSkpIHsKIAkJCQlpZiAodGVzdF9wYWdlX3JlZ2lvbihwYWdlLCBvZmZzZXQsIG5ieXRlcykpCiAJCQkJCXBhZ2VfY291bnQrKzsKIAkJCX0KIAkJfQogCi0JCWJwLT5wYl9wYWdlc1tpXSA9IHBhZ2U7CisJCWJwLT5iX3BhZ2VzW2ldID0gcGFnZTsKIAkJb2Zmc2V0ID0gMDsKIAl9CiAKLQlpZiAoIWJwLT5wYl9sb2NrZWQpIHsKLQkJZm9yIChpID0gMDsgaSA8IGJwLT5wYl9wYWdlX2NvdW50OyBpKyspCi0JCQl1bmxvY2tfcGFnZShicC0+cGJfcGFnZXNbaV0pOworCWlmICghYnAtPmJfbG9ja2VkKSB7CisJCWZvciAoaSA9IDA7IGkgPCBicC0+Yl9wYWdlX2NvdW50OyBpKyspCisJCQl1bmxvY2tfcGFnZShicC0+Yl9wYWdlc1tpXSk7CiAJfQogCi0JaWYgKHBhZ2VfY291bnQgPT0gYnAtPnBiX3BhZ2VfY291bnQpCi0JCWJwLT5wYl9mbGFncyB8PSBQQkZfRE9ORTsKKwlpZiAocGFnZV9jb3VudCA9PSBicC0+Yl9wYWdlX2NvdW50KQorCQlicC0+Yl9mbGFncyB8PSBYQkZfRE9ORTsKIAotCVBCX1RSQUNFKGJwLCAibG9va3VwX3BhZ2VzIiwgKGxvbmcpcGFnZV9jb3VudCk7CisJWEJfVFJBQ0UoYnAsICJsb29rdXBfcGFnZXMiLCAobG9uZylwYWdlX2NvdW50KTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTQyOSwyMyArNDMwLDIzIEBACiAgKglNYXAgYnVmZmVyIGludG8ga2VybmVsIGFkZHJlc3Mtc3BhY2UgaWYgbmVzc2VjYXJ5LgogICovCiBTVEFUSUMgaW50Ci1fcGFnZWJ1Zl9tYXBfcGFnZXMoCitfeGZzX2J1Zl9tYXBfcGFnZXMoCiAJeGZzX2J1Zl90CQkqYnAsCiAJdWludAkJCWZsYWdzKQogewogCS8qIEEgc2luZ2xlIHBhZ2UgYnVmZmVyIGlzIGFsd2F5cyBtYXBwYWJsZSAqLwotCWlmIChicC0+cGJfcGFnZV9jb3VudCA9PSAxKSB7Ci0JCWJwLT5wYl9hZGRyID0gcGFnZV9hZGRyZXNzKGJwLT5wYl9wYWdlc1swXSkgKyBicC0+cGJfb2Zmc2V0OwotCQlicC0+cGJfZmxhZ3MgfD0gUEJGX01BUFBFRDsKLQl9IGVsc2UgaWYgKGZsYWdzICYgUEJGX01BUFBFRCkgeworCWlmIChicC0+Yl9wYWdlX2NvdW50ID09IDEpIHsKKwkJYnAtPmJfYWRkciA9IHBhZ2VfYWRkcmVzcyhicC0+Yl9wYWdlc1swXSkgKyBicC0+Yl9vZmZzZXQ7CisJCWJwLT5iX2ZsYWdzIHw9IFhCRl9NQVBQRUQ7CisJfSBlbHNlIGlmIChmbGFncyAmIFhCRl9NQVBQRUQpIHsKIAkJaWYgKGFzX2xpc3RfbGVuID4gNjQpCiAJCQlwdXJnZV9hZGRyZXNzZXMoKTsKLQkJYnAtPnBiX2FkZHIgPSB2bWFwKGJwLT5wYl9wYWdlcywgYnAtPnBiX3BhZ2VfY291bnQsCi0JCQkJVk1fTUFQLCBQQUdFX0tFUk5FTCk7Ci0JCWlmICh1bmxpa2VseShicC0+cGJfYWRkciA9PSBOVUxMKSkKKwkJYnAtPmJfYWRkciA9IHZtYXAoYnAtPmJfcGFnZXMsIGJwLT5iX3BhZ2VfY291bnQsCisJCQkJCVZNX01BUCwgUEFHRV9LRVJORUwpOworCQlpZiAodW5saWtlbHkoYnAtPmJfYWRkciA9PSBOVUxMKSkKIAkJCXJldHVybiAtRU5PTUVNOwotCQlicC0+cGJfYWRkciArPSBicC0+cGJfb2Zmc2V0OwotCQlicC0+cGJfZmxhZ3MgfD0gUEJGX01BUFBFRDsKKwkJYnAtPmJfYWRkciArPSBicC0+Yl9vZmZzZXQ7CisJCWJwLT5iX2ZsYWdzIHw9IFhCRl9NQVBQRUQ7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC00NTYsOSArNDU3LDcgQEAKICAqLwogCiAvKgotICoJX3BhZ2VidWZfZmluZAotICoKLSAqCUxvb2tzIHVwLCBhbmQgY3JlYXRlcyBpZiBhYnNlbnQsIGEgbG9ja2FibGUgYnVmZmVyIGZvcgorICoJTG9vayB1cCwgYW5kIGNyZWF0ZXMgaWYgYWJzZW50LCBhIGxvY2thYmxlIGJ1ZmZlciBmb3IKICAqCWEgZ2l2ZW4gcmFuZ2Ugb2YgYW4gaW5vZGUuICBUaGUgYnVmZmVyIGlzIHJldHVybmVkCiAgKglsb2NrZWQuCSBJZiBvdGhlciBvdmVybGFwcGluZyBidWZmZXJzIGV4aXN0LCB0aGV5IGFyZQogICoJcmVsZWFzZWQgYmVmb3JlIHRoZSBuZXcgYnVmZmVyIGlzIGNyZWF0ZWQgYW5kIGxvY2tlZCwKQEAgLTQ2Niw1NSArNDY1LDU1IEBACiAgKglhcmUgdW5sb2NrZWQuICBObyBJL08gaXMgaW1wbGllZCBieSB0aGlzIGNhbGwuCiAgKi8KIHhmc19idWZfdCAqCi1fcGFnZWJ1Zl9maW5kKAorX3hmc19idWZfZmluZCgKIAl4ZnNfYnVmdGFyZ190CQkqYnRwLAkvKiBibG9jayBkZXZpY2UgdGFyZ2V0CQkqLwotCWxvZmZfdAkJCWlvZmYsCS8qIHN0YXJ0aW5nIG9mZnNldCBvZiByYW5nZQkqLworCXhmc19vZmZfdAkJaW9mZiwJLyogc3RhcnRpbmcgb2Zmc2V0IG9mIHJhbmdlCSovCiAJc2l6ZV90CQkJaXNpemUsCS8qIGxlbmd0aCBvZiByYW5nZQkJKi8KLQlwYWdlX2J1Zl9mbGFnc190CWZsYWdzLAkvKiBQQkZfVFJZTE9DSwkJCSovCi0JeGZzX2J1Zl90CQkqbmV3X3BiKS8qIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIJKi8KKwl4ZnNfYnVmX2ZsYWdzX3QJCWZsYWdzLAorCXhmc19idWZfdAkJKm5ld19icCkKIHsKLQlsb2ZmX3QJCQlyYW5nZV9iYXNlOworCXhmc19vZmZfdAkJcmFuZ2VfYmFzZTsKIAlzaXplX3QJCQlyYW5nZV9sZW5ndGg7CiAJeGZzX2J1Zmhhc2hfdAkJKmhhc2g7Ci0JeGZzX2J1Zl90CQkqcGIsICpuOworCXhmc19idWZfdAkJKmJwLCAqbjsKIAogCXJhbmdlX2Jhc2UgPSAoaW9mZiA8PCBCQlNISUZUKTsKIAlyYW5nZV9sZW5ndGggPSAoaXNpemUgPDwgQkJTSElGVCk7CiAKIAkvKiBDaGVjayBmb3IgSU9zIHNtYWxsZXIgdGhhbiB0aGUgc2VjdG9yIHNpemUgLyBub3Qgc2VjdG9yIGFsaWduZWQgKi8KLQlBU1NFUlQoIShyYW5nZV9sZW5ndGggPCAoMSA8PCBidHAtPnBicl9zc2hpZnQpKSk7Ci0JQVNTRVJUKCEocmFuZ2VfYmFzZSAmIChsb2ZmX3QpYnRwLT5wYnJfc21hc2spKTsKKwlBU1NFUlQoIShyYW5nZV9sZW5ndGggPCAoMSA8PCBidHAtPmJ0X3NzaGlmdCkpKTsKKwlBU1NFUlQoIShyYW5nZV9iYXNlICYgKHhmc19vZmZfdClidHAtPmJ0X3NtYXNrKSk7CiAKIAloYXNoID0gJmJ0cC0+YnRfaGFzaFtoYXNoX2xvbmcoKHVuc2lnbmVkIGxvbmcpaW9mZiwgYnRwLT5idF9oYXNoc2hpZnQpXTsKIAogCXNwaW5fbG9jaygmaGFzaC0+YmhfbG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGIsIG4sICZoYXNoLT5iaF9saXN0LCBwYl9oYXNoX2xpc3QpIHsKLQkJQVNTRVJUKGJ0cCA9PSBwYi0+cGJfdGFyZ2V0KTsKLQkJaWYgKHBiLT5wYl9maWxlX29mZnNldCA9PSByYW5nZV9iYXNlICYmCi0JCSAgICBwYi0+cGJfYnVmZmVyX2xlbmd0aCA9PSByYW5nZV9sZW5ndGgpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnAsIG4sICZoYXNoLT5iaF9saXN0LCBiX2hhc2hfbGlzdCkgeworCQlBU1NFUlQoYnRwID09IGJwLT5iX3RhcmdldCk7CisJCWlmIChicC0+Yl9maWxlX29mZnNldCA9PSByYW5nZV9iYXNlICYmCisJCSAgICBicC0+Yl9idWZmZXJfbGVuZ3RoID09IHJhbmdlX2xlbmd0aCkgewogCQkJLyoKLQkJCSAqIElmIHdlIGxvb2sgYXQgc29tZXRoaW5nIGJyaW5nIGl0IHRvIHRoZQorCQkJICogSWYgd2UgbG9vayBhdCBzb21ldGhpbmcsIGJyaW5nIGl0IHRvIHRoZQogCQkJICogZnJvbnQgb2YgdGhlIGxpc3QgZm9yIG5leHQgdGltZS4KIAkJCSAqLwotCQkJYXRvbWljX2luYygmcGItPnBiX2hvbGQpOwotCQkJbGlzdF9tb3ZlKCZwYi0+cGJfaGFzaF9saXN0LCAmaGFzaC0+YmhfbGlzdCk7CisJCQlhdG9taWNfaW5jKCZicC0+Yl9ob2xkKTsKKwkJCWxpc3RfbW92ZSgmYnAtPmJfaGFzaF9saXN0LCAmaGFzaC0+YmhfbGlzdCk7CiAJCQlnb3RvIGZvdW5kOwogCQl9CiAJfQogCiAJLyogTm8gbWF0Y2ggZm91bmQgKi8KLQlpZiAobmV3X3BiKSB7Ci0JCV9wYWdlYnVmX2luaXRpYWxpemUobmV3X3BiLCBidHAsIHJhbmdlX2Jhc2UsCisJaWYgKG5ld19icCkgeworCQlfeGZzX2J1Zl9pbml0aWFsaXplKG5ld19icCwgYnRwLCByYW5nZV9iYXNlLAogCQkJCXJhbmdlX2xlbmd0aCwgZmxhZ3MpOwotCQluZXdfcGItPnBiX2hhc2ggPSBoYXNoOwotCQlsaXN0X2FkZCgmbmV3X3BiLT5wYl9oYXNoX2xpc3QsICZoYXNoLT5iaF9saXN0KTsKKwkJbmV3X2JwLT5iX2hhc2ggPSBoYXNoOworCQlsaXN0X2FkZCgmbmV3X2JwLT5iX2hhc2hfbGlzdCwgJmhhc2gtPmJoX2xpc3QpOwogCX0gZWxzZSB7Ci0JCVhGU19TVEFUU19JTkMocGJfbWlzc19sb2NrZWQpOworCQlYRlNfU1RBVFNfSU5DKHhiX21pc3NfbG9ja2VkKTsKIAl9CiAKIAlzcGluX3VubG9jaygmaGFzaC0+YmhfbG9jayk7Ci0JcmV0dXJuIG5ld19wYjsKKwlyZXR1cm4gbmV3X2JwOwogCiBmb3VuZDoKIAlzcGluX3VubG9jaygmaGFzaC0+YmhfbG9jayk7CkBAIC01MjMsNzQgKzUyMiw3MiBAQAogCSAqIGlmIHRoaXMgZG9lcyBub3Qgd29yayB0aGVuIHdlIG5lZWQgdG8gZHJvcCB0aGUKIAkgKiBzcGlubG9jayBhbmQgZG8gYSBoYXJkIGF0dGVtcHQgb24gdGhlIHNlbWFwaG9yZS4KIAkgKi8KLQlpZiAoZG93bl90cnlsb2NrKCZwYi0+cGJfc2VtYSkpIHsKLQkJaWYgKCEoZmxhZ3MgJiBQQkZfVFJZTE9DSykpIHsKKwlpZiAoZG93bl90cnlsb2NrKCZicC0+Yl9zZW1hKSkgeworCQlpZiAoIShmbGFncyAmIFhCRl9UUllMT0NLKSkgewogCQkJLyogd2FpdCBmb3IgYnVmZmVyIG93bmVyc2hpcCAqLwotCQkJUEJfVFJBQ0UocGIsICJnZXRfbG9jayIsIDApOwotCQkJcGFnZWJ1Zl9sb2NrKHBiKTsKLQkJCVhGU19TVEFUU19JTkMocGJfZ2V0X2xvY2tlZF93YWl0ZWQpOworCQkJWEJfVFJBQ0UoYnAsICJnZXRfbG9jayIsIDApOworCQkJeGZzX2J1Zl9sb2NrKGJwKTsKKwkJCVhGU19TVEFUU19JTkMoeGJfZ2V0X2xvY2tlZF93YWl0ZWQpOwogCQl9IGVsc2UgewogCQkJLyogV2UgYXNrZWQgZm9yIGEgdHJ5bG9jayBhbmQgZmFpbGVkLCBubyBuZWVkCiAJCQkgKiB0byBsb29rIGF0IGZpbGUgb2Zmc2V0IGFuZCBsZW5ndGggaGVyZSwgd2UKLQkJCSAqIGtub3cgdGhhdCB0aGlzIHBhZ2VidWYgYXQgbGVhc3Qgb3ZlcmxhcHMgb3VyCi0JCQkgKiBwYWdlYnVmIGFuZCBpcyBsb2NrZWQsIHRoZXJlZm9yZSBvdXIgYnVmZmVyCi0JCQkgKiBlaXRoZXIgZG9lcyBub3QgZXhpc3QsIG9yIGlzIHRoaXMgYnVmZmVyCisJCQkgKiBrbm93IHRoYXQgdGhpcyBidWZmZXIgYXQgbGVhc3Qgb3ZlcmxhcHMgb3VyCisJCQkgKiBidWZmZXIgYW5kIGlzIGxvY2tlZCwgdGhlcmVmb3JlIG91ciBidWZmZXIKKwkJCSAqIGVpdGhlciBkb2VzIG5vdCBleGlzdCwgb3IgaXMgdGhpcyBidWZmZXIuCiAJCQkgKi8KLQotCQkJcGFnZWJ1Zl9yZWxlKHBiKTsKLQkJCVhGU19TVEFUU19JTkMocGJfYnVzeV9sb2NrZWQpOwotCQkJcmV0dXJuIChOVUxMKTsKKwkJCXhmc19idWZfcmVsZShicCk7CisJCQlYRlNfU1RBVFNfSU5DKHhiX2J1c3lfbG9ja2VkKTsKKwkJCXJldHVybiBOVUxMOwogCQl9CiAJfSBlbHNlIHsKIAkJLyogdHJ5bG9jayB3b3JrZWQgKi8KLQkJUEJfU0VUX09XTkVSKHBiKTsKKwkJWEJfU0VUX09XTkVSKGJwKTsKIAl9CiAKLQlpZiAocGItPnBiX2ZsYWdzICYgUEJGX1NUQUxFKSB7Ci0JCUFTU0VSVCgocGItPnBiX2ZsYWdzICYgX1BCRl9ERUxXUklfUSkgPT0gMCk7Ci0JCXBiLT5wYl9mbGFncyAmPSBQQkZfTUFQUEVEOworCWlmIChicC0+Yl9mbGFncyAmIFhCRl9TVEFMRSkgeworCQlBU1NFUlQoKGJwLT5iX2ZsYWdzICYgX1hCRl9ERUxXUklfUSkgPT0gMCk7CisJCWJwLT5iX2ZsYWdzICY9IFhCRl9NQVBQRUQ7CiAJfQotCVBCX1RSQUNFKHBiLCAiZ290X2xvY2siLCAwKTsKLQlYRlNfU1RBVFNfSU5DKHBiX2dldF9sb2NrZWQpOwotCXJldHVybiAocGIpOworCVhCX1RSQUNFKGJwLCAiZ290X2xvY2siLCAwKTsKKwlYRlNfU1RBVFNfSU5DKHhiX2dldF9sb2NrZWQpOworCXJldHVybiBicDsKIH0KIAogLyoKLSAqCXhmc19idWZfZ2V0X2ZsYWdzIGFzc2VtYmxlcyBhIGJ1ZmZlciBjb3ZlcmluZyB0aGUgc3BlY2lmaWVkIHJhbmdlLgotICoKKyAqCUFzc2VtYmxlcyBhIGJ1ZmZlciBjb3ZlcmluZyB0aGUgc3BlY2lmaWVkIHJhbmdlLgogICoJU3RvcmFnZSBpbiBtZW1vcnkgZm9yIGFsbCBwb3J0aW9ucyBvZiB0aGUgYnVmZmVyIHdpbGwgYmUgYWxsb2NhdGVkLAogICoJYWx0aG91Z2ggYmFja2luZyBzdG9yYWdlIG1heSBub3QgYmUuCiAgKi8KIHhmc19idWZfdCAqCi14ZnNfYnVmX2dldF9mbGFncygJCQkvKiBhbGxvY2F0ZSBhIGJ1ZmZlcgkJKi8KK3hmc19idWZfZ2V0X2ZsYWdzKAogCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQsLyogdGFyZ2V0IGZvciBidWZmZXIJCSovCi0JbG9mZl90CQkJaW9mZiwJLyogc3RhcnRpbmcgb2Zmc2V0IG9mIHJhbmdlCSovCisJeGZzX29mZl90CQlpb2ZmLAkvKiBzdGFydGluZyBvZmZzZXQgb2YgcmFuZ2UJKi8KIAlzaXplX3QJCQlpc2l6ZSwJLyogbGVuZ3RoIG9mIHJhbmdlCQkqLwotCXBhZ2VfYnVmX2ZsYWdzX3QJZmxhZ3MpCS8qIFBCRl9UUllMT0NLCQkJKi8KKwl4ZnNfYnVmX2ZsYWdzX3QJCWZsYWdzKQogewotCXhmc19idWZfdAkJKnBiLCAqbmV3X3BiOworCXhmc19idWZfdAkJKmJwLCAqbmV3X2JwOwogCWludAkJCWVycm9yID0gMCwgaTsKIAotCW5ld19wYiA9IHBhZ2VidWZfYWxsb2NhdGUoZmxhZ3MpOwotCWlmICh1bmxpa2VseSghbmV3X3BiKSkKKwluZXdfYnAgPSB4ZnNfYnVmX2FsbG9jYXRlKGZsYWdzKTsKKwlpZiAodW5saWtlbHkoIW5ld19icCkpCiAJCXJldHVybiBOVUxMOwogCi0JcGIgPSBfcGFnZWJ1Zl9maW5kKHRhcmdldCwgaW9mZiwgaXNpemUsIGZsYWdzLCBuZXdfcGIpOwotCWlmIChwYiA9PSBuZXdfcGIpIHsKLQkJZXJyb3IgPSBfcGFnZWJ1Zl9sb29rdXBfcGFnZXMocGIsIGZsYWdzKTsKKwlicCA9IF94ZnNfYnVmX2ZpbmQodGFyZ2V0LCBpb2ZmLCBpc2l6ZSwgZmxhZ3MsIG5ld19icCk7CisJaWYgKGJwID09IG5ld19icCkgeworCQllcnJvciA9IF94ZnNfYnVmX2xvb2t1cF9wYWdlcyhicCwgZmxhZ3MpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG5vX2J1ZmZlcjsKIAl9IGVsc2UgewotCQlwYWdlYnVmX2RlYWxsb2NhdGUobmV3X3BiKTsKLQkJaWYgKHVubGlrZWx5KHBiID09IE5VTEwpKQorCQl4ZnNfYnVmX2RlYWxsb2NhdGUobmV3X2JwKTsKKwkJaWYgKHVubGlrZWx5KGJwID09IE5VTEwpKQogCQkJcmV0dXJuIE5VTEw7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IHBiLT5wYl9wYWdlX2NvdW50OyBpKyspCi0JCW1hcmtfcGFnZV9hY2Nlc3NlZChwYi0+cGJfcGFnZXNbaV0pOworCWZvciAoaSA9IDA7IGkgPCBicC0+Yl9wYWdlX2NvdW50OyBpKyspCisJCW1hcmtfcGFnZV9hY2Nlc3NlZChicC0+Yl9wYWdlc1tpXSk7CiAKLQlpZiAoIShwYi0+cGJfZmxhZ3MgJiBQQkZfTUFQUEVEKSkgewotCQllcnJvciA9IF9wYWdlYnVmX21hcF9wYWdlcyhwYiwgZmxhZ3MpOworCWlmICghKGJwLT5iX2ZsYWdzICYgWEJGX01BUFBFRCkpIHsKKwkJZXJyb3IgPSBfeGZzX2J1Zl9tYXBfcGFnZXMoYnAsIGZsYWdzKTsKIAkJaWYgKHVubGlrZWx5KGVycm9yKSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZhaWxlZCB0byBtYXAgcGFnZXNcbiIsCiAJCQkJCV9fRlVOQ1RJT05fXyk7CkBAIC01OTgsOTcgKzU5NSw5NyBAQAogCQl9CiAJfQogCi0JWEZTX1NUQVRTX0lOQyhwYl9nZXQpOworCVhGU19TVEFUU19JTkMoeGJfZ2V0KTsKIAogCS8qCiAJICogQWx3YXlzIGZpbGwgaW4gdGhlIGJsb2NrIG51bWJlciBub3csIHRoZSBtYXBwZWQgY2FzZXMgY2FuIGRvCiAJICogdGhlaXIgb3duIG92ZXJsYXkgb2YgdGhpcyBsYXRlci4KIAkgKi8KLQlwYi0+cGJfYm4gPSBpb2ZmOwotCXBiLT5wYl9jb3VudF9kZXNpcmVkID0gcGItPnBiX2J1ZmZlcl9sZW5ndGg7CisJYnAtPmJfYm4gPSBpb2ZmOworCWJwLT5iX2NvdW50X2Rlc2lyZWQgPSBicC0+Yl9idWZmZXJfbGVuZ3RoOwogCi0JUEJfVFJBQ0UocGIsICJnZXQiLCAodW5zaWduZWQgbG9uZylmbGFncyk7Ci0JcmV0dXJuIHBiOworCVhCX1RSQUNFKGJwLCAiZ2V0IiwgKHVuc2lnbmVkIGxvbmcpZmxhZ3MpOworCXJldHVybiBicDsKIAogIG5vX2J1ZmZlcjoKLQlpZiAoZmxhZ3MgJiAoUEJGX0xPQ0sgfCBQQkZfVFJZTE9DSykpCi0JCXBhZ2VidWZfdW5sb2NrKHBiKTsKLQlwYWdlYnVmX3JlbGUocGIpOworCWlmIChmbGFncyAmIChYQkZfTE9DSyB8IFhCRl9UUllMT0NLKSkKKwkJeGZzX2J1Zl91bmxvY2soYnApOworCXhmc19idWZfcmVsZShicCk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKIHhmc19idWZfdCAqCiB4ZnNfYnVmX3JlYWRfZmxhZ3MoCiAJeGZzX2J1ZnRhcmdfdAkJKnRhcmdldCwKLQlsb2ZmX3QJCQlpb2ZmLAorCXhmc19vZmZfdAkJaW9mZiwKIAlzaXplX3QJCQlpc2l6ZSwKLQlwYWdlX2J1Zl9mbGFnc190CWZsYWdzKQorCXhmc19idWZfZmxhZ3NfdAkJZmxhZ3MpCiB7Ci0JeGZzX2J1Zl90CQkqcGI7CisJeGZzX2J1Zl90CQkqYnA7CiAKLQlmbGFncyB8PSBQQkZfUkVBRDsKKwlmbGFncyB8PSBYQkZfUkVBRDsKIAotCXBiID0geGZzX2J1Zl9nZXRfZmxhZ3ModGFyZ2V0LCBpb2ZmLCBpc2l6ZSwgZmxhZ3MpOwotCWlmIChwYikgewotCQlpZiAoIVhGU19CVUZfSVNET05FKHBiKSkgewotCQkJUEJfVFJBQ0UocGIsICJyZWFkIiwgKHVuc2lnbmVkIGxvbmcpZmxhZ3MpOwotCQkJWEZTX1NUQVRTX0lOQyhwYl9nZXRfcmVhZCk7Ci0JCQlwYWdlYnVmX2lvc3RhcnQocGIsIGZsYWdzKTsKLQkJfSBlbHNlIGlmIChmbGFncyAmIFBCRl9BU1lOQykgewotCQkJUEJfVFJBQ0UocGIsICJyZWFkX2FzeW5jIiwgKHVuc2lnbmVkIGxvbmcpZmxhZ3MpOworCWJwID0geGZzX2J1Zl9nZXRfZmxhZ3ModGFyZ2V0LCBpb2ZmLCBpc2l6ZSwgZmxhZ3MpOworCWlmIChicCkgeworCQlpZiAoIVhGU19CVUZfSVNET05FKGJwKSkgeworCQkJWEJfVFJBQ0UoYnAsICJyZWFkIiwgKHVuc2lnbmVkIGxvbmcpZmxhZ3MpOworCQkJWEZTX1NUQVRTX0lOQyh4Yl9nZXRfcmVhZCk7CisJCQl4ZnNfYnVmX2lvc3RhcnQoYnAsIGZsYWdzKTsKKwkJfSBlbHNlIGlmIChmbGFncyAmIFhCRl9BU1lOQykgeworCQkJWEJfVFJBQ0UoYnAsICJyZWFkX2FzeW5jIiwgKHVuc2lnbmVkIGxvbmcpZmxhZ3MpOwogCQkJLyoKIAkJCSAqIFJlYWQgYWhlYWQgY2FsbCB3aGljaCBpcyBhbHJlYWR5IHNhdGlzZmllZCwKIAkJCSAqIGRyb3AgdGhlIGJ1ZmZlcgogCQkJICovCiAJCQlnb3RvIG5vX2J1ZmZlcjsKIAkJfSBlbHNlIHsKLQkJCVBCX1RSQUNFKHBiLCAicmVhZF9kb25lIiwgKHVuc2lnbmVkIGxvbmcpZmxhZ3MpOworCQkJWEJfVFJBQ0UoYnAsICJyZWFkX2RvbmUiLCAodW5zaWduZWQgbG9uZylmbGFncyk7CiAJCQkvKiBXZSBkbyBub3Qgd2FudCByZWFkIGluIHRoZSBmbGFncyAqLwotCQkJcGItPnBiX2ZsYWdzICY9IH5QQkZfUkVBRDsKKwkJCWJwLT5iX2ZsYWdzICY9IH5YQkZfUkVBRDsKIAkJfQogCX0KIAotCXJldHVybiBwYjsKKwlyZXR1cm4gYnA7CiAKICBub19idWZmZXI6Ci0JaWYgKGZsYWdzICYgKFBCRl9MT0NLIHwgUEJGX1RSWUxPQ0spKQotCQlwYWdlYnVmX3VubG9jayhwYik7Ci0JcGFnZWJ1Zl9yZWxlKHBiKTsKKwlpZiAoZmxhZ3MgJiAoWEJGX0xPQ0sgfCBYQkZfVFJZTE9DSykpCisJCXhmc19idWZfdW5sb2NrKGJwKTsKKwl4ZnNfYnVmX3JlbGUoYnApOwogCXJldHVybiBOVUxMOwogfQogCiAvKgotICogSWYgd2UgYXJlIG5vdCBsb3cgb24gbWVtb3J5IHRoZW4gZG8gdGhlIHJlYWRhaGVhZCBpbiBhIGRlYWRsb2NrCi0gKiBzYWZlIG1hbm5lci4KKyAqCUlmIHdlIGFyZSBub3QgbG93IG9uIG1lbW9yeSB0aGVuIGRvIHRoZSByZWFkYWhlYWQgaW4gYSBkZWFkbG9jaworICoJc2FmZSBtYW5uZXIuCiAgKi8KIHZvaWQKLXBhZ2VidWZfcmVhZGFoZWFkKAoreGZzX2J1Zl9yZWFkYWhlYWQoCiAJeGZzX2J1ZnRhcmdfdAkJKnRhcmdldCwKLQlsb2ZmX3QJCQlpb2ZmLAorCXhmc19vZmZfdAkJaW9mZiwKIAlzaXplX3QJCQlpc2l6ZSwKLQlwYWdlX2J1Zl9mbGFnc190CWZsYWdzKQorCXhmc19idWZfZmxhZ3NfdAkJZmxhZ3MpCiB7CiAJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaTsKIAotCWJkaSA9IHRhcmdldC0+cGJyX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm87CisJYmRpID0gdGFyZ2V0LT5idF9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOwogCWlmIChiZGlfcmVhZF9jb25nZXN0ZWQoYmRpKSkKIAkJcmV0dXJuOwogCi0JZmxhZ3MgfD0gKFBCRl9UUllMT0NLfFBCRl9BU1lOQ3xQQkZfUkVBRF9BSEVBRCk7CisJZmxhZ3MgfD0gKFhCRl9UUllMT0NLfFhCRl9BU1lOQ3xYQkZfUkVBRF9BSEVBRCk7CiAJeGZzX2J1Zl9yZWFkX2ZsYWdzKHRhcmdldCwgaW9mZiwgaXNpemUsIGZsYWdzKTsKIH0KIAogeGZzX2J1Zl90ICoKLXBhZ2VidWZfZ2V0X2VtcHR5KAoreGZzX2J1Zl9nZXRfZW1wdHkoCiAJc2l6ZV90CQkJbGVuLAogCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQpCiB7Ci0JeGZzX2J1Zl90CQkqcGI7CisJeGZzX2J1Zl90CQkqYnA7CiAKLQlwYiA9IHBhZ2VidWZfYWxsb2NhdGUoMCk7Ci0JaWYgKHBiKQotCQlfcGFnZWJ1Zl9pbml0aWFsaXplKHBiLCB0YXJnZXQsIDAsIGxlbiwgMCk7Ci0JcmV0dXJuIHBiOworCWJwID0geGZzX2J1Zl9hbGxvY2F0ZSgwKTsKKwlpZiAoYnApCisJCV94ZnNfYnVmX2luaXRpYWxpemUoYnAsIHRhcmdldCwgMCwgbGVuLCAwKTsKKwlyZXR1cm4gYnA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKgpAQCAtNzA0LDggKzcwMSw4IEBACiB9CiAKIGludAotcGFnZWJ1Zl9hc3NvY2lhdGVfbWVtb3J5KAotCXhmc19idWZfdAkJKnBiLAoreGZzX2J1Zl9hc3NvY2lhdGVfbWVtb3J5KAorCXhmc19idWZfdAkJKmJwLAogCXZvaWQJCQkqbWVtLAogCXNpemVfdAkJCWxlbikKIHsKQEAgLTcyMiw0MCArNzE5LDQwIEBACiAJCXBhZ2VfY291bnQrKzsKIAogCS8qIEZyZWUgYW55IHByZXZpb3VzIHNldCBvZiBwYWdlIHBvaW50ZXJzICovCi0JaWYgKHBiLT5wYl9wYWdlcykKLQkJX3BhZ2VidWZfZnJlZV9wYWdlcyhwYik7CisJaWYgKGJwLT5iX3BhZ2VzKQorCQlfeGZzX2J1Zl9mcmVlX3BhZ2VzKGJwKTsKIAotCXBiLT5wYl9wYWdlcyA9IE5VTEw7Ci0JcGItPnBiX2FkZHIgPSBtZW07CisJYnAtPmJfcGFnZXMgPSBOVUxMOworCWJwLT5iX2FkZHIgPSBtZW07CiAKLQlydmFsID0gX3BhZ2VidWZfZ2V0X3BhZ2VzKHBiLCBwYWdlX2NvdW50LCAwKTsKKwlydmFsID0gX3hmc19idWZfZ2V0X3BhZ2VzKGJwLCBwYWdlX2NvdW50LCAwKTsKIAlpZiAocnZhbCkKIAkJcmV0dXJuIHJ2YWw7CiAKLQlwYi0+cGJfb2Zmc2V0ID0gb2Zmc2V0OworCWJwLT5iX29mZnNldCA9IG9mZnNldDsKIAlwdHIgPSAoc2l6ZV90KSBtZW0gJiBQQUdFX0NBQ0hFX01BU0s7CiAJZW5kID0gUEFHRV9DQUNIRV9BTElHTigoc2l6ZV90KSBtZW0gKyBsZW4pOwogCWVuZF9jdXIgPSBlbmQ7CiAJLyogc2V0IHVwIGZpcnN0IHBhZ2UgKi8KLQlwYi0+cGJfcGFnZXNbMF0gPSBtZW1fdG9fcGFnZShtZW0pOworCWJwLT5iX3BhZ2VzWzBdID0gbWVtX3RvX3BhZ2UobWVtKTsKIAogCXB0ciArPSBQQUdFX0NBQ0hFX1NJWkU7Ci0JcGItPnBiX3BhZ2VfY291bnQgPSArK2k7CisJYnAtPmJfcGFnZV9jb3VudCA9ICsraTsKIAl3aGlsZSAocHRyIDwgZW5kKSB7Ci0JCXBiLT5wYl9wYWdlc1tpXSA9IG1lbV90b19wYWdlKCh2b2lkICopcHRyKTsKLQkJcGItPnBiX3BhZ2VfY291bnQgPSArK2k7CisJCWJwLT5iX3BhZ2VzW2ldID0gbWVtX3RvX3BhZ2UoKHZvaWQgKilwdHIpOworCQlicC0+Yl9wYWdlX2NvdW50ID0gKytpOwogCQlwdHIgKz0gUEFHRV9DQUNIRV9TSVpFOwogCX0KLQlwYi0+cGJfbG9ja2VkID0gMDsKKwlicC0+Yl9sb2NrZWQgPSAwOwogCi0JcGItPnBiX2NvdW50X2Rlc2lyZWQgPSBwYi0+cGJfYnVmZmVyX2xlbmd0aCA9IGxlbjsKLQlwYi0+cGJfZmxhZ3MgfD0gUEJGX01BUFBFRDsKKwlicC0+Yl9jb3VudF9kZXNpcmVkID0gYnAtPmJfYnVmZmVyX2xlbmd0aCA9IGxlbjsKKwlicC0+Yl9mbGFncyB8PSBYQkZfTUFQUEVEOwogCiAJcmV0dXJuIDA7CiB9CiAKIHhmc19idWZfdCAqCi1wYWdlYnVmX2dldF9ub19kYWRkcigKK3hmc19idWZfZ2V0X25vYWRkcigKIAlzaXplX3QJCQlsZW4sCiAJeGZzX2J1ZnRhcmdfdAkJKnRhcmdldCkKIHsKQEAgLTc2NCwxMCArNzYxLDEwIEBACiAJdm9pZAkJCSpkYXRhOwogCWludAkJCWVycm9yOwogCi0JYnAgPSBwYWdlYnVmX2FsbG9jYXRlKDApOworCWJwID0geGZzX2J1Zl9hbGxvY2F0ZSgwKTsKIAlpZiAodW5saWtlbHkoYnAgPT0gTlVMTCkpCiAJCWdvdG8gZmFpbDsKLQlfcGFnZWJ1Zl9pbml0aWFsaXplKGJwLCB0YXJnZXQsIDAsIGxlbiwgMCk7CisJX3hmc19idWZfaW5pdGlhbGl6ZShicCwgdGFyZ2V0LCAwLCBsZW4sIDApOwogCiAgdHJ5X2FnYWluOgogCWRhdGEgPSBrbWVtX2FsbG9jKG1hbGxvY19sZW4sIEtNX1NMRUVQIHwgS01fTUFZRkFJTCk7CkBAIC03NzYsNzggKzc3Myw3MyBAQAogCiAJLyogY2hlY2sgd2hldGhlciBhbGlnbm1lbnQgbWF0Y2hlcy4uICovCiAJaWYgKChfX3BzdW5zaWduZWRfdClkYXRhICE9Ci0JICAgICgoX19wc3Vuc2lnbmVkX3QpZGF0YSAmIH50YXJnZXQtPnBicl9zbWFzaykpIHsKKwkgICAgKChfX3BzdW5zaWduZWRfdClkYXRhICYgfnRhcmdldC0+YnRfc21hc2spKSB7CiAJCS8qIC4uIGVsc2UgZG91YmxlIHRoZSBzaXplIGFuZCB0cnkgYWdhaW4gKi8KIAkJa21lbV9mcmVlKGRhdGEsIG1hbGxvY19sZW4pOwogCQltYWxsb2NfbGVuIDw8PSAxOwogCQlnb3RvIHRyeV9hZ2FpbjsKIAl9CiAKLQllcnJvciA9IHBhZ2VidWZfYXNzb2NpYXRlX21lbW9yeShicCwgZGF0YSwgbGVuKTsKKwllcnJvciA9IHhmc19idWZfYXNzb2NpYXRlX21lbW9yeShicCwgZGF0YSwgbGVuKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZmFpbF9mcmVlX21lbTsKLQlicC0+cGJfZmxhZ3MgfD0gX1BCRl9LTUVNX0FMTE9DOworCWJwLT5iX2ZsYWdzIHw9IF9YQkZfS01FTV9BTExPQzsKIAotCXBhZ2VidWZfdW5sb2NrKGJwKTsKKwl4ZnNfYnVmX3VubG9jayhicCk7CiAKLQlQQl9UUkFDRShicCwgIm5vX2RhZGRyIiwgZGF0YSk7CisJWEJfVFJBQ0UoYnAsICJub19kYWRkciIsIGRhdGEpOwogCXJldHVybiBicDsKICBmYWlsX2ZyZWVfbWVtOgogCWttZW1fZnJlZShkYXRhLCBtYWxsb2NfbGVuKTsKICBmYWlsX2ZyZWVfYnVmOgotCXBhZ2VidWZfZnJlZShicCk7CisJeGZzX2J1Zl9mcmVlKGJwKTsKICBmYWlsOgogCXJldHVybiBOVUxMOwogfQogCiAvKgotICoJcGFnZWJ1Zl9ob2xkCi0gKgogICoJSW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudCBvbiBidWZmZXIsIHRvIGhvbGQgdGhlIGJ1ZmZlciBjb25jdXJyZW50bHkKICAqCXdpdGggYW5vdGhlciB0aHJlYWQgd2hpY2ggbWF5IHJlbGVhc2UgKGZyZWUpIHRoZSBidWZmZXIgYXN5bmNocm9ub3VzbHkuCi0gKgogICoJTXVzdCBob2xkIHRoZSBidWZmZXIgYWxyZWFkeSB0byBjYWxsIHRoaXMgZnVuY3Rpb24uCiAgKi8KIHZvaWQKLXBhZ2VidWZfaG9sZCgKLQl4ZnNfYnVmX3QJCSpwYikKK3hmc19idWZfaG9sZCgKKwl4ZnNfYnVmX3QJCSpicCkKIHsKLQlhdG9taWNfaW5jKCZwYi0+cGJfaG9sZCk7Ci0JUEJfVFJBQ0UocGIsICJob2xkIiwgMCk7CisJYXRvbWljX2luYygmYnAtPmJfaG9sZCk7CisJWEJfVFJBQ0UoYnAsICJob2xkIiwgMCk7CiB9CiAKIC8qCi0gKglwYWdlYnVmX3JlbGUKLSAqCi0gKglwYWdlYnVmX3JlbGUgcmVsZWFzZXMgYSBob2xkIG9uIHRoZSBzcGVjaWZpZWQgYnVmZmVyLiAgSWYgdGhlCi0gKgl0aGUgaG9sZCBjb3VudCBpcyAxLCBwYWdlYnVmX3JlbGUgY2FsbHMgcGFnZWJ1Zl9mcmVlLgorICoJUmVsZWFzZXMgYSBob2xkIG9uIHRoZSBzcGVjaWZpZWQgYnVmZmVyLiAgSWYgdGhlCisgKgl0aGUgaG9sZCBjb3VudCBpcyAxLCBjYWxscyB4ZnNfYnVmX2ZyZWUuCiAgKi8KIHZvaWQKLXBhZ2VidWZfcmVsZSgKLQl4ZnNfYnVmX3QJCSpwYikKK3hmc19idWZfcmVsZSgKKwl4ZnNfYnVmX3QJCSpicCkKIHsKLQl4ZnNfYnVmaGFzaF90CQkqaGFzaCA9IHBiLT5wYl9oYXNoOworCXhmc19idWZoYXNoX3QJCSpoYXNoID0gYnAtPmJfaGFzaDsKIAotCVBCX1RSQUNFKHBiLCAicmVsZSIsIHBiLT5wYl9yZWxzZSk7CisJWEJfVFJBQ0UoYnAsICJyZWxlIiwgYnAtPmJfcmVsc2UpOwogCi0JaWYgKGF0b21pY19kZWNfYW5kX2xvY2soJnBiLT5wYl9ob2xkLCAmaGFzaC0+YmhfbG9jaykpIHsKLQkJaWYgKHBiLT5wYl9yZWxzZSkgewotCQkJYXRvbWljX2luYygmcGItPnBiX2hvbGQpOworCWlmIChhdG9taWNfZGVjX2FuZF9sb2NrKCZicC0+Yl9ob2xkLCAmaGFzaC0+YmhfbG9jaykpIHsKKwkJaWYgKGJwLT5iX3JlbHNlKSB7CisJCQlhdG9taWNfaW5jKCZicC0+Yl9ob2xkKTsKIAkJCXNwaW5fdW5sb2NrKCZoYXNoLT5iaF9sb2NrKTsKLQkJCSgqKHBiLT5wYl9yZWxzZSkpIChwYik7Ci0JCX0gZWxzZSBpZiAocGItPnBiX2ZsYWdzICYgUEJGX0ZTX01BTkFHRUQpIHsKKwkJCSgqKGJwLT5iX3JlbHNlKSkgKGJwKTsKKwkJfSBlbHNlIGlmIChicC0+Yl9mbGFncyAmIFhCRl9GU19NQU5BR0VEKSB7CiAJCQlzcGluX3VubG9jaygmaGFzaC0+YmhfbG9jayk7CiAJCX0gZWxzZSB7Ci0JCQlBU1NFUlQoIShwYi0+cGJfZmxhZ3MgJiAoUEJGX0RFTFdSSXxfUEJGX0RFTFdSSV9RKSkpOwotCQkJbGlzdF9kZWxfaW5pdCgmcGItPnBiX2hhc2hfbGlzdCk7CisJCQlBU1NFUlQoIShicC0+Yl9mbGFncyAmIChYQkZfREVMV1JJfF9YQkZfREVMV1JJX1EpKSk7CisJCQlsaXN0X2RlbF9pbml0KCZicC0+Yl9oYXNoX2xpc3QpOwogCQkJc3Bpbl91bmxvY2soJmhhc2gtPmJoX2xvY2spOwotCQkJcGFnZWJ1Zl9mcmVlKHBiKTsKKwkJCXhmc19idWZfZnJlZShicCk7CiAJCX0KIAl9IGVsc2UgewogCQkvKgogCQkgKiBDYXRjaCByZWZlcmVuY2UgY291bnQgbGVha3MKIAkJICovCi0JCUFTU0VSVChhdG9taWNfcmVhZCgmcGItPnBiX2hvbGQpID49IDApOworCQlBU1NFUlQoYXRvbWljX3JlYWQoJmJwLT5iX2hvbGQpID49IDApOwogCX0KIH0KIApAQCAtODYzLDE2OCArODU1LDEyMiBAQAogICovCiAKIC8qCi0gKglwYWdlYnVmX2NvbmRfbG9jawotICoKLSAqCXBhZ2VidWZfY29uZF9sb2NrIGxvY2tzIGEgYnVmZmVyIG9iamVjdCwgaWYgaXQgaXMgbm90IGFscmVhZHkgbG9ja2VkLgotICoJTm90ZSB0aGF0IHRoaXMgaW4gbm8gd2F5Ci0gKglsb2NrcyB0aGUgdW5kZXJseWluZyBwYWdlcywgc28gaXQgaXMgb25seSB1c2VmdWwgZm9yIHN5bmNocm9uaXppbmcKLSAqCWNvbmN1cnJlbnQgdXNlIG9mIHBhZ2UgYnVmZmVyIG9iamVjdHMsIG5vdCBmb3Igc3luY2hyb25pemluZyBpbmRlcGVuZGVudAotICoJYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIHBhZ2VzLgorICoJTG9ja3MgYSBidWZmZXIgb2JqZWN0LCBpZiBpdCBpcyBub3QgYWxyZWFkeSBsb2NrZWQuCisgKglOb3RlIHRoYXQgdGhpcyBpbiBubyB3YXkgbG9ja3MgdGhlIHVuZGVybHlpbmcgcGFnZXMsIHNvIGl0IGlzIG9ubHkKKyAqCXVzZWZ1bCBmb3Igc3luY2hyb25pemluZyBjb25jdXJyZW50IHVzZSBvZiBidWZmZXIgb2JqZWN0cywgbm90IGZvcgorICoJc3luY2hyb25pemluZyBpbmRlcGVuZGVudCBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgcGFnZXMuCiAgKi8KIGludAotcGFnZWJ1Zl9jb25kX2xvY2soCQkJLyogbG9jayBidWZmZXIsIGlmIG5vdCBsb2NrZWQJKi8KLQkJCQkJLyogcmV0dXJucyAtRUJVU1kgaWYgbG9ja2VkKQkqLwotCXhmc19idWZfdAkJKnBiKQoreGZzX2J1Zl9jb25kX2xvY2soCisJeGZzX2J1Zl90CQkqYnApCiB7CiAJaW50CQkJbG9ja2VkOwogCi0JbG9ja2VkID0gZG93bl90cnlsb2NrKCZwYi0+cGJfc2VtYSkgPT0gMDsKKwlsb2NrZWQgPSBkb3duX3RyeWxvY2soJmJwLT5iX3NlbWEpID09IDA7CiAJaWYgKGxvY2tlZCkgewotCQlQQl9TRVRfT1dORVIocGIpOworCQlYQl9TRVRfT1dORVIoYnApOwogCX0KLQlQQl9UUkFDRShwYiwgImNvbmRfbG9jayIsIChsb25nKWxvY2tlZCk7Ci0JcmV0dXJuKGxvY2tlZCA/IDAgOiAtRUJVU1kpOworCVhCX1RSQUNFKGJwLCAiY29uZF9sb2NrIiwgKGxvbmcpbG9ja2VkKTsKKwlyZXR1cm4gbG9ja2VkID8gMCA6IC1FQlVTWTsKIH0KIAogI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoWEZTX0JMSV9UUkFDRSkKLS8qCi0gKglwYWdlYnVmX2xvY2tfdmFsdWUKLSAqCi0gKglSZXR1cm4gbG9jayB2YWx1ZSBmb3IgYSBwYWdlYnVmCi0gKi8KIGludAotcGFnZWJ1Zl9sb2NrX3ZhbHVlKAotCXhmc19idWZfdAkJKnBiKQoreGZzX2J1Zl9sb2NrX3ZhbHVlKAorCXhmc19idWZfdAkJKmJwKQogewotCXJldHVybihhdG9taWNfcmVhZCgmcGItPnBiX3NlbWEuY291bnQpKTsKKwlyZXR1cm4gYXRvbWljX3JlYWQoJmJwLT5iX3NlbWEuY291bnQpOwogfQogI2VuZGlmCiAKIC8qCi0gKglwYWdlYnVmX2xvY2sKLSAqCi0gKglwYWdlYnVmX2xvY2sgbG9ja3MgYSBidWZmZXIgb2JqZWN0LiAgTm90ZSB0aGF0IHRoaXMgaW4gbm8gd2F5Ci0gKglsb2NrcyB0aGUgdW5kZXJseWluZyBwYWdlcywgc28gaXQgaXMgb25seSB1c2VmdWwgZm9yIHN5bmNocm9uaXppbmcKLSAqCWNvbmN1cnJlbnQgdXNlIG9mIHBhZ2UgYnVmZmVyIG9iamVjdHMsIG5vdCBmb3Igc3luY2hyb25pemluZyBpbmRlcGVuZGVudAotICoJYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIHBhZ2VzLgorICoJTG9ja3MgYSBidWZmZXIgb2JqZWN0LgorICoJTm90ZSB0aGF0IHRoaXMgaW4gbm8gd2F5IGxvY2tzIHRoZSB1bmRlcmx5aW5nIHBhZ2VzLCBzbyBpdCBpcyBvbmx5CisgKgl1c2VmdWwgZm9yIHN5bmNocm9uaXppbmcgY29uY3VycmVudCB1c2Ugb2YgYnVmZmVyIG9iamVjdHMsIG5vdCBmb3IKKyAqCXN5bmNocm9uaXppbmcgaW5kZXBlbmRlbnQgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIHBhZ2VzLgogICovCi1pbnQKLXBhZ2VidWZfbG9jaygKLQl4ZnNfYnVmX3QJCSpwYikKK3ZvaWQKK3hmc19idWZfbG9jaygKKwl4ZnNfYnVmX3QJCSpicCkKIHsKLQlQQl9UUkFDRShwYiwgImxvY2siLCAwKTsKLQlpZiAoYXRvbWljX3JlYWQoJnBiLT5wYl9pb19yZW1haW5pbmcpKQotCQlibGtfcnVuX2FkZHJlc3Nfc3BhY2UocGItPnBiX3RhcmdldC0+cGJyX21hcHBpbmcpOwotCWRvd24oJnBiLT5wYl9zZW1hKTsKLQlQQl9TRVRfT1dORVIocGIpOwotCVBCX1RSQUNFKHBiLCAibG9ja2VkIiwgMCk7Ci0JcmV0dXJuIDA7CisJWEJfVFJBQ0UoYnAsICJsb2NrIiwgMCk7CisJaWYgKGF0b21pY19yZWFkKCZicC0+Yl9pb19yZW1haW5pbmcpKQorCQlibGtfcnVuX2FkZHJlc3Nfc3BhY2UoYnAtPmJfdGFyZ2V0LT5idF9tYXBwaW5nKTsKKwlkb3duKCZicC0+Yl9zZW1hKTsKKwlYQl9TRVRfT1dORVIoYnApOworCVhCX1RSQUNFKGJwLCAibG9ja2VkIiwgMCk7CiB9CiAKIC8qCi0gKglwYWdlYnVmX3VubG9jawotICoKLSAqCXBhZ2VidWZfdW5sb2NrIHJlbGVhc2VzIHRoZSBsb2NrIG9uIHRoZSBidWZmZXIgb2JqZWN0IGNyZWF0ZWQgYnkKLSAqCXBhZ2VidWZfbG9jayBvciBwYWdlYnVmX2NvbmRfbG9jayAobm90IGFueSBwaW5uaW5nIG9mIHVuZGVybHlpbmcgcGFnZXMKLSAqCWNyZWF0ZWQgYnkgcGFnZWJ1Zl9waW4pLgotICoKKyAqCVJlbGVhc2VzIHRoZSBsb2NrIG9uIHRoZSBidWZmZXIgb2JqZWN0LgogICoJSWYgdGhlIGJ1ZmZlciBpcyBtYXJrZWQgZGVsd3JpIGJ1dCBpcyBub3QgcXVldWVkLCBkbyBzbyBiZWZvcmUgd2UKLSAqCXVubG9jayB0aGUgYnVmZmVyIGFzIHdlIG5lZWQgdG8gc2V0IGZsYWdzIGNvcnJlY3RseS4gV2UgYWxzbyBuZWVkIHRvCisgKgl1bmxvY2sgdGhlIGJ1ZmZlciBhcyB3ZSBuZWVkIHRvIHNldCBmbGFncyBjb3JyZWN0bHkuICBXZSBhbHNvIG5lZWQgdG8KICAqCXRha2UgYSByZWZlcmVuY2UgZm9yIHRoZSBkZWx3cmkgcXVldWUgYmVjYXVzZSB0aGUgdW5sb2NrZXIgaXMgZ29pbmcgdG8KICAqCWRyb3AgdGhlaXIncyBhbmQgdGhleSBkb24ndCBrbm93IHdlIGp1c3QgcXVldWVkIGl0LgogICovCiB2b2lkCi1wYWdlYnVmX3VubG9jaygJCQkJLyogdW5sb2NrIGJ1ZmZlcgkJKi8KLQl4ZnNfYnVmX3QJCSpwYikJLyogYnVmZmVyIHRvIHVubG9jawkJKi8KK3hmc19idWZfdW5sb2NrKAorCXhmc19idWZfdAkJKmJwKQogewotCWlmICgocGItPnBiX2ZsYWdzICYgKFBCRl9ERUxXUkl8X1BCRl9ERUxXUklfUSkpID09IFBCRl9ERUxXUkkpIHsKLQkJYXRvbWljX2luYygmcGItPnBiX2hvbGQpOwotCQlwYi0+cGJfZmxhZ3MgfD0gUEJGX0FTWU5DOwotCQlwYWdlYnVmX2RlbHdyaV9xdWV1ZShwYiwgMCk7CisJaWYgKChicC0+Yl9mbGFncyAmIChYQkZfREVMV1JJfF9YQkZfREVMV1JJX1EpKSA9PSBYQkZfREVMV1JJKSB7CisJCWF0b21pY19pbmMoJmJwLT5iX2hvbGQpOworCQlicC0+Yl9mbGFncyB8PSBYQkZfQVNZTkM7CisJCXhmc19idWZfZGVsd3JpX3F1ZXVlKGJwLCAwKTsKIAl9CiAKLQlQQl9DTEVBUl9PV05FUihwYik7Ci0JdXAoJnBiLT5wYl9zZW1hKTsKLQlQQl9UUkFDRShwYiwgInVubG9jayIsIDApOworCVhCX0NMRUFSX09XTkVSKGJwKTsKKwl1cCgmYnAtPmJfc2VtYSk7CisJWEJfVFJBQ0UoYnAsICJ1bmxvY2siLCAwKTsKIH0KIAogCiAvKgogICoJUGlubmluZyBCdWZmZXIgU3RvcmFnZSBpbiBNZW1vcnkKLSAqLwotCi0vKgotICoJcGFnZWJ1Zl9waW4KLSAqCi0gKglwYWdlYnVmX3BpbiBsb2NrcyBhbGwgb2YgdGhlIG1lbW9yeSByZXByZXNlbnRlZCBieSBhIGJ1ZmZlciBpbgotICoJbWVtb3J5LiAgTXVsdGlwbGUgY2FsbHMgdG8gcGFnZWJ1Zl9waW4gYW5kIHBhZ2VidWZfdW5waW4sIGZvcgotICoJdGhlIHNhbWUgb3IgZGlmZmVyZW50IGJ1ZmZlcnMgYWZmZWN0aW5nIGEgZ2l2ZW4gcGFnZSwgd2lsbAotICoJcHJvcGVybHkgY291bnQgdGhlIG51bWJlciBvZiBvdXRzdGFuZGluZyAicGluIiByZXF1ZXN0cy4gIFRoZQotICoJYnVmZmVyIG1heSBiZSByZWxlYXNlZCBhZnRlciB0aGUgcGFnZWJ1Zl9waW4gYW5kIGEgZGlmZmVyZW50Ci0gKglidWZmZXIgdXNlZCB3aGVuIGNhbGxpbmcgcGFnZWJ1Zl91bnBpbiwgaWYgZGVzaXJlZC4KLSAqCXBhZ2VidWZfcGluIHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBmaWxlIHN5c3RlbSB3aGVuIGl0IHdhbnRzIGJlCi0gKglhc3N1cmVkIHRoYXQgbm8gYXR0ZW1wdCB3aWxsIGJlIG1hZGUgdG8gZm9yY2UgdGhlIGFmZmVjdGVkCi0gKgltZW1vcnkgdG8gZGlzay4JIEl0IGRvZXMgbm90IGFzc3VyZSB0aGF0IGEgZ2l2ZW4gbG9naWNhbCBwYWdlCi0gKgl3aWxsIG5vdCBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCBwaHlzaWNhbCBwYWdlLgorICoJRW5zdXJlIHRoYXQgbm8gYXR0ZW1wdCB0byBmb3JjZSBhIGJ1ZmZlciB0byBkaXNrIHdpbGwgc3VjY2VlZC4KICAqLwogdm9pZAotcGFnZWJ1Zl9waW4oCi0JeGZzX2J1Zl90CQkqcGIpCit4ZnNfYnVmX3BpbigKKwl4ZnNfYnVmX3QJCSpicCkKIHsKLQlhdG9taWNfaW5jKCZwYi0+cGJfcGluX2NvdW50KTsKLQlQQl9UUkFDRShwYiwgInBpbiIsIChsb25nKXBiLT5wYl9waW5fY291bnQuY291bnRlcik7CisJYXRvbWljX2luYygmYnAtPmJfcGluX2NvdW50KTsKKwlYQl9UUkFDRShicCwgInBpbiIsIChsb25nKWJwLT5iX3Bpbl9jb3VudC5jb3VudGVyKTsKIH0KIAotLyoKLSAqCXBhZ2VidWZfdW5waW4KLSAqCi0gKglwYWdlYnVmX3VucGluIHJldmVyc2VzIHRoZSBsb2NraW5nIG9mIG1lbW9yeSBwZXJmb3JtZWQgYnkKLSAqCXBhZ2VidWZfcGluLiAgTm90ZSB0aGF0IGJvdGggZnVuY3Rpb25zIGFmZmVjdGVkIHRoZSBsb2dpY2FsCi0gKglwYWdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZmZlciwgbm90IHRoZSBidWZmZXIgaXRzZWxmLgotICovCiB2b2lkCi1wYWdlYnVmX3VucGluKAotCXhmc19idWZfdAkJKnBiKQoreGZzX2J1Zl91bnBpbigKKwl4ZnNfYnVmX3QJCSpicCkKIHsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcGItPnBiX3Bpbl9jb3VudCkpIHsKLQkJd2FrZV91cF9hbGwoJnBiLT5wYl93YWl0ZXJzKTsKLQl9Ci0JUEJfVFJBQ0UocGIsICJ1bnBpbiIsIChsb25nKXBiLT5wYl9waW5fY291bnQuY291bnRlcik7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmJwLT5iX3Bpbl9jb3VudCkpCisJCXdha2VfdXBfYWxsKCZicC0+Yl93YWl0ZXJzKTsKKwlYQl9UUkFDRShicCwgInVucGluIiwgKGxvbmcpYnAtPmJfcGluX2NvdW50LmNvdW50ZXIpOwogfQogCiBpbnQKLXBhZ2VidWZfaXNwaW4oCi0JeGZzX2J1Zl90CQkqcGIpCit4ZnNfYnVmX2lzcGluKAorCXhmc19idWZfdAkJKmJwKQogewotCXJldHVybiBhdG9taWNfcmVhZCgmcGItPnBiX3Bpbl9jb3VudCk7CisJcmV0dXJuIGF0b21pY19yZWFkKCZicC0+Yl9waW5fY291bnQpOwogfQogCi0vKgotICoJcGFnZWJ1Zl93YWl0X3VucGluCi0gKgotICoJcGFnZWJ1Zl93YWl0X3VucGluIHdhaXRzIHVudGlsIGFsbCBvZiB0aGUgbWVtb3J5IGFzc29jaWF0ZWQKLSAqCXdpdGggdGhlIGJ1ZmZlciBpcyBub3QgbG9uZ2VyIGxvY2tlZCBpbiBtZW1vcnkuICBJdCByZXR1cm5zCi0gKglpbW1lZGlhdGVseSBpZiBub25lIG9mIHRoZSBhZmZlY3RlZCBwYWdlcyBhcmUgbG9ja2VkLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9wYWdlYnVmX3dhaXRfdW5waW4oCi0JeGZzX2J1Zl90CQkqcGIpCitTVEFUSUMgdm9pZAoreGZzX2J1Zl93YWl0X3VucGluKAorCXhmc19idWZfdAkJKmJwKQogewogCURFQ0xBUkVfV0FJVFFVRVVFCSh3YWl0LCBjdXJyZW50KTsKIAotCWlmIChhdG9taWNfcmVhZCgmcGItPnBiX3Bpbl9jb3VudCkgPT0gMCkKKwlpZiAoYXRvbWljX3JlYWQoJmJwLT5iX3Bpbl9jb3VudCkgPT0gMCkKIAkJcmV0dXJuOwogCi0JYWRkX3dhaXRfcXVldWUoJnBiLT5wYl93YWl0ZXJzLCAmd2FpdCk7CisJYWRkX3dhaXRfcXVldWUoJmJwLT5iX3dhaXRlcnMsICZ3YWl0KTsKIAlmb3IgKDs7KSB7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKGF0b21pY19yZWFkKCZwYi0+cGJfcGluX2NvdW50KSA9PSAwKQorCQlpZiAoYXRvbWljX3JlYWQoJmJwLT5iX3Bpbl9jb3VudCkgPT0gMCkKIAkJCWJyZWFrOwotCQlpZiAoYXRvbWljX3JlYWQoJnBiLT5wYl9pb19yZW1haW5pbmcpKQotCQkJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKHBiLT5wYl90YXJnZXQtPnBicl9tYXBwaW5nKTsKKwkJaWYgKGF0b21pY19yZWFkKCZicC0+Yl9pb19yZW1haW5pbmcpKQorCQkJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKGJwLT5iX3RhcmdldC0+YnRfbWFwcGluZyk7CiAJCXNjaGVkdWxlKCk7CiAJfQotCXJlbW92ZV93YWl0X3F1ZXVlKCZwYi0+cGJfd2FpdGVycywgJndhaXQpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZicC0+Yl93YWl0ZXJzLCAmd2FpdCk7CiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIH0KIApAQCAtMTAzMiwyNDEgKzk3OCwyMTYgQEAKICAqCUJ1ZmZlciBVdGlsaXR5IFJvdXRpbmVzCiAgKi8KIAotLyoKLSAqCXBhZ2VidWZfaW9kb25lCi0gKgotICoJcGFnZWJ1Zl9pb2RvbmUgbWFya3MgYSBidWZmZXIgZm9yIHdoaWNoIEkvTyBpcyBpbiBwcm9ncmVzcwotICoJZG9uZSB3aXRoIHJlc3BlY3QgdG8gdGhhdCBJL08uCVRoZSBwYl9pb2RvbmUgcm91dGluZSwgaWYKLSAqCXByZXNlbnQsIHdpbGwgYmUgY2FsbGVkIGFzIGEgc2lkZS1lZmZlY3QuCi0gKi8KIFNUQVRJQyB2b2lkCi1wYWdlYnVmX2lvZG9uZV93b3JrKAoreGZzX2J1Zl9pb2RvbmVfd29yaygKIAl2b2lkCQkJKnYpCiB7CiAJeGZzX2J1Zl90CQkqYnAgPSAoeGZzX2J1Zl90ICopdjsKIAotCWlmIChicC0+cGJfaW9kb25lKQotCQkoKihicC0+cGJfaW9kb25lKSkoYnApOwotCWVsc2UgaWYgKGJwLT5wYl9mbGFncyAmIFBCRl9BU1lOQykKKwlpZiAoYnAtPmJfaW9kb25lKQorCQkoKihicC0+Yl9pb2RvbmUpKShicCk7CisJZWxzZSBpZiAoYnAtPmJfZmxhZ3MgJiBYQkZfQVNZTkMpCiAJCXhmc19idWZfcmVsc2UoYnApOwogfQogCiB2b2lkCi1wYWdlYnVmX2lvZG9uZSgKLQl4ZnNfYnVmX3QJCSpwYiwKK3hmc19idWZfaW9lbmQoCisJeGZzX2J1Zl90CQkqYnAsCiAJaW50CQkJc2NoZWR1bGUpCiB7Ci0JcGItPnBiX2ZsYWdzICY9IH4oUEJGX1JFQUQgfCBQQkZfV1JJVEUpOwotCWlmIChwYi0+cGJfZXJyb3IgPT0gMCkKLQkJcGItPnBiX2ZsYWdzIHw9IFBCRl9ET05FOworCWJwLT5iX2ZsYWdzICY9IH4oWEJGX1JFQUQgfCBYQkZfV1JJVEUpOworCWlmIChicC0+Yl9lcnJvciA9PSAwKQorCQlicC0+Yl9mbGFncyB8PSBYQkZfRE9ORTsKIAotCVBCX1RSQUNFKHBiLCAiaW9kb25lIiwgcGItPnBiX2lvZG9uZSk7CisJWEJfVFJBQ0UoYnAsICJpb2RvbmUiLCBicC0+Yl9pb2RvbmUpOwogCi0JaWYgKChwYi0+cGJfaW9kb25lKSB8fCAocGItPnBiX2ZsYWdzICYgUEJGX0FTWU5DKSkgeworCWlmICgoYnAtPmJfaW9kb25lKSB8fCAoYnAtPmJfZmxhZ3MgJiBYQkZfQVNZTkMpKSB7CiAJCWlmIChzY2hlZHVsZSkgewotCQkJSU5JVF9XT1JLKCZwYi0+cGJfaW9kb25lX3dvcmssIHBhZ2VidWZfaW9kb25lX3dvcmssIHBiKTsKLQkJCXF1ZXVlX3dvcmsoeGZzbG9nZF93b3JrcXVldWUsICZwYi0+cGJfaW9kb25lX3dvcmspOworCQkJSU5JVF9XT1JLKCZicC0+Yl9pb2RvbmVfd29yaywgeGZzX2J1Zl9pb2RvbmVfd29yaywgYnApOworCQkJcXVldWVfd29yayh4ZnNsb2dkX3dvcmtxdWV1ZSwgJmJwLT5iX2lvZG9uZV93b3JrKTsKIAkJfSBlbHNlIHsKLQkJCXBhZ2VidWZfaW9kb25lX3dvcmsocGIpOworCQkJeGZzX2J1Zl9pb2RvbmVfd29yayhicCk7CiAJCX0KIAl9IGVsc2UgewotCQl1cCgmcGItPnBiX2lvZG9uZXNlbWEpOworCQl1cCgmYnAtPmJfaW9kb25lc2VtYSk7CiAJfQogfQogCi0vKgotICoJcGFnZWJ1Zl9pb2Vycm9yCi0gKgotICoJcGFnZWJ1Zl9pb2Vycm9yIHNldHMgdGhlIGVycm9yIGNvZGUgZm9yIGEgYnVmZmVyLgotICovCiB2b2lkCi1wYWdlYnVmX2lvZXJyb3IoCQkJLyogbWFyay9jbGVhciBidWZmZXIgZXJyb3IgZmxhZyAqLwotCXhmc19idWZfdAkJKnBiLAkvKiBidWZmZXIgdG8gbWFyawkJKi8KLQlpbnQJCQllcnJvcikJLyogZXJyb3IgdG8gc3RvcmUgKDAgaWYgbm9uZSkJKi8KK3hmc19idWZfaW9lcnJvcigKKwl4ZnNfYnVmX3QJCSpicCwKKwlpbnQJCQllcnJvcikKIHsKIAlBU1NFUlQoZXJyb3IgPj0gMCAmJiBlcnJvciA8PSAweGZmZmYpOwotCXBiLT5wYl9lcnJvciA9ICh1bnNpZ25lZCBzaG9ydCllcnJvcjsKLQlQQl9UUkFDRShwYiwgImlvZXJyb3IiLCAodW5zaWduZWQgbG9uZyllcnJvcik7CisJYnAtPmJfZXJyb3IgPSAodW5zaWduZWQgc2hvcnQpZXJyb3I7CisJWEJfVFJBQ0UoYnAsICJpb2Vycm9yIiwgKHVuc2lnbmVkIGxvbmcpZXJyb3IpOwogfQogCiAvKgotICoJcGFnZWJ1Zl9pb3N0YXJ0Ci0gKgotICoJcGFnZWJ1Zl9pb3N0YXJ0IGluaXRpYXRlcyBJL08gb24gYSBidWZmZXIsIGJhc2VkIG9uIHRoZSBmbGFncyBzdXBwbGllZC4KLSAqCUlmIG5lY2Vzc2FyeSwgaXQgd2lsbCBhcnJhbmdlIGZvciBhbnkgZGlzayBzcGFjZSBhbGxvY2F0aW9uIHJlcXVpcmVkLAotICoJYW5kIGl0IHdpbGwgYnJlYWsgdXAgdGhlIHJlcXVlc3QgaWYgdGhlIGJsb2NrIG1hcHBpbmdzIHJlcXVpcmUgaXQuCi0gKglUaGUgcGJfaW9kb25lIHJvdXRpbmUgaW4gdGhlIGJ1ZmZlciBzdXBwbGllZCB3aWxsIG9ubHkgYmUgY2FsbGVkCisgKglJbml0aWF0ZSBJL08gb24gYSBidWZmZXIsIGJhc2VkIG9uIHRoZSBmbGFncyBzdXBwbGllZC4KKyAqCVRoZSBiX2lvZG9uZSByb3V0aW5lIGluIHRoZSBidWZmZXIgc3VwcGxpZWQgd2lsbCBvbmx5IGJlIGNhbGxlZAogICoJd2hlbiBhbGwgb2YgdGhlIHN1YnNpZGlhcnkgSS9PIHJlcXVlc3RzLCBpZiBhbnksIGhhdmUgYmVlbiBjb21wbGV0ZWQuCi0gKglwYWdlYnVmX2lvc3RhcnQgY2FsbHMgdGhlIHBhZ2VidWZfaW9pbml0aWF0ZSByb3V0aW5lIG9yCi0gKglwYWdlYnVmX2lvcmVxdWVzdCwgaWYgdGhlIGZvcm1lciByb3V0aW5lIGlzIG5vdCBkZWZpbmVkLCB0byBzdGFydAotICoJdGhlIEkvTyBvbiBhIGdpdmVuIGxvdy1sZXZlbCByZXF1ZXN0LgogICovCiBpbnQKLXBhZ2VidWZfaW9zdGFydCgJCQkvKiBzdGFydCBJL08gb24gYSBidWZmZXIJICAqLwotCXhmc19idWZfdAkJKnBiLAkvKiBidWZmZXIgdG8gc3RhcnQJCSAgKi8KLQlwYWdlX2J1Zl9mbGFnc190CWZsYWdzKQkvKiBQQkZfTE9DSywgUEJGX0FTWU5DLCBQQkZfUkVBRCwgKi8KLQkJCQkJLyogUEJGX1dSSVRFLCBQQkZfREVMV1JJLAkgICovCi0JCQkJCS8qIFBCRl9ET05UX0JMT0NLCQkgICovCit4ZnNfYnVmX2lvc3RhcnQoCisJeGZzX2J1Zl90CQkqYnAsCisJeGZzX2J1Zl9mbGFnc190CQlmbGFncykKIHsKIAlpbnQJCQlzdGF0dXMgPSAwOwogCi0JUEJfVFJBQ0UocGIsICJpb3N0YXJ0IiwgKHVuc2lnbmVkIGxvbmcpZmxhZ3MpOworCVhCX1RSQUNFKGJwLCAiaW9zdGFydCIsICh1bnNpZ25lZCBsb25nKWZsYWdzKTsKIAotCWlmIChmbGFncyAmIFBCRl9ERUxXUkkpIHsKLQkJcGItPnBiX2ZsYWdzICY9IH4oUEJGX1JFQUQgfCBQQkZfV1JJVEUgfCBQQkZfQVNZTkMpOwotCQlwYi0+cGJfZmxhZ3MgfD0gZmxhZ3MgJiAoUEJGX0RFTFdSSSB8IFBCRl9BU1lOQyk7Ci0JCXBhZ2VidWZfZGVsd3JpX3F1ZXVlKHBiLCAxKTsKKwlpZiAoZmxhZ3MgJiBYQkZfREVMV1JJKSB7CisJCWJwLT5iX2ZsYWdzICY9IH4oWEJGX1JFQUQgfCBYQkZfV1JJVEUgfCBYQkZfQVNZTkMpOworCQlicC0+Yl9mbGFncyB8PSBmbGFncyAmIChYQkZfREVMV1JJIHwgWEJGX0FTWU5DKTsKKwkJeGZzX2J1Zl9kZWx3cmlfcXVldWUoYnAsIDEpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAotCXBiLT5wYl9mbGFncyAmPSB+KFBCRl9SRUFEIHwgUEJGX1dSSVRFIHwgUEJGX0FTWU5DIHwgUEJGX0RFTFdSSSB8IFwKLQkJCVBCRl9SRUFEX0FIRUFEIHwgX1BCRl9SVU5fUVVFVUVTKTsKLQlwYi0+cGJfZmxhZ3MgfD0gZmxhZ3MgJiAoUEJGX1JFQUQgfCBQQkZfV1JJVEUgfCBQQkZfQVNZTkMgfCBcCi0JCQlQQkZfUkVBRF9BSEVBRCB8IF9QQkZfUlVOX1FVRVVFUyk7CisJYnAtPmJfZmxhZ3MgJj0gfihYQkZfUkVBRCB8IFhCRl9XUklURSB8IFhCRl9BU1lOQyB8IFhCRl9ERUxXUkkgfCBcCisJCQlYQkZfUkVBRF9BSEVBRCB8IF9YQkZfUlVOX1FVRVVFUyk7CisJYnAtPmJfZmxhZ3MgfD0gZmxhZ3MgJiAoWEJGX1JFQUQgfCBYQkZfV1JJVEUgfCBYQkZfQVNZTkMgfCBcCisJCQlYQkZfUkVBRF9BSEVBRCB8IF9YQkZfUlVOX1FVRVVFUyk7CiAKLQlCVUdfT04ocGItPnBiX2JuID09IFhGU19CVUZfREFERFJfTlVMTCk7CisJQlVHX09OKGJwLT5iX2JuID09IFhGU19CVUZfREFERFJfTlVMTCk7CiAKIAkvKiBGb3Igd3JpdGVzIGFsbG93IGFuIGFsdGVybmF0ZSBzdHJhdGVneSByb3V0aW5lIHRvIHByZWNlZGUKIAkgKiB0aGUgYWN0dWFsIEkvTyByZXF1ZXN0ICh3aGljaCBtYXkgbm90IGJlIGlzc3VlZCBhdCBhbGwgaW4KIAkgKiBhIHNodXRkb3duIHNpdHVhdGlvbiwgZm9yIGV4YW1wbGUpLgogCSAqLwotCXN0YXR1cyA9IChmbGFncyAmIFBCRl9XUklURSkgPwotCQlwYWdlYnVmX2lvc3RyYXRlZ3kocGIpIDogcGFnZWJ1Zl9pb3JlcXVlc3QocGIpOworCXN0YXR1cyA9IChmbGFncyAmIFhCRl9XUklURSkgPworCQl4ZnNfYnVmX2lvc3RyYXRlZ3koYnApIDogeGZzX2J1Zl9pb3JlcXVlc3QoYnApOwogCiAJLyogV2FpdCBmb3IgSS9PIGlmIHdlIGFyZSBub3QgYW4gYXN5bmMgcmVxdWVzdC4KIAkgKiBOb3RlOiBhc3luYyBJL08gcmVxdWVzdCBjb21wbGV0aW9uIHdpbGwgcmVsZWFzZSB0aGUgYnVmZmVyLAogCSAqIGFuZCB0aGF0IGNhbiBhbHJlYWR5IGJlIGRvbmUgYnkgdGhpcyBwb2ludC4gIFNvIHVzaW5nIHRoZQogCSAqIGJ1ZmZlciBwb2ludGVyIGZyb20gaGVyZSBvbiwgYWZ0ZXIgYXN5bmMgSS9PLCBpcyBpbnZhbGlkLgogCSAqLwotCWlmICghc3RhdHVzICYmICEoZmxhZ3MgJiBQQkZfQVNZTkMpKQotCQlzdGF0dXMgPSBwYWdlYnVmX2lvd2FpdChwYik7CisJaWYgKCFzdGF0dXMgJiYgIShmbGFncyAmIFhCRl9BU1lOQykpCisJCXN0YXR1cyA9IHhmc19idWZfaW93YWl0KGJwKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CiAKLS8qCi0gKiBIZWxwZXIgcm91dGluZSBmb3IgcGFnZWJ1Zl9pb3JlcXVlc3QKLSAqLwotCiBTVEFUSUMgX19pbmxpbmVfXyBpbnQKLV9wYWdlYnVmX2lvbG9ja2VkKAotCXhmc19idWZfdAkJKnBiKQorX3hmc19idWZfaW9sb2NrZWQoCisJeGZzX2J1Zl90CQkqYnApCiB7Ci0JQVNTRVJUKHBiLT5wYl9mbGFncyAmIChQQkZfUkVBRHxQQkZfV1JJVEUpKTsKLQlpZiAocGItPnBiX2ZsYWdzICYgUEJGX1JFQUQpCi0JCXJldHVybiBwYi0+cGJfbG9ja2VkOworCUFTU0VSVChicC0+Yl9mbGFncyAmIChYQkZfUkVBRCB8IFhCRl9XUklURSkpOworCWlmIChicC0+Yl9mbGFncyAmIFhCRl9SRUFEKQorCQlyZXR1cm4gYnAtPmJfbG9ja2VkOwogCXJldHVybiAwOwogfQogCiBTVEFUSUMgX19pbmxpbmVfXyB2b2lkCi1fcGFnZWJ1Zl9pb2RvbmUoCi0JeGZzX2J1Zl90CQkqcGIsCitfeGZzX2J1Zl9pb2VuZCgKKwl4ZnNfYnVmX3QJCSpicCwKIAlpbnQJCQlzY2hlZHVsZSkKIHsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcGItPnBiX2lvX3JlbWFpbmluZykgPT0gMSkgewotCQlwYi0+cGJfbG9ja2VkID0gMDsKLQkJcGFnZWJ1Zl9pb2RvbmUocGIsIHNjaGVkdWxlKTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYnAtPmJfaW9fcmVtYWluaW5nKSA9PSAxKSB7CisJCWJwLT5iX2xvY2tlZCA9IDA7CisJCXhmc19idWZfaW9lbmQoYnAsIHNjaGVkdWxlKTsKIAl9CiB9CiAKIFNUQVRJQyBpbnQKLWJpb19lbmRfaW9fcGFnZWJ1ZigKK3hmc19idWZfYmlvX2VuZF9pbygKIAlzdHJ1Y3QgYmlvCQkqYmlvLAogCXVuc2lnbmVkIGludAkJYnl0ZXNfZG9uZSwKIAlpbnQJCQllcnJvcikKIHsKLQl4ZnNfYnVmX3QJCSpwYiA9ICh4ZnNfYnVmX3QgKiliaW8tPmJpX3ByaXZhdGU7Ci0JdW5zaWduZWQgaW50CQlibG9ja3NpemUgPSBwYi0+cGJfdGFyZ2V0LT5wYnJfYnNpemU7CisJeGZzX2J1Zl90CQkqYnAgPSAoeGZzX2J1Zl90ICopYmlvLT5iaV9wcml2YXRlOworCXVuc2lnbmVkIGludAkJYmxvY2tzaXplID0gYnAtPmJfdGFyZ2V0LT5idF9ic2l6ZTsKIAlzdHJ1Y3QgYmlvX3ZlYwkJKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYyArIGJpby0+YmlfdmNudCAtIDE7CiAKIAlpZiAoYmlvLT5iaV9zaXplKQogCQlyZXR1cm4gMTsKIAogCWlmICghdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncykpCi0JCXBiLT5wYl9lcnJvciA9IEVJTzsKKwkJYnAtPmJfZXJyb3IgPSBFSU87CiAKIAlkbyB7CiAJCXN0cnVjdCBwYWdlCSpwYWdlID0gYnZlYy0+YnZfcGFnZTsKIAotCQlpZiAodW5saWtlbHkocGItPnBiX2Vycm9yKSkgewotCQkJaWYgKHBiLT5wYl9mbGFncyAmIFBCRl9SRUFEKQorCQlpZiAodW5saWtlbHkoYnAtPmJfZXJyb3IpKSB7CisJCQlpZiAoYnAtPmJfZmxhZ3MgJiBYQkZfUkVBRCkKIAkJCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKIAkJCVNldFBhZ2VFcnJvcihwYWdlKTsKLQkJfSBlbHNlIGlmIChibG9ja3NpemUgPT0gUEFHRV9DQUNIRV9TSVpFKSB7CisJCX0gZWxzZSBpZiAoYmxvY2tzaXplID49IFBBR0VfQ0FDSEVfU0laRSkgewogCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwogCQl9IGVsc2UgaWYgKCFQYWdlUHJpdmF0ZShwYWdlKSAmJgotCQkJCShwYi0+cGJfZmxhZ3MgJiBfUEJGX1BBR0VfQ0FDSEUpKSB7CisJCQkJKGJwLT5iX2ZsYWdzICYgX1hCRl9QQUdFX0NBQ0hFKSkgewogCQkJc2V0X3BhZ2VfcmVnaW9uKHBhZ2UsIGJ2ZWMtPmJ2X29mZnNldCwgYnZlYy0+YnZfbGVuKTsKIAkJfQogCiAJCWlmICgtLWJ2ZWMgPj0gYmlvLT5iaV9pb192ZWMpCiAJCQlwcmVmZXRjaHcoJmJ2ZWMtPmJ2X3BhZ2UtPmZsYWdzKTsKIAotCQlpZiAoX3BhZ2VidWZfaW9sb2NrZWQocGIpKSB7CisJCWlmIChfeGZzX2J1Zl9pb2xvY2tlZChicCkpIHsKIAkJCXVubG9ja19wYWdlKHBhZ2UpOwogCQl9CiAJfSB3aGlsZSAoYnZlYyA+PSBiaW8tPmJpX2lvX3ZlYyk7CiAKLQlfcGFnZWJ1Zl9pb2RvbmUocGIsIDEpOworCV94ZnNfYnVmX2lvZW5kKGJwLCAxKTsKIAliaW9fcHV0KGJpbyk7CiAJcmV0dXJuIDA7CiB9CiAKIFNUQVRJQyB2b2lkCi1fcGFnZWJ1Zl9pb2FwcGx5KAotCXhmc19idWZfdAkJKnBiKQorX3hmc19idWZfaW9hcHBseSgKKwl4ZnNfYnVmX3QJCSpicCkKIHsKIAlpbnQJCQlpLCBydywgbWFwX2ksIHRvdGFsX25yX3BhZ2VzLCBucl9wYWdlczsKIAlzdHJ1Y3QgYmlvCQkqYmlvOwotCWludAkJCW9mZnNldCA9IHBiLT5wYl9vZmZzZXQ7Ci0JaW50CQkJc2l6ZSA9IHBiLT5wYl9jb3VudF9kZXNpcmVkOwotCXNlY3Rvcl90CQlzZWN0b3IgPSBwYi0+cGJfYm47Ci0JdW5zaWduZWQgaW50CQlibG9ja3NpemUgPSBwYi0+cGJfdGFyZ2V0LT5wYnJfYnNpemU7Ci0JaW50CQkJbG9ja2luZyA9IF9wYWdlYnVmX2lvbG9ja2VkKHBiKTsKKwlpbnQJCQlvZmZzZXQgPSBicC0+Yl9vZmZzZXQ7CisJaW50CQkJc2l6ZSA9IGJwLT5iX2NvdW50X2Rlc2lyZWQ7CisJc2VjdG9yX3QJCXNlY3RvciA9IGJwLT5iX2JuOworCXVuc2lnbmVkIGludAkJYmxvY2tzaXplID0gYnAtPmJfdGFyZ2V0LT5idF9ic2l6ZTsKKwlpbnQJCQlsb2NraW5nID0gX3hmc19idWZfaW9sb2NrZWQoYnApOwogCi0JdG90YWxfbnJfcGFnZXMgPSBwYi0+cGJfcGFnZV9jb3VudDsKKwl0b3RhbF9ucl9wYWdlcyA9IGJwLT5iX3BhZ2VfY291bnQ7CiAJbWFwX2kgPSAwOwogCi0JaWYgKHBiLT5wYl9mbGFncyAmIF9QQkZfUlVOX1FVRVVFUykgewotCQlwYi0+cGJfZmxhZ3MgJj0gfl9QQkZfUlVOX1FVRVVFUzsKLQkJcncgPSAocGItPnBiX2ZsYWdzICYgUEJGX1JFQUQpID8gUkVBRF9TWU5DIDogV1JJVEVfU1lOQzsKKwlpZiAoYnAtPmJfZmxhZ3MgJiBfWEJGX1JVTl9RVUVVRVMpIHsKKwkJYnAtPmJfZmxhZ3MgJj0gfl9YQkZfUlVOX1FVRVVFUzsKKwkJcncgPSAoYnAtPmJfZmxhZ3MgJiBYQkZfUkVBRCkgPyBSRUFEX1NZTkMgOiBXUklURV9TWU5DOwogCX0gZWxzZSB7Ci0JCXJ3ID0gKHBiLT5wYl9mbGFncyAmIFBCRl9SRUFEKSA/IFJFQUQgOiBXUklURTsKKwkJcncgPSAoYnAtPmJfZmxhZ3MgJiBYQkZfUkVBRCkgPyBSRUFEIDogV1JJVEU7CiAJfQogCi0JaWYgKHBiLT5wYl9mbGFncyAmIFBCRl9PUkRFUkVEKSB7Ci0JCUFTU0VSVCghKHBiLT5wYl9mbGFncyAmIFBCRl9SRUFEKSk7CisJaWYgKGJwLT5iX2ZsYWdzICYgWEJGX09SREVSRUQpIHsKKwkJQVNTRVJUKCEoYnAtPmJfZmxhZ3MgJiBYQkZfUkVBRCkpOwogCQlydyA9IFdSSVRFX0JBUlJJRVI7CiAJfQogCi0JLyogU3BlY2lhbCBjb2RlIHBhdGggZm9yIHJlYWRpbmcgYSBzdWIgcGFnZSBzaXplIHBhZ2VidWYgaW4gLS0KKwkvKiBTcGVjaWFsIGNvZGUgcGF0aCBmb3IgcmVhZGluZyBhIHN1YiBwYWdlIHNpemUgYnVmZmVyIGluIC0tCiAJICogd2UgcG9wdWxhdGUgdXAgdGhlIHdob2xlIHBhZ2UsIGFuZCBoZW5jZSB0aGUgb3RoZXIgbWV0YWRhdGEKIAkgKiBpbiB0aGUgc2FtZSBwYWdlLiAgVGhpcyBvcHRpbWl6YXRpb24gaXMgb25seSB2YWxpZCB3aGVuIHRoZQotCSAqIGZpbGVzeXN0ZW0gYmxvY2sgc2l6ZSBhbmQgdGhlIHBhZ2Ugc2l6ZSBhcmUgZXF1YWwuCisJICogZmlsZXN5c3RlbSBibG9jayBzaXplIGlzIG5vdCBzbWFsbGVyIHRoYW4gdGhlIHBhZ2Ugc2l6ZS4KIAkgKi8KLQlpZiAoKHBiLT5wYl9idWZmZXJfbGVuZ3RoIDwgUEFHRV9DQUNIRV9TSVpFKSAmJgotCSAgICAocGItPnBiX2ZsYWdzICYgUEJGX1JFQUQpICYmIGxvY2tpbmcgJiYKLQkgICAgKGJsb2Nrc2l6ZSA9PSBQQUdFX0NBQ0hFX1NJWkUpKSB7CisJaWYgKChicC0+Yl9idWZmZXJfbGVuZ3RoIDwgUEFHRV9DQUNIRV9TSVpFKSAmJgorCSAgICAoYnAtPmJfZmxhZ3MgJiBYQkZfUkVBRCkgJiYgbG9ja2luZyAmJgorCSAgICAoYmxvY2tzaXplID49IFBBR0VfQ0FDSEVfU0laRSkpIHsKIAkJYmlvID0gYmlvX2FsbG9jKEdGUF9OT0lPLCAxKTsKIAotCQliaW8tPmJpX2JkZXYgPSBwYi0+cGJfdGFyZ2V0LT5wYnJfYmRldjsKKwkJYmlvLT5iaV9iZGV2ID0gYnAtPmJfdGFyZ2V0LT5idF9iZGV2OwogCQliaW8tPmJpX3NlY3RvciA9IHNlY3RvciAtIChvZmZzZXQgPj4gQkJTSElGVCk7Ci0JCWJpby0+YmlfZW5kX2lvID0gYmlvX2VuZF9pb19wYWdlYnVmOwotCQliaW8tPmJpX3ByaXZhdGUgPSBwYjsKKwkJYmlvLT5iaV9lbmRfaW8gPSB4ZnNfYnVmX2Jpb19lbmRfaW87CisJCWJpby0+YmlfcHJpdmF0ZSA9IGJwOwogCi0JCWJpb19hZGRfcGFnZShiaW8sIHBiLT5wYl9wYWdlc1swXSwgUEFHRV9DQUNIRV9TSVpFLCAwKTsKKwkJYmlvX2FkZF9wYWdlKGJpbywgYnAtPmJfcGFnZXNbMF0sIFBBR0VfQ0FDSEVfU0laRSwgMCk7CiAJCXNpemUgPSAwOwogCi0JCWF0b21pY19pbmMoJnBiLT5wYl9pb19yZW1haW5pbmcpOworCQlhdG9taWNfaW5jKCZicC0+Yl9pb19yZW1haW5pbmcpOwogCiAJCWdvdG8gc3VibWl0X2lvOwogCX0KIAogCS8qIExvY2sgZG93biB0aGUgcGFnZXMgd2hpY2ggd2UgbmVlZCB0byBmb3IgdGhlIHJlcXVlc3QgKi8KLQlpZiAobG9ja2luZyAmJiAocGItPnBiX2ZsYWdzICYgUEJGX1dSSVRFKSAmJiAocGItPnBiX2xvY2tlZCA9PSAwKSkgeworCWlmIChsb2NraW5nICYmIChicC0+Yl9mbGFncyAmIFhCRl9XUklURSkgJiYgKGJwLT5iX2xvY2tlZCA9PSAwKSkgewogCQlmb3IgKGkgPSAwOyBzaXplOyBpKyspIHsKIAkJCWludAkJbmJ5dGVzID0gUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0OwotCQkJc3RydWN0IHBhZ2UJKnBhZ2UgPSBwYi0+cGJfcGFnZXNbaV07CisJCQlzdHJ1Y3QgcGFnZQkqcGFnZSA9IGJwLT5iX3BhZ2VzW2ldOwogCiAJCQlpZiAobmJ5dGVzID4gc2l6ZSkKIAkJCQluYnl0ZXMgPSBzaXplOwpAQCAtMTI3NiwzMCArMTE5NywzMCBAQAogCQkJc2l6ZSAtPSBuYnl0ZXM7CiAJCQlvZmZzZXQgPSAwOwogCQl9Ci0JCW9mZnNldCA9IHBiLT5wYl9vZmZzZXQ7Ci0JCXNpemUgPSBwYi0+cGJfY291bnRfZGVzaXJlZDsKKwkJb2Zmc2V0ID0gYnAtPmJfb2Zmc2V0OworCQlzaXplID0gYnAtPmJfY291bnRfZGVzaXJlZDsKIAl9CiAKIG5leHRfY2h1bms6Ci0JYXRvbWljX2luYygmcGItPnBiX2lvX3JlbWFpbmluZyk7CisJYXRvbWljX2luYygmYnAtPmJfaW9fcmVtYWluaW5nKTsKIAlucl9wYWdlcyA9IEJJT19NQVhfU0VDVE9SUyA+PiAoUEFHRV9TSElGVCAtIEJCU0hJRlQpOwogCWlmIChucl9wYWdlcyA+IHRvdGFsX25yX3BhZ2VzKQogCQlucl9wYWdlcyA9IHRvdGFsX25yX3BhZ2VzOwogCiAJYmlvID0gYmlvX2FsbG9jKEdGUF9OT0lPLCBucl9wYWdlcyk7Ci0JYmlvLT5iaV9iZGV2ID0gcGItPnBiX3RhcmdldC0+cGJyX2JkZXY7CisJYmlvLT5iaV9iZGV2ID0gYnAtPmJfdGFyZ2V0LT5idF9iZGV2OwogCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yOwotCWJpby0+YmlfZW5kX2lvID0gYmlvX2VuZF9pb19wYWdlYnVmOwotCWJpby0+YmlfcHJpdmF0ZSA9IHBiOworCWJpby0+YmlfZW5kX2lvID0geGZzX2J1Zl9iaW9fZW5kX2lvOworCWJpby0+YmlfcHJpdmF0ZSA9IGJwOwogCiAJZm9yICg7IHNpemUgJiYgbnJfcGFnZXM7IG5yX3BhZ2VzLS0sIG1hcF9pKyspIHsKLQkJaW50CW5ieXRlcyA9IFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldDsKKwkJaW50CXJieXRlcywgbmJ5dGVzID0gUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0OwogCiAJCWlmIChuYnl0ZXMgPiBzaXplKQogCQkJbmJ5dGVzID0gc2l6ZTsKIAotCQlpZiAoYmlvX2FkZF9wYWdlKGJpbywgcGItPnBiX3BhZ2VzW21hcF9pXSwKLQkJCQkJbmJ5dGVzLCBvZmZzZXQpIDwgbmJ5dGVzKQorCQlyYnl0ZXMgPSBiaW9fYWRkX3BhZ2UoYmlvLCBicC0+Yl9wYWdlc1ttYXBfaV0sIG5ieXRlcywgb2Zmc2V0KTsKKwkJaWYgKHJieXRlcyA8IG5ieXRlcykKIAkJCWJyZWFrOwogCiAJCW9mZnNldCA9IDA7CkBAIC0xMzE1LDEwNyArMTIzNiwxMDIgQEAKIAkJCWdvdG8gbmV4dF9jaHVuazsKIAl9IGVsc2UgewogCQliaW9fcHV0KGJpbyk7Ci0JCXBhZ2VidWZfaW9lcnJvcihwYiwgRUlPKTsKKwkJeGZzX2J1Zl9pb2Vycm9yKGJwLCBFSU8pOwogCX0KIH0KIAotLyoKLSAqCXBhZ2VidWZfaW9yZXF1ZXN0IC0tIHRoZSBjb3JlIEkvTyByZXF1ZXN0IHJvdXRpbmUuCi0gKi8KIGludAotcGFnZWJ1Zl9pb3JlcXVlc3QoCQkJLyogc3RhcnQgcmVhbCBJL08JCSovCi0JeGZzX2J1Zl90CQkqcGIpCS8qIGJ1ZmZlciB0byBjb252ZXkgdG8gZGV2aWNlCSovCit4ZnNfYnVmX2lvcmVxdWVzdCgKKwl4ZnNfYnVmX3QJCSpicCkKIHsKLQlQQl9UUkFDRShwYiwgImlvcmVxdWVzdCIsIDApOworCVhCX1RSQUNFKGJwLCAiaW9yZXF1ZXN0IiwgMCk7CiAKLQlpZiAocGItPnBiX2ZsYWdzICYgUEJGX0RFTFdSSSkgewotCQlwYWdlYnVmX2RlbHdyaV9xdWV1ZShwYiwgMSk7CisJaWYgKGJwLT5iX2ZsYWdzICYgWEJGX0RFTFdSSSkgeworCQl4ZnNfYnVmX2RlbHdyaV9xdWV1ZShicCwgMSk7CiAJCXJldHVybiAwOwogCX0KIAotCWlmIChwYi0+cGJfZmxhZ3MgJiBQQkZfV1JJVEUpIHsKLQkJX3BhZ2VidWZfd2FpdF91bnBpbihwYik7CisJaWYgKGJwLT5iX2ZsYWdzICYgWEJGX1dSSVRFKSB7CisJCXhmc19idWZfd2FpdF91bnBpbihicCk7CiAJfQogCi0JcGFnZWJ1Zl9ob2xkKHBiKTsKKwl4ZnNfYnVmX2hvbGQoYnApOwogCiAJLyogU2V0IHRoZSBjb3VudCB0byAxIGluaXRpYWxseSwgdGhpcyB3aWxsIHN0b3AgYW4gSS9PCiAJICogY29tcGxldGlvbiBjYWxsb3V0IHdoaWNoIGhhcHBlbnMgYmVmb3JlIHdlIGhhdmUgc3RhcnRlZAotCSAqIGFsbCB0aGUgSS9PIGZyb20gY2FsbGluZyBwYWdlYnVmX2lvZG9uZSB0b28gZWFybHkuCisJICogYWxsIHRoZSBJL08gZnJvbSBjYWxsaW5nIHhmc19idWZfaW9lbmQgdG9vIGVhcmx5LgogCSAqLwotCWF0b21pY19zZXQoJnBiLT5wYl9pb19yZW1haW5pbmcsIDEpOwotCV9wYWdlYnVmX2lvYXBwbHkocGIpOwotCV9wYWdlYnVmX2lvZG9uZShwYiwgMCk7CisJYXRvbWljX3NldCgmYnAtPmJfaW9fcmVtYWluaW5nLCAxKTsKKwlfeGZzX2J1Zl9pb2FwcGx5KGJwKTsKKwlfeGZzX2J1Zl9pb2VuZChicCwgMCk7CiAKLQlwYWdlYnVmX3JlbGUocGIpOworCXhmc19idWZfcmVsZShicCk7CiAJcmV0dXJuIDA7CiB9CiAKIC8qCi0gKglwYWdlYnVmX2lvd2FpdAotICoKLSAqCXBhZ2VidWZfaW93YWl0IHdhaXRzIGZvciBJL08gdG8gY29tcGxldGUgb24gdGhlIGJ1ZmZlciBzdXBwbGllZC4KLSAqCUl0IHJldHVybnMgaW1tZWRpYXRlbHkgaWYgbm8gSS9PIGlzIHBlbmRpbmcuICBJbiBhbnkgY2FzZSwgaXQgcmV0dXJucwotICoJdGhlIGVycm9yIGNvZGUsIGlmIGFueSwgb3IgMCBpZiB0aGVyZSBpcyBubyBlcnJvci4KKyAqCVdhaXRzIGZvciBJL08gdG8gY29tcGxldGUgb24gdGhlIGJ1ZmZlciBzdXBwbGllZC4KKyAqCUl0IHJldHVybnMgaW1tZWRpYXRlbHkgaWYgbm8gSS9PIGlzIHBlbmRpbmcuCisgKglJdCByZXR1cm5zIHRoZSBJL08gZXJyb3IgY29kZSwgaWYgYW55LCBvciAwIGlmIHRoZXJlIHdhcyBubyBlcnJvci4KICAqLwogaW50Ci1wYWdlYnVmX2lvd2FpdCgKLQl4ZnNfYnVmX3QJCSpwYikKK3hmc19idWZfaW93YWl0KAorCXhmc19idWZfdAkJKmJwKQogewotCVBCX1RSQUNFKHBiLCAiaW93YWl0IiwgMCk7Ci0JaWYgKGF0b21pY19yZWFkKCZwYi0+cGJfaW9fcmVtYWluaW5nKSkKLQkJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKHBiLT5wYl90YXJnZXQtPnBicl9tYXBwaW5nKTsKLQlkb3duKCZwYi0+cGJfaW9kb25lc2VtYSk7Ci0JUEJfVFJBQ0UocGIsICJpb3dhaXRlZCIsIChsb25nKXBiLT5wYl9lcnJvcik7Ci0JcmV0dXJuIHBiLT5wYl9lcnJvcjsKKwlYQl9UUkFDRShicCwgImlvd2FpdCIsIDApOworCWlmIChhdG9taWNfcmVhZCgmYnAtPmJfaW9fcmVtYWluaW5nKSkKKwkJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKGJwLT5iX3RhcmdldC0+YnRfbWFwcGluZyk7CisJZG93bigmYnAtPmJfaW9kb25lc2VtYSk7CisJWEJfVFJBQ0UoYnAsICJpb3dhaXRlZCIsIChsb25nKWJwLT5iX2Vycm9yKTsKKwlyZXR1cm4gYnAtPmJfZXJyb3I7CiB9CiAKLWNhZGRyX3QKLXBhZ2VidWZfb2Zmc2V0KAotCXhmc19idWZfdAkJKnBiLAoreGZzX2NhZGRyX3QKK3hmc19idWZfb2Zmc2V0KAorCXhmc19idWZfdAkJKmJwLAogCXNpemVfdAkJCW9mZnNldCkKIHsKIAlzdHJ1Y3QgcGFnZQkJKnBhZ2U7CiAKLQlvZmZzZXQgKz0gcGItPnBiX29mZnNldDsKKwlpZiAoYnAtPmJfZmxhZ3MgJiBYQkZfTUFQUEVEKQorCQlyZXR1cm4gWEZTX0JVRl9QVFIoYnApICsgb2Zmc2V0OwogCi0JcGFnZSA9IHBiLT5wYl9wYWdlc1tvZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVF07Ci0JcmV0dXJuIChjYWRkcl90KSBwYWdlX2FkZHJlc3MocGFnZSkgKyAob2Zmc2V0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsKKwlvZmZzZXQgKz0gYnAtPmJfb2Zmc2V0OworCXBhZ2UgPSBicC0+Yl9wYWdlc1tvZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVF07CisJcmV0dXJuICh4ZnNfY2FkZHJfdClwYWdlX2FkZHJlc3MocGFnZSkgKyAob2Zmc2V0ICYgKFBBR0VfQ0FDSEVfU0laRS0xKSk7CiB9CiAKIC8qCi0gKglwYWdlYnVmX2lvbW92ZQotICoKICAqCU1vdmUgZGF0YSBpbnRvIG9yIG91dCBvZiBhIGJ1ZmZlci4KICAqLwogdm9pZAotcGFnZWJ1Zl9pb21vdmUoCi0JeGZzX2J1Zl90CQkqcGIsCS8qIGJ1ZmZlciB0byBwcm9jZXNzCQkqLworeGZzX2J1Zl9pb21vdmUoCisJeGZzX2J1Zl90CQkqYnAsCS8qIGJ1ZmZlciB0byBwcm9jZXNzCQkqLwogCXNpemVfdAkJCWJvZmYsCS8qIHN0YXJ0aW5nIGJ1ZmZlciBvZmZzZXQJKi8KIAlzaXplX3QJCQlic2l6ZSwJLyogbGVuZ3RoIHRvIGNvcHkJCSovCiAJY2FkZHJfdAkJCWRhdGEsCS8qIGRhdGEgYWRkcmVzcwkJCSovCi0JcGFnZV9idWZfcndfdAkJbW9kZSkJLyogcmVhZC93cml0ZSBmbGFnCQkqLworCXhmc19idWZfcndfdAkJbW9kZSkJLyogcmVhZC93cml0ZS96ZXJvIGZsYWcJCSovCiB7CiAJc2l6ZV90CQkJYmVuZCwgY3BvZmYsIGNzaXplOwogCXN0cnVjdCBwYWdlCQkqcGFnZTsKIAogCWJlbmQgPSBib2ZmICsgYnNpemU7CiAJd2hpbGUgKGJvZmYgPCBiZW5kKSB7Ci0JCXBhZ2UgPSBwYi0+cGJfcGFnZXNbcGFnZV9idWZfYnRvY3QoYm9mZiArIHBiLT5wYl9vZmZzZXQpXTsKLQkJY3BvZmYgPSBwYWdlX2J1Zl9wb2ZmKGJvZmYgKyBwYi0+cGJfb2Zmc2V0KTsKKwkJcGFnZSA9IGJwLT5iX3BhZ2VzW3hmc19idWZfYnRvY3QoYm9mZiArIGJwLT5iX29mZnNldCldOworCQljcG9mZiA9IHhmc19idWZfcG9mZihib2ZmICsgYnAtPmJfb2Zmc2V0KTsKIAkJY3NpemUgPSBtaW5fdChzaXplX3QsCi0JCQkgICAgICBQQUdFX0NBQ0hFX1NJWkUtY3BvZmYsIHBiLT5wYl9jb3VudF9kZXNpcmVkLWJvZmYpOworCQkJICAgICAgUEFHRV9DQUNIRV9TSVpFLWNwb2ZmLCBicC0+Yl9jb3VudF9kZXNpcmVkLWJvZmYpOwogCiAJCUFTU0VSVCgoKGNzaXplICsgY3BvZmYpIDw9IFBBR0VfQ0FDSEVfU0laRSkpOwogCiAJCXN3aXRjaCAobW9kZSkgewotCQljYXNlIFBCUldfWkVSTzoKKwkJY2FzZSBYQlJXX1pFUk86CiAJCQltZW1zZXQocGFnZV9hZGRyZXNzKHBhZ2UpICsgY3BvZmYsIDAsIGNzaXplKTsKIAkJCWJyZWFrOwotCQljYXNlIFBCUldfUkVBRDoKKwkJY2FzZSBYQlJXX1JFQUQ6CiAJCQltZW1jcHkoZGF0YSwgcGFnZV9hZGRyZXNzKHBhZ2UpICsgY3BvZmYsIGNzaXplKTsKIAkJCWJyZWFrOwotCQljYXNlIFBCUldfV1JJVEU6CisJCWNhc2UgWEJSV19XUklURToKIAkJCW1lbWNweShwYWdlX2FkZHJlc3MocGFnZSkgKyBjcG9mZiwgZGF0YSwgY3NpemUpOwogCQl9CiAKQEAgLTE0MjUsMTIgKzEzNDEsMTIgQEAKIH0KIAogLyoKLSAqCUhhbmRsaW5nIG9mIGJ1ZnRhcmdzLgorICoJSGFuZGxpbmcgb2YgYnVmZmVyIHRhcmdldHMgKGJ1ZnRhcmdzKS4KICAqLwogCiAvKgotICogV2FpdCBmb3IgYW55IGJ1ZnMgd2l0aCBjYWxsYmFja3MgdGhhdCBoYXZlIGJlZW4gc3VibWl0dGVkIGJ1dAotICogaGF2ZSBub3QgeWV0IHJldHVybmVkLi4uIHdhbGsgdGhlIGhhc2ggbGlzdCBmb3IgdGhlIHRhcmdldC4KKyAqCVdhaXQgZm9yIGFueSBidWZzIHdpdGggY2FsbGJhY2tzIHRoYXQgaGF2ZSBiZWVuIHN1Ym1pdHRlZCBidXQKKyAqCWhhdmUgbm90IHlldCByZXR1cm5lZC4uLiB3YWxrIHRoZSBoYXNoIGxpc3QgZm9yIHRoZSB0YXJnZXQuCiAgKi8KIHZvaWQKIHhmc193YWl0X2J1ZnRhcmcoCkBAIC0xNDQ0LDE1ICsxMzYwLDE1IEBACiAJCWhhc2ggPSAmYnRwLT5idF9oYXNoW2ldOwogYWdhaW46CiAJCXNwaW5fbG9jaygmaGFzaC0+YmhfbG9jayk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShicCwgbiwgJmhhc2gtPmJoX2xpc3QsIHBiX2hhc2hfbGlzdCkgewotCQkJQVNTRVJUKGJ0cCA9PSBicC0+cGJfdGFyZ2V0KTsKLQkJCWlmICghKGJwLT5wYl9mbGFncyAmIFBCRl9GU19NQU5BR0VEKSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnAsIG4sICZoYXNoLT5iaF9saXN0LCBiX2hhc2hfbGlzdCkgeworCQkJQVNTRVJUKGJ0cCA9PSBicC0+Yl90YXJnZXQpOworCQkJaWYgKCEoYnAtPmJfZmxhZ3MgJiBYQkZfRlNfTUFOQUdFRCkpIHsKIAkJCQlzcGluX3VubG9jaygmaGFzaC0+YmhfbG9jayk7CiAJCQkJLyoKIAkJCQkgKiBDYXRjaCBzdXBlcmJsb2NrIHJlZmVyZW5jZSBjb3VudCBsZWFrcwogCQkJCSAqIGltbWVkaWF0ZWx5CiAJCQkJICovCi0JCQkJQlVHX09OKGJwLT5wYl9ibiA9PSAwKTsKKwkJCQlCVUdfT04oYnAtPmJfYm4gPT0gMCk7CiAJCQkJZGVsYXkoMTAwKTsKIAkJCQlnb3RvIGFnYWluOwogCQkJfQpAQCAtMTQ2Miw5ICsxMzc4LDkgQEAKIH0KIAogLyoKLSAqIEFsbG9jYXRlIGJ1ZmZlciBoYXNoIHRhYmxlIGZvciBhIGdpdmVuIHRhcmdldC4KLSAqIEZvciBkZXZpY2VzIGNvbnRhaW5pbmcgbWV0YWRhdGEgKGkuZS4gbm90IHRoZSBsb2cvcmVhbHRpbWUgZGV2aWNlcykKLSAqIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSBtdWNoIGxhcmdlciBoYXNoIHRhYmxlLgorICoJQWxsb2NhdGUgYnVmZmVyIGhhc2ggdGFibGUgZm9yIGEgZ2l2ZW4gdGFyZ2V0LgorICoJRm9yIGRldmljZXMgY29udGFpbmluZyBtZXRhZGF0YSAoaS5lLiBub3QgdGhlIGxvZy9yZWFsdGltZSBkZXZpY2VzKQorICoJd2UgbmVlZCB0byBhbGxvY2F0ZSBhIG11Y2ggbGFyZ2VyIGhhc2ggdGFibGUuCiAgKi8KIFNUQVRJQyB2b2lkCiB4ZnNfYWxsb2NfYnVmaGFzaCgKQEAgLTE0ODcsMTEgKzE0MDMsMzQgQEAKIHhmc19mcmVlX2J1Zmhhc2goCiAJeGZzX2J1ZnRhcmdfdAkJKmJ0cCkKIHsKLQlrbWVtX2ZyZWUoYnRwLT5idF9oYXNoLAotCQkJKDEgPDwgYnRwLT5idF9oYXNoc2hpZnQpICogc2l6ZW9mKHhmc19idWZoYXNoX3QpKTsKKwlrbWVtX2ZyZWUoYnRwLT5idF9oYXNoLCAoMTw8YnRwLT5idF9oYXNoc2hpZnQpICogc2l6ZW9mKHhmc19idWZoYXNoX3QpKTsKIAlidHAtPmJ0X2hhc2ggPSBOVUxMOwogfQogCisvKgorICoJYnVmdGFyZyBsaXN0IGZvciBkZWx3cml0ZSBxdWV1ZSBwcm9jZXNzaW5nCisgKi8KK1NUQVRJQyBMSVNUX0hFQUQoeGZzX2J1ZnRhcmdfbGlzdCk7CitTVEFUSUMgREVGSU5FX1NQSU5MT0NLKHhmc19idWZ0YXJnX2xvY2spOworCitTVEFUSUMgdm9pZAoreGZzX3JlZ2lzdGVyX2J1ZnRhcmcoCisJeGZzX2J1ZnRhcmdfdCAgICAgICAgICAgKmJ0cCkKK3sKKwlzcGluX2xvY2soJnhmc19idWZ0YXJnX2xvY2spOworCWxpc3RfYWRkKCZidHAtPmJ0X2xpc3QsICZ4ZnNfYnVmdGFyZ19saXN0KTsKKwlzcGluX3VubG9jaygmeGZzX2J1ZnRhcmdfbG9jayk7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfdW5yZWdpc3Rlcl9idWZ0YXJnKAorCXhmc19idWZ0YXJnX3QgICAgICAgICAgICpidHApCit7CisJc3Bpbl9sb2NrKCZ4ZnNfYnVmdGFyZ19sb2NrKTsKKwlsaXN0X2RlbCgmYnRwLT5idF9saXN0KTsKKwlzcGluX3VubG9jaygmeGZzX2J1ZnRhcmdfbG9jayk7Cit9CisKIHZvaWQKIHhmc19mcmVlX2J1ZnRhcmcoCiAJeGZzX2J1ZnRhcmdfdAkJKmJ0cCwKQEAgLTE0OTksOSArMTQzOCwxNiBAQAogewogCXhmc19mbHVzaF9idWZ0YXJnKGJ0cCwgMSk7CiAJaWYgKGV4dGVybmFsKQotCQl4ZnNfYmxrZGV2X3B1dChidHAtPnBicl9iZGV2KTsKKwkJeGZzX2Jsa2Rldl9wdXQoYnRwLT5idF9iZGV2KTsKIAl4ZnNfZnJlZV9idWZoYXNoKGJ0cCk7Ci0JaXB1dChidHAtPnBicl9tYXBwaW5nLT5ob3N0KTsKKwlpcHV0KGJ0cC0+YnRfbWFwcGluZy0+aG9zdCk7CisKKwkvKiBVbnJlZ2lzdGVyIHRoZSBidWZ0YXJnIGZpcnN0IHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGEKKwkgKiB3YWtldXAgZmluZGluZyBhIG5vbi1leGlzdGVudCB0YXNrCisJICovCisJeGZzX3VucmVnaXN0ZXJfYnVmdGFyZyhidHApOworCWt0aHJlYWRfc3RvcChidHAtPmJ0X3Rhc2spOworCiAJa21lbV9mcmVlKGJ0cCwgc2l6ZW9mKCpidHApKTsKIH0KIApAQCAtMTUxMiwxMSArMTQ1OCwxMSBAQAogCXVuc2lnbmVkIGludAkJc2VjdG9yc2l6ZSwKIAlpbnQJCQl2ZXJib3NlKQogewotCWJ0cC0+cGJyX2JzaXplID0gYmxvY2tzaXplOwotCWJ0cC0+cGJyX3NzaGlmdCA9IGZmcyhzZWN0b3JzaXplKSAtIDE7Ci0JYnRwLT5wYnJfc21hc2sgPSBzZWN0b3JzaXplIC0gMTsKKwlidHAtPmJ0X2JzaXplID0gYmxvY2tzaXplOworCWJ0cC0+YnRfc3NoaWZ0ID0gZmZzKHNlY3RvcnNpemUpIC0gMTsKKwlidHAtPmJ0X3NtYXNrID0gc2VjdG9yc2l6ZSAtIDE7CiAKLQlpZiAoc2V0X2Jsb2Nrc2l6ZShidHAtPnBicl9iZGV2LCBzZWN0b3JzaXplKSkgeworCWlmIChzZXRfYmxvY2tzaXplKGJ0cC0+YnRfYmRldiwgc2VjdG9yc2l6ZSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJIlhGUzogQ2Fubm90IHNldF9ibG9ja3NpemUgdG8gJXUgb24gZGV2aWNlICVzXG4iLAogCQkJc2VjdG9yc2l6ZSwgWEZTX0JVRlRBUkdfTkFNRShidHApKTsKQEAgLTE1MzYsMTAgKzE0ODIsMTAgQEAKIH0KIAogLyoKLSogV2hlbiBhbGxvY2F0aW5nIHRoZSBpbml0aWFsIGJ1ZmZlciB0YXJnZXQgd2UgaGF2ZSBub3QgeWV0Ci0qIHJlYWQgaW4gdGhlIHN1cGVyYmxvY2ssIHNvIGRvbid0IGtub3cgd2hhdCBzaXplZCBzZWN0b3JzCi0qIGFyZSBiZWluZyB1c2VkIGlzIGF0IHRoaXMgZWFybHkgc3RhZ2UuICBQbGF5IHNhZmUuCi0qLworICoJV2hlbiBhbGxvY2F0aW5nIHRoZSBpbml0aWFsIGJ1ZmZlciB0YXJnZXQgd2UgaGF2ZSBub3QgeWV0CisgKglyZWFkIGluIHRoZSBzdXBlcmJsb2NrLCBzbyBkb24ndCBrbm93IHdoYXQgc2l6ZWQgc2VjdG9ycworICoJYXJlIGJlaW5nIHVzZWQgaXMgYXQgdGhpcyBlYXJseSBzdGFnZS4gIFBsYXkgc2FmZS4KKyAqLwogU1RBVElDIGludAogeGZzX3NldHNpemVfYnVmdGFyZ19lYXJseSgKIAl4ZnNfYnVmdGFyZ190CQkqYnRwLApAQCAtMTU4NywxMCArMTUzMywzMCBAQAogCW1hcHBpbmctPmFfb3BzID0gJm1hcHBpbmdfYW9wczsKIAltYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gYmRpOwogCW1hcHBpbmdfc2V0X2dmcF9tYXNrKG1hcHBpbmcsIEdGUF9OT0ZTKTsKLQlidHAtPnBicl9tYXBwaW5nID0gbWFwcGluZzsKKwlidHAtPmJ0X21hcHBpbmcgPSBtYXBwaW5nOwogCXJldHVybiAwOwogfQogCitTVEFUSUMgaW50Cit4ZnNfYWxsb2NfZGVsd3JpdGVfcXVldWUoCisJeGZzX2J1ZnRhcmdfdAkJKmJ0cCkKK3sKKwlpbnQJZXJyb3IgPSAwOworCisJSU5JVF9MSVNUX0hFQUQoJmJ0cC0+YnRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmJ0cC0+YnRfZGVsd3JpdGVfcXVldWUpOworCXNwaW5sb2NrX2luaXQoJmJ0cC0+YnRfZGVsd3JpdGVfbG9jaywgImRlbHdyaV9sb2NrIik7CisJYnRwLT5idF9mbGFncyA9IDA7CisJYnRwLT5idF90YXNrID0ga3RocmVhZF9ydW4oeGZzYnVmZCwgYnRwLCAieGZzYnVmZCIpOworCWlmIChJU19FUlIoYnRwLT5idF90YXNrKSkgeworCQllcnJvciA9IFBUUl9FUlIoYnRwLT5idF90YXNrKTsKKwkJZ290byBvdXRfZXJyb3I7CisJfQorCXhmc19yZWdpc3Rlcl9idWZ0YXJnKGJ0cCk7CitvdXRfZXJyb3I6CisJcmV0dXJuIGVycm9yOworfQorCiB4ZnNfYnVmdGFyZ190ICoKIHhmc19hbGxvY19idWZ0YXJnKAogCXN0cnVjdCBibG9ja19kZXZpY2UJKmJkZXYsCkBAIC0xNjAwLDEyICsxNTY2LDE0IEBACiAKIAlidHAgPSBrbWVtX3phbGxvYyhzaXplb2YoKmJ0cCksIEtNX1NMRUVQKTsKIAotCWJ0cC0+cGJyX2RldiA9ICBiZGV2LT5iZF9kZXY7Ci0JYnRwLT5wYnJfYmRldiA9IGJkZXY7CisJYnRwLT5idF9kZXYgPSAgYmRldi0+YmRfZGV2OworCWJ0cC0+YnRfYmRldiA9IGJkZXY7CiAJaWYgKHhmc19zZXRzaXplX2J1ZnRhcmdfZWFybHkoYnRwLCBiZGV2KSkKIAkJZ290byBlcnJvcjsKIAlpZiAoeGZzX21hcHBpbmdfYnVmdGFyZyhidHAsIGJkZXYpKQogCQlnb3RvIGVycm9yOworCWlmICh4ZnNfYWxsb2NfZGVsd3JpdGVfcXVldWUoYnRwKSkKKwkJZ290byBlcnJvcjsKIAl4ZnNfYWxsb2NfYnVmaGFzaChidHAsIGV4dGVybmFsKTsKIAlyZXR1cm4gYnRwOwogCkBAIC0xNjE2LDgzICsxNTg0LDgxIEBACiAKIAogLyoKLSAqIFBhZ2VidWYgZGVsYXllZCB3cml0ZSBidWZmZXIgaGFuZGxpbmcKKyAqCURlbGF5ZWQgd3JpdGUgYnVmZmVyIGhhbmRsaW5nCiAgKi8KLQotU1RBVElDIExJU1RfSEVBRChwYmRfZGVsd3JpdGVfcXVldWUpOwotU1RBVElDIERFRklORV9TUElOTE9DSyhwYmRfZGVsd3JpdGVfbG9jayk7Ci0KIFNUQVRJQyB2b2lkCi1wYWdlYnVmX2RlbHdyaV9xdWV1ZSgKLQl4ZnNfYnVmX3QJCSpwYiwKK3hmc19idWZfZGVsd3JpX3F1ZXVlKAorCXhmc19idWZfdAkJKmJwLAogCWludAkJCXVubG9jaykKIHsKLQlQQl9UUkFDRShwYiwgImRlbHdyaV9xIiwgKGxvbmcpdW5sb2NrKTsKLQlBU1NFUlQoKHBiLT5wYl9mbGFncyAmIChQQkZfREVMV1JJfFBCRl9BU1lOQykpID09Ci0JCQkJCShQQkZfREVMV1JJfFBCRl9BU1lOQykpOworCXN0cnVjdCBsaXN0X2hlYWQJKmR3cSA9ICZicC0+Yl90YXJnZXQtPmJ0X2RlbHdyaXRlX3F1ZXVlOworCXNwaW5sb2NrX3QJCSpkd2xrID0gJmJwLT5iX3RhcmdldC0+YnRfZGVsd3JpdGVfbG9jazsKIAotCXNwaW5fbG9jaygmcGJkX2RlbHdyaXRlX2xvY2spOworCVhCX1RSQUNFKGJwLCAiZGVsd3JpX3EiLCAobG9uZyl1bmxvY2spOworCUFTU0VSVCgoYnAtPmJfZmxhZ3MmKFhCRl9ERUxXUkl8WEJGX0FTWU5DKSkgPT0gKFhCRl9ERUxXUkl8WEJGX0FTWU5DKSk7CisKKwlzcGluX2xvY2soZHdsayk7CiAJLyogSWYgYWxyZWFkeSBpbiB0aGUgcXVldWUsIGRlcXVldWUgYW5kIHBsYWNlIGF0IHRhaWwgKi8KLQlpZiAoIWxpc3RfZW1wdHkoJnBiLT5wYl9saXN0KSkgewotCQlBU1NFUlQocGItPnBiX2ZsYWdzICYgX1BCRl9ERUxXUklfUSk7Ci0JCWlmICh1bmxvY2spIHsKLQkJCWF0b21pY19kZWMoJnBiLT5wYl9ob2xkKTsKLQkJfQotCQlsaXN0X2RlbCgmcGItPnBiX2xpc3QpOworCWlmICghbGlzdF9lbXB0eSgmYnAtPmJfbGlzdCkpIHsKKwkJQVNTRVJUKGJwLT5iX2ZsYWdzICYgX1hCRl9ERUxXUklfUSk7CisJCWlmICh1bmxvY2spCisJCQlhdG9taWNfZGVjKCZicC0+Yl9ob2xkKTsKKwkJbGlzdF9kZWwoJmJwLT5iX2xpc3QpOwogCX0KIAotCXBiLT5wYl9mbGFncyB8PSBfUEJGX0RFTFdSSV9ROwotCWxpc3RfYWRkX3RhaWwoJnBiLT5wYl9saXN0LCAmcGJkX2RlbHdyaXRlX3F1ZXVlKTsKLQlwYi0+cGJfcXVldWV0aW1lID0gamlmZmllczsKLQlzcGluX3VubG9jaygmcGJkX2RlbHdyaXRlX2xvY2spOworCWJwLT5iX2ZsYWdzIHw9IF9YQkZfREVMV1JJX1E7CisJbGlzdF9hZGRfdGFpbCgmYnAtPmJfbGlzdCwgZHdxKTsKKwlicC0+Yl9xdWV1ZXRpbWUgPSBqaWZmaWVzOworCXNwaW5fdW5sb2NrKGR3bGspOwogCiAJaWYgKHVubG9jaykKLQkJcGFnZWJ1Zl91bmxvY2socGIpOworCQl4ZnNfYnVmX3VubG9jayhicCk7CiB9CiAKIHZvaWQKLXBhZ2VidWZfZGVsd3JpX2RlcXVldWUoCi0JeGZzX2J1Zl90CQkqcGIpCit4ZnNfYnVmX2RlbHdyaV9kZXF1ZXVlKAorCXhmc19idWZfdAkJKmJwKQogeworCXNwaW5sb2NrX3QJCSpkd2xrID0gJmJwLT5iX3RhcmdldC0+YnRfZGVsd3JpdGVfbG9jazsKIAlpbnQJCQlkZXF1ZXVlZCA9IDA7CiAKLQlzcGluX2xvY2soJnBiZF9kZWx3cml0ZV9sb2NrKTsKLQlpZiAoKHBiLT5wYl9mbGFncyAmIFBCRl9ERUxXUkkpICYmICFsaXN0X2VtcHR5KCZwYi0+cGJfbGlzdCkpIHsKLQkJQVNTRVJUKHBiLT5wYl9mbGFncyAmIF9QQkZfREVMV1JJX1EpOwotCQlsaXN0X2RlbF9pbml0KCZwYi0+cGJfbGlzdCk7CisJc3Bpbl9sb2NrKGR3bGspOworCWlmICgoYnAtPmJfZmxhZ3MgJiBYQkZfREVMV1JJKSAmJiAhbGlzdF9lbXB0eSgmYnAtPmJfbGlzdCkpIHsKKwkJQVNTRVJUKGJwLT5iX2ZsYWdzICYgX1hCRl9ERUxXUklfUSk7CisJCWxpc3RfZGVsX2luaXQoJmJwLT5iX2xpc3QpOwogCQlkZXF1ZXVlZCA9IDE7CiAJfQotCXBiLT5wYl9mbGFncyAmPSB+KFBCRl9ERUxXUkl8X1BCRl9ERUxXUklfUSk7Ci0Jc3Bpbl91bmxvY2soJnBiZF9kZWx3cml0ZV9sb2NrKTsKKwlicC0+Yl9mbGFncyAmPSB+KFhCRl9ERUxXUkl8X1hCRl9ERUxXUklfUSk7CisJc3Bpbl91bmxvY2soZHdsayk7CiAKIAlpZiAoZGVxdWV1ZWQpCi0JCXBhZ2VidWZfcmVsZShwYik7CisJCXhmc19idWZfcmVsZShicCk7CiAKLQlQQl9UUkFDRShwYiwgImRlbHdyaV9kcSIsIChsb25nKWRlcXVldWVkKTsKKwlYQl9UUkFDRShicCwgImRlbHdyaV9kcSIsIChsb25nKWRlcXVldWVkKTsKIH0KIAogU1RBVElDIHZvaWQKLXBhZ2VidWZfcnVuYWxsX3F1ZXVlcygKK3hmc19idWZfcnVuYWxsX3F1ZXVlcygKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAkqcXVldWUpCiB7CiAJZmx1c2hfd29ya3F1ZXVlKHF1ZXVlKTsKIH0KIAotLyogRGVmaW5lcyBmb3IgcGFnZWJ1ZiBkYWVtb24gKi8KLVNUQVRJQyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnhmc2J1ZmRfdGFzazsKLVNUQVRJQyBpbnQgeGZzYnVmZF9mb3JjZV9mbHVzaDsKLVNUQVRJQyBpbnQgeGZzYnVmZF9mb3JjZV9zbGVlcDsKLQogU1RBVElDIGludAogeGZzYnVmZF93YWtldXAoCiAJaW50CQkJcHJpb3JpdHksCiAJZ2ZwX3QJCQltYXNrKQogewotCWlmICh4ZnNidWZkX2ZvcmNlX3NsZWVwKQotCQlyZXR1cm4gMDsKLQl4ZnNidWZkX2ZvcmNlX2ZsdXNoID0gMTsKLQliYXJyaWVyKCk7Ci0Jd2FrZV91cF9wcm9jZXNzKHhmc2J1ZmRfdGFzayk7CisJeGZzX2J1ZnRhcmdfdAkJKmJ0cDsKKworCXNwaW5fbG9jaygmeGZzX2J1ZnRhcmdfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShidHAsICZ4ZnNfYnVmdGFyZ19saXN0LCBidF9saXN0KSB7CisJCWlmICh0ZXN0X2JpdChYQlRfRk9SQ0VfU0xFRVAsICZidHAtPmJ0X2ZsYWdzKSkKKwkJCWNvbnRpbnVlOworCQlzZXRfYml0KFhCVF9GT1JDRV9GTFVTSCwgJmJ0cC0+YnRfZmxhZ3MpOworCQl3YWtlX3VwX3Byb2Nlc3MoYnRwLT5idF90YXNrKTsKKwl9CisJc3Bpbl91bmxvY2soJnhmc19idWZ0YXJnX2xvY2spOwogCXJldHVybiAwOwogfQogCkBAIC0xNzAyLDY3ICsxNjY4LDcwIEBACiB7CiAJc3RydWN0IGxpc3RfaGVhZAl0bXA7CiAJdW5zaWduZWQgbG9uZwkJYWdlOwotCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQ7Ci0JeGZzX2J1Zl90CQkqcGIsICpuOworCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQgPSAoeGZzX2J1ZnRhcmdfdCAqKWRhdGE7CisJeGZzX2J1Zl90CQkqYnAsICpuOworCXN0cnVjdCBsaXN0X2hlYWQJKmR3cSA9ICZ0YXJnZXQtPmJ0X2RlbHdyaXRlX3F1ZXVlOworCXNwaW5sb2NrX3QJCSpkd2xrID0gJnRhcmdldC0+YnRfZGVsd3JpdGVfbG9jazsKIAogCWN1cnJlbnQtPmZsYWdzIHw9IFBGX01FTUFMTE9DOwogCiAJSU5JVF9MSVNUX0hFQUQoJnRtcCk7CiAJZG8gewogCQlpZiAodW5saWtlbHkoZnJlZXppbmcoY3VycmVudCkpKSB7Ci0JCQl4ZnNidWZkX2ZvcmNlX3NsZWVwID0gMTsKKwkJCXNldF9iaXQoWEJUX0ZPUkNFX1NMRUVQLCAmdGFyZ2V0LT5idF9mbGFncyk7CiAJCQlyZWZyaWdlcmF0b3IoKTsKIAkJfSBlbHNlIHsKLQkJCXhmc2J1ZmRfZm9yY2Vfc2xlZXAgPSAwOworCQkJY2xlYXJfYml0KFhCVF9GT1JDRV9TTEVFUCwgJnRhcmdldC0+YnRfZmxhZ3MpOwogCQl9CiAKIAkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKAogCQkJeGZzX2J1Zl90aW1lcl9jZW50aXNlY3MgKiBtc2Vjc190b19qaWZmaWVzKDEwKSk7CiAKIAkJYWdlID0geGZzX2J1Zl9hZ2VfY2VudGlzZWNzICogbXNlY3NfdG9famlmZmllcygxMCk7Ci0JCXNwaW5fbG9jaygmcGJkX2RlbHdyaXRlX2xvY2spOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGIsIG4sICZwYmRfZGVsd3JpdGVfcXVldWUsIHBiX2xpc3QpIHsKLQkJCVBCX1RSQUNFKHBiLCAid2Fsa3ExIiwgKGxvbmcpcGFnZWJ1Zl9pc3BpbihwYikpOwotCQkJQVNTRVJUKHBiLT5wYl9mbGFncyAmIFBCRl9ERUxXUkkpOworCQlzcGluX2xvY2soZHdsayk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShicCwgbiwgZHdxLCBiX2xpc3QpIHsKKwkJCVhCX1RSQUNFKGJwLCAid2Fsa3ExIiwgKGxvbmcpeGZzX2J1Zl9pc3BpbihicCkpOworCQkJQVNTRVJUKGJwLT5iX2ZsYWdzICYgWEJGX0RFTFdSSSk7CiAKLQkJCWlmICghcGFnZWJ1Zl9pc3BpbihwYikgJiYgIXBhZ2VidWZfY29uZF9sb2NrKHBiKSkgewotCQkJCWlmICgheGZzYnVmZF9mb3JjZV9mbHVzaCAmJgorCQkJaWYgKCF4ZnNfYnVmX2lzcGluKGJwKSAmJiAheGZzX2J1Zl9jb25kX2xvY2soYnApKSB7CisJCQkJaWYgKCF0ZXN0X2JpdChYQlRfRk9SQ0VfRkxVU0gsCisJCQkJCQkmdGFyZ2V0LT5idF9mbGFncykgJiYKIAkJCQkgICAgdGltZV9iZWZvcmUoamlmZmllcywKLQkJCQkJCXBiLT5wYl9xdWV1ZXRpbWUgKyBhZ2UpKSB7Ci0JCQkJCXBhZ2VidWZfdW5sb2NrKHBiKTsKKwkJCQkJCWJwLT5iX3F1ZXVldGltZSArIGFnZSkpIHsKKwkJCQkJeGZzX2J1Zl91bmxvY2soYnApOwogCQkJCQlicmVhazsKIAkJCQl9CiAKLQkJCQlwYi0+cGJfZmxhZ3MgJj0gfihQQkZfREVMV1JJfF9QQkZfREVMV1JJX1EpOwotCQkJCXBiLT5wYl9mbGFncyB8PSBQQkZfV1JJVEU7Ci0JCQkJbGlzdF9tb3ZlKCZwYi0+cGJfbGlzdCwgJnRtcCk7CisJCQkJYnAtPmJfZmxhZ3MgJj0gfihYQkZfREVMV1JJfF9YQkZfREVMV1JJX1EpOworCQkJCWJwLT5iX2ZsYWdzIHw9IFhCRl9XUklURTsKKwkJCQlsaXN0X21vdmUoJmJwLT5iX2xpc3QsICZ0bXApOwogCQkJfQogCQl9Ci0JCXNwaW5fdW5sb2NrKCZwYmRfZGVsd3JpdGVfbG9jayk7CisJCXNwaW5fdW5sb2NrKGR3bGspOwogCiAJCXdoaWxlICghbGlzdF9lbXB0eSgmdG1wKSkgewotCQkJcGIgPSBsaXN0X2VudHJ5KHRtcC5uZXh0LCB4ZnNfYnVmX3QsIHBiX2xpc3QpOwotCQkJdGFyZ2V0ID0gcGItPnBiX3RhcmdldDsKKwkJCWJwID0gbGlzdF9lbnRyeSh0bXAubmV4dCwgeGZzX2J1Zl90LCBiX2xpc3QpOworCQkJQVNTRVJUKHRhcmdldCA9PSBicC0+Yl90YXJnZXQpOwogCi0JCQlsaXN0X2RlbF9pbml0KCZwYi0+cGJfbGlzdCk7Ci0JCQlwYWdlYnVmX2lvc3RyYXRlZ3kocGIpOworCQkJbGlzdF9kZWxfaW5pdCgmYnAtPmJfbGlzdCk7CisJCQl4ZnNfYnVmX2lvc3RyYXRlZ3koYnApOwogCi0JCQlibGtfcnVuX2FkZHJlc3Nfc3BhY2UodGFyZ2V0LT5wYnJfbWFwcGluZyk7CisJCQlibGtfcnVuX2FkZHJlc3Nfc3BhY2UodGFyZ2V0LT5idF9tYXBwaW5nKTsKIAkJfQogCiAJCWlmIChhc19saXN0X2xlbiA+IDApCiAJCQlwdXJnZV9hZGRyZXNzZXMoKTsKIAotCQl4ZnNidWZkX2ZvcmNlX2ZsdXNoID0gMDsKKwkJY2xlYXJfYml0KFhCVF9GT1JDRV9GTFVTSCwgJnRhcmdldC0+YnRfZmxhZ3MpOwogCX0gd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOwogCiAJcmV0dXJuIDA7CiB9CiAKIC8qCi0gKiBHbyB0aHJvdWdoIGFsbCBpbmNvcmUgYnVmZmVycywgYW5kIHJlbGVhc2UgYnVmZmVycyBpZiB0aGV5IGJlbG9uZyB0bwotICogdGhlIGdpdmVuIGRldmljZS4gVGhpcyBpcyB1c2VkIGluIGZpbGVzeXN0ZW0gZXJyb3IgaGFuZGxpbmcgdG8KLSAqIHByZXNlcnZlIHRoZSBjb25zaXN0ZW5jeSBvZiBpdHMgbWV0YWRhdGEuCisgKglHbyB0aHJvdWdoIGFsbCBpbmNvcmUgYnVmZmVycywgYW5kIHJlbGVhc2UgYnVmZmVycyBpZiB0aGV5IGJlbG9uZyB0bworICoJdGhlIGdpdmVuIGRldmljZS4gVGhpcyBpcyB1c2VkIGluIGZpbGVzeXN0ZW0gZXJyb3IgaGFuZGxpbmcgdG8KKyAqCXByZXNlcnZlIHRoZSBjb25zaXN0ZW5jeSBvZiBpdHMgbWV0YWRhdGEuCiAgKi8KIGludAogeGZzX2ZsdXNoX2J1ZnRhcmcoCkBAIC0xNzcwLDczICsxNzM5LDcyIEBACiAJaW50CQkJd2FpdCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXRtcDsKLQl4ZnNfYnVmX3QJCSpwYiwgKm47CisJeGZzX2J1Zl90CQkqYnAsICpuOwogCWludAkJCXBpbmNvdW50ID0gMDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCSpkd3EgPSAmdGFyZ2V0LT5idF9kZWx3cml0ZV9xdWV1ZTsKKwlzcGlubG9ja190CQkqZHdsayA9ICZ0YXJnZXQtPmJ0X2RlbHdyaXRlX2xvY2s7CiAKLQlwYWdlYnVmX3J1bmFsbF9xdWV1ZXMoeGZzZGF0YWRfd29ya3F1ZXVlKTsKLQlwYWdlYnVmX3J1bmFsbF9xdWV1ZXMoeGZzbG9nZF93b3JrcXVldWUpOworCXhmc19idWZfcnVuYWxsX3F1ZXVlcyh4ZnNkYXRhZF93b3JrcXVldWUpOworCXhmc19idWZfcnVuYWxsX3F1ZXVlcyh4ZnNsb2dkX3dvcmtxdWV1ZSk7CiAKIAlJTklUX0xJU1RfSEVBRCgmdG1wKTsKLQlzcGluX2xvY2soJnBiZF9kZWx3cml0ZV9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGIsIG4sICZwYmRfZGVsd3JpdGVfcXVldWUsIHBiX2xpc3QpIHsKLQotCQlpZiAocGItPnBiX3RhcmdldCAhPSB0YXJnZXQpCi0JCQljb250aW51ZTsKLQotCQlBU1NFUlQocGItPnBiX2ZsYWdzICYgKFBCRl9ERUxXUkl8X1BCRl9ERUxXUklfUSkpOwotCQlQQl9UUkFDRShwYiwgIndhbGtxMiIsIChsb25nKXBhZ2VidWZfaXNwaW4ocGIpKTsKLQkJaWYgKHBhZ2VidWZfaXNwaW4ocGIpKSB7CisJc3Bpbl9sb2NrKGR3bGspOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShicCwgbiwgZHdxLCBiX2xpc3QpIHsKKwkJQVNTRVJUKGJwLT5iX3RhcmdldCA9PSB0YXJnZXQpOworCQlBU1NFUlQoYnAtPmJfZmxhZ3MgJiAoWEJGX0RFTFdSSSB8IF9YQkZfREVMV1JJX1EpKTsKKwkJWEJfVFJBQ0UoYnAsICJ3YWxrcTIiLCAobG9uZyl4ZnNfYnVmX2lzcGluKGJwKSk7CisJCWlmICh4ZnNfYnVmX2lzcGluKGJwKSkgewogCQkJcGluY291bnQrKzsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJbGlzdF9tb3ZlKCZwYi0+cGJfbGlzdCwgJnRtcCk7CisJCWxpc3RfbW92ZSgmYnAtPmJfbGlzdCwgJnRtcCk7CiAJfQotCXNwaW5fdW5sb2NrKCZwYmRfZGVsd3JpdGVfbG9jayk7CisJc3Bpbl91bmxvY2soZHdsayk7CiAKIAkvKgogCSAqIERyb3BwZWQgdGhlIGRlbGF5ZWQgd3JpdGUgbGlzdCBsb2NrLCBub3cgd2FsayB0aGUgdGVtcG9yYXJ5IGxpc3QKIAkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGIsIG4sICZ0bXAsIHBiX2xpc3QpIHsKLQkJcGFnZWJ1Zl9sb2NrKHBiKTsKLQkJcGItPnBiX2ZsYWdzICY9IH4oUEJGX0RFTFdSSXxfUEJGX0RFTFdSSV9RKTsKLQkJcGItPnBiX2ZsYWdzIHw9IFBCRl9XUklURTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnAsIG4sICZ0bXAsIGJfbGlzdCkgeworCQl4ZnNfYnVmX2xvY2soYnApOworCQlicC0+Yl9mbGFncyAmPSB+KFhCRl9ERUxXUkl8X1hCRl9ERUxXUklfUSk7CisJCWJwLT5iX2ZsYWdzIHw9IFhCRl9XUklURTsKIAkJaWYgKHdhaXQpCi0JCQlwYi0+cGJfZmxhZ3MgJj0gflBCRl9BU1lOQzsKKwkJCWJwLT5iX2ZsYWdzICY9IH5YQkZfQVNZTkM7CiAJCWVsc2UKLQkJCWxpc3RfZGVsX2luaXQoJnBiLT5wYl9saXN0KTsKKwkJCWxpc3RfZGVsX2luaXQoJmJwLT5iX2xpc3QpOwogCi0JCXBhZ2VidWZfaW9zdHJhdGVneShwYik7CisJCXhmc19idWZfaW9zdHJhdGVneShicCk7CiAJfQogCiAJLyoKIAkgKiBSZW1haW5pbmcgbGlzdCBpdGVtcyBtdXN0IGJlIGZsdXNoZWQgYmVmb3JlIHJldHVybmluZwogCSAqLwogCXdoaWxlICghbGlzdF9lbXB0eSgmdG1wKSkgewotCQlwYiA9IGxpc3RfZW50cnkodG1wLm5leHQsIHhmc19idWZfdCwgcGJfbGlzdCk7CisJCWJwID0gbGlzdF9lbnRyeSh0bXAubmV4dCwgeGZzX2J1Zl90LCBiX2xpc3QpOwogCi0JCWxpc3RfZGVsX2luaXQoJnBiLT5wYl9saXN0KTsKLQkJeGZzX2lvd2FpdChwYik7Ci0JCXhmc19idWZfcmVsc2UocGIpOworCQlsaXN0X2RlbF9pbml0KCZicC0+Yl9saXN0KTsKKwkJeGZzX2lvd2FpdChicCk7CisJCXhmc19idWZfcmVsc2UoYnApOwogCX0KIAogCWlmICh3YWl0KQotCQlibGtfcnVuX2FkZHJlc3Nfc3BhY2UodGFyZ2V0LT5wYnJfbWFwcGluZyk7CisJCWJsa19ydW5fYWRkcmVzc19zcGFjZSh0YXJnZXQtPmJ0X21hcHBpbmcpOwogCiAJcmV0dXJuIHBpbmNvdW50OwogfQogCiBpbnQgX19pbml0Ci1wYWdlYnVmX2luaXQodm9pZCkKK3hmc19idWZfaW5pdCh2b2lkKQogewogCWludAkJZXJyb3IgPSAtRU5PTUVNOwogCi0jaWZkZWYgUEFHRUJVRl9UUkFDRQotCXBhZ2VidWZfdHJhY2VfYnVmID0ga3RyYWNlX2FsbG9jKFBBR0VCVUZfVFJBQ0VfU0laRSwgS01fU0xFRVApOworI2lmZGVmIFhGU19CVUZfVFJBQ0UKKwl4ZnNfYnVmX3RyYWNlX2J1ZiA9IGt0cmFjZV9hbGxvYyhYRlNfQlVGX1RSQUNFX1NJWkUsIEtNX1NMRUVQKTsKICNlbmRpZgogCi0JcGFnZWJ1Zl96b25lID0ga21lbV96b25lX2luaXQoc2l6ZW9mKHhmc19idWZfdCksICJ4ZnNfYnVmIik7Ci0JaWYgKCFwYWdlYnVmX3pvbmUpCisJeGZzX2J1Zl96b25lID0ga21lbV96b25lX2luaXQoc2l6ZW9mKHhmc19idWZfdCksICJ4ZnNfYnVmIik7CisJaWYgKCF4ZnNfYnVmX3pvbmUpCiAJCWdvdG8gb3V0X2ZyZWVfdHJhY2VfYnVmOwogCiAJeGZzbG9nZF93b3JrcXVldWUgPSBjcmVhdGVfd29ya3F1ZXVlKCJ4ZnNsb2dkIik7CkBAIC0xODQ3LDQyICsxODE1LDMzIEBACiAJaWYgKCF4ZnNkYXRhZF93b3JrcXVldWUpCiAJCWdvdG8gb3V0X2Rlc3Ryb3lfeGZzbG9nZF93b3JrcXVldWU7CiAKLQl4ZnNidWZkX3Rhc2sgPSBrdGhyZWFkX3J1bih4ZnNidWZkLCBOVUxMLCAieGZzYnVmZCIpOwotCWlmIChJU19FUlIoeGZzYnVmZF90YXNrKSkgewotCQllcnJvciA9IFBUUl9FUlIoeGZzYnVmZF90YXNrKTsKKwl4ZnNfYnVmX3NoYWtlID0ga21lbV9zaGFrZV9yZWdpc3Rlcih4ZnNidWZkX3dha2V1cCk7CisJaWYgKCF4ZnNfYnVmX3NoYWtlKQogCQlnb3RvIG91dF9kZXN0cm95X3hmc2RhdGFkX3dvcmtxdWV1ZTsKLQl9Ci0KLQlwYWdlYnVmX3NoYWtlID0ga21lbV9zaGFrZV9yZWdpc3Rlcih4ZnNidWZkX3dha2V1cCk7Ci0JaWYgKCFwYWdlYnVmX3NoYWtlKQotCQlnb3RvIG91dF9zdG9wX3hmc2J1ZmQ7CiAKIAlyZXR1cm4gMDsKIAotIG91dF9zdG9wX3hmc2J1ZmQ6Ci0Ja3RocmVhZF9zdG9wKHhmc2J1ZmRfdGFzayk7CiAgb3V0X2Rlc3Ryb3lfeGZzZGF0YWRfd29ya3F1ZXVlOgogCWRlc3Ryb3lfd29ya3F1ZXVlKHhmc2RhdGFkX3dvcmtxdWV1ZSk7CiAgb3V0X2Rlc3Ryb3lfeGZzbG9nZF93b3JrcXVldWU6CiAJZGVzdHJveV93b3JrcXVldWUoeGZzbG9nZF93b3JrcXVldWUpOwogIG91dF9mcmVlX2J1Zl96b25lOgotCWttZW1fem9uZV9kZXN0cm95KHBhZ2VidWZfem9uZSk7CisJa21lbV96b25lX2Rlc3Ryb3koeGZzX2J1Zl96b25lKTsKICBvdXRfZnJlZV90cmFjZV9idWY6Ci0jaWZkZWYgUEFHRUJVRl9UUkFDRQotCWt0cmFjZV9mcmVlKHBhZ2VidWZfdHJhY2VfYnVmKTsKKyNpZmRlZiBYRlNfQlVGX1RSQUNFCisJa3RyYWNlX2ZyZWUoeGZzX2J1Zl90cmFjZV9idWYpOwogI2VuZGlmCiAJcmV0dXJuIGVycm9yOwogfQogCiB2b2lkCi1wYWdlYnVmX3Rlcm1pbmF0ZSh2b2lkKQoreGZzX2J1Zl90ZXJtaW5hdGUodm9pZCkKIHsKLQlrbWVtX3NoYWtlX2RlcmVnaXN0ZXIocGFnZWJ1Zl9zaGFrZSk7Ci0Ja3RocmVhZF9zdG9wKHhmc2J1ZmRfdGFzayk7CisJa21lbV9zaGFrZV9kZXJlZ2lzdGVyKHhmc19idWZfc2hha2UpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKHhmc2RhdGFkX3dvcmtxdWV1ZSk7CiAJZGVzdHJveV93b3JrcXVldWUoeGZzbG9nZF93b3JrcXVldWUpOwotCWttZW1fem9uZV9kZXN0cm95KHBhZ2VidWZfem9uZSk7Ci0jaWZkZWYgUEFHRUJVRl9UUkFDRQotCWt0cmFjZV9mcmVlKHBhZ2VidWZfdHJhY2VfYnVmKTsKKwlrbWVtX3pvbmVfZGVzdHJveSh4ZnNfYnVmX3pvbmUpOworI2lmZGVmIFhGU19CVUZfVFJBQ0UKKwlrdHJhY2VfZnJlZSh4ZnNfYnVmX3RyYWNlX2J1Zik7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKaW5kZXggMjM3YTM1Yi4uNGRkNjU5MiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKQEAgLTMyLDQ0ICszMiw0NyBAQAogICoJQmFzZSB0eXBlcwogICovCiAKLSNkZWZpbmUgWEZTX0JVRl9EQUREUl9OVUxMICgoeGZzX2RhZGRyX3QpICgtMUxMKSkKKyNkZWZpbmUgWEZTX0JVRl9EQUREUl9OVUxMCSgoeGZzX2RhZGRyX3QpICgtMUxMKSkKIAotI2RlZmluZSBwYWdlX2J1Zl9jdG9iKHBwKQkoKHBwKSAqIFBBR0VfQ0FDSEVfU0laRSkKLSNkZWZpbmUgcGFnZV9idWZfYnRvYyhkZCkJKCgoZGQpICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVCkKLSNkZWZpbmUgcGFnZV9idWZfYnRvY3QoZGQpCSgoZGQpID4+IFBBR0VfQ0FDSEVfU0hJRlQpCi0jZGVmaW5lIHBhZ2VfYnVmX3BvZmYoYWEpCSgoYWEpICYgflBBR0VfQ0FDSEVfTUFTSykKKyNkZWZpbmUgeGZzX2J1Zl9jdG9iKHBwKQkoKHBwKSAqIFBBR0VfQ0FDSEVfU0laRSkKKyNkZWZpbmUgeGZzX2J1Zl9idG9jKGRkKQkoKChkZCkgKyBQQUdFX0NBQ0hFX1NJWkUtMSkgPj4gUEFHRV9DQUNIRV9TSElGVCkKKyNkZWZpbmUgeGZzX2J1Zl9idG9jdChkZCkJKChkZCkgPj4gUEFHRV9DQUNIRV9TSElGVCkKKyNkZWZpbmUgeGZzX2J1Zl9wb2ZmKGFhKQkoKGFhKSAmIH5QQUdFX0NBQ0hFX01BU0spCiAKLXR5cGVkZWYgZW51bSBwYWdlX2J1Zl9yd19lIHsKLQlQQlJXX1JFQUQgPSAxLAkJCS8qIHRyYW5zZmVyIGludG8gdGFyZ2V0IG1lbW9yeSAqLwotCVBCUldfV1JJVEUgPSAyLAkJCS8qIHRyYW5zZmVyIGZyb20gdGFyZ2V0IG1lbW9yeSAqLwotCVBCUldfWkVSTyA9IDMJCQkvKiBaZXJvIHRhcmdldCBtZW1vcnkgKi8KLX0gcGFnZV9idWZfcndfdDsKK3R5cGVkZWYgZW51bSB7CisJWEJSV19SRUFEID0gMSwJCQkvKiB0cmFuc2ZlciBpbnRvIHRhcmdldCBtZW1vcnkgKi8KKwlYQlJXX1dSSVRFID0gMiwJCQkvKiB0cmFuc2ZlciBmcm9tIHRhcmdldCBtZW1vcnkgKi8KKwlYQlJXX1pFUk8gPSAzLAkJCS8qIFplcm8gdGFyZ2V0IG1lbW9yeSAqLworfSB4ZnNfYnVmX3J3X3Q7CiAKLQotdHlwZWRlZiBlbnVtIHBhZ2VfYnVmX2ZsYWdzX2UgewkJLyogcGJfZmxhZ3MgdmFsdWVzICovCi0JUEJGX1JFQUQgPSAoMSA8PCAwKSwJLyogYnVmZmVyIGludGVuZGVkIGZvciByZWFkaW5nIGZyb20gZGV2aWNlICovCi0JUEJGX1dSSVRFID0gKDEgPDwgMSksCS8qIGJ1ZmZlciBpbnRlbmRlZCBmb3Igd3JpdGluZyB0byBkZXZpY2UgICAqLwotCVBCRl9NQVBQRUQgPSAoMSA8PCAyKSwgIC8qIGJ1ZmZlciBtYXBwZWQgKHBiX2FkZHIgdmFsaWQpICAgICAgICAgICAqLwotCVBCRl9BU1lOQyA9ICgxIDw8IDQpLCAgIC8qIGluaXRpYXRvciB3aWxsIG5vdCB3YWl0IGZvciBjb21wbGV0aW9uICAqLwotCVBCRl9ET05FID0gKDEgPDwgNSksICAgIC8qIGFsbCBwYWdlcyBpbiB0aGUgYnVmZmVyIHVwdG9kYXRlCSAgICovCi0JUEJGX0RFTFdSSSA9ICgxIDw8IDYpLCAgLyogYnVmZmVyIGhhcyBkaXJ0eSBwYWdlcyAgICAgICAgICAgICAgICAgICovCi0JUEJGX1NUQUxFID0gKDEgPDwgNyksCS8qIGJ1ZmZlciBoYXMgYmVlbiBzdGFsZWQsIGRvIG5vdCBmaW5kIGl0ICAqLwotCVBCRl9GU19NQU5BR0VEID0gKDEgPDwgOCksICAvKiBmaWxlc3lzdGVtIGNvbnRyb2xzIGZyZWVpbmcgbWVtb3J5ICAqLwotIAlQQkZfT1JERVJFRCA9ICgxIDw8IDExKSwgICAgLyogdXNlIG9yZGVyZWQgd3JpdGVzCQkgICAqLwotCVBCRl9SRUFEX0FIRUFEID0gKDEgPDwgMTIpLCAvKiBhc3luY2hyb25vdXMgcmVhZC1haGVhZAkJICAgKi8KK3R5cGVkZWYgZW51bSB7CisJWEJGX1JFQUQgPSAoMSA8PCAwKSwJLyogYnVmZmVyIGludGVuZGVkIGZvciByZWFkaW5nIGZyb20gZGV2aWNlICovCisJWEJGX1dSSVRFID0gKDEgPDwgMSksCS8qIGJ1ZmZlciBpbnRlbmRlZCBmb3Igd3JpdGluZyB0byBkZXZpY2UgICAqLworCVhCRl9NQVBQRUQgPSAoMSA8PCAyKSwgIC8qIGJ1ZmZlciBtYXBwZWQgKGJfYWRkciB2YWxpZCkgICAgICAgICAgICAqLworCVhCRl9BU1lOQyA9ICgxIDw8IDQpLCAgIC8qIGluaXRpYXRvciB3aWxsIG5vdCB3YWl0IGZvciBjb21wbGV0aW9uICAqLworCVhCRl9ET05FID0gKDEgPDwgNSksICAgIC8qIGFsbCBwYWdlcyBpbiB0aGUgYnVmZmVyIHVwdG9kYXRlCSAgICovCisJWEJGX0RFTFdSSSA9ICgxIDw8IDYpLCAgLyogYnVmZmVyIGhhcyBkaXJ0eSBwYWdlcyAgICAgICAgICAgICAgICAgICovCisJWEJGX1NUQUxFID0gKDEgPDwgNyksCS8qIGJ1ZmZlciBoYXMgYmVlbiBzdGFsZWQsIGRvIG5vdCBmaW5kIGl0ICAqLworCVhCRl9GU19NQU5BR0VEID0gKDEgPDwgOCksICAvKiBmaWxlc3lzdGVtIGNvbnRyb2xzIGZyZWVpbmcgbWVtb3J5ICAqLworIAlYQkZfT1JERVJFRCA9ICgxIDw8IDExKSwgICAgLyogdXNlIG9yZGVyZWQgd3JpdGVzCQkgICAqLworCVhCRl9SRUFEX0FIRUFEID0gKDEgPDwgMTIpLCAvKiBhc3luY2hyb25vdXMgcmVhZC1haGVhZAkJICAgKi8KIAogCS8qIGZsYWdzIHVzZWQgb25seSBhcyBhcmd1bWVudHMgdG8gYWNjZXNzIHJvdXRpbmVzICovCi0JUEJGX0xPQ0sgPSAoMSA8PCAxNCksICAgICAgIC8qIGxvY2sgcmVxdWVzdGVkCQkJICAgKi8KLQlQQkZfVFJZTE9DSyA9ICgxIDw8IDE1KSwgICAgLyogbG9jayByZXF1ZXN0ZWQsIGJ1dCBkbyBub3Qgd2FpdAkgICAqLwotCVBCRl9ET05UX0JMT0NLID0gKDEgPDwgMTYpLCAvKiBkbyBub3QgYmxvY2sgaW4gY3VycmVudCB0aHJlYWQJICAgKi8KKwlYQkZfTE9DSyA9ICgxIDw8IDE0KSwgICAgICAgLyogbG9jayByZXF1ZXN0ZWQJCQkgICAqLworCVhCRl9UUllMT0NLID0gKDEgPDwgMTUpLCAgICAvKiBsb2NrIHJlcXVlc3RlZCwgYnV0IGRvIG5vdCB3YWl0CSAgICovCisJWEJGX0RPTlRfQkxPQ0sgPSAoMSA8PCAxNiksIC8qIGRvIG5vdCBibG9jayBpbiBjdXJyZW50IHRocmVhZAkgICAqLwogCiAJLyogZmxhZ3MgdXNlZCBvbmx5IGludGVybmFsbHkgKi8KLQlfUEJGX1BBR0VfQ0FDSEUgPSAoMSA8PCAxNyksLyogYmFja2VkIGJ5IHBhZ2VjYWNoZQkJICAgKi8KLQlfUEJGX0tNRU1fQUxMT0MgPSAoMSA8PCAxOCksLyogYmFja2VkIGJ5IGttZW1fYWxsb2MoKQkJICAgKi8KLQlfUEJGX1JVTl9RVUVVRVMgPSAoMSA8PCAxOSksLyogcnVuIGJsb2NrIGRldmljZSB0YXNrIHF1ZXVlCSAgICovCi0JX1BCRl9ERUxXUklfUSA9ICgxIDw8IDIxKSwgICAvKiBidWZmZXIgb24gZGVsd3JpIHF1ZXVlCQkgICAqLwotfSBwYWdlX2J1Zl9mbGFnc190OworCV9YQkZfUEFHRV9DQUNIRSA9ICgxIDw8IDE3KSwvKiBiYWNrZWQgYnkgcGFnZWNhY2hlCQkgICAqLworCV9YQkZfS01FTV9BTExPQyA9ICgxIDw8IDE4KSwvKiBiYWNrZWQgYnkga21lbV9hbGxvYygpCQkgICAqLworCV9YQkZfUlVOX1FVRVVFUyA9ICgxIDw8IDE5KSwvKiBydW4gYmxvY2sgZGV2aWNlIHRhc2sgcXVldWUJICAgKi8KKwlfWEJGX0RFTFdSSV9RID0gKDEgPDwgMjEpLCAgIC8qIGJ1ZmZlciBvbiBkZWx3cmkgcXVldWUJCSAgICovCit9IHhmc19idWZfZmxhZ3NfdDsKIAordHlwZWRlZiBlbnVtIHsKKwlYQlRfRk9SQ0VfU0xFRVAgPSAoMCA8PCAxKSwKKwlYQlRfRk9SQ0VfRkxVU0ggPSAoMSA8PCAxKSwKK30geGZzX2J1ZnRhcmdfZmxhZ3NfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgeGZzX2J1Zmhhc2ggewogCXN0cnVjdCBsaXN0X2hlYWQJYmhfbGlzdDsKQEAgLTc3LDQ3NyArODAsMzUwIEBACiB9IHhmc19idWZoYXNoX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHhmc19idWZ0YXJnIHsKLQlkZXZfdAkJCXBicl9kZXY7Ci0Jc3RydWN0IGJsb2NrX2RldmljZQkqcGJyX2JkZXY7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UJKnBicl9tYXBwaW5nOwotCXVuc2lnbmVkIGludAkJcGJyX2JzaXplOwotCXVuc2lnbmVkIGludAkJcGJyX3NzaGlmdDsKLQlzaXplX3QJCQlwYnJfc21hc2s7CisJZGV2X3QJCQlidF9kZXY7CisJc3RydWN0IGJsb2NrX2RldmljZQkqYnRfYmRldjsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZQkqYnRfbWFwcGluZzsKKwl1bnNpZ25lZCBpbnQJCWJ0X2JzaXplOworCXVuc2lnbmVkIGludAkJYnRfc3NoaWZ0OworCXNpemVfdAkJCWJ0X3NtYXNrOwogCi0JLyogcGVyLWRldmljZSBidWZmZXIgaGFzaCB0YWJsZSAqLworCS8qIHBlciBkZXZpY2UgYnVmZmVyIGhhc2ggdGFibGUgKi8KIAl1aW50CQkJYnRfaGFzaG1hc2s7CiAJdWludAkJCWJ0X2hhc2hzaGlmdDsKIAl4ZnNfYnVmaGFzaF90CQkqYnRfaGFzaDsKKworCS8qIHBlciBkZXZpY2UgZGVsd3JpIHF1ZXVlICovCisJc3RydWN0IHRhc2tfc3RydWN0CSpidF90YXNrOworCXN0cnVjdCBsaXN0X2hlYWQJYnRfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWJ0X2RlbHdyaXRlX3F1ZXVlOworCXNwaW5sb2NrX3QJCWJ0X2RlbHdyaXRlX2xvY2s7CisJdW5zaWduZWQgbG9uZwkJYnRfZmxhZ3M7CiB9IHhmc19idWZ0YXJnX3Q7CiAKIC8qCi0gKgl4ZnNfYnVmX3Q6ICBCdWZmZXIgc3RydWN0dXJlIGZvciBwYWdlIGNhY2hlLWJhc2VkIGJ1ZmZlcnMKKyAqCXhmc19idWZfdDogIEJ1ZmZlciBzdHJ1Y3R1cmUgZm9yIHBhZ2VjYWNoZS1iYXNlZCBidWZmZXJzCiAgKgotICogVGhpcyBidWZmZXIgc3RydWN0dXJlIGlzIHVzZWQgYnkgdGhlIHBhZ2UgY2FjaGUgYnVmZmVyIG1hbmFnZW1lbnQgcm91dGluZXMKLSAqIHRvIHJlZmVyIHRvIGFuIGFzc2VtYmx5IG9mIHBhZ2VzIGZvcm1pbmcgYSBsb2dpY2FsIGJ1ZmZlci4gIFRoZSBhY3R1YWwgSS9PCi0gKiBpcyBwZXJmb3JtZWQgd2l0aCBidWZmZXJfaGVhZCBzdHJ1Y3R1cmVzLCBhcyByZXF1aXJlZCBieSBkcml2ZXJzLgotICogCi0gKiBUaGUgYnVmZmVyIHN0cnVjdHVyZSBpcyB1c2VkIG9uIHRlbXBvcmFyeSBiYXNpcyBvbmx5LCBhbmQgZGlzY2FyZGVkIHdoZW4KLSAqIHJlbGVhc2VkLiAgVGhlIHJlYWwgZGF0YSBzdG9yYWdlIGlzIHJlY29yZGVkIGluIHRoZSBwYWdlIGNhY2hlLiAgTWV0YWRhdGEgaXMKKyAqIFRoaXMgYnVmZmVyIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IHRoZSBwYWdlY2FjaGUgYnVmZmVyIG1hbmFnZW1lbnQgcm91dGluZXMKKyAqIHRvIHJlZmVyIHRvIGFuIGFzc2VtYmx5IG9mIHBhZ2VzIGZvcm1pbmcgYSBsb2dpY2FsIGJ1ZmZlci4KKyAqCisgKiBUaGUgYnVmZmVyIHN0cnVjdHVyZSBpcyB1c2VkIG9uIGEgdGVtcG9yYXJ5IGJhc2lzIG9ubHksIGFuZCBkaXNjYXJkZWQgd2hlbgorICogcmVsZWFzZWQuICBUaGUgcmVhbCBkYXRhIHN0b3JhZ2UgaXMgcmVjb3JkZWQgaW4gdGhlIHBhZ2VjYWNoZS4gQnVmZmVycyBhcmUKICAqIGhhc2hlZCB0byB0aGUgYmxvY2sgZGV2aWNlIG9uIHdoaWNoIHRoZSBmaWxlIHN5c3RlbSByZXNpZGVzLgogICovCiAKIHN0cnVjdCB4ZnNfYnVmOwordHlwZWRlZiB2b2lkICgqeGZzX2J1Zl9pb2RvbmVfdCkoc3RydWN0IHhmc19idWYgKik7Cit0eXBlZGVmIHZvaWQgKCp4ZnNfYnVmX3JlbHNlX3QpKHN0cnVjdCB4ZnNfYnVmICopOwordHlwZWRlZiBpbnQgKCp4ZnNfYnVmX2Jkc3RyYXRfdCkoc3RydWN0IHhmc19idWYgKik7CiAKLS8qIGNhbGwtYmFjayBmdW5jdGlvbiBvbiBJL08gY29tcGxldGlvbiAqLwotdHlwZWRlZiB2b2lkICgqcGFnZV9idWZfaW9kb25lX3QpKHN0cnVjdCB4ZnNfYnVmICopOwotLyogY2FsbC1iYWNrIGZ1bmN0aW9uIG9uIEkvTyBjb21wbGV0aW9uICovCi10eXBlZGVmIHZvaWQgKCpwYWdlX2J1Zl9yZWxzZV90KShzdHJ1Y3QgeGZzX2J1ZiAqKTsKLS8qIHByZS13cml0ZSBmdW5jdGlvbiAqLwotdHlwZWRlZiBpbnQgKCpwYWdlX2J1Zl9iZHN0cmF0X3QpKHN0cnVjdCB4ZnNfYnVmICopOwotCi0jZGVmaW5lIFBCX1BBR0VTCTIKKyNkZWZpbmUgWEJfUEFHRVMJMgogCiB0eXBlZGVmIHN0cnVjdCB4ZnNfYnVmIHsKLQlzdHJ1Y3Qgc2VtYXBob3JlCXBiX3NlbWE7CS8qIHNlbWFwaG9yZSBmb3IgbG9ja2FibGVzICAqLwotCXVuc2lnbmVkIGxvbmcJCXBiX3F1ZXVldGltZTsJLyogdGltZSBidWZmZXIgd2FzIHF1ZXVlZCAgICovCi0JYXRvbWljX3QJCXBiX3Bpbl9jb3VudDsJLyogcGluIGNvdW50CQkgICAgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdAlwYl93YWl0ZXJzOwkvKiB1bnBpbiB3YWl0ZXJzCSAgICAqLwotCXN0cnVjdCBsaXN0X2hlYWQJcGJfbGlzdDsKLQlwYWdlX2J1Zl9mbGFnc190CXBiX2ZsYWdzOwkvKiBzdGF0dXMgZmxhZ3MgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXBiX2hhc2hfbGlzdDsJLyogaGFzaCB0YWJsZSBsaXN0ICovCi0JeGZzX2J1Zmhhc2hfdAkJKnBiX2hhc2g7CS8qIGhhc2ggdGFibGUgbGlzdCBzdGFydCAqLwotCXhmc19idWZ0YXJnX3QJCSpwYl90YXJnZXQ7CS8qIGJ1ZmZlciB0YXJnZXQgKGRldmljZSkgKi8KLQlhdG9taWNfdAkJcGJfaG9sZDsJLyogcmVmZXJlbmNlIGNvdW50ICovCi0JeGZzX2RhZGRyX3QJCXBiX2JuOwkJLyogYmxvY2sgbnVtYmVyIGZvciBJL08gKi8KLQlsb2ZmX3QJCQlwYl9maWxlX29mZnNldDsJLyogb2Zmc2V0IGluIGZpbGUgKi8KLQlzaXplX3QJCQlwYl9idWZmZXJfbGVuZ3RoOyAvKiBzaXplIG9mIGJ1ZmZlciBpbiBieXRlcyAqLwotCXNpemVfdAkJCXBiX2NvdW50X2Rlc2lyZWQ7IC8qIGRlc2lyZWQgdHJhbnNmZXIgc2l6ZSAqLwotCXZvaWQJCQkqcGJfYWRkcjsJLyogdmlydHVhbCBhZGRyZXNzIG9mIGJ1ZmZlciAqLwotCXN0cnVjdCB3b3JrX3N0cnVjdAlwYl9pb2RvbmVfd29yazsKLQlhdG9taWNfdAkJcGJfaW9fcmVtYWluaW5nOy8qICNvdXRzdGFuZGluZyBJL08gcmVxdWVzdHMgKi8KLQlwYWdlX2J1Zl9pb2RvbmVfdAlwYl9pb2RvbmU7CS8qIEkvTyBjb21wbGV0aW9uIGZ1bmN0aW9uICovCi0JcGFnZV9idWZfcmVsc2VfdAlwYl9yZWxzZTsJLyogcmVsZWFzaW5nIGZ1bmN0aW9uICovCi0JcGFnZV9idWZfYmRzdHJhdF90CXBiX3N0cmF0OwkvKiBwcmUtd3JpdGUgZnVuY3Rpb24gKi8KLQlzdHJ1Y3Qgc2VtYXBob3JlCXBiX2lvZG9uZXNlbWE7CS8qIFNlbWFwaG9yZSBmb3IgSS9PIHdhaXRlcnMgKi8KLQl2b2lkCQkJKnBiX2ZzcHJpdjsKLQl2b2lkCQkJKnBiX2ZzcHJpdjI7Ci0Jdm9pZAkJCSpwYl9mc3ByaXYzOwotCXVuc2lnbmVkIHNob3J0CQlwYl9lcnJvcjsJLyogZXJyb3IgY29kZSBvbiBJL08gKi8KLSAJdW5zaWduZWQgc2hvcnQJCXBiX2xvY2tlZDsJLyogcGFnZSBhcnJheSBpcyBsb2NrZWQgKi8KLSAJdW5zaWduZWQgaW50CQlwYl9wYWdlX2NvdW50OwkvKiBzaXplIG9mIHBhZ2UgYXJyYXkgKi8KLQl1bnNpZ25lZCBpbnQJCXBiX29mZnNldDsJLyogcGFnZSBvZmZzZXQgaW4gZmlyc3QgcGFnZSAqLwotCXN0cnVjdCBwYWdlCQkqKnBiX3BhZ2VzOwkvKiBhcnJheSBvZiBwYWdlIHBvaW50ZXJzICovCi0Jc3RydWN0IHBhZ2UJCSpwYl9wYWdlX2FycmF5W1BCX1BBR0VTXTsgLyogaW5saW5lIHBhZ2VzICovCi0jaWZkZWYgUEFHRUJVRl9MT0NLX1RSQUNLSU5HCi0JaW50CQkJcGJfbGFzdF9ob2xkZXI7CisJc3RydWN0IHNlbWFwaG9yZQliX3NlbWE7CQkvKiBzZW1hcGhvcmUgZm9yIGxvY2thYmxlcyAqLworCXVuc2lnbmVkIGxvbmcJCWJfcXVldWV0aW1lOwkvKiB0aW1lIGJ1ZmZlciB3YXMgcXVldWVkICovCisJYXRvbWljX3QJCWJfcGluX2NvdW50OwkvKiBwaW4gY291bnQgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAliX3dhaXRlcnM7CS8qIHVucGluIHdhaXRlcnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWJfbGlzdDsKKwl4ZnNfYnVmX2ZsYWdzX3QJCWJfZmxhZ3M7CS8qIHN0YXR1cyBmbGFncyAqLworCXN0cnVjdCBsaXN0X2hlYWQJYl9oYXNoX2xpc3Q7CS8qIGhhc2ggdGFibGUgbGlzdCAqLworCXhmc19idWZoYXNoX3QJCSpiX2hhc2g7CS8qIGhhc2ggdGFibGUgbGlzdCBzdGFydCAqLworCXhmc19idWZ0YXJnX3QJCSpiX3RhcmdldDsJLyogYnVmZmVyIHRhcmdldCAoZGV2aWNlKSAqLworCWF0b21pY190CQliX2hvbGQ7CQkvKiByZWZlcmVuY2UgY291bnQgKi8KKwl4ZnNfZGFkZHJfdAkJYl9ibjsJCS8qIGJsb2NrIG51bWJlciBmb3IgSS9PICovCisJeGZzX29mZl90CQliX2ZpbGVfb2Zmc2V0OwkvKiBvZmZzZXQgaW4gZmlsZSAqLworCXNpemVfdAkJCWJfYnVmZmVyX2xlbmd0aDsvKiBzaXplIG9mIGJ1ZmZlciBpbiBieXRlcyAqLworCXNpemVfdAkJCWJfY291bnRfZGVzaXJlZDsvKiBkZXNpcmVkIHRyYW5zZmVyIHNpemUgKi8KKwl2b2lkCQkJKmJfYWRkcjsJLyogdmlydHVhbCBhZGRyZXNzIG9mIGJ1ZmZlciAqLworCXN0cnVjdCB3b3JrX3N0cnVjdAliX2lvZG9uZV93b3JrOworCWF0b21pY190CQliX2lvX3JlbWFpbmluZzsJLyogI291dHN0YW5kaW5nIEkvTyByZXF1ZXN0cyAqLworCXhmc19idWZfaW9kb25lX3QJYl9pb2RvbmU7CS8qIEkvTyBjb21wbGV0aW9uIGZ1bmN0aW9uICovCisJeGZzX2J1Zl9yZWxzZV90CQliX3JlbHNlOwkvKiByZWxlYXNpbmcgZnVuY3Rpb24gKi8KKwl4ZnNfYnVmX2Jkc3RyYXRfdAliX3N0cmF0OwkvKiBwcmUtd3JpdGUgZnVuY3Rpb24gKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlCWJfaW9kb25lc2VtYTsJLyogU2VtYXBob3JlIGZvciBJL08gd2FpdGVycyAqLworCXZvaWQJCQkqYl9mc3ByaXY7CisJdm9pZAkJCSpiX2ZzcHJpdjI7CisJdm9pZAkJCSpiX2ZzcHJpdjM7CisJdW5zaWduZWQgc2hvcnQJCWJfZXJyb3I7CS8qIGVycm9yIGNvZGUgb24gSS9PICovCisJdW5zaWduZWQgc2hvcnQJCWJfbG9ja2VkOwkvKiBwYWdlIGFycmF5IGlzIGxvY2tlZCAqLworCXVuc2lnbmVkIGludAkJYl9wYWdlX2NvdW50OwkvKiBzaXplIG9mIHBhZ2UgYXJyYXkgKi8KKwl1bnNpZ25lZCBpbnQJCWJfb2Zmc2V0OwkvKiBwYWdlIG9mZnNldCBpbiBmaXJzdCBwYWdlICovCisJc3RydWN0IHBhZ2UJCSoqYl9wYWdlczsJLyogYXJyYXkgb2YgcGFnZSBwb2ludGVycyAqLworCXN0cnVjdCBwYWdlCQkqYl9wYWdlX2FycmF5W1hCX1BBR0VTXTsgLyogaW5saW5lIHBhZ2VzICovCisjaWZkZWYgWEZTX0JVRl9MT0NLX1RSQUNLSU5HCisJaW50CQkJYl9sYXN0X2hvbGRlcjsKICNlbmRpZgogfSB4ZnNfYnVmX3Q7CiAKIAogLyogRmluZGluZyBhbmQgUmVhZGluZyBCdWZmZXJzICovCi0KLWV4dGVybiB4ZnNfYnVmX3QgKl9wYWdlYnVmX2ZpbmQoCS8qIGZpbmQgYnVmZmVyIGZvciBibG9jayBpZgkqLwotCQkJCQkvKiB0aGUgYmxvY2sgaXMgaW4gbWVtb3J5CSovCi0JCXhmc19idWZ0YXJnX3QgKiwJLyogaW5vZGUgZm9yIGJsb2NrCQkqLwotCQlsb2ZmX3QsCQkJLyogc3RhcnRpbmcgb2Zmc2V0IG9mIHJhbmdlCSovCi0JCXNpemVfdCwJCQkvKiBsZW5ndGggb2YgcmFuZ2UJCSovCi0JCXBhZ2VfYnVmX2ZsYWdzX3QsCS8qIFBCRl9MT0NLCQkJKi8KLQkgICAgICAgIHhmc19idWZfdCAqKTsJCS8qIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIJKi8KLQorZXh0ZXJuIHhmc19idWZfdCAqX3hmc19idWZfZmluZCh4ZnNfYnVmdGFyZ190ICosIHhmc19vZmZfdCwgc2l6ZV90LAorCQkJCXhmc19idWZfZmxhZ3NfdCwgeGZzX2J1Zl90ICopOwogI2RlZmluZSB4ZnNfaW5jb3JlKGJ1ZnRhcmcsYmxrbm8sbGVuLGxvY2tpdCkgXAotCV9wYWdlYnVmX2ZpbmQoYnVmdGFyZywgYmxrbm8gLGxlbiwgbG9ja2l0LCBOVUxMKQorCV94ZnNfYnVmX2ZpbmQoYnVmdGFyZywgYmxrbm8gLGxlbiwgbG9ja2l0LCBOVUxMKQogCi1leHRlcm4geGZzX2J1Zl90ICp4ZnNfYnVmX2dldF9mbGFncygJLyogYWxsb2NhdGUgYSBidWZmZXIJCSovCi0JCXhmc19idWZ0YXJnX3QgKiwJLyogaW5vZGUgZm9yIGJ1ZmZlcgkJKi8KLQkJbG9mZl90LAkJCS8qIHN0YXJ0aW5nIG9mZnNldCBvZiByYW5nZSAgICAgKi8KLQkJc2l6ZV90LAkJCS8qIGxlbmd0aCBvZiByYW5nZSAgICAgICAgICAgICAgKi8KLQkJcGFnZV9idWZfZmxhZ3NfdCk7CS8qIFBCRl9MT0NLLCBQQkZfUkVBRCwJCSovCi0JCQkJCS8qIFBCRl9BU1lOQwkJCSovCi0KK2V4dGVybiB4ZnNfYnVmX3QgKnhmc19idWZfZ2V0X2ZsYWdzKHhmc19idWZ0YXJnX3QgKiwgeGZzX29mZl90LCBzaXplX3QsCisJCQkJeGZzX2J1Zl9mbGFnc190KTsKICNkZWZpbmUgeGZzX2J1Zl9nZXQodGFyZ2V0LCBibGtubywgbGVuLCBmbGFncykgXAotCXhmc19idWZfZ2V0X2ZsYWdzKCh0YXJnZXQpLCAoYmxrbm8pLCAobGVuKSwgUEJGX0xPQ0sgfCBQQkZfTUFQUEVEKQorCXhmc19idWZfZ2V0X2ZsYWdzKCh0YXJnZXQpLCAoYmxrbm8pLCAobGVuKSwgWEJGX0xPQ0sgfCBYQkZfTUFQUEVEKQogCi1leHRlcm4geGZzX2J1Zl90ICp4ZnNfYnVmX3JlYWRfZmxhZ3MoCS8qIGFsbG9jYXRlIGFuZCByZWFkIGEgYnVmZmVyCSovCi0JCXhmc19idWZ0YXJnX3QgKiwJLyogaW5vZGUgZm9yIGJ1ZmZlcgkJKi8KLQkJbG9mZl90LAkJCS8qIHN0YXJ0aW5nIG9mZnNldCBvZiByYW5nZQkqLwotCQlzaXplX3QsCQkJLyogbGVuZ3RoIG9mIHJhbmdlCQkqLwotCQlwYWdlX2J1Zl9mbGFnc190KTsJLyogUEJGX0xPQ0ssIFBCRl9BU1lOQwkJKi8KLQorZXh0ZXJuIHhmc19idWZfdCAqeGZzX2J1Zl9yZWFkX2ZsYWdzKHhmc19idWZ0YXJnX3QgKiwgeGZzX29mZl90LCBzaXplX3QsCisJCQkJeGZzX2J1Zl9mbGFnc190KTsKICNkZWZpbmUgeGZzX2J1Zl9yZWFkKHRhcmdldCwgYmxrbm8sIGxlbiwgZmxhZ3MpIFwKLQl4ZnNfYnVmX3JlYWRfZmxhZ3MoKHRhcmdldCksIChibGtubyksIChsZW4pLCBQQkZfTE9DSyB8IFBCRl9NQVBQRUQpCisJeGZzX2J1Zl9yZWFkX2ZsYWdzKCh0YXJnZXQpLCAoYmxrbm8pLCAobGVuKSwgWEJGX0xPQ0sgfCBYQkZfTUFQUEVEKQogCi1leHRlcm4geGZzX2J1Zl90ICpwYWdlYnVmX2dldF9lbXB0eSgJLyogYWxsb2NhdGUgcGFnZWJ1ZiBzdHJ1Y3Qgd2l0aAkqLwotCQkJCQkvKiAgbm8gbWVtb3J5IG9yIGRpc2sgYWRkcmVzcwkqLwotCQlzaXplX3QgbGVuLAotCQl4ZnNfYnVmdGFyZ190ICopOwkvKiBtb3VudCBwb2ludCAiZmFrZSIgaW5vZGUJKi8KLQotZXh0ZXJuIHhmc19idWZfdCAqcGFnZWJ1Zl9nZXRfbm9fZGFkZHIoLyogYWxsb2NhdGUgcGFnZWJ1ZiBzdHJ1Y3QJKi8KLQkJCQkJLyogd2l0aG91dCBkaXNrIGFkZHJlc3MJCSovCi0JCXNpemVfdCBsZW4sCi0JCXhmc19idWZ0YXJnX3QgKik7CS8qIG1vdW50IHBvaW50ICJmYWtlIiBpbm9kZQkqLwotCi1leHRlcm4gaW50IHBhZ2VidWZfYXNzb2NpYXRlX21lbW9yeSgKLQkJeGZzX2J1Zl90ICosCi0JCXZvaWQgKiwKLQkJc2l6ZV90KTsKLQotZXh0ZXJuIHZvaWQgcGFnZWJ1Zl9ob2xkKAkJLyogaW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudAkqLwotCQl4ZnNfYnVmX3QgKik7CQkvKiBidWZmZXIgdG8gaG9sZAkJKi8KLQotZXh0ZXJuIHZvaWQgcGFnZWJ1Zl9yZWFkYWhlYWQoCQkvKiByZWFkIGFoZWFkIGludG8gY2FjaGUJKi8KLQkJeGZzX2J1ZnRhcmdfdCAgKiwJLyogdGFyZ2V0IGZvciBidWZmZXIgKG9yIE5VTEwpCSovCi0JCWxvZmZfdCwJCQkvKiBzdGFydGluZyBvZmZzZXQgb2YgcmFuZ2UgICAgICovCi0JCXNpemVfdCwJCQkvKiBsZW5ndGggb2YgcmFuZ2UgICAgICAgICAgICAgICovCi0JCXBhZ2VfYnVmX2ZsYWdzX3QpOwkvKiBhZGRpdGlvbmFsIHJlYWQgZmxhZ3MJKi8KK2V4dGVybiB4ZnNfYnVmX3QgKnhmc19idWZfZ2V0X2VtcHR5KHNpemVfdCwgeGZzX2J1ZnRhcmdfdCAqKTsKK2V4dGVybiB4ZnNfYnVmX3QgKnhmc19idWZfZ2V0X25vYWRkcihzaXplX3QsIHhmc19idWZ0YXJnX3QgKik7CitleHRlcm4gaW50IHhmc19idWZfYXNzb2NpYXRlX21lbW9yeSh4ZnNfYnVmX3QgKiwgdm9pZCAqLCBzaXplX3QpOworZXh0ZXJuIHZvaWQgeGZzX2J1Zl9ob2xkKHhmc19idWZfdCAqKTsKK2V4dGVybiB2b2lkIHhmc19idWZfcmVhZGFoZWFkKHhmc19idWZ0YXJnX3QgKiwgeGZzX29mZl90LCBzaXplX3QsCisJCQkJeGZzX2J1Zl9mbGFnc190KTsKIAogLyogUmVsZWFzaW5nIEJ1ZmZlcnMgKi8KLQotZXh0ZXJuIHZvaWQgcGFnZWJ1Zl9mcmVlKAkJLyogZGVhbGxvY2F0ZSBhIGJ1ZmZlcgkJKi8KLQkJeGZzX2J1Zl90ICopOwkJLyogYnVmZmVyIHRvIGRlYWxsb2NhdGUJCSovCi0KLWV4dGVybiB2b2lkIHBhZ2VidWZfcmVsZSgJCS8qIHJlbGVhc2UgaG9sZCBvbiBhIGJ1ZmZlcgkqLwotCQl4ZnNfYnVmX3QgKik7CQkvKiBidWZmZXIgdG8gcmVsZWFzZQkJKi8KK2V4dGVybiB2b2lkIHhmc19idWZfZnJlZSh4ZnNfYnVmX3QgKik7CitleHRlcm4gdm9pZCB4ZnNfYnVmX3JlbGUoeGZzX2J1Zl90ICopOwogCiAvKiBMb2NraW5nIGFuZCBVbmxvY2tpbmcgQnVmZmVycyAqLwotCi1leHRlcm4gaW50IHBhZ2VidWZfY29uZF9sb2NrKAkJLyogbG9jayBidWZmZXIsIGlmIG5vdCBsb2NrZWQJKi8KLQkJCQkJLyogKHJldHVybnMgLUVCVVNZIGlmIGxvY2tlZCkJKi8KLQkJeGZzX2J1Zl90ICopOwkJLyogYnVmZmVyIHRvIGxvY2sJCSovCi0KLWV4dGVybiBpbnQgcGFnZWJ1Zl9sb2NrX3ZhbHVlKAkJLyogcmV0dXJuIGNvdW50IG9uIGxvY2sJCSovCi0JCXhmc19idWZfdCAqKTsgICAgICAgICAgLyogYnVmZmVyIHRvIGNoZWNrICAgICAgICAgICAgICAqLwotCi1leHRlcm4gaW50IHBhZ2VidWZfbG9jaygJCS8qIGxvY2sgYnVmZmVyICAgICAgICAgICAgICAgICAgKi8KLQkJeGZzX2J1Zl90ICopOyAgICAgICAgICAvKiBidWZmZXIgdG8gbG9jayAgICAgICAgICAgICAgICovCi0KLWV4dGVybiB2b2lkIHBhZ2VidWZfdW5sb2NrKAkJLyogdW5sb2NrIGJ1ZmZlcgkJKi8KLQkJeGZzX2J1Zl90ICopOwkJLyogYnVmZmVyIHRvIHVubG9jawkJKi8KK2V4dGVybiBpbnQgeGZzX2J1Zl9jb25kX2xvY2soeGZzX2J1Zl90ICopOworZXh0ZXJuIGludCB4ZnNfYnVmX2xvY2tfdmFsdWUoeGZzX2J1Zl90ICopOworZXh0ZXJuIHZvaWQgeGZzX2J1Zl9sb2NrKHhmc19idWZfdCAqKTsKK2V4dGVybiB2b2lkIHhmc19idWZfdW5sb2NrKHhmc19idWZfdCAqKTsKIAogLyogQnVmZmVyIFJlYWQgYW5kIFdyaXRlIFJvdXRpbmVzICovCitleHRlcm4gdm9pZCB4ZnNfYnVmX2lvZW5kKHhmc19idWZfdCAqLAlpbnQpOworZXh0ZXJuIHZvaWQgeGZzX2J1Zl9pb2Vycm9yKHhmc19idWZfdCAqLCBpbnQpOworZXh0ZXJuIGludCB4ZnNfYnVmX2lvc3RhcnQoeGZzX2J1Zl90ICosIHhmc19idWZfZmxhZ3NfdCk7CitleHRlcm4gaW50IHhmc19idWZfaW9yZXF1ZXN0KHhmc19idWZfdCAqKTsKK2V4dGVybiBpbnQgeGZzX2J1Zl9pb3dhaXQoeGZzX2J1Zl90ICopOworZXh0ZXJuIHZvaWQgeGZzX2J1Zl9pb21vdmUoeGZzX2J1Zl90ICosIHNpemVfdCwgc2l6ZV90LCB4ZnNfY2FkZHJfdCwKKwkJCQl4ZnNfYnVmX3J3X3QpOwogCi1leHRlcm4gdm9pZCBwYWdlYnVmX2lvZG9uZSgJCS8qIG1hcmsgYnVmZmVyIEkvTyBjb21wbGV0ZQkqLwotCQl4ZnNfYnVmX3QgKiwJCS8qIGJ1ZmZlciB0byBtYXJrCQkqLwotCQlpbnQpOwkJCS8qIHJ1biBjb21wbGV0aW9uIGxvY2FsbHksIG9yIGluCi0JCQkJCSAqIGEgaGVscGVyIHRocmVhZC4JCSovCi0KLWV4dGVybiB2b2lkIHBhZ2VidWZfaW9lcnJvcigJCS8qIG1hcmsgYnVmZmVyIGluIGVycm9yCShvciBub3QpICovCi0JCXhmc19idWZfdCAqLAkJLyogYnVmZmVyIHRvIG1hcmsJCSovCi0JCWludCk7CQkJLyogZXJyb3IgdG8gc3RvcmUgKDAgaWYgbm9uZSkJKi8KLQotZXh0ZXJuIGludCBwYWdlYnVmX2lvc3RhcnQoCQkvKiBzdGFydCBJL08gb24gYSBidWZmZXIJKi8KLQkJeGZzX2J1Zl90ICosCQkvKiBidWZmZXIgdG8gc3RhcnQJCSovCi0JCXBhZ2VfYnVmX2ZsYWdzX3QpOwkvKiBQQkZfTE9DSywgUEJGX0FTWU5DLAkJKi8KLQkJCQkJLyogUEJGX1JFQUQsIFBCRl9XUklURSwJCSovCi0JCQkJCS8qIFBCRl9ERUxXUkkJCQkqLwotCi1leHRlcm4gaW50IHBhZ2VidWZfaW9yZXF1ZXN0KAkJLyogc3RhcnQgcmVhbCBJL08JCSovCi0JCXhmc19idWZfdCAqKTsJCS8qIGJ1ZmZlciB0byBjb252ZXkgdG8gZGV2aWNlCSovCi0KLWV4dGVybiBpbnQgcGFnZWJ1Zl9pb3dhaXQoCQkvKiB3YWl0IGZvciBidWZmZXIgSS9PIGRvbmUJKi8KLQkJeGZzX2J1Zl90ICopOwkJLyogYnVmZmVyIHRvIHdhaXQgb24JCSovCi0KLWV4dGVybiB2b2lkIHBhZ2VidWZfaW9tb3ZlKAkJLyogbW92ZSBkYXRhIGluL291dCBvZiBwYWdlYnVmCSovCi0JCXhmc19idWZfdCAqLAkJLyogYnVmZmVyIHRvIG1hbmlwdWxhdGUJCSovCi0JCXNpemVfdCwJCQkvKiBzdGFydGluZyBidWZmZXIgb2Zmc2V0CSovCi0JCXNpemVfdCwJCQkvKiBsZW5ndGggaW4gYnVmZmVyCQkqLwotCQljYWRkcl90LAkJLyogZGF0YSBwb2ludGVyCQkJKi8KLQkJcGFnZV9idWZfcndfdCk7CQkvKiBkaXJlY3Rpb24JCQkqLwotCi1zdGF0aWMgaW5saW5lIGludCBwYWdlYnVmX2lvc3RyYXRlZ3koeGZzX2J1Zl90ICpwYikKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19idWZfaW9zdHJhdGVneSh4ZnNfYnVmX3QgKmJwKQogewotCXJldHVybiBwYi0+cGJfc3RyYXQgPyBwYi0+cGJfc3RyYXQocGIpIDogcGFnZWJ1Zl9pb3JlcXVlc3QocGIpOworCXJldHVybiBicC0+Yl9zdHJhdCA/IGJwLT5iX3N0cmF0KGJwKSA6IHhmc19idWZfaW9yZXF1ZXN0KGJwKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcGFnZWJ1Zl9nZXRlcnJvcih4ZnNfYnVmX3QgKnBiKQorc3RhdGljIGlubGluZSBpbnQgeGZzX2J1Zl9nZXRlcnJvcih4ZnNfYnVmX3QgKmJwKQogewotCXJldHVybiBwYiA/IHBiLT5wYl9lcnJvciA6IEVOT01FTTsKKwlyZXR1cm4gYnAgPyBicC0+Yl9lcnJvciA6IEVOT01FTTsKIH0KIAogLyogQnVmZmVyIFV0aWxpdHkgUm91dGluZXMgKi8KLQotZXh0ZXJuIGNhZGRyX3QgcGFnZWJ1Zl9vZmZzZXQoCQkvKiBwb2ludGVyIGF0IG9mZnNldCBpbiBidWZmZXIJKi8KLQkJeGZzX2J1Zl90ICosCQkvKiBidWZmZXIgdG8gb2Zmc2V0IGludG8JKi8KLQkJc2l6ZV90KTsJCS8qIG9mZnNldAkJCSovCitleHRlcm4geGZzX2NhZGRyX3QgeGZzX2J1Zl9vZmZzZXQoeGZzX2J1Zl90ICosIHNpemVfdCk7CiAKIC8qIFBpbm5pbmcgQnVmZmVyIFN0b3JhZ2UgaW4gTWVtb3J5ICovCi0KLWV4dGVybiB2b2lkIHBhZ2VidWZfcGluKAkJLyogcGluIGJ1ZmZlciBpbiBtZW1vcnkJCSovCi0JCXhmc19idWZfdCAqKTsJCS8qIGJ1ZmZlciB0byBwaW4JCSovCi0KLWV4dGVybiB2b2lkIHBhZ2VidWZfdW5waW4oCQkvKiB1bnBpbiBidWZmZXJlZCBkYXRhCQkqLwotCQl4ZnNfYnVmX3QgKik7CQkvKiBidWZmZXIgdG8gdW5waW4JCSovCi0KLWV4dGVybiBpbnQgcGFnZWJ1Zl9pc3BpbigJCS8qIGNoZWNrIGlmIGJ1ZmZlciBpcyBwaW5uZWQJKi8KLQkJeGZzX2J1Zl90ICopOwkJLyogYnVmZmVyIHRvIGNoZWNrCQkqLworZXh0ZXJuIHZvaWQgeGZzX2J1Zl9waW4oeGZzX2J1Zl90ICopOworZXh0ZXJuIHZvaWQgeGZzX2J1Zl91bnBpbih4ZnNfYnVmX3QgKik7CitleHRlcm4gaW50IHhmc19idWZfaXNwaW4oeGZzX2J1Zl90ICopOwogCiAvKiBEZWxheWVkIFdyaXRlIEJ1ZmZlciBSb3V0aW5lcyAqLwotCi1leHRlcm4gdm9pZCBwYWdlYnVmX2RlbHdyaV9kZXF1ZXVlKHhmc19idWZfdCAqKTsKK2V4dGVybiB2b2lkIHhmc19idWZfZGVsd3JpX2RlcXVldWUoeGZzX2J1Zl90ICopOwogCiAvKiBCdWZmZXIgRGFlbW9uIFNldHVwIFJvdXRpbmVzICovCitleHRlcm4gaW50IHhmc19idWZfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHhmc19idWZfdGVybWluYXRlKHZvaWQpOwogCi1leHRlcm4gaW50IHBhZ2VidWZfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIHBhZ2VidWZfdGVybWluYXRlKHZvaWQpOwotCi0KLSNpZmRlZiBQQUdFQlVGX1RSQUNFCi1leHRlcm4ga3RyYWNlX3QgKnBhZ2VidWZfdHJhY2VfYnVmOwotZXh0ZXJuIHZvaWQgcGFnZWJ1Zl90cmFjZSgKLQkJeGZzX2J1Zl90ICosCQkvKiBidWZmZXIgYmVpbmcgdHJhY2VkCQkqLwotCQljaGFyICosCQkJLyogZGVzY3JpcHRpb24gb2Ygb3BlcmF0aW9uCSovCi0JCXZvaWQgKiwJCQkvKiBhcmJpdHJhcnkgZGlhZ25vc3RpYyB2YWx1ZQkqLwotCQl2b2lkICopOwkJLyogcmV0dXJuIGFkZHJlc3MJCSovCisjaWZkZWYgWEZTX0JVRl9UUkFDRQorZXh0ZXJuIGt0cmFjZV90ICp4ZnNfYnVmX3RyYWNlX2J1ZjsKK2V4dGVybiB2b2lkIHhmc19idWZfdHJhY2UoeGZzX2J1Zl90ICosIGNoYXIgKiwgdm9pZCAqLCB2b2lkICopOwogI2Vsc2UKLSMgZGVmaW5lIHBhZ2VidWZfdHJhY2UocGIsIGlkLCBwdHIsIHJhKQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHhmc19idWZfdHJhY2UoYnAsaWQscHRyLHJhKQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotI2RlZmluZSBwYWdlYnVmX3RhcmdldF9uYW1lKHRhcmdldCkJXAotCSh7IGNoYXIgX19iW0JERVZOQU1FX1NJWkVdOyBiZGV2bmFtZSgodGFyZ2V0KS0+cGJyX2JkZXYsIF9fYik7IF9fYjsgfSkKKyNkZWZpbmUgeGZzX2J1Zl90YXJnZXRfbmFtZSh0YXJnZXQpCVwKKwkoeyBjaGFyIF9fYltCREVWTkFNRV9TSVpFXTsgYmRldm5hbWUoKHRhcmdldCktPmJ0X2JkZXYsIF9fYik7IF9fYjsgfSkKIAogCisjZGVmaW5lIFhGU19CX0FTWU5DCQlYQkZfQVNZTkMKKyNkZWZpbmUgWEZTX0JfREVMV1JJCQlYQkZfREVMV1JJCisjZGVmaW5lIFhGU19CX1JFQUQJCVhCRl9SRUFECisjZGVmaW5lIFhGU19CX1dSSVRFCQlYQkZfV1JJVEUKKyNkZWZpbmUgWEZTX0JfU1RBTEUJCVhCRl9TVEFMRQogCi0vKiBUaGVzZSBhcmUganVzdCBmb3IgeGZzX3N5bmNzdWIuLi4gaXQgc2V0cyBhbiBpbnRlcm5hbCB2YXJpYWJsZQotICogdGhlbiBwYXNzZXMgaXQgdG8gVk9QX0ZMVVNIX1BBR0VTIG9yIGFkZHMgdGhlIGZsYWdzIHRvIGEgbmV3bHkgZ290dGVuIGJ1Zl90Ci0gKi8KLSNkZWZpbmUgWEZTX0JfQVNZTkMJCVBCRl9BU1lOQwotI2RlZmluZSBYRlNfQl9ERUxXUkkJCVBCRl9ERUxXUkkKLSNkZWZpbmUgWEZTX0JfUkVBRAkJUEJGX1JFQUQKLSNkZWZpbmUgWEZTX0JfV1JJVEUJCVBCRl9XUklURQotI2RlZmluZSBYRlNfQl9TVEFMRQkJUEJGX1NUQUxFCisjZGVmaW5lIFhGU19CVUZfVFJZTE9DSwkJWEJGX1RSWUxPQ0sKKyNkZWZpbmUgWEZTX0lOQ09SRV9UUllMT0NLCVhCRl9UUllMT0NLCisjZGVmaW5lIFhGU19CVUZfTE9DSwkJWEJGX0xPQ0sKKyNkZWZpbmUgWEZTX0JVRl9NQVBQRUQJCVhCRl9NQVBQRUQKIAotI2RlZmluZSBYRlNfQlVGX1RSWUxPQ0sJCVBCRl9UUllMT0NLCi0jZGVmaW5lIFhGU19JTkNPUkVfVFJZTE9DSwlQQkZfVFJZTE9DSwotI2RlZmluZSBYRlNfQlVGX0xPQ0sJCVBCRl9MT0NLCi0jZGVmaW5lIFhGU19CVUZfTUFQUEVECQlQQkZfTUFQUEVECisjZGVmaW5lIEJVRl9CVVNZCQlYQkZfRE9OVF9CTE9DSwogCi0jZGVmaW5lIEJVRl9CVVNZCQlQQkZfRE9OVF9CTE9DSworI2RlZmluZSBYRlNfQlVGX0JGTEFHUyhicCkJKChicCktPmJfZmxhZ3MpCisjZGVmaW5lIFhGU19CVUZfWkVST0ZMQUdTKGJwKQlcCisJKChicCktPmJfZmxhZ3MgJj0gfihYQkZfUkVBRHxYQkZfV1JJVEV8WEJGX0FTWU5DfFhCRl9ERUxXUkkpKQogCi0jZGVmaW5lIFhGU19CVUZfQkZMQUdTKHgpCSgoeCktPnBiX2ZsYWdzKQotI2RlZmluZSBYRlNfQlVGX1pFUk9GTEFHUyh4KQlcCi0JKCh4KS0+cGJfZmxhZ3MgJj0gfihQQkZfUkVBRHxQQkZfV1JJVEV8UEJGX0FTWU5DfFBCRl9ERUxXUkkpKQotCi0jZGVmaW5lIFhGU19CVUZfU1RBTEUoeCkJKCh4KS0+cGJfZmxhZ3MgfD0gWEZTX0JfU1RBTEUpCi0jZGVmaW5lIFhGU19CVUZfVU5TVEFMRSh4KQkoKHgpLT5wYl9mbGFncyAmPSB+WEZTX0JfU1RBTEUpCi0jZGVmaW5lIFhGU19CVUZfSVNTVEFMRSh4KQkoKHgpLT5wYl9mbGFncyAmIFhGU19CX1NUQUxFKQotI2RlZmluZSBYRlNfQlVGX1NVUEVSX1NUQUxFKHgpCWRvIHsJCQkJXAotCQkJCQlYRlNfQlVGX1NUQUxFKHgpOwlcCi0JCQkJCXBhZ2VidWZfZGVsd3JpX2RlcXVldWUoeCk7CVwKLQkJCQkJWEZTX0JVRl9ET05FKHgpOwlcCisjZGVmaW5lIFhGU19CVUZfU1RBTEUoYnApCSgoYnApLT5iX2ZsYWdzIHw9IFhGU19CX1NUQUxFKQorI2RlZmluZSBYRlNfQlVGX1VOU1RBTEUoYnApCSgoYnApLT5iX2ZsYWdzICY9IH5YRlNfQl9TVEFMRSkKKyNkZWZpbmUgWEZTX0JVRl9JU1NUQUxFKGJwKQkoKGJwKS0+Yl9mbGFncyAmIFhGU19CX1NUQUxFKQorI2RlZmluZSBYRlNfQlVGX1NVUEVSX1NUQUxFKGJwKQlkbyB7CQkJCVwKKwkJCQkJWEZTX0JVRl9TVEFMRShicCk7CVwKKwkJCQkJeGZzX2J1Zl9kZWx3cmlfZGVxdWV1ZShicCk7CVwKKwkJCQkJWEZTX0JVRl9ET05FKGJwKTsJXAogCQkJCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgWEZTX0JVRl9NQU5BR0UJCVBCRl9GU19NQU5BR0VECi0jZGVmaW5lIFhGU19CVUZfVU5NQU5BR0UoeCkJKCh4KS0+cGJfZmxhZ3MgJj0gflBCRl9GU19NQU5BR0VEKQorI2RlZmluZSBYRlNfQlVGX01BTkFHRQkJWEJGX0ZTX01BTkFHRUQKKyNkZWZpbmUgWEZTX0JVRl9VTk1BTkFHRShicCkJKChicCktPmJfZmxhZ3MgJj0gflhCRl9GU19NQU5BR0VEKQogCi0jZGVmaW5lIFhGU19CVUZfREVMQVlXUklURSh4KQkgKCh4KS0+cGJfZmxhZ3MgfD0gUEJGX0RFTFdSSSkKLSNkZWZpbmUgWEZTX0JVRl9VTkRFTEFZV1JJVEUoeCkJIHBhZ2VidWZfZGVsd3JpX2RlcXVldWUoeCkKLSNkZWZpbmUgWEZTX0JVRl9JU0RFTEFZV1JJVEUoeCkJICgoeCktPnBiX2ZsYWdzICYgUEJGX0RFTFdSSSkKKyNkZWZpbmUgWEZTX0JVRl9ERUxBWVdSSVRFKGJwKQkJKChicCktPmJfZmxhZ3MgfD0gWEJGX0RFTFdSSSkKKyNkZWZpbmUgWEZTX0JVRl9VTkRFTEFZV1JJVEUoYnApCXhmc19idWZfZGVsd3JpX2RlcXVldWUoYnApCisjZGVmaW5lIFhGU19CVUZfSVNERUxBWVdSSVRFKGJwKQkoKGJwKS0+Yl9mbGFncyAmIFhCRl9ERUxXUkkpCiAKLSNkZWZpbmUgWEZTX0JVRl9FUlJPUih4LG5vKQkgcGFnZWJ1Zl9pb2Vycm9yKHgsbm8pCi0jZGVmaW5lIFhGU19CVUZfR0VURVJST1IoeCkJIHBhZ2VidWZfZ2V0ZXJyb3IoeCkKLSNkZWZpbmUgWEZTX0JVRl9JU0VSUk9SKHgpCSAocGFnZWJ1Zl9nZXRlcnJvcih4KT8xOjApCisjZGVmaW5lIFhGU19CVUZfRVJST1IoYnAsbm8pCXhmc19idWZfaW9lcnJvcihicCxubykKKyNkZWZpbmUgWEZTX0JVRl9HRVRFUlJPUihicCkJeGZzX2J1Zl9nZXRlcnJvcihicCkKKyNkZWZpbmUgWEZTX0JVRl9JU0VSUk9SKGJwKQkoeGZzX2J1Zl9nZXRlcnJvcihicCkgPyAxIDogMCkKIAotI2RlZmluZSBYRlNfQlVGX0RPTkUoeCkJCSAoKHgpLT5wYl9mbGFncyB8PSBQQkZfRE9ORSkKLSNkZWZpbmUgWEZTX0JVRl9VTkRPTkUoeCkJICgoeCktPnBiX2ZsYWdzICY9IH5QQkZfRE9ORSkKLSNkZWZpbmUgWEZTX0JVRl9JU0RPTkUoeCkJICgoeCktPnBiX2ZsYWdzICYgUEJGX0RPTkUpCisjZGVmaW5lIFhGU19CVUZfRE9ORShicCkJKChicCktPmJfZmxhZ3MgfD0gWEJGX0RPTkUpCisjZGVmaW5lIFhGU19CVUZfVU5ET05FKGJwKQkoKGJwKS0+Yl9mbGFncyAmPSB+WEJGX0RPTkUpCisjZGVmaW5lIFhGU19CVUZfSVNET05FKGJwKQkoKGJwKS0+Yl9mbGFncyAmIFhCRl9ET05FKQogCi0jZGVmaW5lIFhGU19CVUZfQlVTWSh4KQkJIGRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgWEZTX0JVRl9VTkJVU1koeCkJIGRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgWEZTX0JVRl9JU0JVU1koeCkJICgxKQorI2RlZmluZSBYRlNfQlVGX0JVU1koYnApCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgWEZTX0JVRl9VTkJVU1koYnApCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgWEZTX0JVRl9JU0JVU1koYnApCSgxKQogCi0jZGVmaW5lIFhGU19CVUZfQVNZTkMoeCkJICgoeCktPnBiX2ZsYWdzIHw9IFBCRl9BU1lOQykKLSNkZWZpbmUgWEZTX0JVRl9VTkFTWU5DKHgpCSAoKHgpLT5wYl9mbGFncyAmPSB+UEJGX0FTWU5DKQotI2RlZmluZSBYRlNfQlVGX0lTQVNZTkMoeCkJICgoeCktPnBiX2ZsYWdzICYgUEJGX0FTWU5DKQorI2RlZmluZSBYRlNfQlVGX0FTWU5DKGJwKQkoKGJwKS0+Yl9mbGFncyB8PSBYQkZfQVNZTkMpCisjZGVmaW5lIFhGU19CVUZfVU5BU1lOQyhicCkJKChicCktPmJfZmxhZ3MgJj0gflhCRl9BU1lOQykKKyNkZWZpbmUgWEZTX0JVRl9JU0FTWU5DKGJwKQkoKGJwKS0+Yl9mbGFncyAmIFhCRl9BU1lOQykKIAotI2RlZmluZSBYRlNfQlVGX09SREVSRUQoeCkJICgoeCktPnBiX2ZsYWdzIHw9IFBCRl9PUkRFUkVEKQotI2RlZmluZSBYRlNfQlVGX1VOT1JERVJFRCh4KQkgKCh4KS0+cGJfZmxhZ3MgJj0gflBCRl9PUkRFUkVEKQotI2RlZmluZSBYRlNfQlVGX0lTT1JERVJFRCh4KQkgKCh4KS0+cGJfZmxhZ3MgJiBQQkZfT1JERVJFRCkKKyNkZWZpbmUgWEZTX0JVRl9PUkRFUkVEKGJwKQkoKGJwKS0+Yl9mbGFncyB8PSBYQkZfT1JERVJFRCkKKyNkZWZpbmUgWEZTX0JVRl9VTk9SREVSRUQoYnApCSgoYnApLT5iX2ZsYWdzICY9IH5YQkZfT1JERVJFRCkKKyNkZWZpbmUgWEZTX0JVRl9JU09SREVSRUQoYnApCSgoYnApLT5iX2ZsYWdzICYgWEJGX09SREVSRUQpCiAKLSNkZWZpbmUgWEZTX0JVRl9TSFVUKHgpCQkgcHJpbnRrKCJYRlNfQlVGX1NIVVQgbm90IGltcGxlbWVudGVkIHlldFxuIikKLSNkZWZpbmUgWEZTX0JVRl9VTlNIVVQoeCkJIHByaW50aygiWEZTX0JVRl9VTlNIVVQgbm90IGltcGxlbWVudGVkIHlldFxuIikKLSNkZWZpbmUgWEZTX0JVRl9JU1NIVVQoeCkJICgwKQorI2RlZmluZSBYRlNfQlVGX1NIVVQoYnApCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgWEZTX0JVRl9VTlNIVVQoYnApCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgWEZTX0JVRl9JU1NIVVQoYnApCSgwKQogCi0jZGVmaW5lIFhGU19CVUZfSE9MRCh4KQkJcGFnZWJ1Zl9ob2xkKHgpCi0jZGVmaW5lIFhGU19CVUZfUkVBRCh4KQkJKCh4KS0+cGJfZmxhZ3MgfD0gUEJGX1JFQUQpCi0jZGVmaW5lIFhGU19CVUZfVU5SRUFEKHgpCSgoeCktPnBiX2ZsYWdzICY9IH5QQkZfUkVBRCkKLSNkZWZpbmUgWEZTX0JVRl9JU1JFQUQoeCkJKCh4KS0+cGJfZmxhZ3MgJiBQQkZfUkVBRCkKKyNkZWZpbmUgWEZTX0JVRl9IT0xEKGJwKQl4ZnNfYnVmX2hvbGQoYnApCisjZGVmaW5lIFhGU19CVUZfUkVBRChicCkJKChicCktPmJfZmxhZ3MgfD0gWEJGX1JFQUQpCisjZGVmaW5lIFhGU19CVUZfVU5SRUFEKGJwKQkoKGJwKS0+Yl9mbGFncyAmPSB+WEJGX1JFQUQpCisjZGVmaW5lIFhGU19CVUZfSVNSRUFEKGJwKQkoKGJwKS0+Yl9mbGFncyAmIFhCRl9SRUFEKQogCi0jZGVmaW5lIFhGU19CVUZfV1JJVEUoeCkJKCh4KS0+cGJfZmxhZ3MgfD0gUEJGX1dSSVRFKQotI2RlZmluZSBYRlNfQlVGX1VOV1JJVEUoeCkJKCh4KS0+cGJfZmxhZ3MgJj0gflBCRl9XUklURSkKLSNkZWZpbmUgWEZTX0JVRl9JU1dSSVRFKHgpCSgoeCktPnBiX2ZsYWdzICYgUEJGX1dSSVRFKQorI2RlZmluZSBYRlNfQlVGX1dSSVRFKGJwKQkoKGJwKS0+Yl9mbGFncyB8PSBYQkZfV1JJVEUpCisjZGVmaW5lIFhGU19CVUZfVU5XUklURShicCkJKChicCktPmJfZmxhZ3MgJj0gflhCRl9XUklURSkKKyNkZWZpbmUgWEZTX0JVRl9JU1dSSVRFKGJwKQkoKGJwKS0+Yl9mbGFncyAmIFhCRl9XUklURSkKIAotI2RlZmluZSBYRlNfQlVGX0lTVU5JTklUSUFMKHgpCSAoMCkKLSNkZWZpbmUgWEZTX0JVRl9VTlVOSU5JVElBTCh4KQkgKDApCisjZGVmaW5lIFhGU19CVUZfSVNVTklOSVRJQUwoYnApCSgwKQorI2RlZmluZSBYRlNfQlVGX1VOVU5JTklUSUFMKGJwKQkoMCkKIAotI2RlZmluZSBYRlNfQlVGX0JQX0lTTUFQUEVEKGJwKQkgMQorI2RlZmluZSBYRlNfQlVGX0JQX0lTTUFQUEVEKGJwKQkoMSkKIAotI2RlZmluZSBYRlNfQlVGX0lPRE9ORV9GVU5DKGJ1ZikJKGJ1ZiktPnBiX2lvZG9uZQotI2RlZmluZSBYRlNfQlVGX1NFVF9JT0RPTkVfRlVOQyhidWYsIGZ1bmMpCVwKLQkJCShidWYpLT5wYl9pb2RvbmUgPSAoZnVuYykKLSNkZWZpbmUgWEZTX0JVRl9DTFJfSU9ET05FX0ZVTkMoYnVmKQkJXAotCQkJKGJ1ZiktPnBiX2lvZG9uZSA9IE5VTEwKLSNkZWZpbmUgWEZTX0JVRl9TRVRfQkRTVFJBVF9GVU5DKGJ1ZiwgZnVuYykJXAotCQkJKGJ1ZiktPnBiX3N0cmF0ID0gKGZ1bmMpCi0jZGVmaW5lIFhGU19CVUZfQ0xSX0JEU1RSQVRfRlVOQyhidWYpCQlcCi0JCQkoYnVmKS0+cGJfc3RyYXQgPSBOVUxMCisjZGVmaW5lIFhGU19CVUZfSU9ET05FX0ZVTkMoYnApCQkJKChicCktPmJfaW9kb25lKQorI2RlZmluZSBYRlNfQlVGX1NFVF9JT0RPTkVfRlVOQyhicCwgZnVuYykJKChicCktPmJfaW9kb25lID0gKGZ1bmMpKQorI2RlZmluZSBYRlNfQlVGX0NMUl9JT0RPTkVfRlVOQyhicCkJCSgoYnApLT5iX2lvZG9uZSA9IE5VTEwpCisjZGVmaW5lIFhGU19CVUZfU0VUX0JEU1RSQVRfRlVOQyhicCwgZnVuYykJKChicCktPmJfc3RyYXQgPSAoZnVuYykpCisjZGVmaW5lIFhGU19CVUZfQ0xSX0JEU1RSQVRfRlVOQyhicCkJCSgoYnApLT5iX3N0cmF0ID0gTlVMTCkKIAotI2RlZmluZSBYRlNfQlVGX0ZTUFJJVkFURShidWYsIHR5cGUpCQlcCi0JCQkoKHR5cGUpKGJ1ZiktPnBiX2ZzcHJpdikKLSNkZWZpbmUgWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJ1ZiwgdmFsdWUpCVwKLQkJCShidWYpLT5wYl9mc3ByaXYgPSAodm9pZCAqKSh2YWx1ZSkKLSNkZWZpbmUgWEZTX0JVRl9GU1BSSVZBVEUyKGJ1ZiwgdHlwZSkJCVwKLQkJCSgodHlwZSkoYnVmKS0+cGJfZnNwcml2MikKLSNkZWZpbmUgWEZTX0JVRl9TRVRfRlNQUklWQVRFMihidWYsIHZhbHVlKQlcCi0JCQkoYnVmKS0+cGJfZnNwcml2MiA9ICh2b2lkICopKHZhbHVlKQotI2RlZmluZSBYRlNfQlVGX0ZTUFJJVkFURTMoYnVmLCB0eXBlKQkJXAotCQkJKCh0eXBlKShidWYpLT5wYl9mc3ByaXYzKQotI2RlZmluZSBYRlNfQlVGX1NFVF9GU1BSSVZBVEUzKGJ1ZiwgdmFsdWUpCVwKLQkJCShidWYpLT5wYl9mc3ByaXYzICA9ICh2b2lkICopKHZhbHVlKQotI2RlZmluZSBYRlNfQlVGX1NFVF9TVEFSVChidWYpCisjZGVmaW5lIFhGU19CVUZfRlNQUklWQVRFKGJwLCB0eXBlKQkJKCh0eXBlKShicCktPmJfZnNwcml2KQorI2RlZmluZSBYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIHZhbCkJCSgoYnApLT5iX2ZzcHJpdiA9ICh2b2lkKikodmFsKSkKKyNkZWZpbmUgWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB0eXBlKQkJKCh0eXBlKShicCktPmJfZnNwcml2MikKKyNkZWZpbmUgWEZTX0JVRl9TRVRfRlNQUklWQVRFMihicCwgdmFsKQkJKChicCktPmJfZnNwcml2MiA9ICh2b2lkKikodmFsKSkKKyNkZWZpbmUgWEZTX0JVRl9GU1BSSVZBVEUzKGJwLCB0eXBlKQkJKCh0eXBlKShicCktPmJfZnNwcml2MykKKyNkZWZpbmUgWEZTX0JVRl9TRVRfRlNQUklWQVRFMyhicCwgdmFsKQkJKChicCktPmJfZnNwcml2MyA9ICh2b2lkKikodmFsKSkKKyNkZWZpbmUgWEZTX0JVRl9TRVRfU1RBUlQoYnApCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBYRlNfQlVGX1NFVF9CUkVMU0VfRlVOQyhicCwgZnVuYykJKChicCktPmJfcmVsc2UgPSAoZnVuYykpCiAKLSNkZWZpbmUgWEZTX0JVRl9TRVRfQlJFTFNFX0ZVTkMoYnVmLCB2YWx1ZSkgXAotCQkJKGJ1ZiktPnBiX3JlbHNlID0gKHZhbHVlKQorI2RlZmluZSBYRlNfQlVGX1BUUihicCkJCQkoeGZzX2NhZGRyX3QpKChicCktPmJfYWRkcikKKyNkZWZpbmUgWEZTX0JVRl9TRVRfUFRSKGJwLCB2YWwsIGNudCkJeGZzX2J1Zl9hc3NvY2lhdGVfbWVtb3J5KGJwLCB2YWwsIGNudCkKKyNkZWZpbmUgWEZTX0JVRl9BRERSKGJwKQkJKChicCktPmJfYm4pCisjZGVmaW5lIFhGU19CVUZfU0VUX0FERFIoYnAsIGJubykJKChicCktPmJfYm4gPSAoeGZzX2RhZGRyX3QpKGJubykpCisjZGVmaW5lIFhGU19CVUZfT0ZGU0VUKGJwKQkJKChicCktPmJfZmlsZV9vZmZzZXQpCisjZGVmaW5lIFhGU19CVUZfU0VUX09GRlNFVChicCwgb2ZmKQkoKGJwKS0+Yl9maWxlX29mZnNldCA9IChvZmYpKQorI2RlZmluZSBYRlNfQlVGX0NPVU5UKGJwKQkJKChicCktPmJfY291bnRfZGVzaXJlZCkKKyNkZWZpbmUgWEZTX0JVRl9TRVRfQ09VTlQoYnAsIGNudCkJKChicCktPmJfY291bnRfZGVzaXJlZCA9IChjbnQpKQorI2RlZmluZSBYRlNfQlVGX1NJWkUoYnApCQkoKGJwKS0+Yl9idWZmZXJfbGVuZ3RoKQorI2RlZmluZSBYRlNfQlVGX1NFVF9TSVpFKGJwLCBjbnQpCSgoYnApLT5iX2J1ZmZlcl9sZW5ndGggPSAoY250KSkKIAotI2RlZmluZSBYRlNfQlVGX1BUUihicCkJCSh4ZnNfY2FkZHJfdCkoKGJwKS0+cGJfYWRkcikKKyNkZWZpbmUgWEZTX0JVRl9TRVRfVlRZUEVfUkVGKGJwLCB0eXBlLCByZWYpCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgWEZTX0JVRl9TRVRfVlRZUEUoYnAsIHR5cGUpCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIFhGU19CVUZfU0VUX1JFRihicCwgcmVmKQkJZG8geyB9IHdoaWxlICgwKQogCi1zdGF0aWMgaW5saW5lIHhmc19jYWRkcl90IHhmc19idWZfb2Zmc2V0KHhmc19idWZfdCAqYnAsIHNpemVfdCBvZmZzZXQpCisjZGVmaW5lIFhGU19CVUZfSVNQSU5ORUQoYnApCXhmc19idWZfaXNwaW4oYnApCisKKyNkZWZpbmUgWEZTX0JVRl9WQUxVU0VNQShicCkJeGZzX2J1Zl9sb2NrX3ZhbHVlKGJwKQorI2RlZmluZSBYRlNfQlVGX0NQU0VNQShicCkJKHhmc19idWZfY29uZF9sb2NrKGJwKSA9PSAwKQorI2RlZmluZSBYRlNfQlVGX1ZTRU1BKGJwKQl4ZnNfYnVmX3VubG9jayhicCkKKyNkZWZpbmUgWEZTX0JVRl9QU0VNQShicCx4KQl4ZnNfYnVmX2xvY2soYnApCisjZGVmaW5lIFhGU19CVUZfVl9JT0RPTkVTRU1BKGJwKSB1cCgmYnAtPmJfaW9kb25lc2VtYSk7CisKKyNkZWZpbmUgWEZTX0JVRl9TRVRfVEFSR0VUKGJwLCB0YXJnZXQpCSgoYnApLT5iX3RhcmdldCA9ICh0YXJnZXQpKQorI2RlZmluZSBYRlNfQlVGX1RBUkdFVChicCkJCSgoYnApLT5iX3RhcmdldCkKKyNkZWZpbmUgWEZTX0JVRlRBUkdfTkFNRSh0YXJnZXQpCXhmc19idWZfdGFyZ2V0X25hbWUodGFyZ2V0KQorCitzdGF0aWMgaW5saW5lIGludCB4ZnNfYmF3cml0ZSh2b2lkICptcCwgeGZzX2J1Zl90ICpicCkKIHsKLQlpZiAoYnAtPnBiX2ZsYWdzICYgUEJGX01BUFBFRCkKLQkJcmV0dXJuIFhGU19CVUZfUFRSKGJwKSArIG9mZnNldDsKLQlyZXR1cm4gKHhmc19jYWRkcl90KSBwYWdlYnVmX29mZnNldChicCwgb2Zmc2V0KTsKKwlicC0+Yl9mc3ByaXYzID0gbXA7CisJYnAtPmJfc3RyYXQgPSB4ZnNfYmRzdHJhdF9jYjsKKwl4ZnNfYnVmX2RlbHdyaV9kZXF1ZXVlKGJwKTsKKwlyZXR1cm4geGZzX2J1Zl9pb3N0YXJ0KGJwLCBYQkZfV1JJVEUgfCBYQkZfQVNZTkMgfCBfWEJGX1JVTl9RVUVVRVMpOwogfQogCi0jZGVmaW5lIFhGU19CVUZfU0VUX1BUUihicCwgdmFsLCBjb3VudCkJCVwKLQkJCQlwYWdlYnVmX2Fzc29jaWF0ZV9tZW1vcnkoYnAsIHZhbCwgY291bnQpCi0jZGVmaW5lIFhGU19CVUZfQUREUihicCkJKChicCktPnBiX2JuKQotI2RlZmluZSBYRlNfQlVGX1NFVF9BRERSKGJwLCBibGspCQlcCi0JCQkoKGJwKS0+cGJfYm4gPSAoeGZzX2RhZGRyX3QpKGJsaykpCi0jZGVmaW5lIFhGU19CVUZfT0ZGU0VUKGJwKQkoKGJwKS0+cGJfZmlsZV9vZmZzZXQpCi0jZGVmaW5lIFhGU19CVUZfU0VUX09GRlNFVChicCwgb2ZmKQkJXAotCQkJKChicCktPnBiX2ZpbGVfb2Zmc2V0ID0gKG9mZikpCi0jZGVmaW5lIFhGU19CVUZfQ09VTlQoYnApCSgoYnApLT5wYl9jb3VudF9kZXNpcmVkKQotI2RlZmluZSBYRlNfQlVGX1NFVF9DT1VOVChicCwgY250KQkJXAotCQkJKChicCktPnBiX2NvdW50X2Rlc2lyZWQgPSAoY250KSkKLSNkZWZpbmUgWEZTX0JVRl9TSVpFKGJwKQkoKGJwKS0+cGJfYnVmZmVyX2xlbmd0aCkKLSNkZWZpbmUgWEZTX0JVRl9TRVRfU0laRShicCwgY250KQkJXAotCQkJKChicCktPnBiX2J1ZmZlcl9sZW5ndGggPSAoY250KSkKLSNkZWZpbmUgWEZTX0JVRl9TRVRfVlRZUEVfUkVGKGJwLCB0eXBlLCByZWYpCi0jZGVmaW5lIFhGU19CVUZfU0VUX1ZUWVBFKGJwLCB0eXBlKQotI2RlZmluZSBYRlNfQlVGX1NFVF9SRUYoYnAsIHJlZikKLQotI2RlZmluZSBYRlNfQlVGX0lTUElOTkVEKGJwKQlwYWdlYnVmX2lzcGluKGJwKQotCi0jZGVmaW5lIFhGU19CVUZfVkFMVVNFTUEoYnApCXBhZ2VidWZfbG9ja192YWx1ZShicCkKLSNkZWZpbmUgWEZTX0JVRl9DUFNFTUEoYnApCShwYWdlYnVmX2NvbmRfbG9jayhicCkgPT0gMCkKLSNkZWZpbmUgWEZTX0JVRl9WU0VNQShicCkJcGFnZWJ1Zl91bmxvY2soYnApCi0jZGVmaW5lIFhGU19CVUZfUFNFTUEoYnAseCkJcGFnZWJ1Zl9sb2NrKGJwKQotI2RlZmluZSBYRlNfQlVGX1ZfSU9ET05FU0VNQShicCkgdXAoJmJwLT5wYl9pb2RvbmVzZW1hKTsKLQotLyogc2V0dXAgdGhlIGJ1ZmZlciB0YXJnZXQgZnJvbSBhIGJ1ZnRhcmcgc3RydWN0dXJlICovCi0jZGVmaW5lIFhGU19CVUZfU0VUX1RBUkdFVChicCwgdGFyZ2V0KQlcCi0JCShicCktPnBiX3RhcmdldCA9ICh0YXJnZXQpCi0jZGVmaW5lIFhGU19CVUZfVEFSR0VUKGJwKQkoKGJwKS0+cGJfdGFyZ2V0KQotI2RlZmluZSBYRlNfQlVGVEFSR19OQU1FKHRhcmdldCkJXAotCQlwYWdlYnVmX3RhcmdldF9uYW1lKHRhcmdldCkKLQotI2RlZmluZSBYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIHR5cGUsIHJlZikKLSNkZWZpbmUgWEZTX0JVRl9TRVRfVlRZUEUoYnAsIHR5cGUpCi0jZGVmaW5lIFhGU19CVUZfU0VUX1JFRihicCwgcmVmKQotCi1zdGF0aWMgaW5saW5lIGludAl4ZnNfYmF3cml0ZSh2b2lkICptcCwgeGZzX2J1Zl90ICpicCkKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ZnNfYnVmX3JlbHNlKHhmc19idWZfdCAqYnApCiB7Ci0JYnAtPnBiX2ZzcHJpdjMgPSBtcDsKLQlicC0+cGJfc3RyYXQgPSB4ZnNfYmRzdHJhdF9jYjsKLQlwYWdlYnVmX2RlbHdyaV9kZXF1ZXVlKGJwKTsKLQlyZXR1cm4gcGFnZWJ1Zl9pb3N0YXJ0KGJwLCBQQkZfV1JJVEUgfCBQQkZfQVNZTkMgfCBfUEJGX1JVTl9RVUVVRVMpOworCWlmICghYnAtPmJfcmVsc2UpCisJCXhmc19idWZfdW5sb2NrKGJwKTsKKwl4ZnNfYnVmX3JlbGUoYnApOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQJeGZzX2J1Zl9yZWxzZSh4ZnNfYnVmX3QgKmJwKQotewotCWlmICghYnAtPnBiX3JlbHNlKQotCQlwYWdlYnVmX3VubG9jayhicCk7Ci0JcGFnZWJ1Zl9yZWxlKGJwKTsKLX0KLQotI2RlZmluZSB4ZnNfYnBpbihicCkJCXBhZ2VidWZfcGluKGJwKQotI2RlZmluZSB4ZnNfYnVucGluKGJwKQkJcGFnZWJ1Zl91bnBpbihicCkKKyNkZWZpbmUgeGZzX2JwaW4oYnApCQl4ZnNfYnVmX3BpbihicCkKKyNkZWZpbmUgeGZzX2J1bnBpbihicCkJCXhmc19idWZfdW5waW4oYnApCiAKICNkZWZpbmUgeGZzX2J1ZnRyYWNlKGlkLCBicCkJXAotCSAgICBwYWdlYnVmX3RyYWNlKGJwLCBpZCwgTlVMTCwgKHZvaWQgKilfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpCisJICAgIHhmc19idWZfdHJhY2UoYnAsIGlkLCBOVUxMLCAodm9pZCAqKV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSkKIAotI2RlZmluZSB4ZnNfYmlvZG9uZShwYikJCSAgICBcCi0JICAgIHBhZ2VidWZfaW9kb25lKHBiLCAwKQorI2RlZmluZSB4ZnNfYmlvZG9uZShicCkJCXhmc19idWZfaW9lbmQoYnAsIDApCiAKLSNkZWZpbmUgeGZzX2Jpb21vdmUocGIsIG9mZiwgbGVuLCBkYXRhLCBydykgXAotCSAgICBwYWdlYnVmX2lvbW92ZSgocGIpLCAob2ZmKSwgKGxlbiksIChkYXRhKSwgXAotCQkoKHJ3KSA9PSBYRlNfQl9XUklURSkgPyBQQlJXX1dSSVRFIDogUEJSV19SRUFEKQorI2RlZmluZSB4ZnNfYmlvbW92ZShicCwgb2ZmLCBsZW4sIGRhdGEsIHJ3KSBcCisJICAgIHhmc19idWZfaW9tb3ZlKChicCksIChvZmYpLCAobGVuKSwgKGRhdGEpLCBcCisJCSgocncpID09IFhGU19CX1dSSVRFKSA/IFhCUldfV1JJVEUgOiBYQlJXX1JFQUQpCiAKLSNkZWZpbmUgeGZzX2Jpb3plcm8ocGIsIG9mZiwgbGVuKSBcCi0JICAgIHBhZ2VidWZfaW9tb3ZlKChwYiksIChvZmYpLCAobGVuKSwgTlVMTCwgUEJSV19aRVJPKQorI2RlZmluZSB4ZnNfYmlvemVybyhicCwgb2ZmLCBsZW4pIFwKKwkgICAgeGZzX2J1Zl9pb21vdmUoKGJwKSwgKG9mZiksIChsZW4pLCBOVUxMLCBYQlJXX1pFUk8pCiAKIAotc3RhdGljIGlubGluZSBpbnQJWEZTX2J3cml0ZSh4ZnNfYnVmX3QgKnBiKQorc3RhdGljIGlubGluZSBpbnQgWEZTX2J3cml0ZSh4ZnNfYnVmX3QgKmJwKQogewotCWludAlpb3dhaXQgPSAocGItPnBiX2ZsYWdzICYgUEJGX0FTWU5DKSA9PSAwOworCWludAlpb3dhaXQgPSAoYnAtPmJfZmxhZ3MgJiBYQkZfQVNZTkMpID09IDA7CiAJaW50CWVycm9yID0gMDsKIAogCWlmICghaW93YWl0KQotCQlwYi0+cGJfZmxhZ3MgfD0gX1BCRl9SVU5fUVVFVUVTOworCQlicC0+Yl9mbGFncyB8PSBfWEJGX1JVTl9RVUVVRVM7CiAKLQlwYWdlYnVmX2RlbHdyaV9kZXF1ZXVlKHBiKTsKLQlwYWdlYnVmX2lvc3RyYXRlZ3kocGIpOworCXhmc19idWZfZGVsd3JpX2RlcXVldWUoYnApOworCXhmc19idWZfaW9zdHJhdGVneShicCk7CiAJaWYgKGlvd2FpdCkgewotCQllcnJvciA9IHBhZ2VidWZfaW93YWl0KHBiKTsKLQkJeGZzX2J1Zl9yZWxzZShwYik7CisJCWVycm9yID0geGZzX2J1Zl9pb3dhaXQoYnApOworCQl4ZnNfYnVmX3JlbHNlKGJwKTsKIAl9CiAJcmV0dXJuIGVycm9yOwogfQogCi0jZGVmaW5lIFhGU19iZHdyaXRlKHBiKQkJICAgICBcCi0JICAgIHBhZ2VidWZfaW9zdGFydChwYiwgUEJGX0RFTFdSSSB8IFBCRl9BU1lOQykKKyNkZWZpbmUgWEZTX2Jkd3JpdGUoYnApCQl4ZnNfYnVmX2lvc3RhcnQoYnAsIFhCRl9ERUxXUkkgfCBYQkZfQVNZTkMpCiAKIHN0YXRpYyBpbmxpbmUgaW50IHhmc19iZHdyaXRlKHZvaWQgKm1wLCB4ZnNfYnVmX3QgKmJwKQogewotCWJwLT5wYl9zdHJhdCA9IHhmc19iZHN0cmF0X2NiOwotCWJwLT5wYl9mc3ByaXYzID0gbXA7Ci0KLQlyZXR1cm4gcGFnZWJ1Zl9pb3N0YXJ0KGJwLCBQQkZfREVMV1JJIHwgUEJGX0FTWU5DKTsKKwlicC0+Yl9zdHJhdCA9IHhmc19iZHN0cmF0X2NiOworCWJwLT5iX2ZzcHJpdjMgPSBtcDsKKwlyZXR1cm4geGZzX2J1Zl9pb3N0YXJ0KGJwLCBYQkZfREVMV1JJIHwgWEJGX0FTWU5DKTsKIH0KIAotI2RlZmluZSBYRlNfYmRzdHJhdChicCkgcGFnZWJ1Zl9pb3JlcXVlc3QoYnApCisjZGVmaW5lIFhGU19iZHN0cmF0KGJwKSB4ZnNfYnVmX2lvcmVxdWVzdChicCkKIAotI2RlZmluZSB4ZnNfaW93YWl0KHBiKQlwYWdlYnVmX2lvd2FpdChwYikKKyNkZWZpbmUgeGZzX2lvd2FpdChicCkJeGZzX2J1Zl9pb3dhaXQoYnApCiAKICNkZWZpbmUgeGZzX2JhcmVhZCh0YXJnZXQsIHJhYmxrbm8sIHJhbGVuKSAgXAotCXBhZ2VidWZfcmVhZGFoZWFkKCh0YXJnZXQpLCAocmFibGtubyksIChyYWxlbiksIFBCRl9ET05UX0JMT0NLKQotCi0jZGVmaW5lIHhmc19idWZfZ2V0X2VtcHR5KGxlbiwgdGFyZ2V0KQlwYWdlYnVmX2dldF9lbXB0eSgobGVuKSwgKHRhcmdldCkpCi0jZGVmaW5lIHhmc19idWZfZ2V0X25vYWRkcihsZW4sIHRhcmdldCkJcGFnZWJ1Zl9nZXRfbm9fZGFkZHIoKGxlbiksICh0YXJnZXQpKQotI2RlZmluZSB4ZnNfYnVmX2ZyZWUoYnApCQlwYWdlYnVmX2ZyZWUoYnApCisJeGZzX2J1Zl9yZWFkYWhlYWQoKHRhcmdldCksIChyYWJsa25vKSwgKHJhbGVuKSwgWEJGX0RPTlRfQkxPQ0spCiAKIAogLyoKICAqCUhhbmRsaW5nIG9mIGJ1ZnRhcmdzLgogICovCi0KIGV4dGVybiB4ZnNfYnVmdGFyZ190ICp4ZnNfYWxsb2NfYnVmdGFyZyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIGludCk7CiBleHRlcm4gdm9pZCB4ZnNfZnJlZV9idWZ0YXJnKHhmc19idWZ0YXJnX3QgKiwgaW50KTsKIGV4dGVybiB2b2lkIHhmc193YWl0X2J1ZnRhcmcoeGZzX2J1ZnRhcmdfdCAqKTsKIGV4dGVybiBpbnQgeGZzX3NldHNpemVfYnVmdGFyZyh4ZnNfYnVmdGFyZ190ICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKIGV4dGVybiBpbnQgeGZzX2ZsdXNoX2J1ZnRhcmcoeGZzX2J1ZnRhcmdfdCAqLCBpbnQpOwogCi0jZGVmaW5lIHhmc19nZXRzaXplX2J1ZnRhcmcoYnVmdGFyZykgXAotCWJsb2NrX3NpemUoKGJ1ZnRhcmcpLT5wYnJfYmRldikKLSNkZWZpbmUgeGZzX3JlYWRvbmx5X2J1ZnRhcmcoYnVmdGFyZykgXAotCWJkZXZfcmVhZF9vbmx5KChidWZ0YXJnKS0+cGJyX2JkZXYpCi0jZGVmaW5lIHhmc19iaW52YWwoYnVmdGFyZykgXAotCXhmc19mbHVzaF9idWZ0YXJnKGJ1ZnRhcmcsIDEpCi0jZGVmaW5lIFhGU19iZmx1c2goYnVmdGFyZykgXAotCXhmc19mbHVzaF9idWZ0YXJnKGJ1ZnRhcmcsIDEpCisjZGVmaW5lIHhmc19nZXRzaXplX2J1ZnRhcmcoYnVmdGFyZykJYmxvY2tfc2l6ZSgoYnVmdGFyZyktPmJ0X2JkZXYpCisjZGVmaW5lIHhmc19yZWFkb25seV9idWZ0YXJnKGJ1ZnRhcmcpCWJkZXZfcmVhZF9vbmx5KChidWZ0YXJnKS0+YnRfYmRldikKKworI2RlZmluZSB4ZnNfYmludmFsKGJ1ZnRhcmcpCQl4ZnNfZmx1c2hfYnVmdGFyZyhidWZ0YXJnLCAxKQorI2RlZmluZSBYRlNfYmZsdXNoKGJ1ZnRhcmcpCQl4ZnNfZmx1c2hfYnVmdGFyZyhidWZ0YXJnLCAxKQogCiAjZW5kaWYJLyogX19YRlNfQlVGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfY3JlZC5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfY3JlZC5oCmluZGV4IDRhZjQ5MTAuLmU3ZjNkYTYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2NyZWQuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19jcmVkLmgKQEAgLTE4LDYgKzE4LDggQEAKICNpZm5kZWYgX19YRlNfQ1JFRF9IX18KICNkZWZpbmUgX19YRlNfQ1JFRF9IX18KIAorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKwogLyoKICAqIENyZWRlbnRpYWxzCiAgKi8KQEAgLTI3LDcgKzI5LDcgQEAKIAogZXh0ZXJuIHN0cnVjdCBjcmVkICpzeXNfY3JlZDsKIAotLyogdGhpcyBpcyBhIGhhY2suLiAoYXNzdW1zIHN5c19jcmVkIGlzIHRoZSBvbmx5IGNyZWRfdCBpbiB0aGUgc3lzdGVtKSAqLworLyogdGhpcyBpcyBhIGhhY2suLiAoYXNzdW1lcyBzeXNfY3JlZCBpcyB0aGUgb25seSBjcmVkX3QgaW4gdGhlIHN5c3RlbSkgKi8KIHN0YXRpYyBfX2lubGluZSBpbnQgY2FwYWJsZV9jcmVkKGNyZWRfdCAqY3IsIGludCBjaWQpCiB7CiAJcmV0dXJuIChjciA9PSBzeXNfY3JlZCkgPyAxIDogY2FwYWJsZShjaWQpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jCmluZGV4IDA2MTExZDAuLmNlZDQ0MDQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMKQEAgLTUwOSwxNiArNTA5LDE0IEBACiAJdm5vZGVfdAkJKnZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CiAJeGZzX21vdW50X3QJKm1wID0gWEZTX1ZGU1RPTSh2cC0+dl92ZnNwKTsKIAlpbnQJCWVycm9yID0gMDsKLQliaHZfZGVzY190CSpiZHA7CiAJeGZzX2lub2RlX3QJKmlwOwogCiAJaWYgKHZwLT52X3Zmc3AtPnZmc19mbGFnICYgVkZTX0RNSSkgewotCQliZHAgPSB2bl9iaHZfbG9va3VwKFZOX0JIVl9IRUFEKHZwKSwgJnhmc192bm9kZW9wcyk7Ci0JCWlmICghYmRwKSB7CisJCWlwID0geGZzX3Z0b2kodnApOworCQlpZiAoIWlwKSB7CiAJCQllcnJvciA9IC1FSU5WQUw7CiAJCQlnb3RvIG9wZW5fZXhlY19vdXQ7CiAJCX0KLQkJaXAgPSBYRlNfQkhWVE9JKGJkcCk7CiAJCWlmIChETV9FVkVOVF9FTkFCTEVEKHZwLT52X3Zmc3AsIGlwLCBETV9FVkVOVF9SRUFEKSkgewogCQkJZXJyb3IgPSAtWEZTX1NFTkRfREFUQShtcCwgRE1fRVZFTlRfUkVBRCwgdnAsCiAJCQkJCSAgICAgICAwLCAwLCAwLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZzX3N1YnIuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZzX3N1YnIuYwppbmRleCBmODkzNDBjLi40ZmE0YjFhIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19mc19zdWJyLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZnNfc3Vici5jCkBAIC03OSw4ICs3OSw3IEBACiAJc3RydWN0IGlub2RlCSppcCA9IExJTlZGU19HRVRfSVAodnApOwogCiAJaWYgKFZOX0NBQ0hFRCh2cCkpIHsKLQkJZmlsZW1hcF9mZGF0YXdyaXRlKGlwLT5pX21hcHBpbmcpOwotCQlmaWxlbWFwX2ZkYXRhd2FpdChpcC0+aV9tYXBwaW5nKTsKKwkJZmlsZW1hcF93cml0ZV9hbmRfd2FpdChpcC0+aV9tYXBwaW5nKTsKIAogCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhpcC0+aV9tYXBwaW5nLCBmaXJzdCk7CiAJfQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMKaW5kZXggYjc4YjVlYi4uNGRiNDc3OSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bC5jCkBAIC01Miw2ICs1Miw3IEBACiAjaW5jbHVkZSAieGZzX2RmcmFnLmgiCiAjaW5jbHVkZSAieGZzX2Zzb3BzLmgiCiAKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgpAQCAtMTQ1LDEzICsxNDYsMTAgQEAKIAogCWlmIChjbWQgIT0gWEZTX0lPQ19QQVRIX1RPX0ZTSEFORExFKSB7CiAJCXhmc19pbm9kZV90CSppcDsKLQkJYmh2X2Rlc2NfdAkqYmh2OwogCQlpbnQJCWxvY2tfbW9kZTsKIAogCQkvKiBuZWVkIHRvIGdldCBhY2Nlc3MgdG8gdGhlIHhmc19pbm9kZSB0byByZWFkIHRoZSBnZW5lcmF0aW9uICovCi0JCWJodiA9IHZuX2Jodl9sb29rdXBfdW5sb2NrZWQoVk5fQkhWX0hFQUQodnApLCAmeGZzX3Zub2Rlb3BzKTsKLQkJQVNTRVJUKGJodik7Ci0JCWlwID0gWEZTX0JIVlRPSShiaHYpOworCQlpcCA9IHhmc192dG9pKHZwKTsKIAkJQVNTRVJUKGlwKTsKIAkJbG9ja19tb2RlID0geGZzX2lsb2NrX21hcF9zaGFyZWQoaXApOwogCkBAIC01MzAsNiArNTI4LDggQEAKIAljaGFyCQkJKmtidWY7CiAJaW50CQkJZXJyb3IgPSBFRkFVTFQ7CiAKKwlpZiAoSVNfUkRPTkxZKCZ2cC0+dl9pbm9kZSkpCisJCXJldHVybiAtRVJPRlM7CiAJaWYgKElTX0lNTVVUQUJMRSgmdnAtPnZfaW5vZGUpIHx8IElTX0FQUEVORCgmdnAtPnZfaW5vZGUpKQogCQlyZXR1cm4gRVBFUk07CiAJaWYgKGxlbiA+IFhBVFRSX1NJWkVfTUFYKQpAQCAtNTU3LDYgKzU1Nyw5IEBACiB7CiAJaW50CQkJZXJyb3I7CiAKKworCWlmIChJU19SRE9OTFkoJnZwLT52X2lub2RlKSkKKwkJcmV0dXJuIC1FUk9GUzsKIAlpZiAoSVNfSU1NVVRBQkxFKCZ2cC0+dl9pbm9kZSkgfHwgSVNfQVBQRU5EKCZ2cC0+dl9pbm9kZSkpCiAJCXJldHVybiBFUEVSTTsKIApAQCAtNzQ1LDkgKzc0OCw4IEBACiAJCQkoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpID8KIAkJCW1wLT5tX3J0ZGV2X3RhcmdwIDogbXAtPm1fZGRldl90YXJncDsKIAotCQlkYS5kX21lbSA9IGRhLmRfbWluaW9zeiA9IDEgPDwgdGFyZ2V0LT5wYnJfc3NoaWZ0OwotCQkvKiBUaGUgc2l6ZSBkaW8gd2lsbCBkbyBpbiBvbmUgZ28gKi8KLQkJZGEuZF9tYXhpb3N6ID0gNjQgKiBQQUdFX0NBQ0hFX1NJWkU7CisJCWRhLmRfbWVtID0gZGEuZF9taW5pb3N6ID0gMSA8PCB0YXJnZXQtPmJ0X3NzaGlmdDsKKwkJZGEuZF9tYXhpb3N6ID0gSU5UX01BWCAmIH4oZGEuZF9taW5pb3N6IC0gMSk7CiAKIAkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZkYSwgc2l6ZW9mKGRhKSkpCiAJCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwzMi5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwzMi5jCmluZGV4IGM4M2FlMTUuLmE3YzliYTEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsMzIuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bDMyLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMKaW5kZXggMTQyMTVhNy4uNzZjNmRmMyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYwpAQCAtNTEsOCArNTEsNDQgQEAKICNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfdXRpbHMuaCIKIAorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKworLyoKKyAqIEdldCBhIFhGUyBpbm9kZSBmcm9tIGEgZ2l2ZW4gdm5vZGUuCisgKi8KK3hmc19pbm9kZV90ICoKK3hmc192dG9pKAorCXN0cnVjdCB2bm9kZQkqdnApCit7CisJYmh2X2Rlc2NfdCAgICAgICpiZHA7CisKKwliZHAgPSBiaHZfbG9va3VwX3JhbmdlKFZOX0JIVl9IRUFEKHZwKSwKKwkJCVZOT0RFX1BPU0lUSU9OX1hGUywgVk5PREVfUE9TSVRJT05fWEZTKTsKKwlpZiAodW5saWtlbHkoYmRwID09IE5VTEwpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gWEZTX0JIVlRPSShiZHApOworfQorCisvKgorICogQnJpbmcgdGhlIGF0aW1lIGluIHRoZSBYRlMgaW5vZGUgdXB0b2RhdGUuCisgKiBVc2VkIGJlZm9yZSBsb2dnaW5nIHRoZSBpbm9kZSB0byBkaXNrIG9yIHdoZW4gdGhlIExpbnV4IGlub2RlIGdvZXMgYXdheS4KKyAqLwordm9pZAoreGZzX3N5bmNocm9uaXplX2F0aW1lKAorCXhmc19pbm9kZV90CSppcCkKK3sKKwl2bm9kZV90CQkqdnA7CisKKwl2cCA9IFhGU19JVE9WX05VTEwoaXApOworCWlmICh2cCkgeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gJnZwLT52X2lub2RlOworCQlpcC0+aV9kLmRpX2F0aW1lLnRfc2VjID0gKF9faW50MzJfdClpbm9kZS0+aV9hdGltZS50dl9zZWM7CisJCWlwLT5pX2QuZGlfYXRpbWUudF9uc2VjID0gKF9faW50MzJfdClpbm9kZS0+aV9hdGltZS50dl9uc2VjOworCX0KK30KIAogLyoKICAqIENoYW5nZSB0aGUgcmVxdWVzdGVkIHRpbWVzdGFtcCBpbiB0aGUgZ2l2ZW4gaW5vZGUuCkBAIC03MywyMyArMTA5LDYgQEAKIAlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gTElOVkZTX0dFVF9JUChYRlNfSVRPVihpcCkpOwogCXRpbWVzcGVjX3QJdHY7CiAKLQkvKgotCSAqIFdlJ3JlIG5vdCBzdXBwb3NlZCB0byBjaGFuZ2UgdGltZXN0YW1wcyBpbiByZWFkb25seS1tb3VudGVkCi0JICogZmlsZXN5c3RlbXMuICBUaHJvdyBpdCBhd2F5IGlmIGFueW9uZSBhc2tzIHVzLgotCSAqLwotCWlmICh1bmxpa2VseShJU19SRE9OTFkoaW5vZGUpKSkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBEb24ndCB1cGRhdGUgYWNjZXNzIHRpbWVzdGFtcHMgb24gcmVhZHMgaWYgbW91bnRlZCAibm9hdGltZSIuCi0JICogVGhyb3cgaXQgYXdheSBpZiBhbnlvbmUgYXNrcyB1cy4KLQkgKi8KLQlpZiAodW5saWtlbHkoCi0JICAgIChpcC0+aV9tb3VudC0+bV9mbGFncyAmIFhGU19NT1VOVF9OT0FUSU1FIHx8IElTX05PQVRJTUUoaW5vZGUpKSAmJgotCSAgICAoZmxhZ3MgJiAoWEZTX0lDSEdUSU1FX0FDQ3xYRlNfSUNIR1RJTUVfTU9EfFhGU19JQ0hHVElNRV9DSEcpKSA9PQotCQkJWEZTX0lDSEdUSU1FX0FDQykpCi0JCXJldHVybjsKLQogCW5hbm90aW1lKCZ0dik7CiAJaWYgKGZsYWdzICYgWEZTX0lDSEdUSU1FX01PRCkgewogCQlpbm9kZS0+aV9tdGltZSA9IHR2OwpAQCAtMTI2LDggKzE0NSw2IEBACiAgKiBWYXJpYW50IG9uIHRoZSBhYm92ZSB3aGljaCBhdm9pZHMgcXVlcnlpbmcgdGhlIHN5c3RlbSBjbG9jawogICogaW4gc2l0dWF0aW9ucyB3aGVyZSB3ZSBrbm93IHRoZSBMaW51eCBpbm9kZSB0aW1lc3RhbXBzIGhhdmUKICAqIGp1c3QgYmVlbiB1cGRhdGVkIChhbmQgc28gd2UgY2FuIHVwZGF0ZSBvdXIgaW5vZGUgY2hlYXBseSkuCi0gKiBXZSBhbHNvIHNraXAgdGhlIHJlYWRvbmx5IGFuZCBub2F0aW1lIGNoZWNrcyBoZXJlLCB0aGV5IGFyZQotICogYWxzbyBjYXRlcmVkIGZvciBhbHJlYWR5LgogICovCiB2b2lkCiB4ZnNfaWNoZ3RpbWVfZmFzdCgKQEAgLTEzOCwzMiArMTU1LDIzIEBACiAJdGltZXNwZWNfdAkqdHZwOwogCiAJLyoKKwkgKiBBdGltZSB1cGRhdGVzIGZvciByZWFkKCkgJiBmcmllbmRzIGFyZSBoYW5kbGVkIGxhemlseSBub3csIGFuZAorCSAqIGV4cGxpY2l0IHVwZGF0ZXMgbXVzdCBnbyB0aHJvdWdoIHhmc19pY2hndGltZSgpCisJICovCisJQVNTRVJUKChmbGFncyAmIFhGU19JQ0hHVElNRV9BQ0MpID09IDApOworCisJLyoKIAkgKiBXZSdyZSBub3Qgc3VwcG9zZWQgdG8gY2hhbmdlIHRpbWVzdGFtcHMgaW4gcmVhZG9ubHktbW91bnRlZAogCSAqIGZpbGVzeXN0ZW1zLiAgVGhyb3cgaXQgYXdheSBpZiBhbnlvbmUgYXNrcyB1cy4KIAkgKi8KIAlpZiAodW5saWtlbHkoSVNfUkRPTkxZKGlub2RlKSkpCiAJCXJldHVybjsKIAotCS8qCi0JICogRG9uJ3QgdXBkYXRlIGFjY2VzcyB0aW1lc3RhbXBzIG9uIHJlYWRzIGlmIG1vdW50ZWQgIm5vYXRpbWUiLgotCSAqIFRocm93IGl0IGF3YXkgaWYgYW55b25lIGFza3MgdXMuCi0JICovCi0JaWYgKHVubGlrZWx5KAotCSAgICAoaXAtPmlfbW91bnQtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfTk9BVElNRSB8fCBJU19OT0FUSU1FKGlub2RlKSkgJiYKLQkgICAgKChmbGFncyAmIChYRlNfSUNIR1RJTUVfQUNDfFhGU19JQ0hHVElNRV9NT0R8WEZTX0lDSEdUSU1FX0NIRykpID09Ci0JCQlYRlNfSUNIR1RJTUVfQUNDKSkpCi0JCXJldHVybjsKLQogCWlmIChmbGFncyAmIFhGU19JQ0hHVElNRV9NT0QpIHsKIAkJdHZwID0gJmlub2RlLT5pX210aW1lOwogCQlpcC0+aV9kLmRpX210aW1lLnRfc2VjID0gKF9faW50MzJfdCl0dnAtPnR2X3NlYzsKIAkJaXAtPmlfZC5kaV9tdGltZS50X25zZWMgPSAoX19pbnQzMl90KXR2cC0+dHZfbnNlYzsKIAl9Ci0JaWYgKGZsYWdzICYgWEZTX0lDSEdUSU1FX0FDQykgewotCQl0dnAgPSAmaW5vZGUtPmlfYXRpbWU7Ci0JCWlwLT5pX2QuZGlfYXRpbWUudF9zZWMgPSAoX19pbnQzMl90KXR2cC0+dHZfc2VjOwotCQlpcC0+aV9kLmRpX2F0aW1lLnRfbnNlYyA9IChfX2ludDMyX3QpdHZwLT50dl9uc2VjOwotCX0KIAlpZiAoZmxhZ3MgJiBYRlNfSUNIR1RJTUVfQ0hHKSB7CiAJCXR2cCA9ICZpbm9kZS0+aV9jdGltZTsKIAkJaXAtPmlfZC5kaV9jdGltZS50X3NlYyA9IChfX2ludDMyX3QpdHZwLT50dl9zZWM7CkBAIC0yMDMsMTMgKzIxMSw0NiBAQAogCQlpcC0+aV9ubGluayA9IHZhLnZhX25saW5rOwogCQlpcC0+aV9ibG9ja3MgPSB2YS52YV9uYmxvY2tzOwogCi0JCS8qIHdlJ3JlIHVuZGVyIGlfc2VtIHNvIGlfc2l6ZSBjYW4ndCBjaGFuZ2UgdW5kZXIgdXMgKi8KKwkJLyogd2UncmUgdW5kZXIgaV9tdXRleCBzbyBpX3NpemUgY2FuJ3QgY2hhbmdlIHVuZGVyIHVzICovCiAJCWlmIChpX3NpemVfcmVhZChpcCkgIT0gdmEudmFfc2l6ZSkKIAkJCWlfc2l6ZV93cml0ZShpcCwgdmEudmFfc2l6ZSk7CiAJfQogfQogCiAvKgorICogSG9vayBpbiBTRUxpbnV4LiAgVGhpcyBpcyBub3QgcXVpdGUgY29ycmVjdCB5ZXQsIHdoYXQgd2UgcmVhbGx5IG5lZWQKKyAqIGhlcmUgKGFzIHdlIGRvIGZvciBkZWZhdWx0IEFDTHMpIGlzIGEgbWVjaGFuaXNtIGJ5IHdoaWNoIGNyZWF0aW9uIG9mCisgKiB0aGVzZSBhdHRycyBjYW4gYmUgam91cm5hbGxlZCBhdCBpbm9kZSBjcmVhdGlvbiB0aW1lIChhbG9uZyB3aXRoIHRoZQorICogaW5vZGUsIG9mIGNvdXJzZSwgc3VjaCB0aGF0IGxvZyByZXBsYXkgY2FuJ3QgY2F1c2UgdGhlc2UgdG8gYmUgbG9zdCkuCisgKi8KK1NUQVRJQyBpbnQKK2xpbnZmc19pbml0X3NlY3VyaXR5KAorCXN0cnVjdCB2bm9kZQkqdnAsCisJc3RydWN0IGlub2RlCSpkaXIpCit7CisJc3RydWN0IGlub2RlCSppcCA9IExJTlZGU19HRVRfSVAodnApOworCXNpemVfdAkJbGVuZ3RoOworCXZvaWQJCSp2YWx1ZTsKKwljaGFyCQkqbmFtZTsKKwlpbnQJCWVycm9yOworCisJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9pbml0X3NlY3VyaXR5KGlwLCBkaXIsICZuYW1lLCAmdmFsdWUsICZsZW5ndGgpOworCWlmIChlcnJvcikgeworCQlpZiAoZXJyb3IgPT0gLUVPUE5PVFNVUFApCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1lcnJvcjsKKwl9CisKKwlWT1BfQVRUUl9TRVQodnAsIG5hbWUsIHZhbHVlLCBsZW5ndGgsIEFUVFJfU0VDVVJFLCBOVUxMLCBlcnJvcik7CisJaWYgKCFlcnJvcikKKwkJVk1PRElGWSh2cCk7CisKKwlrZnJlZShuYW1lKTsKKwlrZnJlZSh2YWx1ZSk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgogICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBwcm9jZXNzIGhhcyBhIHZhbGlkIGZzX3N0cnVjdCAoa2VybmVsIGRhZW1vbnMKICAqIGxpa2Uga25mc2QgZG9uJ3QgaGF2ZSBhbiBmc19zdHJ1Y3QpLgogICoKQEAgLTI3NCw2ICszMTUsOSBAQAogCQlicmVhazsKIAl9CiAKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IGxpbnZmc19pbml0X3NlY3VyaXR5KHZwLCBkaXIpOworCiAJaWYgKGRlZmF1bHRfYWNsKSB7CiAJCWlmICghZXJyb3IpIHsKIAkJCWVycm9yID0gX0FDTF9JTkhFUklUKHZwLCAmdmEsIGRlZmF1bHRfYWNsKTsKQEAgLTI5MCw4ICszMzQsNiBAQAogCQkJCXRlYXJkb3duLmRfaW5vZGUgPSBpcCA9IExJTlZGU19HRVRfSVAodnApOwogCQkJCXRlYXJkb3duLmRfbmFtZSA9IGRlbnRyeS0+ZF9uYW1lOwogCi0JCQkJdm5fbWFya19iYWQodnApOwotCQkJCQogCQkJCWlmIChTX0lTRElSKG1vZGUpKQogCQkJCQlWT1BfUk1ESVIoZHZwLCAmdGVhcmRvd24sIE5VTEwsIGVycjIpOwogCQkJCWVsc2UKQEAgLTQyOSwxMSArNDcxLDE0IEBACiAKIAllcnJvciA9IDA7CiAJVk9QX1NZTUxJTksoZHZwLCBkZW50cnksICZ2YSwgKGNoYXIgKilzeW1uYW1lLCAmY3ZwLCBOVUxMLCBlcnJvcik7Ci0JaWYgKCFlcnJvciAmJiBjdnApIHsKLQkJaXAgPSBMSU5WRlNfR0VUX0lQKGN2cCk7Ci0JCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpcCk7Ci0JCXZhbGlkYXRlX2ZpZWxkcyhkaXIpOwotCQl2YWxpZGF0ZV9maWVsZHMoaXApOyAvKiBzaXplIG5lZWRzIHVwZGF0ZSAqLworCWlmIChsaWtlbHkoIWVycm9yICYmIGN2cCkpIHsKKwkJZXJyb3IgPSBsaW52ZnNfaW5pdF9zZWN1cml0eShjdnAsIGRpcik7CisJCWlmIChsaWtlbHkoIWVycm9yKSkgeworCQkJaXAgPSBMSU5WRlNfR0VUX0lQKGN2cCk7CisJCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaXApOworCQkJdmFsaWRhdGVfZmllbGRzKGRpcik7CisJCQl2YWxpZGF0ZV9maWVsZHMoaXApOworCQl9CiAJfQogCXJldHVybiAtZXJyb3I7CiB9CkBAIC01MDIsNyArNTQ3LDcgQEAKIAlBU1NFUlQoZGVudHJ5KTsKIAlBU1NFUlQobmQpOwogCi0JbGluayA9IChjaGFyICopa21hbGxvYyhNQVhOQU1FTEVOKzEsIEdGUF9LRVJORUwpOworCWxpbmsgPSAoY2hhciAqKWttYWxsb2MoTUFYUEFUSExFTisxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWxpbmspIHsKIAkJbmRfc2V0X2xpbmsobmQsIEVSUl9QVFIoLUVOT01FTSkpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTUxOCwxMiArNTYzLDEyIEBACiAJdnAgPSBMSU5WRlNfR0VUX1ZQKGRlbnRyeS0+ZF9pbm9kZSk7CiAKIAlpb3YuaW92X2Jhc2UgPSBsaW5rOwotCWlvdi5pb3ZfbGVuID0gTUFYTkFNRUxFTjsKKwlpb3YuaW92X2xlbiA9IE1BWFBBVEhMRU47CiAKIAl1aW8tPnVpb19pb3YgPSAmaW92OwogCXVpby0+dWlvX29mZnNldCA9IDA7CiAJdWlvLT51aW9fc2VnZmxnID0gVUlPX1NZU1NQQUNFOwotCXVpby0+dWlvX3Jlc2lkID0gTUFYTkFNRUxFTjsKKwl1aW8tPnVpb19yZXNpZCA9IE1BWFBBVEhMRU47CiAJdWlvLT51aW9faW92Y250ID0gMTsKIAogCVZPUF9SRUFETElOSyh2cCwgdWlvLCAwLCBOVUxMLCBlcnJvcik7CkBAIC01MzEsNyArNTc2LDcgQEAKIAkJa2ZyZWUobGluayk7CiAJCWxpbmsgPSBFUlJfUFRSKC1lcnJvcik7CiAJfSBlbHNlIHsKLQkJbGlua1tNQVhOQU1FTEVOIC0gdWlvLT51aW9fcmVzaWRdID0gJ1wwJzsKKwkJbGlua1tNQVhQQVRITEVOIC0gdWlvLT51aW9fcmVzaWRdID0gJ1wwJzsKIAl9CiAJa2ZyZWUodWlvKTsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5oCmluZGV4IGVlNzg0YjYuLjY4OTlhNmIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmgKQEAgLTI2LDExICsyNiw2IEBACiBleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsaW52ZnNfaW52aXNfZmlsZV9vcGVyYXRpb25zOwogZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbGludmZzX2Rpcl9vcGVyYXRpb25zOwogCi1leHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBsaW52ZnNfYW9wczsKLQotZXh0ZXJuIGludCBsaW52ZnNfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqLCBzZWN0b3JfdCwgc3RydWN0IGJ1ZmZlcl9oZWFkICosIGludCk7Ci1leHRlcm4gdm9pZCBsaW52ZnNfdW53cml0dGVuX2RvbmUoc3RydWN0IGJ1ZmZlcl9oZWFkICosIGludCk7Ci0KIGV4dGVybiBpbnQgeGZzX2lvY3RsKHN0cnVjdCBiaHZfZGVzYyAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgdW5zaWduZWQgaW50LCB2b2lkIF9fdXNlciAqKTsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfbGludXguaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2xpbnV4LmgKaW5kZXggZDhlMjFiYS4uNjczODliNyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfbGludXguaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19saW51eC5oCkBAIC0xMTAsMTAgKzExMCw2IEBACiAgKiBkZWxhbGxvYyBhbmQgdGhlc2Ugb25kaXNrLXVuaW5pdGlhbGlzZWQgYnVmZmVycy4KICAqLwogQlVGRkVSX0ZOUyhQcml2YXRlU3RhcnQsIHVud3JpdHRlbik7Ci1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2J1ZmZlcl91bndyaXR0ZW5faW8oc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKLXsKLQliaC0+Yl9lbmRfaW8gPSBsaW52ZnNfdW53cml0dGVuX2RvbmU7Ci19CiAKICNkZWZpbmUgcmVzdHJpY3RlZF9jaG93bgl4ZnNfcGFyYW1zLnJlc3RyaWN0X2Nob3duLnZhbAogI2RlZmluZSBpcml4X3NnaWRfaW5oZXJpdAl4ZnNfcGFyYW1zLnNnaWRfaW5oZXJpdC52YWwKQEAgLTIzMiw3ICsyMjgsNyBAQAogI2RlZmluZSB4ZnNfaXRydW5jYXRlX2RhdGEoaXAsIG9mZikJXAogCSgtdm10cnVuY2F0ZShMSU5WRlNfR0VUX0lQKFhGU19JVE9WKGlwKSksIChvZmYpKSkKICNkZWZpbmUgeGZzX3N0YXR2ZnNfZnNpZChzdGF0cCwgbXApCVwKLQkoeyB1NjQgaWQgPSBodWdlX2VuY29kZV9kZXYoKG1wKS0+bV9kZXYpOwlcCisJKHsgdTY0IGlkID0gaHVnZV9lbmNvZGVfZGV2KChtcCktPm1fZGRldl90YXJncC0+YnRfZGV2KTsgXAogCSAgIF9fa2VybmVsX2ZzaWRfdCAqZnNpZCA9ICYoc3RhdHApLT5mX2ZzaWQ7CVwKIAkoZnNpZC0+dmFsWzBdID0gKHUzMilpZCwgZnNpZC0+dmFsWzFdID0gKHUzMikoaWQgPj4gMzIpKTsgfSkKIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19scncuYwppbmRleCAyNzllOWJjLi5lMGFiNDVmIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19scncuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19scncuYwpAQCAtMjMzLDggKzIzMyw4IEBACiAJCXhmc19idWZ0YXJnX3QJKnRhcmdldCA9CiAJCQkoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpID8KIAkJCQltcC0+bV9ydGRldl90YXJncCA6IG1wLT5tX2RkZXZfdGFyZ3A7Ci0JCWlmICgoKm9mZnNldCAmIHRhcmdldC0+cGJyX3NtYXNrKSB8fAotCQkgICAgKHNpemUgJiB0YXJnZXQtPnBicl9zbWFzaykpIHsKKwkJaWYgKCgqb2Zmc2V0ICYgdGFyZ2V0LT5idF9zbWFzaykgfHwKKwkJICAgIChzaXplICYgdGFyZ2V0LT5idF9zbWFzaykpIHsKIAkJCWlmICgqb2Zmc2V0ID09IGlwLT5pX2QuZGlfc2l6ZSkgewogCQkJCXJldHVybiAoMCk7CiAJCQl9CkBAIC0yNTQsNyArMjU0LDcgQEAKIAl9CiAKIAlpZiAodW5saWtlbHkoaW9mbGFncyAmIElPX0lTRElSRUNUKSkKLQkJZG93bigmaW5vZGUtPmlfc2VtKTsKKwkJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19TSEFSRUQpOwogCiAJaWYgKERNX0VWRU5UX0VOQUJMRUQodnAtPnZfdmZzcCwgaXAsIERNX0VWRU5UX1JFQUQpICYmCkBAIC0yODEsMTIgKzI4MSw5IEBACiAKIAl4ZnNfaXVubG9jayhpcCwgWEZTX0lPTE9DS19TSEFSRUQpOwogCi0JaWYgKGxpa2VseSghKGlvZmxhZ3MgJiBJT19JTlZJUykpKQotCQl4ZnNfaWNoZ3RpbWVfZmFzdChpcCwgaW5vZGUsIFhGU19JQ0hHVElNRV9BQ0MpOwotCiB1bmxvY2tfaXNlbToKIAlpZiAodW5saWtlbHkoaW9mbGFncyAmIElPX0lTRElSRUNUKSkKLQkJdXAoJmlub2RlLT5pX3NlbSk7CisJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTM0Niw5ICszNDMsNiBAQAogCWlmIChyZXQgPiAwKQogCQlYRlNfU1RBVFNfQUREKHhzX3JlYWRfYnl0ZXMsIHJldCk7CiAKLQlpZiAobGlrZWx5KCEoaW9mbGFncyAmIElPX0lOVklTKSkpCi0JCXhmc19pY2hndGltZV9mYXN0KGlwLCBMSU5WRlNfR0VUX0lQKHZwKSwgWEZTX0lDSEdUSU1FX0FDQyk7Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zNjIsNyArMzU2LDYgQEAKIHhmc196ZXJvX2xhc3RfYmxvY2soCiAJc3RydWN0IGlub2RlCSppcCwKIAl4ZnNfaW9jb3JlX3QJKmlvLAotCXhmc19vZmZfdAlvZmZzZXQsCiAJeGZzX2ZzaXplX3QJaXNpemUsCiAJeGZzX2ZzaXplX3QJZW5kX3NpemUpCiB7CkBAIC0zNzEsMTkgKzM2NCwxNiBAQAogCWludAkJbmltYXBzOwogCWludAkJemVyb19vZmZzZXQ7CiAJaW50CQl6ZXJvX2xlbjsKLQlpbnQJCWlzaXplX2ZzYl9vZmZzZXQ7CiAJaW50CQllcnJvciA9IDA7CiAJeGZzX2JtYnRfaXJlY190CWltYXA7CiAJbG9mZl90CQlsb2ZmOwotCXNpemVfdAkJbHNpemU7CiAKIAlBU1NFUlQoaXNtcmxvY2tlZChpby0+aW9fbG9jaywgTVJfVVBEQVRFKSAhPSAwKTsKLQlBU1NFUlQob2Zmc2V0ID4gaXNpemUpOwogCiAJbXAgPSBpby0+aW9fbW91bnQ7CiAKLQlpc2l6ZV9mc2Jfb2Zmc2V0ID0gWEZTX0JfRlNCX09GRlNFVChtcCwgaXNpemUpOwotCWlmIChpc2l6ZV9mc2Jfb2Zmc2V0ID09IDApIHsKKwl6ZXJvX29mZnNldCA9IFhGU19CX0ZTQl9PRkZTRVQobXAsIGlzaXplKTsKKwlpZiAoemVyb19vZmZzZXQgPT0gMCkgewogCQkvKgogCQkgKiBUaGVyZSBhcmUgbm8gZXh0cmEgYnl0ZXMgaW4gdGhlIGxhc3QgYmxvY2sgb24gZGlzayB0bwogCQkgKiB6ZXJvLCBzbyByZXR1cm4uCkBAIC00MTMsMTAgKzQwMyw4IEBACiAJICovCiAJWEZTX0lVTkxPQ0sobXAsIGlvLCBYRlNfSUxPQ0tfRVhDTHwgWEZTX0VYVFNJWkVfUkQpOwogCWxvZmYgPSBYRlNfRlNCX1RPX0IobXAsIGxhc3RfZnNiKTsKLQlsc2l6ZSA9IFhGU19GU0JfVE9fQihtcCwgMSk7CiAKLQl6ZXJvX29mZnNldCA9IGlzaXplX2ZzYl9vZmZzZXQ7Ci0JemVyb19sZW4gPSBtcC0+bV9zYi5zYl9ibG9ja3NpemUgLSBpc2l6ZV9mc2Jfb2Zmc2V0OworCXplcm9fbGVuID0gbXAtPm1fc2Iuc2JfYmxvY2tzaXplIC0gemVyb19vZmZzZXQ7CiAKIAllcnJvciA9IHhmc19pb3plcm8oaXAsIGxvZmYgKyB6ZXJvX29mZnNldCwgemVyb19sZW4sIGVuZF9zaXplKTsKIApAQCAtNDQ3LDIwICs0MzUsMTcgQEAKIAlzdHJ1Y3QgaW5vZGUJKmlwID0gTElOVkZTX0dFVF9JUCh2cCk7CiAJeGZzX2ZpbGVvZmZfdAlzdGFydF96ZXJvX2ZzYjsKIAl4ZnNfZmlsZW9mZl90CWVuZF96ZXJvX2ZzYjsKLQl4ZnNfZmlsZW9mZl90CXByZXZfemVyb19mc2I7CiAJeGZzX2ZpbGVvZmZfdAl6ZXJvX2NvdW50X2ZzYjsKIAl4ZnNfZmlsZW9mZl90CWxhc3RfZnNiOwogCXhmc19leHRsZW5fdAlidWZfbGVuX2ZzYjsKLQl4ZnNfZXh0bGVuX3QJcHJldl96ZXJvX2NvdW50OwogCXhmc19tb3VudF90CSptcDsKIAlpbnQJCW5pbWFwczsKIAlpbnQJCWVycm9yID0gMDsKIAl4ZnNfYm1idF9pcmVjX3QJaW1hcDsKLQlsb2ZmX3QJCWxvZmY7Ci0Jc2l6ZV90CQlsc2l6ZTsKIAogCUFTU0VSVChpc21ybG9ja2VkKGlvLT5pb19sb2NrLCBNUl9VUERBVEUpKTsKIAlBU1NFUlQoaXNtcmxvY2tlZChpby0+aW9faW9sb2NrLCBNUl9VUERBVEUpKTsKKwlBU1NFUlQob2Zmc2V0ID4gaXNpemUpOwogCiAJbXAgPSBpby0+aW9fbW91bnQ7CiAKQEAgLTQ2OCw3ICs0NTMsNyBAQAogCSAqIEZpcnN0IGhhbmRsZSB6ZXJvaW5nIHRoZSBibG9jayBvbiB3aGljaCBpc2l6ZSByZXNpZGVzLgogCSAqIFdlIG9ubHkgemVybyBhIHBhcnQgb2YgdGhhdCBibG9jayBzbyBpdCBpcyBoYW5kbGVkIHNwZWNpYWxseS4KIAkgKi8KLQllcnJvciA9IHhmc196ZXJvX2xhc3RfYmxvY2soaXAsIGlvLCBvZmZzZXQsIGlzaXplLCBlbmRfc2l6ZSk7CisJZXJyb3IgPSB4ZnNfemVyb19sYXN0X2Jsb2NrKGlwLCBpbywgaXNpemUsIGVuZF9zaXplKTsKIAlpZiAoZXJyb3IpIHsKIAkJQVNTRVJUKGlzbXJsb2NrZWQoaW8tPmlvX2xvY2ssIE1SX1VQREFURSkpOwogCQlBU1NFUlQoaXNtcmxvY2tlZChpby0+aW9faW9sb2NrLCBNUl9VUERBVEUpKTsKQEAgLTQ5Niw4ICs0ODEsNiBAQAogCX0KIAogCUFTU0VSVChzdGFydF96ZXJvX2ZzYiA8PSBlbmRfemVyb19mc2IpOwotCXByZXZfemVyb19mc2IgPSBOVUxMRklMRU9GRjsKLQlwcmV2X3plcm9fY291bnQgPSAwOwogCXdoaWxlIChzdGFydF96ZXJvX2ZzYiA8PSBlbmRfemVyb19mc2IpIHsKIAkJbmltYXBzID0gMTsKIAkJemVyb19jb3VudF9mc2IgPSBlbmRfemVyb19mc2IgLSBzdGFydF96ZXJvX2ZzYiArIDE7CkBAIC01MTksMTAgKzUwMiw3IEBACiAJCQkgKiB0aGF0IHNpdHMgb24gYSBob2xlIGFuZCBzZXRzIHRoZSBwYWdlIGFzIFBfSE9MRQogCQkJICogYW5kIGNhbGxzIHJlbWFwZiBpZiBpdCBpcyBhIG1hcHBlZCBmaWxlLgogCQkJICovCi0JCQlwcmV2X3plcm9fZnNiID0gTlVMTEZJTEVPRkY7Ci0JCQlwcmV2X3plcm9fY291bnQgPSAwOwotCQkJc3RhcnRfemVyb19mc2IgPSBpbWFwLmJyX3N0YXJ0b2ZmICsKLQkJCQkJIGltYXAuYnJfYmxvY2tjb3VudDsKKwkJCXN0YXJ0X3plcm9fZnNiID0gaW1hcC5icl9zdGFydG9mZiArIGltYXAuYnJfYmxvY2tjb3VudDsKIAkJCUFTU0VSVChzdGFydF96ZXJvX2ZzYiA8PSAoZW5kX3plcm9fZnNiICsgMSkpOwogCQkJY29udGludWU7CiAJCX0KQEAgLTU0MywxNyArNTIzLDE1IEBACiAJCSAqLwogCQlYRlNfSVVOTE9DSyhtcCwgaW8sIFhGU19JTE9DS19FWENMfFhGU19FWFRTSVpFX1JEKTsKIAotCQlsb2ZmID0gWEZTX0ZTQl9UT19CKG1wLCBzdGFydF96ZXJvX2ZzYik7Ci0JCWxzaXplID0gWEZTX0ZTQl9UT19CKG1wLCBidWZfbGVuX2ZzYik7Ci0KLQkJZXJyb3IgPSB4ZnNfaW96ZXJvKGlwLCBsb2ZmLCBsc2l6ZSwgZW5kX3NpemUpOworCQllcnJvciA9IHhmc19pb3plcm8oaXAsCisJCQkJICAgWEZTX0ZTQl9UT19CKG1wLCBzdGFydF96ZXJvX2ZzYiksCisJCQkJICAgWEZTX0ZTQl9UT19CKG1wLCBidWZfbGVuX2ZzYiksCisJCQkJICAgZW5kX3NpemUpOwogCiAJCWlmIChlcnJvcikgewogCQkJZ290byBvdXRfbG9jazsKIAkJfQogCi0JCXByZXZfemVyb19mc2IgPSBzdGFydF96ZXJvX2ZzYjsKLQkJcHJldl96ZXJvX2NvdW50ID0gYnVmX2xlbl9mc2I7CiAJCXN0YXJ0X3plcm9fZnNiID0gaW1hcC5icl9zdGFydG9mZiArIGJ1Zl9sZW5fZnNiOwogCQlBU1NFUlQoc3RhcnRfemVyb19mc2IgPD0gKGVuZF96ZXJvX2ZzYiArIDEpKTsKIApAQCAtNjQwLDcgKzYxOCw3IEBACiAJCQkoeGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSA/CiAJCQkJbXAtPm1fcnRkZXZfdGFyZ3AgOiBtcC0+bV9kZGV2X3RhcmdwOwogCi0JCWlmICgocG9zICYgdGFyZ2V0LT5wYnJfc21hc2spIHx8IChjb3VudCAmIHRhcmdldC0+cGJyX3NtYXNrKSkKKwkJaWYgKChwb3MgJiB0YXJnZXQtPmJ0X3NtYXNrKSB8fCAoY291bnQgJiB0YXJnZXQtPmJ0X3NtYXNrKSkKIAkJCXJldHVybiBYRlNfRVJST1IoLUVJTlZBTCk7CiAKIAkJaWYgKCFWTl9DQUNIRUQodnApICYmIHBvcyA8IGlfc2l6ZV9yZWFkKGlub2RlKSkKQEAgLTY1NSw3ICs2MzMsNyBAQAogCQlpb2xvY2sgPSBYRlNfSU9MT0NLX0VYQ0w7CiAJCWxvY2t0eXBlID0gVlJXTE9DS19XUklURTsKIAotCQlkb3duKCZpbm9kZS0+aV9zZW0pOworCQltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJfSBlbHNlIHsKIAkJaW9sb2NrID0gWEZTX0lPTE9DS19TSEFSRUQ7CiAJCWxvY2t0eXBlID0gVlJXTE9DS19XUklURV9ESVJFQ1Q7CkBAIC02ODYsNyArNjY0LDcgQEAKIAkJaW50CQlkbWZsYWdzID0gRklMUF9ERUxBWV9GTEFHKGZpbGUpOwogCiAJCWlmIChuZWVkX2lzZW0pCi0JCQlkbWZsYWdzIHw9IERNX0ZMQUdTX0lTRU07CisJCQlkbWZsYWdzIHw9IERNX0ZMQUdTX0lNVVg7CiAKIAkJeGZzX2l1bmxvY2soeGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJCWVycm9yID0gWEZTX1NFTkRfREFUQSh4aXAtPmlfbW91bnQsIERNX0VWRU5UX1dSSVRFLCB2cCwKQEAgLTcxMyw3ICs2OTEsNyBAQAogCX0KIAogCWlmIChsaWtlbHkoIShpb2ZsYWdzICYgSU9fSU5WSVMpKSkgewotCQlpbm9kZV91cGRhdGVfdGltZShpbm9kZSwgMSk7CisJCWZpbGVfdXBkYXRlX3RpbWUoZmlsZSk7CiAJCXhmc19pY2hndGltZV9mYXN0KHhpcCwgaW5vZGUsCiAJCQkJICBYRlNfSUNIR1RJTUVfTU9EIHwgWEZTX0lDSEdUSU1FX0NIRyk7CiAJfQpAQCAtNzcyLDcgKzc1MCw3IEBACiAJCWlmIChuZWVkX2lzZW0pIHsKIAkJCS8qIGRlbW90ZSB0aGUgbG9jayBub3cgdGhlIGNhY2hlZCBwYWdlcyBhcmUgZ29uZSAqLwogCQkJWEZTX0lMT0NLX0RFTU9URShtcCwgaW8sIFhGU19JT0xPQ0tfRVhDTCk7Ci0JCQl1cCgmaW5vZGUtPmlfc2VtKTsKKwkJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCiAJCQlpb2xvY2sgPSBYRlNfSU9MT0NLX1NIQVJFRDsKIAkJCWxvY2t0eXBlID0gVlJXTE9DS19XUklURV9ESVJFQ1Q7CkBAIC04MTcsMjAgKzc5NSwyNCBAQAogCiAJCXhmc19yd3VubG9jayhiZHAsIGxvY2t0eXBlKTsKIAkJaWYgKG5lZWRfaXNlbSkKLQkJCXVwKCZpbm9kZS0+aV9zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJCWVycm9yID0gWEZTX1NFTkRfTkFNRVNQKHhpcC0+aV9tb3VudCwgRE1fRVZFTlRfTk9TUEFDRSwgdnAsCiAJCQkJRE1fUklHSFRfTlVMTCwgdnAsIERNX1JJR0hUX05VTEwsIE5VTEwsIE5VTEwsCiAJCQkJMCwgMCwgMCk7IC8qIERlbGF5IGZsYWcgaW50ZW50aW9uYWxseSAgdW51c2VkICovCiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X25vdW5sb2NrczsKIAkJaWYgKG5lZWRfaXNlbSkKLQkJCWRvd24oJmlub2RlLT5pX3NlbSk7CisJCQltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJCXhmc19yd2xvY2soYmRwLCBsb2NrdHlwZSk7CiAJCXBvcyA9IHhpcC0+aV9kLmRpX3NpemU7CiAJCXJldCA9IDA7CiAJCWdvdG8gcmV0cnk7CiAJfQogCisJaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJaWYgKHVubGlrZWx5KHJldCA8IDAgJiYgcmV0ICE9IC1FRkFVTFQgJiYgKm9mZnNldCA+IGlzaXplKSkKKwkJKm9mZnNldCA9IGlzaXplOworCiAJaWYgKCpvZmZzZXQgPiB4aXAtPmlfZC5kaV9zaXplKSB7CiAJCXhmc19pbG9jayh4aXAsIFhGU19JTE9DS19FWENMKTsKIAkJaWYgKCpvZmZzZXQgPiB4aXAtPmlfZC5kaV9zaXplKSB7CkBAIC05MjYsNyArOTA4LDcgQEAKIAkKIAkJeGZzX3J3dW5sb2NrKGJkcCwgbG9ja3R5cGUpOwogCQlpZiAobmVlZF9pc2VtKQotCQkJdXAoJmlub2RlLT5pX3NlbSk7CisJCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAogCQllcnJvciA9IHN5bmNfcGFnZV9yYW5nZShpbm9kZSwgbWFwcGluZywgcG9zLCByZXQpOwogCQlpZiAoIWVycm9yKQpAQCAtOTM4LDcgKzkyMCw3IEBACiAJeGZzX3J3dW5sb2NrKGJkcCwgbG9ja3R5cGUpOwogIG91dF91bmxvY2tfaXNlbToKIAlpZiAobmVlZF9pc2VtKQotCQl1cCgmaW5vZGUtPmlfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAgb3V0X25vdW5sb2NrczoKIAlyZXR1cm4gLWVycm9yOwogfQpAQCAtOTU2LDcgKzkzOCw3IEBACiAKIAltcCA9IFhGU19CVUZfRlNQUklWQVRFMyhicCwgeGZzX21vdW50X3QgKik7CiAJaWYgKCFYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgewotCQlwYWdlYnVmX2lvcmVxdWVzdChicCk7CisJCXhmc19idWZfaW9yZXF1ZXN0KGJwKTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIHsKIAkJeGZzX2J1ZnRyYWNlKCJYRlNfX0JEU1RSQVQgSU9FUlJPUiIsIGJwKTsKQEAgLTEwMDksNyArOTkxLDcgQEAKIAkJICogaWYgKFhGU19CVUZfSVNfR1JJTyhicCkpIHsKIAkJICovCiAKLQkJcGFnZWJ1Zl9pb3JlcXVlc3QoYnApOworCQl4ZnNfYnVmX2lvcmVxdWVzdChicCk7CiAJCXJldHVybiAwOwogCX0KIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3RhdHMuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N0YXRzLmMKaW5kZXggNmM0MGE3NC4uODk1NTcyMCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3RhdHMuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdGF0cy5jCkBAIC0zNCw3ICszNCw3IEBACiAJX191aW50NjRfdAl4c193cml0ZV9ieXRlcyA9IDA7CiAJX191aW50NjRfdAl4c19yZWFkX2J5dGVzID0gMDsKIAotCXN0YXRpYyBzdHJ1Y3QgeHN0YXRzX2VudHJ5IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHhzdGF0c19lbnRyeSB7CiAJCWNoYXIJKmRlc2M7CiAJCWludAllbmRwb2ludDsKIAl9IHhzdGF0c1tdID0gewpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3RhdHMuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N0YXRzLmgKaW5kZXggNTAwMjdjNC4uOGJhN2EyZiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3RhdHMuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdGF0cy5oCkBAIC0xMDksMTUgKzEwOSwxNSBAQAogCV9fdWludDMyX3QJCXZuX3JlbW92ZTsJLyogIyB0aW1lcyB2bl9yZW1vdmUgY2FsbGVkICovCiAJX191aW50MzJfdAkJdm5fZnJlZTsJLyogIyB0aW1lcyB2bl9mcmVlIGNhbGxlZCAqLwogI2RlZmluZSBYRlNTVEFUX0VORF9CVUYJCQkoWEZTU1RBVF9FTkRfVk5PREVfT1BTKzkpCi0JX191aW50MzJfdAkJcGJfZ2V0OwotCV9fdWludDMyX3QJCXBiX2NyZWF0ZTsKLQlfX3VpbnQzMl90CQlwYl9nZXRfbG9ja2VkOwotCV9fdWludDMyX3QJCXBiX2dldF9sb2NrZWRfd2FpdGVkOwotCV9fdWludDMyX3QJCXBiX2J1c3lfbG9ja2VkOwotCV9fdWludDMyX3QJCXBiX21pc3NfbG9ja2VkOwotCV9fdWludDMyX3QJCXBiX3BhZ2VfcmV0cmllczsKLQlfX3VpbnQzMl90CQlwYl9wYWdlX2ZvdW5kOwotCV9fdWludDMyX3QJCXBiX2dldF9yZWFkOworCV9fdWludDMyX3QJCXhiX2dldDsKKwlfX3VpbnQzMl90CQl4Yl9jcmVhdGU7CisJX191aW50MzJfdAkJeGJfZ2V0X2xvY2tlZDsKKwlfX3VpbnQzMl90CQl4Yl9nZXRfbG9ja2VkX3dhaXRlZDsKKwlfX3VpbnQzMl90CQl4Yl9idXN5X2xvY2tlZDsKKwlfX3VpbnQzMl90CQl4Yl9taXNzX2xvY2tlZDsKKwlfX3VpbnQzMl90CQl4Yl9wYWdlX3JldHJpZXM7CisJX191aW50MzJfdAkJeGJfcGFnZV9mb3VuZDsKKwlfX3VpbnQzMl90CQl4Yl9nZXRfcmVhZDsKIC8qIEV4dHJhIHByZWNpc2lvbiBjb3VudGVycyAqLwogCV9fdWludDY0X3QJCXhzX3hzdHJhdF9ieXRlczsKIAlfX3VpbnQ2NF90CQl4c193cml0ZV9ieXRlczsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCmluZGV4IDYxMTZiNWIuLmYyMmU0MjYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwpAQCAtMzA2LDEzICszMDYsMTUgQEAKIAkJeGZzX2ZzX2Ntbl9lcnIoQ0VfTk9URSwgbXAsCiAJCSAgIkRpc2FibGluZyBiYXJyaWVycywgbm90IHN1cHBvcnRlZCB3aXRoIGV4dGVybmFsIGxvZyBkZXZpY2UiKTsKIAkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF9CQVJSSUVSOworCQlyZXR1cm47CiAJfQogCi0JaWYgKG1wLT5tX2RkZXZfdGFyZ3AtPnBicl9iZGV2LT5iZF9kaXNrLT5xdWV1ZS0+b3JkZXJlZCA9PQorCWlmIChtcC0+bV9kZGV2X3RhcmdwLT5idF9iZGV2LT5iZF9kaXNrLT5xdWV1ZS0+b3JkZXJlZCA9PQogCQkJCQlRVUVVRV9PUkRFUkVEX05PTkUpIHsKIAkJeGZzX2ZzX2Ntbl9lcnIoQ0VfTk9URSwgbXAsCiAJCSAgIkRpc2FibGluZyBiYXJyaWVycywgbm90IHN1cHBvcnRlZCBieSB0aGUgdW5kZXJseWluZyBkZXZpY2UiKTsKIAkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF9CQVJSSUVSOworCQlyZXR1cm47CiAJfQogCiAJZXJyb3IgPSB4ZnNfYmFycmllcl90ZXN0KG1wKTsKQEAgLTMyMCw2ICszMjIsNyBAQAogCQl4ZnNfZnNfY21uX2VycihDRV9OT1RFLCBtcCwKIAkJICAiRGlzYWJsaW5nIGJhcnJpZXJzLCB0cmlhbCBiYXJyaWVyIHdyaXRlIGZhaWxlZCIpOwogCQltcC0+bV9mbGFncyAmPSB+WEZTX01PVU5UX0JBUlJJRVI7CisJCXJldHVybjsKIAl9CiB9CiAKQEAgLTMyNyw3ICszMzAsNyBAQAogeGZzX2Jsa2Rldl9pc3N1ZV9mbHVzaCgKIAl4ZnNfYnVmdGFyZ190CQkqYnVmdGFyZykKIHsKLQlibGtkZXZfaXNzdWVfZmx1c2goYnVmdGFyZy0+cGJyX2JkZXYsIE5VTEwpOworCWJsa2Rldl9pc3N1ZV9mbHVzaChidWZ0YXJnLT5idF9iZGV2LCBOVUxMKTsKIH0KIAogU1RBVElDIHN0cnVjdCBpbm9kZSAqCkBAIC01NzYsNyArNTc5LDcgQEAKIAkJdGltZWxlZnQgPSBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZWxlZnQpOwogCQkvKiBzd3N1c3AgKi8KIAkJdHJ5X3RvX2ZyZWV6ZSgpOwotCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGxpc3RfZW1wdHkoJnZmc3AtPnZmc19zeW5jX2xpc3QpKQogCQkJYnJlYWs7CiAKIAkJc3Bpbl9sb2NrKCZ2ZnNwLT52ZnNfc3luY19sb2NrKTsKQEAgLTk2Niw5ICs5NjksOSBAQAogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gdW5kb196b25lczsKIAotCWVycm9yID0gcGFnZWJ1Zl9pbml0KCk7CisJZXJyb3IgPSB4ZnNfYnVmX2luaXQoKTsKIAlpZiAoZXJyb3IgPCAwKQotCQlnb3RvIHVuZG9fcGFnZWJ1ZjsKKwkJZ290byB1bmRvX2J1ZmZlcnM7CiAKIAl2bl9pbml0KCk7CiAJeGZzX2luaXQoKTsKQEAgLTk4Miw5ICs5ODUsOSBAQAogCXJldHVybiAwOwogCiB1bmRvX3JlZ2lzdGVyOgotCXBhZ2VidWZfdGVybWluYXRlKCk7CisJeGZzX2J1Zl90ZXJtaW5hdGUoKTsKIAotdW5kb19wYWdlYnVmOgordW5kb19idWZmZXJzOgogCWxpbnZmc19kZXN0cm95X3pvbmVzKCk7CiAKIHVuZG9fem9uZXM6CkBAIC05OTgsNyArMTAwMSw3IEBACiAJWEZTX0RNX0VYSVQoJnhmc19mc190eXBlKTsKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnhmc19mc190eXBlKTsKIAl4ZnNfY2xlYW51cCgpOwotCXBhZ2VidWZfdGVybWluYXRlKCk7CisJeGZzX2J1Zl90ZXJtaW5hdGUoKTsKIAlsaW52ZnNfZGVzdHJveV96b25lcygpOwogCWt0cmFjZV91bmluaXQoKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5jCmluZGV4IGU5YmJjYjQuLjI2MGRkODQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuYwpAQCAtMTA2LDcgKzEwNiw2IEBACiAJaW5vZGUtPmlfYmxvY2tzCSAgICA9IHZhcC0+dmFfbmJsb2NrczsKIAlpbm9kZS0+aV9tdGltZQkgICAgPSB2YXAtPnZhX210aW1lOwogCWlub2RlLT5pX2N0aW1lCSAgICA9IHZhcC0+dmFfY3RpbWU7Ci0JaW5vZGUtPmlfYXRpbWUJICAgID0gdmFwLT52YV9hdGltZTsKIAlpbm9kZS0+aV9ibGtzaXplICAgID0gdmFwLT52YV9ibG9ja3NpemU7CiAJaWYgKHZhcC0+dmFfeGZsYWdzICYgWEZTX1hGTEFHX0lNTVVUQUJMRSkKIAkJaW5vZGUtPmlfZmxhZ3MgfD0gU19JTU1VVEFCTEU7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuaAppbmRleCBmMmJiYjMyLi4wZmUyNDE5IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmgKQEAgLTU2Niw2ICs1NjYsMjUgQEAKIH0KIAogLyoKKyAqIEV4dHJhY3RpbmcgYXRpbWUgdmFsdWVzIGluIHZhcmlvdXMgZm9ybWF0cworICovCitzdGF0aWMgaW5saW5lIHZvaWQgdm5fYXRpbWVfdG9fYnN0aW1lKHN0cnVjdCB2bm9kZSAqdnAsIHhmc19ic3RpbWVfdCAqYnNfYXRpbWUpCit7CisJYnNfYXRpbWUtPnR2X3NlYyA9IHZwLT52X2lub2RlLmlfYXRpbWUudHZfc2VjOworCWJzX2F0aW1lLT50dl9uc2VjID0gdnAtPnZfaW5vZGUuaV9hdGltZS50dl9uc2VjOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdm5fYXRpbWVfdG9fdGltZXNwZWMoc3RydWN0IHZub2RlICp2cCwgc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwkqdHMgPSB2cC0+dl9pbm9kZS5pX2F0aW1lOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdm5fYXRpbWVfdG9fdGltZV90KHN0cnVjdCB2bm9kZSAqdnAsIHRpbWVfdCAqdHQpCit7CisJKnR0ID0gdnAtPnZfaW5vZGUuaV9hdGltZS50dl9zZWM7Cit9CisKKy8qCiAgKiBTb21lIHVzZWZ1bCBwcmVkaWNhdGVzLgogICovCiAjZGVmaW5lIFZOX01BUFBFRCh2cCkJbWFwcGluZ19tYXBwZWQoTElOVkZTX0dFVF9JUCh2cCktPmlfbWFwcGluZykKZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuYyBiL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuYwppbmRleCAwMGI1MDQzLi43NzJhYzQ4IDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmMKKysrIGIvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIAkgKi8KIAlpZiAoYnJhbmRuZXdkcXVvdCkgewogCQlkcXAtPmRxX2ZsbmV4dCA9IGRxcC0+ZHFfZmxwcmV2ID0gZHFwOwotCQltdXRleF9pbml0KCZkcXAtPnFfcWxvY2ssICBNVVRFWF9ERUZBVUxULCAieGRxIik7CisJCW11dGV4X2luaXQoJmRxcC0+cV9xbG9jayk7CiAJCWluaXRuc2VtYSgmZHFwLT5xX2Zsb2NrLCAxLCAiZmRxIik7CiAJCXN2X2luaXQoJmRxcC0+cV9waW53YWl0LCBTVl9ERUZBVUxULCAicGRxIik7CiAKQEAgLTEzODIsNyArMTM4Miw3IEBACiB4ZnNfZHFsb2NrKAogCXhmc19kcXVvdF90ICpkcXApCiB7Ci0JbXV0ZXhfbG9jaygmKGRxcC0+cV9xbG9jayksIFBJTk9EKTsKKwltdXRleF9sb2NrKCYoZHFwLT5xX3Fsb2NrKSk7CiB9CiAKIHZvaWQKZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3RfaXRlbS5jIGIvZnMveGZzL3F1b3RhL3hmc19kcXVvdF9pdGVtLmMKaW5kZXggMmY2OTgyMi4uMmVjNmI0NCAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdF9pdGVtLmMKKysrIGIvZnMveGZzL3F1b3RhL3hmc19kcXVvdF9pdGVtLmMKQEAgLTIzOSw3ICsyMzksNyBAQAogCSAqIHRyeWluZyB0byBkdXBsaWNhdGUgb3VyIGVmZm9ydC4KIAkgKi8KIAlBU1NFUlQocWlwLT5xbGlfcHVzaGJ1Zl9mbGFnICE9IDApOwotCUFTU0VSVChxaXAtPnFsaV9wdXNoX293bmVyID09IGdldF90aHJlYWRfaWQoKSk7CisJQVNTRVJUKHFpcC0+cWxpX3B1c2hfb3duZXIgPT0gY3VycmVudF9waWQoKSk7CiAKIAkvKgogCSAqIElmIGZsdXNobG9jayBpc24ndCBsb2NrZWQgYW55bW9yZSwgY2hhbmNlcyBhcmUgdGhhdCB0aGUKQEAgLTMzMyw3ICszMzMsNyBAQAogCQkJcWlwLT5xbGlfcHVzaGJ1Zl9mbGFnID0gMTsKIAkJCUFTU0VSVChxaXAtPnFsaV9mb3JtYXQucWxmX2Jsa25vID09IGRxcC0+cV9ibGtubyk7CiAjaWZkZWYgREVCVUcKLQkJCXFpcC0+cWxpX3B1c2hfb3duZXIgPSBnZXRfdGhyZWFkX2lkKCk7CisJCQlxaXAtPnFsaV9wdXNoX293bmVyID0gY3VycmVudF9waWQoKTsKICNlbmRpZgogCQkJLyoKIAkJCSAqIFRoZSBkcXVvdCBpcyBsZWZ0IGxvY2tlZC4KZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfcW0uYyBiL2ZzL3hmcy9xdW90YS94ZnNfcW0uYwppbmRleCA1MzI4YTI5My4uNTNhMDBmYjIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfcW0uYworKysgYi9mcy94ZnMvcXVvdGEveGZzX3FtLmMKQEAgLTE2Nyw3ICsxNjcsNyBAQAogCXhxbS0+cW1fZHFmcmVlX3JhdGlvID0gWEZTX1FNX0RRRlJFRV9SQVRJTzsKIAl4cW0tPnFtX25yZWZzID0gMDsKICNpZmRlZiBERUJVRwotCW11dGV4X2luaXQoJnFjaGVja19sb2NrLCBNVVRFWF9ERUZBVUxULCAicWNoayIpOworCW11dGV4X2luaXQoJnFjaGVja19sb2NrKTsKICNlbmRpZgogCXJldHVybiB4cW07CiB9CkBAIC00OTcsNyArNDk3LDcgQEAKIAlpbnQJCWVycm9yOwogCiAJaWYgKG1wLT5tX3F1b3RhaW5mbyA9PSBOVUxMKQotCQlyZXR1cm4gKDApOworCQlyZXR1cm4gMDsKIAluaXRlcnMgPSAwOwogYWdhaW46CiAJeGZzX3FtX21wbGlzdF9sb2NrKG1wKTsKQEAgLTUyOCw3ICs1MjgsNyBAQAogCQllcnJvciA9IHhmc19xbV9kcWZsdXNoKGRxcCwgZmxhZ3MpOwogCQl4ZnNfZHF1bmxvY2soZHFwKTsKIAkJaWYgKGVycm9yKQotCQkJcmV0dXJuIChlcnJvcik7CisJCQlyZXR1cm4gZXJyb3I7CiAKIAkJeGZzX3FtX21wbGlzdF9sb2NrKG1wKTsKIAkJaWYgKHJlY2wgIT0gWEZTX1FJX01QTFJFQ0xBSU1TKG1wKSkgewpAQCAtNTQwLDcgKzU0MCw3IEBACiAKIAl4ZnNfcW1fbXBsaXN0X3VubG9jayhtcCk7CiAJLyogcmV0dXJuICEgYnVzeSAqLwotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CiAvKgogICogUmVsZWFzZSB0aGUgZ3JvdXAgZHF1b3QgcG9pbnRlcnMgdGhlIHVzZXIgZHF1b3RzIG1heSBiZQpAQCAtNTk5LDcgKzU5OSw3IEBACiAJaW50CQlubWlzc2VzOwogCiAJaWYgKG1wLT5tX3F1b3RhaW5mbyA9PSBOVUxMKQotCQlyZXR1cm4gKDApOworCQlyZXR1cm4gMDsKIAogCWRxdHlwZSA9IChmbGFncyAmIFhGU19RTU9QVF9VUVVPVEEpID8gWEZTX0RRX1VTRVIgOiAwOwogCWRxdHlwZSB8PSAoZmxhZ3MgJiBYRlNfUU1PUFRfUFFVT1RBKSA/IFhGU19EUV9QUk9KIDogMDsKQEAgLTc5Niw3ICs3OTYsNyBAQAogCQkJQVNTRVJUKFhGU19EUV9JU19MT0NLRUQoZHFwKSk7CiAJfQogI2VuZGlmCi0JcmV0dXJuIChlcnJvcik7CisJcmV0dXJuIGVycm9yOwogfQogCiAKQEAgLTg5Nyw3ICs4OTcsNyBAQAogCSAgICAoISBYRlNfTk9UX0RRQVRUQUNIRUQobXAsIGlwKSkgfHwKIAkgICAgKGlwLT5pX2lubyA9PSBtcC0+bV9zYi5zYl91cXVvdGlubykgfHwKIAkgICAgKGlwLT5pX2lubyA9PSBtcC0+bV9zYi5zYl9ncXVvdGlubykpCi0JCXJldHVybiAoMCk7CisJCXJldHVybiAwOwogCiAJQVNTRVJUKChmbGFncyAmIFhGU19RTU9QVF9JTE9DS0VEKSA9PSAwIHx8CiAJICAgICAgIFhGU19JU0xPQ0tFRF9JTk9ERV9FWENMKGlwKSk7CkBAIC05ODQsNyArOTg0LDcgQEAKIAllbHNlCiAJCUFTU0VSVChYRlNfSVNMT0NLRURfSU5PREVfRVhDTChpcCkpOwogI2VuZGlmCi0JcmV0dXJuIChlcnJvcik7CisJcmV0dXJuIGVycm9yOwogfQogCiAvKgpAQCAtMTA0OSw3ICsxMDQ5LDcgQEAKIAkgKi8KIAlpZiAoISBYRlNfSVNfUVVPVEFfT04obXApKSB7CiAJCXhmc19xbV9tcGxpc3RfdW5sb2NrKG1wKTsKLQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuIDA7CiAJfQogCUZPUkVBQ0hfRFFVT1RfSU5fTVAoZHFwLCBtcCkgewogCQkvKgpAQCAtMTEwOSw5ICsxMTA5LDkgQEAKIAkJZXJyb3IgPSB4ZnNfcW1fZHFmbHVzaChkcXAsIGZsdXNoX2ZsYWdzKTsKIAkJeGZzX2RxdW5sb2NrKGRxcCk7CiAJCWlmIChlcnJvciAmJiBYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKLQkJCXJldHVybigwKTsJLyogTmVlZCB0byBwcmV2ZW50IHVtb3VudCBmYWlsdXJlICovCisJCQlyZXR1cm4gMDsJLyogTmVlZCB0byBwcmV2ZW50IHVtb3VudCBmYWlsdXJlICovCiAJCWVsc2UgaWYgKGVycm9yKQotCQkJcmV0dXJuIChlcnJvcik7CisJCQlyZXR1cm4gZXJyb3I7CiAKIAkJeGZzX3FtX21wbGlzdF9sb2NrKG1wKTsKIAkJaWYgKHJlY2wgIT0gWEZTX1FJX01QTFJFQ0xBSU1TKG1wKSkgewpAQCAtMTEyNCw3ICsxMTI0LDcgQEAKIAl9CiAKIAl4ZnNfcW1fbXBsaXN0X3VubG9jayhtcCk7Ci0JcmV0dXJuICgwKTsKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC0xMTQ2LDcgKzExNDYsNyBAQAogCSAqIFRlbGwgWFFNIHRoYXQgd2UgZXhpc3QgYXMgc29vbiBhcyBwb3NzaWJsZS4KIAkgKi8KIAlpZiAoKGVycm9yID0geGZzX3FtX2hvbGRfcXVvdGFmc19yZWYobXApKSkgewotCQlyZXR1cm4gKGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOwogCX0KIAogCXFpbmYgPSBtcC0+bV9xdW90YWluZm8gPSBrbWVtX3phbGxvYyhzaXplb2YoeGZzX3F1b3RhaW5mb190KSwgS01fU0xFRVApOwpAQCAtMTE1OCw3ICsxMTU4LDcgQEAKIAlpZiAoKGVycm9yID0geGZzX3FtX2luaXRfcXVvdGFpbm9zKG1wKSkpIHsKIAkJa21lbV9mcmVlKHFpbmYsIHNpemVvZih4ZnNfcXVvdGFpbmZvX3QpKTsKIAkJbXAtPm1fcXVvdGFpbmZvID0gTlVMTDsKLQkJcmV0dXJuIChlcnJvcik7CisJCXJldHVybiBlcnJvcjsKIAl9CiAKIAlzcGlubG9ja19pbml0KCZxaW5mLT5xaV9waW5sb2NrLCAieGZzX3FpbmZfcGluIik7CkBAIC0xMTY2LDcgKzExNjYsNyBAQAogCXFpbmYtPnFpX2RxcmVjbGFpbXMgPSAwOwogCiAJLyogbXV0ZXggdXNlZCB0byBzZXJpYWxpemUgcXVvdGFvZmZzICovCi0JbXV0ZXhfaW5pdCgmcWluZi0+cWlfcXVvdGFvZmZsb2NrLCBNVVRFWF9ERUZBVUxULCAicW9mZiIpOworCW11dGV4X2luaXQoJnFpbmYtPnFpX3F1b3Rhb2ZmbG9jayk7CiAKIAkvKiBQcmVjYWxjIHNvbWUgY29uc3RhbnRzICovCiAJcWluZi0+cWlfZHFjaHVua2xlbiA9IFhGU19GU0JfVE9fQkIobXAsIFhGU19EUVVPVF9DTFVTVEVSX1NJWkVfRlNCKTsKQEAgLTEyMzIsNyArMTIzMiw3IEBACiAJCXFpbmYtPnFpX3J0Yndhcm5saW1pdCA9IFhGU19RTV9SVEJXQVJOTElNSVQ7CiAJfQogCi0JcmV0dXJuICgwKTsKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC0xMjg1LDcgKzEyODUsNyBAQAogCWNoYXIJCSpzdHIsCiAJaW50CQluKQogewotCW11dGV4X2luaXQoJmxpc3QtPnFoX2xvY2ssIE1VVEVYX0RFRkFVTFQsIHN0cik7CisJbXV0ZXhfaW5pdCgmbGlzdC0+cWhfbG9jayk7CiAJbGlzdC0+cWhfbmV4dCA9IE5VTEw7CiAJbGlzdC0+cWhfdmVyc2lvbiA9IDA7CiAJbGlzdC0+cWhfbmVsZW1zID0gMDsKQEAgLTEzMzIsNyArMTMzMiw3IEBACiAJCQkgKi8KIAkJCUFTU0VSVChlcnJvciAhPSBFU1JDSCk7CiAJCQlBU1NFUlQoZXJyb3IgIT0gRU5PRU5UKTsKLQkJCXJldHVybiAoZXJyb3IpOworCQkJcmV0dXJuIGVycm9yOwogCQl9CiAJCUFTU0VSVCh1ZHFwKTsKIAl9CkBAIC0xMzU1LDcgKzEzNTUsNyBAQAogCQkJCXhmc19xbV9kcXJlbGUodWRxcCk7CiAJCQlBU1NFUlQoZXJyb3IgIT0gRVNSQ0gpOwogCQkJQVNTRVJUKGVycm9yICE9IEVOT0VOVCk7Ci0JCQlyZXR1cm4gKGVycm9yKTsKKwkJCXJldHVybiBlcnJvcjsKIAkJfQogCQlBU1NFUlQoZ2RxcCk7CiAKQEAgLTEzNzYsNyArMTM3Niw3IEBACiAJaWYgKHVkcXApIEFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKHVkcXApKTsKIAlpZiAoZ2RxcCkgQVNTRVJUKFhGU19EUV9JU19MT0NLRUQoZ2RxcCkpOwogI2VuZGlmCi0JcmV0dXJuICgwKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTEzOTIsMjYgKzEzOTIsMjggQEAKIHsKIAl4ZnNfdHJhbnNfdAkqdHA7CiAJaW50CQllcnJvcjsKLQl1bnNpZ25lZCBsb25nIHM7CisJdW5zaWduZWQgbG9uZwlzOwogCWNyZWRfdAkJemVyb2NyOworCXhmc19pbm9kZV90CXplcm9pbm87CiAJaW50CQljb21taXR0ZWQ7CiAKLQl0cCA9IHhmc190cmFuc19hbGxvYyhtcCxYRlNfVFJBTlNfUU1fUUlOT0NSRUFURSk7CisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19RTV9RSU5PQ1JFQVRFKTsKIAlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsCiAJCQkJICAgICAgWEZTX1FNX1FJTk9DUkVBVEVfU1BBQ0VfUkVTKG1wKSwKIAkJCQkgICAgICBYRlNfQ1JFQVRFX0xPR19SRVMobXApLCAwLAogCQkJCSAgICAgIFhGU19UUkFOU19QRVJNX0xPR19SRVMsCiAJCQkJICAgICAgWEZTX0NSRUFURV9MT0dfQ09VTlQpKSkgewogCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKLQkJcmV0dXJuIChlcnJvcik7CisJCXJldHVybiBlcnJvcjsKIAl9CiAJbWVtc2V0KCZ6ZXJvY3IsIDAsIHNpemVvZih6ZXJvY3IpKTsKKwltZW1zZXQoJnplcm9pbm8sIDAsIHNpemVvZih6ZXJvaW5vKSk7CiAKLQlpZiAoKGVycm9yID0geGZzX2Rpcl9pYWxsb2MoJnRwLCBtcC0+bV9yb290aXAsIFNfSUZSRUcsIDEsIDAsCisJaWYgKChlcnJvciA9IHhmc19kaXJfaWFsbG9jKCZ0cCwgJnplcm9pbm8sIFNfSUZSRUcsIDEsIDAsCiAJCQkJICAgJnplcm9jciwgMCwgMSwgaXAsICZjb21taXR0ZWQpKSkgewogCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTIHwKIAkJCQkgWEZTX1RSQU5TX0FCT1JUKTsKLQkJcmV0dXJuIChlcnJvcik7CisJCXJldHVybiBlcnJvcjsKIAl9CiAKIAkvKgpAQCAtMTQ1OSw5ICsxNDYxLDkgQEAKIAlpZiAoKGVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUywKIAkJCQkgICAgIE5VTEwpKSkgewogCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsICJYRlMgcWlub19hbGxvYyBmYWlsZWQhIik7Ci0JCXJldHVybiAoZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CiAJfQotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CiAKIApAQCAtMTUwNiw3ICsxNTA4LDcgQEAKIAkJZGRxID0gKHhmc19kaXNrX2RxdW90X3QgKikgKCh4ZnNfZHFibGtfdCAqKWRkcSArIDEpOwogCX0KIAotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CiAKIFNUQVRJQyBpbnQKQEAgLTE1NTUsNyArMTU1Nyw3IEBACiAJCWJubysrOwogCQlmaXJzdGlkICs9IFhGU19RTV9EUVBFUkJMSyhtcCk7CiAJfQotCXJldHVybiAoZXJyb3IpOworCXJldHVybiBlcnJvcjsKIH0KIAogLyoKQEAgLTE1ODQsNyArMTU4Niw3IEBACiAJICogaGFwcGVucyBvbmx5IGF0IG1vdW50IHRpbWUgd2hpY2ggaXMgc2luZ2xlIHRocmVhZGVkLgogCSAqLwogCWlmIChxaXAtPmlfZC5kaV9uYmxvY2tzID09IDApCi0JCXJldHVybiAoMCk7CisJCXJldHVybiAwOwogCiAJbWFwID0ga21lbV9hbGxvYyhYRlNfRFFJVEVSX01BUF9TSVpFICogc2l6ZW9mKCptYXApLCBLTV9TTEVFUCk7CiAKQEAgLTE2NTMsNyArMTY1NSw3IEBACiAKIAlrbWVtX2ZyZWUobWFwLCBYRlNfRFFJVEVSX01BUF9TSVpFICogc2l6ZW9mKCptYXApKTsKIAotCXJldHVybiAoZXJyb3IpOworCXJldHVybiBlcnJvcjsKIH0KIAogLyoKQEAgLTE3MTMsNyArMTcxNSw3IEBACiAJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgWEZTX0RBVEFfRk9SSyk7CiAJaWYgKCEoaWZwLT5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpKSB7CiAJCWlmICgoZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyhOVUxMLCBpcCwgWEZTX0RBVEFfRk9SSykpKQotCQkJcmV0dXJuIChlcnJvcik7CisJCQlyZXR1cm4gZXJyb3I7CiAJfQogCXJ0YmxrcyA9IDA7CiAJbmV4dGVudHMgPSBpZnAtPmlmX2J5dGVzIC8gc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKQEAgLTE3MjEsNyArMTcyMyw3IEBACiAJZm9yIChlcCA9IGJhc2U7IGVwIDwgJmJhc2VbbmV4dGVudHNdOyBlcCsrKQogCQlydGJsa3MgKz0geGZzX2JtYnRfZ2V0X2Jsb2NrY291bnQoZXApOwogCSpPX3J0YmxrcyA9ICh4ZnNfcWNudF90KXJ0YmxrczsKLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTc2NSw3ICsxNzY3LDcgQEAKIAkgKi8KIAlpZiAoKGVycm9yID0geGZzX2lnZXQobXAsIE5VTEwsIGlubywgMCwgWEZTX0lMT0NLX0VYQ0wsICZpcCwgYm5vKSkpIHsKIAkJKnJlcyA9IEJVTEtTVEFUX1JWX05PVEhJTkc7Ci0JCXJldHVybiAoZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CiAJfQogCiAJaWYgKGlwLT5pX2QuZGlfbW9kZSA9PSAwKSB7CkBAIC0xNzgzLDcgKzE3ODUsNyBAQAogCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHFnZXRfbm9hdHRhY2goaXAsICZ1ZHFwLCAmZ2RxcCkpKSB7CiAJCXhmc19pcHV0KGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJCSpyZXMgPSBCVUxLU1RBVF9SVl9HSVZFVVA7Ci0JCXJldHVybiAoZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CiAJfQogCiAJcnRibGtzID0gMDsKQEAgLTE4MDAsNyArMTgwMiw3IEBACiAJCQlpZiAoZ2RxcCkKIAkJCQl4ZnNfcW1fZHFwdXQoZ2RxcCk7CiAJCQkqcmVzID0gQlVMS1NUQVRfUlZfR0lWRVVQOwotCQkJcmV0dXJuIChlcnJvcik7CisJCQlyZXR1cm4gZXJyb3I7CiAJCX0KIAkJbmJsa3MgPSAoeGZzX3FjbnRfdClpcC0+aV9kLmRpX25ibG9ja3MgLSBydGJsa3M7CiAJfQpAQCAtMTg0NSw3ICsxODQ3LDcgQEAKIAkgKiBHb3RvIG5leHQgaW5vZGUuCiAJICovCiAJKnJlcyA9IEJVTEtTVEFUX1JWX0RJRE9ORTsKLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTkxOCw5ICsxOTIwLDcgQEAKIAkgKiBhdCB0aGlzIHBvaW50IChiZWNhdXNlIHdlIGludGVudGlvbmFsbHkgZGlkbid0IGluIGRxZ2V0X25vYXR0YWNoKS4KIAkgKi8KIAlpZiAoZXJyb3IpIHsKLQkJeGZzX3FtX2RxcHVyZ2VfYWxsKG1wLAotCQkJCSAgIFhGU19RTU9QVF9VUVVPVEF8WEZTX1FNT1BUX0dRVU9UQXwKLQkJCQkgICBYRlNfUU1PUFRfUFFVT1RBfFhGU19RTU9QVF9RVU9UQU9GRik7CisJCXhmc19xbV9kcXB1cmdlX2FsbChtcCwgWEZTX1FNT1BUX1FVT1RBTEwgfCBYRlNfUU1PUFRfUVVPVEFPRkYpOwogCQlnb3RvIGVycm9yX3JldHVybjsKIAl9CiAJLyoKQEAgLTIwNDEsNyArMjA0MSw3IEBACiAJWEZTX1FJX1VRSVAobXApID0gdWlwOwogCVhGU19RSV9HUUlQKG1wKSA9IGdpcDsKIAotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CiAKIApAQCAtMjA2Miw3ICsyMDYyLDcgQEAKIAlpbnQJCW5mbHVzaGVzOwogCiAJaWYgKGhvd21hbnkgPD0gMCkKLQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuIDA7CiAKIAlucmVjbGFpbWVkID0gMDsKIAlyZXN0YXJ0cyA9IDA7CkBAIC0yMDg4LDcgKzIwODgsNyBAQAogCQkJeGZzX2RxdW5sb2NrKGRxcCk7CiAJCQl4ZnNfcW1fZnJlZWxpc3RfdW5sb2NrKHhmc19HcW0pOwogCQkJaWYgKCsrcmVzdGFydHMgPj0gWEZTX1FNX1JFQ0xBSU1fTUFYX1JFU1RBUlRTKQotCQkJCXJldHVybiAobnJlY2xhaW1lZCk7CisJCQkJcmV0dXJuIG5yZWNsYWltZWQ7CiAJCQlYUU1fU1RBVFNfSU5DKHhxbXN0YXRzLnhzX3FtX2Rxd2FudHMpOwogCQkJZ290byB0cnlhZ2FpbjsKIAkJfQpAQCAtMjE2Myw3ICsyMTYzLDcgQEAKIAkJCVhGU19EUV9IQVNIX1VOTE9DSyhoYXNoKTsKIAkJCXhmc19xbV9mcmVlbGlzdF91bmxvY2soeGZzX0dxbSk7CiAJCQlpZiAoKytyZXN0YXJ0cyA+PSBYRlNfUU1fUkVDTEFJTV9NQVhfUkVTVEFSVFMpCi0JCQkJcmV0dXJuIChucmVjbGFpbWVkKTsKKwkJCQlyZXR1cm4gbnJlY2xhaW1lZDsKIAkJCWdvdG8gdHJ5YWdhaW47CiAJCX0KIAkJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiRFFTSEFLRTogVU5MSU5LSU5HIik7CkBAIC0yMTg4LDcgKzIxODgsNyBAQAogCQlkcXAgPSBuZXh0ZHFwOwogCX0KIAl4ZnNfcW1fZnJlZWxpc3RfdW5sb2NrKHhmc19HcW0pOwotCXJldHVybiAobnJlY2xhaW1lZCk7CisJcmV0dXJuIG5yZWNsYWltZWQ7CiB9CiAKIApAQCAtMjIwMiw5ICsyMjAyLDkgQEAKIAlpbnQJbmRxdXNlZCwgbmZyZWUsIG47CiAKIAlpZiAoIWttZW1fc2hha2VfYWxsb3coZ2ZwX21hc2spKQotCQlyZXR1cm4gKDApOworCQlyZXR1cm4gMDsKIAlpZiAoIXhmc19HcW0pCi0JCXJldHVybiAoMCk7CisJCXJldHVybiAwOwogCiAJbmZyZWUgPSB4ZnNfR3FtLT5xbV9kcWZyZWVsaXN0LnFoX25lbGVtczsgLyogZnJlZSBkcXVvdHMgKi8KIAkvKiBpbmNvcmUgZHF1b3RzIGluIGFsbCBmL3MncyAqLwpAQCAtMjIxMyw3ICsyMjEzLDcgQEAKIAlBU1NFUlQobmRxdXNlZCA+PSAwKTsKIAogCWlmIChuZnJlZSA8PSBuZHF1c2VkICYmIG5mcmVlIDwgbmRxdW90KQotCQlyZXR1cm4gKDApOworCQlyZXR1cm4gMDsKIAogCW5kcXVzZWQgKj0geGZzX0dxbS0+cW1fZHFmcmVlX3JhdGlvOwkvKiB0YXJnZXQgIyBvZiBmcmVlIGRxdW90cyAqLwogCW4gPSBuZnJlZSAtIG5kcXVzZWQgLSBuZHF1b3Q7CQkvKiAjIG92ZXIgdGFyZ2V0ICovCkBAIC0yMjU3LDcgKzIyNTcsNyBAQAogCQkJeGZzX2RxdW5sb2NrKGRxcCk7CiAJCQl4ZnNfcW1fZnJlZWxpc3RfdW5sb2NrKHhmc19HcW0pOwogCQkJaWYgKCsrcmVzdGFydHMgPj0gWEZTX1FNX1JFQ0xBSU1fTUFYX1JFU1RBUlRTKQotCQkJCXJldHVybiAoTlVMTCk7CisJCQkJcmV0dXJuIE5VTEw7CiAJCQlYUU1fU1RBVFNfSU5DKHhxbXN0YXRzLnhzX3FtX2Rxd2FudHMpOwogCQkJZ290byBzdGFydGFnYWluOwogCQl9CkBAIC0yMzMzLDcgKzIzMzMsNyBAQAogCX0KIAogCXhmc19xbV9mcmVlbGlzdF91bmxvY2soeGZzX0dxbSk7Ci0JcmV0dXJuIChkcXBvdXQpOworCXJldHVybiBkcXBvdXQ7CiB9CiAKIApAQCAtMjM2OSw3ICsyMzY5LDcgQEAKIAkJCSAqLwogCQkJbWVtc2V0KCZkcXAtPnFfY29yZSwgMCwgc2l6ZW9mKGRxcC0+cV9jb3JlKSk7CiAJCQkqT19kcXBwID0gZHFwOwotCQkJcmV0dXJuIChCX0ZBTFNFKTsKKwkJCXJldHVybiBCX0ZBTFNFOwogCQl9CiAJCVhRTV9TVEFUU19JTkMoeHFtc3RhdHMueHNfcW1fZHFyZWNsYWltX21pc3Nlcyk7CiAJfQpAQCAtMjM4Miw3ICsyMzgyLDcgQEAKIAkqT19kcXBwID0ga21lbV96b25lX3phbGxvYyh4ZnNfR3FtLT5xbV9kcXpvbmUsIEtNX1NMRUVQKTsKIAlhdG9taWNfaW5jKCZ4ZnNfR3FtLT5xbV90b3RhbGRxdW90cyk7CiAKLQlyZXR1cm4gKEJfVFJVRSk7CisJcmV0dXJuIEJfVFJVRTsKIH0KIAogCkBAIC0yNDA3LDEzICsyNDA3LDEzIEBACiAJCQkJICAgICAgMCwKIAkJCQkgICAgICBYRlNfREVGQVVMVF9MT0dfQ09VTlQpKSkgewogCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKLQkJcmV0dXJuIChlcnJvcik7CisJCXJldHVybiBlcnJvcjsKIAl9CiAKIAl4ZnNfbW9kX3NiKHRwLCBmbGFncyk7CiAJKHZvaWQpIHhmc190cmFuc19jb21taXQodHAsIDAsIE5VTEwpOwogCi0JcmV0dXJuICgwKTsKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC0yNDYzLDcgKzI0NjMsNyBAQAogCQlpZiAoKGVycm9yID0geGZzX3FtX2RxYXR0YWNoKGlwLCBYRlNfUU1PUFRfRFFBTExPQyB8CiAJCQkJCSAgICBYRlNfUU1PUFRfSUxPQ0tFRCkpKSB7CiAJCQl4ZnNfaXVubG9jayhpcCwgbG9ja2ZsYWdzKTsKLQkJCXJldHVybiAoZXJyb3IpOworCQkJcmV0dXJuIGVycm9yOwogCQl9CiAJfQogCkBAIC0yNDg2LDcgKzI0ODYsNyBAQAogCQkJCQkJIFhGU19RTU9QVF9ET1dBUk4sCiAJCQkJCQkgJnVxKSkpIHsKIAkJCQlBU1NFUlQoZXJyb3IgIT0gRU5PRU5UKTsKLQkJCQlyZXR1cm4gKGVycm9yKTsKKwkJCQlyZXR1cm4gZXJyb3I7CiAJCQl9CiAJCQkvKgogCQkJICogR2V0IHRoZSBpbG9jayBpbiB0aGUgcmlnaHQgb3JkZXIuCkBAIC0yNTE3LDcgKzI1MTcsNyBAQAogCQkJCWlmICh1cSkKIAkJCQkJeGZzX3FtX2RxcmVsZSh1cSk7CiAJCQkJQVNTRVJUKGVycm9yICE9IEVOT0VOVCk7Ci0JCQkJcmV0dXJuIChlcnJvcik7CisJCQkJcmV0dXJuIGVycm9yOwogCQkJfQogCQkJeGZzX2RxdW5sb2NrKGdxKTsKIAkJCWxvY2tmbGFncyA9IFhGU19JTE9DS19TSEFSRUQ7CkBAIC0yNTY1LDcgKzI1NjUsNyBAQAogCQkqT19nZHFwcCA9IGdxOwogCWVsc2UgaWYgKGdxKQogCQl4ZnNfcW1fZHFyZWxlKGdxKTsKLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMjYwOCw3ICsyNjA4LDcgQEAKIAl4ZnNfZHF1bmxvY2sobmV3ZHEpOwogCSpJT19vbGRkcSA9IG5ld2RxOwogCi0JcmV0dXJuIChwcmV2ZHEpOworCXJldHVybiBwcmV2ZHE7CiB9CiAKIC8qCkBAIC0yNzAyLDEyICsyNzAyLDEyIEBACiAJaXAgPSBpX3RhYlswXTsKIAogCWlmICghIFhGU19JU19RVU9UQV9PTihpcC0+aV9tb3VudCkpCi0JCXJldHVybiAoMCk7CisJCXJldHVybiAwOwogCiAJaWYgKFhGU19OT1RfRFFBVFRBQ0hFRChpcC0+aV9tb3VudCwgaXApKSB7CiAJCWVycm9yID0geGZzX3FtX2RxYXR0YWNoKGlwLCAwKTsKIAkJaWYgKGVycm9yKQotCQkJcmV0dXJuIChlcnJvcik7CisJCQlyZXR1cm4gZXJyb3I7CiAJfQogCWZvciAoaSA9IDE7IChpIDwgNCAmJiBpX3RhYltpXSk7IGkrKykgewogCQkvKgpAQCAtMjcxNywxMSArMjcxNywxMSBAQAogCQkJaWYgKFhGU19OT1RfRFFBVFRBQ0hFRChpcC0+aV9tb3VudCwgaXApKSB7CiAJCQkJZXJyb3IgPSB4ZnNfcW1fZHFhdHRhY2goaXAsIDApOwogCQkJCWlmIChlcnJvcikKLQkJCQkJcmV0dXJuIChlcnJvcik7CisJCQkJCXJldHVybiBlcnJvcjsKIAkJCX0KIAkJfQogCX0KLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiB2b2lkCkBAIC0yNzQzLDYgKzI3NDMsNyBAQAogCQl4ZnNfZHF1bmxvY2sodWRxcCk7CiAJCUFTU0VSVChpcC0+aV91ZHF1b3QgPT0gTlVMTCk7CiAJCWlwLT5pX3VkcXVvdCA9IHVkcXA7CisJCUFTU0VSVChYRlNfSVNfVVFVT1RBX09OKHRwLT50X21vdW50cCkpOwogCQlBU1NFUlQoaXAtPmlfZC5kaV91aWQgPT0gYmUzMl90b19jcHUodWRxcC0+cV9jb3JlLmRfaWQpKTsKIAkJeGZzX3RyYW5zX21vZF9kcXVvdCh0cCwgdWRxcCwgWEZTX1RSQU5TX0RRX0lDT1VOVCwgMSk7CiAJfQpAQCAtMjc1Miw3ICsyNzUzLDEwIEBACiAJCXhmc19kcXVubG9jayhnZHFwKTsKIAkJQVNTRVJUKGlwLT5pX2dkcXVvdCA9PSBOVUxMKTsKIAkJaXAtPmlfZ2RxdW90ID0gZ2RxcDsKLQkJQVNTRVJUKGlwLT5pX2QuZGlfZ2lkID09IGJlMzJfdG9fY3B1KGdkcXAtPnFfY29yZS5kX2lkKSk7CisJCUFTU0VSVChYRlNfSVNfT1FVT1RBX09OKHRwLT50X21vdW50cCkpOworCQlBU1NFUlQoKFhGU19JU19HUVVPVEFfT04odHAtPnRfbW91bnRwKSA/CisJCQlpcC0+aV9kLmRpX2dpZCA6IGlwLT5pX2QuZGlfcHJvamlkKSA9PQorCQkJCWJlMzJfdG9fY3B1KGdkcXAtPnFfY29yZS5kX2lkKSk7CiAJCXhmc190cmFuc19tb2RfZHF1b3QodHAsIGdkcXAsIFhGU19UUkFOU19EUV9JQ09VTlQsIDEpOwogCX0KIH0KQEAgLTI3NjIsNyArMjc2Niw3IEBACiB4ZnNfcW1fZnJlZWxpc3RfaW5pdCh4ZnNfZnJsaXN0X3QgKnFsKQogewogCXFsLT5xaF9uZXh0ID0gcWwtPnFoX3ByZXYgPSAoeGZzX2RxdW90X3QgKikgcWw7Ci0JbXV0ZXhfaW5pdCgmcWwtPnFoX2xvY2ssIE1VVEVYX0RFRkFVTFQsICJkcWYiKTsKKwltdXRleF9pbml0KCZxbC0+cWhfbG9jayk7CiAJcWwtPnFoX3ZlcnNpb24gPSAwOwogCXFsLT5xaF9uZWxlbXMgPSAwOwogfQpAQCAtMjc3Miw3ICsyNzc2LDcgQEAKIHsKIAl4ZnNfZHF1b3RfdAkqZHFwLCAqbmV4dGRxcDsKIAotCW11dGV4X2xvY2soJnFsLT5xaF9sb2NrLCBQSU5PRCk7CisJbXV0ZXhfbG9jaygmcWwtPnFoX2xvY2spOwogCWZvciAoZHFwID0gcWwtPnFoX25leHQ7CiAJICAgICBkcXAgIT0gKHhmc19kcXVvdF90ICopcWw7ICkgewogCQl4ZnNfZHFsb2NrKGRxcCk7CkBAIC0yODMwLDcgKzI4MzQsNyBAQAogCWludCBsb2NrZWQ7CiAKIAlsb2NrZWQgPSBtdXRleF90cnlsb2NrKCYoKGRxcCktPnFfaGFzaC0+cWhfbG9jaykpOwotCXJldHVybiAobG9ja2VkKTsKKwlyZXR1cm4gbG9ja2VkOwogfQogCiBpbnQKQEAgLTI4NDAsNyArMjg0NCw3IEBACiAJaW50IGxvY2tlZDsKIAogCWxvY2tlZCA9IG11dGV4X3RyeWxvY2soJih4cW0tPnFtX2RxZnJlZWxpc3QucWhfbG9jaykpOwotCXJldHVybiAobG9ja2VkKTsKKwlyZXR1cm4gbG9ja2VkOwogfQogCiBTVEFUSUMgaW50CkBAIC0yODUxLDUgKzI4NTUsNSBAQAogCiAJQVNTRVJUKG1wLT5tX3F1b3RhaW5mbyk7CiAJbG9ja2VkID0gbXV0ZXhfdHJ5bG9jaygmKFhGU19RSV9NUExMT0NLKG1wKSkpOwotCXJldHVybiAobG9ja2VkKTsKKwlyZXR1cm4gbG9ja2VkOwogfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19xbS5oIGIvZnMveGZzL3F1b3RhL3hmc19xbS5oCmluZGV4IDEyZGEyNTkuLjQ1NjhkZWIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfcW0uaAorKysgYi9mcy94ZnMvcXVvdGEveGZzX3FtLmgKQEAgLTE2NSw3ICsxNjUsNyBAQAogI2RlZmluZSBYRlNfUU1fSVdBUk5MSU1JVAk1CiAjZGVmaW5lIFhGU19RTV9SVEJXQVJOTElNSVQJNQogCi0jZGVmaW5lIFhGU19RTV9MT0NLKHhxbSkJKG11dGV4X2xvY2soJnhxbSMjX2xvY2ssIFBJTk9EKSkKKyNkZWZpbmUgWEZTX1FNX0xPQ0soeHFtKQkobXV0ZXhfbG9jaygmeHFtIyNfbG9jaykpCiAjZGVmaW5lIFhGU19RTV9VTkxPQ0soeHFtKQkobXV0ZXhfdW5sb2NrKCZ4cW0jI19sb2NrKSkKICNkZWZpbmUgWEZTX1FNX0hPTEQoeHFtKQkoKHhxbSktPnFtX25yZWZzKyspCiAjZGVmaW5lIFhGU19RTV9SRUxFKHhxbSkJKCh4cW0pLT5xbV9ucmVmcy0tKQpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19xbV9iaHYuYyBiL2ZzL3hmcy9xdW90YS94ZnNfcW1fYmh2LmMKaW5kZXggZDlkMjk5My4uOTA0MDJhMSAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19xbV9iaHYuYworKysgYi9mcy94ZnMvcXVvdGEveGZzX3FtX2Jodi5jCkBAIC0zNjMsNyArMzYzLDcgQEAKIAkJS0VSTl9JTkZPICJTR0kgWEZTIFF1b3RhIE1hbmFnZW1lbnQgc3Vic3lzdGVtXG4iOwogCiAJcHJpbnRrKG1lc3NhZ2UpOwotCW11dGV4X2luaXQoJnhmc19HcW1fbG9jaywgTVVURVhfREVGQVVMVCwgInhmc19xbWxvY2siKTsKKwltdXRleF9pbml0KCZ4ZnNfR3FtX2xvY2spOwogCXZmc19iaHZfc2V0X2N1c3RvbSgmeGZzX3Ftb3BzLCAmeGZzX3FtY29yZV94ZnMpOwogCXhmc19xbV9pbml0X3Byb2NmcygpOwogfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19xbV9zeXNjYWxscy5jIGIvZnMveGZzL3F1b3RhL3hmc19xbV9zeXNjYWxscy5jCmluZGV4IDI0NjkwZTEuLjY3Njg4NDMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfcW1fc3lzY2FsbHMuYworKysgYi9mcy94ZnMvcXVvdGEveGZzX3FtX3N5c2NhbGxzLmMKQEAgLTE1LDYgKzE1LDkgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCiAgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLworCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorCiAjaW5jbHVkZSAieGZzLmgiCiAjaW5jbHVkZSAieGZzX2ZzLmgiCiAjaW5jbHVkZSAieGZzX2JpdC5oIgpAQCAtMjMzLDcgKzIzNiw3IEBACiAJICovCiAJQVNTRVJUKG1wLT5tX3F1b3RhaW5mbyk7CiAJaWYgKG1wLT5tX3F1b3RhaW5mbykKLQkJbXV0ZXhfbG9jaygmKFhGU19RSV9RT0ZGTE9DSyhtcCkpLCBQSU5PRCk7CisJCW11dGV4X2xvY2soJihYRlNfUUlfUU9GRkxPQ0sobXApKSk7CiAKIAlBU1NFUlQobXAtPm1fcXVvdGFpbmZvKTsKIApAQCAtNTA4LDcgKzUxMSw3IEBACiAJLyoKIAkgKiBTd2l0Y2ggb24gcXVvdGEgZW5mb3JjZW1lbnQgaW4gY29yZS4KIAkgKi8KLQltdXRleF9sb2NrKCYoWEZTX1FJX1FPRkZMT0NLKG1wKSksIFBJTk9EKTsKKwltdXRleF9sb2NrKCYoWEZTX1FJX1FPRkZMT0NLKG1wKSkpOwogCW1wLT5tX3FmbGFncyB8PSAoZmxhZ3MgJiBYRlNfQUxMX1FVT1RBX0VORkQpOwogCW11dGV4X3VubG9jaygmKFhGU19RSV9RT0ZGTE9DSyhtcCkpKTsKIApAQCAtNjE3LDcgKzYyMCw3IEBACiAJICogYSBxdW90YW9mZiBmcm9tIGhhcHBlbmluZykuIChYWFhUaGlzIGRvZXNuJ3QgY3VycmVudGx5IGhhcHBlbgogCSAqIGJlY2F1c2Ugd2UgdGFrZSB0aGUgdmZzbG9jayBiZWZvcmUgY2FsbGluZyB4ZnNfcW1fc3lzZW50KS4KIAkgKi8KLQltdXRleF9sb2NrKCYoWEZTX1FJX1FPRkZMT0NLKG1wKSksIFBJTk9EKTsKKwltdXRleF9sb2NrKCYoWEZTX1FJX1FPRkZMT0NLKG1wKSkpOwogCiAJLyoKIAkgKiBHZXQgdGhlIGRxdW90IChsb2NrZWQpLCBhbmQgam9pbiBpdCB0byB0aGUgdHJhbnNhY3Rpb24uCkBAIC0xNDI2LDcgKzE0MjksNyBAQAogCXhmc19sb2dfZm9yY2UobXAsICh4ZnNfbHNuX3QpMCwgWEZTX0xPR19GT1JDRSB8IFhGU19MT0dfU1lOQyk7CiAJWEZTX2JmbHVzaChtcC0+bV9kZGV2X3RhcmdwKTsKIAotCW11dGV4X2xvY2soJnFjaGVja19sb2NrLCBQSU5PRCk7CisJbXV0ZXhfbG9jaygmcWNoZWNrX2xvY2spOwogCS8qIFRoZXJlIHNob3VsZCBiZSBhYnNvbHV0ZWx5IG5vIHF1b3RhIGFjdGl2aXR5IHdoaWxlIHRoaXMKIAkgICBpcyBnb2luZyBvbi4gKi8KIAlxbXRlc3RfdWRxdGFiID0ga21lbV96YWxsb2MocW10ZXN0X2hhc2htYXNrICoKZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfcXVvdGFfcHJpdi5oIGIvZnMveGZzL3F1b3RhL3hmc19xdW90YV9wcml2LmgKaW5kZXggN2E5ZjNiZS4uYjdkZGQwNCAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19xdW90YV9wcml2LmgKKysrIGIvZnMveGZzL3F1b3RhL3hmc19xdW90YV9wcml2LmgKQEAgLTUxLDcgKzUxLDcgQEAKICNkZWZpbmUgWEZTX1FJX01QTE5FWFQobXApCSgobXApLT5tX3F1b3RhaW5mby0+cWlfZHFsaXN0LnFoX25leHQpCiAjZGVmaW5lIFhGU19RSV9NUExORFFVT1RTKG1wKQkoKG1wKS0+bV9xdW90YWluZm8tPnFpX2RxbGlzdC5xaF9uZWxlbXMpCiAKLSNkZWZpbmUgWFFNTENLKGgpCQkJKG11dGV4X2xvY2soJigoaCktPnFoX2xvY2spLCBQSU5PRCkpCisjZGVmaW5lIFhRTUxDSyhoKQkJCShtdXRleF9sb2NrKCYoKGgpLT5xaF9sb2NrKSkpCiAjZGVmaW5lIFhRTVVOTENLKGgpCQkJKG11dGV4X3VubG9jaygmKChoKS0+cWhfbG9jaykpKQogI2lmZGVmIERFQlVHCiBzdHJ1Y3QgeGZzX2RxaGFzaDsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmMgYi9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5jCmluZGV4IGJiNmRjOTEuLmIwOGIzZDkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmMKKysrIGIvZnMveGZzL3N1cHBvcnQvZGVidWcuYwpAQCAtMjcsNDUgKzI3LDEyIEBACiAvKiBUcmFuc2xhdGUgZnJvbSBDRV9GT08gdG8gS0VSTl9GT08sIGVycl9sZXZlbChDRV9GT08pID09IEtFUk5fRk9PICovCiAjZGVmaW5lIFhGU19NQVhfRVJSX0xFVkVMCTcKICNkZWZpbmUgWEZTX0VSUl9NQVNLCQkoKDEgPDwgMykgLSAxKQotc3RhdGljIGNoYXIJCSplcnJfbGV2ZWxbWEZTX01BWF9FUlJfTEVWRUwrMV0gPQorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdAllcnJfbGV2ZWxbWEZTX01BWF9FUlJfTEVWRUwrMV0gPQogCQkJCQl7S0VSTl9FTUVSRywgS0VSTl9BTEVSVCwgS0VSTl9DUklULAogCQkJCQkgS0VSTl9FUlIsIEtFUk5fV0FSTklORywgS0VSTl9OT1RJQ0UsCiAJCQkJCSBLRVJOX0lORk8sIEtFUk5fREVCVUd9OwogCiB2b2lkCi1hc3NmYWlsKGNoYXIgKmEsIGNoYXIgKmYsIGludCBsKQotewotICAgIHByaW50aygiWEZTIGFzc2VydGlvbiBmYWlsZWQ6ICVzLCBmaWxlOiAlcywgbGluZTogJWRcbiIsIGEsIGYsIGwpOwotICAgIEJVRygpOwotfQotCi0jaWYgKChkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKElORFVDRV9JT19FUlJST1IpKSAmJiAhZGVmaW5lZChOT19XQU5UX1JBTkRPTSkpCi0KLXVuc2lnbmVkIGxvbmcKLXJhbmRvbSh2b2lkKQotewotCXN0YXRpYyB1bnNpZ25lZCBsb25nCVJhbmRvbVZhbHVlID0gMTsKLQkvKiBjeWNsZXMgcHNldWRvLXJhbmRvbWx5IHRocm91Z2ggYWxsIHZhbHVlcyBiZXR3ZWVuIDEgYW5kIDJeMzEgLSAyICovCi0JcmVnaXN0ZXIgbG9uZwlydiA9IFJhbmRvbVZhbHVlOwotCXJlZ2lzdGVyIGxvbmcJbG87Ci0JcmVnaXN0ZXIgbG9uZwloaTsKLQotCWhpID0gcnYgLyAxMjc3NzM7Ci0JbG8gPSBydiAlIDEyNzc3MzsKLQlydiA9IDE2ODA3ICogbG8gLSAyODM2ICogaGk7Ci0JaWYoIHJ2IDw9IDAgKSBydiArPSAyMTQ3NDgzNjQ3OwotCXJldHVybiggUmFuZG9tVmFsdWUgPSBydiApOwotfQotCi1pbnQKLWdldF90aHJlYWRfaWQodm9pZCkKLXsKLQlyZXR1cm4gY3VycmVudC0+cGlkOwotfQotCi0jZW5kaWYgLyogREVCVUcgfHwgSU5EVUNFX0lPX0VSUlJPUiB8fCAhTk9fV0FOVF9SQU5ET00gKi8KLQotdm9pZAogY21uX2VycihyZWdpc3RlciBpbnQgbGV2ZWwsIGNoYXIgKmZtdCwgLi4uKQogewogCWNoYXIJKmZwID0gZm10OwpAQCAtOTAsNyArNTcsNiBAQAogCQlCVUcoKTsKIH0KIAotCiB2b2lkCiBpY21uX2VycihyZWdpc3RlciBpbnQgbGV2ZWwsIGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKIHsKQEAgLTEwOSwzICs3NSwyNyBAQAogCWlmIChsZXZlbCA9PSBDRV9QQU5JQykKIAkJQlVHKCk7CiB9CisKK3ZvaWQKK2Fzc2ZhaWwoY2hhciAqZXhwciwgY2hhciAqZmlsZSwgaW50IGxpbmUpCit7CisJcHJpbnRrKCJBc3NlcnRpb24gZmFpbGVkOiAlcywgZmlsZTogJXMsIGxpbmU6ICVkXG4iLCBleHByLCBmaWxlLCBsaW5lKTsKKwlCVUcoKTsKK30KKworI2lmICgoZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChJTkRVQ0VfSU9fRVJSUk9SKSkgJiYgIWRlZmluZWQoTk9fV0FOVF9SQU5ET00pKQordW5zaWduZWQgbG9uZyByYW5kb20odm9pZCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgbG9uZwlSYW5kb21WYWx1ZSA9IDE7CisJLyogY3ljbGVzIHBzZXVkby1yYW5kb21seSB0aHJvdWdoIGFsbCB2YWx1ZXMgYmV0d2VlbiAxIGFuZCAyXjMxIC0gMiAqLworCXJlZ2lzdGVyIGxvbmcJcnYgPSBSYW5kb21WYWx1ZTsKKwlyZWdpc3RlciBsb25nCWxvOworCXJlZ2lzdGVyIGxvbmcJaGk7CisKKwloaSA9IHJ2IC8gMTI3NzczOworCWxvID0gcnYgJSAxMjc3NzM7CisJcnYgPSAxNjgwNyAqIGxvIC0gMjgzNiAqIGhpOworCWlmIChydiA8PSAwKSBydiArPSAyMTQ3NDgzNjQ3OworCXJldHVybiBSYW5kb21WYWx1ZSA9IHJ2OworfQorI2VuZGlmIC8qIERFQlVHIHx8IElORFVDRV9JT19FUlJST1IgfHwgIU5PX1dBTlRfUkFORE9NICovCmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5oIGIvZnMveGZzL3N1cHBvcnQvZGVidWcuaAppbmRleCBhZmY1NTg2Li5lM2JmNTgxIDEwMDY0NAotLS0gYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5oCisrKyBiL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmgKQEAgLTMxLDI0ICszMSwyMyBAQAogCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMCkpKTsKIGV4dGVybiB2b2lkIGNtbl9lcnIoaW50LCBjaGFyICosIC4uLikKIAlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CitleHRlcm4gdm9pZCBhc3NmYWlsKGNoYXIgKmV4cHIsIGNoYXIgKmYsIGludCBsKTsKKworI2RlZmluZSBwcmRldihmbXQsdGFyZyxhcmdzLi4uKSBcCisJcHJpbnRrKCJEZXZpY2UgJXMgLSAiIGZtdCAiXG4iLCBYRlNfQlVGVEFSR19OQU1FKHRhcmcpLCAjIyBhcmdzKQorCisjZGVmaW5lIEFTU0VSVF9BTFdBWVMoZXhwcikJXAorCSh1bmxpa2VseSgoZXhwcikgIT0gMCkgPyAodm9pZCkwIDogYXNzZmFpbCgjZXhwciwgX19GSUxFX18sIF9fTElORV9fKSkKKworI2lmbmRlZiBERUJVRworIyBkZWZpbmUgQVNTRVJUKGV4cHIpCSgodm9pZCkwKQorI2Vsc2UKKyMgZGVmaW5lIEFTU0VSVChleHByKQlBU1NFUlRfQUxXQVlTKGV4cHIpCitleHRlcm4gdW5zaWduZWQgbG9uZyByYW5kb20odm9pZCk7CisjZW5kaWYKIAogI2lmbmRlZiBTVEFUSUMKICMgZGVmaW5lIFNUQVRJQyBzdGF0aWMKICNlbmRpZgogCi0jaWZkZWYgREVCVUcKLSMgZGVmaW5lIEFTU0VSVChFWCkJKChFWCkgPyAoKHZvaWQpMCkgOiBhc3NmYWlsKCNFWCwgX19GSUxFX18sIF9fTElORV9fKSkKLSNlbHNlCi0jIGRlZmluZSBBU1NFUlQoeCkJKCh2b2lkKTApCi0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgYXNzZmFpbChjaGFyICosIGNoYXIgKiwgaW50KTsKLSNpZmRlZiBERUJVRwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcmFuZG9tKHZvaWQpOwotZXh0ZXJuIGludCBnZXRfdGhyZWFkX2lkKHZvaWQpOwotI2VuZGlmCi0KLSNkZWZpbmUgQVNTRVJUX0FMV0FZUyhFWCkgICgoRVgpPygodm9pZCkwKTphc3NmYWlsKCNFWCwgX19GSUxFX18sIF9fTElORV9fKSkKLSNkZWZpbmUJZGVidWdfc3RvcF9hbGxfY3B1cyhwYXJhbSkJLyogcGFyYW0gaXMgImNwdW1hc2tfdCAqIiAqLwotCiAjZW5kaWYgIC8qIF9fWEZTX1NVUFBPUlRfREVCVUdfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC91dWlkLmMgYi9mcy94ZnMvc3VwcG9ydC91dWlkLmMKaW5kZXggNzBjZTQwOS4uYTNkNTY1YSAxMDA2NDQKLS0tIGEvZnMveGZzL3N1cHBvcnQvdXVpZC5jCisrKyBiL2ZzL3hmcy9zdXBwb3J0L3V1aWQuYwpAQCAtMjQsOSArMjQsMTkgQEAKIHZvaWQKIHV1aWRfaW5pdCh2b2lkKQogewotCW11dGV4X2luaXQoJnV1aWRfbW9uaXRvciwgTVVURVhfREVGQVVMVCwgInV1aWRfbW9uaXRvciIpOworCW11dGV4X2luaXQoJnV1aWRfbW9uaXRvcik7CiB9CiAKKworLyogSVJJWCBpbnRlcnByZXRhdGlvbiBvZiBhbiB1dWlkX3QgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlfX2JlMzIJdXVfdGltZWxvdzsKKwlfX2JlMTYJdXVfdGltZW1pZDsKKwlfX2JlMTYJdXVfdGltZWhpOworCV9fYmUxNgl1dV9jbG9ja3NlcTsKKwlfX2JlMTYJdXVfbm9kZVszXTsKK30geGZzX3V1X3Q7CisKIC8qCiAgKiB1dWlkX2dldG5vZGV1bmlxIC0gb2J0YWluIHRoZSBub2RlIHVuaXF1ZSBmaWVsZHMgb2YgYSBVVUlELgogICoKQEAgLTM2LDE2ICs0NiwxMSBAQAogdm9pZAogdXVpZF9nZXRub2RldW5pcSh1dWlkX3QgKnV1aWQsIGludCBmc2lkIFsyXSkKIHsKLQljaGFyCSp1dSA9IChjaGFyICopdXVpZDsKKwl4ZnNfdXVfdCAqdXVwID0gKHhmc191dV90ICopdXVpZDsKIAotCS8qIG9uIElSSVgsIHRoaXMgZnVuY3Rpb24gYXNzdW1lcyBiaWctZW5kaWFuIGZpZWxkcyB3aXRoaW4KLQkgKiB0aGUgdXVpZCwgc28gd2UgdXNlIElOVF9HRVQgdG8gZ2V0IHRoZSBzYW1lIHJlc3VsdCBvbgotCSAqIGxpdHRsZS1lbmRpYW4gc3lzdGVtcwotCSAqLwotCi0JZnNpZFswXSA9IChJTlRfR0VUKCoodV9pbnQxNl90KikodXUrOCksIEFSQ0hfQ09OVkVSVCkgPDwgMTYpICsKLQkJICAgSU5UX0dFVCgqKHVfaW50MTZfdCopKHV1KzQpLCBBUkNIX0NPTlZFUlQpOwotCWZzaWRbMV0gPSAgSU5UX0dFVCgqKHVfaW50MzJfdCopKHV1ICApLCBBUkNIX0NPTlZFUlQpOworCWZzaWRbMF0gPSAoYmUxNl90b19jcHUodXVwLT51dV9jbG9ja3NlcSkgPDwgMTYpIHwKKwkJICAgYmUxNl90b19jcHUodXVwLT51dV90aW1lbWlkKTsKKwlmc2lkWzFdID0gYmUxNl90b19jcHUodXVwLT51dV90aW1lbG93KTsKIH0KIAogdm9pZApAQCAtOTQsNyArOTksNyBAQAogewogCWludAlpLCBob2xlOwogCi0JbXV0ZXhfbG9jaygmdXVpZF9tb25pdG9yLCBQVkZTKTsKKwltdXRleF9sb2NrKCZ1dWlkX21vbml0b3IpOwogCWZvciAoaSA9IDAsIGhvbGUgPSAtMTsgaSA8IHV1aWRfdGFibGVfc2l6ZTsgaSsrKSB7CiAJCWlmICh1dWlkX2lzX25pbCgmdXVpZF90YWJsZVtpXSkpIHsKIAkJCWhvbGUgPSBpOwpAQCAtMTIyLDcgKzEyNyw3IEBACiB7CiAJaW50CWk7CiAKLQltdXRleF9sb2NrKCZ1dWlkX21vbml0b3IsIFBWRlMpOworCW11dGV4X2xvY2soJnV1aWRfbW9uaXRvcik7CiAJZm9yIChpID0gMDsgaSA8IHV1aWRfdGFibGVfc2l6ZTsgaSsrKSB7CiAJCWlmICh1dWlkX2lzX25pbCgmdXVpZF90YWJsZVtpXSkpCiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYWNsLmMgYi9mcy94ZnMveGZzX2FjbC5jCmluZGV4IGNjOWM5MWIuLjRmZjBmNGUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYWNsLmMKKysrIGIvZnMveGZzL3hmc19hY2wuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgInhmc19tYWMuaCIKICNpbmNsdWRlICJ4ZnNfYXR0ci5oIgogCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbF94YXR0ci5oPgogCiBTVEFUSUMgaW50CXhmc19hY2xfc2V0bW9kZSh2bm9kZV90ICosIHhmc19hY2xfdCAqLCBpbnQgKik7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FyY2guaCBiL2ZzL3hmcy94ZnNfYXJjaC5oCmluZGV4IDY4ZTUwNTEuLmM0ODM2ODkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYXJjaC5oCisrKyBiL2ZzL3hmcy94ZnNfYXJjaC5oCkBAIC00MCw2ICs0MCwyMiBAQAogI3VuZGVmIFhGU19OQVRJVkVfSE9TVAogI2VuZGlmCiAKKyNpZmRlZiBYRlNfTkFUSVZFX0hPU1QKKyNkZWZpbmUgY3B1X3RvX2JlMTYodmFsKQkoKF9fYmUxNikodmFsKSkKKyNkZWZpbmUgY3B1X3RvX2JlMzIodmFsKQkoKF9fYmUzMikodmFsKSkKKyNkZWZpbmUgY3B1X3RvX2JlNjQodmFsKQkoKF9fYmU2NCkodmFsKSkKKyNkZWZpbmUgYmUxNl90b19jcHUodmFsKQkoKF9fdWludDE2X3QpKHZhbCkpCisjZGVmaW5lIGJlMzJfdG9fY3B1KHZhbCkJKChfX3VpbnQzMl90KSh2YWwpKQorI2RlZmluZSBiZTY0X3RvX2NwdSh2YWwpCSgoX191aW50NjRfdCkodmFsKSkKKyNlbHNlCisjZGVmaW5lIGNwdV90b19iZTE2KHZhbCkJKF9fc3dhYjE2KChfX3VpbnQxNl90KSh2YWwpKSkKKyNkZWZpbmUgY3B1X3RvX2JlMzIodmFsKQkoX19zd2FiMzIoKF9fdWludDMyX3QpKHZhbCkpKQorI2RlZmluZSBjcHVfdG9fYmU2NCh2YWwpCShfX3N3YWI2NCgoX191aW50NjRfdCkodmFsKSkpCisjZGVmaW5lIGJlMTZfdG9fY3B1KHZhbCkJKF9fc3dhYjE2KChfX2JlMTYpKHZhbCkpKQorI2RlZmluZSBiZTMyX3RvX2NwdSh2YWwpCShfX3N3YWIzMigoX19iZTMyKSh2YWwpKSkKKyNkZWZpbmUgYmU2NF90b19jcHUodmFsKQkoX19zd2FiNjQoKF9fYmU2NCkodmFsKSkpCisjZW5kaWYKKwogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIAogLyogZG8gd2UgbmVlZCBjb252ZXJzaW9uPyAqLwpAQCAtMTg2LDcgKzIwMiw3IEBACiAgKi8gCiAKICNkZWZpbmUgWEZTX0dFVF9ESVJfSU5PNChkaSkgXAotCSgoKHUzMikoZGkpLmlbMF0gPDwgMjQpIHwgKChkaSkuaVsxXSA8PCAxNikgfCAoKGRpKS5pWzJdIDw8IDgpIHwgKChkaSkuaVszXSkpCisJKCgoX191MzIpKGRpKS5pWzBdIDw8IDI0KSB8ICgoZGkpLmlbMV0gPDwgMTYpIHwgKChkaSkuaVsyXSA8PCA4KSB8ICgoZGkpLmlbM10pKQogCiAjZGVmaW5lIFhGU19QVVRfRElSX0lOTzQoZnJvbSwgZGkpIFwKIGRvIHsgXApAQCAtMTk3LDkgKzIxMyw5IEBACiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIFhGU19ESV9ISShkaSkgXAotCSgoKHUzMikoZGkpLmlbMV0gPDwgMTYpIHwgKChkaSkuaVsyXSA8PCA4KSB8ICgoZGkpLmlbM10pKQorCSgoKF9fdTMyKShkaSkuaVsxXSA8PCAxNikgfCAoKGRpKS5pWzJdIDw8IDgpIHwgKChkaSkuaVszXSkpCiAjZGVmaW5lIFhGU19ESV9MTyhkaSkgXAotCSgoKHUzMikoZGkpLmlbNF0gPDwgMjQpIHwgKChkaSkuaVs1XSA8PCAxNikgfCAoKGRpKS5pWzZdIDw8IDgpIHwgKChkaSkuaVs3XSkpCisJKCgoX191MzIpKGRpKS5pWzRdIDw8IDI0KSB8ICgoZGkpLmlbNV0gPDwgMTYpIHwgKChkaSkuaVs2XSA8PCA4KSB8ICgoZGkpLmlbN10pKQogCiAjZGVmaW5lIFhGU19HRVRfRElSX0lOTzgoZGkpICAgICAgICBcCiAJKCgoeGZzX2lub190KVhGU19ESV9MTyhkaSkgJiAweGZmZmZmZmZmVUxMKSB8IFwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYXR0ci5jIGIvZnMveGZzL3hmc19hdHRyLmMKaW5kZXggNTQ4NGVlYi4uZTVlOTFlOSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hdHRyLmMKKysrIGIvZnMveGZzL3hmc19hdHRyLmMKQEAgLTE1LDYgKzE1LDkgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCiAgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLworCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorCiAjaW5jbHVkZSAieGZzLmgiCiAjaW5jbHVkZSAieGZzX2ZzLmgiCiAjaW5jbHVkZSAieGZzX3R5cGVzLmgiCkBAIC0xMTcsMTEgKzEyMCw2IEBACiAJICAgICBpcC0+aV9kLmRpX2FuZXh0ZW50cyA9PSAwKSkKIAkJcmV0dXJuKEVOT0FUVFIpOwogCi0JaWYgKCEoZmxhZ3MgJiAoQVRUUl9LRVJOQUNDRVNTfEFUVFJfU0VDVVJFKSkpIHsKLQkJaWYgKChlcnJvciA9IHhmc19pYWNjZXNzKGlwLCBTX0lSVVNSLCBjcmVkKSkpCi0JCQlyZXR1cm4oWEZTX0VSUk9SKGVycm9yKSk7Ci0JfQotCiAJLyoKIAkgKiBGaWxsIGluIHRoZSBhcmcgc3RydWN0dXJlIGZvciB0aGlzIHJlcXVlc3QuCiAJICovCkBAIC00MjUsNyArNDIzLDcgQEAKIAkgICAgIHN0cnVjdCBjcmVkICpjcmVkKQogewogCXhmc19pbm9kZV90CSpkcDsKLQlpbnQgICAgICAgICAgICAgbmFtZWxlbiwgZXJyb3I7CisJaW50ICAgICAgICAgICAgIG5hbWVsZW47CiAKIAluYW1lbGVuID0gc3RybGVuKG5hbWUpOwogCWlmIChuYW1lbGVuID49IE1BWE5BTUVMRU4pCkBAIC00MzcsMTQgKzQzNSw2IEBACiAJaWYgKFhGU19GT1JDRURfU0hVVERPV04oZHAtPmlfbW91bnQpKQogCQlyZXR1cm4gKEVJTyk7CiAKLQl4ZnNfaWxvY2soZHAsIFhGU19JTE9DS19TSEFSRUQpOwotCWlmICghKGZsYWdzICYgQVRUUl9TRUNVUkUpICYmCi0JICAgICAoZXJyb3IgPSB4ZnNfaWFjY2VzcyhkcCwgU19JV1VTUiwgY3JlZCkpKSB7Ci0JCXhmc19pdW5sb2NrKGRwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKLQkJcmV0dXJuKFhGU19FUlJPUihlcnJvcikpOwotCX0KLQl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX1NIQVJFRCk7Ci0KIAlyZXR1cm4geGZzX2F0dHJfc2V0X2ludChkcCwgbmFtZSwgbmFtZWxlbiwgdmFsdWUsIHZhbHVlbGVuLCBmbGFncyk7CiB9CiAKQEAgLTU3OSw3ICs1NjksNyBAQAogeGZzX2F0dHJfcmVtb3ZlKGJodl9kZXNjX3QgKmJkcCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzLCBzdHJ1Y3QgY3JlZCAqY3JlZCkKIHsKIAl4ZnNfaW5vZGVfdCAgICAgICAgICpkcDsKLQlpbnQgICAgICAgICAgICAgICAgIG5hbWVsZW4sIGVycm9yOworCWludCAgICAgICAgICAgICAgICAgbmFtZWxlbjsKIAogCW5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CiAJaWYgKG5hbWVsZW4gPj0gTUFYTkFNRUxFTikKQEAgLTU5MiwxMSArNTgyLDcgQEAKIAkJcmV0dXJuIChFSU8pOwogCiAJeGZzX2lsb2NrKGRwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKLQlpZiAoIShmbGFncyAmIEFUVFJfU0VDVVJFKSAmJgotCSAgICAgKGVycm9yID0geGZzX2lhY2Nlc3MoZHAsIFNfSVdVU1IsIGNyZWQpKSkgewotCQl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX1NIQVJFRCk7Ci0JCXJldHVybihYRlNfRVJST1IoZXJyb3IpKTsKLQl9IGVsc2UgaWYgKFhGU19JRk9SS19RKGRwKSA9PSAwIHx8CisJaWYgKFhGU19JRk9SS19RKGRwKSA9PSAwIHx8CiAJCSAgIChkcC0+aV9kLmRpX2Fmb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgogCQkgICAgZHAtPmlfZC5kaV9hbmV4dGVudHMgPT0gMCkpIHsKIAkJeGZzX2l1bmxvY2soZHAsIFhGU19JTE9DS19TSEFSRUQpOwpAQCAtNjY4LDEyICs2NTQsNiBAQAogCQlyZXR1cm4gKEVJTyk7CiAKIAl4ZnNfaWxvY2soZHAsIFhGU19JTE9DS19TSEFSRUQpOwotCWlmICghKGZsYWdzICYgQVRUUl9TRUNVUkUpICYmCi0JICAgICAoZXJyb3IgPSB4ZnNfaWFjY2VzcyhkcCwgU19JUlVTUiwgY3JlZCkpKSB7Ci0JCXhmc19pdW5sb2NrKGRwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKLQkJcmV0dXJuKFhGU19FUlJPUihlcnJvcikpOwotCX0KLQogCS8qCiAJICogRGVjaWRlIG9uIHdoYXQgd29yayByb3V0aW5lcyB0byBjYWxsIGJhc2VkIG9uIHRoZSBpbm9kZSBzaXplLgogCSAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hdHRyX2xlYWYuYyBiL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMKaW5kZXggMWM3NDIxOC4uZmU5MWVhYyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hdHRyX2xlYWYuYworKysgYi9mcy94ZnMveGZzX2F0dHJfbGVhZi5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAkJcmV0dXJuIChvZmZzZXQgPj0gbWluZm9ya29mZikgPyBtaW5mb3Jrb2ZmIDogMDsKIAl9CiAKLQlpZiAodW5saWtlbHkobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQ09NUEFUX0FUVFIpKSB7CisJaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQVRUUjIpKSB7CiAJCWlmIChieXRlcyA8PSBYRlNfSUZPUktfQVNJWkUoZHApKQogCQkJcmV0dXJuIG1wLT5tX2F0dHJvZmZzZXQgPj4gMzsKIAkJcmV0dXJuIDA7CkBAIC0xNTcsNyArMTU3LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHM7CiAKLQlpZiAoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9DT01QQVRfQVRUUikgJiYKKwlpZiAoKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0FUVFIyKSAmJgogCSAgICAhKFhGU19TQl9WRVJTSU9OX0hBU0FUVFIyKCZtcC0+bV9zYikpKSB7CiAJCXMgPSBYRlNfU0JfTE9DSyhtcCk7CiAJCWlmICghWEZTX1NCX1ZFUlNJT05fSEFTQVRUUjIoJm1wLT5tX3NiKSkgewpAQCAtMzExLDcgKzMxMSw3IEBACiAJICovCiAJdG90c2l6ZSAtPSBzaXplOwogCWlmICh0b3RzaXplID09IHNpemVvZih4ZnNfYXR0cl9zZl9oZHJfdCkgJiYgIWFyZ3MtPmFkZG5hbWUgJiYKLQkgICAgIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9DT01QQVRfQVRUUikpIHsKKwkgICAgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0FUVFIyKSkgewogCQkvKgogCQkgKiBMYXN0IGF0dHJpYnV0ZSBub3cgcmVtb3ZlZCwgcmV2ZXJ0IHRvIG9yaWdpbmFsCiAJCSAqIGlub2RlIGZvcm1hdCBtYWtpbmcgYWxsIGxpdGVyYWwgYXJlYSBhdmFpbGFibGUKQEAgLTMzMCw3ICszMzAsNyBAQAogCQlkcC0+aV9kLmRpX2ZvcmtvZmYgPSB4ZnNfYXR0cl9zaG9ydGZvcm1fYnl0ZXNmaXQoZHAsIHRvdHNpemUpOwogCQlBU1NFUlQoZHAtPmlfZC5kaV9mb3Jrb2ZmKTsKIAkJQVNTRVJUKHRvdHNpemUgPiBzaXplb2YoeGZzX2F0dHJfc2ZfaGRyX3QpIHx8IGFyZ3MtPmFkZG5hbWUgfHwKLQkJCShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9DT01QQVRfQVRUUikpOworCQkJIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9BVFRSMikpOwogCQlkcC0+aV9hZnAtPmlmX2V4dF9tYXggPQogCQkJWEZTX0lGT1JLX0FTSVpFKGRwKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CiAJCWRwLT5pX2RmLmlmX2V4dF9tYXggPQpAQCAtNzM5LDcgKzczOSw3IEBACiAJCQkJKyBuYW1lX2xvYy0+bmFtZWxlbgogCQkJCSsgSU5UX0dFVChuYW1lX2xvYy0+dmFsdWVsZW4sIEFSQ0hfQ09OVkVSVCk7CiAJfQotCWlmICghKGRwLT5pX21vdW50LT5tX2ZsYWdzICYgWEZTX01PVU5UX0NPTVBBVF9BVFRSKSAmJgorCWlmICgoZHAtPmlfbW91bnQtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQVRUUjIpICYmCiAJICAgIChieXRlcyA9PSBzaXplb2Yoc3RydWN0IHhmc19hdHRyX3NmX2hkcikpKQogCQlyZXR1cm4oLTEpOwogCXJldHVybih4ZnNfYXR0cl9zaG9ydGZvcm1fYnl0ZXNmaXQoZHAsIGJ5dGVzKSk7CkBAIC03NzgsNyArNzc4LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlpZiAoZm9ya29mZiA9PSAtMSkgewotCQlBU1NFUlQoIShkcC0+aV9tb3VudC0+bV9mbGFncyAmIFhGU19NT1VOVF9DT01QQVRfQVRUUikpOworCQlBU1NFUlQoZHAtPmlfbW91bnQtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQVRUUjIpOwogCiAJCS8qCiAJCSAqIExhc3QgYXR0cmlidXRlIHdhcyByZW1vdmVkLCByZXZlcnQgdG8gb3JpZ2luYWwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmggYi9mcy94ZnMveGZzX2F0dHJfbGVhZi5oCmluZGV4IGY2MTQzZmYuLjU0MWUzNDEwIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2F0dHJfbGVhZi5oCisrKyBiL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmgKQEAgLTYzLDcgKzYzLDcgQEAKICAqIHRoZSBsZWFmX2VudHJ5LiAgVGhlIG5hbWVzcGFjZXMgYXJlIGluZGVwZW5kZW50IG9ubHkgYmVjYXVzZSB3ZSBhbHNvIGxvb2sKICAqIGF0IHRoZSBuYW1lc3BhY2UgYml0IHdoZW4gd2UgYXJlIGxvb2tpbmcgZm9yIGEgbWF0Y2hpbmcgYXR0cmlidXRlIG5hbWUuCiAgKgotICogV2UgYWxzbyBzdG9yZSBhICJpbmNvbXBsZXRlIiBiaXQgaW4gdGhlIGxlYWZfZW50cnkuICBJdCBzaG93cyB0aGF0IGFuCisgKiBXZSBhbHNvIHN0b3JlIGFuICJpbmNvbXBsZXRlIiBiaXQgaW4gdGhlIGxlYWZfZW50cnkuICBJdCBzaG93cyB0aGF0IGFuCiAgKiBhdHRyaWJ1dGUgaXMgaW4gdGhlIG1pZGRsZSBvZiBiZWluZyBjcmVhdGVkIGFuZCBzaG91bGQgbm90IGJlIHNob3duIHRvCiAgKiB0aGUgdXNlciBpZiB3ZSBjcmFzaCBkdXJpbmcgdGhlIHRpbWUgdGhhdCB0aGUgYml0IGlzIHNldC4gIFdlIGNsZWFyIHRoZQogICogYml0IHdoZW4gd2UgaGF2ZSBmaW5pc2hlZCBzZXR0aW5nIHVwIHRoZSBhdHRyaWJ1dGUuICBXZSBkbyB0aGlzIGJlY2F1c2UKQEAgLTcyLDQyICs3Miw0OCBAQAogICovCiAjZGVmaW5lIFhGU19BVFRSX0xFQUZfTUFQU0laRQkzCS8qIGhvdyBtYW55IGZyZWVzcGFjZSBzbG90cyAqLwogCit0eXBlZGVmIHN0cnVjdCB4ZnNfYXR0cl9sZWFmX21hcCB7CS8qIFJMRSBtYXAgb2YgZnJlZSBieXRlcyAqLworCV9fdWludDE2X3QJYmFzZTsJIAkvKiBiYXNlIG9mIGZyZWUgcmVnaW9uICovCisJX191aW50MTZfdAlzaXplOwkgIAkvKiBsZW5ndGggb2YgZnJlZSByZWdpb24gKi8KK30geGZzX2F0dHJfbGVhZl9tYXBfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2F0dHJfbGVhZl9oZHIgewkvKiBjb25zdGFudC1zdHJ1Y3R1cmUgaGVhZGVyIGJsb2NrICovCisJeGZzX2RhX2Jsa2luZm9fdCBpbmZvOwkJLyogYmxvY2sgdHlwZSwgbGlua3MsIGV0Yy4gKi8KKwlfX3VpbnQxNl90CWNvdW50OwkJLyogY291bnQgb2YgYWN0aXZlIGxlYWZfZW50cnkncyAqLworCV9fdWludDE2X3QJdXNlZGJ5dGVzOwkvKiBudW0gYnl0ZXMgb2YgbmFtZXMvdmFsdWVzIHN0b3JlZCAqLworCV9fdWludDE2X3QJZmlyc3R1c2VkOwkvKiBmaXJzdCB1c2VkIGJ5dGUgaW4gbmFtZSBhcmVhICovCisJX191aW50OF90CWhvbGVzOwkJLyogIT0gMCBpZiBibGsgbmVlZHMgY29tcGFjdGlvbiAqLworCV9fdWludDhfdAlwYWQxOworCXhmc19hdHRyX2xlYWZfbWFwX3QgZnJlZW1hcFtYRlNfQVRUUl9MRUFGX01BUFNJWkVdOworCQkJCQkvKiBOIGxhcmdlc3QgZnJlZSByZWdpb25zICovCit9IHhmc19hdHRyX2xlYWZfaGRyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19hdHRyX2xlYWZfZW50cnkgewkvKiBzb3J0ZWQgb24ga2V5LCBub3QgbmFtZSAqLworCXhmc19kYWhhc2hfdAloYXNodmFsOwkvKiBoYXNoIHZhbHVlIG9mIG5hbWUgKi8KKwlfX3VpbnQxNl90CW5hbWVpZHg7CS8qIGluZGV4IGludG8gYnVmZmVyIG9mIG5hbWUvdmFsdWUgKi8KKwlfX3VpbnQ4X3QJZmxhZ3M7CQkvKiBMT0NBTC9ST09UL1NFQ1VSRS9JTkNPTVBMRVRFIGZsYWcgKi8KKwlfX3VpbnQ4X3QJcGFkMjsJCS8qIHVudXNlZCBwYWQgYnl0ZSAqLworfSB4ZnNfYXR0cl9sZWFmX2VudHJ5X3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbCB7CisJX191aW50MTZfdAl2YWx1ZWxlbjsJLyogbnVtYmVyIG9mIGJ5dGVzIGluIHZhbHVlICovCisJX191aW50OF90CW5hbWVsZW47CS8qIGxlbmd0aCBvZiBuYW1lIGJ5dGVzICovCisJX191aW50OF90CW5hbWV2YWxbMV07CS8qIG5hbWUvdmFsdWUgYnl0ZXMgKi8KK30geGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGUgeworCXhmc19kYWJsa190CXZhbHVlYmxrOwkvKiBibG9jayBudW1iZXIgb2YgdmFsdWUgYnl0ZXMgKi8KKwlfX3VpbnQzMl90CXZhbHVlbGVuOwkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gdmFsdWUgKi8KKwlfX3VpbnQ4X3QJbmFtZWxlbjsJLyogbGVuZ3RoIG9mIG5hbWUgYnl0ZXMgKi8KKwlfX3VpbnQ4X3QJbmFtZVsxXTsJLyogbmFtZSBieXRlcyAqLworfSB4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlX3Q7CisKIHR5cGVkZWYgc3RydWN0IHhmc19hdHRyX2xlYWZibG9jayB7Ci0Jc3RydWN0IHhmc19hdHRyX2xlYWZfaGRyIHsJLyogY29uc3RhbnQtc3RydWN0dXJlIGhlYWRlciBibG9jayAqLwotCQl4ZnNfZGFfYmxraW5mb190IGluZm87CS8qIGJsb2NrIHR5cGUsIGxpbmtzLCBldGMuICovCi0JCV9fdWludDE2X3QgY291bnQ7CS8qIGNvdW50IG9mIGFjdGl2ZSBsZWFmX2VudHJ5J3MgKi8KLQkJX191aW50MTZfdCB1c2VkYnl0ZXM7CS8qIG51bSBieXRlcyBvZiBuYW1lcy92YWx1ZXMgc3RvcmVkICovCi0JCV9fdWludDE2X3QgZmlyc3R1c2VkOwkvKiBmaXJzdCB1c2VkIGJ5dGUgaW4gbmFtZSBhcmVhICovCi0JCV9fdWludDhfdCAgaG9sZXM7CS8qICE9IDAgaWYgYmxrIG5lZWRzIGNvbXBhY3Rpb24gKi8KLQkJX191aW50OF90ICBwYWQxOwotCQlzdHJ1Y3QgeGZzX2F0dHJfbGVhZl9tYXAgewkgIC8qIFJMRSBtYXAgb2YgZnJlZSBieXRlcyAqLwotCQkJX191aW50MTZfdCBiYXNlOwkgIC8qIGJhc2Ugb2YgZnJlZSByZWdpb24gKi8KLQkJCV9fdWludDE2X3Qgc2l6ZTsJICAvKiBsZW5ndGggb2YgZnJlZSByZWdpb24gKi8KLQkJfSBmcmVlbWFwW1hGU19BVFRSX0xFQUZfTUFQU0laRV07IC8qIE4gbGFyZ2VzdCBmcmVlIHJlZ2lvbnMgKi8KLQl9IGhkcjsKLQlzdHJ1Y3QgeGZzX2F0dHJfbGVhZl9lbnRyeSB7CS8qIHNvcnRlZCBvbiBrZXksIG5vdCBuYW1lICovCi0JCXhmc19kYWhhc2hfdCBoYXNodmFsOwkvKiBoYXNoIHZhbHVlIG9mIG5hbWUgKi8KLQkJX191aW50MTZfdCBuYW1laWR4OwkvKiBpbmRleCBpbnRvIGJ1ZmZlciBvZiBuYW1lL3ZhbHVlICovCi0JCV9fdWludDhfdCBmbGFnczsJLyogTE9DQUwvUk9PVC9TRUNVUkUvSU5DT01QTEVURSBmbGFnICovCi0JCV9fdWludDhfdCBwYWQyOwkJLyogdW51c2VkIHBhZCBieXRlICovCi0JfSBlbnRyaWVzWzFdOwkJCS8qIHZhcmlhYmxlIHNpemVkIGFycmF5ICovCi0Jc3RydWN0IHhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbCB7Ci0JCV9fdWludDE2X3QgdmFsdWVsZW47CS8qIG51bWJlciBvZiBieXRlcyBpbiB2YWx1ZSAqLwotCQlfX3VpbnQ4X3QgbmFtZWxlbjsJLyogbGVuZ3RoIG9mIG5hbWUgYnl0ZXMgKi8KLQkJX191aW50OF90IG5hbWV2YWxbMV07CS8qIG5hbWUvdmFsdWUgYnl0ZXMgKi8KLQl9IG5hbWVsaXN0OwkJCS8qIGdyb3dzIGZyb20gYm90dG9tIG9mIGJ1ZiAqLwotCXN0cnVjdCB4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlIHsKLQkJeGZzX2RhYmxrX3QgdmFsdWVibGs7CS8qIGJsb2NrIG51bWJlciBvZiB2YWx1ZSBieXRlcyAqLwotCQlfX3VpbnQzMl90IHZhbHVlbGVuOwkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gdmFsdWUgKi8KLQkJX191aW50OF90IG5hbWVsZW47CS8qIGxlbmd0aCBvZiBuYW1lIGJ5dGVzICovCi0JCV9fdWludDhfdCBuYW1lWzFdOwkvKiBuYW1lIGJ5dGVzICovCi0JfSB2YWx1ZWxpc3Q7CQkJLyogZ3Jvd3MgZnJvbSBib3R0b20gb2YgYnVmICovCisJeGZzX2F0dHJfbGVhZl9oZHJfdAloZHI7CS8qIGNvbnN0YW50LXN0cnVjdHVyZSBoZWFkZXIgYmxvY2sgKi8KKwl4ZnNfYXR0cl9sZWFmX2VudHJ5X3QJZW50cmllc1sxXTsJLyogc29ydGVkIG9uIGtleSwgbm90IG5hbWUgKi8KKwl4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWxfdCBuYW1lbGlzdDsJLyogZ3Jvd3MgZnJvbSBib3R0b20gb2YgYnVmICovCisJeGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZV90IHZhbHVlbGlzdDsJLyogZ3Jvd3MgZnJvbSBib3R0b20gb2YgYnVmICovCiB9IHhmc19hdHRyX2xlYWZibG9ja190OwotdHlwZWRlZiBzdHJ1Y3QgeGZzX2F0dHJfbGVhZl9oZHIgeGZzX2F0dHJfbGVhZl9oZHJfdDsKLXR5cGVkZWYgc3RydWN0IHhmc19hdHRyX2xlYWZfbWFwIHhmc19hdHRyX2xlYWZfbWFwX3Q7Ci10eXBlZGVmIHN0cnVjdCB4ZnNfYXR0cl9sZWFmX2VudHJ5IHhmc19hdHRyX2xlYWZfZW50cnlfdDsKLXR5cGVkZWYgc3RydWN0IHhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbCB4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWxfdDsKLXR5cGVkZWYgc3RydWN0IHhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGUgeGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZV90OwogCiAvKgogICogRmxhZ3MgdXNlZCBpbiB0aGUgbGVhZl9lbnRyeVtpXS5mbGFncyBmaWVsZC4KQEAgLTE1MCw3ICsxNTYsOCBAQAogCQkobGVhZnApKVtJTlRfR0VUKChsZWFmcCktPmVudHJpZXNbaWR4XS5uYW1laWR4LCBBUkNIX0NPTlZFUlQpXTsKIH0KIAotI2RlZmluZSBYRlNfQVRUUl9MRUFGX05BTUUobGVhZnAsaWR4KQkJeGZzX2F0dHJfbGVhZl9uYW1lKGxlYWZwLGlkeCkKKyNkZWZpbmUgWEZTX0FUVFJfTEVBRl9OQU1FKGxlYWZwLGlkeCkJCVwKKwl4ZnNfYXR0cl9sZWFmX25hbWUobGVhZnAsaWR4KQogc3RhdGljIGlubGluZSBjaGFyICp4ZnNfYXR0cl9sZWFmX25hbWUoeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWZwLCBpbnQgaWR4KQogewogCXJldHVybiAoJigoY2hhciAqKQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ibWFwLmMgYi9mcy94ZnMveGZzX2JtYXAuYwppbmRleCBlNDE1YTQ2Li43MDYyNWU1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2JtYXAuYworKysgYi9mcy94ZnMveGZzX2JtYXAuYwpAQCAtMjE0NiwxMyArMjE0NiwxNzYgQEAKIAlyZXR1cm4gMDsgLyoga2VlcCBnY2MgcXVpdGUgKi8KIH0KIAorLyoKKyAqIEFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgbmV3IGV4dGVudCBiYXNlZCBvbiBkaV9leHRzaXplIGFuZCBydCBleHRzaXplLgorICovCitTVEFUSUMgaW50Cit4ZnNfYm1hcF9leHRzaXplX2FsaWduKAorCXhmc19tb3VudF90CSptcCwKKwl4ZnNfYm1idF9pcmVjX3QJKmdvdHAsCQkvKiBuZXh0IGV4dGVudCBwb2ludGVyICovCisJeGZzX2JtYnRfaXJlY190CSpwcmV2cCwJCS8qIHByZXZpb3VzIGV4dGVudCBwb2ludGVyICovCisJeGZzX2V4dGxlbl90CWV4dHN6LAkJLyogYWxpZ24gdG8gdGhpcyBleHRlbnQgc2l6ZSAqLworCWludAkJcnQsCQkvKiBpcyB0aGlzIGEgcmVhbHRpbWUgaW5vZGU/ICovCisJaW50CQllb2YsCQkvKiBpcyBleHRlbnQgYXQgZW5kLW9mLWZpbGU/ICovCisJaW50CQlkZWxheSwJCS8qIGNyZWF0aW5nIGRlbGFsbG9jIGV4dGVudD8gKi8KKwlpbnQJCWNvbnZlcnQsCS8qIG92ZXJ3cml0aW5nIHVud3JpdHRlbiBleHRlbnQ/ICovCisJeGZzX2ZpbGVvZmZfdAkqb2ZmcCwJCS8qIGluL291dDogYWxpZ25lZCBvZmZzZXQgKi8KKwl4ZnNfZXh0bGVuX3QJKmxlbnApCQkvKiBpbi9vdXQ6IGFsaWduZWQgbGVuZ3RoICovCit7CisJeGZzX2ZpbGVvZmZfdAlvcmlnX29mZjsJLyogb3JpZ2luYWwgb2Zmc2V0ICovCisJeGZzX2V4dGxlbl90CW9yaWdfYWxlbjsJLyogb3JpZ2luYWwgbGVuZ3RoICovCisJeGZzX2ZpbGVvZmZfdAlvcmlnX2VuZDsJLyogb3JpZ2luYWwgb2ZmK2xlbiAqLworCXhmc19maWxlb2ZmX3QJbmV4dG87CQkvKiBuZXh0IGZpbGUgb2Zmc2V0ICovCisJeGZzX2ZpbGVvZmZfdAlwcmV2bzsJCS8qIHByZXZpb3VzIGZpbGUgb2Zmc2V0ICovCisJeGZzX2ZpbGVvZmZfdAlhbGlnbl9vZmY7CS8qIHRlbXAgZm9yIG9mZnNldCAqLworCXhmc19leHRsZW5fdAlhbGlnbl9hbGVuOwkvKiB0ZW1wIGZvciBsZW5ndGggKi8KKwl4ZnNfZXh0bGVuX3QJdGVtcDsJCS8qIHRlbXAgZm9yIGNhbGN1bGF0aW9ucyAqLworCisJaWYgKGNvbnZlcnQpCisJCXJldHVybiAwOworCisJb3JpZ19vZmYgPSBhbGlnbl9vZmYgPSAqb2ZmcDsKKwlvcmlnX2FsZW4gPSBhbGlnbl9hbGVuID0gKmxlbnA7CisJb3JpZ19lbmQgPSBvcmlnX29mZiArIG9yaWdfYWxlbjsKKworCS8qCisJICogSWYgdGhpcyByZXF1ZXN0IG92ZXJsYXBzIGFuIGV4aXN0aW5nIGV4dGVudCwgdGhlbiBkb24ndAorCSAqIGF0dGVtcHQgdG8gcGVyZm9ybSBhbnkgYWRkaXRpb25hbCBhbGlnbm1lbnQuCisJICovCisJaWYgKCFkZWxheSAmJiAhZW9mICYmCisJICAgIChvcmlnX29mZiA+PSBnb3RwLT5icl9zdGFydG9mZikgJiYKKwkgICAgKG9yaWdfZW5kIDw9IGdvdHAtPmJyX3N0YXJ0b2ZmICsgZ290cC0+YnJfYmxvY2tjb3VudCkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgZmlsZSBvZmZzZXQgaXMgdW5hbGlnbmVkIHZzLiB0aGUgZXh0ZW50IHNpemUKKwkgKiB3ZSBuZWVkIHRvIGFsaWduIGl0LiAgVGhpcyB3aWxsIGJlIHBvc3NpYmxlIHVubGVzcworCSAqIHRoZSBmaWxlIHdhcyBwcmV2aW91c2x5IHdyaXR0ZW4gd2l0aCBhIGtlcm5lbCB0aGF0IGRpZG4ndAorCSAqIHBlcmZvcm0gdGhpcyBhbGlnbm1lbnQsIG9yIGlmIGEgdHJ1bmNhdGUgc2hvdCB1cyBpbiB0aGUKKwkgKiBmb290LgorCSAqLworCXRlbXAgPSBkb19tb2Qob3JpZ19vZmYsIGV4dHN6KTsKKwlpZiAodGVtcCkgeworCQlhbGlnbl9hbGVuICs9IHRlbXA7CisJCWFsaWduX29mZiAtPSB0ZW1wOworCX0KKwkvKgorCSAqIFNhbWUgYWRqdXN0bWVudCBmb3IgdGhlIGVuZCBvZiB0aGUgcmVxdWVzdGVkIGFyZWEuCisJICovCisJaWYgKCh0ZW1wID0gKGFsaWduX2FsZW4gJSBleHRzeikpKSB7CisJCWFsaWduX2FsZW4gKz0gZXh0c3ogLSB0ZW1wOworCX0KKwkvKgorCSAqIElmIHRoZSBwcmV2aW91cyBibG9jayBvdmVybGFwcyB3aXRoIHRoaXMgcHJvcG9zZWQgYWxsb2NhdGlvbgorCSAqIHRoZW4gbW92ZSB0aGUgc3RhcnQgZm9yd2FyZCB3aXRob3V0IGFkanVzdGluZyB0aGUgbGVuZ3RoLgorCSAqLworCWlmIChwcmV2cC0+YnJfc3RhcnRvZmYgIT0gTlVMTEZJTEVPRkYpIHsKKwkJaWYgKHByZXZwLT5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLKQorCQkJcHJldm8gPSBwcmV2cC0+YnJfc3RhcnRvZmY7CisJCWVsc2UKKwkJCXByZXZvID0gcHJldnAtPmJyX3N0YXJ0b2ZmICsgcHJldnAtPmJyX2Jsb2NrY291bnQ7CisJfSBlbHNlCisJCXByZXZvID0gMDsKKwlpZiAoYWxpZ25fb2ZmICE9IG9yaWdfb2ZmICYmIGFsaWduX29mZiA8IHByZXZvKQorCQlhbGlnbl9vZmYgPSBwcmV2bzsKKwkvKgorCSAqIElmIHRoZSBuZXh0IGJsb2NrIG92ZXJsYXBzIHdpdGggdGhpcyBwcm9wb3NlZCBhbGxvY2F0aW9uCisJICogdGhlbiBtb3ZlIHRoZSBzdGFydCBiYWNrIHdpdGhvdXQgYWRqdXN0aW5nIHRoZSBsZW5ndGgsCisJICogYnV0IG5vdCBiZWZvcmUgb2Zmc2V0IDAuCisJICogVGhpcyBtYXkgb2YgY291cnNlIG1ha2UgdGhlIHN0YXJ0IG92ZXJsYXAgcHJldmlvdXMgYmxvY2ssCisJICogYW5kIGlmIHdlIGhpdCB0aGUgb2Zmc2V0IDAgbGltaXQgdGhlbiB0aGUgbmV4dCBibG9jaworCSAqIGNhbiBzdGlsbCBvdmVybGFwIHRvby4KKwkgKi8KKwlpZiAoIWVvZiAmJiBnb3RwLT5icl9zdGFydG9mZiAhPSBOVUxMRklMRU9GRikgeworCQlpZiAoKGRlbGF5ICYmIGdvdHAtPmJyX3N0YXJ0YmxvY2sgPT0gSE9MRVNUQVJUQkxPQ0spIHx8CisJCSAgICAoIWRlbGF5ICYmIGdvdHAtPmJyX3N0YXJ0YmxvY2sgPT0gREVMQVlTVEFSVEJMT0NLKSkKKwkJCW5leHRvID0gZ290cC0+YnJfc3RhcnRvZmYgKyBnb3RwLT5icl9ibG9ja2NvdW50OworCQllbHNlCisJCQluZXh0byA9IGdvdHAtPmJyX3N0YXJ0b2ZmOworCX0gZWxzZQorCQluZXh0byA9IE5VTExGSUxFT0ZGOworCWlmICghZW9mICYmCisJICAgIGFsaWduX29mZiArIGFsaWduX2FsZW4gIT0gb3JpZ19lbmQgJiYKKwkgICAgYWxpZ25fb2ZmICsgYWxpZ25fYWxlbiA+IG5leHRvKQorCQlhbGlnbl9vZmYgPSBuZXh0byA+IGFsaWduX2FsZW4gPyBuZXh0byAtIGFsaWduX2FsZW4gOiAwOworCS8qCisJICogSWYgd2UncmUgbm93IG92ZXJsYXBwaW5nIHRoZSBuZXh0IG9yIHByZXZpb3VzIGV4dGVudCB0aGF0CisJICogbWVhbnMgd2UgY2FuJ3QgZml0IGFuIGV4dHN6IHBpZWNlIGluIHRoaXMgaG9sZS4gIEp1c3QgbW92ZQorCSAqIHRoZSBzdGFydCBmb3J3YXJkIHRvIHRoZSBmaXJzdCB2YWxpZCBzcG90IGFuZCBzZXQKKwkgKiB0aGUgbGVuZ3RoIHNvIHdlIGhpdCB0aGUgZW5kLgorCSAqLworCWlmIChhbGlnbl9vZmYgIT0gb3JpZ19vZmYgJiYgYWxpZ25fb2ZmIDwgcHJldm8pCisJCWFsaWduX29mZiA9IHByZXZvOworCWlmIChhbGlnbl9vZmYgKyBhbGlnbl9hbGVuICE9IG9yaWdfZW5kICYmCisJICAgIGFsaWduX29mZiArIGFsaWduX2FsZW4gPiBuZXh0byAmJgorCSAgICBuZXh0byAhPSBOVUxMRklMRU9GRikgeworCQlBU1NFUlQobmV4dG8gPiBwcmV2byk7CisJCWFsaWduX2FsZW4gPSBuZXh0byAtIGFsaWduX29mZjsKKwl9CisKKwkvKgorCSAqIElmIHJlYWx0aW1lLCBhbmQgdGhlIHJlc3VsdCBpc24ndCBhIG11bHRpcGxlIG9mIHRoZSByZWFsdGltZQorCSAqIGV4dGVudCBzaXplIHdlIG5lZWQgdG8gcmVtb3ZlIGJsb2NrcyB1bnRpbCBpdCBpcy4KKwkgKi8KKwlpZiAocnQgJiYgKHRlbXAgPSAoYWxpZ25fYWxlbiAlIG1wLT5tX3NiLnNiX3JleHRzaXplKSkpIHsKKwkJLyoKKwkJICogV2UncmUgbm90IGNvdmVyaW5nIHRoZSBvcmlnaW5hbCByZXF1ZXN0LCBvcgorCQkgKiB3ZSB3b24ndCBiZSBhYmxlIHRvIG9uY2Ugd2UgZml4IHRoZSBsZW5ndGguCisJCSAqLworCQlpZiAob3JpZ19vZmYgPCBhbGlnbl9vZmYgfHwKKwkJICAgIG9yaWdfZW5kID4gYWxpZ25fb2ZmICsgYWxpZ25fYWxlbiB8fAorCQkgICAgYWxpZ25fYWxlbiAtIHRlbXAgPCBvcmlnX2FsZW4pCisJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJCS8qCisJCSAqIFRyeSB0byBmaXggaXQgYnkgbW92aW5nIHRoZSBzdGFydCB1cC4KKwkJICovCisJCWlmIChhbGlnbl9vZmYgKyB0ZW1wIDw9IG9yaWdfb2ZmKSB7CisJCQlhbGlnbl9hbGVuIC09IHRlbXA7CisJCQlhbGlnbl9vZmYgKz0gdGVtcDsKKwkJfQorCQkvKgorCQkgKiBUcnkgdG8gZml4IGl0IGJ5IG1vdmluZyB0aGUgZW5kIGluLgorCQkgKi8KKwkJZWxzZSBpZiAoYWxpZ25fb2ZmICsgYWxpZ25fYWxlbiAtIHRlbXAgPj0gb3JpZ19lbmQpCisJCQlhbGlnbl9hbGVuIC09IHRlbXA7CisJCS8qCisJCSAqIFNldCB0aGUgc3RhcnQgdG8gdGhlIG1pbmltdW0gdGhlbiB0cmltIHRoZSBsZW5ndGguCisJCSAqLworCQllbHNlIHsKKwkJCWFsaWduX2FsZW4gLT0gb3JpZ19vZmYgLSBhbGlnbl9vZmY7CisJCQlhbGlnbl9vZmYgPSBvcmlnX29mZjsKKwkJCWFsaWduX2FsZW4gLT0gYWxpZ25fYWxlbiAlIG1wLT5tX3NiLnNiX3JleHRzaXplOworCQl9CisJCS8qCisJCSAqIFJlc3VsdCBkb2Vzbid0IGNvdmVyIHRoZSByZXF1ZXN0LCBmYWlsIGl0LgorCQkgKi8KKwkJaWYgKG9yaWdfb2ZmIDwgYWxpZ25fb2ZmIHx8IG9yaWdfZW5kID4gYWxpZ25fb2ZmICsgYWxpZ25fYWxlbikKKwkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwl9IGVsc2UgeworCQlBU1NFUlQob3JpZ19vZmYgPj0gYWxpZ25fb2ZmKTsKKwkJQVNTRVJUKG9yaWdfZW5kIDw9IGFsaWduX29mZiArIGFsaWduX2FsZW4pOworCX0KKworI2lmZGVmIERFQlVHCisJaWYgKCFlb2YgJiYgZ290cC0+YnJfc3RhcnRvZmYgIT0gTlVMTEZJTEVPRkYpCisJCUFTU0VSVChhbGlnbl9vZmYgKyBhbGlnbl9hbGVuIDw9IGdvdHAtPmJyX3N0YXJ0b2ZmKTsKKwlpZiAocHJldnAtPmJyX3N0YXJ0b2ZmICE9IE5VTExGSUxFT0ZGKQorCQlBU1NFUlQoYWxpZ25fb2ZmID49IHByZXZwLT5icl9zdGFydG9mZiArIHByZXZwLT5icl9ibG9ja2NvdW50KTsKKyNlbmRpZgorCisJKmxlbnAgPSBhbGlnbl9hbGVuOworCSpvZmZwID0gYWxpZ25fb2ZmOworCXJldHVybiAwOworfQorCiAjZGVmaW5lIFhGU19BTExPQ19HQVBfVU5JVFMJNAogCiAvKgogICogeGZzX2JtYXBfYWxsb2MgaXMgY2FsbGVkIGJ5IHhmc19ibWFwaSB0byBhbGxvY2F0ZSBhbiBleHRlbnQgZm9yIGEgZmlsZS4KICAqIEl0IGZpZ3VyZXMgb3V0IHdoZXJlIHRvIGFzayB0aGUgdW5kZXJseWluZyBhbGxvY2F0b3IgdG8gcHV0IHRoZSBuZXcgZXh0ZW50LgogICovCi1TVEFUSUMgaW50CQkJCS8qIGVycm9yICovCitTVEFUSUMgaW50CiB4ZnNfYm1hcF9hbGxvYygKIAl4ZnNfYm1hbGxvY2FfdAkqYXApCQkvKiBibWFwIGFsbG9jIGFyZ3VtZW50IHN0cnVjdCAqLwogewpAQCAtMjE2MywxMCArMjMyNiwxMCBAQAogCXhmc19tb3VudF90CSptcDsJCS8qIG1vdW50IHBvaW50IHN0cnVjdHVyZSAqLwogCWludAkJbnVsbGZiOwkJLyogdHJ1ZSBpZiBhcC0+Zmlyc3RibG9jayBpc24ndCBzZXQgKi8KIAlpbnQJCXJ0OwkJLyogdHJ1ZSBpZiBpbm9kZSBpcyByZWFsdGltZSAqLwotI2lmZGVmIF9fS0VSTkVMX18KLQl4ZnNfZXh0bGVuX3QJcHJvZD0wOwkJLyogcHJvZHVjdCBmYWN0b3IgZm9yIGFsbG9jYXRvcnMgKi8KLQl4ZnNfZXh0bGVuX3QJcmFsZW49MDsJLyogcmVhbHRpbWUgYWxsb2NhdGlvbiBsZW5ndGggKi8KLSNlbmRpZgorCXhmc19leHRsZW5fdAlwcm9kID0gMDsJLyogcHJvZHVjdCBmYWN0b3IgZm9yIGFsbG9jYXRvcnMgKi8KKwl4ZnNfZXh0bGVuX3QJcmFsZW4gPSAwOwkvKiByZWFsdGltZSBhbGxvY2F0aW9uIGxlbmd0aCAqLworCXhmc19leHRsZW5fdAlhbGlnbjsJCS8qIG1pbmltdW0gYWxsb2NhdGlvbiBhbGlnbm1lbnQgKi8KKwl4ZnNfcnRibG9ja190CXJ0eDsKIAogI2RlZmluZQlJU1ZBTElEKHgseSkJXAogCShydCA/IFwKQEAgLTIxODIsMTI1ICsyMzQ1LDI1IEBACiAJbnVsbGZiID0gYXAtPmZpcnN0YmxvY2sgPT0gTlVMTEZTQkxPQ0s7CiAJcnQgPSBYRlNfSVNfUkVBTFRJTUVfSU5PREUoYXAtPmlwKSAmJiBhcC0+dXNlcmRhdGE7CiAJZmJfYWdubyA9IG51bGxmYiA/IE5VTExBR05VTUJFUiA6IFhGU19GU0JfVE9fQUdOTyhtcCwgYXAtPmZpcnN0YmxvY2spOwotI2lmZGVmIF9fS0VSTkVMX18KIAlpZiAocnQpIHsKLQkJeGZzX2V4dGxlbl90CWV4dHN6OwkJLyogZmlsZSBleHRlbnQgc2l6ZSBmb3IgcnQgKi8KLQkJeGZzX2ZpbGVvZmZfdAluZXh0bzsJCS8qIG5leHQgZmlsZSBvZmZzZXQgKi8KLQkJeGZzX2V4dGxlbl90CW9yaWdfYWxlbjsJLyogb3JpZ2luYWwgYXAtPmFsZW4gKi8KLQkJeGZzX2ZpbGVvZmZfdAlvcmlnX2VuZDsJLyogb3JpZ2luYWwgb2ZmK2xlbiAqLwotCQl4ZnNfZmlsZW9mZl90CW9yaWdfb2ZmOwkvKiBvcmlnaW5hbCBhcC0+b2ZmICovCi0JCXhmc19leHRsZW5fdAltb2Rfb2ZmOwkvKiBtb2R1bHVzIGNhbGN1bGF0aW9ucyAqLwotCQl4ZnNfZmlsZW9mZl90CXByZXZvOwkJLyogcHJldmlvdXMgZmlsZSBvZmZzZXQgKi8KLQkJeGZzX3J0YmxvY2tfdAlydHg7CQkvKiByZWFsdGltZSBleHRlbnQgbnVtYmVyICovCi0JCXhmc19leHRsZW5fdAl0ZW1wOwkJLyogdGVtcCBmb3IgcnQgY2FsY3VsYXRpb25zICovCisJCWFsaWduID0gYXAtPmlwLT5pX2QuZGlfZXh0c2l6ZSA/CisJCQlhcC0+aXAtPmlfZC5kaV9leHRzaXplIDogbXAtPm1fc2Iuc2JfcmV4dHNpemU7CisJCS8qIFNldCBwcm9kIHRvIG1hdGNoIHRoZSBleHRlbnQgc2l6ZSAqLworCQlwcm9kID0gYWxpZ24gLyBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKIAotCQkvKgotCQkgKiBTZXQgcHJvZCB0byBtYXRjaCB0aGUgcmVhbHRpbWUgZXh0ZW50IHNpemUuCi0JCSAqLwotCQlpZiAoIShleHRzeiA9IGFwLT5pcC0+aV9kLmRpX2V4dHNpemUpKQotCQkJZXh0c3ogPSBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKLQkJcHJvZCA9IGV4dHN6IC8gbXAtPm1fc2Iuc2JfcmV4dHNpemU7Ci0JCW9yaWdfb2ZmID0gYXAtPm9mZjsKLQkJb3JpZ19hbGVuID0gYXAtPmFsZW47Ci0JCW9yaWdfZW5kID0gb3JpZ19vZmYgKyBvcmlnX2FsZW47Ci0JCS8qCi0JCSAqIElmIHRoZSBmaWxlIG9mZnNldCBpcyB1bmFsaWduZWQgdnMuIHRoZSBleHRlbnQgc2l6ZQotCQkgKiB3ZSBuZWVkIHRvIGFsaWduIGl0LiAgVGhpcyB3aWxsIGJlIHBvc3NpYmxlIHVubGVzcwotCQkgKiB0aGUgZmlsZSB3YXMgcHJldmlvdXNseSB3cml0dGVuIHdpdGggYSBrZXJuZWwgdGhhdCBkaWRuJ3QKLQkJICogcGVyZm9ybSB0aGlzIGFsaWdubWVudC4KLQkJICovCi0JCW1vZF9vZmYgPSBkb19tb2Qob3JpZ19vZmYsIGV4dHN6KTsKLQkJaWYgKG1vZF9vZmYpIHsKLQkJCWFwLT5hbGVuICs9IG1vZF9vZmY7Ci0JCQlhcC0+b2ZmIC09IG1vZF9vZmY7Ci0JCX0KLQkJLyoKLQkJICogU2FtZSBhZGp1c3RtZW50IGZvciB0aGUgZW5kIG9mIHRoZSByZXF1ZXN0ZWQgYXJlYS4KLQkJICovCi0JCWlmICgodGVtcCA9IChhcC0+YWxlbiAlIGV4dHN6KSkpCi0JCQlhcC0+YWxlbiArPSBleHRzeiAtIHRlbXA7Ci0JCS8qCi0JCSAqIElmIHRoZSBwcmV2aW91cyBibG9jayBvdmVybGFwcyB3aXRoIHRoaXMgcHJvcG9zZWQgYWxsb2NhdGlvbgotCQkgKiB0aGVuIG1vdmUgdGhlIHN0YXJ0IGZvcndhcmQgd2l0aG91dCBhZGp1c3RpbmcgdGhlIGxlbmd0aC4KLQkJICovCi0JCXByZXZvID0KLQkJCWFwLT5wcmV2cC0+YnJfc3RhcnRvZmYgPT0gTlVMTEZJTEVPRkYgPwotCQkJCTAgOgotCQkJCShhcC0+cHJldnAtPmJyX3N0YXJ0b2ZmICsKLQkJCQkgYXAtPnByZXZwLT5icl9ibG9ja2NvdW50KTsKLQkJaWYgKGFwLT5vZmYgIT0gb3JpZ19vZmYgJiYgYXAtPm9mZiA8IHByZXZvKQotCQkJYXAtPm9mZiA9IHByZXZvOwotCQkvKgotCQkgKiBJZiB0aGUgbmV4dCBibG9jayBvdmVybGFwcyB3aXRoIHRoaXMgcHJvcG9zZWQgYWxsb2NhdGlvbgotCQkgKiB0aGVuIG1vdmUgdGhlIHN0YXJ0IGJhY2sgd2l0aG91dCBhZGp1c3RpbmcgdGhlIGxlbmd0aCwKLQkJICogYnV0IG5vdCBiZWZvcmUgb2Zmc2V0IDAuCi0JCSAqIFRoaXMgbWF5IG9mIGNvdXJzZSBtYWtlIHRoZSBzdGFydCBvdmVybGFwIHByZXZpb3VzIGJsb2NrLAotCQkgKiBhbmQgaWYgd2UgaGl0IHRoZSBvZmZzZXQgMCBsaW1pdCB0aGVuIHRoZSBuZXh0IGJsb2NrCi0JCSAqIGNhbiBzdGlsbCBvdmVybGFwIHRvby4KLQkJICovCi0JCW5leHRvID0gKGFwLT5lb2YgfHwgYXAtPmdvdHAtPmJyX3N0YXJ0b2ZmID09IE5VTExGSUxFT0ZGKSA/Ci0JCQlOVUxMRklMRU9GRiA6IGFwLT5nb3RwLT5icl9zdGFydG9mZjsKLQkJaWYgKCFhcC0+ZW9mICYmCi0JCSAgICBhcC0+b2ZmICsgYXAtPmFsZW4gIT0gb3JpZ19lbmQgJiYKLQkJICAgIGFwLT5vZmYgKyBhcC0+YWxlbiA+IG5leHRvKQotCQkJYXAtPm9mZiA9IG5leHRvID4gYXAtPmFsZW4gPyBuZXh0byAtIGFwLT5hbGVuIDogMDsKLQkJLyoKLQkJICogSWYgd2UncmUgbm93IG92ZXJsYXBwaW5nIHRoZSBuZXh0IG9yIHByZXZpb3VzIGV4dGVudCB0aGF0Ci0JCSAqIG1lYW5zIHdlIGNhbid0IGZpdCBhbiBleHRzeiBwaWVjZSBpbiB0aGlzIGhvbGUuICBKdXN0IG1vdmUKLQkJICogdGhlIHN0YXJ0IGZvcndhcmQgdG8gdGhlIGZpcnN0IHZhbGlkIHNwb3QgYW5kIHNldAotCQkgKiB0aGUgbGVuZ3RoIHNvIHdlIGhpdCB0aGUgZW5kLgotCQkgKi8KLQkJaWYgKChhcC0+b2ZmICE9IG9yaWdfb2ZmICYmIGFwLT5vZmYgPCBwcmV2bykgfHwKLQkJICAgIChhcC0+b2ZmICsgYXAtPmFsZW4gIT0gb3JpZ19lbmQgJiYKLQkJICAgICBhcC0+b2ZmICsgYXAtPmFsZW4gPiBuZXh0bykpIHsKLQkJCWFwLT5vZmYgPSBwcmV2bzsKLQkJCWFwLT5hbGVuID0gbmV4dG8gLSBwcmV2bzsKLQkJfQotCQkvKgotCQkgKiBJZiB0aGUgcmVzdWx0IGlzbid0IGEgbXVsdGlwbGUgb2YgcnRleHRlbnRzIHdlIG5lZWQgdG8KLQkJICogcmVtb3ZlIGJsb2NrcyB1bnRpbCBpdCBpcy4KLQkJICovCi0JCWlmICgodGVtcCA9IChhcC0+YWxlbiAlIG1wLT5tX3NiLnNiX3JleHRzaXplKSkpIHsKLQkJCS8qCi0JCQkgKiBXZSdyZSBub3QgY292ZXJpbmcgdGhlIG9yaWdpbmFsIHJlcXVlc3QsIG9yCi0JCQkgKiB3ZSB3b24ndCBiZSBhYmxlIHRvIG9uY2Ugd2UgZml4IHRoZSBsZW5ndGguCi0JCQkgKi8KLQkJCWlmIChvcmlnX29mZiA8IGFwLT5vZmYgfHwKLQkJCSAgICBvcmlnX2VuZCA+IGFwLT5vZmYgKyBhcC0+YWxlbiB8fAotCQkJICAgIGFwLT5hbGVuIC0gdGVtcCA8IG9yaWdfYWxlbikKLQkJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7Ci0JCQkvKgotCQkJICogVHJ5IHRvIGZpeCBpdCBieSBtb3ZpbmcgdGhlIHN0YXJ0IHVwLgotCQkJICovCi0JCQlpZiAoYXAtPm9mZiArIHRlbXAgPD0gb3JpZ19vZmYpIHsKLQkJCQlhcC0+YWxlbiAtPSB0ZW1wOwotCQkJCWFwLT5vZmYgKz0gdGVtcDsKLQkJCX0KLQkJCS8qCi0JCQkgKiBUcnkgdG8gZml4IGl0IGJ5IG1vdmluZyB0aGUgZW5kIGluLgotCQkJICovCi0JCQllbHNlIGlmIChhcC0+b2ZmICsgYXAtPmFsZW4gLSB0ZW1wID49IG9yaWdfZW5kKQotCQkJCWFwLT5hbGVuIC09IHRlbXA7Ci0JCQkvKgotCQkJICogU2V0IHRoZSBzdGFydCB0byB0aGUgbWluaW11bSB0aGVuIHRyaW0gdGhlIGxlbmd0aC4KLQkJCSAqLwotCQkJZWxzZSB7Ci0JCQkJYXAtPmFsZW4gLT0gb3JpZ19vZmYgLSBhcC0+b2ZmOwotCQkJCWFwLT5vZmYgPSBvcmlnX29mZjsKLQkJCQlhcC0+YWxlbiAtPSBhcC0+YWxlbiAlIG1wLT5tX3NiLnNiX3JleHRzaXplOwotCQkJfQotCQkJLyoKLQkJCSAqIFJlc3VsdCBkb2Vzbid0IGNvdmVyIHRoZSByZXF1ZXN0LCBmYWlsIGl0LgotCQkJICovCi0JCQlpZiAob3JpZ19vZmYgPCBhcC0+b2ZmIHx8IG9yaWdfZW5kID4gYXAtPm9mZiArIGFwLT5hbGVuKQotCQkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKLQkJfQorCQllcnJvciA9IHhmc19ibWFwX2V4dHNpemVfYWxpZ24obXAsIGFwLT5nb3RwLCBhcC0+cHJldnAsCisJCQkJCQlhbGlnbiwgcnQsIGFwLT5lb2YsIDAsCisJCQkJCQlhcC0+Y29udiwgJmFwLT5vZmYsICZhcC0+YWxlbik7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwkJQVNTRVJUKGFwLT5hbGVuKTsKIAkJQVNTRVJUKGFwLT5hbGVuICUgbXAtPm1fc2Iuc2JfcmV4dHNpemUgPT0gMCk7CisKIAkJLyoKIAkJICogSWYgdGhlIG9mZnNldCAmIGxlbmd0aCBhcmUgbm90IHBlcmZlY3RseSBhbGlnbmVkCiAJCSAqIHRoZW4ga2lsbCBwcm9kLCBpdCB3aWxsIGp1c3QgZ2V0IHVzIGluIHRyb3VibGUuCiAJCSAqLwotCQlpZiAoZG9fbW9kKGFwLT5vZmYsIGV4dHN6KSB8fCBhcC0+YWxlbiAlIGV4dHN6KQorCQlpZiAoZG9fbW9kKGFwLT5vZmYsIGFsaWduKSB8fCBhcC0+YWxlbiAlIGFsaWduKQogCQkJcHJvZCA9IDE7CiAJCS8qCiAJCSAqIFNldCByYWxlbiB0byBiZSB0aGUgYWN0dWFsIHJlcXVlc3RlZCBsZW5ndGggaW4gcnRleHRlbnRzLgpAQCAtMjMyNiwxNSArMjM4OSwyNCBAQAogCQkJYXAtPnJ2YWwgPSBydHggKiBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKIAkJfSBlbHNlCiAJCQlhcC0+cnZhbCA9IDA7CisJfSBlbHNlIHsKKwkJYWxpZ24gPSAoYXAtPnVzZXJkYXRhICYmIGFwLT5pcC0+aV9kLmRpX2V4dHNpemUgJiYKKwkJCShhcC0+aXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfRVhUU0laRSkpID8KKwkJCWFwLT5pcC0+aV9kLmRpX2V4dHNpemUgOiAwOworCQlpZiAodW5saWtlbHkoYWxpZ24pKSB7CisJCQllcnJvciA9IHhmc19ibWFwX2V4dHNpemVfYWxpZ24obXAsIGFwLT5nb3RwLCBhcC0+cHJldnAsCisJCQkJCQkJYWxpZ24sIHJ0LAorCQkJCQkJCWFwLT5lb2YsIDAsIGFwLT5jb252LAorCQkJCQkJCSZhcC0+b2ZmLCAmYXAtPmFsZW4pOworCQkJQVNTRVJUKCFlcnJvcik7CisJCQlBU1NFUlQoYXAtPmFsZW4pOworCQl9CisJCWlmIChudWxsZmIpCisJCQlhcC0+cnZhbCA9IFhGU19JTk9fVE9fRlNCKG1wLCBhcC0+aXAtPmlfaW5vKTsKKwkJZWxzZQorCQkJYXAtPnJ2YWwgPSBhcC0+Zmlyc3RibG9jazsKIAl9Ci0jZWxzZQotCWlmIChydCkKLQkJYXAtPnJ2YWwgPSAwOwotI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KLQllbHNlIGlmIChudWxsZmIpCi0JCWFwLT5ydmFsID0gWEZTX0lOT19UT19GU0IobXAsIGFwLT5pcC0+aV9pbm8pOwotCWVsc2UKLQkJYXAtPnJ2YWwgPSBhcC0+Zmlyc3RibG9jazsKKwogCS8qCiAJICogSWYgYWxsb2NhdGluZyBhdCBlb2YsIGFuZCB0aGVyZSdzIGEgcHJldmlvdXMgcmVhbCBibG9jaywKIAkgKiB0cnkgdG8gdXNlIGl0J3MgbGFzdCBibG9jayBhcyBvdXIgc3RhcnRpbmcgcG9pbnQuCkBAIC0yNTk4LDExICsyNjcwLDEyIEBACiAJCQlhcmdzLnRvdGFsID0gYXAtPnRvdGFsOwogCQkJYXJncy5taW5sZW4gPSBhcC0+bWlubGVuOwogCQl9Ci0JCWlmIChhcC0+aXAtPmlfZC5kaV9leHRzaXplKSB7CisJCWlmICh1bmxpa2VseShhcC0+dXNlcmRhdGEgJiYgYXAtPmlwLT5pX2QuZGlfZXh0c2l6ZSAmJgorCQkJICAgIChhcC0+aXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfRVhUU0laRSkpKSB7CiAJCQlhcmdzLnByb2QgPSBhcC0+aXAtPmlfZC5kaV9leHRzaXplOwogCQkJaWYgKChhcmdzLm1vZCA9ICh4ZnNfZXh0bGVuX3QpZG9fbW9kKGFwLT5vZmYsIGFyZ3MucHJvZCkpKQogCQkJCWFyZ3MubW9kID0gKHhmc19leHRsZW5fdCkoYXJncy5wcm9kIC0gYXJncy5tb2QpOwotCQl9IGVsc2UgaWYgKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSA+PSBOQlBQKSB7CisJCX0gZWxzZSBpZiAodW5saWtlbHkobXAtPm1fc2Iuc2JfYmxvY2tzaXplID49IE5CUFApKSB7CiAJCQlhcmdzLnByb2QgPSAxOwogCQkJYXJncy5tb2QgPSAwOwogCQl9IGVsc2UgewpAQCAtMzU4MCwxNCArMzY1MywxNiBAQAogCiAJZXAgPSB4ZnNfYm1hcF9kb19zZWFyY2hfZXh0ZW50cyhiYXNlLCBsYXN0eCwgbmV4dGVudHMsIGJubywgZW9mcCwKIAkJCQkJICBsYXN0eHAsIGdvdHAsIHByZXZwKTsKLQlydCA9IGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FOwotCWlmKCFydCAmJiAhZ290cC0+YnJfc3RhcnRibG9jayAmJiAoKmxhc3R4cCAhPSBOVUxMRVhUTlVNKSkgeworCXJ0ID0gKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKSAmJiBYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApOworCWlmICh1bmxpa2VseSghcnQgJiYgIWdvdHAtPmJyX3N0YXJ0YmxvY2sgJiYgKCpsYXN0eHAgIT0gTlVMTEVYVE5VTSkpKSB7CiAgICAgICAgICAgICAgICAgY21uX2VycihDRV9QQU5JQywiQWNjZXNzIHRvIGJsb2NrIHplcm86IGZzOiA8JXM+IGlub2RlOiAlbGxkICIKIAkJCSJzdGFydF9ibG9jayA6ICVsbHggc3RhcnRfb2ZmIDogJWxseCBibGtjbnQgOiAlbGx4ICIKIAkJCSJleHRlbnQtc3RhdGUgOiAleCBcbiIsCi0JCQkoaXAtPmlfbW91bnQpLT5tX2ZzbmFtZSwobG9uZyBsb25nKWlwLT5pX2lubywKLQkJCWdvdHAtPmJyX3N0YXJ0YmxvY2ssIGdvdHAtPmJyX3N0YXJ0b2ZmLAotCQkJZ290cC0+YnJfYmxvY2tjb3VudCxnb3RwLT5icl9zdGF0ZSk7CisJCQkoaXAtPmlfbW91bnQpLT5tX2ZzbmFtZSwgKGxvbmcgbG9uZylpcC0+aV9pbm8sCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWdvdHAtPmJyX3N0YXJ0YmxvY2ssCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWdvdHAtPmJyX3N0YXJ0b2ZmLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylnb3RwLT5icl9ibG9ja2NvdW50LAorCQkJZ290cC0+YnJfc3RhdGUpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBlcDsKIH0KQEAgLTM4NzUsNyArMzk1MCw3IEBACiAJCWlwLT5pX2QuZGlfZm9ya29mZiA9IHhmc19hdHRyX3Nob3J0Zm9ybV9ieXRlc2ZpdChpcCwgc2l6ZSk7CiAJCWlmICghaXAtPmlfZC5kaV9mb3Jrb2ZmKQogCQkJaXAtPmlfZC5kaV9mb3Jrb2ZmID0gbXAtPm1fYXR0cm9mZnNldCA+PiAzOwotCQllbHNlIGlmICghKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0NPTVBBVF9BVFRSKSkKKwkJZWxzZSBpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQVRUUjIpCiAJCQl2ZXJzaW9uID0gMjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTQwMjMsMTMgKzQwOTgsMTMgQEAKIAkgKi8KIAlpZiAod2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUkspIHsKIAkJbWF4bGVhZmVudHMgPSBNQVhFWFROVU07Ci0JCXN6ID0gKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0NPTVBBVF9BVFRSKSA/Ci0JCQltcC0+bV9hdHRyb2Zmc2V0IDogWEZTX0JNRFJfU1BBQ0VfQ0FMQyhNSU5EQlRQVFJTKTsKKwkJc3ogPSAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQVRUUjIpID8KKwkJCVhGU19CTURSX1NQQUNFX0NBTEMoTUlOREJUUFRSUykgOiBtcC0+bV9hdHRyb2Zmc2V0OwogCX0gZWxzZSB7CiAJCW1heGxlYWZlbnRzID0gTUFYQUVYVE5VTTsKLQkJc3ogPSAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQ09NUEFUX0FUVFIpID8KLQkJCW1wLT5tX3NiLnNiX2lub2Rlc2l6ZSAtIG1wLT5tX2F0dHJvZmZzZXQgOgotCQkJWEZTX0JNRFJfU1BBQ0VfQ0FMQyhNSU5BQlRQVFJTKTsKKwkJc3ogPSAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQVRUUjIpID8KKwkJCVhGU19CTURSX1NQQUNFX0NBTEMoTUlOQUJUUFRSUykgOgorCQkJbXAtPm1fc2Iuc2JfaW5vZGVzaXplIC0gbXAtPm1fYXR0cm9mZnNldDsKIAl9CiAJbWF4cm9vdHJlY3MgPSAoaW50KVhGU19CVFJFRV9CTE9DS19NQVhSRUNTKHN6LCB4ZnNfYm1kciwgMCk7CiAJbWlubGVhZnJlY3MgPSBtcC0+bV9ibWFwX2RtbnJbMF07CkBAIC00NDE4LDggKzQ0OTMsOCBAQAogCQludW1fcmVjcyA9IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKTsKIAkJaWYgKHVubGlrZWx5KGkgKyBudW1fcmVjcyA+IHJvb20pKSB7CiAJCQlBU1NFUlQoaSArIG51bV9yZWNzIDw9IHJvb20pOwotCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgaXAtPmlfbW91bnQsCi0JCQkJImNvcnJ1cHQgZGlub2RlICVMdSwgKGJ0cmVlIGV4dGVudHMpLiAgVW5tb3VudCBhbmQgcnVuIHhmc19yZXBhaXIuIiwKKwkJCXhmc19mc19yZXBhaXJfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKKwkJCQkiY29ycnVwdCBkaW5vZGUgJUx1LCAoYnRyZWUgZXh0ZW50cykuIiwKIAkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBpcC0+aV9pbm8pOwogCQkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2JtYXBfcmVhZF9leHRlbnRzKDEpIiwKIAkJCQkJIFhGU19FUlJMRVZFTF9MT1csCkBAIC00NTkwLDYgKzQ2NjUsNyBAQAogCWNoYXIJCWNvbnRpZzsJCS8qIGFsbG9jYXRpb24gbXVzdCBiZSBvbmUgZXh0ZW50ICovCiAJY2hhcgkJZGVsYXk7CQkvKiB0aGlzIHJlcXVlc3QgaXMgZm9yIGRlbGF5ZWQgYWxsb2MgKi8KIAljaGFyCQlleGFjdDsJCS8qIGRvbid0IGRvIGFsbCBvZiB3YXNkZWxheWVkIGV4dGVudCAqLworCWNoYXIJCWNvbnZlcnQ7CS8qIHVud3JpdHRlbiBleHRlbnQgSS9PIGNvbXBsZXRpb24gKi8KIAl4ZnNfYm1idF9yZWNfdAkqZXA7CQkvKiBleHRlbnQgbGlzdCBlbnRyeSBwb2ludGVyICovCiAJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiAqLwogCXhmc19ibWJ0X2lyZWNfdAlnb3Q7CQkvKiBjdXJyZW50IGV4dGVudCBsaXN0IHJlY29yZCAqLwpAQCAtNDY0Myw3ICs0NzE5LDcgQEAKIAl9CiAJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQogCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7Ci0JcnQgPSBYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApOworCXJ0ID0gKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKSAmJiBYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApOwogCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CiAJQVNTRVJUKGlmcC0+aWZfZXh0X21heCA9PQogCSAgICAgICBYRlNfSUZPUktfU0laRShpcCwgd2hpY2hmb3JrKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCkpOwpAQCAtNDY1NCw2ICs0NzMwLDcgQEAKIAlkZWxheSA9IChmbGFncyAmIFhGU19CTUFQSV9ERUxBWSkgIT0gMDsKIAl0cmltID0gKGZsYWdzICYgWEZTX0JNQVBJX0VOVElSRSkgPT0gMDsKIAl1c2VyZGF0YSA9IChmbGFncyAmIFhGU19CTUFQSV9NRVRBREFUQSkgPT0gMDsKKwljb252ZXJ0ID0gKGZsYWdzICYgWEZTX0JNQVBJX0NPTlZFUlQpICE9IDA7CiAJZXhhY3QgPSAoZmxhZ3MgJiBYRlNfQk1BUElfRVhBQ1QpICE9IDA7CiAJcnN2ZCA9IChmbGFncyAmIFhGU19CTUFQSV9SU1ZCTE9DS1MpICE9IDA7CiAJY29udGlnID0gKGZsYWdzICYgWEZTX0JNQVBJX0NPTlRJRykgIT0gMDsKQEAgLTQ3NDgsMTUgKzQ4MjUsMjUgQEAKIAkJCX0KIAkJCW1pbmxlbiA9IGNvbnRpZyA/IGFsZW4gOiAxOwogCQkJaWYgKGRlbGF5KSB7Ci0JCQkJeGZzX2V4dGxlbl90CWV4dHN6ID0gMDsKKwkJCQl4ZnNfZXh0bGVuX3QJZXh0c3o7CiAKIAkJCQkvKiBGaWd1cmUgb3V0IHRoZSBleHRlbnQgc2l6ZSwgYWRqdXN0IGFsZW4gKi8KIAkJCQlpZiAocnQpIHsKIAkJCQkJaWYgKCEoZXh0c3ogPSBpcC0+aV9kLmRpX2V4dHNpemUpKQogCQkJCQkJZXh0c3ogPSBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKLQkJCQkJYWxlbiA9IHJvdW5kdXAoYWxlbiwgZXh0c3opOwotCQkJCQlleHRzeiA9IGFsZW4gLyBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKKwkJCQl9IGVsc2UgeworCQkJCQlleHRzeiA9IGlwLT5pX2QuZGlfZXh0c2l6ZTsKIAkJCQl9CisJCQkJaWYgKGV4dHN6KSB7CisJCQkJCWVycm9yID0geGZzX2JtYXBfZXh0c2l6ZV9hbGlnbihtcCwKKwkJCQkJCQkmZ290LCAmcHJldiwgZXh0c3osCisJCQkJCQkJcnQsIGVvZiwgZGVsYXksIGNvbnZlcnQsCisJCQkJCQkJJmFvZmYsICZhbGVuKTsKKwkJCQkJQVNTRVJUKCFlcnJvcik7CisJCQkJfQorCisJCQkJaWYgKHJ0KQorCQkJCQlleHRzeiA9IGFsZW4gLyBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKIAogCQkJCS8qCiAJCQkJICogTWFrZSBhIHRyYW5zYWN0aW9uLWxlc3MgcXVvdGEgcmVzZXJ2YXRpb24gZm9yCkBAIC00Nzg1LDMyICs0ODcyLDMzIEBACiAJCQkJCXhmc19ibWFwX3dvcnN0X2luZGxlbihpcCwgYWxlbik7CiAJCQkJQVNTRVJUKGluZGxlbiA+IDApOwogCi0JCQkJaWYgKHJ0KQorCQkJCWlmIChydCkgewogCQkJCQllcnJvciA9IHhmc19tb2RfaW5jb3JlX3NiKG1wLAogCQkJCQkJCVhGU19TQlNfRlJFWFRFTlRTLAogCQkJCQkJCS0oZXh0c3opLCByc3ZkKTsKLQkJCQllbHNlCisJCQkJfSBlbHNlIHsKIAkJCQkJZXJyb3IgPSB4ZnNfbW9kX2luY29yZV9zYihtcCwKIAkJCQkJCQlYRlNfU0JTX0ZEQkxPQ0tTLAogCQkJCQkJCS0oYWxlbiksIHJzdmQpOworCQkJCX0KIAkJCQlpZiAoIWVycm9yKSB7CiAJCQkJCWVycm9yID0geGZzX21vZF9pbmNvcmVfc2IobXAsCiAJCQkJCQkJWEZTX1NCU19GREJMT0NLUywKIAkJCQkJCQktKGluZGxlbiksIHJzdmQpOwotCQkJCQlpZiAoZXJyb3IgJiYgcnQpIHsKLQkJCQkJCXhmc19tb2RfaW5jb3JlX3NiKGlwLT5pX21vdW50LAorCQkJCQlpZiAoZXJyb3IgJiYgcnQpCisJCQkJCQl4ZnNfbW9kX2luY29yZV9zYihtcCwKIAkJCQkJCQlYRlNfU0JTX0ZSRVhURU5UUywKIAkJCQkJCQlleHRzeiwgcnN2ZCk7Ci0JCQkJCX0gZWxzZSBpZiAoZXJyb3IpIHsKLQkJCQkJCXhmc19tb2RfaW5jb3JlX3NiKGlwLT5pX21vdW50LAorCQkJCQllbHNlIGlmIChlcnJvcikKKwkJCQkJCXhmc19tb2RfaW5jb3JlX3NiKG1wLAogCQkJCQkJCVhGU19TQlNfRkRCTE9DS1MsCiAJCQkJCQkJYWxlbiwgcnN2ZCk7Ci0JCQkJCX0KIAkJCQl9CiAKIAkJCQlpZiAoZXJyb3IpIHsKLQkJCQkJaWYgKFhGU19JU19RVU9UQV9PTihpcC0+aV9tb3VudCkpCisJCQkJCWlmIChYRlNfSVNfUVVPVEFfT04obXApKQogCQkJCQkJLyogdW5yZXNlcnZlIHRoZSBibG9ja3Mgbm93ICovCisJCQkJCQkodm9pZCkKIAkJCQkJCVhGU19UUkFOU19VTlJFU0VSVkVfUVVPVEFfTkJMS1MoCiAJCQkJCQkJbXAsIE5VTEwsIGlwLAogCQkJCQkJCShsb25nKWFsZW4sIDAsIHJ0ID8KQEAgLTQ4NDksNiArNDkzNyw3IEBACiAJCQkJYm1hLmZpcnN0YmxvY2sgPSAqZmlyc3RibG9jazsKIAkJCQlibWEuYWxlbiA9IGFsZW47CiAJCQkJYm1hLm9mZiA9IGFvZmY7CisJCQkJYm1hLmNvbnYgPSBjb252ZXJ0OwogCQkJCWJtYS53YXNkZWwgPSB3YXNkZWxheTsKIAkJCQlibWEubWlubGVuID0gbWlubGVuOwogCQkJCWJtYS5sb3cgPSBmbGlzdC0+eGJmX2xvdzsKQEAgLTUyNzAsOCArNTM1OSw3IEBACiAJCXJldHVybiAwOwogCX0KIAlYRlNfU1RBVFNfSU5DKHhzX2Jsa191bm1hcCk7Ci0JaXNydCA9ICh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgJiYKLQkgICAgICAgKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKTsKKwlpc3J0ID0gKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKSAmJiBYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApOwogCXN0YXJ0ID0gYm5vOwogCWJubyA9IHN0YXJ0ICsgbGVuIC0gMTsKIAllcCA9IHhmc19ibWFwX3NlYXJjaF9leHRlbnRzKGlwLCBibm8sIHdoaWNoZm9yaywgJmVvZiwgJmxhc3R4LCAmZ290LApAQCAtNTQ0Myw3ICs1NTMxLDcgQEAKIAkJfQogCQlpZiAod2FzZGVsKSB7CiAJCQlBU1NFUlQoU1RBUlRCTE9DS1ZBTChkZWwuYnJfc3RhcnRibG9jaykgPiAwKTsKLQkJCS8qIFVwZGF0ZSByZWFsdGltL2RhdGEgZnJlZXNwYWNlLCB1bnJlc2VydmUgcXVvdGEgKi8KKwkJCS8qIFVwZGF0ZSByZWFsdGltZS9kYXRhIGZyZWVzcGFjZSwgdW5yZXNlcnZlIHF1b3RhICovCiAJCQlpZiAoaXNydCkgewogCQkJCXhmc19maWxibGtzX3QgcnRleHRzOwogCkBAIC01NDUxLDE0ICs1NTM5LDE0IEBACiAJCQkJZG9fZGl2KHJ0ZXh0cywgbXAtPm1fc2Iuc2JfcmV4dHNpemUpOwogCQkJCXhmc19tb2RfaW5jb3JlX3NiKG1wLCBYRlNfU0JTX0ZSRVhURU5UUywKIAkJCQkJCShpbnQpcnRleHRzLCByc3ZkKTsKLQkJCQlYRlNfVFJBTlNfUkVTRVJWRV9RVU9UQV9OQkxLUyhtcCwgTlVMTCwgaXAsCi0JCQkJCS0oKGxvbmcpZGVsLmJyX2Jsb2NrY291bnQpLCAwLAorCQkJCSh2b2lkKVhGU19UUkFOU19SRVNFUlZFX1FVT1RBX05CTEtTKG1wLAorCQkJCQlOVUxMLCBpcCwgLSgobG9uZylkZWwuYnJfYmxvY2tjb3VudCksIDAsCiAJCQkJCVhGU19RTU9QVF9SRVNfUlRCTEtTKTsKIAkJCX0gZWxzZSB7CiAJCQkJeGZzX21vZF9pbmNvcmVfc2IobXAsIFhGU19TQlNfRkRCTE9DS1MsCiAJCQkJCQkoaW50KWRlbC5icl9ibG9ja2NvdW50LCByc3ZkKTsKLQkJCQlYRlNfVFJBTlNfUkVTRVJWRV9RVU9UQV9OQkxLUyhtcCwgTlVMTCwgaXAsCi0JCQkJCS0oKGxvbmcpZGVsLmJyX2Jsb2NrY291bnQpLCAwLAorCQkJCSh2b2lkKVhGU19UUkFOU19SRVNFUlZFX1FVT1RBX05CTEtTKG1wLAorCQkJCQlOVUxMLCBpcCwgLSgobG9uZylkZWwuYnJfYmxvY2tjb3VudCksIDAsCiAJCQkJCVhGU19RTU9QVF9SRVNfUkVHQkxLUyk7CiAJCQl9CiAJCQlpcC0+aV9kZWxheWVkX2Jsa3MgLT0gZGVsLmJyX2Jsb2NrY291bnQ7CkBAIC01NjUyLDcgKzU3NDAsOSBAQAogCQkgICBpcC0+aV9kLmRpX2Zvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkKIAkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOwogCWlmICh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgewotCQlpZiAoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUFJFQUxMT0MpIHsKKwkJaWYgKChpcC0+aV9kLmRpX2V4dHNpemUgJiYgKGlwLT5pX2QuZGlfZmxhZ3MgJgorCQkJCShYRlNfRElGTEFHX1JFQUxUSU1FfFhGU19ESUZMQUdfRVhUU0laRSkpKSB8fAorCQkgICAgaXAtPmlfZC5kaV9mbGFncyAmIChYRlNfRElGTEFHX1BSRUFMTE9DfFhGU19ESUZMQUdfQVBQRU5EKSl7CiAJCQlwcmVhbGxvY2VkID0gMTsKIAkJCWZpeGxlbiA9IFhGU19NQVhJT0ZGU0VUKG1wKTsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYm1hcC5oIGIvZnMveGZzL3hmc19ibWFwLmgKaW5kZXggMmUwNzE3YS4uMTJjYzYzZCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ibWFwLmgKKysrIGIvZnMveGZzL3hmc19ibWFwLmgKQEAgLTYyLDYgKzYyLDEwIEBACiAjZGVmaW5lCVhGU19CTUFQSV9JR1NUQVRFCTB4MjAwCS8qIElnbm9yZSBzdGF0ZSAtICovCiAJCQkJCS8qIGNvbWJpbmUgY29udGlnLiBzcGFjZSAqLwogI2RlZmluZQlYRlNfQk1BUElfQ09OVElHCTB4NDAwCS8qIG11c3QgYWxsb2NhdGUgb25seSBvbmUgZXh0ZW50ICovCisvKglYRlNfQk1BUElfRElSRUNUX0lPCTB4ODAwCSovCisjZGVmaW5lIFhGU19CTUFQSV9DT05WRVJUCTB4MTAwMAkvKiB1bndyaXR0ZW4gZXh0ZW50IGNvbnZlcnNpb24gLSAqLworCQkJCQkvKiBuZWVkIHdyaXRlIGNhY2hlIGZsdXNoaW5nIGFuZCBubyAqLworCQkJCQkvKiBhZGRpdGlvbmFsIGFsbG9jYXRpb24gYWxpZ25tZW50cyAqLwogCiAjZGVmaW5lCVhGU19CTUFQSV9BRkxBRyh3KQl4ZnNfYm1hcGlfYWZsYWcodykKIHN0YXRpYyBpbmxpbmUgaW50IHhmc19ibWFwaV9hZmxhZyhpbnQgdykKQEAgLTEwMSw3ICsxMDUsOCBAQAogCWNoYXIJCQl3YXNkZWw7CS8qIHJlcGxhY2luZyBhIGRlbGF5ZWQgYWxsb2NhdGlvbiAqLwogCWNoYXIJCQl1c2VyZGF0YTsvKiBzZXQgaWYgaXMgdXNlciBkYXRhICovCiAJY2hhcgkJCWxvdzsJLyogbG93IG9uIHNwYWNlLCB1c2luZyBzZXEnbCBhZ3MgKi8KLQljaGFyCQkJYWVvZjsgICAvKiBhbGxvY2F0ZWQgc3BhY2UgYXQgZW9mICovCisJY2hhcgkJCWFlb2Y7CS8qIGFsbG9jYXRlZCBzcGFjZSBhdCBlb2YgKi8KKwljaGFyCQkJY29udjsJLyogb3ZlcndyaXRpbmcgdW53cml0dGVuIGV4dGVudHMgKi8KIH0geGZzX2JtYWxsb2NhX3Q7CiAKICNpZmRlZiBfX0tFUk5FTF9fCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2NsbnQuaCBiL2ZzL3hmcy94ZnNfY2xudC5oCmluZGV4IDMyOGE1MjguLmY1N2NjOWEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfY2xudC5oCisrKyBiL2ZzL3hmcy94ZnNfY2xudC5oCkBAIC01Nyw3ICs1Nyw3IEBACiAvKgogICogWEZTIG1vdW50IG9wdGlvbiBmbGFncyAtLSBhcmdzLT5mbGFnczEKICAqLwotI2RlZmluZQlYRlNNTlRfQ09NUEFUX0FUVFIJMHgwMDAwMDAwMQkvKiBkbyBub3QgdXNlIEFUVFIyIGZvcm1hdCAqLworI2RlZmluZQlYRlNNTlRfQVRUUjIJCTB4MDAwMDAwMDEJLyogYWxsb3cgQVRUUjIgRUEgZm9ybWF0ICovCiAjZGVmaW5lCVhGU01OVF9XU1lOQwkJMHgwMDAwMDAwMgkvKiBzYWZlIG1vZGUgbmZzIG1vdW50CiAJCQkJCQkgKiBjb21wYXRpYmxlICovCiAjZGVmaW5lCVhGU01OVF9JTk82NAkJMHgwMDAwMDAwNAkvKiBtb3ZlIGlub2RlIG51bWJlcnMgdXAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGZyYWcuYyBiL2ZzL3hmcy94ZnNfZGZyYWcuYwppbmRleCAwNzAyNTlhLi5jNjE5MWQwIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RmcmFnLmMKKysrIGIvZnMveGZzL3hmc19kZnJhZy5jCkBAIC02MCw4ICs2MCw2IEBACiAJeGZzX2JzdGF0X3QJKnNicDsKIAlzdHJ1Y3QgZmlsZQkqZnAgPSBOVUxMLCAqdGZwID0gTlVMTDsKIAl2bm9kZV90CQkqdnAsICp0dnA7Ci0JYmh2X2Rlc2NfdCAgICAgICpiZHAsICp0YmRwOwotCXZuX2Jodl9oZWFkX3QgICAqYmhwLCAqdGJocDsKIAlzdGF0aWMgdWludAlsb2NrX2ZsYWdzID0gWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0w7CiAJaW50CQlpbGZfZmllbGRzLCB0aWxmX2ZpZWxkczsKIAlpbnQJCWVycm9yID0gMDsKQEAgLTkwLDEzICs4OCwxMCBAQAogCQlnb3RvIGVycm9yMDsKIAl9CiAKLQliaHAgPSBWTl9CSFZfSEVBRCh2cCk7Ci0JYmRwID0gdm5fYmh2X2xvb2t1cChiaHAsICZ4ZnNfdm5vZGVvcHMpOwotCWlmIChiZHAgPT0gTlVMTCkgeworCWlwID0geGZzX3Z0b2kodnApOworCWlmIChpcCA9PSBOVUxMKSB7CiAJCWVycm9yID0gWEZTX0VSUk9SKEVCQURGKTsKIAkJZ290byBlcnJvcjA7Ci0JfSBlbHNlIHsKLQkJaXAgPSBYRlNfQkhWVE9JKGJkcCk7CiAJfQogCiAJaWYgKCgodGZwID0gZmdldCgoaW50KXN4cC0+c3hfZmR0bXApKSA9PSBOVUxMKSB8fApAQCAtMTA1LDEzICsxMDAsMTAgQEAKIAkJZ290byBlcnJvcjA7CiAJfQogCi0JdGJocCA9IFZOX0JIVl9IRUFEKHR2cCk7Ci0JdGJkcCA9IHZuX2Jodl9sb29rdXAodGJocCwgJnhmc192bm9kZW9wcyk7Ci0JaWYgKHRiZHAgPT0gTlVMTCkgeworCXRpcCA9IHhmc192dG9pKHR2cCk7CisJaWYgKHRpcCA9PSBOVUxMKSB7CiAJCWVycm9yID0gWEZTX0VSUk9SKEVCQURGKTsKIAkJZ290byBlcnJvcjA7Ci0JfSBlbHNlIHsKLQkJdGlwID0gWEZTX0JIVlRPSSh0YmRwKTsKIAl9CiAKIAlpZiAoaXAtPmlfbW91bnQgIT0gdGlwLT5pX21vdW50KSB7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Rpbm9kZS5oIGIvZnMveGZzL3hmc19kaW5vZGUuaAppbmRleCBjNWEwZTUzLi43OWQwZDllIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Rpbm9kZS5oCisrKyBiL2ZzL3hmcy94ZnNfZGlub2RlLmgKQEAgLTE5OSwxMCArMTk5LDE2IEBACiAKICNkZWZpbmUgWEZTX0RGT1JLX0RTSVpFKGRpcCxtcCkgXAogCVhGU19DRk9SS19EU0laRV9ESVNLKCYoZGlwKS0+ZGlfY29yZSwgbXApCisjZGVmaW5lIFhGU19ERk9SS19EU0laRV9IT1NUKGRpcCxtcCkgXAorCVhGU19DRk9SS19EU0laRSgmKGRpcCktPmRpX2NvcmUsIG1wKQogI2RlZmluZSBYRlNfREZPUktfQVNJWkUoZGlwLG1wKSBcCiAJWEZTX0NGT1JLX0FTSVpFX0RJU0soJihkaXApLT5kaV9jb3JlLCBtcCkKKyNkZWZpbmUgWEZTX0RGT1JLX0FTSVpFX0hPU1QoZGlwLG1wKSBcCisJWEZTX0NGT1JLX0FTSVpFKCYoZGlwKS0+ZGlfY29yZSwgbXApCiAjZGVmaW5lCVhGU19ERk9SS19TSVpFKGRpcCxtcCx3KSBcCiAJWEZTX0NGT1JLX1NJWkVfRElTSygmKGRpcCktPmRpX2NvcmUsIG1wLCB3KQorI2RlZmluZQlYRlNfREZPUktfU0laRV9IT1NUKGRpcCxtcCx3KSBcCisJWEZTX0NGT1JLX1NJWkUoJihkaXApLT5kaV9jb3JlLCBtcCwgdykKIAogI2RlZmluZQlYRlNfREZPUktfUShkaXApICAgICAgICAgICAgICAgICAgICBYRlNfQ0ZPUktfUV9ESVNLKCYoZGlwKS0+ZGlfY29yZSkKICNkZWZpbmUJWEZTX0RGT1JLX0JPRkYoZGlwKQkJICAgIFhGU19DRk9SS19CT0ZGX0RJU0soJihkaXApLT5kaV9jb3JlKQpAQCAtMjE2LDYgKzIyMiw3IEBACiAjZGVmaW5lCVhGU19DRk9SS19GTVRfU0VUKGRjcCx3LG4pIFwKIAkoKHcpID09IFhGU19EQVRBX0ZPUksgPyBcCiAJCSgoZGNwKS0+ZGlfZm9ybWF0ID0gKG4pKSA6ICgoZGNwKS0+ZGlfYWZvcm1hdCA9IChuKSkpCisjZGVmaW5lCVhGU19ERk9SS19GT1JNQVQoZGlwLHcpIFhGU19DRk9SS19GT1JNQVQoJihkaXApLT5kaV9jb3JlLCB3KQogCiAjZGVmaW5lCVhGU19DRk9SS19ORVhURU5UU19ESVNLKGRjcCx3KSBcCiAJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gXApAQCAtMjIzLDEzICsyMzAsMTMgQEAKIAkgCUlOVF9HRVQoKGRjcCktPmRpX2FuZXh0ZW50cywgQVJDSF9DT05WRVJUKSkKICNkZWZpbmUgWEZTX0NGT1JLX05FWFRFTlRTKGRjcCx3KSBcCiAJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gKGRjcCktPmRpX25leHRlbnRzIDogKGRjcCktPmRpX2FuZXh0ZW50cykKKyNkZWZpbmUJWEZTX0RGT1JLX05FWFRFTlRTKGRpcCx3KSBYRlNfQ0ZPUktfTkVYVEVOVFNfRElTSygmKGRpcCktPmRpX2NvcmUsIHcpCisjZGVmaW5lCVhGU19ERk9SS19ORVhURU5UU19IT1NUKGRpcCx3KSBYRlNfQ0ZPUktfTkVYVEVOVFMoJihkaXApLT5kaV9jb3JlLCB3KQogCiAjZGVmaW5lCVhGU19DRk9SS19ORVhUX1NFVChkY3AsdyxuKSBcCiAJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gXAogCQkoKGRjcCktPmRpX25leHRlbnRzID0gKG4pKSA6ICgoZGNwKS0+ZGlfYW5leHRlbnRzID0gKG4pKSkKIAotI2RlZmluZQlYRlNfREZPUktfTkVYVEVOVFMoZGlwLHcpIFhGU19DRk9SS19ORVhURU5UU19ESVNLKCYoZGlwKS0+ZGlfY29yZSwgdykKLQogI2RlZmluZQlYRlNfQlVGX1RPX0RJTk9ERShicCkJKCh4ZnNfZGlub2RlX3QgKilYRlNfQlVGX1BUUihicCkpCiAKIC8qCkBAIC0yNDYsOCArMjUzLDEwIEBACiAjZGVmaW5lIFhGU19ESUZMQUdfTk9BVElNRV9CSVQgICA2CS8qIGRvIG5vdCB1cGRhdGUgYXRpbWUgKi8KICNkZWZpbmUgWEZTX0RJRkxBR19OT0RVTVBfQklUICAgIDcJLyogZG8gbm90IGR1bXAgKi8KICNkZWZpbmUgWEZTX0RJRkxBR19SVElOSEVSSVRfQklUIDgJLyogY3JlYXRlIHdpdGggcmVhbHRpbWUgYml0IHNldCAqLwotI2RlZmluZSBYRlNfRElGTEFHX1BST0pJTkhFUklUX0JJVCAgOQkvKiBjcmVhdGUgd2l0aCBwYXJlbnRzIHByb2ppZCAqLwotI2RlZmluZSBYRlNfRElGTEFHX05PU1lNTElOS1NfQklUICAxMAkvKiBkaXNhbGxvdyBzeW1saW5rIGNyZWF0aW9uICovCisjZGVmaW5lIFhGU19ESUZMQUdfUFJPSklOSEVSSVRfQklUICAgOQkvKiBjcmVhdGUgd2l0aCBwYXJlbnRzIHByb2ppZCAqLworI2RlZmluZSBYRlNfRElGTEFHX05PU1lNTElOS1NfQklUICAgMTAJLyogZGlzYWxsb3cgc3ltbGluayBjcmVhdGlvbiAqLworI2RlZmluZSBYRlNfRElGTEFHX0VYVFNJWkVfQklUICAgICAgMTEJLyogaW5vZGUgZXh0ZW50IHNpemUgYWxsb2NhdG9yIGhpbnQgKi8KKyNkZWZpbmUgWEZTX0RJRkxBR19FWFRTWklOSEVSSVRfQklUIDEyCS8qIGluaGVyaXQgaW5vZGUgZXh0ZW50IHNpemUgKi8KICNkZWZpbmUgWEZTX0RJRkxBR19SRUFMVElNRSAgICAgICgxIDw8IFhGU19ESUZMQUdfUkVBTFRJTUVfQklUKQogI2RlZmluZSBYRlNfRElGTEFHX1BSRUFMTE9DICAgICAgKDEgPDwgWEZTX0RJRkxBR19QUkVBTExPQ19CSVQpCiAjZGVmaW5lIFhGU19ESUZMQUdfTkVXUlRCTSAgICAgICAoMSA8PCBYRlNfRElGTEFHX05FV1JUQk1fQklUKQpAQCAtMjU5LDExICsyNjgsMTQgQEAKICNkZWZpbmUgWEZTX0RJRkxBR19SVElOSEVSSVQgICAgICgxIDw8IFhGU19ESUZMQUdfUlRJTkhFUklUX0JJVCkKICNkZWZpbmUgWEZTX0RJRkxBR19QUk9KSU5IRVJJVCAgICgxIDw8IFhGU19ESUZMQUdfUFJPSklOSEVSSVRfQklUKQogI2RlZmluZSBYRlNfRElGTEFHX05PU1lNTElOS1MgICAgKDEgPDwgWEZTX0RJRkxBR19OT1NZTUxJTktTX0JJVCkKKyNkZWZpbmUgWEZTX0RJRkxBR19FWFRTSVpFICAgICAgICgxIDw8IFhGU19ESUZMQUdfRVhUU0laRV9CSVQpCisjZGVmaW5lIFhGU19ESUZMQUdfRVhUU1pJTkhFUklUICAoMSA8PCBYRlNfRElGTEFHX0VYVFNaSU5IRVJJVF9CSVQpCiAKICNkZWZpbmUgWEZTX0RJRkxBR19BTlkgXAogCShYRlNfRElGTEFHX1JFQUxUSU1FIHwgWEZTX0RJRkxBR19QUkVBTExPQyB8IFhGU19ESUZMQUdfTkVXUlRCTSB8IFwKIAkgWEZTX0RJRkxBR19JTU1VVEFCTEUgfCBYRlNfRElGTEFHX0FQUEVORCB8IFhGU19ESUZMQUdfU1lOQyB8IFwKIAkgWEZTX0RJRkxBR19OT0FUSU1FIHwgWEZTX0RJRkxBR19OT0RVTVAgfCBYRlNfRElGTEFHX1JUSU5IRVJJVCB8IFwKLQkgWEZTX0RJRkxBR19QUk9KSU5IRVJJVCB8IFhGU19ESUZMQUdfTk9TWU1MSU5LUykKKwkgWEZTX0RJRkxBR19QUk9KSU5IRVJJVCB8IFhGU19ESUZMQUdfTk9TWU1MSU5LUyB8IFhGU19ESUZMQUdfRVhUU0laRSB8IFwKKwkgWEZTX0RJRkxBR19FWFRTWklOSEVSSVQpCiAKICNlbmRpZgkvKiBfX1hGU19ESU5PREVfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Rpci5jIGIvZnMveGZzL3hmc19kaXIuYwppbmRleCAzZGQzMDM5Li5iYjg3ZDJhIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Rpci5jCisrKyBiL2ZzL3hmcy94ZnNfZGlyLmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogCXVpbnQgc2hvcnRjb3VudCwgbGVhZmNvdW50LCBjb3VudDsKIAogCW1wLT5tX2RpcnZlcnNpb24gPSAxOwotCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9DT01QQVRfQVRUUikgeworCWlmICghKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0FUVFIyKSkgewogCQlzaG9ydGNvdW50ID0gKG1wLT5tX2F0dHJvZmZzZXQgLQogCQkJCSh1aW50KXNpemVvZih4ZnNfZGlyX3NmX2hkcl90KSkgLwogCQkJCSAodWludClzaXplb2YoeGZzX2Rpcl9zZl9lbnRyeV90KTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyLmggYi9mcy94ZnMveGZzX2Rpci5oCmluZGV4IDQ4OGRlZmUuLjhjYzhhZmIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGlyLmgKKysrIGIvZnMveGZzL3hmc19kaXIuaApAQCAtMTM1LDYgKzEzNSw4IEBACiAJKChtcCktPm1fZGlyb3BzLnhkX3Nob3J0Zm9ybV90b19zaW5nbGUoYXJncykpCiAKICNkZWZpbmUJWEZTX0RJUl9JU19WMShtcCkJKChtcCktPm1fZGlydmVyc2lvbiA9PSAxKQorI2RlZmluZQlYRlNfRElSX0lTX1YyKG1wKQkoKG1wKS0+bV9kaXJ2ZXJzaW9uID09IDIpCiBleHRlcm4geGZzX2Rpcm9wc190IHhmc3YxX2Rpcm9wczsKK2V4dGVybiB4ZnNfZGlyb3BzX3QgeGZzdjJfZGlyb3BzOwogCiAjZW5kaWYJLyogX19YRlNfRElSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyLmggYi9mcy94ZnMveGZzX2RpcjIuaAppbmRleCA3ZTI0ZmZlLi4zMTU4ZjVkIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RpcjIuaAorKysgYi9mcy94ZnMveGZzX2RpcjIuaApAQCAtNzIsOSArNzIsNiBAQAogCXN0cnVjdCB1aW8JKnVpbzsJCS8qIHVpbyBjb250cm9sIHN0cnVjdHVyZSAqLwogfSB4ZnNfZGlyMl9wdXRfYXJnc190OwogCi0jZGVmaW5lCVhGU19ESVJfSVNfVjIobXApCSgobXApLT5tX2RpcnZlcnNpb24gPT0gMikKLWV4dGVybiB4ZnNfZGlyb3BzX3QJeGZzdjJfZGlyb3BzOwotCiAvKgogICogT3RoZXIgaW50ZXJmYWNlcyB1c2VkIGJ5IHRoZSByZXN0IG9mIHRoZSBkaXIgdjIgY29kZS4KICAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXJfbGVhZi5jIGIvZnMveGZzL3hmc19kaXJfbGVhZi5jCmluZGV4IDk1MGRmMzFlLi5lODMwNzQwIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Rpcl9sZWFmLmMKKysrIGIvZnMveGZzL3hmc19kaXJfbGVhZi5jCkBAIC0xNDcsNyArMTQ3LDcgQEAKIAloZHItPmNvdW50ID0gMDsKIAlkcC0+aV9kLmRpX3NpemUgPSBzaXplb2YoKmhkcik7CiAJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19EREFUQSk7Ci0JcmV0dXJuKDApOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTgwLDcgKzE4MCw3IEBACiAJCWlmIChzZmUtPm5hbWVsZW4gPT0gYXJncy0+bmFtZWxlbiAmJgogCQkgICAgYXJncy0+bmFtZVswXSA9PSBzZmUtPm5hbWVbMF0gJiYKIAkJICAgIG1lbWNtcChhcmdzLT5uYW1lLCBzZmUtPm5hbWUsIGFyZ3MtPm5hbWVsZW4pID09IDApCi0JCQlyZXR1cm4oWEZTX0VSUk9SKEVFWElTVCkpOworCQkJcmV0dXJuIFhGU19FUlJPUihFRVhJU1QpOwogCQlzZmUgPSBYRlNfRElSX1NGX05FWFRFTlRSWShzZmUpOwogCX0KIApAQCAtMTk4LDcgKzE5OCw3IEBACiAJZHAtPmlfZC5kaV9zaXplICs9IHNpemU7CiAJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19EREFUQSk7CiAKLQlyZXR1cm4oMCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0yMzgsNyArMjM4LDcgQEAKIAl9CiAJaWYgKGkgPCAwKSB7CiAJCUFTU0VSVChhcmdzLT5va25vZW50KTsKLQkJcmV0dXJuKFhGU19FUlJPUihFTk9FTlQpKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFTk9FTlQpOwogCX0KIAogCWlmICgoYmFzZSArIHNpemUpICE9IGRwLT5pX2QuZGlfc2l6ZSkgewpAQCAtMjUxLDcgKzI1MSw3IEBACiAJZHAtPmlfZC5kaV9zaXplIC09IHNpemU7CiAJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19EREFUQSk7CiAKLQlyZXR1cm4oMCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0zOTAsNyArMzkwLDcgQEAKIAogb3V0OgogCWttZW1fZnJlZSh0bXBidWZmZXIsIHNpemUpOwotCXJldHVybihyZXR2YWwpOworCXJldHVybiByZXR2YWw7CiB9CiAKIFNUQVRJQyBpbnQKQEAgLTU5Niw3ICs1OTYsNyBAQAogCQkvKiBYWFggLSByZXBsYWNlIGFzc2VydD8gKi8KIAkJWEZTX0RJUl9TRl9QVVRfRElSSU5PKCZhcmdzLT5pbnVtYmVyLCAmc2YtPmhkci5wYXJlbnQpOwogCQl4ZnNfdHJhbnNfbG9nX2lub2RlKGFyZ3MtPnRyYW5zLCBkcCwgWEZTX0lMT0dfRERBVEEpOwotCQlyZXR1cm4oMCk7CisJCXJldHVybiAwOwogCX0KIAlBU1NFUlQoYXJncy0+bmFtZWxlbiAhPSAxIHx8IGFyZ3MtPm5hbWVbMF0gIT0gJy4nKTsKIAlzZmUgPSAmc2YtPmxpc3RbMF07CkBAIC02MDgsMTIgKzYwOCwxMiBAQAogCQkJCShjaGFyICopJnNmZS0+aW51bWJlciwgc2l6ZW9mKHhmc19pbm9fdCkpKTsKIAkJCVhGU19ESVJfU0ZfUFVUX0RJUklOTygmYXJncy0+aW51bWJlciwgJnNmZS0+aW51bWJlcik7CiAJCQl4ZnNfdHJhbnNfbG9nX2lub2RlKGFyZ3MtPnRyYW5zLCBkcCwgWEZTX0lMT0dfRERBVEEpOwotCQkJcmV0dXJuKDApOworCQkJcmV0dXJuIDA7CiAJCX0KIAkJc2ZlID0gWEZTX0RJUl9TRl9ORVhURU5UUlkoc2ZlKTsKIAl9CiAJQVNTRVJUKGFyZ3MtPm9rbm9lbnQpOwotCXJldHVybihYRlNfRVJST1IoRU5PRU5UKSk7CisJcmV0dXJuIFhGU19FUlJPUihFTk9FTlQpOwogfQogCiAvKgpAQCAtNjk1LDcgKzY5NSw3IEBACiAKIG91dDoKIAlrbWVtX2ZyZWUodG1wYnVmZmVyLCBYRlNfTEJTSVpFKGRwLT5pX21vdW50KSk7Ci0JcmV0dXJuKHJldHZhbCk7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogLyoKQEAgLTcxNSwxNyArNzE1LDE3IEBACiAJcmV0dmFsID0geGZzX2RhX2dyb3dfaW5vZGUoYXJncywgJmJsa25vKTsKIAlBU1NFUlQoYmxrbm8gPT0gMSk7CiAJaWYgKHJldHZhbCkKLQkJcmV0dXJuKHJldHZhbCk7CisJCXJldHVybiByZXR2YWw7CiAJcmV0dmFsID0geGZzX2RhX3JlYWRfYnVmKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwgMCwgLTEsICZicDEsCiAJCQkJCSAgICAgIFhGU19EQVRBX0ZPUkspOwogCWlmIChyZXR2YWwpCi0JCXJldHVybihyZXR2YWwpOworCQlyZXR1cm4gcmV0dmFsOwogCUFTU0VSVChicDEgIT0gTlVMTCk7CiAJcmV0dmFsID0geGZzX2RhX2dldF9idWYoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLCAxLCAtMSwgJmJwMiwKIAkJCQkJICAgICBYRlNfREFUQV9GT1JLKTsKIAlpZiAocmV0dmFsKSB7CiAJCXhmc19kYV9idWZfZG9uZShicDEpOwotCQlyZXR1cm4ocmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKIAl9CiAJQVNTRVJUKGJwMiAhPSBOVUxMKTsKIAltZW1jcHkoYnAyLT5kYXRhLCBicDEtPmRhdGEsIFhGU19MQlNJWkUoZHAtPmlfbW91bnQpKTsKQEAgLTczOCw3ICs3MzgsNyBAQAogCXJldHZhbCA9IHhmc19kYV9ub2RlX2NyZWF0ZShhcmdzLCAwLCAxLCAmYnAxLCBYRlNfREFUQV9GT1JLKTsKIAlpZiAocmV0dmFsKSB7CiAJCXhmc19kYV9idWZfZG9uZShicDIpOwotCQlyZXR1cm4ocmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKIAl9CiAJbm9kZSA9IGJwMS0+ZGF0YTsKIAlsZWFmID0gYnAyLT5kYXRhOwpAQCAtNzUxLDcgKzc1MSw3IEBACiAJCVhGU19EQV9MT0dSQU5HRShub2RlLCAmbm9kZS0+YnRyZWVbMF0sIHNpemVvZihub2RlLT5idHJlZVswXSkpKTsKIAl4ZnNfZGFfYnVmX2RvbmUoYnAxKTsKIAotCXJldHVybihyZXR2YWwpOworCXJldHVybiByZXR2YWw7CiB9CiAKIApAQCAtNzc2LDcgKzc3Niw3IEBACiAJQVNTRVJUKGRwICE9IE5VTEwpOwogCXJldHZhbCA9IHhmc19kYV9nZXRfYnVmKGFyZ3MtPnRyYW5zLCBkcCwgYmxrbm8sIC0xLCAmYnAsIFhGU19EQVRBX0ZPUkspOwogCWlmIChyZXR2YWwpCi0JCXJldHVybihyZXR2YWwpOworCQlyZXR1cm4gcmV0dmFsOwogCUFTU0VSVChicCAhPSBOVUxMKTsKIAlsZWFmID0gYnAtPmRhdGE7CiAJbWVtc2V0KChjaGFyICopbGVhZiwgMCwgWEZTX0xCU0laRShkcC0+aV9tb3VudCkpOwpAQCAtNzkxLDcgKzc5MSw3IEBACiAJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJwLCAwLCBYRlNfTEJTSVpFKGRwLT5pX21vdW50KSAtIDEpOwogCiAJKmJwcCA9IGJwOwotCXJldHVybigwKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTgxMywxMCArODEzLDEwIEBACiAJQVNTRVJUKG9sZGJsay0+bWFnaWMgPT0gWEZTX0RJUl9MRUFGX01BR0lDKTsKIAllcnJvciA9IHhmc19kYV9ncm93X2lub2RlKGFyZ3MsICZibGtubyk7CiAJaWYgKGVycm9yKQotCQlyZXR1cm4oZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CiAJZXJyb3IgPSB4ZnNfZGlyX2xlYWZfY3JlYXRlKGFyZ3MsIGJsa25vLCAmbmV3YmxrLT5icCk7CiAJaWYgKGVycm9yKQotCQlyZXR1cm4oZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CiAJbmV3YmxrLT5ibGtubyA9IGJsa25vOwogCW5ld2Jsay0+bWFnaWMgPSBYRlNfRElSX0xFQUZfTUFHSUM7CiAKQEAgLTgyNiw3ICs4MjYsNyBAQAogCXhmc19kaXJfbGVhZl9yZWJhbGFuY2Uoc3RhdGUsIG9sZGJsaywgbmV3YmxrKTsKIAllcnJvciA9IHhmc19kYV9ibGtfbGluayhzdGF0ZSwgb2xkYmxrLCBuZXdibGspOwogCWlmIChlcnJvcikKLQkJcmV0dXJuKGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOwogCiAJLyoKIAkgKiBJbnNlcnQgdGhlIG5ldyBlbnRyeSBpbiB0aGUgY29ycmVjdCBibG9jay4KQEAgLTg0Miw3ICs4NDIsNyBAQAogCSAqLwogCW9sZGJsay0+aGFzaHZhbCA9IHhmc19kaXJfbGVhZl9sYXN0aGFzaChvbGRibGstPmJwLCBOVUxMKTsKIAluZXdibGstPmhhc2h2YWwgPSB4ZnNfZGlyX2xlYWZfbGFzdGhhc2gobmV3YmxrLT5icCwgTlVMTCk7Ci0JcmV0dXJuKGVycm9yKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qCkBAIC04ODUsNyArODg1LDcgQEAKIAkJaWYgKElOVF9HRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQpID49IHRtcCkgewogCQkJaWYgKCFhcmdzLT5qdXN0Y2hlY2spCiAJCQkJeGZzX2Rpcl9sZWFmX2FkZF93b3JrKGJwLCBhcmdzLCBpbmRleCwgaSk7Ci0JCQlyZXR1cm4oMCk7CisJCQlyZXR1cm4gMDsKIAkJfQogCQlzdW0gKz0gSU5UX0dFVChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCk7CiAJfQpAQCAtODk2LDcgKzg5Niw3IEBACiAJICogbm8gZ29vZCBhbmQgd2Ugc2hvdWxkIGp1c3QgZ2l2ZSB1cC4KIAkgKi8KIAlpZiAoIWhkci0+aG9sZXMgJiYgKHN1bSA8IGVudHNpemUpKQotCQlyZXR1cm4oWEZTX0VSUk9SKEVOT1NQQykpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVOT1NQQyk7CiAKIAkvKgogCSAqIENvbXBhY3QgdGhlIGVudHJpZXMgdG8gY29hbGVzY2UgZnJlZSBzcGFjZS4KQEAgLTkwOSwxOCArOTA5LDE4IEBACiAJCQkJKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KSA6IDAsCiAJCQlhcmdzLT5qdXN0Y2hlY2spOwogCWlmIChlcnJvcikKLQkJcmV0dXJuKGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOwogCS8qCiAJICogQWZ0ZXIgY29tcGFjdGlvbiwgdGhlIGJsb2NrIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBvbmx5IG9uZQogCSAqIGZyZWUgcmVnaW9uLCBpbiBmcmVlbWFwWzBdLiAgSWYgaXQgaXMgbm90IGJpZyBlbm91Z2gsIGdpdmUgdXAuCiAJICovCiAJaWYgKElOVF9HRVQoaGRyLT5mcmVlbWFwWzBdLnNpemUsIEFSQ0hfQ09OVkVSVCkgPAogCSAgICAoZW50c2l6ZSArICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCkpKQotCQlyZXR1cm4oWEZTX0VSUk9SKEVOT1NQQykpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVOT1NQQyk7CiAKIAlpZiAoIWFyZ3MtPmp1c3RjaGVjaykKIAkJeGZzX2Rpcl9sZWFmX2FkZF93b3JrKGJwLCBhcmdzLCBpbmRleCwgMCk7Ci0JcmV0dXJuKDApOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTA3Miw3ICsxMDcyLDcgQEAKIAlrbWVtX2ZyZWUodG1wYnVmZmVyLCBsYnNpemUpOwogCWlmIChtdXN0aGF2ZSB8fCBqdXN0Y2hlY2spCiAJCWttZW1fZnJlZSh0bXBidWZmZXIyLCBsYnNpemUpOwotCXJldHVybihydmFsKTsKKwlyZXR1cm4gcnZhbDsKIH0KIAogLyoKQEAgLTEyOTIsNyArMTI5Miw3IEBACiAKIAkqY291bnRhcmcgPSBjb3VudDsKIAkqbmFtZWJ5dGVzYXJnID0gdG90YWxsZW47Ci0JcmV0dXJuKGZvdW5kaXQpOworCXJldHVybiBmb3VuZGl0OwogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTMzNCw3ICsxMzM0LDcgQEAKIAkJSU5UX0dFVChsZWFmLT5oZHIubmFtZWJ5dGVzLCBBUkNIX0NPTlZFUlQpOwogCWlmIChieXRlcyA+IChzdGF0ZS0+YmxvY2tzaXplID4+IDEpKSB7CiAJCSphY3Rpb24gPSAwOwkvKiBibGsgb3ZlciA1MCUsIGRvbid0IHRyeSB0byBqb2luICovCi0JCXJldHVybigwKTsKKwkJcmV0dXJuIDA7CiAJfQogCiAJLyoKQEAgLTEzNTMsMTMgKzEzNTMsMTMgQEAKIAkJZXJyb3IgPSB4ZnNfZGFfcGF0aF9zaGlmdChzdGF0ZSwgJnN0YXRlLT5hbHRwYXRoLCBmb3J3YXJkLAogCQkJCQkJIDAsICZyZXR2YWwpOwogCQlpZiAoZXJyb3IpCi0JCQlyZXR1cm4oZXJyb3IpOworCQkJcmV0dXJuIGVycm9yOwogCQlpZiAocmV0dmFsKSB7CiAJCQkqYWN0aW9uID0gMDsKIAkJfSBlbHNlIHsKIAkJCSphY3Rpb24gPSAyOwogCQl9Ci0JCXJldHVybigwKTsKKwkJcmV0dXJuIDA7CiAJfQogCiAJLyoKQEAgLTEzODEsNyArMTM4MSw3IEBACiAJCQkJCQkJICAgIGJsa25vLCAtMSwgJmJwLAogCQkJCQkJCSAgICBYRlNfREFUQV9GT1JLKTsKIAkJaWYgKGVycm9yKQotCQkJcmV0dXJuKGVycm9yKTsKKwkJCXJldHVybiBlcnJvcjsKIAkJQVNTRVJUKGJwICE9IE5VTEwpOwogCiAJCWxlYWYgPSAoeGZzX2Rpcl9sZWFmYmxvY2tfdCAqKWluZm87CkBAIC0xNDAyLDcgKzE0MDIsNyBAQAogCX0KIAlpZiAoaSA+PSAyKSB7CiAJCSphY3Rpb24gPSAwOwotCQlyZXR1cm4oMCk7CisJCXJldHVybiAwOwogCX0KIAl4ZnNfZGFfYnVmX2RvbmUoYnApOwogCkBAIC0xNDE5LDEzICsxNDE5LDEzIEBACiAJCQkJCQkgMCwgJnJldHZhbCk7CiAJfQogCWlmIChlcnJvcikKLQkJcmV0dXJuKGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOwogCWlmIChyZXR2YWwpIHsKIAkJKmFjdGlvbiA9IDA7CiAJfSBlbHNlIHsKIAkJKmFjdGlvbiA9IDE7CiAJfQotCXJldHVybigwKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTE1NzUsOCArMTU3NSw4IEBACiAJdG1wICs9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpICogKCh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfbmFtZV90KSAtIDEpOwogCXRtcCArPSBJTlRfR0VUKGxlYWYtPmhkci5uYW1lYnl0ZXMsIEFSQ0hfQ09OVkVSVCk7CiAJaWYgKHRtcCA8IG1wLT5tX2Rpcl9tYWdpY3BjdCkKLQkJcmV0dXJuKDEpOwkJCS8qIGxlYWYgaXMgPCAzNyUgZnVsbCAqLwotCXJldHVybigwKTsKKwkJcmV0dXJuIDE7CQkJLyogbGVhZiBpcyA8IDM3JSBmdWxsICovCisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xNzMyLDcgKzE3MzIsNyBAQAogCWlmICgocHJvYmUgPT0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpIHx8IChJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpICE9IGhhc2h2YWwpKSB7CiAJCSppbmRleCA9IHByb2JlOwogCQlBU1NFUlQoYXJncy0+b2tub2VudCk7Ci0JCXJldHVybihYRlNfRVJST1IoRU5PRU5UKSk7CisJCXJldHVybiBYRlNfRVJST1IoRU5PRU5UKTsKIAl9CiAKIAkvKgpAQCAtMTc0NSwxNCArMTc0NSwxNCBAQAogCQkgICAgbWVtY21wKGFyZ3MtPm5hbWUsIG5hbWVzdC0+bmFtZSwgYXJncy0+bmFtZWxlbikgPT0gMCkgewogCQkJWEZTX0RJUl9TRl9HRVRfRElSSU5PKCZuYW1lc3QtPmludW1iZXIsICZhcmdzLT5pbnVtYmVyKTsKIAkJCSppbmRleCA9IHByb2JlOwotCQkJcmV0dXJuKFhGU19FUlJPUihFRVhJU1QpKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUVYSVNUKTsKIAkJfQogCQllbnRyeSsrOwogCQlwcm9iZSsrOwogCX0KIAkqaW5kZXggPSBwcm9iZTsKIAlBU1NFUlQocHJvYmUgPT0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgfHwgYXJncy0+b2tub2VudCk7Ci0JcmV0dXJuKFhGU19FUlJPUihFTk9FTlQpKTsKKwlyZXR1cm4gWEZTX0VSUk9SKEVOT0VOVCk7CiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xODkwLDkgKzE4OTAsOSBAQAogCSAgICAgIElOVF9HRVQobGVhZjEtPmVudHJpZXNbIDAgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpKSB8fAogCSAgICAgKElOVF9HRVQobGVhZjItPmVudHJpZXNbIElOVF9HRVQobGVhZjItPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKS0xIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSA8CiAJICAgICAgSU5UX0dFVChsZWFmMS0+ZW50cmllc1sgSU5UX0dFVChsZWFmMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTEgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpKSkpIHsKLQkJcmV0dXJuKDEpOworCQlyZXR1cm4gMTsKIAl9Ci0JcmV0dXJuKDApOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTk0Miw3ICsxOTQyLDcgQEAKIAlsZWFmID0gYnAtPmRhdGE7CiAJaWYgKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0RJUl9MRUFGX01BR0lDKSB7CiAJCSplb2JwID0gMTsKLQkJcmV0dXJuKFhGU19FUlJPUihFTk9FTlQpKTsJLyogWFhYIHdyb25nIGNvZGUgKi8KKwkJcmV0dXJuIFhGU19FUlJPUihFTk9FTlQpOwkvKiBYWFggd3JvbmcgY29kZSAqLwogCX0KIAogCXdhbnRfZW50bm8gPSBYRlNfREFfQ09PS0lFX0VOVFJZKG1wLCB1aW8tPnVpb19vZmZzZXQpOwpAQCAtMjAwMCw3ICsyMDAwLDcgQEAKIAkJICogdGhlIG5vZGUgY29kZSB3aWxsIGJlIHNldHRpbmcgdWlvX29mZnNldCBhbnl3YXkuCiAJCSAqLwogCQkqZW9icCA9IDA7Ci0JCXJldHVybigwKTsKKwkJcmV0dXJuIDA7CiAJfQogCXhmc19kaXJfdHJhY2VfZ19kdWUoImxlYWY6IGhhc2ggZm91bmQiLCBkcCwgdWlvLCBlbnRyeSk7CiAKQEAgLTIwNTcsNyArMjA1Nyw3IEBACiAJCQlyZXR2YWwgPSB4ZnNfZGFfcmVhZF9idWYoZHAtPmlfdHJhbnNwLCBkcCwgdGhpc2hhc2gsCiAJCQkJCQkgbmV4dGRhLCAmYnAyLCBYRlNfREFUQV9GT1JLKTsKIAkJCWlmIChyZXR2YWwpCi0JCQkJcmV0dXJuKHJldHZhbCk7CisJCQkJcmV0dXJuIHJldHZhbDsKIAogCQkJQVNTRVJUKGJwMiAhPSBOVUxMKTsKIApAQCAtMjA3Myw3ICsyMDczLDcgQEAKIAkJCQkJCSAgICAgbGVhZjIpOwogCQkJCXhmc19kYV9icmVsc2UoZHAtPmlfdHJhbnNwLCBicDIpOwogCi0JCQkJcmV0dXJuKFhGU19FUlJPUihFRlNDT1JSVVBURUQpKTsKKwkJCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CiAJCQl9CiAKIAkJCW5leHRoYXNoID0gSU5UX0dFVChsZWFmMi0+ZW50cmllc1swXS5oYXNodmFsLApAQCAtMjEzOSw3ICsyMTM5LDcgQEAKIAogCQkJeGZzX2Rpcl90cmFjZV9nX2R1KCJsZWFmOiBFLU8tQiIsIGRwLCB1aW8pOwogCi0JCQlyZXR1cm4ocmV0dmFsKTsKKwkJCXJldHVybiByZXR2YWw7CiAJCX0KIAl9CiAKQEAgLTIxNDksNyArMjE0OSw3IEBACiAKIAl4ZnNfZGlyX3RyYWNlX2dfZHUoImxlYWY6IEUtTy1GIiwgZHAsIHVpbyk7CiAKLQlyZXR1cm4oMCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Rpcl9sZWFmLmggYi9mcy94ZnMveGZzX2Rpcl9sZWFmLmgKaW5kZXggYWI2YjA5ZS4uZWI4Y2Q5YSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kaXJfbGVhZi5oCisrKyBiL2ZzL3hmcy94ZnNfZGlyX2xlYWYuaApAQCAtNjcsMzQgKzY3LDM4IEBACiAgKi8KICNkZWZpbmUgWEZTX0RJUl9MRUFGX01BUFNJWkUJMwkvKiBob3cgbWFueSBmcmVlc3BhY2Ugc2xvdHMgKi8KIAordHlwZWRlZiBzdHJ1Y3QgeGZzX2Rpcl9sZWFmX21hcCB7CS8qIFJMRSBtYXAgb2YgZnJlZSBieXRlcyAqLworCV9fdWludDE2X3QJYmFzZTsJIAkvKiBiYXNlIG9mIGZyZWUgcmVnaW9uICovCisJX191aW50MTZfdAlzaXplOyAJCS8qIHJ1biBsZW5ndGggb2YgZnJlZSByZWdpb24gKi8KK30geGZzX2Rpcl9sZWFmX21hcF90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyX2xlYWZfaGRyIHsJLyogY29uc3RhbnQtc3RydWN0dXJlIGhlYWRlciBibG9jayAqLworCXhmc19kYV9ibGtpbmZvX3QgaW5mbzsJCS8qIGJsb2NrIHR5cGUsIGxpbmtzLCBldGMuICovCisJX191aW50MTZfdAljb3VudDsJCS8qIGNvdW50IG9mIGFjdGl2ZSBsZWFmX2VudHJ5J3MgKi8KKwlfX3VpbnQxNl90CW5hbWVieXRlczsJLyogbnVtIGJ5dGVzIG9mIG5hbWUgc3RyaW5ncyBzdG9yZWQgKi8KKwlfX3VpbnQxNl90CWZpcnN0dXNlZDsJLyogZmlyc3QgdXNlZCBieXRlIGluIG5hbWUgYXJlYSAqLworCV9fdWludDhfdAlob2xlczsJCS8qICE9IDAgaWYgYmxrIG5lZWRzIGNvbXBhY3Rpb24gKi8KKwlfX3VpbnQ4X3QJcGFkMTsKKwl4ZnNfZGlyX2xlYWZfbWFwX3QgZnJlZW1hcFtYRlNfRElSX0xFQUZfTUFQU0laRV07Cit9IHhmc19kaXJfbGVhZl9oZHJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Rpcl9sZWFmX2VudHJ5IHsJLyogc29ydGVkIG9uIGtleSwgbm90IG5hbWUgKi8KKwl4ZnNfZGFoYXNoX3QJaGFzaHZhbDsJLyogaGFzaCB2YWx1ZSBvZiBuYW1lICovCisJX191aW50MTZfdAluYW1laWR4OwkvKiBpbmRleCBpbnRvIGJ1ZmZlciBvZiBuYW1lICovCisJX191aW50OF90CW5hbWVsZW47CS8qIGxlbmd0aCBvZiBuYW1lIHN0cmluZyAqLworCV9fdWludDhfdAlwYWQyOworfSB4ZnNfZGlyX2xlYWZfZW50cnlfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Rpcl9sZWFmX25hbWUgeworCXhmc19kaXJfaW5vX3QJaW51bWJlcjsJLyogaW5vZGUgbnVtYmVyIGZvciB0aGlzIGtleSAqLworCV9fdWludDhfdAluYW1lWzFdOwkvKiBuYW1lIHN0cmluZyBpdHNlbGYgKi8KK30geGZzX2Rpcl9sZWFmX25hbWVfdDsKKwogdHlwZWRlZiBzdHJ1Y3QgeGZzX2Rpcl9sZWFmYmxvY2sgewotCXN0cnVjdCB4ZnNfZGlyX2xlYWZfaGRyIHsJLyogY29uc3RhbnQtc3RydWN0dXJlIGhlYWRlciBibG9jayAqLwotCQl4ZnNfZGFfYmxraW5mb190IGluZm87CS8qIGJsb2NrIHR5cGUsIGxpbmtzLCBldGMuICovCi0JCV9fdWludDE2X3QgY291bnQ7CS8qIGNvdW50IG9mIGFjdGl2ZSBsZWFmX2VudHJ5J3MgKi8KLQkJX191aW50MTZfdCBuYW1lYnl0ZXM7CS8qIG51bSBieXRlcyBvZiBuYW1lIHN0cmluZ3Mgc3RvcmVkICovCi0JCV9fdWludDE2X3QgZmlyc3R1c2VkOwkvKiBmaXJzdCB1c2VkIGJ5dGUgaW4gbmFtZSBhcmVhICovCi0JCV9fdWludDhfdCAgaG9sZXM7CS8qICE9IDAgaWYgYmxrIG5lZWRzIGNvbXBhY3Rpb24gKi8KLQkJX191aW50OF90ICBwYWQxOwotCQlzdHJ1Y3QgeGZzX2Rpcl9sZWFmX21hcCB7LyogUkxFIG1hcCBvZiBmcmVlIGJ5dGVzICovCi0JCQlfX3VpbnQxNl90IGJhc2U7IC8qIGJhc2Ugb2YgZnJlZSByZWdpb24gKi8KLQkJCV9fdWludDE2X3Qgc2l6ZTsgLyogcnVuIGxlbmd0aCBvZiBmcmVlIHJlZ2lvbiAqLwotCQl9IGZyZWVtYXBbWEZTX0RJUl9MRUFGX01BUFNJWkVdOyAvKiBOIGxhcmdlc3QgZnJlZSByZWdpb25zICovCi0JfSBoZHI7Ci0Jc3RydWN0IHhmc19kaXJfbGVhZl9lbnRyeSB7CS8qIHNvcnRlZCBvbiBrZXksIG5vdCBuYW1lICovCi0JCXhmc19kYWhhc2hfdCBoYXNodmFsOwkvKiBoYXNoIHZhbHVlIG9mIG5hbWUgKi8KLQkJX191aW50MTZfdCBuYW1laWR4OwkvKiBpbmRleCBpbnRvIGJ1ZmZlciBvZiBuYW1lICovCi0JCV9fdWludDhfdCBuYW1lbGVuOwkvKiBsZW5ndGggb2YgbmFtZSBzdHJpbmcgKi8KLQkJX191aW50OF90IHBhZDI7Ci0JfSBlbnRyaWVzWzFdOwkJCS8qIHZhciBzaXplZCBhcnJheSAqLwotCXN0cnVjdCB4ZnNfZGlyX2xlYWZfbmFtZSB7Ci0JCXhmc19kaXJfaW5vX3QgaW51bWJlcjsJLyogaW5vZGUgbnVtYmVyIGZvciB0aGlzIGtleSAqLwotCQlfX3VpbnQ4X3QgbmFtZVsxXTsJLyogbmFtZSBzdHJpbmcgaXRzZWxmICovCi0JfSBuYW1lbGlzdFsxXTsJCQkvKiBncm93cyBmcm9tIGJvdHRvbSBvZiBidWYgKi8KKwl4ZnNfZGlyX2xlYWZfaGRyX3QJaGRyOwkvKiBjb25zdGFudC1zdHJ1Y3R1cmUgaGVhZGVyIGJsb2NrICovCisJeGZzX2Rpcl9sZWFmX2VudHJ5X3QJZW50cmllc1sxXTsJLyogdmFyIHNpemVkIGFycmF5ICovCisJeGZzX2Rpcl9sZWFmX25hbWVfdAluYW1lbGlzdFsxXTsJLyogZ3Jvd3MgZnJvbSBib3R0b20gb2YgYnVmICovCiB9IHhmc19kaXJfbGVhZmJsb2NrX3Q7Ci10eXBlZGVmIHN0cnVjdCB4ZnNfZGlyX2xlYWZfaGRyIHhmc19kaXJfbGVhZl9oZHJfdDsKLXR5cGVkZWYgc3RydWN0IHhmc19kaXJfbGVhZl9tYXAgeGZzX2Rpcl9sZWFmX21hcF90OwotdHlwZWRlZiBzdHJ1Y3QgeGZzX2Rpcl9sZWFmX2VudHJ5IHhmc19kaXJfbGVhZl9lbnRyeV90OwotdHlwZWRlZiBzdHJ1Y3QgeGZzX2Rpcl9sZWFmX25hbWUgeGZzX2Rpcl9sZWFmX25hbWVfdDsKIAogLyoKICAqIExlbmd0aCBvZiBuYW1lIGZvciB3aGljaCBhIDUxMi1ieXRlIGJsb2NrIGZpbGVzeXN0ZW0KQEAgLTEyNiwxMSArMTMwLDEwIEBACiAjZGVmaW5lCVhGU19QVVRfQ09PS0lFKGMsbXAsYm5vLGVudHJ5LGhhc2gpCVwKIAkoKGMpLnMuYmUgPSBYRlNfREFfTUFLRV9CTk9FTlRSWShtcCwgYm5vLCBlbnRyeSksIChjKS5zLmggPSAoaGFzaCkpCiAKLXR5cGVkZWYgc3RydWN0IHhmc19kaXJfcHV0X2FyZ3MKLXsKK3R5cGVkZWYgc3RydWN0IHhmc19kaXJfcHV0X2FyZ3MgewogCXhmc19kaXJjb29rX3QJY29vazsJCS8qIGNvb2tpZSBvZiAobmV4dCkgZW50cnkgKi8KIAl4ZnNfaW50aW5vX3QJaW5vOwkJLyogaW5vZGUgbnVtYmVyICovCi0Jc3RydWN0IHhmc19kaXJlbnQJKmRicDsJCS8qIGJ1ZmZlciBwb2ludGVyICovCisJc3RydWN0IHhmc19kaXJlbnQgKmRicDsJCS8qIGJ1ZmZlciBwb2ludGVyICovCiAJY2hhcgkJKm5hbWU7CQkvKiBkaXJlY3RvcnkgZW50cnkgbmFtZSAqLwogCWludAkJbmFtZWxlbjsJLyogbGVuZ3RoIG9mIG5hbWUgKi8KIAlpbnQJCWRvbmU7CQkvKiBvdXRwdXQ6IHNldCBpZiB2YWx1ZSB3YXMgc3RvcmVkICovCkBAIC0xMzgsNyArMTQxLDggQEAKIAlzdHJ1Y3QgdWlvCSp1aW87CQkvKiB1aW8gY29udHJvbCBzdHJ1Y3R1cmUgKi8KIH0geGZzX2Rpcl9wdXRfYXJnc190OwogCi0jZGVmaW5lIFhGU19ESVJfTEVBRl9FTlRTSVpFX0JZTkFNRShsZW4pCXhmc19kaXJfbGVhZl9lbnRzaXplX2J5bmFtZShsZW4pCisjZGVmaW5lIFhGU19ESVJfTEVBRl9FTlRTSVpFX0JZTkFNRShsZW4pCVwKKwl4ZnNfZGlyX2xlYWZfZW50c2l6ZV9ieW5hbWUobGVuKQogc3RhdGljIGlubGluZSBpbnQgeGZzX2Rpcl9sZWFmX2VudHNpemVfYnluYW1lKGludCBsZW4pCiB7CiAJcmV0dXJuICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfbmFtZV90KS0xICsgbGVuOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kbWFwaS5oIGIvZnMveGZzL3hmc19kbWFwaS5oCmluZGV4IDg2NGJmNjkuLmI0YzdmMmIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZG1hcGkuaAorKysgYi9mcy94ZnMveGZzX2RtYXBpLmgKQEAgLTE1Miw3ICsxNTIsNyBAQAogCiAjZGVmaW5lIERNX0ZMQUdTX05ERUxBWQkJMHgwMDEJLyogcmV0dXJuIEVBR0FJTiBhZnRlciBkbV9wZW5kaW5nKCkgKi8KICNkZWZpbmUgRE1fRkxBR1NfVU5XQU5URUQJMHgwMDIJLyogZXZlbnQgbm90IGluIGZzeXMgZG1fZXZlbnRzZXRfdCAqLwotI2RlZmluZSBETV9GTEFHU19JU0VNCQkweDAwNAkvKiB0aHJlYWQgaG9sZHMgaV9zZW0gKi8KKyNkZWZpbmUgRE1fRkxBR1NfSU1VWAkJMHgwMDQJLyogdGhyZWFkIGhvbGRzIGlfbXV0ZXggKi8KICNkZWZpbmUgRE1fRkxBR1NfSUFMTE9DU0VNX1JECTB4MDEwCS8qIHRocmVhZCBob2xkcyBpX2FsbG9jX3NlbSByZCAqLwogI2RlZmluZSBETV9GTEFHU19JQUxMT0NTRU1fV1IJMHgwMjAJLyogdGhyZWFkIGhvbGRzIGlfYWxsb2Nfc2VtIHdyICovCiAKQEAgLTE2MSwyMSArMTYxLDIxIEBACiAgKi8KICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMCkKICNkZWZpbmUgRE1fU0VNX0ZMQUdfUkQoaW9mbGFncykgKCgoaW9mbGFncykgJiBJT19JU0RJUkVDVCkgPyBcCi0JCQkgICAgICBETV9GTEFHU19JU0VNIDogMCkKLSNkZWZpbmUgRE1fU0VNX0ZMQUdfV1IJKERNX0ZMQUdTX0lBTExPQ1NFTV9XUiB8IERNX0ZMQUdTX0lTRU0pCisJCQkgICAgICBETV9GTEFHU19JTVVYIDogMCkKKyNkZWZpbmUgRE1fU0VNX0ZMQUdfV1IJKERNX0ZMQUdTX0lBTExPQ1NFTV9XUiB8IERNX0ZMQUdTX0lNVVgpCiAjZW5kaWYKIAogI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkpICYmIFwKICAgICAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwyMikpCiAjZGVmaW5lIERNX1NFTV9GTEFHX1JEKGlvZmxhZ3MpICgoKGlvZmxhZ3MpICYgSU9fSVNESVJFQ1QpID8gXAotCQkJICAgICAgRE1fRkxBR1NfSUFMTE9DU0VNX1JEIDogRE1fRkxBR1NfSVNFTSkKLSNkZWZpbmUgRE1fU0VNX0ZMQUdfV1IJKERNX0ZMQUdTX0lBTExPQ1NFTV9XUiB8IERNX0ZMQUdTX0lTRU0pCisJCQkgICAgICBETV9GTEFHU19JQUxMT0NTRU1fUkQgOiBETV9GTEFHU19JTVVYKQorI2RlZmluZSBETV9TRU1fRkxBR19XUgkoRE1fRkxBR1NfSUFMTE9DU0VNX1dSIHwgRE1fRkxBR1NfSU1VWCkKICNlbmRpZgogCiAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNCwyMSkKICNkZWZpbmUgRE1fU0VNX0ZMQUdfUkQoaW9mbGFncykgKCgoaW9mbGFncykgJiBJT19JU0RJUkVDVCkgPyBcCi0JCQkgICAgICAwIDogRE1fRkxBR1NfSVNFTSkKLSNkZWZpbmUgRE1fU0VNX0ZMQUdfV1IJKERNX0ZMQUdTX0lTRU0pCisJCQkgICAgICAwIDogRE1fRkxBR1NfSU1VWCkKKyNkZWZpbmUgRE1fU0VNX0ZMQUdfV1IJKERNX0ZMQUdTX0lNVVgpCiAjZW5kaWYKIAogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Vycm9yLmMgYi9mcy94ZnMveGZzX2Vycm9yLmMKaW5kZXggZDdiNmI1ZC4uMmEyMWM1MCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19lcnJvci5jCisrKyBiL2ZzL3hmcy94ZnNfZXJyb3IuYwpAQCAtNTQsNyArNTQsNiBAQAogCQlpZiAoZSAhPSB4ZnNfZXRyYXBbaV0pCiAJCQljb250aW51ZTsKIAkJY21uX2VycihDRV9OT1RFLCAieGZzX2Vycm9yX3RyYXA6IGVycm9yICVkIiwgZSk7Ci0JCWRlYnVnX3N0b3BfYWxsX2NwdXMoKHZvaWQgKiktMUxMKTsKIAkJQlVHKCk7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZXJyb3IuaCBiL2ZzL3hmcy94ZnNfZXJyb3IuaAppbmRleCAwNmQ4YTg0Li4yNmI4ZTcwIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Vycm9yLmgKKysrIGIvZnMveGZzL3hmc19lcnJvci5oCkBAIC0xOCw5ICsxOCw2IEBACiAjaWZuZGVmCV9fWEZTX0VSUk9SX0hfXwogI2RlZmluZQlfX1hGU19FUlJPUl9IX18KIAotI2RlZmluZSBwcmRldihmbXQsdGFyZyxhcmdzLi4uKSBcCi0JcHJpbnRrKCJYRlM6IGRldmljZSAlcyAtICIgZm10ICJcbiIsIFhGU19CVUZUQVJHX05BTUUodGFyZyksICMjIGFyZ3MpCi0KICNkZWZpbmUgWEZTX0VSRUNPVkVSCTEJLyogRmFpbHVyZSB0byByZWNvdmVyIGxvZyAqLwogI2RlZmluZSBYRlNfRUxPR1NUQVQJMgkvKiBGYWlsdXJlIHRvIHN0YXQgbG9nIGluIHVzZXIgc3BhY2UgKi8KICNkZWZpbmUgWEZTX0VOT0xPR1NQQUNFCTMJLyogUmVzZXJ2YXRpb24gdG9vIGxhcmdlICovCkBAIC0xODIsOCArMTc5LDExIEBACiBzdHJ1Y3QgeGZzX21vdW50OwogLyogUFJJTlRGTElLRTQgKi8KIGV4dGVybiB2b2lkIHhmc19jbW5fZXJyKGludCBwYW5pY190YWcsIGludCBsZXZlbCwgc3RydWN0IHhmc19tb3VudCAqbXAsCi0JCQkgICAgY2hhciAqZm10LCAuLi4pOworCQkJY2hhciAqZm10LCAuLi4pOwogLyogUFJJTlRGTElLRTMgKi8KIGV4dGVybiB2b2lkIHhmc19mc19jbW5fZXJyKGludCBsZXZlbCwgc3RydWN0IHhmc19tb3VudCAqbXAsIGNoYXIgKmZtdCwgLi4uKTsKIAorI2RlZmluZSB4ZnNfZnNfcmVwYWlyX2Ntbl9lcnIobGV2ZWwsIG1wLCBmbXQsIGFyZ3MuLi4pIFwKKwl4ZnNfZnNfY21uX2VycihsZXZlbCwgbXAsIGZtdCAiICBVbm1vdW50IGFuZCBydW4geGZzX3JlcGFpci4iLCAjIyBhcmdzKQorCiAjZW5kaWYJLyogX19YRlNfRVJST1JfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2ZzLmggYi9mcy94ZnMveGZzX2ZzLmgKaW5kZXggYmEwOTZmOC4uMTQwMTBmMSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19mcy5oCisrKyBiL2ZzL3hmcy94ZnNfZnMuaApAQCAtMywxNSArMywxNSBAQAogICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKICAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCkBAIC02NSw2ICs2NSw4IEBACiAjZGVmaW5lIFhGU19YRkxBR19SVElOSEVSSVQJMHgwMDAwMDEwMAkvKiBjcmVhdGUgd2l0aCBydCBiaXQgc2V0ICovCiAjZGVmaW5lIFhGU19YRkxBR19QUk9KSU5IRVJJVAkweDAwMDAwMjAwCS8qIGNyZWF0ZSB3aXRoIHBhcmVudHMgcHJvamlkICovCiAjZGVmaW5lIFhGU19YRkxBR19OT1NZTUxJTktTCTB4MDAwMDA0MDAJLyogZGlzYWxsb3cgc3ltbGluayBjcmVhdGlvbiAqLworI2RlZmluZSBYRlNfWEZMQUdfRVhUU0laRQkweDAwMDAwODAwCS8qIGV4dGVudCBzaXplIGFsbG9jYXRvciBoaW50ICovCisjZGVmaW5lIFhGU19YRkxBR19FWFRTWklOSEVSSVQJMHgwMDAwMTAwMAkvKiBpbmhlcml0IGlub2RlIGV4dGVudCBzaXplICovCiAjZGVmaW5lIFhGU19YRkxBR19IQVNBVFRSCTB4ODAwMDAwMDAJLyogbm8gRElGTEFHIGZvciB0aGlzCSovCiAKIC8qCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Zzb3BzLmMgYi9mcy94ZnMveGZzX2Zzb3BzLmMKaW5kZXggZDEyMzZkNi4uYjRkOTcxYiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19mc29wcy5jCisrKyBiL2ZzL3hmcy94ZnNfZnNvcHMuYwpAQCAtNTAxLDcgKzUwMSw3IEBACiAJaWYgKGludmFsID09IChfX3VpbnQ2NF90ICopTlVMTCkgewogCQlvdXR2YWwtPnJlc2Jsa3MgPSBtcC0+bV9yZXNibGtzOwogCQlvdXR2YWwtPnJlc2Jsa3NfYXZhaWwgPSBtcC0+bV9yZXNibGtzX2F2YWlsOwotCQlyZXR1cm4oMCk7CisJCXJldHVybiAwOwogCX0KIAogCXJlcXVlc3QgPSAqaW52YWw7CkBAIC01MzcsNyArNTM3LDMzIEBACiAJb3V0dmFsLT5yZXNibGtzID0gbXAtPm1fcmVzYmxrczsKIAlvdXR2YWwtPnJlc2Jsa3NfYXZhaWwgPSBtcC0+bV9yZXNibGtzX2F2YWlsOwogCVhGU19TQl9VTkxPQ0sobXAsIHMpOwotCXJldHVybigwKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZAoreGZzX2ZzX2xvZ19kdW1teSh4ZnNfbW91bnRfdCAqbXApCit7CisJeGZzX3RyYW5zX3QgKnRwOworCXhmc19pbm9kZV90ICppcDsKKworCisJdHAgPSBfeGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfRFVNTVkxKTsKKwlhdG9taWNfaW5jKCZtcC0+bV9hY3RpdmVfdHJhbnMpOworCWlmICh4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwgWEZTX0lDSEFOR0VfTE9HX1JFUyhtcCksIDAsIDAsIDApKSB7CisJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQlyZXR1cm47CisJfQorCisJaXAgPSBtcC0+bV9yb290aXA7CisJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CisJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOworCXhmc190cmFuc19zZXRfc3luYyh0cCk7CisJeGZzX3RyYW5zX2NvbW1pdCh0cCwgMCwgTlVMTCk7CisKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwogfQogCiBpbnQKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZnNvcHMuaCBiL2ZzL3hmcy94ZnNfZnNvcHMuaAppbmRleCBmMzI3MTNmLi4zMDBkMGM5IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Zzb3BzLmgKKysrIGIvZnMveGZzL3hmc19mc29wcy5oCkBAIC0yNSw1ICsyNSw2IEBACiBleHRlcm4gaW50IHhmc19yZXNlcnZlX2Jsb2Nrcyh4ZnNfbW91bnRfdCAqbXAsIF9fdWludDY0X3QgKmludmFsLAogCQkJCXhmc19mc29wX3Jlc2Jsa3NfdCAqb3V0dmFsKTsKIGV4dGVybiBpbnQgeGZzX2ZzX2dvaW5nZG93bih4ZnNfbW91bnRfdCAqbXAsIF9fdWludDMyX3QgaW5mbGFncyk7CitleHRlcm4gdm9pZCB4ZnNfZnNfbG9nX2R1bW15KHhmc19tb3VudF90ICptcCk7CiAKICNlbmRpZgkvKiBfX1hGU19GU09QU19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaWdldC5jIGIvZnMveGZzL3hmc19pZ2V0LmMKaW5kZXggZmMxOWVlZC4uOGUzODBhMSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pZ2V0LmMKKysrIGIvZnMveGZzL3hmc19pZ2V0LmMKQEAgLTQ5Myw3ICs0OTMsNiBAQAogCiByZXRyeToKIAlpZiAoKGlub2RlID0gaWdldF9sb2NrZWQoWEZTX01UT1ZGUyhtcCktPnZmc19zdXBlciwgaW5vKSkpIHsKLQkJYmh2X2Rlc2NfdAkqYmRwOwogCQl4ZnNfaW5vZGVfdAkqaXA7CiAKIAkJdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKQEAgLTUxNywxNCArNTE2LDEyIEBACiAJCQkgKiB0byB3YWl0IGZvciB0aGUgaW5vZGUgdG8gZ28gYXdheS4KIAkJCSAqLwogCQkJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkgfHwKLQkJCSAgICAoKGJkcCA9IHZuX2Jodl9sb29rdXAoVk5fQkhWX0hFQUQodnApLAotCQkJCQkJICAmeGZzX3Zub2Rlb3BzKSkgPT0gTlVMTCkpIHsKKwkJCSAgICAoKGlwID0geGZzX3Z0b2kodnApKSA9PSBOVUxMKSkgewogCQkJCWlwdXQoaW5vZGUpOwogCQkJCWRlbGF5KDEpOwogCQkJCWdvdG8gcmV0cnk7CiAJCQl9CiAKLQkJCWlwID0gWEZTX0JIVlRPSShiZHApOwogCQkJaWYgKGxvY2tfZmxhZ3MgIT0gMCkKIAkJCQl4ZnNfaWxvY2soaXAsIGxvY2tfZmxhZ3MpOwogCQkJWEZTX1NUQVRTX0lOQyh4c19pZ19mb3VuZCk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlLmMgYi9mcy94ZnMveGZzX2lub2RlLmMKaW5kZXggZGYwZDQ1Ny4uMWQ3ZjVhNyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZS5jCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGUuYwpAQCAtNDA0LDkgKzQwNCw4IEBACiAJICAgIElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX25leHRlbnRzLCBBUkNIX0NPTlZFUlQpICsKIAkJSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfYW5leHRlbnRzLCBBUkNIX0NPTlZFUlQpID4KIAkgICAgSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfbmJsb2NrcywgQVJDSF9DT05WRVJUKSkpIHsKLQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgaXAtPmlfbW91bnQsCi0JCQkiY29ycnVwdCBkaW5vZGUgJUx1LCBleHRlbnQgdG90YWwgPSAlZCwgbmJsb2NrcyA9ICVMdS4iCi0JCQkiICBVbm1vdW50IGFuZCBydW4geGZzX3JlcGFpci4iLAorCQl4ZnNfZnNfcmVwYWlyX2Ntbl9lcnIoQ0VfV0FSTiwgaXAtPmlfbW91bnQsCisJCQkiY29ycnVwdCBkaW5vZGUgJUx1LCBleHRlbnQgdG90YWwgPSAlZCwgbmJsb2NrcyA9ICVMdS4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylpcC0+aV9pbm8sCiAJCQkoaW50KShJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9uZXh0ZW50cywgQVJDSF9DT05WRVJUKQogCQkJICAgICsgSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfYW5leHRlbnRzLCBBUkNIX0NPTlZFUlQpKSwKQEAgLTQxOCw5ICs0MTcsOCBAQAogCX0KIAogCWlmICh1bmxpa2VseShJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9mb3Jrb2ZmLCBBUkNIX0NPTlZFUlQpID4gaXAtPmlfbW91bnQtPm1fc2Iuc2JfaW5vZGVzaXplKSkgewotCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKLQkJCSJjb3JydXB0IGRpbm9kZSAlTHUsIGZvcmtvZmYgPSAweCV4LiIKLQkJCSIgIFVubW91bnQgYW5kIHJ1biB4ZnNfcmVwYWlyLiIsCisJCXhmc19mc19yZXBhaXJfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKKwkJCSJjb3JydXB0IGRpbm9kZSAlTHUsIGZvcmtvZmYgPSAweCV4LiIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKWlwLT5pX2lubywKIAkJCShpbnQpKElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX2ZvcmtvZmYsIEFSQ0hfQ09OVkVSVCkpKTsKIAkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19pZm9ybWF0KDIpIiwgWEZTX0VSUkxFVkVMX0xPVywKQEAgLTQ1MSw4ICs0NDksOSBAQAogCQkJICogbm8gbG9jYWwgcmVndWxhciBmaWxlcyB5ZXQKIAkJCSAqLwogCQkJaWYgKHVubGlrZWx5KChJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9tb2RlLCBBUkNIX0NPTlZFUlQpICYgU19JRk1UKSA9PSBTX0lGUkVHKSkgewotCQkJCXhmc19mc19jbW5fZXJyKENFX1dBUk4sIGlwLT5pX21vdW50LAotCQkJCQkiY29ycnVwdCBpbm9kZSAobG9jYWwgZm9ybWF0IGZvciByZWd1bGFyIGZpbGUpICVMdS4gIFVubW91bnQgYW5kIHJ1biB4ZnNfcmVwYWlyLiIsCisJCQkJeGZzX2ZzX3JlcGFpcl9jbW5fZXJyKENFX1dBUk4sIGlwLT5pX21vdW50LAorCQkJCQkiY29ycnVwdCBpbm9kZSAlTHUgIgorCQkJCQkiKGxvY2FsIGZvcm1hdCBmb3IgcmVndWxhciBmaWxlKS4iLAogCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBpcC0+aV9pbm8pOwogCQkJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfaWZvcm1hdCg0KSIsCiAJCQkJCQkgICAgIFhGU19FUlJMRVZFTF9MT1csCkBAIC00NjIsOCArNDYxLDkgQEAKIAogCQkJZGlfc2l6ZSA9IElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX3NpemUsIEFSQ0hfQ09OVkVSVCk7CiAJCQlpZiAodW5saWtlbHkoZGlfc2l6ZSA+IFhGU19ERk9SS19EU0laRShkaXAsIGlwLT5pX21vdW50KSkpIHsKLQkJCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKLQkJCQkJImNvcnJ1cHQgaW5vZGUgJUx1IChiYWQgc2l6ZSAlTGQgZm9yIGxvY2FsIGlub2RlKS4gIFVubW91bnQgYW5kIHJ1biB4ZnNfcmVwYWlyLiIsCisJCQkJeGZzX2ZzX3JlcGFpcl9jbW5fZXJyKENFX1dBUk4sIGlwLT5pX21vdW50LAorCQkJCQkiY29ycnVwdCBpbm9kZSAlTHUgIgorCQkJCQkiKGJhZCBzaXplICVMZCBmb3IgbG9jYWwgaW5vZGUpLiIsCiAJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGlwLT5pX2lubywKIAkJCQkJKGxvbmcgbG9uZykgZGlfc2l6ZSk7CiAJCQkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19pZm9ybWF0KDUpIiwKQEAgLTU1MSw4ICs1NTEsOSBAQAogCSAqIGttZW1fYWxsb2MoKSBvciBtZW1jcHkoKSBiZWxvdy4KIAkgKi8KIAlpZiAodW5saWtlbHkoc2l6ZSA+IFhGU19ERk9SS19TSVpFKGRpcCwgaXAtPmlfbW91bnQsIHdoaWNoZm9yaykpKSB7Ci0JCXhmc19mc19jbW5fZXJyKENFX1dBUk4sIGlwLT5pX21vdW50LAotCQkJImNvcnJ1cHQgaW5vZGUgJUx1IChiYWQgc2l6ZSAlZCBmb3IgbG9jYWwgZm9yaywgc2l6ZSA9ICVkKS4gIFVubW91bnQgYW5kIHJ1biB4ZnNfcmVwYWlyLiIsCisJCXhmc19mc19yZXBhaXJfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKKwkJCSJjb3JydXB0IGlub2RlICVMdSAiCisJCQkiKGJhZCBzaXplICVkIGZvciBsb2NhbCBmb3JrLCBzaXplID0gJWQpLiIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKSBpcC0+aV9pbm8sIHNpemUsCiAJCQlYRlNfREZPUktfU0laRShkaXAsIGlwLT5pX21vdW50LCB3aGljaGZvcmspKTsKIAkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19pZm9ybWF0X2xvY2FsIiwgWEZTX0VSUkxFVkVMX0xPVywKQEAgLTYxMCw4ICs2MTEsOCBAQAogCSAqIGttZW1fYWxsb2MoKSBvciBtZW1jcHkoKSBiZWxvdy4KIAkgKi8KIAlpZiAodW5saWtlbHkoc2l6ZSA8IDAgfHwgc2l6ZSA+IFhGU19ERk9SS19TSVpFKGRpcCwgaXAtPmlfbW91bnQsIHdoaWNoZm9yaykpKSB7Ci0JCXhmc19mc19jbW5fZXJyKENFX1dBUk4sIGlwLT5pX21vdW50LAotCQkJImNvcnJ1cHQgaW5vZGUgJUx1ICgoYSlleHRlbnRzID0gJWQpLiAgVW5tb3VudCBhbmQgcnVuIHhmc19yZXBhaXIuIiwKKwkJeGZzX2ZzX3JlcGFpcl9jbW5fZXJyKENFX1dBUk4sIGlwLT5pX21vdW50LAorCQkJImNvcnJ1cHQgaW5vZGUgJUx1ICgoYSlleHRlbnRzID0gJWQpLiIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKSBpcC0+aV9pbm8sIG5leCk7CiAJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfaWZvcm1hdF9leHRlbnRzKDEpIiwgWEZTX0VSUkxFVkVMX0xPVywKIAkJCQkgICAgIGlwLT5pX21vdW50LCBkaXApOwpAQCAtNjkyLDggKzY5Myw4IEBACiAJICAgIHx8IFhGU19CTURSX1NQQUNFX0NBTEMobnJlY3MpID4KIAkJCVhGU19ERk9SS19TSVpFKGRpcCwgaXAtPmlfbW91bnQsIHdoaWNoZm9yaykKIAkgICAgfHwgWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspID4gaXAtPmlfZC5kaV9uYmxvY2tzKSkgewotCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKLQkJCSJjb3JydXB0IGlub2RlICVMdSAoYnRyZWUpLiAgVW5tb3VudCBhbmQgcnVuIHhmc19yZXBhaXIuIiwKKwkJeGZzX2ZzX3JlcGFpcl9jbW5fZXJyKENFX1dBUk4sIGlwLT5pX21vdW50LAorCQkJImNvcnJ1cHQgaW5vZGUgJUx1IChidHJlZSkuIiwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGlwLT5pX2lubyk7CiAJCVhGU19FUlJPUl9SRVBPUlQoInhmc19pZm9ybWF0X2J0cmVlIiwgWEZTX0VSUkxFVkVMX0xPVywKIAkJCQkgaXAtPmlfbW91bnQpOwpAQCAtODA5LDYgKzgxMCwxMCBAQAogCQkJZmxhZ3MgfD0gWEZTX1hGTEFHX1BST0pJTkhFUklUOwogCQlpZiAoZGlfZmxhZ3MgJiBYRlNfRElGTEFHX05PU1lNTElOS1MpCiAJCQlmbGFncyB8PSBYRlNfWEZMQUdfTk9TWU1MSU5LUzsKKwkJaWYgKGRpX2ZsYWdzICYgWEZTX0RJRkxBR19FWFRTSVpFKQorCQkJZmxhZ3MgfD0gWEZTX1hGTEFHX0VYVFNJWkU7CisJCWlmIChkaV9mbGFncyAmIFhGU19ESUZMQUdfRVhUU1pJTkhFUklUKQorCQkJZmxhZ3MgfD0gWEZTX1hGTEFHX0VYVFNaSU5IRVJJVDsKIAl9CiAKIAlyZXR1cm4gZmxhZ3M7CkBAIC0xMTkyLDExICsxMTk3LDE5IEBACiAJCQlpZiAoKG1vZGUgJiBTX0lGTVQpID09IFNfSUZESVIpIHsKIAkJCQlpZiAocGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JUSU5IRVJJVCkKIAkJCQkJZGlfZmxhZ3MgfD0gWEZTX0RJRkxBR19SVElOSEVSSVQ7Ci0JCQl9IGVsc2UgeworCQkJCWlmIChwaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfRVhUU1pJTkhFUklUKSB7CisJCQkJCWRpX2ZsYWdzIHw9IFhGU19ESUZMQUdfRVhUU1pJTkhFUklUOworCQkJCQlpcC0+aV9kLmRpX2V4dHNpemUgPSBwaXAtPmlfZC5kaV9leHRzaXplOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoKG1vZGUgJiBTX0lGTVQpID09IFNfSUZSRUcpIHsKIAkJCQlpZiAocGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JUSU5IRVJJVCkgewogCQkJCQlkaV9mbGFncyB8PSBYRlNfRElGTEFHX1JFQUxUSU1FOwogCQkJCQlpcC0+aV9pb2NvcmUuaW9fZmxhZ3MgfD0gWEZTX0lPQ09SRV9SVDsKIAkJCQl9CisJCQkJaWYgKHBpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19FWFRTWklOSEVSSVQpIHsKKwkJCQkJZGlfZmxhZ3MgfD0gWEZTX0RJRkxBR19FWFRTSVpFOworCQkJCQlpcC0+aV9kLmRpX2V4dHNpemUgPSBwaXAtPmlfZC5kaV9leHRzaXplOworCQkJCX0KIAkJCX0KIAkJCWlmICgocGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX05PQVRJTUUpICYmCiAJCQkgICAgeGZzX2luaGVyaXRfbm9hdGltZSkKQEAgLTEyNjIsNyArMTI3NSw3IEBACiAJaWYgKChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpICE9IFNfSUZSRUcpCiAJCXJldHVybjsKIAotCWlmICggaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUgKQorCWlmIChpcC0+aV9kLmRpX2ZsYWdzICYgKFhGU19ESUZMQUdfUkVBTFRJTUUgfCBYRlNfRElGTEFHX0VYVFNJWkUpKQogCQlyZXR1cm47CiAKIAluaW1hcHMgPSAyOwpAQCAtMTc2NSwyMiArMTc3OCwxOSBAQAogCXhmc19mc2l6ZV90CW5ld19zaXplLAogCWNyZWRfdAkJKmNyZWRwKQogewotCXhmc19mc2l6ZV90CWlzaXplOwogCWludAkJZXJyb3I7CiAKIAlBU1NFUlQoaXNtcmxvY2tlZCgmKGlwLT5pX2xvY2spLCBNUl9VUERBVEUpICE9IDApOwogCUFTU0VSVChpc21ybG9ja2VkKCYoaXAtPmlfaW9sb2NrKSwgTVJfVVBEQVRFKSAhPSAwKTsKIAlBU1NFUlQobmV3X3NpemUgPiBpcC0+aV9kLmRpX3NpemUpOwogCi0JZXJyb3IgPSAwOwotCWlzaXplID0gaXAtPmlfZC5kaV9zaXplOwogCS8qCiAJICogWmVybyBhbnkgcGFnZXMgdGhhdCBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkKIAkgKiB4ZnNfd3JpdGVfZmlsZSgpIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlCiAJICogYW5kIGFueSBibG9ja3MgYmV0d2VlbiB0aGUgb2xkIGFuZCBuZXcgZmlsZSBzaXplcy4KIAkgKi8KLQllcnJvciA9IHhmc196ZXJvX2VvZihYRlNfSVRPVihpcCksICZpcC0+aV9pb2NvcmUsIG5ld19zaXplLCBpc2l6ZSwKLQkJCQluZXdfc2l6ZSk7CisJZXJyb3IgPSB4ZnNfemVyb19lb2YoWEZTX0lUT1YoaXApLCAmaXAtPmlfaW9jb3JlLCBuZXdfc2l6ZSwKKwkJCSAgICAgaXAtPmlfZC5kaV9zaXplLCBuZXdfc2l6ZSk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0zMzU1LDYgKzMzNjUsMTEgQEAKIAlpcC0+aV91cGRhdGVfY29yZSA9IDA7CiAJU1lOQ0hST05JWkUoKTsKIAorCS8qCisJICogTWFrZSBzdXJlIHRvIGdldCB0aGUgbGF0ZXN0IGF0aW1lIGZyb20gdGhlIExpbnV4IGlub2RlLgorCSAqLworCXhmc19zeW5jaHJvbml6ZV9hdGltZShpcCk7CisKIAlpZiAoWEZTX1RFU1RfRVJST1IoSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfbWFnaWMsQVJDSF9DT05WRVJUKSAhPSBYRlNfRElOT0RFX01BR0lDLAogCQkJICAgICAgIG1wLCBYRlNfRVJSVEFHX0lGTFVTSF8xLCBYRlNfUkFORE9NX0lGTFVTSF8xKSkgewogCQl4ZnNfY21uX2VycihYRlNfUFRBR19JRkxVU0gsIENFX0FMRVJULCBtcCwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGUuaCBiL2ZzL3hmcy94ZnNfaW5vZGUuaAppbmRleCAxMjRkMzBlLi4xY2ZiY2YxIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lub2RlLmgKKysrIGIvZnMveGZzL3hmc19pbm9kZS5oCkBAIC00MzYsNiArNDM2LDEwIEBACiB4ZnNfZnNpemVfdAl4ZnNfZmlsZV9sYXN0X2J5dGUoeGZzX2lub2RlX3QgKik7CiB2b2lkCQl4ZnNfbG9ja19pbm9kZXMoeGZzX2lub2RlX3QgKiosIGludCwgaW50LCB1aW50KTsKIAoreGZzX2lub2RlX3QJKnhmc192dG9pKHN0cnVjdCB2bm9kZSAqdnApOworCit2b2lkCQl4ZnNfc3luY2hyb25pemVfYXRpbWUoeGZzX2lub2RlX3QgKik7CisKICNkZWZpbmUgeGZzX2lwaW5jb3VudChpcCkJKCh1bnNpZ25lZCBpbnQpIGF0b21pY19yZWFkKCZpcC0+aV9waW5jb3VudCkpCiAKICNpZmRlZiBERUJVRwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMgYi9mcy94ZnMveGZzX2lub2RlX2l0ZW0uYwppbmRleCA3ZjMzNjNjLi4zNmFhMWZjIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lub2RlX2l0ZW0uYworKysgYi9mcy94ZnMveGZzX2lub2RlX2l0ZW0uYwpAQCAtMjcxLDYgKzI3MSwxMSBAQAogCWlmIChpcC0+aV91cGRhdGVfc2l6ZSkKIAkJaXAtPmlfdXBkYXRlX3NpemUgPSAwOwogCisJLyoKKwkgKiBNYWtlIHN1cmUgdG8gZ2V0IHRoZSBsYXRlc3QgYXRpbWUgZnJvbSB0aGUgTGludXggaW5vZGUuCisJICovCisJeGZzX3N5bmNocm9uaXplX2F0aW1lKGlwKTsKKwogCXZlY3AtPmlfYWRkciA9ICh4ZnNfY2FkZHJfdCkmaXAtPmlfZDsKIAl2ZWNwLT5pX2xlbiAgPSBzaXplb2YoeGZzX2Rpbm9kZV9jb3JlX3QpOwogCVhMT0dfVkVDX1NFVF9UWVBFKHZlY3AsIFhMT0dfUkVHX1RZUEVfSUNPUkUpOwpAQCAtNjAzLDcgKzYwOCw3IEBACiAJCWlmIChpaXAtPmlsaV9wdXNoYnVmX2ZsYWcgPT0gMCkgewogCQkJaWlwLT5pbGlfcHVzaGJ1Zl9mbGFnID0gMTsKICNpZmRlZiBERUJVRwotCQkJaWlwLT5pbGlfcHVzaF9vd25lciA9IGdldF90aHJlYWRfaWQoKTsKKwkJCWlpcC0+aWxpX3B1c2hfb3duZXIgPSBjdXJyZW50X3BpZCgpOwogI2VuZGlmCiAJCQkvKgogCQkJICogSW5vZGUgaXMgbGVmdCBsb2NrZWQgaW4gc2hhcmVkIG1vZGUuCkBAIC03ODIsNyArNzg3LDcgQEAKIAkgKiB0cnlpbmcgdG8gZHVwbGljYXRlIG91ciBlZmZvcnQuCiAJICovCiAJQVNTRVJUKGlpcC0+aWxpX3B1c2hidWZfZmxhZyAhPSAwKTsKLQlBU1NFUlQoaWlwLT5pbGlfcHVzaF9vd25lciA9PSBnZXRfdGhyZWFkX2lkKCkpOworCUFTU0VSVChpaXAtPmlsaV9wdXNoX293bmVyID09IGN1cnJlbnRfcGlkKCkpOwogCiAJLyoKIAkgKiBJZiBmbHVzaGxvY2sgaXNuJ3QgbG9ja2VkIGFueW1vcmUsIGNoYW5jZXMgYXJlIHRoYXQgdGhlCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lvbWFwLmMgYi9mcy94ZnMveGZzX2lvbWFwLmMKaW5kZXggNDVhNzdhMy4uNzg4OTE3ZjMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW9tYXAuYworKysgYi9mcy94ZnMveGZzX2lvbWFwLmMKQEAgLTQwLDcgKzQwLDYgQEAKICNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKLSNpbmNsdWRlICJ4ZnNfYml0LmgiCiAjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCkBAIC0yNjMsNyArMjYyLDcgQEAKIAljYXNlIEJNQVBJX1dSSVRFOgogCQkvKiBJZiB3ZSBmb3VuZCBhbiBleHRlbnQsIHJldHVybiBpdCAqLwogCQlpZiAobmltYXBzICYmCi0JCSAgICAoaW1hcC5icl9zdGFydGJsb2NrICE9IEhPTEVTVEFSVEJMT0NLKSAmJiAKKwkJICAgIChpbWFwLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0spICYmCiAJCSAgICAoaW1hcC5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSykpIHsKIAkJCXhmc19pb21hcF9tYXBfdHJhY2UoWEZTX0lPTUFQX1dSSVRFX01BUCwgaW8sCiAJCQkJCW9mZnNldCwgY291bnQsIGlvbWFwcCwgJmltYXAsIGZsYWdzKTsKQEAgLTMxOCw2ICszMTcsNTggQEAKIH0KIAogU1RBVElDIGludAoreGZzX2lvbWFwX2VvZl9hbGlnbl9sYXN0X2ZzYigKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX2lvY29yZV90CSppbywKKwl4ZnNfZnNpemVfdAlpc2l6ZSwKKwl4ZnNfZXh0bGVuX3QJZXh0c2l6ZSwKKwl4ZnNfZmlsZW9mZl90CSpsYXN0X2ZzYikKK3sKKwl4ZnNfZmlsZW9mZl90CW5ld19sYXN0X2ZzYiA9IDA7CisJeGZzX2V4dGxlbl90CWFsaWduOworCWludAkJZW9mLCBlcnJvcjsKKworCWlmIChpby0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUKQorCQk7CisJLyoKKwkgKiBJZiBtb3VudGVkIHdpdGggdGhlICItbyBzd2FsbG9jIiBvcHRpb24sIHJvdW5kdXAgdGhlIGFsbG9jYXRpb24KKwkgKiByZXF1ZXN0IHRvIGEgc3RyaXBlIHdpZHRoIGJvdW5kYXJ5IGlmIHRoZSBmaWxlIHNpemUgaXMgPj0KKwkgKiBzdHJpcGUgd2lkdGggYW5kIHdlIGFyZSBhbGxvY2F0aW5nIHBhc3QgdGhlIGFsbG9jYXRpb24gZW9mLgorCSAqLworCWVsc2UgaWYgKG1wLT5tX3N3aWR0aCAmJiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfU1dBTExPQykgJiYKKwkgICAgICAgIChpc2l6ZSA+PSBYRlNfRlNCX1RPX0IobXAsIG1wLT5tX3N3aWR0aCkpKQorCQluZXdfbGFzdF9mc2IgPSByb3VuZHVwXzY0KCpsYXN0X2ZzYiwgbXAtPm1fc3dpZHRoKTsKKwkvKgorCSAqIFJvdW5kdXAgdGhlIGFsbG9jYXRpb24gcmVxdWVzdCB0byBhIHN0cmlwZSB1bml0IChtX2RhbGlnbikgYm91bmRhcnkKKwkgKiBpZiB0aGUgZmlsZSBzaXplIGlzID49IHN0cmlwZSB1bml0IHNpemUsIGFuZCB3ZSBhcmUgYWxsb2NhdGluZyBwYXN0CisJICogdGhlIGFsbG9jYXRpb24gZW9mLgorCSAqLworCWVsc2UgaWYgKG1wLT5tX2RhbGlnbiAmJiAoaXNpemUgPj0gWEZTX0ZTQl9UT19CKG1wLCBtcC0+bV9kYWxpZ24pKSkKKwkJbmV3X2xhc3RfZnNiID0gcm91bmR1cF82NCgqbGFzdF9mc2IsIG1wLT5tX2RhbGlnbik7CisKKwkvKgorCSAqIEFsd2F5cyByb3VuZCB1cCB0aGUgYWxsb2NhdGlvbiByZXF1ZXN0IHRvIGFuIGV4dGVudCBib3VuZGFyeQorCSAqICh3aGVuIGZpbGUgb24gYSByZWFsLXRpbWUgc3Vidm9sdW1lIG9yIGhhcyBkaV9leHRzaXplIGhpbnQpLgorCSAqLworCWlmIChleHRzaXplKSB7CisJCWlmIChuZXdfbGFzdF9mc2IpCisJCQlhbGlnbiA9IHJvdW5kdXBfNjQobmV3X2xhc3RfZnNiLCBleHRzaXplKTsKKwkJZWxzZQorCQkJYWxpZ24gPSBleHRzaXplOworCQluZXdfbGFzdF9mc2IgPSByb3VuZHVwXzY0KCpsYXN0X2ZzYiwgYWxpZ24pOworCX0KKworCWlmIChuZXdfbGFzdF9mc2IpIHsKKwkJZXJyb3IgPSBYRlNfQk1BUF9FT0YobXAsIGlvLCBuZXdfbGFzdF9mc2IsIFhGU19EQVRBX0ZPUkssICZlb2YpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJCWlmIChlb2YpCisJCQkqbGFzdF9mc2IgPSBuZXdfbGFzdF9mc2I7CisJfQorCXJldHVybiAwOworfQorCitTVEFUSUMgaW50CiB4ZnNfZmx1c2hfc3BhY2UoCiAJeGZzX2lub2RlX3QJKmlwLAogCWludAkJKmZzeW5jZWQsCkBAIC0zNjMsMTkgKzQxNCwyMCBAQAogCXhmc19pb2NvcmVfdAkqaW8gPSAmaXAtPmlfaW9jb3JlOwogCXhmc19maWxlb2ZmX3QJb2Zmc2V0X2ZzYjsKIAl4ZnNfZmlsZW9mZl90CWxhc3RfZnNiOwotCXhmc19maWxibGtzX3QJY291bnRfZnNiOworCXhmc19maWxibGtzX3QJY291bnRfZnNiLCByZXNhbGlnbmVkOwogCXhmc19mc2Jsb2NrX3QJZmlyc3Rmc2I7CisJeGZzX2V4dGxlbl90CWV4dHN6LCB0ZW1wOworCXhmc19mc2l6ZV90CWlzaXplOwogCWludAkJbmltYXBzOwotCWludAkJZXJyb3I7CiAJaW50CQlibWFwaV9mbGFnOwogCWludAkJcXVvdGFfZmxhZzsKIAlpbnQJCXJ0OwogCXhmc190cmFuc190CSp0cDsKIAl4ZnNfYm1idF9pcmVjX3QgaW1hcDsKIAl4ZnNfYm1hcF9mcmVlX3QgZnJlZV9saXN0OwotCXhmc19maWxibGtzX3QJcWJsb2NrcywgcmVzYmxrczsKKwl1aW50CQlxYmxvY2tzLCByZXNibGtzLCByZXNydGV4dGVudHM7CiAJaW50CQljb21taXR0ZWQ7Ci0JaW50CQlyZXNydGV4dGVudHM7CisJaW50CQllcnJvcjsKIAogCS8qCiAJICogTWFrZSBzdXJlIHRoYXQgdGhlIGRxdW90cyBhcmUgdGhlcmUuIFRoaXMgZG9lc24ndCBob2xkCkBAIC0zODUsMzggKzQzNyw1MyBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIFhGU19FUlJPUihlcnJvcik7CiAKLQlvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKLQlsYXN0X2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgKCh4ZnNfdWZzaXplX3QpKG9mZnNldCArIGNvdW50KSkpOwotCWNvdW50X2ZzYiA9IGxhc3RfZnNiIC0gb2Zmc2V0X2ZzYjsKLQlpZiAoZm91bmQgJiYgKHJldF9pbWFwLT5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLKSkgewotCQl4ZnNfZmlsZW9mZl90CW1hcF9sYXN0X2ZzYjsKLQotCQltYXBfbGFzdF9mc2IgPSByZXRfaW1hcC0+YnJfYmxvY2tjb3VudCArIHJldF9pbWFwLT5icl9zdGFydG9mZjsKLQkJaWYgKG1hcF9sYXN0X2ZzYiA8IGxhc3RfZnNiKSB7Ci0JCQlsYXN0X2ZzYiA9IG1hcF9sYXN0X2ZzYjsKLQkJCWNvdW50X2ZzYiA9IGxhc3RfZnNiIC0gb2Zmc2V0X2ZzYjsKLQkJfQotCQlBU1NFUlQoY291bnRfZnNiID4gMCk7Ci0JfQotCi0JLyoKLQkgKiBEZXRlcm1pbmUgaWYgcmVzZXJ2aW5nIHNwYWNlIG9uIHRoZSBkYXRhIG9yIHJlYWx0aW1lIHBhcnRpdGlvbi4KLQkgKi8KLQlpZiAoKHJ0ID0gWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSkpIHsKLQkJeGZzX2V4dGxlbl90CWV4dHN6OwotCisJcnQgPSBYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApOworCWlmICh1bmxpa2VseShydCkpIHsKIAkJaWYgKCEoZXh0c3ogPSBpcC0+aV9kLmRpX2V4dHNpemUpKQogCQkJZXh0c3ogPSBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKLQkJcmVzcnRleHRlbnRzID0gcWJsb2NrcyA9IChjb3VudF9mc2IgKyBleHRzeiAtIDEpOwotCQlkb19kaXYocmVzcnRleHRlbnRzLCBtcC0+bV9zYi5zYl9yZXh0c2l6ZSk7Ci0JCXJlc2Jsa3MgPSBYRlNfRElPU1RSQVRfU1BBQ0VfUkVTKG1wLCAwKTsKLQkJcXVvdGFfZmxhZyA9IFhGU19RTU9QVF9SRVNfUlRCTEtTOwogCX0gZWxzZSB7Ci0JCXJlc3J0ZXh0ZW50cyA9IDA7Ci0JCXJlc2Jsa3MgPSBxYmxvY2tzID0gWEZTX0RJT1NUUkFUX1NQQUNFX1JFUyhtcCwgY291bnRfZnNiKTsKLQkJcXVvdGFfZmxhZyA9IFhGU19RTU9QVF9SRVNfUkVHQkxLUzsKKwkJZXh0c3ogPSBpcC0+aV9kLmRpX2V4dHNpemU7CiAJfQogCisJaXNpemUgPSBpcC0+aV9kLmRpX3NpemU7CisJaWYgKGlvLT5pb19uZXdfc2l6ZSA+IGlzaXplKQorCQlpc2l6ZSA9IGlvLT5pb19uZXdfc2l6ZTsKKworICAJb2Zmc2V0X2ZzYiA9IFhGU19CX1RPX0ZTQlQobXAsIG9mZnNldCk7CisgIAlsYXN0X2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgKCh4ZnNfdWZzaXplX3QpKG9mZnNldCArIGNvdW50KSkpOworCWlmICgob2Zmc2V0ICsgY291bnQpID4gaXNpemUpIHsKKwkJZXJyb3IgPSB4ZnNfaW9tYXBfZW9mX2FsaWduX2xhc3RfZnNiKG1wLCBpbywgaXNpemUsIGV4dHN6LAorCQkJCQkJCSZsYXN0X2ZzYik7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyb3Jfb3V0OworCX0gZWxzZSB7CisJCWlmIChmb3VuZCAmJiAocmV0X2ltYXAtPmJyX3N0YXJ0YmxvY2sgPT0gSE9MRVNUQVJUQkxPQ0spKQorCQkJbGFzdF9mc2IgPSBNSU4obGFzdF9mc2IsICh4ZnNfZmlsZW9mZl90KQorCQkJCQlyZXRfaW1hcC0+YnJfYmxvY2tjb3VudCArCisJCQkJCXJldF9pbWFwLT5icl9zdGFydG9mZik7CisJfQorCWNvdW50X2ZzYiA9IGxhc3RfZnNiIC0gb2Zmc2V0X2ZzYjsKKwlBU1NFUlQoY291bnRfZnNiID4gMCk7CisKKwlyZXNhbGlnbmVkID0gY291bnRfZnNiOworCWlmICh1bmxpa2VseShleHRzeikpIHsKKwkJaWYgKCh0ZW1wID0gZG9fbW9kKG9mZnNldF9mc2IsIGV4dHN6KSkpCisJCQlyZXNhbGlnbmVkICs9IHRlbXA7CisJCWlmICgodGVtcCA9IGRvX21vZChyZXNhbGlnbmVkLCBleHRzeikpKQorCQkJcmVzYWxpZ25lZCArPSBleHRzeiAtIHRlbXA7CisJfQorCisJaWYgKHVubGlrZWx5KHJ0KSkgeworCQlyZXNydGV4dGVudHMgPSBxYmxvY2tzID0gcmVzYWxpZ25lZDsKKwkJcmVzcnRleHRlbnRzIC89IG1wLT5tX3NiLnNiX3JleHRzaXplOworICAJCXJlc2Jsa3MgPSBYRlNfRElPU1RSQVRfU1BBQ0VfUkVTKG1wLCAwKTsKKyAgCQlxdW90YV9mbGFnID0gWEZTX1FNT1BUX1JFU19SVEJMS1M7CisgIAl9IGVsc2UgeworICAJCXJlc3J0ZXh0ZW50cyA9IDA7CisJCXJlc2Jsa3MgPSBxYmxvY2tzID0gWEZTX0RJT1NUUkFUX1NQQUNFX1JFUyhtcCwgcmVzYWxpZ25lZCk7CisgIAkJcXVvdGFfZmxhZyA9IFhGU19RTU9QVF9SRVNfUkVHQkxLUzsKKyAgCX0KKwogCS8qCiAJICogQWxsb2NhdGUgYW5kIHNldHVwIHRoZSB0cmFuc2FjdGlvbgogCSAqLwpAQCAtNDI2LDcgKzQ5Myw2IEBACiAJCQlYRlNfV1JJVEVfTE9HX1JFUyhtcCksIHJlc3J0ZXh0ZW50cywKIAkJCVhGU19UUkFOU19QRVJNX0xPR19SRVMsCiAJCQlYRlNfV1JJVEVfTE9HX0NPVU5UKTsKLQogCS8qCiAJICogQ2hlY2sgZm9yIHJ1bm5pbmcgb3V0IG9mIHNwYWNlLCBub3RlOiBuZWVkIGxvY2sgdG8gcmV0dXJuCiAJICovCkBAIC00MzYsMjAgKzUwMiwyMCBAQAogCWlmIChlcnJvcikKIAkJZ290byBlcnJvcl9vdXQ7CiAKLQlpZiAoWEZTX1RSQU5TX1JFU0VSVkVfUVVPVEFfTkJMS1MobXAsIHRwLCBpcCwgcWJsb2NrcywgMCwgcXVvdGFfZmxhZykpIHsKLQkJZXJyb3IgPSAoRURRVU9UKTsKKwllcnJvciA9IFhGU19UUkFOU19SRVNFUlZFX1FVT1RBX05CTEtTKG1wLCB0cCwgaXAsCisJCQkJCSAgICAgIHFibG9ja3MsIDAsIHF1b3RhX2ZsYWcpOworCWlmIChlcnJvcikKIAkJZ290byBlcnJvcjE7Ci0JfQogCi0JYm1hcGlfZmxhZyA9IFhGU19CTUFQSV9XUklURTsKIAl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CiAKLQlpZiAoIShmbGFncyAmIEJNQVBJX01NQVApICYmIChvZmZzZXQgPCBpcC0+aV9kLmRpX3NpemUgfHwgcnQpKQorCWJtYXBpX2ZsYWcgPSBYRlNfQk1BUElfV1JJVEU7CisJaWYgKChmbGFncyAmIEJNQVBJX0RJUkVDVCkgJiYgKG9mZnNldCA8IGlwLT5pX2QuZGlfc2l6ZSB8fCBleHRzeikpCiAJCWJtYXBpX2ZsYWcgfD0gWEZTX0JNQVBJX1BSRUFMTE9DOwogCiAJLyoKLQkgKiBJc3N1ZSB0aGUgYm1hcGkoKSBjYWxsIHRvIGFsbG9jYXRlIHRoZSBibG9ja3MKKwkgKiBJc3N1ZSB0aGUgeGZzX2JtYXBpKCkgY2FsbCB0byBhbGxvY2F0ZSB0aGUgYmxvY2tzCiAJICovCiAJWEZTX0JNQVBfSU5JVCgmZnJlZV9saXN0LCAmZmlyc3Rmc2IpOwogCW5pbWFwcyA9IDE7CkBAIC00ODQsOCArNTUwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiZXh0ZW50LXN0YXRlIDogJXggXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgKGlwLT5pX21vdW50KS0+bV9mc25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWlwLT5pX2lubywKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldF9pbWFwLT5icl9zdGFydGJsb2NrLCByZXRfaW1hcC0+YnJfc3RhcnRvZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICByZXRfaW1hcC0+YnJfYmxvY2tjb3VudCxyZXRfaW1hcC0+YnJfc3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXRfaW1hcC0+YnJfc3RhcnRibG9jaywKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmV0X2ltYXAtPmJyX3N0YXJ0b2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXRfaW1hcC0+YnJfYmxvY2tjb3VudCwKKwkJCXJldF9pbWFwLT5icl9zdGF0ZSk7CiAgICAgICAgIH0KIAlyZXR1cm4gMDsKIApAQCAtNTAxLDYgKzU2OSw2MyBAQAogCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOwogfQogCisvKgorICogSWYgdGhlIGNhbGxlciBpcyBkb2luZyBhIHdyaXRlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsCisgKiB0aGVuIGV4dGVuZCB0aGUgYWxsb2NhdGlvbiBvdXQgdG8gdGhlIGZpbGUgc3lzdGVtJ3Mgd3JpdGUKKyAqIGlvc2l6ZS4gIFdlIGNsZWFuIHVwIGFueSBleHRyYSBzcGFjZSBsZWZ0IG92ZXIgd2hlbiB0aGUKKyAqIGZpbGUgaXMgY2xvc2VkIGluIHhmc19pbmFjdGl2ZSgpLgorICoKKyAqIEZvciBzeW5jIHdyaXRlcywgd2UgYXJlIGZsdXNoaW5nIGRlbGF5ZWQgYWxsb2NhdGUgc3BhY2UgdG8KKyAqIHRyeSB0byBtYWtlIGFkZGl0aW9uYWwgc3BhY2UgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uIG5lYXIKKyAqIHRoZSBmaWxlc3lzdGVtIGZ1bGwgYm91bmRhcnkgLSBwcmVhbGxvY2F0aW9uIGh1cnRzIGluIHRoYXQKKyAqIHNpdHVhdGlvbiwgb2YgY291cnNlLgorICovCitTVEFUSUMgaW50Cit4ZnNfaW9tYXBfZW9mX3dhbnRfcHJlYWxsb2NhdGUoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19pb2NvcmVfdAkqaW8sCisJeGZzX2ZzaXplX3QJaXNpemUsCisJeGZzX29mZl90CW9mZnNldCwKKwlzaXplX3QJCWNvdW50LAorCWludAkJaW9mbGFnLAorCXhmc19ibWJ0X2lyZWNfdCAqaW1hcCwKKwlpbnQJCW5pbWFwcywKKwlpbnQJCSpwcmVhbGxvYykKK3sKKwl4ZnNfZmlsZW9mZl90ICAgc3RhcnRfZnNiOworCXhmc19maWxibGtzX3QgICBjb3VudF9mc2I7CisJeGZzX2ZzYmxvY2tfdAlmaXJzdGJsb2NrOworCWludAkJbiwgZXJyb3IsIGltYXBzOworCisJKnByZWFsbG9jID0gMDsKKwlpZiAoKGlvZmxhZyAmIEJNQVBJX1NZTkMpIHx8IChvZmZzZXQgKyBjb3VudCkgPD0gaXNpemUpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgYW55IHJlYWwgYmxvY2tzIHBhc3QgZW9mLCB0aGVuIGRvbid0CisJICogZG8gYW55IHNwZWN1bGF0aXZlIGFsbG9jYXRpb24uCisJICovCisJc3RhcnRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgKCh4ZnNfdWZzaXplX3QpKG9mZnNldCArIGNvdW50IC0gMSkpKTsKKwljb3VudF9mc2IgPSBYRlNfQl9UT19GU0IobXAsICh4ZnNfdWZzaXplX3QpWEZTX01BWElPRkZTRVQobXApKTsKKwl3aGlsZSAoY291bnRfZnNiID4gMCkgeworCQlpbWFwcyA9IG5pbWFwczsKKwkJZmlyc3RibG9jayA9IE5VTExGU0JMT0NLOworCQllcnJvciA9IFhGU19CTUFQSShtcCwgTlVMTCwgaW8sIHN0YXJ0X2ZzYiwgY291bnRfZnNiLAorCQkJCSAgMCwgJmZpcnN0YmxvY2ssIDAsIGltYXAsICZpbWFwcywgTlVMTCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwkJZm9yIChuID0gMDsgbiA8IGltYXBzOyBuKyspIHsKKwkJCWlmICgoaW1hcFtuXS5icl9zdGFydGJsb2NrICE9IEhPTEVTVEFSVEJMT0NLKSAmJgorCQkJICAgIChpbWFwW25dLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXN0YXJ0X2ZzYiArPSBpbWFwW25dLmJyX2Jsb2NrY291bnQ7CisJCQljb3VudF9mc2IgLT0gaW1hcFtuXS5icl9ibG9ja2NvdW50OworCQl9CisJfQorCSpwcmVhbGxvYyA9IDE7CisJcmV0dXJuIDA7Cit9CisKIGludAogeGZzX2lvbWFwX3dyaXRlX2RlbGF5KAogCXhmc19pbm9kZV90CSppcCwKQEAgLTUxNCwxMyArNjM5LDE1IEBACiAJeGZzX2lvY29yZV90CSppbyA9ICZpcC0+aV9pb2NvcmU7CiAJeGZzX2ZpbGVvZmZfdAlvZmZzZXRfZnNiOwogCXhmc19maWxlb2ZmX3QJbGFzdF9mc2I7Ci0JeGZzX2ZzaXplX3QJaXNpemU7CisJeGZzX29mZl90CWFsaWduZWRfb2Zmc2V0OworCXhmc19maWxlb2ZmX3QJaW9hbGlnbjsKIAl4ZnNfZnNibG9ja190CWZpcnN0YmxvY2s7CisJeGZzX2V4dGxlbl90CWV4dHN6OworCXhmc19mc2l6ZV90CWlzaXplOwogCWludAkJbmltYXBzOwotCWludAkJZXJyb3I7CiAJeGZzX2JtYnRfaXJlY190IGltYXBbWEZTX1dSSVRFX0lNQVBTXTsKLQlpbnQJCWFlb2Y7Ci0JaW50CQlmc3luY2VkID0gMDsKKwlpbnQJCXByZWFsbG9jLCBmc3luY2VkID0gMDsKKwlpbnQJCWVycm9yOwogCiAJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2xvY2ssIE1SX1VQREFURSkgIT0gMCk7CiAKQEAgLTUyOCwxNTIgKzY1NSw1NyBAQAogCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBkcXVvdHMgYXJlIHRoZXJlLiBUaGlzIGRvZXNuJ3QgaG9sZAogCSAqIHRoZSBpbG9jayBhY3Jvc3MgYSBkaXNrIHJlYWQuCiAJICovCi0KIAllcnJvciA9IFhGU19RTV9EUUFUVEFDSChtcCwgaXAsIFhGU19RTU9QVF9JTE9DS0VEKTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOwogCisJaWYgKFhGU19JU19SRUFMVElNRV9JTk9ERShpcCkpIHsKKwkJaWYgKCEoZXh0c3ogPSBpcC0+aV9kLmRpX2V4dHNpemUpKQorCQkJZXh0c3ogPSBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKKwl9IGVsc2UgeworCQlleHRzeiA9IGlwLT5pX2QuZGlfZXh0c2l6ZTsKKwl9CisKKwlvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKKwogcmV0cnk6CiAJaXNpemUgPSBpcC0+aV9kLmRpX3NpemU7Ci0JaWYgKGlvLT5pb19uZXdfc2l6ZSA+IGlzaXplKSB7CisJaWYgKGlvLT5pb19uZXdfc2l6ZSA+IGlzaXplKQogCQlpc2l6ZSA9IGlvLT5pb19uZXdfc2l6ZTsKLQl9CiAKLQlhZW9mID0gMDsKLQlvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKLQlsYXN0X2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgKCh4ZnNfdWZzaXplX3QpKG9mZnNldCArIGNvdW50KSkpOwotCS8qCi0JICogSWYgdGhlIGNhbGxlciBpcyBkb2luZyBhIHdyaXRlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsCi0JICogdGhlbiBleHRlbmQgdGhlIGFsbG9jYXRpb24gKGFuZCB0aGUgYnVmZmVyIHVzZWQgZm9yIHRoZSB3cml0ZSkKLQkgKiBvdXQgdG8gdGhlIGZpbGUgc3lzdGVtJ3Mgd3JpdGUgaW9zaXplLiAgV2UgY2xlYW4gdXAgYW55IGV4dHJhCi0JICogc3BhY2UgbGVmdCBvdmVyIHdoZW4gdGhlIGZpbGUgaXMgY2xvc2VkIGluIHhmc19pbmFjdGl2ZSgpLgotCSAqCi0JICogRm9yIHN5bmMgd3JpdGVzLCB3ZSBhcmUgZmx1c2hpbmcgZGVsYXllZCBhbGxvY2F0ZSBzcGFjZSB0bwotCSAqIHRyeSB0byBtYWtlIGFkZGl0aW9uYWwgc3BhY2UgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uIG5lYXIKLQkgKiB0aGUgZmlsZXN5c3RlbSBmdWxsIGJvdW5kYXJ5IC0gcHJlYWxsb2NhdGlvbiBodXJ0cyBpbiB0aGF0Ci0JICogc2l0dWF0aW9uLCBvZiBjb3Vyc2UuCi0JICovCi0JaWYgKCEoaW9mbGFnICYgQk1BUElfU1lOQykgJiYgKChvZmZzZXQgKyBjb3VudCkgPiBpcC0+aV9kLmRpX3NpemUpKSB7Ci0JCXhmc19vZmZfdAlhbGlnbmVkX29mZnNldDsKLQkJeGZzX2ZpbGJsa3NfdCAgIGNvdW50X2ZzYjsKLQkJdW5zaWduZWQgaW50CWlvc2l6ZTsKLQkJeGZzX2ZpbGVvZmZfdAlpb2FsaWduOwotCQlpbnQJCW47Ci0JCXhmc19maWxlb2ZmX3QgICBzdGFydF9mc2I7CisJZXJyb3IgPSB4ZnNfaW9tYXBfZW9mX3dhbnRfcHJlYWxsb2NhdGUobXAsIGlvLCBpc2l6ZSwgb2Zmc2V0LCBjb3VudCwKKwkJCQlpb2ZsYWcsIGltYXAsIFhGU19XUklURV9JTUFQUywgJnByZWFsbG9jKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKIAotCQkvKgotCQkgKiBJZiB0aGVyZSBhcmUgYW55IHJlYWwgYmxvY2tzIHBhc3QgZW9mLCB0aGVuIGRvbid0Ci0JCSAqIGRvIGFueSBzcGVjdWxhdGl2ZSBhbGxvY2F0aW9uLgotCQkgKi8KLQkJc3RhcnRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwKLQkJCQkJKCh4ZnNfdWZzaXplX3QpKG9mZnNldCArIGNvdW50IC0gMSkpKTsKLQkJY291bnRfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCAoeGZzX3Vmc2l6ZV90KVhGU19NQVhJT0ZGU0VUKG1wKSk7Ci0JCXdoaWxlIChjb3VudF9mc2IgPiAwKSB7Ci0JCQluaW1hcHMgPSBYRlNfV1JJVEVfSU1BUFM7Ci0JCQllcnJvciA9IFhGU19CTUFQSShtcCwgTlVMTCwgaW8sIHN0YXJ0X2ZzYiwgY291bnRfZnNiLAotCQkJCQkwLCAmZmlyc3RibG9jaywgMCwgaW1hcCwgJm5pbWFwcywgTlVMTCk7Ci0JCQlpZiAoZXJyb3IpIHsKLQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQl9Ci0JCQlmb3IgKG4gPSAwOyBuIDwgbmltYXBzOyBuKyspIHsKLQkJCQlpZiAoICEoaW8tPmlvX2ZsYWdzICYgWEZTX0lPQ09SRV9SVCkgICYmIAotCQkJCQkhaW1hcFtuXS5icl9zdGFydGJsb2NrKSB7Ci0JCQkJCWNtbl9lcnIoQ0VfUEFOSUMsIkFjY2VzcyB0byBibG9jayAiCi0JCQkJCQkiemVybzogIGZzIDwlcz4gaW5vZGU6ICVsbGQgIgotCQkJCQkJInN0YXJ0X2Jsb2NrIDogJWxseCBzdGFydF9vZmYgIgotCQkJCQkJIjogJWxseCBibGtjbnQgOiAlbGx4ICIKLQkJCQkJCSJleHRlbnQtc3RhdGUgOiAleCBcbiIsCi0JCQkJCQkoaXAtPmlfbW91bnQpLT5tX2ZzbmFtZSwKLQkJCQkJCShsb25nIGxvbmcpaXAtPmlfaW5vLAotCQkJCQkJaW1hcFtuXS5icl9zdGFydGJsb2NrLAotCQkJCQkJaW1hcFtuXS5icl9zdGFydG9mZiwKLQkJCQkJCWltYXBbbl0uYnJfYmxvY2tjb3VudCwKLQkJCQkJCWltYXBbbl0uYnJfc3RhdGUpOwotICAgICAgICAJCQl9Ci0JCQkJaWYgKChpbWFwW25dLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0spICYmCi0JCQkJICAgIChpbWFwW25dLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKSkgewotCQkJCQlnb3RvIHdyaXRlX21hcDsKLQkJCQl9Ci0JCQkJc3RhcnRfZnNiICs9IGltYXBbbl0uYnJfYmxvY2tjb3VudDsKLQkJCQljb3VudF9mc2IgLT0gaW1hcFtuXS5icl9ibG9ja2NvdW50OwotCQkJfQotCQl9Ci0JCWlvc2l6ZSA9IG1wLT5tX3dyaXRlaW9fYmxvY2tzOworCWlmIChwcmVhbGxvYykgewogCQlhbGlnbmVkX29mZnNldCA9IFhGU19XUklURUlPX0FMSUdOKG1wLCAob2Zmc2V0ICsgY291bnQgLSAxKSk7CiAJCWlvYWxpZ24gPSBYRlNfQl9UT19GU0JUKG1wLCBhbGlnbmVkX29mZnNldCk7Ci0JCWxhc3RfZnNiID0gaW9hbGlnbiArIGlvc2l6ZTsKLQkJYWVvZiA9IDE7CisJCWxhc3RfZnNiID0gaW9hbGlnbiArIG1wLT5tX3dyaXRlaW9fYmxvY2tzOworCX0gZWxzZSB7CisJCWxhc3RfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCAoKHhmc191ZnNpemVfdCkob2Zmc2V0ICsgY291bnQpKSk7CiAJfQotd3JpdGVfbWFwOgorCisJaWYgKHByZWFsbG9jIHx8IGV4dHN6KSB7CisJCWVycm9yID0geGZzX2lvbWFwX2VvZl9hbGlnbl9sYXN0X2ZzYihtcCwgaW8sIGlzaXplLCBleHRzeiwKKwkJCQkJCQkmbGFzdF9mc2IpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCiAJbmltYXBzID0gWEZTX1dSSVRFX0lNQVBTOwogCWZpcnN0YmxvY2sgPSBOVUxMRlNCTE9DSzsKLQotCS8qCi0JICogSWYgbW91bnRlZCB3aXRoIHRoZSAiLW8gc3dhbGxvYyIgb3B0aW9uLCByb3VuZHVwIHRoZSBhbGxvY2F0aW9uCi0JICogcmVxdWVzdCB0byBhIHN0cmlwZSB3aWR0aCBib3VuZGFyeSBpZiB0aGUgZmlsZSBzaXplIGlzID49Ci0JICogc3RyaXBlIHdpZHRoIGFuZCB3ZSBhcmUgYWxsb2NhdGluZyBwYXN0IHRoZSBhbGxvY2F0aW9uIGVvZi4KLQkgKi8KLQlpZiAoIShpby0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUKSAmJiBtcC0+bV9zd2lkdGggCi0JICAgICYmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9TV0FMTE9DKQotCSAgICAmJiAoaXNpemUgPj0gWEZTX0ZTQl9UT19CKG1wLCBtcC0+bV9zd2lkdGgpKSAmJiBhZW9mKSB7Ci0JCWludCBlb2Y7Ci0JCXhmc19maWxlb2ZmX3QgbmV3X2xhc3RfZnNiOwotCi0JCW5ld19sYXN0X2ZzYiA9IHJvdW5kdXBfNjQobGFzdF9mc2IsIG1wLT5tX3N3aWR0aCk7Ci0JCWVycm9yID0geGZzX2JtYXBfZW9mKGlwLCBuZXdfbGFzdF9mc2IsIFhGU19EQVRBX0ZPUkssICZlb2YpOwotCQlpZiAoZXJyb3IpIHsKLQkJCXJldHVybiBlcnJvcjsKLQkJfQotCQlpZiAoZW9mKSB7Ci0JCQlsYXN0X2ZzYiA9IG5ld19sYXN0X2ZzYjsKLQkJfQotCS8qCi0JICogUm91bmR1cCB0aGUgYWxsb2NhdGlvbiByZXF1ZXN0IHRvIGEgc3RyaXBlIHVuaXQgKG1fZGFsaWduKSBib3VuZGFyeQotCSAqIGlmIHRoZSBmaWxlIHNpemUgaXMgPj0gc3RyaXBlIHVuaXQgc2l6ZSwgYW5kIHdlIGFyZSBhbGxvY2F0aW5nIHBhc3QKLQkgKiB0aGUgYWxsb2NhdGlvbiBlb2YuCi0JICovCi0JfSBlbHNlIGlmICghKGlvLT5pb19mbGFncyAmIFhGU19JT0NPUkVfUlQpICYmIG1wLT5tX2RhbGlnbiAmJgotCQkgICAoaXNpemUgPj0gWEZTX0ZTQl9UT19CKG1wLCBtcC0+bV9kYWxpZ24pKSAmJiBhZW9mKSB7Ci0JCWludCBlb2Y7Ci0JCXhmc19maWxlb2ZmX3QgbmV3X2xhc3RfZnNiOwotCQluZXdfbGFzdF9mc2IgPSByb3VuZHVwXzY0KGxhc3RfZnNiLCBtcC0+bV9kYWxpZ24pOwotCQllcnJvciA9IHhmc19ibWFwX2VvZihpcCwgbmV3X2xhc3RfZnNiLCBYRlNfREFUQV9GT1JLLCAmZW9mKTsKLQkJaWYgKGVycm9yKSB7Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLQkJaWYgKGVvZikgewotCQkJbGFzdF9mc2IgPSBuZXdfbGFzdF9mc2I7Ci0JCX0KLQkvKgotCSAqIFJvdW5kIHVwIHRoZSBhbGxvY2F0aW9uIHJlcXVlc3QgdG8gYSByZWFsLXRpbWUgZXh0ZW50IGJvdW5kYXJ5Ci0JICogaWYgdGhlIGZpbGUgaXMgb24gdGhlIHJlYWwtdGltZSBzdWJ2b2x1bWUuCi0JICovCi0JfSBlbHNlIGlmIChpby0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUICYmIGFlb2YpIHsKLQkJaW50IGVvZjsKLQkJeGZzX2ZpbGVvZmZfdCBuZXdfbGFzdF9mc2I7Ci0KLQkJbmV3X2xhc3RfZnNiID0gcm91bmR1cF82NChsYXN0X2ZzYiwgbXAtPm1fc2Iuc2JfcmV4dHNpemUpOwotCQllcnJvciA9IFhGU19CTUFQX0VPRihtcCwgaW8sIG5ld19sYXN0X2ZzYiwgWEZTX0RBVEFfRk9SSywgJmVvZik7Ci0JCWlmIChlcnJvcikgewotCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0JCWlmIChlb2YpCi0JCQlsYXN0X2ZzYiA9IG5ld19sYXN0X2ZzYjsKLQl9CiAJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIG9mZnNldF9mc2IsCiAJCQkgICh4ZnNfZmlsYmxrc190KShsYXN0X2ZzYiAtIG9mZnNldF9mc2IpLAogCQkJICBYRlNfQk1BUElfREVMQVkgfCBYRlNfQk1BUElfV1JJVEUgfAogCQkJICBYRlNfQk1BUElfRU5USVJFLCAmZmlyc3RibG9jaywgMSwgaW1hcCwKIAkJCSAgJm5pbWFwcywgTlVMTCk7Ci0JLyoKLQkgKiBUaGlzIGNhbiBiZSBFRFFVT1QsIGlmIG5pbWFwcyA9PSAwCi0JICovCi0JaWYgKGVycm9yICYmIChlcnJvciAhPSBFTk9TUEMpKSB7CisJaWYgKGVycm9yICYmIChlcnJvciAhPSBFTk9TUEMpKQogCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKLQl9CisKIAkvKgogCSAqIElmIGJtYXBpIHJldHVybmVkIHVzIG5vdGhpbmcsIGFuZCBpZiB3ZSBkaWRuJ3QgZ2V0IGJhY2sgRURRVU9ULAotCSAqIHRoZW4gd2UgbXVzdCBoYXZlIHJ1biBvdXQgb2Ygc3BhY2UuCisJICogdGhlbiB3ZSBtdXN0IGhhdmUgcnVuIG91dCBvZiBzcGFjZSAtIGZsdXNoIGRlbGFsbG9jLCBhbmQgcmV0cnkuLgogCSAqLwogCWlmIChuaW1hcHMgPT0gMCkgewogCQl4ZnNfaW9tYXBfZW50ZXJfdHJhY2UoWEZTX0lPTUFQX1dSSVRFX05PU1BBQ0UsCkBAIC02ODUsMTcgKzcxNywyMSBAQAogCQlnb3RvIHJldHJ5OwogCX0KIAotCSpyZXRfaW1hcCA9IGltYXBbMF07Ci0JKm5tYXBzID0gMTsKLQlpZiAoICEoaW8tPmlvX2ZsYWdzICYgWEZTX0lPQ09SRV9SVCkgICYmICFyZXRfaW1hcC0+YnJfc3RhcnRibG9jaykgeworCWlmICghKGlvLT5pb19mbGFncyAmIFhGU19JT0NPUkVfUlQpICAmJiAhcmV0X2ltYXAtPmJyX3N0YXJ0YmxvY2spIHsKIAkJY21uX2VycihDRV9QQU5JQywiQWNjZXNzIHRvIGJsb2NrIHplcm86ICBmcyA8JXM+IGlub2RlOiAlbGxkICIKICAgICAgICAgICAgICAgICAgICAgICAgICJzdGFydF9ibG9jayA6ICVsbHggc3RhcnRfb2ZmIDogJWxseCBibGtjbnQgOiAlbGx4ICIKICAgICAgICAgICAgICAgICAgICAgICAgICJleHRlbnQtc3RhdGUgOiAleCBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAoaXAtPmlfbW91bnQpLT5tX2ZzbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpaXAtPmlfaW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0X2ltYXAtPmJyX3N0YXJ0YmxvY2ssIHJldF9pbWFwLT5icl9zdGFydG9mZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldF9pbWFwLT5icl9ibG9ja2NvdW50LHJldF9pbWFwLT5icl9zdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXJldF9pbWFwLT5icl9zdGFydGJsb2NrLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZXRfaW1hcC0+YnJfc3RhcnRvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXJldF9pbWFwLT5icl9ibG9ja2NvdW50LAorCQkJcmV0X2ltYXAtPmJyX3N0YXRlKTsKIAl9CisKKwkqcmV0X2ltYXAgPSBpbWFwWzBdOworCSpubWFwcyA9IDE7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtODIxLDE3ICs4NTcsMjEgQEAKIAkJICovCiAKIAkJZm9yIChpID0gMDsgaSA8IG5pbWFwczsgaSsrKSB7Ci0JCQlpZiAoICEoaW8tPmlvX2ZsYWdzICYgWEZTX0lPQ09SRV9SVCkgICYmIAotCQkJCSFpbWFwW2ldLmJyX3N0YXJ0YmxvY2spIHsKKwkJCWlmICghKGlvLT5pb19mbGFncyAmIFhGU19JT0NPUkVfUlQpICAmJgorCQkJICAgICFpbWFwW2ldLmJyX3N0YXJ0YmxvY2spIHsKIAkJCQljbW5fZXJyKENFX1BBTklDLCJBY2Nlc3MgdG8gYmxvY2sgemVybzogICIKIAkJCQkJImZzIDwlcz4gaW5vZGU6ICVsbGQgIgotCQkJCQkic3RhcnRfYmxvY2sgOiAlbGx4IHN0YXJ0X29mZiA6ICVsbHggIiAKKwkJCQkJInN0YXJ0X2Jsb2NrIDogJWxseCBzdGFydF9vZmYgOiAlbGx4ICIKIAkJCQkJImJsa2NudCA6ICVsbHggZXh0ZW50LXN0YXRlIDogJXggXG4iLAogCQkJCQkoaXAtPmlfbW91bnQpLT5tX2ZzbmFtZSwKIAkJCQkJKGxvbmcgbG9uZylpcC0+aV9pbm8sCi0JCQkJCWltYXBbaV0uYnJfc3RhcnRibG9jaywKLQkJCQkJaW1hcFtpXS5icl9zdGFydG9mZiwKLQkJCQkgICAgICAgIGltYXBbaV0uYnJfYmxvY2tjb3VudCxpbWFwW2ldLmJyX3N0YXRlKTsKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCWltYXBbaV0uYnJfc3RhcnRibG9jaywKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCWltYXBbaV0uYnJfc3RhcnRvZmYsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkJICAgICAgICAJaW1hcFtpXS5icl9ibG9ja2NvdW50LAorCQkJCQlpbWFwW2ldLmJyX3N0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAkJCWlmICgob2Zmc2V0X2ZzYiA+PSBpbWFwW2ldLmJyX3N0YXJ0b2ZmKSAmJgogCQkJICAgIChvZmZzZXRfZnNiIDwgKGltYXBbaV0uYnJfc3RhcnRvZmYgKwpAQCAtODY4LDE3ICs5MDgsMTcgQEAKIHsKIAl4ZnNfbW91bnRfdAkqbXAgPSBpcC0+aV9tb3VudDsKIAl4ZnNfaW9jb3JlX3QgICAgKmlvID0gJmlwLT5pX2lvY29yZTsKLQl4ZnNfdHJhbnNfdAkqdHA7CiAJeGZzX2ZpbGVvZmZfdAlvZmZzZXRfZnNiOwogCXhmc19maWxibGtzX3QJY291bnRfZnNiOwogCXhmc19maWxibGtzX3QJbnVtYmxrc19mc2I7Ci0JeGZzX2JtYnRfaXJlY190CWltYXA7CisJeGZzX2ZzYmxvY2tfdAlmaXJzdGZzYjsKKwlpbnQJCW5pbWFwczsKKwl4ZnNfdHJhbnNfdAkqdHA7CisJeGZzX2JtYnRfaXJlY190IGltYXA7CisJeGZzX2JtYXBfZnJlZV90IGZyZWVfbGlzdDsKKwl1aW50CQlyZXNibGtzOwogCWludAkJY29tbWl0dGVkOwogCWludAkJZXJyb3I7Ci0JaW50CQlucmVzOwotCWludAkJbmltYXBzOwotCXhmc19mc2Jsb2NrX3QJZmlyc3Rmc2I7Ci0JeGZzX2JtYXBfZnJlZV90CWZyZWVfbGlzdDsKIAogCXhmc19pb21hcF9lbnRlcl90cmFjZShYRlNfSU9NQVBfVU5XUklUVEVOLAogCQkJCSZpcC0+aV9pb2NvcmUsIG9mZnNldCwgY291bnQpOwpAQCAtODg3LDkgKzkyNyw5IEBACiAJY291bnRfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCAoeGZzX3Vmc2l6ZV90KW9mZnNldCArIGNvdW50KTsKIAljb3VudF9mc2IgPSAoeGZzX2ZpbGJsa3NfdCkoY291bnRfZnNiIC0gb2Zmc2V0X2ZzYik7CiAKLQlkbyB7Ci0JCW5yZXMgPSBYRlNfRElPU1RSQVRfU1BBQ0VfUkVTKG1wLCAwKTsKKwlyZXNibGtzID0gWEZTX0RJT1NUUkFUX1NQQUNFX1JFUyhtcCwgMCkgPDwgMTsKIAorCWRvIHsKIAkJLyoKIAkJICogc2V0IHVwIGEgdHJhbnNhY3Rpb24gdG8gY29udmVydCB0aGUgcmFuZ2Ugb2YgZXh0ZW50cwogCQkgKiBmcm9tIHVud3JpdHRlbiB0byByZWFsLiBEbyBhbGxvY2F0aW9ucyBpbiBhIGxvb3AgdW50aWwKQEAgLTg5Nyw3ICs5MzcsNyBAQAogCQkgKi8KIAogCQl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX1NUUkFUX1dSSVRFKTsKLQkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgbnJlcywKKwkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgcmVzYmxrcywKIAkJCQlYRlNfV1JJVEVfTE9HX1JFUyhtcCksIDAsCiAJCQkJWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKIAkJCQlYRlNfV1JJVEVfTE9HX0NPVU5UKTsKQEAgLTkxNiw3ICs5NTYsNyBAQAogCQlYRlNfQk1BUF9JTklUKCZmcmVlX2xpc3QsICZmaXJzdGZzYik7CiAJCW5pbWFwcyA9IDE7CiAJCWVycm9yID0geGZzX2JtYXBpKHRwLCBpcCwgb2Zmc2V0X2ZzYiwgY291bnRfZnNiLAotCQkJCSAgWEZTX0JNQVBJX1dSSVRFLCAmZmlyc3Rmc2IsCisJCQkJICBYRlNfQk1BUElfV1JJVEV8WEZTX0JNQVBJX0NPTlZFUlQsICZmaXJzdGZzYiwKIAkJCQkgIDEsICZpbWFwLCAmbmltYXBzLCAmZnJlZV9saXN0KTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBlcnJvcl9vbl9ibWFwaV90cmFuc2FjdGlvbjsKQEAgLTkzMCwxNSArOTcwLDE3IEBACiAJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gZXJyb3IwOwotCQkKKwogCQlpZiAoICEoaW8tPmlvX2ZsYWdzICYgWEZTX0lPQ09SRV9SVCkgICYmICFpbWFwLmJyX3N0YXJ0YmxvY2spIHsKIAkJCWNtbl9lcnIoQ0VfUEFOSUMsIkFjY2VzcyB0byBibG9jayB6ZXJvOiAgZnMgPCVzPiAiCiAJCQkJImlub2RlOiAlbGxkIHN0YXJ0X2Jsb2NrIDogJWxseCBzdGFydF9vZmYgOiAiCiAJCQkJIiVsbHggYmxrY250IDogJWxseCBleHRlbnQtc3RhdGUgOiAleCBcbiIsCiAJCQkJKGlwLT5pX21vdW50KS0+bV9mc25hbWUsCiAJCQkJKGxvbmcgbG9uZylpcC0+aV9pbm8sCi0JCQkJaW1hcC5icl9zdGFydGJsb2NrLGltYXAuYnJfc3RhcnRvZmYsCi0JCQkJaW1hcC5icl9ibG9ja2NvdW50LGltYXAuYnJfc3RhdGUpOworCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaW1hcC5icl9zdGFydGJsb2NrLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaW1hcC5icl9zdGFydG9mZiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWltYXAuYnJfYmxvY2tjb3VudCwKKwkJCQlpbWFwLmJyX3N0YXRlKTsKICAgICAgICAgCX0KIAogCQlpZiAoKG51bWJsa3NfZnNiID0gaW1hcC5icl9ibG9ja2NvdW50KSA9PSAwKSB7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2l0YWJsZS5jIGIvZnMveGZzL3hmc19pdGFibGUuYwppbmRleCBmNjM2NDZlLi5jNTk0NTBlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2l0YWJsZS5jCisrKyBiL2ZzL3hmcy94ZnNfaXRhYmxlLmMKQEAgLTU2LDYgKzU2LDcgQEAKIHsKIAl4ZnNfZGlub2RlX2NvcmVfdCAqZGljOwkJLyogZGlub2RlIGNvcmUgaW5mbyBwb2ludGVyICovCiAJeGZzX2lub2RlX3QJKmlwOwkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl2bm9kZV90CQkqdnA7CiAJaW50CQllcnJvcjsKIAogCWVycm9yID0geGZzX2lnZXQobXAsIE5VTEwsIGlubywgMCwgWEZTX0lMT0NLX1NIQVJFRCwgJmlwLCBibm8pOwpAQCAtNzIsNiArNzMsNyBAQAogCQlnb3RvIG91dF9pcHV0OwogCX0KIAorCXZwID0gWEZTX0lUT1YoaXApOwogCWRpYyA9ICZpcC0+aV9kOwogCiAJLyogeGZzX2lnZXQgcmV0dXJucyB0aGUgZm9sbG93aW5nIHdpdGhvdXQgbmVlZGluZwpAQCAtODQsOCArODYsNyBAQAogCWJ1Zi0+YnNfdWlkID0gZGljLT5kaV91aWQ7CiAJYnVmLT5ic19naWQgPSBkaWMtPmRpX2dpZDsKIAlidWYtPmJzX3NpemUgPSBkaWMtPmRpX3NpemU7Ci0JYnVmLT5ic19hdGltZS50dl9zZWMgPSBkaWMtPmRpX2F0aW1lLnRfc2VjOwotCWJ1Zi0+YnNfYXRpbWUudHZfbnNlYyA9IGRpYy0+ZGlfYXRpbWUudF9uc2VjOworCXZuX2F0aW1lX3RvX2JzdGltZSh2cCwgJmJ1Zi0+YnNfYXRpbWUpOwogCWJ1Zi0+YnNfbXRpbWUudHZfc2VjID0gZGljLT5kaV9tdGltZS50X3NlYzsKIAlidWYtPmJzX210aW1lLnR2X25zZWMgPSBkaWMtPmRpX210aW1lLnRfbnNlYzsKIAlidWYtPmJzX2N0aW1lLnR2X3NlYyA9IGRpYy0+ZGlfY3RpbWUudF9zZWM7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZy5jIGIvZnMveGZzL3hmc19sb2cuYwppbmRleCAyOWFmNTEyLi45MTc2OTk1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZy5jCisrKyBiL2ZzL3hmcy94ZnNfbG9nLmMKQEAgLTE3OCw2ICsxNzgsODMgQEAKICNkZWZpbmUJeGxvZ190cmFjZV9pY2xvZyhpY2xvZyxzdGF0ZSkKICNlbmRpZiAvKiBYRlNfTE9HX1RSQUNFICovCiAKKworc3RhdGljIHZvaWQKK3hsb2dfaW5zX3RpY2tldHEoc3RydWN0IHhsb2dfdGlja2V0ICoqcXAsIHN0cnVjdCB4bG9nX3RpY2tldCAqdGljKQoreworCWlmICgqcXApIHsKKwkJdGljLT50X25leHQJICAgID0gKCpxcCk7CisJCXRpYy0+dF9wcmV2CSAgICA9ICgqcXApLT50X3ByZXY7CisJCSgqcXApLT50X3ByZXYtPnRfbmV4dCA9IHRpYzsKKwkJKCpxcCktPnRfcHJldgkgICAgPSB0aWM7CisJfSBlbHNlIHsKKwkJdGljLT50X3ByZXYgPSB0aWMtPnRfbmV4dCA9IHRpYzsKKwkJKnFwID0gdGljOworCX0KKworCXRpYy0+dF9mbGFncyB8PSBYTE9HX1RJQ19JTl9ROworfQorCitzdGF0aWMgdm9pZAoreGxvZ19kZWxfdGlja2V0cShzdHJ1Y3QgeGxvZ190aWNrZXQgKipxcCwgc3RydWN0IHhsb2dfdGlja2V0ICp0aWMpCit7CisJaWYgKHRpYyA9PSB0aWMtPnRfbmV4dCkgeworCQkqcXAgPSBOVUxMOworCX0gZWxzZSB7CisJCSpxcCA9IHRpYy0+dF9uZXh0OworCQl0aWMtPnRfbmV4dC0+dF9wcmV2ID0gdGljLT50X3ByZXY7CisJCXRpYy0+dF9wcmV2LT50X25leHQgPSB0aWMtPnRfbmV4dDsKKwl9CisKKwl0aWMtPnRfbmV4dCA9IHRpYy0+dF9wcmV2ID0gTlVMTDsKKwl0aWMtPnRfZmxhZ3MgJj0gflhMT0dfVElDX0lOX1E7Cit9CisKK3N0YXRpYyB2b2lkCit4bG9nX2dyYW50X3N1Yl9zcGFjZShzdHJ1Y3QgbG9nICpsb2csIGludCBieXRlcykKK3sKKwlsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgLT0gYnl0ZXM7CisJaWYgKGxvZy0+bF9ncmFudF93cml0ZV9ieXRlcyA8IDApIHsKKwkJbG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzICs9IGxvZy0+bF9sb2dzaXplOworCQlsb2ctPmxfZ3JhbnRfd3JpdGVfY3ljbGUtLTsKKwl9CisKKwlsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyAtPSBieXRlczsKKwlpZiAoKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyA8IDApIHsKKwkJbG9nLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMgKz0gbG9nLT5sX2xvZ3NpemU7CisJCWxvZy0+bF9ncmFudF9yZXNlcnZlX2N5Y2xlLS07CisJfQorCit9CisKK3N0YXRpYyB2b2lkCit4bG9nX2dyYW50X2FkZF9zcGFjZV93cml0ZShzdHJ1Y3QgbG9nICpsb2csIGludCBieXRlcykKK3sKKwlsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgKz0gYnl0ZXM7CisJaWYgKGxvZy0+bF9ncmFudF93cml0ZV9ieXRlcyA+IGxvZy0+bF9sb2dzaXplKSB7CisJCWxvZy0+bF9ncmFudF93cml0ZV9ieXRlcyAtPSBsb2ctPmxfbG9nc2l6ZTsKKwkJbG9nLT5sX2dyYW50X3dyaXRlX2N5Y2xlKys7CisJfQorfQorCitzdGF0aWMgdm9pZAoreGxvZ19ncmFudF9hZGRfc3BhY2VfcmVzZXJ2ZShzdHJ1Y3QgbG9nICpsb2csIGludCBieXRlcykKK3sKKwlsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyArPSBieXRlczsKKwlpZiAobG9nLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMgPiBsb2ctPmxfbG9nc2l6ZSkgeworCQlsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyAtPSBsb2ctPmxfbG9nc2l6ZTsKKwkJbG9nLT5sX2dyYW50X3Jlc2VydmVfY3ljbGUrKzsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoreGxvZ19ncmFudF9hZGRfc3BhY2Uoc3RydWN0IGxvZyAqbG9nLCBpbnQgYnl0ZXMpCit7CisJeGxvZ19ncmFudF9hZGRfc3BhY2Vfd3JpdGUobG9nLCBieXRlcyk7CisJeGxvZ19ncmFudF9hZGRfc3BhY2VfcmVzZXJ2ZShsb2csIGJ5dGVzKTsKK30KKworCiAvKgogICogTk9URVM6CiAgKgpAQCAtMzI2LDcgKzQwMyw3IEBACiAKIAlpZiAoeGxvZ19zdGF0ZV9yZWxlYXNlX2ljbG9nKGxvZywgaWNsb2cpKSB7CiAJCXhmc19mb3JjZV9zaHV0ZG93bihtcCwgWEZTX0xPR19JT19FUlJPUik7Ci0JCXJldHVybihFSU8pOworCQlyZXR1cm4gRUlPOwogCX0KIAogCXJldHVybiAwOwpAQCAtNDI4LDcgKzUwNSw3IEBACiAJCWlmIChyZWFkb25seSkKIAkJCXZmc3AtPnZmc19mbGFnICY9IH5WRlNfUkRPTkxZOwogCi0JCWVycm9yID0geGxvZ19yZWNvdmVyKG1wLT5tX2xvZywgcmVhZG9ubHkpOworCQllcnJvciA9IHhsb2dfcmVjb3ZlcihtcC0+bV9sb2cpOwogCiAJCWlmIChyZWFkb25seSkKIAkJCXZmc3AtPnZmc19mbGFnIHw9IFZGU19SRE9OTFk7CkBAIC00NzksNyArNTU2LDcgQEAKIAogCWVycm9yID0geGZzX2xvZ191bm1vdW50X3dyaXRlKG1wKTsKIAl4ZnNfbG9nX3VubW91bnRfZGVhbGxvYyhtcCk7Ci0JcmV0dXJuIChlcnJvcik7CisJcmV0dXJuIGVycm9yOwogfQogCiAvKgpAQCAtNjUxLDcgKzcyOCw3IEBACiAJaWYgKChlcnJvciA9IHhsb2dfd3JpdGUobXAsIHJlZywgbmVudHJpZXMsIHRpYywgc3RhcnRfbHNuLCBOVUxMLCAwKSkpIHsKIAkJeGZzX2ZvcmNlX3NodXRkb3duKG1wLCBYRlNfTE9HX0lPX0VSUk9SKTsKIAl9Ci0JcmV0dXJuIChlcnJvcik7CisJcmV0dXJuIGVycm9yOwogfQkvKiB4ZnNfbG9nX3dyaXRlICovCiAKIApAQCAtNzU5LDcgKzgzNiw3IEBACiAJCW5lZWRlZCA9IDE7CiAJfQogCUxPR19VTkxPQ0sobG9nLCBzKTsKLQlyZXR1cm4obmVlZGVkKTsKKwlyZXR1cm4gbmVlZGVkOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC05MjYsNyArMTAwMyw3IEBACiAJWEZTX0JVRl9FUlJPUihicCwgRUlPKTsKIAlYRlNfQlVGX1NUQUxFKGJwKTsKIAl4ZnNfYmlvZG9uZShicCk7Ci0JcmV0dXJuIChYRlNfRVJST1IoRUlPKSk7CisJcmV0dXJuIFhGU19FUlJPUihFSU8pOwogCiAKIH0KQEAgLTExODYsNyArMTI2Myw3IEBACiAJCQkgICAgICAgaWNsb2csIFhMT0dfQ09NTUlUX1RSQU5TKSkpIHsKIAkJeGZzX2ZvcmNlX3NodXRkb3duKG1wLCBYRlNfTE9HX0lPX0VSUk9SKTsKIAl9Ci0JcmV0dXJuIChlcnJvcik7CisJcmV0dXJuIGVycm9yOwogfQkvKiB4bG9nX2NvbW1pdF9yZWNvcmQgKi8KIAogCkBAIC0xMzIwLDggKzEzOTcsNyBAQAogCiAJLyogbW92ZSBncmFudCBoZWFkcyBieSByb3VuZG9mZiBpbiBzeW5jICovCiAJcyA9IEdSQU5UX0xPQ0sobG9nKTsKLQlYTE9HX0dSQU5UX0FERF9TUEFDRShsb2csIHJvdW5kb2ZmLCAndycpOwotCVhMT0dfR1JBTlRfQUREX1NQQUNFKGxvZywgcm91bmRvZmYsICdyJyk7CisJeGxvZ19ncmFudF9hZGRfc3BhY2UobG9nLCByb3VuZG9mZik7CiAJR1JBTlRfVU5MT0NLKGxvZywgcyk7CiAKIAkvKiBwdXQgY3ljbGUgbnVtYmVyIGluIGV2ZXJ5IGJsb2NrICovCkBAIC0xMzg0LDcgKzE0NjAsNyBAQAogCWlmICgoZXJyb3IgPSBYRlNfYndyaXRlKGJwKSkpIHsKIAkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfc3luYyIsIGxvZy0+bF9tcCwgYnAsCiAJCQkJICBYRlNfQlVGX0FERFIoYnApKTsKLQkJcmV0dXJuIChlcnJvcik7CisJCXJldHVybiBlcnJvcjsKIAl9CiAJaWYgKHNwbGl0KSB7CiAJCWJwCQk9IGljbG9nLT5pY19sb2ctPmxfeGJ1ZjsKQEAgLTE0MjIsMTAgKzE0OTgsMTAgQEAKIAkJaWYgKChlcnJvciA9IFhGU19id3JpdGUoYnApKSkgewogCQkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfc3luYyAoc3BsaXQpIiwgbG9nLT5sX21wLAogCQkJCQkgIGJwLCBYRlNfQlVGX0FERFIoYnApKTsKLQkJCXJldHVybiAoZXJyb3IpOworCQkJcmV0dXJuIGVycm9yOwogCQl9CiAJfQotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CS8qIHhsb2dfc3luYyAqLwogCiAKQEAgLTE1MTUsNyArMTU5MSw2IEBACiAgKiBwcmludCBvdXQgaW5mbyByZWxhdGluZyB0byByZWdpb25zIHdyaXR0ZW4gd2hpY2ggY29uc3VtZQogICogdGhlIHJlc2VydmF0aW9uCiAgKi8KLSNpZiBkZWZpbmVkKFhGU19MT0dfUkVTX0RFQlVHKQogU1RBVElDIHZvaWQKIHhsb2dfcHJpbnRfdGljX3Jlcyh4ZnNfbW91bnRfdCAqbXAsIHhsb2dfdGlja2V0X3QgKnRpY2tldCkKIHsKQEAgLTE2MDUsMTEgKzE2ODAsMTEgQEAKIAkJCXRpY2tldC0+dF9yZXNfYXJyX3N1bSwgdGlja2V0LT50X3Jlc19vX2Zsb3csCiAJCQl0aWNrZXQtPnRfcmVzX251bV9vcGhkcnMsIG9waGRyX3NwYywKIAkJCXRpY2tldC0+dF9yZXNfYXJyX3N1bSArIAotCQkJICB0aWNrZXQtPnRfcmVzX29fZmxvdyArIG9waGRyX3NwYywKKwkJCXRpY2tldC0+dF9yZXNfb19mbG93ICsgb3BoZHJfc3BjLAogCQkJdGlja2V0LT50X3Jlc19udW0pOwogCiAJZm9yIChpID0gMDsgaSA8IHRpY2tldC0+dF9yZXNfbnVtOyBpKyspIHsKLQkgICAJdWludCByX3R5cGUgPSB0aWNrZXQtPnRfcmVzX2FycltpXS5yX3R5cGU7IAorCQl1aW50IHJfdHlwZSA9IHRpY2tldC0+dF9yZXNfYXJyW2ldLnJfdHlwZTsgCiAJCWNtbl9lcnIoQ0VfV0FSTiwKIAkJCSAgICAicmVnaW9uWyV1XTogJXMgLSAldSBieXRlc1xuIiwKIAkJCSAgICBpLCAKQEAgLTE2MTgsOSArMTY5Myw2IEBACiAJCQkgICAgdGlja2V0LT50X3Jlc19hcnJbaV0ucl9sZW4pOwogCX0KIH0KLSNlbHNlCi0jZGVmaW5lIHhsb2dfcHJpbnRfdGljX3JlcyhtcCwgdGlja2V0KQotI2VuZGlmCiAKIC8qCiAgKiBXcml0ZSBzb21lIHJlZ2lvbiBvdXQgdG8gaW4tY29yZSBsb2cKQEAgLTE3MjYsNyArMTc5OCw3IEBACiAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbmVudHJpZXM7ICkgewogCWlmICgoZXJyb3IgPSB4bG9nX3N0YXRlX2dldF9pY2xvZ19zcGFjZShsb2csIGxlbiwgJmljbG9nLCB0aWNrZXQsCiAJCQkJCSAgICAgICAmY29udHdyLCAmbG9nX29mZnNldCkpKQotCQlyZXR1cm4gKGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOwogCiAJQVNTRVJUKGxvZ19vZmZzZXQgPD0gaWNsb2ctPmljX3NpemUgLSAxKTsKIAlwdHIgPSAoX19wc2ludF90KSAoKGNoYXIgKilpY2xvZy0+aWNfZGF0YXArbG9nX29mZnNldCk7CkBAIC0xODMxLDcgKzE5MDMsNyBAQAogCQkgICAgeGxvZ19zdGF0ZV9maW5pc2hfY29weShsb2csIGljbG9nLCByZWNvcmRfY250LCBkYXRhX2NudCk7CiAJCSAgICByZWNvcmRfY250ID0gZGF0YV9jbnQgPSAwOwogCQkgICAgaWYgKChlcnJvciA9IHhsb2dfc3RhdGVfcmVsZWFzZV9pY2xvZyhsb2csIGljbG9nKSkpCi0JCQkgICAgcmV0dXJuIChlcnJvcik7CisJCQkgICAgcmV0dXJuIGVycm9yOwogCQkgICAgYnJlYWs7CQkJLyogZG9uJ3QgaW5jcmVtZW50IGluZGV4ICovCiAJICAgIH0gZWxzZSB7CQkJCS8qIGNvcGllZCBlbnRpcmUgcmVnaW9uICovCiAJCWluZGV4Kys7CkBAIC0xODQ1LDcgKzE5MTcsNyBAQAogCQkJQVNTRVJUKGZsYWdzICYgWExPR19DT01NSVRfVFJBTlMpOwogCQkJKmNvbW1pdF9pY2xvZyA9IGljbG9nOwogCQkgICAgfSBlbHNlIGlmICgoZXJyb3IgPSB4bG9nX3N0YXRlX3JlbGVhc2VfaWNsb2cobG9nLCBpY2xvZykpKQotCQkJICAgcmV0dXJuIChlcnJvcik7CisJCQkgICByZXR1cm4gZXJyb3I7CiAJCSAgICBpZiAoaW5kZXggPT0gbmVudHJpZXMpCiAJCQkgICAgcmV0dXJuIDA7CQkvKiB3ZSBhcmUgZG9uZSAqLwogCQkgICAgZWxzZQpAQCAtMTg2Miw3ICsxOTM0LDcgQEAKIAkqY29tbWl0X2ljbG9nID0gaWNsb2c7CiAJcmV0dXJuIDA7CiAgICAgfQotICAgIHJldHVybiAoeGxvZ19zdGF0ZV9yZWxlYXNlX2ljbG9nKGxvZywgaWNsb2cpKTsKKyAgICByZXR1cm4geGxvZ19zdGF0ZV9yZWxlYXNlX2ljbG9nKGxvZywgaWNsb2cpOwogfQkvKiB4bG9nX3dyaXRlICovCiAKIApAQCAtMTk3OCw3ICsyMDUwLDcgQEAKIAkgICAgfQogCSAgICBsc25fbG9nID0gbHNuX2xvZy0+aWNfbmV4dDsKIAl9IHdoaWxlIChsc25fbG9nICE9IGxvZy0+bF9pY2xvZyk7Ci0JcmV0dXJuKGxvd2VzdF9sc24pOworCXJldHVybiBsb3dlc3RfbHNuOwogfQogCiAKQEAgLTIzMzAsNyArMjQwMiw3IEBACiAJCWlmIChpY2xvZy0+aWNfcmVmY250ID09IDEpIHsKIAkJCUxPR19VTkxPQ0sobG9nLCBzKTsKIAkJCWlmICgoZXJyb3IgPSB4bG9nX3N0YXRlX3JlbGVhc2VfaWNsb2cobG9nLCBpY2xvZykpKQotCQkJCXJldHVybiAoZXJyb3IpOworCQkJCXJldHVybiBlcnJvcjsKIAkJfSBlbHNlIHsKIAkJCWljbG9nLT5pY19yZWZjbnQtLTsKIAkJCUxPR19VTkxPQ0sobG9nLCBzKTsKQEAgLTIzODksNyArMjQ2MSw3IEBACiAKIAkvKiBzb21ldGhpbmcgaXMgYWxyZWFkeSBzbGVlcGluZzsgaW5zZXJ0IG5ldyB0cmFuc2FjdGlvbiBhdCBlbmQgKi8KIAlpZiAobG9nLT5sX3Jlc2VydmVfaGVhZHEpIHsKLQkJWExPR19JTlNfVElDS0VUUShsb2ctPmxfcmVzZXJ2ZV9oZWFkcSwgdGljKTsKKwkJeGxvZ19pbnNfdGlja2V0cSgmbG9nLT5sX3Jlc2VydmVfaGVhZHEsIHRpYyk7CiAJCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWMsCiAJCQkJICAgICJ4bG9nX2dyYW50X2xvZ19zcGFjZTogc2xlZXAgMSIpOwogCQkvKgpAQCAtMjQyMiw3ICsyNDk0LDcgQEAKIAkJCQkgICAgIGxvZy0+bF9ncmFudF9yZXNlcnZlX2J5dGVzKTsKIAlpZiAoZnJlZV9ieXRlcyA8IG5lZWRfYnl0ZXMpIHsKIAkJaWYgKCh0aWMtPnRfZmxhZ3MgJiBYTE9HX1RJQ19JTl9RKSA9PSAwKQotCQkJWExPR19JTlNfVElDS0VUUShsb2ctPmxfcmVzZXJ2ZV9oZWFkcSwgdGljKTsKKwkJCXhsb2dfaW5zX3RpY2tldHEoJmxvZy0+bF9yZXNlcnZlX2hlYWRxLCB0aWMpOwogCQl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGljLAogCQkJCSAgICAieGxvZ19ncmFudF9sb2dfc3BhY2U6IHNsZWVwIDIiKTsKIAkJWEZTX1NUQVRTX0lOQyh4c19zbGVlcF9sb2dzcGFjZSk7CkBAIC0yNDM5LDExICsyNTExLDEwIEBACiAJCXMgPSBHUkFOVF9MT0NLKGxvZyk7CiAJCWdvdG8gcmVkbzsKIAl9IGVsc2UgaWYgKHRpYy0+dF9mbGFncyAmIFhMT0dfVElDX0lOX1EpCi0JCVhMT0dfREVMX1RJQ0tFVFEobG9nLT5sX3Jlc2VydmVfaGVhZHEsIHRpYyk7CisJCXhsb2dfZGVsX3RpY2tldHEoJmxvZy0+bF9yZXNlcnZlX2hlYWRxLCB0aWMpOwogCiAJLyogd2UndmUgZ290IGVub3VnaCBzcGFjZSAqLwotCVhMT0dfR1JBTlRfQUREX1NQQUNFKGxvZywgbmVlZF9ieXRlcywgJ3cnKTsKLQlYTE9HX0dSQU5UX0FERF9TUEFDRShsb2csIG5lZWRfYnl0ZXMsICdyJyk7CisJeGxvZ19ncmFudF9hZGRfc3BhY2UobG9nLCBuZWVkX2J5dGVzKTsKICNpZmRlZiBERUJVRwogCXRhaWxfbHNuID0gbG9nLT5sX3RhaWxfbHNuOwogCS8qCkBAIC0yNDY0LDcgKzI1MzUsNyBAQAogCiAgZXJyb3JfcmV0dXJuOgogCWlmICh0aWMtPnRfZmxhZ3MgJiBYTE9HX1RJQ19JTl9RKQotCQlYTE9HX0RFTF9USUNLRVRRKGxvZy0+bF9yZXNlcnZlX2hlYWRxLCB0aWMpOworCQl4bG9nX2RlbF90aWNrZXRxKCZsb2ctPmxfcmVzZXJ2ZV9oZWFkcSwgdGljKTsKIAl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGljLCAieGxvZ19ncmFudF9sb2dfc3BhY2U6IGVycl9yZXQiKTsKIAkvKgogCSAqIElmIHdlIGFyZSBmYWlsaW5nLCBtYWtlIHN1cmUgdGhlIHRpY2tldCBkb2Vzbid0IGhhdmUgYW55CkBAIC0yNDk4LDcgKzI1NjksNyBAQAogCVhMT0dfVElDX1JFU0VUX1JFUyh0aWMpOwogCiAJaWYgKHRpYy0+dF9jbnQgPiAwKQotCQlyZXR1cm4gKDApOworCQlyZXR1cm4gMDsKIAogI2lmZGVmIERFQlVHCiAJaWYgKGxvZy0+bF9mbGFncyAmIFhMT0dfQUNUSVZFX1JFQ09WRVJZKQpAQCAtMjUzMyw3ICsyNjA0LDcgQEAKIAogCQlpZiAobnRpYyAhPSBsb2ctPmxfd3JpdGVfaGVhZHEpIHsKIAkJCWlmICgodGljLT50X2ZsYWdzICYgWExPR19USUNfSU5fUSkgPT0gMCkKLQkJCQlYTE9HX0lOU19USUNLRVRRKGxvZy0+bF93cml0ZV9oZWFkcSwgdGljKTsKKwkJCQl4bG9nX2luc190aWNrZXRxKCZsb2ctPmxfd3JpdGVfaGVhZHEsIHRpYyk7CiAKIAkJCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWMsCiAJCQkJICAgICJ4bG9nX3JlZ3JhbnRfd3JpdGVfbG9nX3NwYWNlOiBzbGVlcCAxIik7CkBAIC0yNTY1LDcgKzI2MzYsNyBAQAogCQkJCSAgICAgbG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzKTsKIAlpZiAoZnJlZV9ieXRlcyA8IG5lZWRfYnl0ZXMpIHsKIAkJaWYgKCh0aWMtPnRfZmxhZ3MgJiBYTE9HX1RJQ19JTl9RKSA9PSAwKQotCQkJWExPR19JTlNfVElDS0VUUShsb2ctPmxfd3JpdGVfaGVhZHEsIHRpYyk7CisJCQl4bG9nX2luc190aWNrZXRxKCZsb2ctPmxfd3JpdGVfaGVhZHEsIHRpYyk7CiAJCVhGU19TVEFUU19JTkMoeHNfc2xlZXBfbG9nc3BhY2UpOwogCQlzdl93YWl0KCZ0aWMtPnRfc2VtYSwgUElOT0R8UExUV0FJVCwgJmxvZy0+bF9ncmFudF9sb2NrLCBzKTsKIApAQCAtMjU4MSw5ICsyNjUyLDEwIEBACiAJCXMgPSBHUkFOVF9MT0NLKGxvZyk7CiAJCWdvdG8gcmVkbzsKIAl9IGVsc2UgaWYgKHRpYy0+dF9mbGFncyAmIFhMT0dfVElDX0lOX1EpCi0JCVhMT0dfREVMX1RJQ0tFVFEobG9nLT5sX3dyaXRlX2hlYWRxLCB0aWMpOworCQl4bG9nX2RlbF90aWNrZXRxKCZsb2ctPmxfd3JpdGVfaGVhZHEsIHRpYyk7CiAKLQlYTE9HX0dSQU5UX0FERF9TUEFDRShsb2csIG5lZWRfYnl0ZXMsICd3Jyk7IC8qIHdlJ3ZlIGdvdCBlbm91Z2ggc3BhY2UgKi8KKwkvKiB3ZSd2ZSBnb3QgZW5vdWdoIHNwYWNlICovCisJeGxvZ19ncmFudF9hZGRfc3BhY2Vfd3JpdGUobG9nLCBuZWVkX2J5dGVzKTsKICNpZmRlZiBERUJVRwogCXRhaWxfbHNuID0gbG9nLT5sX3RhaWxfbHNuOwogCWlmIChDWUNMRV9MU04odGFpbF9sc24pICE9IGxvZy0+bF9ncmFudF93cml0ZV9jeWNsZSkgewpAQCAtMjU5NSwxMiArMjY2NywxMiBAQAogCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWMsICJ4bG9nX3JlZ3JhbnRfd3JpdGVfbG9nX3NwYWNlOiBleGl0Iik7CiAJeGxvZ192ZXJpZnlfZ3JhbnRfaGVhZChsb2csIDEpOwogCUdSQU5UX1VOTE9DSyhsb2csIHMpOwotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiAKIAogIGVycm9yX3JldHVybjoKIAlpZiAodGljLT50X2ZsYWdzICYgWExPR19USUNfSU5fUSkKLQkJWExPR19ERUxfVElDS0VUUShsb2ctPmxfcmVzZXJ2ZV9oZWFkcSwgdGljKTsKKwkJeGxvZ19kZWxfdGlja2V0cSgmbG9nLT5sX3Jlc2VydmVfaGVhZHEsIHRpYyk7CiAJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpYywgInhsb2dfcmVncmFudF93cml0ZV9sb2dfc3BhY2U6IGVycl9yZXQiKTsKIAkvKgogCSAqIElmIHdlIGFyZSBmYWlsaW5nLCBtYWtlIHN1cmUgdGhlIHRpY2tldCBkb2Vzbid0IGhhdmUgYW55CkBAIC0yNjMzLDggKzI3MDUsNyBAQAogCQl0aWNrZXQtPnRfY250LS07CiAKIAlzID0gR1JBTlRfTE9DSyhsb2cpOwotCVhMT0dfR1JBTlRfU1VCX1NQQUNFKGxvZywgdGlja2V0LT50X2N1cnJfcmVzLCAndycpOwotCVhMT0dfR1JBTlRfU1VCX1NQQUNFKGxvZywgdGlja2V0LT50X2N1cnJfcmVzLCAncicpOworCXhsb2dfZ3JhbnRfc3ViX3NwYWNlKGxvZywgdGlja2V0LT50X2N1cnJfcmVzKTsKIAl0aWNrZXQtPnRfY3Vycl9yZXMgPSB0aWNrZXQtPnRfdW5pdF9yZXM7CiAJWExPR19USUNfUkVTRVRfUkVTKHRpY2tldCk7CiAJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpY2tldCwKQEAgLTI2NDcsNyArMjcxOCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlYTE9HX0dSQU5UX0FERF9TUEFDRShsb2csIHRpY2tldC0+dF91bml0X3JlcywgJ3InKTsKKwl4bG9nX2dyYW50X2FkZF9zcGFjZV9yZXNlcnZlKGxvZywgdGlja2V0LT50X3VuaXRfcmVzKTsKIAl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGlja2V0LAogCQkJICAgICJ4bG9nX3JlZ3JhbnRfcmVzZXJ2ZV9sb2dfc3BhY2U6IGV4aXQiKTsKIAl4bG9nX3ZlcmlmeV9ncmFudF9oZWFkKGxvZywgMCk7CkBAIC0yNjgzLDggKzI3NTQsNyBAQAogCXMgPSBHUkFOVF9MT0NLKGxvZyk7CiAJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpY2tldCwgInhsb2dfdW5ncmFudF9sb2dfc3BhY2U6IGVudGVyIik7CiAKLQlYTE9HX0dSQU5UX1NVQl9TUEFDRShsb2csIHRpY2tldC0+dF9jdXJyX3JlcywgJ3cnKTsKLQlYTE9HX0dSQU5UX1NVQl9TUEFDRShsb2csIHRpY2tldC0+dF9jdXJyX3JlcywgJ3InKTsKKwl4bG9nX2dyYW50X3N1Yl9zcGFjZShsb2csIHRpY2tldC0+dF9jdXJyX3Jlcyk7CiAKIAl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGlja2V0LCAieGxvZ191bmdyYW50X2xvZ19zcGFjZTogc3ViIGN1cnJlbnQiKTsKIApAQCAtMjY5Myw4ICsyNzYzLDcgQEAKIAkgKi8KIAlpZiAodGlja2V0LT50X2NudCA+IDApIHsKIAkJQVNTRVJUKHRpY2tldC0+dF9mbGFncyAmIFhMT0dfVElDX1BFUk1fUkVTRVJWKTsKLQkJWExPR19HUkFOVF9TVUJfU1BBQ0UobG9nLCB0aWNrZXQtPnRfdW5pdF9yZXMqdGlja2V0LT50X2NudCwndycpOwotCQlYTE9HX0dSQU5UX1NVQl9TUEFDRShsb2csIHRpY2tldC0+dF91bml0X3Jlcyp0aWNrZXQtPnRfY250LCdyJyk7CisJCXhsb2dfZ3JhbnRfc3ViX3NwYWNlKGxvZywgdGlja2V0LT50X3VuaXRfcmVzKnRpY2tldC0+dF9jbnQpOwogCX0KIAogCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWNrZXQsICJ4bG9nX3VuZ3JhbnRfbG9nX3NwYWNlOiBleGl0Iik7CkBAIC0yNzY4LDcgKzI4MzcsNyBAQAogCWlmIChzeW5jKSB7CiAJCXJldHVybiB4bG9nX3N5bmMobG9nLCBpY2xvZyk7CiAJfQotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiAKIH0JLyogeGxvZ19zdGF0ZV9yZWxlYXNlX2ljbG9nICovCiAKQEAgLTMwNTgsNyArMzEyNyw3IEBACiAgICAgfSB3aGlsZSAoaWNsb2cgIT0gbG9nLT5sX2ljbG9nKTsKIAogICAgIExPR19VTkxPQ0sobG9nLCBzKTsKLSAgICByZXR1cm4gKDApOworICAgIHJldHVybiAwOwogfQkvKiB4bG9nX3N0YXRlX3N5bmMgKi8KIAogCkBAIC0zNDc2LDEyICszNTQ1LDEyIEBACiAJCQlpYy0+aWNfc3RhdGUgPSBYTE9HX1NUQVRFX0lPRVJST1I7CiAJCQlpYyA9IGljLT5pY19uZXh0OwogCQl9IHdoaWxlIChpYyAhPSBpY2xvZyk7Ci0JCXJldHVybiAoMCk7CisJCXJldHVybiAwOwogCX0KIAkvKgogCSAqIFJldHVybiBub24temVybywgaWYgc3RhdGUgdHJhbnNpdGlvbiBoYXMgYWxyZWFkeSBoYXBwZW5lZC4KIAkgKi8KLQlyZXR1cm4gKDEpOworCXJldHVybiAxOwogfQogCiAvKgpAQCAtMzUxOCw3ICszNTg3LDcgQEAKIAkgICAgbG9nLT5sX2ZsYWdzICYgWExPR19BQ1RJVkVfUkVDT1ZFUlkpIHsKIAkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0ZTX1NIVVRET1dOOwogCQlYRlNfQlVGX0RPTkUobXAtPm1fc2JfYnApOwotCQlyZXR1cm4gKDApOworCQlyZXR1cm4gMDsKIAl9CiAKIAkvKgpAQCAtMzUyNyw3ICszNTk2LDcgQEAKIAkgKi8KIAlpZiAobG9nZXJyb3IgJiYgbG9nLT5sX2ljbG9nLT5pY19zdGF0ZSAmIFhMT0dfU1RBVEVfSU9FUlJPUikgewogCQlBU1NFUlQoWExPR19GT1JDRURfU0hVVERPV04obG9nKSk7Ci0JCXJldHVybiAoMSk7CisJCXJldHVybiAxOwogCX0KIAlyZXR2YWwgPSAwOwogCS8qCkBAIC0zNjA5LDcgKzM2NzgsNyBAQAogCX0KICNlbmRpZgogCS8qIHJldHVybiBub24temVybyBpZiBsb2cgSU9FUlJPUiB0cmFuc2l0aW9uIGhhZCBhbHJlYWR5IGhhcHBlbmVkICovCi0JcmV0dXJuIChyZXR2YWwpOworCXJldHVybiByZXR2YWw7CiB9CiAKIFNUQVRJQyBpbnQKQEAgLTM2MjMsOCArMzY5Miw4IEBACiAJCSAqIGFueSBsYW5ndWFnZS4KIAkJICovCiAJCWlmIChpY2xvZy0+aWNfaGVhZGVyLmhfbnVtX2xvZ29wcykKLQkJCXJldHVybigwKTsKKwkJCXJldHVybiAwOwogCQlpY2xvZyA9IGljbG9nLT5pY19uZXh0OwogCX0gd2hpbGUgKGljbG9nICE9IGxvZy0+bF9pY2xvZyk7Ci0JcmV0dXJuKDEpOworCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2cuaCBiL2ZzL3hmcy94ZnNfbG9nLmgKaW5kZXggMTU4ODI5Yy4uNGIyYWM4OCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19sb2cuaAorKysgYi9mcy94ZnMveGZzX2xvZy5oCkBAIC0zMCwxMyArMzAsNyBAQAogICogQnkgY29tcGFyaW5nIGVhY2ggY29tcG5lbnQsIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgZXh0cmEKICAqIGVuZGlhbiBpc3N1ZXMgaW4gdHJlYXRpbmcgdHdvIDMyIGJpdCBudW1iZXJzIGFzIG9uZSA2NCBiaXQgbnVtYmVyCiAgKi8KLXN0YXRpYwotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA9PSAyKSAmJiAoIChfX0dOVUNfTUlOT1JfXyA9PSA5NSkgfHwgKF9fR05VQ19NSU5PUl9fID09IDk2KSkKLV9fYXR0cmlidXRlX18oKHVudXNlZCkpCS8qIGdjYyAyLjk1LCAyLjk2IG1pc2NvbXBpbGUgdGhpcyB3aGVuIGlubGluZWQgKi8KLSNlbHNlCi1fX2lubGluZV9fCi0jZW5kaWYKLXhmc19sc25fdAlfbHNuX2NtcCh4ZnNfbHNuX3QgbHNuMSwgeGZzX2xzbl90IGxzbjIpCitzdGF0aWMgaW5saW5lIHhmc19sc25fdAlfbHNuX2NtcCh4ZnNfbHNuX3QgbHNuMSwgeGZzX2xzbl90IGxzbjIpCiB7CiAJaWYgKENZQ0xFX0xTTihsc24xKSAhPSBDWUNMRV9MU04obHNuMikpCiAJCXJldHVybiAoQ1lDTEVfTFNOKGxzbjEpPENZQ0xFX0xTTihsc24yKSk/IC05OTkgOiA5OTk7CkBAIC0xMDIsNyArOTYsNiBAQAogCiAKIC8qIFJlZ2lvbiB0eXBlcyBmb3IgaW92ZWMncyBpX3R5cGUgKi8KLSNpZiBkZWZpbmVkKFhGU19MT0dfUkVTX0RFQlVHKQogI2RlZmluZSBYTE9HX1JFR19UWVBFX0JGT1JNQVQJCTEKICNkZWZpbmUgWExPR19SRUdfVFlQRV9CQ0hVTksJCTIKICNkZWZpbmUgWExPR19SRUdfVFlQRV9FRklfRk9STUFUCTMKQEAgLTEyMywyMSArMTE2LDEzIEBACiAjZGVmaW5lIFhMT0dfUkVHX1RZUEVfQ09NTUlUCQkxOAogI2RlZmluZSBYTE9HX1JFR19UWVBFX1RSQU5TSERSCQkxOQogI2RlZmluZSBYTE9HX1JFR19UWVBFX01BWAkJMTkKLSNlbmRpZgogCi0jaWYgZGVmaW5lZChYRlNfTE9HX1JFU19ERUJVRykKICNkZWZpbmUgWExPR19WRUNfU0VUX1RZUEUodmVjcCwgdCkgKCh2ZWNwKS0+aV90eXBlID0gKHQpKQotI2Vsc2UKLSNkZWZpbmUgWExPR19WRUNfU0VUX1RZUEUodmVjcCwgdCkKLSNlbmRpZgotCiAKIHR5cGVkZWYgc3RydWN0IHhmc19sb2dfaW92ZWMgewogCXhmc19jYWRkcl90CQlpX2FkZHI7CQkvKiBiZWdpbm5pbmcgYWRkcmVzcyBvZiByZWdpb24gKi8KIAlpbnQJCWlfbGVuOwkJLyogbGVuZ3RoIGluIGJ5dGVzIG9mIHJlZ2lvbiAqLwotI2lmIGRlZmluZWQoWEZTX0xPR19SRVNfREVCVUcpCi0gCXVpbnQJCWlfdHlwZTsJCS8qIHR5cGUgb2YgcmVnaW9uICovCi0jZW5kaWYKKwl1aW50CQlpX3R5cGU7CQkvKiB0eXBlIG9mIHJlZ2lvbiAqLwogfSB4ZnNfbG9nX2lvdmVjX3Q7CiAKIHR5cGVkZWYgdm9pZCogeGZzX2xvZ190aWNrZXRfdDsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nX3ByaXYuaCBiL2ZzL3hmcy94ZnNfbG9nX3ByaXYuaAppbmRleCA0NTE4YjE4Li4zNGJjYmY1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZ19wcml2LmgKKysrIGIvZnMveGZzL3hmc19sb2dfcHJpdi5oCkBAIC0yNTMsNyArMjUzLDYgQEAKIAogCiAvKiBUaWNrZXQgcmVzZXJ2YXRpb24gcmVnaW9uIGFjY291bnRpbmcgKi8gCi0jaWYgZGVmaW5lZChYRlNfTE9HX1JFU19ERUJVRykKICNkZWZpbmUgWExPR19USUNfTEVOX01BWAkxNQogI2RlZmluZSBYTE9HX1RJQ19SRVNFVF9SRVModCkgKCh0KS0+dF9yZXNfbnVtID0gXAogCQkJCSh0KS0+dF9yZXNfYXJyX3N1bSA9ICh0KS0+dF9yZXNfbnVtX29waGRycyA9IDApCkBAIC0yNzgsMTUgKzI3Nyw5IEBACiAgKiB3ZSBkb24ndCBjYXJlIGFib3V0LgogICovCiB0eXBlZGVmIHN0cnVjdCB4bG9nX3JlcyB7Ci0JdWludAlyX2xlbjsKLQl1aW50CXJfdHlwZTsKKwl1aW50CXJfbGVuOwkvKiByZWdpb24gbGVuZ3RoCQk6NCAqLworCXVpbnQJcl90eXBlOwkvKiByZWdpb24ncyB0cmFuc2FjdGlvbiB0eXBlCTo0ICovCiB9IHhsb2dfcmVzX3Q7Ci0jZWxzZQotI2RlZmluZSBYTE9HX1RJQ19SRVNFVF9SRVModCkKLSNkZWZpbmUgWExPR19USUNfQUREX09QSERSKHQpCi0jZGVmaW5lIFhMT0dfVElDX0FERF9SRUdJT04odCwgbGVuLCB0eXBlKQotI2VuZGlmCi0KIAogdHlwZWRlZiBzdHJ1Y3QgeGxvZ190aWNrZXQgewogCXN2X3QJCSAgIHRfc2VtYTsJIC8qIHNsZWVwIG9uIHRoaXMgc2VtYXBob3JlICAgICAgOiAyMCAqLwpAQCAtMzAxLDE0ICsyOTQsMTIgQEAKIAljaGFyCQkgICB0X2ZsYWdzOwkgLyogcHJvcGVydGllcyBvZiByZXNlcnZhdGlvbgkgOiAxICAqLwogCXVpbnQJCSAgIHRfdHJhbnNfdHlwZTsgLyogdHJhbnNhY3Rpb24gdHlwZSAgICAgICAgICAgICA6IDQgICovCiAKLSNpZiBkZWZpbmVkIChYRlNfTE9HX1JFU19ERUJVRykKICAgICAgICAgLyogcmVzZXJ2YXRpb24gYXJyYXkgZmllbGRzICovCiAJdWludAkJICAgdF9yZXNfbnVtOyAgICAgICAgICAgICAgICAgICAgLyogbnVtIGluIGFycmF5IDogNCAqLwotCXhsb2dfcmVzX3QJICAgdF9yZXNfYXJyW1hMT0dfVElDX0xFTl9NQVhdOyAgLyogYXJyYXkgb2YgcmVzIDogWCAqLyAKIAl1aW50CQkgICB0X3Jlc19udW1fb3BoZHJzOwkJIC8qIG51bSBvcCBoZHJzICA6IDQgKi8KIAl1aW50CQkgICB0X3Jlc19hcnJfc3VtOwkJIC8qIGFycmF5IHN1bSAgICA6IDQgKi8KIAl1aW50CQkgICB0X3Jlc19vX2Zsb3c7CQkgLyogc3VtIG92ZXJmbG93IDogNCAqLwotI2VuZGlmCisJeGxvZ19yZXNfdAkgICB0X3Jlc19hcnJbWExPR19USUNfTEVOX01BWF07ICAvKiBhcnJheSBvZiByZXMgOiA4ICogMTUgKi8gCiB9IHhsb2dfdGlja2V0X3Q7CiAKICNlbmRpZgpAQCAtNDk0LDcxICs0ODUsMTMgQEAKIAogI2RlZmluZSBYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpCSgobG9nKS0+bF9mbGFncyAmIFhMT0dfSU9fRVJST1IpCiAKLSNkZWZpbmUgWExPR19HUkFOVF9TVUJfU1BBQ0UobG9nLGJ5dGVzLHR5cGUpCQkJCVwKLSAgICB7CQkJCQkJCQkJXAotCWlmICh0eXBlID09ICd3JykgewkJCQkJCVwKLQkJKGxvZyktPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgLT0gKGJ5dGVzKTsJCQlcCi0JCWlmICgobG9nKS0+bF9ncmFudF93cml0ZV9ieXRlcyA8IDApIHsJCQlcCi0JCQkobG9nKS0+bF9ncmFudF93cml0ZV9ieXRlcyArPSAobG9nKS0+bF9sb2dzaXplOwlcCi0JCQkobG9nKS0+bF9ncmFudF93cml0ZV9jeWNsZS0tOwkJCVwKLQkJfQkJCQkJCQlcCi0JfSBlbHNlIHsJCQkJCQkJXAotCQkobG9nKS0+bF9ncmFudF9yZXNlcnZlX2J5dGVzIC09IChieXRlcyk7CQlcCi0JCWlmICgobG9nKS0+bF9ncmFudF9yZXNlcnZlX2J5dGVzIDwgMCkgewkJCVwKLQkJCShsb2cpLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMgKz0gKGxvZyktPmxfbG9nc2l6ZTtcCi0JCQkobG9nKS0+bF9ncmFudF9yZXNlcnZlX2N5Y2xlLS07CQkJXAotCQl9CQkJCQkJCVwKLQkgfQkJCQkJCQkJXAotICAgIH0KLSNkZWZpbmUgWExPR19HUkFOVF9BRERfU1BBQ0UobG9nLGJ5dGVzLHR5cGUpCQkJCVwKLSAgICB7CQkJCQkJCQkJXAotCWlmICh0eXBlID09ICd3JykgewkJCQkJCVwKLQkJKGxvZyktPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgKz0gKGJ5dGVzKTsJCQlcCi0JCWlmICgobG9nKS0+bF9ncmFudF93cml0ZV9ieXRlcyA+IChsb2cpLT5sX2xvZ3NpemUpIHsJXAotCQkJKGxvZyktPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgLT0gKGxvZyktPmxfbG9nc2l6ZTsJXAotCQkJKGxvZyktPmxfZ3JhbnRfd3JpdGVfY3ljbGUrKzsJCQlcCi0JCX0JCQkJCQkJXAotCX0gZWxzZSB7CQkJCQkJCVwKLQkJKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyArPSAoYnl0ZXMpOwkJXAotCQlpZiAoKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyA+IChsb2cpLT5sX2xvZ3NpemUpIHsJXAotCQkJKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyAtPSAobG9nKS0+bF9sb2dzaXplO1wKLQkJCShsb2cpLT5sX2dyYW50X3Jlc2VydmVfY3ljbGUrKzsJCQlcCi0JCX0JCQkJCQkJXAotCSB9CQkJCQkJCQlcCi0gICAgfQotI2RlZmluZSBYTE9HX0lOU19USUNLRVRRKHEsIHRpYykJCQlcCi0gICAgewkJCQkJCQlcCi0JaWYgKHEpIHsJCQkJCVwKLQkJKHRpYyktPnRfbmV4dAkgICAgPSAocSk7CQlcCi0JCSh0aWMpLT50X3ByZXYJICAgID0gKHEpLT50X3ByZXY7CVwKLQkJKHEpLT50X3ByZXYtPnRfbmV4dCA9ICh0aWMpOwkJXAotCQkocSktPnRfcHJldgkgICAgPSAodGljKTsJCVwKLQl9IGVsc2UgewkJCQkJXAotCQkodGljKS0+dF9wcmV2ID0gKHRpYyktPnRfbmV4dCA9ICh0aWMpOwlcCi0JCShxKSA9ICh0aWMpOwkJCQlcCi0JfQkJCQkJCVwKLQkodGljKS0+dF9mbGFncyB8PSBYTE9HX1RJQ19JTl9ROwkJXAotICAgIH0KLSNkZWZpbmUgWExPR19ERUxfVElDS0VUUShxLCB0aWMpCQkJXAotICAgIHsJCQkJCQkJXAotCWlmICgodGljKSA9PSAodGljKS0+dF9uZXh0KSB7CQkJXAotCQkocSkgPSBOVUxMOwkJCQlcCi0JfSBlbHNlIHsJCQkJCVwKLQkJKHEpID0gKHRpYyktPnRfbmV4dDsJCQlcCi0JCSh0aWMpLT50X25leHQtPnRfcHJldiA9ICh0aWMpLT50X3ByZXY7CVwKLQkJKHRpYyktPnRfcHJldi0+dF9uZXh0ID0gKHRpYyktPnRfbmV4dDsJXAotCX0JCQkJCQlcCi0JKHRpYyktPnRfbmV4dCA9ICh0aWMpLT50X3ByZXYgPSBOVUxMOwkJXAotCSh0aWMpLT50X2ZsYWdzICY9IH5YTE9HX1RJQ19JTl9ROwkJXAotICAgIH0KIAogLyogY29tbW9uIHJvdXRpbmVzICovCiBleHRlcm4geGZzX2xzbl90IHhsb2dfYXNzaWduX3RhaWxfbHNuKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKIGV4dGVybiBpbnQJIHhsb2dfZmluZF90YWlsKHhsb2dfdAkqbG9nLAogCQkJCXhmc19kYWRkcl90ICpoZWFkX2JsaywKLQkJCQl4ZnNfZGFkZHJfdCAqdGFpbF9ibGssCi0JCQkJaW50IHJlYWRvbmx5KTsKLWV4dGVybiBpbnQJIHhsb2dfcmVjb3Zlcih4bG9nX3QgKmxvZywgaW50IHJlYWRvbmx5KTsKKwkJCQl4ZnNfZGFkZHJfdCAqdGFpbF9ibGspOworZXh0ZXJuIGludAkgeGxvZ19yZWNvdmVyKHhsb2dfdCAqbG9nKTsKIGV4dGVybiBpbnQJIHhsb2dfcmVjb3Zlcl9maW5pc2goeGxvZ190ICpsb2csIGludCBtZnNpX2ZsYWdzKTsKIGV4dGVybiB2b2lkCSB4bG9nX3BhY2tfZGF0YSh4bG9nX3QgKmxvZywgeGxvZ19pbl9jb3JlX3QgKmljbG9nLCBpbnQpOwogZXh0ZXJuIHZvaWQJIHhsb2dfcmVjb3Zlcl9wcm9jZXNzX2l1bmxpbmtzKHhsb2dfdCAqbG9nKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYyBiL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYwppbmRleCA4YWI3ZGY3Li43ZDQ2Y2JkIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMKKysrIGIvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jCkBAIC03ODMsOCArNzgzLDcgQEAKIHhsb2dfZmluZF90YWlsKAogCXhsb2dfdAkJCSpsb2csCiAJeGZzX2RhZGRyX3QJCSpoZWFkX2JsaywKLQl4ZnNfZGFkZHJfdAkJKnRhaWxfYmxrLAotCWludAkJCXJlYWRvbmx5KQorCXhmc19kYWRkcl90CQkqdGFpbF9ibGspCiB7CiAJeGxvZ19yZWNfaGVhZGVyX3QJKnJoZWFkOwogCXhsb2dfb3BfaGVhZGVyX3QJKm9wX2hlYWQ7CkBAIC0yNTYzLDEwICsyNTYyLDEyIEBACiAKIAkvKgogCSAqIFRoZSBsb2dpdGVtIGZvcm1hdCdzIGZsYWcgdGVsbHMgdXMgaWYgdGhpcyB3YXMgdXNlciBxdW90YW9mZiwKLQkgKiBncm91cCBxdW90YW9mZiBvciBib3RoLgorCSAqIGdyb3VwL3Byb2plY3QgcXVvdGFvZmYgb3IgYm90aC4KIAkgKi8KIAlpZiAocW9mZl9mLT5xZl9mbGFncyAmIFhGU19VUVVPVEFfQUNDVCkKIAkJbG9nLT5sX3F1b3Rhb2Zmc19mbGFnIHw9IFhGU19EUV9VU0VSOworCWlmIChxb2ZmX2YtPnFmX2ZsYWdzICYgWEZTX1BRVU9UQV9BQ0NUKQorCQlsb2ctPmxfcXVvdGFvZmZzX2ZsYWcgfD0gWEZTX0RRX1BST0o7CiAJaWYgKHFvZmZfZi0+cWZfZmxhZ3MgJiBYRlNfR1FVT1RBX0FDQ1QpCiAJCWxvZy0+bF9xdW90YW9mZnNfZmxhZyB8PSBYRlNfRFFfR1JPVVA7CiAKQEAgLTM4OTAsMTQgKzM4OTEsMTMgQEAKICAqLwogaW50CiB4bG9nX3JlY292ZXIoCi0JeGxvZ190CQkqbG9nLAotCWludAkJcmVhZG9ubHkpCisJeGxvZ190CQkqbG9nKQogewogCXhmc19kYWRkcl90CWhlYWRfYmxrLCB0YWlsX2JsazsKIAlpbnQJCWVycm9yOwogCiAJLyogZmluZCB0aGUgdGFpbCBvZiB0aGUgbG9nICovCi0JaWYgKChlcnJvciA9IHhsb2dfZmluZF90YWlsKGxvZywgJmhlYWRfYmxrLCAmdGFpbF9ibGssIHJlYWRvbmx5KSkpCisJaWYgKChlcnJvciA9IHhsb2dfZmluZF90YWlsKGxvZywgJmhlYWRfYmxrLCAmdGFpbF9ibGspKSkKIAkJcmV0dXJuIGVycm9yOwogCiAJaWYgKHRhaWxfYmxrICE9IGhlYWRfYmxrKSB7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX21vdW50LmMgYi9mcy94ZnMveGZzX21vdW50LmMKaW5kZXggNTQxZDVkZC4uNjIxODhlYSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19tb3VudC5jCisrKyBiL2ZzL3hmcy94ZnNfbW91bnQuYwpAQCAtNTEsNyArNTEsNyBAQAogU1RBVElDIHZvaWQJeGZzX3V1aWRfdW5tb3VudCh4ZnNfbW91bnRfdCAqbXApOwogU1RBVElDIHZvaWQJeGZzX3VubW91bnRmc193YWl0KHhmc19tb3VudF90ICopOwogCi1zdGF0aWMgc3RydWN0IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgewogICAgIHNob3J0IG9mZnNldDsKICAgICBzaG9ydCB0eXBlOyAgICAgLyogMCA9IGludGVnZXIKIAkJKiAxID0gYmluYXJ5IC8gc3RyaW5nIChubyB0cmFuc2xhdGlvbikKQEAgLTExNyw3ICsxMTcsNyBAQAogCiAJQUlMX0xPQ0tJTklUKCZtcC0+bV9haWxfbG9jaywgInhmc19haWwiKTsKIAlzcGlubG9ja19pbml0KCZtcC0+bV9zYl9sb2NrLCAieGZzX3NiIik7Ci0JbXV0ZXhfaW5pdCgmbXAtPm1faWxvY2ssIE1VVEVYX0RFRkFVTFQsICJ4ZnNfaWxvY2siKTsKKwltdXRleF9pbml0KCZtcC0+bV9pbG9jayk7CiAJaW5pdG5zZW1hKCZtcC0+bV9ncm93bG9jaywgMSwgInhmc19ncm93Iik7CiAJLyoKIAkgKiBJbml0aWFsaXplIHRoZSBBSUwuCkBAIC02NDYsNyArNjQ2LDcgQEAKIAogCWlmIChtcC0+bV9zYl9icCA9PSBOVUxMKSB7CiAJCWlmICgoZXJyb3IgPSB4ZnNfcmVhZHNiKG1wKSkpIHsKLQkJCXJldHVybiAoZXJyb3IpOworCQkJcmV0dXJuIGVycm9yOwogCQl9CiAJfQogCXhmc19tb3VudF9jb21tb24obXAsIHNicCk7CkBAIC04ODksNyArODg5LDcgQEAKIAkgKiBGb3IgY2xpZW50IGNhc2Ugd2UgYXJlIGRvbmUgbm93CiAJICovCiAJaWYgKG1mc2lfZmxhZ3MgJiBYRlNfTUZTSV9DTElFTlQpIHsKLQkJcmV0dXJuKDApOworCQlyZXR1cm4gMDsKIAl9CiAKIAkvKgpAQCAtMTA3Nyw4ICsxMDc3LDcgQEAKIAogCXhmc19pZmx1c2hfYWxsKG1wKTsKIAotCVhGU19RTV9EUVBVUkdFQUxMKG1wLAotCQlYRlNfUU1PUFRfVVFVT1RBIHwgWEZTX1FNT1BUX0dRVU9UQSB8IFhGU19RTU9QVF9VTU9VTlRJTkcpOworCVhGU19RTV9EUVBVUkdFQUxMKG1wLCBYRlNfUU1PUFRfUVVPVEFMTCB8IFhGU19RTU9QVF9VTU9VTlRJTkcpOwogCiAJLyoKIAkgKiBGbHVzaCBvdXQgdGhlIGxvZyBzeW5jaHJvbm91c2x5IHNvIHRoYXQgd2Uga25vdyBmb3Igc3VyZQpAQCAtMTE4Myw3ICsxMTgyLDcgQEAKIAkJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwgIlN1cGVyYmxvY2sgd3JpdGUgZXJyb3IgZGV0ZWN0ZWQgd2hpbGUgdW5tb3VudGluZy4gIEZpbGVzeXN0ZW0gbWF5IG5vdCBiZSBtYXJrZWQgc2hhcmVkIHJlYWRvbmx5Iik7CiAJfQogCXhmc19idWZfcmVsc2Uoc2JwKTsKLQlyZXR1cm4gKGVycm9yKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qCkBAIC0xMjU4LDE5ICsxMjU3LDE5IEBACiAJCWxjb3VudGVyICs9IGRlbHRhOwogCQlpZiAobGNvdW50ZXIgPCAwKSB7CiAJCQlBU1NFUlQoMCk7Ci0JCQlyZXR1cm4gKFhGU19FUlJPUihFSU5WQUwpKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKIAkJfQogCQltcC0+bV9zYi5zYl9pY291bnQgPSBsY291bnRlcjsKLQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuIDA7CiAJY2FzZSBYRlNfU0JTX0lGUkVFOgogCQlsY291bnRlciA9IChsb25nIGxvbmcpbXAtPm1fc2Iuc2JfaWZyZWU7CiAJCWxjb3VudGVyICs9IGRlbHRhOwogCQlpZiAobGNvdW50ZXIgPCAwKSB7CiAJCQlBU1NFUlQoMCk7Ci0JCQlyZXR1cm4gKFhGU19FUlJPUihFSU5WQUwpKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKIAkJfQogCQltcC0+bV9zYi5zYl9pZnJlZSA9IGxjb3VudGVyOwotCQlyZXR1cm4gKDApOworCQlyZXR1cm4gMDsKIAljYXNlIFhGU19TQlNfRkRCTE9DS1M6CiAKIAkJbGNvdW50ZXIgPSAobG9uZyBsb25nKW1wLT5tX3NiLnNiX2ZkYmxvY2tzOwpAQCAtMTI5NywxMDEgKzEyOTYsMTAxIEBACiAJCQkJaWYgKHJzdmQpIHsKIAkJCQkJbGNvdW50ZXIgPSAobG9uZyBsb25nKW1wLT5tX3Jlc2Jsa3NfYXZhaWwgKyBkZWx0YTsKIAkJCQkJaWYgKGxjb3VudGVyIDwgMCkgewotCQkJCQkJcmV0dXJuIChYRlNfRVJST1IoRU5PU1BDKSk7CisJCQkJCQlyZXR1cm4gWEZTX0VSUk9SKEVOT1NQQyk7CiAJCQkJCX0KIAkJCQkJbXAtPm1fcmVzYmxrc19hdmFpbCA9IGxjb3VudGVyOwotCQkJCQlyZXR1cm4gKDApOworCQkJCQlyZXR1cm4gMDsKIAkJCQl9IGVsc2UgewkvKiBub3QgcmVzZXJ2ZWQgKi8KLQkJCQkJcmV0dXJuIChYRlNfRVJST1IoRU5PU1BDKSk7CisJCQkJCXJldHVybiBYRlNfRVJST1IoRU5PU1BDKTsKIAkJCQl9CiAJCQl9CiAJCX0KIAogCQltcC0+bV9zYi5zYl9mZGJsb2NrcyA9IGxjb3VudGVyOwotCQlyZXR1cm4gKDApOworCQlyZXR1cm4gMDsKIAljYXNlIFhGU19TQlNfRlJFWFRFTlRTOgogCQlsY291bnRlciA9IChsb25nIGxvbmcpbXAtPm1fc2Iuc2JfZnJleHRlbnRzOwogCQlsY291bnRlciArPSBkZWx0YTsKIAkJaWYgKGxjb3VudGVyIDwgMCkgewotCQkJcmV0dXJuIChYRlNfRVJST1IoRU5PU1BDKSk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVOT1NQQyk7CiAJCX0KIAkJbXAtPm1fc2Iuc2JfZnJleHRlbnRzID0gbGNvdW50ZXI7Ci0JCXJldHVybiAoMCk7CisJCXJldHVybiAwOwogCWNhc2UgWEZTX1NCU19EQkxPQ0tTOgogCQlsY291bnRlciA9IChsb25nIGxvbmcpbXAtPm1fc2Iuc2JfZGJsb2NrczsKIAkJbGNvdW50ZXIgKz0gZGVsdGE7CiAJCWlmIChsY291bnRlciA8IDApIHsKIAkJCUFTU0VSVCgwKTsKLQkJCXJldHVybiAoWEZTX0VSUk9SKEVJTlZBTCkpOworCQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOwogCQl9CiAJCW1wLT5tX3NiLnNiX2RibG9ja3MgPSBsY291bnRlcjsKLQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuIDA7CiAJY2FzZSBYRlNfU0JTX0FHQ09VTlQ6CiAJCXNjb3VudGVyID0gbXAtPm1fc2Iuc2JfYWdjb3VudDsKIAkJc2NvdW50ZXIgKz0gZGVsdGE7CiAJCWlmIChzY291bnRlciA8IDApIHsKIAkJCUFTU0VSVCgwKTsKLQkJCXJldHVybiAoWEZTX0VSUk9SKEVJTlZBTCkpOworCQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOwogCQl9CiAJCW1wLT5tX3NiLnNiX2FnY291bnQgPSBzY291bnRlcjsKLQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuIDA7CiAJY2FzZSBYRlNfU0JTX0lNQVhfUENUOgogCQlzY291bnRlciA9IG1wLT5tX3NiLnNiX2ltYXhfcGN0OwogCQlzY291bnRlciArPSBkZWx0YTsKIAkJaWYgKHNjb3VudGVyIDwgMCkgewogCQkJQVNTRVJUKDApOwotCQkJcmV0dXJuIChYRlNfRVJST1IoRUlOVkFMKSk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CiAJCX0KIAkJbXAtPm1fc2Iuc2JfaW1heF9wY3QgPSBzY291bnRlcjsKLQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuIDA7CiAJY2FzZSBYRlNfU0JTX1JFWFRTSVpFOgogCQlzY291bnRlciA9IG1wLT5tX3NiLnNiX3JleHRzaXplOwogCQlzY291bnRlciArPSBkZWx0YTsKIAkJaWYgKHNjb3VudGVyIDwgMCkgewogCQkJQVNTRVJUKDApOwotCQkJcmV0dXJuIChYRlNfRVJST1IoRUlOVkFMKSk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CiAJCX0KIAkJbXAtPm1fc2Iuc2JfcmV4dHNpemUgPSBzY291bnRlcjsKLQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuIDA7CiAJY2FzZSBYRlNfU0JTX1JCTUJMT0NLUzoKIAkJc2NvdW50ZXIgPSBtcC0+bV9zYi5zYl9yYm1ibG9ja3M7CiAJCXNjb3VudGVyICs9IGRlbHRhOwogCQlpZiAoc2NvdW50ZXIgPCAwKSB7CiAJCQlBU1NFUlQoMCk7Ci0JCQlyZXR1cm4gKFhGU19FUlJPUihFSU5WQUwpKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKIAkJfQogCQltcC0+bV9zYi5zYl9yYm1ibG9ja3MgPSBzY291bnRlcjsKLQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuIDA7CiAJY2FzZSBYRlNfU0JTX1JCTE9DS1M6CiAJCWxjb3VudGVyID0gKGxvbmcgbG9uZyltcC0+bV9zYi5zYl9yYmxvY2tzOwogCQlsY291bnRlciArPSBkZWx0YTsKIAkJaWYgKGxjb3VudGVyIDwgMCkgewogCQkJQVNTRVJUKDApOwotCQkJcmV0dXJuIChYRlNfRVJST1IoRUlOVkFMKSk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CiAJCX0KIAkJbXAtPm1fc2Iuc2JfcmJsb2NrcyA9IGxjb3VudGVyOwotCQlyZXR1cm4gKDApOworCQlyZXR1cm4gMDsKIAljYXNlIFhGU19TQlNfUkVYVEVOVFM6CiAJCWxjb3VudGVyID0gKGxvbmcgbG9uZyltcC0+bV9zYi5zYl9yZXh0ZW50czsKIAkJbGNvdW50ZXIgKz0gZGVsdGE7CiAJCWlmIChsY291bnRlciA8IDApIHsKIAkJCUFTU0VSVCgwKTsKLQkJCXJldHVybiAoWEZTX0VSUk9SKEVJTlZBTCkpOworCQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOwogCQl9CiAJCW1wLT5tX3NiLnNiX3JleHRlbnRzID0gbGNvdW50ZXI7Ci0JCXJldHVybiAoMCk7CisJCXJldHVybiAwOwogCWNhc2UgWEZTX1NCU19SRVhUU0xPRzoKIAkJc2NvdW50ZXIgPSBtcC0+bV9zYi5zYl9yZXh0c2xvZzsKIAkJc2NvdW50ZXIgKz0gZGVsdGE7CiAJCWlmIChzY291bnRlciA8IDApIHsKIAkJCUFTU0VSVCgwKTsKLQkJCXJldHVybiAoWEZTX0VSUk9SKEVJTlZBTCkpOworCQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOwogCQl9CiAJCW1wLT5tX3NiLnNiX3JleHRzbG9nID0gc2NvdW50ZXI7Ci0JCXJldHVybiAoMCk7CisJCXJldHVybiAwOwogCWRlZmF1bHQ6CiAJCUFTU0VSVCgwKTsKLQkJcmV0dXJuIChYRlNfRVJST1IoRUlOVkFMKSk7CisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKIAl9CiB9CiAKQEAgLTE0MTAsNyArMTQwOSw3IEBACiAJcyA9IFhGU19TQl9MT0NLKG1wKTsKIAlzdGF0dXMgPSB4ZnNfbW9kX2luY29yZV9zYl91bmxvY2tlZChtcCwgZmllbGQsIGRlbHRhLCByc3ZkKTsKIAlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKLQlyZXR1cm4gKHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKIH0KIAogLyoKQEAgLTE0NzEsNyArMTQ3MCw3IEBACiAJCX0KIAl9CiAJWEZTX1NCX1VOTE9DSyhtcCwgcyk7Ci0JcmV0dXJuIChzdGF0dXMpOworCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCkBAIC0xNTAxLDcgKzE1MDAsNyBAQAogCX0KIAlYRlNfQlVGX0hPTEQoYnApOwogCUFTU0VSVChYRlNfQlVGX0lTRE9ORShicCkpOwotCXJldHVybiAoYnApOworCXJldHVybiBicDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbW91bnQuaCBiL2ZzL3hmcy94ZnNfbW91bnQuaAppbmRleCAwOGIyZTBhLi5jZDNjZjk2IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX21vdW50LmgKKysrIGIvZnMveGZzL3hmc19tb3VudC5oCkBAIC0zMDgsNyArMzA4LDYgQEAKIAl4ZnNfYnVmdGFyZ190CQkqbV9kZGV2X3RhcmdwOwkvKiBzYXZlcyB0YWtpbmcgdGhlIGFkZHJlc3MgKi8KIAl4ZnNfYnVmdGFyZ190CQkqbV9sb2dkZXZfdGFyZ3A7LyogcHRyIHRvIGxvZyBkZXZpY2UgKi8KIAl4ZnNfYnVmdGFyZ190CQkqbV9ydGRldl90YXJncDsJLyogcHRyIHRvIHJ0IGRldmljZSAqLwotI2RlZmluZSBtX2RldgkJbV9kZGV2X3RhcmdwLT5wYnJfZGV2CiAJX191aW50OF90CQltX2RpcmNvb2tfZWxvZzsJLyogbG9nIGQtY29va2llIGVudHJ5IGJpdHMgKi8KIAlfX3VpbnQ4X3QJCW1fYmxrYml0X2xvZzsJLyogYmxvY2tsb2cgKyBOQkJZICovCiAJX191aW50OF90CQltX2Jsa2JiX2xvZzsJLyogYmxvY2tsb2cgLSBCQlNISUZUICovCkBAIC0zOTMsNyArMzkyLDcgQEAKIAkJCQkJCSAgIHVzZXIgKi8KICNkZWZpbmUgWEZTX01PVU5UX05PQUxJR04JKDFVTEwgPDwgNykJLyogdHVybiBvZmYgc3RyaXBlIGFsaWdubWVudAogCQkJCQkJICAgYWxsb2NhdGlvbnMgKi8KLSNkZWZpbmUgWEZTX01PVU5UX0NPTVBBVF9BVFRSCSgxVUxMIDw8IDgpCS8qIGRvIG5vdCB1c2UgYXR0cjIgZm9ybWF0ICovCisjZGVmaW5lIFhGU19NT1VOVF9BVFRSMgkJKDFVTEwgPDwgOCkJLyogYWxsb3cgdXNlIG9mIGF0dHIyIGZvcm1hdCAqLwogCQkJICAgICAvKgkoMVVMTCA8PCA5KQktLSBjdXJyZW50bHkgdW51c2VkICovCiAjZGVmaW5lIFhGU19NT1VOVF9OT1JFQ09WRVJZCSgxVUxMIDw8IDEwKQkvKiBubyByZWNvdmVyeSAtIGRpcnR5IGZzICovCiAjZGVmaW5lIFhGU19NT1VOVF9TSEFSRUQJKDFVTEwgPDwgMTEpCS8qIHNoYXJlZCBtb3VudCAqLwpAQCAtNTMzLDcgKzUzMiw3IEBACiAJaW50CQltc2JfZGVsdGE7CS8qIENoYW5nZSB0byBtYWtlIHRvIHNwZWNpZmllZCBmaWVsZCAqLwogfSB4ZnNfbW9kX3NiX3Q7CiAKLSNkZWZpbmUJWEZTX01PVU5UX0lMT0NLKG1wKQltdXRleF9sb2NrKCYoKG1wKS0+bV9pbG9jayksIFBJTk9EKQorI2RlZmluZQlYRlNfTU9VTlRfSUxPQ0sobXApCW11dGV4X2xvY2soJigobXApLT5tX2lsb2NrKSkKICNkZWZpbmUJWEZTX01PVU5UX0lVTkxPQ0sobXApCW11dGV4X3VubG9jaygmKChtcCktPm1faWxvY2spKQogI2RlZmluZQlYRlNfU0JfTE9DSyhtcCkJCW11dGV4X3NwaW5sb2NrKCYobXApLT5tX3NiX2xvY2spCiAjZGVmaW5lCVhGU19TQl9VTkxPQ0sobXAscykJbXV0ZXhfc3BpbnVubG9jaygmKG1wKS0+bV9zYl9sb2NrLChzKSkKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfcmVuYW1lLmMgYi9mcy94ZnMveGZzX3JlbmFtZS5jCmluZGV4IDRkNGU4ZjQuLjgxYTA1Y2YgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfcmVuYW1lLmMKKysrIGIvZnMveGZzL3hmc19yZW5hbWUuYwpAQCAtMjQzLDcgKzI0Myw2IEBACiAJeGZzX2lub2RlX3QJKmlub2Rlc1s0XTsKIAlpbnQJCXRhcmdldF9pcF9kcm9wcGVkID0gMDsJLyogZHJvcHBlZCB0YXJnZXRfaXAgbGluaz8gKi8KIAl2bm9kZV90CQkqc3JjX2Rpcl92cDsKLQliaHZfZGVzY190CSp0YXJnZXRfZGlyX2JkcDsKIAlpbnQJCXNwYWNlcmVzOwogCWludAkJdGFyZ2V0X2xpbmtfemVybyA9IDA7CiAJaW50CQludW1faW5vZGVzOwpAQCAtMjYwLDE0ICsyNTksMTIgQEAKIAkgKiBGaW5kIHRoZSBYRlMgYmVoYXZpb3IgZGVzY3JpcHRvciBmb3IgdGhlIHRhcmdldCBkaXJlY3RvcnkKIAkgKiB2bm9kZSBzaW5jZSBpdCB3YXMgbm90IGhhbmRlZCB0byB1cy4KIAkgKi8KLQl0YXJnZXRfZGlyX2JkcCA9IHZuX2Jodl9sb29rdXBfdW5sb2NrZWQoVk5fQkhWX0hFQUQodGFyZ2V0X2Rpcl92cCksCi0JCQkJCQkmeGZzX3Zub2Rlb3BzKTsKLQlpZiAodGFyZ2V0X2Rpcl9iZHAgPT0gTlVMTCkgeworCXRhcmdldF9kcCA9IHhmc192dG9pKHRhcmdldF9kaXJfdnApOworCWlmICh0YXJnZXRfZHAgPT0gTlVMTCkgewogCQlyZXR1cm4gWEZTX0VSUk9SKEVYREVWKTsKIAl9CiAKIAlzcmNfZHAgPSBYRlNfQkhWVE9JKHNyY19kaXJfYmRwKTsKLQl0YXJnZXRfZHAgPSBYRlNfQkhWVE9JKHRhcmdldF9kaXJfYmRwKTsKIAltcCA9IHNyY19kcC0+aV9tb3VudDsKIAogCWlmIChETV9FVkVOVF9FTkFCTEVEKHNyY19kaXJfdnAtPnZfdmZzcCwgc3JjX2RwLCBETV9FVkVOVF9SRU5BTUUpIHx8CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3J3LmMgYi9mcy94ZnMveGZzX3J3LmMKaW5kZXggYzRiMjA4Ny4uYTU5YzEwMiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ydy5jCisrKyBiL2ZzL3hmcy94ZnNfcncuYwpAQCAtMjM4LDYgKzIzOCw3IEBACiAJfQogCXJldHVybiAoRUlPKTsKIH0KKwogLyoKICAqIFByaW50cyBvdXQgYW4gQUxFUlQgbWVzc2FnZSBhYm91dCBJL08gZXJyb3IuCiAgKi8KQEAgLTI1MiwxMSArMjUzLDkgQEAKICAiSS9PIGVycm9yIGluIGZpbGVzeXN0ZW0gKFwiJXNcIikgbWV0YS1kYXRhIGRldiAlcyBibG9jayAweCVsbHgiCiAgIiAgICAgICAoXCIlc1wiKSBlcnJvciAlZCBidWYgY291bnQgJXpkIiwKIAkJKCFtcCB8fCAhbXAtPm1fZnNuYW1lKSA/ICIoZnMgbmFtZSBub3Qgc2V0KSIgOiBtcC0+bV9mc25hbWUsCi0JCVhGU19CVUZUQVJHX05BTUUoYnAtPnBiX3RhcmdldCksCi0JCShfX3VpbnQ2NF90KWJsa25vLAotCQlmdW5jLAotCQlYRlNfQlVGX0dFVEVSUk9SKGJwKSwKLQkJWEZTX0JVRl9DT1VOVChicCkpOworCQlYRlNfQlVGVEFSR19OQU1FKFhGU19CVUZfVEFSR0VUKGJwKSksCisJCShfX3VpbnQ2NF90KWJsa25vLCBmdW5jLAorCQlYRlNfQlVGX0dFVEVSUk9SKGJwKSwgWEZTX0JVRl9DT1VOVChicCkpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19zYi5oIGIvZnMveGZzL3hmc19zYi5oCmluZGV4IDRhMTdkMzMuLmJmMTY4YTkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfc2IuaAorKysgYi9mcy94ZnMveGZzX3NiLmgKQEAgLTY4LDE4ICs2OCw2IEBACiAJKFhGU19TQl9WRVJTSU9OX05VTUJJVFMgfCBcCiAJIFhGU19TQl9WRVJTSU9OX09LUkVBTEZCSVRTIHwgXAogCSBYRlNfU0JfVkVSU0lPTl9PS1NBU0hGQklUUykKLSNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fTUtGUyhpYSxkaWEsZXh0ZmxhZyxkaXJ2MixuYSxzZmxhZyxtb3JlYml0cykJXAotCSgoKGlhKSB8fCAoZGlhKSB8fCAoZXh0ZmxhZykgfHwgKGRpcnYyKSB8fCAobmEpIHx8IChzZmxhZykgfHwgXAotCSAgKG1vcmViaXRzKSkgPyBcCi0JCShYRlNfU0JfVkVSU0lPTl80IHwgXAotCQkgKChpYSkgPyBYRlNfU0JfVkVSU0lPTl9BTElHTkJJVCA6IDApIHwgXAotCQkgKChkaWEpID8gWEZTX1NCX1ZFUlNJT05fREFMSUdOQklUIDogMCkgfCBcCi0JCSAoKGV4dGZsYWcpID8gWEZTX1NCX1ZFUlNJT05fRVhURkxHQklUIDogMCkgfCBcCi0JCSAoKGRpcnYyKSA/IFhGU19TQl9WRVJTSU9OX0RJUlYyQklUIDogMCkgfCBcCi0JCSAoKG5hKSA/IFhGU19TQl9WRVJTSU9OX0xPR1YyQklUIDogMCkgfCBcCi0JCSAoKHNmbGFnKSA/IFhGU19TQl9WRVJTSU9OX1NFQ1RPUkJJVCA6IDApIHwgXAotCQkgKChtb3JlYml0cykgPyBYRlNfU0JfVkVSU0lPTl9NT1JFQklUU0JJVCA6IDApKSA6IFwKLQkJWEZTX1NCX1ZFUlNJT05fMSkKIAogLyoKICAqIFRoZXJlIGFyZSB0d28gd29yZHMgdG8gaG9sZCBYRlMgImZlYXR1cmUiIGJpdHM6IHRoZSBvcmlnaW5hbApAQCAtMTA1LDExICs5Myw2IEBACiAJKFhGU19TQl9WRVJTSU9OMl9PS1JFQUxGQklUUyB8CVwKIAkgWEZTX1NCX1ZFUlNJT04yX09LU0FTSEZCSVRTICkKIAotLyoKLSAqIG1rZnMgbWFjcm8gdG8gc2V0IHVwIHNiX2ZlYXR1cmVzMiB3b3JkCi0gKi8KLSNkZWZpbmUJWEZTX1NCX1ZFUlNJT04yX01LRlMocmVzdmQxLCBzYmNudHIpCTAKLQogdHlwZWRlZiBzdHJ1Y3QgeGZzX3NiCiB7CiAJX191aW50MzJfdAlzYl9tYWdpY251bTsJLyogbWFnaWMgbnVtYmVyID09IFhGU19TQl9NQUdJQyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFucy5jIGIvZnMveGZzL3hmc190cmFucy5jCmluZGV4IDI3OWUwNDMuLmQzZDcxNGUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnMuYworKysgYi9mcy94ZnMveGZzX3RyYW5zLmMKQEAgLTEwMTQsNiArMTAxNCw3IEBACiAJeGZzX2xvZ19pdGVtX3QJCSpsaXA7CiAJaW50CQkJaTsKICNlbmRpZgorCXhmc19tb3VudF90CQkqbXAgPSB0cC0+dF9tb3VudHA7CiAKIAkvKgogCSAqIFNlZSBpZiB0aGUgY2FsbGVyIGlzIGJlaW5nIHRvbyBsYXp5IHRvIGZpZ3VyZSBvdXQgaWYKQEAgLTEwMjYsOSArMTAyNywxMCBAQAogCSAqIGZpbGVzeXN0ZW0uICBUaGlzIGhhcHBlbnMgaW4gcGF0aHMgd2hlcmUgd2UgZGV0ZWN0CiAJICogY29ycnVwdGlvbiBhbmQgZGVjaWRlIHRvIGdpdmUgdXAuCiAJICovCi0JaWYgKCh0cC0+dF9mbGFncyAmIFhGU19UUkFOU19ESVJUWSkgJiYKLQkgICAgIVhGU19GT1JDRURfU0hVVERPV04odHAtPnRfbW91bnRwKSkKLQkJeGZzX2ZvcmNlX3NodXRkb3duKHRwLT50X21vdW50cCwgWEZTX0NPUlJVUFRfSU5DT1JFKTsKKwlpZiAoKHRwLT50X2ZsYWdzICYgWEZTX1RSQU5TX0RJUlRZKSAmJiAhWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX3RyYW5zX2NhbmNlbCIsIFhGU19FUlJMRVZFTF9MT1csIG1wKTsKKwkJeGZzX2ZvcmNlX3NodXRkb3duKG1wLCBYRlNfQ09SUlVQVF9JTkNPUkUpOworCX0KICNpZmRlZiBERUJVRwogCWlmICghKGZsYWdzICYgWEZTX1RSQU5TX0FCT1JUKSkgewogCQlsaWNwID0gJih0cC0+dF9pdGVtcyk7CkBAIC0xMDQwLDcgKzEwNDIsNyBAQAogCQkJCX0KIAogCQkJCWxpcCA9IGxpZHAtPmxpZF9pdGVtOwotCQkJCWlmICghWEZTX0ZPUkNFRF9TSFVURE9XTih0cC0+dF9tb3VudHApKQorCQkJCWlmICghWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCiAJCQkJCUFTU0VSVCghKGxpcC0+bGlfdHlwZSA9PSBYRlNfTElfRUZEKSk7CiAJCQl9CiAJCQlsaWNwID0gbGljcC0+bGljX25leHQ7CkBAIC0xMDQ4LDcgKzEwNTAsNyBAQAogCX0KICNlbmRpZgogCXhmc190cmFuc191bnJlc2VydmVfYW5kX21vZF9zYih0cCk7Ci0JWEZTX1RSQU5TX1VOUkVTRVJWRV9BTkRfTU9EX0RRVU9UUyh0cC0+dF9tb3VudHAsIHRwKTsKKwlYRlNfVFJBTlNfVU5SRVNFUlZFX0FORF9NT0RfRFFVT1RTKG1wLCB0cCk7CiAKIAlpZiAodHAtPnRfdGlja2V0KSB7CiAJCWlmIChmbGFncyAmIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMpIHsKQEAgLTEwNTcsNyArMTA1OSw3IEBACiAJCX0gZWxzZSB7CiAJCQlsb2dfZmxhZ3MgPSAwOwogCQl9Ci0JCXhmc19sb2dfZG9uZSh0cC0+dF9tb3VudHAsIHRwLT50X3RpY2tldCwgTlVMTCwgbG9nX2ZsYWdzKTsKKwkJeGZzX2xvZ19kb25lKG1wLCB0cC0+dF90aWNrZXQsIE5VTEwsIGxvZ19mbGFncyk7CiAJfQogCiAJLyogbWFyayB0aGlzIHRocmVhZCBhcyBubyBsb25nZXIgYmVpbmcgaW4gYSB0cmFuc2FjdGlvbiAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFucy5oIGIvZnMveGZzL3hmc190cmFucy5oCmluZGV4IGE4ODk5NjMuLmQ3NzkwMWMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnMuaAorKysgYi9mcy94ZnMveGZzX3RyYW5zLmgKQEAgLTk3Myw3ICs5NzMsNiBAQAogdm9pZAkJeGZzX3RyYW5zX2Job2xkX3JlbGVhc2UoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7CiB2b2lkCQl4ZnNfdHJhbnNfYmludmFsKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfYnVmICopOwogdm9pZAkJeGZzX3RyYW5zX2lub2RlX2J1Zih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqKTsKLXZvaWQJCXhmc190cmFuc19pbm9kZV9idWYoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7CiB2b2lkCQl4ZnNfdHJhbnNfc3RhbGVfaW5vZGVfYnVmKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfYnVmICopOwogdm9pZAkJeGZzX3RyYW5zX2RxdW90X2J1Zih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqLCB1aW50KTsKIHZvaWQJCXhmc190cmFuc19pbm9kZV9hbGxvY19idWYoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfdHJhbnNfaXRlbS5jCmluZGV4IDQ4NjE0N2UuLjExMTdkNjAgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnNfaXRlbS5jCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnNfaXRlbS5jCkBAIC03OCw3ICs3OCw3IEBACiAJCWxpZHAtPmxpZF9zaXplID0gMDsKIAkJbGlwLT5saV9kZXNjID0gbGlkcDsKIAkJbGlwLT5saV9tb3VudHAgPSB0cC0+dF9tb3VudHA7Ci0JCXJldHVybiAobGlkcCk7CisJCXJldHVybiBsaWRwOwogCX0KIAogCS8qCkBAIC0xMTksNyArMTE5LDcgQEAKIAlsaWRwLT5saWRfc2l6ZSA9IDA7CiAJbGlwLT5saV9kZXNjID0gbGlkcDsKIAlsaXAtPmxpX21vdW50cCA9IHRwLT50X21vdW50cDsKLQlyZXR1cm4gKGxpZHApOworCXJldHVybiBsaWRwOwogfQogCiAvKgpAQCAtMTgwLDcgKzE4MCw3IEBACiB7CiAJQVNTRVJUKGxpcC0+bGlfZGVzYyAhPSBOVUxMKTsKIAotCXJldHVybiAobGlwLT5saV9kZXNjKTsKKwlyZXR1cm4gbGlwLT5saV9kZXNjOwogfQogCiAKQEAgLTIxOSwxMCArMjE5LDEwIEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCXJldHVybiAoWEZTX0xJQ19TTE9UKGxpY3AsIGkpKTsKKwkJcmV0dXJuIFhGU19MSUNfU0xPVChsaWNwLCBpKTsKIAl9CiAJY21uX2VycihDRV9XQVJOLCAieGZzX3RyYW5zX2ZpcnN0X2l0ZW0oKSAtLSBubyBmaXJzdCBpdGVtIik7Ci0JcmV0dXJuKE5VTEwpOworCXJldHVybiBOVUxMOwogfQogCiAKQEAgLTI1Miw3ICsyNTIsNyBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQlyZXR1cm4gKFhGU19MSUNfU0xPVChsaWNwLCBpKSk7CisJCXJldHVybiBYRlNfTElDX1NMT1QobGljcCwgaSk7CiAJfQogCiAJLyoKQEAgLTI2MSw3ICsyNjEsNyBAQAogCSAqIElmIHRoZXJlIGlzIG5vIG5leHQgY2h1bmssIHJldHVybiBOVUxMLgogCSAqLwogCWlmIChsaWNwLT5saWNfbmV4dCA9PSBOVUxMKSB7Ci0JCXJldHVybiAoTlVMTCk7CisJCXJldHVybiBOVUxMOwogCX0KIAogCWxpY3AgPSBsaWNwLT5saWNfbmV4dDsKQEAgLTI3MSw3ICsyNzEsNyBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQlyZXR1cm4gKFhGU19MSUNfU0xPVChsaWNwLCBpKSk7CisJCXJldHVybiBYRlNfTElDX1NMT1QobGljcCwgaSk7CiAJfQogCUFTU0VSVCgwKTsKIAkvKiBOT1RSRUFDSEVEICovCkBAIC00MjUsNyArNDI1LDcgQEAKIAkJfQogCX0KIAotCXJldHVybiAoZnJlZWQpOworCXJldHVybiBmcmVlZDsKIH0KIAogCkBAIC00NzgsNyArNDc4LDcgQEAKIAkJICovCiAJCWxic3AtPmxiY19hZyA9IGFnOwogCQlsYnNwLT5sYmNfaWR4ID0gaWR4OwotCQlyZXR1cm4gKGxic3ApOworCQlyZXR1cm4gbGJzcDsKIAl9CiAKIAkvKgpAQCAtNTEyLDcgKzUxMiw3IEBACiAJdHAtPnRfYnVzeV9mcmVlLS07CiAJbGJzcC0+bGJjX2FnID0gYWc7CiAJbGJzcC0+bGJjX2lkeCA9IGlkeDsKLQlyZXR1cm4gKGxic3ApOworCXJldHVybiBsYnNwOwogfQogCiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdXRpbHMuYyBiL2ZzL3hmcy94ZnNfdXRpbHMuYwppbmRleCBmZWZlMWQ2Li4zNDY1NGVjIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3V0aWxzLmMKKysrIGIvZnMveGZzL3hmc191dGlscy5jCkBAIC01NSwxNiArNTUsMTMgQEAKIAl4ZnNfaW5vZGVfdAkqKmlwcCkKIHsKIAl2bm9kZV90CQkqdnA7Ci0JYmh2X2Rlc2NfdAkqYmRwOwogCiAJdnAgPSBWTkFNRV9UT19WTk9ERShkZW50cnkpOwotCWJkcCA9IHZuX2Jodl9sb29rdXBfdW5sb2NrZWQoVk5fQkhWX0hFQUQodnApLCAmeGZzX3Zub2Rlb3BzKTsKLQlpZiAoIWJkcCkgewotCQkqaXBwID0gTlVMTDsKKworCSppcHAgPSB4ZnNfdnRvaSh2cCk7CisJaWYgKCEqaXBwKQogCQlyZXR1cm4gWEZTX0VSUk9SKEVOT0VOVCk7Ci0JfQogCVZOX0hPTEQodnApOwotCSppcHAgPSBYRlNfQkhWVE9JKGJkcCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdmZzb3BzLmMgYi9mcy94ZnMveGZzX3Zmc29wcy5jCmluZGV4IDdiZGJkOTkuLmI2YWQzNzAgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdmZzb3BzLmMKKysrIGIvZnMveGZzL3hmc192ZnNvcHMuYwpAQCAtNTMsNiArNTMsNyBAQAogI2luY2x1ZGUgInhmc19hY2wuaCIKICNpbmNsdWRlICJ4ZnNfYXR0ci5oIgogI2luY2x1ZGUgInhmc19jbG50LmgiCisjaW5jbHVkZSAieGZzX2Zzb3BzLmgiCiAKIFNUQVRJQyBpbnQgeGZzX3N5bmMoYmh2X2Rlc2NfdCAqLCBpbnQsIGNyZWRfdCAqKTsKIApAQCAtMjkwLDggKzI5MSw4IEBACiAJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9JREVMRVRFOwogCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfRElSU1lOQykKIAkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0RJUlNZTkM7Ci0JaWYgKGFwLT5mbGFncyAmIFhGU01OVF9DT01QQVRfQVRUUikKLQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0NPTVBBVF9BVFRSOworCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfQVRUUjIpCisJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9BVFRSMjsKIAogCWlmIChhcC0+ZmxhZ3MyICYgWEZTTU5UMl9DT01QQVRfSU9TSVpFKQogCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfQ09NUEFUX0lPU0laRTsKQEAgLTMxMiw2ICszMTMsOCBAQAogCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfTk9VVUlEOwogCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfQkFSUklFUikKIAkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0JBUlJJRVI7CisJZWxzZQorCQltcC0+bV9mbGFncyAmPSB+WEZTX01PVU5UX0JBUlJJRVI7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMzMCwxMCArMzMzLDExIEBACiAKIAkvKiBGYWlsIGEgbW91bnQgd2hlcmUgdGhlIGxvZ2J1ZiBpcyBzbWFsbGVyIHRoZW4gdGhlIGxvZyBzdHJpcGUgKi8KIAlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoJm1wLT5tX3NiKSkgewotCQlpZiAoKGFwLT5sb2didWZzaXplID09IC0xKSAmJgorCQlpZiAoKGFwLT5sb2didWZzaXplIDw9IDApICYmCiAJCSAgICAobXAtPm1fc2Iuc2JfbG9nc3VuaXQgPiBYTE9HX0JJR19SRUNPUkRfQlNJWkUpKSB7CiAJCQltcC0+bV9sb2dic2l6ZSA9IG1wLT5tX3NiLnNiX2xvZ3N1bml0OwotCQl9IGVsc2UgaWYgKGFwLT5sb2didWZzaXplIDwgbXAtPm1fc2Iuc2JfbG9nc3VuaXQpIHsKKwkJfSBlbHNlIGlmIChhcC0+bG9nYnVmc2l6ZSA+IDAgJiYKKwkJCSAgIGFwLT5sb2didWZzaXplIDwgbXAtPm1fc2Iuc2JfbG9nc3VuaXQpIHsKIAkJCWNtbl9lcnIoQ0VfV0FSTiwKIAkiWEZTOiBsb2didWYgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBsb2cgc3RyaXBlIHNpemUiKTsKIAkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKQEAgLTM0Nyw2ICszNTEsMTAgQEAKIAkJfQogCX0KIAorCWlmIChYRlNfU0JfVkVSU0lPTl9IQVNBVFRSMigmbXAtPm1fc2IpKSB7CisJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9BVFRSMjsKKwl9CisKIAkvKgogCSAqIHByb2hpYml0IHIvdyBtb3VudHMgb2YgcmVhZC1vbmx5IGZpbGVzeXN0ZW1zCiAJICovCkBAIC0zODIsMTAgKzM5MCw2IEBACiAJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CiAJfQogCi0JaWYgKFhGU19TQl9WRVJTSU9OX0hBU0FUVFIyKCZtcC0+bV9zYikpIHsKLQkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF9DT01QQVRfQVRUUjsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNTA0LDEzICs1MDgsMTMgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyb3IyOwogCisJaWYgKChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9CQVJSSUVSKSAmJiAhKHZmc3AtPnZmc19mbGFnICYgVkZTX1JET05MWSkpCisJCXhmc19tb3VudGZzX2NoZWNrX2JhcnJpZXJzKG1wKTsKKwogCWVycm9yID0gWEZTX0lPSU5JVCh2ZnNwLCBhcmdzLCBmbGFncyk7CiAJaWYgKGVycm9yKQogCQlnb3RvIGVycm9yMjsKIAotCWlmICgoYXJncy0+ZmxhZ3MgJiBYRlNNTlRfQkFSUklFUikgJiYKLQkgICAgIShYRlNfTVRPVkZTKG1wKS0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKSkKLQkJeGZzX21vdW50ZnNfY2hlY2tfYmFycmllcnMobXApOwogCXJldHVybiAwOwogCiBlcnJvcjI6CkBAIC02NTUsNiArNjU5LDExIEBACiAJZWxzZQogCQltcC0+bV9mbGFncyAmPSB+WEZTX01PVU5UX05PQVRJTUU7CiAKKwlpZiAoYXJncy0+ZmxhZ3MgJiBYRlNNTlRfQkFSUklFUikKKwkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0JBUlJJRVI7CisJZWxzZQorCQltcC0+bV9mbGFncyAmPSB+WEZTX01PVU5UX0JBUlJJRVI7CisKIAlpZiAoKHZmc3AtPnZmc19mbGFnICYgVkZTX1JET05MWSkgJiYKIAkgICAgISgqZmxhZ3MgJiBNU19SRE9OTFkpKSB7CiAJCXZmc3AtPnZmc19mbGFnICY9IH5WRlNfUkRPTkxZOwpAQCAtMTYzNCw2ICsxNjQzLDcgQEAKICNkZWZpbmUgTU5UT1BUX05PUkVDT1ZFUlkgICAibm9yZWNvdmVyeSIgICAvKiBkb24ndCBydW4gWEZTIHJlY292ZXJ5ICovCiAjZGVmaW5lIE1OVE9QVF9CQVJSSUVSCSJiYXJyaWVyIgkvKiB1c2Ugd3JpdGVyIGJhcnJpZXJzIGZvciBsb2cgd3JpdGUgYW5kCiAJCQkJCSAqIHVud3JpdHRlbiBleHRlbnQgY29udmVyc2lvbiAqLworI2RlZmluZSBNTlRPUFRfTk9CQVJSSUVSICJub2JhcnJpZXIiCS8qIC4uIGRpc2FibGUgKi8KICNkZWZpbmUgTU5UT1BUX09TWU5DSVNPU1lOQyAib3N5bmNpc29zeW5jIiAvKiBvX3N5bmMgaXMgUkVBTExZIG9fc3luYyAqLwogI2RlZmluZSBNTlRPUFRfNjRCSVRJTk9ERSAgICJpbm9kZTY0IgkvKiBpbm9kZXMgY2FuIGJlIGFsbG9jYXRlZCBhbnl3aGVyZSAqLwogI2RlZmluZSBNTlRPUFRfSUtFRVAJImlrZWVwIgkJLyogZG8gbm90IGZyZWUgZW1wdHkgaW5vZGUgY2x1c3RlcnMgKi8KQEAgLTE2ODAsNyArMTY5MCw2IEBACiAJaW50CQkJaW9zaXplOwogCiAJYXJncy0+ZmxhZ3MyIHw9IFhGU01OVDJfQ09NUEFUX0lPU0laRTsKLQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfQ09NUEFUX0FUVFI7CiAKICNpZiAwCS8qIFhYWDogb2ZmIGJ5IGRlZmF1bHQsIHVudGlsIHNvbWUgcmVtYWluaW5nIGlzc3VlcyBpcm9uZWQgb3V0ICovCiAJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0lERUxFVEU7IC8qIGRlZmF1bHQgdG8gb24gKi8KQEAgLTE4MDYsNiArMTgxNSw4IEBACiAJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfTk9VVUlEOwogCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfQkFSUklFUikpIHsKIAkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9CQVJSSUVSOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTk9CQVJSSUVSKSkgeworCQkJYXJncy0+ZmxhZ3MgJj0gflhGU01OVF9CQVJSSUVSOwogCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfSUtFRVApKSB7CiAJCQlhcmdzLT5mbGFncyAmPSB+WEZTTU5UX0lERUxFVEU7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9OT0lLRUVQKSkgewpAQCAtMTgxNSw5ICsxODI2LDkgQEAKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX05PTEFSR0VJTykpIHsKIAkJCWFyZ3MtPmZsYWdzMiB8PSBYRlNNTlQyX0NPTVBBVF9JT1NJWkU7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9BVFRSMikpIHsKLQkJCWFyZ3MtPmZsYWdzICY9IH5YRlNNTlRfQ09NUEFUX0FUVFI7CisJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfQVRUUjI7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9OT0FUVFIyKSkgewotCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0NPTVBBVF9BVFRSOworCQkJYXJncy0+ZmxhZ3MgJj0gflhGU01OVF9BVFRSMjsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgIm9zeW5jaXNkc3luYyIpKSB7CiAJCQkvKiBuby1vcCwgdGhpcyBpcyBub3cgdGhlIGRlZmF1bHQgKi8KIHByaW50aygiWEZTOiBvc3luY2lzZHN5bmMgaXMgbm93IHRoZSBkZWZhdWx0LCBvcHRpb24gaXMgZGVwcmVjYXRlZC5cbiIpOwpAQCAtMTg5Miw3ICsxOTAzLDYgQEAKIAkJeyBYRlNfTU9VTlRfTk9VVUlELAkJIiwiIE1OVE9QVF9OT1VVSUQgfSwKIAkJeyBYRlNfTU9VTlRfTk9SRUNPVkVSWSwJCSIsIiBNTlRPUFRfTk9SRUNPVkVSWSB9LAogCQl7IFhGU19NT1VOVF9PU1lOQ0lTT1NZTkMsCSIsIiBNTlRPUFRfT1NZTkNJU09TWU5DIH0sCi0JCXsgWEZTX01PVU5UX0JBUlJJRVIsCQkiLCIgTU5UT1BUX0JBUlJJRVIgfSwKIAkJeyBYRlNfTU9VTlRfSURFTEVURSwJCSIsIiBNTlRPUFRfTk9JS0VFUCB9LAogCQl7IDAsIE5VTEwgfQogCX07CkBAIC0xOTE0LDMzICsxOTI0LDI4IEBACiAKIAlpZiAobXAtPm1fbG9nYnVmcyA+IDApCiAJCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9MT0dCVUZTICI9JWQiLCBtcC0+bV9sb2didWZzKTsKLQogCWlmIChtcC0+bV9sb2dic2l6ZSA+IDApCiAJCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9MT0dCU0laRSAiPSVkayIsIG1wLT5tX2xvZ2JzaXplID4+IDEwKTsKIAogCWlmIChtcC0+bV9sb2duYW1lKQogCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfTE9HREVWICI9JXMiLCBtcC0+bV9sb2duYW1lKTsKLQogCWlmIChtcC0+bV9ydG5hbWUpCiAJCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9SVERFViAiPSVzIiwgbXAtPm1fcnRuYW1lKTsKIAogCWlmIChtcC0+bV9kYWxpZ24gPiAwKQogCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfU1VOSVQgIj0lZCIsCiAJCQkJKGludClYRlNfRlNCX1RPX0JCKG1wLCBtcC0+bV9kYWxpZ24pKTsKLQogCWlmIChtcC0+bV9zd2lkdGggPiAwKQogCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfU1dJRFRIICI9JWQiLAogCQkJCShpbnQpWEZTX0ZTQl9UT19CQihtcCwgbXAtPm1fc3dpZHRoKSk7CiAKLQlpZiAoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9DT01QQVRfQVRUUikpCi0JCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9BVFRSMik7Ci0KIAlpZiAoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9DT01QQVRfSU9TSVpFKSkKIAkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX0xBUkdFSU8pOworCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9CQVJSSUVSKQorCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfQkFSUklFUik7CiAKIAlpZiAoISh2ZnNwLT52ZnNfZmxhZyAmIFZGU18zMkJJVElOT0RFUykpCiAJCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF82NEJJVElOT0RFKTsKLQogCWlmICh2ZnNwLT52ZnNfZmxhZyAmIFZGU19HUlBJRCkKIAkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX0dSUElEKTsKIApAQCAtMTk1OSw2ICsxOTY0LDcgQEAKIAkvKiBQdXNoIHRoZSBzdXBlcmJsb2NrIGFuZCB3cml0ZSBhbiB1bm1vdW50IHJlY29yZCAqLwogCXhmc19sb2dfdW5tb3VudF93cml0ZShtcCk7CiAJeGZzX3VubW91bnRmc193cml0ZXNiKG1wKTsKKwl4ZnNfZnNfbG9nX2R1bW15KG1wKTsKIH0KIAogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3Zub2Rlb3BzLmMgYi9mcy94ZnMveGZzX3Zub2Rlb3BzLmMKaW5kZXggZTAzZmEyYS4uZWFhYjM1NSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc192bm9kZW9wcy5jCisrKyBiL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYwpAQCAtMTUsNiArMTUsOSBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKICAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCisKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisKICNpbmNsdWRlICJ4ZnMuaCIKICNpbmNsdWRlICJ4ZnNfZnMuaCIKICNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKQEAgLTE4Miw4ICsxODUsNyBAQAogCQlicmVhazsKIAl9CiAKLQl2YXAtPnZhX2F0aW1lLnR2X3NlYyA9IGlwLT5pX2QuZGlfYXRpbWUudF9zZWM7Ci0JdmFwLT52YV9hdGltZS50dl9uc2VjID0gaXAtPmlfZC5kaV9hdGltZS50X25zZWM7CisJdm5fYXRpbWVfdG9fdGltZXNwZWModnAsICZ2YXAtPnZhX2F0aW1lKTsKIAl2YXAtPnZhX210aW1lLnR2X3NlYyA9IGlwLT5pX2QuZGlfbXRpbWUudF9zZWM7CiAJdmFwLT52YV9tdGltZS50dl9uc2VjID0gaXAtPmlfZC5kaV9tdGltZS50X25zZWM7CiAJdmFwLT52YV9jdGltZS50dl9zZWMgPSBpcC0+aV9kLmRpX2N0aW1lLnRfc2VjOwpAQCAtMzM2LDcgKzMzOCw3IEBACiAJCWNvZGUgPSBYRlNfUU1fRFFWT1BBTExPQyhtcCwgaXAsIHVpZCwgZ2lkLCBwcm9qaWQsIHFmbGFncywKIAkJCQkJICZ1ZHFwLCAmZ2RxcCk7CiAJCWlmIChjb2RlKQotCQkJcmV0dXJuIChjb2RlKTsKKwkJCXJldHVybiBjb2RlOwogCX0KIAogCS8qCkBAIC01NDEsMjQgKzU0Myw2IEBACiAJCX0KIAogCQkvKgotCQkgKiBDYW4ndCBzZXQgZXh0ZW50IHNpemUgdW5sZXNzIHRoZSBmaWxlIGlzIG1hcmtlZCwgb3IKLQkJICogYWJvdXQgdG8gYmUgbWFya2VkIGFzIGEgcmVhbHRpbWUgZmlsZS4KLQkJICoKLQkJICogVGhpcyBjaGVjayB3aWxsIGJlIHJlbW92ZWQgd2hlbiBmaXhlZCBzaXplIGV4dGVudHMKLQkJICogd2l0aCBidWZmZXJlZCBkYXRhIHdyaXRlcyBpcyBpbXBsZW1lbnRlZC4KLQkJICoKLQkJICovCi0JCWlmICgobWFzayAmIFhGU19BVF9FWFRTSVpFKQkJCSYmCi0JCSAgICAoKGlwLT5pX2QuZGlfZXh0c2l6ZSA8PCBtcC0+bV9zYi5zYl9ibG9ja2xvZykgIT0KLQkJICAgICB2YXAtPnZhX2V4dHNpemUpICYmCi0JCSAgICAoISgoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpIHx8Ci0JCSAgICAgICAoKG1hc2sgJiBYRlNfQVRfWEZMQUdTKSAmJgotCQkJKHZhcC0+dmFfeGZsYWdzICYgWEZTX1hGTEFHX1JFQUxUSU1FKSkpKSkgewotCQkJY29kZSA9IFhGU19FUlJPUihFSU5WQUwpOwotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCQkvKgogCQkgKiBDYW4ndCBjaGFuZ2UgcmVhbHRpbWUgZmxhZyBpZiBhbnkgZXh0ZW50cyBhcmUgYWxsb2NhdGVkLgogCQkgKi8KIAkJaWYgKChpcC0+aV9kLmRpX25leHRlbnRzIHx8IGlwLT5pX2RlbGF5ZWRfYmxrcykgJiYKQEAgLTgyMCwxMyArODA0LDE3IEBACiAJCQkJCWRpX2ZsYWdzIHw9IFhGU19ESUZMQUdfUlRJTkhFUklUOwogCQkJCWlmICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19OT1NZTUxJTktTKQogCQkJCQlkaV9mbGFncyB8PSBYRlNfRElGTEFHX05PU1lNTElOS1M7Ci0JCQl9IGVsc2UgeworCQkJCWlmICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19FWFRTWklOSEVSSVQpCisJCQkJCWRpX2ZsYWdzIHw9IFhGU19ESUZMQUdfRVhUU1pJTkhFUklUOworCQkJfSBlbHNlIGlmICgoaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGUkVHKSB7CiAJCQkJaWYgKHZhcC0+dmFfeGZsYWdzICYgWEZTX1hGTEFHX1JFQUxUSU1FKSB7CiAJCQkJCWRpX2ZsYWdzIHw9IFhGU19ESUZMQUdfUkVBTFRJTUU7CiAJCQkJCWlwLT5pX2lvY29yZS5pb19mbGFncyB8PSBYRlNfSU9DT1JFX1JUOwogCQkJCX0gZWxzZSB7CiAJCQkJCWlwLT5pX2lvY29yZS5pb19mbGFncyAmPSB+WEZTX0lPQ09SRV9SVDsKIAkJCQl9CisJCQkJaWYgKHZhcC0+dmFfeGZsYWdzICYgWEZTX1hGTEFHX0VYVFNJWkUpCisJCQkJCWRpX2ZsYWdzIHw9IFhGU19ESUZMQUdfRVhUU0laRTsKIAkJCX0KIAkJCWlwLT5pX2QuZGlfZmxhZ3MgPSBkaV9mbGFnczsKIAkJfQpAQCAtOTk2LDEwICs5ODQsNiBAQAogCQlnb3RvIGVycm9yX3JldHVybjsKIAl9CiAKLQlpZiAoIShpb2ZsYWdzICYgSU9fSU5WSVMpKSB7Ci0JCXhmc19pY2hndGltZShpcCwgWEZTX0lDSEdUSU1FX0FDQyk7Ci0JfQotCiAJLyoKIAkgKiBTZWUgaWYgdGhlIHN5bWxpbmsgaXMgc3RvcmVkIGlubGluZS4KIAkgKi8KQEAgLTEwNDMsMTEgKzEwMjcsOCBAQAogCiAJfQogCi0KIGVycm9yX3JldHVybjoKLQogCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKLQogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMTIyMiw3ICsxMjAzLDcgQEAKIAlsYXN0X2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgKHhmc191ZnNpemVfdClYRlNfTUFYSU9GRlNFVChtcCkpOwogCW1hcF9sZW4gPSBsYXN0X2ZzYiAtIGVuZF9mc2I7CiAJaWYgKG1hcF9sZW4gPD0gMCkKLQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuIDA7CiAKIAluaW1hcHMgPSAxOwogCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CkBAIC0xMjMxLDEyICsxMjEyLDEzIEBACiAJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwogCiAJaWYgKCFlcnJvciAmJiAobmltYXBzICE9IDApICYmCi0JICAgIChpbWFwLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0spKSB7CisJICAgIChpbWFwLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0sgfHwKKwkgICAgIGlwLT5pX2RlbGF5ZWRfYmxrcykpIHsKIAkJLyoKIAkJICogQXR0YWNoIHRoZSBkcXVvdHMgdG8gdGhlIGlub2RlIHVwIGZyb250LgogCQkgKi8KIAkJaWYgKChlcnJvciA9IFhGU19RTV9EUUFUVEFDSChtcCwgaXAsIDApKSkKLQkJCXJldHVybiAoZXJyb3IpOworCQkJcmV0dXJuIGVycm9yOwogCiAJCS8qCiAJCSAqIFRoZXJlIGFyZSBibG9ja3MgYWZ0ZXIgdGhlIGVuZCBvZiBmaWxlLgpAQCAtMTI2NCw3ICsxMjQ2LDcgQEAKIAkJCUFTU0VSVChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSk7CiAJCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKIAkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOwotCQkJcmV0dXJuIChlcnJvcik7CisJCQlyZXR1cm4gZXJyb3I7CiAJCX0KIAogCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKQEAgLTEyOTIsNyArMTI3NCw3IEBACiAJCX0KIAkJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCB8IFhGU19JTE9DS19FWENMKTsKIAl9Ci0JcmV0dXJuIChlcnJvcik7CisJcmV0dXJuIGVycm9yOwogfQogCiAvKgpAQCAtMTQ3MCw3ICsxNDUyLDcgQEAKIAlpZiAoZXJyb3IpIHsKIAkJeGZzX3RyYW5zX2NhbmNlbCgqdHBwLCAwKTsKIAkJKnRwcCA9IE5VTEw7Ci0JCXJldHVybiAoZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CiAJfQogCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOwogCkBAIC0xNDgzLDcgKzE0NjUsNyBAQAogCQkJCSAgWEZTX0RBVEFfRk9SSyk7CiAJCUFTU0VSVChpcC0+aV9kZi5pZl9ieXRlcyA9PSAwKTsKIAl9Ci0JcmV0dXJuICgwKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTE1MDksNyArMTQ5MSw3IEBACiAJaWYgKGVycm9yKSB7CiAJCSp0cHAgPSBOVUxMOwogCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKLQkJcmV0dXJuIChlcnJvcik7IC8qIGdvdG8gb3V0Ki8KKwkJcmV0dXJuIGVycm9yOyAvKiBnb3RvIG91dCAqLwogCX0KIAogCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfSU5BQ1RJVkUpOwpAQCAtMTUyMiw3ICsxNTA0LDcgQEAKIAkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CiAJCSp0cHAgPSBOVUxMOwogCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKLQkJcmV0dXJuIChlcnJvcik7CisJCXJldHVybiBlcnJvcjsKIAl9CiAKIAl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKQEAgLTE1MzMsNyArMTUxNSw3IEBACiAJQVNTRVJUKGlwLT5pX2QuZGlfYW5leHRlbnRzID09IDApOwogCiAJKnRwcCA9IHRwOwotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CiAKIFNUQVRJQyBpbnQKQEAgLTE1NjYsMTEgKzE1NDgsMTMgQEAKIAogCWlmIChpcC0+aV9kLmRpX25saW5rICE9IDApIHsKIAkJaWYgKCgoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRlJFRykgJiYKLQkJICAgICAoKGlwLT5pX2QuZGlfc2l6ZSA+IDApIHx8IChWTl9DQUNIRUQodnApID4gMCkpICYmCisJCSAgICAgKChpcC0+aV9kLmRpX3NpemUgPiAwKSB8fCAoVk5fQ0FDSEVEKHZwKSA+IDAgfHwKKwkJICAgICAgIGlwLT5pX2RlbGF5ZWRfYmxrcyA+IDApKSAmJgogCQkgICAgIChpcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpKSAgJiYKLQkJICAgICghKGlwLT5pX2QuZGlfZmxhZ3MgJiAoWEZTX0RJRkxBR19QUkVBTExPQ3xYRlNfRElGTEFHX0FQUEVORCkpKSkgeworCQkgICAgKCEoaXAtPmlfZC5kaV9mbGFncyAmCisJCQkJKFhGU19ESUZMQUdfUFJFQUxMT0MgfCBYRlNfRElGTEFHX0FQUEVORCkpKSkgewogCQkJaWYgKChlcnJvciA9IHhmc19pbmFjdGl2ZV9mcmVlX2VvZmJsb2NrcyhtcCwgaXApKSkKLQkJCQlyZXR1cm4gKGVycm9yKTsKKwkJCQlyZXR1cm4gZXJyb3I7CiAJCQkvKiBVcGRhdGUgbGludXggaW5vZGUgYmxvY2sgY291bnQgYWZ0ZXIgZnJlZSBhYm92ZSAqLwogCQkJTElOVkZTX0dFVF9JUCh2cCktPmlfYmxvY2tzID0gWEZTX0ZTQl9UT19CQihtcCwKIAkJCQlpcC0+aV9kLmRpX25ibG9ja3MgKyBpcC0+aV9kZWxheWVkX2Jsa3MpOwpAQCAtMTYyNSw3ICsxNjA5LDggQEAKIAkgKiBvbmx5IG9uZSB3aXRoIGEgcmVmZXJlbmNlIHRvIHRoZSBpbm9kZS4KIAkgKi8KIAl0cnVuY2F0ZSA9ICgoaXAtPmlfZC5kaV9ubGluayA9PSAwKSAmJgotCSAgICAoKGlwLT5pX2QuZGlfc2l6ZSAhPSAwKSB8fCAoaXAtPmlfZC5kaV9uZXh0ZW50cyA+IDApKSAmJgorICAgICAgICAgICAgKChpcC0+aV9kLmRpX3NpemUgIT0gMCkgfHwgKGlwLT5pX2QuZGlfbmV4dGVudHMgPiAwKSB8fAorICAgICAgICAgICAgIChpcC0+aV9kZWxheWVkX2Jsa3MgPiAwKSkgJiYKIAkgICAgKChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZSRUcpKTsKIAogCW1wID0gaXAtPmlfbW91bnQ7CkBAIC0xNjQzLDEyICsxNjI4LDE0IEBACiAKIAlpZiAoaXAtPmlfZC5kaV9ubGluayAhPSAwKSB7CiAJCWlmICgoKChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZSRUcpICYmCi0JCSAgICAgKChpcC0+aV9kLmRpX3NpemUgPiAwKSB8fCAoVk5fQ0FDSEVEKHZwKSA+IDApKSAmJgotCQkgICAgIChpcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpKSAgJiYKLQkJICAgICghKGlwLT5pX2QuZGlfZmxhZ3MgJiAoWEZTX0RJRkxBR19QUkVBTExPQ3xYRlNfRElGTEFHX0FQUEVORCkpIHx8Ci0JCSAgICAgKGlwLT5pX2RlbGF5ZWRfYmxrcyAhPSAwKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICgoaXAtPmlfZC5kaV9zaXplID4gMCkgfHwgKFZOX0NBQ0hFRCh2cCkgPiAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgIGlwLT5pX2RlbGF5ZWRfYmxrcyA+IDApKSAmJgorCQkgICAgICAoaXAtPmlfZGYuaWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSAmJgorCQkgICAgICghKGlwLT5pX2QuZGlfZmxhZ3MgJgorCQkJCShYRlNfRElGTEFHX1BSRUFMTE9DIHwgWEZTX0RJRkxBR19BUFBFTkQpKSB8fAorCQkgICAgICAoaXAtPmlfZGVsYXllZF9ibGtzICE9IDApKSkpIHsKIAkJCWlmICgoZXJyb3IgPSB4ZnNfaW5hY3RpdmVfZnJlZV9lb2ZibG9ja3MobXAsIGlwKSkpCi0JCQkJcmV0dXJuIChWTl9JTkFDVElWRV9DQUNIRSk7CisJCQkJcmV0dXJuIFZOX0lOQUNUSVZFX0NBQ0hFOwogCQkJLyogVXBkYXRlIGxpbnV4IGlub2RlIGJsb2NrIGNvdW50IGFmdGVyIGZyZWUgYWJvdmUgKi8KIAkJCUxJTlZGU19HRVRfSVAodnApLT5pX2Jsb2NrcyA9IFhGU19GU0JfVE9fQkIobXAsCiAJCQkJaXAtPmlfZC5kaV9uYmxvY2tzICsgaXAtPmlfZGVsYXllZF9ibGtzKTsKQEAgLTE2NTksNyArMTY0Niw3IEBACiAJQVNTRVJUKGlwLT5pX2QuZGlfbmxpbmsgPT0gMCk7CiAKIAlpZiAoKGVycm9yID0gWEZTX1FNX0RRQVRUQUNIKG1wLCBpcCwgMCkpKQotCQlyZXR1cm4gKFZOX0lOQUNUSVZFX0NBQ0hFKTsKKwkJcmV0dXJuIFZOX0lOQUNUSVZFX0NBQ0hFOwogCiAJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19JTkFDVElWRSk7CiAJaWYgKHRydW5jYXRlKSB7CkBAIC0xNjgyLDcgKzE2NjksNyBAQAogCQkJQVNTRVJUKFhGU19GT1JDRURfU0hVVERPV04obXApKTsKIAkJCXhmc190cmFuc19jYW5jZWwodHAsIDApOwogCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7Ci0JCQlyZXR1cm4gKFZOX0lOQUNUSVZFX0NBQ0hFKTsKKwkJCXJldHVybiBWTl9JTkFDVElWRV9DQUNIRTsKIAkJfQogCiAJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwpAQCAtMTcwMyw3ICsxNjkwLDcgQEAKIAkJCXhmc190cmFuc19jYW5jZWwodHAsCiAJCQkJWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUyB8IFhGU19UUkFOU19BQk9SVCk7CiAJCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lPTE9DS19FWENMIHwgWEZTX0lMT0NLX0VYQ0wpOwotCQkJcmV0dXJuIChWTl9JTkFDVElWRV9DQUNIRSk7CisJCQlyZXR1cm4gVk5fSU5BQ1RJVkVfQ0FDSEU7CiAJCX0KIAl9IGVsc2UgaWYgKChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZMTkspIHsKIApAQCAtMTcxNyw3ICsxNzA0LDcgQEAKIAogCQlpZiAoZXJyb3IpIHsKIAkJCUFTU0VSVCh0cCA9PSBOVUxMKTsKLQkJCXJldHVybiAoVk5fSU5BQ1RJVkVfQ0FDSEUpOworCQkJcmV0dXJuIFZOX0lOQUNUSVZFX0NBQ0hFOwogCQl9CiAKIAkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lPTE9DS19FWENMIHwgWEZTX0lMT0NLX0VYQ0wpOwpAQCAtMTczMCw3ICsxNzE3LDcgQEAKIAkJaWYgKGVycm9yKSB7CiAJCQlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpOwogCQkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7Ci0JCQlyZXR1cm4gKFZOX0lOQUNUSVZFX0NBQ0hFKTsKKwkJCXJldHVybiBWTl9JTkFDVElWRV9DQUNIRTsKIAkJfQogCiAJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOwpAQCAtMTc1Miw3ICsxNzM5LDcgQEAKIAkJICogY2FuY2VsbGVkLCBhbmQgdGhlIGlub2RlIGlzIHVubG9ja2VkLiBKdXN0IGdldCBvdXQuCiAJCSAqLwogCQkgaWYgKGVycm9yKQotCQkJIHJldHVybiAoVk5fSU5BQ1RJVkVfQ0FDSEUpOworCQkJIHJldHVybiBWTl9JTkFDVElWRV9DQUNIRTsKIAl9IGVsc2UgaWYgKGlwLT5pX2FmcCkgewogCQl4ZnNfaWRlc3Ryb3lfZm9yayhpcCwgWEZTX0FUVFJfRk9SSyk7CiAJfQpAQCAtMjA1OSw4ICsyMDQ2LDggQEAKICBhYm9ydF9yZXR1cm46CiAJY2FuY2VsX2ZsYWdzIHw9IFhGU19UUkFOU19BQk9SVDsKIAkvKiBGQUxMVEhST1VHSCAqLwotIGVycm9yX3JldHVybjoKIAorIGVycm9yX3JldHVybjoKIAlpZiAodHAgIT0gTlVMTCkKIAkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgY2FuY2VsX2ZsYWdzKTsKIApAQCAtMjU5MCw3ICsyNTc3LDYgQEAKIAlpbnQJCQljYW5jZWxfZmxhZ3M7CiAJaW50CQkJY29tbWl0dGVkOwogCXZub2RlX3QJCQkqdGFyZ2V0X2Rpcl92cDsKLQliaHZfZGVzY190CQkqc3JjX2JkcDsKIAlpbnQJCQlyZXNibGtzOwogCWNoYXIJCQkqdGFyZ2V0X25hbWUgPSBWTkFNRShkZW50cnkpOwogCWludAkJCXRhcmdldF9uYW1lbGVuOwpAQCAtMjYwMyw4ICsyNTg5LDcgQEAKIAlpZiAoVk5fSVNESVIoc3JjX3ZwKSkKIAkJcmV0dXJuIFhGU19FUlJPUihFUEVSTSk7CiAKLQlzcmNfYmRwID0gdm5fYmh2X2xvb2t1cF91bmxvY2tlZChWTl9CSFZfSEVBRChzcmNfdnApLCAmeGZzX3Zub2Rlb3BzKTsKLQlzaXAgPSBYRlNfQkhWVE9JKHNyY19iZHApOworCXNpcCA9IHhmc192dG9pKHNyY192cCk7CiAJdGRwID0gWEZTX0JIVlRPSSh0YXJnZXRfZGlyX2JkcCk7CiAJbXAgPSB0ZHAtPmlfbW91bnQ7CiAJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQpAQCAtMjczNiw5ICsyNzIxLDkgQEAKICBhYm9ydF9yZXR1cm46CiAJY2FuY2VsX2ZsYWdzIHw9IFhGU19UUkFOU19BQk9SVDsKIAkvKiBGQUxMVEhST1VHSCAqLworCiAgZXJyb3JfcmV0dXJuOgogCXhmc190cmFuc19jYW5jZWwodHAsIGNhbmNlbF9mbGFncyk7Ci0KIAlnb3RvIHN0ZF9yZXR1cm47CiB9CiAvKgpAQCAtMzIxMSwxMCArMzE5NiwxMiBAQAogCX0KIAlyZXR1cm4gZXJyb3I7CiAKLSBlcnJvcjE6CitlcnJvcjE6CiAJeGZzX2JtYXBfY2FuY2VsKCZmcmVlX2xpc3QpOwogCWNhbmNlbF9mbGFncyB8PSBYRlNfVFJBTlNfQUJPUlQ7Ci0gZXJyb3JfcmV0dXJuOgorCS8qIEZBTExUSFJPVUdIICovCisKK2Vycm9yX3JldHVybjoKIAl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBjYW5jZWxfZmxhZ3MpOwogCWdvdG8gc3RkX3JldHVybjsKIH0KQEAgLTMyMzcsNyArMzIyNCw2IEBACiAJeGZzX3RyYW5zX3QJKnRwID0gTlVMTDsKIAlpbnQJCWVycm9yID0gMDsKIAl1aW50CQlsb2NrX21vZGU7Ci0JeGZzX29mZl90CXN0YXJ0X29mZnNldDsKIAogCXZuX3RyYWNlX2VudHJ5KEJIVl9UT19WTk9ERShkaXJfYmRwKSwgX19GVU5DVElPTl9fLAogCQkJCQkgICAgICAgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOwpAQCAtMzI0OCwxMSArMzIzNCw3IEBACiAJfQogCiAJbG9ja19tb2RlID0geGZzX2lsb2NrX21hcF9zaGFyZWQoZHApOwotCXN0YXJ0X29mZnNldCA9IHVpb3AtPnVpb19vZmZzZXQ7CiAJZXJyb3IgPSBYRlNfRElSX0dFVERFTlRTKGRwLT5pX21vdW50LCB0cCwgZHAsIHVpb3AsIGVvZnApOwotCWlmIChzdGFydF9vZmZzZXQgIT0gdWlvcC0+dWlvX29mZnNldCkgewotCQl4ZnNfaWNoZ3RpbWUoZHAsIFhGU19JQ0hHVElNRV9BQ0MpOwotCX0KIAl4ZnNfaXVubG9ja19tYXBfc2hhcmVkKGRwLCBsb2NrX21vZGUpOwogCXJldHVybiBlcnJvcjsKIH0KQEAgLTM2MzUsOSArMzYxNyw5IEBACiAJaWYgKGxvY2t0eXBlID09IFZSV0xPQ0tfV1JJVEUpIHsKIAkJeGZzX2lsb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOwogCX0gZWxzZSBpZiAobG9ja3R5cGUgPT0gVlJXTE9DS19UUllfUkVBRCkgewotCQlyZXR1cm4gKHhmc19pbG9ja19ub3dhaXQoaXAsIFhGU19JT0xPQ0tfU0hBUkVEKSk7CisJCXJldHVybiB4ZnNfaWxvY2tfbm93YWl0KGlwLCBYRlNfSU9MT0NLX1NIQVJFRCk7CiAJfSBlbHNlIGlmIChsb2NrdHlwZSA9PSBWUldMT0NLX1RSWV9XUklURSkgewotCQlyZXR1cm4gKHhmc19pbG9ja19ub3dhaXQoaXAsIFhGU19JT0xPQ0tfRVhDTCkpOworCQlyZXR1cm4geGZzX2lsb2NrX25vd2FpdChpcCwgWEZTX0lPTE9DS19FWENMKTsKIAl9IGVsc2UgewogCQlBU1NFUlQoKGxvY2t0eXBlID09IFZSV0xPQ0tfUkVBRCkgfHwKIAkJICAgICAgIChsb2NrdHlwZSA9PSBWUldMT0NLX1dSSVRFX0RJUkVDVCkpOwpAQCAtMzgyOSw3ICszODExLDEyIEBACiAJdm5faW93YWl0KHZwKTsKIAogCUFTU0VSVChYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSB8fCBpcC0+aV9kZWxheWVkX2Jsa3MgPT0gMCk7Ci0JQVNTRVJUKFZOX0NBQ0hFRCh2cCkgPT0gMCk7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgYXRpbWUgaW4gdGhlIFhGUyBpbm9kZSBpcyBjb3JyZWN0IGJlZm9yZSBmcmVlaW5nIHRoZQorCSAqIExpbnV4IGlub2RlLgorCSAqLworCXhmc19zeW5jaHJvbml6ZV9hdGltZShpcCk7CiAKIAkvKiBJZiB3ZSBoYXZlIG5vdGhpbmcgdG8gZmx1c2ggd2l0aCB0aGlzIGlub2RlIHRoZW4gY29tcGxldGUgdGhlCiAJICogdGVhcmRvd24gbm93LCBvdGhlcndpc2UgYnJlYWsgdGhlIGxpbmsgYmV0d2VlbiB0aGUgeGZzIGlub2RlCkBAIC0zODgwLDcgKzM4NjcsNyBAQAogCQkJeGZzX2lmdW5sb2NrKGlwKTsKIAkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJCX0KLQkJcmV0dXJuKDEpOworCQlyZXR1cm4gMTsKIAl9CiAJaXAtPmlfZmxhZ3MgfD0gWEZTX0lSRUNMQUlNOwogCXdyaXRlX3VubG9jaygmaWgtPmloX2xvY2spOwpAQCAtMzk5OSw0MiArMzk4NiwzNiBAQAogCWludAkJCWFsbG9jX3R5cGUsCiAJaW50CQkJYXR0cl9mbGFncykKIHsKKwl4ZnNfbW91bnRfdAkJKm1wID0gaXAtPmlfbW91bnQ7CisJeGZzX29mZl90CQljb3VudDsKIAl4ZnNfZmlsYmxrc190CQlhbGxvY2F0ZWRfZnNiOwogCXhmc19maWxibGtzX3QJCWFsbG9jYXRlc2l6ZV9mc2I7Ci0JaW50CQkJY29tbWl0dGVkOwotCXhmc19vZmZfdAkJY291bnQ7Ci0JeGZzX2ZpbGJsa3NfdAkJZGF0YWJsb2NrczsKLQlpbnQJCQllcnJvcjsKLQl4ZnNfZnNibG9ja190CQlmaXJzdGZzYjsKLQl4ZnNfYm1hcF9mcmVlX3QJCWZyZWVfbGlzdDsKLQl4ZnNfYm1idF9pcmVjX3QJCSppbWFwcDsKLQl4ZnNfYm1idF9pcmVjX3QJCWltYXBzWzFdOwotCXhmc19tb3VudF90CQkqbXA7Ci0JaW50CQkJbnVtcnRleHRlbnRzOwotCWludAkJCXJlY2NvdW50OwotCXVpbnQJCQlyZXNibGtzOwotCWludAkJCXJ0OwotCWludAkJCXJ0ZXh0c2l6ZTsKKwl4ZnNfZXh0bGVuX3QJCWV4dHN6LCB0ZW1wOwogCXhmc19maWxlb2ZmX3QJCXN0YXJ0b2Zmc2V0X2ZzYjsKKwl4ZnNfZnNibG9ja190CQlmaXJzdGZzYjsKKwlpbnQJCQluaW1hcHM7CisJaW50CQkJYm1hcGlfZmxhZzsKKwlpbnQJCQlxdW90YV9mbGFnOworCWludAkJCXJ0OwogCXhmc190cmFuc190CQkqdHA7Ci0JaW50CQkJeGZzX2JtYXBpX2ZsYWdzOworCXhmc19ibWJ0X2lyZWNfdAkJaW1hcHNbMV0sICppbWFwcDsKKwl4ZnNfYm1hcF9mcmVlX3QJCWZyZWVfbGlzdDsKKwl1aW50CQkJcWJsb2NrcywgcmVzYmxrcywgcmVzcnRleHRlbnRzOworCWludAkJCWNvbW1pdHRlZDsKKwlpbnQJCQllcnJvcjsKIAogCXZuX3RyYWNlX2VudHJ5KFhGU19JVE9WKGlwKSwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7Ci0JbXAgPSBpcC0+aV9tb3VudDsKIAogCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKIAkJcmV0dXJuIFhGU19FUlJPUihFSU8pOwogCi0JLyoKLQkgKiBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIHJlYWx0aW1lIGZpbGUKLQkgKi8KLQlpZiAoKHJ0ID0gWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSkgIT0gMCkgewotCQlpZiAoaXAtPmlfZC5kaV9leHRzaXplKQotCQkJcnRleHRzaXplID0gaXAtPmlfZC5kaV9leHRzaXplOwotCQllbHNlCi0JCQlydGV4dHNpemUgPSBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKLQl9IGVsc2UKLQkJcnRleHRzaXplID0gMDsKKwlydCA9IFhGU19JU19SRUFMVElNRV9JTk9ERShpcCk7CisJaWYgKHVubGlrZWx5KHJ0KSkgeworCQlpZiAoIShleHRzeiA9IGlwLT5pX2QuZGlfZXh0c2l6ZSkpCisJCQlleHRzeiA9IG1wLT5tX3NiLnNiX3JleHRzaXplOworCX0gZWxzZSB7CisJCWV4dHN6ID0gaXAtPmlfZC5kaV9leHRzaXplOworCX0KIAogCWlmICgoZXJyb3IgPSBYRlNfUU1fRFFBVFRBQ0gobXAsIGlwLCAwKSkpCiAJCXJldHVybiBlcnJvcjsKQEAgLTQwNDUsOCArNDAyNiw4IEBACiAJY291bnQgPSBsZW47CiAJZXJyb3IgPSAwOwogCWltYXBwID0gJmltYXBzWzBdOwotCXJlY2NvdW50ID0gMTsKLQl4ZnNfYm1hcGlfZmxhZ3MgPSBYRlNfQk1BUElfV1JJVEUgfCAoYWxsb2NfdHlwZSA/IFhGU19CTUFQSV9QUkVBTExPQyA6IDApOworCW5pbWFwcyA9IDE7CisJYm1hcGlfZmxhZyA9IFhGU19CTUFQSV9XUklURSB8IChhbGxvY190eXBlID8gWEZTX0JNQVBJX1BSRUFMTE9DIDogMCk7CiAJc3RhcnRvZmZzZXRfZnNiCT0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKIAlhbGxvY2F0ZXNpemVfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCBjb3VudCk7CiAKQEAgLTQwNjMsNDcgKzQwNDQsNTUgQEAKIAkJCW9mZnNldCwgZW5kX2RtaV9vZmZzZXQgLSBvZmZzZXQsCiAJCQkwLCBOVUxMKTsKIAkJaWYgKGVycm9yKQotCQkJcmV0dXJuKGVycm9yKTsKKwkJCXJldHVybiBlcnJvcjsKIAl9CiAKIAkvKgotCSAqIGFsbG9jYXRlIGZpbGUgc3BhY2UgdW50aWwgZG9uZSBvciB1bnRpbCB0aGVyZSBpcyBhbiBlcnJvcgorCSAqIEFsbG9jYXRlIGZpbGUgc3BhY2UgdW50aWwgZG9uZSBvciB1bnRpbCB0aGVyZSBpcyBhbiBlcnJvcgogCSAqLwogcmV0cnk6CiAJd2hpbGUgKGFsbG9jYXRlc2l6ZV9mc2IgJiYgIWVycm9yKSB7Ci0JCS8qCi0JCSAqIGRldGVybWluZSBpZiByZXNlcnZpbmcgc3BhY2Ugb24KLQkJICogdGhlIGRhdGEgb3IgcmVhbHRpbWUgcGFydGl0aW9uLgotCQkgKi8KLQkJaWYgKHJ0KSB7Ci0JCQl4ZnNfZmlsZW9mZl90IHMsIGU7CisJCXhmc19maWxlb2ZmX3QJcywgZTsKIAorCQkvKgorCQkgKiBEZXRlcm1pbmUgc3BhY2UgcmVzZXJ2YXRpb25zIGZvciBkYXRhL3JlYWx0aW1lLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KGV4dHN6KSkgewogCQkJcyA9IHN0YXJ0b2Zmc2V0X2ZzYjsKLQkJCWRvX2RpdihzLCBydGV4dHNpemUpOwotCQkJcyAqPSBydGV4dHNpemU7Ci0JCQllID0gcm91bmR1cF82NChzdGFydG9mZnNldF9mc2IgKyBhbGxvY2F0ZXNpemVfZnNiLAotCQkJCXJ0ZXh0c2l6ZSk7Ci0JCQludW1ydGV4dGVudHMgPSAoaW50KShlIC0gcykgLyBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKLQkJCWRhdGFibG9ja3MgPSAwOworCQkJZG9fZGl2KHMsIGV4dHN6KTsKKwkJCXMgKj0gZXh0c3o7CisJCQllID0gc3RhcnRvZmZzZXRfZnNiICsgYWxsb2NhdGVzaXplX2ZzYjsKKwkJCWlmICgodGVtcCA9IGRvX21vZChzdGFydG9mZnNldF9mc2IsIGV4dHN6KSkpCisJCQkJZSArPSB0ZW1wOworCQkJaWYgKCh0ZW1wID0gZG9fbW9kKGUsIGV4dHN6KSkpCisJCQkJZSArPSBleHRzeiAtIHRlbXA7CiAJCX0gZWxzZSB7Ci0JCQlkYXRhYmxvY2tzID0gYWxsb2NhdGVzaXplX2ZzYjsKLQkJCW51bXJ0ZXh0ZW50cyA9IDA7CisJCQlzID0gMDsKKwkJCWUgPSBhbGxvY2F0ZXNpemVfZnNiOworCQl9CisKKwkJaWYgKHVubGlrZWx5KHJ0KSkgeworCQkJcmVzcnRleHRlbnRzID0gcWJsb2NrcyA9ICh1aW50KShlIC0gcyk7CisJCQlyZXNydGV4dGVudHMgLz0gbXAtPm1fc2Iuc2JfcmV4dHNpemU7CisJCQlyZXNibGtzID0gWEZTX0RJT1NUUkFUX1NQQUNFX1JFUyhtcCwgMCk7CisJCQlxdW90YV9mbGFnID0gWEZTX1FNT1BUX1JFU19SVEJMS1M7CisJCX0gZWxzZSB7CisJCQlyZXNydGV4dGVudHMgPSAwOworCQkJcmVzYmxrcyA9IHFibG9ja3MgPSBcCisJCQkJWEZTX0RJT1NUUkFUX1NQQUNFX1JFUyhtcCwgKHVpbnQpKGUgLSBzKSk7CisJCQlxdW90YV9mbGFnID0gWEZTX1FNT1BUX1JFU19SRUdCTEtTOwogCQl9CiAKIAkJLyoKLQkJICogYWxsb2NhdGUgYW5kIHNldHVwIHRoZSB0cmFuc2FjdGlvbgorCQkgKiBBbGxvY2F0ZSBhbmQgc2V0dXAgdGhlIHRyYW5zYWN0aW9uLgogCQkgKi8KIAkJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19ESU9TVFJBVCk7Ci0JCXJlc2Jsa3MgPSBYRlNfRElPU1RSQVRfU1BBQ0VfUkVTKG1wLCBkYXRhYmxvY2tzKTsKLQkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwKLQkJCQkJICByZXNibGtzLAotCQkJCQkgIFhGU19XUklURV9MT0dfUkVTKG1wKSwKLQkJCQkJICBudW1ydGV4dGVudHMsCisJCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIHJlc2Jsa3MsCisJCQkJCSAgWEZTX1dSSVRFX0xPR19SRVMobXApLCByZXNydGV4dGVudHMsCiAJCQkJCSAgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKIAkJCQkJICBYRlNfV1JJVEVfTE9HX0NPVU5UKTsKLQogCQkvKgotCQkgKiBjaGVjayBmb3IgcnVubmluZyBvdXQgb2Ygc3BhY2UKKwkJICogQ2hlY2sgZm9yIHJ1bm5pbmcgb3V0IG9mIHNwYWNlCiAJCSAqLwogCQlpZiAoZXJyb3IpIHsKIAkJCS8qCkBAIC00MTE0LDggKzQxMDMsOCBAQAogCQkJYnJlYWs7CiAJCX0KIAkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCWVycm9yID0gWEZTX1RSQU5TX1JFU0VSVkVfUVVPVEEobXAsIHRwLAotCQkJCWlwLT5pX3VkcXVvdCwgaXAtPmlfZ2RxdW90LCByZXNibGtzLCAwLCAwKTsKKwkJZXJyb3IgPSBYRlNfVFJBTlNfUkVTRVJWRV9RVU9UQV9OQkxLUyhtcCwgdHAsIGlwLAorCQkJCQkJICAgICAgcWJsb2NrcywgMCwgcXVvdGFfZmxhZyk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gZXJyb3IxOwogCkBAIC00MTIzLDE5ICs0MTEyLDE5IEBACiAJCXhmc190cmFuc19paG9sZCh0cCwgaXApOwogCiAJCS8qCi0JCSAqIGlzc3VlIHRoZSBibWFwaSgpIGNhbGwgdG8gYWxsb2NhdGUgdGhlIGJsb2NrcworCQkgKiBJc3N1ZSB0aGUgeGZzX2JtYXBpKCkgY2FsbCB0byBhbGxvY2F0ZSB0aGUgYmxvY2tzCiAJCSAqLwogCQlYRlNfQk1BUF9JTklUKCZmcmVlX2xpc3QsICZmaXJzdGZzYik7CiAJCWVycm9yID0geGZzX2JtYXBpKHRwLCBpcCwgc3RhcnRvZmZzZXRfZnNiLAotCQkJCSAgYWxsb2NhdGVzaXplX2ZzYiwgeGZzX2JtYXBpX2ZsYWdzLAotCQkJCSAgJmZpcnN0ZnNiLCAwLCBpbWFwcCwgJnJlY2NvdW50LAorCQkJCSAgYWxsb2NhdGVzaXplX2ZzYiwgYm1hcGlfZmxhZywKKwkJCQkgICZmaXJzdGZzYiwgMCwgaW1hcHAsICZuaW1hcHMsCiAJCQkJICAmZnJlZV9saXN0KTsKIAkJaWYgKGVycm9yKSB7CiAJCQlnb3RvIGVycm9yMDsKIAkJfQogCiAJCS8qCi0JCSAqIGNvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbgorCQkgKiBDb21wbGV0ZSB0aGUgdHJhbnNhY3Rpb24KIAkJICovCiAJCWVycm9yID0geGZzX2JtYXBfZmluaXNoKCZ0cCwgJmZyZWVfbGlzdCwgZmlyc3Rmc2IsICZjb21taXR0ZWQpOwogCQlpZiAoZXJyb3IpIHsKQEAgLTQxNTAsNyArNDEzOSw3IEBACiAKIAkJYWxsb2NhdGVkX2ZzYiA9IGltYXBwLT5icl9ibG9ja2NvdW50OwogCi0JCWlmIChyZWNjb3VudCA9PSAwKSB7CisJCWlmIChuaW1hcHMgPT0gMCkgewogCQkJZXJyb3IgPSBYRlNfRVJST1IoRU5PU1BDKTsKIAkJCWJyZWFrOwogCQl9CkBAIC00MTczLDkgKzQxNjIsMTEgQEAKIAogCXJldHVybiBlcnJvcjsKIAotIGVycm9yMDoKK2Vycm9yMDoJLyogQ2FuY2VsIGJtYXAsIHVubG9jayBpbm9kZSwgdW5yZXNlcnZlIHF1b3RhIGJsb2NrcywgY2FuY2VsIHRyYW5zICovCiAJeGZzX2JtYXBfY2FuY2VsKCZmcmVlX2xpc3QpOwotIGVycm9yMToKKwlYRlNfVFJBTlNfVU5SRVNFUlZFX1FVT1RBX05CTEtTKG1wLCB0cCwgaXAsIHFibG9ja3MsIDAsIHF1b3RhX2ZsYWcpOworCitlcnJvcjE6CS8qIEp1c3QgY2FuY2VsIHRyYW5zYWN0aW9uICovCiAJeGZzX3RyYW5zX2NhbmNlbCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUyB8IFhGU19UUkFOU19BQk9SVCk7CiAJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKIAlnb3RvIGRtYXBpX2Vub3NwY19jaGVjazsKQEAgLTQzMTMsNyArNDMwNCw3IEBACiAJCQkJb2Zmc2V0LCBlbmRfZG1pX29mZnNldCAtIG9mZnNldCwKIAkJCQlBVF9ERUxBWV9GTEFHKGF0dHJfZmxhZ3MpLCBOVUxMKTsKIAkJaWYgKGVycm9yKQotCQkJcmV0dXJuKGVycm9yKTsKKwkJCXJldHVybiBlcnJvcjsKIAl9CiAKIAlBU1NFUlQoYXR0cl9mbGFncyAmIEFUVFJfTk9MT0NLID8gYXR0cl9mbGFncyAmIEFUVFJfRE1JIDogMSk7CkBAIC00NDIwLDggKzQ0MTEsOCBAQAogCQl9CiAJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwogCQllcnJvciA9IFhGU19UUkFOU19SRVNFUlZFX1FVT1RBKG1wLCB0cCwKLQkJCQlpcC0+aV91ZHF1b3QsIGlwLT5pX2dkcXVvdCwgcmVzYmxrcywgMCwgcnQgPwotCQkJCVhGU19RTU9QVF9SRVNfUlRCTEtTIDogWEZTX1FNT1BUX1JFU19SRUdCTEtTKTsKKwkJCQlpcC0+aV91ZHF1b3QsIGlwLT5pX2dkcXVvdCwgcmVzYmxrcywgMCwKKwkJCQlYRlNfUU1PUFRfUkVTX1JFR0JMS1MpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGVycm9yMTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmggYi9pbmNsdWRlL2FjcGkvYWNjb25maWcuaAppbmRleCA0MjdjZmYxLi42NzVhMzJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNjb25maWcuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNjb25maWcuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTYxLDkgKzYxLDkgQEAKICAqCiAgKi8KIAotLyogVmVyc2lvbiBzdHJpbmcgKi8KKy8qIEN1cnJlbnQgQUNQSUNBIHN1YnN5c3RlbSB2ZXJzaW9uIGluIFlZWVlNTUREIGZvcm1hdCAqLwogCi0jZGVmaW5lIEFDUElfQ0FfVkVSU0lPTiAgICAgICAgICAgICAgICAgMHgyMDA1MDkwMgorI2RlZmluZSBBQ1BJX0NBX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4MjAwNjAxMTMKIAogLyoKICAqIE9TIG5hbWUsIHVzZWQgZm9yIHRoZSBfT1Mgb2JqZWN0LiAgVGhlIF9PUyBvYmplY3QgaXMgZXNzZW50aWFsbHkgb2Jzb2xldGUsCkBAIC05OCwxMSArOTgsNiBAQAogCiAjZGVmaW5lIEFDUElfQ0FfU1VQUE9SVF9MRVZFTCAgICAgICAgICAgMwogCi0vKiBTdHJpbmcgc2l6ZSBjb25zdGFudHMgKi8KLQotI2RlZmluZSBBQ1BJX01BWF9TVFJJTkdfTEVOR1RIICAgICAgICAgIDUxMgotI2RlZmluZSBBQ1BJX1BBVEhOQU1FX01BWCAgICAgICAgICAgICAgIDI1NgkvKiBBIGZ1bGwgbmFtZXNwYWNlIHBhdGhuYW1lICovCi0KIC8qIE1heGltdW0gY291bnQgZm9yIGEgc2VtYXBob3JlIG9iamVjdCAqLwogCiAjZGVmaW5lIEFDUElfTUFYX1NFTUFQSE9SRV9DT1VOVCAgICAgICAgMjU2CkBAIC0xMTUsNiArMTEwLDEwIEBACiAKICNkZWZpbmUgQUNQSV9TWVNNRU1fUkVHSU9OX1dJTkRPV19TSVpFICA0MDk2CiAKKy8qIG93bmVyX2lkIHRyYWNraW5nLiA4IGVudHJpZXMgYWxsb3dzIGZvciAyNTUgb3duZXJfaWRzICovCisKKyNkZWZpbmUgQUNQSV9OVU1fT1dORVJJRF9NQVNLUyAgICAgICAgICA4CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBBQ1BJIFNwZWNpZmljYXRpb24gY29uc3RhbnRzIChEbyBub3QgY2hhbmdlIHVubGVzcyB0aGUgc3BlY2lmaWNhdGlvbiBjaGFuZ2VzKQpAQCAtMTM0LDE0ICsxMzMsMTEgQEAKICNkZWZpbmUgQUNQSV9NRVRIT0RfTlVNX0FSR1MgICAgICAgICAgICA3CiAjZGVmaW5lIEFDUElfTUVUSE9EX01BWF9BUkcgICAgICAgICAgICAgNgogCi0vKiBNYXhpbXVtIGxlbmd0aCBvZiByZXN1bHRpbmcgc3RyaW5nIHdoZW4gY29udmVydGluZyBmcm9tIGEgYnVmZmVyICovCi0KLSNkZWZpbmUgQUNQSV9NQVhfU1RSSU5HX0NPTlZFUlNJT04gICAgICAyMDAKLQotLyogTGVuZ3RoIG9mIF9ISUQsIF9VSUQsIGFuZCBfQ0lEIHZhbHVlcyAqLworLyogTGVuZ3RoIG9mIF9ISUQsIF9VSUQsIF9DSUQsIGFuZCBVVUlEIHZhbHVlcyAqLwogCiAjZGVmaW5lIEFDUElfREVWSUNFX0lEX0xFTkdUSCAgICAgICAgICAgMHgwOQogI2RlZmluZSBBQ1BJX01BWF9DSURfTEVOR1RIICAgICAgICAgICAgIDQ4CisjZGVmaW5lIEFDUElfVVVJRF9MRU5HVEggICAgICAgICAgICAgICAgMTYKIAogLyoKICAqIE9wZXJhbmQgU3RhY2sgKGluIFdBTEtfU1RBVEUpLCBNdXN0IGJlIGxhcmdlIGVub3VnaCB0byBjb250YWluIE1FVEhPRF9NQVhfQVJHCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNkZWJ1Zy5oIGIvaW5jbHVkZS9hY3BpL2FjZGVidWcuaAppbmRleCA3MGNlM2I0Li5kODE2NzA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNkZWJ1Zy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY2RlYnVnLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNkaXNhc20uaCBiL2luY2x1ZGUvYWNwaS9hY2Rpc2FzbS5oCmluZGV4IDNkOTZkY2IuLjExYThmZTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2Rpc2FzbS5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY2Rpc2FzbS5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNTcsMjYgKzU3LDExIEBACiB9OwogCiBleHRlcm4gc3RydWN0IGFjcGlfZXh0ZXJuYWxfbGlzdCAqYWNwaV9nYmxfZXh0ZXJuYWxfbGlzdDsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9pb19kZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfd29yZF9kZWNvZGVbNF07Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfY29uc3VtZV9kZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfbWluX2RlY29kZVsyXTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9tYXhfZGVjb2RlWzJdOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX0RFQ2RlY29kZVsyXTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9STkdkZWNvZGVbNF07Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfTUVNZGVjb2RlWzRdOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX1JXZGVjb2RlWzJdOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX2lycV9kZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfSEVkZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfTExkZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfU0hSZGVjb2RlWzJdOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX1RZUGRlY29kZVs0XTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9CTWRlY29kZVsyXTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9TSVpkZWNvZGVbNF07Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfVFRQZGVjb2RlWzJdOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX01UUGRlY29kZVs0XTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9UUlNkZWNvZGVbMl07CiAKKy8qIFN0cmluZ3MgdXNlZCBmb3IgZGVjb2RpbmcgZmxhZ3MgdG8gQVNMIGtleXdvcmRzICovCisKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF93b3JkX2RlY29kZVs0XTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9pcnFfZGVjb2RlWzJdOwogZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX2xvY2tfcnVsZVtBQ1BJX05VTV9MT0NLX1JVTEVTXTsKIGV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9hY2Nlc3NfdHlwZXNbQUNQSV9OVU1fQUNDRVNTX1RZUEVTXTsKIGV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF91cGRhdGVfcnVsZXNbQUNQSV9OVU1fVVBEQVRFX1JVTEVTXTsKQEAgLTE3MSwxMSArMTU2LDE5IEBACiAvKgogICogZG1yZXNyYwogICovCi12b2lkCi1hY3BpX2RtX3Jlc291cmNlX2Rlc2NyaXB0b3Ioc3RydWN0IGFjcGlfb3Bfd2Fsa19pbmZvICppbmZvLAotCQkJICAgIHU4ICogYnl0ZV9kYXRhLCB1MzIgYnl0ZV9jb3VudCk7Cit2b2lkIGFjcGlfZG1fZHVtcF9pbnRlZ2VyOCh1OCB2YWx1ZSwgY2hhciAqbmFtZSk7CiAKLXU4IGFjcGlfZG1faXNfcmVzb3VyY2VfZGVzY3JpcHRvcih1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwordm9pZCBhY3BpX2RtX2R1bXBfaW50ZWdlcjE2KHUxNiB2YWx1ZSwgY2hhciAqbmFtZSk7CisKK3ZvaWQgYWNwaV9kbV9kdW1wX2ludGVnZXIzMih1MzIgdmFsdWUsIGNoYXIgKm5hbWUpOworCit2b2lkIGFjcGlfZG1fZHVtcF9pbnRlZ2VyNjQodTY0IHZhbHVlLCBjaGFyICpuYW1lKTsKKwordm9pZAorYWNwaV9kbV9yZXNvdXJjZV90ZW1wbGF0ZShzdHJ1Y3QgYWNwaV9vcF93YWxrX2luZm8gKmluZm8sCisJCQkgIHU4ICogYnl0ZV9kYXRhLCB1MzIgYnl0ZV9jb3VudCk7CisKK3U4IGFjcGlfZG1faXNfcmVzb3VyY2VfdGVtcGxhdGUodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKIAogdm9pZCBhY3BpX2RtX2luZGVudCh1MzIgbGV2ZWwpOwogCkBAIC0xODcsNzMgKzE4MCw2OSBAQAogICogZG1yZXNyY2wKICAqLwogdm9pZAotYWNwaV9kbV93b3JkX2Rlc2NyaXB0b3Ioc3RydWN0IGFzbF93b3JkX2FkZHJlc3NfZGVzYyAqcmVzb3VyY2UsCi0JCQl1MzIgbGVuZ3RoLCB1MzIgbGV2ZWwpOworYWNwaV9kbV93b3JkX2Rlc2NyaXB0b3IodW5pb24gYW1sX3Jlc291cmNlICpyZXNvdXJjZSwgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV9kd29yZF9kZXNjcmlwdG9yKHN0cnVjdCBhc2xfZHdvcmRfYWRkcmVzc19kZXNjICpyZXNvdXJjZSwKLQkJCSB1MzIgbGVuZ3RoLCB1MzIgbGV2ZWwpOworYWNwaV9kbV9kd29yZF9kZXNjcmlwdG9yKHVuaW9uIGFtbF9yZXNvdXJjZSAqcmVzb3VyY2UsIHUzMiBsZW5ndGgsIHUzMiBsZXZlbCk7CiAKIHZvaWQKLWFjcGlfZG1fZXh0ZW5kZWRfZGVzY3JpcHRvcihzdHJ1Y3QgYXNsX2V4dGVuZGVkX2FkZHJlc3NfZGVzYyAqcmVzb3VyY2UsCithY3BpX2RtX2V4dGVuZGVkX2Rlc2NyaXB0b3IodW5pb24gYW1sX3Jlc291cmNlICpyZXNvdXJjZSwKIAkJCSAgICB1MzIgbGVuZ3RoLCB1MzIgbGV2ZWwpOwogCiB2b2lkCi1hY3BpX2RtX3F3b3JkX2Rlc2NyaXB0b3Ioc3RydWN0IGFzbF9xd29yZF9hZGRyZXNzX2Rlc2MgKnJlc291cmNlLAotCQkJIHUzMiBsZW5ndGgsIHUzMiBsZXZlbCk7CithY3BpX2RtX3F3b3JkX2Rlc2NyaXB0b3IodW5pb24gYW1sX3Jlc291cmNlICpyZXNvdXJjZSwgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV9tZW1vcnkyNF9kZXNjcmlwdG9yKHN0cnVjdCBhc2xfbWVtb3J5XzI0X2Rlc2MgKnJlc291cmNlLAorYWNwaV9kbV9tZW1vcnkyNF9kZXNjcmlwdG9yKHVuaW9uIGFtbF9yZXNvdXJjZSAqcmVzb3VyY2UsCiAJCQkgICAgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV9tZW1vcnkzMl9kZXNjcmlwdG9yKHN0cnVjdCBhc2xfbWVtb3J5XzMyX2Rlc2MgKnJlc291cmNlLAorYWNwaV9kbV9tZW1vcnkzMl9kZXNjcmlwdG9yKHVuaW9uIGFtbF9yZXNvdXJjZSAqcmVzb3VyY2UsCiAJCQkgICAgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV9maXhlZF9tZW0zMl9kZXNjcmlwdG9yKHN0cnVjdCBhc2xfZml4ZWRfbWVtb3J5XzMyX2Rlc2MgKnJlc291cmNlLAotCQkJICAgICAgIHUzMiBsZW5ndGgsIHUzMiBsZXZlbCk7CithY3BpX2RtX2ZpeGVkX21lbW9yeTMyX2Rlc2NyaXB0b3IodW5pb24gYW1sX3Jlc291cmNlICpyZXNvdXJjZSwKKwkJCQkgIHUzMiBsZW5ndGgsIHUzMiBsZXZlbCk7CiAKIHZvaWQKLWFjcGlfZG1fZ2VuZXJpY19yZWdpc3Rlcl9kZXNjcmlwdG9yKHN0cnVjdCBhc2xfZ2VuZXJhbF9yZWdpc3Rlcl9kZXNjICpyZXNvdXJjZSwKK2FjcGlfZG1fZ2VuZXJpY19yZWdpc3Rlcl9kZXNjcmlwdG9yKHVuaW9uIGFtbF9yZXNvdXJjZSAqcmVzb3VyY2UsCiAJCQkJICAgIHUzMiBsZW5ndGgsIHUzMiBsZXZlbCk7CiAKIHZvaWQKLWFjcGlfZG1faW50ZXJydXB0X2Rlc2NyaXB0b3Ioc3RydWN0IGFzbF9leHRlbmRlZF94cnVwdF9kZXNjICpyZXNvdXJjZSwKK2FjcGlfZG1faW50ZXJydXB0X2Rlc2NyaXB0b3IodW5pb24gYW1sX3Jlc291cmNlICpyZXNvdXJjZSwKIAkJCSAgICAgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV92ZW5kb3JfbGFyZ2VfZGVzY3JpcHRvcihzdHJ1Y3QgYXNsX2xhcmdlX3ZlbmRvcl9kZXNjICpyZXNvdXJjZSwKK2FjcGlfZG1fdmVuZG9yX2xhcmdlX2Rlc2NyaXB0b3IodW5pb24gYW1sX3Jlc291cmNlICpyZXNvdXJjZSwKIAkJCQl1MzIgbGVuZ3RoLCB1MzIgbGV2ZWwpOwogCit2b2lkIGFjcGlfZG1fdmVuZG9yX2NvbW1vbihjaGFyICpuYW1lLCB1OCAqIGJ5dGVfZGF0YSwgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKKwogLyoKICAqIGRtcmVzcmNzCiAgKi8KIHZvaWQKLWFjcGlfZG1faXJxX2Rlc2NyaXB0b3Ioc3RydWN0IGFzbF9pcnFfZm9ybWF0X2Rlc2MgKnJlc291cmNlLAotCQkgICAgICAgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKK2FjcGlfZG1faXJxX2Rlc2NyaXB0b3IodW5pb24gYW1sX3Jlc291cmNlICpyZXNvdXJjZSwgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV9kbWFfZGVzY3JpcHRvcihzdHJ1Y3QgYXNsX2RtYV9mb3JtYXRfZGVzYyAqcmVzb3VyY2UsCi0JCSAgICAgICB1MzIgbGVuZ3RoLCB1MzIgbGV2ZWwpOworYWNwaV9kbV9kbWFfZGVzY3JpcHRvcih1bmlvbiBhbWxfcmVzb3VyY2UgKnJlc291cmNlLCB1MzIgbGVuZ3RoLCB1MzIgbGV2ZWwpOworCit2b2lkIGFjcGlfZG1faW9fZGVzY3JpcHRvcih1bmlvbiBhbWxfcmVzb3VyY2UgKnJlc291cmNlLCB1MzIgbGVuZ3RoLCB1MzIgbGV2ZWwpOwogCiB2b2lkCi1hY3BpX2RtX2lvX2Rlc2NyaXB0b3Ioc3RydWN0IGFzbF9pb19wb3J0X2Rlc2MgKnJlc291cmNlLCB1MzIgbGVuZ3RoLCB1MzIgbGV2ZWwpOwotCi12b2lkCi1hY3BpX2RtX2ZpeGVkX2lvX2Rlc2NyaXB0b3Ioc3RydWN0IGFzbF9maXhlZF9pb19wb3J0X2Rlc2MgKnJlc291cmNlLAorYWNwaV9kbV9maXhlZF9pb19kZXNjcmlwdG9yKHVuaW9uIGFtbF9yZXNvdXJjZSAqcmVzb3VyY2UsCiAJCQkgICAgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogdm9pZAotYWNwaV9kbV9zdGFydF9kZXBlbmRlbnRfZGVzY3JpcHRvcihzdHJ1Y3QgYXNsX3N0YXJ0X2RlcGVuZGVudF9kZXNjICpyZXNvdXJjZSwKK2FjcGlfZG1fc3RhcnRfZGVwZW5kZW50X2Rlc2NyaXB0b3IodW5pb24gYW1sX3Jlc291cmNlICpyZXNvdXJjZSwKIAkJCQkgICB1MzIgbGVuZ3RoLCB1MzIgbGV2ZWwpOwogCiB2b2lkCi1hY3BpX2RtX2VuZF9kZXBlbmRlbnRfZGVzY3JpcHRvcihzdHJ1Y3QgYXNsX3N0YXJ0X2RlcGVuZGVudF9kZXNjICpyZXNvdXJjZSwKK2FjcGlfZG1fZW5kX2RlcGVuZGVudF9kZXNjcmlwdG9yKHVuaW9uIGFtbF9yZXNvdXJjZSAqcmVzb3VyY2UsCiAJCQkJIHUzMiBsZW5ndGgsIHUzMiBsZXZlbCk7CiAKIHZvaWQKLWFjcGlfZG1fdmVuZG9yX3NtYWxsX2Rlc2NyaXB0b3Ioc3RydWN0IGFzbF9zbWFsbF92ZW5kb3JfZGVzYyAqcmVzb3VyY2UsCithY3BpX2RtX3ZlbmRvcl9zbWFsbF9kZXNjcmlwdG9yKHVuaW9uIGFtbF9yZXNvdXJjZSAqcmVzb3VyY2UsCiAJCQkJdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2Rpc3BhdC5oIGIvaW5jbHVkZS9hY3BpL2FjZGlzcGF0LmgKaW5kZXggMDY1ZjI0YS4uYzQxYTkyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjZGlzcGF0LmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjZGlzcGF0LmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0yMDEsNiArMjAxLDkgQEAKIAkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKIAkJCSAgICAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqY2FsbGluZ19tZXRob2Rfbm9kZSk7CiAKK2FjcGlfc3RhdHVzCithY3BpX2RzX21ldGhvZF9lcnJvcihhY3BpX3N0YXR1cyBzdGF0dXMsIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOworCiAvKgogICogZHNpbml0CiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2V2ZW50cy5oIGIvaW5jbHVkZS9hY3BpL2FjZXZlbnRzLmgKaW5kZXggYmZhNTQ2MC4uZjI3MTdiZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjZXZlbnRzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjZXZlbnRzLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC01MSw2ICs1MSw4IEBACiAKIGFjcGlfc3RhdHVzIGFjcGlfZXZfaW5zdGFsbF94cnVwdF9oYW5kbGVycyh2b2lkKTsKIAorYWNwaV9zdGF0dXMgYWNwaV9ldl9pbnN0YWxsX2ZhZHRfZ3Blcyh2b2lkKTsKKwogdTMyIGFjcGlfZXZfZml4ZWRfZXZlbnRfZGV0ZWN0KHZvaWQpOwogCiAvKgpAQCAtMTA1LDYgKzEwNywxMCBAQAogCQkJIHUzMiBpbnRlcnJ1cHRfbnVtYmVyLAogCQkJIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICoqcmV0dXJuX2dwZV9ibG9jayk7CiAKK2FjcGlfc3RhdHVzCithY3BpX2V2X2luaXRpYWxpemVfZ3BlX2Jsb2NrKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpncGVfZGV2aWNlLAorCQkJICAgICBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrKTsKKwogYWNwaV9zdGF0dXMgYWNwaV9ldl9kZWxldGVfZ3BlX2Jsb2NrKHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2spOwogCiB1MzIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2V4Y2VwLmggYi9pbmNsdWRlL2FjcGkvYWNleGNlcC5oCmluZGV4IDRmMDA1ZWIuLmRjNzY4YWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2V4Y2VwLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjZXhjZXAuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2dsb2JhbC5oIGIvaW5jbHVkZS9hY3BpL2FjZ2xvYmFsLmgKaW5kZXggNGFiMmNhMS4uNzM0Y2M3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjZ2xvYmFsLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjZ2xvYmFsLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC04MCw2ICs4MCwxNSBAQAogCiBleHRlcm4gdTMyIGFjcGlfZ2JsX25lc3RpbmdfbGV2ZWw7CiAKKy8qIFN1cHBvcnQgZm9yIGR5bmFtaWMgY29udHJvbCBtZXRob2QgdHJhY2luZyBtZWNoYW5pc20gKi8KKworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX29yaWdpbmFsX2RiZ19sZXZlbDsKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dibF9vcmlnaW5hbF9kYmdfbGF5ZXI7CitBQ1BJX0VYVEVSTiBhY3BpX25hbWUgYWNwaV9nYmxfdHJhY2VfbWV0aG9kX25hbWU7CitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfdHJhY2VfZGJnX2xldmVsOworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX3RyYWNlX2RiZ19sYXllcjsKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dibF90cmFjZV9mbGFnczsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogUnVudGltZSBjb25maWd1cmF0aW9uIChzdGF0aWMgZGVmYXVsdHMgdGhhdCBjYW4gYmUgb3ZlcnJpZGVuIGF0IHJ1bnRpbWUpCkBAIC04OSwxMSArOTgsMTUgQEAKIC8qCiAgKiBFbmFibGUgInNsYWNrIiBpbiB0aGUgQU1MIGludGVycHJldGVyPyAgRGVmYXVsdCBpcyBGQUxTRSwgYW5kIHRoZQogICogaW50ZXJwcmV0ZXIgc3RyaWN0bHkgZm9sbG93cyB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uLiAgU2V0dGluZyB0byBUUlVFCi0gKiBhbGxvd3MgdGhlIGludGVycHJldGVyIHRvIGZvcmdpdmUgY2VydGFpbiBiYWQgQU1MIGNvbnN0cnVjdHMuICBDdXJyZW50bHk6CisgKiBhbGxvd3MgdGhlIGludGVycHJldGVyIHRvIGlnbm9yZSBjZXJ0YWluIGVycm9ycyBhbmQvb3IgYmFkIEFNTCBjb25zdHJ1Y3RzLgorICoKKyAqIEN1cnJlbnRseSwgdGhlc2UgZmVhdHVyZXMgYXJlIGVuYWJsZWQgYnkgdGhpcyBmbGFnOgorICoKICAqIDEpIEFsbG93ICJpbXBsaWNpdCByZXR1cm4iIG9mIGxhc3QgdmFsdWUgaW4gYSBjb250cm9sIG1ldGhvZAotICogMikgQWxsb3cgYWNjZXNzIGJleW9uZCBlbmQgb2Ygb3BlcmF0aW9uIHJlZ2lvbgorICogMikgQWxsb3cgYWNjZXNzIGJleW9uZCB0aGUgZW5kIG9mIGFuIG9wZXJhdGlvbiByZWdpb24KICAqIDMpIEFsbG93IGFjY2VzcyB0byB1bmluaXRpYWxpemVkIGxvY2Fscy9hcmdzIChhdXRvLWluaXQgdG8gaW50ZWdlciAwKQogICogNCkgQWxsb3cgQU5ZIG9iamVjdCB0eXBlIHRvIGJlIGEgc291cmNlIG9wZXJhbmQgZm9yIHRoZSBTdG9yZSgpIG9wZXJhdG9yCisgKiA1KSBBbGxvdyB1bnJlc29sdmVkIHJlZmVyZW5jZXMgKGludmFsaWQgdGFyZ2V0IG5hbWUpIGluIHBhY2thZ2Ugb2JqZWN0cwogICovCiBBQ1BJX0VYVEVSTiB1OCBBQ1BJX0lOSVRfR0xPQkFMKGFjcGlfZ2JsX2VuYWJsZV9pbnRlcnByZXRlcl9zbGFjaywgRkFMU0UpOwogCkBAIC0yMTEsOSArMjI0LDExIEBACiBBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfcnNkcF9vcmlnaW5hbF9sb2NhdGlvbjsKIEFDUElfRVhURVJOIHUzMiBhY3BpX2dibF9uc19sb29rdXBfY291bnQ7CiBBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfcHNfZmluZF9jb3VudDsKLUFDUElfRVhURVJOIHU2NCBhY3BpX2dibF9vd25lcl9pZF9tYXNrOworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX293bmVyX2lkX21hc2tbQUNQSV9OVU1fT1dORVJJRF9NQVNLU107CiBBQ1BJX0VYVEVSTiB1MTYgYWNwaV9nYmxfcG0xX2VuYWJsZV9yZWdpc3Rlcl9zYXZlOwogQUNQSV9FWFRFUk4gdTE2IGFjcGlfZ2JsX2dsb2JhbF9sb2NrX2hhbmRsZTsKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2xhc3Rfb3duZXJfaWRfaW5kZXg7CitBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9uZXh0X293bmVyX2lkX29mZnNldDsKIEFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2RlYnVnZ2VyX2NvbmZpZ3VyYXRpb247CiBBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZDsKIEFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX3N0ZXBfdG9fbmV4dF9jYWxsOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjaHdhcmUuaCBiL2luY2x1ZGUvYWNwaS9hY2h3YXJlLmgKaW5kZXggMzY0NGQ3Mi4uMjliNjBhOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjaHdhcmUuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNod2FyZS5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjaW50ZXJwLmggYi9pbmNsdWRlL2FjcGkvYWNpbnRlcnAuaAppbmRleCAyYzljMWExLi45ZjIyY2ZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNpbnRlcnAuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNpbnRlcnAuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTQ0LDcgKzQ0LDQ5IEBACiAjaWZuZGVmIF9fQUNJTlRFUlBfSF9fCiAjZGVmaW5lIF9fQUNJTlRFUlBfSF9fCiAKLSNkZWZpbmUgQUNQSV9XQUxLX09QRVJBTkRTICAgICAgICgmKHdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLTFdKSkKKyNkZWZpbmUgQUNQSV9XQUxLX09QRVJBTkRTICAgICAgICAgICgmKHdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLTFdKSkKKworLyogTWFjcm9zIGZvciB0YWJsZXMgdXNlZCBmb3IgZGVidWcgb3V0cHV0ICovCisKKyNkZWZpbmUgQUNQSV9FWERfT0ZGU0VUKGYpICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsZikKKyNkZWZpbmUgQUNQSV9FWERfTlNPRkZTRVQoZikgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLGYpCisjZGVmaW5lIEFDUElfRVhEX1RBQkxFX1NJWkUobmFtZSkgICAoc2l6ZW9mKG5hbWUpIC8gc2l6ZW9mIChzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbykpCisKKy8qCisgKiBJZiBwb3NzaWJsZSwgcGFjayB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSB0byBieXRlIGFsaWdubWVudCwgc2luY2Ugd2UKKyAqIGRvbid0IGNhcmUgYWJvdXQgcGVyZm9ybWFuY2UgZm9yIGRlYnVnIG91dHB1dAorICovCisjaWZuZGVmIEFDUElfTUlTQUxJR05NRU5UX05PVF9TVVBQT1JURUQKKyNwcmFnbWEgcGFjaygxKQorI2VuZGlmCisKK3R5cGVkZWYgY29uc3Qgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8geworCXU4IG9wY29kZTsKKwl1OCBvZmZzZXQ7CisJY2hhciAqbmFtZTsKKworfSBhY3BpX2V4ZHVtcF9pbmZvOworCisvKiBWYWx1ZXMgZm9yIHRoZSBPcGNvZGUgZmllbGQgYWJvdmUgKi8KKworI2RlZmluZSBBQ1BJX0VYRF9JTklUICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQUNQSV9FWERfVFlQRSAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFDUElfRVhEX1VJTlQ4ICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBBQ1BJX0VYRF9VSU5UMTYgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQUNQSV9FWERfVUlOVDMyICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEFDUElfRVhEX1VJTlQ2NCAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBBQ1BJX0VYRF9MSVRFUkFMICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQUNQSV9FWERfUE9JTlRFUiAgICAgICAgICAgICAgICA3CisjZGVmaW5lIEFDUElfRVhEX0FERFJFU1MgICAgICAgICAgICAgICAgOAorI2RlZmluZSBBQ1BJX0VYRF9TVFJJTkcgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgQUNQSV9FWERfQlVGRkVSICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBBQ1BJX0VYRF9QQUNLQUdFICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIEFDUElfRVhEX0ZJRUxEICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgQUNQSV9FWERfUkVGRVJFTkNFICAgICAgICAgICAgICAxMworCisvKiByZXN0b3JlIGRlZmF1bHQgYWxpZ25tZW50ICovCisKKyNwcmFnbWEgcGFjaygpCiAKIC8qCiAgKiBleGNvbnZydCAtIG9iamVjdCBjb252ZXJzaW9uCkBAIC0zMjcsNyArMzY5LDcgQEAKIHZvaWQKIGFjcGlfZXhfZHVtcF9vYmplY3RfZGVzY3JpcHRvcih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QsIHUzMiBmbGFncyk7CiAKLXZvaWQgYWNwaV9leF9kdW1wX25vZGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsIHUzMiBmbGFncyk7Cit2b2lkIGFjcGlfZXhfZHVtcF9uYW1lc3BhY2Vfbm9kZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwgdTMyIGZsYWdzKTsKICNlbmRpZgkJCQkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjbG9jYWwuaCBiL2luY2x1ZGUvYWNwaS9hY2xvY2FsLmgKaW5kZXggOWZiYTBmZC4uOTdmOGU0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjbG9jYWwuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNsb2NhbC5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMjc2LDYgKzI3NiwzNyBAQAogCXU4IGZpZWxkX3R5cGU7CiB9OwogCisvKgorICogQml0bWFwcGVkIEFDUEkgdHlwZXMuICBVc2VkIGludGVybmFsbHkgb25seQorICovCisjZGVmaW5lIEFDUElfQlRZUEVfQU5ZICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBBQ1BJX0JUWVBFX0lOVEVHRVIgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQUNQSV9CVFlQRV9TVFJJTkcgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEFDUElfQlRZUEVfQlVGRkVSICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBBQ1BJX0JUWVBFX1BBQ0tBR0UgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQUNQSV9CVFlQRV9GSUVMRF9VTklUICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEFDUElfQlRZUEVfREVWSUNFICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBBQ1BJX0JUWVBFX0VWRU5UICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgQUNQSV9CVFlQRV9NRVRIT0QgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEFDUElfQlRZUEVfTVVURVggICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBBQ1BJX0JUWVBFX1JFR0lPTiAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgQUNQSV9CVFlQRV9QT1dFUiAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEFDUElfQlRZUEVfUFJPQ0VTU09SICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBBQ1BJX0JUWVBFX1RIRVJNQUwgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgQUNQSV9CVFlQRV9CVUZGRVJfRklFTEQgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEFDUElfQlRZUEVfRERCX0hBTkRMRSAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBBQ1BJX0JUWVBFX0RFQlVHX09CSkVDVCAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgQUNQSV9CVFlQRV9SRUZFUkVOQ0UgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEFDUElfQlRZUEVfUkVTT1VSQ0UgICAgICAgICAgICAgMHgwMDAyMDAwMAorCisjZGVmaW5lIEFDUElfQlRZUEVfQ09NUFVURV9EQVRBICAgICAgICAgKEFDUElfQlRZUEVfSU5URUdFUiB8IEFDUElfQlRZUEVfU1RSSU5HIHwgQUNQSV9CVFlQRV9CVUZGRVIpCisKKyNkZWZpbmUgQUNQSV9CVFlQRV9EQVRBICAgICAgICAgICAgICAgICAoQUNQSV9CVFlQRV9DT01QVVRFX0RBVEEgIHwgQUNQSV9CVFlQRV9QQUNLQUdFKQorI2RlZmluZSBBQ1BJX0JUWVBFX0RBVEFfUkVGRVJFTkNFICAgICAgIChBQ1BJX0JUWVBFX0RBVEEgfCBBQ1BJX0JUWVBFX1JFRkVSRU5DRSB8IEFDUElfQlRZUEVfRERCX0hBTkRMRSkKKyNkZWZpbmUgQUNQSV9CVFlQRV9ERVZJQ0VfT0JKRUNUUyAgICAgICAoQUNQSV9CVFlQRV9ERVZJQ0UgfCBBQ1BJX0JUWVBFX1RIRVJNQUwgfCBBQ1BJX0JUWVBFX1BST0NFU1NPUikKKyNkZWZpbmUgQUNQSV9CVFlQRV9PQkpFQ1RTX0FORF9SRUZTICAgICAweDAwMDFGRkZGCS8qIEFSRyBvciBMT0NBTCAqLworI2RlZmluZSBBQ1BJX0JUWVBFX0FMTF9PQkpFQ1RTICAgICAgICAgIDB4MDAwMEZGRkYKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRXZlbnQgdHlwZWRlZnMgYW5kIHN0cnVjdHMKQEAgLTU3Myw2ICs2MDQsOCBAQAogCiAvKiBUaGUgcGFyc2Ugbm9kZSBpcyB0aGUgZnVuZGFtZW50YWwgZWxlbWVudCBvZiB0aGUgcGFyc2UgdHJlZSAqLwogCisjZGVmaW5lIEFDUElfTUFYX1BBUlNFT1BfTkFNRSAgIDIwCisKIHN0cnVjdCBhY3BpX3BhcnNlX29ial9hc2wgewogCUFDUElfUEFSU0VfQ09NTU9OIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpjaGlsZDsKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcGFyZW50X21ldGhvZDsKQEAgLTU5Nyw3ICs2MzAsNyBAQAogCXU4IGFtbF9vcGNvZGVfbGVuZ3RoOwogCXU4IGFtbF9wa2dfbGVuX2J5dGVzOwogCXU4IGV4dHJhOwotCWNoYXIgcGFyc2Vfb3BfbmFtZVsxMl07CisJY2hhciBwYXJzZV9vcF9uYW1lW0FDUElfTUFYX1BBUlNFT1BfTkFNRV07CiB9OwogCiB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCB7CkBAIC03MzUsNDQgKzc2OCw1MiBAQAogCiAvKiByZXNvdXJjZV90eXBlIHZhbHVlcyAqLwogCi0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUllfUkFOR0UgICAgICAgICAwCi0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfVFlQRV9JT19SQU5HRSAgICAgICAgICAgICAxCi0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfVFlQRV9CVVNfTlVNQkVSX1JBTkdFICAgICAyCisjZGVmaW5lIEFDUElfQUREUkVTU19UWVBFX01FTU9SWV9SQU5HRSAgICAgICAgICAwCisjZGVmaW5lIEFDUElfQUREUkVTU19UWVBFX0lPX1JBTkdFICAgICAgICAgICAgICAxCisjZGVmaW5lIEFDUElfQUREUkVTU19UWVBFX0JVU19OVU1CRVJfUkFOR0UgICAgICAyCiAKIC8qIFJlc291cmNlIGRlc2NyaXB0b3IgdHlwZXMgYW5kIG1hc2tzICovCiAKLSNkZWZpbmUgQUNQSV9SREVTQ19UWVBFX0xBUkdFICAgICAgICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgQUNQSV9SREVTQ19UWVBFX1NNQUxMICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQUNQSV9SRVNPVVJDRV9OQU1FX0xBUkdFICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgQUNQSV9SRVNPVVJDRV9OQU1FX1NNQUxMICAgICAgICAgICAgICAgIDB4MDAKIAotI2RlZmluZSBBQ1BJX1JERVNDX1RZUEVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg4MAotI2RlZmluZSBBQ1BJX1JERVNDX1NNQUxMX01BU0sgICAgICAgICAgICAgICAgICAgMHg3OAkvKiBPbmx5IGJpdHMgNjozIGNvbnRhaW4gdGhlIHR5cGUgKi8KKyNkZWZpbmUgQUNQSV9SRVNPVVJDRV9OQU1FX1NNQUxMX01BU0sgICAgICAgICAgIDB4NzgJLyogQml0cyA2OjMgY29udGFpbiB0aGUgdHlwZSAqLworI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfU01BTExfTEVOR1RIX01BU0sgICAgMHgwNwkvKiBCaXRzIDI6MCBjb250YWluIHRoZSBsZW5ndGggKi8KKyNkZWZpbmUgQUNQSV9SRVNPVVJDRV9OQU1FX0xBUkdFX01BU0sgICAgICAgICAgIDB4N0YJLyogQml0cyA2OjAgY29udGFpbiB0aGUgdHlwZSAqLwogCiAvKgotICogU21hbGwgcmVzb3VyY2UgZGVzY3JpcHRvciB0eXBlcwotICogTm90ZTogVGhlIDMgbGVuZ3RoIGJpdHMgKDI6MCkgbXVzdCBiZSB6ZXJvCisgKiBTbWFsbCByZXNvdXJjZSBkZXNjcmlwdG9yICJuYW1lcyIgYXMgZGVmaW5lZCBieSB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uLgorICogTm90ZTogQml0cyAyOjAgYXJlIHVzZWQgZm9yIHRoZSBkZXNjcmlwdG9yIGxlbmd0aAogICovCi0jZGVmaW5lIEFDUElfUkRFU0NfVFlQRV9JUlFfRk9STUFUICAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIEFDUElfUkRFU0NfVFlQRV9ETUFfRk9STUFUICAgICAgICAgICAgICAweDI4Ci0jZGVmaW5lIEFDUElfUkRFU0NfVFlQRV9TVEFSVF9ERVBFTkRFTlQgICAgICAgICAweDMwCi0jZGVmaW5lIEFDUElfUkRFU0NfVFlQRV9FTkRfREVQRU5ERU5UICAgICAgICAgICAweDM4Ci0jZGVmaW5lIEFDUElfUkRFU0NfVFlQRV9JT19QT1JUICAgICAgICAgICAgICAgICAweDQwCi0jZGVmaW5lIEFDUElfUkRFU0NfVFlQRV9GSVhFRF9JT19QT1JUICAgICAgICAgICAweDQ4Ci0jZGVmaW5lIEFDUElfUkRFU0NfVFlQRV9TTUFMTF9WRU5ET1IgICAgICAgICAgICAweDcwCi0jZGVmaW5lIEFDUElfUkRFU0NfVFlQRV9FTkRfVEFHICAgICAgICAgICAgICAgICAweDc4CisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9JUlEgICAgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9ETUEgICAgICAgICAgICAgICAgICAweDI4CisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9TVEFSVF9ERVBFTkRFTlQgICAgICAweDMwCisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9FTkRfREVQRU5ERU5UICAgICAgICAweDM4CisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9JTyAgICAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9GSVhFRF9JTyAgICAgICAgICAgICAweDQ4CisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9SRVNFUlZFRF9TMSAgICAgICAgICAweDUwCisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9SRVNFUlZFRF9TMiAgICAgICAgICAweDU4CisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9SRVNFUlZFRF9TMyAgICAgICAgICAweDYwCisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9SRVNFUlZFRF9TNCAgICAgICAgICAweDY4CisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9WRU5ET1JfU01BTEwgICAgICAgICAweDcwCisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9FTkRfVEFHICAgICAgICAgICAgICAweDc4CiAKIC8qCi0gKiBMYXJnZSByZXNvdXJjZSBkZXNjcmlwdG9yIHR5cGVzCisgKiBMYXJnZSByZXNvdXJjZSBkZXNjcmlwdG9yICJuYW1lcyIgYXMgZGVmaW5lZCBieSB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uLgorICogTm90ZTogaW5jbHVkZXMgdGhlIExhcmdlIERlc2NyaXB0b3IgYml0IGluIGJpdFs3XQogICovCi0jZGVmaW5lIEFDUElfUkRFU0NfVFlQRV9NRU1PUllfMjQgICAgICAgICAgICAgICAweDgxCi0jZGVmaW5lIEFDUElfUkRFU0NfVFlQRV9HRU5FUkFMX1JFR0lTVEVSICAgICAgICAweDgyCi0jZGVmaW5lIEFDUElfUkRFU0NfVFlQRV9MQVJHRV9WRU5ET1IgICAgICAgICAgICAweDg0Ci0jZGVmaW5lIEFDUElfUkRFU0NfVFlQRV9NRU1PUllfMzIgICAgICAgICAgICAgICAweDg1Ci0jZGVmaW5lIEFDUElfUkRFU0NfVFlQRV9GSVhFRF9NRU1PUllfMzIgICAgICAgICAweDg2Ci0jZGVmaW5lIEFDUElfUkRFU0NfVFlQRV9EV09SRF9BRERSRVNTX1NQQUNFICAgICAweDg3Ci0jZGVmaW5lIEFDUElfUkRFU0NfVFlQRV9XT1JEX0FERFJFU1NfU1BBQ0UgICAgICAweDg4Ci0jZGVmaW5lIEFDUElfUkRFU0NfVFlQRV9FWFRFTkRFRF9YUlVQVCAgICAgICAgICAweDg5Ci0jZGVmaW5lIEFDUElfUkRFU0NfVFlQRV9RV09SRF9BRERSRVNTX1NQQUNFICAgICAweDhBCi0jZGVmaW5lIEFDUElfUkRFU0NfVFlQRV9FWFRFTkRFRF9BRERSRVNTX1NQQUNFICAweDhCCisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9NRU1PUlkyNCAgICAgICAgICAgICAweDgxCisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9HRU5FUklDX1JFR0lTVEVSICAgICAweDgyCisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9SRVNFUlZFRF9MMSAgICAgICAgICAweDgzCisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9WRU5ET1JfTEFSR0UgICAgICAgICAweDg0CisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9NRU1PUlkzMiAgICAgICAgICAgICAweDg1CisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9GSVhFRF9NRU1PUlkzMiAgICAgICAweDg2CisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9BRERSRVNTMzIgICAgICAgICAgICAweDg3CisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9BRERSRVNTMTYgICAgICAgICAgICAweDg4CisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9FWFRFTkRFRF9JUlEgICAgICAgICAweDg5CisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9BRERSRVNTNjQgICAgICAgICAgICAweDhBCisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9FWFRFTkRFRF9BRERSRVNTNjQgICAweDhCCisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9MQVJHRV9NQVggICAgICAgICAgICAweDhCCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTc4MCw3ICs4MjEsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIEFDUElfQVNDSUlfWkVSTyAgICAgICAgICAgICAgICAgICAgICAweDMwCisjZGVmaW5lIEFDUElfQVNDSUlfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAweDMwCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY21hY3Jvcy5oIGIvaW5jbHVkZS9hY3BpL2FjbWFjcm9zLmgKaW5kZXggNzAyY2M0ZS4uNDliYTE1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjbWFjcm9zLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjbWFjcm9zLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC02MCw3ICs2MCw3IEBACiAKIC8qCiAgKiBGb3IgMTYtYml0IGFkZHJlc3Nlcywgd2UgaGF2ZSB0byBhc3N1bWUgdGhhdCB0aGUgdXBwZXIgMzIgYml0cwotICogYXJlIHplcm8uCisgKiAob3V0IG9mIDY0KSBhcmUgemVyby4KICAqLwogI2RlZmluZSBBQ1BJX0xPRFdPUkQobCkgICAgICAgICAgICAgICAgICgodTMyKShsKSkKICNkZWZpbmUgQUNQSV9ISURXT1JEKGwpICAgICAgICAgICAgICAgICAoKHUzMikoMCkpCkBAIC0xMDQsMzAgKzEwNCwzOCBAQAogI2RlZmluZSBBQ1BJX0ZPUk1BVF9VSU5UNjQoaSkgICAgICAgICAgIEFDUElfSElEV09SRChpKSxBQ1BJX0xPRFdPUkQoaSkKIAogLyoKLSAqIEV4dHJhY3QgYSBieXRlIG9mIGRhdGEgdXNpbmcgYSBwb2ludGVyLiAgQW55IG1vcmUgdGhhbiBhIGJ5dGUgYW5kIHdlCi0gKiBnZXQgaW50byBwb3RlbnRpYWwgYWxpZ21lbnQgaXNzdWVzIC0tIHNlZSB0aGUgU1RPUkUgbWFjcm9zIGJlbG93CisgKiBFeHRyYWN0IGRhdGEgdXNpbmcgYSBwb2ludGVyLiAgQW55IG1vcmUgdGhhbiBhIGJ5dGUgYW5kIHdlCisgKiBnZXQgaW50byBwb3RlbnRpYWwgYWxpZ21lbnQgaXNzdWVzIC0tIHNlZSB0aGUgU1RPUkUgbWFjcm9zIGJlbG93LgorICogVXNlIHdpdGggY2FyZS4KICAqLwotI2RlZmluZSBBQ1BJX0dFVDgoYWRkcikgICAgICAgICAgICAgICAgICgqKHU4KikoYWRkcikpCisjZGVmaW5lIEFDUElfR0VUOChwdHIpICAgICAgICAgICAgICAgICAgKkFDUElfQ0FTVF9QVFIgKHU4LCBwdHIpCisjZGVmaW5lIEFDUElfR0VUMTYocHRyKSAgICAgICAgICAgICAgICAgKkFDUElfQ0FTVF9QVFIgKHUxNiwgcHRyKQorI2RlZmluZSBBQ1BJX0dFVDMyKHB0cikgICAgICAgICAgICAgICAgICpBQ1BJX0NBU1RfUFRSICh1MzIsIHB0cikKKyNkZWZpbmUgQUNQSV9HRVQ2NChwdHIpICAgICAgICAgICAgICAgICAqQUNQSV9DQVNUX1BUUiAodTY0LCBwdHIpCisjZGVmaW5lIEFDUElfU0VUOChwdHIpICAgICAgICAgICAgICAgICAgKkFDUElfQ0FTVF9QVFIgKHU4LCBwdHIpCisjZGVmaW5lIEFDUElfU0VUMTYocHRyKSAgICAgICAgICAgICAgICAgKkFDUElfQ0FTVF9QVFIgKHUxNiwgcHRyKQorI2RlZmluZSBBQ1BJX1NFVDMyKHB0cikgICAgICAgICAgICAgICAgICpBQ1BJX0NBU1RfUFRSICh1MzIsIHB0cikKKyNkZWZpbmUgQUNQSV9TRVQ2NChwdHIpICAgICAgICAgICAgICAgICAqQUNQSV9DQVNUX1BUUiAodTY0LCBwdHIpCiAKLS8qIFBvaW50ZXIgYXJpdGhtZXRpYyAqLwotCi0jZGVmaW5lIEFDUElfUFRSX0FERCh0LGEsYikgICAgICAgICAgICAgKHQgKikgKHZvaWQgKikoKGNoYXIgKikoYSkgKyAoYWNwaV9uYXRpdmVfdWludCkoYikpCi0jZGVmaW5lIEFDUElfUFRSX0RJRkYoYSxiKSAgICAgICAgICAgICAgKGFjcGlfbmF0aXZlX3VpbnQpICgoY2hhciAqKShhKSAtIChjaGFyICopKGIpKQorLyoKKyAqIFBvaW50ZXIgbWFuaXB1bGF0aW9uCisgKi8KKyNkZWZpbmUgQUNQSV9DQVNUX1BUUih0LCBwKSAgICAgICAgICAgICAoKHQgKikgKGFjcGlfdWludHB0cl90KSAocCkpCisjZGVmaW5lIEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIodCwgcCkgICAgKCh0ICoqKSAoYWNwaV91aW50cHRyX3QpIChwKSkKKyNkZWZpbmUgQUNQSV9BRERfUFRSKHQsYSxiKSAgICAgICAgICAgICBBQ1BJX0NBU1RfUFRSICh0LCAoQUNQSV9DQVNUX1BUUiAodTgsKGEpKSArIChhY3BpX25hdGl2ZV91aW50KShiKSkpCisjZGVmaW5lIEFDUElfUFRSX0RJRkYoYSxiKSAgICAgICAgICAgICAgKGFjcGlfbmF0aXZlX3VpbnQpIChBQ1BJX0NBU1RfUFRSICh1OCwoYSkpIC0gQUNQSV9DQVNUX1BUUiAodTgsKGIpKSkKIAogLyogUG9pbnRlci9JbnRlZ2VyIHR5cGUgY29udmVyc2lvbnMgKi8KIAotI2RlZmluZSBBQ1BJX1RPX1BPSU5URVIoaSkgICAgICAgICAgICAgIEFDUElfUFRSX0FERCAodm9pZCwgKHZvaWQgKikgTlVMTCwoYWNwaV9uYXRpdmVfdWludClpKQorI2RlZmluZSBBQ1BJX1RPX1BPSU5URVIoaSkgICAgICAgICAgICAgIEFDUElfQUREX1BUUiAodm9pZCwodm9pZCAqKSBOVUxMLChhY3BpX25hdGl2ZV91aW50KSBpKQogI2RlZmluZSBBQ1BJX1RPX0lOVEVHRVIocCkgICAgICAgICAgICAgIEFDUElfUFRSX0RJRkYgKHAsKHZvaWQgKikgTlVMTCkKICNkZWZpbmUgQUNQSV9PRkZTRVQoZCxmKSAgICAgICAgICAgICAgICAoYWNwaV9zaXplKSBBQ1BJX1BUUl9ESUZGICgmKCgoZCAqKTApLT5mKSwodm9pZCAqKSBOVUxMKQogI2RlZmluZSBBQ1BJX0ZBRFRfT0ZGU0VUKGYpICAgICAgICAgICAgIEFDUElfT0ZGU0VUIChGQURUX0RFU0NSSVBUT1IsIGYpCiAKLSNkZWZpbmUgQUNQSV9DQVNUX1BUUih0LCBwKSAgICAgICAgICAgICAoKHQgKikodm9pZCAqKShwKSkKLSNkZWZpbmUgQUNQSV9DQVNUX0lORElSRUNUX1BUUih0LCBwKSAgICAoKHQgKiopKHZvaWQgKikocCkpCi0KICNpZiBBQ1BJX01BQ0hJTkVfV0lEVEggPT0gMTYKICNkZWZpbmUgQUNQSV9TVE9SRV9QT0lOVEVSKGQscykgICAgICAgICBBQ1BJX01PVkVfMzJfVE9fMzIoZCxzKQogI2RlZmluZSBBQ1BJX1BIWVNBRERSX1RPX1BUUihpKSAgICAgICAgICh2b2lkICopKGkpCi0jZGVmaW5lIEFDUElfUFRSX1RPX1BIWVNBRERSKGkpICAgICAgICAgKHUzMikgKGNoYXIgKikoaSkKKyNkZWZpbmUgQUNQSV9QVFJfVE9fUEhZU0FERFIoaSkgICAgICAgICAodTMyKSBBQ1BJX0NBU1RfUFRSICh1OCwoaSkpCiAjZWxzZQogI2RlZmluZSBBQ1BJX1BIWVNBRERSX1RPX1BUUihpKSAgICAgICAgIEFDUElfVE9fUE9JTlRFUihpKQogI2RlZmluZSBBQ1BJX1BUUl9UT19QSFlTQUREUihpKSAgICAgICAgIEFDUElfVE9fSU5URUdFUihpKQpAQCAtMjAyLDcgKzIxMCw3IEBACiAKICNkZWZpbmUgQUNQSV9CVUZGRVJfSU5ERVgoYnVmX2xlbixidWZfb2Zmc2V0LGJ5dGVfZ3JhbikgKGJ1Zl9vZmZzZXQpCiAKLSNpZmRlZiBBQ1BJX01JU0FMSUdORURfVFJBTlNGRVJTCisjaWZuZGVmIEFDUElfTUlTQUxJR05NRU5UX05PVF9TVVBQT1JURUQKIAogLyogVGhlIGhhcmR3YXJlIHN1cHBvcnRzIHVuYWxpZ25lZCB0cmFuc2ZlcnMsIGp1c3QgZG8gdGhlIGxpdHRsZS1lbmRpYW4gbW92ZSAqLwogCkBAIC0zMjYsNiArMzM0LDEwIEBACiAjZGVmaW5lIEFDUElfTVVMXzE2KGEpICAgICAgICAgICAgICAgICAgX0FDUElfTVVMKGEsNCkKICNkZWZpbmUgQUNQSV9NT0RfMTYoYSkgICAgICAgICAgICAgICAgICBfQUNQSV9NT0QoYSwxNikKIAorI2RlZmluZSBBQ1BJX0RJVl8zMihhKSAgICAgICAgICAgICAgICAgIF9BQ1BJX0RJVihhLDUpCisjZGVmaW5lIEFDUElfTVVMXzMyKGEpICAgICAgICAgICAgICAgICAgX0FDUElfTVVMKGEsNSkKKyNkZWZpbmUgQUNQSV9NT0RfMzIoYSkgICAgICAgICAgICAgICAgICBfQUNQSV9NT0QoYSwzMikKKwogLyoKICAqIFJvdW5kaW5nIG1hY3JvcyAoUG93ZXIgb2YgdHdvIGJvdW5kYXJpZXMgb25seSkKICAqLwpAQCAtMzY1LDYgKzM3NywxMyBAQAogI2RlZmluZSBBQ1BJX1JFR0lTVEVSX1BSRVBBUkVfQklUUyh2YWwsIHBvcywgbWFzaykgICAgICAoKHZhbCA8PCBwb3MpICYgbWFzaykKICNkZWZpbmUgQUNQSV9SRUdJU1RFUl9JTlNFUlRfVkFMVUUocmVnLCBwb3MsIG1hc2ssIHZhbCkgIHJlZyA9IChyZWcgJiAofihtYXNrKSkpIHwgQUNQSV9SRUdJU1RFUl9QUkVQQVJFX0JJVFModmFsLCBwb3MsIG1hc2spCiAKKy8qIEdlbmVyYXRlIGEgVVVJRCAqLworCisjZGVmaW5lIEFDUElfSU5JVF9VVUlEKGEsYixjLGQwLGQxLGQyLGQzLGQ0LGQ1LGQ2LGQ3KSAgIChhKSAmIDB4RkYsICgoYSkgPj4gOCkgJiAweEZGLCAoKGEpID4+IDE2KSAmIDB4RkYsICgoYSkgPj4gMjQpICYgMHhGRiwgXAorCQkJCQkJCQkJCQkJICAoYikgJiAweEZGLCAoKGIpID4+IDgpICYgMHhGRiwgXAorCQkJCQkJCQkJCQkJICAoYykgJiAweEZGLCAoKGMpID4+IDgpICYgMHhGRiwgXAorCQkJCQkJCQkJCQkJICAoZDApLCAoZDEpLCAoZDIpLCAoZDMpLCAoZDQpLCAoZDUpLCAoZDYpLCAoZDcpCisKIC8qCiAgKiBBbiBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqIGNhbiBhcHBlYXIgaW4gc29tZSBjb250ZXh0cywKICAqIHdoZXJlIGEgcG9pbnRlciB0byBhbiB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgIGNhbiBhbHNvCkBAIC00MjQsNTYgKzQ0Myw2NiBAQAogI2RlZmluZSBJTkNSRU1FTlRfQVJHX0xJU1QobGlzdCkgICAgICAgIChsaXN0ID4+PSAoKHUzMikgQVJHX1RZUEVfV0lEVEgpKQogCiAvKgotICogUmVwb3J0aW5nIG1hY3JvcyB0aGF0IGFyZSBuZXZlciBjb21waWxlZCBvdXQKKyAqIE1vZHVsZSBuYW1lIGlzIGluY2x1ZGUgaW4gYm90aCBkZWJ1ZyBhbmQgbm9uLWRlYnVnIHZlcnNpb25zIHByaW1hcmlseSBmb3IKKyAqIGVycm9yIG1lc3NhZ2VzLiBUaGUgX19GSUxFX18gbWFjcm8gaXMgbm90IHZlcnkgdXNlZnVsIGZvciB0aGlzLCBiZWNhdXNlIGl0CisgKiBvZnRlbiBpbmNsdWRlcyB0aGUgZW50aXJlIHBhdGhuYW1lIHRvIHRoZSBtb2R1bGUKICAqLwotI2RlZmluZSBBQ1BJX1BBUkFNX0xJU1QocGwpICAgICAgICAgICAgICAgICBwbAorI2lmIGRlZmluZWQgKEFDUElfREVCVUdfT1VUUFVUKSB8fCAhZGVmaW5lZCAoQUNQSV9OT19FUlJPUl9NRVNTQUdFUykKIAotLyoKLSAqIEVycm9yIHJlcG9ydGluZy4gIFRoZXNlIHZlcnNpb25zIGFkZCBjYWxsZXJzIG1vZHVsZSBhbmQgbGluZSMuCi0gKgotICogU2luY2UgX2FjcGlfbW9kdWxlX25hbWUgZ2V0cyBjb21waWxlZCBvdXQgd2hlbiBBQ1BJX0RFQlVHX09VVFBVVAotICogaXNuJ3QgZGVmaW5lZCwgb25seSB1c2UgaXQgaW4gZGVidWcgbW9kZS4KLSAqLwotI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCi0KLSNkZWZpbmUgQUNQSV9SRVBPUlRfSU5GTyhmcCkgICAgICAgICAgICAgICAge2FjcGlfdXRfcmVwb3J0X2luZm8oX2FjcGlfbW9kdWxlX25hbWUsX19MSU5FX18sX0NPTVBPTkVOVCk7IFwKLQkJCQkJCQkJCQkJCWFjcGlfb3NfcHJpbnRmIEFDUElfUEFSQU1fTElTVChmcCk7fQotI2RlZmluZSBBQ1BJX1JFUE9SVF9FUlJPUihmcCkgICAgICAgICAgICAgICB7YWNwaV91dF9yZXBvcnRfZXJyb3IoX2FjcGlfbW9kdWxlX25hbWUsX19MSU5FX18sX0NPTVBPTkVOVCk7IFwKLQkJCQkJCQkJCQkJCWFjcGlfb3NfcHJpbnRmIEFDUElfUEFSQU1fTElTVChmcCk7fQotI2RlZmluZSBBQ1BJX1JFUE9SVF9XQVJOSU5HKGZwKSAgICAgICAgICAgICB7YWNwaV91dF9yZXBvcnRfd2FybmluZyhfYWNwaV9tb2R1bGVfbmFtZSxfX0xJTkVfXyxfQ09NUE9ORU5UKTsgXAotCQkJCQkJCQkJCQkJYWNwaV9vc19wcmludGYgQUNQSV9QQVJBTV9MSVNUKGZwKTt9Ci0jZGVmaW5lIEFDUElfUkVQT1JUX05TRVJST1IocyxlKSAgICAgICAgICAgIGFjcGlfbnNfcmVwb3J0X2Vycm9yKF9hY3BpX21vZHVsZV9uYW1lLF9fTElORV9fLF9DT01QT05FTlQsIHMsIGUpOwotCi0jZGVmaW5lIEFDUElfUkVQT1JUX01FVEhPRF9FUlJPUihzLG4scCxlKSAgIGFjcGlfbnNfcmVwb3J0X21ldGhvZF9lcnJvcihfYWNwaV9tb2R1bGVfbmFtZSxfX0xJTkVfXyxfQ09NUE9ORU5ULCBzLCBuLCBwLCBlKTsKLQorI2RlZmluZSBBQ1BJX01PRFVMRV9OQU1FKG5hbWUpICAgICAgICAgIHN0YXRpYyBjaGFyIEFDUElfVU5VU0VEX1ZBUiAqX2FjcGlfbW9kdWxlX25hbWUgPSBuYW1lOwogI2Vsc2UKLQotI2RlZmluZSBBQ1BJX1JFUE9SVF9JTkZPKGZwKSAgICAgICAgICAgICAgICB7YWNwaV91dF9yZXBvcnRfaW5mbygiQUNQSSIsX19MSU5FX18sX0NPTVBPTkVOVCk7IFwKLQkJCQkJCQkJCQkJCWFjcGlfb3NfcHJpbnRmIEFDUElfUEFSQU1fTElTVChmcCk7fQotI2RlZmluZSBBQ1BJX1JFUE9SVF9FUlJPUihmcCkgICAgICAgICAgICAgICB7YWNwaV91dF9yZXBvcnRfZXJyb3IoIkFDUEkiLF9fTElORV9fLF9DT01QT05FTlQpOyBcCi0JCQkJCQkJCQkJCQlhY3BpX29zX3ByaW50ZiBBQ1BJX1BBUkFNX0xJU1QoZnApO30KLSNkZWZpbmUgQUNQSV9SRVBPUlRfV0FSTklORyhmcCkgICAgICAgICAgICAge2FjcGlfdXRfcmVwb3J0X3dhcm5pbmcoIkFDUEkiLF9fTElORV9fLF9DT01QT05FTlQpOyBcCi0JCQkJCQkJCQkJCQlhY3BpX29zX3ByaW50ZiBBQ1BJX1BBUkFNX0xJU1QoZnApO30KLSNkZWZpbmUgQUNQSV9SRVBPUlRfTlNFUlJPUihzLGUpICAgICAgICAgICAgYWNwaV9uc19yZXBvcnRfZXJyb3IoIkFDUEkiLF9fTElORV9fLF9DT01QT05FTlQsIHMsIGUpOwotCi0jZGVmaW5lIEFDUElfUkVQT1JUX01FVEhPRF9FUlJPUihzLG4scCxlKSAgIGFjcGlfbnNfcmVwb3J0X21ldGhvZF9lcnJvcigiQUNQSSIsX19MSU5FX18sX0NPTVBPTkVOVCwgcywgbiwgcCwgZSk7Ci0KKyNkZWZpbmUgQUNQSV9NT0RVTEVfTkFNRShuYW1lKQogI2VuZGlmCiAKLS8qIEVycm9yIHJlcG9ydGluZy4gIFRoZXNlIHZlcnNpb25zIHBhc3MgdGhydSB0aGUgbW9kdWxlIGFuZCBsaW5lIyAqLworLyoKKyAqIEFzY2lpIGVycm9yIG1lc3NhZ2VzIGNhbiBiZSBjb25maWd1cmVkIG91dAorICovCisjaWZuZGVmIEFDUElfTk9fRVJST1JfTUVTU0FHRVMKIAotI2RlZmluZSBfQUNQSV9SRVBPUlRfSU5GTyhhLGIsYyxmcCkgICAgICAgICB7YWNwaV91dF9yZXBvcnRfaW5mbyhhLGIsYyk7IFwKLQkJCQkJCQkJCQkJCWFjcGlfb3NfcHJpbnRmIEFDUElfUEFSQU1fTElTVChmcCk7fQotI2RlZmluZSBfQUNQSV9SRVBPUlRfRVJST1IoYSxiLGMsZnApICAgICAgICB7YWNwaV91dF9yZXBvcnRfZXJyb3IoYSxiLGMpOyBcCi0JCQkJCQkJCQkJCQlhY3BpX29zX3ByaW50ZiBBQ1BJX1BBUkFNX0xJU1QoZnApO30KLSNkZWZpbmUgX0FDUElfUkVQT1JUX1dBUk5JTkcoYSxiLGMsZnApICAgICAge2FjcGlfdXRfcmVwb3J0X3dhcm5pbmcoYSxiLGMpOyBcCi0JCQkJCQkJCQkJCQlhY3BpX29zX3ByaW50ZiBBQ1BJX1BBUkFNX0xJU1QoZnApO30KKyNkZWZpbmUgQUNQSV9QQVJBTV9MSVNUKHBsKSAgICAgICAgICAgICBwbAorI2RlZmluZSBBQ1BJX0xPQ0FUSU9OX0lORk8gICAgICAgICAgICAgIF9hY3BpX21vZHVsZV9uYW1lLCBfX0xJTkVfXworCisvKgorICogRXJyb3IgcmVwb3J0aW5nLiBDYWxsZXJzIG1vZHVsZSBhbmQgbGluZSBudW1iZXIgYXJlIGluc2VydGVkIGF1dG9tYXRpY2FsbHkKKyAqIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBmb3IgYm90aCB0aGUgZGVidWcgYW5kIG5vbi1kZWJ1ZyB2ZXJzaW9ucyBvZiB0aGUgY29kZQorICovCisjZGVmaW5lIEFDUElfUkVQT1JUX0lORk8oZnApICAgICAgICAgICAge2FjcGlfdXRfcmVwb3J0X2luZm8gKEFDUElfTE9DQVRJT05fSU5GTyk7IFwKKwkJCQkJCQkJCQkJYWNwaV9vc19wcmludGYgQUNQSV9QQVJBTV9MSVNUIChmcCk7fQorI2RlZmluZSBBQ1BJX1JFUE9SVF9FUlJPUihmcCkgICAgICAgICAgIHthY3BpX3V0X3JlcG9ydF9lcnJvciAoQUNQSV9MT0NBVElPTl9JTkZPKTsgXAorCQkJCQkJCQkJCQlhY3BpX29zX3ByaW50ZiBBQ1BJX1BBUkFNX0xJU1QgKGZwKTt9CisjZGVmaW5lIEFDUElfUkVQT1JUX1dBUk5JTkcoZnApICAgICAgICAge2FjcGlfdXRfcmVwb3J0X3dhcm5pbmcgKEFDUElfTE9DQVRJT05fSU5GTyk7IFwKKwkJCQkJCQkJCQkJYWNwaV9vc19wcmludGYgQUNQSV9QQVJBTV9MSVNUIChmcCk7fQorI2RlZmluZSBBQ1BJX1JFUE9SVF9OU0VSUk9SKHMsZSkgICAgICAgIGFjcGlfbnNfcmVwb3J0X2Vycm9yIChBQ1BJX0xPQ0FUSU9OX0lORk8sIFwKKwkJCQkJCQkJCQkJcywgZSk7CisjZGVmaW5lIEFDUElfUkVQT1JUX01URVJST1IocyxuLHAsZSkgICAgYWNwaV9uc19yZXBvcnRfbWV0aG9kX2Vycm9yIChBQ1BJX0xPQ0FUSU9OX0lORk8sIFwKKwkJCQkJCQkJCQkJcywgbiwgcCwgZSk7CisKKy8qIEVycm9yIHJlcG9ydGluZy4gVGhlc2UgdmVyc2lvbnMgcGFzcyB0aHJ1IHRoZSBtb2R1bGUgYW5kIGxpbmVubyAqLworCisjZGVmaW5lIF9BQ1BJX1JFUE9SVF9JTkZPKGEsYixmcCkgICAgICAge2FjcGlfdXRfcmVwb3J0X2luZm8gKGEsYik7IFwKKwkJCQkJCQkJCQkJYWNwaV9vc19wcmludGYgQUNQSV9QQVJBTV9MSVNUIChmcCk7fQorI2RlZmluZSBfQUNQSV9SRVBPUlRfRVJST1IoYSxiLGZwKSAgICAgIHthY3BpX3V0X3JlcG9ydF9lcnJvciAoYSxiKTsgXAorCQkJCQkJCQkJCQlhY3BpX29zX3ByaW50ZiBBQ1BJX1BBUkFNX0xJU1QgKGZwKTt9CisjZGVmaW5lIF9BQ1BJX1JFUE9SVF9XQVJOSU5HKGEsYixmcCkgICAge2FjcGlfdXRfcmVwb3J0X3dhcm5pbmcgKGEsYik7IFwKKwkJCQkJCQkJCQkJYWNwaV9vc19wcmludGYgQUNQSV9QQVJBTV9MSVNUIChmcCk7fQorI2Vsc2UKKworLyogTm8gZXJyb3IgbWVzc2FnZXMgKi8KKworI2RlZmluZSBBQ1BJX1JFUE9SVF9JTkZPKGZwKQorI2RlZmluZSBBQ1BJX1JFUE9SVF9FUlJPUihmcCkKKyNkZWZpbmUgQUNQSV9SRVBPUlRfV0FSTklORyhmcCkKKyNkZWZpbmUgQUNQSV9SRVBPUlRfTlNFUlJPUihzLGUpCisjZGVmaW5lIEFDUElfUkVQT1JUX01URVJST1IocyxuLHAsZSkKKyNkZWZpbmUgX0FDUElfUkVQT1JUX0lORk8oYSxiLGMsZnApCisjZGVmaW5lIF9BQ1BJX1JFUE9SVF9FUlJPUihhLGIsYyxmcCkKKyNkZWZpbmUgX0FDUElfUkVQT1JUX1dBUk5JTkcoYSxiLGMsZnApCisjZW5kaWYKIAogLyoKICAqIERlYnVnIG1hY3JvcyB0aGF0IGFyZSBjb25kaXRpb25hbGx5IGNvbXBpbGVkCiAgKi8KICNpZmRlZiBBQ1BJX0RFQlVHX09VVFBVVAotI2RlZmluZSBBQ1BJX01PRFVMRV9OQU1FKG5hbWUpICAgICAgICAgIHN0YXRpYyBjaGFyIEFDUElfVU5VU0VEX1ZBUiAqX2FjcGlfbW9kdWxlX25hbWUgPSBuYW1lOwogCiAvKgogICogQ29tbW9uIHBhcmFtZXRlcnMgdXNlZCBmb3IgZGVidWcgb3V0cHV0IGZ1bmN0aW9uczoKQEAgLTUyNSw2ICs1NTQsOSBAQAogICogYmFkIGZvcm0sIGJ1dCBoYXZpbmcgYSBzZXBhcmF0ZSBleGl0IG1hY3JvIGlzIHZlcnkgdWdseSBhbmQgZGlmZmljdWx0IHRvIG1haW50YWluLgogICogT25lIG9mIHRoZSBGVU5DVElPTl9UUkFDRSBtYWNyb3MgYWJvdmUgbXVzdCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlc2UgbWFjcm9zCiAgKiBzbyB0aGF0ICJfYWNwaV9mdW5jdGlvbl9uYW1lIiBpcyBkZWZpbmVkLgorICoKKyAqIE5vdGU6IHRoZSBET19XSElMRTAgbWFjcm8gaXMgdXNlZCB0byBwcmV2ZW50IHNvbWUgY29tcGlsZXJzIGZyb20gY29tcGxhaW5pbmcKKyAqIGFib3V0IHRoZXNlIGNvbnN0cnVjdHMuCiAgKi8KICNpZmRlZiBBQ1BJX1VTRV9ET19XSElMRV8wCiAjZGVmaW5lIEFDUElfRE9fV0hJTEUwKGEpICAgICAgICAgICAgICAgZG8gYSB3aGlsZSgwKQpAQCAtNTMyLDEwICs1NjQsNTUgQEAKICNkZWZpbmUgQUNQSV9ET19XSElMRTAoYSkgICAgICAgICAgICAgICBhCiAjZW5kaWYKIAotI2RlZmluZSByZXR1cm5fVk9JRCAgICAgICAgICAgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7YWNwaV91dF9leGl0KEFDUElfREVCVUdfUEFSQU1FVEVSUyk7cmV0dXJuO30pCi0jZGVmaW5lIHJldHVybl9BQ1BJX1NUQVRVUyhzKSAgICAgICAgICAgQUNQSV9ET19XSElMRTAgKHthY3BpX3V0X3N0YXR1c19leGl0KEFDUElfREVCVUdfUEFSQU1FVEVSUywocykpO3JldHVybigocykpO30pCi0jZGVmaW5lIHJldHVybl9WQUxVRShzKSAgICAgICAgICAgICAgICAgQUNQSV9ET19XSElMRTAgKHthY3BpX3V0X3ZhbHVlX2V4aXQoQUNQSV9ERUJVR19QQVJBTUVURVJTLChhY3BpX2ludGVnZXIpKHMpKTtyZXR1cm4oKHMpKTt9KQotI2RlZmluZSByZXR1cm5fUFRSKHMpICAgICAgICAgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7YWNwaV91dF9wdHJfZXhpdChBQ1BJX0RFQlVHX1BBUkFNRVRFUlMsKHU4ICopKHMpKTtyZXR1cm4oKHMpKTt9KQorI2RlZmluZSByZXR1cm5fVk9JRCAgICAgICAgICAgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7IFwKKwkJCQkJCQkJCQkJYWNwaV91dF9leGl0IChBQ1BJX0RFQlVHX1BBUkFNRVRFUlMpOyBcCisJCQkJCQkJCQkJCXJldHVybjt9KQorLyoKKyAqIFRoZXJlIGFyZSB0d28gdmVyc2lvbnMgb2YgbW9zdCBvZiB0aGUgcmV0dXJuIG1hY3Jvcy4gVGhlIGRlZmF1bHQgdmVyc2lvbiBpcworICogc2FmZXIsIHNpbmNlIGl0IGF2b2lkcyBzaWRlLWVmZmVjdHMgYnkgZ3VhcmFudGVlaW5nIHRoYXQgdGhlIGFyZ3VtZW50IHdpbGwKKyAqIG5vdCBiZSBldmFsdWF0ZWQgdHdpY2UuCisgKgorICogQSBsZXNzLXNhZmUgdmVyc2lvbiBvZiB0aGUgbWFjcm9zIGlzIHByb3ZpZGVkIGZvciBvcHRpb25hbCB1c2UgaWYgdGhlCisgKiBjb21waWxlciB1c2VzIGV4Y2Vzc2l2ZSBDUFUgc3RhY2sgKGZvciBleGFtcGxlLCB0aGlzIG1heSBoYXBwZW4gaW4gdGhlCisgKiBkZWJ1ZyBjYXNlIGlmIGNvZGUgb3B0aW16YXRpb24gaXMgZGlzYWJsZWQuKQorICovCisjaWZuZGVmIEFDUElfU0lNUExFX1JFVFVSTl9NQUNST1MKKworI2RlZmluZSByZXR1cm5fQUNQSV9TVEFUVVMocykgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7IFwKKwkJCQkJCQkJCQkJcmVnaXN0ZXIgYWNwaV9zdGF0dXMgX3MgPSAocyk7IFwKKwkJCQkJCQkJCQkJYWNwaV91dF9zdGF0dXNfZXhpdCAoQUNQSV9ERUJVR19QQVJBTUVURVJTLCBfcyk7IFwKKwkJCQkJCQkJCQkJcmV0dXJuIChfcyk7IH0pCisjZGVmaW5lIHJldHVybl9QVFIocykgICAgICAgICAgICAgICAgICAgQUNQSV9ET19XSElMRTAgKHsgXAorCQkJCQkJCQkJCQlyZWdpc3RlciB2b2lkICpfcyA9ICh2b2lkICopIChzKTsgXAorCQkJCQkJCQkJCQlhY3BpX3V0X3B0cl9leGl0IChBQ1BJX0RFQlVHX1BBUkFNRVRFUlMsICh1OCAqKSBfcyk7IFwKKwkJCQkJCQkJCQkJcmV0dXJuIChfcyk7IH0pCisjZGVmaW5lIHJldHVybl9WQUxVRShzKSAgICAgICAgICAgICAgICAgQUNQSV9ET19XSElMRTAgKHsgXAorCQkJCQkJCQkJCQlyZWdpc3RlciBhY3BpX2ludGVnZXIgX3MgPSAocyk7IFwKKwkJCQkJCQkJCQkJYWNwaV91dF92YWx1ZV9leGl0IChBQ1BJX0RFQlVHX1BBUkFNRVRFUlMsIF9zKTsgXAorCQkJCQkJCQkJCQlyZXR1cm4gKF9zKTsgfSkKKyNkZWZpbmUgcmV0dXJuX1VJTlQ4KHMpICAgICAgICAgICAgICAgICBBQ1BJX0RPX1dISUxFMCAoeyBcCisJCQkJCQkJCQkJCXJlZ2lzdGVyIHU4IF9zID0gKHU4KSAocyk7IFwKKwkJCQkJCQkJCQkJYWNwaV91dF92YWx1ZV9leGl0IChBQ1BJX0RFQlVHX1BBUkFNRVRFUlMsIChhY3BpX2ludGVnZXIpIF9zKTsgXAorCQkJCQkJCQkJCQlyZXR1cm4gKF9zKTsgfSkKKyNkZWZpbmUgcmV0dXJuX1VJTlQzMihzKSAgICAgICAgICAgICAgICBBQ1BJX0RPX1dISUxFMCAoeyBcCisJCQkJCQkJCQkJCXJlZ2lzdGVyIHUzMiBfcyA9ICh1MzIpIChzKTsgXAorCQkJCQkJCQkJCQlhY3BpX3V0X3ZhbHVlX2V4aXQgKEFDUElfREVCVUdfUEFSQU1FVEVSUywgKGFjcGlfaW50ZWdlcikgX3MpOyBcCisJCQkJCQkJCQkJCXJldHVybiAoX3MpOyB9KQorI2Vsc2UJCQkJLyogVXNlIG9yaWdpbmFsIGxlc3Mtc2FmZSBtYWNyb3MgKi8KKworI2RlZmluZSByZXR1cm5fQUNQSV9TVEFUVVMocykgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7IFwKKwkJCQkJCQkJCQkJYWNwaV91dF9zdGF0dXNfZXhpdCAoQUNQSV9ERUJVR19QQVJBTUVURVJTLCAocykpOyBcCisJCQkJCQkJCQkJCXJldHVybigocykpOyB9KQorI2RlZmluZSByZXR1cm5fUFRSKHMpICAgICAgICAgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7IFwKKwkJCQkJCQkJCQkJYWNwaV91dF9wdHJfZXhpdCAoQUNQSV9ERUJVR19QQVJBTUVURVJTLCAodTggKikgKHMpKTsgXAorCQkJCQkJCQkJCQlyZXR1cm4oKHMpKTsgfSkKKyNkZWZpbmUgcmV0dXJuX1ZBTFVFKHMpICAgICAgICAgICAgICAgICBBQ1BJX0RPX1dISUxFMCAoeyBcCisJCQkJCQkJCQkJCWFjcGlfdXRfdmFsdWVfZXhpdCAoQUNQSV9ERUJVR19QQVJBTUVURVJTLCAoYWNwaV9pbnRlZ2VyKSAocykpOyBcCisJCQkJCQkJCQkJCXJldHVybigocykpOyB9KQorI2RlZmluZSByZXR1cm5fVUlOVDgocykgICAgICAgICAgICAgICAgIHJldHVybl9WQUxVRShzKQorI2RlZmluZSByZXR1cm5fVUlOVDMyKHMpICAgICAgICAgICAgICAgIHJldHVybl9WQUxVRShzKQorCisjZW5kaWYJCQkJLyogQUNQSV9TSU1QTEVfUkVUVVJOX01BQ1JPUyAqLwogCiAvKiBDb25kaXRpb25hbCBleGVjdXRpb24gKi8KIApAQCAtNTgyLDkgKzY1OSw2IEBACiAgKiBUaGlzIGlzIHRoZSBub24tZGVidWcgY2FzZSAtLSBtYWtlIGV2ZXJ5dGhpbmcgZ28gYXdheSwKICAqIGxlYXZpbmcgbm8gZXhlY3V0YWJsZSBkZWJ1ZyBjb2RlIQogICovCi0jZGVmaW5lIEFDUElfTU9EVUxFX05BTUUobmFtZSkKLSNkZWZpbmUgX2FjcGlfbW9kdWxlX25hbWUgIiIKLQogI2RlZmluZSBBQ1BJX0RFQlVHX0VYRUMoYSkKICNkZWZpbmUgQUNQSV9OT1JNQUxfRVhFQyhhKSAgICAgICAgICAgICBhOwogCkBAIC02MTIsNiArNjg2LDggQEAKICNkZWZpbmUgcmV0dXJuX1ZPSUQgICAgICAgICAgICAgICAgICAgICByZXR1cm4KICNkZWZpbmUgcmV0dXJuX0FDUElfU1RBVFVTKHMpICAgICAgICAgICByZXR1cm4ocykKICNkZWZpbmUgcmV0dXJuX1ZBTFVFKHMpICAgICAgICAgICAgICAgICByZXR1cm4ocykKKyNkZWZpbmUgcmV0dXJuX1VJTlQ4KHMpICAgICAgICAgICAgICAgICByZXR1cm4ocykKKyNkZWZpbmUgcmV0dXJuX1VJTlQzMihzKSAgICAgICAgICAgICAgICByZXR1cm4ocykKICNkZWZpbmUgcmV0dXJuX1BUUihzKSAgICAgICAgICAgICAgICAgICByZXR1cm4ocykKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNuYW1lcy5oIGIvaW5jbHVkZS9hY3BpL2FjbmFtZXMuaAppbmRleCA0ZjkwNjNmLi5iNjdkYTM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNuYW1lcy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY25hbWVzLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNuYW1lc3AuaCBiL2luY2x1ZGUvYWNwaS9hY25hbWVzcC5oCmluZGV4IGRkMzUwMWYuLmI2NjdhODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY25hbWVzcC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY25hbWVzcC5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMjYzLDEzICsyNjMsMTEgQEAKIHZvaWQKIGFjcGlfbnNfcmVwb3J0X2Vycm9yKGNoYXIgKm1vZHVsZV9uYW1lLAogCQkgICAgIHUzMiBsaW5lX251bWJlciwKLQkJICAgICB1MzIgY29tcG9uZW50X2lkLAogCQkgICAgIGNoYXIgKmludGVybmFsX25hbWUsIGFjcGlfc3RhdHVzIGxvb2t1cF9zdGF0dXMpOwogCiB2b2lkCiBhY3BpX25zX3JlcG9ydF9tZXRob2RfZXJyb3IoY2hhciAqbW9kdWxlX25hbWUsCiAJCQkgICAgdTMyIGxpbmVfbnVtYmVyLAotCQkJICAgIHUzMiBjb21wb25lbnRfaWQsCiAJCQkgICAgY2hhciAqbWVzc2FnZSwKIAkJCSAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKIAkJCSAgICBjaGFyICpwYXRoLCBhY3BpX3N0YXR1cyBsb29rdXBfc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY29iamVjdC5oIGIvaW5jbHVkZS9hY3BpL2Fjb2JqZWN0LmgKaW5kZXggNGEzMjZiYS4uMWJkNDExOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2Fjb2JqZWN0LmgKKysrIGIvaW5jbHVkZS9hY3BpL2Fjb2JqZWN0LmgKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNvcGNvZGUuaCBiL2luY2x1ZGUvYWNwaS9hY29wY29kZS5oCmluZGV4IDY0ZGE0MjkuLmU2ZDc4YmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY29wY29kZS5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY29wY29kZS5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2Fjb3V0cHV0LmggYi9pbmNsdWRlL2FjcGkvYWNvdXRwdXQuaAppbmRleCA2OGQ3ZWRmMC4uNzc4NWQ0OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2Fjb3V0cHV0LmgKKysrIGIvaW5jbHVkZS9hY3BpL2Fjb3V0cHV0LmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0xMzcsMTMgKzEzNywxOSBAQAogCiAvKiBFeGNlcHRpb24gbGV2ZWwgLS0gdXNlZCBpbiB0aGUgZ2xvYmFsICJkZWJ1Z19sZXZlbCIgKi8KIAotI2RlZmluZSBBQ1BJX0RCX0VSUk9SICAgICAgICAgICAgICAgQUNQSV9ERUJVR19MRVZFTCAoQUNQSV9MVl9FUlJPUikKLSNkZWZpbmUgQUNQSV9EQl9XQVJOICAgICAgICAgICAgICAgIEFDUElfREVCVUdfTEVWRUwgKEFDUElfTFZfV0FSTikKICNkZWZpbmUgQUNQSV9EQl9JTklUICAgICAgICAgICAgICAgIEFDUElfREVCVUdfTEVWRUwgKEFDUElfTFZfSU5JVCkKICNkZWZpbmUgQUNQSV9EQl9ERUJVR19PQkpFQ1QgICAgICAgIEFDUElfREVCVUdfTEVWRUwgKEFDUElfTFZfREVCVUdfT0JKRUNUKQogI2RlZmluZSBBQ1BJX0RCX0lORk8gICAgICAgICAgICAgICAgQUNQSV9ERUJVR19MRVZFTCAoQUNQSV9MVl9JTkZPKQogI2RlZmluZSBBQ1BJX0RCX0FMTF9FWENFUFRJT05TICAgICAgQUNQSV9ERUJVR19MRVZFTCAoQUNQSV9MVl9BTExfRVhDRVBUSU9OUykKIAorLyoKKyAqIFRoZXNlIHR3byBsZXZlbHMgYXJlIGVzc2VudGlhbGx5IG9ic29sZXRlLCBhbGwgaW5zdGFuY2VzIGluIHRoZQorICogQUNQSUNBIGNvcmUgY29kZSBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgUkVQT1JUX0VSUk9SIGFuZCBSRVBPUlRfV0FSTklORworICogKEtlcHQgaGVyZSBiZWNhdXNlIHNvbWUgZHJpdmVycyBtYXkgc3RpbGwgdXNlIHRoZW0pCisgKi8KKyNkZWZpbmUgQUNQSV9EQl9FUlJPUiAgICAgICAgICAgICAgIEFDUElfREVCVUdfTEVWRUwgKEFDUElfTFZfRVJST1IpCisjZGVmaW5lIEFDUElfREJfV0FSTiAgICAgICAgICAgICAgICBBQ1BJX0RFQlVHX0xFVkVMIChBQ1BJX0xWX1dBUk4pCisKIC8qIFRyYWNlIGxldmVsIC0tIGFsc28gdXNlZCBpbiB0aGUgZ2xvYmFsICJkZWJ1Z19sZXZlbCIgKi8KIAogI2RlZmluZSBBQ1BJX0RCX0lOSVRfTkFNRVMgICAgICAgICAgQUNQSV9ERUJVR19MRVZFTCAoQUNQSV9MVl9JTklUX05BTUVTKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGFyc2VyLmggYi9pbmNsdWRlL2FjcGkvYWNwYXJzZXIuaAppbmRleCBkMzUyZDQwLi41YTFmZjQ4NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGFyc2VyLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGFyc2VyLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaS5oIGIvaW5jbHVkZS9hY3BpL2FjcGkuaAppbmRleCBjY2YzNGY5Li5iOWEzOWQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwaS5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmggYi9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmgKaW5kZXggYzFiNGUxZi4uYjQyNWY5YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpX2RyaXZlcnMuaApAQCAtNTIsOCArNTIsOCBAQAogLyogQUNQSSBQQ0kgSW50ZXJydXB0IExpbmsgKHBjaV9saW5rLmMpICovCiAKIGludCBhY3BpX2lycV9wZW5hbHR5X2luaXQodm9pZCk7Ci1pbnQgYWNwaV9wY2lfbGlua19hbGxvY2F0ZV9pcnEoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgaW5kZXgsIGludCAqZWRnZV9sZXZlbCwKLQkJCSAgICAgICBpbnQgKmFjdGl2ZV9oaWdoX2xvdywgY2hhciAqKm5hbWUpOworaW50IGFjcGlfcGNpX2xpbmtfYWxsb2NhdGVfaXJxKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IGluZGV4LCBpbnQgKnRyaWdnZXJpbmcsCisJCQkgICAgICAgaW50ICpwb2xhcml0eSwgY2hhciAqKm5hbWUpOwogaW50IGFjcGlfcGNpX2xpbmtfZnJlZV9pcnEoYWNwaV9oYW5kbGUgaGFuZGxlKTsKIAogLyogQUNQSSBQQ0kgSW50ZXJydXB0IFJvdXRpbmcgKHBjaV9pcnEuYykgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oIGIvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKaW5kZXggOThlMGI4Y2QuLjc2OGY2M2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCkBAIC04LDcgKzgsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMTA4LDkgKzEwOCw5IEBACiAKIHZvaWQgYWNwaV9vc19kZWxldGVfbG9jayhhY3BpX2hhbmRsZSBoYW5kbGUpOwogCi11bnNpZ25lZCBsb25nIGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfaGFuZGxlIGhhbmRsZSk7CithY3BpX25hdGl2ZV91aW50IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfaGFuZGxlIGhhbmRsZSk7CiAKLXZvaWQgYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9oYW5kbGUgaGFuZGxlLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK3ZvaWQgYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9oYW5kbGUgaGFuZGxlLCBhY3BpX25hdGl2ZV91aW50IGZsYWdzKTsKIAogLyoKICAqIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBtYXBwaW5nCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaXhmLmggYi9pbmNsdWRlL2FjcGkvYWNwaXhmLmgKaW5kZXggMmE5ZGJjMS4uNjZjZjJlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpeGYuaApAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTE0OSw2ICsxNDksOSBAQAogYWNwaV9zdGF0dXMKIGFjcGlfZ2V0X2RhdGEoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyLCB2b2lkICoqZGF0YSk7CiAKK2FjcGlfc3RhdHVzCithY3BpX2RlYnVnX3RyYWNlKGNoYXIgKm5hbWUsIHUzMiBkZWJ1Z19sZXZlbCwgdTMyIGRlYnVnX2xheWVyLCB1MzIgZmxhZ3MpOworCiAvKgogICogT2JqZWN0IG1hbmlwdWxhdGlvbiBhbmQgZW51bWVyYXRpb24KICAqLwpAQCAtMjY5LDYgKzI3MiwxMiBAQAogCQkJCQkgICB2b2lkICpjb250ZXh0KTsKIAogYWNwaV9zdGF0dXMKK2FjcGlfZ2V0X3ZlbmRvcl9yZXNvdXJjZShhY3BpX2hhbmRsZSBkZXZpY2VfaGFuZGxlLAorCQkJIGNoYXIgKm5hbWUsCisJCQkgc3RydWN0IGFjcGlfdmVuZG9yX3V1aWQgKnV1aWQsCisJCQkgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKTsKKworYWNwaV9zdGF0dXMKIGFjcGlfZ2V0X2N1cnJlbnRfcmVzb3VyY2VzKGFjcGlfaGFuZGxlIGRldmljZV9oYW5kbGUsCiAJCQkgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpOwogCkBAIC0yODAsNyArMjg5LDcgQEAKIAogYWNwaV9zdGF0dXMKIGFjcGlfd2Fsa19yZXNvdXJjZXMoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKLQkJICAgIGNoYXIgKnBhdGgsCisJCSAgICBjaGFyICpuYW1lLAogCQkgICAgQUNQSV9XQUxLX1JFU09VUkNFX0NBTExCQUNLIHVzZXJfZnVuY3Rpb24sIHZvaWQgKmNvbnRleHQpOwogCiBhY3BpX3N0YXR1cwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcmVzcmMuaCBiL2luY2x1ZGUvYWNwaS9hY3Jlc3JjLmgKaW5kZXggMzhlNzk4Yi4uZmEwMmU4MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcmVzcmMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNyZXNyYy5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNDQsOCArNDQsMTI1IEBACiAjaWZuZGVmIF9fQUNSRVNSQ19IX18KICNkZWZpbmUgX19BQ1JFU1JDX0hfXwogCisvKiBOZWVkIHRoZSBBTUwgcmVzb3VyY2UgZGVzY3JpcHRvciBzdHJ1Y3RzICovCisKKyNpbmNsdWRlICJhbWxyZXNyYy5oIgorCiAvKgotICogIEZ1bmN0aW9uIHByb3RvdHlwZXMgY2FsbGVkIGZyb20gQWNwaSogQVBJcworICogSWYgcG9zc2libGUsIHBhY2sgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmVzIHRvIGJ5dGUgYWxpZ25tZW50LCBzaW5jZSB3ZQorICogZG9uJ3QgY2FyZSBhYm91dCBwZXJmb3JtYW5jZSBmb3IgZGVidWcgb3V0cHV0CisgKi8KKyNpZm5kZWYgQUNQSV9NSVNBTElHTk1FTlRfTk9UX1NVUFBPUlRFRAorI3ByYWdtYSBwYWNrKDEpCisjZW5kaWYKKworLyoKKyAqIEluZGl2aWR1YWwgZW50cnkgZm9yIHRoZSByZXNvdXJjZSBjb252ZXJzaW9uIHRhYmxlcworICovCit0eXBlZGVmIGNvbnN0IHN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIHsKKwl1OCBvcGNvZGU7CisJdTggcmVzb3VyY2Vfb2Zmc2V0OworCXU4IGFtbF9vZmZzZXQ7CisJdTggdmFsdWU7CisKK30gYWNwaV9yc2NvbnZlcnRfaW5mbzsKKworLyogUmVzb3VyY2UgY29udmVyc2lvbiBvcGNvZGVzICovCisKKyNkZWZpbmUgQUNQSV9SU0NfSU5JVEdFVCAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFDUElfUlNDX0lOSVRTRVQgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBQ1BJX1JTQ19GTEFHSU5JVCAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQUNQSV9SU0NfMUJJVEZMQUcgICAgICAgICAgICAgICAzCisjZGVmaW5lIEFDUElfUlNDXzJCSVRGTEFHICAgICAgICAgICAgICAgNAorI2RlZmluZSBBQ1BJX1JTQ19DT1VOVCAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQUNQSV9SU0NfQ09VTlQxNiAgICAgICAgICAgICAgICA2CisjZGVmaW5lIEFDUElfUlNDX0xFTkdUSCAgICAgICAgICAgICAgICAgNworI2RlZmluZSBBQ1BJX1JTQ19NT1ZFOCAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgQUNQSV9SU0NfTU9WRTE2ICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIEFDUElfUlNDX01PVkUzMiAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgQUNQSV9SU0NfTU9WRTY0ICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBBQ1BJX1JTQ19TRVQ4ICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIEFDUElfUlNDX0RBVEE4ICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQUNQSV9SU0NfQUREUkVTUyAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBBQ1BJX1JTQ19TT1VSQ0UgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIEFDUElfUlNDX1NPVVJDRVggICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgQUNQSV9SU0NfQklUTUFTSyAgICAgICAgICAgICAgICAxNworI2RlZmluZSBBQ1BJX1JTQ19CSVRNQVNLMTYgICAgICAgICAgICAgIDE4CisjZGVmaW5lIEFDUElfUlNDX0VYSVRfTkUgICAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgQUNQSV9SU0NfRVhJVF9MRSAgICAgICAgICAgICAgICAyMAorCisvKiBSZXNvdXJjZSBDb252ZXJzaW9uIHN1Yi1vcGNvZGVzICovCisKKyNkZWZpbmUgQUNQSV9SU0NfQ09NUEFSRV9BTUxfTEVOR1RIICAgICAwCisjZGVmaW5lIEFDUElfUlNDX0NPTVBBUkVfVkFMVUUgICAgICAgICAgMQorCisjZGVmaW5lIEFDUElfUlNDX1RBQkxFX1NJWkUoZCkgICAgICAgICAgKHNpemVvZiAoZCkgLyBzaXplb2YgKHN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvKSkKKworI2RlZmluZSBBQ1BJX1JTX09GRlNFVChmKSAgICAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBhY3BpX3Jlc291cmNlLGYpCisjZGVmaW5lIEFNTF9PRkZTRVQoZikgICAgICAgICAgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAodW5pb24gYW1sX3Jlc291cmNlLGYpCisKK3R5cGVkZWYgY29uc3Qgc3RydWN0IGFjcGlfcnNkdW1wX2luZm8geworCXU4IG9wY29kZTsKKwl1OCBvZmZzZXQ7CisJY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICoqcG9pbnRlcjsKKworfSBhY3BpX3JzZHVtcF9pbmZvOworCisvKiBWYWx1ZXMgZm9yIHRoZSBPcGNvZGUgZmllbGQgYWJvdmUgKi8KKworI2RlZmluZSBBQ1BJX1JTRF9USVRMRSAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQUNQSV9SU0RfTElURVJBTCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFDUElfUlNEX1NUUklORyAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBBQ1BJX1JTRF9VSU5UOCAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQUNQSV9SU0RfVUlOVDE2ICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEFDUElfUlNEX1VJTlQzMiAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBBQ1BJX1JTRF9VSU5UNjQgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQUNQSV9SU0RfMUJJVEZMQUcgICAgICAgICAgICAgICA3CisjZGVmaW5lIEFDUElfUlNEXzJCSVRGTEFHICAgICAgICAgICAgICAgOAorI2RlZmluZSBBQ1BJX1JTRF9TSE9SVExJU1QgICAgICAgICAgICAgIDkKKyNkZWZpbmUgQUNQSV9SU0RfTE9OR0xJU1QgICAgICAgICAgICAgICAxMAorI2RlZmluZSBBQ1BJX1JTRF9EV09SRExJU1QgICAgICAgICAgICAgIDExCisjZGVmaW5lIEFDUElfUlNEX0FERFJFU1MgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgQUNQSV9SU0RfU09VUkNFICAgICAgICAgICAgICAgICAxMworCisvKiByZXN0b3JlIGRlZmF1bHQgYWxpZ25tZW50ICovCisKKyNwcmFnbWEgcGFjaygpCisKKy8qIFJlc291cmNlIHRhYmxlcyBpbmRleGVkIGJ5IGludGVybmFsIHJlc291cmNlIHR5cGUgKi8KKworZXh0ZXJuIGNvbnN0IHU4IGFjcGlfZ2JsX2FtbF9yZXNvdXJjZV9zaXplc1tdOworZXh0ZXJuIHN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvICphY3BpX2dibF9zZXRfcmVzb3VyY2VfZGlzcGF0Y2hbXTsKKworLyogUmVzb3VyY2UgdGFibGVzIGluZGV4ZWQgYnkgcmF3IEFNTCByZXNvdXJjZSBkZXNjcmlwdG9yIHR5cGUgKi8KKworZXh0ZXJuIGNvbnN0IHU4IGFjcGlfZ2JsX3Jlc291cmNlX3N0cnVjdF9zaXplc1tdOworZXh0ZXJuIHN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvICphY3BpX2dibF9nZXRfcmVzb3VyY2VfZGlzcGF0Y2hbXTsKKworc3RydWN0IGFjcGlfdmVuZG9yX3dhbGtfaW5mbyB7CisJc3RydWN0IGFjcGlfdmVuZG9yX3V1aWQgKnV1aWQ7CisJc3RydWN0IGFjcGlfYnVmZmVyICpidWZmZXI7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworfTsKKworLyoKKyAqIHJzY3JlYXRlCisgKi8KK2FjcGlfc3RhdHVzCithY3BpX3JzX2NyZWF0ZV9yZXNvdXJjZV9saXN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFtbF9idWZmZXIsCisJCQkgICAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqb3V0cHV0X2J1ZmZlcik7CisKK2FjcGlfc3RhdHVzCithY3BpX3JzX2NyZWF0ZV9hbWxfcmVzb3VyY2VzKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdF9idWZmZXIsCisJCQkgICAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqb3V0cHV0X2J1ZmZlcik7CisKK2FjcGlfc3RhdHVzCithY3BpX3JzX2NyZWF0ZV9wY2lfcm91dGluZ190YWJsZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwYWNrYWdlX29iamVjdCwKKwkJCQkgc3RydWN0IGFjcGlfYnVmZmVyICpvdXRwdXRfYnVmZmVyKTsKKworLyoKKyAqIHJzdXRpbHMKICAqLwogYWNwaV9zdGF0dXMKIGFjcGlfcnNfZ2V0X3BydF9tZXRob2RfZGF0YShhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcik7CkBAIC02NSwxOTUgKzE4MiwxNDYgQEAKIGFjcGlfc3RhdHVzCiBhY3BpX3JzX3NldF9zcnNfbWV0aG9kX2RhdGEoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9yc19jcmVhdGVfcmVzb3VyY2VfbGlzdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkgICAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqb3V0cHV0X2J1ZmZlcik7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3JzX2NyZWF0ZV9ieXRlX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3RfYnVmZmVyLAotCQkJICAgc3RydWN0IGFjcGlfYnVmZmVyICpvdXRwdXRfYnVmZmVyKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfcnNfY3JlYXRlX3BjaV9yb3V0aW5nX3RhYmxlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnBhY2thZ2Vfb2JqZWN0LAotCQkJCSBzdHJ1Y3QgYWNwaV9idWZmZXIgKm91dHB1dF9idWZmZXIpOwotCi0vKgotICogcnNkdW1wCi0gKi8KLSNpZmRlZglBQ1BJX0ZVVFVSRV9VU0FHRQotdm9pZCBhY3BpX3JzX2R1bXBfcmVzb3VyY2VfbGlzdChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UpOwotCi12b2lkIGFjcGlfcnNfZHVtcF9pcnFfbGlzdCh1OCAqIHJvdXRlX3RhYmxlKTsKLSNlbmRpZgkJCQkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwotCiAvKgogICogcnNjYWxjCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2dldF9ieXRlX3N0cmVhbV9zdGFydCh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCSAgICAgIHU4ICoqIGJ5dGVfc3RyZWFtX3N0YXJ0LCB1MzIgKiBzaXplKTsKK2FjcGlfcnNfZ2V0X2xpc3RfbGVuZ3RoKHU4ICogYW1sX2J1ZmZlciwKKwkJCXUzMiBhbWxfYnVmZmVyX2xlbmd0aCwgYWNwaV9zaXplICogc2l6ZV9uZWVkZWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19nZXRfbGlzdF9sZW5ndGgodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCi0JCQl1MzIgYnl0ZV9zdHJlYW1fYnVmZmVyX2xlbmd0aCwgYWNwaV9zaXplICogc2l6ZV9uZWVkZWQpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9yc19nZXRfYnl0ZV9zdHJlYW1fbGVuZ3RoKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdF9idWZmZXIsCi0JCQkgICAgICAgYWNwaV9zaXplICogc2l6ZV9uZWVkZWQpOworYWNwaV9yc19nZXRfYW1sX2xlbmd0aChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3RfYnVmZmVyLAorCQkgICAgICAgYWNwaV9zaXplICogc2l6ZV9uZWVkZWQpOwogCiBhY3BpX3N0YXR1cwogYWNwaV9yc19nZXRfcGNpX3JvdXRpbmdfdGFibGVfbGVuZ3RoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnBhY2thZ2Vfb2JqZWN0LAogCQkJCSAgICAgYWNwaV9zaXplICogYnVmZmVyX3NpemVfbmVlZGVkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfYnl0ZV9zdHJlYW1fdG9fbGlzdCh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCSAgICB1MzIgYnl0ZV9zdHJlYW1fYnVmZmVyX2xlbmd0aCwgdTggKiBvdXRwdXRfYnVmZmVyKTsKK2FjcGlfcnNfY29udmVydF9hbWxfdG9fcmVzb3VyY2VzKHU4ICogYW1sX2J1ZmZlciwKKwkJCQkgdTMyIGFtbF9idWZmZXJfbGVuZ3RoLCB1OCAqIG91dHB1dF9idWZmZXIpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9yc19saXN0X3RvX2J5dGVfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKLQkJCSAgICBhY3BpX3NpemUgYnl0ZV9zdHJlYW1fc2l6ZV9uZWVkZWQsCi0JCQkgICAgdTggKiBvdXRwdXRfYnVmZmVyKTsKK2FjcGlfcnNfY29udmVydF9yZXNvdXJjZXNfdG9fYW1sKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwKKwkJCQkgYWNwaV9zaXplIGFtbF9zaXplX25lZWRlZCwgdTggKiBvdXRwdXRfYnVmZmVyKTsKKworLyoKKyAqIHJzYWRkcgorICovCit2b2lkCithY3BpX3JzX3NldF9hZGRyZXNzX2NvbW1vbih1bmlvbiBhbWxfcmVzb3VyY2UgKmFtbCwKKwkJCSAgIHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSk7CisKK3U4CithY3BpX3JzX2dldF9hZGRyZXNzX2NvbW1vbihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsCisJCQkgICB1bmlvbiBhbWxfcmVzb3VyY2UgKmFtbCk7CisKKy8qCisgKiByc21pc2MKKyAqLworYWNwaV9zdGF0dXMKK2FjcGlfcnNfY29udmVydF9hbWxfdG9fcmVzb3VyY2Uoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLAorCQkJCXVuaW9uIGFtbF9yZXNvdXJjZSAqYW1sLAorCQkJCXN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvICppbmZvKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfaW9fcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCi0JCSAgICBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKLQkJICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKTsKK2FjcGlfcnNfY29udmVydF9yZXNvdXJjZV90b19hbWwoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLAorCQkJCXVuaW9uIGFtbF9yZXNvdXJjZSAqYW1sLAorCQkJCXN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvICppbmZvKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfcnNfZml4ZWRfaW9fcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAotCQkJICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSk7CisvKgorICogcnN1dGlscworICovCit2b2lkCithY3BpX3JzX21vdmVfZGF0YSh2b2lkICpkZXN0aW5hdGlvbiwKKwkJICB2b2lkICpzb3VyY2UsIHUxNiBpdGVtX2NvdW50LCB1OCBtb3ZlX3R5cGUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9yc19pb19zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAotCQkgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKTsKK3U4IGFjcGlfcnNfZGVjb2RlX2JpdG1hc2sodTE2IG1hc2ssIHU4ICogbGlzdCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3JzX2ZpeGVkX2lvX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCi0JCQl1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCk7Cit1MTYgYWNwaV9yc19lbmNvZGVfYml0bWFzayh1OCAqIGxpc3QsIHU4IGNvdW50KTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfcnNfaXJxX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkgICAgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAotCQkgICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKTsKK2FjcGlfcnNfbGVuZ3RoCithY3BpX3JzX2dldF9yZXNvdXJjZV9zb3VyY2UoYWNwaV9yc19sZW5ndGggcmVzb3VyY2VfbGVuZ3RoLAorCQkJICAgIGFjcGlfcnNfbGVuZ3RoIG1pbmltdW1fbGVuZ3RoLAorCQkJICAgIHN0cnVjdCBhY3BpX3Jlc291cmNlX3NvdXJjZSAqcmVzb3VyY2Vfc291cmNlLAorCQkJICAgIHVuaW9uIGFtbF9yZXNvdXJjZSAqYW1sLCBjaGFyICpzdHJpbmdfcHRyKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfcnNfaXJxX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCi0JCSAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKTsKK2FjcGlfcnNkZXNjX3NpemUKK2FjcGlfcnNfc2V0X3Jlc291cmNlX3NvdXJjZSh1bmlvbiBhbWxfcmVzb3VyY2UgKmFtbCwKKwkJCSAgICBhY3BpX3JzX2xlbmd0aCBtaW5pbXVtX2xlbmd0aCwKKwkJCSAgICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zb3VyY2UgKnJlc291cmNlX3NvdXJjZSk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3JzX2RtYV9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJICAgICBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKLQkJICAgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSk7Cit2b2lkCithY3BpX3JzX3NldF9yZXNvdXJjZV9oZWFkZXIodTggZGVzY3JpcHRvcl90eXBlLAorCQkJICAgIGFjcGlfcnNkZXNjX3NpemUgdG90YWxfbGVuZ3RoLAorCQkJICAgIHVuaW9uIGFtbF9yZXNvdXJjZSAqYW1sKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfcnNfZG1hX3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCi0JCSAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKTsKK3ZvaWQKK2FjcGlfcnNfc2V0X3Jlc291cmNlX2xlbmd0aChhY3BpX3JzZGVzY19zaXplIHRvdGFsX2xlbmd0aCwKKwkJCSAgICB1bmlvbiBhbWxfcmVzb3VyY2UgKmFtbCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3JzX2FkZHJlc3MxNl9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCSAgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAotCQkJICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpOworLyoKKyAqIHJzZHVtcAorICovCit2b2lkIGFjcGlfcnNfZHVtcF9yZXNvdXJjZV9saXN0KHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3JzX2FkZHJlc3MxNl9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAotCQkJIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKTsKK3ZvaWQgYWNwaV9yc19kdW1wX2lycV9saXN0KHU4ICogcm91dGVfdGFibGUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9yc19hZGRyZXNzMzJfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkgICBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKLQkJCSAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKTsKKy8qCisgKiBSZXNvdXJjZSBjb252ZXJzaW9uIHRhYmxlcworICovCitleHRlcm4gc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19jb252ZXJ0X2RtYVtdOworZXh0ZXJuIHN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfY29udmVydF9lbmRfZHBmW107CitleHRlcm4gc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19jb252ZXJ0X2lvW107CitleHRlcm4gc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19jb252ZXJ0X2ZpeGVkX2lvW107CitleHRlcm4gc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19jb252ZXJ0X2VuZF90YWdbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfbWVtb3J5MjRbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfZ2VuZXJpY19yZWdbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfbWVtb3J5MzJbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfZml4ZWRfbWVtb3J5MzJbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfYWRkcmVzczMyW107CitleHRlcm4gc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19jb252ZXJ0X2FkZHJlc3MxNltdOworZXh0ZXJuIHN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfY29udmVydF9leHRfaXJxW107CitleHRlcm4gc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19jb252ZXJ0X2FkZHJlc3M2NFtdOworZXh0ZXJuIHN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfY29udmVydF9leHRfYWRkcmVzczY0W107CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3JzX2FkZHJlc3MzMl9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAotCQkJIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKTsKKy8qIFRoZXNlIHJlc291cmNlcyByZXF1aXJlIHNlcGFyYXRlIGdldC9zZXQgdGFibGVzICovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX3JzX2FkZHJlc3M2NF9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCSAgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAotCQkJICAgdTggKiogb3V0cHV0X2J1ZmZlciwgYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpOworZXh0ZXJuIHN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfZ2V0X2lycVtdOworZXh0ZXJuIHN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfZ2V0X3N0YXJ0X2RwZltdOworZXh0ZXJuIHN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfZ2V0X3ZlbmRvcl9zbWFsbFtdOworZXh0ZXJuIHN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfZ2V0X3ZlbmRvcl9sYXJnZVtdOwogCi1hY3BpX3N0YXR1cwotYWNwaV9yc19hZGRyZXNzNjRfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKLQkJCSB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCk7CitleHRlcm4gc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19zZXRfaXJxW107CitleHRlcm4gc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19zZXRfc3RhcnRfZHBmW107CitleHRlcm4gc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19zZXRfdmVuZG9yW107CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3JzX3N0YXJ0X2RlcGVuZF9mbnNfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkJICBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKLQkJCQkgIHU4ICoqIG91dHB1dF9idWZmZXIsCi0JCQkJICBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSk7CisjaWYgZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKQorLyoKKyAqIHJzaW5mbworICovCitleHRlcm4gc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gKmFjcGlfZ2JsX2R1bXBfcmVzb3VyY2VfZGlzcGF0Y2hbXTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfcnNfZW5kX2RlcGVuZF9mbnNfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkJYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCi0JCQkJdTggKiogb3V0cHV0X2J1ZmZlciwKLQkJCQlhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3JzX3N0YXJ0X2RlcGVuZF9mbnNfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKLQkJCQl1OCAqKiBvdXRwdXRfYnVmZmVyLAotCQkJCWFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfcnNfZW5kX2RlcGVuZF9mbnNfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKLQkJCSAgICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfcnNfbWVtb3J5MjRfcmVzb3VyY2UodTggKiBieXRlX3N0cmVhbV9idWZmZXIsCi0JCQkgIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAotCQkJICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3JzX21lbW9yeTI0X3N0cmVhbShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqbGlua2VkX2xpc3QsCi0JCQl1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3JzX21lbW9yeTMyX3JhbmdlX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkJCWFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkLAotCQkJCXU4ICoqIG91dHB1dF9idWZmZXIsCi0JCQkJYWNwaV9zaXplICogc3RydWN0dXJlX3NpemUpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9yc19maXhlZF9tZW1vcnkzMl9yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCQlhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKLQkJCQl1OCAqKiBvdXRwdXRfYnVmZmVyLAotCQkJCWFjcGlfc2l6ZSAqIHN0cnVjdHVyZV9zaXplKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfcnNfbWVtb3J5MzJfcmFuZ2Vfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKLQkJCSAgICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfcnNfZml4ZWRfbWVtb3J5MzJfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKLQkJCSAgICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfcnNfZXh0ZW5kZWRfaXJxX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkJICAgICAgYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCi0JCQkgICAgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3JzX2V4dGVuZGVkX2lycV9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAotCQkJICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfcnNfZW5kX3RhZ19yZXNvdXJjZSh1OCAqIGJ5dGVfc3RyZWFtX2J1ZmZlciwKLQkJCSBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCwKLQkJCSB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3JzX2VuZF90YWdfc3RyZWFtKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdCwKLQkJICAgICAgIHU4ICoqIG91dHB1dF9idWZmZXIsIGFjcGlfc2l6ZSAqIGJ5dGVzX2NvbnN1bWVkKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfcnNfdmVuZG9yX3Jlc291cmNlKHU4ICogYnl0ZV9zdHJlYW1fYnVmZmVyLAotCQkJYWNwaV9zaXplICogYnl0ZXNfY29uc3VtZWQsCi0JCQl1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBzdHJ1Y3R1cmVfc2l6ZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3JzX3ZlbmRvcl9zdHJlYW0oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmxpbmtlZF9saXN0LAotCQkgICAgICB1OCAqKiBvdXRwdXRfYnVmZmVyLCBhY3BpX3NpemUgKiBieXRlc19jb25zdW1lZCk7Ci0KLXU4IGFjcGlfcnNfZ2V0X3Jlc291cmNlX3R5cGUodTggcmVzb3VyY2Vfc3RhcnRfYnl0ZSk7CisvKgorICogcnNkdW1wCisgKi8KK2V4dGVybiBzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfaXJxW107CitleHRlcm4gc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gYWNwaV9yc19kdW1wX2RtYVtdOworZXh0ZXJuIHN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9zdGFydF9kcGZbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfZW5kX2RwZltdOworZXh0ZXJuIHN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9pb1tdOworZXh0ZXJuIHN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9maXhlZF9pb1tdOworZXh0ZXJuIHN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF92ZW5kb3JbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfZW5kX3RhZ1tdOworZXh0ZXJuIHN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9tZW1vcnkyNFtdOworZXh0ZXJuIHN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9tZW1vcnkzMltdOworZXh0ZXJuIHN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9maXhlZF9tZW1vcnkzMltdOworZXh0ZXJuIHN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9hZGRyZXNzMTZbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfYWRkcmVzczMyW107CitleHRlcm4gc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gYWNwaV9yc19kdW1wX2FkZHJlc3M2NFtdOworZXh0ZXJuIHN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9leHRfYWRkcmVzczY0W107CitleHRlcm4gc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gYWNwaV9yc19kdW1wX2V4dF9pcnFbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfZ2VuZXJpY19yZWdbXTsKKyNlbmRpZgogCiAjZW5kaWYJCQkJLyogX19BQ1JFU1JDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2Fjc3RydWN0LmggYi9pbmNsdWRlL2FjcGkvYWNzdHJ1Y3QuaAppbmRleCA5OWQyMzUzLi5kOGMxYzJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNzdHJ1Y3QuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNzdHJ1Y3QuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3RhYmxlcy5oIGIvaW5jbHVkZS9hY3BpL2FjdGFibGVzLmgKaW5kZXggZjkyYzE4NS4uMzBhNDc1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdGFibGVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdGFibGVzLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWN0YmwuaCBiL2luY2x1ZGUvYWNwaS9hY3RibC5oCmluZGV4IGE0NmY0MDYuLmVkNTNmODQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3RibC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3RibC5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNDUsNiArNDUsMTIgQEAKICNkZWZpbmUgX19BQ1RCTF9IX18KIAogLyoKKyAqIE5vdGUgYWJvdXQgYml0ZmllbGRzOiBUaGUgdTggdHlwZSBpcyB1c2VkIGZvciBiaXRmaWVsZHMgaW4gQUNQSSB0YWJsZXMuCisgKiBUaGlzIGlzIHRoZSBvbmx5IHR5cGUgdGhhdCBpcyBldmVuIHJlbW90ZWx5IHBvcnRhYmxlLiBBbnl0aGluZyBlbHNlIGlzIG5vdAorICogcG9ydGFibGUsIHNvIGRvIG5vdCB1c2UgYW55IG90aGVyIGJpdGZpZWxkIHR5cGVzLgorICovCisKKy8qCiAgKiAgVmFsdWVzIGZvciBkZXNjcmlwdGlvbiB0YWJsZSBoZWFkZXIgc2lnbmF0dXJlcwogICovCiAjZGVmaW5lIFJTRFBfTkFNRSAgICAgICAgICAgICAgICJSU0RQIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdGJsMS5oIGIvaW5jbHVkZS9hY3BpL2FjdGJsMS5oCmluZGV4IDY3MzEyYzMuLmNkNDI4ZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3RibDEuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN0YmwxLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWN0YmwyLmggYi9pbmNsdWRlL2FjcGkvYWN0YmwyLmgKaW5kZXggNTAzMDVjZS4uZGZjN2FjMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdGJsMi5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3RibDIuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmggYi9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oCmluZGV4IDYyMTNiMjcuLjc0ODE5ZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTQ0LDcgKzQ0LDE1IEBACiAjaWZuZGVmIF9fQUNUWVBFU19IX18KICNkZWZpbmUgX19BQ1RZUEVTX0hfXwogCi0vKiEgW0JlZ2luXSBubyBzb3VyY2UgY29kZSB0cmFuc2xhdGlvbiAoa2VlcCB0aGUgdHlwZWRlZnMpICovCisvKgorICogQUNQSV9NQUNISU5FX1dJRFRIIG11c3QgYmUgc3BlY2lmaWVkIGluIGFuIE9TLSBvciBjb21waWxlci1kZXBlbmRlbnQgaGVhZGVyCisgKiBhbmQgbXVzdCBiZSBlaXRoZXIgMTYsIDMyLCBvciA2NAorICovCisjaWZuZGVmIEFDUElfTUFDSElORV9XSURUSAorI2Vycm9yIEFDUElfTUFDSElORV9XSURUSCBub3QgZGVmaW5lZAorI2VuZGlmCisKKy8qISBbQmVnaW5dIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uICovCiAKIC8qCiAgKiBEYXRhIHR5cGUgcmFuZ2VzCkBAIC01OCw4NyArNjYsMTUwIEBACiAjZGVmaW5lIEFDUElfVUlOVDY0X01BWCAgICAgICAgICAgICAgICAgKFVJTlQ2NCkofigoVUlOVDY0KSAwKSkJLyogMHhGRkZGRkZGRkZGRkZGRkZGICovCiAjZGVmaW5lIEFDUElfQVNDSUlfTUFYICAgICAgICAgICAgICAgICAgMHg3RgogCi0jaWZkZWYgREVGSU5FX0FMVEVSTkFURV9UWVBFUwogLyoKLSAqIFR5cGVzIHVzZWQgb25seSBpbiB0cmFuc2xhdGVkIHNvdXJjZSwgZGVmaW5lZCBoZXJlIHRvIGVuYWJsZQotICogY3Jvc3MtcGxhdGZvcm0gY29tcGlsYXRpb24gb25seS4KLSAqLwotdHlwZWRlZiBpbnQgczMyOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHU4OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1MTY7Ci10eXBlZGVmIHVuc2lnbmVkIGludCB1MzI7Ci10eXBlZGVmIENPTVBJTEVSX0RFUEVOREVOVF9VSU5UNjQgdTY0OwotCi0jZW5kaWYKLQotLyoKLSAqIERhdGEgdHlwZXMgLSBGaXhlZCBhY3Jvc3MgYWxsIGNvbXBpbGF0aW9uIG1vZGVscyAoMTYvMzIvNjQpCisgKiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgQUNQSUNBIFN1YnN5c3RlbSBEYXRhIFR5cGVzCiAgKgotICogQk9PTEVBTiAgICAgICAgICBMb2dpY2FsIEJvb2xlYW4uCi0gKiBJTlQ4ICAgICAgICAgICAgIDgtYml0ICAoMSBieXRlKSBzaWduZWQgdmFsdWUKLSAqIFVJTlQ4ICAgICAgICAgICAgOC1iaXQgICgxIGJ5dGUpIHVuc2lnbmVkIHZhbHVlCi0gKiBJTlQxNiAgICAgICAgICAgIDE2LWJpdCAoMiBieXRlKSBzaWduZWQgdmFsdWUKLSAqIFVJTlQxNiAgICAgICAgICAgMTYtYml0ICgyIGJ5dGUpIHVuc2lnbmVkIHZhbHVlCi0gKiBJTlQzMiAgICAgICAgICAgIDMyLWJpdCAoNCBieXRlKSBzaWduZWQgdmFsdWUKLSAqIFVJTlQzMiAgICAgICAgICAgMzItYml0ICg0IGJ5dGUpIHVuc2lnbmVkIHZhbHVlCi0gKiBJTlQ2NCAgICAgICAgICAgIDY0LWJpdCAoOCBieXRlKSBzaWduZWQgdmFsdWUKLSAqIFVJTlQ2NCAgICAgICAgICAgNjQtYml0ICg4IGJ5dGUpIHVuc2lnbmVkIHZhbHVlCi0gKiBBQ1BJX05BVElWRV9JTlQgIDMyLWJpdCBvbiBJQS0zMiwgNjQtYml0IG9uIElBLTY0IHNpZ25lZCB2YWx1ZQotICogQUNQSV9OQVRJVkVfVUlOVCAzMi1iaXQgb24gSUEtMzIsIDY0LWJpdCBvbiBJQS02NCB1bnNpZ25lZCB2YWx1ZQorICogVGhlIGdvYWwgb2YgdGhlc2UgdHlwZXMgaXMgdG8gcHJvdmlkZSBzb3VyY2UgY29kZSBwb3J0YWJpbGl0eSBhY3Jvc3MKKyAqIDE2LWJpdCwgMzItYml0LCBhbmQgNjQtYml0IHRhcmdldHMuCisgKgorICogMSkgVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgb2YgZml4ZWQgc2l6ZSBmb3IgYWxsIHRhcmdldHMgKDE2LzMyLzY0KToKKyAqCisgKiBCT09MRUFOICAgICAgTG9naWNhbCBib29sZWFuCisgKgorICogVUlOVDggICAgICAgIDgtYml0ICAoMSBieXRlKSB1bnNpZ25lZCB2YWx1ZQorICogVUlOVDE2ICAgICAgIDE2LWJpdCAoMiBieXRlKSB1bnNpZ25lZCB2YWx1ZQorICogVUlOVDMyICAgICAgIDMyLWJpdCAoNCBieXRlKSB1bnNpZ25lZCB2YWx1ZQorICogVUlOVDY0ICAgICAgIDY0LWJpdCAoOCBieXRlKSB1bnNpZ25lZCB2YWx1ZQorICoKKyAqIElOVDE2ICAgICAgICAxNi1iaXQgKDIgYnl0ZSkgc2lnbmVkIHZhbHVlCisgKiBJTlQzMiAgICAgICAgMzItYml0ICg0IGJ5dGUpIHNpZ25lZCB2YWx1ZQorICogSU5UNjQgICAgICAgIDY0LWJpdCAoOCBieXRlKSBzaWduZWQgdmFsdWUKKyAqCisgKiBDT01QSUxFUl9ERVBFTkRFTlRfVUlOVDY0L0lOVDY0IC0gVGhlc2UgdHlwZXMgYXJlIGRlZmluZWQgaW4gdGhlCisgKiBjb21waWxlci1kZXBlbmRlbnQgaGVhZGVyKHMpIGFuZCB3ZXJlIGludHJvZHVjZWQgYmVjYXVzZSB0aGVyZSBpcyBubyBjb21tb24KKyAqIDY0LWJpdCBpbnRlZ2VyIHR5cGUgYWNyb3NzIHRoZSB2YXJpb3VzIGNvbXBpbGF0aW9uIG1vZGVscywgYXMgc2hvd24gaW4KKyAqIHRoZSB0YWJsZSBiZWxvdy4KKyAqCisgKiBEYXRhdHlwZSAgTFA2NCBJTFA2NCBMTFA2NCBJTFAzMiBMUDMyIDE2Yml0CisgKiBjaGFyICAgICAgOCAgICA4ICAgICA4ICAgICA4ICAgICA4ICAgIDgKKyAqIHNob3J0ICAgICAxNiAgIDE2ICAgIDE2ICAgIDE2ICAgIDE2ICAgMTYKKyAqIF9pbnQzMiAgICAgICAgIDMyCisgKiBpbnQgICAgICAgMzIgICA2NCAgICAzMiAgICAzMiAgICAxNiAgIDE2CisgKiBsb25nICAgICAgNjQgICA2NCAgICAzMiAgICAzMiAgICAzMiAgIDMyCisgKiBsb25nIGxvbmcgICAgICAgICAgICA2NCAgICA2NAorICogcG9pbnRlciAgIDY0ICAgNjQgICAgNjQgICAgMzIgICAgMzIgICAzMgorICoKKyAqIE5vdGU6IElMUDY0IGFuZCBMUDMyIGFyZSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC4KKyAqCisgKgorICogMikgVGhlc2UgdHlwZXMgcmVwcmVzZW50IHRoZSBuYXRpdmUgd29yZCBzaXplIG9mIHRoZSB0YXJnZXQgbW9kZSBvZiB0aGUKKyAqIHByb2Nlc3NvciwgYW5kIG1heSBiZSAxNi1iaXQsIDMyLWJpdCwgb3IgNjQtYml0IGFzIHJlcXVpcmVkLiBUaGV5IGFyZQorICogdXN1YWxseSB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiwgZWZmaWNpZW50IGxvb3AgY291bnRlcnMsIGFuZCBhcnJheQorICogaW5kZXhlcy4gVGhlIHR5cGVzIGFyZSBzaW1pbGFyIHRvIHRoZSBzaXplX3QgdHlwZSBpbiB0aGUgQyBsaWJyYXJ5IGFuZCBhcmUKKyAqIHJlcXVpcmVkIGJlY2F1c2UgdGhlcmUgaXMgbm8gQyB0eXBlIHRoYXQgY29uc2lzdGVudGx5IHJlcHJlc2VudHMgdGhlIG5hdGl2ZQorICogZGF0YSB3aWR0aC4KKyAqCisgKiBBQ1BJX1NJWkUgICAgICAgIDE2LzMyLzY0LWJpdCB1bnNpZ25lZCB2YWx1ZQorICogQUNQSV9OQVRJVkVfVUlOVCAxNi8zMi82NC1iaXQgdW5zaWduZWQgdmFsdWUKKyAqIEFDUElfTkFUSVZFX0lOVCAgMTYvMzIvNjQtYml0IHNpZ25lZCB2YWx1ZQorICoKICAqLwogCi0jaWZuZGVmIEFDUElfTUFDSElORV9XSURUSAotI2Vycm9yIEFDUElfTUFDSElORV9XSURUSCBub3QgZGVmaW5lZAotI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvbW1vbiB0eXBlcyBmb3IgYWxsIGNvbXBpbGVycywgYWxsIHRhcmdldHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWYgQUNQSV9NQUNISU5FX1dJRFRIID09IDY0Ci0KLS8qISBbQmVnaW5dIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uIChrZWVwIHRoZSB0eXBlZGVmcykgKi8KLQotLyoKLSAqIDY0LWJpdCB0eXBlIGRlZmluaXRpb25zCi0gKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBVSU5UODsKIHR5cGVkZWYgdW5zaWduZWQgY2hhciBCT09MRUFOOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVJTlQ4OwogdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVSU5UMTY7Ci10eXBlZGVmIGludCBJTlQzMjsKLXR5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQzMjsKLXR5cGVkZWYgQ09NUElMRVJfREVQRU5ERU5UX0lOVDY0IElOVDY0OwogdHlwZWRlZiBDT01QSUxFUl9ERVBFTkRFTlRfVUlOVDY0IFVJTlQ2NDsKK3R5cGVkZWYgQ09NUElMRVJfREVQRU5ERU5UX0lOVDY0IElOVDY0OwogCiAvKiEgW0VuZF0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gISovCiAKLXR5cGVkZWYgczY0IGFjcGlfbmF0aXZlX2ludDsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVHlwZXMgc3BlY2lmaWMgdG8gNjQtYml0IHRhcmdldHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgQUNQSV9NQUNISU5FX1dJRFRIID09IDY0CisKKy8qISBbQmVnaW5dIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uIChrZWVwIHRoZSB0eXBlZGVmcyBhcy1pcykgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDMyOwordHlwZWRlZiBpbnQgSU5UMzI7CisKKy8qISBbRW5kXSBubyBzb3VyY2UgY29kZSB0cmFuc2xhdGlvbiAhKi8KKwogdHlwZWRlZiB1NjQgYWNwaV9uYXRpdmVfdWludDsKK3R5cGVkZWYgczY0IGFjcGlfbmF0aXZlX2ludDsKIAogdHlwZWRlZiB1NjQgYWNwaV90YWJsZV9wdHI7CiB0eXBlZGVmIHU2NCBhY3BpX2lvX2FkZHJlc3M7CiB0eXBlZGVmIHU2NCBhY3BpX3BoeXNpY2FsX2FkZHJlc3M7Ci10eXBlZGVmIHU2NCBhY3BpX3NpemU7CiAKLSNkZWZpbmUgQUxJR05FRF9BRERSRVNTX0JPVU5EQVJZICAgICAgICAweDAwMDAwMDA4CS8qIE5vIGhhcmR3YXJlIGFsaWdubWVudCBzdXBwb3J0IGluIElBNjQgKi8KLSNkZWZpbmUgQUNQSV9VU0VfTkFUSVZFX0RJVklERQkvKiBOYXRpdmUgNjQtYml0IGludGVnZXIgc3VwcG9ydCAqLwogI2RlZmluZSBBQ1BJX01BWF9QVFIgICAgICAgICAgICAgICAgICAgIEFDUElfVUlOVDY0X01BWAogI2RlZmluZSBBQ1BJX1NJWkVfTUFYICAgICAgICAgICAgICAgICAgIEFDUElfVUlOVDY0X01BWAogCi0jZWxpZiBBQ1BJX01BQ0hJTkVfV0lEVEggPT0gMTYKLQotLyohIFtCZWdpbl0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gKGtlZXAgdGhlIHR5cGVkZWZzKSAqLworI2RlZmluZSBBTElHTkVEX0FERFJFU1NfQk9VTkRBUlkgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQUNQSV9VU0VfTkFUSVZFX0RJVklERQkvKiBIYXMgbmF0aXZlIDY0LWJpdCBpbnRlZ2VyIHN1cHBvcnQgKi8KIAogLyoKLSAqIDE2LWJpdCB0eXBlIGRlZmluaXRpb25zCisgKiBJbiB0aGUgY2FzZSBvZiB0aGUgSXRhbml1bSBQcm9jZXNzb3IgRmFtaWx5IChJUEYpLCB0aGUgaGFyZHdhcmUgZG9lcyBub3QKKyAqIHN1cHBvcnQgbWlzYWxpZ25lZCBtZW1vcnkgdHJhbnNmZXJzLiBTZXQgdGhlIE1JU0FMSUdOTUVOVF9OT1RfU1VQUE9SVEVEIGZsYWcKKyAqIHRvIGluZGljYXRlIHRoYXQgc3BlY2lhbCBwcmVjYXV0aW9ucyBtdXN0IGJlIHRha2VuIHRvIGF2b2lkIGFsaWdubWVudCBmYXVsdHMuCisgKiAoSUE2NCBvciBpYTY0IGlzIGN1cnJlbnRseSB1c2VkIGJ5IGV4aXN0aW5nIGNvbXBpbGVycyB0byBpbmRpY2F0ZSBJUEYuKQorICoKKyAqIE5vdGU6IEVtNjRfdCBhbmQgb3RoZXIgWDg2LTY0IHByb2Nlc3NvcnMgc3VwcG9ydCBtaXNhbGlnbmVkIHRyYW5zZmVycywKKyAqIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gZGVmaW5lIHRoaXMgZmxhZy4KICAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVJTlQ4OwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIEJPT0xFQU47Ci10eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UMTY7Ci10eXBlZGVmIGxvbmcgSU5UMzI7Ci10eXBlZGVmIGludCBJTlQxNjsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBVSU5UMzI7CisjaWYgZGVmaW5lZCAoX19JQTY0X18pIHx8IGRlZmluZWQgKF9faWE2NF9fKQorI2RlZmluZSBBQ1BJX01JU0FMSUdOTUVOVF9OT1RfU1VQUE9SVEVECisjZW5kaWYKIAotc3RydWN0IHsKLQlVSU5UMzIgTG87Ci0JVUlOVDMyIEhpOwotfTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVHlwZXMgc3BlY2lmaWMgdG8gMzItYml0IHRhcmdldHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZWxpZiBBQ1BJX01BQ0hJTkVfV0lEVEggPT0gMzIKKworLyohIFtCZWdpbl0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gKGtlZXAgdGhlIHR5cGVkZWZzIGFzLWlzKSAqLworCit0eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UMzI7Cit0eXBlZGVmIGludCBJTlQzMjsKKworLyohIFtFbmRdIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uICEqLworCit0eXBlZGVmIHUzMiBhY3BpX25hdGl2ZV91aW50OwordHlwZWRlZiBzMzIgYWNwaV9uYXRpdmVfaW50OworCit0eXBlZGVmIHU2NCBhY3BpX3RhYmxlX3B0cjsKK3R5cGVkZWYgdTMyIGFjcGlfaW9fYWRkcmVzczsKK3R5cGVkZWYgdTY0IGFjcGlfcGh5c2ljYWxfYWRkcmVzczsKKworI2RlZmluZSBBQ1BJX01BWF9QVFIgICAgICAgICAgICAgICAgICAgIEFDUElfVUlOVDMyX01BWAorI2RlZmluZSBBQ1BJX1NJWkVfTUFYICAgICAgICAgICAgICAgICAgIEFDUElfVUlOVDMyX01BWAorCisjZGVmaW5lIEFMSUdORURfQUREUkVTU19CT1VOREFSWSAgICAgICAgMHgwMDAwMDAwNAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFR5cGVzIHNwZWNpZmljIHRvIDE2LWJpdCB0YXJnZXRzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2VsaWYgQUNQSV9NQUNISU5FX1dJRFRIID09IDE2CisKKy8qISBbQmVnaW5dIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uIChrZWVwIHRoZSB0eXBlZGVmcyBhcy1pcykgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFVJTlQzMjsKK3R5cGVkZWYgc2hvcnQgSU5UMTY7Cit0eXBlZGVmIGxvbmcgSU5UMzI7CiAKIC8qISBbRW5kXSBubyBzb3VyY2UgY29kZSB0cmFuc2xhdGlvbiAhKi8KIApAQCAtMTQ4LDYxICsyMTksNTcgQEAKIHR5cGVkZWYgdTMyIGFjcGlfdGFibGVfcHRyOwogdHlwZWRlZiB1MzIgYWNwaV9pb19hZGRyZXNzOwogdHlwZWRlZiBjaGFyICphY3BpX3BoeXNpY2FsX2FkZHJlc3M7Ci10eXBlZGVmIHUxNiBhY3BpX3NpemU7CiAKLSNkZWZpbmUgQUxJR05FRF9BRERSRVNTX0JPVU5EQVJZICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEFDUElfTUlTQUxJR05FRF9UUkFOU0ZFUlMKLSNkZWZpbmUgQUNQSV9VU0VfTkFUSVZFX0RJVklERQkvKiBObyA2NC1iaXQgaW50ZWdlcnMsIG9rIHRvIHVzZSBuYXRpdmUgZGl2aWRlICovCiAjZGVmaW5lIEFDUElfTUFYX1BUUiAgICAgICAgICAgICAgICAgICAgQUNQSV9VSU5UMTZfTUFYCiAjZGVmaW5lIEFDUElfU0laRV9NQVggICAgICAgICAgICAgICAgICAgQUNQSV9VSU5UMTZfTUFYCiAKLS8qCi0gKiAoMTYtYml0IG9ubHkpIGludGVybmFsIGludGVnZXJzIG11c3QgYmUgMzItYml0cywgc28KLSAqIDY0LWJpdCBpbnRlZ2VycyBjYW5ub3QgYmUgc3VwcG9ydGVkCi0gKi8KKyNkZWZpbmUgQUxJR05FRF9BRERSRVNTX0JPVU5EQVJZICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEFDUElfVVNFX05BVElWRV9ESVZJREUJLyogTm8gNjQtYml0IGludGVnZXJzLCBvayB0byB1c2UgbmF0aXZlIGRpdmlkZSAqLworCisvKiA2NC1iaXQgaW50ZWdlcnMgY2Fubm90IGJlIHN1cHBvcnRlZCAqLworCiAjZGVmaW5lIEFDUElfTk9fSU5URUdFUjY0X1NVUFBPUlQKIAotI2VsaWYgQUNQSV9NQUNISU5FX1dJRFRIID09IDMyCi0KLS8qISBbQmVnaW5dIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uIChrZWVwIHRoZSB0eXBlZGVmcykgKi8KLQotLyoKLSAqIDMyLWJpdCB0eXBlIGRlZmluaXRpb25zIChkZWZhdWx0KQotICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUlOVDg7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgQk9PTEVBTjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgVUlOVDE2OwotdHlwZWRlZiBpbnQgSU5UMzI7Ci10eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UMzI7Ci10eXBlZGVmIENPTVBJTEVSX0RFUEVOREVOVF9JTlQ2NCBJTlQ2NDsKLXR5cGVkZWYgQ09NUElMRVJfREVQRU5ERU5UX1VJTlQ2NCBVSU5UNjQ7Ci0KLS8qISBbRW5kXSBubyBzb3VyY2UgY29kZSB0cmFuc2xhdGlvbiAhKi8KLQotdHlwZWRlZiBzMzIgYWNwaV9uYXRpdmVfaW50OwotdHlwZWRlZiB1MzIgYWNwaV9uYXRpdmVfdWludDsKLQotdHlwZWRlZiB1NjQgYWNwaV90YWJsZV9wdHI7Ci10eXBlZGVmIHUzMiBhY3BpX2lvX2FkZHJlc3M7Ci10eXBlZGVmIHU2NCBhY3BpX3BoeXNpY2FsX2FkZHJlc3M7Ci10eXBlZGVmIHUzMiBhY3BpX3NpemU7Ci0KLSNkZWZpbmUgQUxJR05FRF9BRERSRVNTX0JPVU5EQVJZICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEFDUElfTUlTQUxJR05FRF9UUkFOU0ZFUlMKLSNkZWZpbmUgQUNQSV9NQVhfUFRSICAgICAgICAgICAgICAgICAgICBBQ1BJX1VJTlQzMl9NQVgKLSNkZWZpbmUgQUNQSV9TSVpFX01BWCAgICAgICAgICAgICAgICAgICBBQ1BJX1VJTlQzMl9NQVgKLQogI2Vsc2UKKworLyogQUNQSV9NQUNISU5FX1dJRFRIIG11c3QgYmUgZWl0aGVyIDY0LCAzMiwgb3IgMTYgKi8KKwogI2Vycm9yIHVua25vd24gQUNQSV9NQUNISU5FX1dJRFRICiAjZW5kaWYKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBPUy0gb3IgY29tcGlsZXItZGVwZW5kZW50IHR5cGVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogLyoKLSAqIFRoaXMgdHlwZSBpcyB1c2VkIGZvciBiaXRmaWVsZHMgaW4gQUNQSSB0YWJsZXMuIFRoZSBvbmx5IHR5cGUgdGhhdCBpcwotICogZXZlbiByZW1vdGVseSBwb3J0YWJsZSBpcyB1OC4gQW55dGhpbmcgZWxzZSBpcyBub3QgcG9ydGFibGUsIHNvCi0gKiBkbyBub3QgYWRkIGFueSBtb3JlIGJpdGZpZWxkIHR5cGVzLgorICogSWYgYWNwaV91aW50cHRyX3Qgd2FzIG5vdCBkZWZpbmVkIGluIHRoZSBPUy0gb3IgY29tcGlsZXItZGVwZW5kZW50IGhlYWRlciwKKyAqIGRlZmluZSBpdCBub3cgKHVzZSBDOTkgdWludHB0cl90IGZvciBwb2ludGVyIGNhc3RpbmcgaWYgYXZhaWxhYmxlLAorICogInZvaWQgKiIgb3RoZXJ3aXNlKQogICovCi10eXBlZGVmIHU4IFVJTlQ4X0JJVDsKLXR5cGVkZWYgYWNwaV9uYXRpdmVfdWludCBBQ1BJX1BUUkRJRkY7CisjaWZuZGVmIGFjcGlfdWludHB0cl90CisjZGVmaW5lIGFjcGlfdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoKKyNlbmRpZgorCisvKgorICogSWYgYWNwaV9jYWNoZV90IHdhcyBub3QgZGVmaW5lZCBpbiB0aGUgT1MtZGVwZW5kZW50IGhlYWRlciwKKyAqIGRlZmluZSBpdCBub3cuIFRoaXMgaXMgdHlwaWNhbGx5IHRoZSBjYXNlIHdoZXJlIHRoZSBsb2NhbCBjYWNoZQorICogbWFuYWdlciBpbXBsZW1lbnRhdGlvbiBpcyB0byBiZSB1c2VkIChBQ1BJX1VTRV9MT0NBTF9DQUNIRSkKKyAqLworI2lmbmRlZiBhY3BpX2NhY2hlX3QKKyNkZWZpbmUgYWNwaV9jYWNoZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhY3BpX21lbW9yeV9saXN0CisjZW5kaWYKKworLyogVmFyaWFibGUtd2lkdGggdHlwZSwgdXNlZCBpbnN0ZWFkIG9mIGNsaWIgc2l6ZV90ICovCisKK3R5cGVkZWYgYWNwaV9uYXRpdmVfdWludCBhY3BpX3NpemU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSW5kZXBlbmRlbnQgdHlwZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgogICogUG9pbnRlciBvdmVybGF5cyB0byBhdm9pZCBsb3RzIG9mIHR5cGVjYXN0aW5nIGZvcgpAQCAtMjM0LDE4ICszMDEsOCBAQAogI2RlZmluZSBBQ1BJX0xPR01PREVfUEhZU1BUUiAgICAgICAgICAgIEFDUElfTE9HSUNBTF9BRERSRVNTSU5HICB8IEFDUElfUEhZU0lDQUxfUE9JTlRFUgogI2RlZmluZSBBQ1BJX0xPR01PREVfTE9HUFRSICAgICAgICAgICAgIEFDUElfTE9HSUNBTF9BRERSRVNTSU5HICB8IEFDUElfTE9HSUNBTF9QT0lOVEVSCiAKLS8qCi0gKiBJZiBhY3BpX2NhY2hlX3Qgd2FzIG5vdCBkZWZpbmVkIGluIHRoZSBPUy1kZXBlbmRlbnQgaGVhZGVyLAotICogZGVmaW5lIGl0IG5vdy4gVGhpcyBpcyB0eXBpY2FsbHkgdGhlIGNhc2Ugd2hlcmUgdGhlIGxvY2FsIGNhY2hlCi0gKiBtYW5hZ2VyIGltcGxlbWVudGF0aW9uIGlzIHRvIGJlIHVzZWQgKEFDUElfVVNFX0xPQ0FMX0NBQ0hFKQotICovCi0jaWZuZGVmIGFjcGlfY2FjaGVfdAotI2RlZmluZSBhY3BpX2NhY2hlX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QKLSNlbmRpZgorLyogTG9naWNhbCBkZWZpbmVzIGFuZCBOVUxMICovCiAKLS8qCi0gKiBVc2VmdWwgZGVmaW5lcwotICovCiAjaWZkZWYgRkFMU0UKICN1bmRlZiBGQUxTRQogI2VuZGlmCkBAIC0yNjEsMTIgKzMxOCwxMiBAQAogI2VuZGlmCiAKIC8qCi0gKiBMb2NhbCBkYXRhdHlwZXMKKyAqIE1lc2NlbGxhbmVvdXMgdHlwZXMKICAqLwogdHlwZWRlZiB1MzIgYWNwaV9zdGF0dXM7CS8qIEFsbCBBQ1BJIEV4Y2VwdGlvbnMgKi8KIHR5cGVkZWYgdTMyIGFjcGlfbmFtZTsJCS8qIDQtYnl0ZSBBQ1BJIG5hbWUgKi8KIHR5cGVkZWYgY2hhciAqYWNwaV9zdHJpbmc7CS8qIE51bGwgdGVybWluYXRlZCBBU0NJSSBzdHJpbmcgKi8KLXR5cGVkZWYgdm9pZCAqYWNwaV9oYW5kbGU7CS8qIEFjdHVhbGx5IGEgcHRyIHRvIGFuIE5vZGUgKi8KK3R5cGVkZWYgdm9pZCAqYWNwaV9oYW5kbGU7CS8qIEFjdHVhbGx5IGEgcHRyIHRvIGEgTlMgTm9kZSAqLwogCiBzdHJ1Y3QgdWludDY0X3N0cnVjdCB7CiAJdTMyIGxvOwpAQCAtMzIzLDcgKzM4MCw3IEBACiAvKgogICogQ29uc3RhbnRzIHdpdGggc3BlY2lhbCBtZWFuaW5ncwogICovCi0jZGVmaW5lIEFDUElfUk9PVF9PQkpFQ1QgICAgICAgICAgICAgICAgKGFjcGlfaGFuZGxlKSBBQ1BJX1BUUl9BREQgKGNoYXIsIE5VTEwsIEFDUElfTUFYX1BUUikKKyNkZWZpbmUgQUNQSV9ST09UX09CSkVDVCAgICAgICAgICAgICAgICBBQ1BJX0FERF9QVFIgKGFjcGlfaGFuZGxlLCBOVUxMLCBBQ1BJX01BWF9QVFIpCiAKIC8qCiAgKiBJbml0aWFsaXphdGlvbiBzZXF1ZW5jZQpAQCAtNDcwLDM3ICs1MjcsNiBAQAogI2RlZmluZSBBQ1BJX1RZUEVfTk9UX0ZPVU5EICAgICAgICAgICAgIDB4RkYKIAogLyoKLSAqIEJpdG1hcHBlZCBBQ1BJIHR5cGVzLiAgVXNlZCBpbnRlcm5hbGx5IG9ubHkKLSAqLwotI2RlZmluZSBBQ1BJX0JUWVBFX0FOWSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgQUNQSV9CVFlQRV9JTlRFR0VSICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEFDUElfQlRZUEVfU1RSSU5HICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBBQ1BJX0JUWVBFX0JVRkZFUiAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgQUNQSV9CVFlQRV9QQUNLQUdFICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEFDUElfQlRZUEVfRklFTERfVU5JVCAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBBQ1BJX0JUWVBFX0RFVklDRSAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgQUNQSV9CVFlQRV9FVkVOVCAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEFDUElfQlRZUEVfTUVUSE9EICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBBQ1BJX0JUWVBFX01VVEVYICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgQUNQSV9CVFlQRV9SRUdJT04gICAgICAgICAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIEFDUElfQlRZUEVfUE9XRVIgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAotI2RlZmluZSBBQ1BJX0JUWVBFX1BST0NFU1NPUiAgICAgICAgICAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgQUNQSV9CVFlQRV9USEVSTUFMICAgICAgICAgICAgICAweDAwMDAxMDAwCi0jZGVmaW5lIEFDUElfQlRZUEVfQlVGRkVSX0ZJRUxEICAgICAgICAgMHgwMDAwMjAwMAotI2RlZmluZSBBQ1BJX0JUWVBFX0REQl9IQU5ETEUgICAgICAgICAgIDB4MDAwMDQwMDAKLSNkZWZpbmUgQUNQSV9CVFlQRV9ERUJVR19PQkpFQ1QgICAgICAgICAweDAwMDA4MDAwCi0jZGVmaW5lIEFDUElfQlRZUEVfUkVGRVJFTkNFICAgICAgICAgICAgMHgwMDAxMDAwMAotI2RlZmluZSBBQ1BJX0JUWVBFX1JFU09VUkNFICAgICAgICAgICAgIDB4MDAwMjAwMDAKLQotI2RlZmluZSBBQ1BJX0JUWVBFX0NPTVBVVEVfREFUQSAgICAgICAgIChBQ1BJX0JUWVBFX0lOVEVHRVIgfCBBQ1BJX0JUWVBFX1NUUklORyB8IEFDUElfQlRZUEVfQlVGRkVSKQotCi0jZGVmaW5lIEFDUElfQlRZUEVfREFUQSAgICAgICAgICAgICAgICAgKEFDUElfQlRZUEVfQ09NUFVURV9EQVRBICB8IEFDUElfQlRZUEVfUEFDS0FHRSkKLSNkZWZpbmUgQUNQSV9CVFlQRV9EQVRBX1JFRkVSRU5DRSAgICAgICAoQUNQSV9CVFlQRV9EQVRBIHwgQUNQSV9CVFlQRV9SRUZFUkVOQ0UgfCBBQ1BJX0JUWVBFX0REQl9IQU5ETEUpCi0jZGVmaW5lIEFDUElfQlRZUEVfREVWSUNFX09CSkVDVFMgICAgICAgKEFDUElfQlRZUEVfREVWSUNFIHwgQUNQSV9CVFlQRV9USEVSTUFMIHwgQUNQSV9CVFlQRV9QUk9DRVNTT1IpCi0jZGVmaW5lIEFDUElfQlRZUEVfT0JKRUNUU19BTkRfUkVGUyAgICAgMHgwMDAxRkZGRgkvKiBBUkcgb3IgTE9DQUwgKi8KLSNkZWZpbmUgQUNQSV9CVFlQRV9BTExfT0JKRUNUUyAgICAgICAgICAweDAwMDBGRkZGCi0KLS8qCiAgKiBBbGwgSS9PCiAgKi8KICNkZWZpbmUgQUNQSV9SRUFEICAgICAgICAgICAgICAgICAgICAgICAwCkBAIC04NTMsNiArODc5LDE0IEBACiAjZGVmaW5lIEFDUElfVkFMSURfQ0lEICAgICAgICAgICAgICAgICAgMHgwMDEwCiAjZGVmaW5lIEFDUElfVkFMSURfU1hEUyAgICAgICAgICAgICAgICAgMHgwMDIwCiAKKy8qIEZsYWdzIGZvciBfU1RBIG1ldGhvZCAqLworCisjZGVmaW5lIEFDUElfU1RBX0RFVklDRV9QUkVTRU5UICAgICAgICAgMHgwMQorI2RlZmluZSBBQ1BJX1NUQV9ERVZJQ0VfRU5BQkxFRCAgICAgICAgIDB4MDIKKyNkZWZpbmUgQUNQSV9TVEFfREVWSUNFX1VJICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIEFDUElfU1RBX0RFVklDRV9PSyAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBBQ1BJX1NUQV9CQVRURVJZX1BSRVNFTlQgICAgICAgIDB4MTAKKwogI2RlZmluZSBBQ1BJX0NPTU1PTl9PQkpfSU5GTyBcCiAJYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICAgICAgdHlwZTsgICAgICAgICAgIC8qIEFDUEkgb2JqZWN0IHR5cGUgKi8gXAogCWFjcGlfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUJLyogQUNQSSBvYmplY3QgTmFtZSAqLwpAQCAtODk1LDYgKzkyOSw4IEBACiAvKgogICogRGVmaW5pdGlvbnMgZm9yIFJlc291cmNlIEF0dHJpYnV0ZXMKICAqLwordHlwZWRlZiB1MTYgYWNwaV9yc19sZW5ndGg7CS8qIFJlc291cmNlIExlbmd0aCBmaWVsZCBpcyBmaXhlZCBhdCAxNiBiaXRzICovCit0eXBlZGVmIHUzMiBhY3BpX3JzZGVzY19zaXplOwkvKiBNYXggUmVzb3VyY2UgRGVzY3JpcHRvciBzaXplIGlzIChsZW5ndGgrMykgPSAoNjRfay0xKSszICovCiAKIC8qCiAgKiAgTWVtb3J5IEF0dHJpYnV0ZXMKQEAgLTkxNiw3ICs5NTIsOSBAQAogI2RlZmluZSBBQ1BJX0lTQV9PTkxZX1JBTkdFUyAgICAgICAgICAgICh1OCkgMHgwMgogI2RlZmluZSBBQ1BJX0VOVElSRV9SQU5HRSAgICAgICAgICAgICAgIChBQ1BJX05PTl9JU0FfT05MWV9SQU5HRVMgfCBBQ1BJX0lTQV9PTkxZX1JBTkdFUykKIAotI2RlZmluZSBBQ1BJX1NQQVJTRV9UUkFOU0xBVElPTiAgICAgICAgICh1OCkgMHgwMworLyogVHlwZSBvZiB0cmFuc2xhdGlvbiAtIDE9U3BhcnNlLCAwPURlbnNlICovCisKKyNkZWZpbmUgQUNQSV9TUEFSU0VfVFJBTlNMQVRJT04gICAgICAgICAodTgpIDB4MDEKIAogLyoKICAqICBJTyBQb3J0IERlc2NyaXB0b3IgRGVjb2RlCkBAIC05MjcsOCArOTY1LDggQEAKIC8qCiAgKiAgSVJRIEF0dHJpYnV0ZXMKICAqLwotI2RlZmluZSBBQ1BJX0VER0VfU0VOU0lUSVZFICAgICAgICAgICAgICh1OCkgMHgwMAotI2RlZmluZSBBQ1BJX0xFVkVMX1NFTlNJVElWRSAgICAgICAgICAgICh1OCkgMHgwMQorI2RlZmluZSBBQ1BJX0xFVkVMX1NFTlNJVElWRSAgICAgICAgICAgICh1OCkgMHgwMAorI2RlZmluZSBBQ1BJX0VER0VfU0VOU0lUSVZFICAgICAgICAgICAgICh1OCkgMHgwMQogCiAjZGVmaW5lIEFDUElfQUNUSVZFX0hJR0ggICAgICAgICAgICAgICAgKHU4KSAweDAwCiAjZGVmaW5lIEFDUElfQUNUSVZFX0xPVyAgICAgICAgICAgICAgICAgKHU4KSAweDAxCkBAIC05NzUsMjcgKzEwMTMsNDUgQEAKICNkZWZpbmUgQUNQSV9DT05TVU1FUiAgICAgICAgICAgICAgICAgICAodTgpIDB4MDEKIAogLyoKKyAqIElmIHBvc3NpYmxlLCBwYWNrIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlcyB0byBieXRlIGFsaWdubWVudAorICovCisjaWZuZGVmIEFDUElfTUlTQUxJR05NRU5UX05PVF9TVVBQT1JURUQKKyNwcmFnbWEgcGFjaygxKQorI2VuZGlmCisKKy8qIFVVSUQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB1c2UgaW4gdmVuZG9yLWRlZmluZWQgcmVzb3VyY2UgZGVzY3JpcHRvcnMgKi8KKworc3RydWN0IGFjcGlfdXVpZCB7CisJdTggZGF0YVtBQ1BJX1VVSURfTEVOR1RIXTsKK307CisKK3N0cnVjdCBhY3BpX3ZlbmRvcl91dWlkIHsKKwl1OCBzdWJ0eXBlOworCXU4IGRhdGFbQUNQSV9VVUlEX0xFTkdUSF07Cit9OworCisvKgogICogIFN0cnVjdHVyZXMgdXNlZCB0byBkZXNjcmliZSBkZXZpY2UgcmVzb3VyY2VzCiAgKi8KIHN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSB7Ci0JdTMyIGVkZ2VfbGV2ZWw7Ci0JdTMyIGFjdGl2ZV9oaWdoX2xvdzsKLQl1MzIgc2hhcmVkX2V4Y2x1c2l2ZTsKLQl1MzIgbnVtYmVyX29mX2ludGVycnVwdHM7Ci0JdTMyIGludGVycnVwdHNbMV07CisJdTggdHJpZ2dlcmluZzsKKwl1OCBwb2xhcml0eTsKKwl1OCBzaGFyYWJsZTsKKwl1OCBpbnRlcnJ1cHRfY291bnQ7CisJdTggaW50ZXJydXB0c1sxXTsKIH07CiAKIHN0cnVjdCBhY3BpX3Jlc291cmNlX2RtYSB7Ci0JdTMyIHR5cGU7Ci0JdTMyIGJ1c19tYXN0ZXI7Ci0JdTMyIHRyYW5zZmVyOwotCXUzMiBudW1iZXJfb2ZfY2hhbm5lbHM7Ci0JdTMyIGNoYW5uZWxzWzFdOworCXU4IHR5cGU7CisJdTggYnVzX21hc3RlcjsKKwl1OCB0cmFuc2ZlcjsKKwl1OCBjaGFubmVsX2NvdW50OworCXU4IGNoYW5uZWxzWzFdOwogfTsKIAotc3RydWN0IGFjcGlfcmVzb3VyY2Vfc3RhcnRfZHBmIHsKLQl1MzIgY29tcGF0aWJpbGl0eV9wcmlvcml0eTsKLQl1MzIgcGVyZm9ybWFuY2Vfcm9idXN0bmVzczsKK3N0cnVjdCBhY3BpX3Jlc291cmNlX3N0YXJ0X2RlcGVuZGVudCB7CisJdTggY29tcGF0aWJpbGl0eV9wcmlvcml0eTsKKwl1OCBwZXJmb3JtYW5jZV9yb2J1c3RuZXNzOwogfTsKIAogLyoKQEAgLTEwMDQsMTc5ICsxMDYwLDIxNyBAQAogICovCiAKIHN0cnVjdCBhY3BpX3Jlc291cmNlX2lvIHsKLQl1MzIgaW9fZGVjb2RlOwotCXUzMiBtaW5fYmFzZV9hZGRyZXNzOwotCXUzMiBtYXhfYmFzZV9hZGRyZXNzOwotCXUzMiBhbGlnbm1lbnQ7Ci0JdTMyIHJhbmdlX2xlbmd0aDsKKwl1OCBpb19kZWNvZGU7CisJdTggYWxpZ25tZW50OworCXU4IGFkZHJlc3NfbGVuZ3RoOworCXUxNiBtaW5pbXVtOworCXUxNiBtYXhpbXVtOwogfTsKIAogc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfaW8gewotCXUzMiBiYXNlX2FkZHJlc3M7Ci0JdTMyIHJhbmdlX2xlbmd0aDsKKwl1MTYgYWRkcmVzczsKKwl1OCBhZGRyZXNzX2xlbmd0aDsKIH07CiAKIHN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvciB7Ci0JdTMyIGxlbmd0aDsKLQl1OCByZXNlcnZlZFsxXTsKKwl1MTYgYnl0ZV9sZW5ndGg7CisJdTggYnl0ZV9kYXRhWzFdOworfTsKKworLyogVmVuZG9yIHJlc291cmNlIHdpdGggVVVJRCBpbmZvIChpbnRyb2R1Y2VkIGluIEFDUEkgMy4wKSAqLworCitzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3JfdHlwZWQgeworCXUxNiBieXRlX2xlbmd0aDsKKwl1OCB1dWlkX3N1YnR5cGU7CisJdTggdXVpZFtBQ1BJX1VVSURfTEVOR1RIXTsKKwl1OCBieXRlX2RhdGFbMV07CiB9OwogCiBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9lbmRfdGFnIHsKIAl1OCBjaGVja3N1bTsKIH07CiAKLXN0cnVjdCBhY3BpX3Jlc291cmNlX21lbTI0IHsKLQl1MzIgcmVhZF93cml0ZV9hdHRyaWJ1dGU7Ci0JdTMyIG1pbl9iYXNlX2FkZHJlc3M7Ci0JdTMyIG1heF9iYXNlX2FkZHJlc3M7Ci0JdTMyIGFsaWdubWVudDsKLQl1MzIgcmFuZ2VfbGVuZ3RoOworc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtb3J5MjQgeworCXU4IHdyaXRlX3Byb3RlY3Q7CisJdTE2IG1pbmltdW07CisJdTE2IG1heGltdW07CisJdTE2IGFsaWdubWVudDsKKwl1MTYgYWRkcmVzc19sZW5ndGg7CiB9OwogCi1zdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0zMiB7Ci0JdTMyIHJlYWRfd3JpdGVfYXR0cmlidXRlOwotCXUzMiBtaW5fYmFzZV9hZGRyZXNzOwotCXUzMiBtYXhfYmFzZV9hZGRyZXNzOworc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtb3J5MzIgeworCXU4IHdyaXRlX3Byb3RlY3Q7CisJdTMyIG1pbmltdW07CisJdTMyIG1heGltdW07CiAJdTMyIGFsaWdubWVudDsKLQl1MzIgcmFuZ2VfbGVuZ3RoOworCXUzMiBhZGRyZXNzX2xlbmd0aDsKIH07CiAKLXN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX21lbTMyIHsKLQl1MzIgcmVhZF93cml0ZV9hdHRyaWJ1dGU7Ci0JdTMyIHJhbmdlX2Jhc2VfYWRkcmVzczsKLQl1MzIgcmFuZ2VfbGVuZ3RoOworc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtb3J5MzIgeworCXU4IHdyaXRlX3Byb3RlY3Q7CisJdTMyIGFkZHJlc3M7CisJdTMyIGFkZHJlc3NfbGVuZ3RoOwogfTsKIAogc3RydWN0IGFjcGlfbWVtb3J5X2F0dHJpYnV0ZSB7Ci0JdTE2IGNhY2hlX2F0dHJpYnV0ZTsKLQl1MTYgcmVhZF93cml0ZV9hdHRyaWJ1dGU7CisJdTggd3JpdGVfcHJvdGVjdDsKKwl1OCBjYWNoaW5nOworCXU4IHJhbmdlX3R5cGU7CisJdTggdHJhbnNsYXRpb247CiB9OwogCiBzdHJ1Y3QgYWNwaV9pb19hdHRyaWJ1dGUgewotCXUxNiByYW5nZV9hdHRyaWJ1dGU7Ci0JdTE2IHRyYW5zbGF0aW9uX2F0dHJpYnV0ZTsKLX07Ci0KLXN0cnVjdCBhY3BpX2J1c19hdHRyaWJ1dGUgewotCXUxNiByZXNlcnZlZDE7Ci0JdTE2IHJlc2VydmVkMjsKKwl1OCByYW5nZV90eXBlOworCXU4IHRyYW5zbGF0aW9uOworCXU4IHRyYW5zbGF0aW9uX3R5cGU7CisJdTggcmVzZXJ2ZWQxOwogfTsKIAogdW5pb24gYWNwaV9yZXNvdXJjZV9hdHRyaWJ1dGUgewotCXN0cnVjdCBhY3BpX21lbW9yeV9hdHRyaWJ1dGUgbWVtb3J5OworCXN0cnVjdCBhY3BpX21lbW9yeV9hdHRyaWJ1dGUgbWVtOwogCXN0cnVjdCBhY3BpX2lvX2F0dHJpYnV0ZSBpbzsKLQlzdHJ1Y3QgYWNwaV9idXNfYXR0cmlidXRlIGJ1czsKKworCS8qIFVzZWQgZm9yIHRoZSAqd29yZF9zcGFjZSBtYWNyb3MgKi8KKworCXU4IHR5cGVfc3BlY2lmaWM7CiB9OwogCiBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zb3VyY2UgewotCXUzMiBpbmRleDsKLQl1MzIgc3RyaW5nX2xlbmd0aDsKKwl1OCBpbmRleDsKKwl1MTYgc3RyaW5nX2xlbmd0aDsKIAljaGFyICpzdHJpbmdfcHRyOwogfTsKIAogLyogRmllbGRzIGNvbW1vbiB0byBhbGwgYWRkcmVzcyBkZXNjcmlwdG9ycywgMTYvMzIvNjQgYml0ICovCiAKICNkZWZpbmUgQUNQSV9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTiBcCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VfdHlwZTsgXAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y2VyX2NvbnN1bWVyOyBcCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlOyBcCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2FkZHJlc3NfZml4ZWQ7IFwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYWRkcmVzc19maXhlZDsgXAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfYXR0cmlidXRlICAgICAgIGF0dHJpYnV0ZTsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV90eXBlOyBcCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjZXJfY29uc3VtZXI7IFwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGU7IFwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fYWRkcmVzc19maXhlZDsgXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9hZGRyZXNzX2ZpeGVkOyBcCisJdW5pb24gYWNwaV9yZXNvdXJjZV9hdHRyaWJ1dGUgICAgICAgaW5mbzsKIAogc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzcyB7CiBBQ1BJX1JFU09VUkNFX0FERFJFU1NfQ09NTU9OfTsKIAogc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2IHsKLQlBQ1BJX1JFU09VUkNFX0FERFJFU1NfQ09NTU9OIHUzMiBncmFudWxhcml0eTsKLQl1MzIgbWluX2FkZHJlc3NfcmFuZ2U7Ci0JdTMyIG1heF9hZGRyZXNzX3JhbmdlOwotCXUzMiBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldDsKLQl1MzIgYWRkcmVzc19sZW5ndGg7CisJQUNQSV9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTiB1MTYgZ3JhbnVsYXJpdHk7CisJdTE2IG1pbmltdW07CisJdTE2IG1heGltdW07CisJdTE2IHRyYW5zbGF0aW9uX29mZnNldDsKKwl1MTYgYWRkcmVzc19sZW5ndGg7CiAJc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlIHJlc291cmNlX3NvdXJjZTsKIH07CiAKIHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMiB7CiAJQUNQSV9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTiB1MzIgZ3JhbnVsYXJpdHk7Ci0JdTMyIG1pbl9hZGRyZXNzX3JhbmdlOwotCXUzMiBtYXhfYWRkcmVzc19yYW5nZTsKLQl1MzIgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQ7CisJdTMyIG1pbmltdW07CisJdTMyIG1heGltdW07CisJdTMyIHRyYW5zbGF0aW9uX29mZnNldDsKIAl1MzIgYWRkcmVzc19sZW5ndGg7CiAJc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlIHJlc291cmNlX3NvdXJjZTsKIH07CiAKIHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCB7CiAJQUNQSV9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTiB1NjQgZ3JhbnVsYXJpdHk7Ci0JdTY0IG1pbl9hZGRyZXNzX3JhbmdlOwotCXU2NCBtYXhfYWRkcmVzc19yYW5nZTsKLQl1NjQgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQ7CisJdTY0IG1pbmltdW07CisJdTY0IG1heGltdW07CisJdTY0IHRyYW5zbGF0aW9uX29mZnNldDsKIAl1NjQgYWRkcmVzc19sZW5ndGg7Ci0JdTY0IHR5cGVfc3BlY2lmaWNfYXR0cmlidXRlczsKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zb3VyY2UgcmVzb3VyY2Vfc291cmNlOwogfTsKIAotc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0X2lycSB7Ci0JdTMyIHByb2R1Y2VyX2NvbnN1bWVyOwotCXUzMiBlZGdlX2xldmVsOwotCXUzMiBhY3RpdmVfaGlnaF9sb3c7Ci0JdTMyIHNoYXJlZF9leGNsdXNpdmU7Ci0JdTMyIG51bWJlcl9vZl9pbnRlcnJ1cHRzOworc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0ZW5kZWRfYWRkcmVzczY0IHsKKwlBQ1BJX1JFU09VUkNFX0FERFJFU1NfQ09NTU9OIHU4IHJldmlzaW9uX2lEOworCXU2NCBncmFudWxhcml0eTsKKwl1NjQgbWluaW11bTsKKwl1NjQgbWF4aW11bTsKKwl1NjQgdHJhbnNsYXRpb25fb2Zmc2V0OworCXU2NCBhZGRyZXNzX2xlbmd0aDsKKwl1NjQgdHlwZV9zcGVjaWZpYzsKK307CisKK3N0cnVjdCBhY3BpX3Jlc291cmNlX2V4dGVuZGVkX2lycSB7CisJdTggcHJvZHVjZXJfY29uc3VtZXI7CisJdTggdHJpZ2dlcmluZzsKKwl1OCBwb2xhcml0eTsKKwl1OCBzaGFyYWJsZTsKKwl1OCBpbnRlcnJ1cHRfY291bnQ7CiAJc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlIHJlc291cmNlX3NvdXJjZTsKIAl1MzIgaW50ZXJydXB0c1sxXTsKIH07CiAKK3N0cnVjdCBhY3BpX3Jlc291cmNlX2dlbmVyaWNfcmVnaXN0ZXIgeworCXU4IHNwYWNlX2lkOworCXU4IGJpdF93aWR0aDsKKwl1OCBiaXRfb2Zmc2V0OworCXU4IGFjY2Vzc19zaXplOworCXU2NCBhZGRyZXNzOworfTsKKwogLyogQUNQSV9SRVNPVVJDRV9UWVBFcyAqLwogCi0jZGVmaW5lIEFDUElfUlNUWVBFX0lSUSAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBBQ1BJX1JTVFlQRV9ETUEgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgQUNQSV9SU1RZUEVfU1RBUlRfRFBGICAgICAgICAgICAyCi0jZGVmaW5lIEFDUElfUlNUWVBFX0VORF9EUEYgICAgICAgICAgICAgMwotI2RlZmluZSBBQ1BJX1JTVFlQRV9JTyAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgQUNQSV9SU1RZUEVfRklYRURfSU8gICAgICAgICAgICA1Ci0jZGVmaW5lIEFDUElfUlNUWVBFX1ZFTkRPUiAgICAgICAgICAgICAgNgotI2RlZmluZSBBQ1BJX1JTVFlQRV9FTkRfVEFHICAgICAgICAgICAgIDcKLSNkZWZpbmUgQUNQSV9SU1RZUEVfTUVNMjQgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIEFDUElfUlNUWVBFX01FTTMyICAgICAgICAgICAgICAgOQotI2RlZmluZSBBQ1BJX1JTVFlQRV9GSVhFRF9NRU0zMiAgICAgICAgIDEwCi0jZGVmaW5lIEFDUElfUlNUWVBFX0FERFJFU1MxNiAgICAgICAgICAgMTEKLSNkZWZpbmUgQUNQSV9SU1RZUEVfQUREUkVTUzMyICAgICAgICAgICAxMgotI2RlZmluZSBBQ1BJX1JTVFlQRV9BRERSRVNTNjQgICAgICAgICAgIDEzCi0jZGVmaW5lIEFDUElfUlNUWVBFX0VYVF9JUlEgICAgICAgICAgICAgMTQKLQotdHlwZWRlZiB1MzIgYWNwaV9yZXNvdXJjZV90eXBlOworI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfSVJRICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfRE1BICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfU1RBUlRfREVQRU5ERU5UICAgICAgMgorI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX0RFUEVOREVOVCAgICAgICAgMworI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfSU8gICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfRklYRURfSU8gICAgICAgICAgICAgNQorI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfVkVORE9SICAgICAgICAgICAgICAgNgorI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX1RBRyAgICAgICAgICAgICAgNworI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMjQgICAgICAgICAgICAgOAorI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMzIgICAgICAgICAgICAgOQorI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfRklYRURfTUVNT1JZMzIgICAgICAgMTAKKyNkZWZpbmUgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MxNiAgICAgICAgICAgIDExCisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMzIgICAgICAgICAgICAxMgorI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzY0ICAgICAgICAgICAgMTMKKyNkZWZpbmUgQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0FERFJFU1M2NCAgIDE0CS8qIEFDUEkgMy4wICovCisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfVFlQRV9FWFRFTkRFRF9JUlEgICAgICAgICAxNQorI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfR0VORVJJQ19SRUdJU1RFUiAgICAgMTYKKyNkZWZpbmUgQUNQSV9SRVNPVVJDRV9UWVBFX01BWCAgICAgICAgICAgICAgICAgIDE2CiAKIHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSB7CiAJc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxIGlycTsKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9kbWEgZG1hOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlX3N0YXJ0X2RwZiBzdGFydF9kcGY7CisJc3RydWN0IGFjcGlfcmVzb3VyY2Vfc3RhcnRfZGVwZW5kZW50IHN0YXJ0X2RwZjsKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbyBpbzsKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9pbyBmaXhlZF9pbzsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IgdmVuZG9yX3NwZWNpZmljOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvciB2ZW5kb3I7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yX3R5cGVkIHZlbmRvcl90eXBlZDsKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9lbmRfdGFnIGVuZF90YWc7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMjQgbWVtb3J5MjQ7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMzIgbWVtb3J5MzI7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtMzIgZml4ZWRfbWVtb3J5MzI7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzcyBhZGRyZXNzOwkvKiBDb21tb24gMTYvMzIvNjQgYWRkcmVzcyBmaWVsZHMgKi8KKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW1vcnkyNCBtZW1vcnkyNDsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW1vcnkzMiBtZW1vcnkzMjsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW1vcnkzMiBmaXhlZF9tZW1vcnkzMjsKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMTYgYWRkcmVzczE2OwogCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMiBhZGRyZXNzMzI7CiAJc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0IGFkZHJlc3M2NDsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRfaXJxIGV4dGVuZGVkX2lycTsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRlbmRlZF9hZGRyZXNzNjQgZXh0X2FkZHJlc3M2NDsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRlbmRlZF9pcnEgZXh0ZW5kZWRfaXJxOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2dlbmVyaWNfcmVnaXN0ZXIgZ2VuZXJpY19yZWc7CisKKwkvKiBDb21tb24gZmllbGRzICovCisKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzIGFkZHJlc3M7CS8qIENvbW1vbiAxNi8zMi82NCBhZGRyZXNzIGZpZWxkcyAqLwogfTsKIAogc3RydWN0IGFjcGlfcmVzb3VyY2UgewotCWFjcGlfcmVzb3VyY2VfdHlwZSBpZDsKKwl1MzIgdHlwZTsKIAl1MzIgbGVuZ3RoOwogCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSBkYXRhOwogfTsKIAotI2RlZmluZSBBQ1BJX1JFU09VUkNFX0xFTkdUSCAgICAgICAgICAgICAgICAxMgotI2RlZmluZSBBQ1BJX1JFU09VUkNFX0xFTkdUSF9OT19EQVRBICAgICAgICA4CS8qIElkICsgTGVuZ3RoIGZpZWxkcyAqLworLyogcmVzdG9yZSBkZWZhdWx0IGFsaWdubWVudCAqLwogCi0jZGVmaW5lIEFDUElfU0laRU9GX1JFU09VUkNFKHR5cGUpICAgICAgICAgIChBQ1BJX1JFU09VUkNFX0xFTkdUSF9OT19EQVRBICsgc2l6ZW9mICh0eXBlKSkKKyNwcmFnbWEgcGFjaygpCisKKyNkZWZpbmUgQUNQSV9SU19TSVpFX01JTiAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgQUNQSV9SU19TSVpFX05PX0RBVEEgICAgICAgICAgICAgICAgOAkvKiBJZCArIExlbmd0aCBmaWVsZHMgKi8KKyNkZWZpbmUgQUNQSV9SU19TSVpFKHR5cGUpICAgICAgICAgICAgICAgICAgKHUzMikgKEFDUElfUlNfU0laRV9OT19EQVRBICsgc2l6ZW9mICh0eXBlKSkKIAogI2RlZmluZSBBQ1BJX05FWFRfUkVTT1VSQ0UocmVzKSAgICAgICAgICAgICAoc3RydWN0IGFjcGlfcmVzb3VyY2UgKikoKHU4ICopIHJlcyArIHJlcy0+bGVuZ3RoKQogCi0jaWZkZWYgQUNQSV9NSVNBTElHTkVEX1RSQU5TRkVSUworI2lmbmRlZiBBQ1BJX01JU0FMSUdOTUVOVF9OT1RfU1VQUE9SVEVECiAjZGVmaW5lIEFDUElfQUxJR05fUkVTT1VSQ0VfU0laRShsZW5ndGgpICAgIChsZW5ndGgpCiAjZWxzZQogI2RlZmluZSBBQ1BJX0FMSUdOX1JFU09VUkNFX1NJWkUobGVuZ3RoKSAgICBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEKGxlbmd0aCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3V0aWxzLmggYi9pbmNsdWRlL2FjcGkvYWN1dGlscy5oCmluZGV4IGMxMDg2NDUuLjEwZjY2MjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3V0aWxzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdXRpbHMuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTQ0LDYgKzQ0LDM5IEBACiAjaWZuZGVmIF9BQ1VUSUxTX0gKICNkZWZpbmUgX0FDVVRJTFNfSAogCitleHRlcm4gY29uc3QgdTggYWNwaV9nYmxfcmVzb3VyY2VfYW1sX3NpemVzW107CisKKy8qIFN0cmluZ3MgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyIGFuZCBkZWJ1Z2dlciByZXNvdXJjZSBkdW1wIHJvdXRpbmVzICovCisKKyNpZiBkZWZpbmVkKEFDUElfRElTQVNTRU1CTEVSKSB8fCBkZWZpbmVkIChBQ1BJX0RFQlVHR0VSKQorCitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfQk1kZWNvZGVbMl07CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfY29uZmlnX2RlY29kZVs0XTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9jb25zdW1lX2RlY29kZVsyXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9ERUNkZWNvZGVbMl07CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfSEVkZWNvZGVbMl07CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfaW9fZGVjb2RlWzJdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX0xMZGVjb2RlWzJdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX21heF9kZWNvZGVbMl07CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfTUVNZGVjb2RlWzRdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX21pbl9kZWNvZGVbMl07CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfTVRQZGVjb2RlWzRdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX1JOR2RlY29kZVs0XTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9SV2RlY29kZVsyXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9TSFJkZWNvZGVbMl07CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfU0laZGVjb2RlWzRdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX1RSU2RlY29kZVsyXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9UVFBkZWNvZGVbMl07CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfVFlQZGVjb2RlWzRdOworI2VuZGlmCisKKy8qIFR5cGVzIGZvciBSZXNvdXJjZSBkZXNjcmlwdG9yIGVudHJpZXMgKi8KKworI2RlZmluZSBBQ1BJX0lOVkFMSURfUkVTT1VSQ0UgICAgICAgICAgIDAKKyNkZWZpbmUgQUNQSV9GSVhFRF9MRU5HVEggICAgICAgICAgICAgICAxCisjZGVmaW5lIEFDUElfVkFSSUFCTEVfTEVOR1RIICAgICAgICAgICAgMgorI2RlZmluZSBBQ1BJX1NNQUxMX1ZBUklBQkxFX0xFTkdUSCAgICAgIDMKKwogdHlwZWRlZgogYWNwaV9zdGF0dXMoKmFjcGlfcGtnX2NhbGxiYWNrKSAodTggb2JqZWN0X3R5cGUsCiAJCQkJIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiBzb3VyY2Vfb2JqZWN0LApAQCAtMTU5LDcgKzE5Miw2IEBACiAjZGVmaW5lIEFDUElfSVNfTE9XRVIoYykgIChfYWNwaV9jdHlwZVsodW5zaWduZWQgY2hhcikoYyldICYgKF9BQ1BJX0xPKSkKICNkZWZpbmUgQUNQSV9JU19QUklOVChjKSAgKF9hY3BpX2N0eXBlWyh1bnNpZ25lZCBjaGFyKShjKV0gJiAoX0FDUElfTE8gfCBfQUNQSV9VUCB8IF9BQ1BJX0RJIHwgX0FDUElfU1AgfCBfQUNQSV9QVSkpCiAjZGVmaW5lIEFDUElfSVNfQUxQSEEoYykgIChfYWNwaV9jdHlwZVsodW5zaWduZWQgY2hhcikoYyldICYgKF9BQ1BJX0xPIHwgX0FDUElfVVApKQotI2RlZmluZSBBQ1BJX0lTX0FTQ0lJKGMpICAoKGMpIDwgMHg4MCkKIAogI2VuZGlmCQkJCS8qIEFDUElfVVNFX1NZU1RFTV9DTElCUkFSWSAqLwogCkBAIC0yNDMsMTIgKzI3NSwxMSBAQAogCQkgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKIAkJIGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgY29tcG9uZW50X2lkLCB1OCAqIHB0cik7CiAKLXZvaWQgYWNwaV91dF9yZXBvcnRfaW5mbyhjaGFyICptb2R1bGVfbmFtZSwgdTMyIGxpbmVfbnVtYmVyLCB1MzIgY29tcG9uZW50X2lkKTsKK3ZvaWQgYWNwaV91dF9yZXBvcnRfZXJyb3IoY2hhciAqbW9kdWxlX25hbWUsIHUzMiBsaW5lX251bWJlcik7CiAKLXZvaWQgYWNwaV91dF9yZXBvcnRfZXJyb3IoY2hhciAqbW9kdWxlX25hbWUsIHUzMiBsaW5lX251bWJlciwgdTMyIGNvbXBvbmVudF9pZCk7Cit2b2lkIGFjcGlfdXRfcmVwb3J0X2luZm8oY2hhciAqbW9kdWxlX25hbWUsIHUzMiBsaW5lX251bWJlcik7CiAKLXZvaWQKLWFjcGlfdXRfcmVwb3J0X3dhcm5pbmcoY2hhciAqbW9kdWxlX25hbWUsIHUzMiBsaW5lX251bWJlciwgdTMyIGNvbXBvbmVudF9pZCk7Cit2b2lkIGFjcGlfdXRfcmVwb3J0X3dhcm5pbmcoY2hhciAqbW9kdWxlX25hbWUsIHUzMiBsaW5lX251bWJlcik7CiAKIHZvaWQgYWNwaV91dF9kdW1wX2J1ZmZlcih1OCAqIGJ1ZmZlciwgdTMyIGNvdW50LCB1MzIgZGlzcGxheSwgdTMyIGNvbXBvbmVudF9pZCk7CiAKQEAgLTQxOSw3ICs0NTAsMTkgQEAKIAogI2RlZmluZSBBQ1BJX0FOWV9CQVNFICAgICAgICAwCiAKLXU4ICphY3BpX3V0X2dldF9yZXNvdXJjZV9lbmRfdGFnKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKTsKK2FjcGlfc3RhdHVzIGFjcGlfdXRfdmFsaWRhdGVfcmVzb3VyY2Uodm9pZCAqYW1sLCB1OCAqIHJldHVybl9pbmRleCk7CisKK3UzMiBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX2xlbmd0aCh2b2lkICphbWwpOworCit1MTYgYWNwaV91dF9nZXRfcmVzb3VyY2VfbGVuZ3RoKHZvaWQgKmFtbCk7CisKK3U4IGFjcGlfdXRfZ2V0X3Jlc291cmNlX2hlYWRlcl9sZW5ndGgodm9pZCAqYW1sKTsKKwordTggYWNwaV91dF9nZXRfcmVzb3VyY2VfdHlwZSh2b2lkICphbWwpOworCithY3BpX3N0YXR1cworYWNwaV91dF9nZXRfcmVzb3VyY2VfZW5kX3RhZyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgICAgdTggKiogZW5kX3RhZyk7CiAKIHU4IGFjcGlfdXRfZ2VuZXJhdGVfY2hlY2tzdW0odTggKiBidWZmZXIsIHUzMiBsZW5ndGgpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYW1sY29kZS5oIGIvaW5jbHVkZS9hY3BpL2FtbGNvZGUuaAppbmRleCA3ZmRmNTI5OS4uMzc5NjRhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FtbGNvZGUuaAorKysgYi9pbmNsdWRlL2FjcGkvYW1sY29kZS5oCkBAIC03LDcgKzcsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FtbHJlc3JjLmggYi9pbmNsdWRlL2FjcGkvYW1scmVzcmMuaAppbmRleCAwNTE3ODZlLi5mYjQ3MzUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYW1scmVzcmMuaAorKysgYi9pbmNsdWRlL2FjcGkvYW1scmVzcmMuaApAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTkyLDE4MiArOTIsMTY4IEBACiAJc3RydWN0IGFzbF9yZXNvdXJjZV9ub2RlICpuZXh0OwogfTsKIAorLyogTWFjcm9zIHVzZWQgdG8gZ2VuZXJhdGUgQU1MIHJlc291cmNlIGxlbmd0aCBmaWVsZHMgKi8KKworI2RlZmluZSBBQ1BJX0FNTF9TSVpFX0xBUkdFKHIpICAgICAgKHNpemVvZiAocikgLSBzaXplb2YgKHN0cnVjdCBhbWxfcmVzb3VyY2VfbGFyZ2VfaGVhZGVyKSkKKyNkZWZpbmUgQUNQSV9BTUxfU0laRV9TTUFMTChyKSAgICAgIChzaXplb2YgKHIpIC0gc2l6ZW9mIChzdHJ1Y3QgYW1sX3Jlc291cmNlX3NtYWxsX2hlYWRlcikpCisKIC8qCiAgKiBSZXNvdXJjZSBkZXNjcmlwdG9ycyBkZWZpbmVkIGluIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24uCiAgKgogICogUGFja2luZy9hbGlnbm1lbnQgbXVzdCBiZSBCWVRFIGJlY2F1c2UgdGhlc2UgZGVzY3JpcHRvcnMKLSAqIGFyZSB1c2VkIHRvIG92ZXJsYXkgdGhlIEFNTCBieXRlIHN0cmVhbS4KKyAqIGFyZSB1c2VkIHRvIG92ZXJsYXkgdGhlIHJhdyBBTUwgYnl0ZSBzdHJlYW0uCiAgKi8KICNwcmFnbWEgcGFjaygxKQogCi1zdHJ1Y3QgYXNsX2lycV9mb3JtYXRfZGVzYyB7Ci0JdTggZGVzY3JpcHRvcl90eXBlOwotCXUxNiBpcnFfbWFzazsKKy8qCisgKiBTTUFMTCBkZXNjcmlwdG9ycworICovCisjZGVmaW5lIEFNTF9SRVNPVVJDRV9TTUFMTF9IRUFERVJfQ09NTU9OIFwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3R5cGU7CisKK3N0cnVjdCBhbWxfcmVzb3VyY2Vfc21hbGxfaGVhZGVyIHsKK0FNTF9SRVNPVVJDRV9TTUFMTF9IRUFERVJfQ09NTU9OfTsKKworc3RydWN0IGFtbF9yZXNvdXJjZV9pcnEgeworCUFNTF9SRVNPVVJDRV9TTUFMTF9IRUFERVJfQ09NTU9OIHUxNiBpcnFfbWFzazsKIAl1OCBmbGFnczsKIH07CiAKLXN0cnVjdCBhc2xfaXJxX25vZmxhZ3NfZGVzYyB7Ci0JdTggZGVzY3JpcHRvcl90eXBlOwotCXUxNiBpcnFfbWFzazsKK3N0cnVjdCBhbWxfcmVzb3VyY2VfaXJxX25vZmxhZ3MgeworCUFNTF9SRVNPVVJDRV9TTUFMTF9IRUFERVJfQ09NTU9OIHUxNiBpcnFfbWFzazsKIH07CiAKLXN0cnVjdCBhc2xfZG1hX2Zvcm1hdF9kZXNjIHsKLQl1OCBkZXNjcmlwdG9yX3R5cGU7Ci0JdTggZG1hX2NoYW5uZWxfbWFzazsKK3N0cnVjdCBhbWxfcmVzb3VyY2VfZG1hIHsKKwlBTUxfUkVTT1VSQ0VfU01BTExfSEVBREVSX0NPTU1PTiB1OCBkbWFfY2hhbm5lbF9tYXNrOwogCXU4IGZsYWdzOwogfTsKIAotc3RydWN0IGFzbF9zdGFydF9kZXBlbmRlbnRfZGVzYyB7Ci0JdTggZGVzY3JpcHRvcl90eXBlOwotCXU4IGZsYWdzOworc3RydWN0IGFtbF9yZXNvdXJjZV9zdGFydF9kZXBlbmRlbnQgeworCUFNTF9SRVNPVVJDRV9TTUFMTF9IRUFERVJfQ09NTU9OIHU4IGZsYWdzOwogfTsKIAotc3RydWN0IGFzbF9zdGFydF9kZXBlbmRlbnRfbm9wcmlvX2Rlc2MgewotCXU4IGRlc2NyaXB0b3JfdHlwZTsKLX07CitzdHJ1Y3QgYW1sX3Jlc291cmNlX3N0YXJ0X2RlcGVuZGVudF9ub3ByaW8geworQU1MX1JFU09VUkNFX1NNQUxMX0hFQURFUl9DT01NT059OwogCi1zdHJ1Y3QgYXNsX2VuZF9kZXBlbmRlbnRfZGVzYyB7Ci0JdTggZGVzY3JpcHRvcl90eXBlOwotfTsKK3N0cnVjdCBhbWxfcmVzb3VyY2VfZW5kX2RlcGVuZGVudCB7CitBTUxfUkVTT1VSQ0VfU01BTExfSEVBREVSX0NPTU1PTn07CiAKLXN0cnVjdCBhc2xfaW9fcG9ydF9kZXNjIHsKLQl1OCBkZXNjcmlwdG9yX3R5cGU7Ci0JdTggaW5mb3JtYXRpb247Ci0JdTE2IGFkZHJlc3NfbWluOwotCXUxNiBhZGRyZXNzX21heDsKK3N0cnVjdCBhbWxfcmVzb3VyY2VfaW8geworCUFNTF9SRVNPVVJDRV9TTUFMTF9IRUFERVJfQ09NTU9OIHU4IGZsYWdzOworCXUxNiBtaW5pbXVtOworCXUxNiBtYXhpbXVtOwogCXU4IGFsaWdubWVudDsKLQl1OCBsZW5ndGg7CisJdTggYWRkcmVzc19sZW5ndGg7CiB9OwogCi1zdHJ1Y3QgYXNsX2ZpeGVkX2lvX3BvcnRfZGVzYyB7Ci0JdTggZGVzY3JpcHRvcl90eXBlOwotCXUxNiBiYXNlX2FkZHJlc3M7Ci0JdTggbGVuZ3RoOworc3RydWN0IGFtbF9yZXNvdXJjZV9maXhlZF9pbyB7CisJQU1MX1JFU09VUkNFX1NNQUxMX0hFQURFUl9DT01NT04gdTE2IGFkZHJlc3M7CisJdTggYWRkcmVzc19sZW5ndGg7CiB9OwogCi1zdHJ1Y3QgYXNsX3NtYWxsX3ZlbmRvcl9kZXNjIHsKLQl1OCBkZXNjcmlwdG9yX3R5cGU7Ci0JdTggdmVuZG9yX2RlZmluZWRbN107CitzdHJ1Y3QgYW1sX3Jlc291cmNlX3ZlbmRvcl9zbWFsbCB7CitBTUxfUkVTT1VSQ0VfU01BTExfSEVBREVSX0NPTU1PTn07CisKK3N0cnVjdCBhbWxfcmVzb3VyY2VfZW5kX3RhZyB7CisJQU1MX1JFU09VUkNFX1NNQUxMX0hFQURFUl9DT01NT04gdTggY2hlY2tzdW07CiB9OwogCi1zdHJ1Y3QgYXNsX2VuZF90YWdfZGVzYyB7Ci0JdTggZGVzY3JpcHRvcl90eXBlOwotCXU4IGNoZWNrc3VtOwotfTsKKy8qCisgKiBMQVJHRSBkZXNjcmlwdG9ycworICovCisjZGVmaW5lIEFNTF9SRVNPVVJDRV9MQVJHRV9IRUFERVJfQ09NTU9OIFwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3R5cGU7XAorCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX2xlbmd0aDsKIAotLyogTEFSR0UgZGVzY3JpcHRvcnMgKi8KK3N0cnVjdCBhbWxfcmVzb3VyY2VfbGFyZ2VfaGVhZGVyIHsKK0FNTF9SRVNPVVJDRV9MQVJHRV9IRUFERVJfQ09NTU9OfTsKIAotc3RydWN0IGFzbF9tZW1vcnlfMjRfZGVzYyB7Ci0JdTggZGVzY3JpcHRvcl90eXBlOwotCXUxNiBsZW5ndGg7Ci0JdTggaW5mb3JtYXRpb247Ci0JdTE2IGFkZHJlc3NfbWluOwotCXUxNiBhZGRyZXNzX21heDsKK3N0cnVjdCBhbWxfcmVzb3VyY2VfbWVtb3J5MjQgeworCUFNTF9SRVNPVVJDRV9MQVJHRV9IRUFERVJfQ09NTU9OIHU4IGZsYWdzOworCXUxNiBtaW5pbXVtOworCXUxNiBtYXhpbXVtOwogCXUxNiBhbGlnbm1lbnQ7Ci0JdTE2IHJhbmdlX2xlbmd0aDsKKwl1MTYgYWRkcmVzc19sZW5ndGg7CiB9OwogCi1zdHJ1Y3QgYXNsX2xhcmdlX3ZlbmRvcl9kZXNjIHsKLQl1OCBkZXNjcmlwdG9yX3R5cGU7Ci0JdTE2IGxlbmd0aDsKLQl1OCB2ZW5kb3JfZGVmaW5lZFsxXTsKLX07CitzdHJ1Y3QgYW1sX3Jlc291cmNlX3ZlbmRvcl9sYXJnZSB7CitBTUxfUkVTT1VSQ0VfTEFSR0VfSEVBREVSX0NPTU1PTn07CiAKLXN0cnVjdCBhc2xfbWVtb3J5XzMyX2Rlc2MgewotCXU4IGRlc2NyaXB0b3JfdHlwZTsKLQl1MTYgbGVuZ3RoOwotCXU4IGluZm9ybWF0aW9uOwotCXUzMiBhZGRyZXNzX21pbjsKLQl1MzIgYWRkcmVzc19tYXg7CitzdHJ1Y3QgYW1sX3Jlc291cmNlX21lbW9yeTMyIHsKKwlBTUxfUkVTT1VSQ0VfTEFSR0VfSEVBREVSX0NPTU1PTiB1OCBmbGFnczsKKwl1MzIgbWluaW11bTsKKwl1MzIgbWF4aW11bTsKIAl1MzIgYWxpZ25tZW50OwotCXUzMiByYW5nZV9sZW5ndGg7CisJdTMyIGFkZHJlc3NfbGVuZ3RoOwogfTsKIAotc3RydWN0IGFzbF9maXhlZF9tZW1vcnlfMzJfZGVzYyB7Ci0JdTggZGVzY3JpcHRvcl90eXBlOwotCXUxNiBsZW5ndGg7Ci0JdTggaW5mb3JtYXRpb247Ci0JdTMyIGJhc2VfYWRkcmVzczsKLQl1MzIgcmFuZ2VfbGVuZ3RoOworc3RydWN0IGFtbF9yZXNvdXJjZV9maXhlZF9tZW1vcnkzMiB7CisJQU1MX1JFU09VUkNFX0xBUkdFX0hFQURFUl9DT01NT04gdTggZmxhZ3M7CisJdTMyIGFkZHJlc3M7CisJdTMyIGFkZHJlc3NfbGVuZ3RoOwogfTsKIAotc3RydWN0IGFzbF9leHRlbmRlZF9hZGRyZXNzX2Rlc2MgewotCXU4IGRlc2NyaXB0b3JfdHlwZTsKLQl1MTYgbGVuZ3RoOwotCXU4IHJlc291cmNlX3R5cGU7Ci0JdTggZmxhZ3M7Ci0JdTggc3BlY2lmaWNfZmxhZ3M7Ci0JdTggcmV2aXNpb25faUQ7CisjZGVmaW5lIEFNTF9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTiBcCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VfdHlwZTsgXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOyBcCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWNfZmxhZ3M7CisKK3N0cnVjdCBhbWxfcmVzb3VyY2VfYWRkcmVzcyB7CitBTUxfUkVTT1VSQ0VfTEFSR0VfSEVBREVSX0NPTU1PTiBBTUxfUkVTT1VSQ0VfQUREUkVTU19DT01NT059OworCitzdHJ1Y3QgYW1sX3Jlc291cmNlX2V4dGVuZGVkX2FkZHJlc3M2NCB7CisJQU1MX1JFU09VUkNFX0xBUkdFX0hFQURFUl9DT01NT04KKwkgICAgQU1MX1JFU09VUkNFX0FERFJFU1NfQ09NTU9OIHU4IHJldmlzaW9uX2lEOwogCXU4IHJlc2VydmVkOwogCXU2NCBncmFudWxhcml0eTsKLQl1NjQgYWRkcmVzc19taW47Ci0JdTY0IGFkZHJlc3NfbWF4OworCXU2NCBtaW5pbXVtOworCXU2NCBtYXhpbXVtOwogCXU2NCB0cmFuc2xhdGlvbl9vZmZzZXQ7CiAJdTY0IGFkZHJlc3NfbGVuZ3RoOwotCXU2NCB0eXBlX3NwZWNpZmljX2F0dHJpYnV0ZXM7Ci0JdTggb3B0aW9uYWxfZmllbGRzWzJdOwkvKiBVc2VkIGZvciBsZW5ndGggY2FsY3VsYXRpb24gb25seSAqLworCXU2NCB0eXBlX3NwZWNpZmljOwogfTsKIAotI2RlZmluZSBBU0xfRVhURU5ERURfQUREUkVTU19ERVNDX1JFVklTSU9OICAgICAgICAgIDEJLyogQUNQSSAzLjAgKi8KKyNkZWZpbmUgQU1MX1JFU09VUkNFX0VYVEVOREVEX0FERFJFU1NfUkVWSVNJT04gICAgICAgICAgMQkvKiBBQ1BJIDMuMCAqLwogCi1zdHJ1Y3QgYXNsX3F3b3JkX2FkZHJlc3NfZGVzYyB7Ci0JdTggZGVzY3JpcHRvcl90eXBlOwotCXUxNiBsZW5ndGg7Ci0JdTggcmVzb3VyY2VfdHlwZTsKLQl1OCBmbGFnczsKLQl1OCBzcGVjaWZpY19mbGFnczsKLQl1NjQgZ3JhbnVsYXJpdHk7Ci0JdTY0IGFkZHJlc3NfbWluOwotCXU2NCBhZGRyZXNzX21heDsKK3N0cnVjdCBhbWxfcmVzb3VyY2VfYWRkcmVzczY0IHsKKwlBTUxfUkVTT1VSQ0VfTEFSR0VfSEVBREVSX0NPTU1PTgorCSAgICBBTUxfUkVTT1VSQ0VfQUREUkVTU19DT01NT04gdTY0IGdyYW51bGFyaXR5OworCXU2NCBtaW5pbXVtOworCXU2NCBtYXhpbXVtOwogCXU2NCB0cmFuc2xhdGlvbl9vZmZzZXQ7CiAJdTY0IGFkZHJlc3NfbGVuZ3RoOwotCXU4IG9wdGlvbmFsX2ZpZWxkc1syXTsKIH07CiAKLXN0cnVjdCBhc2xfZHdvcmRfYWRkcmVzc19kZXNjIHsKLQl1OCBkZXNjcmlwdG9yX3R5cGU7Ci0JdTE2IGxlbmd0aDsKLQl1OCByZXNvdXJjZV90eXBlOwotCXU4IGZsYWdzOwotCXU4IHNwZWNpZmljX2ZsYWdzOwotCXUzMiBncmFudWxhcml0eTsKLQl1MzIgYWRkcmVzc19taW47Ci0JdTMyIGFkZHJlc3NfbWF4Oworc3RydWN0IGFtbF9yZXNvdXJjZV9hZGRyZXNzMzIgeworCUFNTF9SRVNPVVJDRV9MQVJHRV9IRUFERVJfQ09NTU9OCisJICAgIEFNTF9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTiB1MzIgZ3JhbnVsYXJpdHk7CisJdTMyIG1pbmltdW07CisJdTMyIG1heGltdW07CiAJdTMyIHRyYW5zbGF0aW9uX29mZnNldDsKIAl1MzIgYWRkcmVzc19sZW5ndGg7Ci0JdTggb3B0aW9uYWxfZmllbGRzWzJdOwogfTsKIAotc3RydWN0IGFzbF93b3JkX2FkZHJlc3NfZGVzYyB7Ci0JdTggZGVzY3JpcHRvcl90eXBlOwotCXUxNiBsZW5ndGg7Ci0JdTggcmVzb3VyY2VfdHlwZTsKLQl1OCBmbGFnczsKLQl1OCBzcGVjaWZpY19mbGFnczsKLQl1MTYgZ3JhbnVsYXJpdHk7Ci0JdTE2IGFkZHJlc3NfbWluOwotCXUxNiBhZGRyZXNzX21heDsKK3N0cnVjdCBhbWxfcmVzb3VyY2VfYWRkcmVzczE2IHsKKwlBTUxfUkVTT1VSQ0VfTEFSR0VfSEVBREVSX0NPTU1PTgorCSAgICBBTUxfUkVTT1VSQ0VfQUREUkVTU19DT01NT04gdTE2IGdyYW51bGFyaXR5OworCXUxNiBtaW5pbXVtOworCXUxNiBtYXhpbXVtOwogCXUxNiB0cmFuc2xhdGlvbl9vZmZzZXQ7CiAJdTE2IGFkZHJlc3NfbGVuZ3RoOwotCXU4IG9wdGlvbmFsX2ZpZWxkc1syXTsKIH07CiAKLXN0cnVjdCBhc2xfZXh0ZW5kZWRfeHJ1cHRfZGVzYyB7Ci0JdTggZGVzY3JpcHRvcl90eXBlOwotCXUxNiBsZW5ndGg7Ci0JdTggZmxhZ3M7Ci0JdTggdGFibGVfbGVuZ3RoOwotCXUzMiBpbnRlcnJ1cHRfbnVtYmVyWzFdOworc3RydWN0IGFtbF9yZXNvdXJjZV9leHRlbmRlZF9pcnEgeworCUFNTF9SRVNPVVJDRV9MQVJHRV9IRUFERVJfQ09NTU9OIHU4IGZsYWdzOworCXU4IGludGVycnVwdF9jb3VudDsKKwl1MzIgaW50ZXJydXB0c1sxXTsKIAkvKiByZXNfc291cmNlX2luZGV4LCByZXNfc291cmNlIG9wdGlvbmFsIGZpZWxkcyBmb2xsb3cgKi8KIH07CiAKLXN0cnVjdCBhc2xfZ2VuZXJhbF9yZWdpc3Rlcl9kZXNjIHsKLQl1OCBkZXNjcmlwdG9yX3R5cGU7Ci0JdTE2IGxlbmd0aDsKLQl1OCBhZGRyZXNzX3NwYWNlX2lkOworc3RydWN0IGFtbF9yZXNvdXJjZV9nZW5lcmljX3JlZ2lzdGVyIHsKKwlBTUxfUkVTT1VSQ0VfTEFSR0VfSEVBREVSX0NPTU1PTiB1OCBhZGRyZXNzX3NwYWNlX2lkOwogCXU4IGJpdF93aWR0aDsKIAl1OCBiaXRfb2Zmc2V0OwotCXU4IGFjY2Vzc19zaXplOwkJLyogQUNQSSAzLjAsIHdhcyBSZXNlcnZlZCAqLworCXU4IGFjY2Vzc19zaXplOwkJLyogQUNQSSAzLjAsIHdhcyBwcmV2aW91c2x5IFJlc2VydmVkICovCiAJdTY0IGFkZHJlc3M7CiB9OwogCkBAIC0yNzcsMjYgKzI2MywzOSBAQAogCiAvKiBVbmlvbiBvZiBhbGwgcmVzb3VyY2UgZGVzY3JpcHRvcnMsIHNvIHdlIGNhbiBhbGxvY2F0ZSB0aGUgd29yc3QgY2FzZSAqLwogCi11bmlvbiBhc2xfcmVzb3VyY2VfZGVzYyB7Ci0Jc3RydWN0IGFzbF9pcnFfZm9ybWF0X2Rlc2MgaXJxOwotCXN0cnVjdCBhc2xfZG1hX2Zvcm1hdF9kZXNjIGRtYTsKLQlzdHJ1Y3QgYXNsX3N0YXJ0X2RlcGVuZGVudF9kZXNjIHN0ZDsKLQlzdHJ1Y3QgYXNsX2VuZF9kZXBlbmRlbnRfZGVzYyBlbmQ7Ci0Jc3RydWN0IGFzbF9pb19wb3J0X2Rlc2MgaW9wOwotCXN0cnVjdCBhc2xfZml4ZWRfaW9fcG9ydF9kZXNjIGZpbzsKLQlzdHJ1Y3QgYXNsX3NtYWxsX3ZlbmRvcl9kZXNjIHNtdjsKLQlzdHJ1Y3QgYXNsX2VuZF90YWdfZGVzYyBldDsKK3VuaW9uIGFtbF9yZXNvdXJjZSB7CisJLyogRGVzY3JpcHRvciBoZWFkZXJzICovCiAKLQlzdHJ1Y3QgYXNsX21lbW9yeV8yNF9kZXNjIE0yNDsKLQlzdHJ1Y3QgYXNsX2xhcmdlX3ZlbmRvcl9kZXNjIGxndjsKLQlzdHJ1Y3QgYXNsX21lbW9yeV8zMl9kZXNjIE0zMjsKLQlzdHJ1Y3QgYXNsX2ZpeGVkX21lbW9yeV8zMl9kZXNjIEYzMjsKLQlzdHJ1Y3QgYXNsX3F3b3JkX2FkZHJlc3NfZGVzYyBxYXM7Ci0Jc3RydWN0IGFzbF9kd29yZF9hZGRyZXNzX2Rlc2MgZGFzOwotCXN0cnVjdCBhc2xfd29yZF9hZGRyZXNzX2Rlc2Mgd2FzOwotCXN0cnVjdCBhc2xfZXh0ZW5kZWRfYWRkcmVzc19kZXNjIGVhczsKLQlzdHJ1Y3QgYXNsX2V4dGVuZGVkX3hydXB0X2Rlc2MgZXh4OwotCXN0cnVjdCBhc2xfZ2VuZXJhbF9yZWdpc3Rlcl9kZXNjIGdyZzsKKwlzdHJ1Y3QgYW1sX3Jlc291cmNlX3NtYWxsX2hlYWRlciBzbWFsbF9oZWFkZXI7CisJc3RydWN0IGFtbF9yZXNvdXJjZV9sYXJnZV9oZWFkZXIgbGFyZ2VfaGVhZGVyOworCisJLyogU21hbGwgcmVzb3VyY2UgZGVzY3JpcHRvcnMgKi8KKworCXN0cnVjdCBhbWxfcmVzb3VyY2VfaXJxIGlycTsKKwlzdHJ1Y3QgYW1sX3Jlc291cmNlX2RtYSBkbWE7CisJc3RydWN0IGFtbF9yZXNvdXJjZV9zdGFydF9kZXBlbmRlbnQgc3RhcnRfZHBmOworCXN0cnVjdCBhbWxfcmVzb3VyY2VfZW5kX2RlcGVuZGVudCBlbmRfZHBmOworCXN0cnVjdCBhbWxfcmVzb3VyY2VfaW8gaW87CisJc3RydWN0IGFtbF9yZXNvdXJjZV9maXhlZF9pbyBmaXhlZF9pbzsKKwlzdHJ1Y3QgYW1sX3Jlc291cmNlX3ZlbmRvcl9zbWFsbCB2ZW5kb3Jfc21hbGw7CisJc3RydWN0IGFtbF9yZXNvdXJjZV9lbmRfdGFnIGVuZF90YWc7CisKKwkvKiBMYXJnZSByZXNvdXJjZSBkZXNjcmlwdG9ycyAqLworCisJc3RydWN0IGFtbF9yZXNvdXJjZV9tZW1vcnkyNCBtZW1vcnkyNDsKKwlzdHJ1Y3QgYW1sX3Jlc291cmNlX2dlbmVyaWNfcmVnaXN0ZXIgZ2VuZXJpY19yZWc7CisJc3RydWN0IGFtbF9yZXNvdXJjZV92ZW5kb3JfbGFyZ2UgdmVuZG9yX2xhcmdlOworCXN0cnVjdCBhbWxfcmVzb3VyY2VfbWVtb3J5MzIgbWVtb3J5MzI7CisJc3RydWN0IGFtbF9yZXNvdXJjZV9maXhlZF9tZW1vcnkzMiBmaXhlZF9tZW1vcnkzMjsKKwlzdHJ1Y3QgYW1sX3Jlc291cmNlX2FkZHJlc3MxNiBhZGRyZXNzMTY7CisJc3RydWN0IGFtbF9yZXNvdXJjZV9hZGRyZXNzMzIgYWRkcmVzczMyOworCXN0cnVjdCBhbWxfcmVzb3VyY2VfYWRkcmVzczY0IGFkZHJlc3M2NDsKKwlzdHJ1Y3QgYW1sX3Jlc291cmNlX2V4dGVuZGVkX2FkZHJlc3M2NCBleHRfYWRkcmVzczY0OworCXN0cnVjdCBhbWxfcmVzb3VyY2VfZXh0ZW5kZWRfaXJxIGV4dGVuZGVkX2lycTsKKworCS8qIFV0aWxpdHkgb3ZlcmxheXMgKi8KKworCXN0cnVjdCBhbWxfcmVzb3VyY2VfYWRkcmVzcyBhZGRyZXNzOwogCXUzMiB1MzJfaXRlbTsKIAl1MTYgdTE2X2l0ZW07CiAJdTggVThpdGVtOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BkY19pbnRlbC5oIGIvaW5jbHVkZS9hY3BpL3BkY19pbnRlbC5oCmluZGV4IDkxZjRhMTIuLjNmYTgxZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wZGNfaW50ZWwuaAorKysgYi9pbmNsdWRlL2FjcGkvcGRjX2ludGVsLmgKQEAgLTE1LDkgKzE1LDcgQEAKICNkZWZpbmUgQUNQSV9QRENfQ19DMV9GRkgJCSgweDAxMDApCiAKICNkZWZpbmUgQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfU01QCShBQ1BJX1BEQ19TTVBfQzFQVCB8IFwKLQkJCQkJIEFDUElfUERDX0NfQzFfSEFMVCkKLQotI2RlZmluZSBBQ1BJX1BEQ19FU1RfQ0FQQUJJTElUWV9TTVBfTVNSCShBQ1BJX1BEQ19FU1RfQ0FQQUJJTElUWV9TTVAgfCBcCisJCQkJCSBBQ1BJX1BEQ19DX0MxX0hBTFQgfCBcCiAJCQkJCSBBQ1BJX1BEQ19QX0ZGSCkKIAogI2RlZmluZSBBQ1BJX1BEQ19DX0NBUEFCSUxJVFlfU01QCShBQ1BJX1BEQ19TTVBfQzJDMyB8IFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2Vudi5oIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZW52LmgKaW5kZXggMTY2MDljMS4uMzFiMGYxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZW52LmgKKysrIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZW52LmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC02OCw2ICs2OCw3IEBACiAjZGVmaW5lIEFDUElfQVBQTElDQVRJT04KICNkZWZpbmUgQUNQSV9ERUJVR0dFUgogI2RlZmluZSBBQ1BJX0RJU0FTU0VNQkxFUgorI2RlZmluZSBBQ1BJX01VVEVYX0RFQlVHCiAjZW5kaWYKIAogI2lmZGVmIEFDUElfQVNMX0NPTVBJTEVSCkBAIC0yMDUsNiArMjA2LDggQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNkZWZpbmUgQUNQSV9JU19BU0NJSShjKSAgKChjKSA8IDB4ODApCisKICNpZmRlZiBBQ1BJX1VTRV9TWVNURU1fQ0xJQlJBUlkKIC8qCiAgKiBVc2UgdGhlIHN0YW5kYXJkIEMgbGlicmFyeSBoZWFkZXJzLgpAQCAtMjM0LDcgKzIzNyw3IEBACiAjZGVmaW5lIEFDUElfU1RSQ0FUKGQscykgICAgICAgICh2b2lkKSBzdHJjYXQoKGQpLCAocykpCiAjZGVmaW5lIEFDUElfU1RSTkNBVChkLHMsbikgICAgIHN0cm5jYXQoKGQpLCAocyksIChhY3BpX3NpemUpKG4pKQogI2RlZmluZSBBQ1BJX1NUUlRPVUwoZCxzLG4pICAgICBzdHJ0b3VsKChkKSwgKHMpLCAoYWNwaV9zaXplKShuKSkKLSNkZWZpbmUgQUNQSV9NRU1DTVAoczEsczIsbikgICAgbWVtY21wKChzMSksIChzMiksIChhY3BpX3NpemUpKG4pKQorI2RlZmluZSBBQ1BJX01FTUNNUChzMSxzMixuKSAgICBtZW1jbXAoKGNvbnN0IGNoYXIgKikoczEpLCAoY29uc3QgY2hhciAqKShzMiksIChhY3BpX3NpemUpKG4pKQogI2RlZmluZSBBQ1BJX01FTUNQWShkLHMsbikgICAgICAodm9pZCkgbWVtY3B5KChkKSwgKHMpLCAoYWNwaV9zaXplKShuKSkKICNkZWZpbmUgQUNQSV9NRU1TRVQoZCxzLG4pICAgICAgKHZvaWQpIG1lbXNldCgoZCksIChzKSwgKGFjcGlfc2l6ZSkobikpCiAKQEAgLTI0Niw3ICsyNDksNiBAQAogI2RlZmluZSBBQ1BJX0lTX1VQUEVSKGkpICAgICAgICBpc3VwcGVyKChpbnQpIChpKSkKICNkZWZpbmUgQUNQSV9JU19QUklOVChpKSAgICAgICAgaXNwcmludCgoaW50KSAoaSkpCiAjZGVmaW5lIEFDUElfSVNfQUxQSEEoaSkgICAgICAgIGlzYWxwaGEoKGludCkgKGkpKQotI2RlZmluZSBBQ1BJX0lTX0FTQ0lJKGkpICAgICAgICBpc2FzY2lpKChpbnQpIChpKSkKIAogI2Vsc2UKIApAQCAtMjczLDggKzI3NSw4IEBACiAvKgogICogU3RvcmFnZSBhbGlnbm1lbnQgcHJvcGVydGllcwogICovCi0jZGVmaW5lICBfQVVQQk5EICAgICAgICAgICAgICAgIChzaXplb2YgKGFjcGlfbmF0aXZlX2ludCkgLSAxKQotI2RlZmluZSAgX0FETkJORCAgICAgICAgICAgICAgICAoc2l6ZW9mIChhY3BpX25hdGl2ZV9pbnQpIC0gMSkKKyNkZWZpbmUgIF9BVVBCTkQgICAgICAgICAgICAgICAgKHNpemVvZiAoYWNwaV9uYXRpdmVfdWludCkgLSAxKQorI2RlZmluZSAgX0FETkJORCAgICAgICAgICAgICAgICAoc2l6ZW9mIChhY3BpX25hdGl2ZV91aW50KSAtIDEpCiAKIC8qCiAgKiBWYXJpYWJsZSBhcmd1bWVudCBsaXN0IG1hY3JvIGRlZmluaXRpb25zCkBAIC0yOTYsNyArMjk4LDcgQEAKICNkZWZpbmUgQUNQSV9TVFJDQVQoZCxzKSAgICAgICAgKHZvaWQpIGFjcGlfdXRfc3RyY2F0ICgoZCksIChzKSkKICNkZWZpbmUgQUNQSV9TVFJOQ0FUKGQscyxuKSAgICAgYWNwaV91dF9zdHJuY2F0ICgoZCksIChzKSwgKGFjcGlfc2l6ZSkobikpCiAjZGVmaW5lIEFDUElfU1RSVE9VTChkLHMsbikgICAgIGFjcGlfdXRfc3RydG91bCAoKGQpLCAocyksIChhY3BpX3NpemUpKG4pKQotI2RlZmluZSBBQ1BJX01FTUNNUChzMSxzMixuKSAgICBhY3BpX3V0X21lbWNtcCgoczEpLCAoczIpLCAoYWNwaV9zaXplKShuKSkKKyNkZWZpbmUgQUNQSV9NRU1DTVAoczEsczIsbikgICAgYWNwaV91dF9tZW1jbXAoKGNvbnN0IGNoYXIgKikoczEpLCAoY29uc3QgY2hhciAqKShzMiksIChhY3BpX3NpemUpKG4pKQogI2RlZmluZSBBQ1BJX01FTUNQWShkLHMsbikgICAgICAodm9pZCkgYWNwaV91dF9tZW1jcHkgKChkKSwgKHMpLCAoYWNwaV9zaXplKShuKSkKICNkZWZpbmUgQUNQSV9NRU1TRVQoZCx2LG4pICAgICAgKHZvaWQpIGFjcGlfdXRfbWVtc2V0ICgoZCksICh2KSwgKGFjcGlfc2l6ZSkobikpCiAjZGVmaW5lIEFDUElfVE9VUFBFUiAgICAgICAgICAgIGFjcGlfdXRfdG9fdXBwZXIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2djYy5oIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZ2NjLmgKaW5kZXggNGMwZTBiYS4uZWEyYTYzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZ2NjLmgKKysrIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZ2NjLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eC5oIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaAppbmRleCBjOTNlNjU2Li5jMjFjMjdmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eC5oCisrKyBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4LmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA1LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC03MSw2ICs3MSwxMCBAQAogI2RlZmluZSBhY3BpX2NhY2hlX3QJa21lbV9jYWNoZV90CiAjZW5kaWYKIAorLyogRnVsbCBuYW1lc3BhY2UgcGF0aG5hbWUgbGVuZ3RoIGxpbWl0IC0gYXJiaXRyYXJ5ICovCisKKyNkZWZpbmUgQUNQSV9QQVRITkFNRV9NQVggICAgICAgICAgICAgIDI1NgorCiAjZWxzZQkJCQkvKiAhX19LRVJORUxfXyAqLwogCiAjaW5jbHVkZSA8c3RkYXJnLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKaW5kZXggN2EwMGQ1MC4uYmFkZjAyNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaApAQCAtNjIsOSArNjIsNiBAQAogCXUzMiBibV9hY3Rpdml0eTsKIAlpbnQgY291bnQ7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4IHN0YXRlc1tBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVJdOwotCi0JLyogdGhlIF9QREMgb2JqZWN0cyBwYXNzZWQgYnkgdGhlIGRyaXZlciwgaWYgYW55ICovCi0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKnBkYzsKIH07CiAKIC8qIFBlcmZvcm1hbmNlIE1hbmFnZW1lbnQgKi8KQEAgLTk2LDggKzkzLDYgQEAKIAl1bnNpZ25lZCBpbnQgc3RhdGVfY291bnQ7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3B4ICpzdGF0ZXM7CiAKLQkvKiB0aGUgX1BEQyBvYmplY3RzIHBhc3NlZCBieSB0aGUgZHJpdmVyLCBpZiBhbnkgKi8KLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqcGRjOwogfTsKIAogLyogVGhyb3R0bGluZyBDb250cm9sICovCkBAIC0xNTEsNiArMTQ2LDkgQEAKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UgKnBlcmZvcm1hbmNlOwogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nIHRocm90dGxpbmc7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2xpbWl0IGxpbWl0OworCisJLyogdGhlIF9QREMgb2JqZWN0cyBmb3IgdGhpcyBwcm9jZXNzb3IsIGlmIGFueSAqLworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpwZGM7CiB9OwogCiBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfZXJyYXRhIHsKQEAgLTE3OCwyMiArMTc2LDEyIEBACiBleHRlcm4gc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcm9jZXNzb3JzW05SX0NQVVNdOwogZXh0ZXJuIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9lcnJhdGEgZXJyYXRhOwogCi1pbnQgYWNwaV9wcm9jZXNzb3Jfc2V0X3BkYyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAotCQkJICAgc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKnBkY19pbik7Cit2b2lkIGFyY2hfYWNwaV9wcm9jZXNzb3JfaW5pdF9wZGMoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcik7CiAKLSNpZmRlZiBBUkNIX0hBU19QT1dFUl9QRENfSU5JVAotdm9pZCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X3BkYyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcG93ZXIgKnBvdywKLQkJCQkgICB1bnNpZ25lZCBpbnQgY3B1KTsKKyNpZmRlZiBBUkNIX0hBU19QT1dFUl9JTklUCiB2b2lkIGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfYm1fY2hlY2soc3RydWN0IGFjcGlfcHJvY2Vzc29yX2ZsYWdzICpmbGFncywKIAkJCQkJdW5zaWduZWQgaW50IGNwdSk7CiAjZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfcGRjKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcgotCQkJCQkJICpwb3csIHVuc2lnbmVkIGludCBjcHUpCi17Ci0JcG93LT5wZGMgPSBOVUxMOwotCXJldHVybjsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfYm1fY2hlY2soc3RydWN0CiAJCQkJCQkgICAgICBhY3BpX3Byb2Nlc3Nvcl9mbGFncwogCQkJCQkJICAgICAgKmZsYWdzLCB1bnNpZ25lZCBpbnQgY3B1KQpAQCAtMjM1LDkgKzIyMyw2IEBACiAvKiBpbiBwcm9jZXNzb3JfdGhyb3R0bGluZy5jICovCiBpbnQgYWNwaV9wcm9jZXNzb3JfZ2V0X3Rocm90dGxpbmdfaW5mbyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKTsKIGludCBhY3BpX3Byb2Nlc3Nvcl9zZXRfdGhyb3R0bGluZyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLCBpbnQgc3RhdGUpOwotc3NpemVfdCBhY3BpX3Byb2Nlc3Nvcl93cml0ZV90aHJvdHRsaW5nKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQljb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBkYXRhKTsKIGV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfcHJvY2Vzc29yX3Rocm90dGxpbmdfZm9wczsKIAogLyogaW4gcHJvY2Vzc29yX2lkbGUuYyAqLwpAQCAtMjQ5LDkgKzIzNCw2IEBACiAKIC8qIGluIHByb2Nlc3Nvcl90aGVybWFsLmMgKi8KIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfbGltaXRfaW5mbyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKTsKLXNzaXplX3QgYWNwaV9wcm9jZXNzb3Jfd3JpdGVfbGltaXQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCi0JCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBkYXRhKTsKIGV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfcHJvY2Vzc29yX2xpbWl0X2ZvcHM7CiAKICNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL2F0b21pYy5oIGIvaW5jbHVkZS9hc20tYWxwaGEvYXRvbWljLmgKaW5kZXggY2IwM2JiZS4uZmM3N2Y3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvYXRvbWljLmgKQEAgLTE3Niw2ICsxNzYsNyBAQAogfQogCiAjZGVmaW5lIGF0b21pY19jbXB4Y2hnKHYsIG8sIG4pICgoaW50KWNtcHhjaGcoJigodiktPmNvdW50ZXIpLCAobyksIChuKSkpCisjZGVmaW5lIGF0b21pY194Y2hnKHYsIG5ldykgKHhjaGcoJigodiktPmNvdW50ZXIpLCBuZXcpKQogCiAjZGVmaW5lIGF0b21pY19hZGRfdW5sZXNzKHYsIGEsIHUpCQkJCVwKICh7CQkJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9jYWNoZS5oIGIvaW5jbHVkZS9hc20tYWxwaGEvY2FjaGUuaAppbmRleCBlNjliMjk1Li5lNmQ0ZDE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9jYWNoZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL2NhY2hlLmgKQEAgLTIwLDYgKzIwLDUgQEAKIAogI2RlZmluZSBMMV9DQUNIRV9BTElHTih4KSAgKCgoeCkrKEwxX0NBQ0hFX0JZVEVTLTEpKSZ+KEwxX0NBQ0hFX0JZVEVTLTEpKQogI2RlZmluZSBTTVBfQ0FDSEVfQllURVMgICAgTDFfQ0FDSEVfQllURVMKLSNkZWZpbmUgTDFfQ0FDSEVfU0hJRlRfTUFYIEwxX0NBQ0hFX1NISUZUCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvY29tcGlsZXIuaCBiL2luY2x1ZGUvYXNtLWFscGhhL2NvbXBpbGVyLmgKaW5kZXggMGE0YThiNC4uMDBjNmY1N2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL2NvbXBpbGVyLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvY29tcGlsZXIuaApAQCAtOTgsOSArOTgsNyBAQAogI3VuZGVmIGlubGluZQogI3VuZGVmIF9faW5saW5lX18KICN1bmRlZiBfX2lubGluZQotI2lmIF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gMSB8fCBfX0dOVUNfXyA+IDMKICN1bmRlZiBfX2Fsd2F5c19pbmxpbmUKICNkZWZpbmUgX19hbHdheXNfaW5saW5lCQlpbmxpbmUgX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpCi0jZW5kaWYKIAogI2VuZGlmIC8qIF9fQUxQSEFfQ09NUElMRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvZnV0ZXguaCBiL2luY2x1ZGUvYXNtLWFscGhhL2Z1dGV4LmgKaW5kZXggOWZlZmY0Y2UuLjZhMzMyYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL2Z1dGV4LmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvZnV0ZXguaApAQCAtMSw1MyArMSw2IEBACiAjaWZuZGVmIF9BU01fRlVURVhfSAogI2RlZmluZSBfQVNNX0ZVVEVYX0gKIAotI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mdXRleC5oPgogCi0jaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KLSNpbmNsdWRlIDxhc20vZXJybm8uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotCi1zdGF0aWMgaW5saW5lIGludAotZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQotewotCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7Ci0JaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OwotCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOwotCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7Ci0JaW50IG9sZHZhbCA9IDAsIHJldDsKLQlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCi0JCW9wYXJnID0gMSA8PCBvcGFyZzsKLQotCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWluY19wcmVlbXB0X2NvdW50KCk7Ci0KLQlzd2l0Y2ggKG9wKSB7Ci0JY2FzZSBGVVRFWF9PUF9TRVQ6Ci0JY2FzZSBGVVRFWF9PUF9BREQ6Ci0JY2FzZSBGVVRFWF9PUF9PUjoKLQljYXNlIEZVVEVYX09QX0FORE46Ci0JY2FzZSBGVVRFWF9PUF9YT1I6Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVOT1NZUzsKLQl9Ci0KLQlkZWNfcHJlZW1wdF9jb3VudCgpOwotCi0JaWYgKCFyZXQpIHsKLQkJc3dpdGNoIChjbXApIHsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfRVE6IHJldCA9IChvbGR2YWwgPT0gY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX05FOiByZXQgPSAob2xkdmFsICE9IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9MVDogcmV0ID0gKG9sZHZhbCA8IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9HRTogcmV0ID0gKG9sZHZhbCA+PSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfTEU6IHJldCA9IChvbGR2YWwgPD0gY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0dUOiByZXQgPSAob2xkdmFsID4gY21wYXJnKTsgYnJlYWs7Ci0JCWRlZmF1bHQ6IHJldCA9IC1FTk9TWVM7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotI2VuZGlmCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL21tdV9jb250ZXh0LmggYi9pbmNsdWRlL2FzbS1hbHBoYS9tbXVfY29udGV4dC5oCmluZGV4IGE3MTRkMGMuLjZmOTI0ODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL21tdV9jb250ZXh0LmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvbW11X2NvbnRleHQuaApAQCAtMTU2LDcgKzE1Niw3IEBACiAJLyogQWx3YXlzIHVwZGF0ZSB0aGUgUENCIEFTTi4gIEFub3RoZXIgdGhyZWFkIG1heSBoYXZlIGFsbG9jYXRlZAogCSAgIGEgbmV3IG1tLT5jb250ZXh0ICh2aWEgZmx1c2hfdGxiX21tKSB3aXRob3V0IHRoZSBBU04gc2VyaWFsCiAJICAgbnVtYmVyIHdyYXBwaW5nLiAgV2UgaGF2ZSBubyB3YXkgdG8gZGV0ZWN0IHdoZW4gdGhpcyBpcyBuZWVkZWQuICAqLwotCW5leHQtPnRocmVhZF9pbmZvLT5wY2IuYXNuID0gbW1jICYgSEFSRFdBUkVfQVNOX01BU0s7CisJdGFza190aHJlYWRfaW5mbyhuZXh0KS0+cGNiLmFzbiA9IG1tYyAmIEhBUkRXQVJFX0FTTl9NQVNLOwogfQogCiBfX0VYVEVSTl9JTkxJTkUgdm9pZApAQCAtMjM1LDcgKzIzNSw3IEBACiAJCWlmIChjcHVfb25saW5lKGkpKQogCQkJbW0tPmNvbnRleHRbaV0gPSAwOwogCWlmICh0c2sgIT0gY3VycmVudCkKLQkJdHNrLT50aHJlYWRfaW5mby0+cGNiLnB0YnIKKwkJdGFza190aHJlYWRfaW5mbyh0c2spLT5wY2IucHRicgogCQkgID0gKCh1bnNpZ25lZCBsb25nKW1tLT5wZ2QgLSBJREVOVF9BRERSKSA+PiBQQUdFX1NISUZUOwogCXJldHVybiAwOwogfQpAQCAtMjQ5LDcgKzI0OSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIGVudGVyX2xhenlfdGxiKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKLQl0c2stPnRocmVhZF9pbmZvLT5wY2IucHRicgorCXRhc2tfdGhyZWFkX2luZm8odHNrKS0+cGNiLnB0YnIKIAkgID0gKCh1bnNpZ25lZCBsb25nKW1tLT5wZ2QgLSBJREVOVF9BRERSKSA+PiBQQUdFX1NISUZUOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9tdXRleC5oIGIvaW5jbHVkZS9hc20tYWxwaGEvbXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NThjMWY3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvbXV0ZXguaApAQCAtMCwwICsxLDkgQEAKKy8qCisgKiBQdWxsIGluIHRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbXV0ZXggZmFzdHBhdGguCisgKgorICogVE9ETzogaW1wbGVtZW50IG9wdGltaXplZCBwcmltaXRpdmVzIGluc3RlYWQsIG9yIGxlYXZlIHRoZSBnZW5lcmljCisgKiBpbXBsZW1lbnRhdGlvbiBpbiBwbGFjZSwgb3IgcGljayB0aGUgYXRvbWljX3hjaGcoKSBiYXNlZCBnZW5lcmljCisgKiBpbXBsZW1lbnRhdGlvbi4gKHNlZSBhc20tZ2VuZXJpYy9tdXRleC14Y2hnLmggZm9yIGRldGFpbHMpCisgKi8KKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL211dGV4LWRlYy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9wcm9jZXNzb3IuaAppbmRleCAwNTk3ODBhLi40MjViN2I2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9wcm9jZXNzb3IuaApAQCAtNTIsMTkgKzUyLDEwIEBACiAKIHVuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiAKLS8qIFNlZSBhcmNoL2FscGhhL2tlcm5lbC9wdHJhY2UuYyBmb3IgZGV0YWlscy4gICovCi0jZGVmaW5lIFBUX1JFRyhyZWcpIFwKLSAgKFBBR0VfU0laRSoyIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSArIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByZWcpKQotCi0jZGVmaW5lIFNXX1JFRyhyZWcpIFwKLSAoUEFHRV9TSVpFKjIgLSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpIC0gc2l6ZW9mKHN0cnVjdCBzd2l0Y2hfc3RhY2spIFwKLSAgKyBvZmZzZXRvZihzdHJ1Y3Qgc3dpdGNoX3N0YWNrLCByZWcpKQotCi0jZGVmaW5lIEtTVEtfRUlQKHRzaykgXAotICAoKih1bnNpZ25lZCBsb25nICopKFBUX1JFRyhwYykgKyAodW5zaWduZWQgbG9uZykgKCh0c2spLT50aHJlYWRfaW5mbykpKQorI2RlZmluZSBLU1RLX0VJUCh0c2spICh0YXNrX3B0X3JlZ3ModHNrKS0+cGMpCiAKICNkZWZpbmUgS1NUS19FU1AodHNrKSBcCi0gICgodHNrKSA9PSBjdXJyZW50ID8gcmR1c3AoKSA6ICh0c2spLT50aHJlYWRfaW5mby0+cGNiLnVzcCkKKyAgKCh0c2spID09IGN1cnJlbnQgPyByZHVzcCgpIDogdGFza190aHJlYWRfaW5mbyh0c2spLT5wY2IudXNwKQogCiAjZGVmaW5lIGNwdV9yZWxheCgpCWJhcnJpZXIoKQogCkBAIC03Nyw3ICs2OCw2IEBACiAjZGVmaW5lIHNwaW5fbG9ja19wcmVmZXRjaChsb2NrKSAgCWRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCi0jaWYgX19HTlVDX18gPiAzIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDEpCiBleHRlcm4gaW5saW5lIHZvaWQgcHJlZmV0Y2goY29uc3Qgdm9pZCAqcHRyKSAgCiB7IAogCV9fYnVpbHRpbl9wcmVmZXRjaChwdHIsIDAsIDMpOwpAQCAtOTUsMjQgKzg1LDQgQEAKIH0KICNlbmRpZgogCi0jZWxzZQotZXh0ZXJuIGlubGluZSB2b2lkIHByZWZldGNoKGNvbnN0IHZvaWQgKnB0cikgIAoteyAKLQlfX2FzbV9fICgibGRsICQzMSwlMCIgOiA6ICJtIigqKGNoYXIgKilwdHIpKTsgCi19Ci0KLWV4dGVybiBpbmxpbmUgdm9pZCBwcmVmZXRjaHcoY29uc3Qgdm9pZCAqcHRyKSAgCi17Ci0JX19hc21fXyAoImxkcSAkMzEsJTAiIDogOiAibSIoKihjaGFyICopcHRyKSk7IAotfQotCi0jaWZkZWYgQ09ORklHX1NNUAotZXh0ZXJuIGlubGluZSB2b2lkIHNwaW5fbG9ja19wcmVmZXRjaChjb25zdCB2b2lkICpwdHIpICAKLXsKLQlfX2FzbV9fICgibGRxICQzMSwlMCIgOiA6ICJtIigqKGNoYXIgKilwdHIpKTsgCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIEdDQyAzLjEgKi8KLQogI2VuZGlmIC8qIF9fQVNNX0FMUEhBX1BST0NFU1NPUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLWFscGhhL3B0cmFjZS5oCmluZGV4IDA3MjM3NWMuLjk5MzNiOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL3B0cmFjZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL3B0cmFjZS5oCkBAIC03NSwxMCArNzUsMTAgQEAKICNkZWZpbmUgcHJvZmlsZV9wYyhyZWdzKSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpCiBleHRlcm4gdm9pZCBzaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKik7CiAKLSNkZWZpbmUgYWxwaGFfdGFza19yZWdzKHRhc2spIFwKLSAgKChzdHJ1Y3QgcHRfcmVncyAqKSAoKGxvbmcpICh0YXNrKS0+dGhyZWFkX2luZm8gKyAyKlBBR0VfU0laRSkgLSAxKQorI2RlZmluZSB0YXNrX3B0X3JlZ3ModGFzaykgXAorICAoKHN0cnVjdCBwdF9yZWdzICopICh0YXNrX3N0YWNrX3BhZ2UodGFzaykgKyAyKlBBR0VfU0laRSkgLSAxKQogCi0jZGVmaW5lIGZvcmNlX3N1Y2Nlc3NmdWxfc3lzY2FsbF9yZXR1cm4oKSAoYWxwaGFfdGFza19yZWdzKGN1cnJlbnQpLT5yMCA9IDApCisjZGVmaW5lIGZvcmNlX3N1Y2Nlc3NmdWxfc3lzY2FsbF9yZXR1cm4oKSAodGFza19wdF9yZWdzKGN1cnJlbnQpLT5yMCA9IDApCiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLWFscGhhL3N5c3RlbS5oCmluZGV4IDA1MGU4NmQuLmNjOWM3ZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL3N5c3RlbS5oCkBAIC0xMzEsMTUgKzEzMSwyNSBAQAogZXh0ZXJuIHZvaWQgaGFsdCh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOwogI2RlZmluZSBfX2hhbHQoKSBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNhbGxfcGFsICUwICNoYWx0IiA6IDogImkiIChQQUxfaGFsdCkpCiAKLSNkZWZpbmUgc3dpdGNoX3RvKFAsTixMKQkJCQkJCVwKLSAgZG8gewkJCQkJCQkJCVwKLSAgICAoTCkgPSBhbHBoYV9zd2l0Y2hfdG8odmlydF90b19waHlzKCYoTiktPnRocmVhZF9pbmZvLT5wY2IpLCAoUCkpOwlcCi0gICAgY2hlY2tfbW11X2NvbnRleHQoKTsJCQkJCQlcCisjZGVmaW5lIHN3aXRjaF90byhQLE4sTCkJCQkJCQkgXAorICBkbyB7CQkJCQkJCQkJIFwKKyAgICAoTCkgPSBhbHBoYV9zd2l0Y2hfdG8odmlydF90b19waHlzKCZ0YXNrX3RocmVhZF9pbmZvKE4pLT5wY2IpLCAoUCkpOyBcCisgICAgY2hlY2tfbW11X2NvbnRleHQoKTsJCQkJCQkgXAogICB9IHdoaWxlICgwKQogCiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7CiBleHRlcm4gc3RydWN0IHRhc2tfc3RydWN0ICphbHBoYV9zd2l0Y2hfdG8odW5zaWduZWQgbG9uZywgc3RydWN0IHRhc2tfc3RydWN0Kik7CiAKKy8qCisgKiBPbiBTTVAgc3lzdGVtcywgd2hlbiB0aGUgc2NoZWR1bGVyIGRvZXMgbWlncmF0aW9uLWNvc3QgYXV0b2RldGVjdGlvbiwKKyAqIGl0IG5lZWRzIGEgd2F5IHRvIGZsdXNoIGFzIG11Y2ggb2YgdGhlIENQVSdzIGNhY2hlcyBhcyBwb3NzaWJsZS4KKyAqCisgKiBUT0RPOiBmaWxsIHRoaXMgaW4hCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZF9jYWNoZWZsdXNoKHZvaWQpCit7Cit9CisKICNkZWZpbmUgaW1iKCkgXAogX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjYWxsX3BhbCAlMCAjaW1iIiA6IDogImkiIChQQUxfaW1iKSA6ICJtZW1vcnkiKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20tYWxwaGEvdGhyZWFkX2luZm8uaAppbmRleCBkNTE0OTFlLi42OWZmZDkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL3RocmVhZF9pbmZvLmgKQEAgLTU0LDggKzU0LDYgQEAKICNkZWZpbmUgYWxsb2NfdGhyZWFkX2luZm8odHNrKSBcCiAgICgoc3RydWN0IHRocmVhZF9pbmZvICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwxKSkKICNkZWZpbmUgZnJlZV90aHJlYWRfaW5mbyh0aSkgZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgKHRpKSwgMSkKLSNkZWZpbmUgZ2V0X3RocmVhZF9pbmZvKHRpKSBnZXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKLSNkZWZpbmUgcHV0X3RocmVhZF9pbmZvKHRpKSBwdXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKIAogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hYWVjMjAwMC9kbWEuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWFhZWMyMDAwL2RtYS5oCmluZGV4IDI4Yzg5MGIuLmUxMDBiMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWFhZWMyMDAwL2RtYS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWFhZWMyMDAwL2RtYS5oCkBAIC03LDExICs3LDMgQEAKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9ETUFfSAotI2RlZmluZSBfX0FTTV9BUkNIX0RNQV9ICi0KLSNkZWZpbmUgTUFYX0RNQV9BRERSRVNTICAgICAgICAgMHhmZmZmZmZmZgotI2RlZmluZSBNQVhfRE1BX0NIQU5ORUxTICAgICAgICAwCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGY0MDkzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwLmgKQEAgLTAsMCArMSwyNjEgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDAuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBJdmFuIEtva3NoYXlza3kKKyAqIENvcHlyaWdodCAoQykgU0FOIFBlb3BsZQorICoKKyAqIENvbW1vbiBkZWZpbml0aW9ucy4KKyAqIEJhc2VkIG9uIEFUOTFSTTkyMDAgZGF0YXNoZWV0IHJldmlzaW9uIEUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIEFUOTFSTTkyMDBfSAorI2RlZmluZSBBVDkxUk05MjAwX0gKKworLyoKKyAqIFBlcmlwaGVyYWwgaWRlbnRpZmllcnMvaW50ZXJydXB0cy4KKyAqLworI2RlZmluZSBBVDkxX0lEX0ZJUQkwCS8qIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyIChGSVEpICovCisjZGVmaW5lIEFUOTFfSURfU1lTCTEJLyogU3lzdGVtIFBlcmlwaGVyYWwgKi8KKyNkZWZpbmUgQVQ5MV9JRF9QSU9BCTIJLyogUGFyYWxsZWwgSU8gQ29udHJvbGxlciBBICovCisjZGVmaW5lIEFUOTFfSURfUElPQgkzCS8qIFBhcmFsbGVsIElPIENvbnRyb2xsZXIgQiAqLworI2RlZmluZSBBVDkxX0lEX1BJT0MJNAkvKiBQYXJhbGxlbCBJTyBDb250cm9sbGVyIEMgKi8KKyNkZWZpbmUgQVQ5MV9JRF9QSU9ECTUJLyogUGFyYWxsZWwgSU8gQ29udHJvbGxlciBEICovCisjZGVmaW5lIEFUOTFfSURfVVMwCTYJLyogVVNBUlQgMCAqLworI2RlZmluZSBBVDkxX0lEX1VTMQk3CS8qIFVTQVJUIDEgKi8KKyNkZWZpbmUgQVQ5MV9JRF9VUzIJOAkvKiBVU0FSVCAyICovCisjZGVmaW5lIEFUOTFfSURfVVMzCTkJLyogVVNBUlQgMyAqLworI2RlZmluZSBBVDkxX0lEX01DSQkxMAkvKiBNdWx0aW1lZGlhIENhcmQgSW50ZXJmYWNlICovCisjZGVmaW5lIEFUOTFfSURfVURQCTExCS8qIFVTQiBEZXZpY2UgUG9ydCAqLworI2RlZmluZSBBVDkxX0lEX1RXSQkxMgkvKiBUd28tV2lyZSBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgQVQ5MV9JRF9TUEkJMTMJLyogU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlICovCisjZGVmaW5lIEFUOTFfSURfU1NDMAkxNAkvKiBTZXJpYWwgU3luY2hyb25vdXMgQ29udHJvbGxlciAwICovCisjZGVmaW5lIEFUOTFfSURfU1NDMQkxNQkvKiBTZXJpYWwgU3luY2hyb25vdXMgQ29udHJvbGxlciAxICovCisjZGVmaW5lIEFUOTFfSURfU1NDMgkxNgkvKiBTZXJpYWwgU3luY2hyb25vdXMgQ29udHJvbGxlciAyICovCisjZGVmaW5lIEFUOTFfSURfVEMwCTE3CS8qIFRpbWVyIENvdW50ZXIgMCAqLworI2RlZmluZSBBVDkxX0lEX1RDMQkxOAkvKiBUaW1lciBDb3VudGVyIDEgKi8KKyNkZWZpbmUgQVQ5MV9JRF9UQzIJMTkJLyogVGltZXIgQ291bnRlciAyICovCisjZGVmaW5lIEFUOTFfSURfVEMzCTIwCS8qIFRpbWVyIENvdW50ZXIgMyAqLworI2RlZmluZSBBVDkxX0lEX1RDNAkyMQkvKiBUaW1lciBDb3VudGVyIDQgKi8KKyNkZWZpbmUgQVQ5MV9JRF9UQzUJMjIJLyogVGltZXIgQ291bnRlciA1ICovCisjZGVmaW5lIEFUOTFfSURfVUhQCTIzCS8qIFVTQiBIb3N0IHBvcnQgKi8KKyNkZWZpbmUgQVQ5MV9JRF9FTUFDCTI0CS8qIEV0aGVybmV0IE1BQyAqLworI2RlZmluZSBBVDkxX0lEX0lSUTAJMjUJLyogQWR2YW5jZWQgSW50ZXJydXB0IENvbnRyb2xsZXIgKElSUTApICovCisjZGVmaW5lIEFUOTFfSURfSVJRMQkyNgkvKiBBZHZhbmNlZCBJbnRlcnJ1cHQgQ29udHJvbGxlciAoSVJRMSkgKi8KKyNkZWZpbmUgQVQ5MV9JRF9JUlEyCTI3CS8qIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyIChJUlEyKSAqLworI2RlZmluZSBBVDkxX0lEX0lSUTMJMjgJLyogQWR2YW5jZWQgSW50ZXJydXB0IENvbnRyb2xsZXIgKElSUTMpICovCisjZGVmaW5lIEFUOTFfSURfSVJRNAkyOQkvKiBBZHZhbmNlZCBJbnRlcnJ1cHQgQ29udHJvbGxlciAoSVJRNCkgKi8KKyNkZWZpbmUgQVQ5MV9JRF9JUlE1CTMwCS8qIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyIChJUlE1KSAqLworI2RlZmluZSBBVDkxX0lEX0lSUTYJMzEJLyogQWR2YW5jZWQgSW50ZXJydXB0IENvbnRyb2xsZXIgKElSUTYpICovCisKKworLyoKKyAqIFBlcmlwaGVyYWwgcGh5c2ljYWwgYmFzZSBhZGRyZXNzZXMuCisgKi8KKyNkZWZpbmUgQVQ5MV9CQVNFX1RDQjAJCTB4ZmZmYTAwMDAKKyNkZWZpbmUgQVQ5MV9CQVNFX1RDMAkJMHhmZmZhMDAwMAorI2RlZmluZSBBVDkxX0JBU0VfVEMxCQkweGZmZmEwMDQwCisjZGVmaW5lIEFUOTFfQkFTRV9UQzIJCTB4ZmZmYTAwODAKKyNkZWZpbmUgQVQ5MV9CQVNFX1RDQjEJCTB4ZmZmYTQwMDAKKyNkZWZpbmUgQVQ5MV9CQVNFX1RDMwkJMHhmZmZhNDAwMAorI2RlZmluZSBBVDkxX0JBU0VfVEM0CQkweGZmZmE0MDQwCisjZGVmaW5lIEFUOTFfQkFTRV9UQzUJCTB4ZmZmYTQwODAKKyNkZWZpbmUgQVQ5MV9CQVNFX1VEUAkJMHhmZmZiMDAwMAorI2RlZmluZSBBVDkxX0JBU0VfTUNJCQkweGZmZmI0MDAwCisjZGVmaW5lIEFUOTFfQkFTRV9UV0kJCTB4ZmZmYjgwMDAKKyNkZWZpbmUgQVQ5MV9CQVNFX0VNQUMJCTB4ZmZmYmMwMDAKKyNkZWZpbmUgQVQ5MV9CQVNFX1VTMAkJMHhmZmZjMDAwMAorI2RlZmluZSBBVDkxX0JBU0VfVVMxCQkweGZmZmM0MDAwCisjZGVmaW5lIEFUOTFfQkFTRV9VUzIJCTB4ZmZmYzgwMDAKKyNkZWZpbmUgQVQ5MV9CQVNFX1VTMwkJMHhmZmZjYzAwMAorI2RlZmluZSBBVDkxX0JBU0VfU1NDMAkJMHhmZmZkMDAwMAorI2RlZmluZSBBVDkxX0JBU0VfU1NDMQkJMHhmZmZkNDAwMAorI2RlZmluZSBBVDkxX0JBU0VfU1NDMgkJMHhmZmZkODAwMAorI2RlZmluZSBBVDkxX0JBU0VfU1BJCQkweGZmZmUwMDAwCisjZGVmaW5lIEFUOTFfQkFTRV9TWVMJCTB4ZmZmZmYwMDAKKworCisvKgorICogUElPIHBpbiBkZWZpbml0aW9ucyAocGVyaXBoZXJhbCBBL0IgbXVsdGlwbGV4aW5nKS4KKyAqLworI2RlZmluZSBBVDkxX1BBMF9NSVNPCQkoMSA8PCAgMCkJLyogQTogU1BJIE1hc3Rlci1JbiBTbGF2ZS1PdXQgKi8KKyNkZWZpbmUgQVQ5MV9QQTBfUENLMwkJKDEgPDwgIDApCS8qIEI6IFBNQyBQcm9ncmFtbWFibGUgQ2xvY2sgT3V0cHV0IDMgKi8KKyNkZWZpbmUgQVQ5MV9QQTFfTU9TSQkJKDEgPDwgIDEpCS8qIEE6IFNQSSBNYXN0ZXItT3V0IFNsYXZlLUluICovCisjZGVmaW5lIEFUOTFfUEExX1BDSzAJCSgxIDw8ICAxKQkvKiBCOiBQTUMgUHJvZ3JhbW1hYmxlIENsb2NrIE91dHB1dCAwICovCisjZGVmaW5lIEFUOTFfUEEyX1NQQ0sJCSgxIDw8ICAyKQkvKiBBOiBTUEkgU2VyaWFsIENsb2NrICovCisjZGVmaW5lIEFUOTFfUEEyX0lSUTQJCSgxIDw8ICAyKQkvKiBCOiBFeHRlcm5hbCBJbnRlcnJ1cHQgNCAqLworI2RlZmluZSBBVDkxX1BBM19OUENTMAkJKDEgPDwgIDMpCS8qIEE6IFNQSSBQZXJpcGhlcmFsIENoaXAgU2VsZWN0IDAgKi8KKyNkZWZpbmUgQVQ5MV9QQTNfSVJRNQkJKDEgPDwgIDMpCS8qIEI6IEV4dGVybmFsIEludGVycnVwdCA1ICovCisjZGVmaW5lIEFUOTFfUEE0X05QQ1MxCQkoMSA8PCAgNCkJLyogQTogU1BJIFBlcmlwaGVyYWwgQ2hpcCBTZWxlY3QgMSAqLworI2RlZmluZSBBVDkxX1BBNF9QQ0sxCQkoMSA8PCAgNCkJLyogQjogUE1DIFByb2dyYW1tYWJsZSBDbG9jayBPdXRwdXQgMSAqLworI2RlZmluZSBBVDkxX1BBNV9OUENTMgkJKDEgPDwgIDUpCS8qIEE6IFNQSSBQZXJpcGhlcmFsIENoaXAgU2VsZWN0IDIgKi8KKyNkZWZpbmUgQVQ5MV9QQTVfVFhEMwkJKDEgPDwgIDUpCS8qIEI6IFVTQVJUIFRyYW5zbWl0IERhdGEgMyAqLworI2RlZmluZSBBVDkxX1BBNl9OUENTMwkJKDEgPDwgIDYpCS8qIEE6IFNQSSBQZXJpcGhlcmFsIENoaXAgU2VsZWN0IDMgKi8KKyNkZWZpbmUgQVQ5MV9QQTZfUlhEMwkJKDEgPDwgIDYpCS8qIEI6IFVTQVJUIFJlY2VpdmUgRGF0YSAzICovCisjZGVmaW5lIEFUOTFfUEE3X0VUWENLX0VSRUZDSwkoMSA8PCAgNykJLyogQTogRXRoZXJuZXQgUmVmZXJlbmNlIENsb2NrIC8gVHJhbnNtaXQgQ2xvY2sgKi8KKyNkZWZpbmUgQVQ5MV9QQTdfUENLMgkJKDEgPDwgIDcpCS8qIEI6IFBNQyBQcm9ncmFtbWFibGUgQ2xvY2sgT3V0cHV0IDIgKi8KKyNkZWZpbmUgQVQ5MV9QQThfRVRYRU4JCSgxIDw8ICA4KQkvKiBBOiBFdGhlcm5ldCBUcmFuc21pdCBFbmFibGUgKi8KKyNkZWZpbmUgQVQ5MV9QQThfTUNDREIJCSgxIDw8ICA4KQkvKiBCOiBNTUMgTXVsdGltZWRpYSBDYXJkIEIgQ29tbWFuZCAqLworI2RlZmluZSBBVDkxX1BBOV9FVFgwCQkoMSA8PCAgOSkJLyogQTogRXRoZXJuZXQgVHJhbnNtaXQgRGF0YSAwICovCisjZGVmaW5lIEFUOTFfUEE5X01DREIwCQkoMSA8PCAgOSkJLyogQjogTU1DIE11bHRpbWVkaWEgQ2FyZCBCIERhdGEgMCAqLworI2RlZmluZSBBVDkxX1BBMTBfRVRYMQkJKDEgPDwgMTApCS8qIEE6IEV0aGVybmV0IFRyYW5zbWl0IERhdGEgMSAqLworI2RlZmluZSBBVDkxX1BBMTBfTUNEQjEJCSgxIDw8IDEwKQkvKiBCOiBNTUMgTXVsdGltZWRpYSBDYXJkIEIgRGF0YSAxICovCisjZGVmaW5lIEFUOTFfUEExMV9FQ1JTX0VDUlNEVgkoMSA8PCAxMSkJLyogQTogRXRoZXJuZXQgQ2FycmllciBTZW5zZSAvIERhdGEgVmFsaWQgKi8KKyNkZWZpbmUgQVQ5MV9QQTExX01DREIyCQkoMSA8PCAxMSkJLyogQjogTU1DIE11bHRpbWVkaWEgQ2FyZCBCIERhdGEgMiAqLworI2RlZmluZSBBVDkxX1BBMTJfRVJYMAkJKDEgPDwgMTIpCS8qIEE6IEV0aGVybmV0IFJlY2VpdmUgRGF0YSAwICovCisjZGVmaW5lIEFUOTFfUEExMl9NQ0RCMwkJKDEgPDwgMTIpCS8qIEI6IE1NQyBNdWx0aW1lZGlhIENhcmQgQiBEYXRhIDMgKi8KKyNkZWZpbmUgQVQ5MV9QQTEzX0VSWDEJCSgxIDw8IDEzKQkvKiBBOiBFdGhlcm5ldCBSZWNlaXZlIERhdGEgMSAqLworI2RlZmluZSBBVDkxX1BBMTNfVENMSzAJCSgxIDw8IDEzKQkvKiBCOiBUQyBFeHRlcm5hbCBDbG9jayBJbnB1dCAwICovCisjZGVmaW5lIEFUOTFfUEExNF9FUlhFUgkJKDEgPDwgMTQpCS8qIEE6IEV0aGVybmV0IFJlY2VpdmUgRXJyb3IgKi8KKyNkZWZpbmUgQVQ5MV9QQTE0X1RDTEsxCQkoMSA8PCAxNCkJLyogQjogVEMgRXh0ZXJuYWwgQ2xvY2sgSW5wdXQgMSAqLworI2RlZmluZSBBVDkxX1BBMTVfRU1EQwkJKDEgPDwgMTUpCS8qIEE6IEV0aGVybmV0IE1hbmFnZW1lbnQgRGF0YSBDbG9jayAqLworI2RlZmluZSBBVDkxX1BBMTVfVENMSzIJCSgxIDw8IDE1KQkvKiBCOiBUQyBFeHRlcm5hbCBDbG9jayBJbnB1dCAyICovCisjZGVmaW5lIEFUOTFfUEExNl9FTURJTwkJKDEgPDwgMTYpCS8qIEE6IEV0aGVybmV0IE1hbmFnZW1lbnQgRGF0YSBJL08gKi8KKyNkZWZpbmUgQVQ5MV9QQTE2X0lSUTYJCSgxIDw8IDE2KQkvKiBCOiBFeHRlcm5hbCBJbnRlcnJ1cHQgNiAqLworI2RlZmluZSBBVDkxX1BBMTdfVFhEMAkJKDEgPDwgMTcpCS8qIEE6IFVTQVJUIFRyYW5zbWl0IERhdGEgMCAqLworI2RlZmluZSBBVDkxX1BBMTdfVElPQTAJCSgxIDw8IDE3KQkvKiBCOiBUQyBJL08gTGluZSBBIDAgKi8KKyNkZWZpbmUgQVQ5MV9QQTE4X1JYRDAJCSgxIDw8IDE4KQkvKiBBOiBVU0FSVCBSZWNlaXZlIERhdGEgMCAqLworI2RlZmluZSBBVDkxX1BBMThfVElPQjAJCSgxIDw8IDE4KQkvKiBCOiBUQyBJL08gTGluZSBCIDAgKi8KKyNkZWZpbmUgQVQ5MV9QQTE5X1NDSzAJCSgxIDw8IDE5KQkvKiBBOiBVU0FSVCBTZXJpYWwgQ2xvY2sgMCAqLworI2RlZmluZSBBVDkxX1BBMTlfVElPQTEJCSgxIDw8IDE5KQkvKiBCOiBUQyBJL08gTGluZSBBIDEgKi8KKyNkZWZpbmUgQVQ5MV9QQTIwX0NUUzAJCSgxIDw8IDIwKQkvKiBBOiBVU0FSVCBDbGVhciBUbyBTZW5kIDAgKi8KKyNkZWZpbmUgQVQ5MV9QQTIwX1RJT0IxCQkoMSA8PCAyMCkJLyogQjogVEMgSS9PIExpbmUgQiAxICovCisjZGVmaW5lIEFUOTFfUEEyMV9SVFMwCQkoMSA8PCAyMSkJLyogQTogVVNBUlQgUmVhZHkgVG8gU2VuZCAwICovCisjZGVmaW5lIEFUOTFfUEEyMV9USU9BMgkJKDEgPDwgMjEpCS8qIEI6IFRDIEkvTyBMaW5lIEEgMiAqLworI2RlZmluZSBBVDkxX1BBMjJfUlhEMgkJKDEgPDwgMjIpCS8qIEE6IFVTQVJUIFJlY2VpdmUgRGF0YSAyICovCisjZGVmaW5lIEFUOTFfUEEyMl9USU9CMgkJKDEgPDwgMjIpCS8qIEI6IFRDIEkvTyBMaW5lIEIgMiAqLworI2RlZmluZSBBVDkxX1BBMjNfVFhEMgkJKDEgPDwgMjMpCS8qIEE6IFVTQVJUIFRyYW5zbWl0IERhdGEgMiAqLworI2RlZmluZSBBVDkxX1BBMjNfSVJRMwkJKDEgPDwgMjMpCS8qIEI6IEV4dGVybmFsIEludGVycnVwdCAzICovCisjZGVmaW5lIEFUOTFfUEEyNF9TQ0syCQkoMSA8PCAyNCkJLyogQTogVVNBUlQgU2VyaWFsIENsb2NrIDIgKi8KKyNkZWZpbmUgQVQ5MV9QQTI0X1BDSzEJCSgxIDw8IDI0KQkvKiBCOiBQTUMgUHJvZ3JhbW1hYmxlIENsb2NrIE91dHB1dCAxICovCisjZGVmaW5lIEFUOTFfUEEyNV9UV0QJCSgxIDw8IDI1KQkvKiBBOiBUV0kgVHdvLXdpcmUgU2VyaWFsIERhdGEgKi8KKyNkZWZpbmUgQVQ5MV9QQTI1X0lSUTIJCSgxIDw8IDI1KQkvKiBCOiBFeHRlcm5hbCBJbnRlcnJ1cHQgMiAqLworI2RlZmluZSBBVDkxX1BBMjZfVFdDSwkJKDEgPDwgMjYpCS8qIEE6IFRXSSBUd28td2lyZSBTZXJpYWwgQ2xvY2sgKi8KKyNkZWZpbmUgQVQ5MV9QQTI2X0lSUTEJCSgxIDw8IDI2KQkvKiBCOiBFeHRlcm5hbCBJbnRlcnJ1cHQgMSAqLworI2RlZmluZSBBVDkxX1BBMjdfTUNDSwkJKDEgPDwgMjcpCS8qIEE6IE1NQyBNdWx0aW1lZGlhIENhcmQgQ2xvY2sgKi8KKyNkZWZpbmUgQVQ5MV9QQTI3X1RDTEszCQkoMSA8PCAyNykJLyogQjogVEMgRXh0ZXJuYWwgQ2xvY2sgSW5wdXQgMyAqLworI2RlZmluZSBBVDkxX1BBMjhfTUNDREEJCSgxIDw8IDI4KQkvKiBBOiBNTUMgTXVsdGltZWRpYSBDYXJkIEEgQ29tbWFuZCAqLworI2RlZmluZSBBVDkxX1BBMjhfVENMSzQJCSgxIDw8IDI4KQkvKiBCOiBUQyBFeHRlcm5hbCBDbG9jayBJbnB1dCA0ICovCisjZGVmaW5lIEFUOTFfUEEyOV9NQ0RBMAkJKDEgPDwgMjkpCS8qIEE6IE1NQyBNdWx0aW1lZGlhIENhcmQgQSBEYXRhIDAgKi8KKyNkZWZpbmUgQVQ5MV9QQTI5X1RDTEs1CQkoMSA8PCAyOSkJLyogQjogVEMgRXh0ZXJuYWwgQ2xvY2sgSW5wdXQgNSAqLworI2RlZmluZSBBVDkxX1BBMzBfRFJYRAkJKDEgPDwgMzApCS8qIEE6IERCR1UgUmVjZWl2ZSBEYXRhICovCisjZGVmaW5lIEFUOTFfUEEzMF9DVFMyCQkoMSA8PCAzMCkJLyogQjogVVNBUlQgQ2xlYXIgVG8gU2VuZCAyICovCisjZGVmaW5lIEFUOTFfUEEzMV9EVFhECQkoMSA8PCAzMSkJLyogQTogREJHVSBUcmFuc21pdCBEYXRhICovCisjZGVmaW5lIEFUOTFfUEEzMV9SVFMyCQkoMSA8PCAzMSkJLyogQjogVVNBUlQgUmVhZHkgVG8gU2VuZCAyICovCisKKyNkZWZpbmUgQVQ5MV9QQjBfVEYwCQkoMSA8PCAgMCkJLyogQTogU1NDIFRyYW5zbWl0IEZyYW1lIFN5bmMgMCAqLworI2RlZmluZSBBVDkxX1BCMF9SVFMzCQkoMSA8PCAgMCkJLyogQjogVVNBUlQgUmVhZHkgVG8gU2VuZCAzICovCisjZGVmaW5lIEFUOTFfUEIxX1RLMAkJKDEgPDwgIDEpCS8qIEE6IFNTQyBUcmFuc21pdCBDbG9jayAwICovCisjZGVmaW5lIEFUOTFfUEIxX0NUUzMJCSgxIDw8ICAxKQkvKiBCOiBVU0FSVCBDbGVhciBUbyBTZW5kIDMgKi8KKyNkZWZpbmUgQVQ5MV9QQjJfVEQwCQkoMSA8PCAgMikJLyogQTogU1NDIFRyYW5zbWl0IERhdGEgMCAqLworI2RlZmluZSBBVDkxX1BCMl9TQ0szCQkoMSA8PCAgMikJLyogQjogVVNBUlQgU2VyaWFsIENsb2NrIDMgKi8KKyNkZWZpbmUgQVQ5MV9QQjNfUkQwCQkoMSA8PCAgMykJLyogQTogU1NDIFJlY2VpdmUgRGF0YSAwICovCisjZGVmaW5lIEFUOTFfUEIzX01DREExCQkoMSA8PCAgMykJLyogQjogTU1DIE11bHRpbWVkaWEgQ2FyZCBBIERhdGEgMSAqLworI2RlZmluZSBBVDkxX1BCNF9SSzAJCSgxIDw8ICA0KQkvKiBBOiBTU0MgUmVjZWl2ZSBDbG9jayAwICovCisjZGVmaW5lIEFUOTFfUEI0X01DREEyCQkoMSA8PCAgNCkJLyogQjogTU1DIE11bHRpbWVkaWEgQ2FyZCBBIERhdGEgMiAqLworI2RlZmluZSBBVDkxX1BCNV9SRjAJCSgxIDw8ICA1KQkvKiBBOiBTU0MgUmVjZWl2ZSBGcmFtZSBTeW5jIDAgKi8KKyNkZWZpbmUgQVQ5MV9QQjVfTUNEQTMJCSgxIDw8ICA1KQkvKiBCOiBNTUMgTXVsdGltZWRpYSBDYXJkIEEgRGF0YSAzICovCisjZGVmaW5lIEFUOTFfUEI2X1RGMQkJKDEgPDwgIDYpCS8qIEE6IFNTQyBUcmFuc21pdCBGcmFtZSBTeW5jIDEgKi8KKyNkZWZpbmUgQVQ5MV9QQjZfVElPQTMJCSgxIDw8ICA2KQkvKiBCOiBUQyBJL08gTGluZSBBIDMgKi8KKyNkZWZpbmUgQVQ5MV9QQjdfVEsxCQkoMSA8PCAgNykJLyogQTogU1NDIFRyYW5zbWl0IENsb2NrIDEgKi8KKyNkZWZpbmUgQVQ5MV9QQjdfVElPQjMJCSgxIDw8ICA3KQkvKiBCOiBUQyBJL08gTGluZSBCIDMgKi8KKyNkZWZpbmUgQVQ5MV9QQjhfVEQxCQkoMSA8PCAgOCkJLyogQTogU1NDIFRyYW5zbWl0IERhdGEgMSAqLworI2RlZmluZSBBVDkxX1BCOF9USU9BNAkJKDEgPDwgIDgpCS8qIEI6IFRDIEkvTyBMaW5lIEEgNCAqLworI2RlZmluZSBBVDkxX1BCOV9SRDEJCSgxIDw8ICA5KQkvKiBBOiBTU0MgUmVjZWl2ZSBEYXRhIDEgKi8KKyNkZWZpbmUgQVQ5MV9QQjlfVElPQjQJCSgxIDw8ICA5KQkvKiBCOiBUQyBJL08gTGluZSBCIDQgKi8KKyNkZWZpbmUgQVQ5MV9QQjEwX1JLMQkJKDEgPDwgMTApCS8qIEE6IFNTQyBSZWNlaXZlIENsb2NrIDEgKi8KKyNkZWZpbmUgQVQ5MV9QQjEwX1RJT0E1CQkoMSA8PCAxMCkJLyogQjogVEMgSS9PIExpbmUgQSA1ICovCisjZGVmaW5lIEFUOTFfUEIxMV9SRjEJCSgxIDw8IDExKQkvKiBBOiBTU0MgUmVjZWl2ZSBGcmFtZSBTeW5jIDEgKi8KKyNkZWZpbmUgQVQ5MV9QQjExX1RJT0I1CQkoMSA8PCAxMSkJLyogQjogVEMgSS9PIExpbmUgQiA1ICovCisjZGVmaW5lIEFUOTFfUEIxMl9URjIJCSgxIDw8IDEyKQkvKiBBOiBTU0MgVHJhbnNtaXQgRnJhbWUgU3luYyAyICovCisjZGVmaW5lIEFUOTFfUEIxMl9FVFgyCQkoMSA8PCAxMikJLyogQjogRXRoZXJuZXQgVHJhbnNtaXQgRGF0YSAyICovCisjZGVmaW5lIEFUOTFfUEIxM19USzIJCSgxIDw8IDEzKQkvKiBBOiBTU0MgVHJhbnNtaXQgQ2xvY2sgMyAqLworI2RlZmluZSBBVDkxX1BCMTNfRVRYMwkJKDEgPDwgMTMpCS8qIEI6IEV0aGVybmV0IFRyYW5zbWl0IERhdGEgMyAqLworI2RlZmluZSBBVDkxX1BCMTRfVEQyCQkoMSA8PCAxNCkJLyogQTogU1NDIFRyYW5zbWl0IERhdGEgMiAqLworI2RlZmluZSBBVDkxX1BCMTRfRVRYRVIJCSgxIDw8IDE0KQkvKiBCOiBFdGhlcm5ldCBUcmFuc21pdCBDb2RpbmcgRXJyb3IgKi8KKyNkZWZpbmUgQVQ5MV9QQjE1X1JEMgkJKDEgPDwgMTUpCS8qIEE6IFNTQyBSZWNlaXZlIERhdGEgMiAqLworI2RlZmluZSBBVDkxX1BCMTVfRVJYMgkJKDEgPDwgMTUpCS8qIEI6IEV0aGVybmV0IFJlY2VpdmUgRGF0YSAyICovCisjZGVmaW5lIEFUOTFfUEIxNl9SSzIJCSgxIDw8IDE2KQkvKiBBOiBTU0MgUmVjZWl2ZSBDbG9jayAyICovCisjZGVmaW5lIEFUOTFfUEIxNl9FUlgzCQkoMSA8PCAxNikJLyogQjogRXRoZXJuZXQgUmVjZWl2ZSBEYXRhIDMgKi8KKyNkZWZpbmUgQVQ5MV9QQjE3X1JGMgkJKDEgPDwgMTcpCS8qIEE6IFNTQyBSZWNlaXZlIEZyYW1lIFN5bmMgMiAqLworI2RlZmluZSBBVDkxX1BCMTdfRVJYRFYJCSgxIDw8IDE3KQkvKiBCOiBFdGhlcm5ldCBSZWNlaXZlIERhdGEgVmFsaWQgKi8KKyNkZWZpbmUgQVQ5MV9QQjE4X1JJMQkJKDEgPDwgMTgpCS8qIEE6IFVTQVJUIFJpbmcgSW5kaWNhdG9yIDEgKi8KKyNkZWZpbmUgQVQ5MV9QQjE4X0VDT0wJCSgxIDw8IDE4KQkvKiBCOiBFdGhlcm5ldCBDb2xsaXNpb24gRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgQVQ5MV9QQjE5X0RUUjEJCSgxIDw8IDE5KQkvKiBBOiBVU0FSVCBEYXRhIFRlcm1pbmFsIFJlYWR5IDEgKi8KKyNkZWZpbmUgQVQ5MV9QQjE5X0VSWENLCQkoMSA8PCAxOSkJLyogQjogRXRoZXJuZXQgUmVjZWl2ZSBDbG9jayAqLworI2RlZmluZSBBVDkxX1BCMjBfVFhEMQkJKDEgPDwgMjApCS8qIEE6IFVTQVJUIFRyYW5zbWl0IERhdGEgMSAqLworI2RlZmluZSBBVDkxX1BCMjFfUlhEMQkJKDEgPDwgMjEpCS8qIEE6IFVTQVJUIFJlY2VpdmUgRGF0YSAxICovCisjZGVmaW5lIEFUOTFfUEIyMl9TQ0sxCQkoMSA8PCAyMikJLyogQTogVVNBUlQgU2VyaWFsIENsb2NrIDEgKi8KKyNkZWZpbmUgQVQ5MV9QQjIzX0RDRDEJCSgxIDw8IDIzKQkvKiBBOiBVU0FSVCBEYXRhIENhcnJpZXIgRGV0ZWN0IDEgKi8KKyNkZWZpbmUgQVQ5MV9QQjI0X0NUUzEJCSgxIDw8IDI0KQkvKiBBOiBVU0FSVCBDbGVhciBUbyBTZW5kIDEgKi8KKyNkZWZpbmUgQVQ5MV9QQjI1X0RTUjEJCSgxIDw8IDI1KQkvKiBBOiBVU0FSVCBEYXRhIFNldCBSZWFkeSAxICovCisjZGVmaW5lIEFUOTFfUEIyNV9FRjEwMAkJKDEgPDwgMjUpCS8qIEI6IEV0aGVybmV0IEZvcmNlIDEwMCBNYml0ICovCisjZGVmaW5lIEFUOTFfUEIyNl9SVFMxCQkoMSA8PCAyNikJLyogQTogVVNBUlQgUmVhZHkgVG8gU2VuZCAxICovCisjZGVmaW5lIEFUOTFfUEIyN19QQ0swCQkoMSA8PCAyNykJLyogQjogUE1DIFByb2dyYW1tYWJsZSBDbG9jayBPdXRwdXQgMCAqLworI2RlZmluZSBBVDkxX1BCMjhfRklRCQkoMSA8PCAyOCkJLyogQTogRmFzdCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgQVQ5MV9QQjI5X0lSUTAJCSgxIDw8IDI5KQkvKiBBOiBFeHRlcm5hbCBJbnRlcnJ1cHQgMCAqLworCisjZGVmaW5lIEFUOTFfUEMwX0JGQ0sJCSgxIDw8ICAwKQkvKiBBOiBCdXJzdCBGbGFzaCBDbG9jayAqLworI2RlZmluZSBBVDkxX1BDMV9CRlJEWV9TTU9FCSgxIDw8ICAxKQkvKiBBOiBCdXJzdCBGbGFzaCBSZWFkeSAvIFNtYXJ0TWVkaWEgT3V0cHV0IEVuYWJsZSAqLworI2RlZmluZSBBVDkxX1BDMl9CRkFWRAkJKDEgPDwgIDIpCS8qIEE6IEJ1cnN0IEZsYXNoIEFkZHJlc3MgVmFsaWQgKi8KKyNkZWZpbmUgQVQ5MV9QQzNfQkZCQUFfU01XRQkoMSA8PCAgMykJLyogQTogQnVyc3QgRmxhc2ggQWRkcmVzcyBBZHZhbmNlIC8gU21hcnRNZWRpYSBXcml0ZSBFbmFibGUgKi8KKyNkZWZpbmUgQVQ5MV9QQzRfQkZPRQkJKDEgPDwgIDQpCS8qIEE6IEJ1cnN0IEZsYXNoIE91dHB1dCBFbmFibGUgKi8KKyNkZWZpbmUgQVQ5MV9QQzVfQkZXRQkJKDEgPDwgIDUpCS8qIEE6IEJ1cnN0IEZsYXNoIFdyaXRlIEVuYWJsZSAqLworI2RlZmluZSBBVDkxX1BDNl9OV0FJVAkJKDEgPDwgIDYpCS8qIEE6IFNNQyBXYWl0IFNpZ25hbCAqLworI2RlZmluZSBBVDkxX1BDN19BMjMJCSgxIDw8ICA3KQkvKiBBOiBBZGRyZXNzIEJ1cyAyMyAqLworI2RlZmluZSBBVDkxX1BDOF9BMjQJCSgxIDw8ICA4KQkvKiBBOiBBZGRyZXNzIEJ1cyAyNCAqLworI2RlZmluZSBBVDkxX1BDOV9BMjVfQ0ZSTlcJKDEgPDwgIDkpCS8qIEE6IEFkZHJlc3MgQnVzIDI1IC8gQ29tcGFjdCBGbGFzaCBSZWFkIE5vdCBXcml0ZSAqLworI2RlZmluZSBBVDkxX1BDMTBfTkNTNF9DRkNTCSgxIDw8IDEwKQkvKiBBOiBTTUMgQ2hpcCBTZWxlY3QgNCAvIENvbXBhY3QgRmxhc2ggQ2hpcCBTZWxlY3QgKi8KKyNkZWZpbmUgQVQ5MV9QQzExX05DUzVfQ0ZDRTEJKDEgPDwgMTEpCS8qIEE6IFNNQyBDaGlwIFNlbGVjdCA1IC8gQ29tcGFjdCBGbGFzaCBDaGlwIEVuYWJsZSAxICovCisjZGVmaW5lIEFUOTFfUEMxMl9OQ1M2X0NGQ0UyCSgxIDw8IDEyKQkvKiBBOiBTTUMgQ2hpcCBTZWxlY3QgNiAvIENvbXBhY3QgRmxhc2ggQ2hpcCBFbmFibGUgMiAqLworI2RlZmluZSBBVDkxX1BDMTNfTkNTNwkJKDEgPDwgMTMpCS8qIEE6IENoaXAgU2VsZWN0IDcgKi8KKworI2RlZmluZSBBVDkxX1BEMF9FVFgwCQkoMSA8PCAgMCkJLyogQTogRXRoZXJuZXQgVHJhbnNtaXQgRGF0YSAwICovCisjZGVmaW5lIEFUOTFfUEQxX0VUWDEJCSgxIDw8ICAxKQkvKiBBOiBFdGhlcm5ldCBUcmFuc21pdCBEYXRhIDEgKi8KKyNkZWZpbmUgQVQ5MV9QRDJfRVRYMgkJKDEgPDwgIDIpCS8qIEE6IEV0aGVybmV0IFRyYW5zbWl0IERhdGEgMiAqLworI2RlZmluZSBBVDkxX1BEM19FVFgzCQkoMSA8PCAgMykJLyogQTogRXRoZXJuZXQgVHJhbnNtaXQgRGF0YSAzICovCisjZGVmaW5lIEFUOTFfUEQ0X0VUWEVOCQkoMSA8PCAgNCkJLyogQTogRXRoZXJuZXQgVHJhbnNtaXQgRW5hYmxlICovCisjZGVmaW5lIEFUOTFfUEQ1X0VUWEVSCQkoMSA8PCAgNSkJLyogQTogRXRoZXJuZXQgVHJhbnNtaXQgQ29kaW5nIEVycm9yICovCisjZGVmaW5lIEFUOTFfUEQ2X0RUWEQJCSgxIDw8ICA2KQkvKiBBOiBEQkdVIFRyYW5zbWl0IERhdGEgKi8KKyNkZWZpbmUgQVQ5MV9QRDdfUENLMAkJKDEgPDwgIDcpCS8qIEE6IFBNQyBQcm9ncmFtbWFibGUgQ2xvY2sgT3V0cHV0IDAgKi8KKyNkZWZpbmUgQVQ5MV9QRDdfVFNZTkMJCSgxIDw8ICA3KQkvKiBCOiBFVE0gVHJhY2UgU3luY2hyb25pemF0aW9uIFNpZ25hbCAqLworI2RlZmluZSBBVDkxX1BEOF9QQ0sxCQkoMSA8PCAgOCkJLyogQTogUE1DIFByb2dyYW1tYWJsZSBDbG9jayBPdXRwdXQgMSAqLworI2RlZmluZSBBVDkxX1BEOF9UQ0xLCQkoMSA8PCAgOCkJLyogQjogRVRNIFRyYWNlIENsb2NrICovCisjZGVmaW5lIEFUOTFfUEQ5X1BDSzIJCSgxIDw8ICA5KQkvKiBBOiBQTUMgUHJvZ3JhbW1hYmxlIENsb2NrIE91dHB1dCAyICovCisjZGVmaW5lIEFUOTFfUEQ5X1RQUzAJCSgxIDw8ICA5KQkvKiBCOiBFVE0gVHJhY2UgQVJNIFBpcGVsaW5lIFN0YXR1cyAwICovCisjZGVmaW5lIEFUOTFfUEQxMF9QQ0szCQkoMSA8PCAxMCkJLyogQTogUE1DIFByb2dyYW1tYWJsZSBDbG9jayBPdXRwdXQgMyAqLworI2RlZmluZSBBVDkxX1BEMTBfVFBTMQkJKDEgPDwgMTApCS8qIEI6IEVUTSBUcmFjZSBBUk0gUGlwZWxpbmUgU3RhdHVzIDEgKi8KKyNkZWZpbmUgQVQ5MV9QRDExX1RQUzIJCSgxIDw8IDExKQkvKiBCOiBFVE0gVHJhY2UgQVJNIFBpcGVsaW5lIFN0YXR1cyAyICovCisjZGVmaW5lIEFUOTFfUEQxMl9UUEswCQkoMSA8PCAxMikJLyogQjogRVRNIFRyYWNlIFBhY2tldCBQb3J0IDAgKi8KKyNkZWZpbmUgQVQ5MV9QRDEzX1RQSzEJCSgxIDw8IDEzKQkvKiBCOiBFVE0gVHJhY2UgUGFja2V0IFBvcnQgMSAqLworI2RlZmluZSBBVDkxX1BEMTRfVFBLMgkJKDEgPDwgMTQpCS8qIEI6IEVUTSBUcmFjZSBQYWNrZXQgUG9ydCAyICovCisjZGVmaW5lIEFUOTFfUEQxNV9URDAJCSgxIDw8IDE1KQkvKiBBOiBTU0MgVHJhbnNtaXQgRGF0YSAwICovCisjZGVmaW5lIEFUOTFfUEQxNV9UUEszCQkoMSA8PCAxNSkJLyogQjogRVRNIFRyYWNlIFBhY2tldCBQb3J0IDMgKi8KKyNkZWZpbmUgQVQ5MV9QRDE2X1REMQkJKDEgPDwgMTYpCS8qIEE6IFNTQyBUcmFuc21pdCBEYXRhIDEgKi8KKyNkZWZpbmUgQVQ5MV9QRDE2X1RQSzQJCSgxIDw8IDE2KQkvKiBCOiBFVE0gVHJhY2UgUGFja2V0IFBvcnQgNCAqLworI2RlZmluZSBBVDkxX1BEMTdfVEQyCQkoMSA8PCAxNykJLyogQTogU1NDIFRyYW5zbWl0IERhdGEgMiAqLworI2RlZmluZSBBVDkxX1BEMTdfVFBLNQkJKDEgPDwgMTcpCS8qIEI6IEVUTSBUcmFjZSBQYWNrZXQgUG9ydCA1ICovCisjZGVmaW5lIEFUOTFfUEQxOF9OUENTMQkJKDEgPDwgMTgpCS8qIEE6IFNQSSBQZXJpcGhlcmFsIENoaXAgU2VsZWN0IDEgKi8KKyNkZWZpbmUgQVQ5MV9QRDE4X1RQSzYJCSgxIDw8IDE4KQkvKiBCOiBFVE0gVHJhY2UgUGFja2V0IFBvcnQgNiAqLworI2RlZmluZSBBVDkxX1BEMTlfTlBDUzIJCSgxIDw8IDE5KQkvKiBBOiBTUEkgUGVyaXBoZXJhbCBDaGlwIFNlbGVjdCAyICovCisjZGVmaW5lIEFUOTFfUEQxOV9UUEs3CQkoMSA8PCAxOSkJLyogQjogRVRNIFRyYWNlIFBhY2tldCBQb3J0IDcgKi8KKyNkZWZpbmUgQVQ5MV9QRDIwX05QQ1MzCQkoMSA8PCAyMCkJLyogQTogU1BJIFBlcmlwaGVyYWwgQ2hpcCBTZWxlY3QgMyAqLworI2RlZmluZSBBVDkxX1BEMjBfVFBLOAkJKDEgPDwgMjApCS8qIEI6IEVUTSBUcmFjZSBQYWNrZXQgUG9ydCA4ICovCisjZGVmaW5lIEFUOTFfUEQyMV9SVFMwCQkoMSA8PCAyMSkgIAkvKiBBOiBVU0FSVCBSZWFkeSBUbyBTZW5kIDAgKi8KKyNkZWZpbmUgQVQ5MV9QRDIxX1RQSzkJCSgxIDw8IDIxKQkvKiBCOiBFVE0gVHJhY2UgUGFja2V0IFBvcnQgOSAqLworI2RlZmluZSBBVDkxX1BEMjJfUlRTMQkJKDEgPDwgMjIpCS8qIEE6IFVTQVJUIFJlYWR5IFRvIFNlbmQgMSAqLworI2RlZmluZSBBVDkxX1BEMjJfVFBLMTAJCSgxIDw8IDIyKQkvKiBCOiBFVE0gVHJhY2UgUGFja2V0IFBvcnQgMTAgKi8KKyNkZWZpbmUgQVQ5MV9QRDIzX1JUUzIJCSgxIDw8IDIzKQkvKiBBOiBVU0FSVCBSZWFkeSBUbyBTZW5kIDIgKi8KKyNkZWZpbmUgQVQ5MV9QRDIzX1RQSzExCQkoMSA8PCAyMykJLyogQjogRVRNIFRyYWNlIFBhY2tldCBQb3J0IDExICovCisjZGVmaW5lIEFUOTFfUEQyNF9SVFMzCQkoMSA8PCAyNCkJLyogQTogVVNBUlQgUmVhZHkgVG8gU2VuZCAzICovCisjZGVmaW5lIEFUOTFfUEQyNF9UUEsxMgkJKDEgPDwgMjQpCS8qIEI6IEVUTSBUcmFjZSBQYWNrZXQgUG9ydCAxMiAqLworI2RlZmluZSBBVDkxX1BEMjVfRFRSMQkJKDEgPDwgMjUpCS8qIEE6IFVTQVJUIERhdGEgVGVybWluYWwgUmVhZHkgMSAqLworI2RlZmluZSBBVDkxX1BEMjVfVFBLMTMJCSgxIDw8IDI1KQkvKiBCOiBFVE0gVHJhY2UgUGFja2V0IFBvcnQgMTMgKi8KKyNkZWZpbmUgQVQ5MV9QRDI2X1RQSzE0CQkoMSA8PCAyNikJLyogQjogRVRNIFRyYWNlIFBhY2tldCBQb3J0IDE0ICovCisjZGVmaW5lIEFUOTFfUEQyN19UUEsxNQkJKDEgPDwgMjcpCS8qIEI6IEVUTSBUcmFjZSBQYWNrZXQgUG9ydCAxNSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMF9wZGMuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMF9wZGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTExNTBkNDQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfcGRjLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMF9wZGMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBJdmFuIEtva3NoYXlza3kKKyAqIENvcHlyaWdodCAoQykgU0FOIFBlb3BsZQorICoKKyAqIFBlcmlwaGVyYWwgRGF0YSBDb250cm9sbGVyIChQREMpIHJlZ2lzdGVycy4KKyAqIEJhc2VkIG9uIEFUOTFSTTkyMDAgZGF0YXNoZWV0IHJldmlzaW9uIEUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIEFUOTFSTTkyMDBfUERDX0gKKyNkZWZpbmUgQVQ5MVJNOTIwMF9QRENfSAorCisjZGVmaW5lIEFUOTFfUERDX1JQUgkJMHgxMDAJLyogUmVjZWl2ZSBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfUERDX1JDUgkJMHgxMDQJLyogUmVjZWl2ZSBDb3VudGVyIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfUERDX1RQUgkJMHgxMDgJLyogVHJhbnNtaXQgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1BEQ19UQ1IJCTB4MTBjCS8qIFRyYW5zbWl0IENvdW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9QRENfUk5QUgkJMHgxMTAJLyogUmVjZWl2ZSBOZXh0IFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9QRENfUk5DUgkJMHgxMTQJLyogUmVjZWl2ZSBOZXh0IENvdW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9QRENfVE5QUgkJMHgxMTgJLyogVHJhbnNtaXQgTmV4dCBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfUERDX1ROQ1IJCTB4MTFjCS8qIFRyYW5zbWl0IE5leHQgQ291bnRlciBSZWdpc3RlciAqLworCisjZGVmaW5lIEFUOTFfUERDX1BUQ1IJCTB4MTIwCS8qIFRyYW5zZmVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfUERDX1JYVEVOCQkoMSA8PCAwKQkvKiBSZWNlaXZlciBUcmFuc2ZlciBFbmFibGUgKi8KKyNkZWZpbmUJCUFUOTFfUERDX1JYVERJUwkJKDEgPDwgMSkJLyogUmVjZWl2ZXIgVHJhbnNmZXIgRGlzYWJsZSAqLworI2RlZmluZQkJQVQ5MV9QRENfVFhURU4JCSgxIDw8IDgpCS8qIFRyYW5zbWl0dGVyIFRyYW5zZmVyIEVuYWJsZSAqLworI2RlZmluZQkJQVQ5MV9QRENfVFhURElTCQkoMSA8PCA5KQkvKiBUcmFuc21pdHRlciBUcmFuc2ZlciBEaXNhYmxlICovCisKKyNkZWZpbmUgQVQ5MV9QRENfUFRTUgkJMHgxMjQJLyogVHJhbnNmZXIgU3RhdHVzIFJlZ2lzdGVyICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwX3N5cy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwX3N5cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZmZmZGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfc3lzLmgKQEAgLTAsMCArMSwzMjggQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfc3lzLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSXZhbiBLb2tzaGF5c2t5CisgKiBDb3B5cmlnaHQgKEMpIFNBTiBQZW9wbGUKKyAqCisgKiBTeXN0ZW0gcGVyaXBoZXJhbHMgcmVnaXN0ZXJzLgorICogQmFzZWQgb24gQVQ5MVJNOTIwMCBkYXRhc2hlZXQgcmV2aXNpb24gRS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgQVQ5MVJNOTIwMF9TWVNfSAorI2RlZmluZSBBVDkxUk05MjAwX1NZU19ICisKKy8qCisgKiBBZHZhbmNlZCBJbnRlcnJ1cHQgQ29udHJvbGxlci4KKyAqLworI2RlZmluZSBBVDkxX0FJQwkweDAwMAorCisjZGVmaW5lIEFUOTFfQUlDX1NNUihuKQkJKEFUOTFfQUlDICsgKChuKSAqIDQpKQkvKiBTb3VyY2UgTW9kZSBSZWdpc3RlcnMgMC0zMSAqLworI2RlZmluZQkJQVQ5MV9BSUNfUFJJT1IJCSg3IDw8IDApCQkvKiBQcmlvcml0eSBMZXZlbCAqLworI2RlZmluZQkJQVQ5MV9BSUNfU1JDVFlQRQkoMyA8PCA1KQkJLyogSW50ZXJydXB0IFNvdXJjZSBUeXBlICovCisjZGVmaW5lCQkJQVQ5MV9BSUNfU1JDVFlQRV9MT1cJCSgwIDw8IDUpCisjZGVmaW5lCQkJQVQ5MV9BSUNfU1JDVFlQRV9GQUxMSU5HCSgxIDw8IDUpCisjZGVmaW5lCQkJQVQ5MV9BSUNfU1JDVFlQRV9ISUdICQkoMiA8PCA1KQorI2RlZmluZQkJCUFUOTFfQUlDX1NSQ1RZUEVfUklTSU5HCQkoMyA8PCA1KQorCisjZGVmaW5lIEFUOTFfQUlDX1NWUihuKQkJKEFUOTFfQUlDICsgMHg4MCArICgobikgKiA0KSkJLyogU291cmNlIFZlY3RvciBSZWdpc3RlcnMgMC0zMSAqLworI2RlZmluZSBBVDkxX0FJQ19JVlIJCShBVDkxX0FJQyArIDB4MTAwKQkvKiBJbnRlcnJ1cHQgVmVjdG9yIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfQUlDX0ZWUgkJKEFUOTFfQUlDICsgMHgxMDQpCS8qIEZhc3QgSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0FJQ19JU1IJCShBVDkxX0FJQyArIDB4MTA4KQkvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX0FJQ19JUlFJRAkJKDB4MWYgPDwgMCkJCS8qIEN1cnJlbnQgSW50ZXJydXB0IElkZW50aWZpZXIgKi8KKworI2RlZmluZSBBVDkxX0FJQ19JUFIJCShBVDkxX0FJQyArIDB4MTBjKQkvKiBJbnRlcnJ1cHQgUGVuZGluZyBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0FJQ19JTVIJCShBVDkxX0FJQyArIDB4MTEwKQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0FJQ19DSVNSCQkoQVQ5MV9BSUMgKyAweDExNCkJLyogQ29yZSBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX0FJQ19ORklRCQkoMSA8PCAwKQkJLyogbkZJUSBTdGF0dXMgKi8KKyNkZWZpbmUJCUFUOTFfQUlDX05JUlEJCSgxIDw8IDEpCQkvKiBuSVJRIFN0YXR1cyAqLworCisjZGVmaW5lIEFUOTFfQUlDX0lFQ1IJCShBVDkxX0FJQyArIDB4MTIwKQkvKiBJbnRlcnJ1cHQgRW5hYmxlIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9BSUNfSURDUgkJKEFUOTFfQUlDICsgMHgxMjQpCS8qIEludGVycnVwdCBEaXNhYmxlIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9BSUNfSUNDUgkJKEFUOTFfQUlDICsgMHgxMjgpCS8qIEludGVycnVwdCBDbGVhciBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfQUlDX0lTQ1IJCShBVDkxX0FJQyArIDB4MTJjKQkvKiBJbnRlcnJ1cHQgU2V0IENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9BSUNfRU9JQ1IJCShBVDkxX0FJQyArIDB4MTMwKQkvKiBFbmQgb2YgSW50ZXJydXB0IENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9BSUNfU1BVCQkoQVQ5MV9BSUMgKyAweDEzNCkJLyogU3B1cmlvdXMgSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0FJQ19EQ1IJCShBVDkxX0FJQyArIDB4MTM4KQkvKiBEZWJ1ZyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX0FJQ19EQ1JfUFJPVAkoMSA8PCAwKQkJLyogUHJvdGVjdGlvbiBNb2RlICovCisjZGVmaW5lCQlBVDkxX0FJQ19EQ1JfR01TSwkoMSA8PCAxKQkJLyogR2VuZXJhbCBNYXNrICovCisKKworLyoKKyAqIERlYnVnIFVuaXQuCisgKi8KKyNkZWZpbmUgQVQ5MV9EQkdVCTB4MjAwCisKKyNkZWZpbmUgQVQ5MV9EQkdVX0NSCQkoQVQ5MV9EQkdVICsgMHgwMCkJLyogQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0RCR1VfTVIJCShBVDkxX0RCR1UgKyAweDA0KQkvKiBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfREJHVV9JRVIJCShBVDkxX0RCR1UgKyAweDA4KQkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX0RCR1VfVFhSRFkJCSgxIDw8IDEpCQkvKiBUcmFuc21pdHRlciBSZWFkeSAqLworI2RlZmluZQkJQVQ5MV9EQkdVX1RYRU1QVFkJKDEgPDwgOSkJCS8qIFRyYW5zbWl0dGVyIEVtcHR5ICovCisjZGVmaW5lIEFUOTFfREJHVV9JRFIJCShBVDkxX0RCR1UgKyAweDBjKQkvKiBJbnRlcnJ1cHQgRGlzYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0RCR1VfSU1SCQkoQVQ5MV9EQkdVICsgMHgxMCkJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9EQkdVX1NSCQkoQVQ5MV9EQkdVICsgMHgxNCkJLyogU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfREJHVV9SSFIJCShBVDkxX0RCR1UgKyAweDE4KQkvKiBSZWNlaXZlciBIb2xkaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfREJHVV9USFIJCShBVDkxX0RCR1UgKyAweDFjKQkvKiBUcmFuc21pdHRlciBIb2xkaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfREJHVV9CUkdSCQkoQVQ5MV9EQkdVICsgMHgyMCkJLyogQmF1ZCBSYXRlIEdlbmVyYXRvciBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0RCR1VfQ0lEUgkJKEFUOTFfREJHVSArIDB4NDApCS8qIENoaXAgSUQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9EQkdVX0VYSUQJCShBVDkxX0RCR1UgKyAweDQ0KQkvKiBDaGlwIElEIEV4dGVuc2lvbiBSZWdpc3RlciAqLworCisKKy8qCisgKiBQSU8gQ29udHJvbGxlcnMuCisgKi8KKyNkZWZpbmUgQVQ5MV9QSU9BCTB4NDAwCisjZGVmaW5lIEFUOTFfUElPQgkweDYwMAorI2RlZmluZSBBVDkxX1BJT0MJMHg4MDAKKyNkZWZpbmUgQVQ5MV9QSU9ECTB4YTAwCisKKyNkZWZpbmUgUElPX1BFUgkJMHgwMAkvKiBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElPX1BEUgkJMHgwNAkvKiBEaXNhYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIFBJT19QU1IJCTB4MDgJLyogU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBJT19PRVIJCTB4MTAJLyogT3V0cHV0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBQSU9fT0RSCQkweDE0CS8qIE91dHB1dCBEaXNhYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIFBJT19PU1IJCTB4MTgJLyogT3V0cHV0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQSU9fSUZFUgkweDIwCS8qIEdsaXRjaCBJbnB1dCBGaWx0ZXIgRW5hYmxlICovCisjZGVmaW5lIFBJT19JRkRSCTB4MjQJLyogR2xpdGNoIElucHV0IEZpbHRlciBEaXNhYmxlICovCisjZGVmaW5lIFBJT19JRlNSCTB4MjgJLyogR2xpdGNoIElucHV0IEZpbHRlciBTdGF0dXMgKi8KKyNkZWZpbmUgUElPX1NPRFIJMHgzMAkvKiBTZXQgT3V0cHV0IERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElPX0NPRFIJMHgzNAkvKiBDbGVhciBPdXRwdXQgRGF0YSBSZWdpc3RlciAqLworI2RlZmluZSBQSU9fT0RTUgkweDM4CS8qIE91dHB1dCBEYXRhIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQSU9fUERTUgkweDNjCS8qIFBpbiBEYXRhIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQSU9fSUVSCQkweDQwCS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElPX0lEUgkJMHg0NAkvKiBJbnRlcnJ1cHQgRGlzYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBQSU9fSU1SCQkweDQ4CS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIFBJT19JU1IJCTB4NGMJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQSU9fTURFUgkweDUwCS8qIE11bHRpLWRyaXZlciBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElPX01ERFIJMHg1NAkvKiBNdWx0aS1kcml2ZXIgRGlzYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBQSU9fTURTUgkweDU4CS8qIE11bHRpLWRyaXZlciBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElPX1BVRFIJMHg2MAkvKiBQdWxsLXVwIERpc2FibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElPX1BVRVIJMHg2NAkvKiBQdWxsLXVwIEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBQSU9fUFVTUgkweDY4CS8qIFB1bGwtdXAgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBJT19BU1IJCTB4NzAJLyogUGVyaXBoZXJhbCBBIFNlbGVjdCBSZWdpc3RlciAqLworI2RlZmluZSBQSU9fQlNSCQkweDc0CS8qIFBlcmlwaGVyYWwgQiBTZWxlY3QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElPX0FCU1IJMHg3OAkvKiBBQiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElPX09XRVIJMHhhMAkvKiBPdXRwdXQgV3JpdGUgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIFBJT19PV0RSCTB4YTQJLyogT3V0cHV0IFdyaXRlIERpc2FibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElPX09XU1IJMHhhOAkvKiBPdXRwdXQgV3JpdGUgU3RhdHVzIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgQVQ5MV9QSU9fUChuKQkoMSA8PCAobikpCisKKworLyoKKyAqIFBvd2VyIE1hbmFnZW1lbnQgQ29udHJvbGxlci4KKyAqLworI2RlZmluZQlBVDkxX1BNQwkweGMwMAorCisjZGVmaW5lCUFUOTFfUE1DX1NDRVIJCShBVDkxX1BNQyArIDB4MDApCS8qIFN5c3RlbSBDbG9jayBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQVQ5MV9QTUNfU0NEUgkJKEFUOTFfUE1DICsgMHgwNCkJLyogU3lzdGVtIENsb2NrIERpc2FibGUgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlBVDkxX1BNQ19TQ1NSCQkoQVQ5MV9QTUMgKyAweDA4KQkvKiBTeXN0ZW0gQ2xvY2sgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1BNQ19QQ0sJCSgxIDw8ICAwKQkJLyogUHJvY2Vzc29yIENsb2NrICovCisjZGVmaW5lCQlBVDkxX1BNQ19VRFAJCSgxIDw8ICAxKQkJLyogVVNCIERldmNpY2UgUG9ydCBDbG9jayAqLworI2RlZmluZQkJQVQ5MV9QTUNfTUNLVURQCQkoMSA8PCAgMikJCS8qIFVTQiBEZXZpY2UgUG9ydCBNYXN0ZXIgQ2xvY2sgQXV0b21hdGljIERpc2FibGUgb24gU3VzcGVuZCAqLworI2RlZmluZQkJQVQ5MV9QTUNfVUhQCQkoMSA8PCAgNCkJCS8qIFVTQiBIb3N0IFBvcnQgQ2xvY2sgKi8KKyNkZWZpbmUJCUFUOTFfUE1DX1BDSzAJCSgxIDw8ICA4KQkJLyogUHJvZ3JhbW1hYmxlIENsb2NrIDAgKi8KKyNkZWZpbmUJCUFUOTFfUE1DX1BDSzEJCSgxIDw8ICA5KQkJLyogUHJvZ3JhbW1hYmxlIENsb2NrIDEgKi8KKyNkZWZpbmUJCUFUOTFfUE1DX1BDSzIJCSgxIDw8IDEwKQkJLyogUHJvZ3JhbW1hYmxlIENsb2NrIDIgKi8KKyNkZWZpbmUJCUFUOTFfUE1DX1BDSzMJCSgxIDw8IDExKQkJLyogUHJvZ3JhbW1hYmxlIENsb2NrIDMgKi8KKworI2RlZmluZQlBVDkxX1BNQ19QQ0VSCQkoQVQ5MV9QTUMgKyAweDEwKQkvKiBQZXJpcGhlcmFsIENsb2NrIEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZQlBVDkxX1BNQ19QQ0RSCQkoQVQ5MV9QTUMgKyAweDE0KQkvKiBQZXJpcGhlcmFsIENsb2NrIERpc2FibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQVQ5MV9QTUNfUENTUgkJKEFUOTFfUE1DICsgMHgxOCkJLyogUGVyaXBoZXJhbCBDbG9jayBTdGF0dXMgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlBVDkxX0NLR1JfTU9SCQkoQVQ5MV9QTUMgKyAweDIwKQkvKiBNYWluIE9zY2lsbGF0b3IgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfUE1DX01PU0NFTgkJKDEgICAgPDwgMCkJCS8qIE1haW4gT3NjaWxsYXRvciBFbmFibGUgKi8KKyNkZWZpbmUJCUFUOTFfUE1DX09TQ09VTlQJKDB4ZmYgPDwgOCkJCS8qIE1haW4gT3NjaWxsYXRvciBTdGFydC11cCBUaW1lICovCisKKyNkZWZpbmUJQVQ5MV9DS0dSX01DRlIJCShBVDkxX1BNQyArIDB4MjQpCS8qIE1haW4gQ2xvY2sgRnJlcXVlbmN5IFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1BNQ19NQUlORgkJKDB4ZmZmZiA8PCAgMCkJCS8qIE1haW4gQ2xvY2sgRnJlcXVlbmN5ICovCisjZGVmaW5lCQlBVDkxX1BNQ19NQUlOUkRZCSgxCTw8IDE2KQkJLyogTWFpbiBDbG9jayBSZWFkeSAqLworCisjZGVmaW5lCUFUOTFfQ0tHUl9QTExBUgkJKEFUOTFfUE1DICsgMHgyOCkJLyogUExMIEEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQVQ5MV9DS0dSX1BMTEJSCQkoQVQ5MV9QTUMgKyAweDJjKQkvKiBQTEwgQiBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9QTUNfRElWCQkoMHhmZiAgPDwgIDApCQkvKiBEaXZpZGVyICovCisjZGVmaW5lCQlBVDkxX1BNQ19QTExDT1VOVAkoMHgzZiAgPDwgIDgpCQkvKiBQTEwgQ291bnRlciAqLworI2RlZmluZQkJQVQ5MV9QTUNfT1VUCQkoMyAgICAgPDwgMTQpCQkvKiBQTEwgQ2xvY2sgRnJlcXVlbmN5IFJhbmdlICovCisjZGVmaW5lCQlBVDkxX1BNQ19NVUwJCSgweDdmZiA8PCAxNikJCS8qIFBMTCBNdWx0aXBsaWVyICovCisjZGVmaW5lCQlBVDkxX1BNQ19VU0I5Nk0JCSgxICAgICA8PCAyOCkJCS8qIERpdmlkZXIgYnkgMiBFbmFibGUgKFBMTEIgb25seSkgKi8KKworI2RlZmluZQlBVDkxX1BNQ19NQ0tSCQkoQVQ5MV9QTUMgKyAweDMwKQkvKiBNYXN0ZXIgQ2xvY2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfUE1DX0NTUwkJKDMgPDwgIDApCQkvKiBNYXN0ZXIgQ2xvY2sgU2VsZWN0aW9uICovCisjZGVmaW5lCQkJQVQ5MV9QTUNfQ1NTX1NMT1cJCSgwIDw8IDApCisjZGVmaW5lCQkJQVQ5MV9QTUNfQ1NTX01BSU4JCSgxIDw8IDApCisjZGVmaW5lCQkJQVQ5MV9QTUNfQ1NTX1BMTEEJCSgyIDw8IDApCisjZGVmaW5lCQkJQVQ5MV9QTUNfQ1NTX1BMTEIJCSgzIDw8IDApCisjZGVmaW5lCQlBVDkxX1BNQ19QUkVTCQkoNyA8PCAgMikJCS8qIE1hc3RlciBDbG9jayBQcmVzY2FsZXIgKi8KKyNkZWZpbmUgCQlBVDkxX1BNQ19QUkVTXzEJCQkoMCA8PCAyKQorI2RlZmluZQkJCUFUOTFfUE1DX1BSRVNfMgkJCSgxIDw8IDIpCisjZGVmaW5lCQkJQVQ5MV9QTUNfUFJFU180CQkJKDIgPDwgMikKKyNkZWZpbmUJCQlBVDkxX1BNQ19QUkVTXzgJCQkoMyA8PCAyKQorI2RlZmluZQkJCUFUOTFfUE1DX1BSRVNfMTYJCSg0IDw8IDIpCisjZGVmaW5lCQkJQVQ5MV9QTUNfUFJFU18zMgkJKDUgPDwgMikKKyNkZWZpbmUJCQlBVDkxX1BNQ19QUkVTXzY0CQkoNiA8PCAyKQorI2RlZmluZQkJQVQ5MV9QTUNfTURJVgkJKDMgPDwgIDgpCQkvKiBNYXN0ZXIgQ2xvY2sgRGl2aXNpb24gKi8KKyNkZWZpbmUJCQlBVDkxX1BNQ19NRElWXzEJCQkoMCA8PCA4KQorI2RlZmluZQkJCUFUOTFfUE1DX01ESVZfMgkJCSgxIDw8IDgpCisjZGVmaW5lCQkJQVQ5MV9QTUNfTURJVl8zCQkJKDIgPDwgOCkKKyNkZWZpbmUJCQlBVDkxX1BNQ19NRElWXzQJCQkoMyA8PCA4KQorCisjZGVmaW5lCUFUOTFfUE1DX1BDS1IobikJKEFUOTFfUE1DICsgMHg0MCArICgobikgKiA0KSkJLyogUHJvZ3JhbW1hYmxlIENsb2NrIDAtMyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUJQVQ5MV9QTUNfSUVSCQkoQVQ5MV9QTUMgKyAweDYwKQkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lCUFUOTFfUE1DX0lEUgkJKEFUOTFfUE1DICsgMHg2NCkJLyogSW50ZXJydXB0IERpc2FibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQVQ5MV9QTUNfU1IJCShBVDkxX1BNQyArIDB4NjgpCS8qIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9QTUNfTU9TQ1MJCSgxIDw8ICAwKQkJLyogTU9TQ1MgRmxhZyAqLworI2RlZmluZQkJQVQ5MV9QTUNfTE9DS0EJCSgxIDw8ICAxKQkJLyogUExMQSBMb2NrICovCisjZGVmaW5lCQlBVDkxX1BNQ19MT0NLQgkJKDEgPDwgIDIpCQkvKiBQTExCIExvY2sgKi8KKyNkZWZpbmUJCUFUOTFfUE1DX01DS1JEWQkJKDEgPDwgIDMpCQkvKiBNYXN0ZXIgQ2xvY2sgKi8KKyNkZWZpbmUJCUFUOTFfUE1DX1BDSzBSRFkJKDEgPDwgIDgpCQkvKiBQcm9ncmFtbWFibGUgQ2xvY2sgMCAqLworI2RlZmluZQkJQVQ5MV9QTUNfUENLMVJEWQkoMSA8PCAgOSkJCS8qIFByb2dyYW1tYWJsZSBDbG9jayAxICovCisjZGVmaW5lCQlBVDkxX1BNQ19QQ0syUkRZCSgxIDw8IDEwKQkJLyogUHJvZ3JhbW1hYmxlIENsb2NrIDIgKi8KKyNkZWZpbmUJCUFUOTFfUE1DX1BDSzNSRFkJKDEgPDwgMTEpCQkvKiBQcm9ncmFtbWFibGUgQ2xvY2sgMyAqLworI2RlZmluZQlBVDkxX1BNQ19JTVIJCShBVDkxX1BNQyArIDB4NmMpCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisKKworLyoKKyAqIFN5c3RlbSBUaW1lci4KKyAqLworI2RlZmluZQlBVDkxX1NUCQkweGQwMAorCisjZGVmaW5lCUFUOTFfU1RfQ1IJCShBVDkxX1NUICsgMHgwMCkJLyogQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSAJQVQ5MV9TVF9XRFJTVAkJKDEgPDwgMCkJCS8qIFdhdGNoZG9nIFRpbWVyIFJlc3RhcnQgKi8KKyNkZWZpbmUJQVQ5MV9TVF9QSU1SCQkoQVQ5MV9TVCArIDB4MDQpCS8qIFBlcmlvZCBJbnRlcnZhbCBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1NUX1BJVgkJKDB4ZmZmZiA8PCAgMCkJCS8qIFBlcmlvZCBJbnRlcnZhbCBWYWx1ZSAqLworI2RlZmluZQlBVDkxX1NUX1dETVIJCShBVDkxX1NUICsgMHgwOCkJLyogV2F0Y2hkb2cgTW9kZSBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9TVF9XRFYJCSgweGZmZmYgPDwgIDApCQkvKiBXYXRjaGRvZyBDb3VudGVyIFZhbHVlICovCisjZGVmaW5lCQlBVDkxX1NUX1JTVEVOCQkoMQk8PCAxNikJCS8qIFJlc2V0IEVuYWJsZSAqLworI2RlZmluZQkJQVQ5MV9TVF9FWFRFTgkJKDEJPDwgMTcpCQkvKiBFeHRlcm5hbCBTaWduYWwgQXNzZXJ0aW9uIEVuYWJsZSAqLworI2RlZmluZQlBVDkxX1NUX1JUTVIJCShBVDkxX1NUICsgMHgwYykJLyogUmVhbC10aW1lIE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfU1RfUlRQUkVTCQkoMHhmZmZmIDw8ICAwKQkJLyogUmVhbC10aW1lIFByZXNjYWxhciBWYWx1ZSAqLworI2RlZmluZQlBVDkxX1NUX1NSCQkoQVQ5MV9TVCArIDB4MTApCS8qIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9TVF9QSVRTCQkoMSA8PCAwKQkJLyogUGVyaW9kIEludGVydmFsIFRpbWVyIFN0YXR1cyAqLworI2RlZmluZQkJQVQ5MV9TVF9XRE9WRgkJKDEgPDwgMSkgCQkvKiBXYXRjaGRvZyBPdmVyZmxvdyAqLworI2RlZmluZQkJQVQ5MV9TVF9SVFRJTkMJCSgxIDw8IDIpIAkJLyogUmVhbC10aW1lIFRpbWVyIEluY3JlbWVudCAqLworI2RlZmluZQkJQVQ5MV9TVF9BTE1TCQkoMSA8PCAzKSAJCS8qIEFsYXJtIFN0YXR1cyAqLworI2RlZmluZQlBVDkxX1NUX0lFUgkJKEFUOTFfU1QgKyAweDE0KQkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lCUFUOTFfU1RfSURSCQkoQVQ5MV9TVCArIDB4MTgpCS8qIEludGVycnVwdCBEaXNhYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lCUFUOTFfU1RfSU1SCQkoQVQ5MV9TVCArIDB4MWMpCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lCUFUOTFfU1RfUlRBUgkJKEFUOTFfU1QgKyAweDIwKQkvKiBSZWFsLXRpbWUgQWxhcm0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfU1RfQUxNVgkJKDB4ZmZmZmYgPDwgMCkJCS8qIEFsYXJtIFZhbHVlICovCisjZGVmaW5lCUFUOTFfU1RfQ1JUUgkJKEFUOTFfU1QgKyAweDI0KQkvKiBDdXJyZW50IFJlYWwtdGltZSBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9TVF9DUlRWCQkoMHhmZmZmZiA8PCAwKQkJLyogQ3VycmVudCBSZWFsLVRpbWUgVmFsdWUgKi8KKworCisvKgorICogUmVhbC10aW1lIENsb2NrLgorICovCisjZGVmaW5lCUFUOTFfUlRDCTB4ZTAwCisKKyNkZWZpbmUJQVQ5MV9SVENfQ1IJCShBVDkxX1JUQyArIDB4MDApCS8qIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfUlRDX1VQRFRJTQkJKDEgPDwgIDApCQkvKiBVcGRhdGUgUmVxdWVzdCBUaW1lIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1JUQ19VUERDQUwJCSgxIDw8ICAxKQkJLyogVXBkYXRlIFJlcXVlc3QgQ2FsZW5kYXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfUlRDX1RJTUVWU0VMCSgzIDw8ICA4KQkJLyogVGltZSBFdmVudCBTZWxlY3Rpb24gKi8KKyNkZWZpbmUJCQlBVDkxX1JUQ19USU1FVlNFTF9NSU5VVEUJKDAgPDwgOCkKKyNkZWZpbmUgCQlBVDkxX1JUQ19USU1FVlNFTF9IT1VSCQkoMSA8PCA4KQorI2RlZmluZSAJCUFUOTFfUlRDX1RJTUVWU0VMX0RBWTI0CQkoMiA8PCA4KQorI2RlZmluZSAJCUFUOTFfUlRDX1RJTUVWU0VMX0RBWTEyCQkoMyA8PCA4KQorI2RlZmluZQkJQVQ5MV9SVENfQ0FMRVZTRUwJKDMgPDwgMTYpCQkvKiBDYWxlbmRhciBFdmVudCBTZWxlY3Rpb24gKi8KKyNkZWZpbmUgCQlBVDkxX1JUQ19DQUxFVlNFTF9XRUVLCQkoMCA8PCAxNikKKyNkZWZpbmUgCQlBVDkxX1JUQ19DQUxFVlNFTF9NT05USAkJKDEgPDwgMTYpCisjZGVmaW5lIAkJQVQ5MV9SVENfQ0FMRVZTRUxfWUVBUgkJKDIgPDwgMTYpCisKKyNkZWZpbmUJQVQ5MV9SVENfTVIJCShBVDkxX1JUQyArIDB4MDQpCS8qIE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgCUFUOTFfUlRDX0hSTU9ECQkoMSA8PCAgMCkJCS8qIDEyLzI0IEhvdXIgTW9kZSAqLworCisjZGVmaW5lCUFUOTFfUlRDX1RJTVIJCShBVDkxX1JUQyArIDB4MDgpCS8qIFRpbWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfUlRDX1NFQwkJKDB4N2YgPDwgIDApCQkvKiBDdXJyZW50IFNlY29uZCAqLworI2RlZmluZQkJQVQ5MV9SVENfTUlOCQkoMHg3ZiA8PCAgOCkJCS8qIEN1cnJlbnQgTWludXRlICovCisjZGVmaW5lCQlBVDkxX1JUQ19IT1VSIAkJKDB4M2YgPDwgMTYpCQkvKiBDdXJyZW50IEhvdXIgKi8KKyNkZWZpbmUJCUF0OTFfUlRDX0FNUE0JCSgxICAgIDw8IDIyKQkJLyogQW50ZSBNZXJpZGllbSBQb3N0IE1lcmlkaWVtIEluZGljYXRvciAqLworCisjZGVmaW5lCUFUOTFfUlRDX0NBTFIJCShBVDkxX1JUQyArIDB4MGMpCS8qIENhbGVuZGFyIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1JUQ19DRU5UCQkoMHg3ZiA8PCAgMCkJCS8qIEN1cnJlbnQgQ2VudHVyeSAqLworI2RlZmluZQkJQVQ5MV9SVENfWUVBUgkJKDB4ZmYgPDwgIDgpCQkvKiBDdXJyZW50IFllYXIgKi8KKyNkZWZpbmUJCUFUOTFfUlRDX01PTlRICQkoMHgxZiA8PCAxNikJCS8qIEN1cnJlbnQgTW9udGggKi8KKyNkZWZpbmUJCUFUOTFfUlRDX0RBWQkJKDcgICAgPDwgMjEpCQkvKiBDdXJyZW50IERheSAqLworI2RlZmluZQkJQVQ5MV9SVENfREFURQkJKDB4M2YgPDwgMjQpCQkvKiBDdXJyZW50IERhdGUgKi8KKworI2RlZmluZQlBVDkxX1JUQ19USU1BTFIJCShBVDkxX1JUQyArIDB4MTApCS8qIFRpbWUgQWxhcm0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfUlRDX1NFQ0VOCQkoMSA8PCAgNykJCS8qIFNlY29uZCBBbGFybSBFbmFibGUgKi8KKyNkZWZpbmUJCUFUOTFfUlRDX01JTkVOCQkoMSA8PCAxNSkJCS8qIE1pbnV0ZSBBbGFybSBFbmFibGUgKi8KKyNkZWZpbmUJCUFUOTFfUlRDX0hPVVJFTgkJKDEgPDwgMjMpCQkvKiBIb3VyIEFsYXJtIEVuYWJsZSAqLworCisjZGVmaW5lCUFUOTFfUlRDX0NBTEFMUgkJKEFUOTFfUlRDICsgMHgxNCkJLyogQ2FsZW5kYXIgQWxhcm0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfUlRDX01USEVOCQkoMSA8PCAyMykJCS8qIE1vbnRoIEFsYXJtIEVuYWJsZSAqLworI2RlZmluZQkJQVQ5MV9SVENfREFURUVOCQkoMSA8PCAzMSkJCS8qIERhdGUgQWxhcm0gRW5hYmxlICovCisKKyNkZWZpbmUJQVQ5MV9SVENfU1IJCShBVDkxX1JUQyArIDB4MTgpCS8qIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9SVENfQUNLVVBECQkoMSA8PCAgMCkJCS8qIEFja25vd2xlZGdlIGZvciBVcGRhdGUgKi8KKyNkZWZpbmUJCUFUOTFfUlRDX0FMQVJNCQkoMSA8PCAgMSkJCS8qIEFsYXJtIEZsYWcgKi8KKyNkZWZpbmUJCUFUOTFfUlRDX1NFQ0VWCQkoMSA8PCAgMikJCS8qIFNlY29uZCBFdmVudCAqLworI2RlZmluZQkJQVQ5MV9SVENfVElNRVYJCSgxIDw8ICAzKQkJLyogVGltZSBFdmVudCAqLworI2RlZmluZQkJQVQ5MV9SVENfQ0FMRVYJCSgxIDw8ICA0KQkJLyogQ2FsZW5kYXIgRXZlbnQgKi8KKworI2RlZmluZQlBVDkxX1JUQ19TQ0NSCQkoQVQ5MV9SVEMgKyAweDFjKQkvKiBTdGF0dXMgQ2xlYXIgQ29tbWFuZCBSZWdpc3RlciAqLworI2RlZmluZQlBVDkxX1JUQ19JRVIJCShBVDkxX1JUQyArIDB4MjApCS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQVQ5MV9SVENfSURSCQkoQVQ5MV9SVEMgKyAweDI0KQkvKiBJbnRlcnJ1cHQgRGlzYWJsZSBSZWdpc3RlciAqLworI2RlZmluZQlBVDkxX1JUQ19JTVIJCShBVDkxX1JUQyArIDB4MjgpCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQVQ5MV9SVENfVkVSCQkoQVQ5MV9SVEMgKyAweDJjKQkvKiBWYWxpZCBFbnRyeSBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9SVENfTlZUSU0JCSgxIDw8ICAwKQkJLyogTm9uIHZhbGlkIFRpbWUgKi8KKyNkZWZpbmUJCUFUOTFfUlRDX05WQ0FMCQkoMSA8PCAgMSkJCS8qIE5vbiB2YWxpZCBDYWxlbmRhciAqLworI2RlZmluZQkJQVQ5MV9SVENfTlZUSU1BTFIJKDEgPDwgIDIpCQkvKiBOb24gdmFsaWQgVGltZSBBbGFybSAqLworI2RlZmluZQkJQVQ5MV9SVENfTlZDQUxBTFIJKDEgPDwgIDMpCQkvKiBOb24gdmFsaWQgQ2FsZW5kYXIgQWxhcm0gKi8KKworCisvKgorICogTWVtb3J5IENvbnRyb2xsZXIuCisgKi8KKyNkZWZpbmUgQVQ5MV9NQwkJMHhmMDAKKworI2RlZmluZSBBVDkxX01DX1JDUgkJKEFUOTFfTUMgKyAweDAwKQkvKiBNQyBSZW1hcCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX01DX1JDQgkJKDEgPDwgIDApCQkvKiBSZW1hcCBDb21tYW5kIEJpdCAqLworCisjZGVmaW5lIEFUOTFfTUNfQVNSCQkoQVQ5MV9NQyArIDB4MDQpCS8qIE1DIEFib3J0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX01DX0FBU1IJCShBVDkxX01DICsgMHgwOCkJLyogTUMgQWJvcnQgQWRkcmVzcyBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9NQ19NUFIJCShBVDkxX01DICsgMHgwYykJLyogTUMgTWFzdGVyIFByaW9yaXR5IFJlZ2lzdGVyICovCisKKy8qIEV4dGVybmFsIEJ1cyBJbnRlcmZhY2UgKEVCSSkgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFUOTFfRUJJX0NTQQkJKEFUOTFfTUMgKyAweDYwKQkvKiBDaGlwIFNlbGVjdCBBc3NpZ25tZW50IFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX0VCSV9DUzBBCQkoMSA8PCAwKQkJLyogQ2hpcCBTZWxlY3QgMCBBc3NpZ25tZW50ICovCisjZGVmaW5lCQkJQVQ5MV9FQklfQ1MwQV9TTUMJCSgwIDw8IDApCisjZGVmaW5lCQkJQVQ5MV9FQklfQ1MwQV9CRkMJCSgxIDw8IDApCisjZGVmaW5lCQlBVDkxX0VCSV9DUzFBCQkoMSA8PCAxKQkJLyogQ2hpcCBTZWxlY3QgMSBBc3NpZ25tZW50ICovCisjZGVmaW5lCQkJQVQ5MV9FQklfQ1MxQV9TTUMJCSgwIDw8IDEpCisjZGVmaW5lCQkJQVQ5MV9FQklfQ1MxQV9TRFJBTUMJCSgxIDw8IDEpCisjZGVmaW5lCQlBVDkxX0VCSV9DUzNBCQkoMSA8PCAzKQkJLyogQ2hpcCBTZWxlY3QgMiBBc3NpZ25tZW50ICovCisjZGVmaW5lCQkJQVQ5MV9FQklfQ1MzQV9TTUMJCSgwIDw8IDMpCisjZGVmaW5lCQkJQVQ5MV9FQklfQ1MzQV9TTUNfU01BUlRNRURJQQkoMSA8PCAzKQorI2RlZmluZQkJQVQ5MV9FQklfQ1M0QQkJKDEgPDwgNCkJCS8qIENoaXAgU2VsZWN0IDMgQXNzaWdubWVudCAqLworI2RlZmluZQkJCUFUOTFfRUJJX0NTNEFfU01DCQkoMCA8PCA0KQorI2RlZmluZQkJCUFUOTFfRUJJX0NTNEFfU01DX0NPTVBBQ1RGTEFTSAkoMSA8PCA0KQorI2RlZmluZSBBVDkxX0VCSV9DRkdSCQkoQVQ5MV9NQyArIDB4NjQpCS8qIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfRUJJX0RCUFVDCQkoMSA8PCAwKQkJLyogRGF0YSBCdXMgUHVsbC1VcCBDb25maWd1cmF0aW9uICovCisKKy8qIFN0YXRpYyBNZW1vcnkgQ29udHJvbGxlciAoU01DKSByZWdpc3RlcnMgKi8KKyNkZWZpbmUJQVQ5MV9TTUNfQ1NSKG4pCQkoQVQ5MV9NQyArIDB4NzAgKyAoKG4pICogNCkpLyogU01DIENoaXAgU2VsZWN0IFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1NNQ19OV1MJCSgweDdmIDw8ICAwKQkJLyogTnVtYmVyIG9mIFdhaXQgU3RhdGVzICovCisjZGVmaW5lCQlBVDkxX1NNQ19XU0VOCQkoMSAgICA8PCAgNykJCS8qIFdhaXQgU3RhdGUgRW5hYmxlICovCisjZGVmaW5lCQlBVDkxX1NNQ19UREYJCSgweGYgIDw8ICA4KQkJLyogRGF0YSBGbG9hdCBUaW1lICovCisjZGVmaW5lCQlBVDkxX1NNQ19CQVQJCSgxICAgIDw8IDEyKQkJLyogQnl0ZSBBY2Nlc3MgVHlwZSAqLworI2RlZmluZQkJQVQ5MV9TTUNfREJXCQkoMyAgICA8PCAxMykJCS8qIERhdGEgQnVzIFdpZHRoICovCisjZGVmaW5lCQkJQVQ5MV9TTUNfREJXXzE2CQkoMSA8PCAxMykKKyNkZWZpbmUJCQlBVDkxX1NNQ19EQldfOAkJKDIgPDwgMTMpCisjZGVmaW5lCQlBVDkxX1NNQ19EUFIJCSgxIDw8IDE1KQkJLyogRGF0YSBSZWFkIFByb3RvY29sICovCisjZGVmaW5lCQlBVDkxX1NNQ19BQ1NTCQkoMyA8PCAxNikJCS8qIEFkZHJlc3MgdG8gQ2hpcCBTZWxlY3QgU2V0dXAgKi8KKyNkZWZpbmUJCQlBVDkxX1NNQ19BQ1NTX1NURAkoMCA8PCAxNikKKyNkZWZpbmUJCQlBVDkxX1NNQ19BQ1NTXzEJCSgxIDw8IDE2KQorI2RlZmluZQkJCUFUOTFfU01DX0FDU1NfMgkJKDIgPDwgMTYpCisjZGVmaW5lCQkJQVQ5MV9TTUNfQUNTU18zCQkoMyA8PCAxNikKKyNkZWZpbmUJCUFUOTFfU01DX1JXU0VUVVAJKDcgPDwgMjQpCQkvKiBSZWFkICYgV3JpdGUgU2lnbmFsIFRpbWUgU2V0dXAgKi8KKyNkZWZpbmUJCUFUOTFfU01DX1JXSE9MRAkJKDcgPDwgMjgpCQkvKiBSZWFkICYgV3JpdGUgU2lnbmFsIEhvbGQgVGltZSAqLworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwX3VzYXJ0LmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfdXNhcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWY4NTFlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwX3VzYXJ0LmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfdXNhcnQuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBJdmFuIEtva3NoYXlza3kKKyAqIENvcHlyaWdodCAoQykgU0FOIFBlb3BsZQorICoKKyAqIFVTQVJUIHJlZ2lzdGVycy4KKyAqIEJhc2VkIG9uIEFUOTFSTTkyMDAgZGF0YXNoZWV0IHJldmlzaW9uIEUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIEFUOTFSTTkyMDBfVVNBUlRfSAorI2RlZmluZSBBVDkxUk05MjAwX1VTQVJUX0gKKworI2RlZmluZSBBVDkxX1VTX0NSCQkweDAwCQkJLyogQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9VU19SU1RSWAkJKDEgPDwgIDIpCQkvKiBSZXNldCBSZWNlaXZlciAqLworI2RlZmluZQkJQVQ5MV9VU19SU1RUWAkJKDEgPDwgIDMpCQkvKiBSZXNldCBUcmFuc21pdHRlciAqLworI2RlZmluZQkJQVQ5MV9VU19SWEVOCQkoMSA8PCAgNCkJCS8qIFJlY2VpdmVyIEVuYWJsZSAqLworI2RlZmluZQkJQVQ5MV9VU19SWERJUwkJKDEgPDwgIDUpCQkvKiBSZWNlaXZlciBEaXNhYmxlICovCisjZGVmaW5lCQlBVDkxX1VTX1RYRU4JCSgxIDw8ICA2KQkJLyogVHJhbnNtaXR0ZXIgRW5hYmxlICovCisjZGVmaW5lCQlBVDkxX1VTX1RYRElTCQkoMSA8PCAgNykJCS8qIFRyYW5zbWl0dGVyIERpc2FibGUgKi8KKyNkZWZpbmUJCUFUOTFfVVNfUlNUU1RBCQkoMSA8PCAgOCkJCS8qIFJlc2V0IFN0YXR1cyBCaXRzICovCisjZGVmaW5lCQlBVDkxX1VTX1NUVEJSSwkJKDEgPDwgIDkpCQkvKiBTdGFydCBCcmVhayAqLworI2RlZmluZQkJQVQ5MV9VU19TVFBCUksJCSgxIDw8IDEwKQkJLyogU3RvcCBCcmVhayAqLworI2RlZmluZQkJQVQ5MV9VU19TVFRUTwkJKDEgPDwgMTEpCQkvKiBTdGFydCBUaW1lLW91dCAqLworI2RlZmluZQkJQVQ5MV9VU19TRU5EQQkJKDEgPDwgMTIpCQkvKiBTZW5kIEFkZHJlc3MgKi8KKyNkZWZpbmUJCUFUOTFfVVNfUlNUSVQJCSgxIDw8IDEzKQkJLyogUmVzZXQgSXRlcmF0aW9ucyAqLworI2RlZmluZQkJQVQ5MV9VU19SU1ROQUNLCQkoMSA8PCAxNCkJCS8qIFJlc2V0IE5vbiBBY2tub3dsZWRnZSAqLworI2RlZmluZQkJQVQ5MV9VU19SRVRUTwkJKDEgPDwgMTUpCQkvKiBSZWFybSBUaW1lLW91dCAqLworI2RlZmluZQkJQVQ5MV9VU19EVFJFTgkJKDEgPDwgMTYpCQkvKiBEYXRhIFRlcm1pbmFsIFJlYWR5IEVuYWJsZSAqLworI2RlZmluZQkJQVQ5MV9VU19EVFJESVMJCSgxIDw8IDE3KQkJLyogRGF0YSBUZXJtaW5hbCBSZWFkeSBEaXNhYmxlICovCisjZGVmaW5lCQlBVDkxX1VTX1JUU0VOCQkoMSA8PCAxOCkJCS8qIFJlcXVlc3QgVG8gU2VuZCBFbmFibGUgKi8KKyNkZWZpbmUJCUFUOTFfVVNfUlRTRElTCQkoMSA8PCAxOSkJCS8qIFJlcXVlc3QgVG8gU2VuZCBEaXNhYmxlICovCisKKyNkZWZpbmUgQVQ5MV9VU19NUgkJMHgwNAkJCS8qIE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfVVNfVVNNT0RFCQkoMHhmIDw8ICAwKQkJLyogTW9kZSBvZiB0aGUgVVNBUlQgKi8KKyNkZWZpbmUJCQlBVDkxX1VTX1VTTU9ERV9OT1JNQUwJCTAKKyNkZWZpbmUJCQlBVDkxX1VTX1VTTU9ERV9SUzQ4NQkJMQorI2RlZmluZQkJCUFUOTFfVVNfVVNNT0RFX0hXSFMJCTIKKyNkZWZpbmUJCQlBVDkxX1VTX1VTTU9ERV9NT0RFTQkJMworI2RlZmluZQkJCUFUOTFfVVNfVVNNT0RFX0lTTzc4MTZfVDAJNAorI2RlZmluZQkJCUFUOTFfVVNfVVNNT0RFX0lTTzc4MTZfVDEJNgorI2RlZmluZQkJCUFUOTFfVVNfVVNNT0RFX0lSREEJCTgKKyNkZWZpbmUJCUFUOTFfVVNfVVNDTEtTCQkoMyAgIDw8ICA0KQkJLyogQ2xvY2sgU2VsZWN0aW9uICovCisjZGVmaW5lCQlBVDkxX1VTX0NIUkwJCSgzICAgPDwgIDYpCQkvKiBDaGFyYWN0ZXIgTGVuZ3RoICovCisjZGVmaW5lCQkJQVQ5MV9VU19DSFJMXzUJCQkoMCA8PCAgNikKKyNkZWZpbmUJCQlBVDkxX1VTX0NIUkxfNgkJCSgxIDw8ICA2KQorI2RlZmluZQkJCUFUOTFfVVNfQ0hSTF83CQkJKDIgPDwgIDYpCisjZGVmaW5lCQkJQVQ5MV9VU19DSFJMXzgJCQkoMyA8PCAgNikKKyNkZWZpbmUJCUFUOTFfVVNfU1lOQwkJKDEgPDwgIDgpCQkvKiBTeW5jaHJvbm91cyBNb2RlIFNlbGVjdCAqLworI2RlZmluZQkJQVQ5MV9VU19QQVIJCSg3IDw8ICA5KQkJLyogUGFyaXR5IFR5cGUgKi8KKyNkZWZpbmUJCQlBVDkxX1VTX1BBUl9FVkVOCQkoMCA8PCAgOSkKKyNkZWZpbmUJCQlBVDkxX1VTX1BBUl9PREQJCQkoMSA8PCAgOSkKKyNkZWZpbmUJCQlBVDkxX1VTX1BBUl9TUEFDRQkJKDIgPDwgIDkpCisjZGVmaW5lCQkJQVQ5MV9VU19QQVJfTUFSSwkJKDMgPDwgIDkpCisjZGVmaW5lCQkJQVQ5MV9VU19QQVJfTk9ORQkJKDQgPDwgIDkpCisjZGVmaW5lCQkJQVQ5MV9VU19QQVJfTVVMVElfRFJPUAkJKDYgPDwgIDkpCisjZGVmaW5lCQlBVDkxX1VTX05CU1RPUAkJKDMgPDwgMTIpCQkvKiBOdW1iZXIgb2YgU3RvcCBCaXRzICovCisjZGVmaW5lCQkJQVQ5MV9VU19OQlNUT1BfMQkJKDAgPDwgMTIpCisjZGVmaW5lCQkJQVQ5MV9VU19OQlNUT1BfMV81CQkoMSA8PCAxMikKKyNkZWZpbmUJCQlBVDkxX1VTX05CU1RPUF8yCQkoMiA8PCAxMikKKyNkZWZpbmUJCUFUOTFfVVNfQ0hNT0RFCQkoMyA8PCAxNCkJCS8qIENoYW5uZWwgTW9kZSAqLworI2RlZmluZQkJCUFUOTFfVVNfQ0hNT0RFX05PUk1BTAkJKDAgPDwgMTQpCisjZGVmaW5lCQkJQVQ5MV9VU19DSE1PREVfRUNITwkJKDEgPDwgMTQpCisjZGVmaW5lCQkJQVQ5MV9VU19DSE1PREVfTE9DX0xPT1AJCSgyIDw8IDE0KQorI2RlZmluZQkJCUFUOTFfVVNfQ0hNT0RFX1JFTV9MT09QCQkoMyA8PCAxNCkKKyNkZWZpbmUJCUFUOTFfVVNfTVNCRgkJKDEgPDwgMTYpCQkvKiBCaXQgT3JkZXIgKi8KKyNkZWZpbmUJCUFUOTFfVVNfTU9ERTkJCSgxIDw8IDE3KQkJLyogOS1iaXQgQ2hhcmFjdGVyIExlbmd0aCAqLworI2RlZmluZQkJQVQ5MV9VU19DTEtPCQkoMSA8PCAxOCkJCS8qIENsb2NrIE91dHB1dCBTZWxlY3QgKi8KKyNkZWZpbmUJCUFUOTFfVVNfT1ZFUgkJKDEgPDwgMTkpCQkvKiBPdmVyc2FtcGxpbmcgTW9kZSAqLworI2RlZmluZQkJQVQ5MV9VU19JTkFDSwkJKDEgPDwgMjApCQkvKiBJbmhpYml0IE5vbiBBY2tub3dsZWRnZSAqLworI2RlZmluZQkJQVQ5MV9VU19EU05BQ0sJCSgxIDw8IDIxKQkJLyogRGlzYWJsZSBTdWNjZXNzaXZlIE5BQ0sgKi8KKyNkZWZpbmUJCUFUOTFfVVNfTUFYX0lURVIJKDcgPDwgMjQpCQkvKiBNYXggSXRlcmF0aW9ucyAqLworI2RlZmluZQkJQVQ5MV9VU19GSUxURVIJCSgxIDw8IDI4KQkJLyogSW5mcmFyZWQgUmVjZWl2ZSBMaW5lIEZpbHRlciAqLworCisjZGVmaW5lIEFUOTFfVVNfSUVSCQkweDA4CQkJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9VU19SWFJEWQkJKDEgPDwgIDApCQkvKiBSZWNlaXZlciBSZWFkeSAqLworI2RlZmluZQkJQVQ5MV9VU19UWFJEWQkJKDEgPDwgIDEpCQkvKiBUcmFuc21pdHRlciBSZWFkeSAqLworI2RlZmluZQkJQVQ5MV9VU19SWEJSSwkJKDEgPDwgIDIpCQkvKiBCcmVhayBSZWNlaXZlZCAvIEVuZCBvZiBCcmVhayAqLworI2RlZmluZQkJQVQ5MV9VU19FTkRSWAkJKDEgPDwgIDMpCQkvKiBFbmQgb2YgUmVjZWl2ZXIgVHJhbnNmZXIgKi8KKyNkZWZpbmUJCUFUOTFfVVNfRU5EVFgJCSgxIDw8ICA0KQkJLyogRW5kIG9mIFRyYW5zbWl0dGVyIFRyYW5zZmVyICovCisjZGVmaW5lCQlBVDkxX1VTX09WUkUJCSgxIDw8ICA1KQkJLyogT3ZlcnJ1biBFcnJvciAqLworI2RlZmluZQkJQVQ5MV9VU19GUkFNRQkJKDEgPDwgIDYpCQkvKiBGcmFtaW5nIEVycm9yICovCisjZGVmaW5lCQlBVDkxX1VTX1BBUkUJCSgxIDw8ICA3KQkJLyogUGFyaXR5IEVycm9yICovCisjZGVmaW5lCQlBVDkxX1VTX1RJTUVPVVQJCSgxIDw8ICA4KQkJLyogUmVjZWl2ZXIgVGltZS1vdXQgKi8KKyNkZWZpbmUJCUFUOTFfVVNfVFhFTVBUWQkJKDEgPDwgIDkpCQkvKiBUcmFuc21pdHRlciBFbXB0eSAqLworI2RlZmluZQkJQVQ5MV9VU19JVEVSQVRJT04JKDEgPDwgMTApCQkvKiBNYXggbnVtYmVyIG9mIFJlcGV0aXRpb25zIFJlYWNoZWQgKi8KKyNkZWZpbmUJCUFUOTFfVVNfVFhCVUZFCQkoMSA8PCAxMSkJCS8qIFRyYW5zbWlzc2lvbiBCdWZmZXIgRW1wdHkgKi8KKyNkZWZpbmUJCUFUOTFfVVNfUlhCVUZGCQkoMSA8PCAxMikJCS8qIFJlY2VwdGlvbiBCdWZmZXIgRnVsbCAqLworI2RlZmluZQkJQVQ5MV9VU19OQUNLCQkoMSA8PCAxMykJCS8qIE5vbiBBY2tub3dsZWRnZSAqLworI2RlZmluZQkJQVQ5MV9VU19SSUlDCQkoMSA8PCAxNikJCS8qIFJpbmcgSW5kaWNhdG9yIElucHV0IENoYW5nZSAqLworI2RlZmluZQkJQVQ5MV9VU19EU1JJQwkJKDEgPDwgMTcpCQkvKiBEYXRhIFNldCBSZWFkeSBJbnB1dCBDaGFuZ2UgKi8KKyNkZWZpbmUJCUFUOTFfVVNfRENESUMJCSgxIDw8IDE4KQkJLyogRGF0YSBDYXJyaWVyIERldGVjdCBJbnB1dCBDaGFuZ2UgKi8KKyNkZWZpbmUJCUFUOTFfVVNfQ1RTSUMJCSgxIDw8IDE5KQkJLyogQ2xlYXIgdG8gU2VuZCBJbnB1dCBDaGFuZ2UgKi8KKyNkZWZpbmUJCUFUOTFfVVNfUkkJCSgxIDw8IDIwKQkJLyogUkkgKi8KKyNkZWZpbmUJCUFUOTFfVVNfRFNSCQkoMSA8PCAyMSkJCS8qIERTUiAqLworI2RlZmluZQkJQVQ5MV9VU19EQ0QJCSgxIDw8IDIyKQkJLyogRENEICovCisjZGVmaW5lCQlBVDkxX1VTX0NUUwkJKDEgPDwgMjMpCQkvKiBDVFMgKi8KKworI2RlZmluZSBBVDkxX1VTX0lEUgkJMHgwYwkJCS8qIEludGVycnVwdCBEaXNhYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfVVNfSU1SCQkweDEwCQkJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9VU19DU1IJCTB4MTQJCQkvKiBDaGFubmVsIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1VTX1JIUgkJMHgxOAkJCS8qIFJlY2VpdmVyIEhvbGRpbmcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9VU19USFIJCTB4MWMJCQkvKiBUcmFuc21pdHRlciBIb2xkaW5nIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgQVQ5MV9VU19CUkdSCQkweDIwCQkJLyogQmF1ZCBSYXRlIEdlbmVyYXRvciBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9VU19DRAkJKDB4ZmZmZiA8PCAwKQkJLyogQ2xvY2sgRGl2aWRlciAqLworCisjZGVmaW5lIEFUOTFfVVNfUlRPUgkJMHgyNAkJCS8qIFJlY2VpdmVyIFRpbWUtb3V0IFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1VTX1RPCQkoMHhmZmZmIDw8IDApCQkvKiBUaW1lLW91dCBWYWx1ZSAqLworCisjZGVmaW5lIEFUOTFfVVNfVFRHUgkJMHgyOAkJCS8qIFRyYW5zbWl0dGVyIFRpbWVndWFyZCBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9VU19URwkJKDB4ZmYgPDwgMCkJCS8qIFRpbWVndWFyZCBWYWx1ZSAqLworCisjZGVmaW5lIEFUOTFfVVNfRklESQkJMHg0MAkJCS8qIEZJIERJIFJhdGlvIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfVVNfTkVSCQkweDQ0CQkJLyogTnVtYmVyIG9mIEVycm9ycyBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1VTX0lGCQkweDRjCQkJLyogSXJEQSBGaWx0ZXIgUmVnaXN0ZXIgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2JvYXJkLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2JvYXJkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3ZDExMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYm9hcmQuaApAQCAtMCwwICsxLDgwIEBACisvKgorICogaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9ib2FyZC5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBIUCBMYWJzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKy8qCisgKiBUaGVzZSBhcmUgZGF0YSBzdHJ1Y3R1cmVzIGZvdW5kIGluIHBsYXRmb3JtX2RldmljZS5kZXYucGxhdGZvcm1fZGF0YSwKKyAqIGFuZCBkZXNjcmliaW5nIGJvYXJkLXNwZWNmaWMgZGF0YSBuZWVkZWQgYnkgZHJpdmVycy4gIEZvciBleGFtcGxlLAorICogd2hpY2ggcGluIGlzIHVzZWQgZm9yIGEgZ2l2ZW4gR1BJTyByb2xlLgorICoKKyAqIEluIDIuNiwgZHJpdmVycyBzaG91bGQgc3Ryb25nbHkgYXZvaWQgYm9hcmQtc3BlY2lmaWMga25vd2xlZGdlIHNvCisgKiB0aGF0IHN1cHBvcnRpbmcgbmV3IGJvYXJkcyBub3JtYWxseSB3b24ndCByZXF1aXJlIGRyaXZlciBwYXRjaGVzLgorICogTW9zdCBib2FyZC1zcGVjaWZpYyBrbm93bGVkZ2Ugc2hvdWxkIGJlIGluIGFyY2gvLi4uL2JvYXJkLSouYyBmaWxlcy4KKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfQk9BUkRfSAorI2RlZmluZSBfX0FTTV9BUkNIX0JPQVJEX0gKKworIC8qIENsb2NrcyAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYXQ5MV9tYXN0ZXJfY2xvY2s7CisKKyAvKiBTZXJpYWwgUG9ydCAqLworZXh0ZXJuIGludCBhdDkxX3NlcmlhbF9tYXBbQVQ5MV9OUl9VQVJUXTsKK2V4dGVybiBpbnQgYXQ5MV9jb25zb2xlX3BvcnQ7CisKKyAvKiBVU0IgRGV2aWNlICovCitzdHJ1Y3QgYXQ5MV91ZGNfZGF0YSB7CisJdTgJdmJ1c19waW47CQkvKiBoaWdoID09IGhvc3QgcG93ZXJpbmcgdXMgKi8KKwl1OAlwdWxsdXBfcGluOwkJLyogaGlnaCA9PSBEKyBwdWxsZWQgdXAgKi8KK307CitleHRlcm4gdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3VkYyhzdHJ1Y3QgYXQ5MV91ZGNfZGF0YSAqZGF0YSk7CisKKyAvKiBDb21wYWN0IEZsYXNoICovCitzdHJ1Y3QgYXQ5MV9jZl9kYXRhIHsKKwl1OAlpcnFfcGluOwkJLyogSS9PIElSUSAqLworCXU4CWRldF9waW47CQkvKiBDYXJkIGRldGVjdCAqLworCXU4CXZjY19waW47CQkvKiBwb3dlciBzd2l0Y2hpbmcgKi8KKwl1OAlyc3RfcGluOwkJLyogY2FyZCByZXNldCAqLworfTsKK2V4dGVybiB2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfY2Yoc3RydWN0IGF0OTFfY2ZfZGF0YSAqZGF0YSk7CisKKyAvKiBNTUMgLyBTRCAqLworc3RydWN0IGF0OTFfbW1jX2RhdGEgeworCXU4CQlkZXRfcGluOwkvKiBjYXJkIGRldGVjdCBJUlEgKi8KKwl1bnNpZ25lZAlpc19iOjE7CQkvKiB1c2VzIEIgc2lkZSAodnMgQSkgKi8KKwl1bnNpZ25lZAl3aXJlNDoxOwkvKiAoU0QpIHN1cHBvcnRzIERBVDAuLkRBVDMgKi8KKwl1OAkJd3BfcGluOwkJLyogKFNEKSB3cml0ZXByb3RlY3QgZGV0ZWN0ICovCisJdTgJCXZjY19waW47CS8qIHBvd2VyIHN3aXRjaGluZyAoaGlnaCA9PSBvbikgKi8KK307CitleHRlcm4gdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX21tYyhzdHJ1Y3QgYXQ5MV9tbWNfZGF0YSAqZGF0YSk7CisKKyAvKiBFdGhlcm5ldCAqLworc3RydWN0IGF0OTFfZXRoX2RhdGEgeworCXU4CQlwaHlfaXJxX3BpbjsJLyogUEhZIElSUSAqLworCXU4CQlpc19ybWlpOwkvKiB1c2luZyBSTUlJIGludGVyZmFjZT8gKi8KK307CitleHRlcm4gdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX2V0aChzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSAqZGF0YSk7CisKKyAvKiBVU0IgSG9zdCAqLworc3RydWN0IGF0OTFfdXNiaF9kYXRhIHsKKwl1OAkJcG9ydHM7CQkvKiBudW1iZXIgb2YgcG9ydHMgb24gcm9vdCBodWIgKi8KK307CitleHRlcm4gdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3VzYmgoc3RydWN0IGF0OTFfdXNiaF9kYXRhICpkYXRhKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2RlYnVnLW1hY3JvLlMgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2RlYnVnLW1hY3JvLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ5NmI1NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvZGVidWctbWFjcm8uUwpAQCAtMCwwICsxLDM4IEBACisvKgorICogaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9kZWJ1Zy1tYWNyby5TCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IFNBTiBQZW9wbGUKKyAqCisgKiBEZWJ1Z2dpbmcgbWFjcm8gaW5jbHVkZSBoZWFkZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyovCisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKworCS5tYWNybwlhZGRydWFydCxyeAorCW1yYwlwMTUsIDAsIFxyeCwgYzEsIGMwCisJdHN0CVxyeCwgIzEJCQkJQCBNTVUgZW5hYmxlZD8KKwlsZHJlcQlccngsID1BVDkxX0JBU0VfU1lTCQlAIFN5c3RlbSBwZXJpcGhlcmFscyAocGh5cyBhZGRyZXNzKQorCWxkcm5lCVxyeCwgPUFUOTFfVkFfQkFTRV9TWVMJCUAgU3lzdGVtIHBlcmlwaGVyYWxzICh2aXJ0IGFkZHJlc3MpCisJLmVuZG0KKworCS5tYWNybwlzZW5kdWFydCxyZCxyeAorCXN0cmIJXHJkLCBbXHJ4LCAjQVQ5MV9EQkdVX1RIUl0JQCBXcml0ZSB0byBUcmFuc21pdHRlciBIb2xkaW5nIFJlZ2lzdGVyCisJLmVuZG0KKworCS5tYWNybwl3YWl0dWFydCxyZCxyeAorMTAwMToJbGRyCVxyZCwgW1xyeCwgI0FUOTFfREJHVV9TUl0JQCBSZWFkIFN0YXR1cyBSZWdpc3RlcgorCXRzdAlccmQsICNBVDkxX0RCR1VfVFhSRFkJCUAgREJHVV9UWFJEWSA9IDEgd2hlbiByZWFkeSB0byB0cmFuc21pdAorCWJlcQkxMDAxYgorCS5lbmRtCisKKwkubWFjcm8JYnVzeXVhcnQscmQscngKKzEwMDE6CWxkcglccmQsIFtccngsICNBVDkxX0RCR1VfU1JdCUAgUmVhZCBTdGF0dXMgUmVnaXN0ZXIKKwl0c3QJXHJkLCAjQVQ5MV9EQkdVX1RYRU1QVFkJCUAgREJHVV9UWEVNUFRZID0gMSB3aGVuIHRyYW5zbWlzc2lvbiBjb21wbGV0ZQorCWJlcQkxMDAxYgorCS5lbmRtCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvZG1hLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2RtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYzFkZmQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2RtYS5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2RtYS5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMyBTQU4gUGVvcGxlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2VudHJ5LW1hY3JvLlMgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2VudHJ5LW1hY3JvLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFhMzI2ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvZW50cnktbWFjcm8uUwpAQCAtMCwwICsxLDI1IEBACisvKgorICogaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9lbnRyeS1tYWNyby5TCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IFNBTiBQZW9wbGUKKyAqCisgKiBMb3ctbGV2ZWwgSVJRIGhlbHBlciBtYWNyb3MgZm9yIEFUOTFSTTkyMDAgcGxhdGZvcm1zCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisKKwkubWFjcm8JZGlzYWJsZV9maXEKKwkuZW5kbQorCisJLm1hY3JvCWdldF9pcnFucl9hbmRfYmFzZSwgaXJxbnIsIGlycXN0YXQsIGJhc2UsIHRtcAorCWxkcglcYmFzZSwgPShBVDkxX1ZBX0JBU0VfU1lTKQkJQCBiYXNlIHZpcnR1YWwgYWRkcmVzcyBvZiBTWVMgcGVyaXBoZXJhbHMKKwlsZHIJXGlycW5yLCBbXGJhc2UsICNBVDkxX0FJQ19JVlJdCQlAIHJlYWQgSVJRIHZlY3RvciByZWdpc3RlcjogZGUtYXNzZXJ0cyBuSVJRIHRvIHByb2Nlc3NvciAoYW5kIGNsZWFycyBpbnRlcnJ1cHQpCisJbGRyCVxpcnFzdGF0LCBbXGJhc2UsICNBVDkxX0FJQ19JU1JdCUAgcmVhZCBpbnRlcnJ1cHQgc291cmNlIG51bWJlcgorCXRlcQlcaXJxc3RhdCwgIzAJCQkJQCBJU1IgaXMgMCB3aGVuIG5vIGN1cnJlbnQgaW50ZXJydXB0LCBvciBzcHVyaW91cyBpbnRlcnJ1cHQKKwlzdHJlcQlcdG1wLCBbXGJhc2UsICNBVDkxX0FJQ19FT0lDUl0JCUAgbm90IGdvaW5nIHRvIGJlIGhhbmRsZWQgZnVydGhlciwgdGhlbiBBQ0sgaXQgbm93LgorCS5lbmRtCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvZ3Bpby5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwYTYxZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvZ3Bpby5oCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9ncGlvLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IEhQIExhYnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfQVQ5MVJNOTIwMF9HUElPX0gKKyNkZWZpbmUgX19BU01fQVJDSF9BVDkxUk05MjAwX0dQSU9fSAorCisjZGVmaW5lIFBJTl9CQVNFCQlOUl9BSUNfSVJRUworCisjZGVmaW5lIFBRRlBfR1BJT19CQU5LUwkJMwkvKiBQUUZQIHBhY2thZ2UgaGFzIDMgYmFua3MgKi8KKyNkZWZpbmUgQkdBX0dQSU9fQkFOS1MJCTQJLyogQkdBIHBhY2thZ2UgaGFzIDQgYmFua3MgKi8KKworLyogdGhlc2UgcGluIG51bWJlcnMgZG91YmxlIGFzIElSUSBudW1iZXJzLCBsaWtlIEFUOTFfSURfKiB2YWx1ZXMgKi8KKworI2RlZmluZQlBVDkxX1BJTl9QQTAJKFBJTl9CQVNFICsgMHgwMCArIDApCisjZGVmaW5lCUFUOTFfUElOX1BBMQkoUElOX0JBU0UgKyAweDAwICsgMSkKKyNkZWZpbmUJQVQ5MV9QSU5fUEEyCShQSU5fQkFTRSArIDB4MDAgKyAyKQorI2RlZmluZQlBVDkxX1BJTl9QQTMJKFBJTl9CQVNFICsgMHgwMCArIDMpCisjZGVmaW5lCUFUOTFfUElOX1BBNAkoUElOX0JBU0UgKyAweDAwICsgNCkKKworI2RlZmluZQlBVDkxX1BJTl9QQTUJKFBJTl9CQVNFICsgMHgwMCArIDUpCisjZGVmaW5lCUFUOTFfUElOX1BBNgkoUElOX0JBU0UgKyAweDAwICsgNikKKyNkZWZpbmUJQVQ5MV9QSU5fUEE3CShQSU5fQkFTRSArIDB4MDAgKyA3KQorI2RlZmluZQlBVDkxX1BJTl9QQTgJKFBJTl9CQVNFICsgMHgwMCArIDgpCisjZGVmaW5lCUFUOTFfUElOX1BBOQkoUElOX0JBU0UgKyAweDAwICsgOSkKKworI2RlZmluZQlBVDkxX1BJTl9QQTEwCShQSU5fQkFTRSArIDB4MDAgKyAxMCkKKyNkZWZpbmUJQVQ5MV9QSU5fUEExMQkoUElOX0JBU0UgKyAweDAwICsgMTEpCisjZGVmaW5lCUFUOTFfUElOX1BBMTIJKFBJTl9CQVNFICsgMHgwMCArIDEyKQorI2RlZmluZQlBVDkxX1BJTl9QQTEzCShQSU5fQkFTRSArIDB4MDAgKyAxMykKKyNkZWZpbmUJQVQ5MV9QSU5fUEExNAkoUElOX0JBU0UgKyAweDAwICsgMTQpCisKKyNkZWZpbmUJQVQ5MV9QSU5fUEExNQkoUElOX0JBU0UgKyAweDAwICsgMTUpCisjZGVmaW5lCUFUOTFfUElOX1BBMTYJKFBJTl9CQVNFICsgMHgwMCArIDE2KQorI2RlZmluZQlBVDkxX1BJTl9QQTE3CShQSU5fQkFTRSArIDB4MDAgKyAxNykKKyNkZWZpbmUJQVQ5MV9QSU5fUEExOAkoUElOX0JBU0UgKyAweDAwICsgMTgpCisjZGVmaW5lCUFUOTFfUElOX1BBMTkJKFBJTl9CQVNFICsgMHgwMCArIDE5KQorCisjZGVmaW5lCUFUOTFfUElOX1BBMjAJKFBJTl9CQVNFICsgMHgwMCArIDIwKQorI2RlZmluZQlBVDkxX1BJTl9QQTIxCShQSU5fQkFTRSArIDB4MDAgKyAyMSkKKyNkZWZpbmUJQVQ5MV9QSU5fUEEyMgkoUElOX0JBU0UgKyAweDAwICsgMjIpCisjZGVmaW5lCUFUOTFfUElOX1BBMjMJKFBJTl9CQVNFICsgMHgwMCArIDIzKQorI2RlZmluZQlBVDkxX1BJTl9QQTI0CShQSU5fQkFTRSArIDB4MDAgKyAyNCkKKworI2RlZmluZQlBVDkxX1BJTl9QQTI1CShQSU5fQkFTRSArIDB4MDAgKyAyNSkKKyNkZWZpbmUJQVQ5MV9QSU5fUEEyNgkoUElOX0JBU0UgKyAweDAwICsgMjYpCisjZGVmaW5lCUFUOTFfUElOX1BBMjcJKFBJTl9CQVNFICsgMHgwMCArIDI3KQorI2RlZmluZQlBVDkxX1BJTl9QQTI4CShQSU5fQkFTRSArIDB4MDAgKyAyOCkKKyNkZWZpbmUJQVQ5MV9QSU5fUEEyOQkoUElOX0JBU0UgKyAweDAwICsgMjkpCisKKyNkZWZpbmUJQVQ5MV9QSU5fUEEzMAkoUElOX0JBU0UgKyAweDAwICsgMzApCisjZGVmaW5lCUFUOTFfUElOX1BBMzEJKFBJTl9CQVNFICsgMHgwMCArIDMxKQorCisjZGVmaW5lCUFUOTFfUElOX1BCMAkoUElOX0JBU0UgKyAweDIwICsgMCkKKyNkZWZpbmUJQVQ5MV9QSU5fUEIxCShQSU5fQkFTRSArIDB4MjAgKyAxKQorI2RlZmluZQlBVDkxX1BJTl9QQjIJKFBJTl9CQVNFICsgMHgyMCArIDIpCisjZGVmaW5lCUFUOTFfUElOX1BCMwkoUElOX0JBU0UgKyAweDIwICsgMykKKyNkZWZpbmUJQVQ5MV9QSU5fUEI0CShQSU5fQkFTRSArIDB4MjAgKyA0KQorCisjZGVmaW5lCUFUOTFfUElOX1BCNQkoUElOX0JBU0UgKyAweDIwICsgNSkKKyNkZWZpbmUJQVQ5MV9QSU5fUEI2CShQSU5fQkFTRSArIDB4MjAgKyA2KQorI2RlZmluZQlBVDkxX1BJTl9QQjcJKFBJTl9CQVNFICsgMHgyMCArIDcpCisjZGVmaW5lCUFUOTFfUElOX1BCOAkoUElOX0JBU0UgKyAweDIwICsgOCkKKyNkZWZpbmUJQVQ5MV9QSU5fUEI5CShQSU5fQkFTRSArIDB4MjAgKyA5KQorCisjZGVmaW5lCUFUOTFfUElOX1BCMTAJKFBJTl9CQVNFICsgMHgyMCArIDEwKQorI2RlZmluZQlBVDkxX1BJTl9QQjExCShQSU5fQkFTRSArIDB4MjAgKyAxMSkKKyNkZWZpbmUJQVQ5MV9QSU5fUEIxMgkoUElOX0JBU0UgKyAweDIwICsgMTIpCisjZGVmaW5lCUFUOTFfUElOX1BCMTMJKFBJTl9CQVNFICsgMHgyMCArIDEzKQorI2RlZmluZQlBVDkxX1BJTl9QQjE0CShQSU5fQkFTRSArIDB4MjAgKyAxNCkKKworI2RlZmluZQlBVDkxX1BJTl9QQjE1CShQSU5fQkFTRSArIDB4MjAgKyAxNSkKKyNkZWZpbmUJQVQ5MV9QSU5fUEIxNgkoUElOX0JBU0UgKyAweDIwICsgMTYpCisjZGVmaW5lCUFUOTFfUElOX1BCMTcJKFBJTl9CQVNFICsgMHgyMCArIDE3KQorI2RlZmluZQlBVDkxX1BJTl9QQjE4CShQSU5fQkFTRSArIDB4MjAgKyAxOCkKKyNkZWZpbmUJQVQ5MV9QSU5fUEIxOQkoUElOX0JBU0UgKyAweDIwICsgMTkpCisKKyNkZWZpbmUJQVQ5MV9QSU5fUEIyMAkoUElOX0JBU0UgKyAweDIwICsgMjApCisjZGVmaW5lCUFUOTFfUElOX1BCMjEJKFBJTl9CQVNFICsgMHgyMCArIDIxKQorI2RlZmluZQlBVDkxX1BJTl9QQjIyCShQSU5fQkFTRSArIDB4MjAgKyAyMikKKyNkZWZpbmUJQVQ5MV9QSU5fUEIyMwkoUElOX0JBU0UgKyAweDIwICsgMjMpCisjZGVmaW5lCUFUOTFfUElOX1BCMjQJKFBJTl9CQVNFICsgMHgyMCArIDI0KQorCisjZGVmaW5lCUFUOTFfUElOX1BCMjUJKFBJTl9CQVNFICsgMHgyMCArIDI1KQorI2RlZmluZQlBVDkxX1BJTl9QQjI2CShQSU5fQkFTRSArIDB4MjAgKyAyNikKKyNkZWZpbmUJQVQ5MV9QSU5fUEIyNwkoUElOX0JBU0UgKyAweDIwICsgMjcpCisjZGVmaW5lCUFUOTFfUElOX1BCMjgJKFBJTl9CQVNFICsgMHgyMCArIDI4KQorI2RlZmluZQlBVDkxX1BJTl9QQjI5CShQSU5fQkFTRSArIDB4MjAgKyAyOSkKKworI2RlZmluZQlBVDkxX1BJTl9QQjMwCShQSU5fQkFTRSArIDB4MjAgKyAzMCkKKyNkZWZpbmUJQVQ5MV9QSU5fUEIzMQkoUElOX0JBU0UgKyAweDIwICsgMzEpCisKKyNkZWZpbmUJQVQ5MV9QSU5fUEMwCShQSU5fQkFTRSArIDB4NDAgKyAwKQorI2RlZmluZQlBVDkxX1BJTl9QQzEJKFBJTl9CQVNFICsgMHg0MCArIDEpCisjZGVmaW5lCUFUOTFfUElOX1BDMgkoUElOX0JBU0UgKyAweDQwICsgMikKKyNkZWZpbmUJQVQ5MV9QSU5fUEMzCShQSU5fQkFTRSArIDB4NDAgKyAzKQorI2RlZmluZQlBVDkxX1BJTl9QQzQJKFBJTl9CQVNFICsgMHg0MCArIDQpCisKKyNkZWZpbmUJQVQ5MV9QSU5fUEM1CShQSU5fQkFTRSArIDB4NDAgKyA1KQorI2RlZmluZQlBVDkxX1BJTl9QQzYJKFBJTl9CQVNFICsgMHg0MCArIDYpCisjZGVmaW5lCUFUOTFfUElOX1BDNwkoUElOX0JBU0UgKyAweDQwICsgNykKKyNkZWZpbmUJQVQ5MV9QSU5fUEM4CShQSU5fQkFTRSArIDB4NDAgKyA4KQorI2RlZmluZQlBVDkxX1BJTl9QQzkJKFBJTl9CQVNFICsgMHg0MCArIDkpCisKKyNkZWZpbmUJQVQ5MV9QSU5fUEMxMAkoUElOX0JBU0UgKyAweDQwICsgMTApCisjZGVmaW5lCUFUOTFfUElOX1BDMTEJKFBJTl9CQVNFICsgMHg0MCArIDExKQorI2RlZmluZQlBVDkxX1BJTl9QQzEyCShQSU5fQkFTRSArIDB4NDAgKyAxMikKKyNkZWZpbmUJQVQ5MV9QSU5fUEMxMwkoUElOX0JBU0UgKyAweDQwICsgMTMpCisjZGVmaW5lCUFUOTFfUElOX1BDMTQJKFBJTl9CQVNFICsgMHg0MCArIDE0KQorCisjZGVmaW5lCUFUOTFfUElOX1BDMTUJKFBJTl9CQVNFICsgMHg0MCArIDE1KQorI2RlZmluZQlBVDkxX1BJTl9QQzE2CShQSU5fQkFTRSArIDB4NDAgKyAxNikKKyNkZWZpbmUJQVQ5MV9QSU5fUEMxNwkoUElOX0JBU0UgKyAweDQwICsgMTcpCisjZGVmaW5lCUFUOTFfUElOX1BDMTgJKFBJTl9CQVNFICsgMHg0MCArIDE4KQorI2RlZmluZQlBVDkxX1BJTl9QQzE5CShQSU5fQkFTRSArIDB4NDAgKyAxOSkKKworI2RlZmluZQlBVDkxX1BJTl9QQzIwCShQSU5fQkFTRSArIDB4NDAgKyAyMCkKKyNkZWZpbmUJQVQ5MV9QSU5fUEMyMQkoUElOX0JBU0UgKyAweDQwICsgMjEpCisjZGVmaW5lCUFUOTFfUElOX1BDMjIJKFBJTl9CQVNFICsgMHg0MCArIDIyKQorI2RlZmluZQlBVDkxX1BJTl9QQzIzCShQSU5fQkFTRSArIDB4NDAgKyAyMykKKyNkZWZpbmUJQVQ5MV9QSU5fUEMyNAkoUElOX0JBU0UgKyAweDQwICsgMjQpCisKKyNkZWZpbmUJQVQ5MV9QSU5fUEMyNQkoUElOX0JBU0UgKyAweDQwICsgMjUpCisjZGVmaW5lCUFUOTFfUElOX1BDMjYJKFBJTl9CQVNFICsgMHg0MCArIDI2KQorI2RlZmluZQlBVDkxX1BJTl9QQzI3CShQSU5fQkFTRSArIDB4NDAgKyAyNykKKyNkZWZpbmUJQVQ5MV9QSU5fUEMyOAkoUElOX0JBU0UgKyAweDQwICsgMjgpCisjZGVmaW5lCUFUOTFfUElOX1BDMjkJKFBJTl9CQVNFICsgMHg0MCArIDI5KQorCisjZGVmaW5lCUFUOTFfUElOX1BDMzAJKFBJTl9CQVNFICsgMHg0MCArIDMwKQorI2RlZmluZQlBVDkxX1BJTl9QQzMxCShQSU5fQkFTRSArIDB4NDAgKyAzMSkKKworI2RlZmluZQlBVDkxX1BJTl9QRDAJKFBJTl9CQVNFICsgMHg2MCArIDApCisjZGVmaW5lCUFUOTFfUElOX1BEMQkoUElOX0JBU0UgKyAweDYwICsgMSkKKyNkZWZpbmUJQVQ5MV9QSU5fUEQyCShQSU5fQkFTRSArIDB4NjAgKyAyKQorI2RlZmluZQlBVDkxX1BJTl9QRDMJKFBJTl9CQVNFICsgMHg2MCArIDMpCisjZGVmaW5lCUFUOTFfUElOX1BENAkoUElOX0JBU0UgKyAweDYwICsgNCkKKworI2RlZmluZQlBVDkxX1BJTl9QRDUJKFBJTl9CQVNFICsgMHg2MCArIDUpCisjZGVmaW5lCUFUOTFfUElOX1BENgkoUElOX0JBU0UgKyAweDYwICsgNikKKyNkZWZpbmUJQVQ5MV9QSU5fUEQ3CShQSU5fQkFTRSArIDB4NjAgKyA3KQorI2RlZmluZQlBVDkxX1BJTl9QRDgJKFBJTl9CQVNFICsgMHg2MCArIDgpCisjZGVmaW5lCUFUOTFfUElOX1BEOQkoUElOX0JBU0UgKyAweDYwICsgOSkKKworI2RlZmluZQlBVDkxX1BJTl9QRDEwCShQSU5fQkFTRSArIDB4NjAgKyAxMCkKKyNkZWZpbmUJQVQ5MV9QSU5fUEQxMQkoUElOX0JBU0UgKyAweDYwICsgMTEpCisjZGVmaW5lCUFUOTFfUElOX1BEMTIJKFBJTl9CQVNFICsgMHg2MCArIDEyKQorI2RlZmluZQlBVDkxX1BJTl9QRDEzCShQSU5fQkFTRSArIDB4NjAgKyAxMykKKyNkZWZpbmUJQVQ5MV9QSU5fUEQxNAkoUElOX0JBU0UgKyAweDYwICsgMTQpCisKKyNkZWZpbmUJQVQ5MV9QSU5fUEQxNQkoUElOX0JBU0UgKyAweDYwICsgMTUpCisjZGVmaW5lCUFUOTFfUElOX1BEMTYJKFBJTl9CQVNFICsgMHg2MCArIDE2KQorI2RlZmluZQlBVDkxX1BJTl9QRDE3CShQSU5fQkFTRSArIDB4NjAgKyAxNykKKyNkZWZpbmUJQVQ5MV9QSU5fUEQxOAkoUElOX0JBU0UgKyAweDYwICsgMTgpCisjZGVmaW5lCUFUOTFfUElOX1BEMTkJKFBJTl9CQVNFICsgMHg2MCArIDE5KQorCisjZGVmaW5lCUFUOTFfUElOX1BEMjAJKFBJTl9CQVNFICsgMHg2MCArIDIwKQorI2RlZmluZQlBVDkxX1BJTl9QRDIxCShQSU5fQkFTRSArIDB4NjAgKyAyMSkKKyNkZWZpbmUJQVQ5MV9QSU5fUEQyMgkoUElOX0JBU0UgKyAweDYwICsgMjIpCisjZGVmaW5lCUFUOTFfUElOX1BEMjMJKFBJTl9CQVNFICsgMHg2MCArIDIzKQorI2RlZmluZQlBVDkxX1BJTl9QRDI0CShQSU5fQkFTRSArIDB4NjAgKyAyNCkKKworI2RlZmluZQlBVDkxX1BJTl9QRDI1CShQSU5fQkFTRSArIDB4NjAgKyAyNSkKKyNkZWZpbmUJQVQ5MV9QSU5fUEQyNgkoUElOX0JBU0UgKyAweDYwICsgMjYpCisjZGVmaW5lCUFUOTFfUElOX1BEMjcJKFBJTl9CQVNFICsgMHg2MCArIDI3KQorI2RlZmluZQlBVDkxX1BJTl9QRDI4CShQSU5fQkFTRSArIDB4NjAgKyAyOCkKKyNkZWZpbmUJQVQ5MV9QSU5fUEQyOQkoUElOX0JBU0UgKyAweDYwICsgMjkpCisKKyNkZWZpbmUJQVQ5MV9QSU5fUEQzMAkoUElOX0JBU0UgKyAweDYwICsgMzApCisjZGVmaW5lCUFUOTFfUElOX1BEMzEJKFBJTl9CQVNFICsgMHg2MCArIDMxKQorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworLyogc2V0dXAgc2V0dXAgcm91dGluZXMsIGNhbGxlZCBmcm9tIGJvYXJkIGluaXQgb3IgZHJpdmVyIHByb2JlKCkgKi8KK2V4dGVybiBpbnQgYXQ5MV9zZXRfQV9wZXJpcGgodW5zaWduZWQgcGluLCBpbnQgdXNlX3B1bGx1cCk7CitleHRlcm4gaW50IGF0OTFfc2V0X0JfcGVyaXBoKHVuc2lnbmVkIHBpbiwgaW50IHVzZV9wdWxsdXApOworZXh0ZXJuIGludCBhdDkxX3NldF9ncGlvX2lucHV0KHVuc2lnbmVkIHBpbiwgaW50IHVzZV9wdWxsdXApOworZXh0ZXJuIGludCBhdDkxX3NldF9ncGlvX291dHB1dCh1bnNpZ25lZCBwaW4sIGludCB2YWx1ZSk7CitleHRlcm4gaW50IGF0OTFfc2V0X2RlZ2xpdGNoKHVuc2lnbmVkIHBpbiwgaW50IGlzX29uKTsKKworLyogY2FsbGFibGUgYXQgYW55IHRpbWUgKi8KK2V4dGVybiBpbnQgYXQ5MV9zZXRfZ3Bpb192YWx1ZSh1bnNpZ25lZCBwaW4sIGludCB2YWx1ZSk7CitleHRlcm4gaW50IGF0OTFfZ2V0X2dwaW9fdmFsdWUodW5zaWduZWQgcGluKTsKKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9oYXJkd2FyZS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9oYXJkd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NDZjMDEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2hhcmR3YXJlLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvaGFyZHdhcmUuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgU0FOIFBlb3BsZQorICogIENvcHlyaWdodCAoQykgMjAwMyBBVE1FTAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX19BU01fQVJDSF9IQVJEV0FSRV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSAorCisjaW5jbHVkZSA8YXNtL3NpemVzLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9hdDkxcm05MjAwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MXJtOTIwMF9zeXMuaD4KKworLyoKKyAqIFJlbWFwIHRoZSBwZXJpcGhlcmFscyBmcm9tIGFkZHJlc3MgMHhGRkZBMDAwMCAuLiAweEZGRkZGRkZGCisgKiB0byAweEZFRkEwMDAwIC4uIDB4RkYwMDAwMDAuICAoMzg0S2IpCisgKi8KKyNkZWZpbmUgQVQ5MV9JT19QSFlTX0JBU0UJMHhGRkZBMDAwMAorI2RlZmluZSBBVDkxX0lPX1NJWkUJCSgweEZGRkZGRkZGIC0gQVQ5MV9JT19QSFlTX0JBU0UgKyAxKQorI2RlZmluZSBBVDkxX0lPX1ZJUlRfQkFTRQkoMHhGRjAwMDAwMCAtIEFUOTFfSU9fU0laRSkKKworIC8qIENvbnZlcnQgYSBwaHlzaWNhbCBJTyBhZGRyZXNzIHRvIHZpcnR1YWwgSU8gYWRkcmVzcyAqLworI2RlZmluZSBBVDkxX0lPX1AyVih4KQkoKHgpIC0gQVQ5MV9JT19QSFlTX0JBU0UgKyBBVDkxX0lPX1ZJUlRfQkFTRSkKKworLyoKKyAqIFZpcnR1YWwgdG8gUGh5c2ljYWwgQWRkcmVzcyBtYXBwaW5nIGZvciBJTyBkZXZpY2VzLgorICovCisjZGVmaW5lIEFUOTFfVkFfQkFTRV9TWVMJQVQ5MV9JT19QMlYoQVQ5MV9CQVNFX1NZUykKKyNkZWZpbmUgQVQ5MV9WQV9CQVNFX1NQSQlBVDkxX0lPX1AyVihBVDkxX0JBU0VfU1BJKQorI2RlZmluZSBBVDkxX1ZBX0JBU0VfU1NDMglBVDkxX0lPX1AyVihBVDkxX0JBU0VfU1NDMikKKyNkZWZpbmUgQVQ5MV9WQV9CQVNFX1NTQzEJQVQ5MV9JT19QMlYoQVQ5MV9CQVNFX1NTQzEpCisjZGVmaW5lIEFUOTFfVkFfQkFTRV9TU0MwCUFUOTFfSU9fUDJWKEFUOTFfQkFTRV9TU0MwKQorI2RlZmluZSBBVDkxX1ZBX0JBU0VfVVMzCUFUOTFfSU9fUDJWKEFUOTFfQkFTRV9VUzMpCisjZGVmaW5lIEFUOTFfVkFfQkFTRV9VUzIJQVQ5MV9JT19QMlYoQVQ5MV9CQVNFX1VTMikKKyNkZWZpbmUgQVQ5MV9WQV9CQVNFX1VTMQlBVDkxX0lPX1AyVihBVDkxX0JBU0VfVVMxKQorI2RlZmluZSBBVDkxX1ZBX0JBU0VfVVMwCUFUOTFfSU9fUDJWKEFUOTFfQkFTRV9VUzApCisjZGVmaW5lIEFUOTFfVkFfQkFTRV9FTUFDCUFUOTFfSU9fUDJWKEFUOTFfQkFTRV9FTUFDKQorI2RlZmluZSBBVDkxX1ZBX0JBU0VfVFdJCUFUOTFfSU9fUDJWKEFUOTFfQkFTRV9UV0kpCisjZGVmaW5lIEFUOTFfVkFfQkFTRV9NQ0kJQVQ5MV9JT19QMlYoQVQ5MV9CQVNFX01DSSkKKyNkZWZpbmUgQVQ5MV9WQV9CQVNFX1VEUAlBVDkxX0lPX1AyVihBVDkxX0JBU0VfVURQKQorI2RlZmluZSBBVDkxX1ZBX0JBU0VfVENCMQlBVDkxX0lPX1AyVihBVDkxX0JBU0VfVENCMSkKKyNkZWZpbmUgQVQ5MV9WQV9CQVNFX1RDQjAJQVQ5MV9JT19QMlYoQVQ5MV9CQVNFX1RDQjApCisKKy8qIEludGVybmFsIFNSQU0gKi8KKyNkZWZpbmUgQVQ5MV9CQVNFX1NSQU0JCTB4MDAyMDAwMDAJLyogSW50ZXJuYWwgU1JBTSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgQVQ5MV9TUkFNX1NJWkUJCTB4MDAwMDQwMDAJLyogSW50ZXJuYWwgU1JBTSBTSVpFICgxNktiKSAqLworCisvKiBTZXJpYWwgcG9ydHMgKi8KKyNkZWZpbmUgQVQ5MV9OUl9VQVJUCQk1CQkvKiA0IFVTQVJUMydzIGFuZCBvbmUgREJHVSBwb3J0ICovCisKKy8qIEZMQVNIICovCisjZGVmaW5lIEFUOTFfRkxBU0hfQkFTRQkJMHgxMDAwMDAwMAkvKiBOQ1MwOiBGbGFzaCBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgKi8KKworLyogU0RSQU0gKi8KKyNkZWZpbmUgQVQ5MV9TRFJBTV9CQVNFCQkweDIwMDAwMDAwCS8qIE5DUzE6IFNEUkFNIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyAqLworCisvKiBTbWFydE1lZGlhICovCisjZGVmaW5lIEFUOTFfU01BUlRNRURJQV9CQVNFCTB4NDAwMDAwMDAJLyogTkNTMzogU21hcnRtZWRpYSBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgKi8KKworLyogTXVsdGktTWFzdGVyIE1lbW9yeSBjb250cm9sbGVyICovCisjZGVmaW5lIEFUOTFfVUhQX0JBU0UJCTB4MDAzMDAwMDAJLyogVVNCIEhvc3QgY29udHJvbGxlciAqLworCisvKiBDbG9ja3MgKi8KKyNkZWZpbmUgQVQ5MV9TTE9XX0NMT0NLCQkzMjc2OAkJLyogc2xvdyBjbG9jayAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGFzbS9pby5oPgorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhdDkxX3N5c19yZWFkKHVuc2lnbmVkIGludCByZWdfb2Zmc2V0KQoreworCXZvaWQgX19pb21lbSAqYWRkciA9ICh2b2lkIF9faW9tZW0gKilBVDkxX1ZBX0JBU0VfU1lTOworCisJcmV0dXJuIHJlYWRsKGFkZHIgKyByZWdfb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0OTFfc3lzX3dyaXRlKHVuc2lnbmVkIGludCByZWdfb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHZhbHVlKQoreworCXZvaWQgX19pb21lbSAqYWRkciA9ICh2b2lkIF9faW9tZW0gKilBVDkxX1ZBX0JBU0VfU1lTOworCisJd3JpdGVsKHZhbHVlLCBhZGRyICsgcmVnX29mZnNldCk7Cit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2lvLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlNjcwZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvaW8uaApAQCAtMCwwICsxLDMzIEBACisvKgorICogaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9pby5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMyBTQU4gUGVvcGxlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX19BU01fQVJDSF9JT19ICisjZGVmaW5lIF9fQVNNX0FSQ0hfSU9fSAorCisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MXJtOTIwMC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIElPX1NQQUNFX0xJTUlUCQkweEZGRkZGRkZGCisKKyNkZWZpbmUgX19pbyhhKQkJCSgodm9pZCBfX2lvbWVtICopKGEpKQorI2RlZmluZSBfX21lbV9wY2koYSkJCShhKQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9pcnFzLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2lycXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2IwNDk3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9pcnFzLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvaXJxcy5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBTQU4gUGVvcGxlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX19BU01fQVJDSF9JUlFTX0gKKyNkZWZpbmUgX19BU01fQVJDSF9JUlFTX0gKKworI2RlZmluZSBOUl9BSUNfSVJRUyAzMgorCisKKy8qCisgKiBBY2tub3dsZWRnZSBpbnRlcnJ1cHQgd2l0aCBBSUMgYWZ0ZXIgaW50ZXJydXB0IGhhcyBiZWVuIGhhbmRsZWQuCisgKiAgIChieSBrZXJuZWwvaXJxLmMpCisgKi8KKyNkZWZpbmUgaXJxX2ZpbmlzaChpcnEpIGRvIHsgYXQ5MV9zeXNfd3JpdGUoQVQ5MV9BSUNfRU9JQ1IsIDApOyB9IHdoaWxlICgwKQorCisKKy8qCisgKiBJUlEgaW50ZXJydXB0IHN5bWJvbHMgYXJlIHRoZSBBVDkxX0lEXyogc3ltYm9scyBpbiBhdDkxcm05MjAwLmgKKyAqIGZvciBJUlFzIGhhbmRsZWQgZGlyZWN0bHkgdGhyb3VnaCB0aGUgQUlDLCBvciBlbHNlIHRoZSBBVDkxX1BJTl8qCisgKiBzeW1ib2xzIGluIGdwaW8uaCBmb3Igb25lcyBoYW5kbGVkIGluZGlyZWN0bHkgYXMgR1BJT3MuCisgKiBXZSBtYWtlIHByb3Zpc2lvbiBmb3IgNCBiYW5rcyBvZiBHUElPLgorICovCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorCisjZGVmaW5lCU5SX0lSUVMJCShOUl9BSUNfSVJRUyArICg0ICogMzIpKQorCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisvKgorICogSW5pdGlhbGl6ZSB0aGUgSVJRIGNvbnRyb2xsZXIuCisgKi8KK2V4dGVybiB2b2lkIGF0OTFybTkyMDBfaW5pdF9pcnEodW5zaWduZWQgaW50IHByaW9yaXR5W10pOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9tZW1vcnkuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvbWVtb3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYyZjFmMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvbWVtb3J5LmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvbWVtb3J5LmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IFNBTiBQZW9wbGUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKKworI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisKKyNkZWZpbmUgUEhZU19PRkZTRVQJKEFUOTFfU0RSQU1fQkFTRSkKKworCisvKgorICogVmlydHVhbCB2aWV3IDwtPiBETUEgdmlldyBtZW1vcnkgYWRkcmVzcyB0cmFuc2xhdGlvbnMKKyAqIHZpcnRfdG9fYnVzOiBVc2VkIHRvIHRyYW5zbGF0ZSB0aGUgdmlydHVhbCBhZGRyZXNzIHRvIGFuCisgKiAgICAgICAgICAgICAgYWRkcmVzcyBzdWl0YWJsZSB0byBiZSBwYXNzZWQgdG8gc2V0X2RtYV9hZGRyCisgKiBidXNfdG9fdmlydDogVXNlZCB0byBjb252ZXJ0IGFuIGFkZHJlc3MgZm9yIERNQSBvcGVyYXRpb25zCisgKiAgICAgICAgICAgICAgdG8gYW4gYWRkcmVzcyB0aGF0IHRoZSBrZXJuZWwgY2FuIHVzZS4KKyAqLworI2RlZmluZSBfX3ZpcnRfdG9fYnVzX19pc19hX21hY3JvCisjZGVmaW5lIF9fdmlydF90b19idXMoeCkgX192aXJ0X3RvX3BoeXMoeCkKKyNkZWZpbmUgX19idXNfdG9fdmlydF9faXNfYV9tYWNybworI2RlZmluZSBfX2J1c190b192aXJ0KHgpIF9fcGh5c190b192aXJ0KHgpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9wYXJhbS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9wYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ODBmODQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL3BhcmFtLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvcGFyYW0uaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgU0FOIFBlb3BsZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfUEFSQU1fSAorI2RlZmluZSBfX0FTTV9BUkNIX1BBUkFNX0gKKworLyoKKyAqIFdlIHVzZSBkZWZhdWx0IHBhcmFtcworICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9waW8uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvcGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5NTAxYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvcGlvLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL3Bpby5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMyBTQU4gUGVvcGxlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX1BJT19ICisjZGVmaW5lIF9fQVNNX0FSQ0hfUElPX0gKKworI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBBVDkxX0NmZ1BJT19VU0FSVDAodm9pZCkgeworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUElPQSArIFBJT19QRFIsIEFUOTFfUEExN19UWEQwIHwgQVQ5MV9QQTE4X1JYRDAgfCBBVDkxX1BBMjBfQ1RTMCk7CisKKwkvKgorCSAqIEVycmF0YSAjMzkgLSBSVFMwIGlzIG5vdCBpbnRlcm5hbGx5IGNvbm5lY3RlZCB0byBQQTIxLiAgV2UgbmVlZCB0byBkcml2ZQorCSAqICB0aGUgcGluIG1hbnVhbGx5LiAgRGVmYXVsdCBpcyBvZmYgKFJUUyBpcyBhY3RpdmUgbG93KS4KKwkgKi8KKwlhdDkxX3N5c193cml0ZShBVDkxX1BJT0EgKyBQSU9fUEVSLCBBVDkxX1BBMjFfUlRTMCk7CisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QSU9BICsgUElPX09FUiwgQVQ5MV9QQTIxX1JUUzApOworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUElPQSArIFBJT19TT0RSLCBBVDkxX1BBMjFfUlRTMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBBVDkxX0NmZ1BJT19VU0FSVDEodm9pZCkgeworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUElPQiArIFBJT19QRFIsIEFUOTFfUEIxOF9SSTEgfCBBVDkxX1BCMTlfRFRSMQorCQkJfCBBVDkxX1BCMjBfVFhEMSB8IEFUOTFfUEIyMV9SWEQxIHwgQVQ5MV9QQjIzX0RDRDEKKwkJCXwgQVQ5MV9QQjI0X0NUUzEgfCBBVDkxX1BCMjVfRFNSMSB8IEFUOTFfUEIyNl9SVFMxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIEFUOTFfQ2ZnUElPX1VTQVJUMih2b2lkKSB7CisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QSU9BICsgUElPX1BEUiwgQVQ5MV9QQTIyX1JYRDIgfCBBVDkxX1BBMjNfVFhEMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBBVDkxX0NmZ1BJT19VU0FSVDModm9pZCkgeworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUElPQSArIFBJT19QRFIsIEFUOTFfUEE1X1RYRDMgfCBBVDkxX1BBNl9SWEQzKTsKKwlhdDkxX3N5c193cml0ZShBVDkxX1BJT0EgKyBQSU9fQlNSLCBBVDkxX1BBNV9UWEQzIHwgQVQ5MV9QQTZfUlhEMyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBBVDkxX0NmZ1BJT19EQkdVKHZvaWQpIHsKKwlhdDkxX3N5c193cml0ZShBVDkxX1BJT0EgKyBQSU9fUERSLCBBVDkxX1BBMzFfRFRYRCB8IEFUOTFfUEEzMF9EUlhEKTsKK30KKworLyoKKyAqIEVuYWJsZSB0aGUgVHdvLVdpcmUgaW50ZXJmYWNlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgQVQ5MV9DZmdQSU9fVFdJKHZvaWQpIHsKKwlhdDkxX3N5c193cml0ZShBVDkxX1BJT0EgKyBQSU9fUERSLCBBVDkxX1BBMjVfVFdEIHwgQVQ5MV9QQTI2X1RXQ0spOworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUElPQSArIFBJT19BU1IsIEFUOTFfUEEyNV9UV0QgfCBBVDkxX1BBMjZfVFdDSyk7CisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QSU9BICsgUElPX01ERVIsIEFUOTFfUEEyNV9UV0QgfCBBVDkxX1BBMjZfVFdDSyk7CQkvKiBvcGVuIGRyYWluICovCit9CisKKy8qCisgKiBFbmFibGUgdGhlIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIEFUOTFfQ2ZnUElPX1NQSSh2b2lkKSB7CisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QSU9BICsgUElPX1BEUiwgQVQ5MV9QQTBfTUlTTyB8IEFUOTFfUEExX01PU0kgfCBBVDkxX1BBMl9TUENLKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIEFUOTFfQ2ZnUElPX1NQSV9DUzAodm9pZCkgeworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUElPQSArIFBJT19QRFIsIEFUOTFfUEEzX05QQ1MwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIEFUOTFfQ2ZnUElPX1NQSV9DUzEodm9pZCkgeworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUElPQSArIFBJT19QRFIsIEFUOTFfUEE0X05QQ1MxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIEFUOTFfQ2ZnUElPX1NQSV9DUzIodm9pZCkgeworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUElPQSArIFBJT19QRFIsIEFUOTFfUEE1X05QQ1MyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIEFUOTFfQ2ZnUElPX1NQSV9DUzModm9pZCkgeworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUElPQSArIFBJT19QRFIsIEFUOTFfUEE2X05QQ1MzKTsKK30KKworLyoKKyAqIFNlbGVjdCB0aGUgRGF0YUZsYXNoIGNhcmQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBBVDkxX0NmZ1BJT19EYXRhRmxhc2hDYXJkKHZvaWQpIHsKKwlhdDkxX3N5c193cml0ZShBVDkxX1BJT0IgKyBQSU9fUEVSLCBBVDkxX1BJT19QKDcpKTsKKwlhdDkxX3N5c193cml0ZShBVDkxX1BJT0IgKyBQSU9fT0VSLCBBVDkxX1BJT19QKDcpKTsKKwlhdDkxX3N5c193cml0ZShBVDkxX1BJT0IgKyBQSU9fQ09EUiwgQVQ5MV9QSU9fUCg3KSk7Cit9CisKKy8qCisgKiBFbmFibGUgTkFORCBGbGFzaCAoU21hcnRNZWRpYSkgaW50ZXJmYWNlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgQVQ5MV9DZmdQSU9fU21hcnRNZWRpYSh2b2lkKSB7CisJLyogZW5hYmxlIFBDMD1TTUNFLCBQQzE9U01PRSwgUEMzPVNNV0UsIEEyMT1DTEUsIEEyMj1BTEUgKi8KKwlhdDkxX3N5c193cml0ZShBVDkxX1BJT0MgKyBQSU9fQVNSLCBBVDkxX1BDMF9CRkNLIHwgQVQ5MV9QQzFfQkZSRFlfU01PRSB8IEFUOTFfUEMzX0JGQkFBX1NNV0UpOworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUElPQyArIFBJT19QRFIsIEFUOTFfUEMwX0JGQ0sgfCBBVDkxX1BDMV9CRlJEWV9TTU9FIHwgQVQ5MV9QQzNfQkZCQUFfU01XRSk7CisKKwkvKiBDb25maWd1cmUgUEMyIGFzIGlucHV0IChzaWduYWwgUkVBRFkgb2YgdGhlIFNtYXJ0TWVkaWEpICovCisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QSU9DICsgUElPX1BFUiwgQVQ5MV9QQzJfQkZBVkQpOwkvKiBlbmFibGUgZGlyZWN0IG91dHB1dCBlbmFibGUgKi8KKwlhdDkxX3N5c193cml0ZShBVDkxX1BJT0MgKyBQSU9fT0RSLCBBVDkxX1BDMl9CRkFWRCk7CS8qIGRpc2FibGUgb3V0cHV0ICovCisKKwkvKiBDb25maWd1cmUgUEIxIGFzIGlucHV0IChzaWduYWwgQ2FyZCBEZXRlY3Qgb2YgdGhlIFNtYXJ0TWVkaWEpICovCisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QSU9CICsgUElPX1BFUiwgQVQ5MV9QSU9fUCgxKSk7CS8qIGVuYWJsZSBkaXJlY3Qgb3V0cHV0IGVuYWJsZSAqLworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUElPQiArIFBJT19PRFIsIEFUOTFfUElPX1AoMSkpOwkvKiBkaXNhYmxlIG91dHB1dCAqLworfQorCitzdGF0aWMgaW5saW5lIGludCBBVDkxX1BJT19TbWFydE1lZGlhX1JEWSh2b2lkKSB7CisJcmV0dXJuIChhdDkxX3N5c19yZWFkKEFUOTFfUElPQyArIFBJT19QRFNSKSAmIEFUOTFfUElPX1AoMikpID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IEFUOTFfUElPX1NtYXJ0TWVkaWFfQ2FyZERldGVjdCh2b2lkKSB7CisJcmV0dXJuIChhdDkxX3N5c19yZWFkKEFUOTFfUElPQiArIFBJT19QRFNSKSAmIEFUOTFfUElPX1AoMSkpID8gMSA6IDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvc3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljNDI2NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvc3lzdGVtLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvc3lzdGVtLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIFNBTiBQZW9wbGUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX1NZU1RFTV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfU1lTVEVNX0gKKworI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2lkbGUodm9pZCkKK3sKKwkvKgorCSAqIERpc2FibGUgdGhlIHByb2Nlc3NvciBjbG9jay4gIFRoZSBwcm9jZXNzb3Igd2lsbCBiZSBhdXRvbWF0aWNhbGx5CisJICogcmUtZW5hYmxlZCBieSBhbiBpbnRlcnJ1cHQgb3IgYnkgYSByZXNldC4KKwkgKi8KKy8vCWF0OTFfc3lzX3dyaXRlKEFUOTFfUE1DX1NDRFIsIEFUOTFfUE1DX1BDSyk7CisKKwkvKgorCSAqIFNldCB0aGUgcHJvY2Vzc29yIChDUDE1KSBpbnRvICdXYWl0IGZvciBJbnRlcnJ1cHQnIG1vZGUuCisJICogVW5saWtlIGRpc2FibGluZyB0aGUgcHJvY2Vzc29yIGNsb2NrIHZpYSB0aGUgUE1DIChhYm92ZSkKKwkgKiAgdGhpcyBhbGxvd3MgdGhlIHByb2Nlc3NvciB0byBiZSB3b2tlbiB2aWEgSlRBRy4KKwkgKi8KKwljcHVfZG9faWRsZSgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9yZXNldChjaGFyIG1vZGUpCit7CisJLyoKKwkgKiBQZXJmb3JtIGEgaGFyZHdhcmUgcmVzZXQgd2l0aCB0aGUgdXNlIG9mIHRoZSBXYXRjaGRvZyB0aW1lci4KKwkgKi8KKwlhdDkxX3N5c193cml0ZShBVDkxX1NUX1dETVIsIEFUOTFfU1RfUlNURU4gfCBBVDkxX1NUX0VYVEVOIHwgMSk7CisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TVF9DUiwgQVQ5MV9TVF9XRFJTVCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC90aW1leC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC90aW1leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMTEyZGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL3RpbWV4LmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvdGltZXguaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgU0FOIFBlb3BsZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfVElNRVhfSAorI2RlZmluZSBfX0FTTV9BUkNIX1RJTUVYX0gKKworI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisKKyNkZWZpbmUgQ0xPQ0tfVElDS19SQVRFCQkoQVQ5MV9TTE9XX0NMT0NLKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvdW5jb21wcmVzcy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC91bmNvbXByZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMwZGQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvdW5jb21wcmVzcy5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL3VuY29tcHJlc3MuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgU0FOIFBlb3BsZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfVU5DT01QUkVTU19ICisjZGVmaW5lIF9fQVNNX0FSQ0hfVU5DT01QUkVTU19ICisKKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorCisvKgorICogVGhlIGZvbGxvd2luZyBjb2RlIGFzc3VtZXMgdGhlIHNlcmlhbCBwb3J0IGhhcyBhbHJlYWR5IGJlZW4KKyAqIGluaXRpYWxpemVkIGJ5IHRoZSBib290bG9hZGVyLiAgV2Ugc2VhcmNoIGZvciB0aGUgZmlyc3QgZW5hYmxlZAorICogcG9ydCBpbiB0aGUgbW9zdCBwcm9iYWJsZSBvcmRlci4gIElmIHlvdSBkaWRuJ3Qgc2V0dXAgYSBwb3J0IGluCisgKiB5b3VyIGJvb3Rsb2FkZXIgdGhlbiBub3RoaW5nIHdpbGwgYXBwZWFyICh3aGljaCBtaWdodCBiZSBkZXNpcmVkKS4KKyAqCisgKiBUaGlzIGRvZXMgbm90IGFwcGVuZCBhIG5ld2xpbmUKKyAqLworc3RhdGljIHZvaWQgcHV0c3RyKGNvbnN0IGNoYXIgKnMpCit7CisJdm9pZCBfX2lvbWVtICpzeXMgPSAodm9pZCBfX2lvbWVtICopIEFUOTFfQkFTRV9TWVM7CS8qIHBoeXNpY2FsIGFkZHJlc3MgKi8KKworCXdoaWxlICgqcykgeworCQl3aGlsZSAoIShfX3Jhd19yZWFkbChzeXMgKyBBVDkxX0RCR1VfU1IpICYgQVQ5MV9EQkdVX1RYUkRZKSkgeyBiYXJyaWVyKCk7IH0KKwkJX19yYXdfd3JpdGVsKCpzLCBzeXMgKyBBVDkxX0RCR1VfVEhSKTsKKwkJaWYgKCpzID09ICdcbicpCXsKKwkJCXdoaWxlICghKF9fcmF3X3JlYWRsKHN5cyArIEFUOTFfREJHVV9TUikgJiBBVDkxX0RCR1VfVFhSRFkpKSB7IGJhcnJpZXIoKTsgfQorCQkJX19yYXdfd3JpdGVsKCdccicsIHN5cyArIEFUOTFfREJHVV9USFIpOworCQl9CisJCXMrKzsKKwl9CisJLyogd2FpdCBmb3IgdHJhbnNtaXNzaW9uIHRvIGNvbXBsZXRlICovCisJd2hpbGUgKCEoX19yYXdfcmVhZGwoc3lzICsgQVQ5MV9EQkdVX1NSKSAmIEFUOTFfREJHVV9UWEVNUFRZKSkgeyBiYXJyaWVyKCk7IH0KK30KKworI2RlZmluZSBhcmNoX2RlY29tcF9zZXR1cCgpCisKKyNkZWZpbmUgYXJjaF9kZWNvbXBfd2RvZygpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC92bWFsbG9jLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL3ZtYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGQ5NzE4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC92bWFsbG9jLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvdm1hbGxvYy5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMyBTQU4gUGVvcGxlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX19BU01fQVJDSF9WTUFMTE9DX0gKKyNkZWZpbmUgX19BU01fQVJDSF9WTUFMTE9DX0gKKworI2RlZmluZSBWTUFMTE9DX0VORAkJKEFUOTFfSU9fVklSVF9CQVNFICYgUEdESVJfTUFTSykKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jbDc1MDAvZG1hLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jbDc1MDAvZG1hLmgKaW5kZXggMWQ2YTg4Mi4uNTkxZWQyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtY2w3NTAwL2RtYS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWNsNzUwMC9kbWEuaApAQCAtMTUsNyArMTUsNiBAQAogICogYnl0ZXMgb2YgUkFNLgogICovCiAjZGVmaW5lIE1BWF9ETUFfQUREUkVTUwkJMHhkMDAwMDAwMAotI2RlZmluZSBNQVhfRE1BX0NIQU5ORUxTCTAKIAogI2RlZmluZSBETUFfUzAJCQkwCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWNsNzUwMC9lbnRyeS1tYWNyby5TIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtY2w3NTAwL2VudHJ5LW1hY3JvLlMKaW5kZXggNjg2ZjQxMy4uYzllNTM5NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtY2w3NTAwL2VudHJ5LW1hY3JvLlMKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtY2w3NTAwL2VudHJ5LW1hY3JvLlMKQEAgLTEsMyArMSwzIEBACi0KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZW50cnktbWFjcm8taW9tZC5TPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jbHBzNzExeC9kbWEuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWNscHM3MTF4L2RtYS5oCmluZGV4IDNjNGM1YzguLjYxMDk5NzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWNscHM3MTF4L2RtYS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWNscHM3MTF4L2RtYS5oCkBAIC0xNywxMiArMTcsMyBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwotI2lmbmRlZiBfX0FTTV9BUkNIX0RNQV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfRE1BX0gKLQotI2RlZmluZSBNQVhfRE1BX0FERFJFU1MJCTB4ZmZmZmZmZmYKLQotI2RlZmluZSBNQVhfRE1BX0NIQU5ORUxTCTAKLQotI2VuZGlmIC8qIF9BU01fQVJDSF9ETUFfSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jbHBzNzExeC9lbnRyeS1tYWNyby5TIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtY2xwczcxMXgvZW50cnktbWFjcm8uUwppbmRleCBiMzEwNzlhLi4yMWY2ZWU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jbHBzNzExeC9lbnRyeS1tYWNyby5TCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWNscHM3MTF4L2VudHJ5LW1hY3JvLlMKQEAgLTcsNiArNyw3IEBACiAgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKICAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbHBzNzExMS5oPgogCiAJCS5tYWNybwlkaXNhYmxlX2ZpcQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtY2xwczcxMXgvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jbHBzNzExeC9zeXN0ZW0uaAppbmRleCAyYWI5ODFmLi4xMWUxNDkxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jbHBzNzExeC9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jbHBzNzExeC9zeXN0ZW0uaApAQCAtMjAsNyArMjAsOSBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX1NZU1RFTV9ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfU1lTVEVNX0gKIAorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbHBzNzExMS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9pZGxlKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lYnNhMTEwL2RtYS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZWJzYTExMC9kbWEuaAppbmRleCBkNDkxNzc2Li5jNTJmOWUyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZWJzYTExMC9kbWEuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lYnNhMTEwL2RtYS5oCkBAIC05LDExICs5LDMgQEAKICAqCiAgKiAgRUJTQTExMCBETUEgZGVmaW5pdGlvbnMKICAqLwotI2lmbmRlZiBfX0FTTV9BUkNIX0RNQV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfRE1BX0gKLQotI2RlZmluZSBNQVhfRE1BX0FERFJFU1MJCTB4ZmZmZmZmZmYKLSNkZWZpbmUgTUFYX0RNQV9DSEFOTkVMUwkwCi0KLSNlbmRpZiAvKiBfQVNNX0FSQ0hfRE1BX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZWJzYTI4NS9kbWEuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVic2EyODUvZG1hLmgKaW5kZXggYzQzMDQ2ZS4uMDI1OWFkNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZWJzYTI4NS9kbWEuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lYnNhMjg1L2RtYS5oCkBAIC0xMCwxMSArMTAsNiBAQAogI2RlZmluZSBfX0FTTV9BUkNIX0RNQV9ICiAKIC8qCi0gKiBUaGlzIGlzIHRoZSBtYXhpbXVtIERNQSBhZGRyZXNzIHRoYXQgY2FuIGJlIERNQWQgdG8uCi0gKi8KLSNkZWZpbmUgTUFYX0RNQV9BRERSRVNTCQkweGZmZmZmZmZmCi0KLS8qCiAgKiBUaGUgMjEyODUgaGFzIHR3byBpbnRlcm5hbCBETUEgY2hhbm5lbHM7IHdlIGNhbGwgdGhlc2UgOCBhbmQgOS4KICAqIE9uIENBVFMgaGFyZHdhcmUgd2UgaGF2ZSBhbiBhZGRpdGlvbmFsIGVpZ2h0IElTQSBkbWEgY2hhbm5lbHMKICAqIG51bWJlcmVkIDAuLjcuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lYnNhMjg1L2VudHJ5LW1hY3JvLlMgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lYnNhMjg1L2VudHJ5LW1hY3JvLlMKaW5kZXggZGI1NzI5Zi4uY2YxMGFjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZWJzYTI4NS9lbnRyeS1tYWNyby5TCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVic2EyODUvZW50cnktbWFjcm8uUwpAQCAtNyw2ICs3LDggQEAKICAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQogICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICovCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9kZWMyMTI4NS5oPgogCiAJCS5tYWNybwlkaXNhYmxlX2ZpcQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvZGVidWctbWFjcm8uUyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL2RlYnVnLW1hY3JvLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMTFjNTEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvZGVidWctbWFjcm8uUworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL2RlYnVnLW1hY3JvLlMKLSAqCi0gKiBEZWJ1Z2dpbmcgbWFjcm8gaW5jbHVkZSBoZWFkZXIKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTkgUnVzc2VsbCBLaW5nCi0gKiAgTW92ZWQgZnJvbSBsaW51eC9hcmNoL2FybS9rZXJuZWwvZGVidWcuUyBieSBCZW4gRG9va3MKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSovCi0KLSNpbmNsdWRlIDxhc20vYXJjaC9leGNhbGlidXIuaD4KLSNkZWZpbmUgVUFSVDAwX1RZUEUKLSNpbmNsdWRlIDxhc20vYXJjaC91YXJ0MDAuaD4KLQotCQkubWFjcm8JYWRkcnVhcnQscngKLQkJbXJjCXAxNSwgMCwgXHJ4LCBjMSwgYzAKLQkJdHN0CVxyeCwgIzEJCQlAIE1NVSBlbmFibGVkPwotCQlsZHIJXHJ4LCA9RVhDX1VBUlQwMF9CQVNFCUAgcGh5c2ljYWwgYmFzZSBhZGRyZXNzCi0JCW9ycm5lCVxyeCwgXHJ4LCAjMHhmZjAwMDAwMAlAIHZpcnR1YWwgYmFzZQotCQlvcnJuZQlccngsIFxyeCwgIzB4MDBmMDAwMDAKLQkJLmVuZG0KLQotCQkubWFjcm8Jc2VuZHVhcnQscmQscngKLQkJc3RyCVxyZCwgW1xyeCwgI1VBUlRfVEQoMCldCi0JCS5lbmRtCi0KLQkJLm1hY3JvCXdhaXR1YXJ0LHJkLHJ4Ci0xMDAxOgkJbGRyCVxyZCwgW1xyeCwgI1VBUlRfVFNSKDApXQotCQlhbmQgCVxyZCwgXHJkLCAgI1VBUlRfVFNSX1RYX0xFVkVMX01TSwotCQljbXAJXHJkLCAjMTUKLQkJYmVxCTEwMDFiCi0JCS5lbmRtCi0KLQkJLm1hY3JvCWJ1c3l1YXJ0LHJkLHJ4Ci0xMDAxOgkJbGRyCVxyZCwgW1xyeCwgI1VBUlRfVFNSKDApXQotCQlhbmRzIAlccmQsIFxyZCwgICNVQVJUX1RTUl9UWF9MRVZFTF9NU0sKLQkJYm5lCTEwMDFiCi0JCS5lbmRtCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcHhhMTBkYi9kbWEuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL2RtYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDk3NzM0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL2RtYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqICBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jYW1lbG90L2RtYS5oCi0gKgotICogIENvcHlyaWdodCAoQykgMTk5NywxOTk4IFJ1c3NlbGwgS2luZwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotI2lmbmRlZiBfX0FTTV9BUkNIX0RNQV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfRE1BX0gKLQotI2RlZmluZSBNQVhfRE1BX0FERFJFU1MJCTB4ZmZmZmZmZmYKLQotI2RlZmluZSBNQVhfRE1BX0NIQU5ORUxTCTAKLQotI2VuZGlmIC8qIF9BU01fQVJDSF9ETUFfSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcHhhMTBkYi9lbnRyeS1tYWNyby5TIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvZW50cnktbWFjcm8uUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU2YWUwOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcHhhMTBkYi9lbnRyeS1tYWNyby5TCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL2VudHJ5LW1hY3JvLlMKLSAqCi0gKiBMb3ctbGV2ZWwgSVJRIGhlbHBlciBtYWNyb3MgZm9yIGVweGExMGRiIHBsYXRmb3JtCi0gKgotICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55Ci0gKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKi8KLSNpbmNsdWRlIDxhc20vYXJjaC9wbGF0Zm9ybS5oPgotI3VuZGVmIElSUV9NT0RFIC8qIHNhbWUgbmFtZSBkZWZpbmVkIGluIGFzbS9wcm9jL3B0cmFjZS5oICovCi0jaW5jbHVkZSA8YXNtL2FyY2gvaW50X2N0cmwwMC5oPgotCi0JCS5tYWNybwlkaXNhYmxlX2ZpcQotCQkuZW5kbQotCi0JCS5tYWNybwlnZXRfaXJxbnJfYW5kX2Jhc2UsIGlycW5yLCBpcnFzdGF0LCBiYXNlLCB0bXAKLQotCQlsZHIJXGlycXN0YXQsID1JTlRfSUQoSU9fQUREUkVTUyhFWENfSU5UX0NUUkwwMF9CQVNFKSkKLQkJbGRyCVxpcnFucixbXGlycXN0YXRdCi0JCWNtcAlcaXJxbnIsIzAKLQkJc3VibmUJXGlycW5yLFxpcnFuciwjMQotCi0JCS5lbmRtCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL2V0aGVyMDAuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL2V0aGVyMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczN2I4YS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcHhhMTBkYi9ldGhlcjAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotI2lmbmRlZiBfX0VUSEVSMDBfSAotI2RlZmluZSBfX0VUSEVSMDBfSAotCi0KLQotLyoKLSAqIFJlZ2lzdGVyIGRlZmluaXRpb25zIGZvciB0aGUgRXRoZXJuZXQgTUFDCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgQWx0ZXJhIENvcnBvcmF0aW9uIDIwMDAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICovCi0KLS8qCi0qCVN0cnVjdHVyZXMgZm9yIHRoZSBETUEgY29udHJvbGxlcgotKi8KLXR5cGVkZWYgc3RydWN0IGZkYV9kZXNjCi0JewotCXN0cnVjdCBmZGFfZGVzYyAqCUZETmV4dDsKLQlsb25nCQkJCUZEU3lzdGVtOwotCWxvbmcJCQkJRkRTdGF0OwotCXNob3J0CQkJCUZETGVuZ3RoOwotCXNob3J0CQkJCUZEQ3RsOwotCX1GREFfREVTQzsKLQotdHlwZWRlZiBzdHJ1Y3QgYnVmX2Rlc2MKLQl7Ci0JY2hhciAqCUJ1ZmZEYXRhOwotCXNob3J0CUJ1ZmZMZW5ndGg7Ci0JY2hhcglCRFN0YXQ7Ci0JY2hhcglCREN0bDsKLQl9QlVGX0RFU0M7Ci0KLS8qCi0qCUNvbnRyb2wgbWFza3MgZm9yIHRoZSBETUEgY29udHJvbGxlcgotKi8KLSNkZWZpbmUgRkRDVExfQkRDT1VOVF9NU0sJCQkJCQkoMHgxRikKLSNkZWZpbmUgRkRDVExfQkRDT1VOVF9PRlNUCQkJCQkJKDApCi0jZGVmaW5lIEZEQ1RMX0ZSTU9QVF9NU0sJCQkJCQkoMHg3QzAwKQotI2RlZmluZSBGRENUTF9GUk1PUFRfT0ZTVAkJCQkJCSgxMCkKLSNkZWZpbmUJRkRDVExfQ09XTlNGRF9NU0sJCQkJCQkoMHg4MDAwKQotI2RlZmluZQlGRENUTF9DT1dOU0ZEX09GU1QJCQkJCQkoMTUpCi0KLSNkZWZpbmUgQkRDVExfUlhCRFNFUU5fTVNLCQkJCQkJKDB4N0YpCi0jZGVmaW5lIEJEQ1RMX1JYQkRTRVFOX09GU1QJCQkJCQkoMCkKLSNkZWZpbmUJQkRDVExfQ09XTlNCRF9NU0sJCQkJCQkoMHg4MCkKLSNkZWZpbmUJQkRDVExfQ09XTlNCRF9PRlNUCQkJCQkJKDcpCi0KLSNkZWZpbmUgRkRORVhUX0VPTF9NU0sJCQkJCQkJKDB4MSkKLSNkZWZpbmUgRkRORVhUX0VPTF9PRlNUCQkJCQkJCSgwKQotI2RlZmluZSBGRE5FWFRfRU9MX1BPSU5URVJfTVNLCQkJCQkoMHhGRkZGRkZGMCkKLSNkZWZpbmUgRkRORVhUX0VPTF9QT0lOVEVSX09GU1QJCQkJCSg0KQotCi0jZGVmaW5lIEVUSEVSX0FSQ19TSVpFICAgICAgICAgKDIxKQotCi0vKgotKglSZWdpc3RlciBkZWZpbml0aW9ucyBhbmQgbWFza3MKLSovCi0jZGVmaW5lIEVUSEVSX0RNQV9DVEwoYmFzZSkJCQkJCQkJKEVUSEVSMDBfVFlQRSAoYmFzZSArIDB4MTAwKSkKLSNkZWZpbmUgRVRIRVJfRE1BX0NUTF9ETUJVUlNUX09GU1QJCQkJKDIpCi0jZGVmaW5lIEVUSEVSX0RNQV9DVExfRE1CVVJTVF9NU0sJCQkJKDB4MUZDKQotI2RlZmluZSBFVEhFUl9ETUFfQ1RMX1BPV1JNR01OVF9PRlNUCQkJKDExKQotI2RlZmluZSBFVEhFUl9ETUFfQ1RMX1BPV1JNR01OVF9NU0sJCQkJKDB4MTAwMCkKLSNkZWZpbmUgRVRIRVJfRE1BX0NUTF9UWEJJR0VfT0ZTVAkJCQkoMTQpCi0jZGVmaW5lIEVUSEVSX0RNQV9DVExfVFhCSUdFX01TSwkJCQkoMHg0MDAwKQotI2RlZmluZSBFVEhFUl9ETUFfQ1RMX1JYQklHRV9PRlNUCQkJCSgxNSkKLSNkZWZpbmUgRVRIRVJfRE1BX0NUTF9SWEJJR0VfTVNLCQkJCSgweDgwMDApCi0jZGVmaW5lIEVUSEVSX0RNQV9DVExfVFhXQUtFVVBfT0ZTVAkJCQkoMTYpCi0jZGVmaW5lIEVUSEVSX0RNQV9DVExfVFhXQUtFVVBfTVNLCQkJCSgweDEwMDAwKQotI2RlZmluZSBFVEhFUl9ETUFfQ1RMX1NXSU5UUkVRX09GU1QJCQkJKDE3KQotI2RlZmluZSBFVEhFUl9ETUFfQ1RMX1NXSU5UUkVRX01TSwkJCQkoMHgyMDAwMCkKLSNkZWZpbmUgRVRIRVJfRE1BX0NUTF9JTlRNQVNLX09GU1QJCQkJKDE4KQotI2RlZmluZSBFVEhFUl9ETUFfQ1RMX0lOVE1BU0tfTVNLCQkJCSgweDQwMDAwKQotI2RlZmluZSBFVEhFUl9ETUFfQ1RMX002NkVOU1RBVF9PRlNUCQkJKDE5KQotI2RlZmluZSBFVEhFUl9ETUFfQ1RMX002NkVOU1RBVF9NU0sJCQkJKDB4ODAwMDApCi0jZGVmaW5lIEVUSEVSX0RNQV9DVExfUk1UWElOSVRfT0ZTVAkJCQkoMjApCi0jZGVmaW5lIEVUSEVSX0RNQV9DVExfUk1UWElOSVRfTVNLCQkJCSgweDEwMDAwMCkKLSNkZWZpbmUgRVRIRVJfRE1BX0NUTF9STVJYSU5JVF9PRlNUCQkJCSgyMSkKLSNkZWZpbmUgRVRIRVJfRE1BX0NUTF9STVJYSU5JVF9NU0sJCQkJKDB4MjAwMDAwKQotI2RlZmluZSBFVEhFUl9ETUFfQ1RMX1JYQUxJR05fT0ZTVAkJCQkoMjIpCi0jZGVmaW5lIEVUSEVSX0RNQV9DVExfUlhBTElHTl9NU0sJCQkJKDB4QzAwMDAwKQotI2RlZmluZSBFVEhFUl9ETUFfQ1RMX1JNU1dSUV9PRlNUCQkJCSgyNCkKLSNkZWZpbmUgRVRIRVJfRE1BX0NUTF9STVNXUlFfTVNLCQkJCSgweDEwMDAwMDApCi0jZGVmaW5lIEVUSEVSX0RNQV9DVExfUk1FTUJBTktfT0ZTVAkJCQkoMjUpCi0jZGVmaW5lIEVUSEVSX0RNQV9DVExfUk1FTUJBTktfTVNLCQkJCSgweDIwMDAwMDApCi0KLSNkZWZpbmUgRVRIRVJfVFhGUk1QVFIoYmFzZSkJCQkJCQkJKEVUSEVSMDBfVFlQRSAoYmFzZSArIDB4MTA0KSkKLQotI2RlZmluZSBFVEhFUl9UWFRIUlNIKGJhc2UpCQkJCQkJCShFVEhFUjAwX1RZUEUgKGJhc2UgKyAweDMwOCkpCi0KLSNkZWZpbmUgRVRIRVJfVFhQT0xMQ1RSKGJhc2UpCQkJCQkJCShFVEhFUjAwX1RZUEUgKGJhc2UgKyAweDMwYykpCi0KLSNkZWZpbmUJRVRIRVJfQkxGUk1QVFIoYmFzZSkJCQkJCQkJKEVUSEVSMDBfVFlQRSAoYmFzZSArIDB4MTEwKSkKLSNkZWZpbmUgRVRIRVJfQkxGRlJNUFRSX0VPTF9PRlNUCQkJCSgwKQotI2RlZmluZSBFVEhFUl9CTEZGUk1QVFJfRU9MX01TSwkJCQkJKDB4MSkKLSNkZWZpbmUgRVRIRVJfQkxGRlJNUFRSX0FERFJFU1NfT0ZTVAkJCSg0KQotI2RlZmluZSBFVEhFUl9CTEZGUk1QVFJfQUREUkVTU19NU0sJCQkJKDB4RkZGRkZGRjApCi0KLSNkZWZpbmUgRVRIRVJfUlhGUkFHU0laRShiYXNlKQkJCQkJCShFVEhFUjAwX1RZUEUgKGJhc2UgKyAweDExNCkpCi0jZGVmaW5lCUVUSEVSX1JYRlJBR1NJWkVfTUlORlJBR19PRlNUCQkJKDIpCi0jZGVmaW5lCUVUSEVSX1JYRlJBR1NJWkVfTUlORlJBR19NU0sJCQkoMHhGRkMpCi0jZGVmaW5lCUVUSEVSX1JYRlJBR1NJWkVfRU5QQUNLX09GU1QJCQkoMTUpCi0jZGVmaW5lCUVUSEVSX1JYRlJBR1NJWkVfRU5QQUNLX01TSwkJCQkoMHg4MDAwKQotCi0jZGVmaW5lIEVUSEVSX0lOVF9FTihiYXNlKQkJCQkJCQkoRVRIRVIwMF9UWVBFIChiYXNlICsgMHgxMTgpKQotI2RlZmluZSBFVEhFUl9JTlRfRU5fRkRBRVhFTl9PRlNUCQkJCSgwKQotI2RlZmluZSBFVEhFUl9JTlRfRU5fRkRBRVhFTl9NU0sJCQkJKDB4MSkKLSNkZWZpbmUgRVRIRVJfSU5UX0VOX0JMRVhFTl9PRlNUCQkJCSgxKQotI2RlZmluZSBFVEhFUl9JTlRfRU5fQkxFWE5fTVNLCQkJCQkoMHgyKQotI2RlZmluZSBFVEhFUl9JTlRfRU5fU1RBUkdBQlRFTl9PRlNUCQkJKDIpCi0jZGVmaW5lIEVUSEVSX0lOVF9FTl9TVEFSR0FCVEVOX01TSwkJCQkoMHg0KQotI2RlZmluZSBFVEhFUl9JTlRfRU5fUlRBUkdBQlRFTl9PRlNUCQkJKDMpCi0jZGVmaW5lIEVUSEVSX0lOVF9FTl9SVEFSR0FCVEVOX01TSwkJCQkoMHg4KQotI2RlZmluZSBFVEhFUl9JTlRfRU5fUk1BU0FCVEVOX09GU1QJCQkJKDQpCi0jZGVmaW5lIEVUSEVSX0lOVF9FTl9STUFTQUJURU5fTVNLCQkJCSgweDEwKQotI2RlZmluZSBFVEhFUl9JTlRfRU5fU1NZU0VSUkVOX09GU1QJCQkJKDUpCi0jZGVmaW5lIEVUSEVSX0lOVF9FTl9TU1lTRVJSRU5fTVNLCQkJCSgweDIwKQotI2RlZmluZSBFVEhFUl9JTlRfRU5fRFBBUkVSUkVOX09GU1QJCQkJKDYpCi0jZGVmaW5lIEVUSEVSX0lOVF9FTl9EUEFSRVJSRU5fTVNLCQkJCSgweDQwKQotI2RlZmluZSBFVEhFUl9JTlRfRU5fRUFSTk9URU5fT0ZTVAkJCQkoNykKLSNkZWZpbmUgRVRIRVJfSU5UX0VOX0VBUk5PVEVOX01TSwkJCQkoMHg4MCkKLSNkZWZpbmUgRVRIRVJfSU5UX0VOX0RQQVJERU5fT0ZTVAkJCQkoOCkKLSNkZWZpbmUgRVRIRVJfSU5UX0VOX0RQQVJERU5fTVNLCQkJCSgweDEwMCkKLSNkZWZpbmUgRVRIRVJfSU5UX0VOX0RNUEFSRVJSRU5fT0ZTVAkJCSg5KQotI2RlZmluZSBFVEhFUl9JTlRfRU5fRE1QQVJFUlJFTl9NU0sJCQkJKDB4MjAwKQotI2RlZmluZSBFVEhFUl9JTlRfRU5fVFhDVExDTVBFTl9PRlNUCQkJKDEwKQotI2RlZmluZSBFVEhFUl9JTlRfRU5fVFhDVExDTVBFTl9NU0sJCQkJKDB4NDAwKQotI2RlZmluZSBFVEhFUl9JTlRfRU5fTlJBQlRFTl9PRlNUCQkJCSgxMSkKLSNkZWZpbmUgRVRIRVJfSU5UX0VOX05SQUJURU5fTVNLCQkJCSgweDgwMCkKLQotI2RlZmluZQlFVEhFUl9GREFfQkFTKGJhc2UpCQkJCQkJCShFVEhFUjAwX1RZUEUgKGJhc2UgKyAweDExQykpCi0jZGVmaW5lIEVUSEVSX0ZEQV9CQVNfQUREUkVTU19PRlNUCQkJCSg0KQotI2RlZmluZSBFVEhFUl9GREFfQkFTX0FERFJFU1NfTVNLCQkJCSgweEZGRkZGRkYwKQotCi0jZGVmaW5lIEVUSEVSX0ZEQV9MSU0oYmFzZSkJCQkJCQkJKEVUSEVSMDBfVFlQRSAoYmFzZSArIDB4MTIwKSkKLSNkZWZpbmUgRVRIRVJfRkRBX0xJTV9DT1VOVF9PRlNUCQkJCSg0KQotI2RlZmluZSBFVEhFUl9GREFfTElNX0NPVU5UX01TSwkJCQkJKDB4RkZGMCkKLQotI2RlZmluZSBFVEhFUl9JTlRfU1JDKGJhc2UpCQkJCQkJCShFVEhFUjAwX1RZUEUgKGJhc2UgKyAweDEyNCkpCi0jZGVmaW5lIEVUSEVSX0lOVF9TUkNfSU5UTUFDVFhfT0ZTVAkJCQkoMCkKLSNkZWZpbmUgRVRIRVJfSU5UX1NSQ19JTlRNQUNUWF9NU0sJCQkJKDB4MSkKLSNkZWZpbmUgRVRIRVJfSU5UX1NSQ19JTlRNQUNSWF9PRlNUCQkJCSgxKQotI2RlZmluZSBFVEhFUl9JTlRfU1JDX0lOVE1BQ1JYX01TSwkJCQkoMHgyKQotI2RlZmluZSBFVEhFUl9JTlRfU1JDX0lOVFNCVVNfT0ZTVAkJCQkoMikKLSNkZWZpbmUgRVRIRVJfSU5UX1NSQ19JTlRTQlVTX01TSwkJCQkoMHg0KQotI2RlZmluZSBFVEhFUl9JTlRfU1JDX0lOVEZEQUVYX09GU1QJCQkJKDMpCi0jZGVmaW5lIEVUSEVSX0lOVF9TUkNfSU5URkRBRVhfTVNLCQkJCSgweDgpCi0jZGVmaW5lIEVUSEVSX0lOVF9TUkNfSU5UQkxFWF9PRlNUCQkJCSg0KQotI2RlZmluZSBFVEhFUl9JTlRfU1JDX0lOVEJMRVhfTVNLCQkJCSgweDEwKQotI2RlZmluZSBFVEhFUl9JTlRfU1JDX1NXSU5UX09GU1QJCQkJKDUpCi0jZGVmaW5lIEVUSEVSX0lOVF9TUkNfU1dJTlRfTVNLCQkJCQkoMHgyMCkKLSNkZWZpbmUgRVRIRVJfSU5UX1NSQ19JTlRFQVJOT1RfT0ZTVAkJCSg2KQotI2RlZmluZSBFVEhFUl9JTlRfU1JDX0lOVEVBUk5PVF9NU0sJCQkJKDB4NDApCi0jZGVmaW5lIEVUSEVSX0lOVF9TUkNfRE1QQVJFUlJfT0ZTVAkJCQkoNykKLSNkZWZpbmUgRVRIRVJfSU5UX1NSQ19ETVBBUkVSUl9NU0sJCQkJKDB4ODApCi0jZGVmaW5lIEVUSEVSX0lOVF9TUkNfSU5URVhCRF9PRlNUCQkJCSg4KQotI2RlZmluZSBFVEhFUl9JTlRfU1JDX0lOVEVYQkRfTVNLCQkJCSgweDEwMCkKLSNkZWZpbmUgRVRIRVJfSU5UX1NSQ19JTlRUWENUTENNUF9PRlNUCQkJKDkpCi0jZGVmaW5lIEVUSEVSX0lOVF9TUkNfSU5UVFhDVExDTVBfTVNLCQkJKDB4MjAwKQotI2RlZmluZSBFVEhFUl9JTlRfU1JDX0lOVE5SQUJUX09GU1QJCQkJKDEwKQotI2RlZmluZSBFVEhFUl9JTlRfU1JDX0lOVE5SQUJUX01TSwkJCQkoMHg0MDApCi0jZGVmaW5lIEVUSEVSX0lOVF9TUkNfRkRBRVhfT0ZTVAkJCQkoMTEpCi0jZGVmaW5lIEVUSEVSX0lOVF9TUkNfRkRBRVhfTVNLCQkJCQkoMHg4MDApCi0jZGVmaW5lIEVUSEVSX0lOVF9TUkNfQkxFWF9PRlNUCQkJCQkoMTIpCi0jZGVmaW5lIEVUSEVSX0lOVF9TUkNfQkxFWF9NU0sJCQkJCSgweDEwMDApCi0jZGVmaW5lIEVUSEVSX0lOVF9TUkNfRE1QQVJFUlJTVEFUX09GU1QJCQkoMTMpCi0jZGVmaW5lIEVUSEVSX0lOVF9TUkNfRE1QQVJFUlJTVEFUX01TSwkJCSgweDIwMDApCi0jZGVmaW5lIEVUSEVSX0lOVF9TUkNfTlJBQlRfT0ZTVAkJCQkoMTQpCi0jZGVmaW5lIEVUSEVSX0lOVF9TUkNfTlJBQlRfTVNLCQkJCQkoMHg0MDAwKQotI2RlZmluZSBFVEhFUl9JTlRfU1JDX0lOVExJTktfT0ZTVAkJCQkoMTUpCi0jZGVmaW5lIEVUSEVSX0lOVF9TUkNfSU5UTElOS19NU0sJCQkJKDB4ODAwMCkKLSNkZWZpbmUgRVRIRVJfSU5UX1NSQ19JTlRFWERFRkVSX09GU1QJCQkoMTYpCi0jZGVmaW5lIEVUSEVSX0lOVF9TUkNfSU5URVhERUZFUl9NU0sJCQkoMHgxMDAwMCkKLSNkZWZpbmUgRVRIRVJfSU5UX1NSQ19JTlRSTU9OX09GU1QJCQkJKDE3KQotI2RlZmluZSBFVEhFUl9JTlRfU1JDX0lOVFJNT05fTVNLCQkJCSgweDIwMDAwKQotI2RlZmluZSBFVEhFUl9JTlRfU1JDX0lSUV9NU0sJCQkJCSgweDgzRkYpCi0KLSNkZWZpbmUgRVRIRVJfUEFVU0VDTlQoYmFzZSkJCQkJCQkJKEVUSEVSMDBfVFlQRSAoYmFzZSArIDB4NDApKQotI2RlZmluZSBFVEhFUl9QQVVTRUNOVF9DT1VOVF9PRlNUCQkJCSgwKQotI2RlZmluZSBFVEhFUl9QQVVTRUNOVF9DT1VOVF9NU0sJCQkJKDB4RkZGRikKLQotI2RlZmluZSBFVEhFUl9SRU1QQVVDTlQoYmFzZSkJCQkJCQkJKEVUSEVSMDBfVFlQRSAoYmFzZSArIDB4NDQpKQotI2RlZmluZSBFVEhFUl9SRU1QQVVDTlRfQ09VTlRfT0ZTVAkJCQkoMCkKLSNkZWZpbmUgRVRIRVJfUkVNUEFVQ05UX0NPVU5UX01TSwkJCQkoMHhGRkZGKQotCi0jZGVmaW5lIEVUSEVSX1RYQ09ORlJNU1RBVChiYXNlKQkJCQkJCShFVEhFUjAwX1RZUEUgKGJhc2UgKyAweDM0OCkpCi0jZGVmaW5lIEVUSEVSX1RYQ09ORlJNU1RBVF9UU19TVEFUX1ZBTFVFX09GU1QJKDApCi0jZGVmaW5lIEVUSEVSX1RYQ09ORlJNU1RBVF9UU19TVEFUX1ZBTFVFX01TSwkoMHgzRkZGRkYpCi0KLSNkZWZpbmUgRVRIRVJfTUFDX0NUTChiYXNlKQkJCQkJCQkoRVRIRVIwMF9UWVBFIChiYXNlICsgMCkpCi0jZGVmaW5lIEVUSEVSX01BQ19DVExfSEFMVFJFUV9PRlNUCQkJCSgwKQotI2RlZmluZSBFVEhFUl9NQUNfQ1RMX0hBTFRSRVFfTVNLCQkJCSgweDEpCi0jZGVmaW5lIEVUSEVSX01BQ19DVExfSEFMVElNTV9PRlNUCQkJCSgxKQotI2RlZmluZSBFVEhFUl9NQUNfQ1RMX0hBTFRJTU1fTVNLCQkJCSgweDIpCi0jZGVmaW5lIEVUSEVSX01BQ19DVExfUkVTRVRfT0ZTVAkJCQkoMikKLSNkZWZpbmUgRVRIRVJfTUFDX0NUTF9SRVNFVF9NU0sJCQkJCSgweDQpCi0jZGVmaW5lIEVUSEVSX01BQ19DVExfRlVMTERVUF9PRlNUCQkJCSgzKQotI2RlZmluZSBFVEhFUl9NQUNfQ1RMX0ZVTExEVVBfTVNLCQkJCSgweDgpCi0jZGVmaW5lIEVUSEVSX01BQ19DVExfTUFDTE9PUF9PRlNUCQkJCSg0KQotI2RlZmluZSBFVEhFUl9NQUNfQ1RMX01BQ0xPT1BfTVNLCQkJCSgweDEwKQotI2RlZmluZSBFVEhFUl9NQUNfQ1RMX0NPTk5fT0ZTVAkJCQkJKDUpCi0jZGVmaW5lIEVUSEVSX01BQ19DVExfQ09OTl9NU0sJCQkJCSgweDYwKQotI2RlZmluZSBFVEhFUl9NQUNfQ1RMX0xPT1AxMF9PRlNUCQkJCSg3KQotI2RlZmluZSBFVEhFUl9NQUNfQ1RMX0xPT1AxMF9NU0sJCQkJKDB4ODApCi0jZGVmaW5lIEVUSEVSX01BQ19DVExfTE5LQ0hHX09GU1QJCQkJKDgpCi0jZGVmaW5lIEVUSEVSX01BQ19DVExfTE5LQ0hHX01TSwkJCQkoMHgxMDApCi0jZGVmaW5lIEVUSEVSX01BQ19DVExfTUlTU1JPTExfT0ZTVAkJCQkoMTApCi0jZGVmaW5lIEVUSEVSX01BQ19DVExfTUlTU1JPTExfTVNLCQkJCSgweDQwMCkKLSNkZWZpbmUgRVRIRVJfTUFDX0NUTF9FTk1JU1NST0xMX09GU1QJCQkoMTMpCi0jZGVmaW5lIEVUSEVSX01BQ19DVExfRU5NSVNTUk9MTF9NU0sJCQkoMHgyMDAwKQotI2RlZmluZSBFVEhFUl9NQUNfQ1RMX0xJTksxMF9PRlNUCQkJCSgxNSkKLSNkZWZpbmUgRVRIRVJfTUFDX0NUTF9MSU5LMTBfTVNLCQkJCSgweDgwMDApCi0KLSNkZWZpbmUgRVRIRVJfQVJDX0NUTChiYXNlKQkJCQkJCQkoRVRIRVIwMF9UWVBFIChiYXNlICsgMHg0KSkKLSNkZWZpbmUJRVRIRVJfQVJDX0NUTF9TVEFUSU9OQUNDX09GU1QJCQkoMCkKLSNkZWZpbmUJRVRIRVJfQVJDX0NUTF9TVEFUSU9OQUNDX01TSwkJCSgweDEpCi0jZGVmaW5lCUVUSEVSX0FSQ19DVExfR1JPVVBBQ0NfT0ZTVAkJCQkoMSkKLSNkZWZpbmUJRVRIRVJfQVJDX0NUTF9HUk9VUEFDQ19NU0sJCQkJKDB4MikKLSNkZWZpbmUJRVRIRVJfQVJDX0NUTF9CUk9BREFDQ19PRlNUCQkJCSgyKQotI2RlZmluZQlFVEhFUl9BUkNfQ1RMX0JST0FEQUNDX01TSwkJCQkoMHg0KQotI2RlZmluZQlFVEhFUl9BUkNfQ1RMX05FR0FSQ19PRlNUCQkJCSgzKQotI2RlZmluZQlFVEhFUl9BUkNfQ1RMX05FR0FSQ19NU0sJCQkJKDB4OCkKLSNkZWZpbmUJRVRIRVJfQVJDX0NUTF9DT01QRU5fT0ZTVAkJCQkoNCkKLSNkZWZpbmUJRVRIRVJfQVJDX0NUTF9DT01QRU5fTVNLCQkJCSgweDEwKQotCi0jZGVmaW5lIEVUSEVSX1RYX0NUTChiYXNlKQkJCQkJCQkoRVRIRVIwMF9UWVBFIChiYXNlICsgMHg4KSkKLSNkZWZpbmUgRVRIRVJfVFhfQ1RMX1RYRU5fT0ZTVAkJCQkJKDApCi0jZGVmaW5lIEVUSEVSX1RYX0NUTF9UWEVOX01TSwkJCQkJKDB4MSkKLSNkZWZpbmUgRVRIRVJfVFhfQ1RMX1RYSEFMVF9PRlNUCQkJCSgxKQotI2RlZmluZSBFVEhFUl9UWF9DVExfVFhIQUxUX01TSwkJCQkJKDB4MikKLSNkZWZpbmUgRVRIRVJfVFhfQ1RMX05PUEFEX09GU1QJCQkJCSgyKQotI2RlZmluZSBFVEhFUl9UWF9DVExfTk9QQURfTVNLCQkJCQkoMHg0KQotI2RlZmluZSBFVEhFUl9UWF9DVExfTk9DUkNfT0ZTVAkJCQkJKDMpCi0jZGVmaW5lIEVUSEVSX1RYX0NUTF9OT0NSQ19NU0sJCQkJCSgweDgpCi0jZGVmaW5lIEVUSEVSX1RYX0NUTF9GQkFDS19PRlNUCQkJCQkoNCkKLSNkZWZpbmUgRVRIRVJfVFhfQ1RMX0ZCQUNLX01TSwkJCQkJKDB4MTApCi0jZGVmaW5lIEVUSEVSX1RYX0NUTF9OT0VYREVGX09GU1QJCQkJKDUpCi0jZGVmaW5lIEVUSEVSX1RYX0NUTF9OT0VYREVGX01TSwkJCQkoMHgyMCkKLSNkZWZpbmUgRVRIRVJfVFhfQ1RMX1NEUEFVU0VfT0ZTVAkJCQkoNikKLSNkZWZpbmUgRVRIRVJfVFhfQ1RMX1NEUEFVU0VfTVNLCQkJCSgweDQwKQotI2RlZmluZSBFVEhFUl9UWF9DVExfTUlJMTBfT0ZTVAkJCQkJKDcpCi0jZGVmaW5lIEVUSEVSX1RYX0NUTF9NSUkxMF9NU0sJCQkJCSgweDgwKQotI2RlZmluZSBFVEhFUl9UWF9DVExfRU5VTkRFUl9PRlNUCQkJCSg4KQotI2RlZmluZSBFVEhFUl9UWF9DVExfRU5VTkRFUl9NU0sJCQkJKDB4MTAwKQotI2RlZmluZSBFVEhFUl9UWF9DVExfRU5FWERFRkVSX09GU1QJCQkJKDkpCi0jZGVmaW5lIEVUSEVSX1RYX0NUTF9FTkVYREVGRVJfTVNLCQkJCSgweDIwMCkKLSNkZWZpbmUgRVRIRVJfVFhfQ1RMX0VOTENBUlJfT0ZTVAkJCQkoMTApCi0jZGVmaW5lIEVUSEVSX1RYX0NUTF9FTkxDQVJSX01TSwkJCQkoMHg0MDApCi0jZGVmaW5lIEVUSEVSX1RYX0NUTF9FTkVYQ09MTF9PRlNUCQkJCSgxMSkKLSNkZWZpbmUgRVRIRVJfVFhfQ1RMX0VORVhDT0xMX01TSwkJCQkoMHg4MDApCi0jZGVmaW5lIEVUSEVSX1RYX0NUTF9FTkxBVEVDT0xMX09GU1QJCQkJKDEyKQotI2RlZmluZSBFVEhFUl9UWF9DVExfRU5MQVRFQ09MTF9NU0sJCQkJKDB4MTAwMCkKLSNkZWZpbmUgRVRIRVJfVFhfQ1RMX0VOVFhQQVJfT0ZTVAkJCQkoMTMpCi0jZGVmaW5lIEVUSEVSX1RYX0NUTF9FTlRYUEFSX01TSwkJCQkoMHgyMDAwKQotI2RlZmluZSBFVEhFUl9UWF9DVExfRU5DT01QX09GU1QJCQkJKDE0KQotI2RlZmluZSBFVEhFUl9UWF9DVExfRU5DT01QX01TSwkJCQkJKDB4NDAwMCkKLQotI2RlZmluZSBFVEhFUl9UWF9TVEFUKGJhc2UpCQkJCQkJCShFVEhFUjAwX1RZUEUgKGJhc2UgKyAweGMpKQotI2RlZmluZSBFVEhFUl9UWF9TVEFUX1RYQ09MTF9PRlNUCQkJCSgwKQotI2RlZmluZSBFVEhFUl9UWF9TVEFUX1RYQ09MTF9NU0sJCQkJKDB4RikKLSNkZWZpbmUgRVRIRVJfVFhfU1RBVF9FWENPTExfT0ZTVAkJCQkoNCkKLSNkZWZpbmUgRVRIRVJfVFhfU1RBVF9FWENPTExfTVNLCQkJCSgweDEwKQotI2RlZmluZSBFVEhFUl9UWF9TVEFUX1RYREVGRVJfT0ZTVAkJCQkoNSkKLSNkZWZpbmUgRVRIRVJfVFhfU1RBVF9UWERFRkVSX01TSwkJCQkoMHgyMCkKLSNkZWZpbmUgRVRIRVJfVFhfU1RBVF9QQVVTRURfT0ZTVAkJCQkoNikKLSNkZWZpbmUgRVRIRVJfVFhfU1RBVF9QQVVTRURfTVNLCQkJCSgweDQwKQotI2RlZmluZSBFVEhFUl9UWF9TVEFUX0lOVFRYX09GU1QJCQkJKDcpCi0jZGVmaW5lIEVUSEVSX1RYX1NUQVRfSU5UVFhfTVNLCQkJCQkoMHg4MCkKLSNkZWZpbmUgRVRIRVJfVFhfU1RBVF9VTkRFUl9PRlNUCQkJCSg4KQotI2RlZmluZSBFVEhFUl9UWF9TVEFUX1VOREVSX01TSwkJCQkJKDB4MTAwKQotI2RlZmluZSBFVEhFUl9UWF9TVEFUX0VYREVGRVJfT0ZTVAkJCQkoOSkKLSNkZWZpbmUgRVRIRVJfVFhfU1RBVF9FWERFRkVSX01TSwkJCQkoMHgyMDApCi0jZGVmaW5lIEVUSEVSX1RYX1NUQVRfTENBUlJfT0ZTVAkJCQkoMTApCi0jZGVmaW5lIEVUSEVSX1RYX1NUQVRfTENBUlJfTVNLCQkJCQkoMHg0MDApCi0jZGVmaW5lIEVUSEVSX1RYX1NUQVRfVFgxMFNUQVRfT0ZTVAkJCQkoMTEpCi0jZGVmaW5lIEVUSEVSX1RYX1NUQVRfVFgxMFNUQVRfTVNLCQkJCSgweDgwMCkKLSNkZWZpbmUgRVRIRVJfVFhfU1RBVF9MQVRFQ09MTF9PRlNUCQkJCSgxMikKLSNkZWZpbmUgRVRIRVJfVFhfU1RBVF9MQVRFQ09MTF9NU0sJCQkJKDB4MTAwMCkKLSNkZWZpbmUgRVRIRVJfVFhfU1RBVF9UWFBBUl9PRlNUCQkJCSgxMykKLSNkZWZpbmUgRVRIRVJfVFhfU1RBVF9UWFBBUl9NU0sJCQkJCSgweDIwMDApCi0jZGVmaW5lIEVUSEVSX1RYX1NUQVRfQ09NUF9PRlNUCQkJCQkoMTQpCi0jZGVmaW5lIEVUSEVSX1RYX1NUQVRfQ09NUF9NU0sJCQkJCSgweDQwMDApCi0jZGVmaW5lIEVUSEVSX1RYX1NUQVRfVFhIQUxURURfT0ZTVAkJCQkoMTUpCi0jZGVmaW5lIEVUSEVSX1RYX1NUQVRfVFhIQUxURURfTVNLCQkJCSgweDgwMDApCi0jZGVmaW5lIEVUSEVSX1RYX1NUQVRfU1FFUlJfT0ZTVAkJCQkoMTYpCi0jZGVmaW5lIEVUSEVSX1RYX1NUQVRfU1FFUlJfTVNLCQkJCQkoMHgxMDAwMCkKLSNkZWZpbmUgRVRIRVJfVFhfU1RBVF9UWE1DQVNUX09GU1QJCQkJKDE3KQotI2RlZmluZSBFVEhFUl9UWF9TVEFUX1RYTUNBU1RfTVNLCQkJCSgweDIwMDAwKQotI2RlZmluZSBFVEhFUl9UWF9TVEFUX1RYQkNBU1RfT0ZTVAkJCQkoMTgpCi0jZGVmaW5lIEVUSEVSX1RYX1NUQVRfVFhCQ0FTVF9NU0sJCQkJKDB4NDAwMDApCi0jZGVmaW5lIEVUSEVSX1RYX1NUQVRfVkxBTl9PRlNUCQkJCQkoMTkpCi0jZGVmaW5lIEVUSEVSX1RYX1NUQVRfVkxBTl9NU0sJCQkJCSgweDgwMDAwKQotI2RlZmluZSBFVEhFUl9UWF9TVEFUX01BQ0NfT0ZTVAkJCQkJKDIwKQotI2RlZmluZSBFVEhFUl9UWF9TVEFUX01BQ0NfTVNLCQkJCQkoMHgxMDAwMDApCi0jZGVmaW5lIEVUSEVSX1RYX1NUQVRfVFhQQVVTRV9PRlNUCQkJCSgyMSkKLSNkZWZpbmUgRVRIRVJfVFhfU1RBVF9UWFBBVVNFX01TSwkJCQkoMHgyMDAwMDApCi0KLSNkZWZpbmUgRVRIRVJfUlhfQ1RMKGJhc2UpCQkJCQkJCShFVEhFUjAwX1RZUEUgKGJhc2UgKyAweDEwKSkKLSNkZWZpbmUgRVRIRVJfUlhfQ1RMX1JYRU5fT0ZTVAkJCQkJKDApCi0jZGVmaW5lIEVUSEVSX1JYX0NUTF9SWEVOX01TSwkJCQkJKDB4MSkKLSNkZWZpbmUgRVRIRVJfUlhfQ1RMX1JYSEFMVF9PRlNUCQkJCSgxKQotI2RlZmluZSBFVEhFUl9SWF9DVExfUlhIQUxUX01TSwkJCQkJKDB4MikKLSNkZWZpbmUgRVRIRVJfUlhfQ1RMX0xPTkdFTl9PRlNUCQkJCSgyKQotI2RlZmluZSBFVEhFUl9SWF9DVExfTE9OR0VOX01TSwkJCQkJKDB4NCkKLSNkZWZpbmUgRVRIRVJfUlhfQ1RMX1NIT1JURU5fT0ZTVAkJCQkoMykKLSNkZWZpbmUgRVRIRVJfUlhfQ1RMX1NIT1JURU5fTVNLCQkJCSgweDgpCi0jZGVmaW5lIEVUSEVSX1JYX0NUTF9TVFJJUENSQ19PRlNUCQkJCSg0KQotI2RlZmluZSBFVEhFUl9SWF9DVExfU1RSSVBDUkNfTVNLCQkJCSgweDEwKQotI2RlZmluZSBFVEhFUl9SWF9DVExfUEFTU0NUTF9PRlNUCQkJCSg1KQotI2RlZmluZSBFVEhFUl9SWF9DVExfUEFTU0NUTF9NU0sJCQkJKDB4MjApCi0jZGVmaW5lIEVUSEVSX1JYX0NUTF9JR05PUkVDUkNfT0ZTVAkJCQkoNikKLSNkZWZpbmUgRVRIRVJfUlhfQ1RMX0lHTk9SRUNSQ19NU0sJCQkJKDB4NDApCi0jZGVmaW5lIEVUSEVSX1JYX0NUTF9FTkFMSUdOX09GU1QJCQkJKDgpCi0jZGVmaW5lIEVUSEVSX1JYX0NUTF9FTkFMSUdOX01TSwkJCQkoMHgxMDApCi0jZGVmaW5lIEVUSEVSX1JYX0NUTF9FTkNSQ0VSUl9PRlNUCQkJCSg5KQotI2RlZmluZSBFVEhFUl9SWF9DVExfRU5DUkNFUlJfTVNLCQkJCSgweDIwMCkKLSNkZWZpbmUgRVRIRVJfUlhfQ1RMX0VOT1ZFUl9PRlNUCQkJCSgxMCkKLSNkZWZpbmUgRVRIRVJfUlhfQ1RMX0VOT1ZFUl9NU0sJCQkJCSgweDQwMCkKLSNkZWZpbmUgRVRIRVJfUlhfQ1RMX0VOTE9OR0VSUl9PRlNUCQkJCSgxMSkKLSNkZWZpbmUgRVRIRVJfUlhfQ1RMX0VOTE9OR0VSUl9NU0sJCQkJKDB4ODAwKQotI2RlZmluZSBFVEhFUl9SWF9DVExfRU5SWFBBUl9PRlNUCQkJCSgxMykKLSNkZWZpbmUgRVRIRVJfUlhfQ1RMX0VOUlhQQVJfTVNLCQkJCSgweDIwMDApCi0jZGVmaW5lIEVUSEVSX1JYX0NUTF9FTkdPT0RfT0ZTVAkJCQkoMTQpCi0jZGVmaW5lIEVUSEVSX1JYX0NUTF9FTkdPT0RfTVNLCQkJCQkoMHg0MDAwKQotCi0jZGVmaW5lIEVUSEVSX1JYX1NUQVQoYmFzZSkJCQkJCQkJKEVUSEVSMDBfVFlQRSAoYmFzZSArIDB4MTQpKQotI2RlZmluZSBFVEhFUl9SWF9TVEFUX0xFTkVSUl9PRlNUCQkJCSg0KQotI2RlZmluZSBFVEhFUl9SWF9TVEFUX0xFTkVSUl9NU0sJCQkJKDB4MTApCi0jZGVmaW5lIEVUSEVSX1JYX1NUQVRfQ1RMUkVDRF9PRlNUCQkJCSg1KQotI2RlZmluZSBFVEhFUl9SWF9TVEFUX0NUTFJFQ0RfTVNLCQkJCSgweDIwKQotI2RlZmluZSBFVEhFUl9SWF9TVEFUX0lOVFJYX09GU1QJCQkJKDYpCi0jZGVmaW5lIEVUSEVSX1JYX1NUQVRfSU5UUlhfTVNLCQkJCQkoMHg0MCkKLSNkZWZpbmUgRVRIRVJfUlhfU1RBVF9SWDEwU1RBVF9PRlNUCQkJCSg3KQotI2RlZmluZSBFVEhFUl9SWF9TVEFUX1JYMTBTVEFUX01TSwkJCQkoMHg4MCkKLSNkZWZpbmUgRVRIRVJfUlhfU1RBVF9BTElHTkVSUl9PRlNUCQkJCSg4KQotI2RlZmluZSBFVEhFUl9SWF9TVEFUX0FMSUdORVJSX01TSwkJCQkoMHgxMDApCi0jZGVmaW5lIEVUSEVSX1JYX1NUQVRfQ1JDRVJSX09GU1QJCQkJKDkpCi0jZGVmaW5lIEVUSEVSX1JYX1NUQVRfQ1JDRVJSX01TSwkJCQkoMHgyMDApCi0jZGVmaW5lIEVUSEVSX1JYX1NUQVRfT1ZFUkZMT1dfT0ZTVAkJCQkoMTApCi0jZGVmaW5lIEVUSEVSX1JYX1NUQVRfT1ZFUkZMT1dfTVNLCQkJCSgweDQwMCkKLSNkZWZpbmUgRVRIRVJfUlhfU1RBVF9MT05HRVJSX09GU1QJCQkJKDExKQotI2RlZmluZSBFVEhFUl9SWF9TVEFUX0xPTkdFUlJfTVNLCQkJCSgweDgwMCkKLSNkZWZpbmUgRVRIRVJfUlhfU1RBVF9SWFBBUl9PRlNUCQkJCSgxMykKLSNkZWZpbmUgRVRIRVJfUlhfU1RBVF9SWFBBUl9NU0sJCQkJCSgweDIwMDApCi0jZGVmaW5lIEVUSEVSX1JYX1NUQVRfR09PRF9PRlNUCQkJCQkoMTQpCi0jZGVmaW5lIEVUSEVSX1JYX1NUQVRfR09PRF9NU0sJCQkJCSgweDQwMDApCi0jZGVmaW5lIEVUSEVSX1JYX1NUQVRfUlhIQUxURURfT0ZTVAkJCQkoMTUpCi0jZGVmaW5lIEVUSEVSX1JYX1NUQVRfUlhIQUxURURfTVNLCQkJCSgweDgwMDApCi0jZGVmaW5lIEVUSEVSX1JYX1NUQVRfUlhNQ0FTVF9PRlNUCQkJCSgxNykKLSNkZWZpbmUgRVRIRVJfUlhfU1RBVF9SWE1DQVNUX01TSwkJCQkoMHgxMDAwMCkKLSNkZWZpbmUgRVRIRVJfUlhfU1RBVF9SWEJDQVNUX09GU1QJCQkJKDE4KQotI2RlZmluZSBFVEhFUl9SWF9TVEFUX1JYQkNBU1RfTVNLCQkJCSgweDIwMDAwKQotI2RlZmluZSBFVEhFUl9SWF9TVEFUX1JYVkxBTl9PRlNUCQkJCSgxOSkKLSNkZWZpbmUgRVRIRVJfUlhfU1RBVF9SWFZMQU5fTVNLCQkJCSgweDQwMDAwKQotI2RlZmluZSBFVEhFUl9SWF9TVEFUX1JYUEFVU0VfT0ZTVAkJCQkoMjApCi0jZGVmaW5lIEVUSEVSX1JYX1NUQVRfUlhQQVVTRV9NU0sJCQkJKDB4ODAwMDApCi0jZGVmaW5lIEVUSEVSX1JYX1NUQVRfQVJDU1RBVFVTX09GU1QJCQkJKDIxKQotI2RlZmluZSBFVEhFUl9SWF9TVEFUX0FSQ1NUQVRVU19NU0sJCQkJKDB4RjAwMDAwKQotI2RlZmluZSBFVEhFUl9SWF9TVEFUX0FSQ0VOVF9PRlNUCQkJCSgyNSkKLSNkZWZpbmUgRVRIRVJfUlhfU1RBVF9BUkNFTlRfTVNLCQkJCSgweDFGMDAwMDAwKQotCi0jZGVmaW5lIEVUSEVSX01EX0RBVEEoYmFzZSkJCQkJCQkJKEVUSEVSMDBfVFlQRSAoYmFzZSArIDB4MTgpKQotCi0jZGVmaW5lIEVUSEVSX01EX0NBKGJhc2UpCQkJCQkJCQkoRVRIRVIwMF9UWVBFIChiYXNlICsgMHgxYykpCi0jZGVmaW5lIEVUSEVSX01EX0NBX0FERFJfT0ZTVAkJCQkJKDApCi0jZGVmaW5lIEVUSEVSX01EX0NBX0FERFJfTVNLCQkJCQkoMHgxRikKLSNkZWZpbmUgRVRIRVJfTURfQ0FfUEhZX09GU1QJCQkJCSg1KQotI2RlZmluZSBFVEhFUl9NRF9DQV9QSFlfTVNLCQkJCQkoMHgzRTApCi0jZGVmaW5lIEVUSEVSX01EX0NBX1dSX09GU1QJCQkJCSgxMCkKLSNkZWZpbmUgRVRIRVJfTURfQ0FfV1JfTVNLCQkJCQkoMHg0MDApCi0jZGVmaW5lIEVUSEVSX01EX0NBX0JVU1lfT0ZTVAkJCQkJKDExKQotI2RlZmluZSBFVEhFUl9NRF9DQV9CVVNZX01TSwkJCQkJKDB4ODAwKQotI2RlZmluZSBFVEhFUl9NRF9DQV9QUkVTVVBQX09GU1QJCQkJKDEyKQotI2RlZmluZSBFVEhFUl9NRF9DQV9QUkVTVVBQX01TSwkJCQkJKDB4MTAwMCkKLQotI2RlZmluZSBFVEhFUl9BUkNfQURSKGJhc2UpCSAgICAgIChFVEhFUjAwX1RZUEUgKGJhc2UgKyAweDE2MCkpCi0jZGVmaW5lIEVUSEVSX0FSQ19BRFJfQVJDX0xPQ19PRlNUCQkJCSgyKQotI2RlZmluZSBFVEhFUl9BUkNfQURSX0FSQ19MT0NfTVNLCQkJCSgweEZGQykKLQotI2RlZmluZSBFVEhFUl9BUkNfREFUQShiYXNlKSAgKEVUSEVSMDBfVFlQRSAoYmFzZSArIDB4MzY0KSkKLQotI2RlZmluZSBFVEhFUl9BUkNfRU5BKGJhc2UpICAgKEVUSEVSMDBfVFlQRSAoYmFzZSArIDB4MjgpKQotI2RlZmluZSBFVEhFUl9BUkNfRU5BX01TSwkJCQkJKDB4MUZGRkZGKQotCi0jZGVmaW5lIEVUSEVSX1BST01fQ1RMKGJhc2UpCQkJCQkJCShFVEhFUjAwX1RZUEUgKGJhc2UgKyAweDJjKSkKLSNkZWZpbmUgRVRIRVJfUFJPTV9DVExfUFJPTV9BRERSX09GU1QJCQkoMCkKLSNkZWZpbmUgRVRIRVJfUFJPTV9DVExfUFJPTV9BRERSX01TSwkJCSgweDNGKQotI2RlZmluZSBFVEhFUl9QUk9NX0NUTF9PUENPREVfT0ZTVAkJCQkoMTMpCi0jZGVmaW5lIEVUSEVSX1BST01fQ1RMX09QQ09ERV9NU0sJCQkJKDB4NjAwMCkKLSNkZWZpbmUgRVRIRVJfUFJPTV9DVExfT1BDT0RFX1JFQURfTVNLCQkJKDB4NDAwMCkKLSNkZWZpbmUgRVRIRVJfUFJPTV9DVExfT1BDT0RFX1dSSVRFX01TSwkJCSgweDIwMDApCi0jZGVmaW5lIEVUSEVSX1BST01fQ1RMX09QQ09ERV9FUkFTRV9NU0sJCQkoMHg2MDAwKQotI2RlZmluZSBFVEhFUl9QUk9NX0NUTF9FTkFCTEVfTVNLCQkJCSgweDAwMzApCi0jZGVmaW5lIEVUSEVSX1BST01fQ1RMX0RJU0FCTEVfTVNLCQkJCSgweDAwMDApCi0jZGVmaW5lIEVUSEVSX1BST01fQ1RMX0JVU1lfT0ZTVAkJCQkoMTUpCi0jZGVmaW5lIEVUSEVSX1BST01fQ1RMX0JVU1lfTVNLCQkJCQkoMHg4MDAwKQotCi0jZGVmaW5lIEVUSEVSX1BST01fREFUQShiYXNlKQkJCQkJCQkoRVRIRVIwMF9UWVBFIChiYXNlICsgMHgzMCkpCi0KLSNkZWZpbmUgRVRIRVJfTUlTU19DTlQoYmFzZSkJCQkJCQkJKEVUSEVSMDBfVFlQRSAoYmFzZSArIDB4M2MpKQotI2RlZmluZSBFVEhFUl9NSVNTX0NOVF9DT1VOVF9PRlNUCQkJCSgwKQotI2RlZmluZSBFVEhFUl9NSVNTX0NOVF9DT1VOVF9NU0sJCQkJKDB4RkZGRikKLQotI2RlZmluZSBFVEhFUl9DTlREQVRBKGJhc2UpCQkJCQkJCShFVEhFUjAwX1RZUEUgKGJhc2UgKyAweDgwKSkKLQotI2RlZmluZSBFVEhFUl9DTlRBQ0MoYmFzZSkJCQkJCQkJKEVUSEVSMDBfVFlQRSAoYmFzZSArIDB4ODQpKQotI2RlZmluZSBFVEhFUl9DTlRBQ0NfQUREUl9PRlNUCQkJCQkoMCkKLSNkZWZpbmUgRVRIRVJfQ05UQUNDX0FERFJfTVNLCQkJCQkoMHhGRikKLSNkZWZpbmUgRVRIRVJfQ05UQUNDX1dSUkROX09GU1QJCQkJCSg4KQotI2RlZmluZSBFVEhFUl9DTlRBQ0NfV1JSRE5fTVNLCQkJCQkoMHgxMDApCi0jZGVmaW5lIEVUSEVSX0NOVEFDQ19DTEVBUl9PRlNUCQkJCQkoOSkKLSNkZWZpbmUgRVRIRVJfQ05UQUNDX0NMRUFSX01TSwkJCQkJKDB4MjAwKQotCi0jZGVmaW5lIEVUSEVSX1RYUk1JTlRFTihiYXNlKQkJCQkJCQkoRVRIRVIwMF9UWVBFIChiYXNlICsgMHg4OCkpCi0jZGVmaW5lIEVUSEVSX1RYUk1JTlRFTl9NU0sJCQkJCQkoMHgzRkZGRkZGRikKLQotI2RlZmluZSBFVEhFUl9SWFJNSU5URU4oYmFzZSkJCQkJCQkJKEVUSEVSMDBfVFlQRSAoYmFzZSArIDB4OEMpKQotI2RlZmluZSBFVEhFUl9SWFJNSU5URU5fTVNLCQkJCQkJKDB4RkZGRkZGKQotCi0vKgotKglSTU9OIFJlZ2lzdGVycwotKi8KLSNkZWZpbmUJCVJNT05fQ09MTElTSU9OMAkJCQkJCTB4MAotI2RlZmluZQkJUk1PTl9DT0xMSVNJT04xCQkJCQkJMHgxCi0jZGVmaW5lCQlSTU9OX0NPTExJU0lPTjIJCQkJCQkweDIKLSNkZWZpbmUJCVJNT05fQ09MTElTSU9OMwkJCQkJCTB4MwotI2RlZmluZQkJUk1PTl9DT0xMSVNJT040CQkJCQkJMHg0Ci0jZGVmaW5lCQlSTU9OX0NPTExJU0lPTjUJCQkJCQkweDUKLSNkZWZpbmUJCVJNT05fQ09MTElTSU9ONgkJCQkJCTB4NgotI2RlZmluZQkJUk1PTl9DT0xMSVNJT043CQkJCQkJMHg3Ci0jZGVmaW5lCQlSTU9OX0NPTExJU0lPTjgJCQkJCQkweDgKLSNkZWZpbmUJCVJNT05fQ09MTElTSU9OOQkJCQkJCTB4OQotI2RlZmluZQkJUk1PTl9DT0xMSVNJT04xMAkJCQkJMHhhCi0jZGVmaW5lCQlSTU9OX0NPTExJU0lPTjExCQkJCQkweGIKLSNkZWZpbmUJCVJNT05fQ09MTElTSU9OMTIJCQkJCTB4YwotI2RlZmluZQkJUk1PTl9DT0xMSVNJT04xMwkJCQkJMHhkCi0jZGVmaW5lCQlSTU9OX0NPTExJU0lPTjE0CQkJCQkweGUKLSNkZWZpbmUJCVJNT05fQ09MTElTSU9OMTUJCQkJCTB4ZgotI2RlZmluZQkJUk1PTl9DT0xMSVNJT04xNgkJCQkJMHgxMAotI2RlZmluZQkJUk1PTl9GUkFNRVNfV0lUSF9ERUZFUlJFRF9YTUlTU0lPTlMJMHgxMQotI2RlZmluZQkJUk1PTl9MQVRFX0NPTExJU0lPTlMJCQkJMHgxMgotI2RlZmluZQkJUk1PTl9GUkFNRVNfTE9TVF9EVUVfVE9fTUFDX1hNSVQJMHgxMwotI2RlZmluZQkJUk1PTl9DQVJSSUVSX1NFTlNFX0VSUk9SUwkJCTB4MTQKLSNkZWZpbmUJCVJNT05fRlJBTUVTX1dJVEhfRVhDRVNTSVZFX0RFRkVSQUwJMHgxNQotI2RlZmluZQkJUk1PTl9VTklDQVNUX0ZSQU1FU19UUkFOU01JVFRFRF9PSwkweDE2Ci0jZGVmaW5lCQlSTU9OX01VTFRJQ0FTVF9GUkFNRVNfWE1JVFRFRF9PSwkweDE3Ci0jZGVmaW5lCQlSTU9OX0JST0FEQ0FTVF9GUkFNRVNfWE1JVFRFRF9PSwkweDE4Ci0jZGVmaW5lCQlSTU9OX1NRRV9URVNUX0VSUk9SUwkJCQkweDE5Ci0jZGVmaW5lCQlSTU9OX1BBVVNFX01BQ0NUUkxfRlJBTUVTX1hNSVRURUQJMHgxQQotI2RlZmluZQkJUk1PTl9NQUNDVFJMX0ZSQU1FU19YTUlUVEVECQkJMHgxQgotI2RlZmluZQkJUk1PTl9WTEFOX0ZSQU1FU19YTUlUVEVECQkJMHgxQwotI2RlZmluZQkJUk1PTl9PQ1RFVFNfWE1JVFRFRF9PSwkJCQkweDFECi0jZGVmaW5lCQlSTU9OX09DVEVUU19YTUlUVEVEX09LX0hJCQkJMHgxRQotCi0jZGVmaW5lCQlSTU9OX1JYX1BBQ0tFVF9TSVpFUzAJCQkJMHg0MAotI2RlZmluZQkJUk1PTl9SWF9QQUNLRVRfU0laRVMxCQkJCTB4NDEKLSNkZWZpbmUJCVJNT05fUlhfUEFDS0VUX1NJWkVTMgkJCQkweDQyCi0jZGVmaW5lCQlSTU9OX1JYX1BBQ0tFVF9TSVpFUzMJCQkJMHg0MwotI2RlZmluZQkJUk1PTl9SWF9QQUNLRVRfU0laRVM0CQkJCTB4NDQKLSNkZWZpbmUJCVJNT05fUlhfUEFDS0VUX1NJWkVTNQkJCQkweDQ1Ci0jZGVmaW5lCQlSTU9OX1JYX1BBQ0tFVF9TSVpFUzYJCQkJMHg0NgotI2RlZmluZQkJUk1PTl9SWF9QQUNLRVRfU0laRVM3CQkJCTB4NDcKLSNkZWZpbmUJCVJNT05fRlJBTUVfQ0hFQ0tfU0VRVUVOQ0VfRVJST1JTCTB4NDgKLSNkZWZpbmUJCVJNT05fQUxJR05NRU5UX0VSUk9SUwkJCQkweDQ5Ci0jZGVmaW5lCQlSTU9OX0ZSQUdNRU5UUwkJCQkJCTB4NEEKLSNkZWZpbmUJCVJNT05fSkFCQkVSUwkJCQkJCTB4NEIKLSNkZWZpbmUJCVJNT05fRlJBTUVTX0xPU1RfVE9fSU5UTUFDUkNWRVJSCTB4NEMKLSNkZWZpbmUJCVJNT05fVU5JQ0FTVF9GUkFNRVNfUkNWRF9PSwkJCTB4NEQKLSNkZWZpbmUJCVJNT05fTVVMVElDQVNUX0ZSQU1FU19SQ1ZEX09LCQkweDRFCi0jZGVmaW5lCQlSTU9OX0JST0FEQ0FTVF9GUkFNRVNfUkNWRF9PSwkJMHg0RgotI2RlZmluZQkJUk1PTl9JTl9SQU5HRV9MRU5HVEhfRVJST1JTCQkJMHg1MAotI2RlZmluZQkJUk1PTl9PVVRfT0ZfUkFOR0VfTEVOR1RIX0VSUk9SUwkJMHg1MQotI2RlZmluZQkJUk1PTl9WTEFOX0ZSQU1FU19SQ1ZECQkJCTB4NTIKLSNkZWZpbmUJCVJNT05fUEFVU0VfTUFDX0NUUkxfRlJBTUVTX1JDVkQJCTB4NTMKLSNkZWZpbmUJCVJNT05fTUFDX0NUUkxfRlJBTUVTX1JDVkQJCQkweDU0Ci0jZGVmaW5lCQlSTU9OX09DVEVUU19SQ1ZEX09LCQkJCQkweDU1Ci0jZGVmaW5lCQlSTU9OX09DVEVUU19SQ1ZEX09LX0hJCQkJCTB4NTYKLSNkZWZpbmUJCVJNT05fT0NURVRTX1JDVkRfT1RIRVIJCQkJMHg1NwotI2RlZmluZQkJUk1PTl9PQ1RFVFNfUkNWRF9PVEhFUl9ISQkJCTB4NTgKLQotI2VuZGlmIC8qIF9fRVRIRVIwMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcHhhMTBkYi9leGNhbGlidXIuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL2V4Y2FsaWJ1ci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzkxZGQ2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL2V4Y2FsaWJ1ci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyogbWVnYWZ1bmN0aW9uIHdpemFyZDogJUFSTS1CYXNlZCBFeGNhbGlidXIlCi0gICBHRU5FUkFUSU9OOiBTVEFOREFSRAotICAgVkVSU0lPTjogV00xLjAKLSAgIE1PRFVMRTogQVJNLUJhc2VkIEV4Y2FsaWJ1cgotICAgUFJPSkVDVDogZXhjYWxpYnVyCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEZpbGUgTmFtZTogdjpcZW1iZWRkZWRcbGludXhcYm9vdGxkclxleGNhbGlidXIuaAotICAgTWVnYWZ1bmN0aW9uIE5hbWUocyk6IEFSTS1CYXNlZCBFeGNhbGlidXIKLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIFRISVMgSVMgQSBXSVpBUkQtR0VORVJBVEVEIEZJTEUuIERPIE5PVCBFRElUIFRISVMgRklMRSEKLSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZglFWENBTElCVVJfSF9JTkNMVURFRAotI2RlZmluZQlFWENBTElCVVJfSF9JTkNMVURFRAotCi0jZGVmaW5lIEVYQ19ERUZJTkVfUFJPQ0VTU09SX0xJVFRMRV9FTkRJQU4KLSNkZWZpbmUgRVhDX0RFRklORV9CT09UX0ZST01fRkxBU0gKLQotI2RlZmluZQlFWENfSU5QVVRfQ0xLX0ZSRVFVRU5DWSAoNTAwMDAwMDApCi0jZGVmaW5lCUVYQ19BSEIxX0NMS19GUkVRVUVOQ1kgKDE1MDAwMDAwMCkKLSNkZWZpbmUJRVhDX0FIQjJfQ0xLX0ZSRVFVRU5DWSAoNzUwMDAwMDApCi0jZGVmaW5lCUVYQ19TRFJBTV9DTEtfRlJFUVVFTkNZICg3NTAwMDAwMCkKLQotLyogUmVnaXN0ZXJzIEJsb2NrICovCi0jZGVmaW5lCUVYQ19SRUdJU1RFUlNfQkFTRSAoMHg3ZmZmYzAwMCkKLSNkZWZpbmUJRVhDX01PREVfQ1RSTDAwX0JBU0UgKEVYQ19SRUdJU1RFUlNfQkFTRSArIDB4MDAwKQotI2RlZmluZQlFWENfSU9fQ1RSTDAwX0JBU0UgKEVYQ19SRUdJU1RFUlNfQkFTRSArIDB4MDQwKQotI2RlZmluZQlFWENfTU1BUDAwX0JBU0UgKEVYQ19SRUdJU1RFUlNfQkFTRSArIDB4MDgwKQotI2RlZmluZQlFWENfUExEX0NPTkZJRzAwX0JBU0UgKEVYQ19SRUdJU1RFUlNfQkFTRSArIDB4MTQwKQotI2RlZmluZQlFWENfVElNRVIwMF9CQVNFIChFWENfUkVHSVNURVJTX0JBU0UgKyAweDIwMCkKLSNkZWZpbmUJRVhDX0lOVF9DVFJMMDBfQkFTRSAoRVhDX1JFR0lTVEVSU19CQVNFICsgMHhjMDApCi0jZGVmaW5lCUVYQ19DTE9DS19DVFJMMDBfQkFTRSAoRVhDX1JFR0lTVEVSU19CQVNFICsgMHgzMDApCi0jZGVmaW5lCUVYQ19XQVRDSERPRzAwX0JBU0UgKEVYQ19SRUdJU1RFUlNfQkFTRSArIDB4YTAwKQotI2RlZmluZQlFWENfVUFSVDAwX0JBU0UgKEVYQ19SRUdJU1RFUlNfQkFTRSArIDB4MjgwKQotI2RlZmluZQlFWENfRUJJMDBfQkFTRSAoRVhDX1JFR0lTVEVSU19CQVNFICsgMHgzODApCi0jZGVmaW5lCUVYQ19TRFJBTTAwX0JBU0UgKEVYQ19SRUdJU1RFUlNfQkFTRSArIDB4NDAwKQotI2RlZmluZQlFWENfQUhCMTJfQlJJREdFX0NUUkwwMF9CQVNFIChFWENfUkVHSVNURVJTX0JBU0UgKyAweDgwMCkKLSNkZWZpbmUJRVhDX1BMRF9TVFJJUEVfQlJJREdFX0NUUkwwMF9CQVNFIChFWENfUkVHSVNURVJTX0JBU0UgKyAweDEwMCkKLSNkZWZpbmUJRVhDX1NUUklQRV9QTERfQlJJREdFX0NUUkwwMF9CQVNFIChFWENfUkVHSVNURVJTX0JBU0UgKyAweDEwMCkKLQotI2RlZmluZQlFWENfUkVHSVNURVJTX1NJWkUgKDB4MDAwMDQwMDApCi0KLS8qIEVCSSBCbG9jayhzKSAqLwotI2RlZmluZQlFWENfRUJJX0JMT0NLMF9CQVNFICgweDQwMDAwMDAwKQotI2RlZmluZQlFWENfRUJJX0JMT0NLMF9TSVpFICgweDAwNDAwMDAwKQotI2RlZmluZQlFWENfRUJJX0JMT0NLMF9XSURUSCAoOCkKLSNkZWZpbmUJRVhDX0VCSV9CTE9DSzBfTk9OX0NBQ0hFQUJMRQotI2RlZmluZQlFWENfRUJJX0JMT0NLMV9CQVNFICgweDQwNDAwMDAwKQotI2RlZmluZQlFWENfRUJJX0JMT0NLMV9TSVpFICgweDAwNDAwMDAwKQotI2RlZmluZQlFWENfRUJJX0JMT0NLMV9XSURUSCAoMTYpCi0jZGVmaW5lCUVYQ19FQklfQkxPQ0sxX05PTl9DQUNIRUFCTEUKLSNkZWZpbmUJRVhDX0VCSV9CTE9DSzJfQkFTRSAoMHg0MDgwMDAwMCkKLSNkZWZpbmUJRVhDX0VCSV9CTE9DSzJfU0laRSAoMHgwMDQwMDAwMCkKLSNkZWZpbmUJRVhDX0VCSV9CTE9DSzJfV0lEVEggKDE2KQotI2RlZmluZQlFWENfRUJJX0JMT0NLMl9OT05fQ0FDSEVBQkxFCi0jZGVmaW5lCUVYQ19FQklfQkxPQ0szX0JBU0UgKDB4NDBjMDAwMDApCi0jZGVmaW5lCUVYQ19FQklfQkxPQ0szX1NJWkUgKDB4MDA0MDAwMDApCi0jZGVmaW5lCUVYQ19FQklfQkxPQ0szX1dJRFRIICgxNikKLSNkZWZpbmUJRVhDX0VCSV9CTE9DSzNfTk9OX0NBQ0hFQUJMRQotCi0vKiBTRFJBTSBCbG9jayhzKSAqLwotI2RlZmluZQlFWENfU0RSQU1fQkxPQ0swX0JBU0UgKDB4MDAwMDAwMDApCi0jZGVmaW5lCUVYQ19TRFJBTV9CTE9DSzBfU0laRSAoMHgwNDAwMDAwMCkKLSNkZWZpbmUJRVhDX1NEUkFNX0JMT0NLMF9XSURUSCAoMzIpCi0jZGVmaW5lCUVYQ19TRFJBTV9CTE9DSzFfQkFTRSAoMHgwNDAwMDAwMCkKLSNkZWZpbmUJRVhDX1NEUkFNX0JMT0NLMV9TSVpFICgweDA0MDAwMDAwKQotI2RlZmluZQlFWENfU0RSQU1fQkxPQ0sxX1dJRFRIICgzMikKLQotLyogU2luZ2xlIFBvcnQgU1JBTSBCbG9jayhzKSAqLwotI2RlZmluZQlFWENfU1BTUkFNX0JMT0NLMF9CQVNFICgweDA4MDAwMDAwKQotI2RlZmluZQlFWENfU1BTUkFNX0JMT0NLMF9TSVpFICgweDAwMDIwMDAwKQotI2RlZmluZQlFWENfU1BTUkFNX0JMT0NLMV9CQVNFICgweDA4MDIwMDAwKQotI2RlZmluZQlFWENfU1BTUkFNX0JMT0NLMV9TSVpFICgweDAwMDIwMDAwKQotCi0vKiBQTEQgQmxvY2socykgKi8KLSNkZWZpbmUJRVhDX1BMRF9CTE9DSzBfQkFTRSAoMHg4MDAwMDAwMCkKLSNkZWZpbmUJRVhDX1BMRF9CTE9DSzBfU0laRSAoMHgwMDAwNDAwMCkKLSNkZWZpbmUJRVhDX1BMRF9CTE9DSzBfTk9OX0NBQ0hFQUJMRQotI2RlZmluZQlFWENfUExEX0JMT0NLMV9CQVNFICgweGYwMDAwMDApCi0jZGVmaW5lCUVYQ19QTERfQkxPQ0sxX1NJWkUgKDB4MDAwMDQwMDApCi0jZGVmaW5lCUVYQ19QTERfQkxPQ0sxX05PTl9DQUNIRUFCTEUKLSNkZWZpbmUJRVhDX1BMRF9CTE9DSzJfQkFTRSAoMHg4MDAwODAwMCkKLSNkZWZpbmUJRVhDX1BMRF9CTE9DSzJfU0laRSAoMHgwMDAwNDAwMCkKLSNkZWZpbmUJRVhDX1BMRF9CTE9DSzJfTk9OX0NBQ0hFQUJMRQotI2RlZmluZQlFWENfUExEX0JMT0NLM19CQVNFICgweDgwMDBjMDAwKQotI2RlZmluZQlFWENfUExEX0JMT0NLM19TSVpFICgweDAwMDA0MDAwKQotI2RlZmluZQlFWENfUExEX0JMT0NLM19OT05fQ0FDSEVBQkxFCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvaGFyZHdhcmUuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL2hhcmR3YXJlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OTJjMjkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvaGFyZHdhcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwL2hhcmR3YXJlLmgKLSAqCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBoYXJkd2FyZSBkZWZpbml0aW9ucyBvZiB0aGUgSW50ZWdyYXRvci4KLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk5IEFSTSBMaW1pdGVkLgotICogIENvcHlyaWdodCAoQykgMjAwMSBBbHRlcmEgQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLSNpZm5kZWYgX19BU01fQVJDSF9IQVJEV0FSRV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSAotCi0jaW5jbHVkZSA8YXNtL2FyY2gvcGxhdGZvcm0uaD4KLQotLyoKLSAqIFdoZXJlIGluIHZpcnR1YWwgbWVtb3J5IHRoZSBJTyBkZXZpY2VzICh0aW1lcnMsIHN5c3RlbSBjb250cm9sbGVycwotICogYW5kIHNvIG9uKQotICovCi0jZGVmaW5lIElPX0JBU0UJCQkweGYwMDAwMDAwICAgICAgICAgICAgICAgICAvLyBWQSBvZiBJTyAKLSNkZWZpbmUgSU9fU0laRQkJCTB4MTAwMDAwMDAgICAgICAgICAgICAgICAgIC8vIEhvdyBtdWNoPwotI2RlZmluZSBJT19TVEFSVAkJRVhDX1JFR0lTVEVSU19CQVNFICAgICAgICAgICAgICAvLyBQQSBvZiBJTwotLyogbWFjcm8gdG8gZ2V0IGF0IElPIHNwYWNlIHdoZW4gcnVubmluZyB2aXJ0dWFsbHkgKi8KLSNkZWZpbmUgSU9fQUREUkVTUyh4KSAoKHgpIHwgMHhmMDAwMDAwMCkgCi0KLSNkZWZpbmUgRkxBU0hfVkJBU0UgICAgICAgICAgICAgMHhGRTAwMDAwMAotI2RlZmluZSBGTEFTSF9TSVpFICAgICAgICAgICAgICAweDAxMDAwMDAwCi0jZGVmaW5lIEZMQVNIX1NUQVJUICAgICAgICAgICAgIEVYQ19FQklfQkxPQ0swX0JBU0UKLSNkZWZpbmUgRkxBU0hfVkFERFIoeCkgKCh4KXwweEZFMDAwMDAwKQotLyoKLSAqIFNpbWlsYXIgdG8gYWJvdmUsIGJ1dCBmb3IgUENJIGFkZHJlc3NlcyAobWVtb3J5LCBJTywgQ29uZmlnIGFuZCB0aGUKLSAqIFYzIGNoaXAgaXRzZWxmKS4gIFdBUk5JTkc6IHRoaXMgaGFzIHRvIG1pcnJvciBkZWZpbml0aW9ucyBpbiBwbGF0Zm9ybS5oCi0gKi8KLSNpZiAwCi0jZGVmaW5lIFBDSV9NRU1PUllfVkFERFIgICAgICAgIDB4ZTgwMDAwMDAKLSNkZWZpbmUgUENJX0NPTkZJR19WQUREUiAgICAgICAgMHhlYzAwMDAwMAotI2RlZmluZSBQQ0lfVjNfVkFERFIgICAgICAgICAgICAweGVkMDAwMDAwCi0jZGVmaW5lIFBDSV9JT19WQUREUiAgICAgICAgICAgIDB4ZWUwMDAwMDAKLQotI2RlZmluZSBQQ0lPX0JBU0UJCVBDSV9JT19WQUREUgotI2RlZmluZSBQQ0lNRU1fQkFTRQkJUENJX01FTU9SWV9WQUREUgotCi0KLSNkZWZpbmUgcGNpYmlvc19hc3NpZ25fYWxsX2J1c3NlcygpCTEKLQotI2RlZmluZSBQQ0lCSU9TX01JTl9JTwkJMHg2MDAwCi0jZGVmaW5lIFBDSUJJT1NfTUlOX01FTSAJMHgwMDEwMDAwMAotI2VuZGlmCi0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL2ludF9jdHJsMDAuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL2ludF9jdHJsMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNlYzg2NC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcHhhMTBkYi9pbnRfY3RybDAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoKLSAqICAKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHJlZ2lzdGVyIGRlZmluaXRpb25zIGZvciB0aGUgRXhjYWxpYnVyCi0gKiAgVGltZXIgVElNRVIwMC4KLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAxIEFsdGVyYSBDb3Jwb3JhdGlvbgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0jaWZuZGVmIF9fSU5UX0NUUkwwMF9ICi0jZGVmaW5lIF9fSU5UX0NUUkwwMF9ICi0KLSNkZWZpbmUgSU5UX01TKGJhc2VfYWRkcikgKElOVF9DVFJMMDBfVFlQRSAoYmFzZV9hZGRyICArIDB4MDAgKSkKLSNkZWZpbmUgSU5UX01TX0ZDX01TSyAoMHgxMDAwMCkKLSNkZWZpbmUgSU5UX01TX0ZDX09GU1QgKDE2KQotI2RlZmluZSBJTlRfTVNfTTFfTVNLICgweDgwMDApCi0jZGVmaW5lIElOVF9NU19NMV9PRlNUICgxNSkKLSNkZWZpbmUgSU5UX01TX00wX01TSyAoMHg0MDAwKQotI2RlZmluZSBJTlRfTVNfTTBfT0ZTVCAoMTQpCi0jZGVmaW5lIElOVF9NU19BRV9NU0sgKDB4MjAwMCkKLSNkZWZpbmUgSU5UX01TX0FFX09GU1QgKDEzKQotI2RlZmluZSBJTlRfTVNfUEVfTVNLICgweDEwMDApCi0jZGVmaW5lIElOVF9NU19QRV9PRlNUICgxMikKLSNkZWZpbmUgSU5UX01TX0VFX01TSyAoMHgwODAwKQotI2RlZmluZSBJTlRfTVNfRUVfT0ZTVCAoMTEpCi0jZGVmaW5lIElOVF9NU19QU19NU0sgKDB4MDQwMCkKLSNkZWZpbmUgSU5UX01TX1BTX09GU1QgKDEwKQotI2RlZmluZSBJTlRfTVNfVDFfTVNLICgweDAyMDApCi0jZGVmaW5lIElOVF9NU19UMV9PRlNUICg5KQotI2RlZmluZSBJTlRfTVNfVDBfTVNLICgweDAxMDApCi0jZGVmaW5lIElOVF9NU19UMF9PRlNUICg4KQotI2RlZmluZSBJTlRfTVNfVUFfTVNLICgweDAwODApCi0jZGVmaW5lIElOVF9NU19VQV9PRlNUICg3KQotI2RlZmluZSBJTlRfTVNfSVBfTVNLICgweDAwNDApCi0jZGVmaW5lIElOVF9NU19JUF9PRlNUICg2KQotI2RlZmluZSBJTlRfTVNfUDVfTVNLICgweDAwMjApCi0jZGVmaW5lIElOVF9NU19QNV9PRlNUICg1KQotI2RlZmluZSBJTlRfTVNfUDRfTVNLICgweDAwMTApCi0jZGVmaW5lIElOVF9NU19QNF9PRlNUICg0KQotI2RlZmluZSBJTlRfTVNfUDNfTVNLICgweDAwMDgpCi0jZGVmaW5lIElOVF9NU19QM19PRlNUICgzKQotI2RlZmluZSBJTlRfTVNfUDJfTVNLICgweDAwMDQpCi0jZGVmaW5lIElOVF9NU19QMl9PRlNUICgyKQotI2RlZmluZSBJTlRfTVNfUDFfTVNLICgweDAwMDIpCi0jZGVmaW5lIElOVF9NU19QMV9PRlNUICgxKQotI2RlZmluZSBJTlRfTVNfUDBfTVNLICgweDAwMDEpCi0jZGVmaW5lIElOVF9NU19QMF9PRlNUICgwKQotCi0jZGVmaW5lIElOVF9NQyhiYXNlX2FkZHIpIChJTlRfQ1RSTDAwX1RZUEUgKGJhc2VfYWRkciAgKyAweDA0ICkpCi0jZGVmaW5lIElOVF9NQ19GQ19NU0sgKDB4MTAwMDApCi0jZGVmaW5lIElOVF9NQ19GQ19PRlNUICgxNikKLSNkZWZpbmUgSU5UX01DX00xX01TSyAoMHg4MDAwKQotI2RlZmluZSBJTlRfTUNfTTFfT0ZTVCAoMTUpCi0jZGVmaW5lIElOVF9NQ19NMF9NU0sgKDB4NDAwMCkKLSNkZWZpbmUgSU5UX01DX00wX09GU1QgKDE0KQotI2RlZmluZSBJTlRfTUNfQUVfTVNLICgweDIwMDApCi0jZGVmaW5lIElOVF9NQ19BRV9PRlNUICgxMykKLSNkZWZpbmUgSU5UX01DX1BFX01TSyAoMHgxMDAwKQotI2RlZmluZSBJTlRfTUNfUEVfT0ZTVCAoMTIpCi0jZGVmaW5lIElOVF9NQ19FRV9NU0sgKDB4MDgwMCkKLSNkZWZpbmUgSU5UX01DX0VFX09GU1QgKDExKQotI2RlZmluZSBJTlRfTUNfUFNfTVNLICgweDA0MDApCi0jZGVmaW5lIElOVF9NQ19QU19PRlNUICgxMCkKLSNkZWZpbmUgSU5UX01DX1QxX01TSyAoMHgwMjAwKQotI2RlZmluZSBJTlRfTUNfVDFfT0ZTVCAoOSkKLSNkZWZpbmUgSU5UX01DX1QwX01TSyAoMHgwMTAwKQotI2RlZmluZSBJTlRfTUNfVDBfT0ZTVCAoOCkKLSNkZWZpbmUgSU5UX01DX1VBX01TSyAoMHgwMDgwKQotI2RlZmluZSBJTlRfTUNfVUFfT0ZTVCAoNykKLSNkZWZpbmUgSU5UX01DX0lQX01TSyAoMHgwMDQwKQotI2RlZmluZSBJTlRfTUNfSVBfT0ZTVCAoNikKLSNkZWZpbmUgSU5UX01DX1A1X01TSyAoMHgwMDIwKQotI2RlZmluZSBJTlRfTUNfUDVfT0ZTVCAoNSkKLSNkZWZpbmUgSU5UX01DX1A0X01TSyAoMHgwMDEwKQotI2RlZmluZSBJTlRfTUNfUDRfT0ZTVCAoNCkKLSNkZWZpbmUgSU5UX01DX1AzX01TSyAoMHgwMDA4KQotI2RlZmluZSBJTlRfTUNfUDNfT0ZTVCAoMykKLSNkZWZpbmUgSU5UX01DX1AyX01TSyAoMHgwMDA0KQotI2RlZmluZSBJTlRfTUNfUDJfT0ZTVCAoMikKLSNkZWZpbmUgSU5UX01DX1AxX01TSyAoMHgwMDAyKQotI2RlZmluZSBJTlRfTUNfUDFfT0ZTVCAoMSkKLSNkZWZpbmUgSU5UX01DX1AwX01TSyAoMHgwMDAxKQotI2RlZmluZSBJTlRfTUNfUDBfT0ZTVCAoMCkKLQotI2RlZmluZSBJTlRfU1MoYmFzZV9hZGRyKSAoSU5UX0NUUkwwMF9UWVBFIChiYXNlX2FkZHIgICsgMHgwOCApKQotI2RlZmluZSBJTlRfU1NfRkNfU1NLICgweDgwMDApCi0jZGVmaW5lIElOVF9TU19GQ19PRlNUICgxNSkKLSNkZWZpbmUgSU5UX1NTX00xX1NTSyAoMHg4MDAwKQotI2RlZmluZSBJTlRfU1NfTTFfT0ZTVCAoMTUpCi0jZGVmaW5lIElOVF9TU19NMF9TU0sgKDB4NDAwMCkKLSNkZWZpbmUgSU5UX1NTX00wX09GU1QgKDE0KQotI2RlZmluZSBJTlRfU1NfQUVfU1NLICgweDIwMDApCi0jZGVmaW5lIElOVF9TU19BRV9PRlNUICgxMykKLSNkZWZpbmUgSU5UX1NTX1BFX1NTSyAoMHgxMDAwKQotI2RlZmluZSBJTlRfU1NfUEVfT0ZTVCAoMTIpCi0jZGVmaW5lIElOVF9TU19FRV9TU0sgKDB4MDgwMCkKLSNkZWZpbmUgSU5UX1NTX0VFX09GU1QgKDExKQotI2RlZmluZSBJTlRfU1NfUFNfU1NLICgweDA0MDApCi0jZGVmaW5lIElOVF9TU19QU19PRlNUICgxMCkKLSNkZWZpbmUgSU5UX1NTX1QxX1NTSyAoMHgwMjAwKQotI2RlZmluZSBJTlRfU1NfVDFfT0ZTVCAoOSkKLSNkZWZpbmUgSU5UX1NTX1QwX1NTSyAoMHgwMTAwKQotI2RlZmluZSBJTlRfU1NfVDBfT0ZTVCAoOCkKLSNkZWZpbmUgSU5UX1NTX1VBX1NTSyAoMHgwMDgwKQotI2RlZmluZSBJTlRfU1NfVUFfT0ZTVCAoNykKLSNkZWZpbmUgSU5UX1NTX0lQX1NTSyAoMHgwMDQwKQotI2RlZmluZSBJTlRfU1NfSVBfT0ZTVCAoNikKLSNkZWZpbmUgSU5UX1NTX1A1X1NTSyAoMHgwMDIwKQotI2RlZmluZSBJTlRfU1NfUDVfT0ZTVCAoNSkKLSNkZWZpbmUgSU5UX1NTX1A0X1NTSyAoMHgwMDEwKQotI2RlZmluZSBJTlRfU1NfUDRfT0ZTVCAoNCkKLSNkZWZpbmUgSU5UX1NTX1AzX1NTSyAoMHgwMDA4KQotI2RlZmluZSBJTlRfU1NfUDNfT0ZTVCAoMykKLSNkZWZpbmUgSU5UX1NTX1AyX1NTSyAoMHgwMDA0KQotI2RlZmluZSBJTlRfU1NfUDJfT0ZTVCAoMikKLSNkZWZpbmUgSU5UX1NTX1AxX1NTSyAoMHgwMDAyKQotI2RlZmluZSBJTlRfU1NfUDFfT0ZTVCAoMSkKLSNkZWZpbmUgSU5UX1NTX1AwX1NTSyAoMHgwMDAxKQotI2RlZmluZSBJTlRfU1NfUDBfT0ZTVCAoMCkKLQotI2RlZmluZSBJTlRfUlMoYmFzZV9hZGRyKSAoSU5UX0NUUkwwMF9UWVBFIChiYXNlX2FkZHIgICsgMHgwQyApKQotI2RlZmluZSBJTlRfUlNfRkNfUlNLICgweDEwMDAwKQotI2RlZmluZSBJTlRfUlNfRkNfT0ZTVCAoMTYpCi0jZGVmaW5lIElOVF9SU19NMV9SU0sgKDB4ODAwMCkKLSNkZWZpbmUgSU5UX1JTX00xX09GU1QgKDE1KQotI2RlZmluZSBJTlRfUlNfTTBfUlNLICgweDQwMDApCi0jZGVmaW5lIElOVF9SU19NMF9PRlNUICgxNCkKLSNkZWZpbmUgSU5UX1JTX0FFX1JTSyAoMHgyMDAwKQotI2RlZmluZSBJTlRfUlNfQUVfT0ZTVCAoMTMpCi0jZGVmaW5lIElOVF9SU19QRV9SU0sgKDB4MTAwMCkKLSNkZWZpbmUgSU5UX1JTX1BFX09GU1QgKDEyKQotI2RlZmluZSBJTlRfUlNfRUVfUlNLICgweDA4MDApCi0jZGVmaW5lIElOVF9SU19FRV9PRlNUICgxMSkKLSNkZWZpbmUgSU5UX1JTX1BTX1JTSyAoMHgwNDAwKQotI2RlZmluZSBJTlRfUlNfUFNfT0ZTVCAoMTApCi0jZGVmaW5lIElOVF9SU19UMV9SU0sgKDB4MDIwMCkKLSNkZWZpbmUgSU5UX1JTX1QxX09GU1QgKDkpCi0jZGVmaW5lIElOVF9SU19UMF9SU0sgKDB4MDEwMCkKLSNkZWZpbmUgSU5UX1JTX1QwX09GU1QgKDgpCi0jZGVmaW5lIElOVF9SU19VQV9SU0sgKDB4MDA4MCkKLSNkZWZpbmUgSU5UX1JTX1VBX09GU1QgKDcpCi0jZGVmaW5lIElOVF9SU19JUF9SU0sgKDB4MDA0MCkKLSNkZWZpbmUgSU5UX1JTX0lQX09GU1QgKDYpCi0jZGVmaW5lIElOVF9SU19QNV9SU0sgKDB4MDAyMCkKLSNkZWZpbmUgSU5UX1JTX1A1X09GU1QgKDUpCi0jZGVmaW5lIElOVF9SU19QNF9SU0sgKDB4MDAxMCkKLSNkZWZpbmUgSU5UX1JTX1A0X09GU1QgKDQpCi0jZGVmaW5lIElOVF9SU19QM19SU0sgKDB4MDAwOCkKLSNkZWZpbmUgSU5UX1JTX1AzX09GU1QgKDMpCi0jZGVmaW5lIElOVF9SU19QMl9SU0sgKDB4MDAwNCkKLSNkZWZpbmUgSU5UX1JTX1AyX09GU1QgKDIpCi0jZGVmaW5lIElOVF9SU19QMV9SU0sgKDB4MDAwMikKLSNkZWZpbmUgSU5UX1JTX1AxX09GU1QgKDEpCi0jZGVmaW5lIElOVF9SU19QMF9SU0sgKDB4MDAwMSkKLSNkZWZpbmUgSU5UX1JTX1AwX09GU1QgKDApCi0KLSNkZWZpbmUgSU5UX0lEKGJhc2VfYWRkcikgKElOVF9DVFJMMDBfVFlQRSAoYmFzZV9hZGRyICArIDB4MTAgKSkKLSNkZWZpbmUgSU5UX0lEX0lEX01TSyAoMHgzRikKLSNkZWZpbmUgSU5UX0lEX0lEX09GU1QgKDApCi0KLSNkZWZpbmUgSU5UX1BMRF9QUklPUklUWShiYXNlX2FkZHIpIChJTlRfQ1RSTDAwX1RZUEUgKGJhc2VfYWRkciAgKyAweDE0ICkpCi0jZGVmaW5lIElOVF9QTERfUFJJT1JJVFlfUFJJX01TSyAoMHgzRikKLSNkZWZpbmUgSU5UX1BMRF9QUklPUklUWV9QUklfT0ZTVCAoMCkKLSNkZWZpbmUgSU5UX1BMRF9QUklPUklUWV9HQV9NU0sgKDB4NDApCi0jZGVmaW5lIElOVF9QTERfUFJJT1JJVFlfR0FfT0ZTVCAoNikKLQotI2RlZmluZSBJTlRfTU9ERShiYXNlX2FkZHIpIChJTlRfQ1RSTDAwX1RZUEUgKGJhc2VfYWRkciAgKyAweDE4ICkpCi0jZGVmaW5lIElOVF9NT0RFX01PREVfTVNLICgweDMpCi0jZGVmaW5lIElOVF9NT0RFX01PREVfT0ZTVCAoMCkKLQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDAoYmFzZV9hZGRyKSAoSU5UX0NUUkwwMF9UWVBFIChiYXNlX2FkZHIgICsgMHg4MCApKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDBfUFJJX01TSyAoMHgzRikKLSNkZWZpbmUgSU5UX1BSSU9SSVRZX1AwX1BSSV9PRlNUICgwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDBfRlFfTVNLICgweDQwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDBfRlFfT0ZTVCAoNikKLQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDEoYmFzZV9hZGRyKSAoSU5UX0NUUkwwMF9UWVBFIChiYXNlX2FkZHIgICsgMHg4NCApKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDFfUFJJX01TSyAoMHgzRikKLSNkZWZpbmUgSU5UX1BSSU9SSVRZX1AxX1BSSV9PRlNUICgwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDFfRlFfTVNLICgweDQwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDFfRlFfT0ZTVCAoNikKLQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDIoYmFzZV9hZGRyKSAoSU5UX0NUUkwwMF9UWVBFIChiYXNlX2FkZHIgICsgMHg4OCApKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDJfUFJJX01TSyAoMHgzRikKLSNkZWZpbmUgSU5UX1BSSU9SSVRZX1AyX1BSSV9PRlNUICgwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDJfRlFfTVNLICgweDQwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDJfRlFfT0ZTVCAoNikKLQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDMoYmFzZV9hZGRyKSAoSU5UX0NUUkwwMF9UWVBFIChiYXNlX2FkZHIgICsgMHg4QyApKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDNfUFJJX01TSyAoMHgzRikKLSNkZWZpbmUgSU5UX1BSSU9SSVRZX1AzX1BSSV9PRlNUICgwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDNfRlFfTVNLICgweDQwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDNfRlFfT0ZTVCAoNikKLQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDQoYmFzZV9hZGRyKSAoSU5UX0NUUkwwMF9UWVBFIChiYXNlX2FkZHIgICsgMHg5MCApKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDRfUFJJX01TSyAoMHgzRikKLSNkZWZpbmUgSU5UX1BSSU9SSVRZX1A0X1BSSV9PRlNUICgwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDRfRlFfTVNLICgweDQwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDRfRlFfT0ZTVCAoNikKLQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDUoYmFzZV9hZGRyKSAoSU5UX0NUUkwwMF9UWVBFIChiYXNlX2FkZHIgICsgMHg5NCApKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDVfUFJJX01TSyAoMHgzRikKLSNkZWZpbmUgSU5UX1BSSU9SSVRZX1A1X1BSSV9PRlNUICgwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDVfRlFfTVNLICgweDQwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUDVfRlFfT0ZTVCAoNikKLQotI2RlZmluZSBJTlRfUFJJT1JJVFlfSVAoYmFzZV9hZGRyKSAoSU5UX0NUUkwwMF9UWVBFIChiYXNlX2FkZHIgICsgMHg5NCApKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfSVBfUFJJX01TSyAoMHgzRikKLSNkZWZpbmUgSU5UX1BSSU9SSVRZX0lQX1BSSV9PRlNUICgwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfSVBfRlFfTVNLICgweDQwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfSVBfRlFfT0ZTVCAoNikKLQotI2RlZmluZSBJTlRfUFJJT1JJVFlfVUEoYmFzZV9hZGRyKSAoSU5UX0NUUkwwMF9UWVBFIChiYXNlX2FkZHIgICsgMHg5QyApKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfVUFfUFJJX01TSyAoMHgzRikKLSNkZWZpbmUgSU5UX1BSSU9SSVRZX1VBX1BSSV9PRlNUICgwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfVUFfRlFfTVNLICgweDQwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfVUFfRlFfT0ZTVCAoNikKLQotI2RlZmluZSBJTlRfUFJJT1JJVFlfVDAoYmFzZV9hZGRyKSAoSU5UX0NUUkwwMF9UWVBFIChiYXNlX2FkZHIgICsgMHhBMCApKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfVDBfUFJJX01TSyAoMHgzRikKLSNkZWZpbmUgSU5UX1BSSU9SSVRZX1QwX1BSSV9PRlNUICgwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfVDBfRlFfTVNLICgweDQwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfVDBfRlFfT0ZTVCAoNikKLQotI2RlZmluZSBJTlRfUFJJT1JJVFlfVDEoYmFzZV9hZGRyKSAoSU5UX0NUUkwwMF9UWVBFIChiYXNlX2FkZHIgICsgMHhBNCApKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfVDFfUFJJX01TSyAoMHgzRikKLSNkZWZpbmUgSU5UX1BSSU9SSVRZX1QxX1BSSV9PRlNUICgwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfVDFfRlFfTVNLICgweDQwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfVDFfRlFfT0ZTVCAoNikKLQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUFMoYmFzZV9hZGRyKSAoSU5UX0NUUkwwMF9UWVBFIChiYXNlX2FkZHIgICsgMHhBOCApKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUFNfUFJJX01TSyAoMHgzRikKLSNkZWZpbmUgSU5UX1BSSU9SSVRZX1BTX1BSSV9PRlNUICgwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUFNfRlFfTVNLICgweDQwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUFNfRlFfT0ZTVCAoNikKLQotI2RlZmluZSBJTlRfUFJJT1JJVFlfRUUoYmFzZV9hZGRyKSAoSU5UX0NUUkwwMF9UWVBFIChiYXNlX2FkZHIgICsgMHhBQyApKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfRUVfUFJJX01TSyAoMHgzRikKLSNkZWZpbmUgSU5UX1BSSU9SSVRZX0VFX1BSSV9PRlNUICgwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfRUVfRlFfTVNLICgweDQwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfRUVfRlFfT0ZTVCAoNikKLQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUEUoYmFzZV9hZGRyKSAoSU5UX0NUUkwwMF9UWVBFIChiYXNlX2FkZHIgICsgMHhCMCApKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUEVfUFJJX01TSyAoMHgzRikKLSNkZWZpbmUgSU5UX1BSSU9SSVRZX1BFX1BSSV9PRlNUICgwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUEVfRlFfTVNLICgweDQwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfUEVfRlFfT0ZTVCAoNikKLQotI2RlZmluZSBJTlRfUFJJT1JJVFlfQUUoYmFzZV9hZGRyKSAoSU5UX0NUUkwwMF9UWVBFIChiYXNlX2FkZHIgICsgMHhCNCApKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfQUVfUFJJX01TSyAoMHgzRikKLSNkZWZpbmUgSU5UX1BSSU9SSVRZX0FFX1BSSV9PRlNUICgwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfQUVfRlFfTVNLICgweDQwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfQUVfRlFfT0ZTVCAoNikKLQotI2RlZmluZSBJTlRfUFJJT1JJVFlfTTAoYmFzZV9hZGRyKSAoSU5UX0NUUkwwMF9UWVBFIChiYXNlX2FkZHIgICsgMHhCOCApKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfTTBfUFJJX01TSyAoMHgzRikKLSNkZWZpbmUgSU5UX1BSSU9SSVRZX00wX1BSSV9PRlNUICgwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfTTBfRlFfTVNLICgweDQwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfTTBfRlFfT0ZTVCAoNikKLQotI2RlZmluZSBJTlRfUFJJT1JJVFlfTTEoYmFzZV9hZGRyKSAoSU5UX0NUUkwwMF9UWVBFIChiYXNlX2FkZHIgICsgMHhCQyApKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfTTFfUFJJX01TSyAoMHgzRikKLSNkZWZpbmUgSU5UX1BSSU9SSVRZX00xX1BSSV9PRlNUICgwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfTTFfRlFfTVNLICgweDQwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfTTFfRlFfT0ZTVCAoNikKLQotI2RlZmluZSBJTlRfUFJJT1JJVFlfRkMoYmFzZV9hZGRyKSAoSU5UX0NUUkwwMF9UWVBFIChiYXNlX2FkZHIgICsgMHhDMCApKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfRkNfUFJJX01TSyAoMHgzRikKLSNkZWZpbmUgSU5UX1BSSU9SSVRZX0ZDX1BSSV9PRlNUICgwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfRkNfRlFfTVNLICgweDQwKQotI2RlZmluZSBJTlRfUFJJT1JJVFlfRkNfRlFfT0ZTVCAoNikKLQotI2VuZGlmIC8qIF9fSU5UX0NUUkwwMF9IICovCi0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvaW8uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL2lvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZTEwMGMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvaW8uaAotICoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTkgQVJNIExpbWl0ZWQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLSNpZm5kZWYgX19BU01fQVJNX0FSQ0hfSU9fSAotI2RlZmluZSBfX0FTTV9BUk1fQVJDSF9JT19ICi0KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KLQotI2RlZmluZSBJT19TUEFDRV9MSU1JVCAweGZmZmYKLQotCi0vKgotICogR2VuZXJpYyB2aXJ0dWFsIHJlYWQvd3JpdGUKLSAqLwotLyojZGVmaW5lIG91dHN3ICAgX19hcmNoX3dyaXRlc3cKLSNkZWZpbmUgb3V0c2wgICBfX2FyY2hfd3JpdGVzbAotI2RlZmluZSBvdXRzYiAgIF9fYXJjaF93cml0ZXNiCi0jZGVmaW5lIGluc2IgICAgX19hcmNoX3JlYWRzYgotI2RlZmluZSBpbnN3ICAgIF9fYXJjaF9yZWFkc3cKLSNkZWZpbmUgaW5zbCAgICBfX2FyY2hfcmVhZHNsKi8KLQotI2RlZmluZSBfX2lvKGEpCQkJKCh2b2lkIF9faW9tZW0gKikoYSkpCi0jZGVmaW5lIF9fbWVtX3BjaShhKSAgICAgICAgICAgIChhKSAKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcHhhMTBkYi9pcnFzLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcHhhMTBkYi9pcnFzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNzU4YTMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvaXJxcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqICBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jYW1lbG90L2lycXMuaAotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDEgQWx0ZXJhIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLS8qIFVzZSB0aGUgRXhjYWxpYnVyIGNoaXAgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgSU5UX0NUUkwwMF9UWVBFCi0jaW5jbHVkZSAiYXNtL2FyY2gvaW50X2N0cmwwMC5oIgotCi0KLSNkZWZpbmUgSVJRX1BMRDAgICAgICAgICAgICAgICAgICAgICBJTlRfTVNfUDBfT0ZTVAotI2RlZmluZSBJUlFfUExEMSAgICAgICAgICAgICAgICAgICAgIElOVF9NU19QMV9PRlNUCi0jZGVmaW5lIElSUV9QTEQyICAgICAgICAgICAgICAgICAgICAgSU5UX01TX1AyX09GU1QKLSNkZWZpbmUgSVJRX1BMRDMgICAgICAgICAgICAgICAgICAgICBJTlRfTVNfUDNfT0ZTVAotI2RlZmluZSBJUlFfUExENCAgICAgICAgICAgICAgICAgICAgIElOVF9NU19QNF9PRlNUCi0jZGVmaW5lIElSUV9QTEQ1ICAgICAgICAgICAgICAgICAgICAgSU5UX01TX1A1X09GU1QKLSNkZWZpbmUgSVJRX0VYVCAgICAgICAgICAgICAgICAgICAgICBJTlRfTVNfSVBfT0ZTVAotI2RlZmluZSBJUlFfVUFSVCAgICAgICAgICAgICAgICAgICAgIElOVF9NU19VQV9PRlNUCi0jZGVmaW5lIElSUV9USU1FUjAgICAgICAgICAgICAgICAgICAgSU5UX01TX1QwX09GU1QKLSNkZWZpbmUgSVJRX1RJTUVSMSAgICAgICAgICAgICAgICAgICBJTlRfTVNfVDFfT0ZTVAotI2RlZmluZSBJUlFfUExMICAgICAgICAgICAgICAgICAgICAgIElOVF9NU19QTExfT0ZTVAotI2RlZmluZSBJUlFfRUJJICAgICAgICAgICAgICAgICAgICAgIElOVF9NU19FQklfT0ZTVAotI2RlZmluZSBJUlFfU1RSSVBFX0JSSURHRSAgICAgICAgICAgIElOVF9NU19QTExfT0ZTVAotI2RlZmluZSBJUlFfQUhCX0JSSURHRSAgICAgICAgICAgICAgIElOVF9NU19QTExfT0ZTVAotI2RlZmluZSBJUlFfQ09NTVJYICAgICAgICAgICAgICAgICAgIElOVF9NU19DUl9PRlNUCi0jZGVmaW5lIElSUV9DT01NVFggICAgICAgICAgICAgICAgICAgSU5UX01TX0NUX09GU1QKLSNkZWZpbmUgSVJRX0ZBU1RfQ09NTSAgICAgICAgICAgICAgICBJTlRfTVNfRkNfT0ZTVAotCi0jZGVmaW5lIE5SX0lSUVMgICAgICAgICAgICAgICAgICAgICAgICAgKElOVF9NU19GQ19PRlNUICsgMSkKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvbWVtb3J5LmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcHhhMTBkYi9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk5NTQxYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcHhhMTBkYi9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwL21lbW9yeS5oCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMSBBbHRlcmEgQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLSNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICi0KLS8qCi0gKiBQaHlzaWNhbCBEUkFNIG9mZnNldC4KLSAqLwotI2RlZmluZSBQSFlTX09GRlNFVAlVTCgweDAwMDAwMDAwKQotCi0vKgotICogVmlydHVhbCB2aWV3IDwtPiBETUEgdmlldyBtZW1vcnkgYWRkcmVzcyB0cmFuc2xhdGlvbnMKLSAqIHZpcnRfdG9fYnVzOiBVc2VkIHRvIHRyYW5zbGF0ZSB0aGUgdmlydHVhbCBhZGRyZXNzIHRvIGFuCi0gKiAgICAgICAgICAgICAgYWRkcmVzcyBzdWl0YWJsZSB0byBiZSBwYXNzZWQgdG8gc2V0X2RtYV9hZGRyCi0gKiBidXNfdG9fdmlydDogVXNlZCB0byBjb252ZXJ0IGFuIGFkZHJlc3MgZm9yIERNQSBvcGVyYXRpb25zCi0gKiAgICAgICAgICAgICAgdG8gYW4gYWRkcmVzcyB0aGF0IHRoZSBrZXJuZWwgY2FuIHVzZS4KLSAqLwotI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHgpCSh4IC0gUEFHRV9PRkZTRVQgKyAvKlNEUkFNX0JBU0UqLzApCi0jZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkJKHggLSAvKlNEUkFNX0JBU0UqLzAgKyBQQUdFX09GRlNFVCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcHhhMTBkYi9tb2RlX2N0cmwwMC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvbW9kZV9jdHJsMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhhN2VmYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcHhhMTBkYi9tb2RlX2N0cmwwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI2lmbmRlZiBfX01PREVfQ1RSTDAwX0gKLSNkZWZpbmUgX19NT0RFX0NUUkwwMF9ICi0KLS8qCi0gKiBSZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgdGhlIHJlc2V0IGFuZCBtb2RlIGNvbnRyb2wKLSAqLwotCi0vKgotICogIENvcHlyaWdodCAoQykgMjAwMSBBbHRlcmEgQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLQotCi0KLSNkZWZpbmUgQk9PVF9DUihCQVNFX0FERFIpIChNT0RFX0NUUkwwMF9UWVBFIChCQVNFX0FERFIgICkpCi0jZGVmaW5lIEJPT1RfQ1JfQkZfTVNLICgweDEpCi0jZGVmaW5lIEJPT1RfQ1JfQkZfT0ZTVCAoMCkKLSNkZWZpbmUgQk9PVF9DUl9ITV9NU0sgKDB4MikKLSNkZWZpbmUgQk9PVF9DUl9ITV9PRlNUICgxKQotI2RlZmluZSBCT09UX0NSX1JFX01TSyAoMHg0KQotI2RlZmluZSBCT09UX0NSX1JFX09GU1QgKDIpCi0KLSNkZWZpbmUgUkVTRVRfU1IoQkFTRV9BRERSKSAoTU9ERV9DVFJMMDBfVFlQRSAoQkFTRV9BRERSICArIDB4NCApKQotI2RlZmluZSBSRVNFVF9TUl9XUl9NU0sgKDB4MSkKLSNkZWZpbmUgUkVTRVRfU1JfV1JfT0ZTVCAoMCkKLSNkZWZpbmUgUkVTRVRfU1JfQ1JfTVNLICgweDIpCi0jZGVmaW5lIFJFU0VUX1NSX0NSX09GU1QgKDEpCi0jZGVmaW5lIFJFU0VUX1NSX0pUX01TSyAoMHg0KQotI2RlZmluZSBSRVNFVF9TUl9KVF9PRlNUICgyKQotI2RlZmluZSBSRVNFVF9TUl9FUl9NU0sgKDB4OCkKLSNkZWZpbmUgUkVTRVRfU1JfRVJfT0ZTVCAoMykKLQotI2RlZmluZSBJRF9DT0RFKEJBU0VfQUREUikgKE1PREVfQ1RSTDAwX1RZUEUgKEJBU0VfQUREUiAgKyAweDA4ICkpCi0KLSNkZWZpbmUgU1JBTTBfU1IoQkFTRV9BRERSKSAoTU9ERV9DVFJMMDBfVFlQRSAoQkFTRV9BRERSICArIDB4MjAgKSkKLSNkZWZpbmUgU1JBTTBfU1JfU0laRV9NU0sgKDB4RkZGRkYwMDApCi0jZGVmaW5lIFNSQU0wX1NSX1NJWkVfT0ZTVCAoMTIpCi0KLSNkZWZpbmUgU1JBTTFfU1IoQkFTRV9BRERSKSAoTU9ERV9DVFJMMDBfVFlQRSAoQkFTRV9BRERSICArIDB4MjQgKSkKLSNkZWZpbmUgU1JBTTFfU1JfU0laRV9NU0sgKDB4RkZGRkYwMDApCi0jZGVmaW5lIFNSQU0xX1NSX1NJWkVfT0ZTVCAoMTIpCi0KLSNkZWZpbmUgRFBTUkFNMF9TUihCQVNFX0FERFIpIChNT0RFX0NUUkwwMF9UWVBFIChCQVNFX0FERFIgICsgMHgzMCApKQotCi0jZGVmaW5lIERQU1JBTTBfU1JfTU9ERV9NU0sgKDB4RikKLSNkZWZpbmUgRFBTUkFNMF9TUl9NT0RFX09GU1QgKDApCi0jZGVmaW5lIERQU1JBTTBfU1JfR0xCTF9NU0sgKDB4MzApCi0jZGVmaW5lIERQU1JBTTBfU1JfU0laRV9NU0sgKDB4RkZGRkYwMDApCi0jZGVmaW5lIERQU1JBTTBfU1JfU0laRV9PRlNUICgxMikKLQotI2RlZmluZSBEUFNSQU0wX0xDUihCQVNFX0FERFIpIChNT0RFX0NUUkwwMF9UWVBFIChCQVNFX0FERFIgICsgMHgzNCApKQotI2RlZmluZSBEUFNSQU0wX0xDUl9MQ0tBRERSX01TSyAoMHgxRkZFMCkKLSNkZWZpbmUgRFBTUkFNMF9MQ1JfTENLQUREUl9PRlNUICg0KQotCi0jZGVmaW5lIERQU1JBTTFfU1IoQkFTRV9BRERSKSAoTU9ERV9DVFJMMDBfVFlQRSAoQkFTRV9BRERSICArIDB4MzggKSkKLSNkZWZpbmUgRFBTUkFNMV9TUl9NT0RFX01TSyAoMHhGKQotI2RlZmluZSBEUFNSQU0xX1NSX01PREVfT0ZTVCAoMCkKLSNkZWZpbmUgRFBTUkFNMV9TUl9HTEJMX01TSyAoMHgzMCkKLSNkZWZpbmUgRFBTUkFNMV9TUl9HTEJMX09GU1QgKDQpCi0jZGVmaW5lIERQU1JBTTFfU1JfU0laRV9NU0sgKDB4RkZGRkYwMDApCi0jZGVmaW5lIERQU1JBTTFfU1JfU0laRV9PRlNUICgxMikKLQotI2RlZmluZSBEUFNSQU0xX0xDUihCQVNFX0FERFIpIChNT0RFX0NUUkwwMF9UWVBFIChCQVNFX0FERFIgICsgMHgzQyApKQotI2RlZmluZSBEUFNSQU0xX0xDUl9MQ0tBRERSX01TSyAoMHgxRkZFMCkKLSNkZWZpbmUgRFBTUkFNMV9MQ1JfTENLQUREUl9PRlNUICg0KQotCi0jZW5kaWYgLyogX19NT0RFX0NUUkwwMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcHhhMTBkYi9wYXJhbS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvcGFyYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgzZGVkZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcHhhMTBkYi9wYXJhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqICBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcHhhMTBkYi9wYXJhbS5oCi0gKgotICogIENvcHlyaWdodCAoQykgMTk5OSBBUk0gTGltaXRlZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvcGxhdGZvcm0uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL3BsYXRmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOWJiMGYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvcGxhdGZvcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI2lmbmRlZiBQTEFURk9STV9ICi0jZGVmaW5lIFBMQVRGT1JNX0gKLSNpbmNsdWRlICJleGNhbGlidXIuaCIKLQotI2RlZmluZSBNQVhJUlFOVU0gMTUgCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvcGxkX2NvbmYwMC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvcGxkX2NvbmYwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWYyYzM4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL3BsZF9jb25mMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLSNpZm5kZWYgX19QTERfQ09ORjAwX0gKLSNkZWZpbmUgX19QTERfQ09ORjAwX0gKLQotLyoKLSAqIFJlZ2lzdGVyIGRlZmluaXRpb25zIGZvciB0aGUgUExEIENvbmZpZ3VyYXRpb24gTG9naWMKLSAqLwotCi0vKgotICogIAotICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBFeGNhbGlidXIKLSAqICBJbnRlcnJ1cHQgY29udHJvbGxlciBJTlRfQ1RSTDAwLgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDEgQWx0ZXJhIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0gCi0jZGVmaW5lIENPTkZJR19DT05UUk9MKEJBU0VfQUREUikgKFBMRF9DT05GMDBfVFlQRSAoQkFTRV9BRERSKSkgIAotI2RlZmluZSBDT05GSUdfQ09OVFJPTF9MS19NU0sgKDB4MSkKLSNkZWZpbmUgQ09ORklHX0NPTlRST0xfTEtfT0ZTVCAoMCkKLSNkZWZpbmUgQ09ORklHX0NPTlRST0xfQ09fTVNLICgweDIpCi0jZGVmaW5lIENPTkZJR19DT05UUk9MX0NPX09GU1QgKDEpCi0jZGVmaW5lIENPTkZJR19DT05UUk9MX0JfTVNLICAoMHg0KQotI2RlZmluZSBDT05GSUdfQ09OVFJPTF9CX09GU1QgKDIpCi0jZGVmaW5lIENPTkZJR19DT05UUk9MX1BDX01TSyAoMHg4KQotI2RlZmluZSBDT05GSUdfQ09OVFJPTF9QQ19PRlNUICgzKQotI2RlZmluZSBDT05GSUdfQ09OVFJPTF9FX01TSyAoMHgxMCkKLSNkZWZpbmUgQ09ORklHX0NPTlRST0xfRV9PRlNUICg0KQotI2RlZmluZSBDT05GSUdfQ09OVFJPTF9FU19NU0sgKDB4RTApCi0jZGVmaW5lIENPTkZJR19DT05UUk9MX0VTX09GU1QgKDUpCi0jZGVmaW5lIENPTkZJR19DT05UUk9MX0VTXzBfTVNLICgweDIwKQotI2RlZmluZSBDT05GSUdfQ09OVFJPTF9FU18xX01TSyAoMHg0MCkKLSNkZWZpbmUgQ09ORklHX0NPTlRST0xfRVNfMl9NU0sgKDB4ODApCi0KLSNkZWZpbmUgQ09ORklHX0NPTlRST0xfQ0xPQ0soQkFTRV9BRERSKSAoUExEX0NPTkYwMF9UWVBFIChCQVNFX0FERFIgICsgMHg0ICkpCi0jZGVmaW5lIENPTkZJR19DT05UUk9MX0NMT0NLX1JBVElPX01TSyAoMHhGRkZGKQotI2RlZmluZSBDT05GSUdfQ09OVFJPTF9DTE9DS19SQVRJT19PRlNUICgwKQotCi0jZGVmaW5lIENPTkZJR19DT05UUk9MX0RBVEEoQkFTRV9BRERSKSAoUExEX0NPTkYwMF9UWVBFIChCQVNFX0FERFIgICsgMHg4ICkpCi0jZGVmaW5lIENPTkZJR19DT05UUk9MX0RBVEFfTVNLICgweEZGRkZGRkZGKQotI2RlZmluZSBDT05GSUdfQ09OVFJPTF9EQVRBX09GU1QgKDApCi0KLSNkZWZpbmUgQ09ORklHX1VOTE9DSyhCQVNFX0FERFIpIChQTERfQ09ORjAwX1RZUEUgKEJBU0VfQUREUiAgKyAweEMgKSkgCi0jZGVmaW5lIENPTkZJR19VTkxPQ0tfTVNLICgweEZGRkZGRkZGKQotI2RlZmluZSBDT05GSUdfVU5MT0NLX09GU1QgKDApCi0KLSNkZWZpbmUgQ09ORklHX1VOTE9DS19NQUdJQyAoMHg1NTRFNEM0QikKLQotI2VuZGlmIC8qIF9fUExEX0NPTkYwMF9IICovCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcHhhMTBkYi9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL3N5c3RlbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDViMDkyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL3N5c3RlbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcHhhMTBkYi9zeXN0ZW0uaAotICoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTkgQVJNIExpbWl0ZWQKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDAgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDEgQWx0ZXJhIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0jaWZuZGVmIF9fQVNNX0FSQ0hfU1lTVEVNX0gKLSNkZWZpbmUgX19BU01fQVJDSF9TWVNURU1fSAotCi0jaW5jbHVkZSA8YXNtL2FyY2gvcGxhdGZvcm0uaD4KLQotc3RhdGljIGlubGluZSB2b2lkIGFyY2hfaWRsZSh2b2lkKQotewotCS8qCi0JICogVGhpcyBzaG91bGQgZG8gYWxsIHRoZSBjbG9jayBzd2l0Y2hpbmcKLQkgKiBhbmQgd2FpdCBmb3IgaW50ZXJydXB0IHRyaWNrcwotCSAqLwotCWNwdV9kb19pZGxlKCk7Ci19Ci0KLWV4dGVybiBfX2lubGluZV9fIHZvaWQgYXJjaF9yZXNldChjaGFyIG1vZGUpCi17Ci0JLyogSG1tLi4uIFdlIGNhbiBwcm9iYWJseSBkbyBzb21ldGhpbmcgd2l0aCB0aGUgd2F0Y2hkb2cuLi4gKi8KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcHhhMTBkYi90ZGtwaHkuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL3Rka3BoeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTEwN2JkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL3Rka3BoeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qCi0gKiAgbGludXgvZHJpdmVycy90ZGtwaHkuaAotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDEgQWx0ZXJhIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNpZm5kZWYgX19UREtQSFlfSAotI2RlZmluZSBfX1RES1BIWV9ICi0KLS8qCi0gKiBSZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgdGhlIFRESyA3OFEyMTIwIFBIWSAKLSAqIHdoaWNoIGlzIG9uIHRoZSBDYW1lbG90IGJvYXJkCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgQWx0ZXJhIENvcnBvcmF0aW9uIDIwMDAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICovCi0jZGVmaW5lIFBIWV9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwKQotI2RlZmluZSBQSFlfQ09OVFJPTF9DT0xUX01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDgwKQotI2RlZmluZSBQSFlfQ09OVFJPTF9DT0xUX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg3KQotI2RlZmluZSBQSFlfQ09OVFJPTF9EVVBMRVhfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDEwMCkKLSNkZWZpbmUgUEhZX0NPTlRST0xfRFVQTEVYX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOCkKLSNkZWZpbmUgUEhZX0NPTlRST0xfUkFORUdfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyMDApCi0jZGVmaW5lIFBIWV9DT05UUk9MX1JBTkVHX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDkpCi0jZGVmaW5lIFBIWV9DT05UUk9MX0lTT19NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0MDApCi0jZGVmaW5lIFBIWV9DT05UUk9MX0lTT19PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEwKQotI2RlZmluZSBQSFlfQ09OVFJPTF9QV1JETl9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDgwMCkKLSNkZWZpbmUgUEhZX0NPTlRST0xfUFdSRE5fT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTEpCi0jZGVmaW5lIFBIWV9DT05UUk9MX0FORUdFTl9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTAwMCkKLSNkZWZpbmUgUEhZX0NPTlRST0xfQU5FR0VOX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTIpCi0jZGVmaW5lIFBIWV9DT05UUk9MX1NQRUVEU0xfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjAwMCkKLSNkZWZpbmUgUEhZX0NPTlRST0xfU1BFRURTTF9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTMpCi0jZGVmaW5lIFBIWV9DT05UUk9MX0xPT1BCS19NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDAwMCkKLSNkZWZpbmUgUEhZX0NPTlRST0xfTE9PUEJLX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTQpCi0jZGVmaW5lIFBIWV9DT05UUk9MX1JFU0VUX01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ODAwMCkKLSNkZWZpbmUgUEhZX0NPTlRST0xfUkVTRVRfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTUpCi0KLSNkZWZpbmUgUEhZX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEpCi0jZGVmaW5lIFBIWV9TVEFUVVNfRVRYRF9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxKQotI2RlZmluZSBQSFlfU1RBVFVTX0VYVERfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwKQotI2RlZmluZSBQSFlfU1RBVFVTX0pBQl9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MikKLSNkZWZpbmUgUEhZX1NUQVRVU19KQUJfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxKQotI2RlZmluZSBQSFlfU1RBVFVTX0xJTktfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NCkKLSNkZWZpbmUgUEhZX1NUQVRVU19MSU5LX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMikKLSNkZWZpbmUgUEhZX1NUQVRVU19BTkVHQV9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg4KQotI2RlZmluZSBQSFlfU1RBVFVTX0FORUdBX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzKQotI2RlZmluZSBQSFlfU1RBVFVTX1JGQVVMVF9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDEwKQotI2RlZmluZSBQSFlfU1RBVFVTX1JGQVVMVF9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0KQotI2RlZmluZSBQSFlfU1RBVFVTX0FORUdDX01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDIwKQotI2RlZmluZSBQSFlfU1RBVFVTX0FORUdDX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1KQotI2RlZmluZSBQSFlfU1RBVFVTXzEwVF9IX01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDgwMCkKLSNkZWZpbmUgUEhZX1NUQVRVU18xMFRfSF9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTEpCi0jZGVmaW5lIFBIWV9TVEFUVVNfMTBUX0ZfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTAwMCkKLSNkZWZpbmUgUEhZX1NUQVRVU18xMFRfRl9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTIpCi0jZGVmaW5lIFBIWV9TVEFUVVNfMTAwX1hfSF9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjAwMCkKLSNkZWZpbmUgUEhZX1NUQVRVU18xMDBfWF9IX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTMpCi0jZGVmaW5lIFBIWV9TVEFUVVNfMTAwX1hfRl9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDAwMCkKLSNkZWZpbmUgUEhZX1NUQVRVU18xMDBfWF9GX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTQpCi0jZGVmaW5lIFBIWV9TVEFUVVNfMTAwVDRfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ODAwMCkKLSNkZWZpbmUgUEhZX1NUQVRVU18xMDBUNF9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTUpCi0KLSNkZWZpbmUgUEhZX0lEMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIpCi0jZGVmaW5lIFBIWV9JRDFfT1VJX01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhGRkZGKQotI2RlZmluZSBQSFlfSUQxX09VSV9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCi0KLSNkZWZpbmUgUEhZX0lEMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMpCi0jZGVmaW5lIFBIWV9JRDJfUk5fTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhGKQotI2RlZmluZSBQSFlfSUQyX1JOX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCi0jZGVmaW5lIFBIWV9JRDJfTU5fTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzRjApCi0jZGVmaW5lIFBIWV9JRDJfTU5fT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNCkKLSNkZWZpbmUgUEhZX0lEMl9PVUlfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEZDMDApCi0jZGVmaW5lIFBIWV9JRDJfT1VJX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTApCi0KLSNkZWZpbmUgUEhZX0FVVE9fTkVHX0FEVkVSVElTRU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNCkKLSNkZWZpbmUgUEhZX0FVVE9fTkVHX0FEVkVSVElTRU1FTlRfU0VMRUNUT1JfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICgweDFGKQotI2RlZmluZSBQSFlfQVVUT19ORUdfQURWRVJUSVNFTUVOVF9TRUxFQ1RPUl9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgKDApCi0jZGVmaW5lIFBIWV9BVVRPX05FR19BRFZFUlRJU0VNRU5UX0EwX01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDIwKQotI2RlZmluZSBQSFlfQVVUT19ORUdfQURWRVJUSVNFTUVOVF9BMF9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNSkKLSNkZWZpbmUgUEhZX0FVVE9fTkVHX0FEVkVSVElTRU1FTlRfQTFfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDApCi0jZGVmaW5lIFBIWV9BVVRPX05FR19BRFZFUlRJU0VNRU5UX0ExX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg2KQotI2RlZmluZSBQSFlfQVVUT19ORUdfQURWRVJUSVNFTUVOVF9BMl9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg4MCkKLSNkZWZpbmUgUEhZX0FVVE9fTkVHX0FEVkVSVElTRU1FTlRfQTJfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDcpCi0jZGVmaW5lIFBIWV9BVVRPX05FR19BRFZFUlRJU0VNRU5UX0EzX01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDEwMCkKLSNkZWZpbmUgUEhZX0FVVE9fTkVHX0FEVkVSVElTRU1FTlRfQTNfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDgpCi0jZGVmaW5lIFBIWV9BVVRPX05FR19BRFZFUlRJU0VNRU5UX0E0X01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDIwMCkKLSNkZWZpbmUgUEhZX0FVVE9fTkVHX0FEVkVSVElTRU1FTlRfQTRfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDkpCi0jZGVmaW5lIFBIWV9BVVRPX05FR19BRFZFUlRJU0VNRU5UX1RBRl9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDFGRTApCi0jZGVmaW5lIFBIWV9BVVRPX05FR19BRFZFUlRJU0VNRU5UX1RBRl9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1KQotI2RlZmluZSBQSFlfQVVUT19ORUdfQURWRVJUSVNFTUVOVF9SRl9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyMDAwKQotI2RlZmluZSBQSFlfQVVUT19ORUdfQURWRVJUSVNFTUVOVF9SRl9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTMpCi0jZGVmaW5lIFBIWV9BVVRPX05FR19BRFZFUlRJU0VNRU5UX1JTVkRfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQwMDApCi0jZGVmaW5lIFBIWV9BVVRPX05FR19BRFZFUlRJU0VNRU5UX1JWU0RfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTQpCi0jZGVmaW5lIFBIWV9BVVRPX05FR19BRFZFUlRJU0VNRU5UX05QX01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDgwMDApCi0jZGVmaW5lIFBIWV9BVVRPX05FR19BRFZFUlRJU0VNRU5UX05QX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxNSkKLQotI2RlZmluZSBQSFlfQVVUT19ORUdfTElOS19QQVJUTkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1KQotI2RlZmluZSBQSFlfQVVUT19ORUdfTElOS19QQVJUTkVSX1M0X01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxRikKLSNkZWZpbmUgUEhZX0FVVE9fTkVHX0xJTktfUEFSVE5FUl9TNF9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCi0jZGVmaW5lIFBIWV9BVVRPX05FR19MSU5LX1BBUlRORVJfQTdfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDFGRTApCi0jZGVmaW5lIFBIWV9BVVRPX05FR19MSU5LX1BBUlRORVJfQTdfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1KQotI2RlZmluZSBQSFlfQVVUT19ORUdfTElOS19QQVJUTkVSX1JGX01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyMDAwKQotI2RlZmluZSBQSFlfQVVUT19ORUdfTElOS19QQVJUTkVSX1JGX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTMpCi0jZGVmaW5lIFBIWV9BVVRPX05FR19MSU5LX1BBUlRORVJfQUNLX01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQwMDApCi0jZGVmaW5lIFBIWV9BVVRPX05FR19MSU5LX1BBUlRORVJfQUNLX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxNCkKLSNkZWZpbmUgUEhZX0FVVE9fTkVHX0xJTktfUEFSVE5FUl9OUF9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ODAwMCkKLSNkZWZpbmUgUEhZX0FVVE9fTkVHX0xJTktfUEFSVE5FUl9OUF9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE1KQotCi0jZGVmaW5lIFBIWV9BVVRPX05FR19FWFBBTlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDYpCi0jZGVmaW5lIFBIWV9BVVRPX05FR19FWFBBTlNJT05fTFBBTkVHQV9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDEpCi0jZGVmaW5lIFBIWV9BVVRPX05FR19FWFBBTlNJT05fTFBBTkVHQV9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwKQotI2RlZmluZSBQSFlfQVVUT19ORUdfRVhQQU5TSU9OX1BSWF9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyKQotI2RlZmluZSBQSFlfQVVUT19ORUdfRVhQQU5TSU9OX1BSWF9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSkKLSNkZWZpbmUgUEhZX0FVVE9fTkVHX0VYUEFOU0lPTl9OUEFfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NCkKLSNkZWZpbmUgUEhZX0FVVE9fTkVHX0VYUEFOU0lPTl9OUEFfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIpCi0jZGVmaW5lIFBIWV9BVVRPX05FR19FWFBBTlNJT05fTFBOUEFfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDgpCi0jZGVmaW5lIFBIWV9BVVRPX05FR19FWFBBTlNJT05fTFBOUEFfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzKQotI2RlZmluZSBQSFlfQVVUT19ORUdfRVhQQU5TSU9OX1BERl9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxMCkKLSNkZWZpbmUgUEhZX0FVVE9fTkVHX0VYUEFOU0lPTl9QREZfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDQpCi0KLSNkZWZpbmUgUEhZX1ZFTkRPUl9TUEVDSUZJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxNikKLSNkZWZpbmUgUEhZX1ZFTkRPUl9TUEVDSUZJQ19SWENDX01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MSkKLSNkZWZpbmUgUEhZX1ZFTkRPUl9TUEVDSUZJQ19SWENDX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCi0jZGVmaW5lIFBIWV9WRU5ET1JfU1BFQ0lGSUNfUENTQlBfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDIpCi0jZGVmaW5lIFBIWV9WRU5ET1JfU1BFQ0lGSUNfUENTQlBfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxKQotI2RlZmluZSBQSFlfVkVORE9SX1NQRUNJRklDX1JWU1BPTF9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxMCkKLSNkZWZpbmUgUEhZX1ZFTkRPUl9TUEVDSUZJQ19SVlNQT0xfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDQpCi0jZGVmaW5lIFBIWV9WRU5ET1JfU1BFQ0lGSUNfQVBPTF9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDIwKSAgCi0jZGVmaW5lIFBIWV9WRU5ET1JfU1BFQ0lGSUNfQVBPTF9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1KQotI2RlZmluZSBQSFlfVkVORE9SX1NQRUNJRklDX0dQSU8wX0RJUl9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0MCkKLSNkZWZpbmUgUEhZX1ZFTkRPUl9TUEVDSUZJQ19HUElPMF9ESVJfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDYpCi0jZGVmaW5lIFBIWV9WRU5ET1JfU1BFQ0lGSUNfR1BJTzBfREFUX01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDgwKQotI2RlZmluZSBQSFlfVkVORE9SX1NQRUNJRklDX0dQSU8wX0RBVF9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNykKLSNkZWZpbmUgUEhZX1ZFTkRPUl9TUEVDSUZJQ19HUElPMV9ESVJfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTAwKQotI2RlZmluZSBQSFlfVkVORE9SX1NQRUNJRklDX0dQSU8xX0RJUl9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOCkKLSNkZWZpbmUgUEhZX1ZFTkRPUl9TUEVDSUZJQ19HUElPMV9EQVRfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjAwKQotI2RlZmluZSBQSFlfVkVORE9SX1NQRUNJRklDX0dQSU8xX0RBVF9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOSkKLSNkZWZpbmUgUEhZX1ZFTkRPUl9TUEVDSUZJQ18xMEJUX05BVFVSQUxfTE9PUEJBQ0tfREFUX01TSyAgICAgICAoMHg0MDApCi0jZGVmaW5lIFBIWV9WRU5ET1JfU1BFQ0lGSUNfMTBCVF9OQVRVUkFMX0xPT1BCQUNLX0RBVF9PRlNUICAgICAgKDEwKQotI2RlZmluZSBQSFlfVkVORE9SX1NQRUNJRklDXzEwQlRfU1FFX1RFU1RfSU5ISUJJVF9NU0sgICAgICAgICAgICgweDgwMCkKLSNkZWZpbmUgUEhZX1ZFTkRPUl9TUEVDSUZJQ18xMEJUX1NRRV9URVNUX0lOSElCSVRfT0ZTVCAgICAgICAgICAoMTEpCi0jZGVmaW5lIFBIWV9WRU5ET1JfU1BFQ0lGSUNfVFhISU1fTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDEwMDApCi0jZGVmaW5lIFBIWV9WRU5ET1JfU1BFQ0lGSUNfVFhISU1fT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMikKLSNkZWZpbmUgUEhZX1ZFTkRPUl9TUEVDSUZJQ19JTlRfTEVWRUxfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDAwMCkKLSNkZWZpbmUgUEhZX1ZFTkRPUl9TUEVDSUZJQ19JTlRfTEVWRUxfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE0KQotI2RlZmluZSBQSFlfVkVORE9SX1NQRUNJRklDX1JQVFJfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg4MDAwKQotI2RlZmluZSBQSFlfVkVORE9SX1NQRUNJRklDX1JQVFJfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTUpCi0KLSNkZWZpbmUgUEhZX0lSUV9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxNykKLSNkZWZpbmUgUEhZX0lSUV9DT05UUk9MX0FORUdfQ09NUF9JTlRfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MSkKLSNkZWZpbmUgUEhZX0lSUV9DT05UUk9MX0FORUdfQ09NUF9JTlRfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCi0jZGVmaW5lIFBIWV9JUlFfQ09OVFJPTF9SRkFVTFRfSU5UX01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDIpCi0jZGVmaW5lIFBIWV9JUlFfQ09OVFJPTF9SRkFVTFRfSU5UX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxKQotI2RlZmluZSBQSFlfSVJRX0NPTlRST0xfTFNfQ0hHX0lOVF9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0KQotI2RlZmluZSBQSFlfSVJRX0NPTlRST0xfTFNfQ0hHX0lOVF9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMikKLSNkZWZpbmUgUEhZX0lSUV9DT05UUk9MX0xQX0FDS19JTlRfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4OCkKLSNkZWZpbmUgUEhZX0lSUV9DT05UUk9MX0xQX0FDS19JTlRfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMpCi0jZGVmaW5lIFBIWV9JUlFfQ09OVFJPTF9QREZfSU5UX01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTApCi0jZGVmaW5lIFBIWV9JUlFfQ09OVFJPTF9QREZfSU5UX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0KQotI2RlZmluZSBQSFlfSVJRX0NPTlRST0xfUFJYX0lOVF9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDIwKQotI2RlZmluZSBQSFlfSVJRX0NPTlRST0xfUFJYX0lOVF9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNSkKLSNkZWZpbmUgUEhZX0lSUV9DT05UUk9MX1JYRVJfSU5UX01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDApCi0jZGVmaW5lIFBIWV9JUlFfQ09OVFJPTF9SWEVSX0lOVF9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg2KQotI2RlZmluZSBQSFlfSVJRX0NPTlRST0xfSkFCQkVSX0lOVF9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg4MCkKLSNkZWZpbmUgUEhZX0lSUV9DT05UUk9MX0pBQkJFUl9JTlRfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDcpCi0jZGVmaW5lIFBIWV9JUlFfQ09OVFJPTF9BTkVHX0NPTVBfSUVfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDEwMCkKLSNkZWZpbmUgUEhZX0lSUV9DT05UUk9MX0FORUdfQ09NUF9JRV9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDgpCi0jZGVmaW5lIFBIWV9JUlFfQ09OVFJPTF9SRkFVTFRfSUVfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDIwMCkKLSNkZWZpbmUgUEhZX0lSUV9DT05UUk9MX1JGQVVMVF9JRV9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDkpCi0jZGVmaW5lIFBIWV9JUlFfQ09OVFJPTF9MU19DSEdfSUVfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQwMCkKLSNkZWZpbmUgUEhZX0lSUV9DT05UUk9MX0xTX0NIR19JRV9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEwKQotI2RlZmluZSBQSFlfSVJRX0NPTlRST0xfTFBfQUNLX0lFX01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg4MDApCi0jZGVmaW5lIFBIWV9JUlFfQ09OVFJPTF9MUF9BQ0tfSUVfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMSkKLSNkZWZpbmUgUEhZX0lSUV9DT05UUk9MX1BERl9JRV9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxMDAwKQotI2RlZmluZSBQSFlfSVJRX0NPTlRST0xfUERGX0lFX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMikKLSNkZWZpbmUgUEhZX0lSUV9DT05UUk9MX1BSWF9JRV9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyMDAwKQotI2RlZmluZSBQSFlfSVJRX0NPTlRST0xfUFJYX0lFX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMykKLSNkZWZpbmUgUEhZX0lSUV9DT05UUk9MX1JYRVJfSUVfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg0MDAwKQotI2RlZmluZSBQSFlfSVJRX0NPTlRST0xfUlhFUl9JRV9PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTQpCi0jZGVmaW5lIFBIWV9JUlFfQ09OVFJPTF9KQUJCRVJfSUVfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDgwMDApCi0jZGVmaW5lIFBIWV9JUlFfQ09OVFJPTF9KQUJCRVJfSUVfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxNSkKLQotI2RlZmluZSBQSFlfRElBR05PU1RJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE4KQotI2RlZmluZSBQSFlfRElBR05PU1RJQ19SWF9MT0NLX01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDEwMCkKLSNkZWZpbmUgUEhZX0RJQUdOT1NUSUNfUlhfTE9DS19PRlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOCkKLSNkZWZpbmUgUEhZX0RJQUdOT1NUSUNfUlhfUEFTU19NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyMDApCi0jZGVmaW5lIFBIWV9ESUFHTk9TVElDX1JYX1BBU1NfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDkpCi0jZGVmaW5lIFBIWV9ESUFHTk9TVElDX1JBVEVfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NDAwKQotI2RlZmluZSBQSFlfRElBR05PU1RJQ19SQVRFX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMCkKLSNkZWZpbmUgUEhZX0RJQUdOT1NUSUNfRFBMWF9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg4MDApCi0jZGVmaW5lIFBIWV9ESUFHTk9TVElDX0RQTFhfT0ZTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDExKQotI2RlZmluZSBQSFlfRElBR05PU1RJQ19BTkVHRl9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDEwMDApCi0jZGVmaW5lIFBIWV9ESUFHTk9TVElDX0FORUdGX09GU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEyKQotCi0jZW5kaWYgLyogX19UREtQSFlfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvdGltZXIwMC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvdGltZXIwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmEzZmI1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL3RpbWVyMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiAgCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSByZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgdGhlIEV4Y2FsaWJ1cgotICogIFRpbWVyIFRJTUVSMDAuCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMSBBbHRlcmEgQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLSNpZm5kZWYgX19USU1FUjAwX0gKLSNkZWZpbmUgX19USU1FUjAwX0gKLQotLyoKLSAqIFJlZ2lzdGVyIGRlZmluaXRpb25zIGZvciB0aGUgdGltZXJzCi0gKi8KLQotCi0jZGVmaW5lIFRJTUVSMF9DUihCQVNFX0FERFIpIChUSU1FUjAwX1RZUEUgKEJBU0VfQUREUiAgKyAweDAwICkpCi0jZGVmaW5lIFRJTUVSMF9DUl9CX01TSyAoMHgyMCkKLSNkZWZpbmUgVElNRVIwX0NSX0JfT0ZTVCAoMHg1KQotI2RlZmluZSBUSU1FUjBfQ1JfU19NU0sgICgweDEwKQotI2RlZmluZSBUSU1FUjBfQ1JfU19PRlNUICgweDQpCi0jZGVmaW5lIFRJTUVSMF9DUl9DSV9NU0sgKDB4MDgpCi0jZGVmaW5lIFRJTUVSMF9DUl9DSV9PRlNUICgweDMpCi0jZGVmaW5lIFRJTUVSMF9DUl9JRV9NU0sgKDB4MDQpCi0jZGVmaW5lIFRJTUVSMF9DUl9JRV9PRlNUICgweDIpCi0jZGVmaW5lIFRJTUVSMF9DUl9NT0RFX01TSyAoMHgzKQotI2RlZmluZSBUSU1FUjBfQ1JfTU9ERV9PRlNUICgwKQotI2RlZmluZSBUSU1FUjBfQ1JfTU9ERV9GUkVFICgwKQotI2RlZmluZSBUSU1FUjBfQ1JfTU9ERV9PTkUgICgxKQotI2RlZmluZSBUSU1FUjBfQ1JfTU9ERV9JTlRWTCAoMikKLQotI2RlZmluZSBUSU1FUjBfU1IoQkFTRV9BRERSKSAoVElNRVIwMF9UWVBFIChCQVNFX0FERFIgICsgMHgwMCApKQotI2RlZmluZSBUSU1FUjBfU1JfQl9NU0sgKDB4MjApCi0jZGVmaW5lIFRJTUVSMF9TUl9CX09GU1QgKDB4NSkKLSNkZWZpbmUgVElNRVIwX1NSX1NfTVNLICAoMHgxMCkKLSNkZWZpbmUgVElNRVIwX1NSX1NfT0ZTVCAoMHg0KQotI2RlZmluZSBUSU1FUjBfU1JfQ0lfTVNLICgweDA4KQotI2RlZmluZSBUSU1FUjBfU1JfQ0lfT0ZTVCAoMHgzKQotI2RlZmluZSBUSU1FUjBfU1JfSUVfTVNLICgweDA0KQotI2RlZmluZSBUSU1FUjBfU1JfSUVfT0ZTVCAoMHgyKQotI2RlZmluZSBUSU1FUjBfU1JfTU9ERV9NU0sgKDB4MykKLSNkZWZpbmUgVElNRVIwX1NSX01PREVfT0ZTVCAoMCkKLSNkZWZpbmUgVElNRVIwX1NSX01PREVfRlJFRSAoMCkKLSNkZWZpbmUgVElNRVIwX1NSX01PREVfT05FICAoMSkKLSNkZWZpbmUgVElNRVIwX1NSX01PREVfSU5UVkwgKDIpCi0KLSNkZWZpbmUgVElNRVIwX1BSRVNDQUxFKEJBU0VfQUREUikgKFRJTUVSMDBfVFlQRSAoQkFTRV9BRERSICArIDB4MDEwICkpCi0jZGVmaW5lIFRJTUVSMF9MSU1JVChCQVNFX0FERFIpIChUSU1FUjAwX1RZUEUgKEJBU0VfQUREUiAgKyAweDAyMCApKQotI2RlZmluZSBUSU1FUjBfUkVBRChCQVNFX0FERFIpIChUSU1FUjAwX1RZUEUgKEJBU0VfQUREUiAgKyAweDAzMCApKQotCi0jZGVmaW5lIFRJTUVSMV9DUihCQVNFX0FERFIpIChUSU1FUjAwX1RZUEUgKEJBU0VfQUREUiAgKyAweDQwICkpCi0jZGVmaW5lIFRJTUVSMV9DUl9CX01TSyAoMHgyMCkKLSNkZWZpbmUgVElNRVIxX0NSX0JfT0ZTVCAoMHg1KQotI2RlZmluZSBUSU1FUjFfQ1JfU19NU0sgICgweDEwKQotI2RlZmluZSBUSU1FUjFfQ1JfU19PRlNUICgweDQpCi0jZGVmaW5lIFRJTUVSMV9DUl9DSV9NU0sgKDB4MDgpCi0jZGVmaW5lIFRJTUVSMV9DUl9DSV9PRlNUICgweDMpCi0jZGVmaW5lIFRJTUVSMV9DUl9JRV9NU0sgKDB4MDQpCi0jZGVmaW5lIFRJTUVSMV9DUl9JRV9PRlNUICgweDIpCi0jZGVmaW5lIFRJTUVSMV9DUl9NT0RFX01TSyAoMHgzKQotI2RlZmluZSBUSU1FUjFfQ1JfTU9ERV9PRlNUICgwKQotI2RlZmluZSBUSU1FUjFfQ1JfTU9ERV9GUkVFICgwKQotI2RlZmluZSBUSU1FUjFfQ1JfTU9ERV9PTkUgICgxKQotI2RlZmluZSBUSU1FUjFfQ1JfTU9ERV9JTlRWTCAoMikKLQotI2RlZmluZSBUSU1FUjFfU1IoQkFTRV9BRERSKSAoVElNRVIwMF9UWVBFIChCQVNFX0FERFIgICsgMHg0MCApKQotI2RlZmluZSBUSU1FUjFfU1JfQl9NU0sgKDB4MjApCi0jZGVmaW5lIFRJTUVSMV9TUl9CX09GU1QgKDB4NSkKLSNkZWZpbmUgVElNRVIxX1NSX1NfTVNLICAoMHgxMCkKLSNkZWZpbmUgVElNRVIxX1NSX1NfT0ZTVCAoMHg0KQotI2RlZmluZSBUSU1FUjFfU1JfQ0lfTVNLICgweDA4KQotI2RlZmluZSBUSU1FUjFfU1JfQ0lfT0ZTVCAoMHgzKQotI2RlZmluZSBUSU1FUjFfU1JfSUVfTVNLICgweDA0KQotI2RlZmluZSBUSU1FUjFfU1JfSUVfT0ZTVCAoMHgyKQotI2RlZmluZSBUSU1FUjFfU1JfTU9ERV9NU0sgKDB4MykKLSNkZWZpbmUgVElNRVIxX1NSX01PREVfT0ZTVCAoMCkKLSNkZWZpbmUgVElNRVIxX1NSX01PREVfRlJFRSAoMCkKLSNkZWZpbmUgVElNRVIxX1NSX01PREVfT05FICAoMSkKLSNkZWZpbmUgVElNRVIxX1NSX01PREVfSU5UVkwgKDIpCi0KLSNkZWZpbmUgVElNRVIxX1BSRVNDQUxFKEJBU0VfQUREUikgKFRJTUVSMDBfVFlQRSAoQkFTRV9BRERSICArIDB4MDUwICkpCi0jZGVmaW5lIFRJTUVSMV9MSU1JVChCQVNFX0FERFIpIChUSU1FUjAwX1RZUEUgKEJBU0VfQUREUiAgKyAweDA2MCApKQotI2RlZmluZSBUSU1FUjFfUkVBRChCQVNFX0FERFIpIChUSU1FUjAwX1RZUEUgKEJBU0VfQUREUiAgKyAweDA3MCApKQotCi0jZW5kaWYgLyogX19USU1FUjAwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL3RpbWV4LmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcHhhMTBkYi90aW1leC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODdhNzVmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL3RpbWV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL3RpbWV4LmgKLSAqCi0gKiAgRXhjYWxpYnVyIHRpbWV4IHNwZWNpZmljYXRpb25zCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMSBBbHRlcmEgQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLQotLyoKLSAqID8/Ci0gKi8KLSNkZWZpbmUgQ0xPQ0tfVElDS19SQVRFCQkoNTAwMDAwMDAgLyAxNikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL3VhcnQwMC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvdWFydDAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYmQ4OTEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvdWFydDAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyogKgotICogIENvcHlyaWdodCAoQykgMjAwMSBBbHRlcmEgQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLSNpZm5kZWYgX19VQVJUMDBfSAotI2RlZmluZSBfX1VBUlQwMF9ICi0KLS8qCi0gKiBSZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgdGhlIFVBUlQKLSAqLwotCi0jZGVmaW5lIFVBUlRfVFhfRklGT19TSVpFICAgICAgKDE1KQotCi0jZGVmaW5lIFVBUlRfUlNSKEJBU0VfQUREUikgKFVBUlQwMF9UWVBFIChCQVNFX0FERFIgICsgMHgwMCApKQotI2RlZmluZSBVQVJUX1JTUl9SWF9MRVZFTF9NU0sgKDB4MWYpCi0jZGVmaW5lIFVBUlRfUlNSX1JYX0xFVkVMX09GU1QgKDApCi0jZGVmaW5lIFVBUlRfUlNSX1JFX01TSyAoMHg4MCkKLSNkZWZpbmUgVUFSVF9SU1JfUkVfT0ZTVCAoNykKLQotI2RlZmluZSBVQVJUX1JEUyhCQVNFX0FERFIpIChVQVJUMDBfVFlQRSAoQkFTRV9BRERSICArIDB4MDQgKSkKLSNkZWZpbmUgVUFSVF9SRFNfQklfTVNLICgweDgpCi0jZGVmaW5lIFVBUlRfUkRTX0JJX09GU1QgKDQpCi0jZGVmaW5lIFVBUlRfUkRTX0ZFX01TSyAoMHg0KQotI2RlZmluZSBVQVJUX1JEU19GRV9PRlNUICgyKQotI2RlZmluZSBVQVJUX1JEU19QRV9NU0sgKDB4MikKLSNkZWZpbmUgVUFSVF9SRFNfUEVfT0ZTVCAoMSkKLSNkZWZpbmUgVUFSVF9SRFNfT0VfTVNLICgweDEpCi0jZGVmaW5lIFVBUlRfUkRTX09FX09GU1QgKDApCi0KLSNkZWZpbmUgVUFSVF9SRChCQVNFX0FERFIpIChVQVJUMDBfVFlQRSAoQkFTRV9BRERSICArIDB4MDggKSkKLSNkZWZpbmUgVUFSVF9SRF9SWF9EQVRBX01TSyAoMHhmZikKLSNkZWZpbmUgVUFSVF9SRF9SWF9EQVRBX09GU1QgKDApCi0KLSNkZWZpbmUgVUFSVF9UU1IoQkFTRV9BRERSKSAoVUFSVDAwX1RZUEUgKEJBU0VfQUREUiAgKyAweDBjICkpCi0jZGVmaW5lIFVBUlRfVFNSX1RYX0xFVkVMX01TSyAoMHgxZikKLSNkZWZpbmUgVUFSVF9UU1JfVFhfTEVWRUxfT0ZTVCAoMCkKLSNkZWZpbmUgVUFSVF9UU1JfVFhJX01TSyAoMHg4MCkKLSNkZWZpbmUgVUFSVF9UU1JfVFhJX09GU1QgKDcpCi0KLSNkZWZpbmUgVUFSVF9URChCQVNFX0FERFIpIChVQVJUMDBfVFlQRSAoQkFTRV9BRERSICArIDB4MTAgKSkKLSNkZWZpbmUgVUFSVF9URF9UWF9EQVRBX01TSyAoMHhmZikKLSNkZWZpbmUgVUFSVF9URF9UWF9EQVRBX09GU1QgKDApCi0KLSNkZWZpbmUgVUFSVF9GQ1IoQkFTRV9BRERSKSAoVUFSVDAwX1RZUEUgKEJBU0VfQUREUiAgKyAweDE0ICkpCi0jZGVmaW5lIFVBUlRfRkNSX1JYX1RIUl9NU0sgKDB4ZDApCi0jZGVmaW5lIFVBUlRfRkNSX1JYX1RIUl9PRlNUICg1KQotI2RlZmluZSBVQVJUX0ZDUl9SWF9USFJfMSAoMHgwMCkKLSNkZWZpbmUgVUFSVF9GQ1JfUlhfVEhSXzIgKDB4MjApCi0jZGVmaW5lIFVBUlRfRkNSX1JYX1RIUl80ICgweDQwKQotI2RlZmluZSBVQVJUX0ZDUl9SWF9USFJfNiAoMHg2MCkKLSNkZWZpbmUgVUFSVF9GQ1JfUlhfVEhSXzggKDB4ODApCi0jZGVmaW5lIFVBUlRfRkNSX1JYX1RIUl8xMCAoMHhhMCkKLSNkZWZpbmUgVUFSVF9GQ1JfUlhfVEhSXzEyICgweGMwKQotI2RlZmluZSBVQVJUX0ZDUl9SWF9USFJfMTQgKDB4ZDApCi0jZGVmaW5lIFVBUlRfRkNSX1RYX1RIUl9NU0sgKDB4MWMpCi0jZGVmaW5lIFVBUlRfRkNSX1RYX1RIUl9PRlNUICgyKQotI2RlZmluZSBVQVJUX0ZDUl9UWF9USFJfMCAoMHgwMCkKLSNkZWZpbmUgVUFSVF9GQ1JfVFhfVEhSXzIgKDB4MDQpCi0jZGVmaW5lIFVBUlRfRkNSX1RYX1RIUl80ICgweDA4KQotI2RlZmluZSBVQVJUX0ZDUl9UWF9USFJfOCAoMHgwYykKLSNkZWZpbmUgVUFSVF9GQ1JfVFhfVEhSXzEwICgweDEwKQotI2RlZmluZSBVQVJUX0ZDUl9UWF9USFJfMTIgKDB4MTQpCi0jZGVmaW5lIFVBUlRfRkNSX1RYX1RIUl8xNCAoMHgxOCkKLSNkZWZpbmUgVUFSVF9GQ1JfVFhfVEhSXzE1ICgweDFjKQotI2RlZmluZSBVQVJUX0ZDUl9SQ19NU0sgKDB4MDIpCi0jZGVmaW5lIFVBUlRfRkNSX1JDX09GU1QgKDEpCi0jZGVmaW5lIFVBUlRfRkNSX1RDX01TSyAoMHgwMSkKLSNkZWZpbmUgVUFSVF9GQ1JfVENfT0ZTVCAoMCkKLQotI2RlZmluZSBVQVJUX0lFUyhCQVNFX0FERFIpIChVQVJUMDBfVFlQRSAoQkFTRV9BRERSICArIDB4MTggKSkKLSNkZWZpbmUgVUFSVF9JRVNfTUVfTVNLICgweDgpCi0jZGVmaW5lIFVBUlRfSUVTX01FX09GU1QgKDMpCi0jZGVmaW5lIFVBUlRfSUVTX1RJRV9NU0sgKDB4NCkKLSNkZWZpbmUgVUFSVF9JRVNfVElFX09GU1QgKDIpCi0jZGVmaW5lIFVBUlRfSUVTX1RFX01TSyAoMHgyKQotI2RlZmluZSBVQVJUX0lFU19URV9PRlNUICgxKQotI2RlZmluZSBVQVJUX0lFU19SRV9NU0sgKDB4MSkKLSNkZWZpbmUgVUFSVF9JRVNfUkVfT0ZTVCAoMCkKLQotI2RlZmluZSBVQVJUX0lFQyhCQVNFX0FERFIpIChVQVJUMDBfVFlQRSAoQkFTRV9BRERSICArIDB4MWMgKSkKLSNkZWZpbmUgVUFSVF9JRUNfTUVfTVNLICgweDgpCi0jZGVmaW5lIFVBUlRfSUVDX01FX09GU1QgKDMpCi0jZGVmaW5lIFVBUlRfSUVDX1RJRV9NU0sgKDB4NCkKLSNkZWZpbmUgVUFSVF9JRUNfVElFX09GU1QgKDIpCi0jZGVmaW5lIFVBUlRfSUVDX1RFX01TSyAoMHgyKQotI2RlZmluZSBVQVJUX0lFQ19URV9PRlNUICgxKQotI2RlZmluZSBVQVJUX0lFQ19SRV9NU0sgKDB4MSkKLSNkZWZpbmUgVUFSVF9JRUNfUkVfT0ZTVCAoMCkKLQotI2RlZmluZSBVQVJUX0lTUihCQVNFX0FERFIpIChVQVJUMDBfVFlQRSAoQkFTRV9BRERSICArIDB4MjAgKSkKLSNkZWZpbmUgVUFSVF9JU1JfTUlfTVNLICgweDgpCi0jZGVmaW5lIFVBUlRfSVNSX01JX09GU1QgKDMpCi0jZGVmaW5lIFVBUlRfSVNSX1RJSV9NU0sgKDB4NCkKLSNkZWZpbmUgVUFSVF9JU1JfVElJX09GU1QgKDIpCi0jZGVmaW5lIFVBUlRfSVNSX1RJX01TSyAoMHgyKQotI2RlZmluZSBVQVJUX0lTUl9USV9PRlNUICgxKQotI2RlZmluZSBVQVJUX0lTUl9SSV9NU0sgKDB4MSkKLSNkZWZpbmUgVUFSVF9JU1JfUklfT0ZTVCAoMCkKLQotI2RlZmluZSBVQVJUX0lJRChCQVNFX0FERFIpIChVQVJUMDBfVFlQRSAoQkFTRV9BRERSICArIDB4MjQgKSkKLSNkZWZpbmUgVUFSVF9JSURfSUlEX01TSyAoMHg3KQotI2RlZmluZSBVQVJUX0lJRF9JSURfT0ZTVCAoMCkKLQotI2RlZmluZSBVQVJUX01DKEJBU0VfQUREUikgKFVBUlQwMF9UWVBFIChCQVNFX0FERFIgICsgMHgyOCApKQotI2RlZmluZSBVQVJUX01DX09FX01TSyAoMHg0MCkKLSNkZWZpbmUgVUFSVF9NQ19PRV9PRlNUICg2KQotI2RlZmluZSBVQVJUX01DX1NQX01TSyAoMHgyMCkKLSNkZWZpbmUgVUFSVF9NQ19TUF9PRlNUICg1KQotI2RlZmluZSBVQVJUX01DX0VQX01TSyAoMHgxMCkKLSNkZWZpbmUgVUFSVF9NQ19FUF9PRlNUICg0KQotI2RlZmluZSBVQVJUX01DX1BFX01TSyAoMHgwOCkKLSNkZWZpbmUgVUFSVF9NQ19QRV9PRlNUICgzKQotI2RlZmluZSBVQVJUX01DX1NUX01TSyAoMHgwNCkKLSNkZWZpbmUgVUFSVF9NQ19TVF9PTkUgKDB4MCkKLSNkZWZpbmUgVUFSVF9NQ19TVF9UV08gKDB4MDQpCi0jZGVmaW5lIFVBUlRfTUNfU1RfT0ZTVCAoMikKLSNkZWZpbmUgVUFSVF9NQ19DTFNfTVNLICgweDAzKQotI2RlZmluZSBVQVJUX01DX0NMU19PRlNUICgwKQotI2RlZmluZSBVQVJUX01DX0NMU19DSEFSTEVOXzUgKDApCi0jZGVmaW5lIFVBUlRfTUNfQ0xTX0NIQVJMRU5fNiAoMSkKLSNkZWZpbmUgVUFSVF9NQ19DTFNfQ0hBUkxFTl83ICgyKQotI2RlZmluZSBVQVJUX01DX0NMU19DSEFSTEVOXzggKDMpCi0KLSNkZWZpbmUgVUFSVF9NQ1IoQkFTRV9BRERSKSAoVUFSVDAwX1RZUEUgKEJBU0VfQUREUiAgKyAweDJjICkpCi0jZGVmaW5lIFVBUlRfTUNSX0FDX01TSyAoMHg4MCkKLSNkZWZpbmUgVUFSVF9NQ1JfQUNfT0ZTVCAoNykKLSNkZWZpbmUgVUFSVF9NQ1JfQVJfTVNLICgweDQwKQotI2RlZmluZSBVQVJUX01DUl9BUl9PRlNUICg2KQotI2RlZmluZSBVQVJUX01DUl9CUl9NU0sgKDB4MjApCi0jZGVmaW5lIFVBUlRfTUNSX0JSX09GU1QgKDUpCi0jZGVmaW5lIFVBUlRfTUNSX0xCX01TSyAoMHgxMCkKLSNkZWZpbmUgVUFSVF9NQ1JfTEJfT0ZTVCAoNCkKLSNkZWZpbmUgVUFSVF9NQ1JfRENEX01TSyAoMHgwOCkKLSNkZWZpbmUgVUFSVF9NQ1JfRENEX09GU1QgKDMpCi0jZGVmaW5lIFVBUlRfTUNSX1JJX01TSyAoMHgwNCkKLSNkZWZpbmUgVUFSVF9NQ1JfUklfT0ZTVCAoMikKLSNkZWZpbmUgVUFSVF9NQ1JfRFRSX01TSyAoMHgwMikKLSNkZWZpbmUgVUFSVF9NQ1JfRFRSX09GU1QgKDEpCi0jZGVmaW5lIFVBUlRfTUNSX1JUU19NU0sgKDB4MDEpCi0jZGVmaW5lIFVBUlRfTUNSX1JUU19PRlNUICgwKQotCi0jZGVmaW5lIFVBUlRfTVNSKEJBU0VfQUREUikgKFVBUlQwMF9UWVBFIChCQVNFX0FERFIgICsgMHgzMCApKQotI2RlZmluZSBVQVJUX01TUl9EQ0RfTVNLICgweDgwKQotI2RlZmluZSBVQVJUX01TUl9EQ0RfT0ZTVCAoNykKLSNkZWZpbmUgVUFSVF9NU1JfUklfTVNLICgweDQwKQotI2RlZmluZSBVQVJUX01TUl9SSV9PRlNUICg2KQotI2RlZmluZSBVQVJUX01TUl9EU1JfTVNLICgweDIwKQotI2RlZmluZSBVQVJUX01TUl9EU1JfT0ZTVCAoNSkKLSNkZWZpbmUgVUFSVF9NU1JfQ1RTX01TSyAoMHgxMCkKLSNkZWZpbmUgVUFSVF9NU1JfQ1RTX09GU1QgKDQpCi0jZGVmaW5lIFVBUlRfTVNSX0REQ0RfTVNLICgweDA4KQotI2RlZmluZSBVQVJUX01TUl9ERENEX09GU1QgKDMpCi0jZGVmaW5lIFVBUlRfTVNSX1RFUklfTVNLICgweDA0KQotI2RlZmluZSBVQVJUX01TUl9URVJJX09GU1QgKDIpCi0jZGVmaW5lIFVBUlRfTVNSX0REU1JfTVNLICgweDAyKQotI2RlZmluZSBVQVJUX01TUl9ERFNSX09GU1QgKDEpCi0jZGVmaW5lIFVBUlRfTVNSX0RDVFNfTVNLICgweDAxKQotI2RlZmluZSBVQVJUX01TUl9EQ1RTX09GU1QgKDApCi0KLSNkZWZpbmUgVUFSVF9ESVZfTE8oQkFTRV9BRERSKSAoVUFSVDAwX1RZUEUgKEJBU0VfQUREUiAgKyAweDM0ICkpCi0jZGVmaW5lIFVBUlRfRElWX0xPX0RJVl9NU0sgKDB4ZmYpCi0jZGVmaW5lIFVBUlRfRElWX0xPX0RJVl9PRlNUICgwKQotCi0jZGVmaW5lIFVBUlRfRElWX0hJKEJBU0VfQUREUikgKFVBUlQwMF9UWVBFIChCQVNFX0FERFIgICsgMHgzOCApKQotI2RlZmluZSBVQVJUX0RJVl9ISV9ESVZfTVNLICgweGZmKQotI2RlZmluZSBVQVJUX0RJVl9ISV9ESVZfT0ZTVCAoMCkKLQotI2VuZGlmIC8qIF9fVUFSVDAwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL3VuY29tcHJlc3MuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL3VuY29tcHJlc3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmZTBlNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcHhhMTBkYi91bmNvbXByZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL3VuY29tcHJlc3MuaAotICoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTkgQVJNIExpbWl0ZWQKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDEgQWx0ZXJhIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0jaW5jbHVkZSAiYXNtL2FyY2gvcGxhdGZvcm0uaCIKLSNpbmNsdWRlICJhc20vaGFyZHdhcmUuaCIKLSNkZWZpbmUgVUFSVDAwX1RZUEUgKHZvbGF0aWxlIHVuc2lnbmVkIGludCopCi0jaW5jbHVkZSAiYXNtL2FyY2gvdWFydDAwLmgiCi0KLS8qCi0gKiBUaGlzIGRvZXMgbm90IGFwcGVuZCBhIG5ld2xpbmUKLSAqLwotc3RhdGljIHZvaWQgcHV0c3RyKGNvbnN0IGNoYXIgKnMpCi17Ci0Jd2hpbGUgKCpzKSB7Ci0JCXdoaWxlICgoKlVBUlRfVFNSKEVYQ19VQVJUMDBfQkFTRSkgJgotCQkgICAgICAgVUFSVF9UU1JfVFhfTEVWRUxfTVNLKT09MTUpCi0JCQliYXJyaWVyKCk7Ci0KLQkJKlVBUlRfVEQoRVhDX1VBUlQwMF9CQVNFKSA9ICpzOwotCi0JCWlmICgqcyA9PSAnXG4nKSB7Ci0JCQl3aGlsZSAoKCpVQVJUX1RTUihFWENfVUFSVDAwX0JBU0UpICYKLQkJCSAgICAgICBVQVJUX1RTUl9UWF9MRVZFTF9NU0spPT0xNSkKLQkJCQliYXJyaWVyKCk7Ci0KLQkJCSpVQVJUX1REKEVYQ19VQVJUMDBfQkFTRSkgPSAnXHInOwotCQl9Ci0JCXMrKzsKLQl9Ci19Ci0KLS8qCi0gKiBub3RoaW5nIHRvIGRvCi0gKi8KLSNkZWZpbmUgYXJjaF9kZWNvbXBfc2V0dXAoKQotCi0jZGVmaW5lIGFyY2hfZGVjb21wX3dkb2coKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvdm1hbGxvYy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvdm1hbGxvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDZmYjdkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVweGExMGRiL3ZtYWxsb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qCi0gKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXB4YTEwZGIvdm1hbGxvYy5oCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMCBSdXNzZWxsIEtpbmcuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0jZGVmaW5lIFZNQUxMT0NfRU5EICAgICAgIChQQUdFX09GRlNFVCArIDB4MTAwMDAwMDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pbXgvZG1hLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pbXgvZG1hLmgKaW5kZXggZGJkYzAxNy4uYjQ1ZmEzNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW14L2RtYS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlteC9kbWEuaApAQCAtMjAsMTAgKzIwLDYgQEAKICNpZm5kZWYgX19BU01fQVJDSF9ETUFfSAogI2RlZmluZSBfX0FTTV9BUkNIX0RNQV9ICiAKLSNkZWZpbmUgTUFYX0RNQV9BRERSRVNTCQkweGZmZmZmZmZmCi0KLSNkZWZpbmUgTUFYX0RNQV9DSEFOTkVMUwkwCi0KIC8qCiAgKiBETUEgcmVnaXN0cmF0aW9uCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlteC9lbnRyeS1tYWNyby5TIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW14L2VudHJ5LW1hY3JvLlMKaW5kZXggYjQwZWE3Yy4uM2I5ZWY2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW14L2VudHJ5LW1hY3JvLlMKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW14L2VudHJ5LW1hY3JvLlMKQEAgLTcsNiArNyw4IEBACiAgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKICAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorCiAJCS5tYWNybwlkaXNhYmxlX2ZpcQogCQkuZW5kbQogI2RlZmluZSBBSVRDX05JVkVDU1IgICAweDQwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pbnRlZ3JhdG9yL2RlYnVnLW1hY3JvLlMgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pbnRlZ3JhdG9yL2RlYnVnLW1hY3JvLlMKaW5kZXggNDg0YTFhYS4uMDMxZDMwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW50ZWdyYXRvci9kZWJ1Zy1tYWNyby5TCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWludGVncmF0b3IvZGVidWctbWFjcm8uUwpAQCAtMTEsNyArMTEsNyBAQAogICoKICovCiAKLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYW1iYV9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL3NlcmlhbC5oPgogCiAJCS5tYWNybwlhZGRydWFydCxyeAogCQltcmMJcDE1LCAwLCBccngsIGMxLCBjMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW50ZWdyYXRvci9kbWEuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWludGVncmF0b3IvZG1hLmgKaW5kZXggNzE3MTc5Mi4uODNmZDZiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW50ZWdyYXRvci9kbWEuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pbnRlZ3JhdG9yL2RtYS5oCkBAIC0xNywxMiArMTcsMyBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwotI2lmbmRlZiBfX0FTTV9BUkNIX0RNQV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfRE1BX0gKLQotI2RlZmluZSBNQVhfRE1BX0FERFJFU1MJCTB4ZmZmZmZmZmYKLQotI2RlZmluZSBNQVhfRE1BX0NIQU5ORUxTCTAKLQotI2VuZGlmIC8qIF9BU01fQVJDSF9ETUFfSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pbnRlZ3JhdG9yL2VudHJ5LW1hY3JvLlMgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pbnRlZ3JhdG9yL2VudHJ5LW1hY3JvLlMKaW5kZXggNDRmN2VlNi4uNjk4MzhkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW50ZWdyYXRvci9lbnRyeS1tYWNyby5TCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWludGVncmF0b3IvZW50cnktbWFjcm8uUwpAQCAtNyw2ICs3LDggQEAKICAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQogICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICovCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgogCiAgCQkubWFjcm8JZGlzYWJsZV9maXEKIAkJLmVuZG0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDN4eC9kbWEuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDN4eC9kbWEuaAppbmRleCA3OTdmOWU2Li4xZTgwOGRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pb3AzeHgvZG1hLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wM3h4L2RtYS5oCkBAIC03LDEwICs3LDMgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotCi0jaWZuZGVmIF9JT1AzWFhfRE1BX0hfUAotI2RlZmluZSBfSU9QM1hYX0RNQV9IX1AKLQotI2RlZmluZSBNQVhfRE1BX0FERFJFU1MJCTB4ZmZmZmZmZmYKLQotI2VuZGlmIC8qIF9BU01fQVJDSF9ETUFfSF9QICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pb3AzeHgvZW50cnktbWFjcm8uUyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDN4eC9lbnRyeS1tYWNyby5TCmluZGV4IGUyY2U3ZjUuLjkyNjY2OGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDN4eC9lbnRyeS1tYWNyby5TCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDN4eC9lbnRyeS1tYWNyby5TCkBAIC03LDYgKzcsNyBAQAogICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KKyNpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+CiAKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX0lPUDMyMSkKIAkJLm1hY3JvICBkaXNhYmxlX2ZpcQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9kbWEuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvZG1hLmgKaW5kZXggMGZiMzU2OC4uNTQ4ZDhkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9kbWEuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL2RtYS5oCkBAIC03LDEyICs3LDMgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotI2lmbmRlZiBfX0FTTV9BUkNIX0RNQV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfRE1BX0gKLQotI2RlZmluZSBNQVhfRE1BX0FERFJFU1MJCTB4ZmZmZmZmZmYKLQotLyogTm8gRE1BICovCi0jZGVmaW5lIE1BWF9ETUFfQ0hBTk5FTFMJMAotCi0jZW5kaWYgLyogX0FTTV9BUkNIX0RNQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL2VucDI2MTEuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvZW5wMjYxMS5oCmluZGV4IDk1MTI4ZDkuLjQyZjNjMjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvZW5wMjYxMS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvZW5wMjYxMS5oCkBAIC0zNiw1ICszNiwxMSBAQAogI2RlZmluZSBFTlAyNjExX0dQSU9fU0NMCQk3CiAjZGVmaW5lIEVOUDI2MTFfR1BJT19TREEJCTYKIAorI2RlZmluZSBJUlFfRU5QMjYxMV9USEVSTUFMCQlJUlFfSVhQMjAwMF9HUElPNAorI2RlZmluZSBJUlFfRU5QMjYxMV9PUFRJT05fQk9BUkQJSVJRX0lYUDIwMDBfR1BJTzMKKyNkZWZpbmUgSVJRX0VOUDI2MTFfQ0FMRUIJCUlSUV9JWFAyMDAwX0dQSU8yCisjZGVmaW5lIElSUV9FTlAyNjExX1BNMzM4Nl8xCQlJUlFfSVhQMjAwMF9HUElPMQorI2RlZmluZSBJUlFfRU5QMjYxMV9QTTMzODZfMAkJSVJRX0lYUDIwMDBfR1BJTzAKKwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvZW50cnktbWFjcm8uUyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvZW50cnktbWFjcm8uUwppbmRleCBlM2E0ZTQxLi4xNmUxZTYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL2VudHJ5LW1hY3JvLlMKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9lbnRyeS1tYWNyby5TCkBAIC03LDYgKzcsNyBAQAogICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KKyNpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+CiAKIAkJLm1hY3JvICBkaXNhYmxlX2ZpcQogCQkuZW5kbQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9pby5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9pby5oCmluZGV4IDdmYmNkZjkuLmMwZmYyYzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL2lvLmgKQEAgLTEzMSwxMDIgKzEzMSw0IEBACiAjZW5kaWYKIAogCi0jaWZkZWYgQ09ORklHX0FSQ0hfSVhEUDJYMDEKLS8qCi0gKiBUaGlzIGlzIGFuIHVnbHkgaGFjayBidXQgdGhlIENTODkwMCBvbiB0aGUgMngwMSdzIGRvZXMgbm90IHNpdCBpbiBhbnkgc29ydAotICogb2YgIkkvTyBzcGFjZSIgYW5kIGlzIGp1c3QgZGlyZWN0IG1hcHBlZCBpbnRvIGEgMzItYml0LW9ubHkgYWRkcmVzc2FibGUKLSAqIGJ1cy4gVGhlIGFkZHJlc3Mgc3BhY2UgZm9yIHRoaXMgYnVzIGlzIHN1Y2ggdGhhdCB3ZSBjYW4ndCByZWFsbHkgZWFzaWx5Ci0gKiBtYWtlIGl0IGNvbnRpZ3VvdXMgdG8gdGhlIFBDSSBJL08gYWRkcmVzcyByYW5nZSwgYW5kIGl0IGFsc28gZG9lcyBub3QKLSAqIG5lZWQgc3dhcHBpbmcgbGlrZSBQQ0kgYWRkcmVzc2VzIGRvIChJWERQMngwMSBpcyBhIEJFIHBsYXRmb3JtKS4KLSAqIEIvQyBvZiB0aGlzIHdlIGNhbid0IHVzZSB0aGUgc3RhbmRhcmQgaW4vb3V0IGZ1bmN0aW9ucyBhbmQgbmVlZCB0bwotICogcnVudGltZSBjaGVjayBpZiB0aGUgaW5jb21pbmcgYWRkcmVzcyBpcyBhIFBDSSBhZGRyZXNzIG9yIGZvcgotICogdGhlIENTODl4MC4KLSAqLwotI3VuZGVmIGludwotI3VuZGVmIG91dHcKLSN1bmRlZiBpbnN3Ci0jdW5kZWYgb3V0c3cKLQotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpbnN3KHUzMiBwdHIsIHZvaWQgKmJ1ZiwgaW50IGxlbmd0aCkKLXsKLQlyZWdpc3RlciB2b2xhdGlsZSB1MzIgKnBvcnQgPSAodm9sYXRpbGUgdTMyICopcHRyOwotCi0JLyoKLQkgKiBJcyB0aGlzIGN5Y2xlIG1lYW50IGZvciB0aGUgQ1M4OTAwPwotCSAqLwotCWlmICgobWFjaGluZV9pc19peGRwMjQwMSgpIHx8IG1hY2hpbmVfaXNfaXhkcDI4MDEoKSkgJiYgCi0JCSgoKHUzMilwb3J0ID49ICh1MzIpSVhEUDJYMDFfQ1M4OTAwX1ZJUlRfQkFTRSkgJiYKLQkJICgodTMyKXBvcnQgPD0gKHUzMilJWERQMlgwMV9DUzg5MDBfVklSVF9FTkQpKSkgewotCQl1OCAqYnVmOCA9ICh1OCopYnVmOwotCQlyZWdpc3RlciB1MzIgdG1wMzI7Ci0KLQkJZG8gewotCQkJdG1wMzIgPSAqcG9ydDsKLQkJCSpidWY4KysgPSAodTgpdG1wMzI7Ci0JCQkqYnVmOCsrID0gKHU4KSh0bXAzMiA+PiA4KTsKLQkJfSB3aGlsZSgtLWxlbmd0aCk7Ci0KLQkJcmV0dXJuOwotCX0KLQotCV9fcmF3X3JlYWRzdyhhbGlnbncoX19faW8ocHRyKSksYnVmLGxlbmd0aCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvdXRzdyh1MzIgcHRyLCB2b2lkICpidWYsIGludCBsZW5ndGgpCi17Ci0JcmVnaXN0ZXIgdm9sYXRpbGUgdTMyICpwb3J0ID0gKHZvbGF0aWxlIHUzMiAqKXB0cjsKLQotCS8qCi0JICogSXMgdGhpcyBjeWNsZSBtZWFudCBmb3IgdGhlIENTODkwMD8KLQkgKi8KLQlpZiAoKG1hY2hpbmVfaXNfaXhkcDI0MDEoKSB8fCBtYWNoaW5lX2lzX2l4ZHAyODAxKCkpICYmIAotCQkoKCh1MzIpcG9ydCA+PSAodTMyKUlYRFAyWDAxX0NTODkwMF9WSVJUX0JBU0UpICYmCi0JCSAoKHUzMilwb3J0IDw9ICh1MzIpSVhEUDJYMDFfQ1M4OTAwX1ZJUlRfRU5EKSkpIHsKLQkJcmVnaXN0ZXIgdTMyIHRtcDMyOwotCQl1OCAqYnVmOCA9ICh1OCopYnVmOwotCQlkbyB7Ci0JCQl0bXAzMiA9ICpidWY4Kys7Ci0JCQl0bXAzMiB8PSAoKmJ1ZjgrKykgPDwgODsKLQkJCSpwb3J0ID0gdG1wMzI7Ci0JCX0gd2hpbGUoLS1sZW5ndGgpOwotCQlyZXR1cm47Ci0JfQotCi0JX19yYXdfd3JpdGVzdyhhbGlnbncoX19faW8ocHRyKSksYnVmLGxlbmd0aCk7Ci19Ci0KLQotc3RhdGljIGlubGluZSB1MTYgaW53KHUzMiBwdHIpCi17Ci0JcmVnaXN0ZXIgdm9sYXRpbGUgdTMyICpwb3J0ID0gKHZvbGF0aWxlIHUzMiAqKXB0cjsKLQotCS8qCi0JICogSXMgdGhpcyBjeWNsZSBtZWFudCBmb3IgdGhlIENTODkwMD8KLQkgKi8KLQlpZiAoKG1hY2hpbmVfaXNfaXhkcDI0MDEoKSB8fCBtYWNoaW5lX2lzX2l4ZHAyODAxKCkpICYmIAotCQkoKCh1MzIpcG9ydCA+PSAodTMyKUlYRFAyWDAxX0NTODkwMF9WSVJUX0JBU0UpICYmCi0JCSAoKHUzMilwb3J0IDw9ICh1MzIpSVhEUDJYMDFfQ1M4OTAwX1ZJUlRfRU5EKSkpIHsKLQkJcmV0dXJuICh1MTYpKCpwb3J0KTsgIAotCX0KLQotCXJldHVybiBfX3Jhd19yZWFkdyhhbGlnbncoX19faW8ocHRyKSkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgb3V0dyh1MTYgdmFsdWUsIHUzMiBwdHIpCi17Ci0JcmVnaXN0ZXIgdm9sYXRpbGUgdTMyICpwb3J0ID0gKHZvbGF0aWxlIHUzMiAqKXB0cjsKLQotCWlmICgobWFjaGluZV9pc19peGRwMjQwMSgpIHx8IG1hY2hpbmVfaXNfaXhkcDI4MDEoKSkgJiYgCi0JCSgoKHUzMilwb3J0ID49ICh1MzIpSVhEUDJYMDFfQ1M4OTAwX1ZJUlRfQkFTRSkgJiYKLQkJICgodTMyKXBvcnQgPD0gKHUzMilJWERQMlgwMV9DUzg5MDBfVklSVF9FTkQpKSkgewotCQkqcG9ydCA9IHZhbHVlOyAgCi0JCXJldHVybjsKLQl9Ci0KLQlfX3Jhd193cml0ZXcoKHZhbHVlKSxhbGlnbncoX19faW8ocHRyKSkpOwotfQotI2VuZGlmCS8qIElYRFAyeDAxICovCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9peHAyMDAwLXJlZ3MuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvaXhwMjAwMC1yZWdzLmgKaW5kZXggZmM1YWM2YS4uMmI1N2Y5MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9peHAyMDAwLXJlZ3MuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL2l4cDIwMDAtcmVncy5oCkBAIC0yNiw2ICsyNiw4IEBACiAgKiBmYzAwMDAwMAlkYTAwMDAwMAkxNk0JCVBDSSBDRkcwCiAgKiBmZDAwMDAwMAlkODAwMDAwMAkxNk0JCVBDSSBJL08KICAqIGZlWzAtN10wMDAwMAkJCThNCQlwZXItcGxhdGZvcm0gbWFwcGluZ3MKKyAqIGZlOTAwMDAwCTgwMDAwMDAwCTFNCQlTUkFNICMwIChmaXJzdCBNQikKKyAqIGZlYTAwMDAwCWNiNDAwMDAwCTFNCQlTQ1JBVENIIHJpbmcgZ2V0L3B1dAogICogZmViMDAwMDAJYzgwMDAwMDAJMU0JCU1TRgogICogZmVjMDAwMDAJZGYwMDAwMDAJMU0JCVBDSSBDU1JzCiAgKiBmZWQwMDAwMAlkZTAwMDAwMAkxTQkJUENJIENSRUcKQEAgLTkxLDYgKzkzLDE0IEBACiAjZGVmaW5lIElYUDIwMDBfTVNGX1ZJUlRfQkFTRQkJMHhmZWIwMDAwMAogI2RlZmluZSBJWFAyMDAwX01TRl9TSVpFCQkweDAwMTAwMDAwCiAKKyNkZWZpbmUgSVhQMjAwMF9TQ1JBVENIX1JJTkdfUEhZU19CQVNFCTB4Y2I0MDAwMDAKKyNkZWZpbmUgSVhQMjAwMF9TQ1JBVENIX1JJTkdfVklSVF9CQVNFCTB4ZmVhMDAwMDAKKyNkZWZpbmUgSVhQMjAwMF9TQ1JBVENIX1JJTkdfU0laRQkweDAwMTAwMDAwCisKKyNkZWZpbmUgSVhQMjAwMF9TUkFNMF9QSFlTX0JBU0UJCTB4ODAwMDAwMDAKKyNkZWZpbmUgSVhQMjAwMF9TUkFNMF9WSVJUX0JBU0UJCTB4ZmU5MDAwMDAKKyNkZWZpbmUgSVhQMjAwMF9TUkFNMF9TSVpFCQkweDAwMTAwMDAwCisKICNkZWZpbmUgSVhQMjAwMF9QQ0lfSU9fUEhZU19CQVNFCTB4ZDgwMDAwMDAKICNkZWZpbmUJSVhQMjAwMF9QQ0lfSU9fVklSVF9CQVNFCTB4ZmQwMDAwMDAKICNkZWZpbmUgSVhQMjAwMF9QQ0lfSU9fU0laRSAgICAgCTB4MDEwMDAwMDAKQEAgLTE1Niw2ICsxNjYsMTQgQEAKICNkZWZpbmUgSVhQMjAwMF9JUlFfVEhEX1JBV19TVEFUVVNfQl8xCUlYUDIwMDBfSU5UQ1RMX1JFRygweDg0KQogI2RlZmluZSBJWFAyMDAwX0lSUV9USERfUkFXX1NUQVRVU19CXzIJSVhQMjAwMF9JTlRDVExfUkVHKDB4ODgpCiAjZGVmaW5lIElYUDIwMDBfSVJRX1RIRF9SQVdfU1RBVFVTX0JfMwlJWFAyMDAwX0lOVENUTF9SRUcoMHg4YykKKyNkZWZpbmUgSVhQMjAwMF9JUlFfVEhEX1NUQVRVU19BXzAJSVhQMjAwMF9JTlRDVExfUkVHKDB4ZTApCisjZGVmaW5lIElYUDIwMDBfSVJRX1RIRF9TVEFUVVNfQV8xCUlYUDIwMDBfSU5UQ1RMX1JFRygweGU0KQorI2RlZmluZSBJWFAyMDAwX0lSUV9USERfU1RBVFVTX0FfMglJWFAyMDAwX0lOVENUTF9SRUcoMHhlOCkKKyNkZWZpbmUgSVhQMjAwMF9JUlFfVEhEX1NUQVRVU19BXzMJSVhQMjAwMF9JTlRDVExfUkVHKDB4ZWMpCisjZGVmaW5lIElYUDIwMDBfSVJRX1RIRF9TVEFUVVNfQl8wCUlYUDIwMDBfSU5UQ1RMX1JFRygweDEwMCkKKyNkZWZpbmUgSVhQMjAwMF9JUlFfVEhEX1NUQVRVU19CXzEJSVhQMjAwMF9JTlRDVExfUkVHKDB4MTA0KQorI2RlZmluZSBJWFAyMDAwX0lSUV9USERfU1RBVFVTX0JfMglJWFAyMDAwX0lOVENUTF9SRUcoMHgxMDgpCisjZGVmaW5lIElYUDIwMDBfSVJRX1RIRF9TVEFUVVNfQl8zCUlYUDIwMDBfSU5UQ1RMX1JFRygweDEwYykKICNkZWZpbmUgSVhQMjAwMF9JUlFfVEhEX0VOQUJMRV9TRVRfQV8wCUlYUDIwMDBfSU5UQ1RMX1JFRygweDE2MCkKICNkZWZpbmUgSVhQMjAwMF9JUlFfVEhEX0VOQUJMRV9TRVRfQV8xCUlYUDIwMDBfSU5UQ1RMX1JFRygweDE2NCkKICNkZWZpbmUgSVhQMjAwMF9JUlFfVEhEX0VOQUJMRV9TRVRfQV8yCUlYUDIwMDBfSU5UQ1RMX1JFRygweDE2OCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9jb3lvdGUuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9jb3lvdGUuaAppbmRleCBkZDBjMmQyLi43YWM5YmEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvY295b3RlLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L2NveW90ZS5oCkBAIC0xNiw5ICsxNiw2IEBACiAjZXJyb3IgIkRvIG5vdCBpbmNsdWRlIHRoaXMgZGlyZWN0bHksIGluc3RlYWQgI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPiIKICNlbmRpZgogCi0jZGVmaW5lCUNPWU9URV9GTEFTSF9CQVNFCUlYUDRYWF9FWFBfQlVTX0NTMF9CQVNFX1BIWVMKLSNkZWZpbmUJQ09ZT1RFX0ZMQVNIX1NJWkUJSVhQNFhYX0VYUF9CVVNfQ1NYX1JFR0lPTl9TSVpFICogMgotCiAvKiBQQ0kgY29udHJvbGxlciBHUElPIHRvIElSUSBwaW4gbWFwcGluZ3MgKi8KICNkZWZpbmUJQ09ZT1RFX1BDSV9TTE9UMF9QSU4JNgogI2RlZmluZQlDT1lPVEVfUENJX1NMT1QxX1BJTgkxMQpAQCAtMjYsNyArMjMsNyBAQAogI2RlZmluZQlDT1lPVEVfUENJX1NMT1QwX0RFVklECTE0CiAjZGVmaW5lCUNPWU9URV9QQ0lfU0xPVDFfREVWSUQJMTUKIAotI2RlZmluZQlDT1lPVEVfSURFX0JBU0VfUEhZUwlJWFA0WFhfRVhQX0JVU19DUzNfQkFTRV9QSFlTCisjZGVmaW5lCUNPWU9URV9JREVfQkFTRV9QSFlTCUlYUDRYWF9FWFBfQlVTX0JBU0UoMykKICNkZWZpbmUJQ09ZT1RFX0lERV9CQVNFX1ZJUlQJMHhGRkZFMTAwMAogI2RlZmluZQlDT1lPVEVfSURFX1JFR0lPTl9TSVpFCTB4MTAwMAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvZG1hLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvZG1hLmgKaW5kZXggMzEyMDY1ZC4uYjFhMDcxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L2RtYS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9kbWEuaApAQCAtMjAsNyArMjAsNCBAQAogCiAjZGVmaW5lIE1BWF9ETUFfQUREUkVTUwkJKFBBR0VfT0ZGU0VUICsgU1pfNjRNKQogCi0vKiBObyBETUEgKi8KLSNkZWZpbmUgTUFYX0RNQV9DSEFOTkVMUwkwCi0KICNlbmRpZiAvKiBfQVNNX0FSQ0hfRE1BX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9lbnRyeS1tYWNyby5TIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L2VudHJ5LW1hY3JvLlMKaW5kZXggMzIzYjBiYy4uMjdlMTI0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L2VudHJ5LW1hY3JvLlMKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L2VudHJ5LW1hY3JvLlMKQEAgLTcsNiArNyw3IEBACiAgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKICAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogCiAJCS5tYWNybwlkaXNhYmxlX2ZpcQogCQkuZW5kbQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L2d0d3g1NzE1LmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvZ3R3eDU3MTUuaAppbmRleCBmYzQ2MGFmNy4uYzMwNjlkNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L2d0d3g1NzE1LmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L2d0d3g1NzE1LmgKQEAgLTU3LDEwICs1Nyw2IEBACiAjZGVmaW5lIEdUV1g1NzE1X0dQSU8xM19JUlEJCUlSUV9JWFA0WFhfU1dfSU5UMQogI2RlZmluZSBHVFdYNTcxNV9HUElPMTRfSVJRCQlJUlFfSVhQNFhYX1NXX0lOVDIKIAotCi0jZGVmaW5lCUdUV1g1NzE1X0ZMQVNIX0JBU0UJSVhQNFhYX0VYUF9CVVNfQ1MwX0JBU0VfUEhZUwotI2RlZmluZQlHVFdYNTcxNV9GTEFTSF9TSVpFCSgweDAwODAwMDAwKQotCiAvKiBQQ0kgY29udHJvbGxlciBHUElPIHRvIElSUSBwaW4gbWFwcGluZ3MKIAogCQkJSU5UQQlJTlRCCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvaGFyZHdhcmUuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9oYXJkd2FyZS5oCmluZGV4IGNmYjQxM2MuLjZhY2I2OWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9oYXJkd2FyZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9oYXJkd2FyZS5oCkBAIC00NSw1ICs0NSw2IEBACiAjaW5jbHVkZSAiY295b3RlLmgiCiAjaW5jbHVkZSAicHJwbWMxMTAwLmgiCiAjaW5jbHVkZSAibnNsdTIuaCIKKyNpbmNsdWRlICJuYXMxMDBkLmgiCiAKICNlbmRpZiAgLyogX0FTTV9BUkNIX0hBUkRXQVJFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9pcnFzLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvaXJxcy5oCmluZGV4IDJjZjQ5MzAuLmYyNGI3NjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9pcnFzLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L2lycXMuaApAQCAtMTAwLDQgKzEwMCwxMyBAQAogI2RlZmluZSAgICAgICAgSVJRX05TTFUyX1BDSV9JTlRCICAgICAgSVJRX0lYUDRYWF9HUElPMTAKICNkZWZpbmUgICAgICAgIElSUV9OU0xVMl9QQ0lfSU5UQyAgICAgIElSUV9JWFA0WFhfR1BJTzkKIAorLyoKKyAqIE5BUzEwMEQgYm9hcmQgSVJRcworICovCisjZGVmaW5lICAgICAgICBJUlFfTkFTMTAwRF9QQ0lfSU5UQSAgICBJUlFfSVhQNFhYX0dQSU8xMQorI2RlZmluZSAgICAgICAgSVJRX05BUzEwMERfUENJX0lOVEIgICAgSVJRX0lYUDRYWF9HUElPMTAKKyNkZWZpbmUgICAgICAgIElSUV9OQVMxMDBEX1BDSV9JTlRDICAgIElSUV9JWFA0WFhfR1BJTzkKKyNkZWZpbmUgICAgICAgIElSUV9OQVMxMDBEX1BDSV9JTlREICAgIElSUV9JWFA0WFhfR1BJTzgKKyNkZWZpbmUgICAgICAgIElSUV9OQVMxMDBEX1BDSV9JTlRFICAgIElSUV9JWFA0WFhfR1BJTzcKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvaXhkcDQyNS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L2l4ZHA0MjUuaAppbmRleCA3ZDIxYmY5Li4zZDM4MjBkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvaXhkcDQyNS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9peGRwNDI1LmgKQEAgLTE2LDkgKzE2LDYgQEAKICNlcnJvciAiRG8gbm90IGluY2x1ZGUgdGhpcyBkaXJlY3RseSwgaW5zdGVhZCAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+IgogI2VuZGlmCiAKLSNkZWZpbmUJSVhEUDQyNV9GTEFTSF9CQVNFCUlYUDRYWF9FWFBfQlVTX0NTMF9CQVNFX1BIWVMKLSNkZWZpbmUJSVhEUDQyNV9GTEFTSF9TSVpFCUlYUDRYWF9FWFBfQlVTX0NTWF9SRUdJT05fU0laRQotCiAjZGVmaW5lCUlYRFA0MjVfU0RBX1BJTgkJNwogI2RlZmluZQlJWERQNDI1X1NDTF9QSU4JCTYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L21lbW9yeS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L21lbW9yeS5oCmluZGV4IGUwMjRkMGEuLmVlMjExZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9tZW1vcnkuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvbWVtb3J5LmgKQEAgLTE2LDMxICsxNiwxMCBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCi0vKgotICogT25seSBmaXJzdCA2NE1CIG9mIG1lbW9yeSBjYW4gYmUgYWNjZXNzZWQgdmlhIFBDSS4KLSAqIFdlIHVzZSBHRlBfRE1BIHRvIGFsbG9jYXRlIHNhZmUgYnVmZmVycyB0byBkbyBtYXAvdW5tYXAuCi0gKiBUaGlzIGlzIHJlYWxseSB1Z2x5IGFuZCB3ZSBuZWVkIGEgYmV0dGVyIHdheSBvZiBzcGVjaWZ5aW5nCi0gKiBETUEtY2FwYWJsZSByZWdpb25zIG9mIG1lbW9yeS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fYXJjaF9hZGp1c3Rfem9uZXMoaW50IG5vZGUsIHVuc2lnbmVkIGxvbmcgKnpvbmVfc2l6ZSwgCi0JdW5zaWduZWQgbG9uZyAqemhvbGVfc2l6ZSkgCi17Ci0JdW5zaWduZWQgaW50IHN6ID0gU1pfNjRNID4+IFBBR0VfU0hJRlQ7Ci0KLQkvKgotCSAqIE9ubHkgYWRqdXN0IGlmID4gNjRNIG9uIGN1cnJlbnQgc3lzdGVtCi0JICovCi0JaWYgKG5vZGUgfHwgKHpvbmVfc2l6ZVswXSA8PSBzeikpCi0JCXJldHVybjsKLQotCXpvbmVfc2l6ZVsxXSA9IHpvbmVfc2l6ZVswXSAtIHN6OwotCXpvbmVfc2l6ZVswXSA9IHN6OwotCXpob2xlX3NpemVbMV0gPSB6aG9sZV9zaXplWzBdOwotCXpob2xlX3NpemVbMF0gPSAwOwotfQordm9pZCBpeHA0eHhfYWRqdXN0X3pvbmVzKGludCBub2RlLCB1bnNpZ25lZCBsb25nICpzaXplLCB1bnNpZ25lZCBsb25nICpob2xlcyk7CiAKICNkZWZpbmUgYXJjaF9hZGp1c3Rfem9uZXMobm9kZSwgc2l6ZSwgaG9sZXMpIFwKLQlfX2FyY2hfYWRqdXN0X3pvbmVzKG5vZGUsIHNpemUsIGhvbGVzKQorCWl4cDR4eF9hZGp1c3Rfem9uZXMobm9kZSwgc2l6ZSwgaG9sZXMpCiAKICNkZWZpbmUgSVNBX0RNQV9USFJFU0hPTEQgKFNaXzY0TSAtIDEpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9uYXMxMDBkLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvbmFzMTAwZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYWMwMTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvbmFzMTAwZC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvbmFzMTAwZC5oCisgKgorICogTkFTMTAwRCBwbGF0Zm9ybSBzcGVjaWZpYyBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBUb3dlciBUZWNobm9sb2dpZXMKKyAqCisgKiBBdXRob3I6IEFsZXNzYW5kcm8gWnVtbW8gPGEuenVtbW9AdG93ZXJ0ZWNoLml0PgorICoKKyAqIGJhc2VkIG9uIGl4ZHA0MjUuaDoKKyAqCUNvcHlyaWdodCAyMDA0IChjKSBNb250YVZpc3RhLCBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpZm5kZWYgX19BU01fQVJDSF9IQVJEV0FSRV9IX18KKyNlcnJvciAiRG8gbm90IGluY2x1ZGUgdGhpcyBkaXJlY3RseSwgaW5zdGVhZCAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+IgorI2VuZGlmCisKKyNkZWZpbmUgTkFTMTAwRF9TREFfUElOCQk2CisjZGVmaW5lIE5BUzEwMERfU0NMX1BJTgkJNQorCisvKgorICogTkFTMTAwRCBQQ0kgSVJRcworICovCisjZGVmaW5lIE5BUzEwMERfUENJX01BWF9ERVYJMworI2RlZmluZSBOQVMxMDBEX1BDSV9JUlFfTElORVMJMworCisKKy8qIFBDSSBjb250cm9sbGVyIEdQSU8gdG8gSVJRIHBpbiBtYXBwaW5ncyAqLworI2RlZmluZSBOQVMxMDBEX1BDSV9JTlRBX1BJTgkxMQorI2RlZmluZSBOQVMxMDBEX1BDSV9JTlRCX1BJTgkxMAorI2RlZmluZSBOQVMxMDBEX1BDSV9JTlRDX1BJTgk5CisjZGVmaW5lIE5BUzEwMERfUENJX0lOVERfUElOCTgKKyNkZWZpbmUgTkFTMTAwRF9QQ0lfSU5URV9QSU4JNworCisvKiBHUElPICovCisKKyNkZWZpbmUgTkFTMTAwRF9HUElPMCAgICAgICAgICAgMAorI2RlZmluZSBOQVMxMDBEX0dQSU8xICAgICAgICAgICAxCisjZGVmaW5lIE5BUzEwMERfR1BJTzIgICAgICAgICAgIDIKKyNkZWZpbmUgTkFTMTAwRF9HUElPMyAgICAgICAgICAgMworI2RlZmluZSBOQVMxMDBEX0dQSU80ICAgICAgICAgICA0CisjZGVmaW5lIE5BUzEwMERfR1BJTzUgICAgICAgICAgIDUKKyNkZWZpbmUgTkFTMTAwRF9HUElPNiAgICAgICAgICAgNgorI2RlZmluZSBOQVMxMDBEX0dQSU83ICAgICAgICAgICA3CisjZGVmaW5lIE5BUzEwMERfR1BJTzggICAgICAgICAgIDgKKyNkZWZpbmUgTkFTMTAwRF9HUElPOSAgICAgICAgICAgOQorI2RlZmluZSBOQVMxMDBEX0dQSU8xMCAgICAgICAgICAxMAorI2RlZmluZSBOQVMxMDBEX0dQSU8xMSAgICAgICAgICAxMQorI2RlZmluZSBOQVMxMDBEX0dQSU8xMiAgICAgICAgICAxMgorI2RlZmluZSBOQVMxMDBEX0dQSU8xMyAgICAgICAgICAxMworI2RlZmluZSBOQVMxMDBEX0dQSU8xNCAgICAgICAgICAxNAorI2RlZmluZSBOQVMxMDBEX0dQSU8xNSAgICAgICAgICAxNQorCisKKy8qIEJ1dHRvbnMgKi8KKworI2RlZmluZSBOQVMxMDBEX1BCX0dQSU8gICAgICAgICBOQVMxMDBEX0dQSU8xNAorI2RlZmluZSBOQVMxMDBEX1JCX0dQSU8gICAgICAgICBOQVMxMDBEX0dQSU80CisjZGVmaW5lIE5BUzEwMERfUE9fR1BJTyAgICAgICAgIE5BUzEwMERfR1BJTzEyICAgLyogcG93ZXIgb2ZmICovCisKKyNkZWZpbmUgTkFTMTAwRF9QQl9JUlEgICAgICAgICAgSVJRX0lYUDRYWF9HUElPMTQKKyNkZWZpbmUgTkFTMTAwRF9SQl9JUlEgICAgICAgICAgSVJRX0lYUDRYWF9HUElPNAorCisvKgorI2RlZmluZSBOQVMxMDBEX1BCX0JNICAgICAgICAgICAoMUwgPDwgTkFTMTAwRF9QQl9HUElPKQorI2RlZmluZSBOQVMxMDBEX1BPX0JNICAgICAgICAgICAoMUwgPDwgTkFTMTAwRF9QT19HUElPKQorI2RlZmluZSBOQVMxMDBEX1JCX0JNICAgICAgICAgICAoMUwgPDwgTkFTMTAwRF9SQl9HUElPKQorKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9uc2x1Mi5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L25zbHUyLmgKaW5kZXggYjhiMzQ3YS4uNDI4MTgzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L25zbHUyLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L25zbHUyLmgKQEAgLTE4LDkgKzE4LDYgQEAKICNlcnJvciAiRG8gbm90IGluY2x1ZGUgdGhpcyBkaXJlY3RseSwgaW5zdGVhZCAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+IgogI2VuZGlmCiAKLSNkZWZpbmUgTlNMVTJfRkxBU0hfQkFTRQlJWFA0WFhfRVhQX0JVU19DUzBfQkFTRV9QSFlTCi0jZGVmaW5lIE5TTFUyX0ZMQVNIX1NJWkUJSVhQNFhYX0VYUF9CVVNfQ1NYX1JFR0lPTl9TSVpFCi0KICNkZWZpbmUgTlNMVTJfU0RBX1BJTgkJNwogI2RlZmluZSBOU0xVMl9TQ0xfUElOCQk2CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9wbGF0Zm9ybS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L3BsYXRmb3JtLmgKaW5kZXggZjE0ZWQ2My4uZGFmOTc5MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L3BsYXRmb3JtLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L3BsYXRmb3JtLmgKQEAgLTI2LDE2ICsyNiwxNyBAQAogICovCiAjZGVmaW5lIElYUDRYWF9FWFBfQlVTX0JBU0VfUEhZUwkoMHg1MDAwMDAwMCkKIAotI2RlZmluZQlJWFA0WFhfRVhQX0JVU19DU1hfUkVHSU9OX1NJWkUJKDB4MDEwMDAwMDApCisvKgorICogVGhlIGV4cGFuc2lvbiBidXMgb24gdGhlIElYUDR4eCBjYW4gYmUgY29uZmlndXJlZCBmb3IgZWl0aGVyIDE2IG9yCisgKiAzMk1CIHdpbmRvd3MgYW5kIHRoZSBDUyBvZmZzZXQgZm9yIGVhY2ggcmVnaW9uIGNoYW5nZXMgYmFzZWQgb24gdGhlCisgKiBjdXJyZW50IGNvbmZpZ3VyYXRpb24uIFRoaXMgbWVhbnMgdGhhdCB3ZSBjYW5ub3Qgc2ltcGx5IGhhcmRjb2RlCisgKiBlYWNoIG9mZnNldC4gaXhwNHh4X3N5c19pbml0KCkgbG9va3MgYXQgdGhlIGV4cGFuc2lvbiBidXMgY29uZmlndXJhdGlvbgorICogYXMgc2V0dXAgYnkgdGhlIGJvb3Rsb2FkZXIgdG8gZGV0ZXJtaW5lIG91ciB3aW5kb3cgc2l6ZS4KKyAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaXhwNHh4X2V4cF9idXNfc2l6ZTsKIAotI2RlZmluZSBJWFA0WFhfRVhQX0JVU19DUzBfQkFTRV9QSFlTCShJWFA0WFhfRVhQX0JVU19CQVNFX1BIWVMgKyAweDAwMDAwMDAwKQotI2RlZmluZSBJWFA0WFhfRVhQX0JVU19DUzFfQkFTRV9QSFlTCShJWFA0WFhfRVhQX0JVU19CQVNFX1BIWVMgKyAweDAxMDAwMDAwKQotI2RlZmluZSBJWFA0WFhfRVhQX0JVU19DUzJfQkFTRV9QSFlTCShJWFA0WFhfRVhQX0JVU19CQVNFX1BIWVMgKyAweDAyMDAwMDAwKQotI2RlZmluZSBJWFA0WFhfRVhQX0JVU19DUzNfQkFTRV9QSFlTCShJWFA0WFhfRVhQX0JVU19CQVNFX1BIWVMgKyAweDAzMDAwMDAwKQotI2RlZmluZSBJWFA0WFhfRVhQX0JVU19DUzRfQkFTRV9QSFlTCShJWFA0WFhfRVhQX0JVU19CQVNFX1BIWVMgKyAweDA0MDAwMDAwKQotI2RlZmluZSBJWFA0WFhfRVhQX0JVU19DUzVfQkFTRV9QSFlTCShJWFA0WFhfRVhQX0JVU19CQVNFX1BIWVMgKyAweDA1MDAwMDAwKQotI2RlZmluZSBJWFA0WFhfRVhQX0JVU19DUzZfQkFTRV9QSFlTCShJWFA0WFhfRVhQX0JVU19CQVNFX1BIWVMgKyAweDA2MDAwMDAwKQotI2RlZmluZSBJWFA0WFhfRVhQX0JVU19DUzdfQkFTRV9QSFlTCShJWFA0WFhfRVhQX0JVU19CQVNFX1BIWVMgKyAweDA3MDAwMDAwKQorI2RlZmluZQlJWFA0WFhfRVhQX0JVU19CQVNFKHJlZ2lvbilcCisJCShJWFA0WFhfRVhQX0JVU19CQVNFX1BIWVMgKyAoKHJlZ2lvbikgKiBpeHA0eHhfZXhwX2J1c19zaXplKSkKIAogI2RlZmluZSBJWFA0WFhfRkxBU0hfV1JJVEFCTEUJKDB4MikKICNkZWZpbmUgSVhQNFhYX0ZMQVNIX0RFRkFVTFQJKDB4YmNkMjNjNDApCkBAIC0xMTIsMTAgKzExMyw1IEBACiAJICAgICpJWFA0WFhfR1BJT19HUE9VVFIgJj0gfigxIDw8IGxpbmUpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZ3Bpb19saW5lX2lzcl9jbGVhcih1OCBsaW5lKQotewotCSpJWFA0WFhfR1BJT19HUElTUiA9ICgxIDw8IGxpbmUpOwotfQotCiAjZW5kaWYgLy8gX19BU1NFTUJMWV9fCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWw3MjAwL2RtYS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtbDcyMDAvZG1hLmgKaW5kZXggNjU5NWIzOC4uNGM3ZWNhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtbDcyMDAvZG1hLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtbDcyMDAvZG1hLmgKQEAgLTE3LDcgKzE3LDYgQEAKICAqIGJ5dGVzIG9mIFJBTS4KICAqLwogI2RlZmluZSBNQVhfRE1BX0FERFJFU1MgICAgICAgICAweGQwMDAwMDAwCi0jZGVmaW5lIE1BWF9ETUFfQ0hBTk5FTFMgICAgICAgIDAKIAogI2RlZmluZSBETUFfUzAgICAgICAgICAgICAgICAgICAwCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWw3MjAwL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtbDcyMDAvc3lzdGVtLmgKaW5kZXggY2I0ZmYyOS4uMTg4MjVjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtbDcyMDAvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtbDcyMDAvc3lzdGVtLmgKQEAgLTEyLDYgKzEyLDggQEAKICNpZm5kZWYgX19BU01fQVJDSF9TWVNURU1fSAogI2RlZmluZSBfX0FTTV9BUkNIX1NZU1RFTV9ICiAKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKwogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfaWRsZSh2b2lkKQogewogCSoodW5zaWduZWQgbG9uZyAqKShJT19CQVNFICsgMHg1MDAwNCkgPSAxOwkvKiBpZGxlIG1vZGUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWxoN2E0MHgvZG1hLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1saDdhNDB4L2RtYS5oCmluZGV4IDU3OTdmMDEuLjE1NDkyZTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWxoN2E0MHgvZG1hLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtbGg3YTQweC9kbWEuaApAQCAtNywxMSArNywzIEBACiAgKiAgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKICAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfRE1BX0gKLSNkZWZpbmUgX19BU01fQVJDSF9ETUFfSAotCi0jZGVmaW5lIE1BWF9ETUFfQUREUkVTUwkJMHhmZmZmZmZmZgotI2RlZmluZSBNQVhfRE1BX0NIQU5ORUxTCTAgLyogQWxsIERNQSBpcyBpbnRlcm5hbCB0byBDUFUgKi8KLQotI2VuZGlmIC8qIF9BU01fQVJDSF9ETUFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtbGg3YTQweC9lbnRyeS1tYWNyby5TIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtbGg3YTQweC9lbnRyeS1tYWNyby5TCmluZGV4IDg2NWYzOTYuLmEyZjY3YzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWxoN2E0MHgvZW50cnktbWFjcm8uUworKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1saDdhNDB4L2VudHJ5LW1hY3JvLlMKQEAgLTcsNiArNyw4IEBACiAgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKICAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2lycXMuaD4KIAogIyBpZiBkZWZpbmVkIChDT05GSUdfQVJDSF9MSDdBNDAwKSAmJiBkZWZpbmVkIChDT05GSUdfQVJDSF9MSDdBNDA0KQogIyAgZXJyb3IgIkxIN0E0MDAgYW5kIExIN0E0MDQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvY2xvY2suaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvY2xvY2suaAppbmRleCA3NDBjMjk3Li40NmEwNDAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2Nsb2NrLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9jbG9jay5oCkBAIC0zOCw4ICszOCw2IEBACiBzdHJ1Y3QgY2xrX2Z1bmN0aW9ucyB7CiAJaW50CQkoKmNsa19lbmFibGUpKHN0cnVjdCBjbGsgKmNsayk7CiAJdm9pZAkJKCpjbGtfZGlzYWJsZSkoc3RydWN0IGNsayAqY2xrKTsKLQlpbnQJCSgqY2xrX3VzZSkoc3RydWN0IGNsayAqY2xrKTsKLQl2b2lkCQkoKmNsa191bnVzZSkoc3RydWN0IGNsayAqY2xrKTsKIAlsb25nCQkoKmNsa19yb3VuZF9yYXRlKShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7CiAJaW50CQkoKmNsa19zZXRfcmF0ZSkoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOwogCWludAkJKCpjbGtfc2V0X3BhcmVudCkoc3RydWN0IGNsayAqY2xrLCBzdHJ1Y3QgY2xrICpwYXJlbnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9kbWEuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZG1hLmgKaW5kZXggY2NiY2I1OC4uZDRlNzNlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9kbWEuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2RtYS5oCkBAIC0yMSw5ICsyMSw2IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfRE1BX0gKICNkZWZpbmUgX19BU01fQVJDSF9ETUFfSAogCi0jZGVmaW5lIE1BWF9ETUFfQUREUkVTUwkJCTB4ZmZmZmZmZmYKLSNkZWZpbmUgTUFYX0RNQV9DSEFOTkVMUwkJMAotCiAvKiBIYXJkd2FyZSByZWdpc3RlcnMgZm9yIG9tYXAxICovCiAjZGVmaW5lIE9NQVBfRE1BX0JBU0UJCQkoMHhmZmZlZDgwMCkKICNkZWZpbmUgT01BUF9ETUFfR0NSCQkJKE9NQVBfRE1BX0JBU0UgKyAweDQwMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZW50cnktbWFjcm8uUyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZW50cnktbWFjcm8uUwppbmRleCBmODgxNGE4Li4wZmZiMTE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2VudHJ5LW1hY3JvLlMKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9lbnRyeS1tYWNyby5TCkBAIC03LDYgKzcsOCBAQAogICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+CiAKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9zeXN0ZW0uaAppbmRleCA5YWY0MTVkLi42NzI0YTgxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvc3lzdGVtLmgKQEAgLTUsOCArNSw5IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfU1lTVEVNX0gKICNkZWZpbmUgX19BU01fQVJDSF9TWVNURU1fSAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9wcmNtLmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9kbWEuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9kbWEuaAppbmRleCA1NmRiM2Q0Li4zZTg4YTJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvZG1hLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL2RtYS5oCkBAIC0xMiwxMSArMTIsNiBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX0RNQV9ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfRE1BX0gKIAotI2RlZmluZSBNQVhfRE1BX0FERFJFU1MJCTB4ZmZmZmZmZmYKLQotLyogTm8gRE1BIGFzIHRoZSByZXN0IG9mIHRoZSB3b3JsZCBzZWUgaXQgKi8KLSNkZWZpbmUgTUFYX0RNQV9DSEFOTkVMUwkwCi0KIC8qCiAgKiBEZXNjcmlwdG9yIHN0cnVjdHVyZSBmb3IgUFhBJ3MgRE1BIGVuZ2luZQogICogTm90ZTogdGhpcyBzdHJ1Y3R1cmUgbXVzdCBhbHdheXMgYmUgYWxpZ25lZCB0byBhIDE2LWJ5dGUgYm91bmRhcnkuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvZW50cnktbWFjcm8uUyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9lbnRyeS1tYWNyby5TCmluZGV4IDJhYmZjOGIuLjQ5ODVlMzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9lbnRyeS1tYWNyby5TCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9lbnRyeS1tYWNyby5TCkBAIC03LDYgKzcsOCBAQAogICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+CiAKIAkJLm1hY3JvCWRpc2FibGVfZmlxCiAJCS5lbmRtCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvcHhhLXJlZ3MuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEtcmVncy5oCmluZGV4IGE3NWEyNDcuLjE0MDljNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEtcmVncy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEtcmVncy5oCkBAIC0xMDgsNiArMTA4LDcgQEAKICNkZWZpbmUgRENTUl9TVEFSVElOVFIJKDEgPDwgMSkJLyogU3RhcnQgSW50ZXJydXB0IChyZWFkIC8gd3JpdGUpICovCiAjZGVmaW5lIERDU1JfQlVTRVJSCSgxIDw8IDApCS8qIEJ1cyBFcnJvciBJbnRlcnJ1cHQgKHJlYWQgLyB3cml0ZSkgKi8KIAorI2RlZmluZSBEQUxHTgkJX19SRUcoMHg0MDAwMDBhMCkgIC8qIERNQSBBbGlnbm1lbnQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgRElOVAkJX19SRUcoMHg0MDAwMDBmMCkgIC8qIERNQSBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KIAogI2RlZmluZSBEUkNNUihuKQlfX1JFRzIoMHg0MDAwMDEwMCwgKG4pPDwyKQpAQCAtMTYxNCw4ICsxNjE1LDIxIEBACiAjZGVmaW5lIFNTQ1IwX05hdGlvbmFsCSgweDIgPDwgNCkJLyogTmF0aW9uYWwgTWljcm93aXJlICovCiAjZGVmaW5lIFNTQ1IwX0VDUwkoMSA8PCA2KQkvKiBFeHRlcm5hbCBjbG9jayBzZWxlY3QgKi8KICNkZWZpbmUgU1NDUjBfU1NFCSgxIDw8IDcpCS8qIFN5bmNocm9ub3VzIFNlcmlhbCBQb3J0IEVuYWJsZSAqLworI2lmIGRlZmluZWQoQ09ORklHX1BYQTI1eCkKICNkZWZpbmUgU1NDUjBfU0NSCSgweDAwMDBmZjAwKQkvKiBTZXJpYWwgQ2xvY2sgUmF0ZSAobWFzaykgKi8KICNkZWZpbmUgU1NDUjBfU2VyQ2xrRGl2KHgpICgoKCh4KSAtIDIpLzIpIDw8IDgpIC8qIERpdmlzb3IgWzIuLjUxMl0gKi8KKyNlbGlmIGRlZmluZWQoQ09ORklHX1BYQTI3eCkKKyNkZWZpbmUgU1NDUjBfU0NSCSgweDAwMGZmZjAwKQkvKiBTZXJpYWwgQ2xvY2sgUmF0ZSAobWFzaykgKi8KKyNkZWZpbmUgU1NDUjBfU2VyQ2xrRGl2KHgpICgoKHgpIC0gMSkgPDwgOCkgLyogRGl2aXNvciBbMS4uNDA5Nl0gKi8KKyNkZWZpbmUgU1NDUjBfRURTUwkoMSA8PCAyMCkJLyogRXh0ZW5kZWQgZGF0YSBzaXplIHNlbGVjdCAqLworI2RlZmluZSBTU0NSMF9OQ1MJKDEgPDwgMjEpCS8qIE5ldHdvcmsgY2xvY2sgc2VsZWN0ICovCisjZGVmaW5lIFNTQ1IwX1JJTQkoMSA8PCAyMikJLyogUmVjZWl2ZSBGSUZPIG92ZXJycnVuIGludGVycnVwdCBtYXNrICovCisjZGVmaW5lIFNTQ1IwX1RVTQkoMSA8PCAyMykJLyogVHJhbnNtaXQgRklGTyB1bmRlcnJ1biBpbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSBTU0NSMF9GUkRDCSgweDA3MDAwMDAwKQkvKiBGcmFtZSByYXRlIGRpdmlkZXIgY29udHJvbCAobWFzaykgKi8KKyNkZWZpbmUgU1NDUjBfU2xvdHNQZXJGcm0oYykgKCh4KSAtIDEpCS8qIFRpbWUgc2xvdHMgcGVyIGZyYW1lIFsxLi44XSAqLworI2RlZmluZSBTU0NSMF9BREMJKDEgPDwgMzApCS8qIEF1ZGlvIGNsb2NrIHNlbGVjdCAqLworI2RlZmluZSBTU0NSMF9NT0QJKDEgPDwgMzEpCS8qIE1vZGUgKG5vcm1hbCBvciBuZXR3b3JrKSAqLworI2VuZGlmCiAKICNkZWZpbmUgU1NDUjFfUklFCSgxIDw8IDApCS8qIFJlY2VpdmUgRklGTyBJbnRlcnJ1cHQgRW5hYmxlICovCiAjZGVmaW5lIFNTQ1IxX1RJRQkoMSA8PCAxKQkvKiBUcmFuc21pdCBGSUZPIEludGVycnVwdCBFbmFibGUgKi8KQEAgLTIwNDIsNiArMjA1NiwxOCBAQAogCiAjaWZkZWYgQ09ORklHX1BYQTI3eAogCisjZGVmaW5lIEFSQl9DTlRSTAlfX1JFRygweDQ4MDAwMDQ4KSAgLyogQXJiaXRlciBDb250cm9sIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgQVJCX0RNQV9TTFZfUEFSSwkoMTw8MzEpCSAgIC8qIEJlIHBhcmtlZCB3aXRoIERNQSBzbGF2ZSB3aGVuIGlkbGUgKi8KKyNkZWZpbmUgQVJCX0NJX1BBUksJCSgxPDwzMCkJICAgLyogQmUgcGFya2VkIHdpdGggQ2FtZXJhIEludGVyZmFjZSB3aGVuIGlkbGUgKi8KKyNkZWZpbmUgQVJCX0VYX01FTV9QQVJLIAkoMTw8MjkpCSAgIC8qIEJlIHBhcmtlZCB3aXRoIGV4dGVybmFsIE1FTUMgd2hlbiBpZGxlICovCisjZGVmaW5lIEFSQl9JTlRfTUVNX1BBUksJKDE8PDI4KQkgICAvKiBCZSBwYXJrZWQgd2l0aCBpbnRlcm5hbCBNRU1DIHdoZW4gaWRsZSAqLworI2RlZmluZSBBUkJfVVNCX1BBUksJCSgxPDwyNykJICAgLyogQmUgcGFya2VkIHdpdGggVVNCIHdoZW4gaWRsZSAqLworI2RlZmluZSBBUkJfTENEX1BBUksJCSgxPDwyNikJICAgLyogQmUgcGFya2VkIHdpdGggTENEIHdoZW4gaWRsZSAqLworI2RlZmluZSBBUkJfRE1BX1BBUksJCSgxPDwyNSkJICAgLyogQmUgcGFya2VkIHdpdGggRE1BIHdoZW4gaWRsZSAqLworI2RlZmluZSBBUkJfQ09SRV9QQVJLCQkoMTw8MjQpCSAgIC8qIEJlIHBhcmtlZCB3aXRoIGNvcmUgd2hlbiBpZGxlICovCisjZGVmaW5lIEFSQl9MT0NLX0ZMQUcJCSgxPDwyMykJICAgLyogT25seSBMb2NraW5nIG1hc3RlcnMgZ2FpbiBhY2Nlc3MgdG8gdGhlIGJ1cyAqLworCiAvKgogICogS2V5cGFkCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXJlYWx2aWV3L2RlYnVnLW1hY3JvLlMgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1yZWFsdmlldy9kZWJ1Zy1tYWNyby5TCmluZGV4IGVkMjhiZDAuLjAxN2FkOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXJlYWx2aWV3L2RlYnVnLW1hY3JvLlMKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcmVhbHZpZXcvZGVidWctbWFjcm8uUwpAQCAtMTEsNyArMTEsNyBAQAogICoKICovCiAKLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYW1iYV9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL3NlcmlhbC5oPgogCiAJCS5tYWNybwlhZGRydWFydCxyeAogCQltcmMJcDE1LCAwLCBccngsIGMxLCBjMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcmVhbHZpZXcvZG1hLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1yZWFsdmlldy9kbWEuaAppbmRleCA3NDQ0OTFhLi44MzQyZTNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1yZWFsdmlldy9kbWEuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1yZWFsdmlldy9kbWEuaApAQCAtMTgsMTAgKzE4LDMgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KLSNpZm5kZWYgX19BU01fQVJDSF9ETUFfSAotI2RlZmluZSBfX0FTTV9BUkNIX0RNQV9ICi0KLSNkZWZpbmUgTUFYX0RNQV9BRERSRVNTCQkweGZmZmZmZmZmCi0jZGVmaW5lIE1BWF9ETUFfQ0hBTk5FTFMJMAotCi0jZW5kaWYgLyogX0FTTV9BUkNIX0RNQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1yZWFsdmlldy9lbnRyeS1tYWNyby5TIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcmVhbHZpZXcvZW50cnktbWFjcm8uUwppbmRleCA2Mjg4ZmFkLi4xYTZlZWM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1yZWFsdmlldy9lbnRyeS1tYWNyby5TCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXJlYWx2aWV3L2VudHJ5LW1hY3JvLlMKQEAgLTcsNyArNyw3IEBACiAgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKICAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLwotCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2dpYy5oPgogCiAJCS5tYWNybwlkaXNhYmxlX2ZpcQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcnBjL2VudHJ5LW1hY3JvLlMgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1ycGMvZW50cnktbWFjcm8uUwppbmRleCA2ODZmNDEzLi5jOWU1Mzk1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1ycGMvZW50cnktbWFjcm8uUworKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1ycGMvZW50cnktbWFjcm8uUwpAQCAtMSwzICsxLDMgQEAKLQorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9lbnRyeS1tYWNyby1pb21kLlM+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvZG1hLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2RtYS5oCmluZGV4IGU4MzBhNDAuLmIwMTFlMTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvZG1hLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9kbWEuaApAQCAtMzEsMTQgKzMxLDYgQEAKICNkZWZpbmUgTUFYX0RNQV9UUkFOU0ZFUl9TSVpFICAgMHgxMDAwMDAgLyogRGF0YSBVbml0IGlzIGhhbGYgd29yZCAgKi8KIAogCi0vKiBhY2NvcmRpbmcgdG8gdGhlIHNhbXN1bmcgcG9ydCwgd2UgY2Fubm90IHVzZSB0aGUgcmVndWxhcgotICogZG1hIGNoYW5uZWxzLi4uIHdlIG11c3QgdGhlcmVmb3JlIHByb3ZpZGUgb3VyIG93biBpbnRlcmZhY2UKLSAqIGZvciBETUEsIGFuZCBhbGxvdyBvdXIgZHJpdmVycyB0byB1c2UgdGhhdC4KLSAqLwotCi0jZGVmaW5lIE1BWF9ETUFfQ0hBTk5FTFMJMAotCi0KIC8qIHdlIGhhdmUgNCBkbWEgY2hhbm5lbHMgKi8KICNkZWZpbmUgUzNDMjQxMF9ETUFfQ0hBTk5FTFMgICAgICAgICg0KQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2VudHJ5LW1hY3JvLlMgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2VudHJ5LW1hY3JvLlMKaW5kZXggYjdkNGQ3Zi4uY2MwNmIxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9lbnRyeS1tYWNyby5TCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvZW50cnktbWFjcm8uUwpAQCAtMTAsNiArMTAsOCBAQAogICogTW9kaWZpY2F0aW9uczoKICAqICAgICAxMC1NYXItMjAwNSBMQ1ZSICBDaGFuZ2VkIFMzQzI0MTBfVkEgdG8gUzNDMjRYWF9WQQogICovCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgogCiAKIAkubWFjcm8JZ2V0X2lycW5yX2FuZF9iYXNlLCBpcnFuciwgaXJxc3RhdCwgYmFzZSwgdG1wCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zYTExMDAvZG1hLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zYTExMDAvZG1hLmgKaW5kZXggM2Q2MGVkOS4uMDI1NzVkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtc2ExMTAwL2RtYS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXNhMTEwMC9kbWEuaApAQCAtMTUsMjAgKzE1LDYgQEAKIAogCiAvKgotICogVGhpcyBpcyB0aGUgbWF4aW11bSBETUEgYWRkcmVzcyB0aGF0IGNhbiBiZSBETUFkIHRvLgotICovCi0jZGVmaW5lIE1BWF9ETUFfQUREUkVTUwkJMHhmZmZmZmZmZgotCi0KLS8qCi0gKiBUaGUgcmVndWxhciBnZW5lcmljIERNQSBpbnRlcmZhY2UgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhlCi0gKiBTQTExMDAgRE1BIG1vZGVsLiAgTm9uZSBvZiB0aGUgU0ExMTAwIHNwZWNpZmljIGRyaXZlcnMgdXNpbmcKLSAqIERNQSBhcmUgcG9ydGFibGUgYW55d2F5IHNvIGl0J3MgcG9pbnRsZXNzIHRvIHRyeSB0byB0d2lzdCB0aGUKLSAqIHJlZ3VsYXIgRE1BIEFQSSB0byBhY2NvbW1vZGF0ZSB0aGVtLgotICovCi0jZGVmaW5lIE1BWF9ETUFfQ0hBTk5FTFMJMAotCi0vKgogICogVGhlIFNBMTEwMCBoYXMgc2l4IGludGVybmFsIERNQSBjaGFubmVscy4KICAqLwogI2RlZmluZSBTQTExMDBfRE1BX0NIQU5ORUxTCTYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXZlcnNhdGlsZS9kZWJ1Zy1tYWNyby5TIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtdmVyc2F0aWxlL2RlYnVnLW1hY3JvLlMKaW5kZXggODllMzhhYy4uZWY2MTY3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtdmVyc2F0aWxlL2RlYnVnLW1hY3JvLlMKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtdmVyc2F0aWxlL2RlYnVnLW1hY3JvLlMKQEAgLTExLDcgKzExLDcgQEAKICAqCiAqLwogCi0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2FtYmFfc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9zZXJpYWwuaD4KIAogCQkubWFjcm8JYWRkcnVhcnQscngKIAkJbXJjCXAxNSwgMCwgXHJ4LCBjMSwgYzAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXZlcnNhdGlsZS9kbWEuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXZlcnNhdGlsZS9kbWEuaAppbmRleCBkY2M4YWMyLi42NDI1NzczIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC12ZXJzYXRpbGUvZG1hLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtdmVyc2F0aWxlL2RtYS5oCkBAIC0xOCwxMCArMTgsMyBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwotI2lmbmRlZiBfX0FTTV9BUkNIX0RNQV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfRE1BX0gKLQotI2RlZmluZSBNQVhfRE1BX0FERFJFU1MJCTB4ZmZmZmZmZmYKLSNkZWZpbmUgTUFYX0RNQV9DSEFOTkVMUwkwCi0KLSNlbmRpZiAvKiBfQVNNX0FSQ0hfRE1BX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXZlcnNhdGlsZS9lbnRyeS1tYWNyby5TIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtdmVyc2F0aWxlL2VudHJ5LW1hY3JvLlMKaW5kZXggOTBlNGU5Ny4uZmVmZjc3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtdmVyc2F0aWxlL2VudHJ5LW1hY3JvLlMKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtdmVyc2F0aWxlL2VudHJ5LW1hY3JvLlMKQEAgLTcsNyArNywxMCBAQAogICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KLQkJCS5tYWNybwlkaXNhYmxlX2ZpcQorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS92aWMuaD4KKworCQkubWFjcm8JZGlzYWJsZV9maXEKIAkJLmVuZG0KIAogCQkubWFjcm8JZ2V0X2lycW5yX2FuZF9iYXNlLCBpcnFuciwgaXJxc3RhdCwgYmFzZSwgdG1wCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC12ZXJzYXRpbGUvcGxhdGZvcm0uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXZlcnNhdGlsZS9wbGF0Zm9ybS5oCmluZGV4IGNiZGQ5ZmIuLjcyZWY4NzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXZlcnNhdGlsZS9wbGF0Zm9ybS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXZlcnNhdGlsZS9wbGF0Zm9ybS5oCkBAIC0yOTMsMjYgKzI5Myw3IEBACiAgKiAJVkVSU0FUSUxFX1NZU19JQyAKICAqIAogICovCi0jZGVmaW5lIFZJQ19JUlFfU1RBVFVTICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBWSUNfRklRX1NUQVRVUyAgICAgICAgICAgICAgICAgIDB4MDQKLSNkZWZpbmUgVklDX0lSUV9SQVdfU1RBVFVTICAgICAgICAgICAgICAweDA4Ci0jZGVmaW5lIFZJQ19JTlRfU0VMRUNUICAgICAgICAgICAgICAgICAgMHgwQwkvKiAxID0gRklRLCAwID0gSVJRICovCi0jZGVmaW5lIFZJQ19JUlFfRU5BQkxFICAgICAgICAgICAgICAgICAgMHgxMAkvKiAxID0gZW5hYmxlLCAwID0gZGlzYWJsZSAqLwotI2RlZmluZSBWSUNfSVJRX0VOQUJMRV9DTEVBUiAgICAgICAgICAgIDB4MTQKLSNkZWZpbmUgVklDX0lSUV9TT0ZUICAgICAgICAgICAgICAgICAgICAweDE4Ci0jZGVmaW5lIFZJQ19JUlFfU09GVF9DTEVBUiAgICAgICAgICAgICAgMHgxQwotI2RlZmluZSBWSUNfUFJPVEVDVCAgICAgICAgICAgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgVklDX1ZFQ1RfQUREUiAgICAgICAgICAgICAgICAgICAweDMwCi0jZGVmaW5lIFZJQ19ERUZfVkVDVF9BRERSICAgICAgICAgICAgICAgMHgzNAotI2RlZmluZSBWSUNfVkVDVF9BRERSMCAgICAgICAgICAgICAgICAgIDB4MTAwCS8qIDAgdG8gMTUgKi8KLSNkZWZpbmUgVklDX1ZFQ1RfQ05UTDAgICAgICAgICAgICAgICAgICAweDIwMAkvKiAwIHRvIDE1ICovCi0jZGVmaW5lIFZJQ19JVENSICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAgICAvKiBWSUMgdGVzdCBjb250cm9sIHJlZ2lzdGVyICovCi0KLSNkZWZpbmUgVklDX0ZJUV9SQVdfU1RBVFVTICAgICAgICAgICAgICAweDA4Ci0jZGVmaW5lIFZJQ19GSVFfRU5BQkxFICAgICAgICAgICAgICAgICAgMHgxMAkvKiAxID0gZW5hYmxlLCAwID0gZGlzYWJsZSAqLwotI2RlZmluZSBWSUNfRklRX0VOQUJMRV9DTEVBUiAgICAgICAgICAgIDB4MTQKLSNkZWZpbmUgVklDX0ZJUV9TT0ZUICAgICAgICAgICAgICAgICAgICAweDE4Ci0jZGVmaW5lIFZJQ19GSVFfU09GVF9DTEVBUiAgICAgICAgICAgICAgMHgxQworLyogVklDIGRlZmluaXRpb25zIGluIGluY2x1ZGUvYXNtLWFybS9oYXJkd2FyZS92aWMuaCAqLwogCiAjZGVmaW5lIFNJQ19JUlFfU1RBVFVTICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBTSUNfSVJRX1JBV19TVEFUVVMgICAgICAgICAgICAgIDB4MDQKQEAgLTMyNSw4ICszMDYsNiBAQAogI2RlZmluZSBTSUNfSU5UX1BJQ19FTkFCTEVTICAgICAgICAgICAgIDB4MjAJLyogc2V0IGludGVycnVwdCBwYXNzIHRocm91Z2ggYml0cyAqLwogI2RlZmluZSBTSUNfSU5UX1BJQ19FTkFCTEVDICAgICAgICAgICAgIDB4MjQJLyogQ2xlYXIgaW50ZXJydXB0IHBhc3MgdGhyb3VnaCBiaXRzICovCiAKLSNkZWZpbmUgVklDVmVjdENudGxfRW5hYmxlCQkoMSA8PCA1KQotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqICBJbnRlcnJ1cHRzIC0gYml0IGFzc2lnbm1lbnQgKHByaW1hcnkpCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLWFybS9hdG9taWMuaAppbmRleCBmNzJiNjMzLi4zZDcyODNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2F0b21pYy5oCkBAIC0xNzUsNiArMTc1LDggQEAKIAogI2VuZGlmIC8qIF9fTElOVVhfQVJNX0FSQ0hfXyAqLwogCisjZGVmaW5lIGF0b21pY194Y2hnKHYsIG5ldykgKHhjaGcoJigodiktPmNvdW50ZXIpLCBuZXcpKQorCiBzdGF0aWMgaW5saW5lIGludCBhdG9taWNfYWRkX3VubGVzcyhhdG9taWNfdCAqdiwgaW50IGEsIGludCB1KQogewogCWludCBjLCBvbGQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYnl0ZW9yZGVyLmggYi9pbmNsdWRlL2FzbS1hcm0vYnl0ZW9yZGVyLmgKaW5kZXggZDY0OGExOS4uMTdlYWY4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2J5dGVvcmRlci5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9ieXRlb3JkZXIuaApAQCAtMTUsOSArMTUsMzIgQEAKICNpZm5kZWYgX19BU01fQVJNX0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9fQVNNX0FSTV9CWVRFT1JERVJfSAogCi0KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19fYXJjaF9fc3dhYjMyKF9fdTMyIHgpCit7CisJX191MzIgdDsKKworCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCh4KSkgeworCQl0ID0geCBeICgoeCA8PCAxNikgfCAoeCA+PiAxNikpOyAvKiBlb3IgcjEscjAscjAscm9yICMxNiAqLworCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoZSBjb21waWxlciBuZWVkcyBhIGJpdCBvZiBhIGhpbnQgaGVyZSB0byBhbHdheXMgZG8gdGhlCisJCSAqIHJpZ2h0IHRoaW5nIGFuZCBub3Qgc2NyZXcgaXQgdXAgdG8gZGlmZmVyZW50IGRlZ3JlZXMKKwkJICogZGVwZW5kaW5nIG9uIHRoZSBnY2MgdmVyc2lvbi4KKwkJICovCisJCWFzbSAoImVvclx0JTAsICUxLCAlMSwgcm9yICMxNiIgOiAiPXIiICh0KSA6ICJyIiAoeCkpOworCX0KKwl4ID0gKHggPDwgMjQpIHwgKHggPj4gOCk7CQkvKiBtb3YgcjAscjAscm9yICM4ICAgICAgKi8KKwl0ICY9IH4weDAwRkYwMDAwOwkJCS8qIGJpYyByMSxyMSwjMHgwMEZGMDAwMCAqLworCXggXj0gKHQgPj4gOCk7CQkJCS8qIGVvciByMCxyMCxyMSxsc3IgIzggICAqLworCisJcmV0dXJuIHg7Cit9CisKKyNkZWZpbmUgX19hcmNoX19zd2FiMzIoeCkgX19fYXJjaF9fc3dhYjMyKHgpCisKICNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKICMgIGRlZmluZSBfX0JZVEVPUkRFUl9IQVNfVTY0X18KICMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vY2FjaGUuaCBiL2luY2x1ZGUvYXNtLWFybS9jYWNoZS5oCmluZGV4IDhkMTYxZjcuLjMxMzMyYzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9jYWNoZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9jYWNoZS5oCkBAIC03LDkgKzcsNCBAQAogI2RlZmluZSBMMV9DQUNIRV9TSElGVAkJNQogI2RlZmluZSBMMV9DQUNIRV9CWVRFUwkJKDEgPDwgTDFfQ0FDSEVfU0hJRlQpCiAKLS8qCi0gKiBsYXJnZXN0IEwxIHdoaWNoIHRoaXMgYXJjaCBzdXBwb3J0cwotICovCi0jZGVmaW5lIEwxX0NBQ0hFX1NISUZUX01BWAk1Ci0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2NhY2hlZmx1c2guaCBiL2luY2x1ZGUvYXNtLWFybS9jYWNoZWZsdXNoLmgKaW5kZXggZTgxYmFmZi4uMDllMTlhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2NhY2hlZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vY2FjaGVmbHVzaC5oCkBAIC0xNCw3ICsxNCw2IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogCi0jaW5jbHVkZSA8YXNtL21tYW4uaD4KICNpbmNsdWRlIDxhc20vZ2x1ZS5oPgogI2luY2x1ZGUgPGFzbS9zaG1wYXJhbS5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vZG1hLmggYi9pbmNsdWRlL2FzbS1hcm0vZG1hLmgKaW5kZXggZWY0MWRmNDNhLi40OWMwMWUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vZG1hLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2RtYS5oCkBAIC0xMCw2ICsxMCwxMyBAQAogI2luY2x1ZGUgPGFzbS9hcmNoL2RtYS5oPgogCiAvKgorICogVGhpcyBpcyB0aGUgbWF4aW11bSB2aXJ0dWFsIGFkZHJlc3Mgd2hpY2ggY2FuIGJlIERNQSdkIGZyb20uCisgKi8KKyNpZm5kZWYgTUFYX0RNQV9BRERSRVNTCisjZGVmaW5lIE1BWF9ETUFfQUREUkVTUwkweGZmZmZmZmZmCisjZW5kaWYKKworLyoKICAqIERNQSBtb2RlcwogICovCiB0eXBlZGVmIHVuc2lnbmVkIGludCBkbWFtb2RlX3Q7CkBAIC05MSw3ICs5OCw5IEBACiAgKiBlc3BlY2lhbGx5IHNpbmNlIHNvbWUgRE1BIGFyY2hpdGVjdHVyZXMgZG9uJ3QgdXBkYXRlIHRoZQogICogRE1BIGFkZHJlc3MgaW1tZWRpYXRlbHksIGJ1dCBkZWZlciBpdCB0byB0aGUgZW5hYmxlX2RtYSgpLgogICovCi1leHRlcm4gdm9pZCBzZXRfZG1hX2FkZHIoZG1hY2hfdCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIHBoeXNhZGRyKTsKK2V4dGVybiB2b2lkIF9fc2V0X2RtYV9hZGRyKGRtYWNoX3QgY2hhbm5lbCwgdm9pZCAqYWRkcik7CisjZGVmaW5lIHNldF9kbWFfYWRkcihjaGFubmVsLCBhZGRyKQkJCQlcCisJX19zZXRfZG1hX2FkZHIoY2hhbm5lbCwgYnVzX3RvX3ZpcnQoYWRkcikpCiAKIC8qIFNldCB0aGUgRE1BIGJ5dGUgY291bnQgZm9yIHRoaXMgY2hhbm5lbAogICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9mdXRleC5oIGIvaW5jbHVkZS9hc20tYXJtL2Z1dGV4LmgKaW5kZXggOWZlZmY0Y2UuLjZhMzMyYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9mdXRleC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9mdXRleC5oCkBAIC0xLDUzICsxLDYgQEAKICNpZm5kZWYgX0FTTV9GVVRFWF9ICiAjZGVmaW5lIF9BU01fRlVURVhfSAogCi0jaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2Z1dGV4Lmg+CiAKLSNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1mdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCi17Ci0JaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKLQlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7Ci0JaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7Ci0JaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKLQlpbnQgb2xkdmFsID0gMCwgcmV0OwotCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKLQkJb3BhcmcgPSAxIDw8IG9wYXJnOwotCi0JaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaW5jX3ByZWVtcHRfY291bnQoKTsKLQotCXN3aXRjaCAob3ApIHsKLQljYXNlIEZVVEVYX09QX1NFVDoKLQljYXNlIEZVVEVYX09QX0FERDoKLQljYXNlIEZVVEVYX09QX09SOgotCWNhc2UgRlVURVhfT1BfQU5ETjoKLQljYXNlIEZVVEVYX09QX1hPUjoKLQlkZWZhdWx0OgotCQlyZXQgPSAtRU5PU1lTOwotCX0KLQotCWRlY19wcmVlbXB0X2NvdW50KCk7Ci0KLQlpZiAoIXJldCkgewotCQlzd2l0Y2ggKGNtcCkgewotCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKLQkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0jZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2hhcmR3YXJlL2Nsb2NrLmggYi9pbmNsdWRlL2FzbS1hcm0vaGFyZHdhcmUvY2xvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlkYTg2MS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vaGFyZHdhcmUvY2xvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9oYXJkd2FyZS9jbG9jay5oCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNCBBUk0gTGltaXRlZC4KLSAqICBXcml0dGVuIGJ5IERlZXAgQmx1ZSBTb2x1dGlvbnMgTGltaXRlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0jaWZuZGVmIEFTTUFSTV9DTE9DS19ICi0jZGVmaW5lIEFTTUFSTV9DTE9DS19ICi0KLXN0cnVjdCBkZXZpY2U7Ci0KLS8qCi0gKiBUaGUgYmFzZSBBUEkuCi0gKi8KLQotCi0vKgotICogc3RydWN0IGNsayAtIGFuIG1hY2hpbmUgY2xhc3MgZGVmaW5lZCBvYmplY3QgLyBjb29raWUuCi0gKi8KLXN0cnVjdCBjbGs7Ci0KLS8qKgotICogY2xrX2dldCAtIGxvb2t1cCBhbmQgb2J0YWluIGEgcmVmZXJlbmNlIHRvIGEgY2xvY2sgcHJvZHVjZXIuCi0gKiBAZGV2OiBkZXZpY2UgZm9yIGNsb2NrICJjb25zdW1lciIKLSAqIEBpZDogY2xvY2sgY29tc3VtZXIgSUQKLSAqCi0gKiBSZXR1cm5zIGEgc3RydWN0IGNsayBjb3JyZXNwb25kaW5nIHRvIHRoZSBjbG9jayBwcm9kdWNlciwgb3IKLSAqIHZhbGlkIElTX0VSUigpIGNvbmRpdGlvbiBjb250YWluaW5nIGVycm5vLiAgVGhlIGltcGxlbWVudGF0aW9uCi0gKiB1c2VzIEBkZXYgYW5kIEBpZCB0byBkZXRlcm1pbmUgdGhlIGNsb2NrIGNvbnN1bWVyLCBhbmQgdGhlcmVieQotICogdGhlIGNsb2NrIHByb2R1Y2VyLiAgKElPVywgQGlkIG1heSBiZSBpZGVudGljYWwgc3RyaW5ncywgYnV0Ci0gKiBjbGtfZ2V0IG1heSByZXR1cm4gZGlmZmVyZW50IGNsb2NrIHByb2R1Y2VycyBkZXBlbmRpbmcgb24gQGRldi4pCi0gKi8KLXN0cnVjdCBjbGsgKmNsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCk7Ci0KLS8qKgotICogY2xrX2VuYWJsZSAtIGluZm9ybSB0aGUgc3lzdGVtIHdoZW4gdGhlIGNsb2NrIHNvdXJjZSBzaG91bGQgYmUgcnVubmluZy4KLSAqIEBjbGs6IGNsb2NrIHNvdXJjZQotICoKLSAqIElmIHRoZSBjbG9jayBjYW4gbm90IGJlIGVuYWJsZWQvZGlzYWJsZWQsIHRoaXMgc2hvdWxkIHJldHVybiBzdWNjZXNzLgotICoKLSAqIFJldHVybnMgc3VjY2VzcyAoMCkgb3IgbmVnYXRpdmUgZXJybm8uCi0gKi8KLWludCBjbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsayk7Ci0KLS8qKgotICogY2xrX2Rpc2FibGUgLSBpbmZvcm0gdGhlIHN5c3RlbSB3aGVuIHRoZSBjbG9jayBzb3VyY2UgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLgotICogQGNsazogY2xvY2sgc291cmNlCi0gKi8KLXZvaWQgY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKTsKLQotLyoqCi0gKiBjbGtfdXNlIC0gaW5jcmVtZW50IHRoZSB1c2UgY291bnQKLSAqIEBjbGs6IGNsb2NrIHNvdXJjZQotICoKLSAqIFJldHVybnMgc3VjY2VzcyAoMCkgb3IgbmVnYXRpdmUgZXJybm8uCi0gKi8KLWludCBjbGtfdXNlKHN0cnVjdCBjbGsgKmNsayk7Ci0KLS8qKgotICogY2xrX3VudXNlIC0gZGVjcmVtZW50IHRoZSB1c2UgY291bnQKLSAqIEBjbGs6IGNsb2NrIHNvdXJjZQotICovCi12b2lkIGNsa191bnVzZShzdHJ1Y3QgY2xrICpjbGspOwotCi0vKioKLSAqIGNsa19nZXRfcmF0ZSAtIG9idGFpbiB0aGUgY3VycmVudCBjbG9jayByYXRlIChpbiBIeikgZm9yIGEgY2xvY2sgc291cmNlLgotICoJCSAgVGhpcyBpcyBvbmx5IHZhbGlkIG9uY2UgdGhlIGNsb2NrIHNvdXJjZSBoYXMgYmVlbiBlbmFibGVkLgotICogQGNsazogY2xvY2sgc291cmNlCi0gKi8KLXVuc2lnbmVkIGxvbmcgY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsayk7Ci0KLS8qKgotICogY2xrX3B1dAktICJmcmVlIiB0aGUgY2xvY2sgc291cmNlCi0gKiBAY2xrOiBjbG9jayBzb3VyY2UKLSAqLwotdm9pZCBjbGtfcHV0KHN0cnVjdCBjbGsgKmNsayk7Ci0KLQotLyoKLSAqIFRoZSByZW1haW5pbmcgQVBJcyBhcmUgb3B0aW9uYWwgZm9yIG1hY2hpbmUgY2xhc3Mgc3VwcG9ydC4KLSAqLwotCi0KLS8qKgotICogY2xrX3JvdW5kX3JhdGUgLSBhZGp1c3QgYSByYXRlIHRvIHRoZSBleGFjdCByYXRlIGEgY2xvY2sgY2FuIHByb3ZpZGUKLSAqIEBjbGs6IGNsb2NrIHNvdXJjZQotICogQHJhdGU6IGRlc2lyZWQgY2xvY2sgcmF0ZSBpbiBIegotICoKLSAqIFJldHVybnMgcm91bmRlZCBjbG9jayByYXRlIGluIEh6LCBvciBuZWdhdGl2ZSBlcnJuby4KLSAqLwotbG9uZyBjbGtfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7Ci0gCi0vKioKLSAqIGNsa19zZXRfcmF0ZSAtIHNldCB0aGUgY2xvY2sgcmF0ZSBmb3IgYSBjbG9jayBzb3VyY2UKLSAqIEBjbGs6IGNsb2NrIHNvdXJjZQotICogQHJhdGU6IGRlc2lyZWQgY2xvY2sgcmF0ZSBpbiBIegotICoKLSAqIFJldHVybnMgc3VjY2VzcyAoMCkgb3IgbmVnYXRpdmUgZXJybm8uCi0gKi8KLWludCBjbGtfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOwotIAotLyoqCi0gKiBjbGtfc2V0X3BhcmVudCAtIHNldCB0aGUgcGFyZW50IGNsb2NrIHNvdXJjZSBmb3IgdGhpcyBjbG9jawotICogQGNsazogY2xvY2sgc291cmNlCi0gKiBAcGFyZW50OiBwYXJlbnQgY2xvY2sgc291cmNlCi0gKgotICogUmV0dXJucyBzdWNjZXNzICgwKSBvciBuZWdhdGl2ZSBlcnJuby4KLSAqLwotaW50IGNsa19zZXRfcGFyZW50KHN0cnVjdCBjbGsgKmNsaywgc3RydWN0IGNsayAqcGFyZW50KTsKLQotLyoqCi0gKiBjbGtfZ2V0X3BhcmVudCAtIGdldCB0aGUgcGFyZW50IGNsb2NrIHNvdXJjZSBmb3IgdGhpcyBjbG9jawotICogQGNsazogY2xvY2sgc291cmNlCi0gKgotICogUmV0dXJucyBzdHJ1Y3QgY2xrIGNvcnJlc3BvbmRpbmcgdG8gcGFyZW50IGNsb2NrIHNvdXJjZSwgb3IKLSAqIHZhbGlkIElTX0VSUigpIGNvbmRpdGlvbiBjb250YWluaW5nIGVycm5vLgotICovCi1zdHJ1Y3QgY2xrICpjbGtfZ2V0X3BhcmVudChzdHJ1Y3QgY2xrICpjbGspOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9oYXJkd2FyZS9zaGFycHNsX3BtLmggYi9pbmNsdWRlL2FzbS1hcm0vaGFyZHdhcmUvc2hhcnBzbF9wbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OTgzZTUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vaGFyZHdhcmUvc2hhcnBzbF9wbS5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBTaGFycFNMIEJhdHRlcnkvUE0gRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgUmljaGFyZCBQdXJkaWUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKK3N0cnVjdCBzaGFycHNsX2NoYXJnZXJfbWFjaGluZm8geworCXZvaWQgKCppbml0KSh2b2lkKTsKKwl2b2lkICgqZXhpdCkodm9pZCk7CisJaW50IGdwaW9fYWNpbjsKKwlpbnQgZ3Bpb19iYXRmdWxsOworCWludCBncGlvX2JhdGxvY2s7CisJaW50IGdwaW9fZmF0YWw7CisJdm9pZCAoKmRpc2NoYXJnZSkoaW50KTsKKwl2b2lkICgqZGlzY2hhcmdlMSkoaW50KTsKKwl2b2lkICgqY2hhcmdlKShpbnQpOworCXZvaWQgKCptZWFzdXJlX3RlbXApKGludCk7CisJdm9pZCAoKnByZXN1c3BlbmQpKHZvaWQpOworCXZvaWQgKCpwb3N0c3VzcGVuZCkodm9pZCk7CisJdW5zaWduZWQgbG9uZyAoKnJlYWRfZGV2ZGF0YSkoaW50KTsKKyNkZWZpbmUgU0hBUlBTTF9CQVRUX1ZPTFQgICAgICAgMQorI2RlZmluZSBTSEFSUFNMX0JBVFRfVEVNUCAgICAgICAyCisjZGVmaW5lIFNIQVJQU0xfQUNJTl9WT0xUICAgICAgIDMKKyNkZWZpbmUgU0hBUlBTTF9TVEFUVVNfQUNJTiAgICAgNAorI2RlZmluZSBTSEFSUFNMX1NUQVRVU19MT0NLICAgICA1CisjZGVmaW5lIFNIQVJQU0xfU1RBVFVTX0NIUkdGVUxMIDYKKyNkZWZpbmUgU0hBUlBTTF9TVEFUVVNfRkFUQUwgICAgNworCXVuc2lnbmVkIGxvbmcgKCpjaGFyZ2VyX3dha2V1cCkodm9pZCk7CisJaW50ICgqc2hvdWxkX3dha2V1cCkodW5zaWduZWQgaW50IHJlc3VtZV9vbl9hbGFybSk7CisJaW50IGJhdF9sZXZlbHM7CisJc3RydWN0IGJhdHRlcnlfdGhyZXNoICpiYXRfbGV2ZWxzX25vYWM7CisJc3RydWN0IGJhdHRlcnlfdGhyZXNoICpiYXRfbGV2ZWxzX2FjaW47CisJaW50IHN0YXR1c19oaWdoX2FjaW47CisJaW50IHN0YXR1c19sb3dfYWNpbjsKKwlpbnQgc3RhdHVzX2hpZ2hfbm9hYzsKKwlpbnQgc3RhdHVzX2xvd19ub2FjOworfTsKKworc3RydWN0IGJhdHRlcnlfdGhyZXNoIHsKKwlpbnQgdm9sdGFnZTsKKwlpbnQgcGVyY2VudGFnZTsKK307CisKK3N0cnVjdCBiYXR0ZXJ5X3N0YXQgeworCWludCBhY19zdGF0dXM7ICAgICAgICAgLyogQVBNIEFDIFByZXNlbnQvTm90IFByZXNlbnQgKi8KKwlpbnQgbWFpbmJhdF9zdGF0dXM7ICAgIC8qIEFQTSBNYWluIEJhdHRlcnkgU3RhdHVzICovCisJaW50IG1haW5iYXRfcGVyY2VudDsgICAvKiBNYWluIEJhdHRlcnkgUGVyY2VudGFnZSBDaGFyZ2UgKi8KKwlpbnQgbWFpbmJhdF92b2x0YWdlOyAgIC8qIE1haW4gQmF0dGVyeSBWb2x0YWdlICovCit9OworCitzdHJ1Y3Qgc2hhcnBzbF9wbV9zdGF0dXMgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBhY190aW1lcjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBjaHJnX2Z1bGxfdGltZXI7CisKKwlpbnQgY2hhcmdlX21vZGU7CisjZGVmaW5lIENIUkdfRVJST1IgICAgKC0xKQorI2RlZmluZSBDSFJHX09GRiAgICAgICgwKQorI2RlZmluZSBDSFJHX09OICAgICAgICgxKQorI2RlZmluZSBDSFJHX0RPTkUgICAgICgyKQorCisJdW5zaWduZWQgaW50IGZsYWdzOworI2RlZmluZSBTSEFSUFNMX1NVU1BFTkRFRCAgICAgICAoMSA8PCAwKSAgLyogRGV2aWNlIGlzIFN1c3BlbmRlZCAqLworI2RlZmluZSBTSEFSUFNMX0FMQVJNX0FDVElWRSAgICAoMSA8PCAxKSAgLyogQWxhcm0gaXMgZm9yIGNoYXJnaW5nIGV2ZW50IChub3QgdXNlcikgKi8KKyNkZWZpbmUgU0hBUlBTTF9CTF9MSU1JVCAgICAgICAgKDEgPDwgMikgIC8qIEJhY2tsaWdodCBJbnRlbnNpdHkgTGltaXRlZCAqLworI2RlZmluZSBTSEFSUFNMX0FQTV9RVUVVRUQgICAgICAoMSA8PCAzKSAgLyogQVBNIEV2ZW50IFF1ZXVlZCAqLworI2RlZmluZSBTSEFSUFNMX0RPX09GRkxJTkVfQ0hSRyAoMSA8PCA0KSAgLyogVHJpZ2dlciB0aGUgb2ZmbGluZSBjaGFyZ2VyICovCisKKwlpbnQgZnVsbF9jb3VudDsKKwl1bnNpZ25lZCBsb25nIGNoYXJnZV9zdGFydF90aW1lOworCXN0cnVjdCBzaGFycHNsX2NoYXJnZXJfbWFjaGluZm8gKm1hY2hpbmZvOworCXN0cnVjdCBiYXR0ZXJ5X3N0YXQgYmF0dHN0YXQ7Cit9OworCitleHRlcm4gc3RydWN0IHNoYXJwc2xfcG1fc3RhdHVzIHNoYXJwc2xfcG07CisKKworI2RlZmluZSBTSEFSUFNMX0xFRF9FUlJPUiAgMgorI2RlZmluZSBTSEFSUFNMX0xFRF9PTiAgICAgMQorI2RlZmluZSBTSEFSUFNMX0xFRF9PRkYgICAgMAorCit2b2lkIHNoYXJwc2xfYmF0dGVyeV9raWNrKHZvaWQpOwordm9pZCBzaGFycHNsX3BtX2xlZChpbnQgdmFsKTsKK2lycXJldHVybl90IHNoYXJwc2xfYWNfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKK2lycXJldHVybl90IHNoYXJwc2xfY2hyZ19mdWxsX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCk7CitpcnFyZXR1cm5fdCBzaGFycHNsX2ZhdGFsX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCk7CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9oYXJkd2FyZS92aWMuaCBiL2luY2x1ZGUvYXNtLWFybS9oYXJkd2FyZS92aWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTgyNWViCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2hhcmR3YXJlL3ZpYy5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL2hhcmR3YXJlL3ZpYy5oCisgKgorICogIENvcHlyaWdodCAoYykgQVJNIExpbWl0ZWQgMjAwMy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaWZuZGVmIF9fQVNNX0FSTV9IQVJEV0FSRV9WSUNfSAorI2RlZmluZSBfX0FTTV9BUk1fSEFSRFdBUkVfVklDX0gKKworI2RlZmluZSBWSUNfSVJRX1NUQVRVUwkJCTB4MDAKKyNkZWZpbmUgVklDX0ZJUV9TVEFUVVMJCQkweDA0CisjZGVmaW5lIFZJQ19SQVdfU1RBVFVTCQkJMHgwOAorI2RlZmluZSBWSUNfSU5UX1NFTEVDVAkJCTB4MGMJLyogMSA9IEZJUSwgMCA9IElSUSAqLworI2RlZmluZSBWSUNfSU5UX0VOQUJMRQkJCTB4MTAJLyogMSA9IGVuYWJsZSwgMCA9IGRpc2FibGUgKi8KKyNkZWZpbmUgVklDX0lOVF9FTkFCTEVfQ0xFQVIJCTB4MTQKKyNkZWZpbmUgVklDX0lOVF9TT0ZUCQkJMHgxOAorI2RlZmluZSBWSUNfSU5UX1NPRlRfQ0xFQVIJCTB4MWMKKyNkZWZpbmUgVklDX1BST1RFQ1QJCQkweDIwCisjZGVmaW5lIFZJQ19WRUNUX0FERFIJCQkweDMwCisjZGVmaW5lIFZJQ19ERUZfVkVDVF9BRERSCQkweDM0CisKKyNkZWZpbmUgVklDX1ZFQ1RfQUREUjAJCQkweDEwMAkvKiAwIHRvIDE1ICovCisjZGVmaW5lIFZJQ19WRUNUX0NOVEwwCQkJMHgyMDAJLyogMCB0byAxNSAqLworI2RlZmluZSBWSUNfSVRDUgkJCTB4MzAwCS8qIFZJQyB0ZXN0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBWSUNfVkVDVF9DTlRMX0VOQUJMRQkJKDEgPDwgNSkKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KK3ZvaWQgdmljX2luaXQodm9pZCBfX2lvbWVtICpiYXNlLCB1MzIgdmljX3NvdXJjZXMpOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2lvLmggYi9pbmNsdWRlL2FzbS1hcm0vaW8uaAppbmRleCAwY2Y0ZDRmLi5mZDAxNDdlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vaW8uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vaW8uaApAQCAtNTYsNyArNTYsMTIgQEAKIAogLyoKICAqIEFyY2hpdGVjdHVyZSBpb3JlbWFwIGltcGxlbWVudGF0aW9uLgorICoKKyAqIF9faW9yZW1hcCB0YWtlcyBDUFUgcGh5c2ljYWwgYWRkcmVzcy4KKyAqCisgKiBfX2lvcmVtYXBfcGZuIHRha2VzIGEgUGFnZSBGcmFtZSBOdW1iZXIgYW5kIGFuIG9mZnNldCBpbnRvIHRoYXQgcGFnZQogICovCitleHRlcm4gdm9pZCBfX2lvbWVtICogX19pb3JlbWFwX3Bmbih1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBzaXplX3QsIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIHZvaWQgX19pb21lbSAqIF9faW9yZW1hcCh1bnNpZ25lZCBsb25nLCBzaXplX3QsIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIHZvaWQgX19pb3VubWFwKHZvaWQgX19pb21lbSAqYWRkcik7CiAKQEAgLTI2MSw2ICsyNjYsNyBAQAogICoKICAqIGlvcmVtYXAgdGFrZXMgYSBQQ0kgbWVtb3J5IGFkZHJlc3MsIGFzIHNwZWNpZmllZCBpbgogICogRG9jdW1lbnRhdGlvbi9JTy1tYXBwaW5nLnR4dC4KKyAqCiAgKi8KICNpZm5kZWYgX19hcmNoX2lvcmVtYXAKICNkZWZpbmUgaW9yZW1hcChjb29raWUsc2l6ZSkJCV9faW9yZW1hcChjb29raWUsc2l6ZSwwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2lvY3RsLmggYi9pbmNsdWRlL2FzbS1hcm0vaW9jdGwuaAppbmRleCAyY2JiN2QwLi5iMjc5ZmUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vaW9jdGwuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vaW9jdGwuaApAQCAtMSw3NCArMSBAQAotLyoKLSAqIGxpbnV4L2lvY3RsLmggZm9yIExpbnV4IGJ5IEguSC4gQmVyZ21hbi4KLSAqLwotCi0jaWZuZGVmIF9BU01BUk1fSU9DVExfSAotI2RlZmluZSBfQVNNQVJNX0lPQ1RMX0gKLQotLyogaW9jdGwgY29tbWFuZCBlbmNvZGluZzogMzIgYml0cyB0b3RhbCwgY29tbWFuZCBpbiBsb3dlciAxNiBiaXRzLAotICogc2l6ZSBvZiB0aGUgcGFyYW1ldGVyIHN0cnVjdHVyZSBpbiB0aGUgbG93ZXIgMTQgYml0cyBvZiB0aGUKLSAqIHVwcGVyIDE2IGJpdHMuCi0gKiBFbmNvZGluZyB0aGUgc2l6ZSBvZiB0aGUgcGFyYW1ldGVyIHN0cnVjdHVyZSBpbiB0aGUgaW9jdGwgcmVxdWVzdAotICogaXMgdXNlZnVsIGZvciBjYXRjaGluZyBwcm9ncmFtcyBjb21waWxlZCB3aXRoIG9sZCB2ZXJzaW9ucwotICogYW5kIHRvIGF2b2lkIG92ZXJ3cml0aW5nIHVzZXIgc3BhY2Ugb3V0c2lkZSB0aGUgdXNlciBidWZmZXIgYXJlYS4KLSAqIFRoZSBoaWdoZXN0IDIgYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIGluZGljYXRpbmcgdGhlIGBgYWNjZXNzIG1vZGUnJy4KLSAqIE5PVEU6IFRoaXMgbGltaXRzIHRoZSBtYXggcGFyYW1ldGVyIHNpemUgdG8gMTZrQiAtMSAhCi0gKi8KLQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgaXMgZm9yIGNvbXBhdGliaWxpdHkgYWNyb3NzIHRoZSB2YXJpb3VzIExpbnV4Ci0gKiBwbGF0Zm9ybXMuICBUaGUgaTM4NiBpb2N0bCBudW1iZXJpbmcgc2NoZW1lIGRvZXNuJ3QgcmVhbGx5IGVuZm9yY2UKLSAqIGEgdHlwZSBmaWVsZC4gIERlIGZhY3RvLCBob3dldmVyLCB0aGUgdG9wIDggYml0cyBvZiB0aGUgbG93ZXIgMTYKLSAqIGJpdHMgYXJlIGluZGVlZCB1c2VkIGFzIGEgdHlwZSBmaWVsZCwgc28gd2UgbWlnaHQganVzdCBhcyB3ZWxsIG1ha2UKLSAqIHRoaXMgZXhwbGljaXQgaGVyZS4gIFBsZWFzZSBiZSBzdXJlIHRvIHVzZSB0aGUgZGVjb2RpbmcgbWFjcm9zCi0gKiBiZWxvdyBmcm9tIG5vdyBvbi4KLSAqLwotI2RlZmluZSBfSU9DX05SQklUUwk4Ci0jZGVmaW5lIF9JT0NfVFlQRUJJVFMJOAotI2RlZmluZSBfSU9DX1NJWkVCSVRTCTE0Ci0jZGVmaW5lIF9JT0NfRElSQklUUwkyCi0KLSNkZWZpbmUgX0lPQ19OUk1BU0sJKCgxIDw8IF9JT0NfTlJCSVRTKS0xKQotI2RlZmluZSBfSU9DX1RZUEVNQVNLCSgoMSA8PCBfSU9DX1RZUEVCSVRTKS0xKQotI2RlZmluZSBfSU9DX1NJWkVNQVNLCSgoMSA8PCBfSU9DX1NJWkVCSVRTKS0xKQotI2RlZmluZSBfSU9DX0RJUk1BU0sJKCgxIDw8IF9JT0NfRElSQklUUyktMSkKLQotI2RlZmluZSBfSU9DX05SU0hJRlQJMAotI2RlZmluZSBfSU9DX1RZUEVTSElGVAkoX0lPQ19OUlNISUZUK19JT0NfTlJCSVRTKQotI2RlZmluZSBfSU9DX1NJWkVTSElGVAkoX0lPQ19UWVBFU0hJRlQrX0lPQ19UWVBFQklUUykKLSNkZWZpbmUgX0lPQ19ESVJTSElGVAkoX0lPQ19TSVpFU0hJRlQrX0lPQ19TSVpFQklUUykKLQotLyoKLSAqIERpcmVjdGlvbiBiaXRzLgotICovCi0jZGVmaW5lIF9JT0NfTk9ORQkwVQotI2RlZmluZSBfSU9DX1dSSVRFCTFVCi0jZGVmaW5lIF9JT0NfUkVBRAkyVQotCi0jZGVmaW5lIF9JT0MoZGlyLHR5cGUsbnIsc2l6ZSkgXAotCSgoKGRpcikgIDw8IF9JT0NfRElSU0hJRlQpIHwgXAotCSAoKHR5cGUpIDw8IF9JT0NfVFlQRVNISUZUKSB8IFwKLQkgKChucikgICA8PCBfSU9DX05SU0hJRlQpIHwgXAotCSAoKHNpemUpIDw8IF9JT0NfU0laRVNISUZUKSkKLQotLyogdXNlZCB0byBjcmVhdGUgbnVtYmVycyAqLwotI2RlZmluZSBfSU8odHlwZSxucikJCV9JT0MoX0lPQ19OT05FLCh0eXBlKSwobnIpLDApCi0jZGVmaW5lIF9JT1IodHlwZSxucixzaXplKQlfSU9DKF9JT0NfUkVBRCwodHlwZSksKG5yKSxzaXplb2Yoc2l6ZSkpCi0jZGVmaW5lIF9JT1codHlwZSxucixzaXplKQlfSU9DKF9JT0NfV1JJVEUsKHR5cGUpLChuciksc2l6ZW9mKHNpemUpKQotI2RlZmluZSBfSU9XUih0eXBlLG5yLHNpemUpCV9JT0MoX0lPQ19SRUFEfF9JT0NfV1JJVEUsKHR5cGUpLChuciksc2l6ZW9mKHNpemUpKQotCi0vKiB1c2VkIHRvIGRlY29kZSBpb2N0bCBudW1iZXJzLi4gKi8KLSNkZWZpbmUgX0lPQ19ESVIobnIpCQkoKChucikgPj4gX0lPQ19ESVJTSElGVCkgJiBfSU9DX0RJUk1BU0spCi0jZGVmaW5lIF9JT0NfVFlQRShucikJCSgoKG5yKSA+PiBfSU9DX1RZUEVTSElGVCkgJiBfSU9DX1RZUEVNQVNLKQotI2RlZmluZSBfSU9DX05SKG5yKQkJKCgobnIpID4+IF9JT0NfTlJTSElGVCkgJiBfSU9DX05STUFTSykKLSNkZWZpbmUgX0lPQ19TSVpFKG5yKQkJKCgobnIpID4+IF9JT0NfU0laRVNISUZUKSAmIF9JT0NfU0laRU1BU0spCi0KLS8qIC4uLmFuZCBmb3IgdGhlIGRyaXZlcnMvc291bmQgZmlsZXMuLi4gKi8KLQotI2RlZmluZSBJT0NfSU4JCShfSU9DX1dSSVRFIDw8IF9JT0NfRElSU0hJRlQpCi0jZGVmaW5lIElPQ19PVVQJCShfSU9DX1JFQUQgPDwgX0lPQ19ESVJTSElGVCkKLSNkZWZpbmUgSU9DX0lOT1VUCSgoX0lPQ19XUklURXxfSU9DX1JFQUQpIDw8IF9JT0NfRElSU0hJRlQpCi0jZGVmaW5lIElPQ1NJWkVfTUFTSwkoX0lPQ19TSVpFTUFTSyA8PCBfSU9DX1NJWkVTSElGVCkKLSNkZWZpbmUgSU9DU0laRV9TSElGVAkoX0lPQ19TSVpFU0hJRlQpCi0KLSNlbmRpZiAvKiBfQVNNQVJNX0lPQ1RMX0ggKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pb2N0bC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2lycS5oIGIvaW5jbHVkZS9hc20tYXJtL2lycS5oCmluZGV4IDU5OTc1ZWUuLjc3NzI0MzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vaXJxLmgKQEAgLTI1LDEwICsyNSwxNCBAQAogZXh0ZXJuIHZvaWQgZGlzYWJsZV9pcnEodW5zaWduZWQgaW50KTsKIGV4dGVybiB2b2lkIGVuYWJsZV9pcnEodW5zaWduZWQgaW50KTsKIAotI2RlZmluZSBfX0lSUVRfRkFMRURHRQkoMSA8PCAwKQotI2RlZmluZSBfX0lSUVRfUklTRURHRQkoMSA8PCAxKQotI2RlZmluZSBfX0lSUVRfTE9XTFZMCSgxIDw8IDIpCi0jZGVmaW5lIF9fSVJRVF9ISUdITFZMCSgxIDw8IDMpCisvKgorICogVGhlc2UgY29ycmVzcG9uZCB3aXRoIHRoZSBTQV9UUklHR0VSXyogZGVmaW5lcywgYW5kIHRoZXJlZm9yZSB0aGUKKyAqIElSUVJFU09VUkNFX0lSUV8qIGRlZmluZXMuCisgKi8KKyNkZWZpbmUgX19JUlFUX1JJU0VER0UJKDEgPDwgMCkKKyNkZWZpbmUgX19JUlFUX0ZBTEVER0UJKDEgPDwgMSkKKyNkZWZpbmUgX19JUlFUX0hJR0hMVkwJKDEgPDwgMikKKyNkZWZpbmUgX19JUlFUX0xPV0xWTAkoMSA8PCAzKQogCiAjZGVmaW5lIElSUVRfTk9FREdFCSgwKQogI2RlZmluZSBJUlFUX1JJU0lORwkoX19JUlFUX1JJU0VER0UpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vbWFjaC9hcmNoLmggYi9pbmNsdWRlL2FzbS1hcm0vbWFjaC9hcmNoLmgKaW5kZXggZWIyNjJlMDcuLjJjZDU3YjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9tYWNoL2FyY2guaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vbWFjaC9hcmNoLmgKQEAgLTEwLDYgKzEwLDggQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisKIHN0cnVjdCB0YWc7CiBzdHJ1Y3QgbWVtaW5mbzsKIHN0cnVjdCBzeXNfdGltZXI7CkBAIC0yMCw3ICsyMiw3IEBACiAJICogYnkgYXNzZW1ibGVyIGNvZGUgaW4gaGVhZC1hcm12LlMKIAkgKi8KIAl1bnNpZ25lZCBpbnQJCW5yOwkJLyogYXJjaGl0ZWN0dXJlIG51bWJlcgkqLwotCXVuc2lnbmVkIGludAkJcGh5c19yYW07CS8qIHN0YXJ0IG9mIHBoeXNpY2FsIHJhbSAqLworCXVuc2lnbmVkIGludCBfX2RlcHJlY2F0ZWQgcGh5c19yYW07CS8qIHN0YXJ0IG9mIHBoeXNpY2FsIHJhbSAqLwogCXVuc2lnbmVkIGludAkJcGh5c19pbzsJLyogc3RhcnQgb2YgcGh5c2ljYWwgaW8JKi8KIAl1bnNpZ25lZCBpbnQJCWlvX3BnX29mZnN0OwkvKiBieXRlIG9mZnNldCBmb3IgaW8gCiAJCQkJCQkgKiBwYWdlIHRhYmUgZW50cnkJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9tYWNoL2RtYS5oIGIvaW5jbHVkZS9hc20tYXJtL21hY2gvZG1hLmgKaW5kZXggMzFiZjcxNi4uZTdjNGEyMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL21hY2gvZG1hLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL21hY2gvZG1hLmgKQEAgLTI1LDEzICsyNSwxNSBAQAogfTsKIAogc3RydWN0IGRtYV9zdHJ1Y3QgeworCXZvaWQJCSphZGRyOwkJLyogc2luZ2xlIERNQSBhZGRyZXNzCQkqLworCXVuc2lnbmVkIGxvbmcJY291bnQ7CQkvKiBzaW5nbGUgRE1BIHNpemUJCSovCiAJc3RydWN0IHNjYXR0ZXJsaXN0IGJ1ZjsJCS8qIHNpbmdsZSBETUEJCQkqLwogCWludAkJc2djb3VudDsJLyogbnVtYmVyIG9mIERNQSBTRwkJKi8KIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwkJLyogRE1BIFNjYXR0ZXItR2F0aGVyIExpc3QJKi8KIAogCXVuc2lnbmVkIGludAlhY3RpdmU6MTsJLyogVHJhbnNmZXIgYWN0aXZlCQkqLwogCXVuc2lnbmVkIGludAlpbnZhbGlkOjE7CS8qIEFkZHJlc3MvQ291bnQgY2hhbmdlZAkqLwotCXVuc2lnbmVkIGludAl1c2luZ19zZzoxOwkvKiB1c2luZyBzY2F0dGVyIGxpc3Q/CQkqLworCiAJZG1hbW9kZV90CWRtYV9tb2RlOwkvKiBETUEgbW9kZQkJCSovCiAJaW50CQlzcGVlZDsJCS8qIERNQSBzcGVlZAkJCSovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9tYWNoL21hcC5oIGIvaW5jbHVkZS9hc20tYXJtL21hY2gvbWFwLmgKaW5kZXggYjMzODkzNi4uMzM1MWI3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL21hY2gvbWFwLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL21hY2gvbWFwLmgKQEAgLTI3LDkgKzI3LDYgQEAKICNkZWZpbmUgTVRfUk9NCQkJNgogI2RlZmluZSBNVF9JWFAyMDAwX0RFVklDRQk3CiAKLSNkZWZpbmUJX19waHlzX3RvX3BmbihwYWRkcikJKChwYWRkcikgPj4gUEFHRV9TSElGVCkKLSNkZWZpbmUJX19wZm5fdG9fcGh5cyhwZm4pCSgocGZuKSA8PCBQQUdFX1NISUZUKQotCiBleHRlcm4gdm9pZCBjcmVhdGVfbWVtbWFwX2hvbGVzKHN0cnVjdCBtZW1pbmZvICopOwogZXh0ZXJuIHZvaWQgbWVtdGFibGVfaW5pdChzdHJ1Y3QgbWVtaW5mbyAqKTsKIGV4dGVybiB2b2lkIGlvdGFibGVfaW5pdChzdHJ1Y3QgbWFwX2Rlc2MgKiwgaW50KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9tYWNoL3NlcmlhbF9hdDkxcm05MjAwLmggYi9pbmNsdWRlL2FzbS1hcm0vbWFjaC9zZXJpYWxfYXQ5MXJtOTIwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZjRiMGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vbWFjaC9zZXJpYWxfYXQ5MXJtOTIwMC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL21hY2gvc2VyaWFsX2F0OTFybTkyMDAuaAorICoKKyAqICBCYXNlZCBvbiBzZXJpYWxfc2ExMTAwLmggIGJ5IE5pY29sYXMgUGl0cmUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEFUTUVMIFJvdXNzZXQKKyAqCisgKiAgTG93IGxldmVsIG1hY2hpbmUgZGVwZW5kZW50IFVBUlQgZnVuY3Rpb25zLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKK3N0cnVjdCB1YXJ0X3BvcnQ7CisKKy8qCisgKiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHN0cnVjdHVyZSBmb3IgcmVnaXN0ZXJpbmcgdGhlc2UKKyAqIGZ1bmN0aW9uczsgaXQgaXMgaW50ZW5kZWQgdG8gYmUgZGlzY2FyZGVkIGFmdGVyIGJvb3QuCisgKi8KK3N0cnVjdCBhdDkxcm05MjAwX3BvcnRfZm5zIHsKKwl2b2lkCSgqc2V0X21jdHJsKShzdHJ1Y3QgdWFydF9wb3J0ICosIHVfaW50KTsKKwl1X2ludAkoKmdldF9tY3RybCkoc3RydWN0IHVhcnRfcG9ydCAqKTsKKwl2b2lkCSgqZW5hYmxlX21zKShzdHJ1Y3QgdWFydF9wb3J0ICopOworCXZvaWQJKCpwbSkoc3RydWN0IHVhcnRfcG9ydCAqLCB1X2ludCwgdV9pbnQpOworCWludAkoKnNldF93YWtlKShzdHJ1Y3QgdWFydF9wb3J0ICosIHVfaW50KTsKKwlpbnQJKCpvcGVuKShzdHJ1Y3QgdWFydF9wb3J0ICopOworCXZvaWQJKCpjbG9zZSkoc3RydWN0IHVhcnRfcG9ydCAqKTsKK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQVQ5MSkKK3ZvaWQgYXQ5MV9yZWdpc3Rlcl91YXJ0X2ZucyhzdHJ1Y3QgYXQ5MXJtOTIwMF9wb3J0X2ZucyAqZm5zKTsKK3ZvaWQgYXQ5MV9yZWdpc3Rlcl91YXJ0KGludCBpZHgsIGludCBwb3J0KTsKKyNlbHNlCisjZGVmaW5lIGF0OTFfcmVnaXN0ZXJfdWFydF9mbnMoZm5zKSBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGF0OTFfcmVnaXN0ZXJfdWFydChpZHgscG9ydCkgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL21lbW9yeS5oIGIvaW5jbHVkZS9hc20tYXJtL21lbW9yeS5oCmluZGV4IDNlNTcyMzYuLmI0ZTExNDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9tZW1vcnkuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vbWVtb3J5LmgKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL21lbW9yeS5oPgorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgogCiAjaWZuZGVmIFRBU0tfU0laRQogLyoKQEAgLTQ4LDYgKzQ5LDE0IEBACiAjZW5kaWYKIAogLyoKKyAqIFNpemUgb2YgRE1BLWNvbnNpc3RlbnQgbWVtb3J5IHJlZ2lvbi4gIE11c3QgYmUgbXVsdGlwbGUgb2YgMk0sCisgKiBiZXR3ZWVuIDJNQiBhbmQgMTRNQiBpbmNsdXNpdmUuCisgKi8KKyNpZm5kZWYgQ09OU0lTVEVOVF9ETUFfU0laRQorI2RlZmluZSBDT05TSVNURU5UX0RNQV9TSVpFIFNaXzJNCisjZW5kaWYKKworLyoKICAqIFBoeXNpY2FsIHZzIHZpcnR1YWwgUkFNIGFkZHJlc3Mgc3BhY2UgY29udmVyc2lvbi4gIFRoZXNlIGFyZQogICogcHJpdmF0ZSBkZWZpbml0aW9ucyB3aGljaCBzaG91bGQgTk9UIGJlIHVzZWQgb3V0c2lkZSBtZW1vcnkuaAogICogZmlsZXMuICBVc2UgdmlydF90b19waHlzL3BoeXNfdG9fdmlydC9fX3BhL19fdmEgaW5zdGVhZC4KQEAgLTU4LDYgKzY3LDEyIEBACiAjZW5kaWYKIAogLyoKKyAqIENvbnZlcnQgYSBwaHlzaWNhbCBhZGRyZXNzIHRvIGEgUGFnZSBGcmFtZSBOdW1iZXIgYW5kIGJhY2sKKyAqLworI2RlZmluZQlfX3BoeXNfdG9fcGZuKHBhZGRyKQkoKHBhZGRyKSA+PiBQQUdFX1NISUZUKQorI2RlZmluZQlfX3Bmbl90b19waHlzKHBmbikJKChwZm4pIDw8IFBBR0VfU0hJRlQpCisKKy8qCiAgKiBUaGUgbW9kdWxlIHNwYWNlIGxpdmVzIGJldHdlZW4gdGhlIGFkZHJlc3NlcyBnaXZlbiBieSBUQVNLX1NJWkUKICAqIGFuZCBQQUdFX09GRlNFVCAtIGl0IG11c3QgYmUgd2l0aGluIDMyTUIgb2YgdGhlIGtlcm5lbCB0ZXh0LgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vbXV0ZXguaCBiL2luY2x1ZGUvYXNtLWFybS9tdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYWE1OWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vbXV0ZXguaApAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLWFybS9tdXRleC5oCisgKgorICogQVJNIG9wdGltaXplZCBtdXRleCBsb2NraW5nIHByaW1pdGl2ZXMKKyAqCisgKiBQbGVhc2UgbG9vayBpbnRvIGFzbS1nZW5lcmljL211dGV4LXhjaGcuaCBmb3IgYSBmb3JtYWwgZGVmaW5pdGlvbi4KKyAqLworI2lmbmRlZiBfQVNNX01VVEVYX0gKKyNkZWZpbmUgX0FTTV9NVVRFWF9ICisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPCA2CisvKiBPbiBwcmUtQVJNdjYgaGFyZHdhcmUgdGhlIHN3cCBiYXNlZCBpbXBsZW1lbnRhdGlvbiBpcyB0aGUgbW9zdCBlZmZpY2llbnQuICovCisjIGluY2x1ZGUgPGFzbS1nZW5lcmljL211dGV4LXhjaGcuaD4KKyNlbHNlCisKKy8qCisgKiBBdHRlbXB0aW5nIHRvIGxvY2sgYSBtdXRleCBvbiBBUk12NisgY2FuIGJlIGRvbmUgd2l0aCBhIGJhc3RhcmRpemVkCisgKiBhdG9taWMgZGVjcmVtZW50IChpdCBpcyBub3QgYSByZWxpYWJsZSBhdG9taWMgZGVjcmVtZW50IGJ1dCBpdCBzYXRpc2ZpZXMKKyAqIHRoZSBkZWZpbmVkIHNlbWFudGljcyBmb3Igb3VyIHB1cnBvc2UsIHdoaWxlIGJlaW5nIHNtYWxsZXIgYW5kIGZhc3RlcgorICogdGhhbiBhIHJlYWwgYXRvbWljIGRlY3JlbWVudCBvciBhdG9taWMgc3dhcC4gIFRoZSBpZGVhIGlzIHRvIGF0dGVtcHQKKyAqIGRlY3JlbWVudGluZyB0aGUgbG9jayB2YWx1ZSBvbmx5IG9uY2UuICBJZiBvbmNlIGRlY3JlbWVudGVkIGl0IGlzbid0IHplcm8sCisgKiBvciBpZiBpdHMgc3RvcmUtYmFjayBmYWlscyBkdWUgdG8gYSBkaXNwdXRlIG9uIHRoZSBleGNsdXNpdmUgc3RvcmUsIHdlCisgKiBzaW1wbHkgYmFpbCBvdXQgaW1tZWRpYXRlbHkgdGhyb3VnaCB0aGUgc2xvdyBwYXRoIHdoZXJlIHRoZSBsb2NrIHdpbGwgYmUKKyAqIHJlYXR0ZW1wdGVkIHVudGlsIGl0IHN1Y2NlZWRzLgorICovCisjZGVmaW5lIF9fbXV0ZXhfZmFzdHBhdGhfbG9jayhjb3VudCwgZmFpbF9mbikJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpbnQgX19leF9mbGFnLCBfX3JlczsJCQkJCQlcCisJCQkJCQkJCQlcCisJdHlwZWNoZWNrKGF0b21pY190ICosIGNvdW50KTsJCQkJCVwKKwl0eXBlY2hlY2tfZm4oZmFzdGNhbGwgdm9pZCAoKikoYXRvbWljX3QgKiksIGZhaWxfZm4pOwkJXAorCQkJCQkJCQkJXAorCV9fYXNtX18gKAkJCQkJCQlcCisJCSJsZHJleAklMCwgWyUyXQlcbiIJCQkJXAorCQkic3ViCSUwLCAlMCwgIzEJXG4iCQkJCVwKKwkJInN0cmV4CSUxLCAlMCwgWyUyXQlcbiIJCQkJXAorCQkJCQkJCQkJXAorCQk6ICI9JnIiIChfX3JlcyksICI9JnIiIChfX2V4X2ZsYWcpCQkJXAorCQk6ICJyIiAoJihjb3VudCktPmNvdW50ZXIpCQkJCVwKKwkJOiAiY2MiLCJtZW1vcnkiICk7CQkJCQlcCisJCQkJCQkJCQlcCisJaWYgKHVubGlrZWx5KF9fcmVzIHx8IF9fZXhfZmxhZykpCQkJCVwKKwkJZmFpbF9mbihjb3VudCk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX211dGV4X2Zhc3RwYXRoX2xvY2tfcmV0dmFsKGNvdW50LCBmYWlsX2ZuKQkJCVwKKyh7CQkJCQkJCQkJXAorCWludCBfX2V4X2ZsYWcsIF9fcmVzOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwl0eXBlY2hlY2soYXRvbWljX3QgKiwgY291bnQpOwkJCQkJXAorCXR5cGVjaGVja19mbihmYXN0Y2FsbCBpbnQgKCopKGF0b21pY190ICopLCBmYWlsX2ZuKTsJCVwKKwkJCQkJCQkJCVwKKwlfX2FzbV9fICgJCQkJCQkJXAorCQkibGRyZXgJJTAsIFslMl0JXG4iCQkJCVwKKwkJInN1YgklMCwgJTAsICMxCVxuIgkJCQlcCisJCSJzdHJleAklMSwgJTAsIFslMl0JXG4iCQkJCVwKKwkJCQkJCQkJCVwKKwkJOiAiPSZyIiAoX19yZXMpLCAiPSZyIiAoX19leF9mbGFnKQkJCVwKKwkJOiAiciIgKCYoY291bnQpLT5jb3VudGVyKQkJCQlcCisJCTogImNjIiwibWVtb3J5IiApOwkJCQkJXAorCQkJCQkJCQkJXAorCV9fcmVzIHw9IF9fZXhfZmxhZzsJCQkJCQlcCisJaWYgKHVubGlrZWx5KF9fcmVzICE9IDApKQkJCQkJXAorCQlfX3JlcyA9IGZhaWxfZm4oY291bnQpOwkJCQkJXAorCV9fcmVzOwkJCQkJCQkJXAorfSkKKworLyoKKyAqIFNhbWUgdHJpY2sgaXMgdXNlZCBmb3IgdGhlIHVubG9jayBmYXN0IHBhdGguIEhvd2V2ZXIgdGhlIG9yaWdpbmFsIHZhbHVlLAorICogcmF0aGVyIHRoYW4gdGhlIHJlc3VsdCwgaXMgdXNlZCB0byB0ZXN0IGZvciBzdWNjZXNzIGluIG9yZGVyIHRvIGhhdmUKKyAqIGJldHRlciBnZW5lcmF0ZWQgYXNzZW1ibHkuCisgKi8KKyNkZWZpbmUgX19tdXRleF9mYXN0cGF0aF91bmxvY2soY291bnQsIGZhaWxfZm4pCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaW50IF9fZXhfZmxhZywgX19yZXMsIF9fb3JpZzsJCQkJCVwKKwkJCQkJCQkJCVwKKwl0eXBlY2hlY2soYXRvbWljX3QgKiwgY291bnQpOwkJCQkJXAorCXR5cGVjaGVja19mbihmYXN0Y2FsbCB2b2lkICgqKShhdG9taWNfdCAqKSwgZmFpbF9mbik7CQlcCisJCQkJCQkJCQlcCisJX19hc21fXyAoCQkJCQkJCVwKKwkJImxkcmV4CSUwLCBbJTNdCVxuIgkJCQlcCisJCSJhZGQJJTEsICUwLCAjMQlcbiIJCQkJXAorCQkic3RyZXgJJTIsICUxLCBbJTNdCVxuIgkJCQlcCisJCQkJCQkJCQlcCisJCTogIj0mciIgKF9fb3JpZyksICI9JnIiIChfX3JlcyksICI9JnIiIChfX2V4X2ZsYWcpCVwKKwkJOiAiciIgKCYoY291bnQpLT5jb3VudGVyKQkJCQlcCisJCTogImNjIiwibWVtb3J5IiApOwkJCQkJXAorCQkJCQkJCQkJXAorCWlmICh1bmxpa2VseShfX29yaWcgfHwgX19leF9mbGFnKSkJCQkJXAorCQlmYWlsX2ZuKGNvdW50KTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisvKgorICogSWYgdGhlIHVubG9jayB3YXMgZG9uZSBvbiBhIGNvbnRlbmRlZCBsb2NrLCBvciBpZiB0aGUgdW5sb2NrIHNpbXBseSBmYWlscworICogdGhlbiB0aGUgbXV0ZXggcmVtYWlucyBsb2NrZWQuCisgKi8KKyNkZWZpbmUgX19tdXRleF9zbG93cGF0aF9uZWVkc190b191bmxvY2soKQkxCisKKy8qCisgKiBGb3IgX19tdXRleF9mYXN0cGF0aF90cnlsb2NrIHdlIHVzZSBhbm90aGVyIGNvbnN0cnVjdCB3aGljaCBjb3VsZCBiZQorICogZGVzY3JpYmVkIGFzIGEgInNpbmdsZSB2YWx1ZSBjbXB4Y2hnIi4KKyAqCisgKiBUaGlzIHByb3ZpZGVzIHRoZSBuZWVkZWQgdHJ5bG9jayBzZW1hbnRpY3MgbGlrZSBjbXB4Y2hnIHdvdWxkLCBidXQgaXQgaXMKKyAqIGxpZ2h0ZXIgYW5kIGxlc3MgZ2VuZXJpYyB0aGFuIGEgdHJ1ZSBjbXB4Y2hnIGltcGxlbWVudGF0aW9uLgorICovCitzdGF0aWMgaW5saW5lIGludAorX19tdXRleF9mYXN0cGF0aF90cnlsb2NrKGF0b21pY190ICpjb3VudCwgaW50ICgqZmFpbF9mbikoYXRvbWljX3QgKikpCit7CisJaW50IF9fZXhfZmxhZywgX19yZXMsIF9fb3JpZzsKKworCV9fYXNtX18gKAorCisJCSIxOiBsZHJleAklMCwgWyUzXQlcbiIKKwkJInN1YnMJCSUxLCAlMCwgIzEJXG4iCisJCSJzdHJleGVxCSUyLCAlMSwgWyUzXQlcbiIKKwkJIm1vdmx0CQklMCwgIzAJCVxuIgorCQkiY21wZXEJCSUyLCAjMAkJXG4iCisJCSJiZ3QJCTFiCQlcbiIKKworCQk6ICI9JnIiIChfX29yaWcpLCAiPSZyIiAoX19yZXMpLCAiPSZyIiAoX19leF9mbGFnKQorCQk6ICJyIiAoJmNvdW50LT5jb3VudGVyKQorCQk6ICJjYyIsICJtZW1vcnkiICk7CisKKwlyZXR1cm4gX19vcmlnOworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLWFybS9wYWdlLmgKaW5kZXggNGRhMWQ1My4uNDE2MzIwZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vcGFnZS5oCkBAIC0xNzAsNiArMTcwLDEzIEBACiAjZGVmaW5lIFZNX0RBVEFfREVGQVVMVF9GTEFHUwkoVk1fUkVBRCB8IFZNX1dSSVRFIHwgVk1fRVhFQyB8IFwKIAkJCQkgVk1fTUFZUkVBRCB8IFZNX01BWVdSSVRFIHwgVk1fTUFZRVhFQykKIAorLyoKKyAqIFdpdGggRUFCSSBvbiBBUk12NSBhbmQgYWJvdmUgd2UgbXVzdCBoYXZlIDY0LWJpdCBhbGlnbmVkIHNsYWIgcG9pbnRlcnMuCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19BRUFCSSkgJiYgKF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA1KQorI2RlZmluZSBBUkNIX1NMQUJfTUlOQUxJR04gOAorI2VuZGlmCisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wYWdlLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1hcm0vcHJvY2Vzc29yLmgKaW5kZXggN2Q0MTE4ZS4uMDRmNGQzNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9wcm9jZXNzb3IuaApAQCAtNDksNiArNDksMTIgQEAKIAogI2RlZmluZSBJTklUX1RIUkVBRCAgewl9CiAKKyNpZmRlZiBDT05GSUdfTU1VCisjZGVmaW5lIG5vbW11X3N0YXJ0X3RocmVhZChyZWdzKSBkbyB7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBub21tdV9zdGFydF90aHJlYWQocmVncykgcmVncy0+QVJNX3IxMCA9IGN1cnJlbnQtPm1tLT5zdGFydF9kYXRhCisjZW5kaWYKKwogI2RlZmluZSBzdGFydF90aHJlYWQocmVncyxwYyxzcCkJCQkJCVwKICh7CQkJCQkJCQkJXAogCXVuc2lnbmVkIGxvbmcgKnN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKilzcDsJCQlcCkBAIC02NSw2ICs3MSw3IEBACiAJcmVncy0+QVJNX3IyID0gc3RhY2tbMl07CS8qIHIyIChlbnZwKSAqLwkJCVwKIAlyZWdzLT5BUk1fcjEgPSBzdGFja1sxXTsJLyogcjEgKGFyZ3YpICovCQkJXAogCXJlZ3MtPkFSTV9yMCA9IHN0YWNrWzBdOwkvKiByMCAoYXJnYykgKi8JCQlcCisJbm9tbXVfc3RhcnRfdGhyZWFkKHJlZ3MpOwkJCQkJXAogfSkKIAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbiwgYSBzdHJhbmdlIEMgdGhpbmcgKi8KQEAgLTg1LDkgKzkyLDExIEBACiAgKi8KIGV4dGVybiBpbnQga2VybmVsX3RocmVhZChpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIAotI2RlZmluZSBLU1RLX1JFR1ModHNrKQkoKChzdHJ1Y3QgcHRfcmVncyAqKShUSFJFQURfU1RBUlRfU1AgKyAodW5zaWduZWQgbG9uZykodHNrKS0+dGhyZWFkX2luZm8pKSAtIDEpCi0jZGVmaW5lIEtTVEtfRUlQKHRzaykJS1NUS19SRUdTKHRzayktPkFSTV9wYwotI2RlZmluZSBLU1RLX0VTUCh0c2spCUtTVEtfUkVHUyh0c2spLT5BUk1fc3AKKyNkZWZpbmUgdGFza19wdF9yZWdzKHApIFwKKwkoKHN0cnVjdCBwdF9yZWdzICopKFRIUkVBRF9TVEFSVF9TUCArIHRhc2tfc3RhY2tfcGFnZShwKSkgLSAxKQorCisjZGVmaW5lIEtTVEtfRUlQKHRzaykJdGFza19wdF9yZWdzKHRzayktPkFSTV9wYworI2RlZmluZSBLU1RLX0VTUCh0c2spCXRhc2tfcHRfcmVncyh0c2spLT5BUk1fc3AKIAogLyoKICAqIFByZWZldGNoaW5nIHN1cHBvcnQgLSBvbmx5IEFSTXY1LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3B0cmFjZS5oIGIvaW5jbHVkZS9hc20tYXJtL3B0cmFjZS5oCmluZGV4IDQzNzdlMjIuLjc3YWRiN2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vcHRyYWNlLmgKQEAgLTIzLDYgKzIzLDkgQEAKICNkZWZpbmUgUFRSQUNFX09MRFNFVE9QVElPTlMJMjEKIAogI2RlZmluZSBQVFJBQ0VfR0VUX1RIUkVBRF9BUkVBCTIyCisKKyNkZWZpbmUgUFRSQUNFX1NFVF9TWVNDQUxMCTIzCisKIC8qCiAgKiBQU1IgYml0cwogICovCkBAIC02MCw5ICs2MywxMSBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCi0vKiB0aGlzIHN0cnVjdCBkZWZpbmVzIHRoZSB3YXkgdGhlIHJlZ2lzdGVycyBhcmUgc3RvcmVkIG9uIHRoZQotICAgc3RhY2sgZHVyaW5nIGEgc3lzdGVtIGNhbGwuICovCi0KKy8qCisgKiBUaGlzIHN0cnVjdCBkZWZpbmVzIHRoZSB3YXkgdGhlIHJlZ2lzdGVycyBhcmUgc3RvcmVkIG9uIHRoZQorICogc3RhY2sgZHVyaW5nIGEgc3lzdGVtIGNhbGwuICBOb3RlIHRoYXQgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKQorICogaGFzIHRvIGJlIGEgbXVsdGlwbGUgb2YgOC4KKyAqLwogc3RydWN0IHB0X3JlZ3MgewogCWxvbmcgdXJlZ3NbMThdOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9zY2F0dGVybGlzdC5oIGIvaW5jbHVkZS9hc20tYXJtL3NjYXR0ZXJsaXN0LmgKaW5kZXggODNiODc2Zi4uZGUyZjY1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3NjYXR0ZXJsaXN0LmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3NjYXR0ZXJsaXN0LmgKQEAgLTksNyArOSw2IEBACiAJdW5zaWduZWQgaW50CW9mZnNldDsJCS8qIGJ1ZmZlciBvZmZzZXQJCSAqLwogCWRtYV9hZGRyX3QJZG1hX2FkZHJlc3M7CS8qIGRtYSBhZGRyZXNzCQkJICovCiAJdW5zaWduZWQgaW50CWxlbmd0aDsJCS8qIGxlbmd0aAkJCSAqLwotCWNoYXIJCSpfX2FkZHJlc3M7CS8qIGZvciBzZXRfZG1hX2FkZHIJCSAqLwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9zdGF0LmggYi9pbmNsdWRlL2FzbS1hcm0vc3RhdC5oCmluZGV4IGVjNGUyYzIuLjQyYzBjMTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9zdGF0LmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3N0YXQuaApAQCAtNzAsMTQgKzcwLDcgQEAKIAogCWxvbmcgbG9uZwlzdF9zaXplOwogCXVuc2lnbmVkIGxvbmcJc3RfYmxrc2l6ZTsKLQotI2lmIGRlZmluZWQoX19BUk1FQl9fKQotCXVuc2lnbmVkIGxvbmcgICBfX3BhZDQ7CQkvKiBGdXR1cmUgcG9zc2libGUgc3RfYmxvY2tzIGhpIGJpdHMgKi8KLQl1bnNpZ25lZCBsb25nICAgc3RfYmxvY2tzOwkvKiBOdW1iZXIgNTEyLWJ5dGUgYmxvY2tzIGFsbG9jYXRlZC4gKi8KLSNlbHNlIC8qIE11c3QgYmUgbGl0dGxlICovCi0JdW5zaWduZWQgbG9uZyAgIHN0X2Jsb2NrczsJLyogTnVtYmVyIDUxMi1ieXRlIGJsb2NrcyBhbGxvY2F0ZWQuICovCi0JdW5zaWduZWQgbG9uZyAgIF9fcGFkNDsJCS8qIEZ1dHVyZSBwb3NzaWJsZSBzdF9ibG9ja3MgaGkgYml0cyAqLwotI2VuZGlmCisJdW5zaWduZWQgbG9uZyBsb25nIHN0X2Jsb2NrczsJLyogTnVtYmVyIDUxMi1ieXRlIGJsb2NrcyBhbGxvY2F0ZWQuICovCiAKIAl1bnNpZ25lZCBsb25nCXN0X2F0aW1lOwogCXVuc2lnbmVkIGxvbmcJc3RfYXRpbWVfbnNlYzsKQEAgLTg5LDYgKzgyLDYgQEAKIAl1bnNpZ25lZCBsb25nCXN0X2N0aW1lX25zZWM7CiAKIAl1bnNpZ25lZCBsb25nIGxvbmcJc3RfaW5vOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK307CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3N0YXRmcy5oIGIvaW5jbHVkZS9hc20tYXJtL3N0YXRmcy5oCmluZGV4IGU4MWY4MjcuLmEwMmU2YTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9zdGF0ZnMuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vc3RhdGZzLmgKQEAgLTEsNiArMSw0MiBAQAogI2lmbmRlZiBfQVNNQVJNX1NUQVRGU19ICiAjZGVmaW5lIF9BU01BUk1fU1RBVEZTX0gKIAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3N0YXRmcy5oPgorI2lmbmRlZiBfX0tFUk5FTF9TVFJJQ1RfTkFNRVMKKyMgaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KK3R5cGVkZWYgX19rZXJuZWxfZnNpZF90CWZzaWRfdDsKKyNlbmRpZgorCitzdHJ1Y3Qgc3RhdGZzIHsKKwlfX3UzMiBmX3R5cGU7CisJX191MzIgZl9ic2l6ZTsKKwlfX3UzMiBmX2Jsb2NrczsKKwlfX3UzMiBmX2JmcmVlOworCV9fdTMyIGZfYmF2YWlsOworCV9fdTMyIGZfZmlsZXM7CisJX191MzIgZl9mZnJlZTsKKwlfX2tlcm5lbF9mc2lkX3QgZl9mc2lkOworCV9fdTMyIGZfbmFtZWxlbjsKKwlfX3UzMiBmX2Zyc2l6ZTsKKwlfX3UzMiBmX3NwYXJlWzVdOworfTsKKworLyoKKyAqIFdpdGggRUFCSSB0aGVyZSBpcyA0IGJ5dGVzIG9mIHBhZGRpbmcgYWRkZWQgdG8gdGhpcyBzdHJ1Y3R1cmUuCisgKiBMZXQncyBwYWNrIGl0IHNvIHRoZSBwYWRkaW5nIGdvZXMgYXdheSB0byBzaW1wbGlmeSBkdWFsIEFCSSBzdXBwb3J0LgorICogTm90ZSB0aGF0IHVzZXIgc3BhY2UgZG9lcyBOT1QgaGF2ZSB0byBwYWNrIHRoaXMgc3RydWN0dXJlLgorICovCitzdHJ1Y3Qgc3RhdGZzNjQgeworCV9fdTMyIGZfdHlwZTsKKwlfX3UzMiBmX2JzaXplOworCV9fdTY0IGZfYmxvY2tzOworCV9fdTY0IGZfYmZyZWU7CisJX191NjQgZl9iYXZhaWw7CisJX191NjQgZl9maWxlczsKKwlfX3U2NCBmX2ZmcmVlOworCV9fa2VybmVsX2ZzaWRfdCBmX2ZzaWQ7CisJX191MzIgZl9uYW1lbGVuOworCV9fdTMyIGZfZnJzaXplOworCV9fdTMyIGZfc3BhcmVbNV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQsYWxpZ25lZCg0KSkpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLWFybS9zeXN0ZW0uaAppbmRleCA1NjIxZDYxLi5lYjJkZThjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3N5c3RlbS5oCkBAIC0xNjgsMTAgKzE2OCwyMCBAQAogCiAjZGVmaW5lIHN3aXRjaF90byhwcmV2LG5leHQsbGFzdCkJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCi0JbGFzdCA9IF9fc3dpdGNoX3RvKHByZXYscHJldi0+dGhyZWFkX2luZm8sbmV4dC0+dGhyZWFkX2luZm8pOwlcCisJbGFzdCA9IF9fc3dpdGNoX3RvKHByZXYsdGFza190aHJlYWRfaW5mbyhwcmV2KSwgdGFza190aHJlYWRfaW5mbyhuZXh0KSk7CVwKIH0gd2hpbGUgKDApCiAKIC8qCisgKiBPbiBTTVAgc3lzdGVtcywgd2hlbiB0aGUgc2NoZWR1bGVyIGRvZXMgbWlncmF0aW9uLWNvc3QgYXV0b2RldGVjdGlvbiwKKyAqIGl0IG5lZWRzIGEgd2F5IHRvIGZsdXNoIGFzIG11Y2ggb2YgdGhlIENQVSdzIGNhY2hlcyBhcyBwb3NzaWJsZS4KKyAqCisgKiBUT0RPOiBmaWxsIHRoaXMgaW4hCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZF9jYWNoZWZsdXNoKHZvaWQpCit7Cit9CisKKy8qCiAgKiBDUFUgaW50ZXJydXB0IG1hc2sgaGFuZGxpbmcuCiAgKi8KICNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1hcm0vdGhyZWFkX2luZm8uaAppbmRleCA3Yzk4NTU3Li4zM2EzM2NiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vdGhyZWFkX2luZm8uaApAQCAtOTYsMTMgKzk2LDEwIEBACiBleHRlcm4gc3RydWN0IHRocmVhZF9pbmZvICphbGxvY190aHJlYWRfaW5mbyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwogZXh0ZXJuIHZvaWQgZnJlZV90aHJlYWRfaW5mbyhzdHJ1Y3QgdGhyZWFkX2luZm8gKik7CiAKLSNkZWZpbmUgZ2V0X3RocmVhZF9pbmZvKHRpKQlnZXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKLSNkZWZpbmUgcHV0X3RocmVhZF9pbmZvKHRpKQlwdXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKLQogI2RlZmluZSB0aHJlYWRfc2F2ZWRfcGModHNrKQlcCi0JKCh1bnNpZ25lZCBsb25nKShwY19wb2ludGVyKCh0c2spLT50aHJlYWRfaW5mby0+Y3B1X2NvbnRleHQucGMpKSkKKwkoKHVuc2lnbmVkIGxvbmcpKHBjX3BvaW50ZXIodGFza190aHJlYWRfaW5mbyh0c2spLT5jcHVfY29udGV4dC5wYykpKQogI2RlZmluZSB0aHJlYWRfc2F2ZWRfZnAodHNrKQlcCi0JKCh1bnNpZ25lZCBsb25nKSgodHNrKS0+dGhyZWFkX2luZm8tPmNwdV9jb250ZXh0LmZwKSkKKwkoKHVuc2lnbmVkIGxvbmcpKHRhc2tfdGhyZWFkX2luZm8odHNrKS0+Y3B1X2NvbnRleHQuZnApKQogCiBleHRlcm4gdm9pZCBpd21teHRfdGFza19kaXNhYmxlKHN0cnVjdCB0aHJlYWRfaW5mbyAqKTsKIGV4dGVybiB2b2lkIGl3bW14dF90YXNrX2NvcHkoc3RydWN0IHRocmVhZF9pbmZvICosIHZvaWQgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1hcm0vdW5pc3RkLmgKaW5kZXggZDYyNmU3MC4uNzc0MzBkNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS91bmlzdGQuaApAQCAtMTUsMTAgKzE1LDEyIEBACiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKLSNpZiBkZWZpbmVkKF9fdGh1bWJfXykKKyNkZWZpbmUgX19OUl9PQUJJX1NZU0NBTExfQkFTRQkweDkwMDAwMAorCisjaWYgZGVmaW5lZChfX3RodW1iX18pIHx8IGRlZmluZWQoX19BUk1fRUFCSV9fKQogI2RlZmluZSBfX05SX1NZU0NBTExfQkFTRQkwCiAjZWxzZQotI2RlZmluZSBfX05SX1NZU0NBTExfQkFTRQkweDkwMDAwMAorI2RlZmluZSBfX05SX1NZU0NBTExfQkFTRQlfX05SX09BQklfU1lTQ0FMTF9CQVNFCiAjZW5kaWYKIAogLyoKQEAgLTM3MywxMyArMzc1LDEzIEBACiAjZGVmaW5lIF9fc3lzMSh4KSBfX3N5czIoeCkKIAogI2lmbmRlZiBfX3N5c2NhbGwKLSNpZiBkZWZpbmVkKF9fdGh1bWJfXykKLSNkZWZpbmUgX19zeXNjYWxsKG5hbWUpCQkJCQlcCi0JInB1c2gJe3I3fVxuXHQiCQkJCVwKLQkibW92CXI3LCAjIiBfX3N5czEoX19OUl8jI25hbWUpICJcblx0IglcCi0JInN3aQkwXG5cdCIJCQkJCVwKLQkicG9wCXtyN30iCisjaWYgZGVmaW5lZChfX3RodW1iX18pIHx8IGRlZmluZWQoX19BUk1fRUFCSV9fKQorI2RlZmluZSBfX1NZU19SRUcobmFtZSkgcmVnaXN0ZXIgbG9uZyBfX3N5c3JlZyBfX2FzbV9fKCJyNyIpID0gX19OUl8jI25hbWU7CisjZGVmaW5lIF9fU1lTX1JFR19MSVNUKHJlZ3MuLi4pICJyIiAoX19zeXNyZWcpICwgIyNyZWdzCisjZGVmaW5lIF9fc3lzY2FsbChuYW1lKSAic3dpXHQwIgogI2Vsc2UKKyNkZWZpbmUgX19TWVNfUkVHKG5hbWUpCisjZGVmaW5lIF9fU1lTX1JFR19MSVNUKHJlZ3MuLi4pIHJlZ3MKICNkZWZpbmUgX19zeXNjYWxsKG5hbWUpICJzd2lcdCIgX19zeXMxKF9fTlJfIyNuYW1lKSAiIgogI2VuZGlmCiAjZW5kaWYKQEAgLTM5NSwzMyArMzk3LDM0IEBACiAKICNkZWZpbmUgX3N5c2NhbGwwKHR5cGUsbmFtZSkJCQkJCQlcCiB0eXBlIG5hbWUodm9pZCkgewkJCQkJCQlcCisgIF9fU1lTX1JFRyhuYW1lKQkJCQkJCQlcCiAgIHJlZ2lzdGVyIGxvbmcgX19yZXNfcjAgX19hc21fXygicjAiKTsJCQkJCVwKICAgbG9uZyBfX3JlczsJCQkJCQkJCVwKICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCQkJCVwKICAgX19zeXNjYWxsKG5hbWUpCQkJCQkJCVwKIAk6ICI9ciIgKF9fcmVzX3IwKQkJCQkJCVwKLQk6CQkJCQkJCQlcCi0JOiAibHIiKTsJCQkJCQkJXAorCTogX19TWVNfUkVHX0xJU1QoKSApOwkJCQkJCVwKICAgX19yZXMgPSBfX3Jlc19yMDsJCQkJCQkJXAogICBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOwkJCQkJCVwKIH0KIAogI2RlZmluZSBfc3lzY2FsbDEodHlwZSxuYW1lLHR5cGUxLGFyZzEpIAkJCQlcCiB0eXBlIG5hbWUodHlwZTEgYXJnMSkgeyAJCQkJCQlcCisgIF9fU1lTX1JFRyhuYW1lKQkJCQkJCQlcCiAgIHJlZ2lzdGVyIGxvbmcgX19yMCBfX2FzbV9fKCJyMCIpID0gKGxvbmcpYXJnMTsJCQlcCiAgIHJlZ2lzdGVyIGxvbmcgX19yZXNfcjAgX19hc21fXygicjAiKTsJCQkJCVwKICAgbG9uZyBfX3JlczsJCQkJCQkJCVwKICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCQkJCVwKICAgX19zeXNjYWxsKG5hbWUpCQkJCQkJCVwKIAk6ICI9ciIgKF9fcmVzX3IwKQkJCQkJCVwKLQk6ICJyIiAoX19yMCkJCQkJCQkJXAotCTogImxyIik7CQkJCQkJCVwKKwk6IF9fU1lTX1JFR19MSVNUKCAiMCIgKF9fcjApICkgKTsJCQkJXAogICBfX3JlcyA9IF9fcmVzX3IwOwkJCQkJCQlcCiAgIF9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7CQkJCQkJXAogfQogCiAjZGVmaW5lIF9zeXNjYWxsMih0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyKQkJCVwKIHR5cGUgbmFtZSh0eXBlMSBhcmcxLHR5cGUyIGFyZzIpIHsJCQkJCVwKKyAgX19TWVNfUkVHKG5hbWUpCQkJCQkJCVwKICAgcmVnaXN0ZXIgbG9uZyBfX3IwIF9fYXNtX18oInIwIikgPSAobG9uZylhcmcxOwkJCVwKICAgcmVnaXN0ZXIgbG9uZyBfX3IxIF9fYXNtX18oInIxIikgPSAobG9uZylhcmcyOwkJCVwKICAgcmVnaXN0ZXIgbG9uZyBfX3Jlc19yMCBfX2FzbV9fKCJyMCIpOwkJCQkJXApAQCAtNDI5LDggKzQzMiw3IEBACiAgIF9fYXNtX18gX192b2xhdGlsZV9fICgJCQkJCQlcCiAgIF9fc3lzY2FsbChuYW1lKQkJCQkJCQlcCiAJOiAiPXIiIChfX3Jlc19yMCkJCQkJCQlcCi0JOiAiciIgKF9fcjApLCJyIiAoX19yMSkgCQkJCQlcCi0JOiAibHIiKTsJCQkJCQkJXAorCTogX19TWVNfUkVHX0xJU1QoICIwIiAoX19yMCksICJyIiAoX19yMSkgKSApOwkJCVwKICAgX19yZXMgPSBfX3Jlc19yMDsJCQkJCQkJXAogICBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOwkJCQkJCVwKIH0KQEAgLTQzOCw2ICs0NDAsNyBAQAogCiAjZGVmaW5lIF9zeXNjYWxsMyh0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyLHR5cGUzLGFyZzMpCQlcCiB0eXBlIG5hbWUodHlwZTEgYXJnMSx0eXBlMiBhcmcyLHR5cGUzIGFyZzMpIHsJCQkJXAorICBfX1NZU19SRUcobmFtZSkJCQkJCQkJXAogICByZWdpc3RlciBsb25nIF9fcjAgX19hc21fXygicjAiKSA9IChsb25nKWFyZzE7CQkJXAogICByZWdpc3RlciBsb25nIF9fcjEgX19hc21fXygicjEiKSA9IChsb25nKWFyZzI7CQkJXAogICByZWdpc3RlciBsb25nIF9fcjIgX19hc21fXygicjIiKSA9IChsb25nKWFyZzM7CQkJXApAQCAtNDQ2LDggKzQ0OSw3IEBACiAgIF9fYXNtX18gX192b2xhdGlsZV9fICgJCQkJCQlcCiAgIF9fc3lzY2FsbChuYW1lKQkJCQkJCQlcCiAJOiAiPXIiIChfX3Jlc19yMCkJCQkJCQlcCi0JOiAiciIgKF9fcjApLCJyIiAoX19yMSksInIiIChfX3IyKQkJCQlcCi0JOiAibHIiKTsJCQkJCQkJXAorCTogX19TWVNfUkVHX0xJU1QoICIwIiAoX19yMCksICJyIiAoX19yMSksICJyIiAoX19yMikgKSApOwlcCiAgIF9fcmVzID0gX19yZXNfcjA7CQkJCQkJCVwKICAgX19zeXNjYWxsX3JldHVybih0eXBlLF9fcmVzKTsJCQkJCQlcCiB9CkBAIC00NTUsNiArNDU3LDcgQEAKIAogI2RlZmluZSBfc3lzY2FsbDQodHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczLHR5cGU0LGFyZzQpXAogdHlwZSBuYW1lKHR5cGUxIGFyZzEsIHR5cGUyIGFyZzIsIHR5cGUzIGFyZzMsIHR5cGU0IGFyZzQpIHsJCVwKKyAgX19TWVNfUkVHKG5hbWUpCQkJCQkJCVwKICAgcmVnaXN0ZXIgbG9uZyBfX3IwIF9fYXNtX18oInIwIikgPSAobG9uZylhcmcxOwkJCVwKICAgcmVnaXN0ZXIgbG9uZyBfX3IxIF9fYXNtX18oInIxIikgPSAobG9uZylhcmcyOwkJCVwKICAgcmVnaXN0ZXIgbG9uZyBfX3IyIF9fYXNtX18oInIyIikgPSAobG9uZylhcmczOwkJCVwKQEAgLTQ2NCw4ICs0NjcsNyBAQAogICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCQkJCQkJXAogICBfX3N5c2NhbGwobmFtZSkJCQkJCQkJXAogCTogIj1yIiAoX19yZXNfcjApCQkJCQkJXAotCTogInIiIChfX3IwKSwiciIgKF9fcjEpLCJyIiAoX19yMiksInIiIChfX3IzKQkJCVwKLQk6ICJsciIpOwkJCQkJCQlcCisJOiBfX1NZU19SRUdfTElTVCggIjAiIChfX3IwKSwgInIiIChfX3IxKSwgInIiIChfX3IyKSwgInIiIChfX3IzKSApICk7IFwKICAgX19yZXMgPSBfX3Jlc19yMDsJCQkJCQkJXAogICBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOwkJCQkJCVwKIH0KQEAgLTQ3Myw2ICs0NzUsNyBAQAogCiAjZGVmaW5lIF9zeXNjYWxsNSh0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyLHR5cGUzLGFyZzMsdHlwZTQsYXJnNCx0eXBlNSxhcmc1KQlcCiB0eXBlIG5hbWUodHlwZTEgYXJnMSwgdHlwZTIgYXJnMiwgdHlwZTMgYXJnMywgdHlwZTQgYXJnNCwgdHlwZTUgYXJnNSkgewlcCisgIF9fU1lTX1JFRyhuYW1lKQkJCQkJCQlcCiAgIHJlZ2lzdGVyIGxvbmcgX19yMCBfX2FzbV9fKCJyMCIpID0gKGxvbmcpYXJnMTsJCQlcCiAgIHJlZ2lzdGVyIGxvbmcgX19yMSBfX2FzbV9fKCJyMSIpID0gKGxvbmcpYXJnMjsJCQlcCiAgIHJlZ2lzdGVyIGxvbmcgX19yMiBfX2FzbV9fKCJyMiIpID0gKGxvbmcpYXJnMzsJCQlcCkBAIC00ODMsMTQgKzQ4NiwxNSBAQAogICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCQkJCQkJXAogICBfX3N5c2NhbGwobmFtZSkJCQkJCQkJXAogCTogIj1yIiAoX19yZXNfcjApCQkJCQkJXAotCTogInIiIChfX3IwKSwiciIgKF9fcjEpLCJyIiAoX19yMiksInIiIChfX3IzKSwiciIgKF9fcjQpCVwKLQk6ICJsciIpOwkJCQkJCQlcCisJOiBfX1NZU19SRUdfTElTVCggIjAiIChfX3IwKSwgInIiIChfX3IxKSwgInIiIChfX3IyKSwJCVwKKwkJCSAgInIiIChfX3IzKSwgInIiIChfX3I0KSApICk7CQkJXAogICBfX3JlcyA9IF9fcmVzX3IwOwkJCQkJCQlcCiAgIF9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7CQkJCQkJXAogfQogCiAjZGVmaW5lIF9zeXNjYWxsNih0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyLHR5cGUzLGFyZzMsdHlwZTQsYXJnNCx0eXBlNSxhcmc1LHR5cGU2LGFyZzYpCVwKIHR5cGUgbmFtZSh0eXBlMSBhcmcxLCB0eXBlMiBhcmcyLCB0eXBlMyBhcmczLCB0eXBlNCBhcmc0LCB0eXBlNSBhcmc1LCB0eXBlNiBhcmc2KSB7CVwKKyAgX19TWVNfUkVHKG5hbWUpCQkJCQkJCVwKICAgcmVnaXN0ZXIgbG9uZyBfX3IwIF9fYXNtX18oInIwIikgPSAobG9uZylhcmcxOwkJCVwKICAgcmVnaXN0ZXIgbG9uZyBfX3IxIF9fYXNtX18oInIxIikgPSAobG9uZylhcmcyOwkJCVwKICAgcmVnaXN0ZXIgbG9uZyBfX3IyIF9fYXNtX18oInIyIikgPSAobG9uZylhcmczOwkJCVwKQEAgLTUwMiwzMCArNTA2LDMzIEBACiAgIF9fYXNtX18gX192b2xhdGlsZV9fICgJCQkJCQlcCiAgIF9fc3lzY2FsbChuYW1lKQkJCQkJCQlcCiAJOiAiPXIiIChfX3Jlc19yMCkJCQkJCQlcCi0JOiAiciIgKF9fcjApLCJyIiAoX19yMSksInIiIChfX3IyKSwiciIgKF9fcjMpLCAiciIgKF9fcjQpLCJyIiAoX19yNSkJCVwKLQk6ICJsciIpOwkJCQkJCQlcCisJOiBfX1NZU19SRUdfTElTVCggIjAiIChfX3IwKSwgInIiIChfX3IxKSwgInIiIChfX3IyKSwJCVwKKwkJCSAgInIiIChfX3IzKSwgInIiIChfX3I0KSwgInIiIChfX3I1KSApICk7CVwKICAgX19yZXMgPSBfX3Jlc19yMDsJCQkJCQkJXAogICBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOwkJCQkJCVwKIH0KIAogI2lmZGVmIF9fS0VSTkVMX18KICNkZWZpbmUgX19BUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KLSNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIKICNkZWZpbmUgX19BUkNIX1dBTlRfU1RBVDY0Ci0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19BTEFSTQogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfR0VUSE9TVE5BTUUKICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1BBVVNFCi0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19USU1FCi0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19VVElNRQotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU09DS0VUQ0FMTAogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfR0VUUEdSUAogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfTExTRUVLCiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19OSUNFCi0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19PTERfR0VUUkxJTUlUCi0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19PTERVTU9VTlQKICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NJR1BFTkRJTkcKICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NJR1BST0NNQVNLCiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19SVF9TSUdBQ1RJT04KKworI2lmICFkZWZpbmVkKENPTkZJR19BRUFCSSkgfHwgZGVmaW5lZChDT05GSUdfT0FCSV9DT01QQVQpCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19USU1FCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19PTERVTU9VTlQKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX0FMQVJNCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19VVElNRQorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfT0xEX0dFVFJMSU1JVAorI2RlZmluZSBfX0FSQ0hfV0FOVF9PTERfUkVBRERJUgorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU09DS0VUQ0FMTAorI2VuZGlmCiAjZW5kaWYKIAogI2lmZGVmIF9fS0VSTkVMX1NZU0NBTExTX18KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybTI2L2F0b21pYy5oIGIvaW5jbHVkZS9hc20tYXJtMjYvYXRvbWljLmgKaW5kZXggMzA3NGIwZS4uMTU1MmM4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtMjYvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtMjYvYXRvbWljLmgKQEAgLTc2LDYgKzc2LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCisjZGVmaW5lIGF0b21pY194Y2hnKHYsIG5ldykgKHhjaGcoJigodiktPmNvdW50ZXIpLCBuZXcpKQorCiBzdGF0aWMgaW5saW5lIGludCBhdG9taWNfYWRkX3VubGVzcyhhdG9taWNfdCAqdiwgaW50IGEsIGludCB1KQogewogCWludCByZXQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi9jYWNoZS5oIGIvaW5jbHVkZS9hc20tYXJtMjYvY2FjaGUuaAppbmRleCBmNTJjYTFiLi44YzNhYmNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi9jYWNoZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L2NhY2hlLmgKQEAgLTQsNyArNCw4IEBACiAjaWZuZGVmIF9fQVNNQVJNX0NBQ0hFX0gKICNkZWZpbmUgX19BU01BUk1fQ0FDSEVfSAogCi0jZGVmaW5lICAgICAgICBMMV9DQUNIRV9CWVRFUyAgMzIKKyNkZWZpbmUgICAgICAgIEwxX0NBQ0hFX1NISUZUICA1CisjZGVmaW5lICAgICAgICBMMV9DQUNIRV9CWVRFUyAgKDEgPDwgTDFfQ0FDSEVfU0hJRlQpCiAjZGVmaW5lICAgICAgICBMMV9DQUNIRV9BTElHTih4KSAgICAgICAoKCh4KSsoTDFfQ0FDSEVfQllURVMtMSkpJn4oTDFfQ0FDSEVfQllURVMtMSkpCiAjZGVmaW5lICAgICAgICBTTVBfQ0FDSEVfQllURVMgTDFfQ0FDSEVfQllURVMKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvZnV0ZXguaCBiL2luY2x1ZGUvYXNtLWFybTI2L2Z1dGV4LmgKaW5kZXggOWZlZmY0Y2UuLjZhMzMyYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L2Z1dGV4LmgKKysrIGIvaW5jbHVkZS9hc20tYXJtMjYvZnV0ZXguaApAQCAtMSw1MyArMSw2IEBACiAjaWZuZGVmIF9BU01fRlVURVhfSAogI2RlZmluZSBfQVNNX0ZVVEVYX0gKIAotI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mdXRleC5oPgogCi0jaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KLSNpbmNsdWRlIDxhc20vZXJybm8uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotCi1zdGF0aWMgaW5saW5lIGludAotZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQotewotCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7Ci0JaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OwotCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOwotCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7Ci0JaW50IG9sZHZhbCA9IDAsIHJldDsKLQlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCi0JCW9wYXJnID0gMSA8PCBvcGFyZzsKLQotCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWluY19wcmVlbXB0X2NvdW50KCk7Ci0KLQlzd2l0Y2ggKG9wKSB7Ci0JY2FzZSBGVVRFWF9PUF9TRVQ6Ci0JY2FzZSBGVVRFWF9PUF9BREQ6Ci0JY2FzZSBGVVRFWF9PUF9PUjoKLQljYXNlIEZVVEVYX09QX0FORE46Ci0JY2FzZSBGVVRFWF9PUF9YT1I6Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVOT1NZUzsKLQl9Ci0KLQlkZWNfcHJlZW1wdF9jb3VudCgpOwotCi0JaWYgKCFyZXQpIHsKLQkJc3dpdGNoIChjbXApIHsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfRVE6IHJldCA9IChvbGR2YWwgPT0gY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX05FOiByZXQgPSAob2xkdmFsICE9IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9MVDogcmV0ID0gKG9sZHZhbCA8IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9HRTogcmV0ID0gKG9sZHZhbCA+PSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfTEU6IHJldCA9IChvbGR2YWwgPD0gY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0dUOiByZXQgPSAob2xkdmFsID4gY21wYXJnKTsgYnJlYWs7Ci0JCWRlZmF1bHQ6IHJldCA9IC1FTk9TWVM7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotI2VuZGlmCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybTI2L2lvY3RsLmggYi9pbmNsdWRlL2FzbS1hcm0yNi9pb2N0bC5oCmluZGV4IDJjYmI3ZDAuLmIyNzlmZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L2lvY3RsLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtMjYvaW9jdGwuaApAQCAtMSw3NCArMSBAQAotLyoKLSAqIGxpbnV4L2lvY3RsLmggZm9yIExpbnV4IGJ5IEguSC4gQmVyZ21hbi4KLSAqLwotCi0jaWZuZGVmIF9BU01BUk1fSU9DVExfSAotI2RlZmluZSBfQVNNQVJNX0lPQ1RMX0gKLQotLyogaW9jdGwgY29tbWFuZCBlbmNvZGluZzogMzIgYml0cyB0b3RhbCwgY29tbWFuZCBpbiBsb3dlciAxNiBiaXRzLAotICogc2l6ZSBvZiB0aGUgcGFyYW1ldGVyIHN0cnVjdHVyZSBpbiB0aGUgbG93ZXIgMTQgYml0cyBvZiB0aGUKLSAqIHVwcGVyIDE2IGJpdHMuCi0gKiBFbmNvZGluZyB0aGUgc2l6ZSBvZiB0aGUgcGFyYW1ldGVyIHN0cnVjdHVyZSBpbiB0aGUgaW9jdGwgcmVxdWVzdAotICogaXMgdXNlZnVsIGZvciBjYXRjaGluZyBwcm9ncmFtcyBjb21waWxlZCB3aXRoIG9sZCB2ZXJzaW9ucwotICogYW5kIHRvIGF2b2lkIG92ZXJ3cml0aW5nIHVzZXIgc3BhY2Ugb3V0c2lkZSB0aGUgdXNlciBidWZmZXIgYXJlYS4KLSAqIFRoZSBoaWdoZXN0IDIgYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIGluZGljYXRpbmcgdGhlIGBgYWNjZXNzIG1vZGUnJy4KLSAqIE5PVEU6IFRoaXMgbGltaXRzIHRoZSBtYXggcGFyYW1ldGVyIHNpemUgdG8gMTZrQiAtMSAhCi0gKi8KLQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgaXMgZm9yIGNvbXBhdGliaWxpdHkgYWNyb3NzIHRoZSB2YXJpb3VzIExpbnV4Ci0gKiBwbGF0Zm9ybXMuICBUaGUgaTM4NiBpb2N0bCBudW1iZXJpbmcgc2NoZW1lIGRvZXNuJ3QgcmVhbGx5IGVuZm9yY2UKLSAqIGEgdHlwZSBmaWVsZC4gIERlIGZhY3RvLCBob3dldmVyLCB0aGUgdG9wIDggYml0cyBvZiB0aGUgbG93ZXIgMTYKLSAqIGJpdHMgYXJlIGluZGVlZCB1c2VkIGFzIGEgdHlwZSBmaWVsZCwgc28gd2UgbWlnaHQganVzdCBhcyB3ZWxsIG1ha2UKLSAqIHRoaXMgZXhwbGljaXQgaGVyZS4gIFBsZWFzZSBiZSBzdXJlIHRvIHVzZSB0aGUgZGVjb2RpbmcgbWFjcm9zCi0gKiBiZWxvdyBmcm9tIG5vdyBvbi4KLSAqLwotI2RlZmluZSBfSU9DX05SQklUUwk4Ci0jZGVmaW5lIF9JT0NfVFlQRUJJVFMJOAotI2RlZmluZSBfSU9DX1NJWkVCSVRTCTE0Ci0jZGVmaW5lIF9JT0NfRElSQklUUwkyCi0KLSNkZWZpbmUgX0lPQ19OUk1BU0sJKCgxIDw8IF9JT0NfTlJCSVRTKS0xKQotI2RlZmluZSBfSU9DX1RZUEVNQVNLCSgoMSA8PCBfSU9DX1RZUEVCSVRTKS0xKQotI2RlZmluZSBfSU9DX1NJWkVNQVNLCSgoMSA8PCBfSU9DX1NJWkVCSVRTKS0xKQotI2RlZmluZSBfSU9DX0RJUk1BU0sJKCgxIDw8IF9JT0NfRElSQklUUyktMSkKLQotI2RlZmluZSBfSU9DX05SU0hJRlQJMAotI2RlZmluZSBfSU9DX1RZUEVTSElGVAkoX0lPQ19OUlNISUZUK19JT0NfTlJCSVRTKQotI2RlZmluZSBfSU9DX1NJWkVTSElGVAkoX0lPQ19UWVBFU0hJRlQrX0lPQ19UWVBFQklUUykKLSNkZWZpbmUgX0lPQ19ESVJTSElGVAkoX0lPQ19TSVpFU0hJRlQrX0lPQ19TSVpFQklUUykKLQotLyoKLSAqIERpcmVjdGlvbiBiaXRzLgotICovCi0jZGVmaW5lIF9JT0NfTk9ORQkwVQotI2RlZmluZSBfSU9DX1dSSVRFCTFVCi0jZGVmaW5lIF9JT0NfUkVBRAkyVQotCi0jZGVmaW5lIF9JT0MoZGlyLHR5cGUsbnIsc2l6ZSkgXAotCSgoKGRpcikgIDw8IF9JT0NfRElSU0hJRlQpIHwgXAotCSAoKHR5cGUpIDw8IF9JT0NfVFlQRVNISUZUKSB8IFwKLQkgKChucikgICA8PCBfSU9DX05SU0hJRlQpIHwgXAotCSAoKHNpemUpIDw8IF9JT0NfU0laRVNISUZUKSkKLQotLyogdXNlZCB0byBjcmVhdGUgbnVtYmVycyAqLwotI2RlZmluZSBfSU8odHlwZSxucikJCV9JT0MoX0lPQ19OT05FLCh0eXBlKSwobnIpLDApCi0jZGVmaW5lIF9JT1IodHlwZSxucixzaXplKQlfSU9DKF9JT0NfUkVBRCwodHlwZSksKG5yKSxzaXplb2Yoc2l6ZSkpCi0jZGVmaW5lIF9JT1codHlwZSxucixzaXplKQlfSU9DKF9JT0NfV1JJVEUsKHR5cGUpLChuciksc2l6ZW9mKHNpemUpKQotI2RlZmluZSBfSU9XUih0eXBlLG5yLHNpemUpCV9JT0MoX0lPQ19SRUFEfF9JT0NfV1JJVEUsKHR5cGUpLChuciksc2l6ZW9mKHNpemUpKQotCi0vKiB1c2VkIHRvIGRlY29kZSBpb2N0bCBudW1iZXJzLi4gKi8KLSNkZWZpbmUgX0lPQ19ESVIobnIpCQkoKChucikgPj4gX0lPQ19ESVJTSElGVCkgJiBfSU9DX0RJUk1BU0spCi0jZGVmaW5lIF9JT0NfVFlQRShucikJCSgoKG5yKSA+PiBfSU9DX1RZUEVTSElGVCkgJiBfSU9DX1RZUEVNQVNLKQotI2RlZmluZSBfSU9DX05SKG5yKQkJKCgobnIpID4+IF9JT0NfTlJTSElGVCkgJiBfSU9DX05STUFTSykKLSNkZWZpbmUgX0lPQ19TSVpFKG5yKQkJKCgobnIpID4+IF9JT0NfU0laRVNISUZUKSAmIF9JT0NfU0laRU1BU0spCi0KLS8qIC4uLmFuZCBmb3IgdGhlIGRyaXZlcnMvc291bmQgZmlsZXMuLi4gKi8KLQotI2RlZmluZSBJT0NfSU4JCShfSU9DX1dSSVRFIDw8IF9JT0NfRElSU0hJRlQpCi0jZGVmaW5lIElPQ19PVVQJCShfSU9DX1JFQUQgPDwgX0lPQ19ESVJTSElGVCkKLSNkZWZpbmUgSU9DX0lOT1VUCSgoX0lPQ19XUklURXxfSU9DX1JFQUQpIDw8IF9JT0NfRElSU0hJRlQpCi0jZGVmaW5lIElPQ1NJWkVfTUFTSwkoX0lPQ19TSVpFTUFTSyA8PCBfSU9DX1NJWkVTSElGVCkKLSNkZWZpbmUgSU9DU0laRV9TSElGVAkoX0lPQ19TSVpFU0hJRlQpCi0KLSNlbmRpZiAvKiBfQVNNQVJNX0lPQ1RMX0ggKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pb2N0bC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1hcm0yNi9zeXN0ZW0uaAppbmRleCBmMjNmYWMxLi5jYTRjY2ZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi9zeXN0ZW0uaApAQCAtMTExLDEwICsxMTEsMjAgQEAKIAogI2RlZmluZSBzd2l0Y2hfdG8ocHJldixuZXh0LGxhc3QpCQkJCQlcCiBkbyB7CQkJCQkJCQkJXAotCWxhc3QgPSBfX3N3aXRjaF90byhwcmV2LHByZXYtPnRocmVhZF9pbmZvLG5leHQtPnRocmVhZF9pbmZvKTsJXAorCWxhc3QgPSBfX3N3aXRjaF90byhwcmV2LHRhc2tfdGhyZWFkX2luZm8ocHJldiksdGFza190aHJlYWRfaW5mbyhuZXh0KSk7CVwKIH0gd2hpbGUgKDApCiAKIC8qCisgKiBPbiBTTVAgc3lzdGVtcywgd2hlbiB0aGUgc2NoZWR1bGVyIGRvZXMgbWlncmF0aW9uLWNvc3QgYXV0b2RldGVjdGlvbiwKKyAqIGl0IG5lZWRzIGEgd2F5IHRvIGZsdXNoIGFzIG11Y2ggb2YgdGhlIENQVSdzIGNhY2hlcyBhcyBwb3NzaWJsZS4KKyAqCisgKiBUT0RPOiBmaWxsIHRoaXMgaW4hCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZF9jYWNoZWZsdXNoKHZvaWQpCit7Cit9CisKKy8qCiAgKiBTYXZlIHRoZSBjdXJyZW50IGludGVycnVwdCBlbmFibGUgc3RhdGUgJiBkaXNhYmxlIElSUXMKICAqLwogI2RlZmluZSBsb2NhbF9pcnFfc2F2ZSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20tYXJtMjYvdGhyZWFkX2luZm8uaAppbmRleCBhZmYzZTU2Li45YjM2N2ViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L3RocmVhZF9pbmZvLmgKQEAgLTgwLDIwICs4MCwxNiBAQAogCXJldHVybiAoc3RydWN0IHRocmVhZF9pbmZvICopKHNwICYgfjB4MWZmZik7CiB9CiAKLS8qIEZJWE1FIC0gUEFHRV9TSVpFIDwgMzJLICovCi0jZGVmaW5lIFRIUkVBRF9TSVpFCQkoOCozMjc2OCkgLy8gRklYTUUgLSB0aGlzIG5lZWRzIGF0dGVudGlvbiAoc2VlIGtlcm5lbC9mb3JrLmMgd2hpY2ggZ2V0cyBhIG5pY2UgZGl2IGJ5IHplcm8gaWYgdGhpcyBpcyBsb3dlciB0aGFuIDgqMzI3NjgKLSNkZWZpbmUgX19nZXRfdXNlcl9yZWdzKHgpICgoKHN0cnVjdCBwdF9yZWdzICopKCh1bnNpZ25lZCBsb25nKSh4KSArIFRIUkVBRF9TSVpFIC0gOCkpIC0gMSkKKyNkZWZpbmUgVEhSRUFEX1NJWkUJUEFHRV9TSVpFCisjZGVmaW5lIHRhc2tfcHRfcmVncyh0YXNrKSAoKHN0cnVjdCBwdF9yZWdzICopKHRhc2tfc3RhY2tfcGFnZSh0YXNrKSArIFRIUkVBRF9TSVpFIC0gOCkgLSAxKQogCiBleHRlcm4gc3RydWN0IHRocmVhZF9pbmZvICphbGxvY190aHJlYWRfaW5mbyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwogZXh0ZXJuIHZvaWQgZnJlZV90aHJlYWRfaW5mbyhzdHJ1Y3QgdGhyZWFkX2luZm8gKik7CiAKLSNkZWZpbmUgZ2V0X3RocmVhZF9pbmZvKHRpKQlnZXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKLSNkZWZpbmUgcHV0X3RocmVhZF9pbmZvKHRpKQlwdXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKLQogI2RlZmluZSB0aHJlYWRfc2F2ZWRfcGModHNrKQlcCi0JKCh1bnNpZ25lZCBsb25nKShwY19wb2ludGVyKCh0c2spLT50aHJlYWRfaW5mby0+Y3B1X2NvbnRleHQucGMpKSkKKwkoKHVuc2lnbmVkIGxvbmcpKHBjX3BvaW50ZXIodGFza190aHJlYWRfaW5mbyh0c2spLT5jcHVfY29udGV4dC5wYykpKQogI2RlZmluZSB0aHJlYWRfc2F2ZWRfZnAodHNrKQlcCi0JKCh1bnNpZ25lZCBsb25nKSgodHNrKS0+dGhyZWFkX2luZm8tPmNwdV9jb250ZXh0LmZwKSkKKwkoKHVuc2lnbmVkIGxvbmcpKHRhc2tfdGhyZWFkX2luZm8odHNrKS0+Y3B1X2NvbnRleHQuZnApKQogCiAjZWxzZSAvKiAhX19BU1NFTUJMWV9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MTAvY2FjaGUuaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MTAvY2FjaGUuaAppbmRleCAxZDFkMWJhLi5hZWEyNzE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjEwL2NhY2hlLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYxMC9jYWNoZS5oCkBAIC00LDYgKzQsNSBAQAogLyogRXRyYXggMTAwTFggaGF2ZSAzMi1ieXRlIGNhY2hlLWxpbmVzLiAqLwogI2RlZmluZSBMMV9DQUNIRV9CWVRFUyAzMgogI2RlZmluZSBMMV9DQUNIRV9TSElGVCA1Ci0jZGVmaW5lIEwxX0NBQ0hFX1NISUZUX01BWCA1CiAKICNlbmRpZiAvKiBfQVNNX0FSQ0hfQ0FDSEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYxMC9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MTAvcHJvY2Vzc29yLmgKaW5kZXggZTIzZGY4ZC4uY2M2OTJjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYxMC9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjEwL3Byb2Nlc3Nvci5oCkBAIC00MCw3ICs0MCw3IEBACiAjZGVmaW5lIEtTVEtfRUlQKHRzaykJXAogKHsJCQlcCiAJdW5zaWduZWQgbG9uZyBlaXAgPSAwOyAgIFwKLQl1bnNpZ25lZCBsb25nIHJlZ3MgPSAodW5zaWduZWQgbG9uZyl1c2VyX3JlZ3ModHNrKTsgXAorCXVuc2lnbmVkIGxvbmcgcmVncyA9ICh1bnNpZ25lZCBsb25nKXRhc2tfcHRfcmVncyh0c2spOyBcCiAJaWYgKHJlZ3MgPiBQQUdFX1NJWkUgJiYgXAogCQl2aXJ0X2FkZHJfdmFsaWQocmVncykpIFwKIAllaXAgPSAoKHN0cnVjdCBwdF9yZWdzICopcmVncyktPmlycDsgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9jYWNoZS5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9jYWNoZS5oCmluZGV4IDRmZWQ4ZDYuLjgwYjIzNmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvY2FjaGUuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL2NhY2hlLmgKQEAgLTQsNiArNCw1IEBACiAvKiBBIGNhY2hlLWxpbmUgaXMgMzIgYnl0ZXMuICovCiAjZGVmaW5lIEwxX0NBQ0hFX0JZVEVTIDMyCiAjZGVmaW5lIEwxX0NBQ0hFX1NISUZUIDUKLSNkZWZpbmUgTDFfQ0FDSEVfU0hJRlRfTUFYIDUKIAogI2VuZGlmIC8qIF9BU01fQ1JJU19BUkNIX0NBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL3Byb2Nlc3Nvci5oCmluZGV4IDhjOTM5YmYuLjMyYmYyZTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9wcm9jZXNzb3IuaApAQCAtMzYsNyArMzYsNyBAQAogI2RlZmluZSBLU1RLX0VJUCh0c2spCQlcCiAoewkJCQlcCiAJdW5zaWduZWQgbG9uZyBlaXAgPSAwOwlcCi0JdW5zaWduZWQgbG9uZyByZWdzID0gKHVuc2lnbmVkIGxvbmcpdXNlcl9yZWdzKHRzayk7IFwKKwl1bnNpZ25lZCBsb25nIHJlZ3MgPSAodW5zaWduZWQgbG9uZyl0YXNrX3B0X3JlZ3ModHNrKTsgXAogCWlmIChyZWdzID4gUEFHRV9TSVpFICYmIHZpcnRfYWRkcl92YWxpZChyZWdzKSkJICAgIFwKIAkJZWlwID0gKChzdHJ1Y3QgcHRfcmVncyAqKXJlZ3MpLT5lcnA7CSAgICBcCiAJZWlwOyBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2F0b21pYy5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hdG9taWMuaAppbmRleCAyZGYyYzdhLi4wYjUxYTg3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL2F0b21pYy5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXRvbWljLmgKQEAgLTEzNiw2ICsxMzYsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNkZWZpbmUgYXRvbWljX3hjaGcodiwgbmV3KSAoeGNoZygmKCh2KS0+Y291bnRlciksIG5ldykpCisKIHN0YXRpYyBpbmxpbmUgaW50IGF0b21pY19hZGRfdW5sZXNzKGF0b21pY190ICp2LCBpbnQgYSwgaW50IHUpCiB7CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvYXNtLWNyaXMvZG1hLW1hcHBpbmcuaAppbmRleCA4ZWZmNTEzLi5jYmYxYTk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL2RtYS1tYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9kbWEtbWFwcGluZy5oCkBAIC0xNTMsNyArMTUzLDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBkbWFfZ2V0X2NhY2hlX2FsaWdubWVudCh2b2lkKQogewotCXJldHVybiAoMSA8PCBMMV9DQUNIRV9TSElGVF9NQVgpOworCXJldHVybiAoMSA8PCBJTlRFUk5PREVfQ0FDSEVfU0hJRlQpOwogfQogCiAjZGVmaW5lIGRtYV9pc19jb25zaXN0ZW50KGQpCSgxKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9mdXRleC5oIGIvaW5jbHVkZS9hc20tY3Jpcy9mdXRleC5oCmluZGV4IDlmZWZmNGNlLi42YTMzMmE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL2Z1dGV4LmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9mdXRleC5oCkBAIC0xLDUzICsxLDYgQEAKICNpZm5kZWYgX0FTTV9GVVRFWF9ICiAjZGVmaW5lIF9BU01fRlVURVhfSAogCi0jaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2Z1dGV4Lmg+CiAKLSNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1mdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCi17Ci0JaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKLQlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7Ci0JaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7Ci0JaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKLQlpbnQgb2xkdmFsID0gMCwgcmV0OwotCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKLQkJb3BhcmcgPSAxIDw8IG9wYXJnOwotCi0JaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaW5jX3ByZWVtcHRfY291bnQoKTsKLQotCXN3aXRjaCAob3ApIHsKLQljYXNlIEZVVEVYX09QX1NFVDoKLQljYXNlIEZVVEVYX09QX0FERDoKLQljYXNlIEZVVEVYX09QX09SOgotCWNhc2UgRlVURVhfT1BfQU5ETjoKLQljYXNlIEZVVEVYX09QX1hPUjoKLQlkZWZhdWx0OgotCQlyZXQgPSAtRU5PU1lTOwotCX0KLQotCWRlY19wcmVlbXB0X2NvdW50KCk7Ci0KLQlpZiAoIXJldCkgewotCQlzd2l0Y2ggKGNtcCkgewotCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKLQkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0jZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9pb2N0bC5oIGIvaW5jbHVkZS9hc20tY3Jpcy9pb2N0bC5oCmluZGV4IGJlMmQ4ZjYuLmIyNzlmZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvaW9jdGwuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2lvY3RsLmgKQEAgLTEsODMgKzEgQEAKLS8qCi0gKiBsaW51eC9pb2N0bC5oIGZvciBMaW51eCBieSBILkguIEJlcmdtYW4uCi0gKgotICogVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgaTM4NiB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgX0FTTUNSSVNfSU9DVExfSAotI2RlZmluZSBfQVNNQ1JJU19JT0NUTF9ICi0KLS8qIGlvY3RsIGNvbW1hbmQgZW5jb2Rpbmc6IDMyIGJpdHMgdG90YWwsIGNvbW1hbmQgaW4gbG93ZXIgMTYgYml0cywKLSAqIHNpemUgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgaW4gdGhlIGxvd2VyIDE0IGJpdHMgb2YgdGhlCi0gKiB1cHBlciAxNiBiaXRzLgotICogRW5jb2RpbmcgdGhlIHNpemUgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgaW4gdGhlIGlvY3RsIHJlcXVlc3QKLSAqIGlzIHVzZWZ1bCBmb3IgY2F0Y2hpbmcgcHJvZ3JhbXMgY29tcGlsZWQgd2l0aCBvbGQgdmVyc2lvbnMKLSAqIGFuZCB0byBhdm9pZCBvdmVyd3JpdGluZyB1c2VyIHNwYWNlIG91dHNpZGUgdGhlIHVzZXIgYnVmZmVyIGFyZWEuCi0gKiBUaGUgaGlnaGVzdCAyIGJpdHMgYXJlIHJlc2VydmVkIGZvciBpbmRpY2F0aW5nIHRoZSBgYGFjY2VzcyBtb2RlJycuCi0gKiBOT1RFOiBUaGlzIGxpbWl0cyB0aGUgbWF4IHBhcmFtZXRlciBzaXplIHRvIDE2a0IgLTEgIQotICovCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGlzIGZvciBjb21wYXRpYmlsaXR5IGFjcm9zcyB0aGUgdmFyaW91cyBMaW51eAotICogcGxhdGZvcm1zLiAgVGhlIGkzODYgaW9jdGwgbnVtYmVyaW5nIHNjaGVtZSBkb2Vzbid0IHJlYWxseSBlbmZvcmNlCi0gKiBhIHR5cGUgZmllbGQuICBEZSBmYWN0bywgaG93ZXZlciwgdGhlIHRvcCA4IGJpdHMgb2YgdGhlIGxvd2VyIDE2Ci0gKiBiaXRzIGFyZSBpbmRlZWQgdXNlZCBhcyBhIHR5cGUgZmllbGQsIHNvIHdlIG1pZ2h0IGp1c3QgYXMgd2VsbCBtYWtlCi0gKiB0aGlzIGV4cGxpY2l0IGhlcmUuICBQbGVhc2UgYmUgc3VyZSB0byB1c2UgdGhlIGRlY29kaW5nIG1hY3JvcwotICogYmVsb3cgZnJvbSBub3cgb24uCi0gKi8KLSNkZWZpbmUgX0lPQ19OUkJJVFMJOAotI2RlZmluZSBfSU9DX1RZUEVCSVRTCTgKLSNkZWZpbmUgX0lPQ19TSVpFQklUUwkxNAotI2RlZmluZSBfSU9DX0RJUkJJVFMJMgotCi0jZGVmaW5lIF9JT0NfTlJNQVNLCSgoMSA8PCBfSU9DX05SQklUUyktMSkKLSNkZWZpbmUgX0lPQ19UWVBFTUFTSwkoKDEgPDwgX0lPQ19UWVBFQklUUyktMSkKLSNkZWZpbmUgX0lPQ19TSVpFTUFTSwkoKDEgPDwgX0lPQ19TSVpFQklUUyktMSkKLSNkZWZpbmUgX0lPQ19ESVJNQVNLCSgoMSA8PCBfSU9DX0RJUkJJVFMpLTEpCi0KLSNkZWZpbmUgX0lPQ19OUlNISUZUCTAKLSNkZWZpbmUgX0lPQ19UWVBFU0hJRlQJKF9JT0NfTlJTSElGVCtfSU9DX05SQklUUykKLSNkZWZpbmUgX0lPQ19TSVpFU0hJRlQJKF9JT0NfVFlQRVNISUZUK19JT0NfVFlQRUJJVFMpCi0jZGVmaW5lIF9JT0NfRElSU0hJRlQJKF9JT0NfU0laRVNISUZUK19JT0NfU0laRUJJVFMpCi0KLS8qCi0gKiBEaXJlY3Rpb24gYml0cy4KLSAqLwotI2RlZmluZSBfSU9DX05PTkUJMFUKLSNkZWZpbmUgX0lPQ19XUklURQkxVQotI2RlZmluZSBfSU9DX1JFQUQJMlUKLQotI2RlZmluZSBfSU9DKGRpcix0eXBlLG5yLHNpemUpIFwKLQkoKChkaXIpICA8PCBfSU9DX0RJUlNISUZUKSB8IFwKLQkgKCh0eXBlKSA8PCBfSU9DX1RZUEVTSElGVCkgfCBcCi0JICgobnIpICAgPDwgX0lPQ19OUlNISUZUKSB8IFwKLQkgKChzaXplKSA8PCBfSU9DX1NJWkVTSElGVCkpCi0KLS8qIHByb3Zva2UgY29tcGlsZSBlcnJvciBmb3IgaW52YWxpZCB1c2VzIG9mIHNpemUgYXJndW1lbnQgKi8KLWV4dGVybiBpbnQgX19pbnZhbGlkX3NpemVfYXJndW1lbnRfZm9yX0lPQzsKLSNkZWZpbmUgX0lPQ19UWVBFQ0hFQ0sodCkgXAotCSgoc2l6ZW9mKHQpID09IHNpemVvZih0WzFdKSAmJiBcCi0JICBzaXplb2YodCkgPCAoMSA8PCBfSU9DX1NJWkVCSVRTKSkgPyBcCi0JICBzaXplb2YodCkgOiBfX2ludmFsaWRfc2l6ZV9hcmd1bWVudF9mb3JfSU9DKQotCi0vKiB1c2VkIHRvIGNyZWF0ZSBudW1iZXJzICovCi0jZGVmaW5lIF9JTyh0eXBlLG5yKQkJX0lPQyhfSU9DX05PTkUsKHR5cGUpLChuciksMCkKLSNkZWZpbmUgX0lPUih0eXBlLG5yLHNpemUpCV9JT0MoX0lPQ19SRUFELCh0eXBlKSwobnIpLChfSU9DX1RZUEVDSEVDSyhzaXplKSkpCi0jZGVmaW5lIF9JT1codHlwZSxucixzaXplKQlfSU9DKF9JT0NfV1JJVEUsKHR5cGUpLChuciksKF9JT0NfVFlQRUNIRUNLKHNpemUpKSkKLSNkZWZpbmUgX0lPV1IodHlwZSxucixzaXplKQlfSU9DKF9JT0NfUkVBRHxfSU9DX1dSSVRFLCh0eXBlKSwobnIpLChfSU9DX1RZUEVDSEVDSyhzaXplKSkpCi0KLS8qIHVzZWQgdG8gZGVjb2RlIGlvY3RsIG51bWJlcnMuLiAqLwotI2RlZmluZSBfSU9DX0RJUihucikJCSgoKG5yKSA+PiBfSU9DX0RJUlNISUZUKSAmIF9JT0NfRElSTUFTSykKLSNkZWZpbmUgX0lPQ19UWVBFKG5yKQkJKCgobnIpID4+IF9JT0NfVFlQRVNISUZUKSAmIF9JT0NfVFlQRU1BU0spCi0jZGVmaW5lIF9JT0NfTlIobnIpCQkoKChucikgPj4gX0lPQ19OUlNISUZUKSAmIF9JT0NfTlJNQVNLKQotI2RlZmluZSBfSU9DX1NJWkUobnIpCQkoKChucikgPj4gX0lPQ19TSVpFU0hJRlQpICYgX0lPQ19TSVpFTUFTSykKLQotLyogLi4uYW5kIGZvciB0aGUgZHJpdmVycy9zb3VuZCBmaWxlcy4uLiAqLwotCi0jZGVmaW5lIElPQ19JTgkJKF9JT0NfV1JJVEUgPDwgX0lPQ19ESVJTSElGVCkKLSNkZWZpbmUgSU9DX09VVAkJKF9JT0NfUkVBRCA8PCBfSU9DX0RJUlNISUZUKQotI2RlZmluZSBJT0NfSU5PVVQJKChfSU9DX1dSSVRFfF9JT0NfUkVBRCkgPDwgX0lPQ19ESVJTSElGVCkKLSNkZWZpbmUgSU9DU0laRV9NQVNLCShfSU9DX1NJWkVNQVNLIDw8IF9JT0NfU0laRVNISUZUKQotI2RlZmluZSBJT0NTSVpFX1NISUZUCShfSU9DX1NJWkVTSElGVCkKLQotI2VuZGlmIC8qIF9BU01DUklTX0lPQ1RMX0ggKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pb2N0bC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9tdXRleC5oIGIvaW5jbHVkZS9hc20tY3Jpcy9tdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OGMxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL211dGV4LmgKQEAgLTAsMCArMSw5IEBACisvKgorICogUHVsbCBpbiB0aGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIG11dGV4IGZhc3RwYXRoLgorICoKKyAqIFRPRE86IGltcGxlbWVudCBvcHRpbWl6ZWQgcHJpbWl0aXZlcyBpbnN0ZWFkLCBvciBsZWF2ZSB0aGUgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24gaW4gcGxhY2UsIG9yIHBpY2sgdGhlIGF0b21pY194Y2hnKCkgYmFzZWQgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24uIChzZWUgYXNtLWdlbmVyaWMvbXV0ZXgteGNoZy5oIGZvciBkZXRhaWxzKQorICovCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tdXRleC1kZWMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1jcmlzL3Byb2Nlc3Nvci5oCmluZGV4IGRjZTQxMDAuLjk2MWUyYmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9wcm9jZXNzb3IuaApAQCAtNDUsNyArNDUsOCBAQAogICogRGl0byBidXQgZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyB0YXNrCiAgKi8KIAotI2RlZmluZSBjdXJyZW50X3JlZ3MoKSB1c2VyX3JlZ3MoY3VycmVudC0+dGhyZWFkX2luZm8pCisjZGVmaW5lIHRhc2tfcHRfcmVncyh0YXNrKSB1c2VyX3JlZ3ModGFza190aHJlYWRfaW5mbyh0YXNrKSkKKyNkZWZpbmUgY3VycmVudF9yZWdzKCkgdGFza19wdF9yZWdzKGN1cnJlbnQpCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwcmVwYXJlX3RvX2NvcHkoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1jcmlzL3RocmVhZF9pbmZvLmgKaW5kZXggY2VmMDE0MC4uN2FkODUzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvdGhyZWFkX2luZm8uaApAQCAtNjksOCArNjksNiBAQAogLyogdGhyZWFkIGluZm9ybWF0aW9uIGFsbG9jYXRpb24gKi8KICNkZWZpbmUgYWxsb2NfdGhyZWFkX2luZm8odHNrKSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsMSkpCiAjZGVmaW5lIGZyZWVfdGhyZWFkX2luZm8odGkpIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpICh0aSksIDEpCi0jZGVmaW5lIGdldF90aHJlYWRfaW5mbyh0aSkgZ2V0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCi0jZGVmaW5lIHB1dF90aHJlYWRfaW5mbyh0aSkgcHV0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCiAKICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLWZydi9hdG9taWMuaAppbmRleCAzZjU0ZmVhLi5hNTlmNjg0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L2F0b21pYy5oCkBAIC0yMTgsNTEgKzIxOCwxMiBAQAogCV9fdHlwZW9mX18oKihwdHIpKSBfX3hnX29yaWc7CQkJCQkJXAogCQkJCQkJCQkJCVwKIAlzd2l0Y2ggKHNpemVvZihfX3hnX29yaWcpKSB7CQkJCQkJXAotCWNhc2UgMToJCQkJCQkJCQlcCi0JCWFzbSB2b2xhdGlsZSgJCQkJCQkJXAotCQkJIjA6CQkJCQkJXG4iCVwKLQkJCSIJb3JjYwkJZ3IwLGdyMCxncjAsaWNjMwlcbiIJXAotCQkJIglja2VxCQlpY2MzLGNjNwkJXG4iCVwKLQkJCSIJbGR1Yi5wCQklTTAsJTEJCQlcbiIJXAotCQkJIglvcmNyCQljYzcsY2M3LGNjMwkJXG4iCVwKLQkJCSIJY3N0Yi5wCQklMiwlTTAJCSxjYzMsIzEJXG4iCVwKLQkJCSIJY29yY2MJCWdyMjksZ3IyOSxncjAJLGNjMywjMQlcbiIJXAotCQkJIgliZXEJCWljYzMsIzAsMGIJCVxuIglcCi0JCQk6ICIrVSIoKl9feGdfcHRyKSwgIj0mciIoX194Z19vcmlnKQkJCVwKLQkJCTogInIiKHgpCQkJCQkJXAotCQkJOiAibWVtb3J5IiwgImNjNyIsICJjYzMiLCAiaWNjMyIJCQlcCi0JCQkpOwkJCQkJCQlcCi0JCWJyZWFrOwkJCQkJCQkJXAotCQkJCQkJCQkJCVwKLQljYXNlIDI6CQkJCQkJCQkJXAotCQlhc20gdm9sYXRpbGUoCQkJCQkJCVwKLQkJCSIwOgkJCQkJCVxuIglcCi0JCQkiCW9yY2MJCWdyMCxncjAsZ3IwLGljYzMJXG4iCVwKLQkJCSIJY2tlcQkJaWNjMyxjYzcJCVxuIglcCi0JCQkiCWxkdWgucAkJJU0wLCUxCQkJXG4iCVwKLQkJCSIJb3JjcgkJY2M3LGNjNyxjYzMJCVxuIglcCi0JCQkiCWNzdGgucAkJJTIsJU0wCQksY2MzLCMxCVxuIglcCi0JCQkiCWNvcmNjCQlncjI5LGdyMjksZ3IwCSxjYzMsIzEJXG4iCVwKLQkJCSIJYmVxCQlpY2MzLCMwLDBiCQlcbiIJXAotCQkJOiAiK1UiKCpfX3hnX3B0ciksICI9JnIiKF9feGdfb3JpZykJCQlcCi0JCQk6ICJyIih4KQkJCQkJCVwKLQkJCTogIm1lbW9yeSIsICJjYzciLCAiY2MzIiwgImljYzMiCQkJXAotCQkJKTsJCQkJCQkJXAotCQlicmVhazsJCQkJCQkJCVwKLQkJCQkJCQkJCQlcCiAJY2FzZSA0OgkJCQkJCQkJCVwKIAkJYXNtIHZvbGF0aWxlKAkJCQkJCQlcCi0JCQkiMDoJCQkJCQlcbiIJXAotCQkJIglvcmNjCQlncjAsZ3IwLGdyMCxpY2MzCVxuIglcCi0JCQkiCWNrZXEJCWljYzMsY2M3CQlcbiIJXAotCQkJIglsZC5wCQklTTAsJTEJCQlcbiIJXAotCQkJIglvcmNyCQljYzcsY2M3LGNjMwkJXG4iCVwKLQkJCSIJY3N0LnAJCSUyLCVNMAkJLGNjMywjMQlcbiIJXAotCQkJIgljb3JjYwkJZ3IyOSxncjI5LGdyMAksY2MzLCMxCVxuIglcCi0JCQkiCWJlcQkJaWNjMywjMCwwYgkJXG4iCVwKLQkJCTogIitVIigqX194Z19wdHIpLCAiPSZyIihfX3hnX29yaWcpCQkJXAorCQkJInN3YXAlSTAgJTIsJU0wIgkJCQkJXAorCQkJOiAiK20iKCpfX3hnX3B0ciksICI9JnIiKF9feGdfb3JpZykJCQlcCiAJCQk6ICJyIih4KQkJCQkJCVwKLQkJCTogIm1lbW9yeSIsICJjYzciLCAiY2MzIiwgImljYzMiCQkJXAorCQkJOiAibWVtb3J5IgkJCQkJCVwKIAkJCSk7CQkJCQkJCVwKIAkJYnJlYWs7CQkJCQkJCQlcCiAJCQkJCQkJCQkJXApAQCAtMjc3LDggKzIzOCw2IEBACiAKICNlbHNlCiAKLWV4dGVybiB1aW50OF90ICBfX3hjaGdfOCAodWludDhfdCBpLCAgdm9sYXRpbGUgdm9pZCAqdik7Ci1leHRlcm4gdWludDE2X3QgX194Y2hnXzE2KHVpbnQxNl90IGksIHZvbGF0aWxlIHZvaWQgKnYpOwogZXh0ZXJuIHVpbnQzMl90IF9feGNoZ18zMih1aW50MzJfdCBpLCB2b2xhdGlsZSB2b2lkICp2KTsKIAogI2RlZmluZSB4Y2hnKHB0ciwgeCkJCQkJCQkJCQkJXApAQCAtMjg3LDggKzI0Niw2IEBACiAJX190eXBlb2ZfXygqKHB0cikpIF9feGdfb3JpZzsJCQkJCQkJCVwKIAkJCQkJCQkJCQkJCVwKIAlzd2l0Y2ggKHNpemVvZihfX3hnX29yaWcpKSB7CQkJCQkJCQlcCi0JY2FzZSAxOiBfX3hnX29yaWcgPSAoX190eXBlb2ZfXygqKHB0cikpKSBfX3hjaGdfOCAoKHVpbnQ4X3QpICB4LCBfX3hnX3B0cik7CWJyZWFrOwlcCi0JY2FzZSAyOiBfX3hnX29yaWcgPSAoX190eXBlb2ZfXygqKHB0cikpKSBfX3hjaGdfMTYoKHVpbnQxNl90KSB4LCBfX3hnX3B0cik7CWJyZWFrOwlcCiAJY2FzZSA0OiBfX3hnX29yaWcgPSAoX190eXBlb2ZfXygqKHB0cikpKSBfX3hjaGdfMzIoKHVpbnQzMl90KSB4LCBfX3hnX3B0cik7CWJyZWFrOwlcCiAJZGVmYXVsdDoJCQkJCQkJCQkJXAogCQlfX3hnX29yaWcgPSAwOwkJCQkJCQkJCVwKQEAgLTMxOCw0NiArMjc1LDYgQEAKIAlfX3R5cGVvZl9fKCoocHRyKSkgX194Z19uZXcgPSAobmV3KTsJCQkJCVwKIAkJCQkJCQkJCQlcCiAJc3dpdGNoIChzaXplb2YoX194Z19vcmlnKSkgewkJCQkJCVwKLQljYXNlIDE6CQkJCQkJCQkJXAotCQlhc20gdm9sYXRpbGUoCQkJCQkJCVwKLQkJCSIwOgkJCQkJCVxuIglcCi0JCQkiCW9yY2MJCWdyMCxncjAsZ3IwLGljYzMJXG4iCVwKLQkJCSIJY2tlcQkJaWNjMyxjYzcJCVxuIglcCi0JCQkiCWxkdWIucAkJJU0wLCUxCQkJXG4iCVwKLQkJCSIJb3JjcgkJY2M3LGNjNyxjYzMJCVxuIglcCi0JCQkiCXN1YiVJNAkJJTEsJTQsJTIJCVxuIglcCi0JCQkiCXNsbGNjCQklMiwjMjQsZ3IwLGljYzAJCVxuIglcCi0JCQkiCWJuZQkJaWNjMCwjMCwxZgkJXG4iCVwKLQkJCSIJY3N0Yi5wCQklMywlTTAJCSxjYzMsIzEJXG4iCVwKLQkJCSIJY29yY2MJCWdyMjksZ3IyOSxncjAJLGNjMywjMQlcbiIJXAotCQkJIgliZXEJCWljYzMsIzAsMGIJCVxuIglcCi0JCQkiMToJCQkJCQlcbiIJXAotCQkJOiAiK1UiKCpfX3hnX3B0ciksICI9JnIiKF9feGdfb3JpZyksICI9JnIiKF9feGdfdG1wKQlcCi0JCQk6ICJyIihfX3hnX25ldyksICJOUHIiKF9feGdfdGVzdCkJCQlcCi0JCQk6ICJtZW1vcnkiLCAiY2M3IiwgImNjMyIsICJpY2MzIiwgImljYzAiCQlcCi0JCQkpOwkJCQkJCQlcCi0JCWJyZWFrOwkJCQkJCQkJXAotCQkJCQkJCQkJCVwKLQljYXNlIDI6CQkJCQkJCQkJXAotCQlhc20gdm9sYXRpbGUoCQkJCQkJCVwKLQkJCSIwOgkJCQkJCVxuIglcCi0JCQkiCW9yY2MJCWdyMCxncjAsZ3IwLGljYzMJXG4iCVwKLQkJCSIJY2tlcQkJaWNjMyxjYzcJCVxuIglcCi0JCQkiCWxkdWgucAkJJU0wLCUxCQkJXG4iCVwKLQkJCSIJb3JjcgkJY2M3LGNjNyxjYzMJCVxuIglcCi0JCQkiCXN1YiVJNAkJJTEsJTQsJTIJCVxuIglcCi0JCQkiCXNsbGNjCQklMiwjMTYsZ3IwLGljYzAJCVxuIglcCi0JCQkiCWJuZQkJaWNjMCwjMCwxZgkJXG4iCVwKLQkJCSIJY3N0aC5wCQklMywlTTAJCSxjYzMsIzEJXG4iCVwKLQkJCSIJY29yY2MJCWdyMjksZ3IyOSxncjAJLGNjMywjMQlcbiIJXAotCQkJIgliZXEJCWljYzMsIzAsMGIJCVxuIglcCi0JCQkiMToJCQkJCQlcbiIJXAotCQkJOiAiK1UiKCpfX3hnX3B0ciksICI9JnIiKF9feGdfb3JpZyksICI9JnIiKF9feGdfdG1wKQlcCi0JCQk6ICJyIihfX3hnX25ldyksICJOUHIiKF9feGdfdGVzdCkJCQlcCi0JCQk6ICJtZW1vcnkiLCAiY2M3IiwgImNjMyIsICJpY2MzIiwgImljYzAiCQlcCi0JCQkpOwkJCQkJCQlcCi0JCWJyZWFrOwkJCQkJCQkJXAotCQkJCQkJCQkJCVwKIAljYXNlIDQ6CQkJCQkJCQkJXAogCQlhc20gdm9sYXRpbGUoCQkJCQkJCVwKIAkJCSIwOgkJCQkJCVxuIglcCkBAIC0zODgsOCArMzA1LDYgQEAKIAogI2Vsc2UKIAotZXh0ZXJuIHVpbnQ4X3QgIF9fY21weGNoZ184ICh1aW50OF90ICp2LCAgdWludDhfdCB0ZXN0LCAgdWludDhfdCBuZXcpOwotZXh0ZXJuIHVpbnQxNl90IF9fY21weGNoZ18xNih1aW50MTZfdCAqdiwgdWludDE2X3QgdGVzdCwgdWludDE2X3QgbmV3KTsKIGV4dGVybiB1aW50MzJfdCBfX2NtcHhjaGdfMzIodWludDMyX3QgKnYsIHVpbnQzMl90IHRlc3QsIHVpbnQzMl90IG5ldyk7CiAKICNkZWZpbmUgY21weGNoZyhwdHIsIHRlc3QsIG5ldykJCQkJCQkJXApAQCAtNDAwLDggKzMxNSw2IEBACiAJX190eXBlb2ZfXygqKHB0cikpIF9feGdfbmV3ID0gKG5ldyk7CQkJCQlcCiAJCQkJCQkJCQkJXAogCXN3aXRjaCAoc2l6ZW9mKF9feGdfb3JpZykpIHsJCQkJCQlcCi0JY2FzZSAxOiBfX3hnX29yaWcgPSBfX2NtcHhjaGdfOCAoX194Z19wdHIsIF9feGdfdGVzdCwgX194Z19uZXcpOyBicmVhazsJXAotCWNhc2UgMjogX194Z19vcmlnID0gX19jbXB4Y2hnXzE2KF9feGdfcHRyLCBfX3hnX3Rlc3QsIF9feGdfbmV3KTsgYnJlYWs7CVwKIAljYXNlIDQ6IF9feGdfb3JpZyA9IF9fY21weGNoZ18zMihfX3hnX3B0ciwgX194Z190ZXN0LCBfX3hnX25ldyk7IGJyZWFrOwlcCiAJZGVmYXVsdDoJCQkJCQkJCVwKIAkJX194Z19vcmlnID0gMDsJCQkJCQkJXApAQCAtNDE0LDcgKzMyNyw4IEBACiAKICNlbmRpZgogCi0jZGVmaW5lIGF0b21pY19jbXB4Y2hnKHYsIG9sZCwgbmV3KSAoKGludCljbXB4Y2hnKCYoKHYpLT5jb3VudGVyKSwgb2xkLCBuZXcpKQorI2RlZmluZSBhdG9taWNfY21weGNoZyh2LCBvbGQsIG5ldykgKGNtcHhjaGcoJigodiktPmNvdW50ZXIpLCBvbGQsIG5ldykpCisjZGVmaW5lIGF0b21pY194Y2hnKHYsIG5ldykgKHhjaGcoJigodiktPmNvdW50ZXIpLCBuZXcpKQogCiAjZGVmaW5lIGF0b21pY19hZGRfdW5sZXNzKHYsIGEsIHUpCQkJCVwKICh7CQkJCQkJCQlcCkBAIC00MjQsNiArMzM4LDcgQEAKIAkJYyA9IG9sZDsJCQkJCVwKIAljICE9ICh1KTsJCQkJCQlcCiB9KQorCiAjZGVmaW5lIGF0b21pY19pbmNfbm90X3plcm8odikgYXRvbWljX2FkZF91bmxlc3MoKHYpLCAxLCAwKQogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXRvbWljLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvYnVnLmggYi9pbmNsdWRlL2FzbS1mcnYvYnVnLmgKaW5kZXggMDc0YzBkNS4uNDUxNzEyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L2J1Zy5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9idWcuaApAQCAtMTIsNiArMTIsNyBAQAogI2RlZmluZSBfQVNNX0JVR19ICiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKICNpZmRlZiBDT05GSUdfQlVHCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1mcnYvZG1hLW1hcHBpbmcuaAppbmRleCA1MDAzZTAxLi5lOWZjMWQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvZG1hLW1hcHBpbmcuaAorKysgYi9pbmNsdWRlL2FzbS1mcnYvZG1hLW1hcHBpbmcuaApAQCAtMjMsNyArMjMsNyBAQAogICogcmV0dXJucywgb3IgYWx0ZXJuYXRpdmVseSBzdG9wIG9uIHRoZSBmaXJzdCBzZ19kbWFfbGVuKHNnKSB3aGljaAogICogaXMgMC4KICAqLwotI2RlZmluZSBzZ19kbWFfYWRkcmVzcyhzZykJKCh1bnNpZ25lZCBsb25nKSAocGFnZV90b19waHlzKChzZyktPnBhZ2UpICsgKHNnKS0+b2Zmc2V0KSkKKyNkZWZpbmUgc2dfZG1hX2FkZHJlc3Moc2cpCSgoc2cpLT5kbWFfYWRkcmVzcykKICNkZWZpbmUgc2dfZG1hX2xlbihzZykJCSgoc2cpLT5sZW5ndGgpCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvaW8uaCBiL2luY2x1ZGUvYXNtLWZydi9pby5oCmluZGV4IDQ4ODI5ZjcuLjA3NTM2OWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9pby5oCkBAIC0xOCw2ICsxOCw3IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vdmlydGNvbnZlcnQuaD4KICNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CiAjaW5jbHVkZSA8YXNtL21iLXJlZ3MuaD4KQEAgLTEwNCw2ICsxMDUsOCBAQAogCQlfX2luc2xfc3coYWRkciwgYnVmLCBsZW4pOwogfQogCisjZGVmaW5lIG1taW93YigpIG1iKCkKKwogLyoKICAqCW1ha2UgdGhlIHNob3J0IG5hbWVzIG1hY3JvcyBzbyBzcGVjaWZpYyBkZXZpY2VzCiAgKgljYW4gb3ZlcnJpZGUgdGhlbSBhcyByZXF1aXJlZApAQCAtMjA5LDYgKzIxMiwxMCBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNkZWZpbmUgcmVhZGJfcmVsYXhlZCByZWFkYgorI2RlZmluZSByZWFkd19yZWxheGVkIHJlYWR3CisjZGVmaW5lIHJlYWRsX3JlbGF4ZWQgcmVhZGwKKwogc3RhdGljIGlubGluZSB2b2lkIHdyaXRlYih1aW50OF90IGRhdHVtLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7CiAJX19idWlsdGluX3dyaXRlOCgodm9sYXRpbGUgdWludDhfdCBfX2ZvcmNlICopIGFkZHIsIGRhdHVtKTsKQEAgLTI2OCwxMSArMjc1LDEwNiBAQAogCiBleHRlcm4gdm9pZCBpb3VubWFwKHZvaWQgX19pb21lbSAqYWRkcik7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICppb3BvcnRfbWFwKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgaW50IG5yKQoreworCXJldHVybiAodm9pZCBfX2lvbWVtICopIHBvcnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb3BvcnRfdW5tYXAodm9pZCBfX2lvbWVtICpwKQoreworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfd3JpdGVfYnVmZmVycyh2b2lkKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fICgibWVtYmFyIiA6IDogOiJtZW1vcnkiKTsKIH0KIAorLyoKKyAqIGRvIGFwcHJvcHJpYXRlIEkvTyBhY2Nlc3NlcyBmb3IgdG9rZW4gdHlwZQorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpb3JlYWQ4KHZvaWQgX19pb21lbSAqcCkKK3sKKwlyZXR1cm4gX19idWlsdGluX3JlYWQ4KHApOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpb3JlYWQxNih2b2lkIF9faW9tZW0gKnApCit7CisJdWludDE2X3QgcmV0ID0gX19idWlsdGluX3JlYWQxNihwKTsKKwlpZiAoX19pc19QQ0lfYWRkcihwKSkKKwkJcmV0ID0gX3N3YXB3KHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaW9yZWFkMzIodm9pZCBfX2lvbWVtICpwKQoreworCXVpbnQzMl90IHJldCA9IF9fYnVpbHRpbl9yZWFkMzIocCk7CisJaWYgKF9faXNfUENJX2FkZHIocCkpCisJCXJldCA9IF9zd2FwbChyZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb3dyaXRlOCh1OCB2YWwsIHZvaWQgX19pb21lbSAqcCkKK3sKKwlfX2J1aWx0aW5fd3JpdGU4KHAsIHZhbCk7CisJaWYgKF9faXNfUENJX01FTShwKSkKKwkJX19mbHVzaF9QQ0lfd3JpdGVzKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb3dyaXRlMTYodTE2IHZhbCwgdm9pZCBfX2lvbWVtICpwKQoreworCWlmIChfX2lzX1BDSV9hZGRyKHApKQorCQl2YWwgPSBfc3dhcHcodmFsKTsKKwlfX2J1aWx0aW5fd3JpdGUxNihwLCB2YWwpOworCWlmIChfX2lzX1BDSV9NRU0ocCkpCisJCV9fZmx1c2hfUENJX3dyaXRlcygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW93cml0ZTMyKHUzMiB2YWwsIHZvaWQgX19pb21lbSAqcCkKK3sKKwlpZiAoX19pc19QQ0lfYWRkcihwKSkKKwkJdmFsID0gX3N3YXBsKHZhbCk7CisJX19idWlsdGluX3dyaXRlMzIocCwgdmFsKTsKKwlpZiAoX19pc19QQ0lfTUVNKHApKQorCQlfX2ZsdXNoX1BDSV93cml0ZXMoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlvcmVhZDhfcmVwKHZvaWQgX19pb21lbSAqcCwgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCWlvX2luc2IoKHVuc2lnbmVkIGxvbmcpIHAsIGRzdCwgY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW9yZWFkMTZfcmVwKHZvaWQgX19pb21lbSAqcCwgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCWlvX2luc3coKHVuc2lnbmVkIGxvbmcpIHAsIGRzdCwgY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW9yZWFkMzJfcmVwKHZvaWQgX19pb21lbSAqcCwgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCV9faW5zbF9ucygodW5zaWduZWQgbG9uZykgcCwgZHN0LCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb3dyaXRlOF9yZXAodm9pZCBfX2lvbWVtICpwLCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJaW9fb3V0c2IoKHVuc2lnbmVkIGxvbmcpIHAsIHNyYywgY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW93cml0ZTE2X3JlcCh2b2lkIF9faW9tZW0gKnAsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwlpb19vdXRzdygodW5zaWduZWQgbG9uZykgcCwgc3JjLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb3dyaXRlMzJfcmVwKHZvaWQgX19pb21lbSAqcCwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCV9fb3V0c2xfbnMoKHVuc2lnbmVkIGxvbmcpIHAsIHNyYywgY291bnQpOworfQorCisvKiBDcmVhdGUgYSB2aXJ0dWFsIG1hcHBpbmcgY29va2llIGZvciBhIFBDSSBCQVIgKG1lbW9yeSBvciBJTykgKi8KK3N0cnVjdCBwY2lfZGV2OworZXh0ZXJuIHZvaWQgX19pb21lbSAqcGNpX2lvbWFwKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBiYXIsIHVuc2lnbmVkIGxvbmcgbWF4KTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lfaW91bm1hcChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB2b2lkIF9faW9tZW0gKnApCit7Cit9CisKIAogLyoKICAqIENvbnZlcnQgYSBwaHlzaWNhbCBwb2ludGVyIHRvIGEgdmlydHVhbCBrZXJuZWwgcG9pbnRlciBmb3IgL2Rldi9tZW0KQEAgLTI4NSw2ICszODcsMjcgQEAKICAqLwogI2RlZmluZSB4bGF0ZV9kZXZfa21lbV9wdHIocCkJcAogCisvKgorICogQ2hlY2sgQklPUyBzaWduYXR1cmUKKyAqLworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfc2lnbmF0dXJlKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqaW9fYWRkciwKKwkJCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZ25hdHVyZSwgaW50IGxlbmd0aCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCWRvIHsKKwkJaWYgKHJlYWRiKGlvX2FkZHIpICE9ICpzaWduYXR1cmUpCisJCQlnb3RvIG91dDsKKwkJaW9fYWRkcisrOworCQlzaWduYXR1cmUrKzsKKwkJbGVuZ3RoLS07CisJfSB3aGlsZSAobGVuZ3RoKTsKKworCXJldHZhbCA9IDE7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmIC8qIF9BU01fSU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L2lvY3RsLmggYi9pbmNsdWRlL2FzbS1mcnYvaW9jdGwuaAppbmRleCA4YWVlNzY5Li5iMjc5ZmUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvaW9jdGwuaAorKysgYi9pbmNsdWRlL2FzbS1mcnYvaW9jdGwuaApAQCAtMSw4MCArMSBAQAotLyoKLSAqIGxpbnV4L2lvY3RsLmggZm9yIExpbnV4IGJ5IEguSC4gQmVyZ21hbi4KLSAqLwotCi0jaWZuZGVmIF9BU01fSU9DVExfSAotI2RlZmluZSBfQVNNX0lPQ1RMX0gKLQotLyogaW9jdGwgY29tbWFuZCBlbmNvZGluZzogMzIgYml0cyB0b3RhbCwgY29tbWFuZCBpbiBsb3dlciAxNiBiaXRzLAotICogc2l6ZSBvZiB0aGUgcGFyYW1ldGVyIHN0cnVjdHVyZSBpbiB0aGUgbG93ZXIgMTQgYml0cyBvZiB0aGUKLSAqIHVwcGVyIDE2IGJpdHMuCi0gKiBFbmNvZGluZyB0aGUgc2l6ZSBvZiB0aGUgcGFyYW1ldGVyIHN0cnVjdHVyZSBpbiB0aGUgaW9jdGwgcmVxdWVzdAotICogaXMgdXNlZnVsIGZvciBjYXRjaGluZyBwcm9ncmFtcyBjb21waWxlZCB3aXRoIG9sZCB2ZXJzaW9ucwotICogYW5kIHRvIGF2b2lkIG92ZXJ3cml0aW5nIHVzZXIgc3BhY2Ugb3V0c2lkZSB0aGUgdXNlciBidWZmZXIgYXJlYS4KLSAqIFRoZSBoaWdoZXN0IDIgYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIGluZGljYXRpbmcgdGhlIGBgYWNjZXNzIG1vZGUnJy4KLSAqIE5PVEU6IFRoaXMgbGltaXRzIHRoZSBtYXggcGFyYW1ldGVyIHNpemUgdG8gMTZrQiAtMSAhCi0gKi8KLQotLyoKLSAqIEkgZG9uJ3QgcmVhbGx5IGhhdmUgYW55IGlkZWEgYWJvdXQgd2hhdCB0aGlzIHNob3VsZCBsb29rIGxpa2UsIHNvCi0gKiBmb3IgdGhlIHRpbWUgYmVpbmcsIHRoaXMgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgUEMgZGVmaW5pdGlvbnMuCi0gKi8KLQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgaXMgZm9yIGNvbXBhdGliaWxpdHkgYWNyb3NzIHRoZSB2YXJpb3VzIExpbnV4Ci0gKiBwbGF0Zm9ybXMuICBUaGUgaTM4NiBpb2N0bCBudW1iZXJpbmcgc2NoZW1lIGRvZXNuJ3QgcmVhbGx5IGVuZm9yY2UKLSAqIGEgdHlwZSBmaWVsZC4gIERlIGZhY3RvLCBob3dldmVyLCB0aGUgdG9wIDggYml0cyBvZiB0aGUgbG93ZXIgMTYKLSAqIGJpdHMgYXJlIGluZGVlZCB1c2VkIGFzIGEgdHlwZSBmaWVsZCwgc28gd2UgbWlnaHQganVzdCBhcyB3ZWxsIG1ha2UKLSAqIHRoaXMgZXhwbGljaXQgaGVyZS4gIFBsZWFzZSBiZSBzdXJlIHRvIHVzZSB0aGUgZGVjb2RpbmcgbWFjcm9zCi0gKiBiZWxvdyBmcm9tIG5vdyBvbi4KLSAqLwotI2RlZmluZSBfSU9DX05SQklUUwk4Ci0jZGVmaW5lIF9JT0NfVFlQRUJJVFMJOAotI2RlZmluZSBfSU9DX1NJWkVCSVRTCTE0Ci0jZGVmaW5lIF9JT0NfRElSQklUUwkyCi0KLSNkZWZpbmUgX0lPQ19OUk1BU0sJKCgxIDw8IF9JT0NfTlJCSVRTKS0xKQotI2RlZmluZSBfSU9DX1RZUEVNQVNLCSgoMSA8PCBfSU9DX1RZUEVCSVRTKS0xKQotI2RlZmluZSBfSU9DX1NJWkVNQVNLCSgoMSA8PCBfSU9DX1NJWkVCSVRTKS0xKQotI2RlZmluZSBfSU9DX0RJUk1BU0sJKCgxIDw8IF9JT0NfRElSQklUUyktMSkKLQotI2RlZmluZSBfSU9DX05SU0hJRlQJMAotI2RlZmluZSBfSU9DX1RZUEVTSElGVAkoX0lPQ19OUlNISUZUK19JT0NfTlJCSVRTKQotI2RlZmluZSBfSU9DX1NJWkVTSElGVAkoX0lPQ19UWVBFU0hJRlQrX0lPQ19UWVBFQklUUykKLSNkZWZpbmUgX0lPQ19ESVJTSElGVAkoX0lPQ19TSVpFU0hJRlQrX0lPQ19TSVpFQklUUykKLQotLyoKLSAqIERpcmVjdGlvbiBiaXRzLgotICovCi0jZGVmaW5lIF9JT0NfTk9ORQkwVQotI2RlZmluZSBfSU9DX1dSSVRFCTFVCi0jZGVmaW5lIF9JT0NfUkVBRAkyVQotCi0jZGVmaW5lIF9JT0MoZGlyLHR5cGUsbnIsc2l6ZSkgXAotCSgoKGRpcikgIDw8IF9JT0NfRElSU0hJRlQpIHwgXAotCSAoKHR5cGUpIDw8IF9JT0NfVFlQRVNISUZUKSB8IFwKLQkgKChucikgICA8PCBfSU9DX05SU0hJRlQpIHwgXAotCSAoKHNpemUpIDw8IF9JT0NfU0laRVNISUZUKSkKLQotLyogdXNlZCB0byBjcmVhdGUgbnVtYmVycyAqLwotI2RlZmluZSBfSU8odHlwZSxucikJCV9JT0MoX0lPQ19OT05FLCh0eXBlKSwobnIpLDApCi0jZGVmaW5lIF9JT1IodHlwZSxucixzaXplKQlfSU9DKF9JT0NfUkVBRCwodHlwZSksKG5yKSxzaXplb2Yoc2l6ZSkpCi0jZGVmaW5lIF9JT1codHlwZSxucixzaXplKQlfSU9DKF9JT0NfV1JJVEUsKHR5cGUpLChuciksc2l6ZW9mKHNpemUpKQotI2RlZmluZSBfSU9XUih0eXBlLG5yLHNpemUpCV9JT0MoX0lPQ19SRUFEfF9JT0NfV1JJVEUsKHR5cGUpLChuciksc2l6ZW9mKHNpemUpKQotCi0vKiB1c2VkIHRvIGRlY29kZSBpb2N0bCBudW1iZXJzLi4gKi8KLSNkZWZpbmUgX0lPQ19ESVIobnIpCQkoKChucikgPj4gX0lPQ19ESVJTSElGVCkgJiBfSU9DX0RJUk1BU0spCi0jZGVmaW5lIF9JT0NfVFlQRShucikJCSgoKG5yKSA+PiBfSU9DX1RZUEVTSElGVCkgJiBfSU9DX1RZUEVNQVNLKQotI2RlZmluZSBfSU9DX05SKG5yKQkJKCgobnIpID4+IF9JT0NfTlJTSElGVCkgJiBfSU9DX05STUFTSykKLSNkZWZpbmUgX0lPQ19TSVpFKG5yKQkJKCgobnIpID4+IF9JT0NfU0laRVNISUZUKSAmIF9JT0NfU0laRU1BU0spCi0KLS8qIC4uLmFuZCBmb3IgdGhlIGRyaXZlcnMvc291bmQgZmlsZXMuLi4gKi8KLQotI2RlZmluZSBJT0NfSU4JCShfSU9DX1dSSVRFIDw8IF9JT0NfRElSU0hJRlQpCi0jZGVmaW5lIElPQ19PVVQJCShfSU9DX1JFQUQgPDwgX0lPQ19ESVJTSElGVCkKLSNkZWZpbmUgSU9DX0lOT1VUCSgoX0lPQ19XUklURXxfSU9DX1JFQUQpIDw8IF9JT0NfRElSU0hJRlQpCi0jZGVmaW5lIElPQ1NJWkVfTUFTSwkoX0lPQ19TSVpFTUFTSyA8PCBfSU9DX1NJWkVTSElGVCkKLSNkZWZpbmUgSU9DU0laRV9TSElGVAkoX0lPQ19TSVpFU0hJRlQpCi0KLSNlbmRpZiAvKiBfQVNNX0lPQ1RMX0ggKi8KLQorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2lvY3RsLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvbWItcmVncy5oIGIvaW5jbHVkZS9hc20tZnJ2L21iLXJlZ3MuaAppbmRleCBjOGY1NzVmLi45M2ZhNzMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvbWItcmVncy5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9tYi1yZWdzLmgKQEAgLTY4LDYgKzY4LDkgQEAKICNkZWZpbmUgX19pc19QQ0lfTUVNKGFkZHIpIFwKIAkoKHVuc2lnbmVkIGxvbmcpKGFkZHIpIC0gX19yZWdpb25fUENJX01FTSA8IDB4MDgwMDAwMDBVTCkKIAorI2RlZmluZSBfX2lzX1BDSV9hZGRyKGFkZHIpIFwKKwkoKHVuc2lnbmVkIGxvbmcpKGFkZHIpIC0gX19yZWdpb25fUENJX0lPIDwgMHgwYzAwMDAwMFVMKQorCiAjZGVmaW5lIF9fZ2V0X0NMS1NXKCkJKHsgKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKF9fcmVnaW9uX0NTMiArIDB4MDEzMDAwMGNVTCkgJiAweGZmVUw7IH0pCiAjZGVmaW5lIF9fZ2V0X0NMS0lOKCkJKF9fZ2V0X0NMS1NXKCkgKiAxMjVVICogMTAwMDAwVSAvIDI0VSkKIApAQCAtMTQ5LDYgKzE1Miw3IEBACiAKICNkZWZpbmUgX19pc19QQ0lfSU8oYWRkcikJMAkvKiBubyBQQ0kgKi8KICNkZWZpbmUgX19pc19QQ0lfTUVNKGFkZHIpCTAKKyNkZWZpbmUgX19pc19QQ0lfYWRkcihhZGRyKQkwCiAjZGVmaW5lIF9fcmVnaW9uX1BDSV9JTwkJMAogI2RlZmluZSBfX3JlZ2lvbl9QQ0lfTUVNCTAKICNkZWZpbmUgX19mbHVzaF9QQ0lfd3JpdGVzKCkJZG8geyB9IHdoaWxlKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvbWMxNDY4MThydGMuaCBiL2luY2x1ZGUvYXNtLWZydi9tYzE0NjgxOHJ0Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZGZiN2EKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1mcnYvbWMxNDY4MThydGMuaApAQCAtMCwwICsxLDE2IEBACisvKiBtYzE0NjgxOHJ0Yy5oOiBSVEMgZGVmcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9BU01fTUMxNDY4MThSVENfSAorI2RlZmluZSBfQVNNX01DMTQ2ODE4UlRDX0gKKworCisjZW5kaWYgLyogX0FTTV9NQzE0NjgxOFJUQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvbW9kdWxlLmggYi9pbmNsdWRlL2FzbS1mcnYvbW9kdWxlLmgKaW5kZXggMzIyM2NmYS4uM2Q1YzYzNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L21vZHVsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9tb2R1bGUuaApAQCAtMTEsMTAgKzExLDE4IEBACiAjaWZuZGVmIF9BU01fTU9EVUxFX0gKICNkZWZpbmUgX0FTTV9NT0RVTEVfSAogCi0jZGVmaW5lIG1vZHVsZV9tYXAoeCkJCXZtYWxsb2MoeCkKLSNkZWZpbmUgbW9kdWxlX3VubWFwKHgpCQl2ZnJlZSh4KQotI2RlZmluZSBtb2R1bGVfYXJjaF9pbml0KHgpCSgwKQotI2RlZmluZSBhcmNoX2luaXRfbW9kdWxlcyh4KQlkbyB7IH0gd2hpbGUgKDApCitzdHJ1Y3QgbW9kX2FyY2hfc3BlY2lmaWMKK3sKK307CisKKyNkZWZpbmUgRWxmX1NoZHIJRWxmMzJfU2hkcgorI2RlZmluZSBFbGZfU3ltCQlFbGYzMl9TeW0KKyNkZWZpbmUgRWxmX0VoZHIJRWxmMzJfRWhkcgorCisvKgorICogSW5jbHVkZSB0aGUgYXJjaGl0ZWN0dXJlIHZlcnNpb24uCisgKi8KKyNkZWZpbmUgTU9EVUxFX0FSQ0hfVkVSTUFHSUMgX19zdHJpbmdpZnkoUFJPQ0VTU09SX01PREVMX05BTUUpICIgIgogCiAjZW5kaWYgLyogX0FTTV9NT0RVTEVfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvbXV0ZXguaCBiL2luY2x1ZGUvYXNtLWZydi9tdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OGMxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1mcnYvbXV0ZXguaApAQCAtMCwwICsxLDkgQEAKKy8qCisgKiBQdWxsIGluIHRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbXV0ZXggZmFzdHBhdGguCisgKgorICogVE9ETzogaW1wbGVtZW50IG9wdGltaXplZCBwcmltaXRpdmVzIGluc3RlYWQsIG9yIGxlYXZlIHRoZSBnZW5lcmljCisgKiBpbXBsZW1lbnRhdGlvbiBpbiBwbGFjZSwgb3IgcGljayB0aGUgYXRvbWljX3hjaGcoKSBiYXNlZCBnZW5lcmljCisgKiBpbXBsZW1lbnRhdGlvbi4gKHNlZSBhc20tZ2VuZXJpYy9tdXRleC14Y2hnLmggZm9yIGRldGFpbHMpCisgKi8KKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL211dGV4LWRlYy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L3BjaS5oIGIvaW5jbHVkZS9hc20tZnJ2L3BjaS5oCmluZGV4IDExNjg0NTEuLjU5OGIwYzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1mcnYvcGNpLmgKQEAgLTU3LDYgKzU3LDE0IEBACiAgKi8KICNkZWZpbmUgUENJX0RNQV9CVVNfSVNfUEhZUwkoMSkKIAorLyogcGNpX3VubWFwX3twYWdlLHNpbmdsZX0gaXMgYSBub3Agc28uLi4gKi8KKyNkZWZpbmUgREVDTEFSRV9QQ0lfVU5NQVBfQUREUihBRERSX05BTUUpCisjZGVmaW5lIERFQ0xBUkVfUENJX1VOTUFQX0xFTihMRU5fTkFNRSkKKyNkZWZpbmUgcGNpX3VubWFwX2FkZHIoUFRSLCBBRERSX05BTUUpCQkoMCkKKyNkZWZpbmUgcGNpX3VubWFwX2FkZHJfc2V0KFBUUiwgQUREUl9OQU1FLCBWQUwpCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgcGNpX3VubWFwX2xlbihQVFIsIExFTl9OQU1FKQkJKDApCisjZGVmaW5lIHBjaV91bm1hcF9sZW5fc2V0KFBUUiwgTEVOX05BTUUsIFZBTCkJZG8geyB9IHdoaWxlICgwKQorCiAjaWZkZWYgQ09ORklHX1BDSQogc3RhdGljIGlubGluZSB2b2lkIHBjaV9kbWFfYnVyc3RfYWR2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCQllbnVtIHBjaV9kbWFfYnVyc3Rfc3RyYXRlZ3kgKnN0cmF0LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLWZydi9wZ3RhYmxlLmgKaW5kZXggODQ0NjY2My4uZDFjM2IxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1mcnYvcGd0YWJsZS5oCkBAIC00MjEsNiArNDIxLDExIEBACiB9CiAKIC8qCisgKiBNYWNybyB0byBtYXJrIGEgcGFnZSBwcm90ZWN0aW9uIHZhbHVlIGFzICJ1bmNhY2hlYWJsZSIKKyAqLworI2RlZmluZSBwZ3Byb3Rfbm9uY2FjaGVkKHByb3QpIChfX3BncHJvdChwZ3Byb3RfdmFsKHByb3QpIHwgX1BBR0VfTk9DQUNIRSkpCisKKy8qCiAgKiBDb252ZXJzaW9uIGZ1bmN0aW9uczogY29udmVydCBhIHBhZ2UgYW5kIHByb3RlY3Rpb24gdG8gYSBwYWdlIGVudHJ5LAogICogYW5kIGEgcGFnZSBlbnRyeSBhbmQgcGFnZSBkaXJlY3RvcnkgdG8gdGhlIHBhZ2UgdGhleSByZWZlciB0by4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1mcnYvdGhyZWFkX2luZm8uaAppbmRleCA2MGY2YjJhLi5lYTQyNmFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1mcnYvdGhyZWFkX2luZm8uaApAQCAtMTEwLDggKzExMCw2IEBACiAjZW5kaWYKIAogI2RlZmluZSBmcmVlX3RocmVhZF9pbmZvKGluZm8pCWtmcmVlKGluZm8pCi0jZGVmaW5lIGdldF90aHJlYWRfaW5mbyh0aSkJZ2V0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCi0jZGVmaW5lIHB1dF90aHJlYWRfaW5mbyh0aSkJcHV0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCiAKICNlbHNlIC8qICFfX0FTU0VNQkxZX18gKi8KIApAQCAtMTMxLDYgKzEyOSw3IEBACiAjZGVmaW5lIFRJRl9ORUVEX1JFU0NIRUQJMwkvKiByZXNjaGVkdWxpbmcgbmVjZXNzYXJ5ICovCiAjZGVmaW5lIFRJRl9TSU5HTEVTVEVQCQk0CS8qIHJlc3RvcmUgc2luZ2xlc3RlcCBvbiByZXR1cm4gdG8gdXNlciBtb2RlICovCiAjZGVmaW5lIFRJRl9JUkVUCQk1CS8qIHJldHVybiB3aXRoIGlyZXQgKi8KKyNkZWZpbmUgVElGX1JFU1RPUkVfU0lHTUFTSwk2CS8qIHJlc3RvcmUgc2lnbmFsIG1hc2sgaW4gZG9fc2lnbmFsKCkgKi8KICNkZWZpbmUgVElGX1BPTExJTkdfTlJGTEFHCTE2CS8qIHRydWUgaWYgcG9sbF9pZGxlKCkgaXMgcG9sbGluZyBUSUZfTkVFRF9SRVNDSEVEICovCiAjZGVmaW5lIFRJRl9NRU1ESUUJCTE3CS8qIE9PTSBraWxsZXIga2lsbGVkIHByb2Nlc3MgKi8KIApAQCAtMTQwLDYgKzEzOSw3IEBACiAjZGVmaW5lIF9USUZfTkVFRF9SRVNDSEVECSgxIDw8IFRJRl9ORUVEX1JFU0NIRUQpCiAjZGVmaW5lIF9USUZfU0lOR0xFU1RFUAkJKDEgPDwgVElGX1NJTkdMRVNURVApCiAjZGVmaW5lIF9USUZfSVJFVAkJKDEgPDwgVElGX0lSRVQpCisjZGVmaW5lIF9USUZfUkVTVE9SRV9TSUdNQVNLCSgxIDw8IFRJRl9SRVNUT1JFX1NJR01BU0spCiAjZGVmaW5lIF9USUZfUE9MTElOR19OUkZMQUcJKDEgPDwgVElGX1BPTExJTkdfTlJGTEFHKQogCiAjZGVmaW5lIF9USUZfV09SS19NQVNLCQkweDAwMDBGRkZFCS8qIHdvcmsgdG8gZG8gb24gaW50ZXJydXB0L2V4Y2VwdGlvbiByZXR1cm4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi90eXBlcy5oIGIvaW5jbHVkZS9hc20tZnJ2L3R5cGVzLmgKaW5kZXggNTA2MDVkZi4uMjU2MGY1OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L3R5cGVzLmgKQEAgLTU5LDcgKzU5LDYgQEAKIAogdHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIHM2NDsKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHU2NDsKLXR5cGVkZWYgdTY0IHVfcXVhZF90OwogCiAvKiBEbWEgYWRkcmVzc2VzIGFyZSAzMi1iaXRzIHdpZGUuICAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tZnJ2L3VhY2Nlc3MuaAppbmRleCA5OTFiNTBmLi5iNmJjYmUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi91YWNjZXNzLmgKQEAgLTE4MCwxNiArMTgwLDE2IEBACiAJCQkJCQkJCQlcCiAJc3dpdGNoIChzaXplb2YoKihwdHIpKSkgewkJCQkJXAogCWNhc2UgMToJCQkJCQkJCVwKLQkJX19nZXRfdXNlcl9hc20oX19ndV9lcnIsIF9fZ3VfdmFsLCBwdHIsICJ1YiIsICI9ciIpOwlcCisJCV9fZ2V0X3VzZXJfYXNtKF9fZ3VfZXJyLCAqKHU4KikmX19ndV92YWwsIHB0ciwgInViIiwgIj1yIik7IFwKIAkJYnJlYWs7CQkJCQkJCVwKIAljYXNlIDI6CQkJCQkJCQlcCi0JCV9fZ2V0X3VzZXJfYXNtKF9fZ3VfZXJyLCBfX2d1X3ZhbCwgcHRyLCAidWgiLCAiPXIiKTsJXAorCQlfX2dldF91c2VyX2FzbShfX2d1X2VyciwgKih1MTYqKSZfX2d1X3ZhbCwgcHRyLCAidWgiLCAiPXIiKTsgXAogCQlicmVhazsJCQkJCQkJXAogCWNhc2UgNDoJCQkJCQkJCVwKLQkJX19nZXRfdXNlcl9hc20oX19ndV9lcnIsIF9fZ3VfdmFsLCBwdHIsICIiLCAiPXIiKTsJXAorCQlfX2dldF91c2VyX2FzbShfX2d1X2VyciwgKih1MzIqKSZfX2d1X3ZhbCwgcHRyLCAiIiwgIj1yIik7IFwKIAkJYnJlYWs7CQkJCQkJCVwKIAljYXNlIDg6CQkJCQkJCQlcCi0JCV9fZ2V0X3VzZXJfYXNtKF9fZ3VfZXJyLCBfX2d1X3ZhbCwgcHRyLCAiZCIsICI9ZSIpOwlcCisJCV9fZ2V0X3VzZXJfYXNtKF9fZ3VfZXJyLCAqKHU2NCopJl9fZ3VfdmFsLCBwdHIsICJkIiwgIj1lIik7IFwKIAkJYnJlYWs7CQkJCQkJCVwKIAlkZWZhdWx0OgkJCQkJCQlcCiAJCV9fZ3VfZXJyID0gX19nZXRfdXNlcl9iYWQoKTsJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tZnJ2L3VuaXN0ZC5oCmluZGV4IDVjZjk4OWIuLjRkOTk0ZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1mcnYvdW5pc3RkLmgKQEAgLTMxMyw3ICszMTMsNyBAQAogICAgICAgICB1bnNpZ25lZCBsb25nIF9fc3IyID0gKHJlcyk7CQkJCQlcCiAJaWYgKF9fYnVpbHRpbl9leHBlY3QoX19zcjIgPj0gKHVuc2lnbmVkIGxvbmcpKC00MDk1KSwgMCkpIHsJXAogCQllcnJubyA9ICgtX19zcjIpOwkJCQkJXAotCQlfX3NyMiA9IFVMT05HX01BWDsJCQkJCVwKKwkJX19zcjIgPSB+MFVMOwkJCQkJCVwKIAl9CQkJCQkJCQlcCiAJcmV0dXJuICh0eXBlKSBfX3NyMjsJCQkJCQlcCiB9IHdoaWxlICgwKQpAQCAtNDg2LDYgKzQ4Niw3IEBACiAvKiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TSUdQRU5ESU5HICovCiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TSUdQUk9DTUFTSwogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfUlRfU0lHQUNUSU9OCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19SVF9TSUdTVVNQRU5ECiAjZW5kaWYKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi92Z2EuaCBiL2luY2x1ZGUvYXNtLWZydi92Z2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzAyYzgwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tZnJ2L3ZnYS5oCkBAIC0wLDAgKzEsMTcgQEAKKy8qIHZnYS5oOiBWR0EgcmVnaXN0ZXIgc3R1ZmYKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfQVNNX1ZHQV9ICisjZGVmaW5lIF9BU01fVkdBX0gKKworCisKKyNlbmRpZiAvKiBfQVNNX1ZHQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYveG9yLmggYi9pbmNsdWRlL2FzbS1mcnYveG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyZWIxMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWZydi94b3IuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMveG9yLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2F0b21pYy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9hdG9taWMuaAppbmRleCBlMGEyOGI5Li40MmE5NWQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2F0b21pYy5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvYXRvbWljLmgKQEAgLTgsNiArOCw3IEBACiAgKiBlZGl0IGFsbCBhcmNoIHNwZWNpZmljIGF0b21pYy5oIGZpbGVzLgogICovCiAKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KIAogLyoKICAqIFN1cHBwb3J0IGZvciBhdG9taWNfbG9uZ190CkBAIC0zNCw3ICszNSw3IEBACiB7CiAJYXRvbWljNjRfdCAqdiA9IChhdG9taWM2NF90ICopbDsKIAotCWF0b21pY19zZXQodiwgaSk7CisJYXRvbWljNjRfc2V0KHYsIGkpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2xvbmdfaW5jKGF0b21pY19sb25nX3QgKmwpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2RtYS1tYXBwaW5nLmgKaW5kZXggNzQ3ZDc5MC4uMWIzNTYyMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZG1hLW1hcHBpbmcuaApAQCAtMjc0LDcgKzI3NCw3IEBACiB7CiAJLyogbm8gZWFzeSB3YXkgdG8gZ2V0IGNhY2hlIHNpemUgb24gYWxsIHByb2Nlc3NvcnMsIHNvIHJldHVybgogCSAqIHRoZSBtYXhpbXVtIHBvc3NpYmxlLCB0byBiZSBzYWZlICovCi0JcmV0dXJuICgxIDw8IEwxX0NBQ0hFX1NISUZUX01BWCk7CisJcmV0dXJuICgxIDw8IElOVEVSTk9ERV9DQUNIRV9TSElGVCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9mdXRleC5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9mdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZTJjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2Z1dGV4LmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBfQVNNX0dFTkVSSUNfRlVURVhfSAorI2RlZmluZSBfQVNNX0dFTkVSSUNfRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldDsKKwlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCisJCW9wYXJnID0gMSA8PCBvcGFyZzsKKworCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWluY19wcmVlbXB0X2NvdW50KCk7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBGVVRFWF9PUF9TRVQ6CisJY2FzZSBGVVRFWF9PUF9BREQ6CisJY2FzZSBGVVRFWF9PUF9PUjoKKwljYXNlIEZVVEVYX09QX0FORE46CisJY2FzZSBGVVRFWF9PUF9YT1I6CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1NZUzsKKwl9CisKKwlkZWNfcHJlZW1wdF9jb3VudCgpOworCisJaWYgKCFyZXQpIHsKKwkJc3dpdGNoIChjbXApIHsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfRVE6IHJldCA9IChvbGR2YWwgPT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX05FOiByZXQgPSAob2xkdmFsICE9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MVDogcmV0ID0gKG9sZHZhbCA8IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HRTogcmV0ID0gKG9sZHZhbCA+PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTEU6IHJldCA9IChvbGR2YWwgPD0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dUOiByZXQgPSAob2xkdmFsID4gY21wYXJnKTsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldCA9IC1FTk9TWVM7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvaW9jdGwuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDAyNzI5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9pb2N0bC5oCkBAIC0wLDAgKzEsODAgQEAKKyNpZm5kZWYgX0FTTV9HRU5FUklDX0lPQ1RMX0gKKyNkZWZpbmUgX0FTTV9HRU5FUklDX0lPQ1RMX0gKKworLyogaW9jdGwgY29tbWFuZCBlbmNvZGluZzogMzIgYml0cyB0b3RhbCwgY29tbWFuZCBpbiBsb3dlciAxNiBiaXRzLAorICogc2l6ZSBvZiB0aGUgcGFyYW1ldGVyIHN0cnVjdHVyZSBpbiB0aGUgbG93ZXIgMTQgYml0cyBvZiB0aGUKKyAqIHVwcGVyIDE2IGJpdHMuCisgKiBFbmNvZGluZyB0aGUgc2l6ZSBvZiB0aGUgcGFyYW1ldGVyIHN0cnVjdHVyZSBpbiB0aGUgaW9jdGwgcmVxdWVzdAorICogaXMgdXNlZnVsIGZvciBjYXRjaGluZyBwcm9ncmFtcyBjb21waWxlZCB3aXRoIG9sZCB2ZXJzaW9ucworICogYW5kIHRvIGF2b2lkIG92ZXJ3cml0aW5nIHVzZXIgc3BhY2Ugb3V0c2lkZSB0aGUgdXNlciBidWZmZXIgYXJlYS4KKyAqIFRoZSBoaWdoZXN0IDIgYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIGluZGljYXRpbmcgdGhlIGBgYWNjZXNzIG1vZGUnJy4KKyAqIE5PVEU6IFRoaXMgbGltaXRzIHRoZSBtYXggcGFyYW1ldGVyIHNpemUgdG8gMTZrQiAtMSAhCisgKi8KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgaXMgZm9yIGNvbXBhdGliaWxpdHkgYWNyb3NzIHRoZSB2YXJpb3VzIExpbnV4CisgKiBwbGF0Zm9ybXMuICBUaGUgZ2VuZXJpYyBpb2N0bCBudW1iZXJpbmcgc2NoZW1lIGRvZXNuJ3QgcmVhbGx5IGVuZm9yY2UKKyAqIGEgdHlwZSBmaWVsZC4gIERlIGZhY3RvLCBob3dldmVyLCB0aGUgdG9wIDggYml0cyBvZiB0aGUgbG93ZXIgMTYKKyAqIGJpdHMgYXJlIGluZGVlZCB1c2VkIGFzIGEgdHlwZSBmaWVsZCwgc28gd2UgbWlnaHQganVzdCBhcyB3ZWxsIG1ha2UKKyAqIHRoaXMgZXhwbGljaXQgaGVyZS4gIFBsZWFzZSBiZSBzdXJlIHRvIHVzZSB0aGUgZGVjb2RpbmcgbWFjcm9zCisgKiBiZWxvdyBmcm9tIG5vdyBvbi4KKyAqLworI2RlZmluZSBfSU9DX05SQklUUwk4CisjZGVmaW5lIF9JT0NfVFlQRUJJVFMJOAorI2RlZmluZSBfSU9DX1NJWkVCSVRTCTE0CisjZGVmaW5lIF9JT0NfRElSQklUUwkyCisKKyNkZWZpbmUgX0lPQ19OUk1BU0sJKCgxIDw8IF9JT0NfTlJCSVRTKS0xKQorI2RlZmluZSBfSU9DX1RZUEVNQVNLCSgoMSA8PCBfSU9DX1RZUEVCSVRTKS0xKQorI2RlZmluZSBfSU9DX1NJWkVNQVNLCSgoMSA8PCBfSU9DX1NJWkVCSVRTKS0xKQorI2RlZmluZSBfSU9DX0RJUk1BU0sJKCgxIDw8IF9JT0NfRElSQklUUyktMSkKKworI2RlZmluZSBfSU9DX05SU0hJRlQJMAorI2RlZmluZSBfSU9DX1RZUEVTSElGVAkoX0lPQ19OUlNISUZUK19JT0NfTlJCSVRTKQorI2RlZmluZSBfSU9DX1NJWkVTSElGVAkoX0lPQ19UWVBFU0hJRlQrX0lPQ19UWVBFQklUUykKKyNkZWZpbmUgX0lPQ19ESVJTSElGVAkoX0lPQ19TSVpFU0hJRlQrX0lPQ19TSVpFQklUUykKKworLyoKKyAqIERpcmVjdGlvbiBiaXRzLgorICovCisjZGVmaW5lIF9JT0NfTk9ORQkwVQorI2RlZmluZSBfSU9DX1dSSVRFCTFVCisjZGVmaW5lIF9JT0NfUkVBRAkyVQorCisjZGVmaW5lIF9JT0MoZGlyLHR5cGUsbnIsc2l6ZSkgXAorCSgoKGRpcikgIDw8IF9JT0NfRElSU0hJRlQpIHwgXAorCSAoKHR5cGUpIDw8IF9JT0NfVFlQRVNISUZUKSB8IFwKKwkgKChucikgICA8PCBfSU9DX05SU0hJRlQpIHwgXAorCSAoKHNpemUpIDw8IF9JT0NfU0laRVNISUZUKSkKKworLyogcHJvdm9rZSBjb21waWxlIGVycm9yIGZvciBpbnZhbGlkIHVzZXMgb2Ygc2l6ZSBhcmd1bWVudCAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBfX2ludmFsaWRfc2l6ZV9hcmd1bWVudF9mb3JfSU9DOworI2RlZmluZSBfSU9DX1RZUEVDSEVDSyh0KSBcCisJKChzaXplb2YodCkgPT0gc2l6ZW9mKHRbMV0pICYmIFwKKwkgIHNpemVvZih0KSA8ICgxIDw8IF9JT0NfU0laRUJJVFMpKSA/IFwKKwkgIHNpemVvZih0KSA6IF9faW52YWxpZF9zaXplX2FyZ3VtZW50X2Zvcl9JT0MpCisKKy8qIHVzZWQgdG8gY3JlYXRlIG51bWJlcnMgKi8KKyNkZWZpbmUgX0lPKHR5cGUsbnIpCQlfSU9DKF9JT0NfTk9ORSwodHlwZSksKG5yKSwwKQorI2RlZmluZSBfSU9SKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1JFQUQsKHR5cGUpLChuciksKF9JT0NfVFlQRUNIRUNLKHNpemUpKSkKKyNkZWZpbmUgX0lPVyh0eXBlLG5yLHNpemUpCV9JT0MoX0lPQ19XUklURSwodHlwZSksKG5yKSwoX0lPQ19UWVBFQ0hFQ0soc2l6ZSkpKQorI2RlZmluZSBfSU9XUih0eXBlLG5yLHNpemUpCV9JT0MoX0lPQ19SRUFEfF9JT0NfV1JJVEUsKHR5cGUpLChuciksKF9JT0NfVFlQRUNIRUNLKHNpemUpKSkKKyNkZWZpbmUgX0lPUl9CQUQodHlwZSxucixzaXplKQlfSU9DKF9JT0NfUkVBRCwodHlwZSksKG5yKSxzaXplb2Yoc2l6ZSkpCisjZGVmaW5lIF9JT1dfQkFEKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1dSSVRFLCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKKyNkZWZpbmUgX0lPV1JfQkFEKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1JFQUR8X0lPQ19XUklURSwodHlwZSksKG5yKSxzaXplb2Yoc2l6ZSkpCisKKy8qIHVzZWQgdG8gZGVjb2RlIGlvY3RsIG51bWJlcnMuLiAqLworI2RlZmluZSBfSU9DX0RJUihucikJCSgoKG5yKSA+PiBfSU9DX0RJUlNISUZUKSAmIF9JT0NfRElSTUFTSykKKyNkZWZpbmUgX0lPQ19UWVBFKG5yKQkJKCgobnIpID4+IF9JT0NfVFlQRVNISUZUKSAmIF9JT0NfVFlQRU1BU0spCisjZGVmaW5lIF9JT0NfTlIobnIpCQkoKChucikgPj4gX0lPQ19OUlNISUZUKSAmIF9JT0NfTlJNQVNLKQorI2RlZmluZSBfSU9DX1NJWkUobnIpCQkoKChucikgPj4gX0lPQ19TSVpFU0hJRlQpICYgX0lPQ19TSVpFTUFTSykKKworLyogLi4uYW5kIGZvciB0aGUgZHJpdmVycy9zb3VuZCBmaWxlcy4uLiAqLworCisjZGVmaW5lIElPQ19JTgkJKF9JT0NfV1JJVEUgPDwgX0lPQ19ESVJTSElGVCkKKyNkZWZpbmUgSU9DX09VVAkJKF9JT0NfUkVBRCA8PCBfSU9DX0RJUlNISUZUKQorI2RlZmluZSBJT0NfSU5PVVQJKChfSU9DX1dSSVRFfF9JT0NfUkVBRCkgPDwgX0lPQ19ESVJTSElGVCkKKyNkZWZpbmUgSU9DU0laRV9NQVNLCShfSU9DX1NJWkVNQVNLIDw8IF9JT0NfU0laRVNISUZUKQorI2RlZmluZSBJT0NTSVpFX1NISUZUCShfSU9DX1NJWkVTSElGVCkKKworI2VuZGlmIC8qIF9BU01fR0VORVJJQ19JT0NUTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL211dGV4LWRlYy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9tdXRleC1kZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGM2ZDFmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9tdXRleC1kZWMuaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIGFzbS1nZW5lcmljL211dGV4LWRlYy5oCisgKgorICogR2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbXV0ZXggZmFzdHBhdGgsIGJhc2VkIG9uIGF0b21pYworICogZGVjcmVtZW50L2luY3JlbWVudC4KKyAqLworI2lmbmRlZiBfQVNNX0dFTkVSSUNfTVVURVhfREVDX0gKKyNkZWZpbmUgX0FTTV9HRU5FUklDX01VVEVYX0RFQ19ICisKKy8qKgorICogIF9fbXV0ZXhfZmFzdHBhdGhfbG9jayAtIHRyeSB0byB0YWtlIHRoZSBsb2NrIGJ5IG1vdmluZyB0aGUgY291bnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIDEgdG8gYSAwIHZhbHVlCisgKiAgQGNvdW50OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqICBAZmFpbF9mbjogZnVuY3Rpb24gdG8gY2FsbCBpZiB0aGUgb3JpZ2luYWwgdmFsdWUgd2FzIG5vdCAxCisgKgorICogQ2hhbmdlIHRoZSBjb3VudCBmcm9tIDEgdG8gYSB2YWx1ZSBsb3dlciB0aGFuIDEsIGFuZCBjYWxsIDxmYWlsX2ZuPiBpZgorICogaXQgd2Fzbid0IDEgb3JpZ2luYWxseS4gVGhpcyBmdW5jdGlvbiBNVVNUIGxlYXZlIHRoZSB2YWx1ZSBsb3dlciB0aGFuCisgKiAxIGV2ZW4gd2hlbiB0aGUgIjEiIGFzc2VydGlvbiB3YXNuJ3QgdHJ1ZS4KKyAqLworI2RlZmluZSBfX211dGV4X2Zhc3RwYXRoX2xvY2soY291bnQsIGZhaWxfZm4pCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKHVubGlrZWx5KGF0b21pY19kZWNfcmV0dXJuKGNvdW50KSA8IDApKQkJCVwKKwkJZmFpbF9mbihjb3VudCk7CQkJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJc21wX21iKCk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyoqCisgKiAgX19tdXRleF9mYXN0cGF0aF9sb2NrX3JldHZhbCAtIHRyeSB0byB0YWtlIHRoZSBsb2NrIGJ5IG1vdmluZyB0aGUgY291bnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAxIHRvIGEgMCB2YWx1ZQorICogIEBjb3VudDogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiAgQGZhaWxfZm46IGZ1bmN0aW9uIHRvIGNhbGwgaWYgdGhlIG9yaWdpbmFsIHZhbHVlIHdhcyBub3QgMQorICoKKyAqIENoYW5nZSB0aGUgY291bnQgZnJvbSAxIHRvIGEgdmFsdWUgbG93ZXIgdGhhbiAxLCBhbmQgY2FsbCA8ZmFpbF9mbj4gaWYKKyAqIGl0IHdhc24ndCAxIG9yaWdpbmFsbHkuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAwIGlmIHRoZSBmYXN0cGF0aCBzdWNjZWVkcywKKyAqIG9yIGFueXRoaW5nIHRoZSBzbG93IHBhdGggZnVuY3Rpb24gcmV0dXJucy4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK19fbXV0ZXhfZmFzdHBhdGhfbG9ja19yZXR2YWwoYXRvbWljX3QgKmNvdW50LCBpbnQgKCpmYWlsX2ZuKShhdG9taWNfdCAqKSkKK3sKKwlpZiAodW5saWtlbHkoYXRvbWljX2RlY19yZXR1cm4oY291bnQpIDwgMCkpCisJCXJldHVybiBmYWlsX2ZuKGNvdW50KTsKKwllbHNlIHsKKwkJc21wX21iKCk7CisJCXJldHVybiAwOworCX0KK30KKworLyoqCisgKiAgX19tdXRleF9mYXN0cGF0aF91bmxvY2sgLSB0cnkgdG8gcHJvbW90ZSB0aGUgY291bnQgZnJvbSAwIHRvIDEKKyAqICBAY291bnQ6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogIEBmYWlsX2ZuOiBmdW5jdGlvbiB0byBjYWxsIGlmIHRoZSBvcmlnaW5hbCB2YWx1ZSB3YXMgbm90IDAKKyAqCisgKiBUcnkgdG8gcHJvbW90ZSB0aGUgY291bnQgZnJvbSAwIHRvIDEuIElmIGl0IHdhc24ndCAwLCBjYWxsIDxmYWlsX2ZuPi4KKyAqIEluIHRoZSBmYWlsdXJlIGNhc2UsIHRoaXMgZnVuY3Rpb24gaXMgYWxsb3dlZCB0byBlaXRoZXIgc2V0IHRoZSB2YWx1ZSB0bworICogMSwgb3IgdG8gc2V0IGl0IHRvIGEgdmFsdWUgbG93ZXIgdGhhbiAxLgorICoKKyAqIElmIHRoZSBpbXBsZW1lbnRhdGlvbiBzZXRzIGl0IHRvIGEgdmFsdWUgb2YgbG93ZXIgdGhhbiAxLCB0aGVuIHRoZQorICogX19tdXRleF9zbG93cGF0aF9uZWVkc190b191bmxvY2soKSBtYWNybyBuZWVkcyB0byByZXR1cm4gMSwgaXQgbmVlZHMKKyAqIHRvIHJldHVybiAwIG90aGVyd2lzZS4KKyAqLworI2RlZmluZSBfX211dGV4X2Zhc3RwYXRoX3VubG9jayhjb3VudCwgZmFpbF9mbikJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlzbXBfbWIoKTsJCQkJCQkJXAorCWlmICh1bmxpa2VseShhdG9taWNfaW5jX3JldHVybihjb3VudCkgPD0gMCkpCQkJXAorCQlmYWlsX2ZuKGNvdW50KTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fbXV0ZXhfc2xvd3BhdGhfbmVlZHNfdG9fdW5sb2NrKCkJCTEKKworLyoqCisgKiBfX211dGV4X2Zhc3RwYXRoX3RyeWxvY2sgLSB0cnkgdG8gYWNxdWlyZSB0aGUgbXV0ZXgsIHdpdGhvdXQgd2FpdGluZworICoKKyAqICBAY291bnQ6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogIEBmYWlsX2ZuOiBmYWxsYmFjayBmdW5jdGlvbgorICoKKyAqIENoYW5nZSB0aGUgY291bnQgZnJvbSAxIHRvIGEgdmFsdWUgbG93ZXIgdGhhbiAxLCBhbmQgcmV0dXJuIDAgKGZhaWx1cmUpCisgKiBpZiBpdCB3YXNuJ3QgMSBvcmlnaW5hbGx5LCBvciByZXR1cm4gMSAoc3VjY2Vzcykgb3RoZXJ3aXNlLiBUaGlzIGZ1bmN0aW9uCisgKiBNVVNUIGxlYXZlIHRoZSB2YWx1ZSBsb3dlciB0aGFuIDEgZXZlbiB3aGVuIHRoZSAiMSIgYXNzZXJ0aW9uIHdhc24ndCB0cnVlLgorICogQWRkaXRpb25hbGx5LCBpZiB0aGUgdmFsdWUgd2FzIDwgMCBvcmlnaW5hbGx5LCB0aGlzIGZ1bmN0aW9uIG11c3Qgbm90IGxlYXZlCisgKiBpdCB0byAwIG9uIGZhaWx1cmUuCisgKgorICogSWYgdGhlIGFyY2hpdGVjdHVyZSBoYXMgbm8gZWZmZWN0aXZlIHRyeWxvY2sgdmFyaWFudCwgaXQgc2hvdWxkIGNhbGwgdGhlCisgKiA8ZmFpbF9mbj4gc3BpbmxvY2stYmFzZWQgdHJ5bG9jayB2YXJpYW50IHVuY29uZGl0aW9uYWxseS4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK19fbXV0ZXhfZmFzdHBhdGhfdHJ5bG9jayhhdG9taWNfdCAqY291bnQsIGludCAoKmZhaWxfZm4pKGF0b21pY190ICopKQoreworCS8qCisJICogV2UgaGF2ZSB0d28gdmFyaWFudHMgaGVyZS4gVGhlIGNtcHhjaGcgYmFzZWQgb25lIGlzIHRoZSBiZXN0IG9uZQorCSAqIGJlY2F1c2UgaXQgbmV2ZXIgaW5kdWNlIGEgZmFsc2UgY29udGVudGlvbiBzdGF0ZS4gIEl0IGlzIGluY2x1ZGVkCisJICogaGVyZSBiZWNhdXNlIGFyY2hpdGVjdHVyZXMgdXNpbmcgdGhlIGluYy9kZWMgYWxnb3JpdGhtcyBvdmVyIHRoZQorCSAqIHhjaGcgb25lcyBhcmUgbXVjaCBtb3JlIGxpa2VseSB0byBzdXBwb3J0IGNtcHhjaGcgbmF0aXZlbHkuCisJICoKKwkgKiBJZiBub3Qgd2UgZmFsbCBiYWNrIHRvIHRoZSBzcGlubG9jayBiYXNlZCB2YXJpYW50IC0gdGhhdCBpcworCSAqIGp1c3QgYXMgZWZmaWNpZW50IChhbmQgc2ltcGxlcikgYXMgYSAnZGVzdHJ1Y3RpdmUnIHByb2Jpbmcgb2YKKwkgKiB0aGUgbXV0ZXggc3RhdGUgd291bGQgYmUuCisJICovCisjaWZkZWYgX19IQVZFX0FSQ0hfQ01QWENIRworCWlmIChsaWtlbHkoYXRvbWljX2NtcHhjaGcoY291bnQsIDEsIDApID09IDEpKSB7CisJCXNtcF9tYigpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7CisjZWxzZQorCXJldHVybiBmYWlsX2ZuKGNvdW50KTsKKyNlbmRpZgorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvbXV0ZXgtbnVsbC5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9tdXRleC1udWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNmOGI3YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvbXV0ZXgtbnVsbC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBhc20tZ2VuZXJpYy9tdXRleC1udWxsLmgKKyAqCisgKiBHZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtdXRleCBmYXN0cGF0aCwgYmFzZWQgb24gTk9QIDotKQorICoKKyAqIFRoaXMgaXMgdXNlZCBieSB0aGUgbXV0ZXgtZGVidWdnaW5nIGluZnJhc3RydWN0dXJlLCBidXQgaXQgY2FuIGFsc28KKyAqIGJlIHVzZWQgYnkgYXJjaGl0ZWN0dXJlcyB0aGF0IChmb3Igd2hhdGV2ZXIgcmVhc29uKSB3YW50IHRvIHVzZSB0aGUKKyAqIHNwaW5sb2NrIGJhc2VkIHNsb3dwYXRoLgorICovCisjaWZuZGVmIF9BU01fR0VORVJJQ19NVVRFWF9OVUxMX0gKKyNkZWZpbmUgX0FTTV9HRU5FUklDX01VVEVYX05VTExfSAorCisvKiBleHRyYSBwYXJhbWV0ZXIgb25seSBuZWVkZWQgZm9yIG11dGV4IGRlYnVnZ2luZzogKi8KKyNpZm5kZWYgX19JUF9fCisjIGRlZmluZSBfX0lQX18KKyNlbmRpZgorCisjZGVmaW5lIF9fbXV0ZXhfZmFzdHBhdGhfbG9jayhjb3VudCwgZmFpbF9mbikJICAgICAgZmFpbF9mbihjb3VudCBfX1JFVF9JUF9fKQorI2RlZmluZSBfX211dGV4X2Zhc3RwYXRoX2xvY2tfcmV0dmFsKGNvdW50LCBmYWlsX2ZuKSAgZmFpbF9mbihjb3VudCBfX1JFVF9JUF9fKQorI2RlZmluZSBfX211dGV4X2Zhc3RwYXRoX3VubG9jayhjb3VudCwgZmFpbF9mbikgICAgICAgZmFpbF9mbihjb3VudCBfX1JFVF9JUF9fKQorI2RlZmluZSBfX211dGV4X2Zhc3RwYXRoX3RyeWxvY2soY291bnQsIGZhaWxfZm4pICAgICAgZmFpbF9mbihjb3VudCkKKyNkZWZpbmUgX19tdXRleF9zbG93cGF0aF9uZWVkc190b191bmxvY2soKQkgICAgICAxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9tdXRleC14Y2hnLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL211dGV4LXhjaGcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDI0ZjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9tdXRleC14Y2hnLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBhc20tZ2VuZXJpYy9tdXRleC14Y2hnLmgKKyAqCisgKiBHZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtdXRleCBmYXN0cGF0aCwgYmFzZWQgb24geGNoZygpLgorICoKKyAqIE5PVEU6IEFuIHhjaGcgYmFzZWQgaW1wbGVtZW50YXRpb24gaXMgbGVzcyBvcHRpbWFsIHRoYW4gYW4gYXRvbWljCisgKiAgICAgICBkZWNyZW1lbnQvaW5jcmVtZW50IGJhc2VkIGltcGxlbWVudGF0aW9uLiBJZiB5b3VyIGFyY2hpdGVjdHVyZQorICogICAgICAgaGFzIGEgcmVhc29uYWJsZSBhdG9taWMgZGVjL2luYyB0aGVuIHlvdSBzaG91bGQgcHJvYmFibHkgdXNlCisgKgkgYXNtLWdlbmVyaWMvbXV0ZXgtZGVjLmggaW5zdGVhZCwgb3IgeW91IGNvdWxkIG9wZW4tY29kZSBhbgorICoJIG9wdGltaXplZCB2ZXJzaW9uIGluIGFzbS9tdXRleC5oLgorICovCisjaWZuZGVmIF9BU01fR0VORVJJQ19NVVRFWF9YQ0hHX0gKKyNkZWZpbmUgX0FTTV9HRU5FUklDX01VVEVYX1hDSEdfSAorCisvKioKKyAqICBfX211dGV4X2Zhc3RwYXRoX2xvY2sgLSB0cnkgdG8gdGFrZSB0aGUgbG9jayBieSBtb3ZpbmcgdGhlIGNvdW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAxIHRvIGEgMCB2YWx1ZQorICogIEBjb3VudDogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiAgQGZhaWxfZm46IGZ1bmN0aW9uIHRvIGNhbGwgaWYgdGhlIG9yaWdpbmFsIHZhbHVlIHdhcyBub3QgMQorICoKKyAqIENoYW5nZSB0aGUgY291bnQgZnJvbSAxIHRvIGEgdmFsdWUgbG93ZXIgdGhhbiAxLCBhbmQgY2FsbCA8ZmFpbF9mbj4gaWYgaXQKKyAqIHdhc24ndCAxIG9yaWdpbmFsbHkuIFRoaXMgZnVuY3Rpb24gTVVTVCBsZWF2ZSB0aGUgdmFsdWUgbG93ZXIgdGhhbiAxCisgKiBldmVuIHdoZW4gdGhlICIxIiBhc3NlcnRpb24gd2Fzbid0IHRydWUuCisgKi8KKyNkZWZpbmUgX19tdXRleF9mYXN0cGF0aF9sb2NrKGNvdW50LCBmYWlsX2ZuKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmICh1bmxpa2VseShhdG9taWNfeGNoZyhjb3VudCwgMCkgIT0gMSkpCQkJXAorCQlmYWlsX2ZuKGNvdW50KTsJCQkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQlzbXBfbWIoKTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisKKy8qKgorICogIF9fbXV0ZXhfZmFzdHBhdGhfbG9ja19yZXR2YWwgLSB0cnkgdG8gdGFrZSB0aGUgbG9jayBieSBtb3ZpbmcgdGhlIGNvdW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gMSB0byBhIDAgdmFsdWUKKyAqICBAY291bnQ6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogIEBmYWlsX2ZuOiBmdW5jdGlvbiB0byBjYWxsIGlmIHRoZSBvcmlnaW5hbCB2YWx1ZSB3YXMgbm90IDEKKyAqCisgKiBDaGFuZ2UgdGhlIGNvdW50IGZyb20gMSB0byBhIHZhbHVlIGxvd2VyIHRoYW4gMSwgYW5kIGNhbGwgPGZhaWxfZm4+IGlmIGl0CisgKiB3YXNuJ3QgMSBvcmlnaW5hbGx5LiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBpZiB0aGUgZmFzdHBhdGggc3VjY2VlZHMsCisgKiBvciBhbnl0aGluZyB0aGUgc2xvdyBwYXRoIGZ1bmN0aW9uIHJldHVybnMKKyAqLworc3RhdGljIGlubGluZSBpbnQKK19fbXV0ZXhfZmFzdHBhdGhfbG9ja19yZXR2YWwoYXRvbWljX3QgKmNvdW50LCBpbnQgKCpmYWlsX2ZuKShhdG9taWNfdCAqKSkKK3sKKwlpZiAodW5saWtlbHkoYXRvbWljX3hjaGcoY291bnQsIDApICE9IDEpKQorCQlyZXR1cm4gZmFpbF9mbihjb3VudCk7CisJZWxzZSB7CisJCXNtcF9tYigpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qKgorICogIF9fbXV0ZXhfZmFzdHBhdGhfdW5sb2NrIC0gdHJ5IHRvIHByb21vdGUgdGhlIG11dGV4IGZyb20gMCB0byAxCisgKiAgQGNvdW50OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqICBAZmFpbF9mbjogZnVuY3Rpb24gdG8gY2FsbCBpZiB0aGUgb3JpZ2luYWwgdmFsdWUgd2FzIG5vdCAwCisgKgorICogdHJ5IHRvIHByb21vdGUgdGhlIG11dGV4IGZyb20gMCB0byAxLiBpZiBpdCB3YXNuJ3QgMCwgY2FsbCA8ZnVuY3Rpb24+CisgKiBJbiB0aGUgZmFpbHVyZSBjYXNlLCB0aGlzIGZ1bmN0aW9uIGlzIGFsbG93ZWQgdG8gZWl0aGVyIHNldCB0aGUgdmFsdWUgdG8KKyAqIDEsIG9yIHRvIHNldCBpdCB0byBhIHZhbHVlIGxvd2VyIHRoYW4gb25lLgorICogSWYgdGhlIGltcGxlbWVudGF0aW9uIHNldHMgaXQgdG8gYSB2YWx1ZSBvZiBsb3dlciB0aGFuIG9uZSwgdGhlCisgKiBfX211dGV4X3Nsb3dwYXRoX25lZWRzX3RvX3VubG9jaygpIG1hY3JvIG5lZWRzIHRvIHJldHVybiAxLCBpdCBuZWVkcworICogdG8gcmV0dXJuIDAgb3RoZXJ3aXNlLgorICovCisjZGVmaW5lIF9fbXV0ZXhfZmFzdHBhdGhfdW5sb2NrKGNvdW50LCBmYWlsX2ZuKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXNtcF9tYigpOwkJCQkJCQlcCisJaWYgKHVubGlrZWx5KGF0b21pY194Y2hnKGNvdW50LCAxKSAhPSAwKSkJCQlcCisJCWZhaWxfZm4oY291bnQpOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgX19tdXRleF9zbG93cGF0aF9uZWVkc190b191bmxvY2soKQkJMAorCisvKioKKyAqIF9fbXV0ZXhfZmFzdHBhdGhfdHJ5bG9jayAtIHRyeSB0byBhY3F1aXJlIHRoZSBtdXRleCwgd2l0aG91dCB3YWl0aW5nCisgKgorICogIEBjb3VudDogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiAgQGZhaWxfZm46IHNwaW5sb2NrIGJhc2VkIHRyeWxvY2sgaW1wbGVtZW50YXRpb24KKyAqCisgKiBDaGFuZ2UgdGhlIGNvdW50IGZyb20gMSB0byBhIHZhbHVlIGxvd2VyIHRoYW4gMSwgYW5kIHJldHVybiAwIChmYWlsdXJlKQorICogaWYgaXQgd2Fzbid0IDEgb3JpZ2luYWxseSwgb3IgcmV0dXJuIDEgKHN1Y2Nlc3MpIG90aGVyd2lzZS4gVGhpcyBmdW5jdGlvbgorICogTVVTVCBsZWF2ZSB0aGUgdmFsdWUgbG93ZXIgdGhhbiAxIGV2ZW4gd2hlbiB0aGUgIjEiIGFzc2VydGlvbiB3YXNuJ3QgdHJ1ZS4KKyAqIEFkZGl0aW9uYWxseSwgaWYgdGhlIHZhbHVlIHdhcyA8IDAgb3JpZ2luYWxseSwgdGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBsZWF2ZQorICogaXQgdG8gMCBvbiBmYWlsdXJlLgorICoKKyAqIElmIHRoZSBhcmNoaXRlY3R1cmUgaGFzIG5vIGVmZmVjdGl2ZSB0cnlsb2NrIHZhcmlhbnQsIGl0IHNob3VsZCBjYWxsIHRoZQorICogPGZhaWxfZm4+IHNwaW5sb2NrLWJhc2VkIHRyeWxvY2sgdmFyaWFudCB1bmNvbmRpdGlvbmFsbHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX211dGV4X2Zhc3RwYXRoX3RyeWxvY2soYXRvbWljX3QgKmNvdW50LCBpbnQgKCpmYWlsX2ZuKShhdG9taWNfdCAqKSkKK3sKKwlpbnQgcHJldiA9IGF0b21pY194Y2hnKGNvdW50LCAwKTsKKworCWlmICh1bmxpa2VseShwcmV2IDwgMCkpIHsKKwkJLyoKKwkJICogVGhlIGxvY2sgd2FzIG1hcmtlZCBjb250ZW5kZWQgc28gd2UgbXVzdCByZXN0b3JlIHRoYXQKKwkJICogc3RhdGUuIElmIHdoaWxlIGRvaW5nIHNvIHdlIGdldCBiYWNrIGEgcHJldiB2YWx1ZSBvZiAxCisJCSAqIHRoZW4gd2UganVzdCBvd24gaXQuCisJCSAqCisJCSAqIFsgSW4gdGhlIHJhcmUgY2FzZSBvZiB0aGUgbXV0ZXggZ29pbmcgdG8gMSwgdG8gMCwgdG8gLTEKKwkJICogICBhbmQgdGhlbiBiYWNrIHRvIDAgaW4gdGhpcyBmZXctaW5zdHJ1Y3Rpb25zIHdpbmRvdywKKwkJICogICB0aGlzIGhhcyB0aGUgcG90ZW50aWFsIHRvIHRyaWdnZXIgdGhlIHNsb3dwYXRoIGZvciB0aGUKKwkJICogICBvd25lcidzIHVubG9jayBwYXRoIG5lZWRsZXNzbHksIGJ1dCB0aGF0J3Mgbm90IGEgcHJvYmxlbQorCQkgKiAgIGluIHByYWN0aWNlLiBdCisJCSAqLworCQlwcmV2ID0gYXRvbWljX3hjaGcoY291bnQsIHByZXYpOworCQlpZiAocHJldiA8IDApCisJCQlwcmV2ID0gMDsKKwl9CisJc21wX21iKCk7CisKKwlyZXR1cm4gcHJldjsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL2F0b21pYy5oCmluZGV4IGQ4OTE1NDEuLjIxZjU0NDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL2F0b21pYy5oCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL2F0b21pYy5oCkBAIC05NSw2ICs5NSw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAorI2RlZmluZSBhdG9taWNfeGNoZyh2LCBuZXcpICh4Y2hnKCYoKHYpLT5jb3VudGVyKSwgbmV3KSkKKwogc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2FkZF91bmxlc3MoYXRvbWljX3QgKnYsIGludCBhLCBpbnQgdSkKIHsKIAlpbnQgcmV0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvZnV0ZXguaCBiL2luY2x1ZGUvYXNtLWg4MzAwL2Z1dGV4LmgKaW5kZXggOWZlZmY0Y2UuLjZhMzMyYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL2Z1dGV4LmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvZnV0ZXguaApAQCAtMSw1MyArMSw2IEBACiAjaWZuZGVmIF9BU01fRlVURVhfSAogI2RlZmluZSBfQVNNX0ZVVEVYX0gKIAotI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mdXRleC5oPgogCi0jaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KLSNpbmNsdWRlIDxhc20vZXJybm8uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotCi1zdGF0aWMgaW5saW5lIGludAotZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQotewotCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7Ci0JaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OwotCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOwotCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7Ci0JaW50IG9sZHZhbCA9IDAsIHJldDsKLQlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCi0JCW9wYXJnID0gMSA8PCBvcGFyZzsKLQotCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWluY19wcmVlbXB0X2NvdW50KCk7Ci0KLQlzd2l0Y2ggKG9wKSB7Ci0JY2FzZSBGVVRFWF9PUF9TRVQ6Ci0JY2FzZSBGVVRFWF9PUF9BREQ6Ci0JY2FzZSBGVVRFWF9PUF9PUjoKLQljYXNlIEZVVEVYX09QX0FORE46Ci0JY2FzZSBGVVRFWF9PUF9YT1I6Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVOT1NZUzsKLQl9Ci0KLQlkZWNfcHJlZW1wdF9jb3VudCgpOwotCi0JaWYgKCFyZXQpIHsKLQkJc3dpdGNoIChjbXApIHsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfRVE6IHJldCA9IChvbGR2YWwgPT0gY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX05FOiByZXQgPSAob2xkdmFsICE9IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9MVDogcmV0ID0gKG9sZHZhbCA8IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9HRTogcmV0ID0gKG9sZHZhbCA+PSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfTEU6IHJldCA9IChvbGR2YWwgPD0gY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0dUOiByZXQgPSAob2xkdmFsID4gY21wYXJnKTsgYnJlYWs7Ci0JCWRlZmF1bHQ6IHJldCA9IC1FTk9TWVM7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotI2VuZGlmCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL2lvY3RsLmggYi9pbmNsdWRlL2FzbS1oODMwMC9pb2N0bC5oCmluZGV4IDAzMWM2MjMuLmIyNzlmZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL2lvY3RsLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvaW9jdGwuaApAQCAtMSw4MCArMSBAQAotLyogJElkOiBpb2N0bC5oLHYgMS4xIDIwMDIvMTEvMTkgMDI6MDk6MjYgZ2VyZyBFeHAgJAotICoKLSAqIGxpbnV4L2lvY3RsLmggZm9yIExpbnV4IGJ5IEguSC4gQmVyZ21hbi4KLSAqLwotCi0jaWZuZGVmIF9IODMwMF9JT0NUTF9ICi0jZGVmaW5lIF9IODMwMF9JT0NUTF9ICi0KLS8qIGlvY3RsIGNvbW1hbmQgZW5jb2Rpbmc6IDMyIGJpdHMgdG90YWwsIGNvbW1hbmQgaW4gbG93ZXIgMTYgYml0cywKLSAqIHNpemUgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgaW4gdGhlIGxvd2VyIDE0IGJpdHMgb2YgdGhlCi0gKiB1cHBlciAxNiBiaXRzLgotICogRW5jb2RpbmcgdGhlIHNpemUgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgaW4gdGhlIGlvY3RsIHJlcXVlc3QKLSAqIGlzIHVzZWZ1bCBmb3IgY2F0Y2hpbmcgcHJvZ3JhbXMgY29tcGlsZWQgd2l0aCBvbGQgdmVyc2lvbnMKLSAqIGFuZCB0byBhdm9pZCBvdmVyd3JpdGluZyB1c2VyIHNwYWNlIG91dHNpZGUgdGhlIHVzZXIgYnVmZmVyIGFyZWEuCi0gKiBUaGUgaGlnaGVzdCAyIGJpdHMgYXJlIHJlc2VydmVkIGZvciBpbmRpY2F0aW5nIHRoZSBgYGFjY2VzcyBtb2RlJycuCi0gKiBOT1RFOiBUaGlzIGxpbWl0cyB0aGUgbWF4IHBhcmFtZXRlciBzaXplIHRvIDE2a0IgLTEgIQotICovCi0KLS8qCi0gKiBJIGRvbid0IHJlYWxseSBoYXZlIGFueSBpZGVhIGFib3V0IHdoYXQgdGhpcyBzaG91bGQgbG9vayBsaWtlLCBzbwotICogZm9yIHRoZSB0aW1lIGJlaW5nLCB0aGlzIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIFBDIGRlZmluaXRpb25zLgotICovCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGlzIGZvciBjb21wYXRpYmlsaXR5IGFjcm9zcyB0aGUgdmFyaW91cyBMaW51eAotICogcGxhdGZvcm1zLiAgVGhlIGkzODYgaW9jdGwgbnVtYmVyaW5nIHNjaGVtZSBkb2Vzbid0IHJlYWxseSBlbmZvcmNlCi0gKiBhIHR5cGUgZmllbGQuICBEZSBmYWN0bywgaG93ZXZlciwgdGhlIHRvcCA4IGJpdHMgb2YgdGhlIGxvd2VyIDE2Ci0gKiBiaXRzIGFyZSBpbmRlZWQgdXNlZCBhcyBhIHR5cGUgZmllbGQsIHNvIHdlIG1pZ2h0IGp1c3QgYXMgd2VsbCBtYWtlCi0gKiB0aGlzIGV4cGxpY2l0IGhlcmUuICBQbGVhc2UgYmUgc3VyZSB0byB1c2UgdGhlIGRlY29kaW5nIG1hY3JvcwotICogYmVsb3cgZnJvbSBub3cgb24uCi0gKi8KLSNkZWZpbmUgX0lPQ19OUkJJVFMJOAotI2RlZmluZSBfSU9DX1RZUEVCSVRTCTgKLSNkZWZpbmUgX0lPQ19TSVpFQklUUwkxNAotI2RlZmluZSBfSU9DX0RJUkJJVFMJMgotCi0jZGVmaW5lIF9JT0NfTlJNQVNLCSgoMSA8PCBfSU9DX05SQklUUyktMSkKLSNkZWZpbmUgX0lPQ19UWVBFTUFTSwkoKDEgPDwgX0lPQ19UWVBFQklUUyktMSkKLSNkZWZpbmUgX0lPQ19TSVpFTUFTSwkoKDEgPDwgX0lPQ19TSVpFQklUUyktMSkKLSNkZWZpbmUgX0lPQ19ESVJNQVNLCSgoMSA8PCBfSU9DX0RJUkJJVFMpLTEpCi0KLSNkZWZpbmUgX0lPQ19OUlNISUZUCTAKLSNkZWZpbmUgX0lPQ19UWVBFU0hJRlQJKF9JT0NfTlJTSElGVCtfSU9DX05SQklUUykKLSNkZWZpbmUgX0lPQ19TSVpFU0hJRlQJKF9JT0NfVFlQRVNISUZUK19JT0NfVFlQRUJJVFMpCi0jZGVmaW5lIF9JT0NfRElSU0hJRlQJKF9JT0NfU0laRVNISUZUK19JT0NfU0laRUJJVFMpCi0KLS8qCi0gKiBEaXJlY3Rpb24gYml0cy4KLSAqLwotI2RlZmluZSBfSU9DX05PTkUJMFUKLSNkZWZpbmUgX0lPQ19XUklURQkxVQotI2RlZmluZSBfSU9DX1JFQUQJMlUKLQotI2RlZmluZSBfSU9DKGRpcix0eXBlLG5yLHNpemUpIFwKLQkoKChkaXIpICA8PCBfSU9DX0RJUlNISUZUKSB8IFwKLQkgKCh0eXBlKSA8PCBfSU9DX1RZUEVTSElGVCkgfCBcCi0JICgobnIpICAgPDwgX0lPQ19OUlNISUZUKSB8IFwKLQkgKChzaXplKSA8PCBfSU9DX1NJWkVTSElGVCkpCi0KLS8qIHVzZWQgdG8gY3JlYXRlIG51bWJlcnMgKi8KLSNkZWZpbmUgX0lPKHR5cGUsbnIpCQlfSU9DKF9JT0NfTk9ORSwodHlwZSksKG5yKSwwKQotI2RlZmluZSBfSU9SKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1JFQUQsKHR5cGUpLChuciksc2l6ZW9mKHNpemUpKQotI2RlZmluZSBfSU9XKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1dSSVRFLCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKLSNkZWZpbmUgX0lPV1IodHlwZSxucixzaXplKQlfSU9DKF9JT0NfUkVBRHxfSU9DX1dSSVRFLCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKLQotLyogdXNlZCB0byBkZWNvZGUgaW9jdGwgbnVtYmVycy4uICovCi0jZGVmaW5lIF9JT0NfRElSKG5yKQkJKCgobnIpID4+IF9JT0NfRElSU0hJRlQpICYgX0lPQ19ESVJNQVNLKQotI2RlZmluZSBfSU9DX1RZUEUobnIpCQkoKChucikgPj4gX0lPQ19UWVBFU0hJRlQpICYgX0lPQ19UWVBFTUFTSykKLSNkZWZpbmUgX0lPQ19OUihucikJCSgoKG5yKSA+PiBfSU9DX05SU0hJRlQpICYgX0lPQ19OUk1BU0spCi0jZGVmaW5lIF9JT0NfU0laRShucikJCSgoKG5yKSA+PiBfSU9DX1NJWkVTSElGVCkgJiBfSU9DX1NJWkVNQVNLKQotCi0vKiAuLi5hbmQgZm9yIHRoZSBkcml2ZXJzL3NvdW5kIGZpbGVzLi4uICovCi0KLSNkZWZpbmUgSU9DX0lOCQkoX0lPQ19XUklURSA8PCBfSU9DX0RJUlNISUZUKQotI2RlZmluZSBJT0NfT1VUCQkoX0lPQ19SRUFEIDw8IF9JT0NfRElSU0hJRlQpCi0jZGVmaW5lIElPQ19JTk9VVAkoKF9JT0NfV1JJVEV8X0lPQ19SRUFEKSA8PCBfSU9DX0RJUlNISUZUKQotI2RlZmluZSBJT0NTSVpFX01BU0sJKF9JT0NfU0laRU1BU0sgPDwgX0lPQ19TSVpFU0hJRlQpCi0jZGVmaW5lIElPQ1NJWkVfU0hJRlQJKF9JT0NfU0laRVNISUZUKQotCi0jZW5kaWYgLyogX0g4MzAwX0lPQ1RMX0ggKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pb2N0bC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvbXV0ZXguaCBiL2luY2x1ZGUvYXNtLWg4MzAwL211dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU4YzFmNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL211dGV4LmgKQEAgLTAsMCArMSw5IEBACisvKgorICogUHVsbCBpbiB0aGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIG11dGV4IGZhc3RwYXRoLgorICoKKyAqIFRPRE86IGltcGxlbWVudCBvcHRpbWl6ZWQgcHJpbWl0aXZlcyBpbnN0ZWFkLCBvciBsZWF2ZSB0aGUgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24gaW4gcGxhY2UsIG9yIHBpY2sgdGhlIGF0b21pY194Y2hnKCkgYmFzZWQgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24uIChzZWUgYXNtLWdlbmVyaWMvbXV0ZXgteGNoZy5oIGZvciBkZXRhaWxzKQorICovCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tdXRleC1kZWMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL3BhZ2UuaAppbmRleCBlOGMwMmI4Li5jZDM1YjFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvcGFnZS5oCkBAIC0xMywxMiArMTMsNiBAQAogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKLSNpZiAhZGVmaW5lZChDT05GSUdfU01BTExfVEFTS1MpICYmIFBBR0VfU0hJRlQgPCAxMwotI2RlZmluZSBLVEhSRUFEX1NJWkUgKDgxOTIpCi0jZWxzZQotI2RlZmluZSBLVEhSRUFEX1NJWkUgUEFHRV9TSVpFCi0jZW5kaWYKLSAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAgCiAjZGVmaW5lIGdldF91c2VyX3BhZ2UodmFkZHIpCQlfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1oODMwMC90aHJlYWRfaW5mby5oCmluZGV4IGJmY2M3NTUuLjQ1ZjA5ZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvdGhyZWFkX2luZm8uaApAQCAtNjksOCArNjksNiBAQAogI2RlZmluZSBhbGxvY190aHJlYWRfaW5mbyh0c2spICgoc3RydWN0IHRocmVhZF9pbmZvICopIFwKIAkJCQlfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIDEpKQogI2RlZmluZSBmcmVlX3RocmVhZF9pbmZvKHRpKQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSAodGkpLCAxKQotI2RlZmluZSBnZXRfdGhyZWFkX2luZm8odGkpCWdldF90YXNrX3N0cnVjdCgodGkpLT50YXNrKQotI2RlZmluZSBwdXRfdGhyZWFkX2luZm8odGkpCXB1dF90YXNrX3N0cnVjdCgodGkpLT50YXNrKQogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9hY3BpLmggYi9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaAppbmRleCBkZjRlZDMyLi41NTA1OWFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaApAQCAtMTc5LDcgKzE3OSw3IEBACiAKIGV4dGVybiB1OCB4ODZfYWNwaWlkX3RvX2FwaWNpZFtdOwogCi0jZGVmaW5lIEFSQ0hfSEFTX1BPV0VSX1BEQ19JTklUCTEKKyNkZWZpbmUgQVJDSF9IQVNfUE9XRVJfSU5JVAkxCiAKICNlbmRpZiAvKl9fS0VSTkVMX18qLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2FwaWMuaCBiL2luY2x1ZGUvYXNtLWkzODYvYXBpYy5oCmluZGV4IDhjNDU0YWEuLmQzMGI4NTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvYXBpYy5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvYXBpYy5oCkBAIC0xMzIsNiArMTMyLDExIEBACiAKIGV4dGVybiBpbnQgZGlzYWJsZV90aW1lcl9waW5fMTsKIAordm9pZCBzbXBfc2VuZF90aW1lcl9icm9hZGNhc3RfaXBpKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3ZvaWQgc3dpdGNoX0FQSUNfdGltZXJfdG9faXBpKHZvaWQgKmNwdW1hc2spOwordm9pZCBzd2l0Y2hfaXBpX3RvX0FQSUNfdGltZXIodm9pZCAqY3B1bWFzayk7CisjZGVmaW5lIEFSQ0hfQVBJQ1RJTUVSX1NUT1BTX09OX0MzCTEKKwogI2Vsc2UgLyogIUNPTkZJR19YODZfTE9DQUxfQVBJQyAqLwogc3RhdGljIGlubGluZSB2b2lkIGxhcGljX3NodXRkb3duKHZvaWQpIHsgfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2F0b21pYy5oIGIvaW5jbHVkZS9hc20taTM4Ni9hdG9taWMuaAppbmRleCA3YTU0NzJkLi5kZTY0OWQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2F0b21pYy5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvYXRvbWljLmgKQEAgLTIxNiw2ICsyMTYsNyBAQAogfQogCiAjZGVmaW5lIGF0b21pY19jbXB4Y2hnKHYsIG9sZCwgbmV3KSAoKGludCljbXB4Y2hnKCYoKHYpLT5jb3VudGVyKSwgb2xkLCBuZXcpKQorI2RlZmluZSBhdG9taWNfeGNoZyh2LCBuZXcpICh4Y2hnKCYoKHYpLT5jb3VudGVyKSwgbmV3KSkKIAogLyoqCiAgKiBhdG9taWNfYWRkX3VubGVzcyAtIGFkZCB1bmxlc3MgdGhlIG51bWJlciBpcyBhIGdpdmVuIHZhbHVlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2JpdG9wcy5oIGIvaW5jbHVkZS9hc20taTM4Ni9iaXRvcHMuaAppbmRleCA2NTY3OWFjLi44OGU2Y2EyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9iaXRvcHMuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2JpdG9wcy5oCkBAIC00Myw3ICs0Myw3IEBACiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oIExPQ0tfUFJFRklYCiAJCSJidHNsICUxLCUwIgotCQk6Ij1tIiAoQUREUikKKwkJOiIrbSIgKEFERFIpCiAJCToiSXIiIChucikpOwogfQogCkBAIC02MCw3ICs2MCw3IEBACiB7CiAJX19hc21fXygKIAkJImJ0c2wgJTEsJTAiCi0JCToiPW0iIChBRERSKQorCQk6IittIiAoQUREUikKIAkJOiJJciIgKG5yKSk7CiB9CiAKQEAgLTc4LDcgKzc4LDcgQEAKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyggTE9DS19QUkVGSVgKIAkJImJ0cmwgJTEsJTAiCi0JCToiPW0iIChBRERSKQorCQk6IittIiAoQUREUikKIAkJOiJJciIgKG5yKSk7CiB9CiAKQEAgLTg2LDcgKzg2LDcgQEAKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKIAkJImJ0cmwgJTEsJTAiCi0JCToiPW0iIChBRERSKQorCQk6IittIiAoQUREUikKIAkJOiJJciIgKG5yKSk7CiB9CiAjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpCWJhcnJpZXIoKQpAQCAtMTA1LDcgKzEwNSw3IEBACiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCSJidGNsICUxLCUwIgotCQk6Ij1tIiAoQUREUikKKwkJOiIrbSIgKEFERFIpCiAJCToiSXIiIChucikpOwogfQogCkBAIC0xMjMsNyArMTIzLDcgQEAKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyggTE9DS19QUkVGSVgKIAkJImJ0Y2wgJTEsJTAiCi0JCToiPW0iIChBRERSKQorCQk6IittIiAoQUREUikKIAkJOiJJciIgKG5yKSk7CiB9CiAKQEAgLTE0Miw3ICsxNDIsNyBAQAogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oIExPQ0tfUFJFRklYCiAJCSJidHNsICUyLCUxXG5cdHNiYmwgJTAsJTAiCi0JCToiPXIiIChvbGRiaXQpLCI9bSIgKEFERFIpCisJCToiPXIiIChvbGRiaXQpLCIrbSIgKEFERFIpCiAJCToiSXIiIChucikgOiAibWVtb3J5Iik7CiAJcmV0dXJuIG9sZGJpdDsKIH0KQEAgLTE2Miw3ICsxNjIsNyBAQAogCiAJX19hc21fXygKIAkJImJ0c2wgJTIsJTFcblx0c2JibCAlMCwlMCIKLQkJOiI9ciIgKG9sZGJpdCksIj1tIiAoQUREUikKKwkJOiI9ciIgKG9sZGJpdCksIittIiAoQUREUikKIAkJOiJJciIgKG5yKSk7CiAJcmV0dXJuIG9sZGJpdDsKIH0KQEAgLTE4Miw3ICsxODIsNyBAQAogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oIExPQ0tfUFJFRklYCiAJCSJidHJsICUyLCUxXG5cdHNiYmwgJTAsJTAiCi0JCToiPXIiIChvbGRiaXQpLCI9bSIgKEFERFIpCisJCToiPXIiIChvbGRiaXQpLCIrbSIgKEFERFIpCiAJCToiSXIiIChucikgOiAibWVtb3J5Iik7CiAJcmV0dXJuIG9sZGJpdDsKIH0KQEAgLTIwMiw3ICsyMDIsNyBAQAogCiAJX19hc21fXygKIAkJImJ0cmwgJTIsJTFcblx0c2JibCAlMCwlMCIKLQkJOiI9ciIgKG9sZGJpdCksIj1tIiAoQUREUikKKwkJOiI9ciIgKG9sZGJpdCksIittIiAoQUREUikKIAkJOiJJciIgKG5yKSk7CiAJcmV0dXJuIG9sZGJpdDsKIH0KQEAgLTIxNCw3ICsyMTQsNyBAQAogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCSJidGNsICUyLCUxXG5cdHNiYmwgJTAsJTAiCi0JCToiPXIiIChvbGRiaXQpLCI9bSIgKEFERFIpCisJCToiPXIiIChvbGRiaXQpLCIrbSIgKEFERFIpCiAJCToiSXIiIChucikgOiAibWVtb3J5Iik7CiAJcmV0dXJuIG9sZGJpdDsKIH0KQEAgLTIzMyw3ICsyMzMsNyBAQAogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oIExPQ0tfUFJFRklYCiAJCSJidGNsICUyLCUxXG5cdHNiYmwgJTAsJTAiCi0JCToiPXIiIChvbGRiaXQpLCI9bSIgKEFERFIpCisJCToiPXIiIChvbGRiaXQpLCIrbSIgKEFERFIpCiAJCToiSXIiIChucikgOiAibWVtb3J5Iik7CiAJcmV0dXJuIG9sZGJpdDsKIH0KQEAgLTI0Nyw3ICsyNDcsNyBAQAogc3RhdGljIGludCB0ZXN0X2JpdChpbnQgbnIsIGNvbnN0IHZvbGF0aWxlIHZvaWQgKiBhZGRyKTsKICNlbmRpZgogCi1zdGF0aWMgaW5saW5lIGludCBjb25zdGFudF90ZXN0X2JpdChpbnQgbnIsIGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCitzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBjb25zdGFudF90ZXN0X2JpdChpbnQgbnIsIGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCiB7CiAJcmV0dXJuICgoMVVMIDw8IChuciAmIDMxKSkgJiAoYWRkcltuciA+PiA1XSkpICE9IDA7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2NhY2hlLmggYi9pbmNsdWRlL2FzbS1pMzg2L2NhY2hlLmgKaW5kZXggODQ5Nzg4Ny4uNjE1OTExZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9jYWNoZS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvY2FjaGUuaApAQCAtMTAsNiArMTAsNCBAQAogI2RlZmluZSBMMV9DQUNIRV9TSElGVAkoQ09ORklHX1g4Nl9MMV9DQUNIRV9TSElGVCkKICNkZWZpbmUgTDFfQ0FDSEVfQllURVMJKDEgPDwgTDFfQ0FDSEVfU0hJRlQpCiAKLSNkZWZpbmUgTDFfQ0FDSEVfU0hJRlRfTUFYIDcJLyogbGFyZ2VzdCBMMSB3aGljaCB0aGlzIGFyY2ggc3VwcG9ydHMgKi8KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2NwdWZlYXR1cmUuaCBiL2luY2x1ZGUvYXNtLWkzODYvY3B1ZmVhdHVyZS5oCmluZGV4IGZmMTE4N2UuLmM0ZWMyYTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvY3B1ZmVhdHVyZS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvY3B1ZmVhdHVyZS5oCkBAIC02OSw2ICs2OSw3IEBACiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0s3CQkoMyozMisgNSkgLyogQXRobG9uICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1AzCQkoMyozMisgNikgLyogUDMgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfUDQJCSgzKjMyKyA3KSAvKiBQNCAqLworI2RlZmluZSBYODZfRkVBVFVSRV9DT05TVEFOVF9UU0MgKDMqMzIrIDgpIC8qIFRTQyB0aWNrcyBhdCBhIGNvbnN0YW50IHJhdGUgKi8KIAogLyogSW50ZWwtZGVmaW5lZCBDUFUgZmVhdHVyZXMsIENQVUlEIGxldmVsIDB4MDAwMDAwMDEgKGVjeCksIHdvcmQgNCAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9YTU0zCSg0KjMyKyAwKSAvKiBTdHJlYW1pbmcgU0lNRCBFeHRlbnNpb25zLTMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvY3VycmVudC5oIGIvaW5jbHVkZS9hc20taTM4Ni9jdXJyZW50LmgKaW5kZXggZDk3MzI4OS4uM2NiYmVjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9jdXJyZW50LmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9jdXJyZW50LmgKQEAgLTUsNyArNSw3IEBACiAKIHN0cnVjdCB0YXNrX3N0cnVjdDsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBnZXRfY3VycmVudCh2b2lkKQorc3RhdGljIF9fYWx3YXlzX2lubGluZSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBnZXRfY3VycmVudCh2b2lkKQogewogCXJldHVybiBjdXJyZW50X3RocmVhZF9pbmZvKCktPnRhc2s7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1pMzg2L2RtYS1tYXBwaW5nLmgKaW5kZXggZTU2YzMzNS4uOWNmMjBjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvZG1hLW1hcHBpbmcuaApAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxhc20vYnVnLmg+CiAKICNkZWZpbmUgZG1hX2FsbG9jX25vbmNvaGVyZW50KGQsIHMsIGgsIGYpIGRtYV9hbGxvY19jb2hlcmVudChkLCBzLCBoLCBmKQogI2RlZmluZSBkbWFfZnJlZV9ub25jb2hlcmVudChkLCBzLCB2LCBoKSBkbWFfZnJlZV9jb2hlcmVudChkLCBzLCB2LCBoKQpAQCAtMjAsNyArMjEsOSBAQAogZG1hX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwdHIsIHNpemVfdCBzaXplLAogCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7Ci0JQlVHX09OKGRpcmVjdGlvbiA9PSBETUFfTk9ORSk7CisJaWYgKGRpcmVjdGlvbiA9PSBETUFfTk9ORSkKKwkJQlVHKCk7CisJV0FSTl9PTihzaXplID09IDApOwogCWZsdXNoX3dyaXRlX2J1ZmZlcnMoKTsKIAlyZXR1cm4gdmlydF90b19waHlzKHB0cik7CiB9CkBAIC0yOSw3ICszMiw4IEBACiBkbWFfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsCiAJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7Ci0JQlVHX09OKGRpcmVjdGlvbiA9PSBETUFfTk9ORSk7CisJaWYgKGRpcmVjdGlvbiA9PSBETUFfTk9ORSkKKwkJQlVHKCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50CkBAIC0zOCw3ICs0Miw5IEBACiB7CiAJaW50IGk7CiAKLQlCVUdfT04oZGlyZWN0aW9uID09IERNQV9OT05FKTsKKwlpZiAoZGlyZWN0aW9uID09IERNQV9OT05FKQorCQlCVUcoKTsKKwlXQVJOX09OKG5lbnRzID09IDAgfHwgc2dbMF0ubGVuZ3RoID09IDApOwogCiAJZm9yIChpID0gMDsgaSA8IG5lbnRzOyBpKysgKSB7CiAJCUJVR19PTighc2dbaV0ucGFnZSk7CkBAIC0xNTAsNyArMTU2LDcgQEAKIHsKIAkvKiBubyBlYXN5IHdheSB0byBnZXQgY2FjaGUgc2l6ZSBvbiBhbGwgeDg2LCBzbyByZXR1cm4gdGhlCiAJICogbWF4aW11bSBwb3NzaWJsZSwgdG8gYmUgc2FmZSAqLwotCXJldHVybiAoMSA8PCBMMV9DQUNIRV9TSElGVF9NQVgpOworCXJldHVybiAoMSA8PCBJTlRFUk5PREVfQ0FDSEVfU0hJRlQpOwogfQogCiAjZGVmaW5lIGRtYV9pc19jb25zaXN0ZW50KGQpCSgxKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9lZGFjLmggYi9pbmNsdWRlL2FzbS1pMzg2L2VkYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTdkZDBhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9lZGFjLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBBU01fRURBQ19ICisjZGVmaW5lIEFTTV9FREFDX0gKKworLyogRUNDIGF0b21pYywgRE1BLCBTTVAgYW5kIGludGVycnVwdCBzYWZlIHNjcnViIGZ1bmN0aW9uICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX3NjcnViKHZvaWQgKnZhLCB1MzIgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nICp2aXJ0X2FkZHIgPSB2YTsKKwl1MzIgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplIC8gNDsgaSsrLCB2aXJ0X2FkZHIrKykKKwkJLyogVmVyeSBjYXJlZnVsbHkgcmVhZCBhbmQgd3JpdGUgdG8gbWVtb3J5IGF0b21pY2FsbHkKKwkJICogc28gd2UgYXJlIGludGVycnVwdCwgRE1BIGFuZCBTTVAgc2FmZS4KKwkJICovCisJCV9fYXNtX18gX192b2xhdGlsZV9fKCJsb2NrOyBhZGRsICQwLCAlMCI6OiJtIigqdmlydF9hZGRyKSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9mdXRleC5oIGIvaW5jbHVkZS9hc20taTM4Ni9mdXRleC5oCmluZGV4IGU3YTI3MWQuLjQ0YjlkYjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvZnV0ZXguaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2Z1dGV4LmgKQEAgLTYxLDcgKzYxLDcgQEAKIAlpZiAob3AgPT0gRlVURVhfT1BfU0VUKQogCQlfX2Z1dGV4X2F0b21pY19vcDEoInhjaGdsICUwLCAlMiIsIHJldCwgb2xkdmFsLCB1YWRkciwgb3BhcmcpOwogCWVsc2UgewotI2lmICFkZWZpbmVkKENPTkZJR19YODZfQlNXQVApICYmICFkZWZpbmVkKENPTkZJR19VTUwpCisjaWZuZGVmIENPTkZJR19YODZfQlNXQVAKIAkJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDMpCiAJCQlyZXQgPSAtRU5PU1lTOwogCQllbHNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2kzODcuaCBiL2luY2x1ZGUvYXNtLWkzODYvaTM4Ny5oCmluZGV4IDY3NDcwMDYuLjE1MmQwYmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvaTM4Ny5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvaTM4Ny5oCkBAIC00OSwxOSArNDksMTkgQEAKIAkJWDg2X0ZFQVRVUkVfRlhTUiwKIAkJIm0iICh0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZSkKIAkJOiJtZW1vcnkiKTsKLQl0c2stPnRocmVhZF9pbmZvLT5zdGF0dXMgJj0gflRTX1VTRURGUFU7CisJdGFza190aHJlYWRfaW5mbyh0c2spLT5zdGF0dXMgJj0gflRTX1VTRURGUFU7CiB9CiAKICNkZWZpbmUgX191bmxhenlfZnB1KCB0c2sgKSBkbyB7IFwKLQlpZiAoKHRzayktPnRocmVhZF9pbmZvLT5zdGF0dXMgJiBUU19VU0VERlBVKSBcCisJaWYgKHRhc2tfdGhyZWFkX2luZm8odHNrKS0+c3RhdHVzICYgVFNfVVNFREZQVSkgXAogCQlzYXZlX2luaXRfZnB1KCB0c2sgKTsgXAogfSB3aGlsZSAoMCkKIAogI2RlZmluZSBfX2NsZWFyX2ZwdSggdHNrICkJCQkJCVwKIGRvIHsJCQkJCQkJCVwKLQlpZiAoKHRzayktPnRocmVhZF9pbmZvLT5zdGF0dXMgJiBUU19VU0VERlBVKSB7CQlcCisJaWYgKHRhc2tfdGhyZWFkX2luZm8odHNrKS0+c3RhdHVzICYgVFNfVVNFREZQVSkgewkJXAogCQlhc20gdm9sYXRpbGUoImZuY2xleCA7IGZ3YWl0Iik7CQkJCVwKLQkJKHRzayktPnRocmVhZF9pbmZvLT5zdGF0dXMgJj0gflRTX1VTRURGUFU7CVwKKwkJdGFza190aHJlYWRfaW5mbyh0c2spLT5zdGF0dXMgJj0gflRTX1VTRURGUFU7CVwKIAkJc3R0cygpOwkJCQkJCVwKIAl9CQkJCQkJCVwKIH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2lvLmggYi9pbmNsdWRlL2FzbS1pMzg2L2lvLmgKaW5kZXggN2JhYmI5Ny4uMDMyMzNjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvaW8uaApAQCAtMTMxLDYgKzEzMSwxMSBAQAogZXh0ZXJuIHZvaWQgKmJ0X2lvcmVtYXAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiBleHRlcm4gdm9pZCBidF9pb3VubWFwKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiAKKy8qIFVzZSBlYXJseSBJTyBtYXBwaW5ncyBmb3IgRE1JIGJlY2F1c2UgaXQncyBpbml0aWFsaXplZCBlYXJseSAqLworI2RlZmluZSBkbWlfaW9yZW1hcCBidF9pb3JlbWFwCisjZGVmaW5lIGRtaV9pb3VubWFwIGJ0X2lvdW5tYXAKKyNkZWZpbmUgZG1pX2FsbG9jIGFsbG9jX2Jvb3RtZW0KKwogLyoKICAqIElTQSBJL08gYnVzIG1lbW9yeSBhZGRyZXNzZXMgYXJlIDE6MSB3aXRoIHRoZSBwaHlzaWNhbCBhZGRyZXNzLgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2lvY3RsLmggYi9pbmNsdWRlL2FzbS1pMzg2L2lvY3RsLmgKaW5kZXggNTQzZjc4NC4uYjI3OWZlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9pb2N0bC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvaW9jdGwuaApAQCAtMSw4NSArMSBAQAotLyogJElkOiBpb2N0bC5oLHYgMS41IDE5OTMvMDcvMTkgMjE6NTM6NTAgcm9vdCBFeHAgcm9vdCAkCi0gKgotICogbGludXgvaW9jdGwuaCBmb3IgTGludXggYnkgSC5ILiBCZXJnbWFuLgotICovCi0KLSNpZm5kZWYgX0FTTUkzODZfSU9DVExfSAotI2RlZmluZSBfQVNNSTM4Nl9JT0NUTF9ICi0KLS8qIGlvY3RsIGNvbW1hbmQgZW5jb2Rpbmc6IDMyIGJpdHMgdG90YWwsIGNvbW1hbmQgaW4gbG93ZXIgMTYgYml0cywKLSAqIHNpemUgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgaW4gdGhlIGxvd2VyIDE0IGJpdHMgb2YgdGhlCi0gKiB1cHBlciAxNiBiaXRzLgotICogRW5jb2RpbmcgdGhlIHNpemUgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgaW4gdGhlIGlvY3RsIHJlcXVlc3QKLSAqIGlzIHVzZWZ1bCBmb3IgY2F0Y2hpbmcgcHJvZ3JhbXMgY29tcGlsZWQgd2l0aCBvbGQgdmVyc2lvbnMKLSAqIGFuZCB0byBhdm9pZCBvdmVyd3JpdGluZyB1c2VyIHNwYWNlIG91dHNpZGUgdGhlIHVzZXIgYnVmZmVyIGFyZWEuCi0gKiBUaGUgaGlnaGVzdCAyIGJpdHMgYXJlIHJlc2VydmVkIGZvciBpbmRpY2F0aW5nIHRoZSBgYGFjY2VzcyBtb2RlJycuCi0gKiBOT1RFOiBUaGlzIGxpbWl0cyB0aGUgbWF4IHBhcmFtZXRlciBzaXplIHRvIDE2a0IgLTEgIQotICovCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGlzIGZvciBjb21wYXRpYmlsaXR5IGFjcm9zcyB0aGUgdmFyaW91cyBMaW51eAotICogcGxhdGZvcm1zLiAgVGhlIGkzODYgaW9jdGwgbnVtYmVyaW5nIHNjaGVtZSBkb2Vzbid0IHJlYWxseSBlbmZvcmNlCi0gKiBhIHR5cGUgZmllbGQuICBEZSBmYWN0bywgaG93ZXZlciwgdGhlIHRvcCA4IGJpdHMgb2YgdGhlIGxvd2VyIDE2Ci0gKiBiaXRzIGFyZSBpbmRlZWQgdXNlZCBhcyBhIHR5cGUgZmllbGQsIHNvIHdlIG1pZ2h0IGp1c3QgYXMgd2VsbCBtYWtlCi0gKiB0aGlzIGV4cGxpY2l0IGhlcmUuICBQbGVhc2UgYmUgc3VyZSB0byB1c2UgdGhlIGRlY29kaW5nIG1hY3JvcwotICogYmVsb3cgZnJvbSBub3cgb24uCi0gKi8KLSNkZWZpbmUgX0lPQ19OUkJJVFMJOAotI2RlZmluZSBfSU9DX1RZUEVCSVRTCTgKLSNkZWZpbmUgX0lPQ19TSVpFQklUUwkxNAotI2RlZmluZSBfSU9DX0RJUkJJVFMJMgotCi0jZGVmaW5lIF9JT0NfTlJNQVNLCSgoMSA8PCBfSU9DX05SQklUUyktMSkKLSNkZWZpbmUgX0lPQ19UWVBFTUFTSwkoKDEgPDwgX0lPQ19UWVBFQklUUyktMSkKLSNkZWZpbmUgX0lPQ19TSVpFTUFTSwkoKDEgPDwgX0lPQ19TSVpFQklUUyktMSkKLSNkZWZpbmUgX0lPQ19ESVJNQVNLCSgoMSA8PCBfSU9DX0RJUkJJVFMpLTEpCi0KLSNkZWZpbmUgX0lPQ19OUlNISUZUCTAKLSNkZWZpbmUgX0lPQ19UWVBFU0hJRlQJKF9JT0NfTlJTSElGVCtfSU9DX05SQklUUykKLSNkZWZpbmUgX0lPQ19TSVpFU0hJRlQJKF9JT0NfVFlQRVNISUZUK19JT0NfVFlQRUJJVFMpCi0jZGVmaW5lIF9JT0NfRElSU0hJRlQJKF9JT0NfU0laRVNISUZUK19JT0NfU0laRUJJVFMpCi0KLS8qCi0gKiBEaXJlY3Rpb24gYml0cy4KLSAqLwotI2RlZmluZSBfSU9DX05PTkUJMFUKLSNkZWZpbmUgX0lPQ19XUklURQkxVQotI2RlZmluZSBfSU9DX1JFQUQJMlUKLQotI2RlZmluZSBfSU9DKGRpcix0eXBlLG5yLHNpemUpIFwKLQkoKChkaXIpICA8PCBfSU9DX0RJUlNISUZUKSB8IFwKLQkgKCh0eXBlKSA8PCBfSU9DX1RZUEVTSElGVCkgfCBcCi0JICgobnIpICAgPDwgX0lPQ19OUlNISUZUKSB8IFwKLQkgKChzaXplKSA8PCBfSU9DX1NJWkVTSElGVCkpCi0KLS8qIHByb3Zva2UgY29tcGlsZSBlcnJvciBmb3IgaW52YWxpZCB1c2VzIG9mIHNpemUgYXJndW1lbnQgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgX19pbnZhbGlkX3NpemVfYXJndW1lbnRfZm9yX0lPQzsKLSNkZWZpbmUgX0lPQ19UWVBFQ0hFQ0sodCkgXAotCSgoc2l6ZW9mKHQpID09IHNpemVvZih0WzFdKSAmJiBcCi0JICBzaXplb2YodCkgPCAoMSA8PCBfSU9DX1NJWkVCSVRTKSkgPyBcCi0JICBzaXplb2YodCkgOiBfX2ludmFsaWRfc2l6ZV9hcmd1bWVudF9mb3JfSU9DKQotCi0vKiB1c2VkIHRvIGNyZWF0ZSBudW1iZXJzICovCi0jZGVmaW5lIF9JTyh0eXBlLG5yKQkJX0lPQyhfSU9DX05PTkUsKHR5cGUpLChuciksMCkKLSNkZWZpbmUgX0lPUih0eXBlLG5yLHNpemUpCV9JT0MoX0lPQ19SRUFELCh0eXBlKSwobnIpLChfSU9DX1RZUEVDSEVDSyhzaXplKSkpCi0jZGVmaW5lIF9JT1codHlwZSxucixzaXplKQlfSU9DKF9JT0NfV1JJVEUsKHR5cGUpLChuciksKF9JT0NfVFlQRUNIRUNLKHNpemUpKSkKLSNkZWZpbmUgX0lPV1IodHlwZSxucixzaXplKQlfSU9DKF9JT0NfUkVBRHxfSU9DX1dSSVRFLCh0eXBlKSwobnIpLChfSU9DX1RZUEVDSEVDSyhzaXplKSkpCi0jZGVmaW5lIF9JT1JfQkFEKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1JFQUQsKHR5cGUpLChuciksc2l6ZW9mKHNpemUpKQotI2RlZmluZSBfSU9XX0JBRCh0eXBlLG5yLHNpemUpCV9JT0MoX0lPQ19XUklURSwodHlwZSksKG5yKSxzaXplb2Yoc2l6ZSkpCi0jZGVmaW5lIF9JT1dSX0JBRCh0eXBlLG5yLHNpemUpCV9JT0MoX0lPQ19SRUFEfF9JT0NfV1JJVEUsKHR5cGUpLChuciksc2l6ZW9mKHNpemUpKQotCi0vKiB1c2VkIHRvIGRlY29kZSBpb2N0bCBudW1iZXJzLi4gKi8KLSNkZWZpbmUgX0lPQ19ESVIobnIpCQkoKChucikgPj4gX0lPQ19ESVJTSElGVCkgJiBfSU9DX0RJUk1BU0spCi0jZGVmaW5lIF9JT0NfVFlQRShucikJCSgoKG5yKSA+PiBfSU9DX1RZUEVTSElGVCkgJiBfSU9DX1RZUEVNQVNLKQotI2RlZmluZSBfSU9DX05SKG5yKQkJKCgobnIpID4+IF9JT0NfTlJTSElGVCkgJiBfSU9DX05STUFTSykKLSNkZWZpbmUgX0lPQ19TSVpFKG5yKQkJKCgobnIpID4+IF9JT0NfU0laRVNISUZUKSAmIF9JT0NfU0laRU1BU0spCi0KLS8qIC4uLmFuZCBmb3IgdGhlIGRyaXZlcnMvc291bmQgZmlsZXMuLi4gKi8KLQotI2RlZmluZSBJT0NfSU4JCShfSU9DX1dSSVRFIDw8IF9JT0NfRElSU0hJRlQpCi0jZGVmaW5lIElPQ19PVVQJCShfSU9DX1JFQUQgPDwgX0lPQ19ESVJTSElGVCkKLSNkZWZpbmUgSU9DX0lOT1VUCSgoX0lPQ19XUklURXxfSU9DX1JFQUQpIDw8IF9JT0NfRElSU0hJRlQpCi0jZGVmaW5lIElPQ1NJWkVfTUFTSwkoX0lPQ19TSVpFTUFTSyA8PCBfSU9DX1NJWkVTSElGVCkKLSNkZWZpbmUgSU9DU0laRV9TSElGVAkoX0lPQ19TSVpFU0hJRlQpCi0KLSNlbmRpZiAvKiBfQVNNSTM4Nl9JT0NUTF9IICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW9jdGwuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvaXJxLmggYi9pbmNsdWRlL2FzbS1pMzg2L2lycS5oCmluZGV4IDI3MGYxOTguLjUxNjlkN2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9pcnEuaApAQCAtMjEsOCArMjEsNiBAQAogCXJldHVybiAoKGlycSA9PSAyKSA/IDkgOiBpcnEpOwogfQogCi1leHRlcm4gdm9pZCByZWxlYXNlX3ZtODZfaXJxcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7Ci0KICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKICMgZGVmaW5lIEFSQ0hfSEFTX05NSV9XQVRDSERPRwkJLyogU2VlIGluY2x1ZGUvbGludXgvbm1pLmggKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9rZXhlYy5oIGIvaW5jbHVkZS9hc20taTM4Ni9rZXhlYy5oCmluZGV4IDZlZDJhMDMuLjUzZjBlMDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYva2V4ZWMuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2tleGVjLmgKQEAgLTIsNiArMiw4IEBACiAjZGVmaW5lIF9JMzg2X0tFWEVDX0gKIAogI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgogCiAvKgogICogS0VYRUNfU09VUkNFX01FTU9SWV9MSU1JVCBtYXhpbXVtIHBhZ2UgZ2V0X2ZyZWVfcGFnZSBjYW4gcmV0dXJuLgpAQCAtMjYsOCArMjgsNDkgQEAKICNkZWZpbmUgS0VYRUNfQVJDSCBLRVhFQ19BUkNIXzM4NgogCiAjZGVmaW5lIE1BWF9OT1RFX0JZVEVTIDEwMjQKLXR5cGVkZWYgdTMyIG5vdGVfYnVmX3RbTUFYX05PVEVfQllURVMvNF07CiAKLWV4dGVybiBub3RlX2J1Zl90IGNyYXNoX25vdGVzW107CisvKiBDUFUgZG9lcyBub3Qgc2F2ZSBzcyBhbmQgZXNwIG9uIHN0YWNrIGlmIGV4ZWN1dGlvbiBpcyBhbHJlYWR5CisgKiBydW5uaW5nIGluIGtlcm5lbCBtb2RlIGF0IHRoZSB0aW1lIG9mIE5NSSBvY2N1cnJlbmNlLiBUaGlzIGNvZGUKKyAqIGZpeGVzIGl0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY3Jhc2hfZml4dXBfc3NfZXNwKHN0cnVjdCBwdF9yZWdzICpuZXdyZWdzLAorCQkJCQlzdHJ1Y3QgcHRfcmVncyAqb2xkcmVncykKK3sKKwltZW1jcHkobmV3cmVncywgb2xkcmVncywgc2l6ZW9mKCpuZXdyZWdzKSk7CisJbmV3cmVncy0+ZXNwID0gKHVuc2lnbmVkIGxvbmcpJihvbGRyZWdzLT5lc3ApOworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkJInhvcmwgJSVlYXgsICUlZWF4XG5cdCIKKwkJCSJtb3Z3ICUlc3MsICUlYXhcblx0IgorCQkJOiI9YSIobmV3cmVncy0+eHNzKSk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjYXB0dXJpbmcgcmVnaXN0ZXIgc3RhdGVzIGlmIGNvbWluZworICogdmlhIHBhbmljIG90aGVyd2lzZSBqdXN0IGZpeCB1cCB0aGUgc3MgYW5kIGVzcCBpZiBjb21pbmcgdmlhIGtlcm5lbAorICogbW9kZSBleGNlcHRpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjcmFzaF9zZXR1cF9yZWdzKHN0cnVjdCBwdF9yZWdzICpuZXdyZWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHB0X3JlZ3MgKm9sZHJlZ3MpCit7CisgICAgICAgaWYgKG9sZHJlZ3MpCisgICAgICAgICAgICAgICBjcmFzaF9maXh1cF9zc19lc3AobmV3cmVncywgb2xkcmVncyk7CisgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92bCAlJWVieCwlMCIgOiAiPW0iKG5ld3JlZ3MtPmVieCkpOworICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJSVlY3gsJTAiIDogIj1tIihuZXdyZWdzLT5lY3gpKTsKKyAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUlZWR4LCUwIiA6ICI9bSIobmV3cmVncy0+ZWR4KSk7CisgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92bCAlJWVzaSwlMCIgOiAiPW0iKG5ld3JlZ3MtPmVzaSkpOworICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJSVlZGksJTAiIDogIj1tIihuZXdyZWdzLT5lZGkpKTsKKyAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUlZWJwLCUwIiA6ICI9bSIobmV3cmVncy0+ZWJwKSk7CisgICAgICAgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92bCAlJWVheCwlMCIgOiAiPW0iKG5ld3JlZ3MtPmVheCkpOworICAgICAgICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJSVlc3AsJTAiIDogIj1tIihuZXdyZWdzLT5lc3ApKTsKKyAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJtb3Z3ICUlc3MsICUlYXg7IiA6Ij1hIihuZXdyZWdzLT54c3MpKTsKKyAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJtb3Z3ICUlY3MsICUlYXg7IiA6Ij1hIihuZXdyZWdzLT54Y3MpKTsKKyAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJtb3Z3ICUlZHMsICUlYXg7IiA6Ij1hIihuZXdyZWdzLT54ZHMpKTsKKyAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJtb3Z3ICUlZXMsICUlYXg7IiA6Ij1hIihuZXdyZWdzLT54ZXMpKTsKKyAgICAgICAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJwdXNoZmw7IHBvcGwgJTAiIDoiPW0iKG5ld3JlZ3MtPmVmbGFncykpOworCisgICAgICAgICAgICAgICBuZXdyZWdzLT5laXAgPSAodW5zaWduZWQgbG9uZyljdXJyZW50X3RleHRfYWRkcigpOworICAgICAgIH0KK30KIAogI2VuZGlmIC8qIF9JMzg2X0tFWEVDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYva3Byb2Jlcy5oIGIvaW5jbHVkZS9hc20taTM4Ni9rcHJvYmVzLmgKaW5kZXggY2E5MTZhOC4uMjdjYWMwNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9rcHJvYmVzLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9rcHJvYmVzLmgKQEAgLTQwLDYgKzQwLDcgQEAKIAogI2RlZmluZSBKUFJPQkVfRU5UUlkocGVudHJ5KQkoa3Byb2JlX29wY29kZV90ICopcGVudHJ5CiAjZGVmaW5lIEFSQ0hfU1VQUE9SVFNfS1JFVFBST0JFUworI2RlZmluZSBhcmNoX3JlbW92ZV9rcHJvYmUocCkJZG8ge30gd2hpbGUgKDApCiAKIHZvaWQga3JldHByb2JlX3RyYW1wb2xpbmUodm9pZCk7CiAKQEAgLTc2LDE0ICs3Nyw2IEBACiAJCWxvY2FsX2lycV9lbmFibGUoKTsKIH0KIAotI2lmZGVmIENPTkZJR19LUFJPQkVTCiBleHRlcm4gaW50IGtwcm9iZV9leGNlcHRpb25zX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCiAJCQkJICAgIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKTsKLSNlbHNlCQkJCS8qICFDT05GSUdfS1BST0JFUyAqLwotc3RhdGljIGlubGluZSBpbnQga3Byb2JlX2V4Y2VwdGlvbnNfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKLQkJCQkJICAgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKICNlbmRpZgkJCQkvKiBfQVNNX0tQUk9CRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvbWFjaF9pcGkuaCBiL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1kZWZhdWx0L21hY2hfaXBpLmgKaW5kZXggY2M3NTZhNi4uYTFkMDA3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvbWFjaF9pcGkuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZGVmYXVsdC9tYWNoX2lwaS5oCkBAIC0xNSwxMSArMTUsOSBAQAogewogCWlmIChub19icm9hZGNhc3QpIHsKIAkJY3B1bWFza190IG1hc2sgPSBjcHVfb25saW5lX21hcDsKLQkJaW50IHRoaXNfY3B1ID0gZ2V0X2NwdSgpOwogCi0JCWNwdV9jbGVhcih0aGlzX2NwdSwgbWFzayk7CisJCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIG1hc2spOwogCQlzZW5kX0lQSV9tYXNrKG1hc2ssIHZlY3Rvcik7Ci0JCXB1dF9jcHUoKTsKIAl9IGVsc2UKIAkJX19zZW5kX0lQSV9zaG9ydGN1dChBUElDX0RFU1RfQUxMQlVULCB2ZWN0b3IpOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9tdXRleC5oIGIvaW5jbHVkZS9hc20taTM4Ni9tdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMjE5OWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L211dGV4LmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBBc3NlbWJseSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbXV0ZXggZmFzdHBhdGgsIGJhc2VkIG9uIGF0b21pYworICogZGVjcmVtZW50L2luY3JlbWVudC4KKyAqCisgKiBzdGFydGVkIGJ5IEluZ28gTW9sbmFyOgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+CisgKi8KKyNpZm5kZWYgX0FTTV9NVVRFWF9ICisjZGVmaW5lIF9BU01fTVVURVhfSAorCisvKioKKyAqICBfX211dGV4X2Zhc3RwYXRoX2xvY2sgLSB0cnkgdG8gdGFrZSB0aGUgbG9jayBieSBtb3ZpbmcgdGhlIGNvdW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAxIHRvIGEgMCB2YWx1ZQorICogIEBjb3VudDogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiAgQGZuOiBmdW5jdGlvbiB0byBjYWxsIGlmIHRoZSBvcmlnaW5hbCB2YWx1ZSB3YXMgbm90IDEKKyAqCisgKiBDaGFuZ2UgdGhlIGNvdW50IGZyb20gMSB0byBhIHZhbHVlIGxvd2VyIHRoYW4gMSwgYW5kIGNhbGwgPGZuPiBpZiBpdAorICogd2Fzbid0IDEgb3JpZ2luYWxseS4gVGhpcyBmdW5jdGlvbiBNVVNUIGxlYXZlIHRoZSB2YWx1ZSBsb3dlciB0aGFuIDEKKyAqIGV2ZW4gd2hlbiB0aGUgIjEiIGFzc2VydGlvbiB3YXNuJ3QgdHJ1ZS4KKyAqLworI2RlZmluZSBfX211dGV4X2Zhc3RwYXRoX2xvY2soY291bnQsIGZhaWxfZm4pCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJdW5zaWduZWQgaW50IGR1bW15OwkJCQkJCVwKKwkJCQkJCQkJCVwKKwl0eXBlY2hlY2soYXRvbWljX3QgKiwgY291bnQpOwkJCQkJXAorCXR5cGVjaGVja19mbihmYXN0Y2FsbCB2b2lkICgqKShhdG9taWNfdCAqKSwgZmFpbF9mbik7CQlcCisJCQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAorCQlMT0NLCSIgICBkZWNsICglJWVheCkJXG4iCQkJXAorCQkJIiAgIGpzIDJmCQlcbiIJCQlcCisJCQkiMToJCQlcbiIJCQlcCisJCQkJCQkJCQlcCisJCUxPQ0tfU0VDVElPTl9TVEFSVCgiIikJCQkJCVwKKwkJCSIyOiBjYWxsICIjZmFpbF9mbiIJXG4iCQkJXAorCQkJIiAgIGptcCAxYgkJXG4iCQkJXAorCQlMT0NLX1NFQ1RJT05fRU5ECQkJCQlcCisJCQkJCQkJCQlcCisJCToiPWEiIChkdW1teSkJCQkJCQlcCisJCTogImEiIChjb3VudCkJCQkJCQlcCisJCTogIm1lbW9yeSIsICJlY3giLCAiZWR4Iik7CQkJCVwKK30gd2hpbGUgKDApCisKKworLyoqCisgKiAgX19tdXRleF9mYXN0cGF0aF9sb2NrX3JldHZhbCAtIHRyeSB0byB0YWtlIHRoZSBsb2NrIGJ5IG1vdmluZyB0aGUgY291bnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAxIHRvIGEgMCB2YWx1ZQorICogIEBjb3VudDogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiAgQGZhaWxfZm46IGZ1bmN0aW9uIHRvIGNhbGwgaWYgdGhlIG9yaWdpbmFsIHZhbHVlIHdhcyBub3QgMQorICoKKyAqIENoYW5nZSB0aGUgY291bnQgZnJvbSAxIHRvIGEgdmFsdWUgbG93ZXIgdGhhbiAxLCBhbmQgY2FsbCA8ZmFpbF9mbj4gaWYgaXQKKyAqIHdhc24ndCAxIG9yaWdpbmFsbHkuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAwIGlmIHRoZSBmYXN0cGF0aCBzdWNjZWVkcywKKyAqIG9yIGFueXRoaW5nIHRoZSBzbG93IHBhdGggZnVuY3Rpb24gcmV0dXJucworICovCitzdGF0aWMgaW5saW5lIGludAorX19tdXRleF9mYXN0cGF0aF9sb2NrX3JldHZhbChhdG9taWNfdCAqY291bnQsCisJCQkgICAgIGludCBmYXN0Y2FsbCAoKmZhaWxfZm4pKGF0b21pY190ICopKQoreworCWlmICh1bmxpa2VseShhdG9taWNfZGVjX3JldHVybihjb3VudCkgPCAwKSkKKwkJcmV0dXJuIGZhaWxfZm4oY291bnQpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIF9fbXV0ZXhfZmFzdHBhdGhfdW5sb2NrIC0gdHJ5IHRvIHByb21vdGUgdGhlIG11dGV4IGZyb20gMCB0byAxCisgKiAgQGNvdW50OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqICBAZmFpbF9mbjogZnVuY3Rpb24gdG8gY2FsbCBpZiB0aGUgb3JpZ2luYWwgdmFsdWUgd2FzIG5vdCAwCisgKgorICogdHJ5IHRvIHByb21vdGUgdGhlIG11dGV4IGZyb20gMCB0byAxLiBpZiBpdCB3YXNuJ3QgMCwgY2FsbCA8ZmFpbF9mbj4uCisgKiBJbiB0aGUgZmFpbHVyZSBjYXNlLCB0aGlzIGZ1bmN0aW9uIGlzIGFsbG93ZWQgdG8gZWl0aGVyIHNldCB0aGUgdmFsdWUKKyAqIHRvIDEsIG9yIHRvIHNldCBpdCB0byBhIHZhbHVlIGxvd2VyIHRoYW4gMS4KKyAqCisgKiBJZiB0aGUgaW1wbGVtZW50YXRpb24gc2V0cyBpdCB0byBhIHZhbHVlIG9mIGxvd2VyIHRoYW4gMSwgdGhlCisgKiBfX211dGV4X3Nsb3dwYXRoX25lZWRzX3RvX3VubG9jaygpIG1hY3JvIG5lZWRzIHRvIHJldHVybiAxLCBpdCBuZWVkcworICogdG8gcmV0dXJuIDAgb3RoZXJ3aXNlLgorICovCisjZGVmaW5lIF9fbXV0ZXhfZmFzdHBhdGhfdW5sb2NrKGNvdW50LCBmYWlsX2ZuKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGludCBkdW1teTsJCQkJCQlcCisJCQkJCQkJCQlcCisJdHlwZWNoZWNrKGF0b21pY190ICosIGNvdW50KTsJCQkJCVwKKwl0eXBlY2hlY2tfZm4oZmFzdGNhbGwgdm9pZCAoKikoYXRvbWljX3QgKiksIGZhaWxfZm4pOwkJXAorCQkJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKKwkJTE9DSwkiICAgaW5jbCAoJSVlYXgpCVxuIgkJCVwKKwkJCSIgICBqbGUgMmYJCVxuIgkJCVwKKwkJCSIxOgkJCVxuIgkJCVwKKwkJCQkJCQkJCVwKKwkJTE9DS19TRUNUSU9OX1NUQVJUKCIiKQkJCQkJXAorCQkJIjI6IGNhbGwgIiNmYWlsX2ZuIglcbiIJCQlcCisJCQkiICAgam1wIDFiCQlcbiIJCQlcCisJCUxPQ0tfU0VDVElPTl9FTkQJCQkJCVwKKwkJCQkJCQkJCVwKKwkJOiI9YSIgKGR1bW15KQkJCQkJCVwKKwkJOiAiYSIgKGNvdW50KQkJCQkJCVwKKwkJOiAibWVtb3J5IiwgImVjeCIsICJlZHgiKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX211dGV4X3Nsb3dwYXRoX25lZWRzX3RvX3VubG9jaygpCTEKKworLyoqCisgKiBfX211dGV4X2Zhc3RwYXRoX3RyeWxvY2sgLSB0cnkgdG8gYWNxdWlyZSB0aGUgbXV0ZXgsIHdpdGhvdXQgd2FpdGluZworICoKKyAqICBAY291bnQ6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogIEBmYWlsX2ZuOiBmYWxsYmFjayBmdW5jdGlvbgorICoKKyAqIENoYW5nZSB0aGUgY291bnQgZnJvbSAxIHRvIGEgdmFsdWUgbG93ZXIgdGhhbiAxLCBhbmQgcmV0dXJuIDAgKGZhaWx1cmUpCisgKiBpZiBpdCB3YXNuJ3QgMSBvcmlnaW5hbGx5LCBvciByZXR1cm4gMSAoc3VjY2Vzcykgb3RoZXJ3aXNlLiBUaGlzIGZ1bmN0aW9uCisgKiBNVVNUIGxlYXZlIHRoZSB2YWx1ZSBsb3dlciB0aGFuIDEgZXZlbiB3aGVuIHRoZSAiMSIgYXNzZXJ0aW9uIHdhc24ndCB0cnVlLgorICogQWRkaXRpb25hbGx5LCBpZiB0aGUgdmFsdWUgd2FzIDwgMCBvcmlnaW5hbGx5LCB0aGlzIGZ1bmN0aW9uIG11c3Qgbm90IGxlYXZlCisgKiBpdCB0byAwIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX211dGV4X2Zhc3RwYXRoX3RyeWxvY2soYXRvbWljX3QgKmNvdW50LCBpbnQgKCpmYWlsX2ZuKShhdG9taWNfdCAqKSkKK3sKKwkvKgorCSAqIFdlIGhhdmUgdHdvIHZhcmlhbnRzIGhlcmUuIFRoZSBjbXB4Y2hnIGJhc2VkIG9uZSBpcyB0aGUgYmVzdCBvbmUKKwkgKiBiZWNhdXNlIGl0IG5ldmVyIGluZHVjZSBhIGZhbHNlIGNvbnRlbnRpb24gc3RhdGUuICBJdCBpcyBpbmNsdWRlZAorCSAqIGhlcmUgYmVjYXVzZSBhcmNoaXRlY3R1cmVzIHVzaW5nIHRoZSBpbmMvZGVjIGFsZ29yaXRobXMgb3ZlciB0aGUKKwkgKiB4Y2hnIG9uZXMgYXJlIG11Y2ggbW9yZSBsaWtlbHkgdG8gc3VwcG9ydCBjbXB4Y2hnIG5hdGl2ZWx5LgorCSAqCisJICogSWYgbm90IHdlIGZhbGwgYmFjayB0byB0aGUgc3BpbmxvY2sgYmFzZWQgdmFyaWFudCAtIHRoYXQgaXMKKwkgKiBqdXN0IGFzIGVmZmljaWVudCAoYW5kIHNpbXBsZXIpIGFzIGEgJ2Rlc3RydWN0aXZlJyBwcm9iaW5nIG9mCisJICogdGhlIG11dGV4IHN0YXRlIHdvdWxkIGJlLgorCSAqLworI2lmZGVmIF9fSEFWRV9BUkNIX0NNUFhDSEcKKwlpZiAobGlrZWx5KGF0b21pY19jbXB4Y2hnKGNvdW50LCAxLCAwKSA9PSAxKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CisjZWxzZQorCXJldHVybiBmYWlsX2ZuKGNvdW50KTsKKyNlbmRpZgorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1pMzg2L3Byb2Nlc3Nvci5oCmluZGV4IDVjOTZjZjYuLmZlY2E1ZDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wcm9jZXNzb3IuaApAQCAtNjEsOSArNjEsMTEgQEAKIAlpbnQgCXg4Nl9jYWNoZV9zaXplOyAgLyogaW4gS0IgLSB2YWxpZCBmb3IgQ1BVUyB3aGljaCBzdXBwb3J0IHRoaXMKIAkJCQkgICAgY2FsbCAgKi8KIAlpbnQgCXg4Nl9jYWNoZV9hbGlnbm1lbnQ7CS8qIEluIGJ5dGVzICovCi0JaW50CWZkaXZfYnVnOwotCWludAlmMDBmX2J1ZzsKLQlpbnQJY29tYV9idWc7CisJY2hhcglmZGl2X2J1ZzsKKwljaGFyCWYwMGZfYnVnOworCWNoYXIJY29tYV9idWc7CisJY2hhcglwYWQwOworCWludAl4ODZfcG93ZXI7CiAJdW5zaWduZWQgbG9uZyBsb29wc19wZXJfamlmZnk7CiAJdW5zaWduZWQgY2hhciB4ODZfbWF4X2NvcmVzOwkvKiBjcHVpZCByZXR1cm5lZCBtYXggY29yZXMgdmFsdWUgKi8KIAl1bnNpZ25lZCBjaGFyIGJvb3RlZF9jb3JlczsJLyogbnVtYmVyIG9mIGNvcmVzIGFzIHNlZW4gYnkgT1MgKi8KQEAgLTI3OSw5ICsyODEsMTEgQEAKIAlvdXRiKChkYXRhKSwgMHgyMyk7IFwKIH0gd2hpbGUgKDApCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXJpYWxpemVfY3B1KHZvaWQpCisvKiBTdG9wIHNwZWN1bGF0aXZlIGV4ZWN1dGlvbiAqLworc3RhdGljIGlubGluZSB2b2lkIHN5bmNfY29yZSh2b2lkKQogewotCSBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNwdWlkIiA6IDogOiAiYXgiLCAiYngiLCAiY3giLCAiZHgiKTsKKwlpbnQgdG1wOworCWFzbSB2b2xhdGlsZSgiY3B1aWQiIDogIj1hIiAodG1wKSA6ICIwIiAoMSkgOiAiZWJ4IiwiZWN4IiwiZWR4IiwibWVtb3J5Iik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX21vbml0b3IoY29uc3Qgdm9pZCAqZWF4LCB1bnNpZ25lZCBsb25nIGVjeCwKQEAgLTU1NywxMCArNTYxLDIwIEBACiAgICAgICAgKHVuc2lnbmVkIGxvbmcpKCZfX3B0cltUSFJFQURfU0laRV9MT05HU10pOyAgICAgICAgICAgICAgICAgICAgIFwKIH0pCiAKKy8qCisgKiBUaGUgYmVsb3cgLTggaXMgdG8gcmVzZXJ2ZSA4IGJ5dGVzIG9uIHRvcCBvZiB0aGUgcmluZzAgc3RhY2suCisgKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBndWFyYW50ZWUgdGhhdCB0aGUgZW50aXJlICJzdHJ1Y3QgcHRfcmVncyIKKyAqIGlzIGFjY2Vzc2FibGUgZXZlbiBpZiB0aGUgQ1BVIGhhdmVuJ3Qgc3RvcmVkIHRoZSBTUy9FU1AgcmVnaXN0ZXJzCisgKiBvbiB0aGUgc3RhY2sgKGludGVycnVwdCBnYXRlIGRvZXMgbm90IHNhdmUgdGhlc2UgcmVnaXN0ZXJzCisgKiB3aGVuIHN3aXRjaGluZyB0byB0aGUgc2FtZSBwcml2IHJpbmcpLgorICogVGhlcmVmb3JlIGJld2FyZTogYWNjZXNzaW5nIHRoZSB4c3MvZXNwIGZpZWxkcyBvZiB0aGUKKyAqICJzdHJ1Y3QgcHRfcmVncyIgaXMgcG9zc2libGUsIGJ1dCB0aGV5IG1heSBjb250YWluIHRoZQorICogY29tcGxldGVseSB3cm9uZyB2YWx1ZXMuCisgKi8KICNkZWZpbmUgdGFza19wdF9yZWdzKHRhc2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgc3RydWN0IHB0X3JlZ3MgKl9fcmVnc19fOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBfX3JlZ3NfXyA9IChzdHJ1Y3QgcHRfcmVncyAqKUtTVEtfVE9QKCh0YXNrKS0+dGhyZWFkX2luZm8pOyAgICAgXAorICAgICAgIF9fcmVnc19fID0gKHN0cnVjdCBwdF9yZWdzICopKEtTVEtfVE9QKHRhc2tfc3RhY2tfcGFnZSh0YXNrKSktOCk7IFwKICAgICAgICBfX3JlZ3NfXyAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLWkzODYvcHRyYWNlLmgKaW5kZXggN2UwZjI5NC4uZjMyNGM1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3B0cmFjZS5oCkBAIC01NCw2ICs1NCw5IEBACiAjZGVmaW5lIFBUUkFDRV9HRVRfVEhSRUFEX0FSRUEgICAgMjUKICNkZWZpbmUgUFRSQUNFX1NFVF9USFJFQURfQVJFQSAgICAyNgogCisjZGVmaW5lIFBUUkFDRV9TWVNFTVUJCSAgMzEKKyNkZWZpbmUgUFRSQUNFX1NZU0VNVV9TSU5HTEVTVEVQICAzMgorCiAjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8YXNtL3ZtODYuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvc2lnbmFsLmggYi9pbmNsdWRlL2FzbS1pMzg2L3NpZ25hbC5oCmluZGV4IDc2NTI0YjQuLjAyNmZkMjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvc2lnbmFsLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9zaWduYWwuaApAQCAtMjE4LDcgKzIxOCw2IEBACiB9CiAKIHN0cnVjdCBwdF9yZWdzOwotZXh0ZXJuIGludCBGQVNUQ0FMTChkb19zaWduYWwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHNpZ3NldF90ICpvbGRzZXQpKTsKIAogI2RlZmluZSBwdHJhY2Vfc2lnbmFsX2RlbGl2ZXIocmVncywgY29va2llKQkJXAogCWRvIHsJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3N0cmluZy5oIGIvaW5jbHVkZS9hc20taTM4Ni9zdHJpbmcuaAppbmRleCAwMmM4ZjVkLi5iYjVmODhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3N0cmluZy5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvc3RyaW5nLmgKQEAgLTIwMSw3ICsyMDEsNyBAQAogcmV0dXJuIF9fcmVzOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgKiBfX21lbWNweSh2b2lkICogdG8sIGNvbnN0IHZvaWQgKiBmcm9tLCBzaXplX3QgbikKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqIF9fbWVtY3B5KHZvaWQgKiB0bywgY29uc3Qgdm9pZCAqIGZyb20sIHNpemVfdCBuKQogewogaW50IGQwLCBkMSwgZDI7CiBfX2FzbV9fIF9fdm9sYXRpbGVfXygKQEAgLTIyMyw3ICsyMjMsNyBAQAogICogVGhpcyBsb29rcyB1Z2x5LCBidXQgdGhlIGNvbXBpbGVyIGNhbiBvcHRpbWl6ZSBpdCB0b3RhbGx5LAogICogYXMgdGhlIGNvdW50IGlzIGNvbnN0YW50LgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgKiBfX2NvbnN0YW50X21lbWNweSh2b2lkICogdG8sIGNvbnN0IHZvaWQgKiBmcm9tLCBzaXplX3QgbikKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqIF9fY29uc3RhbnRfbWVtY3B5KHZvaWQgKiB0bywgY29uc3Qgdm9pZCAqIGZyb20sIHNpemVfdCBuKQogewogCWxvbmcgZXNpLCBlZGk7CiAJaWYgKCFuKSByZXR1cm4gdG87CkBAIC0zNjcsNyArMzY3LDcgQEAKICAqIHRoaW5ncyAzMiBiaXRzIGF0IGEgdGltZSBldmVuIHdoZW4gd2UgZG9uJ3Qga25vdyB0aGUgc2l6ZSBvZiB0aGUKICAqIGFyZWEgYXQgY29tcGlsZS10aW1lLi4KICAqLwotc3RhdGljIGlubGluZSB2b2lkICogX19jb25zdGFudF9jX21lbXNldCh2b2lkICogcywgdW5zaWduZWQgbG9uZyBjLCBzaXplX3QgY291bnQpCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKiBfX2NvbnN0YW50X2NfbWVtc2V0KHZvaWQgKiBzLCB1bnNpZ25lZCBsb25nIGMsIHNpemVfdCBjb3VudCkKIHsKIGludCBkMCwgZDE7CiBfX2FzbV9fIF9fdm9sYXRpbGVfXygKQEAgLTQxNiw3ICs0MTYsNyBAQAogICogVGhpcyBsb29rcyBob3JyaWJseSB1Z2x5LCBidXQgdGhlIGNvbXBpbGVyIGNhbiBvcHRpbWl6ZSBpdCB0b3RhbGx5LAogICogYXMgd2UgYnkgbm93IGtub3cgdGhhdCBib3RoIHBhdHRlcm4gYW5kIGNvdW50IGlzIGNvbnN0YW50Li4KICAqLwotc3RhdGljIGlubGluZSB2b2lkICogX19jb25zdGFudF9jX2FuZF9jb3VudF9tZW1zZXQodm9pZCAqIHMsIHVuc2lnbmVkIGxvbmcgcGF0dGVybiwgc2l6ZV90IGNvdW50KQorc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICogX19jb25zdGFudF9jX2FuZF9jb3VudF9tZW1zZXQodm9pZCAqIHMsIHVuc2lnbmVkIGxvbmcgcGF0dGVybiwgc2l6ZV90IGNvdW50KQogewogCXN3aXRjaCAoY291bnQpIHsKIAkJY2FzZSAwOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLWkzODYvc3lzdGVtLmgKaW5kZXggOWMwNTkzYi4uMzZhOTJlZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3N5c3RlbS5oCkBAIC01NDgsNiArNTQ4LDE1IEBACiBleHRlcm4gaW50IGVzNzAwMF9wbGF0Owogdm9pZCBjcHVfaWRsZV93YWl0KHZvaWQpOwogCisvKgorICogT24gU01QIHN5c3RlbXMsIHdoZW4gdGhlIHNjaGVkdWxlciBkb2VzIG1pZ3JhdGlvbi1jb3N0IGF1dG9kZXRlY3Rpb24sCisgKiBpdCBuZWVkcyBhIHdheSB0byBmbHVzaCBhcyBtdWNoIG9mIHRoZSBDUFUncyBjYWNoZXMgYXMgcG9zc2libGU6CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZF9jYWNoZWZsdXNoKHZvaWQpCit7CisJd2JpbnZkKCk7Cit9CisKIGV4dGVybiB1bnNpZ25lZCBsb25nIGFyY2hfYWxpZ25fc3RhY2sodW5zaWduZWQgbG9uZyBzcCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20taTM4Ni90aHJlYWRfaW5mby5oCmluZGV4IDhmYmY3OTEuLmUyMGU5OTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3RocmVhZF9pbmZvLmgKQEAgLTExMSw4ICsxMTEsNiBAQAogI2VuZGlmCiAKICNkZWZpbmUgZnJlZV90aHJlYWRfaW5mbyhpbmZvKQlrZnJlZShpbmZvKQotI2RlZmluZSBnZXRfdGhyZWFkX2luZm8odGkpIGdldF90YXNrX3N0cnVjdCgodGkpLT50YXNrKQotI2RlZmluZSBwdXRfdGhyZWFkX2luZm8odGkpIHB1dF90YXNrX3N0cnVjdCgodGkpLT50YXNrKQogCiAjZWxzZSAvKiAhX19BU1NFTUJMWV9fICovCiAKQEAgLTE0Miw2ICsxNDAsNyBAQAogI2RlZmluZSBUSUZfU1lTQ0FMTF9FTVUJCTYJLyogc3lzY2FsbCBlbXVsYXRpb24gYWN0aXZlICovCiAjZGVmaW5lIFRJRl9TWVNDQUxMX0FVRElUCTcJLyogc3lzY2FsbCBhdWRpdGluZyBhY3RpdmUgKi8KICNkZWZpbmUgVElGX1NFQ0NPTVAJCTgJLyogc2VjdXJlIGNvbXB1dGluZyAqLworI2RlZmluZSBUSUZfUkVTVE9SRV9TSUdNQVNLCTkJLyogcmVzdG9yZSBzaWduYWwgbWFzayBpbiBkb19zaWduYWwoKSAqLwogI2RlZmluZSBUSUZfUE9MTElOR19OUkZMQUcJMTYJLyogdHJ1ZSBpZiBwb2xsX2lkbGUoKSBpcyBwb2xsaW5nIFRJRl9ORUVEX1JFU0NIRUQgKi8KICNkZWZpbmUgVElGX01FTURJRQkJMTcKIApAQCAtMTU0LDYgKzE1Myw3IEBACiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9FTVUJKDE8PFRJRl9TWVNDQUxMX0VNVSkKICNkZWZpbmUgX1RJRl9TWVNDQUxMX0FVRElUCSgxPDxUSUZfU1lTQ0FMTF9BVURJVCkKICNkZWZpbmUgX1RJRl9TRUNDT01QCQkoMTw8VElGX1NFQ0NPTVApCisjZGVmaW5lIF9USUZfUkVTVE9SRV9TSUdNQVNLCSgxPDxUSUZfUkVTVE9SRV9TSUdNQVNLKQogI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxPDxUSUZfUE9MTElOR19OUkZMQUcpCiAKIC8qIHdvcmsgdG8gZG8gb24gaW50ZXJydXB0L2V4Y2VwdGlvbiByZXR1cm4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdG9wb2xvZ3kuaCBiL2luY2x1ZGUvYXNtLWkzODYvdG9wb2xvZ3kuaAppbmRleCAwZWMyN2M5Li5kN2UxOWViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3RvcG9sb2d5LmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni90b3BvbG9neS5oCkBAIC03Miw3ICs3Miw2IEBACiAJLm1heF9pbnRlcnZhbAkJPSAzMiwJCQlcCiAJLmJ1c3lfZmFjdG9yCQk9IDMyLAkJCVwKIAkuaW1iYWxhbmNlX3BjdAkJPSAxMjUsCQkJXAotCS5jYWNoZV9ob3RfdGltZQkJPSAoMTAqMTAwMDAwMCksCQlcCiAJLmNhY2hlX25pY2VfdHJpZXMJPSAxLAkJCVwKIAkuYnVzeV9pZHgJCT0gMywJCQlcCiAJLmlkbGVfaWR4CQk9IDEsCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1pMzg2L3VhY2Nlc3MuaAppbmRleCA4OWFiN2UyLi4zZjEzMzdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3VhY2Nlc3MuaApAQCAtNDExLDcgKzQxMSw3IEBACiAgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB0aGF0IGNvdWxkIG5vdCBiZSBjb3BpZWQuCiAgKiBPbiBzdWNjZXNzLCB0aGlzIHdpbGwgYmUgemVyby4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjaworc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjawogX19jb3B5X3RvX3VzZXJfaW5hdG9taWModm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pKSB7CkBAIC00MzIsNyArNDMyLDcgQEAKIAlyZXR1cm4gX19jb3B5X3RvX3VzZXJfbGwodG8sIGZyb20sIG4pOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCiBfX2NvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKICAgICAgICBtaWdodF9zbGVlcCgpOwpAQCAtNDU2LDcgKzQ1Niw3IEBACiAgKiBJZiBzb21lIGRhdGEgY291bGQgbm90IGJlIGNvcGllZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHBhZCB0aGUgY29waWVkCiAgKiBkYXRhIHRvIHRoZSByZXF1ZXN0ZWQgc2l6ZSB1c2luZyB6ZXJvIGJ5dGVzLgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgbG9uZwogX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyh2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAlpZiAoX19idWlsdGluX2NvbnN0YW50X3AobikpIHsKQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCXJldHVybiBfX2NvcHlfZnJvbV91c2VyX2xsKHRvLCBmcm9tLCBuKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcKIF9fY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAgICAgICAgbWlnaHRfc2xlZXAoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1pMzg2L3VuaXN0ZC5oCmluZGV4IGZlMzhiOWEuLjU5NzQ5NmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni91bmlzdGQuaApAQCAtMjk5LDggKzI5OSwyNCBAQAogI2RlZmluZSBfX05SX2lub3RpZnlfaW5pdAkyOTEKICNkZWZpbmUgX19OUl9pbm90aWZ5X2FkZF93YXRjaAkyOTIKICNkZWZpbmUgX19OUl9pbm90aWZ5X3JtX3dhdGNoCTI5MworI2RlZmluZSBfX05SX21pZ3JhdGVfcGFnZXMJMjk0CisjZGVmaW5lIF9fTlJfb3BlbmF0CQkyOTUKKyNkZWZpbmUgX19OUl9ta2RpcmF0CQkyOTYKKyNkZWZpbmUgX19OUl9ta25vZGF0CQkyOTcKKyNkZWZpbmUgX19OUl9mY2hvd25hdAkJMjk4CisjZGVmaW5lIF9fTlJfZnV0aW1lc2F0CQkyOTkKKyNkZWZpbmUgX19OUl9uZXdmc3RhdGF0CQkzMDAKKyNkZWZpbmUgX19OUl91bmxpbmthdAkJMzAxCisjZGVmaW5lIF9fTlJfcmVuYW1lYXQJCTMwMgorI2RlZmluZSBfX05SX2xpbmthdAkJMzAzCisjZGVmaW5lIF9fTlJfc3ltbGlua2F0CQkzMDQKKyNkZWZpbmUgX19OUl9yZWFkbGlua2F0CQkzMDUKKyNkZWZpbmUgX19OUl9mY2htb2RhdAkJMzA2CisjZGVmaW5lIF9fTlJfZmFjY2Vzc2F0CQkzMDcKKyNkZWZpbmUgX19OUl9wc2VsZWN0NgkJMzA4CisjZGVmaW5lIF9fTlJfcHBvbGwJCTMwOQogCi0jZGVmaW5lIE5SX3N5c2NhbGxzIDI5NAorI2RlZmluZSBOUl9zeXNjYWxscyAzMTAKIAogLyoKICAqIHVzZXItdmlzaWJsZSBlcnJvciBudW1iZXJzIGFyZSBpbiB0aGUgcmFuZ2UgLTEgLSAtMTI4OiBzZWUKQEAgLTQxNiw2ICs0MzIsNyBAQAogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHUEVORElORwogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHUFJPQ01BU0sKICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1JUX1NJR0FDVElPTgorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfUlRfU0lHU1VTUEVORAogI2VuZGlmCiAKICNpZmRlZiBfX0tFUk5FTF9TWVNDQUxMU19fCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3ZtODYuaCBiL2luY2x1ZGUvYXNtLWkzODYvdm04Ni5oCmluZGV4IDQwZWM4MmMuLjk1MmZkNjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvdm04Ni5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvdm04Ni5oCkBAIC0xNiw3ICsxNiwxMSBAQAogI2RlZmluZSBJRl9NQVNLCQkweDAwMDAwMjAwCiAjZGVmaW5lIElPUExfTUFTSwkweDAwMDAzMDAwCiAjZGVmaW5lIE5UX01BU0sJCTB4MDAwMDQwMDAKKyNpZmRlZiBDT05GSUdfVk04NgogI2RlZmluZSBWTV9NQVNLCQkweDAwMDIwMDAwCisjZWxzZQorI2RlZmluZSBWTV9NQVNLCQkwIC8qIGlnbm9yZWQgKi8KKyNlbmRpZgogI2RlZmluZSBBQ19NQVNLCQkweDAwMDQwMDAwCiAjZGVmaW5lIFZJRl9NQVNLCTB4MDAwODAwMDAJLyogdmlydHVhbCBpbnRlcnJ1cHQgZmxhZyAqLwogI2RlZmluZSBWSVBfTUFTSwkweDAwMTAwMDAwCS8qIHZpcnR1YWwgaW50ZXJydXB0IHBlbmRpbmcgKi8KQEAgLTIwMCw5ICsyMDQsMjUgQEAKICAqLwogfTsKIAorI2lmZGVmIENPTkZJR19WTTg2CisKIHZvaWQgaGFuZGxlX3ZtODZfZmF1bHQoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKiwgbG9uZyk7CiBpbnQgaGFuZGxlX3ZtODZfdHJhcChzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyAqLCBsb25nLCBpbnQpOwogCitzdHJ1Y3QgdGFza19zdHJ1Y3Q7Cit2b2lkIHJlbGVhc2Vfdm04Nl9pcnFzKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKKworI2Vsc2UKKworI2RlZmluZSBoYW5kbGVfdm04Nl9mYXVsdChhLCBiKQorI2RlZmluZSByZWxlYXNlX3ZtODZfaXJxcyhhKQorCitzdGF0aWMgaW5saW5lIGludCBoYW5kbGVfdm04Nl90cmFwKHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICphLCBsb25nIGIsIGludCBjKSB7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfVk04NiAqLworCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1pYTY0L2F0b21pYy5oCmluZGV4IDE1Y2Y3OTguLmQzZTBkZmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9hdG9taWMuaApAQCAtODksNiArODksNyBAQAogfQogCiAjZGVmaW5lIGF0b21pY19jbXB4Y2hnKHYsIG9sZCwgbmV3KSAoKGludCljbXB4Y2hnKCYoKHYpLT5jb3VudGVyKSwgb2xkLCBuZXcpKQorI2RlZmluZSBhdG9taWNfeGNoZyh2LCBuZXcpICh4Y2hnKCYoKHYpLT5jb3VudGVyKSwgbmV3KSkKIAogI2RlZmluZSBhdG9taWNfYWRkX3VubGVzcyh2LCBhLCB1KQkJCQlcCiAoewkJCQkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9idWcuaCBiL2luY2x1ZGUvYXNtLWlhNjQvYnVnLmgKaW5kZXggM2FhMGEwYS4uODIzNjE2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9idWcuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2J1Zy5oCkBAIC0yLDExICsyLDcgQEAKICNkZWZpbmUgX0FTTV9JQTY0X0JVR19ICiAKICNpZmRlZiBDT05GSUdfQlVHCi0jaWYgKF9fR05VQ19fID4gMykgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gMSkKLSMgZGVmaW5lIGlhNjRfYWJvcnQoKQlfX2J1aWx0aW5fdHJhcCgpCi0jZWxzZQotIyBkZWZpbmUgaWE2NF9hYm9ydCgpCSgqKHZvbGF0aWxlIGludCAqKSAwID0gMCkKLSNlbmRpZgorI2RlZmluZSBpYTY0X2Fib3J0KCkJX19idWlsdGluX3RyYXAoKQogI2RlZmluZSBCVUcoKSBkbyB7IHByaW50aygia2VybmVsIEJVRyBhdCAlczolZCFcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7IGlhNjRfYWJvcnQoKTsgfSB3aGlsZSAoMCkKIAogLyogc2hvdWxkIHRoaXMgQlVHIGJlIG1hZGUgZ2VuZXJpYz8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvY2FjaGUuaCBiL2luY2x1ZGUvYXNtLWlhNjQvY2FjaGUuaAppbmRleCA2NjZkOGYxLi40MGRkMjUxOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9jYWNoZS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvY2FjaGUuaApAQCAtMTIsOCArMTIsNiBAQAogI2RlZmluZSBMMV9DQUNIRV9TSElGVAkJQ09ORklHX0lBNjRfTDFfQ0FDSEVfU0hJRlQKICNkZWZpbmUgTDFfQ0FDSEVfQllURVMJCSgxIDw8IEwxX0NBQ0hFX1NISUZUKQogCi0jZGVmaW5lIEwxX0NBQ0hFX1NISUZUX01BWCA3CS8qIGxhcmdlc3QgTDEgd2hpY2ggdGhpcyBhcmNoIHN1cHBvcnRzICovCi0KICNpZmRlZiBDT05GSUdfU01QCiAjIGRlZmluZSBTTVBfQ0FDSEVfU0hJRlQJTDFfQ0FDSEVfU0hJRlQKICMgZGVmaW5lIFNNUF9DQUNIRV9CWVRFUwlMMV9DQUNIRV9CWVRFUwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLWlhNjQvY29tcGF0LmgKaW5kZXggYWFmMTFmNC4uYzBiMTkxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2NvbXBhdC5oCkBAIC0xOTIsNyArMTkyLDcgQEAKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgX191c2VyICoKIGNvbXBhdF9hbGxvY191c2VyX3NwYWNlIChsb25nIGxlbikKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGlhNjRfdGFza19yZWdzKGN1cnJlbnQpOworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOwogCXJldHVybiAodm9pZCBfX3VzZXIgKikgKCgocmVncy0+cjEyICYgMHhmZmZmZmZmZikgJiAtMTYpIC0gbGVuKTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9mdXRleC5oIGIvaW5jbHVkZS9hc20taWE2NC9mdXRleC5oCmluZGV4IDlmZWZmNGNlLi42YTMzMmE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2Z1dGV4LmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9mdXRleC5oCkBAIC0xLDUzICsxLDYgQEAKICNpZm5kZWYgX0FTTV9GVVRFWF9ICiAjZGVmaW5lIF9BU01fRlVURVhfSAogCi0jaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2Z1dGV4Lmg+CiAKLSNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1mdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCi17Ci0JaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKLQlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7Ci0JaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7Ci0JaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKLQlpbnQgb2xkdmFsID0gMCwgcmV0OwotCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKLQkJb3BhcmcgPSAxIDw8IG9wYXJnOwotCi0JaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaW5jX3ByZWVtcHRfY291bnQoKTsKLQotCXN3aXRjaCAob3ApIHsKLQljYXNlIEZVVEVYX09QX1NFVDoKLQljYXNlIEZVVEVYX09QX0FERDoKLQljYXNlIEZVVEVYX09QX09SOgotCWNhc2UgRlVURVhfT1BfQU5ETjoKLQljYXNlIEZVVEVYX09QX1hPUjoKLQlkZWZhdWx0OgotCQlyZXQgPSAtRU5PU1lTOwotCX0KLQotCWRlY19wcmVlbXB0X2NvdW50KCk7Ci0KLQlpZiAoIXJldCkgewotCQlzd2l0Y2ggKGNtcCkgewotCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKLQkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0jZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9pby5oIGIvaW5jbHVkZS9hc20taWE2NC9pby5oCmluZGV4IGNmNzcyYTYuLmI2NGZkYjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2lvLmgKQEAgLTg5LDYgKzg5LDcgQEAKIAogI2RlZmluZSBBUkNIX0hBU19WQUxJRF9QSFlTX0FERFJfUkFOR0UKIGV4dGVybiBpbnQgdmFsaWRfcGh5c19hZGRyX3JhbmdlICh1bnNpZ25lZCBsb25nIGFkZHIsIHNpemVfdCAqY291bnQpOyAvKiBlZmkuYyAqLworZXh0ZXJuIGludCB2YWxpZF9tbWFwX3BoeXNfYWRkcl9yYW5nZSAodW5zaWduZWQgbG9uZyBhZGRyLCBzaXplX3QgKmNvdW50KTsKIAogLyoKICAqIFRoZSBmb2xsb3dpbmcgdHdvIG1hY3JvcyBhcmUgZGVwcmVjYXRlZCBhbmQgc2NoZWR1bGVkIGZvciByZW1vdmFsLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9pb2N0bC5oIGIvaW5jbHVkZS9hc20taWE2NC9pb2N0bC5oCmluZGV4IGJlOWNjMjQuLmIyNzlmZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvaW9jdGwuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2lvY3RsLmgKQEAgLTEsNzcgKzEgQEAKLSNpZm5kZWYgX0FTTV9JQTY0X0lPQ1RMX0gKLSNkZWZpbmUgX0FTTV9JQTY0X0lPQ1RMX0gKLQotLyoKLSAqIEJhc2VkIG9uIDxhc20taTM4Ni9pb2N0bC5oPi4KLSAqCi0gKiBNb2RpZmllZCAxOTk4LCAxOTk5Ci0gKglEYXZpZCBNb3NiZXJnZXItVGFuZyA8ZGF2aWRtQGhwbC5ocC5jb20+LCBIZXdsZXR0LVBhY2thcmQgQ28KLSAqLwotCi0vKiBpb2N0bCBjb21tYW5kIGVuY29kaW5nOiAzMiBiaXRzIHRvdGFsLCBjb21tYW5kIGluIGxvd2VyIDE2IGJpdHMsCi0gKiBzaXplIG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGluIHRoZSBsb3dlciAxNCBiaXRzIG9mIHRoZQotICogdXBwZXIgMTYgYml0cy4KLSAqIEVuY29kaW5nIHRoZSBzaXplIG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGluIHRoZSBpb2N0bCByZXF1ZXN0Ci0gKiBpcyB1c2VmdWwgZm9yIGNhdGNoaW5nIHByb2dyYW1zIGNvbXBpbGVkIHdpdGggb2xkIHZlcnNpb25zCi0gKiBhbmQgdG8gYXZvaWQgb3ZlcndyaXRpbmcgdXNlciBzcGFjZSBvdXRzaWRlIHRoZSB1c2VyIGJ1ZmZlciBhcmVhLgotICogVGhlIGhpZ2hlc3QgMiBiaXRzIGFyZSByZXNlcnZlZCBmb3IgaW5kaWNhdGluZyB0aGUgYGBhY2Nlc3MgbW9kZScnLgotICogTk9URTogVGhpcyBsaW1pdHMgdGhlIG1heCBwYXJhbWV0ZXIgc2l6ZSB0byAxNmtCIC0xICEKLSAqLwotCi0vKgotICogVGhlIGZvbGxvd2luZyBpcyBmb3IgY29tcGF0aWJpbGl0eSBhY3Jvc3MgdGhlIHZhcmlvdXMgTGludXgKLSAqIHBsYXRmb3Jtcy4gIFRoZSBpYTY0IGlvY3RsIG51bWJlcmluZyBzY2hlbWUgZG9lc24ndCByZWFsbHkgZW5mb3JjZQotICogYSB0eXBlIGZpZWxkLiAgRGUgZmFjdG8sIGhvd2V2ZXIsIHRoZSB0b3AgOCBiaXRzIG9mIHRoZSBsb3dlciAxNgotICogYml0cyBhcmUgaW5kZWVkIHVzZWQgYXMgYSB0eXBlIGZpZWxkLCBzbyB3ZSBtaWdodCBqdXN0IGFzIHdlbGwgbWFrZQotICogdGhpcyBleHBsaWNpdCBoZXJlLiAgUGxlYXNlIGJlIHN1cmUgdG8gdXNlIHRoZSBkZWNvZGluZyBtYWNyb3MKLSAqIGJlbG93IGZyb20gbm93IG9uLgotICovCi0jZGVmaW5lIF9JT0NfTlJCSVRTCTgKLSNkZWZpbmUgX0lPQ19UWVBFQklUUwk4Ci0jZGVmaW5lIF9JT0NfU0laRUJJVFMJMTQKLSNkZWZpbmUgX0lPQ19ESVJCSVRTCTIKLQotI2RlZmluZSBfSU9DX05STUFTSwkoKDEgPDwgX0lPQ19OUkJJVFMpLTEpCi0jZGVmaW5lIF9JT0NfVFlQRU1BU0sJKCgxIDw8IF9JT0NfVFlQRUJJVFMpLTEpCi0jZGVmaW5lIF9JT0NfU0laRU1BU0sJKCgxIDw8IF9JT0NfU0laRUJJVFMpLTEpCi0jZGVmaW5lIF9JT0NfRElSTUFTSwkoKDEgPDwgX0lPQ19ESVJCSVRTKS0xKQotCi0jZGVmaW5lIF9JT0NfTlJTSElGVAkwCi0jZGVmaW5lIF9JT0NfVFlQRVNISUZUCShfSU9DX05SU0hJRlQrX0lPQ19OUkJJVFMpCi0jZGVmaW5lIF9JT0NfU0laRVNISUZUCShfSU9DX1RZUEVTSElGVCtfSU9DX1RZUEVCSVRTKQotI2RlZmluZSBfSU9DX0RJUlNISUZUCShfSU9DX1NJWkVTSElGVCtfSU9DX1NJWkVCSVRTKQotCi0vKgotICogRGlyZWN0aW9uIGJpdHMuCi0gKi8KLSNkZWZpbmUgX0lPQ19OT05FCTBVCi0jZGVmaW5lIF9JT0NfV1JJVEUJMVUKLSNkZWZpbmUgX0lPQ19SRUFECTJVCi0KLSNkZWZpbmUgX0lPQyhkaXIsdHlwZSxucixzaXplKSBcCi0JKCgoZGlyKSAgPDwgX0lPQ19ESVJTSElGVCkgfCBcCi0JICgodHlwZSkgPDwgX0lPQ19UWVBFU0hJRlQpIHwgXAotCSAoKG5yKSAgIDw8IF9JT0NfTlJTSElGVCkgfCBcCi0JICgoc2l6ZSkgPDwgX0lPQ19TSVpFU0hJRlQpKQotCi0vKiB1c2VkIHRvIGNyZWF0ZSBudW1iZXJzICovCi0jZGVmaW5lIF9JTyh0eXBlLG5yKQkJX0lPQyhfSU9DX05PTkUsKHR5cGUpLChuciksMCkKLSNkZWZpbmUgX0lPUih0eXBlLG5yLHNpemUpCV9JT0MoX0lPQ19SRUFELCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKLSNkZWZpbmUgX0lPVyh0eXBlLG5yLHNpemUpCV9JT0MoX0lPQ19XUklURSwodHlwZSksKG5yKSxzaXplb2Yoc2l6ZSkpCi0jZGVmaW5lIF9JT1dSKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1JFQUR8X0lPQ19XUklURSwodHlwZSksKG5yKSxzaXplb2Yoc2l6ZSkpCi0KLS8qIHVzZWQgdG8gZGVjb2RlIGlvY3RsIG51bWJlcnMuLiAqLwotI2RlZmluZSBfSU9DX0RJUihucikJCSgoKG5yKSA+PiBfSU9DX0RJUlNISUZUKSAmIF9JT0NfRElSTUFTSykKLSNkZWZpbmUgX0lPQ19UWVBFKG5yKQkJKCgobnIpID4+IF9JT0NfVFlQRVNISUZUKSAmIF9JT0NfVFlQRU1BU0spCi0jZGVmaW5lIF9JT0NfTlIobnIpCQkoKChucikgPj4gX0lPQ19OUlNISUZUKSAmIF9JT0NfTlJNQVNLKQotI2RlZmluZSBfSU9DX1NJWkUobnIpCQkoKChucikgPj4gX0lPQ19TSVpFU0hJRlQpICYgX0lPQ19TSVpFTUFTSykKLQotLyogLi4uYW5kIGZvciB0aGUgZHJpdmVycy9zb3VuZCBmaWxlcy4uLiAqLwotCi0jZGVmaW5lIElPQ19JTgkJKF9JT0NfV1JJVEUgPDwgX0lPQ19ESVJTSElGVCkKLSNkZWZpbmUgSU9DX09VVAkJKF9JT0NfUkVBRCA8PCBfSU9DX0RJUlNISUZUKQotI2RlZmluZSBJT0NfSU5PVVQJKChfSU9DX1dSSVRFfF9JT0NfUkVBRCkgPDwgX0lPQ19ESVJTSElGVCkKLSNkZWZpbmUgSU9DU0laRV9NQVNLCShfSU9DX1NJWkVNQVNLIDw8IF9JT0NfU0laRVNISUZUKQotI2RlZmluZSBJT0NTSVpFX1NISUZUCShfSU9DX1NJWkVTSElGVCkKLQotI2VuZGlmIC8qIF9BU01fSUE2NF9JT0NUTF9IICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW9jdGwuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQva3Byb2Jlcy5oIGIvaW5jbHVkZS9hc20taWE2NC9rcHJvYmVzLmgKaW5kZXggNTkyYWJiMC4uOGMwZmMyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9rcHJvYmVzLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9rcHJvYmVzLmgKQEAgLTY4LDEwICs2OCwxNCBAQAogCXVuc2lnbmVkIGxvbmcgc3RhdHVzOwogfTsKIAorI2RlZmluZQlNQVhfUEFSQU1fUlNFX1NJWkUJKDB4NjArMHg2MC8weDNmKQogLyogcGVyLWNwdSBrcHJvYmUgY29udHJvbCBibG9jayAqLwogc3RydWN0IGtwcm9iZV9jdGxibGsgewogCXVuc2lnbmVkIGxvbmcga3Byb2JlX3N0YXR1czsKIAlzdHJ1Y3QgcHRfcmVncyBqcHJvYmVfc2F2ZWRfcmVnczsKKwl1bnNpZ25lZCBsb25nIGpwcm9iZXNfc2F2ZWRfc3RhY2tlZF9yZWdzW01BWF9QQVJBTV9SU0VfU0laRV07CisJdW5zaWduZWQgbG9uZyAqYnNwOworCXVuc2lnbmVkIGxvbmcgY2ZtOwogCXN0cnVjdCBwcmV2X2twcm9iZSBwcmV2X2twcm9iZTsKIH07CiAKQEAgLTg5LDYgKzkzLDcgQEAKICNkZWZpbmUgSVBfUkVMQVRJVkVfUFJFRElDVF9PUENPREUJKDcpCiAjZGVmaW5lIExPTkdfQlJBTkNIX09QQ09ERQkJKDB4QykKICNkZWZpbmUgTE9OR19DQUxMX09QQ09ERQkJKDB4RCkKKyNkZWZpbmUgYXJjaF9yZW1vdmVfa3Byb2JlKHApCQlkbyB7fSB3aGlsZSAoMCkKIAogdHlwZWRlZiBzdHJ1Y3Qga3Byb2JlX29wY29kZSB7CiAJYnVuZGxlX3QgYnVuZGxlOwpAQCAtMTEwLDEyICsxMTUsNiBAQAogIAl1bnNpZ25lZCBzaG9ydCB0YXJnZXRfYnJfcmVnOwogfTsKIAotLyogaWE2NCBkb2VzIG5vdCBuZWVkIHRoaXMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2NvcHlfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCi17Ci19Ci0KLSNpZmRlZiBDT05GSUdfS1BST0JFUwogZXh0ZXJuIGludCBrcHJvYmVfZXhjZXB0aW9uc19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAogCQkJCSAgICB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSk7CiAKQEAgLTEyMywxMiArMTIyLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBqcHJvYmVfcmV0dXJuKHZvaWQpCiB7CiB9CitleHRlcm4gdm9pZCBpbnZhbGlkYXRlX3N0YWNrZWRfcmVncyh2b2lkKTsKK2V4dGVybiB2b2lkIGZsdXNoX3JlZ2lzdGVyX3N0YWNrKHZvaWQpOwogCi0jZWxzZQkJCQkvKiAhQ09ORklHX0tQUk9CRVMgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGtwcm9iZV9leGNlcHRpb25zX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCi0JCQkJCSAgIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKQotewotCXJldHVybiAwOwotfQotI2VuZGlmCiAjZW5kaWYJCQkJLyogX0FTTV9LUFJPQkVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvbXV0ZXguaCBiL2luY2x1ZGUvYXNtLWlhNjQvbXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NThjMWY3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taWE2NC9tdXRleC5oCkBAIC0wLDAgKzEsOSBAQAorLyoKKyAqIFB1bGwgaW4gdGhlIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBtdXRleCBmYXN0cGF0aC4KKyAqCisgKiBUT0RPOiBpbXBsZW1lbnQgb3B0aW1pemVkIHByaW1pdGl2ZXMgaW5zdGVhZCwgb3IgbGVhdmUgdGhlIGdlbmVyaWMKKyAqIGltcGxlbWVudGF0aW9uIGluIHBsYWNlLCBvciBwaWNrIHRoZSBhdG9taWNfeGNoZygpIGJhc2VkIGdlbmVyaWMKKyAqIGltcGxlbWVudGF0aW9uLiAoc2VlIGFzbS1nZW5lcmljL211dGV4LXhjaGcuaCBmb3IgZGV0YWlscykKKyAqLworCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbXV0ZXgtZGVjLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3BhbC5oIGIvaW5jbHVkZS9hc20taWE2NC9wYWwuaAppbmRleCBlODI4Mzc3Li43NzA4ZWM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3BhbC5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvcGFsLmgKQEAgLTkyNyw3ICs5MjcsNyBAQAogaWE2NF9wYWxfY2FjaGVfZmx1c2ggKHU2NCBjYWNoZV90eXBlLCB1NjQgaW52YWxpZGF0ZSwgdTY0ICpwcm9ncmVzcywgdTY0ICp2ZWN0b3IpCiB7CiAJc3RydWN0IGlhNjRfcGFsX3JldHZhbCBpcHJ2OwotCVBBTF9DQUxMX0lDX09GRihpcHJ2LCBQQUxfQ0FDSEVfRkxVU0gsIGNhY2hlX3R5cGUsIGludmFsaWRhdGUsICpwcm9ncmVzcyk7CisJUEFMX0NBTEwoaXBydiwgUEFMX0NBQ0hFX0ZMVVNILCBjYWNoZV90eXBlLCBpbnZhbGlkYXRlLCAqcHJvZ3Jlc3MpOwogCWlmICh2ZWN0b3IpCiAJCSp2ZWN0b3IgPSBpcHJ2LnYwOwogCSpwcm9ncmVzcyA9IGlwcnYudjE7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20taWE2NC9wcm9jZXNzb3IuaAppbmRleCA5NGUwN2U3Li4wOWI5OTAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvcHJvY2Vzc29yLmgKQEAgLTI1LDggKzI1LDggQEAKICAqIExpbWl0cyBmb3IgUE1DIGFuZCBQTUQgYXJlIHNldCB0byBsZXNzIHRoYW4gbWF4aW11bSBhcmNoaXRlY3RlZCB2YWx1ZXMKICAqIGJ1dCBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgYSB3aGlsZQogICovCi0jZGVmaW5lIElBNjRfTlVNX1BNQ19SRUdTCTMyCi0jZGVmaW5lIElBNjRfTlVNX1BNRF9SRUdTCTMyCisjZGVmaW5lIElBNjRfTlVNX1BNQ19SRUdTCTY0CisjZGVmaW5lIElBNjRfTlVNX1BNRF9SRUdTCTY0CiAKICNkZWZpbmUgREVGQVVMVF9NQVBfQkFTRQlfX0lBNjRfVUxfQ09OU1QoMHgyMDAwMDAwMDAwMDAwMDAwKQogI2RlZmluZSBERUZBVUxUX1RBU0tfU0laRQlfX0lBNjRfVUxfQ09OU1QoMHhhMDAwMDAwMDAwMDAwMDAwKQpAQCAtMzUyLDcgKzM1Miw3IEBACiAvKiBSZXR1cm4gaW5zdHJ1Y3Rpb24gcG9pbnRlciBvZiBibG9ja2VkIHRhc2sgVFNLLiAgKi8KICNkZWZpbmUgS1NUS19FSVAodHNrKQkJCQkJXAogICAoewkJCQkJCQlcCi0Jc3RydWN0IHB0X3JlZ3MgKl9yZWdzID0gaWE2NF90YXNrX3JlZ3ModHNrKTsJXAorCXN0cnVjdCBwdF9yZWdzICpfcmVncyA9IHRhc2tfcHRfcmVncyh0c2spOwlcCiAJX3JlZ3MtPmNyX2lpcCArIGlhNjRfcHNyKF9yZWdzKS0+cmk7CQlcCiAgIH0pCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvcHRyYWNlLmggYi9pbmNsdWRlL2FzbS1pYTY0L3B0cmFjZS5oCmluZGV4IDJjNzAzZDYuLjk0NzFjZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvcHRyYWNlLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9wdHJhY2UuaApAQCAtMjQ4LDcgKzI0OCw3IEBACiB9KQogCiAgIC8qIGdpdmVuIGEgcG9pbnRlciB0byBhIHRhc2tfc3RydWN0LCByZXR1cm4gdGhlIHVzZXIncyBwdF9yZWdzICovCi0jIGRlZmluZSBpYTY0X3Rhc2tfcmVncyh0KQkJKCgoc3RydWN0IHB0X3JlZ3MgKikgKChjaGFyICopICh0KSArIElBNjRfU1RLX09GRlNFVCkpIC0gMSkKKyMgZGVmaW5lIHRhc2tfcHRfcmVncyh0KQkJKCgoc3RydWN0IHB0X3JlZ3MgKikgKChjaGFyICopICh0KSArIElBNjRfU1RLX09GRlNFVCkpIC0gMSkKICMgZGVmaW5lIGlhNjRfcHNyKHJlZ3MpCQkJKChzdHJ1Y3QgaWE2NF9wc3IgKikgJihyZWdzKS0+Y3JfaXBzcikKICMgZGVmaW5lIHVzZXJfbW9kZShyZWdzKQkJKCgoc3RydWN0IGlhNjRfcHNyICopICYocmVncyktPmNyX2lwc3IpLT5jcGwgIT0gMCkKICMgZGVmaW5lIHVzZXJfc3RhY2sodGFzayxyZWdzKQkoKGxvbmcpIHJlZ3MgLSAobG9uZykgdGFzayA9PSBJQTY0X1NUS19PRkZTRVQgLSBzaXplb2YoKnJlZ3MpKQpAQCAtMjcxLDcgKzI3MSw3IEBACiAgICAqCiAgICAqIE9uIGlhNjQsIHdlIGNhbiBjbGVhciB0aGUgdXNlcidzIHB0X3JlZ3MtPnI4IHRvIGZvcmNlIGEgc3VjY2Vzc2Z1bCBzeXNjYWxsLgogICAgKi8KLSMgZGVmaW5lIGZvcmNlX3N1Y2Nlc3NmdWxfc3lzY2FsbF9yZXR1cm4oKQkoaWE2NF90YXNrX3JlZ3MoY3VycmVudCktPnI4ID0gMCkKKyMgZGVmaW5lIGZvcmNlX3N1Y2Nlc3NmdWxfc3lzY2FsbF9yZXR1cm4oKQkodGFza19wdF9yZWdzKGN1cnJlbnQpLT5yOCA9IDApCiAKICAgc3RydWN0IHRhc2tfc3RydWN0OwkJCS8qIGZvcndhcmQgZGVjbCAqLwogICBzdHJ1Y3QgdW53X2ZyYW1lX2luZm87CQkvKiBmb3J3YXJkIGRlY2wgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc2VtYXBob3JlLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NlbWFwaG9yZS5oCmluZGV4IGJiODkwNjIuLmY0ODNlZWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc2VtYXBob3JlLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zZW1hcGhvcmUuaApAQCAtNjEsNyArNjEsNyBAQAogZG93biAoc3RydWN0IHNlbWFwaG9yZSAqc2VtKQogewogCW1pZ2h0X3NsZWVwKCk7Ci0JaWYgKGF0b21pY19kZWNfcmV0dXJuKCZzZW0tPmNvdW50KSA8IDApCisJaWYgKGlhNjRfZmV0Y2hhZGQoLTEsICZzZW0tPmNvdW50LmNvdW50ZXIsIGFjcSkgPCAxKQogCQlfX2Rvd24oc2VtKTsKIH0KIApAQCAtNzUsNyArNzUsNyBAQAogCWludCByZXQgPSAwOwogCiAJbWlnaHRfc2xlZXAoKTsKLQlpZiAoYXRvbWljX2RlY19yZXR1cm4oJnNlbS0+Y291bnQpIDwgMCkKKwlpZiAoaWE2NF9mZXRjaGFkZCgtMSwgJnNlbS0+Y291bnQuY291bnRlciwgYWNxKSA8IDEpCiAJCXJldCA9IF9fZG93bl9pbnRlcnJ1cHRpYmxlKHNlbSk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTg1LDcgKzg1LDcgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChhdG9taWNfZGVjX3JldHVybigmc2VtLT5jb3VudCkgPCAwKQorCWlmIChpYTY0X2ZldGNoYWRkKC0xLCAmc2VtLT5jb3VudC5jb3VudGVyLCBhY3EpIDwgMSkKIAkJcmV0ID0gX19kb3duX3RyeWxvY2soc2VtKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtOTMsNyArOTMsNyBAQAogc3RhdGljIGlubGluZSB2b2lkCiB1cCAoc3RydWN0IHNlbWFwaG9yZSAqIHNlbSkKIHsKLQlpZiAoYXRvbWljX2luY19yZXR1cm4oJnNlbS0+Y291bnQpIDw9IDApCisJaWYgKGlhNjRfZmV0Y2hhZGQoMSwgJnNlbS0+Y291bnQuY291bnRlciwgcmVsKSA8PSAtMSkKIAkJX191cChzZW0pOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL2ludHIuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vaW50ci5oCmluZGV4IGUzNTA3NGYuLmEzNDMxMzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vaW50ci5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vaW50ci5oCkBAIC00MCw3ICs0MCw3IEBACiAJaW50CQlpcnFfY3B1aWQ7CS8qIGtlcm5lbCBsb2dpY2FsIGNwdWlkCSAgICAgKi8KIAlpbnQJCWlycV9pcnE7CS8qIHRoZSBJUlEgbnVtYmVyICovCiAJaW50CQlpcnFfaW50X2JpdDsJLyogQnJpZGdlIGludGVycnVwdCBwaW4gKi8KLQl1aW50NjRfdAlpcnFfeHRhbGthZGRyOwkvKiB4dGFsa2FkZHIgSVJRIGlzIHNlbnQgdG8gICovCisJdTY0CWlycV94dGFsa2FkZHI7CS8qIHh0YWxrYWRkciBJUlEgaXMgc2VudCB0byAgKi8KIAlpbnQJCWlycV9icmlkZ2VfdHlwZTsvKiBwY2lpbyBhc2ljIHR5cGUgKHBjaWlvLmgpICovCiAJdm9pZAkgICAgICAgKmlycV9icmlkZ2U7CS8qIGJyaWRnZSBnZW5lcmF0aW5nIGlycSAgICAgKi8KIAl2b2lkCSAgICAgICAqaXJxX3BjaWlvaW5mbzsJLyogYXNzb2NpYXRlZCBwY2lpb19pbmZvX3QgICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9pb2MzLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL2lvYzMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWVkNmNjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi9pb2MzLmgKQEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICovCisjaWZuZGVmIElBNjRfU05fSU9DM19ICisjZGVmaW5lIElBNjRfU05fSU9DM19ICisKKy8qIHNlcmlhbCBwb3J0IHJlZ2lzdGVyIG1hcCAqLworc3RydWN0IGlvYzNfc2VyaWFscmVncyB7CisJdWludDMyX3Qgc3NjcjsKKwl1aW50MzJfdCBzdHBpcjsKKwl1aW50MzJfdCBzdGNpcjsKKwl1aW50MzJfdCBzcnBpcjsKKwl1aW50MzJfdCBzcmNpcjsKKwl1aW50MzJfdCBzcnRyOworCXVpbnQzMl90IHNoYWRvdzsKK307CisKKy8qIFNVUEVSSU8gdWFydCByZWdpc3RlciBtYXAgKi8KK3N0cnVjdCBpb2MzX3VhcnRyZWdzIHsKKwljaGFyIGl1X2xjcjsKKwl1bmlvbiB7CisJCWNoYXIgaWlyOwkvKiByZWFkIG9ubHkgKi8KKwkJY2hhciBmY3I7CS8qIHdyaXRlIG9ubHkgKi8KKwl9IHUzOworCXVuaW9uIHsKKwkJY2hhciBpZXI7CS8qIERMQUIgPT0gMCAqLworCQljaGFyIGRsbTsJLyogRExBQiA9PSAxICovCisJfSB1MjsKKwl1bmlvbiB7CisJCWNoYXIgcmJyOwkvKiByZWFkIG9ubHksIERMQUIgPT0gMCAqLworCQljaGFyIHRocjsJLyogd3JpdGUgb25seSwgRExBQiA9PSAwICovCisJCWNoYXIgZGxsOwkvKiBETEFCID09IDEgKi8KKwl9IHUxOworCWNoYXIgaXVfc2NyOworCWNoYXIgaXVfbXNyOworCWNoYXIgaXVfbHNyOworCWNoYXIgaXVfbWNyOworfTsKKworI2RlZmluZSBpdV9yYnIgdTEucmJyCisjZGVmaW5lIGl1X3RociB1MS50aHIKKyNkZWZpbmUgaXVfZGxsIHUxLmRsbAorI2RlZmluZSBpdV9pZXIgdTIuaWVyCisjZGVmaW5lIGl1X2RsbSB1Mi5kbG0KKyNkZWZpbmUgaXVfaWlyIHUzLmlpcgorI2RlZmluZSBpdV9mY3IgdTMuZmNyCisKK3N0cnVjdCBpb2MzX3Npb3JlZ3MgeworCWNoYXIgZmlsbFsweDE3MF07CisJc3RydWN0IGlvYzNfdWFydHJlZ3MgdWFydGI7CisJc3RydWN0IGlvYzNfdWFydHJlZ3MgdWFydGE7Cit9OworCisvKiBQQ0kgSU8vbWVtIHNwYWNlIHJlZ2lzdGVyIG1hcCAqLworc3RydWN0IGlvYzMgeworCXVpbnQzMl90IHBjaV9pZDsKKwl1aW50MzJfdCBwY2lfc2NyOworCXVpbnQzMl90IHBjaV9yZXY7CisJdWludDMyX3QgcGNpX2xhdDsKKwl1aW50MzJfdCBwY2lfYWRkcjsKKwl1aW50MzJfdCBwY2lfZXJyX2FkZHJfbDsKKwl1aW50MzJfdCBwY2lfZXJyX2FkZHJfaDsKKworCXVpbnQzMl90IHNpb19pcjsKKwkvKiB0aGVzZSByZWdpc3RlcnMgYXJlIHJlYWQtb25seSBmb3IgZ2VuZXJhbCBrZXJuZWwgY29kZS4gVG8KKwkgKiBtb2RpZnkgdGhlbSB1c2UgdGhlIGZ1bmN0aW9ucyBpbiBpb2MzLmMKKwkgKi8KKwl1aW50MzJfdCBzaW9faWVzOworCXVpbnQzMl90IHNpb19pZWM7CisJdWludDMyX3Qgc2lvX2NyOworCXVpbnQzMl90IGludF9vdXQ7CisJdWludDMyX3QgbWNyOworCXVpbnQzMl90IGdwY3JfczsKKwl1aW50MzJfdCBncGNyX2M7CisJdWludDMyX3QgZ3BkcjsKKwl1aW50MzJfdCBncHByWzldOworCWNoYXIgZmlsbFsweDRjXTsKKworCS8qIHNlcmlhbCBwb3J0IHJlZ2lzdGVycyAqLworCXVpbnQzMl90IHNiYnJfaDsKKwl1aW50MzJfdCBzYmJyX2w7CisKKwlzdHJ1Y3QgaW9jM19zZXJpYWxyZWdzIHBvcnRfYTsKKwlzdHJ1Y3QgaW9jM19zZXJpYWxyZWdzIHBvcnRfYjsKKwljaGFyIGZpbGwxWzB4MWZmMTBdOworCS8qIHN1cGVyaW8gcmVnaXN0ZXJzICovCisJc3RydWN0IGlvYzNfc2lvcmVncyBzcmVnczsKK307CisKKy8qIFRoZXNlIGRvbid0IGV4aXN0IG9uIHRoZSBpb2MzIHNlcmlhbCBjYXJkLi4uICovCisjZGVmaW5lIGVpZXIJZmlsbDFbOF0KKyNkZWZpbmUgZWlzcglmaWxsMVs0XQorCisjZGVmaW5lIFBDSV9MQVQJCQkweGMJLyogTGF0ZW5jeSBUaW1lciAqLworI2RlZmluZSBQQ0lfU0NSX0RST1BfTU9ERV9FTgkweDAwMDA4MDAwIC8qIGRyb3AgcGlvcyBvbiBwYXJpdHkgZXJyICovCisjZGVmaW5lIFVBUlRBX0JBU0UJCTB4MTc4CisjZGVmaW5lIFVBUlRCX0JBU0UJCTB4MTcwCisKKworLyogYml0bWFza3MgZm9yIHNlcmlhbCBSWCBzdGF0dXMgYnl0ZSAqLworI2RlZmluZSBSWFNCX09WRVJSVU4JCTB4MDEJLyogY2hhcihzKSBsb3N0ICovCisjZGVmaW5lIFJYU0JfUEFSX0VSUgkJMHgwMgkvKiBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgUlhTQl9GUkFNRV9FUlIJCTB4MDQJLyogZnJhbWluZyBlcnJvciAqLworI2RlZmluZSBSWFNCX0JSRUFLCQkweDA4CS8qIGJyZWFrIGNoYXJhY3RlciAqLworI2RlZmluZSBSWFNCX0NUUwkJMHgxMAkvKiBzdGF0ZSBvZiBDVFMgKi8KKyNkZWZpbmUgUlhTQl9EQ0QJCTB4MjAJLyogc3RhdGUgb2YgRENEICovCisjZGVmaW5lIFJYU0JfTU9ERU1fVkFMSUQJMHg0MAkvKiBEQ0QsIENUUyBhbmQgT1ZFUlJVTiBhcmUgdmFsaWQgKi8KKyNkZWZpbmUgUlhTQl9EQVRBX1ZBTElECQkweDgwCS8qIEZSQU1FX0VSUiBQQVJfRVJSICYgQlJFQUsgdmFsaWQgKi8KKworLyogYml0bWFza3MgZm9yIHNlcmlhbCBUWCBjb250cm9sIGJ5dGUgKi8KKyNkZWZpbmUgVFhDQl9JTlRfV0hFTl9ET05FCTB4MjAJLyogaW50ZXJydXB0IGFmdGVyIHRoaXMgYnl0ZSBpcyBzZW50ICovCisjZGVmaW5lIFRYQ0JfSU5WQUxJRAkJMHgwMAkvKiBieXRlIGlzIGludmFsaWQgKi8KKyNkZWZpbmUgVFhDQl9WQUxJRAkJMHg0MAkvKiBieXRlIGlzIHZhbGlkICovCisjZGVmaW5lIFRYQ0JfTUNSCQkweDgwCS8qIGRhdGE8NzowPiB0byBtb2RlbSBjbnRybCByZWdpc3RlciAqLworI2RlZmluZSBUWENCX0RFTEFZCQkweGMwCS8qIGRlbGF5IGRhdGE8NzowPiBtU2VjICovCisKKy8qIGJpdG1hc2tzIGZvciBTQkJSX0wgKi8KKyNkZWZpbmUgU0JCUl9MX1NJWkUJCTB4MDAwMDAwMDEJLyogMCAxS0IgcmluZ3MsIDEgNEtCIHJpbmdzICovCisKKy8qIGJpdG1hc2tzIGZvciBTU0NSXzxBOkI+ICovCisjZGVmaW5lIFNTQ1JfUlhfVEhSRVNIT0xECTB4MDAwMDAxZmYJLyogaGl3YXRlciBtYXJrICovCisjZGVmaW5lIFNTQ1JfVFhfVElNRVJfQlVTWQkweDAwMDEwMDAwCS8qIFRYIHRpbWVyIGluIHByb2dyZXNzICovCisjZGVmaW5lIFNTQ1JfSEZDX0VOCQkweDAwMDIwMDAwCS8qIGgvdyBmbG93IGNudHJsIGVuYWJsZWQgKi8KKyNkZWZpbmUgU1NDUl9SWF9SSU5HX0RDRAkweDAwMDQwMDAwCS8qIHBvc3RSWCByZWNvcmQgb24gZGVsdGEtRENEICovCisjZGVmaW5lIFNTQ1JfUlhfUklOR19DVFMJMHgwMDA4MDAwMAkvKiBwb3N0UlggcmVjb3JkIG9uIGRlbHRhLUNUUyAqLworI2RlZmluZSBTU0NSX0hJR0hfU1BECQkweDAwMTAwMDAwCS8qIDRYIHNwZWVkICovCisjZGVmaW5lIFNTQ1JfRElBRwkJMHgwMDIwMDAwMAkvKiBieXBhc3MgY2xvY2sgZGl2aWRlciAqLworI2RlZmluZSBTU0NSX1JYX0RSQUlOCQkweDA4MDAwMDAwCS8qIGRyYWluIFJYIGJ1ZmZlciB0byBtZW1vcnkgKi8KKyNkZWZpbmUgU1NDUl9ETUFfRU4JCTB4MTAwMDAwMDAJLyogZW5hYmxlIHJpbmcgYnVmZmVyIERNQSAqLworI2RlZmluZSBTU0NSX0RNQV9QQVVTRQkJMHgyMDAwMDAwMAkvKiBwYXVzZSBETUEgKi8KKyNkZWZpbmUgU1NDUl9QQVVTRV9TVEFURQkweDQwMDAwMDAwCS8qIHNldCB3aGVuIFBBVVNFIHRha2VzIGVmZmVjdCovCisjZGVmaW5lIFNTQ1JfUkVTRVQJCTB4ODAwMDAwMDAJLyogcmVzZXQgRE1BIGNoYW5uZWxzICovCisKKy8qIGFsbCBwcm9kdWNlci9jb21zdW1lciBwb2ludGVycyBhcmUgdGhlIHNhbWUgYml0ZmllbGQgKi8KKyNkZWZpbmUgUFJPRF9DT05TX1BUUl80SwkweDAwMDAwZmY4CS8qIGZvciA0SyBidWZmZXJzICovCisjZGVmaW5lIFBST0RfQ09OU19QVFJfMUsJMHgwMDAwMDNmOAkvKiBmb3IgMUsgYnVmZmVycyAqLworI2RlZmluZSBQUk9EX0NPTlNfUFRSX09GRgkzCisKKy8qIGJpdG1hc2tzIGZvciBTUkNJUl88QTpCPiAqLworI2RlZmluZSBTUkNJUl9BUk0JCTB4ODAwMDAwMDAJLyogYXJtIFJYIHRpbWVyICovCisKKy8qIGJpdG1hc2tzIGZvciBTSEFET1dfPEE6Qj4gKi8KKyNkZWZpbmUgU0hBRE9XX0RSCQkweDAwMDAwMDAxCS8qIGRhdGEgcmVhZHkgKi8KKyNkZWZpbmUgU0hBRE9XX09FCQkweDAwMDAwMDAyCS8qIG92ZXJydW4gZXJyb3IgKi8KKyNkZWZpbmUgU0hBRE9XX1BFCQkweDAwMDAwMDA0CS8qIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBTSEFET1dfRkUJCTB4MDAwMDAwMDgJLyogZnJhbWluZyBlcnJvciAqLworI2RlZmluZSBTSEFET1dfQkkJCTB4MDAwMDAwMTAJLyogYnJlYWsgaW50ZXJydXB0ICovCisjZGVmaW5lIFNIQURPV19USFJFCQkweDAwMDAwMDIwCS8qIHRyYW5zbWl0IGhvbGRpbmcgcmVnIGVtcHR5ICovCisjZGVmaW5lIFNIQURPV19URU1UCQkweDAwMDAwMDQwCS8qIHRyYW5zbWl0IHNoaWZ0IHJlZyBlbXB0eSAqLworI2RlZmluZSBTSEFET1dfUkZDRQkJMHgwMDAwMDA4MAkvKiBjaGFyIGluIFJYIGZpZm8gaGFzIGVycm9yICovCisjZGVmaW5lIFNIQURPV19EQ1RTCQkweDAwMDEwMDAwCS8qIGRlbHRhIGNsZWFyIHRvIHNlbmQgKi8KKyNkZWZpbmUgU0hBRE9XX0REQ0QJCTB4MDAwODAwMDAJLyogZGVsdGEgZGF0YSBjYXJyaWVyIGRldGVjdCAqLworI2RlZmluZSBTSEFET1dfQ1RTCQkweDAwMTAwMDAwCS8qIGNsZWFyIHRvIHNlbmQgKi8KKyNkZWZpbmUgU0hBRE9XX0RDRAkJMHgwMDgwMDAwMAkvKiBkYXRhIGNhcnJpZXIgZGV0ZWN0ICovCisjZGVmaW5lIFNIQURPV19EVFIJCTB4MDEwMDAwMDAJLyogZGF0YSB0ZXJtaW5hbCByZWFkeSAqLworI2RlZmluZSBTSEFET1dfUlRTCQkweDAyMDAwMDAwCS8qIHJlcXVlc3QgdG8gc2VuZCAqLworI2RlZmluZSBTSEFET1dfT1VUMQkJMHgwNDAwMDAwMAkvKiAxNjU1MCBPVVQxIGJpdCAqLworI2RlZmluZSBTSEFET1dfT1VUMgkJMHgwODAwMDAwMAkvKiAxNjU1MCBPVVQyIGJpdCAqLworI2RlZmluZSBTSEFET1dfTE9PUAkJMHgxMDAwMDAwMAkvKiBsb29wYmFjayBlbmFibGVkICovCisKKy8qIGJpdG1hc2tzIGZvciBTUlRSXzxBOkI+ICovCisjZGVmaW5lIFNSVFJfQ05UCQkweDAwMDAwZmZmCS8qIHJlbG9hZCB2YWx1ZSBmb3IgUlggdGltZXIgKi8KKyNkZWZpbmUgU1JUUl9DTlRfVkFMCQkweDBmZmYwMDAwCS8qIGN1cnJlbnQgdmFsdWUgb2YgUlggdGltZXIgKi8KKyNkZWZpbmUgU1JUUl9DTlRfVkFMX1NISUZUCTE2CisjZGVmaW5lIFNSVFJfSFoJCQkxNjAwMAkJLyogU1JUUiBjbG9jayBmcmVxdWVuY3kgKi8KKworLyogYml0bWFza3MgZm9yIFNJT19JUiwgU0lPX0lFQyBhbmQgU0lPX0lFUyAgKi8KKyNkZWZpbmUgU0lPX0lSX1NBX1RYX01UCQkweDAwMDAwMDAxCS8qIFNlcmlhbCBwb3J0IEEgVFggZW1wdHkgKi8KKyNkZWZpbmUgU0lPX0lSX1NBX1JYX0ZVTEwJMHgwMDAwMDAwMgkvKiBwb3J0IEEgUlggYnVmIGZ1bGwgKi8KKyNkZWZpbmUgU0lPX0lSX1NBX1JYX0hJR0gJMHgwMDAwMDAwNAkvKiBwb3J0IEEgUlggaGl3YXQgKi8KKyNkZWZpbmUgU0lPX0lSX1NBX1JYX1RJTUVSCTB4MDAwMDAwMDgJLyogcG9ydCBBIFJYIHRpbWVvdXQgKi8KKyNkZWZpbmUgU0lPX0lSX1NBX0RFTFRBX0RDRAkweDAwMDAwMDEwCS8qIHBvcnQgQSBkZWx0YSBEQ0QgKi8KKyNkZWZpbmUgU0lPX0lSX1NBX0RFTFRBX0NUUwkweDAwMDAwMDIwCS8qIHBvcnQgQSBkZWx0YSBDVFMgKi8KKyNkZWZpbmUgU0lPX0lSX1NBX0lOVAkJMHgwMDAwMDA0MAkvKiBwb3J0IEEgcGFzcy10aHJ1IGludHIgKi8KKyNkZWZpbmUgU0lPX0lSX1NBX1RYX0VYUExJQ0lUCTB4MDAwMDAwODAJLyogcG9ydCBBIGV4cGxpY2l0IFRYIHRocnUgKi8KKyNkZWZpbmUgU0lPX0lSX1NBX01FTUVSUgkweDAwMDAwMTAwCS8qIHBvcnQgQSBQQ0kgZXJyb3IgKi8KKyNkZWZpbmUgU0lPX0lSX1NCX1RYX01UCQkweDAwMDAwMjAwCisjZGVmaW5lIFNJT19JUl9TQl9SWF9GVUxMCTB4MDAwMDA0MDAKKyNkZWZpbmUgU0lPX0lSX1NCX1JYX0hJR0gJMHgwMDAwMDgwMAorI2RlZmluZSBTSU9fSVJfU0JfUlhfVElNRVIJMHgwMDAwMTAwMAorI2RlZmluZSBTSU9fSVJfU0JfREVMVEFfRENECTB4MDAwMDIwMDAKKyNkZWZpbmUgU0lPX0lSX1NCX0RFTFRBX0NUUwkweDAwMDA0MDAwCisjZGVmaW5lIFNJT19JUl9TQl9JTlQJCTB4MDAwMDgwMDAKKyNkZWZpbmUgU0lPX0lSX1NCX1RYX0VYUExJQ0lUCTB4MDAwMTAwMDAKKyNkZWZpbmUgU0lPX0lSX1NCX01FTUVSUgkweDAwMDIwMDAwCisjZGVmaW5lIFNJT19JUl9QUF9JTlQJCTB4MDAwNDAwMDAJLyogUCBwb3J0IHBhc3MtdGhydSBpbnRyICovCisjZGVmaW5lIFNJT19JUl9QUF9JTlRBCQkweDAwMDgwMDAwCS8qIFBQIGNvbnRleHQgQSB0aHJ1ICovCisjZGVmaW5lIFNJT19JUl9QUF9JTlRCCQkweDAwMTAwMDAwCS8qIFBQIGNvbnRleHQgQiB0aHJ1ICovCisjZGVmaW5lIFNJT19JUl9QUF9NRU1FUlIJMHgwMDIwMDAwMAkvKiBQUCBQQ0kgZXJyb3IgKi8KKyNkZWZpbmUgU0lPX0lSX0tCRF9JTlQJCTB4MDA0MDAwMDAJLyoga2JkL21vdXNlIGludHIgKi8KKyNkZWZpbmUgU0lPX0lSX1JUX0lOVAkJMHgwODAwMDAwMAkvKiBSVCBvdXRwdXQgcHVsc2UgKi8KKyNkZWZpbmUgU0lPX0lSX0dFTl9JTlQxCQkweDEwMDAwMDAwCS8qIFJUIGlucHV0IHB1bHNlICovCisjZGVmaW5lIFNJT19JUl9HRU5fSU5UX1NISUZUCTI4CisKKy8qIHBlciBkZXZpY2UgaW50ZXJydXB0IG1hc2tzICovCisjZGVmaW5lIFNJT19JUl9TQQkJKFNJT19JUl9TQV9UWF9NVCB8IFwKKwkJCQkgU0lPX0lSX1NBX1JYX0ZVTEwgfCBcCisJCQkJIFNJT19JUl9TQV9SWF9ISUdIIHwgXAorCQkJCSBTSU9fSVJfU0FfUlhfVElNRVIgfCBcCisJCQkJIFNJT19JUl9TQV9ERUxUQV9EQ0QgfCBcCisJCQkJIFNJT19JUl9TQV9ERUxUQV9DVFMgfCBcCisJCQkJIFNJT19JUl9TQV9JTlQgfCBcCisJCQkJIFNJT19JUl9TQV9UWF9FWFBMSUNJVCB8IFwKKwkJCQkgU0lPX0lSX1NBX01FTUVSUikKKworI2RlZmluZSBTSU9fSVJfU0IJCShTSU9fSVJfU0JfVFhfTVQgfCBcCisJCQkJIFNJT19JUl9TQl9SWF9GVUxMIHwgXAorCQkJCSBTSU9fSVJfU0JfUlhfSElHSCB8IFwKKwkJCQkgU0lPX0lSX1NCX1JYX1RJTUVSIHwgXAorCQkJCSBTSU9fSVJfU0JfREVMVEFfRENEIHwgXAorCQkJCSBTSU9fSVJfU0JfREVMVEFfQ1RTIHwgXAorCQkJCSBTSU9fSVJfU0JfSU5UIHwgXAorCQkJCSBTSU9fSVJfU0JfVFhfRVhQTElDSVQgfCBcCisJCQkJIFNJT19JUl9TQl9NRU1FUlIpCisKKyNkZWZpbmUgU0lPX0lSX1BQCQkoU0lPX0lSX1BQX0lOVCB8IFNJT19JUl9QUF9JTlRBIHwgXAorCQkJCSBTSU9fSVJfUFBfSU5UQiB8IFNJT19JUl9QUF9NRU1FUlIpCisjZGVmaW5lIFNJT19JUl9SVAkJKFNJT19JUl9SVF9JTlQgfCBTSU9fSVJfR0VOX0lOVDEpCisKKy8qIGJpdG1hc2tzIGZvciBTSU9fQ1IgKi8KKyNkZWZpbmUgU0lPX0NSX0NNRF9QVUxTRV9TSElGVCAxNQorI2RlZmluZSBTSU9fQ1JfU0VSX0FfQkFTRV9TSElGVCAxCisjZGVmaW5lIFNJT19DUl9TRVJfQl9CQVNFX1NISUZUIDgKKyNkZWZpbmUgU0lPX0NSX0FSQl9ESUFHCQkweDAwMzgwMDAwCS8qIGN1ciAhZW5ldCBQQ0kgcmVxdWV0IChybykgKi8KKyNkZWZpbmUgU0lPX0NSX0FSQl9ESUFHX1RYQQkweDAwMDAwMDAwCisjZGVmaW5lIFNJT19DUl9BUkJfRElBR19SWEEJMHgwMDA4MDAwMAorI2RlZmluZSBTSU9fQ1JfQVJCX0RJQUdfVFhCCTB4MDAxMDAwMDAKKyNkZWZpbmUgU0lPX0NSX0FSQl9ESUFHX1JYQgkweDAwMTgwMDAwCisjZGVmaW5lIFNJT19DUl9BUkJfRElBR19QUAkweDAwMjAwMDAwCisjZGVmaW5lIFNJT19DUl9BUkJfRElBR19JRExFCTB4MDA0MDAwMDAJLyogMCAtPiBhY3RpdmUgcmVxdWVzdCAocm8pICovCisKKy8qIGRlZnMgZm9yIHNvbWUgb2YgdGhlIGdlbmVyaWMgSS9PIHBpbnMgKi8KKyNkZWZpbmUgR1BDUl9QSFlfUkVTRVQJCTB4MjAJLyogcGluIGlzIG91dHB1dCB0byBQSFkgcmVzZXQgKi8KKyNkZWZpbmUgR1BDUl9VQVJUQl9NT0RFU0VMCTB4NDAJLyogcGluIGlzIG91dHB1dCB0byBwb3J0IEIgbW9kZSBzZWwgKi8KKyNkZWZpbmUgR1BDUl9VQVJUQV9NT0RFU0VMCTB4ODAJLyogcGluIGlzIG91dHB1dCB0byBwb3J0IEEgbW9kZSBzZWwgKi8KKworI2RlZmluZSBHUFBSX1BIWV9SRVNFVF9QSU4JNQkvKiBHSU8gcGluIGNvbnRyb2xsaW5nIHBoeSByZXNldCAqLworI2RlZmluZSBHUFBSX1VBUlRCX01PREVTRUxfUElOCTYJLyogR0lPIHBpbiBjbnRybGluZyB1YXJ0YiBtb2Rlc2VsZWN0ICovCisjZGVmaW5lIEdQUFJfVUFSVEFfTU9ERVNFTF9QSU4JNwkvKiBHSU8gcGluIGNudHJsaW5nIHVhcnRhIG1vZGVzZWxlY3QgKi8KKworI2VuZGlmIC8qIElBNjRfU05fSU9DM19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWJyX3Byb3ZpZGVyLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWJyX3Byb3ZpZGVyLmgKaW5kZXggMmI0MmQ5ZS4uOTMzNDA3OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi9wY2licl9wcm92aWRlci5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vcGNpYnJfcHJvdmlkZXIuaApAQCAtNDQsOSArNDQsOSBAQAogI2RlZmluZSBQQ0kzMl9NQVBQRURfQkFTRSAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKICNkZWZpbmUgUENJMzJfRElSRUNUX0JBU0UgICAgICAgICAgICAgICAweDgwMDAwMDAwCiAKLSNkZWZpbmUgSVNfUENJMzJfTUFQUEVEKHgpICAgICAgICAgICAgICAoKHVpbnQ2NF90KSh4KSA8IFBDSTMyX0RJUkVDVF9CQVNFICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KSh4KSA+PSBQQ0kzMl9NQVBQRURfQkFTRSkKLSNkZWZpbmUgSVNfUENJMzJfRElSRUNUKHgpICAgICAgICAgICAgICAoKHVpbnQ2NF90KSh4KSA+PSBQQ0kzMl9NQVBQRURfQkFTRSkKKyNkZWZpbmUgSVNfUENJMzJfTUFQUEVEKHgpICAgICAgICAgICAgICAoKHU2NCkoeCkgPCBQQ0kzMl9ESVJFQ1RfQkFTRSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1NjQpKHgpID49IFBDSTMyX01BUFBFRF9CQVNFKQorI2RlZmluZSBJU19QQ0kzMl9ESVJFQ1QoeCkgICAgICAgICAgICAgICgodTY0KSh4KSA+PSBQQ0kzMl9NQVBQRURfQkFTRSkKIAogCiAvKgpAQCAtNjMsNyArNjMsNyBAQAogCShJT1BHKElPUEdPRkYoYWRkcikgKyAoc2l6ZSkgLSAxKSA9PSBJT1BHKChzaXplKSAtIDEpKQogCiAjZGVmaW5lIE1JTklNQUxfQVRFX0ZMQUcoYWRkciwgc2l6ZSkgXAotCShNSU5JTUFMX0FURVNfUkVRVUlSRUQoKHVpbnQ2NF90KWFkZHIsIHNpemUpID8gMSA6IDApCisJKE1JTklNQUxfQVRFU19SRVFVSVJFRCgodTY0KWFkZHIsIHNpemUpID8gMSA6IDApCiAKIC8qIGJpdCAyOSBvZiB0aGUgcGNpIGFkZHJlc3MgaXMgdGhlIFNXQVAgYml0ICovCiAjZGVmaW5lIEFURV9TV0FQU0hJRlQgICAgICAgICAgICAgICAgICAgMjkKQEAgLTkwLDI3ICs5MCwyNyBAQAogICogUE1VIHJlc291cmNlcy4KICAqLwogc3RydWN0IGF0ZV9yZXNvdXJjZXsKLQl1aW50NjRfdCAqYXRlOwotCXVpbnQ2NF90IG51bV9hdGU7Ci0JdWludDY0X3QgbG93ZXN0X2ZyZWVfaW5kZXg7CisJdTY0ICphdGU7CisJdTY0IG51bV9hdGU7CisJdTY0IGxvd2VzdF9mcmVlX2luZGV4OwogfTsKIAogc3RydWN0IHBjaWJ1c19pbmZvIHsKIAlzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQJcGJpX2J1c2NvbW1vbjsgICAvKiBjb21tb24gaGVhZGVyICovCi0JdWludDMyX3QgICAgICAgICAgICAgICAgcGJpX21vZHVsZWlkOworCXUzMiAgICAgICAgICAgICAgICBwYmlfbW9kdWxlaWQ7CiAJc2hvcnQgICAgICAgICAgICAgICAgICAgcGJpX2JyaWRnZV90eXBlOwogCXNob3J0ICAgICAgICAgICAgICAgICAgIHBiaV9icmlkZ2VfbW9kZTsKIAogCXN0cnVjdCBhdGVfcmVzb3VyY2UgICAgIHBiaV9pbnRfYXRlX3Jlc291cmNlOwotCXVpbnQ2NF90ICAgICAgICAgICAgICAgIHBiaV9pbnRfYXRlX3NpemU7CisJdTY0ICAgICAgICAgICAgICAgIHBiaV9pbnRfYXRlX3NpemU7CiAKLQl1aW50NjRfdCAgICAgICAgICAgICAgICBwYmlfZGlyX3hiYXNlOworCXU2NCAgICAgICAgICAgICAgICBwYmlfZGlyX3hiYXNlOwogCWNoYXIgICAgICAgICAgICAgICAgICAgIHBiaV9odWJfeGlkOwogCi0JdWludDY0X3QgICAgICAgICAgICAgICAgcGJpX2RldnJlZ1s4XTsKKwl1NjQgICAgICAgICAgICAgICAgcGJpX2RldnJlZ1s4XTsKIAotCXVpbnQzMl90CQlwYmlfdmFsaWRfZGV2aWNlczsKLQl1aW50MzJfdAkJcGJpX2VuYWJsZWRfZGV2aWNlczsKKwl1MzIJCXBiaV92YWxpZF9kZXZpY2VzOworCXUzMgkJcGJpX2VuYWJsZWRfZGV2aWNlczsKIAogCXNwaW5sb2NrX3QgICAgICAgICAgICAgIHBiaV9sb2NrOwogfTsKQEAgLTEzNiwyMiArMTM2LDIyIEBACiAvKgogICogcHJvdG90eXBlcyBmb3IgdGhlIGJyaWRnZSBhc2ljIHJlZ2lzdGVyIGFjY2VzcyByb3V0aW5lcyBpbiBwY2licl9yZWcuYwogICovCi1leHRlcm4gdm9pZCAgICAgICAgICAgICBwY2lyZWdfY29udHJvbF9iaXRfY2xyKHN0cnVjdCBwY2lidXNfaW5mbyAqLCB1aW50NjRfdCk7Ci1leHRlcm4gdm9pZCAgICAgICAgICAgICBwY2lyZWdfY29udHJvbF9iaXRfc2V0KHN0cnVjdCBwY2lidXNfaW5mbyAqLCB1aW50NjRfdCk7Ci1leHRlcm4gdWludDY0X3QgICAgICAgICBwY2lyZWdfdGZsdXNoX2dldChzdHJ1Y3QgcGNpYnVzX2luZm8gKik7Ci1leHRlcm4gdWludDY0X3QgICAgICAgICBwY2lyZWdfaW50cl9zdGF0dXNfZ2V0KHN0cnVjdCBwY2lidXNfaW5mbyAqKTsKLWV4dGVybiB2b2lkICAgICAgICAgICAgIHBjaXJlZ19pbnRyX2VuYWJsZV9iaXRfY2xyKHN0cnVjdCBwY2lidXNfaW5mbyAqLCB1aW50NjRfdCk7Ci1leHRlcm4gdm9pZCAgICAgICAgICAgICBwY2lyZWdfaW50cl9lbmFibGVfYml0X3NldChzdHJ1Y3QgcGNpYnVzX2luZm8gKiwgdWludDY0X3QpOwotZXh0ZXJuIHZvaWQgICAgICAgICAgICAgcGNpcmVnX2ludHJfYWRkcl9hZGRyX3NldChzdHJ1Y3QgcGNpYnVzX2luZm8gKiwgaW50LCB1aW50NjRfdCk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICBwY2lyZWdfY29udHJvbF9iaXRfY2xyKHN0cnVjdCBwY2lidXNfaW5mbyAqLCB1NjQpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgcGNpcmVnX2NvbnRyb2xfYml0X3NldChzdHJ1Y3QgcGNpYnVzX2luZm8gKiwgdTY0KTsKK2V4dGVybiB1NjQgICAgICAgICBwY2lyZWdfdGZsdXNoX2dldChzdHJ1Y3QgcGNpYnVzX2luZm8gKik7CitleHRlcm4gdTY0ICAgICAgICAgcGNpcmVnX2ludHJfc3RhdHVzX2dldChzdHJ1Y3QgcGNpYnVzX2luZm8gKik7CitleHRlcm4gdm9pZCAgICAgICAgICAgICBwY2lyZWdfaW50cl9lbmFibGVfYml0X2NscihzdHJ1Y3QgcGNpYnVzX2luZm8gKiwgdTY0KTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHBjaXJlZ19pbnRyX2VuYWJsZV9iaXRfc2V0KHN0cnVjdCBwY2lidXNfaW5mbyAqLCB1NjQpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgcGNpcmVnX2ludHJfYWRkcl9hZGRyX3NldChzdHJ1Y3QgcGNpYnVzX2luZm8gKiwgaW50LCB1NjQpOwogZXh0ZXJuIHZvaWQgICAgICAgICAgICAgcGNpcmVnX2ZvcmNlX2ludHJfc2V0KHN0cnVjdCBwY2lidXNfaW5mbyAqLCBpbnQpOwotZXh0ZXJuIHVpbnQ2NF90ICAgICAgICAgcGNpcmVnX3dyYl9mbHVzaF9nZXQoc3RydWN0IHBjaWJ1c19pbmZvICosIGludCk7Ci1leHRlcm4gdm9pZCAgICAgICAgICAgICBwY2lyZWdfaW50X2F0ZV9zZXQoc3RydWN0IHBjaWJ1c19pbmZvICosIGludCwgdWludDY0X3QpOwotZXh0ZXJuIHVpbnQ2NF90ICoJcGNpcmVnX2ludF9hdGVfYWRkcihzdHJ1Y3QgcGNpYnVzX2luZm8gKiwgaW50KTsKK2V4dGVybiB1NjQgICAgICAgICBwY2lyZWdfd3JiX2ZsdXNoX2dldChzdHJ1Y3QgcGNpYnVzX2luZm8gKiwgaW50KTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHBjaXJlZ19pbnRfYXRlX3NldChzdHJ1Y3QgcGNpYnVzX2luZm8gKiwgaW50LCB1NjQpOworZXh0ZXJuIHU2NCAqCXBjaXJlZ19pbnRfYXRlX2FkZHIoc3RydWN0IHBjaWJ1c19pbmZvICosIGludCk7CiBleHRlcm4gdm9pZCAJCXBjaWJyX2ZvcmNlX2ludGVycnVwdChzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX2lycV9pbmZvKTsKIGV4dGVybiB2b2lkIAkJcGNpYnJfY2hhbmdlX2RldmljZXNfaXJxKHN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm8pOwogZXh0ZXJuIGludCAJCXBjaWJyX2F0ZV9hbGxvYyhzdHJ1Y3QgcGNpYnVzX2luZm8gKiwgaW50KTsKIGV4dGVybiB2b2lkIAkJcGNpYnJfYXRlX2ZyZWUoc3RydWN0IHBjaWJ1c19pbmZvICosIGludCk7Ci1leHRlcm4gdm9pZCAJCWF0ZV93cml0ZShzdHJ1Y3QgcGNpYnVzX2luZm8gKiwgaW50LCBpbnQsIHVpbnQ2NF90KTsKK2V4dGVybiB2b2lkIAkJYXRlX3dyaXRlKHN0cnVjdCBwY2lidXNfaW5mbyAqLCBpbnQsIGludCwgdTY0KTsKIGV4dGVybiBpbnQgc2FsX3BjaWJyX3Nsb3RfZW5hYmxlKHN0cnVjdCBwY2lidXNfaW5mbyAqc29mdCwgaW50IGRldmljZSwKIAkJCQkgdm9pZCAqcmVzcCk7CiBleHRlcm4gaW50IHNhbF9wY2licl9zbG90X2Rpc2FibGUoc3RydWN0IHBjaWJ1c19pbmZvICpzb2Z0LCBpbnQgZGV2aWNlLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9wY2lidXNfcHJvdmlkZXJfZGVmcy5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi9wY2lidXNfcHJvdmlkZXJfZGVmcy5oCmluZGV4IGFkMGU4ZTguLmNlM2Y2YzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vcGNpYnVzX3Byb3ZpZGVyX2RlZnMuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWJ1c19wcm92aWRlcl9kZWZzLmgKQEAgLTI5LDEzICsyOSwxMyBAQAogICovCiAKIHN0cnVjdCBwY2lidXNfYnVzc29mdCB7Ci0JdWludDMyX3QJCWJzX2FzaWNfdHlwZTsJLyogY2hpcHNldCB0eXBlICovCi0JdWludDMyX3QJCWJzX3hpZDsJCS8qIHh3aWRnZXQgaWQgKi8KLQl1aW50MzJfdAkJYnNfcGVyc2lzdF9idXNudW07IC8qIFBlcnNpc3RlbnQgQnVzIE51bWJlciAqLwotCXVpbnQzMl90CQlic19wZXJzaXN0X3NlZ21lbnQ7IC8qIFNlZ21lbnQgTnVtYmVyICovCi0JdWludDY0X3QJCWJzX2xlZ2FjeV9pbzsJLyogbGVnYWN5IGlvIHBpbyBhZGRyICovCi0JdWludDY0X3QJCWJzX2xlZ2FjeV9tZW07CS8qIGxlZ2FjeSBtZW0gcGlvIGFkZHIgKi8KLQl1aW50NjRfdAkJYnNfYmFzZTsJLyogd2lkZ2V0IGJhc2UgKi8KKwl1MzIJCWJzX2FzaWNfdHlwZTsJLyogY2hpcHNldCB0eXBlICovCisJdTMyCQlic194aWQ7CQkvKiB4d2lkZ2V0IGlkICovCisJdTMyCQlic19wZXJzaXN0X2J1c251bTsgLyogUGVyc2lzdGVudCBCdXMgTnVtYmVyICovCisJdTMyCQlic19wZXJzaXN0X3NlZ21lbnQ7IC8qIFNlZ21lbnQgTnVtYmVyICovCisJdTY0CQlic19sZWdhY3lfaW87CS8qIGxlZ2FjeSBpbyBwaW8gYWRkciAqLworCXU2NAkJYnNfbGVnYWN5X21lbTsJLyogbGVnYWN5IG1lbSBwaW8gYWRkciAqLworCXU2NAkJYnNfYmFzZTsJLyogd2lkZ2V0IGJhc2UgKi8KIAlzdHJ1Y3QgeHdpZGdldF9pbmZvCSpic194d2lkZ2V0X2luZm87CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWRldi5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi9wY2lkZXYuaAppbmRleCBmNjVkMjIyLi4zOGNkZmZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWRldi5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vcGNpZGV2LmgKQEAgLTU1LDggKzU1LDggQEAKICNkZWZpbmUgUENJSU9fVkVORE9SX0lEX05PTkUJKC0xKQogCiBzdHJ1Y3QgcGNpZGV2X2luZm8gewotCXVpbnQ2NF90CQlwZGlfcGlvX21hcHBlZF9hZGRyWzddOyAvKiA2IEJBUnMgUExVUyAxIFJPTSAqLwotCXVpbnQ2NF90CQlwZGlfc2xvdF9ob3N0X2hhbmRsZTsJLyogQnVzIGFuZCBkZXZmbiBIb3N0IHBjaV9kZXYgKi8KKwl1NjQJCXBkaV9waW9fbWFwcGVkX2FkZHJbN107IC8qIDYgQkFScyBQTFVTIDEgUk9NICovCisJdTY0CQlwZGlfc2xvdF9ob3N0X2hhbmRsZTsJLyogQnVzIGFuZCBkZXZmbiBIb3N0IHBjaV9kZXYgKi8KIAogCXN0cnVjdCBwY2lidXNfYnVzc29mdAkqcGRpX3BjaWJ1c19pbmZvOwkvKiBLZXJuZWwgY29tbW9uIGJ1cyBzb2Z0ICovCiAJc3RydWN0IHBjaWRldl9pbmZvCSpwZGlfaG9zdF9wY2lkZXZfaW5mbzsJLyogS2VybmVsIEhvc3QgcGNpX2RldiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9waWMuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vcGljLmgKaW5kZXggMGRlODJlNi4uNWY5ZGE1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi9waWMuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3BpYy5oCkBAIC03NCwxMjAgKzc0LDEyMCBAQAogICAgIC8qIDB4MDAwMDAwLTB4MDBGRkZGIC0tIExvY2FsIFJlZ2lzdGVycyAqLwogCiAgICAgLyogMHgwMDAwMDAtMHgwMDAwNTcgLS0gU3RhbmRhcmQgV2lkZ2V0IENvbmZpZ3VyYXRpb24gKi8KLSAgICB1aW50NjRfdAkJcF93aWRfaWQ7CQkJLyogMHgwMDAwMDAgKi8KLSAgICB1aW50NjRfdAkJcF93aWRfc3RhdDsJCQkvKiAweDAwMDAwOCAqLwotICAgIHVpbnQ2NF90CQlwX3dpZF9lcnJfdXBwZXI7CQkvKiAweDAwMDAxMCAqLwotICAgIHVpbnQ2NF90CQlwX3dpZF9lcnJfbG93ZXI7CQkvKiAweDAwMDAxOCAqLworICAgIHU2NAkJcF93aWRfaWQ7CQkJLyogMHgwMDAwMDAgKi8KKyAgICB1NjQJCXBfd2lkX3N0YXQ7CQkJLyogMHgwMDAwMDggKi8KKyAgICB1NjQJCXBfd2lkX2Vycl91cHBlcjsJCS8qIDB4MDAwMDEwICovCisgICAgdTY0CQlwX3dpZF9lcnJfbG93ZXI7CQkvKiAweDAwMDAxOCAqLwogICAgICNkZWZpbmUgcF93aWRfZXJyIHBfd2lkX2Vycl9sb3dlcgotICAgIHVpbnQ2NF90CQlwX3dpZF9jb250cm9sOwkJCS8qIDB4MDAwMDIwICovCi0gICAgdWludDY0X3QJCXBfd2lkX3JlcV90aW1lb3V0OwkJLyogMHgwMDAwMjggKi8KLSAgICB1aW50NjRfdAkJcF93aWRfaW50X3VwcGVyOwkJLyogMHgwMDAwMzAgKi8KLSAgICB1aW50NjRfdAkJcF93aWRfaW50X2xvd2VyOwkJLyogMHgwMDAwMzggKi8KKyAgICB1NjQJCXBfd2lkX2NvbnRyb2w7CQkJLyogMHgwMDAwMjAgKi8KKyAgICB1NjQJCXBfd2lkX3JlcV90aW1lb3V0OwkJLyogMHgwMDAwMjggKi8KKyAgICB1NjQJCXBfd2lkX2ludF91cHBlcjsJCS8qIDB4MDAwMDMwICovCisgICAgdTY0CQlwX3dpZF9pbnRfbG93ZXI7CQkvKiAweDAwMDAzOCAqLwogICAgICNkZWZpbmUgcF93aWRfaW50IHBfd2lkX2ludF9sb3dlcgotICAgIHVpbnQ2NF90CQlwX3dpZF9lcnJfY21kd29yZDsJCS8qIDB4MDAwMDQwICovCi0gICAgdWludDY0X3QJCXBfd2lkX2xscDsJCQkvKiAweDAwMDA0OCAqLwotICAgIHVpbnQ2NF90CQlwX3dpZF90Zmx1c2g7CQkJLyogMHgwMDAwNTAgKi8KKyAgICB1NjQJCXBfd2lkX2Vycl9jbWR3b3JkOwkJLyogMHgwMDAwNDAgKi8KKyAgICB1NjQJCXBfd2lkX2xscDsJCQkvKiAweDAwMDA0OCAqLworICAgIHU2NAkJcF93aWRfdGZsdXNoOwkJCS8qIDB4MDAwMDUwICovCiAKICAgICAvKiAweDAwMDA1OC0weDAwMDA3RiAtLSBCcmlkZ2Utc3BlY2lmaWMgV2lkZ2V0IENvbmZpZ3VyYXRpb24gKi8KLSAgICB1aW50NjRfdAkJcF93aWRfYXV4X2VycjsJCQkvKiAweDAwMDA1OCAqLwotICAgIHVpbnQ2NF90CQlwX3dpZF9yZXNwX3VwcGVyOwkJLyogMHgwMDAwNjAgKi8KLSAgICB1aW50NjRfdAkJcF93aWRfcmVzcF9sb3dlcjsJCS8qIDB4MDAwMDY4ICovCisgICAgdTY0CQlwX3dpZF9hdXhfZXJyOwkJCS8qIDB4MDAwMDU4ICovCisgICAgdTY0CQlwX3dpZF9yZXNwX3VwcGVyOwkJLyogMHgwMDAwNjAgKi8KKyAgICB1NjQJCXBfd2lkX3Jlc3BfbG93ZXI7CQkvKiAweDAwMDA2OCAqLwogICAgICNkZWZpbmUgcF93aWRfcmVzcCBwX3dpZF9yZXNwX2xvd2VyCi0gICAgdWludDY0X3QJCXBfd2lkX3RzdF9waW5fY3RybDsJCS8qIDB4MDAwMDcwICovCi0gICAgdWludDY0X3QJCXBfd2lkX2FkZHJfbGtlcnI7CQkvKiAweDAwMDA3OCAqLworICAgIHU2NAkJcF93aWRfdHN0X3Bpbl9jdHJsOwkJLyogMHgwMDAwNzAgKi8KKyAgICB1NjQJCXBfd2lkX2FkZHJfbGtlcnI7CQkvKiAweDAwMDA3OCAqLwogCiAgICAgLyogMHgwMDAwODAtMHgwMDAwOEYgLS0gUE1VICYgTUFQICovCi0gICAgdWludDY0X3QJCXBfZGlyX21hcDsJCQkvKiAweDAwMDA4MCAqLwotICAgIHVpbnQ2NF90CQlfcGFkXzAwMDA4ODsJCQkvKiAweDAwMDA4OCAqLworICAgIHU2NAkJcF9kaXJfbWFwOwkJCS8qIDB4MDAwMDgwICovCisgICAgdTY0CQlfcGFkXzAwMDA4ODsJCQkvKiAweDAwMDA4OCAqLwogCiAgICAgLyogMHgwMDAwOTAtMHgwMDAwOUYgLS0gU1NSQU0gKi8KLSAgICB1aW50NjRfdAkJcF9tYXBfZmF1bHQ7CQkJLyogMHgwMDAwOTAgKi8KLSAgICB1aW50NjRfdAkJX3BhZF8wMDAwOTg7CQkJLyogMHgwMDAwOTggKi8KKyAgICB1NjQJCXBfbWFwX2ZhdWx0OwkJCS8qIDB4MDAwMDkwICovCisgICAgdTY0CQlfcGFkXzAwMDA5ODsJCQkvKiAweDAwMDA5OCAqLwogCiAgICAgLyogMHgwMDAwQTAtMHgwMDAwQUYgLS0gQXJiaXRyYXRpb24gKi8KLSAgICB1aW50NjRfdAkJcF9hcmI7CQkJCS8qIDB4MDAwMEEwICovCi0gICAgdWludDY0X3QJCV9wYWRfMDAwMEE4OwkJCS8qIDB4MDAwMEE4ICovCisgICAgdTY0CQlwX2FyYjsJCQkJLyogMHgwMDAwQTAgKi8KKyAgICB1NjQJCV9wYWRfMDAwMEE4OwkJCS8qIDB4MDAwMEE4ICovCiAKICAgICAvKiAweDAwMDBCMC0weDAwMDBCRiAtLSBOdW1iZXIgSW4gQSBDYW4gb3IgQVRFIFBhcml0eSBFcnJvciAqLwotICAgIHVpbnQ2NF90CQlwX2F0ZV9wYXJpdHlfZXJyOwkJLyogMHgwMDAwQjAgKi8KLSAgICB1aW50NjRfdAkJX3BhZF8wMDAwQjg7CQkJLyogMHgwMDAwQjggKi8KKyAgICB1NjQJCXBfYXRlX3Bhcml0eV9lcnI7CQkvKiAweDAwMDBCMCAqLworICAgIHU2NAkJX3BhZF8wMDAwQjg7CQkJLyogMHgwMDAwQjggKi8KIAogICAgIC8qIDB4MDAwMEMwLTB4MDAwMEZGIC0tIFBDSS9HSU8gKi8KLSAgICB1aW50NjRfdAkJcF9idXNfdGltZW91dDsJCQkvKiAweDAwMDBDMCAqLwotICAgIHVpbnQ2NF90CQlwX3BjaV9jZmc7CQkJLyogMHgwMDAwQzggKi8KLSAgICB1aW50NjRfdAkJcF9wY2lfZXJyX3VwcGVyOwkJLyogMHgwMDAwRDAgKi8KLSAgICB1aW50NjRfdAkJcF9wY2lfZXJyX2xvd2VyOwkJLyogMHgwMDAwRDggKi8KKyAgICB1NjQJCXBfYnVzX3RpbWVvdXQ7CQkJLyogMHgwMDAwQzAgKi8KKyAgICB1NjQJCXBfcGNpX2NmZzsJCQkvKiAweDAwMDBDOCAqLworICAgIHU2NAkJcF9wY2lfZXJyX3VwcGVyOwkJLyogMHgwMDAwRDAgKi8KKyAgICB1NjQJCXBfcGNpX2Vycl9sb3dlcjsJCS8qIDB4MDAwMEQ4ICovCiAgICAgI2RlZmluZSBwX3BjaV9lcnIgcF9wY2lfZXJyX2xvd2VyCi0gICAgdWludDY0X3QJCV9wYWRfMDAwMEUwWzRdOwkJCS8qIDB4MDAwMHtFMC4uRjh9ICovCisgICAgdTY0CQlfcGFkXzAwMDBFMFs0XTsJCQkvKiAweDAwMDB7RTAuLkY4fSAqLwogCiAgICAgLyogMHgwMDAxMDAtMHgwMDAxRkYgLS0gSW50ZXJydXB0ICovCi0gICAgdWludDY0X3QJCXBfaW50X3N0YXR1czsJCQkvKiAweDAwMDEwMCAqLwotICAgIHVpbnQ2NF90CQlwX2ludF9lbmFibGU7CQkJLyogMHgwMDAxMDggKi8KLSAgICB1aW50NjRfdAkJcF9pbnRfcnN0X3N0YXQ7CQkJLyogMHgwMDAxMTAgKi8KLSAgICB1aW50NjRfdAkJcF9pbnRfbW9kZTsJCQkvKiAweDAwMDExOCAqLwotICAgIHVpbnQ2NF90CQlwX2ludF9kZXZpY2U7CQkJLyogMHgwMDAxMjAgKi8KLSAgICB1aW50NjRfdAkJcF9pbnRfaG9zdF9lcnI7CQkJLyogMHgwMDAxMjggKi8KLSAgICB1aW50NjRfdAkJcF9pbnRfYWRkcls4XTsJCQkvKiAweDAwMDF7MzAsLCw2OH0gKi8KLSAgICB1aW50NjRfdAkJcF9lcnJfaW50X3ZpZXc7CQkJLyogMHgwMDAxNzAgKi8KLSAgICB1aW50NjRfdAkJcF9tdWx0X2ludDsJCQkvKiAweDAwMDE3OCAqLwotICAgIHVpbnQ2NF90CQlwX2ZvcmNlX2Fsd2F5c1s4XTsJCS8qIDB4MDAwMXs4MCwsLEI4fSAqLwotICAgIHVpbnQ2NF90CQlwX2ZvcmNlX3Bpbls4XTsJCQkvKiAweDAwMDF7QzAsLCxGOH0gKi8KKyAgICB1NjQJCXBfaW50X3N0YXR1czsJCQkvKiAweDAwMDEwMCAqLworICAgIHU2NAkJcF9pbnRfZW5hYmxlOwkJCS8qIDB4MDAwMTA4ICovCisgICAgdTY0CQlwX2ludF9yc3Rfc3RhdDsJCQkvKiAweDAwMDExMCAqLworICAgIHU2NAkJcF9pbnRfbW9kZTsJCQkvKiAweDAwMDExOCAqLworICAgIHU2NAkJcF9pbnRfZGV2aWNlOwkJCS8qIDB4MDAwMTIwICovCisgICAgdTY0CQlwX2ludF9ob3N0X2VycjsJCQkvKiAweDAwMDEyOCAqLworICAgIHU2NAkJcF9pbnRfYWRkcls4XTsJCQkvKiAweDAwMDF7MzAsLCw2OH0gKi8KKyAgICB1NjQJCXBfZXJyX2ludF92aWV3OwkJCS8qIDB4MDAwMTcwICovCisgICAgdTY0CQlwX211bHRfaW50OwkJCS8qIDB4MDAwMTc4ICovCisgICAgdTY0CQlwX2ZvcmNlX2Fsd2F5c1s4XTsJCS8qIDB4MDAwMXs4MCwsLEI4fSAqLworICAgIHU2NAkJcF9mb3JjZV9waW5bOF07CQkJLyogMHgwMDAxe0MwLCwsRjh9ICovCiAKICAgICAvKiAweDAwMDIwMC0weDAwMDI5OCAtLSBEZXZpY2UgKi8KLSAgICB1aW50NjRfdAkJcF9kZXZpY2VbNF07CQkJLyogMHgwMDAyezAwLCwsMTh9ICovCi0gICAgdWludDY0X3QJCV9wYWRfMDAwMjIwWzRdOwkJCS8qIDB4MDAwMnsyMCwsLDM4fSAqLwotICAgIHVpbnQ2NF90CQlwX3dyX3JlcV9idWZbNF07CQkvKiAweDAwMDJ7NDAsLCw1OH0gKi8KLSAgICB1aW50NjRfdAkJX3BhZF8wMDAyNjBbNF07CQkJLyogMHgwMDAyezYwLCwsNzh9ICovCi0gICAgdWludDY0X3QJCXBfcnJiX21hcFsyXTsJCQkvKiAweDAwMDJ7ODAsLCw4OH0gKi8KKyAgICB1NjQJCXBfZGV2aWNlWzRdOwkJCS8qIDB4MDAwMnswMCwsLDE4fSAqLworICAgIHU2NAkJX3BhZF8wMDAyMjBbNF07CQkJLyogMHgwMDAyezIwLCwsMzh9ICovCisgICAgdTY0CQlwX3dyX3JlcV9idWZbNF07CQkvKiAweDAwMDJ7NDAsLCw1OH0gKi8KKyAgICB1NjQJCV9wYWRfMDAwMjYwWzRdOwkJCS8qIDB4MDAwMns2MCwsLDc4fSAqLworICAgIHU2NAkJcF9ycmJfbWFwWzJdOwkJCS8qIDB4MDAwMns4MCwsLDg4fSAqLwogICAgICNkZWZpbmUgcF9ldmVuX3Jlc3AgcF9ycmJfbWFwWzBdCQkJLyogMHgwMDAyODAgKi8KICAgICAjZGVmaW5lIHBfb2RkX3Jlc3AgIHBfcnJiX21hcFsxXQkJCS8qIDB4MDAwMjg4ICovCi0gICAgdWludDY0X3QJCXBfcmVzcF9zdGF0dXM7CQkJLyogMHgwMDAyOTAgKi8KLSAgICB1aW50NjRfdAkJcF9yZXNwX2NsZWFyOwkJCS8qIDB4MDAwMjk4ICovCisgICAgdTY0CQlwX3Jlc3Bfc3RhdHVzOwkJCS8qIDB4MDAwMjkwICovCisgICAgdTY0CQlwX3Jlc3BfY2xlYXI7CQkJLyogMHgwMDAyOTggKi8KIAotICAgIHVpbnQ2NF90CQlfcGFkXzAwMDJBMFsxMl07CQkvKiAweDAwMDJ7QTAuLkY4fSAqLworICAgIHU2NAkJX3BhZF8wMDAyQTBbMTJdOwkJLyogMHgwMDAye0EwLi5GOH0gKi8KIAogICAgIC8qIDB4MDAwMzAwLTB4MDAwM0Y4IC0tIEJ1ZmZlciBBZGRyZXNzIE1hdGNoIFJlZ2lzdGVycyAqLwogICAgIHN0cnVjdCB7Ci0JdWludDY0X3QJdXBwZXI7CQkJCS8qIDB4MDAwM3swMCwsLEYwfSAqLwotCXVpbnQ2NF90CWxvd2VyOwkJCQkvKiAweDAwMDN7MDgsLCxGOH0gKi8KKwl1NjQJdXBwZXI7CQkJCS8qIDB4MDAwM3swMCwsLEYwfSAqLworCXU2NAlsb3dlcjsJCQkJLyogMHgwMDAzezA4LCwsRjh9ICovCiAgICAgfSBwX2J1Zl9hZGRyX21hdGNoWzE2XTsKIAogICAgIC8qIDB4MDAwNDAwLTB4MDAwNUZGIC0tIFBlcmZvcm1hbmNlIE1vbml0b3IgUmVnaXN0ZXJzIChldmVuIG9ubHkpICovCiAgICAgc3RydWN0IHsKLQl1aW50NjRfdAlmbHVzaF93X3RvdWNoOwkJCS8qIDB4MDAwezQwMCwsLDVDMH0gKi8KLQl1aW50NjRfdAlmbHVzaF93b190b3VjaDsJCQkvKiAweDAwMHs0MDgsLCw1Qzh9ICovCi0JdWludDY0X3QJaW5mbGlnaHQ7CQkJLyogMHgwMDB7NDEwLCwsNUQwfSAqLwotCXVpbnQ2NF90CXByZWZldGNoOwkJCS8qIDB4MDAwezQxOCwsLDVEOH0gKi8KLQl1aW50NjRfdAl0b3RhbF9wY2lfcmV0cnk7CQkvKiAweDAwMHs0MjAsLCw1RTB9ICovCi0JdWludDY0X3QJbWF4X3BjaV9yZXRyeTsJCQkvKiAweDAwMHs0MjgsLCw1RTh9ICovCi0JdWludDY0X3QJbWF4X2xhdGVuY3k7CQkJLyogMHgwMDB7NDMwLCwsNUYwfSAqLwotCXVpbnQ2NF90CWNsZWFyX2FsbDsJCQkvKiAweDAwMHs0MzgsLCw1Rjh9ICovCisJdTY0CWZsdXNoX3dfdG91Y2g7CQkJLyogMHgwMDB7NDAwLCwsNUMwfSAqLworCXU2NAlmbHVzaF93b190b3VjaDsJCQkvKiAweDAwMHs0MDgsLCw1Qzh9ICovCisJdTY0CWluZmxpZ2h0OwkJCS8qIDB4MDAwezQxMCwsLDVEMH0gKi8KKwl1NjQJcHJlZmV0Y2g7CQkJLyogMHgwMDB7NDE4LCwsNUQ4fSAqLworCXU2NAl0b3RhbF9wY2lfcmV0cnk7CQkvKiAweDAwMHs0MjAsLCw1RTB9ICovCisJdTY0CW1heF9wY2lfcmV0cnk7CQkJLyogMHgwMDB7NDI4LCwsNUU4fSAqLworCXU2NAltYXhfbGF0ZW5jeTsJCQkvKiAweDAwMHs0MzAsLCw1RjB9ICovCisJdTY0CWNsZWFyX2FsbDsJCQkvKiAweDAwMHs0MzgsLCw1Rjh9ICovCiAgICAgfSBwX2J1Zl9jb3VudFs4XTsKIAogCiAgICAgLyogMHgwMDA2MDAtMHgwMDA5RkYgLS0gUENJL1ggcmVnaXN0ZXJzICovCi0gICAgdWludDY0X3QJCXBfcGNpeF9idXNfZXJyX2FkZHI7CQkvKiAweDAwMDYwMCAqLwotICAgIHVpbnQ2NF90CQlwX3BjaXhfYnVzX2Vycl9hdHRyOwkJLyogMHgwMDA2MDggKi8KLSAgICB1aW50NjRfdAkJcF9wY2l4X2J1c19lcnJfZGF0YTsJCS8qIDB4MDAwNjEwICovCi0gICAgdWludDY0X3QJCXBfcGNpeF9waW9fc3BsaXRfYWRkcjsJCS8qIDB4MDAwNjE4ICovCi0gICAgdWludDY0X3QJCXBfcGNpeF9waW9fc3BsaXRfYXR0cjsJCS8qIDB4MDAwNjIwICovCi0gICAgdWludDY0X3QJCXBfcGNpeF9kbWFfcmVxX2Vycl9hdHRyOwkvKiAweDAwMDYyOCAqLwotICAgIHVpbnQ2NF90CQlwX3BjaXhfZG1hX3JlcV9lcnJfYWRkcjsJLyogMHgwMDA2MzAgKi8KLSAgICB1aW50NjRfdAkJcF9wY2l4X3RpbWVvdXQ7CQkJLyogMHgwMDA2MzggKi8KKyAgICB1NjQJCXBfcGNpeF9idXNfZXJyX2FkZHI7CQkvKiAweDAwMDYwMCAqLworICAgIHU2NAkJcF9wY2l4X2J1c19lcnJfYXR0cjsJCS8qIDB4MDAwNjA4ICovCisgICAgdTY0CQlwX3BjaXhfYnVzX2Vycl9kYXRhOwkJLyogMHgwMDA2MTAgKi8KKyAgICB1NjQJCXBfcGNpeF9waW9fc3BsaXRfYWRkcjsJCS8qIDB4MDAwNjE4ICovCisgICAgdTY0CQlwX3BjaXhfcGlvX3NwbGl0X2F0dHI7CQkvKiAweDAwMDYyMCAqLworICAgIHU2NAkJcF9wY2l4X2RtYV9yZXFfZXJyX2F0dHI7CS8qIDB4MDAwNjI4ICovCisgICAgdTY0CQlwX3BjaXhfZG1hX3JlcV9lcnJfYWRkcjsJLyogMHgwMDA2MzAgKi8KKyAgICB1NjQJCXBfcGNpeF90aW1lb3V0OwkJCS8qIDB4MDAwNjM4ICovCiAKLSAgICB1aW50NjRfdAkJX3BhZF8wMDA2NDBbMTIwXTsJCS8qIDB4MDAwezY0MCwsLDlGOH0gKi8KKyAgICB1NjQJCV9wYWRfMDAwNjQwWzEyMF07CQkvKiAweDAwMHs2NDAsLCw5Rjh9ICovCiAKICAgICAvKiAweDAwMEEwMC0weDAwMEJGRiAtLSBQQ0kvWCBSZWFkJldyaXRlIEJ1ZmZlciAqLwogICAgIHN0cnVjdCB7Ci0JdWludDY0X3QJcF9idWZfYWRkcjsJCQkvKiAweDAwMHtBMDAsLCxBRjB9ICovCi0JdWludDY0X3QJcF9idWZfYXR0cjsJCQkvKiAwWDAwMHtBMDgsLCxBRjh9ICovCisJdTY0CXBfYnVmX2FkZHI7CQkJLyogMHgwMDB7QTAwLCwsQUYwfSAqLworCXU2NAlwX2J1Zl9hdHRyOwkJCS8qIDBYMDAwe0EwOCwsLEFGOH0gKi8KICAgICB9IHBfcGNpeF9yZWFkX2J1Zl82NFsxNl07CiAKICAgICBzdHJ1Y3QgewotCXVpbnQ2NF90CXBfYnVmX2FkZHI7CQkJLyogMHgwMDB7QjAwLCwsQkUwfSAqLwotCXVpbnQ2NF90CXBfYnVmX2F0dHI7CQkJLyogMHgwMDB7QjA4LCwsQkU4fSAqLwotCXVpbnQ2NF90CXBfYnVmX3ZhbGlkOwkJCS8qIDB4MDAwe0IxMCwsLEJGMH0gKi8KLQl1aW50NjRfdAlfX3BhZDE7CQkJCS8qIDB4MDAwe0IxOCwsLEJGOH0gKi8KKwl1NjQJcF9idWZfYWRkcjsJCQkvKiAweDAwMHtCMDAsLCxCRTB9ICovCisJdTY0CXBfYnVmX2F0dHI7CQkJLyogMHgwMDB7QjA4LCwsQkU4fSAqLworCXU2NAlwX2J1Zl92YWxpZDsJCQkvKiAweDAwMHtCMTAsLCxCRjB9ICovCisJdTY0CV9fcGFkMTsJCQkJLyogMHgwMDB7QjE4LCwsQkY4fSAqLwogICAgIH0gcF9wY2l4X3dyaXRlX2J1Zl82NFs4XTsKIAogICAgIC8qIEVuZCBvZiBMb2NhbCBSZWdpc3RlcnMgLS0gU3RhcnQgb2YgQWRkcmVzcyBNYXAgc3BhY2UgKi8KQEAgLTE5NSw0NSArMTk1LDQ1IEBACiAgICAgY2hhcgkJX3BhZF8wMDBjMDBbMHgwMTAwMDAgLSAweDAwMGMwMF07CiAKICAgICAvKiAweDAxMDAwMC0weDAxMWZmZiAtLSBJbnRlcm5hbCBBVEUgUkFNIChBdXRvIFBhcml0eSBHZW5lcmF0aW9uKSAqLwotICAgIHVpbnQ2NF90CQlwX2ludF9hdGVfcmFtWzEwMjRdOwkJLyogMHgwMTAwMDAtMHgwMTFmZmYgKi8KKyAgICB1NjQJCXBfaW50X2F0ZV9yYW1bMTAyNF07CQkvKiAweDAxMDAwMC0weDAxMWZmZiAqLwogCiAgICAgLyogMHgwMTIwMDAtMHgwMTNmZmYgLS0gSW50ZXJuYWwgQVRFIFJBTSAoTWFudWFsIFBhcml0eSBHZW5lcmF0aW9uKSAqLwotICAgIHVpbnQ2NF90CQlwX2ludF9hdGVfcmFtX21wWzEwMjRdOwkJLyogMHgwMTIwMDAtMHgwMTNmZmYgKi8KKyAgICB1NjQJCXBfaW50X2F0ZV9yYW1fbXBbMTAyNF07CQkvKiAweDAxMjAwMC0weDAxM2ZmZiAqLwogCiAgICAgY2hhcgkJX3BhZF8wMTQwMDBbMHgxODAwMCAtIDB4MDE0MDAwXTsKIAogICAgIC8qIDB4MTgwMDAtMHgxOTdGOCAtLSBQSUMgV3JpdGUgUmVxdWVzdCBSYW0gKi8KLSAgICB1aW50NjRfdAkJcF93cl9yZXFfbG93ZXJbMjU2XTsJCS8qIDB4MTgwMDAgLSAweDE4N0Y4ICovCi0gICAgdWludDY0X3QJCXBfd3JfcmVxX3VwcGVyWzI1Nl07CQkvKiAweDE4ODAwIC0gMHgxOEZGOCAqLwotICAgIHVpbnQ2NF90CQlwX3dyX3JlcV9wYXJpdHlbMjU2XTsJCS8qIDB4MTkwMDAgLSAweDE5N0Y4ICovCisgICAgdTY0CQlwX3dyX3JlcV9sb3dlclsyNTZdOwkJLyogMHgxODAwMCAtIDB4MTg3RjggKi8KKyAgICB1NjQJCXBfd3JfcmVxX3VwcGVyWzI1Nl07CQkvKiAweDE4ODAwIC0gMHgxOEZGOCAqLworICAgIHU2NAkJcF93cl9yZXFfcGFyaXR5WzI1Nl07CQkvKiAweDE5MDAwIC0gMHgxOTdGOCAqLwogCiAgICAgY2hhcgkJX3BhZF8wMTk4MDBbMHgyMDAwMCAtIDB4MDE5ODAwXTsKIAogICAgIC8qIDB4MDIwMDAwLTB4MDI3RkZGIC0tIFBDSSBEZXZpY2UgQ29uZmlndXJhdGlvbiBTcGFjZXMgKi8KICAgICB1bmlvbiB7Ci0JdWludDhfdAkJY1sweDEwMDAgLyAxXTsJCQkvKiAweDAyezAwMDAsLCw3RkZGfSAqLwotCXVpbnQxNl90CXNbMHgxMDAwIC8gMl07CQkJLyogMHgwMnswMDAwLCwsN0ZGRn0gKi8KLQl1aW50MzJfdAlsWzB4MTAwMCAvIDRdOwkJCS8qIDB4MDJ7MDAwMCwsLDdGRkZ9ICovCi0JdWludDY0X3QJZFsweDEwMDAgLyA4XTsJCQkvKiAweDAyezAwMDAsLCw3RkZGfSAqLworCXU4CQljWzB4MTAwMCAvIDFdOwkJCS8qIDB4MDJ7MDAwMCwsLDdGRkZ9ICovCisJdTE2CXNbMHgxMDAwIC8gMl07CQkJLyogMHgwMnswMDAwLCwsN0ZGRn0gKi8KKwl1MzIJbFsweDEwMDAgLyA0XTsJCQkvKiAweDAyezAwMDAsLCw3RkZGfSAqLworCXU2NAlkWzB4MTAwMCAvIDhdOwkJCS8qIDB4MDJ7MDAwMCwsLDdGRkZ9ICovCiAJdW5pb24gewotCSAgICB1aW50OF90CWNbMHgxMDAgLyAxXTsKLQkgICAgdWludDE2X3QJc1sweDEwMCAvIDJdOwotCSAgICB1aW50MzJfdAlsWzB4MTAwIC8gNF07Ci0JICAgIHVpbnQ2NF90CWRbMHgxMDAgLyA4XTsKKwkgICAgdTgJY1sweDEwMCAvIDFdOworCSAgICB1MTYJc1sweDEwMCAvIDJdOworCSAgICB1MzIJbFsweDEwMCAvIDRdOworCSAgICB1NjQJZFsweDEwMCAvIDhdOwogCX0gZls4XTsKICAgICB9IHBfdHlwZTBfY2ZnX2Rldls4XTsJCQkJLyogMHgwMnswMDAwLCwsN0ZGRn0gKi8KIAogICAgIC8qIDB4MDI4MDAwLTB4MDI4RkZGIC0tIFBDSSBUeXBlIDEgQ29uZmlndXJhdGlvbiBTcGFjZSAqLwogICAgIHVuaW9uIHsKLQl1aW50OF90CQljWzB4MTAwMCAvIDFdOwkJCS8qIDB4MDI4MDAwLTB4MDI5MDAwICovCi0JdWludDE2X3QJc1sweDEwMDAgLyAyXTsJCQkvKiAweDAyODAwMC0weDAyOTAwMCAqLwotCXVpbnQzMl90CWxbMHgxMDAwIC8gNF07CQkJLyogMHgwMjgwMDAtMHgwMjkwMDAgKi8KLQl1aW50NjRfdAlkWzB4MTAwMCAvIDhdOwkJCS8qIDB4MDI4MDAwLTB4MDI5MDAwICovCisJdTgJCWNbMHgxMDAwIC8gMV07CQkJLyogMHgwMjgwMDAtMHgwMjkwMDAgKi8KKwl1MTYJc1sweDEwMDAgLyAyXTsJCQkvKiAweDAyODAwMC0weDAyOTAwMCAqLworCXUzMglsWzB4MTAwMCAvIDRdOwkJCS8qIDB4MDI4MDAwLTB4MDI5MDAwICovCisJdTY0CWRbMHgxMDAwIC8gOF07CQkJLyogMHgwMjgwMDAtMHgwMjkwMDAgKi8KIAl1bmlvbiB7Ci0JICAgIHVpbnQ4X3QJY1sweDEwMCAvIDFdOwotCSAgICB1aW50MTZfdAlzWzB4MTAwIC8gMl07Ci0JICAgIHVpbnQzMl90CWxbMHgxMDAgLyA0XTsKLQkgICAgdWludDY0X3QJZFsweDEwMCAvIDhdOworCSAgICB1OAljWzB4MTAwIC8gMV07CisJICAgIHUxNglzWzB4MTAwIC8gMl07CisJICAgIHUzMglsWzB4MTAwIC8gNF07CisJICAgIHU2NAlkWzB4MTAwIC8gOF07CiAJfSBmWzhdOwogICAgIH0gcF90eXBlMV9jZmc7CQkJCQkvKiAweDAyODAwMC0weDAyOTAwMCAqLwogCkBAIC0yNDEsMjAgKzI0MSwyMCBAQAogCiAgICAgLyogMHgwMzAwMDAtMHgwMzAwMDcgLS0gUENJIEludGVycnVwdCBBY2tub3dsZWRnZSBDeWNsZSAqLwogICAgIHVuaW9uIHsKLQl1aW50OF90CQljWzggLyAxXTsKLQl1aW50MTZfdAlzWzggLyAyXTsKLQl1aW50MzJfdAlsWzggLyA0XTsKLQl1aW50NjRfdAlkWzggLyA4XTsKKwl1OAkJY1s4IC8gMV07CisJdTE2CXNbOCAvIDJdOworCXUzMglsWzggLyA0XTsKKwl1NjQJZFs4IC8gOF07CiAgICAgfSBwX3BjaV9pYWNrOwkJCQkJLyogMHgwMzAwMDAtMHgwMzAwMDcgKi8KIAogICAgIGNoYXIJCV9wYWRfMDMwMDA3WzB4MDQwMDAwLTB4MDMwMDA4XTsKIAogICAgIC8qIDB4MDQwMDAwLTB4MDMwMDA3IC0tIFBDSVggU3BlY2lhbCBDeWNsZSAqLwogICAgIHVuaW9uIHsKLQl1aW50OF90CQljWzggLyAxXTsKLQl1aW50MTZfdAlzWzggLyAyXTsKLQl1aW50MzJfdAlsWzggLyA0XTsKLQl1aW50NjRfdAlkWzggLyA4XTsKKwl1OAkJY1s4IC8gMV07CisJdTE2CXNbOCAvIDJdOworCXUzMglsWzggLyA0XTsKKwl1NjQJZFs4IC8gOF07CiAgICAgfSBwX3BjaXhfY3ljbGU7CQkJCQkvKiAweDA0MDAwMC0weDA0MDAwNyAqLwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9zaHViaW8uaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vc2h1YmlvLmgKaW5kZXggODMxYjcyMS4uMjJhNmYxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi9zaHViaW8uaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3NodWJpby5oCkBAIC0yMjcsMTMgKzIyNywxMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV93aWRfdSB7Ci0JdWludDY0X3QgaWlfd2lkX3JlZ3ZhbDsKKwl1NjQgaWlfd2lkX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCB3X3JzdmRfMToxOwotCQl1aW50NjRfdCB3X21mZ19udW06MTE7Ci0JCXVpbnQ2NF90IHdfcGFydF9udW06MTY7Ci0JCXVpbnQ2NF90IHdfcmV2X251bTo0OwotCQl1aW50NjRfdCB3X3JzdmQ6MzI7CisJCXU2NCB3X3JzdmRfMToxOworCQl1NjQgd19tZmdfbnVtOjExOworCQl1NjQgd19wYXJ0X251bToxNjsKKwkJdTY0IHdfcmV2X251bTo0OworCQl1NjQgd19yc3ZkOjMyOwogCX0gaWlfd2lkX2ZsZF9zOwogfSBpaV93aWRfdV90OwogCkBAIC0yNDYsMTggKzI0NiwxOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV93c3RhdF91IHsKLQl1aW50NjRfdCBpaV93c3RhdF9yZWd2YWw7CisJdTY0IGlpX3dzdGF0X3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCB3X3BlbmRpbmc6NDsKLQkJdWludDY0X3Qgd194dF9jcmRfdG86MTsKLQkJdWludDY0X3Qgd194dF90YWlsX3RvOjE7Ci0JCXVpbnQ2NF90IHdfcnN2ZF8zOjM7Ci0JCXVpbnQ2NF90IHdfdHhfbXhfcnR5OjE7Ci0JCXVpbnQ2NF90IHdfcnN2ZF8yOjY7Ci0JCXVpbnQ2NF90IHdfbGxwX3R4X2NudDo4OwotCQl1aW50NjRfdCB3X3JzdmRfMTo4OwotCQl1aW50NjRfdCB3X2NyYXp5OjE7Ci0JCXVpbnQ2NF90IHdfcnN2ZDozMTsKKwkJdTY0IHdfcGVuZGluZzo0OworCQl1NjQgd194dF9jcmRfdG86MTsKKwkJdTY0IHdfeHRfdGFpbF90bzoxOworCQl1NjQgd19yc3ZkXzM6MzsKKwkJdTY0IHdfdHhfbXhfcnR5OjE7CisJCXU2NCB3X3JzdmRfMjo2OworCQl1NjQgd19sbHBfdHhfY250Ojg7CisJCXU2NCB3X3JzdmRfMTo4OworCQl1NjQgd19jcmF6eToxOworCQl1NjQgd19yc3ZkOjMxOwogCX0gaWlfd3N0YXRfZmxkX3M7CiB9IGlpX3dzdGF0X3VfdDsKIApAQCAtMjY5LDE2ICsyNjksMTYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfd2NyX3UgewotCXVpbnQ2NF90IGlpX3djcl9yZWd2YWw7CisJdTY0IGlpX3djcl9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3Qgd193aWQ6NDsKLQkJdWludDY0X3Qgd190YWc6MTsKLQkJdWludDY0X3Qgd19yc3ZkXzE6ODsKLQkJdWludDY0X3Qgd19kc3RfY3JkOjM7Ci0JCXVpbnQ2NF90IHdfZl9iYWRfcGt0OjE7Ci0JCXVpbnQ2NF90IHdfZGlyX2NvbjoxOwotCQl1aW50NjRfdCB3X2VfdGhyZXNoOjU7Ci0JCXVpbnQ2NF90IHdfcnN2ZDo0MTsKKwkJdTY0IHdfd2lkOjQ7CisJCXU2NCB3X3RhZzoxOworCQl1NjQgd19yc3ZkXzE6ODsKKwkJdTY0IHdfZHN0X2NyZDozOworCQl1NjQgd19mX2JhZF9wa3Q6MTsKKwkJdTY0IHdfZGlyX2NvbjoxOworCQl1NjQgd19lX3RocmVzaDo1OworCQl1NjQgd19yc3ZkOjQxOwogCX0gaWlfd2NyX2ZsZF9zOwogfSBpaV93Y3JfdV90OwogCkBAIC0zMTAsOSArMzEwLDkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaWxhcHJfdSB7Ci0JdWludDY0X3QgaWlfaWxhcHJfcmVndmFsOworCXU2NCBpaV9pbGFwcl9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9yZWdpb246NjQ7CisJCXU2NCBpX3JlZ2lvbjo2NDsKIAl9IGlpX2lsYXByX2ZsZF9zOwogfSBpaV9pbGFwcl91X3Q7CiAKQEAgLTMzMCw5ICszMzAsOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pbGFwb191IHsKLQl1aW50NjRfdCBpaV9pbGFwb19yZWd2YWw7CisJdTY0IGlpX2lsYXBvX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX2lvX292cnJpZGU6NjQ7CisJCXU2NCBpX2lvX292cnJpZGU6NjQ7CiAJfSBpaV9pbGFwb19mbGRfczsKIH0gaWlfaWxhcG9fdV90OwogCkBAIC0zNDQsMTIgKzM0NCwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pb3dhX3UgewotCXVpbnQ2NF90IGlpX2lvd2FfcmVndmFsOworCXU2NCBpaV9pb3dhX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX3cwX29hYzoxOwotCQl1aW50NjRfdCBpX3JzdmRfMTo3OwotCQl1aW50NjRfdCBpX3d4X29hYzo4OwotCQl1aW50NjRfdCBpX3JzdmQ6NDg7CisJCXU2NCBpX3cwX29hYzoxOworCQl1NjQgaV9yc3ZkXzE6NzsKKwkJdTY0IGlfd3hfb2FjOjg7CisJCXU2NCBpX3JzdmQ6NDg7CiAJfSBpaV9pb3dhX2ZsZF9zOwogfSBpaV9pb3dhX3VfdDsKIApAQCAtMzYzLDEyICszNjMsMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaWl3YV91IHsKLQl1aW50NjRfdCBpaV9paXdhX3JlZ3ZhbDsKKwl1NjQgaWlfaWl3YV9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV93MF9pYWM6MTsKLQkJdWludDY0X3QgaV9yc3ZkXzE6NzsKLQkJdWludDY0X3QgaV93eF9pYWM6ODsKLQkJdWludDY0X3QgaV9yc3ZkOjQ4OworCQl1NjQgaV93MF9pYWM6MTsKKwkJdTY0IGlfcnN2ZF8xOjc7CisJCXU2NCBpX3d4X2lhYzo4OworCQl1NjQgaV9yc3ZkOjQ4OwogCX0gaWlfaWl3YV9mbGRfczsKIH0gaWlfaWl3YV91X3Q7CiAKQEAgLTM5MiwxNiArMzkyLDE2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2lpZGVtX3UgewotCXVpbnQ2NF90IGlpX2lpZGVtX3JlZ3ZhbDsKKwl1NjQgaWlfaWlkZW1fcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfdzhfZHhzOjg7Ci0JCXVpbnQ2NF90IGlfdzlfZHhzOjg7Ci0JCXVpbnQ2NF90IGlfd2FfZHhzOjg7Ci0JCXVpbnQ2NF90IGlfd2JfZHhzOjg7Ci0JCXVpbnQ2NF90IGlfd2NfZHhzOjg7Ci0JCXVpbnQ2NF90IGlfd2RfZHhzOjg7Ci0JCXVpbnQ2NF90IGlfd2VfZHhzOjg7Ci0JCXVpbnQ2NF90IGlfd2ZfZHhzOjg7CisJCXU2NCBpX3c4X2R4czo4OworCQl1NjQgaV93OV9keHM6ODsKKwkJdTY0IGlfd2FfZHhzOjg7CisJCXU2NCBpX3diX2R4czo4OworCQl1NjQgaV93Y19keHM6ODsKKwkJdTY0IGlfd2RfZHhzOjg7CisJCXU2NCBpX3dlX2R4czo4OworCQl1NjQgaV93Zl9keHM6ODsKIAl9IGlpX2lpZGVtX2ZsZF9zOwogfSBpaV9paWRlbV91X3Q7CiAKQEAgLTQxMywyMiArNDEzLDIyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2lsY3NyX3UgewotCXVpbnQ2NF90IGlpX2lsY3NyX3JlZ3ZhbDsKKwl1NjQgaWlfaWxjc3JfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfbnVsbHRvOjY7Ci0JCXVpbnQ2NF90IGlfcnN2ZF80OjI7Ci0JCXVpbnQ2NF90IGlfd3JtcnN0OjE7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8zOjE7Ci0JCXVpbnQ2NF90IGlfbGxwX2VuOjE7Ci0JCXVpbnQ2NF90IGlfYm04OjE7Ci0JCXVpbnQ2NF90IGlfbGxwX3N0YXQ6MjsKLQkJdWludDY0X3QgaV9yZW1vdGVfcG93ZXI6MTsKLQkJdWludDY0X3QgaV9yc3ZkXzI6MTsKLQkJdWludDY0X3QgaV9tYXhydHJ5OjEwOwotCQl1aW50NjRfdCBpX2RfYXZhaWxfc2VsOjI7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8xOjQ7Ci0JCXVpbnQ2NF90IGlfbWF4YnJzdDoxMDsKLQkJdWludDY0X3QgaV9yc3ZkOjIyOworCQl1NjQgaV9udWxsdG86NjsKKwkJdTY0IGlfcnN2ZF80OjI7CisJCXU2NCBpX3dybXJzdDoxOworCQl1NjQgaV9yc3ZkXzM6MTsKKwkJdTY0IGlfbGxwX2VuOjE7CisJCXU2NCBpX2JtODoxOworCQl1NjQgaV9sbHBfc3RhdDoyOworCQl1NjQgaV9yZW1vdGVfcG93ZXI6MTsKKwkJdTY0IGlfcnN2ZF8yOjE7CisJCXU2NCBpX21heHJ0cnk6MTA7CisJCXU2NCBpX2RfYXZhaWxfc2VsOjI7CisJCXU2NCBpX3JzdmRfMTo0OworCQl1NjQgaV9tYXhicnN0OjEwOworCQl1NjQgaV9yc3ZkOjIyOwogCiAJfSBpaV9pbGNzcl9mbGRfczsKIH0gaWlfaWxjc3JfdV90OwpAQCAtNDQxLDExICs0NDEsMTEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaWxscl91IHsKLQl1aW50NjRfdCBpaV9pbGxyX3JlZ3ZhbDsKKwl1NjQgaWlfaWxscl9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9zbl9jbnQ6MTY7Ci0JCXVpbnQ2NF90IGlfY2JfY250OjE2OwotCQl1aW50NjRfdCBpX3JzdmQ6MzI7CisJCXU2NCBpX3NuX2NudDoxNjsKKwkJdTY0IGlfY2JfY250OjE2OworCQl1NjQgaV9yc3ZkOjMyOwogCX0gaWlfaWxscl9mbGRfczsKIH0gaWlfaWxscl91X3Q7CiAKQEAgLTQ2NCwxOSArNDY0LDE5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2lpZHNyX3UgewotCXVpbnQ2NF90IGlpX2lpZHNyX3JlZ3ZhbDsKKwl1NjQgaWlfaWlkc3JfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfbGV2ZWw6ODsKLQkJdWludDY0X3QgaV9waV9pZDoxOwotCQl1aW50NjRfdCBpX25vZGU6MTE7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8zOjQ7Ci0JCXVpbnQ2NF90IGlfZW5hYmxlOjE7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8yOjM7Ci0JCXVpbnQ2NF90IGlfaW50X3NlbnQ6MjsKLQkJdWludDY0X3QgaV9yc3ZkXzE6MjsKLQkJdWludDY0X3QgaV9waTBfZm9yd2FyZF9pbnQ6MTsKLQkJdWludDY0X3QgaV9waTFfZm9yd2FyZF9pbnQ6MTsKLQkJdWludDY0X3QgaV9yc3ZkOjMwOworCQl1NjQgaV9sZXZlbDo4OworCQl1NjQgaV9waV9pZDoxOworCQl1NjQgaV9ub2RlOjExOworCQl1NjQgaV9yc3ZkXzM6NDsKKwkJdTY0IGlfZW5hYmxlOjE7CisJCXU2NCBpX3JzdmRfMjozOworCQl1NjQgaV9pbnRfc2VudDoyOworCQl1NjQgaV9yc3ZkXzE6MjsKKwkJdTY0IGlfcGkwX2ZvcndhcmRfaW50OjE7CisJCXU2NCBpX3BpMV9mb3J3YXJkX2ludDoxOworCQl1NjQgaV9yc3ZkOjMwOwogCX0gaWlfaWlkc3JfZmxkX3M7CiB9IGlpX2lpZHNyX3VfdDsKIApAQCAtNDkyLDEzICs0OTIsMTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaWdmeDBfdSB7Ci0JdWludDY0X3QgaWlfaWdmeDBfcmVndmFsOworCXU2NCBpaV9pZ2Z4MF9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV93X251bTo0OwotCQl1aW50NjRfdCBpX3BpX2lkOjE7Ci0JCXVpbnQ2NF90IGlfbl9udW06MTI7Ci0JCXVpbnQ2NF90IGlfcF9udW06MTsKLQkJdWludDY0X3QgaV9yc3ZkOjQ2OworCQl1NjQgaV93X251bTo0OworCQl1NjQgaV9waV9pZDoxOworCQl1NjQgaV9uX251bToxMjsKKwkJdTY0IGlfcF9udW06MTsKKwkJdTY0IGlfcnN2ZDo0NjsKIAl9IGlpX2lnZngwX2ZsZF9zOwogfSBpaV9pZ2Z4MF91X3Q7CiAKQEAgLTUxNCwxMyArNTE0LDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2lnZngxX3UgewotCXVpbnQ2NF90IGlpX2lnZngxX3JlZ3ZhbDsKKwl1NjQgaWlfaWdmeDFfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfd19udW06NDsKLQkJdWludDY0X3QgaV9waV9pZDoxOwotCQl1aW50NjRfdCBpX25fbnVtOjEyOwotCQl1aW50NjRfdCBpX3BfbnVtOjE7Ci0JCXVpbnQ2NF90IGlfcnN2ZDo0NjsKKwkJdTY0IGlfd19udW06NDsKKwkJdTY0IGlfcGlfaWQ6MTsKKwkJdTY0IGlfbl9udW06MTI7CisJCXU2NCBpX3BfbnVtOjE7CisJCXU2NCBpX3JzdmQ6NDY7CiAJfSBpaV9pZ2Z4MV9mbGRfczsKIH0gaWlfaWdmeDFfdV90OwogCkBAIC01MzIsOSArNTMyLDkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaXNjcjBfdSB7Ci0JdWludDY0X3QgaWlfaXNjcjBfcmVndmFsOworCXU2NCBpaV9pc2NyMF9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9zY3JhdGNoOjY0OworCQl1NjQgaV9zY3JhdGNoOjY0OwogCX0gaWlfaXNjcjBfZmxkX3M7CiB9IGlpX2lzY3IwX3VfdDsKIApAQCAtNTQ2LDkgKzU0Niw5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2lzY3IxX3UgewotCXVpbnQ2NF90IGlpX2lzY3IxX3JlZ3ZhbDsKKwl1NjQgaWlfaXNjcjFfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfc2NyYXRjaDo2NDsKKwkJdTY0IGlfc2NyYXRjaDo2NDsKIAl9IGlpX2lzY3IxX2ZsZF9zOwogfSBpaV9pc2NyMV91X3Q7CiAKQEAgLTU4MCwxMyArNTgwLDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2l0dGUxX3UgewotCXVpbnQ2NF90IGlpX2l0dGUxX3JlZ3ZhbDsKKwl1NjQgaWlfaXR0ZTFfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfb2Zmc2V0OjU7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8xOjM7Ci0JCXVpbnQ2NF90IGlfd19udW06NDsKLQkJdWludDY0X3QgaV9pb3NwOjE7Ci0JCXVpbnQ2NF90IGlfcnN2ZDo1MTsKKwkJdTY0IGlfb2Zmc2V0OjU7CisJCXU2NCBpX3JzdmRfMTozOworCQl1NjQgaV93X251bTo0OworCQl1NjQgaV9pb3NwOjE7CisJCXU2NCBpX3JzdmQ6NTE7CiAJfSBpaV9pdHRlMV9mbGRfczsKIH0gaWlfaXR0ZTFfdV90OwogCkBAIC02MTgsMTMgKzYxOCwxMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pdHRlMl91IHsKLQl1aW50NjRfdCBpaV9pdHRlMl9yZWd2YWw7CisJdTY0IGlpX2l0dGUyX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX29mZnNldDo1OwotCQl1aW50NjRfdCBpX3JzdmRfMTozOwotCQl1aW50NjRfdCBpX3dfbnVtOjQ7Ci0JCXVpbnQ2NF90IGlfaW9zcDoxOwotCQl1aW50NjRfdCBpX3JzdmQ6NTE7CisJCXU2NCBpX29mZnNldDo1OworCQl1NjQgaV9yc3ZkXzE6MzsKKwkJdTY0IGlfd19udW06NDsKKwkJdTY0IGlfaW9zcDoxOworCQl1NjQgaV9yc3ZkOjUxOwogCX0gaWlfaXR0ZTJfZmxkX3M7CiB9IGlpX2l0dGUyX3VfdDsKIApAQCAtNjU2LDEzICs2NTYsMTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaXR0ZTNfdSB7Ci0JdWludDY0X3QgaWlfaXR0ZTNfcmVndmFsOworCXU2NCBpaV9pdHRlM19yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9vZmZzZXQ6NTsKLQkJdWludDY0X3QgaV9yc3ZkXzE6MzsKLQkJdWludDY0X3QgaV93X251bTo0OwotCQl1aW50NjRfdCBpX2lvc3A6MTsKLQkJdWludDY0X3QgaV9yc3ZkOjUxOworCQl1NjQgaV9vZmZzZXQ6NTsKKwkJdTY0IGlfcnN2ZF8xOjM7CisJCXU2NCBpX3dfbnVtOjQ7CisJCXU2NCBpX2lvc3A6MTsKKwkJdTY0IGlfcnN2ZDo1MTsKIAl9IGlpX2l0dGUzX2ZsZF9zOwogfSBpaV9pdHRlM191X3Q7CiAKQEAgLTY5NCwxMyArNjk0LDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2l0dGU0X3UgewotCXVpbnQ2NF90IGlpX2l0dGU0X3JlZ3ZhbDsKKwl1NjQgaWlfaXR0ZTRfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfb2Zmc2V0OjU7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8xOjM7Ci0JCXVpbnQ2NF90IGlfd19udW06NDsKLQkJdWludDY0X3QgaV9pb3NwOjE7Ci0JCXVpbnQ2NF90IGlfcnN2ZDo1MTsKKwkJdTY0IGlfb2Zmc2V0OjU7CisJCXU2NCBpX3JzdmRfMTozOworCQl1NjQgaV93X251bTo0OworCQl1NjQgaV9pb3NwOjE7CisJCXU2NCBpX3JzdmQ6NTE7CiAJfSBpaV9pdHRlNF9mbGRfczsKIH0gaWlfaXR0ZTRfdV90OwogCkBAIC03MzIsMTMgKzczMiwxMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pdHRlNV91IHsKLQl1aW50NjRfdCBpaV9pdHRlNV9yZWd2YWw7CisJdTY0IGlpX2l0dGU1X3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX29mZnNldDo1OwotCQl1aW50NjRfdCBpX3JzdmRfMTozOwotCQl1aW50NjRfdCBpX3dfbnVtOjQ7Ci0JCXVpbnQ2NF90IGlfaW9zcDoxOwotCQl1aW50NjRfdCBpX3JzdmQ6NTE7CisJCXU2NCBpX29mZnNldDo1OworCQl1NjQgaV9yc3ZkXzE6MzsKKwkJdTY0IGlfd19udW06NDsKKwkJdTY0IGlfaW9zcDoxOworCQl1NjQgaV9yc3ZkOjUxOwogCX0gaWlfaXR0ZTVfZmxkX3M7CiB9IGlpX2l0dGU1X3VfdDsKIApAQCAtNzcwLDEzICs3NzAsMTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaXR0ZTZfdSB7Ci0JdWludDY0X3QgaWlfaXR0ZTZfcmVndmFsOworCXU2NCBpaV9pdHRlNl9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9vZmZzZXQ6NTsKLQkJdWludDY0X3QgaV9yc3ZkXzE6MzsKLQkJdWludDY0X3QgaV93X251bTo0OwotCQl1aW50NjRfdCBpX2lvc3A6MTsKLQkJdWludDY0X3QgaV9yc3ZkOjUxOworCQl1NjQgaV9vZmZzZXQ6NTsKKwkJdTY0IGlfcnN2ZF8xOjM7CisJCXU2NCBpX3dfbnVtOjQ7CisJCXU2NCBpX2lvc3A6MTsKKwkJdTY0IGlfcnN2ZDo1MTsKIAl9IGlpX2l0dGU2X2ZsZF9zOwogfSBpaV9pdHRlNl91X3Q7CiAKQEAgLTgwOCwxMyArODA4LDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2l0dGU3X3UgewotCXVpbnQ2NF90IGlpX2l0dGU3X3JlZ3ZhbDsKKwl1NjQgaWlfaXR0ZTdfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfb2Zmc2V0OjU7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8xOjM7Ci0JCXVpbnQ2NF90IGlfd19udW06NDsKLQkJdWludDY0X3QgaV9pb3NwOjE7Ci0JCXVpbnQ2NF90IGlfcnN2ZDo1MTsKKwkJdTY0IGlfb2Zmc2V0OjU7CisJCXU2NCBpX3JzdmRfMTozOworCQl1NjQgaV93X251bTo0OworCQl1NjQgaV9pb3NwOjE7CisJCXU2NCBpX3JzdmQ6NTE7CiAJfSBpaV9pdHRlN19mbGRfczsKIH0gaWlfaXR0ZTdfdV90OwogCkBAIC04NDMsMjIgKzg0MywyMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pcHJiMF91IHsKLQl1aW50NjRfdCBpaV9pcHJiMF9yZWd2YWw7CisJdTY0IGlpX2lwcmIwX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX2M6ODsKLQkJdWludDY0X3QgaV9uYToxNDsKLQkJdWludDY0X3QgaV9yc3ZkXzI6MjsKLQkJdWludDY0X3QgaV9uYjoxNDsKLQkJdWludDY0X3QgaV9yc3ZkXzE6MjsKLQkJdWludDY0X3QgaV9tOjI7Ci0JCXVpbnQ2NF90IGlfZjoxOwotCQl1aW50NjRfdCBpX29mX2NudDo1OwotCQl1aW50NjRfdCBpX2Vycm9yOjE7Ci0JCXVpbnQ2NF90IGlfcmRfdG86MTsKLQkJdWludDY0X3QgaV9zcHVyX3dyOjE7Ci0JCXVpbnQ2NF90IGlfc3B1cl9yZDoxOwotCQl1aW50NjRfdCBpX3JzdmQ6MTE7Ci0JCXVpbnQ2NF90IGlfbXVsdF9lcnI6MTsKKwkJdTY0IGlfYzo4OworCQl1NjQgaV9uYToxNDsKKwkJdTY0IGlfcnN2ZF8yOjI7CisJCXU2NCBpX25iOjE0OworCQl1NjQgaV9yc3ZkXzE6MjsKKwkJdTY0IGlfbToyOworCQl1NjQgaV9mOjE7CisJCXU2NCBpX29mX2NudDo1OworCQl1NjQgaV9lcnJvcjoxOworCQl1NjQgaV9yZF90bzoxOworCQl1NjQgaV9zcHVyX3dyOjE7CisJCXU2NCBpX3NwdXJfcmQ6MTsKKwkJdTY0IGlfcnN2ZDoxMTsKKwkJdTY0IGlfbXVsdF9lcnI6MTsKIAl9IGlpX2lwcmIwX2ZsZF9zOwogfSBpaV9pcHJiMF91X3Q7CiAKQEAgLTg4NywyMiArODg3LDIyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2lwcmI4X3UgewotCXVpbnQ2NF90IGlpX2lwcmI4X3JlZ3ZhbDsKKwl1NjQgaWlfaXByYjhfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfYzo4OwotCQl1aW50NjRfdCBpX25hOjE0OwotCQl1aW50NjRfdCBpX3JzdmRfMjoyOwotCQl1aW50NjRfdCBpX25iOjE0OwotCQl1aW50NjRfdCBpX3JzdmRfMToyOwotCQl1aW50NjRfdCBpX206MjsKLQkJdWludDY0X3QgaV9mOjE7Ci0JCXVpbnQ2NF90IGlfb2ZfY250OjU7Ci0JCXVpbnQ2NF90IGlfZXJyb3I6MTsKLQkJdWludDY0X3QgaV9yZF90bzoxOwotCQl1aW50NjRfdCBpX3NwdXJfd3I6MTsKLQkJdWludDY0X3QgaV9zcHVyX3JkOjE7Ci0JCXVpbnQ2NF90IGlfcnN2ZDoxMTsKLQkJdWludDY0X3QgaV9tdWx0X2VycjoxOworCQl1NjQgaV9jOjg7CisJCXU2NCBpX25hOjE0OworCQl1NjQgaV9yc3ZkXzI6MjsKKwkJdTY0IGlfbmI6MTQ7CisJCXU2NCBpX3JzdmRfMToyOworCQl1NjQgaV9tOjI7CisJCXU2NCBpX2Y6MTsKKwkJdTY0IGlfb2ZfY250OjU7CisJCXU2NCBpX2Vycm9yOjE7CisJCXU2NCBpX3JkX3RvOjE7CisJCXU2NCBpX3NwdXJfd3I6MTsKKwkJdTY0IGlfc3B1cl9yZDoxOworCQl1NjQgaV9yc3ZkOjExOworCQl1NjQgaV9tdWx0X2VycjoxOwogCX0gaWlfaXByYjhfZmxkX3M7CiB9IGlpX2lwcmI4X3VfdDsKIApAQCAtOTMxLDIyICs5MzEsMjIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaXByYjlfdSB7Ci0JdWludDY0X3QgaWlfaXByYjlfcmVndmFsOworCXU2NCBpaV9pcHJiOV9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9jOjg7Ci0JCXVpbnQ2NF90IGlfbmE6MTQ7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8yOjI7Ci0JCXVpbnQ2NF90IGlfbmI6MTQ7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8xOjI7Ci0JCXVpbnQ2NF90IGlfbToyOwotCQl1aW50NjRfdCBpX2Y6MTsKLQkJdWludDY0X3QgaV9vZl9jbnQ6NTsKLQkJdWludDY0X3QgaV9lcnJvcjoxOwotCQl1aW50NjRfdCBpX3JkX3RvOjE7Ci0JCXVpbnQ2NF90IGlfc3B1cl93cjoxOwotCQl1aW50NjRfdCBpX3NwdXJfcmQ6MTsKLQkJdWludDY0X3QgaV9yc3ZkOjExOwotCQl1aW50NjRfdCBpX211bHRfZXJyOjE7CisJCXU2NCBpX2M6ODsKKwkJdTY0IGlfbmE6MTQ7CisJCXU2NCBpX3JzdmRfMjoyOworCQl1NjQgaV9uYjoxNDsKKwkJdTY0IGlfcnN2ZF8xOjI7CisJCXU2NCBpX206MjsKKwkJdTY0IGlfZjoxOworCQl1NjQgaV9vZl9jbnQ6NTsKKwkJdTY0IGlfZXJyb3I6MTsKKwkJdTY0IGlfcmRfdG86MTsKKwkJdTY0IGlfc3B1cl93cjoxOworCQl1NjQgaV9zcHVyX3JkOjE7CisJCXU2NCBpX3JzdmQ6MTE7CisJCXU2NCBpX211bHRfZXJyOjE7CiAJfSBpaV9pcHJiOV9mbGRfczsKIH0gaWlfaXByYjlfdV90OwogCkBAIC05NzUsMjIgKzk3NSwyMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pcHJiYV91IHsKLQl1aW50NjRfdCBpaV9pcHJiYV9yZWd2YWw7CisJdTY0IGlpX2lwcmJhX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX2M6ODsKLQkJdWludDY0X3QgaV9uYToxNDsKLQkJdWludDY0X3QgaV9yc3ZkXzI6MjsKLQkJdWludDY0X3QgaV9uYjoxNDsKLQkJdWludDY0X3QgaV9yc3ZkXzE6MjsKLQkJdWludDY0X3QgaV9tOjI7Ci0JCXVpbnQ2NF90IGlfZjoxOwotCQl1aW50NjRfdCBpX29mX2NudDo1OwotCQl1aW50NjRfdCBpX2Vycm9yOjE7Ci0JCXVpbnQ2NF90IGlfcmRfdG86MTsKLQkJdWludDY0X3QgaV9zcHVyX3dyOjE7Ci0JCXVpbnQ2NF90IGlfc3B1cl9yZDoxOwotCQl1aW50NjRfdCBpX3JzdmQ6MTE7Ci0JCXVpbnQ2NF90IGlfbXVsdF9lcnI6MTsKKwkJdTY0IGlfYzo4OworCQl1NjQgaV9uYToxNDsKKwkJdTY0IGlfcnN2ZF8yOjI7CisJCXU2NCBpX25iOjE0OworCQl1NjQgaV9yc3ZkXzE6MjsKKwkJdTY0IGlfbToyOworCQl1NjQgaV9mOjE7CisJCXU2NCBpX29mX2NudDo1OworCQl1NjQgaV9lcnJvcjoxOworCQl1NjQgaV9yZF90bzoxOworCQl1NjQgaV9zcHVyX3dyOjE7CisJCXU2NCBpX3NwdXJfcmQ6MTsKKwkJdTY0IGlfcnN2ZDoxMTsKKwkJdTY0IGlfbXVsdF9lcnI6MTsKIAl9IGlpX2lwcmJhX2ZsZF9zOwogfSBpaV9pcHJiYV91X3Q7CiAKQEAgLTEwMTksMjIgKzEwMTksMjIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaXByYmJfdSB7Ci0JdWludDY0X3QgaWlfaXByYmJfcmVndmFsOworCXU2NCBpaV9pcHJiYl9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9jOjg7Ci0JCXVpbnQ2NF90IGlfbmE6MTQ7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8yOjI7Ci0JCXVpbnQ2NF90IGlfbmI6MTQ7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8xOjI7Ci0JCXVpbnQ2NF90IGlfbToyOwotCQl1aW50NjRfdCBpX2Y6MTsKLQkJdWludDY0X3QgaV9vZl9jbnQ6NTsKLQkJdWludDY0X3QgaV9lcnJvcjoxOwotCQl1aW50NjRfdCBpX3JkX3RvOjE7Ci0JCXVpbnQ2NF90IGlfc3B1cl93cjoxOwotCQl1aW50NjRfdCBpX3NwdXJfcmQ6MTsKLQkJdWludDY0X3QgaV9yc3ZkOjExOwotCQl1aW50NjRfdCBpX211bHRfZXJyOjE7CisJCXU2NCBpX2M6ODsKKwkJdTY0IGlfbmE6MTQ7CisJCXU2NCBpX3JzdmRfMjoyOworCQl1NjQgaV9uYjoxNDsKKwkJdTY0IGlfcnN2ZF8xOjI7CisJCXU2NCBpX206MjsKKwkJdTY0IGlfZjoxOworCQl1NjQgaV9vZl9jbnQ6NTsKKwkJdTY0IGlfZXJyb3I6MTsKKwkJdTY0IGlfcmRfdG86MTsKKwkJdTY0IGlfc3B1cl93cjoxOworCQl1NjQgaV9zcHVyX3JkOjE7CisJCXU2NCBpX3JzdmQ6MTE7CisJCXU2NCBpX211bHRfZXJyOjE7CiAJfSBpaV9pcHJiYl9mbGRfczsKIH0gaWlfaXByYmJfdV90OwogCkBAIC0xMDYzLDIyICsxMDYzLDIyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2lwcmJjX3UgewotCXVpbnQ2NF90IGlpX2lwcmJjX3JlZ3ZhbDsKKwl1NjQgaWlfaXByYmNfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfYzo4OwotCQl1aW50NjRfdCBpX25hOjE0OwotCQl1aW50NjRfdCBpX3JzdmRfMjoyOwotCQl1aW50NjRfdCBpX25iOjE0OwotCQl1aW50NjRfdCBpX3JzdmRfMToyOwotCQl1aW50NjRfdCBpX206MjsKLQkJdWludDY0X3QgaV9mOjE7Ci0JCXVpbnQ2NF90IGlfb2ZfY250OjU7Ci0JCXVpbnQ2NF90IGlfZXJyb3I6MTsKLQkJdWludDY0X3QgaV9yZF90bzoxOwotCQl1aW50NjRfdCBpX3NwdXJfd3I6MTsKLQkJdWludDY0X3QgaV9zcHVyX3JkOjE7Ci0JCXVpbnQ2NF90IGlfcnN2ZDoxMTsKLQkJdWludDY0X3QgaV9tdWx0X2VycjoxOworCQl1NjQgaV9jOjg7CisJCXU2NCBpX25hOjE0OworCQl1NjQgaV9yc3ZkXzI6MjsKKwkJdTY0IGlfbmI6MTQ7CisJCXU2NCBpX3JzdmRfMToyOworCQl1NjQgaV9tOjI7CisJCXU2NCBpX2Y6MTsKKwkJdTY0IGlfb2ZfY250OjU7CisJCXU2NCBpX2Vycm9yOjE7CisJCXU2NCBpX3JkX3RvOjE7CisJCXU2NCBpX3NwdXJfd3I6MTsKKwkJdTY0IGlfc3B1cl9yZDoxOworCQl1NjQgaV9yc3ZkOjExOworCQl1NjQgaV9tdWx0X2VycjoxOwogCX0gaWlfaXByYmNfZmxkX3M7CiB9IGlpX2lwcmJjX3VfdDsKIApAQCAtMTEwNywyMiArMTEwNywyMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pcHJiZF91IHsKLQl1aW50NjRfdCBpaV9pcHJiZF9yZWd2YWw7CisJdTY0IGlpX2lwcmJkX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX2M6ODsKLQkJdWludDY0X3QgaV9uYToxNDsKLQkJdWludDY0X3QgaV9yc3ZkXzI6MjsKLQkJdWludDY0X3QgaV9uYjoxNDsKLQkJdWludDY0X3QgaV9yc3ZkXzE6MjsKLQkJdWludDY0X3QgaV9tOjI7Ci0JCXVpbnQ2NF90IGlfZjoxOwotCQl1aW50NjRfdCBpX29mX2NudDo1OwotCQl1aW50NjRfdCBpX2Vycm9yOjE7Ci0JCXVpbnQ2NF90IGlfcmRfdG86MTsKLQkJdWludDY0X3QgaV9zcHVyX3dyOjE7Ci0JCXVpbnQ2NF90IGlfc3B1cl9yZDoxOwotCQl1aW50NjRfdCBpX3JzdmQ6MTE7Ci0JCXVpbnQ2NF90IGlfbXVsdF9lcnI6MTsKKwkJdTY0IGlfYzo4OworCQl1NjQgaV9uYToxNDsKKwkJdTY0IGlfcnN2ZF8yOjI7CisJCXU2NCBpX25iOjE0OworCQl1NjQgaV9yc3ZkXzE6MjsKKwkJdTY0IGlfbToyOworCQl1NjQgaV9mOjE7CisJCXU2NCBpX29mX2NudDo1OworCQl1NjQgaV9lcnJvcjoxOworCQl1NjQgaV9yZF90bzoxOworCQl1NjQgaV9zcHVyX3dyOjE7CisJCXU2NCBpX3NwdXJfcmQ6MTsKKwkJdTY0IGlfcnN2ZDoxMTsKKwkJdTY0IGlfbXVsdF9lcnI6MTsKIAl9IGlpX2lwcmJkX2ZsZF9zOwogfSBpaV9pcHJiZF91X3Q7CiAKQEAgLTExNTEsMjIgKzExNTEsMjIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaXByYmVfdSB7Ci0JdWludDY0X3QgaWlfaXByYmVfcmVndmFsOworCXU2NCBpaV9pcHJiZV9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9jOjg7Ci0JCXVpbnQ2NF90IGlfbmE6MTQ7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8yOjI7Ci0JCXVpbnQ2NF90IGlfbmI6MTQ7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8xOjI7Ci0JCXVpbnQ2NF90IGlfbToyOwotCQl1aW50NjRfdCBpX2Y6MTsKLQkJdWludDY0X3QgaV9vZl9jbnQ6NTsKLQkJdWludDY0X3QgaV9lcnJvcjoxOwotCQl1aW50NjRfdCBpX3JkX3RvOjE7Ci0JCXVpbnQ2NF90IGlfc3B1cl93cjoxOwotCQl1aW50NjRfdCBpX3NwdXJfcmQ6MTsKLQkJdWludDY0X3QgaV9yc3ZkOjExOwotCQl1aW50NjRfdCBpX211bHRfZXJyOjE7CisJCXU2NCBpX2M6ODsKKwkJdTY0IGlfbmE6MTQ7CisJCXU2NCBpX3JzdmRfMjoyOworCQl1NjQgaV9uYjoxNDsKKwkJdTY0IGlfcnN2ZF8xOjI7CisJCXU2NCBpX206MjsKKwkJdTY0IGlfZjoxOworCQl1NjQgaV9vZl9jbnQ6NTsKKwkJdTY0IGlfZXJyb3I6MTsKKwkJdTY0IGlfcmRfdG86MTsKKwkJdTY0IGlfc3B1cl93cjoxOworCQl1NjQgaV9zcHVyX3JkOjE7CisJCXU2NCBpX3JzdmQ6MTE7CisJCXU2NCBpX211bHRfZXJyOjE7CiAJfSBpaV9pcHJiZV9mbGRfczsKIH0gaWlfaXByYmVfdV90OwogCkBAIC0xMTk1LDIyICsxMTk1LDIyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2lwcmJmX3UgewotCXVpbnQ2NF90IGlpX2lwcmJmX3JlZ3ZhbDsKKwl1NjQgaWlfaXByYmZfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfYzo4OwotCQl1aW50NjRfdCBpX25hOjE0OwotCQl1aW50NjRfdCBpX3JzdmRfMjoyOwotCQl1aW50NjRfdCBpX25iOjE0OwotCQl1aW50NjRfdCBpX3JzdmRfMToyOwotCQl1aW50NjRfdCBpX206MjsKLQkJdWludDY0X3QgaV9mOjE7Ci0JCXVpbnQ2NF90IGlfb2ZfY250OjU7Ci0JCXVpbnQ2NF90IGlfZXJyb3I6MTsKLQkJdWludDY0X3QgaV9yZF90bzoxOwotCQl1aW50NjRfdCBpX3NwdXJfd3I6MTsKLQkJdWludDY0X3QgaV9zcHVyX3JkOjE7Ci0JCXVpbnQ2NF90IGlfcnN2ZDoxMTsKLQkJdWludDY0X3QgaV9tdWx0X2VycjoxOworCQl1NjQgaV9jOjg7CisJCXU2NCBpX25hOjE0OworCQl1NjQgaV9yc3ZkXzI6MjsKKwkJdTY0IGlfbmI6MTQ7CisJCXU2NCBpX3JzdmRfMToyOworCQl1NjQgaV9tOjI7CisJCXU2NCBpX2Y6MTsKKwkJdTY0IGlfb2ZfY250OjU7CisJCXU2NCBpX2Vycm9yOjE7CisJCXU2NCBpX3JkX3RvOjE7CisJCXU2NCBpX3NwdXJfd3I6MTsKKwkJdTY0IGlfc3B1cl9yZDoxOworCQl1NjQgaV9yc3ZkOjExOworCQl1NjQgaV9tdWx0X2VycjoxOwogCX0gaWlfaXByYmVfZmxkX3M7CiB9IGlpX2lwcmJmX3VfdDsKIApAQCAtMTIzMiwxMCArMTIzMiwxMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9peGNjX3UgewotCXVpbnQ2NF90IGlpX2l4Y2NfcmVndmFsOworCXU2NCBpaV9peGNjX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX3RpbWVfb3V0OjI2OwotCQl1aW50NjRfdCBpX3JzdmQ6Mzg7CisJCXU2NCBpX3RpbWVfb3V0OjI2OworCQl1NjQgaV9yc3ZkOjM4OwogCX0gaWlfaXhjY19mbGRfczsKIH0gaWlfaXhjY191X3Q7CiAKQEAgLTEyNTYsMTYgKzEyNTYsMTYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaW1lbV91IHsKLQl1aW50NjRfdCBpaV9pbWVtX3JlZ3ZhbDsKKwl1NjQgaWlfaW1lbV9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV93MF9lc2Q6MTsKLQkJdWludDY0X3QgaV9yc3ZkXzM6MzsKLQkJdWludDY0X3QgaV9iMF9lc2Q6MTsKLQkJdWludDY0X3QgaV9yc3ZkXzI6MzsKLQkJdWludDY0X3QgaV9iMV9lc2Q6MTsKLQkJdWludDY0X3QgaV9yc3ZkXzE6MzsKLQkJdWludDY0X3QgaV9jbHJfcHJlY2lzZToxOwotCQl1aW50NjRfdCBpX3JzdmQ6NTE7CisJCXU2NCBpX3cwX2VzZDoxOworCQl1NjQgaV9yc3ZkXzM6MzsKKwkJdTY0IGlfYjBfZXNkOjE7CisJCXU2NCBpX3JzdmRfMjozOworCQl1NjQgaV9iMV9lc2Q6MTsKKwkJdTY0IGlfcnN2ZF8xOjM7CisJCXU2NCBpX2Nscl9wcmVjaXNlOjE7CisJCXU2NCBpX3JzdmQ6NTE7CiAJfSBpaV9pbWVtX2ZsZF9zOwogfSBpaV9pbWVtX3VfdDsKIApAQCAtMTI5NCwxMyArMTI5NCwxMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9peHR0X3UgewotCXVpbnQ2NF90IGlpX2l4dHRfcmVndmFsOworCXU2NCBpaV9peHR0X3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX3RhaWxfdG86MjY7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8xOjY7Ci0JCXVpbnQ2NF90IGlfcnJzcF9wczoyMzsKLQkJdWludDY0X3QgaV9ycnNwX3RvOjU7Ci0JCXVpbnQ2NF90IGlfcnN2ZDo0OworCQl1NjQgaV90YWlsX3RvOjI2OworCQl1NjQgaV9yc3ZkXzE6NjsKKwkJdTY0IGlfcnJzcF9wczoyMzsKKwkJdTY0IGlfcnJzcF90bzo1OworCQl1NjQgaV9yc3ZkOjQ7CiAJfSBpaV9peHR0X2ZsZF9zOwogfSBpaV9peHR0X3VfdDsKIApAQCAtMTMxNiwzNyArMTMxNiwzNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pZWNscl91IHsKLQl1aW50NjRfdCBpaV9pZWNscl9yZWd2YWw7CisJdTY0IGlpX2llY2xyX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX2VfcHJiXzA6MTsKLQkJdWludDY0X3QgaV9yc3ZkOjc7Ci0JCXVpbnQ2NF90IGlfZV9wcmJfODoxOwotCQl1aW50NjRfdCBpX2VfcHJiXzk6MTsKLQkJdWludDY0X3QgaV9lX3ByYl9hOjE7Ci0JCXVpbnQ2NF90IGlfZV9wcmJfYjoxOwotCQl1aW50NjRfdCBpX2VfcHJiX2M6MTsKLQkJdWludDY0X3QgaV9lX3ByYl9kOjE7Ci0JCXVpbnQ2NF90IGlfZV9wcmJfZToxOwotCQl1aW50NjRfdCBpX2VfcHJiX2Y6MTsKLQkJdWludDY0X3QgaV9lX2NyYXp5OjE7Ci0JCXVpbnQ2NF90IGlfZV9idGVfMDoxOwotCQl1aW50NjRfdCBpX2VfYnRlXzE6MTsKLQkJdWludDY0X3QgaV9yZXNlcnZlZF8xOjEwOwotCQl1aW50NjRfdCBpX3NwdXJfcmRfaGRyOjE7Ci0JCXVpbnQ2NF90IGlfY2FtX2ludHJfdG86MTsKLQkJdWludDY0X3QgaV9jYW1fb3ZlcmZsb3c6MTsKLQkJdWludDY0X3QgaV9jYW1fcmVhZF9taXNzOjE7Ci0JCXVpbnQ2NF90IGlfaW9xX3JlcF91bmRlcmZsb3c6MTsKLQkJdWludDY0X3QgaV9pb3FfcmVxX3VuZGVyZmxvdzoxOwotCQl1aW50NjRfdCBpX2lvcV9yZXBfb3ZlcmZsb3c6MTsKLQkJdWludDY0X3QgaV9pb3FfcmVxX292ZXJmbG93OjE7Ci0JCXVpbnQ2NF90IGlfaWlxX3JlcF9vdmVyZmxvdzoxOwotCQl1aW50NjRfdCBpX2lpcV9yZXFfb3ZlcmZsb3c6MTsKLQkJdWludDY0X3QgaV9paV94bl9yZXBfY3JlZF9vdmVyZmxvdzoxOwotCQl1aW50NjRfdCBpX2lpX3huX3JlcV9jcmVkX292ZXJmbG93OjE7Ci0JCXVpbnQ2NF90IGlfaWlfeG5faW52YWxpZF9jbWQ6MTsKLQkJdWludDY0X3QgaV94bl9paV9pbnZhbGlkX2NtZDoxOwotCQl1aW50NjRfdCBpX3Jlc2VydmVkXzI6MjE7CisJCXU2NCBpX2VfcHJiXzA6MTsKKwkJdTY0IGlfcnN2ZDo3OworCQl1NjQgaV9lX3ByYl84OjE7CisJCXU2NCBpX2VfcHJiXzk6MTsKKwkJdTY0IGlfZV9wcmJfYToxOworCQl1NjQgaV9lX3ByYl9iOjE7CisJCXU2NCBpX2VfcHJiX2M6MTsKKwkJdTY0IGlfZV9wcmJfZDoxOworCQl1NjQgaV9lX3ByYl9lOjE7CisJCXU2NCBpX2VfcHJiX2Y6MTsKKwkJdTY0IGlfZV9jcmF6eToxOworCQl1NjQgaV9lX2J0ZV8wOjE7CisJCXU2NCBpX2VfYnRlXzE6MTsKKwkJdTY0IGlfcmVzZXJ2ZWRfMToxMDsKKwkJdTY0IGlfc3B1cl9yZF9oZHI6MTsKKwkJdTY0IGlfY2FtX2ludHJfdG86MTsKKwkJdTY0IGlfY2FtX292ZXJmbG93OjE7CisJCXU2NCBpX2NhbV9yZWFkX21pc3M6MTsKKwkJdTY0IGlfaW9xX3JlcF91bmRlcmZsb3c6MTsKKwkJdTY0IGlfaW9xX3JlcV91bmRlcmZsb3c6MTsKKwkJdTY0IGlfaW9xX3JlcF9vdmVyZmxvdzoxOworCQl1NjQgaV9pb3FfcmVxX292ZXJmbG93OjE7CisJCXU2NCBpX2lpcV9yZXBfb3ZlcmZsb3c6MTsKKwkJdTY0IGlfaWlxX3JlcV9vdmVyZmxvdzoxOworCQl1NjQgaV9paV94bl9yZXBfY3JlZF9vdmVyZmxvdzoxOworCQl1NjQgaV9paV94bl9yZXFfY3JlZF9vdmVyZmxvdzoxOworCQl1NjQgaV9paV94bl9pbnZhbGlkX2NtZDoxOworCQl1NjQgaV94bl9paV9pbnZhbGlkX2NtZDoxOworCQl1NjQgaV9yZXNlcnZlZF8yOjIxOwogCX0gaWlfaWVjbHJfZmxkX3M7CiB9IGlpX2llY2xyX3VfdDsKIApAQCAtMTM2MCwxMiArMTM2MCwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pYmNyX3UgewotCXVpbnQ2NF90IGlpX2liY3JfcmVndmFsOworCXU2NCBpaV9pYmNyX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX2NvdW50OjQ7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8xOjQ7Ci0JCXVpbnQ2NF90IGlfc29mdF9yZXNldDoxOwotCQl1aW50NjRfdCBpX3JzdmQ6NTU7CisJCXU2NCBpX2NvdW50OjQ7CisJCXU2NCBpX3JzdmRfMTo0OworCQl1NjQgaV9zb2Z0X3Jlc2V0OjE7CisJCXU2NCBpX3JzdmQ6NTU7CiAJfSBpaV9pYmNyX2ZsZF9zOwogfSBpaV9pYmNyX3VfdDsKIApAQCAtMTM5OSwyMiArMTM5OSwyMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9peHNtX3UgewotCXVpbnQ2NF90IGlpX2l4c21fcmVndmFsOworCXU2NCBpaV9peHNtX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX2J5dGVfZW46MzI7Ci0JCXVpbnQ2NF90IGlfcmVzZXJ2ZWQ6MTsKLQkJdWludDY0X3QgaV90YWc6MzsKLQkJdWludDY0X3QgaV9hbHRfcGFjdHlwOjQ7Ci0JCXVpbnQ2NF90IGlfYm86MTsKLQkJdWludDY0X3QgaV9lcnJvcjoxOwotCQl1aW50NjRfdCBpX3ZicG06MTsKLQkJdWludDY0X3QgaV9nYnI6MTsKLQkJdWludDY0X3QgaV9kczoyOwotCQl1aW50NjRfdCBpX2N0OjE7Ci0JCXVpbnQ2NF90IGlfdG51bTo1OwotCQl1aW50NjRfdCBpX3BhY3R5cDo0OwotCQl1aW50NjRfdCBpX3NpZG46NDsKLQkJdWludDY0X3QgaV9kaWRuOjQ7CisJCXU2NCBpX2J5dGVfZW46MzI7CisJCXU2NCBpX3Jlc2VydmVkOjE7CisJCXU2NCBpX3RhZzozOworCQl1NjQgaV9hbHRfcGFjdHlwOjQ7CisJCXU2NCBpX2JvOjE7CisJCXU2NCBpX2Vycm9yOjE7CisJCXU2NCBpX3ZicG06MTsKKwkJdTY0IGlfZ2JyOjE7CisJCXU2NCBpX2RzOjI7CisJCXU2NCBpX2N0OjE7CisJCXU2NCBpX3RudW06NTsKKwkJdTY0IGlfcGFjdHlwOjQ7CisJCXU2NCBpX3NpZG46NDsKKwkJdTY0IGlfZGlkbjo0OwogCX0gaWlfaXhzbV9mbGRfczsKIH0gaWlfaXhzbV91X3Q7CiAKQEAgLTE0MjYsMTEgKzE0MjYsMTEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaXhzc191IHsKLQl1aW50NjRfdCBpaV9peHNzX3JlZ3ZhbDsKKwl1NjQgaWlfaXhzc19yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9zaWRlYmFuZDo4OwotCQl1aW50NjRfdCBpX3JzdmQ6NTU7Ci0JCXVpbnQ2NF90IGlfdmFsaWQ6MTsKKwkJdTY0IGlfc2lkZWJhbmQ6ODsKKwkJdTY0IGlfcnN2ZDo1NTsKKwkJdTY0IGlfdmFsaWQ6MTsKIAl9IGlpX2l4c3NfZmxkX3M7CiB9IGlpX2l4c3NfdV90OwogCkBAIC0xNDQ3LDE3ICsxNDQ3LDE3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2lsY3RfdSB7Ci0JdWludDY0X3QgaWlfaWxjdF9yZWd2YWw7CisJdTY0IGlpX2lsY3RfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfdGVzdF9zZWVkOjIwOwotCQl1aW50NjRfdCBpX3Rlc3RfbWFzazo4OwotCQl1aW50NjRfdCBpX3Rlc3RfZGF0YToyMDsKLQkJdWludDY0X3QgaV90ZXN0X3ZhbGlkOjE7Ci0JCXVpbnQ2NF90IGlfdGVzdF9jYmVycjoxOwotCQl1aW50NjRfdCBpX3Rlc3RfZmxpdDozOwotCQl1aW50NjRfdCBpX3Rlc3RfY2xlYXI6MTsKLQkJdWludDY0X3QgaV90ZXN0X2Vycl9jYXB0dXJlOjE7Ci0JCXVpbnQ2NF90IGlfcnN2ZDo5OworCQl1NjQgaV90ZXN0X3NlZWQ6MjA7CisJCXU2NCBpX3Rlc3RfbWFzazo4OworCQl1NjQgaV90ZXN0X2RhdGE6MjA7CisJCXU2NCBpX3Rlc3RfdmFsaWQ6MTsKKwkJdTY0IGlfdGVzdF9jYmVycjoxOworCQl1NjQgaV90ZXN0X2ZsaXQ6MzsKKwkJdTY0IGlfdGVzdF9jbGVhcjoxOworCQl1NjQgaV90ZXN0X2Vycl9jYXB0dXJlOjE7CisJCXU2NCBpX3JzdmQ6OTsKIAl9IGlpX2lsY3RfZmxkX3M7CiB9IGlpX2lsY3RfdV90OwogCkBAIC0xNDgyLDIwICsxNDgyLDIwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2lpZXBoMV91IHsKLQl1aW50NjRfdCBpaV9paWVwaDFfcmVndmFsOworCXU2NCBpaV9paWVwaDFfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfY29tbWFuZDo3OwotCQl1aW50NjRfdCBpX3JzdmRfNToxOwotCQl1aW50NjRfdCBpX3N1cHBsOjE0OwotCQl1aW50NjRfdCBpX3JzdmRfNDoxOwotCQl1aW50NjRfdCBpX3NvdXJjZToxNDsKLQkJdWludDY0X3QgaV9yc3ZkXzM6MTsKLQkJdWludDY0X3QgaV9lcnJfdHlwZTo0OwotCQl1aW50NjRfdCBpX3JzdmRfMjo0OwotCQl1aW50NjRfdCBpX292ZXJydW46MTsKLQkJdWludDY0X3QgaV9yc3ZkXzE6MzsKLQkJdWludDY0X3QgaV92YWxpZDoxOwotCQl1aW50NjRfdCBpX3JzdmQ6MTM7CisJCXU2NCBpX2NvbW1hbmQ6NzsKKwkJdTY0IGlfcnN2ZF81OjE7CisJCXU2NCBpX3N1cHBsOjE0OworCQl1NjQgaV9yc3ZkXzQ6MTsKKwkJdTY0IGlfc291cmNlOjE0OworCQl1NjQgaV9yc3ZkXzM6MTsKKwkJdTY0IGlfZXJyX3R5cGU6NDsKKwkJdTY0IGlfcnN2ZF8yOjQ7CisJCXU2NCBpX292ZXJydW46MTsKKwkJdTY0IGlfcnN2ZF8xOjM7CisJCXU2NCBpX3ZhbGlkOjE7CisJCXU2NCBpX3JzdmQ6MTM7CiAJfSBpaV9paWVwaDFfZmxkX3M7CiB9IGlpX2lpZXBoMV91X3Q7CiAKQEAgLTE1MTEsMTMgKzE1MTEsMTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaWllcGgyX3UgewotCXVpbnQ2NF90IGlpX2lpZXBoMl9yZWd2YWw7CisJdTY0IGlpX2lpZXBoMl9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9yc3ZkXzA6MzsKLQkJdWludDY0X3QgaV9hZGRyZXNzOjQ3OwotCQl1aW50NjRfdCBpX3JzdmRfMToxMDsKLQkJdWludDY0X3QgaV90YWlsOjE7Ci0JCXVpbnQ2NF90IGlfcnN2ZDozOworCQl1NjQgaV9yc3ZkXzA6MzsKKwkJdTY0IGlfYWRkcmVzczo0NzsKKwkJdTY0IGlfcnN2ZF8xOjEwOworCQl1NjQgaV90YWlsOjE7CisJCXU2NCBpX3JzdmQ6MzsKIAl9IGlpX2lpZXBoMl9mbGRfczsKIH0gaWlfaWllcGgyX3VfdDsKIApAQCAtMTUzMiw5ICsxNTMyLDkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaXNsYXByX3UgewotCXVpbnQ2NF90IGlpX2lzbGFwcl9yZWd2YWw7CisJdTY0IGlpX2lzbGFwcl9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9yZWdpb246NjQ7CisJCXU2NCBpX3JlZ2lvbjo2NDsKIAl9IGlpX2lzbGFwcl9mbGRfczsKIH0gaWlfaXNsYXByX3VfdDsKIApAQCAtMTU0NywxMCArMTU0NywxMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pc2xhcG9fdSB7Ci0JdWludDY0X3QgaWlfaXNsYXBvX3JlZ3ZhbDsKKwl1NjQgaWlfaXNsYXBvX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX2lvX3NieF9vdnJyaWRlOjU2OwotCQl1aW50NjRfdCBpX3JzdmQ6ODsKKwkJdTY0IGlfaW9fc2J4X292cnJpZGU6NTY7CisJCXU2NCBpX3JzdmQ6ODsKIAl9IGlpX2lzbGFwb19mbGRfczsKIH0gaWlfaXNsYXBvX3VfdDsKIApAQCAtMTU2MywxNCArMTU2MywxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pd2lfdSB7Ci0JdWludDY0X3QgaWlfaXdpX3JlZ3ZhbDsKKwl1NjQgaWlfaXdpX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX3ByZXNjYWxlOjI0OwotCQl1aW50NjRfdCBpX3JzdmQ6ODsKLQkJdWludDY0X3QgaV90aW1lb3V0Ojg7Ci0JCXVpbnQ2NF90IGlfcnN2ZDE6ODsKLQkJdWludDY0X3QgaV9pbnRycHRfcmV0cnlfcGVyaW9kOjg7Ci0JCXVpbnQ2NF90IGlfcnN2ZDI6ODsKKwkJdTY0IGlfcHJlc2NhbGU6MjQ7CisJCXU2NCBpX3JzdmQ6ODsKKwkJdTY0IGlfdGltZW91dDo4OworCQl1NjQgaV9yc3ZkMTo4OworCQl1NjQgaV9pbnRycHRfcmV0cnlfcGVyaW9kOjg7CisJCXU2NCBpX3JzdmQyOjg7CiAJfSBpaV9pd2lfZmxkX3M7CiB9IGlpX2l3aV91X3Q7CiAKQEAgLTE1ODIsMjYgKzE1ODIsMjYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaXdlbF91IHsKLQl1aW50NjRfdCBpaV9pd2VsX3JlZ3ZhbDsKKwl1NjQgaWlfaXdlbF9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9pbnRyX3RpbWVkX291dDoxOwotCQl1aW50NjRfdCBpX3JzdmQ6NzsKLQkJdWludDY0X3QgaV9jYW1fb3ZlcmZsb3c6MTsKLQkJdWludDY0X3QgaV9jYW1fcmVhZF9taXNzOjE7Ci0JCXVpbnQ2NF90IGlfcnN2ZDE6MjsKLQkJdWludDY0X3QgaV9pb3FfcmVwX3VuZGVyZmxvdzoxOwotCQl1aW50NjRfdCBpX2lvcV9yZXFfdW5kZXJmbG93OjE7Ci0JCXVpbnQ2NF90IGlfaW9xX3JlcF9vdmVyZmxvdzoxOwotCQl1aW50NjRfdCBpX2lvcV9yZXFfb3ZlcmZsb3c6MTsKLQkJdWludDY0X3QgaV9paXFfcmVwX292ZXJmbG93OjE7Ci0JCXVpbnQ2NF90IGlfaWlxX3JlcV9vdmVyZmxvdzoxOwotCQl1aW50NjRfdCBpX3JzdmQyOjY7Ci0JCXVpbnQ2NF90IGlfaWlfeG5fcmVwX2NyZWRfb3Zlcl91bmRlcjoxOwotCQl1aW50NjRfdCBpX2lpX3huX3JlcV9jcmVkX292ZXJfdW5kZXI6MTsKLQkJdWludDY0X3QgaV9yc3ZkMzo2OwotCQl1aW50NjRfdCBpX2lpX3huX2ludmFsaWRfY21kOjE7Ci0JCXVpbnQ2NF90IGlfeG5faWlfaW52YWxpZF9jbWQ6MTsKLQkJdWludDY0X3QgaV9yc3ZkNDozMDsKKwkJdTY0IGlfaW50cl90aW1lZF9vdXQ6MTsKKwkJdTY0IGlfcnN2ZDo3OworCQl1NjQgaV9jYW1fb3ZlcmZsb3c6MTsKKwkJdTY0IGlfY2FtX3JlYWRfbWlzczoxOworCQl1NjQgaV9yc3ZkMToyOworCQl1NjQgaV9pb3FfcmVwX3VuZGVyZmxvdzoxOworCQl1NjQgaV9pb3FfcmVxX3VuZGVyZmxvdzoxOworCQl1NjQgaV9pb3FfcmVwX292ZXJmbG93OjE7CisJCXU2NCBpX2lvcV9yZXFfb3ZlcmZsb3c6MTsKKwkJdTY0IGlfaWlxX3JlcF9vdmVyZmxvdzoxOworCQl1NjQgaV9paXFfcmVxX292ZXJmbG93OjE7CisJCXU2NCBpX3JzdmQyOjY7CisJCXU2NCBpX2lpX3huX3JlcF9jcmVkX292ZXJfdW5kZXI6MTsKKwkJdTY0IGlfaWlfeG5fcmVxX2NyZWRfb3Zlcl91bmRlcjoxOworCQl1NjQgaV9yc3ZkMzo2OworCQl1NjQgaV9paV94bl9pbnZhbGlkX2NtZDoxOworCQl1NjQgaV94bl9paV9pbnZhbGlkX2NtZDoxOworCQl1NjQgaV9yc3ZkNDozMDsKIAl9IGlpX2l3ZWxfZmxkX3M7CiB9IGlpX2l3ZWxfdV90OwogCkBAIC0xNjEyLDIyICsxNjEyLDIyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2l3Y191IHsKLQl1aW50NjRfdCBpaV9pd2NfcmVndmFsOworCXU2NCBpaV9pd2NfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfZG1hX2J5dGVfc3dhcDoxOwotCQl1aW50NjRfdCBpX3JzdmQ6MzsKLQkJdWludDY0X3QgaV9jYW1fcmVhZF9saW5lc19yZXNldDoxOwotCQl1aW50NjRfdCBpX3JzdmQxOjM7Ci0JCXVpbnQ2NF90IGlfaWlfeG5fY3JlZF9vdmVyX3VuZGVyX2xvZzoxOwotCQl1aW50NjRfdCBpX3JzdmQyOjE5OwotCQl1aW50NjRfdCBpX3huX3JlcF9pcV9kZXB0aDo1OwotCQl1aW50NjRfdCBpX3JzdmQzOjM7Ci0JCXVpbnQ2NF90IGlfeG5fcmVxX2lxX2RlcHRoOjU7Ci0JCXVpbnQ2NF90IGlfcnN2ZDQ6MzsKLQkJdWludDY0X3QgaV9paXFfZGVwdGg6NjsKLQkJdWludDY0X3QgaV9yc3ZkNToxMjsKLQkJdWludDY0X3QgaV9mb3JjZV9yZXBfY3JlZDoxOwotCQl1aW50NjRfdCBpX2ZvcmNlX3JlcV9jcmVkOjE7CisJCXU2NCBpX2RtYV9ieXRlX3N3YXA6MTsKKwkJdTY0IGlfcnN2ZDozOworCQl1NjQgaV9jYW1fcmVhZF9saW5lc19yZXNldDoxOworCQl1NjQgaV9yc3ZkMTozOworCQl1NjQgaV9paV94bl9jcmVkX292ZXJfdW5kZXJfbG9nOjE7CisJCXU2NCBpX3JzdmQyOjE5OworCQl1NjQgaV94bl9yZXBfaXFfZGVwdGg6NTsKKwkJdTY0IGlfcnN2ZDM6MzsKKwkJdTY0IGlfeG5fcmVxX2lxX2RlcHRoOjU7CisJCXU2NCBpX3JzdmQ0OjM7CisJCXU2NCBpX2lpcV9kZXB0aDo2OworCQl1NjQgaV9yc3ZkNToxMjsKKwkJdTY0IGlfZm9yY2VfcmVwX2NyZWQ6MTsKKwkJdTY0IGlfZm9yY2VfcmVxX2NyZWQ6MTsKIAl9IGlpX2l3Y19mbGRfczsKIH0gaWlfaXdjX3VfdDsKIApAQCAtMTYzOCwxMiArMTYzOCwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pd3NfdSB7Ci0JdWludDY0X3QgaWlfaXdzX3JlZ3ZhbDsKKwl1NjQgaWlfaXdzX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX3huX3JlcF9pcV9jcmVkaXRzOjU7Ci0JCXVpbnQ2NF90IGlfcnN2ZDozOwotCQl1aW50NjRfdCBpX3huX3JlcV9pcV9jcmVkaXRzOjU7Ci0JCXVpbnQ2NF90IGlfcnN2ZDE6NTE7CisJCXU2NCBpX3huX3JlcF9pcV9jcmVkaXRzOjU7CisJCXU2NCBpX3JzdmQ6MzsKKwkJdTY0IGlfeG5fcmVxX2lxX2NyZWRpdHM6NTsKKwkJdTY0IGlfcnN2ZDE6NTE7CiAJfSBpaV9pd3NfZmxkX3M7CiB9IGlpX2l3c191X3Q7CiAKQEAgLTE2NTQsMjYgKzE2NTQsMjYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaXdlaW1fdSB7Ci0JdWludDY0X3QgaWlfaXdlaW1fcmVndmFsOworCXU2NCBpaV9pd2VpbV9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9pbnRyX3RpbWVkX291dDoxOwotCQl1aW50NjRfdCBpX3JzdmQ6NzsKLQkJdWludDY0X3QgaV9jYW1fb3ZlcmZsb3c6MTsKLQkJdWludDY0X3QgaV9jYW1fcmVhZF9taXNzOjE7Ci0JCXVpbnQ2NF90IGlfcnN2ZDE6MjsKLQkJdWludDY0X3QgaV9pb3FfcmVwX3VuZGVyZmxvdzoxOwotCQl1aW50NjRfdCBpX2lvcV9yZXFfdW5kZXJmbG93OjE7Ci0JCXVpbnQ2NF90IGlfaW9xX3JlcF9vdmVyZmxvdzoxOwotCQl1aW50NjRfdCBpX2lvcV9yZXFfb3ZlcmZsb3c6MTsKLQkJdWludDY0X3QgaV9paXFfcmVwX292ZXJmbG93OjE7Ci0JCXVpbnQ2NF90IGlfaWlxX3JlcV9vdmVyZmxvdzoxOwotCQl1aW50NjRfdCBpX3JzdmQyOjY7Ci0JCXVpbnQ2NF90IGlfaWlfeG5fcmVwX2NyZWRfb3ZlcmZsb3c6MTsKLQkJdWludDY0X3QgaV9paV94bl9yZXFfY3JlZF9vdmVyZmxvdzoxOwotCQl1aW50NjRfdCBpX3JzdmQzOjY7Ci0JCXVpbnQ2NF90IGlfaWlfeG5faW52YWxpZF9jbWQ6MTsKLQkJdWludDY0X3QgaV94bl9paV9pbnZhbGlkX2NtZDoxOwotCQl1aW50NjRfdCBpX3JzdmQ0OjMwOworCQl1NjQgaV9pbnRyX3RpbWVkX291dDoxOworCQl1NjQgaV9yc3ZkOjc7CisJCXU2NCBpX2NhbV9vdmVyZmxvdzoxOworCQl1NjQgaV9jYW1fcmVhZF9taXNzOjE7CisJCXU2NCBpX3JzdmQxOjI7CisJCXU2NCBpX2lvcV9yZXBfdW5kZXJmbG93OjE7CisJCXU2NCBpX2lvcV9yZXFfdW5kZXJmbG93OjE7CisJCXU2NCBpX2lvcV9yZXBfb3ZlcmZsb3c6MTsKKwkJdTY0IGlfaW9xX3JlcV9vdmVyZmxvdzoxOworCQl1NjQgaV9paXFfcmVwX292ZXJmbG93OjE7CisJCXU2NCBpX2lpcV9yZXFfb3ZlcmZsb3c6MTsKKwkJdTY0IGlfcnN2ZDI6NjsKKwkJdTY0IGlfaWlfeG5fcmVwX2NyZWRfb3ZlcmZsb3c6MTsKKwkJdTY0IGlfaWlfeG5fcmVxX2NyZWRfb3ZlcmZsb3c6MTsKKwkJdTY0IGlfcnN2ZDM6NjsKKwkJdTY0IGlfaWlfeG5faW52YWxpZF9jbWQ6MTsKKwkJdTY0IGlfeG5faWlfaW52YWxpZF9jbWQ6MTsKKwkJdTY0IGlfcnN2ZDQ6MzA7CiAJfSBpaV9pd2VpbV9mbGRfczsKIH0gaWlfaXdlaW1fdV90OwogCkBAIC0xNjg4LDEzICsxNjg4LDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2lwY2FfdSB7Ci0JdWludDY0X3QgaWlfaXBjYV9yZWd2YWw7CisJdTY0IGlpX2lwY2FfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfd2lkOjQ7Ci0JCXVpbnQ2NF90IGlfYWRqdXN0OjE7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8xOjM7Ci0JCXVpbnQ2NF90IGlfZmllbGQ6MjsKLQkJdWludDY0X3QgaV9yc3ZkOjU0OworCQl1NjQgaV93aWQ6NDsKKwkJdTY0IGlfYWRqdXN0OjE7CisJCXU2NCBpX3JzdmRfMTozOworCQl1NjQgaV9maWVsZDoyOworCQl1NjQgaV9yc3ZkOjU0OwogCX0gaWlfaXBjYV9mbGRfczsKIH0gaWlfaXBjYV91X3Q7CiAKQEAgLTE3MDksMTIgKzE3MDksMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaXBydGUwYV91IHsKLQl1aW50NjRfdCBpaV9pcHJ0ZTBhX3JlZ3ZhbDsKKwl1NjQgaWlfaXBydGUwYV9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9yc3ZkXzE6NTQ7Ci0JCXVpbnQ2NF90IGlfd2lkZ2V0OjQ7Ci0JCXVpbnQ2NF90IGlfdG9fY250OjU7Ci0JCXVpbnQ2NF90IGlfdmxkOjE7CisJCXU2NCBpX3JzdmRfMTo1NDsKKwkJdTY0IGlfd2lkZ2V0OjQ7CisJCXU2NCBpX3RvX2NudDo1OworCQl1NjQgaV92bGQ6MTsKIAl9IGlpX2lwcnRlMGFfZmxkX3M7CiB9IGlpX2lwcnRlMGFfdV90OwogCkBAIC0xNzI5LDEyICsxNzI5LDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2lwcnRlMWFfdSB7Ci0JdWludDY0X3QgaWlfaXBydGUxYV9yZWd2YWw7CisJdTY0IGlpX2lwcnRlMWFfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8xOjU0OwotCQl1aW50NjRfdCBpX3dpZGdldDo0OwotCQl1aW50NjRfdCBpX3RvX2NudDo1OwotCQl1aW50NjRfdCBpX3ZsZDoxOworCQl1NjQgaV9yc3ZkXzE6NTQ7CisJCXU2NCBpX3dpZGdldDo0OworCQl1NjQgaV90b19jbnQ6NTsKKwkJdTY0IGlfdmxkOjE7CiAJfSBpaV9pcHJ0ZTFhX2ZsZF9zOwogfSBpaV9pcHJ0ZTFhX3VfdDsKIApAQCAtMTc0OSwxMiArMTc0OSwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pcHJ0ZTJhX3UgewotCXVpbnQ2NF90IGlpX2lwcnRlMmFfcmVndmFsOworCXU2NCBpaV9pcHJ0ZTJhX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX3JzdmRfMTo1NDsKLQkJdWludDY0X3QgaV93aWRnZXQ6NDsKLQkJdWludDY0X3QgaV90b19jbnQ6NTsKLQkJdWludDY0X3QgaV92bGQ6MTsKKwkJdTY0IGlfcnN2ZF8xOjU0OworCQl1NjQgaV93aWRnZXQ6NDsKKwkJdTY0IGlfdG9fY250OjU7CisJCXU2NCBpX3ZsZDoxOwogCX0gaWlfaXBydGUyYV9mbGRfczsKIH0gaWlfaXBydGUyYV91X3Q7CiAKQEAgLTE3NjksMTIgKzE3NjksMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaXBydGUzYV91IHsKLQl1aW50NjRfdCBpaV9pcHJ0ZTNhX3JlZ3ZhbDsKKwl1NjQgaWlfaXBydGUzYV9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9yc3ZkXzE6NTQ7Ci0JCXVpbnQ2NF90IGlfd2lkZ2V0OjQ7Ci0JCXVpbnQ2NF90IGlfdG9fY250OjU7Ci0JCXVpbnQ2NF90IGlfdmxkOjE7CisJCXU2NCBpX3JzdmRfMTo1NDsKKwkJdTY0IGlfd2lkZ2V0OjQ7CisJCXU2NCBpX3RvX2NudDo1OworCQl1NjQgaV92bGQ6MTsKIAl9IGlpX2lwcnRlM2FfZmxkX3M7CiB9IGlpX2lwcnRlM2FfdV90OwogCkBAIC0xNzg5LDEyICsxNzg5LDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2lwcnRlNGFfdSB7Ci0JdWludDY0X3QgaWlfaXBydGU0YV9yZWd2YWw7CisJdTY0IGlpX2lwcnRlNGFfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8xOjU0OwotCQl1aW50NjRfdCBpX3dpZGdldDo0OwotCQl1aW50NjRfdCBpX3RvX2NudDo1OwotCQl1aW50NjRfdCBpX3ZsZDoxOworCQl1NjQgaV9yc3ZkXzE6NTQ7CisJCXU2NCBpX3dpZGdldDo0OworCQl1NjQgaV90b19jbnQ6NTsKKwkJdTY0IGlfdmxkOjE7CiAJfSBpaV9pcHJ0ZTRhX2ZsZF9zOwogfSBpaV9pcHJ0ZTRhX3VfdDsKIApAQCAtMTgwOSwxMiArMTgwOSwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pcHJ0ZTVhX3UgewotCXVpbnQ2NF90IGlpX2lwcnRlNWFfcmVndmFsOworCXU2NCBpaV9pcHJ0ZTVhX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX3JzdmRfMTo1NDsKLQkJdWludDY0X3QgaV93aWRnZXQ6NDsKLQkJdWludDY0X3QgaV90b19jbnQ6NTsKLQkJdWludDY0X3QgaV92bGQ6MTsKKwkJdTY0IGlfcnN2ZF8xOjU0OworCQl1NjQgaV93aWRnZXQ6NDsKKwkJdTY0IGlfdG9fY250OjU7CisJCXU2NCBpX3ZsZDoxOwogCX0gaWlfaXBydGU1YV9mbGRfczsKIH0gaWlfaXBydGU1YV91X3Q7CiAKQEAgLTE4MjksMTIgKzE4MjksMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaXBydGU2YV91IHsKLQl1aW50NjRfdCBpaV9pcHJ0ZTZhX3JlZ3ZhbDsKKwl1NjQgaWlfaXBydGU2YV9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9yc3ZkXzE6NTQ7Ci0JCXVpbnQ2NF90IGlfd2lkZ2V0OjQ7Ci0JCXVpbnQ2NF90IGlfdG9fY250OjU7Ci0JCXVpbnQ2NF90IGlfdmxkOjE7CisJCXU2NCBpX3JzdmRfMTo1NDsKKwkJdTY0IGlfd2lkZ2V0OjQ7CisJCXU2NCBpX3RvX2NudDo1OworCQl1NjQgaV92bGQ6MTsKIAl9IGlpX2lwcnRlNmFfZmxkX3M7CiB9IGlpX2lwcnRlNmFfdV90OwogCkBAIC0xODQ5LDEyICsxODQ5LDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2lwcnRlN2FfdSB7Ci0JdWludDY0X3QgaWlfaXBydGU3YV9yZWd2YWw7CisJdTY0IGlpX2lwcnRlN2FfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8xOjU0OwotCQl1aW50NjRfdCBpX3dpZGdldDo0OwotCQl1aW50NjRfdCBpX3RvX2NudDo1OwotCQl1aW50NjRfdCBpX3ZsZDoxOworCQl1NjQgaV9yc3ZkXzE6NTQ7CisJCXU2NCBpX3dpZGdldDo0OworCQl1NjQgaV90b19jbnQ6NTsKKwkJdTY0IGlfdmxkOjE7CiAJfSBpaV9pcHJ0ZWE3X2ZsZF9zOwogfSBpaV9pcHJ0ZTdhX3VfdDsKIApAQCAtMTg2OSwxMiArMTg2OSwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pcHJ0ZTBiX3UgewotCXVpbnQ2NF90IGlpX2lwcnRlMGJfcmVndmFsOworCXU2NCBpaV9pcHJ0ZTBiX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX3JzdmRfMTozOwotCQl1aW50NjRfdCBpX2FkZHJlc3M6NDc7Ci0JCXVpbnQ2NF90IGlfaW5pdDozOwotCQl1aW50NjRfdCBpX3NvdXJjZToxMTsKKwkJdTY0IGlfcnN2ZF8xOjM7CisJCXU2NCBpX2FkZHJlc3M6NDc7CisJCXU2NCBpX2luaXQ6MzsKKwkJdTY0IGlfc291cmNlOjExOwogCX0gaWlfaXBydGUwYl9mbGRfczsKIH0gaWlfaXBydGUwYl91X3Q7CiAKQEAgLTE4ODksMTIgKzE4ODksMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaXBydGUxYl91IHsKLQl1aW50NjRfdCBpaV9pcHJ0ZTFiX3JlZ3ZhbDsKKwl1NjQgaWlfaXBydGUxYl9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9yc3ZkXzE6MzsKLQkJdWludDY0X3QgaV9hZGRyZXNzOjQ3OwotCQl1aW50NjRfdCBpX2luaXQ6MzsKLQkJdWludDY0X3QgaV9zb3VyY2U6MTE7CisJCXU2NCBpX3JzdmRfMTozOworCQl1NjQgaV9hZGRyZXNzOjQ3OworCQl1NjQgaV9pbml0OjM7CisJCXU2NCBpX3NvdXJjZToxMTsKIAl9IGlpX2lwcnRlMWJfZmxkX3M7CiB9IGlpX2lwcnRlMWJfdV90OwogCkBAIC0xOTA5LDEyICsxOTA5LDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2lwcnRlMmJfdSB7Ci0JdWludDY0X3QgaWlfaXBydGUyYl9yZWd2YWw7CisJdTY0IGlpX2lwcnRlMmJfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8xOjM7Ci0JCXVpbnQ2NF90IGlfYWRkcmVzczo0NzsKLQkJdWludDY0X3QgaV9pbml0OjM7Ci0JCXVpbnQ2NF90IGlfc291cmNlOjExOworCQl1NjQgaV9yc3ZkXzE6MzsKKwkJdTY0IGlfYWRkcmVzczo0NzsKKwkJdTY0IGlfaW5pdDozOworCQl1NjQgaV9zb3VyY2U6MTE7CiAJfSBpaV9pcHJ0ZTJiX2ZsZF9zOwogfSBpaV9pcHJ0ZTJiX3VfdDsKIApAQCAtMTkyOSwxMiArMTkyOSwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pcHJ0ZTNiX3UgewotCXVpbnQ2NF90IGlpX2lwcnRlM2JfcmVndmFsOworCXU2NCBpaV9pcHJ0ZTNiX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX3JzdmRfMTozOwotCQl1aW50NjRfdCBpX2FkZHJlc3M6NDc7Ci0JCXVpbnQ2NF90IGlfaW5pdDozOwotCQl1aW50NjRfdCBpX3NvdXJjZToxMTsKKwkJdTY0IGlfcnN2ZF8xOjM7CisJCXU2NCBpX2FkZHJlc3M6NDc7CisJCXU2NCBpX2luaXQ6MzsKKwkJdTY0IGlfc291cmNlOjExOwogCX0gaWlfaXBydGUzYl9mbGRfczsKIH0gaWlfaXBydGUzYl91X3Q7CiAKQEAgLTE5NDksMTIgKzE5NDksMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaXBydGU0Yl91IHsKLQl1aW50NjRfdCBpaV9pcHJ0ZTRiX3JlZ3ZhbDsKKwl1NjQgaWlfaXBydGU0Yl9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9yc3ZkXzE6MzsKLQkJdWludDY0X3QgaV9hZGRyZXNzOjQ3OwotCQl1aW50NjRfdCBpX2luaXQ6MzsKLQkJdWludDY0X3QgaV9zb3VyY2U6MTE7CisJCXU2NCBpX3JzdmRfMTozOworCQl1NjQgaV9hZGRyZXNzOjQ3OworCQl1NjQgaV9pbml0OjM7CisJCXU2NCBpX3NvdXJjZToxMTsKIAl9IGlpX2lwcnRlNGJfZmxkX3M7CiB9IGlpX2lwcnRlNGJfdV90OwogCkBAIC0xOTY5LDEyICsxOTY5LDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2lwcnRlNWJfdSB7Ci0JdWludDY0X3QgaWlfaXBydGU1Yl9yZWd2YWw7CisJdTY0IGlpX2lwcnRlNWJfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8xOjM7Ci0JCXVpbnQ2NF90IGlfYWRkcmVzczo0NzsKLQkJdWludDY0X3QgaV9pbml0OjM7Ci0JCXVpbnQ2NF90IGlfc291cmNlOjExOworCQl1NjQgaV9yc3ZkXzE6MzsKKwkJdTY0IGlfYWRkcmVzczo0NzsKKwkJdTY0IGlfaW5pdDozOworCQl1NjQgaV9zb3VyY2U6MTE7CiAJfSBpaV9pcHJ0ZTViX2ZsZF9zOwogfSBpaV9pcHJ0ZTViX3VfdDsKIApAQCAtMTk4OSwxMiArMTk4OSwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pcHJ0ZTZiX3UgewotCXVpbnQ2NF90IGlpX2lwcnRlNmJfcmVndmFsOworCXU2NCBpaV9pcHJ0ZTZiX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX3JzdmRfMTozOwotCQl1aW50NjRfdCBpX2FkZHJlc3M6NDc7Ci0JCXVpbnQ2NF90IGlfaW5pdDozOwotCQl1aW50NjRfdCBpX3NvdXJjZToxMTsKKwkJdTY0IGlfcnN2ZF8xOjM7CisJCXU2NCBpX2FkZHJlc3M6NDc7CisJCXU2NCBpX2luaXQ6MzsKKwkJdTY0IGlfc291cmNlOjExOwogCiAJfSBpaV9pcHJ0ZTZiX2ZsZF9zOwogfSBpaV9pcHJ0ZTZiX3VfdDsKQEAgLTIwMTAsMTIgKzIwMTAsMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaXBydGU3Yl91IHsKLQl1aW50NjRfdCBpaV9pcHJ0ZTdiX3JlZ3ZhbDsKKwl1NjQgaWlfaXBydGU3Yl9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9yc3ZkXzE6MzsKLQkJdWludDY0X3QgaV9hZGRyZXNzOjQ3OwotCQl1aW50NjRfdCBpX2luaXQ6MzsKLQkJdWludDY0X3QgaV9zb3VyY2U6MTE7CisJCXU2NCBpX3JzdmRfMTozOworCQl1NjQgaV9hZGRyZXNzOjQ3OworCQl1NjQgaV9pbml0OjM7CisJCXU2NCBpX3NvdXJjZToxMTsKIAl9IGlpX2lwcnRlN2JfZmxkX3M7CiB9IGlpX2lwcnRlN2JfdV90OwogCkBAIC0yMDM4LDEzICsyMDM4LDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2lwZHJfdSB7Ci0JdWludDY0X3QgaWlfaXBkcl9yZWd2YWw7CisJdTY0IGlpX2lwZHJfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfdGU6MzsKLQkJdWludDY0X3QgaV9yc3ZkXzE6MTsKLQkJdWludDY0X3QgaV9wbmQ6MTsKLQkJdWludDY0X3QgaV9pbml0X3JwY250OjE7Ci0JCXVpbnQ2NF90IGlfcnN2ZDo1ODsKKwkJdTY0IGlfdGU6MzsKKwkJdTY0IGlfcnN2ZF8xOjE7CisJCXU2NCBpX3BuZDoxOworCQl1NjQgaV9pbml0X3JwY250OjE7CisJCXU2NCBpX3JzdmQ6NTg7CiAJfSBpaV9pcGRyX2ZsZF9zOwogfSBpaV9pcGRyX3VfdDsKIApAQCAtMjA2NiwxMSArMjA2NiwxMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pY2RyX3UgewotCXVpbnQ2NF90IGlpX2ljZHJfcmVndmFsOworCXU2NCBpaV9pY2RyX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX2NyYl9udW06NDsKLQkJdWludDY0X3QgaV9wbmQ6MTsKLQkJdWludDY0X3QgaV9yc3ZkOjU5OworCQl1NjQgaV9jcmJfbnVtOjQ7CisJCXU2NCBpX3BuZDoxOworCQl1NjQgaV9yc3ZkOjU5OwogCX0gaWlfaWNkcl9mbGRfczsKIH0gaWlfaWNkcl91X3Q7CiAKQEAgLTIwOTIsMTMgKzIwOTIsMTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaWZkcl91IHsKLQl1aW50NjRfdCBpaV9pZmRyX3JlZ3ZhbDsKKwl1NjQgaWlfaWZkcl9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9pb3FfbWF4X3JxOjc7Ci0JCXVpbnQ2NF90IGlfc2V0X2lvcV9ycToxOwotCQl1aW50NjRfdCBpX2lvcV9tYXhfcnA6NzsKLQkJdWludDY0X3QgaV9zZXRfaW9xX3JwOjE7Ci0JCXVpbnQ2NF90IGlfcnN2ZDo0ODsKKwkJdTY0IGlfaW9xX21heF9ycTo3OworCQl1NjQgaV9zZXRfaW9xX3JxOjE7CisJCXU2NCBpX2lvcV9tYXhfcnA6NzsKKwkJdTY0IGlfc2V0X2lvcV9ycDoxOworCQl1NjQgaV9yc3ZkOjQ4OwogCX0gaWlfaWZkcl9mbGRfczsKIH0gaWlfaWZkcl91X3Q7CiAKQEAgLTIxMTQsMTIgKzIxMTQsMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaWlhcF91IHsKLQl1aW50NjRfdCBpaV9paWFwX3JlZ3ZhbDsKKwl1NjQgaWlfaWlhcF9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9ycV9tbHM6NjsKLQkJdWludDY0X3QgaV9yc3ZkXzE6MjsKLQkJdWludDY0X3QgaV9ycF9tbHM6NjsKLQkJdWludDY0X3QgaV9yc3ZkOjUwOworCQl1NjQgaV9ycV9tbHM6NjsKKwkJdTY0IGlfcnN2ZF8xOjI7CisJCXU2NCBpX3JwX21sczo2OworCQl1NjQgaV9yc3ZkOjUwOwogCX0gaWlfaWlhcF9mbGRfczsKIH0gaWlfaWlhcF91X3Q7CiAKQEAgLTIxMzMsMjIgKzIxMzMsMjIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaWNtcl91IHsKLQl1aW50NjRfdCBpaV9pY21yX3JlZ3ZhbDsKKwl1NjQgaWlfaWNtcl9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9zcF9tc2c6MTsKLQkJdWludDY0X3QgaV9yZF9oZHI6MTsKLQkJdWludDY0X3QgaV9yc3ZkXzQ6MjsKLQkJdWludDY0X3QgaV9jX2NudDo0OwotCQl1aW50NjRfdCBpX3JzdmRfMzo0OwotCQl1aW50NjRfdCBpX2Nscl9ycXBkOjE7Ci0JCXVpbnQ2NF90IGlfY2xyX3JwcGQ6MTsKLQkJdWludDY0X3QgaV9yc3ZkXzI6MjsKLQkJdWludDY0X3QgaV9mY19jbnQ6NDsKLQkJdWludDY0X3QgaV9jcmJfdmxkOjE1OwotCQl1aW50NjRfdCBpX2NyYl9tYXJrOjE1OwotCQl1aW50NjRfdCBpX3JzdmRfMToyOwotCQl1aW50NjRfdCBpX3ByZWNpc2U6MTsKLQkJdWludDY0X3QgaV9yc3ZkOjExOworCQl1NjQgaV9zcF9tc2c6MTsKKwkJdTY0IGlfcmRfaGRyOjE7CisJCXU2NCBpX3JzdmRfNDoyOworCQl1NjQgaV9jX2NudDo0OworCQl1NjQgaV9yc3ZkXzM6NDsKKwkJdTY0IGlfY2xyX3JxcGQ6MTsKKwkJdTY0IGlfY2xyX3JwcGQ6MTsKKwkJdTY0IGlfcnN2ZF8yOjI7CisJCXU2NCBpX2ZjX2NudDo0OworCQl1NjQgaV9jcmJfdmxkOjE1OworCQl1NjQgaV9jcmJfbWFyazoxNTsKKwkJdTY0IGlfcnN2ZF8xOjI7CisJCXU2NCBpX3ByZWNpc2U6MTsKKwkJdTY0IGlfcnN2ZDoxMTsKIAl9IGlpX2ljbXJfZmxkX3M7CiB9IGlpX2ljbXJfdV90OwogCkBAIC0yMTYxLDEzICsyMTYxLDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2ljY3JfdSB7Ci0JdWludDY0X3QgaWlfaWNjcl9yZWd2YWw7CisJdTY0IGlpX2ljY3JfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfY3JiX251bTo0OwotCQl1aW50NjRfdCBpX3JzdmRfMTo0OwotCQl1aW50NjRfdCBpX2NtZDo4OwotCQl1aW50NjRfdCBpX3BlbmRpbmc6MTsKLQkJdWludDY0X3QgaV9yc3ZkOjQ3OworCQl1NjQgaV9jcmJfbnVtOjQ7CisJCXU2NCBpX3JzdmRfMTo0OworCQl1NjQgaV9jbWQ6ODsKKwkJdTY0IGlfcGVuZGluZzoxOworCQl1NjQgaV9yc3ZkOjQ3OwogCX0gaWlfaWNjcl9mbGRfczsKIH0gaWlfaWNjcl91X3Q7CiAKQEAgLTIxNzgsMTAgKzIxNzgsMTAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaWN0b191IHsKLQl1aW50NjRfdCBpaV9pY3RvX3JlZ3ZhbDsKKwl1NjQgaWlfaWN0b19yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV90aW1lb3V0Ojg7Ci0JCXVpbnQ2NF90IGlfcnN2ZDo1NjsKKwkJdTY0IGlfdGltZW91dDo4OworCQl1NjQgaV9yc3ZkOjU2OwogCX0gaWlfaWN0b19mbGRfczsKIH0gaWlfaWN0b191X3Q7CiAKQEAgLTIxOTcsMTAgKzIxOTcsMTAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaWN0cF91IHsKLQl1aW50NjRfdCBpaV9pY3RwX3JlZ3ZhbDsKKwl1NjQgaWlfaWN0cF9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9wcmVzY2FsZToyNDsKLQkJdWludDY0X3QgaV9yc3ZkOjQwOworCQl1NjQgaV9wcmVzY2FsZToyNDsKKwkJdTY0IGlfcnN2ZDo0MDsKIAl9IGlpX2ljdHBfZmxkX3M7CiB9IGlpX2ljdHBfdV90OwogCkBAIC0yMjI4LDE0ICsyMjI4LDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2ljcmIwX2FfdSB7Ci0JdWludDY0X3QgaWlfaWNyYjBfYV9yZWd2YWw7CisJdTY0IGlpX2ljcmIwX2FfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlhX2lvdzoxOwotCQl1aW50NjRfdCBpYV92bGQ6MTsKLQkJdWludDY0X3QgaWFfYWRkcjo0NzsKLQkJdWludDY0X3QgaWFfdG51bTo1OwotCQl1aW50NjRfdCBpYV9zaWRuOjQ7Ci0JCXVpbnQ2NF90IGlhX3JzdmQ6NjsKKwkJdTY0IGlhX2lvdzoxOworCQl1NjQgaWFfdmxkOjE7CisJCXU2NCBpYV9hZGRyOjQ3OworCQl1NjQgaWFfdG51bTo1OworCQl1NjQgaWFfc2lkbjo0OworCQl1NjQgaWFfcnN2ZDo2OwogCX0gaWlfaWNyYjBfYV9mbGRfczsKIH0gaWlfaWNyYjBfYV91X3Q7CiAKQEAgLTIyNDksMzAgKzIyNDksMzAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaWNyYjBfYl91IHsKLQl1aW50NjRfdCBpaV9pY3JiMF9iX3JlZ3ZhbDsKKwl1NjQgaWlfaWNyYjBfYl9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaWJfeHRfZXJyOjE7Ci0JCXVpbnQ2NF90IGliX21hcms6MTsKLQkJdWludDY0X3QgaWJfbG5fdWNlOjE7Ci0JCXVpbnQ2NF90IGliX2VycmNvZGU6MzsKLQkJdWludDY0X3QgaWJfZXJyb3I6MTsKLQkJdWludDY0X3QgaWJfc3RhbGxfX2J0ZV8xOjE7Ci0JCXVpbnQ2NF90IGliX3N0YWxsX19idGVfMDoxOwotCQl1aW50NjRfdCBpYl9zdGFsbF9faW50cjoxOwotCQl1aW50NjRfdCBpYl9zdGFsbF9pYjoxOwotCQl1aW50NjRfdCBpYl9pbnR2bjoxOwotCQl1aW50NjRfdCBpYl93YjoxOwotCQl1aW50NjRfdCBpYl9ob2xkOjE7Ci0JCXVpbnQ2NF90IGliX2FjazoxOwotCQl1aW50NjRfdCBpYl9yZXNwOjE7Ci0JCXVpbnQ2NF90IGliX2Fja19jbnQ6MTE7Ci0JCXVpbnQ2NF90IGliX3JzdmQ6NzsKLQkJdWludDY0X3QgaWJfZXhjOjU7Ci0JCXVpbnQ2NF90IGliX2luaXQ6MzsKLQkJdWludDY0X3QgaWJfaW1zZzo4OwotCQl1aW50NjRfdCBpYl9pbXNndHlwZToyOwotCQl1aW50NjRfdCBpYl91c2Vfb2xkOjE7Ci0JCXVpbnQ2NF90IGliX3JzdmRfMToxMTsKKwkJdTY0IGliX3h0X2VycjoxOworCQl1NjQgaWJfbWFyazoxOworCQl1NjQgaWJfbG5fdWNlOjE7CisJCXU2NCBpYl9lcnJjb2RlOjM7CisJCXU2NCBpYl9lcnJvcjoxOworCQl1NjQgaWJfc3RhbGxfX2J0ZV8xOjE7CisJCXU2NCBpYl9zdGFsbF9fYnRlXzA6MTsKKwkJdTY0IGliX3N0YWxsX19pbnRyOjE7CisJCXU2NCBpYl9zdGFsbF9pYjoxOworCQl1NjQgaWJfaW50dm46MTsKKwkJdTY0IGliX3diOjE7CisJCXU2NCBpYl9ob2xkOjE7CisJCXU2NCBpYl9hY2s6MTsKKwkJdTY0IGliX3Jlc3A6MTsKKwkJdTY0IGliX2Fja19jbnQ6MTE7CisJCXU2NCBpYl9yc3ZkOjc7CisJCXU2NCBpYl9leGM6NTsKKwkJdTY0IGliX2luaXQ6MzsKKwkJdTY0IGliX2ltc2c6ODsKKwkJdTY0IGliX2ltc2d0eXBlOjI7CisJCXU2NCBpYl91c2Vfb2xkOjE7CisJCXU2NCBpYl9yc3ZkXzE6MTE7CiAJfSBpaV9pY3JiMF9iX2ZsZF9zOwogfSBpaV9pY3JiMF9iX3VfdDsKIApAQCAtMjI4NiwxNyArMjI4NiwxNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pY3JiMF9jX3UgewotCXVpbnQ2NF90IGlpX2ljcmIwX2NfcmVndmFsOworCXU2NCBpaV9pY3JiMF9jX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpY19zb3VyY2U6MTU7Ci0JCXVpbnQ2NF90IGljX3NpemU6MjsKLQkJdWludDY0X3QgaWNfY3Q6MTsKLQkJdWludDY0X3QgaWNfYnRlX251bToxOwotCQl1aW50NjRfdCBpY19nYnI6MTsKLQkJdWludDY0X3QgaWNfcmVzcHJxZDoxOwotCQl1aW50NjRfdCBpY19ibzoxOwotCQl1aW50NjRfdCBpY19zdXBwbDoxNTsKLQkJdWludDY0X3QgaWNfcnN2ZDoyNzsKKwkJdTY0IGljX3NvdXJjZToxNTsKKwkJdTY0IGljX3NpemU6MjsKKwkJdTY0IGljX2N0OjE7CisJCXU2NCBpY19idGVfbnVtOjE7CisJCXU2NCBpY19nYnI6MTsKKwkJdTY0IGljX3Jlc3BycWQ6MTsKKwkJdTY0IGljX2JvOjE7CisJCXU2NCBpY19zdXBwbDoxNTsKKwkJdTY0IGljX3JzdmQ6Mjc7CiAJfSBpaV9pY3JiMF9jX2ZsZF9zOwogfSBpaV9pY3JiMF9jX3VfdDsKIApAQCAtMjMxMCwxNCArMjMxMCwxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pY3JiMF9kX3UgewotCXVpbnQ2NF90IGlpX2ljcmIwX2RfcmVndmFsOworCXU2NCBpaV9pY3JiMF9kX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpZF9wYV9iZTo0MzsKLQkJdWludDY0X3QgaWRfYnRlX29wOjE7Ci0JCXVpbnQ2NF90IGlkX3ByX3BzYzo0OwotCQl1aW50NjRfdCBpZF9wcl9jbnQ6NDsKLQkJdWludDY0X3QgaWRfc2xlZXA6MTsKLQkJdWludDY0X3QgaWRfcnN2ZDoxMTsKKwkJdTY0IGlkX3BhX2JlOjQzOworCQl1NjQgaWRfYnRlX29wOjE7CisJCXU2NCBpZF9wcl9wc2M6NDsKKwkJdTY0IGlkX3ByX2NudDo0OworCQl1NjQgaWRfc2xlZXA6MTsKKwkJdTY0IGlkX3JzdmQ6MTE7CiAJfSBpaV9pY3JiMF9kX2ZsZF9zOwogfSBpaV9pY3JiMF9kX3VfdDsKIApAQCAtMjMzMSwxNCArMjMzMSwxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pY3JiMF9lX3UgewotCXVpbnQ2NF90IGlpX2ljcmIwX2VfcmVndmFsOworCXU2NCBpaV9pY3JiMF9lX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpZV90aW1lb3V0Ojg7Ci0JCXVpbnQ2NF90IGllX2NvbnRleHQ6MTU7Ci0JCXVpbnQ2NF90IGllX3JzdmQ6MTsKLQkJdWludDY0X3QgaWVfdHZsZDoxOwotCQl1aW50NjRfdCBpZV9jdmxkOjE7Ci0JCXVpbnQ2NF90IGllX3JzdmRfMDozODsKKwkJdTY0IGllX3RpbWVvdXQ6ODsKKwkJdTY0IGllX2NvbnRleHQ6MTU7CisJCXU2NCBpZV9yc3ZkOjE7CisJCXU2NCBpZV90dmxkOjE7CisJCXU2NCBpZV9jdmxkOjE7CisJCXU2NCBpZV9yc3ZkXzA6Mzg7CiAJfSBpaV9pY3JiMF9lX2ZsZF9zOwogfSBpaV9pY3JiMF9lX3VfdDsKIApAQCAtMjM1MSwxMiArMjM1MSwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pY3NtbF91IHsKLQl1aW50NjRfdCBpaV9pY3NtbF9yZWd2YWw7CisJdTY0IGlpX2ljc21sX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX3R0X2FkZHI6NDc7Ci0JCXVpbnQ2NF90IGlfbmV3c3VwcGxfZXg6MTQ7Ci0JCXVpbnQ2NF90IGlfcmVzZXJ2ZWQ6MjsKLQkJdWludDY0X3QgaV9vdmVyZmxvdzoxOworCQl1NjQgaV90dF9hZGRyOjQ3OworCQl1NjQgaV9uZXdzdXBwbF9leDoxNDsKKwkJdTY0IGlfcmVzZXJ2ZWQ6MjsKKwkJdTY0IGlfb3ZlcmZsb3c6MTsKIAl9IGlpX2ljc21sX2ZsZF9zOwogfSBpaV9pY3NtbF91X3Q7CiAKQEAgLTIzNjksMTAgKzIzNjksMTAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaWNzbW1fdSB7Ci0JdWludDY0X3QgaWlfaWNzbW1fcmVndmFsOworCXU2NCBpaV9pY3NtbV9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV90dF9hY2tfY250OjExOwotCQl1aW50NjRfdCBpX3Jlc2VydmVkOjUzOworCQl1NjQgaV90dF9hY2tfY250OjExOworCQl1NjQgaV9yZXNlcnZlZDo1MzsKIAl9IGlpX2ljc21tX2ZsZF9zOwogfSBpaV9pY3NtbV91X3Q7CiAKQEAgLTIzODUsNDggKzIzODUsNDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaWNzbWhfdSB7Ci0JdWludDY0X3QgaWlfaWNzbWhfcmVndmFsOworCXU2NCBpaV9pY3NtaF9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV90dF92bGQ6MTsKLQkJdWludDY0X3QgaV94ZXJyOjE7Ci0JCXVpbnQ2NF90IGlfZnRfY3dhY3RfbzoxOwotCQl1aW50NjRfdCBpX2Z0X3dhY3RfbzoxOwotCQl1aW50NjRfdCBpX2Z0X2FjdGl2ZV9vOjE7Ci0JCXVpbnQ2NF90IGlfc3luYzoxOwotCQl1aW50NjRfdCBpX21udXNnOjE7Ci0JCXVpbnQ2NF90IGlfbW51c3o6MTsKLQkJdWludDY0X3QgaV9wbHVzejoxOwotCQl1aW50NjRfdCBpX3BsdXNnOjE7Ci0JCXVpbnQ2NF90IGlfdHRfZXhjOjU7Ci0JCXVpbnQ2NF90IGlfdHRfd2I6MTsKLQkJdWludDY0X3QgaV90dF9ob2xkOjE7Ci0JCXVpbnQ2NF90IGlfdHRfYWNrOjE7Ci0JCXVpbnQ2NF90IGlfdHRfcmVzcDoxOwotCQl1aW50NjRfdCBpX3R0X2ludHZuOjE7Ci0JCXVpbnQ2NF90IGlfZ19zdGFsbF9idGUxOjE7Ci0JCXVpbnQ2NF90IGlfZ19zdGFsbF9idGUwOjE7Ci0JCXVpbnQ2NF90IGlfZ19zdGFsbF9pbDoxOwotCQl1aW50NjRfdCBpX2dfc3RhbGxfaWI6MTsKLQkJdWludDY0X3QgaV90dF9pbXNnOjg7Ci0JCXVpbnQ2NF90IGlfdHRfaW1zZ3R5cGU6MjsKLQkJdWludDY0X3QgaV90dF91c2Vfb2xkOjE7Ci0JCXVpbnQ2NF90IGlfdHRfcmVzcHJlcWQ6MTsKLQkJdWludDY0X3QgaV90dF9idGVfbnVtOjE7Ci0JCXVpbnQ2NF90IGlfY2JuOjE7Ci0JCXVpbnQ2NF90IGlfbWF0Y2g6MTsKLQkJdWludDY0X3QgaV9ycGNudF9sdF8zNDoxOwotCQl1aW50NjRfdCBpX3JwY250X2dlXzM0OjE7Ci0JCXVpbnQ2NF90IGlfcnBjbnRfbHRfMTg6MTsKLQkJdWludDY0X3QgaV9ycGNudF9nZV8xODoxOwotCQl1aW50NjRfdCBpX3JwY250X2x0XzI6MTsKLQkJdWludDY0X3QgaV9ycGNudF9nZV8yOjE7Ci0JCXVpbnQ2NF90IGlfcnFjbnRfbHRfMTg6MTsKLQkJdWludDY0X3QgaV9ycWNudF9nZV8xODoxOwotCQl1aW50NjRfdCBpX3JxY250X2x0XzI6MTsKLQkJdWludDY0X3QgaV9ycWNudF9nZV8yOjE7Ci0JCXVpbnQ2NF90IGlfdHRfZGV2aWNlOjc7Ci0JCXVpbnQ2NF90IGlfdHRfaW5pdDozOwotCQl1aW50NjRfdCBpX3Jlc2VydmVkOjU7CisJCXU2NCBpX3R0X3ZsZDoxOworCQl1NjQgaV94ZXJyOjE7CisJCXU2NCBpX2Z0X2N3YWN0X286MTsKKwkJdTY0IGlfZnRfd2FjdF9vOjE7CisJCXU2NCBpX2Z0X2FjdGl2ZV9vOjE7CisJCXU2NCBpX3N5bmM6MTsKKwkJdTY0IGlfbW51c2c6MTsKKwkJdTY0IGlfbW51c3o6MTsKKwkJdTY0IGlfcGx1c3o6MTsKKwkJdTY0IGlfcGx1c2c6MTsKKwkJdTY0IGlfdHRfZXhjOjU7CisJCXU2NCBpX3R0X3diOjE7CisJCXU2NCBpX3R0X2hvbGQ6MTsKKwkJdTY0IGlfdHRfYWNrOjE7CisJCXU2NCBpX3R0X3Jlc3A6MTsKKwkJdTY0IGlfdHRfaW50dm46MTsKKwkJdTY0IGlfZ19zdGFsbF9idGUxOjE7CisJCXU2NCBpX2dfc3RhbGxfYnRlMDoxOworCQl1NjQgaV9nX3N0YWxsX2lsOjE7CisJCXU2NCBpX2dfc3RhbGxfaWI6MTsKKwkJdTY0IGlfdHRfaW1zZzo4OworCQl1NjQgaV90dF9pbXNndHlwZToyOworCQl1NjQgaV90dF91c2Vfb2xkOjE7CisJCXU2NCBpX3R0X3Jlc3ByZXFkOjE7CisJCXU2NCBpX3R0X2J0ZV9udW06MTsKKwkJdTY0IGlfY2JuOjE7CisJCXU2NCBpX21hdGNoOjE7CisJCXU2NCBpX3JwY250X2x0XzM0OjE7CisJCXU2NCBpX3JwY250X2dlXzM0OjE7CisJCXU2NCBpX3JwY250X2x0XzE4OjE7CisJCXU2NCBpX3JwY250X2dlXzE4OjE7CisJCXU2NCBpX3JwY250X2x0XzI6MTsKKwkJdTY0IGlfcnBjbnRfZ2VfMjoxOworCQl1NjQgaV9ycWNudF9sdF8xODoxOworCQl1NjQgaV9ycWNudF9nZV8xODoxOworCQl1NjQgaV9ycWNudF9sdF8yOjE7CisJCXU2NCBpX3JxY250X2dlXzI6MTsKKwkJdTY0IGlfdHRfZGV2aWNlOjc7CisJCXU2NCBpX3R0X2luaXQ6MzsKKwkJdTY0IGlfcmVzZXJ2ZWQ6NTsKIAl9IGlpX2ljc21oX2ZsZF9zOwogfSBpaV9pY3NtaF91X3Q7CiAKQEAgLTI0MzksMTQgKzI0MzksMTQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaWRic3NfdSB7Ci0JdWludDY0X3QgaWlfaWRic3NfcmVndmFsOworCXU2NCBpaV9pZGJzc19yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9paW9jbGtfY29yZV9zdWJtZW51OjM7Ci0JCXVpbnQ2NF90IGlfcnN2ZDo1OwotCQl1aW50NjRfdCBpX2ZzYmNsa193cmFwcGVyX3N1Ym1lbnU6MzsKLQkJdWludDY0X3QgaV9yc3ZkXzE6NTsKLQkJdWludDY0X3QgaV9paW9jbGtfbWVudTo1OwotCQl1aW50NjRfdCBpX3JzdmRfMjo0MzsKKwkJdTY0IGlfaWlvY2xrX2NvcmVfc3VibWVudTozOworCQl1NjQgaV9yc3ZkOjU7CisJCXU2NCBpX2ZzYmNsa193cmFwcGVyX3N1Ym1lbnU6MzsKKwkJdTY0IGlfcnN2ZF8xOjU7CisJCXU2NCBpX2lpb2Nsa19tZW51OjU7CisJCXU2NCBpX3JzdmRfMjo0MzsKIAl9IGlpX2lkYnNzX2ZsZF9zOwogfSBpaV9pZGJzc191X3Q7CiAKQEAgLTI0NjYsMTMgKzI0NjYsMTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaWJsczBfdSB7Ci0JdWludDY0X3QgaWlfaWJsczBfcmVndmFsOworCXU2NCBpaV9pYmxzMF9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9sZW5ndGg6MTY7Ci0JCXVpbnQ2NF90IGlfZXJyb3I6MTsKLQkJdWludDY0X3QgaV9yc3ZkXzE6MzsKLQkJdWludDY0X3QgaV9idXN5OjE7Ci0JCXVpbnQ2NF90IGlfcnN2ZDo0MzsKKwkJdTY0IGlfbGVuZ3RoOjE2OworCQl1NjQgaV9lcnJvcjoxOworCQl1NjQgaV9yc3ZkXzE6MzsKKwkJdTY0IGlfYnVzeToxOworCQl1NjQgaV9yc3ZkOjQzOwogCX0gaWlfaWJsczBfZmxkX3M7CiB9IGlpX2libHMwX3VfdDsKIApAQCAtMjQ4NywxMSArMjQ4NywxMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pYnNhMF91IHsKLQl1aW50NjRfdCBpaV9pYnNhMF9yZWd2YWw7CisJdTY0IGlpX2lic2EwX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX3JzdmRfMTo3OwotCQl1aW50NjRfdCBpX2FkZHI6NDI7Ci0JCXVpbnQ2NF90IGlfcnN2ZDoxNTsKKwkJdTY0IGlfcnN2ZF8xOjc7CisJCXU2NCBpX2FkZHI6NDI7CisJCXU2NCBpX3JzdmQ6MTU7CiAJfSBpaV9pYnNhMF9mbGRfczsKIH0gaWlfaWJzYTBfdV90OwogCkBAIC0yNTA2LDExICsyNTA2LDExIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2liZGEwX3UgewotCXVpbnQ2NF90IGlpX2liZGEwX3JlZ3ZhbDsKKwl1NjQgaWlfaWJkYTBfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8xOjc7Ci0JCXVpbnQ2NF90IGlfYWRkcjo0MjsKLQkJdWludDY0X3QgaV9yc3ZkOjE1OworCQl1NjQgaV9yc3ZkXzE6NzsKKwkJdTY0IGlfYWRkcjo0MjsKKwkJdTY0IGlfcnN2ZDoxNTsKIAl9IGlpX2liZGEwX2ZsZF9zOwogfSBpaV9pYmRhMF91X3Q7CiAKQEAgLTI1MjcsMTQgKzI1MjcsMTQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaWJjdDBfdSB7Ci0JdWludDY0X3QgaWlfaWJjdDBfcmVndmFsOworCXU2NCBpaV9pYmN0MF9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV96ZXJvZmlsbDoxOwotCQl1aW50NjRfdCBpX3JzdmRfMjozOwotCQl1aW50NjRfdCBpX25vdGlmeToxOwotCQl1aW50NjRfdCBpX3JzdmRfMTozOwotCQl1aW50NjRfdCBpX3BvaXNvbjoxOwotCQl1aW50NjRfdCBpX3JzdmQ6NTU7CisJCXU2NCBpX3plcm9maWxsOjE7CisJCXU2NCBpX3JzdmRfMjozOworCQl1NjQgaV9ub3RpZnk6MTsKKwkJdTY0IGlfcnN2ZF8xOjM7CisJCXU2NCBpX3BvaXNvbjoxOworCQl1NjQgaV9yc3ZkOjU1OwogCX0gaWlfaWJjdDBfZmxkX3M7CiB9IGlpX2liY3QwX3VfdDsKIApAQCAtMjU0NiwxMSArMjU0NiwxMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pYm5hMF91IHsKLQl1aW50NjRfdCBpaV9pYm5hMF9yZWd2YWw7CisJdTY0IGlpX2libmEwX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX3JzdmRfMTo3OwotCQl1aW50NjRfdCBpX2FkZHI6NDI7Ci0JCXVpbnQ2NF90IGlfcnN2ZDoxNTsKKwkJdTY0IGlfcnN2ZF8xOjc7CisJCXU2NCBpX2FkZHI6NDI7CisJCXU2NCBpX3JzdmQ6MTU7CiAJfSBpaV9pYm5hMF9mbGRfczsKIH0gaWlfaWJuYTBfdV90OwogCkBAIC0yNTYzLDEzICsyNTYzLDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2liaWEwX3UgewotCXVpbnQ2NF90IGlpX2liaWEwX3JlZ3ZhbDsKKwl1NjQgaWlfaWJpYTBfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8yOjE7Ci0JCXVpbnQ2NF90IGlfbm9kZV9pZDoxMTsKLQkJdWludDY0X3QgaV9yc3ZkXzE6NDsKLQkJdWludDY0X3QgaV9sZXZlbDo3OwotCQl1aW50NjRfdCBpX3JzdmQ6NDE7CisJCXU2NCBpX3JzdmRfMjoxOworCQl1NjQgaV9ub2RlX2lkOjExOworCQl1NjQgaV9yc3ZkXzE6NDsKKwkJdTY0IGlfbGV2ZWw6NzsKKwkJdTY0IGlfcnN2ZDo0MTsKIAl9IGlpX2liaWEwX2ZsZF9zOwogfSBpaV9pYmlhMF91X3Q7CiAKQEAgLTI1ODksMTMgKzI1ODksMTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaWJsczFfdSB7Ci0JdWludDY0X3QgaWlfaWJsczFfcmVndmFsOworCXU2NCBpaV9pYmxzMV9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9sZW5ndGg6MTY7Ci0JCXVpbnQ2NF90IGlfZXJyb3I6MTsKLQkJdWludDY0X3QgaV9yc3ZkXzE6MzsKLQkJdWludDY0X3QgaV9idXN5OjE7Ci0JCXVpbnQ2NF90IGlfcnN2ZDo0MzsKKwkJdTY0IGlfbGVuZ3RoOjE2OworCQl1NjQgaV9lcnJvcjoxOworCQl1NjQgaV9yc3ZkXzE6MzsKKwkJdTY0IGlfYnVzeToxOworCQl1NjQgaV9yc3ZkOjQzOwogCX0gaWlfaWJsczFfZmxkX3M7CiB9IGlpX2libHMxX3VfdDsKIApAQCAtMjYxMCwxMSArMjYxMCwxMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pYnNhMV91IHsKLQl1aW50NjRfdCBpaV9pYnNhMV9yZWd2YWw7CisJdTY0IGlpX2lic2ExX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX3JzdmRfMTo3OwotCQl1aW50NjRfdCBpX2FkZHI6MzM7Ci0JCXVpbnQ2NF90IGlfcnN2ZDoyNDsKKwkJdTY0IGlfcnN2ZF8xOjc7CisJCXU2NCBpX2FkZHI6MzM7CisJCXU2NCBpX3JzdmQ6MjQ7CiAJfSBpaV9pYnNhMV9mbGRfczsKIH0gaWlfaWJzYTFfdV90OwogCkBAIC0yNjI5LDExICsyNjI5LDExIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2liZGExX3UgewotCXVpbnQ2NF90IGlpX2liZGExX3JlZ3ZhbDsKKwl1NjQgaWlfaWJkYTFfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8xOjc7Ci0JCXVpbnQ2NF90IGlfYWRkcjozMzsKLQkJdWludDY0X3QgaV9yc3ZkOjI0OworCQl1NjQgaV9yc3ZkXzE6NzsKKwkJdTY0IGlfYWRkcjozMzsKKwkJdTY0IGlfcnN2ZDoyNDsKIAl9IGlpX2liZGExX2ZsZF9zOwogfSBpaV9pYmRhMV91X3Q7CiAKQEAgLTI2NTAsMTQgKzI2NTAsMTQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgdW5pb24gaWlfaWJjdDFfdSB7Ci0JdWludDY0X3QgaWlfaWJjdDFfcmVndmFsOworCXU2NCBpaV9pYmN0MV9yZWd2YWw7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV96ZXJvZmlsbDoxOwotCQl1aW50NjRfdCBpX3JzdmRfMjozOwotCQl1aW50NjRfdCBpX25vdGlmeToxOwotCQl1aW50NjRfdCBpX3JzdmRfMTozOwotCQl1aW50NjRfdCBpX3BvaXNvbjoxOwotCQl1aW50NjRfdCBpX3JzdmQ6NTU7CisJCXU2NCBpX3plcm9maWxsOjE7CisJCXU2NCBpX3JzdmRfMjozOworCQl1NjQgaV9ub3RpZnk6MTsKKwkJdTY0IGlfcnN2ZF8xOjM7CisJCXU2NCBpX3BvaXNvbjoxOworCQl1NjQgaV9yc3ZkOjU1OwogCX0gaWlfaWJjdDFfZmxkX3M7CiB9IGlpX2liY3QxX3VfdDsKIApAQCAtMjY2OSwxMSArMjY2OSwxMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pYm5hMV91IHsKLQl1aW50NjRfdCBpaV9pYm5hMV9yZWd2YWw7CisJdTY0IGlpX2libmExX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX3JzdmRfMTo3OwotCQl1aW50NjRfdCBpX2FkZHI6MzM7Ci0JCXVpbnQ2NF90IGlfcnN2ZDoyNDsKKwkJdTY0IGlfcnN2ZF8xOjc7CisJCXU2NCBpX2FkZHI6MzM7CisJCXU2NCBpX3JzdmQ6MjQ7CiAJfSBpaV9pYm5hMV9mbGRfczsKIH0gaWlfaWJuYTFfdV90OwogCkBAIC0yNjg2LDEzICsyNjg2LDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHVuaW9uIGlpX2liaWExX3UgewotCXVpbnQ2NF90IGlpX2liaWExX3JlZ3ZhbDsKKwl1NjQgaWlfaWJpYTFfcmVndmFsOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IGlfcGlfaWQ6MTsKLQkJdWludDY0X3QgaV9ub2RlX2lkOjg7Ci0JCXVpbnQ2NF90IGlfcnN2ZF8xOjc7Ci0JCXVpbnQ2NF90IGlfbGV2ZWw6NzsKLQkJdWludDY0X3QgaV9yc3ZkOjQxOworCQl1NjQgaV9waV9pZDoxOworCQl1NjQgaV9ub2RlX2lkOjg7CisJCXU2NCBpX3JzdmRfMTo3OworCQl1NjQgaV9sZXZlbDo3OworCQl1NjQgaV9yc3ZkOjQxOwogCX0gaWlfaWJpYTFfZmxkX3M7CiB9IGlpX2liaWExX3VfdDsKIApAQCAtMjcxMiwxMiArMjcxMiwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pcGNyX3UgewotCXVpbnQ2NF90IGlpX2lwY3JfcmVndmFsOworCXU2NCBpaV9pcGNyX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX2lwcHIwX2M6NDsKLQkJdWludDY0X3QgaV9pcHByMV9jOjQ7Ci0JCXVpbnQ2NF90IGlfaWNjdDo4OwotCQl1aW50NjRfdCBpX3JzdmQ6NDg7CisJCXU2NCBpX2lwcHIwX2M6NDsKKwkJdTY0IGlfaXBwcjFfYzo0OworCQl1NjQgaV9pY2N0Ojg7CisJCXU2NCBpX3JzdmQ6NDg7CiAJfSBpaV9pcGNyX2ZsZF9zOwogfSBpaV9pcGNyX3VfdDsKIApAQCAtMjcyOCwxMCArMjcyOCwxMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBpaV9pcHByX3UgewotCXVpbnQ2NF90IGlpX2lwcHJfcmVndmFsOworCXU2NCBpaV9pcHByX3JlZ3ZhbDsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCBpX2lwcHIwOjMyOwotCQl1aW50NjRfdCBpX2lwcHIxOjMyOworCQl1NjQgaV9pcHByMDozMjsKKwkJdTY0IGlfaXBwcjE6MzI7CiAJfSBpaV9pcHByX2ZsZF9zOwogfSBpaV9pcHByX3VfdDsKIApAQCAtMzI2NywxNSArMzI2NywxNSBAQAogI2RlZmluZSBJT19QRVJGX1NFVFMJMzIKIAogLyogQml0IGZvciB0aGUgd2lkZ2V0IGluIGluYm91bmQgYWNjZXNzIHJlZ2lzdGVyICovCi0jZGVmaW5lIElJT19JSVdBX1dJREdFVChfdykJKCh1aW50NjRfdCkoMVVMTCA8PCBfdykpCisjZGVmaW5lIElJT19JSVdBX1dJREdFVChfdykJKCh1NjQpKDFVTEwgPDwgX3cpKQogLyogQml0IGZvciB0aGUgd2lkZ2V0IGluIG91dGJvdW5kIGFjY2VzcyByZWdpc3RlciAqLwotI2RlZmluZSBJSU9fSU9XQV9XSURHRVQoX3cpCSgodWludDY0X3QpKDFVTEwgPDwgX3cpKQorI2RlZmluZSBJSU9fSU9XQV9XSURHRVQoX3cpCSgodTY0KSgxVUxMIDw8IF93KSkKIAogLyogTk9URTogVGhlIGZvbGxvd2luZyBkZWZpbmUgYXNzdW1lcyB0aGF0IHdlIGFyZSBnb2luZyB0byBnZXQKICAqIHdpZGdldCBudW1iZXJzIGZyb20gOCB0aHJ1IEYgYW5kIHRoZSBkZXZpY2UgbnVtYmVycyB3aXRoaW4KICAqIHdpZGdldCBmcm9tIDAgdGhydSA3LgogICovCi0jZGVmaW5lIElJT19JSURFTV9XSURHRVRERVZfTUFTSyh3LCBkKQkoKHVpbnQ2NF90KSgxVUxMIDw8ICg4ICogKCh3KSAtIDgpICsgKGQpKSkpCisjZGVmaW5lIElJT19JSURFTV9XSURHRVRERVZfTUFTSyh3LCBkKQkoKHU2NCkoMVVMTCA8PCAoOCAqICgodykgLSA4KSArIChkKSkpKQogCiAvKiBJTyBJbnRlcnJ1cHQgRGVzdGluYXRpb24gUmVnaXN0ZXIgKi8KICNkZWZpbmUgSUlPX0lJRFNSX1NFTlRfU0hJRlQgICAgMjgKQEAgLTMzMDIsOSArMzMwMiw5IEBACiAgKi8KIAogdHlwZWRlZiB1bmlvbiBodWJpaV93Y3JfdSB7Ci0JdWludDY0X3Qgd2NyX3JlZ192YWx1ZTsKKwl1NjQgd2NyX3JlZ192YWx1ZTsKIAlzdHJ1Y3QgewotCQl1aW50NjRfdCB3Y3Jfd2lkZ2V0X2lkOjQsCS8qIExMUCBjcm9zc2JhciBjcmVkaXQgKi8KKwkJdTY0IHdjcl93aWRnZXRfaWQ6NCwJLyogTExQIGNyb3NzYmFyIGNyZWRpdCAqLwogCQkgd2NyX3RhZ19tb2RlOjEsCS8qIFRhZyBtb2RlICovCiAJCSB3Y3JfcnN2ZDE6OCwJLyogUmVzZXJ2ZWQgKi8KIAkJIHdjcl94YmFyX2NyZDozLAkvKiBMTFAgY3Jvc3NiYXIgY3JlZGl0ICovCkBAIC0zMzI0LDkgKzMzMjQsOSBAQAogICAgcGVyZm9ybWVkICovCiAKIHR5cGVkZWYgdW5pb24gaW9fcGVyZl9zZWwgewotCXVpbnQ2NF90IHBlcmZfc2VsX3JlZzsKKwl1NjQgcGVyZl9zZWxfcmVnOwogCXN0cnVjdCB7Ci0JCXVpbnQ2NF90IHBlcmZfaXBwcjA6NCwgcGVyZl9pcHByMTo0LCBwZXJmX2ljY3Q6OCwgcGVyZl9yc3ZkOjQ4OworCQl1NjQgcGVyZl9pcHByMDo0LCBwZXJmX2lwcHIxOjQsIHBlcmZfaWNjdDo4LCBwZXJmX3JzdmQ6NDg7CiAJfSBwZXJmX3NlbF9iaXRzOwogfSBpb19wZXJmX3NlbF90OwogCkBAIC0zMzM0LDI0ICszMzM0LDI0IEBACiAgICBoYXJkd2FyZSBwcm9ibGVtcyB0aGVyZSBpcyBvbmx5IG9uZSBjb3VudGVyLCBub3QgdHdvLiAqLwogCiB0eXBlZGVmIHVuaW9uIGlvX3BlcmZfY250IHsKLQl1aW50NjRfdCBwZXJmX2NudDsKKwl1NjQgcGVyZl9jbnQ7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgcGVyZl9jbnQ6MjAsIHBlcmZfcnN2ZDI6MTIsIHBlcmZfcnN2ZDE6MzI7CisJCXU2NCBwZXJmX2NudDoyMCwgcGVyZl9yc3ZkMjoxMiwgcGVyZl9yc3ZkMTozMjsKIAl9IHBlcmZfY250X2JpdHM7CiAKIH0gaW9fcGVyZl9jbnRfdDsKIAogdHlwZWRlZiB1bmlvbiBpcHJ0ZV9hIHsKLQl1aW50NjRfdCBlbnRyeTsKKwl1NjQgZW50cnk7CiAJc3RydWN0IHsKLQkJdWludDY0X3QgaV9yc3ZkXzE6MzsKLQkJdWludDY0X3QgaV9hZGRyOjM4OwotCQl1aW50NjRfdCBpX2luaXQ6MzsKLQkJdWludDY0X3QgaV9zb3VyY2U6ODsKLQkJdWludDY0X3QgaV9yc3ZkOjI7Ci0JCXVpbnQ2NF90IGlfd2lkZ2V0OjQ7Ci0JCXVpbnQ2NF90IGlfdG9fY250OjU7Ci0JCXVpbnQ2NF90IGlfdmxkOjE7CisJCXU2NCBpX3JzdmRfMTozOworCQl1NjQgaV9hZGRyOjM4OworCQl1NjQgaV9pbml0OjM7CisJCXU2NCBpX3NvdXJjZTo4OworCQl1NjQgaV9yc3ZkOjI7CisJCXU2NCBpX3dpZGdldDo0OworCQl1NjQgaV90b19jbnQ6NTsKKwkJdTY0IGlfdmxkOjE7CiAJfSBpcHJ0ZV9maWVsZHM7CiB9IGlwcnRlX2FfdDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9zbl9zYWwuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vc25fc2FsLmgKaW5kZXggMmE4YjBkOS4uZTc3ZjBjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi9zbl9zYWwuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuX3NhbC5oCkBAIC03NSw3ICs3NSw4IEBACiAjZGVmaW5lICBTTl9TQUxfSU9JRl9HRVRfSFVCREVWX0lORk8JCSAgIDB4MDIwMDAwNTUKICNkZWZpbmUgIFNOX1NBTF9JT0lGX0dFVF9QQ0lCVVNfSU5GTwkJICAgMHgwMjAwMDA1NgogI2RlZmluZSAgU05fU0FMX0lPSUZfR0VUX1BDSURFVl9JTkZPCQkgICAweDAyMDAwMDU3Ci0jZGVmaW5lICBTTl9TQUxfSU9JRl9HRVRfV0lER0VUX0RNQUZMVVNIX0xJU1QJICAgMHgwMjAwMDA1OAorI2RlZmluZSAgU05fU0FMX0lPSUZfR0VUX1dJREdFVF9ETUFGTFVTSF9MSVNUCSAgIDB4MDIwMDAwNTgJLy8gZGVwcmVjYXRlZAorI2RlZmluZSAgU05fU0FMX0lPSUZfR0VUX0RFVklDRV9ETUFGTFVTSF9MSVNUCSAgIDB4MDIwMDAwNWEKIAogI2RlZmluZSBTTl9TQUxfSFVCX0VSUk9SX0lOVEVSUlVQVAkJICAgMHgwMjAwMDA2MAogI2RlZmluZSBTTl9TQUxfQlRFX1JFQ09WRVIJCQkgICAweDAyMDAwMDYxCkBAIC0yNzIsNyArMjczLDcgQEAKIAlyZXRfc3R1ZmYudjAgPSAwOwogCXJldF9zdHVmZi52MSA9IDA7CiAJcmV0X3N0dWZmLnYyID0gMDsKLQlTQUxfQ0FMTF9OT0xPQ0socmV0X3N0dWZmLCBTTl9TQUxfQ09OU09MRV9QVVRDLCAodWludDY0X3QpY2gsIDAsIDAsIDAsIDAsIDAsIDApOworCVNBTF9DQUxMX05PTE9DSyhyZXRfc3R1ZmYsIFNOX1NBTF9DT05TT0xFX1BVVEMsICh1NjQpY2gsIDAsIDAsIDAsIDAsIDAsIDApOwogCiAJcmV0dXJuIHJldF9zdHVmZi5zdGF0dXM7CiB9CkBAIC0yODksNyArMjkwLDcgQEAKIAlyZXRfc3R1ZmYudjAgPSAwOyAKIAlyZXRfc3R1ZmYudjEgPSAwOwogCXJldF9zdHVmZi52MiA9IDA7Ci0JU0FMX0NBTExfTk9MT0NLKHJldF9zdHVmZiwgU05fU0FMX0NPTlNPTEVfUFVUQiwgKHVpbnQ2NF90KWJ1ZiwgKHVpbnQ2NF90KWxlbiwgMCwgMCwgMCwgMCwgMCk7CisJU0FMX0NBTExfTk9MT0NLKHJldF9zdHVmZiwgU05fU0FMX0NPTlNPTEVfUFVUQiwgKHU2NClidWYsICh1NjQpbGVuLCAwLCAwLCAwLCAwLCAwKTsKIAogCWlmICggcmV0X3N0dWZmLnN0YXR1cyA9PSAwICkgewogCQlyZXR1cm4gcmV0X3N0dWZmLnYwOwpAQCAtMzA5LDcgKzMxMCw3IEBACiAJcmV0X3N0dWZmLnYwID0gMDsKIAlyZXRfc3R1ZmYudjEgPSAwOwogCXJldF9zdHVmZi52MiA9IDA7Ci0JU0FMX0NBTExfUkVFTlRSQU5UKHJldF9zdHVmZiwgU05fU0FMX1BSSU5UX0VSUk9SLCAodWludDY0X3QpaG9vaywgKHVpbnQ2NF90KXJlYywgMCwgMCwgMCwgMCwgMCk7CisJU0FMX0NBTExfUkVFTlRSQU5UKHJldF9zdHVmZiwgU05fU0FMX1BSSU5UX0VSUk9SLCAodTY0KWhvb2ssICh1NjQpcmVjLCAwLCAwLCAwLCAwLCAwKTsKIAogCXJldHVybiByZXRfc3R1ZmYuc3RhdHVzOwogfQpAQCAtMzk3LDcgKzM5OCw3IEBACiAgKiBFbmFibGUgYW4gaW50ZXJydXB0IG9uIHRoZSBTQUwgY29uc29sZSBkZXZpY2UuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAotaWE2NF9zbl9jb25zb2xlX2ludHJfZW5hYmxlKHVpbnQ2NF90IGludHIpCitpYTY0X3NuX2NvbnNvbGVfaW50cl9lbmFibGUodTY0IGludHIpCiB7CiAJc3RydWN0IGlhNjRfc2FsX3JldHZhbCByZXRfc3R1ZmY7CiAKQEAgLTQxNCw3ICs0MTUsNyBAQAogICogRGlzYWJsZSBhbiBpbnRlcnJ1cHQgb24gdGhlIFNBTCBjb25zb2xlIGRldmljZS4KICAqLwogc3RhdGljIGlubGluZSB2b2lkCi1pYTY0X3NuX2NvbnNvbGVfaW50cl9kaXNhYmxlKHVpbnQ2NF90IGludHIpCitpYTY0X3NuX2NvbnNvbGVfaW50cl9kaXNhYmxlKHU2NCBpbnRyKQogewogCXN0cnVjdCBpYTY0X3NhbF9yZXR2YWwgcmV0X3N0dWZmOwogCkBAIC00NDAsNyArNDQxLDcgQEAKIAlyZXRfc3R1ZmYudjEgPSAwOwogCXJldF9zdHVmZi52MiA9IDA7CiAJU0FMX0NBTExfTk9MT0NLKHJldF9zdHVmZiwgU05fU0FMX0NPTlNPTEVfWE1JVF9DSEFSUywKLQkJICh1aW50NjRfdClidWYsICh1aW50NjRfdClsZW4sCisJCSAodTY0KWJ1ZiwgKHU2NClsZW4sCiAJCSAwLCAwLCAwLCAwLCAwKTsKIAogCWlmIChyZXRfc3R1ZmYuc3RhdHVzID09IDApIHsKQEAgLTExMDAsNyArMTEwMSw3IEBACiAJc3RydWN0IGlhNjRfc2FsX3JldHZhbCBydjsKIAogCXJ2LnN0YXR1cyA9IDA7Ci0JU0FMX0NBTExfTk9MT0NLKHJ2LCBTTl9TQUxfQlRFX1JFQ09WRVIsIDAsIDAsIDAsIDAsIDAsIDAsIDApOworCVNBTF9DQUxMX05PTE9DSyhydiwgU05fU0FMX0JURV9SRUNPVkVSLCAodTY0KW5hc2lkLCAwLCAwLCAwLCAwLCAwLCAwKTsKIAlpZiAocnYuc3RhdHVzID09IFNBTFJFVF9OT1RfSU1QTEVNRU5URUQpCiAJCXJldHVybiAwOwogCXJldHVybiAoaW50KSBydi5zdGF0dXM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3Rpb2NhLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3Rpb2NhLmgKaW5kZXggYmMxYWFjZi4uNjY2MjIyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi90aW9jYS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vdGlvY2EuaApAQCAtMTksNDcgKzE5LDQ3IEBACiAgKi8KIAogc3RydWN0IHRpb2NhIHsKLQl1aW50NjRfdAljYV9pZDsJCQkJLyogMHgwMDAwMDAgKi8KLQl1aW50NjRfdAljYV9jb250cm9sMTsJCQkvKiAweDAwMDAwOCAqLwotCXVpbnQ2NF90CWNhX2NvbnRyb2wyOwkJCS8qIDB4MDAwMDEwICovCi0JdWludDY0X3QJY2Ffc3RhdHVzMTsJCQkvKiAweDAwMDAxOCAqLwotCXVpbnQ2NF90CWNhX3N0YXR1czI7CQkJLyogMHgwMDAwMjAgKi8KLQl1aW50NjRfdAljYV9nYXJ0X2FwZXJhdHVyZTsJCS8qIDB4MDAwMDI4ICovCi0JdWludDY0X3QJY2FfZ2Z4X2RldGFjaDsJCQkvKiAweDAwMDAzMCAqLwotCXVpbnQ2NF90CWNhX2ludGFfZGVzdF9hZGRyOwkJLyogMHgwMDAwMzggKi8KLQl1aW50NjRfdAljYV9pbnRiX2Rlc3RfYWRkcjsJCS8qIDB4MDAwMDQwICovCi0JdWludDY0X3QJY2FfZXJyX2ludF9kZXN0X2FkZHI7CQkvKiAweDAwMDA0OCAqLwotCXVpbnQ2NF90CWNhX2ludF9zdGF0dXM7CQkJLyogMHgwMDAwNTAgKi8KLQl1aW50NjRfdAljYV9pbnRfc3RhdHVzX2FsaWFzOwkJLyogMHgwMDAwNTggKi8KLQl1aW50NjRfdAljYV9tdWx0X2Vycm9yOwkJCS8qIDB4MDAwMDYwICovCi0JdWludDY0X3QJY2FfbXVsdF9lcnJvcl9hbGlhczsJCS8qIDB4MDAwMDY4ICovCi0JdWludDY0X3QJY2FfZmlyc3RfZXJyb3I7CQkJLyogMHgwMDAwNzAgKi8KLQl1aW50NjRfdAljYV9pbnRfbWFzazsJCQkvKiAweDAwMDA3OCAqLwotCXVpbnQ2NF90CWNhX2NybV9wa3RlcnJfdHlwZTsJCS8qIDB4MDAwMDgwICovCi0JdWludDY0X3QJY2FfY3JtX3BrdGVycl90eXBlX2FsaWFzOwkvKiAweDAwMDA4OCAqLwotCXVpbnQ2NF90CWNhX2NybV9jdF9lcnJvcl9kZXRhaWxfMTsJLyogMHgwMDAwOTAgKi8KLQl1aW50NjRfdAljYV9jcm1fY3RfZXJyb3JfZGV0YWlsXzI7CS8qIDB4MDAwMDk4ICovCi0JdWludDY0X3QJY2FfY3JtX3RudW10bzsJCQkvKiAweDAwMDBBMCAqLwotCXVpbnQ2NF90CWNhX2dhcnRfZXJyOwkJCS8qIDB4MDAwMEE4ICovCi0JdWludDY0X3QJY2FfcGNpZXJyX3R5cGU7CQkJLyogMHgwMDAwQjAgKi8KLQl1aW50NjRfdAljYV9wY2llcnJfYWRkcjsJCQkvKiAweDAwMDBCOCAqLworCXU2NAljYV9pZDsJCQkJLyogMHgwMDAwMDAgKi8KKwl1NjQJY2FfY29udHJvbDE7CQkJLyogMHgwMDAwMDggKi8KKwl1NjQJY2FfY29udHJvbDI7CQkJLyogMHgwMDAwMTAgKi8KKwl1NjQJY2Ffc3RhdHVzMTsJCQkvKiAweDAwMDAxOCAqLworCXU2NAljYV9zdGF0dXMyOwkJCS8qIDB4MDAwMDIwICovCisJdTY0CWNhX2dhcnRfYXBlcmF0dXJlOwkJLyogMHgwMDAwMjggKi8KKwl1NjQJY2FfZ2Z4X2RldGFjaDsJCQkvKiAweDAwMDAzMCAqLworCXU2NAljYV9pbnRhX2Rlc3RfYWRkcjsJCS8qIDB4MDAwMDM4ICovCisJdTY0CWNhX2ludGJfZGVzdF9hZGRyOwkJLyogMHgwMDAwNDAgKi8KKwl1NjQJY2FfZXJyX2ludF9kZXN0X2FkZHI7CQkvKiAweDAwMDA0OCAqLworCXU2NAljYV9pbnRfc3RhdHVzOwkJCS8qIDB4MDAwMDUwICovCisJdTY0CWNhX2ludF9zdGF0dXNfYWxpYXM7CQkvKiAweDAwMDA1OCAqLworCXU2NAljYV9tdWx0X2Vycm9yOwkJCS8qIDB4MDAwMDYwICovCisJdTY0CWNhX211bHRfZXJyb3JfYWxpYXM7CQkvKiAweDAwMDA2OCAqLworCXU2NAljYV9maXJzdF9lcnJvcjsJCQkvKiAweDAwMDA3MCAqLworCXU2NAljYV9pbnRfbWFzazsJCQkvKiAweDAwMDA3OCAqLworCXU2NAljYV9jcm1fcGt0ZXJyX3R5cGU7CQkvKiAweDAwMDA4MCAqLworCXU2NAljYV9jcm1fcGt0ZXJyX3R5cGVfYWxpYXM7CS8qIDB4MDAwMDg4ICovCisJdTY0CWNhX2NybV9jdF9lcnJvcl9kZXRhaWxfMTsJLyogMHgwMDAwOTAgKi8KKwl1NjQJY2FfY3JtX2N0X2Vycm9yX2RldGFpbF8yOwkvKiAweDAwMDA5OCAqLworCXU2NAljYV9jcm1fdG51bXRvOwkJCS8qIDB4MDAwMEEwICovCisJdTY0CWNhX2dhcnRfZXJyOwkJCS8qIDB4MDAwMEE4ICovCisJdTY0CWNhX3BjaWVycl90eXBlOwkJCS8qIDB4MDAwMEIwICovCisJdTY0CWNhX3BjaWVycl9hZGRyOwkJCS8qIDB4MDAwMEI4ICovCiAKLQl1aW50NjRfdAljYV9wYWRfMDAwMEMwWzNdOwkJLyogMHgwMDAwe0MwLi5EMH0gKi8KKwl1NjQJY2FfcGFkXzAwMDBDMFszXTsJCS8qIDB4MDAwMHtDMC4uRDB9ICovCiAKLQl1aW50NjRfdAljYV9wY2lfcmRfYnVmX2ZsdXNoOwkJLyogMHgwMDAwRDggKi8KLQl1aW50NjRfdAljYV9wY2lfZG1hX2FkZHJfZXh0bjsJCS8qIDB4MDAwMEUwICovCi0JdWludDY0X3QJY2FfYWdwX2RtYV9hZGRyX2V4dG47CQkvKiAweDAwMDBFOCAqLwotCXVpbnQ2NF90CWNhX2ZvcmNlX2ludGE7CQkJLyogMHgwMDAwRjAgKi8KLQl1aW50NjRfdAljYV9mb3JjZV9pbnRiOwkJCS8qIDB4MDAwMEY4ICovCi0JdWludDY0X3QJY2FfZGVidWdfdmVjdG9yX3NlbDsJCS8qIDB4MDAwMTAwICovCi0JdWludDY0X3QJY2FfZGVidWdfbXV4X2NvcmVfc2VsOwkJLyogMHgwMDAxMDggKi8KLQl1aW50NjRfdAljYV9kZWJ1Z19tdXhfcGNpX3NlbDsJCS8qIDB4MDAwMTEwICovCi0JdWludDY0X3QJY2FfZGVidWdfZG9tYWluX3NlbDsJCS8qIDB4MDAwMTE4ICovCisJdTY0CWNhX3BjaV9yZF9idWZfZmx1c2g7CQkvKiAweDAwMDBEOCAqLworCXU2NAljYV9wY2lfZG1hX2FkZHJfZXh0bjsJCS8qIDB4MDAwMEUwICovCisJdTY0CWNhX2FncF9kbWFfYWRkcl9leHRuOwkJLyogMHgwMDAwRTggKi8KKwl1NjQJY2FfZm9yY2VfaW50YTsJCQkvKiAweDAwMDBGMCAqLworCXU2NAljYV9mb3JjZV9pbnRiOwkJCS8qIDB4MDAwMEY4ICovCisJdTY0CWNhX2RlYnVnX3ZlY3Rvcl9zZWw7CQkvKiAweDAwMDEwMCAqLworCXU2NAljYV9kZWJ1Z19tdXhfY29yZV9zZWw7CQkvKiAweDAwMDEwOCAqLworCXU2NAljYV9kZWJ1Z19tdXhfcGNpX3NlbDsJCS8qIDB4MDAwMTEwICovCisJdTY0CWNhX2RlYnVnX2RvbWFpbl9zZWw7CQkvKiAweDAwMDExOCAqLwogCi0JdWludDY0X3QJY2FfcGFkXzAwMDEyMFsyOF07CQkvKiAweDAwMDF7MjAuLkY4fSAqLworCXU2NAljYV9wYWRfMDAwMTIwWzI4XTsJCS8qIDB4MDAwMXsyMC4uRjh9ICovCiAKLQl1aW50NjRfdAljYV9nYXJ0X3B0cl90YWJsZTsJCS8qIDB4MjAwICovCi0JdWludDY0X3QJY2FfZ2FydF90bGJfYWRkcls4XTsJCS8qIDB4MnswOC4uNDB9ICovCisJdTY0CWNhX2dhcnRfcHRyX3RhYmxlOwkJLyogMHgyMDAgKi8KKwl1NjQJY2FfZ2FydF90bGJfYWRkcls4XTsJCS8qIDB4MnswOC4uNDB9ICovCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi90aW9jYV9wcm92aWRlci5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi90aW9jYV9wcm92aWRlci5oCmluZGV4IGI1MzJlZjYuLmFiN2ZlMjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vdGlvY2FfcHJvdmlkZXIuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3Rpb2NhX3Byb3ZpZGVyLmgKQEAgLTU2LDMxICs1NiwzMSBAQAogCS8qCiAJICogR2VuZXJhbCBHQVJUIHN0dWZmCiAJICovCi0JdWludDY0X3QJY2FfYXBfc2l6ZTsJCS8qIHNpemUgb2YgYXBlcmF0dXJlIGluIGJ5dGVzICovCi0JdWludDMyX3QJY2FfZ2FydF9lbnRyaWVzOwkvKiAjIHVpbnQ2NF90IGVudHJpZXMgaW4gZ2FydCAqLwotCXVpbnQzMl90CWNhX2FwX3BhZ2VzaXplOyAJLyogYXBlcmF0dXJlIHBhZ2Ugc2l6ZSBpbiBieXRlcyAqLwotCXVpbnQ2NF90CWNhX2FwX2J1c19iYXNlOyAJLyogYnVzIGFkZHJlc3Mgb2YgQ0EgYXBlcmF0dXJlICovCi0JdWludDY0X3QJY2FfZ2FydF9zaXplOwkJLyogZ2FydCBzaXplIGluIGJ5dGVzICovCi0JdWludDY0X3QJKmNhX2dhcnQ7CQkvKiBnYXJ0IHRhYmxlIHZhZGRyICovCi0JdWludDY0X3QJY2FfZ2FydF9jb3JldGFsa19hZGRyOwkvKiBnYXJ0IGNvcmV0YWxrIGFkZHIgKi8KLQl1aW50OF90CQljYV9nYXJ0X2lzY29oZXJlbnQ7CS8qIHVzZWQgaW4gdGlvY2FfdGxiZmx1c2ggKi8KKwl1NjQJY2FfYXBfc2l6ZTsJCS8qIHNpemUgb2YgYXBlcmF0dXJlIGluIGJ5dGVzICovCisJdTMyCWNhX2dhcnRfZW50cmllczsJLyogIyB1NjQgZW50cmllcyBpbiBnYXJ0ICovCisJdTMyCWNhX2FwX3BhZ2VzaXplOyAJLyogYXBlcmF0dXJlIHBhZ2Ugc2l6ZSBpbiBieXRlcyAqLworCXU2NAljYV9hcF9idXNfYmFzZTsgCS8qIGJ1cyBhZGRyZXNzIG9mIENBIGFwZXJhdHVyZSAqLworCXU2NAljYV9nYXJ0X3NpemU7CQkvKiBnYXJ0IHNpemUgaW4gYnl0ZXMgKi8KKwl1NjQJKmNhX2dhcnQ7CQkvKiBnYXJ0IHRhYmxlIHZhZGRyICovCisJdTY0CWNhX2dhcnRfY29yZXRhbGtfYWRkcjsJLyogZ2FydCBjb3JldGFsayBhZGRyICovCisJdTgJCWNhX2dhcnRfaXNjb2hlcmVudDsJLyogdXNlZCBpbiB0aW9jYV90bGJmbHVzaCAqLwogCiAJLyogUENJIEdBUlQgY29udmVuaWVuY2UgdmFsdWVzICovCi0JdWludDY0X3QJY2FfcGNpYXBfYmFzZTsJCS8qIHBjaSBhcGVyYXR1cmUgYnVzIGJhc2UgYWRkcmVzcyAqLwotCXVpbnQ2NF90CWNhX3BjaWFwX3NpemU7CQkvKiBwY2kgYXBlcmF0dXJlIHNpemUgKGJ5dGVzKSAqLwotCXVpbnQ2NF90CWNhX3BjaWdhcnRfYmFzZTsJLyogZ2Z4IEdBUlQgYnVzIGJhc2UgYWRkcmVzcyAqLwotCXVpbnQ2NF90CSpjYV9wY2lnYXJ0OwkJLyogZ2Z4IEdBUlQgdm0gYWRkcmVzcyAqLwotCXVpbnQzMl90CWNhX3BjaWdhcnRfZW50cmllczsKLQl1aW50MzJfdAljYV9wY2lnYXJ0X3N0YXJ0OwkvKiBQQ0kgc3RhcnQgaW5kZXggaW4gY2FfZ2FydCAqLworCXU2NAljYV9wY2lhcF9iYXNlOwkJLyogcGNpIGFwZXJhdHVyZSBidXMgYmFzZSBhZGRyZXNzICovCisJdTY0CWNhX3BjaWFwX3NpemU7CQkvKiBwY2kgYXBlcmF0dXJlIHNpemUgKGJ5dGVzKSAqLworCXU2NAljYV9wY2lnYXJ0X2Jhc2U7CS8qIGdmeCBHQVJUIGJ1cyBiYXNlIGFkZHJlc3MgKi8KKwl1NjQJKmNhX3BjaWdhcnQ7CQkvKiBnZnggR0FSVCB2bSBhZGRyZXNzICovCisJdTMyCWNhX3BjaWdhcnRfZW50cmllczsKKwl1MzIJY2FfcGNpZ2FydF9zdGFydDsJLyogUENJIHN0YXJ0IGluZGV4IGluIGNhX2dhcnQgKi8KIAl2b2lkCQkqY2FfcGNpZ2FydF9wYWdlbWFwOwogCiAJLyogQUdQIEdBUlQgY29udmVuaWVuY2UgdmFsdWVzICovCi0JdWludDY0X3QJY2FfZ2Z4YXBfYmFzZTsJCS8qIGdmeCBhcGVyYXR1cmUgYnVzIGJhc2UgYWRkcmVzcyAqLwotCXVpbnQ2NF90CWNhX2dmeGFwX3NpemU7CQkvKiBnZnggYXBlcmF0dXJlIHNpemUgKGJ5dGVzKSAqLwotCXVpbnQ2NF90CWNhX2dmeGdhcnRfYmFzZTsJLyogZ2Z4IEdBUlQgYnVzIGJhc2UgYWRkcmVzcyAqLwotCXVpbnQ2NF90CSpjYV9nZnhnYXJ0OwkJLyogZ2Z4IEdBUlQgdm0gYWRkcmVzcyAqLwotCXVpbnQzMl90CWNhX2dmeGdhcnRfZW50cmllczsKLQl1aW50MzJfdAljYV9nZnhnYXJ0X3N0YXJ0OwkvKiBhZ3BnYXJ0IHN0YXJ0IGluZGV4IGluIGNhX2dhcnQgKi8KKwl1NjQJY2FfZ2Z4YXBfYmFzZTsJCS8qIGdmeCBhcGVyYXR1cmUgYnVzIGJhc2UgYWRkcmVzcyAqLworCXU2NAljYV9nZnhhcF9zaXplOwkJLyogZ2Z4IGFwZXJhdHVyZSBzaXplIChieXRlcykgKi8KKwl1NjQJY2FfZ2Z4Z2FydF9iYXNlOwkvKiBnZnggR0FSVCBidXMgYmFzZSBhZGRyZXNzICovCisJdTY0CSpjYV9nZnhnYXJ0OwkJLyogZ2Z4IEdBUlQgdm0gYWRkcmVzcyAqLworCXUzMgljYV9nZnhnYXJ0X2VudHJpZXM7CisJdTMyCWNhX2dmeGdhcnRfc3RhcnQ7CS8qIGFncGdhcnQgc3RhcnQgaW5kZXggaW4gY2FfZ2FydCAqLwogfTsKIAogLyoKQEAgLTkzLDExICs5MywxMSBAQAogc3RydWN0IHRpb2NhX2NvbW1vbiB7CiAJc3RydWN0IHBjaWJ1c19idXNzb2Z0CWNhX2NvbW1vbjsJLyogY29tbW9uIHBjaWlvIGhlYWRlciAqLwogCi0JdWludDMyX3QJCWNhX3JldjsKLQl1aW50MzJfdAkJY2FfY2xvc2VzdF9uYXNpZDsKKwl1MzIJCWNhX3JldjsKKwl1MzIJCWNhX2Nsb3Nlc3RfbmFzaWQ7CiAKLQl1aW50NjRfdAkJY2FfcHJvbV9wcml2YXRlOwotCXVpbnQ2NF90CQljYV9rZXJuZWxfcHJpdmF0ZTsKKwl1NjQJCWNhX3Byb21fcHJpdmF0ZTsKKwl1NjQJCWNhX2tlcm5lbF9wcml2YXRlOwogfTsKIAogLyoqCkBAIC0xMzksOSArMTM5LDkgQEAKICAqLwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLXRpb2NhX3BoeXNwYWdlX3RvX2dhcnQodWludDY0X3QgcGFnZV9hZGRyKQordGlvY2FfcGh5c3BhZ2VfdG9fZ2FydCh1NjQgcGFnZV9hZGRyKQogewotCXVpbnQ2NF90IGNvcmV0YWxrX2FkZHI7CisJdTY0IGNvcmV0YWxrX2FkZHI7CiAKIAljb3JldGFsa19hZGRyID0gUEhZU19UT19USU9ETUEocGFnZV9hZGRyKTsKIAlpZiAoIWNvcmV0YWxrX2FkZHIpIHsKQEAgLTE2MSw3ICsxNjEsNyBAQAogc3RhdGljIGlubGluZSB2b2lkCiB0aW9jYV90bGJmbHVzaChzdHJ1Y3QgdGlvY2Ffa2VybmVsICp0aW9jYV9rZXJuZWwpCiB7Ci0Jdm9sYXRpbGUgdWludDY0X3QgdG1wOworCXZvbGF0aWxlIHU2NCB0bXA7CiAJdm9sYXRpbGUgc3RydWN0IHRpb2NhICpjYV9iYXNlOwogCXN0cnVjdCB0aW9jYV9jb21tb24gKnRpb2NhX2NvbW1vbjsKIApAQCAtMjAwLDcgKzIwMCw3IEBACiAJdG1wID0gX19zbl9yZWFkcV9yZWxheGVkKCZjYV9iYXNlLT5jYV9jb250cm9sMik7CiB9CiAKLWV4dGVybiB1aW50MzJfdAl0aW9jYV9nYXJ0X2ZvdW5kOworZXh0ZXJuIHUzMgl0aW9jYV9nYXJ0X2ZvdW5kOwogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgdGlvY2FfbGlzdDsKIGV4dGVybiBpbnQgdGlvY2FfaW5pdF9wcm92aWRlcih2b2lkKTsKIGV4dGVybiB2b2lkIHRpb2NhX2Zhc3R3cml0ZV9lbmFibGUoc3RydWN0IHRpb2NhX2tlcm5lbCAqdGlvY2Ffa2Vybik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3Rpb2NlLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3Rpb2NlLmgKaW5kZXggZWNhZGRmOS4uZDRjOTkwNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi90aW9jZS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vdGlvY2UuaApAQCAtMzUsNzIgKzM1LDcyIEBACiAJLyoKIAkgKiBBRE1JTiA6IEFkbWluaXN0cmF0aW9uIFJlZ2lzdGVycwogCSAqLwotCXVpbnQ2NF90CWNlX2FkbV9pZDsJCQkJLyogMHgwMDAwMDAgKi8KLQl1aW50NjRfdAljZV9wYWRfMDAwMDA4OwkJCQkvKiAweDAwMDAwOCAqLwotCXVpbnQ2NF90CWNlX2FkbV9keW5fY3JlZGl0X3N0YXR1czsJCS8qIDB4MDAwMDEwICovCi0JdWludDY0X3QJY2VfYWRtX2xhc3RfY3JlZGl0X3N0YXR1czsJCS8qIDB4MDAwMDE4ICovCi0JdWludDY0X3QJY2VfYWRtX2NyZWRpdF9saW1pdDsJCQkvKiAweDAwMDAyMCAqLwotCXVpbnQ2NF90CWNlX2FkbV9mb3JjZV9jcmVkaXQ7CQkJLyogMHgwMDAwMjggKi8KLQl1aW50NjRfdAljZV9hZG1fY29udHJvbDsJCQkJLyogMHgwMDAwMzAgKi8KLQl1aW50NjRfdAljZV9hZG1fbW1yX2Nobl90aW1lb3V0OwkJCS8qIDB4MDAwMDM4ICovCi0JdWludDY0X3QJY2VfYWRtX3NzcF91cmVfdGltZW91dDsJCQkvKiAweDAwMDA0MCAqLwotCXVpbnQ2NF90CWNlX2FkbV9zc3BfZHJlX3RpbWVvdXQ7CQkJLyogMHgwMDAwNDggKi8KLQl1aW50NjRfdAljZV9hZG1fc3NwX2RlYnVnX3NlbDsJCQkvKiAweDAwMDA1MCAqLwotCXVpbnQ2NF90CWNlX2FkbV9pbnRfc3RhdHVzOwkJCS8qIDB4MDAwMDU4ICovCi0JdWludDY0X3QJY2VfYWRtX2ludF9zdGF0dXNfYWxpYXM7CQkvKiAweDAwMDA2MCAqLwotCXVpbnQ2NF90CWNlX2FkbV9pbnRfbWFzazsJCQkvKiAweDAwMDA2OCAqLwotCXVpbnQ2NF90CWNlX2FkbV9pbnRfcGVuZGluZzsJCQkvKiAweDAwMDA3MCAqLwotCXVpbnQ2NF90CWNlX2FkbV9mb3JjZV9pbnQ7CQkJLyogMHgwMDAwNzggKi8KLQl1aW50NjRfdAljZV9hZG1fdXJlX3Vwc19idWZfYmFycmllcl9mbHVzaDsJLyogMHgwMDAwODAgKi8KLQl1aW50NjRfdAljZV9hZG1faW50X2Rlc3RbMTVdOwkgICAgLyogMHgwMDAwODggLS0gMHgwMDAwRjggKi8KLQl1aW50NjRfdAljZV9hZG1fZXJyb3Jfc3VtbWFyeTsJCQkvKiAweDAwMDEwMCAqLwotCXVpbnQ2NF90CWNlX2FkbV9lcnJvcl9zdW1tYXJ5X2FsaWFzOwkJLyogMHgwMDAxMDggKi8KLQl1aW50NjRfdAljZV9hZG1fZXJyb3JfbWFzazsJCQkvKiAweDAwMDExMCAqLwotCXVpbnQ2NF90CWNlX2FkbV9maXJzdF9lcnJvcjsJCQkvKiAweDAwMDExOCAqLwotCXVpbnQ2NF90CWNlX2FkbV9lcnJvcl9vdmVyZmxvdzsJCQkvKiAweDAwMDEyMCAqLwotCXVpbnQ2NF90CWNlX2FkbV9lcnJvcl9vdmVyZmxvd19hbGlhczsJCS8qIDB4MDAwMTI4ICovCi0JdWludDY0X3QJY2VfcGFkXzAwMDEzMFsyXTsJICAgIC8qIDB4MDAwMTMwIC0tIDB4MDAwMTM4ICovCi0JdWludDY0X3QJY2VfYWRtX3RudW1fZXJyb3I7CQkJLyogMHgwMDAxNDAgKi8KLQl1aW50NjRfdAljZV9hZG1fbW1yX2Vycl9kZXRhaWw7CQkJLyogMHgwMDAxNDggKi8KLQl1aW50NjRfdAljZV9hZG1fbXNnX3NyYW1fcGVycl9kZXRhaWw7CQkvKiAweDAwMDE1MCAqLwotCXVpbnQ2NF90CWNlX2FkbV9iYXBfc3JhbV9wZXJyX2RldGFpbDsJCS8qIDB4MDAwMTU4ICovCi0JdWludDY0X3QJY2VfYWRtX2NlX3NyYW1fcGVycl9kZXRhaWw7CQkvKiAweDAwMDE2MCAqLwotCXVpbnQ2NF90CWNlX2FkbV9jZV9jcmVkaXRfb2Zsb3dfZGV0YWlsOwkJLyogMHgwMDAxNjggKi8KLQl1aW50NjRfdAljZV9hZG1fdHhfbGlua19pZGxlX21heF90aW1lcjsJCS8qIDB4MDAwMTcwICovCi0JdWludDY0X3QJY2VfYWRtX3BjaWVfZGVidWdfc2VsOwkJCS8qIDB4MDAwMTc4ICovCi0JdWludDY0X3QJY2VfcGFkXzAwMDE4MFsxNl07CSAgICAvKiAweDAwMDE4MCAtLSAweDAwMDFGOCAqLworCXU2NAljZV9hZG1faWQ7CQkJCS8qIDB4MDAwMDAwICovCisJdTY0CWNlX3BhZF8wMDAwMDg7CQkJCS8qIDB4MDAwMDA4ICovCisJdTY0CWNlX2FkbV9keW5fY3JlZGl0X3N0YXR1czsJCS8qIDB4MDAwMDEwICovCisJdTY0CWNlX2FkbV9sYXN0X2NyZWRpdF9zdGF0dXM7CQkvKiAweDAwMDAxOCAqLworCXU2NAljZV9hZG1fY3JlZGl0X2xpbWl0OwkJCS8qIDB4MDAwMDIwICovCisJdTY0CWNlX2FkbV9mb3JjZV9jcmVkaXQ7CQkJLyogMHgwMDAwMjggKi8KKwl1NjQJY2VfYWRtX2NvbnRyb2w7CQkJCS8qIDB4MDAwMDMwICovCisJdTY0CWNlX2FkbV9tbXJfY2huX3RpbWVvdXQ7CQkJLyogMHgwMDAwMzggKi8KKwl1NjQJY2VfYWRtX3NzcF91cmVfdGltZW91dDsJCQkvKiAweDAwMDA0MCAqLworCXU2NAljZV9hZG1fc3NwX2RyZV90aW1lb3V0OwkJCS8qIDB4MDAwMDQ4ICovCisJdTY0CWNlX2FkbV9zc3BfZGVidWdfc2VsOwkJCS8qIDB4MDAwMDUwICovCisJdTY0CWNlX2FkbV9pbnRfc3RhdHVzOwkJCS8qIDB4MDAwMDU4ICovCisJdTY0CWNlX2FkbV9pbnRfc3RhdHVzX2FsaWFzOwkJLyogMHgwMDAwNjAgKi8KKwl1NjQJY2VfYWRtX2ludF9tYXNrOwkJCS8qIDB4MDAwMDY4ICovCisJdTY0CWNlX2FkbV9pbnRfcGVuZGluZzsJCQkvKiAweDAwMDA3MCAqLworCXU2NAljZV9hZG1fZm9yY2VfaW50OwkJCS8qIDB4MDAwMDc4ICovCisJdTY0CWNlX2FkbV91cmVfdXBzX2J1Zl9iYXJyaWVyX2ZsdXNoOwkvKiAweDAwMDA4MCAqLworCXU2NAljZV9hZG1faW50X2Rlc3RbMTVdOwkgICAgLyogMHgwMDAwODggLS0gMHgwMDAwRjggKi8KKwl1NjQJY2VfYWRtX2Vycm9yX3N1bW1hcnk7CQkJLyogMHgwMDAxMDAgKi8KKwl1NjQJY2VfYWRtX2Vycm9yX3N1bW1hcnlfYWxpYXM7CQkvKiAweDAwMDEwOCAqLworCXU2NAljZV9hZG1fZXJyb3JfbWFzazsJCQkvKiAweDAwMDExMCAqLworCXU2NAljZV9hZG1fZmlyc3RfZXJyb3I7CQkJLyogMHgwMDAxMTggKi8KKwl1NjQJY2VfYWRtX2Vycm9yX292ZXJmbG93OwkJCS8qIDB4MDAwMTIwICovCisJdTY0CWNlX2FkbV9lcnJvcl9vdmVyZmxvd19hbGlhczsJCS8qIDB4MDAwMTI4ICovCisJdTY0CWNlX3BhZF8wMDAxMzBbMl07CSAgICAvKiAweDAwMDEzMCAtLSAweDAwMDEzOCAqLworCXU2NAljZV9hZG1fdG51bV9lcnJvcjsJCQkvKiAweDAwMDE0MCAqLworCXU2NAljZV9hZG1fbW1yX2Vycl9kZXRhaWw7CQkJLyogMHgwMDAxNDggKi8KKwl1NjQJY2VfYWRtX21zZ19zcmFtX3BlcnJfZGV0YWlsOwkJLyogMHgwMDAxNTAgKi8KKwl1NjQJY2VfYWRtX2JhcF9zcmFtX3BlcnJfZGV0YWlsOwkJLyogMHgwMDAxNTggKi8KKwl1NjQJY2VfYWRtX2NlX3NyYW1fcGVycl9kZXRhaWw7CQkvKiAweDAwMDE2MCAqLworCXU2NAljZV9hZG1fY2VfY3JlZGl0X29mbG93X2RldGFpbDsJCS8qIDB4MDAwMTY4ICovCisJdTY0CWNlX2FkbV90eF9saW5rX2lkbGVfbWF4X3RpbWVyOwkJLyogMHgwMDAxNzAgKi8KKwl1NjQJY2VfYWRtX3BjaWVfZGVidWdfc2VsOwkJCS8qIDB4MDAwMTc4ICovCisJdTY0CWNlX3BhZF8wMDAxODBbMTZdOwkgICAgLyogMHgwMDAxODAgLS0gMHgwMDAxRjggKi8KIAotCXVpbnQ2NF90CWNlX2FkbV9wY2llX2RlYnVnX3NlbF90b3A7CQkvKiAweDAwMDIwMCAqLwotCXVpbnQ2NF90CWNlX2FkbV9wY2llX2RlYnVnX2xhdF9zZWxfbG9fdG9wOwkvKiAweDAwMDIwOCAqLwotCXVpbnQ2NF90CWNlX2FkbV9wY2llX2RlYnVnX2xhdF9zZWxfaGlfdG9wOwkvKiAweDAwMDIxMCAqLwotCXVpbnQ2NF90CWNlX2FkbV9wY2llX2RlYnVnX3RyaWdfc2VsX3RvcDsJCS8qIDB4MDAwMjE4ICovCi0JdWludDY0X3QJY2VfYWRtX3BjaWVfZGVidWdfdHJpZ19sYXRfc2VsX2xvX3RvcDsJLyogMHgwMDAyMjAgKi8KLQl1aW50NjRfdAljZV9hZG1fcGNpZV9kZWJ1Z190cmlnX2xhdF9zZWxfaGlfdG9wOwkvKiAweDAwMDIyOCAqLwotCXVpbnQ2NF90CWNlX2FkbV9wY2llX3RyaWdfY29tcGFyZV90b3A7CQkvKiAweDAwMDIzMCAqLwotCXVpbnQ2NF90CWNlX2FkbV9wY2llX3RyaWdfY29tcGFyZV9lbl90b3A7CS8qIDB4MDAwMjM4ICovCi0JdWludDY0X3QJY2VfYWRtX3NzcF9kZWJ1Z19zZWxfdG9wOwkJLyogMHgwMDAyNDAgKi8KLQl1aW50NjRfdAljZV9hZG1fc3NwX2RlYnVnX2xhdF9zZWxfbG9fdG9wOwkvKiAweDAwMDI0OCAqLwotCXVpbnQ2NF90CWNlX2FkbV9zc3BfZGVidWdfbGF0X3NlbF9oaV90b3A7CS8qIDB4MDAwMjUwICovCi0JdWludDY0X3QJY2VfYWRtX3NzcF9kZWJ1Z190cmlnX3NlbF90b3A7CQkvKiAweDAwMDI1OCAqLwotCXVpbnQ2NF90CWNlX2FkbV9zc3BfZGVidWdfdHJpZ19sYXRfc2VsX2xvX3RvcDsJLyogMHgwMDAyNjAgKi8KLQl1aW50NjRfdAljZV9hZG1fc3NwX2RlYnVnX3RyaWdfbGF0X3NlbF9oaV90b3A7CS8qIDB4MDAwMjY4ICovCi0JdWludDY0X3QJY2VfYWRtX3NzcF90cmlnX2NvbXBhcmVfdG9wOwkJLyogMHgwMDAyNzAgKi8KLQl1aW50NjRfdAljZV9hZG1fc3NwX3RyaWdfY29tcGFyZV9lbl90b3A7CQkvKiAweDAwMDI3OCAqLwotCXVpbnQ2NF90CWNlX3BhZF8wMDAyODBbNDhdOwkgICAgLyogMHgwMDAyODAgLS0gMHgwMDAzRjggKi8KKwl1NjQJY2VfYWRtX3BjaWVfZGVidWdfc2VsX3RvcDsJCS8qIDB4MDAwMjAwICovCisJdTY0CWNlX2FkbV9wY2llX2RlYnVnX2xhdF9zZWxfbG9fdG9wOwkvKiAweDAwMDIwOCAqLworCXU2NAljZV9hZG1fcGNpZV9kZWJ1Z19sYXRfc2VsX2hpX3RvcDsJLyogMHgwMDAyMTAgKi8KKwl1NjQJY2VfYWRtX3BjaWVfZGVidWdfdHJpZ19zZWxfdG9wOwkJLyogMHgwMDAyMTggKi8KKwl1NjQJY2VfYWRtX3BjaWVfZGVidWdfdHJpZ19sYXRfc2VsX2xvX3RvcDsJLyogMHgwMDAyMjAgKi8KKwl1NjQJY2VfYWRtX3BjaWVfZGVidWdfdHJpZ19sYXRfc2VsX2hpX3RvcDsJLyogMHgwMDAyMjggKi8KKwl1NjQJY2VfYWRtX3BjaWVfdHJpZ19jb21wYXJlX3RvcDsJCS8qIDB4MDAwMjMwICovCisJdTY0CWNlX2FkbV9wY2llX3RyaWdfY29tcGFyZV9lbl90b3A7CS8qIDB4MDAwMjM4ICovCisJdTY0CWNlX2FkbV9zc3BfZGVidWdfc2VsX3RvcDsJCS8qIDB4MDAwMjQwICovCisJdTY0CWNlX2FkbV9zc3BfZGVidWdfbGF0X3NlbF9sb190b3A7CS8qIDB4MDAwMjQ4ICovCisJdTY0CWNlX2FkbV9zc3BfZGVidWdfbGF0X3NlbF9oaV90b3A7CS8qIDB4MDAwMjUwICovCisJdTY0CWNlX2FkbV9zc3BfZGVidWdfdHJpZ19zZWxfdG9wOwkJLyogMHgwMDAyNTggKi8KKwl1NjQJY2VfYWRtX3NzcF9kZWJ1Z190cmlnX2xhdF9zZWxfbG9fdG9wOwkvKiAweDAwMDI2MCAqLworCXU2NAljZV9hZG1fc3NwX2RlYnVnX3RyaWdfbGF0X3NlbF9oaV90b3A7CS8qIDB4MDAwMjY4ICovCisJdTY0CWNlX2FkbV9zc3BfdHJpZ19jb21wYXJlX3RvcDsJCS8qIDB4MDAwMjcwICovCisJdTY0CWNlX2FkbV9zc3BfdHJpZ19jb21wYXJlX2VuX3RvcDsJCS8qIDB4MDAwMjc4ICovCisJdTY0CWNlX3BhZF8wMDAyODBbNDhdOwkgICAgLyogMHgwMDAyODAgLS0gMHgwMDAzRjggKi8KIAotCXVpbnQ2NF90CWNlX2FkbV9iYXBfY3RybDsJCQkvKiAweDAwMDQwMCAqLwotCXVpbnQ2NF90CWNlX3BhZF8wMDA0MDhbMTI3XTsJICAgIC8qIDB4MDAwNDA4IC0tIDB4MDAwN0Y4ICovCisJdTY0CWNlX2FkbV9iYXBfY3RybDsJCQkvKiAweDAwMDQwMCAqLworCXU2NAljZV9wYWRfMDAwNDA4WzEyN107CSAgICAvKiAweDAwMDQwOCAtLSAweDAwMDdGOCAqLwogCi0JdWludDY0X3QJY2VfbXNnX2J1Zl9kYXRhNjNfMFszNV07ICAgIC8qIDB4MDAwODAwIC0tIDB4MDAwOTE4ICovCi0JdWludDY0X3QJY2VfcGFkXzAwMDkyMFsyOV07CSAgICAvKiAweDAwMDkyMCAtLSAweDAwMDlGOCAqLworCXU2NAljZV9tc2dfYnVmX2RhdGE2M18wWzM1XTsgICAgLyogMHgwMDA4MDAgLS0gMHgwMDA5MTggKi8KKwl1NjQJY2VfcGFkXzAwMDkyMFsyOV07CSAgICAvKiAweDAwMDkyMCAtLSAweDAwMDlGOCAqLwogCi0JdWludDY0X3QJY2VfbXNnX2J1Zl9kYXRhMTI3XzY0WzM1XTsgIC8qIDB4MDAwQTAwIC0tIDB4MDAwQjE4ICovCi0JdWludDY0X3QJY2VfcGFkXzAwMEIyMFsyOV07CSAgICAvKiAweDAwMEIyMCAtLSAweDAwMEJGOCAqLworCXU2NAljZV9tc2dfYnVmX2RhdGExMjdfNjRbMzVdOyAgLyogMHgwMDBBMDAgLS0gMHgwMDBCMTggKi8KKwl1NjQJY2VfcGFkXzAwMEIyMFsyOV07CSAgICAvKiAweDAwMEIyMCAtLSAweDAwMEJGOCAqLwogCi0JdWludDY0X3QJY2VfbXNnX2J1Zl9wYXJpdHlbMzVdOwkgICAgLyogMHgwMDBDMDAgLS0gMHgwMDBEMTggKi8KLQl1aW50NjRfdAljZV9wYWRfMDAwRDIwWzI5XTsJICAgIC8qIDB4MDAwRDIwIC0tIDB4MDAwREY4ICovCisJdTY0CWNlX21zZ19idWZfcGFyaXR5WzM1XTsJICAgIC8qIDB4MDAwQzAwIC0tIDB4MDAwRDE4ICovCisJdTY0CWNlX3BhZF8wMDBEMjBbMjldOwkgICAgLyogMHgwMDBEMjAgLS0gMHgwMDBERjggKi8KIAotCXVpbnQ2NF90CWNlX3BhZF8wMDBFMDBbNTc2XTsJICAgIC8qIDB4MDAwRTAwIC0tIDB4MDAxRkY4ICovCisJdTY0CWNlX3BhZF8wMDBFMDBbNTc2XTsJICAgIC8qIDB4MDAwRTAwIC0tIDB4MDAxRkY4ICovCiAKIAkvKgogCSAqIExTSSA6IExTSSdzIFBDSSBFeHByZXNzIExpbmsgUmVnaXN0ZXJzIChMaW5rIzEgYW5kIExpbmsjMikKQEAgLTEwOSwxNDEgKzEwOSwxNDEgQEAKIAkgKi8KIAkjZGVmaW5lIGNlX2xzaShsaW5rX251bSkJY2VfbHNpW2xpbmtfbnVtLTFdCiAJc3RydWN0IGNlX2xzaV9yZWcgewotCQl1aW50NjRfdAljZV9sc2lfbHB1X2lkOwkJCS8qIDB4MDB6MDAwICovCi0JCXVpbnQ2NF90CWNlX2xzaV9yc3Q7CQkJLyogMHgwMHowMDggKi8KLQkJdWludDY0X3QJY2VfbHNpX2RiZ19zdGF0OwkJLyogMHgwMHowMTAgKi8KLQkJdWludDY0X3QJY2VfbHNpX2RiZ19jZmc7CQkJLyogMHgwMHowMTggKi8KLQkJdWludDY0X3QJY2VfbHNpX2x0c3NtX2N0cmw7CQkvKiAweDAwejAyMCAqLwotCQl1aW50NjRfdAljZV9sc2lfbGtfc3RhdDsJCQkvKiAweDAwejAyOCAqLwotCQl1aW50NjRfdAljZV9wYWRfMDB6MDMwWzJdOyAgIC8qIDB4MDB6MDMwIC0tIDB4MDB6MDM4ICovCi0JCXVpbnQ2NF90CWNlX2xzaV9pbnRfYW5kX3N0YXQ7CQkvKiAweDAwejA0MCAqLwotCQl1aW50NjRfdAljZV9sc2lfaW50X21hc2s7CQkvKiAweDAwejA0OCAqLwotCQl1aW50NjRfdAljZV9wYWRfMDB6MDUwWzIyXTsgIC8qIDB4MDB6MDUwIC0tIDB4MDB6MEY4ICovCi0JCXVpbnQ2NF90CWNlX2xzaV9sa19wZXJmX2NudF9zZWw7CQkvKiAweDAwejEwMCAqLwotCQl1aW50NjRfdAljZV9wYWRfMDB6MTA4OwkJCS8qIDB4MDB6MTA4ICovCi0JCXVpbnQ2NF90CWNlX2xzaV9sa19wZXJmX2NudF9jdHJsOwkvKiAweDAwejExMCAqLwotCQl1aW50NjRfdAljZV9wYWRfMDB6MTE4OwkJCS8qIDB4MDB6MTE4ICovCi0JCXVpbnQ2NF90CWNlX2xzaV9sa19wZXJmX2NudDE7CQkvKiAweDAwejEyMCAqLwotCQl1aW50NjRfdAljZV9sc2lfbGtfcGVyZl9jbnQxX3Rlc3Q7CS8qIDB4MDB6MTI4ICovCi0JCXVpbnQ2NF90CWNlX2xzaV9sa19wZXJmX2NudDI7CQkvKiAweDAwejEzMCAqLwotCQl1aW50NjRfdAljZV9sc2lfbGtfcGVyZl9jbnQyX3Rlc3Q7CS8qIDB4MDB6MTM4ICovCi0JCXVpbnQ2NF90CWNlX3BhZF8wMHoxNDBbMjRdOyAgLyogMHgwMHoxNDAgLS0gMHgwMHoxRjggKi8KLQkJdWludDY0X3QJY2VfbHNpX2xrX2x5cl9jZmc7CQkvKiAweDAwejIwMCAqLwotCQl1aW50NjRfdAljZV9sc2lfbGtfbHlyX3N0YXR1czsJCS8qIDB4MDB6MjA4ICovCi0JCXVpbnQ2NF90CWNlX2xzaV9sa19seXJfaW50X3N0YXQ7CQkvKiAweDAwejIxMCAqLwotCQl1aW50NjRfdAljZV9sc2lfbGtfbHlfaW50X3N0YXRfdGVzdDsJLyogMHgwMHoyMTggKi8KLQkJdWludDY0X3QJY2VfbHNpX2xrX2x5X2ludF9zdGF0X21hc2s7CS8qIDB4MDB6MjIwICovCi0JCXVpbnQ2NF90CWNlX3BhZF8wMHoyMjhbM107ICAgLyogMHgwMHoyMjggLS0gMHgwMHoyMzggKi8KLQkJdWludDY0X3QJY2VfbHNpX2ZjX3VwZF9jdGw7CQkvKiAweDAwejI0MCAqLwotCQl1aW50NjRfdAljZV9wYWRfMDB6MjQ4WzNdOyAgIC8qIDB4MDB6MjQ4IC0tIDB4MDB6MjU4ICovCi0JCXVpbnQ2NF90CWNlX2xzaV9mbHdfY3RsX3VwZF90b190aW1lcjsJLyogMHgwMHoyNjAgKi8KLQkJdWludDY0X3QJY2VfbHNpX2Zsd19jdGxfdXBkX3RpbWVyMDsJLyogMHgwMHoyNjggKi8KLQkJdWludDY0X3QJY2VfbHNpX2Zsd19jdGxfdXBkX3RpbWVyMTsJLyogMHgwMHoyNzAgKi8KLQkJdWludDY0X3QJY2VfcGFkXzAwejI3OFs0OV07ICAvKiAweDAwejI3OCAtLSAweDAwejNGOCAqLwotCQl1aW50NjRfdAljZV9sc2lfZnJlcV9uYWtfbGF0X3RocnNoOwkvKiAweDAwejQwMCAqLwotCQl1aW50NjRfdAljZV9sc2lfYWNrX25ha19sYXRfdG1yOwkJLyogMHgwMHo0MDggKi8KLQkJdWludDY0X3QJY2VfbHNpX3JwbHlfdG1yX3RocjsJCS8qIDB4MDB6NDEwICovCi0JCXVpbnQ2NF90CWNlX2xzaV9ycGx5X3RtcjsJCS8qIDB4MDB6NDE4ICovCi0JCXVpbnQ2NF90CWNlX2xzaV9ycGx5X251bV9zdGF0OwkJLyogMHgwMHo0MjAgKi8KLQkJdWludDY0X3QJY2VfbHNpX3J0eV9idWZfbWF4X2FkZHI7CS8qIDB4MDB6NDI4ICovCi0JCXVpbnQ2NF90CWNlX2xzaV9ydHlfZmlmb19wdHI7CQkvKiAweDAwejQzMCAqLwotCQl1aW50NjRfdAljZV9sc2lfcnR5X2ZpZm9fcmRfd3JfcHRyOwkvKiAweDAwejQzOCAqLwotCQl1aW50NjRfdAljZV9sc2lfcnR5X2ZpZm9fY3JlZDsJCS8qIDB4MDB6NDQwICovCi0JCXVpbnQ2NF90CWNlX2xzaV9zZXFfY250OwkJCS8qIDB4MDB6NDQ4ICovCi0JCXVpbnQ2NF90CWNlX2xzaV9hY2tfc2VudF9zZXFfbnVtOwkvKiAweDAwejQ1MCAqLwotCQl1aW50NjRfdAljZV9sc2lfc2VxX2NudF9maWZvX21heF9hZGRyOwkvKiAweDAwejQ1OCAqLwotCQl1aW50NjRfdAljZV9sc2lfc2VxX2NudF9maWZvX3B0cjsJLyogMHgwMHo0NjAgKi8KLQkJdWludDY0X3QJY2VfbHNpX3NlcV9jbnRfcmRfd3JfcHRyOwkvKiAweDAwejQ2OCAqLwotCQl1aW50NjRfdAljZV9sc2lfdHhfbGtfdHNfY3RsOwkJLyogMHgwMHo0NzAgKi8KLQkJdWludDY0X3QJY2VfcGFkXzAwejQ3ODsJCQkvKiAweDAwejQ3OCAqLwotCQl1aW50NjRfdAljZV9sc2lfbWVtX2FkZHJfY3RsOwkJLyogMHgwMHo0ODAgKi8KLQkJdWludDY0X3QJY2VfbHNpX21lbV9kX2xkMDsJCS8qIDB4MDB6NDg4ICovCi0JCXVpbnQ2NF90CWNlX2xzaV9tZW1fZF9sZDE7CQkvKiAweDAwejQ5MCAqLwotCQl1aW50NjRfdAljZV9sc2lfbWVtX2RfbGQyOwkJLyogMHgwMHo0OTggKi8KLQkJdWludDY0X3QJY2VfbHNpX21lbV9kX2xkMzsJCS8qIDB4MDB6NEEwICovCi0JCXVpbnQ2NF90CWNlX2xzaV9tZW1fZF9sZDQ7CQkvKiAweDAwejRBOCAqLwotCQl1aW50NjRfdAljZV9wYWRfMDB6NEIwWzJdOyAgIC8qIDB4MDB6NEIwIC0tIDB4MDB6NEI4ICovCi0JCXVpbnQ2NF90CWNlX2xzaV9ydHlfZF9jbnQ7CQkvKiAweDAwejRDMCAqLwotCQl1aW50NjRfdAljZV9sc2lfc2VxX2J1Zl9jbnQ7CQkvKiAweDAwejRDOCAqLwotCQl1aW50NjRfdAljZV9sc2lfc2VxX2J1Zl9idF9kOwkJLyogMHgwMHo0RDAgKi8KLQkJdWludDY0X3QJY2VfcGFkXzAwejREODsJCQkvKiAweDAwejREOCAqLwotCQl1aW50NjRfdAljZV9sc2lfYWNrX2xhdF90aHI7CQkvKiAweDAwejRFMCAqLwotCQl1aW50NjRfdAljZV9wYWRfMDB6NEU4WzNdOyAgIC8qIDB4MDB6NEU4IC0tIDB4MDB6NEY4ICovCi0JCXVpbnQ2NF90CWNlX2xzaV9ueHRfcmN2X3NlcV8xX2NudHI7CS8qIDB4MDB6NTAwICovCi0JCXVpbnQ2NF90CWNlX2xzaV91bnNwX2RsbHBfcmN2ZDsJCS8qIDB4MDB6NTA4ICovCi0JCXVpbnQ2NF90CWNlX2xzaV9yY3ZfbGtfdHNfY3RsOwkJLyogMHgwMHo1MTAgKi8KLQkJdWludDY0X3QJY2VfcGFkXzAwejUxOFsyOV07ICAvKiAweDAwejUxOCAtLSAweDAwejVGOCAqLwotCQl1aW50NjRfdAljZV9sc2lfcGh5X2x5cl9jZmc7CQkvKiAweDAwejYwMCAqLwotCQl1aW50NjRfdAljZV9wYWRfMDB6NjA4OwkJCS8qIDB4MDB6NjA4ICovCi0JCXVpbnQ2NF90CWNlX2xzaV9waHlfbHlyX2ludF9zdGF0OwkvKiAweDAwejYxMCAqLwotCQl1aW50NjRfdAljZV9sc2lfcGh5X2x5cl9pbnRfc3RhdF90ZXN0OwkvKiAweDAwejYxOCAqLwotCQl1aW50NjRfdAljZV9sc2lfcGh5X2x5cl9pbnRfbWFzazsJLyogMHgwMHo2MjAgKi8KLQkJdWludDY0X3QJY2VfcGFkXzAwejYyOFsxMV07ICAvKiAweDAwejYyOCAtLSAweDAwejY3OCAqLwotCQl1aW50NjRfdAljZV9sc2lfcmN2X3BoeV9jZmc7CQkvKiAweDAwejY4MCAqLwotCQl1aW50NjRfdAljZV9sc2lfcmN2X3BoeV9zdGF0MTsJCS8qIDB4MDB6Njg4ICovCi0JCXVpbnQ2NF90CWNlX2xzaV9yY3ZfcGh5X3N0YXQyOwkJLyogMHgwMHo2OTAgKi8KLQkJdWludDY0X3QJY2VfbHNpX3Jjdl9waHlfc3RhdDM7CQkvKiAweDAwejY5OCAqLwotCQl1aW50NjRfdAljZV9sc2lfcmN2X3BoeV9pbnRfc3RhdDsJLyogMHgwMHo2QTAgKi8KLQkJdWludDY0X3QJY2VfbHNpX3Jjdl9waHlfaW50X3N0YXRfdGVzdDsJLyogMHgwMHo2QTggKi8KLQkJdWludDY0X3QJY2VfbHNpX3Jjdl9waHlfaW50X21hc2s7CS8qIDB4MDB6NkIwICovCi0JCXVpbnQ2NF90CWNlX3BhZF8wMHo2QjhbOV07ICAgLyogMHgwMHo2QjggLS0gMHgwMHo2RjggKi8KLQkJdWludDY0X3QJY2VfbHNpX3R4X3BoeV9jZmc7CQkvKiAweDAwejcwMCAqLwotCQl1aW50NjRfdAljZV9sc2lfdHhfcGh5X3N0YXQ7CQkvKiAweDAwejcwOCAqLwotCQl1aW50NjRfdAljZV9sc2lfdHhfcGh5X2ludF9zdGF0OwkJLyogMHgwMHo3MTAgKi8KLQkJdWludDY0X3QJY2VfbHNpX3R4X3BoeV9pbnRfc3RhdF90ZXN0OwkvKiAweDAwejcxOCAqLwotCQl1aW50NjRfdAljZV9sc2lfdHhfcGh5X2ludF9tYXNrOwkJLyogMHgwMHo3MjAgKi8KLQkJdWludDY0X3QJY2VfbHNpX3R4X3BoeV9zdGF0MjsJCS8qIDB4MDB6NzI4ICovCi0JCXVpbnQ2NF90CWNlX3BhZF8wMHo3MzBbMTBdOyAgLyogMHgwMHo3MzAgLS0gMHgwMHo3N0YgKi8KLQkJdWludDY0X3QJY2VfbHNpX2x0c3NtX2NmZzE7CQkvKiAweDAwejc4MCAqLwotCQl1aW50NjRfdAljZV9sc2lfbHRzc21fY2ZnMjsJCS8qIDB4MDB6Nzg4ICovCi0JCXVpbnQ2NF90CWNlX2xzaV9sdHNzbV9jZmczOwkJLyogMHgwMHo3OTAgKi8KLQkJdWludDY0X3QJY2VfbHNpX2x0c3NtX2NmZzQ7CQkvKiAweDAwejc5OCAqLwotCQl1aW50NjRfdAljZV9sc2lfbHRzc21fY2ZnNTsJCS8qIDB4MDB6N0EwICovCi0JCXVpbnQ2NF90CWNlX2xzaV9sdHNzbV9zdGF0MTsJCS8qIDB4MDB6N0E4ICovCi0JCXVpbnQ2NF90CWNlX2xzaV9sdHNzbV9zdGF0MjsJCS8qIDB4MDB6N0IwICovCi0JCXVpbnQ2NF90CWNlX2xzaV9sdHNzbV9pbnRfc3RhdDsJCS8qIDB4MDB6N0I4ICovCi0JCXVpbnQ2NF90CWNlX2xzaV9sdHNzbV9pbnRfc3RhdF90ZXN0OwkvKiAweDAwejdDMCAqLwotCQl1aW50NjRfdAljZV9sc2lfbHRzc21faW50X21hc2s7CQkvKiAweDAwejdDOCAqLwotCQl1aW50NjRfdAljZV9sc2lfbHRzc21fc3RhdF93cl9lbjsJLyogMHgwMHo3RDAgKi8KLQkJdWludDY0X3QJY2VfcGFkXzAwejdEOFs1XTsgICAvKiAweDAwejdEOCAtLSAweDAwejdGOCAqLwotCQl1aW50NjRfdAljZV9sc2lfZ2JfY2ZnMTsJCQkvKiAweDAwejgwMCAqLwotCQl1aW50NjRfdAljZV9sc2lfZ2JfY2ZnMjsJCQkvKiAweDAwejgwOCAqLwotCQl1aW50NjRfdAljZV9sc2lfZ2JfY2ZnMzsJCQkvKiAweDAwejgxMCAqLwotCQl1aW50NjRfdAljZV9sc2lfZ2JfY2ZnNDsJCQkvKiAweDAwejgxOCAqLwotCQl1aW50NjRfdAljZV9sc2lfZ2Jfc3RhdDsJCQkvKiAweDAwejgyMCAqLwotCQl1aW50NjRfdAljZV9sc2lfZ2JfaW50X3N0YXQ7CQkvKiAweDAwejgyOCAqLwotCQl1aW50NjRfdAljZV9sc2lfZ2JfaW50X3N0YXRfdGVzdDsJLyogMHgwMHo4MzAgKi8KLQkJdWludDY0X3QJY2VfbHNpX2diX2ludF9tYXNrOwkJLyogMHgwMHo4MzggKi8KLQkJdWludDY0X3QJY2VfbHNpX2diX3B3cl9kbjE7CQkvKiAweDAwejg0MCAqLwotCQl1aW50NjRfdAljZV9sc2lfZ2JfcHdyX2RuMjsJCS8qIDB4MDB6ODQ4ICovCi0JCXVpbnQ2NF90CWNlX3BhZF8wMHo4NTBbMjQ2XTsgLyogMHgwMHo4NTAgLS0gMHgwMHpGRjggKi8KKwkJdTY0CWNlX2xzaV9scHVfaWQ7CQkJLyogMHgwMHowMDAgKi8KKwkJdTY0CWNlX2xzaV9yc3Q7CQkJLyogMHgwMHowMDggKi8KKwkJdTY0CWNlX2xzaV9kYmdfc3RhdDsJCS8qIDB4MDB6MDEwICovCisJCXU2NAljZV9sc2lfZGJnX2NmZzsJCQkvKiAweDAwejAxOCAqLworCQl1NjQJY2VfbHNpX2x0c3NtX2N0cmw7CQkvKiAweDAwejAyMCAqLworCQl1NjQJY2VfbHNpX2xrX3N0YXQ7CQkJLyogMHgwMHowMjggKi8KKwkJdTY0CWNlX3BhZF8wMHowMzBbMl07ICAgLyogMHgwMHowMzAgLS0gMHgwMHowMzggKi8KKwkJdTY0CWNlX2xzaV9pbnRfYW5kX3N0YXQ7CQkvKiAweDAwejA0MCAqLworCQl1NjQJY2VfbHNpX2ludF9tYXNrOwkJLyogMHgwMHowNDggKi8KKwkJdTY0CWNlX3BhZF8wMHowNTBbMjJdOyAgLyogMHgwMHowNTAgLS0gMHgwMHowRjggKi8KKwkJdTY0CWNlX2xzaV9sa19wZXJmX2NudF9zZWw7CQkvKiAweDAwejEwMCAqLworCQl1NjQJY2VfcGFkXzAwejEwODsJCQkvKiAweDAwejEwOCAqLworCQl1NjQJY2VfbHNpX2xrX3BlcmZfY250X2N0cmw7CS8qIDB4MDB6MTEwICovCisJCXU2NAljZV9wYWRfMDB6MTE4OwkJCS8qIDB4MDB6MTE4ICovCisJCXU2NAljZV9sc2lfbGtfcGVyZl9jbnQxOwkJLyogMHgwMHoxMjAgKi8KKwkJdTY0CWNlX2xzaV9sa19wZXJmX2NudDFfdGVzdDsJLyogMHgwMHoxMjggKi8KKwkJdTY0CWNlX2xzaV9sa19wZXJmX2NudDI7CQkvKiAweDAwejEzMCAqLworCQl1NjQJY2VfbHNpX2xrX3BlcmZfY250Ml90ZXN0OwkvKiAweDAwejEzOCAqLworCQl1NjQJY2VfcGFkXzAwejE0MFsyNF07ICAvKiAweDAwejE0MCAtLSAweDAwejFGOCAqLworCQl1NjQJY2VfbHNpX2xrX2x5cl9jZmc7CQkvKiAweDAwejIwMCAqLworCQl1NjQJY2VfbHNpX2xrX2x5cl9zdGF0dXM7CQkvKiAweDAwejIwOCAqLworCQl1NjQJY2VfbHNpX2xrX2x5cl9pbnRfc3RhdDsJCS8qIDB4MDB6MjEwICovCisJCXU2NAljZV9sc2lfbGtfbHlfaW50X3N0YXRfdGVzdDsJLyogMHgwMHoyMTggKi8KKwkJdTY0CWNlX2xzaV9sa19seV9pbnRfc3RhdF9tYXNrOwkvKiAweDAwejIyMCAqLworCQl1NjQJY2VfcGFkXzAwejIyOFszXTsgICAvKiAweDAwejIyOCAtLSAweDAwejIzOCAqLworCQl1NjQJY2VfbHNpX2ZjX3VwZF9jdGw7CQkvKiAweDAwejI0MCAqLworCQl1NjQJY2VfcGFkXzAwejI0OFszXTsgICAvKiAweDAwejI0OCAtLSAweDAwejI1OCAqLworCQl1NjQJY2VfbHNpX2Zsd19jdGxfdXBkX3RvX3RpbWVyOwkvKiAweDAwejI2MCAqLworCQl1NjQJY2VfbHNpX2Zsd19jdGxfdXBkX3RpbWVyMDsJLyogMHgwMHoyNjggKi8KKwkJdTY0CWNlX2xzaV9mbHdfY3RsX3VwZF90aW1lcjE7CS8qIDB4MDB6MjcwICovCisJCXU2NAljZV9wYWRfMDB6Mjc4WzQ5XTsgIC8qIDB4MDB6Mjc4IC0tIDB4MDB6M0Y4ICovCisJCXU2NAljZV9sc2lfZnJlcV9uYWtfbGF0X3RocnNoOwkvKiAweDAwejQwMCAqLworCQl1NjQJY2VfbHNpX2Fja19uYWtfbGF0X3RtcjsJCS8qIDB4MDB6NDA4ICovCisJCXU2NAljZV9sc2lfcnBseV90bXJfdGhyOwkJLyogMHgwMHo0MTAgKi8KKwkJdTY0CWNlX2xzaV9ycGx5X3RtcjsJCS8qIDB4MDB6NDE4ICovCisJCXU2NAljZV9sc2lfcnBseV9udW1fc3RhdDsJCS8qIDB4MDB6NDIwICovCisJCXU2NAljZV9sc2lfcnR5X2J1Zl9tYXhfYWRkcjsJLyogMHgwMHo0MjggKi8KKwkJdTY0CWNlX2xzaV9ydHlfZmlmb19wdHI7CQkvKiAweDAwejQzMCAqLworCQl1NjQJY2VfbHNpX3J0eV9maWZvX3JkX3dyX3B0cjsJLyogMHgwMHo0MzggKi8KKwkJdTY0CWNlX2xzaV9ydHlfZmlmb19jcmVkOwkJLyogMHgwMHo0NDAgKi8KKwkJdTY0CWNlX2xzaV9zZXFfY250OwkJCS8qIDB4MDB6NDQ4ICovCisJCXU2NAljZV9sc2lfYWNrX3NlbnRfc2VxX251bTsJLyogMHgwMHo0NTAgKi8KKwkJdTY0CWNlX2xzaV9zZXFfY250X2ZpZm9fbWF4X2FkZHI7CS8qIDB4MDB6NDU4ICovCisJCXU2NAljZV9sc2lfc2VxX2NudF9maWZvX3B0cjsJLyogMHgwMHo0NjAgKi8KKwkJdTY0CWNlX2xzaV9zZXFfY250X3JkX3dyX3B0cjsJLyogMHgwMHo0NjggKi8KKwkJdTY0CWNlX2xzaV90eF9sa190c19jdGw7CQkvKiAweDAwejQ3MCAqLworCQl1NjQJY2VfcGFkXzAwejQ3ODsJCQkvKiAweDAwejQ3OCAqLworCQl1NjQJY2VfbHNpX21lbV9hZGRyX2N0bDsJCS8qIDB4MDB6NDgwICovCisJCXU2NAljZV9sc2lfbWVtX2RfbGQwOwkJLyogMHgwMHo0ODggKi8KKwkJdTY0CWNlX2xzaV9tZW1fZF9sZDE7CQkvKiAweDAwejQ5MCAqLworCQl1NjQJY2VfbHNpX21lbV9kX2xkMjsJCS8qIDB4MDB6NDk4ICovCisJCXU2NAljZV9sc2lfbWVtX2RfbGQzOwkJLyogMHgwMHo0QTAgKi8KKwkJdTY0CWNlX2xzaV9tZW1fZF9sZDQ7CQkvKiAweDAwejRBOCAqLworCQl1NjQJY2VfcGFkXzAwejRCMFsyXTsgICAvKiAweDAwejRCMCAtLSAweDAwejRCOCAqLworCQl1NjQJY2VfbHNpX3J0eV9kX2NudDsJCS8qIDB4MDB6NEMwICovCisJCXU2NAljZV9sc2lfc2VxX2J1Zl9jbnQ7CQkvKiAweDAwejRDOCAqLworCQl1NjQJY2VfbHNpX3NlcV9idWZfYnRfZDsJCS8qIDB4MDB6NEQwICovCisJCXU2NAljZV9wYWRfMDB6NEQ4OwkJCS8qIDB4MDB6NEQ4ICovCisJCXU2NAljZV9sc2lfYWNrX2xhdF90aHI7CQkvKiAweDAwejRFMCAqLworCQl1NjQJY2VfcGFkXzAwejRFOFszXTsgICAvKiAweDAwejRFOCAtLSAweDAwejRGOCAqLworCQl1NjQJY2VfbHNpX254dF9yY3Zfc2VxXzFfY250cjsJLyogMHgwMHo1MDAgKi8KKwkJdTY0CWNlX2xzaV91bnNwX2RsbHBfcmN2ZDsJCS8qIDB4MDB6NTA4ICovCisJCXU2NAljZV9sc2lfcmN2X2xrX3RzX2N0bDsJCS8qIDB4MDB6NTEwICovCisJCXU2NAljZV9wYWRfMDB6NTE4WzI5XTsgIC8qIDB4MDB6NTE4IC0tIDB4MDB6NUY4ICovCisJCXU2NAljZV9sc2lfcGh5X2x5cl9jZmc7CQkvKiAweDAwejYwMCAqLworCQl1NjQJY2VfcGFkXzAwejYwODsJCQkvKiAweDAwejYwOCAqLworCQl1NjQJY2VfbHNpX3BoeV9seXJfaW50X3N0YXQ7CS8qIDB4MDB6NjEwICovCisJCXU2NAljZV9sc2lfcGh5X2x5cl9pbnRfc3RhdF90ZXN0OwkvKiAweDAwejYxOCAqLworCQl1NjQJY2VfbHNpX3BoeV9seXJfaW50X21hc2s7CS8qIDB4MDB6NjIwICovCisJCXU2NAljZV9wYWRfMDB6NjI4WzExXTsgIC8qIDB4MDB6NjI4IC0tIDB4MDB6Njc4ICovCisJCXU2NAljZV9sc2lfcmN2X3BoeV9jZmc7CQkvKiAweDAwejY4MCAqLworCQl1NjQJY2VfbHNpX3Jjdl9waHlfc3RhdDE7CQkvKiAweDAwejY4OCAqLworCQl1NjQJY2VfbHNpX3Jjdl9waHlfc3RhdDI7CQkvKiAweDAwejY5MCAqLworCQl1NjQJY2VfbHNpX3Jjdl9waHlfc3RhdDM7CQkvKiAweDAwejY5OCAqLworCQl1NjQJY2VfbHNpX3Jjdl9waHlfaW50X3N0YXQ7CS8qIDB4MDB6NkEwICovCisJCXU2NAljZV9sc2lfcmN2X3BoeV9pbnRfc3RhdF90ZXN0OwkvKiAweDAwejZBOCAqLworCQl1NjQJY2VfbHNpX3Jjdl9waHlfaW50X21hc2s7CS8qIDB4MDB6NkIwICovCisJCXU2NAljZV9wYWRfMDB6NkI4WzldOyAgIC8qIDB4MDB6NkI4IC0tIDB4MDB6NkY4ICovCisJCXU2NAljZV9sc2lfdHhfcGh5X2NmZzsJCS8qIDB4MDB6NzAwICovCisJCXU2NAljZV9sc2lfdHhfcGh5X3N0YXQ7CQkvKiAweDAwejcwOCAqLworCQl1NjQJY2VfbHNpX3R4X3BoeV9pbnRfc3RhdDsJCS8qIDB4MDB6NzEwICovCisJCXU2NAljZV9sc2lfdHhfcGh5X2ludF9zdGF0X3Rlc3Q7CS8qIDB4MDB6NzE4ICovCisJCXU2NAljZV9sc2lfdHhfcGh5X2ludF9tYXNrOwkJLyogMHgwMHo3MjAgKi8KKwkJdTY0CWNlX2xzaV90eF9waHlfc3RhdDI7CQkvKiAweDAwejcyOCAqLworCQl1NjQJY2VfcGFkXzAwejczMFsxMF07ICAvKiAweDAwejczMCAtLSAweDAwejc3RiAqLworCQl1NjQJY2VfbHNpX2x0c3NtX2NmZzE7CQkvKiAweDAwejc4MCAqLworCQl1NjQJY2VfbHNpX2x0c3NtX2NmZzI7CQkvKiAweDAwejc4OCAqLworCQl1NjQJY2VfbHNpX2x0c3NtX2NmZzM7CQkvKiAweDAwejc5MCAqLworCQl1NjQJY2VfbHNpX2x0c3NtX2NmZzQ7CQkvKiAweDAwejc5OCAqLworCQl1NjQJY2VfbHNpX2x0c3NtX2NmZzU7CQkvKiAweDAwejdBMCAqLworCQl1NjQJY2VfbHNpX2x0c3NtX3N0YXQxOwkJLyogMHgwMHo3QTggKi8KKwkJdTY0CWNlX2xzaV9sdHNzbV9zdGF0MjsJCS8qIDB4MDB6N0IwICovCisJCXU2NAljZV9sc2lfbHRzc21faW50X3N0YXQ7CQkvKiAweDAwejdCOCAqLworCQl1NjQJY2VfbHNpX2x0c3NtX2ludF9zdGF0X3Rlc3Q7CS8qIDB4MDB6N0MwICovCisJCXU2NAljZV9sc2lfbHRzc21faW50X21hc2s7CQkvKiAweDAwejdDOCAqLworCQl1NjQJY2VfbHNpX2x0c3NtX3N0YXRfd3JfZW47CS8qIDB4MDB6N0QwICovCisJCXU2NAljZV9wYWRfMDB6N0Q4WzVdOyAgIC8qIDB4MDB6N0Q4IC0tIDB4MDB6N0Y4ICovCisJCXU2NAljZV9sc2lfZ2JfY2ZnMTsJCQkvKiAweDAwejgwMCAqLworCQl1NjQJY2VfbHNpX2diX2NmZzI7CQkJLyogMHgwMHo4MDggKi8KKwkJdTY0CWNlX2xzaV9nYl9jZmczOwkJCS8qIDB4MDB6ODEwICovCisJCXU2NAljZV9sc2lfZ2JfY2ZnNDsJCQkvKiAweDAwejgxOCAqLworCQl1NjQJY2VfbHNpX2diX3N0YXQ7CQkJLyogMHgwMHo4MjAgKi8KKwkJdTY0CWNlX2xzaV9nYl9pbnRfc3RhdDsJCS8qIDB4MDB6ODI4ICovCisJCXU2NAljZV9sc2lfZ2JfaW50X3N0YXRfdGVzdDsJLyogMHgwMHo4MzAgKi8KKwkJdTY0CWNlX2xzaV9nYl9pbnRfbWFzazsJCS8qIDB4MDB6ODM4ICovCisJCXU2NAljZV9sc2lfZ2JfcHdyX2RuMTsJCS8qIDB4MDB6ODQwICovCisJCXU2NAljZV9sc2lfZ2JfcHdyX2RuMjsJCS8qIDB4MDB6ODQ4ICovCisJCXU2NAljZV9wYWRfMDB6ODUwWzI0Nl07IC8qIDB4MDB6ODUwIC0tIDB4MDB6RkY4ICovCiAJfSBjZV9sc2lbMl07CiAKLQl1aW50NjRfdAljZV9wYWRfMDA0MDAwWzEwXTsJICAgIC8qIDB4MDA0MDAwIC0tIDB4MDA0MDQ4ICovCisJdTY0CWNlX3BhZF8wMDQwMDBbMTBdOwkgICAgLyogMHgwMDQwMDAgLS0gMHgwMDQwNDggKi8KIAogCS8qCiAJICogQ1JNOiBDb3JldGFsayBSZWNlaXZlIE1vZHVsZSBSZWdpc3RlcnMKIAkgKi8KLQl1aW50NjRfdAljZV9jcm1fZGVidWdfbXV4OwkJCS8qIDB4MDA0MDUwICovCi0JdWludDY0X3QJY2VfcGFkXzAwNDA1ODsJCQkJLyogMHgwMDQwNTggKi8KLQl1aW50NjRfdAljZV9jcm1fc3NwX2Vycl9jbWRfd3JkOwkJCS8qIDB4MDA0MDYwICovCi0JdWludDY0X3QJY2VfY3JtX3NzcF9lcnJfYWRkcjsJCQkvKiAweDAwNDA2OCAqLwotCXVpbnQ2NF90CWNlX2NybV9zc3BfZXJyX3N5bjsJCQkvKiAweDAwNDA3MCAqLworCXU2NAljZV9jcm1fZGVidWdfbXV4OwkJCS8qIDB4MDA0MDUwICovCisJdTY0CWNlX3BhZF8wMDQwNTg7CQkJCS8qIDB4MDA0MDU4ICovCisJdTY0CWNlX2NybV9zc3BfZXJyX2NtZF93cmQ7CQkJLyogMHgwMDQwNjAgKi8KKwl1NjQJY2VfY3JtX3NzcF9lcnJfYWRkcjsJCQkvKiAweDAwNDA2OCAqLworCXU2NAljZV9jcm1fc3NwX2Vycl9zeW47CQkJLyogMHgwMDQwNzAgKi8KIAotCXVpbnQ2NF90CWNlX3BhZF8wMDQwNzhbNDk5XTsJICAgIC8qIDB4MDA0MDc4IC0tIDB4MDA1MDA4ICovCisJdTY0CWNlX3BhZF8wMDQwNzhbNDk5XTsJICAgIC8qIDB4MDA0MDc4IC0tIDB4MDA1MDA4ICovCiAKIAkvKgogICAgICAgICAgKiBDWE06IENvcmV0YWxrIFhtaXQgTW9kdWxlIFJlZ2lzdGVycwogICAgICAgICAgKi8KLQl1aW50NjRfdAljZV9jeG1fZHluX2NyZWRpdF9zdGF0dXM7CQkvKiAweDAwNTAxMCAqLwotCXVpbnQ2NF90CWNlX2N4bV9sYXN0X2NyZWRpdF9zdGF0dXM7CQkvKiAweDAwNTAxOCAqLwotCXVpbnQ2NF90CWNlX2N4bV9jcmVkaXRfbGltaXQ7CQkJLyogMHgwMDUwMjAgKi8KLQl1aW50NjRfdAljZV9jeG1fZm9yY2VfY3JlZGl0OwkJCS8qIDB4MDA1MDI4ICovCi0JdWludDY0X3QJY2VfY3htX2Rpc2FibGVfYnlwYXNzOwkJCS8qIDB4MDA1MDMwICovCi0JdWludDY0X3QJY2VfcGFkXzAwNTAzOFszXTsJICAgIC8qIDB4MDA1MDM4IC0tIDB4MDA1MDQ4ICovCi0JdWludDY0X3QJY2VfY3htX2RlYnVnX211eDsJCQkvKiAweDAwNTA1MCAqLworCXU2NAljZV9jeG1fZHluX2NyZWRpdF9zdGF0dXM7CQkvKiAweDAwNTAxMCAqLworCXU2NAljZV9jeG1fbGFzdF9jcmVkaXRfc3RhdHVzOwkJLyogMHgwMDUwMTggKi8KKwl1NjQJY2VfY3htX2NyZWRpdF9saW1pdDsJCQkvKiAweDAwNTAyMCAqLworCXU2NAljZV9jeG1fZm9yY2VfY3JlZGl0OwkJCS8qIDB4MDA1MDI4ICovCisJdTY0CWNlX2N4bV9kaXNhYmxlX2J5cGFzczsJCQkvKiAweDAwNTAzMCAqLworCXU2NAljZV9wYWRfMDA1MDM4WzNdOwkgICAgLyogMHgwMDUwMzggLS0gMHgwMDUwNDggKi8KKwl1NjQJY2VfY3htX2RlYnVnX211eDsJCQkvKiAweDAwNTA1MCAqLwogCi0gICAgICAgIHVpbnQ2NF90ICAgICAgICBjZV9wYWRfMDA1MDU4WzUwMV07ICAgICAgICAgLyogMHgwMDUwNTggLS0gMHgwMDVGRjggKi8KKyAgICAgICAgdTY0ICAgICAgICBjZV9wYWRfMDA1MDU4WzUwMV07ICAgICAgICAgLyogMHgwMDUwNTggLS0gMHgwMDVGRjggKi8KIAogCS8qCiAJICogRFRMOiBEb3duc3RyZWFtIFRyYW5zYWN0aW9uIExheWVyIFJlZ3MgKExpbmsjMSBhbmQgTGluayMyKQpAQCAtMjU4LDIwOSArMjU4LDIwOSBAQAogCSNkZWZpbmUgY2VfdXRsKGxpbmtfbnVtKQljZV9kdGxfdXRsW2xpbmtfbnVtLTFdCiAJc3RydWN0IGNlX2R0bF91dGxfcmVnIHsKIAkJLyogRFRMICovCi0JCXVpbnQ2NF90CWNlX2R0bF9kdGRyX2NyZWRpdF9saW1pdDsJLyogMHgwMHkwMDAgKi8KLQkJdWludDY0X3QJY2VfZHRsX2R0ZHJfY3JlZGl0X2ZvcmNlOwkvKiAweDAweTAwOCAqLwotCQl1aW50NjRfdAljZV9kdGxfZHluX2NyZWRpdF9zdGF0dXM7CS8qIDB4MDB5MDEwICovCi0JCXVpbnQ2NF90CWNlX2R0bF9kdGxfbGFzdF9jcmVkaXRfc3RhdDsJLyogMHgwMHkwMTggKi8KLQkJdWludDY0X3QJY2VfZHRsX2R0bF9jdHJsOwkJLyogMHgwMHkwMjAgKi8KLQkJdWludDY0X3QJY2VfcGFkXzAweTAyOFs1XTsgICAvKiAweDAweTAyOCAtLSAweDAweTA0OCAqLwotCQl1aW50NjRfdAljZV9kdGxfZGVidWdfc2VsOwkJLyogMHgwMHkwNTAgKi8KLQkJdWludDY0X3QJY2VfcGFkXzAweTA1OFs1MDFdOyAvKiAweDAweTA1OCAtLSAweDAweUZGOCAqLworCQl1NjQJY2VfZHRsX2R0ZHJfY3JlZGl0X2xpbWl0OwkvKiAweDAweTAwMCAqLworCQl1NjQJY2VfZHRsX2R0ZHJfY3JlZGl0X2ZvcmNlOwkvKiAweDAweTAwOCAqLworCQl1NjQJY2VfZHRsX2R5bl9jcmVkaXRfc3RhdHVzOwkvKiAweDAweTAxMCAqLworCQl1NjQJY2VfZHRsX2R0bF9sYXN0X2NyZWRpdF9zdGF0OwkvKiAweDAweTAxOCAqLworCQl1NjQJY2VfZHRsX2R0bF9jdHJsOwkJLyogMHgwMHkwMjAgKi8KKwkJdTY0CWNlX3BhZF8wMHkwMjhbNV07ICAgLyogMHgwMHkwMjggLS0gMHgwMHkwNDggKi8KKwkJdTY0CWNlX2R0bF9kZWJ1Z19zZWw7CQkvKiAweDAweTA1MCAqLworCQl1NjQJY2VfcGFkXzAweTA1OFs1MDFdOyAvKiAweDAweTA1OCAtLSAweDAweUZGOCAqLwogCiAJCS8qIFVUTCAqLwotCQl1aW50NjRfdAljZV91dGxfdXRsX2N0cmw7CQkvKiAweDAwejAwMCAqLwotCQl1aW50NjRfdAljZV91dGxfZGVidWdfc2VsOwkJLyogMHgwMHowMDggKi8KLQkJdWludDY0X3QJY2VfcGFkXzAwejAxMFs1MTBdOyAvKiAweDAwejAxMCAtLSAweDAwekZGOCAqLworCQl1NjQJY2VfdXRsX3V0bF9jdHJsOwkJLyogMHgwMHowMDAgKi8KKwkJdTY0CWNlX3V0bF9kZWJ1Z19zZWw7CQkvKiAweDAwejAwOCAqLworCQl1NjQJY2VfcGFkXzAwejAxMFs1MTBdOyAvKiAweDAwejAxMCAtLSAweDAwekZGOCAqLwogCX0gY2VfZHRsX3V0bFsyXTsKIAotCXVpbnQ2NF90CWNlX3BhZF8wMEEwMDBbNTE0XTsJICAgIC8qIDB4MDBBMDAwIC0tIDB4MDBCMDA4ICovCisJdTY0CWNlX3BhZF8wMEEwMDBbNTE0XTsJICAgIC8qIDB4MDBBMDAwIC0tIDB4MDBCMDA4ICovCiAKIAkvKgogCSAqIFVSRTogVXBzdHJlYW0gUmVxdWVzdCBFbmdpbmUKICAgICAgICAgICovCi0JdWludDY0X3QJY2VfdXJlX2R5bl9jcmVkaXRfc3RhdHVzOwkJLyogMHgwMEIwMTAgKi8KLQl1aW50NjRfdAljZV91cmVfbGFzdF9jcmVkaXRfc3RhdHVzOwkJLyogMHgwMEIwMTggKi8KLQl1aW50NjRfdAljZV91cmVfY3JlZGl0X2xpbWl0OwkJCS8qIDB4MDBCMDIwICovCi0JdWludDY0X3QJY2VfcGFkXzAwQjAyODsJCQkJLyogMHgwMEIwMjggKi8KLQl1aW50NjRfdAljZV91cmVfY29udHJvbDsJCQkJLyogMHgwMEIwMzAgKi8KLQl1aW50NjRfdAljZV91cmVfc3RhdHVzOwkJCQkvKiAweDAwQjAzOCAqLwotCXVpbnQ2NF90CWNlX3BhZF8wMEIwNDBbMl07CSAgICAvKiAweDAwQjA0MCAtLSAweDAwQjA0OCAqLwotCXVpbnQ2NF90CWNlX3VyZV9kZWJ1Z19zZWw7CQkJLyogMHgwMEIwNTAgKi8KLQl1aW50NjRfdAljZV91cmVfcGNpZV9kZWJ1Z19zZWw7CQkJLyogMHgwMEIwNTggKi8KLQl1aW50NjRfdAljZV91cmVfc3NwX2Vycl9jbWRfd3JkOwkJCS8qIDB4MDBCMDYwICovCi0JdWludDY0X3QJY2VfdXJlX3NzcF9lcnJfYWRkcjsJCQkvKiAweDAwQjA2OCAqLwotCXVpbnQ2NF90CWNlX3VyZV9wYWdlX21hcDsJCQkvKiAweDAwQjA3MCAqLwotCXVpbnQ2NF90CWNlX3VyZV9kaXJfbWFwW1RJT0NFX05VTV9QT1JUU107CS8qIDB4MDBCMDc4ICovCi0JdWludDY0X3QJY2VfdXJlX3BpcGVfc2VsMTsJCQkvKiAweDAwQjA4OCAqLwotCXVpbnQ2NF90CWNlX3VyZV9waXBlX21hc2sxOwkJCS8qIDB4MDBCMDkwICovCi0JdWludDY0X3QJY2VfdXJlX3BpcGVfc2VsMjsJCQkvKiAweDAwQjA5OCAqLwotCXVpbnQ2NF90CWNlX3VyZV9waXBlX21hc2syOwkJCS8qIDB4MDBCMEEwICovCi0JdWludDY0X3QJY2VfdXJlX3BjaWUxX2NyZWRpdHNfc2VudDsJCS8qIDB4MDBCMEE4ICovCi0JdWludDY0X3QJY2VfdXJlX3BjaWUxX2NyZWRpdHNfdXNlZDsJCS8qIDB4MDBCMEIwICovCi0JdWludDY0X3QJY2VfdXJlX3BjaWUxX2NyZWRpdF9saW1pdDsJCS8qIDB4MDBCMEI4ICovCi0JdWludDY0X3QJY2VfdXJlX3BjaWUyX2NyZWRpdHNfc2VudDsJCS8qIDB4MDBCMEMwICovCi0JdWludDY0X3QJY2VfdXJlX3BjaWUyX2NyZWRpdHNfdXNlZDsJCS8qIDB4MDBCMEM4ICovCi0JdWludDY0X3QJY2VfdXJlX3BjaWUyX2NyZWRpdF9saW1pdDsJCS8qIDB4MDBCMEQwICovCi0JdWludDY0X3QJY2VfdXJlX3BjaWVfZm9yY2VfY3JlZGl0OwkJLyogMHgwMEIwRDggKi8KLQl1aW50NjRfdAljZV91cmVfcmRfdG51bV92YWw7CQkJLyogMHgwMEIwRTAgKi8KLQl1aW50NjRfdAljZV91cmVfcmRfdG51bV9yc3BfcmN2ZDsJCS8qIDB4MDBCMEU4ICovCi0JdWludDY0X3QJY2VfdXJlX3JkX3RudW1fZXNlbnRfdGltZXI7CQkvKiAweDAwQjBGMCAqLwotCXVpbnQ2NF90CWNlX3VyZV9yZF90bnVtX2Vycm9yOwkJCS8qIDB4MDBCMEY4ICovCi0JdWludDY0X3QJY2VfdXJlX3JkX3RudW1fZmlyc3RfY2w7CQkvKiAweDAwQjEwMCAqLwotCXVpbnQ2NF90CWNlX3VyZV9yZF90bnVtX2xpbmtfYnVmOwkJLyogMHgwMEIxMDggKi8KLQl1aW50NjRfdAljZV91cmVfd3JfdG51bV92YWw7CQkJLyogMHgwMEIxMTAgKi8KLQl1aW50NjRfdAljZV91cmVfc3JhbV9lcnJfYWRkcjA7CQkJLyogMHgwMEIxMTggKi8KLQl1aW50NjRfdAljZV91cmVfc3JhbV9lcnJfYWRkcjE7CQkJLyogMHgwMEIxMjAgKi8KLQl1aW50NjRfdAljZV91cmVfc3JhbV9lcnJfYWRkcjI7CQkJLyogMHgwMEIxMjggKi8KLQl1aW50NjRfdAljZV91cmVfc3JhbV9yZF9hZGRyMDsJCQkvKiAweDAwQjEzMCAqLwotCXVpbnQ2NF90CWNlX3VyZV9zcmFtX3JkX2FkZHIxOwkJCS8qIDB4MDBCMTM4ICovCi0JdWludDY0X3QJY2VfdXJlX3NyYW1fcmRfYWRkcjI7CQkJLyogMHgwMEIxNDAgKi8KLQl1aW50NjRfdAljZV91cmVfc3JhbV93cl9hZGRyMDsJCQkvKiAweDAwQjE0OCAqLwotCXVpbnQ2NF90CWNlX3VyZV9zcmFtX3dyX2FkZHIxOwkJCS8qIDB4MDBCMTUwICovCi0JdWludDY0X3QJY2VfdXJlX3NyYW1fd3JfYWRkcjI7CQkJLyogMHgwMEIxNTggKi8KLQl1aW50NjRfdAljZV91cmVfYnVmX2ZsdXNoMTA7CQkJLyogMHgwMEIxNjAgKi8KLQl1aW50NjRfdAljZV91cmVfYnVmX2ZsdXNoMTE7CQkJLyogMHgwMEIxNjggKi8KLQl1aW50NjRfdAljZV91cmVfYnVmX2ZsdXNoMTI7CQkJLyogMHgwMEIxNzAgKi8KLQl1aW50NjRfdAljZV91cmVfYnVmX2ZsdXNoMTM7CQkJLyogMHgwMEIxNzggKi8KLQl1aW50NjRfdAljZV91cmVfYnVmX2ZsdXNoMjA7CQkJLyogMHgwMEIxODAgKi8KLQl1aW50NjRfdAljZV91cmVfYnVmX2ZsdXNoMjE7CQkJLyogMHgwMEIxODggKi8KLQl1aW50NjRfdAljZV91cmVfYnVmX2ZsdXNoMjI7CQkJLyogMHgwMEIxOTAgKi8KLQl1aW50NjRfdAljZV91cmVfYnVmX2ZsdXNoMjM7CQkJLyogMHgwMEIxOTggKi8KLQl1aW50NjRfdAljZV91cmVfcGNpZV9jb250cm9sMTsJCQkvKiAweDAwQjFBMCAqLwotCXVpbnQ2NF90CWNlX3VyZV9wY2llX2NvbnRyb2wyOwkJCS8qIDB4MDBCMUE4ICovCisJdTY0CWNlX3VyZV9keW5fY3JlZGl0X3N0YXR1czsJCS8qIDB4MDBCMDEwICovCisJdTY0CWNlX3VyZV9sYXN0X2NyZWRpdF9zdGF0dXM7CQkvKiAweDAwQjAxOCAqLworCXU2NAljZV91cmVfY3JlZGl0X2xpbWl0OwkJCS8qIDB4MDBCMDIwICovCisJdTY0CWNlX3BhZF8wMEIwMjg7CQkJCS8qIDB4MDBCMDI4ICovCisJdTY0CWNlX3VyZV9jb250cm9sOwkJCQkvKiAweDAwQjAzMCAqLworCXU2NAljZV91cmVfc3RhdHVzOwkJCQkvKiAweDAwQjAzOCAqLworCXU2NAljZV9wYWRfMDBCMDQwWzJdOwkgICAgLyogMHgwMEIwNDAgLS0gMHgwMEIwNDggKi8KKwl1NjQJY2VfdXJlX2RlYnVnX3NlbDsJCQkvKiAweDAwQjA1MCAqLworCXU2NAljZV91cmVfcGNpZV9kZWJ1Z19zZWw7CQkJLyogMHgwMEIwNTggKi8KKwl1NjQJY2VfdXJlX3NzcF9lcnJfY21kX3dyZDsJCQkvKiAweDAwQjA2MCAqLworCXU2NAljZV91cmVfc3NwX2Vycl9hZGRyOwkJCS8qIDB4MDBCMDY4ICovCisJdTY0CWNlX3VyZV9wYWdlX21hcDsJCQkvKiAweDAwQjA3MCAqLworCXU2NAljZV91cmVfZGlyX21hcFtUSU9DRV9OVU1fUE9SVFNdOwkvKiAweDAwQjA3OCAqLworCXU2NAljZV91cmVfcGlwZV9zZWwxOwkJCS8qIDB4MDBCMDg4ICovCisJdTY0CWNlX3VyZV9waXBlX21hc2sxOwkJCS8qIDB4MDBCMDkwICovCisJdTY0CWNlX3VyZV9waXBlX3NlbDI7CQkJLyogMHgwMEIwOTggKi8KKwl1NjQJY2VfdXJlX3BpcGVfbWFzazI7CQkJLyogMHgwMEIwQTAgKi8KKwl1NjQJY2VfdXJlX3BjaWUxX2NyZWRpdHNfc2VudDsJCS8qIDB4MDBCMEE4ICovCisJdTY0CWNlX3VyZV9wY2llMV9jcmVkaXRzX3VzZWQ7CQkvKiAweDAwQjBCMCAqLworCXU2NAljZV91cmVfcGNpZTFfY3JlZGl0X2xpbWl0OwkJLyogMHgwMEIwQjggKi8KKwl1NjQJY2VfdXJlX3BjaWUyX2NyZWRpdHNfc2VudDsJCS8qIDB4MDBCMEMwICovCisJdTY0CWNlX3VyZV9wY2llMl9jcmVkaXRzX3VzZWQ7CQkvKiAweDAwQjBDOCAqLworCXU2NAljZV91cmVfcGNpZTJfY3JlZGl0X2xpbWl0OwkJLyogMHgwMEIwRDAgKi8KKwl1NjQJY2VfdXJlX3BjaWVfZm9yY2VfY3JlZGl0OwkJLyogMHgwMEIwRDggKi8KKwl1NjQJY2VfdXJlX3JkX3RudW1fdmFsOwkJCS8qIDB4MDBCMEUwICovCisJdTY0CWNlX3VyZV9yZF90bnVtX3JzcF9yY3ZkOwkJLyogMHgwMEIwRTggKi8KKwl1NjQJY2VfdXJlX3JkX3RudW1fZXNlbnRfdGltZXI7CQkvKiAweDAwQjBGMCAqLworCXU2NAljZV91cmVfcmRfdG51bV9lcnJvcjsJCQkvKiAweDAwQjBGOCAqLworCXU2NAljZV91cmVfcmRfdG51bV9maXJzdF9jbDsJCS8qIDB4MDBCMTAwICovCisJdTY0CWNlX3VyZV9yZF90bnVtX2xpbmtfYnVmOwkJLyogMHgwMEIxMDggKi8KKwl1NjQJY2VfdXJlX3dyX3RudW1fdmFsOwkJCS8qIDB4MDBCMTEwICovCisJdTY0CWNlX3VyZV9zcmFtX2Vycl9hZGRyMDsJCQkvKiAweDAwQjExOCAqLworCXU2NAljZV91cmVfc3JhbV9lcnJfYWRkcjE7CQkJLyogMHgwMEIxMjAgKi8KKwl1NjQJY2VfdXJlX3NyYW1fZXJyX2FkZHIyOwkJCS8qIDB4MDBCMTI4ICovCisJdTY0CWNlX3VyZV9zcmFtX3JkX2FkZHIwOwkJCS8qIDB4MDBCMTMwICovCisJdTY0CWNlX3VyZV9zcmFtX3JkX2FkZHIxOwkJCS8qIDB4MDBCMTM4ICovCisJdTY0CWNlX3VyZV9zcmFtX3JkX2FkZHIyOwkJCS8qIDB4MDBCMTQwICovCisJdTY0CWNlX3VyZV9zcmFtX3dyX2FkZHIwOwkJCS8qIDB4MDBCMTQ4ICovCisJdTY0CWNlX3VyZV9zcmFtX3dyX2FkZHIxOwkJCS8qIDB4MDBCMTUwICovCisJdTY0CWNlX3VyZV9zcmFtX3dyX2FkZHIyOwkJCS8qIDB4MDBCMTU4ICovCisJdTY0CWNlX3VyZV9idWZfZmx1c2gxMDsJCQkvKiAweDAwQjE2MCAqLworCXU2NAljZV91cmVfYnVmX2ZsdXNoMTE7CQkJLyogMHgwMEIxNjggKi8KKwl1NjQJY2VfdXJlX2J1Zl9mbHVzaDEyOwkJCS8qIDB4MDBCMTcwICovCisJdTY0CWNlX3VyZV9idWZfZmx1c2gxMzsJCQkvKiAweDAwQjE3OCAqLworCXU2NAljZV91cmVfYnVmX2ZsdXNoMjA7CQkJLyogMHgwMEIxODAgKi8KKwl1NjQJY2VfdXJlX2J1Zl9mbHVzaDIxOwkJCS8qIDB4MDBCMTg4ICovCisJdTY0CWNlX3VyZV9idWZfZmx1c2gyMjsJCQkvKiAweDAwQjE5MCAqLworCXU2NAljZV91cmVfYnVmX2ZsdXNoMjM7CQkJLyogMHgwMEIxOTggKi8KKwl1NjQJY2VfdXJlX3BjaWVfY29udHJvbDE7CQkJLyogMHgwMEIxQTAgKi8KKwl1NjQJY2VfdXJlX3BjaWVfY29udHJvbDI7CQkJLyogMHgwMEIxQTggKi8KIAotCXVpbnQ2NF90CWNlX3BhZF8wMEIxQjBbNDU4XTsJICAgIC8qIDB4MDBCMUIwIC0tIDB4MDBCRkY4ICovCisJdTY0CWNlX3BhZF8wMEIxQjBbNDU4XTsJICAgIC8qIDB4MDBCMUIwIC0tIDB4MDBCRkY4ICovCiAKIAkvKiBVcHN0cmVhbSBEYXRhIEJ1ZmZlciwgUG9ydDEgKi8KIAlzdHJ1Y3QgY2VfdXJlX21haW50X3Vwc19kYXQxX2RhdGEgewotCQl1aW50NjRfdAlkYXRhNjNfMFs1MTJdOwkgICAgLyogMHgwMEMwMDAgLS0gMHgwMENGRjggKi8KLQkJdWludDY0X3QJZGF0YTEyN182NFs1MTJdOyAgICAvKiAweDAwRDAwMCAtLSAweDAwREZGOCAqLwotCQl1aW50NjRfdAlwYXJpdHlbNTEyXTsJICAgIC8qIDB4MDBFMDAwIC0tIDB4MDBFRkY4ICovCisJCXU2NAlkYXRhNjNfMFs1MTJdOwkgICAgLyogMHgwMEMwMDAgLS0gMHgwMENGRjggKi8KKwkJdTY0CWRhdGExMjdfNjRbNTEyXTsgICAgLyogMHgwMEQwMDAgLS0gMHgwMERGRjggKi8KKwkJdTY0CXBhcml0eVs1MTJdOwkgICAgLyogMHgwMEUwMDAgLS0gMHgwMEVGRjggKi8KIAl9IGNlX3VyZV9tYWludF91cHNfZGF0MTsKIAogCS8qIFVwc3RyZWFtIEhlYWRlciBCdWZmZXIsIFBvcnQxICovCiAJc3RydWN0IGNlX3VyZV9tYWludF91cHNfaGRyMV9kYXRhIHsKLQkJdWludDY0X3QJZGF0YTYzXzBbNTEyXTsJICAgIC8qIDB4MDBGMDAwIC0tIDB4MDBGRkY4ICovCi0JCXVpbnQ2NF90CWRhdGExMjdfNjRbNTEyXTsgICAgLyogMHgwMTAwMDAgLS0gMHgwMTBGRjggKi8KLQkJdWludDY0X3QJcGFyaXR5WzUxMl07CSAgICAvKiAweDAxMTAwMCAtLSAweDAxMUZGOCAqLworCQl1NjQJZGF0YTYzXzBbNTEyXTsJICAgIC8qIDB4MDBGMDAwIC0tIDB4MDBGRkY4ICovCisJCXU2NAlkYXRhMTI3XzY0WzUxMl07ICAgIC8qIDB4MDEwMDAwIC0tIDB4MDEwRkY4ICovCisJCXU2NAlwYXJpdHlbNTEyXTsJICAgIC8qIDB4MDExMDAwIC0tIDB4MDExRkY4ICovCiAJfSBjZV91cmVfbWFpbnRfdXBzX2hkcjE7CiAKIAkvKiBVcHN0cmVhbSBEYXRhIEJ1ZmZlciwgUG9ydDIgKi8KIAlzdHJ1Y3QgY2VfdXJlX21haW50X3Vwc19kYXQyX2RhdGEgewotCQl1aW50NjRfdAlkYXRhNjNfMFs1MTJdOwkgICAgLyogMHgwMTIwMDAgLS0gMHgwMTJGRjggKi8KLQkJdWludDY0X3QJZGF0YTEyN182NFs1MTJdOyAgICAvKiAweDAxMzAwMCAtLSAweDAxM0ZGOCAqLwotCQl1aW50NjRfdAlwYXJpdHlbNTEyXTsJICAgIC8qIDB4MDE0MDAwIC0tIDB4MDE0RkY4ICovCisJCXU2NAlkYXRhNjNfMFs1MTJdOwkgICAgLyogMHgwMTIwMDAgLS0gMHgwMTJGRjggKi8KKwkJdTY0CWRhdGExMjdfNjRbNTEyXTsgICAgLyogMHgwMTMwMDAgLS0gMHgwMTNGRjggKi8KKwkJdTY0CXBhcml0eVs1MTJdOwkgICAgLyogMHgwMTQwMDAgLS0gMHgwMTRGRjggKi8KIAl9IGNlX3VyZV9tYWludF91cHNfZGF0MjsKIAogCS8qIFVwc3RyZWFtIEhlYWRlciBCdWZmZXIsIFBvcnQyICovCiAJc3RydWN0IGNlX3VyZV9tYWludF91cHNfaGRyMl9kYXRhIHsKLQkJdWludDY0X3QJZGF0YTYzXzBbNTEyXTsJICAgIC8qIDB4MDE1MDAwIC0tIDB4MDE1RkY4ICovCi0JCXVpbnQ2NF90CWRhdGExMjdfNjRbNTEyXTsgICAgLyogMHgwMTYwMDAgLS0gMHgwMTZGRjggKi8KLQkJdWludDY0X3QJcGFyaXR5WzUxMl07CSAgICAvKiAweDAxNzAwMCAtLSAweDAxN0ZGOCAqLworCQl1NjQJZGF0YTYzXzBbNTEyXTsJICAgIC8qIDB4MDE1MDAwIC0tIDB4MDE1RkY4ICovCisJCXU2NAlkYXRhMTI3XzY0WzUxMl07ICAgIC8qIDB4MDE2MDAwIC0tIDB4MDE2RkY4ICovCisJCXU2NAlwYXJpdHlbNTEyXTsJICAgIC8qIDB4MDE3MDAwIC0tIDB4MDE3RkY4ICovCiAJfSBjZV91cmVfbWFpbnRfdXBzX2hkcjI7CiAKIAkvKiBEb3duc3RyZWFtIERhdGEgQnVmZmVyICovCiAJc3RydWN0IGNlX3VyZV9tYWludF9kbnNfZGF0X2RhdGEgewotCQl1aW50NjRfdAlkYXRhNjNfMFs1MTJdOwkgICAgLyogMHgwMTgwMDAgLS0gMHgwMThGRjggKi8KLQkJdWludDY0X3QJZGF0YTEyN182NFs1MTJdOyAgICAvKiAweDAxOTAwMCAtLSAweDAxOUZGOCAqLwotCQl1aW50NjRfdAlwYXJpdHlbNTEyXTsJICAgIC8qIDB4MDFBMDAwIC0tIDB4MDFBRkY4ICovCisJCXU2NAlkYXRhNjNfMFs1MTJdOwkgICAgLyogMHgwMTgwMDAgLS0gMHgwMThGRjggKi8KKwkJdTY0CWRhdGExMjdfNjRbNTEyXTsgICAgLyogMHgwMTkwMDAgLS0gMHgwMTlGRjggKi8KKwkJdTY0CXBhcml0eVs1MTJdOwkgICAgLyogMHgwMUEwMDAgLS0gMHgwMUFGRjggKi8KIAl9IGNlX3VyZV9tYWludF9kbnNfZGF0OwogCiAJLyogRG93bnN0cmVhbSBIZWFkZXIgQnVmZmVyICovCiAJc3RydWN0CWNlX3VyZV9tYWludF9kbnNfaGRyX2RhdGEgewotCQl1aW50NjRfdAlkYXRhMzFfMFs2NF07CSAgICAvKiAweDAxQjAwMCAtLSAweDAxQjFGOCAqLwotCQl1aW50NjRfdAlkYXRhOTVfMzJbNjRdOwkgICAgLyogMHgwMUIyMDAgLS0gMHgwMUIzRjggKi8KLQkJdWludDY0X3QJcGFyaXR5WzY0XTsJICAgIC8qIDB4MDFCNDAwIC0tIDB4MDFCNUY4ICovCisJCXU2NAlkYXRhMzFfMFs2NF07CSAgICAvKiAweDAxQjAwMCAtLSAweDAxQjFGOCAqLworCQl1NjQJZGF0YTk1XzMyWzY0XTsJICAgIC8qIDB4MDFCMjAwIC0tIDB4MDFCM0Y4ICovCisJCXU2NAlwYXJpdHlbNjRdOwkgICAgLyogMHgwMUI0MDAgLS0gMHgwMUI1RjggKi8KIAl9IGNlX3VyZV9tYWludF9kbnNfaGRyOwogCiAJLyogUkNJIEJ1ZmZlciBEYXRhICovCiAJc3RydWN0CWNlX3VyZV9tYWludF9yY2lfZGF0YSB7Ci0JCXVpbnQ2NF90CWRhdGE0MV8wWzY0XTsJICAgIC8qIDB4MDFCNjAwIC0tIDB4MDFCN0Y4ICovCi0JCXVpbnQ2NF90CWRhdGE2OV80Mls2NF07CSAgICAvKiAweDAxQjgwMCAtLSAweDAxQjlGOCAqLworCQl1NjQJZGF0YTQxXzBbNjRdOwkgICAgLyogMHgwMUI2MDAgLS0gMHgwMUI3RjggKi8KKwkJdTY0CWRhdGE2OV80Mls2NF07CSAgICAvKiAweDAxQjgwMCAtLSAweDAxQjlGOCAqLwogCX0gY2VfdXJlX21haW50X3JjaTsKIAogCS8qIFJlc3BvbnNlIFF1ZXVlICovCi0JdWludDY0X3QJY2VfdXJlX21haW50X3JzcHFbNjRdOwkgICAgLyogMHgwMUJBMDAgLS0gMHgwMUJCRjggKi8KKwl1NjQJY2VfdXJlX21haW50X3JzcHFbNjRdOwkgICAgLyogMHgwMUJBMDAgLS0gMHgwMUJCRjggKi8KIAotCXVpbnQ2NF90CWNlX3BhZF8wMUMwMDBbNDIyNF07CSAgICAvKiAweDAxQkMwMCAtLSAweDAyM0ZGOCAqLworCXU2NAljZV9wYWRfMDFDMDAwWzQyMjRdOwkgICAgLyogMHgwMUJDMDAgLS0gMHgwMjNGRjggKi8KIAogCS8qIEFkbWluIEJ1aWxkLWEtUGFja2V0IEJ1ZmZlciAqLwogCXN0cnVjdAljZV9hZG1fbWFpbnRfYmFwX2J1Zl9kYXRhIHsKLQkJdWludDY0X3QJZGF0YTYzXzBbMjU4XTsJICAgIC8qIDB4MDI0MDAwIC0tIDB4MDI0ODA4ICovCi0JCXVpbnQ2NF90CWRhdGExMjdfNjRbMjU4XTsgICAgLyogMHgwMjQ4MTAgLS0gMHgwMjUwMTggKi8KLQkJdWludDY0X3QJcGFyaXR5WzI1OF07CSAgICAvKiAweDAyNTAyMCAtLSAweDAyNTgyOCAqLworCQl1NjQJZGF0YTYzXzBbMjU4XTsJICAgIC8qIDB4MDI0MDAwIC0tIDB4MDI0ODA4ICovCisJCXU2NAlkYXRhMTI3XzY0WzI1OF07ICAgIC8qIDB4MDI0ODEwIC0tIDB4MDI1MDE4ICovCisJCXU2NAlwYXJpdHlbMjU4XTsJICAgIC8qIDB4MDI1MDIwIC0tIDB4MDI1ODI4ICovCiAJfSBjZV9hZG1fbWFpbnRfYmFwX2J1ZjsKIAotCXVpbnQ2NF90CWNlX3BhZF8wMjU4MzBbNTM3MF07CSAgICAvKiAweDAyNTgzMCAtLSAweDAyRkZGOCAqLworCXU2NAljZV9wYWRfMDI1ODMwWzUzNzBdOwkgICAgLyogMHgwMjU4MzAgLS0gMHgwMkZGRjggKi8KIAogCS8qIFVSRTogNDBiaXQgUE1VIEFURSBCdWZmZXIgKi8JCSAgICAvKiAweDAzMDAwMCAtLSAweDAzN0ZGOCAqLwotCXVpbnQ2NF90CWNlX3VyZV9hdGU0MFtUSU9DRV9OVU1fTTQwX0FURVNdOworCXU2NAljZV91cmVfYXRlNDBbVElPQ0VfTlVNX000MF9BVEVTXTsKIAogCS8qIFVSRTogMzIvNDBiaXQgUE1VIEFURSBCdWZmZXIgKi8JICAgIC8qIDB4MDM4MDAwIC0tIDB4MDNCRkY4ICovCi0JdWludDY0X3QJY2VfdXJlX2F0ZTMyNDBbVElPQ0VfTlVNX00zMjQwX0FURVNdOworCXU2NAljZV91cmVfYXRlMzI0MFtUSU9DRV9OVU1fTTMyNDBfQVRFU107CiAKLQl1aW50NjRfdAljZV9wYWRfMDNDMDAwWzIwNTBdOwkgICAgLyogMHgwM0MwMDAgLS0gMHgwNDAwMDggKi8KKwl1NjQJY2VfcGFkXzAzQzAwMFsyMDUwXTsJICAgIC8qIDB4MDNDMDAwIC0tIDB4MDQwMDA4ICovCiAKIAkvKgogCSAqIERSRTogRG93biBTdHJlYW0gUmVxdWVzdCBFbmdpbmUKICAgICAgICAgICovCi0JdWludDY0X3QJY2VfZHJlX2R5bl9jcmVkaXRfc3RhdHVzMTsJCS8qIDB4MDQwMDEwICovCi0JdWludDY0X3QJY2VfZHJlX2R5bl9jcmVkaXRfc3RhdHVzMjsJCS8qIDB4MDQwMDE4ICovCi0JdWludDY0X3QJY2VfZHJlX2xhc3RfY3JlZGl0X3N0YXR1czE7CQkvKiAweDA0MDAyMCAqLwotCXVpbnQ2NF90CWNlX2RyZV9sYXN0X2NyZWRpdF9zdGF0dXMyOwkJLyogMHgwNDAwMjggKi8KLQl1aW50NjRfdAljZV9kcmVfY3JlZGl0X2xpbWl0MTsJCQkvKiAweDA0MDAzMCAqLwotCXVpbnQ2NF90CWNlX2RyZV9jcmVkaXRfbGltaXQyOwkJCS8qIDB4MDQwMDM4ICovCi0JdWludDY0X3QJY2VfZHJlX2ZvcmNlX2NyZWRpdDE7CQkJLyogMHgwNDAwNDAgKi8KLQl1aW50NjRfdAljZV9kcmVfZm9yY2VfY3JlZGl0MjsJCQkvKiAweDA0MDA0OCAqLwotCXVpbnQ2NF90CWNlX2RyZV9kZWJ1Z19tdXgxOwkJCS8qIDB4MDQwMDUwICovCi0JdWludDY0X3QJY2VfZHJlX2RlYnVnX211eDI7CQkJLyogMHgwNDAwNTggKi8KLQl1aW50NjRfdAljZV9kcmVfc3NwX2Vycl9jbWRfd3JkOwkJCS8qIDB4MDQwMDYwICovCi0JdWludDY0X3QJY2VfZHJlX3NzcF9lcnJfYWRkcjsJCQkvKiAweDA0MDA2OCAqLwotCXVpbnQ2NF90CWNlX2RyZV9jb21wX2Vycl9jbWRfd3JkOwkJLyogMHgwNDAwNzAgKi8KLQl1aW50NjRfdAljZV9kcmVfY29tcF9lcnJfYWRkcjsJCQkvKiAweDA0MDA3OCAqLwotCXVpbnQ2NF90CWNlX2RyZV9yZXFfc3RhdHVzOwkJCS8qIDB4MDQwMDgwICovCi0JdWludDY0X3QJY2VfZHJlX2NvbmZpZzE7CQkJCS8qIDB4MDQwMDg4ICovCi0JdWludDY0X3QJY2VfZHJlX2NvbmZpZzI7CQkJCS8qIDB4MDQwMDkwICovCi0JdWludDY0X3QJY2VfZHJlX2NvbmZpZ19yZXFfc3RhdHVzOwkJLyogMHgwNDAwOTggKi8KLQl1aW50NjRfdAljZV9wYWRfMDQwMEEwWzEyXTsJICAgIC8qIDB4MDQwMEEwIC0tIDB4MDQwMEY4ICovCi0JdWludDY0X3QJY2VfZHJlX2R5bl9maWZvOwkJCS8qIDB4MDQwMTAwICovCi0JdWludDY0X3QJY2VfcGFkXzA0MDEwOFszXTsJICAgIC8qIDB4MDQwMTA4IC0tIDB4MDQwMTE4ICovCi0JdWludDY0X3QJY2VfZHJlX2xhc3RfZmlmbzsJCQkvKiAweDA0MDEyMCAqLworCXU2NAljZV9kcmVfZHluX2NyZWRpdF9zdGF0dXMxOwkJLyogMHgwNDAwMTAgKi8KKwl1NjQJY2VfZHJlX2R5bl9jcmVkaXRfc3RhdHVzMjsJCS8qIDB4MDQwMDE4ICovCisJdTY0CWNlX2RyZV9sYXN0X2NyZWRpdF9zdGF0dXMxOwkJLyogMHgwNDAwMjAgKi8KKwl1NjQJY2VfZHJlX2xhc3RfY3JlZGl0X3N0YXR1czI7CQkvKiAweDA0MDAyOCAqLworCXU2NAljZV9kcmVfY3JlZGl0X2xpbWl0MTsJCQkvKiAweDA0MDAzMCAqLworCXU2NAljZV9kcmVfY3JlZGl0X2xpbWl0MjsJCQkvKiAweDA0MDAzOCAqLworCXU2NAljZV9kcmVfZm9yY2VfY3JlZGl0MTsJCQkvKiAweDA0MDA0MCAqLworCXU2NAljZV9kcmVfZm9yY2VfY3JlZGl0MjsJCQkvKiAweDA0MDA0OCAqLworCXU2NAljZV9kcmVfZGVidWdfbXV4MTsJCQkvKiAweDA0MDA1MCAqLworCXU2NAljZV9kcmVfZGVidWdfbXV4MjsJCQkvKiAweDA0MDA1OCAqLworCXU2NAljZV9kcmVfc3NwX2Vycl9jbWRfd3JkOwkJCS8qIDB4MDQwMDYwICovCisJdTY0CWNlX2RyZV9zc3BfZXJyX2FkZHI7CQkJLyogMHgwNDAwNjggKi8KKwl1NjQJY2VfZHJlX2NvbXBfZXJyX2NtZF93cmQ7CQkvKiAweDA0MDA3MCAqLworCXU2NAljZV9kcmVfY29tcF9lcnJfYWRkcjsJCQkvKiAweDA0MDA3OCAqLworCXU2NAljZV9kcmVfcmVxX3N0YXR1czsJCQkvKiAweDA0MDA4MCAqLworCXU2NAljZV9kcmVfY29uZmlnMTsJCQkJLyogMHgwNDAwODggKi8KKwl1NjQJY2VfZHJlX2NvbmZpZzI7CQkJCS8qIDB4MDQwMDkwICovCisJdTY0CWNlX2RyZV9jb25maWdfcmVxX3N0YXR1czsJCS8qIDB4MDQwMDk4ICovCisJdTY0CWNlX3BhZF8wNDAwQTBbMTJdOwkgICAgLyogMHgwNDAwQTAgLS0gMHgwNDAwRjggKi8KKwl1NjQJY2VfZHJlX2R5bl9maWZvOwkJCS8qIDB4MDQwMTAwICovCisJdTY0CWNlX3BhZF8wNDAxMDhbM107CSAgICAvKiAweDA0MDEwOCAtLSAweDA0MDExOCAqLworCXU2NAljZV9kcmVfbGFzdF9maWZvOwkJCS8qIDB4MDQwMTIwICovCiAKLQl1aW50NjRfdAljZV9wYWRfMDQwMTI4WzI3XTsJICAgIC8qIDB4MDQwMTI4IC0tIDB4MDQwMUY4ICovCisJdTY0CWNlX3BhZF8wNDAxMjhbMjddOwkgICAgLyogMHgwNDAxMjggLS0gMHgwNDAxRjggKi8KIAogCS8qIERSRSBEb3duc3RyZWFtIEhlYWQgUXVldWUgKi8KIAlzdHJ1Y3QJY2VfZHJlX21haW50X2RzX2hlYWRfcXVldWUgewotCQl1aW50NjRfdAlkYXRhNjNfMFszMl07CSAgICAvKiAweDA0MDIwMCAtLSAweDA0MDJGOCAqLwotCQl1aW50NjRfdAlkYXRhMTI3XzY0WzMyXTsJICAgIC8qIDB4MDQwMzAwIC0tIDB4MDQwM0Y4ICovCi0JCXVpbnQ2NF90CXBhcml0eVszMl07CSAgICAvKiAweDA0MDQwMCAtLSAweDA0MDRGOCAqLworCQl1NjQJZGF0YTYzXzBbMzJdOwkgICAgLyogMHgwNDAyMDAgLS0gMHgwNDAyRjggKi8KKwkJdTY0CWRhdGExMjdfNjRbMzJdOwkgICAgLyogMHgwNDAzMDAgLS0gMHgwNDAzRjggKi8KKwkJdTY0CXBhcml0eVszMl07CSAgICAvKiAweDA0MDQwMCAtLSAweDA0MDRGOCAqLwogCX0gY2VfZHJlX21haW50X2RzX2hlYWRfcTsKIAotCXVpbnQ2NF90CWNlX3BhZF8wNDA1MDBbMzUyXTsJICAgIC8qIDB4MDQwNTAwIC0tIDB4MDQwRkY4ICovCisJdTY0CWNlX3BhZF8wNDA1MDBbMzUyXTsJICAgIC8qIDB4MDQwNTAwIC0tIDB4MDQwRkY4ICovCiAKIAkvKiBEUkUgRG93bnN0cmVhbSBEYXRhIFF1ZXVlICovCiAJc3RydWN0CWNlX2RyZV9tYWludF9kc19kYXRhX3F1ZXVlIHsKLQkJdWludDY0X3QJZGF0YTYzXzBbMjU2XTsJICAgIC8qIDB4MDQxMDAwIC0tIDB4MDQxN0Y4ICovCi0JCXVpbnQ2NF90CWNlX3BhZF8wNDE4MDBbMjU2XTsgLyogMHgwNDE4MDAgLS0gMHgwNDFGRjggKi8KLQkJdWludDY0X3QJZGF0YTEyN182NFsyNTZdOyAgICAvKiAweDA0MjAwMCAtLSAweDA0MjdGOCAqLwotCQl1aW50NjRfdAljZV9wYWRfMDQyODAwWzI1Nl07IC8qIDB4MDQyODAwIC0tIDB4MDQyRkY4ICovCi0JCXVpbnQ2NF90CXBhcml0eVsyNTZdOwkgICAgLyogMHgwNDMwMDAgLS0gMHgwNDM3RjggKi8KLQkJdWludDY0X3QJY2VfcGFkXzA0MzgwMFsyNTZdOyAvKiAweDA0MzgwMCAtLSAweDA0M0ZGOCAqLworCQl1NjQJZGF0YTYzXzBbMjU2XTsJICAgIC8qIDB4MDQxMDAwIC0tIDB4MDQxN0Y4ICovCisJCXU2NAljZV9wYWRfMDQxODAwWzI1Nl07IC8qIDB4MDQxODAwIC0tIDB4MDQxRkY4ICovCisJCXU2NAlkYXRhMTI3XzY0WzI1Nl07ICAgIC8qIDB4MDQyMDAwIC0tIDB4MDQyN0Y4ICovCisJCXU2NAljZV9wYWRfMDQyODAwWzI1Nl07IC8qIDB4MDQyODAwIC0tIDB4MDQyRkY4ICovCisJCXU2NAlwYXJpdHlbMjU2XTsJICAgIC8qIDB4MDQzMDAwIC0tIDB4MDQzN0Y4ICovCisJCXU2NAljZV9wYWRfMDQzODAwWzI1Nl07IC8qIDB4MDQzODAwIC0tIDB4MDQzRkY4ICovCiAJfSBjZV9kcmVfbWFpbnRfZHNfZGF0YV9xOwogCiAJLyogRFJFIFVSRSBVcHN0cmVhbSBSZXNwb25zZSBRdWV1ZSAqLwogCXN0cnVjdAljZV9kcmVfbWFpbnRfdXJlX3VzX3JzcF9xdWV1ZSB7Ci0JCXVpbnQ2NF90CWRhdGE2M18wWzhdOwkgICAgLyogMHgwNDQwMDAgLS0gMHgwNDQwMzggKi8KLQkJdWludDY0X3QJY2VfcGFkXzA0NDA0MFsyNF07ICAvKiAweDA0NDA0MCAtLSAweDA0NDBGOCAqLwotCQl1aW50NjRfdAlkYXRhMTI3XzY0WzhdOyAgICAgIC8qIDB4MDQ0MTAwIC0tIDB4MDQ0MTM4ICovCi0JCXVpbnQ2NF90CWNlX3BhZF8wNDQxNDBbMjRdOyAgLyogMHgwNDQxNDAgLS0gMHgwNDQxRjggKi8KLQkJdWludDY0X3QJcGFyaXR5WzhdOwkgICAgLyogMHgwNDQyMDAgLS0gMHgwNDQyMzggKi8KLQkJdWludDY0X3QJY2VfcGFkXzA0NDI0MFsyNF07ICAvKiAweDA0NDI0MCAtLSAweDA0NDJGOCAqLworCQl1NjQJZGF0YTYzXzBbOF07CSAgICAvKiAweDA0NDAwMCAtLSAweDA0NDAzOCAqLworCQl1NjQJY2VfcGFkXzA0NDA0MFsyNF07ICAvKiAweDA0NDA0MCAtLSAweDA0NDBGOCAqLworCQl1NjQJZGF0YTEyN182NFs4XTsgICAgICAvKiAweDA0NDEwMCAtLSAweDA0NDEzOCAqLworCQl1NjQJY2VfcGFkXzA0NDE0MFsyNF07ICAvKiAweDA0NDE0MCAtLSAweDA0NDFGOCAqLworCQl1NjQJcGFyaXR5WzhdOwkgICAgLyogMHgwNDQyMDAgLS0gMHgwNDQyMzggKi8KKwkJdTY0CWNlX3BhZF8wNDQyNDBbMjRdOyAgLyogMHgwNDQyNDAgLS0gMHgwNDQyRjggKi8KIAl9IGNlX2RyZV9tYWludF91cmVfdXNfcnNwX3E7CiAKLQl1aW50NjRfdCAJY2VfZHJlX21haW50X3VzX3dydF9yc3BbMzJdOy8qIDB4MDQ0MzAwIC0tIDB4MDQ0M0Y4ICovCisJdTY0IAljZV9kcmVfbWFpbnRfdXNfd3J0X3JzcFszMl07LyogMHgwNDQzMDAgLS0gMHgwNDQzRjggKi8KIAotCXVpbnQ2NF90CWNlX2VuZF9vZl9zdHJ1Y3Q7CQkJLyogMHgwNDQ0MDAgKi8KKwl1NjQJY2VfZW5kX29mX3N0cnVjdDsJCQkvKiAweDA0NDQwMCAqLwogfSB0aW9jZV90OwogCiAKQEAgLTYyNSwxMSArNjI1LDExIEBACiAjZGVmaW5lIENFX1VSRV9CVVNfTUFTSwkJCSgweEZGVUxMIDw8IEJVU19TUkNfSURfU0hGVCkKICNkZWZpbmUgQ0VfVVJFX0RFVl9NQVNLCQkJKDB4MUZVTEwgPDwgREVWX1NSQ19JRF9TSEZUKQogI2RlZmluZSBDRV9VUkVfRk5DX01BU0sJCQkoMHgwN1VMTCA8PCBGTkNfU1JDX0lEX1NIRlQpCi0jZGVmaW5lIENFX1VSRV9QSVBFX0JVUyhiKQkJKCgodWludDY0X3QpKGIpIDw8IEJVU19TUkNfSURfU0hGVCkgJiBcCisjZGVmaW5lIENFX1VSRV9QSVBFX0JVUyhiKQkJKCgodTY0KShiKSA8PCBCVVNfU1JDX0lEX1NIRlQpICYgXAogCQkJCQkgQ0VfVVJFX0JVU19NQVNLKQotI2RlZmluZSBDRV9VUkVfUElQRV9ERVYoZCkJCSgoKHVpbnQ2NF90KShkKSA8PCBERVZfU1JDX0lEX1NIRlQpICYgXAorI2RlZmluZSBDRV9VUkVfUElQRV9ERVYoZCkJCSgoKHU2NCkoZCkgPDwgREVWX1NSQ19JRF9TSEZUKSAmIFwKIAkJCQkJIENFX1VSRV9ERVZfTUFTSykKLSNkZWZpbmUgQ0VfVVJFX1BJUEVfRk5DKGYpCQkoKCh1aW50NjRfdCkoZikgPDwgRk5DX1NSQ19JRF9TSEZUKSAmIFwKKyNkZWZpbmUgQ0VfVVJFX1BJUEVfRk5DKGYpCQkoKCh1NjQpKGYpIDw8IEZOQ19TUkNfSURfU0hGVCkgJiBcCiAJCQkJCSBDRV9VUkVfRk5DX01BU0spCiAKICNkZWZpbmUgQ0VfVVJFX1NFTDFfU0hGVAkJMApAQCAtNjYwLDkgKzY2MCw5IEBACiAjZGVmaW5lIENFX1VSRV9QTjFfTUFTSwkJCSgweEZGVUxMIDw8IENFX1VSRV9QTjFfU0hGVCkKICNkZWZpbmUgQ0VfVVJFX1BOMl9TSEZUCQkJMjQKICNkZWZpbmUgQ0VfVVJFX1BOMl9NQVNLCQkJKDB4RkZVTEwgPDwgQ0VfVVJFX1BOMl9TSEZUKQotI2RlZmluZSBDRV9VUkVfUE4xX1NFVChuKQkJKCgodWludDY0X3QpKG4pIDw8IENFX1VSRV9QTjFfU0hGVCkgJiBcCisjZGVmaW5lIENFX1VSRV9QTjFfU0VUKG4pCQkoKCh1NjQpKG4pIDw8IENFX1VSRV9QTjFfU0hGVCkgJiBcCiAJCQkJCSBDRV9VUkVfUE4xX01BU0spCi0jZGVmaW5lIENFX1VSRV9QTjJfU0VUKG4pCQkoKCh1aW50NjRfdCkobikgPDwgQ0VfVVJFX1BOMl9TSEZUKSAmIFwKKyNkZWZpbmUgQ0VfVVJFX1BOMl9TRVQobikJCSgoKHU2NCkobikgPDwgQ0VfVVJFX1BOMl9TSEZUKSAmIFwKIAkJCQkJIENFX1VSRV9QTjJfTUFTSykKIAogLyogY2VfdXJlX3BjaWVfY29udHJvbDIgcmVnaXN0ZXIgYml0IG1hc2tzICYgc2hpZnRzICovCkBAIC02ODEsOSArNjgxLDkgQEAKICNkZWZpbmUgQ0VfVVJFX1BTTjFfTUFTSwkJKDB4MUZGRlVMTCA8PCBDRV9VUkVfUFNOMV9TSEZUKQogI2RlZmluZSBDRV9VUkVfUFNOMl9TSEZUCQkzMgogI2RlZmluZSBDRV9VUkVfUFNOMl9NQVNLCQkoMHgxRkZGVUxMIDw8IENFX1VSRV9QU04yX1NIRlQpCi0jZGVmaW5lIENFX1VSRV9QU04xX1NFVChuKQkJKCgodWludDY0X3QpKG4pIDw8IENFX1VSRV9QU04xX1NIRlQpICYgXAorI2RlZmluZSBDRV9VUkVfUFNOMV9TRVQobikJCSgoKHU2NCkobikgPDwgQ0VfVVJFX1BTTjFfU0hGVCkgJiBcCiAJCQkJCSBDRV9VUkVfUFNOMV9NQVNLKQotI2RlZmluZSBDRV9VUkVfUFNOMl9TRVQobikJCSgoKHVpbnQ2NF90KShuKSA8PCBDRV9VUkVfUFNOMl9TSEZUKSAmIFwKKyNkZWZpbmUgQ0VfVVJFX1BTTjJfU0VUKG4pCQkoKCh1NjQpKG4pIDw8IENFX1VSRV9QU04yX1NIRlQpICYgXAogCQkJCQkgQ0VfVVJFX1BTTjJfTUFTSykKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24vdGlvY2VfcHJvdmlkZXIuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vdGlvY2VfcHJvdmlkZXIuaAppbmRleCBjYjQxNDkwLi42ZDYyYjEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3Rpb2NlX3Byb3ZpZGVyLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi90aW9jZV9wcm92aWRlci5oCkBAIC0yMSw5ICsyMSw5IEBACiBzdHJ1Y3QgdGlvY2VfY29tbW9uIHsKIAlzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQJY2VfcGNpYnVzOwkvKiBjb21tb24gcGNpaW8gaGVhZGVyICovCiAKLQl1aW50MzJfdAkJY2VfcmV2OwotCXVpbnQ2NF90CQljZV9rZXJuZWxfcHJpdmF0ZTsKLQl1aW50NjRfdAkJY2VfcHJvbV9wcml2YXRlOworCXUzMgkJY2VfcmV2OworCXU2NAkJY2Vfa2VybmVsX3ByaXZhdGU7CisJdTY0CQljZV9wcm9tX3ByaXZhdGU7CiB9OwogCiBzdHJ1Y3QgdGlvY2Vfa2VybmVsIHsKQEAgLTMxLDMxICszMSwzMSBAQAogCXNwaW5sb2NrX3QJCWNlX2xvY2s7CiAJc3RydWN0IGxpc3RfaGVhZAljZV9kbWFtYXBfbGlzdDsKIAotCXVpbnQ2NF90CQljZV9hdGU0MF9zaGFkb3dbVElPQ0VfTlVNX000MF9BVEVTXTsKLQl1aW50NjRfdAkJY2VfYXRlMzI0MF9zaGFkb3dbVElPQ0VfTlVNX00zMjQwX0FURVNdOwotCXVpbnQzMl90CQljZV9hdGUzMjQwX3BhZ2VzaXplOworCXU2NAkJY2VfYXRlNDBfc2hhZG93W1RJT0NFX05VTV9NNDBfQVRFU107CisJdTY0CQljZV9hdGUzMjQwX3NoYWRvd1tUSU9DRV9OVU1fTTMyNDBfQVRFU107CisJdTMyCQljZV9hdGUzMjQwX3BhZ2VzaXplOwogCi0JdWludDhfdAkJCWNlX3BvcnQxX3NlY29uZGFyeTsKKwl1OAkJCWNlX3BvcnQxX3NlY29uZGFyeTsKIAogCS8qIHBlci1wb3J0IHJlc291cmNlcyAqLwogCXN0cnVjdCB7CiAJCWludCAJCWRpcm1hcF9yZWZjbnQ7Ci0JCXVpbnQ2NF90CWRpcm1hcF9zaGFkb3c7CisJCXU2NAlkaXJtYXBfc2hhZG93OwogCX0gY2VfcG9ydFtUSU9DRV9OVU1fUE9SVFNdOwogfTsKIAogc3RydWN0IHRpb2NlX2RtYW1hcCB7CiAJc3RydWN0IGxpc3RfaGVhZAljZV9kbWFtYXBfbGlzdDsJLyogaGVhZGVkIGJ5IHRpb2NlX2tlcm5lbCAqLwotCXVpbnQzMl90CQlyZWZjbnQ7CisJdTMyCQlyZWZjbnQ7CiAKLQl1aW50NjRfdAkJbmJ5dGVzOwkJLyogIyBieXRlcyBtYXBwZWQgKi8KKwl1NjQJCW5ieXRlczsJCS8qICMgYnl0ZXMgbWFwcGVkICovCiAKLQl1aW50NjRfdAkJY3Rfc3RhcnQ7CS8qIGNvcmV0YWxrIHN0YXJ0IGFkZHJlc3MgKi8KLQl1aW50NjRfdAkJcGNpX3N0YXJ0OwkvKiBidXMgc3RhcnQgYWRkcmVzcyAqLworCXU2NAkJY3Rfc3RhcnQ7CS8qIGNvcmV0YWxrIHN0YXJ0IGFkZHJlc3MgKi8KKwl1NjQJCXBjaV9zdGFydDsJLyogYnVzIHN0YXJ0IGFkZHJlc3MgKi8KIAotCXVpbnQ2NF90CQkqYXRlX2h3OwkvKiBodyBwdHIgb2YgZmlyc3QgYXRlIGluIG1hcCAqLwotCXVpbnQ2NF90CQkqYXRlX3NoYWRvdzsJLyogc2hhZG93IHB0ciBvZiBmaXJhdCBhdGUgKi8KLQl1aW50MTZfdAkJYXRlX2NvdW50OwkvKiAjIGF0ZSdzIGluIHRoZSBtYXAgKi8KKwl1NjQJCSphdGVfaHc7CS8qIGh3IHB0ciBvZiBmaXJzdCBhdGUgaW4gbWFwICovCisJdTY0CQkqYXRlX3NoYWRvdzsJLyogc2hhZG93IHB0ciBvZiBmaXJhdCBhdGUgKi8KKwl1MTYJCWF0ZV9jb3VudDsJLyogIyBhdGUncyBpbiB0aGUgbWFwICovCiB9OwogCiBleHRlcm4gaW50IHRpb2NlX2luaXRfcHJvdmlkZXIodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3Rpb2NwLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3Rpb2NwLmgKaW5kZXggNWYyNDg5Yy4uZjQ3YzA4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi90aW9jcC5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vdGlvY3AuaApAQCAtMjEsMTg5ICsyMSwxODkgQEAKICAgICAvKiAweDAwMDAwMC0weDAwRkZGRiAtLSBMb2NhbCBSZWdpc3RlcnMgKi8KIAogICAgIC8qIDB4MDAwMDAwLTB4MDAwMDU3IC0tIChMZWdhY3kgV2lkZ2V0IFNwYWNlKSBDb25maWd1cmF0aW9uICovCi0gICAgdWludDY0X3QJCWNwX2lkOwkJCQkvKiAweDAwMDAwMCAqLwotICAgIHVpbnQ2NF90CQljcF9zdGF0OwkJCS8qIDB4MDAwMDA4ICovCi0gICAgdWludDY0X3QJCWNwX2Vycl91cHBlcjsJCQkvKiAweDAwMDAxMCAqLwotICAgIHVpbnQ2NF90CQljcF9lcnJfbG93ZXI7CQkJLyogMHgwMDAwMTggKi8KKyAgICB1NjQJCWNwX2lkOwkJCQkvKiAweDAwMDAwMCAqLworICAgIHU2NAkJY3Bfc3RhdDsJCQkvKiAweDAwMDAwOCAqLworICAgIHU2NAkJY3BfZXJyX3VwcGVyOwkJCS8qIDB4MDAwMDEwICovCisgICAgdTY0CQljcF9lcnJfbG93ZXI7CQkJLyogMHgwMDAwMTggKi8KICAgICAjZGVmaW5lIGNwX2VyciBjcF9lcnJfbG93ZXIKLSAgICB1aW50NjRfdAkJY3BfY29udHJvbDsJCQkvKiAweDAwMDAyMCAqLwotICAgIHVpbnQ2NF90CQljcF9yZXFfdGltZW91dDsJCQkvKiAweDAwMDAyOCAqLwotICAgIHVpbnQ2NF90CQljcF9pbnRyX3VwcGVyOwkJCS8qIDB4MDAwMDMwICovCi0gICAgdWludDY0X3QJCWNwX2ludHJfbG93ZXI7CQkJLyogMHgwMDAwMzggKi8KKyAgICB1NjQJCWNwX2NvbnRyb2w7CQkJLyogMHgwMDAwMjAgKi8KKyAgICB1NjQJCWNwX3JlcV90aW1lb3V0OwkJCS8qIDB4MDAwMDI4ICovCisgICAgdTY0CQljcF9pbnRyX3VwcGVyOwkJCS8qIDB4MDAwMDMwICovCisgICAgdTY0CQljcF9pbnRyX2xvd2VyOwkJCS8qIDB4MDAwMDM4ICovCiAgICAgI2RlZmluZSBjcF9pbnRyIGNwX2ludHJfbG93ZXIKLSAgICB1aW50NjRfdAkJY3BfZXJyX2NtZHdvcmQ7CQkJLyogMHgwMDAwNDAgKi8KLSAgICB1aW50NjRfdAkJX3BhZF8wMDAwNDg7CQkJLyogMHgwMDAwNDggKi8KLSAgICB1aW50NjRfdAkJY3BfdGZsdXNoOwkJCS8qIDB4MDAwMDUwICovCisgICAgdTY0CQljcF9lcnJfY21kd29yZDsJCQkvKiAweDAwMDA0MCAqLworICAgIHU2NAkJX3BhZF8wMDAwNDg7CQkJLyogMHgwMDAwNDggKi8KKyAgICB1NjQJCWNwX3RmbHVzaDsJCQkvKiAweDAwMDA1MCAqLwogCiAgICAgLyogMHgwMDAwNTgtMHgwMDAwN0YgLS0gQnJpZGdlLXNwZWNpZmljIENvbmZpZ3VyYXRpb24gKi8KLSAgICB1aW50NjRfdAkJY3BfYXV4X2VycjsJCQkvKiAweDAwMDA1OCAqLwotICAgIHVpbnQ2NF90CQljcF9yZXNwX3VwcGVyOwkJCS8qIDB4MDAwMDYwICovCi0gICAgdWludDY0X3QJCWNwX3Jlc3BfbG93ZXI7CQkJLyogMHgwMDAwNjggKi8KKyAgICB1NjQJCWNwX2F1eF9lcnI7CQkJLyogMHgwMDAwNTggKi8KKyAgICB1NjQJCWNwX3Jlc3BfdXBwZXI7CQkJLyogMHgwMDAwNjAgKi8KKyAgICB1NjQJCWNwX3Jlc3BfbG93ZXI7CQkJLyogMHgwMDAwNjggKi8KICAgICAjZGVmaW5lIGNwX3Jlc3AgY3BfcmVzcF9sb3dlcgotICAgIHVpbnQ2NF90CQljcF90c3RfcGluX2N0cmw7CQkvKiAweDAwMDA3MCAqLwotICAgIHVpbnQ2NF90CQljcF9hZGRyX2xrZXJyOwkJCS8qIDB4MDAwMDc4ICovCisgICAgdTY0CQljcF90c3RfcGluX2N0cmw7CQkvKiAweDAwMDA3MCAqLworICAgIHU2NAkJY3BfYWRkcl9sa2VycjsJCQkvKiAweDAwMDA3OCAqLwogCiAgICAgLyogMHgwMDAwODAtMHgwMDAwOEYgLS0gUE1VICYgTUFQICovCi0gICAgdWludDY0X3QJCWNwX2Rpcl9tYXA7CQkJLyogMHgwMDAwODAgKi8KLSAgICB1aW50NjRfdAkJX3BhZF8wMDAwODg7CQkJLyogMHgwMDAwODggKi8KKyAgICB1NjQJCWNwX2Rpcl9tYXA7CQkJLyogMHgwMDAwODAgKi8KKyAgICB1NjQJCV9wYWRfMDAwMDg4OwkJCS8qIDB4MDAwMDg4ICovCiAKICAgICAvKiAweDAwMDA5MC0weDAwMDA5RiAtLSBTU1JBTSAqLwotICAgIHVpbnQ2NF90CQljcF9tYXBfZmF1bHQ7CQkJLyogMHgwMDAwOTAgKi8KLSAgICB1aW50NjRfdAkJX3BhZF8wMDAwOTg7CQkJLyogMHgwMDAwOTggKi8KKyAgICB1NjQJCWNwX21hcF9mYXVsdDsJCQkvKiAweDAwMDA5MCAqLworICAgIHU2NAkJX3BhZF8wMDAwOTg7CQkJLyogMHgwMDAwOTggKi8KIAogICAgIC8qIDB4MDAwMEEwLTB4MDAwMEFGIC0tIEFyYml0cmF0aW9uICovCi0gICAgdWludDY0X3QJCWNwX2FyYjsJCQkJLyogMHgwMDAwQTAgKi8KLSAgICB1aW50NjRfdAkJX3BhZF8wMDAwQTg7CQkJLyogMHgwMDAwQTggKi8KKyAgICB1NjQJCWNwX2FyYjsJCQkJLyogMHgwMDAwQTAgKi8KKyAgICB1NjQJCV9wYWRfMDAwMEE4OwkJCS8qIDB4MDAwMEE4ICovCiAKICAgICAvKiAweDAwMDBCMC0weDAwMDBCRiAtLSBOdW1iZXIgSW4gQSBDYW4gb3IgQVRFIFBhcml0eSBFcnJvciAqLwotICAgIHVpbnQ2NF90CQljcF9hdGVfcGFyaXR5X2VycjsJCS8qIDB4MDAwMEIwICovCi0gICAgdWludDY0X3QJCV9wYWRfMDAwMEI4OwkJCS8qIDB4MDAwMEI4ICovCisgICAgdTY0CQljcF9hdGVfcGFyaXR5X2VycjsJCS8qIDB4MDAwMEIwICovCisgICAgdTY0CQlfcGFkXzAwMDBCODsJCQkvKiAweDAwMDBCOCAqLwogCiAgICAgLyogMHgwMDAwQzAtMHgwMDAwRkYgLS0gUENJL0dJTyAqLwotICAgIHVpbnQ2NF90CQljcF9idXNfdGltZW91dDsJCQkvKiAweDAwMDBDMCAqLwotICAgIHVpbnQ2NF90CQljcF9wY2lfY2ZnOwkJCS8qIDB4MDAwMEM4ICovCi0gICAgdWludDY0X3QJCWNwX3BjaV9lcnJfdXBwZXI7CQkvKiAweDAwMDBEMCAqLwotICAgIHVpbnQ2NF90CQljcF9wY2lfZXJyX2xvd2VyOwkJLyogMHgwMDAwRDggKi8KKyAgICB1NjQJCWNwX2J1c190aW1lb3V0OwkJCS8qIDB4MDAwMEMwICovCisgICAgdTY0CQljcF9wY2lfY2ZnOwkJCS8qIDB4MDAwMEM4ICovCisgICAgdTY0CQljcF9wY2lfZXJyX3VwcGVyOwkJLyogMHgwMDAwRDAgKi8KKyAgICB1NjQJCWNwX3BjaV9lcnJfbG93ZXI7CQkvKiAweDAwMDBEOCAqLwogICAgICNkZWZpbmUgY3BfcGNpX2VyciBjcF9wY2lfZXJyX2xvd2VyCi0gICAgdWludDY0X3QJCV9wYWRfMDAwMEUwWzRdOwkJCS8qIDB4MDAwMHtFMC4uRjh9ICovCisgICAgdTY0CQlfcGFkXzAwMDBFMFs0XTsJCQkvKiAweDAwMDB7RTAuLkY4fSAqLwogCiAgICAgLyogMHgwMDAxMDAtMHgwMDAxRkYgLS0gSW50ZXJydXB0ICovCi0gICAgdWludDY0X3QJCWNwX2ludF9zdGF0dXM7CQkJLyogMHgwMDAxMDAgKi8KLSAgICB1aW50NjRfdAkJY3BfaW50X2VuYWJsZTsJCQkvKiAweDAwMDEwOCAqLwotICAgIHVpbnQ2NF90CQljcF9pbnRfcnN0X3N0YXQ7CQkvKiAweDAwMDExMCAqLwotICAgIHVpbnQ2NF90CQljcF9pbnRfbW9kZTsJCQkvKiAweDAwMDExOCAqLwotICAgIHVpbnQ2NF90CQljcF9pbnRfZGV2aWNlOwkJCS8qIDB4MDAwMTIwICovCi0gICAgdWludDY0X3QJCWNwX2ludF9ob3N0X2VycjsJCS8qIDB4MDAwMTI4ICovCi0gICAgdWludDY0X3QJCWNwX2ludF9hZGRyWzhdOwkJCS8qIDB4MDAwMXszMCwsLDY4fSAqLwotICAgIHVpbnQ2NF90CQljcF9lcnJfaW50X3ZpZXc7CQkvKiAweDAwMDE3MCAqLwotICAgIHVpbnQ2NF90CQljcF9tdWx0X2ludDsJCQkvKiAweDAwMDE3OCAqLwotICAgIHVpbnQ2NF90CQljcF9mb3JjZV9hbHdheXNbOF07CQkvKiAweDAwMDF7ODAsLCxCOH0gKi8KLSAgICB1aW50NjRfdAkJY3BfZm9yY2VfcGluWzhdOwkJLyogMHgwMDAxe0MwLCwsRjh9ICovCisgICAgdTY0CQljcF9pbnRfc3RhdHVzOwkJCS8qIDB4MDAwMTAwICovCisgICAgdTY0CQljcF9pbnRfZW5hYmxlOwkJCS8qIDB4MDAwMTA4ICovCisgICAgdTY0CQljcF9pbnRfcnN0X3N0YXQ7CQkvKiAweDAwMDExMCAqLworICAgIHU2NAkJY3BfaW50X21vZGU7CQkJLyogMHgwMDAxMTggKi8KKyAgICB1NjQJCWNwX2ludF9kZXZpY2U7CQkJLyogMHgwMDAxMjAgKi8KKyAgICB1NjQJCWNwX2ludF9ob3N0X2VycjsJCS8qIDB4MDAwMTI4ICovCisgICAgdTY0CQljcF9pbnRfYWRkcls4XTsJCQkvKiAweDAwMDF7MzAsLCw2OH0gKi8KKyAgICB1NjQJCWNwX2Vycl9pbnRfdmlldzsJCS8qIDB4MDAwMTcwICovCisgICAgdTY0CQljcF9tdWx0X2ludDsJCQkvKiAweDAwMDE3OCAqLworICAgIHU2NAkJY3BfZm9yY2VfYWx3YXlzWzhdOwkJLyogMHgwMDAxezgwLCwsQjh9ICovCisgICAgdTY0CQljcF9mb3JjZV9waW5bOF07CQkvKiAweDAwMDF7QzAsLCxGOH0gKi8KIAogICAgIC8qIDB4MDAwMjAwLTB4MDAwMjk4IC0tIERldmljZSAqLwotICAgIHVpbnQ2NF90CQljcF9kZXZpY2VbNF07CQkJLyogMHgwMDAyezAwLCwsMTh9ICovCi0gICAgdWludDY0X3QJCV9wYWRfMDAwMjIwWzRdOwkJCS8qIDB4MDAwMnsyMCwsLDM4fSAqLwotICAgIHVpbnQ2NF90CQljcF93cl9yZXFfYnVmWzRdOwkJLyogMHgwMDAyezQwLCwsNTh9ICovCi0gICAgdWludDY0X3QJCV9wYWRfMDAwMjYwWzRdOwkJCS8qIDB4MDAwMns2MCwsLDc4fSAqLwotICAgIHVpbnQ2NF90CQljcF9ycmJfbWFwWzJdOwkJCS8qIDB4MDAwMns4MCwsLDg4fSAqLworICAgIHU2NAkJY3BfZGV2aWNlWzRdOwkJCS8qIDB4MDAwMnswMCwsLDE4fSAqLworICAgIHU2NAkJX3BhZF8wMDAyMjBbNF07CQkJLyogMHgwMDAyezIwLCwsMzh9ICovCisgICAgdTY0CQljcF93cl9yZXFfYnVmWzRdOwkJLyogMHgwMDAyezQwLCwsNTh9ICovCisgICAgdTY0CQlfcGFkXzAwMDI2MFs0XTsJCQkvKiAweDAwMDJ7NjAsLCw3OH0gKi8KKyAgICB1NjQJCWNwX3JyYl9tYXBbMl07CQkJLyogMHgwMDAyezgwLCwsODh9ICovCiAgICAgI2RlZmluZSBjcF9ldmVuX3Jlc3AgY3BfcnJiX21hcFswXQkJCS8qIDB4MDAwMjgwICovCiAgICAgI2RlZmluZSBjcF9vZGRfcmVzcCAgY3BfcnJiX21hcFsxXQkJCS8qIDB4MDAwMjg4ICovCi0gICAgdWludDY0X3QJCWNwX3Jlc3Bfc3RhdHVzOwkJCS8qIDB4MDAwMjkwICovCi0gICAgdWludDY0X3QJCWNwX3Jlc3BfY2xlYXI7CQkJLyogMHgwMDAyOTggKi8KKyAgICB1NjQJCWNwX3Jlc3Bfc3RhdHVzOwkJCS8qIDB4MDAwMjkwICovCisgICAgdTY0CQljcF9yZXNwX2NsZWFyOwkJCS8qIDB4MDAwMjk4ICovCiAKLSAgICB1aW50NjRfdAkJX3BhZF8wMDAyQTBbMTJdOwkJLyogMHgwMDAye0EwLi5GOH0gKi8KKyAgICB1NjQJCV9wYWRfMDAwMkEwWzEyXTsJCS8qIDB4MDAwMntBMC4uRjh9ICovCiAKICAgICAvKiAweDAwMDMwMC0weDAwMDNGOCAtLSBCdWZmZXIgQWRkcmVzcyBNYXRjaCBSZWdpc3RlcnMgKi8KICAgICBzdHJ1Y3QgewotCXVpbnQ2NF90CXVwcGVyOwkJCQkvKiAweDAwMDN7MDAsLCxGMH0gKi8KLQl1aW50NjRfdAlsb3dlcjsJCQkJLyogMHgwMDAzezA4LCwsRjh9ICovCisJdTY0CXVwcGVyOwkJCQkvKiAweDAwMDN7MDAsLCxGMH0gKi8KKwl1NjQJbG93ZXI7CQkJCS8qIDB4MDAwM3swOCwsLEY4fSAqLwogICAgIH0gY3BfYnVmX2FkZHJfbWF0Y2hbMTZdOwogCiAgICAgLyogMHgwMDA0MDAtMHgwMDA1RkYgLS0gUGVyZm9ybWFuY2UgTW9uaXRvciBSZWdpc3RlcnMgKGV2ZW4gb25seSkgKi8KICAgICBzdHJ1Y3QgewotCXVpbnQ2NF90CWZsdXNoX3dfdG91Y2g7CQkJLyogMHgwMDB7NDAwLCwsNUMwfSAqLwotCXVpbnQ2NF90CWZsdXNoX3dvX3RvdWNoOwkJCS8qIDB4MDAwezQwOCwsLDVDOH0gKi8KLQl1aW50NjRfdAlpbmZsaWdodDsJCQkvKiAweDAwMHs0MTAsLCw1RDB9ICovCi0JdWludDY0X3QJcHJlZmV0Y2g7CQkJLyogMHgwMDB7NDE4LCwsNUQ4fSAqLwotCXVpbnQ2NF90CXRvdGFsX3BjaV9yZXRyeTsJCS8qIDB4MDAwezQyMCwsLDVFMH0gKi8KLQl1aW50NjRfdAltYXhfcGNpX3JldHJ5OwkJCS8qIDB4MDAwezQyOCwsLDVFOH0gKi8KLQl1aW50NjRfdAltYXhfbGF0ZW5jeTsJCQkvKiAweDAwMHs0MzAsLCw1RjB9ICovCi0JdWludDY0X3QJY2xlYXJfYWxsOwkJCS8qIDB4MDAwezQzOCwsLDVGOH0gKi8KKwl1NjQJZmx1c2hfd190b3VjaDsJCQkvKiAweDAwMHs0MDAsLCw1QzB9ICovCisJdTY0CWZsdXNoX3dvX3RvdWNoOwkJCS8qIDB4MDAwezQwOCwsLDVDOH0gKi8KKwl1NjQJaW5mbGlnaHQ7CQkJLyogMHgwMDB7NDEwLCwsNUQwfSAqLworCXU2NAlwcmVmZXRjaDsJCQkvKiAweDAwMHs0MTgsLCw1RDh9ICovCisJdTY0CXRvdGFsX3BjaV9yZXRyeTsJCS8qIDB4MDAwezQyMCwsLDVFMH0gKi8KKwl1NjQJbWF4X3BjaV9yZXRyeTsJCQkvKiAweDAwMHs0MjgsLCw1RTh9ICovCisJdTY0CW1heF9sYXRlbmN5OwkJCS8qIDB4MDAwezQzMCwsLDVGMH0gKi8KKwl1NjQJY2xlYXJfYWxsOwkJCS8qIDB4MDAwezQzOCwsLDVGOH0gKi8KICAgICB9IGNwX2J1Zl9jb3VudFs4XTsKIAogCiAgICAgLyogMHgwMDA2MDAtMHgwMDA5RkYgLS0gUENJL1ggcmVnaXN0ZXJzICovCi0gICAgdWludDY0X3QJCWNwX3BjaXhfYnVzX2Vycl9hZGRyOwkJLyogMHgwMDA2MDAgKi8KLSAgICB1aW50NjRfdAkJY3BfcGNpeF9idXNfZXJyX2F0dHI7CQkvKiAweDAwMDYwOCAqLwotICAgIHVpbnQ2NF90CQljcF9wY2l4X2J1c19lcnJfZGF0YTsJCS8qIDB4MDAwNjEwICovCi0gICAgdWludDY0X3QJCWNwX3BjaXhfcGlvX3NwbGl0X2FkZHI7CQkvKiAweDAwMDYxOCAqLwotICAgIHVpbnQ2NF90CQljcF9wY2l4X3Bpb19zcGxpdF9hdHRyOwkJLyogMHgwMDA2MjAgKi8KLSAgICB1aW50NjRfdAkJY3BfcGNpeF9kbWFfcmVxX2Vycl9hdHRyOwkvKiAweDAwMDYyOCAqLwotICAgIHVpbnQ2NF90CQljcF9wY2l4X2RtYV9yZXFfZXJyX2FkZHI7CS8qIDB4MDAwNjMwICovCi0gICAgdWludDY0X3QJCWNwX3BjaXhfdGltZW91dDsJCS8qIDB4MDAwNjM4ICovCisgICAgdTY0CQljcF9wY2l4X2J1c19lcnJfYWRkcjsJCS8qIDB4MDAwNjAwICovCisgICAgdTY0CQljcF9wY2l4X2J1c19lcnJfYXR0cjsJCS8qIDB4MDAwNjA4ICovCisgICAgdTY0CQljcF9wY2l4X2J1c19lcnJfZGF0YTsJCS8qIDB4MDAwNjEwICovCisgICAgdTY0CQljcF9wY2l4X3Bpb19zcGxpdF9hZGRyOwkJLyogMHgwMDA2MTggKi8KKyAgICB1NjQJCWNwX3BjaXhfcGlvX3NwbGl0X2F0dHI7CQkvKiAweDAwMDYyMCAqLworICAgIHU2NAkJY3BfcGNpeF9kbWFfcmVxX2Vycl9hdHRyOwkvKiAweDAwMDYyOCAqLworICAgIHU2NAkJY3BfcGNpeF9kbWFfcmVxX2Vycl9hZGRyOwkvKiAweDAwMDYzMCAqLworICAgIHU2NAkJY3BfcGNpeF90aW1lb3V0OwkJLyogMHgwMDA2MzggKi8KIAotICAgIHVpbnQ2NF90CQlfcGFkXzAwMDY0MFsyNF07CQkvKiAweDAwMHs2NDAsLCw2Rjh9ICovCisgICAgdTY0CQlfcGFkXzAwMDY0MFsyNF07CQkvKiAweDAwMHs2NDAsLCw2Rjh9ICovCiAKICAgICAvKiAweDAwMDcwMC0weDAwMDczNyAtLSBEZWJ1ZyBSZWdpc3RlcnMgKi8KLSAgICB1aW50NjRfdAkJY3BfY3RfZGVidWdfY3RsOwkJLyogMHgwMDA3MDAgKi8KLSAgICB1aW50NjRfdAkJY3BfYnJfZGVidWdfY3RsOwkJLyogMHgwMDA3MDggKi8KLSAgICB1aW50NjRfdAkJY3BfbXV4M19kZWJ1Z19jdGw7CQkvKiAweDAwMDcxMCAqLwotICAgIHVpbnQ2NF90CQljcF9tdXg0X2RlYnVnX2N0bDsJCS8qIDB4MDAwNzE4ICovCi0gICAgdWludDY0X3QJCWNwX211eDVfZGVidWdfY3RsOwkJLyogMHgwMDA3MjAgKi8KLSAgICB1aW50NjRfdAkJY3BfbXV4Nl9kZWJ1Z19jdGw7CQkvKiAweDAwMDcyOCAqLwotICAgIHVpbnQ2NF90CQljcF9tdXg3X2RlYnVnX2N0bDsJCS8qIDB4MDAwNzMwICovCisgICAgdTY0CQljcF9jdF9kZWJ1Z19jdGw7CQkvKiAweDAwMDcwMCAqLworICAgIHU2NAkJY3BfYnJfZGVidWdfY3RsOwkJLyogMHgwMDA3MDggKi8KKyAgICB1NjQJCWNwX211eDNfZGVidWdfY3RsOwkJLyogMHgwMDA3MTAgKi8KKyAgICB1NjQJCWNwX211eDRfZGVidWdfY3RsOwkJLyogMHgwMDA3MTggKi8KKyAgICB1NjQJCWNwX211eDVfZGVidWdfY3RsOwkJLyogMHgwMDA3MjAgKi8KKyAgICB1NjQJCWNwX211eDZfZGVidWdfY3RsOwkJLyogMHgwMDA3MjggKi8KKyAgICB1NjQJCWNwX211eDdfZGVidWdfY3RsOwkJLyogMHgwMDA3MzAgKi8KIAotICAgIHVpbnQ2NF90CQlfcGFkXzAwMDczOFs4OV07CQkvKiAweDAwMHs3MzgsLCw5Rjh9ICovCisgICAgdTY0CQlfcGFkXzAwMDczOFs4OV07CQkvKiAweDAwMHs3MzgsLCw5Rjh9ICovCiAKICAgICAvKiAweDAwMEEwMC0weDAwMEJGRiAtLSBQQ0kvWCBSZWFkJldyaXRlIEJ1ZmZlciAqLwogICAgIHN0cnVjdCB7Ci0JdWludDY0X3QJY3BfYnVmX2FkZHI7CQkJLyogMHgwMDB7QTAwLCwsQUYwfSAqLwotCXVpbnQ2NF90CWNwX2J1Zl9hdHRyOwkJCS8qIDBYMDAwe0EwOCwsLEFGOH0gKi8KKwl1NjQJY3BfYnVmX2FkZHI7CQkJLyogMHgwMDB7QTAwLCwsQUYwfSAqLworCXU2NAljcF9idWZfYXR0cjsJCQkvKiAwWDAwMHtBMDgsLCxBRjh9ICovCiAgICAgfSBjcF9wY2l4X3JlYWRfYnVmXzY0WzE2XTsKIAogICAgIHN0cnVjdCB7Ci0JdWludDY0X3QJY3BfYnVmX2FkZHI7CQkJLyogMHgwMDB7QjAwLCwsQkUwfSAqLwotCXVpbnQ2NF90CWNwX2J1Zl9hdHRyOwkJCS8qIDB4MDAwe0IwOCwsLEJFOH0gKi8KLQl1aW50NjRfdAljcF9idWZfdmFsaWQ7CQkJLyogMHgwMDB7QjEwLCwsQkYwfSAqLwotCXVpbnQ2NF90CV9fcGFkMTsJCQkJLyogMHgwMDB7QjE4LCwsQkY4fSAqLworCXU2NAljcF9idWZfYWRkcjsJCQkvKiAweDAwMHtCMDAsLCxCRTB9ICovCisJdTY0CWNwX2J1Zl9hdHRyOwkJCS8qIDB4MDAwe0IwOCwsLEJFOH0gKi8KKwl1NjQJY3BfYnVmX3ZhbGlkOwkJCS8qIDB4MDAwe0IxMCwsLEJGMH0gKi8KKwl1NjQJX19wYWQxOwkJCQkvKiAweDAwMHtCMTgsLCxCRjh9ICovCiAgICAgfSBjcF9wY2l4X3dyaXRlX2J1Zl82NFs4XTsKIAogICAgIC8qIEVuZCBvZiBMb2NhbCBSZWdpc3RlcnMgLS0gU3RhcnQgb2YgQWRkcmVzcyBNYXAgc3BhY2UgKi8KIAotICAgIGNoYXIJCV9wYWRfMDAwYzAwWzB4MDEwMDAwIC0gMHgwMDBjMDBdOworICAgIGNoYXIJX3BhZF8wMDBjMDBbMHgwMTAwMDAgLSAweDAwMGMwMF07CiAKICAgICAvKiAweDAxMDAwMC0weDAxMUZGOCAtLSBJbnRlcm5hbCBBVEUgUkFNIChBdXRvIFBhcml0eSBHZW5lcmF0aW9uKSAqLwotICAgIHVpbnQ2NF90CQljcF9pbnRfYXRlX3JhbVsxMDI0XTsJCS8qIDB4MDEwMDAwLTB4MDExRkY4ICovCisgICAgdTY0CQljcF9pbnRfYXRlX3JhbVsxMDI0XTsJCS8qIDB4MDEwMDAwLTB4MDExRkY4ICovCiAKLSAgICBjaGFyCQlfcGFkXzAxMjAwMFsweDE0MDAwIC0gMHgwMTIwMDBdOworICAgIGNoYXIJX3BhZF8wMTIwMDBbMHgxNDAwMCAtIDB4MDEyMDAwXTsKIAogICAgIC8qIDB4MDE0MDAwLTB4MDE1RkY4IC0tIEludGVybmFsIEFURSBSQU0gKE1hbnVhbCBQYXJpdHkgR2VuZXJhdGlvbikgKi8KLSAgICB1aW50NjRfdAkJY3BfaW50X2F0ZV9yYW1fbXBbMTAyNF07CS8qIDB4MDE0MDAwLTB4MDE1RkY4ICovCisgICAgdTY0CQljcF9pbnRfYXRlX3JhbV9tcFsxMDI0XTsJLyogMHgwMTQwMDAtMHgwMTVGRjggKi8KIAotICAgIGNoYXIJCV9wYWRfMDE2MDAwWzB4MTgwMDAgLSAweDAxNjAwMF07CisgICAgY2hhcglfcGFkXzAxNjAwMFsweDE4MDAwIC0gMHgwMTYwMDBdOwogCiAgICAgLyogMHgxODAwMC0weDE5N0Y4IC0tIFRJT0NQIFdyaXRlIFJlcXVlc3QgUmFtICovCi0gICAgdWludDY0X3QJCWNwX3dyX3JlcV9sb3dlclsyNTZdOwkJLyogMHgxODAwMCAtIDB4MTg3RjggKi8KLSAgICB1aW50NjRfdAkJY3Bfd3JfcmVxX3VwcGVyWzI1Nl07CQkvKiAweDE4ODAwIC0gMHgxOEZGOCAqLwotICAgIHVpbnQ2NF90CQljcF93cl9yZXFfcGFyaXR5WzI1Nl07CQkvKiAweDE5MDAwIC0gMHgxOTdGOCAqLworICAgIHU2NAkJY3Bfd3JfcmVxX2xvd2VyWzI1Nl07CQkvKiAweDE4MDAwIC0gMHgxODdGOCAqLworICAgIHU2NAkJY3Bfd3JfcmVxX3VwcGVyWzI1Nl07CQkvKiAweDE4ODAwIC0gMHgxOEZGOCAqLworICAgIHU2NAkJY3Bfd3JfcmVxX3Bhcml0eVsyNTZdOwkJLyogMHgxOTAwMCAtIDB4MTk3RjggKi8KIAotICAgIGNoYXIJCV9wYWRfMDE5ODAwWzB4MUMwMDAgLSAweDAxOTgwMF07CisgICAgY2hhcglfcGFkXzAxOTgwMFsweDFDMDAwIC0gMHgwMTk4MDBdOwogCiAgICAgLyogMHgxQzAwMC0weDFFRkY4IC0tIFRJT0NQIFJlYWQgUmVzcG9uc2UgUmFtICovCi0gICAgdWludDY0X3QJCWNwX3JkX3Jlc3BfbG93ZXJbNTEyXTsJCS8qIDB4MUMwMDAgLSAweDFDRkY4ICovCi0gICAgdWludDY0X3QJCWNwX3JkX3Jlc3BfdXBwZXJbNTEyXTsJCS8qIDB4MUQwMDAgLSAweDFERkY4ICovCi0gICAgdWludDY0X3QJCWNwX3JkX3Jlc3BfcGFyaXR5WzUxMl07CQkvKiAweDFFMDAwIC0gMHgxRUZGOCAqLworICAgIHU2NAkJY3BfcmRfcmVzcF9sb3dlcls1MTJdOwkJLyogMHgxQzAwMCAtIDB4MUNGRjggKi8KKyAgICB1NjQJCWNwX3JkX3Jlc3BfdXBwZXJbNTEyXTsJCS8qIDB4MUQwMDAgLSAweDFERkY4ICovCisgICAgdTY0CQljcF9yZF9yZXNwX3Bhcml0eVs1MTJdOwkJLyogMHgxRTAwMCAtIDB4MUVGRjggKi8KIAotICAgIGNoYXIJCV9wYWRfMDFGMDAwWzB4MjAwMDAgLSAweDAxRjAwMF07CisgICAgY2hhcglfcGFkXzAxRjAwMFsweDIwMDAwIC0gMHgwMUYwMDBdOwogCiAgICAgLyogMHgwMjAwMDAtMHgwMjFGRkYgLS0gSG9zdCBEZXZpY2UgKENQKSBDb25maWd1cmF0aW9uIFNwYWNlIChub3QgdXNlZCkgICovCi0gICAgY2hhcgkJX3BhZF8wMjAwMDBbMHgwMjEwMDAgLSAweDIwMDAwXTsKKyAgICBjaGFyCV9wYWRfMDIwMDAwWzB4MDIxMDAwIC0gMHgyMDAwMF07CiAKICAgICAvKiAweDAyMTAwMC0weDAyN0ZGRiAtLSBQQ0kgRGV2aWNlIENvbmZpZ3VyYXRpb24gU3BhY2VzICovCiAgICAgdW5pb24gewotCXVpbnQ4X3QJCWNbMHgxMDAwIC8gMV07CQkJLyogMHgwMnswMDAwLCwsN0ZGRn0gKi8KLQl1aW50MTZfdAlzWzB4MTAwMCAvIDJdOwkJCS8qIDB4MDJ7MDAwMCwsLDdGRkZ9ICovCi0JdWludDMyX3QJbFsweDEwMDAgLyA0XTsJCQkvKiAweDAyezAwMDAsLCw3RkZGfSAqLwotCXVpbnQ2NF90CWRbMHgxMDAwIC8gOF07CQkJLyogMHgwMnswMDAwLCwsN0ZGRn0gKi8KKwl1OAljWzB4MTAwMCAvIDFdOwkJCS8qIDB4MDJ7MDAwMCwsLDdGRkZ9ICovCisJdTE2CXNbMHgxMDAwIC8gMl07CQkJLyogMHgwMnswMDAwLCwsN0ZGRn0gKi8KKwl1MzIJbFsweDEwMDAgLyA0XTsJCQkvKiAweDAyezAwMDAsLCw3RkZGfSAqLworCXU2NAlkWzB4MTAwMCAvIDhdOwkJCS8qIDB4MDJ7MDAwMCwsLDdGRkZ9ICovCiAJdW5pb24gewotCSAgICB1aW50OF90CWNbMHgxMDAgLyAxXTsKLQkgICAgdWludDE2X3QJc1sweDEwMCAvIDJdOwotCSAgICB1aW50MzJfdAlsWzB4MTAwIC8gNF07Ci0JICAgIHVpbnQ2NF90CWRbMHgxMDAgLyA4XTsKKwkgICAgdTgJY1sweDEwMCAvIDFdOworCSAgICB1MTYJc1sweDEwMCAvIDJdOworCSAgICB1MzIJbFsweDEwMCAvIDRdOworCSAgICB1NjQJZFsweDEwMCAvIDhdOwogCX0gZls4XTsKICAgICB9IGNwX3R5cGUwX2NmZ19kZXZbN107CQkJCS8qIDB4MDJ7MTAwMCwsLDdGRkZ9ICovCiAKICAgICAvKiAweDAyODAwMC0weDAyOEZGRiAtLSBQQ0kgVHlwZSAxIENvbmZpZ3VyYXRpb24gU3BhY2UgKi8KICAgICB1bmlvbiB7Ci0JdWludDhfdAkJY1sweDEwMDAgLyAxXTsJCQkvKiAweDAyODAwMC0weDAyOTAwMCAqLwotCXVpbnQxNl90CXNbMHgxMDAwIC8gMl07CQkJLyogMHgwMjgwMDAtMHgwMjkwMDAgKi8KLQl1aW50MzJfdAlsWzB4MTAwMCAvIDRdOwkJCS8qIDB4MDI4MDAwLTB4MDI5MDAwICovCi0JdWludDY0X3QJZFsweDEwMDAgLyA4XTsJCQkvKiAweDAyODAwMC0weDAyOTAwMCAqLworCXU4CWNbMHgxMDAwIC8gMV07CQkJLyogMHgwMjgwMDAtMHgwMjkwMDAgKi8KKwl1MTYJc1sweDEwMDAgLyAyXTsJCQkvKiAweDAyODAwMC0weDAyOTAwMCAqLworCXUzMglsWzB4MTAwMCAvIDRdOwkJCS8qIDB4MDI4MDAwLTB4MDI5MDAwICovCisJdTY0CWRbMHgxMDAwIC8gOF07CQkJLyogMHgwMjgwMDAtMHgwMjkwMDAgKi8KIAl1bmlvbiB7Ci0JICAgIHVpbnQ4X3QJY1sweDEwMCAvIDFdOwotCSAgICB1aW50MTZfdAlzWzB4MTAwIC8gMl07Ci0JICAgIHVpbnQzMl90CWxbMHgxMDAgLyA0XTsKLQkgICAgdWludDY0X3QJZFsweDEwMCAvIDhdOworCSAgICB1OAljWzB4MTAwIC8gMV07CisJICAgIHUxNglzWzB4MTAwIC8gMl07CisJICAgIHUzMglsWzB4MTAwIC8gNF07CisJICAgIHU2NAlkWzB4MTAwIC8gOF07CiAJfSBmWzhdOwogICAgIH0gY3BfdHlwZTFfY2ZnOwkJCQkJLyogMHgwMjgwMDAtMHgwMjkwMDAgKi8KIApAQCAtMjExLDMwICsyMTEsMzAgQEAKIAogICAgIC8qIDB4MDMwMDAwLTB4MDMwMDA3IC0tIFBDSSBJbnRlcnJ1cHQgQWNrbm93bGVkZ2UgQ3ljbGUgKi8KICAgICB1bmlvbiB7Ci0JdWludDhfdAkJY1s4IC8gMV07Ci0JdWludDE2X3QJc1s4IC8gMl07Ci0JdWludDMyX3QJbFs4IC8gNF07Ci0JdWludDY0X3QJZFs4IC8gOF07CisJdTgJY1s4IC8gMV07CisJdTE2CXNbOCAvIDJdOworCXUzMglsWzggLyA0XTsKKwl1NjQJZFs4IC8gOF07CiAgICAgfSBjcF9wY2lfaWFjazsJCQkJCS8qIDB4MDMwMDAwLTB4MDMwMDA3ICovCiAKICAgICBjaGFyCQlfcGFkXzAzMDAwN1sweDA0MDAwMC0weDAzMDAwOF07CiAKICAgICAvKiAweDA0MDAwMC0weDA0MDAwNyAtLSBQQ0lYIFNwZWNpYWwgQ3ljbGUgKi8KICAgICB1bmlvbiB7Ci0JdWludDhfdAkJY1s4IC8gMV07Ci0JdWludDE2X3QJc1s4IC8gMl07Ci0JdWludDMyX3QJbFs4IC8gNF07Ci0JdWludDY0X3QJZFs4IC8gOF07CisJdTgJY1s4IC8gMV07CisJdTE2CXNbOCAvIDJdOworCXUzMglsWzggLyA0XTsKKwl1NjQJZFs4IC8gOF07CiAgICAgfSBjcF9wY2l4X2N5Y2xlOwkJCQkJLyogMHgwNDAwMDAtMHgwNDAwMDcgKi8KIAogICAgIGNoYXIJCV9wYWRfMDQwMDA3WzB4MjAwMDAwLTB4MDQwMDA4XTsKIAogICAgIC8qIDB4MjAwMDAwLTB4N0ZGRkZGIC0tIFBDSS9HSU8gRGV2aWNlIFNwYWNlcyAqLwogICAgIHVuaW9uIHsKLQl1aW50OF90CQljWzB4MTAwMDAwIC8gMV07Ci0JdWludDE2X3QJc1sweDEwMDAwMCAvIDJdOwotCXVpbnQzMl90CWxbMHgxMDAwMDAgLyA0XTsKLQl1aW50NjRfdAlkWzB4MTAwMDAwIC8gOF07CisJdTgJY1sweDEwMDAwMCAvIDFdOworCXUxNglzWzB4MTAwMDAwIC8gMl07CisJdTMyCWxbMHgxMDAwMDAgLyA0XTsKKwl1NjQJZFsweDEwMDAwMCAvIDhdOwogICAgIH0gY3BfZGV2aW9fcmF3WzZdOwkJCQkJLyogMHgyMDAwMDAtMHg3RkZGRkYgKi8KIAogICAgICNkZWZpbmUgY3BfZGV2aW8obikgIGNwX2RldmlvX3Jhd1soKG4pPDIpPyhuKjIpOihuKzIpXQpAQCAtMjQzLDEwICsyNDMsMTAgQEAKIAogICAgIC8qIDB4QTAwMDAwLTB4QkZGRkZGIC0tIFBDSS9HSU8gRGV2aWNlIFNwYWNlcyB3L2ZsdXNoICAqLwogICAgIHVuaW9uIHsKLQl1aW50OF90CQljWzB4MTAwMDAwIC8gMV07Ci0JdWludDE2X3QJc1sweDEwMDAwMCAvIDJdOwotCXVpbnQzMl90CWxbMHgxMDAwMDAgLyA0XTsKLQl1aW50NjRfdAlkWzB4MTAwMDAwIC8gOF07CisJdTgJY1sweDEwMDAwMCAvIDFdOworCXUxNglzWzB4MTAwMDAwIC8gMl07CisJdTMyCWxbMHgxMDAwMDAgLyA0XTsKKwl1NjQJZFsweDEwMDAwMCAvIDhdOwogICAgIH0gY3BfZGV2aW9fcmF3X2ZsdXNoWzZdOwkJCQkvKiAweEEwMDAwMC0weEJGRkZGRiAqLwogCiAgICAgI2RlZmluZSBjcF9kZXZpb19mbHVzaChuKSAgY3BfZGV2aW9fcmF3X2ZsdXNoWygobik8Mik/KG4qMik6KG4rMildCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3Rpb2N4LmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3Rpb2N4LmgKaW5kZXggNTY5OWU3NS4uZDI5NzI4NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi90aW9jeC5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vdGlvY3guaApAQCAtNDAsMTAgKzQwLDEwIEBACiB9OwogCiAvKiBjcmVhdGUgRE1BIGFkZHJlc3MgYnkgc3RyaXBwaW5nIEFTIGJpdHMgKi8KLSNkZWZpbmUgVElPQ1hfRE1BX0FERFIoYSkgKHVpbnQ2NF90KSgodWludDY0X3QpKGEpICYgMHhmZmZmY2ZmZmZmZmZmZlVMKQorI2RlZmluZSBUSU9DWF9ETUFfQUREUihhKSAodTY0KSgodTY0KShhKSAmIDB4ZmZmZmNmZmZmZmZmZmZVTCkKIAotI2RlZmluZSBUSU9DWF9UT19USU9DWF9ETUFfQUREUihhKSAodWludDY0X3QpKCgodWludDY0X3QpKGEpICYgMHhmZmZmZmZmZmYpIHwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgodWludDY0X3QpKGEpKSAmIDB4ZmZmZmMwMDAwMDAwMDBVTCkgPDwyKSkKKyNkZWZpbmUgVElPQ1hfVE9fVElPQ1hfRE1BX0FERFIoYSkgKHU2NCkoKCh1NjQpKGEpICYgMHhmZmZmZmZmZmYpIHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgodTY0KShhKSkgJiAweGZmZmZjMDAwMDAwMDAwVUwpIDw8MikpCiAKICNkZWZpbmUgVElPX0NFX0FTSUNfUEFSVE5VTSAweGNlMDAKICNkZWZpbmUgVElPQ1hfQ09SRUxFVCAzCkBAIC02MywxMCArNjMsMTAgQEAKIGV4dGVybiBpbnQgY3hfZGV2aWNlX3JlZ2lzdGVyKG5hc2lkX3QsIGludCwgaW50LCBzdHJ1Y3QgaHViZGV2X2luZm8gKiwgaW50KTsKIGV4dGVybiBpbnQgY3hfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IGN4X2RydiAqKTsKIGV4dGVybiBpbnQgY3hfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBjeF9kcnYgKik7Ci1leHRlcm4gdWludDY0X3QgdGlvY3hfZG1hX2FkZHIodWludDY0X3QgYWRkcik7Ci1leHRlcm4gdWludDY0X3QgdGlvY3hfc3dpbl9iYXNlKGludCBuYXNpZCk7Ci1leHRlcm4gdm9pZCB0aW9jeF9tbXJfc3RvcmUoaW50IG5hc2lkLCB1aW50NjRfdCBvZmZzZXQsIHVpbnQ2NF90IHZhbHVlKTsKLWV4dGVybiB1aW50NjRfdCB0aW9jeF9tbXJfbG9hZChpbnQgbmFzaWQsIHVpbnQ2NF90IG9mZnNldCk7CitleHRlcm4gdTY0IHRpb2N4X2RtYV9hZGRyKHU2NCBhZGRyKTsKK2V4dGVybiB1NjQgdGlvY3hfc3dpbl9iYXNlKGludCBuYXNpZCk7CitleHRlcm4gdm9pZCB0aW9jeF9tbXJfc3RvcmUoaW50IG5hc2lkLCB1NjQgb2Zmc2V0LCB1NjQgdmFsdWUpOworZXh0ZXJuIHU2NCB0aW9jeF9tbXJfbG9hZChpbnQgbmFzaWQsIHU2NCBvZmZzZXQpOwogCiAjZW5kaWYJCQkJLy8gIF9fS0VSTkVMX18KICNlbmRpZgkJCQkvLyBfQVNNX0lBNjRfU05fVElPX1RJT0NYX18KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24veHAuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24veHAuaAppbmRleCA0OWZhZjhmLi45YmQyZjliIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3hwLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi94cC5oCkBAIC0xOCw2ICsxOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGFzbS9zbi90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zbi9idGUuaD4KIApAQCAtMjI3LDcgKzIyOCw5IEBACiAKIAl4cGNPcGVuQ2xvc2VFcnJvciwJLyogNTA6IGNoYW5uZWwgb3Blbi9jbG9zZSBwcm90b2NvbCBlcnJvciAqLwogCi0JeHBjVW5rbm93blJlYXNvbgkvKiA1MTogdW5rbm93biByZWFzb24gLS0gbXVzdCBiZSBsYXN0IGluIGxpc3QgKi8KKwl4cGNEaXNjb25uZWN0ZWQsCS8qIDUxOiBjaGFubmVsIGRpc2Nvbm5lY3RlZCAoY2xvc2VkKSAqLworCisJeHBjVW5rbm93blJlYXNvbgkvKiA1MjogdW5rbm93biByZWFzb24gLS0gbXVzdCBiZSBsYXN0IGluIGxpc3QgKi8KIH07CiAKIApAQCAtMzU3LDcgKzM2MCw3IEBACiAgKiB0aGUgY2hhbm5lbC4KICAqLwogc3RydWN0IHhwY19yZWdpc3RyYXRpb24gewotCXN0cnVjdCBzZW1hcGhvcmUgc2VtYTsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CiAJeHBjX2NoYW5uZWxfZnVuYyBmdW5jOwkJLyogZnVuY3Rpb24gdG8gY2FsbCAqLwogCXZvaWQgKmtleTsJCQkvKiBwb2ludGVyIHRvIHVzZXIncyBrZXkgKi8KIAl1MTYgbmVudHJpZXM7CQkJLyogI29mIG1zZyBlbnRyaWVzIGluIGxvY2FsIG1zZyBxdWV1ZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi94cGMuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24veHBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMzNjkyOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24veHBjLmgKQEAgLTAsMCArMSwxMjc1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworCisKKy8qCisgKiBDcm9zcyBQYXJ0aXRpb24gQ29tbXVuaWNhdGlvbiAoWFBDKSBzdHJ1Y3R1cmVzIGFuZCBtYWNyb3MuCisgKi8KKworI2lmbmRlZiBfQVNNX0lBNjRfU05fWFBDX0gKKyNkZWZpbmUgX0FTTV9JQTY0X1NOX1hQQ19ICisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9zbi9idGUuaD4KKyNpbmNsdWRlIDxhc20vc24vY2xrc3VwcG9ydC5oPgorI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgorI2luY2x1ZGUgPGFzbS9zbi9tc3BlYy5oPgorI2luY2x1ZGUgPGFzbS9zbi9zaHViX21tci5oPgorI2luY2x1ZGUgPGFzbS9zbi94cC5oPgorCisKKy8qCisgKiBYUEMgVmVyc2lvbiBudW1iZXJzIGNvbnNpc3Qgb2YgYSBtYWpvciBhbmQgbWlub3IgbnVtYmVyLiBYUEMgY2FuIGFsd2F5cworICogdGFsayB0byB2ZXJzaW9ucyB3aXRoIHNhbWUgbWFqb3IgIywgYW5kIG5ldmVyIHRhbGsgdG8gdmVyc2lvbnMgd2l0aCBhCisgKiBkaWZmZXJlbnQgbWFqb3IgIy4KKyAqLworI2RlZmluZSBfWFBDX1ZFUlNJT04oX21haiwgX21pbikJKCgoX21haikgPDwgNCkgfCAoKF9taW4pICYgMHhmKSkKKyNkZWZpbmUgWFBDX1ZFUlNJT05fTUFKT1IoX3YpCQkoKF92KSA+PiA0KQorI2RlZmluZSBYUENfVkVSU0lPTl9NSU5PUihfdikJCSgoX3YpICYgMHhmKQorCisKKy8qCisgKiBUaGUgbmV4dCBtYWNyb3MgZGVmaW5lIHdvcmQgb3IgYml0IHJlcHJlc2VudGF0aW9ucyBmb3IgZ2l2ZW4KKyAqIEMtYnJpY2sgbmFzaWQgaW4gZWl0aGVyIHRoZSBTQUwgcHJvdmlkZWQgYml0IGFycmF5IHJlcHJlc2VudGluZworICogbmFzaWRzIGluIHRoZSBwYXJ0aXRpb24vbWFjaGluZSBvciB0aGUgQU1PX3QgYXJyYXkgdXNlZCBmb3IKKyAqIGludGVyLXBhcnRpdGlvbiBpbml0aWF0aW9uIGNvbW11bmljYXRpb25zLgorICoKKyAqIEZvciBTTjIgbWFjaGluZXMsIEMtQnJpY2tzIGFyZSBhbHdheSBldmVuIG51bWJlcmVkIE5BU0lEcy4gIEFzCisgKiBzdWNoLCBzb21lIHNwYWNlIHdpbGwgYmUgc2F2ZWQgYnkgaW5zaXN0aW5nIHRoYXQgbmFzaWQgaW5mb3JtYXRpb24KKyAqIHBhc3NlZCBmcm9tIFNBTCBhbHdheXMgYmUgcGFja2VkIGZvciBDLUJyaWNrcyBhbmQgdGhlCisgKiBjcm9zcy1wYXJ0aXRpb24gaW50ZXJydXB0cyB1c2UgdGhlIHNhbWUgcGFja2luZyBzY2hlbWUuCisgKi8KKyNkZWZpbmUgWFBDX05BU0lEX1dfSU5ERVgoX24pCSgoKF9uKSAvIDY0KSAvIDIpCisjZGVmaW5lIFhQQ19OQVNJRF9CX0lOREVYKF9uKQkoKChfbikgLyAyKSAmICg2NCAtIDEpKQorI2RlZmluZSBYUENfTkFTSURfSU5fQVJSQVkoX24sIF9wKSAoKF9wKVtYUENfTkFTSURfV19JTkRFWChfbildICYgXAorCQkJCSAgICAoMVVMIDw8IFhQQ19OQVNJRF9CX0lOREVYKF9uKSkpCisjZGVmaW5lIFhQQ19OQVNJRF9GUk9NX1dfQihfdywgX2IpICgoKF93KSAqIDY0ICsgKF9iKSkgKiAyKQorCisjZGVmaW5lIFhQQ19IQl9ERUZBVUxUX0lOVEVSVkFMCQk1CS8qIGluY3IgSEIgZXZlcnkgeCBzZWNzICovCisjZGVmaW5lIFhQQ19IQl9DSEVDS19ERUZBVUxUX0lOVEVSVkFMCTIwCS8qIGNoZWNrIEhCIGV2ZXJ5IHggc2VjcyAqLworCisvKiBkZWZpbmUgdGhlIHByb2Nlc3MgbmFtZSBvZiBIQiBjaGVja2VyIGFuZCB0aGUgQ1BVIGl0IGlzIHBpbm5lZCB0byAqLworI2RlZmluZSBYUENfSEJfQ0hFQ0tfVEhSRUFEX05BTUUJInhwY19oYiIKKyNkZWZpbmUgWFBDX0hCX0NIRUNLX0NQVQkJMAorCisvKiBkZWZpbmUgdGhlIHByb2Nlc3MgbmFtZSBvZiB0aGUgZGlzY292ZXJ5IHRocmVhZCAqLworI2RlZmluZSBYUENfRElTQ09WRVJZX1RIUkVBRF9OQU1FCSJ4cGNfZGlzY292ZXJ5IgorCisKKy8qCisgKiB0aGUgcmVzZXJ2ZWQgcGFnZQorICoKKyAqICAgU0FMIHJlc2VydmVzIG9uZSBwYWdlIG9mIG1lbW9yeSBwZXIgcGFydGl0aW9uIGZvciBYUEMuIFRob3VnaCBhIGZ1bGwgcGFnZQorICogICBpbiBsZW5ndGggKDE2Mzg0IGJ5dGVzKSwgaXRzIHN0YXJ0aW5nIGFkZHJlc3MgaXMgbm90IHBhZ2UgYWxpZ25lZCwgYnV0IGl0CisgKiAgIGlzIGNhY2hlbGluZSBhbGlnbmVkLiBUaGUgcmVzZXJ2ZWQgcGFnZSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nOgorICoKKyAqICAgcmVzZXJ2ZWQgcGFnZSBoZWFkZXIKKyAqCisgKiAgICAgVGhlIGZpcnN0IGNhY2hlbGluZSBvZiB0aGUgcmVzZXJ2ZWQgcGFnZSBjb250YWlucyB0aGUgaGVhZGVyCisgKiAgICAgKHN0cnVjdCB4cGNfcnN2ZF9wYWdlKS4gQmVmb3JlIFNBTCBpbml0aWFsaXphdGlvbiBoYXMgY29tcGxldGVkLAorICogICAgIFNBTCBoYXMgc2V0IHVwIHRoZSBmb2xsb3dpbmcgZmllbGRzIG9mIHRoZSByZXNlcnZlZCBwYWdlIGhlYWRlcjoKKyAqICAgICBTQUxfc2lnbmF0dXJlLCBTQUxfdmVyc2lvbiwgcGFydGlkLCBhbmQgbmFzaWRzX3NpemUuIFRoZSBvdGhlcgorICogICAgIGZpZWxkcyBhcmUgc2V0IHVwIGJ5IFhQQy4gKHhwY19yc3ZkX3BhZ2UgcG9pbnRzIHRvIHRoZSBsb2NhbAorICogICAgIHBhcnRpdGlvbidzIHJlc2VydmVkIHBhZ2UuKQorICoKKyAqICAgcGFydF9uYXNpZHMgbWFzaworICogICBtYWNoX25hc2lkcyBtYXNrCisgKgorICogICAgIFNBTCBhbHNvIHNldHMgdXAgdHdvIGJpdG1hcHMgKG9yIG1hc2tzKSwgb25lIHRoYXQgcmVmbGVjdHMgdGhlIGFjdHVhbAorICogICAgIG5hc2lkcyBpbiB0aGlzIHBhcnRpdGlvbiAocGFydF9uYXNpZHMpLCBhbmQgdGhlIG90aGVyIHRoYXQgcmVmbGVjdHMKKyAqICAgICB0aGUgYWN0dWFsIG5hc2lkcyBpbiB0aGUgZW50aXJlIG1hY2hpbmUgKG1hY2hfbmFzaWRzKS4gV2UncmUgb25seQorICogICAgIGludGVyZXN0ZWQgaW4gdGhlIGV2ZW4gbnVtYmVyZWQgbmFzaWRzICh3aGljaCBjb250YWluIHRoZSBwcm9jZXNzb3JzCisgKiAgICAgYW5kL29yIG1lbW9yeSksIHNvIHdlIG9ubHkgbmVlZCBoYWxmIGFzIG1hbnkgYml0cyB0byByZXByZXNlbnQgdGhlCisgKiAgICAgbmFzaWRzLiBUaGUgcGFydF9uYXNpZHMgbWFzayBpcyBsb2NhdGVkIHN0YXJ0aW5nIGF0IHRoZSBmaXJzdCBjYWNoZWxpbmUKKyAqICAgICBmb2xsb3dpbmcgdGhlIHJlc2VydmVkIHBhZ2UgaGVhZGVyLiBUaGUgbWFjaF9uYXNpZHMgbWFzayBmb2xsb3dzIHJpZ2h0CisgKiAgICAgYWZ0ZXIgdGhlIHBhcnRfbmFzaWRzIG1hc2suIFRoZSBzaXplIGluIGJ5dGVzIG9mIGVhY2ggbWFzayBpcyByZWZsZWN0ZWQKKyAqICAgICBieSB0aGUgcmVzZXJ2ZWQgcGFnZSBoZWFkZXIgZmllbGQgJ25hc2lkc19zaXplJy4gKExvY2FsIHBhcnRpdGlvbidzCisgKiAgICAgbWFzayBwb2ludGVycyBhcmUgeHBjX3BhcnRfbmFzaWRzIGFuZCB4cGNfbWFjaF9uYXNpZHMuKQorICoKKyAqICAgdmFycworICogICB2YXJzIHBhcnQKKyAqCisgKiAgICAgSW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBtYWNoX25hc2lkcyBtYXNrIGFyZSB0aGUgWFBDIHZhcmlhYmxlcworICogICAgIHJlcXVpcmVkIGJ5IG90aGVyIHBhcnRpdGlvbnMuIEZpcnN0IGFyZSB0aG9zZSB0aGF0IGFyZSBnZW5lcmljIHRvIGFsbAorICogICAgIHBhcnRpdGlvbnMgKHZhcnMpLCBmb2xsb3dlZCBvbiB0aGUgbmV4dCBhdmFpbGFibGUgY2FjaGVsaW5lIGJ5IHRob3NlCisgKiAgICAgd2hpY2ggYXJlIHBhcnRpdGlvbiBzcGVjaWZpYyAodmFycyBwYXJ0KS4gVGhlc2UgYXJlIHNldHVwIGJ5IFhQQy4KKyAqICAgICAoTG9jYWwgcGFydGl0aW9uJ3MgdmFycyBwb2ludGVycyBhcmUgeHBjX3ZhcnMgYW5kIHhwY192YXJzX3BhcnQuKQorICoKKyAqIE5vdGU6IFVudGlsIHZhcnNfcGEgaXMgc2V0LCB0aGUgcGFydGl0aW9uIFhQQyBjb2RlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4KKyAqLworc3RydWN0IHhwY19yc3ZkX3BhZ2UgeworCXU2NCBTQUxfc2lnbmF0dXJlOwkvKiBTQUw6IHVuaXF1ZSBzaWduYXR1cmUgKi8KKwl1NjQgU0FMX3ZlcnNpb247CS8qIFNBTDogdmVyc2lvbiAqLworCXU4IHBhcnRpZDsJCS8qIFNBTDogcGFydGl0aW9uIElEICovCisJdTggdmVyc2lvbjsKKwl1OCBwYWQxWzZdOwkJLyogYWxpZ24gdG8gbmV4dCB1NjQgaW4gY2FjaGVsaW5lICovCisJdm9sYXRpbGUgdTY0IHZhcnNfcGE7CisJc3RydWN0IHRpbWVzcGVjIHN0YW1wOwkvKiB0aW1lIHdoZW4gcmVzZXJ2ZWQgcGFnZSB3YXMgc2V0dXAgYnkgWFBDICovCisJdTY0IHBhZDJbOV07CQkvKiBhbGlnbiB0byBsYXN0IHU2NCBpbiBjYWNoZWxpbmUgKi8KKwl1NjQgbmFzaWRzX3NpemU7CS8qIFNBTDogc2l6ZSBvZiBlYWNoIG5hc2lkIG1hc2sgaW4gYnl0ZXMgKi8KK307CisKKyNkZWZpbmUgWFBDX1JQX1ZFUlNJT04gX1hQQ19WRVJTSU9OKDEsMSkgLyogdmVyc2lvbiAxLjEgb2YgdGhlIHJlc2VydmVkIHBhZ2UgKi8KKworI2RlZmluZSBYUENfU1VQUE9SVFNfUlBfU1RBTVAoX3ZlcnNpb24pIFwKKwkJCShfdmVyc2lvbiA+PSBfWFBDX1ZFUlNJT04oMSwxKSkKKworLyoKKyAqIGNvbXBhcmUgc3RhbXBzIC0gdGhlIHJldHVybiB2YWx1ZSBpczoKKyAqCisgKgk8IDAsCWlmIHN0YW1wMSA8IHN0YW1wMgorICoJPSAwLAlpZiBzdGFtcDEgPT0gc3RhbXAyCisgKgk+IDAsCWlmIHN0YW1wMSA+IHN0YW1wMgorICovCitzdGF0aWMgaW5saW5lIGludAoreHBjX2NvbXBhcmVfc3RhbXBzKHN0cnVjdCB0aW1lc3BlYyAqc3RhbXAxLCBzdHJ1Y3QgdGltZXNwZWMgKnN0YW1wMikKK3sKKwlpbnQgcmV0OworCisKKwlpZiAoKHJldCA9IHN0YW1wMS0+dHZfc2VjIC0gc3RhbXAyLT50dl9zZWMpID09IDApIHsKKwkJcmV0ID0gc3RhbXAxLT50dl9uc2VjIC0gc3RhbXAyLT50dl9uc2VjOworCX0KKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBEZWZpbmUgdGhlIHN0cnVjdHVyZXMgYnkgd2hpY2ggWFBDIHZhcmlhYmxlcyBjYW4gYmUgZXhwb3J0ZWQgdG8gb3RoZXIKKyAqIHBhcnRpdGlvbnMuIChUaGVyZSBhcmUgdHdvOiBzdHJ1Y3QgeHBjX3ZhcnMgYW5kIHN0cnVjdCB4cGNfdmFyc19wYXJ0KQorICovCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIHBhcnRpdGlvbiBnZW5lcmljIHZhcmlhYmxlcworICogbmVlZGVkIGJ5IG90aGVyIHBhcnRpdGlvbnMgaW4gb3JkZXIgdG8gcHJvcGVybHkgaW5pdGlhbGl6ZS4KKyAqCisgKiBzdHJ1Y3QgeHBjX3ZhcnMgdmVyc2lvbiBudW1iZXIgYWxzbyBhcHBsaWVzIHRvIHN0cnVjdCB4cGNfdmFyc19wYXJ0LgorICogQ2hhbmdlcyB0byBlaXRoZXIgc3RydWN0dXJlIGFuZC9vciByZWxhdGVkIGZ1bmN0aW9uYWxpdHkgc2hvdWxkIGJlCisgKiByZWZsZWN0ZWQgYnkgaW5jcmVtZW50aW5nIGVpdGhlciB0aGUgbWFqb3Igb3IgbWlub3IgdmVyc2lvbiBudW1iZXJzCisgKiBvZiBzdHJ1Y3QgeHBjX3ZhcnMuCisgKi8KK3N0cnVjdCB4cGNfdmFycyB7CisJdTggdmVyc2lvbjsKKwl1NjQgaGVhcnRiZWF0OworCXU2NCBoZWFydGJlYXRpbmdfdG9fbWFzazsKKwl1NjQgaGVhcnRiZWF0X29mZmxpbmU7CS8qIGlmIDAsIGhlYXJ0YmVhdCBzaG91bGQgYmUgY2hhbmdpbmcgKi8KKwlpbnQgYWN0X25hc2lkOworCWludCBhY3RfcGh5c19jcHVpZDsKKwl1NjQgdmFyc19wYXJ0X3BhOworCXU2NCBhbW9zX3BhZ2VfcGE7CS8qIHBhZGRyIG9mIHBhZ2Ugb2YgQU1PcyBmcm9tIE1TUEVDIGRyaXZlciAqLworCUFNT190ICphbW9zX3BhZ2U7CS8qIHZhZGRyIG9mIHBhZ2Ugb2YgQU1PcyBmcm9tIE1TUEVDIGRyaXZlciAqLworfTsKKworI2RlZmluZSBYUENfVl9WRVJTSU9OIF9YUENfVkVSU0lPTigzLDEpIC8qIHZlcnNpb24gMy4xIG9mIHRoZSBjcm9zcyB2YXJzICovCisKKyNkZWZpbmUgWFBDX1NVUFBPUlRTX0RJU0VOR0FHRV9SRVFVRVNUKF92ZXJzaW9uKSBcCisJCQkoX3ZlcnNpb24gPj0gX1hQQ19WRVJTSU9OKDMsMSkpCisKKworc3RhdGljIGlubGluZSBpbnQKK3hwY19oYl9hbGxvd2VkKHBhcnRpZF90IHBhcnRpZCwgc3RydWN0IHhwY192YXJzICp2YXJzKQoreworCXJldHVybiAoKHZhcnMtPmhlYXJ0YmVhdGluZ190b19tYXNrICYgKDFVTCA8PCBwYXJ0aWQpKSAhPSAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit4cGNfYWxsb3dfaGIocGFydGlkX3QgcGFydGlkLCBzdHJ1Y3QgeHBjX3ZhcnMgKnZhcnMpCit7CisJdTY0IG9sZF9tYXNrLCBuZXdfbWFzazsKKworCWRvIHsKKwkJb2xkX21hc2sgPSB2YXJzLT5oZWFydGJlYXRpbmdfdG9fbWFzazsKKwkJbmV3X21hc2sgPSAob2xkX21hc2sgfCAoMVVMIDw8IHBhcnRpZCkpOworCX0gd2hpbGUgKGNtcHhjaGcoJnZhcnMtPmhlYXJ0YmVhdGluZ190b19tYXNrLCBvbGRfbWFzaywgbmV3X21hc2spICE9CisJCQkJCQkJb2xkX21hc2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3hwY19kaXNhbGxvd19oYihwYXJ0aWRfdCBwYXJ0aWQsIHN0cnVjdCB4cGNfdmFycyAqdmFycykKK3sKKwl1NjQgb2xkX21hc2ssIG5ld19tYXNrOworCisJZG8geworCQlvbGRfbWFzayA9IHZhcnMtPmhlYXJ0YmVhdGluZ190b19tYXNrOworCQluZXdfbWFzayA9IChvbGRfbWFzayAmIH4oMVVMIDw8IHBhcnRpZCkpOworCX0gd2hpbGUgKGNtcHhjaGcoJnZhcnMtPmhlYXJ0YmVhdGluZ190b19tYXNrLCBvbGRfbWFzaywgbmV3X21hc2spICE9CisJCQkJCQkJb2xkX21hc2spOworfQorCisKKy8qCisgKiBUaGUgQU1PcyBwYWdlIGNvbnNpc3RzIG9mIGEgbnVtYmVyIG9mIEFNTyB2YXJpYWJsZXMgd2hpY2ggYXJlIGRpdmlkZWQgaW50bworICogZm91ciBncm91cHMsIFRoZSBmaXJzdCB0d28gZ3JvdXBzIGFyZSB1c2VkIHRvIGlkZW50aWZ5IGFuIElSUSdzIHNlbmRlci4KKyAqIFRoZXNlIHR3byBncm91cHMgY29uc2lzdCBvZiA2NCBhbmQgMTI4IEFNTyB2YXJpYWJsZXMgcmVzcGVjdGl2ZWx5LiBUaGUgbGFzdAorICogdHdvIGdyb3VwcywgY29uc2lzdGluZyBvZiBqdXN0IG9uZSBBTU8gdmFyaWFibGUgZWFjaCwgYXJlIHVzZWQgdG8gaWRlbnRpZnkKKyAqIHRoZSByZW1vdGUgcGFydGl0aW9ucyB0aGF0IGFyZSBjdXJyZW50bHkgZW5nYWdlZCAoZnJvbSB0aGUgdmlld3BvaW50IG9mCisgKiB0aGUgWFBDIHJ1bm5pbmcgb24gdGhlIHJlbW90ZSBwYXJ0aXRpb24pLgorICovCisjZGVmaW5lIFhQQ19OT1RJRllfSVJRX0FNT1MJICAgMAorI2RlZmluZSBYUENfQUNUSVZBVEVfSVJRX0FNT1MJICAgKFhQQ19OT1RJRllfSVJRX0FNT1MgKyBYUF9NQVhfUEFSVElUSU9OUykKKyNkZWZpbmUgWFBDX0VOR0FHRURfUEFSVElUSU9OU19BTU8gKFhQQ19BQ1RJVkFURV9JUlFfQU1PUyArIFhQX05BU0lEX01BU0tfV09SRFMpCisjZGVmaW5lIFhQQ19ESVNFTkdBR0VfUkVRVUVTVF9BTU8gIChYUENfRU5HQUdFRF9QQVJUSVRJT05TX0FNTyArIDEpCisKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgcGVyIHBhcnRpdGlvbiBzcGVjaWZpYyB2YXJpYWJsZXMuCisgKgorICogQW4gYXJyYXkgb2YgdGhlc2Ugc3RydWN0dXJlcywgb25lIHBlciBwYXJ0aXRpb24sIHdpbGwgYmUgZGVmaW5lZC4gQXMgYQorICogcGFydGl0aW9uIGJlY29tZXMgYWN0aXZlIFhQQyB3aWxsIGNvcHkgdGhlIGFycmF5IGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8KKyAqIGl0c2VsZiBmcm9tIHRoYXQgcGFydGl0aW9uLiBJdCBpcyBkZXNpcmFibGUgdGhhdCB0aGUgc2l6ZSBvZiB0aGlzCisgKiBzdHJ1Y3R1cmUgZXZlbmx5IGRpdmlkZSBpbnRvIGEgY2FjaGVsaW5lLCBzdWNoIHRoYXQgbm9uZSBvZiB0aGUgZW50cmllcworICogaW4gdGhpcyBhcnJheSBjcm9zc2VzIGEgY2FjaGVsaW5lIGJvdW5kYXJ5LiBBcyBpdCBpcyBub3csIGVhY2ggZW50cnkKKyAqIG9jY3VwaWVzIGhhbGYgYSBjYWNoZWxpbmUuCisgKi8KK3N0cnVjdCB4cGNfdmFyc19wYXJ0IHsKKwl2b2xhdGlsZSB1NjQgbWFnaWM7CisKKwl1NjQgb3BlbmNsb3NlX2FyZ3NfcGE7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2Ygb3BlbiBhbmQgY2xvc2UgYXJncyAqLworCXU2NCBHUHNfcGE7CQkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIEdldC9QdXQgdmFsdWVzICovCisKKwl1NjQgSVBJX2Ftb19wYTsJCS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgSVBJIEFNT190IHN0cnVjdHVyZSAqLworCWludCBJUElfbmFzaWQ7CQkvKiBuYXNpZCBvZiB3aGVyZSB0byBzZW5kIElQSXMgKi8KKwlpbnQgSVBJX3BoeXNfY3B1aWQ7CS8qIHBoeXNpY2FsIENQVSBJRCBvZiB3aGVyZSB0byBzZW5kIElQSXMgKi8KKworCXU4IG5jaGFubmVsczsJCS8qICNvZiBkZWZpbmVkIGNoYW5uZWxzIHN1cHBvcnRlZCAqLworCisJdTggcmVzZXJ2ZWRbMjNdOwkvKiBwYWQgdG8gYSBmdWxsIDY0IGJ5dGVzICovCit9OworCisvKgorICogVGhlIHZhcnNfcGFydCBNQUdJQyBudW1iZXJzIHBsYXkgYSBwYXJ0IGluIHRoZSBmaXJzdCBjb250YWN0IHByb3RvY29sLgorICoKKyAqIE1BR0lDMSBpbmRpY2F0ZXMgdGhhdCB0aGUgcGVyIHBhcnRpdGlvbiBzcGVjaWZpYyB2YXJpYWJsZXMgZm9yIGEgcmVtb3RlCisgKiBwYXJ0aXRpb24gaGF2ZSBiZWVuIGluaXRpYWxpemVkIGJ5IHRoaXMgcGFydGl0aW9uLgorICoKKyAqIE1BR0lDMiBpbmRpY2F0ZXMgdGhhdCB0aGlzIHBhcnRpdGlvbiBoYXMgcHVsbGVkIHRoZSByZW1vdGUgcGFydGl0aXRpb25zCisgKiBwZXIgcGFydGl0aW9uIHZhcmlhYmxlcyB0aGF0IHBlcnRhaW4gdG8gdGhpcyBwYXJ0aXRpb24uCisgKi8KKyNkZWZpbmUgWFBDX1ZQX01BR0lDMQkweDAwNTM1MjQxNTY0MzUwNThMICAvKiAnWFBDVkFSU1wwJ0wgKGxpdHRsZSBlbmRpYW4pICovCisjZGVmaW5lIFhQQ19WUF9NQUdJQzIJMHgwMDczNzI2MTc2NDM1MDU4TCAgLyogJ1hQQ3ZhcnNcMCdMIChsaXR0bGUgZW5kaWFuKSAqLworCisKKy8qIHRoZSByZXNlcnZlZCBwYWdlIHNpemVzIGFuZCBvZmZzZXRzICovCisKKyNkZWZpbmUgWFBDX1JQX0hFQURFUl9TSVpFCUwxX0NBQ0hFX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHBjX3JzdmRfcGFnZSkpCisjZGVmaW5lIFhQQ19SUF9WQVJTX1NJWkUgCUwxX0NBQ0hFX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHBjX3ZhcnMpKQorCisjZGVmaW5lIFhQQ19SUF9QQVJUX05BU0lEUyhfcnApICh1NjQgKikgKCh1OCAqKSBfcnAgKyBYUENfUlBfSEVBREVSX1NJWkUpCisjZGVmaW5lIFhQQ19SUF9NQUNIX05BU0lEUyhfcnApIChYUENfUlBfUEFSVF9OQVNJRFMoX3JwKSArIHhwX25hc2lkX21hc2tfd29yZHMpCisjZGVmaW5lIFhQQ19SUF9WQVJTKF9ycCkJKChzdHJ1Y3QgeHBjX3ZhcnMgKikgWFBDX1JQX01BQ0hfTkFTSURTKF9ycCkgKyB4cF9uYXNpZF9tYXNrX3dvcmRzKQorI2RlZmluZSBYUENfUlBfVkFSU19QQVJUKF9ycCkJKHN0cnVjdCB4cGNfdmFyc19wYXJ0ICopICgodTggKikgWFBDX1JQX1ZBUlMocnApICsgWFBDX1JQX1ZBUlNfU0laRSkKKworCisvKgorICogRnVuY3Rpb25zIHJlZ2lzdGVyZWQgYnkgYWRkX3RpbWVyKCkgb3IgY2FsbGVkIGJ5IGtlcm5lbF90aHJlYWQoKSBvbmx5CisgKiBhbGxvdyBmb3IgYSBzaW5nbGUgNjQtYml0IGFyZ3VtZW50LiBUaGUgZm9sbG93aW5nIG1hY3JvcyBjYW4gYmUgdXNlZCB0bworICogcGFjayBhbmQgdW5wYWNrIHR3byAoMzItYml0LCAxNi1iaXQgb3IgOC1iaXQpIGFyZ3VtZW50cyBpbnRvIG9yIG91dCBmcm9tCisgKiB0aGUgcGFzc2VkIGFyZ3VtZW50LgorICovCisjZGVmaW5lIFhQQ19QQUNLX0FSR1MoX2FyZzEsIF9hcmcyKSBcCisJCQkoKCgodTY0KSBfYXJnMSkgJiAweGZmZmZmZmZmKSB8IFwKKwkJCSgoKCh1NjQpIF9hcmcyKSAmIDB4ZmZmZmZmZmYpIDw8IDMyKSkKKworI2RlZmluZSBYUENfVU5QQUNLX0FSRzEoX2FyZ3MpCSgoKHU2NCkgX2FyZ3MpICYgMHhmZmZmZmZmZikKKyNkZWZpbmUgWFBDX1VOUEFDS19BUkcyKF9hcmdzKQkoKCgodTY0KSBfYXJncykgPj4gMzIpICYgMHhmZmZmZmZmZikKKworCisKKy8qCisgKiBEZWZpbmUgYSBHZXQvUHV0IHZhbHVlIHBhaXIgKHBvaW50ZXJzKSB1c2VkIHdpdGggYSBtZXNzYWdlIHF1ZXVlLgorICovCitzdHJ1Y3QgeHBjX2dwIHsKKwl2b2xhdGlsZSBzNjQgZ2V0OwkvKiBHZXQgdmFsdWUgKi8KKwl2b2xhdGlsZSBzNjQgcHV0OwkvKiBQdXQgdmFsdWUgKi8KK307CisKKyNkZWZpbmUgWFBDX0dQX1NJWkUgXAorCQlMMV9DQUNIRV9BTElHTihzaXplb2Yoc3RydWN0IHhwY19ncCkgKiBYUENfTkNIQU5ORUxTKQorCisKKworLyoKKyAqIERlZmluZSBhIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIGFyZ3VtZW50cyBhc3NvY2lhdGVkIHdpdGggb3BlbmluZyBhbmQKKyAqIGNsb3NpbmcgYSBjaGFubmVsLgorICovCitzdHJ1Y3QgeHBjX29wZW5jbG9zZV9hcmdzIHsKKwl1MTYgcmVhc29uOwkJLyogcmVhc29uIHdoeSBjaGFubmVsIGlzIGNsb3NpbmcgKi8KKwl1MTYgbXNnX3NpemU7CQkvKiBzaXplb2YgZWFjaCBtZXNzYWdlIGVudHJ5ICovCisJdTE2IHJlbW90ZV9uZW50cmllczsJLyogI29mIG1lc3NhZ2UgZW50cmllcyBpbiByZW1vdGUgbXNnIHF1ZXVlICovCisJdTE2IGxvY2FsX25lbnRyaWVzOwkvKiAjb2YgbWVzc2FnZSBlbnRyaWVzIGluIGxvY2FsIG1zZyBxdWV1ZSAqLworCXU2NCBsb2NhbF9tc2dxdWV1ZV9wYTsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBsb2NhbCBtZXNzYWdlIHF1ZXVlICovCit9OworCisjZGVmaW5lIFhQQ19PUEVOQ0xPU0VfQVJHU19TSVpFIFwKKwkgICAgICBMMV9DQUNIRV9BTElHTihzaXplb2Yoc3RydWN0IHhwY19vcGVuY2xvc2VfYXJncykgKiBYUENfTkNIQU5ORUxTKQorCisKKworLyogc3RydWN0IHhwY19tc2cgZmxhZ3MgKi8KKworI2RlZmluZQlYUENfTV9ET05FCQkweDAxCS8qIG1zZyBoYXMgYmVlbiByZWNlaXZlZC9jb25zdW1lZCAqLworI2RlZmluZQlYUENfTV9SRUFEWQkJMHgwMgkvKiBtc2cgaXMgcmVhZHkgdG8gYmUgc2VudCAqLworI2RlZmluZQlYUENfTV9JTlRFUlJVUFQJCTB4MDQJLyogc2VuZCBpbnRlcnJ1cHQgd2hlbiBtc2cgY29uc3VtZWQgKi8KKworCisjZGVmaW5lIFhQQ19NU0dfQUREUkVTUyhfcGF5bG9hZCkgXAorCQkoKHN0cnVjdCB4cGNfbXNnICopKCh1OCAqKShfcGF5bG9hZCkgLSBYUENfTVNHX1BBWUxPQURfT0ZGU0VUKSkKKworCisKKy8qCisgKiBEZWZpbmVzIG5vdGlmeSBlbnRyeS4KKyAqCisgKiBUaGlzIGlzIHVzZWQgdG8gbm90aWZ5IGEgbWVzc2FnZSdzIHNlbmRlciB0aGF0IHRoZWlyIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkCisgKiBhbmQgY29uc3VtZWQgYnkgdGhlIGludGVuZGVkIHJlY2lwaWVudC4KKyAqLworc3RydWN0IHhwY19ub3RpZnkgeworCXZvbGF0aWxlIHU4IHR5cGU7CQkvKiB0eXBlIG9mIG5vdGlmaWNhdGlvbiAqLworCisJLyogdGhlIGZvbGxvd2luZyB0d28gZmllbGRzIGFyZSBvbmx5IHVzZWQgaWYgdHlwZSA9PSBYUENfTl9DQUxMICovCisJeHBjX25vdGlmeV9mdW5jIGZ1bmM7CQkvKiB1c2VyJ3Mgbm90aWZ5IGZ1bmN0aW9uICovCisJdm9pZCAqa2V5OwkJCS8qIHBvaW50ZXIgdG8gdXNlcidzIGtleSAqLworfTsKKworLyogc3RydWN0IHhwY19ub3RpZnkgdHlwZSBvZiBub3RpZmljYXRpb24gKi8KKworI2RlZmluZQlYUENfTl9DQUxMCQkweDAxCS8qIG5vdGlmeSBmdW5jdGlvbiBwcm92aWRlZCBieSB1c2VyICovCisKKworCisvKgorICogRGVmaW5lIHRoZSBzdHJ1Y3R1cmUgdGhhdCBtYW5hZ2VzIGFsbCB0aGUgc3R1ZmYgcmVxdWlyZWQgYnkgYSBjaGFubmVsLiBJbgorICogcGFydGljdWxhciwgdGhleSBhcmUgdXNlZCB0byBtYW5hZ2UgdGhlIG1lc3NhZ2VzIHNlbnQgYWNyb3NzIHRoZSBjaGFubmVsLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHByaXZhdGUgdG8gYSBwYXJ0aXRpb24sIGFuZCBpcyBOT1Qgc2hhcmVkIGFjcm9zcyB0aGUKKyAqIHBhcnRpdGlvbiBib3VuZGFyeS4KKyAqCisgKiBUaGVyZSBpcyBhbiBhcnJheSBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGZvciBlYWNoIHJlbW90ZSBwYXJ0aXRpb24uIEl0IGlzCisgKiBhbGxvY2F0ZWQgYXQgdGhlIHRpbWUgYSBwYXJ0aXRpb24gYmVjb21lcyBhY3RpdmUuIFRoZSBhcnJheSBjb250YWlucyBvbmUKKyAqIG9mIHRoZXNlIHN0cnVjdHVyZXMgZm9yIGVhY2ggcG90ZW50aWFsIGNoYW5uZWwgY29ubmVjdGlvbiB0byB0aGF0IHBhcnRpdGlvbi4KKyAqCisgKiBFYWNoIG9mIHRoZXNlIHN0cnVjdHVyZXMgbWFuYWdlcyB0d28gbWVzc2FnZSBxdWV1ZXMgKGNpcmN1bGFyIGJ1ZmZlcnMpLgorICogVGhleSBhcmUgYWxsb2NhdGVkIGF0IHRoZSB0aW1lIGEgY2hhbm5lbCBjb25uZWN0aW9uIGlzIG1hZGUuIE9uZSBvZgorICogdGhlc2UgbWVzc2FnZSBxdWV1ZXMgKGxvY2FsX21zZ3F1ZXVlKSBob2xkcyB0aGUgbG9jYWxseSBjcmVhdGVkIG1lc3NhZ2VzCisgKiB0aGF0IGFyZSBkZXN0aW5lZCBmb3IgdGhlIHJlbW90ZSBwYXJ0aXRpb24uIFRoZSBvdGhlciBvZiB0aGVzZSBtZXNzYWdlCisgKiBxdWV1ZXMgKHJlbW90ZV9tc2dxdWV1ZSkgaXMgYSBsb2NhbGx5IGNhY2hlZCBjb3B5IG9mIHRoZSByZW1vdGUgcGFydGl0aW9uJ3MKKyAqIG93biBsb2NhbF9tc2dxdWV1ZS4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIEdldC9QdXQgcG9pbnRlcnMgdXNlZCB0byBtYW5hZ2UgdGhlc2UKKyAqIHR3byBtZXNzYWdlIHF1ZXVlcy4gQ29uc2lkZXIgdGhlIGxvY2FsX21zZ3F1ZXVlIHRvIGJlIG9uIG9uZSBwYXJ0aXRpb24KKyAqIGFuZCB0aGUgcmVtb3RlX21zZ3F1ZXVlIHRvIGJlIGl0cyBjYWNoZWQgY29weSBvbiBhbm90aGVyIHBhcnRpdGlvbi4gQQorICogZGVzY3JpcHRpb24gb2Ygd2hhdCBlYWNoIG9mIHRoZSBsZXR0ZXJlZCBhcmVhcyBjb250YWlucyBpcyBpbmNsdWRlZC4KKyAqCisgKgorICogICAgICAgICAgICAgICAgICAgICBsb2NhbF9tc2dxdWV1ZSAgICAgIHJlbW90ZV9tc2dxdWV1ZQorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgfC8vLy8vLy8vL3wgICAgICB8Ly8vLy8vLy8vfAorICogICAgd19yZW1vdGVfR1AuZ2V0IC0tPiArLS0tLS0tLS0tKyAgICAgIHwvLy8vLy8vLy98CisgKiAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgRiAgICB8ICAgICAgfC8vLy8vLy8vL3wKKyAqICAgICByZW1vdGVfR1AuZ2V0ICAtLT4gKy0tLS0tLS0tLSsgICAgICArLS0tLS0tLS0tKyA8LS0gbG9jYWxfR1AtPmdldAorICogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgIHwgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgfCAgICBFICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwgICAgICB8ICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICstLS0tLS0tLS0rIDwtLSB3X2xvY2FsX0dQLmdldAorICogICAgICAgICAgICAgICAgICAgICAgICB8ICAgIEIgICAgfCAgICAgIHwvLy8vLy8vLy98CisgKiAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgfC8vLy9ELy8vL3wKKyAqICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwgICAgICB8Ly8vLy8vLy8vfAorICogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICstLS0tLS0tLS0rIDwtLSB3X3JlbW90ZV9HUC5wdXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwgICAgICB8Ly8vL0MvLy8vfAorICogICAgICBsb2NhbF9HUC0+cHV0IC0tPiArLS0tLS0tLS0tKyAgICAgICstLS0tLS0tLS0rIDwtLSByZW1vdGVfR1AucHV0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgfC8vLy8vLy8vL3wKKyAqICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBBICAgIHwgICAgICB8Ly8vLy8vLy8vfAorICogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgIHwvLy8vLy8vLy98CisgKiAgICAgd19sb2NhbF9HUC5wdXQgLS0+ICstLS0tLS0tLS0rICAgICAgfC8vLy8vLy8vL3wKKyAqICAgICAgICAgICAgICAgICAgICAgICAgfC8vLy8vLy8vL3wgICAgICB8Ly8vLy8vLy8vfAorICoKKyAqCisgKgkgICAgKCByZW1vdGVfR1AuW2dldHxwdXRdIGFyZSBjYWNoZWQgY29waWVzIG9mIHRoZSByZW1vdGUKKyAqCSAgICAgIHBhcnRpdGlvbidzIGxvY2FsX0dQLT5bZ2V0fHB1dF0sIGFuZCB0aHVzIHRoZWlyIHZhbHVlcyBjYW4KKyAqCSAgICAgIGxhZyBiZWhpbmQgdGhlaXIgY291bnRlcnBhcnRzIG9uIHRoZSByZW1vdGUgcGFydGl0aW9uLiApCisgKgorICoKKyAqICBBIC0gTWVzc2FnZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkLCBidXQgaGF2ZSBub3QgeWV0IGJlZW4gc2VudCB0byB0aGUKKyAqCXJlbW90ZSBwYXJ0aXRpb24uCisgKgorICogIEIgLSBNZXNzYWdlcyB0aGF0IGhhdmUgYmVlbiBzZW50LCBidXQgaGF2ZSBub3QgeWV0IGJlZW4gYWNrbm93bGVkZ2VkIGJ5IHRoZQorICogICAgICByZW1vdGUgcGFydGl0aW9uIGFzIGhhdmluZyBiZWVuIHJlY2VpdmVkLgorICoKKyAqICBDIC0gQXJlYSB0aGF0IG5lZWRzIHRvIGJlIHByZXBhcmVkIGZvciB0aGUgY29weWluZyBvZiBzZW50IG1lc3NhZ2VzLCBieQorICoJdGhlIGNsZWFyaW5nIG9mIHRoZSBtZXNzYWdlIGZsYWdzIG9mIGFueSBwcmV2aW91c2x5IHJlY2VpdmVkIG1lc3NhZ2VzLgorICoKKyAqICBEIC0gQXJlYSBpbnRvIHdoaWNoIHNlbnQgbWVzc2FnZXMgYXJlIHRvIGJlIGNvcGllZCBmcm9tIHRoZSByZW1vdGUKKyAqCXBhcnRpdGlvbidzIGxvY2FsX21zZ3F1ZXVlIGFuZCB0aGVuIGRlbGl2ZXJlZCB0byB0aGVpciBpbnRlbmRlZAorICoJcmVjaXBpZW50cy4gWyBUbyBhbGxvdyBmb3IgYSBtdWx0aS1tZXNzYWdlIGNvcHksIGFub3RoZXIgcG9pbnRlcgorICoJKG5leHRfbXNnX3RvX3B1bGwpIGhhcyBiZWVuIGFkZGVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG5leHQgbWVzc2FnZQorICoJbnVtYmVyIG5lZWRpbmcgdG8gYmUgY29waWVkIChwdWxsZWQpLiBJdCBjaGFzZXMgYWZ0ZXIgd19yZW1vdGVfR1AucHV0LgorICoJQW55IG1lc3NhZ2VzIGx5aW5nIGJldHdlZW4gd19sb2NhbF9HUC5nZXQgYW5kIG5leHRfbXNnX3RvX3B1bGwgaGF2ZQorICoJYmVlbiBjb3BpZWQgYW5kIGFyZSByZWFkeSB0byBiZSBkZWxpdmVyZWQuIF0KKyAqCisgKiAgRSAtIE1lc3NhZ2VzIHRoYXQgaGF2ZSBiZWVuIGNvcGllZCBhbmQgZGVsaXZlcmVkLCBidXQgaGF2ZSBub3QgeWV0IGJlZW4KKyAqCWFja25vd2xlZGdlZCBieSB0aGUgcmVjaXBpZW50IGFzIGhhdmluZyBiZWVuIHJlY2VpdmVkLgorICoKKyAqICBGIC0gTWVzc2FnZXMgdGhhdCBoYXZlIGJlZW4gYWNrbm93bGVkZ2VkLCBidXQgWFBDIGhhcyBub3QgeWV0IG5vdGlmaWVkIHRoZQorICoJc2VuZGVyIHRoYXQgdGhlIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkIGJ5IGl0cyBpbnRlbmRlZCByZWNpcGllbnQuCisgKglUaGlzIGlzIGFsc28gYW4gYXJlYSB0aGF0IG5lZWRzIHRvIGJlIHByZXBhcmVkIGZvciB0aGUgYWxsb2NhdGluZyBvZgorICoJbmV3IG1lc3NhZ2VzLCBieSB0aGUgY2xlYXJpbmcgb2YgdGhlIG1lc3NhZ2UgZmxhZ3Mgb2YgdGhlIGFja25vd2xlZGdlZAorICoJbWVzc2FnZXMuCisgKi8KK3N0cnVjdCB4cGNfY2hhbm5lbCB7CisJcGFydGlkX3QgcGFydGlkOwkJLyogSUQgb2YgcmVtb3RlIHBhcnRpdGlvbiBjb25uZWN0ZWQgKi8KKwlzcGlubG9ja190IGxvY2s7CQkvKiBsb2NrIGZvciB1cGRhdGluZyB0aGlzIHN0cnVjdHVyZSAqLworCXUzMiBmbGFnczsJCQkvKiBnZW5lcmFsIGZsYWdzICovCisKKwllbnVtIHhwY19yZXR2YWwgcmVhc29uOwkJLyogcmVhc29uIHdoeSBjaGFubmVsIGlzIGRpc2Nvbm5lY3QnZyAqLworCWludCByZWFzb25fbGluZTsJCS8qIGxpbmUjIGRpc2Nvbm5lY3QgaW5pdGlhdGVkIGZyb20gKi8KKworCXUxNiBudW1iZXI7CQkJLyogY2hhbm5lbCAjICovCisKKwl1MTYgbXNnX3NpemU7CQkJLyogc2l6ZW9mIGVhY2ggbXNnIGVudHJ5ICovCisJdTE2IGxvY2FsX25lbnRyaWVzOwkJLyogI29mIG1zZyBlbnRyaWVzIGluIGxvY2FsIG1zZyBxdWV1ZSAqLworCXUxNiByZW1vdGVfbmVudHJpZXM7CQkvKiAjb2YgbXNnIGVudHJpZXMgaW4gcmVtb3RlIG1zZyBxdWV1ZSovCisKKwl2b2lkICpsb2NhbF9tc2dxdWV1ZV9iYXNlOwkvKiBiYXNlIGFkZHJlc3Mgb2Yga21hbGxvYydkIHNwYWNlICovCisJc3RydWN0IHhwY19tc2cgKmxvY2FsX21zZ3F1ZXVlOwkvKiBsb2NhbCBtZXNzYWdlIHF1ZXVlICovCisJdm9pZCAqcmVtb3RlX21zZ3F1ZXVlX2Jhc2U7CS8qIGJhc2UgYWRkcmVzcyBvZiBrbWFsbG9jJ2Qgc3BhY2UgKi8KKwlzdHJ1Y3QgeHBjX21zZyAqcmVtb3RlX21zZ3F1ZXVlOy8qIGNhY2hlZCBjb3B5IG9mIHJlbW90ZSBwYXJ0aXRpb24ncyAqLworCQkJCQkvKiBsb2NhbCBtZXNzYWdlIHF1ZXVlICovCisJdTY0IHJlbW90ZV9tc2dxdWV1ZV9wYTsJCS8qIHBoeXMgYWRkciBvZiByZW1vdGUgcGFydGl0aW9uJ3MgKi8KKwkJCQkJLyogbG9jYWwgbWVzc2FnZSBxdWV1ZSAqLworCisJYXRvbWljX3QgcmVmZXJlbmNlczsJCS8qICNvZiBleHRlcm5hbCByZWZlcmVuY2VzIHRvIHF1ZXVlcyAqLworCisJYXRvbWljX3Qgbl9vbl9tc2dfYWxsb2NhdGVfd3E7ICAgLyogI29uIG1zZyBhbGxvY2F0aW9uIHdhaXQgcXVldWUgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBtc2dfYWxsb2NhdGVfd3E7IC8qIG1zZyBhbGxvY2F0aW9uIHdhaXQgcXVldWUgKi8KKworCXU4IGRlbGF5ZWRfSVBJX2ZsYWdzOwkJLyogSVBJIGZsYWdzIHJlY2VpdmVkLCBidXQgZGVsYXllZCAqLworCQkJCQkvKiBhY3Rpb24gdW50aWwgY2hhbm5lbCBkaXNjb25uZWN0ZWQgKi8KKworCS8qIHF1ZXVlIG9mIG1zZyBzZW5kZXJzIHdobyB3YW50IHRvIGJlIG5vdGlmaWVkIHdoZW4gbXNnIHJlY2VpdmVkICovCisKKwlhdG9taWNfdCBuX3RvX25vdGlmeTsJCS8qICNvZiBtc2cgc2VuZGVycyB0byBub3RpZnkgKi8KKwlzdHJ1Y3QgeHBjX25vdGlmeSAqbm90aWZ5X3F1ZXVlOy8qIG5vdGlmeSBxdWV1ZSBmb3IgbWVzc2FnZXMgc2VudCAqLworCisJeHBjX2NoYW5uZWxfZnVuYyBmdW5jOwkJLyogdXNlcidzIGNoYW5uZWwgZnVuY3Rpb24gKi8KKwl2b2lkICprZXk7CQkJLyogcG9pbnRlciB0byB1c2VyJ3Mga2V5ICovCisKKwlzdHJ1Y3QgbXV0ZXggbXNnX3RvX3B1bGxfbXV0ZXg7CS8qIG5leHQgbXNnIHRvIHB1bGwgc2VyaWFsaXphdGlvbiAqLworCXN0cnVjdCBjb21wbGV0aW9uIHdkaXNjb25uZWN0X3dhaXQ7IC8qIHdhaXQgZm9yIGNoYW5uZWwgZGlzY29ubmVjdCAqLworCisJc3RydWN0IHhwY19vcGVuY2xvc2VfYXJncyAqbG9jYWxfb3BlbmNsb3NlX2FyZ3M7IC8qIGFyZ3MgcGFzc2VkIG9uICovCisJCQkJCS8qIG9wZW5pbmcgb3IgY2xvc2luZyBvZiBjaGFubmVsICovCisKKwkvKiB2YXJpb3VzIGZsYXZvcnMgb2YgbG9jYWwgYW5kIHJlbW90ZSBHZXQvUHV0IHZhbHVlcyAqLworCisJc3RydWN0IHhwY19ncCAqbG9jYWxfR1A7CS8qIGxvY2FsIEdldC9QdXQgdmFsdWVzICovCisJc3RydWN0IHhwY19ncCByZW1vdGVfR1A7CS8qIHJlbW90ZSBHZXQvUHV0IHZhbHVlcyAqLworCXN0cnVjdCB4cGNfZ3Agd19sb2NhbF9HUDsJLyogd29ya2luZyBsb2NhbCBHZXQvUHV0IHZhbHVlcyAqLworCXN0cnVjdCB4cGNfZ3Agd19yZW1vdGVfR1A7CS8qIHdvcmtpbmcgcmVtb3RlIEdldC9QdXQgdmFsdWVzICovCisJczY0IG5leHRfbXNnX3RvX3B1bGw7CQkvKiBQdXQgdmFsdWUgb2YgbmV4dCBtc2cgdG8gcHVsbCAqLworCisJLyoga3RocmVhZCBtYW5hZ2VtZW50IHJlbGF0ZWQgZmllbGRzICovCisKKy8vID4+PiByZXRoaW5rIGhhdmluZyBrdGhyZWFkc19hc3NpZ25lZF9saW1pdCBhbmQga3RocmVhZHNfaWRsZV9saW1pdDsgcGVyaGFwcworLy8gPj4+IGFsbG93IHRoZSBhc3NpZ25lZCBsaW1pdCBiZSB1bmJvdW5kZWQgYW5kIGxldCB0aGUgaWRsZSBsaW1pdCBiZSBkeW5hbWljCisvLyA+Pj4gZGVwZW5kZW50IG9uIGFjdGl2aXR5IG92ZXIgdGhlIGxhc3QgaW50ZXJ2YWwgb2YgdGltZQorCWF0b21pY190IGt0aHJlYWRzX2Fzc2lnbmVkOwkvKiAjb2Yga3RocmVhZHMgYXNzaWduZWQgdG8gY2hhbm5lbCAqLworCXUzMiBrdGhyZWFkc19hc3NpZ25lZF9saW1pdDsgCS8qIGxpbWl0IG9uICNvZiBrdGhyZWFkcyBhc3NpZ25lZCAqLworCWF0b21pY190IGt0aHJlYWRzX2lkbGU7CQkvKiAjb2Yga3RocmVhZHMgaWRsZSB3YWl0aW5nIGZvciB3b3JrICovCisJdTMyIGt0aHJlYWRzX2lkbGVfbGltaXQ7CS8qIGxpbWl0IG9uICNvZiBrdGhyZWFkcyBpZGxlICovCisJYXRvbWljX3Qga3RocmVhZHNfYWN0aXZlOwkvKiAjb2Yga3RocmVhZHMgYWN0aXZlbHkgd29ya2luZyAqLworCS8vID4+PiBmb2xsb3dpbmcgZmllbGQgaXMgdGVtcG9yYXJ5CisJdTMyIGt0aHJlYWRzX2NyZWF0ZWQ7CQkvKiB0b3RhbCAjb2Yga3RocmVhZHMgY3JlYXRlZCAqLworCisJd2FpdF9xdWV1ZV9oZWFkX3QgaWRsZV93cTsJLyogaWRsZSBrdGhyZWFkIHdhaXQgcXVldWUgKi8KKworfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisKKworLyogc3RydWN0IHhwY19jaGFubmVsIGZsYWdzICovCisKKyNkZWZpbmUJWFBDX0NfV0FTQ09OTkVDVEVECTB4MDAwMDAwMDEgLyogY2hhbm5lbCB3YXMgY29ubmVjdGVkICovCisKKyNkZWZpbmUJWFBDX0NfUk9QRU5SRVBMWQkweDAwMDAwMDAyIC8qIHJlbW90ZSBvcGVuIGNoYW5uZWwgcmVwbHkgKi8KKyNkZWZpbmUJWFBDX0NfT1BFTlJFUExZCQkweDAwMDAwMDA0IC8qIGxvY2FsIG9wZW4gY2hhbm5lbCByZXBseSAqLworI2RlZmluZQlYUENfQ19ST1BFTlJFUVVFU1QJMHgwMDAwMDAwOCAvKiByZW1vdGUgb3BlbiBjaGFubmVsIHJlcXVlc3QgKi8KKyNkZWZpbmUJWFBDX0NfT1BFTlJFUVVFU1QJMHgwMDAwMDAxMCAvKiBsb2NhbCBvcGVuIGNoYW5uZWwgcmVxdWVzdCAqLworCisjZGVmaW5lCVhQQ19DX1NFVFVQCQkweDAwMDAwMDIwIC8qIGNoYW5uZWwncyBtc2dxdWV1ZXMgYXJlIGFsbG9jJ2QgKi8KKyNkZWZpbmUJWFBDX0NfQ09OTkVDVENBTExPVVQJMHgwMDAwMDA0MCAvKiBjaGFubmVsIGNvbm5lY3RlZCBjYWxsb3V0IG1hZGUgKi8KKyNkZWZpbmUJWFBDX0NfQ09OTkVDVEVECQkweDAwMDAwMDgwIC8qIGxvY2FsIGNoYW5uZWwgaXMgY29ubmVjdGVkICovCisjZGVmaW5lCVhQQ19DX0NPTk5FQ1RJTkcJMHgwMDAwMDEwMCAvKiBjaGFubmVsIGlzIGJlaW5nIGNvbm5lY3RlZCAqLworCisjZGVmaW5lCVhQQ19DX1JDTE9TRVJFUExZCTB4MDAwMDAyMDAgLyogcmVtb3RlIGNsb3NlIGNoYW5uZWwgcmVwbHkgKi8KKyNkZWZpbmUJWFBDX0NfQ0xPU0VSRVBMWQkweDAwMDAwNDAwIC8qIGxvY2FsIGNsb3NlIGNoYW5uZWwgcmVwbHkgKi8KKyNkZWZpbmUJWFBDX0NfUkNMT1NFUkVRVUVTVAkweDAwMDAwODAwIC8qIHJlbW90ZSBjbG9zZSBjaGFubmVsIHJlcXVlc3QgKi8KKyNkZWZpbmUJWFBDX0NfQ0xPU0VSRVFVRVNUCTB4MDAwMDEwMDAgLyogbG9jYWwgY2xvc2UgY2hhbm5lbCByZXF1ZXN0ICovCisKKyNkZWZpbmUJWFBDX0NfRElTQ09OTkVDVEVECTB4MDAwMDIwMDAgLyogY2hhbm5lbCBpcyBkaXNjb25uZWN0ZWQgKi8KKyNkZWZpbmUJWFBDX0NfRElTQ09OTkVDVElORwkweDAwMDA0MDAwIC8qIGNoYW5uZWwgaXMgYmVpbmcgZGlzY29ubmVjdGVkICovCisjZGVmaW5lCVhQQ19DX0RJU0NPTk5FQ1RDQUxMT1VUCTB4MDAwMDgwMDAgLyogY2hhbiBkaXNjb25uZWN0ZWQgY2FsbG91dCBtYWRlICovCisjZGVmaW5lCVhQQ19DX1dESVNDT05ORUNUCTB4MDAwMTAwMDAgLyogd2FpdGluZyBmb3IgY2hhbm5lbCBkaXNjb25uZWN0ICovCisKKworCisvKgorICogTWFuYWdlcyBjaGFubmVscyBvbiBhIHBhcnRpdGlvbiBiYXNpcy4gVGhlcmUgaXMgb25lIG9mIHRoZXNlIHN0cnVjdHVyZXMKKyAqIGZvciBlYWNoIHBhcnRpdGlvbiAoYSBwYXJ0aXRpb24gd2lsbCBuZXZlciB1dGlsaXplIHRoZSBzdHJ1Y3R1cmUgdGhhdAorICogcmVwcmVzZW50cyBpdHNlbGYpLgorICovCitzdHJ1Y3QgeHBjX3BhcnRpdGlvbiB7CisKKwkvKiBYUEMgSEIgaW5mcmFzdHJ1Y3R1cmUgKi8KKworCXU4IHJlbW90ZV9ycF92ZXJzaW9uOwkJLyogdmVyc2lvbiMgb2YgcGFydGl0aW9uJ3MgcnN2ZCBwZyAqLworCXN0cnVjdCB0aW1lc3BlYyByZW1vdGVfcnBfc3RhbXA7LyogdGltZSB3aGVuIHJzdmQgcGcgd2FzIGluaXRpYWxpemVkICovCisJdTY0IHJlbW90ZV9ycF9wYTsJCS8qIHBoeXMgYWRkciBvZiBwYXJ0aXRpb24ncyByc3ZkIHBnICovCisJdTY0IHJlbW90ZV92YXJzX3BhOwkJLyogcGh5cyBhZGRyIG9mIHBhcnRpdGlvbidzIHZhcnMgKi8KKwl1NjQgcmVtb3RlX3ZhcnNfcGFydF9wYTsJLyogcGh5cyBhZGRyIG9mIHBhcnRpdGlvbidzIHZhcnMgcGFydCAqLworCXU2NCBsYXN0X2hlYXJ0YmVhdDsJCS8qIEhCIGF0IGxhc3QgcmVhZCAqLworCXU2NCByZW1vdGVfYW1vc19wYWdlX3BhOwkvKiBwaHlzIGFkZHIgb2YgcGFydGl0aW9uJ3MgYW1vcyBwYWdlICovCisJaW50IHJlbW90ZV9hY3RfbmFzaWQ7CQkvKiBhY3RpdmUgcGFydCdzIGFjdC9kZWFjdCBuYXNpZCAqLworCWludCByZW1vdGVfYWN0X3BoeXNfY3B1aWQ7CS8qIGFjdGl2ZSBwYXJ0J3MgYWN0L2RlYWN0IHBoeXMgY3B1aWQgKi8KKwl1MzIgYWN0X0lSUV9yY3ZkOwkJLyogSVJRcyBzaW5jZSBhY3RpdmF0aW9uICovCisJc3BpbmxvY2tfdCBhY3RfbG9jazsJCS8qIHByb3RlY3QgdXBkYXRpbmcgb2YgYWN0X3N0YXRlICovCisJdTggYWN0X3N0YXRlOwkJCS8qIGZyb20gWFBDIEhCIHZpZXdwb2ludCAqLworCXU4IHJlbW90ZV92YXJzX3ZlcnNpb247CQkvKiB2ZXJzaW9uIyBvZiBwYXJ0aXRpb24ncyB2YXJzICovCisJZW51bSB4cGNfcmV0dmFsIHJlYXNvbjsJCS8qIHJlYXNvbiBwYXJ0aXRpb24gaXMgZGVhY3RpdmF0aW5nICovCisJaW50IHJlYXNvbl9saW5lOwkJLyogbGluZSMgZGVhY3RpdmF0aW9uIGluaXRpYXRlZCBmcm9tICovCisJaW50IHJlYWN0aXZhdGVfbmFzaWQ7CQkvKiBuYXNpZCBpbiBwYXJ0aXRpb24gdG8gcmVhY3RpdmF0ZSAqLworCisJdW5zaWduZWQgbG9uZyBkaXNlbmdhZ2VfcmVxdWVzdF90aW1lb3V0OyAvKiB0aW1lb3V0IGluIGppZmZpZXMgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBkaXNlbmdhZ2VfcmVxdWVzdF90aW1lcjsKKworCisJLyogWFBDIGluZnJhc3RydWN0dXJlIHJlZmVyZW5jaW5nIGFuZCB0ZWFyZG93biBjb250cm9sICovCisKKwl2b2xhdGlsZSB1OCBzZXR1cF9zdGF0ZTsJLyogaW5mcmFzdHJ1Y3R1cmUgc2V0dXAgc3RhdGUgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB0ZWFyZG93bl93cTsJLyoga3RocmVhZCB3YWl0aW5nIHRvIHRlYXJkb3duIGluZnJhICovCisJYXRvbWljX3QgcmVmZXJlbmNlczsJCS8qICNvZiByZWZlcmVuY2VzIHRvIGluZnJhc3RydWN0dXJlICovCisKKworCS8qCisJICogTk9ORSBPRiBUSEUgUFJFQ0VESU5HIEZJRUxEUyBPRiBUSElTIFNUUlVDVFVSRSBXSUxMIEJFIENMRUFSRUQgV0hFTgorCSAqIFhQQyBTRVRTIFVQIFRIRSBORUNFU1NBUlkgSU5GUkFTVFJVQ1RVUkUgVE8gU1VQUE9SVCBDUk9TUyBQQVJUSVRJT04KKwkgKiBDT01NVU5JQ0FUSU9OLiBBTEwgT0YgVEhFIEZPTExPV0lORyBGSUVMRFMgV0lMTCBCRSBDTEVBUkVELiAoVEhFCisJICogJ25jaGFubmVscycgRklFTEQgTVVTVCBCRSBUSEUgRklSU1QgT0YgVEhFIEZJRUxEUyBUTyBCRSBDTEVBUkVELikKKwkgKi8KKworCisJdTggbmNoYW5uZWxzOwkJICAgLyogI29mIGRlZmluZWQgY2hhbm5lbHMgc3VwcG9ydGVkICovCisJYXRvbWljX3QgbmNoYW5uZWxzX2FjdGl2ZTsgLyogI29mIGNoYW5uZWxzIHRoYXQgYXJlIG5vdCBESVNDT05ORUNURUQgKi8KKwlhdG9taWNfdCBuY2hhbm5lbHNfZW5nYWdlZDsvKiAjb2YgY2hhbm5lbHMgZW5nYWdlZCB3aXRoIHJlbW90ZSBwYXJ0ICovCisJc3RydWN0IHhwY19jaGFubmVsICpjaGFubmVsczsvKiBhcnJheSBvZiBjaGFubmVsIHN0cnVjdHVyZXMgKi8KKworCXZvaWQgKmxvY2FsX0dQc19iYXNlOwkgIC8qIGJhc2UgYWRkcmVzcyBvZiBrbWFsbG9jJ2Qgc3BhY2UgKi8KKwlzdHJ1Y3QgeHBjX2dwICpsb2NhbF9HUHM7IC8qIGxvY2FsIEdldC9QdXQgdmFsdWVzICovCisJdm9pZCAqcmVtb3RlX0dQc19iYXNlOyAgICAvKiBiYXNlIGFkZHJlc3Mgb2Yga21hbGxvYydkIHNwYWNlICovCisJc3RydWN0IHhwY19ncCAqcmVtb3RlX0dQczsvKiBjb3B5IG9mIHJlbW90ZSBwYXJ0aXRpb24ncyBsb2NhbCBHZXQvUHV0ICovCisJCQkJICAvKiB2YWx1ZXMgKi8KKwl1NjQgcmVtb3RlX0dQc19wYTsJICAvKiBwaHlzIGFkZHJlc3Mgb2YgcmVtb3RlIHBhcnRpdGlvbidzIGxvY2FsICovCisJCQkJICAvKiBHZXQvUHV0IHZhbHVlcyAqLworCisKKwkvKiBmaWVsZHMgdXNlZCB0byBwYXNzIGFyZ3Mgd2hlbiBvcGVuaW5nIG9yIGNsb3NpbmcgYSBjaGFubmVsICovCisKKwl2b2lkICpsb2NhbF9vcGVuY2xvc2VfYXJnc19iYXNlOyAgLyogYmFzZSBhZGRyZXNzIG9mIGttYWxsb2MnZCBzcGFjZSAqLworCXN0cnVjdCB4cGNfb3BlbmNsb3NlX2FyZ3MgKmxvY2FsX29wZW5jbG9zZV9hcmdzOyAgLyogbG9jYWwncyBhcmdzICovCisJdm9pZCAqcmVtb3RlX29wZW5jbG9zZV9hcmdzX2Jhc2U7IC8qIGJhc2UgYWRkcmVzcyBvZiBrbWFsbG9jJ2Qgc3BhY2UgKi8KKwlzdHJ1Y3QgeHBjX29wZW5jbG9zZV9hcmdzICpyZW1vdGVfb3BlbmNsb3NlX2FyZ3M7IC8qIGNvcHkgb2YgcmVtb3RlJ3MgKi8KKwkJCQkJICAvKiBhcmdzICovCisJdTY0IHJlbW90ZV9vcGVuY2xvc2VfYXJnc19wYTsJICAvKiBwaHlzIGFkZHIgb2YgcmVtb3RlJ3MgYXJncyAqLworCisKKwkvKiBJUEkgc2VuZGluZywgcmVjZWl2aW5nIGFuZCBoYW5kbGluZyByZWxhdGVkIGZpZWxkcyAqLworCisJaW50IHJlbW90ZV9JUElfbmFzaWQ7CSAgICAvKiBuYXNpZCBvZiB3aGVyZSB0byBzZW5kIElQSXMgKi8KKwlpbnQgcmVtb3RlX0lQSV9waHlzX2NwdWlkOyAgLyogcGh5cyBDUFUgSUQgb2Ygd2hlcmUgdG8gc2VuZCBJUElzICovCisJQU1PX3QgKnJlbW90ZV9JUElfYW1vX3ZhOyAgIC8qIGFkZHJlc3Mgb2YgcmVtb3RlIElQSSBBTU9fdCBzdHJ1Y3R1cmUgKi8KKworCUFNT190ICpsb2NhbF9JUElfYW1vX3ZhOyAgICAvKiBhZGRyZXNzIG9mIElQSSBBTU9fdCBzdHJ1Y3R1cmUgKi8KKwl1NjQgbG9jYWxfSVBJX2FtbzsJICAgIC8qIElQSSBhbW8gZmxhZ3MgeWV0IHRvIGJlIGhhbmRsZWQgKi8KKwljaGFyIElQSV9vd25lcls4XTsJICAgIC8qIElQSSBvd25lcidzIG5hbWUgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBkcm9wcGVkX0lQSV90aW1lcjsgLyogZHJvcHBlZCBJUEkgdGltZXIgKi8KKworCXNwaW5sb2NrX3QgSVBJX2xvY2s7CSAgICAvKiBJUEkgaGFuZGxlciBsb2NrICovCisKKworCS8qIGNoYW5uZWwgbWFuYWdlciByZWxhdGVkIGZpZWxkcyAqLworCisJYXRvbWljX3QgY2hhbm5lbF9tZ3JfcmVxdWVzdHM7CS8qICNvZiByZXF1ZXN0cyB0byBhY3RpdmF0ZSBjaGFuIG1nciAqLworCXdhaXRfcXVldWVfaGVhZF90IGNoYW5uZWxfbWdyX3dxOyAvKiBjaGFubmVsIG1ncidzIHdhaXQgcXVldWUgKi8KKworfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisKKworLyogc3RydWN0IHhwY19wYXJ0aXRpb24gYWN0X3N0YXRlIHZhbHVlcyAoZm9yIFhQQyBIQikgKi8KKworI2RlZmluZQlYUENfUF9JTkFDVElWRQkJMHgwMAkvKiBwYXJ0aXRpb24gaXMgbm90IGFjdGl2ZSAqLworI2RlZmluZSBYUENfUF9BQ1RJVkFUSU9OX1JFUQkweDAxCS8qIGNyZWF0ZWQgdGhyZWFkIHRvIGFjdGl2YXRlICovCisjZGVmaW5lIFhQQ19QX0FDVElWQVRJTkcJMHgwMgkvKiBhY3RpdmF0aW9uIHRocmVhZCBzdGFydGVkICovCisjZGVmaW5lIFhQQ19QX0FDVElWRQkJMHgwMwkvKiB4cGNfcGFydGl0aW9uX3VwKCkgd2FzIGNhbGxlZCAqLworI2RlZmluZSBYUENfUF9ERUFDVElWQVRJTkcJMHgwNAkvKiBwYXJ0aXRpb24gZGVhY3RpdmF0aW9uIGluaXRpYXRlZCAqLworCisKKyNkZWZpbmUgWFBDX0RFQUNUSVZBVEVfUEFSVElUSU9OKF9wLCBfcmVhc29uKSBcCisJCQl4cGNfZGVhY3RpdmF0ZV9wYXJ0aXRpb24oX19MSU5FX18sIChfcCksIChfcmVhc29uKSkKKworCisvKiBzdHJ1Y3QgeHBjX3BhcnRpdGlvbiBzZXR1cF9zdGF0ZSB2YWx1ZXMgKi8KKworI2RlZmluZSBYUENfUF9VTlNFVAkJMHgwMAkvKiBpbmZyYXN0cnVjdHVyZSB3YXMgbmV2ZXIgc2V0dXAgKi8KKyNkZWZpbmUgWFBDX1BfU0VUVVAJCTB4MDEJLyogaW5mcmFzdHJ1Y3R1cmUgaXMgc2V0dXAgKi8KKyNkZWZpbmUgWFBDX1BfV1RFQVJET1dOCQkweDAyCS8qIHdhaXRpbmcgdG8gdGVhcmRvd24gaW5mcmFzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgWFBDX1BfVE9STkRPV04JCTB4MDMJLyogaW5mcmFzdHJ1Y3R1cmUgaXMgdG9ybmRvd24gKi8KKworCisKKy8qCisgKiBzdHJ1Y3QgeHBjX3BhcnRpdGlvbiBJUElfdGltZXIgI29mIHNlY29uZHMgdG8gd2FpdCBiZWZvcmUgY2hlY2tpbmcgZm9yCisgKiBkcm9wcGVkIElQSXMuIFRoZXNlIG9jY3VyIHdoZW5ldmVyIGFuIElQSSBhbW8gd3JpdGUgZG9lc24ndCBjb21wbGV0ZSB1bnRpbAorICogYWZ0ZXIgdGhlIElQSSB3YXMgcmVjZWl2ZWQuCisgKi8KKyNkZWZpbmUgWFBDX1BfRFJPUFBFRF9JUElfV0FJVAkoMC4yNSAqIEhaKQorCisKKy8qIG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgZm9yIG90aGVyIHBhcnRpdGlvbnMgdG8gZGlzZW5nYWdlICovCisjZGVmaW5lIFhQQ19ESVNFTkdBR0VfUkVRVUVTVF9ERUZBVUxUX1RJTUVMSU1JVAk5MAorCisvKiBpbnRlcnZhbCBpbiBzZWNvbmRzIHRvIHByaW50ICd3YWl0aW5nIGRpc2VuZ2FnZW1lbnQnIG1lc3NhZ2VzICovCisjZGVmaW5lIFhQQ19ESVNFTkdBR0VfUFJJTlRNU0dfSU5URVJWQUwJCTEwCisKKworI2RlZmluZSBYUENfUEFSVElEKF9wKQkoKHBhcnRpZF90KSAoKF9wKSAtICZ4cGNfcGFydGl0aW9uc1swXSkpCisKKworCisvKiBmb3VuZCBpbiB4cF9tYWluLmMgKi8KK2V4dGVybiBzdHJ1Y3QgeHBjX3JlZ2lzdHJhdGlvbiB4cGNfcmVnaXN0cmF0aW9uc1tdOworCisKKy8qIGZvdW5kIGluIHhwY19tYWluLmMgKi8KK2V4dGVybiBzdHJ1Y3QgZGV2aWNlICp4cGNfcGFydDsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlICp4cGNfY2hhbjsKK2V4dGVybiBpbnQgeHBjX2Rpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVsaW1pdDsKK2V4dGVybiBpbnQgeHBjX2Rpc2VuZ2FnZV9yZXF1ZXN0X3RpbWVkb3V0OworZXh0ZXJuIGlycXJldHVybl90IHhwY19ub3RpZnlfSVJRX2hhbmRsZXIoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworZXh0ZXJuIHZvaWQgeHBjX2Ryb3BwZWRfSVBJX2NoZWNrKHN0cnVjdCB4cGNfcGFydGl0aW9uICopOworZXh0ZXJuIHZvaWQgeHBjX2FjdGl2YXRlX3BhcnRpdGlvbihzdHJ1Y3QgeHBjX3BhcnRpdGlvbiAqKTsKK2V4dGVybiB2b2lkIHhwY19hY3RpdmF0ZV9rdGhyZWFkcyhzdHJ1Y3QgeHBjX2NoYW5uZWwgKiwgaW50KTsKK2V4dGVybiB2b2lkIHhwY19jcmVhdGVfa3RocmVhZHMoc3RydWN0IHhwY19jaGFubmVsICosIGludCk7CitleHRlcm4gdm9pZCB4cGNfZGlzY29ubmVjdF93YWl0KGludCk7CisKKworLyogZm91bmQgaW4geHBjX3BhcnRpdGlvbi5jICovCitleHRlcm4gaW50IHhwY19leGl0aW5nOworZXh0ZXJuIHN0cnVjdCB4cGNfdmFycyAqeHBjX3ZhcnM7CitleHRlcm4gc3RydWN0IHhwY19yc3ZkX3BhZ2UgKnhwY19yc3ZkX3BhZ2U7CitleHRlcm4gc3RydWN0IHhwY192YXJzX3BhcnQgKnhwY192YXJzX3BhcnQ7CitleHRlcm4gc3RydWN0IHhwY19wYXJ0aXRpb24geHBjX3BhcnRpdGlvbnNbWFBfTUFYX1BBUlRJVElPTlMgKyAxXTsKK2V4dGVybiBjaGFyIHhwY19yZW1vdGVfY29weV9idWZmZXJbXTsKK2V4dGVybiBzdHJ1Y3QgeHBjX3JzdmRfcGFnZSAqeHBjX3JzdmRfcGFnZV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgeHBjX2FsbG93X0lQSV9vcHModm9pZCk7CitleHRlcm4gdm9pZCB4cGNfcmVzdHJpY3RfSVBJX29wcyh2b2lkKTsKK2V4dGVybiBpbnQgeHBjX2lkZW50aWZ5X2FjdF9JUlFfc2VuZGVyKHZvaWQpOworZXh0ZXJuIGludCB4cGNfcGFydGl0aW9uX2Rpc2VuZ2FnZWQoc3RydWN0IHhwY19wYXJ0aXRpb24gKik7CitleHRlcm4gZW51bSB4cGNfcmV0dmFsIHhwY19tYXJrX3BhcnRpdGlvbl9hY3RpdmUoc3RydWN0IHhwY19wYXJ0aXRpb24gKik7CitleHRlcm4gdm9pZCB4cGNfbWFya19wYXJ0aXRpb25faW5hY3RpdmUoc3RydWN0IHhwY19wYXJ0aXRpb24gKik7CitleHRlcm4gdm9pZCB4cGNfZGlzY292ZXJ5KHZvaWQpOworZXh0ZXJuIHZvaWQgeHBjX2NoZWNrX3JlbW90ZV9oYih2b2lkKTsKK2V4dGVybiB2b2lkIHhwY19kZWFjdGl2YXRlX3BhcnRpdGlvbihjb25zdCBpbnQsIHN0cnVjdCB4cGNfcGFydGl0aW9uICosCisJCQkJCQllbnVtIHhwY19yZXR2YWwpOworZXh0ZXJuIGVudW0geHBjX3JldHZhbCB4cGNfaW5pdGlhdGVfcGFydGlkX3RvX25hc2lkcyhwYXJ0aWRfdCwgdm9pZCAqKTsKKworCisvKiBmb3VuZCBpbiB4cGNfY2hhbm5lbC5jICovCitleHRlcm4gdm9pZCB4cGNfaW5pdGlhdGVfY29ubmVjdChpbnQpOworZXh0ZXJuIHZvaWQgeHBjX2luaXRpYXRlX2Rpc2Nvbm5lY3QoaW50KTsKK2V4dGVybiBlbnVtIHhwY19yZXR2YWwgeHBjX2luaXRpYXRlX2FsbG9jYXRlKHBhcnRpZF90LCBpbnQsIHUzMiwgdm9pZCAqKik7CitleHRlcm4gZW51bSB4cGNfcmV0dmFsIHhwY19pbml0aWF0ZV9zZW5kKHBhcnRpZF90LCBpbnQsIHZvaWQgKik7CitleHRlcm4gZW51bSB4cGNfcmV0dmFsIHhwY19pbml0aWF0ZV9zZW5kX25vdGlmeShwYXJ0aWRfdCwgaW50LCB2b2lkICosCisJCQkJCQl4cGNfbm90aWZ5X2Z1bmMsIHZvaWQgKik7CitleHRlcm4gdm9pZCB4cGNfaW5pdGlhdGVfcmVjZWl2ZWQocGFydGlkX3QsIGludCwgdm9pZCAqKTsKK2V4dGVybiBlbnVtIHhwY19yZXR2YWwgeHBjX3NldHVwX2luZnJhc3RydWN0dXJlKHN0cnVjdCB4cGNfcGFydGl0aW9uICopOworZXh0ZXJuIGVudW0geHBjX3JldHZhbCB4cGNfcHVsbF9yZW1vdGVfdmFyc19wYXJ0KHN0cnVjdCB4cGNfcGFydGl0aW9uICopOworZXh0ZXJuIHZvaWQgeHBjX3Byb2Nlc3NfY2hhbm5lbF9hY3Rpdml0eShzdHJ1Y3QgeHBjX3BhcnRpdGlvbiAqKTsKK2V4dGVybiB2b2lkIHhwY19jb25uZWN0ZWRfY2FsbG91dChzdHJ1Y3QgeHBjX2NoYW5uZWwgKik7CitleHRlcm4gdm9pZCB4cGNfZGVsaXZlcl9tc2coc3RydWN0IHhwY19jaGFubmVsICopOworZXh0ZXJuIHZvaWQgeHBjX2Rpc2Nvbm5lY3RfY2hhbm5lbChjb25zdCBpbnQsIHN0cnVjdCB4cGNfY2hhbm5lbCAqLAorCQkJCQllbnVtIHhwY19yZXR2YWwsIHVuc2lnbmVkIGxvbmcgKik7CitleHRlcm4gdm9pZCB4cGNfZGlzY29ubmVjdF9jYWxsb3V0KHN0cnVjdCB4cGNfY2hhbm5lbCAqLCBlbnVtIHhwY19yZXR2YWwpOworZXh0ZXJuIHZvaWQgeHBjX3BhcnRpdGlvbl9nb2luZ19kb3duKHN0cnVjdCB4cGNfcGFydGl0aW9uICosIGVudW0geHBjX3JldHZhbCk7CitleHRlcm4gdm9pZCB4cGNfdGVhcmRvd25faW5mcmFzdHJ1Y3R1cmUoc3RydWN0IHhwY19wYXJ0aXRpb24gKik7CisKKworCitzdGF0aWMgaW5saW5lIHZvaWQKK3hwY193YWtldXBfY2hhbm5lbF9tZ3Ioc3RydWN0IHhwY19wYXJ0aXRpb24gKnBhcnQpCit7CisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZwYXJ0LT5jaGFubmVsX21ncl9yZXF1ZXN0cykgPT0gMSkgeworCQl3YWtlX3VwKCZwYXJ0LT5jaGFubmVsX21ncl93cSk7CisJfQorfQorCisKKworLyoKKyAqIFRoZXNlIG5leHQgdHdvIGlubGluZXMgYXJlIHVzZWQgdG8ga2VlcCB1cyBmcm9tIHRlYXJpbmcgZG93biBhIGNoYW5uZWwncworICogbXNnIHF1ZXVlcyB3aGlsZSBhIHRocmVhZCBtYXkgYmUgcmVmZXJlbmNpbmcgdGhlbS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCit4cGNfbXNncXVldWVfcmVmKHN0cnVjdCB4cGNfY2hhbm5lbCAqY2gpCit7CisJYXRvbWljX2luYygmY2gtPnJlZmVyZW5jZXMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3hwY19tc2dxdWV1ZV9kZXJlZihzdHJ1Y3QgeHBjX2NoYW5uZWwgKmNoKQoreworCXMzMiByZWZzID0gYXRvbWljX2RlY19yZXR1cm4oJmNoLT5yZWZlcmVuY2VzKTsKKworCURCVUdfT04ocmVmcyA8IDApOworCWlmIChyZWZzID09IDApIHsKKwkJeHBjX3dha2V1cF9jaGFubmVsX21ncigmeHBjX3BhcnRpdGlvbnNbY2gtPnBhcnRpZF0pOworCX0KK30KKworCisKKyNkZWZpbmUgWFBDX0RJU0NPTk5FQ1RfQ0hBTk5FTChfY2gsIF9yZWFzb24sIF9pcnFmbGdzKSBcCisJCXhwY19kaXNjb25uZWN0X2NoYW5uZWwoX19MSU5FX18sIF9jaCwgX3JlYXNvbiwgX2lycWZsZ3MpCisKKworLyoKKyAqIFRoZXNlIHR3byBpbmxpbmVzIGFyZSB1c2VkIHRvIGtlZXAgdXMgZnJvbSB0ZWFyaW5nIGRvd24gYSBwYXJ0aXRpb24ncworICogc2V0dXAgaW5mcmFzdHJ1Y3R1cmUgd2hpbGUgYSB0aHJlYWQgbWF5IGJlIHJlZmVyZW5jaW5nIGl0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3hwY19wYXJ0X2RlcmVmKHN0cnVjdCB4cGNfcGFydGl0aW9uICpwYXJ0KQoreworCXMzMiByZWZzID0gYXRvbWljX2RlY19yZXR1cm4oJnBhcnQtPnJlZmVyZW5jZXMpOworCisKKwlEQlVHX09OKHJlZnMgPCAwKTsKKwlpZiAocmVmcyA9PSAwICYmIHBhcnQtPnNldHVwX3N0YXRlID09IFhQQ19QX1dURUFSRE9XTikgeworCQl3YWtlX3VwKCZwYXJ0LT50ZWFyZG93bl93cSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludAoreHBjX3BhcnRfcmVmKHN0cnVjdCB4cGNfcGFydGl0aW9uICpwYXJ0KQoreworCWludCBzZXR1cDsKKworCisJYXRvbWljX2luYygmcGFydC0+cmVmZXJlbmNlcyk7CisJc2V0dXAgPSAocGFydC0+c2V0dXBfc3RhdGUgPT0gWFBDX1BfU0VUVVApOworCWlmICghc2V0dXApIHsKKwkJeHBjX3BhcnRfZGVyZWYocGFydCk7CisJfQorCXJldHVybiBzZXR1cDsKK30KKworCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIG1hY3JvIGlzIHRvIGJlIHVzZWQgZm9yIHRoZSBzZXR0aW5nIG9mIHRoZSByZWFzb24gYW5kCisgKiByZWFzb25fbGluZSBmaWVsZHMgaW4gYm90aCB0aGUgc3RydWN0IHhwY19jaGFubmVsIGFuZCBzdHJ1Y3QgeHBjX3BhcnRpdGlvbgorICogc3RydWN0dXJlcy4KKyAqLworI2RlZmluZSBYUENfU0VUX1JFQVNPTihfcCwgX3JlYXNvbiwgX2xpbmUpIFwKKwl7IFwKKwkJKF9wKS0+cmVhc29uID0gX3JlYXNvbjsgXAorCQkoX3ApLT5yZWFzb25fbGluZSA9IF9saW5lOyBcCisJfQorCisKKworLyoKKyAqIFRoaXMgbmV4dCBzZXQgb2YgaW5saW5lcyBhcmUgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoZW4gYSBwYXJ0aXRpb24gaXMKKyAqIHBvdGVudGlhbGx5IGVuZ2FnZWQgaW4gYWNjZXNzaW5nIG1lbW9yeSBiZWxvbmdpbmcgdG8gYW5vdGhlciBwYXJ0aXRpb24uCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkCit4cGNfbWFya19wYXJ0aXRpb25fZW5nYWdlZChzdHJ1Y3QgeHBjX3BhcnRpdGlvbiAqcGFydCkKK3sKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKwlBTU9fdCAqYW1vID0gKEFNT190ICopIF9fdmEocGFydC0+cmVtb3RlX2Ftb3NfcGFnZV9wYSArCisJCQkJKFhQQ19FTkdBR0VEX1BBUlRJVElPTlNfQU1PICogc2l6ZW9mKEFNT190KSkpOworCisKKwlsb2NhbF9pcnFfc2F2ZShpcnFfZmxhZ3MpOworCisJLyogc2V0IGJpdCBjb3JyZXNwb25kaW5nIHRvIG91ciBwYXJ0aWQgaW4gcmVtb3RlIHBhcnRpdGlvbidzIEFNTyAqLworCUZFVENIT1BfU1RPUkVfT1AoVE9fQU1PKCh1NjQpICZhbW8tPnZhcmlhYmxlKSwgRkVUQ0hPUF9PUiwKKwkJCQkJCSgxVUwgPDwgc25fcGFydGl0aW9uX2lkKSk7CisJLyoKKwkgKiBXZSBtdXN0IGFsd2F5cyB1c2UgdGhlIG5vZmF1bHQgZnVuY3Rpb24gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlCisJICogYXJlIG9uIGEgU2h1YiAxLjEgc3lzdGVtIG9yIGEgU2h1YiAxLjIgc2xpY2UgMHhjIHByb2Nlc3Nvci4gSWYgd2UKKwkgKiBkaWRuJ3QsIHdlJ2QgbmV2ZXIga25vdyB0aGF0IHRoZSBvdGhlciBwYXJ0aXRpb24gaXMgZG93biBhbmQgd291bGQKKwkgKiBrZWVwIHNlbmRpbmcgSVBJcyBhbmQgQU1PcyB0byBpdCB1bnRpbCB0aGUgaGVhcnRiZWF0IHRpbWVzIG91dC4KKwkgKi8KKwkodm9pZCkgeHBfbm9mYXVsdF9QSU9SKCh1NjQgKikgR0xPQkFMX01NUl9BRERSKE5BU0lEX0dFVCgmYW1vLT4KKwkJCQl2YXJpYWJsZSksIHhwX25vZmF1bHRfUElPUl90YXJnZXQpKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGlycV9mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoreHBjX21hcmtfcGFydGl0aW9uX2Rpc2VuZ2FnZWQoc3RydWN0IHhwY19wYXJ0aXRpb24gKnBhcnQpCit7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJQU1PX3QgKmFtbyA9IChBTU9fdCAqKSBfX3ZhKHBhcnQtPnJlbW90ZV9hbW9zX3BhZ2VfcGEgKworCQkJCShYUENfRU5HQUdFRF9QQVJUSVRJT05TX0FNTyAqIHNpemVvZihBTU9fdCkpKTsKKworCisJbG9jYWxfaXJxX3NhdmUoaXJxX2ZsYWdzKTsKKworCS8qIGNsZWFyIGJpdCBjb3JyZXNwb25kaW5nIHRvIG91ciBwYXJ0aWQgaW4gcmVtb3RlIHBhcnRpdGlvbidzIEFNTyAqLworCUZFVENIT1BfU1RPUkVfT1AoVE9fQU1PKCh1NjQpICZhbW8tPnZhcmlhYmxlKSwgRkVUQ0hPUF9BTkQsCisJCQkJCQl+KDFVTCA8PCBzbl9wYXJ0aXRpb25faWQpKTsKKwkvKgorCSAqIFdlIG11c3QgYWx3YXlzIHVzZSB0aGUgbm9mYXVsdCBmdW5jdGlvbiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2UKKwkgKiBhcmUgb24gYSBTaHViIDEuMSBzeXN0ZW0gb3IgYSBTaHViIDEuMiBzbGljZSAweGMgcHJvY2Vzc29yLiBJZiB3ZQorCSAqIGRpZG4ndCwgd2UnZCBuZXZlciBrbm93IHRoYXQgdGhlIG90aGVyIHBhcnRpdGlvbiBpcyBkb3duIGFuZCB3b3VsZAorCSAqIGtlZXAgc2VuZGluZyBJUElzIGFuZCBBTU9zIHRvIGl0IHVudGlsIHRoZSBoZWFydGJlYXQgdGltZXMgb3V0LgorCSAqLworCSh2b2lkKSB4cF9ub2ZhdWx0X1BJT1IoKHU2NCAqKSBHTE9CQUxfTU1SX0FERFIoTkFTSURfR0VUKCZhbW8tPgorCQkJCXZhcmlhYmxlKSwgeHBfbm9mYXVsdF9QSU9SX3RhcmdldCkpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoaXJxX2ZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit4cGNfcmVxdWVzdF9wYXJ0aXRpb25fZGlzZW5nYWdlKHN0cnVjdCB4cGNfcGFydGl0aW9uICpwYXJ0KQoreworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCUFNT190ICphbW8gPSAoQU1PX3QgKikgX192YShwYXJ0LT5yZW1vdGVfYW1vc19wYWdlX3BhICsKKwkJCQkoWFBDX0RJU0VOR0FHRV9SRVFVRVNUX0FNTyAqIHNpemVvZihBTU9fdCkpKTsKKworCisJbG9jYWxfaXJxX3NhdmUoaXJxX2ZsYWdzKTsKKworCS8qIHNldCBiaXQgY29ycmVzcG9uZGluZyB0byBvdXIgcGFydGlkIGluIHJlbW90ZSBwYXJ0aXRpb24ncyBBTU8gKi8KKwlGRVRDSE9QX1NUT1JFX09QKFRPX0FNTygodTY0KSAmYW1vLT52YXJpYWJsZSksIEZFVENIT1BfT1IsCisJCQkJCQkoMVVMIDw8IHNuX3BhcnRpdGlvbl9pZCkpOworCS8qCisJICogV2UgbXVzdCBhbHdheXMgdXNlIHRoZSBub2ZhdWx0IGZ1bmN0aW9uIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZQorCSAqIGFyZSBvbiBhIFNodWIgMS4xIHN5c3RlbSBvciBhIFNodWIgMS4yIHNsaWNlIDB4YyBwcm9jZXNzb3IuIElmIHdlCisJICogZGlkbid0LCB3ZSdkIG5ldmVyIGtub3cgdGhhdCB0aGUgb3RoZXIgcGFydGl0aW9uIGlzIGRvd24gYW5kIHdvdWxkCisJICoga2VlcCBzZW5kaW5nIElQSXMgYW5kIEFNT3MgdG8gaXQgdW50aWwgdGhlIGhlYXJ0YmVhdCB0aW1lcyBvdXQuCisJICovCisJKHZvaWQpIHhwX25vZmF1bHRfUElPUigodTY0ICopIEdMT0JBTF9NTVJfQUREUihOQVNJRF9HRVQoJmFtby0+CisJCQkJdmFyaWFibGUpLCB4cF9ub2ZhdWx0X1BJT1JfdGFyZ2V0KSk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShpcnFfZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3hwY19jYW5jZWxfcGFydGl0aW9uX2Rpc2VuZ2FnZV9yZXF1ZXN0KHN0cnVjdCB4cGNfcGFydGl0aW9uICpwYXJ0KQoreworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCUFNT190ICphbW8gPSAoQU1PX3QgKikgX192YShwYXJ0LT5yZW1vdGVfYW1vc19wYWdlX3BhICsKKwkJCQkoWFBDX0RJU0VOR0FHRV9SRVFVRVNUX0FNTyAqIHNpemVvZihBTU9fdCkpKTsKKworCisJbG9jYWxfaXJxX3NhdmUoaXJxX2ZsYWdzKTsKKworCS8qIGNsZWFyIGJpdCBjb3JyZXNwb25kaW5nIHRvIG91ciBwYXJ0aWQgaW4gcmVtb3RlIHBhcnRpdGlvbidzIEFNTyAqLworCUZFVENIT1BfU1RPUkVfT1AoVE9fQU1PKCh1NjQpICZhbW8tPnZhcmlhYmxlKSwgRkVUQ0hPUF9BTkQsCisJCQkJCQl+KDFVTCA8PCBzbl9wYXJ0aXRpb25faWQpKTsKKwkvKgorCSAqIFdlIG11c3QgYWx3YXlzIHVzZSB0aGUgbm9mYXVsdCBmdW5jdGlvbiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2UKKwkgKiBhcmUgb24gYSBTaHViIDEuMSBzeXN0ZW0gb3IgYSBTaHViIDEuMiBzbGljZSAweGMgcHJvY2Vzc29yLiBJZiB3ZQorCSAqIGRpZG4ndCwgd2UnZCBuZXZlciBrbm93IHRoYXQgdGhlIG90aGVyIHBhcnRpdGlvbiBpcyBkb3duIGFuZCB3b3VsZAorCSAqIGtlZXAgc2VuZGluZyBJUElzIGFuZCBBTU9zIHRvIGl0IHVudGlsIHRoZSBoZWFydGJlYXQgdGltZXMgb3V0LgorCSAqLworCSh2b2lkKSB4cF9ub2ZhdWx0X1BJT1IoKHU2NCAqKSBHTE9CQUxfTU1SX0FERFIoTkFTSURfR0VUKCZhbW8tPgorCQkJCXZhcmlhYmxlKSwgeHBfbm9mYXVsdF9QSU9SX3RhcmdldCkpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoaXJxX2ZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB1NjQKK3hwY19wYXJ0aXRpb25fZW5nYWdlZCh1NjQgcGFydGlkX21hc2spCit7CisJQU1PX3QgKmFtbyA9IHhwY192YXJzLT5hbW9zX3BhZ2UgKyBYUENfRU5HQUdFRF9QQVJUSVRJT05TX0FNTzsKKworCisJLyogcmV0dXJuIG91ciBwYXJ0aXRpb24ncyBBTU8gdmFyaWFibGUgQU5EZWQgd2l0aCBwYXJ0aWRfbWFzayAqLworCXJldHVybiAoRkVUQ0hPUF9MT0FEX09QKFRPX0FNTygodTY0KSAmYW1vLT52YXJpYWJsZSksIEZFVENIT1BfTE9BRCkgJgorCQkJCQkJCQlwYXJ0aWRfbWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0Cit4cGNfcGFydGl0aW9uX2Rpc2VuZ2FnZV9yZXF1ZXN0ZWQodTY0IHBhcnRpZF9tYXNrKQoreworCUFNT190ICphbW8gPSB4cGNfdmFycy0+YW1vc19wYWdlICsgWFBDX0RJU0VOR0FHRV9SRVFVRVNUX0FNTzsKKworCisJLyogcmV0dXJuIG91ciBwYXJ0aXRpb24ncyBBTU8gdmFyaWFibGUgQU5EZWQgd2l0aCBwYXJ0aWRfbWFzayAqLworCXJldHVybiAoRkVUQ0hPUF9MT0FEX09QKFRPX0FNTygodTY0KSAmYW1vLT52YXJpYWJsZSksIEZFVENIT1BfTE9BRCkgJgorCQkJCQkJCQlwYXJ0aWRfbWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoreHBjX2NsZWFyX3BhcnRpdGlvbl9lbmdhZ2VkKHU2NCBwYXJ0aWRfbWFzaykKK3sKKwlBTU9fdCAqYW1vID0geHBjX3ZhcnMtPmFtb3NfcGFnZSArIFhQQ19FTkdBR0VEX1BBUlRJVElPTlNfQU1POworCisKKwkvKiBjbGVhciBiaXQocykgYmFzZWQgb24gcGFydGlkX21hc2sgaW4gb3VyIHBhcnRpdGlvbidzIEFNTyAqLworCUZFVENIT1BfU1RPUkVfT1AoVE9fQU1PKCh1NjQpICZhbW8tPnZhcmlhYmxlKSwgRkVUQ0hPUF9BTkQsCisJCQkJCQkJCX5wYXJ0aWRfbWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoreHBjX2NsZWFyX3BhcnRpdGlvbl9kaXNlbmdhZ2VfcmVxdWVzdCh1NjQgcGFydGlkX21hc2spCit7CisJQU1PX3QgKmFtbyA9IHhwY192YXJzLT5hbW9zX3BhZ2UgKyBYUENfRElTRU5HQUdFX1JFUVVFU1RfQU1POworCisKKwkvKiBjbGVhciBiaXQocykgYmFzZWQgb24gcGFydGlkX21hc2sgaW4gb3VyIHBhcnRpdGlvbidzIEFNTyAqLworCUZFVENIT1BfU1RPUkVfT1AoVE9fQU1PKCh1NjQpICZhbW8tPnZhcmlhYmxlKSwgRkVUQ0hPUF9BTkQsCisJCQkJCQkJCX5wYXJ0aWRfbWFzayk7Cit9CisKKworCisvKgorICogVGhlIGZvbGxvd2luZyBzZXQgb2YgbWFjcm9zIGFuZCBpbmxpbmVzIGFyZSB1c2VkIGZvciB0aGUgc2VuZGluZyBhbmQKKyAqIHJlY2VpdmluZyBvZiBJUElzIChhbHNvIGtub3duIGFzIElSUXMpLiBUaGVyZSBhcmUgdHdvIGZsYXZvcnMgb2YgSVBJcywKKyAqIG9uZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBwYXJ0aXRpb24gYWN0aXZpdHkgKFNHSV9YUENfQUNUSVZBVEUpIGFuZAorICogdGhlIG90aGVyIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGNoYW5uZWwgYWN0aXZpdHkgKFNHSV9YUENfTk9USUZZKS4KKyAqLworCitzdGF0aWMgaW5saW5lIHU2NAoreHBjX0lQSV9yZWNlaXZlKEFNT190ICphbW8pCit7CisJcmV0dXJuIEZFVENIT1BfTE9BRF9PUChUT19BTU8oKHU2NCkgJmFtby0+dmFyaWFibGUpLCBGRVRDSE9QX0NMRUFSKTsKK30KKworCitzdGF0aWMgaW5saW5lIGVudW0geHBjX3JldHZhbAoreHBjX0lQSV9zZW5kKEFNT190ICphbW8sIHU2NCBmbGFnLCBpbnQgbmFzaWQsIGludCBwaHlzX2NwdWlkLCBpbnQgdmVjdG9yKQoreworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCisKKwlsb2NhbF9pcnFfc2F2ZShpcnFfZmxhZ3MpOworCisJRkVUQ0hPUF9TVE9SRV9PUChUT19BTU8oKHU2NCkgJmFtby0+dmFyaWFibGUpLCBGRVRDSE9QX09SLCBmbGFnKTsKKwlzbl9zZW5kX0lQSV9waHlzKG5hc2lkLCBwaHlzX2NwdWlkLCB2ZWN0b3IsIDApOworCisJLyoKKwkgKiBXZSBtdXN0IGFsd2F5cyB1c2UgdGhlIG5vZmF1bHQgZnVuY3Rpb24gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlCisJICogYXJlIG9uIGEgU2h1YiAxLjEgc3lzdGVtIG9yIGEgU2h1YiAxLjIgc2xpY2UgMHhjIHByb2Nlc3Nvci4gSWYgd2UKKwkgKiBkaWRuJ3QsIHdlJ2QgbmV2ZXIga25vdyB0aGF0IHRoZSBvdGhlciBwYXJ0aXRpb24gaXMgZG93biBhbmQgd291bGQKKwkgKiBrZWVwIHNlbmRpbmcgSVBJcyBhbmQgQU1PcyB0byBpdCB1bnRpbCB0aGUgaGVhcnRiZWF0IHRpbWVzIG91dC4KKwkgKi8KKwlyZXQgPSB4cF9ub2ZhdWx0X1BJT1IoKHU2NCAqKSBHTE9CQUxfTU1SX0FERFIoTkFTSURfR0VUKCZhbW8tPnZhcmlhYmxlKSwKKwkJCQl4cF9ub2ZhdWx0X1BJT1JfdGFyZ2V0KSk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShpcnFfZmxhZ3MpOworCisJcmV0dXJuICgocmV0ID09IDApID8geHBjU3VjY2VzcyA6IHhwY1Bpb1JlYWRFcnJvcik7Cit9CisKKworLyoKKyAqIElQSXMgYXNzb2NpYXRlZCB3aXRoIFNHSV9YUENfQUNUSVZBVEUgSVJRLgorICovCisKKy8qCisgKiBGbGFnIHRoZSBhcHByb3ByaWF0ZSBBTU8gdmFyaWFibGUgYW5kIHNlbmQgYW4gSVBJIHRvIHRoZSBzcGVjaWZpZWQgbm9kZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCit4cGNfYWN0aXZhdGVfSVJRX3NlbmQodTY0IGFtb3NfcGFnZV9wYSwgaW50IGZyb21fbmFzaWQsIGludCB0b19uYXNpZCwKKwkJCWludCB0b19waHlzX2NwdWlkKQoreworCWludCB3X2luZGV4ID0gWFBDX05BU0lEX1dfSU5ERVgoZnJvbV9uYXNpZCk7CisJaW50IGJfaW5kZXggPSBYUENfTkFTSURfQl9JTkRFWChmcm9tX25hc2lkKTsKKwlBTU9fdCAqYW1vcyA9IChBTU9fdCAqKSBfX3ZhKGFtb3NfcGFnZV9wYSArCisJCQkJKFhQQ19BQ1RJVkFURV9JUlFfQU1PUyAqIHNpemVvZihBTU9fdCkpKTsKKworCisJKHZvaWQpIHhwY19JUElfc2VuZCgmYW1vc1t3X2luZGV4XSwgKDFVTCA8PCBiX2luZGV4KSwgdG9fbmFzaWQsCisJCQkJdG9fcGh5c19jcHVpZCwgU0dJX1hQQ19BQ1RJVkFURSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoreHBjX0lQSV9zZW5kX2FjdGl2YXRlKHN0cnVjdCB4cGNfdmFycyAqdmFycykKK3sKKwl4cGNfYWN0aXZhdGVfSVJRX3NlbmQodmFycy0+YW1vc19wYWdlX3BhLCBjbm9kZWlkX3RvX25hc2lkKDApLAorCQkJCXZhcnMtPmFjdF9uYXNpZCwgdmFycy0+YWN0X3BoeXNfY3B1aWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3hwY19JUElfc2VuZF9hY3RpdmF0ZWQoc3RydWN0IHhwY19wYXJ0aXRpb24gKnBhcnQpCit7CisJeHBjX2FjdGl2YXRlX0lSUV9zZW5kKHBhcnQtPnJlbW90ZV9hbW9zX3BhZ2VfcGEsIGNub2RlaWRfdG9fbmFzaWQoMCksCisJCQlwYXJ0LT5yZW1vdGVfYWN0X25hc2lkLCBwYXJ0LT5yZW1vdGVfYWN0X3BoeXNfY3B1aWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3hwY19JUElfc2VuZF9yZWFjdGl2YXRlKHN0cnVjdCB4cGNfcGFydGl0aW9uICpwYXJ0KQoreworCXhwY19hY3RpdmF0ZV9JUlFfc2VuZCh4cGNfdmFycy0+YW1vc19wYWdlX3BhLCBwYXJ0LT5yZWFjdGl2YXRlX25hc2lkLAorCQkJCXhwY192YXJzLT5hY3RfbmFzaWQsIHhwY192YXJzLT5hY3RfcGh5c19jcHVpZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoreHBjX0lQSV9zZW5kX2Rpc2VuZ2FnZShzdHJ1Y3QgeHBjX3BhcnRpdGlvbiAqcGFydCkKK3sKKwl4cGNfYWN0aXZhdGVfSVJRX3NlbmQocGFydC0+cmVtb3RlX2Ftb3NfcGFnZV9wYSwgY25vZGVpZF90b19uYXNpZCgwKSwKKwkJCXBhcnQtPnJlbW90ZV9hY3RfbmFzaWQsIHBhcnQtPnJlbW90ZV9hY3RfcGh5c19jcHVpZCk7Cit9CisKKworLyoKKyAqIElQSXMgYXNzb2NpYXRlZCB3aXRoIFNHSV9YUENfTk9USUZZIElSUS4KKyAqLworCisvKgorICogU2VuZCBhbiBJUEkgdG8gdGhlIHJlbW90ZSBwYXJ0aXRpb24gdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlCisgKiBzcGVjaWZpZWQgY2hhbm5lbC4KKyAqLworI2RlZmluZSBYUENfTk9USUZZX0lSUV9TRU5EKF9jaCwgX2lwaV9mLCBfaXJxX2YpIFwKKwkJeHBjX25vdGlmeV9JUlFfc2VuZChfY2gsIF9pcGlfZiwgI19pcGlfZiwgX2lycV9mKQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3hwY19ub3RpZnlfSVJRX3NlbmQoc3RydWN0IHhwY19jaGFubmVsICpjaCwgdTggaXBpX2ZsYWcsIGNoYXIgKmlwaV9mbGFnX3N0cmluZywKKwkJCXVuc2lnbmVkIGxvbmcgKmlycV9mbGFncykKK3sKKwlzdHJ1Y3QgeHBjX3BhcnRpdGlvbiAqcGFydCA9ICZ4cGNfcGFydGl0aW9uc1tjaC0+cGFydGlkXTsKKwllbnVtIHhwY19yZXR2YWwgcmV0OworCisKKwlpZiAobGlrZWx5KHBhcnQtPmFjdF9zdGF0ZSAhPSBYUENfUF9ERUFDVElWQVRJTkcpKSB7CisJCXJldCA9IHhwY19JUElfc2VuZChwYXJ0LT5yZW1vdGVfSVBJX2Ftb192YSwKKwkJCQkJKHU2NCkgaXBpX2ZsYWcgPDwgKGNoLT5udW1iZXIgKiA4KSwKKwkJCQkJcGFydC0+cmVtb3RlX0lQSV9uYXNpZCwKKwkJCQkJcGFydC0+cmVtb3RlX0lQSV9waHlzX2NwdWlkLAorCQkJCQlTR0lfWFBDX05PVElGWSk7CisJCWRldl9kYmcoeHBjX2NoYW4sICIlcyBzZW50IHRvIHBhcnRpZD0lZCwgY2hhbm5lbD0lZCwgcmV0PSVkXG4iLAorCQkJaXBpX2ZsYWdfc3RyaW5nLCBjaC0+cGFydGlkLCBjaC0+bnVtYmVyLCByZXQpOworCQlpZiAodW5saWtlbHkocmV0ICE9IHhwY1N1Y2Nlc3MpKSB7CisJCQlpZiAoaXJxX2ZsYWdzICE9IE5VTEwpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+bG9jaywgKmlycV9mbGFncyk7CisJCQl9CisJCQlYUENfREVBQ1RJVkFURV9QQVJUSVRJT04ocGFydCwgcmV0KTsKKwkJCWlmIChpcnFfZmxhZ3MgIT0gTlVMTCkgeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+bG9jaywgKmlycV9mbGFncyk7CisJCQl9CisJCX0KKwl9Cit9CisKKworLyoKKyAqIE1ha2UgaXQgbG9vayBsaWtlIHRoZSByZW1vdGUgcGFydGl0aW9uLCB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlCisgKiBzcGVjaWZpZWQgY2hhbm5lbCwgc2VudCB1cyBhbiBJUEkuIFRoaXMgZmFrZWQgSVBJIHdpbGwgYmUgaGFuZGxlZAorICogYnkgeHBjX2Ryb3BwZWRfSVBJX2NoZWNrKCkuCisgKi8KKyNkZWZpbmUgWFBDX05PVElGWV9JUlFfU0VORF9MT0NBTChfY2gsIF9pcGlfZikgXAorCQl4cGNfbm90aWZ5X0lSUV9zZW5kX2xvY2FsKF9jaCwgX2lwaV9mLCAjX2lwaV9mKQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3hwY19ub3RpZnlfSVJRX3NlbmRfbG9jYWwoc3RydWN0IHhwY19jaGFubmVsICpjaCwgdTggaXBpX2ZsYWcsCisJCQkJY2hhciAqaXBpX2ZsYWdfc3RyaW5nKQoreworCXN0cnVjdCB4cGNfcGFydGl0aW9uICpwYXJ0ID0gJnhwY19wYXJ0aXRpb25zW2NoLT5wYXJ0aWRdOworCisKKwlGRVRDSE9QX1NUT1JFX09QKFRPX0FNTygodTY0KSAmcGFydC0+bG9jYWxfSVBJX2Ftb192YS0+dmFyaWFibGUpLAorCQkJRkVUQ0hPUF9PUiwgKCh1NjQpIGlwaV9mbGFnIDw8IChjaC0+bnVtYmVyICogOCkpKTsKKwlkZXZfZGJnKHhwY19jaGFuLCAiJXMgc2VudCBsb2NhbCBmcm9tIHBhcnRpZD0lZCwgY2hhbm5lbD0lZFxuIiwKKwkJaXBpX2ZsYWdfc3RyaW5nLCBjaC0+cGFydGlkLCBjaC0+bnVtYmVyKTsKK30KKworCisvKgorICogVGhlIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBvZiBJUElzIGluY2x1ZGVzIHRoZSBzZXR0aW5nIG9mIGFuIEFNTyB2YXJpYWJsZQorICogdG8gaW5kaWNhdGUgdGhlIHJlYXNvbiB0aGUgSVBJIHdhcyBzZW50LiBUaGUgNjQtYml0IHZhcmlhYmxlIGlzIGRpdmlkZWQKKyAqIHVwIGludG8gZWlnaHQgYnl0ZXMsIG9yZGVyZWQgZnJvbSByaWdodCB0byBsZWZ0LiBCeXRlIHplcm8gcGVydGFpbnMgdG8KKyAqIGNoYW5uZWwgMCwgYnl0ZSBvbmUgdG8gY2hhbm5lbCAxLCBhbmQgc28gb24uIEVhY2ggYnl0ZSBpcyBkZXNjcmliZWQgYnkKKyAqIHRoZSBmb2xsb3dpbmcgSVBJIGZsYWdzLgorICovCisKKyNkZWZpbmUJWFBDX0lQSV9DTE9TRVJFUVVFU1QJMHgwMQorI2RlZmluZQlYUENfSVBJX0NMT1NFUkVQTFkJMHgwMgorI2RlZmluZQlYUENfSVBJX09QRU5SRVFVRVNUCTB4MDQKKyNkZWZpbmUJWFBDX0lQSV9PUEVOUkVQTFkJMHgwOAorI2RlZmluZQlYUENfSVBJX01TR1JFUVVFU1QJMHgxMAorCisKKy8qIGdpdmVuIGFuIEFNTyB2YXJpYWJsZSBhbmQgYSBjaGFubmVsIywgZ2V0IGl0cyBhc3NvY2lhdGVkIElQSSBmbGFncyAqLworI2RlZmluZSBYUENfR0VUX0lQSV9GTEFHUyhfYW1vLCBfYykJKCh1OCkgKCgoX2FtbykgPj4gKChfYykgKiA4KSkgJiAweGZmKSkKKyNkZWZpbmUgWFBDX1NFVF9JUElfRkxBR1MoX2FtbywgX2MsIF9mKQkoX2FtbykgfD0gKCh1NjQpIChfZikgPDwgKChfYykgKiA4KSkKKworI2RlZmluZQlYUENfQU5ZX09QRU5DTE9TRV9JUElfRkxBR1NfU0VUKF9hbW8pICgoX2FtbykgJiAweDBmMGYwZjBmMGYwZjBmMGYpCisjZGVmaW5lIFhQQ19BTllfTVNHX0lQSV9GTEFHU19TRVQoX2FtbykgICAgICAgKChfYW1vKSAmIDB4MTAxMDEwMTAxMDEwMTAxMCkKKworCitzdGF0aWMgaW5saW5lIHZvaWQKK3hwY19JUElfc2VuZF9jbG9zZXJlcXVlc3Qoc3RydWN0IHhwY19jaGFubmVsICpjaCwgdW5zaWduZWQgbG9uZyAqaXJxX2ZsYWdzKQoreworCXN0cnVjdCB4cGNfb3BlbmNsb3NlX2FyZ3MgKmFyZ3MgPSBjaC0+bG9jYWxfb3BlbmNsb3NlX2FyZ3M7CisKKworCWFyZ3MtPnJlYXNvbiA9IGNoLT5yZWFzb247CisKKwlYUENfTk9USUZZX0lSUV9TRU5EKGNoLCBYUENfSVBJX0NMT1NFUkVRVUVTVCwgaXJxX2ZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit4cGNfSVBJX3NlbmRfY2xvc2VyZXBseShzdHJ1Y3QgeHBjX2NoYW5uZWwgKmNoLCB1bnNpZ25lZCBsb25nICppcnFfZmxhZ3MpCit7CisJWFBDX05PVElGWV9JUlFfU0VORChjaCwgWFBDX0lQSV9DTE9TRVJFUExZLCBpcnFfZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3hwY19JUElfc2VuZF9vcGVucmVxdWVzdChzdHJ1Y3QgeHBjX2NoYW5uZWwgKmNoLCB1bnNpZ25lZCBsb25nICppcnFfZmxhZ3MpCit7CisJc3RydWN0IHhwY19vcGVuY2xvc2VfYXJncyAqYXJncyA9IGNoLT5sb2NhbF9vcGVuY2xvc2VfYXJnczsKKworCisJYXJncy0+bXNnX3NpemUgPSBjaC0+bXNnX3NpemU7CisJYXJncy0+bG9jYWxfbmVudHJpZXMgPSBjaC0+bG9jYWxfbmVudHJpZXM7CisKKwlYUENfTk9USUZZX0lSUV9TRU5EKGNoLCBYUENfSVBJX09QRU5SRVFVRVNULCBpcnFfZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3hwY19JUElfc2VuZF9vcGVucmVwbHkoc3RydWN0IHhwY19jaGFubmVsICpjaCwgdW5zaWduZWQgbG9uZyAqaXJxX2ZsYWdzKQoreworCXN0cnVjdCB4cGNfb3BlbmNsb3NlX2FyZ3MgKmFyZ3MgPSBjaC0+bG9jYWxfb3BlbmNsb3NlX2FyZ3M7CisKKworCWFyZ3MtPnJlbW90ZV9uZW50cmllcyA9IGNoLT5yZW1vdGVfbmVudHJpZXM7CisJYXJncy0+bG9jYWxfbmVudHJpZXMgPSBjaC0+bG9jYWxfbmVudHJpZXM7CisJYXJncy0+bG9jYWxfbXNncXVldWVfcGEgPSBfX3BhKGNoLT5sb2NhbF9tc2dxdWV1ZSk7CisKKwlYUENfTk9USUZZX0lSUV9TRU5EKGNoLCBYUENfSVBJX09QRU5SRVBMWSwgaXJxX2ZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit4cGNfSVBJX3NlbmRfbXNncmVxdWVzdChzdHJ1Y3QgeHBjX2NoYW5uZWwgKmNoKQoreworCVhQQ19OT1RJRllfSVJRX1NFTkQoY2gsIFhQQ19JUElfTVNHUkVRVUVTVCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoreHBjX0lQSV9zZW5kX2xvY2FsX21zZ3JlcXVlc3Qoc3RydWN0IHhwY19jaGFubmVsICpjaCkKK3sKKwlYUENfTk9USUZZX0lSUV9TRU5EX0xPQ0FMKGNoLCBYUENfSVBJX01TR1JFUVVFU1QpOworfQorCisKKy8qCisgKiBNZW1vcnkgZm9yIFhQQydzIEFNTyB2YXJpYWJsZXMgaXMgYWxsb2NhdGVkIGJ5IHRoZSBNU1BFQyBkcml2ZXIuIFRoZXNlCisgKiBwYWdlcyBhcmUgbG9jYXRlZCBpbiB0aGUgbG93ZXN0IGdyYW51bGUuIFRoZSBsb3dlc3QgZ3JhbnVsZSB1c2VzIDRrIHBhZ2VzCisgKiBmb3IgY2FjaGVkIHJlZmVyZW5jZXMgYW5kIGFuIGFsdGVybmF0ZSBUTEIgaGFuZGxlciB0byBuZXZlciBwcm92aWRlIGEKKyAqIGNhY2hlYWJsZSBtYXBwaW5nIGZvciB0aGUgZW50aXJlIHJlZ2lvbi4gVGhpcyB3aWxsIHByZXZlbnQgc3BlY3VsYXRpdmUKKyAqIHJlYWRpbmcgb2YgY2FjaGVkIGNvcGllcyBvZiBvdXIgbGluZXMgZnJvbSBiZWluZyBpc3N1ZWQgd2hpY2ggd2lsbCBjYXVzZQorICogYSBQSSBGU0IgUHJvdG9jb2wgZXJyb3IgdG8gYmUgZ2VuZXJhdGVkIGJ5IHRoZSBTSFVCLiBGb3IgWFBDLCB3ZSBuZWVkIDY0CisgKiBBTU8gdmFyaWFibGVzIChiYXNlZCBvbiBYUF9NQVhfUEFSVElUSU9OUykgZm9yIG1lc3NhZ2Ugbm90aWZpY2F0aW9uIGFuZCBhbgorICogYWRkaXRpb25hbCAxMjggQU1PIHZhcmlhYmxlcyAoYmFzZWQgb24gWFBfTkFTSURfTUFTS19XT1JEUykgZm9yIHBhcnRpdGlvbgorICogYWN0aXZhdGlvbiBhbmQgMiBBTU8gdmFyaWFibGVzIGZvciBwYXJ0aXRpb24gZGVhY3RpdmF0aW9uLgorICovCitzdGF0aWMgaW5saW5lIEFNT190ICoKK3hwY19JUElfaW5pdChpbnQgaW5kZXgpCit7CisJQU1PX3QgKmFtbyA9IHhwY192YXJzLT5hbW9zX3BhZ2UgKyBpbmRleDsKKworCisJKHZvaWQpIHhwY19JUElfcmVjZWl2ZShhbW8pOwkvKiBjbGVhciBBTU8gdmFyaWFibGUgKi8KKwlyZXR1cm4gYW1vOworfQorCisKKworc3RhdGljIGlubGluZSBlbnVtIHhwY19yZXR2YWwKK3hwY19tYXBfYnRlX2Vycm9ycyhidGVfcmVzdWx0X3QgZXJyb3IpCit7CisJc3dpdGNoIChlcnJvcikgeworCWNhc2UgQlRFX1NVQ0NFU1M6CXJldHVybiB4cGNTdWNjZXNzOworCWNhc2UgQlRFRkFJTF9ESVI6CXJldHVybiB4cGNCdGVEaXJlY3RvcnlFcnJvcjsKKwljYXNlIEJURUZBSUxfUE9JU09OOglyZXR1cm4geHBjQnRlUG9pc29uRXJyb3I7CisJY2FzZSBCVEVGQUlMX1dFUlI6CXJldHVybiB4cGNCdGVXcml0ZUVycm9yOworCWNhc2UgQlRFRkFJTF9BQ0NFU1M6CXJldHVybiB4cGNCdGVBY2Nlc3NFcnJvcjsKKwljYXNlIEJURUZBSUxfUFdFUlI6CXJldHVybiB4cGNCdGVQV3JpdGVFcnJvcjsKKwljYXNlIEJURUZBSUxfUFJFUlI6CXJldHVybiB4cGNCdGVQUmVhZEVycm9yOworCWNhc2UgQlRFRkFJTF9UT1VUOglyZXR1cm4geHBjQnRlVGltZU91dEVycm9yOworCWNhc2UgQlRFRkFJTF9YVEVSUjoJcmV0dXJuIHhwY0J0ZVh0YWxrRXJyb3I7CisJY2FzZSBCVEVGQUlMX05PVEFWQUlMOglyZXR1cm4geHBjQnRlTm90QXZhaWxhYmxlOworCWRlZmF1bHQ6CQlyZXR1cm4geHBjQnRlVW5tYXBwZWRFcnJvcjsKKwl9Cit9CisKKworCitzdGF0aWMgaW5saW5lIHZvaWQgKgoreHBjX2ttYWxsb2NfY2FjaGVsaW5lX2FsaWduZWQoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCB2b2lkICoqYmFzZSkKK3sKKwkvKiBzZWUgaWYga21hbGxvYyB3aWxsIGdpdmUgdXMgY2FjaGxpbmUgYWxpZ25lZCBtZW1vcnkgYnkgZGVmYXVsdCAqLworCSpiYXNlID0ga21hbGxvYyhzaXplLCBmbGFncyk7CisJaWYgKCpiYXNlID09IE5VTEwpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICgodTY0KSAqYmFzZSA9PSBMMV9DQUNIRV9BTElHTigodTY0KSAqYmFzZSkpIHsKKwkJcmV0dXJuICpiYXNlOworCX0KKwlrZnJlZSgqYmFzZSk7CisKKwkvKiBub3BlLCB3ZSdsbCBoYXZlIHRvIGRvIGl0IG91cnNlbHZlcyAqLworCSpiYXNlID0ga21hbGxvYyhzaXplICsgTDFfQ0FDSEVfQllURVMsIGZsYWdzKTsKKwlpZiAoKmJhc2UgPT0gTlVMTCkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuICh2b2lkICopIEwxX0NBQ0hFX0FMSUdOKCh1NjQpICpiYXNlKTsKK30KKworCisvKgorICogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGFueSBjaGFubmVsIGFjdGl2aXR5IHRvL2Zyb20gdGhlIHNwZWNpZmllZAorICogcGFydGl0aW9uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3hwY19jaGVja19mb3JfY2hhbm5lbF9hY3Rpdml0eShzdHJ1Y3QgeHBjX3BhcnRpdGlvbiAqcGFydCkKK3sKKwl1NjQgSVBJX2FtbzsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCisJSVBJX2FtbyA9IHhwY19JUElfcmVjZWl2ZShwYXJ0LT5sb2NhbF9JUElfYW1vX3ZhKTsKKwlpZiAoSVBJX2FtbyA9PSAwKSB7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGFydC0+SVBJX2xvY2ssIGlycV9mbGFncyk7CisJcGFydC0+bG9jYWxfSVBJX2FtbyB8PSBJUElfYW1vOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhcnQtPklQSV9sb2NrLCBpcnFfZmxhZ3MpOworCisJZGV2X2RiZyh4cGNfY2hhbiwgInJlY2VpdmVkIElQSSBmcm9tIHBhcnRpZD0lZCwgSVBJX2Ftbz0weCVseFxuIiwKKwkJWFBDX1BBUlRJRChwYXJ0KSwgSVBJX2Ftbyk7CisKKwl4cGNfd2FrZXVwX2NoYW5uZWxfbWdyKHBhcnQpOworfQorCisKKyNlbmRpZiAvKiBfQVNNX0lBNjRfU05fWFBDX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20taWE2NC9zcGlubG9jay5oCmluZGV4IDBjOTFhNzYuLjllODMyMTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NwaW5sb2NrLmgKQEAgLTM0LDcgKzM0LDcgQEAKIHsKIAlyZWdpc3RlciB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKnB0ciBhc20gKCJyMzEiKSA9ICZsb2NrLT5sb2NrOwogCi0jaWYgX19HTlVDX18gPCAzIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fIDwgMykKKyNpZiAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA8IDMpCiAjIGlmZGVmIENPTkZJR19JVEFOSVVNCiAJLyogZG9uJ3QgdXNlIGJybCBvbiBJdGFuaXVtLi4uICovCiAJYXNtIHZvbGF0aWxlICgie1xuXHQiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3N5c3RlbS5oIGIvaW5jbHVkZS9hc20taWE2NC9zeXN0ZW0uaAppbmRleCA2MzUyMzVmLi44MGM1YTIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc3lzdGVtLmgKQEAgLTIxOSwxNCArMjE5LDE0IEBACiAKICNkZWZpbmUgSUE2NF9IQVNfRVhUUkFfU1RBVEUodCkJCQkJCQkJXAogCSgodCktPnRocmVhZC5mbGFncyAmIChJQTY0X1RIUkVBRF9EQkdfVkFMSUR8SUE2NF9USFJFQURfUE1fVkFMSUQpCVwKLQkgfHwgSVNfSUEzMl9QUk9DRVNTKGlhNjRfdGFza19yZWdzKHQpKSB8fCBQRVJGTU9OX0lTX1NZU1dJREUoKSkKKwkgfHwgSVNfSUEzMl9QUk9DRVNTKHRhc2tfcHRfcmVncyh0KSkgfHwgUEVSRk1PTl9JU19TWVNXSURFKCkpCiAKICNkZWZpbmUgX19zd2l0Y2hfdG8ocHJldixuZXh0LGxhc3QpIGRvIHsJCQkJCQkJIFwKIAlpZiAoSUE2NF9IQVNfRVhUUkFfU1RBVEUocHJldikpCQkJCQkJCQkgXAogCQlpYTY0X3NhdmVfZXh0cmEocHJldik7CQkJCQkJCQkgXAogCWlmIChJQTY0X0hBU19FWFRSQV9TVEFURShuZXh0KSkJCQkJCQkJCSBcCiAJCWlhNjRfbG9hZF9leHRyYShuZXh0KTsJCQkJCQkJCSBcCi0JaWE2NF9wc3IoaWE2NF90YXNrX3JlZ3MobmV4dCkpLT5kZmggPSAhaWE2NF9pc19sb2NhbF9mcHVfb3duZXIobmV4dCk7CQkJIFwKKwlpYTY0X3Bzcih0YXNrX3B0X3JlZ3MobmV4dCkpLT5kZmggPSAhaWE2NF9pc19sb2NhbF9mcHVfb3duZXIobmV4dCk7CQkJIFwKIAkobGFzdCkgPSBpYTY0X3N3aXRjaF90bygobmV4dCkpOwkJCQkJCQkgXAogfSB3aGlsZSAoMCkKIApAQCAtMjM4LDggKzIzOCw4IEBACiAgKiB0aGUgbGF0ZXN0IGZwaCBzdGF0ZSBmcm9tIGFub3RoZXIgQ1BVLiAgSW4gb3RoZXIgd29yZHM6IGVhZ2VyIHNhdmUsIGxhenkgcmVzdG9yZS4KICAqLwogIyBkZWZpbmUgc3dpdGNoX3RvKHByZXYsbmV4dCxsYXN0KSBkbyB7CQkJCQkJXAotCWlmIChpYTY0X3BzcihpYTY0X3Rhc2tfcmVncyhwcmV2KSktPm1maCAmJiBpYTY0X2lzX2xvY2FsX2ZwdV9vd25lcihwcmV2KSkgewkJCQlcCi0JCWlhNjRfcHNyKGlhNjRfdGFza19yZWdzKHByZXYpKS0+bWZoID0gMDsJCQlcCisJaWYgKGlhNjRfcHNyKHRhc2tfcHRfcmVncyhwcmV2KSktPm1maCAmJiBpYTY0X2lzX2xvY2FsX2ZwdV9vd25lcihwcmV2KSkgewkJCQlcCisJCWlhNjRfcHNyKHRhc2tfcHRfcmVncyhwcmV2KSktPm1maCA9IDA7CQkJXAogCQkocHJldiktPnRocmVhZC5mbGFncyB8PSBJQTY0X1RIUkVBRF9GUEhfVkFMSUQ7CQkJXAogCQlfX2lhNjRfc2F2ZV9mcHUoKHByZXYpLT50aHJlYWQuZnBoKTsJCQkJXAogCX0JCQkJCQkJCQlcCkBAIC0yNzksNiArMjc5LDcgQEAKICNkZWZpbmUgaWE2NF9wbGF0Zm9ybV9pcyh4KSAoc3RyY21wKHgsIHBsYXRmb3JtX25hbWUpID09IDApCiAKIHZvaWQgY3B1X2lkbGVfd2FpdCh2b2lkKTsKK3ZvaWQgc2NoZWRfY2FjaGVmbHVzaCh2b2lkKTsKIAogI2RlZmluZSBhcmNoX2FsaWduX3N0YWNrKHgpICh4KQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1pYTY0L3RocmVhZF9pbmZvLmgKaW5kZXggMTcxYjIyMC4uMWQ2NTE4ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvdGhyZWFkX2luZm8uaApAQCAtNTcsMTEgKzU3LDIwIEBACiAvKiBob3cgdG8gZ2V0IHRoZSB0aHJlYWQgaW5mb3JtYXRpb24gc3RydWN0IGZyb20gQyAqLwogI2RlZmluZSBjdXJyZW50X3RocmVhZF9pbmZvKCkJKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgKChjaGFyICopIGN1cnJlbnQgKyBJQTY0X1RBU0tfU0laRSkpCiAjZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaykJKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgKChjaGFyICopICh0c2spICsgSUE2NF9UQVNLX1NJWkUpKQorI2RlZmluZSB0YXNrX3RocmVhZF9pbmZvKHRzaykJKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgKChjaGFyICopICh0c2spICsgSUE2NF9UQVNLX1NJWkUpKQogI2Vsc2UKICNkZWZpbmUgY3VycmVudF90aHJlYWRfaW5mbygpCSgoc3RydWN0IHRocmVhZF9pbmZvICopIDApCiAjZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaykJKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgMCkKKyNkZWZpbmUgdGFza190aHJlYWRfaW5mbyh0c2spCSgoc3RydWN0IHRocmVhZF9pbmZvICopIDApCiAjZW5kaWYKICNkZWZpbmUgZnJlZV90aHJlYWRfaW5mbyh0aSkJLyogbm90aGluZyAqLworI2RlZmluZSB0YXNrX3N0YWNrX3BhZ2UodHNrKQkoKHZvaWQgKikodHNrKSkKKworI2RlZmluZSBfX0hBVkVfVEhSRUFEX0ZVTkNUSU9OUworI2RlZmluZSBzZXR1cF90aHJlYWRfc3RhY2socCwgb3JnKSBcCisJKnRhc2tfdGhyZWFkX2luZm8ocCkgPSAqdGFza190aHJlYWRfaW5mbyhvcmcpOyBcCisJdGFza190aHJlYWRfaW5mbyhwKS0+dGFzayA9IChwKTsKKyNkZWZpbmUgZW5kX29mX3N0YWNrKHApICh1bnNpZ25lZCBsb25nICopKCh2b2lkICopKHApICsgSUE2NF9SQlNfT0ZGU0VUKQogCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1RBU0tfU1RSVUNUX0FMTE9DQVRPUgogI2RlZmluZSBhbGxvY190YXNrX3N0cnVjdCgpCSgodGFza190ICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBLRVJORUxfU1RBQ0tfU0laRV9PUkRFUikpCkBAIC04NCw2ICs5Myw3IEBACiAjZGVmaW5lIFRJRl9QT0xMSU5HX05SRkxBRwkxNgkvKiB0cnVlIGlmIHBvbGxfaWRsZSgpIGlzIHBvbGxpbmcgVElGX05FRURfUkVTQ0hFRCAqLwogI2RlZmluZSBUSUZfTUVNRElFCQkxNwogI2RlZmluZSBUSUZfTUNBX0lOSVQJCTE4CS8qIHRoaXMgdGFzayBpcyBwcm9jZXNzaW5nIE1DQSBvciBJTklUICovCisjZGVmaW5lIFRJRl9EQl9ESVNBQkxFRAkJMTkJLyogZGVidWcgdHJhcCBkaXNhYmxlZCBmb3IgZnN5c2NhbGwgKi8KIAogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0UJKDEgPDwgVElGX1NZU0NBTExfVFJBQ0UpCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9BVURJVAkoMSA8PCBUSUZfU1lTQ0FMTF9BVURJVCkKQEAgLTkxLDkgKzEwMSwxMCBAQAogI2RlZmluZSBfVElGX05PVElGWV9SRVNVTUUJKDEgPDwgVElGX05PVElGWV9SRVNVTUUpCiAjZGVmaW5lIF9USUZfU0lHUEVORElORwkJKDEgPDwgVElGX1NJR1BFTkRJTkcpCiAjZGVmaW5lIF9USUZfTkVFRF9SRVNDSEVECSgxIDw8IFRJRl9ORUVEX1JFU0NIRUQpCi0jZGVmaW5lIF9USUZfU0lHREVMQVlFRAkoMSA8PCBUSUZfU0lHREVMQVlFRCkKKyNkZWZpbmUgX1RJRl9TSUdERUxBWUVECQkoMSA8PCBUSUZfU0lHREVMQVlFRCkKICNkZWZpbmUgX1RJRl9QT0xMSU5HX05SRkxBRwkoMSA8PCBUSUZfUE9MTElOR19OUkZMQUcpCiAjZGVmaW5lIF9USUZfTUNBX0lOSVQJCSgxIDw8IFRJRl9NQ0FfSU5JVCkKKyNkZWZpbmUgX1RJRl9EQl9ESVNBQkxFRAkoMSA8PCBUSUZfREJfRElTQUJMRUQpCiAKIC8qICJ3b3JrIHRvIGRvIG9uIHVzZXItcmV0dXJuIiBiaXRzICovCiAjZGVmaW5lIFRJRl9BTExXT1JLX01BU0sJKF9USUZfTk9USUZZX1JFU1VNRXxfVElGX1NJR1BFTkRJTkd8X1RJRl9ORUVEX1JFU0NIRUR8X1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU1lTQ0FMTF9BVURJVHxfVElGX1NJR0RFTEFZRUQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3RvcG9sb2d5LmggYi9pbmNsdWRlL2FzbS1pYTY0L3RvcG9sb2d5LmgKaW5kZXggZjdjMzMwNC4uNDEyZWY4ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC90b3BvbG9neS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvdG9wb2xvZ3kuaApAQCAtMTgsNiArMTgsMTAgQEAKICNpbmNsdWRlIDxhc20vc21wLmg+CiAKICNpZmRlZiBDT05GSUdfTlVNQQorCisvKiBOb2RlcyB3L28gQ1BVcyBhcmUgcHJlZmVycmVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbnMsIHNlZSBidWlsZF96b25lbGlzdHMgKi8KKyNkZWZpbmUgUEVOQUxUWV9GT1JfTk9ERV9XSVRIX0NQVVMgMjU1CisKIC8qCiAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIG5vZGUgY29udGFpbmluZyBDUFUgJ2NwdScKICAqLwpAQCAtNTUsNyArNTksNiBAQAogCS5tYXhfaW50ZXJ2YWwJCT0gNCwJCQlcCiAJLmJ1c3lfZmFjdG9yCQk9IDY0LAkJCVwKIAkuaW1iYWxhbmNlX3BjdAkJPSAxMjUsCQkJXAotCS5jYWNoZV9ob3RfdGltZQkJPSAoMTAqMTAwMDAwMCksCQlcCiAJLnBlcl9jcHVfZ2FpbgkJPSAxMDAsCQkJXAogCS5jYWNoZV9uaWNlX3RyaWVzCT0gMiwJCQlcCiAJLmJ1c3lfaWR4CQk9IDIsCQkJXApAQCAtODEsNyArODQsNiBAQAogCS5tYXhfaW50ZXJ2YWwJCT0gOCoobWluKG51bV9vbmxpbmVfY3B1cygpLCAzMikpLCBcCiAJLmJ1c3lfZmFjdG9yCQk9IDY0LAkJCVwKIAkuaW1iYWxhbmNlX3BjdAkJPSAxMjUsCQkJXAotCS5jYWNoZV9ob3RfdGltZQkJPSAoMTAqMTAwMDAwMCksCQlcCiAJLmNhY2hlX25pY2VfdHJpZXMJPSAyLAkJCVwKIAkuYnVzeV9pZHgJCT0gMywJCQlcCiAJLmlkbGVfaWR4CQk9IDIsCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLWlhNjQvdW5pc3RkLmgKaW5kZXggMmJmNTQzNC4uOTYyZjliZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3VuaXN0ZC5oCkBAIC0yNjksMTIgKzI2OSwxMyBAQAogI2RlZmluZSBfX05SX2lub3RpZnlfaW5pdAkJMTI3NwogI2RlZmluZSBfX05SX2lub3RpZnlfYWRkX3dhdGNoCQkxMjc4CiAjZGVmaW5lIF9fTlJfaW5vdGlmeV9ybV93YXRjaAkJMTI3OQorI2RlZmluZSBfX05SX21pZ3JhdGVfcGFnZXMJCTEyODAKIAogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogCi0jZGVmaW5lIE5SX3N5c2NhbGxzCQkJMjU2IC8qIGxlbmd0aCBvZiBzeXNjYWxsIHRhYmxlICovCisjZGVmaW5lIE5SX3N5c2NhbGxzCQkJMjcwIC8qIGxlbmd0aCBvZiBzeXNjYWxsIHRhYmxlICovCiAKICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1JUX1NJR0FDVElPTgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL2F0b21pYy5oIGIvaW5jbHVkZS9hc20tbTMyci9hdG9taWMuaAppbmRleCA3MDc2MTI3Li4zMTIyZmUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL2F0b21pYy5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvYXRvbWljLmgKQEAgLTI0Myw2ICsyNDMsNyBAQAogI2RlZmluZSBhdG9taWNfYWRkX25lZ2F0aXZlKGksdikgKGF0b21pY19hZGRfcmV0dXJuKChpKSwgKHYpKSA8IDApCiAKICNkZWZpbmUgYXRvbWljX2NtcHhjaGcodiwgbywgbikgKChpbnQpY21weGNoZygmKCh2KS0+Y291bnRlciksIChvKSwgKG4pKSkKKyNkZWZpbmUgYXRvbWljX3hjaGcodiwgbmV3KSAoeGNoZygmKCh2KS0+Y291bnRlciksIG5ldykpCiAKIC8qKgogICogYXRvbWljX2FkZF91bmxlc3MgLSBhZGQgdW5sZXNzIHRoZSBudW1iZXIgaXMgYSBnaXZlbiB2YWx1ZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9jYWNoZS5oIGIvaW5jbHVkZS9hc20tbTMyci9jYWNoZS5oCmluZGV4IDcyNDgyMDUuLjljMmIyZDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvY2FjaGUuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL2NhY2hlLmgKQEAgLTcsNiArNyw0IEBACiAjZGVmaW5lIEwxX0NBQ0hFX1NISUZUCQk0CiAjZGVmaW5lIEwxX0NBQ0hFX0JZVEVTCQkoMSA8PCBMMV9DQUNIRV9TSElGVCkKIAotI2RlZmluZSBMMV9DQUNIRV9TSElGVF9NQVgJNAotCiAjZW5kaWYgIC8qIF9BU01fTTMyUl9DQUNIRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL2Z1dGV4LmggYi9pbmNsdWRlL2FzbS1tMzJyL2Z1dGV4LmgKaW5kZXggOWZlZmY0Y2UuLjZhMzMyYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvZnV0ZXguaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL2Z1dGV4LmgKQEAgLTEsNTMgKzEsNiBAQAogI2lmbmRlZiBfQVNNX0ZVVEVYX0gKICNkZWZpbmUgX0FTTV9GVVRFWF9ICiAKLSNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZnV0ZXguaD4KIAotI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+Ci0jaW5jbHVkZSA8YXNtL2Vycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotc3RhdGljIGlubGluZSBpbnQKLWZ1dGV4X2F0b21pY19vcF9pbnVzZXIgKGludCBlbmNvZGVkX29wLCBpbnQgX191c2VyICp1YWRkcikKLXsKLQlpbnQgb3AgPSAoZW5jb2RlZF9vcCA+PiAyOCkgJiA3OwotCWludCBjbXAgPSAoZW5jb2RlZF9vcCA+PiAyNCkgJiAxNTsKLQlpbnQgb3BhcmcgPSAoZW5jb2RlZF9vcCA8PCA4KSA+PiAyMDsKLQlpbnQgY21wYXJnID0gKGVuY29kZWRfb3AgPDwgMjApID4+IDIwOwotCWludCBvbGR2YWwgPSAwLCByZXQ7Ci0JaWYgKGVuY29kZWRfb3AgJiAoRlVURVhfT1BfT1BBUkdfU0hJRlQgPDwgMjgpKQotCQlvcGFyZyA9IDEgPDwgb3Bhcmc7Ci0KLQlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpbmNfcHJlZW1wdF9jb3VudCgpOwotCi0Jc3dpdGNoIChvcCkgewotCWNhc2UgRlVURVhfT1BfU0VUOgotCWNhc2UgRlVURVhfT1BfQUREOgotCWNhc2UgRlVURVhfT1BfT1I6Ci0JY2FzZSBGVVRFWF9PUF9BTkROOgotCWNhc2UgRlVURVhfT1BfWE9SOgotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FTk9TWVM7Ci0JfQotCi0JZGVjX3ByZWVtcHRfY291bnQoKTsKLQotCWlmICghcmV0KSB7Ci0JCXN3aXRjaCAoY21wKSB7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOwotCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLSNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL2lvY3RsLmggYi9pbmNsdWRlL2FzbS1tMzJyL2lvY3RsLmgKaW5kZXggODdkOGY3ZC4uYjI3OWZlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9pb2N0bC5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvaW9jdGwuaApAQCAtMSw3OCArMSBAQAotI2lmbmRlZiBfQVNNX00zMlJfSU9DVExfSAotI2RlZmluZSBfQVNNX00zMlJfSU9DVExfSAotCi0vKiAkSWQkICovCi0KLS8qIG9yaWcgOiBpMzg2IDIuNC4xOCAqLwotCi0vKgotICogbGludXgvaW9jdGwuaCBmb3IgTGludXggYnkgSC5ILiBCZXJnbWFuLgotICovCi0KLS8qIGlvY3RsIGNvbW1hbmQgZW5jb2Rpbmc6IDMyIGJpdHMgdG90YWwsIGNvbW1hbmQgaW4gbG93ZXIgMTYgYml0cywKLSAqIHNpemUgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgaW4gdGhlIGxvd2VyIDE0IGJpdHMgb2YgdGhlCi0gKiB1cHBlciAxNiBiaXRzLgotICogRW5jb2RpbmcgdGhlIHNpemUgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgaW4gdGhlIGlvY3RsIHJlcXVlc3QKLSAqIGlzIHVzZWZ1bCBmb3IgY2F0Y2hpbmcgcHJvZ3JhbXMgY29tcGlsZWQgd2l0aCBvbGQgdmVyc2lvbnMKLSAqIGFuZCB0byBhdm9pZCBvdmVyd3JpdGluZyB1c2VyIHNwYWNlIG91dHNpZGUgdGhlIHVzZXIgYnVmZmVyIGFyZWEuCi0gKiBUaGUgaGlnaGVzdCAyIGJpdHMgYXJlIHJlc2VydmVkIGZvciBpbmRpY2F0aW5nIHRoZSBgYGFjY2VzcyBtb2RlJycuCi0gKiBOT1RFOiBUaGlzIGxpbWl0cyB0aGUgbWF4IHBhcmFtZXRlciBzaXplIHRvIDE2a0IgLTEgIQotICovCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGlzIGZvciBjb21wYXRpYmlsaXR5IGFjcm9zcyB0aGUgdmFyaW91cyBMaW51eAotICogcGxhdGZvcm1zLiAgVGhlIGkzODYgaW9jdGwgbnVtYmVyaW5nIHNjaGVtZSBkb2Vzbid0IHJlYWxseSBlbmZvcmNlCi0gKiBhIHR5cGUgZmllbGQuICBEZSBmYWN0bywgaG93ZXZlciwgdGhlIHRvcCA4IGJpdHMgb2YgdGhlIGxvd2VyIDE2Ci0gKiBiaXRzIGFyZSBpbmRlZWQgdXNlZCBhcyBhIHR5cGUgZmllbGQsIHNvIHdlIG1pZ2h0IGp1c3QgYXMgd2VsbCBtYWtlCi0gKiB0aGlzIGV4cGxpY2l0IGhlcmUuICBQbGVhc2UgYmUgc3VyZSB0byB1c2UgdGhlIGRlY29kaW5nIG1hY3JvcwotICogYmVsb3cgZnJvbSBub3cgb24uCi0gKi8KLSNkZWZpbmUgX0lPQ19OUkJJVFMJOAotI2RlZmluZSBfSU9DX1RZUEVCSVRTCTgKLSNkZWZpbmUgX0lPQ19TSVpFQklUUwkxNAotI2RlZmluZSBfSU9DX0RJUkJJVFMJMgotCi0jZGVmaW5lIF9JT0NfTlJNQVNLCSgoMSA8PCBfSU9DX05SQklUUyktMSkKLSNkZWZpbmUgX0lPQ19UWVBFTUFTSwkoKDEgPDwgX0lPQ19UWVBFQklUUyktMSkKLSNkZWZpbmUgX0lPQ19TSVpFTUFTSwkoKDEgPDwgX0lPQ19TSVpFQklUUyktMSkKLSNkZWZpbmUgX0lPQ19ESVJNQVNLCSgoMSA8PCBfSU9DX0RJUkJJVFMpLTEpCi0KLSNkZWZpbmUgX0lPQ19OUlNISUZUCTAKLSNkZWZpbmUgX0lPQ19UWVBFU0hJRlQJKF9JT0NfTlJTSElGVCtfSU9DX05SQklUUykKLSNkZWZpbmUgX0lPQ19TSVpFU0hJRlQJKF9JT0NfVFlQRVNISUZUK19JT0NfVFlQRUJJVFMpCi0jZGVmaW5lIF9JT0NfRElSU0hJRlQJKF9JT0NfU0laRVNISUZUK19JT0NfU0laRUJJVFMpCi0KLS8qCi0gKiBEaXJlY3Rpb24gYml0cy4KLSAqLwotI2RlZmluZSBfSU9DX05PTkUJMFUKLSNkZWZpbmUgX0lPQ19XUklURQkxVQotI2RlZmluZSBfSU9DX1JFQUQJMlUKLQotI2RlZmluZSBfSU9DKGRpcix0eXBlLG5yLHNpemUpIFwKLQkoKChkaXIpICA8PCBfSU9DX0RJUlNISUZUKSB8IFwKLQkgKCh0eXBlKSA8PCBfSU9DX1RZUEVTSElGVCkgfCBcCi0JICgobnIpICAgPDwgX0lPQ19OUlNISUZUKSB8IFwKLQkgKChzaXplKSA8PCBfSU9DX1NJWkVTSElGVCkpCi0KLS8qIHVzZWQgdG8gY3JlYXRlIG51bWJlcnMgKi8KLSNkZWZpbmUgX0lPKHR5cGUsbnIpCQlfSU9DKF9JT0NfTk9ORSwodHlwZSksKG5yKSwwKQotI2RlZmluZSBfSU9SKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1JFQUQsKHR5cGUpLChuciksc2l6ZW9mKHNpemUpKQotI2RlZmluZSBfSU9XKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1dSSVRFLCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKLSNkZWZpbmUgX0lPV1IodHlwZSxucixzaXplKQlfSU9DKF9JT0NfUkVBRHxfSU9DX1dSSVRFLCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKLQotLyogdXNlZCB0byBkZWNvZGUgaW9jdGwgbnVtYmVycy4uICovCi0jZGVmaW5lIF9JT0NfRElSKG5yKQkJKCgobnIpID4+IF9JT0NfRElSU0hJRlQpICYgX0lPQ19ESVJNQVNLKQotI2RlZmluZSBfSU9DX1RZUEUobnIpCQkoKChucikgPj4gX0lPQ19UWVBFU0hJRlQpICYgX0lPQ19UWVBFTUFTSykKLSNkZWZpbmUgX0lPQ19OUihucikJCSgoKG5yKSA+PiBfSU9DX05SU0hJRlQpICYgX0lPQ19OUk1BU0spCi0jZGVmaW5lIF9JT0NfU0laRShucikJCSgoKG5yKSA+PiBfSU9DX1NJWkVTSElGVCkgJiBfSU9DX1NJWkVNQVNLKQotCi0vKiAuLi5hbmQgZm9yIHRoZSBkcml2ZXJzL3NvdW5kIGZpbGVzLi4uICovCi0KLSNkZWZpbmUgSU9DX0lOCQkoX0lPQ19XUklURSA8PCBfSU9DX0RJUlNISUZUKQotI2RlZmluZSBJT0NfT1VUCQkoX0lPQ19SRUFEIDw8IF9JT0NfRElSU0hJRlQpCi0jZGVmaW5lIElPQ19JTk9VVAkoKF9JT0NfV1JJVEV8X0lPQ19SRUFEKSA8PCBfSU9DX0RJUlNISUZUKQotI2RlZmluZSBJT0NTSVpFX01BU0sJKF9JT0NfU0laRU1BU0sgPDwgX0lPQ19TSVpFU0hJRlQpCi0jZGVmaW5lIElPQ1NJWkVfU0hJRlQJKF9JT0NfU0laRVNISUZUKQotCi0jZW5kaWYgLyogX0FTTV9NMzJSX0lPQ1RMX0ggKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pb2N0bC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9tdXRleC5oIGIvaW5jbHVkZS9hc20tbTMyci9tdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OGMxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL211dGV4LmgKQEAgLTAsMCArMSw5IEBACisvKgorICogUHVsbCBpbiB0aGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIG11dGV4IGZhc3RwYXRoLgorICoKKyAqIFRPRE86IGltcGxlbWVudCBvcHRpbWl6ZWQgcHJpbWl0aXZlcyBpbnN0ZWFkLCBvciBsZWF2ZSB0aGUgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24gaW4gcGxhY2UsIG9yIHBpY2sgdGhlIGF0b21pY194Y2hnKCkgYmFzZWQgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24uIChzZWUgYXNtLWdlbmVyaWMvbXV0ZXgteGNoZy5oIGZvciBkZXRhaWxzKQorICovCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tdXRleC1kZWMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvcHRyYWNlLmggYi9pbmNsdWRlL2FzbS1tMzJyL3B0cmFjZS5oCmluZGV4IDU1Y2Q3ZWMuLjBkMDU4YjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvcHRyYWNlLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci9wdHJhY2UuaApAQCAtMTYzLDYgKzE2Myw5IEBACiAKIGV4dGVybiB2b2lkIHdpdGhkcmF3X2RlYnVnX3RyYXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCisjZGVmaW5lIHRhc2tfcHRfcmVncyh0YXNrKSBcCisgICAgICAgICgoc3RydWN0IHB0X3JlZ3MgKikodGFza19zdGFja19wYWdlKHRhc2spICsgVEhSRUFEX1NJWkUpIC0gMSkKKwogI2VuZGlmIC8qIF9fS0VSTkVMICovCiAKICNlbmRpZiAvKiBfQVNNX00zMlJfUFRSQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1tMzJyL3N5c3RlbS5oCmluZGV4IGRjZjYxOWEuLjA2YzEyYTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci9zeXN0ZW0uaApAQCAtNjgsNiArNjgsMTYgQEAKIAlsYXN0ID0gX19sYXN0OyBcCiB9IHdoaWxlKDApCiAKKy8qCisgKiBPbiBTTVAgc3lzdGVtcywgd2hlbiB0aGUgc2NoZWR1bGVyIGRvZXMgbWlncmF0aW9uLWNvc3QgYXV0b2RldGVjdGlvbiwKKyAqIGl0IG5lZWRzIGEgd2F5IHRvIGZsdXNoIGFzIG11Y2ggb2YgdGhlIENQVSdzIGNhY2hlcyBhcyBwb3NzaWJsZS4KKyAqCisgKiBUT0RPOiBmaWxsIHRoaXMgaW4hCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZF9jYWNoZWZsdXNoKHZvaWQpCit7Cit9CisKIC8qIEludGVycnVwdCBDb250cm9sICovCiAjaWYgIWRlZmluZWQoQ09ORklHX0NISVBfTTMyMTAyKSAmJiAhZGVmaW5lZChDT05GSUdfQ0hJUF9NMzIxMDQpCiAjZGVmaW5lIGxvY2FsX2lycV9lbmFibGUoKSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1tMzJyL3RocmVhZF9pbmZvLmgKaW5kZXggMGY1ODkzNi4uMjJhZmYzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvdGhyZWFkX2luZm8uaApAQCAtMTEwLDggKzExMCw2IEBACiAjZW5kaWYKIAogI2RlZmluZSBmcmVlX3RocmVhZF9pbmZvKGluZm8pIGtmcmVlKGluZm8pCi0jZGVmaW5lIGdldF90aHJlYWRfaW5mbyh0aSkgZ2V0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCi0jZGVmaW5lIHB1dF90aHJlYWRfaW5mbyh0aSkgcHV0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCiAKICNkZWZpbmUgVElfRkxBR19GQVVMVF9DT0RFX1NISUZUCTI4CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvYW1pZ2Fody5oIGIvaW5jbHVkZS9hc20tbTY4ay9hbWlnYWh3LmgKaW5kZXggM2FlNWQ4ZC4uYTE2ZmU0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9hbWlnYWh3LmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9hbWlnYWh3LmgKQEAgLTI3NCw3ICsyNzQsNyBAQAogI2RlZmluZSBaVFdPX1ZBRERSKHgpICgoKHVuc2lnbmVkIGxvbmcpKHgpKSt6VHdvQmFzZSkKIAogI2RlZmluZSBDVVNUT01fUEhZU0FERFIgICAgICgweGRmZjAwMCkKLSNkZWZpbmUgY3VzdG9tICgoKih2b2xhdGlsZSBzdHJ1Y3QgQ1VTVE9NICopKHpUd29CYXNlK0NVU1RPTV9QSFlTQUREUikpKQorI2RlZmluZSBhbWlnYV9jdXN0b20gKCgqKHZvbGF0aWxlIHN0cnVjdCBDVVNUT00gKikoelR3b0Jhc2UrQ1VTVE9NX1BIWVNBRERSKSkpCiAKICNkZWZpbmUgQ0lBQV9QSFlTQUREUgkgICgweGJmZTAwMSkKICNkZWZpbmUgQ0lBQl9QSFlTQUREUgkgICgweGJmZDAwMCkKQEAgLTI5NCwxMiArMjk0LDEyIEBACiB7CiAJaWYgKGFtaWdhX2NoaXBzZXQgPT0gQ1NfRUNTIHx8IGFtaWdhX2NoaXBzZXQgPT0gQ1NfQUdBKSB7CiAJCS8qIHByb2dyYW0gRGVuaXNlL0xpc2EgZm9yIGEgaGlnaGVyIG1heGltdW0gcGxheSByYXRlICovCi0JCWN1c3RvbS5odG90YWwgPSAxMTM7ICAgICAgICAvKiAzMSBrSHogKi8KLQkJY3VzdG9tLnZ0b3RhbCA9IDIyMzsgICAgICAgIC8qIDcwIEh6ICovCi0JCWN1c3RvbS5iZWFtY29uMCA9IDB4NDM5MDsgICAvKiBIQVJERElTLCBWQVJ7QkVBTSxWU1ksSFNZLENTWX1FTiAqLworCQlhbWlnYV9jdXN0b20uaHRvdGFsID0gMTEzOyAgICAgICAgLyogMzEga0h6ICovCisJCWFtaWdhX2N1c3RvbS52dG90YWwgPSAyMjM7ICAgICAgICAvKiA3MCBIeiAqLworCQlhbWlnYV9jdXN0b20uYmVhbWNvbjAgPSAweDQzOTA7ICAgLyogSEFSRERJUywgVkFSe0JFQU0sVlNZLEhTWSxDU1l9RU4gKi8KIAkJLyogc3VzcGVuZCB0aGUgbW9uaXRvciAqLwotCQljdXN0b20uaHNzdHJ0ID0gY3VzdG9tLmhzc3RvcCA9IDExNjsKLQkJY3VzdG9tLnZzc3RydCA9IGN1c3RvbS52c3N0b3AgPSAyMjY7CisJCWFtaWdhX2N1c3RvbS5oc3N0cnQgPSBhbWlnYV9jdXN0b20uaHNzdG9wID0gMTE2OworCQlhbWlnYV9jdXN0b20udnNzdHJ0ID0gYW1pZ2FfY3VzdG9tLnZzc3RvcCA9IDIyNjsKIAkJYW1pZ2FfYXVkaW9fbWluX3BlcmlvZCA9IDU3OwogCX0KIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvYW1pZ2FpbnRzLmggYi9pbmNsdWRlL2FzbS1tNjhrL2FtaWdhaW50cy5oCmluZGV4IDJhZmY0Y2YuLmFhOTY4ZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvYW1pZ2FpbnRzLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9hbWlnYWludHMuaApAQCAtMTA5LDggKzEwOSw2IEBACiBleHRlcm4gdm9pZCBhbWlnYV9kb19pcnEoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKIGV4dGVybiB2b2lkIGFtaWdhX2RvX2lycV9saXN0KGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpmcCk7CiAKLWV4dGVybiB1bnNpZ25lZCBzaG9ydCBhbWlnYV9pbnRlbmFfdmFsc1tdOwotCiAvKiBDSUEgaW50ZXJydXB0IGNvbnRyb2wgcmVnaXN0ZXIgYml0cyAqLwogCiAjZGVmaW5lIENJQV9JQ1JfVEEJMHgwMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLW02OGsvYXRvbWljLmgKaW5kZXggYjhhNGU3NS4uYTRhODRkNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL2F0b21pYy5oCkBAIC0xNDAsNiArMTQwLDcgQEAKIH0KIAogI2RlZmluZSBhdG9taWNfY21weGNoZyh2LCBvLCBuKSAoKGludCljbXB4Y2hnKCYoKHYpLT5jb3VudGVyKSwgKG8pLCAobikpKQorI2RlZmluZSBhdG9taWNfeGNoZyh2LCBuZXcpICh4Y2hnKCYoKHYpLT5jb3VudGVyKSwgbmV3KSkKIAogI2RlZmluZSBhdG9taWNfYWRkX3VubGVzcyh2LCBhLCB1KQkJCQlcCiAoewkJCQkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9jYWNoZS5oIGIvaW5jbHVkZS9hc20tbTY4ay9jYWNoZS5oCmluZGV4IDYxNjFmZDMuLmZlZDNmZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvY2FjaGUuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL2NhY2hlLmgKQEAgLTgsNiArOCw0IEBACiAjZGVmaW5lICAgICAgICBMMV9DQUNIRV9TSElGVCAgNAogI2RlZmluZSAgICAgICAgTDFfQ0FDSEVfQllURVMgICgxPDwgTDFfQ0FDSEVfU0hJRlQpCiAKLSNkZWZpbmUgTDFfQ0FDSEVfU0hJRlRfTUFYIDQJLyogbGFyZ2VzdCBMMSB3aGljaCB0aGlzIGFyY2ggc3VwcG9ydHMgKi8KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1tNjhrL2NoZWNrc3VtLmgKaW5kZXggNzg4NjBjMi4uMTcyODBlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvY2hlY2tzdW0uaApAQCAtMjUsNyArMjUsNyBAQAogICogYmV0dGVyIDY0LWJpdCkgYm91bmRhcnkKICAqLwogCi1leHRlcm4gdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsCitleHRlcm4gdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqc3JjLAogCQkJCQkJdW5zaWduZWQgY2hhciAqZHN0LAogCQkJCQkJaW50IGxlbiwgaW50IHN1bSwKIAkJCQkJCWludCAqY3N1bV9lcnIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9kc3A1NmsuaCBiL2luY2x1ZGUvYXNtLW02OGsvZHNwNTZrLmgKaW5kZXggYWIzZGQzMy4uMmQ4YzBjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9kc3A1NmsuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL2RzcDU2ay5oCkBAIC0xMyw3ICsxMyw3IEBACiAvKiBVc2VkIGZvciB1cGxvYWRpbmcgRFNQIGJpbmFyeSBjb2RlICovCiBzdHJ1Y3QgZHNwNTZrX3VwbG9hZCB7CiAJaW50IGxlbjsKLQljaGFyICpiaW47CisJY2hhciBfX3VzZXIgKmJpbjsKIH07CiAKIC8qIEZvciB0aGUgRFNQIGhvc3QgZmxhZ3MgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvZmxvcHB5LmggYi9pbmNsdWRlL2FzbS1tNjhrL2Zsb3BweS5oCmluZGV4IGM2ZTcwOGQuLjYzYTA1ZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvZmxvcHB5LmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9mbG9wcHkuaApAQCAtNDYsNyArNDYsNyBAQAogCiBzdGF0aWMgaW50IHZpcnR1YWxfZG1hX2NvdW50PTA7CiBzdGF0aWMgaW50IHZpcnR1YWxfZG1hX3Jlc2lkdWU9MDsKLXN0YXRpYyBjaGFyICp2aXJ0dWFsX2RtYV9hZGRyPTA7CitzdGF0aWMgY2hhciAqdmlydHVhbF9kbWFfYWRkcj1OVUxMOwogc3RhdGljIGludCB2aXJ0dWFsX2RtYV9tb2RlPTA7CiBzdGF0aWMgaW50IGRvaW5nX3BkbWE9MDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9mdXRleC5oIGIvaW5jbHVkZS9hc20tbTY4ay9mdXRleC5oCmluZGV4IDlmZWZmNGNlLi42YTMzMmE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2Z1dGV4LmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9mdXRleC5oCkBAIC0xLDUzICsxLDYgQEAKICNpZm5kZWYgX0FTTV9GVVRFWF9ICiAjZGVmaW5lIF9BU01fRlVURVhfSAogCi0jaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2Z1dGV4Lmg+CiAKLSNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1mdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCi17Ci0JaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKLQlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7Ci0JaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7Ci0JaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKLQlpbnQgb2xkdmFsID0gMCwgcmV0OwotCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKLQkJb3BhcmcgPSAxIDw8IG9wYXJnOwotCi0JaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaW5jX3ByZWVtcHRfY291bnQoKTsKLQotCXN3aXRjaCAob3ApIHsKLQljYXNlIEZVVEVYX09QX1NFVDoKLQljYXNlIEZVVEVYX09QX0FERDoKLQljYXNlIEZVVEVYX09QX09SOgotCWNhc2UgRlVURVhfT1BfQU5ETjoKLQljYXNlIEZVVEVYX09QX1hPUjoKLQlkZWZhdWx0OgotCQlyZXQgPSAtRU5PU1lTOwotCX0KLQotCWRlY19wcmVlbXB0X2NvdW50KCk7Ci0KLQlpZiAoIXJldCkgewotCQlzd2l0Y2ggKGNtcCkgewotCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKLQkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0jZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9oYXJkaXJxLmggYi9pbmNsdWRlL2FzbS1tNjhrL2hhcmRpcnEuaAppbmRleCA3MjgzMThiLi41ZTFjNTgyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9oYXJkaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9oYXJkaXJxLmgKQEAgLTE0LDEzICsxNCw0IEBACiAKICNkZWZpbmUgSEFSRElSUV9CSVRTCTgKIAotLyoKLSAqIFRoZSBoYXJkaXJxIG1hc2sgaGFzIHRvIGJlIGxhcmdlIGVub3VnaCB0byBoYXZlCi0gKiBzcGFjZSBmb3IgcG90ZW50aWFsbHkgYWxsIElSUSBzb3VyY2VzIGluIHRoZSBzeXN0ZW0KLSAqIG5lc3Rpbmcgb24gYSBzaW5nbGUgQ1BVOgotICovCi0jaWYgKDEgPDwgSEFSRElSUV9CSVRTKSA8IE5SX0lSUVMKLSMgZXJyb3IgSEFSRElSUV9CSVRTIGlzIHRvbyBsb3chCi0jZW5kaWYKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2lvLmggYi9pbmNsdWRlL2FzbS1tNjhrL2lvLmgKaW5kZXggNmJiOGIwZC4uZGNmYWEzNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9pby5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvaW8uaApAQCAtMjQsNiArMjQsNyBAQAogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8YXNtL3Jhd19pby5oPgogI2luY2x1ZGUgPGFzbS92aXJ0Y29udmVydC5oPgogCkBAIC0xMjAsNjggKzEyMSw2OCBAQAogICogYmUgY29tcGlsZWQgaW4gc28gdGhlIGNhc2Ugc3RhdGVtZW50IHdpbGwgYmUgb3B0aW1pc2VkIGF3YXkKICAqLwogCi1zdGF0aWMgaW5saW5lIHU4ICppc2FfaXRiKHVuc2lnbmVkIGxvbmcgYWRkcikKK3N0YXRpYyBpbmxpbmUgdTggX19pb21lbSAqaXNhX2l0Yih1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAgIHN3aXRjaChJU0FfVFlQRSkKICAgICB7CiAjaWZkZWYgQ09ORklHX1E0MAotICAgIGNhc2UgUTQwX0lTQTogcmV0dXJuICh1OCAqKVE0MF9JU0FfSU9fQihhZGRyKTsKKyAgICBjYXNlIFE0MF9JU0E6IHJldHVybiAodTggX19pb21lbSAqKVE0MF9JU0FfSU9fQihhZGRyKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19HRzIKLSAgICBjYXNlIEdHMl9JU0E6IHJldHVybiAodTggKilHRzJfSVNBX0lPX0IoYWRkcik7CisgICAgY2FzZSBHRzJfSVNBOiByZXR1cm4gKHU4IF9faW9tZW0gKilHRzJfSVNBX0lPX0IoYWRkcik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQU1JR0FfUENNQ0lBCi0gICAgY2FzZSBBR19JU0E6IHJldHVybiAodTggKilBR19JU0FfSU9fQihhZGRyKTsKKyAgICBjYXNlIEFHX0lTQTogcmV0dXJuICh1OCBfX2lvbWVtICopQUdfSVNBX0lPX0IoYWRkcik7CiAjZW5kaWYKLSAgICBkZWZhdWx0OiByZXR1cm4gMDsgLyogYXZvaWQgd2FybmluZ3MsIGp1c3QgaW4gY2FzZSAqLworICAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOyAvKiBhdm9pZCB3YXJuaW5ncywganVzdCBpbiBjYXNlICovCiAgICAgfQogfQotc3RhdGljIGlubGluZSB1MTYgKmlzYV9pdHcodW5zaWduZWQgbG9uZyBhZGRyKQorc3RhdGljIGlubGluZSB1MTYgX19pb21lbSAqaXNhX2l0dyh1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAgIHN3aXRjaChJU0FfVFlQRSkKICAgICB7CiAjaWZkZWYgQ09ORklHX1E0MAotICAgIGNhc2UgUTQwX0lTQTogcmV0dXJuICh1MTYgKilRNDBfSVNBX0lPX1coYWRkcik7CisgICAgY2FzZSBRNDBfSVNBOiByZXR1cm4gKHUxNiBfX2lvbWVtICopUTQwX0lTQV9JT19XKGFkZHIpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0dHMgotICAgIGNhc2UgR0cyX0lTQTogcmV0dXJuICh1MTYgKilHRzJfSVNBX0lPX1coYWRkcik7CisgICAgY2FzZSBHRzJfSVNBOiByZXR1cm4gKHUxNiBfX2lvbWVtICopR0cyX0lTQV9JT19XKGFkZHIpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0FNSUdBX1BDTUNJQQotICAgIGNhc2UgQUdfSVNBOiByZXR1cm4gKHUxNiAqKUFHX0lTQV9JT19XKGFkZHIpOworICAgIGNhc2UgQUdfSVNBOiByZXR1cm4gKHUxNiBfX2lvbWVtICopQUdfSVNBX0lPX1coYWRkcik7CiAjZW5kaWYKLSAgICBkZWZhdWx0OiByZXR1cm4gMDsgLyogYXZvaWQgd2FybmluZ3MsIGp1c3QgaW4gY2FzZSAqLworICAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOyAvKiBhdm9pZCB3YXJuaW5ncywganVzdCBpbiBjYXNlICovCiAgICAgfQogfQotc3RhdGljIGlubGluZSB1OCAqaXNhX210Yih1bnNpZ25lZCBsb25nIGFkZHIpCitzdGF0aWMgaW5saW5lIHU4IF9faW9tZW0gKmlzYV9tdGIodW5zaWduZWQgbG9uZyBhZGRyKQogewogICBzd2l0Y2goSVNBX1RZUEUpCiAgICAgewogI2lmZGVmIENPTkZJR19RNDAKLSAgICBjYXNlIFE0MF9JU0E6IHJldHVybiAodTggKilRNDBfSVNBX01FTV9CKGFkZHIpOworICAgIGNhc2UgUTQwX0lTQTogcmV0dXJuICh1OCBfX2lvbWVtICopUTQwX0lTQV9NRU1fQihhZGRyKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19HRzIKLSAgICBjYXNlIEdHMl9JU0E6IHJldHVybiAodTggKilHRzJfSVNBX01FTV9CKGFkZHIpOworICAgIGNhc2UgR0cyX0lTQTogcmV0dXJuICh1OCBfX2lvbWVtICopR0cyX0lTQV9NRU1fQihhZGRyKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19BTUlHQV9QQ01DSUEKLSAgICBjYXNlIEFHX0lTQTogcmV0dXJuICh1OCAqKWFkZHI7CisgICAgY2FzZSBBR19JU0E6IHJldHVybiAodTggX19pb21lbSAqKWFkZHI7CiAjZW5kaWYKLSAgICBkZWZhdWx0OiByZXR1cm4gMDsgLyogYXZvaWQgd2FybmluZ3MsIGp1c3QgaW4gY2FzZSAqLworICAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOyAvKiBhdm9pZCB3YXJuaW5ncywganVzdCBpbiBjYXNlICovCiAgICAgfQogfQotc3RhdGljIGlubGluZSB1MTYgKmlzYV9tdHcodW5zaWduZWQgbG9uZyBhZGRyKQorc3RhdGljIGlubGluZSB1MTYgX19pb21lbSAqaXNhX210dyh1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAgIHN3aXRjaChJU0FfVFlQRSkKICAgICB7CiAjaWZkZWYgQ09ORklHX1E0MAotICAgIGNhc2UgUTQwX0lTQTogcmV0dXJuICh1MTYgKilRNDBfSVNBX01FTV9XKGFkZHIpOworICAgIGNhc2UgUTQwX0lTQTogcmV0dXJuICh1MTYgX19pb21lbSAqKVE0MF9JU0FfTUVNX1coYWRkcik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfR0cyCi0gICAgY2FzZSBHRzJfSVNBOiByZXR1cm4gKHUxNiAqKUdHMl9JU0FfTUVNX1coYWRkcik7CisgICAgY2FzZSBHRzJfSVNBOiByZXR1cm4gKHUxNiBfX2lvbWVtICopR0cyX0lTQV9NRU1fVyhhZGRyKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19BTUlHQV9QQ01DSUEKLSAgICBjYXNlIEFHX0lTQTogcmV0dXJuICh1MTYgKilhZGRyOworICAgIGNhc2UgQUdfSVNBOiByZXR1cm4gKHUxNiBfX2lvbWVtICopYWRkcjsKICNlbmRpZgotICAgIGRlZmF1bHQ6IHJldHVybiAwOyAvKiBhdm9pZCB3YXJuaW5ncywganVzdCBpbiBjYXNlICovCisgICAgZGVmYXVsdDogcmV0dXJuIE5VTEw7IC8qIGF2b2lkIHdhcm5pbmdzLCBqdXN0IGluIGNhc2UgKi8KICAgICB9CiB9CiAKQEAgLTMyNiwyMCArMzI3LDIwIEBACiAKICNkZWZpbmUgbW1pb3diKCkKIAotc3RhdGljIGlubGluZSB2b2lkICppb3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICppb3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlyZXR1cm4gX19pb3JlbWFwKHBoeXNhZGRyLCBzaXplLCBJT01BUF9OT0NBQ0hFX1NFUik7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgKmlvcmVtYXBfbm9jYWNoZSh1bnNpZ25lZCBsb25nIHBoeXNhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqaW9yZW1hcF9ub2NhY2hlKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlyZXR1cm4gX19pb3JlbWFwKHBoeXNhZGRyLCBzaXplLCBJT01BUF9OT0NBQ0hFX1NFUik7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgKmlvcmVtYXBfd3JpdGV0aHJvdWdoKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqaW9yZW1hcF93cml0ZXRocm91Z2godW5zaWduZWQgbG9uZyBwaHlzYWRkciwKIAkJCQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlyZXR1cm4gX19pb3JlbWFwKHBoeXNhZGRyLCBzaXplLCBJT01BUF9XUklURVRIUk9VR0gpOwogfQotc3RhdGljIGlubGluZSB2b2lkICppb3JlbWFwX2Z1bGxjYWNoZSh1bnNpZ25lZCBsb25nIHBoeXNhZGRyLAorc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKmlvcmVtYXBfZnVsbGNhY2hlKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsCiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXJldHVybiBfX2lvcmVtYXAocGh5c2FkZHIsIHNpemUsIElPTUFQX0ZVTExfQ0FDSElORyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2lvY3RsLmggYi9pbmNsdWRlL2FzbS1tNjhrL2lvY3RsLmgKaW5kZXggZmQ2ODkxNC4uYjI3OWZlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9pb2N0bC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvaW9jdGwuaApAQCAtMSw4MCArMSBAQAotLyogJElkOiBpb2N0bC5oLHYgMS4zIDE5OTcvMDQvMTYgMTU6MTA6MDcgamVzIEV4cCAkCi0gKgotICogbGludXgvaW9jdGwuaCBmb3IgTGludXggYnkgSC5ILiBCZXJnbWFuLgotICovCi0KLSNpZm5kZWYgX002OEtfSU9DVExfSAotI2RlZmluZSBfTTY4S19JT0NUTF9ICi0KLS8qIGlvY3RsIGNvbW1hbmQgZW5jb2Rpbmc6IDMyIGJpdHMgdG90YWwsIGNvbW1hbmQgaW4gbG93ZXIgMTYgYml0cywKLSAqIHNpemUgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgaW4gdGhlIGxvd2VyIDE0IGJpdHMgb2YgdGhlCi0gKiB1cHBlciAxNiBiaXRzLgotICogRW5jb2RpbmcgdGhlIHNpemUgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgaW4gdGhlIGlvY3RsIHJlcXVlc3QKLSAqIGlzIHVzZWZ1bCBmb3IgY2F0Y2hpbmcgcHJvZ3JhbXMgY29tcGlsZWQgd2l0aCBvbGQgdmVyc2lvbnMKLSAqIGFuZCB0byBhdm9pZCBvdmVyd3JpdGluZyB1c2VyIHNwYWNlIG91dHNpZGUgdGhlIHVzZXIgYnVmZmVyIGFyZWEuCi0gKiBUaGUgaGlnaGVzdCAyIGJpdHMgYXJlIHJlc2VydmVkIGZvciBpbmRpY2F0aW5nIHRoZSBgYGFjY2VzcyBtb2RlJycuCi0gKiBOT1RFOiBUaGlzIGxpbWl0cyB0aGUgbWF4IHBhcmFtZXRlciBzaXplIHRvIDE2a0IgLTEgIQotICovCi0KLS8qCi0gKiBJIGRvbid0IHJlYWxseSBoYXZlIGFueSBpZGVhIGFib3V0IHdoYXQgdGhpcyBzaG91bGQgbG9vayBsaWtlLCBzbwotICogZm9yIHRoZSB0aW1lIGJlaW5nLCB0aGlzIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIFBDIGRlZmluaXRpb25zLgotICovCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGlzIGZvciBjb21wYXRpYmlsaXR5IGFjcm9zcyB0aGUgdmFyaW91cyBMaW51eAotICogcGxhdGZvcm1zLiAgVGhlIGkzODYgaW9jdGwgbnVtYmVyaW5nIHNjaGVtZSBkb2Vzbid0IHJlYWxseSBlbmZvcmNlCi0gKiBhIHR5cGUgZmllbGQuICBEZSBmYWN0bywgaG93ZXZlciwgdGhlIHRvcCA4IGJpdHMgb2YgdGhlIGxvd2VyIDE2Ci0gKiBiaXRzIGFyZSBpbmRlZWQgdXNlZCBhcyBhIHR5cGUgZmllbGQsIHNvIHdlIG1pZ2h0IGp1c3QgYXMgd2VsbCBtYWtlCi0gKiB0aGlzIGV4cGxpY2l0IGhlcmUuICBQbGVhc2UgYmUgc3VyZSB0byB1c2UgdGhlIGRlY29kaW5nIG1hY3JvcwotICogYmVsb3cgZnJvbSBub3cgb24uCi0gKi8KLSNkZWZpbmUgX0lPQ19OUkJJVFMJOAotI2RlZmluZSBfSU9DX1RZUEVCSVRTCTgKLSNkZWZpbmUgX0lPQ19TSVpFQklUUwkxNAotI2RlZmluZSBfSU9DX0RJUkJJVFMJMgotCi0jZGVmaW5lIF9JT0NfTlJNQVNLCSgoMSA8PCBfSU9DX05SQklUUyktMSkKLSNkZWZpbmUgX0lPQ19UWVBFTUFTSwkoKDEgPDwgX0lPQ19UWVBFQklUUyktMSkKLSNkZWZpbmUgX0lPQ19TSVpFTUFTSwkoKDEgPDwgX0lPQ19TSVpFQklUUyktMSkKLSNkZWZpbmUgX0lPQ19ESVJNQVNLCSgoMSA8PCBfSU9DX0RJUkJJVFMpLTEpCi0KLSNkZWZpbmUgX0lPQ19OUlNISUZUCTAKLSNkZWZpbmUgX0lPQ19UWVBFU0hJRlQJKF9JT0NfTlJTSElGVCtfSU9DX05SQklUUykKLSNkZWZpbmUgX0lPQ19TSVpFU0hJRlQJKF9JT0NfVFlQRVNISUZUK19JT0NfVFlQRUJJVFMpCi0jZGVmaW5lIF9JT0NfRElSU0hJRlQJKF9JT0NfU0laRVNISUZUK19JT0NfU0laRUJJVFMpCi0KLS8qCi0gKiBEaXJlY3Rpb24gYml0cy4KLSAqLwotI2RlZmluZSBfSU9DX05PTkUJMFUKLSNkZWZpbmUgX0lPQ19XUklURQkxVQotI2RlZmluZSBfSU9DX1JFQUQJMlUKLQotI2RlZmluZSBfSU9DKGRpcix0eXBlLG5yLHNpemUpIFwKLQkoKChkaXIpICA8PCBfSU9DX0RJUlNISUZUKSB8IFwKLQkgKCh0eXBlKSA8PCBfSU9DX1RZUEVTSElGVCkgfCBcCi0JICgobnIpICAgPDwgX0lPQ19OUlNISUZUKSB8IFwKLQkgKChzaXplKSA8PCBfSU9DX1NJWkVTSElGVCkpCi0KLS8qIHVzZWQgdG8gY3JlYXRlIG51bWJlcnMgKi8KLSNkZWZpbmUgX0lPKHR5cGUsbnIpCQlfSU9DKF9JT0NfTk9ORSwodHlwZSksKG5yKSwwKQotI2RlZmluZSBfSU9SKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1JFQUQsKHR5cGUpLChuciksc2l6ZW9mKHNpemUpKQotI2RlZmluZSBfSU9XKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1dSSVRFLCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKLSNkZWZpbmUgX0lPV1IodHlwZSxucixzaXplKQlfSU9DKF9JT0NfUkVBRHxfSU9DX1dSSVRFLCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKLQotLyogdXNlZCB0byBkZWNvZGUgaW9jdGwgbnVtYmVycy4uICovCi0jZGVmaW5lIF9JT0NfRElSKG5yKQkJKCgobnIpID4+IF9JT0NfRElSU0hJRlQpICYgX0lPQ19ESVJNQVNLKQotI2RlZmluZSBfSU9DX1RZUEUobnIpCQkoKChucikgPj4gX0lPQ19UWVBFU0hJRlQpICYgX0lPQ19UWVBFTUFTSykKLSNkZWZpbmUgX0lPQ19OUihucikJCSgoKG5yKSA+PiBfSU9DX05SU0hJRlQpICYgX0lPQ19OUk1BU0spCi0jZGVmaW5lIF9JT0NfU0laRShucikJCSgoKG5yKSA+PiBfSU9DX1NJWkVTSElGVCkgJiBfSU9DX1NJWkVNQVNLKQotCi0vKiAuLi5hbmQgZm9yIHRoZSBkcml2ZXJzL3NvdW5kIGZpbGVzLi4uICovCi0KLSNkZWZpbmUgSU9DX0lOCQkoX0lPQ19XUklURSA8PCBfSU9DX0RJUlNISUZUKQotI2RlZmluZSBJT0NfT1VUCQkoX0lPQ19SRUFEIDw8IF9JT0NfRElSU0hJRlQpCi0jZGVmaW5lIElPQ19JTk9VVAkoKF9JT0NfV1JJVEV8X0lPQ19SRUFEKSA8PCBfSU9DX0RJUlNISUZUKQotI2RlZmluZSBJT0NTSVpFX01BU0sJKF9JT0NfU0laRU1BU0sgPDwgX0lPQ19TSVpFU0hJRlQpCi0jZGVmaW5lIElPQ1NJWkVfU0hJRlQJKF9JT0NfU0laRVNISUZUKQotCi0jZW5kaWYgLyogX002OEtfSU9DVExfSCAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2lvY3RsLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2lycS5oIGIvaW5jbHVkZS9hc20tbTY4ay9pcnEuaAppbmRleCAxMjdhZDE5Li4zMjVjODZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvaXJxLmgKQEAgLTIzLDYgKzIzLDE1IEBACiAjZW5kaWYKIAogLyoKKyAqIFRoZSBoYXJkaXJxIG1hc2sgaGFzIHRvIGJlIGxhcmdlIGVub3VnaCB0byBoYXZlCisgKiBzcGFjZSBmb3IgcG90ZW50aWFsbHkgYWxsIElSUSBzb3VyY2VzIGluIHRoZSBzeXN0ZW0KKyAqIG5lc3Rpbmcgb24gYSBzaW5nbGUgQ1BVOgorICovCisjaWYgKDEgPDwgSEFSRElSUV9CSVRTKSA8IE5SX0lSUVMKKyMgZXJyb3IgSEFSRElSUV9CSVRTIGlzIHRvbyBsb3chCisjZW5kaWYKKworLyoKICAqIEludGVycnVwdCBzb3VyY2UgZGVmaW5pdGlvbnMKICAqIEdlbmVyYWwgaW50ZXJydXB0IHNvdXJjZXMgYXJlIHRoZSBsZXZlbCAxLTcuCiAgKiBBZGRpbmcgYW4gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3Igb25lIG9mIHRoZXNlIHNvdXJjZXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvbWFjaGRlcC5oIGIvaW5jbHVkZS9hc20tbTY4ay9tYWNoZGVwLmgKaW5kZXggYTBkZDVjNC4uN2QzZmVlMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9tYWNoZGVwLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9tYWNoZGVwLmgKQEAgLTM0LDcgKzM0LDYgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nICgqbWFjaF9oZF9pbml0KSAodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gdm9pZCAoKm1hY2hfaGRfc2V0dXApKGNoYXIgKiwgaW50ICopOwogZXh0ZXJuIGxvbmcgbWFjaF9tYXhfZG1hX2FkZHJlc3M7Ci1leHRlcm4gdm9pZCAoKm1hY2hfZmxvcHB5X3NldHVwKShjaGFyICosIGludCAqKTsKIGV4dGVybiB2b2lkICgqbWFjaF9oZWFydGJlYXQpIChpbnQpOwogZXh0ZXJuIHZvaWQgKCptYWNoX2wyX2ZsdXNoKSAoaW50KTsKIGV4dGVybiB2b2lkICgqbWFjaF9iZWVwKSAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9tdXRleC5oIGIvaW5jbHVkZS9hc20tbTY4ay9tdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OGMxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL211dGV4LmgKQEAgLTAsMCArMSw5IEBACisvKgorICogUHVsbCBpbiB0aGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIG11dGV4IGZhc3RwYXRoLgorICoKKyAqIFRPRE86IGltcGxlbWVudCBvcHRpbWl6ZWQgcHJpbWl0aXZlcyBpbnN0ZWFkLCBvciBsZWF2ZSB0aGUgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24gaW4gcGxhY2UsIG9yIHBpY2sgdGhlIGF0b21pY194Y2hnKCkgYmFzZWQgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24uIChzZWUgYXNtLWdlbmVyaWMvbXV0ZXgteGNoZy5oIGZvciBkZXRhaWxzKQorICovCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tdXRleC1kZWMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvcmF3X2lvLmggYi9pbmNsdWRlL2FzbS1tNjhrL3Jhd19pby5oCmluZGV4IDA0MWYwYTguLjU0MzliY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvcmF3X2lvLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9yYXdfaW8uaApAQCAtMTksOSArMTksOSBAQAogI2RlZmluZSBJT01BUF9OT0NBQ0hFX05PTlNFUgkJMgogI2RlZmluZSBJT01BUF9XUklURVRIUk9VR0gJCTMKIAotZXh0ZXJuIHZvaWQgaW91bm1hcCh2b2lkICphZGRyKTsKK2V4dGVybiB2b2lkIGlvdW5tYXAodm9pZCBfX2lvbWVtICphZGRyKTsKIAotZXh0ZXJuIHZvaWQgKl9faW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXNhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCitleHRlcm4gdm9pZCBfX2lvbWVtICpfX2lvcmVtYXAodW5zaWduZWQgbG9uZyBwaHlzYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAogCQkgICAgICAgaW50IGNhY2hlZmxhZyk7CiBleHRlcm4gdm9pZCBfX2lvdW5tYXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKTsKIApAQCAtMzAsMjEgKzMwLDIxIEBACiAgKiB0d28gYWNjZXNzZXMgdG8gbWVtb3J5LCB3aGljaCBtYXkgYmUgdW5kZXNpcmFibGUgZm9yIHNvbWUgZGV2aWNlcy4KICAqLwogI2RlZmluZSBpbl84KGFkZHIpIFwKLSAgICAoeyB1OCBfX3YgPSAoKih2b2xhdGlsZSB1OCAqKSAoYWRkcikpOyBfX3Y7IH0pCisgICAgKHsgdTggX192ID0gKCooX19mb3JjZSB2b2xhdGlsZSB1OCAqKSAoYWRkcikpOyBfX3Y7IH0pCiAjZGVmaW5lIGluX2JlMTYoYWRkcikgXAotICAgICh7IHUxNiBfX3YgPSAoKih2b2xhdGlsZSB1MTYgKikgKGFkZHIpKTsgX192OyB9KQorICAgICh7IHUxNiBfX3YgPSAoKihfX2ZvcmNlIHZvbGF0aWxlIHUxNiAqKSAoYWRkcikpOyBfX3Y7IH0pCiAjZGVmaW5lIGluX2JlMzIoYWRkcikgXAotICAgICh7IHUzMiBfX3YgPSAoKih2b2xhdGlsZSB1MzIgKikgKGFkZHIpKTsgX192OyB9KQorICAgICh7IHUzMiBfX3YgPSAoKihfX2ZvcmNlIHZvbGF0aWxlIHUzMiAqKSAoYWRkcikpOyBfX3Y7IH0pCiAjZGVmaW5lIGluX2xlMTYoYWRkcikgXAotICAgICh7IHUxNiBfX3YgPSBsZTE2X3RvX2NwdSgqKHZvbGF0aWxlIHUxNiAqKSAoYWRkcikpOyBfX3Y7IH0pCisgICAgKHsgdTE2IF9fdiA9IGxlMTZfdG9fY3B1KCooX19mb3JjZSB2b2xhdGlsZSB1MTYgKikgKGFkZHIpKTsgX192OyB9KQogI2RlZmluZSBpbl9sZTMyKGFkZHIpIFwKLSAgICAoeyB1MzIgX192ID0gbGUzMl90b19jcHUoKih2b2xhdGlsZSB1MzIgKikgKGFkZHIpKTsgX192OyB9KQorICAgICh7IHUzMiBfX3YgPSBsZTMyX3RvX2NwdSgqKF9fZm9yY2Ugdm9sYXRpbGUgdTMyICopIChhZGRyKSk7IF9fdjsgfSkKIAotI2RlZmluZSBvdXRfOChhZGRyLGIpICh2b2lkKSgoKih2b2xhdGlsZSB1OCAqKSAoYWRkcikpID0gKGIpKQotI2RlZmluZSBvdXRfYmUxNihhZGRyLHcpICh2b2lkKSgoKih2b2xhdGlsZSB1MTYgKikgKGFkZHIpKSA9ICh3KSkKLSNkZWZpbmUgb3V0X2JlMzIoYWRkcixsKSAodm9pZCkoKCoodm9sYXRpbGUgdTMyICopIChhZGRyKSkgPSAobCkpCi0jZGVmaW5lIG91dF9sZTE2KGFkZHIsdykgKHZvaWQpKCgqKHZvbGF0aWxlIHUxNiAqKSAoYWRkcikpID0gY3B1X3RvX2xlMTYodykpCi0jZGVmaW5lIG91dF9sZTMyKGFkZHIsbCkgKHZvaWQpKCgqKHZvbGF0aWxlIHUzMiAqKSAoYWRkcikpID0gY3B1X3RvX2xlMzIobCkpCisjZGVmaW5lIG91dF84KGFkZHIsYikgKHZvaWQpKCgqKF9fZm9yY2Ugdm9sYXRpbGUgdTggKikgKGFkZHIpKSA9IChiKSkKKyNkZWZpbmUgb3V0X2JlMTYoYWRkcix3KSAodm9pZCkoKCooX19mb3JjZSB2b2xhdGlsZSB1MTYgKikgKGFkZHIpKSA9ICh3KSkKKyNkZWZpbmUgb3V0X2JlMzIoYWRkcixsKSAodm9pZCkoKCooX19mb3JjZSB2b2xhdGlsZSB1MzIgKikgKGFkZHIpKSA9IChsKSkKKyNkZWZpbmUgb3V0X2xlMTYoYWRkcix3KSAodm9pZCkoKCooX19mb3JjZSB2b2xhdGlsZSB1MTYgKikgKGFkZHIpKSA9IGNwdV90b19sZTE2KHcpKQorI2RlZmluZSBvdXRfbGUzMihhZGRyLGwpICh2b2lkKSgoKihfX2ZvcmNlIHZvbGF0aWxlIHUzMiAqKSAoYWRkcikpID0gY3B1X3RvX2xlMzIobCkpCiAKICNkZWZpbmUgcmF3X2luYiBpbl84CiAjZGVmaW5lIHJhd19pbncgaW5fYmUxNgpAQCAtNTQsNyArNTQsNyBAQAogI2RlZmluZSByYXdfb3V0dyh2YWwscG9ydCkgb3V0X2JlMTYoKHBvcnQpLCh2YWwpKQogI2RlZmluZSByYXdfb3V0bCh2YWwscG9ydCkgb3V0X2JlMzIoKHBvcnQpLCh2YWwpKQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcmF3X2luc2Iodm9sYXRpbGUgdTggKnBvcnQsIHU4ICpidWYsIHVuc2lnbmVkIGludCBsZW4pCitzdGF0aWMgaW5saW5lIHZvaWQgcmF3X2luc2Iodm9sYXRpbGUgdTggX19pb21lbSAqcG9ydCwgdTggKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIApAQCAtNjIsNyArNjIsNyBAQAogCQkqYnVmKysgPSBpbl84KHBvcnQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcmF3X291dHNiKHZvbGF0aWxlIHU4ICpwb3J0LCBjb25zdCB1OCAqYnVmLAorc3RhdGljIGlubGluZSB2b2lkIHJhd19vdXRzYih2b2xhdGlsZSB1OCBfX2lvbWVtICpwb3J0LCBjb25zdCB1OCAqYnVmLAogCQkJICAgICB1bnNpZ25lZCBpbnQgbGVuKQogewogCXVuc2lnbmVkIGludCBpOwpAQCAtNzEsNyArNzEsNyBAQAogCQlvdXRfOChwb3J0LCAqYnVmKyspOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcmF3X2luc3codm9sYXRpbGUgdTE2ICpwb3J0LCB1MTYgKmJ1ZiwgdW5zaWduZWQgaW50IG5yKQorc3RhdGljIGlubGluZSB2b2lkIHJhd19pbnN3KHZvbGF0aWxlIHUxNiBfX2lvbWVtICpwb3J0LCB1MTYgKmJ1ZiwgdW5zaWduZWQgaW50IG5yKQogewogCXVuc2lnbmVkIGludCB0bXA7CiAKQEAgLTExMCw3ICsxMTAsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHJhd19vdXRzdyh2b2xhdGlsZSB1MTYgKnBvcnQsIGNvbnN0IHUxNiAqYnVmLAorc3RhdGljIGlubGluZSB2b2lkIHJhd19vdXRzdyh2b2xhdGlsZSB1MTYgX19pb21lbSAqcG9ydCwgY29uc3QgdTE2ICpidWYsCiAJCQkgICAgIHVuc2lnbmVkIGludCBucikKIHsKIAl1bnNpZ25lZCBpbnQgdG1wOwpAQCAtMTUwLDcgKzE1MCw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcmF3X2luc2wodm9sYXRpbGUgdTMyICpwb3J0LCB1MzIgKmJ1ZiwgdW5zaWduZWQgaW50IG5yKQorc3RhdGljIGlubGluZSB2b2lkIHJhd19pbnNsKHZvbGF0aWxlIHUzMiBfX2lvbWVtICpwb3J0LCB1MzIgKmJ1ZiwgdW5zaWduZWQgaW50IG5yKQogewogCXVuc2lnbmVkIGludCB0bXA7CiAKQEAgLTE4OSw3ICsxODksNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHJhd19vdXRzbCh2b2xhdGlsZSB1MzIgKnBvcnQsIGNvbnN0IHUzMiAqYnVmLAorc3RhdGljIGlubGluZSB2b2lkIHJhd19vdXRzbCh2b2xhdGlsZSB1MzIgX19pb21lbSAqcG9ydCwgY29uc3QgdTMyICpidWYsCiAJCQkgICAgIHVuc2lnbmVkIGludCBucikKIHsKIAl1bnNpZ25lZCBpbnQgdG1wOwpAQCAtMjMwLDcgKzIzMCw3IEBACiB9CiAKIAotc3RhdGljIGlubGluZSB2b2lkIHJhd19pbnN3X3N3YXB3KHZvbGF0aWxlIHUxNiAqcG9ydCwgdTE2ICpidWYsCitzdGF0aWMgaW5saW5lIHZvaWQgcmF3X2luc3dfc3dhcHcodm9sYXRpbGUgdTE2IF9faW9tZW0gKnBvcnQsIHUxNiAqYnVmLAogCQkJCSAgdW5zaWduZWQgaW50IG5yKQogewogICAgIGlmICgobnIpICUgOCkKQEAgLTI4Myw3ICsyODMsNyBAQAogCQk6ICJkMCIsICJhMCIsICJhMSIsICJkNiIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcmF3X291dHN3X3N3YXB3KHZvbGF0aWxlIHUxNiAqcG9ydCwgY29uc3QgdTE2ICpidWYsCitzdGF0aWMgaW5saW5lIHZvaWQgcmF3X291dHN3X3N3YXB3KHZvbGF0aWxlIHUxNiBfX2lvbWVtICpwb3J0LCBjb25zdCB1MTYgKmJ1ZiwKIAkJCQkgICB1bnNpZ25lZCBpbnQgbnIpCiB7CiAgICAgaWYgKChucikgJSA4KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9zaWduYWwuaCBiL2luY2x1ZGUvYXNtLW02OGsvc2lnbmFsLmgKaW5kZXggYTBjZGY5MC4uYjdiN2VhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9zaWduYWwuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3NpZ25hbC5oCkBAIC0xNDQsNyArMTQ0LDcgQEAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKIHR5cGVkZWYgc3RydWN0IHNpZ2FsdHN0YWNrIHsKLQl2b2lkICpzc19zcDsKKwl2b2lkIF9fdXNlciAqc3Nfc3A7CiAJaW50IHNzX2ZsYWdzOwogCXNpemVfdCBzc19zaXplOwogfSBzdGFja190OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9zdW4zX3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLW02OGsvc3VuM19wZ3RhYmxlLmgKaW5kZXggZTk3NGJiMC4uNTE1NmEyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9zdW4zX3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3N1bjNfcGd0YWJsZS5oCkBAIC0yMTEsNyArMjExLDcgQEAKIAlyZXR1cm4gcHRlLnB0ZSAmIFNVTjNfUEFHRV9QR05VTV9NQVNLOwogfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHBnb2ZmX3RvX3B0ZShpbmxpbmUgdW5zaWduZWQgb2ZmKQorc3RhdGljIGlubGluZSBwdGVfdCBwZ29mZl90b19wdGUodW5zaWduZWQgb2ZmKQogewogCXB0ZV90IHB0ZSA9IHsgb2ZmICsgU1VOM19QQUdFX0FDQ0VTU0VEIH07CiAJcmV0dXJuIHB0ZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvc3VuM2ludHMuaCBiL2luY2x1ZGUvYXNtLW02OGsvc3VuM2ludHMuaAppbmRleCBmZDgzOGViLi5iZDAzOGZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3N1bjNpbnRzLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9zdW4zaW50cy5oCkBAIC0zMSw3ICszMSw2IEBACiAJCSAgICApOwogZXh0ZXJuIHZvaWQgc3VuM19pbml0X0lSUSAodm9pZCk7CiBleHRlcm4gaXJxcmV0dXJuX3QgKCpzdW4zX2RlZmF1bHRfaGFuZGxlcltdKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwotZXh0ZXJuIGlycXJldHVybl90ICgqc3VuM19pbnRoYW5kbGVyW10pIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CiBleHRlcm4gdm9pZCBzdW4zX2ZyZWVfaXJxICh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogZXh0ZXJuIHZvaWQgc3VuM19lbmFibGVfaW50ZXJydXB0cyAodm9pZCk7CiBleHRlcm4gdm9pZCBzdW4zX2Rpc2FibGVfaW50ZXJydXB0cyAodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3N1bjN4ZmxvcC5oIGIvaW5jbHVkZS9hc20tbTY4ay9zdW4zeGZsb3AuaAppbmRleCBmZGExZWNjLi45OGE5Zjc5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3N1bjN4ZmxvcC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvc3VuM3hmbG9wLmgKQEAgLTIwOCw3ICsyMDgsNyBAQAogCiAJaWYoIW9uY2UpIHsKIAkJb25jZSA9IDE7Ci0JCWVycm9yID0gcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgc3VuM3hmbG9wX2hhcmRpbnQsIFNBX0lOVEVSUlVQVCwgImZsb3BweSIsIDApOworCQllcnJvciA9IHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIHN1bjN4ZmxvcF9oYXJkaW50LCBTQV9JTlRFUlJVUFQsICJmbG9wcHkiLCBOVUxMKTsKIAkJcmV0dXJuICgoZXJyb3IgPT0gMCkgPyAwIDogLTEpOwogCX0gZWxzZSByZXR1cm4gMDsKIH0KQEAgLTIzOCw3ICsyMzgsNyBAQAogCSpzdW4zeF9mZGMuZmNyX3IgPSAwOwogCiAJLyogU3VjY2Vzcy4uLiAqLwotCWZsb3BweV9zZXRfZmxhZ3MoMCwgMSwgRkRfQlJPS0VOX0RDTCk7IC8vIEkgZG9uJ3Qga25vdyBob3cgdG8gZGV0ZWN0IHRoaXMuCisJZmxvcHB5X3NldF9mbGFncyhOVUxMLCAxLCBGRF9CUk9LRU5fRENMKTsgLy8gSSBkb24ndCBrbm93IGhvdyB0byBkZXRlY3QgdGhpcy4KIAlhbGxvd2VkX2RyaXZlX21hc2sgPSAweDAxOwogCXJldHVybiAoaW50KSBTVU4zWF9GREM7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1tNjhrL3RocmVhZF9pbmZvLmgKaW5kZXggOTUzMmNhMy4uYzRkNjIyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvdGhyZWFkX2luZm8uaApAQCAtMzcsNiArMzcsNyBAQAogI2RlZmluZSBpbml0X3N0YWNrCQkoaW5pdF90aHJlYWRfdW5pb24uc3RhY2spCiAKICNkZWZpbmUgdGFza190aHJlYWRfaW5mbyh0c2spCSgmKHRzayktPnRocmVhZC5pbmZvKQorI2RlZmluZSB0YXNrX3N0YWNrX3BhZ2UodHNrKQkoKHZvaWQgKikodHNrKS0+dGhyZWFkX2luZm8pCiAjZGVmaW5lIGN1cnJlbnRfdGhyZWFkX2luZm8oKQl0YXNrX3RocmVhZF9pbmZvKGN1cnJlbnQpCiAKICNkZWZpbmUgX19IQVZFX1RIUkVBRF9GVU5DVElPTlMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tbTY4ay91YWNjZXNzLmgKaW5kZXggZjVjZWRmMS4uMmZmZDg3YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay91YWNjZXNzLmgKQEAgLTQyLDYgKzQyLDcgQEAKICh7CQkJCQkJCVwKICAgICBpbnQgX19wdV9lcnI7CQkJCQlcCiAgICAgdHlwZW9mKCoocHRyKSkgX19wdV92YWwgPSAoeCk7CQkJXAorICAgIF9fY2hrX3VzZXJfcHRyKHB0cik7CQkJCVwKICAgICBzd2l0Y2ggKHNpemVvZiAoKihwdHIpKSkgewkJCQlcCiAgICAgY2FzZSAxOgkJCQkJCVwKIAlfX3B1dF91c2VyX2FzbShfX3B1X2VyciwgX19wdV92YWwsIHB0ciwgYik7CVwKQEAgLTkxLDYgKzkyLDcgQEAKICh7CQkJCQkJCQlcCiAgICAgaW50IF9fZ3VfZXJyOwkJCQkJCVwKICAgICB0eXBlb2YoKihwdHIpKSBfX2d1X3ZhbDsJCQkJCVwKKyAgICBfX2Noa191c2VyX3B0cihwdHIpOwkJCQkJXAogICAgIHN3aXRjaCAoc2l6ZW9mKCoocHRyKSkpIHsJCQkJCVwKICAgICBjYXNlIDE6CQkJCQkJCVwKIAlfX2dldF91c2VyX2FzbShfX2d1X2VyciwgX19ndV92YWwsIHB0ciwgYiwgIj1kIik7CVwKQEAgLTEwNSw3ICsxMDcsNyBAQAogICAgICAgICBfX2d1X2VyciA9IF9fY29uc3RhbnRfY29weV9mcm9tX3VzZXIoJl9fZ3VfdmFsLCBwdHIsIDgpOyAgXAogICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBkZWZhdWx0OgkJCQkJCQlcCi0JX19ndV92YWwgPSAwOwkJCQkJCVwKKwlfX2d1X3ZhbCA9ICh0eXBlb2YoKihwdHIpKSkwOwkJCQlcCiAJX19ndV9lcnIgPSBfX2dldF91c2VyX2JhZCgpOwkJCQlcCiAJYnJlYWs7CQkJCQkJCVwKICAgICB9CQkJCQkJCQlcCkBAIC0xMzQsNyArMTM2LDcgQEAKICAgICAgOiAibSIoKihwdHIpKSwgImkiICgtRUZBVUxUKSwgIjAiKDApKQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLV9fZ2VuZXJpY19jb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQorX19nZW5lcmljX2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewogICAgIHVuc2lnbmVkIGxvbmcgdG1wOwogICAgIF9fYXNtX18gX192b2xhdGlsZV9fCkBAIC0xODksNyArMTkxLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1fX2dlbmVyaWNfY29weV90b191c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCitfX2dlbmVyaWNfY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewogICAgIHVuc2lnbmVkIGxvbmcgdG1wOwogICAgIF9fYXNtX18gX192b2xhdGlsZV9fCkBAIC0yNjQsNyArMjY2LDcgQEAKIAkgOiAiZDAiLCAibWVtb3J5IikKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1fX2NvbnN0YW50X2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCitfX2NvbnN0YW50X2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewogICAgIHN3aXRjaCAobikgewogICAgIGNhc2UgMDoKQEAgLTUyMCw3ICs1MjIsNyBAQAogI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljIF9fY29weV9mcm9tX3VzZXIKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1fX2NvbnN0YW50X2NvcHlfdG9fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQorX19jb25zdGFudF9jb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAgICAgc3dpdGNoIChuKSB7CiAgICAgY2FzZSAwOgpAQCAtNzY2LDcgKzc2OCw3IEBACiAgKi8KIAogc3RhdGljIGlubGluZSBsb25nCi1zdHJuY3B5X2Zyb21fdXNlcihjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgbG9uZyBjb3VudCkKK3N0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywgbG9uZyBjb3VudCkKIHsKICAgICBsb25nIHJlczsKICAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuIGNvdW50OwpAQCAtNzk5LDExICs4MDEsMTEgQEAKICAqCiAgKiBSZXR1cm4gMCBvbiBleGNlcHRpb24sIGEgdmFsdWUgZ3JlYXRlciB0aGFuIE4gaWYgdG9vIGxvbmcKICAqLwotc3RhdGljIGlubGluZSBsb25nIHN0cm5sZW5fdXNlcihjb25zdCBjaGFyICpzcmMsIGxvbmcgbikKK3N0YXRpYyBpbmxpbmUgbG9uZyBzdHJubGVuX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnNyYywgbG9uZyBuKQogewogCWxvbmcgcmVzOwogCi0JcmVzID0gLShsb25nKXNyYzsKKwlyZXMgPSAtKHVuc2lnbmVkIGxvbmcpc3JjOwogCV9fYXNtX18gX192b2xhdGlsZV9fCiAJCSgiMTpcbiIKIAkJICIgICB0c3RsICUyXG4iCkBAIC04NDIsNyArODQ0LDcgQEAKICAqLwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLWNsZWFyX3VzZXIodm9pZCAqdG8sIHVuc2lnbmVkIGxvbmcgbikKK2NsZWFyX3VzZXIodm9pZCBfX3VzZXIgKnRvLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18KIAkoIiAgIHRzdGwgJTFcbiIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvem9ycm8uaCBiL2luY2x1ZGUvYXNtLW02OGsvem9ycm8uaAppbmRleCBjZjgxNjU4Li41Y2U5N2MyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3pvcnJvLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay96b3Jyby5oCkBAIC0xNSwyNCArMTUsMjQgQEAKICNkZWZpbmUgel9tZW1jcHlfZnJvbWlvKGEsYixjKQltZW1jcHkoKGEpLCh2b2lkICopKGIpLChjKSkKICNkZWZpbmUgel9tZW1jcHlfdG9pbyhhLGIsYykJbWVtY3B5KCh2b2lkICopKGEpLChiKSwoYykpCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqel9yZW1hcF9ub2NhY2hlX3Nlcih1bnNpZ25lZCBsb25nIHBoeXNhZGRyLAorc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKnpfcmVtYXBfbm9jYWNoZV9zZXIodW5zaWduZWQgbG9uZyBwaHlzYWRkciwKIAkJCQkJdW5zaWduZWQgbG9uZyBzaXplKQogewogCXJldHVybiBfX2lvcmVtYXAocGh5c2FkZHIsIHNpemUsIElPTUFQX05PQ0FDSEVfU0VSKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkICp6X3JlbWFwX25vY2FjaGVfbm9uc2VyKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqel9yZW1hcF9ub2NhY2hlX25vbnNlcih1bnNpZ25lZCBsb25nIHBoeXNhZGRyLAogCQkJCQkgICB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJcmV0dXJuIF9faW9yZW1hcChwaHlzYWRkciwgc2l6ZSwgSU9NQVBfTk9DQUNIRV9OT05TRVIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgKnpfcmVtYXBfd3JpdGV0aHJvdWdoKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqel9yZW1hcF93cml0ZXRocm91Z2godW5zaWduZWQgbG9uZyBwaHlzYWRkciwKIAkJCQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlyZXR1cm4gX19pb3JlbWFwKHBoeXNhZGRyLCBzaXplLCBJT01BUF9XUklURVRIUk9VR0gpOwogfQotc3RhdGljIGlubGluZSB2b2lkICp6X3JlbWFwX2Z1bGxjYWNoZSh1bnNpZ25lZCBsb25nIHBoeXNhZGRyLAorc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKnpfcmVtYXBfZnVsbGNhY2hlKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsCiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXJldHVybiBfX2lvcmVtYXAocGh5c2FkZHIsIHNpemUsIElPTUFQX0ZVTExfQ0FDSElORyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvYXRvbWljLmgKaW5kZXggMTcwMmRiZS4uNmM0ZTRiNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L2F0b21pYy5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9hdG9taWMuaApAQCAtMTI5LDYgKzEyOSw3IEBACiB9CiAKICNkZWZpbmUgYXRvbWljX2NtcHhjaGcodiwgbywgbikgKChpbnQpY21weGNoZygmKCh2KS0+Y291bnRlciksIChvKSwgKG4pKSkKKyNkZWZpbmUgYXRvbWljX3hjaGcodiwgbmV3KSAoeGNoZygmKCh2KS0+Y291bnRlciksIG5ldykpCiAKICNkZWZpbmUgYXRvbWljX2FkZF91bmxlc3ModiwgYSwgdSkJCQkJXAogKHsJCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9iaXRvcHMuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9iaXRvcHMuaAppbmRleCA0MDU4ZGQwLi4yNWQ4YTNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvYml0b3BzLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L2JpdG9wcy5oCkBAIC0yOTAsNyArMjkwLDcgQEAKIAl0bXAgPSAqcDsKIAogZm91bmRfZmlyc3Q6Ci0JdG1wIHw9IH4wVUwgPj4gc2l6ZTsKKwl0bXAgfD0gfjBVTCA8PCBzaXplOwogZm91bmRfbWlkZGxlOgogCXJldHVybiByZXN1bHQgKyBmZnoodG1wKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9mdXRleC5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L2Z1dGV4LmgKaW5kZXggOWZlZmY0Y2UuLjZhMzMyYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9mdXRleC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9mdXRleC5oCkBAIC0xLDUzICsxLDYgQEAKICNpZm5kZWYgX0FTTV9GVVRFWF9ICiAjZGVmaW5lIF9BU01fRlVURVhfSAogCi0jaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2Z1dGV4Lmg+CiAKLSNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1mdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCi17Ci0JaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKLQlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7Ci0JaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7Ci0JaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKLQlpbnQgb2xkdmFsID0gMCwgcmV0OwotCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKLQkJb3BhcmcgPSAxIDw8IG9wYXJnOwotCi0JaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaW5jX3ByZWVtcHRfY291bnQoKTsKLQotCXN3aXRjaCAob3ApIHsKLQljYXNlIEZVVEVYX09QX1NFVDoKLQljYXNlIEZVVEVYX09QX0FERDoKLQljYXNlIEZVVEVYX09QX09SOgotCWNhc2UgRlVURVhfT1BfQU5ETjoKLQljYXNlIEZVVEVYX09QX1hPUjoKLQlkZWZhdWx0OgotCQlyZXQgPSAtRU5PU1lTOwotCX0KLQotCWRlY19wcmVlbXB0X2NvdW50KCk7Ci0KLQlpZiAoIXJldCkgewotCQlzd2l0Y2ggKGNtcCkgewotCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKLQkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0jZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L2lvY3RsLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvaW9jdGwuaAppbmRleCBjZmY3MmYzLi5iMjc5ZmUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvaW9jdGwuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvaW9jdGwuaApAQCAtMSArMSBAQAotI2luY2x1ZGUgPGFzbS1tNjhrL2lvY3RsLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW9jdGwuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9tYWNoZGVwLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbWFjaGRlcC5oCmluZGV4IDVhOWY5YzI5Li4yN2M5MGFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbWFjaGRlcC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9tYWNoZGVwLmgKQEAgLTM4LDcgKzM4LDYgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nICgqbWFjaF9oZF9pbml0KSAodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gdm9pZCAoKm1hY2hfaGRfc2V0dXApKGNoYXIgKiwgaW50ICopOwogZXh0ZXJuIGxvbmcgbWFjaF9tYXhfZG1hX2FkZHJlc3M7Ci1leHRlcm4gdm9pZCAoKm1hY2hfZmxvcHB5X3NldHVwKShjaGFyICosIGludCAqKTsKIGV4dGVybiB2b2lkICgqbWFjaF9mbG9wcHlfZWplY3QpKHZvaWQpOwogZXh0ZXJuIHZvaWQgKCptYWNoX2hlYXJ0YmVhdCkgKGludCk7CiBleHRlcm4gdm9pZCAoKm1hY2hfbDJfZmx1c2gpIChpbnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L211dGV4LmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NThjMWY3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L211dGV4LmgKQEAgLTAsMCArMSw5IEBACisvKgorICogUHVsbCBpbiB0aGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIG11dGV4IGZhc3RwYXRoLgorICoKKyAqIFRPRE86IGltcGxlbWVudCBvcHRpbWl6ZWQgcHJpbWl0aXZlcyBpbnN0ZWFkLCBvciBsZWF2ZSB0aGUgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24gaW4gcGxhY2UsIG9yIHBpY2sgdGhlIGF0b21pY194Y2hnKCkgYmFzZWQgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24uIChzZWUgYXNtLWdlbmVyaWMvbXV0ZXgteGNoZy5oIGZvciBkZXRhaWxzKQorICovCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tdXRleC1kZWMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9zaWdjb250ZXh0LmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvc2lnY29udGV4dC5oCmluZGV4IDg0YmYzNmQuLjM2YzI5M2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9zaWdjb250ZXh0LmgKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L3NpZ2NvbnRleHQuaApAQCAtOCw2ICs4LDcgQEAKIAl1bnNpZ25lZCBsb25nICBzY19kMTsKIAl1bnNpZ25lZCBsb25nICBzY19hMDsKIAl1bnNpZ25lZCBsb25nICBzY19hMTsKKwl1bnNpZ25lZCBsb25nICBzY19hNTsKIAl1bnNpZ25lZCBzaG9ydCBzY19zcjsKIAl1bnNpZ25lZCBsb25nICBzY19wYzsKIAl1bnNpZ25lZCBzaG9ydCBzY19mb3JtYXR2ZWM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS90aHJlYWRfaW5mby5oCmluZGV4IDdiOWEzZmEuLmI4ZjAwOWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGtub21tdS90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS90aHJlYWRfaW5mby5oCkBAIC03NSw4ICs3NSw2IEBACiAjZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaykgKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgXAogCQkJCV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgVEhSRUFEX1NJWkVfT1JERVIpKQogI2RlZmluZSBmcmVlX3RocmVhZF9pbmZvKHRpKQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSAodGkpLCBUSFJFQURfU0laRV9PUkRFUikKLSNkZWZpbmUgZ2V0X3RocmVhZF9pbmZvKHRpKQlnZXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKLSNkZWZpbmUgcHV0X3RocmVhZF9pbmZvKHRpKQlwdXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogI2RlZmluZQlQUkVFTVBUX0FDVElWRQkweDQwMDAwMDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1taXBzL2F0b21pYy5oCmluZGV4IDkyMjU2ZTQuLjY1NGI5N2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9hdG9taWMuaApAQCAtMjQsMTAgKzI0LDkgQEAKICNkZWZpbmUgX0FTTV9BVE9NSUNfSAogCiAjaW5jbHVkZSA8YXNtL2NwdS1mZWF0dXJlcy5oPgorI2luY2x1ZGUgPGFzbS9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxhc20vd2FyLmg+CiAKLWV4dGVybiBzcGlubG9ja190IGF0b21pY19sb2NrOwotCiB0eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OwogCiAjZGVmaW5lIEFUT01JQ19JTklUKGkpICAgIHsgKGkpIH0KQEAgLTg1LDkgKzg0LDkgQEAKIAl9IGVsc2UgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdG9taWNfbG9jaywgZmxhZ3MpOworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJCXYtPmNvdW50ZXIgKz0gaTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXRvbWljX2xvY2ssIGZsYWdzKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0KIH0KIApAQCAtMTI3LDkgKzEyNiw5IEBACiAJfSBlbHNlIHsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXRvbWljX2xvY2ssIGZsYWdzKTsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCQl2LT5jb3VudGVyIC09IGk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF0b21pY19sb2NrLCBmbGFncyk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9CiB9CiAKQEAgLTE3MywxMSArMTcyLDExIEBACiAJfSBlbHNlIHsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXRvbWljX2xvY2ssIGZsYWdzKTsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCQlyZXN1bHQgPSB2LT5jb3VudGVyOwogCQlyZXN1bHQgKz0gaTsKIAkJdi0+Y291bnRlciA9IHJlc3VsdDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXRvbWljX2xvY2ssIGZsYWdzKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0KIAogCXJldHVybiByZXN1bHQ7CkBAIC0yMjAsMTEgKzIxOSwxMSBAQAogCX0gZWxzZSB7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF0b21pY19sb2NrLCBmbGFncyk7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJcmVzdWx0ID0gdi0+Y291bnRlcjsKIAkJcmVzdWx0IC09IGk7CiAJCXYtPmNvdW50ZXIgPSByZXN1bHQ7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF0b21pY19sb2NrLCBmbGFncyk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMjc3LDE4ICsyNzYsMTkgQEAKIAl9IGVsc2UgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdG9taWNfbG9jaywgZmxhZ3MpOworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJCXJlc3VsdCA9IHYtPmNvdW50ZXI7CiAJCXJlc3VsdCAtPSBpOwogCQlpZiAocmVzdWx0ID49IDApCiAJCQl2LT5jb3VudGVyID0gcmVzdWx0OwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdG9taWNfbG9jaywgZmxhZ3MpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAogI2RlZmluZSBhdG9taWNfY21weGNoZyh2LCBvLCBuKSAoKGludCljbXB4Y2hnKCYoKHYpLT5jb3VudGVyKSwgKG8pLCAobikpKQorI2RlZmluZSBhdG9taWNfeGNoZyh2LCBuZXcpICh4Y2hnKCYoKHYpLT5jb3VudGVyKSwgbmV3KSkKIAogLyoqCiAgKiBhdG9taWNfYWRkX3VubGVzcyAtIGFkZCB1bmxlc3MgdGhlIG51bWJlciBpcyBhIGdpdmVuIHZhbHVlCkBAIC00MzIsOSArNDMyLDkgQEAKIAl9IGVsc2UgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdG9taWNfbG9jaywgZmxhZ3MpOworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJCXYtPmNvdW50ZXIgKz0gaTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXRvbWljX2xvY2ssIGZsYWdzKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0KIH0KIApAQCAtNDc0LDkgKzQ3NCw5IEBACiAJfSBlbHNlIHsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXRvbWljX2xvY2ssIGZsYWdzKTsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCQl2LT5jb3VudGVyIC09IGk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF0b21pY19sb2NrLCBmbGFncyk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9CiB9CiAKQEAgLTUyMCwxMSArNTIwLDExIEBACiAJfSBlbHNlIHsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXRvbWljX2xvY2ssIGZsYWdzKTsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCQlyZXN1bHQgPSB2LT5jb3VudGVyOwogCQlyZXN1bHQgKz0gaTsKIAkJdi0+Y291bnRlciA9IHJlc3VsdDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXRvbWljX2xvY2ssIGZsYWdzKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0KIAogCXJldHVybiByZXN1bHQ7CkBAIC01NjcsMTEgKzU2NywxMSBAQAogCX0gZWxzZSB7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF0b21pY19sb2NrLCBmbGFncyk7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJcmVzdWx0ID0gdi0+Y291bnRlcjsKIAkJcmVzdWx0IC09IGk7CiAJCXYtPmNvdW50ZXIgPSByZXN1bHQ7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF0b21pY19sb2NrLCBmbGFncyk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtNjI0LDEyICs2MjQsMTIgQEAKIAl9IGVsc2UgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdG9taWNfbG9jaywgZmxhZ3MpOworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJCXJlc3VsdCA9IHYtPmNvdW50ZXI7CiAJCXJlc3VsdCAtPSBpOwogCQlpZiAocmVzdWx0ID49IDApCiAJCQl2LT5jb3VudGVyID0gcmVzdWx0OwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdG9taWNfbG9jaywgZmxhZ3MpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvY2FjaGUuaCBiL2luY2x1ZGUvYXNtLW1pcHMvY2FjaGUuaAppbmRleCAxYTVkMWE2Li41NWUxOWYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2NhY2hlLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9jYWNoZS5oCkBAIC0xNSw3ICsxNSw2IEBACiAjZGVmaW5lIEwxX0NBQ0hFX1NISUZUCQlDT05GSUdfTUlQU19MMV9DQUNIRV9TSElGVAogI2RlZmluZSBMMV9DQUNIRV9CWVRFUwkJKDEgPDwgTDFfQ0FDSEVfU0hJRlQpCiAKLSNkZWZpbmUgTDFfQ0FDSEVfU0hJRlRfTUFYCTYKICNkZWZpbmUgU01QX0NBQ0hFX1NISUZUCQlMMV9DQUNIRV9TSElGVAogI2RlZmluZSBTTVBfQ0FDSEVfQllURVMJCUwxX0NBQ0hFX0JZVEVTCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvY3B1LWZlYXR1cmVzLmggYi9pbmNsdWRlL2FzbS1taXBzL2NwdS1mZWF0dXJlcy5oCmluZGV4IDAzNjI3Y2ZiLi43OGM5Y2MyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2NwdS1mZWF0dXJlcy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvY3B1LWZlYXR1cmVzLmgKQEAgLTExNiw2ICsxMTYsMjcgQEAKICNlbmRpZgogI2VuZGlmCiAKKyMgaWZuZGVmIGNwdV9oYXNfbWlwczMycjEKKyMgZGVmaW5lIGNwdV9oYXNfbWlwczMycjEJKGNwdV9kYXRhWzBdLmlzYV9sZXZlbCAmIE1JUFNfQ1BVX0lTQV9NMzJSMSkKKyMgZW5kaWYKKyMgaWZuZGVmIGNwdV9oYXNfbWlwczMycjIKKyMgZGVmaW5lIGNwdV9oYXNfbWlwczMycjIJKGNwdV9kYXRhWzBdLmlzYV9sZXZlbCAmIE1JUFNfQ1BVX0lTQV9NMzJSMikKKyMgZW5kaWYKKyMgaWZuZGVmIGNwdV9oYXNfbWlwczY0cjEKKyMgZGVmaW5lIGNwdV9oYXNfbWlwczY0cjEJKGNwdV9kYXRhWzBdLmlzYV9sZXZlbCAmIE1JUFNfQ1BVX0lTQV9NNjRSMSkKKyMgZW5kaWYKKyMgaWZuZGVmIGNwdV9oYXNfbWlwczY0cjIKKyMgZGVmaW5lIGNwdV9oYXNfbWlwczY0cjIJKGNwdV9kYXRhWzBdLmlzYV9sZXZlbCAmIE1JUFNfQ1BVX0lTQV9NNjRSMikKKyMgZW5kaWYKKworLyoKKyAqIFNob3J0Y3V0cyAuLi4KKyAqLworI2RlZmluZSBjcHVfaGFzX21pcHMzMgkoY3B1X2hhc19taXBzMzJyMSB8IGNwdV9oYXNfbWlwczMycjIpCisjZGVmaW5lIGNwdV9oYXNfbWlwczY0CShjcHVfaGFzX21pcHM2NHIxIHwgY3B1X2hhc19taXBzNjRyMikKKyNkZWZpbmUgY3B1X2hhc19taXBzX3IxCShjcHVfaGFzX21pcHMzMnIxIHwgY3B1X2hhc19taXBzNjRyMSkKKyNkZWZpbmUgY3B1X2hhc19taXBzX3IyCShjcHVfaGFzX21pcHMzMnIyIHwgY3B1X2hhc19taXBzNjRyMikKKwogI2lmbmRlZiBjcHVfaGFzX2RzcAogI2RlZmluZSBjcHVfaGFzX2RzcAkJKGNwdV9kYXRhWzBdLmFzZXMgJiBNSVBTX0FTRV9EU1ApCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvY3B1LmggYi9pbmNsdWRlL2FzbS1taXBzL2NwdS5oCmluZGV4IDQ4ZWFjMjk2Li45MzRlMDYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2NwdS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvY3B1LmgKQEAgLTIwNCwxNiArMjA0LDE4IEBACiAgKi8KICNkZWZpbmUgTUlQU19DUFVfSVNBX0kJCTB4MDAwMDAwMDEKICNkZWZpbmUgTUlQU19DUFVfSVNBX0lJCQkweDAwMDAwMDAyCi0jZGVmaW5lIE1JUFNfQ1BVX0lTQV9JSUkJMHgwMDAwODAwMwotI2RlZmluZSBNSVBTX0NQVV9JU0FfSVYJCTB4MDAwMDgwMDQKLSNkZWZpbmUgTUlQU19DUFVfSVNBX1YJCTB4MDAwMDgwMDUKLSNkZWZpbmUgTUlQU19DUFVfSVNBX00zMgkweDAwMDAwMDIwCi0jZGVmaW5lIE1JUFNfQ1BVX0lTQV9NNjQJMHgwMDAwODA0MAorI2RlZmluZSBNSVBTX0NQVV9JU0FfSUlJCTB4MDAwMDAwMDMKKyNkZWZpbmUgTUlQU19DUFVfSVNBX0lWCQkweDAwMDAwMDA0CisjZGVmaW5lIE1JUFNfQ1BVX0lTQV9WCQkweDAwMDAwMDA1CisjZGVmaW5lIE1JUFNfQ1BVX0lTQV9NMzJSMQkweDAwMDAwMDIwCisjZGVmaW5lIE1JUFNfQ1BVX0lTQV9NMzJSMgkweDAwMDAwMDQwCisjZGVmaW5lIE1JUFNfQ1BVX0lTQV9NNjRSMQkweDAwMDAwMDgwCisjZGVmaW5lIE1JUFNfQ1BVX0lTQV9NNjRSMgkweDAwMDAwMTAwCiAKLS8qCi0gKiBCaXQgMTUgZW5jb2RlcyBpZiBhbiBJU0EgbGV2ZWwgc3VwcG9ydHMgNjQtYml0IG9wZXJhdGlvbnMuCi0gKi8KLSNkZWZpbmUgTUlQU19DUFVfSVNBXzY0QklUCTB4MDAwMDgwMDAKKyNkZWZpbmUgTUlQU19DUFVfSVNBXzMyQklUIChNSVBTX0NQVV9JU0FfSSB8IE1JUFNfQ1BVX0lTQV9JSSB8IFwKKwlNSVBTX0NQVV9JU0FfTTMyUjEgfCBNSVBTX0NQVV9JU0FfTTMyUjIgKQorI2RlZmluZSBNSVBTX0NQVV9JU0FfNjRCSVQgKE1JUFNfQ1BVX0lTQV9JSUkgfCBNSVBTX0NQVV9JU0FfSVYgfCBcCisJTUlQU19DUFVfSVNBX1YgfCBNSVBTX0NQVV9JU0FfTTY0UjEgfCBNSVBTX0NQVV9JU0FfTTY0UjIpCiAKIC8qCiAgKiBDUFUgT3B0aW9uIGVuY29kaW5ncwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9kZWxheS5oIGIvaW5jbHVkZS9hc20tbWlwcy9kZWxheS5oCmluZGV4IDQ4ZDAwY2MuLjY0ZGQ0NTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvZGVsYXkuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2RlbGF5LmgKQEAgLTUyLDEzICs1MiwxMSBAQAogCXVuc2lnbmVkIGxvbmcgbG87CiAKIAkvKgotCSAqIFRoZSBjb21tb24gcmF0ZXMgb2YgMTAwMCBhbmQgMTI4IGFyZSByb3VuZGVkIHdyb25nbHkgYnkgdGhlCi0JICogY2F0Y2hhbGwgY2FzZSBmb3IgNjQtYml0LiAgRXhjZXNzaXZlIHByZWNpc3Npb24/ICBQcm9iYWJseSAuLi4KKwkgKiBUaGUgcmF0ZXMgb2YgMTI4IGlzIHJvdW5kZWQgd3JvbmdseSBieSB0aGUgY2F0Y2hhbGwgY2FzZQorCSAqIGZvciA2NC1iaXQuICBFeGNlc3NpdmUgcHJlY2lzc2lvbj8gIFByb2JhYmx5IC4uLgogCSAqLwogI2lmIGRlZmluZWQoQ09ORklHXzY0QklUKSAmJiAoSFogPT0gMTI4KQogCXVzZWNzICo9IDB4MDAwODYzN2JkMDVhZjZjN1VMOwkJLyogMioqNjQgLyAoMTAwMDAwMCAvIEhaKSAqLwotI2VsaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpICYmIChIWiA9PSAxMDAwKQotCXVzZWNzICo9IDB4MDA0MTg5Mzc0QkM2QTdmMFVMOwkJLyogMioqNjQgLyAoMTAwMDAwMCAvIEhaKSAqLwogI2VsaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpCiAJdXNlY3MgKj0gKDB4ODAwMDAwMDAwMDAwMDAwMFVMIC8gKDUwMDAwMCAvIEhaKSk7CiAjZWxzZSAvKiAzMi1iaXQganVuayBmb2xsb3dzIGhlcmUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZHNwLmggYi9pbmNsdWRlL2FzbS1taXBzL2RzcC5oCmluZGV4IDUwZjU1NmIuLmU5YmZjMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvZHNwLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9kc3AuaApAQCAtMTYsNyArMTYsNyBAQAogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgogCiAjZGVmaW5lIERTUF9ERUZBVUxUCTB4MDAwMDAwMDAKLSNkZWZpbmUgRFNQX01BU0sJMHgxZgorI2RlZmluZSBEU1BfTUFTSwkweDNmZgogCiAjZGVmaW5lIF9fZW5hYmxlX2RzcF9oYXphcmQoKQkJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCkBAIC00OCw2ICs0OCw3IEBACiAJdHNrLT50aHJlYWQuZHNwLmRzcHJbM10gPSBtZmxvMigpOwkJCQlcCiAJdHNrLT50aHJlYWQuZHNwLmRzcHJbNF0gPSBtZmhpMygpOwkJCQlcCiAJdHNrLT50aHJlYWQuZHNwLmRzcHJbNV0gPSBtZmxvMygpOwkJCQlcCisJdHNrLT50aHJlYWQuZHNwLmRzcGNvbnRyb2wgPSByZGRzcChEU1BfTUFTSyk7CQkJXAogfSB3aGlsZSAoMCkKIAogI2RlZmluZSBzYXZlX2RzcCh0c2spCQkJCQkJCVwKQEAgLTY0LDYgKzY1LDcgQEAKIAltdGxvMih0c2stPnRocmVhZC5kc3AuZHNwclszXSk7CQkJCQlcCiAJbXRoaTModHNrLT50aHJlYWQuZHNwLmRzcHJbNF0pOwkJCQkJXAogCW10bG8zKHRzay0+dGhyZWFkLmRzcC5kc3ByWzVdKTsJCQkJCVwKKwl3cmRzcCh0c2stPnRocmVhZC5kc3AuZHNwY29udHJvbCwgRFNQX01BU0spOwkJCVwKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgcmVzdG9yZV9kc3AodHNrKQkJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZWxmLmggYi9pbmNsdWRlL2FzbS1taXBzL2VsZi5oCmluZGV4IGQyYzlhMjUuLjg1MWYwMTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvZWxmLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9lbGYuaApAQCAtMjc3LDEyICsyNzcsMTIgQEAKIAogc3RydWN0IHRhc2tfc3RydWN0OwogCi1leHRlcm4gdm9pZCBkdW1wX3JlZ3MoZWxmX2dyZWdfdCAqLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitleHRlcm4gdm9pZCBlbGZfZHVtcF9yZWdzKGVsZl9ncmVnX3QgKiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogZXh0ZXJuIGludCBkdW1wX3Rhc2tfcmVncyAoc3RydWN0IHRhc2tfc3RydWN0ICosIGVsZl9ncmVnc2V0X3QgKik7CiBleHRlcm4gaW50IGR1bXBfdGFza19mcHUoc3RydWN0IHRhc2tfc3RydWN0ICosIGVsZl9mcHJlZ3NldF90ICopOwogCiAjZGVmaW5lIEVMRl9DT1JFX0NPUFlfUkVHUyhlbGZfcmVncywgcmVncykJCQlcCi0JZHVtcF9yZWdzKChlbGZfZ3JlZ190ICopJihlbGZfcmVncyksIHJlZ3MpOworCWVsZl9kdW1wX3JlZ3MoKGVsZl9ncmVnX3QgKikmKGVsZl9yZWdzKSwgcmVncyk7CiAjZGVmaW5lIEVMRl9DT1JFX0NPUFlfVEFTS19SRUdTKHRzaywgZWxmX3JlZ3MpIGR1bXBfdGFza19yZWdzKHRzaywgZWxmX3JlZ3MpCiAjZGVmaW5lIEVMRl9DT1JFX0NPUFlfRlBSRUdTKHRzaywgZWxmX2ZwcmVncykJCQlcCiAJZHVtcF90YXNrX2ZwdSh0c2ssIGVsZl9mcHJlZ3MpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2hhemFyZHMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvaGF6YXJkcy5oCmluZGV4IDc1MTcxODkuLjJmYzkwNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvaGF6YXJkcy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvaGF6YXJkcy5oCkBAIC0yMzMsMTUgKzIzMywyNSBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQ1BVX01JUFNSMgorLyoKKyAqIGdjYyBoYXMgYSB0cmFkaXRpb24gb2YgbWlzc2NvbXBpbGluZyB0aGUgcHJldmlvdXMgY29uc3RydWN0IHVzaW5nIHRoZQorICogYWRkcmVzcyBvZiBhIGxhYmVsIGFzIGFyZ3VtZW50IHRvIGlubGluZSBhc3NlbWJsZXIuICBHYXMgb3RvaCBoYXMgdGhlCisgKiBhbm5veWluZyBkaWZmZXJlbmNlIGJldHdlZW4gbGEgYW5kIGRsYSB3aGljaCBhcmUgb25seSB1c2FibGUgZm9yIDMyLWJpdAorICogcnNwLiA2NC1iaXQgY29kZSwgc28gY2FuJ3QgYmUgdXNlZCB3aXRob3V0IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uLgorICogVGhlIGFsdGVyYW50aXZlIGlzIHN3aXRjaGluZyB0aGUgYXNzZW1ibGVyIHRvIDY0LWJpdCBjb2RlIHdoaWNoIGhhcHBlbnMKKyAqIHRvIHdvcmsgcmlnaHQgZXZlbiBmb3IgMzItYml0IGNvZGUgLi4uCisgKi8KICNkZWZpbmUgaW5zdHJ1Y3Rpb25faGF6YXJkKCkJCQkJCQlcCiBkbyB7CQkJCQkJCQkJXAotX19sYWJlbF9fIF9fbmV4dDsJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgdG1wOwkJCQkJCVwKKwkJCQkJCQkJCVwKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJIgkuc2V0CW1pcHM2NHIyCQkJCVxuIglcCisJIglkbGEJJTAsIDFmCQkJCQlcbiIJXAogCSIJanIuaGIJJTAJCQkJCVxuIglcCi0JOgkJCQkJCQkJXAotCTogInIiICgmJl9fbmV4dCkpOwkJCQkJCVwKLV9fbmV4dDoJCQkJCQkJCQlcCi0JOwkJCQkJCQkJXAorCSIJLnNldAltaXBzMAkJCQkJXG4iCVwKKwkiMToJCQkJCQkJXG4iCVwKKwk6ICI9ciIgKHRtcCkpOwkJCQkJCQlcCiB9IHdoaWxlICgwKQogCiAjZWxzZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9pbnRlcnJ1cHQuaCBiL2luY2x1ZGUvYXNtLW1pcHMvaW50ZXJydXB0LmgKaW5kZXggYTU3MzU3Ni4uYWJkZjU0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9pbnRlcnJ1cHQuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2ludGVycnVwdC5oCkBAIC05Myw2ICs5Myw3IEBACiAJIgkuc2V0CW5vYXQJCQkJCQlcbiIKICNpZmRlZiBDT05GSUdfQ1BVX01JUFNSMgogCSIJZGkJXFxyZXN1bHQJCQkJCVxuIgorCSIJYW5kaQlcXHJlc3VsdCwgMQkJCQkJXG4iCiAjZWxzZQogCSIJbWZjMAlcXHJlc3VsdCwgJDEyCQkJCQlcbiIKIAkiCW9yaQkkMSwgXFxyZXN1bHQsIDEJCQkJCVxuIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC9hdTEwMDAuaCBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1hdTF4MDAvYXUxMDAwLmgKaW5kZXggODMyN2VjMy4uOGUxZDdlZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC9hdTEwMDAuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtYXUxeDAwL2F1MTAwMC5oCkBAIC04MzgsNiArODM4LDcgQEAKICNkZWZpbmUgVUFSVDNfQUREUiAgICAgICAgICAgICAgICAweEIxNDAwMDAwCiAKICNkZWZpbmUgVVNCX09IQ0lfQkFTRSAgICAgICAgICAgICAweDE0MDIwMDAwIC8vIHBoeXMgYWRkciBmb3IgaW9yZW1hcAorI2RlZmluZSBVU0JfT0hDSV9MRU4gICAgICAgICAgICAgIDB4MDAwNjAwMDAKICNkZWZpbmUgVVNCX0hPU1RfQ09ORklHICAgICAgICAgICAweEI0MDI3ZmZjCiAKICNkZWZpbmUgQVUxNTUwX0VUSDBfQkFTRSAgICAgIDB4QjA1MDAwMDAKQEAgLTEwMTcsMTAgKzEwMTgsMTIgQEAKICAgI2RlZmluZSBJMlNfQ09OVFJPTF9EICAgICAgICAgKDE8PDEpCiAgICNkZWZpbmUgSTJTX0NPTlRST0xfQ0UgICAgICAgICgxPDwwKQogCi0jaWZuZGVmIENPTkZJR19TT0NfQVUxMjAwCi0KIC8qIFVTQiBIb3N0IENvbnRyb2xsZXIgKi8KKyNpZm5kZWYgVVNCX09IQ0lfTEVOCiAjZGVmaW5lIFVTQl9PSENJX0xFTiAgICAgICAgICAgICAgMHgwMDEwMDAwMAorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1NPQ19BVTEyMDAKIAogLyogVVNCIERldmljZSBDb250cm9sbGVyICovCiAjZGVmaW5lIFVTQkRfRVAwUkQgICAgICAgICAgICAgICAgMHhCMDIwMDAwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjIvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmggYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyMi9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaAppbmRleCBhYjk3MTQ2Li4yYTM3YmVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyMi9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyMi9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaApAQCAtMzQsNCArMzQsOSBAQAogI2RlZmluZSBjcHVfaGFzX25vZnB1ZXgJCTAKICNkZWZpbmUgY3B1X2hhc182NGJpdHMJCTEKIAorI2RlZmluZSBjcHVfaGFzX21pcHMzMnIxCTAKKyNkZWZpbmUgY3B1X2hhc19taXBzMzJyMgkwCisjZGVmaW5lIGNwdV9oYXNfbWlwczY0cjEJMAorI2RlZmluZSBjcHVfaGFzX21pcHM2NHIyCTAKKwogI2VuZGlmIC8qIF9fQVNNX01BQ0hfSVAyMl9DUFVfRkVBVFVSRV9PVkVSUklERVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjcvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmggYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyNy9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaAppbmRleCA0YzhhOTAwLi4yZDJmNWI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyNy9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyNy9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaApAQCAtMzcsNCArMzcsOSBAQAogI2RlZmluZSBjcHVfaWNhY2hlX2xpbmVfc2l6ZSgpCTY0CiAjZGVmaW5lIGNwdV9zY2FjaGVfbGluZV9zaXplKCkJMTI4CiAKKyNkZWZpbmUgY3B1X2hhc19taXBzMzJyMQkwCisjZGVmaW5lIGNwdV9oYXNfbWlwczMycjIJMAorI2RlZmluZSBjcHVfaGFzX21pcHM2NHIxCTAKKyNkZWZpbmUgY3B1X2hhc19taXBzNjRyMgkwCisKICNlbmRpZiAvKiBfX0FTTV9NQUNIX0lQMjdfQ1BVX0ZFQVRVUkVfT1ZFUlJJREVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDI3L3RvcG9sb2d5LmggYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyNy90b3BvbG9neS5oCmluZGV4IDgyMTQxYzcuLjU5ZDI2YjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDI3L3RvcG9sb2d5LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjcvdG9wb2xvZ3kuaApAQCAtMjcsNyArMjcsNiBAQAogCS5tYXhfaW50ZXJ2YWwJCT0gMzIsCQkJXAogCS5idXN5X2ZhY3RvcgkJPSAzMiwJCQlcCiAJLmltYmFsYW5jZV9wY3QJCT0gMTI1LAkJCVwKLQkuY2FjaGVfaG90X3RpbWUJCT0gKDEwKjEwMDApLAkJXAogCS5jYWNoZV9uaWNlX3RyaWVzCT0gMSwJCQlcCiAJLnBlcl9jcHVfZ2FpbgkJPSAxMDAsCQkJXAogCS5mbGFncwkJCT0gU0RfTE9BRF9CQUxBTkNFCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDMyL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMzIvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKaW5kZXggYWIzN2ZjMS4uYjgwYzMwNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMzIvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMzIvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKQEAgLTM5LDQgKzM5LDkgQEAKICNkZWZpbmUgY3B1X2hhc19pY19maWxsc19mX2RjCTAKICNkZWZpbmUgY3B1X2hhc19kc3AJCTAKIAorI2RlZmluZSBjcHVfaGFzX21pcHMzMnIxCTAKKyNkZWZpbmUgY3B1X2hhc19taXBzMzJyMgkwCisjZGVmaW5lIGNwdV9oYXNfbWlwczY0cjEJMAorI2RlZmluZSBjcHVfaGFzX21pcHM2NHIyCTAKKwogI2VuZGlmIC8qIF9fQVNNX01BQ0hfSVAzMl9DUFVfRkVBVFVSRV9PVkVSUklERVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWphL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWphL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCmluZGV4IGEwZmRlNDAuLjkwZmYwODcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1qYS9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtamEvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKQEAgLTM3LDQgKzM3LDkgQEAKICNkZWZpbmUgY3B1X2ljYWNoZV9saW5lX3NpemUoKQkzMgogI2RlZmluZSBjcHVfc2NhY2hlX2xpbmVfc2l6ZSgpCTMyCiAKKyNkZWZpbmUgY3B1X2hhc19taXBzMzJyMQkwCisjZGVmaW5lIGNwdV9oYXNfbWlwczMycjIJMAorI2RlZmluZSBjcHVfaGFzX21pcHM2NHIxCTAKKyNkZWZpbmUgY3B1X2hhc19taXBzNjRyMgkwCisKICNlbmRpZiAvKiBfX0FTTV9NQUNIX0pBX0NQVV9GRUFUVVJFX09WRVJSSURFU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtb2NlbG90My9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1vY2Vsb3QzL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCmluZGV4IDgyNWM1ZjYuLjc4MmI5ODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1vY2Vsb3QzL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1vY2Vsb3QzL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCkBAIC00MCw0ICs0MCw5IEBACiAjZGVmaW5lIGNwdV9pY2FjaGVfbGluZV9zaXplKCkJMzIKICNkZWZpbmUgY3B1X3NjYWNoZV9saW5lX3NpemUoKQkzMgogCisjZGVmaW5lIGNwdV9oYXNfbWlwczMycjEJMAorI2RlZmluZSBjcHVfaGFzX21pcHMzMnIyCTAKKyNkZWZpbmUgY3B1X2hhc19taXBzNjRyMQkwCisjZGVmaW5lIGNwdV9oYXNfbWlwczY0cjIJMAorCiAjZW5kaWYgLyogX19BU01fTUFDSF9KQV9DUFVfRkVBVFVSRV9PVkVSUklERVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXJtMjAwL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXJtMjAwL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCmluZGV4IDc5ZjliMDYuLjkxZTdjZjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1ybTIwMC9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtcm0yMDAvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKQEAgLTQwLDQgKzQwLDkgQEAKICNkZWZpbmUgY3B1X2ljYWNoZV9saW5lX3NpemUoKQkzMgogI2RlZmluZSBjcHVfc2NhY2hlX2xpbmVfc2l6ZSgpCTAJLyogTm8gUy1jYWNoZSBvbiBSNTAwMCBJIHRoaW5rIC4uLiAgKi8KIAorI2RlZmluZSBjcHVfaGFzX21pcHMzMnIxCTAKKyNkZWZpbmUgY3B1X2hhc19taXBzMzJyMgkwCisjZGVmaW5lIGNwdV9oYXNfbWlwczY0cjEJMAorI2RlZmluZSBjcHVfaGFzX21pcHM2NHIyCTAKKwogI2VuZGlmIC8qIF9fQVNNX01BQ0hfUk0yMDBfQ1BVX0ZFQVRVUkVfT1ZFUlJJREVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC15b3NlbWl0ZS9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC15b3NlbWl0ZS9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaAppbmRleCA0NjNkMDUxLi4zMDczNTQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21hY2gteW9zZW1pdGUvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXlvc2VtaXRlL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCkBAIC0zNyw0ICszNyw5IEBACiAjZGVmaW5lIGNwdV9pY2FjaGVfbGluZV9zaXplKCkJMzIKICNkZWZpbmUgY3B1X3NjYWNoZV9saW5lX3NpemUoKQkzMgogCisjZGVmaW5lIGNwdV9oYXNfbWlwczMycjEJMAorI2RlZmluZSBjcHVfaGFzX21pcHMzMnIyCTAKKyNkZWZpbmUgY3B1X2hhc19taXBzNjRyMQkwCisjZGVmaW5lIGNwdV9oYXNfbWlwczY0cjIJMAorCiAjZW5kaWYgLyogX19BU01fTUFDSF9ZT1NFTUlURV9DUFVfRkVBVFVSRV9PVkVSUklERVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9taXBzcmVncy5oIGIvaW5jbHVkZS9hc20tbWlwcy9taXBzcmVncy5oCmluZGV4IDgwMzcwZTAuLjAzNWJhMGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbWlwc3JlZ3MuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL21pcHNyZWdzLmgKQEAgLTEwNTksNyArMTA1OSw3IEBACiAJIgkuc2V0CW5vYXQJCQkJCVxuIglcCiAJIgltb3ZlCSQxLCAlMAkJCQkJXG4iCVwKIAkiCSMgd3Jkc3AgJDEsICV4MQkJCQkJXG4iCVwKLQkiCS53b3JkCTB4N2MyMDA0ZjggfCAoJXgxIDw8IDE1KQkJXG4iCVwKKwkiCS53b3JkCTB4N2MyMDA0ZjggfCAoJXgxIDw8IDExKQkJXG4iCVwKIAkiCS5zZXQJcG9wCQkJCQlcbiIJXAogICAgICAgICA6CQkJCQkJCQlcCiAJOiAiciIgKHZhbCksICJpIiAobWFzaykpOwkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tdXRleC5oIGIvaW5jbHVkZS9hc20tbWlwcy9tdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OGMxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1taXBzL211dGV4LmgKQEAgLTAsMCArMSw5IEBACisvKgorICogUHVsbCBpbiB0aGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIG11dGV4IGZhc3RwYXRoLgorICoKKyAqIFRPRE86IGltcGxlbWVudCBvcHRpbWl6ZWQgcHJpbWl0aXZlcyBpbnN0ZWFkLCBvciBsZWF2ZSB0aGUgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24gaW4gcGxhY2UsIG9yIHBpY2sgdGhlIGF0b21pY194Y2hnKCkgYmFzZWQgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24uIChzZWUgYXNtLWdlbmVyaWMvbXV0ZXgteGNoZy5oIGZvciBkZXRhaWxzKQorICovCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tdXRleC1kZWMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1taXBzL3Byb2Nlc3Nvci5oCmluZGV4IGYxOTgwYzYuLjM5ZDJiZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9wcm9jZXNzb3IuaApAQCAtMTAzLDcgKzEwMyw2IEBACiBzdHJ1Y3QgbWlwc19kc3Bfc3RhdGUgewogCWRzcHJlZ190ICAgICAgICBkc3ByW05VTV9EU1BfUkVHU107CiAJdW5zaWduZWQgaW50ICAgIGRzcGNvbnRyb2w7Ci0JdW5zaWduZWQgc2hvcnQJdXNlZF9kc3A7CiB9OwogCiAjZGVmaW5lIElOSVRfRFNQIHt7MCx9LH0KQEAgLTIwMSwxMSArMjAwLDExIEBACiAKIHVuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiAKLSNkZWZpbmUgX19QVF9SRUcocmVnKSAoKGxvbmcpJigoc3RydWN0IHB0X3JlZ3MgKikwKS0+cmVnIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSkKLSNkZWZpbmUgX19LU1RLX1RPUyh0c2spICgodW5zaWduZWQgbG9uZykodHNrLT50aHJlYWRfaW5mbykgKyBUSFJFQURfU0laRSAtIDMyKQotI2RlZmluZSBLU1RLX0VJUCh0c2spICgqKHVuc2lnbmVkIGxvbmcgKikoX19LU1RLX1RPUyh0c2spICsgX19QVF9SRUcoY3AwX2VwYykpKQotI2RlZmluZSBLU1RLX0VTUCh0c2spICgqKHVuc2lnbmVkIGxvbmcgKikoX19LU1RLX1RPUyh0c2spICsgX19QVF9SRUcocmVnc1syOV0pKSkKLSNkZWZpbmUgS1NUS19TVEFUVVModHNrKSAoKih1bnNpZ25lZCBsb25nICopKF9fS1NUS19UT1ModHNrKSArIF9fUFRfUkVHKGNwMF9zdGF0dXMpKSkKKyNkZWZpbmUgX19LU1RLX1RPUyh0c2spICgodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UodHNrKSArIFRIUkVBRF9TSVpFIC0gMzIpCisjZGVmaW5lIHRhc2tfcHRfcmVncyh0c2spICgoc3RydWN0IHB0X3JlZ3MgKilfX0tTVEtfVE9TKHRzaykgLSAxKQorI2RlZmluZSBLU1RLX0VJUCh0c2spICh0YXNrX3B0X3JlZ3ModHNrKS0+Y3AwX2VwYykKKyNkZWZpbmUgS1NUS19FU1AodHNrKSAodGFza19wdF9yZWdzKHRzayktPnJlZ3NbMjldKQorI2RlZmluZSBLU1RLX1NUQVRVUyh0c2spICh0YXNrX3B0X3JlZ3ModHNrKS0+Y3AwX3N0YXR1cykKIAogI2RlZmluZSBjcHVfcmVsYXgoKQliYXJyaWVyKCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLW1pcHMvc3lzdGVtLmgKaW5kZXggMzMwYzRlNC4uZThlNWQ0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3N5c3RlbS5oCkBAIC0xNTksMTEgKzE1OSwyMSBAQAogZG8gewkJCQkJCQkJCVwKIAlpZiAoY3B1X2hhc19kc3ApCQkJCQkJXAogCQlfX3NhdmVfZHNwKHByZXYpOwkJCQkJXAotCShsYXN0KSA9IHJlc3VtZShwcmV2LCBuZXh0LCBuZXh0LT50aHJlYWRfaW5mbyk7CQkJXAorCShsYXN0KSA9IHJlc3VtZShwcmV2LCBuZXh0LCB0YXNrX3RocmVhZF9pbmZvKG5leHQpKTsJCVwKIAlpZiAoY3B1X2hhc19kc3ApCQkJCQkJXAogCQlfX3Jlc3RvcmVfZHNwKGN1cnJlbnQpOwkJCQkJXAogfSB3aGlsZSgwKQogCisvKgorICogT24gU01QIHN5c3RlbXMsIHdoZW4gdGhlIHNjaGVkdWxlciBkb2VzIG1pZ3JhdGlvbi1jb3N0IGF1dG9kZXRlY3Rpb24sCisgKiBpdCBuZWVkcyBhIHdheSB0byBmbHVzaCBhcyBtdWNoIG9mIHRoZSBDUFUncyBjYWNoZXMgYXMgcG9zc2libGUuCisgKgorICogVE9ETzogZmlsbCB0aGlzIGluIQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2NoZWRfY2FjaGVmbHVzaCh2b2lkKQoreworfQorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX194Y2hnX3UzMih2b2xhdGlsZSBpbnQgKiBtLCB1bnNpZ25lZCBpbnQgdmFsKQogewogCV9fdTMyIHJldHZhbDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLW1pcHMvdGhyZWFkX2luZm8uaAppbmRleCBlNmMyNDQ3Li4xNjEyYjNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy90aHJlYWRfaW5mby5oCkBAIC05Nyw4ICs5Nyw2IEBACiAjZW5kaWYKIAogI2RlZmluZSBmcmVlX3RocmVhZF9pbmZvKGluZm8pIGtmcmVlKGluZm8pCi0jZGVmaW5lIGdldF90aHJlYWRfaW5mbyh0aSkgZ2V0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCi0jZGVmaW5lIHB1dF90aHJlYWRfaW5mbyh0aSkgcHV0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCiAKICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L2NhcGNlbGxhLmggYi9pbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC9jYXBjZWxsYS5oCmluZGV4IDViNTUwODMuLmQxMGZmZGE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC9jYXBjZWxsYS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L2NhcGNlbGxhLmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogIGNhcGNlbGxhLmgsIEluY2x1ZGUgZmlsZSBmb3IgWkFPIE5ldHdvcmtzIENhcGNlbGxhLgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCAgWW9pY2hpIFl1YXNhIDx5b2ljaGlfeXVhc2FAdHJpcGVha3MuY28uanA+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L2U1NS5oIGIvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvZTU1LmgKaW5kZXggZWEzN2I1Ni4uNTU4ZjIyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvZTU1LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvZTU1LmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogIGU1NS5oLCBJbmNsdWRlIGZpbGUgZm9yIENBU0lPIENBU1NJT1BFSUEgRS0xMC8xNS81NS82NS4KICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgIFlvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgIFlvaWNoaSBZdWFzYSA8eW9pY2hpX3l1YXNhQHRyaXBlYWtzLmNvLmpwPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC9naXUuaCBiL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L2dpdS5oCmluZGV4IDg1OTA4ODUuLjgxMDljZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L2dpdS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L2dpdS5oCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqICBJbmNsdWRlIGZpbGUgZm9yIE5FQyBWUjQxMDAgc2VyaWVzIEdlbmVyYWwtcHVycG9zZSBJL08gVW5pdC4KICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA1ICBZb2ljaGkgWXVhc2EgPHl1YXNhQGhoLmlpajR1Lm9yLmpwPgorICogIENvcHlyaWdodCAoQykgMjAwNSAgWW9pY2hpIFl1YXNhIDx5b2ljaGlfeXVhc2FAdHJpcGVha3MuY28uanA+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L21wYzMweC5oIGIvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvbXBjMzB4LmgKaW5kZXggZTZhYzNjOC4uYTZjYmU0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvbXBjMzB4LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvbXBjMzB4LmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogIG1wYzMweC5oLCBJbmNsdWRlIGZpbGUgZm9yIFZpY3RvciBNUC1DMzAzLzMwNC4KICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgIFlvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgIFlvaWNoaSBZdWFzYSA8eW9pY2hpX3l1YXNhQHRyaXBlYWtzLmNvLmpwPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC9wY2kuaCBiL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L3BjaS5oCmluZGV4IGM0NzNhYTcuLjZmYzAxY2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L3BjaS5oCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqICBJbmNsdWRlIGZpbGUgZm9yIE5FQyBWUjQxMDAgc2VyaWVzIFBDSSBDb250cm9sIFVuaXQuCiAgKgotICogIENvcHlyaWdodCAoQykgMjAwNC0yMDA1ICBZb2ljaGkgWXVhc2EgPHl1YXNhQGhoLmlpajR1Lm9yLmpwPgorICogIENvcHlyaWdodCAoQykgMjAwNC0yMDA1ICBZb2ljaGkgWXVhc2EgPHlvaWNoaV95dWFzYUB0cmlwZWFrcy5jby5qcD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvc2l1LmggYi9pbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC9zaXUuaAppbmRleCA4NjVjYzA3Li4xZmNmNmU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC9zaXUuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC9zaXUuaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgSW5jbHVkZSBmaWxlIGZvciBORUMgVlI0MTAwIHNlcmllcyBTZXJpYWwgSW50ZXJmYWNlIFVuaXQuCiAgKgotICogIENvcHlyaWdodCAoQykgMjAwNSAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgIFlvaWNoaSBZdWFzYSA8eW9pY2hpX3l1YXNhQHRyaXBlYWtzLmNvLmpwPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC90YjAyMTkuaCBiL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L3RiMDIxOS5oCmluZGV4IDI3M2M2MzkuLmIzMThiOTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L3RiMDIxOS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L3RiMDIxOS5oCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqICB0YjAyMTkuaCwgSW5jbHVkZSBmaWxlIGZvciBUQU5CQUMgVEIwMjE5LgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCAgWW9pY2hpIFl1YXNhIDx5b2ljaGlfeXVhc2FAdHJpcGVha3MuY28uanA+CiAgKgogICogIE1vZGlmaWVkIGZvciBUQU5CQUMgVEIwMjE5OgogICogIENvcHlyaWdodCAoQykgMjAwMyBNZWdhc29sdXRpb24gSW5jLiAgPG1hdHN1QG1lZ2Fzb2x1dGlvbi5qcD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L3RiMDIyNi5oIGIvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvdGIwMjI2LmgKaW5kZXggMGZmOWE2MC4uMjUxM2Y0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvdGIwMjI2LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvdGIwMjI2LmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogIHRiMDIyNi5oLCBJbmNsdWRlIGZpbGUgZm9yIFRBTkJBQyBUQjAyMjYuCiAgKgotICogIENvcHlyaWdodCAoQykgMjAwMi0yMDA0ICBZb2ljaGkgWXVhc2EgPHl1YXNhQGhoLmlpajR1Lm9yLmpwPgorICogIENvcHlyaWdodCAoQykgMjAwMi0yMDA0ICBZb2ljaGkgWXVhc2EgPHlvaWNoaV95dWFzYUB0cmlwZWFrcy5jby5qcD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvdnI0MXh4LmggYi9pbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC92cjQxeHguaAppbmRleCBiZDI3MjNjLi43MDgyOGQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC92cjQxeHguaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC92cjQxeHguaApAQCAtNyw3ICs3LDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBQYXVsIE11bmR0CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDAyIFRpbWVTeXMgQ29ycC4KLSAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IFlvaWNoaSBZdWFzYSA8eXVhc2FAaGguaWlqNHUub3IuanA+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBZb2ljaGkgWXVhc2EgPHlvaWNoaV95dWFzYUB0cmlwZWFrcy5jby5qcD4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC92cmM0MTczLmggYi9pbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC92cmM0MTczLmgKaW5kZXggYmI3YTg1Yy4uNGQ0MWE5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvdnJjNDE3My5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L3ZyYzQxNzMuaApAQCAtNCw3ICs0LDcgQEAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDAgIE1pY2hhZWwgUi4gTWNEb25hbGQKICAqICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBNb250YXZpc3RhIFNvZnR3YXJlIEluYy4KICAqICAgIEF1dGhvcjogWW9pY2hpIFl1YXNhIDx5eXVhc2FAbXZpc3RhLmNvbSwgb3Igc291cmNlQG12aXN0YS5jb20+Ci0gKiAgQ29weXJpZ2h0IChDKSAyMDA0ICBZb2ljaGkgWXVhc2EgPHl1YXNhQGhoLmlpajR1Lm9yLmpwPgorICogIENvcHlyaWdodCAoQykgMjAwNCAgWW9pY2hpIFl1YXNhIDx5b2ljaGlfeXVhc2FAdHJpcGVha3MuY28uanA+CiAgKiAgQ29weXJpZ2h0IChDKSAyMDA1IFJhbGYgQmFlY2hsZSAocmFsZkBsaW51eC1taXBzLm9yZykKICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L3dvcmtwYWQuaCBiL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L3dvcmtwYWQuaAppbmRleCBkZmUwMWI0Li42YmZhOWMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC93b3JrcGFkLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvd29ya3BhZC5oCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqICB3b3JrcGFkLmgsIEluY2x1ZGUgZmlsZSBmb3IgSUJNIFdvcmtQYWQgejUwLgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCAgWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCAgWW9pY2hpIFl1YXNhIDx5b2ljaGlfeXVhc2FAdHJpcGVha3MuY28uanA+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9hdG9taWMuaAppbmRleCA2NGViZDA4Li4yY2E1NmQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL2F0b21pYy5oCkBAIC0xNjUsNiArMTY1LDcgQEAKIAogLyogZXhwb3J0ZWQgaW50ZXJmYWNlICovCiAjZGVmaW5lIGF0b21pY19jbXB4Y2hnKHYsIG8sIG4pICgoaW50KWNtcHhjaGcoJigodiktPmNvdW50ZXIpLCAobyksIChuKSkpCisjZGVmaW5lIGF0b21pY194Y2hnKHYsIG5ldykgKHhjaGcoJigodiktPmNvdW50ZXIpLCBuZXcpKQogCiAvKioKICAqIGF0b21pY19hZGRfdW5sZXNzIC0gYWRkIHVubGVzcyB0aGUgbnVtYmVyIGlzIGEgZ2l2ZW4gdmFsdWUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9jYWNoZS5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL2NhY2hlLmgKaW5kZXggNWRhNzJlMy4uOTNmMTc5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL2NhY2hlLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL2NhY2hlLmgKQEAgLTI4LDE2ICsyOCwxNSBAQAogI2RlZmluZSBMMV9DQUNIRV9BTElHTih4KSAgICAgICAoKCh4KSsoTDFfQ0FDSEVfQllURVMtMSkpJn4oTDFfQ0FDSEVfQllURVMtMSkpCiAKICNkZWZpbmUgU01QX0NBQ0hFX0JZVEVTIEwxX0NBQ0hFX0JZVEVTCi0jZGVmaW5lIEwxX0NBQ0hFX1NISUZUX01BWCA1CS8qIGxhcmdlc3QgTDEgd2hpY2ggdGhpcyBhcmNoIHN1cHBvcnRzICovCiAKLWV4dGVybiB2b2lkIGZsdXNoX2RhdGFfY2FjaGVfbG9jYWwodm9pZCk7ICAvKiBmbHVzaGVzIGxvY2FsIGRhdGEtY2FjaGUgb25seSAqLwotZXh0ZXJuIHZvaWQgZmx1c2hfaW5zdHJ1Y3Rpb25fY2FjaGVfbG9jYWwodm9pZCk7IC8qIGZsdXNoZXMgbG9jYWwgY29kZS1jYWNoZSBvbmx5ICovCitleHRlcm4gdm9pZCBmbHVzaF9kYXRhX2NhY2hlX2xvY2FsKHZvaWQgKik7ICAvKiBmbHVzaGVzIGxvY2FsIGRhdGEtY2FjaGUgb25seSAqLworZXh0ZXJuIHZvaWQgZmx1c2hfaW5zdHJ1Y3Rpb25fY2FjaGVfbG9jYWwodm9pZCAqKTsgLyogZmx1c2hlcyBsb2NhbCBjb2RlLWNhY2hlIG9ubHkgKi8KICNpZmRlZiBDT05GSUdfU01QCiBleHRlcm4gdm9pZCBmbHVzaF9kYXRhX2NhY2hlKHZvaWQpOyAvKiBmbHVzaGVzIGRhdGEtY2FjaGUgb25seSAoYWxsIHByb2Nlc3NvcnMpICovCiBleHRlcm4gdm9pZCBmbHVzaF9pbnN0cnVjdGlvbl9jYWNoZSh2b2lkKTsgLyogZmx1c2hlcyBpLWNhY2hlIG9ubHkgKGFsbCBwcm9jZXNzb3JzKSAqLwogI2Vsc2UKLSNkZWZpbmUgZmx1c2hfZGF0YV9jYWNoZSBmbHVzaF9kYXRhX2NhY2hlX2xvY2FsCi0jZGVmaW5lIGZsdXNoX2luc3RydWN0aW9uX2NhY2hlIGZsdXNoX2luc3RydWN0aW9uX2NhY2hlX2xvY2FsCisjZGVmaW5lIGZsdXNoX2RhdGFfY2FjaGUoKSBmbHVzaF9kYXRhX2NhY2hlX2xvY2FsKE5VTEwpCisjZGVmaW5lIGZsdXNoX2luc3RydWN0aW9uX2NhY2hlKCkgZmx1c2hfaW5zdHJ1Y3Rpb25fY2FjaGVfbG9jYWwoTlVMTCkKICNlbmRpZgogCiBleHRlcm4gdm9pZCBwYXJpc2NfY2FjaGVfaW5pdCh2b2lkKTsJLyogaW5pdGlhbGl6ZXMgY2FjaGUtZmx1c2hpbmcgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9mdXRleC5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL2Z1dGV4LmgKaW5kZXggOWZlZmY0Y2UuLjZhMzMyYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9mdXRleC5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9mdXRleC5oCkBAIC0xLDUzICsxLDYgQEAKICNpZm5kZWYgX0FTTV9GVVRFWF9ICiAjZGVmaW5lIF9BU01fRlVURVhfSAogCi0jaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2Z1dGV4Lmg+CiAKLSNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1mdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCi17Ci0JaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKLQlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7Ci0JaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7Ci0JaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKLQlpbnQgb2xkdmFsID0gMCwgcmV0OwotCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKLQkJb3BhcmcgPSAxIDw8IG9wYXJnOwotCi0JaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaW5jX3ByZWVtcHRfY291bnQoKTsKLQotCXN3aXRjaCAob3ApIHsKLQljYXNlIEZVVEVYX09QX1NFVDoKLQljYXNlIEZVVEVYX09QX0FERDoKLQljYXNlIEZVVEVYX09QX09SOgotCWNhc2UgRlVURVhfT1BfQU5ETjoKLQljYXNlIEZVVEVYX09QX1hPUjoKLQlkZWZhdWx0OgotCQlyZXQgPSAtRU5PU1lTOwotCX0KLQotCWRlY19wcmVlbXB0X2NvdW50KCk7Ci0KLQlpZiAoIXJldCkgewotCQlzd2l0Y2ggKGNtcCkgewotCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKLQkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0jZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL2lvLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvaW8uaAppbmRleCBiOWJiNTk0Li4wZGIwMGFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvaW8uaApAQCAtNDEsNyArNDEsNyBAQAogI2RlZmluZSBfX3Jhd19jaGVja19hZGRyKGFkZHIpCQkJCQlcCiAJaWYgKCgodW5zaWduZWQgbG9uZylhZGRyID4+IE5ZQkJMRV9TSElGVCkgIT0gMHhlKQlcCiAJCV9fcmF3X2JhZF9hZGRyKGFkZHIpOwkJCVwKLQlhZGRyID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpYWRkciB8ICgweGZVTCA8PCBOWUJCTEVfU0hJRlQpKTsKKwlhZGRyID0gKHZvaWQgX19pb21lbSAqKSgodW5zaWduZWQgbG9uZylhZGRyIHwgKDB4ZlVMIDw8IE5ZQkJMRV9TSElGVCkpOwogI2Vsc2UKICNkZWZpbmUgZ3NjX2NoZWNrX2FkZHIoYWRkcikKICNkZWZpbmUgX19yYXdfY2hlY2tfYWRkcihhZGRyKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL211dGV4LmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvbXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NThjMWY3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL211dGV4LmgKQEAgLTAsMCArMSw5IEBACisvKgorICogUHVsbCBpbiB0aGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIG11dGV4IGZhc3RwYXRoLgorICoKKyAqIFRPRE86IGltcGxlbWVudCBvcHRpbWl6ZWQgcHJpbWl0aXZlcyBpbnN0ZWFkLCBvciBsZWF2ZSB0aGUgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24gaW4gcGxhY2UsIG9yIHBpY2sgdGhlIGF0b21pY194Y2hnKCkgYmFzZWQgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24uIChzZWUgYXNtLWdlbmVyaWMvbXV0ZXgteGNoZy5oIGZvciBkZXRhaWxzKQorICovCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tdXRleC1kZWMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9wYWdlLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvcGFnZS5oCmluZGV4IDQ0ZWFlOWYuLjRhNjc1MmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL3BhZ2UuaApAQCAtMTM1LDYgKzEzNSwxMyBAQAogI2RlZmluZSBwZm5fdmFsaWQocGZuKQkJKChwZm4pIDwgbWF4X21hcG5yKQogI2VuZGlmIC8qIENPTkZJR19ESVNDT05USUdNRU0gKi8KIAorI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKKyNkZWZpbmUgSFBBR0VfU0hJRlQJCTIyCS8qIDRNQiAoaXMgdGhpcyBmaXhlZD8pICovCisjZGVmaW5lIEhQQUdFX1NJWkUgICAgICAJKCgxVUwpIDw8IEhQQUdFX1NISUZUKQorI2RlZmluZSBIUEFHRV9NQVNLCQkofihIUEFHRV9TSVpFIC0gMSkpCisjZGVmaW5lIEhVR0VUTEJfUEFHRV9PUkRFUgkoSFBBR0VfU0hJRlQgLSBQQUdFX1NISUZUKQorI2VuZGlmCisKICNkZWZpbmUgdmlydF9hZGRyX3ZhbGlkKGthZGRyKQlwZm5fdmFsaWQoX19wYShrYWRkcikgPj4gUEFHRV9TSElGVCkKIAogI2RlZmluZSBwYWdlX3RvX3BoeXMocGFnZSkJKHBhZ2VfdG9fcGZuKHBhZ2UpIDw8IFBBR0VfU0hJRlQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvcGNpLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvcGNpLmgKaW5kZXggZmEzOWQwNy4uZjI3NzI1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9wY2kuaApAQCAtODQsMTEgKzg0LDE3IEBACiAvKgogKiogQ29udmVydCBiZXR3ZWVuIFBDSSAoSU9fVklFVykgYWRkcmVzc2VzIGFuZCBwcm9jZXNzb3IgKFBBX1ZJRVcpIGFkZHJlc3Nlcy4KICoqIFNlZSBwY2liaW9zLmMgZm9yIG1vcmUgY29udmVyc2lvbnMgdXNlZCBieSBHZW5lcmljIFBDSSBjb2RlLgorKioKKyoqIFBsYXRmb3JtIGNoYXJhY3RlcmlzdGljcy9maXJtd2FyZSBndWFyYW50ZWUgdGhhdAorKioJKDEpIFBBX1ZJRVcgLSBJT19WSUVXID0gbG1taW9fb2Zmc2V0IGZvciBib3RoIExNTUlPIGFuZCBFTE1NSU8KKyoqCSgyKSBQQV9WSUVXID09IElPX1ZJRVcgZm9yIEdNTUlPCiAqLwogI2RlZmluZSBQQ0lfQlVTX0FERFIoaGJhLGEpCShQQ0lfSVNfTE1NSU8oaGJhLGEpCVwKIAkJPyAgKChhKSAtIGhiYS0+bG1taW9fc3BhY2Vfb2Zmc2V0KQkvKiBtYW5nbGUgTE1NSU8gKi8gXAogCQk6IChhKSkJCQkJCS8qIEdNTUlPICovCi0jZGVmaW5lIFBDSV9IT1NUX0FERFIoaGJhLGEpCSgoYSkgKyBoYmEtPmxtbWlvX3NwYWNlX29mZnNldCkKKyNkZWZpbmUgUENJX0hPU1RfQUREUihoYmEsYSkJKCgoYSkgJiBQQ0lfRl9FWFRFTkQpID09IDAgXAorCQk/IChhKSArIGhiYS0+bG1taW9fc3BhY2Vfb2Zmc2V0IFwKKwkJOiAoYSkpCiAKICNlbHNlCS8qICFDT05GSUdfNjRCSVQgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL3Byb2Nlc3Nvci5oCmluZGV4IGFhZTQwZTguLjg5ZjJmMWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvcHJvY2Vzc29yLmgKQEAgLTE0NCwxNiArMTQ0LDE2IEBACiAgICAgICAgIH0pCiAKICNkZWZpbmUgSU5JVF9USFJFQUQgeyBcCi0JcmVnczoJewlncjogeyAwLCB9LCBcCi0JCQlmcjogeyAwLCB9LCBcCi0JCQlzcjogeyAwLCB9LCBcCi0JCQlpYXNxOiB7IDAsIH0sIFwKLQkJCWlhb3E6IHsgMCwgfSwgXAotCQkJY3IyNzogMCwgXAorCS5yZWdzID0gewkuZ3IJPSB7IDAsIH0sIFwKKwkJCS5mcgk9IHsgMCwgfSwgXAorCQkJLnNyCT0geyAwLCB9LCBcCisJCQkuaWFzcQk9IHsgMCwgfSwgXAorCQkJLmlhb3EJPSB7IDAsIH0sIFwKKwkJCS5jcjI3CT0gMCwgXAogCQl9LCBcCi0JdGFza19zaXplOiAgICAgIERFRkFVTFRfVEFTS19TSVpFLCBcCi0JbWFwX2Jhc2U6ICAgICAgIERFRkFVTFRfTUFQX0JBU0UsIFwKLQlmbGFnczogICAgICAgICAgMCBcCisJLnRhc2tfc2l6ZQk9IERFRkFVTFRfVEFTS19TSVpFLCBcCisJLm1hcF9iYXNlCT0gREVGQVVMVF9NQVBfQkFTRSwgXAorCS5mbGFncwkJPSAwIFwKIAl9CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2Mvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1wYXJpc2Mvc3lzdGVtLmgKaW5kZXggZjM5MjhkMy4uYTVhOTczYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9zeXN0ZW0uaApAQCAtNDksNiArNDksMTUgQEAKIAkobGFzdCkgPSBfc3dpdGNoX3RvKHByZXYsIG5leHQpOwkJCVwKIH0gd2hpbGUoMCkKIAorLyoKKyAqIE9uIFNNUCBzeXN0ZW1zLCB3aGVuIHRoZSBzY2hlZHVsZXIgZG9lcyBtaWdyYXRpb24tY29zdCBhdXRvZGV0ZWN0aW9uLAorICogaXQgbmVlZHMgYSB3YXkgdG8gZmx1c2ggYXMgbXVjaCBvZiB0aGUgQ1BVJ3MgY2FjaGVzIGFzIHBvc3NpYmxlLgorICoKKyAqIFRPRE86IGZpbGwgdGhpcyBpbiEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNjaGVkX2NhY2hlZmx1c2godm9pZCkKK3sKK30KIAogCiAvKiBpbnRlcnJ1cHQgY29udHJvbCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvdGhyZWFkX2luZm8uaAppbmRleCA1N2JiYjc2Li5hYzMyZjE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvdGhyZWFkX2luZm8uaApAQCAtNDMsOSArNDMsNiBAQAogI2RlZmluZSBhbGxvY190aHJlYWRfaW5mbyh0c2spICgoc3RydWN0IHRocmVhZF9pbmZvICopIFwKIAkJCV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgVEhSRUFEX09SREVSKSkKICNkZWZpbmUgZnJlZV90aHJlYWRfaW5mbyh0aSkgICAgZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgKHRpKSwgVEhSRUFEX09SREVSKQotI2RlZmluZSBnZXRfdGhyZWFkX2luZm8odGkpICAgICBnZXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKLSNkZWZpbmUgcHV0X3RocmVhZF9pbmZvKHRpKSAgICAgcHV0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCi0KIAogLyogaG93IHRvIGdldCB0aGUgdGhyZWFkIGluZm9ybWF0aW9uIHN0cnVjdCBmcm9tIEMgKi8KICNkZWZpbmUgY3VycmVudF90aHJlYWRfaW5mbygpCSgoc3RydWN0IHRocmVhZF9pbmZvICopbWZjdGwoMzApKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL3RsYmZsdXNoLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvdGxiZmx1c2guaAppbmRleCBjOWVjMzljLi44MjU5OTRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvdGxiZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvdGxiZmx1c2guaApAQCAtMjIsNiArMjIsNyBAQAogI2RlZmluZSBwdXJnZV90bGJfZW5kKHgpIHNwaW5fdW5sb2NrKCZwYV90bGJfbG9jaykKIAogZXh0ZXJuIHZvaWQgZmx1c2hfdGxiX2FsbCh2b2lkKTsKK2V4dGVybiB2b2lkIGZsdXNoX3RsYl9hbGxfbG9jYWwodm9pZCAqKTsKIAogLyoKICAqIGZsdXNoX3RsYl9tbSgpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2Fic19hZGRyLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2Fic19hZGRyLmgKaW5kZXggMTg0MTUxMC4uYzVjMzI1OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9hYnNfYWRkci5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvYWJzX2FkZHIuaApAQCAtMSw1ICsxLDYgQEAKICNpZm5kZWYgX0FTTV9QT1dFUlBDX0FCU19BRERSX0gKICNkZWZpbmUgX0FTTV9QT1dFUlBDX0FCU19BRERSX0gKKyNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIApAQCAtNzAsNCArNzEsNSBAQAogI2RlZmluZSBpc2VyaWVzX2h2X2FkZHIodmlydGFkZHIpCVwKIAkoMHg4MDAwMDAwMDAwMDAwMDAwIHwgdmlydF90b19hYnModmlydGFkZHIpKQogCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19BQlNfQUREUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2FncC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9hZ3AuaAppbmRleCA4ODViNDYzLi5lNWNjYWNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2FncC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvYWdwLmgKQEAgLTEsNSArMSw2IEBACiAjaWZuZGVmIF9BU01fUE9XRVJQQ19BR1BfSAogI2RlZmluZSBfQVNNX1BPV0VSUENfQUdQX0gKKyNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxhc20vaW8uaD4KIApAQCAtMTgsNCArMTksNSBAQAogI2RlZmluZSBmcmVlX2dhdHRfcGFnZXModGFibGUsIG9yZGVyKQlcCiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykodGFibGUpLCAob3JkZXIpKQogCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19BR1BfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9hc20tY29tcGF0LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2FzbS1jb21wYXQuaAppbmRleCA4YjEzM2VmLi44ZTY0YmUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2FzbS1jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2FzbS1jb21wYXQuaApAQCAtMSw3ICsxLDYgQEAKICNpZm5kZWYgX0FTTV9QT1dFUlBDX0FTTV9DT01QQVRfSAogI2RlZmluZSBfQVNNX1BPV0VSUENfQVNNX0NPTVBBVF9ICiAKLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KIAogI2lmZGVmIF9fQVNTRU1CTFlfXwpAQCAtNDEsNiArNDAsNyBAQAogCiAjZW5kaWYKIAorI2lmZGVmIF9fS0VSTkVMX18KICNpZmRlZiBDT05GSUdfSUJNNDA1X0VSUjc3CiAvKiBFcnJhdHVtICM3NyBvbiB0aGUgNDA1IG1lYW5zIHdlIG5lZWQgYSBzeW5jIG9yIGRjYnQgYmVmb3JlIGV2ZXJ5CiAgKiBzdHdjeC4gIFRoZSBvbGQgQVRPTUlDX1NZTkNfRklYIGNvdmVyZWQgc29tZSBidXQgbm90IGFsbCBvZiB0aGlzLgpAQCAtNTEsNSArNTEsNiBAQAogI2RlZmluZSBQUEM0MDVfRVJSNzcocmEscmIpCiAjZGVmaW5lIFBQQzQwNV9FUlI3N19TWU5DCiAjZW5kaWYKKyNlbmRpZgogCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0FTTV9DT01QQVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvYXRvbWljLmgKaW5kZXggYWUzOTVhMC4uMTQ3YTM4ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2F0b21pYy5oCkBAIC0zNiw3ICszNiw3IEBACiAJaW50IHQ7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQlFSUVJT19PTl9TTVAKKwlMV1NZTkNfT05fU01QCiAiMToJbHdhcngJJTAsMCwlMgkJIyBhdG9taWNfYWRkX3JldHVyblxuXAogCWFkZAklMCwlMSwlMFxuIgogCVBQQzQwNV9FUlI3NygwLCUyKQpAQCAtNzIsNyArNzIsNyBAQAogCWludCB0OwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JRUlFSU9fT05fU01QCisJTFdTWU5DX09OX1NNUAogIjE6CWx3YXJ4CSUwLDAsJTIJCSMgYXRvbWljX3N1Yl9yZXR1cm5cblwKIAlzdWJmCSUwLCUxLCUwXG4iCiAJUFBDNDA1X0VSUjc3KDAsJTIpCkBAIC0xMDYsNyArMTA2LDcgQEAKIAlpbnQgdDsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCUVJRUlPX09OX1NNUAorCUxXU1lOQ19PTl9TTVAKICIxOglsd2FyeAklMCwwLCUxCQkjIGF0b21pY19pbmNfcmV0dXJuXG5cCiAJYWRkaWMJJTAsJTAsMVxuIgogCVBQQzQwNV9FUlI3NygwLCUxKQpAQCAtMTUwLDcgKzE1MCw3IEBACiAJaW50IHQ7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQlFSUVJT19PTl9TTVAKKwlMV1NZTkNfT05fU01QCiAiMToJbHdhcngJJTAsMCwlMQkJIyBhdG9taWNfZGVjX3JldHVyblxuXAogCWFkZGljCSUwLCUwLC0xXG4iCiAJUFBDNDA1X0VSUjc3KDAsJTEpCkBAIC0xNjUsNiArMTY1LDcgQEAKIH0KIAogI2RlZmluZSBhdG9taWNfY21weGNoZyh2LCBvLCBuKSAoKGludCljbXB4Y2hnKCYoKHYpLT5jb3VudGVyKSwgKG8pLCAobikpKQorI2RlZmluZSBhdG9taWNfeGNoZyh2LCBuZXcpICh4Y2hnKCYoKHYpLT5jb3VudGVyKSwgbmV3KSkKIAogLyoqCiAgKiBhdG9taWNfYWRkX3VubGVzcyAtIGFkZCB1bmxlc3MgdGhlIG51bWJlciBpcyBhIGdpdmVuIHZhbHVlCkBAIC0xNzUsMTkgKzE3NiwxOSBAQAogICogQXRvbWljYWxseSBhZGRzIEBhIHRvIEB2LCBzbyBsb25nIGFzIGl0IHdhcyBub3QgQHUuCiAgKiBSZXR1cm5zIG5vbi16ZXJvIGlmIEB2IHdhcyBub3QgQHUsIGFuZCB6ZXJvIG90aGVyd2lzZS4KICAqLwotI2RlZmluZSBhdG9taWNfYWRkX3VubGVzcyh2LCBhLCB1KQkJCQkJCQkgXAotKHsJCQkJCQkJCQkJCQkJCQkgXAotCSAgIGludCBjLCBvbGQ7CQkJCQkJCQkJCQkgXAotCSAgIGMgPSBhdG9taWNfcmVhZCh2KTsJCQkJCQkJCQkgXAotCSAgIGZvciAoOzspIHsJCQkJCQkJCQkJCSAgXAotCQkJICAgaWYgKHVubGlrZWx5KGMgPT0gKHUpKSkJCQkJCQkgXAotCQkJCQkgICBicmVhazsJCQkJCQkJCSAgXAotCQkJICAgb2xkID0gYXRvbWljX2NtcHhjaGcoKHYpLCBjLCBjICsgKGEpKTsJCSAgXAotCQkJICAgaWYgKGxpa2VseShvbGQgPT0gYykpCQkJCQkJICAgXAotCQkJCQkgICBicmVhazsJCQkJCQkJCSAgXAotCQkJICAgYyA9IG9sZDsJCQkJCQkJCQkJXAotCSAgIH0JCQkJCQkJCQkJCQkJICAgXAotCSAgIGMgIT0gKHUpOwkJCQkJCQkJCQkJICAgXAorI2RlZmluZSBhdG9taWNfYWRkX3VubGVzcyh2LCBhLCB1KQkJCVwKKyh7CQkJCQkJCVwKKwlpbnQgYywgb2xkOwkJCQkJXAorCWMgPSBhdG9taWNfcmVhZCh2KTsJCQkJXAorCWZvciAoOzspIHsJCQkJCVwKKwkJaWYgKHVubGlrZWx5KGMgPT0gKHUpKSkJCQlcCisJCQlicmVhazsJCQkJXAorCQlvbGQgPSBhdG9taWNfY21weGNoZygodiksIGMsIGMgKyAoYSkpOwlcCisJCWlmIChsaWtlbHkob2xkID09IGMpKQkJCVwKKwkJCWJyZWFrOwkJCQlcCisJCWMgPSBvbGQ7CQkJCVwKKwl9CQkJCQkJXAorCWMgIT0gKHUpOwkJCQkJXAogfSkKICNkZWZpbmUgYXRvbWljX2luY19ub3RfemVybyh2KSBhdG9taWNfYWRkX3VubGVzcygodiksIDEsIDApCiAKQEAgLTIwMyw3ICsyMDQsNyBAQAogCWludCB0OwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JRUlFSU9fT05fU01QCisJTFdTWU5DX09OX1NNUAogIjE6CWx3YXJ4CSUwLDAsJTEJCSMgYXRvbWljX2RlY19pZl9wb3NpdGl2ZVxuXAogCWFkZGljLgklMCwlMCwtMVxuXAogCWJsdC0JMmZcbiIKQEAgLTI1Miw3ICsyNTMsNyBAQAogCWxvbmcgdDsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCUVJRUlPX09OX1NNUAorCUxXU1lOQ19PTl9TTVAKICIxOglsZGFyeAklMCwwLCUyCQkjIGF0b21pYzY0X2FkZF9yZXR1cm5cblwKIAlhZGQJJTAsJTEsJTBcblwKIAlzdGRjeC4JJTAsMCwlMiBcblwKQEAgLTI4Niw3ICsyODcsNyBAQAogCWxvbmcgdDsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCUVJRUlPX09OX1NNUAorCUxXU1lOQ19PTl9TTVAKICIxOglsZGFyeAklMCwwLCUyCQkjIGF0b21pYzY0X3N1Yl9yZXR1cm5cblwKIAlzdWJmCSUwLCUxLCUwXG5cCiAJc3RkY3guCSUwLDAsJTIgXG5cCkBAIC0zMTgsNyArMzE5LDcgQEAKIAlsb25nIHQ7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQlFSUVJT19PTl9TTVAKKwlMV1NZTkNfT05fU01QCiAiMToJbGRhcngJJTAsMCwlMQkJIyBhdG9taWM2NF9pbmNfcmV0dXJuXG5cCiAJYWRkaWMJJTAsJTAsMVxuXAogCXN0ZGN4LgklMCwwLCUxIFxuXApAQCAtMzYwLDcgKzM2MSw3IEBACiAJbG9uZyB0OwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JRUlFSU9fT05fU01QCisJTFdTWU5DX09OX1NNUAogIjE6CWxkYXJ4CSUwLDAsJTEJCSMgYXRvbWljNjRfZGVjX3JldHVyblxuXAogCWFkZGljCSUwLCUwLC0xXG5cCiAJc3RkY3guCSUwLDAsJTFcblwKQEAgLTM4NSw3ICszODYsNyBAQAogCWxvbmcgdDsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCUVJRUlPX09OX1NNUAorCUxXU1lOQ19PTl9TTVAKICIxOglsZGFyeAklMCwwLCUxCQkjIGF0b21pYzY0X2RlY19pZl9wb3NpdGl2ZVxuXAogCWFkZGljLgklMCwlMCwtMVxuXAogCWJsdC0JMmZcblwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvYml0b3BzLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2JpdG9wcy5oCmluZGV4IDE5OTZlYWEuLmJmNjk0MWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvYml0b3BzLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9iaXRvcHMuaApAQCAtMTEyLDcgKzExMiw3IEBACiAJdW5zaWduZWQgbG9uZyAqcCA9ICgodW5zaWduZWQgbG9uZyAqKWFkZHIpICsgQklUT1BfV09SRChucik7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQlFSUVJT19PTl9TTVAKKwlMV1NZTkNfT05fU01QCiAiMToiCVBQQ19MTEFSWCAiJTAsMCwlMwkJIyB0ZXN0X2FuZF9zZXRfYml0XG4iCiAJIm9yCSUxLCUwLCUyIFxuIgogCVBQQzQwNV9FUlI3NygwLCUzKQpAQCAtMTM0LDcgKzEzNCw3IEBACiAJdW5zaWduZWQgbG9uZyAqcCA9ICgodW5zaWduZWQgbG9uZyAqKWFkZHIpICsgQklUT1BfV09SRChucik7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQlFSUVJT19PTl9TTVAKKwlMV1NZTkNfT05fU01QCiAiMToiCVBQQ19MTEFSWCAiJTAsMCwlMwkJIyB0ZXN0X2FuZF9jbGVhcl9iaXRcbiIKIAkiYW5kYwklMSwlMCwlMiBcbiIKIAlQUEM0MDVfRVJSNzcoMCwlMykKQEAgLTE1Niw3ICsxNTYsNyBAQAogCXVuc2lnbmVkIGxvbmcgKnAgPSAoKHVuc2lnbmVkIGxvbmcgKilhZGRyKSArIEJJVE9QX1dPUkQobnIpOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JRUlFSU9fT05fU01QCisJTFdTWU5DX09OX1NNUAogIjE6IglQUENfTExBUlggIiUwLDAsJTMJCSMgdGVzdF9hbmRfY2hhbmdlX2JpdFxuIgogCSJ4b3IJJTEsJTAsJTIgXG4iCiAJUFBDNDA1X0VSUjc3KDAsJTMpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2Jvb3R4LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2Jvb3R4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiODJlMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvYm9vdHguaApAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHN0cnVjdHVyZSBwYXNzZWQgZnJvbSB0aGUgQm9vdFggYXBwbGljYXRpb24KKyAqIChmb3IgTWFjT1MpIHdoZW4gaXQgaXMgdXNlZCB0byBib290IExpbnV4LgorICoKKyAqIFdyaXR0ZW4gYnkgQmVuamFtaW4gSGVycmVuc2NobWlkdC4KKyAqLworCisKKyNpZm5kZWYgX19BU01fQk9PVFhfSF9fCisjZGVmaW5lIF9fQVNNX0JPT1RYX0hfXworCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZmRlZiBtYWNpbnRvc2gKKyNpbmNsdWRlIDxUeXBlcy5oPgorI2luY2x1ZGUgImxpbnV4X3R5cGVfZGVmcy5oIgorI2VuZGlmCisKKyNpZmRlZiBtYWNpbnRvc2gKKy8qIEFsbCB0aGlzIHJlcXVpcmVzIFBvd2VyUEMgYWxpZ25tZW50ICovCisjcHJhZ21hIG9wdGlvbnMgYWxpZ249cG93ZXIKKyNlbmRpZgorCisvKiBPbiBrZXJuZWwgZW50cnk6CisgKgorICogcjMgPSAweDQyNmY2ZjU4ICAgICgnQm9vWCcpCisgKiByNCA9IHBvaW50ZXIgdG8gYm9vdF9pbmZvcworICogcjUgPSBOVUxMCisgKgorICogRGF0YSBhbmQgaW5zdHJ1Y3Rpb24gdHJhbnNsYXRpb24gZGlzYWJsZWQsIGludGVycnVwdHMKKyAqIGRpc2FibGVkLCBrZXJuZWwgbG9hZGVkIGF0IHBoeXNpY2FsIDB4MDAwMDAwMDAgb24gUENJCisgKiBtYWNoaW5lcyAod2lsbCBiZSBkaWZmZXJlbnQgb24gTnVCdXMpLgorICovCisKKyNkZWZpbmUgQk9PVF9JTkZPX1ZFUlNJT04gICAgICAgICAgICAgICA1CisjZGVmaW5lIEJPT1RfSU5GT19DT01QQVRJQkxFX1ZFUlNJT04gICAgMQorCisvKiBCaXQgaW4gdGhlIGFyY2hpdGVjdHVyZSBmbGFnIG1hc2suIE1vcmUgdG8gYmUgZGVmaW5lZCBpbgorICAgZnV0dXJlIHZlcnNpb25zLiBOb3RlIHRoYXQgZWl0aGVyIEJPT1RfQVJDSF9QQ0kgb3IKKyAgIEJPT1RfQVJDSF9OVUJVUyBpcyBzZXQuIFRoZSBvdGhlciBCT09UX0FSQ0hfTlVCVVNfeHh4IGFyZQorICAgc2V0IGFkZGl0aW9uYWxseSB3aGVuIEJPT1RfQVJDSF9OVUJVUyBpcyBzZXQuCisgKi8KKyNkZWZpbmUgQk9PVF9BUkNIX1BDSSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKKyNkZWZpbmUgQk9PVF9BUkNIX05VQlVTICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKKyNkZWZpbmUgQk9PVF9BUkNIX05VQlVTX1BETSAgICAgICAgICAgICAweDAwMDAwMDEwVUwKKyNkZWZpbmUgQk9PVF9BUkNIX05VQlVTX1BFUkZPUk1BICAgICAgICAweDAwMDAwMDIwVUwKKyNkZWZpbmUgQk9PVF9BUkNIX05VQlVTX1BPV0VSQk9PSyAgICAgICAweDAwMDAwMDQwVUwKKworLyogIE1heGltdW0gbnVtYmVyIG9mIHJhbmdlcyBpbiBwaHlzIG1lbW9yeSBtYXAgKi8KKyNkZWZpbmUgTUFYX01FTV9NQVBfU0laRQkJCQkyNgorCisvKiBUaGlzIGlzIHRoZSBmb3JtYXQgb2YgYW4gZWxlbWVudCBpbiB0aGUgcGh5c2ljYWwgbWVtb3J5IG1hcC4gTm90ZSB0aGF0CisgICB0aGUgbWFwIGlzIG9wdGlvbmFsIGFuZCBjdXJyZW50IEJvb3RYIHdpbGwgb25seSBidWlsZCBpdCBmb3IgcHJlLVBDSQorICAgbWFjaGluZXMgKi8KK3R5cGVkZWYgc3RydWN0IGJvb3RfaW5mb19tYXBfZW50cnkKK3sKKyAgICBfX3UzMiAgICAgICBwaHlzQWRkcjsgICAgICAgICAgICAgICAgLyogUGh5c2ljYWwgc3RhcnRpbmcgYWRkcmVzcyAqLworICAgIF9fdTMyICAgICAgIHNpemU7ICAgICAgICAgICAgICAgICAgICAvKiBTaXplIGluIGJ5dGVzICovCit9IGJvb3RfaW5mb19tYXBfZW50cnlfdDsKKworCisvKiBIZXJlIGFyZSB0aGUgYm9vdCBpbmZvcm1hdGlvbnMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoZSBib290c3RyYXAKKyAqIE5vdGUgdGhhdCB0aGUga2VybmVsIGFyZ3VtZW50cyBhbmQgdGhlIGRldmljZSB0cmVlIGFyZSBhcHBlbmRlZAorICogYXQgdGhlIGVuZCBvZiB0aGlzIHN0cnVjdHVyZS4gKi8KK3R5cGVkZWYgc3RydWN0IGJvb3RfaW5mb3MKK3sKKyAgICAvKiBWZXJzaW9uIG9mIHRoaXMgc3RydWN0dXJlICovCisgICAgX191MzIgICAgICAgdmVyc2lvbjsKKyAgICAvKiBiYWNrd2FyZCBjb21wYXRpYmxlIGRvd24gdG8gdmVyc2lvbjogKi8KKyAgICBfX3UzMiAgICAgICBjb21wYXRpYmxlX3ZlcnNpb247CisKKyAgICAvKiBORVcgKHZlcnMuIDIpIHRoaXMgaG9sZHMgdGhlIGN1cnJlbnQgX2xvZ2ljYWxfIGJhc2UgYWRkciBvZgorICAgICAgIHRoZSBmcmFtZSBidWZmZXIgKGZvciB1c2UgYnkgZWFybHkgYm9vdCBtZXNzYWdlKSAqLworICAgIF9fdTgqICAgICAgIGxvZ2ljYWxEaXNwbGF5QmFzZTsKKworICAgIC8qIE5FVyAodmVycy4gNCkgQXBwbGUncyBtYWNoaW5lIGlkZW50aWZpY2F0aW9uICovCisgICAgX191MzIgICAgICAgbWFjaGluZUlEOworCisgICAgLyogTkVXICh2ZXJzLiA0KSBEZXRlY3RlZCBodyBhcmNoaXRlY3R1cmUgKi8KKyAgICBfX3UzMiAgICAgICBhcmNoaXRlY3R1cmU7CisKKyAgICAvKiBUaGUgZGV2aWNlIHRyZWUgKGludGVybmFsIGFkZHJlc3NlcyByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0cmVlLAorICAgICAqIGRldmljZSB0cmVlIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgc3RydWN0dXJlKS4KKyAgICAgKiBPbiBwcmUtUENJIG1hY2ludG9zaCAoQk9PVF9BUkNIX1BDSSBiaXQgc2V0IHRvIDAgaW4gYXJjaGl0ZWN0dXJlKSwgdGhpcworICAgICAqIGZpZWxkIGlzIDAuCisgICAgICovCisgICAgX191MzIgICAgICAgZGV2aWNlVHJlZU9mZnNldDsgICAgICAgIC8qIERldmljZSB0cmVlIG9mZnNldCAqLworICAgIF9fdTMyICAgICAgIGRldmljZVRyZWVTaXplOyAgICAgICAgICAvKiBTaXplIG9mIHRoZSBkZXZpY2UgdHJlZSAqLworCisgICAgLyogU29tZSBpbmZvcyBhYm91dCB0aGUgY3VycmVudCBNYWNPUyBkaXNwbGF5ICovCisgICAgX191MzIgICAgICAgZGlzcERldmljZVJlY3RbNF07ICAgICAgIC8qIGxlZnQsdG9wLHJpZ2h0LGJvdHRvbSAqLworICAgIF9fdTMyICAgICAgIGRpc3BEZXZpY2VEZXB0aDsgICAgICAgICAvKiAoOCwgMTYgb3IgMzIpICovCisgICAgX191OCogICAgICAgZGlzcERldmljZUJhc2U7ICAgICAgICAgIC8qIGJhc2UgYWRkcmVzcyAocGh5c2ljYWwpICovCisgICAgX191MzIgICAgICAgZGlzcERldmljZVJvd0J5dGVzOyAgICAgIC8qIHJvd2J5dGVzIChpbiBieXRlcykgKi8KKyAgICBfX3UzMiAgICAgICBkaXNwRGV2aWNlQ29sb3JzT2Zmc2V0OyAgLyogQ29sb3JtYXAgKDggYml0cyBvbmx5KSBvciAwICgqKSAqLworICAgIC8qIE9wdGlvbmFsIG9mZnNldCBpbiB0aGUgcmVnaXN0cnkgdG8gdGhlIGN1cnJlbnQKKyAgICAgKiBNYWNPUyBkaXNwbGF5LiAoQ2FuIGJlIDAgd2hlbiBub3QgZGV0ZWN0ZWQpICovCisgICAgIF9fdTMyICAgICAgZGlzcERldmljZVJlZ0VudHJ5T2Zmc2V0OworCisgICAgLyogT3B0aW9uYWwgcG9pbnRlciB0byBib290IHJhbWRpc2sgKG9mZnNldCBmcm9tIHRoaXMgc3RydWN0dXJlKSAqLworICAgIF9fdTMyICAgICAgIHJhbURpc2s7CisgICAgX191MzIgICAgICAgcmFtRGlza1NpemU7ICAgICAgICAgICAgIC8qIHNpemUgb2YgcmFtZGlzayBpbWFnZSAqLworCisgICAgLyogS2VybmVsIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgKG9mZnNldCBmcm9tIHRoaXMgc3RydWN0dXJlKSAqLworICAgIF9fdTMyICAgICAgIGtlcm5lbFBhcmFtc09mZnNldDsKKworICAgIC8qIEFMTCBCRUxPVyBORVcgKHZlcnMuIDQpICovCisKKyAgICAvKiBUaGlzIGRlZmluZXMgdGhlIHBoeXNpY2FsIG1lbW9yeS4gVmFsaWQgd2l0aCBCT09UX0FSQ0hfTlVCVVMgZmxhZworICAgICAgIChub24tUENJKSBvbmx5LiBPbiBQQ0ksIG1lbW9yeSBpcyBjb250aWd1b3VzIGFuZCBpdCdzIHNpemUgaXMgaW4gdGhlCisgICAgICAgZGV2aWNlLXRyZWUuICovCisgICAgYm9vdF9pbmZvX21hcF9lbnRyeV90CisgICAgCSAgICAgICAgcGh5c01lbW9yeU1hcFtNQVhfTUVNX01BUF9TSVpFXTsgLyogV2hlcmUgdGhlIHBoeXMgbWVtb3J5IGlzICovCisgICAgX191MzIgICAgICAgcGh5c01lbW9yeU1hcFNpemU7ICAgICAgICAgICAgICAgLyogSG93IG1hbnkgZW50cmllcyBpbiBtYXAgKi8KKworCisgICAgLyogVGhlIGZyYW1lYnVmZmVyIHNpemUgKG9wdGlvbmFsLCBjdXJyZW50bHkgMCkgKi8KKyAgICBfX3UzMiAgICAgICBmcmFtZUJ1ZmZlclNpemU7ICAgICAgICAgLyogUmVwcmVzZW50cyBhIG1heCBzaXplLCBjYW4gYmUgMC4gKi8KKworICAgIC8qIE5FVyAodmVycy4gNSkgKi8KKworICAgIC8qIFRvdGFsIHBhcmFtcyBzaXplIChhcmdzICsgY29sb3JtYXAgKyBkZXZpY2UgdHJlZSArIHJhbWRpc2spICovCisgICAgX191MzIgICAgICAgdG90YWxQYXJhbXNTaXplOworCit9IGJvb3RfaW5mb3NfdDsKKworI2lmZGVmIF9fS0VSTkVMX18KKy8qICgqKSBUaGUgZm9ybWF0IG9mIHRoZSBjb2xvcm1hcCBpcyAyNTYgKiAzICogMiBieXRlcy4gRWFjaCBjb2xvciBpbmRleAorICogaXMgcmVwcmVzZW50ZWQgYnkgMyBzaG9ydCB3b3JkcyBjb250YWluaW5nIGEgMTYgYml0cyAodW5zaWduZWQpIGNvbG9yCisgKiBjb21wb25lbnQuIExhdGVyIHZlcnNpb25zIG1heSBjb250YWluIHRoZSBnYW1tYSB0YWJsZSBmb3IgZGlyZWN0LWNvbG9yCisgKiBkZXZpY2VzIGhlcmUuCisgKi8KKyNkZWZpbmUgQk9PVFhfQ09MT1JUQUJMRV9TSVpFICAgICgyNTZVTCozVUwqMlVMKQorCisvKiBCb290WCBwYXNzZXMgdGhlIGRldmljZS10cmVlIHVzaW5nIGEgZm9ybWF0IHRoYXQgY29tZXMgZnJvbSBlYXJsaWVyCisgKiBwcGMzMiBrZXJuZWxzLiBUaGlzIHVzZWQgdG8gbWF0Y2ggd2hhdCBpcyBpbiBwcm9tLmgsIGJ1dCBub3QgYW55bW9yZQorICogc28gd2Ugbm93IGRlZmluZSBpdCBoZXJlCisgKi8KK3N0cnVjdCBib290eF9kdF9wcm9wIHsKKwl1MzIJbmFtZTsKKwlpbnQJbGVuZ3RoOworCXUzMgl2YWx1ZTsKKwl1MzIJbmV4dDsKK307CisKK3N0cnVjdCBib290eF9kdF9ub2RlIHsKKwl1MzIJdW51c2VkMDsKKwl1MzIJdW51c2VkMTsKKwl1MzIJcGhhbmRsZTsJLyogbm90IHJlYWxseSBhdmFpbGFibGUgKi8KKwl1MzIJdW51c2VkMjsKKwl1MzIJdW51c2VkMzsKKwl1MzIJdW51c2VkNDsKKwl1MzIJdW51c2VkNTsKKwl1MzIJZnVsbF9uYW1lOworCXUzMglwcm9wZXJ0aWVzOworCXUzMglwYXJlbnQ7CisJdTMyCWNoaWxkOworCXUzMglzaWJsaW5nOworCXUzMgluZXh0OworCXUzMglhbGxuZXh0OworfTsKKworZXh0ZXJuIHZvaWQgYm9vdHhfaW5pdCh1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHBoeXMpOworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjaWZkZWYgbWFjaW50b3NoCisjcHJhZ21hIG9wdGlvbnMgYWxpZ249cmVzZXQKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvYnRleHQuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvYnRleHQuaAppbmRleCA3MWNjZTM2Li45MDZmNDZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2J0ZXh0LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9idGV4dC5oCkBAIC03LDIxICs3LDIyIEBACiAjZGVmaW5lIF9fUFBDX0JURVhUX0gKICNpZmRlZiBfX0tFUk5FTF9fCiAKLWV4dGVybiB2b2lkIGJ0ZXh0X2NsZWFyc2NyZWVuKHZvaWQpOwotZXh0ZXJuIHZvaWQgYnRleHRfZmx1c2hzY3JlZW4odm9pZCk7Ci0KLWV4dGVybiBpbnQgYm9vdF90ZXh0X21hcHBlZDsKLQotZXh0ZXJuIGludCBidGV4dF9pbml0aWFsaXplKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOwotCi1leHRlcm4gdm9pZCBtYXBfYm9vdF90ZXh0KHZvaWQpOwotZXh0ZXJuIHZvaWQgaW5pdF9ib290X2Rpc3BsYXkodm9pZCk7CitleHRlcm4gaW50IGJ0ZXh0X2ZpbmRfZGlzcGxheShpbnQgYWxsb3dfbm9uc3Rkb3V0KTsKIGV4dGVybiB2b2lkIGJ0ZXh0X3VwZGF0ZV9kaXNwbGF5KHVuc2lnbmVkIGxvbmcgcGh5cywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogCQkJCSBpbnQgZGVwdGgsIGludCBwaXRjaCk7CitleHRlcm4gdm9pZCBidGV4dF9zZXR1cF9kaXNwbGF5KGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBpbnQgcGl0Y2gsCisJCQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKK2V4dGVybiB2b2lkIGJ0ZXh0X3ByZXBhcmVfQkFUKHZvaWQpOworZXh0ZXJuIHZvaWQgYnRleHRfdW5tYXAodm9pZCk7CiAKIGV4dGVybiB2b2lkIGJ0ZXh0X2RyYXdjaGFyKGNoYXIgYyk7CiBleHRlcm4gdm9pZCBidGV4dF9kcmF3c3RyaW5nKGNvbnN0IGNoYXIgKnN0cik7CiBleHRlcm4gdm9pZCBidGV4dF9kcmF3aGV4KHVuc2lnbmVkIGxvbmcgdik7CitleHRlcm4gdm9pZCBidGV4dF9kcmF3dGV4dChjb25zdCBjaGFyICpjLCB1bnNpZ25lZCBpbnQgbGVuKTsKKworZXh0ZXJuIHZvaWQgYnRleHRfY2xlYXJzY3JlZW4odm9pZCk7CitleHRlcm4gdm9pZCBidGV4dF9mbHVzaHNjcmVlbih2b2lkKTsKK2V4dGVybiB2b2lkIGJ0ZXh0X2ZsdXNobGluZSh2b2lkKTsKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfX1BQQ19CVEVYVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2J1Zy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9idWcuaAppbmRleCBiMDAxZWNiLi45OTgxN2E4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2J1Zy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvYnVnLmgKQEAgLTEsNSArMSw2IEBACiAjaWZuZGVmIF9BU01fUE9XRVJQQ19CVUdfSAogI2RlZmluZSBfQVNNX1BPV0VSUENfQlVHX0gKKyNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxhc20vYXNtLWNvbXBhdC5oPgogLyoKQEAgLTY3LDQgKzY4LDUgQEAKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2J1Zy5oPgogCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19CVUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jYWNoZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jYWNoZS5oCmluZGV4IDI2Y2U1MDIuLjYzNzljMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY2FjaGUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2NhY2hlLmgKQEAgLTE5LDcgKzE5LDYgQEAKICNkZWZpbmUJTDFfQ0FDSEVfQllURVMJCSgxIDw8IEwxX0NBQ0hFX1NISUZUKQogCiAjZGVmaW5lCVNNUF9DQUNIRV9CWVRFUwkJTDFfQ0FDSEVfQllURVMKLSNkZWZpbmUgTDFfQ0FDSEVfU0hJRlRfTUFYCTcgLyogbGFyZ2VzdCBMMSB3aGljaCB0aGlzIGFyY2ggc3VwcG9ydHMgKi8KIAogI2lmIGRlZmluZWQoX19wb3dlcnBjNjRfXykgJiYgIWRlZmluZWQoX19BU1NFTUJMWV9fKQogc3RydWN0IHBwYzY0X2NhY2hlcyB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2NoZWNrc3VtLmgKaW5kZXggZDgzNTRkOC4uNjA5ZWNiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY2hlY2tzdW0uaApAQCAtMSw1ICsxLDYgQEAKICNpZm5kZWYgX0FTTV9QT1dFUlBDX0NIRUNLU1VNX0gKICNkZWZpbmUgX0FTTV9QT1dFUlBDX0NIRUNLU1VNX0gKKyNpZmRlZiBfX0tFUk5FTF9fCiAKIC8qCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0xMjksNCArMTMwLDUgQEAKIH0KIAogI2VuZGlmCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NvbXBhdC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jb21wYXQuaAppbmRleCA0ZGI0MzYwLi5hY2NiODBjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NvbXBhdC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY29tcGF0LmgKQEAgLTEsNSArMSw2IEBACiAjaWZuZGVmIF9BU01fUE9XRVJQQ19DT01QQVRfSAogI2RlZmluZSBfQVNNX1BPV0VSUENfQ09NUEFUX0gKKyNpZmRlZiBfX0tFUk5FTF9fCiAvKgogICogQXJjaGl0ZWN0dXJlIHNwZWNpZmljIGNvbXBhdGliaWxpdHkgdHlwZXMKICAqLwpAQCAtMjAyLDQgKzIwMyw1IEBACiAJY29tcGF0X3Vsb25nX3QgX191bnVzZWQ2OwogfTsKIAorI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfQ09NUEFUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY3B1dGFibGUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY3B1dGFibGUuaAppbmRleCBkMWNmYTNmLi42NDIxMDU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NwdXRhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jcHV0YWJsZS5oCkBAIC0xLDcgKzEsNiBAQAogI2lmbmRlZiBfX0FTTV9QT1dFUlBDX0NQVVRBQkxFX0gKICNkZWZpbmUgX19BU01fUE9XRVJQQ19DUFVUQUJMRV9ICiAKLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxhc20vYXNtLWNvbXBhdC5oPgogCiAjZGVmaW5lIFBQQ19GRUFUVVJFXzMyCQkJMHg4MDAwMDAwMApAQCAtMjAsNiArMTksNyBAQAogI2RlZmluZSBQUENfRkVBVFVSRV9QT1dFUjUJCTB4MDAwNDAwMDAKICNkZWZpbmUgUFBDX0ZFQVRVUkVfUE9XRVI1X1BMVVMJCTB4MDAwMjAwMDAKICNkZWZpbmUgUFBDX0ZFQVRVUkVfQ0VMTAkJMHgwMDAxMDAwMAorI2RlZmluZSBQUENfRkVBVFVSRV9CT09LRQkJMHgwMDAwODAwMAogCiAjaWZkZWYgX19LRVJORUxfXwogI2lmbmRlZiBfX0FTU0VNQkxZX18KQEAgLTI4LDEwICsyOCwxNyBAQAogICogdmlhIHRoZSBta2RlZnMgbWVjaGFuaXNtLgogICovCiBzdHJ1Y3QgY3B1X3NwZWM7Ci1zdHJ1Y3Qgb3BfcG93ZXJwY19tb2RlbDsKIAogdHlwZWRlZgl2b2lkICgqY3B1X3NldHVwX3QpKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzdHJ1Y3QgY3B1X3NwZWMqIHNwZWMpOwogCitlbnVtIHBvd2VycGNfb3Byb2ZpbGVfdHlwZSB7CisJUFBDX09QUk9GSUxFX0lOVkFMSUQgPSAwLAorCVBQQ19PUFJPRklMRV9SUzY0ID0gMSwKKwlQUENfT1BST0ZJTEVfUE9XRVI0ID0gMiwKKwlQUENfT1BST0ZJTEVfRzQgPSAzLAorCVBQQ19PUFJPRklMRV9CT09LRSA9IDQsCit9OworCiBzdHJ1Y3QgY3B1X3NwZWMgewogCS8qIENQVSBpcyBtYXRjaGVkIHZpYSAoUFZSICYgcHZyX21hc2spID09IHB2cl92YWx1ZSAqLwogCXVuc2lnbmVkIGludAlwdnJfbWFzazsKQEAgLTU3LDcgKzY0LDEwIEBACiAJY2hhcgkJKm9wcm9maWxlX2NwdV90eXBlOwogCiAJLyogUHJvY2Vzc29yIHNwZWNpZmljIG9wcm9maWxlIG9wZXJhdGlvbnMgKi8KLQlzdHJ1Y3Qgb3BfcG93ZXJwY19tb2RlbCAqb3Byb2ZpbGVfbW9kZWw7CisJZW51bSBwb3dlcnBjX29wcm9maWxlX3R5cGUgb3Byb2ZpbGVfdHlwZTsKKworCS8qIE5hbWUgb2YgcHJvY2Vzc29yIGNsYXNzLCBmb3IgdGhlIEVMRiBBVF9QTEFURk9STSBlbnRyeSAqLworCWNoYXIJCSpwbGF0Zm9ybTsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgY3B1X3NwZWMJCSpjdXJfY3B1X3NwZWM7CkBAIC0xMDYsNiArMTE2LDcgQEAKICNkZWZpbmUgQ1BVX0ZUUl9MT0NLTEVTU19UTEJJRQkJQVNNX0NPTlNUKDB4MDAwMDA0MDAwMDAwMDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9NTUNSQV9TSUhWCQlBU01fQ09OU1QoMHgwMDAwMDgwMDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX0NJX0xBUkdFX1BBR0UJCUFTTV9DT05TVCgweDAwMDAxMDAwMDAwMDAwMDApCisjZGVmaW5lIENQVV9GVFJfUEFVU0VfWkVSTwkJQVNNX0NPTlNUKDB4MDAwMDIwMDAwMDAwMDAwMCkKICNlbHNlCiAvKiBlbnN1cmUgb24gMzJiIHByb2Nlc3NvcnMgdGhlIGZsYWdzIGFyZSBhdmFpbGFibGUgZm9yIGNvbXBpbGluZyBidXQKICAqIGRvbid0IGRvIGFueXRoaW5nICovCkBAIC0zMDUsMTIgKzMxNiwxOCBAQAogCSAgICBDUFVfRlRSX01NQ1JBX1NJSFYsCiAJQ1BVX0ZUUlNfQ0VMTCA9IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8CiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8Ci0JICAgIENQVV9GVFJfQUxUSVZFQ19DT01QIHwgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01ULAorCSAgICBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IENQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX1NNVCB8CisJICAgIENQVV9GVFJfQ1RSTCB8IENQVV9GVFJfUEFVU0VfWkVSTywKIAlDUFVfRlRSU19DT01QQVRJQkxFID0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9QUENBU19BUkNIX1YyLAogI2VuZGlmCiAKIAlDUFVfRlRSU19QT1NTSUJMRSA9CisjaWZkZWYgX19wb3dlcnBjNjRfXworCSAgICBDUFVfRlRSU19QT1dFUjMgfCBDUFVfRlRSU19SUzY0IHwgQ1BVX0ZUUlNfUE9XRVI0IHwKKwkgICAgQ1BVX0ZUUlNfUFBDOTcwIHwgQ1BVX0ZUUlNfUE9XRVI1IHwgQ1BVX0ZUUlNfQ0VMTCB8CisgICAgICAgICAgICBDUFVfRlRSX0NJX0xBUkdFX1BBR0UgfAorI2Vsc2UKICNpZiBDTEFTU0lDX1BQQwogCSAgICBDUFVfRlRSU19QUEM2MDEgfCBDUFVfRlRSU182MDMgfCBDUFVfRlRSU182MDQgfCBDUFVfRlRSU183NDBfTk9UQVUgfAogCSAgICBDUFVfRlRSU183NDAgfCBDUFVfRlRSU183NTAgfCBDUFVfRlRSU183NTBGWDEgfApAQCAtMzQ0LDE0ICszNjEsMTQgQEAKICNpZmRlZiBDT05GSUdfRTUwMAogCSAgICBDUFVfRlRSU19FNTAwIHwgQ1BVX0ZUUlNfRTUwMF8yIHwKICNlbmRpZgotI2lmZGVmIF9fcG93ZXJwYzY0X18KLQkgICAgQ1BVX0ZUUlNfUE9XRVIzIHwgQ1BVX0ZUUlNfUlM2NCB8IENQVV9GVFJTX1BPV0VSNCB8Ci0JICAgIENQVV9GVFJTX1BQQzk3MCB8IENQVV9GVFJTX1BPV0VSNSB8IENQVV9GVFJTX0NFTEwgfAotICAgICAgICAgICAgQ1BVX0ZUUl9DSV9MQVJHRV9QQUdFIHwKLSNlbmRpZgorI2VuZGlmIC8qIF9fcG93ZXJwYzY0X18gKi8KIAkgICAgMCwKIAogCUNQVV9GVFJTX0FMV0FZUyA9CisjaWZkZWYgX19wb3dlcnBjNjRfXworCSAgICBDUFVfRlRSU19QT1dFUjMgJiBDUFVfRlRSU19SUzY0ICYgQ1BVX0ZUUlNfUE9XRVI0ICYKKwkgICAgQ1BVX0ZUUlNfUFBDOTcwICYgQ1BVX0ZUUlNfUE9XRVI1ICYgQ1BVX0ZUUlNfQ0VMTCAmCisjZWxzZQogI2lmIENMQVNTSUNfUFBDCiAJICAgIENQVV9GVFJTX1BQQzYwMSAmIENQVV9GVFJTXzYwMyAmIENQVV9GVFJTXzYwNCAmIENQVV9GVFJTXzc0MF9OT1RBVSAmCiAJICAgIENQVV9GVFJTXzc0MCAmIENQVV9GVFJTXzc1MCAmIENQVV9GVFJTXzc1MEZYMSAmCkBAIC0zODUsMTAgKzQwMiw3IEBACiAjaWZkZWYgQ09ORklHX0U1MDAKIAkgICAgQ1BVX0ZUUlNfRTUwMCAmIENQVV9GVFJTX0U1MDBfMiAmCiAjZW5kaWYKLSNpZmRlZiBfX3Bvd2VycGM2NF9fCi0JICAgIENQVV9GVFJTX1BPV0VSMyAmIENQVV9GVFJTX1JTNjQgJiBDUFVfRlRSU19QT1dFUjQgJgotCSAgICBDUFVfRlRSU19QUEM5NzAgJiBDUFVfRlRSU19QT1dFUjUgJiBDUFVfRlRSU19DRUxMICYKLSNlbmRpZgorI2VuZGlmIC8qIF9fcG93ZXJwYzY0X18gKi8KIAkgICAgQ1BVX0ZUUlNfUE9TU0lCTEUsCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2N1cnJlbnQuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY3VycmVudC5oCmluZGV4IDgyY2Q0YTkuLjE5MzhkNmFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2N1cnJlbnQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2N1cnJlbnQuaApAQCAtMSw1ICsxLDYgQEAKICNpZm5kZWYgX0FTTV9QT1dFUlBDX0NVUlJFTlRfSAogI2RlZmluZSBfQVNNX1BPV0VSUENfQ1VSUkVOVF9ICisjaWZkZWYgX19LRVJORUxfXwogCiAvKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMjQsNCArMjUsNSBAQAogCiAjZW5kaWYKIAorI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfQ1VSUkVOVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2RlbGF5LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2RlbGF5LmgKaW5kZXggNTRmZTFmNC4uMDU3YTYwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9kZWxheS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZGVsYXkuaApAQCAtMSw1ICsxLDYgQEAKICNpZm5kZWYgX0FTTV9QT1dFUlBDX0RFTEFZX0gKICNkZWZpbmUgX0FTTV9QT1dFUlBDX0RFTEFZX0gKKyNpZmRlZiBfX0tFUk5FTF9fCiAKIC8qCiAgKiBDb3B5cmlnaHQgMTk5NiwgUGF1bCBNYWNrZXJyYXMuCkBAIC0xNiw0ICsxNyw1IEBACiBleHRlcm4gdm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpOwogZXh0ZXJuIHZvaWQgdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpOwogCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19ERUxBWV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2RtYS1tYXBwaW5nLmgKaW5kZXggNTlhODAxNi4uODM3NzU2YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZG1hLW1hcHBpbmcuaApAQCAtNiw2ICs2LDcgQEAKICAqLwogI2lmbmRlZiBfQVNNX0RNQV9NQVBQSU5HX0gKICNkZWZpbmUgX0FTTV9ETUFfTUFQUElOR19ICisjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTIyOSw3ICsyMzAsNyBAQAogI2lmZGVmIENPTkZJR19QUEM2NAogCS8qIG5vIGVhc3kgd2F5IHRvIGdldCBjYWNoZSBzaXplIG9uIGFsbCBwcm9jZXNzb3JzLCBzbyByZXR1cm4KIAkgKiB0aGUgbWF4aW11bSBwb3NzaWJsZSwgdG8gYmUgc2FmZSAqLwotCXJldHVybiAoMSA8PCBMMV9DQUNIRV9TSElGVF9NQVgpOworCXJldHVybiAoMSA8PCBJTlRFUk5PREVfQ0FDSEVfU0hJRlQpOwogI2Vsc2UKIAkvKgogCSAqIEVhY2ggcHJvY2Vzc29yIGZhbWlseSB3aWxsIGRlZmluZSBpdHMgb3duIEwxX0NBQ0hFX1NISUZULApAQCAtMjgyLDQgKzI4Myw1IEBACiAJaW50CQkoKmRhY19kbWFfc3VwcG9ydGVkKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKTsKIH07CiAKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYJLyogX0FTTV9ETUFfTUFQUElOR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2RtYS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9kbWEuaAppbmRleCA5MjYzNzhkLi40YmI1N2ZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2RtYS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZG1hLmgKQEAgLTEsNSArMSw2IEBACiAjaWZuZGVmIF9BU01fUE9XRVJQQ19ETUFfSAogI2RlZmluZSBfQVNNX1BPV0VSUENfRE1BX0gKKyNpZmRlZiBfX0tFUk5FTF9fCiAKIC8qCiAgKiBEZWZpbmVzIGZvciB1c2luZyBhbmQgYWxsb2NhdGluZyBkbWEgY2hhbm5lbHMuCkBAIC0zODcsNCArMzg4LDUgQEAKIAogI2VuZGlmCS8qICFkZWZpbmVkKENPTkZJR19QUENfSVNFUklFUykgfHwgZGVmaW5lZChDT05GSUdfUENJKSAqLwogCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19ETUFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9lZWguaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZWVoLmgKaW5kZXggZjg2MzNhYS4uYjI2M2ZiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9lZWguaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2VlaC5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpZm5kZWYgX1BQQzY0X0VFSF9ICiAjZGVmaW5lIF9QUEM2NF9FRUhfSAorI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTMzLDkgKzM0LDExIEBACiBleHRlcm4gaW50IGVlaF9zdWJzeXN0ZW1fZW5hYmxlZDsKIAogLyogVmFsdWVzIGZvciBlZWhfbW9kZSBiaXRzIGluIGRldmljZV9ub2RlICovCi0jZGVmaW5lIEVFSF9NT0RFX1NVUFBPUlRFRAkoMTw8MCkKLSNkZWZpbmUgRUVIX01PREVfTk9DSEVDSwkoMTw8MSkKLSNkZWZpbmUgRUVIX01PREVfSVNPTEFURUQJKDE8PDIpCisjZGVmaW5lIEVFSF9NT0RFX1NVUFBPUlRFRCAgICAgKDE8PDApCisjZGVmaW5lIEVFSF9NT0RFX05PQ0hFQ0sgICAgICAgKDE8PDEpCisjZGVmaW5lIEVFSF9NT0RFX0lTT0xBVEVEICAgICAgKDE8PDIpCisjZGVmaW5lIEVFSF9NT0RFX1JFQ09WRVJJTkcgICAgKDE8PDMpCisjZGVmaW5lIEVFSF9NT0RFX0lSUV9ESVNBQkxFRCAgKDE8PDQpCiAKIC8qIE1heCBudW1iZXIgb2YgRUVIIGZyZWV6ZXMgYWxsb3dlZCBiZWZvcmUgd2UgY29uc2lkZXIgdGhlIGRldmljZQogICogdG8gYmUgcGVybWFuZW50bHkgZGlzYWJsZWQuICovCkBAIC01Nyw2ICs2MCw3IEBACiAgKiB0byBmaW5pc2ggdGhlIGVlaCBzZXR1cCBmb3IgdGhpcyBkZXZpY2UuCiAgKi8KIHZvaWQgZWVoX2FkZF9kZXZpY2VfZWFybHkoc3RydWN0IGRldmljZV9ub2RlICopOwordm9pZCBlZWhfYWRkX2RldmljZV90cmVlX2Vhcmx5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqKTsKIHZvaWQgZWVoX2FkZF9kZXZpY2VfbGF0ZShzdHJ1Y3QgcGNpX2RldiAqKTsKIAogLyoqCkBAIC03Miw2ICs3NiwxNSBAQAogdm9pZCBlZWhfcmVtb3ZlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqKTsKIAogLyoqCisgKiBlZWhfcmVtb3ZlX2RldmljZV9yZWN1cnNpdmUgLSB1bmRvIEVFSCBmb3IgZGV2aWNlICYgY2hpbGRyZW4uCisgKiBAZGV2OiBwY2kgZGV2aWNlIHRvIGJlIHJlbW92ZWQKKyAqCisgKiBBcyBhYm92ZSwgdGhpcyByZW1vdmVzIHRoZSBkZXZpY2U7IGl0IGFsc28gcmVtb3ZlcyBjaGlsZAorICogcGNpIGRldmljZXMgYXMgd2VsbC4KKyAqLwordm9pZCBlZWhfcmVtb3ZlX2J1c19kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKik7CisKKy8qKgogICogRUVIX1BPU1NJQkxFX0VSUk9SKCkgLS0gdGVzdCBmb3IgcG9zc2libGUgTU1JTyBmYWlsdXJlLgogICoKICAqIElmIHRoaXMgbWFjcm8geWllbGRzIFRSVUUsIHRoZSBjYWxsZXIgcmVsYXlzIHRvIGVlaF9jaGVja19mYWlsdXJlKCkKQEAgLTEwNyw2ICsxMjAsOSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZWVoX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldikgeyB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBlZWhfYWRkX2RldmljZV90cmVlX2Vhcmx5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pIHsgfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZWVoX3JlbW92ZV9idXNfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpIHsgfQogI2RlZmluZSBFRUhfUE9TU0lCTEVfRVJST1IodmFsLCB0eXBlKSAoMCkKICNkZWZpbmUgRUVIX0lPX0VSUk9SX1ZBTFVFKHNpemUpICgtMVVMKQogI2VuZGlmIC8qIENPTkZJR19FRUggKi8KQEAgLTM2Myw0ICszNzksNSBAQAogCQllZWhfY2hlY2tfZmFpbHVyZSgodm9pZCBfX2lvbWVtICopKHBvcnQpLCAqKHUzMiopYnVmKTsKIH0KIAorI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfUFBDNjRfRUVIX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZWVoX2V2ZW50LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2VlaF9ldmVudC5oCmluZGV4IGQxNjhhMzAuLjkzZDU1YTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZWVoX2V2ZW50LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9lZWhfZXZlbnQuaApAQCAtMjAsNiArMjAsNyBAQAogCiAjaWZuZGVmIEFTTV9QUEM2NF9FRUhfRVZFTlRfSAogI2RlZmluZSBBU01fUFBDNjRfRUVIX0VWRU5UX0gKKyNpZmRlZiBfX0tFUk5FTF9fCiAKIC8qKiBFRUggZXZlbnQgLS0gc3RydWN0dXJlIGhvbGRpbmcgcGNpIGNvbnRyb2xsZXIgZGF0YSB0aGF0IGRlc2NyaWJlcwogICogIGEgY2hhbmdlIGluIHRoZSBpc29sYXRpb24gc3RhdHVzIG9mIGEgUENJIHNsb3QuICBBIHBvaW50ZXIKQEAgLTI5LDcgKzMwLDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICBsaXN0OwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAJKmRuOyAgIC8qIHN0cnVjdCBkZXZpY2Ugbm9kZSAqLwogCXN0cnVjdCBwY2lfZGV2ICAgICAgICpkZXY7ICAvKiBhZmZlY3RlZCBkZXZpY2UgKi8KLQlpbnQgICAgICAgICAgICAgICAgICBzdGF0ZTsKKwllbnVtIHBjaV9jaGFubmVsX3N0YXRlIHN0YXRlOyAvKiBQQ0kgYnVzIHN0YXRlIGZvciB0aGUgYWZmZWN0ZWQgZGV2aWNlICovCiAJaW50IHRpbWVfdW5hdmFpbDsgICAgLyogbWlsbGlzZWNvbmRzIHVudGlsIGRldmljZSBtaWdodCBiZSBhdmFpbGFibGUgKi8KIH07CiAKQEAgLTQ2LDcgKzQ3LDExIEBACiAgKi8KIGludCBlZWhfc2VuZF9mYWlsdXJlX2V2ZW50IChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwY2lfZGV2ICpkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc2V0X3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcGNpX2NoYW5uZWxfc3RhdGUgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVfdW5hdmFpbCk7CiAKKy8qIE1haW4gcmVjb3ZlcnkgZnVuY3Rpb24gKi8KK3ZvaWQgaGFuZGxlX2VlaF9ldmVudHMgKHN0cnVjdCBlZWhfZXZlbnQgKik7CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogQVNNX1BQQzY0X0VFSF9FVkVOVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2VsZi5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9lbGYuaAppbmRleCAzZGNkNjVlLi45NGQyMjhmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2VsZi5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZWxmLmgKQEAgLTEsNyArMSwxMCBAQAogI2lmbmRlZiBfQVNNX1BPV0VSUENfRUxGX0gKICNkZWZpbmUgX0FTTV9QT1dFUlBDX0VMRl9ICiAKKyNpZmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JLyogZm9yIHRhc2tfc3RydWN0ICovCisjZW5kaWYKKwogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KQEAgLTg5LDcgKzkyLDYgQEAKICAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIAogI2RlZmluZSBFTEZfTkdSRUcJNDgJLyogaW5jbHVkZXMgbmlwLCBtc3IsIGxyLCBldGMuICovCiAjZGVmaW5lIEVMRl9ORlBSRUcJMzMJLyogaW5jbHVkZXMgZnBzY3IgKi8KQEAgLTIxOSwyMSArMjIxLDE5IEBACiAgICBpbnN0cnVjdGlvbiBzZXQgdGhpcyBjcHUgc3VwcG9ydHMuICBUaGlzIGNvdWxkIGJlIGRvbmUgaW4gdXNlcnNwYWNlLAogICAgYnV0IGl0J3Mgbm90IGVhc3ksIGFuZCB3ZSd2ZSBhbHJlYWR5IGRvbmUgaXQgaGVyZS4gICovCiAjIGRlZmluZSBFTEZfSFdDQVAJKGN1cl9jcHVfc3BlYy0+Y3B1X3VzZXJfZmVhdHVyZXMpCisKKy8qIFRoaXMgeWllbGRzIGEgc3RyaW5nIHRoYXQgbGQuc28gd2lsbCB1c2UgdG8gbG9hZCBpbXBsZW1lbnRhdGlvbgorICAgc3BlY2lmaWMgbGlicmFyaWVzIGZvciBvcHRpbWl6YXRpb24uICBUaGlzIGlzIG1vcmUgc3BlY2lmaWMgaW4KKyAgIGludGVudCB0aGFuIHBva2luZyBhdCB1bmFtZSBvciAvcHJvYy9jcHVpbmZvLiAgKi8KKworI2RlZmluZSBFTEZfUExBVEZPUk0JKGN1cl9jcHVfc3BlYy0+cGxhdGZvcm0pCisKICNpZmRlZiBfX3Bvd2VycGM2NF9fCiAjIGRlZmluZSBFTEZfUExBVF9JTklUKF9yLCBsb2FkX2FkZHIpCWRvIHsJXAogCV9yLT5ncHJbMl0gPSBsb2FkX2FkZHI7IAkJXAogfSB3aGlsZSAoMCkKICNlbmRpZiAvKiBfX3Bvd2VycGM2NF9fICovCiAKLS8qIFRoaXMgeWllbGRzIGEgc3RyaW5nIHRoYXQgbGQuc28gd2lsbCB1c2UgdG8gbG9hZCBpbXBsZW1lbnRhdGlvbgotICAgc3BlY2lmaWMgbGlicmFyaWVzIGZvciBvcHRpbWl6YXRpb24uICBUaGlzIGlzIG1vcmUgc3BlY2lmaWMgaW4KLSAgIGludGVudCB0aGFuIHBva2luZyBhdCB1bmFtZSBvciAvcHJvYy9jcHVpbmZvLgotCi0gICBGb3IgdGhlIG1vbWVudCwgd2UgaGF2ZSBvbmx5IG9wdGltaXphdGlvbnMgZm9yIHRoZSBJbnRlbCBnZW5lcmF0aW9ucywKLSAgIGJ1dCB0aGF0IGNvdWxkIGNoYW5nZS4uLiAqLwotCi0jZGVmaW5lIEVMRl9QTEFURk9STQkoTlVMTCkKLQogI2lmZGVmIF9fS0VSTkVMX18KIAogI2lmZGVmIF9fcG93ZXJwYzY0X18KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZmlybXdhcmUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZmlybXdhcmUuaAppbmRleCAxMmZhYmJjYjAuLmY4MDRiMzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZmlybXdhcmUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2Zpcm13YXJlLmgKQEAgLTk4LDYgKzk4LDEyIEBACiBleHRlcm4gZmlybXdhcmVfZmVhdHVyZV90IGZpcm13YXJlX2ZlYXR1cmVzX3RhYmxlW107CiAjZW5kaWYKIAorZXh0ZXJuIHZvaWQgc3lzdGVtX3Jlc2V0X2Z3bm1pKHZvaWQpOworZXh0ZXJuIHZvaWQgbWFjaGluZV9jaGVja19md25taSh2b2lkKTsKKworLyogVGhpcyBpcyB0cnVlIGlmIHdlIGFyZSB1c2luZyB0aGUgZmlybXdhcmUgTk1JIGhhbmRsZXIgKHR5cGljYWxseSBMUEFSKSAqLworZXh0ZXJuIGludCBmd25taV9hY3RpdmU7CisKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX19BU01fUE9XRVJQQ19GSVJNV0FSRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2Zsb3BweS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9mbG9wcHkuaAppbmRleCA2NDI3NmEzLi5lMjU4Nzc4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2Zsb3BweS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZmxvcHB5LmgKQEAgLTksNiArOSw3IEBACiAgKi8KICNpZm5kZWYgX19BU01fUE9XRVJQQ19GTE9QUFlfSAogI2RlZmluZSBfX0FTTV9QT1dFUlBDX0ZMT1BQWV9ICisjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KQEAgLTEwMiw0ICsxMDMsNSBAQAogCiAjZGVmaW5lIEVYVFJBX0ZMT1BQWV9QQVJBTVMKIAorI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfX0FTTV9QT1dFUlBDX0ZMT1BQWV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2Z1dGV4LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2Z1dGV4LmgKaW5kZXggZjAzMTlkNS4uMzllODVmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9mdXRleC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZnV0ZXguaApAQCAtMTEsNyArMTEsNyBAQAogCiAjZGVmaW5lIF9fZnV0ZXhfYXRvbWljX29wKGluc24sIHJldCwgb2xkdmFsLCB1YWRkciwgb3BhcmcpIFwKICAgX19hc21fXyBfX3ZvbGF0aWxlICggXAotCVNZTkNfT05fU01QIFwKKwlMV1NZTkNfT05fU01QIFwKICIxOglsd2FyeAklMCwwLCUyXG4iIFwKIAlpbnNuIFwKIAlQUEM0MDVfRVJSNzcoMCwgJTIpIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZ3JhY2tsZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9ncmFja2xlLmgKaW5kZXggNTYzYzdhNS4uYmQ3ODEyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9ncmFja2xlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9ncmFja2xlLmgKQEAgLTEsMyArMSw2IEBACisjaWZuZGVmIF9BU01fUE9XRVJQQ19HUkFDS0xFX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX0dSQUNLTEVfSAorI2lmZGVmIF9fS0VSTkVMX18KIC8qCiAgKiBGdW5jdGlvbnMgZm9yIHNldHRpbmcgdXAgYW5kIHVzaW5nIGEgTVBDMTA2IG5vcnRoYnJpZGdlCiAgKi8KQEAgLTUsMyArOCw1IEBACiAjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KIAogZXh0ZXJuIHZvaWQgc2V0dXBfZ3JhY2tsZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfQVNNX1BPV0VSUENfR1JBQ0tMRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2hhcmRpcnEuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaGFyZGlycS5oCmluZGV4IDNiM2UzYjQuLjI4OGUxNGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaGFyZGlycS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaGFyZGlycS5oCkBAIC0xLDUgKzEsNiBAQAogI2lmbmRlZiBfQVNNX1BPV0VSUENfSEFSRElSUV9ICiAjZGVmaW5lIF9BU01fUE9XRVJQQ19IQVJESVJRX0gKKyNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2J1Zy5oPgpAQCAtMjQsNCArMjUsNSBAQAogCUJVRygpOwogfQogCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19IQVJESVJRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaGVhdGhyb3cuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaGVhdGhyb3cuaAppbmRleCAyMmFjMTc5Li45M2Y1NDk1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2hlYXRocm93LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9oZWF0aHJvdy5oCkBAIC0xLDMgKzEsNiBAQAorI2lmbmRlZiBfQVNNX1BPV0VSUENfSEVBVEhST1dfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfSEVBVEhST1dfSAorI2lmZGVmIF9fS0VSTkVMX18KIC8qCiAgKiBoZWF0aHJvdy5oOiBkZWZpbml0aW9ucyBmb3IgdXNpbmcgdGhlICJIZWF0aHJvdyIgSS9PIGNvbnRyb2xsZXIgY2hpcC4KICAqCkBAIC02MCwzICs2Myw1IEBACiAvKiBMb29rcyBsaWtlIEhlYXRocm93IGhhcyBzb21lIHNvcnQgb2YgR1BJT3MgYXMgd2VsbC4uLiAqLwogI2RlZmluZSBIUldfR1BJT19NT0RFTV9SRVNFVAkweDZkCiAKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0hFQVRIUk9XX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaHZjYWxsLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2h2Y2FsbC5oCmluZGV4IGQzNmRhNjEuLjM4Y2E5YWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaHZjYWxsLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9odmNhbGwuaApAQCAtMSwxMSArMSwxNSBAQAogI2lmbmRlZiBfQVNNX1BPV0VSUENfSFZDQUxMX0gKICNkZWZpbmUgX0FTTV9QT1dFUlBDX0hWQ0FMTF9ICisjaWZkZWYgX19LRVJORUxfXwogCiAjZGVmaW5lIEhWU0MJCQkubG9uZyAweDQ0MDAwMDIyCiAKICNkZWZpbmUgSF9TdWNjZXNzCTAKICNkZWZpbmUgSF9CdXN5CQkxCS8qIEhhcmR3YXJlIGJ1c3kgLS0gcmV0cnkgbGF0ZXIgKi8KKyNkZWZpbmUgSF9DbG9zZWQJMgkvKiBSZXNvdXJjZSBjbG9zZWQgKi8KICNkZWZpbmUgSF9Db25zdHJhaW5lZAk0CS8qIFJlc291cmNlIHJlcXVlc3QgY29uc3RyYWluZWQgdG8gbWF4IGFsbG93ZWQgKi8KKyNkZWZpbmUgSF9JblByb2dyZXNzICAgMTQJLyogS2luZCBvZiBsaWtlIGJ1c3kgKi8KKyNkZWZpbmUgSF9Db250aW51ZSAgICAgMTgJLyogUmV0dXJuZWQgZnJvbSBIX0pvaW4gb24gc3VjY2VzcyAqLwogI2RlZmluZSBIX0xvbmdCdXN5U3RhcnRSYW5nZSAgIDk5MDAgIC8qIFN0YXJ0IG9mIGxvbmcgYnVzeSByYW5nZSAqLwogI2RlZmluZSBIX0xvbmdCdXN5T3JkZXIxbXNlYyAgIDk5MDAgIC8qIExvbmcgYnVzeSwgaGludCB0aGF0IDFtc2VjIGlzIGEgZ29vZCB0aW1lIHRvIHJldHJ5ICovCiAjZGVmaW5lIEhfTG9uZ0J1c3lPcmRlcjEwbXNlYyAgOTkwMSAgLyogTG9uZyBidXN5LCBoaW50IHRoYXQgMTBtc2VjIGlzIGEgZ29vZCB0aW1lIHRvIHJldHJ5ICovCkBAIC0xMTMsNiArMTE3LDggQEAKICNkZWZpbmUgSF9SRUdJU1RFUl9WVEVSTQkweDE1NAogI2RlZmluZSBIX0ZSRUVfVlRFUk0JCTB4MTU4CiAjZGVmaW5lIEhfUE9MTF9QRU5ESU5HCSAgICAgICAgMHgxRDgKKyNkZWZpbmUgSF9KT0lOCQkJMHgyOTgKKyNkZWZpbmUgSF9FTkFCTEVfQ1JRCQkweDJCMAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCkBAIC0xNzAsNCArMTc2LDUgQEAKIAkJICAgICAgdW5zaWduZWQgbG9uZyAqb3V0NCk7CiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0hWQ0FMTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2h2Y29uc29sZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9odmNvbnNvbGUuaAppbmRleCA2ZGE5M2NlLi4zNGRhZjdiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2h2Y29uc29sZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaHZjb25zb2xlLmgKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2lmbmRlZiBfUFBDNjRfSFZDT05TT0xFX0gKICNkZWZpbmUgX1BQQzY0X0hWQ09OU09MRV9ICisjaWZkZWYgX19LRVJORUxfXwogCiAvKgogICogVGhpcyBpcyB0aGUgbWF4IG51bWJlciBvZiBjb25zb2xlIGFkYXB0ZXJzIHRoYXQgY2FuL3dpbGwgYmUgZm91bmQgYXMKQEAgLTQ2LDQgKzQ3LDUgQEAKIAkJCQkJCSBzdHJ1Y3QgaHZfb3BzICpvcHMpOwogLyogcmVtb3ZlIGEgdnRlcm0gZnJvbSBodmMgdHR5IG9wZXJhdGlvbiAobW9kZWxlX2V4aXQgb3IgaG90cGx1ZyByZW1vdmUpICovCiBleHRlcm4gaW50IF9fZGV2ZXhpdCBodmNfcmVtb3ZlKHN0cnVjdCBodmNfc3RydWN0ICpocCk7CisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9QUEM2NF9IVkNPTlNPTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9odmNzZXJ2ZXIuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaHZjc2VydmVyLmgKaW5kZXggYWVjYmE5Ni4uNjdkN2RhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9odmNzZXJ2ZXIuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2h2Y3NlcnZlci5oCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpZm5kZWYgX1BQQzY0X0hWQ1NFUlZFUl9ICiAjZGVmaW5lIF9QUEM2NF9IVkNTRVJWRVJfSAorI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIApAQCAtNTQsNCArNTUsNSBAQAogCQl1aW50MzJfdCBwX3BhcnRpdGlvbl9JRCwgdWludDMyX3QgcF91bml0X2FkZHJlc3MpOwogZXh0ZXJuIGludCBodmNzX2ZyZWVfY29ubmVjdGlvbih1aW50MzJfdCB1bml0X2FkZHJlc3MpOwogCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9QUEM2NF9IVkNTRVJWRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pODI1OS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pODI1OS5oCmluZGV4IGZjNGJmZWUuLjAzOTIxNTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaTgyNTkuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2k4MjU5LmgKQEAgLTEsNSArMSw2IEBACiAjaWZuZGVmIF9BU01fUE9XRVJQQ19JODI1OV9ICiAjZGVmaW5lIF9BU01fUE9XRVJQQ19JODI1OV9ICisjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKQEAgLTksNCArMTAsNSBAQAogZXh0ZXJuIGludCBpODI1OV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogZXh0ZXJuIGludCBpODI1OV9pcnFfY2FzY2FkZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgdm9pZCAqdW51c2VkKTsKIAorI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfSTgyNTlfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pYm1lYnVzLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2libWVidXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTQyNzIzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pYm1lYnVzLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIElCTSBQb3dlclBDIGVCdXMgSW5mcmFzdHJ1Y3R1cmUgU3VwcG9ydC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uCisgKiAgSGVpa28gSiBTY2hpY2sgPHNjaGlja2hqQGRlLmlibS5jb20+CisgKiAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBkaXN0cmlidXRlZCB1bmRlciBhIGR1YWwgbGljZW5zZSBvZiBHUEwgdjIuMCBhbmQgT3BlbklCIAorICogQlNELiAKKyAqCisgKiBPcGVuSUIgQlNEIExpY2Vuc2UKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDogCisgKgorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIAorICogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCisgKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIAorICogYW5kL29yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIAorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIAorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfQVNNX0VCVVNfSAorI2RlZmluZSBfQVNNX0VCVVNfSAorI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KKworZXh0ZXJuIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgaWJtZWJ1c19kbWFfb3BzOworZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBpYm1lYnVzX2J1c190eXBlOworCitzdHJ1Y3QgaWJtZWJ1c19kZXYgewkKKwljaGFyICpuYW1lOworCXN0cnVjdCBvZl9kZXZpY2Ugb2ZkZXY7Cit9OworCitzdHJ1Y3QgaWJtZWJ1c19kcml2ZXIgewkKKwljaGFyICpuYW1lOworCXN0cnVjdCBvZl9kZXZpY2VfaWQgKmlkX3RhYmxlOworCWludCAoKnByb2JlKSAoc3RydWN0IGlibWVidXNfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKmlkKTsKKwlpbnQgKCpyZW1vdmUpIChzdHJ1Y3QgaWJtZWJ1c19kZXYgKmRldik7CisJc3RydWN0IGRldmljZV9kcml2ZXIgZHJpdmVyOworfTsKKworaW50IGlibWVidXNfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBpYm1lYnVzX2RyaXZlciAqZHJ2KTsKK3ZvaWQgaWJtZWJ1c191bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgaWJtZWJ1c19kcml2ZXIgKmRydik7CisKK2ludCBpYm1lYnVzX3JlcXVlc3RfaXJxKHN0cnVjdCBpYm1lYnVzX2RldiAqZGV2LAorCQkJdTMyIGlzdCwgCisJCQlpcnFyZXR1cm5fdCAoKmhhbmRsZXIpKGludCwgdm9pZCosIHN0cnVjdCBwdF9yZWdzICopLAorCQkJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3MsIGNvbnN0IGNoYXIgKiBkZXZuYW1lLAorCQkJdm9pZCAqZGV2X2lkKTsKK3ZvaWQgaWJtZWJ1c19mcmVlX2lycShzdHJ1Y3QgaWJtZWJ1c19kZXYgKmRldiwgdTMyIGlzdCwgdm9pZCAqZGV2X2lkKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaWJtZWJ1c19kcml2ZXIgKnRvX2libWVidXNfZHJpdmVyKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkcnYsIHN0cnVjdCBpYm1lYnVzX2RyaXZlciwgZHJpdmVyKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaWJtZWJ1c19kZXYgKnRvX2libWVidXNfZGV2KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGlibWVidXNfZGV2LCBvZmRldi5kZXYpOworfQorCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX0FTTV9JQk1FQlVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaW8uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaW8uaAppbmRleCA0ODkzOGQ4Li42OGVmYmVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pby5oCkBAIC0xLDUgKzEsNiBAQAogI2lmbmRlZiBfQVNNX1BPV0VSUENfSU9fSAogI2RlZmluZSBfQVNNX1BPV0VSUENfSU9fSAorI2lmZGVmIF9fS0VSTkVMX18KIAogLyogCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0xODYsNyArMTg3LDYgQEAKICNkZWZpbmUgSU9fU1BBQ0VfTElNSVQgfigwVUwpCiAKIAotI2lmZGVmIF9fS0VSTkVMX18KIGV4dGVybiBpbnQgX19pb3JlbWFwX2V4cGxpY2l0KHVuc2lnbmVkIGxvbmcgcF9hZGRyLCB1bnNpZ25lZCBsb25nIHZfYWRkciwKIAkJICAgICAJICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIGV4dGVybiB2b2lkIF9faW9tZW0gKl9faW9yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKQEAgLTI1Niw4ICsyNTYsNiBAQAogICovCiAjZGVmaW5lIEJJT19WTUVSR0VfQk9VTkRBUlkJMAogCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCiBzdGF0aWMgaW5saW5lIHZvaWQgaW9zeW5jKHZvaWQpCiB7CiAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIgOiA6IDogIm1lbW9yeSIpOwpAQCAtNDA1LDggKzQwMyw2IEBACiAjaW5jbHVkZSA8YXNtL2VlaC5oPgogI2VuZGlmCiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KIC8qKgogICoJY2hlY2tfc2lnbmF0dXJlCQktCWZpbmQgQklPUyBzaWduYXR1cmVzCiAgKglAaW9fYWRkcjogbW1pbyBhZGRyZXNzIHRvIGNoZWNrCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvbW11LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvbW11LmgKaW5kZXggZjg5ZjA2MC4uZDU2NzdjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pb21tdS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaW9tbXUuaApAQCAtMjAsNiArMjAsNyBAQAogCiAjaWZuZGVmIF9BU01fSU9NTVVfSAogI2RlZmluZSBfQVNNX0lPTU1VX0gKKyNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KQEAgLTU2LDMyICs1NywxMyBAQAogCiAvKiBXYWxrcyBhbGwgYnVzZXMgYW5kIGNyZWF0ZXMgaW9tbXUgdGFibGVzICovCiBleHRlcm4gdm9pZCBpb21tdV9zZXR1cF9wU2VyaWVzKHZvaWQpOwotZXh0ZXJuIHZvaWQgaW9tbXVfc2V0dXBfdTModm9pZCk7CitleHRlcm4gdm9pZCBpb21tdV9zZXR1cF9kYXJ0KHZvaWQpOwogCiAvKiBGcmVlcyB0YWJsZSBmb3IgYW4gaW5kaXZpZHVhbCBkZXZpY2Ugbm9kZSAqLwogZXh0ZXJuIHZvaWQgaW9tbXVfZnJlZV90YWJsZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKTsKIAogI2VuZGlmIC8qIENPTkZJR19QUENfTVVMVElQTEFURk9STSAqLwogCi0jaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCi0KLS8qIENyZWF0ZXMgdGFibGUgZm9yIGFuIGluZGl2aWR1YWwgZGV2aWNlIG5vZGUgKi8KLWV4dGVybiB2b2lkIGlvbW11X2Rldm5vZGVfaW5pdF9wU2VyaWVzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pOwotCi0jZW5kaWYgLyogQ09ORklHX1BQQ19QU0VSSUVTICovCi0KLSNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLQotLyogQ3JlYXRlcyB0YWJsZSBmb3IgYW4gaW5kaXZpZHVhbCBkZXZpY2Ugbm9kZSAqLwotZXh0ZXJuIHZvaWQgaW9tbXVfZGV2bm9kZV9pbml0X2lTZXJpZXMoc3RydWN0IGRldmljZV9ub2RlICpkbik7Ci0vKiBHZXQgdGFibGUgcGFyYW1ldGVycyBmcm9tIEhWICovCi1leHRlcm4gdm9pZCBpb21tdV90YWJsZV9nZXRwYXJtc19pU2VyaWVzKHVuc2lnbmVkIGxvbmcgYnVzbm8sCi0JCQkJCSB1bnNpZ25lZCBjaGFyIHNsb3RubywKLQkJCQkJIHVuc2lnbmVkIGNoYXIgdmlydGJ1cywKLQkJCQkJIHN0cnVjdCBpb21tdV90YWJsZSogdGJsKTsKLQotI2VuZGlmIC8qIENPTkZJR19QUENfSVNFUklFUyAqLwotCiAvKiBJbml0aWFsaXplcyBhbiBpb21tdV90YWJsZSBiYXNlZCBpbiB2YWx1ZXMgc2V0IGluIHRoZSBwYXNzZWQtaW4KICAqIHN0cnVjdHVyZQogICovCkBAIC0xMDQsNyArODYsNyBAQAogCiBleHRlcm4gdm9pZCBpb21tdV9pbml0X2Vhcmx5X3BTZXJpZXModm9pZCk7CiBleHRlcm4gdm9pZCBpb21tdV9pbml0X2Vhcmx5X2lTZXJpZXModm9pZCk7Ci1leHRlcm4gdm9pZCBpb21tdV9pbml0X2Vhcmx5X3UzKHZvaWQpOworZXh0ZXJuIHZvaWQgaW9tbXVfaW5pdF9lYXJseV9kYXJ0KHZvaWQpOwogCiAjaWZkZWYgQ09ORklHX1BDSQogZXh0ZXJuIHZvaWQgcGNpX2lvbW11X2luaXQodm9pZCk7CkBAIC0xMTMsNiArOTUsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIHBjaV9pb21tdV9pbml0KHZvaWQpIHsgfQogI2VuZGlmCiAKLWV4dGVybiB2b2lkIGFsbG9jX3UzX2RhcnRfdGFibGUodm9pZCk7CitleHRlcm4gdm9pZCBhbGxvY19kYXJ0X3RhYmxlKHZvaWQpOwogCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9BU01fSU9NTVVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2lwaWMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXBpYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1wcGMvaXBpYy5oCnJlbmFtZSB0byBpbmNsdWRlL2FzbS1wb3dlcnBjL2lwaWMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2h2X2NhbGwuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl9jYWxsLmgKaW5kZXggZTlmODMxYy4uMTYyZDY1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2h2X2NhbGwuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaHZfY2FsbC5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqIEh2Q2FsbC5oCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgIE1pa2UgQ29ycmlnYW4gSUJNIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTE1LDggKzE0LDcgQEAKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCi0gKi8KLS8qCisgKgogICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSAiaHlwZXJ2aXNvciBjYWxsIiBpbnRlcmZhY2Ugd2hpY2ggaXMgdXNlZCB0bwogICogZHJpdmUgdGhlIGh5cGVydmlzb3IgZnJvbSB0aGUgT1MuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl9jYWxsX2V2ZW50LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaHZfY2FsbF9ldmVudC5oCmluZGV4IDQ2NzYzYTMuLjRjZWM0NzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl9jYWxsX2V2ZW50LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2h2X2NhbGxfZXZlbnQuaApAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiBIdkNhbGxFdmVudC5oCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgIE1pa2UgQ29ycmlnYW4gSUJNIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTE1LDggKzE0LDcgQEAKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCi0gKi8KLS8qCisgKgogICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSAiaHlwZXJ2aXNvciBjYWxsIiBpbnRlcmZhY2Ugd2hpY2ggaXMgdXNlZCB0bwogICogZHJpdmUgdGhlIGh5cGVydmlzb3IgZnJvbSB0aGUgT1MuCiAgKi8KQEAgLTMzLDMyICszMSw5IEBACiB0eXBlZGVmIHU4IEh2THBFdmVudF9BY2tJbmQ7CiB0eXBlZGVmIHU4IEh2THBFdmVudF9BY2tUeXBlOwogCi1zdHJ1Y3QJSHZDYWxsRXZlbnRfUGFja2VkUGFybXMgewotCXU4CQl4QWNrVHlwZToxOwotCXU4CQl4QWNrSW5kOjE7Ci0JdTgJCXhSc3ZkOjE7Ci0JdTgJCXhUYXJnZXRMcDo1OwotCXU4CQl4VHlwZTsKLQl1MTYJCXhTdWJ0eXBlOwotCUh2THBJbnN0YW5jZUlkCXhTb3VyY2VJbnN0SWQ7Ci0JSHZMcEluc3RhbmNlSWQJeFRhcmdldEluc3RJZDsKLX07Ci0KIHR5cGVkZWYgdTggSHZMcERtYV9EaXJlY3Rpb247CiB0eXBlZGVmIHU4IEh2THBEbWFfQWRkcmVzc1R5cGU7CiAKLXN0cnVjdAlIdkNhbGxFdmVudF9QYWNrZWREbWFQYXJtcyB7Ci0JdTgJCXhEaXJlY3Rpb246MTsKLQl1OAkJeExvY2FsQWRkclR5cGU6MTsKLQl1OAkJeFJlbW90ZUFkZHJUeXBlOjE7Ci0JdTgJCXhSc3ZkMTo1OwotCUh2THBJbmRleAl4UmVtb3RlTHA7Ci0JdTgJCXhUeXBlOwotCXU4CQl4UnN2ZDI7Ci0JSHZMcEluc3RhbmNlSWQJeExvY2FsSW5zdElkOwotCUh2THBJbnN0YW5jZUlkCXhSZW1vdGVJbnN0SWQ7Ci19OwotCiB0eXBlZGVmIHU2NCBIdkxwRXZlbnRfUmM7CiB0eXBlZGVmIHU2NCBIdkxwRG1hX1JjOwogCkBAIC05MiwxMSArNjcsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIEh2Q2FsbEV2ZW50X3NldExwRXZlbnRTdGFjayh1OCBxdWV1ZUluZGV4LAogCQljaGFyICpldmVudFN0YWNrQWRkciwgdTMyIGV2ZW50U3RhY2tTaXplKQogewotCXU2NCBhYnNfYWRkcjsKLQotCWFic19hZGRyID0gdmlydF90b19hYnMoZXZlbnRTdGFja0FkZHIpOwotCUh2Q2FsbDMoSHZDYWxsRXZlbnRTZXRMcEV2ZW50U3RhY2ssIHF1ZXVlSW5kZXgsIGFic19hZGRyLAotCQkJZXZlbnRTdGFja1NpemUpOworCUh2Q2FsbDMoSHZDYWxsRXZlbnRTZXRMcEV2ZW50U3RhY2ssIHF1ZXVlSW5kZXgsCisJCQl2aXJ0X3RvX2FicyhldmVudFN0YWNrQWRkciksIGV2ZW50U3RhY2tTaXplKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIEh2Q2FsbEV2ZW50X3NldExwRXZlbnRRdWV1ZUludGVycnVwdFByb2ModTggcXVldWVJbmRleCwKQEAgLTEwOCwxNCArODAsNyBAQAogCiBzdGF0aWMgaW5saW5lIEh2THBFdmVudF9SYyBIdkNhbGxFdmVudF9zaWduYWxMcEV2ZW50KHN0cnVjdCBIdkxwRXZlbnQgKmV2ZW50KQogewotCXU2NCBhYnNfYWRkcjsKLQotI2lmZGVmIERFQlVHX1NFTkRFVkVOVAotCXByaW50aygiSHZDYWxsRXZlbnRfc2lnbmFsTHBFdmVudDogKmV2ZW50ID0gJTAxNmx4XG4gIiwKLQkJCSh1bnNpZ25lZCBsb25nKWV2ZW50KTsKLSNlbmRpZgotCWFic19hZGRyID0gdmlydF90b19hYnMoZXZlbnQpOwotCXJldHVybiBIdkNhbGwxKEh2Q2FsbEV2ZW50U2lnbmFsTHBFdmVudCwgYWJzX2FkZHIpOworCXJldHVybiBIdkNhbGwxKEh2Q2FsbEV2ZW50U2lnbmFsTHBFdmVudCwgdmlydF90b19hYnMoZXZlbnQpKTsKIH0KIAogc3RhdGljIGlubGluZSBIdkxwRXZlbnRfUmMgSHZDYWxsRXZlbnRfc2lnbmFsTHBFdmVudEZhc3QoSHZMcEluZGV4IHRhcmdldExwLApAQCAtMTI3LDE3ICs5MiwyMSBAQAogewogCS8qIFBhY2sgdGhlIG1pc2MgYml0cyBpbnRvIGEgc2luZ2xlIER3b3JkIHRvIHBhc3MgdG8gUExJQyAqLwogCXVuaW9uIHsKLQkJc3RydWN0IEh2Q2FsbEV2ZW50X1BhY2tlZFBhcm1zCXBhcm1zOworCQlzdHJ1Y3QgeworCQkJdTgJCWFja19hbmRfdGFyZ2V0OworCQkJdTgJCXR5cGU7CisJCQl1MTYJCXN1YnR5cGU7CisJCQlIdkxwSW5zdGFuY2VJZAlzcmNfaW5zdDsKKwkJCUh2THBJbnN0YW5jZUlkCXRhcmdldF9pbnN0OworCQl9IHBhcm1zOwogCQl1NjQJCWR3b3JkOwogCX0gcGFja2VkOwotCXBhY2tlZC5wYXJtcy54QWNrVHlwZQk9IGFja1R5cGU7Ci0JcGFja2VkLnBhcm1zLnhBY2tJbmQJPSBhY2tJbmQ7Ci0JcGFja2VkLnBhcm1zLnhSc3ZkCT0gMDsKLQlwYWNrZWQucGFybXMueFRhcmdldExwCT0gdGFyZ2V0THA7Ci0JcGFja2VkLnBhcm1zLnhUeXBlCT0gdHlwZTsKLQlwYWNrZWQucGFybXMueFN1YnR5cGUJPSBzdWJ0eXBlOwotCXBhY2tlZC5wYXJtcy54U291cmNlSW5zdElkCT0gc291cmNlSW5zdGFuY2VJZDsKLQlwYWNrZWQucGFybXMueFRhcmdldEluc3RJZAk9IHRhcmdldEluc3RhbmNlSWQ7CisKKwlwYWNrZWQucGFybXMuYWNrX2FuZF90YXJnZXQgPSAoYWNrVHlwZSA8PCA3KSB8IChhY2tJbmQgPDwgNikgfCB0YXJnZXRMcDsKKwlwYWNrZWQucGFybXMudHlwZSA9IHR5cGU7CisJcGFja2VkLnBhcm1zLnN1YnR5cGUgPSBzdWJ0eXBlOworCXBhY2tlZC5wYXJtcy5zcmNfaW5zdCA9IHNvdXJjZUluc3RhbmNlSWQ7CisJcGFja2VkLnBhcm1zLnRhcmdldF9pbnN0ID0gdGFyZ2V0SW5zdGFuY2VJZDsKIAogCXJldHVybiBIdkNhbGw3KEh2Q2FsbEV2ZW50U2lnbmFsTHBFdmVudFBhcm1zLCBwYWNrZWQuZHdvcmQsCiAJCQljb3JyZWxhdGlvblRva2VuLCBldmVudERhdGExLCBldmVudERhdGEyLApAQCAtMTQ2LDE4ICsxMTUsMTIgQEAKIAogc3RhdGljIGlubGluZSBIdkxwRXZlbnRfUmMgSHZDYWxsRXZlbnRfYWNrTHBFdmVudChzdHJ1Y3QgSHZMcEV2ZW50ICpldmVudCkKIHsKLQl1NjQgYWJzX2FkZHI7Ci0KLQlhYnNfYWRkciA9IHZpcnRfdG9fYWJzKGV2ZW50KTsKLQlyZXR1cm4gSHZDYWxsMShIdkNhbGxFdmVudEFja0xwRXZlbnQsIGFic19hZGRyKTsKKwlyZXR1cm4gSHZDYWxsMShIdkNhbGxFdmVudEFja0xwRXZlbnQsIHZpcnRfdG9fYWJzKGV2ZW50KSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgSHZMcEV2ZW50X1JjIEh2Q2FsbEV2ZW50X2NhbmNlbExwRXZlbnQoc3RydWN0IEh2THBFdmVudCAqZXZlbnQpCiB7Ci0JdTY0IGFic19hZGRyOwotCi0JYWJzX2FkZHIgPSB2aXJ0X3RvX2FicyhldmVudCk7Ci0JcmV0dXJuIEh2Q2FsbDEoSHZDYWxsRXZlbnRDYW5jZWxMcEV2ZW50LCBhYnNfYWRkcik7CisJcmV0dXJuIEh2Q2FsbDEoSHZDYWxsRXZlbnRDYW5jZWxMcEV2ZW50LCB2aXJ0X3RvX2FicyhldmVudCkpOwogfQogCiBzdGF0aWMgaW5saW5lIEh2THBJbnN0YW5jZUlkIEh2Q2FsbEV2ZW50X2dldFNvdXJjZUxwSW5zdGFuY2VJZCgKQEAgLTE5NSw1OSArMTU4LDM0IEBACiB7CiAJLyogUGFjayB0aGUgbWlzYyBiaXRzIGludG8gYSBzaW5nbGUgRHdvcmQgdG8gcGFzcyB0byBQTElDICovCiAJdW5pb24gewotCQlzdHJ1Y3QgSHZDYWxsRXZlbnRfUGFja2VkRG1hUGFybXMJcGFybXM7CisJCXN0cnVjdCB7CisJCQl1OAkJZmxhZ3M7CisJCQlIdkxwSW5kZXgJcmVtb3RlOworCQkJdTgJCXR5cGU7CisJCQl1OAkJcmVzZXJ2ZWQ7CisJCQlIdkxwSW5zdGFuY2VJZAlsb2NhbF9pbnN0OworCQkJSHZMcEluc3RhbmNlSWQJcmVtb3RlX2luc3Q7CisJCX0gcGFybXM7CiAJCXU2NAkJZHdvcmQ7CiAJfSBwYWNrZWQ7CiAKLQlwYWNrZWQucGFybXMueERpcmVjdGlvbgkJPSBkaXJlY3Rpb247Ci0JcGFja2VkLnBhcm1zLnhMb2NhbEFkZHJUeXBlCT0gbG9jYWxBZGRyZXNzVHlwZTsKLQlwYWNrZWQucGFybXMueFJlbW90ZUFkZHJUeXBlCT0gcmVtb3RlQWRkcmVzc1R5cGU7Ci0JcGFja2VkLnBhcm1zLnhSc3ZkMQkJPSAwOwotCXBhY2tlZC5wYXJtcy54UmVtb3RlTHAJCT0gcmVtb3RlTHA7Ci0JcGFja2VkLnBhcm1zLnhUeXBlCQk9IHR5cGU7Ci0JcGFja2VkLnBhcm1zLnhSc3ZkMgkJPSAwOwotCXBhY2tlZC5wYXJtcy54TG9jYWxJbnN0SWQJPSBsb2NhbEluc3RhbmNlSWQ7Ci0JcGFja2VkLnBhcm1zLnhSZW1vdGVJbnN0SWQJPSByZW1vdGVJbnN0YW5jZUlkOworCXBhY2tlZC5wYXJtcy5mbGFncyA9IChkaXJlY3Rpb24gPDwgNykgfAorCQkobG9jYWxBZGRyZXNzVHlwZSA8PCA2KSB8IChyZW1vdGVBZGRyZXNzVHlwZSA8PCA1KTsKKwlwYWNrZWQucGFybXMucmVtb3RlID0gcmVtb3RlTHA7CisJcGFja2VkLnBhcm1zLnR5cGUgPSB0eXBlOworCXBhY2tlZC5wYXJtcy5yZXNlcnZlZCA9IDA7CisJcGFja2VkLnBhcm1zLmxvY2FsX2luc3QgPSBsb2NhbEluc3RhbmNlSWQ7CisJcGFja2VkLnBhcm1zLnJlbW90ZV9pbnN0ID0gcmVtb3RlSW5zdGFuY2VJZDsKIAogCXJldHVybiBIdkNhbGw0KEh2Q2FsbEV2ZW50RG1hQnVmTGlzdCwgcGFja2VkLmR3b3JkLCBsb2NhbEJ1Zkxpc3QsCiAJCQlyZW1vdGVCdWZMaXN0LCB0cmFuc2Zlckxlbmd0aCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgSHZMcERtYV9SYyBIdkNhbGxFdmVudF9kbWFTaW5nbGUoSHZMcEV2ZW50X1R5cGUgdHlwZSwKLQkJSHZMcEluZGV4IHJlbW90ZUxwLCBIdkxwRG1hX0RpcmVjdGlvbiBkaXJlY3Rpb24sCi0JCUh2THBJbnN0YW5jZUlkIGxvY2FsSW5zdGFuY2VJZCwKLQkJSHZMcEluc3RhbmNlSWQgcmVtb3RlSW5zdGFuY2VJZCwKLQkJSHZMcERtYV9BZGRyZXNzVHlwZSBsb2NhbEFkZHJlc3NUeXBlLAotCQlIdkxwRG1hX0FkZHJlc3NUeXBlIHJlbW90ZUFkZHJlc3NUeXBlLAotCQl1NjQgbG9jYWxBZGRyT3JUY2UsIHU2NCByZW1vdGVBZGRyT3JUY2UsIHUzMiB0cmFuc2Zlckxlbmd0aCkKLXsKLQkvKiBQYWNrIHRoZSBtaXNjIGJpdHMgaW50byBhIHNpbmdsZSBEd29yZCB0byBwYXNzIHRvIFBMSUMgKi8KLQl1bmlvbiB7Ci0JCXN0cnVjdCBIdkNhbGxFdmVudF9QYWNrZWREbWFQYXJtcwlwYXJtczsKLQkJdTY0CQlkd29yZDsKLQl9IHBhY2tlZDsKLQotCXBhY2tlZC5wYXJtcy54RGlyZWN0aW9uCQk9IGRpcmVjdGlvbjsKLQlwYWNrZWQucGFybXMueExvY2FsQWRkclR5cGUJPSBsb2NhbEFkZHJlc3NUeXBlOwotCXBhY2tlZC5wYXJtcy54UmVtb3RlQWRkclR5cGUJPSByZW1vdGVBZGRyZXNzVHlwZTsKLQlwYWNrZWQucGFybXMueFJzdmQxCQk9IDA7Ci0JcGFja2VkLnBhcm1zLnhSZW1vdGVMcAkJPSByZW1vdGVMcDsKLQlwYWNrZWQucGFybXMueFR5cGUJCT0gdHlwZTsKLQlwYWNrZWQucGFybXMueFJzdmQyCQk9IDA7Ci0JcGFja2VkLnBhcm1zLnhMb2NhbEluc3RJZAk9IGxvY2FsSW5zdGFuY2VJZDsKLQlwYWNrZWQucGFybXMueFJlbW90ZUluc3RJZAk9IHJlbW90ZUluc3RhbmNlSWQ7Ci0KLQlyZXR1cm4gKEh2THBEbWFfUmMpSHZDYWxsNChIdkNhbGxFdmVudERtYVNpbmdsZSwgcGFja2VkLmR3b3JkLAotCQkJbG9jYWxBZGRyT3JUY2UsIHJlbW90ZUFkZHJPclRjZSwgdHJhbnNmZXJMZW5ndGgpOwotfQotCiBzdGF0aWMgaW5saW5lIEh2THBEbWFfUmMgSHZDYWxsRXZlbnRfZG1hVG9TcCh2b2lkICpsb2NhbCwgdTMyIHJlbW90ZSwKIAkJdTMyIGxlbmd0aCwgSHZMcERtYV9EaXJlY3Rpb24gZGlyKQogewotCXU2NCBhYnNfYWRkcjsKLQotCWFic19hZGRyID0gdmlydF90b19hYnMobG9jYWwpOwotCXJldHVybiBIdkNhbGw0KEh2Q2FsbEV2ZW50RG1hVG9TcCwgYWJzX2FkZHIsIHJlbW90ZSwgbGVuZ3RoLCBkaXIpOworCXJldHVybiBIdkNhbGw0KEh2Q2FsbEV2ZW50RG1hVG9TcCwgdmlydF90b19hYnMobG9jYWwpLCByZW1vdGUsCisJCQlsZW5ndGgsIGRpcik7CiB9CiAKICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfSVNFUklFU19IVl9DQUxMX0VWRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl9jYWxsX3NjLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaHZfY2FsbF9zYy5oCmluZGV4IGRlYzdlOWQuLmY1ZDIxMDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl9jYWxsX3NjLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2h2X2NhbGxfc2MuaApAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiBIdkNhbGxTYy5oCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgIE1pa2UgQ29ycmlnYW4gSUJNIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl9scF9jb25maWcuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl9scF9jb25maWcuaAppbmRleCBiYzAwZjAzLi5kZjhiMjA3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaHZfbHBfY29uZmlnLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2h2X2xwX2NvbmZpZy5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqIEh2THBDb25maWcuaAogICogQ29weXJpZ2h0IChDKSAyMDAxICBNaWtlIENvcnJpZ2FuIElCTSBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaHZfbHBfZXZlbnQuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl9scF9ldmVudC5oCmluZGV4IDQ5OWFiMWEuLjQwNjVhNGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl9scF9ldmVudC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl9scF9ldmVudC5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqIEh2THBFdmVudC5oCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgIE1pa2UgQ29ycmlnYW4gSUJNIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTMyLDE3ICszMSw4IEBACiAgKiBwYXJ0aXRpb25zIHRocm91Z2ggUExJQy4KICAqLwogCi1zdHJ1Y3QgSHZFdmVudEZsYWdzIHsKLQl1OAl4VmFsaWQ6MTsJLyogSW5kaWNhdGVzIGEgdmFsaWQgcmVxdWVzdAl4MDAteDAwICovCi0JdTgJeFJzdmQxOjQ7CS8qIFJlc2VydmVkCQkJLi4uICovCi0JdTgJeEFja1R5cGU6MTsJLyogSW1tZWRpYXRlIG9yIGRlZmVycmVkCS4uLiAqLwotCXU4CXhBY2tJbmQ6MTsJLyogSW5kaWNhdGVzIGlmIEFDSyByZXF1aXJlZAkuLi4gKi8KLQl1OAl4RnVuY3Rpb246MTsJLyogSW50ZXJydXB0IG9yIEFja25vd2xlZGdlCS4uLiAqLwotfTsKLQotCiBzdHJ1Y3QgSHZMcEV2ZW50IHsKLQlzdHJ1Y3QgSHZFdmVudEZsYWdzIHhGbGFnczsJLyogRXZlbnQgZmxhZ3MJCSAgICAgIHgwMC14MDAgKi8KKwl1OAlmbGFnczsJCQkvKiBFdmVudCBmbGFncwkJICAgICAgeDAwLXgwMCAqLwogCXU4CXhUeXBlOwkJCS8qIFR5cGUgb2YgbWVzc2FnZQkgICAgICB4MDEteDAxICovCiAJdTE2CXhTdWJ0eXBlOwkJLyogU3VidHlwZSBmb3IgZXZlbnQJICAgICAgeDAyLXgwMyAqLwogCXU4CXhTb3VyY2VMcDsJCS8qIFNvdXJjZSBMUAkJICAgICAgeDA0LXgwNCAqLwpAQCAtMTI2LDYgKzExNiwxMSBAQAogI2RlZmluZSBIdkxwRXZlbnRfQWNrVHlwZV9JbW1lZGlhdGVBY2sgMAogI2RlZmluZSBIdkxwRXZlbnRfQWNrVHlwZV9EZWZlcnJlZEFjayAxCiAKKyNkZWZpbmUgSFZfTFBfRVZFTlRfSU5UCQkJMHgwMQorI2RlZmluZSBIVl9MUF9FVkVOVF9ET19BQ0sJCTB4MDIKKyNkZWZpbmUgSFZfTFBfRVZFTlRfREVGRVJSRURfQUNLCTB4MDQKKyNkZWZpbmUgSFZfTFBfRVZFTlRfVkFMSUQJCTB4ODAKKwogI2RlZmluZSBIdkxwRG1hX0RpcmVjdGlvbl9Mb2NhbFRvUmVtb3RlIDAKICNkZWZpbmUgSHZMcERtYV9EaXJlY3Rpb25fUmVtb3RlVG9Mb2NhbCAxCiAKQEAgLTEzOSw0ICsxMzQsMjkgQEAKICNkZWZpbmUgSHZMcERtYV9SY19JbnZhbGlkQWRkcmVzcyA0CiAjZGVmaW5lIEh2THBEbWFfUmNfSW52YWxpZExlbmd0aCA1CiAKK3N0YXRpYyBpbmxpbmUgaW50IGh2bHBldmVudF9pc192YWxpZChzdHJ1Y3QgSHZMcEV2ZW50ICpoKQoreworCXJldHVybiBoLT5mbGFncyAmIEhWX0xQX0VWRU5UX1ZBTElEOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaHZscGV2ZW50X2ludmFsaWRhdGUoc3RydWN0IEh2THBFdmVudCAqaCkKK3sKKwloLT5mbGFncyAmPSB+IEhWX0xQX0VWRU5UX1ZBTElEOworfQorCitzdGF0aWMgaW5saW5lIGludCBodmxwZXZlbnRfaXNfaW50KHN0cnVjdCBIdkxwRXZlbnQgKmgpCit7CisJcmV0dXJuIGgtPmZsYWdzICYgSFZfTFBfRVZFTlRfSU5UOworfQorCitzdGF0aWMgaW5saW5lIGludCBodmxwZXZlbnRfaXNfYWNrKHN0cnVjdCBIdkxwRXZlbnQgKmgpCit7CisJcmV0dXJuICFodmxwZXZlbnRfaXNfaW50KGgpOworfQorCitzdGF0aWMgaW5saW5lIGludCBodmxwZXZlbnRfbmVlZF9hY2soc3RydWN0IEh2THBFdmVudCAqaCkKK3sKKwlyZXR1cm4gaC0+ZmxhZ3MgJiBIVl9MUF9FVkVOVF9ET19BQ0s7Cit9CisKICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfSVNFUklFU19IVl9MUF9FVkVOVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaHZfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl90eXBlcy5oCmluZGV4IGMzOGY3ZTMuLmMzZTZkMmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9odl90eXBlcy5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqIEh2VHlwZXMuaAogICogQ29weXJpZ2h0IChDKSAyMDAxICBNaWtlIENvcnJpZ2FuIElCTSBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaXNlcmllc19pby5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2lzZXJpZXNfaW8uaAppbmRleCA1NmIyMTEzLi40OTZhYTg1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaXNlcmllc19pby5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9pc2VyaWVzX2lvLmgKQEAgLTYsNyArNiw3IEBACiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIC8qCi0gKiBGaWxlIGlTZXJpZXNfaW8uaCBjcmVhdGVkIGJ5IEFsbGFuIFRyYXV0bWFuIG9uIFRodSBEZWMgMjggMjAwMC4KKyAqIENyZWF0ZWQgYnkgQWxsYW4gVHJhdXRtYW4gb24gVGh1IERlYyAyOCAyMDAwLgogICoKICAqIFJlbWFwcyB0aGUgaW8uaCBmb3IgdGhlIGlTZXJpZXMgSW8KICAqIENvcHlyaWdodCAoQykgMjAwMCAgQWxsYW4gSCBUcmF1dG1hbiwgSUJNIENvcnBvcmF0aW9uCkBAIC0zMiw2ICszMiw3IEBACiAgKiBFbmQgQ2hhbmdlIEFjdGl2aXR5CiAgKi8KIAorI2lmZGVmIENPTkZJR19QQ0kKIGV4dGVybiB1OCAgIGlTZXJpZXNfUmVhZF9CeXRlKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqIElvQWRkcmVzcyk7CiBleHRlcm4gdTE2ICBpU2VyaWVzX1JlYWRfV29yZChjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKiBJb0FkZHJlc3MpOwogZXh0ZXJuIHUzMiAgaVNlcmllc19SZWFkX0xvbmcoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICogSW9BZGRyZXNzKTsKQEAgLTQ0LDYgKzQ1LDE3IEBACiAJCXNpemVfdCBuKTsKIGV4dGVybiB2b2lkIGlTZXJpZXNfbWVtY3B5X2Zyb21pbyh2b2lkICpkZXN0LAogCQljb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnNvdXJjZSwgc2l6ZV90IG4pOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdTggaVNlcmllc19SZWFkX0J5dGUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpJb0FkZHJlc3MpCit7CisJcmV0dXJuIDB4ZmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpU2VyaWVzX1dyaXRlX0J5dGUodTggSW9EYXRhLAorCQl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKklvQWRkcmVzcykKK3sKK30KKyNlbmRpZgkvKiBDT05GSUdfUENJICovCiAKICNlbmRpZiAvKiBDT05GSUdfUFBDX0lTRVJJRVMgKi8KICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfSVNFUklFU19JU0VSSUVTX0lPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9pdF9leHBfdnBkX3BhbmVsLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaXRfZXhwX3ZwZF9wYW5lbC5oCmluZGV4IDY2YTE3YTIuLjMwNGE2MDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9pdF9leHBfdnBkX3BhbmVsLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2l0X2V4cF92cGRfcGFuZWwuaApAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiBJdEV4dFZwZFBhbmVsLmgKICAqIENvcHlyaWdodCAoQykgMjAwMiAgRGF2ZSBCb3V0Y2hlciBJQk0gQ29ycG9yYXRpb24KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2l0X2xwX25hY2EuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9pdF9scF9uYWNhLmgKaW5kZXggYzNlZjFkZS4uNGZkY2YwNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2l0X2xwX25hY2EuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaXRfbHBfbmFjYS5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqIEl0THBOYWNhLmgKICAqIENvcHlyaWdodCAoQykgMjAwMSAgTWlrZSBDb3JyaWdhbiBJQk0gQ29ycG9yYXRpb24KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMzcsMTcgKzM2LDEzIEBACiAJdTgJeExwSW5kZXg7CQkvLyBMUCBJbmRleAkJCXgwQi14MEIKIAl1MTYJeE1heExwUXVldWVzOwkJLy8gTnVtYmVyIG9mIGFsbG9jYXRlZCBxdWV1ZXMJeDBDLXgwRAogCXUxNgl4THBRdWV1ZU9mZnNldDsJCS8vIE9mZnNldCB0byBzdGFydCBvZiBMUCBxdWV1ZXMJeDBFLXgwRgotCXU4CXhQaXJFbnZpcm9uTW9kZTo4OwkvLyBQaXJhbmhhIG9yIGhhcmR3YXJlCQl4MTAteDEwCi0JdTgJeFBpckNvbnNvbGVNb2RlOjg7CS8vIFBpcmFuaGEgY29uc29sZSBpbmRpY2F0b3IJeDExLXgxMQotCXU4CXhQaXJEYXNkTW9kZTo4OwkJLy8gUGlyYW5oYSBkYXNkIGluZGljYXRvcgl4MTIteDEyCisJdTgJeFBpckVudmlyb25Nb2RlOwkvLyBQaXJhbmhhIG9yIGhhcmR3YXJlCQl4MTAteDEwCisJdTgJeFBpckNvbnNvbGVNb2RlOwkvLyBQaXJhbmhhIGNvbnNvbGUgaW5kaWNhdG9yCXgxMS14MTEKKwl1OAl4UGlyRGFzZE1vZGU7CQkvLyBQaXJhbmhhIGRhc2QgaW5kaWNhdG9yCXgxMi14MTIKIAl1OAl4UnN2ZDFfMFs1XTsJCS8vIFJlc2VydmVkIGZvciBQaXJhbmhhIHJlbGF0ZWQJeDEzLXgxNwotCXU4CXhMcGFySW5zdGFsbGVkOjE7CS8vIElzIExQQVIgaW5zdGFsbGVkIG9uIHN5c3RlbQl4MTgteDFGCi0JdTgJeFN5c1BhcnRpdGlvbmVkOjE7CS8vIElzIHRoZSBzeXN0ZW0gcGFydGl0aW9uZWQJLi4uCi0JdTgJeEh3U3luY2VkVEJzOjE7CQkvLyBIYXJkd2FyZSBzeW5jZWQgVEJzCQkuLi4KLQl1OAl4SW50UHJvY1V0aWxIbXQ6MTsJLy8gVXRpbGl6ZSBITVQgZm9yIGludGVycnVwdHMJLi4uCi0JdTgJeFJzdmQxXzE6NDsJCS8vIFJlc2VydmVkCQkJLi4uCi0JdTgJeFNwVnBkRm9ybWF0Ojg7CQkvLyBWUEQgYXJlYXMgYXJlIGluIENTUCBmb3JtYXQJLi4uCi0JdTgJeEludFByb2NSYXRpbzo4OwkvLyBSYXRpbyBvZiBpbnQgcHJvY3MgdG8gcHJvY3MJLi4uCisJdTgJZmxhZ3M7CQkJLy8gZmxhZ3MsIHNlZSBiZWxvdwkJeDE4LXgxRgorCXU4CXhTcFZwZEZvcm1hdDsJCS8vIFZQRCBhcmVhcyBhcmUgaW4gQ1NQIGZvcm1hdAkuLi4KKwl1OAl4SW50UHJvY1JhdGlvOwkJLy8gUmF0aW8gb2YgaW50IHByb2NzIHRvIHByb2NzCS4uLgogCXU4CXhSc3ZkMV8yWzVdOwkJLy8gUmVzZXJ2ZWQJCQkuLi4KIAl1MTYJeFJzdmQxXzM7CQkvLyBSZXNlcnZlZAkJCXgyMC14MjEKIAl1MTYJeFBsaWNWcm1JbmRleDsJCS8vIFZSTSBpbmRleCBvZiBQTElDCQl4MjIteDIzCkBAIC03Nyw0ICs3Miw5IEBACiAKIGV4dGVybiBzdHJ1Y3QgSXRMcE5hY2EJCWl0THBOYWNhOwogCisjZGVmaW5lIElUTFBOQUNBX0xQQVIJCTB4ODAJLyogSXMgTFBBUiBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbSAqLworI2RlZmluZSBJVExQTkFDQV9QQVJUSVRJT05FRAkweDQwCS8qIElzIHRoZSBzeXN0ZW0gcGFydGl0aW9uZWQgKi8KKyNkZWZpbmUgSVRMUE5BQ0FfSFdTWU5DRURUQlMJMHgyMAkvKiBIYXJkd2FyZSBzeW5jZWQgVEJzICovCisjZGVmaW5lIElUTFBOQUNBX0hNVElOVAkJMHgxMAkvKiBVdGlsaXplIE1IVCBmb3IgaW50ZXJydXB0cyAqLworCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0lTRVJJRVNfSVRfTFBfTkFDQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaXRfbHBfcXVldWUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9pdF9scF9xdWV1ZS5oCmluZGV4IGE2MGQwM2EuLmI3YzZmYzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9pdF9scF9xdWV1ZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9pdF9scF9xdWV1ZS5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqIEl0THBRdWV1ZS5oCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgIE1pa2UgQ29ycmlnYW4gSUJNIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9pdF9scF9yZWdfc2F2ZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2l0X2xwX3JlZ19zYXZlLmgKaW5kZXggMjg4MDQ0Yi4uNTQwM2I3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2l0X2xwX3JlZ19zYXZlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2l0X2xwX3JlZ19zYXZlLmgKQEAgLTEsNSArMSw0IEBACiAvKgotICogSXRMcFJlZ1NhdmUuaAogICogQ29weXJpZ2h0IChDKSAyMDAxICBNaWtlIENvcnJpZ2FuIElCTSBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC04MSw0ICs4MCw2IEBACiAJdTgJeFJzdmQzWzE3Nl07CS8vIFJlc2VydmVkCQkJMzUwLTNGRgogfTsKIAotI2VuZGlmIC8qIF9JVExQUkVHU0FWRV9IICovCitleHRlcm4gc3RydWN0IEl0THBSZWdTYXZlIGlzZXJpZXNfcmVnX3NhdmVbXTsKKworI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19JU0VSSUVTX0lUX0xQX1JFR19TQVZFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9scGFyX21hcC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2xwYXJfbWFwLmgKaW5kZXggODRmYzMyMS4uMmVjMzg0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2xwYXJfbWFwLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2xwYXJfbWFwLmgKQEAgLTEsNSArMSw0IEBACiAvKgotICogTHBhck1hcC5oCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgIE1pa2UgQ29ycmlnYW4gSUJNIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9tZi5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL21mLmgKaW5kZXggZTdiZDU3YS4uODU3ZTUyMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL21mLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL21mLmgKQEAgLTEsNSArMSw0IEBACiAvKgotICogbWYuaAogICogQ29weXJpZ2h0IChDKSAyMDAxICBUcm95IEQuIEFybXN0cm9uZyBJQk0gQ29ycG9yYXRpb24KICAqIENvcHlyaWdodCAoQykgMjAwNCAgU3RlcGhlbiBSb3Rod2VsbCBJQk0gQ29ycG9yYXRpb24KICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvdmlvLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvdmlvLmgKaW5kZXggN2UzYTQ2OS4uNzJhOTdkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL3Zpby5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy92aW8uaApAQCAtMSw1ICsxLDQgQEAKIC8qIC0qLSBsaW51eC1jIC0qLQotICogIGRyaXZlcnMvY2hhci92aW8uaAogICoKICAqICBpU2VyaWVzIFZpcnR1YWwgSS9PIE1lc3NhZ2UgUGF0aCBoZWFkZXIKICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2tkZWJ1Zy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9rZGVidWcuaAppbmRleCA5ZGNiYWM2Li43YzE2MjY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2tkZWJ1Zy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMva2RlYnVnLmgKQEAgLTEsNSArMSw2IEBACiAjaWZuZGVmIF9BU01fUE9XRVJQQ19LREVCVUdfSAogI2RlZmluZSBfQVNNX1BPV0VSUENfS0RFQlVHX0gKKyNpZmRlZiBfX0tFUk5FTF9fCiAKIC8qIG5lYXJseSBpZGVudGljYWwgdG8geDg2XzY0L2kzODYgY29kZSAqLwogCkBAIC0zOSw0ICs0MCw1IEBACiAJcmV0dXJuIG5vdGlmaWVyX2NhbGxfY2hhaW4oJnBvd2VycGNfZGllX2NoYWluLCB2YWwsICZhcmdzKTsKIH0KIAorI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfS0RFQlVHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMva2R1bXAuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMva2R1bXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODdhZWQwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9rZHVtcC5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgX1BQQzY0X0tEVU1QX0gKKyNkZWZpbmUgX1BQQzY0X0tEVU1QX0gKKworLyogSG93IG1hbnkgYnl0ZXMgdG8gcmVzZXJ2ZSBhdCB6ZXJvIGZvciBrZHVtcC4gVGhlIHJlc2VydmUgbGltaXQgc2hvdWxkCisgKiBiZSBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSB0cmFtcG9saW5lJ3MgZW5kIGFkZHJlc3MuICovCisjZGVmaW5lIEtEVU1QX1JFU0VSVkVfTElNSVQJMHg4MDAwCisKKyNkZWZpbmUgS0RVTVBfVFJBTVBPTElORV9TVEFSVAkweDAxMDAKKyNkZWZpbmUgS0RVTVBfVFJBTVBPTElORV9FTkQJMHgzMDAwCisKK2V4dGVybiB2b2lkIGtkdW1wX3NldHVwKHZvaWQpOworCisjZW5kaWYgLyogX19QUEM2NF9LRFVNUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2tleGVjLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2tleGVjLmgKaW5kZXggYzcyZmZjNy4uNjQwYTY0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9rZXhlYy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMva2V4ZWMuaApAQCAtMSw1ICsxLDYgQEAKICNpZm5kZWYgX0FTTV9QT1dFUlBDX0tFWEVDX0gKICNkZWZpbmUgX0FTTV9QT1dFUlBDX0tFWEVDX0gKKyNpZmRlZiBfX0tFUk5FTF9fCiAKIC8qCiAgKiBNYXhpbXVtIHBhZ2UgdGhhdCBpcyBtYXBwZWQgZGlyZWN0bHkgaW50byBrZXJuZWwgbWVtb3J5LgpAQCAtMzAsMjEgKzMxLDk3IEBACiAjZGVmaW5lIEtFWEVDX0FSQ0ggS0VYRUNfQVJDSF9QUEMKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0tFWEVDCisKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY2FwdHVyaW5nIHJlZ2lzdGVyIHN0YXRlcyBpZiBjb21pbmcKKyAqIHZpYSBwYW5pYyBvciBpbnZva2luZyBkdW1wIHVzaW5nIHN5c3JxLXRyaWdnZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjcmFzaF9zZXR1cF9yZWdzKHN0cnVjdCBwdF9yZWdzICpuZXdyZWdzLAorCQkJCQlzdHJ1Y3QgcHRfcmVncyAqb2xkcmVncykKK3sKKwlpZiAob2xkcmVncykKKwkJbWVtY3B5KG5ld3JlZ3MsIG9sZHJlZ3MsIHNpemVvZigqbmV3cmVncykpOworCWVsc2UgeworCQkvKiBGSVhNRSBNZXJnZSB0aGlzIHdpdGggeG1vbl9zYXZlX3JlZ3MgPz8gKi8KKwkJdW5zaWduZWQgbG9uZyB0bXAxLCB0bXAyOworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCQkic3RkICAgIDAsMCglMilcbiIKKwkJCSJzdGQgICAgMSw4KCUyKVxuIgorCQkJInN0ZCAgICAyLDE2KCUyKVxuIgorCQkJInN0ZCAgICAzLDI0KCUyKVxuIgorCQkJInN0ZCAgICA0LDMyKCUyKVxuIgorCQkJInN0ZCAgICA1LDQwKCUyKVxuIgorCQkJInN0ZCAgICA2LDQ4KCUyKVxuIgorCQkJInN0ZCAgICA3LDU2KCUyKVxuIgorCQkJInN0ZCAgICA4LDY0KCUyKVxuIgorCQkJInN0ZCAgICA5LDcyKCUyKVxuIgorCQkJInN0ZCAgICAxMCw4MCglMilcbiIKKwkJCSJzdGQgICAgMTEsODgoJTIpXG4iCisJCQkic3RkICAgIDEyLDk2KCUyKVxuIgorCQkJInN0ZCAgICAxMywxMDQoJTIpXG4iCisJCQkic3RkICAgIDE0LDExMiglMilcbiIKKwkJCSJzdGQgICAgMTUsMTIwKCUyKVxuIgorCQkJInN0ZCAgICAxNiwxMjgoJTIpXG4iCisJCQkic3RkICAgIDE3LDEzNiglMilcbiIKKwkJCSJzdGQgICAgMTgsMTQ0KCUyKVxuIgorCQkJInN0ZCAgICAxOSwxNTIoJTIpXG4iCisJCQkic3RkICAgIDIwLDE2MCglMilcbiIKKwkJCSJzdGQgICAgMjEsMTY4KCUyKVxuIgorCQkJInN0ZCAgICAyMiwxNzYoJTIpXG4iCisJCQkic3RkICAgIDIzLDE4NCglMilcbiIKKwkJCSJzdGQgICAgMjQsMTkyKCUyKVxuIgorCQkJInN0ZCAgICAyNSwyMDAoJTIpXG4iCisJCQkic3RkICAgIDI2LDIwOCglMilcbiIKKwkJCSJzdGQgICAgMjcsMjE2KCUyKVxuIgorCQkJInN0ZCAgICAyOCwyMjQoJTIpXG4iCisJCQkic3RkICAgIDI5LDIzMiglMilcbiIKKwkJCSJzdGQgICAgMzAsMjQwKCUyKVxuIgorCQkJInN0ZCAgICAzMSwyNDgoJTIpXG4iCisJCQkibWZtc3IgICUwXG4iCisJCQkic3RkICAgICUwLCAyNjQoJTIpXG4iCisJCQkibWZjdHIgICUwXG4iCisJCQkic3RkICAgICUwLCAyODAoJTIpXG4iCisJCQkibWZsciAgICUwXG4iCisJCQkic3RkICAgICUwLCAyODgoJTIpXG4iCisJCQkiYmwgICAgIDFmXG4iCisJCSIxOiAgICAgbWZsciAgICUxXG4iCisJCQkic3RkICAgICUxLCAyNTYoJTIpXG4iCisJCQkibXRsciAgICUwXG4iCisJCQkibWZ4ZXIgICUwXG4iCisJCQkic3RkICAgICUwLCAyOTYoJTIpXG4iCisJCQk6ICI9JnIiICh0bXAxKSwgIj0mciIgKHRtcDIpCisJCQk6ICJiIiAobmV3cmVncykpOworCX0KK30KKyNlbHNlCisvKgorICogUHJvdmlkZSBhIGR1bW15IGRlZmluaXRpb24gdG8gYXZvaWQgYnVpbGQgZmFpbHVyZXMuIFdpbGwgcmVtYWluCisgKiBlbXB0eSB0aWxsIGNyYXNoIGR1bXAgc3VwcG9ydCBpcyBlbmFibGVkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY3Jhc2hfc2V0dXBfcmVncyhzdHJ1Y3QgcHRfcmVncyAqbmV3cmVncywKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKm9sZHJlZ3MpIHsgfQorI2VuZGlmIC8qICFfX3Bvd2VycGM2NCBfXyAqLworCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwotCiAjZGVmaW5lIE1BWF9OT1RFX0JZVEVTIDEwMjQKLXR5cGVkZWYgdTMyIG5vdGVfYnVmX3RbTUFYX05PVEVfQllURVMgLyBzaXplb2YodTMyKV07Ci0KLWV4dGVybiBub3RlX2J1Zl90IGNyYXNoX25vdGVzW107CiAKICNpZmRlZiBfX3Bvd2VycGM2NF9fCiBleHRlcm4gdm9pZCBrZXhlY19zbXBfd2FpdCh2b2lkKTsJLyogZ2V0IGFuZCBjbGVhciBuYWNhIHBoeXNpZCwgd2FpdCBmb3IKIAkJCQkJICBtYXN0ZXIgdG8gY29weSBuZXcgY29kZSB0byAwICovCiBleHRlcm4gdm9pZCBfX2luaXQga2V4ZWNfc2V0dXAodm9pZCk7Ci0jZWxzZQorZXh0ZXJuIGludCBjcmFzaGluZ19jcHU7CitleHRlcm4gdm9pZCBjcmFzaF9zZW5kX2lwaSh2b2lkICgqY3Jhc2hfaXBpX2NhbGxiYWNrKShzdHJ1Y3QgcHRfcmVncyAqKSk7CisjZW5kaWYgLyogX19wb3dlcnBjNjQgX18gKi8KKwogc3RydWN0IGtpbWFnZTsKLWV4dGVybiB2b2lkIG1hY2hpbmVfa2V4ZWNfc2ltcGxlKHN0cnVjdCBraW1hZ2UgKmltYWdlKTsKLSNlbmRpZgorc3RydWN0IHB0X3JlZ3M7CitleHRlcm4gdm9pZCBkZWZhdWx0X21hY2hpbmVfa2V4ZWMoc3RydWN0IGtpbWFnZSAqaW1hZ2UpOworZXh0ZXJuIGludCBkZWZhdWx0X21hY2hpbmVfa2V4ZWNfcHJlcGFyZShzdHJ1Y3Qga2ltYWdlICppbWFnZSk7CitleHRlcm4gdm9pZCBkZWZhdWx0X21hY2hpbmVfY3Jhc2hfc2h1dGRvd24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCiAjZW5kaWYgLyogISBfX0FTU0VNQkxZX18gKi8KKyNlbmRpZiAvKiBDT05GSUdfS0VYRUMgKi8KKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0tFWEVDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMva2V5bGFyZ28uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMva2V5bGFyZ28uaAppbmRleCBhNjY5YTNmLi5kODUyMGVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2tleWxhcmdvLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9rZXlsYXJnby5oCkBAIC0xLDMgKzEsNiBAQAorI2lmbmRlZiBfQVNNX1BPV0VSUENfS0VZTEFSR09fSAorI2RlZmluZSBfQVNNX1BPV0VSUENfS0VZTEFSR09fSAorI2lmZGVmIF9fS0VSTkVMX18KIC8qCiAgKiBrZXlsYXJnby5oOiBkZWZpbml0aW9ucyBmb3IgdXNpbmcgdGhlICJLZXlMYXJnbyIgSS9PIGNvbnRyb2xsZXIgY2hpcC4KICAqCkBAIC0yMzIsMTAgKzIzNSwxMiBAQAogI2RlZmluZSBLMl9GQ1IxX0kyUzBfUkVTRVQJCTB4MDAwMDA4MDAKICNkZWZpbmUgSzJfRkNSMV9JMlMwX0NMS19FTkFCTEVfQklUCTB4MDAwMDEwMDAKICNkZWZpbmUgSzJfRkNSMV9JMlMwX0VOQUJMRSAgICAJCTB4MDAwMDIwMDAKLQogI2RlZmluZSBLMl9GQ1IxX1BDSTFfQ0xLX0VOQUJMRQkJMHgwMDAwNDAwMAogI2RlZmluZSBLMl9GQ1IxX0ZXX0NMS19FTkFCTEUJCTB4MDAwMDgwMDAKICNkZWZpbmUgSzJfRkNSMV9GV19SRVNFVF9OCQkweDAwMDEwMDAwCisjZGVmaW5lIEsyX0ZDUjFfSTJTMV9DRUxMX0VOQUJMRQkweDAwMDIwMDAwCisjZGVmaW5lIEsyX0ZDUjFfSTJTMV9DTEtfRU5BQkxFX0JJVAkweDAwMDgwMDAwCisjZGVmaW5lIEsyX0ZDUjFfSTJTMV9FTkFCTEUJCTB4MDAxMDAwMDAKICNkZWZpbmUgSzJfRkNSMV9HTUFDX0NMS19FTkFCTEUJCTB4MDA0MDAwMDAKICNkZWZpbmUgSzJfRkNSMV9HTUFDX1BPV0VSX0RPV04JCTB4MDA4MDAwMDAKICNkZWZpbmUgSzJfRkNSMV9HTUFDX1JFU0VUX04JCTB4MDEwMDAwMDAKQEAgLTI0NiwzICsyNTEsMTEgQEAKICNkZWZpbmUgSzJfRkNSMV9VQVRBX1JFU0VUX04JCTB4NDAwMDAwMDAKICNkZWZpbmUgSzJfRkNSMV9VQVRBX0NIT09TRV9DTEs2NgkweDgwMDAwMDAwCiAKKy8qIFNoYXN0YSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBTSF9GQ1IxX0kyUzJfQ0VMTF9FTkFCTEUJMHgwMDAwMDAxMAorI2RlZmluZSBTSF9GQ1IxX0kyUzJfQ0xLX0VOQUJMRV9CSVQJMHgwMDAwMDA0MAorI2RlZmluZSBTSF9GQ1IxX0kyUzJfRU5BQkxFCQkweDAwMDAwMDgwCisjZGVmaW5lIFNIX0ZDUjNfSTJTMl9DTEsxOF9FTkFCTEUJMHgwMDAwODAwMAorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19LRVlMQVJHT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2twcm9iZXMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMva3Byb2Jlcy5oCmluZGV4IDZjZDBhM2IuLmY0NjZiYzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMva3Byb2Jlcy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMva3Byb2Jlcy5oCkBAIC0xLDUgKzEsNiBAQAogI2lmbmRlZiBfQVNNX1BPV0VSUENfS1BST0JFU19ICiAjZGVmaW5lIF9BU01fUE9XRVJQQ19LUFJPQkVTX0gKKyNpZmRlZiBfX0tFUk5FTF9fCiAvKgogICogIEtlcm5lbCBQcm9iZXMgKEtQcm9iZXMpCiAgKgpAQCAtMjksNyArMzAsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KIAorI2RlZmluZSAgX19BUkNIX1dBTlRfS1BST0JFU19JTlNOX1NMT1QKKwogc3RydWN0IHB0X3JlZ3M7CitzdHJ1Y3Qga3Byb2JlOwogCiB0eXBlZGVmIHVuc2lnbmVkIGludCBrcHJvYmVfb3Bjb2RlX3Q7CiAjZGVmaW5lIEJSRUFLUE9JTlRfSU5TVFJVQ1RJT04JMHg3ZmUwMDAwOAkvKiB0cmFwICovCkBAIC00Nyw2ICs1MSw3IEBACiAKICNkZWZpbmUgQVJDSF9TVVBQT1JUU19LUkVUUFJPQkVTCiB2b2lkIGtyZXRwcm9iZV90cmFtcG9saW5lKHZvaWQpOworZXh0ZXJuIHZvaWQgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApOwogCiAvKiBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgY29weSBvZiBvcmlnaW5hbCBpbnN0cnVjdGlvbiAqLwogc3RydWN0IGFyY2hfc3BlY2lmaWNfaW5zbiB7CkBAIC02OCwxNCArNzMsNyBAQAogCXN0cnVjdCBwcmV2X2twcm9iZSBwcmV2X2twcm9iZTsKIH07CiAKLSNpZmRlZiBDT05GSUdfS1BST0JFUwogZXh0ZXJuIGludCBrcHJvYmVfZXhjZXB0aW9uc19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSk7Ci0jZWxzZQkJCQkvKiAhQ09ORklHX0tQUk9CRVMgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGtwcm9iZV9leGNlcHRpb25zX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCi0JCQkJCSAgIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKQotewotCXJldHVybiAwOwotfQotI2VuZGlmCisJCQkJCXVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKTsKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYJLyogX0FTTV9QT1dFUlBDX0tQUk9CRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9sbWIuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbG1iLmgKaW5kZXggZWEwYWZlMy4uZDM1NDZjNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9sbWIuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2xtYi5oCkBAIC0xLDUgKzEsNiBAQAogI2lmbmRlZiBfUFBDNjRfTE1CX0gKICNkZWZpbmUgX1BQQzY0X0xNQl9ICisjaWZkZWYgX19LRVJORUxfXwogCiAvKgogICogRGVmaW5pdGlvbnMgZm9yIHRhbGtpbmcgdG8gdGhlIE9wZW4gRmlybXdhcmUgUFJPTSBvbgpAQCAtNzgsNCArNzksNSBAQAogCSAgICAgICBsbWJfc2l6ZV9wYWdlcyh0eXBlLCByZWdpb25fbnIpOwogfQogCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9QUEM2NF9MTUJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9scHBhY2EuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbHBwYWNhLmgKaW5kZXggYzFiZWRhYi4uNGRjNTE0YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9scHBhY2EuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2xwcGFjYS5oCkBAIC0xOCw2ICsxOCw3IEBACiAgKi8KICNpZm5kZWYgX0FTTV9QT1dFUlBDX0xQUEFDQV9ICiAjZGVmaW5lIF9BU01fUE9XRVJQQ19MUFBBQ0FfSAorI2lmZGVmIF9fS0VSTkVMX18KIAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8KQEAgLTI4LDYgKzI5LDggQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogCisvKiBUaGUgSHlwZXJ2aXNvciBiYXJmcyBpZiB0aGUgbHBwYWNhIGNyb3NzZXMgYSBwYWdlIGJvdW5kYXJ5LiAgQSAxaworICogYWxpZ25tZW50IGlzIHN1ZmZpY2llbnQgdG8gcHJldmVudCB0aGlzICovCiBzdHJ1Y3QgbHBwYWNhIHsKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIENBQ0hFX0xJTkVfMSAweDAwMDAgLSAweDAwN0YgQ29udGFpbnMgcmVhZC1vbmx5IGRhdGEKQEAgLTEyNiw2ICsxMjksOSBAQAogLy8gQ0FDSEVfTElORV80LTUgMHgwMTAwIC0gMHgwMUZGIENvbnRhaW5zIFBNQyBpbnRlcnJ1cHQgZGF0YQogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCXU4CXBtY19zYXZlX2FyZWFbMjU2XTsJLy8gUE1DIGludGVycnVwdCBBcmVhICAgICAgICAgICB4MDAteEZGCi19OworfSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXygweDQwMCkpKTsKIAorZXh0ZXJuIHN0cnVjdCBscHBhY2EgbHBwYWNhW107CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0xQUEFDQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21hY2hkZXAuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbWFjaGRlcC5oCmluZGV4IGMwMTFhYmIuLjUzNDhiODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbWFjaGRlcC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbWFjaGRlcC5oCkBAIC0yNyw2ICsyNyw5IEBACiBzdHJ1Y3QgaW9tbXVfdGFibGU7CiBzdHJ1Y3QgcnRjX3RpbWU7CiBzdHJ1Y3QgZmlsZTsKKyNpZmRlZiBDT05GSUdfS0VYRUMKK3N0cnVjdCBraW1hZ2U7CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TTVAKIHN0cnVjdCBzbXBfb3BzX3QgewpAQCAtMTMxLDcgKzEzNCw3IEBACiAJdm9pZAkJKCpudnJhbV9zeW5jKSh2b2lkKTsKIAogCS8qIEV4Y2VwdGlvbiBoYW5kbGVycyAqLwotCXZvaWQJCSgqc3lzdGVtX3Jlc2V0X2V4Y2VwdGlvbikoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCWludAkJKCpzeXN0ZW1fcmVzZXRfZXhjZXB0aW9uKShzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAJaW50IAkJKCptYWNoaW5lX2NoZWNrX2V4Y2VwdGlvbikoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCiAJLyogTW90aGVyYm9hcmQvY2hpcHNldCBmZWF0dXJlcy4gVGhpcyBpcyBhIGtpbmQgb2YgZ2VuZXJhbCBwdXJwb3NlCkBAIC0yMDcsMTkgKzIxMCwxOSBAQAogCiAJLyogdGhpcyBpcyBmb3IgbW9kdWxlcywgc2luY2UgX21hY2hpbmUgY2FuIGJlIGEgZGVmaW5lIC0tIENvcnQgKi8KIAlpbnQgcHBjX21hY2hpbmU7CisjZW5kaWYgLyogQ09ORklHX1BQQzMyICovCiAKLSNpZmRlZiBDT05GSUdfS0VYRUMKIAkvKiBDYWxsZWQgdG8gc2h1dGRvd24gbWFjaGluZSBzcGVjaWZpYyBoYXJkd2FyZSBub3QgYWxyZWFkeSBjb250cm9sbGVkCiAJICogYnkgb3RoZXIgZHJpdmVycy4KLQkgKiBYWFggU2hvdWxkIHdlIG1vdmUgdGhpcyBvbmUgb3V0IG9mIGtleGVjIHNjb3BlPwogCSAqLwogCXZvaWQgKCptYWNoaW5lX3NodXRkb3duKSh2b2lkKTsKIAorI2lmZGVmIENPTkZJR19LRVhFQwogCS8qIENhbGxlZCB0byBkbyB0aGUgbWluaW1hbCBzaHV0ZG93biBuZWVkZWQgdG8gcnVuIGEga2V4ZWMnZCBrZXJuZWwKIAkgKiB0byBydW4gc3VjY2Vzc2Z1bGx5LgogCSAqIFhYWCBTaG91bGQgd2UgbW92ZSB0aGlzIG9uZSBvdXQgb2Yga2V4ZWMgc2NvcGU/CiAJICovCi0Jdm9pZCAoKm1hY2hpbmVfY3Jhc2hfc2h1dGRvd24pKHZvaWQpOworCXZvaWQgKCptYWNoaW5lX2NyYXNoX3NodXRkb3duKShzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKIAkvKiBDYWxsZWQgdG8gZG8gd2hhdCBldmVyeSBzZXR1cCBpcyBuZWVkZWQgb24gaW1hZ2UgYW5kIHRoZQogCSAqIHJlYm9vdCBjb2RlIGJ1ZmZlci4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCkBAIC0yMzcsNyArMjQwLDYgQEAKIAkgKi8KIAl2b2lkICgqbWFjaGluZV9rZXhlYykoc3RydWN0IGtpbWFnZSAqaW1hZ2UpOwogI2VuZGlmIC8qIENPTkZJR19LRVhFQyAqLwotI2VuZGlmIC8qIENPTkZJR19QUEMzMiAqLwogfTsKIAogZXh0ZXJuIHZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tYWNpby5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tYWNpby5oCmluZGV4IGI1NTNkZDQuLjNhNmNiMWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbWFjaW8uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21hY2lvLmgKQEAgLTEsNSArMSw2IEBACiAjaWZuZGVmIF9fTUFDSU9fQVNJQ19IX18KICNkZWZpbmUgX19NQUNJT19BU0lDX0hfXworI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KIApAQCAtMTM3LDQgKzEzOCw1IEBACiBleHRlcm4gaW50IG1hY2lvX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgbWFjaW9fZHJpdmVyICopOwogZXh0ZXJuIHZvaWQgbWFjaW9fdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IG1hY2lvX2RyaXZlciAqKTsKIAorI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfX01BQ0lPX0FTSUNfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUuaAppbmRleCAyOWIwYmIwLi5kMDk2ZDllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LmgKQEAgLTEsNSArMSw2IEBACiAjaWZuZGVmIF9BU01fUE9XRVJQQ19NTVVfSF8KICNkZWZpbmUgX0FTTV9QT1dFUlBDX01NVV9IXworI2lmZGVmIF9fS0VSTkVMX18KIAogI2lmbmRlZiBDT05GSUdfUFBDNjQKICNpbmNsdWRlIDxhc20tcHBjL21tdS5oPgpAQCAtMzMsNyArMzQsOCBAQAogCiAvKiBMb2NhdGlvbiBvZiBjcHUwJ3Mgc2VnbWVudCB0YWJsZSAqLwogI2RlZmluZSBTVEFCMF9QQUdFCTB4NgotI2RlZmluZSBTVEFCMF9QSFlTX0FERFIJKFNUQUIwX1BBR0U8PDEyKQorI2RlZmluZSBTVEFCMF9PRkZTRVQJKFNUQUIwX1BBR0UgPDwgMTIpCisjZGVmaW5lIFNUQUIwX1BIWVNfQUREUgkoU1RBQjBfT0ZGU0VUICsgUEhZU0lDQUxfU1RBUlQpCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiBleHRlcm4gY2hhciBpbml0aWFsX3N0YWJbXTsKQEAgLTM5NCw3ICszOTYsMTIgQEAKICNkZWZpbmUgVlNJRF9TQ1JBTUJMRShwdnNpZCkJKCgocHZzaWQpICogVlNJRF9NVUxUSVBMSUVSKSAlIFZTSURfTU9EVUxVUykKICNkZWZpbmUgS0VSTkVMX1ZTSUQoZWEpCQlWU0lEX1NDUkFNQkxFKEdFVF9FU0lEKGVhKSkKIAorLyogUGh5c2ljYWwgYWRkcmVzcyB1c2VkIGJ5IHNvbWUgSU8gZnVuY3Rpb25zICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyX3Q7CisKKwogI2VuZGlmIC8qIF9fQVNTRU1CTFkgKi8KIAogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfTU1VX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdV9jb250ZXh0LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdV9jb250ZXh0LmgKaW5kZXggZWE2Nzk4Yy4uMWI4YTI1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXVfY29udGV4dC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11X2NvbnRleHQuaApAQCAtMSw1ICsxLDYgQEAKICNpZm5kZWYgX19BU01fUE9XRVJQQ19NTVVfQ09OVEVYVF9ICiAjZGVmaW5lIF9fQVNNX1BPV0VSUENfTU1VX0NPTlRFWFRfSAorI2lmZGVmIF9fS0VSTkVMX18KIAogI2lmbmRlZiBDT05GSUdfUFBDNjQKICNpbmNsdWRlIDxhc20tcHBjL21tdV9jb250ZXh0Lmg+CkBAIC04Niw0ICs4Nyw1IEBACiB9CiAKICNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX19BU01fUE9XRVJQQ19NTVVfQ09OVEVYVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tem9uZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXpvbmUuaAppbmRleCA1NDk1OGQ2Li44OGQ3MGJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tem9uZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW16b25lLmgKQEAgLTYsNiArNiw3IEBACiAgKi8KICNpZm5kZWYgX0FTTV9NTVpPTkVfSF8KICNkZWZpbmUgX0FTTV9NTVpPTkVfSF8KKyNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIApAQCAtNDcsNCArNDgsNSBAQAogZXh0ZXJuIGludCBfX2luaXQgZWFybHlfcGZuX3RvX25pZCh1bnNpZ25lZCBsb25nIHBmbik7CiAjZW5kaWYKIAorI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfQVNNX01NWk9ORV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tb2R1bGUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW9kdWxlLmgKaW5kZXggN2VjZDA1ZS4uNTg0ZmFiZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tb2R1bGUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21vZHVsZS5oCkBAIC0xLDUgKzEsNiBAQAogI2lmbmRlZiBfQVNNX1BPV0VSUENfTU9EVUxFX0gKICNkZWZpbmUgX0FTTV9QT1dFUlBDX01PRFVMRV9ICisjaWZkZWYgX19LRVJORUxfXwogCiAvKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNzQsNCArNzUsNSBAQAogdm9pZCBzb3J0X2V4X3RhYmxlKHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKnN0YXJ0LAogCQkgICBzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5ICpmaW5pc2gpOwogCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19NT0RVTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGljLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21waWMuaAppbmRleCA3MDgzZDFmLi42YjllNzgxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21waWMuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21waWMuaApAQCAtMSw1ICsxLDYgQEAKICNpZm5kZWYgX0FTTV9QT1dFUlBDX01QSUNfSAogI2RlZmluZSBfQVNNX1BPV0VSUENfTVBJQ19ICisjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKQEAgLTExNyw3ICsxMTgsOSBAQAogc3RydWN0IG1waWNfaXJxX2ZpeHVwCiB7CiAJdTggX19pb21lbQkqYmFzZTsKLQl1bnNpZ25lZCBpbnQgICBpcnE7CisJdTggX19pb21lbQkqYXBwbGViYXNlOworCXUzMgkJZGF0YTsKKwl1bnNpZ25lZCBpbnQJaW5kZXg7CiB9OwogI2VuZGlmIC8qIENPTkZJR19NUElDX0JST0tFTl9VMyAqLwogCkBAIC0yODQsNCArMjg3LDUgQEAKIC8qIGdsb2JhbCBtcGljIGZvciBwU2VyaWVzICovCiBleHRlcm4gc3RydWN0IG1waWMgKnBTZXJpZXNfbXBpYzsKIAorI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZgkvKiBfQVNNX1BPV0VSUENfTVBJQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL211dGV4LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL211dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU4YzFmNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbXV0ZXguaApAQCAtMCwwICsxLDkgQEAKKy8qCisgKiBQdWxsIGluIHRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbXV0ZXggZmFzdHBhdGguCisgKgorICogVE9ETzogaW1wbGVtZW50IG9wdGltaXplZCBwcmltaXRpdmVzIGluc3RlYWQsIG9yIGxlYXZlIHRoZSBnZW5lcmljCisgKiBpbXBsZW1lbnRhdGlvbiBpbiBwbGFjZSwgb3IgcGljayB0aGUgYXRvbWljX3hjaGcoKSBiYXNlZCBnZW5lcmljCisgKiBpbXBsZW1lbnRhdGlvbi4gKHNlZSBhc20tZ2VuZXJpYy9tdXRleC14Y2hnLmggZm9yIGRldGFpbHMpCisgKi8KKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL211dGV4LWRlYy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9udW1ub2Rlcy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9udW1ub2Rlcy5oCmluZGV4IDc5NTUzM2EuLmUxMzhlZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbnVtbm9kZXMuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL251bW5vZGVzLmgKQEAgLTEsNyArMSw5IEBACiAjaWZuZGVmIF9BU01fUE9XRVJQQ19NQVhfTlVNTk9ERVNfSAogI2RlZmluZSBfQVNNX1BPV0VSUENfTUFYX05VTU5PREVTX0gKKyNpZmRlZiBfX0tFUk5FTF9fCiAKIC8qIE1heCAxNiBOb2RlcyAqLwogI2RlZmluZSBOT0RFU19TSElGVAk0CiAKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX01BWF9OVU1OT0RFU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL252cmFtLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL252cmFtLmgKaW5kZXggMjRiZDhjMi4uZjM1NjNlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9udnJhbS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbnZyYW0uaApAQCAtNTUsNiArNTUsNyBAQAogCWNoYXIgbmFtZVsxMl07CiB9OwogCisjaWZkZWYgX19LRVJORUxfXwogc3RydWN0IG52cmFtX3BhcnRpdGlvbiB7CiAJc3RydWN0IGxpc3RfaGVhZCBwYXJ0aXRpb247CiAJc3RydWN0IG52cmFtX2hlYWRlciBoZWFkZXI7CkBAIC02OSw2ICs3MCw3IEBACiAKIGV4dGVybiBpbnQgcFNlcmllc19udnJhbV9pbml0KHZvaWQpOwogZXh0ZXJuIGludCBtbWlvX252cmFtX2luaXQodm9pZCk7CisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAvKiBQb3dlck1hYyBzcGVjaWZpYyBudnJhbSBzdHVmZnMgKi8KIApAQCAtNzgsNiArODAsNyBAQAogCXBtYWNfbnZyYW1fTlIJCS8qIE1hY09TIE5hbWUgUmVnaXN0cnkgcGFydGl0aW9uICovCiB9OwogCisjaWZkZWYgX19LRVJORUxfXwogLyogUmV0dXJuIHBhcnRpdGlvbiBvZmZzZXQgaW4gbnZyYW0gKi8KIGV4dGVybiBpbnQJcG1hY19nZXRfcGFydGl0aW9uKGludCBwYXJ0aXRpb24pOwogCkBAIC05MSw2ICs5NCw3IEBACiAvKiBOb3JtYWwgYWNjZXNzIHRvIE5WUkFNICovCiBleHRlcm4gdW5zaWduZWQgY2hhciBudnJhbV9yZWFkX2J5dGUoaW50IGkpOwogZXh0ZXJuIHZvaWQgbnZyYW1fd3JpdGVfYnl0ZSh1bnNpZ25lZCBjaGFyIGMsIGludCBpKTsKKyNlbmRpZgogCiAvKiBTb21lIG9mZnNldHMgaW4gWFBSQU0gKi8KICNkZWZpbmUgUE1BQ19YUFJBTV9NQUNISU5FX0xPQwkweGU0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL29mX2RldmljZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9vZl9kZXZpY2UuaAppbmRleCBkZGIxNmFhLi42MjQ5YTdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL29mX2RldmljZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvb2ZfZGV2aWNlLmgKQEAgLTEsNSArMSw2IEBACiAjaWZuZGVmIF9BU01fUE9XRVJQQ19PRl9ERVZJQ0VfSAogI2RlZmluZSBfQVNNX1BPV0VSUENfT0ZfREVWSUNFX0gKKyNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KQEAgLTYxLDQgKzYyLDUgQEAKIAkJCQkJCSAgIHN0cnVjdCBkZXZpY2UgKnBhcmVudCk7CiBleHRlcm4gdm9pZCBvZl9yZWxlYXNlX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19PRl9ERVZJQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9vaGFyZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9vaGFyZS5oCmluZGV4IDAyM2I1OTcuLjBkMDMwZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvb2hhcmUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL29oYXJlLmgKQEAgLTEsMyArMSw2IEBACisjaWZuZGVmIF9BU01fUE9XRVJQQ19PSEFSRV9ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19PSEFSRV9ICisjaWZkZWYgX19LRVJORUxfXwogLyoKICAqIG9oYXJlLmg6IGRlZmluaXRpb25zIGZvciB1c2luZyB0aGUgIk8nSGFyZSIgSS9PIGNvbnRyb2xsZXIgY2hpcC4KICAqCkBAIC00NiwzICs0OSw2IEBACiAgKiBDb250cmlidXRlZCBieSBIYXJyeSBFYXRvbi4KICAqLwogI2RlZmluZSBTVEFSTUFYX0ZFQVRVUkVTCTB4YmVmZjdhCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX0FTTV9QT1dFUlBDX09IQVJFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvb3Byb2ZpbGVfaW1wbC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9vcHJvZmlsZV9pbXBsLmgKaW5kZXggODAxM2NkMi4uMzM4ZTZhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9vcHJvZmlsZV9pbXBsLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9vcHJvZmlsZV9pbXBsLmgKQEAgLTExLDYgKzExLDcgQEAKIAogI2lmbmRlZiBfQVNNX1BPV0VSUENfT1BST0ZJTEVfSU1QTF9ICiAjZGVmaW5lIF9BU01fUE9XRVJQQ19PUFJPRklMRV9JTVBMX0gKKyNpZmRlZiBfX0tFUk5FTF9fCiAKICNkZWZpbmUgT1BfTUFYX0NPVU5URVIgOAogCkBAIC0yMiwyNCArMjMsMjIgQEAKIAl1bnNpZ25lZCBsb25nIGVuYWJsZWQ7CiAJdW5zaWduZWQgbG9uZyBldmVudDsKIAl1bnNpZ25lZCBsb25nIGNvdW50OworCS8qIENsYXNzaWMgZG9lc24ndCBzdXBwb3J0IHBlci1jb3VudGVyIHVzZXIva2VybmVsIHNlbGVjdGlvbiAqLwogCXVuc2lnbmVkIGxvbmcga2VybmVsOwotI2lmZGVmIF9fcG93ZXJwYzY0X18KLQkvKiBXZSBkb250IHN1cHBvcnQgcGVyIGNvdW50ZXIgdXNlci9rZXJuZWwgc2VsZWN0aW9uICovCi0jZW5kaWYKIAl1bnNpZ25lZCBsb25nIHVzZXI7CiAJdW5zaWduZWQgbG9uZyB1bml0X21hc2s7CiB9OwogCiAvKiBTeXN0ZW0td2lkZSBjb25maWd1cmF0aW9uIGFzIHNldCB2aWEgb3Byb2ZpbGVmcy4gICovCiBzdHJ1Y3Qgb3Bfc3lzdGVtX2NvbmZpZyB7Ci0jaWZkZWYgX19wb3dlcnBjNjRfXworI2lmZGVmIENPTkZJR19QUEM2NAogCXVuc2lnbmVkIGxvbmcgbW1jcjA7CiAJdW5zaWduZWQgbG9uZyBtbWNyMTsKIAl1bnNpZ25lZCBsb25nIG1tY3JhOwogI2VuZGlmCiAJdW5zaWduZWQgbG9uZyBlbmFibGVfa2VybmVsOwogCXVuc2lnbmVkIGxvbmcgZW5hYmxlX3VzZXI7Ci0jaWZkZWYgX19wb3dlcnBjNjRfXworI2lmZGVmIENPTkZJR19QUEM2NAogCXVuc2lnbmVkIGxvbmcgYmFja3RyYWNlX3NwaW5sb2NrczsKICNlbmRpZgogfTsKQEAgLTQ5LDkgKzQ4LDcgQEAKIAl2b2lkICgqcmVnX3NldHVwKSAoc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICosCiAJCQkgICBzdHJ1Y3Qgb3Bfc3lzdGVtX2NvbmZpZyAqLAogCQkJICAgaW50IG51bV9jb3VudGVycyk7Ci0jaWZkZWYgX19wb3dlcnBjNjRfXwogCXZvaWQgKCpjcHVfc2V0dXApICh2b2lkICopOwotI2VuZGlmCiAJdm9pZCAoKnN0YXJ0KSAoc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICopOwogCXZvaWQgKCpzdG9wKSAodm9pZCk7CiAJdm9pZCAoKmhhbmRsZV9pbnRlcnJ1cHQpIChzdHJ1Y3QgcHRfcmVncyAqLApAQCAtNTksMTAgKzU2LDE5IEBACiAJaW50IG51bV9jb3VudGVyczsKIH07CiAKLSNpZmRlZiBfX3Bvd2VycGM2NF9fCisjaWZkZWYgQ09ORklHX0ZTTF9CT09LRQorZXh0ZXJuIHN0cnVjdCBvcF9wb3dlcnBjX21vZGVsIG9wX21vZGVsX2ZzbF9ib29rZTsKKyNlbHNlIC8qIE90aGVyd2lzZSwgaXQncyBjbGFzc2ljICovCisKKyNpZmRlZiBDT05GSUdfUFBDNjQKIGV4dGVybiBzdHJ1Y3Qgb3BfcG93ZXJwY19tb2RlbCBvcF9tb2RlbF9yczY0OwogZXh0ZXJuIHN0cnVjdCBvcF9wb3dlcnBjX21vZGVsIG9wX21vZGVsX3Bvd2VyNDsKIAorI2Vsc2UgLyogT3RoZXJ3aXNlLCBDT05GSUdfUFBDMzIgKi8KK2V4dGVybiBzdHJ1Y3Qgb3BfcG93ZXJwY19tb2RlbCBvcF9tb2RlbF83NDUwOworI2VuZGlmCisKKy8qIEFsbCB0aGUgY2xhc3NpYyBQUEMgcGFydHMgdXNlIHRoZXNlICovCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjdHJfcmVhZCh1bnNpZ25lZCBpbnQgaSkKIHsKIAlzd2l0Y2goaSkgewpAQCAtNzgsMTAgKzg0LDE0IEBACiAJCXJldHVybiBtZnNwcihTUFJOX1BNQzUpOwogCWNhc2UgNToKIAkJcmV0dXJuIG1mc3ByKFNQUk5fUE1DNik7CisKKy8qIE5vIFBQQzMyIGNoaXAgaGFzIG1vcmUgdGhhbiA2IHNvIGZhciAqLworI2lmZGVmIENPTkZJR19QUEM2NAogCWNhc2UgNjoKIAkJcmV0dXJuIG1mc3ByKFNQUk5fUE1DNyk7CiAJY2FzZSA3OgogCQlyZXR1cm4gbWZzcHIoU1BSTl9QTUM4KTsKKyNlbmRpZgogCWRlZmF1bHQ6CiAJCXJldHVybiAwOwogCX0KQEAgLTEwOCwxNiArMTE4LDIxIEBACiAJY2FzZSA1OgogCQltdHNwcihTUFJOX1BNQzYsIHZhbCk7CiAJCWJyZWFrOworCisvKiBObyBQUEMzMiBjaGlwIGhhcyBtb3JlIHRoYW4gNiwgeWV0ICovCisjaWZkZWYgQ09ORklHX1BQQzY0CiAJY2FzZSA2OgogCQltdHNwcihTUFJOX1BNQzcsIHZhbCk7CiAJCWJyZWFrOwogCWNhc2UgNzoKIAkJbXRzcHIoU1BSTl9QTUM4LCB2YWwpOwogCQlicmVhazsKKyNlbmRpZgogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KIH0KLSNlbmRpZiAvKiBfX3Bvd2VycGM2NF9fICovCisjZW5kaWYgLyogIUNPTkZJR19GU0xfQk9PS0UgKi8KIAorI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfT1BST0ZJTEVfSU1QTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BTZXJpZXNfcmVjb25maWcuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcFNlcmllc19yZWNvbmZpZy5oCmluZGV4IGMwZGIxZWEuLmVhNmNmYjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcFNlcmllc19yZWNvbmZpZy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcFNlcmllc19yZWNvbmZpZy5oCkBAIC0xLDUgKzEsNiBAQAogI2lmbmRlZiBfUFBDNjRfUFNFUklFU19SRUNPTkZJR19ICiAjZGVmaW5lIF9QUEM2NF9QU0VSSUVTX1JFQ09ORklHX0gKKyNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogCkBAIC0yMiw0ICsyMyw1IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgcFNlcmllc19yZWNvbmZpZ19ub3RpZmllcl91bnJlZ2lzdGVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpIHsgfQogI2VuZGlmIC8qIENPTkZJR19QUENfUFNFUklFUyAqLwogCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9QUEM2NF9QU0VSSUVTX1JFQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGFjYS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWNhLmgKaW5kZXggOTJjNzY1Yy4uYzlhZGQ4ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWNhLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWNhLmgKQEAgLTE0LDE1ICsxNCwxNiBAQAogICovCiAjaWZuZGVmIF9BU01fUE9XRVJQQ19QQUNBX0gKICNkZWZpbmUgX0FTTV9QT1dFUlBDX1BBQ0FfSAorI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUJPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUJPGFzbS90eXBlcy5oPgogI2luY2x1ZGUJPGFzbS9scHBhY2EuaD4KLSNpbmNsdWRlCTxhc20vaXNlcmllcy9pdF9scF9yZWdfc2F2ZS5oPgogI2luY2x1ZGUJPGFzbS9tbXUuaD4KIAogcmVnaXN0ZXIgc3RydWN0IHBhY2Ffc3RydWN0ICpsb2NhbF9wYWNhIGFzbSgicjEzIik7CiAjZGVmaW5lIGdldF9wYWNhKCkJbG9jYWxfcGFjYQorI2RlZmluZSBnZXRfbHBwYWNhKCkJKGdldF9wYWNhKCktPmxwcGFjYV9wdHIpCiAKIHN0cnVjdCB0YXNrX3N0cnVjdDsKIApAQCAtMzEsOSArMzIsOSBAQAogICoKICAqIFRoaXMgc3RydWN0dXJlIGlzIG5vdCBkaXJlY3RseSBhY2Nlc3NlZCBieSBmaXJtd2FyZSBvciB0aGUgc2VydmljZQogICogcHJvY2Vzc29yIGV4Y2VwdCBmb3IgdGhlIGZpcnN0IHR3byBwb2ludGVycyB0aGF0IHBvaW50IHRvIHRoZQotICogbHBwYWNhIGFyZWEgYW5kIHRoZSBJdExwUmVnU2F2ZSBhcmVhIGZvciB0aGlzIENQVS4gIEJvdGggdGhlCi0gKiBscHBhY2EgYW5kIEl0THBSZWdTYXZlIG9iamVjdHMgYXJlIGN1cnJlbnRseSBjb250YWluZWQgd2l0aGluIHRoZQotICogUEFDQSBidXQgdGhleSBkbyBub3QgbmVlZCB0byBiZS4KKyAqIGxwcGFjYSBhcmVhIGFuZCB0aGUgSXRMcFJlZ1NhdmUgYXJlYSBmb3IgdGhpcyBDUFUuICBUaGUgbHBwYWNhCisgKiBvYmplY3QgaXMgY3VycmVudGx5IGNvbnRhaW5lZCB3aXRoaW4gdGhlIFBBQ0EgYnV0IGl0IGRvZXNuJ3QgbmVlZAorICogdG8gYmUuCiAgKi8KIHN0cnVjdCBwYWNhX3N0cnVjdCB7CiAJLyoKQEAgLTQ4LDcgKzQ5LDkgQEAKIAkgKiBhY2Nlc3NlZCBieSB0aGUgZmlybXdhcmUKIAkgKi8KIAlzdHJ1Y3QgbHBwYWNhICpscHBhY2FfcHRyOwkvKiBQb2ludGVyIHRvIExwUGFjYSBmb3IgUExJQyAqLwotCXN0cnVjdCBJdExwUmVnU2F2ZSAqcmVnX3NhdmVfcHRyOyAvKiBQb2ludGVyIHRvIExwUmVnU2F2ZSBmb3IgUExJQyAqLworI2lmZGVmIENPTkZJR19QUENfSVNFUklFUworCXZvaWQgKnJlZ19zYXZlX3B0cjsgLyogUG9pbnRlciB0byBMcFJlZ1NhdmUgZm9yIFBMSUMgKi8KKyNlbmRpZiAvKiBDT05GSUdfUFBDX0lTRVJJRVMgKi8KIAogCS8qCiAJICogTUFHSUM6IHRoZSBzcGlubG9jayBmdW5jdGlvbnMgaW4gYXJjaC9wcGM2NC9saWIvbG9ja3MuYwpAQCAtNTksMTEgKzYyLDExIEBACiAJdTE2IGxvY2tfdG9rZW47CQkJLyogQ29uc3RhbnQgMHg4MDAwLCB1c2VkIGluIGxvY2tzICovCiAJdTE2IHBhY2FfaW5kZXg7CQkJLyogTG9naWNhbCBwcm9jZXNzb3IgbnVtYmVyICovCiAKLQl1MzIgZGVmYXVsdF9kZWNyOwkJLyogRGVmYXVsdCBkZWNyZW1lbnRlciB2YWx1ZSAqLwogCXU2NCBrZXJuZWxfdG9jOwkJCS8qIEtlcm5lbCBUT0MgYWRkcmVzcyAqLwogCXU2NCBzdGFiX3JlYWw7CQkJLyogQWJzb2x1dGUgYWRkcmVzcyBvZiBzZWdtZW50IHRhYmxlICovCiAJdTY0IHN0YWJfYWRkcjsJCQkvKiBWaXJ0dWFsIGFkZHJlc3Mgb2Ygc2VnbWVudCB0YWJsZSAqLwogCXZvaWQgKmVtZXJnZW5jeV9zcDsJCS8qIHBvaW50ZXIgdG8gZW1lcmdlbmN5IHN0YWNrICovCisJdTY0IGRhdGFfb2Zmc2V0OwkJLyogcGVyIGNwdSBkYXRhIG9mZnNldCAqLwogCXMxNiBod19jcHVfaWQ7CQkJLyogUGh5c2ljYWwgcHJvY2Vzc29yIG51bWJlciAqLwogCXU4IGNwdV9zdGFydDsJCQkvKiBBdCBzdGFydHVwLCBwcm9jZXNzb3Igc3BpbnMgdW50aWwgKi8KIAkJCQkJLyogdGhpcyBiZWNvbWVzIG5vbi16ZXJvLiAqLwpAQCAtOTAsMzEgKzkzLDEyIEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICpfX2N1cnJlbnQ7CS8qIFBvaW50ZXIgdG8gY3VycmVudCAqLwogCXU2NCBrc3RhY2s7CQkJLyogU2F2ZWQgS2VybmVsIHN0YWNrIGFkZHIgKi8KIAl1NjQgc3RhYl9ycjsJCQkvKiBzdGFiL3NsYiByb3VuZC1yb2JpbiBjb3VudGVyICovCi0JdTY0IG5leHRfamlmZnlfdXBkYXRlX3RiOwkvKiBUQiB2YWx1ZSBmb3IgbmV4dCBqaWZmeSB1cGRhdGUgKi8KIAl1NjQgc2F2ZWRfcjE7CQkJLyogcjEgc2F2ZSBmb3IgUlRBUyBjYWxscyAqLwogCXU2NCBzYXZlZF9tc3I7CQkJLyogTVNSIHNhdmVkIGhlcmUgYnkgZW50ZXJfcnRhcyAqLwogCXU4IHByb2NfZW5hYmxlZDsJCS8qIGlycSBzb2Z0LWVuYWJsZSBmbGFnICovCi0KLQkvKiBub3QgeWV0IHVzZWQgKi8KLQl1NjQgZXhkc2lbOF07CQkvKiB1c2VkIGZvciBsaW5lYXIgbWFwcGluZyBoYXNoIHRhYmxlIG1pc3NlcyAqLwotCi0JLyoKLQkgKiBpU2VyaWVzIHN0cnVjdHVyZSB3aGljaCB0aGUgaHlwZXJ2aXNvciBrbm93cyBhYm91dCAtCi0JICogdGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIG5vdCBjcm9zcyBhIHBhZ2UgYm91bmRhcnkuCi0JICogVGhlIHZwYV9pbml0L3JlZ2lzdGVyX3ZwYSBjYWxsIGlzIG5vdyBrbm93biB0byBmYWlsIGlmIHRoZQotCSAqIGxwcGFjYSBzdHJ1Y3R1cmUgY3Jvc3NlcyBhIHBhZ2UgYm91bmRhcnkuCi0JICogVGhlIGxwcGFjYSBpcyBhbHNvIHVzZWQgb24gUE9XRVI1IHBTZXJpZXMgYm94ZXMuCi0JICogVGhlIGxwcGFjYSBpcyA2NDAgYnl0ZXMgbG9uZywgYW5kIGNhbm5vdCByZWFkaWx5IGNoYW5nZQotCSAqIHNpbmNlIHRoZSBoeXBlcnZpc29yIGtub3dzIGl0cyBsYXlvdXQsIHNvIGEgMWtCCi0JICogYWxpZ25tZW50IHdpbGwgc3VmZmljZSB0byBlbnN1cmUgdGhhdCBpdCBkb2Vzbid0Ci0JICogY3Jvc3MgYSBwYWdlIGJvdW5kYXJ5LgotCSAqLwotCXN0cnVjdCBscHBhY2EgbHBwYWNhIF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKDB4NDAwKSkpOwotI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwotCXN0cnVjdCBJdExwUmVnU2F2ZSByZWdfc2F2ZTsKLSNlbmRpZgogfTsKIAogZXh0ZXJuIHN0cnVjdCBwYWNhX3N0cnVjdCBwYWNhW107CiAKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX1BBQ0FfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWdlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhZ2UuaAppbmRleCAxOGMxZTVlLi4wYjgyZGY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhZ2UuaApAQCAtMzcsOCArMzcsMzAgQEAKICAqLwogI2RlZmluZSBQQUdFX01BU0sgICAgICAofigoMSA8PCBQQUdFX1NISUZUKSAtIDEpKQogCisvKgorICogS0VSTkVMQkFTRSBpcyB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUga2VybmVsLCBpdCdzIG9mdGVuCisgKiB0aGUgc2FtZSBhcyBQQUdFX09GRlNFVCwgYnV0IF9taWdodCBub3QgYmVfLgorICoKKyAqIFRoZSBrZHVtcCBkdW1wIGtlcm5lbCBpcyBvbmUgZXhhbXBsZSB3aGVyZSBLRVJORUxCQVNFICE9IFBBR0VfT0ZGU0VULgorICoKKyAqIFRvIGdldCBhIHBoeXNpY2FsIGFkZHJlc3MgZnJvbSBhIHZpcnR1YWwgb25lIHlvdSBzdWJ0cmFjdCBQQUdFX09GRlNFVCwKKyAqIF9ub3RfIEtFUk5FTEJBU0UuCisgKgorICogSWYgeW91IHdhbnQgdG8ga25vdyBzb21ldGhpbmcncyBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGtlcm5lbCB5b3UKKyAqIHNob3VsZCBzdWJ0cmFjdCBLRVJORUxCQVNFLgorICoKKyAqIElmIHlvdSB3YW50IHRvIHRlc3QgaWYgc29tZXRoaW5nJ3MgYSBrZXJuZWwgYWRkcmVzcywgdXNlIGlzX2tlcm5lbF9hZGRyKCkuCisgKi8KKworI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCisvKiBLZHVtcCBrZXJuZWwgcnVucyBhdCAzMiBNQiwgY2hhbmdlIGF0IHlvdXIgcGVyaWwuICovCisjZGVmaW5lIFBIWVNJQ0FMX1NUQVJUCTB4MjAwMDAwMAorI2Vsc2UKKyNkZWZpbmUgUEhZU0lDQUxfU1RBUlQJMHgwCisjZW5kaWYKKwogI2RlZmluZSBQQUdFX09GRlNFVCAgICAgQVNNX0NPTlNUKENPTkZJR19LRVJORUxfU1RBUlQpCi0jZGVmaW5lIEtFUk5FTEJBU0UgICAgICBQQUdFX09GRlNFVAorI2RlZmluZSBLRVJORUxCQVNFICAgICAgKFBBR0VfT0ZGU0VUICsgUEhZU0lDQUxfU1RBUlQpCiAKICNpZmRlZiBDT05GSUdfRElTQ09OVElHTUVNCiAjZGVmaW5lIHBhZ2VfdG9fcGZuKHBhZ2UpCWRpc2NvbnRpZ21lbV9wYWdlX3RvX3BmbihwYWdlKQpAQCAtNTYsNyArNzgsNyBAQAogI2RlZmluZSBwZm5fdG9fa2FkZHIocGZuKQlfX3ZhKChwZm4pIDw8IFBBR0VfU0hJRlQpCiAjZGVmaW5lIHZpcnRfYWRkcl92YWxpZChrYWRkcikJcGZuX3ZhbGlkKF9fcGEoa2FkZHIpID4+IFBBR0VfU0hJRlQpCiAKLSNkZWZpbmUgX192YSh4KSAoKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKHgpICsgS0VSTkVMQkFTRSkpCisjZGVmaW5lIF9fdmEoeCkgKCh2b2lkICopKCh1bnNpZ25lZCBsb25nKSh4KSArIFBBR0VfT0ZGU0VUKSkKICNkZWZpbmUgX19wYSh4KSAoKHVuc2lnbmVkIGxvbmcpKHgpIC0gUEFHRV9PRkZTRVQpCiAKIC8qCkBAIC04Niw2ICsxMDgsMTIgQEAKIC8qIHRvIGFsaWduIHRoZSBwb2ludGVyIHRvIHRoZSAobmV4dCkgcGFnZSBib3VuZGFyeSAqLwogI2RlZmluZSBQQUdFX0FMSUdOKGFkZHIpCV9BTElHTihhZGRyLCBQQUdFX1NJWkUpCiAKKy8qCisgKiBEb24ndCBjb21wYXJlIHRoaW5ncyB3aXRoIEtFUk5FTEJBU0Ugb3IgUEFHRV9PRkZTRVQgdG8gdGVzdCBmb3IKKyAqICJrZXJuZWxuZXNzIiwgdXNlIGlzX2tlcm5lbF9hZGRyKCkgLSBpdCBzaG91bGQgZG8gd2hhdCB5b3Ugd2FudC4KKyAqLworI2RlZmluZSBpc19rZXJuZWxfYWRkcih4KQkoKHgpID49IFBBR0VfT0ZGU0VUKQorCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiAjdW5kZWYgU1RSSUNUX01NX1RZUEVDSEVDS1MKQEAgLTE1MCw3ICsxNzgsNyBAQAogI2RlZmluZSBwbWRfdmFsKHgpCSh4KQogI2RlZmluZSBfX3BtZCh4KQkoeCkKIAotI2lmbmRlZiBDT05GSUdfUFBDXzY0S19QQUdFUworI2lmIGRlZmluZWQoQ09ORklHX1BQQzY0KSAmJiAhZGVmaW5lZChDT05GSUdfUFBDXzY0S19QQUdFUykKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBwdWRfdDsKICNkZWZpbmUgcHVkX3ZhbCh4KQkoeCkKICNkZWZpbmUgX19wdWQoeCkJKHgpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhZ2VfMzIuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGFnZV8zMi5oCmluZGV4IDcyNTljZmQuLjI2NzdiYWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGFnZV8zMi5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGFnZV8zMi5oCkBAIC0xLDUgKzEsNiBAQAogI2lmbmRlZiBfQVNNX1BPV0VSUENfUEFHRV8zMl9ICiAjZGVmaW5lIF9BU01fUE9XRVJQQ19QQUdFXzMyX0gKKyNpZmRlZiBfX0tFUk5FTF9fCiAKICNkZWZpbmUgVk1fREFUQV9ERUZBVUxUX0ZMQUdTCVZNX0RBVEFfREVGQVVMVF9GTEFHUzMyCiAKQEAgLTM3LDQgKzM4LDUgQEAKIAogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19QQUdFXzMyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGFnZV82NC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWdlXzY0LmgKaW5kZXggNjY0MmMwMS4uM2ZiMDYxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWdlXzY0LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWdlXzY0LmgKQEAgLTEsNSArMSw2IEBACiAjaWZuZGVmIF9BU01fUE9XRVJQQ19QQUdFXzY0X0gKICNkZWZpbmUgX0FTTV9QT1dFUlBDX1BBR0VfNjRfSAorI2lmZGVmIF9fS0VSTkVMX18KIAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwMSBQUEM2NCBUZWFtLCBJQk0gQ29ycApAQCAtMjUsMTYgKzI2LDYgQEAKICAqLwogI2RlZmluZSBQQUdFX0ZBQ1RPUgkJKFBBR0VfU0hJRlQgLSBIV19QQUdFX1NISUZUKQogCi0jZGVmaW5lIFJFR0lPTl9TSVpFICAgNFVMCi0jZGVmaW5lIFJFR0lPTl9TSElGVCAgNjBVTAotI2RlZmluZSBSRUdJT05fTUFTSyAgICgoKDFVTDw8UkVHSU9OX1NJWkUpLTFVTCk8PFJFR0lPTl9TSElGVCkKLQotI2RlZmluZSBWTUFMTE9DQkFTRQkJQVNNX0NPTlNUKDB4RDAwMDAwMDAwMDAwMDAwMCkKLSNkZWZpbmUgVk1BTExPQ19SRUdJT05fSUQJKFZNQUxMT0NCQVNFID4+IFJFR0lPTl9TSElGVCkKLSNkZWZpbmUgS0VSTkVMX1JFR0lPTl9JRAkoS0VSTkVMQkFTRSA+PiBSRUdJT05fU0hJRlQpCi0jZGVmaW5lIFVTRVJfUkVHSU9OX0lECQkoMFVMKQotI2RlZmluZSBSRUdJT05fSUQoZWEpCQkoKCh1bnNpZ25lZCBsb25nKShlYSkpID4+IFJFR0lPTl9TSElGVCkKLQogLyogU2VnbWVudCBzaXplICovCiAjZGVmaW5lIFNJRF9TSElGVAkJMjgKICNkZWZpbmUgU0lEX01BU0sJCTB4ZmZmZmZmZmZmVUwKQEAgLTE4MCw0ICsxNzEsNSBAQAogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFnZS5oPgogCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19QQUdFXzY0X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGFyYW0uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGFyYW0uaAppbmRleCBiZGM3MjRmLi4wOTRmNjNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhcmFtLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYXJhbS5oCkBAIC0xLDggKzEsNiBAQAogI2lmbmRlZiBfQVNNX1BPV0VSUENfUEFSQU1fSAogI2RlZmluZSBfQVNNX1BPV0VSUENfUEFSQU1fSAogCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0KICNpZmRlZiBfX0tFUk5FTF9fCiAjZGVmaW5lIEhaCQlDT05GSUdfSFoJLyogaW50ZXJuYWwga2VybmVsIHRpbWVyIGZyZXF1ZW5jeSAqLwogI2RlZmluZSBVU0VSX0haCQkxMDAJCS8qIGZvciB1c2VyIGludGVyZmFjZXMgaW4gInRpY2tzIiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wYXJwb3J0LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhcnBvcnQuaAppbmRleCBkODZiNDEwLi4zZmNhMjFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhcnBvcnQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhcnBvcnQuaApAQCAtOCwxMSArOCwzNyBAQAogCiAjaWZuZGVmIF9BU01fUE9XRVJQQ19QQVJQT1JUX0gKICNkZWZpbmUgX0FTTV9QT1dFUlBDX1BBUlBPUlRfSAorI2lmZGVmIF9fS0VSTkVMX18KIAotc3RhdGljIGludCBfX2RldmluaXQgcGFycG9ydF9wY19maW5kX2lzYV9wb3J0cyAoaW50IGF1dG9pcnEsIGludCBhdXRvZG1hKTsKKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorCitleHRlcm4gc3RydWN0IHBhcnBvcnQgKnBhcnBvcnRfcGNfcHJvYmVfcG9ydCAodW5zaWduZWQgbG9uZyBpbnQgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGludCBiYXNlX2hpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpcnEsIGludCBkbWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHBjaV9kZXYgKmRldik7CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHBhcnBvcnRfcGNfZmluZF9ub25wY2lfcG9ydHMgKGludCBhdXRvaXJxLCBpbnQgYXV0b2RtYSkKIHsKLQlyZXR1cm4gcGFycG9ydF9wY19maW5kX2lzYV9wb3J0cyAoYXV0b2lycSwgYXV0b2RtYSk7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwl1MzIgKnByb3A7CisJdTMyIGlvMSwgaW8yOworCWludCBwcm9wc2l6ZTsKKwlpbnQgY291bnQgPSAwOworCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShucCwKKwkJCQkJCSAgICAgICJwYXJhbGxlbCIsCisJCQkJCQkgICAgICAicG5wUE5QLDQwMCIpKSAhPSBOVUxMOykgeworCQlwcm9wID0gKHUzMiAqKWdldF9wcm9wZXJ0eShucCwgInJlZyIsICZwcm9wc2l6ZSk7CisJCWlmICghcHJvcCB8fCBwcm9wc2l6ZSA+IDYqc2l6ZW9mKHUzMikpCisJCQljb250aW51ZTsKKwkJaW8xID0gcHJvcFsxXTsgaW8yID0gcHJvcFsyXTsKKwkJcHJvcCA9ICh1MzIgKilnZXRfcHJvcGVydHkobnAsICJpbnRlcnJ1cHRzIiwgTlVMTCk7CisJCWlmICghcHJvcCkKKwkJCWNvbnRpbnVlOworCQlpZiAocGFycG9ydF9wY19wcm9iZV9wb3J0KGlvMSwgaW8yLCBwcm9wWzBdLCBhdXRvZG1hLCBOVUxMKSAhPSBOVUxMKQorCQkJY291bnQrKzsKKwl9CisJcmV0dXJuIGNvdW50OwogfQogCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qICEoX0FTTV9QT1dFUlBDX1BBUlBPUlRfSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLWJyaWRnZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2ktYnJpZGdlLmgKaW5kZXggMjIzZWM3Yi4uMzhkZTkyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2ktYnJpZGdlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2ktYnJpZGdlLmgKQEAgLTEsNSArMSw2IEBACiAjaWZuZGVmIF9BU01fUE9XRVJQQ19QQ0lfQlJJREdFX0gKICNkZWZpbmUgX0FTTV9QT1dFUlBDX1BDSV9CUklER0VfSAorI2lmZGVmIF9fS0VSTkVMX18KIAogI2lmbmRlZiBDT05GSUdfUFBDNjQKICNpbmNsdWRlIDxhc20tcHBjL3BjaS1icmlkZ2UuaD4KQEAgLTYwLDE2ICs2MSwxNyBAQAogc3RydWN0IGlvbW11X3RhYmxlOwogCiBzdHJ1Y3QgcGNpX2RuIHsKLQlpbnQJYnVzbm87CQkJLyogZm9yIHBjaSBkZXZpY2VzICovCi0JaW50CWJ1c3N1Ym5vOwkJLyogZm9yIHBjaSBkZXZpY2VzICovCi0JaW50CWRldmZuOwkJCS8qIGZvciBwY2kgZGV2aWNlcyAqLworCWludAlidXNubzsJCQkvKiBwY2kgYnVzIG51bWJlciAqLworCWludAlidXNzdWJubzsJCS8qIHBjaSBzdWJvcmRpbmF0ZSBidXMgbnVtYmVyICovCisJaW50CWRldmZuOwkJCS8qIHBjaSBkZXZpY2UgYW5kIGZ1bmN0aW9uIG51bWJlciAqLworCWludAljbGFzc19jb2RlOwkJLyogcGNpIGRldmljZSBjbGFzcyAqLwogCiAjaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCiAJaW50CWVlaF9tb2RlOwkJLyogU2VlIGVlaC5oIGZvciBwb3NzaWJsZSBFRUhfTU9ERXMgKi8KIAlpbnQJZWVoX2NvbmZpZ19hZGRyOworCWludAllZWhfcGVfY29uZmlnX2FkZHI7IC8qIG5ldy1zdHlsZSBwYXJ0aXRpb24gZW5kcG9pbnQgYWRkcmVzcyAqLwogCWludCAJZWVoX2NoZWNrX2NvdW50OwkvKiAjIHRpbWVzIGRyaXZlciBpZ25vcmVkIGVycm9yICovCiAJaW50IAllZWhfZnJlZXplX2NvdW50OwkvKiAjIHRpbWVzIHRoaXMgZGV2aWNlIGZyb3plIHVwLiAqLwotCWludAllZWhfaXNfYnJpZGdlOwkJLyogZGV2aWNlIGlzIHBjaS10by1wY2kgYnJpZGdlICovCiAjZW5kaWYKIAlpbnQJcGNpX2V4dF9jb25maWdfc3BhY2U7CS8qIGZvciBwY2kgZGV2aWNlcyAqLwogCXN0cnVjdCAgcGNpX2NvbnRyb2xsZXIgKnBoYjsJLyogZm9yIHBjaSBkZXZpY2VzICovCkBAIC0xMjUsMTIgKzEyNywyMCBAQAogCQlyZXR1cm4gYnVzLT5zeXNkYXRhOyAvKiBNdXN0IGJlIHJvb3QgYnVzIChQSEIpICovCiB9CiAKKy8qKiBGaW5kIHRoZSBidXMgY29ycmVzcG9uZGluZyB0byB0aGUgaW5kaWNhdGVkIGRldmljZSBub2RlICovCitzdHJ1Y3QgcGNpX2J1cyAqIHBjaWJpb3NfZmluZF9wY2lfYnVzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pOworCiBleHRlcm4gdm9pZCBwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKIAkJCQkJIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgcHJpbWFyeSk7CiAKLWV4dGVybiBpbnQgcGNpYmlvc19yZW1vdmVfcm9vdF9idXMoc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpOworLyoqIFJlbW92ZSBhbGwgb2YgdGhlIFBDSSBkZXZpY2VzIHVuZGVyIHRoaXMgYnVzICovCit2b2lkIHBjaWJpb3NfcmVtb3ZlX3BjaV9kZXZpY2VzKHN0cnVjdCBwY2lfYnVzICpidXMpOwogCi1leHRlcm4gdm9pZCBwaGJzX3JlbWFwX2lvKHZvaWQpOworLyoqIERpc2NvdmVyIG5ldyBwY2kgZGV2aWNlcyB1bmRlciB0aGlzIGJ1cywgYW5kIGFkZCB0aGVtICovCit2b2lkIHBjaWJpb3NfYWRkX3BjaV9kZXZpY2VzKHN0cnVjdCBwY2lfYnVzICogYnVzKTsKK3ZvaWQgcGNpYmlvc19maXh1cF9uZXdfcGNpX2RldmljZXMoc3RydWN0IHBjaV9idXMgKmJ1cywgaW50IGZpeF9idXMpOworCitleHRlcm4gaW50IHBjaWJpb3NfcmVtb3ZlX3Jvb3RfYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiKTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBjaV9idXNfdG9faG9zdChzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewpAQCAtMTQwLDE0ICsxNTAsMjcgQEAKIAlyZXR1cm4gUENJX0ROKGJ1c2RuKS0+cGhiOwogfQogCitleHRlcm4gc3RydWN0IHBjaV9jb250cm9sbGVyKgorcGNpX2ZpbmRfaG9zZV9mb3JfT0ZfZGV2aWNlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSk7CisKIGV4dGVybiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKgogcGNpYmlvc19hbGxvY19jb250cm9sbGVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KTsKIGV4dGVybiB2b2lkIHBjaWJpb3NfZnJlZV9jb250cm9sbGVyKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiKTsKIAorI2lmZGVmIENPTkZJR19QQ0kKK2V4dGVybiB1bnNpZ25lZCBsb25nIHBjaV9hZGRyZXNzX3RvX3BpbyhwaHlzX2FkZHJfdCBhZGRyZXNzKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGNpX2FkZHJlc3NfdG9fcGlvKHBoeXNfYWRkcl90IGFkZHJlc3MpCit7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKS0xOworfQorI2VuZGlmCisKIC8qIFJldHVybiB2YWx1ZXMgZm9yIHBwY19tZC5wY2lfcHJvYmVfbW9kZSBmdW5jdGlvbiAqLwogI2RlZmluZSBQQ0lfUFJPQkVfTk9ORQkJLTEJLyogRG9uJ3QgbG9vayBhdCB0aGlzIGJ1cyBhdCBhbGwgKi8KICNkZWZpbmUgUENJX1BST0JFX05PUk1BTAkwCS8qIERvIG5vcm1hbCBQQ0kgcHJvYmluZyAqLwogI2RlZmluZSBQQ0lfUFJPQkVfREVWVFJFRQkxCS8qIEluc3RhbnRpYXRlIGZyb20gZGV2aWNlIHRyZWUgKi8KIAogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2kuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLmgKaW5kZXggZDU5MzRhMC4uNWQyYzllNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS5oCkBAIC0yMTYsNiArMjE2LDggQEAKIGV4dGVybiB2b2lkIHBjaWJpb3NfZml4dXBfZGV2aWNlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LAogCQkJc3RydWN0IHBjaV9idXMgKmJ1cyk7CiAKK2V4dGVybiB2b2lkIHBjaWJpb3NfY2xhaW1fb25lX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYik7CisKIGV4dGVybiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmluaXRfcGhiX2R5bmFtaWMoc3RydWN0IGRldmljZV9ub2RlICpkbik7CiAKIGV4dGVybiBzdHJ1Y3QgcGNpX2RldiAqb2ZfY3JlYXRlX3BjaV9kZXYoc3RydWN0IGRldmljZV9ub2RlICpub2RlLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZXJjcHUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGVyY3B1LmgKaW5kZXggMDZhOTU5ZC4uZTMxOTIyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZXJjcHUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BlcmNwdS5oCkBAIC0xICsxLDU3IEBACisjaWZuZGVmIF9BU01fUE9XRVJQQ19QRVJDUFVfSF8KKyNkZWZpbmUgX0FTTV9QT1dFUlBDX1BFUkNQVV9IXworI2lmZGVmIF9fcG93ZXJwYzY0X18KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCisvKgorICogU2FtZSBhcyBhc20tZ2VuZXJpYy9wZXJjcHUuaCwgZXhjZXB0IHRoYXQgd2Ugc3RvcmUgdGhlIHBlciBjcHUgb2Zmc2V0CisgKiBpbiB0aGUgcGFjYS4gQmFzZWQgb24gdGhlIHg4Ni02NCBpbXBsZW1lbnRhdGlvbi4KKyAqLworCisjaWZkZWYgQ09ORklHX1NNUAorCisjaW5jbHVkZSA8YXNtL3BhY2EuaD4KKworI2RlZmluZSBfX3Blcl9jcHVfb2Zmc2V0KGNwdSkgKHBhY2FbY3B1XS5kYXRhX29mZnNldCkKKyNkZWZpbmUgX19teV9jcHVfb2Zmc2V0KCkgZ2V0X3BhY2EoKS0+ZGF0YV9vZmZzZXQKKworLyogU2VwYXJhdGUgb3V0IHRoZSB0eXBlLCBzbyAoaW50WzNdLCBmb28pIHdvcmtzLiAqLworI2RlZmluZSBERUZJTkVfUEVSX0NQVSh0eXBlLCBuYW1lKSBcCisgICAgX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhLnBlcmNwdSIpKSkgX190eXBlb2ZfXyh0eXBlKSBwZXJfY3B1X18jI25hbWUKKworLyogdmFyIGlzIGluIGRpc2NhcmRlZCByZWdpb246IG9mZnNldCB0byBwYXJ0aWN1bGFyIGNvcHkgd2Ugd2FudCAqLworI2RlZmluZSBwZXJfY3B1KHZhciwgY3B1KSAoKlJFTE9DX0hJREUoJnBlcl9jcHVfXyMjdmFyLCBfX3Blcl9jcHVfb2Zmc2V0KGNwdSkpKQorI2RlZmluZSBfX2dldF9jcHVfdmFyKHZhcikgKCpSRUxPQ19ISURFKCZwZXJfY3B1X18jI3ZhciwgX19teV9jcHVfb2Zmc2V0KCkpKQorCisvKiBBIG1hY3JvIHRvIGF2b2lkICNpbmNsdWRlIGhlbGwuLi4gKi8KKyNkZWZpbmUgcGVyY3B1X21vZGNvcHkocGNwdWRzdCwgc3JjLCBzaXplKQkJCVwKK2RvIHsJCQkJCQkJCVwKKwl1bnNpZ25lZCBpbnQgX19pOwkJCQkJXAorCWZvciAoX19pID0gMDsgX19pIDwgTlJfQ1BVUzsgX19pKyspCQkJXAorCQlpZiAoY3B1X3Bvc3NpYmxlKF9faSkpCQkJCVwKKwkJCW1lbWNweSgocGNwdWRzdCkrX19wZXJfY3B1X29mZnNldChfX2kpLAlcCisJCQkgICAgICAgKHNyYyksIChzaXplKSk7CQkJXAorfSB3aGlsZSAoMCkKKworZXh0ZXJuIHZvaWQgc2V0dXBfcGVyX2NwdV9hcmVhcyh2b2lkKTsKKworI2Vsc2UgLyogISBTTVAgKi8KKworI2RlZmluZSBERUZJTkVfUEVSX0NQVSh0eXBlLCBuYW1lKSBcCisgICAgX190eXBlb2ZfXyh0eXBlKSBwZXJfY3B1X18jI25hbWUKKworI2RlZmluZSBwZXJfY3B1KHZhciwgY3B1KQkJCSgqKCh2b2lkKShjcHUpLCAmcGVyX2NwdV9fIyN2YXIpKQorI2RlZmluZSBfX2dldF9jcHVfdmFyKHZhcikJCQlwZXJfY3B1X18jI3ZhcgorCisjZW5kaWYJLyogU01QICovCisKKyNkZWZpbmUgREVDTEFSRV9QRVJfQ1BVKHR5cGUsIG5hbWUpIGV4dGVybiBfX3R5cGVvZl9fKHR5cGUpIHBlcl9jcHVfXyMjbmFtZQorCisjZGVmaW5lIEVYUE9SVF9QRVJfQ1BVX1NZTUJPTCh2YXIpIEVYUE9SVF9TWU1CT0wocGVyX2NwdV9fIyN2YXIpCisjZGVmaW5lIEVYUE9SVF9QRVJfQ1BVX1NZTUJPTF9HUEwodmFyKSBFWFBPUlRfU1lNQk9MX0dQTChwZXJfY3B1X18jI3ZhcikKKworI2Vsc2UKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wZXJjcHUuaD4KKyNlbmRpZgorCisjZW5kaWYgLyogX0FTTV9QT1dFUlBDX1BFUkNQVV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ2FsbG9jLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BnYWxsb2MuaAppbmRleCBiZmMyMTEzLi45ZjViMDUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BnYWxsb2MuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BnYWxsb2MuaApAQCAtMSw1ICsxLDYgQEAKICNpZm5kZWYgX0FTTV9QT1dFUlBDX1BHQUxMT0NfSAogI2RlZmluZSBfQVNNX1BPV0VSUENfUEdBTExPQ19ICisjaWZkZWYgX19LRVJORUxfXwogCiAjaWZuZGVmIENPTkZJR19QUEM2NAogI2luY2x1ZGUgPGFzbS1wcGMvcGdhbGxvYy5oPgpAQCAtMTUzLDQgKzE1NCw1IEBACiAjZGVmaW5lIGNoZWNrX3BndF9jYWNoZSgpCWRvIHsgfSB3aGlsZSAoMCkKIAogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfUEdBTExPQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtNjRrLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtNjRrLmgKaW5kZXggMTU0ZjE4NC4uNjUzOTE1MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLTY0ay5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS02NGsuaApAQCAtMSwzICsxLDcgQEAKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX1BHVEFCTEVfNjRLX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX1BHVEFCTEVfNjRLX0gKKyNpZmRlZiBfX0tFUk5FTF9fCisKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wZ3RhYmxlLW5vcHVkLmg+CiAKIApAQCAtODgsMyArOTIsNSBAQAogCiAKICNlbmRpZiAvKiAgX19BU1NFTUJMWV9fICovCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19QR1RBQkxFXzY0S19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS5oCmluZGV4IDAzMDNmNTcuLmUzODkzMTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS5oCkBAIC0xLDUgKzEsNiBAQAogI2lmbmRlZiBfQVNNX1BPV0VSUENfUEdUQUJMRV9ICiAjZGVmaW5lIF9BU01fUE9XRVJQQ19QR1RBQkxFX0gKKyNpZmRlZiBfX0tFUk5FTF9fCiAKICNpZm5kZWYgQ09ORklHX1BQQzY0CiAjaW5jbHVkZSA8YXNtLXBwYy9wZ3RhYmxlLmg+CkBAIC01OCw2ICs1OSwxNyBAQAogI2RlZmluZSBJTUFMTE9DX0VORAkoVk1BTExPQ19TVEFSVCArIFBHVEFCTEVfUkFOR0UpCiAKIC8qCisgKiBSZWdpb24gSURzCisgKi8KKyNkZWZpbmUgUkVHSU9OX1NISUZUCQk2MFVMCisjZGVmaW5lIFJFR0lPTl9NQVNLCQkoMHhmVUwgPDwgUkVHSU9OX1NISUZUKQorI2RlZmluZSBSRUdJT05fSUQoZWEpCQkoKCh1bnNpZ25lZCBsb25nKShlYSkpID4+IFJFR0lPTl9TSElGVCkKKworI2RlZmluZSBWTUFMTE9DX1JFR0lPTl9JRAkoUkVHSU9OX0lEKFZNQUxMT0NfU1RBUlQpKQorI2RlZmluZSBLRVJORUxfUkVHSU9OX0lECShSRUdJT05fSUQoUEFHRV9PRkZTRVQpKQorI2RlZmluZSBVU0VSX1JFR0lPTl9JRAkJKDBVTCkKKworLyoKICAqIENvbW1vbiBiaXRzIGluIGEgbGludXgtc3R5bGUgUFRFLiAgVGhlc2UgbWF0Y2ggdGhlIGJpdHMgaW4gdGhlCiAgKiAoaGFyZHdhcmUtZGVmaW5lZCkgUG93ZXJQQyBQVEUgYXMgY2xvc2VseSBhcyBwb3NzaWJsZS4gQWRkaXRpb25hbAogICogYml0cyBtYXkgYmUgZGVmaW5lZCBpbiBwZ3RhYmxlLSouaApAQCAtNTIxLDQgKzUzMyw1IEBACiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX1BHVEFCTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wbWFjX2ZlYXR1cmUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcG1hY19mZWF0dXJlLmgKaW5kZXggZTk2ODNiYy4uMzIyMTYyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wbWFjX2ZlYXR1cmUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BtYWNfZmVhdHVyZS5oCkBAIC0xMjEsNiArMTIxLDcgQEAKICNkZWZpbmUgUE1BQ19UWVBFX0lNQUNfRzUJCTB4MTUyCS8qIGlNYWMgRzUgKi8KICNkZWZpbmUgUE1BQ19UWVBFX1hTRVJWRV9HNQkJMHgxNTMJLyogWHNlcnZlIEc1ICovCiAjZGVmaW5lIFBNQUNfVFlQRV9VTktOT1dOX0syCQkweDE5ZgkvKiBBbnkgb3RoZXIgSzIgYmFzZWQgKi8KKyNkZWZpbmUgUE1BQ19UWVBFX1VOS05PV05fU0hBU1RBICAgICAgIAkweDE5ZQkvKiBBbnkgb3RoZXIgU2hhc3RhIGJhc2VkICovCiAKIC8qCiAgKiBNb3RoZXJib2FyZCBmbGFncwpAQCAtMzE3LDEwICszMTgsNiBAQAogZXh0ZXJuIHZvaWQgcG1hY19zdXNwZW5kX2FncF9mb3JfY2FyZChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiB2b2lkIHBtYWNfcmVzdW1lX2FncF9mb3JfY2FyZChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIAotLyogVXNlZCBieSB0aGUgdmlhLXBtdSBkcml2ZXIgZm9yIHN1c3BlbmQvcmVzdW1lCi0gKi8KLWV4dGVybiB2b2lkIHBtYWNfdHdlYWtfY2xvY2tfc3ByZWFkaW5nKGludCBlbmFibGUpOwotCiAvKgogICogVGhlIHBhcnQgYmVsb3cgaXMgZm9yIHVzZSBieSBtYWNpb19hc2ljLmMgb25seSwgZG8gbm90IHJlbHkKICAqIG9uIHRoZSBkYXRhIHN0cnVjdHVyZXMgb3IgY29uc3RhbnRzIGJlbG93IGluIGEgbm9ybWFsIGRyaXZlcgpAQCAtMzQxLDYgKzMzOCw3IEBACiAJbWFjaW9fcGFuZ2VhLAogCW1hY2lvX2ludHJlcGlkLAogCW1hY2lvX2tleWxhcmdvMiwKKwltYWNpb19zaGFzdGEsCiB9OwogCiBzdHJ1Y3QgbWFjaW9fY2hpcApAQCAtMzc2LDUgKzM3NCwyNCBAQAogI2RlZmluZSBNQUNJT19JTjgocikJCShpbl84KE1BQ0lPX0ZDUjgobWFjaW8scikpKQogI2RlZmluZSBNQUNJT19PVVQ4KHIsdikJCShvdXRfOChNQUNJT19GQ1I4KG1hY2lvLHIpLCAodikpKQogCisvKgorICogVGhvc2UgYXJlIGV4cG9ydGVkIGJ5IHBtYWMgZmVhdHVyZSBmb3IgaW50ZXJuYWwgdXNlIGJ5IGFyY2ggY29kZQorICogb25seSBsaWtlIHRoZSBwbGF0Zm9ybSBmdW5jdGlvbiBjYWxsYmFja3MsIGRvIG5vdCB1c2UgZGlyZWN0bHkgaW4gZHJpdmVycworICovCitleHRlcm4gc3BpbmxvY2tfdCBmZWF0dXJlX2xvY2s7CitleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICp1bmlub3J0aF9ub2RlOworZXh0ZXJuIHUzMiBfX2lvbWVtICp1bmlub3J0aF9iYXNlOworCisvKgorICogVW5pbm9ydGggcmVnLiBhY2Nlc3MuIE5vdGUgdGhhdCBVbmktTiByZWdzIGFyZSBiaWcgZW5kaWFuCisgKi8KKworI2RlZmluZSBVTl9SRUcocikJKHVuaW5vcnRoX2Jhc2UgKyAoKHIpID4+IDIpKQorI2RlZmluZSBVTl9JTihyKQkoaW5fYmUzMihVTl9SRUcocikpKQorI2RlZmluZSBVTl9PVVQocix2KQkob3V0X2JlMzIoVU5fUkVHKHIpLCAodikpKQorI2RlZmluZSBVTl9CSVMocix2KQkoVU5fT1VUKChyKSwgVU5fSU4ocikgfCAodikpKQorI2RlZmluZSBVTl9CSUMocix2KQkoVU5fT1VUKChyKSwgVU5fSU4ocikgJiB+KHYpKSkKKworCiAjZW5kaWYgLyogX19QUENfQVNNX1BNQUNfRkVBVFVSRV9IICovCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wbWFjX2xvd19pMmMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcG1hY19sb3dfaTJjLmgKaW5kZXggODA5YTU5Ni4uMTMxMDExYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wbWFjX2xvd19pMmMuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BtYWNfbG93X2kyYy5oCkBAIC0xMSwzMyArMTEsOTcgQEAKICAqLwogI2lmbmRlZiBfX1BNQUNfTE9XX0kyQ19IX18KICNkZWZpbmUgX19QTUFDX0xPV19JMkNfSF9fCisjaWZkZWYgX19LRVJORUxfXwogCiAvKiBpMmMgbW9kZSAoYmFzZWQgb24gdGhlIHBsYXRmb3JtIGZ1bmN0aW9ucyBmb3JtYXQpICovCiBlbnVtIHsKLQlwbWFjX2xvd19pMmNfbW9kZV9kdW1iCQk9IDEsCi0JcG1hY19sb3dfaTJjX21vZGVfc3RkCQk9IDIsCi0JcG1hY19sb3dfaTJjX21vZGVfc3Rkc3ViCT0gMywKLQlwbWFjX2xvd19pMmNfbW9kZV9jb21iaW5lZAk9IDQsCisJcG1hY19pMmNfbW9kZV9kdW1iCT0gMSwKKwlwbWFjX2kyY19tb2RlX3N0ZAk9IDIsCisJcG1hY19pMmNfbW9kZV9zdGRzdWIJPSAzLAorCXBtYWNfaTJjX21vZGVfY29tYmluZWQJPSA0LAogfTsKIAogLyogUlcgYml0IGluIGFkZHJlc3MgKi8KIGVudW0gewotCXBtYWNfbG93X2kyY19yZWFkCQk9IDB4MDEsCi0JcG1hY19sb3dfaTJjX3dyaXRlCQk9IDB4MDAKKwlwbWFjX2kyY19yZWFkCQk9IDB4MDEsCisJcG1hY19pMmNfd3JpdGUJCT0gMHgwMAogfTsKIAotLyogSW5pdCwgY2FsbGVkIGVhcmx5IGR1cmluZyBib290ICovCi1leHRlcm4gdm9pZCBwbWFjX2luaXRfbG93X2kyYyh2b2lkKTsKKy8qIGkyYyBidXMgdHlwZSAqLworZW51bSB7CisJcG1hY19pMmNfYnVzX2tleXdlc3QJPSAwLAorCXBtYWNfaTJjX2J1c19wbXUJPSAxLAorCXBtYWNfaTJjX2J1c19zbXUJPSAyLAorfTsKIAotLyogTG9ja2luZyBmdW5jdGlvbnMgZXhwb3NlZCB0byBpMmMta2V5d2VzdCAqLwotaW50IHBtYWNfbG93X2kyY19sb2NrKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOwotaW50IHBtYWNfbG93X2kyY191bmxvY2soc3RydWN0IGRldmljZV9ub2RlICpucCk7CisvKiBpMmMgYnVzIGZlYXR1cmVzICovCitlbnVtIHsKKwkvKiBjYW5fbGFyZ2VzdWIgOiBzdXBwb3J0cyA+MSBieXRlIHN1YmFkZHJlc3NlcyAoU01VIG9ubHkpICovCisJcG1hY19pMmNfY2FuX2xhcmdlc3ViCT0gMHgwMDAwMDAwMXUsCisKKwkvKiBtdWx0aWJ1cyA6IGRldmljZSBub2RlIGhvbGRzIG11bHRpcGxlIGJ1c3NlcywgYnVzIG51bWJlciBpcworCSAqIGVuY29kZWQgaW4gYml0cyAweGZmMDAgb2YgInJlZyIgb2YgYSBnaXZlbiBkZXZpY2UKKwkgKi8KKwlwbWFjX2kyY19tdWx0aWJ1cwk9IDB4MDAwMDAwMDJ1LAorfTsKKworLyogaTJjIGJ1c3NlcyBpbiB0aGUgc3lzdGVtICovCitzdHJ1Y3QgcG1hY19pMmNfYnVzOworc3RydWN0IGkyY19hZGFwdGVyOworCisvKiBJbml0LCBjYWxsZWQgZWFybHkgZHVyaW5nIGJvb3QgKi8KK2V4dGVybiBpbnQgcG1hY19pMmNfaW5pdCh2b2lkKTsKKworLyogTG9va3VwIGFuIGkyYyBidXMgZm9yIGEgZGV2aWNlLW5vZGUuIFRoZSBub2RlIGNhbiBiZSBlaXRoZXIgdGhlIGJ1cworICogbm9kZSBpdHNlbGYgb3IgYSBkZXZpY2UgYmVsb3cgaXQuIEluIHRoZSBjYXNlIG9mIGEgbXVsdGlidXMsIHRoZSBidXMKKyAqIG5vZGUgaXRzZWxmIGlzIHRoZSBjb250cm9sbGVyIG5vZGUsIGVsc2UsIGl0J3MgYSBjaGlsZCBvZiB0aGUgY29udHJvbGxlcgorICogbm9kZQorICovCitleHRlcm4gc3RydWN0IHBtYWNfaTJjX2J1cyAqcG1hY19pMmNfZmluZF9idXMoc3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKKworLyogR2V0IHRoZSBhZGRyZXNzIGZvciBhbiBpMmMgZGV2aWNlLiBUaGlzIHN0cmlwcyB0aGUgYnVzIG51bWJlciBpZgorICogbmVjZXNzYXJ5LiBUaGUgNyBiaXRzIGFkZHJlc3MgaXMgcmV0dXJuZWQgMSBiaXQgcmlnaHQgc2hpZnRlZCBzbyB0aGF0IHRoZQorICogZGlyZWN0aW9uIGNhbiBiZSBkaXJlY3RseSBvcmVkIGluCisgKi8KK2V4dGVybiB1OCBwbWFjX2kyY19nZXRfZGV2X2FkZHIoc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UpOworCisvKiBHZXQgaW5mb3MgYWJvdXQgYSBidXMgKi8KK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBtYWNfaTJjX2dldF9jb250cm9sbGVyKHN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cyk7CitleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpwbWFjX2kyY19nZXRfYnVzX25vZGUoc3RydWN0IHBtYWNfaTJjX2J1cyAqYnVzKTsKK2V4dGVybiBpbnQgcG1hY19pMmNfZ2V0X3R5cGUoc3RydWN0IHBtYWNfaTJjX2J1cyAqYnVzKTsKK2V4dGVybiBpbnQgcG1hY19pMmNfZ2V0X2ZsYWdzKHN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cyk7CitleHRlcm4gaW50IHBtYWNfaTJjX2dldF9jaGFubmVsKHN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cyk7CisKKy8qIGkyYyBsYXllciBhZGFwdGVyIGF0dGFjaC9kZXRhY2ggKi8KK2V4dGVybiB2b2lkIHBtYWNfaTJjX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cywKKwkJCQkgICAgc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK2V4dGVybiB2b2lkIHBtYWNfaTJjX2RldGFjaF9hZGFwdGVyKHN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cywKKwkJCQkgICAgc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK2V4dGVybiBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKnBtYWNfaTJjX2dldF9hZGFwdGVyKHN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cyk7CitleHRlcm4gc3RydWN0IHBtYWNfaTJjX2J1cyAqcG1hY19pMmNfYWRhcHRlcl90b19idXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKKworLyogTWFyY2ggYSBkZXZpY2Ugb3IgYnVzIHdpdGggYW4gaTJjIGFkYXB0ZXIgc3RydWN0dXJlLCB0byBiZSB1c2VkIGJ5IGRyaXZlcnMKKyAqIHRvIG1hdGNoIGRldmljZS10cmVlIG5vZGVzIHdpdGggaTJjIGFkYXB0ZXJzIGR1cmluZyBhZGFwdGVyIGRpc2NvdmVyeQorICogY2FsbGJhY2tzCisgKi8KK2V4dGVybiBpbnQgcG1hY19pMmNfbWF0Y2hfYWRhcHRlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwKKwkJCQkgIHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CisKKworLyogKGxlZ2FjeSkgTG9ja2luZyBmdW5jdGlvbnMgZXhwb3NlZCB0byBpMmMta2V5d2VzdCAqLworZXh0ZXJuIGludCBwbWFjX2xvd19pMmNfbG9jayhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKK2V4dGVybiBpbnQgcG1hY19sb3dfaTJjX3VubG9jayhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKIAogLyogQWNjZXNzIGZ1bmN0aW9ucyBmb3IgcGxhdGZvcm0gY29kZSAqLwotaW50IHBtYWNfbG93X2kyY19vcGVuKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGludCBjaGFubmVsKTsKLWludCBwbWFjX2xvd19pMmNfY2xvc2Uoc3RydWN0IGRldmljZV9ub2RlICpucCk7Ci1pbnQgcG1hY19sb3dfaTJjX3NldG1vZGUoc3RydWN0IGRldmljZV9ub2RlICpucCwgaW50IG1vZGUpOwotaW50IHBtYWNfbG93X2kyY194ZmVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHU4IGFkZHJkaXIsIHU4IHN1YmFkZHIsIHU4ICpkYXRhLCBpbnQgbGVuKTsKK2V4dGVybiBpbnQgcG1hY19pMmNfb3BlbihzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXMsIGludCBwb2xsZWQpOworZXh0ZXJuIHZvaWQgcG1hY19pMmNfY2xvc2Uoc3RydWN0IHBtYWNfaTJjX2J1cyAqYnVzKTsKK2V4dGVybiBpbnQgcG1hY19pMmNfc2V0bW9kZShzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXMsIGludCBtb2RlKTsKK2V4dGVybiBpbnQgcG1hY19pMmNfeGZlcihzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXMsIHU4IGFkZHJkaXIsIGludCBzdWJzaXplLAorCQkJIHUzMiBzdWJhZGRyLCB1OCAqZGF0YSwgIGludCBsZW4pOwogCisvKiBTdXNwZW5kL3Jlc3VtZSBjb2RlIGNhbGxlZCBieSB2aWEtcG11IGRpcmVjdGx5IGZvciBub3cgKi8KK2V4dGVybiB2b2lkIHBtYWNfcGZ1bmNfaTJjX3N1c3BlbmQodm9pZCk7CitleHRlcm4gdm9pZCBwbWFjX3BmdW5jX2kyY19yZXN1bWUodm9pZCk7CiAKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX19QTUFDX0xPV19JMkNfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BtYWNfcGZ1bmMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcG1hY19wZnVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NzI4YzgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BtYWNfcGZ1bmMuaApAQCAtMCwwICsxLDI1MyBAQAorI2lmbmRlZiBfX1BNQUNfUEZVTkNfSF9fCisjZGVmaW5lIF9fUE1BQ19QRlVOQ19IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisvKiBGbGFncyBpbiBjb21tYW5kIGxpc3RzICovCisjZGVmaW5lIFBNRl9GTEFHU19PTl9JTklUCQkweDgwMDAwMDAwdQorI2RlZmluZSBQTUZfRkxHQVNfT05fVEVSTQkJMHg0MDAwMDAwMHUKKyNkZWZpbmUgUE1GX0ZMQUdTX09OX1NMRUVQCQkweDIwMDAwMDAwdQorI2RlZmluZSBQTUZfRkxBR1NfT05fV0FLRQkJMHgxMDAwMDAwMHUKKyNkZWZpbmUgUE1GX0ZMQUdTX09OX0RFTUFORAkJMHgwODAwMDAwMHUKKyNkZWZpbmUgUE1GX0ZMQUdTX0lOVF9HRU4JCTB4MDQwMDAwMDB1CisjZGVmaW5lIFBNRl9GTEFHU19ISUdIX1NQRUVECQkweDAyMDAwMDAwdQorI2RlZmluZSBQTUZfRkxBR1NfTE9XX1NQRUVECQkweDAxMDAwMDAwdQorI2RlZmluZSBQTUZfRkxBR1NfU0lERV9FRkZFQ1RTCQkweDAwODAwMDAwdQorCisvKgorICogQXJndW1lbnRzIHRvIGEgcGxhdGZvcm0gZnVuY3Rpb24gY2FsbC4KKyAqCisgKiBOT1RFOiBCeSBjb252ZW50aW9uLCBwb2ludGVyIGFyZ3VtZW50cyBwb2ludCB0byBhbiB1MzIKKyAqLworc3RydWN0IHBtZl9hcmdzIHsKKwl1bmlvbiB7CisJCXUzMiB2OworCQl1MzIgKnA7CisJfSB1WzRdOworCXVuc2lnbmVkIGludCBjb3VudDsKK307CisKKy8qCisgKiBBIGRyaXZlciBjYXBhYmxlIG9mIGludGVycHJldGluZyBjb21tYW5kcyBwcm92aWRlcyBhIGhhbmRsZXJzCisgKiBzdHJ1Y3R1cmUgZmlsbGVkIHdpdGggd2hhdGV2ZXIgaGFuZGxlcnMgYXJlIGltcGxlbWVudGVkIGJ5IHRoaXMKKyAqIGRyaXZlci4gTm9uIGltcGxlbWVudGVkIGhhbmRsZXJzIGFyZSBsZWZ0IE5VTEwuCisgKgorICogUE1GX1NURF9BUkdTIGFyZSB0aGUgc2FtZSBhcmd1bWVudHMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoZSBwYXJzZXIKKyAqIGFuZCB0aGF0IGdldHMgcGFzc2VkIGJhY2sgdG8gdGhlIHZhcmlvdXMgaGFuZGxlcnMuCisgKgorICogSW50ZXJwcmV0aW5nIGEgZ2l2ZW4gZnVuY3Rpb24gYWx3YXlzIHN0YXJ0IHdpdGggYSBiZWdpbigpIGNhbGwgd2hpY2gKKyAqIHJldHVybnMgYW4gaW5zdGFuY2UgZGF0YSB0byBiZSBwYXNzZWQgYXJvdW5kIHN1YnNlcXVlbnQgY2FsbHMsIGFuZAorICogZW5kcyB3aXRoIGFuIGVuZCgpIGNhbGwuIFRoaXMgYWxsb3dzIHRoZSBsb3cgbGV2ZWwgZHJpdmVyIHRvIGltcGxlbWVudAorICogbG9ja2luZyBwb2xpY3kgb3IgcGVyLWZ1bmN0aW9uIGluc3RhbmNlIGRhdGEuCisgKgorICogRm9yIGludGVycnVwdCBjYXBhYmxlIGZ1bmN0aW9ucywgaXJxX2VuYWJsZSgpIGlzIGNhbGxlZCB3aGVuIGEgY2xpZW50CisgKiByZWdpc3RlcnMsIGFuZCBpcnFfZGlzYWJsZSgpIGlzIGNhbGxlZCB3aGVuIHRoZSBsYXN0IGNsaWVudCB1bnJlZ2lzdGVycworICogTm90ZSB0aGF0IGlycV9lbmFibGUgJiBpcnFfZGlzYWJsZSBhcmUgY2FsbGVkIHdpdGhpbiBhIHNlbWFwaG9yZSBoZWxkCisgKiBieSB0aGUgY29yZSwgdGh1cyB5b3Ugc2hvdWxkIG5vdCB0cnkgdG8gcmVnaXN0ZXIgeW91cnNlbGYgdG8gc29tZSBvdGhlcgorICogcG1mIGludGVycnVwdCBkdXJpbmcgdGhvc2UgY2FsbHMuCisgKi8KKworI2RlZmluZSBQTUZfU1REX0FSR1MJc3RydWN0IHBtZl9mdW5jdGlvbiAqZnVuYywgdm9pZCAqaW5zdGRhdGEsIFwKKwkJICAgICAgICBzdHJ1Y3QgcG1mX2FyZ3MgKmFyZ3MKKworc3RydWN0IHBtZl9mdW5jdGlvbjsKKworc3RydWN0IHBtZl9oYW5kbGVycyB7CisJdm9pZCAqICgqYmVnaW4pKHN0cnVjdCBwbWZfZnVuY3Rpb24gKmZ1bmMsIHN0cnVjdCBwbWZfYXJncyAqYXJncyk7CisJdm9pZCAoKmVuZCkoc3RydWN0IHBtZl9mdW5jdGlvbiAqZnVuYywgdm9pZCAqaW5zdGRhdGEpOworCisJaW50ICgqaXJxX2VuYWJsZSkoc3RydWN0IHBtZl9mdW5jdGlvbiAqZnVuYyk7CisJaW50ICgqaXJxX2Rpc2FibGUpKHN0cnVjdCBwbWZfZnVuY3Rpb24gKmZ1bmMpOworCisJaW50ICgqd3JpdGVfZ3BpbykoUE1GX1NURF9BUkdTLCB1OCB2YWx1ZSwgdTggbWFzayk7CisJaW50ICgqcmVhZF9ncGlvKShQTUZfU1REX0FSR1MsIHU4IG1hc2ssIGludCByc2hpZnQsIHU4IHhvcik7CisKKwlpbnQgKCp3cml0ZV9yZWczMikoUE1GX1NURF9BUkdTLCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUsIHUzMiBtYXNrKTsKKwlpbnQgKCpyZWFkX3JlZzMyKShQTUZfU1REX0FSR1MsIHUzMiBvZmZzZXQpOworCWludCAoKndyaXRlX3JlZzE2KShQTUZfU1REX0FSR1MsIHUzMiBvZmZzZXQsIHUxNiB2YWx1ZSwgdTE2IG1hc2spOworCWludCAoKnJlYWRfcmVnMTYpKFBNRl9TVERfQVJHUywgdTMyIG9mZnNldCk7CisJaW50ICgqd3JpdGVfcmVnOCkoUE1GX1NURF9BUkdTLCB1MzIgb2Zmc2V0LCB1OCB2YWx1ZSwgdTggbWFzayk7CisJaW50ICgqcmVhZF9yZWc4KShQTUZfU1REX0FSR1MsIHUzMiBvZmZzZXQpOworCisJaW50ICgqZGVsYXkpKFBNRl9TVERfQVJHUywgdTMyIGR1cmF0aW9uKTsKKworCWludCAoKndhaXRfcmVnMzIpKFBNRl9TVERfQVJHUywgdTMyIG9mZnNldCwgdTMyIHZhbHVlLCB1MzIgbWFzayk7CisJaW50ICgqd2FpdF9yZWcxNikoUE1GX1NURF9BUkdTLCB1MzIgb2Zmc2V0LCB1MTYgdmFsdWUsIHUxNiBtYXNrKTsKKwlpbnQgKCp3YWl0X3JlZzgpKFBNRl9TVERfQVJHUywgdTMyIG9mZnNldCwgdTggdmFsdWUsIHU4IG1hc2spOworCisJaW50ICgqcmVhZF9pMmMpKFBNRl9TVERfQVJHUywgdTMyIGxlbik7CisJaW50ICgqd3JpdGVfaTJjKShQTUZfU1REX0FSR1MsIHUzMiBsZW4sIGNvbnN0IHU4ICpkYXRhKTsKKwlpbnQgKCpybXdfaTJjKShQTUZfU1REX0FSR1MsIHUzMiBtYXNrbGVuLCB1MzIgdmFsdWVsZW4sIHUzMiB0b3RhbGxlbiwKKwkJICAgICAgIGNvbnN0IHU4ICptYXNrZGF0YSwgY29uc3QgdTggKnZhbHVlZGF0YSk7CisKKwlpbnQgKCpyZWFkX2NmZykoUE1GX1NURF9BUkdTLCB1MzIgb2Zmc2V0LCB1MzIgbGVuKTsKKwlpbnQgKCp3cml0ZV9jZmcpKFBNRl9TVERfQVJHUywgdTMyIG9mZnNldCwgdTMyIGxlbiwgY29uc3QgdTggKmRhdGEpOworCWludCAoKnJtd19jZmcpKFBNRl9TVERfQVJHUywgdTMyIG9mZnNldCwgdTMyIG1hc2tsZW4sIHUzMiB2YWx1ZWxlbiwKKwkJICAgICAgIHUzMiB0b3RhbGxlbiwgY29uc3QgdTggKm1hc2tkYXRhLCBjb25zdCB1OCAqdmFsdWVkYXRhKTsKKworCWludCAoKnJlYWRfaTJjX3N1YikoUE1GX1NURF9BUkdTLCB1OCBzdWJhZGRyLCB1MzIgbGVuKTsKKwlpbnQgKCp3cml0ZV9pMmNfc3ViKShQTUZfU1REX0FSR1MsIHU4IHN1YmFkZHIsIHUzMiBsZW4sIGNvbnN0IHU4ICpkYXRhKTsKKwlpbnQgKCpzZXRfaTJjX21vZGUpKFBNRl9TVERfQVJHUywgaW50IG1vZGUpOworCWludCAoKnJtd19pMmNfc3ViKShQTUZfU1REX0FSR1MsIHU4IHN1YmFkZHIsIHUzMiBtYXNrbGVuLCB1MzIgdmFsdWVsZW4sCisJCQkgICB1MzIgdG90YWxsZW4sIGNvbnN0IHU4ICptYXNrZGF0YSwKKwkJCSAgIGNvbnN0IHU4ICp2YWx1ZWRhdGEpOworCisJaW50ICgqcmVhZF9yZWczMl9tc3J4KShQTUZfU1REX0FSR1MsIHUzMiBvZmZzZXQsIHUzMiBtYXNrLCB1MzIgc2hpZnQsCisJCQkgICAgICAgdTMyIHhvcik7CisJaW50ICgqcmVhZF9yZWcxNl9tc3J4KShQTUZfU1REX0FSR1MsIHUzMiBvZmZzZXQsIHUzMiBtYXNrLCB1MzIgc2hpZnQsCisJCQkgICAgICAgdTMyIHhvcik7CisJaW50ICgqcmVhZF9yZWc4X21zcngpKFBNRl9TVERfQVJHUywgdTMyIG9mZnNldCwgdTMyIG1hc2ssIHUzMiBzaGlmdCwKKwkJCSAgICAgIHUzMiB4b3IpOworCisJaW50ICgqd3JpdGVfcmVnMzJfc2xtKShQTUZfU1REX0FSR1MsIHUzMiBvZmZzZXQsIHUzMiBzaGlmdCwgdTMyIG1hc2spOworCWludCAoKndyaXRlX3JlZzE2X3NsbSkoUE1GX1NURF9BUkdTLCB1MzIgb2Zmc2V0LCB1MzIgc2hpZnQsIHUzMiBtYXNrKTsKKwlpbnQgKCp3cml0ZV9yZWc4X3NsbSkoUE1GX1NURF9BUkdTLCB1MzIgb2Zmc2V0LCB1MzIgc2hpZnQsIHUzMiBtYXNrKTsKKworCWludCAoKm1hc2tfYW5kX2NvbXBhcmUpKFBNRl9TVERfQVJHUywgdTMyIGxlbiwgY29uc3QgdTggKm1hc2tkYXRhLAorCQkJCWNvbnN0IHU4ICp2YWx1ZWRhdGEpOworCisJc3RydWN0IG1vZHVsZSAqb3duZXI7Cit9OworCisKKy8qCisgKiBEcml2ZXJzIHdobyBleHBvc2UgcGxhdGZvcm0gZnVuY3Rpb25zIHJlZ2lzdGVyIGF0IGluaXQgdGltZSwgdGhpcworICogY2F1c2VzIHRoZSBwbGF0Zm9ybSBmdW5jdGlvbnMgZm9yIHRoYXQgZGV2aWNlIG5vZGUgdG8gYmUgcGFyc2VkIGluCisgKiBhZHZhbmNlIGFuZCBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZS4gVGhlIGRhdGEgc3RydWN0dXJlcyBhcmUKKyAqIHBhcnRpYWxseSBwdWJsaWMgc28gYSBkcml2ZXIgY2FuIHdhbGsgdGhlIGxpc3Qgb2YgcGxhdGZvcm0gZnVuY3Rpb25zCisgKiBhbmQgZXZlbnR1YWxseSBpbnNwZWN0IHRoZSBmbGFncworICovCitzdHJ1Y3QgcG1mX2RldmljZTsKKworc3RydWN0IHBtZl9mdW5jdGlvbiB7CisJLyogQWxsIGZ1bmN0aW9ucyBmb3IgYSBnaXZlbiBkcml2ZXIgYXJlIGxpbmtlZCAqLworCXN0cnVjdCBsaXN0X2hlYWQJbGluazsKKworCS8qIEZ1bmN0aW9uIG5vZGUgJiBkcml2ZXIgZGF0YSAqLworCXN0cnVjdCBkZXZpY2Vfbm9kZQkqbm9kZTsKKwl2b2lkCQkJKmRyaXZlcl9kYXRhOworCisJLyogRm9yIGludGVybmFsIHVzZSBieSBjb3JlICovCisJc3RydWN0IHBtZl9kZXZpY2UJKmRldjsKKworCS8qIFRoZSBuYW1lIGlzIHRoZSAieHh4IiBpbiAicGxhdGZvcm0tZG8teHh4IiwgdGhpcyBpcyBob3cKKwkgKiBwbGF0Zm9ybSBmdW5jdGlvbnMgYXJlIGlkZW50aWZpZWQgYnkgdGhpcyBjb2RlLiBTb21lIGZ1bmN0aW9ucworCSAqIG9ubHkgb3BlcmF0ZSBmb3IgYSBnaXZlbiB0YXJnZXQsIGluIHdoaWNoIGNhc2UgdGhlIHBoYW5kbGUgaXMKKwkgKiBoZXJlIChvciAwIGlmIHRoZSBmaWx0ZXIgZG9lc24ndCBhcHBseSkKKwkgKi8KKwljb25zdCBjaGFyCQkqbmFtZTsKKwl1MzIJCQlwaGFuZGxlOworCisJLyogVGhlIGZsYWdzIGZvciB0aGF0IGZ1bmN0aW9uLiBZb3UgY2FuIGhhdmUgc2V2ZXJhbCBmdW5jdGlvbnMKKwkgKiB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIGRpZmZlcmVudCBmbGFnCisJICovCisJdTMyCQkJZmxhZ3M7CisKKwkvKiBUaGUgYWN0dWFsIHRva2VuaXplZCBmdW5jdGlvbiBibG9iICovCisJY29uc3Qgdm9pZAkJKmRhdGE7CisJdW5zaWduZWQgaW50CQlsZW5ndGg7CisKKwkvKiBJbnRlcnJ1cHQgY2xpZW50cyAqLworCXN0cnVjdCBsaXN0X2hlYWQJaXJxX2NsaWVudHM7CisKKwkvKiBSZWZjb3VudGluZyAqLworCXN0cnVjdCBrcmVmCQlyZWY7Cit9OworCisvKgorICogRm9yIHBsYXRmb3JtIGZ1bmN0aW9ucyB0aGF0IGFyZSBpbnRlcnJ1cHRzLCBvbmUgY2FuIHJlZ2lzdGVyCisgKiBpcnFfY2xpZW50IHN0cnVjdHVyZXMuIFlvdSBjYW5OT1QgdXNlIHRoZSBzYW1lIHN0cnVjdHVyZSB0d2ljZQorICogYXMgaXQgY29udGFpbnMgYSBsaW5rIG1lbWJlci4gQWxzbywgdGhlIGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoCisgKiBhIHNwaW5sb2NrIGhlbGQsIHlvdSBtdXN0IG5vdCBjYWxsIGJhY2sgaW50byBhbnkgb2YgdGhlIHBtZl8qIGZ1bmN0aW9ucworICogZnJvbSB3aXRoaW4gdGhhdCBjYWxsYmFjaworICovCitzdHJ1Y3QgcG1mX2lycV9jbGllbnQgeworCXZvaWQJCQkoKmhhbmRsZXIpKHZvaWQgKmRhdGEpOworCXZvaWQJCQkqZGF0YTsKKwlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7CisJc3RydWN0IGxpc3RfaGVhZAlsaW5rOworfTsKKworCisvKgorICogUmVnaXN0ZXIvVW5yZWdpc3RlciBhIGZ1bmN0aW9uLWNhcGFibGUgZHJpdmVyIGFuZCBpdHMgaGFuZGxlcnMKKyAqLworZXh0ZXJuIGludCBwbWZfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkgICAgICBzdHJ1Y3QgcG1mX2hhbmRsZXJzICpoYW5kbGVycywKKwkJCSAgICAgIHZvaWQgKmRyaXZlcmRhdGEpOworCitleHRlcm4gdm9pZCBwbWZfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGRldmljZV9ub2RlICpucCk7CisKKworLyoKKyAqIFJlZ2lzdGVyL1VucmVnaXN0ZXIgaW50ZXJydXB0IGNsaWVudHMKKyAqLworZXh0ZXJuIGludCBwbWZfcmVnaXN0ZXJfaXJxX2NsaWVudChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgc3RydWN0IHBtZl9pcnFfY2xpZW50ICpjbGllbnQpOworCitleHRlcm4gdm9pZCBwbWZfdW5yZWdpc3Rlcl9pcnFfY2xpZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgICBzdHJ1Y3QgcG1mX2lycV9jbGllbnQgKmNsaWVudCk7CisKKy8qCisgKiBDYWxsZWQgYnkgdGhlIGhhbmRsZXJzIHdoZW4gYW4gaXJxIGhhcHBlbnMKKyAqLworZXh0ZXJuIHZvaWQgcG1mX2RvX2lycShzdHJ1Y3QgcG1mX2Z1bmN0aW9uICpmdW5jKTsKKworCisvKgorICogTG93IGxldmVsIGNhbGwgdG8gcGxhdGZvcm0gZnVuY3Rpb25zLgorICoKKyAqIFRoZSBwaGFuZGxlIGNhbiBmaWx0ZXIgb24gdGhlIHRhcmdldCBvYmplY3QgZm9yIGZ1bmN0aW9ucyB0aGF0IGhhdmUKKyAqIG11bHRpcGxlIHRhcmdldHMsIHRoZSBmbGFncyBhbGxvdyB5b3UgdG8gcmVzdHJpY3QgdGhlIGNhbGwgdG8gYSBnaXZlbgorICogY29tYmluYXRpb24gb2YgZmxhZ3MuCisgKgorICogVGhlIGFyZ3MgYXJyYXkgY29udGFpbnMgYXMgbWFueSBhcmd1bWVudHMgYXMgaXMgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uLAorICogdGhpcyBpcyBkZXBlbmRlbnQgb24gdGhlIGZ1bmN0aW9uIHlvdSBhcmUgY2FsbGluZywgdW5mb3J0dW5hdGVseSBBcHBsZQorICogbWVjYW5pc20gcHJvdmlkZXMgbm8gd2F5IHRvIGVuY29kZSB0aGF0IHNvIHlvdSBoYXZlIHRvIGdldCBpdCByaWdodCBhdAorICogdGhlIGNhbGwgc2l0ZS4gU29tZSBmdW5jdGlvbnMgcmVxdWlyZSBubyBhcmdzLCBpbiB3aGljaCBjYXNlLCB5b3UgY2FuCisgKiBwYXNzIE5VTEwuCisgKgorICogWW91IGNhbiBhbHNvIHBhc3MgTlVMTCB0byB0aGUgbmFtZS4gVGhpcyB3aWxsIG1hdGNoIGFueSBmdW5jdGlvbiB0aGF0IGhhcworICogdGhlIGFwcHJvcHJpYXRlIGNvbWJpbmF0aW9uIG9mIGZsYWdzICYgcGhhbmRsZSBvciB5b3UgY2FuIHBhc3MgMCB0byB0aGUKKyAqIHBoYW5kbGUgdG8gbWF0Y2ggYW55CisgKi8KK2V4dGVybiBpbnQgcG1mX2RvX2Z1bmN0aW9ucyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgIHUzMiBwaGFuZGxlLCB1MzIgZmxhZ3MsIHN0cnVjdCBwbWZfYXJncyAqYXJncyk7CisKKworCisvKgorICogSGlnaCBsZXZlbCBjYWxsIHRvIGEgcGxhdGZvcm0gZnVuY3Rpb24uCisgKgorICogVGhpcyBvbmUgbG9va3MgZm9yIHRoZSBwbGF0Zm9ybS14eHggZmlyc3Qgc28geW91IHNob3VsZCBjYWxsIGl0IHRvIHRoZQorICogYWN0dWFsIHRhcmdldCBpZiBhbnkuIEl0IHdpbGwgZmFsbGJhY2sgdG8gcGxhdGZvcm0tZG8teHh4IGlmIGl0IGNhbid0CisgKiBmaW5kIG9uZS4gSXQgd2lsbCBhbHNvIGV4Y2x1c2l2ZWx5IHRhcmdldCBmdW5jdGlvbnMgdGhhdCBoYXZlCisgKiB0aGUgIk9uRGVtYW5kIiBmbGFnLgorICovCisKK2V4dGVybiBpbnQgcG1mX2NhbGxfZnVuY3Rpb24oc3RydWN0IGRldmljZV9ub2RlICp0YXJnZXQsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgIHN0cnVjdCBwbWZfYXJncyAqYXJncyk7CisKKworLyoKKyAqIEZvciBsb3cgbGF0ZW5jeSBpbnRlcnJ1cHQgdXNhZ2UsIHlvdSBjYW4gbG9va3VwIGZvciBvbi1kZW1hbmQgZnVuY3Rpb25zCisgKiB1c2luZyB0aGUgZnVuY3Rpb25zIGJlbG93CisgKi8KKworZXh0ZXJuIHN0cnVjdCBwbWZfZnVuY3Rpb24gKnBtZl9maW5kX2Z1bmN0aW9uKHN0cnVjdCBkZXZpY2Vfbm9kZSAqdGFyZ2V0LAorCQkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lKTsKKworZXh0ZXJuIHN0cnVjdCBwbWZfZnVuY3Rpb24gKiBwbWZfZ2V0X2Z1bmN0aW9uKHN0cnVjdCBwbWZfZnVuY3Rpb24gKmZ1bmMpOworZXh0ZXJuIHZvaWQgcG1mX3B1dF9mdW5jdGlvbihzdHJ1Y3QgcG1mX2Z1bmN0aW9uICpmdW5jKTsKKworZXh0ZXJuIGludCBwbWZfY2FsbF9vbmUoc3RydWN0IHBtZl9mdW5jdGlvbiAqZnVuYywgc3RydWN0IHBtZl9hcmdzICphcmdzKTsKKworCisvKiBTdXNwZW5kL3Jlc3VtZSBjb2RlIGNhbGxlZCBieSB2aWEtcG11IGRpcmVjdGx5IGZvciBub3cgKi8KK2V4dGVybiB2b2lkIHBtYWNfcGZ1bmNfYmFzZV9zdXNwZW5kKHZvaWQpOworZXh0ZXJuIHZvaWQgcG1hY19wZnVuY19iYXNlX3Jlc3VtZSh2b2lkKTsKKworI2VuZGlmIC8qIF9fUE1BQ19QRlVOQ19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcG1jLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BtYy5oCmluZGV4IDVmNDFmM2EuLjA3ZDZhNDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcG1jLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wbWMuaApAQCAtMTgsNiArMTgsNyBAQAogICovCiAjaWZuZGVmIF9QT1dFUlBDX1BNQ19ICiAjZGVmaW5lIF9QT1dFUlBDX1BNQ19ICisjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCkBAIC00NCw0ICs0NSw1IEBACiBleHRlcm4gc3RydWN0IG9wX3Bvd2VycGNfbW9kZWwgb3BfbW9kZWxfZnNsX2Jvb2tlOwogI2VuZGlmCiAKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX1BPV0VSUENfUE1DX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHBjLXBjaS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGMtcGNpLmgKaW5kZXggMzZjZGM4Ni4uZjgwNDgyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGMtcGNpLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGMtcGNpLmgKQEAgLTgsNiArOCw3IEBACiAgKi8KICNpZm5kZWYgX0FTTV9QT1dFUlBDX1BQQ19QQ0lfSAogI2RlZmluZSBfQVNNX1BPV0VSUENfUFBDX1BDSV9ICisjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KQEAgLTUxLDYgKzUyLDIxIEBACiAKIC8qIC0tLS0gRUVIIGludGVybmFsLXVzZS1vbmx5IHJlbGF0ZWQgcm91dGluZXMgLS0tLSAqLwogI2lmZGVmIENPTkZJR19FRUgKKwordm9pZCBwY2lfYWRkcl9jYWNoZV9pbnNlcnRfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwordm9pZCBwY2lfYWRkcl9jYWNoZV9yZW1vdmVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwordm9pZCBwY2lfYWRkcl9jYWNoZV9idWlsZCh2b2lkKTsKK3N0cnVjdCBwY2lfZGV2ICpwY2lfZ2V0X2RldmljZV9ieV9hZGRyKHVuc2lnbmVkIGxvbmcgYWRkcik7CisKKy8qKgorICogZWVoX3Nsb3RfZXJyb3JfZGV0YWlsIC0tIHJlY29yZCBhbmQgRUVIIGVycm9yIGNvbmRpdGlvbiB0byB0aGUgbG9nCisgKiBAc2V2ZXJpdHk6IDEgaWYgdGVtcG9yYXJ5LCAyIGlmIHBlcm1hbmVudCBmYWlsdXJlLgorICoKKyAqIE9idGFpbnMgdGhlIHRoZSBFRUggZXJyb3IgZGV0YWlscyBmcm9tIHRoZSBSVEFTIHN1YnN5c3RlbSwKKyAqIGFuZCB0aGVuIGxvZ3MgdGhlc2UgZGV0YWlscyB3aXRoIHRoZSBSVEFTIGVycm9yIGxvZyBzeXN0ZW0uCisgKi8KK3ZvaWQgZWVoX3Nsb3RfZXJyb3JfZGV0YWlsIChzdHJ1Y3QgcGNpX2RuICpwZG4sIGludCBzZXZlcml0eSk7CisKIC8qKgogICogcnRhc19zZXRfc2xvdF9yZXNldCAtLSB1bmZyZWV6ZSBhIGZyb3plbiBzbG90CiAgKgpAQCAtNTgsOCArNzQsMTAgQEAKICAqIGRvZXMgdGhpcyBieSBhc3NlcnRpbmcgdGhlIFBDSSAjUlNUIGxpbmUgZm9yIDEvOHRoIG9mCiAgKiBhIHNlY29uZDsgdGhpcyByb3V0aW5lIHdpbGwgc2xlZXAgd2hpbGUgdGhlIGFkYXB0ZXIgaXMKICAqIGJlaW5nIHJlc2V0LgorICoKKyAqIFJldHVybnMgYSBub24temVybyB2YWx1ZSBpZiB0aGUgcmVzZXQgZmFpbGVkLgogICovCi12b2lkIHJ0YXNfc2V0X3Nsb3RfcmVzZXQgKHN0cnVjdCBwY2lfZG4gKik7CitpbnQgcnRhc19zZXRfc2xvdF9yZXNldCAoc3RydWN0IHBjaV9kbiAqKTsKIAogLyoqIAogICogZWVoX3Jlc3RvcmVfYmFycyAtIFJlc3RvcmUgZGV2aWNlIGNvbmZpZ3VyYXRpb24gaW5mby4KQEAgLTgzLDYgKzEwMSw3IEBACiB2b2lkIHJ0YXNfY29uZmlndXJlX2JyaWRnZShzdHJ1Y3QgcGNpX2RuICopOwogCiBpbnQgcnRhc193cml0ZV9jb25maWcoc3RydWN0IHBjaV9kbiAqLCBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgdmFsKTsKK2ludCBydGFzX3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfZG4gKiwgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyICp2YWwpOwogCiAvKioKICAqIG1hcmsgYW5kIGNsZWFyIHNsb3RzOiBmaW5kICJwYXJ0aXRpb24gZW5kcG9pbnQiIFBFIGFuZCBzZXQgb3IgCkBAIC05MSw2ICsxMTAsMTAgQEAKIHZvaWQgZWVoX21hcmtfc2xvdCAoc3RydWN0IGRldmljZV9ub2RlICpkbiwgaW50IG1vZGVfZmxhZyk7CiB2b2lkIGVlaF9jbGVhcl9zbG90IChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLCBpbnQgbW9kZV9mbGFnKTsKIAorLyogRmluZCB0aGUgYXNzb2NpYXRlZCAiUGFydGlhdGlvbmFibGUgRW5kcG9pbnQiIFBFICovCitzdHJ1Y3QgZGV2aWNlX25vZGUgKiBmaW5kX2RldmljZV9wZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKTsKKwogI2VuZGlmCiAKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX1BQQ19QQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGNfYXNtLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwY19hc20uaAppbmRleCBjMjdiYWEwLi5hYjg2ODhkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwY19hc20uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwY19hc20uaApAQCAtOTQsNiArOTQsNyBAQAogI2RlZmluZSBSRkRJCQkubG9uZyAweDRjMDAwMDRlCS8qIHJmZGkgaW5zdHJ1Y3Rpb24gKi8KICNkZWZpbmUgUkZNQ0kJCS5sb25nIDB4NGMwMDAwNGMJLyogcmZtY2kgaW5zdHJ1Y3Rpb24gKi8KIAorI2lmZGVmIF9fS0VSTkVMX18KICNpZmRlZiBDT05GSUdfUFBDNjQKIAogI2RlZmluZSBYR0xVRShhLGIpIGEjI2IKQEAgLTE1NSw1MiArMTU2LDU2IEBACiAjZW5kaWYKIAogLyogCi0gKiBMT0FEQUREUiggcm4sIG5hbWUgKQotICogICBsb2FkcyB0aGUgYWRkcmVzcyBvZiAnbmFtZScgaW50byAncm4nCisgKiBMT0FEX1JFR19JTU1FRElBVEUocm4sIGV4cHIpCisgKiAgIExvYWRzIHRoZSB2YWx1ZSBvZiB0aGUgY29uc3RhbnQgZXhwcmVzc2lvbiAnZXhwcicgaW50byByZWdpc3RlciAncm4nCisgKiAgIHVzaW5nIGltbWVkaWF0ZSBpbnN0cnVjdGlvbnMgb25seS4gIFVzZSB0aGlzIHdoZW4gaXQncyBpbXBvcnRhbnQgbm90CisgKiAgIHRvIHJlZmVyZW5jZSBvdGhlciBkYXRhIChpLmUuIG9uIHBwYzY0IHdoZW4gdGhlIFRPQyBwb2ludGVyIGlzIG5vdAorICogICB2YWxpZCkuCiAgKgotICogTE9BREJBU0UoIHJuLCBuYW1lICkKLSAqICAgbG9hZHMgdGhlIGFkZHJlc3MgKHBvc3NpYmx5IHdpdGhvdXQgdGhlIGxvdyAxNiBiaXRzKSBvZiAnbmFtZScgaW50byAncm4nCi0gKiAgIHN1aXRhYmxlIGZvciBiYXNlK2Rpc3AgYWRkcmVzc2luZworICogTE9BRF9SRUdfQUREUihybiwgbmFtZSkKKyAqICAgTG9hZHMgdGhlIGFkZHJlc3Mgb2YgbGFiZWwgJ25hbWUnIGludG8gcmVnaXN0ZXIgJ3JuJy4gIFVzZSB0aGlzIHdoZW4KKyAqICAgeW91IGRvbid0IHBhcnRpY3VsYXJseSBuZWVkIGltbWVkaWF0ZSBpbnN0cnVjdGlvbnMgb25seSwgYnV0IHlvdSBuZWVkCisgKiAgIHRoZSB3aG9sZSBhZGRyZXNzIGluIG9uZSByZWdpc3RlciAoZS5nLiBpdCdzIGEgc3RydWN0dXJlIGFkZHJlc3MgYW5kCisgKiAgIHlvdSB3YW50IHRvIGFjY2VzcyB2YXJpb3VzIG9mZnNldHMgd2l0aGluIGl0KS4gIE9uIHBwYzMyIHRoaXMgaXMKKyAqICAgaWRlbnRpY2FsIHRvIExPQURfUkVHX0lNTUVESUFURS4KKyAqCisgKiBMT0FEX1JFR19BRERSQkFTRShybiwgbmFtZSkKKyAqIEFERFJPRkYobmFtZSkKKyAqICAgTE9BRF9SRUdfQUREUkJBU0UgbG9hZHMgcGFydCBvZiB0aGUgYWRkcmVzcyBvZiBsYWJlbCAnbmFtZScgaW50bworICogICByZWdpc3RlciAncm4nLiAgQUREUk9GRihuYW1lKSByZXR1cm5zIHRoZSByZW1haW5kZXIgb2YgdGhlIGFkZHJlc3MgYXMKKyAqICAgYSBjb25zdGFudCBleHByZXNzaW9uLiAgQUREUk9GRihuYW1lKSBpcyBhIHNpZ25lZCBleHByZXNzaW9uIDwgMTYgYml0cworICogICBpbiBzaXplLCBzbyBpcyBzdWl0YWJsZSBmb3IgdXNlIGRpcmVjdGx5IGFzIGFuIG9mZnNldCBpbiBsb2FkIGFuZCBzdG9yZQorICogICBpbnN0cnVjdGlvbnMuICBVc2UgdGhpcyB3aGVuIGxvYWRpbmcvc3RvcmluZyBhIHNpbmdsZSB3b3JkIG9yIGxlc3MgYXM6CisgKiAgICAgIExPQURfUkVHX0FERFJCQVNFKHJYLCBuYW1lKQorICogICAgICBsZAlyWSxBRERST0ZGKG5hbWUpKHJYKQogICovCiAjaWZkZWYgX19wb3dlcnBjNjRfXwotI2RlZmluZSBMT0FEQUREUihybixuYW1lKSBcCi0JbGlzCXJuLG5hbWUjI0BoaWdoZXN0OwlcCi0Jb3JpCXJuLHJuLG5hbWUjI0BoaWdoZXI7CVwKLQlybGRpY3IJcm4scm4sMzIsMzE7CQlcCi0Jb3JpcwlybixybixuYW1lIyNAaDsJCVwKLQlvcmkJcm4scm4sbmFtZSMjQGwKKyNkZWZpbmUgTE9BRF9SRUdfSU1NRURJQVRFKHJlZyxleHByKQkJXAorCWxpcyAgICAgKHJlZyksKGV4cHIpQGhpZ2hlc3Q7CQlcCisJb3JpICAgICAocmVnKSwocmVnKSwoZXhwcilAaGlnaGVyOwlcCisJcmxkaWNyICAocmVnKSwocmVnKSwzMiwzMTsJCVwKKwlvcmlzICAgIChyZWcpLChyZWcpLChleHByKUBoOwkJXAorCW9yaSAgICAgKHJlZyksKHJlZyksKGV4cHIpQGw7CiAKLSNkZWZpbmUgTE9BREJBU0Uocm4sbmFtZSkJCVwKLQlsZAlybixuYW1lQGdvdChyMikKKyNkZWZpbmUgTE9BRF9SRUdfQUREUihyZWcsbmFtZSkJCQlcCisJbGQJKHJlZyksbmFtZUBnb3QocjIpCiAKLSNkZWZpbmUgT0ZGKG5hbWUpCTAKLQotI2RlZmluZSBTRVRfUkVHX1RPX0NPTlNUKHJlZywgdmFsdWUpCSAgICAgICAgIAlcCi0JbGlzICAgICByZWcsKCgodmFsdWUpPj40OCkmMHhGRkZGKTsgICAgICAgICAgICAgXAotCW9yaSAgICAgcmVnLHJlZywoKCh2YWx1ZSk+PjMyKSYweEZGRkYpOyAgICAgICAgIFwKLQlybGRpY3IgIHJlZyxyZWcsMzIsMzE7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0Jb3JpcyAgICByZWcscmVnLCgoKHZhbHVlKT4+MTYpJjB4RkZGRik7ICAgICAgICAgXAotCW9yaSAgICAgcmVnLHJlZywoKHZhbHVlKSYweEZGRkYpOwotCi0jZGVmaW5lIFNFVF9SRUdfVE9fTEFCRUwocmVnLCBsYWJlbCkJICAgICAgICAgCVwKLQlsaXMgICAgIHJlZywobGFiZWwpQGhpZ2hlc3Q7ICAgICAgICAgICAgICAgICAgICBcCi0Jb3JpICAgICByZWcscmVnLChsYWJlbClAaGlnaGVyOyAgICAgICAgICAgICAgICAgXAotCXJsZGljciAgcmVnLHJlZywzMiwzMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlvcmlzICAgIHJlZyxyZWcsKGxhYmVsKUBoOyAgICAgICAgICAgICAgICAgICAgICBcCi0Jb3JpICAgICByZWcscmVnLChsYWJlbClAbDsKKyNkZWZpbmUgTE9BRF9SRUdfQUREUkJBU0UocmVnLG5hbWUpCUxPQURfUkVHX0FERFIocmVnLG5hbWUpCisjZGVmaW5lIEFERFJPRkYobmFtZSkJCQkwCiAKIC8qIG9mZnNldHMgZm9yIHN0YWNrIGZyYW1lIGxheW91dCAqLwogI2RlZmluZSBMUlNBVkUJMTYKIAogI2Vsc2UgLyogMzItYml0ICovCi0jZGVmaW5lIExPQURBRERSKHJuLG5hbWUpIFwKLQlsaXMJcm4sbmFtZUBoYTsJXAotCWFkZGkJcm4scm4sbmFtZUBsCiAKLSNkZWZpbmUgTE9BREJBU0Uocm4sbmFtZSkJXAotCWxpcwlybixuYW1lQGhhCisjZGVmaW5lIExPQURfUkVHX0lNTUVESUFURShyZWcsZXhwcikJCVwKKwlsaXMJKHJlZyksKGV4cHIpQGhhOwkJXAorCWFkZGkJKHJlZyksKHJlZyksKGV4cHIpQGw7CiAKLSNkZWZpbmUgT0ZGKG5hbWUpCW5hbWVAbAorI2RlZmluZSBMT0FEX1JFR19BRERSKHJlZyxuYW1lKQkJTE9BRF9SRUdfSU1NRURJQVRFKHJlZywgbmFtZSkKKworI2RlZmluZSBMT0FEX1JFR19BRERSQkFTRShyZWcsIG5hbWUpCWxpcwkocmVnKSxuYW1lQGhhCisjZGVmaW5lIEFERFJPRkYobmFtZSkJCQluYW1lQGwKIAogLyogb2Zmc2V0cyBmb3Igc3RhY2sgZnJhbWUgbGF5b3V0ICovCiAjZGVmaW5lIExSU0FWRQk0CkBAIC0zMjUsNiArMzMwLDggQEAKICNkZWZpbmUgQ0xSX1RPUDMyKHIpCiAjZW5kaWYKIAorI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKwogLyogVGhlIGJvcmluZyBiaXRzLi4uICovCiAKIC8qIENvbmRpdGlvbiBSZWdpc3RlciBCaXQgRmllbGRzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9jZXNzb3IuaAppbmRleCBkMTIzODJkLi40MTVmYTM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvY2Vzc29yLmgKQEAgLTEwLDcgKzEwLDYgQEAKICAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGFzbS9yZWcuaD4KIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KQEAgLTUwLDYgKzQ5LDcgQEAKICNkZWZpbmUgX0NIUlBfSUJNCTB4MDUJLyogSUJNIGNocnAsIHRoZSBsb25ndHJhaWwgYW5kIGxvbmd0cmFpbCAyICovCiAjZGVmaW5lIF9DSFJQX1BlZ2Fzb3MJMHgwNgkvKiBHZW5lc2kvYnBsYW4ncyBQZWdhc29zIGFuZCBQZWdhc29zMiAqLwogCisjaWZkZWYgX19LRVJORUxfXwogI2RlZmluZSBwbGF0Zm9ybV9pc19wc2VyaWVzKCkJKF9tYWNoaW5lID09IFBMQVRGT1JNX1BTRVJJRVMgfHwgXAogCQkJCSBfbWFjaGluZSA9PSBQTEFURk9STV9QU0VSSUVTX0xQQVIpCiAjZGVmaW5lIHBsYXRmb3JtX2lzX2xwYXIoKQkoISEoX21hY2hpbmUgJiBQTEFURk9STV9MUEFSKSkKQEAgLTY4LDcgKzY4LDYgQEAKICAqIHZlbmRvci4gQm9hcmQgcmV2aXNpb24gaXMgYWxzbyBtYWRlIGF2YWlsYWJsZS4gVGhpcyB3aWxsIGJlIG1vdmVkCiAgKiBlbHNld2hlcmUgc29vbgogICovCi1leHRlcm4gdW5zaWduZWQgY2hhciB1Y1N5c3RlbVR5cGU7CiBleHRlcm4gdW5zaWduZWQgY2hhciB1Y0JvYXJkUmV2OwogZXh0ZXJuIHVuc2lnbmVkIGNoYXIgdWNCb2FyZFJldk1haiwgdWNCb2FyZFJldk1pbjsKIApAQCAtODIsNyArODEsNyBAQAogI2Vsc2UKICNkZWZpbmUgX21hY2hpbmUgMAogI2VuZGlmIC8qIENPTkZJR19QUENfTVVMVElQTEFURk9STSAqLwotCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogLyoKICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgbWFjcm8gdGhhdCByZXR1cm5zIGN1cnJlbnQKICAqIGluc3RydWN0aW9uIHBvaW50ZXIgKCJwcm9ncmFtIGNvdW50ZXIiKS4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvbS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmgKaW5kZXggZjk5OWRmMS4uNWIyYmQ0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmgKQEAgLTY1LDQ5ICs2NSwxMSBAQAogdHlwZWRlZiB1MzIgcGhhbmRsZTsKIHR5cGVkZWYgdTMyIGloYW5kbGU7CiAKLXN0cnVjdCBhZGRyZXNzX3JhbmdlIHsKLQl1bnNpZ25lZCBsb25nIHNwYWNlOwotCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLQl1bnNpZ25lZCBsb25nIHNpemU7Ci19OwotCiBzdHJ1Y3QgaW50ZXJydXB0X2luZm8gewogCWludAlsaW5lOwogCWludAlzZW5zZTsJCS8qICt2ZS8tdmUgbG9naWMsIGVkZ2Ugb3IgbGV2ZWwsIGV0Yy4gKi8KIH07CiAKLXN0cnVjdCBwY2lfYWRkcmVzcyB7Ci0JdTMyIGFfaGk7Ci0JdTMyIGFfbWlkOwotCXUzMiBhX2xvOwotfTsKLQotc3RydWN0IGlzYV9hZGRyZXNzIHsKLQl1MzIgYV9oaTsKLQl1MzIgYV9sbzsKLX07Ci0KLXN0cnVjdCBpc2FfcmFuZ2UgewotCXN0cnVjdCBpc2FfYWRkcmVzcyBpc2FfYWRkcjsKLQlzdHJ1Y3QgcGNpX2FkZHJlc3MgcGNpX2FkZHI7Ci0JdW5zaWduZWQgaW50IHNpemU7Ci19OwotCi1zdHJ1Y3QgcmVnX3Byb3BlcnR5IHsKLQl1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotfTsKLQotc3RydWN0IHJlZ19wcm9wZXJ0eTMyIHsKLQl1bnNpZ25lZCBpbnQgYWRkcmVzczsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsKLX07Ci0KLXN0cnVjdCByZWdfcHJvcGVydHk2NCB7Ci0JdTY0IGFkZHJlc3M7Ci0JdTY0IHNpemU7Ci19OwotCiBzdHJ1Y3QgcHJvcGVydHkgewogCWNoYXIJKm5hbWU7CiAJaW50CWxlbmd0aDsKQEAgLTEyMCwxMyArODIsMTIgQEAKIAljaGFyCSp0eXBlOwogCXBoYW5kbGUJbm9kZTsKIAlwaGFuZGxlIGxpbnV4X3BoYW5kbGU7Ci0JaW50CW5fYWRkcnM7Ci0Jc3RydWN0CWFkZHJlc3NfcmFuZ2UgKmFkZHJzOwogCWludAluX2ludHJzOwogCXN0cnVjdAlpbnRlcnJ1cHRfaW5mbyAqaW50cnM7CiAJY2hhcgkqZnVsbF9uYW1lOwogCiAJc3RydWN0CXByb3BlcnR5ICpwcm9wZXJ0aWVzOworCXN0cnVjdCAgcHJvcGVydHkgKmRlYWRwcm9wczsgLyogcmVtb3ZlZCBwcm9wZXJ0aWVzICovCiAJc3RydWN0CWRldmljZV9ub2RlICpwYXJlbnQ7CiAJc3RydWN0CWRldmljZV9ub2RlICpjaGlsZDsKIAlzdHJ1Y3QJZGV2aWNlX25vZGUgKnNpYmxpbmc7CkBAIC0xNzUsNiArMTM2LDkgQEAKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dldF9wYXJlbnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dldF9uZXh0X2NoaWxkKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKIAkJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKnByZXYpOworZXh0ZXJuIHN0cnVjdCBwcm9wZXJ0eSAqb2ZfZmluZF9wcm9wZXJ0eShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQkgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJIGludCAqbGVucCk7CiBleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlX2dldChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpOwogZXh0ZXJuIHZvaWQgb2Zfbm9kZV9wdXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKIApAQCAtMjA0LDYgKzE2OCwxMCBAQAogZXh0ZXJuIGludCBwcm9tX25faW50cl9jZWxscyhzdHJ1Y3QgZGV2aWNlX25vZGUqIG5wKTsKIGV4dGVybiB2b2lkIHByb21fZ2V0X2lycV9zZW5zZXModW5zaWduZWQgY2hhciAqc2Vuc2VzLCBpbnQgb2ZmLCBpbnQgbWF4KTsKIGV4dGVybiBpbnQgcHJvbV9hZGRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlKiBucCwgc3RydWN0IHByb3BlcnR5KiBwcm9wKTsKK2V4dGVybiBpbnQgcHJvbV9yZW1vdmVfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpucCwgc3RydWN0IHByb3BlcnR5ICpwcm9wKTsKK2V4dGVybiBpbnQgcHJvbV91cGRhdGVfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQlzdHJ1Y3QgcHJvcGVydHkgKm5ld3Byb3AsCisJCQkJc3RydWN0IHByb3BlcnR5ICpvbGRwcm9wKTsKIAogI2lmZGVmIENPTkZJR19QUEMzMgogLyoKQEAgLTIyMyw1ICsxOTEsMzYgQEAKIAkJCQlpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIG5hbWVfcG9zdGZpeCk7CiBleHRlcm4gaW50IHJlbGVhc2VfT0ZfcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCBpbnQgaW5kZXgpOwogCisKKy8qCisgKiBPRiBhZGRyZXNzIHJldHJlaXZhbCAmIHRyYW5zbGF0aW9uCisgKi8KKworCisvKiBUcmFuc2xhdGUgYW4gT0YgYWRkcmVzcyBibG9jayBpbnRvIGEgQ1BVIHBoeXNpY2FsIGFkZHJlc3MKKyAqLworI2RlZmluZSBPRl9CQURfQUREUgkoKHU2NCktMSkKK2V4dGVybiB1NjQgb2ZfdHJhbnNsYXRlX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpucCwgdTMyICphZGRyKTsKKworLyogRXh0cmFjdCBhbiBhZGRyZXNzIGZyb20gYSBkZXZpY2UsIHJldHVybnMgdGhlIHJlZ2lvbiBzaXplIGFuZAorICogdGhlIGFkZHJlc3Mgc3BhY2UgZmxhZ3MgdG9vLiBUaGUgUENJIHZlcnNpb24gdXNlcyBhIEJBUiBudW1iZXIKKyAqIGluc3RlYWQgb2YgYW4gYWJzb2x1dGUgaW5kZXgKKyAqLworZXh0ZXJuIHUzMiAqb2ZfZ2V0X2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBpbmRleCwKKwkJCSAgIHU2NCAqc2l6ZSwgdW5zaWduZWQgaW50ICpmbGFncyk7CitleHRlcm4gdTMyICpvZl9nZXRfcGNpX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBiYXJfbm8sCisJCQkgICAgICAgdTY0ICpzaXplLCB1bnNpZ25lZCBpbnQgKmZsYWdzKTsKKworLyogR2V0IGFuIGFkZHJlc3MgYXMgYSByZXNvdXJjZS4gTm90ZSB0aGF0IGlmIHlvdXIgYWRkcmVzcyBpcworICogYSBQSU8gYWRkcmVzcywgdGhlIGNvbnZlcnNpb24gd2lsbCBmYWlsIGlmIHRoZSBwaHlzaWNhbCBhZGRyZXNzCisgKiBjYW4ndCBiZSBpbnRlcm5hbGx5IGNvbnZlcnRlZCB0byBhbiBJTyB0b2tlbiB3aXRoCisgKiBwY2lfYWRkcmVzc190b19waW8oKSwgdGhhdCBpcyBiZWNhdXNlIGl0J3MgZWl0aGVyIGNhbGxlZCB0byBlYXJseQorICogb3IgaXQgY2FuJ3QgYmUgbWF0Y2hlZCB0byBhbnkgaG9zdCBicmlkZ2UgSU8gc3BhY2UKKyAqLworZXh0ZXJuIGludCBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgaW5kZXgsCisJCQkJICBzdHJ1Y3QgcmVzb3VyY2UgKnIpOworZXh0ZXJuIGludCBvZl9wY2lfYWRkcmVzc190b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGJhciwKKwkJCQkgICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnIpOworCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9QT1dFUlBDX1BST01fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHRyYWNlLmgKaW5kZXggMWY3ZWNkYi4uOWM1NTBiMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3B0cmFjZS5oCkBAIC04Nyw3ICs4Nyw3IEBACiAKICNkZWZpbmUgZm9yY2Vfc3VjY2Vzc2Z1bF9zeXNjYWxsX3JldHVybigpICAgXAogCWRvIHsgXAotCQljdXJyZW50X3RocmVhZF9pbmZvKCktPnN5c2NhbGxfbm9lcnJvciA9IDE7IFwKKwkJc2V0X3RocmVhZF9mbGFnKFRJRl9OT0VSUk9SKTsgXAogCX0gd2hpbGUoMCkKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcmVnLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3JlZy5oCmluZGV4IGViMzkyZDAuLjEyZWNjOWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcmVnLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9yZWcuaApAQCAtMTQ1LDYgKzE0NSwxMCBAQAogI2RlZmluZSBTUFJOX0NUUgkweDAwOQkvKiBDb3VudCBSZWdpc3RlciAqLwogI2RlZmluZSBTUFJOX0NUUkxGCTB4MDg4CiAjZGVmaW5lIFNQUk5fQ1RSTFQJMHgwOTgKKyNkZWZpbmUgICBDVFJMX0NUCTB4YzAwMDAwMDAJLyogY3VycmVudCB0aHJlYWQgKi8KKyNkZWZpbmUgICBDVFJMX0NUMAkweDgwMDAwMDAwCS8qIHRocmVhZCAwICovCisjZGVmaW5lICAgQ1RSTF9DVDEJMHg0MDAwMDAwMAkvKiB0aHJlYWQgMSAqLworI2RlZmluZSAgIENUUkxfVEUJMHgwMGMwMDAwMAkvKiB0aHJlYWQgZW5hYmxlICovCiAjZGVmaW5lICAgQ1RSTF9SVU5MQVRDSAkweDEKICNkZWZpbmUgU1BSTl9EQUJSCTB4M0Y1CS8qIERhdGEgQWRkcmVzcyBCcmVha3BvaW50IFJlZ2lzdGVyICovCiAjZGVmaW5lICAgREFCUl9UUkFOU0xBVElPTgkoMVVMIDw8IDIpCkBAIC0yNTcsMTEgKzI2MSwxMSBAQAogI2RlZmluZQlTUFJOX0hJRDYJMHgzRjkJLyogQkUgSElEIDYgKi8KICNkZWZpbmUJICBISUQ2X0xCCSgweDBGPDwxMikgLyogQ29uY3VycmVudCBMYXJnZSBQYWdlIE1vZGVzICovCiAjZGVmaW5lCSAgSElENl9ETFAJKDE8PDIwKQkvKiBEaXNhYmxlIGFsbCBsYXJnZSBwYWdlIG1vZGVzICg0SyBvbmx5KSAqLwotI2RlZmluZQlTUFJOX1RTQ1IJMHgzOTkgICAvKiBUaHJlYWQgc3dpdGNoIGNvbnRyb2wgb24gQkUgKi8KLSNkZWZpbmUJU1BSTl9UVFIJMHgzOUEgICAvKiBUaHJlYWQgc3dpdGNoIHRpbWVvdXQgb24gQkUgKi8KLSNkZWZpbmUJICBUU0NSX0RFQ19FTkFCTEUJMHgyMDAwMDAgLyogRGVjcmVtZW50ZXIgSW50ZXJydXB0ICovCi0jZGVmaW5lCSAgVFNDUl9FRV9FTkFCTEUJMHgxMDAwMDAgLyogRXh0ZXJuYWwgSW50ZXJydXB0ICovCi0jZGVmaW5lCSAgVFNDUl9FRV9CT09TVAkJMHgwODAwMDAgLyogRXh0ZXJuYWwgSW50ZXJydXB0IEJvb3N0ICovCisjZGVmaW5lCVNQUk5fVFNDX0NFTEwJMHgzOTkJLyogVGhyZWFkIHN3aXRjaCBjb250cm9sIG9uIENlbGwgKi8KKyNkZWZpbmUJICBUU0NfQ0VMTF9ERUNfRU5BQkxFXzAJMHg0MDAwMDAgLyogRGVjcmVtZW50ZXIgSW50ZXJydXB0ICovCisjZGVmaW5lCSAgVFNDX0NFTExfREVDX0VOQUJMRV8xCTB4MjAwMDAwIC8qIERlY3JlbWVudGVyIEludGVycnVwdCAqLworI2RlZmluZQkgIFRTQ19DRUxMX0VFX0VOQUJMRQkweDEwMDAwMCAvKiBFeHRlcm5hbCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJICBUU0NfQ0VMTF9FRV9CT09TVAkweDA4MDAwMCAvKiBFeHRlcm5hbCBJbnRlcnJ1cHQgQm9vc3QgKi8KICNkZWZpbmUJU1BSTl9UU0MgCTB4M0ZECS8qIFRocmVhZCBzd2l0Y2ggY29udHJvbCBvbiBvdGhlcnMgKi8KICNkZWZpbmUJU1BSTl9UU1QgCTB4M0ZDCS8qIFRocmVhZCBzd2l0Y2ggdGltZW91dCBvbiBvdGhlcnMgKi8KICNpZiAhZGVmaW5lZChTUFJOX0lBQzEpICYmICFkZWZpbmVkKFNQUk5fSUFDMikKQEAgLTM3NSw2ICszNzksMTQgQEAKICNkZWZpbmUgU1BSTl9TUFJHNwkweDExNwkvKiBTcGVjaWFsIFB1cnBvc2UgUmVnaXN0ZXIgR2VuZXJhbCA3ICovCiAjZGVmaW5lIFNQUk5fU1JSMAkweDAxQQkvKiBTYXZlL1Jlc3RvcmUgUmVnaXN0ZXIgMCAqLwogI2RlZmluZSBTUFJOX1NSUjEJMHgwMUIJLyogU2F2ZS9SZXN0b3JlIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgICBTUlIxX1dBS0VNQVNLCQkweDAwMzgwMDAwIC8qIHJlYXNvbiBmb3Igd2FrZXVwICovCisjZGVmaW5lICAgU1JSMV9XQUtFUkVTRVQJMHgwMDM4MDAwMCAvKiBTeXN0ZW0gcmVzZXQgKi8KKyNkZWZpbmUgICBTUlIxX1dBS0VTWVNFUlIJMHgwMDMwMDAwMCAvKiBTeXN0ZW0gZXJyb3IgKi8KKyNkZWZpbmUgICBTUlIxX1dBS0VFRQkJMHgwMDIwMDAwMCAvKiBFeHRlcm5hbCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICBTUlIxX1dBS0VNVAkJMHgwMDI4MDAwMCAvKiBtdGN0cmwgKi8KKyNkZWZpbmUgICBTUlIxX1dBS0VERUMJCTB4MDAxODAwMDAgLyogRGVjcmVtZW50ZXIgaW50ZXJydXB0ICovCisjZGVmaW5lICAgU1JSMV9XQUtFVEhFUk0JMHgwMDEwMDAwMCAvKiBUaGVybWFsIG1hbmFnZW1lbnQgaW50ZXJydXB0ICovCisKICNpZm5kZWYgU1BSTl9TVlIKICNkZWZpbmUgU1BSTl9TVlIJMHgxMUUJLyogU3lzdGVtIFZlcnNpb24gUmVnaXN0ZXIgKi8KICNlbmRpZgpAQCAtNDQzLDEyICs0NTUsMzUgQEAKICNkZWZpbmUgU1BSTl9TREFSCTc4MQogCiAjZWxzZSAvKiAzMi1iaXQgKi8KLSNkZWZpbmUgU1BSTl9NTUNSMAkweDNCOAkvKiBNb25pdG9yIE1vZGUgQ29udHJvbCBSZWdpc3RlciAwICovCi0jZGVmaW5lIFNQUk5fTU1DUjEJMHgzQkMJLyogTW9uaXRvciBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgMSAqLwotI2RlZmluZSBTUFJOX1BNQzEJMHgzQjkJLyogUGVyZm9ybWFuY2UgQ291bnRlciBSZWdpc3RlciAxICovCi0jZGVmaW5lIFNQUk5fUE1DMgkweDNCQQkvKiBQZXJmb3JtYW5jZSBDb3VudGVyIFJlZ2lzdGVyIDIgKi8KLSNkZWZpbmUgU1BSTl9QTUMzCTB4M0JECS8qIFBlcmZvcm1hbmNlIENvdW50ZXIgUmVnaXN0ZXIgMyAqLwotI2RlZmluZSBTUFJOX1BNQzQJMHgzQkUJLyogUGVyZm9ybWFuY2UgQ291bnRlciBSZWdpc3RlciA0ICovCisjZGVmaW5lIFNQUk5fTU1DUjAJOTUyCS8qIE1vbml0b3IgTW9kZSBDb250cm9sIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgICBNTUNSMF9GQwkweDgwMDAwMDAwVUwgLyogZnJlZXplIGNvdW50ZXJzICovCisjZGVmaW5lICAgTU1DUjBfRkNTCTB4NDAwMDAwMDBVTCAvKiBmcmVlemUgaW4gc3VwZXJ2aXNvciBzdGF0ZSAqLworI2RlZmluZSAgIE1NQ1IwX0ZDUAkweDIwMDAwMDAwVUwgLyogZnJlZXplIGluIHByb2JsZW0gc3RhdGUgKi8KKyNkZWZpbmUgICBNTUNSMF9GQ00xCTB4MTAwMDAwMDBVTCAvKiBmcmVlemUgY291bnRlcnMgd2hpbGUgTVNSIG1hcmsgPSAxICovCisjZGVmaW5lICAgTU1DUjBfRkNNMAkweDA4MDAwMDAwVUwgLyogZnJlZXplIGNvdW50ZXJzIHdoaWxlIE1TUiBtYXJrID0gMCAqLworI2RlZmluZSAgIE1NQ1IwX1BNWEUJMHgwNDAwMDAwMFVMIC8qIHBlcmZvcm1hbmNlIG1vbml0b3IgZXhjZXB0aW9uIGVuYWJsZSAqLworI2RlZmluZSAgIE1NQ1IwX0ZDRUNFCTB4MDIwMDAwMDBVTCAvKiBmcmVlemUgY3RycyBvbiBlbmFibGVkIGNvbmQgb3IgZXZlbnQgKi8KKyNkZWZpbmUgICBNTUNSMF9UQkVFCTB4MDA0MDAwMDBVTCAvKiB0aW1lIGJhc2UgZXhjZXB0aW9uIGVuYWJsZSAqLworI2RlZmluZSAgIE1NQ1IwX1BNQzFDRQkweDAwMDA4MDAwVUwgLyogUE1DMSBjb3VudCBlbmFibGUqLworI2RlZmluZSAgIE1NQ1IwX1BNQ25DRQkweDAwMDA0MDAwVUwgLyogY291bnQgZW5hYmxlIGZvciBhbGwgYnV0IFBNQyAxKi8KKyNkZWZpbmUgICBNTUNSMF9UUklHR0VSCTB4MDAwMDIwMDBVTCAvKiBUUklHR0VSIGVuYWJsZSAqLworI2RlZmluZSAgIE1NQ1IwX1BNQzFTRUwJMHgwMDAwMWZjMFVMIC8qIFBNQyAxIEV2ZW50ICovCisjZGVmaW5lICAgTU1DUjBfUE1DMlNFTAkweDAwMDAwMDNmVUwgLyogUE1DIDIgRXZlbnQgKi8KKworI2RlZmluZSBTUFJOX01NQ1IxCTk1NgorI2RlZmluZSAgIE1NQ1IxX1BNQzNTRUwJMHhmODAwMDAwMFVMIC8qIFBNQyAzIEV2ZW50ICovCisjZGVmaW5lICAgTU1DUjFfUE1DNFNFTAkweDA3YzAwMDAwVUwgLyogUE1DIDQgRXZlbnQgKi8KKyNkZWZpbmUgICBNTUNSMV9QTUM1U0VMCTB4MDAzZTAwMDBVTCAvKiBQTUMgNSBFdmVudCAqLworI2RlZmluZSAgIE1NQ1IxX1BNQzZTRUwgMHgwMDAxZjgwMFVMIC8qIFBNQyA2IEV2ZW50ICovCisjZGVmaW5lIFNQUk5fTU1DUjIJOTQ0CisjZGVmaW5lIFNQUk5fUE1DMQk5NTMJLyogUGVyZm9ybWFuY2UgQ291bnRlciBSZWdpc3RlciAxICovCisjZGVmaW5lIFNQUk5fUE1DMgk5NTQJLyogUGVyZm9ybWFuY2UgQ291bnRlciBSZWdpc3RlciAyICovCisjZGVmaW5lIFNQUk5fUE1DMwk5NTcJLyogUGVyZm9ybWFuY2UgQ291bnRlciBSZWdpc3RlciAzICovCisjZGVmaW5lIFNQUk5fUE1DNAk5NTgJLyogUGVyZm9ybWFuY2UgQ291bnRlciBSZWdpc3RlciA0ICovCisjZGVmaW5lIFNQUk5fUE1DNQk5NDUJLyogUGVyZm9ybWFuY2UgQ291bnRlciBSZWdpc3RlciA1ICovCisjZGVmaW5lIFNQUk5fUE1DNgk5NDYJLyogUGVyZm9ybWFuY2UgQ291bnRlciBSZWdpc3RlciA2ICovCisKKyNkZWZpbmUgU1BSTl9TSUFSCTk1NQkvKiBTYW1wbGVkIEluc3RydWN0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgKi8KIAogLyogQml0IGRlZmluaXRpb25zIGZvciBNTUNSMCBhbmQgUE1DMSAvIFBNQzIuICovCiAjZGVmaW5lIE1NQ1IwX1BNQzFfQ1lDTEVTCSgxIDw8IDcpCkBAIC00NTgsNyArNDkzLDYgQEAKICNkZWZpbmUgTU1DUjBfUE1DMl9DWUNMRVMJMHgxCiAjZGVmaW5lIE1NQ1IwX1BNQzJfSVRMQgkJMHg3CiAjZGVmaW5lIE1NQ1IwX1BNQzJfTE9BRE1JU1NUSU1FCTB4NQotI2RlZmluZSBNTUNSMF9QTVhFCSgxIDw8IDI2KQogI2VuZGlmCiAKIC8qIFByb2Nlc3NvciBWZXJzaW9uIFJlZ2lzdGVyIChQVlIpIGZpZWxkIGV4dHJhY3Rpb24gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcnRhcy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9ydGFzLmgKaW5kZXggZDFiYjYxMS4uZjQzYzY4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9ydGFzLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9ydGFzLmgKQEAgLTEsNSArMSw2IEBACiAjaWZuZGVmIF9QT1dFUlBDX1JUQVNfSAogI2RlZmluZSBfUE9XRVJQQ19SVEFTX0gKKyNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CkBAIC0xNjAsNyArMTYxLDYgQEAKIGV4dGVybiB2b2lkIGVudGVyX3J0YXModW5zaWduZWQgbG9uZyk7CiBleHRlcm4gaW50IHJ0YXNfdG9rZW4oY29uc3QgY2hhciAqc2VydmljZSk7CiBleHRlcm4gaW50IHJ0YXNfY2FsbChpbnQgdG9rZW4sIGludCwgaW50LCBpbnQgKiwgLi4uKTsKLWV4dGVybiB2b2lkIGNhbGxfcnRhc19kaXNwbGF5X3N0YXR1cyh1bnNpZ25lZCBjaGFyKTsKIGV4dGVybiB2b2lkIHJ0YXNfcmVzdGFydChjaGFyICpjbWQpOwogZXh0ZXJuIHZvaWQgcnRhc19wb3dlcl9vZmYodm9pZCk7CiBleHRlcm4gdm9pZCBydGFzX2hhbHQodm9pZCk7CkBAIC0yMjksNCArMjI5LDUgQEAKIAogI2RlZmluZSBHTE9CQUxfSU5URVJSVVBUX1FVRVVFIDkwMDUKIAorI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfUE9XRVJQQ19SVEFTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc2VjY29tcC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zZWNjb21wLmgKaW5kZXggMWUxY2ZlMS4uODUzNzY1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zZWNjb21wLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zZWNjb21wLmgKQEAgLTEsNiArMSwxMCBAQAogI2lmbmRlZiBfQVNNX1BPV0VSUENfU0VDQ09NUF9ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19TRUNDT01QX0gKIAorI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgorI2VuZGlmCisKICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KIAogI2RlZmluZSBfX05SX3NlY2NvbXBfcmVhZCBfX05SX3JlYWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc2VjdGlvbnMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc2VjdGlvbnMuaAppbmRleCA0N2JlMmFjLi45MTYwMThlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3NlY3Rpb25zLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zZWN0aW9ucy5oCkBAIC0xLDUgKzEsNiBAQAogI2lmbmRlZiBfQVNNX1BPV0VSUENfU0VDVElPTlNfSAogI2RlZmluZSBfQVNNX1BPV0VSUENfU0VDVElPTlNfSAorI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NlY3Rpb25zLmg+CiAKQEAgLTE3LDQgKzE4LDUgQEAKIAogI2VuZGlmCiAKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYJLyogX0FTTV9QT1dFUlBDX1NFQ1RJT05TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc2VyaWFsLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NlcmlhbC5oCmluZGV4IGIyNzNkNjMuLjNlODU4OWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc2VyaWFsLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zZXJpYWwuaApAQCAtMTUsNCArMTUsMTAgQEAKIC8qIERlZmF1bHQgYmF1ZCBiYXNlIGlmIG5vdCBmb3VuZCBpbiBkZXZpY2UtdHJlZSAqLwogI2RlZmluZSBCQVNFX0JBVUQgKCAxODQzMjAwIC8gMTYgKQogCisjaWZkZWYgQ09ORklHX1BQQ19VREJHXzE2NTUwCitleHRlcm4gdm9pZCBmaW5kX2xlZ2FjeV9zZXJpYWxfcG9ydHModm9pZCk7CisjZWxzZQorI2RlZmluZSBmaW5kX2xlZ2FjeV9zZXJpYWxfcG9ydHMoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKwogI2VuZGlmIC8qIF9QUEM2NF9TRVJJQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zaWduYWwuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc2lnbmFsLmgKaW5kZXggNjk0YzhkMi4uYTRkOGY4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zaWduYWwuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NpZ25hbC5oCkBAIC0yLDEwICsyLDEzIEBACiAjZGVmaW5lIF9BU01fUE9XRVJQQ19TSUdOQUxfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIAogI2RlZmluZSBfTlNJRwkJNjQKLSNkZWZpbmUgX05TSUdfQlBXCUJJVFNfUEVSX0xPTkcKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCisjZGVmaW5lIF9OU0lHX0JQVwk2NAorI2Vsc2UKKyNkZWZpbmUgX05TSUdfQlBXCTMyCisjZW5kaWYKICNkZWZpbmUgX05TSUdfV09SRFMJKF9OU0lHIC8gX05TSUdfQlBXKQogCiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgb2xkX3NpZ3NldF90OwkJLyogYXQgbGVhc3QgMzIgYml0cyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zbXUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc211LmgKaW5kZXggNzZjMjlhOS4uODJjZTQ3NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zbXUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NtdS5oCkBAIC00LDkgKzQsMTEgQEAKIC8qCiAgKiBEZWZpbml0aW9ucyBmb3IgdGFsa2luZyB0byB0aGUgU01VIGNoaXAgaW4gbmV3ZXIgRzUgUG93ZXJNYWNzCiAgKi8KLQorI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAvKgogICogS25vd24gU01VIGNvbW1hbmRzCkBAIC0yMCw3ICsyMiw3IEBACiAvKgogICogUGFydGl0aW9uIGluZm8gY29tbWFuZHMKICAqCi0gKiBUaGVzZSBjb21tYW5kcyBhcmUgdXNlZCB0byByZXRyZWl2ZSB0aGUgc2RiLXBhcnRpdGlvbi1YWCBkYXRhcyBmcm9tCisgKiBUaGVzZSBjb21tYW5kcyBhcmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgc2RiLXBhcnRpdGlvbi1YWCBkYXRhcyBmcm9tCiAgKiB0aGUgU01VLiBUaGUgbGVuZ2h0IGlzIGFsd2F5cyAyLiBGaXJzdCBieXRlIGlzIHRoZSBzdWJjb21tYW5kIGNvZGUKICAqIGFuZCBzZWNvbmQgYnl0ZSBpcyB0aGUgcGFydGl0aW9uIElELgogICoKQEAgLTIyMyw3ICsyMjUsNyBAQAogICoKICAqIFNNVV9DTURfTUlTQ19lZV9HRVRfREFUQUJMT0NLX1JFQyBpcyB1c2VkLCBhbW9uZyBvdGhlcnMsIHRvCiAgKiB0cmFuc2ZlciBibG9ja3Mgb2YgZGF0YSBmcm9tIHRoZSBTTVUuIFNvIGZhciwgSSd2ZSBkZWNyeXB0ZWQgaXQncwotICogdXNhZ2UgdG8gcmV0cmVpdmUgcGFydGl0aW9uIGRhdGEuIEluIG9yZGVyIHRvIGRvIHRoYXQsIHlvdSBoYXZlIHRvCisgKiB1c2FnZSB0byByZXRyaWV2ZSBwYXJ0aXRpb24gZGF0YS4gSW4gb3JkZXIgdG8gZG8gdGhhdCwgeW91IGhhdmUgdG8KICAqIGJyZWFrIHlvdXIgdHJhbnNmZXIgaW4gImNodW5rcyIgc2luY2UgdGhhdCBjb21tYW5kIGNhbm5vdCB0cmFuc2ZlcgogICogbW9yZSB0aGFuIGEgY2h1bmsgYXQgYSB0aW1lLiBUaGUgY2h1bmsgc2l6ZSB1c2VkIGJ5IE9GIGlzIDB4ZSBieXRlcywKICAqIGJ1dCBpdCBzZWVtcyB0aGF0IHRoZSBkYXJ3aW4gZHJpdmVyIHdpbGwgbGV0IHlvdSBkbyAweDFlIGJ5dGVzIGlmCkBAIC0zNTYsNiArMzU4LDkgQEAKICAqIEtlbnJlbCBhc3luY2hyb25vdXMgaTJjIGludGVyZmFjZQogICovCiAKKyNkZWZpbmUgU01VX0kyQ19SRUFEX01BWAkweDFkCisjZGVmaW5lIFNNVV9JMkNfV1JJVEVfTUFYCTB4MTUKKwogLyogU01VIGkyYyBoZWFkZXIsIGV4YWN0bHkgbWF0Y2hlcyBpMmMgaGVhZGVyIG9uIHdpcmUgKi8KIHN0cnVjdCBzbXVfaTJjX3BhcmFtCiB7CkBAIC0zNjYsMTIgKzM3MSw5IEBACiAJdTgJc3ViYWRkclszXTsJLyogc3ViYWRkcmVzcyAqLwogCXU4CWNhZGRyOwkJLyogY29tYmluZWQgYWRkcmVzcywgZmlsbGVkIGJ5IFNNVSBkcml2ZXIgKi8KIAl1OAlkYXRhbGVuOwkvKiBsZW5ndGggb2YgdHJhbnNmZXIgKi8KLQl1OAlkYXRhWzddOwkvKiBkYXRhICovCisJdTgJZGF0YVtTTVVfSTJDX1JFQURfTUFYXTsJLyogZGF0YSAqLwogfTsKIAotI2RlZmluZSBTTVVfSTJDX1JFQURfTUFYCTB4MGQKLSNkZWZpbmUgU01VX0kyQ19XUklURV9NQVgJMHgwNQotCiBzdHJ1Y3Qgc211X2kyY19jbWQKIHsKIAkvKiBwdWJsaWMgKi8KQEAgLTM4NSw3ICszODcsNyBAQAogCWludAkJCXJlYWQ7CiAJaW50CQkJc3RhZ2U7CiAJaW50CQkJcmV0cmllczsKLQl1OAkJCXBkYXRhWzB4MTBdOworCXU4CQkJcGRhdGFbMzJdOwogCXN0cnVjdCBsaXN0X2hlYWQJbGluazsKIH07CiAKQEAgLTQ4Nyw4ICs0ODksOCBAQAogI2RlZmluZSBTTVVfU0RCX1NFTlNPUlRSRUVfSUQJCTB4MjUKIAogc3RydWN0IHNtdV9zZGJwX3NlbnNvcnRyZWUgewotCXU4CW1vZGVsX2lkOwotCXU4CXVua25vd25bM107CisJX191OAltb2RlbF9pZDsKKwlfX3U4CXVua25vd25bM107CiB9OwogCiAvKiBUaGlzIHBhcnRpdGlvbiBjb250YWlucyBDUFUgdGhlcm1hbCBjb250cm9sIFBJRCBpbmZvcm1hdGlvbnMuIFNvIGZhcgpAQCAtNDk4LDEzICs1MDAsMTMgQEAKICNkZWZpbmUgU01VX1NEQl9DUFVQSUREQVRBX0lECQkweDE3CiAKIHN0cnVjdCBzbXVfc2RicF9jcHVwaWRkYXRhIHsKLQl1OAl1bmtub3duMTsKLQl1OAl0YXJnZXRfdGVtcF9kZWx0YTsKLQl1OAl1bmtub3duMjsKLQl1OAloaXN0b3J5X2xlbjsKLQlzMTYJcG93ZXJfYWRqOwotCXUxNgltYXhfcG93ZXI7Ci0JczMyCWdwLGdyLGdkOworCV9fdTgJdW5rbm93bjE7CisJX191OAl0YXJnZXRfdGVtcF9kZWx0YTsKKwlfX3U4CXVua25vd24yOworCV9fdTgJaGlzdG9yeV9sZW47CisJX19zMTYJcG93ZXJfYWRqOworCV9fdTE2CW1heF9wb3dlcjsKKwlfX3MzMglncCxncixnZDsKIH07CiAKIApAQCAtNTE3LDcgKzUxOSw3IEBACiAgKiBpZiBub3QgZm91bmQuIFRoZSBkYXRhIGZvcm1hdCBpcyBkZXNjcmliZWQgYmVsb3cKICAqLwogZXh0ZXJuIHN0cnVjdCBzbXVfc2RicF9oZWFkZXIgKnNtdV9nZXRfc2RiX3BhcnRpdGlvbihpbnQgaWQsCi0JCQkJCQkgICAgIHVuc2lnbmVkIGludCAqc2l6ZSk7CisJCQkJCXVuc2lnbmVkIGludCAqc2l6ZSk7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKQEAgLTU1NCw3ICs1NTYsNyBAQAogCV9fdTMyCQljbWR0eXBlOwogI2RlZmluZSBTTVVfQ01EVFlQRV9TTVUJCQkwCS8qIFNNVSBjb21tYW5kICovCiAjZGVmaW5lIFNNVV9DTURUWVBFX1dBTlRTX0VWRU5UUwkxCS8qIHN3aXRjaCBmZCB0byBldmVudHMgbW9kZSAqLwotI2RlZmluZSBTTVVfQ01EVFlQRV9HRVRfUEFSVElUSU9OCTIJLyogcmV0cmVpdmUgYW4gc2RiIHBhcnRpdGlvbiAqLworI2RlZmluZSBTTVVfQ01EVFlQRV9HRVRfUEFSVElUSU9OCTIJLyogcmV0cmlldmUgYW4gc2RiIHBhcnRpdGlvbiAqLwogCiAJX191OAkJY21kOwkJCS8qIFNNVSBjb21tYW5kIGJ5dGUgKi8KIAlfX3U4CQlwYWRbM107CQkJLyogcGFkZGluZyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zcGFyc2VtZW0uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3BhcnNlbWVtLmgKaW5kZXggYmExYjM0Zi4uMzhiMWVhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zcGFyc2VtZW0uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwYXJzZW1lbS5oCkBAIC0xLDUgKzEsNiBAQAogI2lmbmRlZiBfQVNNX1BPV0VSUENfU1BBUlNFTUVNX0gKICNkZWZpbmUgX0FTTV9QT1dFUlBDX1NQQVJTRU1FTV9IIDEKKyNpZmRlZiBfX0tFUk5FTF9fCiAKICNpZmRlZiBDT05GSUdfU1BBUlNFTUVNCiAvKgpAQCAtMTMsOCArMTQsMTcgQEAKIAogI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVRwogZXh0ZXJuIHZvaWQgY3JlYXRlX3NlY3Rpb25fbWFwcGluZyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CisjaWZkZWYgQ09ORklHX05VTUEKK2V4dGVybiBpbnQgaG90X2FkZF9zY25fdG9fbmlkKHVuc2lnbmVkIGxvbmcgc2NuX2FkZHIpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGhvdF9hZGRfc2NuX3RvX25pZCh1bnNpZ25lZCBsb25nIHNjbl9hZGRyKQoreworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19OVU1BICovCiAjZW5kaWYgLyogQ09ORklHX01FTU9SWV9IT1RQTFVHICovCiAKICNlbmRpZiAvKiBDT05GSUdfU1BBUlNFTUVNICovCiAKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX1NQQVJTRU1FTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwaW5sb2NrLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwaW5sb2NrLmgKaW5kZXggY2FhNGIxNC4uODk1Y2I2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zcGlubG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3BpbmxvY2suaApAQCAtMSw1ICsxLDYgQEAKICNpZm5kZWYgX19BU01fU1BJTkxPQ0tfSAogI2RlZmluZSBfX0FTTV9TUElOTE9DS19ICisjaWZkZWYgX19LRVJORUxfXwogCiAvKgogICogU2ltcGxlIHNwaW4gbG9jayBvcGVyYXRpb25zLiAgCkBAIC00NSw3ICs0Niw3IEBACiAKIAl0b2tlbiA9IExPQ0tfVE9LRU47CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0iMToJbHdhcngJCSUwLDAsJTIJCSMgX19zcGluX3RyeWxvY2tcblwKKyIxOglsd2FyeAkJJTAsMCwlMlxuXAogCWNtcHdpCQkwLCUwLDBcblwKIAlibmUtCQkyZlxuXAogCXN0d2N4LgkJJTEsMCwlMlxuXApAQCAtNzksNyArODAsNyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfUFBDX1NQTFBBUikgfHwgZGVmaW5lZChDT05GSUdfUFBDX0lTRVJJRVMpCiAvKiBXZSBvbmx5IHlpZWxkIHRvIHRoZSBoeXBlcnZpc29yIGlmIHdlIGFyZSBpbiBzaGFyZWQgcHJvY2Vzc29yIG1vZGUgKi8KLSNkZWZpbmUgU0hBUkVEX1BST0NFU1NPUiAoZ2V0X3BhY2EoKS0+bHBwYWNhLnNoYXJlZF9wcm9jKQorI2RlZmluZSBTSEFSRURfUFJPQ0VTU09SIChnZXRfbHBwYWNhKCktPnNoYXJlZF9wcm9jKQogZXh0ZXJuIHZvaWQgX19zcGluX3lpZWxkKHJhd19zcGlubG9ja190ICpsb2NrKTsKIGV4dGVybiB2b2lkIF9fcndfeWllbGQocmF3X3J3bG9ja190ICpsb2NrKTsKICNlbHNlIC8qIFNQTFBBUiB8fCBJU0VSSUVTICovCkBAIC0xMjMsOCArMTI0LDggQEAKIAogc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3Jhd19zcGluX3VubG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyhTWU5DX09OX1NNUCIJIyBfX3Jhd19zcGluX3VubG9jayIKLQkJCSAgICAgOiA6IDoibWVtb3J5Iik7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIiMgX19yYXdfc3Bpbl91bmxvY2tcblx0IgorCQkJCUxXU1lOQ19PTl9TTVA6IDogOiJtZW1vcnkiKTsKIAlsb2NrLT5zbG9jayA9IDA7CiB9CiAKQEAgLTE2Niw3ICsxNjcsNyBAQAogCWxvbmcgdG1wOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0iMToJbHdhcngJCSUwLDAsJTEJCSMgcmVhZF90cnlsb2NrXG4iCisiMToJbHdhcngJCSUwLDAsJTFcbiIKIAlfX0RPX1NJR05fRVhURU5ECiAiCWFkZGljLgkJJTAsJTAsMVxuXAogCWJsZS0JCTJmXG4iCkBAIC0xOTEsNyArMTkyLDcgQEAKIAogCXRva2VuID0gV1JMT0NLX1RPS0VOOwogCV9fYXNtX18gX192b2xhdGlsZV9fKAotIjE6CWx3YXJ4CQklMCwwLCUyCSMgd3JpdGVfdHJ5bG9ja1xuXAorIjE6CWx3YXJ4CQklMCwwLCUyXG5cCiAJY21wd2kJCTAsJTAsMFxuXAogCWJuZS0JCTJmXG4iCiAJUFBDNDA1X0VSUjc3KDAsJTEpCkBAIC0yNDgsOCArMjQ5LDkgQEAKIAlsb25nIHRtcDsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCSJlaWVpbwkJCQkjIHJlYWRfdW5sb2NrXG5cCi0xOglsd2FyeAkJJTAsMCwlMVxuXAorCSIjIHJlYWRfdW5sb2NrXG5cdCIKKwlMV1NZTkNfT05fU01QCisiMToJbHdhcngJCSUwLDAsJTFcblwKIAlhZGRpYwkJJTAsJTAsLTFcbiIKIAlQUEM0MDVfRVJSNzcoMCwlMSkKICIJc3R3Y3guCQklMCwwLCUxXG5cCkBAIC0yNjEsOSArMjYzLDEwIEBACiAKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgX19yYXdfd3JpdGVfdW5sb2NrKHJhd19yd2xvY2tfdCAqcncpCiB7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oU1lOQ19PTl9TTVAiCSMgd3JpdGVfdW5sb2NrIgotCQkJICAgICA6IDogOiJtZW1vcnkiKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiIyB3cml0ZV91bmxvY2tcblx0IgorCQkJCUxXU1lOQ19PTl9TTVA6IDogOiJtZW1vcnkiKTsKIAlydy0+bG9jayA9IDA7CiB9CiAKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX19BU01fU1BJTkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3B1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhiYWNmMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3B1LmgKQEAgLTAsMCArMSw2MDAgQEAKKy8qCisgKiBTUFUgY29yZSAvIGZpbGUgc3lzdGVtIGludGVyZmFjZSBhbmQgSFcgc3RydWN0dXJlcworICoKKyAqIChDKSBDb3B5cmlnaHQgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkggMjAwNQorICoKKyAqIEF1dGhvcjogQXJuZCBCZXJnbWFubiA8YXJuZGJAZGUuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX1NQVV9ICisjZGVmaW5lIF9TUFVfSAorI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2RlZmluZSBMU19TSVpFICgyNTYgKiAxMDI0KQorI2RlZmluZSBMU19BRERSX01BU0sgKExTX1NJWkUgLSAxKQorCisjZGVmaW5lIE1GQ19QVVRfQ01EICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgTUZDX1BVVFNfQ01EICAgICAgICAgICAgMHgyOAorI2RlZmluZSBNRkNfUFVUUl9DTUQgICAgICAgICAgICAweDMwCisjZGVmaW5lIE1GQ19QVVRGX0NNRCAgICAgICAgICAgIDB4MjIKKyNkZWZpbmUgTUZDX1BVVEJfQ01EICAgICAgICAgICAgMHgyMQorI2RlZmluZSBNRkNfUFVURlNfQ01EICAgICAgICAgICAweDJBCisjZGVmaW5lIE1GQ19QVVRCU19DTUQgICAgICAgICAgIDB4MjkKKyNkZWZpbmUgTUZDX1BVVFJGX0NNRCAgICAgICAgICAgMHgzMgorI2RlZmluZSBNRkNfUFVUUkJfQ01EICAgICAgICAgICAweDMxCisjZGVmaW5lIE1GQ19QVVRMX0NNRCAgICAgICAgICAgIDB4MjQKKyNkZWZpbmUgTUZDX1BVVFJMX0NNRCAgICAgICAgICAgMHgzNAorI2RlZmluZSBNRkNfUFVUTEZfQ01EICAgICAgICAgICAweDI2CisjZGVmaW5lIE1GQ19QVVRMQl9DTUQgICAgICAgICAgIDB4MjUKKyNkZWZpbmUgTUZDX1BVVFJMRl9DTUQgICAgICAgICAgMHgzNgorI2RlZmluZSBNRkNfUFVUUkxCX0NNRCAgICAgICAgICAweDM1CisKKyNkZWZpbmUgTUZDX0dFVF9DTUQgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBNRkNfR0VUU19DTUQgICAgICAgICAgICAweDQ4CisjZGVmaW5lIE1GQ19HRVRGX0NNRCAgICAgICAgICAgIDB4NDIKKyNkZWZpbmUgTUZDX0dFVEJfQ01EICAgICAgICAgICAgMHg0MQorI2RlZmluZSBNRkNfR0VURlNfQ01EICAgICAgICAgICAweDRBCisjZGVmaW5lIE1GQ19HRVRCU19DTUQgICAgICAgICAgIDB4NDkKKyNkZWZpbmUgTUZDX0dFVExfQ01EICAgICAgICAgICAgMHg0NAorI2RlZmluZSBNRkNfR0VUTEZfQ01EICAgICAgICAgICAweDQ2CisjZGVmaW5lIE1GQ19HRVRMQl9DTUQgICAgICAgICAgIDB4NDUKKworI2RlZmluZSBNRkNfU0RDUlRfQ01EICAgICAgICAgICAweDgwCisjZGVmaW5lIE1GQ19TRENSVFNUX0NNRCAgICAgICAgIDB4ODEKKyNkZWZpbmUgTUZDX1NEQ1JaX0NNRCAgICAgICAgICAgMHg4OQorI2RlZmluZSBNRkNfU0RDUlNfQ01EICAgICAgICAgICAweDhECisjZGVmaW5lIE1GQ19TRENSRl9DTUQgICAgICAgICAgIDB4OEYKKworI2RlZmluZSBNRkNfR0VUTExBUl9DTUQgICAgICAgICAweEQwCisjZGVmaW5lIE1GQ19QVVRMTENfQ01EICAgICAgICAgIDB4QjQKKyNkZWZpbmUgTUZDX1BVVExMVUNfQ01EICAgICAgICAgMHhCMAorI2RlZmluZSBNRkNfUFVUUUxMVUNfQ01EICAgICAgICAweEI4CisjZGVmaW5lIE1GQ19TTkRTSUdfQ01EICAgICAgICAgIDB4QTAKKyNkZWZpbmUgTUZDX1NORFNJR0JfQ01EICAgICAgICAgMHhBMQorI2RlZmluZSBNRkNfU05EU0lHRl9DTUQgICAgICAgICAweEEyCisjZGVmaW5lIE1GQ19CQVJSSUVSX0NNRCAgICAgICAgIDB4QzAKKyNkZWZpbmUgTUZDX0VJRUlPX0NNRCAgICAgICAgICAgMHhDOAorI2RlZmluZSBNRkNfU1lOQ19DTUQgICAgICAgICAgICAweENDCisKKyNkZWZpbmUgTUZDX01JTl9ETUFfU0laRV9TSElGVCAgNCAgICAgICAvKiAxNiBieXRlcyAqLworI2RlZmluZSBNRkNfTUFYX0RNQV9TSVpFX1NISUZUICAxNCAgICAgIC8qIDE2Mzg0IGJ5dGVzICovCisjZGVmaW5lIE1GQ19NSU5fRE1BX1NJWkUgICAgICAgICgxIDw8IE1GQ19NSU5fRE1BX1NJWkVfU0hJRlQpCisjZGVmaW5lIE1GQ19NQVhfRE1BX1NJWkUgICAgICAgICgxIDw8IE1GQ19NQVhfRE1BX1NJWkVfU0hJRlQpCisjZGVmaW5lIE1GQ19NSU5fRE1BX1NJWkVfTUFTSyAgIChNRkNfTUlOX0RNQV9TSVpFIC0gMSkKKyNkZWZpbmUgTUZDX01BWF9ETUFfU0laRV9NQVNLICAgKE1GQ19NQVhfRE1BX1NJWkUgLSAxKQorI2RlZmluZSBNRkNfTUlOX0RNQV9MSVNUX1NJWkUgICAweDAwMDggIC8qICAgOCBieXRlcyAqLworI2RlZmluZSBNRkNfTUFYX0RNQV9MSVNUX1NJWkUgICAweDQwMDAgIC8qIDE2SyBieXRlcyAqLworCisjZGVmaW5lIE1GQ19UQUdJRF9UT19UQUdNQVNLKHRhZ19pZCkgICgxIDw8ICh0YWdfaWQgJiAweDFGKSkKKworLyogRXZlbnRzIGZvciBDaGFubmVscyAwLTIgKi8KKyNkZWZpbmUgTUZDX0RNQV9UQUdfU1RBVFVTX1VQREFURV9FVkVOVCAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBNRkNfRE1BX1RBR19DTURfU1RBTExfTk9USUZZX0VWRU5UICAweDAwMDAwMDAyCisjZGVmaW5lIE1GQ19ETUFfUVVFVUVfQVZBSUxBQkxFX0VWRU5UICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgTUZDX1NQVV9NQUlMQk9YX1dSSVRURU5fRVZFTlQgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBNRkNfREVDUkVNRU5URVJfRVZFTlQgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIE1GQ19QVV9JTlRfTUFJTEJPWF9BVkFJTEFCTEVfRVZFTlQgIDB4MDAwMDAwNDAKKyNkZWZpbmUgTUZDX1BVX01BSUxCT1hfQVZBSUxBQkxFX0VWRU5UICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBNRkNfU0lHTkFMXzJfRVZFTlQgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIE1GQ19TSUdOQUxfMV9FVkVOVCAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgTUZDX0xMUl9MT1NUX0VWRU5UICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBNRkNfUFJJVl9BVFROX0VWRU5UICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIE1GQ19NVUxUSV9TUkNfRVZFTlQgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKworLyogRmxhZ3MgaW5kaWNhdGluZyBwcm9ncmVzcyBkdXJpbmcgY29udGV4dCBzd2l0Y2guICovCisjZGVmaW5lIFNQVV9DT05URVhUX1NXSVRDSF9QRU5ESU5HCTBVTAorI2RlZmluZSBTUFVfQ09OVEVYVF9TV0lUQ0hfQUNUSVZFCTFVTAorCitzdHJ1Y3Qgc3B1X2NvbnRleHQ7CitzdHJ1Y3Qgc3B1X3J1bnF1ZXVlOworCitzdHJ1Y3Qgc3B1IHsKKwljaGFyICpuYW1lOworCXVuc2lnbmVkIGxvbmcgbG9jYWxfc3RvcmVfcGh5czsKKwl1OCAqbG9jYWxfc3RvcmU7CisJc3RydWN0IHNwdV9wcm9ibGVtIF9faW9tZW0gKnByb2JsZW07CisJc3RydWN0IHNwdV9wcml2MSBfX2lvbWVtICpwcml2MTsKKwlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHNjaGVkX2xpc3Q7CisJaW50IG51bWJlcjsKKwl1MzIgaXNyYzsKKwl1MzIgbm9kZTsKKwl1NjQgZmxhZ3M7CisJdTY0IGRhcjsKKwl1NjQgZHNpc3I7CisJc3RydWN0IGtyZWYga3JlZjsKKwlzaXplX3QgbHNfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgc2xiX3JlcGxhY2U7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHg7CisJc3RydWN0IHNwdV9ydW5xdWV1ZSAqcnE7CisJdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcDsKKwlwaWRfdCBwaWQ7CisJaW50IHByaW87CisJaW50IGNsYXNzXzBfcGVuZGluZzsKKwlzcGlubG9ja190IHJlZ2lzdGVyX2xvY2s7CisKKwl1MzIgc3RvcF9jb2RlOworCXZvaWQgKCogd2JveF9jYWxsYmFjaykoc3RydWN0IHNwdSAqc3B1KTsKKwl2b2lkICgqIGlib3hfY2FsbGJhY2spKHN0cnVjdCBzcHUgKnNwdSk7CisJdm9pZCAoKiBzdG9wX2NhbGxiYWNrKShzdHJ1Y3Qgc3B1ICpzcHUpOworCisJY2hhciBpcnFfYzBbOF07CisJY2hhciBpcnFfYzFbOF07CisJY2hhciBpcnFfYzJbOF07Cit9OworCitzdHJ1Y3Qgc3B1ICpzcHVfYWxsb2Modm9pZCk7Cit2b2lkIHNwdV9mcmVlKHN0cnVjdCBzcHUgKnNwdSk7CitpbnQgc3B1X2lycV9jbGFzc18wX2JvdHRvbShzdHJ1Y3Qgc3B1ICpzcHUpOworaW50IHNwdV9pcnFfY2xhc3NfMV9ib3R0b20oc3RydWN0IHNwdSAqc3B1KTsKK3ZvaWQgc3B1X2lycV9zZXRhZmZpbml0eShzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjcHUpOworCitleHRlcm4gc3RydWN0IHNwdWZzX2NhbGxzIHsKKwlhc21saW5rYWdlIGxvbmcgKCpjcmVhdGVfdGhyZWFkKShjb25zdCBjaGFyIF9fdXNlciAqbmFtZSwKKwkJCQkJdW5zaWduZWQgaW50IGZsYWdzLCBtb2RlX3QgbW9kZSk7CisJYXNtbGlua2FnZSBsb25nICgqc3B1X3J1bikoc3RydWN0IGZpbGUgKmZpbHAsIF9fdTMyIF9fdXNlciAqdW5wYywKKwkJCQkJCV9fdTMyIF9fdXNlciAqdXN0YXR1cyk7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7Cit9IHNwdWZzX2NhbGxzOworCisjaWZkZWYgQ09ORklHX1NQVV9GU19NT0RVTEUKK2ludCByZWdpc3Rlcl9zcHVfc3lzY2FsbHMoc3RydWN0IHNwdWZzX2NhbGxzICpjYWxscyk7Cit2b2lkIHVucmVnaXN0ZXJfc3B1X3N5c2NhbGxzKHN0cnVjdCBzcHVmc19jYWxscyAqY2FsbHMpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHJlZ2lzdGVyX3NwdV9zeXNjYWxscyhzdHJ1Y3Qgc3B1ZnNfY2FsbHMgKmNhbGxzKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIHVucmVnaXN0ZXJfc3B1X3N5c2NhbGxzKHN0cnVjdCBzcHVmc19jYWxscyAqY2FsbHMpCit7Cit9CisjZW5kaWYgLyogTU9EVUxFICovCisKKworLyogYWNjZXNzIHRvIHByaXYxIHJlZ2lzdGVycyAqLwordm9pZCBzcHVfaW50X21hc2tfYW5kKHN0cnVjdCBzcHUgKnNwdSwgaW50IGNsYXNzLCB1NjQgbWFzayk7Cit2b2lkIHNwdV9pbnRfbWFza19vcihzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjbGFzcywgdTY0IG1hc2spOwordm9pZCBzcHVfaW50X21hc2tfc2V0KHN0cnVjdCBzcHUgKnNwdSwgaW50IGNsYXNzLCB1NjQgbWFzayk7Cit1NjQgc3B1X2ludF9tYXNrX2dldChzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjbGFzcyk7Cit2b2lkIHNwdV9pbnRfc3RhdF9jbGVhcihzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjbGFzcywgdTY0IHN0YXQpOwordTY0IHNwdV9pbnRfc3RhdF9nZXQoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MpOwordm9pZCBzcHVfaW50X3JvdXRlX3NldChzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCByb3V0ZSk7Cit1NjQgc3B1X21mY19kYXJfZ2V0KHN0cnVjdCBzcHUgKnNwdSk7Cit1NjQgc3B1X21mY19kc2lzcl9nZXQoc3RydWN0IHNwdSAqc3B1KTsKK3ZvaWQgc3B1X21mY19kc2lzcl9zZXQoc3RydWN0IHNwdSAqc3B1LCB1NjQgZHNpc3IpOwordm9pZCBzcHVfbWZjX3Nkcl9zZXQoc3RydWN0IHNwdSAqc3B1LCB1NjQgc2RyKTsKK3ZvaWQgc3B1X21mY19zcjFfc2V0KHN0cnVjdCBzcHUgKnNwdSwgdTY0IHNyMSk7Cit1NjQgc3B1X21mY19zcjFfZ2V0KHN0cnVjdCBzcHUgKnNwdSk7Cit2b2lkIHNwdV9tZmNfdGNsYXNzX2lkX3NldChzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCB0Y2xhc3NfaWQpOwordTY0IHNwdV9tZmNfdGNsYXNzX2lkX2dldChzdHJ1Y3Qgc3B1ICpzcHUpOwordm9pZCBzcHVfdGxiX2ludmFsaWRhdGUoc3RydWN0IHNwdSAqc3B1KTsKK3ZvaWQgc3B1X3Jlc291cmNlX2FsbG9jYXRpb25fZ3JvdXBJRF9zZXQoc3RydWN0IHNwdSAqc3B1LCB1NjQgaWQpOwordTY0IHNwdV9yZXNvdXJjZV9hbGxvY2F0aW9uX2dyb3VwSURfZ2V0KHN0cnVjdCBzcHUgKnNwdSk7Cit2b2lkIHNwdV9yZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9zZXQoc3RydWN0IHNwdSAqc3B1LCB1NjQgZW5hYmxlKTsKK3U2NCBzcHVfcmVzb3VyY2VfYWxsb2NhdGlvbl9lbmFibGVfZ2V0KHN0cnVjdCBzcHUgKnNwdSk7CisKKworLyoKKyAqIFRoaXMgZGVmaW5lcyB0aGUgTG9jYWwgU3RvcmUsIFByb2JsZW0gQXJlYSBhbmQgUHJpdmxlZ2UgQXJlYSBvZiBhbiBTUFUuCisgKi8KKwordW5pb24gbWZjX3RhZ19zaXplX2NsYXNzX2NtZCB7CisJc3RydWN0IHsKKwkJdTE2IG1mY19zaXplOworCQl1MTYgbWZjX3RhZzsKKwkJdTggIHBhZDsKKwkJdTggIG1mY19yY2xhc3NpZDsKKwkJdTE2IG1mY19jbWQ7CisJfSB1OworCXN0cnVjdCB7CisJCXUzMiBtZmNfc2l6ZV90YWczMjsKKwkJdTMyIG1mY19jbGFzc19jbWQzMjsKKwl9IGJ5MzI7CisJdTY0IGFsbDY0OworfTsKKworc3RydWN0IG1mY19jcV9zciB7CisJdTY0IG1mY19jcV9kYXRhMF9SVzsKKwl1NjQgbWZjX2NxX2RhdGExX1JXOworCXU2NCBtZmNfY3FfZGF0YTJfUlc7CisJdTY0IG1mY19jcV9kYXRhM19SVzsKK307CisKK3N0cnVjdCBzcHVfcHJvYmxlbSB7CisjZGVmaW5lIE1TX1NZTkNfUEVORElORyAgICAgICAgIDFMCisJdTY0IHNwY19tc3N5bmNfUlc7CQkJCQkvKiAweDAwMDAgKi8KKwl1OCAgcGFkXzB4MDAwOF8weDMwMDBbMHgzMDAwIC0gMHgwMDA4XTsKKworCS8qIERNQSBBcmVhICovCisJdTggIHBhZF8weDMwMDBfMHgzMDA0WzB4NF07CQkJCS8qIDB4MzAwMCAqLworCXUzMiBtZmNfbHNhX1c7CQkJCQkJLyogMHgzMDA0ICovCisJdTY0IG1mY19lYV9XOwkJCQkJCS8qIDB4MzAwOCAqLworCXVuaW9uIG1mY190YWdfc2l6ZV9jbGFzc19jbWQgbWZjX3VuaW9uX1c7CQkJLyogMHgzMDEwICovCisJdTggIHBhZF8weDMwMThfMHgzMTA0WzB4ZWNdOwkJCQkvKiAweDMwMTggKi8KKwl1MzIgZG1hX3FzdGF0dXNfUjsJCQkJCS8qIDB4MzEwNCAqLworCXU4ICBwYWRfMHgzMTA4XzB4MzIwNFsweGZjXTsJCQkJLyogMHgzMTA4ICovCisJdTMyIGRtYV9xdWVyeXR5cGVfUlc7CQkJCQkvKiAweDMyMDQgKi8KKwl1OCAgcGFkXzB4MzIwOF8weDMyMWNbMHgxNF07CQkJCS8qIDB4MzIwOCAqLworCXUzMiBkbWFfcXVlcnltYXNrX1JXOwkJCQkJLyogMHgzMjFjICovCisJdTggIHBhZF8weDMyMjBfMHgzMjJjWzB4Y107CQkJCS8qIDB4MzIyMCAqLworCXUzMiBkbWFfdGFnc3RhdHVzX1I7CQkJCQkvKiAweDMyMmMgKi8KKyNkZWZpbmUgRE1BX1RBR1NUQVRVU19JTlRSX0FOWQkxdQorI2RlZmluZSBETUFfVEFHU1RBVFVTX0lOVFJfQUxMCTJ1CisJdTggIHBhZF8weDMyMzBfMHg0MDAwWzB4NDAwMCAtIDB4MzIzMF07IAkJLyogMHgzMjMwICovCisKKwkvKiBTUFUgQ29udHJvbCBBcmVhICovCisJdTggIHBhZF8weDQwMDBfMHg0MDA0WzB4NF07CQkJCS8qIDB4NDAwMCAqLworCXUzMiBwdV9tYl9SOwkJCQkJCS8qIDB4NDAwNCAqLworCXU4ICBwYWRfMHg0MDA4XzB4NDAwY1sweDRdOwkJCQkvKiAweDQwMDggKi8KKwl1MzIgc3B1X21iX1c7CQkJCQkJLyogMHg0MDBjICovCisJdTggIHBhZF8weDQwMTBfMHg0MDE0WzB4NF07CQkJCS8qIDB4NDAxMCAqLworCXUzMiBtYl9zdGF0X1I7CQkJCQkJLyogMHg0MDE0ICovCisJdTggIHBhZF8weDQwMThfMHg0MDFjWzB4NF07CQkJCS8qIDB4NDAxOCAqLworCXUzMiBzcHVfcnVuY250bF9SVzsJCQkJCS8qIDB4NDAxYyAqLworI2RlZmluZSBTUFVfUlVOQ05UTF9TVE9QCTBMCisjZGVmaW5lIFNQVV9SVU5DTlRMX1JVTk5BQkxFCTFMCisJdTggIHBhZF8weDQwMjBfMHg0MDI0WzB4NF07CQkJCS8qIDB4NDAyMCAqLworCXUzMiBzcHVfc3RhdHVzX1I7CQkJCQkvKiAweDQwMjQgKi8KKyNkZWZpbmUgU1BVX1NUT1BfU1RBVFVTX1NISUZUICAgICAgICAgICAxNgorI2RlZmluZSBTUFVfU1RBVFVTX1NUT1BQRUQJCTB4MAorI2RlZmluZSBTUFVfU1RBVFVTX1JVTk5JTkcJCTB4MQorI2RlZmluZSBTUFVfU1RBVFVTX1NUT1BQRURfQllfU1RPUAkweDIKKyNkZWZpbmUgU1BVX1NUQVRVU19TVE9QUEVEX0JZX0hBTFQJMHg0CisjZGVmaW5lIFNQVV9TVEFUVVNfV0FJVElOR19GT1JfQ0hBTk5FTAkweDgKKyNkZWZpbmUgU1BVX1NUQVRVU19TSU5HTEVfU1RFUAkJMHgxMAorI2RlZmluZSBTUFVfU1RBVFVTX0lOVkFMSURfSU5TVFIgICAgICAgIDB4MjAKKyNkZWZpbmUgU1BVX1NUQVRVU19JTlZBTElEX0NIICAgICAgICAgICAweDQwCisjZGVmaW5lIFNQVV9TVEFUVVNfSVNPTEFURURfU1RBVEUgICAgICAgMHg4MAorI2RlZmluZSBTUFVfU1RBVFVTX0lTT0xBVEVEX0xPQURfU1RBVVRVUyAweDIwMAorI2RlZmluZSBTUFVfU1RBVFVTX0lTT0xBVEVEX0VYSVRfU1RBVVRVUyAweDQwMAorCXU4ICBwYWRfMHg0MDI4XzB4NDAyY1sweDRdOwkJCQkvKiAweDQwMjggKi8KKwl1MzIgc3B1X3NwZV9SOwkJCQkJCS8qIDB4NDAyYyAqLworCXU4ICBwYWRfMHg0MDMwXzB4NDAzNFsweDRdOwkJCQkvKiAweDQwMzAgKi8KKwl1MzIgc3B1X25wY19SVzsJCQkJCQkvKiAweDQwMzQgKi8KKwl1OCAgcGFkXzB4NDAzOF8weDE0MDAwWzB4MTQwMDAgLSAweDQwMzhdOwkJLyogMHg0MDM4ICovCisKKwkvKiBTaWduYWwgTm90aWZpY2F0aW9uIEFyZWEgKi8KKwl1OCAgcGFkXzB4MTQwMDBfMHgxNDAwY1sweGNdOwkJCQkvKiAweDE0MDAwICovCisJdTMyIHNpZ25hbF9ub3RpZnkxOwkJCQkJLyogMHgxNDAwYyAqLworCXU4ICBwYWRfMHgxNDAxMF8weDFjMDBjWzB4N2ZmY107CQkJLyogMHgxNDAxMCAqLworCXUzMiBzaWduYWxfbm90aWZ5MjsJCQkJCS8qIDB4MWMwMGMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMHgyMDAwMCkpKTsKKworLyogU1BVIFByaXZpbGVnZSAyIFN0YXRlIEFyZWEgKi8KK3N0cnVjdCBzcHVfcHJpdjIgeworCS8qIE1GQyBSZWdpc3RlcnMgKi8KKwl1OCAgcGFkXzB4MDAwMF8weDExMDBbMHgxMTAwIC0gMHgwMDAwXTsgCQkvKiAweDAwMDAgKi8KKworCS8qIFNMQiBNYW5hZ2VtZW50IFJlZ2lzdGVycyAqLworCXU4ICBwYWRfMHgxMTAwXzB4MTEwOFsweDhdOwkJCQkvKiAweDExMDAgKi8KKwl1NjQgc2xiX2luZGV4X1c7CQkJCQkvKiAweDExMDggKi8KKyNkZWZpbmUgU0xCX0lOREVYX01BU0sJCQkJMHg3TAorCXU2NCBzbGJfZXNpZF9SVzsJCQkJCS8qIDB4MTExMCAqLworCXU2NCBzbGJfdnNpZF9SVzsJCQkJCS8qIDB4MTExOCAqLworI2RlZmluZSBTTEJfVlNJRF9TVVBFUlZJU09SX1NUQVRFCSgweDF1bGwgPDwgMTEpCisjZGVmaW5lIFNMQl9WU0lEX1NVUEVSVklTT1JfU1RBVEVfTUFTSwkoMHgxdWxsIDw8IDExKQorI2RlZmluZSBTTEJfVlNJRF9QUk9CTEVNX1NUQVRFCQkoMHgxdWxsIDw8IDEwKQorI2RlZmluZSBTTEJfVlNJRF9QUk9CTEVNX1NUQVRFX01BU0sJKDB4MXVsbCA8PCAxMCkKKyNkZWZpbmUgU0xCX1ZTSURfRVhFQ1VURV9TRUdNRU5UCSgweDF1bGwgPDwgOSkKKyNkZWZpbmUgU0xCX1ZTSURfTk9fRVhFQ1VURV9TRUdNRU5UCSgweDF1bGwgPDwgOSkKKyNkZWZpbmUgU0xCX1ZTSURfRVhFQ1VURV9TRUdNRU5UX01BU0sJKDB4MXVsbCA8PCA5KQorI2RlZmluZSBTTEJfVlNJRF80S19QQUdFCQkoMHgwIDw8IDgpCisjZGVmaW5lIFNMQl9WU0lEX0xBUkdFX1BBR0UJCSgweDF1bGwgPDwgOCkKKyNkZWZpbmUgU0xCX1ZTSURfUEFHRV9TSVpFX01BU0sJCSgweDF1bGwgPDwgOCkKKyNkZWZpbmUgU0xCX1ZTSURfQ0xBU1NfTUFTSwkJKDB4MXVsbCA8PCA3KQorI2RlZmluZSBTTEJfVlNJRF9WSVJUVUFMX1BBR0VfU0laRV9NQVNLCSgweDF1bGwgPDwgNikKKwl1NjQgc2xiX2ludmFsaWRhdGVfZW50cnlfVzsJCQkJLyogMHgxMTIwICovCisJdTY0IHNsYl9pbnZhbGlkYXRlX2FsbF9XOwkJCQkvKiAweDExMjggKi8KKwl1OCAgcGFkXzB4MTEzMF8weDIwMDBbMHgyMDAwIC0gMHgxMTMwXTsgCQkvKiAweDExMzAgKi8KKworCS8qIENvbnRleHQgU2F2ZSAvIFJlc3RvcmUgQXJlYSAqLworCXN0cnVjdCBtZmNfY3Ffc3Igc3B1cVsxNl07CQkJCS8qIDB4MjAwMCAqLworCXN0cnVjdCBtZmNfY3Ffc3IgcHVxWzhdOwkJCQkvKiAweDIyMDAgKi8KKwl1OCAgcGFkXzB4MjMwMF8weDMwMDBbMHgzMDAwIC0gMHgyMzAwXTsgCQkvKiAweDIzMDAgKi8KKworCS8qIE1GQyBDb250cm9sICovCisJdTY0IG1mY19jb250cm9sX1JXOwkJCQkJLyogMHgzMDAwICovCisjZGVmaW5lIE1GQ19DTlRMX1JFU1VNRV9ETUFfUVVFVUUJCSgwdWxsIDw8IDApCisjZGVmaW5lIE1GQ19DTlRMX1NVU1BFTkRfRE1BX1FVRVVFCQkoMXVsbCA8PCAwKQorI2RlZmluZSBNRkNfQ05UTF9TVVNQRU5EX0RNQV9RVUVVRV9NQVNLCQkoMXVsbCA8PCAwKQorI2RlZmluZSBNRkNfQ05UTF9OT1JNQUxfRE1BX1FVRVVFX09QRVJBVElPTgkoMHVsbCA8PCA4KQorI2RlZmluZSBNRkNfQ05UTF9TVVNQRU5EX0lOX1BST0dSRVNTCQkoMXVsbCA8PCA4KQorI2RlZmluZSBNRkNfQ05UTF9TVVNQRU5EX0NPTVBMRVRFCQkoM3VsbCA8PCA4KQorI2RlZmluZSBNRkNfQ05UTF9TVVNQRU5EX0RNQV9TVEFUVVNfTUFTSwkoM3VsbCA8PCA4KQorI2RlZmluZSBNRkNfQ05UTF9ETUFfUVVFVUVTX0VNUFRZCQkoMXVsbCA8PCAxNCkKKyNkZWZpbmUgTUZDX0NOVExfRE1BX1FVRVVFU19FTVBUWV9NQVNLCQkoMXVsbCA8PCAxNCkKKyNkZWZpbmUgTUZDX0NOVExfUFVSR0VfRE1BX1JFUVVFU1QJCSgxdWxsIDw8IDE1KQorI2RlZmluZSBNRkNfQ05UTF9QVVJHRV9ETUFfSU5fUFJPR1JFU1MJCSgxdWxsIDw8IDI0KQorI2RlZmluZSBNRkNfQ05UTF9QVVJHRV9ETUFfQ09NUExFVEUJCSgzdWxsIDw8IDI0KQorI2RlZmluZSBNRkNfQ05UTF9QVVJHRV9ETUFfU1RBVFVTX01BU0sJCSgzdWxsIDw8IDI0KQorI2RlZmluZSBNRkNfQ05UTF9SRVNUQVJUX0RNQV9DT01NQU5ECQkoMXVsbCA8PCAzMikKKyNkZWZpbmUgTUZDX0NOVExfRE1BX0NPTU1BTkRfUkVJU1NVRV9QRU5ESU5HCSgxdWxsIDw8IDMyKQorI2RlZmluZSBNRkNfQ05UTF9ETUFfQ09NTUFORF9SRUlTU1VFX1NUQVRVU19NQVNLICgxdWxsIDw8IDMyKQorI2RlZmluZSBNRkNfQ05UTF9NRkNfUFJJVklMRUdFX1NUQVRFCQkoMnVsbCA8PCAzMykKKyNkZWZpbmUgTUZDX0NOVExfTUZDX1BST0JMRU1fU1RBVEUJCSgzdWxsIDw8IDMzKQorI2RlZmluZSBNRkNfQ05UTF9NRkNfS0VZX1BST1RFQ1RJT05fU1RBVEVfTUFTSwkoM3VsbCA8PCAzMykKKyNkZWZpbmUgTUZDX0NOVExfREVDUkVNRU5URVJfSEFMVEVECQkoMXVsbCA8PCAzNSkKKyNkZWZpbmUgTUZDX0NOVExfREVDUkVNRU5URVJfUlVOTklORwkJKDF1bGwgPDwgNDApCisjZGVmaW5lIE1GQ19DTlRMX0RFQ1JFTUVOVEVSX1NUQVRVU19NQVNLCSgxdWxsIDw8IDQwKQorCXU4ICBwYWRfMHgzMDA4XzB4NDAwMFsweDQwMDAgLSAweDMwMDhdOyAJCS8qIDB4MzAwOCAqLworCisJLyogSW50ZXJydXB0IE1haWxib3ggKi8KKwl1NjQgcHVpbnRfbWJfUjsJCQkJCQkvKiAweDQwMDAgKi8KKwl1OCAgcGFkXzB4NDAwOF8weDQwNDBbMHg0MDQwIC0gMHg0MDA4XTsgCQkvKiAweDQwMDggKi8KKworCS8qIFNQVSBDb250cm9sICovCisJdTY0IHNwdV9wcml2Y250bF9SVzsJCQkJCS8qIDB4NDA0MCAqLworI2RlZmluZSBTUFVfUFJJVkNOVExfTU9ERV9OT1JNQUwJCSgweDB1bGwgPDwgMCkKKyNkZWZpbmUgU1BVX1BSSVZDTlRMX01PREVfU0lOR0xFX1NURVAJCSgweDF1bGwgPDwgMCkKKyNkZWZpbmUgU1BVX1BSSVZDTlRMX01PREVfTUFTSwkJCSgweDF1bGwgPDwgMCkKKyNkZWZpbmUgU1BVX1BSSVZDTlRMX05PX0FUVEVOVElPTl9FVkVOVAkJKDB4MHVsbCA8PCAxKQorI2RlZmluZSBTUFVfUFJJVkNOVExfQVRURU5USU9OX0VWRU5UCQkoMHgxdWxsIDw8IDEpCisjZGVmaW5lIFNQVV9QUklWQ05UTF9BVFRFTlRJT05fRVZFTlRfTUFTSwkoMHgxdWxsIDw8IDEpCisjZGVmaW5lIFNQVV9QUklWQ05UX0xPQURfUkVRVUVTVF9OT1JNQUwJCSgweDB1bGwgPDwgMikKKyNkZWZpbmUgU1BVX1BSSVZDTlRfTE9BRF9SRVFVRVNUX0VOQUJMRV9NQVNLCSgweDF1bGwgPDwgMikKKwl1OCAgcGFkXzB4NDA0OF8weDQwNThbMHgxMF07CQkJCS8qIDB4NDA0OCAqLworCXU2NCBzcHVfbHNscl9SVzsJCQkJCS8qIDB4NDA1OCAqLworCXU2NCBzcHVfY2hubGNudHB0cl9SVzsJCQkJCS8qIDB4NDA2MCAqLworCXU2NCBzcHVfY2hubGNudF9SVzsJCQkJCS8qIDB4NDA2OCAqLworCXU2NCBzcHVfY2hubGRhdGFfUlc7CQkJCQkvKiAweDQwNzAgKi8KKwl1NjQgc3B1X2NmZ19SVzsJCQkJCQkvKiAweDQwNzggKi8KKwl1OCAgcGFkXzB4NDA4MF8weDUwMDBbMHg1MDAwIC0gMHg0MDgwXTsgCQkvKiAweDQwODAgKi8KKworCS8qIFBWMl9JbXBsUmVnczogSW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcHJpdmlsZWdlZC1zdGF0ZSAyIHJlZ3MgKi8KKwl1NjQgc3B1X3BtX3RyYWNlX3RhZ19zdGF0dXNfUlc7CQkJCS8qIDB4NTAwMCAqLworCXU2NCBzcHVfdGFnX3N0YXR1c19xdWVyeV9SVzsJCQkJLyogMHg1MDA4ICovCisjZGVmaW5lIFRBR19TVEFUVVNfUVVFUllfQ09ORElUSU9OX0JJVFMgKDB4M3VsbCA8PCAzMikKKyNkZWZpbmUgVEFHX1NUQVRVU19RVUVSWV9NQVNLX0JJVFMgKDB4ZmZmZmZmZmZ1bGwpCisJdTY0IHNwdV9jbWRfYnVmMV9SVzsJCQkJCS8qIDB4NTAxMCAqLworI2RlZmluZSBTUFVfQ09NTUFORF9CVUZGRVJfMV9MU0FfQklUUyAoMHg3ZmZmZnVsbCA8PCAzMikKKyNkZWZpbmUgU1BVX0NPTU1BTkRfQlVGRkVSXzFfRUFIX0JJVFMgKDB4ZmZmZmZmZmZ1bGwpCisJdTY0IHNwdV9jbWRfYnVmMl9SVzsJCQkJCS8qIDB4NTAxOCAqLworI2RlZmluZSBTUFVfQ09NTUFORF9CVUZGRVJfMl9FQUxfQklUUyAoKDB4ZmZmZmZmZmZ1bGwpIDw8IDMyKQorI2RlZmluZSBTUFVfQ09NTUFORF9CVUZGRVJfMl9UU19CSVRTICgweGZmZmZ1bGwgPDwgMTYpCisjZGVmaW5lIFNQVV9DT01NQU5EX0JVRkZFUl8yX1RBR19CSVRTICgweDNmdWxsKQorCXU2NCBzcHVfYXRvbWljX3N0YXR1c19SVzsJCQkJLyogMHg1MDIwICovCit9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDB4MjAwMDApKSk7CisKKy8qIFNQVSBQcml2aWxlZ2UgMSBTdGF0ZSBBcmVhICovCitzdHJ1Y3Qgc3B1X3ByaXYxIHsKKwkvKiBDb250cm9sIGFuZCBDb25maWd1cmF0aW9uIEFyZWEgKi8KKwl1NjQgbWZjX3NyMV9SVzsJCQkJCQkvKiAweDAwMCAqLworI2RlZmluZSBNRkNfU1RBVEUxX0xPQ0FMX1NUT1JBR0VfREVDT0RFX01BU0sJMHgwMXVsbAorI2RlZmluZSBNRkNfU1RBVEUxX0JVU19UTEJJRV9NQVNLCQkweDAydWxsCisjZGVmaW5lIE1GQ19TVEFURTFfUkVBTF9NT0RFX09GRlNFVF9FTkFCTEVfTUFTSwkweDA0dWxsCisjZGVmaW5lIE1GQ19TVEFURTFfUFJPQkxFTV9TVEFURV9NQVNLCQkweDA4dWxsCisjZGVmaW5lIE1GQ19TVEFURTFfUkVMT0NBVEVfTUFTSwkJMHgxMHVsbAorI2RlZmluZSBNRkNfU1RBVEUxX01BU1RFUl9SVU5fQ09OVFJPTF9NQVNLCTB4MjB1bGwKKwl1NjQgbWZjX2xwaWRfUlc7CQkJCQkvKiAweDAwOCAqLworCXU2NCBzcHVfaWRyX1JXOwkJCQkJCS8qIDB4MDEwICovCisJdTY0IG1mY192cl9STzsJCQkJCQkvKiAweDAxOCAqLworI2RlZmluZSBNRkNfVkVSU0lPTl9CSVRTCQkoMHhmZmZmIDw8IDE2KQorI2RlZmluZSBNRkNfUkVWSVNJT05fQklUUwkJKDB4ZmZmZikKKyNkZWZpbmUgTUZDX0dFVF9WRVJTSU9OX0JJVFModnIpCSgoKHZyKSAmIE1GQ19WRVJTSU9OX0JJVFMpID4+IDE2KQorI2RlZmluZSBNRkNfR0VUX1JFVklTSU9OX0JJVFModnIpCSgodnIpICYgTUZDX1JFVklTSU9OX0JJVFMpCisJdTY0IHNwdV92cl9STzsJCQkJCQkvKiAweDAyMCAqLworI2RlZmluZSBTUFVfVkVSU0lPTl9CSVRTCQkoMHhmZmZmIDw8IDE2KQorI2RlZmluZSBTUFVfUkVWSVNJT05fQklUUwkJKDB4ZmZmZikKKyNkZWZpbmUgU1BVX0dFVF9WRVJTSU9OX0JJVFModnIpCSh2ciAmIFNQVV9WRVJTSU9OX0JJVFMpID4+IDE2CisjZGVmaW5lIFNQVV9HRVRfUkVWSVNJT05fQklUUyh2cikJKHZyICYgU1BVX1JFVklTSU9OX0JJVFMpCisJdTggIHBhZF8weDI4XzB4MTAwWzB4MTAwIC0gMHgyOF07CQkJLyogMHgyOCAqLworCisKKwkvKiBJbnRlcnJ1cHQgQXJlYSAqLworCXU2NCBpbnRfbWFza19SV1szXTsJCQkJCS8qIDB4MTAwICovCisjZGVmaW5lIENMQVNTMF9FTkFCTEVfRE1BX0FMSUdOTUVOVF9JTlRSCQkweDFMCisjZGVmaW5lIENMQVNTMF9FTkFCTEVfSU5WQUxJRF9ETUFfQ09NTUFORF9JTlRSCQkweDJMCisjZGVmaW5lIENMQVNTMF9FTkFCTEVfU1BVX0VSUk9SX0lOVFIJCQkweDRMCisjZGVmaW5lIENMQVNTMF9FTkFCTEVfTUZDX0ZJUl9JTlRSCQkJMHg4TAorI2RlZmluZSBDTEFTUzFfRU5BQkxFX1NFR01FTlRfRkFVTFRfSU5UUgkJMHgxTAorI2RlZmluZSBDTEFTUzFfRU5BQkxFX1NUT1JBR0VfRkFVTFRfSU5UUgkJMHgyTAorI2RlZmluZSBDTEFTUzFfRU5BQkxFX0xTX0NPTVBBUkVfU1VTUEVORF9PTl9HRVRfSU5UUgkweDRMCisjZGVmaW5lIENMQVNTMV9FTkFCTEVfTFNfQ09NUEFSRV9TVVNQRU5EX09OX1BVVF9JTlRSCTB4OEwKKyNkZWZpbmUgQ0xBU1MyX0VOQUJMRV9NQUlMQk9YX0lOVFIJCQkweDFMCisjZGVmaW5lIENMQVNTMl9FTkFCTEVfU1BVX1NUT1BfSU5UUgkJCTB4MkwKKyNkZWZpbmUgQ0xBU1MyX0VOQUJMRV9TUFVfSEFMVF9JTlRSCQkJMHg0TAorI2RlZmluZSBDTEFTUzJfRU5BQkxFX1NQVV9ETUFfVEFHX0dST1VQX0NPTVBMRVRFX0lOVFIJMHg4TAorCXU4ICBwYWRfMHgxMThfMHgxNDBbMHgyOF07CQkJCS8qIDB4MTE4ICovCisJdTY0IGludF9zdGF0X1JXWzNdOwkJCQkJLyogMHgxNDAgKi8KKwl1OCAgcGFkXzB4MTU4XzB4MTgwWzB4MjhdOwkJCQkvKiAweDE1OCAqLworCXU2NCBpbnRfcm91dGVfUlc7CQkJCQkvKiAweDE4MCAqLworCisJLyogSW50ZXJydXB0IFJvdXRpbmcgKi8KKwl1OCAgcGFkXzB4MTg4XzB4MjAwWzB4MjAwIC0gMHgxODhdOwkJCS8qIDB4MTg4ICovCisKKwkvKiBBdG9taWMgVW5pdCBDb250cm9sIEFyZWEgKi8KKwl1NjQgbWZjX2F0b21pY19mbHVzaF9SVzsJCQkJLyogMHgyMDAgKi8KKyNkZWZpbmUgbWZjX2F0b21pY19mbHVzaF9lbmFibGUJCQkweDFMCisJdTggIHBhZF8weDIwOF8weDI4MFsweDc4XTsJCQkJLyogMHgyMDggKi8KKwl1NjQgcmVzb3VyY2VfYWxsb2NhdGlvbl9ncm91cElEX1JXOwkJCS8qIDB4MjgwICovCisJdTY0IHJlc291cmNlX2FsbG9jYXRpb25fZW5hYmxlX1JXOyAJCQkvKiAweDI4OCAqLworCXU4ICBwYWRfMHgyOTBfMHgzYzhbMHgzYzggLSAweDI5MF07CQkJLyogMHgyOTAgKi8KKworCS8qIFNQVV9DYWNoZV9JbXBsUmVnczogSW1wbGVtZW50YXRpb24tZGVwZW5kZW50IGNhY2hlIHJlZ2lzdGVycyAqLworCisJdTY0IHNtZl9zYmlfc2lnbmFsX3NlbDsJCQkJCS8qIDB4M2M4ICovCisjZGVmaW5lIHNtZl9zYmlfbWFza19sc2IJNTYKKyNkZWZpbmUgc21mX3NiaV9zaGlmdAkJKDYzIC0gc21mX3NiaV9tYXNrX2xzYikKKyNkZWZpbmUgc21mX3NiaV9tYXNrCQkoMHgzMDFMTCA8PCBzbWZfc2JpX3NoaWZ0KQorI2RlZmluZSBzbWZfc2JpX2J1czBfYml0cwkoMHgwMDFMTCA8PCBzbWZfc2JpX3NoaWZ0KQorI2RlZmluZSBzbWZfc2JpX2J1czJfYml0cwkoMHgxMDBMTCA8PCBzbWZfc2JpX3NoaWZ0KQorI2RlZmluZSBzbWZfc2JpMl9idXMwX2JpdHMJKDB4MjAxTEwgPDwgc21mX3NiaV9zaGlmdCkKKyNkZWZpbmUgc21mX3NiaTJfYnVzMl9iaXRzCSgweDMwMExMIDw8IHNtZl9zYmlfc2hpZnQpCisJdTY0IHNtZl9hdG9fc2lnbmFsX3NlbDsJCQkJCS8qIDB4M2QwICovCisjZGVmaW5lIHNtZl9hdG9fbWFza19sc2IJMzUKKyNkZWZpbmUgc21mX2F0b19zaGlmdAkJKDYzIC0gc21mX2F0b19tYXNrX2xzYikKKyNkZWZpbmUgc21mX2F0b19tYXNrCQkoMHgzTEwgPDwgc21mX2F0b19zaGlmdCkKKyNkZWZpbmUgc21mX2F0b19idXMwX2JpdHMJKDB4MkxMIDw8IHNtZl9hdG9fc2hpZnQpCisjZGVmaW5lIHNtZl9hdG9fYnVzMl9iaXRzCSgweDFMTCA8PCBzbWZfYXRvX3NoaWZ0KQorCXU4ICBwYWRfMHgzZDhfMHg0MDBbMHg0MDAgLSAweDNkOF07CQkJLyogMHgzZDggKi8KKworCS8qIFRMQiBNYW5hZ2VtZW50IFJlZ2lzdGVycyAqLworCXU2NCBtZmNfc2RyX1JXOwkJCQkJCS8qIDB4NDAwICovCisJdTggIHBhZF8weDQwOF8weDUwMFsweGY4XTsJCQkJLyogMHg0MDggKi8KKwl1NjQgdGxiX2luZGV4X2hpbnRfUk87CQkJCQkvKiAweDUwMCAqLworCXU2NCB0bGJfaW5kZXhfVzsJCQkJCS8qIDB4NTA4ICovCisJdTY0IHRsYl92cG5fUlc7CQkJCQkJLyogMHg1MTAgKi8KKwl1NjQgdGxiX3Jwbl9SVzsJCQkJCQkvKiAweDUxOCAqLworCXU4ICBwYWRfMHg1MjBfMHg1NDBbMHgyMF07CQkJCS8qIDB4NTIwICovCisJdTY0IHRsYl9pbnZhbGlkYXRlX2VudHJ5X1c7CQkJCS8qIDB4NTQwICovCisJdTY0IHRsYl9pbnZhbGlkYXRlX2FsbF9XOwkJCQkvKiAweDU0OCAqLworCXU4ICBwYWRfMHg1NTBfMHg1ODBbMHg1ODAgLSAweDU1MF07CQkJLyogMHg1NTAgKi8KKworCS8qIFNQVV9NTVVfSW1wbFJlZ3M6IEltcGxlbWVudGF0aW9uLWRlcGVuZGVudCBNTVUgcmVnaXN0ZXJzICovCisJdTY0IHNtbV9oaWQ7CQkJCQkJLyogMHg1ODAgKi8KKyNkZWZpbmUgUEFHRV9TSVpFX01BU0sJCTB4ZjAwMDAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSBQQUdFX1NJWkVfMTZNQl82NEtCCTB4MjAwMDAwMDAwMDAwMDAwMHVsbAorCXU4ICBwYWRfMHg1ODhfMHg2MDBbMHg2MDAgLSAweDU4OF07CQkJLyogMHg1ODggKi8KKworCS8qIE1GQyBTdGF0dXMvQ29udHJvbCBBcmVhICovCisJdTY0IG1mY19hY2NyX1JXOwkJCQkJLyogMHg2MDAgKi8KKyNkZWZpbmUgTUZDX0FDQ1JfRUFfQUNDRVNTX0dFVAkJKDEgPDwgMCkKKyNkZWZpbmUgTUZDX0FDQ1JfRUFfQUNDRVNTX1BVVAkJKDEgPDwgMSkKKyNkZWZpbmUgTUZDX0FDQ1JfTFNfQUNDRVNTX0dFVAkJKDEgPDwgMykKKyNkZWZpbmUgTUZDX0FDQ1JfTFNfQUNDRVNTX1BVVAkJKDEgPDwgNCkKKwl1OCAgcGFkXzB4NjA4XzB4NjEwWzB4OF07CQkJCS8qIDB4NjA4ICovCisJdTY0IG1mY19kc2lzcl9SVzsJCQkJCS8qIDB4NjEwICovCisjZGVmaW5lIE1GQ19EU0lTUl9QVEVfTk9UX0ZPVU5ECQkoMSA8PCAzMCkKKyNkZWZpbmUgTUZDX0RTSVNSX0FDQ0VTU19ERU5JRUQJCSgxIDw8IDI3KQorI2RlZmluZSBNRkNfRFNJU1JfQVRPTUlDCQkoMSA8PCAyNikKKyNkZWZpbmUgTUZDX0RTSVNSX0FDQ0VTU19QVVQJCSgxIDw8IDI1KQorI2RlZmluZSBNRkNfRFNJU1JfQUREUl9NQVRDSAkJKDEgPDwgMjIpCisjZGVmaW5lIE1GQ19EU0lTUl9MUwkJCSgxIDw8IDE3KQorI2RlZmluZSBNRkNfRFNJU1JfTAkJCSgxIDw8IDE2KQorI2RlZmluZSBNRkNfRFNJU1JfQUREUkVTU19PVkVSRkxPVwkoMSA8PCAwKQorCXU4ICBwYWRfMHg2MThfMHg2MjBbMHg4XTsJCQkJLyogMHg2MTggKi8KKwl1NjQgbWZjX2Rhcl9SVzsJCQkJCQkvKiAweDYyMCAqLworCXU4ICBwYWRfMHg2MjhfMHg3MDBbMHg3MDAgLSAweDYyOF07CQkJLyogMHg2MjggKi8KKworCS8qIFJlcGxhY2VtZW50IE1hbmFnZW1lbnQgVGFibGUgKFJNVCkgQXJlYSAqLworCXU2NCBybXRfaW5kZXhfUlc7CQkJCQkvKiAweDcwMCAqLworCXU4ICBwYWRfMHg3MDhfMHg3MTBbMHg4XTsJCQkJLyogMHg3MDggKi8KKwl1NjQgcm10X2RhdGExX1JXOwkJCQkJLyogMHg3MTAgKi8KKwl1OCAgcGFkXzB4NzE4XzB4ODAwWzB4ODAwIC0gMHg3MThdOwkJCS8qIDB4NzE4ICovCisKKwkvKiBDb250cm9sL0NvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzICovCisJdTY0IG1mY19kc2lyX1I7CQkJCQkJLyogMHg4MDAgKi8KKyNkZWZpbmUgTUZDX0RTSVJfUQkJCSgxIDw8IDMxKQorI2RlZmluZSBNRkNfRFNJUl9TUFVfUVVFVUUJCU1GQ19EU0lSX1EKKwl1NjQgbWZjX2xzYWNyX1JXOwkJCQkJLyogMHg4MDggKi8KKyNkZWZpbmUgTUZDX0xTQUNSX0NPTVBBUkVfTUFTSwkJKCh+MHVsbCkgPDwgMzIpCisjZGVmaW5lIE1GQ19MU0FDUl9DT01QQVJFX0FERFIJCSgofjB1bGwpID4+IDMyKQorCXU2NCBtZmNfbHNjcnJfUjsJCQkJCS8qIDB4ODEwICovCisjZGVmaW5lIE1GQ19MU0NSUl9RCQkJKDEgPDwgMzEpCisjZGVmaW5lIE1GQ19MU0NSUl9TUFVfUVVFVUUJCU1GQ19MU0NSUl9RCisjZGVmaW5lIE1GQ19MU0NSUl9RSV9TSElGVAkJMzIKKyNkZWZpbmUgTUZDX0xTQ1JSX1FJX01BU0sJCSgofjB1bGwpIDw8IE1GQ19MU0NSUl9RSV9TSElGVCkKKwl1OCAgcGFkXzB4ODE4XzB4ODIwWzB4OF07CQkJCS8qIDB4ODE4ICovCisJdTY0IG1mY190Y2xhc3NfaWRfUlc7CQkJCQkvKiAweDgyMCAqLworI2RlZmluZSBNRkNfVENMQVNTX0lEX0VOQUJMRQkJKDFMIDw8IDBMKQorI2RlZmluZSBNRkNfVENMQVNTX1NMT1QyX0VOQUJMRQkJKDFMIDw8IDVMKQorI2RlZmluZSBNRkNfVENMQVNTX1NMT1QxX0VOQUJMRQkJKDFMIDw8IDZMKQorI2RlZmluZSBNRkNfVENMQVNTX1NMT1QwX0VOQUJMRQkJKDFMIDw8IDdMKQorI2RlZmluZSBNRkNfVENMQVNTX1FVT1RBXzJfU0hJRlQJOEwKKyNkZWZpbmUgTUZDX1RDTEFTU19RVU9UQV8xX1NISUZUCTE2TAorI2RlZmluZSBNRkNfVENMQVNTX1FVT1RBXzBfU0hJRlQJMjRMCisjZGVmaW5lIE1GQ19UQ0xBU1NfUVVPVEFfMl9NQVNLCQkoMHgxRkwgPDwgTUZDX1RDTEFTU19RVU9UQV8yX1NISUZUKQorI2RlZmluZSBNRkNfVENMQVNTX1FVT1RBXzFfTUFTSwkJKDB4MUZMIDw8IE1GQ19UQ0xBU1NfUVVPVEFfMV9TSElGVCkKKyNkZWZpbmUgTUZDX1RDTEFTU19RVU9UQV8wX01BU0sJCSgweDFGTCA8PCBNRkNfVENMQVNTX1FVT1RBXzBfU0hJRlQpCisJdTggIHBhZF8weDgyOF8weDkwMFsweDkwMCAtIDB4ODI4XTsJCQkvKiAweDgyOCAqLworCisJLyogUmVhbCBNb2RlIFN1cHBvcnQgUmVnaXN0ZXJzICovCisJdTY0IG1mY19ybV9ib3VuZGFyeTsJCQkJCS8qIDB4OTAwICovCisJdTggIHBhZF8weDkwOF8weDkzOFsweDMwXTsJCQkJLyogMHg5MDggKi8KKwl1NjQgc21mX2RtYV9zaWduYWxfc2VsOwkJCQkJLyogMHg5MzggKi8KKyNkZWZpbmUgbWZjX2RtYTFfbWFza19sc2IJNDEKKyNkZWZpbmUgbWZjX2RtYTFfc2hpZnQJCSg2MyAtIG1mY19kbWExX21hc2tfbHNiKQorI2RlZmluZSBtZmNfZG1hMV9tYXNrCQkoMHgzTEwgPDwgbWZjX2RtYTFfc2hpZnQpCisjZGVmaW5lIG1mY19kbWExX2JpdHMJCSgweDFMTCA8PCBtZmNfZG1hMV9zaGlmdCkKKyNkZWZpbmUgbWZjX2RtYTJfbWFza19sc2IJNDMKKyNkZWZpbmUgbWZjX2RtYTJfc2hpZnQJCSg2MyAtIG1mY19kbWEyX21hc2tfbHNiKQorI2RlZmluZSBtZmNfZG1hMl9tYXNrCQkoMHgzTEwgPDwgbWZjX2RtYTJfc2hpZnQpCisjZGVmaW5lIG1mY19kbWEyX2JpdHMJCSgweDFMTCA8PCBtZmNfZG1hMl9zaGlmdCkKKwl1OCAgcGFkXzB4OTQwXzB4YTM4WzB4ZjhdOwkJCQkvKiAweDk0MCAqLworCXU2NCBzbW1fc2lnbmFsX3NlbDsJCQkJCS8qIDB4YTM4ICovCisjZGVmaW5lIHNtbV9zaWdfbWFza19sc2IJMTIKKyNkZWZpbmUgc21tX3NpZ19zaGlmdAkJKDYzIC0gc21tX3NpZ19tYXNrX2xzYikKKyNkZWZpbmUgc21tX3NpZ19tYXNrCQkoMHgzTEwgPDwgc21tX3NpZ19zaGlmdCkKKyNkZWZpbmUgc21tX3NpZ19idXMwX2JpdHMJKDB4MkxMIDw8IHNtbV9zaWdfc2hpZnQpCisjZGVmaW5lIHNtbV9zaWdfYnVzMl9iaXRzCSgweDFMTCA8PCBzbW1fc2lnX3NoaWZ0KQorCXU4ICBwYWRfMHhhNDBfMHhjMDBbMHhjMDAgLSAweGE0MF07CQkJLyogMHhhNDAgKi8KKworCS8qIERNQSBDb21tYW5kIEVycm9yIEFyZWEgKi8KKwl1NjQgbWZjX2Nlcl9SOwkJCQkJCS8qIDB4YzAwICovCisjZGVmaW5lIE1GQ19DRVJfUQkJKDEgPDwgMzEpCisjZGVmaW5lIE1GQ19DRVJfU1BVX1FVRVVFCU1GQ19DRVJfUQorCXU4ICBwYWRfMHhjMDhfMHgxMDAwWzB4MTAwMCAtIDB4YzA4XTsJCQkvKiAweGMwOCAqLworCisJLyogUFYxX0ltcGxSZWdzOiBJbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQgcHJpdmlsZWdlZC1zdGF0ZSAxIHJlZ3MgKi8KKwkvKiBETUEgQ29tbWFuZCBFcnJvciBBcmVhICovCisJdTY0IHNwdV9lY2NfY250bF9SVzsJCQkJCS8qIDB4MTAwMCAqLworI2RlZmluZSBTUFVfRUNDX0NOVExfRQkJCSgxdWxsIDw8IDB1bGwpCisjZGVmaW5lIFNQVV9FQ0NfQ05UTF9FTkFCTEUJCVNQVV9FQ0NfQ05UTF9FCisjZGVmaW5lIFNQVV9FQ0NfQ05UTF9ESVNBQkxFCQkoflNQVV9FQ0NfQ05UTF9FICYgMUwpCisjZGVmaW5lIFNQVV9FQ0NfQ05UTF9TCQkJKDF1bGwgPDwgMXVsbCkKKyNkZWZpbmUgU1BVX0VDQ19TVE9QX0FGVEVSX0VSUk9SCVNQVV9FQ0NfQ05UTF9TCisjZGVmaW5lIFNQVV9FQ0NfQ09OVElOVUVfQUZURVJfRVJST1IJKH5TUFVfRUNDX0NOVExfUyAmIDJMKQorI2RlZmluZSBTUFVfRUNDX0NOVExfQgkJCSgxdWxsIDw8IDJ1bGwpCisjZGVmaW5lIFNQVV9FQ0NfQkFDS0dST1VORF9FTkFCTEUJU1BVX0VDQ19DTlRMX0IKKyNkZWZpbmUgU1BVX0VDQ19CQUNLR1JPVU5EX0RJU0FCTEUJKH5TUFVfRUNDX0NOVExfQiAmIDRMKQorI2RlZmluZSBTUFVfRUNDX0NOVExfSV9TSElGVAkJM3VsbAorI2RlZmluZSBTUFVfRUNDX0NOVExfSV9NQVNLCQkoM3VsbCA8PCBTUFVfRUNDX0NOVExfSV9TSElGVCkKKyNkZWZpbmUgU1BVX0VDQ19XUklURV9BTFdBWVMJCSh+U1BVX0VDQ19DTlRMX0kgJiAxMkwpCisjZGVmaW5lIFNQVV9FQ0NfV1JJVEVfQ09SUkVDVEFCTEUJKDF1bGwgPDwgU1BVX0VDQ19DTlRMX0lfU0hJRlQpCisjZGVmaW5lIFNQVV9FQ0NfV1JJVEVfVU5DT1JSRUNUQUJMRQkoM3VsbCA8PCBTUFVfRUNDX0NOVExfSV9TSElGVCkKKyNkZWZpbmUgU1BVX0VDQ19DTlRMX0QJCQkoMXVsbCA8PCA1dWxsKQorI2RlZmluZSBTUFVfRUNDX0RFVEVDVElPTl9FTkFCTEUJU1BVX0VDQ19DTlRMX0QKKyNkZWZpbmUgU1BVX0VDQ19ERVRFQ1RJT05fRElTQUJMRQkoflNQVV9FQ0NfQ05UTF9EICYgMzJMKQorCXU2NCBzcHVfZWNjX3N0YXRfUlc7CQkJCQkvKiAweDEwMDggKi8KKyNkZWZpbmUgU1BVX0VDQ19DT1JSRUNURURfRVJST1IJCSgxdWxsIDw8IDB1bCkKKyNkZWZpbmUgU1BVX0VDQ19VTkNPUlJFQ1RFRF9FUlJPUgkoMXVsbCA8PCAxdWwpCisjZGVmaW5lIFNQVV9FQ0NfU0NSVUJfQ09NUExFVEUJCSgxdWxsIDw8IDJ1bCkKKyNkZWZpbmUgU1BVX0VDQ19TQ1JVQl9JTl9QUk9HUkVTUwkoMXVsbCA8PCAzdWwpCisjZGVmaW5lIFNQVV9FQ0NfSU5TVFJVQ1RJT05fRVJST1IJKDF1bGwgPDwgNHVsKQorI2RlZmluZSBTUFVfRUNDX0RBVEFfRVJST1IJCSgxdWxsIDw8IDV1bCkKKyNkZWZpbmUgU1BVX0VDQ19ETUFfRVJST1IJCSgxdWxsIDw8IDZ1bCkKKyNkZWZpbmUgU1BVX0VDQ19TVEFUVVNfQ05UX01BU0sJCSgyNTZ1bGwgPDwgOCkKKwl1NjQgc3B1X2VjY19hZGRyX1JXOwkJCQkJLyogMHgxMDEwICovCisJdTY0IHNwdV9lcnJfbWFza19SVzsJCQkJCS8qIDB4MTAxOCAqLworI2RlZmluZSBTUFVfRVJSX0lMTEVHQUxfSU5TVFIJCSgxdWxsIDw8IDB1bCkKKyNkZWZpbmUgU1BVX0VSUl9JTExFR0FMX0NIQU5ORUwJCSgxdWxsIDw8IDF1bCkKKwl1OCAgcGFkXzB4MTAyMF8weDEwMjhbMHgxMDI4IC0gMHgxMDIwXTsJCQkvKiAweDEwMjAgKi8KKworCS8qIFNQVSBEZWJ1Zy1UcmFjZSBCdXMgKERUQikgU2VsZWN0aW9uIFJlZ2lzdGVycyAqLworCXU2NCBzcHVfdHJpZzBfc2VsOwkJCQkJLyogMHgxMDI4ICovCisJdTY0IHNwdV90cmlnMV9zZWw7CQkJCQkvKiAweDEwMzAgKi8KKwl1NjQgc3B1X3RyaWcyX3NlbDsJCQkJCS8qIDB4MTAzOCAqLworCXU2NCBzcHVfdHJpZzNfc2VsOwkJCQkJLyogMHgxMDQwICovCisJdTY0IHNwdV90cmFjZV9zZWw7CQkJCQkvKiAweDEwNDggKi8KKyNkZWZpbmUgc3B1X3RyYWNlX3NlbF9tYXNrCQkweDFmMWZMTAorI2RlZmluZSBzcHVfdHJhY2Vfc2VsX2J1czBfYml0cwkJMHgxMDAwTEwKKyNkZWZpbmUgc3B1X3RyYWNlX3NlbF9idXMyX2JpdHMJCTB4MDAxMExMCisJdTY0IHNwdV9ldmVudDBfc2VsOwkJCQkJLyogMHgxMDUwICovCisJdTY0IHNwdV9ldmVudDFfc2VsOwkJCQkJLyogMHgxMDU4ICovCisJdTY0IHNwdV9ldmVudDJfc2VsOwkJCQkJLyogMHgxMDYwICovCisJdTY0IHNwdV9ldmVudDNfc2VsOwkJCQkJLyogMHgxMDY4ICovCisJdTY0IHNwdV90cmFjZV9jbnRsOwkJCQkJLyogMHgxMDcwICovCit9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDB4MjAwMCkpKTsKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHVfY3NhLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwdV9jc2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTE4ZDdkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHVfY3NhLmgKQEAgLTAsMCArMSwyNTUgQEAKKy8qCisgKiBzcHVfY3NhLmg6IERlZmluaXRpb25zIGZvciBTUFUgY29udGV4dCBzYXZlIGFyZWEgKENTQSkuCisgKgorICogKEMpIENvcHlyaWdodCBJQk0gMjAwNQorICoKKyAqIEF1dGhvcjogTWFyayBOdXR0ZXIgPG1udXR0ZXJAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX1NQVV9DU0FfSF8KKyNkZWZpbmUgX1NQVV9DU0FfSF8KKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qCisgKiBUb3RhbCBudW1iZXIgb2YgMTI4LWJpdCByZWdpc3RlcnMuCisgKi8KKyNkZWZpbmUgTlJfU1BVX0dQUlMgICAgICAgICAJMTI4CisjZGVmaW5lIE5SX1NQVV9TUFJTICAgICAgICAgCTkKKyNkZWZpbmUgTlJfU1BVX1JFR1NfUEFECSAgICAJNworI2RlZmluZSBOUl9TUFVfU1BJTExfUkVHUyAgIAkxNDQJLyogR1BSUyArIFNQUlMgKyBQQUQgKi8KKyNkZWZpbmUgU0laRU9GX1NQVV9TUElMTF9SRUdTCU5SX1NQVV9TUElMTF9SRUdTICogMTYKKworI2RlZmluZSBTUFVfU0FWRV9DT01QTEVURSAgICAgIAkweDNGRkIKKyNkZWZpbmUgU1BVX1JFU1RPUkVfQ09NUExFVEUgICAJMHgzRkZDCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdmFyaW91cyAnc3RvcHBlZCcgc3RhdHVzIGNvbmRpdGlvbnMsCisgKiB0byBiZSByZWNyZWF0ZWQgZHVyaW5nIGNvbnRleHQgcmVzdG9yZS4KKyAqLworI2RlZmluZSBTUFVfU1RPUFBFRF9TVEFUVVNfUCAgICAxCisjZGVmaW5lIFNQVV9TVE9QUEVEX1NUQVRVU19JICAgIDIKKyNkZWZpbmUgU1BVX1NUT1BQRURfU1RBVFVTX0ggICAgMworI2RlZmluZSBTUFVfU1RPUFBFRF9TVEFUVVNfUyAgICA0CisjZGVmaW5lIFNQVV9TVE9QUEVEX1NUQVRVU19TX0kgIDUKKyNkZWZpbmUgU1BVX1NUT1BQRURfU1RBVFVTX1NfUCAgNgorI2RlZmluZSBTUFVfU1RPUFBFRF9TVEFUVVNfUF9IICA3CisjZGVmaW5lIFNQVV9TVE9QUEVEX1NUQVRVU19QX0kgIDgKKyNkZWZpbmUgU1BVX1NUT1BQRURfU1RBVFVTX1IgICAgOQorCisjaWZuZGVmICBfX0FTU0VNQkxZX18KKy8qKgorICogc3B1X3JlZzEyOCAtIGdlbmVyaWMgMTI4LWJpdCByZWdpc3RlciBkZWZpbml0aW9uLgorICovCitzdHJ1Y3Qgc3B1X3JlZzEyOCB7CisJdTMyIHNsb3RbNF07Cit9OworCisvKioKKyAqIHN0cnVjdCBzcHVfbHNjc2EgLSBMb2NhbCBTdG9yZSBDb250ZXh0IFNhdmUgQXJlYS4KKyAqIEBncHJzOiBBcnJheSBvZiBzYXZlZCByZWdpc3RlcnMuCisgKiBAZnBjcjogU2F2ZWQgZmxvYXRpbmcgcG9pbnQgc3RhdHVzIGNvbnRyb2wgcmVnaXN0ZXIuCisgKiBAZGVjcjogU2F2ZWQgZGVjcmVtZW50ZXIgdmFsdWUuCisgKiBAZGVjcl9zdGF0dXM6IEluZGljYXRlcyBkZWNyZW1lbnRlciBydW4gc3RhdHVzLgorICogQHBwdV9tYjogU2F2ZWQgUFBVIG1haWxib3ggZGF0YS4KKyAqIEBwcHVpbnRfbWI6IFNhdmVkIFBQVSBpbnRlcnJ1cHRpbmcgbWFpbGJveCBkYXRhLgorICogQHRhZ19tYXNrOiBTYXZlZCB0YWcgZ3JvdXAgbWFzay4KKyAqIEBldmVudF9tYXNrOiBTYXZlZCBldmVudCBtYXNrLgorICogQHNycjA6IFNhdmVkIFNSUjAuCisgKiBAc3RvcHBlZF9zdGF0dXM6IENvbmRpdGlvbnMgdG8gYmUgcmVjcmVhdGVkIGJ5IHJlc3RvcmUuCisgKiBAbHM6IFNhdmVkIGNvbnRlbnRzIG9mIExvY2FsIFN0b3JhZ2UgQXJlYS4KKyAqCisgKiBUaGUgTFNDU0EgcmVwcmVzZW50cyBzdGF0ZSB0aGF0IGlzIHByaW1hcmlseSBzYXZlZCBhbmQKKyAqIHJlc3RvcmVkIGJ5IFNQVS1zaWRlIGNvZGUuCisgKi8KK3N0cnVjdCBzcHVfbHNjc2EgeworCXN0cnVjdCBzcHVfcmVnMTI4IGdwcnNbMTI4XTsKKwlzdHJ1Y3Qgc3B1X3JlZzEyOCBmcGNyOworCXN0cnVjdCBzcHVfcmVnMTI4IGRlY3I7CisJc3RydWN0IHNwdV9yZWcxMjggZGVjcl9zdGF0dXM7CisJc3RydWN0IHNwdV9yZWcxMjggcHB1X21iOworCXN0cnVjdCBzcHVfcmVnMTI4IHBwdWludF9tYjsKKwlzdHJ1Y3Qgc3B1X3JlZzEyOCB0YWdfbWFzazsKKwlzdHJ1Y3Qgc3B1X3JlZzEyOCBldmVudF9tYXNrOworCXN0cnVjdCBzcHVfcmVnMTI4IHNycjA7CisJc3RydWN0IHNwdV9yZWcxMjggc3RvcHBlZF9zdGF0dXM7CisJc3RydWN0IHNwdV9yZWcxMjggcGFkWzExOV07CS8qICdscycgbXVzdCBiZSBwYWdlLWFsaWduZWQuICovCisJdW5zaWduZWQgY2hhciBsc1tMU19TSVpFXTsKK307CisKKy8qCisgKiBzdHJ1Y3Qgc3B1X3Byb2JsZW1fY29sbGFwc2VkIC0gY29uZGVuc2VkIHByb2JsZW0gc3RhdGUgYXJlYSwgdy9vIHBhZHMuCisgKi8KK3N0cnVjdCBzcHVfcHJvYmxlbV9jb2xsYXBzZWQgeworCXU2NCBzcGNfbXNzeW5jX1JXOworCXUzMiBtZmNfbHNhX1c7CisJdTMyIHVudXNlZF9wYWQwOworCXU2NCBtZmNfZWFfVzsKKwl1bmlvbiBtZmNfdGFnX3NpemVfY2xhc3NfY21kIG1mY191bmlvbl9XOworCXUzMiBkbWFfcXN0YXR1c19SOworCXUzMiBkbWFfcXVlcnl0eXBlX1JXOworCXUzMiBkbWFfcXVlcnltYXNrX1JXOworCXUzMiBkbWFfdGFnc3RhdHVzX1I7CisJdTMyIHB1X21iX1I7CisJdTMyIHNwdV9tYl9XOworCXUzMiBtYl9zdGF0X1I7CisJdTMyIHNwdV9ydW5jbnRsX1JXOworCXUzMiBzcHVfc3RhdHVzX1I7CisJdTMyIHNwdV9zcGNfUjsKKwl1MzIgc3B1X25wY19SVzsKKwl1MzIgc2lnbmFsX25vdGlmeTE7CisJdTMyIHNpZ25hbF9ub3RpZnkyOworCXUzMiB1bnVzZWRfcGFkMTsKK307CisKKy8qCisgKiBzdHJ1Y3Qgc3B1X3ByaXYxX2NvbGxhcHNlZCAtIGNvbmRlbnNlZCBwcml2aWxlZ2VkIDEgYXJlYSwgdy9vIHBhZHMuCisgKi8KK3N0cnVjdCBzcHVfcHJpdjFfY29sbGFwc2VkIHsKKwl1NjQgbWZjX3NyMV9SVzsKKwl1NjQgbWZjX2xwaWRfUlc7CisJdTY0IHNwdV9pZHJfUlc7CisJdTY0IG1mY192cl9STzsKKwl1NjQgc3B1X3ZyX1JPOworCXU2NCBpbnRfbWFza19jbGFzczBfUlc7CisJdTY0IGludF9tYXNrX2NsYXNzMV9SVzsKKwl1NjQgaW50X21hc2tfY2xhc3MyX1JXOworCXU2NCBpbnRfc3RhdF9jbGFzczBfUlc7CisJdTY0IGludF9zdGF0X2NsYXNzMV9SVzsKKwl1NjQgaW50X3N0YXRfY2xhc3MyX1JXOworCXU2NCBpbnRfcm91dGVfUlc7CisJdTY0IG1mY19hdG9taWNfZmx1c2hfUlc7CisJdTY0IHJlc291cmNlX2FsbG9jYXRpb25fZ3JvdXBJRF9SVzsKKwl1NjQgcmVzb3VyY2VfYWxsb2NhdGlvbl9lbmFibGVfUlc7CisJdTY0IG1mY19maXJfUjsKKwl1NjQgbWZjX2Zpcl9zdGF0dXNfb3JfVzsKKwl1NjQgbWZjX2Zpcl9zdGF0dXNfYW5kX1c7CisJdTY0IG1mY19maXJfbWFza19SOworCXU2NCBtZmNfZmlyX21hc2tfb3JfVzsKKwl1NjQgbWZjX2Zpcl9tYXNrX2FuZF9XOworCXU2NCBtZmNfZmlyX2Noa3N0cF9lbmFibGVfUlc7CisJdTY0IHNtZl9zYmlfc2lnbmFsX3NlbDsKKwl1NjQgc21mX2F0b19zaWduYWxfc2VsOworCXU2NCBtZmNfc2RyX1JXOworCXU2NCB0bGJfaW5kZXhfaGludF9STzsKKwl1NjQgdGxiX2luZGV4X1c7CisJdTY0IHRsYl92cG5fUlc7CisJdTY0IHRsYl9ycG5fUlc7CisJdTY0IHRsYl9pbnZhbGlkYXRlX2VudHJ5X1c7CisJdTY0IHRsYl9pbnZhbGlkYXRlX2FsbF9XOworCXU2NCBzbW1faGlkOworCXU2NCBtZmNfYWNjcl9SVzsKKwl1NjQgbWZjX2RzaXNyX1JXOworCXU2NCBtZmNfZGFyX1JXOworCXU2NCBybXRfaW5kZXhfUlc7CisJdTY0IHJtdF9kYXRhMV9SVzsKKwl1NjQgbWZjX2RzaXJfUjsKKwl1NjQgbWZjX2xzYWNyX1JXOworCXU2NCBtZmNfbHNjcnJfUjsKKwl1NjQgbWZjX3RjbGFzc19pZF9SVzsKKwl1NjQgbWZjX3JtX2JvdW5kYXJ5OworCXU2NCBzbWZfZG1hX3NpZ25hbF9zZWw7CisJdTY0IHNtbV9zaWduYWxfc2VsOworCXU2NCBtZmNfY2VyX1I7CisJdTY0IHB1X2VjY19jbnRsX1JXOworCXU2NCBwdV9lY2Nfc3RhdF9SVzsKKwl1NjQgc3B1X2VjY19hZGRyX1JXOworCXU2NCBzcHVfZXJyX21hc2tfUlc7CisJdTY0IHNwdV90cmlnMF9zZWw7CisJdTY0IHNwdV90cmlnMV9zZWw7CisJdTY0IHNwdV90cmlnMl9zZWw7CisJdTY0IHNwdV90cmlnM19zZWw7CisJdTY0IHNwdV90cmFjZV9zZWw7CisJdTY0IHNwdV9ldmVudDBfc2VsOworCXU2NCBzcHVfZXZlbnQxX3NlbDsKKwl1NjQgc3B1X2V2ZW50Ml9zZWw7CisJdTY0IHNwdV9ldmVudDNfc2VsOworCXU2NCBzcHVfdHJhY2VfY250bDsKK307CisKKy8qCisgKiBzdHJ1Y3Qgc3B1X3ByaXYyX2NvbGxhcHNlZCAtIGNvbmRlbnNlZCBwcml2aWxpZ2VkIDIgYXJlYSwgdy9vIHBhZHMuCisgKi8KK3N0cnVjdCBzcHVfcHJpdjJfY29sbGFwc2VkIHsKKwl1NjQgc2xiX2luZGV4X1c7CisJdTY0IHNsYl9lc2lkX1JXOworCXU2NCBzbGJfdnNpZF9SVzsKKwl1NjQgc2xiX2ludmFsaWRhdGVfZW50cnlfVzsKKwl1NjQgc2xiX2ludmFsaWRhdGVfYWxsX1c7CisJc3RydWN0IG1mY19jcV9zciBzcHVxWzE2XTsKKwlzdHJ1Y3QgbWZjX2NxX3NyIHB1cVs4XTsKKwl1NjQgbWZjX2NvbnRyb2xfUlc7CisJdTY0IHB1aW50X21iX1I7CisJdTY0IHNwdV9wcml2Y250bF9SVzsKKwl1NjQgc3B1X2xzbHJfUlc7CisJdTY0IHNwdV9jaG5sY250cHRyX1JXOworCXU2NCBzcHVfY2hubGNudF9SVzsKKwl1NjQgc3B1X2NobmxkYXRhX1JXOworCXU2NCBzcHVfY2ZnX1JXOworCXU2NCBzcHVfdGFnX3N0YXR1c19xdWVyeV9SVzsKKwl1NjQgc3B1X2NtZF9idWYxX1JXOworCXU2NCBzcHVfY21kX2J1ZjJfUlc7CisJdTY0IHNwdV9hdG9taWNfc3RhdHVzX1JXOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc3B1X3N0YXRlCisgKiBAbHNjc2E6IExvY2FsIFN0b3JlIENvbnRleHQgU2F2ZSBBcmVhLgorICogQHByb2I6IENvbGxhcHNlZCBQcm9ibGVtIFN0YXRlIEFyZWEsIHcvbyBwYWRzLgorICogQHByaXYxOiBDb2xsYXBzZWQgUHJpdmlsZWdlZCAxIEFyZWEsIHcvbyBwYWRzLgorICogQHByaXYyOiBDb2xsYXBzZWQgUHJpdmlsZWdlZCAyIEFyZWEsIHcvbyBwYWRzLgorICogQHNwdV9jaG5sY250X1JXOiBBcnJheSBvZiBzYXZlZCBjaGFubmVsIGNvdW50cy4KKyAqIEBzcHVfY2hubGRhdGFfUlc6IEFycmF5IG9mIHNhdmVkIGNoYW5uZWwgZGF0YS4KKyAqIEBzdXNwZW5kX3RpbWU6IFRpbWUgc3RhbXAgd2hlbiBkZWNyZW1lbnRlciBkaXNhYmxlZC4KKyAqIEBzbGJfZXNpZF9SVzogQXJyYXkgb2Ygc2F2ZWQgU0xCIGVzaWQgZW50cmllcy4KKyAqIEBzbGJfdnNpZF9SVzogQXJyYXkgb2Ygc2F2ZWQgU0xCIHZzaWQgZW50cmllcy4KKyAqCisgKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSB3aG9sZSBvZiB0aGUgU1BVCisgKiBjb250ZXh0IHNhdmUgYXJlYSAoQ1NBKS4gIFRoaXMgc3RydWN0IGNvbnRhaW5zCisgKiBhbGwgb2YgdGhlIHN0YXRlIG5lY2Vzc2FyeSB0byBzdXNwZW5kIGFuZCB0aGVuCisgKiBsYXRlciBvcHRpb25hbGx5IHJlc3VtZSBleGVjdXRpb24gb2YgYW4gU1BVCisgKiBjb250ZXh0LgorICoKKyAqIFRoZSBAbHNjc2EgcmVnaW9uIGlzIGJ5IGZhciB0aGUgbGFyZ2VzdCwgYW5kIGlzCisgKiBhbGxvY2F0ZWQgc2VwYXJhdGVseSBzbyB0aGF0IGl0IG1heSBlaXRoZXIgYmUKKyAqIHBpbm5lZCBvciBtYXBwZWQgdG8vZnJvbSBhcHBsaWNhdGlvbiBtZW1vcnksIGFzCisgKiBhcHByb3ByaWF0ZSBmb3IgdGhlIE9TIGVudmlyb25tZW50LgorICovCitzdHJ1Y3Qgc3B1X3N0YXRlIHsKKwlzdHJ1Y3Qgc3B1X2xzY3NhICpsc2NzYTsKKwlzdHJ1Y3Qgc3B1X3Byb2JsZW1fY29sbGFwc2VkIHByb2I7CisJc3RydWN0IHNwdV9wcml2MV9jb2xsYXBzZWQgcHJpdjE7CisJc3RydWN0IHNwdV9wcml2Ml9jb2xsYXBzZWQgcHJpdjI7CisJdTY0IHNwdV9jaG5sY250X1JXWzMyXTsKKwl1NjQgc3B1X2NobmxkYXRhX1JXWzMyXTsKKwl1MzIgc3B1X21haWxib3hfZGF0YVs0XTsKKwl1MzIgcHVfbWFpbGJveF9kYXRhWzFdOworCXVuc2lnbmVkIGxvbmcgc3VzcGVuZF90aW1lOworCXU2NCBzbGJfZXNpZF9SV1s4XTsKKwl1NjQgc2xiX3ZzaWRfUldbOF07CisJc3BpbmxvY2tfdCByZWdpc3Rlcl9sb2NrOworfTsKKworZXh0ZXJuIHZvaWQgc3B1X2luaXRfY3NhKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSk7CitleHRlcm4gdm9pZCBzcHVfZmluaV9jc2Eoc3RydWN0IHNwdV9zdGF0ZSAqY3NhKTsKK2V4dGVybiBpbnQgc3B1X3NhdmUoc3RydWN0IHNwdV9zdGF0ZSAqcHJldiwgc3RydWN0IHNwdSAqc3B1KTsKK2V4dGVybiBpbnQgc3B1X3Jlc3RvcmUoc3RydWN0IHNwdV9zdGF0ZSAqbmV3LCBzdHJ1Y3Qgc3B1ICpzcHUpOworZXh0ZXJuIGludCBzcHVfc3dpdGNoKHN0cnVjdCBzcHVfc3RhdGUgKnByZXYsIHN0cnVjdCBzcHVfc3RhdGUgKm5ldywKKwkJICAgICAgc3RydWN0IHNwdSAqc3B1KTsKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisjZW5kaWYgLyogX1NQVV9DU0FfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3luY2guaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3luY2guaAppbmRleCA0NjYwYzAzLi5jOTBkOWQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5bmNoLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zeW5jaC5oCkBAIC0xLDcgKzEsOCBAQAogI2lmbmRlZiBfQVNNX1BPV0VSUENfU1lOQ0hfSCAKICNkZWZpbmUgX0FTTV9QT1dFUlBDX1NZTkNIX0ggCisjaWZkZWYgX19LRVJORUxfXwogCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CiAKICNpZmRlZiBfX3Bvd2VycGM2NF9fCiAjZGVmaW5lIF9fU1VCQVJDSF9IQVNfTFdTWU5DCkBAIC0xMywyMCArMTQsMTIgQEAKICMgICAgZGVmaW5lIExXU1lOQwlzeW5jCiAjZW5kaWYKIAotCi0vKgotICogQXJndWFibHkgdGhlIGJpdG9wcyBhbmQgKnhjaGcgb3BlcmF0aW9ucyBkb24ndCBpbXBseSBhbnkgbWVtb3J5IGJhcnJpZXIKLSAqIG9yIFNNUCBvcmRlcmluZywgYnV0IGluIGZhY3QgYSBsb3Qgb2YgZHJpdmVycyBleHBlY3QgdGhlbSB0byBpbXBseQotICogYm90aCwgc2luY2UgdGhleSBkbyBvbiB4ODYgY3B1cy4KLSAqLwogI2lmZGVmIENPTkZJR19TTVAKLSNkZWZpbmUgRUlFSU9fT05fU01QCSJlaWVpb1xuIgogI2RlZmluZSBJU1lOQ19PTl9TTVAJIlxuXHRpc3luYyIKLSNkZWZpbmUgU1lOQ19PTl9TTVAJX19zdHJpbmdpZnkoTFdTWU5DKSAiXG4iCisjZGVmaW5lIExXU1lOQ19PTl9TTVAJX19zdHJpbmdpZnkoTFdTWU5DKSAiXG4iCiAjZWxzZQotI2RlZmluZSBFSUVJT19PTl9TTVAKICNkZWZpbmUgSVNZTkNfT05fU01QCi0jZGVmaW5lIFNZTkNfT05fU01QCisjZGVmaW5lIExXU1lOQ19PTl9TTVAKICNlbmRpZgogCiBzdGF0aWMgaW5saW5lIHZvaWQgZWllaW8odm9pZCkKQEAgLTM5LDEzICszMiw1IEBACiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpc3luYyIgOiA6IDogIm1lbW9yeSIpOwogfQogCi0jaWZkZWYgQ09ORklHX1NNUAotI2RlZmluZSBlaWVpb19vbl9zbXAoKQllaWVpbygpCi0jZGVmaW5lIGlzeW5jX29uX3NtcCgpCWlzeW5jKCkKLSNlbHNlCi0jZGVmaW5lIGVpZWlvX29uX3NtcCgpCV9fYXNtX18gX192b2xhdGlsZV9fKCIiOiA6IDoibWVtb3J5IikKLSNkZWZpbmUgaXN5bmNfb25fc21wKCkJX19hc21fXyBfX3ZvbGF0aWxlX18oIiI6IDogOiJtZW1vcnkiKQotI2VuZGlmCi0KKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYJLyogX0FTTV9QT1dFUlBDX1NZTkNIX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzdGVtLmgKaW5kZXggNTM0MWI3NS4uZDliZjUzNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c3RlbS5oCkBAIC00LDcgKzQsNiBAQAogI2lmbmRlZiBfQVNNX1BPV0VSUENfU1lTVEVNX0gKICNkZWZpbmUgX0FTTV9QT1dFUlBDX1NZU1RFTV9ICiAKLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAogI2luY2x1ZGUgPGFzbS9od19pcnEuaD4KQEAgLTQyLDYgKzQxLDcgQEAKICNkZWZpbmUgc2V0X21iKHZhciwgdmFsdWUpCWRvIHsgdmFyID0gdmFsdWU7IG1iKCk7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHNldF93bWIodmFyLCB2YWx1ZSkJZG8geyB2YXIgPSB2YWx1ZTsgd21iKCk7IH0gd2hpbGUgKDApCiAKKyNpZmRlZiBfX0tFUk5FTF9fCiAjaWZkZWYgQ09ORklHX1NNUAogI2RlZmluZSBzbXBfbWIoKQltYigpCiAjZGVmaW5lIHNtcF9ybWIoKQlybWIoKQpAQCAtNTQsNyArNTQsNiBAQAogI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlkbyB7IH0gd2hpbGUoMCkKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKLSNpZmRlZiBfX0tFUk5FTF9fCiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7CiBzdHJ1Y3QgcHRfcmVnczsKIApAQCAtMTM0LDYgKzEzMywxNCBAQAogZXh0ZXJuIHZvaWQgY3Z0X2ZkKGZsb2F0ICpmcm9tLCBkb3VibGUgKnRvLCBzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdGhyZWFkKTsKIGV4dGVybiB2b2lkIGN2dF9kZihkb3VibGUgKmZyb20sIGZsb2F0ICp0bywgc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCk7CiAKKyNpZm5kZWYgQ09ORklHX1NNUAorZXh0ZXJuIHZvaWQgZGlzY2FyZF9sYXp5X2NwdV9zdGF0ZSh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzY2FyZF9sYXp5X2NwdV9zdGF0ZSh2b2lkKQoreworfQorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfQUxUSVZFQwogZXh0ZXJuIHZvaWQgZmx1c2hfYWx0aXZlY190b190aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICopOwogI2Vsc2UKQEAgLTE3Niw2ICsxODMsMTYgQEAKIGV4dGVybiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKl9zd2l0Y2goc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnByZXYsCiAJCQkJICAgc3RydWN0IHRocmVhZF9zdHJ1Y3QgKm5leHQpOwogCisvKgorICogT24gU01QIHN5c3RlbXMsIHdoZW4gdGhlIHNjaGVkdWxlciBkb2VzIG1pZ3JhdGlvbi1jb3N0IGF1dG9kZXRlY3Rpb24sCisgKiBpdCBuZWVkcyBhIHdheSB0byBmbHVzaCBhcyBtdWNoIG9mIHRoZSBDUFUncyBjYWNoZXMgYXMgcG9zc2libGUuCisgKgorICogVE9ETzogZmlsbCB0aGlzIGluIQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2NoZWRfY2FjaGVmbHVzaCh2b2lkKQoreworfQorCiBleHRlcm4gdW5zaWduZWQgaW50IHJ0YXNfZGF0YTsKIGV4dGVybiBpbnQgbWVtX2luaXRfZG9uZTsJLyogc2V0IG9uIGJvb3Qgb25jZSBrbWFsbG9jIGNhbiBiZSBjYWxsZWQgKi8KIGV4dGVybiB1bnNpZ25lZCBsb25nIG1lbW9yeV9saW1pdDsKQEAgLTE5NSw3ICsyMTIsNyBAQAogCXVuc2lnbmVkIGxvbmcgcHJldjsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCUVJRUlPX09OX1NNUAorCUxXU1lOQ19PTl9TTVAKICIxOglsd2FyeAklMCwwLCUyIFxuIgogCVBQQzQwNV9FUlI3NygwLCUyKQogIglzdHdjeC4JJTMsMCwlMiBcblwKQEAgLTIxNSw3ICsyMzIsNyBAQAogCXVuc2lnbmVkIGxvbmcgcHJldjsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCUVJRUlPX09OX1NNUAorCUxXU1lOQ19PTl9TTVAKICIxOglsZGFyeAklMCwwLCUyIFxuIgogCVBQQzQwNV9FUlI3NygwLCUyKQogIglzdGRjeC4JJTMsMCwlMiBcblwKQEAgLTI3MCw3ICsyODcsNyBAQAogCXVuc2lnbmVkIGludCBwcmV2OwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCUVJRUlPX09OX1NNUAorCUxXU1lOQ19PTl9TTVAKICIxOglsd2FyeAklMCwwLCUyCQkjIF9fY21weGNoZ191MzJcblwKIAljbXB3CTAsJTAsJTNcblwKIAlibmUtCTJmXG4iCkBAIC0yOTQsNyArMzExLDcgQEAKIAl1bnNpZ25lZCBsb25nIHByZXY7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0JRUlFSU9fT05fU01QCisJTFdTWU5DX09OX1NNUAogIjE6CWxkYXJ4CSUwLDAsJTIJCSMgX19jbXB4Y2hnX3U2NFxuXAogCWNtcGQJMCwlMCwlM1xuXAogCWJuZS0JMmZcblwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGNlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RjZS5oCmluZGV4IDk4MGEwOTQuLjZmYTIwMGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGNlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90Y2UuaApAQCAtMjAsNiArMjAsNyBAQAogCiAjaWZuZGVmIF9BU01fUE9XRVJQQ19UQ0VfSAogI2RlZmluZSBfQVNNX1BPV0VSUENfVENFX0gKKyNpZmRlZiBfX0tFUk5FTF9fCiAKIC8qCiAgKiBUY2VzIGNvbWUgaW4gdHdvIGZvcm1hdHMsIG9uZSBmb3IgdGhlIHZpcnR1YWwgYnVzIGFuZCBhIGRpZmZlcmVudApAQCAtNjEsNCArNjIsNSBAQAogfTsKIAogCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19UQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90aHJlYWRfaW5mby5oCmluZGV4IGU1MjVmNDkuLjY3Y2RhZjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RocmVhZF9pbmZvLmgKQEAgLTM3LDggKzM3LDcgQEAKIAlpbnQJCXByZWVtcHRfY291bnQ7CQkvKiAwID0+IHByZWVtcHRhYmxlLAogCQkJCQkJICAgPDAgPT4gQlVHICovCiAJc3RydWN0IHJlc3RhcnRfYmxvY2sgcmVzdGFydF9ibG9jazsKLQkvKiBzZXQgYnkgZm9yY2Vfc3VjY2Vzc2Z1bF9zeXNjYWxsX3JldHVybiAqLwotCXVuc2lnbmVkIGNoYXIJc3lzY2FsbF9ub2Vycm9yOworCXZvaWQgKm52Z3Byc19mcmFtZTsKIAkvKiBsb3cgbGV2ZWwgZmxhZ3MgLSBoYXMgYXRvbWljIG9wZXJhdGlvbnMgZG9uZSBvbiBpdCAqLwogCXVuc2lnbmVkIGxvbmcJZmxhZ3MgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKIH07CkBAIC05MCw5ICs4OSw2IEBACiAKICNlbmRpZiAvKiBUSFJFQURfU0hJRlQgPCBQQUdFX1NISUZUICovCiAKLSNkZWZpbmUgZ2V0X3RocmVhZF9pbmZvKHRpKQlnZXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKLSNkZWZpbmUgcHV0X3RocmVhZF9pbmZvKHRpKQlwdXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKLQogLyogaG93IHRvIGdldCB0aGUgdGhyZWFkIGluZm9ybWF0aW9uIHN0cnVjdCBmcm9tIEMgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRocmVhZF9pbmZvICpjdXJyZW50X3RocmVhZF9pbmZvKHZvaWQpCiB7CkBAIC0xMjMsNiArMTE5LDEwIEBACiAjZGVmaW5lIFRJRl9TSU5HTEVTVEVQCQk5CS8qIHNpbmdsZXN0ZXBwaW5nIGFjdGl2ZSAqLwogI2RlZmluZSBUSUZfTUVNRElFCQkxMAogI2RlZmluZSBUSUZfU0VDQ09NUAkJMTEJLyogc2VjdXJlIGNvbXB1dGluZyAqLworI2RlZmluZSBUSUZfUkVTVE9SRUFMTAkJMTIJLyogUmVzdG9yZSBhbGwgcmVncyAoaW1wbGllcyBOT0VSUk9SKSAqLworI2RlZmluZSBUSUZfU0FWRV9OVkdQUlMJCTEzCS8qIFNhdmUgcjE0LXIzMSBpbiBzaWduYWwgZnJhbWUgKi8KKyNkZWZpbmUgVElGX05PRVJST1IJCTE0CS8qIEZvcmNlIHN1Y2Nlc3NmdWwgc3lzY2FsbCByZXR1cm4gKi8KKyNkZWZpbmUgVElGX1JFU1RPUkVfU0lHTUFTSwkxNQkvKiBSZXN0b3JlIHNpZ25hbCBtYXNrIGluIGRvX3NpZ25hbCAqLwogCiAvKiBhcyBhYm92ZSwgYnV0IGFzIGJpdCB2YWx1ZXMgKi8KICNkZWZpbmUgX1RJRl9TWVNDQUxMX1RSQUNFCSgxPDxUSUZfU1lTQ0FMTF9UUkFDRSkKQEAgLTEzNiwxMCArMTM2LDE2IEBACiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9BVURJVAkoMTw8VElGX1NZU0NBTExfQVVESVQpCiAjZGVmaW5lIF9USUZfU0lOR0xFU1RFUAkJKDE8PFRJRl9TSU5HTEVTVEVQKQogI2RlZmluZSBfVElGX1NFQ0NPTVAJCSgxPDxUSUZfU0VDQ09NUCkKKyNkZWZpbmUgX1RJRl9SRVNUT1JFQUxMCQkoMTw8VElGX1JFU1RPUkVBTEwpCisjZGVmaW5lIF9USUZfU0FWRV9OVkdQUlMJKDE8PFRJRl9TQVZFX05WR1BSUykKKyNkZWZpbmUgX1RJRl9OT0VSUk9SCQkoMTw8VElGX05PRVJST1IpCisjZGVmaW5lIF9USUZfUkVTVE9SRV9TSUdNQVNLCSgxPDxUSUZfUkVTVE9SRV9TSUdNQVNLKQogI2RlZmluZSBfVElGX1NZU0NBTExfVF9PUl9BCShfVElGX1NZU0NBTExfVFJBQ0V8X1RJRl9TWVNDQUxMX0FVRElUfF9USUZfU0VDQ09NUCkKIAogI2RlZmluZSBfVElGX1VTRVJfV09SS19NQVNLCShfVElGX05PVElGWV9SRVNVTUUgfCBfVElGX1NJR1BFTkRJTkcgfCBcCi0JCQkJIF9USUZfTkVFRF9SRVNDSEVEKQorCQkJCSBfVElGX05FRURfUkVTQ0hFRCB8IF9USUZfUkVTVE9SRUFMTCB8IFwKKwkJCQkgX1RJRl9SRVNUT1JFX1NJR01BU0spCisjZGVmaW5lIF9USUZfUEVSU1lTQ0FMTF9NQVNLCShfVElGX1JFU1RPUkVBTEx8X1RJRl9OT0VSUk9SfF9USUZfU0FWRV9OVkdQUlMpCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGltZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90aW1lLmgKaW5kZXggZDliODZhMS4uYmFkZGM5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy90aW1lLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90aW1lLmgKQEAgLTE3NSwxMSArMTc1LDEwIEBACiAJc2V0X2RlY19jcHU2KHZhbCk7CiAjZWxzZQogI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwotCXN0cnVjdCBwYWNhX3N0cnVjdCAqbHBhY2EgPSBnZXRfcGFjYSgpOwogCWludCBjdXJfZGVjOwogCi0JaWYgKGxwYWNhLT5scHBhY2Euc2hhcmVkX3Byb2MpIHsKLQkJbHBhY2EtPmxwcGFjYS52aXJ0dWFsX2RlY3IgPSB2YWw7CisJaWYgKGdldF9scHBhY2EoKS0+c2hhcmVkX3Byb2MpIHsKKwkJZ2V0X2xwcGFjYSgpLT52aXJ0dWFsX2RlY3IgPSB2YWw7CiAJCWN1cl9kZWMgPSBnZXRfZGVjKCk7CiAJCWlmIChjdXJfZGVjID4gdmFsKQogCQkJSHZDYWxsX3NldFZpcnR1YWxEZWNyKCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RsYi5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90bGIuaAppbmRleCA1NjY1OWYxLi42MDFhNTNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RsYi5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGxiLmgKQEAgLTExLDYgKzExLDcgQEAKICAqLwogI2lmbmRlZiBfQVNNX1BPV0VSUENfVExCX0gKICNkZWZpbmUgX0FTTV9QT1dFUlBDX1RMQl9ICisjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaWZuZGVmIF9fcG93ZXJwYzY0X18KQEAgLTY3LDQgKzY4LDUgQEAKIH0KIAogI2VuZGlmCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fQVNNX1BPV0VSUENfVExCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdG9wb2xvZ3kuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdG9wb2xvZ3kuaAppbmRleCBkYjgwOTVjLi4xZTE5Y2QwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RvcG9sb2d5LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90b3BvbG9neS5oCkBAIC0xLDUgKzEsNiBAQAogI2lmbmRlZiBfQVNNX1BPV0VSUENfVE9QT0xPR1lfSAogI2RlZmluZSBfQVNNX1BPV0VSUENfVE9QT0xPR1lfSAorI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogCkBAIC0zOCw3ICszOSw2IEBACiAJLm1heF9pbnRlcnZhbAkJPSAzMiwJCQlcCiAJLmJ1c3lfZmFjdG9yCQk9IDMyLAkJCVwKIAkuaW1iYWxhbmNlX3BjdAkJPSAxMjUsCQkJXAotCS5jYWNoZV9ob3RfdGltZQkJPSAoMTAqMTAwMDAwMCksCQlcCiAJLmNhY2hlX25pY2VfdHJpZXMJPSAxLAkJCVwKIAkucGVyX2NwdV9nYWluCQk9IDEwMCwJCQlcCiAJLmJ1c3lfaWR4CQk9IDMsCQkJXApAQCAtNTUsMTAgKzU1LDE1IEBACiAJLm5yX2JhbGFuY2VfZmFpbGVkCT0gMCwJCQlcCiB9CiAKK2V4dGVybiB2b2lkIF9faW5pdCBkdW1wX251bWFfY3B1X3RvcG9sb2d5KHZvaWQpOworCiAjZWxzZQogCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9udW1hX2NwdV90b3BvbG9neSh2b2lkKSB7fQorCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdG9wb2xvZ3kuaD4KIAogI2VuZGlmIC8qIENPTkZJR19OVU1BICovCiAKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYJLyogX0FTTV9QT1dFUlBDX1RPUE9MT0dZX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdWRiZy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy91ZGJnLmgKaW5kZXggYTM4MzM4My4uNWM0MjM2YzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdWRiZy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdWRiZy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGMgMjAwMSBQUEMgNjQgVGVhbSwgSUJNIENvcnAKKyAqIChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbi4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQpAQCAtOSwxMiArOSwxMyBAQAogCiAjaWZuZGVmIF9BU01fUE9XRVJQQ19VREJHX0gKICNkZWZpbmUgX0FTTV9QT1dFUlBDX1VEQkdfSAorI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCi1leHRlcm4gdm9pZCAoKnVkYmdfcHV0YykodW5zaWduZWQgY2hhciBjKTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyICgqdWRiZ19nZXRjKSh2b2lkKTsKK2V4dGVybiB2b2lkICgqdWRiZ19wdXRjKShjaGFyIGMpOworZXh0ZXJuIGludCAoKnVkYmdfZ2V0Yykodm9pZCk7CiBleHRlcm4gaW50ICgqdWRiZ19nZXRjX3BvbGwpKHZvaWQpOwogCiBleHRlcm4gdm9pZCB1ZGJnX3B1dHMoY29uc3QgY2hhciAqcyk7CkBAIC0yMyw5ICsyNCwyNCBAQAogCiBleHRlcm4gdm9pZCByZWdpc3Rlcl9lYXJseV91ZGJnX2NvbnNvbGUodm9pZCk7CiBleHRlcm4gdm9pZCB1ZGJnX3ByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gdm9pZCB1ZGJnX3Byb2dyZXNzKGNoYXIgKnMsIHVuc2lnbmVkIHNob3J0IGhleCk7CiAKLWV4dGVybiB2b2lkIHVkYmdfaW5pdF91YXJ0KHZvaWQgX19pb21lbSAqY29tcG9ydCwgdW5zaWduZWQgaW50IHNwZWVkKTsKK2V4dGVybiB2b2lkIHVkYmdfaW5pdF91YXJ0KHZvaWQgX19pb21lbSAqY29tcG9ydCwgdW5zaWduZWQgaW50IHNwZWVkLAorCQkJICAgdW5zaWduZWQgaW50IGNsb2NrKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgdWRiZ19wcm9iZV91YXJ0X3NwZWVkKHZvaWQgX19pb21lbSAqY29tcG9ydCwKKwkJCQkJICB1bnNpZ25lZCBpbnQgY2xvY2spOwogCiBzdHJ1Y3QgZGV2aWNlX25vZGU7Ci1leHRlcm4gdm9pZCB1ZGJnX2luaXRfc2NjKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOworZXh0ZXJuIHZvaWQgdWRiZ19zY2NfaW5pdChpbnQgZm9yY2Vfc2NjKTsKK2V4dGVybiBpbnQgdWRiZ19hZGJfaW5pdChpbnQgZm9yY2VfYnRleHQpOworZXh0ZXJuIHZvaWQgdWRiZ19hZGJfaW5pdF9lYXJseSh2b2lkKTsKKworZXh0ZXJuIHZvaWQgX19pbml0IHVkYmdfZWFybHlfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIF9faW5pdCB1ZGJnX2luaXRfZGVidWdfbHBhcih2b2lkKTsKK2V4dGVybiB2b2lkIF9faW5pdCB1ZGJnX2luaXRfcG1hY19yZWFsbW9kZSh2b2lkKTsKK2V4dGVybiB2b2lkIF9faW5pdCB1ZGJnX2luaXRfbWFwbGVfcmVhbG1vZGUodm9pZCk7CitleHRlcm4gdm9pZCBfX2luaXQgdWRiZ19pbml0X2lzZXJpZXModm9pZCk7CitleHRlcm4gdm9pZCBfX2luaXQgdWRiZ19pbml0X3J0YXModm9pZCk7CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX1VEQkdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdW5pc3RkLmgKaW5kZXggMDk5MWRmYy4uYTQwY2RmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3VuaXN0ZC5oCkBAIC0yOTYsOCArMjk2LDEyIEBACiAjZGVmaW5lIF9fTlJfaW5vdGlmeV9pbml0CTI3NQogI2RlZmluZSBfX05SX2lub3RpZnlfYWRkX3dhdGNoCTI3NgogI2RlZmluZSBfX05SX2lub3RpZnlfcm1fd2F0Y2gJMjc3CisjZGVmaW5lIF9fTlJfc3B1X3J1bgkJMjc4CisjZGVmaW5lIF9fTlJfc3B1X2NyZWF0ZQkJMjc5CisjZGVmaW5lIF9fTlJfcHNlbGVjdDYJCTI4MAorI2RlZmluZSBfX05SX3Bwb2xsCQkyODEKIAotI2RlZmluZSBfX05SX3N5c2NhbGxzCQkyNzgKKyNkZWZpbmUgX19OUl9zeXNjYWxscwkJMjgyCiAKICNpZmRlZiBfX0tFUk5FTF9fCiAjZGVmaW5lIF9fTlJfX2V4aXQgX19OUl9leGl0CkBAIC00NDIsMTEgKzQ0NiwxMyBAQAogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHUEVORElORwogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHUFJPQ01BU0sKICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1JUX1NJR0FDVElPTgorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfUlRfU0lHU1VTUEVORAogI2lmZGVmIENPTkZJR19QUEMzMgogI2RlZmluZSBfX0FSQ0hfV0FOVF9PTERfU1RBVAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1BQQzY0CiAjZGVmaW5lIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfVElNRQorI2RlZmluZSBfX0FSQ0hfV0FOVF9DT01QQVRfU1lTX1JUX1NJR1NVU1BFTkQKICNlbmRpZgogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy92ZHNvX2RhdGFwYWdlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Zkc29fZGF0YXBhZ2UuaAppbmRleCA0MTE4MzJkLi43YWE5MjA4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Zkc29fZGF0YXBhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Zkc29fZGF0YXBhZ2UuaApAQCAtMSw1ICsxLDYgQEAKICNpZm5kZWYgX1ZEU09fREFUQVBBR0VfSAogI2RlZmluZSBfVkRTT19EQVRBUEFHRV9ICisjaWZkZWYgX19LRVJORUxfXwogCiAvKgogICogQ29weXJpZ2h0IChDKSAyMDAyIFBldGVyIEJlcmduZXIgPGJlcmduZXJAdm5ldC5pYm0uY29tPiwgSUJNCkBAIC0xMDUsNCArMTA2LDUgQEAKIAogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9TWVNURU1DRkdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy92aW8uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdmlvLmgKaW5kZXggZTBjY2YxMC4uMDU0NGVjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy92aW8uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Zpby5oCkBAIC0xMyw2ICsxMyw3IEBACiAKICNpZm5kZWYgX0FTTV9QT1dFUlBDX1ZJT19ICiAjZGVmaW5lIF9BU01fUE9XRVJQQ19WSU9fSAorI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTEwMyw0ICsxMDQsNSBAQAogCXJldHVybiBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdmlvX2RldiwgZGV2KTsKIH0KIAorI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfVklPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9ic2VpcC5oIGIvaW5jbHVkZS9hc20tcHBjL2JzZWlwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MWY0YTUyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXBwYy9ic2VpcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIEEgY29sbGVjdGlvbiBvZiBzdHJ1Y3R1cmVzLCBhZGRyZXNzZXMsIGFuZCB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoCi0gKiB0aGUgQnJpZ2h0IFN0YXIgRW5naW5lZXJpbmcgaXAtRW5naW5lIGJvYXJkLiAgQ29waWVkIGZyb20gdGhlIE1CWCBzdHVmZi4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTggRGFuIE1hbGVrIChkbWFsZWtAamxjLm5ldCkKLSAqLwotI2lmbmRlZiBfX01BQ0hfQlNFSVBfREVGUwotI2RlZmluZSBfX01BQ0hfQlNFSVBfREVGUwotCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotLyogQSBCb2FyZCBJbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgdGhhdCBpcyBnaXZlbiB0byBhIHByb2dyYW0gd2hlbgotICogcHJvbSBzdGFydHMgaXQgdXAuCi0gKi8KLXR5cGVkZWYgc3RydWN0IGJkX2luZm8gewotCXVuc2lnbmVkIGludAliaV9tZW1zdGFydDsJLyogTWVtb3J5IHN0YXJ0IGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBpbnQJYmlfbWVtc2l6ZTsJLyogTWVtb3J5IChlbmQpIHNpemUgaW4gYnl0ZXMgKi8KLQl1bnNpZ25lZCBpbnQJYmlfaW50ZnJlcTsJLyogSW50ZXJuYWwgRnJlcSwgaW4gSHogKi8KLQl1bnNpZ25lZCBpbnQJYmlfYnVzZnJlcTsJLyogQnVzIEZyZXEsIGluIEh6ICovCi0JdW5zaWduZWQgY2hhcgliaV9lbmV0YWRkcls2XTsKLQl1bnNpZ25lZCBpbnQJYmlfYmF1ZHJhdGU7Ci19IGJkX3Q7Ci0KLWV4dGVybiBiZF90IG04eHhfYm9hcmRfaW5mbzsKLQotLyogTWVtb3J5IG1hcCBpcyBjb25maWd1cmVkIGJ5IHRoZSBQUk9NIHN0YXJ0dXAuCi0gKiBBbGwgd2UgbmVlZCB0byBnZXQgc3RhcnRlZCBpcyB0aGUgSU1NUi4KLSAqLwotI2RlZmluZSBJTUFQX0FERFIJCSgodWludCkweGZmMDAwMDAwKQotI2RlZmluZSBJTUFQX1NJWkUJCSgodWludCkoNjQgKiAxMDI0KSkKLSNkZWZpbmUgUENNQ0lBX01FTV9BRERSCQkoKHVpbnQpMHgwNDAwMDAwMCkKLSNkZWZpbmUgUENNQ0lBX01FTV9TSVpFCQkoKHVpbnQpKDY0ICogMTAyNCkpCi0jZW5kaWYJLyogIV9fQVNTRU1CTFlfXyAqLwotCi0vKiBXZSBkb24ndCB1c2UgdGhlIDgyNTkuCi0qLwotI2RlZmluZSBOUl84MjU5X0lOVFMJMAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9idGV4dC5oIGIvaW5jbHVkZS9hc20tcHBjL2J0ZXh0LmgKaW5kZXggY2NhZWZhYi4uZWQzNjMwMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL2J0ZXh0LmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL2J0ZXh0LmgKQEAgLTE3LDcgKzE3LDcgQEAKIGV4dGVybiBib290X2luZm9zX3QgZGlzcF9iaTsKIGV4dGVybiBpbnQgYm9vdF90ZXh0X21hcHBlZDsKIAotZXh0ZXJuIHZvaWQgaW5pdF9ib290X2Rpc3BsYXkodm9pZCk7CitleHRlcm4gdm9pZCBidGV4dF9pbml0KGJvb3RfaW5mb3NfdCAqYmkpOwogZXh0ZXJuIHZvaWQgYnRleHRfd2VsY29tZSh2b2lkKTsKIGV4dGVybiB2b2lkIGJ0ZXh0X3ByZXBhcmVfQkFUKHZvaWQpOwogZXh0ZXJuIHZvaWQgYnRleHRfc2V0dXBfZGlzcGxheShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgaW50IHBpdGNoLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL21hY2hkZXAuaCBiL2luY2x1ZGUvYXNtLXBwYy9tYWNoZGVwLmgKaW5kZXggZjAxMjU1Yi4uMzkyMDBkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL21hY2hkZXAuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvbWFjaGRlcC5oCkBAIC0zNSw4ICszNSwxMCBAQAogCWludAkJKCpnZXRfaXJxKShzdHJ1Y3QgcHRfcmVncyAqKTsKIAkKIAkvKiBBIGdlbmVyYWwgaW5pdCBmdW5jdGlvbiwgY2FsbGVkIGJ5IHBwY19pbml0IGluIGluaXQvbWFpbi5jLgotCSAgIE1heSBiZSBOVUxMLiAqLworCSAgIE1heSBiZSBOVUxMLiBERVBSRUNBVEVEICEgKi8KIAl2b2lkCQkoKmluaXQpKHZvaWQpOworCS8qIEZvciBjb21wYXRpYmlsaXR5IHdpdGggbWVyZ2VkIHBsYXRmb3JtcyAqLworCXZvaWQJCSgqaW5pdF9lYXJseSkodm9pZCk7CiAKIAl2b2lkCQkoKnJlc3RhcnQpKGNoYXIgKmNtZCk7CiAJdm9pZAkJKCpwb3dlcl9vZmYpKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL21wYzg1eHguaCBiL2luY2x1ZGUvYXNtLXBwYy9tcGM4NXh4LmgKaW5kZXggOWQxNGJhZS4uYzhhOTZhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL21wYzg1eHguaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvbXBjODV4eC5oCkBAIC0zNyw2ICszNywxMCBAQAogI2lmZGVmIENPTkZJR19TVFhfR1AzCiAjaW5jbHVkZSA8cGxhdGZvcm1zLzg1eHgvc3R4X2dwMy5oPgogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfVFFNODU0MCkgfHwgZGVmaW5lZChDT05GSUdfVFFNODU0MSkgfHwgXAorCWRlZmluZWQoQ09ORklHX1RRTTg1NTUpIHx8IGRlZmluZWQoQ09ORklHX1RRTTg1NjApCisjaW5jbHVkZSA8cGxhdGZvcm1zLzg1eHgvdHFtODV4eC5oPgorI2VuZGlmCiAKICNkZWZpbmUgX0lPX0JBU0UgICAgICAgIGlzYV9pb19iYXNlCiAjZGVmaW5lIF9JU0FfTUVNX0JBU0UgICBpc2FfbWVtX2Jhc2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9wY2ktYnJpZGdlLmggYi9pbmNsdWRlL2FzbS1wcGMvcGNpLWJyaWRnZS5oCmluZGV4IGU1OGM3OGYuLjlkNTIzMDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9wY2ktYnJpZGdlLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL3BjaS1icmlkZ2UuaApAQCAtMTM3LDUgKzEzNywxNCBAQAogICovCiBleHRlcm4gaW50IHBjaWF1dG9fYnVzX3NjYW4oc3RydWN0IHBjaV9jb250cm9sbGVyICosIGludCk7CiAKKyNpZmRlZiBDT05GSUdfUENJCitleHRlcm4gdW5zaWduZWQgbG9uZyBwY2lfYWRkcmVzc190b19waW8ocGh5c19hZGRyX3QgYWRkcmVzcyk7CisjZWxzZQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBjaV9hZGRyZXNzX3RvX3BpbyhwaHlzX2FkZHJfdCBhZGRyZXNzKQoreworCXJldHVybiAodW5zaWduZWQgbG9uZyktMTsKK30KKyNlbmRpZgorCiAjZW5kaWYKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvcHJvbS5oIGIvaW5jbHVkZS9hc20tcHBjL3Byb20uaAppbmRleCAzZTM5ODI3Li42ZDQzMWQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvcHJvbS5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9wcm9tLmgKQEAgLTEzNiw1ICsxMzYsNDUgQEAKICNkZWZpbmUgUFRSUkVMT0MoeCkJKCh0eXBlb2YoeCkpYWRkX3JlbG9jX29mZnNldCgodW5zaWduZWQgbG9uZykoeCkpKQogI2RlZmluZSBQVFJVTlJFTE9DKHgpCSgodHlwZW9mKHgpKXN1Yl9yZWxvY19vZmZzZXQoKHVuc2lnbmVkIGxvbmcpKHgpKSkKIAorCisvKgorICogT0YgYWRkcmVzcyByZXRyZWl2YWwgJiB0cmFuc2xhdGlvbgorICovCisKKworLyogVHJhbnNsYXRlIGFuIE9GIGFkZHJlc3MgYmxvY2sgaW50byBhIENQVSBwaHlzaWNhbCBhZGRyZXNzCisgKi8KKyNkZWZpbmUgT0ZfQkFEX0FERFIJKCh1NjQpLTEpCitleHRlcm4gdTY0IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHUzMiAqYWRkcik7CisKKy8qIEV4dHJhY3QgYW4gYWRkcmVzcyBmcm9tIGEgZGV2aWNlLCByZXR1cm5zIHRoZSByZWdpb24gc2l6ZSBhbmQKKyAqIHRoZSBhZGRyZXNzIHNwYWNlIGZsYWdzIHRvby4gVGhlIFBDSSB2ZXJzaW9uIHVzZXMgYSBCQVIgbnVtYmVyCisgKiBpbnN0ZWFkIG9mIGFuIGFic29sdXRlIGluZGV4CisgKi8KK2V4dGVybiB1MzIgKm9mX2dldF9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgaW5kZXgsCisJCQkgICB1NjQgKnNpemUsIHVuc2lnbmVkIGludCAqZmxhZ3MpOworZXh0ZXJuIHUzMiAqb2ZfZ2V0X3BjaV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgYmFyX25vLAorCQkJICAgICAgIHU2NCAqc2l6ZSwgdW5zaWduZWQgaW50ICpmbGFncyk7CisKKy8qIEdldCBhbiBhZGRyZXNzIGFzIGEgcmVzb3VyY2UuIE5vdGUgdGhhdCBpZiB5b3VyIGFkZHJlc3MgaXMKKyAqIGEgUElPIGFkZHJlc3MsIHRoZSBjb252ZXJzaW9uIHdpbGwgZmFpbCBpZiB0aGUgcGh5c2ljYWwgYWRkcmVzcworICogY2FuJ3QgYmUgaW50ZXJuYWxseSBjb252ZXJ0ZWQgdG8gYW4gSU8gdG9rZW4gd2l0aAorICogcGNpX2FkZHJlc3NfdG9fcGlvKCksIHRoYXQgaXMgYmVjYXVzZSBpdCdzIGVpdGhlciBjYWxsZWQgdG8gZWFybHkKKyAqIG9yIGl0IGNhbid0IGJlIG1hdGNoZWQgdG8gYW55IGhvc3QgYnJpZGdlIElPIHNwYWNlCisgKi8KK2V4dGVybiBpbnQgb2ZfYWRkcmVzc190b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGluZGV4LAorCQkJCSAgc3RydWN0IHJlc291cmNlICpyKTsKK2V4dGVybiBpbnQgb2ZfcGNpX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBiYXIsCisJCQkJICAgICAgc3RydWN0IHJlc291cmNlICpyKTsKKworI2lmbmRlZiBDT05GSUdfUFBDX09GCisvKgorICogRmFsbGJhY2sgZGVmaW5pdGlvbnMgZm9yIGJ1aWxkcyB3aGVyZSB3ZSBkb24ndCBoYXZlIHByb20uYyBpbmNsdWRlZC4KKyAqLworI2RlZmluZSBtYWNoaW5lX2lzX2NvbXBhdGlibGUoeCkJCTAKKyNkZWZpbmUgb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoZiwgdCwgYykJTlVMTAorI2RlZmluZSBnZXRfcHJvcGVydHkocCwgbiwgbCkJCQlOVUxMCisjZW5kaWYKKwogI2VuZGlmIC8qIF9QUENfUFJPTV9IICovCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tcHBjL3N5c3RlbS5oCmluZGV4IGJkOTljYjUuLmZiNDljMGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvc3lzdGVtLmgKQEAgLTQsNyArNCw2IEBACiAjaWZuZGVmIF9fUFBDX1NZU1RFTV9ICiAjZGVmaW5lIF9fUFBDX1NZU1RFTV9ICiAKLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KQEAgLTM5LDcgKzM4LDcgQEAKICNpZmRlZiBDT05GSUdfU01QCiAjZGVmaW5lIHNtcF9tYigpCW1iKCkKICNkZWZpbmUgc21wX3JtYigpCXJtYigpCi0jZGVmaW5lIHNtcF93bWIoKQl3bWIoKQorI2RlZmluZSBzbXBfd21iKCkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIgOiA6IDogIm1lbW9yeSIpCiAjZGVmaW5lIHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpCXJlYWRfYmFycmllcl9kZXBlbmRzKCkKICNlbHNlCiAjZGVmaW5lIHNtcF9tYigpCWJhcnJpZXIoKQpAQCAtNzQsNiArNzMsNyBAQAogZXh0ZXJuIHZvaWQgcmVhZF9ydGNfdGltZSh2b2lkKTsKIGV4dGVybiB2b2lkIHBtYWNfZmluZF9kaXNwbGF5KHZvaWQpOwogZXh0ZXJuIHZvaWQgZ2l2ZXVwX2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CitleHRlcm4gdm9pZCBkaXNhYmxlX2tlcm5lbF9mcCh2b2lkKTsKIGV4dGVybiB2b2lkIGVuYWJsZV9rZXJuZWxfZnAodm9pZCk7CiBleHRlcm4gdm9pZCBmbHVzaF9mcF90b190aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICopOwogZXh0ZXJuIHZvaWQgZW5hYmxlX2tlcm5lbF9hbHRpdmVjKHZvaWQpOwpAQCAtODYsNiArODYsMTQgQEAKIGV4dGVybiB2b2lkIGN2dF9mZChmbG9hdCAqZnJvbSwgZG91YmxlICp0bywgc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCk7CiBleHRlcm4gdm9pZCBjdnRfZGYoZG91YmxlICpmcm9tLCBmbG9hdCAqdG8sIHN0cnVjdCB0aHJlYWRfc3RydWN0ICp0aHJlYWQpOwogCisjaWZuZGVmIENPTkZJR19TTVAKK2V4dGVybiB2b2lkIGRpc2NhcmRfbGF6eV9jcHVfc3RhdGUodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGRpc2NhcmRfbGF6eV9jcHVfc3RhdGUodm9pZCkKK3sKK30KKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX0FMVElWRUMKIGV4dGVybiB2b2lkIGZsdXNoX2FsdGl2ZWNfdG9fdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKICNlbHNlCkBAIC0xMjMsNiArMTMxLDE2IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICopOwogI2RlZmluZSBzd2l0Y2hfdG8ocHJldiwgbmV4dCwgbGFzdCkJKChsYXN0KSA9IF9fc3dpdGNoX3RvKChwcmV2KSwgKG5leHQpKSkKIAorLyoKKyAqIE9uIFNNUCBzeXN0ZW1zLCB3aGVuIHRoZSBzY2hlZHVsZXIgZG9lcyBtaWdyYXRpb24tY29zdCBhdXRvZGV0ZWN0aW9uLAorICogaXQgbmVlZHMgYSB3YXkgdG8gZmx1c2ggYXMgbXVjaCBvZiB0aGUgQ1BVJ3MgY2FjaGVzIGFzIHBvc3NpYmxlLgorICoKKyAqIFRPRE86IGZpbGwgdGhpcyBpbiEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNjaGVkX2NhY2hlZmx1c2godm9pZCkKK3sKK30KKwogc3RydWN0IHRocmVhZF9zdHJ1Y3Q7CiBleHRlcm4gc3RydWN0IHRhc2tfc3RydWN0ICpfc3dpdGNoKHN0cnVjdCB0aHJlYWRfc3RydWN0ICpwcmV2LAogCQkJCSAgIHN0cnVjdCB0aHJlYWRfc3RydWN0ICpuZXh0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1zMzkwL2F0b21pYy5oCmluZGV4IGQ4MmFlZGYuLmJlNmZlZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9hdG9taWMuaApAQCAtNzUsNiArNzUsOCBAQAogCSAgICAgICBfX0NTX0xPT1AodiwgbWFzaywgIm9yIik7CiB9CiAKKyNkZWZpbmUgYXRvbWljX3hjaGcodiwgbmV3KSAoeGNoZygmKCh2KS0+Y291bnRlciksIG5ldykpCisKIHN0YXRpYyBfX2lubGluZV9fIGludCBhdG9taWNfY21weGNoZyhhdG9taWNfdCAqdiwgaW50IG9sZCwgaW50IG5ldykKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygiICBjcyAgICUwLCUzLDAoJTIpXG4iCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2NhY2hlLmggYi9pbmNsdWRlL2FzbS1zMzkwL2NhY2hlLmgKaW5kZXggMjk4NDUzNy4uZTIwY2RkOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9jYWNoZS5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvY2FjaGUuaApAQCAtMTMsNyArMTMsNiBAQAogCiAjZGVmaW5lIEwxX0NBQ0hFX0JZVEVTICAgICAyNTYKICNkZWZpbmUgTDFfQ0FDSEVfU0hJRlQgICAgIDgKLSNkZWZpbmUgTDFfQ0FDSEVfU0hJRlRfTUFYIDgJLyogbGFyZ2VzdCBMMSB3aGljaCB0aGlzIGFyY2ggc3VwcG9ydHMgKi8KIAogI2RlZmluZSBBUkNIX0tNQUxMT0NfTUlOQUxJR04JOAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2VsZi5oIGIvaW5jbHVkZS9hc20tczM5MC9lbGYuaAppbmRleCAzNzJkNTFjLi43MTA2NDZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL2VsZi5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvZWxmLmgKQEAgLTE2Myw3ICsxNjMsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBkdW1wX3Rhc2tfcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgZWxmX2dyZWdzZXRfdCAqcmVncykKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcHRyZWdzID0gX19LU1RLX1BUUkVHUyh0c2spOworCXN0cnVjdCBwdF9yZWdzICpwdHJlZ3MgPSB0YXNrX3B0X3JlZ3ModHNrKTsKIAltZW1jcHkoJnJlZ3MtPnBzdywgJnB0cmVncy0+cHN3LCBzaXplb2YocmVncy0+cHN3KStzaXplb2YocmVncy0+Z3BycykpOwogCW1lbWNweShyZWdzLT5hY3JzLCB0c2stPnRocmVhZC5hY3JzLCBzaXplb2YocmVncy0+YWNycykpOwogCXJlZ3MtPm9yaWdfZ3ByMiA9IHB0cmVncy0+b3JpZ19ncHIyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9mdXRleC5oIGIvaW5jbHVkZS9hc20tczM5MC9mdXRleC5oCmluZGV4IDlmZWZmNGNlLi42YTMzMmE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL2Z1dGV4LmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9mdXRleC5oCkBAIC0xLDUzICsxLDYgQEAKICNpZm5kZWYgX0FTTV9GVVRFWF9ICiAjZGVmaW5lIF9BU01fRlVURVhfSAogCi0jaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2Z1dGV4Lmg+CiAKLSNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1mdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCi17Ci0JaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKLQlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7Ci0JaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7Ci0JaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKLQlpbnQgb2xkdmFsID0gMCwgcmV0OwotCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKLQkJb3BhcmcgPSAxIDw8IG9wYXJnOwotCi0JaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaW5jX3ByZWVtcHRfY291bnQoKTsKLQotCXN3aXRjaCAob3ApIHsKLQljYXNlIEZVVEVYX09QX1NFVDoKLQljYXNlIEZVVEVYX09QX0FERDoKLQljYXNlIEZVVEVYX09QX09SOgotCWNhc2UgRlVURVhfT1BfQU5ETjoKLQljYXNlIEZVVEVYX09QX1hPUjoKLQlkZWZhdWx0OgotCQlyZXQgPSAtRU5PU1lTOwotCX0KLQotCWRlY19wcmVlbXB0X2NvdW50KCk7Ci0KLQlpZiAoIXJldCkgewotCQlzd2l0Y2ggKGNtcCkgewotCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKLQkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0jZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9pb2N0bC5oIGIvaW5jbHVkZS9hc20tczM5MC9pb2N0bC5oCmluZGV4IGRmNzM5NDMuLmIyNzlmZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvaW9jdGwuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL2lvY3RsLmgKQEAgLTEsODggKzEgQEAKLS8qCi0gKiAgaW5jbHVkZS9hc20tczM5MC9pb2N0bC5oCi0gKgotICogIFMzOTAgdmVyc2lvbgotICoKLSAqICBEZXJpdmVkIGZyb20gImluY2x1ZGUvYXNtLWkzODYvaW9jdGwuaCIKLSAqLwotCi0jaWZuZGVmIF9TMzkwX0lPQ1RMX0gKLSNkZWZpbmUgX1MzOTBfSU9DVExfSAotCi0vKiBpb2N0bCBjb21tYW5kIGVuY29kaW5nOiAzMiBiaXRzIHRvdGFsLCBjb21tYW5kIGluIGxvd2VyIDE2IGJpdHMsCi0gKiBzaXplIG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGluIHRoZSBsb3dlciAxNCBiaXRzIG9mIHRoZQotICogdXBwZXIgMTYgYml0cy4KLSAqIEVuY29kaW5nIHRoZSBzaXplIG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGluIHRoZSBpb2N0bCByZXF1ZXN0Ci0gKiBpcyB1c2VmdWwgZm9yIGNhdGNoaW5nIHByb2dyYW1zIGNvbXBpbGVkIHdpdGggb2xkIHZlcnNpb25zCi0gKiBhbmQgdG8gYXZvaWQgb3ZlcndyaXRpbmcgdXNlciBzcGFjZSBvdXRzaWRlIHRoZSB1c2VyIGJ1ZmZlciBhcmVhLgotICogVGhlIGhpZ2hlc3QgMiBiaXRzIGFyZSByZXNlcnZlZCBmb3IgaW5kaWNhdGluZyB0aGUgYGBhY2Nlc3MgbW9kZScnLgotICogTk9URTogVGhpcyBsaW1pdHMgdGhlIG1heCBwYXJhbWV0ZXIgc2l6ZSB0byAxNmtCIC0xICEKLSAqLwotCi0vKgotICogVGhlIGZvbGxvd2luZyBpcyBmb3IgY29tcGF0aWJpbGl0eSBhY3Jvc3MgdGhlIHZhcmlvdXMgTGludXgKLSAqIHBsYXRmb3Jtcy4gIFRoZSBpMzg2IGlvY3RsIG51bWJlcmluZyBzY2hlbWUgZG9lc24ndCByZWFsbHkgZW5mb3JjZQotICogYSB0eXBlIGZpZWxkLiAgRGUgZmFjdG8sIGhvd2V2ZXIsIHRoZSB0b3AgOCBiaXRzIG9mIHRoZSBsb3dlciAxNgotICogYml0cyBhcmUgaW5kZWVkIHVzZWQgYXMgYSB0eXBlIGZpZWxkLCBzbyB3ZSBtaWdodCBqdXN0IGFzIHdlbGwgbWFrZQotICogdGhpcyBleHBsaWNpdCBoZXJlLiAgUGxlYXNlIGJlIHN1cmUgdG8gdXNlIHRoZSBkZWNvZGluZyBtYWNyb3MKLSAqIGJlbG93IGZyb20gbm93IG9uLgotICovCi0jZGVmaW5lIF9JT0NfTlJCSVRTCTgKLSNkZWZpbmUgX0lPQ19UWVBFQklUUwk4Ci0jZGVmaW5lIF9JT0NfU0laRUJJVFMJMTQKLSNkZWZpbmUgX0lPQ19ESVJCSVRTCTIKLQotI2RlZmluZSBfSU9DX05STUFTSwkoKDEgPDwgX0lPQ19OUkJJVFMpLTEpCi0jZGVmaW5lIF9JT0NfVFlQRU1BU0sJKCgxIDw8IF9JT0NfVFlQRUJJVFMpLTEpCi0jZGVmaW5lIF9JT0NfU0laRU1BU0sJKCgxIDw8IF9JT0NfU0laRUJJVFMpLTEpCi0jZGVmaW5lIF9JT0NfRElSTUFTSwkoKDEgPDwgX0lPQ19ESVJCSVRTKS0xKQotCi0jZGVmaW5lIF9JT0NfTlJTSElGVAkwCi0jZGVmaW5lIF9JT0NfVFlQRVNISUZUCShfSU9DX05SU0hJRlQrX0lPQ19OUkJJVFMpCi0jZGVmaW5lIF9JT0NfU0laRVNISUZUCShfSU9DX1RZUEVTSElGVCtfSU9DX1RZUEVCSVRTKQotI2RlZmluZSBfSU9DX0RJUlNISUZUCShfSU9DX1NJWkVTSElGVCtfSU9DX1NJWkVCSVRTKQotCi0vKgotICogRGlyZWN0aW9uIGJpdHMuCi0gKi8KLSNkZWZpbmUgX0lPQ19OT05FCTBVCi0jZGVmaW5lIF9JT0NfV1JJVEUJMVUKLSNkZWZpbmUgX0lPQ19SRUFECTJVCi0KLSNkZWZpbmUgX0lPQyhkaXIsdHlwZSxucixzaXplKSBcCi0JKCgoZGlyKSAgPDwgX0lPQ19ESVJTSElGVCkgfCBcCi0JICgodHlwZSkgPDwgX0lPQ19UWVBFU0hJRlQpIHwgXAotCSAoKG5yKSAgIDw8IF9JT0NfTlJTSElGVCkgfCBcCi0JICgoc2l6ZSkgPDwgX0lPQ19TSVpFU0hJRlQpKQotCi0vKiBwcm92b2tlIGNvbXBpbGUgZXJyb3IgZm9yIGludmFsaWQgdXNlcyBvZiBzaXplIGFyZ3VtZW50ICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBfX2ludmFsaWRfc2l6ZV9hcmd1bWVudF9mb3JfSU9DOwotI2RlZmluZSBfSU9DX1RZUEVDSEVDSyh0KSBcCi0JKChzaXplb2YodCkgPT0gc2l6ZW9mKHRbMV0pICYmIFwKLQkgIHNpemVvZih0KSA8ICgxIDw8IF9JT0NfU0laRUJJVFMpKSA/IFwKLQkgIHNpemVvZih0KSA6IF9faW52YWxpZF9zaXplX2FyZ3VtZW50X2Zvcl9JT0MpCi0KLS8qIHVzZWQgdG8gY3JlYXRlIG51bWJlcnMgKi8KLSNkZWZpbmUgX0lPKHR5cGUsbnIpCQlfSU9DKF9JT0NfTk9ORSwodHlwZSksKG5yKSwwKQotI2RlZmluZSBfSU9SKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1JFQUQsKHR5cGUpLChuciksKF9JT0NfVFlQRUNIRUNLKHNpemUpKSkKLSNkZWZpbmUgX0lPVyh0eXBlLG5yLHNpemUpCV9JT0MoX0lPQ19XUklURSwodHlwZSksKG5yKSwoX0lPQ19UWVBFQ0hFQ0soc2l6ZSkpKQotI2RlZmluZSBfSU9XUih0eXBlLG5yLHNpemUpCV9JT0MoX0lPQ19SRUFEfF9JT0NfV1JJVEUsKHR5cGUpLChuciksKF9JT0NfVFlQRUNIRUNLKHNpemUpKSkKLSNkZWZpbmUgX0lPUl9CQUQodHlwZSxucixzaXplKQlfSU9DKF9JT0NfUkVBRCwodHlwZSksKG5yKSxzaXplb2Yoc2l6ZSkpCi0jZGVmaW5lIF9JT1dfQkFEKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1dSSVRFLCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKLSNkZWZpbmUgX0lPV1JfQkFEKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1JFQUR8X0lPQ19XUklURSwodHlwZSksKG5yKSxzaXplb2Yoc2l6ZSkpCi0KLS8qIHVzZWQgdG8gZGVjb2RlIGlvY3RsIG51bWJlcnMuLiAqLwotI2RlZmluZSBfSU9DX0RJUihucikJCSgoKG5yKSA+PiBfSU9DX0RJUlNISUZUKSAmIF9JT0NfRElSTUFTSykKLSNkZWZpbmUgX0lPQ19UWVBFKG5yKQkJKCgobnIpID4+IF9JT0NfVFlQRVNISUZUKSAmIF9JT0NfVFlQRU1BU0spCi0jZGVmaW5lIF9JT0NfTlIobnIpCQkoKChucikgPj4gX0lPQ19OUlNISUZUKSAmIF9JT0NfTlJNQVNLKQotI2RlZmluZSBfSU9DX1NJWkUobnIpCQkoKChucikgPj4gX0lPQ19TSVpFU0hJRlQpICYgX0lPQ19TSVpFTUFTSykKLQotLyogLi4uYW5kIGZvciB0aGUgZHJpdmVycy9zb3VuZCBmaWxlcy4uLiAqLwotCi0jZGVmaW5lIElPQ19JTgkJKF9JT0NfV1JJVEUgPDwgX0lPQ19ESVJTSElGVCkKLSNkZWZpbmUgSU9DX09VVAkJKF9JT0NfUkVBRCA8PCBfSU9DX0RJUlNISUZUKQotI2RlZmluZSBJT0NfSU5PVVQJKChfSU9DX1dSSVRFfF9JT0NfUkVBRCkgPDwgX0lPQ19ESVJTSElGVCkKLSNkZWZpbmUgSU9DU0laRV9NQVNLCShfSU9DX1NJWkVNQVNLIDw8IF9JT0NfU0laRVNISUZUKQotI2RlZmluZSBJT0NTSVpFX1NISUZUCShfSU9DX1NJWkVTSElGVCkKLQotI2VuZGlmIC8qIF9TMzkwX0lPQ1RMX0ggKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pb2N0bC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9rZXhlYy5oIGIvaW5jbHVkZS9hc20tczM5MC9rZXhlYy5oCmluZGV4IDU0Y2Y3ZDkuLmNlMjhkZGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAva2V4ZWMuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL2tleGVjLmgKQEAgLTM1LDggKzM1LDkgQEAKICNkZWZpbmUgS0VYRUNfQVJDSCBLRVhFQ19BUkNIX1MzOTAKIAogI2RlZmluZSBNQVhfTk9URV9CWVRFUyAxMDI0Ci10eXBlZGVmIHUzMiBub3RlX2J1Zl90W01BWF9OT1RFX0JZVEVTLzRdOwogCi1leHRlcm4gbm90ZV9idWZfdCBjcmFzaF9ub3Rlc1tdOworLyogUHJvdmlkZSBhIGR1bW15IGRlZmluaXRpb24gdG8gYXZvaWQgYnVpbGQgZmFpbHVyZXMuICovCitzdGF0aWMgaW5saW5lIHZvaWQgY3Jhc2hfc2V0dXBfcmVncyhzdHJ1Y3QgcHRfcmVncyAqbmV3cmVncywKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKm9sZHJlZ3MpIHsgfQogCiAjZW5kaWYgLypfUzM5MF9LRVhFQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL211dGV4LmggYi9pbmNsdWRlL2FzbS1zMzkwL211dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU4YzFmNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvbXV0ZXguaApAQCAtMCwwICsxLDkgQEAKKy8qCisgKiBQdWxsIGluIHRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbXV0ZXggZmFzdHBhdGguCisgKgorICogVE9ETzogaW1wbGVtZW50IG9wdGltaXplZCBwcmltaXRpdmVzIGluc3RlYWQsIG9yIGxlYXZlIHRoZSBnZW5lcmljCisgKiBpbXBsZW1lbnRhdGlvbiBpbiBwbGFjZSwgb3IgcGljayB0aGUgYXRvbWljX3hjaGcoKSBiYXNlZCBnZW5lcmljCisgKiBpbXBsZW1lbnRhdGlvbi4gKHNlZSBhc20tZ2VuZXJpYy9tdXRleC14Y2hnLmggZm9yIGRldGFpbHMpCisgKi8KKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL211dGV4LWRlYy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXMzOTAvcHJvY2Vzc29yLmgKaW5kZXggNGVjNjUyZS4uYzVjYmM0YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3Byb2Nlc3Nvci5oCkBAIC0xOTEsMTAgKzE5MSwxMCBAQAogZXh0ZXJuIHZvaWQgc2hvd190cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKnNwKTsKIAogdW5zaWduZWQgbG9uZyBnZXRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKLSNkZWZpbmUgX19LU1RLX1BUUkVHUyh0c2spICgoc3RydWN0IHB0X3JlZ3MgKikgXAotICAgICAgICAoKHVuc2lnbmVkIGxvbmcpIHRzay0+dGhyZWFkX2luZm8gKyBUSFJFQURfU0laRSAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpKQotI2RlZmluZSBLU1RLX0VJUCh0c2spCShfX0tTVEtfUFRSRUdTKHRzayktPnBzdy5hZGRyKQotI2RlZmluZSBLU1RLX0VTUCh0c2spCShfX0tTVEtfUFRSRUdTKHRzayktPmdwcnNbMTVdKQorI2RlZmluZSB0YXNrX3B0X3JlZ3ModHNrKSAoKHN0cnVjdCBwdF9yZWdzICopIFwKKyAgICAgICAgKHRhc2tfc3RhY2tfcGFnZSh0c2spICsgVEhSRUFEX1NJWkUpIC0gMSkKKyNkZWZpbmUgS1NUS19FSVAodHNrKQkodGFza19wdF9yZWdzKHRzayktPnBzdy5hZGRyKQorI2RlZmluZSBLU1RLX0VTUCh0c2spCSh0YXNrX3B0X3JlZ3ModHNrKS0+Z3Byc1sxNV0pCiAKIC8qCiAgKiBHaXZlIHVwIHRoZSB0aW1lIHNsaWNlIG9mIHRoZSB2aXJ0dWFsIFBVLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9zMzkwX3JkZXYuaCBiL2luY2x1ZGUvYXNtLXMzOTAvczM5MF9yZGV2LmgKaW5kZXggM2FkNzhmMi4uNmZhMjA0NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9zMzkwX3JkZXYuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3MzOTBfcmRldi5oCkBAIC0yLDcgKzIsNyBAQAogICogIGluY2x1ZGUvYXNtLXMzOTAvY2N3ZGV2LmgKICAqCiAgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwNSBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwgSUJNIENvcnBvcmF0aW9uCi0gKiAgICBBdXRob3Iocyk6IENvcm5lbGlhIEh1Y2sgPGNvaHVja0BkZS5pYm0uY29tPgorICogICAgQXV0aG9yKHMpOiBDb3JuZWxpYSBIdWNrIDxjb3JuZWxpYS5odWNrQGRlLmlibS5jb20+CiAgKiAgICAgICAgICAgICAgIENhcnN0ZW4gT3R0ZSAgPGNvdHRlQGRlLmlibS5jb20+CiAgKgogICogIEludGVyZmFjZSBmb3IgczM5MCByb290IGRldmljZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9zaWdjb250ZXh0LmggYi9pbmNsdWRlL2FzbS1zMzkwL3NpZ2NvbnRleHQuaAppbmRleCA4MDM1NDUzLi5hZWI2ZTBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3NpZ2NvbnRleHQuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3NpZ2NvbnRleHQuaApAQCAtOCw2ICs4LDggQEAKICNpZm5kZWYgX0FTTV9TMzkwX1NJR0NPTlRFWFRfSAogI2RlZmluZSBfQVNNX1MzOTBfU0lHQ09OVEVYVF9ICiAKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCiAjZGVmaW5lIF9fTlVNX0dQUlMgMTYKICNkZWZpbmUgX19OVU1fRlBSUyAxNgogI2RlZmluZSBfX05VTV9BQ1JTIDE2CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tczM5MC9zeXN0ZW0uaAppbmRleCA4NjRjYWU3Li5iMmU2NWU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvc3lzdGVtLmgKQEAgLTEwNCwxNCArMTA0LDI1IEBACiAJcHJldiA9IF9fc3dpdGNoX3RvKHByZXYsbmV4dCk7CQkJCQkgICAgIFwKIH0gd2hpbGUgKDApCiAKKy8qCisgKiBPbiBTTVAgc3lzdGVtcywgd2hlbiB0aGUgc2NoZWR1bGVyIGRvZXMgbWlncmF0aW9uLWNvc3QgYXV0b2RldGVjdGlvbiwKKyAqIGl0IG5lZWRzIGEgd2F5IHRvIGZsdXNoIGFzIG11Y2ggb2YgdGhlIENQVSdzIGNhY2hlcyBhcyBwb3NzaWJsZS4KKyAqCisgKiBUT0RPOiBmaWxsIHRoaXMgaW4hCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZF9jYWNoZWZsdXNoKHZvaWQpCit7Cit9CisKICNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORwotZXh0ZXJuIHZvaWQgYWNjb3VudF91c2VyX3Z0aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKK2V4dGVybiB2b2lkIGFjY291bnRfdnRpbWUoc3RydWN0IHRhc2tfc3RydWN0ICopOworZXh0ZXJuIHZvaWQgYWNjb3VudF90aWNrX3Z0aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKIGV4dGVybiB2b2lkIGFjY291bnRfc3lzdGVtX3Z0aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKICNlbmRpZgogCiAjZGVmaW5lIGZpbmlzaF9hcmNoX3N3aXRjaChwcmV2KSBkbyB7CQkJCQkgICAgIFwKIAlzZXRfZnMoY3VycmVudC0+dGhyZWFkLm1tX3NlZ21lbnQpOwkJCQkgICAgIFwKLQlhY2NvdW50X3N5c3RlbV92dGltZShwcmV2KTsJCQkJCSAgICAgXAorCWFjY291bnRfdnRpbWUocHJldik7CQkJCQkJICAgICBcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIG5vcCgpIF9fYXNtX18gX192b2xhdGlsZV9fICgibm9wIikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLXMzOTAvdGhyZWFkX2luZm8uaAppbmRleCA2YzE4YTNmLi5mMzc5N2E1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC90aHJlYWRfaW5mby5oCkBAIC04MSw4ICs4MSw2IEBACiAjZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaykgKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgXAogCV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCxUSFJFQURfT1JERVIpKQogI2RlZmluZSBmcmVlX3RocmVhZF9pbmZvKHRpKSBmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSAodGkpLFRIUkVBRF9PUkRFUikKLSNkZWZpbmUgZ2V0X3RocmVhZF9pbmZvKHRpKSBnZXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKLSNkZWZpbmUgcHV0X3RocmVhZF9pbmZvKHRpKSBwdXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2F0b21pYy5oIGIvaW5jbHVkZS9hc20tc2gvYXRvbWljLmgKaW5kZXggNjE4ZDhlMC4uZmI2MjdkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvYXRvbWljLmgKQEAgLTEwMSw2ICsxMDEsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNkZWZpbmUgYXRvbWljX3hjaGcodiwgbmV3KSAoeGNoZygmKCh2KS0+Y291bnRlciksIG5ldykpCisKIHN0YXRpYyBpbmxpbmUgaW50IGF0b21pY19hZGRfdW5sZXNzKGF0b21pY190ICp2LCBpbnQgYSwgaW50IHUpCiB7CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2J1cy1zaC5oIGIvaW5jbHVkZS9hc20tc2gvYnVzLXNoLmgKaW5kZXggODNjNWQyZi4uZTQyZDYzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvYnVzLXNoLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvYnVzLXNoLmgKQEAgLTIxLDYgKzIxLDcgQEAKIAl2b2lkCQkqbWFwYmFzZTsKIAl1bnNpZ25lZCBpbnQJaXJxWzZdOwogCXU2NAkJKmRtYV9tYXNrOworCXU2NAkJY29oZXJlbnRfZG1hX21hc2s7CiB9OwogCiAjZGVmaW5lIHRvX3NoX2RldihkKQljb250YWluZXJfb2YoKGQpLCBzdHJ1Y3Qgc2hfZGV2LCBkZXYpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jYWNoZS5oIGIvaW5jbHVkZS9hc20tc2gvY2FjaGUuaAppbmRleCA5YjRkZDZkLi42NTZmZGZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jYWNoZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NhY2hlLmgKQEAgLTIyLDggKzIyLDYgQEAKIAogI2RlZmluZSBMMV9DQUNIRV9BTElHTih4KQkoKCh4KSsoTDFfQ0FDSEVfQllURVMtMSkpJn4oTDFfQ0FDSEVfQllURVMtMSkpCiAKLSNkZWZpbmUgTDFfQ0FDSEVfU0hJRlRfTUFYIAk1CS8qIGxhcmdlc3QgTDEgd2hpY2ggdGhpcyBhcmNoIHN1cHBvcnRzICovCi0KIHN0cnVjdCBjYWNoZV9pbmZvIHsKIAl1bnNpZ25lZCBpbnQgd2F5czsKIAl1bnNpZ25lZCBpbnQgc2V0czsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2Nsb2NrLmggYi9pbmNsdWRlL2FzbS1zaC9jbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZmI3NWIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9jbG9jay5oCkBAIC0wLDAgKzEsNjEgQEAKKyNpZm5kZWYgX19BU01fU0hfQ0xPQ0tfSAorI2RlZmluZSBfX0FTTV9TSF9DTE9DS19ICisKKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKK3N0cnVjdCBjbGs7CisKK3N0cnVjdCBjbGtfb3BzIHsKKwl2b2lkICgqaW5pdCkoc3RydWN0IGNsayAqY2xrKTsKKwl2b2lkICgqZW5hYmxlKShzdHJ1Y3QgY2xrICpjbGspOworCXZvaWQgKCpkaXNhYmxlKShzdHJ1Y3QgY2xrICpjbGspOworCXZvaWQgKCpyZWNhbGMpKHN0cnVjdCBjbGsgKmNsayk7CisJaW50ICgqc2V0X3JhdGUpKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKK307CisKK3N0cnVjdCBjbGsgeworCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKKwljb25zdCBjaGFyCQkqbmFtZTsKKworCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKKworCXN0cnVjdCBjbGsJCSpwYXJlbnQ7CisJc3RydWN0IGNsa19vcHMJCSpvcHM7CisKKwlzdHJ1Y3Qga3JlZgkJa3JlZjsKKworCXVuc2lnbmVkIGxvbmcJCXJhdGU7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7Cit9OworCisjZGVmaW5lIENMS19BTFdBWVNfRU5BQkxFRAkoMSA8PCAwKQorI2RlZmluZSBDTEtfUkFURV9QUk9QQUdBVEVTCSgxIDw8IDEpCisKKy8qIFNob3VsZCBiZSBkZWZpbmVkIGJ5IHByb2Nlc3Nvci1zcGVjaWZpYyBjb2RlICovCit2b2lkIGFyY2hfaW5pdF9jbGtfb3BzKHN0cnVjdCBjbGtfb3BzICoqLCBpbnQgdHlwZSk7CisKKy8qIGFyY2gvc2gva2VybmVsL2NwdS9jbG9jay5jICovCitpbnQgY2xrX2luaXQodm9pZCk7CisKK2ludCBfX2Nsa19lbmFibGUoc3RydWN0IGNsayAqKTsKK2ludCBjbGtfZW5hYmxlKHN0cnVjdCBjbGsgKik7CisKK3ZvaWQgX19jbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICopOwordm9pZCBjbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICopOworCitpbnQgY2xrX3NldF9yYXRlKHN0cnVjdCBjbGsgKiwgdW5zaWduZWQgbG9uZyByYXRlKTsKK3Vuc2lnbmVkIGxvbmcgY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKik7Cit2b2lkIGNsa19yZWNhbGNfcmF0ZShzdHJ1Y3QgY2xrICopOworCitzdHJ1Y3QgY2xrICpjbGtfZ2V0KGNvbnN0IGNoYXIgKmlkKTsKK3ZvaWQgY2xrX3B1dChzdHJ1Y3QgY2xrICopOworCitpbnQgY2xrX3JlZ2lzdGVyKHN0cnVjdCBjbGsgKik7Cit2b2lkIGNsa191bnJlZ2lzdGVyKHN0cnVjdCBjbGsgKik7CisKK2ludCBzaG93X2Nsb2NrcyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pOworCisjZW5kaWYgLyogX19BU01fU0hfQ0xPQ0tfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2gzL2RtYS5oIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy9kbWEuaAppbmRleCBiOTcyZTcxLi45NTQ4MDFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2gzL2RtYS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDMvZG1hLmgKQEAgLTMsNSArMywzNCBAQAogCiAjZGVmaW5lIFNIX0RNQUNfQkFTRQkweGE0MDAwMDIwCiAKLSNlbmRpZiAvKiBfX0FTTV9DUFVfU0gzX0RNQV9IICovCisvKiBEZWZpbml0aW9ucyBmb3IgdGhlIFN1cGVySCBETUFDICovCisjZGVmaW5lIFRNX0JVUlNUCTB4MDAwMDAwMjAKKyNkZWZpbmUgVFNfOAkJMHgwMDAwMDAwMAorI2RlZmluZSBUU18xNgkJMHgwMDAwMDAwOAorI2RlZmluZSBUU18zMgkJMHgwMDAwMDAxMAorI2RlZmluZSBUU18xMjgJCTB4MDAwMDAwMTgKIAorI2RlZmluZSBDSENSX1RTX01BU0sJMHgxOAorI2RlZmluZSBDSENSX1RTX1NISUZUCTMKKworI2RlZmluZSBETUFPUl9JTklUCURNQU9SX0RNRQorCisvKgorICogVGhlIFN1cGVySCBETUFDIHN1cHBvcnRzIGEgbnVtYmVyIG9mIHRyYW5zbWl0IHNpemVzLCB3ZSBsaXN0IHRoZW0gaGVyZSwKKyAqIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSB2YWx1ZXMgYXMgdGhleSBhcHBlYXIgaW4gdGhlIENIQ1IgcmVnaXN0ZXJzLgorICovCitlbnVtIHsKKwlYTUlUX1NaXzhCSVQsCisJWE1JVF9TWl8xNkJJVCwKKwlYTUlUX1NaXzMyQklULAorCVhNSVRfU1pfMTI4QklULAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCB0c19zaGlmdFtdIF9fYXR0cmlidXRlX18gKCh1c2VkKSkgPSB7CisJW1hNSVRfU1pfOEJJVF0JCT0gMCwKKwlbWE1JVF9TWl8xNkJJVF0JCT0gMSwKKwlbWE1JVF9TWl8zMkJJVF0JCT0gMiwKKwlbWE1JVF9TWl8xMjhCSVRdCT0gNCwKK307CisKKyNlbmRpZiAvKiBfX0FTTV9DUFVfU0gzX0RNQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2RtYS5oIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9kbWEuaAppbmRleCBlMmI5MWFkLi4wZGZlNjFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2RtYS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvZG1hLmgKQEAgLTEsMTcgKzEsNDkgQEAKICNpZm5kZWYgX19BU01fQ1BVX1NINF9ETUFfSAogI2RlZmluZSBfX0FTTV9DUFVfU0g0X0RNQV9ICiAKKyNpZmRlZiBDT05GSUdfQ1BVX1NINEEKKyNkZWZpbmUgU0hfRE1BQ19CQVNFCTB4ZmM4MDgwMjAKKyNlbHNlCiAjZGVmaW5lIFNIX0RNQUNfQkFTRQkweGZmYTAwMDAwCisjZW5kaWYKIAotI2RlZmluZSBTQVIJKCh1bnNpZ25lZCBsb25nW10pe1NIX0RNQUNfQkFTRSArIDB4MDAsIFNIX0RNQUNfQkFTRSArIDB4MTAsIFwKLQkJCQkgICBTSF9ETUFDX0JBU0UgKyAweDIwLCBTSF9ETUFDX0JBU0UgKyAweDMwfSkKLSNkZWZpbmUgREFSCSgodW5zaWduZWQgbG9uZ1tdKXtTSF9ETUFDX0JBU0UgKyAweDA0LCBTSF9ETUFDX0JBU0UgKyAweDE0LCBcCi0JCQkJICAgU0hfRE1BQ19CQVNFICsgMHgyNCwgU0hfRE1BQ19CQVNFICsgMHgzNH0pCi0jZGVmaW5lIERNQVRDUgkoKHVuc2lnbmVkIGxvbmdbXSl7U0hfRE1BQ19CQVNFICsgMHgwOCwgU0hfRE1BQ19CQVNFICsgMHgxOCwgXAotCQkJCSAgIFNIX0RNQUNfQkFTRSArIDB4MjgsIFNIX0RNQUNfQkFTRSArIDB4Mzh9KQotI2RlZmluZSBDSENSCSgodW5zaWduZWQgbG9uZ1tdKXtTSF9ETUFDX0JBU0UgKyAweDBjLCBTSF9ETUFDX0JBU0UgKyAweDFjLCBcCi0JCQkJICAgU0hfRE1BQ19CQVNFICsgMHgyYywgU0hfRE1BQ19CQVNFICsgMHgzY30pCi0jZGVmaW5lIERNQU9SCShTSF9ETUFDX0JBU0UgKyAweDQwKQorLyogRGVmaW5pdGlvbnMgZm9yIHRoZSBTdXBlckggRE1BQyAqLworI2RlZmluZSBUTV9CVVJTVAkweDAwMDAwODAKKyNkZWZpbmUgVFNfOAkJMHgwMDAwMDAxMAorI2RlZmluZSBUU18xNgkJMHgwMDAwMDAyMAorI2RlZmluZSBUU18zMgkJMHgwMDAwMDAzMAorI2RlZmluZSBUU182NAkJMHgwMDAwMDAwMAorCisjZGVmaW5lIENIQ1JfVFNfTUFTSwkweDMwCisjZGVmaW5lIENIQ1JfVFNfU0hJRlQJNAorCisjZGVmaW5lIERNQU9SX0NPRAkweDAwMDAwMDA4CisKKyNkZWZpbmUgRE1BT1JfSU5JVAkoIDB4ODAwMCB8IERNQU9SX0RNRSApCisKKy8qCisgKiBUaGUgU3VwZXJIIERNQUMgc3VwcG9ydHMgYSBudW1iZXIgb2YgdHJhbnNtaXQgc2l6ZXMsIHdlIGxpc3QgdGhlbSBoZXJlLAorICogd2l0aCB0aGVpciByZXNwZWN0aXZlIHZhbHVlcyBhcyB0aGV5IGFwcGVhciBpbiB0aGUgQ0hDUiByZWdpc3RlcnMuCisgKgorICogRGVmYXVsdHMgdG8gYSA2NC1iaXQgdHJhbnNmZXIgc2l6ZS4KKyAqLworZW51bSB7CisJWE1JVF9TWl82NEJJVCwKKwlYTUlUX1NaXzhCSVQsCisJWE1JVF9TWl8xNkJJVCwKKwlYTUlUX1NaXzMyQklULAorCVhNSVRfU1pfMjU2QklULAorfTsKKworLyoKKyAqIFRoZSBETUEgY291bnQgaXMgZGVmaW5lZCBhcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHRzX3NoaWZ0W10gX19hdHRyaWJ1dGVfXyAoKHVzZWQpKSA9IHsKKwlbWE1JVF9TWl82NEJJVF0JCT0gMywKKwlbWE1JVF9TWl84QklUXQkJPSAwLAorCVtYTUlUX1NaXzE2QklUXQkJPSAxLAorCVtYTUlUX1NaXzMyQklUXQkJPSAyLAorCVtYTUlUX1NaXzI1NkJJVF0JPSA1LAorfTsKIAogI2VuZGlmIC8qIF9fQVNNX0NQVV9TSDRfRE1BX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9mcmVxLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2ZyZXEuaAppbmRleCAyMDFkOTRmLi5lZjJiOWIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2ZyZXEuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2ZyZXEuaApAQCAtMTIsNiArMTIsOCBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCkKICNkZWZpbmUgRlJRQ1IJCSAgICAgICAgMHhhNDE1MDAwMAorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwKQorI2RlZmluZQlGUlFDUgkJCTB4ZmZjODAwMDAKICNlbHNlCiAjZGVmaW5lIEZSUUNSCQkJMHhmZmMwMDAwMAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20tc2gvZG1hLW1hcHBpbmcuaAppbmRleCBkM2ZhNWMyLi40OGYxZjQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2RtYS1tYXBwaW5nLmgKQEAgLTQsNiArNCw3IEBACiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiBleHRlcm4gc3RydWN0IGJ1c190eXBlIHBjaV9idXNfdHlwZTsKQEAgLTE0MSwyNCArMTQyLDI0IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgICBkbWFfYWRkcl90IGRtYV9oYW5kbGUsIHNpemVfdCBzaXplLAotCQkJCQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCitzdGF0aWMgdm9pZCBkbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwgc2l6ZV90IHNpemUsCisJCQkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKIAlfX2F0dHJpYnV0ZV9fICgoYWxpYXMoImRtYV9zeW5jX3NpbmdsZSIpKSk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCSAgIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwgc2l6ZV90IHNpemUsCi0JCQkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKLQlfX2F0dHJpYnV0ZV9fICgoYWxpYXMoImRtYV9zeW5jX3NpbmdsZSIpKSk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc3luY19zZ19mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbGVtcywKK3N0YXRpYyB2b2lkIGRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCBzaXplX3Qgc2l6ZSwKIAkJCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQorCV9fYXR0cmlidXRlX18gKChhbGlhcygiZG1hX3N5bmNfc2luZ2xlIikpKTsKKworc3RhdGljIHZvaWQgZG1hX3N5bmNfc2dfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbGVtcywKKwkJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiAJX19hdHRyaWJ1dGVfXyAoKGFsaWFzKCJkbWFfc3luY19zZyIpKSk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc3luY19zZ19mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbGVtcywKLQkJCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQorc3RhdGljIHZvaWQgZG1hX3N5bmNfc2dfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbGVtcywKKwkJCQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiAJX19hdHRyaWJ1dGVfXyAoKGFsaWFzKCJkbWFfc3luY19zZyIpKSk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IGRtYV9nZXRfY2FjaGVfYWxpZ25tZW50KHZvaWQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9kbWEuaCBiL2luY2x1ZGUvYXNtLXNoL2RtYS5oCmluZGV4IDhlOTQzNjAuLmExMThhMGQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9kbWEuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9kbWEuaApAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS9jcHUvZG1hLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogCkBAIC01NCw4ICs1NSw4IEBACiAgKiBETUEgY2hhbm5lbCBjYXBhYmlsaXRpZXMgLyBmbGFncwogICovCiBlbnVtIHsKLQlETUFfQ09ORklHVVJFRAkJCT0gMHgwMCwKIAlETUFfVEVJX0NBUEFCTEUJCQk9IDB4MDEsCisJRE1BX0NPTkZJR1VSRUQJCQk9IDB4MDIsCiB9OwogCiBleHRlcm4gc3BpbmxvY2tfdCBkbWFfc3Bpbl9sb2NrOwpAQCAtNzQsNyArNzUsOCBAQAogc3RydWN0IGRtYV9jaGFubmVsIHsKIAljaGFyIGRldl9pZFsxNl07CiAKLQl1bnNpZ25lZCBpbnQgY2hhbjsKKwl1bnNpZ25lZCBpbnQgY2hhbjsJCS8qIFBoeXNpY2FsIGNoYW5uZWwgbnVtYmVyICovCisJdW5zaWduZWQgaW50IHZjaGFuOwkJLyogVmlydHVhbCBjaGFubmVsIG51bWJlciAqLwogCXVuc2lnbmVkIGludCBtb2RlOwogCXVuc2lnbmVkIGludCBjb3VudDsKIApAQCAtOTEsNiArOTMsOCBAQAogfTsKIAogc3RydWN0IGRtYV9pbmZvIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCiAJY29uc3QgY2hhciAqbmFtZTsKIAl1bnNpZ25lZCBpbnQgbnJfY2hhbm5lbHM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTEzMCw3ICsxMzQsMTEgQEAKIAogI2lmZGVmIENPTkZJR19TWVNGUwogLyogYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtc3lzZnMuYyAqLwotZXh0ZXJuIGludCBkbWFfY3JlYXRlX3N5c2ZzX2ZpbGVzKHN0cnVjdCBkbWFfY2hhbm5lbCAqKTsKK2V4dGVybiBpbnQgZG1hX2NyZWF0ZV9zeXNmc19maWxlcyhzdHJ1Y3QgZG1hX2NoYW5uZWwgKiwgc3RydWN0IGRtYV9pbmZvICopOworZXh0ZXJuIHZvaWQgZG1hX3JlbW92ZV9zeXNmc19maWxlcyhzdHJ1Y3QgZG1hX2NoYW5uZWwgKiwgc3RydWN0IGRtYV9pbmZvICopOworI2Vsc2UKKyNkZWZpbmUgZG1hX2NyZWF0ZV9zeXNmc19maWxlKGNoYW5uZWwsIGluZm8pCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGRtYV9yZW1vdmVfc3lzZnNfZmlsZShjaGFubmVsLCBpbmZvKQkJZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUENJCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9mcmVxLmggYi9pbmNsdWRlL2FzbS1zaC9mcmVxLmgKaW5kZXggMmMwZmRlNC4uMzljMGUwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvZnJlcS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2ZyZXEuaApAQCAtMTQsMTYgKzE0LDUgQEAKIAogI2luY2x1ZGUgPGFzbS9jcHUvZnJlcS5oPgogCi0vKiBhcmNoL3NoL2tlcm5lbC90aW1lLmMgKi8KLWV4dGVybiB2b2lkIGdldF9jdXJyZW50X2ZyZXF1ZW5jeV9kaXZpc29ycyh1bnNpZ25lZCBpbnQgKmlmYywgdW5zaWduZWQgaW50ICpwZmMsIHVuc2lnbmVkIGludCAqYmZjKTsKLQotZXh0ZXJuIHVuc2lnbmVkIGludCBnZXRfaWZjX2Rpdmlzb3IodW5zaWduZWQgaW50IHZhbHVlKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgZ2V0X2lmY19kaXZpc29yKHVuc2lnbmVkIGludCB2YWx1ZSk7Ci1leHRlcm4gdW5zaWduZWQgaW50IGdldF9pZmNfZGl2aXNvcih1bnNpZ25lZCBpbnQgdmFsdWUpOwotCi1leHRlcm4gdW5zaWduZWQgaW50IGdldF9pZmNfdmFsdWUodW5zaWduZWQgaW50IGRpdmlzb3IpOwotZXh0ZXJuIHVuc2lnbmVkIGludCBnZXRfcGZjX3ZhbHVlKHVuc2lnbmVkIGludCBkaXZpc29yKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgZ2V0X2JmY192YWx1ZSh1bnNpZ25lZCBpbnQgZGl2aXNvcik7Ci0KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX19BU01fU0hfRlJFUV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9mdXRleC5oIGIvaW5jbHVkZS9hc20tc2gvZnV0ZXguaAppbmRleCA5ZmVmZjRjZS4uNmEzMzJhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvZnV0ZXguaAorKysgYi9pbmNsdWRlL2FzbS1zaC9mdXRleC5oCkBAIC0xLDUzICsxLDYgQEAKICNpZm5kZWYgX0FTTV9GVVRFWF9ICiAjZGVmaW5lIF9BU01fRlVURVhfSAogCi0jaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2Z1dGV4Lmg+CiAKLSNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1mdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCi17Ci0JaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKLQlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7Ci0JaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7Ci0JaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKLQlpbnQgb2xkdmFsID0gMCwgcmV0OwotCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKLQkJb3BhcmcgPSAxIDw8IG9wYXJnOwotCi0JaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaW5jX3ByZWVtcHRfY291bnQoKTsKLQotCXN3aXRjaCAob3ApIHsKLQljYXNlIEZVVEVYX09QX1NFVDoKLQljYXNlIEZVVEVYX09QX0FERDoKLQljYXNlIEZVVEVYX09QX09SOgotCWNhc2UgRlVURVhfT1BfQU5ETjoKLQljYXNlIEZVVEVYX09QX1hPUjoKLQlkZWZhdWx0OgotCQlyZXQgPSAtRU5PU1lTOwotCX0KLQotCWRlY19wcmVlbXB0X2NvdW50KCk7Ci0KLQlpZiAoIXJldCkgewotCQlzd2l0Y2ggKGNtcCkgewotCQljYXNlIEZVVEVYX09QX0NNUF9FUTogcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6IHJldCA9IChvbGR2YWwgIT0gY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0xUOiByZXQgPSAob2xkdmFsIDwgY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0dFOiByZXQgPSAob2xkdmFsID49IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9MRTogcmV0ID0gKG9sZHZhbCA8PSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6IHJldCA9IChvbGR2YWwgPiBjbXBhcmcpOyBicmVhazsKLQkJZGVmYXVsdDogcmV0ID0gLUVOT1NZUzsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0jZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvaW8uaCBiL2luY2x1ZGUvYXNtLXNoL2lvLmgKaW5kZXggNmJjMzQzZmUuLmIwYjI5MzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvaW8uaApAQCAtMTEsNyArMTEsNyBAQAogICogRm9yIHJlYWR7Yix3LGx9IGFuZCB3cml0ZXtiLHcsbH0gdGhlcmUgYXJlIGFsc28gX19yYXcgdmVyc2lvbnMsIHdoaWNoCiAgKiBkbyBub3QgaGF2ZSBhIG1lbW9yeSBiYXJyaWVyIGFmdGVyIHRoZW0uCiAgKgotICogSW4gYWRkaXRpb24sIHdlIGhhdmUgCisgKiBJbiBhZGRpdGlvbiwgd2UgaGF2ZQogICogICBjdHJsX2lue2IsdyxsfS9jdHJsX291dHtiLHcsbH0gZm9yIFN1cGVySCBzcGVjaWZpYyBJL08uCiAgKiAgIHdoaWNoIGFyZSBwcm9jZXNzb3Igc3BlY2lmaWMuCiAgKi8KQEAgLTIzLDE5ICsyMywyNyBAQAogICogIGluYiAgIGJ5IGRlZmF1bHQgZXhwYW5kcyB0byBfaW5iLCBidXQgdGhlIG1hY2hpbmUgc3BlY2lmaWMgY29kZSBtYXkKICAqICAgICAgICBkZWZpbmUgaXQgdG8gX19pbmIgaWYgaXQgY2hvb3Nlcy4KICAqLwotCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW9tYXAuaD4KKworI2lmZGVmIF9fS0VSTkVMX18KIAogLyoKICAqIERlcGVuZGluZyBvbiB3aGljaCBwbGF0Zm9ybSB3ZSBhcmUgcnVubmluZyBvbiwgd2UgbmVlZCBkaWZmZXJlbnQKICAqIEkvTyBmdW5jdGlvbnMuCiAgKi8KKyNkZWZpbmUgX19JT19QUkVGSVgJZ2VuZXJpYworI2luY2x1ZGUgPGFzbS9pb19nZW5lcmljLmg+CiAKLSNpZmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIG1heWJlYmFkaW8ocG9ydCkgXAorICBwcmludGsoS0VSTl9FUlIgImJhZCBQQy1saWtlIGlvICVzOiV1IGZvciBwb3J0IDB4JWx4IGF0IDB4JTA4eFxuIiwgXAorCSBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAocG9ydCksICh1MzIpX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKQorCiAvKgogICogU2luY2UgYm9hcmRzIGFyZSBhYmxlIHRvIGRlZmluZSB0aGVpciBvd24gc2V0IG9mIEkvTyByb3V0aW5lcyB0aHJvdWdoCiAgKiB0aGVpciByZXNwZWN0aXZlIG1hY2hpbmUgdmVjdG9yLCB3ZSBhbHdheXMgd3JhcCB0aHJvdWdoIHRoZSBtdi4KQEAgLTQ0LDExMyArNTIsMTIwIEBACiAgKiBhIGdpdmVuIHJvdXRpbmUsIGl0IHdpbGwgYmUgd3JhcHBlZCB0byBnZW5lcmljIGNvZGUgYXQgcnVuLXRpbWUuCiAgKi8KIAotIyBkZWZpbmUgX19pbmIocCkJc2hfbXYubXZfaW5iKChwKSkKLSMgZGVmaW5lIF9faW53KHApCXNoX212Lm12X2ludygocCkpCi0jIGRlZmluZSBfX2lubChwKQlzaF9tdi5tdl9pbmwoKHApKQotIyBkZWZpbmUgX19vdXRiKHgscCkJc2hfbXYubXZfb3V0YigoeCksKHApKQotIyBkZWZpbmUgX19vdXR3KHgscCkJc2hfbXYubXZfb3V0dygoeCksKHApKQotIyBkZWZpbmUgX19vdXRsKHgscCkJc2hfbXYubXZfb3V0bCgoeCksKHApKQorI2RlZmluZSBfX2luYihwKQlzaF9tdi5tdl9pbmIoKHApKQorI2RlZmluZSBfX2ludyhwKQlzaF9tdi5tdl9pbncoKHApKQorI2RlZmluZSBfX2lubChwKQlzaF9tdi5tdl9pbmwoKHApKQorI2RlZmluZSBfX291dGIoeCxwKQlzaF9tdi5tdl9vdXRiKCh4KSwocCkpCisjZGVmaW5lIF9fb3V0dyh4LHApCXNoX212Lm12X291dHcoKHgpLChwKSkKKyNkZWZpbmUgX19vdXRsKHgscCkJc2hfbXYubXZfb3V0bCgoeCksKHApKQogCi0jIGRlZmluZSBfX2luYl9wKHApCXNoX212Lm12X2luYl9wKChwKSkKLSMgZGVmaW5lIF9faW53X3AocCkJc2hfbXYubXZfaW53X3AoKHApKQotIyBkZWZpbmUgX19pbmxfcChwKQlzaF9tdi5tdl9pbmxfcCgocCkpCi0jIGRlZmluZSBfX291dGJfcCh4LHApCXNoX212Lm12X291dGJfcCgoeCksKHApKQotIyBkZWZpbmUgX19vdXR3X3AoeCxwKQlzaF9tdi5tdl9vdXR3X3AoKHgpLChwKSkKLSMgZGVmaW5lIF9fb3V0bF9wKHgscCkJc2hfbXYubXZfb3V0bF9wKCh4KSwocCkpCisjZGVmaW5lIF9faW5iX3AocCkJc2hfbXYubXZfaW5iX3AoKHApKQorI2RlZmluZSBfX2lud19wKHApCXNoX212Lm12X2lud19wKChwKSkKKyNkZWZpbmUgX19pbmxfcChwKQlzaF9tdi5tdl9pbmxfcCgocCkpCisjZGVmaW5lIF9fb3V0Yl9wKHgscCkJc2hfbXYubXZfb3V0Yl9wKCh4KSwocCkpCisjZGVmaW5lIF9fb3V0d19wKHgscCkJc2hfbXYubXZfb3V0d19wKCh4KSwocCkpCisjZGVmaW5lIF9fb3V0bF9wKHgscCkJc2hfbXYubXZfb3V0bF9wKCh4KSwocCkpCiAKLSMgZGVmaW5lIF9faW5zYihwLGIsYykJc2hfbXYubXZfaW5zYigocCksIChiKSwgKGMpKQotIyBkZWZpbmUgX19pbnN3KHAsYixjKQlzaF9tdi5tdl9pbnN3KChwKSwgKGIpLCAoYykpCi0jIGRlZmluZSBfX2luc2wocCxiLGMpCXNoX212Lm12X2luc2woKHApLCAoYiksIChjKSkKLSMgZGVmaW5lIF9fb3V0c2IocCxiLGMpCXNoX212Lm12X291dHNiKChwKSwgKGIpLCAoYykpCi0jIGRlZmluZSBfX291dHN3KHAsYixjKQlzaF9tdi5tdl9vdXRzdygocCksIChiKSwgKGMpKQotIyBkZWZpbmUgX19vdXRzbChwLGIsYykJc2hfbXYubXZfb3V0c2woKHApLCAoYiksIChjKSkKKyNkZWZpbmUgX19pbnNiKHAsYixjKQlzaF9tdi5tdl9pbnNiKChwKSwgKGIpLCAoYykpCisjZGVmaW5lIF9faW5zdyhwLGIsYykJc2hfbXYubXZfaW5zdygocCksIChiKSwgKGMpKQorI2RlZmluZSBfX2luc2wocCxiLGMpCXNoX212Lm12X2luc2woKHApLCAoYiksIChjKSkKKyNkZWZpbmUgX19vdXRzYihwLGIsYykJc2hfbXYubXZfb3V0c2IoKHApLCAoYiksIChjKSkKKyNkZWZpbmUgX19vdXRzdyhwLGIsYykJc2hfbXYubXZfb3V0c3coKHApLCAoYiksIChjKSkKKyNkZWZpbmUgX19vdXRzbChwLGIsYykJc2hfbXYubXZfb3V0c2woKHApLCAoYiksIChjKSkKIAotIyBkZWZpbmUgX19yZWFkYihhKQlzaF9tdi5tdl9yZWFkYigoYSkpCi0jIGRlZmluZSBfX3JlYWR3KGEpCXNoX212Lm12X3JlYWR3KChhKSkKLSMgZGVmaW5lIF9fcmVhZGwoYSkJc2hfbXYubXZfcmVhZGwoKGEpKQotIyBkZWZpbmUgX193cml0ZWIodixhKQlzaF9tdi5tdl93cml0ZWIoKHYpLChhKSkKLSMgZGVmaW5lIF9fd3JpdGV3KHYsYSkJc2hfbXYubXZfd3JpdGV3KCh2KSwoYSkpCi0jIGRlZmluZSBfX3dyaXRlbCh2LGEpCXNoX212Lm12X3dyaXRlbCgodiksKGEpKQorI2RlZmluZSBfX3JlYWRiKGEpCXNoX212Lm12X3JlYWRiKChhKSkKKyNkZWZpbmUgX19yZWFkdyhhKQlzaF9tdi5tdl9yZWFkdygoYSkpCisjZGVmaW5lIF9fcmVhZGwoYSkJc2hfbXYubXZfcmVhZGwoKGEpKQorI2RlZmluZSBfX3dyaXRlYih2LGEpCXNoX212Lm12X3dyaXRlYigodiksKGEpKQorI2RlZmluZSBfX3dyaXRldyh2LGEpCXNoX212Lm12X3dyaXRldygodiksKGEpKQorI2RlZmluZSBfX3dyaXRlbCh2LGEpCXNoX212Lm12X3dyaXRlbCgodiksKGEpKQogCi0jIGRlZmluZSBfX2lvcmVtYXAoYSxzKQlzaF9tdi5tdl9pb3JlbWFwKChhKSwgKHMpKQotIyBkZWZpbmUgX19pb3VubWFwKGEpCXNoX212Lm12X2lvdW5tYXAoKGEpKQorI2RlZmluZSBpbmIJCV9faW5iCisjZGVmaW5lIGludwkJX19pbncKKyNkZWZpbmUgaW5sCQlfX2lubAorI2RlZmluZSBvdXRiCQlfX291dGIKKyNkZWZpbmUgb3V0dwkJX19vdXR3CisjZGVmaW5lIG91dGwJCV9fb3V0bAogCi0jIGRlZmluZSBfX2lzYV9wb3J0MmFkZHIoYSkJc2hfbXYubXZfaXNhX3BvcnQyYWRkcihhKQorI2RlZmluZSBpbmJfcAkJX19pbmJfcAorI2RlZmluZSBpbndfcAkJX19pbndfcAorI2RlZmluZSBpbmxfcAkJX19pbmxfcAorI2RlZmluZSBvdXRiX3AJCV9fb3V0Yl9wCisjZGVmaW5lIG91dHdfcAkJX19vdXR3X3AKKyNkZWZpbmUgb3V0bF9wCQlfX291dGxfcAogCi0jIGRlZmluZSBpbmIJCV9faW5iCi0jIGRlZmluZSBpbncJCV9faW53Ci0jIGRlZmluZSBpbmwJCV9faW5sCi0jIGRlZmluZSBvdXRiCQlfX291dGIKLSMgZGVmaW5lIG91dHcJCV9fb3V0dwotIyBkZWZpbmUgb3V0bAkJX19vdXRsCisjZGVmaW5lIGluc2IJCV9faW5zYgorI2RlZmluZSBpbnN3CQlfX2luc3cKKyNkZWZpbmUgaW5zbAkJX19pbnNsCisjZGVmaW5lIG91dHNiCQlfX291dHNiCisjZGVmaW5lIG91dHN3CQlfX291dHN3CisjZGVmaW5lIG91dHNsCQlfX291dHNsCiAKLSMgZGVmaW5lIGluYl9wCQlfX2luYl9wCi0jIGRlZmluZSBpbndfcAkJX19pbndfcAotIyBkZWZpbmUgaW5sX3AJCV9faW5sX3AKLSMgZGVmaW5lIG91dGJfcAkJX19vdXRiX3AKLSMgZGVmaW5lIG91dHdfcAkJX19vdXR3X3AKLSMgZGVmaW5lIG91dGxfcAkJX19vdXRsX3AKLQotIyBkZWZpbmUgaW5zYgkJX19pbnNiCi0jIGRlZmluZSBpbnN3CQlfX2luc3cKLSMgZGVmaW5lIGluc2wJCV9faW5zbAotIyBkZWZpbmUgb3V0c2IJCV9fb3V0c2IKLSMgZGVmaW5lIG91dHN3CQlfX291dHN3Ci0jIGRlZmluZSBvdXRzbAkJX19vdXRzbAotCi0jIGRlZmluZSBfX3Jhd19yZWFkYglfX3JlYWRiCi0jIGRlZmluZSBfX3Jhd19yZWFkdwlfX3JlYWR3Ci0jIGRlZmluZSBfX3Jhd19yZWFkbAlfX3JlYWRsCi0jIGRlZmluZSBfX3Jhd193cml0ZWIJX193cml0ZWIKLSMgZGVmaW5lIF9fcmF3X3dyaXRldwlfX3dyaXRldwotIyBkZWZpbmUgX19yYXdfd3JpdGVsCV9fd3JpdGVsCisjZGVmaW5lIF9fcmF3X3JlYWRiKGEpCQlfX3JlYWRiKCh2b2lkIF9faW9tZW0gKikoYSkpCisjZGVmaW5lIF9fcmF3X3JlYWR3KGEpCQlfX3JlYWR3KCh2b2lkIF9faW9tZW0gKikoYSkpCisjZGVmaW5lIF9fcmF3X3JlYWRsKGEpCQlfX3JlYWRsKCh2b2lkIF9faW9tZW0gKikoYSkpCisjZGVmaW5lIF9fcmF3X3dyaXRlYih2LCBhKQlfX3dyaXRlYih2LCAodm9pZCBfX2lvbWVtICopKGEpKQorI2RlZmluZSBfX3Jhd193cml0ZXcodiwgYSkJX193cml0ZXcodiwgKHZvaWQgX19pb21lbSAqKShhKSkKKyNkZWZpbmUgX19yYXdfd3JpdGVsKHYsIGEpCV9fd3JpdGVsKHYsICh2b2lkIF9faW9tZW0gKikoYSkpCiAKIC8qCiAgKiBUaGUgcGxhdGZvcm0gaGVhZGVyIGZpbGVzIG1heSBkZWZpbmUgc29tZSBvZiB0aGVzZSBtYWNyb3MgdG8gdXNlCiAgKiB0aGUgaW5saW5lZCB2ZXJzaW9ucyB3aGVyZSBhcHByb3ByaWF0ZS4gIFRoZXNlIG1hY3JvcyBtYXkgYWxzbyBiZQogICogcmVkZWZpbmVkIGJ5IHVzZXJsZXZlbCBwcm9ncmFtcy4KICAqLwotI2lmZGVmIF9fcmF3X3JlYWRiCi0jIGRlZmluZSByZWFkYihhKQkoeyB1bnNpZ25lZCBsb25nIHJfID0gX19yYXdfcmVhZGIoKHVuc2lnbmVkIGxvbmcpYSk7IG1iKCk7IHJfOyB9KQorI2lmZGVmIF9fcmVhZGIKKyMgZGVmaW5lIHJlYWRiKGEpCSh7IHVuc2lnbmVkIGxvbmcgcl8gPSBfX3Jhd19yZWFkYihhKTsgbWIoKTsgcl87IH0pCiAjZW5kaWYKICNpZmRlZiBfX3Jhd19yZWFkdwotIyBkZWZpbmUgcmVhZHcoYSkJKHsgdW5zaWduZWQgbG9uZyByXyA9IF9fcmF3X3JlYWR3KCh1bnNpZ25lZCBsb25nKWEpOyBtYigpOyByXzsgfSkKKyMgZGVmaW5lIHJlYWR3KGEpCSh7IHVuc2lnbmVkIGxvbmcgcl8gPSBfX3Jhd19yZWFkdyhhKTsgbWIoKTsgcl87IH0pCiAjZW5kaWYKICNpZmRlZiBfX3Jhd19yZWFkbAotIyBkZWZpbmUgcmVhZGwoYSkJKHsgdW5zaWduZWQgbG9uZyByXyA9IF9fcmF3X3JlYWRsKCh1bnNpZ25lZCBsb25nKWEpOyBtYigpOyByXzsgfSkKKyMgZGVmaW5lIHJlYWRsKGEpCSh7IHVuc2lnbmVkIGxvbmcgcl8gPSBfX3Jhd19yZWFkbChhKTsgbWIoKTsgcl87IH0pCiAjZW5kaWYKIAogI2lmZGVmIF9fcmF3X3dyaXRlYgotIyBkZWZpbmUgd3JpdGViKHYsYSkJKHsgX19yYXdfd3JpdGViKCh2KSwodW5zaWduZWQgbG9uZykoYSkpOyBtYigpOyB9KQorIyBkZWZpbmUgd3JpdGViKHYsYSkJKHsgX19yYXdfd3JpdGViKCh2KSwoYSkpOyBtYigpOyB9KQogI2VuZGlmCiAjaWZkZWYgX19yYXdfd3JpdGV3Ci0jIGRlZmluZSB3cml0ZXcodixhKQkoeyBfX3Jhd193cml0ZXcoKHYpLCh1bnNpZ25lZCBsb25nKShhKSk7IG1iKCk7IH0pCisjIGRlZmluZSB3cml0ZXcodixhKQkoeyBfX3Jhd193cml0ZXcoKHYpLChhKSk7IG1iKCk7IH0pCiAjZW5kaWYKICNpZmRlZiBfX3Jhd193cml0ZWwKLSMgZGVmaW5lIHdyaXRlbCh2LGEpCSh7IF9fcmF3X3dyaXRlbCgodiksKHVuc2lnbmVkIGxvbmcpKGEpKTsgbWIoKTsgfSkKKyMgZGVmaW5lIHdyaXRlbCh2LGEpCSh7IF9fcmF3X3dyaXRlbCgodiksKGEpKTsgbWIoKTsgfSkKICNlbmRpZgogCiAjZGVmaW5lIHJlYWRiX3JlbGF4ZWQoYSkgcmVhZGIoYSkKICNkZWZpbmUgcmVhZHdfcmVsYXhlZChhKSByZWFkdyhhKQogI2RlZmluZSByZWFkbF9yZWxheGVkKGEpIHJlYWRsKGEpCiAKLSNkZWZpbmUgbW1pb3diKCkKKy8qIFNpbXBsZSBNTUlPICovCisjZGVmaW5lIGlvcmVhZDgoYSkJCXJlYWRiKGEpCisjZGVmaW5lIGlvcmVhZDE2KGEpCQlyZWFkdyhhKQorI2RlZmluZSBpb3JlYWQxNmJlKGEpCQliZTE2X3RvX2NwdShfX3Jhd19yZWFkdygoYSkpKQorI2RlZmluZSBpb3JlYWQzMihhKQkJcmVhZGwoYSkKKyNkZWZpbmUgaW9yZWFkMzJiZShhKQkJYmUzMl90b19jcHUoX19yYXdfcmVhZGwoKGEpKSkKIAotLyoKLSAqIElmIHRoZSBwbGF0Zm9ybSBoYXMgUEMtbGlrZSBJL08sIHRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIG9mZnNldCBpbnRvCi0gKiBhbiBhZGRyZXNzLgotICovCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGlzYV9wb3J0MmFkZHIodW5zaWduZWQgbG9uZyBvZmZzZXQpCi17Ci0JcmV0dXJuIF9faXNhX3BvcnQyYWRkcihvZmZzZXQpOwotfQorI2RlZmluZSBpb3dyaXRlOCh2LGEpCQl3cml0ZWIoKHYpLChhKSkKKyNkZWZpbmUgaW93cml0ZTE2KHYsYSkJCXdyaXRldygodiksKGEpKQorI2RlZmluZSBpb3dyaXRlMTZiZSh2LGEpCV9fcmF3X3dyaXRldyhjcHVfdG9fYmUxNigodikpLChhKSkKKyNkZWZpbmUgaW93cml0ZTMyKHYsYSkJCXdyaXRlbCgodiksKGEpKQorI2RlZmluZSBpb3dyaXRlMzJiZSh2LGEpCV9fcmF3X3dyaXRlbChjcHVfdG9fYmUzMigodikpLChhKSkKKworI2RlZmluZSBpb3JlYWQ4X3JlcChhLGQsYykJaW5zYigoYSksKGQpLChjKSkKKyNkZWZpbmUgaW9yZWFkMTZfcmVwKGEsZCxjKQlpbnN3KChhKSwoZCksKGMpKQorI2RlZmluZSBpb3JlYWQzMl9yZXAoYSxkLGMpCWluc2woKGEpLChkKSwoYykpCisKKyNkZWZpbmUgaW93cml0ZThfcmVwKGEscyxjKQlvdXRzYigoYSksKHMpLChjKSkKKyNkZWZpbmUgaW93cml0ZTE2X3JlcChhLHMsYykJb3V0c3coKGEpLChzKSwoYykpCisjZGVmaW5lIGlvd3JpdGUzMl9yZXAoYSxzLGMpCW91dHNsKChhKSwocyksKGMpKQorCisjZGVmaW5lIG1taW93YigpCXdtYigpCS8qIHN5bmNvIG9uIFNILTRBLCBvdGhlcndpc2UgYSBub3AgKi8KIAogLyoKICAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBtZXRob2QgZm9yIHRoZSBnZW5lcmljIGNhc2Ugd2hlcmUgYSBib2FyZC1zcGVjaWZpYwotICogaXNhX3BvcnQyYWRkciBzaW1wbHkgbmVlZHMgdG8gcmV0dXJuIHRoZSBwb3J0ICsgc29tZSBhcmJpdHJhcnkgcG9ydCBiYXNlLgorICogaW9wb3J0X21hcCBzaW1wbHkgbmVlZHMgdG8gcmV0dXJuIHRoZSBwb3J0ICsgc29tZSBhcmJpdHJhcnkgcG9ydCBiYXNlLgogICoKICAqIFdlIHVzZSB0aGlzIGF0IGJvYXJkIHNldHVwIHRpbWUgdG8gaW1wbGljaXRseSBzZXQgdGhlIHBvcnQgYmFzZSwgYW5kCi0gKiBhcyBhIHJlc3VsdCwgd2UgY2FuIHVzZSB0aGUgZ2VuZXJpYyBpc2FfcG9ydDJhZGRyLgorICogYXMgYSByZXN1bHQsIHdlIGNhbiB1c2UgdGhlIGdlbmVyaWMgaW9wb3J0X21hcC4KICAqLwogc3RhdGljIGlubGluZSB2b2lkIF9fc2V0X2lvX3BvcnRfYmFzZSh1bnNpZ25lZCBsb25nIHBiYXNlKQogewpAQCAtMTU5LDUxICsxNzQsNTIgQEAKIAlnZW5lcmljX2lvX2Jhc2UgPSBwYmFzZTsKIH0KIAotI2RlZmluZSBpc2FfcmVhZGIoYSkgcmVhZGIoaXNhX3BvcnQyYWRkcihhKSkKLSNkZWZpbmUgaXNhX3JlYWR3KGEpIHJlYWR3KGlzYV9wb3J0MmFkZHIoYSkpCi0jZGVmaW5lIGlzYV9yZWFkbChhKSByZWFkbChpc2FfcG9ydDJhZGRyKGEpKQotI2RlZmluZSBpc2Ffd3JpdGViKGIsYSkgd3JpdGViKGIsaXNhX3BvcnQyYWRkcihhKSkKLSNkZWZpbmUgaXNhX3dyaXRldyh3LGEpIHdyaXRldyh3LGlzYV9wb3J0MmFkZHIoYSkpCi0jZGVmaW5lIGlzYV93cml0ZWwobCxhKSB3cml0ZWwobCxpc2FfcG9ydDJhZGRyKGEpKQorI2RlZmluZSBpc2FfcmVhZGIoYSkgcmVhZGIoaW9wb3J0X21hcChhLCAxKSkKKyNkZWZpbmUgaXNhX3JlYWR3KGEpIHJlYWR3KGlvcG9ydF9tYXAoYSwgMikpCisjZGVmaW5lIGlzYV9yZWFkbChhKSByZWFkbChpb3BvcnRfbWFwKGEsIDQpKQorI2RlZmluZSBpc2Ffd3JpdGViKGIsYSkgd3JpdGViKGIsaW9wb3J0X21hcChhLCAxKSkKKyNkZWZpbmUgaXNhX3dyaXRldyh3LGEpIHdyaXRldyh3LGlvcG9ydF9tYXAoYSwgMikpCisjZGVmaW5lIGlzYV93cml0ZWwobCxhKSB3cml0ZWwobCxpb3BvcnRfbWFwKGEsIDQpKQorCiAjZGVmaW5lIGlzYV9tZW1zZXRfaW8oYSxiLGMpIFwKLSAgbWVtc2V0KCh2b2lkICopKGlzYV9wb3J0MmFkZHIoKHVuc2lnbmVkIGxvbmcpYSkpLChiKSwoYykpCisgIG1lbXNldCgodm9pZCAqKShpb3BvcnRfbWFwKCh1bnNpZ25lZCBsb25nKShhKSwgMSkpLChiKSwoYykpCiAjZGVmaW5lIGlzYV9tZW1jcHlfZnJvbWlvKGEsYixjKSBcCi0gIG1lbWNweSgoYSksKHZvaWQgKikoaXNhX3BvcnQyYWRkcigodW5zaWduZWQgbG9uZykoYikpKSwoYykpCisgIG1lbWNweSgoYSksKHZvaWQgKikoaW9wb3J0X21hcCgodW5zaWduZWQgbG9uZykoYiksIDEpKSwoYykpCiAjZGVmaW5lIGlzYV9tZW1jcHlfdG9pbyhhLGIsYykgXAotICBtZW1jcHkoKHZvaWQgKikoaXNhX3BvcnQyYWRkcigodW5zaWduZWQgbG9uZykoYSkpKSwoYiksKGMpKQorICBtZW1jcHkoKHZvaWQgKikoaW9wb3J0X21hcCgodW5zaWduZWQgbG9uZykoYSksIDEpKSwoYiksKGMpKQogCiAvKiBXZSByZWFsbHkgd2FudCB0byB0cnkgYW5kIGdldCB0aGVzZSB0byBtZW1jcHkgZXRjICovCi1leHRlcm4gdm9pZCBtZW1jcHlfZnJvbWlvKHZvaWQgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7Ci1leHRlcm4gdm9pZCBtZW1jcHlfdG9pbyh1bnNpZ25lZCBsb25nLCBjb25zdCB2b2lkICosIHVuc2lnbmVkIGxvbmcpOwotZXh0ZXJuIHZvaWQgbWVtc2V0X2lvKHVuc2lnbmVkIGxvbmcsIGludCwgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gdm9pZCBtZW1jcHlfZnJvbWlvKHZvaWQgKiwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICosIHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHZvaWQgbWVtY3B5X3RvaW8odm9sYXRpbGUgdm9pZCBfX2lvbWVtICosIGNvbnN0IHZvaWQgKiwgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gdm9pZCBtZW1zZXRfaW8odm9sYXRpbGUgdm9pZCBfX2lvbWVtICosIGludCwgdW5zaWduZWQgbG9uZyk7CiAKIC8qIFN1cGVySCBvbi1jaGlwIEkvTyBmdW5jdGlvbnMgKi8KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGNoYXIgY3RybF9pbmIodW5zaWduZWQgbG9uZyBhZGRyKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIGN0cmxfaW5iKHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKilhZGRyOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBzaG9ydCBjdHJsX2ludyh1bnNpZ25lZCBsb25nIGFkZHIpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGN0cmxfaW53KHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCopYWRkcjsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IGN0cmxfaW5sKHVuc2lnbmVkIGxvbmcgYWRkcikKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGN0cmxfaW5sKHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nKilhZGRyOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGN0cmxfb3V0Yih1bnNpZ25lZCBjaGFyIGIsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBjdHJsX291dGIodW5zaWduZWQgY2hhciBiLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKilhZGRyID0gYjsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBjdHJsX291dHcodW5zaWduZWQgc2hvcnQgYiwgdW5zaWduZWQgbG9uZyBhZGRyKQorc3RhdGljIGlubGluZSB2b2lkIGN0cmxfb3V0dyh1bnNpZ25lZCBzaG9ydCBiLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCopYWRkciA9IGI7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgY3RybF9vdXRsKHVuc2lnbmVkIGludCBiLCB1bnNpZ25lZCBsb25nIGFkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgY3RybF9vdXRsKHVuc2lnbmVkIGludCBiLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAgICAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyopYWRkciA9IGI7CiB9CkBAIC0yMTQsMTIgKzIzMCwxMiBAQAogICogQ2hhbmdlIHZpcnR1YWwgYWRkcmVzc2VzIHRvIHBoeXNpY2FsIGFkZHJlc3NlcyBhbmQgdnYuCiAgKiBUaGVzZSBhcmUgdHJpdmlhbCBvbiB0aGUgMToxIExpbnV4L1N1cGVySCBtYXBwaW5nCiAgKi8KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgdmlydF90b19waHlzKHZvbGF0aWxlIHZvaWQgKiBhZGRyZXNzKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHZpcnRfdG9fcGh5cyh2b2xhdGlsZSB2b2lkICphZGRyZXNzKQogewogCXJldHVybiBQSFlTQUREUihhZGRyZXNzKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCAqIHBoeXNfdG9fdmlydCh1bnNpZ25lZCBsb25nIGFkZHJlc3MpCitzdGF0aWMgaW5saW5lIHZvaWQgKnBoeXNfdG9fdmlydCh1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7CiAJcmV0dXJuICh2b2lkICopUDFTRUdBRERSKGFkZHJlc3MpOwogfQpAQCAtMjM0LDI3ICsyNTAsNjAgQEAKICAqIGRpZmZlcmVudGx5LiBPbiB0aGUgeDg2IGFyY2hpdGVjdHVyZSwgd2UganVzdCByZWFkL3dyaXRlIHRoZQogICogbWVtb3J5IGxvY2F0aW9uIGRpcmVjdGx5LgogICoKLSAqIE9uIFNILCB3ZSBoYXZlIHRoZSB3aG9sZSBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlIG1hcHBlZCBhdCBhbGwgdGltZXMKLSAqIChhcyBNSVBTIGRvZXMpLCBzbyAiaW9yZW1hcCgpIiBhbmQgImlvdW5tYXAoKSIgZG8gbm90IG5lZWQgdG8gZG8KLSAqIGFueXRoaW5nLiAgKFRoaXMgaXNuJ3QgdHJ1ZSBmb3IgYWxsIG1hY2hpbmVzIGJ1dCB3ZSBzdGlsbCBoYW5kbGUKLSAqIHRoZXNlIGNhc2VzIHdpdGggd2lyZWQgVExCIGVudHJpZXMgYW55d2F5IC4uLikKKyAqIE9uIFNILCB3ZSB0cmFkaXRpb25hbGx5IGhhdmUgdGhlIHdob2xlIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UgbWFwcGVkCisgKiBhdCBhbGwgdGltZXMgKGFzIE1JUFMgZG9lcyksIHNvICJpb3JlbWFwKCkiIGFuZCAiaW91bm1hcCgpIiBkbyBub3QKKyAqIG5lZWQgdG8gZG8gYW55dGhpbmcgYnV0IHBsYWNlIHRoZSBhZGRyZXNzIGluIHRoZSBwcm9wZXIgc2VnbWVudC4gVGhpcworICogaXMgdHJ1ZSBmb3IgUDEgYW5kIFAyIGFkZHJlc3NlcywgYXMgd2VsbCBhcyBzb21lIFAzIG9uZXMuIEhvd2V2ZXIsCisgKiBtb3N0IG9mIHRoZSBQMyBhZGRyZXNzZXMgYW5kIG5ld2VyIGNvcmVzIHVzaW5nIGV4dGVuZGVkIGFkZHJlc3NpbmcKKyAqIG5lZWQgdG8gbWFwIHRocm91Z2ggcGFnZSB0YWJsZXMsIHNvIHRoZSBpb3JlbWFwKCkgaW1wbGVtZW50YXRpb24KKyAqIGJlY29tZXMgYSBiaXQgbW9yZSBjb21wbGljYXRlZC4gU2VlIGFyY2gvc2gvbW0vaW9yZW1hcC5jIGZvcgorICogYWRkaXRpb25hbCBub3RlcyBvbiB0aGlzLgogICoKICAqIFdlIGNoZWF0IGEgYml0IGFuZCBhbHdheXMgcmV0dXJuIHVuY2FjaGFibGUgYXJlYXMgdW50aWwgd2UndmUgZml4ZWQKLSAqIHRoZSBkcml2ZXJzIHRvIGhhbmRsZSBjYWNoaW5nIHByb3Blcmx5LiAgCisgKiB0aGUgZHJpdmVycyB0byBoYW5kbGUgY2FjaGluZyBwcm9wZXJseS4KICAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCAqIGlvcmVtYXAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKKyNpZmRlZiBDT05GSUdfTU1VCit2b2lkIF9faW9tZW0gKl9faW9yZW1hcCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7Cit2b2lkIF9faW91bm1hcCh2b2lkIF9faW9tZW0gKmFkZHIpOworI2Vsc2UKKyNkZWZpbmUgX19pb3JlbWFwKG9mZnNldCwgc2l6ZSwgZmxhZ3MpCSgodm9pZCBfX2lvbWVtICopKG9mZnNldCkpCisjZGVmaW5lIF9faW91bm1hcChhZGRyKQkJCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBDT05GSUdfTU1VICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICoKK19faW9yZW1hcF9tb2RlKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7Ci0JcmV0dXJuIF9faW9yZW1hcChvZmZzZXQsIHNpemUpOworCXVuc2lnbmVkIGxvbmcgbGFzdF9hZGRyID0gb2Zmc2V0ICsgc2l6ZSAtIDE7CisKKwkvKgorCSAqIEZvciBQMSBhbmQgUDIgc3BhY2UgdGhpcyBpcyB0cml2aWFsLCBhcyBldmVyeXRoaW5nIGlzIGFscmVhZHkKKwkgKiBtYXBwZWQuIFVuY2FjaGVkIGFjY2VzcyBmb3IgUDEgYWRkcmVzc2VzIGFyZSBkb25lIHRocm91Z2ggUDIuCisJICogSW4gdGhlIFAzIGNhc2Ugb3IgZm9yIGFkZHJlc3NlcyBvdXRzaWRlIG9mIHRoZSAyOS1iaXQgc3BhY2UsCisJICogbWFwcGluZyBtdXN0IGJlIGRvbmUgYnkgdGhlIFBNQiBvciBieSB1c2luZyBwYWdlIHRhYmxlcy4KKwkgKi8KKwlpZiAobGlrZWx5KFBYU0VHKG9mZnNldCkgPCBQM1NFRyAmJiBQWFNFRyhsYXN0X2FkZHIpIDwgUDNTRUcpKSB7CisJCWlmICh1bmxpa2VseShmbGFncyAmIF9QQUdFX0NBQ0hBQkxFKSkKKwkJCXJldHVybiAodm9pZCBfX2lvbWVtICopUDFTRUdBRERSKG9mZnNldCk7CisKKwkJcmV0dXJuICh2b2lkIF9faW9tZW0gKilQMlNFR0FERFIob2Zmc2V0KTsKKwl9CisKKwlyZXR1cm4gX19pb3JlbWFwKG9mZnNldCwgc2l6ZSwgZmxhZ3MpOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGlvdW5tYXAodm9pZCAqYWRkcikKLXsKLQlyZXR1cm4gX19pb3VubWFwKGFkZHIpOwotfQorI2RlZmluZSBpb3JlbWFwKG9mZnNldCwgc2l6ZSkJCQkJXAorCV9faW9yZW1hcF9tb2RlKChvZmZzZXQpLCAoc2l6ZSksIDApCisjZGVmaW5lIGlvcmVtYXBfbm9jYWNoZShvZmZzZXQsIHNpemUpCQkJXAorCV9faW9yZW1hcF9tb2RlKChvZmZzZXQpLCAoc2l6ZSksIDApCisjZGVmaW5lIGlvcmVtYXBfY2FjaGUob2Zmc2V0LCBzaXplKQkJCVwKKwlfX2lvcmVtYXBfbW9kZSgob2Zmc2V0KSwgKHNpemUpLCBfUEFHRV9DQUNIQUJMRSkKKyNkZWZpbmUgcDNfaW9yZW1hcChvZmZzZXQsIHNpemUsIGZsYWdzKQkJCVwKKwlfX2lvcmVtYXAoKG9mZnNldCksIChzaXplKSwgKGZsYWdzKSkKKyNkZWZpbmUgaW91bm1hcChhZGRyKQkJCQkJXAorCV9faW91bm1hcCgoYWRkcikpCiAKLSNkZWZpbmUgaW9yZW1hcF9ub2NhY2hlKG9mZixzaXplKSBpb3JlbWFwKG9mZixzaXplKQotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgY2hlY2tfc2lnbmF0dXJlKHVuc2lnbmVkIGxvbmcgaW9fYWRkciwKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3NpZ25hdHVyZShjaGFyIF9faW9tZW0gKmlvX2FkZHIsCiAJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsIGludCBsZW5ndGgpCiB7CiAJaW50IHJldHZhbCA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9pb19nZW5lcmljLmggYi9pbmNsdWRlL2FzbS1zaC9pb19nZW5lcmljLmgKaW5kZXggYmUxNDU4Ny4uOTJmYzYwNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvaW9fZ2VuZXJpYy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2lvX2dlbmVyaWMuaApAQCAtMSw1MSArMSw0OSBAQAogLyoKLSAqIGluY2x1ZGUvYXNtLXNoL2lvX2dlbmVyaWMuaAotICoKLSAqIENvcHlyaWdodCAyMDAwIFN0dWFydCBNZW5lZnkgKHN0dWFydC5tZW5lZnlAc3QuY29tKQotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBHZW5lcmljIElPIGZ1bmN0aW9ucworICogVHJpdmlhbCBJL08gcm91dGluZSBkZWZpbml0aW9ucywgaW50ZW50aW9uYWxseSBtZWFudCB0byBiZSBpbmNsdWRlZAorICogbXVsdGlwbGUgdGltZXMuIFVnbHkgSS9PIHJvdXRpbmUgY29uY2F0ZW5hdGlvbiBoZWxwZXJzIHRha2VuIGZyb20KKyAqIGFscGhhLiBNdXN0IGJlIGluY2x1ZGVkIF9iZWZvcmVfIGlvLmggdG8gYXZvaWQgcHJlcHJvY2Vzc29yLWluZHVjZWQKKyAqIHJvdXRpbmUgbWlzbWF0Y2guCiAgKi8KKyNkZWZpbmUgSU9fQ09OQ0FUKGEsYikJX0lPX0NPTkNBVChhLGIpCisjZGVmaW5lIF9JT19DT05DQVQoYSxiKQlhICMjIF8gIyMgYgogCi0jaWZuZGVmIF9BU01fU0hfSU9fR0VORVJJQ19ICi0jZGVmaW5lIF9BU01fU0hfSU9fR0VORVJJQ19ICisjaWZuZGVmIF9fSU9fUFJFRklYCisjZXJyb3IgIkRvbid0IGluY2x1ZGUgdGhpcyBoZWFkZXIgd2l0aG91dCBhIHZhbGlkIHN5c3RlbSBwcmVmaXgiCisjZW5kaWYKIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2VuZXJpY19pb19iYXNlOwordTggSU9fQ09OQ0FUKF9fSU9fUFJFRklYLGluYikodW5zaWduZWQgbG9uZyk7Cit1MTYgSU9fQ09OQ0FUKF9fSU9fUFJFRklYLGludykodW5zaWduZWQgbG9uZyk7Cit1MzIgSU9fQ09OQ0FUKF9fSU9fUFJFRklYLGlubCkodW5zaWduZWQgbG9uZyk7CiAKLWV4dGVybiB1bnNpZ25lZCBjaGFyIGdlbmVyaWNfaW5iKHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdW5zaWduZWQgc2hvcnQgZ2VuZXJpY19pbncodW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgZ2VuZXJpY19pbmwodW5zaWduZWQgbG9uZyBwb3J0KTsKK3ZvaWQgSU9fQ09OQ0FUKF9fSU9fUFJFRklYLG91dGIpKHU4LCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgSU9fQ09OQ0FUKF9fSU9fUFJFRklYLG91dHcpKHUxNiwgdW5zaWduZWQgbG9uZyk7Cit2b2lkIElPX0NPTkNBVChfX0lPX1BSRUZJWCxvdXRsKSh1MzIsIHVuc2lnbmVkIGxvbmcpOwogCi1leHRlcm4gdm9pZCBnZW5lcmljX291dGIodW5zaWduZWQgY2hhciB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB2b2lkIGdlbmVyaWNfb3V0dyh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB2b2lkIGdlbmVyaWNfb3V0bCh1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCk7Cit1OCBJT19DT05DQVQoX19JT19QUkVGSVgsaW5iX3ApKHVuc2lnbmVkIGxvbmcpOwordTE2IElPX0NPTkNBVChfX0lPX1BSRUZJWCxpbndfcCkodW5zaWduZWQgbG9uZyk7Cit1MzIgSU9fQ09OQ0FUKF9fSU9fUFJFRklYLGlubF9wKSh1bnNpZ25lZCBsb25nKTsKK3ZvaWQgSU9fQ09OQ0FUKF9fSU9fUFJFRklYLG91dGJfcCkodTgsIHVuc2lnbmVkIGxvbmcpOwordm9pZCBJT19DT05DQVQoX19JT19QUkVGSVgsb3V0d19wKSh1MTYsIHVuc2lnbmVkIGxvbmcpOwordm9pZCBJT19DT05DQVQoX19JT19QUkVGSVgsb3V0bF9wKSh1MzIsIHVuc2lnbmVkIGxvbmcpOwogCi1leHRlcm4gdW5zaWduZWQgY2hhciBnZW5lcmljX2luYl9wKHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdW5zaWduZWQgc2hvcnQgZ2VuZXJpY19pbndfcCh1bnNpZ25lZCBsb25nIHBvcnQpOwotZXh0ZXJuIHVuc2lnbmVkIGludCBnZW5lcmljX2lubF9wKHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdm9pZCBnZW5lcmljX291dGJfcCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpOwotZXh0ZXJuIHZvaWQgZ2VuZXJpY19vdXR3X3AodW5zaWduZWQgc2hvcnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdm9pZCBnZW5lcmljX291dGxfcCh1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCk7Cit2b2lkIElPX0NPTkNBVChfX0lPX1BSRUZJWCxpbnNiKSh1bnNpZ25lZCBsb25nLCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpOwordm9pZCBJT19DT05DQVQoX19JT19QUkVGSVgsaW5zdykodW5zaWduZWQgbG9uZywgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KTsKK3ZvaWQgSU9fQ09OQ0FUKF9fSU9fUFJFRklYLGluc2wpKHVuc2lnbmVkIGxvbmcsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCk7Cit2b2lkIElPX0NPTkNBVChfX0lPX1BSRUZJWCxvdXRzYikodW5zaWduZWQgbG9uZywgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKK3ZvaWQgSU9fQ09OQ0FUKF9fSU9fUFJFRklYLG91dHN3KSh1bnNpZ25lZCBsb25nLCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpOwordm9pZCBJT19DT05DQVQoX19JT19QUkVGSVgsb3V0c2wpKHVuc2lnbmVkIGxvbmcsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBjb3VudCk7CiAKLWV4dGVybiB2b2lkIGdlbmVyaWNfaW5zYih1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgZ2VuZXJpY19pbnN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBnZW5lcmljX2luc2wodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIGdlbmVyaWNfb3V0c2IodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIGdlbmVyaWNfb3V0c3codW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIGdlbmVyaWNfb3V0c2wodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKK3U4IElPX0NPTkNBVChfX0lPX1BSRUZJWCxyZWFkYikodm9pZCBfX2lvbWVtICopOwordTE2IElPX0NPTkNBVChfX0lPX1BSRUZJWCxyZWFkdykodm9pZCBfX2lvbWVtICopOwordTMyIElPX0NPTkNBVChfX0lPX1BSRUZJWCxyZWFkbCkodm9pZCBfX2lvbWVtICopOwordm9pZCBJT19DT05DQVQoX19JT19QUkVGSVgsd3JpdGViKSh1OCwgdm9pZCBfX2lvbWVtICopOwordm9pZCBJT19DT05DQVQoX19JT19QUkVGSVgsd3JpdGV3KSh1MTYsIHZvaWQgX19pb21lbSAqKTsKK3ZvaWQgSU9fQ09OQ0FUKF9fSU9fUFJFRklYLHdyaXRlbCkodTMyLCB2b2lkIF9faW9tZW0gKik7CiAKLWV4dGVybiB1bnNpZ25lZCBjaGFyIGdlbmVyaWNfcmVhZGIodW5zaWduZWQgbG9uZyBhZGRyKTsKLWV4dGVybiB1bnNpZ25lZCBzaG9ydCBnZW5lcmljX3JlYWR3KHVuc2lnbmVkIGxvbmcgYWRkcik7Ci1leHRlcm4gdW5zaWduZWQgaW50IGdlbmVyaWNfcmVhZGwodW5zaWduZWQgbG9uZyBhZGRyKTsKLWV4dGVybiB2b2lkIGdlbmVyaWNfd3JpdGViKHVuc2lnbmVkIGNoYXIgYiwgdW5zaWduZWQgbG9uZyBhZGRyKTsKLWV4dGVybiB2b2lkIGdlbmVyaWNfd3JpdGV3KHVuc2lnbmVkIHNob3J0IGIsIHVuc2lnbmVkIGxvbmcgYWRkcik7Ci1leHRlcm4gdm9pZCBnZW5lcmljX3dyaXRlbCh1bnNpZ25lZCBpbnQgYiwgdW5zaWduZWQgbG9uZyBhZGRyKTsKK3ZvaWQgKklPX0NPTkNBVChfX0lPX1BSRUZJWCxpb3JlbWFwKSh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKTsKK3ZvaWQgSU9fQ09OQ0FUKF9fSU9fUFJFRklYLGlvdW5tYXApKHZvaWQgKmFkZHIpOwogCi1leHRlcm4gdm9pZCAqZ2VuZXJpY19pb3JlbWFwKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUpOwotZXh0ZXJuIHZvaWQgZ2VuZXJpY19pb3VubWFwKHZvaWQgKmFkZHIpOwordm9pZCBfX2lvbWVtICpJT19DT05DQVQoX19JT19QUkVGSVgsaW9wb3J0X21hcCkodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgc2l6ZSk7Cit2b2lkIElPX0NPTkNBVChfX0lPX1BSRUZJWCxpb3BvcnRfdW5tYXApKHZvaWQgX19pb21lbSAqYWRkcik7CiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGdlbmVyaWNfaXNhX3BvcnQyYWRkcih1bnNpZ25lZCBsb25nIG9mZnNldCk7Ci0KLSNlbmRpZiAvKiBfQVNNX1NIX0lPX0dFTkVSSUNfSCAqLworI3VuZGVmIF9fSU9fUFJFRklYCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9pb2N0bC5oIGIvaW5jbHVkZS9hc20tc2gvaW9jdGwuaAppbmRleCA1MjQ3MDBlLi5iMjc5ZmUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9pb2N0bC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2lvY3RsLmgKQEAgLTEsNzUgKzEgQEAKLS8qICRJZDogaW9jdGwuaCx2IDEuMS4xLjEgMjAwMS8xMC8xNSAyMDo0NTowOSBtcmJyb3duIEV4cCAkCi0gKgotICogbGludXgvaW9jdGwuaCBmb3IgTGludXggYnkgSC5ILiBCZXJnbWFuLgotICovCi0KLSNpZm5kZWYgX19BU01fU0hfSU9DVExfSAotI2RlZmluZSBfX0FTTV9TSF9JT0NUTF9ICi0KLS8qIGlvY3RsIGNvbW1hbmQgZW5jb2Rpbmc6IDMyIGJpdHMgdG90YWwsIGNvbW1hbmQgaW4gbG93ZXIgMTYgYml0cywKLSAqIHNpemUgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgaW4gdGhlIGxvd2VyIDE0IGJpdHMgb2YgdGhlCi0gKiB1cHBlciAxNiBiaXRzLgotICogRW5jb2RpbmcgdGhlIHNpemUgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgaW4gdGhlIGlvY3RsIHJlcXVlc3QKLSAqIGlzIHVzZWZ1bCBmb3IgY2F0Y2hpbmcgcHJvZ3JhbXMgY29tcGlsZWQgd2l0aCBvbGQgdmVyc2lvbnMKLSAqIGFuZCB0byBhdm9pZCBvdmVyd3JpdGluZyB1c2VyIHNwYWNlIG91dHNpZGUgdGhlIHVzZXIgYnVmZmVyIGFyZWEuCi0gKiBUaGUgaGlnaGVzdCAyIGJpdHMgYXJlIHJlc2VydmVkIGZvciBpbmRpY2F0aW5nIHRoZSBgYGFjY2VzcyBtb2RlJycuCi0gKiBOT1RFOiBUaGlzIGxpbWl0cyB0aGUgbWF4IHBhcmFtZXRlciBzaXplIHRvIDE2a0IgLTEgIQotICovCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGlzIGZvciBjb21wYXRpYmlsaXR5IGFjcm9zcyB0aGUgdmFyaW91cyBMaW51eAotICogcGxhdGZvcm1zLiAgVGhlIGkzODYgaW9jdGwgbnVtYmVyaW5nIHNjaGVtZSBkb2Vzbid0IHJlYWxseSBlbmZvcmNlCi0gKiBhIHR5cGUgZmllbGQuICBEZSBmYWN0bywgaG93ZXZlciwgdGhlIHRvcCA4IGJpdHMgb2YgdGhlIGxvd2VyIDE2Ci0gKiBiaXRzIGFyZSBpbmRlZWQgdXNlZCBhcyBhIHR5cGUgZmllbGQsIHNvIHdlIG1pZ2h0IGp1c3QgYXMgd2VsbCBtYWtlCi0gKiB0aGlzIGV4cGxpY2l0IGhlcmUuICBQbGVhc2UgYmUgc3VyZSB0byB1c2UgdGhlIGRlY29kaW5nIG1hY3JvcwotICogYmVsb3cgZnJvbSBub3cgb24uCi0gKi8KLSNkZWZpbmUgX0lPQ19OUkJJVFMJOAotI2RlZmluZSBfSU9DX1RZUEVCSVRTCTgKLSNkZWZpbmUgX0lPQ19TSVpFQklUUwkxNAotI2RlZmluZSBfSU9DX0RJUkJJVFMJMgotCi0jZGVmaW5lIF9JT0NfTlJNQVNLCSgoMSA8PCBfSU9DX05SQklUUyktMSkKLSNkZWZpbmUgX0lPQ19UWVBFTUFTSwkoKDEgPDwgX0lPQ19UWVBFQklUUyktMSkKLSNkZWZpbmUgX0lPQ19TSVpFTUFTSwkoKDEgPDwgX0lPQ19TSVpFQklUUyktMSkKLSNkZWZpbmUgX0lPQ19ESVJNQVNLCSgoMSA8PCBfSU9DX0RJUkJJVFMpLTEpCi0KLSNkZWZpbmUgX0lPQ19OUlNISUZUCTAKLSNkZWZpbmUgX0lPQ19UWVBFU0hJRlQJKF9JT0NfTlJTSElGVCtfSU9DX05SQklUUykKLSNkZWZpbmUgX0lPQ19TSVpFU0hJRlQJKF9JT0NfVFlQRVNISUZUK19JT0NfVFlQRUJJVFMpCi0jZGVmaW5lIF9JT0NfRElSU0hJRlQJKF9JT0NfU0laRVNISUZUK19JT0NfU0laRUJJVFMpCi0KLS8qCi0gKiBEaXJlY3Rpb24gYml0cy4KLSAqLwotI2RlZmluZSBfSU9DX05PTkUJMFUKLSNkZWZpbmUgX0lPQ19XUklURQkxVQotI2RlZmluZSBfSU9DX1JFQUQJMlUKLQotI2RlZmluZSBfSU9DKGRpcix0eXBlLG5yLHNpemUpIFwKLQkoKChkaXIpICA8PCBfSU9DX0RJUlNISUZUKSB8IFwKLQkgKCh0eXBlKSA8PCBfSU9DX1RZUEVTSElGVCkgfCBcCi0JICgobnIpICAgPDwgX0lPQ19OUlNISUZUKSB8IFwKLQkgKChzaXplKSA8PCBfSU9DX1NJWkVTSElGVCkpCi0KLS8qIHVzZWQgdG8gY3JlYXRlIG51bWJlcnMgKi8KLSNkZWZpbmUgX0lPKHR5cGUsbnIpCQlfSU9DKF9JT0NfTk9ORSwodHlwZSksKG5yKSwwKQotI2RlZmluZSBfSU9SKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1JFQUQsKHR5cGUpLChuciksc2l6ZW9mKHNpemUpKQotI2RlZmluZSBfSU9XKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1dSSVRFLCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKLSNkZWZpbmUgX0lPV1IodHlwZSxucixzaXplKQlfSU9DKF9JT0NfUkVBRHxfSU9DX1dSSVRFLCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKLQotLyogdXNlZCB0byBkZWNvZGUgaW9jdGwgbnVtYmVycy4uICovCi0jZGVmaW5lIF9JT0NfRElSKG5yKQkJKCgobnIpID4+IF9JT0NfRElSU0hJRlQpICYgX0lPQ19ESVJNQVNLKQotI2RlZmluZSBfSU9DX1RZUEUobnIpCQkoKChucikgPj4gX0lPQ19UWVBFU0hJRlQpICYgX0lPQ19UWVBFTUFTSykKLSNkZWZpbmUgX0lPQ19OUihucikJCSgoKG5yKSA+PiBfSU9DX05SU0hJRlQpICYgX0lPQ19OUk1BU0spCi0jZGVmaW5lIF9JT0NfU0laRShucikJCSgoKG5yKSA+PiBfSU9DX1NJWkVTSElGVCkgJiBfSU9DX1NJWkVNQVNLKQotCi0vKiAuLi5hbmQgZm9yIHRoZSBkcml2ZXJzL3NvdW5kIGZpbGVzLi4uICovCi0KLSNkZWZpbmUgSU9DX0lOCQkoX0lPQ19XUklURSA8PCBfSU9DX0RJUlNISUZUKQotI2RlZmluZSBJT0NfT1VUCQkoX0lPQ19SRUFEIDw8IF9JT0NfRElSU0hJRlQpCi0jZGVmaW5lIElPQ19JTk9VVAkoKF9JT0NfV1JJVEV8X0lPQ19SRUFEKSA8PCBfSU9DX0RJUlNISUZUKQotI2RlZmluZSBJT0NTSVpFX01BU0sJKF9JT0NfU0laRU1BU0sgPDwgX0lPQ19TSVpFU0hJRlQpCi0jZGVmaW5lIElPQ1NJWkVfU0hJRlQJKF9JT0NfU0laRVNISUZUKQotCi0jZW5kaWYgLyogX19BU01fU0hfSU9DVExfSCAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2lvY3RsLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9pcnEtc2g3NzgwLmggYi9pbmNsdWRlL2FzbS1zaC9pcnEtc2g3NzgwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM4Y2ExMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNoL2lycS1zaDc3ODAuaApAQCAtMCwwICsxLDM0OSBAQAorI2lmbmRlZiBfX0FTTV9TSF9JUlFfU0g3NzgwX0gKKyNkZWZpbmUgX19BU01fU0hfSVJRX1NINzc4MF9ICisKKy8qCisgKiBsaW51eC9pbmNsdWRlL2FzbS1zaC9pcnEtc2g3NzgwLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgVGFrYXNoaSBTSFVETyA8c2h1ZG9AaGl0YWNoaS11bC5jby5qcD4KKyAqLworCisjaWZkZWYgQ09ORklHX0lERQorIyBpZm5kZWYgSVJRX0NGQ0FSRAorIyAgZGVmaW5lIElSUV9DRkNBUkQJMTQKKyMgZW5kaWYKKyMgaWZuZGVmIElSUV9QQ01DSUEKKyMgIGRlZmluZSBJUlFfUENNQ0lBCTE1CisjIGVuZGlmCisjZW5kaWYKKworI2RlZmluZSBJTlRDX0JBU0UJMHhmZmQwMDAwMAorI2RlZmluZSBJTlRDX0lDUjAJKElOVENfQkFTRSsweDApCisjZGVmaW5lIElOVENfSUNSMQkoSU5UQ19CQVNFKzB4MWMpCisjZGVmaW5lIElOVENfSU5UUFJJCShJTlRDX0JBU0UrMHgxMCkKKyNkZWZpbmUgSU5UQ19JTlRSRVEJKElOVENfQkFTRSsweDI0KQorI2RlZmluZSBJTlRDX0lOVE1TSzAJKElOVENfQkFTRSsweDQ0KQorI2RlZmluZSBJTlRDX0lOVE1TSzEJKElOVENfQkFTRSsweDQ4KQorI2RlZmluZSBJTlRDX0lOVE1TSzIJKElOVENfQkFTRSsweDQwMDgwKQorI2RlZmluZSBJTlRDX0lOVE1TS0NMUjAJKElOVENfQkFTRSsweDY0KQorI2RlZmluZSBJTlRDX0lOVE1TS0NMUjEJKElOVENfQkFTRSsweDY4KQorI2RlZmluZSBJTlRDX0lOVE1TS0NMUjIJKElOVENfQkFTRSsweDQwMDg0KQorI2RlZmluZSBJTlRDX05NSUZDUgkoSU5UQ19CQVNFKzB4YzApCisjZGVmaW5lIElOVENfVVNFUklNQVNLCShJTlRDX0JBU0UrMHgzMDAwMCkKKworI2RlZmluZQlJTlRDX0lOVDJQUkkwCShJTlRDX0JBU0UrMHg0MDAwMCkKKyNkZWZpbmUJSU5UQ19JTlQyUFJJMQkoSU5UQ19CQVNFKzB4NDAwMDQpCisjZGVmaW5lCUlOVENfSU5UMlBSSTIJKElOVENfQkFTRSsweDQwMDA4KQorI2RlZmluZQlJTlRDX0lOVDJQUkkzCShJTlRDX0JBU0UrMHg0MDAwYykKKyNkZWZpbmUJSU5UQ19JTlQyUFJJNAkoSU5UQ19CQVNFKzB4NDAwMTApCisjZGVmaW5lCUlOVENfSU5UMlBSSTUJKElOVENfQkFTRSsweDQwMDE0KQorI2RlZmluZQlJTlRDX0lOVDJQUkk2CShJTlRDX0JBU0UrMHg0MDAxOCkKKyNkZWZpbmUJSU5UQ19JTlQyUFJJNwkoSU5UQ19CQVNFKzB4NDAwMWMpCisjZGVmaW5lCUlOVENfSU5UMkEwCShJTlRDX0JBU0UrMHg0MDAzMCkKKyNkZWZpbmUJSU5UQ19JTlQyQTEJKElOVENfQkFTRSsweDQwMDM0KQorI2RlZmluZQlJTlRDX0lOVDJNU0tSCShJTlRDX0JBU0UrMHg0MDAzOCkKKyNkZWZpbmUJSU5UQ19JTlQyTVNLQ1IJKElOVENfQkFTRSsweDQwMDNjKQorI2RlZmluZQlJTlRDX0lOVDJCMAkoSU5UQ19CQVNFKzB4NDAwNDApCisjZGVmaW5lCUlOVENfSU5UMkIxCShJTlRDX0JBU0UrMHg0MDA0NCkKKyNkZWZpbmUJSU5UQ19JTlQyQjIJKElOVENfQkFTRSsweDQwMDQ4KQorI2RlZmluZQlJTlRDX0lOVDJCMwkoSU5UQ19CQVNFKzB4NDAwNGMpCisjZGVmaW5lCUlOVENfSU5UMkI0CShJTlRDX0JBU0UrMHg0MDA1MCkKKyNkZWZpbmUJSU5UQ19JTlQyQjUJKElOVENfQkFTRSsweDQwMDU0KQorI2RlZmluZQlJTlRDX0lOVDJCNgkoSU5UQ19CQVNFKzB4NDAwNTgpCisjZGVmaW5lCUlOVENfSU5UMkI3CShJTlRDX0JBU0UrMHg0MDA1YykKKyNkZWZpbmUJSU5UQ19JTlQyR1BJQwkoSU5UQ19CQVNFKzB4NDAwOTApCisvKgorICBOT1RFOgorICAqX0lSUSA9IChJTlRFVlQyIC0gMHgyMDApLzB4MjAKKyovCisvKiBJUlEgMC03IGxpbmUgZXh0ZXJuYWwgaW50Ki8KKyNkZWZpbmUgSVJRMF9JUlEJMgorI2RlZmluZSBJUlEwX0lQUl9BRERSCUlOVENfSU5UUFJJCisjZGVmaW5lIElSUTBfSVBSX1BPUwk3CisjZGVmaW5lIElSUTBfUFJJT1JJVFkJMgorCisjZGVmaW5lIElSUTFfSVJRCTQKKyNkZWZpbmUgSVJRMV9JUFJfQUREUglJTlRDX0lOVFBSSQorI2RlZmluZSBJUlExX0lQUl9QT1MJNgorI2RlZmluZSBJUlExX1BSSU9SSVRZCTIKKworI2RlZmluZSBJUlEyX0lSUQk2CisjZGVmaW5lIElSUTJfSVBSX0FERFIJSU5UQ19JTlRQUkkKKyNkZWZpbmUgSVJRMl9JUFJfUE9TCTUKKyNkZWZpbmUgSVJRMl9QUklPUklUWQkyCisKKyNkZWZpbmUgSVJRM19JUlEJOAorI2RlZmluZSBJUlEzX0lQUl9BRERSCUlOVENfSU5UUFJJCisjZGVmaW5lIElSUTNfSVBSX1BPUwk0CisjZGVmaW5lIElSUTNfUFJJT1JJVFkJMgorCisjZGVmaW5lIElSUTRfSVJRCTEwCisjZGVmaW5lIElSUTRfSVBSX0FERFIJSU5UQ19JTlRQUkkKKyNkZWZpbmUgSVJRNF9JUFJfUE9TCTMKKyNkZWZpbmUgSVJRNF9QUklPUklUWQkyCisKKyNkZWZpbmUgSVJRNV9JUlEJMTIKKyNkZWZpbmUgSVJRNV9JUFJfQUREUglJTlRDX0lOVFBSSQorI2RlZmluZSBJUlE1X0lQUl9QT1MJMgorI2RlZmluZSBJUlE1X1BSSU9SSVRZCTIKKworI2RlZmluZSBJUlE2X0lSUQkxNAorI2RlZmluZSBJUlE2X0lQUl9BRERSCUlOVENfSU5UUFJJCisjZGVmaW5lIElSUTZfSVBSX1BPUwkxCisjZGVmaW5lIElSUTZfUFJJT1JJVFkJMgorCisjZGVmaW5lIElSUTdfSVJRCTAKKyNkZWZpbmUgSVJRN19JUFJfQUREUglJTlRDX0lOVFBSSQorI2RlZmluZSBJUlE3X0lQUl9QT1MJMAorI2RlZmluZSBJUlE3X1BSSU9SSVRZCTIKKworLyogVE1VICovCisvKiBjaDAgKi8KKyNkZWZpbmUgVE1VX0lSUQkJMjgKKyNkZWZpbmUJVE1VX0lQUl9BRERSCUlOVENfSU5UMlBSSTAKKyNkZWZpbmUJVE1VX0lQUl9QT1MJMworI2RlZmluZSBUTVVfUFJJT1JJVFkJMgorCisjZGVmaW5lIFRJTUVSX0lSUQkyOAorI2RlZmluZQlUSU1FUl9JUFJfQUREUglJTlRDX0lOVDJQUkkwCisjZGVmaW5lCVRJTUVSX0lQUl9QT1MJMworI2RlZmluZSBUSU1FUl9QUklPUklUWQkyCisKKy8qIGNoIDEqLworI2RlZmluZSBUTVVfQ0gxX0lSUQkJMjkKKyNkZWZpbmUJVE1VX0NIMV9JUFJfQUREUglJTlRDX0lOVDJQUkkwCisjZGVmaW5lCVRNVV9DSDFfSVBSX1BPUwkJMgorI2RlZmluZSBUTVVfQ0gxX1BSSU9SSVRZCTIKKworI2RlZmluZSBUSU1FUjFfSVJRCTI5CisjZGVmaW5lCVRJTUVSMV9JUFJfQUREUglJTlRDX0lOVDJQUkkwCisjZGVmaW5lCVRJTUVSMV9JUFJfUE9TCTIKKyNkZWZpbmUgVElNRVIxX1BSSU9SSVRZCTIKKworLyogY2ggMiovCisjZGVmaW5lIFRNVV9DSDJfSVJRCQkzMAorI2RlZmluZQlUTVVfQ0gyX0lQUl9BRERSCUlOVENfSU5UMlBSSTAKKyNkZWZpbmUJVE1VX0NIMl9JUFJfUE9TCQkxCisjZGVmaW5lIFRNVV9DSDJfUFJJT1JJVFkJMgorLyogY2ggMiBJbnB1dCBjYXB0dXJlICovCisjZGVmaW5lIFRNVV9DSDJJQ19JUlEJCTMxCisjZGVmaW5lCVRNVV9DSDJJQ19JUFJfQUREUglJTlRDX0lOVDJQUkkwCisjZGVmaW5lCVRNVV9DSDJJQ19JUFJfUE9TCTAKKyNkZWZpbmUgVE1VX0NIMklDX1BSSU9SSVRZCTIKKy8qIGNoIDMgKi8KKyNkZWZpbmUgVE1VX0NIM19JUlEJCTk2CisjZGVmaW5lCVRNVV9DSDNfSVBSX0FERFIJSU5UQ19JTlQyUFJJMQorI2RlZmluZQlUTVVfQ0gzX0lQUl9QT1MJCTMKKyNkZWZpbmUgVE1VX0NIM19QUklPUklUWQkyCisvKiBjaCA0ICovCisjZGVmaW5lIFRNVV9DSDRfSVJRCQk5NworI2RlZmluZQlUTVVfQ0g0X0lQUl9BRERSCUlOVENfSU5UMlBSSTEKKyNkZWZpbmUJVE1VX0NINF9JUFJfUE9TCQkyCisjZGVmaW5lIFRNVV9DSDRfUFJJT1JJVFkJMgorLyogY2ggNSovCisjZGVmaW5lIFRNVV9DSDVfSVJRCQk5OAorI2RlZmluZQlUTVVfQ0g1X0lQUl9BRERSCUlOVENfSU5UMlBSSTEKKyNkZWZpbmUJVE1VX0NINV9JUFJfUE9TCQkxCisjZGVmaW5lIFRNVV9DSDVfUFJJT1JJVFkJMgorCisjZGVmaW5lCVJUQ19JUlEJCTIyCisjZGVmaW5lCVJUQ19JUFJfQUREUglJTlRDX0lOVDJQUkkxCisjZGVmaW5lCVJUQ19JUFJfUE9TCTAKKyNkZWZpbmUJUlRDX1BSSU9SSVRZCVRJTUVSX1BSSU9SSVRZCisKKy8qIFNDSUYwICovCisjZGVmaW5lIFNDSUYwX0VSSV9JUlEJNDAKKyNkZWZpbmUgU0NJRjBfUlhJX0lSUQk0MQorI2RlZmluZSBTQ0lGMF9CUklfSVJRCTQyCisjZGVmaW5lIFNDSUYwX1RYSV9JUlEJNDMKKyNkZWZpbmUJU0NJRjBfSVBSX0FERFIJSU5UQ19JTlQyUFJJMgorI2RlZmluZQlTQ0lGMF9JUFJfUE9TCTMKKyNkZWZpbmUgU0NJRjBfUFJJT1JJVFkJMworCisvKiBTQ0lGMSAqLworI2RlZmluZSBTQ0lGMV9FUklfSVJRCTc2CisjZGVmaW5lIFNDSUYxX1JYSV9JUlEJNzcKKyNkZWZpbmUgU0NJRjFfQlJJX0lSUQk3OAorI2RlZmluZSBTQ0lGMV9UWElfSVJRCTc5CisjZGVmaW5lCVNDSUYxX0lQUl9BRERSCUlOVENfSU5UMlBSSTIKKyNkZWZpbmUJU0NJRjFfSVBSX1BPUwkyCisjZGVmaW5lIFNDSUYxX1BSSU9SSVRZCTMKKworI2RlZmluZQlXRFRfSVJRCQkyNworI2RlZmluZQlXRFRfSVBSX0FERFIJSU5UQ19JTlQyUFJJMgorI2RlZmluZQlXRFRfSVBSX1BPUwkxCisjZGVmaW5lCVdEVF9QUklPUklUWQkyCisKKy8qIERNQUMoMCkgKi8KKyNkZWZpbmUJRE1JTlQwX0lSUQkzNAorI2RlZmluZQlETUlOVDFfSVJRCTM1CisjZGVmaW5lCURNSU5UMl9JUlEJMzYKKyNkZWZpbmUJRE1JTlQzX0lSUQkzNworI2RlZmluZQlETUlOVDRfSVJRCTQ0CisjZGVmaW5lCURNSU5UNV9JUlEJNDUKKyNkZWZpbmUJRE1JTlQ2X0lSUQk0NgorI2RlZmluZQlETUlOVDdfSVJRCTQ3CisjZGVmaW5lCURNQUVfSVJRCTM4CisjZGVmaW5lCURNQTBfSVBSX0FERFIJSU5UQ19JTlQyUFJJMworI2RlZmluZQlETUEwX0lQUl9QT1MJMgorI2RlZmluZQlETUEwX1BSSU9SSVRZCTcKKworLyogRE1BQygxKSAqLworI2RlZmluZQlETUlOVDhfSVJRCTkyCisjZGVmaW5lCURNSU5UOV9JUlEJOTMKKyNkZWZpbmUJRE1JTlQxMF9JUlEJOTQKKyNkZWZpbmUJRE1JTlQxMV9JUlEJOTUKKyNkZWZpbmUJRE1BMV9JUFJfQUREUglJTlRDX0lOVDJQUkkzCisjZGVmaW5lCURNQTFfSVBSX1BPUwkxCisjZGVmaW5lCURNQTFfUFJJT1JJVFkJNworCisjZGVmaW5lCURNVEUwX0lSUQlETUlOVDBfSVJRCisjZGVmaW5lCURNVEU0X0lSUQlETUlOVDRfSVJRCisjZGVmaW5lCURNQV9JUFJfQUREUglETUEwX0lQUl9BRERSCisjZGVmaW5lCURNQV9JUFJfUE9TCURNQTBfSVBSX1BPUworI2RlZmluZQlETUFfUFJJT1JJVFkJRE1BMF9QUklPUklUWQorCisvKiBDTVQgKi8KKyNkZWZpbmUJQ01UX0lSUQkJNTYKKyNkZWZpbmUJQ01UX0lQUl9BRERSCUlOVENfSU5UMlBSSTQKKyNkZWZpbmUJQ01UX0lQUl9QT1MJMworI2RlZmluZQlDTVRfUFJJT1JJVFkJMAorCisvKiBIQUMgKi8KKyNkZWZpbmUJSEFDX0lSUQkJNjAKKyNkZWZpbmUJSEFDX0lQUl9BRERSCUlOVENfSU5UMlBSSTQKKyNkZWZpbmUJSEFDX0lQUl9QT1MJMgorI2RlZmluZQlDTVRfUFJJT1JJVFkJMAorCisvKiBQQ0lDKDApICovCisjZGVmaW5lCVBDSUMwX0lSUQk2NAorI2RlZmluZQlQQ0lDMF9JUFJfQUREUglJTlRDX0lOVDJQUkk0CisjZGVmaW5lCVBDSUMwX0lQUl9QT1MJMQorI2RlZmluZQlQQ0lDMF9QUklPUklUWQkyCisKKy8qIFBDSUMoMSkgKi8KKyNkZWZpbmUJUENJQzFfSVJRCTY1CisjZGVmaW5lCVBDSUMxX0lQUl9BRERSCUlOVENfSU5UMlBSSTQKKyNkZWZpbmUJUENJQzFfSVBSX1BPUwkwCisjZGVmaW5lCVBDSUMxX1BSSU9SSVRZCTIKKworLyogUENJQygyKSAqLworI2RlZmluZQlQQ0lDMl9JUlEJNjYKKyNkZWZpbmUJUENJQzJfSVBSX0FERFIJSU5UQ19JTlQyUFJJNQorI2RlZmluZQlQQ0lDMl9JUFJfUE9TCTMKKyNkZWZpbmUJUENJQzJfUFJJT1JJVFkJMgorCisvKiBQQ0lDKDMpICovCisjZGVmaW5lCVBDSUMzX0lSUQk2NworI2RlZmluZQlQQ0lDM19JUFJfQUREUglJTlRDX0lOVDJQUkk1CisjZGVmaW5lCVBDSUMzX0lQUl9QT1MJMgorI2RlZmluZQlQQ0lDM19QUklPUklUWQkyCisKKy8qIFBDSUMoNCkgKi8KKyNkZWZpbmUJUENJQzRfSVJRCTY4CisjZGVmaW5lCVBDSUM0X0lQUl9BRERSCUlOVENfSU5UMlBSSTUKKyNkZWZpbmUJUENJQzRfSVBSX1BPUwkxCisjZGVmaW5lCVBDSUM0X1BSSU9SSVRZCTIKKworLyogUENJQyg1KSAqLworI2RlZmluZQlQQ0lDRVJSX0lSUQk2OQorI2RlZmluZQlQQ0lDUFdEM19JUlEJNzAKKyNkZWZpbmUJUENJQ1BXRDJfSVJRCTcxCisjZGVmaW5lCVBDSUNQV0QxX0lSUQk3MgorI2RlZmluZQlQQ0lDUFdEMF9JUlEJNzMKKyNkZWZpbmUJUENJQzVfSVBSX0FERFIJSU5UQ19JTlQyUFJJNQorI2RlZmluZQlQQ0lDNV9JUFJfUE9TCTAKKyNkZWZpbmUJUENJQzVfUFJJT1JJVFkJMgorCisvKiBTSU9GICovCisjZGVmaW5lCVNJT0ZfSVJRCTgwCisjZGVmaW5lCVNJT0ZfSVBSX0FERFIJSU5UQ19JTlQyUFJJNgorI2RlZmluZQlTSU9GX0lQUl9QT1MJMworI2RlZmluZQlTSU9GX1BSSU9SSVRZCTMKKworLyogSFNQSSAqLworI2RlZmluZQlIU1BJX0lSUQk4NAorI2RlZmluZQlIU1BJX0lQUl9BRERSCUlOVENfSU5UMlBSSTYKKyNkZWZpbmUJSFNQSV9JUFJfUE9TCTIKKyNkZWZpbmUJSFNQSV9QUklPUklUWQkzCisKKy8qIE1NQ0lGICovCisjZGVmaW5lCU1NQ0lGX0ZTVEFUX0lSUQk4OAorI2RlZmluZQlNTUNJRl9UUkFOX0lSUQk4OQorI2RlZmluZQlNTUNJRl9FUlJfSVJRCTkwCisjZGVmaW5lCU1NQ0lGX0ZSRFlfSVJRCTkxCisjZGVmaW5lCU1NQ0lGX0lQUl9BRERSCUlOVENfSU5UMlBSSTYKKyNkZWZpbmUJTU1DSUZfSVBSX1BPUwkxCisjZGVmaW5lCUhTUElfUFJJT1JJVFkJMworCisvKiBTU0kgKi8KKyNkZWZpbmUJU1NJX0lSUQkJMTAwCisjZGVmaW5lCVNTSV9JUFJfQUREUglJTlRDX0lOVDJQUkk2CisjZGVmaW5lCVNTSV9JUFJfUE9TCTAKKyNkZWZpbmUJU1NJX1BSSU9SSVRZCTMKKworLyogRkxDVEwgKi8KKyNkZWZpbmUJRkxDVExfRkxTVEVfSVJRCQkxMDQKKyNkZWZpbmUJRkxDVExfRkxURU5EX0lSUQkxMDUKKyNkZWZpbmUJRkxDVExfRkxUUlEwX0lSUQkxMDYKKyNkZWZpbmUJRkxDVExfRkxUUlExX0lSUQkxMDcKKyNkZWZpbmUJRkxDVExfSVBSX0FERFIJCUlOVENfSU5UMlBSSTcKKyNkZWZpbmUJRkxDVExfSVBSX1BPUwkJMworI2RlZmluZQlGTENUTF9QUklPUklUWQkJMworCisvKiBHUElPICovCisjZGVmaW5lCUdQSU8wX0lSUQkxMDgKKyNkZWZpbmUJR1BJTzFfSVJRCTEwOQorI2RlZmluZQlHUElPMl9JUlEJMTEwCisjZGVmaW5lCUdQSU8zX0lSUQkxMTEKKyNkZWZpbmUJR1BJT19JUFJfQUREUglJTlRDX0lOVDJQUkk3CisjZGVmaW5lCUdQSU9fSVBSX1BPUwkyCisjZGVmaW5lCUdQSU9fUFJJT1JJVFkJMworCisvKiBPTkNISVBfTlJfSVJRUyAqLworI2RlZmluZSBOUl9JUlFTIDE1MAkvKiAxMTEgKyAxNiAqLworCisvKiBJbiBhIGdlbmVyaWMga2VybmVsLCBOUl9JUlFTIGlzIGFuIHVwcGVyIGJvdW5kLCBhbmQgd2Ugc2hvdWxkIHVzZQorICogQUNUVUFMX05SX0lSUVMgKHdoaWNoIHVzZXMgdGhlIG1hY2hpbmUgdmVjdG9yKSB0byBnZXQgdGhlIGNvcnJlY3QgdmFsdWUuCisgKi8KKyNkZWZpbmUgQUNUVUFMX05SX0lSUVMgTlJfSVJRUworCitleHRlcm4gdm9pZCBkaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgZGlzYWJsZV9pcnFfbm9zeW5jKHVuc2lnbmVkIGludCk7CitleHRlcm4gdm9pZCBlbmFibGVfaXJxKHVuc2lnbmVkIGludCk7CisKKy8qCisgKiBTaW1wbGUgTWFzayBSZWdpc3RlciBTdXBwb3J0CisgKi8KK2V4dGVybiB2b2lkIG1ha2VfbWFza3JlZ19pcnEodW5zaWduZWQgaW50IGlycSk7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgKmlycV9tYXNrX3JlZ2lzdGVyOworCisvKgorICogRnVuY3Rpb24gZm9yICJvbiBjaGlwIHN1cHBvcnQgbW9kdWxlcyIuCisgKi8KK2V4dGVybiB2b2lkIG1ha2VfaW1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpOworCisjZGVmaW5lCUlOVENfVE1VMF9NU0sJMAorI2RlZmluZQlJTlRDX1RNVTNfTVNLCTEKKyNkZWZpbmUJSU5UQ19SVENfTVNLCTIKKyNkZWZpbmUJSU5UQ19TQ0lGMF9NU0sJMworI2RlZmluZQlJTlRDX1NDSUYxX01TSwk0CisjZGVmaW5lCUlOVENfV0RUX01TSwk1CisjZGVmaW5lCUlOVENfSFVJRF9NU0sJNworI2RlZmluZQlJTlRDX0RNQUMwX01TSwk4CisjZGVmaW5lCUlOVENfRE1BQzFfTVNLCTkKKyNkZWZpbmUJSU5UQ19DTVRfTVNLCTEyCisjZGVmaW5lCUlOVENfSEFDX01TSwkxMworI2RlZmluZQlJTlRDX1BDSUMwX01TSwkxNAorI2RlZmluZQlJTlRDX1BDSUMxX01TSwkxNQorI2RlZmluZQlJTlRDX1BDSUMyX01TSwkxNgorI2RlZmluZQlJTlRDX1BDSUMzX01TSwkxNworI2RlZmluZQlJTlRDX1BDSUM0X01TSwkxOAorI2RlZmluZQlJTlRDX1BDSUM1X01TSwkxOQorI2RlZmluZQlJTlRDX1NJT0ZfTVNLCTIwCisjZGVmaW5lCUlOVENfSFNQSV9NU0sJMjEKKyNkZWZpbmUJSU5UQ19NTUNJRl9NU0sJMjIKKyNkZWZpbmUJSU5UQ19TU0lfTVNLCTIzCisjZGVmaW5lCUlOVENfRkxDVExfTVNLCTI0CisjZGVmaW5lCUlOVENfR1BJT19NU0sJMjUKKworI2VuZGlmIC8qIF9fQVNNX1NIX0lSUV9TSDc3ODBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvaXJxLmggYi9pbmNsdWRlL2FzbS1zaC9pcnEuaAppbmRleCA2MTRhOGMxLi4wNjBlYzNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9pcnEuaApAQCAtMTUsMTMgKzE1LDIwIEBACiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CQkvKiBmb3IgcHRfcmVncyAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfU0hfSFA2MDApIHx8IFwKKyNpZiBkZWZpbmVkKENPTkZJR19TSF9IUDZYWCkgfHwgXAogICAgIGRlZmluZWQoQ09ORklHX1NIX1JUUzc3NTFSMkQpIHx8IFwKICAgICBkZWZpbmVkKENPTkZJR19TSF9IUzc3NTFSVk9JUCkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX1NIX1NIMDMpCisgICAgZGVmaW5lZChDT05GSUdfU0hfSFM3NzUxUlZPSVApIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19TSF9TSDAzKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfU0hfUjc3ODBSUCkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX1NIX0xBTkRJU0spCiAjaW5jbHVkZSA8YXNtL21hY2gvaWRlLmg+CiAjZW5kaWYKIAorI2lmbmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwCisKKyNkZWZpbmUgSU5UQ19ETUFDMF9NU0sJMAorCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NIMykKICNkZWZpbmUgSU5UQ19JUFJBCTB4ZmZmZmZlZTJVTAogI2RlZmluZSBJTlRDX0lQUkIJMHhmZmZmZmVlNFVMCkBAIC0yMzUsOCArMjQyLDkgQEAKICNkZWZpbmUgU0NJRjFfSVBSX0FERFIJSU5UQ19JUFJCCiAjZGVmaW5lIFNDSUYxX0lQUl9QT1MJMQogI2RlZmluZSBTQ0lGMV9QUklPUklUWQkzCi0jZW5kaWYKLSNlbmRpZgorI2VuZGlmIC8qIFNUNDBTVEIxICovCisKKyNlbmRpZiAvKiA3NzV4IC8gU0g0LTIwMiAvIFNUNDBTVEIxICovCiAKIC8qIE5SX0lSUVMgaXMgbWFkZSBmcm9tIHRocmVlIGNvbXBvbmVudHM6CiAgKiAgIDEuIE9OQ0hJUF9OUl9JUlFTIC0gbnVtYmVyIG9mIElSTFMgKyBvbi1jaGlwIHBlcmlwaGVyaWFsIG1vZHVsZXMKQEAgLTI0NSwzNyArMjUzLDM1IEBACiAgKi8KIAogLyogMS4gT05DSElQX05SX0lSUVMgKi8KLSNpZmRlZiBDT05GSUdfU0hfR0VORVJJQworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzYwNCkKKyMgZGVmaW5lIE9OQ0hJUF9OUl9JUlFTIDI0CS8vIEFjdHVhbGx5IDIxCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDcpCisjIGRlZmluZSBPTkNISVBfTlJfSVJRUyA2NAorIyBkZWZpbmUgUElOVF9OUl9JUlFTICAgMTYKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCkKKyMgZGVmaW5lIE9OQ0hJUF9OUl9JUlFTIDMyCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkKKyMgZGVmaW5lIE9OQ0hJUF9OUl9JUlFTIDY0CS8vIEFjdHVhbGx5IDYxCisjIGRlZmluZSBQSU5UX05SX0lSUVMgICAxNgorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwKQorIyBkZWZpbmUgT05DSElQX05SX0lSUVMgNDgJLy8gQWN0dWFsbHkgNDQKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkKKyMgZGVmaW5lIE9OQ0hJUF9OUl9JUlFTIDcyCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjApCisjIGRlZmluZSBPTkNISVBfTlJfSVJRUyAxMTIJLyogWFhYICovCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyKQorIyBkZWZpbmUgT05DSElQX05SX0lSUVMgNzIKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBTVEIxKQogIyBkZWZpbmUgT05DSElQX05SX0lSUVMgMTQ0Ci0jZWxzZQotIyBpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQpCi0jICBkZWZpbmUgT05DSElQX05SX0lSUVMgMjQJLy8gQWN0dWFsbHkgMjEKLSMgZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDcpCi0jICBkZWZpbmUgT05DSElQX05SX0lSUVMgNjQKLSMgIGRlZmluZSBQSU5UX05SX0lSUVMgICAxNgotIyBlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCkKLSMgIGRlZmluZSBPTkNISVBfTlJfSVJRUyAzMgotIyBlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSkgfHwgXAotICAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkKLSMgIGRlZmluZSBPTkNISVBfTlJfSVJRUyA2NAkvLyBBY3R1YWxseSA2MQotIyAgZGVmaW5lIFBJTlRfTlJfSVJRUyAgIDE2Ci0jIGVsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwKQotIyAgZGVmaW5lIE9OQ0hJUF9OUl9JUlFTIDQ4CS8vIEFjdHVhbGx5IDQ0Ci0jIGVsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxKQotIyAgZGVmaW5lIE9OQ0hJUF9OUl9JUlFTIDcyCi0jIGVsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwKQotIyAgZGVmaW5lIE9OQ0hJUF9OUl9JUlFTIDExMAotIyBlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIpCi0jICBkZWZpbmUgT05DSElQX05SX0lSUVMgNzIKLSMgZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSkKLSMgIGRlZmluZSBPTkNISVBfTlJfSVJRUyAxNDQKLSMgZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDApCi0jICBkZWZpbmUgT05DSElQX05SX0lSUVMgMTA5Ci0jIGVuZGlmCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDApCisjIGRlZmluZSBPTkNISVBfTlJfSVJRUyAxMDkKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NIX1VOS05PV04pCS8qIE1vc3QgYmUgbGFzdCAqLworIyBkZWZpbmUgT05DSElQX05SX0lSUVMgMTQ0CiAjZW5kaWYKIAogLyogMi4gUElOVF9OUl9JUlFTICovCi0jaWZkZWYgQ09ORklHX1NIX0dFTkVSSUMKKyNpZmRlZiBDT05GSUdfU0hfVU5LTk9XTgogIyBkZWZpbmUgUElOVF9OUl9JUlFTIDE2CiAjZWxzZQogIyBpZm5kZWYgUElOVF9OUl9JUlFTCkBAIC0yODgsMjIgKzI5NCwyMiBAQAogI2VuZGlmCiAKIC8qIDMuIE9GRkNISVBfTlJfSVJRUyAqLwotI2lmZGVmIENPTkZJR19TSF9HRU5FUklDCisjaWYgZGVmaW5lZChDT05GSUdfSEQ2NDQ2MSkKKyMgZGVmaW5lIE9GRkNISVBfTlJfSVJRUyAxOAorI2VsaWYgZGVmaW5lZCAoQ09ORklHX1NIX0JJR1NVUikgLyogbXVzdCBiZSBiZWZvcmUgQ09ORklHX0hENjQ0NjUgKi8KKyMgZGVmaW5lIE9GRkNISVBfTlJfSVJRUyA0OAorI2VsaWYgZGVmaW5lZChDT05GSUdfSEQ2NDQ2NSkKICMgZGVmaW5lIE9GRkNISVBfTlJfSVJRUyAxNgorI2VsaWYgZGVmaW5lZCAoQ09ORklHX1NIX0VDMzEwNCkKKyMgZGVmaW5lIE9GRkNISVBfTlJfSVJRUyAxNgorI2VsaWYgZGVmaW5lZCAoQ09ORklHX1NIX0RSRUFNQ0FTVCkKKyMgZGVmaW5lIE9GRkNISVBfTlJfSVJRUyA5NgorI2VsaWYgZGVmaW5lZCAoQ09ORklHX1NIX1RJVEFOKQorIyBkZWZpbmUgT0ZGQ0hJUF9OUl9JUlFTIDQKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NIX1VOS05PV04pCisjIGRlZmluZSBPRkZDSElQX05SX0lSUVMgMTYJLyogTXVzdCBhbHNvIGJlIGxhc3QgKi8KICNlbHNlCi0jIGlmIGRlZmluZWQoQ09ORklHX0hENjQ0NjEpCi0jICBkZWZpbmUgT0ZGQ0hJUF9OUl9JUlFTIDE4Ci0jIGVsaWYgZGVmaW5lZCAoQ09ORklHX1NIX0JJR1NVUikgLyogbXVzdCBiZSBiZWZvcmUgQ09ORklHX0hENjQ0NjUgKi8KLSMgIGRlZmluZSBPRkZDSElQX05SX0lSUVMgNDgKLSMgZWxpZiBkZWZpbmVkKENPTkZJR19IRDY0NDY1KQotIyAgZGVmaW5lIE9GRkNISVBfTlJfSVJRUyAxNgotIyBlbGlmIGRlZmluZWQgKENPTkZJR19TSF9FQzMxMDQpCi0jICBkZWZpbmUgT0ZGQ0hJUF9OUl9JUlFTIDE2Ci0jIGVsaWYgZGVmaW5lZCAoQ09ORklHX1NIX0RSRUFNQ0FTVCkKLSMgIGRlZmluZSBPRkZDSElQX05SX0lSUVMgOTYKLSMgZWxzZQotIyAgZGVmaW5lIE9GRkNISVBfTlJfSVJRUyAwCi0jIGVuZGlmCisjIGRlZmluZSBPRkZDSElQX05SX0lSUVMgMAogI2VuZGlmCiAKICNpZiBPRkZDSElQX05SX0lSUVMgPiAwCkBAIC0zMTMsMTYgKzMxOSw2IEBACiAvKiBOUl9JUlFTLiAxKzIrMyAqLwogI2RlZmluZSBOUl9JUlFTIChPTkNISVBfTlJfSVJRUyArIFBJTlRfTlJfSVJRUyArIE9GRkNISVBfTlJfSVJRUykKIAotLyogSW4gYSBnZW5lcmljIGtlcm5lbCwgTlJfSVJRUyBpcyBhbiB1cHBlciBib3VuZCwgYW5kIHdlIHNob3VsZCB1c2UKLSAqIEFDVFVBTF9OUl9JUlFTICh3aGljaCB1c2VzIHRoZSBtYWNoaW5lIHZlY3RvcikgdG8gZ2V0IHRoZSBjb3JyZWN0IHZhbHVlLgotICovCi0jaWZkZWYgQ09ORklHX1NIX0dFTkVSSUMKLSMgZGVmaW5lIEFDVFVBTF9OUl9JUlFTIChzaF9tdi5tdl9ucl9pcnFzKQotI2Vsc2UKLSMgZGVmaW5lIEFDVFVBTF9OUl9JUlFTIE5SX0lSUVMKLSNlbmRpZgotCi0KIGV4dGVybiB2b2lkIGRpc2FibGVfaXJxKHVuc2lnbmVkIGludCk7CiBleHRlcm4gdm9pZCBkaXNhYmxlX2lycV9ub3N5bmModW5zaWduZWQgaW50KTsKIGV4dGVybiB2b2lkIGVuYWJsZV9pcnEodW5zaWduZWQgaW50KTsKQEAgLTU0Miw5ICs1MzgsNiBAQAogCiBleHRlcm4gaW50IGlwcl9pcnFfZGVtdXgoaW50IGlycSk7CiAjZGVmaW5lIF9faXJxX2RlbXV4KGlycSkgaXByX2lycV9kZW11eChpcnEpCi0KLSNlbHNlCi0jZGVmaW5lIF9faXJxX2RlbXV4KGlycSkgaXJxCiAjZW5kaWYgLyogQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNyB8fCBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5ICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkgfHwgXApAQCAtNTU3LDE4ICs1NTAsMzUgQEAKICNkZWZpbmUgSU5UQ19JQ1JfSVJMTQkoMTw8NykKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBTVEIxCisjZWxzZQorI2luY2x1ZGUgPGFzbS9pcnEtc2g3NzgwLmg+CisjZW5kaWYKIAotI2RlZmluZSBJTlRDMl9GSVJTVF9JUlEgNjQKLSNkZWZpbmUgTlJfSU5UQzJfSVJRUyAyNQotCisvKiBTSCB3aXRoIElOVEMyLXN0eWxlIGludGVycnVwdHMgKi8KKyNpZmRlZiBDT05GSUdfQ1BVX0hBU19JTlRDMl9JUlEKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSkKICNkZWZpbmUgSU5UQzJfQkFTRQkweGZlMDgwMDAwCi0jZGVmaW5lIElOVEMyX0lOVEMyTU9ERQkoSU5UQzJfQkFTRSsweDgwKQotCi0jZGVmaW5lIElOVEMyX0lOVFBSSV9PRkZTRVQJMHgwMAorI2RlZmluZSBJTlRDMl9GSVJTVF9JUlEgNjQKICNkZWZpbmUgSU5UQzJfSU5UUkVRX09GRlNFVAkweDIwCiAjZGVmaW5lIElOVEMyX0lOVE1TS19PRkZTRVQJMHg0MAogI2RlZmluZSBJTlRDMl9JTlRNU0tDTFJfT0ZGU0VUCTB4NjAKKyNkZWZpbmUgTlJfSU5UQzJfSVJRUwkyNQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwKQorI2RlZmluZSBJTlRDMl9CQVNFCTB4ZmUwODAwMDAKKyNkZWZpbmUgSU5UQzJfRklSU1RfSVJRIDQ4CS8qIElOVEVWVCAweDgwMCAqLworI2RlZmluZSBJTlRDMl9JTlRSRVFfT0ZGU0VUCTB4MjAKKyNkZWZpbmUgSU5UQzJfSU5UTVNLX09GRlNFVAkweDQwCisjZGVmaW5lIElOVEMyX0lOVE1TS0NMUl9PRkZTRVQJMHg2MAorI2RlZmluZSBOUl9JTlRDMl9JUlFTCTY0CisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApCisjZGVmaW5lIElOVEMyX0JBU0UJMHhmZmQ0MDAwMAorI2RlZmluZSBJTlRDMl9GSVJTVF9JUlEJMjIKKyNkZWZpbmUgSU5UQzJfSU5UTVNLX09GRlNFVAkoMHgzOCkKKyNkZWZpbmUgSU5UQzJfSU5UTVNLQ0xSX09GRlNFVAkoMHgzYykKKyNkZWZpbmUgTlJfSU5UQzJfSVJRUwk2MAorI2VuZGlmCisKKyNkZWZpbmUgSU5UQzJfSU5UUFJJX09GRlNFVAkweDAwCiAKIHZvaWQgbWFrZV9pbnRjMl9pcnEodW5zaWduZWQgaW50IGlycSwKIAkJICAgIHVuc2lnbmVkIGludCBpcHJfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgaXByX3NoaWZ0LApAQCAtNTc3LDEzICs1ODcsMTYgQEAKIHZvaWQgaW5pdF9JUlFfaW50YzIodm9pZCk7CiB2b2lkIGludGMyX2FkZF9jbGVhcl9pcnEoaW50IGlycSwgaW50ICgqZm4pKGludCkpOwogCi0jZW5kaWYJLyogQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBTVEIxICovCisjZW5kaWYKIAogc3RhdGljIGlubGluZSBpbnQgZ2VuZXJpY19pcnFfZGVtdXgoaW50IGlycSkKIHsKIAlyZXR1cm4gaXJxOwogfQogCisjaWZuZGVmIF9faXJxX2RlbXV4CisjZGVmaW5lIF9faXJxX2RlbXV4KGlycSkJKGlycSkKKyNlbmRpZgogI2RlZmluZSBpcnFfY2Fub25pY2FsaXplKGlycSkJKGlycSkKICNkZWZpbmUgaXJxX2RlbXV4KGlycSkJCV9faXJxX2RlbXV4KHNoX212Lm12X2lycV9kZW11eChpcnEpKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9rZXhlYy5oIGIvaW5jbHVkZS9hc20tc2gva2V4ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGZlNTlmNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNoL2tleGVjLmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBfU0hfS0VYRUNfSAorI2RlZmluZSBfU0hfS0VYRUNfSAorCisvKgorICogS0VYRUNfU09VUkNFX01FTU9SWV9MSU1JVCBtYXhpbXVtIHBhZ2UgZ2V0X2ZyZWVfcGFnZSBjYW4gcmV0dXJuLgorICogSS5lLiBNYXhpbXVtIHBhZ2UgdGhhdCBpcyBtYXBwZWQgZGlyZWN0bHkgaW50byBrZXJuZWwgbWVtb3J5LAorICogYW5kIGttYXAgaXMgbm90IHJlcXVpcmVkLgorICoKKyAqIFNvbWVvbmUgY29ycmVjdCBtZSBpZiBGSVhBRERSX1NUQVJUIC0gUEFHRU9GRlNFVCBpcyBub3QgdGhlIGNvcnJlY3QKKyAqIGNhbGN1bGF0aW9uIGZvciB0aGUgYW1vdW50IG9mIG1lbW9yeSBkaXJlY3RseSBtYXBwYWJsZSBpbnRvIHRoZQorICoga2VybmVsIG1lbW9yeSBzcGFjZS4KKyAqLworCisvKiBNYXhpbXVtIHBoeXNpY2FsIGFkZHJlc3Mgd2UgY2FuIHVzZSBwYWdlcyBmcm9tICovCisjZGVmaW5lIEtFWEVDX1NPVVJDRV9NRU1PUllfTElNSVQgKC0xVUwpCisvKiBNYXhpbXVtIGFkZHJlc3Mgd2UgY2FuIHJlYWNoIGluIHBoeXNpY2FsIGFkZHJlc3MgbW9kZSAqLworI2RlZmluZSBLRVhFQ19ERVNUSU5BVElPTl9NRU1PUllfTElNSVQgKC0xVUwpCisvKiBNYXhpbXVtIGFkZHJlc3Mgd2UgY2FuIHVzZSBmb3IgdGhlIGNvbnRyb2wgY29kZSBidWZmZXIgKi8KKyNkZWZpbmUgS0VYRUNfQ09OVFJPTF9NRU1PUllfTElNSVQgVEFTS19TSVpFCisKKyNkZWZpbmUgS0VYRUNfQ09OVFJPTF9DT0RFX1NJWkUJNDA5NgorCisvKiBUaGUgbmF0aXZlIGFyY2hpdGVjdHVyZSAqLworI2RlZmluZSBLRVhFQ19BUkNIIEtFWEVDX0FSQ0hfU0gKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworZXh0ZXJuIHZvaWQgbWFjaGluZV9zaHV0ZG93bih2b2lkKTsKK2V4dGVybiB2b2lkICpjcmFzaF9ub3RlczsKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYgLyogX1NIX0tFWEVDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL21hY2h2ZWMuaCBiL2luY2x1ZGUvYXNtLXNoL21hY2h2ZWMuaAppbmRleCAzZjE4YWExLi41NTBjNTBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9tYWNodmVjLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvbWFjaHZlYy5oCkBAIC0xOCw0NCArMTgsMzcgQEAKICNpbmNsdWRlIDxhc20vbWFjaHZlY19pbml0Lmg+CiAKIHN0cnVjdCBkZXZpY2U7Ci1zdHJ1Y3QgdGltZXZhbDsKIAotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yCi17CitzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgewogCWludCBtdl9ucl9pcnFzOwogCi0JdW5zaWduZWQgY2hhciAoKm12X2luYikodW5zaWduZWQgbG9uZyk7Ci0JdW5zaWduZWQgc2hvcnQgKCptdl9pbncpKHVuc2lnbmVkIGxvbmcpOwotCXVuc2lnbmVkIGludCAoKm12X2lubCkodW5zaWduZWQgbG9uZyk7Ci0Jdm9pZCAoKm12X291dGIpKHVuc2lnbmVkIGNoYXIsIHVuc2lnbmVkIGxvbmcpOwotCXZvaWQgKCptdl9vdXR3KSh1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgbG9uZyk7Ci0Jdm9pZCAoKm12X291dGwpKHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CisJdTggKCptdl9pbmIpKHVuc2lnbmVkIGxvbmcpOworCXUxNiAoKm12X2ludykodW5zaWduZWQgbG9uZyk7CisJdTMyICgqbXZfaW5sKSh1bnNpZ25lZCBsb25nKTsKKwl2b2lkICgqbXZfb3V0YikodTgsIHVuc2lnbmVkIGxvbmcpOworCXZvaWQgKCptdl9vdXR3KSh1MTYsIHVuc2lnbmVkIGxvbmcpOworCXZvaWQgKCptdl9vdXRsKSh1MzIsIHVuc2lnbmVkIGxvbmcpOwogCi0JdW5zaWduZWQgY2hhciAoKm12X2luYl9wKSh1bnNpZ25lZCBsb25nKTsKLQl1bnNpZ25lZCBzaG9ydCAoKm12X2lud19wKSh1bnNpZ25lZCBsb25nKTsKLQl1bnNpZ25lZCBpbnQgKCptdl9pbmxfcCkodW5zaWduZWQgbG9uZyk7Ci0Jdm9pZCAoKm12X291dGJfcCkodW5zaWduZWQgY2hhciwgdW5zaWduZWQgbG9uZyk7Ci0Jdm9pZCAoKm12X291dHdfcCkodW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIGxvbmcpOwotCXZvaWQgKCptdl9vdXRsX3ApKHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CisJdTggKCptdl9pbmJfcCkodW5zaWduZWQgbG9uZyk7CisJdTE2ICgqbXZfaW53X3ApKHVuc2lnbmVkIGxvbmcpOworCXUzMiAoKm12X2lubF9wKSh1bnNpZ25lZCBsb25nKTsKKwl2b2lkICgqbXZfb3V0Yl9wKSh1OCwgdW5zaWduZWQgbG9uZyk7CisJdm9pZCAoKm12X291dHdfcCkodTE2LCB1bnNpZ25lZCBsb25nKTsKKwl2b2lkICgqbXZfb3V0bF9wKSh1MzIsIHVuc2lnbmVkIGxvbmcpOwogCi0Jdm9pZCAoKm12X2luc2IpKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci0Jdm9pZCAoKm12X2luc3cpKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci0Jdm9pZCAoKm12X2luc2wpKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci0Jdm9pZCAoKm12X291dHNiKSh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotCXZvaWQgKCptdl9vdXRzdykodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLQl2b2lkICgqbXZfb3V0c2wpKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7CisJdm9pZCAoKm12X2luc2IpKHVuc2lnbmVkIGxvbmcsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCk7CisJdm9pZCAoKm12X2luc3cpKHVuc2lnbmVkIGxvbmcsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCk7CisJdm9pZCAoKm12X2luc2wpKHVuc2lnbmVkIGxvbmcsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCk7CisJdm9pZCAoKm12X291dHNiKSh1bnNpZ25lZCBsb25nLCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpOworCXZvaWQgKCptdl9vdXRzdykodW5zaWduZWQgbG9uZywgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKKwl2b2lkICgqbXZfb3V0c2wpKHVuc2lnbmVkIGxvbmcsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBjb3VudCk7CiAKLQl1bnNpZ25lZCBjaGFyICgqbXZfcmVhZGIpKHVuc2lnbmVkIGxvbmcpOwotCXVuc2lnbmVkIHNob3J0ICgqbXZfcmVhZHcpKHVuc2lnbmVkIGxvbmcpOwotCXVuc2lnbmVkIGludCAoKm12X3JlYWRsKSh1bnNpZ25lZCBsb25nKTsKLQl2b2lkICgqbXZfd3JpdGViKSh1bnNpZ25lZCBjaGFyLCB1bnNpZ25lZCBsb25nKTsKLQl2b2lkICgqbXZfd3JpdGV3KSh1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgbG9uZyk7Ci0Jdm9pZCAoKm12X3dyaXRlbCkodW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKLQotCXZvaWQqICgqbXZfaW9yZW1hcCkodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci0Jdm9pZCAoKm12X2lvdW5tYXApKHZvaWQgKmFkZHIpOwotCi0JdW5zaWduZWQgbG9uZyAoKm12X2lzYV9wb3J0MmFkZHIpKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKKwl1OCAoKm12X3JlYWRiKSh2b2lkIF9faW9tZW0gKik7CisJdTE2ICgqbXZfcmVhZHcpKHZvaWQgX19pb21lbSAqKTsKKwl1MzIgKCptdl9yZWFkbCkodm9pZCBfX2lvbWVtICopOworCXZvaWQgKCptdl93cml0ZWIpKHU4LCB2b2lkIF9faW9tZW0gKik7CisJdm9pZCAoKm12X3dyaXRldykodTE2LCB2b2lkIF9faW9tZW0gKik7CisJdm9pZCAoKm12X3dyaXRlbCkodTMyLCB2b2lkIF9faW9tZW0gKik7CiAKIAlpbnQgKCptdl9pcnFfZGVtdXgpKGludCBpcnEpOwogCkBAIC02Niw2ICs1OSw5IEBACiAKIAl2b2lkICooKm12X2NvbnNpc3RlbnRfYWxsb2MpKHN0cnVjdCBkZXZpY2UgKiwgc2l6ZV90LCBkbWFfYWRkcl90ICosIGdmcF90KTsKIAlpbnQgKCptdl9jb25zaXN0ZW50X2ZyZWUpKHN0cnVjdCBkZXZpY2UgKiwgc2l6ZV90LCB2b2lkICosIGRtYV9hZGRyX3QpOworCisJdm9pZCBfX2lvbWVtICooKm12X2lvcG9ydF9tYXApKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgaW50IHNpemUpOworCXZvaWQgKCptdl9pb3BvcnRfdW5tYXApKHZvaWQgX19pb21lbSAqKTsKIH07CiAKIGV4dGVybiBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3Igc2hfbXY7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9tdXRleC5oIGIvaW5jbHVkZS9hc20tc2gvbXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NThjMWY3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvbXV0ZXguaApAQCAtMCwwICsxLDkgQEAKKy8qCisgKiBQdWxsIGluIHRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbXV0ZXggZmFzdHBhdGguCisgKgorICogVE9ETzogaW1wbGVtZW50IG9wdGltaXplZCBwcmltaXRpdmVzIGluc3RlYWQsIG9yIGxlYXZlIHRoZSBnZW5lcmljCisgKiBpbXBsZW1lbnRhdGlvbiBpbiBwbGFjZSwgb3IgcGljayB0aGUgYXRvbWljX3hjaGcoKSBiYXNlZCBnZW5lcmljCisgKiBpbXBsZW1lbnRhdGlvbi4gKHNlZSBhc20tZ2VuZXJpYy9tdXRleC14Y2hnLmggZm9yIGRldGFpbHMpCisgKi8KKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL211dGV4LWRlYy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvcHRyYWNlLmggYi9pbmNsdWRlL2FzbS1zaC9wdHJhY2UuaAppbmRleCAwZjc1ZTE2Li43OTJmYzM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9wdHJhY2UuaApAQCAtOTEsNiArOTEsMTYgQEAKICNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT5wYykKIGV4dGVybiB2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqKTsKIAorI2lmZGVmIENPTkZJR19TSF9EU1AKKyNkZWZpbmUgdGFza19wdF9yZWdzKHRhc2spIFwKKwkoKHN0cnVjdCBwdF9yZWdzICopICh0YXNrX3N0YWNrX3BhZ2UodGFzaykgKyBUSFJFQURfU0laRSBcCisJCSAtIHNpemVvZihzdHJ1Y3QgcHRfZHNwcmVncykgLSBzaXplb2YodW5zaWduZWQgbG9uZykpIC0gMSkKKyNlbHNlCisjZGVmaW5lIHRhc2tfcHRfcmVncyh0YXNrKSBcCisJKChzdHJ1Y3QgcHRfcmVncyAqKSAodGFza19zdGFja19wYWdlKHRhc2spICsgVEhSRUFEX1NJWkUgXAorCQkgLSBzaXplb2YodW5zaWduZWQgbG9uZykpIC0gMSkKKyNlbmRpZgorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHJvZmlsZV9wYyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBsb25nIHBjID0gaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tc2gvc3lzdGVtLmgKaW5kZXggMjhhM2MyZC4uYmIwMzMwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvc3lzdGVtLmgKQEAgLTU3LDYgKzU3LDE2IEBACiAJbGFzdCA9IF9fbGFzdDsJCQkJCQkJXAogfSB3aGlsZSAoMCkKIAorLyoKKyAqIE9uIFNNUCBzeXN0ZW1zLCB3aGVuIHRoZSBzY2hlZHVsZXIgZG9lcyBtaWdyYXRpb24tY29zdCBhdXRvZGV0ZWN0aW9uLAorICogaXQgbmVlZHMgYSB3YXkgdG8gZmx1c2ggYXMgbXVjaCBvZiB0aGUgQ1BVJ3MgY2FjaGVzIGFzIHBvc3NpYmxlLgorICoKKyAqIFRPRE86IGZpbGwgdGhpcyBpbiEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNjaGVkX2NhY2hlZmx1c2godm9pZCkKK3sKK30KKwogI2RlZmluZSBub3AoKSBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm5vcCIpCiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLXNoL3RocmVhZF9pbmZvLmgKaW5kZXggNDYwODBjZS4uODVmMGMxMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1zaC90aHJlYWRfaW5mby5oCkBAIC02MCw4ICs2MCw2IEBACiAjZGVmaW5lIFRIUkVBRF9TSVpFICgyKlBBR0VfU0laRSkKICNkZWZpbmUgYWxsb2NfdGhyZWFkX2luZm8odGkpICgoc3RydWN0IHRocmVhZF9pbmZvICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwxKSkKICNkZWZpbmUgZnJlZV90aHJlYWRfaW5mbyh0aSkgZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgKHRpKSwgMSkKLSNkZWZpbmUgZ2V0X3RocmVhZF9pbmZvKHRpKSBnZXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKLSNkZWZpbmUgcHV0X3RocmVhZF9pbmZvKHRpKSBwdXRfdGFza19zdHJ1Y3QoKHRpKS0+dGFzaykKIAogI2Vsc2UgLyogIV9fQVNTRU1CTFlfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC90aW1lci5oIGIvaW5jbHVkZS9hc20tc2gvdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDY1NzljCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvdGltZXIuaApAQCAtMCwwICsxLDQyIEBACisjaWZuZGVmIF9fQVNNX1NIX1RJTUVSX0gKKyNkZWZpbmUgX19BU01fU0hfVElNRVJfSAorCisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8YXNtL2NwdS90aW1lci5oPgorCitzdHJ1Y3Qgc3lzX3RpbWVyX29wcyB7CisJaW50ICgqaW5pdCkodm9pZCk7CisJdW5zaWduZWQgbG9uZyAoKmdldF9vZmZzZXQpKHZvaWQpOworCXVuc2lnbmVkIGxvbmcgKCpnZXRfZnJlcXVlbmN5KSh2b2lkKTsKK307CisKK3N0cnVjdCBzeXNfdGltZXIgeworCWNvbnN0IGNoYXIJCSpuYW1lOworCisJc3RydWN0IHN5c19kZXZpY2UJZGV2OworCXN0cnVjdCBzeXNfdGltZXJfb3BzCSpvcHM7Cit9OworCisjZGVmaW5lIFRJQ0tfU0laRSAodGlja19uc2VjIC8gMTAwMCkKKworZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgdG11X3RpbWVyOworZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgKnN5c190aW1lcjsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF90aW1lcl9vZmZzZXQodm9pZCkKK3sKKwlyZXR1cm4gc3lzX3RpbWVyLT5vcHMtPmdldF9vZmZzZXQoKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF90aW1lcl9mcmVxdWVuY3kodm9pZCkKK3sKKwlyZXR1cm4gc3lzX3RpbWVyLT5vcHMtPmdldF9mcmVxdWVuY3koKTsKK30KKworLyogYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLmMgKi8KK3N0cnVjdCBzeXNfdGltZXIgKmdldF9zeXNfdGltZXIodm9pZCk7CisKKy8qIGFyY2gvc2gva2VybmVsL3RpbWUuYyAqLwordm9pZCBoYW5kbGVfdGltZXJfdGljayhzdHJ1Y3QgcHRfcmVncyAqKTsKKworI2VuZGlmIC8qIF9fQVNNX1NIX1RJTUVSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2g2NC9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLXNoNjQvYXRvbWljLmgKaW5kZXggZjNjZTVjMC4uMjhmMmVhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2g2NC9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS1zaDY0L2F0b21pYy5oCkBAIC0xMTMsNiArMTEzLDggQEAKIAlyZXR1cm4gcmV0OwogfQogCisjZGVmaW5lIGF0b21pY194Y2hnKHYsIG5ldykgKHhjaGcoJigodiktPmNvdW50ZXIpLCBuZXcpKQorCiBzdGF0aWMgaW5saW5lIGludCBhdG9taWNfYWRkX3VubGVzcyhhdG9taWNfdCAqdiwgaW50IGEsIGludCB1KQogewogCWludCByZXQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaDY0L2NhY2hlLmggYi9pbmNsdWRlL2FzbS1zaDY0L2NhY2hlLmgKaW5kZXggZjU0ZTg1ZS4uYTRmMzZmMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2g2NC9jYWNoZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoNjQvY2FjaGUuaApAQCAtMjAsOCArMjAsNiBAQAogI2RlZmluZSBMMV9DQUNIRV9BTElHTl9NQVNLCSh+KEwxX0NBQ0hFX0JZVEVTIC0gMSkpCiAjZGVmaW5lIEwxX0NBQ0hFX0FMSUdOKHgpCSgoKHgpKyhMMV9DQUNIRV9CWVRFUyAtIDEpKSAmIEwxX0NBQ0hFX0FMSUdOX01BU0spCiAjZGVmaW5lIEwxX0NBQ0hFX1NJWkVfQllURVMJKEwxX0NBQ0hFX0JZVEVTIDw8IDEwKQotLyogTGFyZ2VzdCBMMSB3aGljaCB0aGlzIGFyY2ggc3VwcG9ydHMgKi8KLSNkZWZpbmUgTDFfQ0FDSEVfU0hJRlRfTUFYCTUKIAogI2lmZGVmIE1PRFVMRQogI2RlZmluZSBfX2NhY2hlbGluZV9hbGlnbmVkIF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKEwxX0NBQ0hFX0JZVEVTKSkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaDY0L2Z1dGV4LmggYi9pbmNsdWRlL2FzbS1zaDY0L2Z1dGV4LmgKaW5kZXggOWZlZmY0Y2UuLjZhMzMyYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoNjQvZnV0ZXguaAorKysgYi9pbmNsdWRlL2FzbS1zaDY0L2Z1dGV4LmgKQEAgLTEsNTMgKzEsNiBAQAogI2lmbmRlZiBfQVNNX0ZVVEVYX0gKICNkZWZpbmUgX0FTTV9GVVRFWF9ICiAKLSNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZnV0ZXguaD4KIAotI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+Ci0jaW5jbHVkZSA8YXNtL2Vycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotc3RhdGljIGlubGluZSBpbnQKLWZ1dGV4X2F0b21pY19vcF9pbnVzZXIgKGludCBlbmNvZGVkX29wLCBpbnQgX191c2VyICp1YWRkcikKLXsKLQlpbnQgb3AgPSAoZW5jb2RlZF9vcCA+PiAyOCkgJiA3OwotCWludCBjbXAgPSAoZW5jb2RlZF9vcCA+PiAyNCkgJiAxNTsKLQlpbnQgb3BhcmcgPSAoZW5jb2RlZF9vcCA8PCA4KSA+PiAyMDsKLQlpbnQgY21wYXJnID0gKGVuY29kZWRfb3AgPDwgMjApID4+IDIwOwotCWludCBvbGR2YWwgPSAwLCByZXQ7Ci0JaWYgKGVuY29kZWRfb3AgJiAoRlVURVhfT1BfT1BBUkdfU0hJRlQgPDwgMjgpKQotCQlvcGFyZyA9IDEgPDwgb3Bhcmc7Ci0KLQlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpbmNfcHJlZW1wdF9jb3VudCgpOwotCi0Jc3dpdGNoIChvcCkgewotCWNhc2UgRlVURVhfT1BfU0VUOgotCWNhc2UgRlVURVhfT1BfQUREOgotCWNhc2UgRlVURVhfT1BfT1I6Ci0JY2FzZSBGVVRFWF9PUF9BTkROOgotCWNhc2UgRlVURVhfT1BfWE9SOgotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FTk9TWVM7Ci0JfQotCi0JZGVjX3ByZWVtcHRfY291bnQoKTsKLQotCWlmICghcmV0KSB7Ci0JCXN3aXRjaCAoY21wKSB7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOwotCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLSNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaDY0L2lvLmggYi9pbmNsdWRlL2FzbS1zaDY0L2lvLmgKaW5kZXggY2ZhZmFhNy4uZGVlNGY3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2g2NC9pby5oCisrKyBiL2luY2x1ZGUvYXNtLXNoNjQvaW8uaApAQCAtMTQzLDEyICsxNDMsMTIgQEAKICAqIENoYW5nZSB2aXJ0dWFsIGFkZHJlc3NlcyB0byBwaHlzaWNhbCBhZGRyZXNzZXMgYW5kIHZ2LgogICogVGhlc2UgYXJlIHRyaXZpYWwgb24gdGhlIDE6MSBMaW51eC9TdXBlckggbWFwcGluZwogICovCi1leHRlcm4gX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIHZpcnRfdG9fcGh5cyh2b2xhdGlsZSB2b2lkICogYWRkcmVzcykKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB2aXJ0X3RvX3BoeXModm9sYXRpbGUgdm9pZCAqIGFkZHJlc3MpCiB7CiAJcmV0dXJuIF9fcGEoYWRkcmVzcyk7CiB9CiAKLWV4dGVybiBfX2lubGluZV9fIHZvaWQgKiBwaHlzX3RvX3ZpcnQodW5zaWduZWQgbG9uZyBhZGRyZXNzKQorc3RhdGljIGlubGluZSB2b2lkICogcGh5c190b192aXJ0KHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKIAlyZXR1cm4gX192YShhZGRyZXNzKTsKIH0KQEAgLTE1NiwxMiArMTU2LDEyIEBACiBleHRlcm4gdm9pZCAqIF9faW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7CiAKLWV4dGVybiBfX2lubGluZV9fIHZvaWQgKiBpb3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCitzdGF0aWMgaW5saW5lIHZvaWQgKiBpb3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJcmV0dXJuIF9faW9yZW1hcChwaHlzX2FkZHIsIHNpemUsIDEpOwogfQogCi1leHRlcm4gX19pbmxpbmVfXyB2b2lkICogaW9yZW1hcF9ub2NhY2hlICh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQorc3RhdGljIGlubGluZSB2b2lkICogaW9yZW1hcF9ub2NhY2hlICh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXJldHVybiBfX2lvcmVtYXAocGh5c19hZGRyLCBzaXplLCAwKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvaW9jdGwuaCBiL2luY2x1ZGUvYXNtLXNoNjQvaW9jdGwuaAppbmRleCBjMDg5YTZmLi5iMjc5ZmUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaDY0L2lvY3RsLmgKKysrIGIvaW5jbHVkZS9hc20tc2g2NC9pb2N0bC5oCkBAIC0xLDgzICsxIEBACi0jaWZuZGVmIF9fQVNNX1NINjRfSU9DVExfSAotI2RlZmluZSBfX0FTTV9TSDY0X0lPQ1RMX0gKLQotLyoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIGluY2x1ZGUvYXNtLXNoNjQvaW9jdGwuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSAgUGFvbG8gQWxiZXJlbGxpCi0gKgotICogbGludXgvaW9jdGwuaCBmb3IgTGludXggYnkgSC5ILiBCZXJnbWFuLgotICoKLSAqLwotCi0vKiBpb2N0bCBjb21tYW5kIGVuY29kaW5nOiAzMiBiaXRzIHRvdGFsLCBjb21tYW5kIGluIGxvd2VyIDE2IGJpdHMsCi0gKiBzaXplIG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGluIHRoZSBsb3dlciAxNCBiaXRzIG9mIHRoZQotICogdXBwZXIgMTYgYml0cy4KLSAqIEVuY29kaW5nIHRoZSBzaXplIG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGluIHRoZSBpb2N0bCByZXF1ZXN0Ci0gKiBpcyB1c2VmdWwgZm9yIGNhdGNoaW5nIHByb2dyYW1zIGNvbXBpbGVkIHdpdGggb2xkIHZlcnNpb25zCi0gKiBhbmQgdG8gYXZvaWQgb3ZlcndyaXRpbmcgdXNlciBzcGFjZSBvdXRzaWRlIHRoZSB1c2VyIGJ1ZmZlciBhcmVhLgotICogVGhlIGhpZ2hlc3QgMiBiaXRzIGFyZSByZXNlcnZlZCBmb3IgaW5kaWNhdGluZyB0aGUgYGBhY2Nlc3MgbW9kZScnLgotICogTk9URTogVGhpcyBsaW1pdHMgdGhlIG1heCBwYXJhbWV0ZXIgc2l6ZSB0byAxNmtCIC0xICEKLSAqLwotCi0vKgotICogVGhlIGZvbGxvd2luZyBpcyBmb3IgY29tcGF0aWJpbGl0eSBhY3Jvc3MgdGhlIHZhcmlvdXMgTGludXgKLSAqIHBsYXRmb3Jtcy4gIFRoZSBpMzg2IGlvY3RsIG51bWJlcmluZyBzY2hlbWUgZG9lc24ndCByZWFsbHkgZW5mb3JjZQotICogYSB0eXBlIGZpZWxkLiAgRGUgZmFjdG8sIGhvd2V2ZXIsIHRoZSB0b3AgOCBiaXRzIG9mIHRoZSBsb3dlciAxNgotICogYml0cyBhcmUgaW5kZWVkIHVzZWQgYXMgYSB0eXBlIGZpZWxkLCBzbyB3ZSBtaWdodCBqdXN0IGFzIHdlbGwgbWFrZQotICogdGhpcyBleHBsaWNpdCBoZXJlLiAgUGxlYXNlIGJlIHN1cmUgdG8gdXNlIHRoZSBkZWNvZGluZyBtYWNyb3MKLSAqIGJlbG93IGZyb20gbm93IG9uLgotICovCi0jZGVmaW5lIF9JT0NfTlJCSVRTCTgKLSNkZWZpbmUgX0lPQ19UWVBFQklUUwk4Ci0jZGVmaW5lIF9JT0NfU0laRUJJVFMJMTQKLSNkZWZpbmUgX0lPQ19ESVJCSVRTCTIKLQotI2RlZmluZSBfSU9DX05STUFTSwkoKDEgPDwgX0lPQ19OUkJJVFMpLTEpCi0jZGVmaW5lIF9JT0NfVFlQRU1BU0sJKCgxIDw8IF9JT0NfVFlQRUJJVFMpLTEpCi0jZGVmaW5lIF9JT0NfU0laRU1BU0sJKCgxIDw8IF9JT0NfU0laRUJJVFMpLTEpCi0jZGVmaW5lIF9JT0NfRElSTUFTSwkoKDEgPDwgX0lPQ19ESVJCSVRTKS0xKQotCi0jZGVmaW5lIF9JT0NfTlJTSElGVAkwCi0jZGVmaW5lIF9JT0NfVFlQRVNISUZUCShfSU9DX05SU0hJRlQrX0lPQ19OUkJJVFMpCi0jZGVmaW5lIF9JT0NfU0laRVNISUZUCShfSU9DX1RZUEVTSElGVCtfSU9DX1RZUEVCSVRTKQotI2RlZmluZSBfSU9DX0RJUlNISUZUCShfSU9DX1NJWkVTSElGVCtfSU9DX1NJWkVCSVRTKQotCi0vKgotICogRGlyZWN0aW9uIGJpdHMuCi0gKi8KLSNkZWZpbmUgX0lPQ19OT05FCTBVCi0jZGVmaW5lIF9JT0NfV1JJVEUJMVUKLSNkZWZpbmUgX0lPQ19SRUFECTJVCi0KLSNkZWZpbmUgX0lPQyhkaXIsdHlwZSxucixzaXplKSBcCi0JKCgoZGlyKSAgPDwgX0lPQ19ESVJTSElGVCkgfCBcCi0JICgodHlwZSkgPDwgX0lPQ19UWVBFU0hJRlQpIHwgXAotCSAoKG5yKSAgIDw8IF9JT0NfTlJTSElGVCkgfCBcCi0JICgoc2l6ZSkgPDwgX0lPQ19TSVpFU0hJRlQpKQotCi0vKiB1c2VkIHRvIGNyZWF0ZSBudW1iZXJzICovCi0jZGVmaW5lIF9JTyh0eXBlLG5yKQkJX0lPQyhfSU9DX05PTkUsKHR5cGUpLChuciksMCkKLSNkZWZpbmUgX0lPUih0eXBlLG5yLHNpemUpCV9JT0MoX0lPQ19SRUFELCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKLSNkZWZpbmUgX0lPVyh0eXBlLG5yLHNpemUpCV9JT0MoX0lPQ19XUklURSwodHlwZSksKG5yKSxzaXplb2Yoc2l6ZSkpCi0jZGVmaW5lIF9JT1dSKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1JFQUR8X0lPQ19XUklURSwodHlwZSksKG5yKSxzaXplb2Yoc2l6ZSkpCi0KLS8qIHVzZWQgdG8gZGVjb2RlIGlvY3RsIG51bWJlcnMuLiAqLwotI2RlZmluZSBfSU9DX0RJUihucikJCSgoKG5yKSA+PiBfSU9DX0RJUlNISUZUKSAmIF9JT0NfRElSTUFTSykKLSNkZWZpbmUgX0lPQ19UWVBFKG5yKQkJKCgobnIpID4+IF9JT0NfVFlQRVNISUZUKSAmIF9JT0NfVFlQRU1BU0spCi0jZGVmaW5lIF9JT0NfTlIobnIpCQkoKChucikgPj4gX0lPQ19OUlNISUZUKSAmIF9JT0NfTlJNQVNLKQotI2RlZmluZSBfSU9DX1NJWkUobnIpCQkoKChucikgPj4gX0lPQ19TSVpFU0hJRlQpICYgX0lPQ19TSVpFTUFTSykKLQotLyogLi4uYW5kIGZvciB0aGUgZHJpdmVycy9zb3VuZCBmaWxlcy4uLiAqLwotCi0jZGVmaW5lIElPQ19JTgkJKF9JT0NfV1JJVEUgPDwgX0lPQ19ESVJTSElGVCkKLSNkZWZpbmUgSU9DX09VVAkJKF9JT0NfUkVBRCA8PCBfSU9DX0RJUlNISUZUKQotI2RlZmluZSBJT0NfSU5PVVQJKChfSU9DX1dSSVRFfF9JT0NfUkVBRCkgPDwgX0lPQ19ESVJTSElGVCkKLSNkZWZpbmUgSU9DU0laRV9NQVNLCShfSU9DX1NJWkVNQVNLIDw8IF9JT0NfU0laRVNISUZUKQotI2RlZmluZSBJT0NTSVpFX1NISUZUCShfSU9DX1NJWkVTSElGVCkKLQotI2VuZGlmIC8qIF9fQVNNX1NINjRfSU9DVExfSCAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2lvY3RsLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaDY0L21tdV9jb250ZXh0LmggYi9pbmNsdWRlL2FzbS1zaDY0L21tdV9jb250ZXh0LmgKaW5kZXggZjA2MmUxNS4uOTkxY2ZkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2g2NC9tbXVfY29udGV4dC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoNjQvbW11X2NvbnRleHQuaApAQCAtNTAsNyArNTAsNyBAQAogICovCiAjZGVmaW5lIE1NVV9WUE5fTUFTSwkweGZmZmZmMDAwCiAKLWV4dGVybiBfX2lubGluZV9fIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogZ2V0X25ld19tbXVfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAlleHRlcm4gdm9pZCBmbHVzaF90bGJfYWxsKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2g2NC9tdXRleC5oIGIvaW5jbHVkZS9hc20tc2g2NC9tdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OGMxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaDY0L211dGV4LmgKQEAgLTAsMCArMSw5IEBACisvKgorICogUHVsbCBpbiB0aGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIG11dGV4IGZhc3RwYXRoLgorICoKKyAqIFRPRE86IGltcGxlbWVudCBvcHRpbWl6ZWQgcHJpbWl0aXZlcyBpbnN0ZWFkLCBvciBsZWF2ZSB0aGUgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24gaW4gcGxhY2UsIG9yIHBpY2sgdGhlIGF0b21pY194Y2hnKCkgYmFzZWQgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24uIChzZWUgYXNtLWdlbmVyaWMvbXV0ZXgteGNoZy5oIGZvciBkZXRhaWxzKQorICovCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tdXRleC1kZWMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvcGdhbGxvYy5oIGIvaW5jbHVkZS9hc20tc2g2NC9wZ2FsbG9jLmgKaW5kZXggYjI1ZjVkZi4uNjc4MjUxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2g2NC9wZ2FsbG9jLmgKKysrIGIvaW5jbHVkZS9hc20tc2g2NC9wZ2FsbG9jLmgKQEAgLTM4LDE0ICszOCwxNCBAQAogICogaWYgYW55LgogICovCiAKLWV4dGVybiBfX2lubGluZV9fIHBnZF90ICpnZXRfcGdkX3Nsb3codm9pZCkKK3N0YXRpYyBpbmxpbmUgcGdkX3QgKmdldF9wZ2Rfc2xvdyh2b2lkKQogewogCXVuc2lnbmVkIGludCBwZ2Rfc2l6ZSA9IChVU0VSX1BUUlNfUEVSX1BHRCAqIHNpemVvZihwZ2RfdCkpOwogCXBnZF90ICpyZXQgPSAocGdkX3QgKilrbWFsbG9jKHBnZF9zaXplLCBHRlBfS0VSTkVMKTsKIAlyZXR1cm4gcmV0OwogfQogCi1leHRlcm4gX19pbmxpbmVfXyBwZ2RfdCAqZ2V0X3BnZF9mYXN0KHZvaWQpCitzdGF0aWMgaW5saW5lIHBnZF90ICpnZXRfcGdkX2Zhc3Qodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nICpyZXQ7CiAKQEAgLTYyLDE0ICs2MiwxNCBAQAogCXJldHVybiAocGdkX3QgKilyZXQ7CiB9CiAKLWV4dGVybiBfX2lubGluZV9fIHZvaWQgZnJlZV9wZ2RfZmFzdChwZ2RfdCAqcGdkKQorc3RhdGljIGlubGluZSB2b2lkIGZyZWVfcGdkX2Zhc3QocGdkX3QgKnBnZCkKIHsKIAkqKHVuc2lnbmVkIGxvbmcgKilwZ2QgPSAodW5zaWduZWQgbG9uZykgcGdkX3F1aWNrbGlzdDsKIAlwZ2RfcXVpY2tsaXN0ID0gKHVuc2lnbmVkIGxvbmcgKikgcGdkOwogCXBndGFibGVfY2FjaGVfc2l6ZSsrOwogfQogCi1leHRlcm4gX19pbmxpbmVfXyB2b2lkIGZyZWVfcGdkX3Nsb3cocGdkX3QgKnBnZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3BnZF9zbG93KHBnZF90ICpwZ2QpCiB7CiAJa2ZyZWUoKHZvaWQgKilwZ2QpOwogfQpAQCAtNzcsNyArNzcsNyBAQAogZXh0ZXJuIHB0ZV90ICpnZXRfcHRlX3Nsb3cocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzX3ByZWFkanVzdGVkKTsKIGV4dGVybiBwdGVfdCAqZ2V0X3B0ZV9rZXJuZWxfc2xvdyhwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHJlc3NfcHJlYWRqdXN0ZWQpOwogCi1leHRlcm4gX19pbmxpbmVfXyBwdGVfdCAqZ2V0X3B0ZV9mYXN0KHZvaWQpCitzdGF0aWMgaW5saW5lIHB0ZV90ICpnZXRfcHRlX2Zhc3Qodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nICpyZXQ7CiAKQEAgLTg5LDcgKzg5LDcgQEAKIAlyZXR1cm4gKHB0ZV90ICopcmV0OwogfQogCi1leHRlcm4gX19pbmxpbmVfXyB2b2lkIGZyZWVfcHRlX2Zhc3QocHRlX3QgKnB0ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3B0ZV9mYXN0KHB0ZV90ICpwdGUpCiB7CiAJKih1bnNpZ25lZCBsb25nICopcHRlID0gKHVuc2lnbmVkIGxvbmcpIHB0ZV9xdWlja2xpc3Q7CiAJcHRlX3F1aWNrbGlzdCA9ICh1bnNpZ25lZCBsb25nICopIHB0ZTsKQEAgLTE2Nyw3ICsxNjcsNyBAQAogCiBleHRlcm4gaW50IGRvX2NoZWNrX3BndF9jYWNoZShpbnQsIGludCk7CiAKLWV4dGVybiBpbmxpbmUgdm9pZCBzZXRfcGdkaXIodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwZ2RfdCBlbnRyeSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcGdkaXIodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwZ2RfdCBlbnRyeSkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBwOwogCXBnZF90ICpwZ2Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaDY0L3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXNoNjQvcGd0YWJsZS5oCmluZGV4IGExOTA2YTcuLjU3YWY2YjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoNjQvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoNjQvcGd0YWJsZS5oCkBAIC00MjEsMTggKzQyMSwxOCBAQAogc3RhdGljIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKSB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GSUxFOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1dSSVRFOyB9CiAKLWV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfUkVBRCkpOyByZXR1cm4gcHRlOyB9Ci1leHRlcm4gaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX1dSSVRFKSk7IHJldHVybiBwdGU7IH0KLWV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfRVhFQ1VURSkpOyByZXR1cm4gcHRlOyB9Ci1leHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9ESVJUWSkpOyByZXR1cm4gcHRlOyB9Ci1leHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfQUNDRVNTRUQpKTsgcmV0dXJuIHB0ZTsgfQorc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9SRUFEKSk7IHJldHVybiBwdGU7IH0KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfV1JJVEUpKTsgcmV0dXJuIHB0ZTsgfQorc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9FWEVDVVRFKSk7IHJldHVybiBwdGU7IH0KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX0RJUlRZKSk7IHJldHVybiBwdGU7IH0KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rb2xkKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9BQ0NFU1NFRCkpOyByZXR1cm4gcHRlOyB9CiAKLWV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9SRUFEKSk7IHJldHVybiBwdGU7IH0KLWV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfV1JJVEUpKTsgcmV0dXJuIHB0ZTsgfQotZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX0VYRUNVVEUpKTsgcmV0dXJuIHB0ZTsgfQotZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9ESVJUWSkpOyByZXR1cm4gcHRlOyB9Ci1leHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta3lvdW5nKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX0FDQ0VTU0VEKSk7IHJldHVybiBwdGU7IH0KLWV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21raHVnZShwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9TWkhVR0UpKTsgcmV0dXJuIHB0ZTsgfQorc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX1JFQUQpKTsgcmV0dXJuIHB0ZTsgfQorc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9XUklURSkpOyByZXR1cm4gcHRlOyB9CitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfRVhFQ1VURSkpOyByZXR1cm4gcHRlOyB9CitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX0RJUlRZKSk7IHJldHVybiBwdGU7IH0KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21reW91bmcocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfQUNDRVNTRUQpKTsgcmV0dXJuIHB0ZTsgfQorc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtodWdlKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX1NaSFVHRSkpOyByZXR1cm4gcHRlOyB9CiAKIAogLyoKQEAgLTQ1Niw3ICs0NTYsNyBAQAogI2RlZmluZSBta19wdGVfcGh5cyhwaHlzcGFnZSwgcGdwcm90KSBcCiAoeyBwdGVfdCBfX3B0ZTsgc2V0X3B0ZSgmX19wdGUsIF9fcHRlKHBoeXNwYWdlIHwgcGdwcm90X3ZhbChwZ3Byb3QpKSk7IF9fcHRlOyB9KQogCi1leHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9tb2RpZnkocHRlX3QgcHRlLCBwZ3Byb3RfdCBuZXdwcm90KQorc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbW9kaWZ5KHB0ZV90IHB0ZSwgcGdwcm90X3QgbmV3cHJvdCkKIHsgc2V0X3B0ZSgmcHRlLCBfX3B0ZSgocHRlX3ZhbChwdGUpICYgX1BBR0VfQ0hHX01BU0spIHwgcGdwcm90X3ZhbChuZXdwcm90KSkpOyByZXR1cm4gcHRlOyB9CiAKIHR5cGVkZWYgcHRlX3QgKnB0ZV9hZGRyX3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaDY0L3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tc2g2NC9wcm9jZXNzb3IuaAppbmRleCBhNTFiZDQxLi4xYmYyNTJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaDY0L3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLXNoNjQvcHJvY2Vzc29yLmgKQEAgLTIyOCw3ICsyMjgsNyBAQAogICogRlBVIGxhenkgc3RhdGUgc2F2ZSBoYW5kbGluZy4KICAqLwogCi1leHRlcm4gX19pbmxpbmVfXyB2b2lkIHJlbGVhc2VfZnB1KHZvaWQpCitzdGF0aWMgaW5saW5lIHZvaWQgcmVsZWFzZV9mcHUodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGxvbmcgX19kdW1teTsKIApAQCAtMjQwLDcgKzI0MCw3IEBACiAJCQkgICAgIDogInIiIChTUl9GRCkpOwogfQogCi1leHRlcm4gX19pbmxpbmVfXyB2b2lkIGdyYWJfZnB1KHZvaWQpCitzdGF0aWMgaW5saW5lIHZvaWQgZ3JhYl9mcHUodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGxvbmcgX19kdW1teTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2g2NC9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXNoNjQvc3lzdGVtLmgKaW5kZXggNDI1MTBlNC4uMzAwMmU5ODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoNjQvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tc2g2NC9zeXN0ZW0uaApAQCAtMTMyLDcgKzEzMiw3IEBACiAJKGZsYWdzICE9IDApOwkJCVwKIH0pCiAKLWV4dGVybiBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgeGNoZ191MzIodm9sYXRpbGUgaW50ICogbSwgdW5zaWduZWQgbG9uZyB2YWwpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgeGNoZ191MzIodm9sYXRpbGUgaW50ICogbSwgdW5zaWduZWQgbG9uZyB2YWwpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgcmV0dmFsOwogCkBAIC0xNDMsNyArMTQzLDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1leHRlcm4gX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIHhjaGdfdTgodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqIG0sIHVuc2lnbmVkIGxvbmcgdmFsKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHhjaGdfdTgodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqIG0sIHVuc2lnbmVkIGxvbmcgdmFsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHJldHZhbDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2g2NC90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20tc2g2NC90aHJlYWRfaW5mby5oCmluZGV4IDEwZjAyNGMuLjFmODI1Y2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoNjQvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1zaDY0L3RocmVhZF9pbmZvLmgKQEAgLTY2LDggKzY2LDYgQEAKIAogI2RlZmluZSBhbGxvY190aHJlYWRfaW5mbyh0aSkgKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLDEpKQogI2RlZmluZSBmcmVlX3RocmVhZF9pbmZvKHRpKSBmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSAodGkpLCAxKQotI2RlZmluZSBnZXRfdGhyZWFkX2luZm8odGkpIGdldF90YXNrX3N0cnVjdCgodGkpLT50YXNrKQotI2RlZmluZSBwdXRfdGhyZWFkX2luZm8odGkpIHB1dF90YXNrX3N0cnVjdCgodGkpLT50YXNrKQogCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvdGxiZmx1c2guaCBiL2luY2x1ZGUvYXNtLXNoNjQvdGxiZmx1c2guaAppbmRleCAxNWMwNzE5Li5lNDViZWFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaDY0L3RsYmZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20tc2g2NC90bGJmbHVzaC5oCkBAIC0yMCw3ICsyMCw3IEBACiBleHRlcm4gdm9pZCBmbHVzaF90bGJfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBlbmQpOwogZXh0ZXJuIHZvaWQgZmx1c2hfdGxiX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgcGFnZSk7Ci1leHRlcm4gaW5saW5lIHZvaWQgZmx1c2hfdGxiX3BndGFibGVzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3RsYl9wZ3RhYmxlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tc2g2NC91YWNjZXNzLmgKaW5kZXggNTZhYTNjZi4uZjQ5MzZkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2g2NC91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tc2g2NC91YWNjZXNzLmgKQEAgLTI4Nyw3ICsyODcsNyBAQAogICovCiBleHRlcm4gbG9uZyBfX3N0cm5sZW5fdXNlcihjb25zdCBjaGFyICpfX3MsIGxvbmcgX19uKTsKIAotZXh0ZXJuIF9faW5saW5lX18gbG9uZyBzdHJubGVuX3VzZXIoY29uc3QgY2hhciAqcywgbG9uZyBuKQorc3RhdGljIGlubGluZSBsb25nIHN0cm5sZW5fdXNlcihjb25zdCBjaGFyICpzLCBsb25nIG4pCiB7CiAJaWYgKCFfX2FkZHJfb2socykpCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1zcGFyYy9hdG9taWMuaAppbmRleCBhY2NiNDk2Li5lMTAzMzE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy9hdG9taWMuaApAQCAtMjAsNiArMjAsNyBAQAogCiBleHRlcm4gaW50IF9fYXRvbWljX2FkZF9yZXR1cm4oaW50LCBhdG9taWNfdCAqKTsKIGV4dGVybiBpbnQgYXRvbWljX2NtcHhjaGcoYXRvbWljX3QgKiwgaW50LCBpbnQpOworI2RlZmluZSBhdG9taWNfeGNoZyh2LCBuZXcpICh4Y2hnKCYoKHYpLT5jb3VudGVyKSwgbmV3KSkKIGV4dGVybiBpbnQgYXRvbWljX2FkZF91bmxlc3MoYXRvbWljX3QgKiwgaW50LCBpbnQpOwogZXh0ZXJuIHZvaWQgYXRvbWljX3NldChhdG9taWNfdCAqLCBpbnQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy9jYWNoZS5oIGIvaW5jbHVkZS9hc20tc3BhcmMvY2FjaGUuaAppbmRleCBhMTA1MjJjLi5jYjk3MWU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy9jYWNoZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL2NhY2hlLmgKQEAgLTEzLDcgKzEzLDYgQEAKICNkZWZpbmUgTDFfQ0FDSEVfU0hJRlQgNQogI2RlZmluZSBMMV9DQUNIRV9CWVRFUyAzMgogI2RlZmluZSBMMV9DQUNIRV9BTElHTih4KSAoKCgoeCkrKEwxX0NBQ0hFX0JZVEVTLTEpKSZ+KEwxX0NBQ0hFX0JZVEVTLTEpKSkKLSNkZWZpbmUgTDFfQ0FDSEVfU0hJRlRfTUFYIDUJLyogbGFyZ2VzdCBMMSB3aGljaCB0aGlzIGFyY2ggc3VwcG9ydHMgKi8KIAogI2RlZmluZSBTTVBfQ0FDSEVfQllURVMgMzIKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvZnV0ZXguaCBiL2luY2x1ZGUvYXNtLXNwYXJjL2Z1dGV4LmgKaW5kZXggOWZlZmY0Y2UuLjZhMzMyYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL2Z1dGV4LmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvZnV0ZXguaApAQCAtMSw1MyArMSw2IEBACiAjaWZuZGVmIF9BU01fRlVURVhfSAogI2RlZmluZSBfQVNNX0ZVVEVYX0gKIAotI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mdXRleC5oPgogCi0jaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KLSNpbmNsdWRlIDxhc20vZXJybm8uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotCi1zdGF0aWMgaW5saW5lIGludAotZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQotewotCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7Ci0JaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OwotCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOwotCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7Ci0JaW50IG9sZHZhbCA9IDAsIHJldDsKLQlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCi0JCW9wYXJnID0gMSA8PCBvcGFyZzsKLQotCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWluY19wcmVlbXB0X2NvdW50KCk7Ci0KLQlzd2l0Y2ggKG9wKSB7Ci0JY2FzZSBGVVRFWF9PUF9TRVQ6Ci0JY2FzZSBGVVRFWF9PUF9BREQ6Ci0JY2FzZSBGVVRFWF9PUF9PUjoKLQljYXNlIEZVVEVYX09QX0FORE46Ci0JY2FzZSBGVVRFWF9PUF9YT1I6Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVOT1NZUzsKLQl9Ci0KLQlkZWNfcHJlZW1wdF9jb3VudCgpOwotCi0JaWYgKCFyZXQpIHsKLQkJc3dpdGNoIChjbXApIHsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfRVE6IHJldCA9IChvbGR2YWwgPT0gY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX05FOiByZXQgPSAob2xkdmFsICE9IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9MVDogcmV0ID0gKG9sZHZhbCA8IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9HRTogcmV0ID0gKG9sZHZhbCA+PSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfTEU6IHJldCA9IChvbGR2YWwgPD0gY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0dUOiByZXQgPSAob2xkdmFsID4gY21wYXJnKTsgYnJlYWs7Ci0JCWRlZmF1bHQ6IHJldCA9IC1FTk9TWVM7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotI2VuZGlmCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL211dGV4LmggYi9pbmNsdWRlL2FzbS1zcGFyYy9tdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OGMxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy9tdXRleC5oCkBAIC0wLDAgKzEsOSBAQAorLyoKKyAqIFB1bGwgaW4gdGhlIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBtdXRleCBmYXN0cGF0aC4KKyAqCisgKiBUT0RPOiBpbXBsZW1lbnQgb3B0aW1pemVkIHByaW1pdGl2ZXMgaW5zdGVhZCwgb3IgbGVhdmUgdGhlIGdlbmVyaWMKKyAqIGltcGxlbWVudGF0aW9uIGluIHBsYWNlLCBvciBwaWNrIHRoZSBhdG9taWNfeGNoZygpIGJhc2VkIGdlbmVyaWMKKyAqIGltcGxlbWVudGF0aW9uLiAoc2VlIGFzbS1nZW5lcmljL211dGV4LXhjaGcuaCBmb3IgZGV0YWlscykKKyAqLworCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbXV0ZXgtZGVjLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy9vcGxpYi5oIGIvaW5jbHVkZS9hc20tc3BhcmMvb3BsaWIuaAppbmRleCA5NTk0NDU1Li5kMGQ3NmIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy9vcGxpYi5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL29wbGliLmgKQEAgLTE2NCw2ICsxNjQsNyBAQAogCVBST01ERVZfSUtCRCwJCQkvKiBpbnB1dCBmcm9tIGtleWJvYXJkICovCiAJUFJPTURFVl9JVFRZQSwJCQkvKiBpbnB1dCBmcm9tIHR0eWEgKi8KIAlQUk9NREVWX0lUVFlCLAkJCS8qIGlucHV0IGZyb20gdHR5YiAqLworCVBST01ERVZfSVJTQywJCQkvKiBpbnB1dCBmcm9tIHJzYyAqLwogCVBST01ERVZfSV9VTkssCiB9OwogCkBAIC0xNzUsNiArMTc2LDcgQEAKIAlQUk9NREVWX09TQ1JFRU4sCQkvKiB0byBzY3JlZW4gKi8KIAlQUk9NREVWX09UVFlBLAkJCS8qIHRvIHR0eWEgKi8KIAlQUk9NREVWX09UVFlCLAkJCS8qIHRvIHR0eWIgKi8KKwlQUk9NREVWX09SU0MsCQkJLyogdG8gcnNjICovCiAJUFJPTURFVl9PX1VOSywKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tc3BhcmMvc3lzdGVtLmgKaW5kZXggMWY2YjcxZi4uNThkZDE2MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmMvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvc3lzdGVtLmgKQEAgLTE1NSw3ICsxNTUsNyBAQAogCSJoZXJlOlxuIgkJCQkJCQkJCVwKICAgICAgICAgOiAiPSZyIiAobGFzdCkJCQkJCQkJCQlcCiAgICAgICAgIDogInIiICgmKGN1cnJlbnRfc2V0W2hhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpXSkpLAlcCi0JICAiciIgKChuZXh0KS0+dGhyZWFkX2luZm8pLAkJCQlcCisJICAiciIgKHRhc2tfdGhyZWFkX2luZm8obmV4dCkpLAkJCQlcCiAJICAiaSIgKFRJX0tQU1IpLAkJCQkJXAogCSAgImkiIChUSV9LU1ApLAkJCQkJCVwKIAkgICJpIiAoVElfVEFTSykJCQkJCQlcCkBAIC0xNjYsNiArMTY2LDE2IEBACiAJfSB3aGlsZSgwKQogCiAvKgorICogT24gU01QIHN5c3RlbXMsIHdoZW4gdGhlIHNjaGVkdWxlciBkb2VzIG1pZ3JhdGlvbi1jb3N0IGF1dG9kZXRlY3Rpb24sCisgKiBpdCBuZWVkcyBhIHdheSB0byBmbHVzaCBhcyBtdWNoIG9mIHRoZSBDUFUncyBjYWNoZXMgYXMgcG9zc2libGUuCisgKgorICogVE9ETzogZmlsbCB0aGlzIGluIQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2NoZWRfY2FjaGVmbHVzaCh2b2lkKQoreworfQorCisvKgogICogQ2hhbmdpbmcgdGhlIElSUSBsZXZlbCBvbiB0aGUgU3BhcmMuCiAgKi8KIGV4dGVybiB2b2lkIGxvY2FsX2lycV9yZXN0b3JlKHVuc2lnbmVkIGxvbmcpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLXNwYXJjL3RocmVhZF9pbmZvLmgKaW5kZXggZmY2Y2NiMy4uOTFiOWY1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmMvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy90aHJlYWRfaW5mby5oCkBAIC05Miw5ICs5Miw2IEBACiBCVEZJWFVQREVGX0NBTEwodm9pZCwgZnJlZV90aHJlYWRfaW5mbywgc3RydWN0IHRocmVhZF9pbmZvICopCiAjZGVmaW5lIGZyZWVfdGhyZWFkX2luZm8odGkpIEJURklYVVBfQ0FMTChmcmVlX3RocmVhZF9pbmZvKSh0aSkKIAotI2RlZmluZSBnZXRfdGhyZWFkX2luZm8odGkpCWdldF90YXNrX3N0cnVjdCgodGkpLT50YXNrKQotI2RlZmluZSBwdXRfdGhyZWFkX2luZm8odGkpCXB1dF90YXNrX3N0cnVjdCgodGkpLT50YXNrKQotCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKIC8qCkBAIC0xMzEsOSArMTI4LDEwIEBACiAgKiB0aHJlYWQgaW5mb3JtYXRpb24gZmxhZyBiaXQgbnVtYmVycwogICovCiAjZGVmaW5lIFRJRl9TWVNDQUxMX1RSQUNFCTAJLyogc3lzY2FsbCB0cmFjZSBhY3RpdmUgKi8KLSNkZWZpbmUgVElGX05PVElGWV9SRVNVTUUJMQkvKiByZXN1bXB0aW9uIG5vdGlmaWNhdGlvbiByZXF1ZXN0ZWQgKi8KKy8qIGZsYWcgYml0IDEgaXMgYXZhaWxhYmxlICovCiAjZGVmaW5lIFRJRl9TSUdQRU5ESU5HCQkyCS8qIHNpZ25hbCBwZW5kaW5nICovCiAjZGVmaW5lIFRJRl9ORUVEX1JFU0NIRUQJMwkvKiByZXNjaGVkdWxpbmcgbmVjZXNzYXJ5ICovCisjZGVmaW5lIFRJRl9SRVNUT1JFX1NJR01BU0sJNAkvKiByZXN0b3JlIHNpZ25hbCBtYXNrIGluIGRvX3NpZ25hbCgpICovCiAjZGVmaW5lIFRJRl9VU0VERlBVCQk4CS8qIEZQVSB3YXMgdXNlZCBieSB0aGlzIHRhc2sKIAkJCQkJICogdGhpcyBxdWFudHVtIChTTVApICovCiAjZGVmaW5lIFRJRl9QT0xMSU5HX05SRkxBRwk5CS8qIHRydWUgaWYgcG9sbF9pZGxlKCkgaXMgcG9sbGluZwpAQCAtMTQyLDkgKzE0MCw5IEBACiAKIC8qIGFzIGFib3ZlLCBidXQgYXMgYml0IHZhbHVlcyAqLwogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0UJKDE8PFRJRl9TWVNDQUxMX1RSQUNFKQotI2RlZmluZSBfVElGX05PVElGWV9SRVNVTUUJKDE8PFRJRl9OT1RJRllfUkVTVU1FKQogI2RlZmluZSBfVElGX1NJR1BFTkRJTkcJCSgxPDxUSUZfU0lHUEVORElORykKICNkZWZpbmUgX1RJRl9ORUVEX1JFU0NIRUQJKDE8PFRJRl9ORUVEX1JFU0NIRUQpCisjZGVmaW5lIF9USUZfUkVTVE9SRV9TSUdNQVNLCSgxPDxUSUZfUkVTVE9SRV9TSUdNQVNLKQogI2RlZmluZSBfVElGX1VTRURGUFUJCSgxPDxUSUZfVVNFREZQVSkKICNkZWZpbmUgX1RJRl9QT0xMSU5HX05SRkxBRwkoMTw8VElGX1BPTExJTkdfTlJGTEFHKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXNwYXJjL3VuaXN0ZC5oCmluZGV4IDU4ZGJhNTEuLjJhYzY0ZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL3VuaXN0ZC5oCkBAIC0zMDAsMTEgKzMwMCwyNiBAQAogI2RlZmluZSBfX05SX2FkZF9rZXkJCTI4MQogI2RlZmluZSBfX05SX3JlcXVlc3Rfa2V5CTI4MgogI2RlZmluZSBfX05SX2tleWN0bAkJMjgzCisjZGVmaW5lIF9fTlJfb3BlbmF0CQkyODQKKyNkZWZpbmUgX19OUl9ta2RpcmF0CQkyODUKKyNkZWZpbmUgX19OUl9ta25vZGF0CQkyODYKKyNkZWZpbmUgX19OUl9mY2hvd25hdAkJMjg3CisjZGVmaW5lIF9fTlJfZnV0aW1lc2F0CQkyODgKKyNkZWZpbmUgX19OUl9uZXdmc3RhdGF0CQkyODkKKyNkZWZpbmUgX19OUl91bmxpbmthdAkJMjkwCisjZGVmaW5lIF9fTlJfcmVuYW1lYXQJCTI5MQorI2RlZmluZSBfX05SX2xpbmthdAkJMjkyCisjZGVmaW5lIF9fTlJfc3ltbGlua2F0CQkyOTMKKyNkZWZpbmUgX19OUl9yZWFkbGlua2F0CQkyOTQKKyNkZWZpbmUgX19OUl9mY2htb2RhdAkJMjk1CisjZGVmaW5lIF9fTlJfZmFjY2Vzc2F0CQkyOTYKKyNkZWZpbmUgX19OUl9wc2VsZWN0NgkJMjk3CisjZGVmaW5lIF9fTlJfcHBvbGwJCTI5OAogCi0vKiBXQVJOSU5HOiBZb3UgTUFZIE5PVCBhZGQgc3lzY2FsbCBudW1iZXJzIGxhcmdlciB0aGFuIDI4Mywgc2luY2UKKy8qIFdBUk5JTkc6IFlvdSBNQVkgTk9UIGFkZCBzeXNjYWxsIG51bWJlcnMgbGFyZ2VyIHRoYW4gMjk4LCBzaW5jZQogICogICAgICAgICAgYWxsIG9mIHRoZSBzeXNjYWxsIHRhYmxlcyBpbiB0aGUgU3BhcmMga2VybmVsIGFyZQotICogICAgICAgICAgc2l6ZWQgdG8gaGF2ZSAyODMgZW50cmllcyAoc3RhcnRpbmcgYXQgemVybykuICBUaGVyZWZvcmUKLSAqICAgICAgICAgIGZpbmQgYSBmcmVlIHNsb3QgaW4gdGhlIDAtMjgyIHJhbmdlLgorICogICAgICAgICAgc2l6ZWQgdG8gaGF2ZSAyOTggZW50cmllcyAoc3RhcnRpbmcgYXQgemVybykuICBUaGVyZWZvcmUKKyAqICAgICAgICAgIGZpbmQgYSBmcmVlIHNsb3QgaW4gdGhlIDAtMjk4IHJhbmdlLgogICovCiAKICNkZWZpbmUgX3N5c2NhbGwwKHR5cGUsbmFtZSkgXApAQCAtNDU4LDYgKzQ3Myw3IEBACiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19PTERVTU9VTlQKICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NJR1BFTkRJTkcKICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NJR1BST0NNQVNLCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19SVF9TSUdTVVNQRU5ECiAjZW5kaWYKIAogI2lmZGVmIF9fS0VSTkVMX1NZU0NBTExTX18KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2F0b21pYy5oCmluZGV4IDExZjVhYTUuLjI1MjU2YmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9hdG9taWMuaApAQCAtNzIsNiArNzIsNyBAQAogI2RlZmluZSBhdG9taWM2NF9hZGRfbmVnYXRpdmUoaSwgdikgKGF0b21pYzY0X2FkZF9yZXQoaSwgdikgPCAwKQogCiAjZGVmaW5lIGF0b21pY19jbXB4Y2hnKHYsIG8sIG4pICgoaW50KWNtcHhjaGcoJigodiktPmNvdW50ZXIpLCAobyksIChuKSkpCisjZGVmaW5lIGF0b21pY194Y2hnKHYsIG5ldykgKHhjaGcoJigodiktPmNvdW50ZXIpLCBuZXcpKQogCiAjZGVmaW5lIGF0b21pY19hZGRfdW5sZXNzKHYsIGEsIHUpCQkJCVwKICh7CQkJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2NhY2hlLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2NhY2hlLmgKaW5kZXggYWRlNWVjMy4uZjdkMzVhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9jYWNoZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvY2FjaGUuaApAQCAtOSw3ICs5LDYgQEAKICNkZWZpbmUgICAgICAgIEwxX0NBQ0hFX0JZVEVTCTMyIC8qIFR3byAxNi1ieXRlIHN1Yi1ibG9ja3MgcGVyIGxpbmUuICovCiAKICNkZWZpbmUgICAgICAgIEwxX0NBQ0hFX0FMSUdOKHgpICAgICAgICgoKHgpKyhMMV9DQUNIRV9CWVRFUy0xKSkmfihMMV9DQUNIRV9CWVRFUy0xKSkKLSNkZWZpbmUJCUwxX0NBQ0hFX1NISUZUX01BWCA1CS8qIGxhcmdlc3QgTDEgd2hpY2ggdGhpcyBhcmNoIHN1cHBvcnRzICovCiAKICNkZWZpbmUgICAgICAgIFNNUF9DQUNIRV9CWVRFU19TSElGVAk2CiAjZGVmaW5lICAgICAgICBTTVBfQ0FDSEVfQllURVMJCSgxIDw8IFNNUF9DQUNIRV9CWVRFU19TSElGVCkgLyogTDIgY2FjaGUgbGluZSBzaXplLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9lbGYuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZWxmLmgKaW5kZXggOTE0NTgxMS4uNjk1MzlhOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9lbGYuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2VsZi5oCkBAIC0xMTksNyArMTE5LDcgQEAKICNlbmRpZgogCiAjZGVmaW5lIEVMRl9DT1JFX0NPUFlfVEFTS19SRUdTKF9fdHNrLCBfX2VsZl9yZWdzKQlcCi0JKHsgRUxGX0NPUkVfQ09QWV9SRUdTKCgqKF9fZWxmX3JlZ3MpKSwgKF9fdHNrKS0+dGhyZWFkX2luZm8tPmtyZWdzKTsgMTsgfSkKKwkoeyBFTEZfQ09SRV9DT1BZX1JFR1MoKCooX19lbGZfcmVncykpLCB0YXNrX3B0X3JlZ3MoX190c2spKTsgMTsgfSkKIAogLyoKICAqIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgd2UgZG9uJ3QgbG9hZCBzb21ldGhpbmcgZm9yIHRoZSB3cm9uZyBhcmNoaXRlY3R1cmUuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2Z1dGV4LmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2Z1dGV4LmgKaW5kZXggOWZlZmY0Y2UuLjZhMzMyYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvZnV0ZXguaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2Z1dGV4LmgKQEAgLTEsNTMgKzEsNiBAQAogI2lmbmRlZiBfQVNNX0ZVVEVYX0gKICNkZWZpbmUgX0FTTV9GVVRFWF9ICiAKLSNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZnV0ZXguaD4KIAotI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+Ci0jaW5jbHVkZSA8YXNtL2Vycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotc3RhdGljIGlubGluZSBpbnQKLWZ1dGV4X2F0b21pY19vcF9pbnVzZXIgKGludCBlbmNvZGVkX29wLCBpbnQgX191c2VyICp1YWRkcikKLXsKLQlpbnQgb3AgPSAoZW5jb2RlZF9vcCA+PiAyOCkgJiA3OwotCWludCBjbXAgPSAoZW5jb2RlZF9vcCA+PiAyNCkgJiAxNTsKLQlpbnQgb3BhcmcgPSAoZW5jb2RlZF9vcCA8PCA4KSA+PiAyMDsKLQlpbnQgY21wYXJnID0gKGVuY29kZWRfb3AgPDwgMjApID4+IDIwOwotCWludCBvbGR2YWwgPSAwLCByZXQ7Ci0JaWYgKGVuY29kZWRfb3AgJiAoRlVURVhfT1BfT1BBUkdfU0hJRlQgPDwgMjgpKQotCQlvcGFyZyA9IDEgPDwgb3Bhcmc7Ci0KLQlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpbmNfcHJlZW1wdF9jb3VudCgpOwotCi0Jc3dpdGNoIChvcCkgewotCWNhc2UgRlVURVhfT1BfU0VUOgotCWNhc2UgRlVURVhfT1BfQUREOgotCWNhc2UgRlVURVhfT1BfT1I6Ci0JY2FzZSBGVVRFWF9PUF9BTkROOgotCWNhc2UgRlVURVhfT1BfWE9SOgotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FTk9TWVM7Ci0JfQotCi0JZGVjX3ByZWVtcHRfY291bnQoKTsKLQotCWlmICghcmV0KSB7Ci0JCXN3aXRjaCAoY21wKSB7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOwotCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLSNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2twcm9iZXMuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQva3Byb2Jlcy5oCmluZGV4IDdiYTg0NTMuLmU0ZWZlNjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQva3Byb2Jlcy5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQva3Byb2Jlcy5oCkBAIC0xMiw2ICsxMiw3IEBACiAjZGVmaW5lIE1BWF9JTlNOX1NJWkUgMgogCiAjZGVmaW5lIEpQUk9CRV9FTlRSWShwZW50cnkpCShrcHJvYmVfb3Bjb2RlX3QgKilwZW50cnkKKyNkZWZpbmUgYXJjaF9yZW1vdmVfa3Byb2JlKHApCWRvIHt9IHdoaWxlICgwKQogCiAvKiBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgY29weSBvZiBvcmlnaW5hbCBpbnN0cnVjdGlvbiovCiBzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuIHsKQEAgLTM4LDE1ICszOSw2IEBACiAJc3RydWN0IHByZXZfa3Byb2JlIHByZXZfa3Byb2JlOwogfTsKIAotI2lmZGVmIENPTkZJR19LUFJPQkVTCiBleHRlcm4gaW50IGtwcm9iZV9leGNlcHRpb25zX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCiAJCQkJICAgIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKTsKLSNlbHNlCQkJCS8qICFDT05GSUdfS1BST0JFUyAqLwotc3RhdGljIGlubGluZSBpbnQga3Byb2JlX2V4Y2VwdGlvbnNfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKLQkJCQkJICAgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQogI2VuZGlmIC8qIF9TUEFSQzY0X0tQUk9CRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9tbXVfY29udGV4dC5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9tbXVfY29udGV4dC5oCmluZGV4IDA4YmE3MmQuLjU3ZWU3YjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvbW11X2NvbnRleHQuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L21tdV9jb250ZXh0LmgKQEAgLTYwLDcgKzYwLDcgQEAKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHBnZF9jYWNoZSBhc20oIm80Iik7IFwKIAlwYWRkciA9IF9fcGEoKF9fbW0pLT5wZ2QpOyBcCiAJcGdkX2NhY2hlID0gMFVMOyBcCi0JaWYgKChfX3RzayktPnRocmVhZF9pbmZvLT5mbGFncyAmIF9USUZfMzJCSVQpIFwKKwlpZiAodGFza190aHJlYWRfaW5mbyhfX3RzayktPmZsYWdzICYgX1RJRl8zMkJJVCkgXAogCQlwZ2RfY2FjaGUgPSBnZXRfcGdkX2NhY2hlKChfX21tKS0+cGdkKTsgXAogCV9fYXNtX18gX192b2xhdGlsZV9fKCJ3cnByCSUlZzAsIDB4NDk0LCAlJXBzdGF0ZVxuXHQiIFwKIAkJCSAgICAgIm1vdgklMywgJSVnNFxuXHQiIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvbXV0ZXguaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvbXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NThjMWY3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9tdXRleC5oCkBAIC0wLDAgKzEsOSBAQAorLyoKKyAqIFB1bGwgaW4gdGhlIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBtdXRleCBmYXN0cGF0aC4KKyAqCisgKiBUT0RPOiBpbXBsZW1lbnQgb3B0aW1pemVkIHByaW1pdGl2ZXMgaW5zdGVhZCwgb3IgbGVhdmUgdGhlIGdlbmVyaWMKKyAqIGltcGxlbWVudGF0aW9uIGluIHBsYWNlLCBvciBwaWNrIHRoZSBhdG9taWNfeGNoZygpIGJhc2VkIGdlbmVyaWMKKyAqIGltcGxlbWVudGF0aW9uLiAoc2VlIGFzbS1nZW5lcmljL211dGV4LXhjaGcuaCBmb3IgZGV0YWlscykKKyAqLworCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbXV0ZXgtZGVjLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L29wbGliLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L29wbGliLmgKaW5kZXggZDAyZjFlOC4uM2M1OWIyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9vcGxpYi5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvb3BsaWIuaApAQCAtMTYzLDYgKzE2Myw3IEBACiAJUFJPTURFVl9JS0JELAkJCS8qIGlucHV0IGZyb20ga2V5Ym9hcmQgKi8KIAlQUk9NREVWX0lUVFlBLAkJCS8qIGlucHV0IGZyb20gdHR5YSAqLwogCVBST01ERVZfSVRUWUIsCQkJLyogaW5wdXQgZnJvbSB0dHliICovCisJUFJPTURFVl9JUlNDLAkJCS8qIGlucHV0IGZyb20gcnNjICovCiAJUFJPTURFVl9JX1VOSywKIH07CiAKQEAgLTE3NCw2ICsxNzUsNyBAQAogCVBST01ERVZfT1NDUkVFTiwJCS8qIHRvIHNjcmVlbiAqLwogCVBST01ERVZfT1RUWUEsCQkJLyogdG8gdHR5YSAqLwogCVBST01ERVZfT1RUWUIsCQkJLyogdG8gdHR5YiAqLworCVBST01ERVZfT1JTQywJCQkvKiB0byByc2MgKi8KIAlQUk9NREVWX09fVU5LLAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcHJvY2Vzc29yLmgKaW5kZXggMzE2OWYzZS4uY2Q4ZDliNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3Byb2Nlc3Nvci5oCkBAIC0xODYsOCArMTg2LDkgQEAKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiAKLSNkZWZpbmUgS1NUS19FSVAodHNrKSAgKCh0c2spLT50aHJlYWRfaW5mby0+a3JlZ3MtPnRwYykKLSNkZWZpbmUgS1NUS19FU1AodHNrKSAgKCh0c2spLT50aHJlYWRfaW5mby0+a3JlZ3MtPnVfcmVnc1tVUkVHX0ZQXSkKKyNkZWZpbmUgdGFza19wdF9yZWdzKHRzaykgKHRhc2tfdGhyZWFkX2luZm8odHNrKS0+a3JlZ3MpCisjZGVmaW5lIEtTVEtfRUlQKHRzaykgICh0YXNrX3B0X3JlZ3ModHNrKS0+dHBjKQorI2RlZmluZSBLU1RLX0VTUCh0c2spICAodGFza19wdF9yZWdzKHRzayktPnVfcmVnc1tVUkVHX0ZQXSkKIAogI2RlZmluZSBjcHVfcmVsYXgoKQliYXJyaWVyKCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc3lzdGVtLmgKaW5kZXggYjU0MTc1Mi4uYWYyNTRlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3N5c3RlbS5oCkBAIC0xOTMsMTEgKzE5Myw3IEBACiAJICogbm90IHByZXNlcnZlIGl0J3MgdmFsdWUuICBIYWlyeSwgYnV0IGl0IGxldHMgdXMgcmVtb3ZlIDIgbG9hZHMKIAkgKiBhbmQgMiBzdG9yZXMgaW4gdGhpcyBjcml0aWNhbCBjb2RlIHBhdGguICAtRGF2ZU0KIAkgKi8KLSNpZiBfX0dOVUNfXyA+PSAzCiAjZGVmaW5lIEVYVFJBX0NMT0JCRVIgLCIlbDEiCi0jZWxzZQotI2RlZmluZSBFWFRSQV9DTE9CQkVSCi0jZW5kaWYKICNkZWZpbmUgc3dpdGNoX3RvKHByZXYsIG5leHQsIGxhc3QpCQkJCQlcCiBkbyB7CWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9QRVJGQ1RSKSkgewkJCQlcCiAJCXVuc2lnbmVkIGxvbmcgX190bXA7CQkJCQlcCkBAIC0yMTIsNyArMjA4LDcgQEAKIAkvKiBJZiB5b3UgYXJlIHRlbXB0ZWQgdG8gY29uZGl0aW9uYWxpemUgdGhlIGZvbGxvd2luZyAqLwlcCiAJLyogc28gdGhhdCBBU0kgaXMgb25seSB3cml0dGVuIGlmIGl0IGNoYW5nZXMsIHRoaW5rIGFnYWluLiAqLwlcCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oIndyICUlZzAsICUwLCAlJWFzaSIJCQlcCi0JOiA6ICJyIiAoX190aHJlYWRfZmxhZ19ieXRlX3B0cihuZXh0LT50aHJlYWRfaW5mbylbVElfRkxBR19CWVRFX0NVUlJFTlRfRFNdKSk7XAorCTogOiAiciIgKF9fdGhyZWFkX2ZsYWdfYnl0ZV9wdHIodGFza190aHJlYWRfaW5mbyhuZXh0KSlbVElfRkxBR19CWVRFX0NVUlJFTlRfRFNdKSk7XAogCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKIAkibW92CSUlZzQsICUlZzdcblx0IgkJCQkJCVwKIAkid3JwcgklJWcwLCAweDk1LCAlJXBzdGF0ZVxuXHQiCQkJCVwKQEAgLTI0Miw3ICsyMzgsNyBAQAogCSJiLGEgcmV0X2Zyb21fc3lzY2FsbFxuXHQiCQkJCQlcCiAJIjE6XG5cdCIJCQkJCQkJXAogCTogIj0mciIgKGxhc3QpCQkJCQkJCVwKLQk6ICIwIiAobmV4dC0+dGhyZWFkX2luZm8pLAkJCQkJXAorCTogIjAiICh0YXNrX3RocmVhZF9pbmZvKG5leHQpKSwJCQkJCVwKIAkgICJpIiAoVElfV1NUQVRFKSwgImkiIChUSV9LU1ApLCAiaSIgKFRJX05FV19DSElMRCksICAgICAgICAgICAgXAogCSAgImkiIChUSV9DV1ApLCAiaSIgKFRJX1RBU0spCQkJCQlcCiAJOiAiY2MiLAkJCQkJCQkJXApAQCAtMjU3LDYgKzI1MywxNiBAQAogCX0JCQkJCQkJCVwKIH0gd2hpbGUoMCkKIAorLyoKKyAqIE9uIFNNUCBzeXN0ZW1zLCB3aGVuIHRoZSBzY2hlZHVsZXIgZG9lcyBtaWdyYXRpb24tY29zdCBhdXRvZGV0ZWN0aW9uLAorICogaXQgbmVlZHMgYSB3YXkgdG8gZmx1c2ggYXMgbXVjaCBvZiB0aGUgQ1BVJ3MgY2FjaGVzIGFzIHBvc3NpYmxlLgorICoKKyAqIFRPRE86IGZpbGwgdGhpcyBpbiEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNjaGVkX2NhY2hlZmx1c2godm9pZCkKK3sKK30KKwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHhjaGczMihfX3ZvbGF0aWxlX18gdW5zaWduZWQgaW50ICptLCB1bnNpZ25lZCBpbnQgdmFsKQogewogCXVuc2lnbmVkIGxvbmcgdG1wMSwgdG1wMjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvdGhyZWFkX2luZm8uaAppbmRleCBjOTRkOGIzLi5hYzlkMDY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC90aHJlYWRfaW5mby5oCkBAIC0yMjEsNyArMjIxLDcgQEAKICAqCSBub3AKICAqLwogI2RlZmluZSBUSUZfU1lTQ0FMTF9UUkFDRQkwCS8qIHN5c2NhbGwgdHJhY2UgYWN0aXZlICovCi0jZGVmaW5lIFRJRl9OT1RJRllfUkVTVU1FCTEJLyogcmVzdW1wdGlvbiBub3RpZmljYXRpb24gcmVxdWVzdGVkICovCisjZGVmaW5lIFRJRl9SRVNUT1JFX1NJR01BU0sJMQkvKiByZXN0b3JlIHNpZ25hbCBtYXNrIGluIGRvX3NpZ25hbCgpICovCiAjZGVmaW5lIFRJRl9TSUdQRU5ESU5HCQkyCS8qIHNpZ25hbCBwZW5kaW5nICovCiAjZGVmaW5lIFRJRl9ORUVEX1JFU0NIRUQJMwkvKiByZXNjaGVkdWxpbmcgbmVjZXNzYXJ5ICovCiAjZGVmaW5lIFRJRl9QRVJGQ1RSCQk0CS8qIHBlcmZvcm1hbmNlIGNvdW50ZXJzIGFjdGl2ZSAqLwpAQCAtMjQxLDcgKzI0MSw2IEBACiAjZGVmaW5lIFRJRl9QT0xMSU5HX05SRkxBRwkxNAogCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMTw8VElGX1NZU0NBTExfVFJBQ0UpCi0jZGVmaW5lIF9USUZfTk9USUZZX1JFU1VNRQkoMTw8VElGX05PVElGWV9SRVNVTUUpCiAjZGVmaW5lIF9USUZfU0lHUEVORElORwkJKDE8PFRJRl9TSUdQRU5ESU5HKQogI2RlZmluZSBfVElGX05FRURfUkVTQ0hFRAkoMTw8VElGX05FRURfUkVTQ0hFRCkKICNkZWZpbmUgX1RJRl9QRVJGQ1RSCQkoMTw8VElGX1BFUkZDVFIpCkBAIC0yNTAsMTEgKzI0OSwxMiBAQAogI2RlZmluZSBfVElGXzMyQklUCQkoMTw8VElGXzMyQklUKQogI2RlZmluZSBfVElGX1NFQ0NPTVAJCSgxPDxUSUZfU0VDQ09NUCkKICNkZWZpbmUgX1RJRl9TWVNDQUxMX0FVRElUCSgxPDxUSUZfU1lTQ0FMTF9BVURJVCkKKyNkZWZpbmUgX1RJRl9SRVNUT1JFX1NJR01BU0sJKDE8PFRJRl9SRVNUT1JFX1NJR01BU0spCiAjZGVmaW5lIF9USUZfQUJJX1BFTkRJTkcJKDE8PFRJRl9BQklfUEVORElORykKICNkZWZpbmUgX1RJRl9QT0xMSU5HX05SRkxBRwkoMTw8VElGX1BPTExJTkdfTlJGTEFHKQogCiAjZGVmaW5lIF9USUZfVVNFUl9XT1JLX01BU0sJKCgweGZmIDw8IFRJX0ZMQUdfV1NBVkVEX1NISUZUKSB8IFwKLQkJCQkgKF9USUZfTk9USUZZX1JFU1VNRSB8IF9USUZfU0lHUEVORElORyB8IFwKKwkJCQkgKF9USUZfU0lHUEVORElORyB8IF9USUZfUkVTVE9SRV9TSUdNQVNLIHwgXAogCQkJCSAgX1RJRl9ORUVEX1JFU0NIRUQgfCBfVElGX1BFUkZDVFIpKQogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvdW5pc3RkLmgKaW5kZXggNTFlYzI4Ny4uODRhYzJiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3VuaXN0ZC5oCkBAIC0zMDIsMTEgKzMwMiwyNiBAQAogI2RlZmluZSBfX05SX2FkZF9rZXkJCTI4MQogI2RlZmluZSBfX05SX3JlcXVlc3Rfa2V5CTI4MgogI2RlZmluZSBfX05SX2tleWN0bAkJMjgzCisjZGVmaW5lIF9fTlJfb3BlbmF0CQkyODQKKyNkZWZpbmUgX19OUl9ta2RpcmF0CQkyODUKKyNkZWZpbmUgX19OUl9ta25vZGF0CQkyODYKKyNkZWZpbmUgX19OUl9mY2hvd25hdAkJMjg3CisjZGVmaW5lIF9fTlJfZnV0aW1lc2F0CQkyODgKKyNkZWZpbmUgX19OUl9uZXdmc3RhdGF0CQkyODkKKyNkZWZpbmUgX19OUl91bmxpbmthdAkJMjkwCisjZGVmaW5lIF9fTlJfcmVuYW1lYXQJCTI5MQorI2RlZmluZSBfX05SX2xpbmthdAkJMjkyCisjZGVmaW5lIF9fTlJfc3ltbGlua2F0CQkyOTMKKyNkZWZpbmUgX19OUl9yZWFkbGlua2F0CQkyOTQKKyNkZWZpbmUgX19OUl9mY2htb2RhdAkJMjk1CisjZGVmaW5lIF9fTlJfZmFjY2Vzc2F0CQkyOTYKKyNkZWZpbmUgX19OUl9wc2VsZWN0NgkJMjk3CisjZGVmaW5lIF9fTlJfcHBvbGwJCTI5OAogCi0vKiBXQVJOSU5HOiBZb3UgTUFZIE5PVCBhZGQgc3lzY2FsbCBudW1iZXJzIGxhcmdlciB0aGFuIDI4Mywgc2luY2UKKy8qIFdBUk5JTkc6IFlvdSBNQVkgTk9UIGFkZCBzeXNjYWxsIG51bWJlcnMgbGFyZ2VyIHRoYW4gMjk4LCBzaW5jZQogICogICAgICAgICAgYWxsIG9mIHRoZSBzeXNjYWxsIHRhYmxlcyBpbiB0aGUgU3BhcmMga2VybmVsIGFyZQotICogICAgICAgICAgc2l6ZWQgdG8gaGF2ZSAyODMgZW50cmllcyAoc3RhcnRpbmcgYXQgemVybykuICBUaGVyZWZvcmUKLSAqICAgICAgICAgIGZpbmQgYSBmcmVlIHNsb3QgaW4gdGhlIDAtMjgyIHJhbmdlLgorICogICAgICAgICAgc2l6ZWQgdG8gaGF2ZSAyOTggZW50cmllcyAoc3RhcnRpbmcgYXQgemVybykuICBUaGVyZWZvcmUKKyAqICAgICAgICAgIGZpbmQgYSBmcmVlIHNsb3QgaW4gdGhlIDAtMjk4IHJhbmdlLgogICovCiAKICNkZWZpbmUgX3N5c2NhbGwwKHR5cGUsbmFtZSkgXApAQCAtNTAxLDYgKzUxNiw4IEBACiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19PTERVTU9VTlQKICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NJR1BFTkRJTkcKICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NJR1BST0NNQVNLCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19SVF9TSUdTVVNQRU5ECisjZGVmaW5lIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfUlRfU0lHU1VTUEVORAogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9jYWNoZS5oIGIvaW5jbHVkZS9hc20tdW0vY2FjaGUuaAppbmRleCBhMTA2MDJhLi4zZDA1ODcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS9jYWNoZS5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL2NhY2hlLmgKQEAgLTEzLDkgKzEzLDYgQEAKICMgZGVmaW5lIEwxX0NBQ0hFX1NISUZUCQk1CiAjZW5kaWYKIAotLyogWFhYOiB0aGlzIGlzIHZhbGlkIGZvciB4ODYgYW5kIHg4Nl82NC4gKi8KLSNkZWZpbmUgTDFfQ0FDSEVfU0hJRlRfTUFYCTcJLyogbGFyZ2VzdCBMMSB3aGljaCB0aGlzIGFyY2ggc3VwcG9ydHMgKi8KLQogI2RlZmluZSBMMV9DQUNIRV9CWVRFUwkJKDEgPDwgTDFfQ0FDSEVfU0hJRlQpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdW0vZnV0ZXguaCBiL2luY2x1ZGUvYXNtLXVtL2Z1dGV4LmgKaW5kZXggMTQyZWUyZC4uNmEzMzJhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdW0vZnV0ZXguaAorKysgYi9pbmNsdWRlL2FzbS11bS9mdXRleC5oCkBAIC0xLDEyICsxLDYgQEAKLSNpZm5kZWYgX19VTV9GVVRFWF9ICi0jZGVmaW5lIF9fVU1fRlVURVhfSAorI2lmbmRlZiBfQVNNX0ZVVEVYX0gKKyNkZWZpbmUgX0FTTV9GVVRFWF9ICiAKLSNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotI2luY2x1ZGUgImFzbS9hcmNoL2Z1dGV4LmgiCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZnV0ZXguaD4KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9pby5oIGIvaW5jbHVkZS9hc20tdW0vaW8uaAppbmRleCA5MDY3NDA1Li4xOTM0ZDkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS9pby5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL2lvLmgKQEAgLTMzLDQgKzMzLDIwIEBACiAgKi8KICNkZWZpbmUgeGxhdGVfZGV2X2ttZW1fcHRyKHApCXAKIAorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlYih1bnNpZ25lZCBjaGFyIGIsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19mb3JjZSAqKSBhZGRyID0gYjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZXcodW5zaWduZWQgc2hvcnQgYiwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQoreworCSoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgX19mb3JjZSAqKSBhZGRyID0gYjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZWwodW5zaWduZWQgaW50IGIsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCBfX2ZvcmNlICopIGFkZHIgPSBiOworfQorI2RlZmluZSBfX3Jhd193cml0ZWIgd3JpdGViCisjZGVmaW5lIF9fcmF3X3dyaXRldyB3cml0ZXcKKyNkZWZpbmUgX19yYXdfd3JpdGVsIHdyaXRlbAorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL211dGV4LmggYi9pbmNsdWRlL2FzbS11bS9tdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OGMxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS11bS9tdXRleC5oCkBAIC0wLDAgKzEsOSBAQAorLyoKKyAqIFB1bGwgaW4gdGhlIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBtdXRleCBmYXN0cGF0aC4KKyAqCisgKiBUT0RPOiBpbXBsZW1lbnQgb3B0aW1pemVkIHByaW1pdGl2ZXMgaW5zdGVhZCwgb3IgbGVhdmUgdGhlIGdlbmVyaWMKKyAqIGltcGxlbWVudGF0aW9uIGluIHBsYWNlLCBvciBwaWNrIHRoZSBhdG9taWNfeGNoZygpIGJhc2VkIGdlbmVyaWMKKyAqIGltcGxlbWVudGF0aW9uLiAoc2VlIGFzbS1nZW5lcmljL211dGV4LXhjaGcuaCBmb3IgZGV0YWlscykKKyAqLworCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbXV0ZXgtZGVjLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9wcm9jZXNzb3ItZ2VuZXJpYy5oIGIvaW5jbHVkZS9hc20tdW0vcHJvY2Vzc29yLWdlbmVyaWMuaAppbmRleCAwNzU3NzFjLi5kYTA3YTY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS9wcm9jZXNzb3ItZ2VuZXJpYy5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL3Byb2Nlc3Nvci1nZW5lcmljLmgKQEAgLTg5LDcgKzg5LDYgQEAKIAogZXh0ZXJuIHZvaWQgcmVsZWFzZV90aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICopOwogZXh0ZXJuIGludCBrZXJuZWxfdGhyZWFkKGludCAoKmZuKSh2b2lkICopLCB2b2lkICogYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLWV4dGVybiB2b2lkIGR1bXBfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3QgdXNlciAqdSk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwcmVwYXJlX3RvX2NvcHkoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9yd3NlbS5oIGIvaW5jbHVkZS9hc20tdW0vcndzZW0uaAppbmRleCA2NjFjMGU1Li5iNWZjNDQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS9yd3NlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL3J3c2VtLmgKQEAgLTEsMTAgKzEsNiBAQAogI2lmbmRlZiBfX1VNX1JXU0VNX0hfXwogI2RlZmluZSBfX1VNX1JXU0VNX0hfXwogCi0jaWYgX19HTlVDX18gPCAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDwgOTYpCi0jZGVmaW5lIF9fYnVpbHRpbl9leHBlY3QoZXhwLGMpIChleHApCi0jZW5kaWYKLQogI2luY2x1ZGUgImFzbS9hcmNoL3J3c2VtLmgiCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdW0vdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLXVtL3RocmVhZF9pbmZvLmgKaW5kZXggOTcyNjdmMC4uMTdiNmIwNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdW0vdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS11bS90aHJlYWRfaW5mby5oCkBAIC01Niw5ICs1Niw2IEBACiAJKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikga21hbGxvYyhUSFJFQURfU0laRSwgR0ZQX0tFUk5FTCkpCiAjZGVmaW5lIGZyZWVfdGhyZWFkX2luZm8odGkpIGtmcmVlKHRpKQogCi0jZGVmaW5lIGdldF90aHJlYWRfaW5mbyh0aSkgZ2V0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCi0jZGVmaW5lIHB1dF90aHJlYWRfaW5mbyh0aSkgcHV0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCi0KICNlbmRpZgogCiAjZGVmaW5lIFBSRUVNUFRfQUNUSVZFCQkweDEwMDAwMDAwCkBAIC03Miw2ICs2OSw3IEBACiAjZGVmaW5lIFRJRl9SRVNUQVJUX0JMT0NLIAk0CiAjZGVmaW5lIFRJRl9NRU1ESUUJIAk1CiAjZGVmaW5lIFRJRl9TWVNDQUxMX0FVRElUCTYKKyNkZWZpbmUgVElGX1JFU1RPUkVfU0lHTUFTSwk3CiAKICNkZWZpbmUgX1RJRl9TWVNDQUxMX1RSQUNFCSgxIDw8IFRJRl9TWVNDQUxMX1RSQUNFKQogI2RlZmluZSBfVElGX1NJR1BFTkRJTkcJCSgxIDw8IFRJRl9TSUdQRU5ESU5HKQpAQCAtNzksMTYgKzc3LDYgQEAKICNkZWZpbmUgX1RJRl9QT0xMSU5HX05SRkxBRyAgICAgKDEgPDwgVElGX1BPTExJTkdfTlJGTEFHKQogI2RlZmluZSBfVElGX01FTURJRQkJKDEgPDwgVElGX01FTURJRSkKICNkZWZpbmUgX1RJRl9TWVNDQUxMX0FVRElUCSgxIDw8IFRJRl9TWVNDQUxMX0FVRElUKQorI2RlZmluZSBfVElGX1JFU1RPUkVfU0lHTUFTSwkoMSA8PCBUSUZfUkVTVE9SRV9TSUdNQVNLKQogCiAjZW5kaWYKLQotLyoKLSAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgotICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5Ci0gKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgZmlsZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1maWxlLXN0eWxlOiAibGludXgiCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tdW0vdW5pc3RkLmgKaW5kZXggNmZkZGU0NS4uYWZjY2ZjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdW0vdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tdW0vdW5pc3RkLmgKQEAgLTM0LDYgKzM0LDcgQEAKICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NJR1BFTkRJTkcKICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NJR1BST0NNQVNLCiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19SVF9TSUdBQ1RJT04KKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1JUX1NJR1NVU1BFTkQKICNlbmRpZgogCiAjaWZkZWYgX19LRVJORUxfU1lTQ0FMTFNfXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdjg1MC9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLXY4NTAvYXRvbWljLmgKaW5kZXggZjViOWFiNi4uMTY2ZGYwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdjg1MC9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS12ODUwL2F0b21pYy5oCkBAIC0xMDQsNiArMTA0LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCisjZGVmaW5lIGF0b21pY194Y2hnKHYsIG5ldykgKHhjaGcoJigodiktPmNvdW50ZXIpLCBuZXcpKQorCiBzdGF0aWMgaW5saW5lIGludCBhdG9taWNfYWRkX3VubGVzcyhhdG9taWNfdCAqdiwgaW50IGEsIGludCB1KQogewogCWludCByZXQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL2NhY2hlLmggYi9pbmNsdWRlL2FzbS12ODUwL2NhY2hlLmgKaW5kZXggY2JmOTA5Ni4uODgzMmM3ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdjg1MC9jYWNoZS5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvY2FjaGUuaApAQCAtMjMsNiArMjMsNCBAQAogI2RlZmluZSBMMV9DQUNIRV9TSElGVAkJNAogI2VuZGlmCiAKLSNkZWZpbmUgTDFfQ0FDSEVfU0hJRlRfTUFYCUwxX0NBQ0hFX1NISUZUCi0KICNlbmRpZiAvKiBfX1Y4NTBfQ0FDSEVfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL2Z1dGV4LmggYi9pbmNsdWRlL2FzbS12ODUwL2Z1dGV4LmgKaW5kZXggOWZlZmY0Y2UuLjZhMzMyYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXY4NTAvZnV0ZXguaAorKysgYi9pbmNsdWRlL2FzbS12ODUwL2Z1dGV4LmgKQEAgLTEsNTMgKzEsNiBAQAogI2lmbmRlZiBfQVNNX0ZVVEVYX0gKICNkZWZpbmUgX0FTTV9GVVRFWF9ICiAKLSNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZnV0ZXguaD4KIAotI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+Ci0jaW5jbHVkZSA8YXNtL2Vycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotc3RhdGljIGlubGluZSBpbnQKLWZ1dGV4X2F0b21pY19vcF9pbnVzZXIgKGludCBlbmNvZGVkX29wLCBpbnQgX191c2VyICp1YWRkcikKLXsKLQlpbnQgb3AgPSAoZW5jb2RlZF9vcCA+PiAyOCkgJiA3OwotCWludCBjbXAgPSAoZW5jb2RlZF9vcCA+PiAyNCkgJiAxNTsKLQlpbnQgb3BhcmcgPSAoZW5jb2RlZF9vcCA8PCA4KSA+PiAyMDsKLQlpbnQgY21wYXJnID0gKGVuY29kZWRfb3AgPDwgMjApID4+IDIwOwotCWludCBvbGR2YWwgPSAwLCByZXQ7Ci0JaWYgKGVuY29kZWRfb3AgJiAoRlVURVhfT1BfT1BBUkdfU0hJRlQgPDwgMjgpKQotCQlvcGFyZyA9IDEgPDwgb3Bhcmc7Ci0KLQlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpbmNfcHJlZW1wdF9jb3VudCgpOwotCi0Jc3dpdGNoIChvcCkgewotCWNhc2UgRlVURVhfT1BfU0VUOgotCWNhc2UgRlVURVhfT1BfQUREOgotCWNhc2UgRlVURVhfT1BfT1I6Ci0JY2FzZSBGVVRFWF9PUF9BTkROOgotCWNhc2UgRlVURVhfT1BfWE9SOgotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FTk9TWVM7Ci0JfQotCi0JZGVjX3ByZWVtcHRfY291bnQoKTsKLQotCWlmICghcmV0KSB7Ci0JCXN3aXRjaCAoY21wKSB7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKLQkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7Ci0JCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOwotCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOwotCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLSNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL2lvY3RsLmggYi9pbmNsdWRlL2FzbS12ODUwL2lvY3RsLmgKaW5kZXggMTc2NWRmNi4uYjI3OWZlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdjg1MC9pb2N0bC5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvaW9jdGwuaApAQCAtMSw4MCArMSBAQAotLyogJElkOiBpb2N0bC5oLHYgMS4xIDIwMDIvMDkvMjggMTQ6NTg6NDEgZ2VyZyBFeHAgJAotICoKLSAqIGxpbnV4L2lvY3RsLmggZm9yIExpbnV4IGJ5IEguSC4gQmVyZ21hbi4KLSAqLwotCi0jaWZuZGVmIF9WODUwX0lPQ1RMX0gKLSNkZWZpbmUgX1Y4NTBfSU9DVExfSAotCi0vKiBpb2N0bCBjb21tYW5kIGVuY29kaW5nOiAzMiBiaXRzIHRvdGFsLCBjb21tYW5kIGluIGxvd2VyIDE2IGJpdHMsCi0gKiBzaXplIG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGluIHRoZSBsb3dlciAxNCBiaXRzIG9mIHRoZQotICogdXBwZXIgMTYgYml0cy4KLSAqIEVuY29kaW5nIHRoZSBzaXplIG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGluIHRoZSBpb2N0bCByZXF1ZXN0Ci0gKiBpcyB1c2VmdWwgZm9yIGNhdGNoaW5nIHByb2dyYW1zIGNvbXBpbGVkIHdpdGggb2xkIHZlcnNpb25zCi0gKiBhbmQgdG8gYXZvaWQgb3ZlcndyaXRpbmcgdXNlciBzcGFjZSBvdXRzaWRlIHRoZSB1c2VyIGJ1ZmZlciBhcmVhLgotICogVGhlIGhpZ2hlc3QgMiBiaXRzIGFyZSByZXNlcnZlZCBmb3IgaW5kaWNhdGluZyB0aGUgYGBhY2Nlc3MgbW9kZScnLgotICogTk9URTogVGhpcyBsaW1pdHMgdGhlIG1heCBwYXJhbWV0ZXIgc2l6ZSB0byAxNmtCIC0xICEKLSAqLwotCi0vKgotICogSSBkb24ndCByZWFsbHkgaGF2ZSBhbnkgaWRlYSBhYm91dCB3aGF0IHRoaXMgc2hvdWxkIGxvb2sgbGlrZSwgc28KLSAqIGZvciB0aGUgdGltZSBiZWluZywgdGhpcyBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBQQyBkZWZpbml0aW9ucy4KLSAqLwotCi0vKgotICogVGhlIGZvbGxvd2luZyBpcyBmb3IgY29tcGF0aWJpbGl0eSBhY3Jvc3MgdGhlIHZhcmlvdXMgTGludXgKLSAqIHBsYXRmb3Jtcy4gIFRoZSBpMzg2IGlvY3RsIG51bWJlcmluZyBzY2hlbWUgZG9lc24ndCByZWFsbHkgZW5mb3JjZQotICogYSB0eXBlIGZpZWxkLiAgRGUgZmFjdG8sIGhvd2V2ZXIsIHRoZSB0b3AgOCBiaXRzIG9mIHRoZSBsb3dlciAxNgotICogYml0cyBhcmUgaW5kZWVkIHVzZWQgYXMgYSB0eXBlIGZpZWxkLCBzbyB3ZSBtaWdodCBqdXN0IGFzIHdlbGwgbWFrZQotICogdGhpcyBleHBsaWNpdCBoZXJlLiAgUGxlYXNlIGJlIHN1cmUgdG8gdXNlIHRoZSBkZWNvZGluZyBtYWNyb3MKLSAqIGJlbG93IGZyb20gbm93IG9uLgotICovCi0jZGVmaW5lIF9JT0NfTlJCSVRTCTgKLSNkZWZpbmUgX0lPQ19UWVBFQklUUwk4Ci0jZGVmaW5lIF9JT0NfU0laRUJJVFMJMTQKLSNkZWZpbmUgX0lPQ19ESVJCSVRTCTIKLQotI2RlZmluZSBfSU9DX05STUFTSwkoKDEgPDwgX0lPQ19OUkJJVFMpLTEpCi0jZGVmaW5lIF9JT0NfVFlQRU1BU0sJKCgxIDw8IF9JT0NfVFlQRUJJVFMpLTEpCi0jZGVmaW5lIF9JT0NfU0laRU1BU0sJKCgxIDw8IF9JT0NfU0laRUJJVFMpLTEpCi0jZGVmaW5lIF9JT0NfRElSTUFTSwkoKDEgPDwgX0lPQ19ESVJCSVRTKS0xKQotCi0jZGVmaW5lIF9JT0NfTlJTSElGVAkwCi0jZGVmaW5lIF9JT0NfVFlQRVNISUZUCShfSU9DX05SU0hJRlQrX0lPQ19OUkJJVFMpCi0jZGVmaW5lIF9JT0NfU0laRVNISUZUCShfSU9DX1RZUEVTSElGVCtfSU9DX1RZUEVCSVRTKQotI2RlZmluZSBfSU9DX0RJUlNISUZUCShfSU9DX1NJWkVTSElGVCtfSU9DX1NJWkVCSVRTKQotCi0vKgotICogRGlyZWN0aW9uIGJpdHMuCi0gKi8KLSNkZWZpbmUgX0lPQ19OT05FCTBVCi0jZGVmaW5lIF9JT0NfV1JJVEUJMVUKLSNkZWZpbmUgX0lPQ19SRUFECTJVCi0KLSNkZWZpbmUgX0lPQyhkaXIsdHlwZSxucixzaXplKSBcCi0JKCgoZGlyKSAgPDwgX0lPQ19ESVJTSElGVCkgfCBcCi0JICgodHlwZSkgPDwgX0lPQ19UWVBFU0hJRlQpIHwgXAotCSAoKG5yKSAgIDw8IF9JT0NfTlJTSElGVCkgfCBcCi0JICgoc2l6ZSkgPDwgX0lPQ19TSVpFU0hJRlQpKQotCi0vKiB1c2VkIHRvIGNyZWF0ZSBudW1iZXJzICovCi0jZGVmaW5lIF9JTyh0eXBlLG5yKQkJX0lPQyhfSU9DX05PTkUsKHR5cGUpLChuciksMCkKLSNkZWZpbmUgX0lPUih0eXBlLG5yLHNpemUpCV9JT0MoX0lPQ19SRUFELCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKLSNkZWZpbmUgX0lPVyh0eXBlLG5yLHNpemUpCV9JT0MoX0lPQ19XUklURSwodHlwZSksKG5yKSxzaXplb2Yoc2l6ZSkpCi0jZGVmaW5lIF9JT1dSKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1JFQUR8X0lPQ19XUklURSwodHlwZSksKG5yKSxzaXplb2Yoc2l6ZSkpCi0KLS8qIHVzZWQgdG8gZGVjb2RlIGlvY3RsIG51bWJlcnMuLiAqLwotI2RlZmluZSBfSU9DX0RJUihucikJCSgoKG5yKSA+PiBfSU9DX0RJUlNISUZUKSAmIF9JT0NfRElSTUFTSykKLSNkZWZpbmUgX0lPQ19UWVBFKG5yKQkJKCgobnIpID4+IF9JT0NfVFlQRVNISUZUKSAmIF9JT0NfVFlQRU1BU0spCi0jZGVmaW5lIF9JT0NfTlIobnIpCQkoKChucikgPj4gX0lPQ19OUlNISUZUKSAmIF9JT0NfTlJNQVNLKQotI2RlZmluZSBfSU9DX1NJWkUobnIpCQkoKChucikgPj4gX0lPQ19TSVpFU0hJRlQpICYgX0lPQ19TSVpFTUFTSykKLQotLyogLi4uYW5kIGZvciB0aGUgZHJpdmVycy9zb3VuZCBmaWxlcy4uLiAqLwotCi0jZGVmaW5lIElPQ19JTgkJKF9JT0NfV1JJVEUgPDwgX0lPQ19ESVJTSElGVCkKLSNkZWZpbmUgSU9DX09VVAkJKF9JT0NfUkVBRCA8PCBfSU9DX0RJUlNISUZUKQotI2RlZmluZSBJT0NfSU5PVVQJKChfSU9DX1dSSVRFfF9JT0NfUkVBRCkgPDwgX0lPQ19ESVJTSElGVCkKLSNkZWZpbmUgSU9DU0laRV9NQVNLCShfSU9DX1NJWkVNQVNLIDw8IF9JT0NfU0laRVNISUZUKQotI2RlZmluZSBJT0NTSVpFX1NISUZUCShfSU9DX1NJWkVTSElGVCkKLQotI2VuZGlmIC8qIF9fVjg1MF9JT0NUTF9IX18gKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pb2N0bC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdjg1MC9tdXRleC5oIGIvaW5jbHVkZS9hc20tdjg1MC9tdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OGMxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS12ODUwL211dGV4LmgKQEAgLTAsMCArMSw5IEBACisvKgorICogUHVsbCBpbiB0aGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIG11dGV4IGZhc3RwYXRoLgorICoKKyAqIFRPRE86IGltcGxlbWVudCBvcHRpbWl6ZWQgcHJpbWl0aXZlcyBpbnN0ZWFkLCBvciBsZWF2ZSB0aGUgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24gaW4gcGxhY2UsIG9yIHBpY2sgdGhlIGF0b21pY194Y2hnKCkgYmFzZWQgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24uIChzZWUgYXNtLWdlbmVyaWMvbXV0ZXgteGNoZy5oIGZvciBkZXRhaWxzKQorICovCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tdXRleC1kZWMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS12ODUwL3Byb2Nlc3Nvci5oCmluZGV4IDk4ZjkyOTQuLjJkMzEzMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXY4NTAvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20tdjg1MC9wcm9jZXNzb3IuaApAQCAtOTgsMTAgKzk4LDEwIEBACiAKIAogLyogUmV0dXJuIHNvbWUgaW5mbyBhYm91dCB0aGUgdXNlciBwcm9jZXNzIFRBU0suICAqLwotI2RlZmluZSB0YXNrX3Rvcyh0YXNrKQkoKHVuc2lnbmVkIGxvbmcpKHRhc2spLT50aHJlYWRfaW5mbyArIFRIUkVBRF9TSVpFKQotI2RlZmluZSB0YXNrX3JlZ3ModGFzaykgKChzdHJ1Y3QgcHRfcmVncyAqKXRhc2tfdG9zICh0YXNrKSAtIDEpCi0jZGVmaW5lIHRhc2tfc3AodGFzaykJKHRhc2tfcmVncyAodGFzayktPmdwcltHUFJfU1BdKQotI2RlZmluZSB0YXNrX3BjKHRhc2spCSh0YXNrX3JlZ3MgKHRhc2spLT5wYykKKyNkZWZpbmUgdGFza190b3ModGFzaykJKCh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZSh0YXNrKSArIFRIUkVBRF9TSVpFKQorI2RlZmluZSB0YXNrX3B0X3JlZ3ModGFzaykgKChzdHJ1Y3QgcHRfcmVncyAqKXRhc2tfdG9zICh0YXNrKSAtIDEpCisjZGVmaW5lIHRhc2tfc3AodGFzaykJKHRhc2tfcHRfcmVncyAodGFzayktPmdwcltHUFJfU1BdKQorI2RlZmluZSB0YXNrX3BjKHRhc2spCSh0YXNrX3B0X3JlZ3MgKHRhc2spLT5wYykKIC8qIEdyb3R0eSBvbGQgbmFtZXMgZm9yIHNvbWUuICAqLwogI2RlZmluZSBLU1RLX0VJUCh0YXNrKQl0YXNrX3BjICh0YXNrKQogI2RlZmluZSBLU1RLX0VTUCh0YXNrKQl0YXNrX3NwICh0YXNrKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdjg1MC9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLXY4NTAvcHRyYWNlLmgKaW5kZXggN2JmNzJiYi4uNGYzNWNmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdjg1MC9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS12ODUwL3B0cmFjZS5oCkBAIC05Miw3ICs5Miw3IEBACiAvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgdG8gc3RvcmUgZWFjaCByZWdpc3Rlci4gICovCiAjZGVmaW5lIF9QVF9SRUdfU0laRQk0CiAKLS8qIE9mZnNldCBvZiBhIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpbiBhIHN0dWN0IHB0X3JlZ3MuICAqLworLyogT2Zmc2V0IG9mIGEgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGluIGEgc3RydWN0IHB0X3JlZ3MuICAqLwogI2RlZmluZSBQVF9HUFIobnVtKQkoKG51bSkgKiBfUFRfUkVHX1NJWkUpCiAKIC8qIE9mZnNldHMgb2YgdmFyaW91cyBzcGVjaWFsIHJlZ2lzdGVycyAmIGZpZWxkcyBpbiBhIHN0cnVjdCBwdF9yZWdzLiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLXY4NTAvdGhyZWFkX2luZm8uaAppbmRleCBlNGNmYWQ5Li44MmI4ZjI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS12ODUwL3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tdjg1MC90aHJlYWRfaW5mby5oCkBAIC01OCw4ICs1OCw2IEBACiAjZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaykgKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgXAogCQkJCV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgMSkpCiAjZGVmaW5lIGZyZWVfdGhyZWFkX2luZm8odGkpCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpICh0aSksIDEpCi0jZGVmaW5lIGdldF90aHJlYWRfaW5mbyh0aSkJZ2V0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCi0jZGVmaW5lIHB1dF90aHJlYWRfaW5mbyh0aSkJcHV0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdjg1MC91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXY4NTAvdW5pc3RkLmgKaW5kZXggNWE4NmY4ZS4uODI0NjBhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdjg1MC91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS12ODUwL3VuaXN0ZC5oCkBAIC0yNDEsOSArMjQxLDYgQEAKIC8qIFVzZXIgcHJvZ3JhbXMgc29tZXRpbWVzIGVuZCB1cCBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgZmlsZQogICAgKGluZGlyZWN0bHksIHZpYSB1Q2xpYmMgaGVhZGVyIGZpbGVzKSwgc28gSSdtIGEgYml0IG5lcnZvdXMganVzdAogICAgaW5jbHVkaW5nIDxsaW51eC9jb21waWxlci5oPi4gICovCi0jaWYgIWRlZmluZWQoX19idWlsdGluX2V4cGVjdCkgJiYgX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8IDk2Ci0jZGVmaW5lIF9fYnVpbHRpbl9leHBlY3QoeCwgZXhwZWN0ZWRfdmFsdWUpICh4KQotI2VuZGlmCiAKICNkZWZpbmUgX19zeXNjYWxsX3JldHVybih0eXBlLCByZXMpCQkJCQkgICAgICBcCiAgIGRvIHsJCQkJCQkJCQkgICAgICBcCkBAIC0zNDYsMjAgKzM0Myw2IEBACiAgIF9fc3lzY2FsbF9yZXR1cm4gKHR5cGUsIF9fcmV0KTsJCQkJCSAgICAgIFwKIH0KIAotI2lmIF9fR05VQ19fIDwgMwotLyogSW4gb2xkZXIgdmVyc2lvbnMgb2YgZ2NjLCBgYXNtJyBzdGF0ZW1lbnRzIHdpdGggbW9yZSB0aGFuIDEwCi0gICBpbnB1dC9vdXRwdXQgYXJndW1lbnRzIHByb2R1Y2UgYSBmYXRhbCBlcnJvci4gIFRvIHdvcmsgYXJvdW5kIHRoaXMKLSAgIHByb2JsZW0sIHdlIHVzZSB0d28gdmVyc2lvbnMsIG9uZSBmb3IgZ2NjLTMueCBhbmQgb25lIGZvciBlYXJsaWVyCi0gICB2ZXJzaW9ucyBvZiBnY2MgKHRoZSBgZWFybGllciBnY2MnIHZlcnNpb24gZG9lc24ndCB3b3JrIHdpdGggZ2NjLTMueAotICAgYmVjYXVzZSBnY2MtMy54IGRvZXNuJ3QgYWxsb3cgY2xvYmJlcnMgdG8gYWxzbyBiZSBpbnB1dCBhcmd1bWVudHMpLiAgKi8KLSNkZWZpbmUgX19TWVNDQUxMNl9UUkFQKHN5c2NhbGwsIHJldCwgYSwgYiwgYywgZCwgZSwgZikJCQkgICAgICBcCi0gIF9fYXNtX18gX192b2xhdGlsZV9fICgidHJhcCAiIFNZU0NBTExfTE9OR19UUkFQCQkJICAgICAgXAotCQkJOiAiPXIiIChyZXQpLCAiPXIiIChzeXNjYWxsKQkJCSAgICAgIFwKLQkJCTogIjEiIChzeXNjYWxsKSwJCQkJICAgICAgXAotCQkJInIiIChhKSwgInIiIChiKSwgInIiIChjKSwgInIiIChkKSwJCSAgICAgIFwKLSAJCQkiciIgKGUpLCAiciIgKGYpCQkJCSAgICAgIFwKLQkJCTogU1lTQ0FMTF9DTE9CQkVSUywgU1lTQ0FMTF9BUkc0LCBTWVNDQUxMX0FSRzUpOwotI2Vsc2UgLyogX19HTlVDX18gPj0gMyAqLwogI2RlZmluZSBfX1NZU0NBTEw2X1RSQVAoc3lzY2FsbCwgcmV0LCBhLCBiLCBjLCBkLCBlLCBmKQkJCSAgICAgIFwKICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJ0cmFwICIgU1lTQ0FMTF9MT05HX1RSQVAJCQkgICAgICBcCiAJCQk6ICI9ciIgKHJldCksICI9ciIgKHN5c2NhbGwpLAkJCSAgICAgIFwKQEAgLTM2OCw3ICszNTEsNiBAQAogCQkJInIiIChhKSwgInIiIChiKSwgInIiIChjKSwgInIiIChkKSwJCSAgICAgIFwKIAkJCSIyIiAoZSksICIzIiAoZikJCQkJICAgICAgXAogCQkJOiBTWVNDQUxMX0NMT0JCRVJTKTsKLSNlbmRpZgogCiAjZGVmaW5lIF9zeXNjYWxsNih0eXBlLCBuYW1lLCBhdHlwZSwgYSwgYnR5cGUsIGIsIGN0eXBlLCBjLCBkdHlwZSwgZCwgZXR5cGUsIGUsIGZ0eXBlLCBmKSBcCiB0eXBlIG5hbWUgKGF0eXBlIGEsIGJ0eXBlIGIsIGN0eXBlIGMsIGR0eXBlIGQsIGV0eXBlIGUsIGZ0eXBlIGYpCSAgICAgIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9hcGljLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvYXBpYy5oCmluZGV4IDU2NDdiN2QuLjRmNmE0ZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9hcGljLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2FwaWMuaApAQCAtNDIsMTEgKzQyLDYgQEAKIAkqKCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoQVBJQ19CQVNFK3JlZykpID0gdjsKIH0KIAotc3RhdGljIF9faW5saW5lIHZvaWQgYXBpY193cml0ZV9hdG9taWModW5zaWduZWQgbG9uZyByZWcsIHVuc2lnbmVkIGludCB2KQotewotCXhjaGcoKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKShBUElDX0JBU0UrcmVnKSwgdik7Ci19Ci0KIHN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQgYXBpY19yZWFkKHVuc2lnbmVkIGxvbmcgcmVnKQogewogCXJldHVybiAqKCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoQVBJQ19CQVNFK3JlZykpOwpAQCAtNTcsMTAgKzUyLDYgQEAKIAl3aGlsZSAoIGFwaWNfcmVhZCggQVBJQ19JQ1IgKSAmIEFQSUNfSUNSX0JVU1kgKTsKIH0KIAotI2RlZmluZSBGT1JDRV9SRUFEX0FST1VORF9XUklURSAwCi0jZGVmaW5lIGFwaWNfcmVhZF9hcm91bmQoeCkKLSNkZWZpbmUgYXBpY193cml0ZV9hcm91bmQoeCx5KSBhcGljX3dyaXRlKCh4KSwoeSkpCi0KIHN0YXRpYyBpbmxpbmUgdm9pZCBhY2tfQVBJQ19pcnEodm9pZCkKIHsKIAkvKgpAQCAtNzEsNyArNjIsNyBAQAogCSAqLwogCiAJLyogRG9jcyBzYXkgdXNlIDAgZm9yIGZ1dHVyZSBjb21wYXRpYmlsaXR5ICovCi0JYXBpY193cml0ZV9hcm91bmQoQVBJQ19FT0ksIDApOworCWFwaWNfd3JpdGUoQVBJQ19FT0ksIDApOwogfQogCiBleHRlcm4gaW50IGdldF9tYXhsdnQgKHZvaWQpOwpAQCAtMTEzLDYgKzEwNCwxMiBAQAogCiBleHRlcm4gdm9pZCBzZXR1cF90aHJlc2hvbGRfbHZ0KHVuc2lnbmVkIGxvbmcgbHZ0X29mZik7CiAKK3ZvaWQgc21wX3NlbmRfdGltZXJfYnJvYWRjYXN0X2lwaSh2b2lkKTsKK3ZvaWQgc3dpdGNoX0FQSUNfdGltZXJfdG9faXBpKHZvaWQgKmNwdW1hc2spOwordm9pZCBzd2l0Y2hfaXBpX3RvX0FQSUNfdGltZXIodm9pZCAqY3B1bWFzayk7CisKKyNkZWZpbmUgQVJDSF9BUElDVElNRVJfU1RPUFNfT05fQzMJMQorCiAjZW5kaWYgLyogQ09ORklHX1g4Nl9MT0NBTF9BUElDICovCiAKIGV4dGVybiB1bnNpZ25lZCBib290X2NwdV9pZDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9hcGljZGVmLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvYXBpY2RlZi5oCmluZGV4IGZiMWM5OWEuLmRlY2FhMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9hcGljZGVmLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2FwaWNkZWYuaApAQCAtMTMsNiArMTMsNyBAQAogI2RlZmluZQkJQVBJQ19JRAkJMHgyMAogI2RlZmluZQkJCUFQSUNfSURfTUFTSwkJKDB4RkZ1PDwyNCkKICNkZWZpbmUJCQlHRVRfQVBJQ19JRCh4KQkJKCgoeCk+PjI0KSYweEZGdSkKKyNkZWZpbmUJCQlTRVRfQVBJQ19JRCh4KQkJKCgoeCk8PDI0KSkKICNkZWZpbmUJCUFQSUNfTFZSCTB4MzAKICNkZWZpbmUJCQlBUElDX0xWUl9NQVNLCQkweEZGMDBGRgogI2RlZmluZQkJCUdFVF9BUElDX1ZFUlNJT04oeCkJKCh4KSYweEZGdSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hdG9taWMuaAppbmRleCA3MmViMDcxLi40YjVjZDU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2F0b21pYy5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfX0FSQ0hfWDg2XzY0X0FUT01JQ19fCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KIAogLyogYXRvbWljX3Qgc2hvdWxkIGJlIDMyIGJpdCBzaWduZWQgdHlwZSAqLwogCkBAIC0zODksNiArMzkwLDcgQEAKICNkZWZpbmUgYXRvbWljNjRfZGVjX3JldHVybih2KSAgKGF0b21pYzY0X3N1Yl9yZXR1cm4oMSx2KSkKIAogI2RlZmluZSBhdG9taWNfY21weGNoZyh2LCBvbGQsIG5ldykgKChpbnQpY21weGNoZygmKCh2KS0+Y291bnRlciksIG9sZCwgbmV3KSkKKyNkZWZpbmUgYXRvbWljX3hjaGcodiwgbmV3KSAoeGNoZygmKCh2KS0+Y291bnRlciksIG5ldykpCiAKIC8qKgogICogYXRvbWljX2FkZF91bmxlc3MgLSBhZGQgdW5sZXNzIHRoZSBudW1iZXIgaXMgYSBnaXZlbiB2YWx1ZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2JpdG9wcy5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2JpdG9wcy5oCmluZGV4IGE0ZDVkMDkuLmViNGRmMjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9iaXRvcHMuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvYml0b3BzLmgKQEAgLTI5LDcgKzI5LDcgQEAKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyggTE9DS19QUkVGSVgKIAkJImJ0c2wgJTEsJTAiCi0JCToiPW0iIChBRERSKQorCQk6IittIiAoQUREUikKIAkJOiJkSXIiIChucikgOiAibWVtb3J5Iik7CiB9CiAKQEAgLTQ2LDcgKzQ2LDcgQEAKIHsKIAlfX2FzbV9fIHZvbGF0aWxlKAogCQkiYnRzbCAlMSwlMCIKLQkJOiI9bSIgKEFERFIpCisJCToiK20iIChBRERSKQogCQk6ImRJciIgKG5yKSA6ICJtZW1vcnkiKTsKIH0KIApAQCAtNjQsNyArNjQsNyBAQAogewogCV9fYXNtX18gX192b2xhdGlsZV9fKCBMT0NLX1BSRUZJWAogCQkiYnRybCAlMSwlMCIKLQkJOiI9bSIgKEFERFIpCisJCToiK20iIChBRERSKQogCQk6ImRJciIgKG5yKSk7CiB9CiAKQEAgLTcyLDcgKzcyLDcgQEAKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKIAkJImJ0cmwgJTEsJTAiCi0JCToiPW0iIChBRERSKQorCQk6IittIiAoQUREUikKIAkJOiJkSXIiIChucikpOwogfQogCkBAIC05Miw3ICs5Miw3IEBACiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCSJidGNsICUxLCUwIgotCQk6Ij1tIiAoQUREUikKKwkJOiIrbSIgKEFERFIpCiAJCToiZElyIiAobnIpKTsKIH0KIApAQCAtMTA5LDcgKzEwOSw3IEBACiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oIExPQ0tfUFJFRklYCiAJCSJidGNsICUxLCUwIgotCQk6Ij1tIiAoQUREUikKKwkJOiIrbSIgKEFERFIpCiAJCToiZElyIiAobnIpKTsKIH0KIApAQCAtMTI3LDcgKzEyNyw3IEBACiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyggTE9DS19QUkVGSVgKIAkJImJ0c2wgJTIsJTFcblx0c2JibCAlMCwlMCIKLQkJOiI9ciIgKG9sZGJpdCksIj1tIiAoQUREUikKKwkJOiI9ciIgKG9sZGJpdCksIittIiAoQUREUikKIAkJOiJkSXIiIChucikgOiAibWVtb3J5Iik7CiAJcmV0dXJuIG9sZGJpdDsKIH0KQEAgLTE0Nyw3ICsxNDcsNyBAQAogCiAJX19hc21fXygKIAkJImJ0c2wgJTIsJTFcblx0c2JibCAlMCwlMCIKLQkJOiI9ciIgKG9sZGJpdCksIj1tIiAoQUREUikKKwkJOiI9ciIgKG9sZGJpdCksIittIiAoQUREUikKIAkJOiJkSXIiIChucikpOwogCXJldHVybiBvbGRiaXQ7CiB9CkBAIC0xNjYsNyArMTY2LDcgQEAKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKCBMT0NLX1BSRUZJWAogCQkiYnRybCAlMiwlMVxuXHRzYmJsICUwLCUwIgotCQk6Ij1yIiAob2xkYml0KSwiPW0iIChBRERSKQorCQk6Ij1yIiAob2xkYml0KSwiK20iIChBRERSKQogCQk6ImRJciIgKG5yKSA6ICJtZW1vcnkiKTsKIAlyZXR1cm4gb2xkYml0OwogfQpAQCAtMTg2LDcgKzE4Niw3IEBACiAKIAlfX2FzbV9fKAogCQkiYnRybCAlMiwlMVxuXHRzYmJsICUwLCUwIgotCQk6Ij1yIiAob2xkYml0KSwiPW0iIChBRERSKQorCQk6Ij1yIiAob2xkYml0KSwiK20iIChBRERSKQogCQk6ImRJciIgKG5yKSk7CiAJcmV0dXJuIG9sZGJpdDsKIH0KQEAgLTE5OCw3ICsxOTgsNyBAQAogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCSJidGNsICUyLCUxXG5cdHNiYmwgJTAsJTAiCi0JCToiPXIiIChvbGRiaXQpLCI9bSIgKEFERFIpCisJCToiPXIiIChvbGRiaXQpLCIrbSIgKEFERFIpCiAJCToiZElyIiAobnIpIDogIm1lbW9yeSIpOwogCXJldHVybiBvbGRiaXQ7CiB9CkBAIC0yMTcsNyArMjE3LDcgQEAKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKCBMT0NLX1BSRUZJWAogCQkiYnRjbCAlMiwlMVxuXHRzYmJsICUwLCUwIgotCQk6Ij1yIiAob2xkYml0KSwiPW0iIChBRERSKQorCQk6Ij1yIiAob2xkYml0KSwiK20iIChBRERSKQogCQk6ImRJciIgKG5yKSA6ICJtZW1vcnkiKTsKIAlyZXR1cm4gb2xkYml0OwogfQpAQCAtMzk3LDYgKzM5NywyMiBAQAogfQogCiAvKioKKyAqIGZscyAtIGZpbmQgbGFzdCBiaXQgc2V0CisgKiBAeDogdGhlIHdvcmQgdG8gc2VhcmNoCisgKgorICogVGhpcyBpcyBkZWZpbmVkIHRoZSBzYW1lIHdheSBhcyBmZnMuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCBmbHMoaW50IHgpCit7CisJaW50IHI7CisKKwlfX2FzbV9fKCJic3JsICUxLCUwXG5cdCIKKwkJImNtb3Z6bCAlMiwlMCIKKwkJOiAiPSZyIiAocikgOiAicm0iICh4KSwgInJtIiAoLTEpKTsKKwlyZXR1cm4gcisxOworfQorCisvKioKICAqIGh3ZWlnaHROIC0gcmV0dXJucyB0aGUgaGFtbWluZyB3ZWlnaHQgb2YgYSBOLWJpdCB3b3JkCiAgKiBAeDogdGhlIHdvcmQgdG8gd2VpZ2gKICAqCkBAIC00MzQsOSArNDUwLDYgQEAKICNkZWZpbmUgbWluaXhfZmluZF9maXJzdF96ZXJvX2JpdChhZGRyLHNpemUpIFwKIAlmaW5kX2ZpcnN0X3plcm9fYml0KCh2b2lkKilhZGRyLHNpemUpCiAKLS8qIGZpbmQgbGFzdCBzZXQgYml0ICovCi0jZGVmaW5lIGZscyh4KSBnZW5lcmljX2Zscyh4KQotCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgLyogX1g4Nl82NF9CSVRPUFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2NhY2hlLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvY2FjaGUuaAppbmRleCAzM2U1MzQyLi4yNjNmMGEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvY2FjaGUuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvY2FjaGUuaApAQCAtOSw2ICs5LDE3IEBACiAvKiBMMSBjYWNoZSBsaW5lIHNpemUgKi8KICNkZWZpbmUgTDFfQ0FDSEVfU0hJRlQJKENPTkZJR19YODZfTDFfQ0FDSEVfU0hJRlQpCiAjZGVmaW5lIEwxX0NBQ0hFX0JZVEVTCSgxIDw8IEwxX0NBQ0hFX1NISUZUKQotI2RlZmluZSBMMV9DQUNIRV9TSElGVF9NQVggNwkvKiBsYXJnZXN0IEwxIHdoaWNoIHRoaXMgYXJjaCBzdXBwb3J0cyAqLworCisjaWZkZWYgQ09ORklHX1g4Nl9WU01QCisKKy8qIHZTTVAgSW50ZXJub2RlIGNhY2hlbGluZSBzaGlmdCAqLworI2RlZmluZSBJTlRFUk5PREVfQ0FDSEVfU0hJRlQgKDEyKQorI2lmZGVmIENPTkZJR19TTVAKKyNkZWZpbmUgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAJCQkJCVwKKyAgICAgICBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXygxIDw8IChJTlRFUk5PREVfQ0FDSEVfU0hJRlQpKSkpICAgICAgICAgXAorICAgICAgIF9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5wYWdlX2FsaWduZWQiKSkpCisjZW5kaWYKKworI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2NvbXBhdC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2NvbXBhdC5oCmluZGV4IGYwMTU1YzMuLmIzN2FiODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvY29tcGF0LmgKQEAgLTE5OCw4ICsxOTgsMTMgQEAKIAogc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3VzZXIgKmNvbXBhdF9hbGxvY191c2VyX3NwYWNlKGxvbmcgbGVuKQogewotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gKHZvaWQgKiljdXJyZW50LT50aHJlYWQucnNwMCAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncyk7IAorCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOwogCXJldHVybiAodm9pZCBfX3VzZXIgKilyZWdzLT5yc3AgLSBsZW47IAogfQogCitzdGF0aWMgaW5saW5lIGludCBpc19jb21wYXRfdGFzayh2b2lkKQoreworCXJldHVybiBjdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyAmIFRTX0NPTVBBVDsKK30KKwogI2VuZGlmIC8qIF9BU01fWDg2XzY0X0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvY3B1ZmVhdHVyZS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2NwdWZlYXR1cmUuaAppbmRleCBhZWEzMDhjLi40MWMwYWM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvY3B1ZmVhdHVyZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9jcHVmZWF0dXJlLmgKQEAgLTYxLDggKzYxLDkgQEAKICNkZWZpbmUgWDg2X0ZFQVRVUkVfSzZfTVRSUgkoMyozMisgMSkgLyogQU1EIEs2IG5vbnN0YW5kYXJkIE1UUlJzICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0NZUklYX0FSUgkoMyozMisgMikgLyogQ3lyaXggQVJScyAoPSBNVFJScykgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfQ0VOVEFVUl9NQ1IJKDMqMzIrIDMpIC8qIENlbnRhdXIgTUNScyAoPSBNVFJScykgKi8KLSNkZWZpbmUgWDg2X0ZFQVRVUkVfSzhfQwkoMyozMisgNCkgLyogQyBzdGVwcGluZyBLOCAqLworLyogNCBmcmVlICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0NPTlNUQU5UX1RTQyAoMyozMis1KSAvKiBUU0MgcnVucyBhdCBjb25zdGFudCByYXRlICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1NZTkNfUkRUU0MgICgzKjMyKzYpICAvKiBSRFRTQyBzeW5jcyBDUFUgY29yZSAqLwogCiAvKiBJbnRlbC1kZWZpbmVkIENQVSBmZWF0dXJlcywgQ1BVSUQgbGV2ZWwgMHgwMDAwMDAwMSAoZWN4KSwgd29yZCA0ICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1hNTTMJKDQqMzIrIDApIC8qIFN0cmVhbWluZyBTSU1EIEV4dGVuc2lvbnMtMyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2Rlc2MuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9kZXNjLmgKaW5kZXggMzM3NjQ4Ni4uZWI3NzIzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2Rlc2MuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvZGVzYy5oCkBAIC0yNSw3ICsyNSw3IEBACiAJdW5zaWduZWQgaW50IGEsYjsKIH07IAkKIAotZXh0ZXJuIHN0cnVjdCBkZXNjX3N0cnVjdCBjcHVfZ2R0X3RhYmxlW05SX0NQVVNdW0dEVF9FTlRSSUVTXTsKK2V4dGVybiBzdHJ1Y3QgZGVzY19zdHJ1Y3QgY3B1X2dkdF90YWJsZVtHRFRfRU5UUklFU107CiAKIGVudW0geyAKIAlHQVRFX0lOVEVSUlVQVCA9IDB4RSwgCkBAIC03OSw2ICs3OSw5IEBACiBleHRlcm4gc3RydWN0IGdhdGVfc3RydWN0IGlkdF90YWJsZVtdOyAKIGV4dGVybiBzdHJ1Y3QgZGVzY19wdHIgY3B1X2dkdF9kZXNjcltdOwogCisvKiB0aGUgY3B1IGdkdCBhY2Nlc3NvciAqLworI2RlZmluZSBjcHVfZ2R0KF9jcHUpICgoc3RydWN0IGRlc2Nfc3RydWN0ICopY3B1X2dkdF9kZXNjcltfY3B1XS5hZGRyZXNzKQorCiBzdGF0aWMgaW5saW5lIHZvaWQgX3NldF9nYXRlKHZvaWQgKmFkciwgdW5zaWduZWQgdHlwZSwgdW5zaWduZWQgbG9uZyBmdW5jLCB1bnNpZ25lZCBkcGwsIHVuc2lnbmVkIGlzdCkgIAogewogCXN0cnVjdCBnYXRlX3N0cnVjdCBzOyAJCkBAIC0xMTQsNiArMTE3LDExIEBACiAJX3NldF9nYXRlKCZpZHRfdGFibGVbbnJdLCBHQVRFX0lOVEVSUlVQVCwgKHVuc2lnbmVkIGxvbmcpIGZ1bmMsIDMsIDApOyAKIH0gCiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc3lzdGVtX2dhdGVfaXN0KGludCBuciwgdm9pZCAqZnVuYywgdW5zaWduZWQgaXN0KQoreworCV9zZXRfZ2F0ZSgmaWR0X3RhYmxlW25yXSwgR0FURV9JTlRFUlJVUFQsICh1bnNpZ25lZCBsb25nKSBmdW5jLCAzLCBpc3QpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3Rzc2xkdF9kZXNjcmlwdG9yKHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyB0c3MsIHVuc2lnbmVkIHR5cGUsIAogCQkJCQkgdW5zaWduZWQgc2l6ZSkgCiB7IApAQCAtMTM5LDIwICsxNDcsMjAgQEAKIAkgKiAtMT8gc2VnIGJhc2UrbGltaXQgc2hvdWxkIGJlIHBvaW50aW5nIHRvIHRoZSBhZGRyZXNzIG9mIHRoZQogCSAqIGxhc3QgdmFsaWQgYnl0ZQogCSAqLwotCXNldF90c3NsZHRfZGVzY3JpcHRvcigmY3B1X2dkdF90YWJsZVtjcHVdW0dEVF9FTlRSWV9UU1NdLAorCXNldF90c3NsZHRfZGVzY3JpcHRvcigmY3B1X2dkdChjcHUpW0dEVF9FTlRSWV9UU1NdLAogCQkodW5zaWduZWQgbG9uZylhZGRyLCBERVNDX1RTUywKIAkJSU9fQklUTUFQX09GRlNFVCArIElPX0JJVE1BUF9CWVRFUyArIHNpemVvZih1bnNpZ25lZCBsb25nKSAtIDEpOwogfSAKIAogc3RhdGljIGlubGluZSB2b2lkIHNldF9sZHRfZGVzYyh1bnNpZ25lZCBjcHUsIHZvaWQgKmFkZHIsIGludCBzaXplKQogeyAKLQlzZXRfdHNzbGR0X2Rlc2NyaXB0b3IoJmNwdV9nZHRfdGFibGVbY3B1XVtHRFRfRU5UUllfTERUXSwgKHVuc2lnbmVkIGxvbmcpYWRkciwgCisJc2V0X3Rzc2xkdF9kZXNjcmlwdG9yKCZjcHVfZ2R0KGNwdSlbR0RUX0VOVFJZX0xEVF0sICh1bnNpZ25lZCBsb25nKWFkZHIsCiAJCQkgICAgICBERVNDX0xEVCwgc2l6ZSAqIDggLSAxKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNldF9zZWdfYmFzZSh1bnNpZ25lZCBjcHUsIGludCBlbnRyeSwgdm9pZCAqYmFzZSkKIHsgCi0Jc3RydWN0IGRlc2Nfc3RydWN0ICpkID0gJmNwdV9nZHRfdGFibGVbY3B1XVtlbnRyeV07CisJc3RydWN0IGRlc2Nfc3RydWN0ICpkID0gJmNwdV9nZHQoY3B1KVtlbnRyeV07CiAJdTMyIGFkZHIgPSAodTMyKSh1NjQpYmFzZTsKIAlCVUdfT04oKHU2NCliYXNlID4+IDMyKTsgCiAJZC0+YmFzZTAgPSBhZGRyICYgMHhmZmZmOwpAQCAtMTk0LDcgKzIwMiw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsb2FkX1RMUyhzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdCwgdW5zaWduZWQgaW50IGNwdSkKIHsKLQl1NjQgKmdkdCA9ICh1NjQgKikoY3B1X2dkdF90YWJsZVtjcHVdICsgR0RUX0VOVFJZX1RMU19NSU4pOworCXU2NCAqZ2R0ID0gKHU2NCAqKShjcHVfZ2R0KGNwdSkgKyBHRFRfRU5UUllfVExTX01JTik7CiAJZ2R0WzBdID0gdC0+dGxzX2FycmF5WzBdOwogCWdkdFsxXSA9IHQtPnRsc19hcnJheVsxXTsKIAlnZHRbMl0gPSB0LT50bHNfYXJyYXlbMl07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9kbWEtbWFwcGluZy5oCmluZGV4IDM2ZDE2ZGYuLjQ5YTgxYTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9kbWEtbWFwcGluZy5oCkBAIC0xMiwxNTUgKzEyLDE3NiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zd2lvdGxiLmg+CiAKK3N0cnVjdCBkbWFfbWFwcGluZ19vcHMgeworCWludCAgICAgICAgICAgICAoKm1hcHBpbmdfZXJyb3IpKGRtYV9hZGRyX3QgZG1hX2FkZHIpOworCXZvaWQqICAgICAgICAgICAoKmFsbG9jX2NvaGVyZW50KShzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBnZnApOworCXZvaWQgICAgICAgICAgICAoKmZyZWVfY29oZXJlbnQpKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpOworCWRtYV9hZGRyX3QgICAgICAoKm1hcF9zaW5nbGUpKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB2b2lkICpwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKTsKKwkvKiBsaWtlIG1hcF9zaW5nbGUsIGJ1dCBkb2Vzbid0IGNoZWNrIHRoZSBkZXZpY2UgbWFzayAqLworCWRtYV9hZGRyX3QgICAgICAoKm1hcF9zaW1wbGUpKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKTsKKwl2b2lkICAgICAgICAgICAgKCp1bm1hcF9zaW5nbGUpKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBhZGRyLAorCQkgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pOworCXZvaWQgICAgICAgICAgICAoKnN5bmNfc2luZ2xlX2Zvcl9jcHUpKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAorCQkgICAgICAgICAgICAgICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCBzaXplX3Qgc2l6ZSwKKwkJCQlpbnQgZGlyZWN0aW9uKTsKKwl2b2lkICAgICAgICAgICAgKCpzeW5jX3NpbmdsZV9mb3JfZGV2aWNlKShzdHJ1Y3QgZGV2aWNlICpod2RldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCBzaXplX3Qgc2l6ZSwKKwkJCQlpbnQgZGlyZWN0aW9uKTsKKwl2b2lkICAgICAgICAgICAgKCpzeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1KShzdHJ1Y3QgZGV2aWNlICpod2RldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKTsKKwl2b2lkICAgICAgICAgICAgKCpzeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKShzdHJ1Y3QgZGV2aWNlICpod2RldiwKKwkJCQlkbWFfYWRkcl90IGRtYV9oYW5kbGUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pOworCXZvaWQgICAgICAgICAgICAoKnN5bmNfc2dfZm9yX2NwdSkoc3RydWN0IGRldmljZSAqaHdkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZWxlbXMsCisJCQkJaW50IGRpcmVjdGlvbik7CisJdm9pZCAgICAgICAgICAgICgqc3luY19zZ19mb3JfZGV2aWNlKShzdHJ1Y3QgZGV2aWNlICpod2RldiwKKwkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVsZW1zLAorCQkJCWludCBkaXJlY3Rpb24pOworCWludCAgICAgICAgICAgICAoKm1hcF9zZykoc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCSAgICAgICAgICAgICAgICBpbnQgbmVudHMsIGludCBkaXJlY3Rpb24pOworCXZvaWQgICAgICAgICAgICAoKnVubWFwX3NnKShzdHJ1Y3QgZGV2aWNlICpod2RldiwKKwkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCisJCQkJaW50IGRpcmVjdGlvbik7CisJaW50ICAgICAgICAgICAgICgqZG1hX3N1cHBvcnRlZCkoc3RydWN0IGRldmljZSAqaHdkZXYsIHU2NCBtYXNrKTsKKwlpbnQJCWlzX3BoeXM7Cit9OworCiBleHRlcm4gZG1hX2FkZHJfdCBiYWRfZG1hX2FkZHJlc3M7Ci0jZGVmaW5lIGRtYV9tYXBwaW5nX2Vycm9yKHgpIFwKLQkoc3dpb3RsYiA/IHN3aW90bGJfZG1hX21hcHBpbmdfZXJyb3IoeCkgOiAoKHgpID09IGJhZF9kbWFfYWRkcmVzcykpCitleHRlcm4gc3RydWN0IGRtYV9tYXBwaW5nX29wcyogZG1hX29wczsKK2V4dGVybiBpbnQgaW9tbXVfbWVyZ2U7CiAKLXZvaWQgKmRtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLAotCQkJIGdmcF90IGdmcCk7Ci12b2lkIGRtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIHZvaWQgKnZhZGRyLAotCQkJIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSk7Ci0KLSNpZmRlZiBDT05GSUdfR0FSVF9JT01NVQotCi1leHRlcm4gZG1hX2FkZHJfdCBkbWFfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2Rldiwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwKLQkJCQkgaW50IGRpcmVjdGlvbik7Ci1leHRlcm4gdm9pZCBkbWFfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBhZGRyLHNpemVfdCBzaXplLAotCQkJICAgICBpbnQgZGlyZWN0aW9uKTsKLQotI2Vsc2UKLQotLyogTm8gSU9NTVUgKi8KLQotc3RhdGljIGlubGluZSBkbWFfYWRkcl90IGRtYV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB2b2lkICpwdHIsCi0JCQkJCXNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQorc3RhdGljIGlubGluZSBpbnQgZG1hX21hcHBpbmdfZXJyb3IoZG1hX2FkZHJfdCBkbWFfYWRkcikKIHsKLQlkbWFfYWRkcl90IGFkZHI7CisJaWYgKGRtYV9vcHMtPm1hcHBpbmdfZXJyb3IpCisJCXJldHVybiBkbWFfb3BzLT5tYXBwaW5nX2Vycm9yKGRtYV9hZGRyKTsKIAotCWlmIChkaXJlY3Rpb24gPT0gRE1BX05PTkUpCi0JCW91dF9vZl9saW5lX2J1ZygpOwotCWFkZHIgPSB2aXJ0X3RvX2J1cyhwdHIpOwotCi0JaWYgKChhZGRyK3NpemUpICYgfipod2Rldi0+ZG1hX21hc2spCi0JCW91dF9vZl9saW5lX2J1ZygpOwotCXJldHVybiBhZGRyOworCXJldHVybiAoZG1hX2FkZHIgPT0gYmFkX2RtYV9hZGRyZXNzKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGRtYV91bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCi0JCQkJICAgIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQorZXh0ZXJuIHZvaWQgKmRtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJCWRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGdmcCk7CitleHRlcm4gdm9pZCBkbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCB2b2lkICp2YWRkciwKKwkJCSAgICAgIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSk7CisKK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdAorZG1hX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCisJICAgICAgIGludCBkaXJlY3Rpb24pCiB7Ci0JaWYgKGRpcmVjdGlvbiA9PSBETUFfTk9ORSkKLQkJb3V0X29mX2xpbmVfYnVnKCk7Ci0JLyogTm90aGluZyB0byBkbyAqLworCXJldHVybiBkbWFfb3BzLT5tYXBfc2luZ2xlKGh3ZGV2LCBwdHIsIHNpemUsIGRpcmVjdGlvbik7CiB9CiAKLSNlbmRpZgorc3RhdGljIGlubGluZSB2b2lkCitkbWFfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBhZGRyLHNpemVfdCBzaXplLAorCQkgaW50IGRpcmVjdGlvbikKK3sKKwlkbWFfb3BzLT51bm1hcF9zaW5nbGUoZGV2LCBhZGRyLCBzaXplLCBkaXJlY3Rpb24pOworfQogCiAjZGVmaW5lIGRtYV9tYXBfcGFnZShkZXYscGFnZSxvZmZzZXQsc2l6ZSxkaXIpIFwKIAlkbWFfbWFwX3NpbmdsZSgoZGV2KSwgcGFnZV9hZGRyZXNzKHBhZ2UpKyhvZmZzZXQpLCAoc2l6ZSksIChkaXIpKQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqaHdkZXYsCi0JCQkJCSAgICAgICBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCi0JCQkJCSAgICAgICBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKLXsKLQlpZiAoZGlyZWN0aW9uID09IERNQV9OT05FKQotCQlvdXRfb2ZfbGluZV9idWcoKTsKLQotCWlmIChzd2lvdGxiKQotCQlyZXR1cm4gc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfY3B1KGh3ZGV2LGRtYV9oYW5kbGUsc2l6ZSxkaXJlY3Rpb24pOwotCi0JZmx1c2hfd3JpdGVfYnVmZmVycygpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqaHdkZXYsCi0JCQkJCQkgIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKLQkJCQkJCSAgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCi17Ci0gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gRE1BX05PTkUpCi0JCW91dF9vZl9saW5lX2J1ZygpOwotCi0JaWYgKHN3aW90bGIpCi0JCXJldHVybiBzd2lvdGxiX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoaHdkZXYsZG1hX2hhbmRsZSxzaXplLGRpcmVjdGlvbik7Ci0KLQlmbHVzaF93cml0ZV9idWZmZXJzKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpod2RldiwKLQkJCQkJCSBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCi0JCQkJCQkgdW5zaWduZWQgbG9uZyBvZmZzZXQsCi0JCQkJCQkgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCi17Ci0JaWYgKGRpcmVjdGlvbiA9PSBETUFfTk9ORSkKLQkJb3V0X29mX2xpbmVfYnVnKCk7Ci0KLQlpZiAoc3dpb3RsYikKLQkJcmV0dXJuIHN3aW90bGJfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdShod2RldixkbWFfaGFuZGxlLG9mZnNldCxzaXplLGRpcmVjdGlvbik7Ci0KLQlmbHVzaF93cml0ZV9idWZmZXJzKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpod2RldiwKLQkJCQkJCSAgICBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCi0JCQkJCQkgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCi0JCQkJCQkgICAgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCi17Ci0gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gRE1BX05PTkUpCi0JCW91dF9vZl9saW5lX2J1ZygpOwotCi0JaWYgKHN3aW90bGIpCi0JCXJldHVybiBzd2lvdGxiX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2UoaHdkZXYsZG1hX2hhbmRsZSxvZmZzZXQsc2l6ZSxkaXJlY3Rpb24pOwotCi0JZmx1c2hfd3JpdGVfYnVmZmVycygpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZG1hX3N5bmNfc2dfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpod2RldiwKLQkJCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQkJCQkgICAgICAgaW50IG5lbGVtcywgaW50IGRpcmVjdGlvbikKLXsKLQlpZiAoZGlyZWN0aW9uID09IERNQV9OT05FKQotCQlvdXRfb2ZfbGluZV9idWcoKTsKLQotCWlmIChzd2lvdGxiKQotCQlyZXR1cm4gc3dpb3RsYl9zeW5jX3NnX2Zvcl9jcHUoaHdkZXYsc2csbmVsZW1zLGRpcmVjdGlvbik7Ci0KLQlmbHVzaF93cml0ZV9idWZmZXJzKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc3luY19zZ19mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAotCQkJCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JCQkJCSAgaW50IG5lbGVtcywgaW50IGRpcmVjdGlvbikKLXsKLQlpZiAoZGlyZWN0aW9uID09IERNQV9OT05FKQotCQlvdXRfb2ZfbGluZV9idWcoKTsKLQotCWlmIChzd2lvdGxiKQotCQlyZXR1cm4gc3dpb3RsYl9zeW5jX3NnX2Zvcl9kZXZpY2UoaHdkZXYsc2csbmVsZW1zLGRpcmVjdGlvbik7Ci0KLQlmbHVzaF93cml0ZV9idWZmZXJzKCk7Ci19Ci0KLWV4dGVybiBpbnQgZG1hX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQkJICAgICAgaW50IG5lbnRzLCBpbnQgZGlyZWN0aW9uKTsKLWV4dGVybiB2b2lkIGRtYV91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQkJCSBpbnQgbmVudHMsIGludCBkaXJlY3Rpb24pOwotCiAjZGVmaW5lIGRtYV91bm1hcF9wYWdlIGRtYV91bm1hcF9zaW5nbGUKIAotZXh0ZXJuIGludCBkbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB1NjQgbWFzayk7Ci1leHRlcm4gaW50IGRtYV9nZXRfY2FjaGVfYWxpZ25tZW50KHZvaWQpOwotI2RlZmluZSBkbWFfaXNfY29uc2lzdGVudChoKSAxCi0KLXN0YXRpYyBpbmxpbmUgaW50IGRtYV9zZXRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQorc3RhdGljIGlubGluZSB2b2lkCitkbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAorCQkJc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCiB7Ci0JaWYgKCFkZXYtPmRtYV9tYXNrIHx8ICFkbWFfc3VwcG9ydGVkKGRldiwgbWFzaykpCi0JCXJldHVybiAtRUlPOwotCSpkZXYtPmRtYV9tYXNrID0gbWFzazsKLQlyZXR1cm4gMDsKKwlpZiAoZG1hX29wcy0+c3luY19zaW5nbGVfZm9yX2NwdSkKKwkJZG1hX29wcy0+c3luY19zaW5nbGVfZm9yX2NwdShod2RldiwgZG1hX2hhbmRsZSwgc2l6ZSwKKwkJCQkJICAgICBkaXJlY3Rpb24pOworCWZsdXNoX3dyaXRlX2J1ZmZlcnMoKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGRtYV9jYWNoZV9zeW5jKHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQorc3RhdGljIGlubGluZSB2b2lkCitkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAorCQkJICAgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCit7CisJaWYgKGRtYV9vcHMtPnN5bmNfc2luZ2xlX2Zvcl9kZXZpY2UpCisJCWRtYV9vcHMtPnN5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoaHdkZXYsIGRtYV9oYW5kbGUsIHNpemUsCisJCQkJCQlkaXJlY3Rpb24pOworCWZsdXNoX3dyaXRlX2J1ZmZlcnMoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQoreworCWlmIChkbWFfb3BzLT5zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1KSB7CisJCWRtYV9vcHMtPnN5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUoaHdkZXYsIGRtYV9oYW5kbGUsIG9mZnNldCwgc2l6ZSwgZGlyZWN0aW9uKTsKKwl9CisKKwlmbHVzaF93cml0ZV9idWZmZXJzKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKKwkJCQkgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQoreworCWlmIChkbWFfb3BzLT5zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKQorCQlkbWFfb3BzLT5zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKGh3ZGV2LCBkbWFfaGFuZGxlLAorCQkJCQkJICAgICAgb2Zmc2V0LCBzaXplLCBkaXJlY3Rpb24pOworCisJZmx1c2hfd3JpdGVfYnVmZmVycygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2RtYV9zeW5jX3NnX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCSAgICBpbnQgbmVsZW1zLCBpbnQgZGlyZWN0aW9uKQoreworCWlmIChkbWFfb3BzLT5zeW5jX3NnX2Zvcl9jcHUpCisJCWRtYV9vcHMtPnN5bmNfc2dfZm9yX2NwdShod2Rldiwgc2csIG5lbGVtcywgZGlyZWN0aW9uKTsKKwlmbHVzaF93cml0ZV9idWZmZXJzKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZG1hX3N5bmNfc2dfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJICAgICAgIGludCBuZWxlbXMsIGludCBkaXJlY3Rpb24pCit7CisJaWYgKGRtYV9vcHMtPnN5bmNfc2dfZm9yX2RldmljZSkgeworCQlkbWFfb3BzLT5zeW5jX3NnX2Zvcl9kZXZpY2UoaHdkZXYsIHNnLCBuZWxlbXMsIGRpcmVjdGlvbik7CisJfQorCisJZmx1c2hfd3JpdGVfYnVmZmVycygpOworfQorCitzdGF0aWMgaW5saW5lIGludAorZG1hX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLCBpbnQgZGlyZWN0aW9uKQoreworCXJldHVybiBkbWFfb3BzLT5tYXBfc2coaHdkZXYsIHNnLCBuZW50cywgZGlyZWN0aW9uKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitkbWFfdW5tYXBfc2coc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKKwkgICAgIGludCBkaXJlY3Rpb24pCit7CisJZG1hX29wcy0+dW5tYXBfc2coaHdkZXYsIHNnLCBuZW50cywgZGlyZWN0aW9uKTsKK30KKworZXh0ZXJuIGludCBkbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB1NjQgbWFzayk7CisKKy8qIHNhbWUgZm9yIGdhcnQsIHN3aW90bGIsIGFuZCBub21tdSAqLworc3RhdGljIGlubGluZSBpbnQgZG1hX2dldF9jYWNoZV9hbGlnbm1lbnQodm9pZCkKK3sKKwlyZXR1cm4gYm9vdF9jcHVfZGF0YS54ODZfY2xmbHVzaF9zaXplOworfQorCisjZGVmaW5lIGRtYV9pc19jb25zaXN0ZW50KGgpIDEKKworZXh0ZXJuIGludCBkbWFfc2V0X21hc2soc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzayk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZG1hX2NhY2hlX3N5bmModm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7CiAJZmx1c2hfd3JpdGVfYnVmZmVycygpOwogfQogCi0jZW5kaWYKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlIGZhbGxiYWNrX2RldjsKK2V4dGVybiBpbnQgcGFuaWNfb25fb3ZlcmZsb3c7CisKKyNlbmRpZiAvKiBfWDg2NjRfRE1BX01BUFBJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2R3YXJmMi5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2R3YXJmMi5oCmluZGV4IDU4Mjc1N2YuLjA3NjU0YmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9kd2FyZjIuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvZHdhcmYyLmgKQEAgLTE0LDcgKzE0LDcgQEAKICAgIGF3YXkgZm9yIG9sZGVyIHZlcnNpb24uIAogICovCiAKLSNpZmRlZiBDT05GSUdfREVCVUdfSU5GTworI2lmZGVmIENPTkZJR19VTldJTkRfSU5GTwogCiAjZGVmaW5lIENGSV9TVEFSVFBST0MgLmNmaV9zdGFydHByb2MKICNkZWZpbmUgQ0ZJX0VORFBST0MgLmNmaV9lbmRwcm9jCkBAIC0yOCw2ICsyOCw3IEBACiAjZGVmaW5lIENGSV9SRVNUT1JFIC5jZmlfcmVzdG9yZQogI2RlZmluZSBDRklfUkVNRU1CRVJfU1RBVEUgLmNmaV9yZW1lbWJlcl9zdGF0ZQogI2RlZmluZSBDRklfUkVTVE9SRV9TVEFURSAuY2ZpX3Jlc3RvcmVfc3RhdGUKKyNkZWZpbmUgQ0ZJX1VOREVGSU5FRCAuY2ZpX3VuZGVmaW5lZAogCiAjZWxzZQogCkBAIC00NCw2ICs0NSw3IEBACiAjZGVmaW5lIENGSV9SRVNUT1JFCSMKICNkZWZpbmUgQ0ZJX1JFTUVNQkVSX1NUQVRFCSMKICNkZWZpbmUgQ0ZJX1JFU1RPUkVfU1RBVEUJIworI2RlZmluZSBDRklfVU5ERUZJTkVECSMKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9lODIwLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvZTgyMC5oCmluZGV4IGU2ODJlZGMuLjhkY2MzMjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9lODIwLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2U4MjAuaApAQCAtNTUsNiArNTUsNyBAQAogCQkJCSAgICB1bnNpZ25lZCBsb25nIGVuZF9wZm4pOwogCiBleHRlcm4gdm9pZCBfX2luaXQgcGFyc2VfbWVtb3B0KGNoYXIgKnAsIGNoYXIgKiplbmQpOworZXh0ZXJuIHZvaWQgX19pbml0IHBhcnNlX21lbW1hcG9wdChjaGFyICpwLCBjaGFyICoqZW5kKTsKIAogZXh0ZXJuIHN0cnVjdCBlODIwbWFwIGU4MjA7CiAjZW5kaWYvKiFfX0FTU0VNQkxZX18qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2VkYWMuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9lZGFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FkMWNkNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9lZGFjLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBBU01fRURBQ19ICisjZGVmaW5lIEFTTV9FREFDX0gKKworLyogRUNDIGF0b21pYywgRE1BLCBTTVAgYW5kIGludGVycnVwdCBzYWZlIHNjcnViIGZ1bmN0aW9uICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX3NjcnViKHZvaWQgKnZhLCB1MzIgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgKnZpcnRfYWRkciA9IHZhOworCXUzMiBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemUgLyA0OyBpKyssIHZpcnRfYWRkcisrKQorCQkvKiBWZXJ5IGNhcmVmdWxseSByZWFkIGFuZCB3cml0ZSB0byBtZW1vcnkgYXRvbWljYWxseQorCQkgKiBzbyB3ZSBhcmUgaW50ZXJydXB0LCBETUEgYW5kIFNNUCBzYWZlLgorCQkgKi8KKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oImxvY2s7IGFkZGwgJDAsICUwIjo6Im0iKCp2aXJ0X2FkZHIpKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvZml4bWFwLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvZml4bWFwLmgKaW5kZXggYTU4MmNmYy4uN2IyODZiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2ZpeG1hcC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9maXhtYXAuaApAQCAtNzYsNyArNzYsNyBAQAogICogZGlyZWN0bHkgd2l0aG91dCB0cmFuc2xhdGlvbiwgd2UgY2F0Y2ggdGhlIGJ1ZyB3aXRoIGEgTlVMTC1kZWZlcmVuY2UKICAqIGtlcm5lbCBvb3BzLiBJbGxlZ2FsIHJhbmdlcyBvZiBpbmNvbWluZyBpbmRpY2VzIGFyZSBjYXVnaHQgdG9vLgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZml4X3RvX3ZpcnQoY29uc3QgdW5zaWduZWQgaW50IGlkeCkKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgbG9uZyBmaXhfdG9fdmlydChjb25zdCB1bnNpZ25lZCBpbnQgaWR4KQogewogCS8qCiAJICogdGhpcyBicmFuY2ggZ2V0cyBjb21wbGV0ZWx5IGVsaW1pbmF0ZWQgYWZ0ZXIgaW5saW5pbmcsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvZ2FydC1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvZ2FydC1tYXBwaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhNDk3YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9nYXJ0LW1hcHBpbmcuaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIF9YODY2NF9HQVJUX01BUFBJTkdfSAorI2RlZmluZSBfWDg2NjRfR0FSVF9NQVBQSU5HX0ggMQorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworc3RydWN0IGRldmljZTsKKworZXh0ZXJuIHZvaWQqCitnYXJ0X2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisgICAgICAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGdmcCk7CisKK2V4dGVybiBpbnQKK2dhcnRfZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpod2RldiwgdTY0IG1hc2spOworCisjZW5kaWYgLyogX1g4NjY0X0dBUlRfTUFQUElOR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvaHdfaXJxLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvaHdfaXJxLmgKaW5kZXggYzE0YThjNy4uMGRmMTcxNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2h3X2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9od19pcnEuaApAQCAtNDYsMTggKzQ2LDE4IEBACiAgKiAgc29tZSBvZiB0aGUgZm9sbG93aW5nIHZlY3RvcnMgYXJlICdyYXJlJywgdGhleSBhcmUgbWVyZ2VkCiAgKiAgaW50byBhIHNpbmdsZSB2ZWN0b3IgKENBTExfRlVOQ1RJT05fVkVDVE9SKSB0byBzYXZlIHZlY3RvciBzcGFjZS4KICAqICBUTEIsIHJlc2NoZWR1bGUgYW5kIGxvY2FsIEFQSUMgdmVjdG9ycyBhcmUgcGVyZm9ybWFuY2UtY3JpdGljYWwuCi0gKgotICogIFZlY3RvcnMgMHhmMC0weGY5IGFyZSBmcmVlIChyZXNlcnZlZCBmb3IgZnV0dXJlIExpbnV4IHVzZSkuCiAgKi8KICNkZWZpbmUgU1BVUklPVVNfQVBJQ19WRUNUT1IJMHhmZgogI2RlZmluZSBFUlJPUl9BUElDX1ZFQ1RPUgkweGZlCiAjZGVmaW5lIFJFU0NIRURVTEVfVkVDVE9SCTB4ZmQKICNkZWZpbmUgQ0FMTF9GVU5DVElPTl9WRUNUT1IJMHhmYwotI2RlZmluZSBLREJfVkVDVE9SCQkweGZiCS8qIHJlc2VydmVkIGZvciBLREIgKi8KKy8qIGZiIGZyZWUgLSBwbGVhc2UgZG9uJ3QgcmVhZGQgS0RCIGhlcmUgYmVjYXVzZSBpdCdzIHVzZWxlc3MKKyAgIChoaW50IC0gdGhpbmsgd2hhdCBhIE5NSSBiaXQgZG9lcyB0byBhIHZlY3RvcikgKi8KICNkZWZpbmUgVEhFUk1BTF9BUElDX1ZFQ1RPUgkweGZhCiAjZGVmaW5lIFRIUkVTSE9MRF9BUElDX1ZFQ1RPUiAgIDB4ZjkKLSNkZWZpbmUgSU5WQUxJREFURV9UTEJfVkVDVE9SX0VORAkweGY4Ci0jZGVmaW5lIElOVkFMSURBVEVfVExCX1ZFQ1RPUl9TVEFSVAkweGYwCS8qIGYwLWY4IHVzZWQgZm9yIFRMQiBmbHVzaCAqLworLyogZjggZnJlZSAqLworI2RlZmluZSBJTlZBTElEQVRFX1RMQl9WRUNUT1JfRU5ECTB4ZjcKKyNkZWZpbmUgSU5WQUxJREFURV9UTEJfVkVDVE9SX1NUQVJUCTB4ZjAJLyogZjAtZjcgdXNlZCBmb3IgVExCIGZsdXNoICovCiAKICNkZWZpbmUgTlVNX0lOVkFMSURBVEVfVExCX1ZFQ1RPUlMJOAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvaTM4Ny5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2kzODcuaAppbmRleCBhYTM5Y2ZkLi44NzZlYjlhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvaTM4Ny5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pMzg3LmgKQEAgLTMwLDcgKzMwLDcgQEAKICAqLwogCiAjZGVmaW5lIHVubGF6eV9mcHUodHNrKSBkbyB7IFwKLQlpZiAoKHRzayktPnRocmVhZF9pbmZvLT5zdGF0dXMgJiBUU19VU0VERlBVKSBcCisJaWYgKHRhc2tfdGhyZWFkX2luZm8odHNrKS0+c3RhdHVzICYgVFNfVVNFREZQVSkgXAogCQlzYXZlX2luaXRfZnB1KHRzayk7IFwKIH0gd2hpbGUgKDApCiAKQEAgLTQ2LDkgKzQ2LDkgQEAKIH0KIAogI2RlZmluZSBjbGVhcl9mcHUodHNrKSBkbyB7IFwKLQlpZiAoKHRzayktPnRocmVhZF9pbmZvLT5zdGF0dXMgJiBUU19VU0VERlBVKSB7CQlcCisJaWYgKHRhc2tfdGhyZWFkX2luZm8odHNrKS0+c3RhdHVzICYgVFNfVVNFREZQVSkgewlcCiAJCXRvbGVyYW50X2Z3YWl0KCk7CQkJCVwKLQkJKHRzayktPnRocmVhZF9pbmZvLT5zdGF0dXMgJj0gflRTX1VTRURGUFU7CVwKKwkJdGFza190aHJlYWRfaW5mbyh0c2spLT5zdGF0dXMgJj0gflRTX1VTRURGUFU7CVwKIAkJc3R0cygpOwkJCQkJCVwKIAl9CQkJCQkJCVwKIH0gd2hpbGUgKDApCkBAIC03NSw3ICs3NSw4IEBACiBzdGF0aWMgaW5saW5lIGludCByZXN0b3JlX2ZwdV9jaGVja2luZyhzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0ICpmeCkgCiB7IAogCWludCBlcnI7Ci0JYXNtIHZvbGF0aWxlKCIxOiAgcmV4NjQgOyBmeHJzdG9yICglW2Z4XSlcblx0IgorCisJYXNtIHZvbGF0aWxlKCIxOiAgcmV4NjQvZnhyc3RvciAoJVtmeF0pXG5cdCIKIAkJICAgICAiMjpcbiIKIAkJICAgICAiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgogCQkgICAgICIzOiAgbW92bCAkLTEsJVtlcnJdXG4iCkBAIC04Niw3ICs4NywxMSBAQAogCQkgICAgICIgICAucXVhZCAgMWIsM2JcbiIKIAkJICAgICAiLnByZXZpb3VzIgogCQkgICAgIDogW2Vycl0gIj1yIiAoZXJyKQotCQkgICAgIDogW2Z4XSAiciIgKGZ4KSwgIjAiICgwKSk7IAorI2lmIDAgLyogU2VlIGNvbW1lbnQgaW4gX19meHNhdmVfY2xlYXIoKSBiZWxvdy4gKi8KKwkJICAgICA6IFtmeF0gInIiIChmeCksICJtIiAoKmZ4KSwgIjAiICgwKSk7CisjZWxzZQorCQkgICAgIDogW2Z4XSAiY2RhU0RiIiAoZngpLCAibSIgKCpmeCksICIwIiAoMCkpOworI2VuZGlmCiAJaWYgKHVubGlrZWx5KGVycikpCiAJCWluaXRfZnB1KGN1cnJlbnQpOwogCXJldHVybiBlcnI7CkBAIC05NSw3ICsxMDAsOCBAQAogc3RhdGljIGlubGluZSBpbnQgc2F2ZV9pMzg3X2NoZWNraW5nKHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QgX191c2VyICpmeCkgCiB7IAogCWludCBlcnI7Ci0JYXNtIHZvbGF0aWxlKCIxOiAgcmV4NjQgOyBmeHNhdmUgKCVbZnhdKVxuXHQiCisKKwlhc20gdm9sYXRpbGUoIjE6ICByZXg2NC9meHNhdmUgKCVbZnhdKVxuXHQiCiAJCSAgICAgIjI6XG4iCiAJCSAgICAgIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIKIAkJICAgICAiMzogIG1vdmwgJC0xLCVbZXJyXVxuIgpAQCAtMTA1LDIwICsxMTEsNTMgQEAKIAkJICAgICAiICAgLmFsaWduIDhcbiIKIAkJICAgICAiICAgLnF1YWQgIDFiLDNiXG4iCiAJCSAgICAgIi5wcmV2aW91cyIKLQkJICAgICA6IFtlcnJdICI9ciIgKGVycikKLQkJICAgICA6IFtmeF0gInIiIChmeCksICIwIiAoMCkpOyAKKwkJICAgICA6IFtlcnJdICI9ciIgKGVyciksICI9bSIgKCpmeCkKKyNpZiAwIC8qIFNlZSBjb21tZW50IGluIF9fZnhzYXZlX2NsZWFyKCkgYmVsb3cuICovCisJCSAgICAgOiBbZnhdICJyIiAoZngpLCAiMCIgKDApKTsKKyNlbHNlCisJCSAgICAgOiBbZnhdICJjZGFTRGIiIChmeCksICIwIiAoMCkpOworI2VuZGlmCiAJaWYgKHVubGlrZWx5KGVycikpCiAJCV9fY2xlYXJfdXNlcihmeCwgc2l6ZW9mKHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QpKTsKIAlyZXR1cm4gZXJyOwogfSAKIAorc3RhdGljIGlubGluZSB2b2lkIF9fZnhzYXZlX2NsZWFyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCS8qIFVzaW5nICJyZXg2NDsgZnhzYXZlICUwIiBpcyBicm9rZW4gYmVjYXVzZSwgaWYgdGhlIG1lbW9yeSBvcGVyYW5kCisJICAgdXNlcyBhbnkgZXh0ZW5kZWQgcmVnaXN0ZXJzIGZvciBhZGRyZXNzaW5nLCBhIHNlY29uZCBSRVggcHJlZml4CisJICAgd2lsbCBiZSBnZW5lcmF0ZWQgKHRvIHRoZSBhc3NlbWJsZXIsIHJleDY0IGZvbGxvd2VkIGJ5IHNlbWljb2xvbgorCSAgIGlzIGEgc2VwYXJhdGUgaW5zdHJ1Y3Rpb24pLCBhbmQgaGVuY2UgdGhlIDY0LWJpdG5lc3MgaXMgbG9zdC4gKi8KKyNpZiAwCisJLyogVXNpbmcgImZ4c2F2ZXEgJTAiIHdvdWxkIGJlIHRoZSBpZGVhbCBjaG9pY2UsIGJ1dCBpcyBvbmx5IHN1cHBvcnRlZAorCSAgIHN0YXJ0aW5nIHdpdGggZ2FzIDIuMTYuICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18oImZ4c2F2ZXEgJTAiCisJCQkgICAgIDogIj1tIiAodHNrLT50aHJlYWQuaTM4Ny5meHNhdmUpKTsKKyNlbGlmIDAKKwkvKiBVc2luZywgYXMgYSB3b3JrYXJvdW5kLCB0aGUgcHJvcGVybHkgcHJlZml4ZWQgZm9ybSBiZWxvdyBpc24ndAorCSAgIGFjY2VwdGVkIGJ5IGFueSBiaW51dGlscyB2ZXJzaW9uIHNvIGZhciByZWxlYXNlZCwgY29tcGxhaW5pbmcgdGhhdAorCSAgIHRoZSBzYW1lIHR5cGUgb2YgcHJlZml4IGlzIHVzZWQgdHdpY2UgaWYgYW4gZXh0ZW5kZWQgcmVnaXN0ZXIgaXMKKwkgICBuZWVkZWQgZm9yIGFkZHJlc3NpbmcgKGZpeCBzdWJtaXR0ZWQgdG8gbWFpbmxpbmUgMjAwNS0xMS0yMSkuICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18oInJleDY0L2Z4c2F2ZSAlMCIKKwkJCSAgICAgOiAiPW0iICh0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZSkpOworI2Vsc2UKKwkvKiBUaGlzLCBob3dldmVyLCB3ZSBjYW4gd29yayBhcm91bmQgYnkgZm9yY2luZyB0aGUgY29tcGlsZXIgdG8gc2VsZWN0CisJICAgYW4gYWRkcmVzc2luZyBtb2RlIHRoYXQgZG9lc24ndCByZXF1aXJlIGV4dGVuZGVkIHJlZ2lzdGVycy4gKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygicmV4NjQvZnhzYXZlICVQMiglMSkiCisJCQkgICAgIDogIj1tIiAodHNrLT50aHJlYWQuaTM4Ny5meHNhdmUpCisJCQkgICAgIDogImNkYVNEYiIgKHRzayksCisJCQkJImkiIChvZmZzZXRvZihfX3R5cGVvZl9fKCp0c2spLAorCQkJCQkgICAgICB0aHJlYWQuaTM4Ny5meHNhdmUpKSk7CisjZW5kaWYKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiZm5jbGV4Iik7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBrZXJuZWxfZnB1X2JlZ2luKHZvaWQpCiB7CiAJc3RydWN0IHRocmVhZF9pbmZvICptZSA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKTsKIAlwcmVlbXB0X2Rpc2FibGUoKTsKLQlpZiAobWUtPnN0YXR1cyAmIFRTX1VTRURGUFUpIHsgCi0JCWFzbSB2b2xhdGlsZSgicmV4NjQgOyBmeHNhdmUgJTAgOyBmbmNsZXgiCi0JCQkgICAgICA6ICI9bSIgKG1lLT50YXNrLT50aHJlYWQuaTM4Ny5meHNhdmUpKTsKKwlpZiAobWUtPnN0YXR1cyAmIFRTX1VTRURGUFUpIHsKKwkJX19meHNhdmVfY2xlYXIobWUtPnRhc2spOwogCQltZS0+c3RhdHVzICY9IH5UU19VU0VERlBVOwogCQlyZXR1cm47CiAJfQpAQCAtMTMxLDExICsxNzAsMTAgQEAKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9pbml0X2ZwdSggc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgKQorc3RhdGljIGlubGluZSB2b2lkIHNhdmVfaW5pdF9mcHUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7Ci0JYXNtIHZvbGF0aWxlKCAicmV4NjQgOyBmeHNhdmUgJTAgOyBmbmNsZXgiCi0JCSAgICAgIDogIj1tIiAodHNrLT50aHJlYWQuaTM4Ny5meHNhdmUpKTsKLQl0c2stPnRocmVhZF9pbmZvLT5zdGF0dXMgJj0gflRTX1VTRURGUFU7CisgCV9fZnhzYXZlX2NsZWFyKHRzayk7CisJdGFza190aHJlYWRfaW5mbyh0c2spLT5zdGF0dXMgJj0gflRTX1VTRURGUFU7CiAJc3R0cygpOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvaWEzMi5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2lhMzIuaAppbmRleCBjN2JjOWMwLi5lNmI3ZjIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvaWEzMi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pYTMyLmgKQEAgLTE2OSw2ICsxNjksOCBAQAogc3RydWN0IGxpbnV4X2JpbnBybTsKIGV4dGVybiBpbnQgaWEzMl9zZXR1cF9hcmdfcGFnZXMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwKIAkJCQl1bnNpZ25lZCBsb25nIHN0YWNrX3RvcCwgaW50IGV4ZWNfc3RhY2spOworc3RydWN0IG1tX3N0cnVjdDsKK2V4dGVybiB2b2lkIGlhMzJfcGlja19tbWFwX2xheW91dChzdHJ1Y3QgbW1fc3RydWN0ICptbSk7CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvaWEzMl91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pYTMyX3VuaXN0ZC5oCmluZGV4IGQ1MTY2ZWMuLmU4N2NkODNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvaWEzMl91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvaWEzMl91bmlzdGQuaApAQCAtMjk5LDcgKzI5OSwyMSBAQAogI2RlZmluZSBfX05SX2lhMzJfaW5vdGlmeV9pbml0CQkyOTEKICNkZWZpbmUgX19OUl9pYTMyX2lub3RpZnlfYWRkX3dhdGNoCTI5MgogI2RlZmluZSBfX05SX2lhMzJfaW5vdGlmeV9ybV93YXRjaAkyOTMKKyNkZWZpbmUgX19OUl9pYTMyX21pZ3JhdGVfcGFnZXMJCTI5NAorI2RlZmluZSBfX05SX2lhMzJfb3BhbmF0CQkyOTUKKyNkZWZpbmUgX19OUl9pYTMyX21rZGlyYXQJCTI5NgorI2RlZmluZSBfX05SX2lhMzJfbWtub2RhdAkJMjk3CisjZGVmaW5lIF9fTlJfaWEzMl9mY2hvd25hdAkJMjk4CisjZGVmaW5lIF9fTlJfaWEzMl9mdXRpbWVzYXQJCTI5OQorI2RlZmluZSBfX05SX2lhMzJfbmV3ZnN0YXRhdAkJMzAwCisjZGVmaW5lIF9fTlJfaWEzMl91bmxpbmthdAkJMzAxCisjZGVmaW5lIF9fTlJfaWEzMl9yZW5hbWVhdAkJMzAyCisjZGVmaW5lIF9fTlJfaWEzMl9saW5rYXQJCTMwMworI2RlZmluZSBfX05SX2lhMzJfc3ltbGlua2F0CQkzMDQKKyNkZWZpbmUgX19OUl9pYTMyX3JlYWRsaW5rYXQJCTMwNQorI2RlZmluZSBfX05SX2lhMzJfZmNobW9kYXQJCTMwNgorI2RlZmluZSBfX05SX2lhMzJfZmFjY2Vzc2F0CQkzMDcKIAotI2RlZmluZSBJQTMyX05SX3N5c2NhbGxzIDI5NAkvKiBtdXN0IGJlID4gdGhhbiBiaWdnZXN0IHN5c2NhbGwhICovCisjZGVmaW5lIElBMzJfTlJfc3lzY2FsbHMgMzA4CS8qIG11c3QgYmUgPiB0aGFuIGJpZ2dlc3Qgc3lzY2FsbCEgKi8KIAogI2VuZGlmIC8qIF9BU01fWDg2XzY0X0lBMzJfVU5JU1REX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvaWRsZS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2lkbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmQ0N2RjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2lkbGUuaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIF9BU01fWDg2XzY0X0lETEVfSAorI2RlZmluZSBfQVNNX1g4Nl82NF9JRExFX0ggMQorCisjZGVmaW5lIElETEVfU1RBUlQgMQorI2RlZmluZSBJRExFX0VORCAyCisKK3N0cnVjdCBub3RpZmllcl9ibG9jazsKK3ZvaWQgaWRsZV9ub3RpZmllcl9yZWdpc3RlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm4pOwordm9pZCBpZGxlX25vdGlmaWVyX3VucmVnaXN0ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuKTsKKwordm9pZCBlbnRlcl9pZGxlKHZvaWQpOwordm9pZCBleGl0X2lkbGUodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2lvLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvaW8uaAppbmRleCA1MmZmMjY5Li45ZGFjMThkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2lvLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2lvLmgKQEAgLTE0Myw2ICsxNDMsMTEgQEAKIGV4dGVybiB2b2lkIF9faW9tZW0gKiBpb3JlbWFwX25vY2FjaGUgKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUpOwogZXh0ZXJuIHZvaWQgaW91bm1hcCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpOwogCisvKiBVc2Ugbm9ybWFsIElPIG1hcHBpbmdzIGZvciBETUkgKi8KKyNkZWZpbmUgZG1pX2lvcmVtYXAgaW9yZW1hcAorI2RlZmluZSBkbWlfaW91bm1hcCh4LGwpIGlvdW5tYXAoeCkKKyNkZWZpbmUgZG1pX2FsbG9jKGwpIGttYWxsb2MobCwgR0ZQX0FUT01JQykKKwogLyoKICAqIElTQSBJL08gYnVzIG1lbW9yeSBhZGRyZXNzZXMgYXJlIDE6MSB3aXRoIHRoZSBwaHlzaWNhbCBhZGRyZXNzLgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvaW9jdGwuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pb2N0bC5oCmluZGV4IDYwOWI2NjMuLmIyNzlmZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pb2N0bC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pb2N0bC5oCkBAIC0xLDc1ICsxIEBACi0vKiAkSWQ6IGlvY3RsLmgsdiAxLjIgMjAwMS8wNy8wNCAwOTowODoxMyBhayBFeHAgJAotICoKLSAqIGxpbnV4L2lvY3RsLmggZm9yIExpbnV4IGJ5IEguSC4gQmVyZ21hbi4KLSAqLwotCi0jaWZuZGVmIF9BU01YODY2NF9JT0NUTF9ICi0jZGVmaW5lIF9BU01YODY2NF9JT0NUTF9ICi0KLS8qIGlvY3RsIGNvbW1hbmQgZW5jb2Rpbmc6IDMyIGJpdHMgdG90YWwsIGNvbW1hbmQgaW4gbG93ZXIgMTYgYml0cywKLSAqIHNpemUgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgaW4gdGhlIGxvd2VyIDE0IGJpdHMgb2YgdGhlCi0gKiB1cHBlciAxNiBiaXRzLgotICogRW5jb2RpbmcgdGhlIHNpemUgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgaW4gdGhlIGlvY3RsIHJlcXVlc3QKLSAqIGlzIHVzZWZ1bCBmb3IgY2F0Y2hpbmcgcHJvZ3JhbXMgY29tcGlsZWQgd2l0aCBvbGQgdmVyc2lvbnMKLSAqIGFuZCB0byBhdm9pZCBvdmVyd3JpdGluZyB1c2VyIHNwYWNlIG91dHNpZGUgdGhlIHVzZXIgYnVmZmVyIGFyZWEuCi0gKiBUaGUgaGlnaGVzdCAyIGJpdHMgYXJlIHJlc2VydmVkIGZvciBpbmRpY2F0aW5nIHRoZSBgYGFjY2VzcyBtb2RlJycuCi0gKiBOT1RFOiBUaGlzIGxpbWl0cyB0aGUgbWF4IHBhcmFtZXRlciBzaXplIHRvIDE2a0IgLTEgIQotICovCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGlzIGZvciBjb21wYXRpYmlsaXR5IGFjcm9zcyB0aGUgdmFyaW91cyBMaW51eAotICogcGxhdGZvcm1zLiAgVGhlIGkzODYgaW9jdGwgbnVtYmVyaW5nIHNjaGVtZSBkb2Vzbid0IHJlYWxseSBlbmZvcmNlCi0gKiBhIHR5cGUgZmllbGQuICBEZSBmYWN0bywgaG93ZXZlciwgdGhlIHRvcCA4IGJpdHMgb2YgdGhlIGxvd2VyIDE2Ci0gKiBiaXRzIGFyZSBpbmRlZWQgdXNlZCBhcyBhIHR5cGUgZmllbGQsIHNvIHdlIG1pZ2h0IGp1c3QgYXMgd2VsbCBtYWtlCi0gKiB0aGlzIGV4cGxpY2l0IGhlcmUuICBQbGVhc2UgYmUgc3VyZSB0byB1c2UgdGhlIGRlY29kaW5nIG1hY3JvcwotICogYmVsb3cgZnJvbSBub3cgb24uCi0gKi8KLSNkZWZpbmUgX0lPQ19OUkJJVFMJOAotI2RlZmluZSBfSU9DX1RZUEVCSVRTCTgKLSNkZWZpbmUgX0lPQ19TSVpFQklUUwkxNAotI2RlZmluZSBfSU9DX0RJUkJJVFMJMgotCi0jZGVmaW5lIF9JT0NfTlJNQVNLCSgoMSA8PCBfSU9DX05SQklUUyktMSkKLSNkZWZpbmUgX0lPQ19UWVBFTUFTSwkoKDEgPDwgX0lPQ19UWVBFQklUUyktMSkKLSNkZWZpbmUgX0lPQ19TSVpFTUFTSwkoKDEgPDwgX0lPQ19TSVpFQklUUyktMSkKLSNkZWZpbmUgX0lPQ19ESVJNQVNLCSgoMSA8PCBfSU9DX0RJUkJJVFMpLTEpCi0KLSNkZWZpbmUgX0lPQ19OUlNISUZUCTAKLSNkZWZpbmUgX0lPQ19UWVBFU0hJRlQJKF9JT0NfTlJTSElGVCtfSU9DX05SQklUUykKLSNkZWZpbmUgX0lPQ19TSVpFU0hJRlQJKF9JT0NfVFlQRVNISUZUK19JT0NfVFlQRUJJVFMpCi0jZGVmaW5lIF9JT0NfRElSU0hJRlQJKF9JT0NfU0laRVNISUZUK19JT0NfU0laRUJJVFMpCi0KLS8qCi0gKiBEaXJlY3Rpb24gYml0cy4KLSAqLwotI2RlZmluZSBfSU9DX05PTkUJMFUKLSNkZWZpbmUgX0lPQ19XUklURQkxVQotI2RlZmluZSBfSU9DX1JFQUQJMlUKLQotI2RlZmluZSBfSU9DKGRpcix0eXBlLG5yLHNpemUpIFwKLQkoKChkaXIpICA8PCBfSU9DX0RJUlNISUZUKSB8IFwKLQkgKCh0eXBlKSA8PCBfSU9DX1RZUEVTSElGVCkgfCBcCi0JICgobnIpICAgPDwgX0lPQ19OUlNISUZUKSB8IFwKLQkgKChzaXplKSA8PCBfSU9DX1NJWkVTSElGVCkpCi0KLS8qIHVzZWQgdG8gY3JlYXRlIG51bWJlcnMgKi8KLSNkZWZpbmUgX0lPKHR5cGUsbnIpCQlfSU9DKF9JT0NfTk9ORSwodHlwZSksKG5yKSwwKQotI2RlZmluZSBfSU9SKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1JFQUQsKHR5cGUpLChuciksc2l6ZW9mKHNpemUpKQotI2RlZmluZSBfSU9XKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1dSSVRFLCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKLSNkZWZpbmUgX0lPV1IodHlwZSxucixzaXplKQlfSU9DKF9JT0NfUkVBRHxfSU9DX1dSSVRFLCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKLQotLyogdXNlZCB0byBkZWNvZGUgaW9jdGwgbnVtYmVycy4uICovCi0jZGVmaW5lIF9JT0NfRElSKG5yKQkJKCgobnIpID4+IF9JT0NfRElSU0hJRlQpICYgX0lPQ19ESVJNQVNLKQotI2RlZmluZSBfSU9DX1RZUEUobnIpCQkoKChucikgPj4gX0lPQ19UWVBFU0hJRlQpICYgX0lPQ19UWVBFTUFTSykKLSNkZWZpbmUgX0lPQ19OUihucikJCSgoKG5yKSA+PiBfSU9DX05SU0hJRlQpICYgX0lPQ19OUk1BU0spCi0jZGVmaW5lIF9JT0NfU0laRShucikJCSgoKG5yKSA+PiBfSU9DX1NJWkVTSElGVCkgJiBfSU9DX1NJWkVNQVNLKQotCi0vKiAuLi5hbmQgZm9yIHRoZSBkcml2ZXJzL3NvdW5kIGZpbGVzLi4uICovCi0KLSNkZWZpbmUgSU9DX0lOCQkoX0lPQ19XUklURSA8PCBfSU9DX0RJUlNISUZUKQotI2RlZmluZSBJT0NfT1VUCQkoX0lPQ19SRUFEIDw8IF9JT0NfRElSU0hJRlQpCi0jZGVmaW5lIElPQ19JTk9VVAkoKF9JT0NfV1JJVEV8X0lPQ19SRUFEKSA8PCBfSU9DX0RJUlNISUZUKQotI2RlZmluZSBJT0NTSVpFX01BU0sJKF9JT0NfU0laRU1BU0sgPDwgX0lPQ19TSVpFU0hJRlQpCi0jZGVmaW5lIElPQ1NJWkVfU0hJRlQJKF9JT0NfU0laRVNISUZUKQotCi0jZW5kaWYgLyogX0FTTVg4NjY0X0lPQ1RMX0ggKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pb2N0bC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2lwaS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2lwaS5oCmluZGV4IDAyMmU5ZDMuLjJhNWMxNjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pcGkuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvaXBpLmgKQEAgLTM4LDEwICszOCw2IEBACiAJCWljciB8PSBBUElDX0RNX0ZJWEVEIHwgdmVjdG9yOwogCQlicmVhazsKIAljYXNlIE5NSV9WRUNUT1I6Ci0JCS8qCi0JCSAqIFNldHVwIEtEQiBJUEkgdG8gYmUgZGVsaXZlcmVkIGFzIGFuIE5NSQotCQkgKi8KLQljYXNlIEtEQl9WRUNUT1I6CiAJCWljciB8PSBBUElDX0RNX05NSTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2lycS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2lycS5oCmluZGV4IGZiNzI0YmEuLjlkYjVhMWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvaXJxLmgKQEAgLTM2LDcgKzM2LDcgQEAKICNkZWZpbmUgTlJfSVJRX1ZFQ1RPUlMgTlJfSVJRUwogI2Vsc2UKICNkZWZpbmUgTlJfSVJRUyAyMjQKLSNkZWZpbmUgTlJfSVJRX1ZFQ1RPUlMgMTAyNAorI2RlZmluZSBOUl9JUlFfVkVDVE9SUyAoMzIgKiBOUl9DUFVTKQogI2VuZGlmCiAKIHN0YXRpYyBfX2lubGluZV9fIGludCBpcnFfY2Fub25pY2FsaXplKGludCBpcnEpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQva2RlYnVnLmggYi9pbmNsdWRlL2FzbS14ODZfNjQva2RlYnVnLmgKaW5kZXggZjYwNGU4NC4uYjllZDRjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2tkZWJ1Zy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9rZGVidWcuaApAQCAtMzUsOSArMzUsMTYgQEAKIAlESUVfUEFHRV9GQVVMVCwKIH07IAogCQotc3RhdGljIGlubGluZSBpbnQgbm90aWZ5X2RpZShlbnVtIGRpZV92YWwgdmFsLGNoYXIgKnN0cixzdHJ1Y3QgcHRfcmVncyAqcmVncyxsb25nIGVycixpbnQgdHJhcCwgaW50IHNpZykKLXsgCi0Jc3RydWN0IGRpZV9hcmdzIGFyZ3MgPSB7IC5yZWdzPXJlZ3MsIC5zdHI9c3RyLCAuZXJyPWVyciwgLnRyYXBucj10cmFwLC5zaWducj1zaWcgfTsgCitzdGF0aWMgaW5saW5lIGludCBub3RpZnlfZGllKGVudW0gZGllX3ZhbCB2YWwsIGNvbnN0IGNoYXIgKnN0ciwKKwkJCXN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVyciwgaW50IHRyYXAsIGludCBzaWcpCit7CisJc3RydWN0IGRpZV9hcmdzIGFyZ3MgPSB7CisJCS5yZWdzID0gcmVncywKKwkJLnN0ciA9IHN0ciwKKwkJLmVyciA9IGVyciwKKwkJLnRyYXBuciA9IHRyYXAsCisJCS5zaWduciA9IHNpZworCX07CiAJcmV0dXJuIG5vdGlmaWVyX2NhbGxfY2hhaW4oJmRpZV9jaGFpbiwgdmFsLCAmYXJncyk7IAogfSAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2tleGVjLmggYi9pbmNsdWRlL2FzbS14ODZfNjQva2V4ZWMuaAppbmRleCA0MmQyZmYxLi5hZTI4Y2Q0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQva2V4ZWMuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQva2V4ZWMuaApAQCAtMyw2ICszLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCiAvKgogICogS0VYRUNfU09VUkNFX01FTU9SWV9MSU1JVCBtYXhpbXVtIHBhZ2UgZ2V0X2ZyZWVfcGFnZSBjYW4gcmV0dXJuLgpAQCAtMjYsOCArMjcsNDAgQEAKICNkZWZpbmUgS0VYRUNfQVJDSCBLRVhFQ19BUkNIX1g4Nl82NAogCiAjZGVmaW5lIE1BWF9OT1RFX0JZVEVTIDEwMjQKLXR5cGVkZWYgdTMyIG5vdGVfYnVmX3RbTUFYX05PVEVfQllURVMvNF07CiAKLWV4dGVybiBub3RlX2J1Zl90IGNyYXNoX25vdGVzW107CisvKgorICogU2F2aW5nIHRoZSByZWdpc3RlcnMgb2YgdGhlIGNwdSBvbiB3aGljaCBwYW5pYyBvY2N1cmVkIGluCisgKiBjcmFzaF9rZXhlYyB0byBzYXZlIGEgdmFsaWQgc3AuIFRoZSByZWdpc3RlcnMgb2Ygb3RoZXIgY3B1cworICogd2lsbCBiZSBzYXZlZCBpbiBtYWNoaW5lX2NyYXNoX3NodXRkb3duIHdoaWxlIHNob290aW5nIGRvd24gdGhlbS4KKyAqLwogCitzdGF0aWMgaW5saW5lIHZvaWQgY3Jhc2hfc2V0dXBfcmVncyhzdHJ1Y3QgcHRfcmVncyAqbmV3cmVncywKKwkJCQkJCXN0cnVjdCBwdF9yZWdzICpvbGRyZWdzKQoreworCWlmIChvbGRyZWdzKQorCQltZW1jcHkobmV3cmVncywgb2xkcmVncywgc2l6ZW9mKCpuZXdyZWdzKSk7CisJZWxzZSB7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZxICUlcmJ4LCUwIiA6ICI9bSIobmV3cmVncy0+cmJ4KSk7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZxICUlcmN4LCUwIiA6ICI9bSIobmV3cmVncy0+cmN4KSk7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZxICUlcmR4LCUwIiA6ICI9bSIobmV3cmVncy0+cmR4KSk7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZxICUlcnNpLCUwIiA6ICI9bSIobmV3cmVncy0+cnNpKSk7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZxICUlcmRpLCUwIiA6ICI9bSIobmV3cmVncy0+cmRpKSk7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZxICUlcmJwLCUwIiA6ICI9bSIobmV3cmVncy0+cmJwKSk7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZxICUlcmF4LCUwIiA6ICI9bSIobmV3cmVncy0+cmF4KSk7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZxICUlcnNwLCUwIiA6ICI9bSIobmV3cmVncy0+cnNwKSk7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZxICUlcjgsJTAiIDogIj1tIihuZXdyZWdzLT5yOCkpOworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92cSAlJXI5LCUwIiA6ICI9bSIobmV3cmVncy0+cjkpKTsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdnEgJSVyMTAsJTAiIDogIj1tIihuZXdyZWdzLT5yMTApKTsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdnEgJSVyMTEsJTAiIDogIj1tIihuZXdyZWdzLT5yMTEpKTsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdnEgJSVyMTIsJTAiIDogIj1tIihuZXdyZWdzLT5yMTIpKTsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdnEgJSVyMTMsJTAiIDogIj1tIihuZXdyZWdzLT5yMTMpKTsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdnEgJSVyMTQsJTAiIDogIj1tIihuZXdyZWdzLT5yMTQpKTsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdnEgJSVyMTUsJTAiIDogIj1tIihuZXdyZWdzLT5yMTUpKTsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJSVzcywgJSVlYXg7IiA6Ij1hIihuZXdyZWdzLT5zcykpOworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92bCAlJWNzLCAlJWVheDsiIDoiPWEiKG5ld3JlZ3MtPmNzKSk7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKCJwdXNoZnE7IHBvcHEgJTAiIDoiPW0iKG5ld3JlZ3MtPmVmbGFncykpOworCisJCW5ld3JlZ3MtPnJpcCA9ICh1bnNpZ25lZCBsb25nKWN1cnJlbnRfdGV4dF9hZGRyKCk7CisJfQorfQogI2VuZGlmIC8qIF9YODZfNjRfS0VYRUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2twcm9iZXMuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9rcHJvYmVzLmgKaW5kZXggNGRkN2E3ZS4uOThhMWU5NWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9rcHJvYmVzLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2twcm9iZXMuaApAQCAtMjcsNyArMjcsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KIAorI2RlZmluZSAgX19BUkNIX1dBTlRfS1BST0JFU19JTlNOX1NMT1QKKwogc3RydWN0IHB0X3JlZ3M7CitzdHJ1Y3Qga3Byb2JlOwogCiB0eXBlZGVmIHU4IGtwcm9iZV9vcGNvZGVfdDsKICNkZWZpbmUgQlJFQUtQT0lOVF9JTlNUUlVDVElPTgkweGNjCkBAIC00Miw2ICs0NSw3IEBACiAjZGVmaW5lIEFSQ0hfU1VQUE9SVFNfS1JFVFBST0JFUwogCiB2b2lkIGtyZXRwcm9iZV90cmFtcG9saW5lKHZvaWQpOworZXh0ZXJuIHZvaWQgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApOwogCiAvKiBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgY29weSBvZiBvcmlnaW5hbCBpbnN0cnVjdGlvbiovCiBzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9tbXVfY29udGV4dC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L21tdV9jb250ZXh0LmgKaW5kZXggYjYzMGQ1Mi4uMTZlNGJlNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L21tdV9jb250ZXh0LmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L21tdV9jb250ZXh0LmgKQEAgLTE1LDE4ICsxNSwxMyBAQAogaW50IGluaXRfbmV3X2NvbnRleHQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKIHZvaWQgZGVzdHJveV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKIAotI2lmZGVmIENPTkZJR19TTVAKLQogc3RhdGljIGlubGluZSB2b2lkIGVudGVyX2xhenlfdGxiKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKKyNpZmRlZiBDT05GSUdfU01QCiAJaWYgKHJlYWRfcGRhKG1tdV9zdGF0ZSkgPT0gVExCU1RBVEVfT0spIAogCQl3cml0ZV9wZGEobW11X3N0YXRlLCBUTEJTVEFURV9MQVpZKTsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgZW50ZXJfbGF6eV90bGIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQotewotfQogI2VuZGlmCit9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsb2FkX2NyMyhwZ2RfdCAqcGdkKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L21tem9uZS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L21tem9uZS5oCmluZGV4IDY5YmFhYTguLjk3MmM5MzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9tbXpvbmUuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvbW16b25lLmgKQEAgLTM2LDIyICszNiwxMiBAQAogCQkJCSBOT0RFX0RBVEEobmlkKS0+bm9kZV9zcGFubmVkX3BhZ2VzKQogCiAjaWZkZWYgQ09ORklHX0RJU0NPTlRJR01FTQotCiAjZGVmaW5lIHBmbl90b19uaWQocGZuKSBwaHlzX3RvX25pZCgodW5zaWduZWQgbG9uZykocGZuKSA8PCBQQUdFX1NISUZUKQogI2RlZmluZSBrdmFkZHJfdG9fbmlkKGthZGRyKQlwaHlzX3RvX25pZChfX3BhKGthZGRyKSkKIAotLyogUmVxdWlyZXMgcGZuX3ZhbGlkKHBmbikgdG8gYmUgdHJ1ZSAqLwotI2RlZmluZSBwZm5fdG9fcGFnZShwZm4pICh7IFwKLQlpbnQgbmlkID0gcGh5c190b19uaWQoKCh1bnNpZ25lZCBsb25nKShwZm4pKSA8PCBQQUdFX1NISUZUKTsgCVwKLQkoKHBmbikgLSBub2RlX3N0YXJ0X3BmbihuaWQpKSArIE5PREVfREFUQShuaWQpLT5ub2RlX21lbV9tYXA7CVwKLX0pCi0KLSNkZWZpbmUgcGFnZV90b19wZm4ocGFnZSkgXAotCShsb25nKSgoKHBhZ2UpIC0gcGFnZV96b25lKHBhZ2UpLT56b25lX21lbV9tYXApICsgcGFnZV96b25lKHBhZ2UpLT56b25lX3N0YXJ0X3BmbikKLQotI2RlZmluZSBwZm5fdmFsaWQocGZuKSAoKHBmbikgPj0gbnVtX3BoeXNwYWdlcyA/IDAgOiBcCi0JCQkoeyB1OCBuaWRfXyA9IHBmbl90b19uaWQocGZuKTsgXAotCQkJICAgbmlkX18gIT0gMHhmZiAmJiAocGZuKSA+PSBub2RlX3N0YXJ0X3BmbihuaWRfXykgJiYgKHBmbikgPCBub2RlX2VuZF9wZm4obmlkX18pOyB9KSkKK2V4dGVybiBzdHJ1Y3QgcGFnZSAqcGZuX3RvX3BhZ2UodW5zaWduZWQgbG9uZyBwZm4pOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGFnZV90b19wZm4oc3RydWN0IHBhZ2UgKnBhZ2UpOworZXh0ZXJuIGludCBwZm5fdmFsaWQodW5zaWduZWQgbG9uZyBwZm4pOwogI2VuZGlmCiAKICNkZWZpbmUgbG9jYWxfbWFwbnIoa3ZhZGRyKSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvbXBzcGVjLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvbXBzcGVjLmgKaW5kZXggMTAyNDhhOS4uMTRmYzNkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L21wc3BlYy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9tcHNwZWMuaApAQCAtMTg4LDcgKzE4OCw3IEBACiBleHRlcm4gdm9pZCBtcF9yZWdpc3Rlcl9pb2FwaWMgKHU4IGlkLCB1MzIgYWRkcmVzcywgdTMyIGdzaV9iYXNlKTsKIGV4dGVybiB2b2lkIG1wX292ZXJyaWRlX2xlZ2FjeV9pcnEgKHU4IGJ1c19pcnEsIHU4IHBvbGFyaXR5LCB1OCB0cmlnZ2VyLCB1MzIgZ3NpKTsKIGV4dGVybiB2b2lkIG1wX2NvbmZpZ19hY3BpX2xlZ2FjeV9pcnFzICh2b2lkKTsKLWV4dGVybiBpbnQgbXBfcmVnaXN0ZXJfZ3NpICh1MzIgZ3NpLCBpbnQgZWRnZV9sZXZlbCwgaW50IGFjdGl2ZV9oaWdoX2xvdyk7CitleHRlcm4gaW50IG1wX3JlZ2lzdGVyX2dzaSAodTMyIGdzaSwgaW50IHRyaWdnZXJpbmcsIGludCBwb2xhcml0eSk7CiAjZW5kaWYgLypDT05GSUdfWDg2X0lPX0FQSUMqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9tdXRleC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L211dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmYmVlMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9tdXRleC5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQXNzZW1ibHkgaW1wbGVtZW50YXRpb24gb2YgdGhlIG11dGV4IGZhc3RwYXRoLCBiYXNlZCBvbiBhdG9taWMKKyAqIGRlY3JlbWVudC9pbmNyZW1lbnQuCisgKgorICogc3RhcnRlZCBieSBJbmdvIE1vbG5hcjoKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2IFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPgorICovCisjaWZuZGVmIF9BU01fTVVURVhfSAorI2RlZmluZSBfQVNNX01VVEVYX0gKKworLyoqCisgKiBfX211dGV4X2Zhc3RwYXRoX2xvY2sgLSBkZWNyZW1lbnQgYW5kIGNhbGwgZnVuY3Rpb24gaWYgbmVnYXRpdmUKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqIEBmYWlsX2ZuOiBmdW5jdGlvbiB0byBjYWxsIGlmIHRoZSByZXN1bHQgaXMgbmVnYXRpdmUKKyAqCisgKiBBdG9taWNhbGx5IGRlY3JlbWVudHMgQHYgYW5kIGNhbGxzIDxmYWlsX2ZuPiBpZiB0aGUgcmVzdWx0IGlzIG5lZ2F0aXZlLgorICovCisjZGVmaW5lIF9fbXV0ZXhfZmFzdHBhdGhfbG9jayh2LCBmYWlsX2ZuKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgZHVtbXk7CQkJCQkJXAorCQkJCQkJCQkJXAorCXR5cGVjaGVjayhhdG9taWNfdCAqLCB2KTsJCQkJCVwKKwl0eXBlY2hlY2tfZm4oZmFzdGNhbGwgdm9pZCAoKikoYXRvbWljX3QgKiksIGZhaWxfZm4pOwkJXAorCQkJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKKwkJTE9DSwkiICAgZGVjbCAoJSVyZGkpCVxuIgkJCVwKKwkJCSIgICBqcyAyZgkJXG4iCQkJXAorCQkJIjE6CQkJXG4iCQkJXAorCQkJCQkJCQkJXAorCQlMT0NLX1NFQ1RJT05fU1RBUlQoIiIpCQkJCQlcCisJCQkiMjogY2FsbCAiI2ZhaWxfZm4iCVxuIgkJCVwKKwkJCSIgICBqbXAgMWIJCVxuIgkJCVwKKwkJTE9DS19TRUNUSU9OX0VORAkJCQkJXAorCQkJCQkJCQkJXAorCQk6Ij1EIiAoZHVtbXkpCQkJCQkJXAorCQk6ICJEIiAodikJCQkJCQlcCisJCTogInJheCIsICJyc2kiLCAicmR4IiwgInJjeCIsCQkJCVwKKwkJICAicjgiLCAicjkiLCAicjEwIiwgInIxMSIsICJtZW1vcnkiKTsJCQlcCit9IHdoaWxlICgwKQorCisvKioKKyAqICBfX211dGV4X2Zhc3RwYXRoX2xvY2tfcmV0dmFsIC0gdHJ5IHRvIHRha2UgdGhlIGxvY2sgYnkgbW92aW5nIHRoZSBjb3VudAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIDEgdG8gYSAwIHZhbHVlCisgKiAgQGNvdW50OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqICBAZmFpbF9mbjogZnVuY3Rpb24gdG8gY2FsbCBpZiB0aGUgb3JpZ2luYWwgdmFsdWUgd2FzIG5vdCAxCisgKgorICogQ2hhbmdlIHRoZSBjb3VudCBmcm9tIDEgdG8gYSB2YWx1ZSBsb3dlciB0aGFuIDEsIGFuZCBjYWxsIDxmYWlsX2ZuPiBpZgorICogaXQgd2Fzbid0IDEgb3JpZ2luYWxseS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIDAgaWYgdGhlIGZhc3RwYXRoIHN1Y2NlZWRzLAorICogb3IgYW55dGhpbmcgdGhlIHNsb3cgcGF0aCBmdW5jdGlvbiByZXR1cm5zCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX211dGV4X2Zhc3RwYXRoX2xvY2tfcmV0dmFsKGF0b21pY190ICpjb3VudCwKKwkJCSAgICAgaW50IGZhc3RjYWxsICgqZmFpbF9mbikoYXRvbWljX3QgKikpCit7CisJaWYgKHVubGlrZWx5KGF0b21pY19kZWNfcmV0dXJuKGNvdW50KSA8IDApKQorCQlyZXR1cm4gZmFpbF9mbihjb3VudCk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworLyoqCisgKiBfX211dGV4X2Zhc3RwYXRoX3VubG9jayAtIGluY3JlbWVudCBhbmQgY2FsbCBmdW5jdGlvbiBpZiBub25wb3NpdGl2ZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogQGZhaWxfZm46IGZ1bmN0aW9uIHRvIGNhbGwgaWYgdGhlIHJlc3VsdCBpcyBub25wb3NpdGl2ZQorICoKKyAqIEF0b21pY2FsbHkgaW5jcmVtZW50cyBAdiBhbmQgY2FsbHMgPGZhaWxfZm4+IGlmIHRoZSByZXN1bHQgaXMgbm9ucG9zaXRpdmUuCisgKi8KKyNkZWZpbmUgX19tdXRleF9mYXN0cGF0aF91bmxvY2sodiwgZmFpbF9mbikJCQkJXAorZG8gewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIGR1bW15OwkJCQkJCVwKKwkJCQkJCQkJCVwKKwl0eXBlY2hlY2soYXRvbWljX3QgKiwgdik7CQkJCQlcCisJdHlwZWNoZWNrX2ZuKGZhc3RjYWxsIHZvaWQgKCopKGF0b21pY190ICopLCBmYWlsX2ZuKTsJCVwKKwkJCQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJCUxPQ0sJIiAgIGluY2wgKCUlcmRpKQlcbiIJCQlcCisJCQkiICAgamxlIDJmCQlcbiIJCQlcCisJCQkiMToJCQlcbiIJCQlcCisJCQkJCQkJCQlcCisJCUxPQ0tfU0VDVElPTl9TVEFSVCgiIikJCQkJCVwKKwkJCSIyOiBjYWxsICIjZmFpbF9mbiIJXG4iCQkJXAorCQkJIiAgIGptcCAxYgkJXG4iCQkJXAorCQlMT0NLX1NFQ1RJT05fRU5ECQkJCQlcCisJCQkJCQkJCQlcCisJCToiPUQiIChkdW1teSkJCQkJCQlcCisJCTogIkQiICh2KQkJCQkJCVwKKwkJOiAicmF4IiwgInJzaSIsICJyZHgiLCAicmN4IiwJCQkJXAorCQkgICJyOCIsICJyOSIsICJyMTAiLCAicjExIiwgIm1lbW9yeSIpOwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgX19tdXRleF9zbG93cGF0aF9uZWVkc190b191bmxvY2soKQkxCisKKy8qKgorICogX19tdXRleF9mYXN0cGF0aF90cnlsb2NrIC0gdHJ5IHRvIGFjcXVpcmUgdGhlIG11dGV4LCB3aXRob3V0IHdhaXRpbmcKKyAqCisgKiAgQGNvdW50OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqICBAZmFpbF9mbjogZmFsbGJhY2sgZnVuY3Rpb24KKyAqCisgKiBDaGFuZ2UgdGhlIGNvdW50IGZyb20gMSB0byAwIGFuZCByZXR1cm4gMSAoc3VjY2VzcyksIG9yIHJldHVybiAwIChmYWlsdXJlKQorICogaWYgaXQgd2Fzbid0IDEgb3JpZ2luYWxseS4gW3RoZSBmYWxsYmFjayBmdW5jdGlvbiBpcyBuZXZlciB1c2VkIG9uCisgKiB4ODZfNjQsIGJlY2F1c2UgYWxsIHg4Nl82NCBDUFVzIGhhdmUgYSBDTVBYQ0hHIGluc3RydWN0aW9uLl0KKyAqLworc3RhdGljIGlubGluZSBpbnQKK19fbXV0ZXhfZmFzdHBhdGhfdHJ5bG9jayhhdG9taWNfdCAqY291bnQsIGludCAoKmZhaWxfZm4pKGF0b21pY190ICopKQoreworCWlmIChsaWtlbHkoYXRvbWljX2NtcHhjaGcoY291bnQsIDEsIDApID09IDEpKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9udW1hLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvbnVtYS5oCmluZGV4IGQ1MWU1NmYuLjM0ZTQzNGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9udW1hLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L251bWEuaApAQCAtMjAsNiArMjAsMTEgQEAKIGV4dGVybiB2b2lkIG51bWFfc2V0X25vZGUoaW50IGNwdSwgaW50IG5vZGUpOwogCiBleHRlcm4gdW5zaWduZWQgY2hhciBhcGljaWRfdG9fbm9kZVsyNTZdOworI2lmZGVmIENPTkZJR19OVU1BCitleHRlcm4gdm9pZCBfX2luaXQgaW5pdF9jcHVfdG9fbm9kZSh2b2lkKTsKKyNlbHNlCisjZGVmaW5lIGluaXRfY3B1X3RvX25vZGUoKSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgogCiAjZGVmaW5lIE5VTUFfTk9fTk9ERSAweGZmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wYWdlLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvcGFnZS5oCmluZGV4IDA2ZTQ4OWYuLjYxNWUzZTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3BhZ2UuaApAQCAtMTQsMTMgKzE0LDI1IEBACiAjZGVmaW5lIFBIWVNJQ0FMX1BBR0VfTUFTSwkofihQQUdFX1NJWkUtMSkgJiBfX1BIWVNJQ0FMX01BU0spCiAKICNkZWZpbmUgVEhSRUFEX09SREVSIDEgCi0jaWZkZWYgX19BU1NFTUJMWV9fCi0jZGVmaW5lIFRIUkVBRF9TSVpFICAoMSA8PCAoUEFHRV9TSElGVCArIFRIUkVBRF9PUkRFUikpCi0jZWxzZQotI2RlZmluZSBUSFJFQURfU0laRSAgKDFVTCA8PCAoUEFHRV9TSElGVCArIFRIUkVBRF9PUkRFUikpCi0jZW5kaWYKKyNkZWZpbmUgVEhSRUFEX1NJWkUgIChQQUdFX1NJWkUgPDwgVEhSRUFEX09SREVSKQogI2RlZmluZSBDVVJSRU5UX01BU0sgKH4oVEhSRUFEX1NJWkUtMSkpCiAKKyNkZWZpbmUgRVhDRVBUSU9OX1NUQUNLX09SREVSIDAKKyNkZWZpbmUgRVhDRVBUSU9OX1NUS1NaIChQQUdFX1NJWkUgPDwgRVhDRVBUSU9OX1NUQUNLX09SREVSKQorCisjZGVmaW5lIERFQlVHX1NUQUNLX09SREVSIEVYQ0VQVElPTl9TVEFDS19PUkRFUgorI2RlZmluZSBERUJVR19TVEtTWiAoUEFHRV9TSVpFIDw8IERFQlVHX1NUQUNLX09SREVSKQorCisjZGVmaW5lIElSUVNUQUNLX09SREVSIDIKKyNkZWZpbmUgSVJRU1RBQ0tTSVpFIChQQUdFX1NJWkUgPDwgSVJRU1RBQ0tfT1JERVIpCisKKyNkZWZpbmUgU1RBQ0tGQVVMVF9TVEFDSyAxCisjZGVmaW5lIERPVUJMRUZBVUxUX1NUQUNLIDIKKyNkZWZpbmUgTk1JX1NUQUNLIDMKKyNkZWZpbmUgREVCVUdfU1RBQ0sgNAorI2RlZmluZSBNQ0VfU1RBQ0sgNQorI2RlZmluZSBOX0VYQ0VQVElPTl9TVEFDS1MgNSAgLyogaHcgbGltaXQ6IDcgKi8KKwogI2RlZmluZSBMQVJHRV9QQUdFX01BU0sgKH4oTEFSR0VfUEFHRV9TSVpFLTEpKQogI2RlZmluZSBMQVJHRV9QQUdFX1NJWkUgKDFVTCA8PCBQTURfU0hJRlQpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wY2kuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wY2kuaAppbmRleCBlZWIzMDg4Li5mZDAzZTE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3BjaS5oCkBAIC00MiwxOCArNDIsMjAgQEAKICNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+IC8qIGZvciBoYXZlX2lvbW11ICovCiAKIGV4dGVybiBpbnQgaW9tbXVfc2V0dXAoY2hhciAqb3B0KTsKIAotI2lmZGVmIENPTkZJR19HQVJUX0lPTU1VCiAvKiBUaGUgUENJIGFkZHJlc3Mgc3BhY2UgZG9lcyBlcXVhbCB0aGUgcGh5c2ljYWwgbWVtb3J5CiAgKiBhZGRyZXNzIHNwYWNlLiAgVGhlIG5ldHdvcmtpbmcgYW5kIGJsb2NrIGRldmljZSBsYXllcnMgdXNlCiAgKiB0aGlzIGJvb2xlYW4gZm9yIGJvdW5jZSBidWZmZXIgZGVjaXNpb25zCiAgKgotICogT24gQU1ENjQgaXQgbW9zdGx5IGVxdWFscywgYnV0IHdlIHNldCBpdCB0byB6ZXJvIHRvIHRlbGwgc29tZSBzdWJzeXN0ZW1zCi0gKiB0aGF0IGFuIElPTU1VIGlzIGF2YWlsYWJsZS4KKyAqIE9uIEFNRDY0IGl0IG1vc3RseSBlcXVhbHMsIGJ1dCB3ZSBzZXQgaXQgdG8gemVybyBpZiBhIGhhcmR3YXJlCisgKiBJT01NVSAoZ2FydCkgb2Ygc290d2FyZSBJT01NVSAoc3dpb3RsYikgaXMgYXZhaWxhYmxlLgogICovCi0jZGVmaW5lIFBDSV9ETUFfQlVTX0lTX1BIWVMJKG5vX2lvbW11ID8gMSA6IDApCisjZGVmaW5lIFBDSV9ETUFfQlVTX0lTX1BIWVMgKGRtYV9vcHMtPmlzX3BoeXMpCisKKyNpZmRlZiBDT05GSUdfR0FSVF9JT01NVQogCiAvKgogICogeDg2LTY0IGFsd2F5cyBzdXBwb3J0cyBEQUMsIGJ1dCBzb21ldGltZXMgaXQgaXMgdXNlZnVsIHRvIGZvcmNlCkBAIC03OSw3ICs4MSw2IEBACiAjZWxzZQogLyogTm8gSU9NTVUgKi8KIAotI2RlZmluZSBQQ0lfRE1BX0JVU19JU19QSFlTCTEKICNkZWZpbmUgcGNpX2RhY19kbWFfc3VwcG9ydGVkKHBjaV9kZXYsIG1hc2spICAgIDEKIAogI2RlZmluZSBERUNMQVJFX1BDSV9VTk1BUF9BRERSKEFERFJfTkFNRSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wZGEuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wZGEuaAppbmRleCA4NzMzY2NmLi5jN2FiMzhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvcGRhLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3BkYS5oCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgogCiAvKiBQZXIgcHJvY2Vzc29yIGRhdGFzdHJ1Y3R1cmUuICVncyBwb2ludHMgdG8gaXQgd2hpbGUgdGhlIGtlcm5lbCBydW5zICovIAogc3RydWN0IHg4NjY0X3BkYSB7CkBAIC0xMiw2ICsxMyw5IEBACiAJdW5zaWduZWQgbG9uZyBkYXRhX29mZnNldDsJLyogUGVyIGNwdSBkYXRhIG9mZnNldCBmcm9tIGxpbmtlciBhZGRyZXNzICovCiAJdW5zaWduZWQgbG9uZyBrZXJuZWxzdGFjazsgIC8qIHRvcCBvZiBrZXJuZWwgc3RhY2sgZm9yIGN1cnJlbnQgKi8gCiAJdW5zaWduZWQgbG9uZyBvbGRyc3A7IAkgICAgLyogdXNlciByc3AgZm9yIHN5c3RlbSBjYWxsICovCisjaWYgREVCVUdfU1RLU1ogPiBFWENFUFRJT05fU1RLU1oKKwl1bnNpZ25lZCBsb25nIGRlYnVnc3RhY2s7ICAgLyogI0RCLyNCUCBzdGFjay4gKi8KKyNlbmRpZgogICAgICAgICBpbnQgaXJxY291bnQ7CQkgICAgLyogSXJxIG5lc3RpbmcgY291bnRlci4gU3RhcnRzIHdpdGggLTEgKi8gIAkKIAlpbnQgY3B1bnVtYmVyOwkJICAgIC8qIExvZ2ljYWwgQ1BVIG51bWJlciAqLwogCWNoYXIgKmlycXN0YWNrcHRyOwkvKiB0b3Agb2YgaXJxc3RhY2sgKi8KQEAgLTIzLDExICsyNywxMCBAQAogCXVuc2lnbmVkIGFwaWNfdGltZXJfaXJxczsKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKIAorZXh0ZXJuIHN0cnVjdCB4ODY2NF9wZGEgKl9jcHVfcGRhW107CitleHRlcm4gc3RydWN0IHg4NjY0X3BkYSBib290X2NwdV9wZGFbXTsKIAotI2RlZmluZSBJUlFTVEFDS19PUkRFUiAyCi0jZGVmaW5lIElSUVNUQUNLU0laRSAoUEFHRV9TSVpFIDw8IElSUVNUQUNLX09SREVSKSAKLQotZXh0ZXJuIHN0cnVjdCB4ODY2NF9wZGEgY3B1X3BkYVtdOworI2RlZmluZSBjcHVfcGRhKGkpIChfY3B1X3BkYVtpXSkKIAogLyogCiAgKiBUaGVyZSBpcyBubyBmYXN0IHdheSB0byBnZXQgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgUERBLCBhbGwgdGhlIGFjY2Vzc2VzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvcGVyY3B1LmggYi9pbmNsdWRlL2FzbS14ODZfNjQvcGVyY3B1LmgKaW5kZXggOWM3MTg1NS4uMjlhNmIwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3BlcmNwdS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wZXJjcHUuaApAQCAtMTEsNyArMTEsNyBAQAogCiAjaW5jbHVkZSA8YXNtL3BkYS5oPgogCi0jZGVmaW5lIF9fcGVyX2NwdV9vZmZzZXQoY3B1KSAoY3B1X3BkYVtjcHVdLmRhdGFfb2Zmc2V0KQorI2RlZmluZSBfX3Blcl9jcHVfb2Zmc2V0KGNwdSkgKGNwdV9wZGEoY3B1KS0+ZGF0YV9vZmZzZXQpCiAjZGVmaW5lIF9fbXlfY3B1X29mZnNldCgpIHJlYWRfcGRhKGRhdGFfb2Zmc2V0KQogCiAvKiBTZXBhcmF0ZSBvdXQgdGhlIHR5cGUsIHNvIChpbnRbM10sIGZvbykgd29ya3MuICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3BndGFibGUuaAppbmRleCAwMjg4OGQ3Li44ZmJmNGRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wZ3RhYmxlLmgKQEAgLTI2NywyNSArMjY3LDI1IEBACiAgKi8KICNkZWZpbmUgX19MQVJHRV9QVEUgKF9QQUdFX1BTRXxfUEFHRV9QUkVTRU5UKQogc3RhdGljIGlubGluZSBpbnQgcHRlX3VzZXIocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfVVNFUjsgfQotZXh0ZXJuIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfVVNFUjsgfQotZXh0ZXJuIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfVVNFUjsgfQotZXh0ZXJuIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0RJUlRZOyB9Ci1leHRlcm4gaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQ7IH0KLWV4dGVybiBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SVzsgfQorc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfVVNFUjsgfQorc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfVVNFUjsgfQorc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0RJUlRZOyB9CitzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQ7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SVzsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2h1Z2UocHRlX3QgcHRlKQkJeyByZXR1cm4gKHB0ZV92YWwocHRlKSAmIF9fTEFSR0VfUFRFKSA9PSBfX0xBUkdFX1BURTsgfQogCi1leHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX1VTRVIpKTsgcmV0dXJuIHB0ZTsgfQotZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9VU0VSKSk7IHJldHVybiBwdGU7IH0KLWV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX0RJUlRZKSk7IHJldHVybiBwdGU7IH0KLWV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21rb2xkKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9BQ0NFU1NFRCkpOyByZXR1cm4gcHRlOyB9Ci1leHRlcm4gaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX1JXKSk7IHJldHVybiBwdGU7IH0KLWV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9VU0VSKSk7IHJldHVybiBwdGU7IH0KLWV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9VU0VSKSk7IHJldHVybiBwdGU7IH0KLWV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfRElSVFkpKTsgcmV0dXJuIHB0ZTsgfQotZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9BQ0NFU1NFRCkpOyByZXR1cm4gcHRlOyB9Ci1leHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX1JXKSk7IHJldHVybiBwdGU7IH0KLWV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21raHVnZShwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfX0xBUkdFX1BURSkpOyByZXR1cm4gcHRlOyB9CitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX1VTRVIpKTsgcmV0dXJuIHB0ZTsgfQorc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9VU0VSKSk7IHJldHVybiBwdGU7IH0KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX0RJUlRZKSk7IHJldHVybiBwdGU7IH0KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rb2xkKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9BQ0NFU1NFRCkpOyByZXR1cm4gcHRlOyB9CitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX1JXKSk7IHJldHVybiBwdGU7IH0KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9VU0VSKSk7IHJldHVybiBwdGU7IH0KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9VU0VSKSk7IHJldHVybiBwdGU7IH0KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfRElSVFkpKTsgcmV0dXJuIHB0ZTsgfQorc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9BQ0NFU1NFRCkpOyByZXR1cm4gcHRlOyB9CitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX1JXKSk7IHJldHVybiBwdGU7IH0KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21raHVnZShwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfX0xBUkdFX1BURSkpOyByZXR1cm4gcHRlOyB9CiAKIHN0cnVjdCB2bV9hcmVhX3N0cnVjdDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3Byb2Nlc3Nvci5oCmluZGV4IDQ4NjEyNDYuLjhjOGQ4OGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcHJvY2Vzc29yLmgKQEAgLTIyNyw3ICsyMjcsMTMgQEAKIGV4dGVybiBzdHJ1Y3QgY3B1aW5mb194ODYgYm9vdF9jcHVfZGF0YTsKIERFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgdHNzX3N0cnVjdCxpbml0X3Rzcyk7CiAKKyNpZmRlZiBDT05GSUdfWDg2X1ZTTVAKKyNkZWZpbmUgQVJDSF9NSU5fVEFTS0FMSUdOCSgxIDw8IElOVEVSTk9ERV9DQUNIRV9TSElGVCkKKyNkZWZpbmUgQVJDSF9NSU5fTU1TVFJVQ1RfQUxJR04JKDEgPDwgSU5URVJOT0RFX0NBQ0hFX1NISUZUKQorI2Vsc2UKICNkZWZpbmUgQVJDSF9NSU5fVEFTS0FMSUdOCTE2CisjZGVmaW5lIEFSQ0hfTUlOX01NU1RSVUNUX0FMSUdOCTAKKyNlbmRpZgogCiBzdHJ1Y3QgdGhyZWFkX3N0cnVjdCB7CiAJdW5zaWduZWQgbG9uZwlyc3AwOwpAQCAtMjY3LDE1ICsyNzMsNiBAQAogI2RlZmluZSBJTklUX01NQVAgXAogeyAmaW5pdF9tbSwgMCwgMCwgTlVMTCwgUEFHRV9TSEFSRUQsIFZNX1JFQUQgfCBWTV9XUklURSB8IFZNX0VYRUMsIDEsIE5VTEwsIE5VTEwgfQogCi0jZGVmaW5lIFNUQUNLRkFVTFRfU1RBQ0sgMQotI2RlZmluZSBET1VCTEVGQVVMVF9TVEFDSyAyIAotI2RlZmluZSBOTUlfU1RBQ0sgMyAKLSNkZWZpbmUgREVCVUdfU1RBQ0sgNCAKLSNkZWZpbmUgTUNFX1NUQUNLIDUKLSNkZWZpbmUgTl9FWENFUFRJT05fU1RBQ0tTIDUgIC8qIGh3IGxpbWl0OiA3ICovCi0jZGVmaW5lIEVYQ0VQVElPTl9TVEtTWiAoUEFHRV9TSVpFIDw8IEVYQ0VQVElPTl9TVEFDS19PUkRFUikKLSNkZWZpbmUgRVhDRVBUSU9OX1NUQUNLX09SREVSIDAgCi0KICNkZWZpbmUgc3RhcnRfdGhyZWFkKHJlZ3MsbmV3X3JpcCxuZXdfcnNwKSBkbyB7IFwKIAlhc20gdm9sYXRpbGUoIm1vdmwgJTAsJSVmczsgbW92bCAlMCwlJWVzOyBtb3ZsICUwLCUlZHMiOiA6InIiICgwKSk7CSBcCiAJbG9hZF9nc19pbmRleCgwKTsJCQkJCQkJXApAQCAtMzE3LDggKzMxNCw4IEBACiAjZGVmaW5lIHRocmVhZF9zYXZlZF9wYyh0KSAoKih1bnNpZ25lZCBsb25nICopKCh0KS0+dGhyZWFkLnJzcCAtIDgpKQogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKLSNkZWZpbmUgS1NUS19FSVAodHNrKSBcCi0JKCgoc3RydWN0IHB0X3JlZ3MgKikodHNrLT50aHJlYWQucnNwMCAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpKS0+cmlwKQorI2RlZmluZSB0YXNrX3B0X3JlZ3ModHNrKSAoKHN0cnVjdCBwdF9yZWdzICopKHRzayktPnRocmVhZC5yc3AwIC0gMSkKKyNkZWZpbmUgS1NUS19FSVAodHNrKSAodGFza19wdF9yZWdzKHRzayktPnJpcCkKICNkZWZpbmUgS1NUS19FU1AodHNrKSAtMSAvKiBzb3JyeS4gZG9lc24ndCB3b3JrIGZvciBzeXNjYWxsLiAqLwogCiAKQEAgLTQ4MCw0ICs0NzcsNiBAQAogLyogQm9vdCBsb2FkZXIgdHlwZSBmcm9tIHRoZSBzZXR1cCBoZWFkZXIgKi8KIGV4dGVybiBpbnQgYm9vdGxvYWRlcl90eXBlOwogCisjZGVmaW5lIEhBVkVfQVJDSF9QSUNLX01NQVBfTEFZT1VUIDEKKwogI2VuZGlmIC8qIF9fQVNNX1g4Nl82NF9QUk9DRVNTT1JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3Byb3RvLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaAppbmRleCAzNDUwMTA4Li4xMTVlNDk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaApAQCAtNjcsOCArNjcsNiBAQAogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBlbmRfcGZuX21hcDsgCiAKLWV4dGVybiBjcHVtYXNrX3QgY3B1X2luaXRpYWxpemVkOwotCiBleHRlcm4gdm9pZCBzaG93X3RyYWNlKHVuc2lnbmVkIGxvbmcgKiByc3ApOwogZXh0ZXJuIHZvaWQgc2hvd19yZWdpc3RlcnMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCkBAIC05MSw4ICs4OSwxMiBAQAogCiBleHRlcm4gaW50IHVuaGFuZGxlZF9zaWduYWwoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBzaWcpOwogCitleHRlcm4gaW50IHVuc3luY2hyb25pemVkX3RzYyh2b2lkKTsKKwogZXh0ZXJuIHZvaWQgc2VsZWN0X2lkbGVfcm91dGluZShjb25zdCBzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl9pbml0KHZvaWQpOworCitleHRlcm4gdm9pZCBnYXJ0X3BhcnNlX29wdGlvbnMoY2hhciAqKTsKK2V4dGVybiB2b2lkIF9faW5pdCBub19pb21tdV9pbml0KHZvaWQpOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyB0YWJsZV9zdGFydCwgdGFibGVfZW5kOwogCkBAIC0xMDYsMTIgKzEwOCwxNyBAQAogZXh0ZXJuIGludCBhY3BpX2h0OwogZXh0ZXJuIGludCBhY3BpX2Rpc2FibGVkOwogCisjaWZkZWYgQ09ORklHX0dBUlRfSU9NTVUKIGV4dGVybiBpbnQgZmFsbGJhY2tfYXBlcl9vcmRlcjsKIGV4dGVybiBpbnQgZmFsbGJhY2tfYXBlcl9mb3JjZTsKIGV4dGVybiBpbnQgaW9tbXVfYXBlcnR1cmU7Ci1leHRlcm4gaW50IGlvbW11X2FwZXJ0dXJlX2Rpc2FibGVkOwogZXh0ZXJuIGludCBpb21tdV9hcGVydHVyZV9hbGxvd2VkOworZXh0ZXJuIGludCBpb21tdV9hcGVydHVyZV9kaXNhYmxlZDsKIGV4dGVybiBpbnQgZml4X2FwZXJ0dXJlOworI2Vsc2UKKyNkZWZpbmUgaW9tbXVfYXBlcnR1cmUgMAorI2RlZmluZSBpb21tdV9hcGVydHVyZV9hbGxvd2VkIDAKKyNlbmRpZgogZXh0ZXJuIGludCBmb3JjZV9pb21tdTsKIAogZXh0ZXJuIGludCByZWJvb3RfZm9yY2U7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvc2VnbWVudC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3NlZ21lbnQuaAppbmRleCA0NGFkYWYxLi5kNGJlZDMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvc2VnbWVudC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9zZWdtZW50LmgKQEAgLTE5LDE1ICsxOSwxMyBAQAogI2RlZmluZSBfX1VTRVJfRFMgICAgIDB4MmIgICAvKiA1KjgrMyAqLyAKICNkZWZpbmUgX19VU0VSX0NTICAgICAweDMzICAgLyogNio4KzMgKi8gCiAjZGVmaW5lIF9fVVNFUjMyX0RTCV9fVVNFUl9EUyAKLSNkZWZpbmUgX19LRVJORUwxNl9DUwkoR0RUX0VOVFJZX0tFUk5FTENTMTYgKiA4KQotI2RlZmluZSBfX0tFUk5FTF9DT01QQVQzMl9DUyAgIDB4OAogCiAjZGVmaW5lIEdEVF9FTlRSWV9UTFMgMQogI2RlZmluZSBHRFRfRU5UUllfVFNTIDgJLyogbmVlZHMgdHdvIGVudHJpZXMgKi8KICNkZWZpbmUgR0RUX0VOVFJZX0xEVCAxMCAvKiBuZWVkcyB0d28gZW50cmllcyAqLwogI2RlZmluZSBHRFRfRU5UUllfVExTX01JTiAxMgogI2RlZmluZSBHRFRfRU5UUllfVExTX01BWCAxNAotI2RlZmluZSBHRFRfRU5UUllfS0VSTkVMQ1MxNiAxNQorLyogMTUgZnJlZSAqLwogCiAjZGVmaW5lIEdEVF9FTlRSWV9UTFNfRU5UUklFUyAzCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9zbXAuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9zbXAuaAppbmRleCBkMDMwNDA5Li45Y2NiYjJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvc21wLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3NtcC5oCkBAIC0zNSw2ICszNSw3IEBACiBleHRlcm4gY3B1bWFza190IGNwdV9wb3NzaWJsZV9tYXA7CiBleHRlcm4gY3B1bWFza190IGNwdV9vbmxpbmVfbWFwOwogZXh0ZXJuIGNwdW1hc2tfdCBjcHVfY2FsbG91dF9tYXA7CitleHRlcm4gY3B1bWFza190IGNwdV9pbml0aWFsaXplZDsKIAogLyoKICAqIFByaXZhdGUgcm91dGluZXMvZGF0YQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3N3aW90bGIuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9zd2lvdGxiLmgKaW5kZXggZGRkZjFiMi4uNjA3NTdlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3N3aW90bGIuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvc3dpb3RsYi5oCkBAIC0zLDEwICszLDE0IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIAorI2luY2x1ZGUgPGFzbS9kbWEtbWFwcGluZy5oPgorCiAvKiBTV0lPVExCIGludGVyZmFjZSAqLwogCi1leHRlcm4gZG1hX2FkZHJfdCBzd2lvdGxiX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCi0JCQkJICAgICAgaW50IGRpcik7CitleHRlcm4gZG1hX2FkZHJfdCBzd2lvdGxiX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIHZvaWQgKnB0ciwKKwkJCQkgICAgIHNpemVfdCBzaXplLCBpbnQgZGlyKTsKK2V4dGVybiB2b2lkICpzd2lvdGxiX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZ3MpOwogZXh0ZXJuIHZvaWQgc3dpb3RsYl91bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZGV2X2FkZHIsCiAJCQkJICBzaXplX3Qgc2l6ZSwgaW50IGRpcik7CiBleHRlcm4gdm9pZCBzd2lvdGxiX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqaHdkZXYsCkBAIC0zNCwxMCArMzgsMTAgQEAKIGV4dGVybiB2b2lkIHN3aW90bGJfdW5tYXBfc2coc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCiAJCQkgaW50IG5lbnRzLCBpbnQgZGlyZWN0aW9uKTsKIGV4dGVybiBpbnQgc3dpb3RsYl9kbWFfbWFwcGluZ19lcnJvcihkbWFfYWRkcl90IGRtYV9hZGRyKTsKLWV4dGVybiB2b2lkICpzd2lvdGxiX2FsbG9jX2NvaGVyZW50IChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsCi0JCQkJICAgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFncyk7CiBleHRlcm4gdm9pZCBzd2lvdGxiX2ZyZWVfY29oZXJlbnQgKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzaXplX3Qgc2l6ZSwKIAkJCQkgICB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKTsKK2V4dGVybiBpbnQgc3dpb3RsYl9kbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB1NjQgbWFzayk7CitleHRlcm4gdm9pZCBzd2lvdGxiX2luaXQodm9pZCk7CiAKICNpZmRlZiBDT05GSUdfU1dJT1RMQgogZXh0ZXJuIGludCBzd2lvdGxiOwpAQCAtNDUsNCArNDksNiBAQAogI2RlZmluZSBzd2lvdGxiIDAKICNlbmRpZgogCi0jZW5kaWYKK2V4dGVybiB2b2lkIHBjaV9zd2lvdGxiX2luaXQodm9pZCk7CisKKyNlbmRpZiAvKiBfQVNNX1NXVElPTEJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3N5c3RlbS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3N5c3RlbS5oCmluZGV4IGIzNGNjMmUuLmE3M2YwYzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvc3lzdGVtLmgKQEAgLTIwLDggKzIwLDggQEAKICNkZWZpbmUgX19SRVNUT1JFKHJlZyxvZmZzZXQpICJtb3ZxICgxNC0iICNvZmZzZXQgIikqOCglJXJzcCksJSUiICNyZWcgIlxuXHQiCiAKIC8qIGZyYW1lIHBvaW50ZXIgbXVzdCBiZSBsYXN0IGZvciBnZXRfd2NoYW4gKi8KLSNkZWZpbmUgU0FWRV9DT05URVhUICAgICJwdXNoZnEgOyBwdXNocSAlJXJicCA7IG1vdnEgJSVyc2ksJSVyYnBcblx0IgotI2RlZmluZSBSRVNUT1JFX0NPTlRFWFQgIm1vdnEgJSVyYnAsJSVyc2kgOyBwb3BxICUlcmJwIDsgcG9wZnFcblx0IiAKKyNkZWZpbmUgU0FWRV9DT05URVhUICAgICJwdXNocSAlJXJicCA7IG1vdnEgJSVyc2ksJSVyYnBcblx0IgorI2RlZmluZSBSRVNUT1JFX0NPTlRFWFQgIm1vdnEgJSVyYnAsJSVyc2kgOyBwb3BxICUlcmJwXG5cdCIKIAogI2RlZmluZSBfX0VYVFJBX0NMT0JCRVIgIFwKIAksInJjeCIsInJieCIsInJkeCIsInI4IiwicjkiLCJyMTAiLCJyMTEiLCJyMTIiLCJyMTMiLCJyMTQiLCJyMTUiCkBAIC0xMzcsNiArMTM3LDIxIEBACiAJCSAgICAgICI2NjM6XG5cdCIgbmV3aW5zdHIgIlxuNjY0OlxuIiAgIC8qIHJlcGxhY2VtZW50ICovIFwKIAkJICAgICAgIi5wcmV2aW91cyIgOjogImkiIChmZWF0dXJlKSwgIyNpbnB1dCkKIAorLyogTGlrZSBhbHRlcm5hdGl2ZV9pbnB1dCwgYnV0IHdpdGggYSBzaW5nbGUgb3V0cHV0IGFyZ3VtZW50ICovCisjZGVmaW5lIGFsdGVybmF0aXZlX2lvKG9sZGluc3RyLCBuZXdpbnN0ciwgZmVhdHVyZSwgb3V0cHV0LCBpbnB1dC4uLikgXAorCWFzbSB2b2xhdGlsZSAoIjY2MTpcblx0IiBvbGRpbnN0ciAiXG42NjI6XG4iCQkJXAorCQkgICAgICAiLnNlY3Rpb24gLmFsdGluc3RydWN0aW9ucyxcImFcIlxuIgkJXAorCQkgICAgICAiICAuYWxpZ24gOFxuIgkJCQkJXAorCQkgICAgICAiICAucXVhZCA2NjFiXG4iICAgICAgICAgICAgLyogbGFiZWwgKi8JCVwKKwkJICAgICAgIiAgLnF1YWQgNjYzZlxuIgkJICAvKiBuZXcgaW5zdHJ1Y3Rpb24gKi8JXAorCQkgICAgICAiICAuYnl0ZSAlY1tmZWF0XVxuIiAgICAgICAgLyogZmVhdHVyZSBiaXQgKi8JXAorCQkgICAgICAiICAuYnl0ZSA2NjJiLTY2MWJcbiIgICAgICAgLyogc291cmNlbGVuICovCVwKKwkJICAgICAgIiAgLmJ5dGUgNjY0Zi02NjNmXG4iICAgICAgIC8qIHJlcGxhY2VtZW50bGVuICovCVwKKwkJICAgICAgIi5wcmV2aW91c1xuIgkJCQkJXAorCQkgICAgICAiLnNlY3Rpb24gLmFsdGluc3RyX3JlcGxhY2VtZW50LFwiYXhcIlxuIgkJXAorCQkgICAgICAiNjYzOlxuXHQiIG5ld2luc3RyICJcbjY2NDpcbiIgICAvKiByZXBsYWNlbWVudCAqLyBcCisJCSAgICAgICIucHJldmlvdXMiIDogb3V0cHV0IDogW2ZlYXRdICJpIiAoZmVhdHVyZSksICMjaW5wdXQpCisKIC8qCiAgKiBDbGVhciBhbmQgc2V0ICdUUycgYml0IHJlc3BlY3RpdmVseQogICovCkBAIC0xNzgsNiArMTkzLDE1IEBACiAjZGVmaW5lIHdiaW52ZCgpIFwKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIndiaW52ZCI6IDogOiJtZW1vcnkiKTsKIAorLyoKKyAqIE9uIFNNUCBzeXN0ZW1zLCB3aGVuIHRoZSBzY2hlZHVsZXIgZG9lcyBtaWdyYXRpb24tY29zdCBhdXRvZGV0ZWN0aW9uLAorICogaXQgbmVlZHMgYSB3YXkgdG8gZmx1c2ggYXMgbXVjaCBvZiB0aGUgQ1BVJ3MgY2FjaGVzIGFzIHBvc3NpYmxlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2NoZWRfY2FjaGVmbHVzaCh2b2lkKQoreworCXdiaW52ZCgpOworfQorCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCiAjZGVmaW5lIG5vcCgpIF9fYXNtX18gX192b2xhdGlsZV9fICgibm9wIikKQEAgLTMxMSwxMiArMzM1LDI0IEBACiAvKiBpbnRlcnJ1cHQgY29udHJvbC4uICovCiAjZGVmaW5lIGxvY2FsX3NhdmVfZmxhZ3MoeCkJZG8geyB3YXJuX2lmX25vdF91bG9uZyh4KTsgX19hc21fXyBfX3ZvbGF0aWxlX18oIiMgc2F2ZV9mbGFncyBcblx0IHB1c2hmcSA7IHBvcHEgJXEwIjoiPWciICh4KTogLyogbm8gaW5wdXQgKi8gOiJtZW1vcnkiKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgbG9jYWxfaXJxX3Jlc3RvcmUoeCkgCV9fYXNtX18gX192b2xhdGlsZV9fKCIjIHJlc3RvcmVfZmxhZ3MgXG5cdCBwdXNocSAlMCA7IHBvcGZxIjogLyogbm8gb3V0cHV0ICovIDoiZyIgKHgpOiJtZW1vcnkiLCAiY2MiKQorCisjaWZkZWYgQ09ORklHX1g4Nl9WU01QCisvKiBJbnRlcnJ1cHQgY29udHJvbCBmb3IgVlNNUCAgYXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIGxvY2FsX2lycV9kaXNhYmxlKCkJZG8geyB1bnNpZ25lZCBsb25nIGZsYWdzOyBsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsgbG9jYWxfaXJxX3Jlc3RvcmUoKGZsYWdzICYgfigxIDw8IDkpKSB8ICgxIDw8IDE4KSk7IH0gd2hpbGUgKDApCisjZGVmaW5lIGxvY2FsX2lycV9lbmFibGUoKQlkbyB7IHVuc2lnbmVkIGxvbmcgZmxhZ3M7IGxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOyBsb2NhbF9pcnFfcmVzdG9yZSgoZmxhZ3MgfCAoMSA8PCA5KSkgJiB+KDEgPDwgMTgpKTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBpcnFzX2Rpc2FibGVkKCkJCQkJCVwKKyh7CQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkJCQlcCisJbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CQkJXAorCShmbGFncyAmICgxPDwxOCkpIHx8ICEoZmxhZ3MgJiAoMTw8OSkpOwkJXAorfSkKKworLyogRm9yIHNwaW5sb2NrcyBldGMgKi8KKyNkZWZpbmUgbG9jYWxfaXJxX3NhdmUoeCkJZG8geyBsb2NhbF9zYXZlX2ZsYWdzKHgpOyBsb2NhbF9pcnFfcmVzdG9yZSgoeCAmIH4oMSA8PCA5KSkgfCAoMSA8PCAxOCkpOyB9IHdoaWxlICgwKQorI2Vsc2UgIC8qIENPTkZJR19YODZfVlNNUCAqLwogI2RlZmluZSBsb2NhbF9pcnFfZGlzYWJsZSgpIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygiY2xpIjogOiA6Im1lbW9yeSIpCiAjZGVmaW5lIGxvY2FsX2lycV9lbmFibGUoKQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3RpIjogOiA6Im1lbW9yeSIpCi0vKiB1c2VkIGluIHRoZSBpZGxlIGxvb3A7IHN0aSB0YWtlcyBvbmUgaW5zdHJ1Y3Rpb24gY3ljbGUgdG8gY29tcGxldGUgKi8KLSNkZWZpbmUgc2FmZV9oYWx0KCkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzdGk7IGhsdCI6IDogOiJtZW1vcnkiKQotLyogdXNlZCB3aGVuIGludGVycnVwdHMgYXJlIGFscmVhZHkgZW5hYmxlZCBvciB0byBzaHV0ZG93biB0aGUgcHJvY2Vzc29yICovCi0jZGVmaW5lIGhhbHQoKQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJobHQiOiA6IDoibWVtb3J5IikKIAogI2RlZmluZSBpcnFzX2Rpc2FibGVkKCkJCQlcCiAoewkJCQkJXApAQCAtMzI3LDE2ICszNjMsMTUgQEAKIAogLyogRm9yIHNwaW5sb2NrcyBldGMgKi8KICNkZWZpbmUgbG9jYWxfaXJxX3NhdmUoeCkgCWRvIHsgd2Fybl9pZl9ub3RfdWxvbmcoeCk7IF9fYXNtX18gX192b2xhdGlsZV9fKCIjIGxvY2FsX2lycV9zYXZlIFxuXHQgcHVzaGZxIDsgcG9wcSAlMCA7IGNsaSI6Ij1nIiAoeCk6IC8qIG5vIGlucHV0ICovIDoibWVtb3J5Iik7IH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogdXNlZCBpbiB0aGUgaWRsZSBsb29wOyBzdGkgdGFrZXMgb25lIGluc3RydWN0aW9uIGN5Y2xlIHRvIGNvbXBsZXRlICovCisjZGVmaW5lIHNhZmVfaGFsdCgpCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3RpOyBobHQiOiA6IDoibWVtb3J5IikKKy8qIHVzZWQgd2hlbiBpbnRlcnJ1cHRzIGFyZSBhbHJlYWR5IGVuYWJsZWQgb3IgdG8gc2h1dGRvd24gdGhlIHByb2Nlc3NvciAqLworI2RlZmluZSBoYWx0KCkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaGx0IjogOiA6Im1lbW9yeSIpCiAKIHZvaWQgY3B1X2lkbGVfd2FpdCh2b2lkKTsKIAotLyoKLSAqIGRpc2FibGUgaGx0IGR1cmluZyBjZXJ0YWluIGNyaXRpY2FsIGkvbyBvcGVyYXRpb25zCi0gKi8KLSNkZWZpbmUgSEFWRV9ESVNBQkxFX0hMVAotdm9pZCBkaXNhYmxlX2hsdCh2b2lkKTsKLXZvaWQgZW5hYmxlX2hsdCh2b2lkKTsKLQogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYXJjaF9hbGlnbl9zdGFjayh1bnNpZ25lZCBsb25nIHNwKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC90aHJlYWRfaW5mby5oCmluZGV4IDA4ZWI2ZTQuLjRhYzBlMGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC90aHJlYWRfaW5mby5oCkBAIC03Niw4ICs3Niw2IEBACiAjZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaykgXAogCSgoc3RydWN0IHRocmVhZF9pbmZvICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCxUSFJFQURfT1JERVIpKQogI2RlZmluZSBmcmVlX3RocmVhZF9pbmZvKHRpKSBmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSAodGkpLCBUSFJFQURfT1JERVIpCi0jZGVmaW5lIGdldF90aHJlYWRfaW5mbyh0aSkgZ2V0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCi0jZGVmaW5lIHB1dF90aHJlYWRfaW5mbyh0aSkgcHV0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCiAKICNlbHNlIC8qICFfX0FTU0VNQkxZX18gKi8KIApAQCAtMTM4LDYgKzEzNiw3IEBACiAgKiBoYXZlIHRvIHdvcnJ5IGFib3V0IGF0b21pYyBhY2Nlc3Nlcy4KICAqLwogI2RlZmluZSBUU19VU0VERlBVCQkweDAwMDEJLyogRlBVIHdhcyB1c2VkIGJ5IHRoaXMgdGFzayB0aGlzIHF1YW50dW0gKFNNUCkgKi8KKyNkZWZpbmUgVFNfQ09NUEFUCQkweDAwMDIJLyogMzJiaXQgc3lzY2FsbCBhY3RpdmUgKi8KIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3RpbWV4LmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdGltZXguaAppbmRleCBmOTcxZjQ1Li5mMTg0NDNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvdGltZXguaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdGltZXguaApAQCAtMTAsNiArMTAsOSBAQAogI2luY2x1ZGUgPGFzbS9tc3IuaD4KICNpbmNsdWRlIDxhc20vdnN5c2NhbGwuaD4KICNpbmNsdWRlIDxhc20vaHBldC5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KIAogI2RlZmluZSBDTE9DS19USUNLX1JBVEUJUElUX1RJQ0tfUkFURQkvKiBVbmRlcmx5aW5nIEhaICovCiAKQEAgLTIzLDYgKzI2LDE5IEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyogTGlrZSBnZXRfY3ljbGVzLCBidXQgbWFrZSBzdXJlIHRoZSBDUFUgaXMgc3luY2hyb25pemVkLiAqLworc3RhdGljIF9fYWx3YXlzX2lubGluZSBjeWNsZXNfdCBnZXRfY3ljbGVzX3N5bmModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmV0OworCXVuc2lnbmVkIGVheDsKKwkvKiBEb24ndCBkbyBhbiBhZGRpdGlvbmFsIHN5bmMgb24gQ1BVcyB3aGVyZSB3ZSBrbm93CisJICAgUkRUU0MgaXMgYWxyZWFkeSBzeW5jaHJvbm91cy4gKi8KKwlhbHRlcm5hdGl2ZV9pbyhBU01fTk9QMiwgImNwdWlkIiwgWDg2X0ZFQVRVUkVfU1lOQ19SRFRTQywKKwkJCSAgIj1hIiAoZWF4KSwgIjAiICgxKSA6ICJlYngiLCJlY3giLCJlZHgiLCJtZW1vcnkiKTsKKwlyZHRzY2xsKHJldCk7CisJcmV0dXJuIHJldDsKK30KKwogZXh0ZXJuIHVuc2lnbmVkIGludCBjcHVfa2h6OwogCiBleHRlcm4gaW50IHJlYWRfY3VycmVudF90aW1lcih1bnNpZ25lZCBsb25nICp0aW1lcl92YWx1ZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvdG9wb2xvZ3kuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC90b3BvbG9neS5oCmluZGV4IDdkODJiYzUuLjJmYTdmMjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC90b3BvbG9neS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC90b3BvbG9neS5oCkBAIC0zOSw3ICszOSw2IEBACiAJLm1heF9pbnRlcnZhbAkJPSAzMiwJCQlcCiAJLmJ1c3lfZmFjdG9yCQk9IDMyLAkJCVwKIAkuaW1iYWxhbmNlX3BjdAkJPSAxMjUsCQkJXAotCS5jYWNoZV9ob3RfdGltZQkJPSAoMTAqMTAwMDAwMCksCQlcCiAJLmNhY2hlX25pY2VfdHJpZXMJPSAyLAkJCVwKIAkuYnVzeV9pZHgJCT0gMywJCQlcCiAJLmlkbGVfaWR4CQk9IDIsCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC91YWNjZXNzLmgKaW5kZXggMWJiOGI4YS4uYmRkZmZjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdWFjY2Vzcy5oCkBAIC0yNDQsNyArMjQ0LDcgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbGVuKTsgCiBleHRlcm4gdW5zaWduZWQgbG9uZyBjb3B5X2luX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbGVuKTsgCiAKLXN0YXRpYyBpbmxpbmUgaW50IF9fY29weV9mcm9tX3VzZXIodm9pZCAqZHN0LCBjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB1bnNpZ25lZCBzaXplKSAKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fY29weV9mcm9tX3VzZXIodm9pZCAqZHN0LCBjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB1bnNpZ25lZCBzaXplKQogeyAKICAgICAgICBpbnQgcmV0ID0gMDsKIAlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpKQpAQCAtMjczLDcgKzI3Myw3IEBACiAJfQogfQkKIAotc3RhdGljIGlubGluZSBpbnQgX19jb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBzaXplKSAKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fY29weV90b191c2VyKHZvaWQgX191c2VyICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgc2l6ZSkKIHsgCiAgICAgICAgaW50IHJldCA9IDA7CiAJaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChzaXplKSkKQEAgLTMwNSw3ICszMDUsNyBAQAogfQkKIAogCi1zdGF0aWMgaW5saW5lIGludCBfX2NvcHlfaW5fdXNlcih2b2lkIF9fdXNlciAqZHN0LCBjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB1bnNpZ25lZCBzaXplKSAKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fY29weV9pbl91c2VyKHZvaWQgX191c2VyICpkc3QsIGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHVuc2lnbmVkIHNpemUpCiB7IAogICAgICAgIGludCByZXQgPSAwOwogCWlmICghX19idWlsdGluX2NvbnN0YW50X3Aoc2l6ZSkpCkBAIC0zNDgsNiArMzQ4LDcgQEAKIGxvbmcgc3RybmNweV9mcm9tX3VzZXIoY2hhciAqZHN0LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBsb25nIGNvdW50KTsKIGxvbmcgX19zdHJuY3B5X2Zyb21fdXNlcihjaGFyICpkc3QsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGxvbmcgY291bnQpOwogbG9uZyBzdHJubGVuX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnN0ciwgbG9uZyBuKTsKK2xvbmcgX19zdHJubGVuX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnN0ciwgbG9uZyBuKTsKIGxvbmcgc3RybGVuX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnN0cik7CiB1bnNpZ25lZCBsb25nIGNsZWFyX3VzZXIodm9pZCBfX3VzZXIgKm1lbSwgdW5zaWduZWQgbG9uZyBsZW4pOwogdW5zaWduZWQgbG9uZyBfX2NsZWFyX3VzZXIodm9pZCBfX3VzZXIgKm1lbSwgdW5zaWduZWQgbG9uZyBsZW4pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3VuaXN0ZC5oCmluZGV4IDJjNDIxNTAuLjQzNmQwOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdW5pc3RkLmgKQEAgLTU3MSw4ICs1NzEsMzcgQEAKIF9fU1lTQ0FMTChfX05SX2lub3RpZnlfYWRkX3dhdGNoLCBzeXNfaW5vdGlmeV9hZGRfd2F0Y2gpCiAjZGVmaW5lIF9fTlJfaW5vdGlmeV9ybV93YXRjaAkyNTUKIF9fU1lTQ0FMTChfX05SX2lub3RpZnlfcm1fd2F0Y2gsIHN5c19pbm90aWZ5X3JtX3dhdGNoKQorI2RlZmluZSBfX05SX21pZ3JhdGVfcGFnZXMJMjU2CitfX1NZU0NBTEwoX19OUl9taWdyYXRlX3BhZ2VzLCBzeXNfbWlncmF0ZV9wYWdlcykKKyNkZWZpbmUgX19OUl9vcGVuYXQJCTI1NworX19TWVNDQUxMKF9fTlJfb3BlbmF0LCBzeXNfb3BlbmF0KQorI2RlZmluZSBfX05SX21rZGlyYXQJCTI1OAorX19TWVNDQUxMKF9fTlJfbWtkaXJhdCwgc3lzX21rZGlyYXQpCisjZGVmaW5lIF9fTlJfbWtub2RhdAkJMjU5CitfX1NZU0NBTEwoX19OUl9ta25vZGF0LCBzeXNfbWtub2RhdCkKKyNkZWZpbmUgX19OUl9mY2hvd25hdAkJMjYwCitfX1NZU0NBTEwoX19OUl9mY2hvd25hdCwgc3lzX2ZjaG93bmF0KQorI2RlZmluZSBfX05SX2Z1dGltZXNhdAkJMjYxCitfX1NZU0NBTEwoX19OUl9mdXRpbWVzYXQsIHN5c19mdXRpbWVzYXQpCisjZGVmaW5lIF9fTlJfbmV3ZnN0YXRhdAkJMjYyCitfX1NZU0NBTEwoX19OUl9uZXdmc3RhdGF0LCBzeXNfbmV3ZnN0YXRhdCkKKyNkZWZpbmUgX19OUl91bmxpbmthdAkJMjYzCitfX1NZU0NBTEwoX19OUl91bmxpbmthdCwgc3lzX3VubGlua2F0KQorI2RlZmluZSBfX05SX3JlbmFtZWF0CQkyNjQKK19fU1lTQ0FMTChfX05SX3JlbmFtZWF0LCBzeXNfcmVuYW1lYXQpCisjZGVmaW5lIF9fTlJfbGlua2F0CQkyNjUKK19fU1lTQ0FMTChfX05SX2xpbmthdCwgc3lzX2xpbmthdCkKKyNkZWZpbmUgX19OUl9zeW1saW5rYXQJCTI2NgorX19TWVNDQUxMKF9fTlJfc3ltbGlua2F0LCBzeXNfc3ltbGlua2F0KQorI2RlZmluZSBfX05SX3JlYWRsaW5rYXQJCTI2NworX19TWVNDQUxMKF9fTlJfcmVhZGxpbmthdCwgc3lzX3JlYWRsaW5rYXQpCisjZGVmaW5lIF9fTlJfZmNobW9kYXQJCTI2OAorX19TWVNDQUxMKF9fTlJfZmNobW9kYXQsIHN5c19mY2htb2RhdCkKKyNkZWZpbmUgX19OUl9mYWNjZXNzYXQJCTI2OQorX19TWVNDQUxMKF9fTlJfZmFjY2Vzc2F0LCBzeXNfZmFjY2Vzc2F0KQogCi0jZGVmaW5lIF9fTlJfc3lzY2FsbF9tYXggX19OUl9pbm90aWZ5X3JtX3dhdGNoCisjZGVmaW5lIF9fTlJfc3lzY2FsbF9tYXggX19OUl9mYWNjZXNzYXQKKwogI2lmbmRlZiBfX05PX1NUVUJTCiAKIC8qIHVzZXItdmlzaWJsZSBlcnJvciBudW1iZXJzIGFyZSBpbiB0aGUgcmFuZ2UgLTEgLSAtNDA5NSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3ZzeXNjYWxsLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdnN5c2NhbGwuaAppbmRleCA0MzhhM2Y1Li5hODVlMTZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvdnN5c2NhbGwuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdnN5c2NhbGwuaApAQCAtMzYsOCArMzYsOCBAQAogCWludCBtb2RlOwogfTsKIAotI2RlZmluZSBocGV0X3JlYWRsKGEpICAgICAgICAgICByZWFkbCgodm9pZCAqKWZpeF90b192aXJ0KEZJWF9IUEVUX0JBU0UpICsgYSkKLSNkZWZpbmUgaHBldF93cml0ZWwoZCxhKSAgICAgICAgd3JpdGVsKGQsICh2b2lkICopZml4X3RvX3ZpcnQoRklYX0hQRVRfQkFTRSkgKyBhKQorI2RlZmluZSBocGV0X3JlYWRsKGEpICAgICAgICAgICByZWFkbCgoY29uc3Qgdm9pZCBfX2lvbWVtICopZml4X3RvX3ZpcnQoRklYX0hQRVRfQkFTRSkgKyBhKQorI2RlZmluZSBocGV0X3dyaXRlbChkLGEpICAgICAgICB3cml0ZWwoZCwgKHZvaWQgX19pb21lbSAqKWZpeF90b192aXJ0KEZJWF9IUEVUX0JBU0UpICsgYSkKIAogLyogdnN5c2NhbGwgc3BhY2UgKHJlYWRvbmx5KSAqLwogZXh0ZXJuIHN0cnVjdCB2eHRpbWVfZGF0YSBfX3Z4dGltZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9hdG9taWMuaAppbmRleCBlMmNlMDZiLi5mZTEwNWExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2F0b21pYy5oCkBAIC0yMjQsNiArMjI0LDcgQEAKICNkZWZpbmUgYXRvbWljX2FkZF9uZWdhdGl2ZShpLHYpIChhdG9taWNfYWRkX3JldHVybigoaSksKHYpKSA8IDApCiAKICNkZWZpbmUgYXRvbWljX2NtcHhjaGcodiwgbywgbikgKChpbnQpY21weGNoZygmKCh2KS0+Y291bnRlciksIChvKSwgKG4pKSkKKyNkZWZpbmUgYXRvbWljX3hjaGcodiwgbmV3KSAoeGNoZygmKCh2KS0+Y291bnRlciksIG5ldykpCiAKIC8qKgogICogYXRvbWljX2FkZF91bmxlc3MgLSBhZGQgdW5sZXNzIHRoZSBudW1iZXIgaXMgYSBnaXZlbiB2YWx1ZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2lvY3RsLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvaW9jdGwuaAppbmRleCA4NTZjNjA1Li5iMjc5ZmUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvaW9jdGwuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvaW9jdGwuaApAQCAtMSw4MyArMSBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9pb2N0bC5oCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgotICoKLSAqIERlcml2ZWQgZnJvbSAiaW5jbHVkZS9hc20taTM4Ni9pb2N0bC5oIgotICovCi0KLSNpZm5kZWYgX1hURU5TQV9JT0NUTF9ICi0jZGVmaW5lIF9YVEVOU0FfSU9DVExfSAotCi0KLS8qIGlvY3RsIGNvbW1hbmQgZW5jb2Rpbmc6IDMyIGJpdHMgdG90YWwsIGNvbW1hbmQgaW4gbG93ZXIgMTYgYml0cywKLSAqIHNpemUgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgaW4gdGhlIGxvd2VyIDE0IGJpdHMgb2YgdGhlCi0gKiB1cHBlciAxNiBiaXRzLgotICogRW5jb2RpbmcgdGhlIHNpemUgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgaW4gdGhlIGlvY3RsIHJlcXVlc3QKLSAqIGlzIHVzZWZ1bCBmb3IgY2F0Y2hpbmcgcHJvZ3JhbXMgY29tcGlsZWQgd2l0aCBvbGQgdmVyc2lvbnMKLSAqIGFuZCB0byBhdm9pZCBvdmVyd3JpdGluZyB1c2VyIHNwYWNlIG91dHNpZGUgdGhlIHVzZXIgYnVmZmVyIGFyZWEuCi0gKiBUaGUgaGlnaGVzdCAyIGJpdHMgYXJlIHJlc2VydmVkIGZvciBpbmRpY2F0aW5nIHRoZSBgYGFjY2VzcyBtb2RlJycuCi0gKiBOT1RFOiBUaGlzIGxpbWl0cyB0aGUgbWF4IHBhcmFtZXRlciBzaXplIHRvIDE2a0IgLTEgIQotICovCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGlzIGZvciBjb21wYXRpYmlsaXR5IGFjcm9zcyB0aGUgdmFyaW91cyBMaW51eAotICogcGxhdGZvcm1zLiAgVGhlIGkzODYgaW9jdGwgbnVtYmVyaW5nIHNjaGVtZSBkb2Vzbid0IHJlYWxseSBlbmZvcmNlCi0gKiBhIHR5cGUgZmllbGQuICBEZSBmYWN0bywgaG93ZXZlciwgdGhlIHRvcCA4IGJpdHMgb2YgdGhlIGxvd2VyIDE2Ci0gKiBiaXRzIGFyZSBpbmRlZWQgdXNlZCBhcyBhIHR5cGUgZmllbGQsIHNvIHdlIG1pZ2h0IGp1c3QgYXMgd2VsbCBtYWtlCi0gKiB0aGlzIGV4cGxpY2l0IGhlcmUuICBQbGVhc2UgYmUgc3VyZSB0byB1c2UgdGhlIGRlY29kaW5nIG1hY3JvcwotICogYmVsb3cgZnJvbSBub3cgb24uCi0gKi8KLSNkZWZpbmUgX0lPQ19OUkJJVFMJOAotI2RlZmluZSBfSU9DX1RZUEVCSVRTCTgKLSNkZWZpbmUgX0lPQ19TSVpFQklUUwkxNAotI2RlZmluZSBfSU9DX0RJUkJJVFMJMgotCi0jZGVmaW5lIF9JT0NfTlJNQVNLCSgoMSA8PCBfSU9DX05SQklUUyktMSkKLSNkZWZpbmUgX0lPQ19UWVBFTUFTSwkoKDEgPDwgX0lPQ19UWVBFQklUUyktMSkKLSNkZWZpbmUgX0lPQ19TSVpFTUFTSwkoKDEgPDwgX0lPQ19TSVpFQklUUyktMSkKLSNkZWZpbmUgX0lPQ19ESVJNQVNLCSgoMSA8PCBfSU9DX0RJUkJJVFMpLTEpCi0KLSNkZWZpbmUgX0lPQ19OUlNISUZUCTAKLSNkZWZpbmUgX0lPQ19UWVBFU0hJRlQJKF9JT0NfTlJTSElGVCtfSU9DX05SQklUUykKLSNkZWZpbmUgX0lPQ19TSVpFU0hJRlQJKF9JT0NfVFlQRVNISUZUK19JT0NfVFlQRUJJVFMpCi0jZGVmaW5lIF9JT0NfRElSU0hJRlQJKF9JT0NfU0laRVNISUZUK19JT0NfU0laRUJJVFMpCi0KLS8qCi0gKiBEaXJlY3Rpb24gYml0cy4KLSAqLwotI2RlZmluZSBfSU9DX05PTkUJMFUKLSNkZWZpbmUgX0lPQ19XUklURQkxVQotI2RlZmluZSBfSU9DX1JFQUQJMlUKLQotI2RlZmluZSBfSU9DKGRpcix0eXBlLG5yLHNpemUpIFwKLQkoKChkaXIpICA8PCBfSU9DX0RJUlNISUZUKSB8IFwKLQkgKCh0eXBlKSA8PCBfSU9DX1RZUEVTSElGVCkgfCBcCi0JICgobnIpICAgPDwgX0lPQ19OUlNISUZUKSB8IFwKLQkgKChzaXplKSA8PCBfSU9DX1NJWkVTSElGVCkpCi0KLS8qIHVzZWQgdG8gY3JlYXRlIG51bWJlcnMgKi8KLSNkZWZpbmUgX0lPKHR5cGUsbnIpCQlfSU9DKF9JT0NfTk9ORSwodHlwZSksKG5yKSwwKQotI2RlZmluZSBfSU9SKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1JFQUQsKHR5cGUpLChuciksc2l6ZW9mKHNpemUpKQotI2RlZmluZSBfSU9XKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1dSSVRFLCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKLSNkZWZpbmUgX0lPV1IodHlwZSxucixzaXplKQlfSU9DKF9JT0NfUkVBRHxfSU9DX1dSSVRFLCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKLQotLyogdXNlZCB0byBkZWNvZGUgaW9jdGwgbnVtYmVycy4uICovCi0jZGVmaW5lIF9JT0NfRElSKG5yKQkJKCgobnIpID4+IF9JT0NfRElSU0hJRlQpICYgX0lPQ19ESVJNQVNLKQotI2RlZmluZSBfSU9DX1RZUEUobnIpCQkoKChucikgPj4gX0lPQ19UWVBFU0hJRlQpICYgX0lPQ19UWVBFTUFTSykKLSNkZWZpbmUgX0lPQ19OUihucikJCSgoKG5yKSA+PiBfSU9DX05SU0hJRlQpICYgX0lPQ19OUk1BU0spCi0jZGVmaW5lIF9JT0NfU0laRShucikJCSgoKG5yKSA+PiBfSU9DX1NJWkVTSElGVCkgJiBfSU9DX1NJWkVNQVNLKQotCi0vKiAuLi5hbmQgZm9yIHRoZSBkcml2ZXJzL3NvdW5kIGZpbGVzLi4uICovCi0KLSNkZWZpbmUgSU9DX0lOCQkoX0lPQ19XUklURSA8PCBfSU9DX0RJUlNISUZUKQotI2RlZmluZSBJT0NfT1VUCQkoX0lPQ19SRUFEIDw8IF9JT0NfRElSU0hJRlQpCi0jZGVmaW5lIElPQ19JTk9VVAkoKF9JT0NfV1JJVEV8X0lPQ19SRUFEKSA8PCBfSU9DX0RJUlNISUZUKQotI2RlZmluZSBJT0NTSVpFX01BU0sJKF9JT0NfU0laRU1BU0sgPDwgX0lPQ19TSVpFU0hJRlQpCi0jZGVmaW5lIElPQ1NJWkVfU0hJRlQJKF9JT0NfU0laRVNISUZUKQotCi0jZW5kaWYKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pb2N0bC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL211dGV4LmggYi9pbmNsdWRlL2FzbS14dGVuc2EvbXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NThjMWY3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL211dGV4LmgKQEAgLTAsMCArMSw5IEBACisvKgorICogUHVsbCBpbiB0aGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIG11dGV4IGZhc3RwYXRoLgorICoKKyAqIFRPRE86IGltcGxlbWVudCBvcHRpbWl6ZWQgcHJpbWl0aXZlcyBpbnN0ZWFkLCBvciBsZWF2ZSB0aGUgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24gaW4gcGxhY2UsIG9yIHBpY2sgdGhlIGF0b21pY194Y2hnKCkgYmFzZWQgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24uIChzZWUgYXNtLWdlbmVyaWMvbXV0ZXgteGNoZy5oIGZvciBkZXRhaWxzKQorICovCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tdXRleC1kZWMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wcm9jZXNzb3IuaAppbmRleCA5Y2FiNWU0Li5kMWQ3MmFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3Byb2Nlc3Nvci5oCkBAIC0xODQsMTIgKzE4NCwxMiBAQAogI2RlZmluZSByZWxlYXNlX3NlZ21lbnRzKG1tKQlkbyB7IH0gd2hpbGUoMCkKICNkZWZpbmUgZm9yZ2V0X3NlZ21lbnRzKCkJZG8geyB9IHdoaWxlICgwKQogCi0jZGVmaW5lIHRocmVhZF9zYXZlZF9wYyh0c2spCSh4dGVuc2FfcHRfcmVncyh0c2spLT5wYykKKyNkZWZpbmUgdGhyZWFkX3NhdmVkX3BjKHRzaykJKHRhc2tfcHRfcmVncyh0c2spLT5wYykKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiAKLSNkZWZpbmUgS1NUS19FSVAodHNrKQkJKHh0ZW5zYV9wdF9yZWdzKHRzayktPnBjKQotI2RlZmluZSBLU1RLX0VTUCh0c2spCQkoeHRlbnNhX3B0X3JlZ3ModHNrKS0+YXJlZ1sxXSkKKyNkZWZpbmUgS1NUS19FSVAodHNrKQkJKHRhc2tfcHRfcmVncyh0c2spLT5wYykKKyNkZWZpbmUgS1NUS19FU1AodHNrKQkJKHRhc2tfcHRfcmVncyh0c2spLT5hcmVnWzFdKQogCiAjZGVmaW5lIGNwdV9yZWxheCgpICBkbyB7IH0gd2hpbGUgKDApCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wdHJhY2UuaAppbmRleCBhYTRmZDdmLi5hNWFjNzFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvcHRyYWNlLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3B0cmFjZS5oCkBAIC0xMTMsOCArMTEzLDggQEAKIH07CiAKICNpZmRlZiBfX0tFUk5FTF9fCi0jIGRlZmluZSB4dGVuc2FfcHRfcmVncyh0c2spICgoc3RydWN0IHB0X3JlZ3MqKSBcCi0gICgoKGxvbmcpKHRzayktPnRocmVhZF9pbmZvICsgS0VSTkVMX1NUQUNLX1NJWkUgLSAoWENIQUxfTlVNX0FSRUdTLTE2KSo0KSkgLSAxKQorIyBkZWZpbmUgdGFza19wdF9yZWdzKHRzaykgKChzdHJ1Y3QgcHRfcmVncyopIFwKKyAgKHRhc2tfc3RhY2tfcGFnZSh0c2spICsgS0VSTkVMX1NUQUNLX1NJWkUgLSAoWENIQUxfTlVNX0FSRUdTLTE2KSo0KSAtIDEpCiAjIGRlZmluZSB1c2VyX21vZGUocmVncykgKCgocmVncyktPnBzICYgMHgwMDAwMDAyMCkhPTApCiAjIGRlZmluZSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpICgocmVncyktPnBjKQogZXh0ZXJuIHZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvdGhyZWFkX2luZm8uaAppbmRleCBhZjIwOGQ0Li41YWUzNGFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvdGhyZWFkX2luZm8uaApAQCAtOTMsOCArOTMsNiBAQAogLyogdGhyZWFkIGluZm9ybWF0aW9uIGFsbG9jYXRpb24gKi8KICNkZWZpbmUgYWxsb2NfdGhyZWFkX2luZm8odHNrKSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsMSkpCiAjZGVmaW5lIGZyZWVfdGhyZWFkX2luZm8odGkpIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpICh0aSksIDEpCi0jZGVmaW5lIGdldF90aHJlYWRfaW5mbyh0aSkgZ2V0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCi0jZGVmaW5lIHB1dF90aHJlYWRfaW5mbyh0aSkgcHV0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCiAKICNlbHNlIC8qICFfX0FTU0VNQkxZX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hY3BpLmggYi9pbmNsdWRlL2xpbnV4L2FjcGkuaAppbmRleCAwMjZjM2MwLi44NGQzZDlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2FjcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2FjcGkuaApAQCAtNDM1LDcgKzQzNSw3IEBACiAKICNlbmRpZiAJLyogIUNPTkZJR19BQ1BJICovCiAKLWludCBhY3BpX3JlZ2lzdGVyX2dzaSAodTMyIGdzaSwgaW50IGVkZ2VfbGV2ZWwsIGludCBhY3RpdmVfaGlnaF9sb3cpOworaW50IGFjcGlfcmVnaXN0ZXJfZ3NpICh1MzIgZ3NpLCBpbnQgdHJpZ2dlcmluZywgaW50IHBvbGFyaXR5KTsKIGludCBhY3BpX2dzaV90b19pcnEgKHUzMiBnc2ksIHVuc2lnbmVkIGludCAqaXJxKTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWlvLmggYi9pbmNsdWRlL2xpbnV4L2Fpby5oCmluZGV4IDQ5ZmQzNzYuLjAwYzhlZmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9haW8uaApAQCAtOTQsMjYgKzk0LDI3IEBACiAJc3NpemVfdAkJCSgqa2lfcmV0cnkpKHN0cnVjdCBraW9jYiAqKTsKIAl2b2lkCQkJKCpraV9kdG9yKShzdHJ1Y3Qga2lvY2IgKik7CiAKLQlzdHJ1Y3QgbGlzdF9oZWFkCWtpX2xpc3Q7CS8qIHRoZSBhaW8gY29yZSB1c2VzIHRoaXMKLQkJCQkJCSAqIGZvciBjYW5jZWxsYXRpb24gKi8KLQogCXVuaW9uIHsKIAkJdm9pZCBfX3VzZXIJCSp1c2VyOwogCQlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRzazsKIAl9IGtpX29iajsKKwogCV9fdTY0CQkJa2lfdXNlcl9kYXRhOwkvKiB1c2VyJ3MgZGF0YSBmb3IgY29tcGxldGlvbiAqLworCXdhaXRfcXVldWVfdAkJa2lfd2FpdDsKIAlsb2ZmX3QJCQlraV9wb3M7CisKKwl2b2lkCQkJKnByaXZhdGU7CiAJLyogU3RhdGUgdGhhdCB3ZSByZW1lbWJlciB0byBiZSBhYmxlIHRvIHJlc3RhcnQvcmV0cnkgICovCiAJdW5zaWduZWQgc2hvcnQJCWtpX29wY29kZTsKIAlzaXplX3QJCQlraV9uYnl0ZXM7IAkvKiBjb3B5IG9mIGlvY2ItPmFpb19uYnl0ZXMgKi8KIAljaGFyIAkJCV9fdXNlciAqa2lfYnVmOwkvKiByZW1haW5pbmcgaW9jYi0+YWlvX2J1ZiAqLwogCXNpemVfdAkJCWtpX2xlZnQ7IAkvKiByZW1haW5pbmcgYnl0ZXMgKi8KLQl3YWl0X3F1ZXVlX3QJCWtpX3dhaXQ7CiAJbG9uZwkJCWtpX3JldHJpZWQ7IAkvKiBqdXN0IGZvciB0ZXN0aW5nICovCiAJbG9uZwkJCWtpX2tpY2tlZDsgCS8qIGp1c3QgZm9yIHRlc3RpbmcgKi8KIAlsb25nCQkJa2lfcXVldWVkOyAJLyoganVzdCBmb3IgdGVzdGluZyAqLwogCi0Jdm9pZAkJCSpwcml2YXRlOworCXN0cnVjdCBsaXN0X2hlYWQJa2lfbGlzdDsJLyogdGhlIGFpbyBjb3JlIHVzZXMgdGhpcworCQkJCQkJICogZm9yIGNhbmNlbGxhdGlvbiAqLwogfTsKIAogI2RlZmluZSBpc19zeW5jX2tpb2NiKGlvY2IpCSgoaW9jYiktPmtpX2tleSA9PSBLSU9DQl9TWU5DX0tFWSkKQEAgLTEyNiw2ICsxMjcsNyBAQAogCQkoeCktPmtpX2ZpbHAgPSAoZmlscCk7CQkJXAogCQkoeCktPmtpX2N0eCA9IE5VTEw7CQkJXAogCQkoeCktPmtpX2NhbmNlbCA9IE5VTEw7CQkJXAorCQkoeCktPmtpX3JldHJ5ID0gTlVMTDsJCQlcCiAJCSh4KS0+a2lfZHRvciA9IE5VTEw7CQkJXAogCQkoeCktPmtpX29iai50c2sgPSB0c2s7CQkJXAogCQkoeCktPmtpX3VzZXJfZGF0YSA9IDA7ICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2hhcmR3YXJlL2FtYmEuaCBiL2luY2x1ZGUvbGludXgvYW1iYS9idXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tYXJtL2hhcmR3YXJlL2FtYmEuaApyZW5hbWUgdG8gaW5jbHVkZS9saW51eC9hbWJhL2J1cy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vaGFyZHdhcmUvYW1iYV9jbGNkLmggYi9pbmNsdWRlL2xpbnV4L2FtYmEvY2xjZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1hcm0vaGFyZHdhcmUvYW1iYV9jbGNkLmgKcmVuYW1lIHRvIGluY2x1ZGUvbGludXgvYW1iYS9jbGNkLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9oYXJkd2FyZS9hbWJhX2ttaS5oIGIvaW5jbHVkZS9saW51eC9hbWJhL2ttaS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1hcm0vaGFyZHdhcmUvYW1iYV9rbWkuaApyZW5hbWUgdG8gaW5jbHVkZS9saW51eC9hbWJhL2ttaS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vaGFyZHdhcmUvYW1iYV9zZXJpYWwuaCBiL2luY2x1ZGUvbGludXgvYW1iYS9zZXJpYWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tYXJtL2hhcmR3YXJlL2FtYmFfc2VyaWFsLmgKcmVuYW1lIHRvIGluY2x1ZGUvbGludXgvYW1iYS9zZXJpYWwuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdGFsay5oIGIvaW5jbHVkZS9saW51eC9hdGFsay5oCmluZGV4IDkxMWMwOWMuLjZiYTNhYTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXRhbGsuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F0YWxrLmgKQEAgLTE1NSwxNSArMTU1LDE1IEBACiAjZGVmaW5lIEFBUlBfUkVRVUVTVAkJCTEKICNkZWZpbmUgQUFSUF9SRVBMWQkJCTIKICNkZWZpbmUgQUFSUF9QUk9CRQkJCTMKLQlfX3U4CWh3X3NyY1tFVEhfQUxFTl0JX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCV9fdTgJcGFfc3JjX3plcm8JCV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQlfX2JlMTYJcGFfc3JjX25ldAkJX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCV9fdTgJcGFfc3JjX25vZGUJCV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQlfX3U4CWh3X2RzdFtFVEhfQUxFTl0JX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCV9fdTgJcGFfZHN0X3plcm8JCV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQlfX2JlMTYJcGFfZHN0X25ldAkJX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCV9fdTgJcGFfZHN0X25vZGUJCV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsJCi19OworCV9fdTgJaHdfc3JjW0VUSF9BTEVOXTsKKwlfX3U4CXBhX3NyY196ZXJvOworCV9fYmUxNglwYV9zcmNfbmV0OworCV9fdTgJcGFfc3JjX25vZGU7CisJX191OAlod19kc3RbRVRIX0FMRU5dOworCV9fdTgJcGFfZHN0X3plcm87CisJX19iZTE2CXBhX2RzdF9uZXQ7CisJX191OAlwYV9kc3Rfbm9kZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiBzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgZWxhcGFhcnAgKmFhcnBfaGRyKHN0cnVjdCBza19idWZmICpza2IpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F1eHZlYy5oIGIvaW5jbHVkZS9saW51eC9hdXh2ZWMuaAppbmRleCA5YTdiMzc0Li5kMmJjMGQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F1eHZlYy5oCisrKyBiL2luY2x1ZGUvbGludXgvYXV4dmVjLmgKQEAgLTI2LDYgKzI2LDYgQEAKIAogI2RlZmluZSBBVF9TRUNVUkUgMjMgICAvKiBzZWN1cmUgbW9kZSBib29sZWFuICovCiAKLSNkZWZpbmUgQVRfVkVDVE9SX1NJWkUgIDQyIC8qIFNpemUgb2YgYXV4aWxpYXJ5IHRhYmxlLiAgKi8KKyNkZWZpbmUgQVRfVkVDVE9SX1NJWkUgIDQ0IC8qIFNpemUgb2YgYXV4aWxpYXJ5IHRhYmxlLiAgKi8KIAogI2VuZGlmIC8qIF9MSU5VWF9BVVhWRUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaCBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKaW5kZXggZmIwOTg1My4uMDJhNTg1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCkBAIC0xMTgsOSArMTE4LDkgQEAKICAqIHRyeSB0byBwdXQgdGhlIGZpZWxkcyB0aGF0IGFyZSByZWZlcmVuY2VkIHRvZ2V0aGVyIGluIHRoZSBzYW1lIGNhY2hlbGluZQogICovCiBzdHJ1Y3QgcmVxdWVzdCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBxdWV1ZWxpc3Q7IC8qIGxvb2tpbmcgZm9yIC0+cXVldWU/IHlvdSBtdXN0IF9ub3RfCi0JCQkJICAgICAqIGFjY2VzcyBpdCBkaXJlY3RseSwgdXNlCi0JCQkJICAgICAqIGJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QhICovCisJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZWxpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBkb25lbGlzdDsKKwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkvKiBzZWUgUkVRXyBiaXRzIGJlbG93ICovCiAKIAkvKiBNYWludGFpbiBiaW8gdHJhdmVyc2FsIHN0YXRlIGZvciBwYXJ0IGJ5IHBhcnQgSS9PIHN1Ym1pc3Npb24uCkBAIC0xNDEsNiArMTQxLDcgQEAKIAlzdHJ1Y3QgYmlvICpiaW90YWlsOwogCiAJdm9pZCAqZWxldmF0b3JfcHJpdmF0ZTsKKwl2b2lkICpjb21wbGV0aW9uX2RhdGE7CiAKIAl1bnNpZ25lZCBzaG9ydCBpb3ByaW87CiAKQEAgLTI5MSw2ICsyOTIsNyBAQAogdHlwZWRlZiB2b2lkIChhY3Rpdml0eV9mbikgKHZvaWQgKmRhdGEsIGludCBydyk7CiB0eXBlZGVmIGludCAoaXNzdWVfZmx1c2hfZm4pIChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IGdlbmRpc2sgKiwgc2VjdG9yX3QgKik7CiB0eXBlZGVmIHZvaWQgKHByZXBhcmVfZmx1c2hfZm4pIChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7Cit0eXBlZGVmIHZvaWQgKHNvZnRpcnFfZG9uZV9mbikoc3RydWN0IHJlcXVlc3QgKik7CiAKIGVudW0gYmxrX3F1ZXVlX3N0YXRlIHsKIAlRdWV1ZV9kb3duLApAQCAtMzMyLDYgKzMzNCw3IEBACiAJYWN0aXZpdHlfZm4JCSphY3Rpdml0eV9mbjsKIAlpc3N1ZV9mbHVzaF9mbgkJKmlzc3VlX2ZsdXNoX2ZuOwogCXByZXBhcmVfZmx1c2hfZm4JKnByZXBhcmVfZmx1c2hfZm47CisJc29mdGlycV9kb25lX2ZuCQkqc29mdGlycV9kb25lX2ZuOwogCiAJLyoKIAkgKiBEaXNwYXRjaCBxdWV1ZSBzb3J0aW5nCkBAIC01OTIsNyArNTk1LDYgQEAKIGV4dGVybiB2b2lkIGJsa19wdXRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqKTsKIGV4dGVybiB2b2lkIF9fYmxrX3B1dF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKIGV4dGVybiB2b2lkIGJsa19lbmRfc3luY19ycShzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBlcnJvcik7Ci1leHRlcm4gdm9pZCBibGtfYXR0ZW1wdF9yZW1lcmdlKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKIGV4dGVybiBzdHJ1Y3QgcmVxdWVzdCAqYmxrX2dldF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqLCBpbnQsIGdmcF90KTsKIGV4dGVybiB2b2lkIGJsa19pbnNlcnRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiwgaW50LCB2b2lkICopOwogZXh0ZXJuIHZvaWQgYmxrX3JlcXVldWVfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7CkBAIC02NDYsNiArNjQ4LDE3IEBACiBleHRlcm4gaW50IGVuZF90aGF0X3JlcXVlc3RfY2h1bmsoc3RydWN0IHJlcXVlc3QgKiwgaW50LCBpbnQpOwogZXh0ZXJuIHZvaWQgZW5kX3RoYXRfcmVxdWVzdF9sYXN0KHN0cnVjdCByZXF1ZXN0ICosIGludCk7CiBleHRlcm4gdm9pZCBlbmRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcmVxLCBpbnQgdXB0b2RhdGUpOworZXh0ZXJuIHZvaWQgYmxrX2NvbXBsZXRlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKik7CisKK3N0YXRpYyBpbmxpbmUgaW50IHJxX2FsbF9kb25lKHN0cnVjdCByZXF1ZXN0ICpycSwgdW5zaWduZWQgaW50IG5yX2J5dGVzKQoreworCWlmIChibGtfZnNfcmVxdWVzdChycSkpCisJCXJldHVybiAobnJfYnl0ZXMgPj0gKHJxLT5oYXJkX25yX3NlY3RvcnMgPDwgOSkpOworCWVsc2UgaWYgKGJsa19wY19yZXF1ZXN0KHJxKSkKKwkJcmV0dXJuIG5yX2J5dGVzID49IHJxLT5kYXRhX2xlbjsKKworCXJldHVybiAwOworfQogCiAvKgogICogZW5kX3RoYXRfcmVxdWVzdF9maXJzdC9jaHVuaygpIHRha2VzIGFuIHVwdG9kYXRlIGFyZ3VtZW50LiB3ZSBhY2NvdW50CkBAIC02OTQsNiArNzA3LDcgQEAKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9wcmVwX3JxKHJlcXVlc3RfcXVldWVfdCAqLCBwcmVwX3JxX2ZuICpwZm4pOwogZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX21lcmdlX2J2ZWMocmVxdWVzdF9xdWV1ZV90ICosIG1lcmdlX2J2ZWNfZm4gKik7CiBleHRlcm4gdm9pZCBibGtfcXVldWVfZG1hX2FsaWdubWVudChyZXF1ZXN0X3F1ZXVlX3QgKiwgaW50KTsKK2V4dGVybiB2b2lkIGJsa19xdWV1ZV9zb2Z0aXJxX2RvbmUocmVxdWVzdF9xdWV1ZV90ICosIHNvZnRpcnFfZG9uZV9mbiAqKTsKIGV4dGVybiBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmxrX2dldF9iYWNraW5nX2Rldl9pbmZvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpOwogZXh0ZXJuIGludCBibGtfcXVldWVfb3JkZXJlZChyZXF1ZXN0X3F1ZXVlX3QgKiwgdW5zaWduZWQsIHByZXBhcmVfZmx1c2hfZm4gKik7CiBleHRlcm4gdm9pZCBibGtfcXVldWVfaXNzdWVfZmx1c2hfZm4ocmVxdWVzdF9xdWV1ZV90ICosIGlzc3VlX2ZsdXNoX2ZuICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9idWZmZXJfaGVhZC5oIGIvaW5jbHVkZS9saW51eC9idWZmZXJfaGVhZC5oCmluZGV4IDFkYjA2MWIuLjlmMTU5YmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYnVmZmVyX2hlYWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2J1ZmZlcl9oZWFkLmgKQEAgLTE5Nyw3ICsxOTcsOCBAQAogaW50IGJsb2NrX3ByZXBhcmVfd3JpdGUoc3RydWN0IHBhZ2UqLCB1bnNpZ25lZCwgdW5zaWduZWQsIGdldF9ibG9ja190Kik7CiBpbnQgY29udF9wcmVwYXJlX3dyaXRlKHN0cnVjdCBwYWdlKiwgdW5zaWduZWQsIHVuc2lnbmVkLCBnZXRfYmxvY2tfdCosCiAJCQkJbG9mZl90ICopOwotaW50IGdlbmVyaWNfY29udF9leHBhbmQoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHNpemUpIDsKK2ludCBnZW5lcmljX2NvbnRfZXhwYW5kKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBzaXplKTsKK2ludCBnZW5lcmljX2NvbnRfZXhwYW5kX3NpbXBsZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgc2l6ZSk7CiBpbnQgYmxvY2tfY29tbWl0X3dyaXRlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0byk7CiBpbnQgYmxvY2tfc3luY19wYWdlKHN0cnVjdCBwYWdlICopOwogc2VjdG9yX3QgZ2VuZXJpY19ibG9ja19ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICosIHNlY3Rvcl90LCBnZXRfYmxvY2tfdCAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaCBiL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaAppbmRleCAwNGJkNzU2Li5lODZlNGE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9nZW5lcmljLmgKKysrIGIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oCkBAIC0xNTYsNyArMTU2LDcgQEAKIGV4dGVybiBfX3UxNgkJCW50b2hzKF9fYmUxNik7CiBleHRlcm4gX19iZTE2CQkJaHRvbnMoX191MTYpOwogCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID49IDIpICYmIGRlZmluZWQoX19PUFRJTUlaRV9fKQorI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19PUFRJTUlaRV9fKQogCiAjZGVmaW5lIF9fX2h0b25sKHgpIF9fY3B1X3RvX2JlMzIoeCkKICNkZWZpbmUgX19faHRvbnMoeCkgX19jcHVfdG9fYmUxNih4KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvc3dhYi5oIGIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvc3dhYi5oCmluZGV4IDJmMWNiNzcuLjI1ZjdmMzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL3N3YWIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9zd2FiLmgKQEAgLTExMCw3ICsxMTAsNyBAQAogLyoKICAqIEFsbG93IGNvbnN0YW50IGZvbGRpbmcKICAqLwotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA+PSAyKSAmJiBkZWZpbmVkKF9fT1BUSU1JWkVfXykKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fT1BUSU1JWkVfXykKICMgIGRlZmluZSBfX3N3YWIxNih4KSBcCiAoX19idWlsdGluX2NvbnN0YW50X3AoKF9fdTE2KSh4KSkgPyBcCiAgX19fc3dhYjE2KCh4KSkgOiBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9zd2FiYi5oIGIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvc3dhYmIuaAppbmRleCBkNWYyYTMyLi5hZTVlNWY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9zd2FiYi5oCisrKyBiL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL3N3YWJiLmgKQEAgLTc3LDcgKzc3LDcgQEAKIC8qCiAgKiBBbGxvdyBjb25zdGFudCBmb2xkaW5nCiAgKi8KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPj0gMikgJiYgZGVmaW5lZChfX09QVElNSVpFX18pCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX09QVElNSVpFX18pCiAjICBkZWZpbmUgX19zd2FodzMyKHgpIFwKIChfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191MzIpKHgpKSA/IFwKICBfX19zd2FodzMyKCh4KSkgOiBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NhY2hlLmggYi9pbmNsdWRlL2xpbnV4L2NhY2hlLmgKaW5kZXggMGI3ZWNmMy4uZDIyZTYzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jYWNoZS5oCisrKyBiL2luY2x1ZGUvbGludXgvY2FjaGUuaApAQCAtMTMsNyArMTMsNyBAQAogI2RlZmluZSBTTVBfQ0FDSEVfQllURVMgTDFfQ0FDSEVfQllURVMKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfWDg2KSB8fCBkZWZpbmVkKENPTkZJR19TUEFSQzY0KSB8fCBkZWZpbmVkKENPTkZJR19JQTY0KQorI2lmIGRlZmluZWQoQ09ORklHX1g4NikgfHwgZGVmaW5lZChDT05GSUdfU1BBUkM2NCkgfHwgZGVmaW5lZChDT05GSUdfSUE2NCkgfHwgZGVmaW5lZChDT05GSUdfUEFSSVNDKQogI2RlZmluZSBfX3JlYWRfbW9zdGx5IF9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5yZWFkX21vc3RseSIpKSkKICNlbHNlCiAjZGVmaW5lIF9fcmVhZF9tb3N0bHkKQEAgLTQ1LDEyICs0NSwyMSBAQAogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KICNlbmRpZgogCi0jaWYgIWRlZmluZWQoX19fX2NhY2hlbGluZV9tYXhhbGlnbmVkX2luX3NtcCkKKy8qCisgKiBUaGUgbWF4aW11bSBhbGlnbm1lbnQgbmVlZGVkIGZvciBzb21lIGNyaXRpY2FsIHN0cnVjdHVyZXMKKyAqIFRoZXNlIGNvdWxkIGJlIGludGVyLW5vZGUgY2FjaGVsaW5lIHNpemVzL0wzIGNhY2hlbGluZQorICogc2l6ZSBldGMuICBEZWZpbmUgdGhpcyBpbiBhc20vY2FjaGUuaCBmb3IgeW91ciBhcmNoCisgKi8KKyNpZm5kZWYgSU5URVJOT0RFX0NBQ0hFX1NISUZUCisjZGVmaW5lIElOVEVSTk9ERV9DQUNIRV9TSElGVCBMMV9DQUNIRV9TSElGVAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wKQogI2lmIGRlZmluZWQoQ09ORklHX1NNUCkKLSNkZWZpbmUgX19fX2NhY2hlbGluZV9tYXhhbGlnbmVkX2luX3NtcCBcCi0JX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oMSA8PCAoTDFfQ0FDSEVfU0hJRlRfTUFYKSkpKQorI2RlZmluZSBfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wIFwKKwlfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXygxIDw8IChJTlRFUk5PREVfQ0FDSEVfU0hJRlQpKSkpCiAjZWxzZQotI2RlZmluZSBfX19fY2FjaGVsaW5lX21heGFsaWduZWRfaW5fc21wCisjZGVmaW5lIF9fX19jYWNoZWxpbmVfaW50ZXJub2RlYWxpZ25lZF9pbl9zbXAKICNlbmRpZgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2FsYzY0LmggYi9pbmNsdWRlL2xpbnV4L2NhbGM2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZjRiOGYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2NhbGM2NC5oCkBAIC0wLDAgKzEsNDkgQEAKKyNpZm5kZWYgX0xJTlVYX0NBTEM2NF9ICisjZGVmaW5lIF9MSU5VWF9DQUxDNjRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKworLyoKKyAqIFRoaXMgaXMgYSBnZW5lcmljIG1hY3JvIHdoaWNoIGlzIHVzZWQgd2hlbiB0aGUgYXJjaGl0ZWN0dXJlCisgKiBzcGVjaWZpYyBkaXY2NC5oIGRvZXMgbm90IHByb3ZpZGUgYSBvcHRpbWl6ZWQgb25lLgorICoKKyAqIFRoZSA2NGJpdCBkaXZpZGVuZCBpcyBkaXZpZGVkIGJ5IHRoZSBkaXZpc29yIChkYXRhIHR5cGUgbG9uZyksIHRoZQorICogcmVzdWx0IGlzIHJldHVybmVkIGFuZCB0aGUgcmVtYWluZGVyIHN0b3JlZCBpbiB0aGUgdmFyaWFibGUKKyAqIHJlZmVyZW5jZWQgYnkgcmVtYWluZGVyIChkYXRhIHR5cGUgbG9uZyAqKS4gSW4gY29udHJhc3QgdG8gdGhlCisgKiBkb19kaXYgbWFjcm8gdGhlIGRpdmlkZW5kIGlzIGtlcHQgaW50YWN0LgorICovCisjaWZuZGVmIGRpdl9sb25nX2xvbmdfcmVtCisjZGVmaW5lIGRpdl9sb25nX2xvbmdfcmVtKGRpdmlkZW5kLCBkaXZpc29yLCByZW1haW5kZXIpCVwKKwlkb19kaXZfbGxyKChkaXZpZGVuZCksIGRpdmlzb3IsIHJlbWFpbmRlcikKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGRvX2Rpdl9sbHIoY29uc3QgbG9uZyBsb25nIGRpdmlkZW5kLAorCQkJCSAgICAgICBjb25zdCBsb25nIGRpdmlzb3IsIGxvbmcgKnJlbWFpbmRlcikKK3sKKwl1NjQgcmVzdWx0ID0gZGl2aWRlbmQ7CisKKwkqKHJlbWFpbmRlcikgPSBkb19kaXYocmVzdWx0LCBkaXZpc29yKTsKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpIHJlc3VsdDsKK30KKyNlbmRpZgorCisvKgorICogU2lnbiBhd2FyZSB2YXJpYXRpb24gb2YgdGhlIGFib3ZlLiBPbiBzb21lIGFyY2hpdGVjdHVyZXMgYQorICogbmVnYXRpdmUgZGl2aWRlbmQgbGVhZHMgdG8gYW4gZGl2aWRlIG92ZXJmbG93IGV4Y2VwdGlvbiwgd2hpY2gKKyAqIGlzIGF2b2lkZWQgYnkgdGhlIHNpZ24gY2hlY2suCisgKi8KK3N0YXRpYyBpbmxpbmUgbG9uZyBkaXZfbG9uZ19sb25nX3JlbV9zaWduZWQoY29uc3QgbG9uZyBsb25nIGRpdmlkZW5kLAorCQkJCQkgICAgY29uc3QgbG9uZyBkaXZpc29yLCBsb25nICpyZW1haW5kZXIpCit7CisJbG9uZyByZXM7CisKKwlpZiAodW5saWtlbHkoZGl2aWRlbmQgPCAwKSkgeworCQlyZXMgPSAtZGl2X2xvbmdfbG9uZ19yZW0oLWRpdmlkZW5kLCBkaXZpc29yLCByZW1haW5kZXIpOworCQkqcmVtYWluZGVyID0gLSgqcmVtYWluZGVyKTsKKwl9IGVsc2UKKwkJcmVzID0gZGl2X2xvbmdfbG9uZ19yZW0oZGl2aWRlbmQsIGRpdmlzb3IsIHJlbWFpbmRlcik7CisKKwlyZXR1cm4gcmVzOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oIGIvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmgKaW5kZXggNmI0NjE4OS4uNWEyM2NlNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmgKKysrIGIvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmgKQEAgLTQzLDYgKzQzLDcgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CiAKIC8qICNkZWZpbmUgU1RSSUNUX0NBUF9UX1RZUEVDSEVDS1MgKi8KIApAQCAtMzU2LDYgKzM1Nyw4IEBACiAKICNkZWZpbmUgY2FwX2lzX2ZzX2NhcChjKSAgICAgKENBUF9UT19NQVNLKGMpICYgQ0FQX0ZTX01BU0spCiAKK2V4dGVybiBpbnQgY2FwYWJsZShpbnQgY2FwKTsKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmIC8qICFfTElOVVhfQ0FQQUJJTElUWV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nsay5oIGIvaW5jbHVkZS9saW51eC9jbGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjg0OGY4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9jbGsuaApAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqICBsaW51eC9pbmNsdWRlL2xpbnV4L2Nsay5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBBUk0gTGltaXRlZC4KKyAqICBXcml0dGVuIGJ5IERlZXAgQmx1ZSBTb2x1dGlvbnMgTGltaXRlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaWZuZGVmIEFTTUFSTV9DTE9DS19ICisjZGVmaW5lIEFTTUFSTV9DTE9DS19ICisKK3N0cnVjdCBkZXZpY2U7CisKKy8qCisgKiBUaGUgYmFzZSBBUEkuCisgKi8KKworCisvKgorICogc3RydWN0IGNsayAtIGFuIG1hY2hpbmUgY2xhc3MgZGVmaW5lZCBvYmplY3QgLyBjb29raWUuCisgKi8KK3N0cnVjdCBjbGs7CisKKy8qKgorICogY2xrX2dldCAtIGxvb2t1cCBhbmQgb2J0YWluIGEgcmVmZXJlbmNlIHRvIGEgY2xvY2sgcHJvZHVjZXIuCisgKiBAZGV2OiBkZXZpY2UgZm9yIGNsb2NrICJjb25zdW1lciIKKyAqIEBpZDogY2xvY2sgY29tc3VtZXIgSUQKKyAqCisgKiBSZXR1cm5zIGEgc3RydWN0IGNsayBjb3JyZXNwb25kaW5nIHRvIHRoZSBjbG9jayBwcm9kdWNlciwgb3IKKyAqIHZhbGlkIElTX0VSUigpIGNvbmRpdGlvbiBjb250YWluaW5nIGVycm5vLiAgVGhlIGltcGxlbWVudGF0aW9uCisgKiB1c2VzIEBkZXYgYW5kIEBpZCB0byBkZXRlcm1pbmUgdGhlIGNsb2NrIGNvbnN1bWVyLCBhbmQgdGhlcmVieQorICogdGhlIGNsb2NrIHByb2R1Y2VyLiAgKElPVywgQGlkIG1heSBiZSBpZGVudGljYWwgc3RyaW5ncywgYnV0CisgKiBjbGtfZ2V0IG1heSByZXR1cm4gZGlmZmVyZW50IGNsb2NrIHByb2R1Y2VycyBkZXBlbmRpbmcgb24gQGRldi4pCisgKgorICogRHJpdmVycyBtdXN0IGFzc3VtZSB0aGF0IHRoZSBjbG9jayBzb3VyY2UgaXMgbm90IGVuYWJsZWQuCisgKi8KK3N0cnVjdCBjbGsgKmNsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCk7CisKKy8qKgorICogY2xrX2VuYWJsZSAtIGluZm9ybSB0aGUgc3lzdGVtIHdoZW4gdGhlIGNsb2NrIHNvdXJjZSBzaG91bGQgYmUgcnVubmluZy4KKyAqIEBjbGs6IGNsb2NrIHNvdXJjZQorICoKKyAqIElmIHRoZSBjbG9jayBjYW4gbm90IGJlIGVuYWJsZWQvZGlzYWJsZWQsIHRoaXMgc2hvdWxkIHJldHVybiBzdWNjZXNzLgorICoKKyAqIFJldHVybnMgc3VjY2VzcyAoMCkgb3IgbmVnYXRpdmUgZXJybm8uCisgKi8KK2ludCBjbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsayk7CisKKy8qKgorICogY2xrX2Rpc2FibGUgLSBpbmZvcm0gdGhlIHN5c3RlbSB3aGVuIHRoZSBjbG9jayBzb3VyY2UgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLgorICogQGNsazogY2xvY2sgc291cmNlCisgKgorICogSW5mb3JtIHRoZSBzeXN0ZW0gdGhhdCBhIGNsb2NrIHNvdXJjZSBpcyBubyBsb25nZXIgcmVxdWlyZWQgYnkKKyAqIGEgZHJpdmVyIGFuZCBtYXkgYmUgc2h1dCBkb3duLgorICoKKyAqIEltcGxlbWVudGF0aW9uIGRldGFpbDogaWYgdGhlIGNsb2NrIHNvdXJjZSBpcyBzaGFyZWQgYmV0d2VlbgorICogbXVsdGlwbGUgZHJpdmVycywgY2xrX2VuYWJsZSgpIGNhbGxzIG11c3QgYmUgYmFsYW5jZWQgYnkgdGhlCisgKiBzYW1lIG51bWJlciBvZiBjbGtfZGlzYWJsZSgpIGNhbGxzIGZvciB0aGUgY2xvY2sgc291cmNlIHRvIGJlCisgKiBkaXNhYmxlZC4KKyAqLwordm9pZCBjbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspOworCisvKioKKyAqIGNsa19nZXRfcmF0ZSAtIG9idGFpbiB0aGUgY3VycmVudCBjbG9jayByYXRlIChpbiBIeikgZm9yIGEgY2xvY2sgc291cmNlLgorICoJCSAgVGhpcyBpcyBvbmx5IHZhbGlkIG9uY2UgdGhlIGNsb2NrIHNvdXJjZSBoYXMgYmVlbiBlbmFibGVkLgorICogQGNsazogY2xvY2sgc291cmNlCisgKi8KK3Vuc2lnbmVkIGxvbmcgY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsayk7CisKKy8qKgorICogY2xrX3B1dAktICJmcmVlIiB0aGUgY2xvY2sgc291cmNlCisgKiBAY2xrOiBjbG9jayBzb3VyY2UKKyAqCisgKiBOb3RlOiBkcml2ZXJzIG11c3QgZW5zdXJlIHRoYXQgYWxsIGNsa19lbmFibGUgY2FsbHMgbWFkZSBvbiB0aGlzCisgKiBjbG9jayBzb3VyY2UgYXJlIGJhbGFuY2VkIGJ5IGNsa19kaXNhYmxlIGNhbGxzIHByaW9yIHRvIGNhbGxpbmcKKyAqIHRoaXMgZnVuY3Rpb24uCisgKi8KK3ZvaWQgY2xrX3B1dChzdHJ1Y3QgY2xrICpjbGspOworCisKKy8qCisgKiBUaGUgcmVtYWluaW5nIEFQSXMgYXJlIG9wdGlvbmFsIGZvciBtYWNoaW5lIGNsYXNzIHN1cHBvcnQuCisgKi8KKworCisvKioKKyAqIGNsa19yb3VuZF9yYXRlIC0gYWRqdXN0IGEgcmF0ZSB0byB0aGUgZXhhY3QgcmF0ZSBhIGNsb2NrIGNhbiBwcm92aWRlCisgKiBAY2xrOiBjbG9jayBzb3VyY2UKKyAqIEByYXRlOiBkZXNpcmVkIGNsb2NrIHJhdGUgaW4gSHoKKyAqCisgKiBSZXR1cm5zIHJvdW5kZWQgY2xvY2sgcmF0ZSBpbiBIeiwgb3IgbmVnYXRpdmUgZXJybm8uCisgKi8KK2xvbmcgY2xrX3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOworIAorLyoqCisgKiBjbGtfc2V0X3JhdGUgLSBzZXQgdGhlIGNsb2NrIHJhdGUgZm9yIGEgY2xvY2sgc291cmNlCisgKiBAY2xrOiBjbG9jayBzb3VyY2UKKyAqIEByYXRlOiBkZXNpcmVkIGNsb2NrIHJhdGUgaW4gSHoKKyAqCisgKiBSZXR1cm5zIHN1Y2Nlc3MgKDApIG9yIG5lZ2F0aXZlIGVycm5vLgorICovCitpbnQgY2xrX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKKyAKKy8qKgorICogY2xrX3NldF9wYXJlbnQgLSBzZXQgdGhlIHBhcmVudCBjbG9jayBzb3VyY2UgZm9yIHRoaXMgY2xvY2sKKyAqIEBjbGs6IGNsb2NrIHNvdXJjZQorICogQHBhcmVudDogcGFyZW50IGNsb2NrIHNvdXJjZQorICoKKyAqIFJldHVybnMgc3VjY2VzcyAoMCkgb3IgbmVnYXRpdmUgZXJybm8uCisgKi8KK2ludCBjbGtfc2V0X3BhcmVudChzdHJ1Y3QgY2xrICpjbGssIHN0cnVjdCBjbGsgKnBhcmVudCk7CisKKy8qKgorICogY2xrX2dldF9wYXJlbnQgLSBnZXQgdGhlIHBhcmVudCBjbG9jayBzb3VyY2UgZm9yIHRoaXMgY2xvY2sKKyAqIEBjbGs6IGNsb2NrIHNvdXJjZQorICoKKyAqIFJldHVybnMgc3RydWN0IGNsayBjb3JyZXNwb25kaW5nIHRvIHBhcmVudCBjbG9jayBzb3VyY2UsIG9yCisgKiB2YWxpZCBJU19FUlIoKSBjb25kaXRpb24gY29udGFpbmluZyBlcnJuby4KKyAqLworc3RydWN0IGNsayAqY2xrX2dldF9wYXJlbnQoc3RydWN0IGNsayAqY2xrKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbXBhdF9pb2N0bC5oIGIvaW5jbHVkZS9saW51eC9jb21wYXRfaW9jdGwuaAppbmRleCAxMTlmOWQwLi44ZmFkNTBmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbXBhdF9pb2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvY29tcGF0X2lvY3RsLmgKQEAgLTIsMTQgKzIsNiBAQAogICogY29tcGF0aWJsZSB0eXBlcyBwYXNzZWQgb3Igbm9uZSBhdCBhbGwuLi4gUGxlYXNlIGluY2x1ZGUKICAqIG9ubHkgc3R1ZmYgdGhhdCBpcyBjb21wYXRpYmxlIG9uICphbGwgYXJjaGl0ZWN0dXJlcyouCiAgKi8KLSNpZm5kZWYgQ09NUEFUSUJMRV9JT0NUTCAvKiBwb2ludGVyIHRvIGNvbXBhdGlibGUgc3RydWN0dXJlIG9yIG5vIGFyZ3VtZW50ICovCi0jZGVmaW5lIENPTVBBVElCTEVfSU9DVEwoY21kKSAgSEFORExFX0lPQ1RMKChjbWQpLChpb2N0bF90cmFuc19oYW5kbGVyX3Qpc3lzX2lvY3RsKQotI2VuZGlmCi0KLSNpZm5kZWYgVUxPTkdfSU9DVEwgLyogYXJndW1lbnQgaXMgYW4gdW5zaWduZWQgbG9uZyBpbnRlZ2VyLCBub3QgYSBwb2ludGVyICovCi0jZGVmaW5lIFVMT05HX0lPQ1RMKGNtZCkgIEhBTkRMRV9JT0NUTCgoY21kKSwoaW9jdGxfdHJhbnNfaGFuZGxlcl90KXN5c19pb2N0bCkKLSNlbmRpZgotCiAKIENPTVBBVElCTEVfSU9DVEwoMHg0QjUwKSAgIC8qIEtER0hXQ0xLIC0gbm90IGluIHRoZSBrZXJuZWwsIGJ1dCBkb24ndCBjb21wbGFpbiAqLwogQ09NUEFUSUJMRV9JT0NUTCgweDRCNTEpICAgLyogS0RTSFdDTEsgLSBub3QgaW4gdGhlIGtlcm5lbCwgYnV0IGRvbid0IGNvbXBsYWluICovCkBAIC0yMTgsMzIgKzIxMCw2IEBACiBDT01QQVRJQkxFX0lPQ1RMKFZUX1JFU0laRVgpCiBDT01QQVRJQkxFX0lPQ1RMKFZUX0xPQ0tTV0lUQ0gpCiBDT01QQVRJQkxFX0lPQ1RMKFZUX1VOTE9DS1NXSVRDSCkKLS8qIExpdHRsZSB2ICovCi0vKiBMaXR0bGUgdiwgdGhlIHZpZGVvNGxpbnV4IGlvY3RscyAoY29uZmxpY3Q/KSAqLwotQ09NUEFUSUJMRV9JT0NUTChWSURJT0NHQ0FQKQotQ09NUEFUSUJMRV9JT0NUTChWSURJT0NHQ0hBTikKLUNPTVBBVElCTEVfSU9DVEwoVklESU9DU0NIQU4pCi1DT01QQVRJQkxFX0lPQ1RMKFZJRElPQ0dQSUNUKQotQ09NUEFUSUJMRV9JT0NUTChWSURJT0NTUElDVCkKLUNPTVBBVElCTEVfSU9DVEwoVklESU9DQ0FQVFVSRSkKLUNPTVBBVElCTEVfSU9DVEwoVklESU9DS0VZKQotQ09NUEFUSUJMRV9JT0NUTChWSURJT0NHQVVESU8pCi1DT01QQVRJQkxFX0lPQ1RMKFZJRElPQ1NBVURJTykKLUNPTVBBVElCTEVfSU9DVEwoVklESU9DU1lOQykKLUNPTVBBVElCTEVfSU9DVEwoVklESU9DTUNBUFRVUkUpCi1DT01QQVRJQkxFX0lPQ1RMKFZJRElPQ0dNQlVGKQotQ09NUEFUSUJMRV9JT0NUTChWSURJT0NHVU5JVCkKLUNPTVBBVElCTEVfSU9DVEwoVklESU9DR0NBUFRVUkUpCi1DT01QQVRJQkxFX0lPQ1RMKFZJRElPQ1NDQVBUVVJFKQotLyogQlRUViBzcGVjaWZpYy4uLiAqLwotQ09NUEFUSUJMRV9JT0NUTChfSU9XKCd2JywgIEJBU0VfVklESU9DUFJJVkFURSswLCBjaGFyIFsyNTZdKSkKLUNPTVBBVElCTEVfSU9DVEwoX0lPUigndicsICBCQVNFX1ZJRElPQ1BSSVZBVEUrMSwgY2hhciBbMjU2XSkpCi1DT01QQVRJQkxFX0lPQ1RMKF9JT1IoJ3YnICwgQkFTRV9WSURJT0NQUklWQVRFKzIsIHVuc2lnbmVkIGludCkpCi1DT01QQVRJQkxFX0lPQ1RMKF9JT1coJ3YnICwgQkFTRV9WSURJT0NQUklWQVRFKzMsIGNoYXIgWzE2XSkpIC8qIHN0cnVjdCBidHR2X3BsbF9pbmZvICovCi1DT01QQVRJQkxFX0lPQ1RMKF9JT1IoJ3YnICwgQkFTRV9WSURJT0NQUklWQVRFKzQsIGludCkpCi1DT01QQVRJQkxFX0lPQ1RMKF9JT1IoJ3YnICwgQkFTRV9WSURJT0NQUklWQVRFKzUsIGludCkpCi1DT01QQVRJQkxFX0lPQ1RMKF9JT1IoJ3YnICwgQkFTRV9WSURJT0NQUklWQVRFKzYsIGludCkpCi1DT01QQVRJQkxFX0lPQ1RMKF9JT1IoJ3YnICwgQkFTRV9WSURJT0NQUklWQVRFKzcsIGludCkpCiAvKiBMaXR0bGUgcCAoL2Rldi9ydGMsIC9kZXYvZW52Y3RybCwgZXRjLikgKi8KIENPTVBBVElCTEVfSU9DVEwoUlRDX0FJRV9PTikKIENPTVBBVElCTEVfSU9DVEwoUlRDX0FJRV9PRkYpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLWdjYy5oIGIvaW5jbHVkZS9saW51eC9jb21waWxlci1nY2MuaAppbmRleCAxNTI3MzQwLi42ZTFjNDRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLWdjYy5oCisrKyBiL2luY2x1ZGUvbGludXgvY29tcGlsZXItZ2NjLmgKQEAgLTExLDcgKzExLDIyIEBACiAKIC8qIFRoaXMgbWFjcm8gb2JmdXNjYXRlcyBhcml0aG1ldGljIG9uIGEgdmFyaWFibGUgYWRkcmVzcyBzbyB0aGF0IGdjYwogICAgc2hvdWxkbid0IHJlY29nbml6ZSB0aGUgb3JpZ2luYWwgdmFyLCBhbmQgbWFrZSBhc3N1bXB0aW9ucyBhYm91dCBpdCAqLworLyoKKyAqIFZlcnNpb25zIG9mIHRoZSBwcGM2NCBjb21waWxlciBiZWZvcmUgNC4xIGhhZCBhIGJ1ZyB3aGVyZSB1c2Ugb2YKKyAqIFJFTE9DX0hJREUgY291bGQgdHJhc2ggcjMwLiBUaGUgYnVnIGNhbiBiZSB3b3JrZWQgYXJvdW5kIGJ5IGNoYW5naW5nCisgKiB0aGUgaW5saW5lIGFzc2VtYmx5IGNvbnN0cmFpbnQgZnJvbSA9ZyB0byA9ciwgaW4gdGhpcyBwYXJ0aWN1bGFyCisgKiBjYXNlIGVpdGhlciBpcyB2YWxpZC4KKyAqLwogI2RlZmluZSBSRUxPQ19ISURFKHB0ciwgb2ZmKQkJCQkJXAogICAoeyB1bnNpZ25lZCBsb25nIF9fcHRyOwkJCQkJXAotICAgIF9fYXNtX18gKCIiIDogIj1nIihfX3B0cikgOiAiMCIocHRyKSk7CQlcCisgICAgX19hc21fXyAoIiIgOiAiPXIiKF9fcHRyKSA6ICIwIihwdHIpKTsJCVwKICAgICAodHlwZW9mKHB0cikpIChfX3B0ciArIChvZmYpKTsgfSkKKworCisjZGVmaW5lIGlubGluZQkJaW5saW5lCQlfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKKyNkZWZpbmUgX19pbmxpbmVfXwlfX2lubGluZV9fCV9fYXR0cmlidXRlX18oKGFsd2F5c19pbmxpbmUpKQorI2RlZmluZSBfX2lubGluZQlfX2lubGluZQlfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKKyNkZWZpbmUgX19kZXByZWNhdGVkCQkJX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpCisjZGVmaW5lICBub2lubGluZQkJCV9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKKyNkZWZpbmUgX19hdHRyaWJ1dGVfcHVyZV9fCQlfX2F0dHJpYnV0ZV9fKChwdXJlKSkKKyNkZWZpbmUgX19hdHRyaWJ1dGVfY29uc3RfXwkJX19hdHRyaWJ1dGVfXygoX19jb25zdF9fKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29tcGlsZXItZ2NjMi5oIGIvaW5jbHVkZS9saW51eC9jb21waWxlci1nY2MyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZWQxNzY2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvY29tcGlsZXItZ2NjMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyogTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkuICBJbmNsdWRlIDxsaW51eC9jb21waWxlci5oPiBpbnN0ZWFkLiAgKi8KLQotLyogVGhlc2UgZGVmaW5pdGlvbnMgYXJlIGZvciBHQ0MgdjIueC4gICovCi0KLS8qIFNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBHQ0MgMi45NiBkZXZlbG9wbWVudCBjeWNsZSwgd2UgaW1wbGVtZW50ZWQKLSAgIGEgbWVjaGFuaXNtIGJ5IHdoaWNoIHRoZSB1c2VyIGNhbiBhbm5vdGF0ZSBsaWtlbHkgYnJhbmNoIGRpcmVjdGlvbnMgYW5kCi0gICBleHBlY3QgdGhlIGJsb2NrcyB0byBiZSByZW9yZGVyZWQgYXBwcm9wcmlhdGVseS4gIERlZmluZSBfX2J1aWx0aW5fZXhwZWN0Ci0gICB0byBub3RoaW5nIGZvciBlYXJsaWVyIGNvbXBpbGVycy4gICovCi0jaW5jbHVkZSA8bGludXgvY29tcGlsZXItZ2NjLmg+Ci0KLSNpZiBfX0dOVUNfTUlOT1JfXyA8IDk2Ci0jIGRlZmluZSBfX2J1aWx0aW5fZXhwZWN0KHgsIGV4cGVjdGVkX3ZhbHVlKSAoeCkKLSNlbmRpZgotCi0jZGVmaW5lIF9fYXR0cmlidXRlX3VzZWRfXwlfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkKLQotLyoKLSAqIFRoZSBhdHRyaWJ1dGUgYHB1cmUnIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiBHQ0MgdmVyc2lvbnMgZWFybGllcgotICogdGhhbiAyLjk2LgotICovCi0jaWYgX19HTlVDX01JTk9SX18gPj0gOTYKLSMgZGVmaW5lIF9fYXR0cmlidXRlX3B1cmVfXwlfX2F0dHJpYnV0ZV9fKChwdXJlKSkKLSMgZGVmaW5lIF9fYXR0cmlidXRlX2NvbnN0X18JX19hdHRyaWJ1dGVfXygoX19jb25zdF9fKSkKLSNlbmRpZgotCi0vKiBHQ0MgMi45NS54LzIuOTYgcmVjb2duaXplIF9fdmFfY29weSwgYnV0IG5vdCB2YV9jb3B5LiBBY3R1YWxseSBsYXRlciBHQ0MncwotICogZGVmaW5lIGJvdGggdmFfY29weSBhbmQgX192YV9jb3B5LCBidXQgdGhlIGxhdHRlciBtYXkgZ28gYXdheSwgc28gbGltaXQgdGhpcwotICogdG8gdGhpcyBoZWFkZXIgKi8KLSNkZWZpbmUgdmFfY29weQkJCV9fdmFfY29weQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb21waWxlci1nY2MzLmggYi9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLWdjYzMuaAppbmRleCBhNmZhNjE1Li4xNjk4Yjg0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLWdjYzMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLWdjYzMuaApAQCAtMywzMCArMywxNCBAQAogLyogVGhlc2UgZGVmaW5pdGlvbnMgYXJlIGZvciBHQ0MgdjMueC4gICovCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXItZ2NjLmg+CiAKLSNpZiBfX0dOVUNfTUlOT1JfXyA+PSAxCi0jIGRlZmluZSBpbmxpbmUJCWlubGluZQkJX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpCi0jIGRlZmluZSBfX2lubGluZV9fCV9faW5saW5lX18JX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpCi0jIGRlZmluZSBfX2lubGluZQlfX2lubGluZQlfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKLSNlbmRpZgotCi0jaWYgX19HTlVDX01JTk9SX18gPiAwCi0jIGRlZmluZSBfX2RlcHJlY2F0ZWQJCV9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKQotI2VuZGlmCi0KICNpZiBfX0dOVUNfTUlOT1JfXyA+PSAzCiAjIGRlZmluZSBfX2F0dHJpYnV0ZV91c2VkX18JX19hdHRyaWJ1dGVfXygoX191c2VkX18pKQogI2Vsc2UKICMgZGVmaW5lIF9fYXR0cmlidXRlX3VzZWRfXwlfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkKICNlbmRpZgogCi0jZGVmaW5lIF9fYXR0cmlidXRlX3B1cmVfXwlfX2F0dHJpYnV0ZV9fKChwdXJlKSkKLSNkZWZpbmUgX19hdHRyaWJ1dGVfY29uc3RfXwlfX2F0dHJpYnV0ZV9fKChfX2NvbnN0X18pKQotCi0jaWYgX19HTlVDX01JTk9SX18gPj0gMQotI2RlZmluZSAgbm9pbmxpbmUJCV9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKLSNlbmRpZgotCiAjaWYgX19HTlVDX01JTk9SX18gPj0gNAogI2RlZmluZSBfX211c3RfY2hlY2sJCV9fYXR0cmlidXRlX18oKHdhcm5fdW51c2VkX3Jlc3VsdCkpCiAjZW5kaWYKIAorI2RlZmluZSBfX2Fsd2F5c19pbmxpbmUJCWlubGluZSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29tcGlsZXItZ2NjNC5oIGIvaW5jbHVkZS9saW51eC9jb21waWxlci1nY2M0LmgKaW5kZXggNTM2ODZjMC4uNmY1Y2M2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb21waWxlci1nY2M0LmgKKysrIGIvaW5jbHVkZS9saW51eC9jb21waWxlci1nY2M0LmgKQEAgLTMsMTQgKzMsMTYgQEAKIC8qIFRoZXNlIGRlZmluaXRpb25zIGFyZSBmb3IgR0NDIHY0LnguICAqLwogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLWdjYy5oPgogCi0jZGVmaW5lIGlubGluZQkJCWlubGluZQkJX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpCi0jZGVmaW5lIF9faW5saW5lX18JCV9faW5saW5lX18JX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpCi0jZGVmaW5lIF9faW5saW5lCQlfX2lubGluZQlfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKLSNkZWZpbmUgX19kZXByZWNhdGVkCQlfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkKKyNpZmRlZiBDT05GSUdfRk9SQ0VEX0lOTElOSU5HCisjIHVuZGVmIGlubGluZQorIyB1bmRlZiBfX2lubGluZV9fCisjIHVuZGVmIF9faW5saW5lCisjIGRlZmluZSBpbmxpbmUJCQlpbmxpbmUJCV9fYXR0cmlidXRlX18oKGFsd2F5c19pbmxpbmUpKQorIyBkZWZpbmUgX19pbmxpbmVfXwkJX19pbmxpbmVfXwlfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKKyMgZGVmaW5lIF9faW5saW5lCQlfX2lubGluZQlfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKKyNlbmRpZgorCiAjZGVmaW5lIF9fYXR0cmlidXRlX3VzZWRfXwlfX2F0dHJpYnV0ZV9fKChfX3VzZWRfXykpCi0jZGVmaW5lIF9fYXR0cmlidXRlX3B1cmVfXwlfX2F0dHJpYnV0ZV9fKChwdXJlKSkKLSNkZWZpbmUgX19hdHRyaWJ1dGVfY29uc3RfXwlfX2F0dHJpYnV0ZV9fKChfX2NvbnN0X18pKQotI2RlZmluZSAgbm9pbmxpbmUJCV9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKICNkZWZpbmUgX19tdXN0X2NoZWNrIAkJX19hdHRyaWJ1dGVfXygod2Fybl91bnVzZWRfcmVzdWx0KSkKICNkZWZpbmUgX19jb21waWxlcl9vZmZzZXRvZihhLGIpIF9fYnVpbHRpbl9vZmZzZXRvZihhLGIpCi0KKyNkZWZpbmUgX19hbHdheXNfaW5saW5lCQlpbmxpbmUgX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLmggYi9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLmgKaW5kZXggZDczNzgyMS4uZjIzZDNjNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb21waWxlci5oCisrKyBiL2luY2x1ZGUvbGludXgvY29tcGlsZXIuaApAQCAtNDIsOCArNDIsNiBAQAogIyBpbmNsdWRlIDxsaW51eC9jb21waWxlci1nY2M0Lmg+CiAjZWxpZiBfX0dOVUNfXyA9PSAzCiAjIGluY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLWdjYzMuaD4KLSNlbGlmIF9fR05VQ19fID09IDIKLSMgaW5jbHVkZSA8bGludXgvY29tcGlsZXItZ2NjMi5oPgogI2Vsc2UKICMgZXJyb3IgU29ycnksIHlvdXIgY29tcGlsZXIgaXMgdG9vIG9sZC9ub3QgcmVjb2duaXplZC4KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVzZXQuaCBiL2luY2x1ZGUvbGludXgvY3B1c2V0LmgKaW5kZXggNmUyZGVlZi4uM2JjNjA2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHVzZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdXNldC5oCkBAIC0xNCwyMiArMTQsNDYgQEAKIAogI2lmZGVmIENPTkZJR19DUFVTRVRTCiAKK2V4dGVybiBpbnQgbnVtYmVyX29mX2NwdXNldHM7CS8qIEhvdyBtYW55IGNwdXNldHMgYXJlIGRlZmluZWQgaW4gc3lzdGVtPyAqLworCitleHRlcm4gaW50IGNwdXNldF9pbml0X2Vhcmx5KHZvaWQpOwogZXh0ZXJuIGludCBjcHVzZXRfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIGNwdXNldF9pbml0X3NtcCh2b2lkKTsKIGV4dGVybiB2b2lkIGNwdXNldF9mb3JrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiBleHRlcm4gdm9pZCBjcHVzZXRfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwotZXh0ZXJuIGNwdW1hc2tfdCBjcHVzZXRfY3B1c19hbGxvd2VkKGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CitleHRlcm4gY3B1bWFza190IGNwdXNldF9jcHVzX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKK2V4dGVybiBub2RlbWFza190IGNwdXNldF9tZW1zX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKIHZvaWQgY3B1c2V0X2luaXRfY3VycmVudF9tZW1zX2FsbG93ZWQodm9pZCk7Ci12b2lkIGNwdXNldF91cGRhdGVfY3VycmVudF9tZW1zX2FsbG93ZWQodm9pZCk7Ci12b2lkIGNwdXNldF9yZXN0cmljdF90b19tZW1zX2FsbG93ZWQodW5zaWduZWQgbG9uZyAqbm9kZXMpOwordm9pZCBjcHVzZXRfdXBkYXRlX3Rhc2tfbWVtb3J5X3N0YXRlKHZvaWQpOworI2RlZmluZSBjcHVzZXRfbm9kZXNfc3Vic2V0X2N1cnJlbnRfbWVtc19hbGxvd2VkKG5vZGVzKSBcCisJCW5vZGVzX3N1YnNldCgobm9kZXMpLCBjdXJyZW50LT5tZW1zX2FsbG93ZWQpCiBpbnQgY3B1c2V0X3pvbmVsaXN0X3ZhbGlkX21lbXNfYWxsb3dlZChzdHJ1Y3Qgem9uZWxpc3QgKnpsKTsKLWV4dGVybiBpbnQgY3B1c2V0X3pvbmVfYWxsb3dlZChzdHJ1Y3Qgem9uZSAqeiwgZ2ZwX3QgZ2ZwX21hc2spOworCitleHRlcm4gaW50IF9fY3B1c2V0X3pvbmVfYWxsb3dlZChzdHJ1Y3Qgem9uZSAqeiwgZ2ZwX3QgZ2ZwX21hc2spOworc3RhdGljIGludCBpbmxpbmUgY3B1c2V0X3pvbmVfYWxsb3dlZChzdHJ1Y3Qgem9uZSAqeiwgZ2ZwX3QgZ2ZwX21hc2spCit7CisJcmV0dXJuIG51bWJlcl9vZl9jcHVzZXRzIDw9IDEgfHwgX19jcHVzZXRfem9uZV9hbGxvd2VkKHosIGdmcF9tYXNrKTsKK30KKwogZXh0ZXJuIGludCBjcHVzZXRfZXhjbF9ub2Rlc19vdmVybGFwKGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CisKKyNkZWZpbmUgY3B1c2V0X21lbW9yeV9wcmVzc3VyZV9idW1wKCkgCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJaWYgKGNwdXNldF9tZW1vcnlfcHJlc3N1cmVfZW5hYmxlZCkJCVwKKwkJCV9fY3B1c2V0X21lbW9yeV9wcmVzc3VyZV9idW1wKCk7CVwKKwl9IHdoaWxlICgwKQorZXh0ZXJuIGludCBjcHVzZXRfbWVtb3J5X3ByZXNzdXJlX2VuYWJsZWQ7CitleHRlcm4gdm9pZCBfX2NwdXNldF9tZW1vcnlfcHJlc3N1cmVfYnVtcCh2b2lkKTsKKwogZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19jcHVzZXRfb3BlcmF0aW9uczsKIGV4dGVybiBjaGFyICpjcHVzZXRfdGFza19zdGF0dXNfYWxsb3dlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKmJ1ZmZlcik7CiAKK2V4dGVybiB2b2lkIGNwdXNldF9sb2NrKHZvaWQpOworZXh0ZXJuIHZvaWQgY3B1c2V0X3VubG9jayh2b2lkKTsKKwogI2Vsc2UgLyogIUNPTkZJR19DUFVTRVRTICovCiAKK3N0YXRpYyBpbmxpbmUgaW50IGNwdXNldF9pbml0X2Vhcmx5KHZvaWQpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgaW50IGNwdXNldF9pbml0KHZvaWQpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBjcHVzZXRfaW5pdF9zbXAodm9pZCkge30KIHN0YXRpYyBpbmxpbmUgdm9pZCBjcHVzZXRfZm9yayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApIHt9CkBAIC00MCw5ICs2NCwxNCBAQAogCXJldHVybiBjcHVfcG9zc2libGVfbWFwOwogfQogCitzdGF0aWMgaW5saW5lIG5vZGVtYXNrX3QgY3B1c2V0X21lbXNfYWxsb3dlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcmV0dXJuIG5vZGVfcG9zc2libGVfbWFwOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgY3B1c2V0X2luaXRfY3VycmVudF9tZW1zX2FsbG93ZWQodm9pZCkge30KLXN0YXRpYyBpbmxpbmUgdm9pZCBjcHVzZXRfdXBkYXRlX2N1cnJlbnRfbWVtc19hbGxvd2VkKHZvaWQpIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgY3B1c2V0X3Jlc3RyaWN0X3RvX21lbXNfYWxsb3dlZCh1bnNpZ25lZCBsb25nICpub2Rlcykge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVzZXRfdXBkYXRlX3Rhc2tfbWVtb3J5X3N0YXRlKHZvaWQpIHt9CisjZGVmaW5lIGNwdXNldF9ub2Rlc19zdWJzZXRfY3VycmVudF9tZW1zX2FsbG93ZWQobm9kZXMpICgxKQogCiBzdGF0aWMgaW5saW5lIGludCBjcHVzZXRfem9uZWxpc3RfdmFsaWRfbWVtc19hbGxvd2VkKHN0cnVjdCB6b25lbGlzdCAqemwpCiB7CkBAIC01OSwxMiArODgsMTcgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGNwdXNldF9tZW1vcnlfcHJlc3N1cmVfYnVtcCh2b2lkKSB7fQorCiBzdGF0aWMgaW5saW5lIGNoYXIgKmNwdXNldF90YXNrX3N0YXR1c19hbGxvd2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKIAkJCQkJCQljaGFyICpidWZmZXIpCiB7CiAJcmV0dXJuIGJ1ZmZlcjsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGNwdXNldF9sb2NrKHZvaWQpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgY3B1c2V0X3VubG9jayh2b2lkKSB7fQorCiAjZW5kaWYgLyogIUNPTkZJR19DUFVTRVRTICovCiAKICNlbmRpZiAvKiBfTElOVVhfQ1BVU0VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3J5cHRvLmggYi9pbmNsdWRlL2xpbnV4L2NyeXB0by5oCmluZGV4IDNjODlkZjYuLmQ4OGJmOGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3J5cHRvLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcnlwdG8uaApAQCAtMyw2ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICogQ29weXJpZ2h0IChjKSAyMDA1IEhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4KICAqCiAgKiBQb3J0aW9ucyBkZXJpdmVkIGZyb20gQ3J5cHRvYXBpLCBieSBBbGV4YW5kZXIgS2plbGRhYXMgPGFzdG9yQGZhc3Qubm8+CiAgKiBhbmQgTmV0dGxlLCBieSBOaWVscyBN9mxsZXIuCkBAIC0xMjYsNyArMTI3LDExIEBACiAJdW5zaWduZWQgaW50IGNyYV9ibG9ja3NpemU7CiAJdW5zaWduZWQgaW50IGNyYV9jdHhzaXplOwogCXVuc2lnbmVkIGludCBjcmFfYWxpZ25tYXNrOworCisJaW50IGNyYV9wcmlvcml0eTsKKwogCWNvbnN0IGNoYXIgY3JhX25hbWVbQ1JZUFRPX01BWF9BTEdfTkFNRV07CisJY29uc3QgY2hhciBjcmFfZHJpdmVyX25hbWVbQ1JZUFRPX01BWF9BTEdfTkFNRV07CiAKIAl1bmlvbiB7CiAJCXN0cnVjdCBjaXBoZXJfYWxnIGNpcGhlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3ljeF94MjUuaCBiL2luY2x1ZGUvbGludXgvY3ljeF94MjUuaAppbmRleCBiMTBhN2YzLi5mN2E5MDY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2N5Y3hfeDI1LmgKKysrIGIvaW5jbHVkZS9saW51eC9jeWN4X3gyNS5oCkBAIC0zOCwxMSArMzgsMTEgQEAKIC8qIERhdGEgU3RydWN0dXJlcyAqLwogLyogWC4yNSBDb21tYW5kIEJsb2NrLiAqLwogc3RydWN0IGN5Y3hfeDI1X2NtZCB7Ci0JdTE2IGNvbW1hbmQgUEFDS0VEOwotCXUxNiBsaW5rICAgIFBBQ0tFRDsgLyogdmFsdWVzOiAwIG9yIDEgKi8KLQl1MTYgbGVuICAgICBQQUNLRUQ7IC8qIHZhbHVlczogMCB0aHJ1IDB4MjA1ICg1MTcpICovCi0JdTMyIGJ1ZiAgICAgUEFDS0VEOwotfTsKKwl1MTYgY29tbWFuZDsKKwl1MTYgbGluazsJLyogdmFsdWVzOiAwIG9yIDEgKi8KKwl1MTYgbGVuOwkvKiB2YWx1ZXM6IDAgdGhydSAweDIwNSAoNTE3KSAqLworCXUzMiBidWY7Cit9IFBBQ0tFRDsKIAogLyogRGVmaW5lcyBmb3IgdGhlICdjb21tYW5kJyBmaWVsZC4gKi8KICNkZWZpbmUgWDI1X0NPTk5FQ1RfUkVRVUVTVCAgICAgICAgICAgICAweDQ0MDEKQEAgLTkyLDM0ICs5MiwzNCBAQAogICoJQGZsYWdzIC0gc2VlIGRvc3gyNS5kb2MsIGluIHBvcnR1Z3Vlc2UsIGZvciBkZXRhaWxzCiAgKi8KIHN0cnVjdCBjeWN4X3gyNV9jb25maWcgewotCXU4ICBsaW5rCVBBQ0tFRDsKLQl1OCAgc3BlZWQJUEFDS0VEOwotCXU4ICBjbG9jawlQQUNLRUQ7Ci0JdTggIG4yCQlQQUNLRUQ7Ci0JdTggIG4yd2luCVBBQ0tFRDsKLQl1OCAgbjN3aW4JUEFDS0VEOwotCXU4ICBudmMJCVBBQ0tFRDsKLQl1OCAgcGt0bGVuCVBBQ0tFRDsKLQl1OCAgbG9jYWRkcglQQUNLRUQ7Ci0JdTggIHJlbWFkZHIJUEFDS0VEOwotCXUxNiB0MQkJUEFDS0VEOwotCXUxNiB0MgkJUEFDS0VEOwotCXU4ICB0MjEJCVBBQ0tFRDsKLQl1OCAgbnB2YwlQQUNLRUQ7Ci0JdTggIHQyMwkJUEFDS0VEOwotCXU4ICBmbGFncwlQQUNLRUQ7Ci19OworCXU4ICBsaW5rOworCXU4ICBzcGVlZDsKKwl1OCAgY2xvY2s7CisJdTggIG4yOworCXU4ICBuMndpbjsKKwl1OCAgbjN3aW47CisJdTggIG52YzsKKwl1OCAgcGt0bGVuOworCXU4ICBsb2NhZGRyOworCXU4ICByZW1hZGRyOworCXUxNiB0MTsKKwl1MTYgdDI7CisJdTggIHQyMTsKKwl1OCAgbnB2YzsKKwl1OCAgdDIzOworCXU4ICBmbGFnczsKK30gUEFDS0VEOwogCiBzdHJ1Y3QgY3ljeF94MjVfc3RhdHMgewotCXUxNiByeF9jcmNfZXJyb3JzCVBBQ0tFRDsKLQl1MTYgcnhfb3Zlcl9lcnJvcnMJUEFDS0VEOwotCXUxNiBuMl90eF9mcmFtZXMgCVBBQ0tFRDsKLQl1MTYgbjJfcnhfZnJhbWVzIAlQQUNLRUQ7Ci0JdTE2IHR4X3RpbWVvdXRzIAlQQUNLRUQ7Ci0JdTE2IHJ4X3RpbWVvdXRzIAlQQUNLRUQ7Ci0JdTE2IG4zX3R4X3BhY2tldHMgCVBBQ0tFRDsKLQl1MTYgbjNfcnhfcGFja2V0cyAJUEFDS0VEOwotCXUxNiB0eF9hYm9ydHMJIAlQQUNLRUQ7Ci0JdTE2IHJ4X2Fib3J0cwkgCVBBQ0tFRDsKLX07CisJdTE2IHJ4X2NyY19lcnJvcnM7CisJdTE2IHJ4X292ZXJfZXJyb3JzOworCXUxNiBuMl90eF9mcmFtZXM7CisJdTE2IG4yX3J4X2ZyYW1lczsKKwl1MTYgdHhfdGltZW91dHM7CisJdTE2IHJ4X3RpbWVvdXRzOworCXUxNiBuM190eF9wYWNrZXRzOworCXUxNiBuM19yeF9wYWNrZXRzOworCXUxNiB0eF9hYm9ydHM7CisJdTE2IHJ4X2Fib3J0czsKK30gUEFDS0VEOwogI2VuZGlmCS8qIF9DWUNYX1gyNV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oIGIvaW5jbHVkZS9saW51eC9kY2FjaGUuaAppbmRleCA0NmEyYmE2Li5hM2VkNWUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGNhY2hlLmgKQEAgLTk1LDE0ICs5NSwxOSBAQAogCXN0cnVjdCBxc3RyIGRfbmFtZTsKIAogCXN0cnVjdCBsaXN0X2hlYWQgZF9scnU7CQkvKiBMUlUgbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgZF9jaGlsZDsJLyogY2hpbGQgb2YgcGFyZW50IGxpc3QgKi8KKwkvKgorCSAqIGRfY2hpbGQgYW5kIGRfcmN1IGNhbiBzaGFyZSBtZW1vcnkKKwkgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBsaXN0X2hlYWQgZF9jaGlsZDsJLyogY2hpbGQgb2YgcGFyZW50IGxpc3QgKi8KKwkgCXN0cnVjdCByY3VfaGVhZCBkX3JjdTsKKwl9IGRfdTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRfc3ViZGlyczsJLyogb3VyIGNoaWxkcmVuICovCiAJc3RydWN0IGxpc3RfaGVhZCBkX2FsaWFzOwkvKiBpbm9kZSBhbGlhcyBsaXN0ICovCiAJdW5zaWduZWQgbG9uZyBkX3RpbWU7CQkvKiB1c2VkIGJ5IGRfcmV2YWxpZGF0ZSAqLwogCXN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyAqZF9vcDsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmRfc2I7CS8qIFRoZSByb290IG9mIHRoZSBkZW50cnkgdHJlZSAqLwogCXZvaWQgKmRfZnNkYXRhOwkJCS8qIGZzLXNwZWNpZmljIGRhdGEgKi8KLSAJc3RydWN0IHJjdV9oZWFkIGRfcmN1OwogCXN0cnVjdCBkY29va2llX3N0cnVjdCAqZF9jb29raWU7IC8qIGNvb2tpZSwgaWYgYW55ICovCiAJaW50IGRfbW91bnRlZDsKIAl1bnNpZ25lZCBjaGFyIGRfaW5hbWVbRE5BTUVfSU5MSU5FX0xFTl9NSU5dOwkvKiBzbWFsbCBuYW1lcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKaW5kZXggMGNkZWU3OGUuLjU4ZGYxOGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaApAQCAtNDksNiArNDksOSBAQAogCWludAkJKCptYXRjaCkoc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKiBkcnYpOwogCWludAkJKCp1ZXZlbnQpKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqKmVudnAsCiAJCQkJICBpbnQgbnVtX2VudnAsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKTsKKwlpbnQJCSgqcHJvYmUpKHN0cnVjdCBkZXZpY2UgKiBkZXYpOworCWludAkJKCpyZW1vdmUpKHN0cnVjdCBkZXZpY2UgKiBkZXYpOworCXZvaWQJCSgqc2h1dGRvd24pKHN0cnVjdCBkZXZpY2UgKiBkZXYpOwogCWludAkJKCpzdXNwZW5kKShzdHJ1Y3QgZGV2aWNlICogZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwogCWludAkJKCpyZXN1bWUpKHN0cnVjdCBkZXZpY2UgKiBkZXYpOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG1pLmggYi9pbmNsdWRlL2xpbnV4L2RtaS5oCmluZGV4IDA1ZjQxMzIuLjJlNmJiZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG1pLmgKKysrIGIvaW5jbHVkZS9saW51eC9kbWkuaApAQCAtMiw2ICsyLDcgQEAKICNkZWZpbmUgX19ETUlfSF9fCiAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAKIGVudW0gZG1pX2ZpZWxkIHsKIAlETUlfTk9ORSwKQEAgLTYwLDEyICs2MSwxNCBAQAogCXZvaWQgKmRldmljZV9kYXRhOwkvKiBUeXBlIHNwZWNpZmljIGRhdGEgKi8KIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19YODZfMzIpCisjaWZkZWYgQ09ORklHX0RNSQogCiBleHRlcm4gaW50IGRtaV9jaGVja19zeXN0ZW0oc3RydWN0IGRtaV9zeXN0ZW1faWQgKmxpc3QpOwogZXh0ZXJuIGNoYXIgKiBkbWlfZ2V0X3N5c3RlbV9pbmZvKGludCBmaWVsZCk7CiBleHRlcm4gc3RydWN0IGRtaV9kZXZpY2UgKiBkbWlfZmluZF9kZXZpY2UoaW50IHR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsCiAJc3RydWN0IGRtaV9kZXZpY2UgKmZyb20pOworZXh0ZXJuIHZvaWQgZG1pX3NjYW5fbWFjaGluZSh2b2lkKTsKKwogI2Vsc2UKIAogc3RhdGljIGlubGluZSBpbnQgZG1pX2NoZWNrX3N5c3RlbShzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqbGlzdCkgeyByZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kdmIvZnJvbnRlbmQuaCBiL2luY2x1ZGUvbGludXgvZHZiL2Zyb250ZW5kLmgKaW5kZXggZDQxZGY3MC4uYzhjYmQ5MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kdmIvZnJvbnRlbmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2R2Yi9mcm9udGVuZC5oCkBAIC0yNDAsNiArMjQwLDE1IEBACiB9OwogCiAKKy8qKgorICogV2hlbiBzZXQsIHRoaXMgZmxhZyB3aWxsIGRpc2FibGUgYW55IHppZ3phZ2dpbmcgb3Igb3RoZXIgIm5vcm1hbCIgdHVuaW5nCisgKiBiZWhhdmlvdXIuIEFkZGl0aW9uYWxseSwgdGhlcmUgd2lsbCBiZSBubyBhdXRvbWF0aWMgbW9uaXRvcmluZyBvZiB0aGUgbG9jaworICogc3RhdHVzLCBhbmQgaGVuY2Ugbm8gZnJvbnRlbmQgZXZlbnRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBJZiBhIGZyb250ZW5kIGRldmljZQorICogaXMgY2xvc2VkLCB0aGlzIGZsYWcgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvZmYgd2hlbiB0aGUgZGV2aWNlIGlzCisgKiByZW9wZW5lZCByZWFkLXdyaXRlLgorICovCisjZGVmaW5lIEZFX1RVTkVfTU9ERV9PTkVTSE9UIDB4MDEKKwogCiAjZGVmaW5lIEZFX0dFVF9JTkZPCQkgICBfSU9SKCdvJywgNjEsIHN0cnVjdCBkdmJfZnJvbnRlbmRfaW5mbykKIApAQCAtMjYwLDYgKzI2OSw3IEBACiAKICNkZWZpbmUgRkVfU0VUX0ZST05URU5ECQkgICBfSU9XKCdvJywgNzYsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycykKICNkZWZpbmUgRkVfR0VUX0ZST05URU5ECQkgICBfSU9SKCdvJywgNzcsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycykKKyNkZWZpbmUgRkVfU0VUX0ZST05URU5EX1RVTkVfTU9ERSAgX0lPKCdvJywgODEpIC8qIHVuc2lnbmVkIGludCAqLwogI2RlZmluZSBGRV9HRVRfRVZFTlQJCSAgIF9JT1IoJ28nLCA3OCwgc3RydWN0IGR2Yl9mcm9udGVuZF9ldmVudCkKIAogI2RlZmluZSBGRV9ESVNITkVUV09SS19TRU5EX0xFR0FDWV9DTUQgX0lPKCdvJywgODApIC8qIHVuc2lnbmVkIGludCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9lbGV2YXRvci5oIGIvaW5jbHVkZS9saW51eC9lbGV2YXRvci5oCmluZGV4IGZiODBmYTQuLjIzZmU3NDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaAorKysgYi9pbmNsdWRlL2xpbnV4L2VsZXZhdG9yLmgKQEAgLTY2LDcgKzY2LDcgQEAKIH07CiAKIC8qCi0gKiBlYWNoIHF1ZXVlIGhhcyBhbiBlbGV2YXRvcl9xdWV1ZSBhc3NvaWNhdGVkIHdpdGggaXQKKyAqIGVhY2ggcXVldWUgaGFzIGFuIGVsZXZhdG9yX3F1ZXVlIGFzc29jaWF0ZWQgd2l0aCBpdAogICovCiBzdHJ1Y3QgZWxldmF0b3JfcXVldWUKIHsKQEAgLTExNCw4ICsxMTQsNiBAQAogZXh0ZXJuIGludCBlbGV2YXRvcl9pbml0KHJlcXVlc3RfcXVldWVfdCAqLCBjaGFyICopOwogZXh0ZXJuIHZvaWQgZWxldmF0b3JfZXhpdChlbGV2YXRvcl90ICopOwogZXh0ZXJuIGludCBlbHZfcnFfbWVyZ2Vfb2soc3RydWN0IHJlcXVlc3QgKiwgc3RydWN0IGJpbyAqKTsKLWV4dGVybiBpbnQgZWx2X3RyeV9tZXJnZShzdHJ1Y3QgcmVxdWVzdCAqLCBzdHJ1Y3QgYmlvICopOwotZXh0ZXJuIGludCBlbHZfdHJ5X2xhc3RfbWVyZ2UocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCBiaW8gKik7CiAKIC8qCiAgKiBSZXR1cm4gdmFsdWVzIGZyb20gZWxldmF0b3IgbWVyZ2VyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2VsZi5oIGIvaW5jbHVkZS9saW51eC9lbGYuaAppbmRleCBmZjk1NWRiLi5kM2JmYWNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2VsZi5oCisrKyBiL2luY2x1ZGUvbGludXgvZWxmLmgKQEAgLTE1MSw2ICsxNTEsOCBAQAogI2RlZmluZSBTVFRfRlVOQyAgICAyCiAjZGVmaW5lIFNUVF9TRUNUSU9OIDMKICNkZWZpbmUgU1RUX0ZJTEUgICAgNAorI2RlZmluZSBTVFRfQ09NTU9OICA1CisjZGVmaW5lIFNUVF9UTFMgICAgIDYKIAogI2RlZmluZSBFTEZfU1RfQklORCh4KQkJKCh4KSA+PiA0KQogI2RlZmluZSBFTEZfU1RfVFlQRSh4KQkJKCgodW5zaWduZWQgaW50KSB4KSAmIDB4ZikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0M19mc19pLmggYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnNfaS5oCmluZGV4IDI5MTRmN2IuLmU3MWRkOTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0M19mc19pLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzX2kuaApAQCAtODcsNyArODcsNyBAQAogI2lmZGVmIENPTkZJR19FWFQzX0ZTX1hBVFRSCiAJLyoKIAkgKiBFeHRlbmRlZCBhdHRyaWJ1dGVzIGNhbiBiZSByZWFkIGluZGVwZW5kZW50bHkgb2YgdGhlIG1haW4gZmlsZQotCSAqIGRhdGEuIFRha2luZyBpX3NlbSBldmVuIHdoZW4gcmVhZGluZyB3b3VsZCBjYXVzZSBjb250ZW50aW9uCisJICogZGF0YS4gVGFraW5nIGlfbXV0ZXggZXZlbiB3aGVuIHJlYWRpbmcgd291bGQgY2F1c2UgY29udGVudGlvbgogCSAqIGJldHdlZW4gcmVhZGVycyBvZiBFQXMgYW5kIHdyaXRlcnMgb2YgcmVndWxhciBmaWxlIGRhdGEsIHNvCiAJICogaW5zdGVhZCB3ZSBzeW5jaHJvbml6ZSBvbiB4YXR0cl9zZW0gd2hlbiByZWFkaW5nIG9yIGNoYW5naW5nCiAJICogRUFzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mYi5oIGIvaW5jbHVkZS9saW51eC9mYi5oCmluZGV4IGE5NzNiZTIuLjJjYjE5ZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZiLmgKQEAgLTYwOCwxNSArNjA4LDE1IEBACiAJaW50ICgqZmJfc3luYykoc3RydWN0IGZiX2luZm8gKmluZm8pOwogCiAJLyogcGVyZm9ybSBmYiBzcGVjaWZpYyBpb2N0bCAob3B0aW9uYWwpICovCi0JaW50ICgqZmJfaW9jdGwpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJdW5zaWduZWQgbG9uZyBhcmcsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKKwlpbnQgKCpmYl9pb2N0bCkoc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsCisJCQl1bnNpZ25lZCBsb25nIGFyZyk7CiAKIAkvKiBIYW5kbGUgMzJiaXQgY29tcGF0IGlvY3RsIChvcHRpb25hbCkgKi8KLQlsb25nICgqZmJfY29tcGF0X2lvY3RsKShzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywKLQkJCSAgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CisJaW50ICgqZmJfY29tcGF0X2lvY3RsKShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpOwogCiAJLyogcGVyZm9ybSBmYiBzcGVjaWZpYyBtbWFwICovCi0JaW50ICgqZmJfbW1hcCkoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisJaW50ICgqZmJfbW1hcCkoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKIAogCS8qIHNhdmUgY3VycmVudCBoYXJkd2FyZSBzdGF0ZSAqLwogCXZvaWQgKCpmYl9zYXZlX3N0YXRlKShzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZjbnRsLmggYi9pbmNsdWRlL2xpbnV4L2ZjbnRsLmgKaW5kZXggOGE3YzgyMS4uYzUyYTYzNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mY250bC5oCisrKyBiL2luY2x1ZGUvbGludXgvZmNudGwuaApAQCAtMjMsNiArMjMsMTMgQEAKICNkZWZpbmUgRE5fQVRUUklCCTB4MDAwMDAwMjAJLyogRmlsZSBjaGFuZ2VkIGF0dGlidXRlcyAqLwogI2RlZmluZSBETl9NVUxUSVNIT1QJMHg4MDAwMDAwMAkvKiBEb24ndCByZW1vdmUgbm90aWZpZXIgKi8KIAorI2RlZmluZSBBVF9GRENXRAkJLTEwMCAgICAvKiBTcGVjaWFsIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuYXQgc2hvdWxkIHVzZSB0aGUgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmcgZGlyZWN0b3J5LiAqLworI2RlZmluZSBBVF9TWU1MSU5LX05PRk9MTE9XCTB4MTAwICAgLyogRG8gbm90IGZvbGxvdyBzeW1ib2xpYyBsaW5rcy4gICovCisjZGVmaW5lIEFUX1JFTU9WRURJUgkJMHgyMDAgICAvKiBSZW1vdmUgZGlyZWN0b3J5IGluc3RlYWQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpbmtpbmcgZmlsZS4gICovCisKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNpZm5kZWYgZm9yY2Vfb19sYXJnZWZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaAppbmRleCAyYzljNDhkLi44NGJiNDQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9mcy5oCkBAIC05LDcgKzksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvcmN1cmVmLmg+CiAKIC8qCiAgKiBJdCdzIHNpbGx5IHRvIGhhdmUgTlJfT1BFTiBiaWdnZXIgdGhhbiBOUl9GSUxFLCBidXQgeW91IGNhbiBjaGFuZ2UKQEAgLTEwNCwxOSArMTAzLDE4IEBACiAjZGVmaW5lIE1TX01PVkUJCTgxOTIKICNkZWZpbmUgTVNfUkVDCQkxNjM4NAogI2RlZmluZSBNU19WRVJCT1NFCTMyNzY4CisjZGVmaW5lIE1TX1BPU0lYQUNMCSgxPDwxNikJLyogVkZTIGRvZXMgbm90IGFwcGx5IHRoZSB1bWFzayAqLwogI2RlZmluZSBNU19VTkJJTkRBQkxFCSgxPDwxNykJLyogY2hhbmdlIHRvIHVuYmluZGFibGUgKi8KICNkZWZpbmUgTVNfUFJJVkFURQkoMTw8MTgpCS8qIGNoYW5nZSB0byBwcml2YXRlICovCiAjZGVmaW5lIE1TX1NMQVZFCSgxPDwxOSkJLyogY2hhbmdlIHRvIHNsYXZlICovCiAjZGVmaW5lIE1TX1NIQVJFRAkoMTw8MjApCS8qIGNoYW5nZSB0byBzaGFyZWQgKi8KLSNkZWZpbmUgTVNfUE9TSVhBQ0wJKDE8PDE2KQkvKiBWRlMgZG9lcyBub3QgYXBwbHkgdGhlIHVtYXNrICovCiAjZGVmaW5lIE1TX0FDVElWRQkoMTw8MzApCiAjZGVmaW5lIE1TX05PVVNFUgkoMTw8MzEpCiAKIC8qCiAgKiBTdXBlcmJsb2NrIGZsYWdzIHRoYXQgY2FuIGJlIGFsdGVyZWQgYnkgTVNfUkVNT1VOVAogICovCi0jZGVmaW5lIE1TX1JNVF9NQVNLCShNU19SRE9OTFl8TVNfU1lOQ0hST05PVVN8TVNfTUFORExPQ0t8TVNfTk9BVElNRXxcCi0JCQkgTVNfTk9ESVJBVElNRSkKKyNkZWZpbmUgTVNfUk1UX01BU0sJKE1TX1JET05MWXxNU19TWU5DSFJPTk9VU3xNU19NQU5ETE9DSykKIAogLyoKICAqIE9sZCBtYWdpYyBtb3VudCBmbGFnIGFuZCBtYXNrCkBAIC0xNjIsOCArMTYwLDYgQEAKICNkZWZpbmUgSVNfTk9RVU9UQShpbm9kZSkJKChpbm9kZSktPmlfZmxhZ3MgJiBTX05PUVVPVEEpCiAjZGVmaW5lIElTX0FQUEVORChpbm9kZSkJKChpbm9kZSktPmlfZmxhZ3MgJiBTX0FQUEVORCkKICNkZWZpbmUgSVNfSU1NVVRBQkxFKGlub2RlKQkoKGlub2RlKS0+aV9mbGFncyAmIFNfSU1NVVRBQkxFKQotI2RlZmluZSBJU19OT0FUSU1FKGlub2RlKQkoX19JU19GTEcoaW5vZGUsIE1TX05PQVRJTUUpIHx8ICgoaW5vZGUpLT5pX2ZsYWdzICYgU19OT0FUSU1FKSkKLSNkZWZpbmUgSVNfTk9ESVJBVElNRShpbm9kZSkJX19JU19GTEcoaW5vZGUsIE1TX05PRElSQVRJTUUpCiAjZGVmaW5lIElTX1BPU0lYQUNMKGlub2RlKQlfX0lTX0ZMRyhpbm9kZSwgTVNfUE9TSVhBQ0wpCiAKICNkZWZpbmUgSVNfREVBRERJUihpbm9kZSkJKChpbm9kZSktPmlfZmxhZ3MgJiBTX0RFQUQpCkBAIC0yMjAsMTEgKzIxNiwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3ByaW9fdHJlZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAorc3RydWN0IGhkX2dlb21ldHJ5Owogc3RydWN0IGlvdmVjOwogc3RydWN0IG5hbWVpZGF0YTsKIHN0cnVjdCBraW9jYjsKQEAgLTIzNCw5ICsyMzIsNiBAQAogc3RydWN0IHZtX2FyZWFfc3RydWN0Owogc3RydWN0IHZmc21vdW50OwogCi0vKiBVc2VkIHRvIGJlIGEgbWFjcm8gd2hpY2gganVzdCBjYWxsZWQgdGhlIGZ1bmN0aW9uLCBub3cganVzdCBhIGZ1bmN0aW9uICovCi1leHRlcm4gdm9pZCB1cGRhdGVfYXRpbWUgKHN0cnVjdCBpbm9kZSAqKTsKLQogZXh0ZXJuIHZvaWQgX19pbml0IGlub2RlX2luaXQodW5zaWduZWQgbG9uZyk7CiBleHRlcm4gdm9pZCBfX2luaXQgaW5vZGVfaW5pdF9lYXJseSh2b2lkKTsKIGV4dGVybiB2b2lkIF9faW5pdCBtbnRfaW5pdCh1bnNpZ25lZCBsb25nKTsKQEAgLTQ4NCw3ICs0NzksNyBAQAogCXVuc2lnbmVkIGxvbmcJCWlfYmxvY2tzOwogCXVuc2lnbmVkIHNob3J0ICAgICAgICAgIGlfYnl0ZXM7CiAJc3BpbmxvY2tfdAkJaV9sb2NrOwkvKiBpX2Jsb2NrcywgaV9ieXRlcywgbWF5YmUgaV9zaXplICovCi0Jc3RydWN0IHNlbWFwaG9yZQlpX3NlbTsKKwlzdHJ1Y3QgbXV0ZXgJCWlfbXV0ZXg7CiAJc3RydWN0IHJ3X3NlbWFwaG9yZQlpX2FsbG9jX3NlbTsKIAlzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucwkqaV9vcDsKIAlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zCSppX2ZvcDsJLyogZm9ybWVyIC0+aV9vcC0+ZGVmYXVsdF9maWxlX29wcyAqLwpAQCAtNjUzLDcgKzY0OCw3IEBACiAjZGVmaW5lIGZpbGVfbGlzdF9sb2NrKCkgc3Bpbl9sb2NrKCZmaWxlc19sb2NrKTsKICNkZWZpbmUgZmlsZV9saXN0X3VubG9jaygpIHNwaW5fdW5sb2NrKCZmaWxlc19sb2NrKTsKIAotI2RlZmluZSBnZXRfZmlsZSh4KQlyY3VyZWZfaW5jKCYoeCktPmZfY291bnQpCisjZGVmaW5lIGdldF9maWxlKHgpCWF0b21pY19pbmMoJih4KS0+Zl9jb3VudCkKICNkZWZpbmUgZmlsZV9jb3VudCh4KQlhdG9taWNfcmVhZCgmKHgpLT5mX2NvdW50KQogCiAjZGVmaW5lCU1BWF9OT05fTEZTCSgoMVVMPDwzMSkgLSAxKQpAQCAtODA4LDcgKzgwMyw2IEBACiAJc3RydWN0IGxpc3RfaGVhZAlzX2xpc3Q7CQkvKiBLZWVwIHRoaXMgZmlyc3QgKi8KIAlkZXZfdAkJCXNfZGV2OwkJLyogc2VhcmNoIGluZGV4OyBfbm90XyBrZGV2X3QgKi8KIAl1bnNpZ25lZCBsb25nCQlzX2Jsb2Nrc2l6ZTsKLQl1bnNpZ25lZCBsb25nCQlzX29sZF9ibG9ja3NpemU7CiAJdW5zaWduZWQgY2hhcgkJc19ibG9ja3NpemVfYml0czsKIAl1bnNpZ25lZCBjaGFyCQlzX2RpcnQ7CiAJdW5zaWduZWQgbG9uZyBsb25nCXNfbWF4Ynl0ZXM7CS8qIE1heCBmaWxlIHNpemUgKi8KQEAgLTgyMSw3ICs4MTUsNyBAQAogCXVuc2lnbmVkIGxvbmcJCXNfbWFnaWM7CiAJc3RydWN0IGRlbnRyeQkJKnNfcm9vdDsKIAlzdHJ1Y3Qgcndfc2VtYXBob3JlCXNfdW1vdW50OwotCXN0cnVjdCBzZW1hcGhvcmUJc19sb2NrOworCXN0cnVjdCBtdXRleAkJc19sb2NrOwogCWludAkJCXNfY291bnQ7CiAJaW50CQkJc19zeW5jaW5nOwogCWludAkJCXNfbmVlZF9zeW5jX2ZzOwpAQCAtODkzLDEzICs4ODcsMTMgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsb2NrX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKQogewogCWdldF9mc19leGNsKCk7Ci0JZG93bigmc2ItPnNfbG9jayk7CisJbXV0ZXhfbG9jaygmc2ItPnNfbG9jayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1bmxvY2tfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCiB7CiAJcHV0X2ZzX2V4Y2woKTsKLQl1cCgmc2ItPnNfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZzYi0+c19sb2NrKTsKIH0KIAogLyoKQEAgLTk2Myw2ICs5NTcsNyBAQAogCWludCAoKmRpcmVjdF9hY2Nlc3MpIChzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIHNlY3Rvcl90LCB1bnNpZ25lZCBsb25nICopOwogCWludCAoKm1lZGlhX2NoYW5nZWQpIChzdHJ1Y3QgZ2VuZGlzayAqKTsKIAlpbnQgKCpyZXZhbGlkYXRlX2Rpc2spIChzdHJ1Y3QgZ2VuZGlzayAqKTsKKwlpbnQgKCpnZXRnZW8pKHN0cnVjdCBibG9ja19kZXZpY2UgKiwgc3RydWN0IGhkX2dlb21ldHJ5ICopOwogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwogfTsKIApAQCAtMTExNywxMiArMTExMiw3IEBACiAJX19tYXJrX2lub2RlX2RpcnR5KGlub2RlLCBJX0RJUlRZX1NZTkMpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdG91Y2hfYXRpbWUoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKLXsKLQkvKiBwZXItbW91bnRwb2ludCBjaGVja3Mgd2lsbCBnbyBoZXJlICovCi0JdXBkYXRlX2F0aW1lKGRlbnRyeS0+ZF9pbm9kZSk7Ci19Ci0KK2V4dGVybiB2b2lkIHRvdWNoX2F0aW1lKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOwogc3RhdGljIGlubGluZSB2b2lkIGZpbGVfYWNjZXNzZWQoc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJaWYgKCEoZmlsZS0+Zl9mbGFncyAmIE9fTk9BVElNRSkpCkBAIC0xMTkxLDcgKzExODEsNyBAQAogICogICAgZGlyZWN0b3J5LiAgVGhlIG5hbWUgc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgQG5hbWUgKHdpdGggdGhlCiAgKiAgICB1bmRlcnN0YW5kaW5nIHRoYXQgaXQgaXMgYWxyZWFkeSBwb2ludGluZyB0byBhIGEgJU5BTUVfTUFYKzEgc2l6ZWQKICAqICAgIGJ1ZmZlci4gICBnZXRfbmFtZSgpIHNob3VsZCByZXR1cm4gJTAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCi0gKiAgICBvciBlcnJvci4gIEBnZXRfbmFtZSB3aWxsIGJlIGNhbGxlZCB3aXRob3V0IEBwYXJlbnQtPmlfc2VtIGhlbGQuCisgKiAgICBvciBlcnJvci4gIEBnZXRfbmFtZSB3aWxsIGJlIGNhbGxlZCB3aXRob3V0IEBwYXJlbnQtPmlfbXV0ZXggaGVsZC4KICAqCiAgKiBnZXRfcGFyZW50OgogICogICAgQGdldF9wYXJlbnQgc2hvdWxkIGZpbmQgdGhlIHBhcmVudCBkaXJlY3RvcnkgZm9yIHRoZSBnaXZlbiBAY2hpbGQgd2hpY2gKQEAgLTEyMTMsNyArMTIwMyw3IEBACiAgKiAgICBuZnNkX2ZpbmRfZmhfZGVudHJ5KCkgaW4gZWl0aGVyIHRoZSBAb2JqIG9yIEBwYXJlbnQgcGFyYW1ldGVycy4KICAqCiAgKiBMb2NraW5nIHJ1bGVzOgotICogICAgZ2V0X3BhcmVudCBpcyBjYWxsZWQgd2l0aCBjaGlsZC0+ZF9pbm9kZS0+aV9zZW0gZG93bgorICogICAgZ2V0X3BhcmVudCBpcyBjYWxsZWQgd2l0aCBjaGlsZC0+ZF9pbm9kZS0+aV9tdXRleCBkb3duCiAgKiAgICBnZXRfbmFtZSBpcyBub3QgKHdoaWNoIGlzIHBvc3NpYmx5IGluY29uc2lzdGVudCkKICAqLwogCkBAIC0xMzAwLDYgKzEyOTAsOSBAQAogCiBleHRlcm4gaW50IHZmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBrc3RhdGZzICopOwogCisvKiAvc3lzL2ZzICovCitleHRlcm4gc3RydWN0IHN1YnN5c3RlbSBmc19zdWJzeXM7CisKICNkZWZpbmUgRkxPQ0tfVkVSSUZZX1JFQUQgIDEKICNkZWZpbmUgRkxPQ0tfVkVSSUZZX1dSSVRFIDIKIApAQCAtMTM0NSw4ICsxMzM4LDEwIEBACiAKIC8qIGZzL29wZW4uYyAqLwogCi1leHRlcm4gaW50IGRvX3RydW5jYXRlKHN0cnVjdCBkZW50cnkgKiwgbG9mZl90IHN0YXJ0LCBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1leHRlcm4gbG9uZyBkb19zeXNfb3Blbihjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsIGludCBmbGFncywgaW50IG1vZGUpOworZXh0ZXJuIGludCBkb190cnVuY2F0ZShzdHJ1Y3QgZGVudHJ5ICosIGxvZmZfdCBzdGFydCwgdW5zaWduZWQgaW50IHRpbWVfYXR0cnMsCisJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlscCk7CitleHRlcm4gbG9uZyBkb19zeXNfb3BlbihpbnQgZmRmLCBjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsIGludCBmbGFncywKKwkJCWludCBtb2RlKTsKIGV4dGVybiBzdHJ1Y3QgZmlsZSAqZmlscF9vcGVuKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpOwogZXh0ZXJuIHN0cnVjdCBmaWxlICogZGVudHJ5X29wZW4oc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgdmZzbW91bnQgKiwgaW50KTsKIGV4dGVybiBpbnQgZmlscF9jbG9zZShzdHJ1Y3QgZmlsZSAqLCBmbF9vd25lcl90IGlkKTsKQEAgLTEzOTIsNiArMTM4NywxMiBAQAogZXh0ZXJuIGludCB1bnJlZ2lzdGVyX2NocmRldih1bnNpZ25lZCBpbnQsIGNvbnN0IGNoYXIgKik7CiBleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2X3QsIHVuc2lnbmVkKTsKIGV4dGVybiBpbnQgY2hyZGV2X29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworZXh0ZXJuIGludCBnZXRfY2hyZGV2X2xpc3QoY2hhciAqKTsKK2V4dGVybiB2b2lkICphY3F1aXJlX2NocmRldl9saXN0KHZvaWQpOworZXh0ZXJuIGludCBjb3VudF9jaHJkZXZfbGlzdCh2b2lkKTsKK2V4dGVybiB2b2lkICpnZXRfbmV4dF9jaHJkZXYodm9pZCAqKTsKK2V4dGVybiBpbnQgZ2V0X2NocmRldl9pbmZvKHZvaWQgKiwgaW50ICosIGNoYXIgKiopOworZXh0ZXJuIHZvaWQgcmVsZWFzZV9jaHJkZXZfbGlzdCh2b2lkICopOwogCiAvKiBmcy9ibG9ja19kZXYuYyAqLwogI2RlZmluZSBCREVWTkFNRV9TSVpFCTMyCS8qIExhcmdlc3Qgc3RyaW5nIGZvciBhIGJsb2NrZGV2IGlkZW50aWZpZXIgKi8KQEAgLTE0MDAsNiArMTQwMSwxMSBAQAogZXh0ZXJuIHN0cnVjdCBibG9ja19kZXZpY2UgKmxvb2t1cF9iZGV2KGNvbnN0IGNoYXIgKik7CiBleHRlcm4gc3RydWN0IGJsb2NrX2RldmljZSAqb3Blbl9iZGV2X2V4Y2woY29uc3QgY2hhciAqLCBpbnQsIHZvaWQgKik7CiBleHRlcm4gdm9pZCBjbG9zZV9iZGV2X2V4Y2woc3RydWN0IGJsb2NrX2RldmljZSAqKTsKK2V4dGVybiB2b2lkICphY3F1aXJlX2Jsa2Rldl9saXN0KHZvaWQpOworZXh0ZXJuIGludCBjb3VudF9ibGtkZXZfbGlzdCh2b2lkKTsKK2V4dGVybiB2b2lkICpnZXRfbmV4dF9ibGtkZXYodm9pZCAqKTsKK2V4dGVybiBpbnQgZ2V0X2Jsa2Rldl9pbmZvKHZvaWQgKiwgaW50ICosIGNoYXIgKiopOworZXh0ZXJuIHZvaWQgcmVsZWFzZV9ibGtkZXZfbGlzdCh2b2lkICopOwogCiBleHRlcm4gdm9pZCBpbml0X3NwZWNpYWxfaW5vZGUoc3RydWN0IGlub2RlICosIHVtb2RlX3QsIGRldl90KTsKIApAQCAtMTQ3NCw3ICsxNDgwLDcgQEAKIH0KIGV4dGVybiBpbnQgZG9fcGlwZShpbnQgKik7CiAKLWV4dGVybiBpbnQgb3Blbl9uYW1laShjb25zdCBjaGFyICosIGludCwgaW50LCBzdHJ1Y3QgbmFtZWlkYXRhICopOworZXh0ZXJuIGludCBvcGVuX25hbWVpKGludCBkZmQsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIHN0cnVjdCBuYW1laWRhdGEgKik7CiBleHRlcm4gaW50IG1heV9vcGVuKHN0cnVjdCBuYW1laWRhdGEgKiwgaW50LCBpbnQpOwogCiBleHRlcm4gaW50IGtlcm5lbF9yZWFkKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGxvbmcsIGNoYXIgKiwgdW5zaWduZWQgbG9uZyk7CkBAIC0xNjcyLDYgKzE2NzgsOCBAQAogCiBleHRlcm4gaW50IHZmc19zdGF0KGNoYXIgX191c2VyICosIHN0cnVjdCBrc3RhdCAqKTsKIGV4dGVybiBpbnQgdmZzX2xzdGF0KGNoYXIgX191c2VyICosIHN0cnVjdCBrc3RhdCAqKTsKK2V4dGVybiBpbnQgdmZzX3N0YXRfZmQoaW50IGRmZCwgY2hhciBfX3VzZXIgKiwgc3RydWN0IGtzdGF0ICopOworZXh0ZXJuIGludCB2ZnNfbHN0YXRfZmQoaW50IGRmZCwgY2hhciBfX3VzZXIgKiwgc3RydWN0IGtzdGF0ICopOwogZXh0ZXJuIGludCB2ZnNfZnN0YXQodW5zaWduZWQgaW50LCBzdHJ1Y3Qga3N0YXQgKik7CiAKIGV4dGVybiBpbnQgdmZzX2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKQEAgLTE3MTQsNyArMTcyMiw3IEBACiBleHRlcm4gaW50IGlub2RlX2NoYW5nZV9vayhzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlhdHRyICopOwogZXh0ZXJuIGludCBfX211c3RfY2hlY2sgaW5vZGVfc2V0YXR0cihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlhdHRyICopOwogCi1leHRlcm4gdm9pZCBpbm9kZV91cGRhdGVfdGltZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgY3RpbWVfdG9vKTsKK2V4dGVybiB2b2lkIGZpbGVfdXBkYXRlX3RpbWUoc3RydWN0IGZpbGUgKmZpbGUpOwogCiBzdGF0aWMgaW5saW5lIGlub190IHBhcmVudF9pbm8oc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mc2xfZGV2aWNlcy5oIGIvaW5jbHVkZS9saW51eC9mc2xfZGV2aWNlcy5oCmluZGV4IDkzNGFhOWIuLmE5ZjFjZmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnNsX2RldmljZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzbF9kZXZpY2VzLmgKQEAgLTUwLDE0ICs1MCwxMiBAQAogCiAJLyogYm9hcmQgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KIAl1MzIgYm9hcmRfZmxhZ3M7Ci0JY29uc3QgY2hhciAqYnVzX2lkOworCXUzMiBidXNfaWQ7CisJdTMyIHBoeV9pZDsKIAl1OCBtYWNfYWRkcls2XTsKIH07CiAKIHN0cnVjdCBnaWFuZmFyX21kaW9fZGF0YSB7Ci0JLyogZGV2aWNlIHNwZWNpZmljIGluZm9ybWF0aW9uICovCi0JdTMyIHBhZGRyOwotCiAJLyogYm9hcmQgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KIAlpbnQgaXJxWzMyXTsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dmcC5oIGIvaW5jbHVkZS9saW51eC9nZnAuaAppbmRleCA4YjJlYWI5Li4yMGY5MTQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dmcC5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2ZwLmgKQEAgLTU3LDYgKzU3LDcgQEAKIAkJCV9fR0ZQX05PRkFJTHxfX0dGUF9OT1JFVFJZfF9fR0ZQX05PX0dST1d8X19HRlBfQ09NUHwgXAogCQkJX19HRlBfTk9NRU1BTExPQ3xfX0dGUF9IQVJEV0FMTCkKIAorLyogR0ZQX0FUT01JQyBtZWFucyBib3RoICF3YWl0IChfX0dGUF9XQUlUIG5vdCBzZXQpIGFuZCB1c2UgZW1lcmdlbmN5IHBvb2wgKi8KICNkZWZpbmUgR0ZQX0FUT01JQwkoX19HRlBfSElHSCkKICNkZWZpbmUgR0ZQX05PSU8JKF9fR0ZQX1dBSVQpCiAjZGVmaW5lIEdGUF9OT0ZTCShfX0dGUF9XQUlUIHwgX19HRlBfSU8pCkBAIC0xMDksNiArMTEwLDEwIEBACiAJaWYgKHVubGlrZWx5KG9yZGVyID49IE1BWF9PUkRFUikpCiAJCXJldHVybiBOVUxMOwogCisJLyogVW5rbm93biBub2RlIGlzIGN1cnJlbnQgbm9kZSAqLworCWlmIChuaWQgPCAwKQorCQluaWQgPSBudW1hX25vZGVfaWQoKTsKKwogCXJldHVybiBfX2FsbG9jX3BhZ2VzKGdmcF9tYXNrLCBvcmRlciwKIAkJTk9ERV9EQVRBKG5pZCktPm5vZGVfem9uZWxpc3RzICsgZ2ZwX3pvbmUoZ2ZwX21hc2spKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaGFyZGlycS5oIGIvaW5jbHVkZS9saW51eC9oYXJkaXJxLmgKaW5kZXggNzFkMmI4YS4uZWFiNTM3MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9oYXJkaXJxLmgKKysrIGIvaW5jbHVkZS9saW51eC9oYXJkaXJxLmgKQEAgLTkzLDEwICs5Myw2IEBACiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7CiAKICNpZm5kZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKLXN0YXRpYyBpbmxpbmUgdm9pZCBhY2NvdW50X3VzZXJfdnRpbWUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCi17Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBhY2NvdW50X3N5c3RlbV92dGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg5YmZiMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogIGluY2x1ZGUvbGludXgvaHJ0aW1lci5oCisgKgorICogIGhydGltZXJzIC0gSGlnaC1yZXNvbHV0aW9uIGtlcm5lbCB0aW1lcnMKKyAqCisgKiAgIENvcHlyaWdodChDKSAyMDA1LCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqICAgQ29weXJpZ2h0KEMpIDIwMDUsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKgorICogIGRhdGEgdHlwZSBkZWZpbml0aW9ucywgZGVjbGFyYXRpb25zLCBwcm90b3R5cGVzCisgKgorICogIFN0YXJ0ZWQgYnk6IFRob21hcyBHbGVpeG5lciBhbmQgSW5nbyBNb2xuYXIKKyAqCisgKiAgRm9yIGxpY2VuY2luZyBkZXRhaWxzIHNlZSBrZXJuZWwtYmFzZS9DT1BZSU5HCisgKi8KKyNpZm5kZWYgX0xJTlVYX0hSVElNRVJfSAorI2RlZmluZSBfTElOVVhfSFJUSU1FUl9ICisKKyNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisvKgorICogTW9kZSBhcmd1bWVudHMgb2YgeHh4X2hydGltZXIgZnVuY3Rpb25zOgorICovCitlbnVtIGhydGltZXJfbW9kZSB7CisJSFJUSU1FUl9BQlMsCS8qIFRpbWUgdmFsdWUgaXMgYWJzb2x1dGUgKi8KKwlIUlRJTUVSX1JFTCwJLyogVGltZSB2YWx1ZSBpcyByZWxhdGl2ZSB0byBub3cgKi8KK307CisKK2VudW0gaHJ0aW1lcl9yZXN0YXJ0IHsKKwlIUlRJTUVSX05PUkVTVEFSVCwKKwlIUlRJTUVSX1JFU1RBUlQsCit9OworCisvKgorICogVGltZXIgc3RhdGVzOgorICovCitlbnVtIGhydGltZXJfc3RhdGUgeworCUhSVElNRVJfSU5BQ1RJVkUsCS8qIFRpbWVyIGlzIGluYWN0aXZlICovCisJSFJUSU1FUl9FWFBJUkVELAkJLyogVGltZXIgaXMgZXhwaXJlZCAqLworCUhSVElNRVJfUEVORElORywJCS8qIFRpbWVyIGlzIHBlbmRpbmcgKi8KK307CisKK3N0cnVjdCBocnRpbWVyX2Jhc2U7CisKKy8qKgorICogc3RydWN0IGhydGltZXIgLSB0aGUgYmFzaWMgaHJ0aW1lciBzdHJ1Y3R1cmUKKyAqCisgKiBAbm9kZToJcmVkIGJsYWNrIHRyZWUgbm9kZSBmb3IgdGltZSBvcmRlcmVkIGluc2VydGlvbgorICogQGV4cGlyZXM6CXRoZSBhYnNvbHV0ZSBleHBpcnkgdGltZSBpbiB0aGUgaHJ0aW1lcnMgaW50ZXJuYWwKKyAqCQlyZXByZXNlbnRhdGlvbi4gVGhlIHRpbWUgaXMgcmVsYXRlZCB0byB0aGUgY2xvY2sgb24KKyAqCQl3aGljaCB0aGUgdGltZXIgaXMgYmFzZWQuCisgKiBAc3RhdGU6CXN0YXRlIG9mIHRoZSB0aW1lcgorICogQGZ1bmN0aW9uOgl0aW1lciBleHBpcnkgY2FsbGJhY2sgZnVuY3Rpb24KKyAqIEBkYXRhOglhcmd1bWVudCBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBAYmFzZToJcG9pbnRlciB0byB0aGUgdGltZXIgYmFzZSAocGVyIGNwdSBhbmQgcGVyIGNsb2NrKQorICoKKyAqIFRoZSBocnRpbWVyIHN0cnVjdHVyZSBtdXN0IGJlIGluaXRpYWxpemVkIGJ5IGluaXRfaHJ0aW1lcl8jQ0xPQ0tUWVBFKCkKKyAqLworc3RydWN0IGhydGltZXIgeworCXN0cnVjdCByYl9ub2RlCQlub2RlOworCWt0aW1lX3QJCQlleHBpcmVzOworCWVudW0gaHJ0aW1lcl9zdGF0ZQlzdGF0ZTsKKwlpbnQJCQkoKmZ1bmN0aW9uKSh2b2lkICopOworCXZvaWQJCQkqZGF0YTsKKwlzdHJ1Y3QgaHJ0aW1lcl9iYXNlCSpiYXNlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgaHJ0aW1lcl9iYXNlIC0gdGhlIHRpbWVyIGJhc2UgZm9yIGEgc3BlY2lmaWMgY2xvY2sKKyAqCisgKiBAaW5kZXg6CWNsb2NrIHR5cGUgaW5kZXggZm9yIHBlcl9jcHUgc3VwcG9ydCB3aGVuIG1vdmluZyBhIHRpbWVyCisgKgkJdG8gYSBiYXNlIG9uIGFub3RoZXIgY3B1LgorICogQGxvY2s6CWxvY2sgcHJvdGVjdGluZyB0aGUgYmFzZSBhbmQgYXNzb2NpYXRlZCB0aW1lcnMKKyAqIEBhY3RpdmU6CXJlZCBibGFjayB0cmVlIHJvb3Qgbm9kZSBmb3IgdGhlIGFjdGl2ZSB0aW1lcnMKKyAqIEBmaXJzdDoJcG9pbnRlciB0byB0aGUgdGltZXIgbm9kZSB3aGljaCBleHBpcmVzIGZpcnN0CisgKiBAcmVzb2x1dGlvbjoJdGhlIHJlc29sdXRpb24gb2YgdGhlIGNsb2NrLCBpbiBuYW5vc2Vjb25kcworICogQGdldF90aW1lOglmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgY3VycmVudCB0aW1lIG9mIHRoZSBjbG9jaworICogQGN1cnJfdGltZXI6CXRoZSB0aW1lciB3aGljaCBpcyBleGVjdXRpbmcgYSBjYWxsYmFjayByaWdodCBub3cKKyAqLworc3RydWN0IGhydGltZXJfYmFzZSB7CisJY2xvY2tpZF90CQlpbmRleDsKKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCByYl9yb290CQlhY3RpdmU7CisJc3RydWN0IHJiX25vZGUJCSpmaXJzdDsKKwlrdGltZV90CQkJcmVzb2x1dGlvbjsKKwlrdGltZV90CQkJKCpnZXRfdGltZSkodm9pZCk7CisJc3RydWN0IGhydGltZXIJCSpjdXJyX3RpbWVyOworfTsKKworLyoKKyAqIGNsb2NrX3dhc19zZXQoKSBpcyBhIE5PUCBmb3Igbm9uLSBoaWdoLXJlc29sdXRpb24gc3lzdGVtcy4gVGhlCisgKiB0aW1lLXNvcnRlZCBvcmRlciBndWFyYW50ZWVzIHRoYXQgYSB0aW1lciBkb2VzIG5vdCBleHBpcmUgZWFybHkgYW5kCisgKiBpcyBleHBpcmVkIGluIHRoZSBuZXh0IHNvZnRpcnEgd2hlbiB0aGUgY2xvY2sgd2FzIGFkdmFuY2VkLgorICovCisjZGVmaW5lIGNsb2NrX3dhc19zZXQoKQkJZG8geyB9IHdoaWxlICgwKQorCisvKiBFeHBvcnRlZCB0aW1lciBmdW5jdGlvbnM6ICovCisKKy8qIEluaXRpYWxpemUgdGltZXJzOiAqLworZXh0ZXJuIHZvaWQgaHJ0aW1lcl9pbml0KHN0cnVjdCBocnRpbWVyICp0aW1lciwgY29uc3QgY2xvY2tpZF90IHdoaWNoX2Nsb2NrKTsKK2V4dGVybiB2b2lkIGhydGltZXJfcmViYXNlKHN0cnVjdCBocnRpbWVyICp0aW1lciwgY29uc3QgY2xvY2tpZF90IHdoaWNoX2Nsb2NrKTsKKworCisvKiBCYXNpYyB0aW1lciBvcGVyYXRpb25zOiAqLworZXh0ZXJuIGludCBocnRpbWVyX3N0YXJ0KHN0cnVjdCBocnRpbWVyICp0aW1lciwga3RpbWVfdCB0aW0sCisJCQkgY29uc3QgZW51bSBocnRpbWVyX21vZGUgbW9kZSk7CitleHRlcm4gaW50IGhydGltZXJfY2FuY2VsKHN0cnVjdCBocnRpbWVyICp0aW1lcik7CitleHRlcm4gaW50IGhydGltZXJfdHJ5X3RvX2NhbmNlbChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpOworCisjZGVmaW5lIGhydGltZXJfcmVzdGFydCh0aW1lcikgaHJ0aW1lcl9zdGFydCgodGltZXIpLCAodGltZXIpLT5leHBpcmVzLCBIUlRJTUVSX0FCUykKKworLyogUXVlcnkgdGltZXJzOiAqLworZXh0ZXJuIGt0aW1lX3QgaHJ0aW1lcl9nZXRfcmVtYWluaW5nKGNvbnN0IHN0cnVjdCBocnRpbWVyICp0aW1lcik7CitleHRlcm4gaW50IGhydGltZXJfZ2V0X3Jlcyhjb25zdCBjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssIHN0cnVjdCB0aW1lc3BlYyAqdHApOworCitzdGF0aWMgaW5saW5lIGludCBocnRpbWVyX2FjdGl2ZShjb25zdCBzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisJcmV0dXJuIHRpbWVyLT5zdGF0ZSA9PSBIUlRJTUVSX1BFTkRJTkc7Cit9CisKKy8qIEZvcndhcmQgYSBocnRpbWVyIHNvIGl0IGV4cGlyZXMgYWZ0ZXIgbm93OiAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaHJ0aW1lcl9mb3J3YXJkKHN0cnVjdCBocnRpbWVyICp0aW1lciwga3RpbWVfdCBpbnRlcnZhbCk7CisKKy8qIFByZWNpc2Ugc2xlZXA6ICovCitleHRlcm4gbG9uZyBocnRpbWVyX25hbm9zbGVlcChzdHJ1Y3QgdGltZXNwZWMgKnJxdHAsCisJCQkgICAgICBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICpybXRwLAorCQkJICAgICAgY29uc3QgZW51bSBocnRpbWVyX21vZGUgbW9kZSwKKwkJCSAgICAgIGNvbnN0IGNsb2NraWRfdCBjbG9ja2lkKTsKKworLyogU29mdCBpbnRlcnJ1cHQgZnVuY3Rpb24gdG8gcnVuIHRoZSBocnRpbWVyIHF1ZXVlczogKi8KK2V4dGVybiB2b2lkIGhydGltZXJfcnVuX3F1ZXVlcyh2b2lkKTsKKworLyogQm9vdHVwIGluaXRpYWxpemF0aW9uOiAqLworZXh0ZXJuIHZvaWQgX19pbml0IGhydGltZXJzX2luaXQodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMtaWQuaCBiL2luY2x1ZGUvbGludXgvaTJjLWlkLmgKaW5kZXggZmI0NmY4ZC4uNDc0YzhmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pMmMtaWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2kyYy1pZC5oCkBAIC0xMDMsNiArMTAzLDExIEBACiAjZGVmaW5lIEkyQ19EUklWRVJJRF9TQUE3MTFYCTczCS8qIHNhYTcxMXggdmlkZW8gZW5jb2RlcnMJKi8KICNkZWZpbmUgSTJDX0RSSVZFUklEX0FLSVRBSU9FWFAJNzQJLyogSU8gRXhwYW5kZXIgb24gU2hhcnAgU0wtQzEwMDAgKi8KICNkZWZpbmUgSTJDX0RSSVZFUklEX0lORlJBUkVECTc1CS8qIEkyQyBJbmZyYVJlZCBvbiBWaWRlbyBib2FyZHMgKi8KKyNkZWZpbmUgSTJDX0RSSVZFUklEX1RWUDUxNTAJNzYJLyogVFZQNTE1MCB2aWRlbyBkZWNvZGVyICAgICAgICAqLworI2RlZmluZSBJMkNfRFJJVkVSSURfV004NzM5CTc3CS8qIHdtODczOSBhdWRpbyBwcm9jZXNzb3IJKi8KKyNkZWZpbmUgSTJDX0RSSVZFUklEX1VQRDY0MDgzCTc4CS8qIHVwZDY0MDgzIHZpZGVvIHByb2Nlc3NvcgkqLworI2RlZmluZSBJMkNfRFJJVkVSSURfVVBENjQwMzFBCTc5CS8qIHVwZDY0MDMxYSB2aWRlbyBwcm9jZXNzb3IJKi8KKyNkZWZpbmUgSTJDX0RSSVZFUklEX1NBQTcxN1gJODAJLyogc2FhNzE3eCB2aWRlbyBlbmNvZGVyCSovCiAKICNkZWZpbmUgSTJDX0RSSVZFUklEX0kyQ0RFVgk5MDAKICNkZWZpbmUgSTJDX0RSSVZFUklEX0FSUCAgICAgICAgOTAyICAgIC8qIFNNQnVzIEFSUCBDbGllbnQgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lkZS5oIGIvaW5jbHVkZS9saW51eC9pZGUuaAppbmRleCA3YjZhNmE1Li4xMTBiM2NmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lkZS5oCisrKyBiL2luY2x1ZGUvbGludXgvaWRlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTYzOCw3ICs2MzksNyBAQAogCWludAkJY3JjX2NvdW50OwkvKiBjcmMgY291bnRlciB0byByZWR1Y2UgZHJpdmUgc3BlZWQgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IGRldmljZQlnZW5kZXY7Ci0Jc3RydWN0IHNlbWFwaG9yZSBnZW5kZXZfcmVsX3NlbTsJLyogdG8gZGVhbCB3aXRoIGRldmljZSByZWxlYXNlKCkgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiBnZW5kZXZfcmVsX2NvbXA7CS8qIHRvIGRlYWwgd2l0aCBkZXZpY2UgcmVsZWFzZSgpICovCiB9IGlkZV9kcml2ZV90OwogCiAjZGVmaW5lIHRvX2lkZV9kZXZpY2UoZGV2KWNvbnRhaW5lcl9vZihkZXYsIGlkZV9kcml2ZV90LCBnZW5kZXYpCkBAIC03OTQsMTQgKzc5NSwxNCBAQAogCXVuc2lnbmVkCXNnX21hcHBlZCAgOiAxOwkvKiBzZ190YWJsZSBhbmQgc2dfbmVudHMgYXJlIHJlYWR5ICovCiAKIAlzdHJ1Y3QgZGV2aWNlCWdlbmRldjsKLQlzdHJ1Y3Qgc2VtYXBob3JlIGdlbmRldl9yZWxfc2VtOyAvKiBUbyBkZWFsIHdpdGggZGV2aWNlIHJlbGVhc2UoKSAqLworCXN0cnVjdCBjb21wbGV0aW9uIGdlbmRldl9yZWxfY29tcDsgLyogVG8gZGVhbCB3aXRoIGRldmljZSByZWxlYXNlKCkgKi8KIAogCXZvaWQJCSpod2lmX2RhdGE7CS8qIGV4dHJhIGh3aWYgZGF0YSAqLwogCiAJdW5zaWduZWQgZG1hOwogCiAJdm9pZCAoKmxlZF9hY3QpKHZvaWQgKmRhdGEsIGludCBydyk7Ci19IF9fX19jYWNoZWxpbmVfbWF4YWxpZ25lZF9pbl9zbXAgaWRlX2h3aWZfdDsKK30gX19fX2NhY2hlbGluZV9pbnRlcm5vZGVhbGlnbmVkX2luX3NtcCBpZGVfaHdpZl90OwogCiAvKgogICogIGludGVybmFsIGlkZSBpbnRlcnJ1cHQgaGFuZGxlciB0eXBlCkBAIC05ODIsOCArOTgzLDEzIEBACiAJaWRlX3N0YXJ0c3RvcF90CSgqYWJvcnQpKGlkZV9kcml2ZV90ICosIHN0cnVjdCByZXF1ZXN0ICpycSk7CiAJaWRlX3Byb2NfZW50cnlfdAkqcHJvYzsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlcglnZW5fZHJpdmVyOworCWludAkJKCpwcm9iZSkoaWRlX2RyaXZlX3QgKik7CisJdm9pZAkJKCpyZW1vdmUpKGlkZV9kcml2ZV90ICopOworCXZvaWQJCSgqc2h1dGRvd24pKGlkZV9kcml2ZV90ICopOwogfSBpZGVfZHJpdmVyX3Q7CiAKKyNkZWZpbmUgdG9faWRlX2RyaXZlcihkcnYpIGNvbnRhaW5lcl9vZihkcnYsIGlkZV9kcml2ZXJfdCwgZ2VuX2RyaXZlcikKKwogaW50IGdlbmVyaWNfaWRlX2lvY3RsKGlkZV9kcml2ZV90ICosIHN0cnVjdCBmaWxlICosIHN0cnVjdCBibG9ja19kZXZpY2UgKiwgdW5zaWduZWQsIHVuc2lnbmVkIGxvbmcpOwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl9ldGhlci5oIGIvaW5jbHVkZS9saW51eC9pZl9ldGhlci5oCmluZGV4IGZlMjZkNDMuLjdhOTJjMWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfZXRoZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX2V0aGVyLmgKQEAgLTcyLDYgKzcyLDcgQEAKIAkJCQkJICogb3ZlciBFdGhlcm5ldAogCQkJCQkgKi8KICNkZWZpbmUgRVRIX1BfQU9FCTB4ODhBMgkJLyogQVRBIG92ZXIgRXRoZXJuZXQJCSovCisjZGVmaW5lIEVUSF9QX1RJUEMJMHg4OENBCQkvKiBUSVBDIAkJCSovCiAKIC8qCiAgKglOb24gRElYIHR5cGVzLiBXb24ndCBjbGFzaCBmb3IgMTUwMCB0eXBlcy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfZnJhZC5oIGIvaW5jbHVkZS9saW51eC9pZl9mcmFkLmgKaW5kZXggNTExOTk5Yy4uMzk1ZjBhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9mcmFkLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9mcmFkLmgKQEAgLTEzMSwxNyArMTMxLDE3IEBACiAvKiB0aGVzZSBhcmUgdGhlIGZpZWxkcyBvZiBhbiBSRkMgMTQ5MCBoZWFkZXIgKi8KIHN0cnVjdCBmcmhkcgogewotICAgdW5zaWduZWQgY2hhciAgY29udHJvbAlfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKyAgIHVuc2lnbmVkIGNoYXIgIGNvbnRyb2w7CiAKICAgIC8qIGZvciBJUCBwYWNrZXRzLCB0aGlzIGNhbiBiZSB0aGUgTkxQSUQgKi8KLSAgIHVuc2lnbmVkIGNoYXIgIHBhZAkJX19hdHRyaWJ1dGVfXygocGFja2VkKSk7IAorICAgdW5zaWduZWQgY2hhciAgcGFkOwogCi0gICB1bnNpZ25lZCBjaGFyICBOTFBJRAkJX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICB1bnNpZ25lZCBjaGFyICBPVUlbM10JX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICB1bnNpZ25lZCBzaG9ydCBQSUQJCV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworICAgdW5zaWduZWQgY2hhciAgTkxQSUQ7CisgICB1bnNpZ25lZCBjaGFyICBPVUlbM107CisgICB1bnNpZ25lZCBzaG9ydCBQSUQ7CiAKICNkZWZpbmUgSVBfTkxQSUQgcGFkIAotfTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIHNlZSBSRkMgMTQ5MCBmb3IgdGhlIGRlZmluaXRpb24gb2YgdGhlIGZvbGxvd2luZyAqLwogI2RlZmluZSBGUkFEX0lfVUkJCTB4MDMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5pdC5oIGIvaW5jbHVkZS9saW51eC9pbml0LmgKaW5kZXggNTkwMDhjMy4uZmY4ZDhiOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbml0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbml0LmgKQEAgLTI0MSw2ICsyNDEsMTggQEAKICNkZWZpbmUgX19jcHVleGl0ZGF0YQlfX2V4aXRkYXRhCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVRworI2RlZmluZSBfX21lbWluaXQKKyNkZWZpbmUgX19tZW1pbml0ZGF0YQorI2RlZmluZSBfX21lbWV4aXQKKyNkZWZpbmUgX19tZW1leGl0ZGF0YQorI2Vsc2UKKyNkZWZpbmUgX19tZW1pbml0CV9faW5pdAorI2RlZmluZSBfX21lbWluaXRkYXRhIF9faW5pdGRhdGEKKyNkZWZpbmUgX19tZW1leGl0IF9fZXhpdAorI2RlZmluZSBfX21lbWV4aXRkYXRhCV9fZXhpdGRhdGEKKyNlbmRpZgorCiAvKiBGdW5jdGlvbnMgbWFya2VkIGFzIF9fZGV2ZXhpdCBtYXkgYmUgZGlzY2FyZGVkIGF0IGtlcm5lbCBsaW5rIHRpbWUsIGRlcGVuZGluZwogICAgb24gY29uZmlnIG9wdGlvbnMuICBOZXdlciB2ZXJzaW9ucyBvZiBiaW51dGlscyBkZXRlY3QgcmVmZXJlbmNlcyBmcm9tCiAgICByZXRhaW5lZCBzZWN0aW9ucyB0byBkaXNjYXJkZWQgc2VjdGlvbnMgYW5kIGZsYWcgYW4gZXJyb3IuICBQb2ludGVycyB0bwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaCBiL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKaW5kZXggNDFmMTUwYS4uMmMwOGZkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCkBAIC03OSw3ICs3OSw3IEBACiB7CiAJbG9jYWxfc2F2ZV9mbGFncygqeCk7CiB9Ci0jZGVmaW5lIHNhdmVfZmxhZ3MoeCkgc2F2ZV9mbGFncygmeCk7CisjZGVmaW5lIHNhdmVfZmxhZ3MoeCkgc2F2ZV9mbGFncygmeCkKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2RlcHJlY2F0ZWQgcmVzdG9yZV9mbGFncyh1bnNpZ25lZCBsb25nIHgpCiB7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoeCk7CkBAIC0xMTIsNyArMTEyLDcgQEAKIAlUSU1FUl9TT0ZUSVJRLAogCU5FVF9UWF9TT0ZUSVJRLAogCU5FVF9SWF9TT0ZUSVJRLAotCVNDU0lfU09GVElSUSwKKwlCTE9DS19TT0ZUSVJRLAogCVRBU0tMRVRfU09GVElSUQogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pb2MzLmggYi9pbmNsdWRlL2xpbnV4L2lvYzMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzkwNmE3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9pb2MzLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBTdGFuaXNsYXcgU2tvd3JvbmVrIDxza3lsYXJrQGxpbnV4LW1pcHMub3JnPgorICovCisKKyNpZm5kZWYgX0xJTlVYX0lPQzNfSAorI2RlZmluZSBfTElOVVhfSU9DM19ICisKKyNpbmNsdWRlIDxhc20vc24vaW9jMy5oPgorCisjZGVmaW5lIElPQzNfTUFYX1NVQk1PRFVMRVMJMzIKKworI2RlZmluZSBJT0MzX0NMQVNTX05PTkUJCTAKKyNkZWZpbmUgSU9DM19DTEFTU19CQVNFX0lQMjcJMQorI2RlZmluZSBJT0MzX0NMQVNTX0JBU0VfSVAzMAkyCisjZGVmaW5lIElPQzNfQ0xBU1NfTUVORVRfMTIzCTMKKyNkZWZpbmUgSU9DM19DTEFTU19NRU5FVF80CTQKKyNkZWZpbmUgSU9DM19DTEFTU19DQUREVU8JNQorI2RlZmluZSBJT0MzX0NMQVNTX1NFUklBTAk2CisKKy8qIE9uZSBvZiB0aGVzZSBwZXIgSU9DMyAqLworc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlpbnQgaWQ7CQkJCS8qIElPQzMgc2VxdWVuY2UgbnVtYmVyICovCisJLyogUENJIG1hcHBpbmcgKi8KKwl1bnNpZ25lZCBsb25nIHBtYTsJCS8qIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgX19pb21lbSBpb2MzICp2bWE7CS8qIHBvaW50ZXIgdG8gcmVnaXN0ZXJzICovCisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CQkvKiBQQ0kgZGV2aWNlICovCisJLyogSVJRIHN0dWZmICovCisJaW50IGR1YWxfaXJxOwkJCS8qIHNldCBpZiBzZXBhcmF0ZSBJUlFzIGFyZSB1c2VkICovCisJaW50IGlycV9pbywgaXJxX2V0aDsJCS8qIElSUSBudW1iZXJzICovCisJLyogR1BJTyBtYWdpYyAqLworCXNwaW5sb2NrX3QgZ3Bpb19sb2NrOworCXVuc2lnbmVkIGludCBncGRyX3NoYWRvdzsKKwkvKiBOSUMgaWRlbnRpZmllcnMgKi8KKwljaGFyIG5pY19wYXJ0WzMyXTsKKwljaGFyIG5pY19zZXJpYWxbMTZdOworCWNoYXIgbmljX21hY1s2XTsKKwkvKiBzdWJtb2R1bGUgc2V0ICovCisJaW50IGNsYXNzOworCXZvaWQgKmRhdGFbSU9DM19NQVhfU1VCTU9EVUxFU107CS8qIGZvciBzdWJtb2R1bGUgdXNlICovCisJaW50IGFjdGl2ZVtJT0MzX01BWF9TVUJNT0RVTEVTXTsJLyogc2V0IGlmIHByb2JlIHN1Y2NlZWRzICovCisJLyogaXNfaXJfbG9jayBtdXN0IGJlIGhlbGQgd2hpbGUKKwkgKiBtb2RpZnlpbmcgc2lvX2llIHZhbHVlcywgc28KKwkgKiB3ZSBjYW4gYmUgc3VyZSB0aGF0IHNpb19pZSBpcworCSAqIG5vdCBjaGFuZ2luZyB3aGVuIHdlIHJlYWQgaXQKKwkgKiBhbG9uZyB3aXRoIHNpb19pci4KKwkgKi8KKwlzcGlubG9ja190IGlyX2xvY2s7CS8qIFNJT19JRVtTQ10gbW9kIGxvY2sgKi8KK307CisKKy8qIE9uZSBwZXIgc3VibW9kdWxlICovCitzdHJ1Y3QgaW9jM19zdWJtb2R1bGUgeworCWNoYXIgKm5hbWU7CQkvKiBkZXNjcmlwdGl2ZSBzdWJtb2R1bGUgbmFtZSAqLworCXN0cnVjdCBtb2R1bGUgKm93bmVyOwkvKiBvd25pbmcga2VybmVsIG1vZHVsZSAqLworCWludCBldGhlcm5ldDsJCS8qIHNldCBmb3IgZXRoZXJuZXQgZHJpdmVycyAqLworCWludCAoKnByb2JlKSAoc3RydWN0IGlvYzNfc3VibW9kdWxlICosIHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICopOworCWludCAoKnJlbW92ZSkgKHN0cnVjdCBpb2MzX3N1Ym1vZHVsZSAqLCBzdHJ1Y3QgaW9jM19kcml2ZXJfZGF0YSAqKTsKKwlpbnQgaWQ7CQkJLyogYXNzaWduZWQgYnkgSU9DMywgaW5kZXggZm9yIHRoZSAiZGF0YSIgYXJyYXkgKi8KKwkvKiBJUlEgc3R1ZmYgKi8KKwl1bnNpZ25lZCBpbnQgaXJxX21hc2s7CS8qIElPQzMgSVJRIG1hc2ssIGxlYXZlIGNsZWFyIGZvciBFdGhlcm5ldCAqLworCWludCByZXNldF9tYXNrOwkJLyogbm9uLXplcm8gaWYgeW91IHdhbnQgdGhlIGlvYzMuYyBtb2R1bGUgdG8gcmVzZXQgaW50ZXJydXB0cyAqLworCWludCAoKmludHIpIChzdHJ1Y3QgaW9jM19zdWJtb2R1bGUgKiwgc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqKTsKKwkvKiBwcml2YXRlIHN1Ym1vZHVsZSBkYXRhICovCisJdm9pZCAqZGF0YTsJCS8qIGFzc2lnbmVkIGJ5IHN1Ym1vZHVsZSAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9ucyBuZWVkZWQgYnkgc3VibW9kdWxlcyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJT0MzX1dfSUVTCQkwCisjZGVmaW5lIElPQzNfV19JRUMJCTEKKworLyogcmVnaXN0ZXJzIGEgc3VibW9kdWxlIGZvciBhbGwgZXhpc3RpbmcgYW5kIGZ1dHVyZSBJT0MzIGNoaXBzICovCitleHRlcm4gaW50IGlvYzNfcmVnaXN0ZXJfc3VibW9kdWxlKHN0cnVjdCBpb2MzX3N1Ym1vZHVsZSAqKTsKKy8qIHVucmVnaXN0ZXJzIGEgc3VibW9kdWxlICovCitleHRlcm4gdm9pZCBpb2MzX3VucmVnaXN0ZXJfc3VibW9kdWxlKHN0cnVjdCBpb2MzX3N1Ym1vZHVsZSAqKTsKKy8qIGVuYWJsZXMgSVJRcyBpbmRpY2F0ZWQgYnkgaXJxX21hc2sgZm9yIGEgc3BlY2lmaWVkIElPQzMgY2hpcCAqLworZXh0ZXJuIHZvaWQgaW9jM19lbmFibGUoc3RydWN0IGlvYzNfc3VibW9kdWxlICosIHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICosIHVuc2lnbmVkIGludCk7CisvKiBhY2tvd2xlZGdlcyBzcGVjaWZpZWQgSVJRcyAqLworZXh0ZXJuIHZvaWQgaW9jM19hY2soc3RydWN0IGlvYzNfc3VibW9kdWxlICosIHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICosIHVuc2lnbmVkIGludCk7CisvKiBkaXNhYmxlcyBJUlFzIGluZGljYXRlZCBieSBpcnFfbWFzayBmb3IgYSBzcGVjaWZpZWQgSU9DMyBjaGlwICovCitleHRlcm4gdm9pZCBpb2MzX2Rpc2FibGUoc3RydWN0IGlvYzNfc3VibW9kdWxlICosIHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICosIHVuc2lnbmVkIGludCk7CisvKiBhdG9taWNhbGx5IHNldHMgR1BDUiBiaXRzICovCitleHRlcm4gdm9pZCBpb2MzX2dwY3Jfc2V0KHN0cnVjdCBpb2MzX2RyaXZlcl9kYXRhICosIHVuc2lnbmVkIGludCk7CisvKiBnZW5lcmFsIGlyZWcgd3JpdGVyICovCitleHRlcm4gdm9pZCBpb2MzX3dyaXRlX2lyZWcoc3RydWN0IGlvYzNfZHJpdmVyX2RhdGEgKmlkZCwgdWludDMyX3QgdmFsdWUsIGludCByZWcpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXB2Ni5oIGIvaW5jbHVkZS9saW51eC9pcHY2LmgKaW5kZXggOTNiYmVkNS4uOWM4ZjRjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcHY2LmgKKysrIGIvaW5jbHVkZS9saW51eC9pcHY2LmgKQEAgLTE5MSw2ICsxOTEsMTAgQEAKIAlfX3UxNgkJCXNyY3J0OwogCV9fdTE2CQkJZHN0MTsKIAlfX3UxNgkJCWxhc3RvcHQ7CisJX191MzIJCQluaG9mZjsKKwlfX3UxNgkJCWZsYWdzOworCisjZGVmaW5lIElQNlNLQl9YRlJNX1RSQU5TRk9STUVECTEKIH07CiAKICNkZWZpbmUgSVA2Q0Ioc2tiKQkoKHN0cnVjdCBpbmV0Nl9za2JfcGFybSopKChza2IpLT5jYikpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lzZG5pZi5oIGIvaW5jbHVkZS9saW51eC9pc2RuaWYuaAppbmRleCA3YTRlYWNkLi4wNGUxMGY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lzZG5pZi5oCisrKyBiL2luY2x1ZGUvbGludXgvaXNkbmlmLmgKQEAgLTI4Miw0MyArMjgyLDQzIEBACiAKIHR5cGVkZWYgc3RydWN0IFQzMF9zIHsKIAkvKiBzZXNzaW9uIHBhcmFtZXRlcnMgKi8KLQlfX3U4IHJlc29sdXRpb24JCV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQlfX3U4IHJhdGUJCV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQlfX3U4IHdpZHRoCQlfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0JX191OCBsZW5ndGgJCV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQlfX3U4IGNvbXByZXNzaW9uCV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQlfX3U4IGVjbQkJX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCV9fdTggYmluYXJ5CQlfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0JX191OCBzY2FudGltZQkJX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCV9fdTggaWRbRkFYSURMRU5dCV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwlfX3U4IHJlc29sdXRpb247CisJX191OCByYXRlOworCV9fdTggd2lkdGg7CisJX191OCBsZW5ndGg7CisJX191OCBjb21wcmVzc2lvbjsKKwlfX3U4IGVjbTsKKwlfX3U4IGJpbmFyeTsKKwlfX3U4IHNjYW50aW1lOworCV9fdTggaWRbRkFYSURMRU5dOwogCS8qIGFkZGl0aW9uYWwgcGFyYW1ldGVycyAqLwotCV9fdTggcGhhc2UJCV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQlfX3U4IGRpcmVjdGlvbgkJX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCV9fdTggY29kZQkJX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCV9fdTggYmFkbGluCQlfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0JX191OCBiYWRtdWwJCV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQlfX3U4IGJvcgkJX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCV9fdTggZmV0CQlfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0JX191OCBwb2xsaWRbRkFYSURMRU5dCV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQlfX3U4IGNxCQkJX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCV9fdTggY3IJCQlfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0JX191OCBjdGNydHkJCV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQlfX3U4IG1pbnNwCQlfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0JX191OCBwaGN0bwkJX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCV9fdTggcmVsCQlfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0JX191OCBuYmMJCV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwlfX3U4IHBoYXNlOworCV9fdTggZGlyZWN0aW9uOworCV9fdTggY29kZTsKKwlfX3U4IGJhZGxpbjsKKwlfX3U4IGJhZG11bDsKKwlfX3U4IGJvcjsKKwlfX3U4IGZldDsKKwlfX3U4IHBvbGxpZFtGQVhJRExFTl07CisJX191OCBjcTsKKwlfX3U4IGNyOworCV9fdTggY3RjcnR5OworCV9fdTggbWluc3A7CisJX191OCBwaGN0bzsKKwlfX3U4IHJlbDsKKwlfX3U4IG5iYzsKIAkvKiByZW1vdGUgc3RhdGlvbiBwYXJhbWV0ZXJzICovCi0JX191OCByX3Jlc29sdXRpb24JX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCV9fdTggcl9yYXRlCQlfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0JX191OCByX3dpZHRoCQlfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0JX191OCByX2xlbmd0aAkJX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCV9fdTggcl9jb21wcmVzc2lvbglfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0JX191OCByX2VjbQkJX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCV9fdTggcl9iaW5hcnkJCV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQlfX3U4IHJfc2NhbnRpbWUJCV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQlfX3U4IHJfaWRbRkFYSURMRU5dCV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQlfX3U4IHJfY29kZQkJX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotfSBUMzBfczsKKwlfX3U4IHJfcmVzb2x1dGlvbjsKKwlfX3U4IHJfcmF0ZTsKKwlfX3U4IHJfd2lkdGg7CisJX191OCByX2xlbmd0aDsKKwlfX3U4IHJfY29tcHJlc3Npb247CisJX191OCByX2VjbTsKKwlfX3U4IHJfYmluYXJ5OworCV9fdTggcl9zY2FudGltZTsKKwlfX3U4IHJfaWRbRkFYSURMRU5dOworCV9fdTggcl9jb2RlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBUMzBfczsKIAogI2RlZmluZSBJU0ROX1RUWV9GQVhfQ09OTl9JTgkwCiAjZGVmaW5lIElTRE5fVFRZX0ZBWF9DT05OX09VVAkxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lzaWNvbS5oIGIvaW5jbHVkZS9saW51eC9pc2ljb20uaAppbmRleCA3YzZlYWU3Li40NWIzZDQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lzaWNvbS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXNpY29tLmgKQEAgLTQsNDcgKzQsMTIgQEAKIC8qI2RlZmluZQkJSVNJQ09NX0RFQlVHKi8KIC8qI2RlZmluZQkJSVNJQ09NX0RFQlVHX0RUUl9SVFMqLwogCi0KLS8qCi0gKglGaXJtd2FyZSBMb2FkZXIgZGVmaW5pdGlvbnMgLi4uCi0gKi8KLSAKLSNkZWZpbmUJCV9fTXVsdGlUZWNoCQkoJ00nPDw4KQotI2RlZmluZQkJTUlPQ1RMX0xPQURfRklSTVdBUkUJKF9fTXVsdGlUZWNoIHwgMHgwMSkKLSNkZWZpbmUgICAgICAgICBNSU9DVExfUkVBRF9GSVJNV0FSRSAgICAoX19NdWx0aVRlY2ggfCAweDAyKQotI2RlZmluZSAgICAgICAgIE1JT0NUTF9YRkVSX0NUUkwJKF9fTXVsdGlUZWNoIHwgMHgwMykKLSNkZWZpbmUgICAgICAgICBNSU9DVExfUkVTRVRfQ0FSRAkoX19NdWx0aVRlY2ggfCAweDA0KQotCi0jZGVmaW5lCQlEQVRBX1NJWkUJMTYKLQotdHlwZWRlZglzdHJ1Y3QJewotCQl1bnNpZ25lZCBzaG9ydAlleGVjX3NlZ21lbnQ7Ci0JCXVuc2lnbmVkIHNob3J0CWV4ZWNfYWRkcjsKLX0JZXhlY19yZWNvcmQ7Ci0KLXR5cGVkZWYJc3RydWN0CXsKLQkJaW50CQlib2FyZDsJCS8qIEJvYXJkIHRvIGxvYWQgKi8KLQkJdW5zaWduZWQgc2hvcnQJYWRkcjsKLQkJdW5zaWduZWQgc2hvcnQJY291bnQ7Ci19CWJpbl9oZWFkZXI7Ci0KLXR5cGVkZWYJc3RydWN0CXsKLQkJaW50CQlib2FyZDsJCS8qIEJvYXJkIHRvIGxvYWQgKi8KLQkJdW5zaWduZWQgc2hvcnQJYWRkcjsKLQkJdW5zaWduZWQgc2hvcnQJY291bnQ7Ci0JCXVuc2lnbmVkIHNob3J0CXNlZ21lbnQ7Ci0JCXVuc2lnbmVkIGNoYXIJYmluX2RhdGFbREFUQV9TSVpFXTsKLX0JYmluX2ZyYW1lOwotCiAjaWZkZWYgX19LRVJORUxfXwogCiAjZGVmaW5lCQlZRVMJMQogI2RlZmluZQkJTk8JMAogCi0jZGVmaW5lCQlJU0lMT0FEX01JU0NfTUlOT1IJMTU1CS8qIC9kZXYvaXNjdGwgKi8KLSNkZWZpbmUJCUlTSUxPQURfTkFNRQkJIklTSUxvYWQiCi0KLS8qCQorLyoKICAqICBJU0lDT00gRHJpdmVyIGRlZmluaXRpb25zIC4uLgogICoKICAqLwpAQCAtNTUsOCArMjAsOCBAQAogICogICAgICBQQ0kgZGVmaW5pdGlvbnMKICAqLwogCi0gI2RlZmluZSAgICAgICAgREVWSURfQ09VTlQgICAgIDkKLSAjZGVmaW5lICAgICAgICBWRU5ET1JfSUQgICAgICAgMHgxMGI1CisjZGVmaW5lCQlERVZJRF9DT1VOVAk5CisjZGVmaW5lCQlWRU5ET1JfSUQJMHgxMGI1CiAKIC8qCiAgKglUaGVzZSBhcmUgbm93IG9mZmljaWFsbHkgYWxsb2NhdGVkIG51bWJlcnMKQEAgLTY2LDkgKzMxLDkgQEAKICNkZWZpbmUJCUlTSUNPTV9DTUFKT1IJMTEzCS8qIGNhbGxvdXQgKi8KICNkZWZpbmUJCUlTSUNPTV9NQUdJQwkoKCdNJyA8PCA4KSB8ICdUJykKIAotI2RlZmluZQkJV0FLRVVQX0NIQVJTCTI1NgkvKiBoYXJkIGNvZGVkIGZvciBub3cJKi8gCi0jZGVmaW5lCQlUWF9TSVpFCQkyNTQgCi0gCisjZGVmaW5lCQlXQUtFVVBfQ0hBUlMJMjU2CS8qIGhhcmQgY29kZWQgZm9yIG5vdwkqLworI2RlZmluZQkJVFhfU0laRQkJMjU0CisKICNkZWZpbmUJCUJPQVJEX0NPVU5UCTQKICNkZWZpbmUJCVBPUlRfQ09VTlQJKEJPQVJEX0NPVU5UKjE2KQogCkBAIC05OCwxOCArNjMsMTUgQEAKICNkZWZpbmUJCUlTSUNPTV9JTklUSUFURV9YT05YT0ZGCTB4MDQKICNkZWZpbmUJCUlTSUNPTV9SRVNQT05EX1hPTlhPRkYJMHgwOAogCi0jZGVmaW5lIEludGVycnVwdFRoZUNhcmQoYmFzZSkgKG91dHcoMCwoYmFzZSkrMHhjKSkgCi0jZGVmaW5lIENsZWFySW50ZXJydXB0KGJhc2UpIChpbncoKGJhc2UpKzB4MGEpKQkKLQogI2RlZmluZQlCT0FSRChsaW5lKSAgKCgobGluZSkgPj4gNCkgJiAweDMpCiAKIAkvKglpc2kga2lsbCBxdWV1ZSBiaXRtYXAJKi8KLQkKKwogI2RlZmluZQkJSVNJQ09NX0tJTExUWAkJMHgwMQogI2RlZmluZQkJSVNJQ09NX0tJTExSWAkJMHgwMgogCiAJLyogaXNpX2JvYXJkIHN0YXR1cyBiaXRtYXAgKi8KLQkKKwogI2RlZmluZQkJRklSTVdBUkVfTE9BREVECQkweDAwMDEKICNkZWZpbmUJCUJPQVJEX0FDVElWRQkJMHgwMDAyCiAKQEAgLTEyMyw5ICs4NSw4IEBACiAjZGVmaW5lCQlJU0lfUlRTCQkJMHgwMjAwCiAKIAotI2RlZmluZQkJSVNJX1RYT0sJCTB4MDAwMSAKLSAKKyNkZWZpbmUJCUlTSV9UWE9LCQkweDAwMDEKKwogI2VuZGlmCS8qCV9fS0VSTkVMX18JKi8KIAogI2VuZGlmCS8qCUlTSUNPTV9ICSovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvamZmczJfZnNfaS5oIGIvaW5jbHVkZS9saW51eC9qZmZzMl9mc19pLmgKaW5kZXggZWY4NWFiNS4uYWQ1NjViZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9qZmZzMl9mc19pLmgKKysrIGIvaW5jbHVkZS9saW51eC9qZmZzMl9mc19pLmgKQEAgLTgsMTEgKzgsMTEgQEAKICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAKIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvIHsKLQkvKiBXZSBuZWVkIGFuIGludGVybmFsIHNlbWFwaG9yZSBzaW1pbGFyIHRvIGlub2RlLT5pX3NlbS4KKwkvKiBXZSBuZWVkIGFuIGludGVybmFsIG11dGV4IHNpbWlsYXIgdG8gaW5vZGUtPmlfbXV0ZXguCiAJICAgVW5mb3J0dW5hdGVseSwgd2UgY2FuJ3QgdXNlZCB0aGUgZXhpc3Rpbmcgb25lLCBiZWNhdXNlCiAJICAgZWl0aGVyIHRoZSBHQyB3b3VsZCBkZWFkbG9jaywgb3Igd2UnZCBoYXZlIHRvIHJlbGVhc2UgaXQKIAkgICBiZWZvcmUgbGV0dGluZyBHQyBwcm9jZWVkLiBPciB3ZSdkIGhhdmUgdG8gcHV0IHVnbGluZXNzCi0JICAgaW50byB0aGUgR0MgY29kZSBzbyBpdCBkaWRuJ3QgYXR0ZW1wdCB0byBvYnRhaW4gdGhlIGlfc2VtCisJICAgaW50byB0aGUgR0MgY29kZSBzbyBpdCBkaWRuJ3QgYXR0ZW1wdCB0byBvYnRhaW4gdGhlIGlfbXV0ZXgKIAkgICBmb3IgdGhlIGlub2RlKHMpIHdoaWNoIGFyZSBhbHJlYWR5IGxvY2tlZCAqLwogCXN0cnVjdCBzZW1hcGhvcmUgc2VtOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ppZmZpZXMuaCBiL2luY2x1ZGUvbGludXgvamlmZmllcy5oCmluZGV4IDZhY2ZkYmIuLjk5OTA1ZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvamlmZmllcy5oCisrKyBiL2luY2x1ZGUvbGludXgvamlmZmllcy5oCkBAIC0xLDIxICsxLDEyIEBACiAjaWZuZGVmIF9MSU5VWF9KSUZGSUVTX0gKICNkZWZpbmUgX0xJTlVYX0pJRkZJRVNfSAogCisjaW5jbHVkZSA8bGludXgvY2FsYzY0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KICNpbmNsdWRlIDxhc20vcGFyYW0uaD4JCQkvKiBmb3IgSFogKi8KLSNpbmNsdWRlIDxhc20vZGl2NjQuaD4KLQotI2lmbmRlZiBkaXZfbG9uZ19sb25nX3JlbQotI2RlZmluZSBkaXZfbG9uZ19sb25nX3JlbShkaXZpZGVuZCxkaXZpc29yLHJlbWFpbmRlcikgXAotKHsJCQkJCQkJXAotCXU2NCByZXN1bHQgPSBkaXZpZGVuZDsJCQkJXAotCSpyZW1haW5kZXIgPSBkb19kaXYocmVzdWx0LGRpdmlzb3IpOwkJXAotCXJlc3VsdDsJCQkJCQlcCi19KQotI2VuZGlmCiAKIC8qCiAgKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgZXN0YWJsaXNoIHRoZSBlbmdpbmVlcmluZyBwYXJhbWV0ZXJzIG9mIHRoZSBQTEwKQEAgLTM3Myw4ICszNjQsMTEgQEAKIAkgKiBvbmUgZGl2aWRlLgogCSAqLwogCXU2NCBuc2VjID0gKHU2NClqaWZmaWVzICogVElDS19OU0VDOwotCXZhbHVlLT50dl9zZWMgPSBkaXZfbG9uZ19sb25nX3JlbShuc2VjLCBOU0VDX1BFUl9TRUMsICZ2YWx1ZS0+dHZfdXNlYyk7Ci0JdmFsdWUtPnR2X3VzZWMgLz0gTlNFQ19QRVJfVVNFQzsKKwlsb25nIHR2X3VzZWM7CisKKwl2YWx1ZS0+dHZfc2VjID0gZGl2X2xvbmdfbG9uZ19yZW0obnNlYywgTlNFQ19QRVJfU0VDLCAmdHZfdXNlYyk7CisJdHZfdXNlYyAvPSBOU0VDX1BFUl9VU0VDOworCXZhbHVlLT50dl91c2VjID0gdHZfdXNlYzsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2JkX2tlcm4uaCBiL2luY2x1ZGUvbGludXgva2JkX2tlcm4uaAppbmRleCA3NDI4MTk4Li40NWY2MjVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tiZF9rZXJuLmgKKysrIGIvaW5jbHVkZS9saW51eC9rYmRfa2Vybi5oCkBAIC0xNTEsNyArMTUxLDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGNvbl9zY2hlZHVsZV9mbGlwKHN0cnVjdCB0dHlfc3RydWN0ICp0KQogewotCXNjaGVkdWxlX3dvcmsoJnQtPmZsaXAud29yayk7CisJc2NoZWR1bGVfd29yaygmdC0+YnVmLndvcmspOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsLmggYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCmluZGV4IGIxZTQwN2EuLmI0OWFmZmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaApAQCAtNDcsNiArNDcsOCBAQAogI2RlZmluZSBkZWZhdWx0X2NvbnNvbGVfbG9nbGV2ZWwgKGNvbnNvbGVfcHJpbnRrWzNdKQogCiBzdHJ1Y3QgY29tcGxldGlvbjsKK3N0cnVjdCBwdF9yZWdzOworc3RydWN0IHVzZXI7CiAKIC8qKgogICogbWlnaHRfc2xlZXAgLSBhbm5vdGF0aW9uIGZvciBmdW5jdGlvbnMgdGhhdCBjYW4gc2xlZXAKQEAgLTEyMyw2ICsxMjUsOCBAQAogZXh0ZXJuIGludCBrZXJuZWxfdGV4dF9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcik7CiBleHRlcm4gaW50IHNlc3Npb25fb2ZfcGdycChpbnQgcGdycCk7CiAKK2V4dGVybiB2b2lkIGR1bXBfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3QgdXNlciAqZHVtcCk7CisKICNpZmRlZiBDT05GSUdfUFJJTlRLCiBhc21saW5rYWdlIGludCB2cHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQogCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMSwgMCkpKTsKQEAgLTE4MSw2ICsxODUsNyBAQAogCVNZU1RFTV9IQUxULAogCVNZU1RFTV9QT1dFUl9PRkYsCiAJU1lTVEVNX1JFU1RBUlQsCisJU1lTVEVNX1NVU1BFTkRfRElTSywKIH0gc3lzdGVtX3N0YXRlOwogCiAjZGVmaW5lIFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRQkoMTw8MCkKQEAgLTIxMiw2ICsyMTcsNyBAQAogCSgodW5zaWduZWQgY2hhciAqKSZhZGRyKVsxXSwgXAogCSgodW5zaWduZWQgY2hhciAqKSZhZGRyKVsyXSwgXAogCSgodW5zaWduZWQgY2hhciAqKSZhZGRyKVszXQorI2RlZmluZSBOSVBRVUFEX0ZNVCAiJXUuJXUuJXUuJXUiCiAKICNkZWZpbmUgTklQNihhZGRyKSBcCiAJbnRvaHMoKGFkZHIpLnM2X2FkZHIxNlswXSksIFwKQEAgLTIyMiw2ICsyMjgsOCBAQAogCW50b2hzKChhZGRyKS5zNl9hZGRyMTZbNV0pLCBcCiAJbnRvaHMoKGFkZHIpLnM2X2FkZHIxNls2XSksIFwKIAludG9ocygoYWRkcikuczZfYWRkcjE2WzddKQorI2RlZmluZSBOSVA2X0ZNVCAiJTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4IgorI2RlZmluZSBOSVA2X1NFUUZNVCAiJTA0eCUwNHglMDR4JTA0eCUwNHglMDR4JTA0eCUwNHgiCiAKICNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKICNkZWZpbmUgSElQUVVBRChhZGRyKSBcCkBAIC0yODYsNiArMjk0LDE1IEBACiAJMTsgXAogfSkKIAorLyoKKyAqIENoZWNrIGF0IGNvbXBpbGUgdGltZSB0aGF0ICdmdW5jdGlvbicgaXMgYSBjZXJ0YWluIHR5cGUsIG9yIGlzIGEgcG9pbnRlcgorICogdG8gdGhhdCB0eXBlIChuZWVkcyB0byB1c2UgdHlwZWRlZiBmb3IgdGhlIGZ1bmN0aW9uIHR5cGUuKQorICovCisjZGVmaW5lIHR5cGVjaGVja19mbih0eXBlLGZ1bmN0aW9uKSBcCisoewl0eXBlb2YodHlwZSkgX190bXAgPSBmdW5jdGlvbjsgXAorCSh2b2lkKV9fdG1wOyBcCit9KQorCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZGVmaW5lIFNJX0xPQURfU0hJRlQJMTYKQEAgLTMxNiw4ICszMzMsNiBAQAogI2VuZGlmCiAKIC8qIFRyYXAgcGFzdGVycyBvZiBfX0ZVTkNUSU9OX18gYXQgY29tcGlsZS10aW1lICovCi0jaWYgX19HTlVDX18gPiAyIHx8IF9fR05VQ19NSU5PUl9fID49IDk1CiAjZGVmaW5lIF9fRlVOQ1RJT05fXyAoX19mdW5jX18pCi0jZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tleGVjLmggYi9pbmNsdWRlL2xpbnV4L2tleGVjLmgKaW5kZXggYzg0Njg0Ny4uYTMxMWY1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXhlYy5oCisrKyBiL2luY2x1ZGUvbGludXgva2V4ZWMuaApAQCAtNDEsNyArNDEsNyBAQAogI2RlZmluZSBJTkRfRE9ORSAgICAgICAgIDB4NAogI2RlZmluZSBJTkRfU09VUkNFICAgICAgIDB4OAogCi0jZGVmaW5lIEtFWEVDX1NFR01FTlRfTUFYIDgKKyNkZWZpbmUgS0VYRUNfU0VHTUVOVF9NQVggMTYKIHN0cnVjdCBrZXhlY19zZWdtZW50IHsKIAl2b2lkIF9fdXNlciAqYnVmOwogCXNpemVfdCBidWZzejsKQEAgLTExOSwxMiArMTE5LDE1IEBACiAjZGVmaW5lIEtFWEVDX0FSQ0hfUFBDNjQgICAoMjEgPDwgMTYpCiAjZGVmaW5lIEtFWEVDX0FSQ0hfSUFfNjQgICAoNTAgPDwgMTYpCiAjZGVmaW5lIEtFWEVDX0FSQ0hfUzM5MCAgICAoMjIgPDwgMTYpCisjZGVmaW5lIEtFWEVDX0FSQ0hfU0ggICAgICAoNDIgPDwgMTYpCiAKICNkZWZpbmUgS0VYRUNfRkxBR1MgICAgKEtFWEVDX09OX0NSQVNIKSAgLyogTGlzdCBvZiBkZWZpbmVkL2xlZ2FsIGtleGVjIGZsYWdzICovCiAKIC8qIExvY2F0aW9uIG9mIGEgcmVzZXJ2ZWQgcmVnaW9uIHRvIGhvbGQgdGhlIGNyYXNoIGtlcm5lbC4KICAqLwogZXh0ZXJuIHN0cnVjdCByZXNvdXJjZSBjcmFzaGtfcmVzOwordHlwZWRlZiB1MzIgbm90ZV9idWZfdFtNQVhfTk9URV9CWVRFUy80XTsKK2V4dGVybiBub3RlX2J1Zl90ICpjcmFzaF9ub3RlczsKIAogI2Vsc2UgLyogIUNPTkZJR19LRVhFQyAqLwogc3RydWN0IHB0X3JlZ3M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tleS5oIGIvaW5jbHVkZS9saW51eC9rZXkuaAppbmRleCA0ZDE4OWU1Li5jYmY0NjRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tleS5oCisrKyBiL2luY2x1ZGUvbGludXgva2V5LmgKQEAgLTE3Nyw2ICsxNzcsOCBAQAogLyoKICAqIGtlcm5lbCBtYW5hZ2VkIGtleSB0eXBlIGRlZmluaXRpb24KICAqLwordHlwZWRlZiBpbnQgKCpyZXF1ZXN0X2tleV9hY3Rvcl90KShzdHJ1Y3Qga2V5ICprZXksIHN0cnVjdCBrZXkgKmF1dGhrZXksIGNvbnN0IGNoYXIgKm9wKTsKKwogc3RydWN0IGtleV90eXBlIHsKIAkvKiBuYW1lIG9mIHRoZSB0eXBlICovCiAJY29uc3QgY2hhciAqbmFtZTsKQEAgLTIxOCw2ICsyMjAsMTYgQEAKIAkgKi8KIAlsb25nICgqcmVhZCkoY29uc3Qgc3RydWN0IGtleSAqa2V5LCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgYnVmbGVuKTsKIAorCS8qIGhhbmRsZSByZXF1ZXN0X2tleSgpIGZvciB0aGlzIHR5cGUgaW5zdGVhZCBvZiBpbnZva2luZworCSAqIC9zYmluL3JlcXVlc3Qta2V5IChvcHRpb25hbCkKKwkgKiAtIGtleSBpcyB0aGUga2V5IHRvIGluc3RhbnRpYXRlCisJICogLSBhdXRoa2V5IGlzIHRoZSBhdXRob3JpdHkgdG8gYXNzdW1lIHdoZW4gaW5zdGFudGlhdGluZyB0aGlzIGtleQorCSAqIC0gb3AgaXMgdGhlIG9wZXJhdGlvbiB0byBiZSBkb25lLCB1c3VhbGx5ICJjcmVhdGUiCisJICogLSB0aGUgY2FsbCBtdXN0IG5vdCByZXR1cm4gdW50aWwgdGhlIGluc3RhbnRpYXRpb24gcHJvY2VzcyBoYXMgcnVuCisJICogICBpdHMgY291cnNlCisJICovCisJcmVxdWVzdF9rZXlfYWN0b3JfdCByZXF1ZXN0X2tleTsKKwogCS8qIGludGVybmFsIGZpZWxkcyAqLwogCXN0cnVjdCBsaXN0X2hlYWQJbGluazsJCS8qIGxpbmsgaW4gdHlwZXMgbGlzdCAqLwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2V5Y3RsLmggYi9pbmNsdWRlL2xpbnV4L2tleWN0bC5oCmluZGV4IDhkN2M1OWEuLjMzNjU5NDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2V5Y3RsLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXljdGwuaApAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBLRVlfU1BFQ19VU0VSX0tFWVJJTkcJCS00CS8qIC0ga2V5IElEIGZvciBVSUQtc3BlY2lmaWMga2V5cmluZyAqLwogI2RlZmluZSBLRVlfU1BFQ19VU0VSX1NFU1NJT05fS0VZUklORwktNQkvKiAtIGtleSBJRCBmb3IgVUlELXNlc3Npb24ga2V5cmluZyAqLwogI2RlZmluZSBLRVlfU1BFQ19HUk9VUF9LRVlSSU5HCQktNgkvKiAtIGtleSBJRCBmb3IgR0lELXNwZWNpZmljIGtleXJpbmcgKi8KKyNkZWZpbmUgS0VZX1NQRUNfUkVRS0VZX0FVVEhfS0VZCS03CS8qIC0ga2V5IElEIGZvciBhc3N1bWVkIHJlcXVlc3Rfa2V5IGF1dGgga2V5ICovCiAKIC8qIHJlcXVlc3Qta2V5IGRlZmF1bHQga2V5cmluZ3MgKi8KICNkZWZpbmUgS0VZX1JFUUtFWV9ERUZMX05PX0NIQU5HRQkJLTEKQEAgLTQ2LDUgKzQ3LDcgQEAKICNkZWZpbmUgS0VZQ1RMX0lOU1RBTlRJQVRFCQkxMgkvKiBpbnN0YW50aWF0ZSBhIHBhcnRpYWxseSBjb25zdHJ1Y3RlZCBrZXkgKi8KICNkZWZpbmUgS0VZQ1RMX05FR0FURQkJCTEzCS8qIG5lZ2F0ZSBhIHBhcnRpYWxseSBjb25zdHJ1Y3RlZCBrZXkgKi8KICNkZWZpbmUgS0VZQ1RMX1NFVF9SRVFLRVlfS0VZUklORwkxNAkvKiBzZXQgZGVmYXVsdCByZXF1ZXN0LWtleSBrZXlyaW5nICovCisjZGVmaW5lIEtFWUNUTF9TRVRfVElNRU9VVAkJMTUJLyogc2V0IGtleSB0aW1lb3V0ICovCisjZGVmaW5lIEtFWUNUTF9BU1NVTUVfQVVUSE9SSVRZCQkxNgkvKiBhc3N1bWUgcmVxdWVzdF9rZXkoKSBhdXRob3Jpc2F0aW9uICovCiAKICNlbmRpZiAvKiAgX0xJTlVYX0tFWUNUTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2twcm9iZXMuaCBiL2luY2x1ZGUvbGludXgva3Byb2Jlcy5oCmluZGV4IGMwM2YyZGMuLjY2OTc1NmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3Byb2Jlcy5oCisrKyBiL2luY2x1ZGUvbGludXgva3Byb2Jlcy5oCkBAIC02OCw2ICs2OCw5IEBACiAJLyogbGlzdCBvZiBrcHJvYmVzIGZvciBtdWx0aS1oYW5kbGVyIHN1cHBvcnQgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAKKwkvKiBJbmRpY2F0ZXMgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBtb2R1bGUgaGFzIGJlZW4gcmVmIGNvdW50ZWQgKi8KKwl1bnNpZ25lZCBpbnQgbW9kX3JlZmNvdW50ZWQ7CisKIAkvKmNvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBwcm9iZSB3YXMgdGVtcG9yYXJpbHkgZGlzYXJtZWQgKi8KIAl1bnNpZ25lZCBsb25nIG5taXNzZWQ7CiAKQEAgLTE0OSwxMSArMTUyLDEwIEBACiB9OwogCiBleHRlcm4gc3BpbmxvY2tfdCBrcmV0cHJvYmVfbG9jazsKK2V4dGVybiBzdHJ1Y3Qgc2VtYXBob3JlIGtwcm9iZV9tdXRleDsKIGV4dGVybiBpbnQgYXJjaF9wcmVwYXJlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKTsKLWV4dGVybiB2b2lkIGFyY2hfY29weV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCk7CiBleHRlcm4gdm9pZCBhcmNoX2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCk7CiBleHRlcm4gdm9pZCBhcmNoX2Rpc2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCk7Ci1leHRlcm4gdm9pZCBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCk7CiBleHRlcm4gaW50IGFyY2hfaW5pdF9rcHJvYmVzKHZvaWQpOwogZXh0ZXJuIHZvaWQgc2hvd19yZWdpc3RlcnMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogZXh0ZXJuIGtwcm9iZV9vcGNvZGVfdCAqZ2V0X2luc25fc2xvdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3RpbWUuaCBiL2luY2x1ZGUvbGludXgva3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmQ2NTUyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9rdGltZS5oCkBAIC0wLDAgKzEsMjg0IEBACisvKgorICogIGluY2x1ZGUvbGludXgva3RpbWUuaAorICoKKyAqICBrdGltZV90IC0gbmFub3NlY29uZC1yZXNvbHV0aW9uIHRpbWUgZm9ybWF0LgorICoKKyAqICAgQ29weXJpZ2h0KEMpIDIwMDUsIFRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPgorICogICBDb3B5cmlnaHQoQykgMjAwNSwgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIKKyAqCisgKiAgZGF0YSB0eXBlIGRlZmluaXRpb25zLCBkZWNsYXJhdGlvbnMsIHByb3RvdHlwZXMgYW5kIG1hY3Jvcy4KKyAqCisgKiAgU3RhcnRlZCBieTogVGhvbWFzIEdsZWl4bmVyIGFuZCBJbmdvIE1vbG5hcgorICoKKyAqICBGb3IgbGljZW5jaW5nIGRldGFpbHMgc2VlIGtlcm5lbC1iYXNlL0NPUFlJTkcKKyAqLworI2lmbmRlZiBfTElOVVhfS1RJTUVfSAorI2RlZmluZSBfTElOVVhfS1RJTUVfSAorCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKworLyoKKyAqIGt0aW1lX3Q6CisgKgorICogT24gNjQtYml0IENQVXMgYSBzaW5nbGUgNjQtYml0IHZhcmlhYmxlIGlzIHVzZWQgdG8gc3RvcmUgdGhlIGhydGltZXJzCisgKiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aW1lIHZhbHVlcyBpbiBzY2FsYXIgbmFub3NlY29uZHMuIFRoZQorICogZGVzaWduIHBsYXlzIG91dCBiZXN0IG9uIDY0LWJpdCBDUFVzLCB3aGVyZSBtb3N0IGNvbnZlcnNpb25zIGFyZQorICogTk9QcyBhbmQgbW9zdCBhcml0aG1ldGljIGt0aW1lX3Qgb3BlcmF0aW9ucyBhcmUgcGxhaW4gYXJpdGhtZXRpYworICogb3BlcmF0aW9ucy4KKyAqCisgKiBPbiAzMi1iaXQgQ1BVcyBhbiBvcHRpbWl6ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRpbWVzcGVjIHN0cnVjdHVyZQorICogaXMgdXNlZCB0byBhdm9pZCBleHBlbnNpdmUgY29udmVyc2lvbnMgZnJvbSBhbmQgdG8gdGltZXNwZWNzLiBUaGUKKyAqIGVuZGlhbi1hd2FyZSBvcmRlciBvZiB0aGUgdHYgc3RydWN0IG1lbWJlcnMgaXMgY2hvb3NlbiB0byBhbGxvdworICogbWF0aGVtYXRpY2FsIG9wZXJhdGlvbnMgb24gdGhlIHR2NjQgbWVtYmVyIG9mIHRoZSB1bmlvbiB0b28sIHdoaWNoCisgKiBmb3IgY2VydGFpbiBvcGVyYXRpb25zIHByb2R1Y2VzIGJldHRlciBjb2RlLgorICoKKyAqIEZvciBhcmNoaXRlY3R1cmVzIHdpdGggZWZmaWNpZW50IHN1cHBvcnQgZm9yIDY0LzMyLWJpdCBjb252ZXJzaW9ucyB0aGUKKyAqIHBsYWluIHNjYWxhciBuYW5vc2Vjb25kIGJhc2VkIHJlcHJlc2VudGF0aW9uIGNhbiBiZSBzZWxlY3RlZCBieSB0aGUKKyAqIGNvbmZpZyBzd2l0Y2ggQ09ORklHX0tUSU1FX1NDQUxBUi4KKyAqLwordHlwZWRlZiB1bmlvbiB7CisJczY0CXR2NjQ7CisjaWYgQklUU19QRVJfTE9ORyAhPSA2NCAmJiAhZGVmaW5lZChDT05GSUdfS1RJTUVfU0NBTEFSKQorCXN0cnVjdCB7CisjIGlmZGVmIF9fQklHX0VORElBTgorCXMzMglzZWMsIG5zZWM7CisjIGVsc2UKKwlzMzIJbnNlYywgc2VjOworIyBlbmRpZgorCX0gdHY7CisjZW5kaWYKK30ga3RpbWVfdDsKKworI2RlZmluZSBLVElNRV9NQVgJCQkofigodTY0KTEgPDwgNjMpKQorCisvKgorICoga3RpbWVfdCBkZWZpbml0aW9ucyB3aGVuIHVzaW5nIHRoZSA2NC1iaXQgc2NhbGFyIHJlcHJlc2VudGF0aW9uOgorICovCisKKyNpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkgfHwgZGVmaW5lZChDT05GSUdfS1RJTUVfU0NBTEFSKQorCisvKiBEZWZpbmUgYSBrdGltZV90IHZhcmlhYmxlIGFuZCBpbml0aWFsaXplIGl0IHRvIHplcm86ICovCisjZGVmaW5lIERFRklORV9LVElNRShrdCkJCWt0aW1lX3Qga3QgPSB7IC50djY0ID0gMCB9CisKKy8qKgorICoga3RpbWVfc2V0IC0gU2V0IGEga3RpbWVfdCB2YXJpYWJsZSBmcm9tIGEgc2Vjb25kcy9uYW5vc2Vjb25kcyB2YWx1ZQorICoKKyAqIEBzZWNzOglzZWNvbmRzIHRvIHNldAorICogQG5zZWNzOgluYW5vc2Vjb25kcyB0byBzZXQKKyAqCisgKiBSZXR1cm4gdGhlIGt0aW1lX3QgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlCisgKi8KK3N0YXRpYyBpbmxpbmUga3RpbWVfdCBrdGltZV9zZXQoY29uc3QgbG9uZyBzZWNzLCBjb25zdCB1bnNpZ25lZCBsb25nIG5zZWNzKQoreworCXJldHVybiAoa3RpbWVfdCkgeyAudHY2NCA9IChzNjQpc2VjcyAqIE5TRUNfUEVSX1NFQyArIChzNjQpbnNlY3MgfTsKK30KKworLyogU3VidHJhY3QgdHdvIGt0aW1lX3QgdmFyaWFibGVzLiByZW0gPSBsaHMgLXJoczogKi8KKyNkZWZpbmUga3RpbWVfc3ViKGxocywgcmhzKSBcCisJCSh7IChrdGltZV90KXsgLnR2NjQgPSAobGhzKS50djY0IC0gKHJocykudHY2NCB9OyB9KQorCisvKiBBZGQgdHdvIGt0aW1lX3QgdmFyaWFibGVzLiByZXMgPSBsaHMgKyByaHM6ICovCisjZGVmaW5lIGt0aW1lX2FkZChsaHMsIHJocykgXAorCQkoeyAoa3RpbWVfdCl7IC50djY0ID0gKGxocykudHY2NCArIChyaHMpLnR2NjQgfTsgfSkKKworLyoKKyAqIEFkZCBhIGt0aW1lX3QgdmFyaWFibGUgYW5kIGEgc2NhbGFyIG5hbm9zZWNvbmQgdmFsdWUuCisgKiByZXMgPSBrdCArIG5zdmFsOgorICovCisjZGVmaW5lIGt0aW1lX2FkZF9ucyhrdCwgbnN2YWwpIFwKKwkJKHsgKGt0aW1lX3QpeyAudHY2NCA9IChrdCkudHY2NCArIChuc3ZhbCkgfTsgfSkKKworLyogY29udmVydCBhIHRpbWVzcGVjIHRvIGt0aW1lX3QgZm9ybWF0OiAqLworI2RlZmluZSB0aW1lc3BlY190b19rdGltZSh0cykJCWt0aW1lX3NldCgodHMpLnR2X3NlYywgKHRzKS50dl9uc2VjKQorCisvKiBjb252ZXJ0IGEgdGltZXZhbCB0byBrdGltZV90IGZvcm1hdDogKi8KKyNkZWZpbmUgdGltZXZhbF90b19rdGltZSh0dikJCWt0aW1lX3NldCgodHYpLnR2X3NlYywgKHR2KS50dl91c2VjICogMTAwMCkKKworLyogTWFwIHRoZSBrdGltZV90IHRvIHRpbWVzcGVjIGNvbnZlcnNpb24gdG8gbnNfdG9fdGltZXNwZWMgZnVuY3Rpb24gKi8KKyNkZWZpbmUga3RpbWVfdG9fdGltZXNwZWMoa3QpCQluc190b190aW1lc3BlYygoa3QpLnR2NjQpCisKKy8qIE1hcCB0aGUga3RpbWVfdCB0byB0aW1ldmFsIGNvbnZlcnNpb24gdG8gbnNfdG9fdGltZXZhbCBmdW5jdGlvbiAqLworI2RlZmluZSBrdGltZV90b190aW1ldmFsKGt0KQkJbnNfdG9fdGltZXZhbCgoa3QpLnR2NjQpCisKKy8qIE1hcCB0aGUga3RpbWVfdCB0byBjbG9ja190IGNvbnZlcnNpb24gdG8gdGhlIGlubGluZSBpbiBqaWZmaWVzLmg6ICovCisjZGVmaW5lIGt0aW1lX3RvX2Nsb2NrX3Qoa3QpCQluc2VjX3RvX2Nsb2NrX3QoKGt0KS50djY0KQorCisvKiBDb252ZXJ0IGt0aW1lX3QgdG8gbmFub3NlY29uZHMgLSBOT1AgaW4gdGhlIHNjYWxhciBzdG9yYWdlIGZvcm1hdDogKi8KKyNkZWZpbmUga3RpbWVfdG9fbnMoa3QpCQkJKChrdCkudHY2NCkKKworI2Vsc2UKKworLyoKKyAqIEhlbHBlciBtYWNyb3MvaW5saW5lcyB0byBnZXQgdGhlIGt0aW1lX3QgbWF0aCByaWdodCBpbiB0aGUgdGltZXNwZWMKKyAqIHJlcHJlc2VudGF0aW9uLiBUaGUgbWFjcm9zIGFyZSBzb21ldGltZXMgdWdseSAtIHRoZWlyIGFjdHVhbCB1c2UgaXMKKyAqIHByZXR0eSBva2F5LWlzaCwgZ2l2ZW4gdGhlIGNpcmN1bXN0YW5jZXMuIFdlIGRvIGFsbCB0aGlzIGZvcgorICogcGVyZm9ybWFuY2UgcmVhc29ucy4gVGhlIHB1cmUgc2NhbGFyIG5zZWNfdCBiYXNlZCBjb2RlIHdhcyBuaWNlIGFuZAorICogc2ltcGxlLCBidXQgY3JlYXRlZCB0b28gbWFueSA2NC1iaXQgLyAzMi1iaXQgY29udmVyc2lvbnMgYW5kIGRpdmlzaW9ucy4KKyAqCisgKiBCZSBlc3BlY2lhbGx5IGF3YXJlIHRoYXQgbmVnYXRpdmUgdmFsdWVzIGFyZSByZXByZXNlbnRlZCBpbiBhIHdheQorICogdGhhdCB0aGUgdHYuc2VjIGZpZWxkIGlzIG5lZ2F0aXZlIGFuZCB0aGUgdHYubnNlYyBmaWVsZCBpcyBncmVhdGVyCisgKiBvciBlcXVhbCB0byB6ZXJvIGJ1dCBsZXNzIHRoYW4gbmFub3NlY29uZHMgcGVyIHNlY29uZC4gVGhpcyBpcyB0aGUKKyAqIHNhbWUgcmVwcmVzZW50YXRpb24gd2hpY2ggaXMgdXNlZCBieSB0aW1lc3BlY3MuCisgKgorICogICB0di5zZWMgPCAwIGFuZCAwID49IHR2Lm5zZWMgPCBOU0VDX1BFUl9TRUMKKyAqLworCisvKiBEZWZpbmUgYSBrdGltZV90IHZhcmlhYmxlIGFuZCBpbml0aWFsaXplIGl0IHRvIHplcm86ICovCisjZGVmaW5lIERFRklORV9LVElNRShrdCkJCWt0aW1lX3Qga3QgPSB7IC50djY0ID0gMCB9CisKKy8qIFNldCBhIGt0aW1lX3QgdmFyaWFibGUgdG8gYSB2YWx1ZSBpbiBzZWMvbnNlYyByZXByZXNlbnRhdGlvbjogKi8KK3N0YXRpYyBpbmxpbmUga3RpbWVfdCBrdGltZV9zZXQoY29uc3QgbG9uZyBzZWNzLCBjb25zdCB1bnNpZ25lZCBsb25nIG5zZWNzKQoreworCXJldHVybiAoa3RpbWVfdCkgeyAudHYgPSB7IC5zZWMgPSBzZWNzLCAubnNlYyA9IG5zZWNzIH0gfTsKK30KKworLyoqCisgKiBrdGltZV9zdWIgLSBzdWJ0cmFjdCB0d28ga3RpbWVfdCB2YXJpYWJsZXMKKyAqCisgKiBAbGhzOgltaW51ZW5kCisgKiBAcmhzOglzdWJ0cmFoZW5kCisgKgorICogUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIHRoZSBzdWJzdHJhY3Rpb24KKyAqLworc3RhdGljIGlubGluZSBrdGltZV90IGt0aW1lX3N1Yihjb25zdCBrdGltZV90IGxocywgY29uc3Qga3RpbWVfdCByaHMpCit7CisJa3RpbWVfdCByZXM7CisKKwlyZXMudHY2NCA9IGxocy50djY0IC0gcmhzLnR2NjQ7CisJaWYgKHJlcy50di5uc2VjIDwgMCkKKwkJcmVzLnR2Lm5zZWMgKz0gTlNFQ19QRVJfU0VDOworCisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBrdGltZV9hZGQgLSBhZGQgdHdvIGt0aW1lX3QgdmFyaWFibGVzCisgKgorICogQGFkZDE6CWFkZGVuZDEKKyAqIEBhZGQyOglhZGRlbmQyCisgKgorICogUmV0dXJucyB0aGUgc3VtIG9mIGFkZGVuZDEgYW5kIGFkZGVuZDIKKyAqLworc3RhdGljIGlubGluZSBrdGltZV90IGt0aW1lX2FkZChjb25zdCBrdGltZV90IGFkZDEsIGNvbnN0IGt0aW1lX3QgYWRkMikKK3sKKwlrdGltZV90IHJlczsKKworCXJlcy50djY0ID0gYWRkMS50djY0ICsgYWRkMi50djY0OworCS8qCisJICogcGVyZm9ybWFuY2UgdHJpY2s6IHRoZSAodTMyKSAtTlNFQyBnaXZlcyAweDAwMDAwMDAwRnh4eHh4eHgKKwkgKiBzbyB3ZSBzdWJ0cmFjdCBOU0VDX1BFUl9TRUMgYW5kIGFkZCAxIHRvIHRoZSB1cHBlciAzMiBiaXQuCisJICoKKwkgKiBpdCdzIGVxdWl2YWxlbnQgdG86CisJICogICB0di5uc2VjIC09IE5TRUNfUEVSX1NFQworCSAqICAgdHYuc2VjICsrOworCSAqLworCWlmIChyZXMudHYubnNlYyA+PSBOU0VDX1BFUl9TRUMpCisJCXJlcy50djY0ICs9ICh1MzIpLU5TRUNfUEVSX1NFQzsKKworCXJldHVybiByZXM7Cit9CisKKy8qKgorICoga3RpbWVfYWRkX25zIC0gQWRkIGEgc2NhbGFyIG5hbm9zZWNvbmRzIHZhbHVlIHRvIGEga3RpbWVfdCB2YXJpYWJsZQorICoKKyAqIEBrdDoJCWFkZGVuZAorICogQG5zZWM6CXRoZSBzY2FsYXIgbnNlYyB2YWx1ZSB0byBhZGQKKyAqCisgKiBSZXR1cm5zIHRoZSBzdW0gb2Yga3QgYW5kIG5zZWMgaW4ga3RpbWVfdCBmb3JtYXQKKyAqLworZXh0ZXJuIGt0aW1lX3Qga3RpbWVfYWRkX25zKGNvbnN0IGt0aW1lX3Qga3QsIHU2NCBuc2VjKTsKKworLyoqCisgKiB0aW1lc3BlY190b19rdGltZSAtIGNvbnZlcnQgYSB0aW1lc3BlYyB0byBrdGltZV90IGZvcm1hdAorICoKKyAqIEB0czoJCXRoZSB0aW1lc3BlYyB2YXJpYWJsZSB0byBjb252ZXJ0CisgKgorICogUmV0dXJucyBhIGt0aW1lX3QgdmFyaWFibGUgd2l0aCB0aGUgY29udmVydGVkIHRpbWVzcGVjIHZhbHVlCisgKi8KK3N0YXRpYyBpbmxpbmUga3RpbWVfdCB0aW1lc3BlY190b19rdGltZShjb25zdCBzdHJ1Y3QgdGltZXNwZWMgdHMpCit7CisJcmV0dXJuIChrdGltZV90KSB7IC50diA9IHsgLnNlYyA9IChzMzIpdHMudHZfc2VjLAorCQkJICAgCSAgIC5uc2VjID0gKHMzMil0cy50dl9uc2VjIH0gfTsKK30KKworLyoqCisgKiB0aW1ldmFsX3RvX2t0aW1lIC0gY29udmVydCBhIHRpbWV2YWwgdG8ga3RpbWVfdCBmb3JtYXQKKyAqCisgKiBAdHY6CQl0aGUgdGltZXZhbCB2YXJpYWJsZSB0byBjb252ZXJ0CisgKgorICogUmV0dXJucyBhIGt0aW1lX3QgdmFyaWFibGUgd2l0aCB0aGUgY29udmVydGVkIHRpbWV2YWwgdmFsdWUKKyAqLworc3RhdGljIGlubGluZSBrdGltZV90IHRpbWV2YWxfdG9fa3RpbWUoY29uc3Qgc3RydWN0IHRpbWV2YWwgdHYpCit7CisJcmV0dXJuIChrdGltZV90KSB7IC50diA9IHsgLnNlYyA9IChzMzIpdHYudHZfc2VjLAorCQkJCSAgIC5uc2VjID0gKHMzMil0di50dl91c2VjICogMTAwMCB9IH07Cit9CisKKy8qKgorICoga3RpbWVfdG9fdGltZXNwZWMgLSBjb252ZXJ0IGEga3RpbWVfdCB2YXJpYWJsZSB0byB0aW1lc3BlYyBmb3JtYXQKKyAqCisgKiBAa3Q6CQl0aGUga3RpbWVfdCB2YXJpYWJsZSB0byBjb252ZXJ0CisgKgorICogUmV0dXJucyB0aGUgdGltZXNwZWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGt0aW1lIHZhbHVlCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRpbWVzcGVjIGt0aW1lX3RvX3RpbWVzcGVjKGNvbnN0IGt0aW1lX3Qga3QpCit7CisJcmV0dXJuIChzdHJ1Y3QgdGltZXNwZWMpIHsgLnR2X3NlYyA9ICh0aW1lX3QpIGt0LnR2LnNlYywKKwkJCQkgICAudHZfbnNlYyA9IChsb25nKSBrdC50di5uc2VjIH07Cit9CisKKy8qKgorICoga3RpbWVfdG9fdGltZXZhbCAtIGNvbnZlcnQgYSBrdGltZV90IHZhcmlhYmxlIHRvIHRpbWV2YWwgZm9ybWF0CisgKgorICogQGt0OgkJdGhlIGt0aW1lX3QgdmFyaWFibGUgdG8gY29udmVydAorICoKKyAqIFJldHVybnMgdGhlIHRpbWV2YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGt0aW1lIHZhbHVlCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRpbWV2YWwga3RpbWVfdG9fdGltZXZhbChjb25zdCBrdGltZV90IGt0KQoreworCXJldHVybiAoc3RydWN0IHRpbWV2YWwpIHsKKwkJLnR2X3NlYyA9ICh0aW1lX3QpIGt0LnR2LnNlYywKKwkJLnR2X3VzZWMgPSAoc3VzZWNvbmRzX3QpIChrdC50di5uc2VjIC8gTlNFQ19QRVJfVVNFQykgfTsKK30KKworLyoqCisgKiBrdGltZV90b19jbG9ja190IC0gY29udmVydCBhIGt0aW1lX3QgdmFyaWFibGUgdG8gY2xvY2tfdCBmb3JtYXQKKyAqIEBrdDoJCXRoZSBrdGltZV90IHZhcmlhYmxlIHRvIGNvbnZlcnQKKyAqCisgKiBSZXR1cm5zIGEgY2xvY2tfdCB2YXJpYWJsZSB3aXRoIHRoZSBjb252ZXJ0ZWQgdmFsdWUKKyAqLworc3RhdGljIGlubGluZSBjbG9ja190IGt0aW1lX3RvX2Nsb2NrX3QoY29uc3Qga3RpbWVfdCBrdCkKK3sKKwlyZXR1cm4gbnNlY190b19jbG9ja190KCAodTY0KSBrdC50di5zZWMgKiBOU0VDX1BFUl9TRUMgKyBrdC50di5uc2VjKTsKK30KKworLyoqCisgKiBrdGltZV90b19ucyAtIGNvbnZlcnQgYSBrdGltZV90IHZhcmlhYmxlIHRvIHNjYWxhciBuYW5vc2Vjb25kcworICogQGt0OgkJdGhlIGt0aW1lX3QgdmFyaWFibGUgdG8gY29udmVydAorICoKKyAqIFJldHVybnMgdGhlIHNjYWxhciBuYW5vc2Vjb25kcyByZXByZXNlbnRhdGlvbiBvZiBrdAorICovCitzdGF0aWMgaW5saW5lIHU2NCBrdGltZV90b19ucyhjb25zdCBrdGltZV90IGt0KQoreworCXJldHVybiAodTY0KSBrdC50di5zZWMgKiBOU0VDX1BFUl9TRUMgKyBrdC50di5uc2VjOworfQorCisjZW5kaWYKKworLyoKKyAqIFRoZSByZXNvbHV0aW9uIG9mIHRoZSBjbG9ja3MuIFRoZSByZXNvbHV0aW9uIHZhbHVlIGlzIHJldHVybmVkIGluCisgKiB0aGUgY2xvY2tfZ2V0cmVzKCkgc3lzdGVtIGNhbGwgdG8gZ2l2ZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWVycyBhbgorICogaWRlYSBvZiB0aGUgKGluKWFjY3VyYWN5IG9mIHRpbWVycy4gVGltZXIgdmFsdWVzIGFyZSByb3VuZGVkIHVwIHRvCisgKiB0aGlzIHJlc29sdXRpb24gdmFsdWVzLgorICovCisjZGVmaW5lIEtUSU1FX1JFQUxUSU1FX1JFUwkoa3RpbWVfdCl7IC50djY0ID0gVElDS19OU0VDIH0KKyNkZWZpbmUgS1RJTUVfTU9OT1RPTklDX1JFUwkoa3RpbWVfdCl7IC50djY0ID0gVElDS19OU0VDIH0KKworLyogR2V0IHRoZSBtb25vdG9uaWMgdGltZSBpbiB0aW1lc3BlYyBmb3JtYXQ6ICovCitleHRlcm4gdm9pZCBrdGltZV9nZXRfdHMoc3RydWN0IHRpbWVzcGVjICp0cyk7CisKKy8qIEdldCB0aGUgcmVhbCAod2FsbC0pIHRpbWUgaW4gdGltZXNwZWMgZm9ybWF0OiAqLworI2RlZmluZSBrdGltZV9nZXRfcmVhbF90cyh0cykJZ2V0bnN0aW1lb2ZkYXkodHMpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9saWJhdGEuaCBiL2luY2x1ZGUvbGludXgvbGliYXRhLmgKaW5kZXggYTQzYzk1Zi4uOWU1ZGIyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9saWJhdGEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCkBAIC0xMjYsMTYgKzEyNiwxOSBAQAogCiAJQVRBX0ZMQUdfU1VTUEVOREVECT0gKDEgPDwgMTIpLCAvKiBwb3J0IGlzIHN1c3BlbmRlZCAqLwogCisJQVRBX0ZMQUdfUElPX0xCQTQ4CT0gKDEgPDwgMTMpLCAvKiBIb3N0IERNQSBlbmdpbmUgaXMgTEJBMjggb25seSAqLworCUFUQV9GTEFHX0lSUV9NQVNLCT0gKDEgPDwgMTQpLCAvKiBNYXNrIElSUSBpbiBQSU8geGZlcnMgKi8KKwogCUFUQV9RQ0ZMQUdfQUNUSVZFCT0gKDEgPDwgMSksIC8qIGNtZCBub3QgeWV0IGFjaydkIHRvIHNjc2kgbHllciAqLwogCUFUQV9RQ0ZMQUdfU0cJCT0gKDEgPDwgMyksIC8qIGhhdmUgcy9nIHRhYmxlPyAqLwogCUFUQV9RQ0ZMQUdfU0lOR0xFCT0gKDEgPDwgNCksIC8qIG5vIHMvZywganVzdCBhIHNpbmdsZSBidWZmZXIgKi8KIAlBVEFfUUNGTEFHX0RNQU1BUAk9IEFUQV9RQ0ZMQUdfU0cgfCBBVEFfUUNGTEFHX1NJTkdMRSwKIAogCS8qIHZhcmlvdXMgbGVuZ3RocyBvZiB0aW1lICovCi0JQVRBX1RNT1VUX0VERAkJPSA1ICogSFosCS8qIGh1ZXJpc3RpYyAqLworCUFUQV9UTU9VVF9FREQJCT0gNSAqIEhaLAkvKiBoZXVyaXN0aWMgKi8KIAlBVEFfVE1PVVRfUElPCQk9IDMwICogSFosCi0JQVRBX1RNT1VUX0JPT1QJCT0gMzAgKiBIWiwJLyogaHVlcmlzdGljICovCi0JQVRBX1RNT1VUX0JPT1RfUVVJQ0sJPSA3ICogSFosCS8qIGh1ZXJpc3RpYyAqLworCUFUQV9UTU9VVF9CT09UCQk9IDMwICogSFosCS8qIGhldXJpc3RpYyAqLworCUFUQV9UTU9VVF9CT09UX1FVSUNLCT0gNyAqIEhaLAkvKiBoZXVyaXN0aWMgKi8KIAlBVEFfVE1PVVRfQ0RCCQk9IDMwICogSFosCiAJQVRBX1RNT1VUX0NEQl9RVUlDSwk9IDUgKiBIWiwKIAlBVEFfVE1PVVRfSU5URVJOQUwJPSAzMCAqIEhaLApAQCAtNDk5LDYgKzUwMiw4IEBACiAvKgogICogVGltaW5nIGhlbHBlcnMKICAqLworCitleHRlcm4gdW5zaWduZWQgaW50IGF0YV9waW9fbmVlZF9pb3JkeShjb25zdCBzdHJ1Y3QgYXRhX2RldmljZSAqKTsKIGV4dGVybiBpbnQgYXRhX3RpbWluZ19jb21wdXRlKHN0cnVjdCBhdGFfZGV2aWNlICosIHVuc2lnbmVkIHNob3J0LAogCQkJICAgICAgc3RydWN0IGF0YV90aW1pbmcgKiwgaW50LCBpbnQpOwogZXh0ZXJuIHZvaWQgYXRhX3RpbWluZ19tZXJnZShjb25zdCBzdHJ1Y3QgYXRhX3RpbWluZyAqLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9saXN0LmggYi9pbmNsdWRlL2xpbnV4L2xpc3QuaAppbmRleCA4ZTMzODgyLi45NDVkYWExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xpc3QuaApAQCAtNDM2LDYgKzQzNiwyMCBAQAogCSAgICAgcG9zID0gbiwgbiA9IGxpc3RfZW50cnkobi0+bWVtYmVyLm5leHQsIHR5cGVvZigqbiksIG1lbWJlcikpCiAKIC8qKgorICogbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UgLSBpdGVyYXRlIGJhY2t3YXJkcyBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSBzYWZlIGFnYWluc3QKKyAqCQkJCSAgICAgIHJlbW92YWwgb2YgbGlzdCBlbnRyeQorICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBAbjoJCWFub3RoZXIgdHlwZSAqIHRvIHVzZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZQorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKi8KKyNkZWZpbmUgbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UocG9zLCBuLCBoZWFkLCBtZW1iZXIpCQlcCisJZm9yIChwb3MgPSBsaXN0X2VudHJ5KChoZWFkKS0+cHJldiwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCW4gPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLnByZXYsIHR5cGVvZigqcG9zKSwgbWVtYmVyKTsJXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsgCQkJCQlcCisJICAgICBwb3MgPSBuLCBuID0gbGlzdF9lbnRyeShuLT5tZW1iZXIucHJldiwgdHlwZW9mKCpuKSwgbWVtYmVyKSkKKworLyoqCiAgKiBsaXN0X2Zvcl9lYWNoX3JjdQktCWl0ZXJhdGUgb3ZlciBhbiByY3UtcHJvdGVjdGVkIGxpc3QKICAqIEBwb3M6CXRoZSAmc3RydWN0IGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCiAgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbG9vcC5oIGIvaW5jbHVkZS9saW51eC9sb29wLmgKaW5kZXggNDBmNjNjOS4uZjk2NTA2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sb29wLmgKKysrIGIvaW5jbHVkZS9saW51eC9sb29wLmgKQEAgLTU4LDkgKzU4LDkgQEAKIAlzdHJ1Y3QgYmlvIAkJKmxvX2JpbzsKIAlzdHJ1Y3QgYmlvCQkqbG9fYmlvdGFpbDsKIAlpbnQJCQlsb19zdGF0ZTsKLQlzdHJ1Y3Qgc2VtYXBob3JlCWxvX3NlbTsKKwlzdHJ1Y3QgY29tcGxldGlvbglsb19kb25lOworCXN0cnVjdCBjb21wbGV0aW9uCWxvX2JoX2RvbmU7CiAJc3RydWN0IHNlbWFwaG9yZQlsb19jdGxfbXV0ZXg7Ci0Jc3RydWN0IHNlbWFwaG9yZQlsb19iaF9tdXRleDsKIAlpbnQJCQlsb19wZW5kaW5nOwogCiAJcmVxdWVzdF9xdWV1ZV90CQkqbG9fcXVldWU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbW9yeS5oIGIvaW5jbHVkZS9saW51eC9tZW1vcnkuaAppbmRleCBkYzQwODFiLi5lMjUxZGM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21lbW9yeS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWVtb3J5LmgKQEAgLTcwLDIxICs3MCwxNSBAQAogewogfQogI2Vsc2UKLWV4dGVybiBpbnQgcmVnaXN0ZXJfbWVtb3J5KHN0cnVjdCBtZW1vcnlfYmxvY2sgKiwgc3RydWN0IG1lbV9zZWN0aW9uICpzZWN0aW9uLCBzdHJ1Y3Qgbm9kZSAqKTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfbmV3X21lbW9yeShzdHJ1Y3QgbWVtX3NlY3Rpb24gKik7CiBleHRlcm4gaW50IHVucmVnaXN0ZXJfbWVtb3J5X3NlY3Rpb24oc3RydWN0IG1lbV9zZWN0aW9uICopOwogZXh0ZXJuIGludCBtZW1vcnlfZGV2X2luaXQodm9pZCk7Ci1leHRlcm4gaW50IHJlZ2lzdGVyX21lbW9yeV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKLWV4dGVybiB2b2lkIHVucmVnaXN0ZXJfbWVtb3J5X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOworZXh0ZXJuIGludCByZW1vdmVfbWVtb3J5X2Jsb2NrKHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBtZW1fc2VjdGlvbiAqLCBpbnQpOwogCiAjZGVmaW5lIENPTkZJR19NRU1fQkxPQ0tfU0laRQkoUEFHRVNfUEVSX1NFQ1RJT048PFBBR0VfU0hJRlQpCiAKLWV4dGVybiBpbnQgaW52YWxpZGF0ZV9waHlzX21hcHBpbmcodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CiBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2s7CiAKLWV4dGVybiBpbnQgcmVnaXN0ZXJfbWVtb3J5X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwotZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl9tZW1vcnlfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7Ci0KICNlbmRpZiAvKiBDT05GSUdfTUVNT1JZX0hPVFBMVUcgKi8KIAogI2RlZmluZSBob3RwbHVnX21lbW9yeV9ub3RpZmllcihmbiwgcHJpKSB7CQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaCBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKaW5kZXggZWQwMGIyNy4uYmJkMjIyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaAorKysgYi9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oCkBAIC0yMiw2ICsyMiw5IEBACiAKIC8qIEZsYWdzIGZvciBtYmluZCAqLwogI2RlZmluZSBNUE9MX01GX1NUUklDVAkoMTw8MCkJLyogVmVyaWZ5IGV4aXN0aW5nIHBhZ2VzIGluIHRoZSBtYXBwaW5nICovCisjZGVmaW5lIE1QT0xfTUZfTU9WRQkoMTw8MSkJLyogTW92ZSBwYWdlcyBvd25lZCBieSB0aGlzIHByb2Nlc3MgdG8gY29uZm9ybSB0byBtYXBwaW5nICovCisjZGVmaW5lIE1QT0xfTUZfTU9WRV9BTEwgKDE8PDIpCS8qIE1vdmUgZXZlcnkgcGFnZSB0byBjb25mb3JtIHRvIG1hcHBpbmcgKi8KKyNkZWZpbmUgTVBPTF9NRl9JTlRFUk5BTCAoMTw8MykJLyogSW50ZXJuYWwgZmxhZ3Mgc3RhcnQgaGVyZSAqLwogCiAjaWZkZWYgX19LRVJORUxfXwogCkBAIC02NSw2ICs2OCw3IEBACiAJCW5vZGVtYXNrX3QJIG5vZGVzOwkJLyogaW50ZXJsZWF2ZSAqLwogCQkvKiB1bmRlZmluZWQgZm9yIGRlZmF1bHQgKi8KIAl9IHY7CisJbm9kZW1hc2tfdCBjcHVzZXRfbWVtc19hbGxvd2VkOwkvKiBtZW1wb2xpY3kgcmVsYXRpdmUgdG8gdGhlc2Ugbm9kZXMgKi8KIH07CiAKIC8qCkBAIC0xMjgsMTIgKzEzMiw4IEBACiAJc3BpbmxvY2tfdCBsb2NrOwogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIG1wb2xfc2hhcmVkX3BvbGljeV9pbml0KHN0cnVjdCBzaGFyZWRfcG9saWN5ICppbmZvKQotewotCWluZm8tPnJvb3QgPSBSQl9ST09UOwotCXNwaW5fbG9ja19pbml0KCZpbmZvLT5sb2NrKTsKLX0KLQordm9pZCBtcG9sX3NoYXJlZF9wb2xpY3lfaW5pdChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqaW5mbywgaW50IHBvbGljeSwKKwkJCQlub2RlbWFza190ICpub2Rlcyk7CiBpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqaW5mbywKIAkJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQlzdHJ1Y3QgbWVtcG9saWN5ICpuZXcpOwpAQCAtMTQxLDE1ICsxNDEsMjUgQEAKIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2xfc2hhcmVkX3BvbGljeV9sb29rdXAoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLAogCQkJCQkgICAgdW5zaWduZWQgbG9uZyBpZHgpOwogCi1zdHJ1Y3QgbWVtcG9saWN5ICpnZXRfdm1hX3BvbGljeShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCi0JCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyKTsKLQogZXh0ZXJuIHZvaWQgbnVtYV9kZWZhdWx0X3BvbGljeSh2b2lkKTsKIGV4dGVybiB2b2lkIG51bWFfcG9saWN5X2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBudW1hX3BvbGljeV9yZWJpbmQoY29uc3Qgbm9kZW1hc2tfdCAqb2xkLCBjb25zdCBub2RlbWFza190ICpuZXcpOworZXh0ZXJuIHZvaWQgbXBvbF9yZWJpbmRfcG9saWN5KHN0cnVjdCBtZW1wb2xpY3kgKnBvbCwgY29uc3Qgbm9kZW1hc2tfdCAqbmV3KTsKK2V4dGVybiB2b2lkIG1wb2xfcmViaW5kX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCisJCQkJCWNvbnN0IG5vZGVtYXNrX3QgKm5ldyk7CitleHRlcm4gdm9pZCBtcG9sX3JlYmluZF9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgbm9kZW1hc2tfdCAqbmV3KTsKKyNkZWZpbmUgc2V0X2NwdXNldF9iZWluZ19yZWJvdW5kKHgpIChjcHVzZXRfYmVpbmdfcmVib3VuZCA9ICh4KSkKKworI2lmZGVmIENPTkZJR19DUFVTRVQKKyNkZWZpbmUgY3VycmVudF9jcHVzZXRfaXNfYmVpbmdfcmVib3VuZCgpIFwKKwkJCQkoY3B1c2V0X2JlaW5nX3JlYm91bmQgPT0gY3VycmVudC0+Y3B1c2V0KQorI2Vsc2UKKyNkZWZpbmUgY3VycmVudF9jcHVzZXRfaXNfYmVpbmdfcmVib3VuZCgpIDAKKyNlbmRpZgorCiBleHRlcm4gc3RydWN0IG1lbXBvbGljeSBkZWZhdWx0X3BvbGljeTsKIGV4dGVybiBzdHJ1Y3Qgem9uZWxpc3QgKmh1Z2Vfem9uZWxpc3Qoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCXVuc2lnbmVkIGxvbmcgYWRkcik7CitleHRlcm4gdW5zaWduZWQgc2xhYl9ub2RlKHN0cnVjdCBtZW1wb2xpY3kgKnBvbGljeSk7CiAKIGV4dGVybiBpbnQgcG9saWN5X3pvbmU7CiAKQEAgLTE1OSw2ICsxNjksMTEgQEAKIAkJcG9saWN5X3pvbmUgPSBrOwogfQogCitpbnQgZG9fbWlncmF0ZV9wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwljb25zdCBub2RlbWFza190ICpmcm9tX25vZGVzLCBjb25zdCBub2RlbWFza190ICp0b19ub2RlcywgaW50IGZsYWdzKTsKKworZXh0ZXJuIHZvaWQgKmNwdXNldF9iZWluZ19yZWJvdW5kOwkvKiBUcmlnZ2VyIG1wb2xfY29weSB2bWEgcmViaW5kICovCisKICNlbHNlCiAKIHN0cnVjdCBtZW1wb2xpY3kge307CkBAIC0xOTMsNyArMjA4LDggQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG1wb2xfc2hhcmVkX3BvbGljeV9pbml0KHN0cnVjdCBzaGFyZWRfcG9saWN5ICppbmZvKQorc3RhdGljIGlubGluZSB2b2lkIG1wb2xfc2hhcmVkX3BvbGljeV9pbml0KHN0cnVjdCBzaGFyZWRfcG9saWN5ICppbmZvLAorCQkJCQlpbnQgcG9saWN5LCBub2RlbWFza190ICpub2RlcykKIHsKIH0KIApAQCAtMjE4LDE3ICsyMzQsMzUgQEAKIHsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG51bWFfcG9saWN5X3JlYmluZChjb25zdCBub2RlbWFza190ICpvbGQsCitzdGF0aWMgaW5saW5lIHZvaWQgbXBvbF9yZWJpbmRfcG9saWN5KHN0cnVjdCBtZW1wb2xpY3kgKnBvbCwKIAkJCQkJY29uc3Qgbm9kZW1hc2tfdCAqbmV3KQogewogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgbXBvbF9yZWJpbmRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKKwkJCQkJY29uc3Qgbm9kZW1hc2tfdCAqbmV3KQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXBvbF9yZWJpbmRfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0sIG5vZGVtYXNrX3QgKm5ldykKK3sKK30KKworI2RlZmluZSBzZXRfY3B1c2V0X2JlaW5nX3JlYm91bmQoeCkgZG8ge30gd2hpbGUgKDApCisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHpvbmVsaXN0ICpodWdlX3pvbmVsaXN0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQl1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJcmV0dXJuIE5PREVfREFUQSgwKS0+bm9kZV96b25lbGlzdHMgKyBnZnBfem9uZShHRlBfSElHSFVTRVIpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBkb19taWdyYXRlX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJY29uc3Qgbm9kZW1hc2tfdCAqZnJvbV9ub2RlcywKKwkJCWNvbnN0IG5vZGVtYXNrX3QgKnRvX25vZGVzLCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19oaWdoZXN0X3pvbmUoaW50IGspCiB7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmgKaW5kZXggYmMwMWZmZi4uODU4NTRiOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW0uaApAQCAtMyw2ICszLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKQEAgLTEzLDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9wcmlvX3RyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKIHN0cnVjdCBtZW1wb2xpY3k7CiBzdHJ1Y3QgYW5vbl92bWE7CkBAIC0yMjMsMjQgKzIyNSwyNyBAQAogCQkJCQkgKiAmIGxpbWl0IHJldmVyc2UgbWFwIHNlYXJjaGVzLgogCQkJCQkgKi8KIAl1bmlvbiB7Ci0JCXVuc2lnbmVkIGxvbmcgcHJpdmF0ZTsJLyogTWFwcGluZy1wcml2YXRlIG9wYXF1ZSBkYXRhOgotCQkJCQkgKiB1c3VhbGx5IHVzZWQgZm9yIGJ1ZmZlcl9oZWFkcwotCQkJCQkgKiBpZiBQYWdlUHJpdmF0ZSBzZXQ7IHVzZWQgZm9yCi0JCQkJCSAqIHN3cF9lbnRyeV90IGlmIFBhZ2VTd2FwQ2FjaGUKLQkJCQkJICogV2hlbiBwYWdlIGlzIGZyZWUsIHRoaXMgaW5kaWNhdGVzCi0JCQkJCSAqIG9yZGVyIGluIHRoZSBidWRkeSBzeXN0ZW0uCi0JCQkJCSAqLworCSAgICBzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nIHByaXZhdGU7CQkvKiBNYXBwaW5nLXByaXZhdGUgb3BhcXVlIGRhdGE6CisJCQkJCSAJICogdXN1YWxseSB1c2VkIGZvciBidWZmZXJfaGVhZHMKKwkJCQkJCSAqIGlmIFBhZ2VQcml2YXRlIHNldDsgdXNlZCBmb3IKKwkJCQkJCSAqIHN3cF9lbnRyeV90IGlmIFBhZ2VTd2FwQ2FjaGUuCisJCQkJCQkgKiBXaGVuIHBhZ2UgaXMgZnJlZSwgdGhpcworCQkJCQkJICogaW5kaWNhdGVzIG9yZGVyIGluIHRoZSBidWRkeQorCQkJCQkJICogc3lzdGVtLgorCQkJCQkJICovCisJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOwkvKiBJZiBsb3cgYml0IGNsZWFyLCBwb2ludHMgdG8KKwkJCQkJCSAqIGlub2RlIGFkZHJlc3Nfc3BhY2UsIG9yIE5VTEwuCisJCQkJCQkgKiBJZiBwYWdlIG1hcHBlZCBhcyBhbm9ueW1vdXMKKwkJCQkJCSAqIG1lbW9yeSwgbG93IGJpdCBpcyBzZXQsIGFuZAorCQkJCQkJICogaXQgcG9pbnRzIHRvIGFub25fdm1hIG9iamVjdDoKKwkJCQkJCSAqIHNlZSBQQUdFX01BUFBJTkdfQU5PTiBiZWxvdy4KKwkJCQkJCSAqLworCSAgICB9OwogI2lmIE5SX0NQVVMgPj0gQ09ORklHX1NQTElUX1BUTE9DS19DUFVTCi0JCXNwaW5sb2NrX3QgcHRsOworCSAgICBzcGlubG9ja190IHB0bDsKICNlbmRpZgotCX0gdTsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsJLyogSWYgbG93IGJpdCBjbGVhciwgcG9pbnRzIHRvCi0JCQkJCSAqIGlub2RlIGFkZHJlc3Nfc3BhY2UsIG9yIE5VTEwuCi0JCQkJCSAqIElmIHBhZ2UgbWFwcGVkIGFzIGFub255bW91cwotCQkJCQkgKiBtZW1vcnksIGxvdyBiaXQgaXMgc2V0LCBhbmQKLQkJCQkJICogaXQgcG9pbnRzIHRvIGFub25fdm1hIG9iamVjdDoKLQkJCQkJICogc2VlIFBBR0VfTUFQUElOR19BTk9OIGJlbG93LgotCQkJCQkgKi8KKwl9OwogCXBnb2ZmX3QgaW5kZXg7CQkJLyogT3VyIG9mZnNldCB3aXRoaW4gbWFwcGluZy4gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGxydTsJCS8qIFBhZ2VvdXQgbGlzdCwgZWcuIGFjdGl2ZV9saXN0CiAJCQkJCSAqIHByb3RlY3RlZCBieSB6b25lLT5scnVfbG9jayAhCkBAIC0yNjEsOCArMjY2LDggQEAKICNlbmRpZiAvKiBXQU5UX1BBR0VfVklSVFVBTCAqLwogfTsKIAotI2RlZmluZSBwYWdlX3ByaXZhdGUocGFnZSkJCSgocGFnZSktPnUucHJpdmF0ZSkKLSNkZWZpbmUgc2V0X3BhZ2VfcHJpdmF0ZShwYWdlLCB2KQkoKHBhZ2UpLT51LnByaXZhdGUgPSAodikpCisjZGVmaW5lIHBhZ2VfcHJpdmF0ZShwYWdlKQkJKChwYWdlKS0+cHJpdmF0ZSkKKyNkZWZpbmUgc2V0X3BhZ2VfcHJpdmF0ZShwYWdlLCB2KQkoKHBhZ2UpLT5wcml2YXRlID0gKHYpKQogCiAvKgogICogRklYTUU6IHRha2UgdGhpcyBpbmNsdWRlIG91dCwgaW5jbHVkZSBwYWdlLWZsYWdzLmggaW4KQEAgLTMwOCw3ICszMTMsNyBAQAogICovCiAjZGVmaW5lIGdldF9wYWdlX3Rlc3RvbmUocCkJYXRvbWljX2luY19hbmRfdGVzdCgmKHApLT5fY291bnQpCiAKLSNkZWZpbmUgc2V0X3BhZ2VfY291bnQocCx2KSAJYXRvbWljX3NldCgmKHApLT5fY291bnQsIHYgLSAxKQorI2RlZmluZSBzZXRfcGFnZV9jb3VudChwLHYpIAlhdG9taWNfc2V0KCYocCktPl9jb3VudCwgKHYpIC0gMSkKICNkZWZpbmUgX19wdXRfcGFnZShwKQkJYXRvbWljX2RlYygmKHApLT5fY291bnQpCiAKIGV4dGVybiB2b2lkIEZBU1RDQUxMKF9fcGFnZV9jYWNoZV9yZWxlYXNlKHN0cnVjdCBwYWdlICopKTsKQEAgLTUwNyw3ICs1MTIsNyBAQAogZXh0ZXJuIHN0cnVjdCBwYWdlICptZW1fbWFwOwogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqbG93bWVtX3BhZ2VfYWRkcmVzcyhzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqbG93bWVtX3BhZ2VfYWRkcmVzcyhzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlyZXR1cm4gX192YShwYWdlX3RvX3BmbihwYWdlKSA8PCBQQUdFX1NISUZUKTsKIH0KQEAgLTgxNSw3ICs4MjAsNyBAQAogICogb3ZlcmZsb3cgaW50byB0aGUgbmV4dCBzdHJ1Y3QgcGFnZSAoYXMgaXQgbWlnaHQgd2l0aCBERUJVR19TUElOTE9DSykuCiAgKiBXaGVuIGZyZWVpbmcsIHJlc2V0IHBhZ2UtPm1hcHBpbmcgc28gZnJlZV9wYWdlc19jaGVjayB3b24ndCBjb21wbGFpbi4KICAqLwotI2RlZmluZSBfX3B0ZV9sb2NrcHRyKHBhZ2UpCSYoKHBhZ2UpLT51LnB0bCkKKyNkZWZpbmUgX19wdGVfbG9ja3B0cihwYWdlKQkmKChwYWdlKS0+cHRsKQogI2RlZmluZSBwdGVfbG9ja19pbml0KF9wYWdlKQlkbyB7CQkJCQlcCiAJc3Bpbl9sb2NrX2luaXQoX19wdGVfbG9ja3B0cihfcGFnZSkpOwkJCQlcCiB9IHdoaWxlICgwKQpAQCAtMTAyMSw2ICsxMDI2LDkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAoga2VybmVsX21hcF9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG51bXBhZ2VzLCBpbnQgZW5hYmxlKQogeworCWlmICghUGFnZUhpZ2hNZW0ocGFnZSkgJiYgIWVuYWJsZSkKKwkJbXV0ZXhfZGVidWdfY2hlY2tfbm9fbG9ja3NfZnJlZWQocGFnZV9hZGRyZXNzKHBhZ2UpLAorCQkJCQkJIG51bXBhZ2VzICogUEFHRV9TSVpFKTsKIH0KICNlbmRpZgogCkBAIC0xMDM2LDUgKzEwNDQsMTIgQEAKIC8qIC9wcm9jLzxwaWQ+L29vbV9hZGogc2V0IHRvIC0xNyBwcm90ZWN0cyBmcm9tIHRoZSBvb20ta2lsbGVyICovCiAjZGVmaW5lIE9PTV9ESVNBQkxFIC0xNwogCitpbnQgZHJvcF9jYWNoZXNfc3lzY3RsX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsIHN0cnVjdCBmaWxlICosCisJCQkJCXZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CitpbnQgc2hyaW5rX3NsYWIodW5zaWduZWQgbG9uZyBzY2FubmVkLCBnZnBfdCBnZnBfbWFzaywKKwkJCXVuc2lnbmVkIGxvbmcgbHJ1X3BhZ2VzKTsKK3ZvaWQgZHJvcF9wYWdlY2FjaGUodm9pZCk7Cit2b2lkIGRyb3Bfc2xhYih2b2lkKTsKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfTElOVVhfTU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbV9pbmxpbmUuaCBiL2luY2x1ZGUvbGludXgvbW1faW5saW5lLmgKaW5kZXggNDc3NjJjYS4uOGFjODU0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbV9pbmxpbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tX2lubGluZS5oCkBAIC0zOCwzICszOCw0IEBACiAJCXpvbmUtPm5yX2luYWN0aXZlLS07CiAJfQogfQorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9jYXJkLmggYi9pbmNsdWRlL2xpbnV4L21tYy9jYXJkLmgKaW5kZXggMThmYzc3Zi4uMzBkZDk3OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvY2FyZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL2NhcmQuaApAQCAtMzAsNyArMzAsMTIgQEAKIAl1bnNpZ25lZCBpbnQJCXRhY2NfbnM7CiAJdW5zaWduZWQgaW50CQltYXhfZHRyOwogCXVuc2lnbmVkIGludAkJcmVhZF9ibGtiaXRzOworCXVuc2lnbmVkIGludAkJd3JpdGVfYmxrYml0czsKIAl1bnNpZ25lZCBpbnQJCWNhcGFjaXR5OworCXVuc2lnbmVkIGludAkJcmVhZF9wYXJ0aWFsOjEsCisJCQkJcmVhZF9taXNhbGlnbjoxLAorCQkJCXdyaXRlX3BhcnRpYWw6MSwKKwkJCQl3cml0ZV9taXNhbGlnbjoxOwogfTsKIAogc3RydWN0IHNkX3NjciB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9tbWMuaCBiL2luY2x1ZGUvbGludXgvbW1jL21tYy5oCmluZGV4IGFlZjYwNDIuLmNjZDNlMTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL21tYy5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL21tYy5oCkBAIC0yNywxNCArMjcsMTUgQEAKICNkZWZpbmUgTU1DX1JTUF9NQVNLCSgzIDw8IDApCiAjZGVmaW5lIE1NQ19SU1BfQ1JDCSgxIDw8IDMpCQkvKiBleHBlY3QgdmFsaWQgY3JjICovCiAjZGVmaW5lIE1NQ19SU1BfQlVTWQkoMSA8PCA0KQkJLyogY2FyZCBtYXkgc2VuZCBidXN5ICovCisjZGVmaW5lIE1NQ19SU1BfT1BDT0RFCSgxIDw8IDUpCQkvKiByZXNwb25zZSBjb250YWlucyBvcGNvZGUgKi8KIAogLyoKICAqIFRoZXNlIGFyZSB0aGUgcmVzcG9uc2UgdHlwZXMsIGFuZCBjb3JyZXNwb25kIHRvIHZhbGlkIGJpdAogICogcGF0dGVybnMgb2YgdGhlIGFib3ZlIGZsYWdzLiAgT25lIGFkZGl0aW9uYWwgdmFsaWQgcGF0dGVybgogICogaXMgYWxsIHplcm9zLCB3aGljaCBtZWFucyB3ZSBkb24ndCBleHBlY3QgYSByZXNwb25zZS4KICAqLwotI2RlZmluZSBNTUNfUlNQX1IxCShNTUNfUlNQX1NIT1JUfE1NQ19SU1BfQ1JDKQotI2RlZmluZSBNTUNfUlNQX1IxQgkoTU1DX1JTUF9TSE9SVHxNTUNfUlNQX0NSQ3xNTUNfUlNQX0JVU1kpCisjZGVmaW5lIE1NQ19SU1BfUjEJKE1NQ19SU1BfU0hPUlR8TU1DX1JTUF9DUkN8TU1DX1JTUF9PUENPREUpCisjZGVmaW5lIE1NQ19SU1BfUjFCCShNTUNfUlNQX1NIT1JUfE1NQ19SU1BfQ1JDfE1NQ19SU1BfT1BDT0RFfE1NQ19SU1BfQlVTWSkKICNkZWZpbmUgTU1DX1JTUF9SMgkoTU1DX1JTUF9MT05HfE1NQ19SU1BfQ1JDKQogI2RlZmluZSBNTUNfUlNQX1IzCShNTUNfUlNQX1NIT1JUKQogI2RlZmluZSBNTUNfUlNQX1I2CShNTUNfUlNQX1NIT1JUfE1NQ19SU1BfQ1JDKQpAQCAtNjQsNiArNjUsNyBAQAogI2RlZmluZSBNTUNfREFUQV9XUklURQkoMSA8PCA4KQogI2RlZmluZSBNTUNfREFUQV9SRUFECSgxIDw8IDkpCiAjZGVmaW5lIE1NQ19EQVRBX1NUUkVBTQkoMSA8PCAxMCkKKyNkZWZpbmUgTU1DX0RBVEFfTVVMVEkJKDEgPDwgMTEpCiAKIAl1bnNpZ25lZCBpbnQJCWJ5dGVzX3hmZXJlZDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaCBiL2luY2x1ZGUvbGludXgvbW16b25lLmgKaW5kZXggYzM0ZjRhMi4uOTNhODQ5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCkBAIC0zOCw3ICszOCw3IEBACiAjaWYgZGVmaW5lZChDT05GSUdfU01QKQogc3RydWN0IHpvbmVfcGFkZGluZyB7CiAJY2hhciB4WzBdOwotfSBfX19fY2FjaGVsaW5lX21heGFsaWduZWRfaW5fc21wOworfSBfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wOwogI2RlZmluZSBaT05FX1BBRERJTkcobmFtZSkJc3RydWN0IHpvbmVfcGFkZGluZyBuYW1lOwogI2Vsc2UKICNkZWZpbmUgWk9ORV9QQURESU5HKG5hbWUpCkBAIC05OCw3ICs5OCw3IEBACiAKIC8qCiAgKiBPbiBtYWNoaW5lcyB3aGVyZSBpdCBpcyBuZWVkZWQgKGVnIFBDcykgd2UgZGl2aWRlIHBoeXNpY2FsIG1lbW9yeQotICogaW50byBtdWx0aXBsZSBwaHlzaWNhbCB6b25lcy4gT24gYSBQQyB3ZSBoYXZlIDQgem9uZXM6CisgKiBpbnRvIG11bHRpcGxlIHBoeXNpY2FsIHpvbmVzLiBPbiBhIDMyYml0IFBDIHdlIGhhdmUgNCB6b25lczoKICAqCiAgKiBaT05FX0RNQQkgIDwgMTYgTUIJSVNBIERNQSBjYXBhYmxlIG1lbW9yeQogICogWk9ORV9ETUEzMgkgICAgIDAgTUIgCUVtcHR5CkBAIC0xNDksMTUgKzE0OSwxNyBAQAogCXVuc2lnbmVkIGxvbmcJCXBhZ2VzX3NjYW5uZWQ7CSAgIC8qIHNpbmNlIGxhc3QgcmVjbGFpbSAqLwogCWludAkJCWFsbF91bnJlY2xhaW1hYmxlOyAvKiBBbGwgcGFnZXMgcGlubmVkICovCiAKLQkvKgotCSAqIERvZXMgdGhlIGFsbG9jYXRvciB0cnkgdG8gcmVjbGFpbSBwYWdlcyBmcm9tIHRoZSB6b25lIGFzIHNvb24KLQkgKiBhcyBpdCBmYWlscyBhIHdhdGVybWFya19vaygpIGluIF9fYWxsb2NfcGFnZXM/Ci0JICovCi0JaW50CQkJcmVjbGFpbV9wYWdlczsKIAkvKiBBIGNvdW50IG9mIGhvdyBtYW55IHJlY2xhaW1lcnMgYXJlIHNjYW5uaW5nIHRoaXMgem9uZSAqLwogCWF0b21pY190CQlyZWNsYWltX2luX3Byb2dyZXNzOwogCiAJLyoKKwkgKiB0aW1lc3RhbXAgKGluIGppZmZpZXMpIG9mIHRoZSBsYXN0IHpvbmUgcmVjbGFpbSB0aGF0IGRpZCBub3QKKwkgKiByZXN1bHQgaW4gZnJlZWluZyBvZiBwYWdlcy4gVGhpcyBpcyB1c2VkIHRvIGF2b2lkIHJlcGVhdGVkIHNjYW5zCisJICogaWYgYWxsIG1lbW9yeSBpbiB0aGUgem9uZSBpcyBpbiB1c2UuCisJICovCisJdW5zaWduZWQgbG9uZwkJbGFzdF91bnN1Y2Nlc3NmdWxfem9uZV9yZWNsYWltOworCisJLyoKIAkgKiBwcmV2X3ByaW9yaXR5IGhvbGRzIHRoZSBzY2FubmluZyBwcmlvcml0eSBmb3IgdGhpcyB6b25lLiAgSXQgaXMKIAkgKiBkZWZpbmVkIGFzIHRoZSBzY2FubmluZyBwcmlvcml0eSBhdCB3aGljaCB3ZSBhY2hpZXZlZCBvdXIgcmVjbGFpbQogCSAqIHRhcmdldCBhdCB0aGUgcHJldmlvdXMgdHJ5X3RvX2ZyZWVfcGFnZXMoKSBvciBiYWxhbmNlX3BnZGF0KCkKQEAgLTIzMyw3ICsyMzUsNyBAQAogCSAqIHJhcmVseSB1c2VkIGZpZWxkczoKIAkgKi8KIAljaGFyCQkJKm5hbWU7Ci19IF9fX19jYWNoZWxpbmVfbWF4YWxpZ25lZF9pbl9zbXA7Cit9IF9fX19jYWNoZWxpbmVfaW50ZXJub2RlYWxpZ25lZF9pbl9zbXA7CiAKIAogLyoKQEAgLTQzNyw2ICs0MzksOCBAQAogZXh0ZXJuIGludCBzeXNjdGxfbG93bWVtX3Jlc2VydmVfcmF0aW9bTUFYX05SX1pPTkVTLTFdOwogaW50IGxvd21lbV9yZXNlcnZlX3JhdGlvX3N5c2N0bF9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50LCBzdHJ1Y3QgZmlsZSAqLAogCQkJCQl2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOworaW50IHBlcmNwdV9wYWdlbGlzdF9mcmFjdGlvbl9zeXNjdGxfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwgc3RydWN0IGZpbGUgKiwKKwkJCQkJdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKIAogI2luY2x1ZGUgPGxpbnV4L3RvcG9sb2d5Lmg+CiAvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgTm9kZS4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW91bnQuaCBiL2luY2x1ZGUvbGludXgvbW91bnQuaAppbmRleCBkZDRlODNlLi5iNzQ3MmFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vdW50LmgKKysrIGIvaW5jbHVkZS9saW51eC9tb3VudC5oCkBAIC0yMCw5ICsyMCwxMiBAQAogI2RlZmluZSBNTlRfTk9TVUlECTB4MDEKICNkZWZpbmUgTU5UX05PREVWCTB4MDIKICNkZWZpbmUgTU5UX05PRVhFQwkweDA0Ci0jZGVmaW5lIE1OVF9TSEFSRUQJMHgxMAkvKiBpZiB0aGUgdmZzbW91bnQgaXMgYSBzaGFyZWQgbW91bnQgKi8KLSNkZWZpbmUgTU5UX1VOQklOREFCTEUJMHgyMAkvKiBpZiB0aGUgdmZzbW91bnQgaXMgYSB1bmJpbmRhYmxlIG1vdW50ICovCi0jZGVmaW5lIE1OVF9QTk9ERV9NQVNLCTB4MzAJLyogcHJvcG9nYXRpb24gZmxhZyBtYXNrICovCisjZGVmaW5lIE1OVF9OT0FUSU1FCTB4MDgKKyNkZWZpbmUgTU5UX05PRElSQVRJTUUJMHgxMAorCisjZGVmaW5lIE1OVF9TSEFSRUQJMHgxMDAwCS8qIGlmIHRoZSB2ZnNtb3VudCBpcyBhIHNoYXJlZCBtb3VudCAqLworI2RlZmluZSBNTlRfVU5CSU5EQUJMRQkweDIwMDAJLyogaWYgdGhlIHZmc21vdW50IGlzIGEgdW5iaW5kYWJsZSBtb3VudCAqLworI2RlZmluZSBNTlRfUE5PREVfTUFTSwkweDMwMDAJLyogcHJvcG9nYXRpb24gZmxhZyBtYXNrICovCiAKIHN0cnVjdCB2ZnNtb3VudCB7CiAJc3RydWN0IGxpc3RfaGVhZCBtbnRfaGFzaDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXNkb3NfZnMuaCBiL2luY2x1ZGUvbGludXgvbXNkb3NfZnMuaAppbmRleCA5NDFkYTVjLi5lOTMzZTJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21zZG9zX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9tc2Rvc19mcy5oCkBAIC0zMjksNyArMzI5LDggQEAKIGV4dGVybiB2b2lkIGZhdF9jYWNoZV9pbnZhbF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGV4dGVybiBpbnQgZmF0X2dldF9jbHVzdGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBjbHVzdGVyLAogCQkJICAgaW50ICpmY2x1cywgaW50ICpkY2x1cyk7Ci1leHRlcm4gaW50IGZhdF9ibWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IHNlY3Rvciwgc2VjdG9yX3QgKnBoeXMpOworZXh0ZXJuIGludCBmYXRfYm1hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBzZWN0b3IsIHNlY3Rvcl90ICpwaHlzLAorCQkgICAgdW5zaWduZWQgbG9uZyAqbWFwcGVkX2Jsb2Nrcyk7CiAKIC8qIGZhdC9kaXIuYyAqLwogZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmF0X2Rpcl9vcGVyYXRpb25zOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdXRleC1kZWJ1Zy5oIGIvaW5jbHVkZS9saW51eC9tdXRleC1kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNTc2OWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L211dGV4LWRlYnVnLmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBfX0xJTlVYX01VVEVYX0RFQlVHX0gKKyNkZWZpbmUgX19MSU5VWF9NVVRFWF9ERUJVR19ICisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisKKy8qCisgKiBNdXRleGVzIC0gZGVidWdnaW5nIGhlbHBlcnM6CisgKi8KKworI2RlZmluZSBfX0RFQlVHX01VVEVYX0lOSVRJQUxJWkVSKGxvY2tuYW1lKSBcCisJLCAuaGVsZF9saXN0ID0gTElTVF9IRUFEX0lOSVQobG9ja25hbWUuaGVsZF9saXN0KSwgXAorCSAgLm5hbWUgPSAjbG9ja25hbWUgLCAubWFnaWMgPSAmbG9ja25hbWUKKworI2RlZmluZSBtdXRleF9pbml0KHNlbSkJCV9fbXV0ZXhfaW5pdChzZW0sIF9fRlVOQ1RJT05fXykKKworZXh0ZXJuIHZvaWQgRkFTVENBTEwobXV0ZXhfZGVzdHJveShzdHJ1Y3QgbXV0ZXggKmxvY2spKTsKKworZXh0ZXJuIHZvaWQgbXV0ZXhfZGVidWdfc2hvd19hbGxfbG9ja3Modm9pZCk7CitleHRlcm4gdm9pZCBtdXRleF9kZWJ1Z19zaG93X2hlbGRfbG9ja3Moc3RydWN0IHRhc2tfc3RydWN0ICpmaWx0ZXIpOworZXh0ZXJuIHZvaWQgbXV0ZXhfZGVidWdfY2hlY2tfbm9fbG9ja3NfaGVsZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOworZXh0ZXJuIHZvaWQgbXV0ZXhfZGVidWdfY2hlY2tfbm9fbG9ja3NfZnJlZWQoY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBsZW4pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXV0ZXguaCBiL2luY2x1ZGUvbGludXgvbXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWFjNTA3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tdXRleC5oCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogTXV0ZXhlczogYmxvY2tpbmcgbXV0dWFsIGV4Y2x1c2lvbiBsb2NrcworICoKKyAqIHN0YXJ0ZWQgYnkgSW5nbyBNb2xuYXI6CisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNiBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1haW4gZGF0YSBzdHJ1Y3R1cmUgYW5kIEFQSSBkZWZpbml0aW9ucy4KKyAqLworI2lmbmRlZiBfX0xJTlVYX01VVEVYX0gKKyNkZWZpbmUgX19MSU5VWF9NVVRFWF9ICisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2tfdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisKKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisKKy8qCisgKiBTaW1wbGUsIHN0cmFpZ2h0Zm9yd2FyZCBtdXRleGVzIHdpdGggc3RyaWN0IHNlbWFudGljczoKKyAqCisgKiAtIG9ubHkgb25lIHRhc2sgY2FuIGhvbGQgdGhlIG11dGV4IGF0IGEgdGltZQorICogLSBvbmx5IHRoZSBvd25lciBjYW4gdW5sb2NrIHRoZSBtdXRleAorICogLSBtdWx0aXBsZSB1bmxvY2tzIGFyZSBub3QgcGVybWl0dGVkCisgKiAtIHJlY3Vyc2l2ZSBsb2NraW5nIGlzIG5vdCBwZXJtaXR0ZWQKKyAqIC0gYSBtdXRleCBvYmplY3QgbXVzdCBiZSBpbml0aWFsaXplZCB2aWEgdGhlIEFQSQorICogLSBhIG11dGV4IG9iamVjdCBtdXN0IG5vdCBiZSBpbml0aWFsaXplZCB2aWEgbWVtc2V0IG9yIGNvcHlpbmcKKyAqIC0gdGFzayBtYXkgbm90IGV4aXQgd2l0aCBtdXRleCBoZWxkCisgKiAtIG1lbW9yeSBhcmVhcyB3aGVyZSBoZWxkIGxvY2tzIHJlc2lkZSBtdXN0IG5vdCBiZSBmcmVlZAorICogLSBoZWxkIG11dGV4ZXMgbXVzdCBub3QgYmUgcmVpbml0aWFsaXplZAorICogLSBtdXRleGVzIG1heSBub3QgYmUgdXNlZCBpbiBpcnEgY29udGV4dHMKKyAqCisgKiBUaGVzZSBzZW1hbnRpY3MgYXJlIGZ1bGx5IGVuZm9yY2VkIHdoZW4gREVCVUdfTVVURVhFUyBpcworICogZW5hYmxlZC4gRnVydGhlcm1vcmUsIGJlc2lkZXMgZW5mb3JjaW5nIHRoZSBhYm92ZSBydWxlcywgdGhlIG11dGV4CisgKiBkZWJ1Z2dpbmcgY29kZSBhbHNvIGltcGxlbWVudHMgYSBudW1iZXIgb2YgYWRkaXRpb25hbCBmZWF0dXJlcworICogdGhhdCBtYWtlIGxvY2sgZGVidWdnaW5nIGVhc2llciBhbmQgZmFzdGVyOgorICoKKyAqIC0gdXNlcyBzeW1ib2xpYyBuYW1lcyBvZiBtdXRleGVzLCB3aGVuZXZlciB0aGV5IGFyZSBwcmludGVkIGluIGRlYnVnIG91dHB1dAorICogLSBwb2ludC1vZi1hY3F1aXJlIHRyYWNraW5nLCBzeW1ib2xpYyBsb29rdXAgb2YgZnVuY3Rpb24gbmFtZXMKKyAqIC0gbGlzdCBvZiBhbGwgbG9ja3MgaGVsZCBpbiB0aGUgc3lzdGVtLCBwcmludG91dCBvZiB0aGVtCisgKiAtIG93bmVyIHRyYWNraW5nCisgKiAtIGRldGVjdHMgc2VsZi1yZWN1cnNpbmcgbG9ja3MgYW5kIHByaW50cyBvdXQgYWxsIHJlbGV2YW50IGluZm8KKyAqIC0gZGV0ZWN0cyBtdWx0aS10YXNrIGNpcmN1bGFyIGRlYWRsb2NrcyBhbmQgcHJpbnRzIG91dCBhbGwgYWZmZWN0ZWQKKyAqICAgbG9ja3MgYW5kIHRhc2tzIChhbmQgb25seSB0aG9zZSB0YXNrcykKKyAqLworc3RydWN0IG11dGV4IHsKKwkvKiAxOiB1bmxvY2tlZCwgMDogbG9ja2VkLCBuZWdhdGl2ZTogbG9ja2VkLCBwb3NzaWJsZSB3YWl0ZXJzICovCisJYXRvbWljX3QJCWNvdW50OworCXNwaW5sb2NrX3QJCXdhaXRfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXdhaXRfbGlzdDsKKyNpZmRlZiBDT05GSUdfREVCVUdfTVVURVhFUworCXN0cnVjdCB0aHJlYWRfaW5mbwkqb3duZXI7CisJc3RydWN0IGxpc3RfaGVhZAloZWxkX2xpc3Q7CisJdW5zaWduZWQgbG9uZwkJYWNxdWlyZV9pcDsKKwljb25zdCBjaGFyIAkJKm5hbWU7CisJdm9pZAkJCSptYWdpYzsKKyNlbmRpZgorfTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIGNvbnRyb2wgc3RydWN0dXJlIGZvciB0YXNrcyBibG9ja2VkIG9uIG11dGV4LAorICogd2hpY2ggcmVzaWRlcyBvbiB0aGUgYmxvY2tlZCB0YXNrJ3Mga2VybmVsIHN0YWNrOgorICovCitzdHJ1Y3QgbXV0ZXhfd2FpdGVyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOworI2lmZGVmIENPTkZJR19ERUJVR19NVVRFWEVTCisJc3RydWN0IG11dGV4CQkqbG9jazsKKwl2b2lkCQkJKm1hZ2ljOworI2VuZGlmCit9OworCisjaWZkZWYgQ09ORklHX0RFQlVHX01VVEVYRVMKKyMgaW5jbHVkZSA8bGludXgvbXV0ZXgtZGVidWcuaD4KKyNlbHNlCisjIGRlZmluZSBfX0RFQlVHX01VVEVYX0lOSVRJQUxJWkVSKGxvY2tuYW1lKQorIyBkZWZpbmUgbXV0ZXhfaW5pdChtdXRleCkJCQlfX211dGV4X2luaXQobXV0ZXgsIE5VTEwpCisjIGRlZmluZSBtdXRleF9kZXN0cm95KG11dGV4KQkJCQlkbyB7IH0gd2hpbGUgKDApCisjIGRlZmluZSBtdXRleF9kZWJ1Z19zaG93X2FsbF9sb2NrcygpCQkJZG8geyB9IHdoaWxlICgwKQorIyBkZWZpbmUgbXV0ZXhfZGVidWdfc2hvd19oZWxkX2xvY2tzKHApCQkJZG8geyB9IHdoaWxlICgwKQorIyBkZWZpbmUgbXV0ZXhfZGVidWdfY2hlY2tfbm9fbG9ja3NfaGVsZCh0YXNrKQkJZG8geyB9IHdoaWxlICgwKQorIyBkZWZpbmUgbXV0ZXhfZGVidWdfY2hlY2tfbm9fbG9ja3NfZnJlZWQoZnJvbSwgbGVuKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBfX01VVEVYX0lOSVRJQUxJWkVSKGxvY2tuYW1lKSBcCisJCXsgLmNvdW50ID0gQVRPTUlDX0lOSVQoMSkgXAorCQksIC53YWl0X2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQgXAorCQksIC53YWl0X2xpc3QgPSBMSVNUX0hFQURfSU5JVChsb2NrbmFtZS53YWl0X2xpc3QpIFwKKwkJX19ERUJVR19NVVRFWF9JTklUSUFMSVpFUihsb2NrbmFtZSkgfQorCisjZGVmaW5lIERFRklORV9NVVRFWChtdXRleG5hbWUpIFwKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXhuYW1lID0gX19NVVRFWF9JTklUSUFMSVpFUihtdXRleG5hbWUpCisKK2V4dGVybiB2b2lkIGZhc3RjYWxsIF9fbXV0ZXhfaW5pdChzdHJ1Y3QgbXV0ZXggKmxvY2ssIGNvbnN0IGNoYXIgKm5hbWUpOworCisvKioqCisgKiBtdXRleF9pc19sb2NrZWQgLSBpcyB0aGUgbXV0ZXggbG9ja2VkCisgKiBAbG9jazogdGhlIG11dGV4IHRvIGJlIHF1ZXJpZWQKKyAqCisgKiBSZXR1cm5zIDEgaWYgdGhlIG11dGV4IGlzIGxvY2tlZCwgMCBpZiB1bmxvY2tlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZmFzdGNhbGwgbXV0ZXhfaXNfbG9ja2VkKHN0cnVjdCBtdXRleCAqbG9jaykKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQoJmxvY2stPmNvdW50KSAhPSAxOworfQorCisvKgorICogU2VlIGtlcm5lbC9tdXRleC5jIGZvciBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIG9mIHRoZXNlIEFQSXMuCisgKiBBbHNvIHNlZSBEb2N1bWVudGF0aW9uL211dGV4LWRlc2lnbi50eHQuCisgKi8KK2V4dGVybiB2b2lkIGZhc3RjYWxsIG11dGV4X2xvY2soc3RydWN0IG11dGV4ICpsb2NrKTsKK2V4dGVybiBpbnQgZmFzdGNhbGwgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKHN0cnVjdCBtdXRleCAqbG9jayk7CisvKgorICogTk9URTogbXV0ZXhfdHJ5bG9jaygpIGZvbGxvd3MgdGhlIHNwaW5fdHJ5bG9jaygpIGNvbnZlbnRpb24sCisgKiAgICAgICBub3QgdGhlIGRvd25fdHJ5bG9jaygpIGNvbnZlbnRpb24hCisgKi8KK2V4dGVybiBpbnQgZmFzdGNhbGwgbXV0ZXhfdHJ5bG9jayhzdHJ1Y3QgbXV0ZXggKmxvY2spOworZXh0ZXJuIHZvaWQgZmFzdGNhbGwgbXV0ZXhfdW5sb2NrKHN0cnVjdCBtdXRleCAqbG9jayk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uYW1laS5oIGIvaW5jbHVkZS9saW51eC9uYW1laS5oCmluZGV4IDQ1NTY2MGUuLmU2Njk4MDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmFtZWkuaAorKysgYi9pbmNsdWRlL2xpbnV4L25hbWVpLmgKQEAgLTU2LDEwICs1NiwxMSBAQAogI2RlZmluZSBMT09LVVBfQUNDRVNTCQkoMHgwNDAwKQogCiBleHRlcm4gaW50IEZBU1RDQUxMKF9fdXNlcl93YWxrKGNvbnN0IGNoYXIgX191c2VyICosIHVuc2lnbmVkLCBzdHJ1Y3QgbmFtZWlkYXRhICopKTsKK2V4dGVybiBpbnQgRkFTVENBTEwoX191c2VyX3dhbGtfZmQoaW50IGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgdW5zaWduZWQsIHN0cnVjdCBuYW1laWRhdGEgKikpOwogI2RlZmluZSB1c2VyX3BhdGhfd2FsayhuYW1lLG5kKSBcCi0JX191c2VyX3dhbGsobmFtZSwgTE9PS1VQX0ZPTExPVywgbmQpCisJX191c2VyX3dhbGtfZmQoQVRfRkRDV0QsIG5hbWUsIExPT0tVUF9GT0xMT1csIG5kKQogI2RlZmluZSB1c2VyX3BhdGhfd2Fsa19saW5rKG5hbWUsbmQpIFwKLQlfX3VzZXJfd2FsayhuYW1lLCAwLCBuZCkKKwlfX3VzZXJfd2Fsa19mZChBVF9GRENXRCwgbmFtZSwgMCwgbmQpCiBleHRlcm4gaW50IEZBU1RDQUxMKHBhdGhfbG9va3VwKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQsIHN0cnVjdCBuYW1laWRhdGEgKikpOwogZXh0ZXJuIGludCBGQVNUQ0FMTChwYXRoX3dhbGsoY29uc3QgY2hhciAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopKTsKIGV4dGVybiBpbnQgRkFTVENBTEwobGlua19wYXRoX3dhbGsoY29uc3QgY2hhciAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopKTsKQEAgLTY3LDE0ICs2OCwxNCBAQAogZXh0ZXJuIHZvaWQgcGF0aF9yZWxlYXNlX29uX3Vtb3VudChzdHJ1Y3QgbmFtZWlkYXRhICopOwogCiBleHRlcm4gaW50IF9fdXNlcl9wYXRoX2xvb2t1cF9vcGVuKGNvbnN0IGNoYXIgX191c2VyICosIHVuc2lnbmVkIGxvb2t1cF9mbGFncywgc3RydWN0IG5hbWVpZGF0YSAqbmQsIGludCBvcGVuX2ZsYWdzKTsKLWV4dGVybiBpbnQgcGF0aF9sb29rdXBfb3Blbihjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvb2t1cF9mbGFncywgc3RydWN0IG5hbWVpZGF0YSAqLCBpbnQgb3Blbl9mbGFncyk7CitleHRlcm4gaW50IHBhdGhfbG9va3VwX29wZW4oaW50IGRmZCwgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9va3VwX2ZsYWdzLCBzdHJ1Y3QgbmFtZWlkYXRhICosIGludCBvcGVuX2ZsYWdzKTsKIGV4dGVybiBzdHJ1Y3QgZmlsZSAqbG9va3VwX2luc3RhbnRpYXRlX2ZpbHAoc3RydWN0IG5hbWVpZGF0YSAqbmQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJaW50ICgqb3Blbikoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopKTsKIGV4dGVybiBzdHJ1Y3QgZmlsZSAqbmFtZWlkYXRhX3RvX2ZpbHAoc3RydWN0IG5hbWVpZGF0YSAqbmQsIGludCBmbGFncyk7CiBleHRlcm4gdm9pZCByZWxlYXNlX29wZW5faW50ZW50KHN0cnVjdCBuYW1laWRhdGEgKik7CiAKIGV4dGVybiBzdHJ1Y3QgZGVudHJ5ICogbG9va3VwX29uZV9sZW4oY29uc3QgY2hhciAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7Ci1leHRlcm4gc3RydWN0IGRlbnRyeSAqIGxvb2t1cF9oYXNoKHN0cnVjdCBuYW1laWRhdGEgKik7CitleHRlcm4gX19kZXByZWNhdGVkX2Zvcl9tb2R1bGVzIHN0cnVjdCBkZW50cnkgKiBsb29rdXBfaGFzaChzdHJ1Y3QgbmFtZWlkYXRhICopOwogCiBleHRlcm4gaW50IGZvbGxvd19kb3duKHN0cnVjdCB2ZnNtb3VudCAqKiwgc3RydWN0IGRlbnRyeSAqKik7CiBleHRlcm4gaW50IGZvbGxvd191cChzdHJ1Y3QgdmZzbW91bnQgKiosIHN0cnVjdCBkZW50cnkgKiopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uY3AuaCBiL2luY2x1ZGUvbGludXgvbmNwLmgKaW5kZXggOTlmNzc4Ny4uOTlmMGFkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uY3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L25jcC5oCkBAIC0yMCwyOSArMjAsMjkgQEAKICNkZWZpbmUgTkNQX0RFQUxMT0NfU0xPVF9SRVFVRVNUICgweDU1NTUpCiAKIHN0cnVjdCBuY3BfcmVxdWVzdF9oZWFkZXIgewotCV9fdTE2IHR5cGUgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX191OCBzZXF1ZW5jZSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3U4IGNvbm5fbG93IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fdTggdGFzayBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3U4IGNvbm5faGlnaCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3U4IGZ1bmN0aW9uIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fdTggZGF0YVswXSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLX07CisJX191MTYgdHlwZTsKKwlfX3U4IHNlcXVlbmNlOworCV9fdTggY29ubl9sb3c7CisJX191OCB0YXNrOworCV9fdTggY29ubl9oaWdoOworCV9fdTggZnVuY3Rpb247CisJX191OCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogI2RlZmluZSBOQ1BfUkVQTFkgICAgICAgICAgICAgICAgKDB4MzMzMykKICNkZWZpbmUgTkNQX1dBVENIRE9HCQkgKDB4M0UzRSkKICNkZWZpbmUgTkNQX1BPU0lUSVZFX0FDSyAgICAgICAgICgweDk5OTkpCiAKIHN0cnVjdCBuY3BfcmVwbHlfaGVhZGVyIHsKLQlfX3UxNiB0eXBlIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fdTggc2VxdWVuY2UgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX191OCBjb25uX2xvdyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3U4IHRhc2sgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX191OCBjb25uX2hpZ2ggX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX191OCBjb21wbGV0aW9uX2NvZGUgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX191OCBjb25uZWN0aW9uX3N0YXRlIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fdTggZGF0YVswXSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLX07CisJX191MTYgdHlwZTsKKwlfX3U4IHNlcXVlbmNlOworCV9fdTggY29ubl9sb3c7CisJX191OCB0YXNrOworCV9fdTggY29ubl9oaWdoOworCV9fdTggY29tcGxldGlvbl9jb2RlOworCV9fdTggY29ubmVjdGlvbl9zdGF0ZTsKKwlfX3U4IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAjZGVmaW5lIE5DUF9WT0xOQU1FX0xFTiAoMTYpCiAjZGVmaW5lIE5DUF9OVU1CRVJfT0ZfVk9MVU1FUyAoMjU2KQpAQCAtMTI4LDM3ICsxMjgsMzcgQEAKIH07CiAKIHN0cnVjdCBud19pbmZvX3N0cnVjdCB7Ci0JX191MzIgc3BhY2VBbGxvYyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX2xlMzIgYXR0cmlidXRlcyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3UxNiBmbGFncyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX2xlMzIgZGF0YVN0cmVhbVNpemUgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX19sZTMyIHRvdGFsU3RyZWFtU2l6ZSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3UxNiBudW1iZXJPZlN0cmVhbXMgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX19sZTE2IGNyZWF0aW9uVGltZSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX2xlMTYgY3JlYXRpb25EYXRlIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fdTMyIGNyZWF0b3JJRCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX2xlMTYgbW9kaWZ5VGltZSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX2xlMTYgbW9kaWZ5RGF0ZSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3UzMiBtb2RpZmllcklEIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fbGUxNiBsYXN0QWNjZXNzRGF0ZSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3UxNiBhcmNoaXZlVGltZSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3UxNiBhcmNoaXZlRGF0ZSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3UzMiBhcmNoaXZlcklEIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fdTE2IGluaGVyaXRlZFJpZ2h0c01hc2sgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX19sZTMyIGRpckVudE51bSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX2xlMzIgRG9zRGlyTnVtIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fdTMyIHZvbE51bWJlciBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3UzMiBFQURhdGFTaXplIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fdTMyIEVBS2V5Q291bnQgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX191MzIgRUFLZXlTaXplIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fdTMyIE5TQ3JlYXRvciBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3U4IG5hbWVMZW4gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX191OCBlbnRyeU5hbWVbMjU2XSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwlfX3UzMiBzcGFjZUFsbG9jOworCV9fbGUzMiBhdHRyaWJ1dGVzOworCV9fdTE2IGZsYWdzOworCV9fbGUzMiBkYXRhU3RyZWFtU2l6ZTsKKwlfX2xlMzIgdG90YWxTdHJlYW1TaXplOworCV9fdTE2IG51bWJlck9mU3RyZWFtczsKKwlfX2xlMTYgY3JlYXRpb25UaW1lOworCV9fbGUxNiBjcmVhdGlvbkRhdGU7CisJX191MzIgY3JlYXRvcklEOworCV9fbGUxNiBtb2RpZnlUaW1lOworCV9fbGUxNiBtb2RpZnlEYXRlOworCV9fdTMyIG1vZGlmaWVySUQ7CisJX19sZTE2IGxhc3RBY2Nlc3NEYXRlOworCV9fdTE2IGFyY2hpdmVUaW1lOworCV9fdTE2IGFyY2hpdmVEYXRlOworCV9fdTMyIGFyY2hpdmVySUQ7CisJX191MTYgaW5oZXJpdGVkUmlnaHRzTWFzazsKKwlfX2xlMzIgZGlyRW50TnVtOworCV9fbGUzMiBEb3NEaXJOdW07CisJX191MzIgdm9sTnVtYmVyOworCV9fdTMyIEVBRGF0YVNpemU7CisJX191MzIgRUFLZXlDb3VudDsKKwlfX3UzMiBFQUtleVNpemU7CisJX191MzIgTlNDcmVhdG9yOworCV9fdTggbmFtZUxlbjsKKwlfX3U4IGVudHJ5TmFtZVsyNTZdOwogCS8qIGxpYm5jcCBtYXkgZGVwZW5kIG9uIHRoZXJlIGJlaW5nIG5vdGhpbmcgYWZ0ZXIgZW50cnlOYW1lICovCiAjaWZkZWYgX19LRVJORUxfXwogCXN0cnVjdCBud19uZnNfaW5mbyBuZnM7CiAjZW5kaWYKLX07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBtb2RpZnkgbWFzayAtIHVzZSB3aXRoIE1PRElGWV9ET1NfSU5GTyBzdHJ1Y3R1cmUgKi8KICNkZWZpbmUgRE1fQVRUUklCVVRFUwkJICAoY3B1X3RvX2xlMzIoMHgwMikpCkBAIC0xNzYsMjYgKzE3NiwyNiBAQAogI2RlZmluZSBETV9NQVhJTVVNX1NQQUNFCSAgKGNwdV90b19sZTMyKDB4MjAwMCkpCiAKIHN0cnVjdCBud19tb2RpZnlfZG9zX2luZm8gewotCV9fbGUzMiBhdHRyaWJ1dGVzIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fbGUxNiBjcmVhdGlvbkRhdGUgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX19sZTE2IGNyZWF0aW9uVGltZSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3UzMiBjcmVhdG9ySUQgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX19sZTE2IG1vZGlmeURhdGUgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX19sZTE2IG1vZGlmeVRpbWUgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX191MzIgbW9kaWZpZXJJRCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3UxNiBhcmNoaXZlRGF0ZSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3UxNiBhcmNoaXZlVGltZSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3UzMiBhcmNoaXZlcklEIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fbGUxNiBsYXN0QWNjZXNzRGF0ZSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3UxNiBpbmhlcml0YW5jZUdyYW50TWFzayBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3UxNiBpbmhlcml0YW5jZVJldm9rZU1hc2sgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX191MzIgbWF4aW11bVNwYWNlIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotfTsKKwlfX2xlMzIgYXR0cmlidXRlczsKKwlfX2xlMTYgY3JlYXRpb25EYXRlOworCV9fbGUxNiBjcmVhdGlvblRpbWU7CisJX191MzIgY3JlYXRvcklEOworCV9fbGUxNiBtb2RpZnlEYXRlOworCV9fbGUxNiBtb2RpZnlUaW1lOworCV9fdTMyIG1vZGlmaWVySUQ7CisJX191MTYgYXJjaGl2ZURhdGU7CisJX191MTYgYXJjaGl2ZVRpbWU7CisJX191MzIgYXJjaGl2ZXJJRDsKKwlfX2xlMTYgbGFzdEFjY2Vzc0RhdGU7CisJX191MTYgaW5oZXJpdGFuY2VHcmFudE1hc2s7CisJX191MTYgaW5oZXJpdGFuY2VSZXZva2VNYXNrOworCV9fdTMyIG1heGltdW1TcGFjZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBud19zZWFyY2hfc2VxdWVuY2UgewotCV9fdTggdm9sTnVtYmVyIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCV9fdTMyIGRpckJhc2UgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JX191MzIgc2VxdWVuY2UgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci19OworCV9fdTggdm9sTnVtYmVyOworCV9fdTMyIGRpckJhc2U7CisJX191MzIgc2VxdWVuY2U7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAjZW5kaWYJCQkJLyogX0xJTlVYX05DUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25jcF9mcy5oIGIvaW5jbHVkZS9saW51eC9uY3BfZnMuaAppbmRleCA3Mjk3ZTQzLi5lMDEzNDI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25jcF9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmNwX2ZzLmgKQEAgLTIwMSwzNCArMjAxLDYgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKGlub2RlLCBzdHJ1Y3QgbmNwX2lub2RlX2luZm8sIHZmc19pbm9kZSk7CiB9CiAKLSNpZmRlZiBERUJVR19OQ1BfTUFMTE9DCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLWV4dGVybiBpbnQgbmNwX21hbGxvY2VkOwotZXh0ZXJuIGludCBuY3BfY3VycmVudF9tYWxsb2NlZDsKLQotc3RhdGljIGlubGluZSB2b2lkICoKLSBuY3Bfa21hbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IHByaW9yaXR5KQotewotCW5jcF9tYWxsb2NlZCArPSAxOwotCW5jcF9jdXJyZW50X21hbGxvY2VkICs9IDE7Ci0JcmV0dXJuIGttYWxsb2Moc2l6ZSwgcHJpb3JpdHkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbmNwX2tmcmVlX3Modm9pZCAqb2JqLCBpbnQgc2l6ZSkKLXsKLQluY3BfY3VycmVudF9tYWxsb2NlZCAtPSAxOwotCWtmcmVlKG9iaik7Ci19Ci0KLSNlbHNlCQkJCS8qIERFQlVHX05DUF9NQUxMT0MgKi8KLQotI2RlZmluZSBuY3Bfa21hbGxvYyhzLHApIGttYWxsb2MocyxwKQotI2RlZmluZSBuY3Bfa2ZyZWVfcyhvLHMpIGtmcmVlKG8pCi0KLSNlbmRpZgkJCQkvKiBERUJVR19OQ1BfTUFMTE9DICovCi0KIC8qIGxpbnV4L2ZzL25jcGZzL2lub2RlLmMgKi8KIGludCBuY3Bfbm90aWZ5X2NoYW5nZShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBpYXR0ciAqKTsKIHN0cnVjdCBpbm9kZSAqbmNwX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBuY3BfZW50cnlfaW5mbyAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci5oCmluZGV4IGJlMzY1ZTcuLjRjZjYwODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIuaApAQCAtMTY4LDYgKzE2OCwzNyBAQAogCQkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogCQkgICBzdHJ1Y3QgbmZfbG9naW5mbyAqbGksCiAJCSAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKworaW50IG5mX2hvb2tfc2xvdyhpbnQgcGYsIHVuc2lnbmVkIGludCBob29rLCBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCSBzdHJ1Y3QgbmV0X2RldmljZSAqaW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpvdXRkZXYsCisJCSBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSwgaW50IHRocmVzaCk7CisKKy8qKgorICoJbmZfaG9va190aHJlc2ggLSBjYWxsIGEgbmV0ZmlsdGVyIGhvb2sKKyAqCQorICoJUmV0dXJucyAxIGlmIHRoZSBob29rIGhhcyBhbGxvd2VkIHRoZSBwYWNrZXQgdG8gcGFzcy4gIFRoZSBmdW5jdGlvbgorICoJb2tmbiBtdXN0IGJlIGludm9rZWQgYnkgdGhlIGNhbGxlciBpbiB0aGlzIGNhc2UuICBBbnkgb3RoZXIgcmV0dXJuCisgKgl2YWx1ZSBpbmRpY2F0ZXMgdGhlIHBhY2tldCBoYXMgYmVlbiBjb25zdW1lZCBieSB0aGUgaG9vay4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbmZfaG9va190aHJlc2goaW50IHBmLCB1bnNpZ25lZCBpbnQgaG9vaywKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqaW5kZXYsCisJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpvdXRkZXYsCisJCQkJIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopLCBpbnQgdGhyZXNoKQoreworI2lmbmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCisJaWYgKGxpc3RfZW1wdHkoJm5mX2hvb2tzW3BmXVtob29rXSkpCisJCXJldHVybiAxOworI2VuZGlmCisJcmV0dXJuIG5mX2hvb2tfc2xvdyhwZiwgaG9vaywgcHNrYiwgaW5kZXYsIG91dGRldiwgb2tmbiwgdGhyZXNoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbmZfaG9vayhpbnQgcGYsIHVuc2lnbmVkIGludCBob29rLCBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICppbmRldiwgc3RydWN0IG5ldF9kZXZpY2UgKm91dGRldiwKKwkJCSAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCit7CisJcmV0dXJuIG5mX2hvb2tfdGhyZXNoKHBmLCBob29rLCBwc2tiLCBpbmRldiwgb3V0ZGV2LCBva2ZuLCBJTlRfTUlOKTsKK30KICAgICAgICAgICAgICAgICAgICAKIC8qIEFjdGl2YXRlIGhvb2s7IGVpdGhlciBva2ZuIG9yIGtmcmVlX3NrYiBjYWxsZWQsIHVubGVzcyBhIGhvb2sKICAgIHJldHVybnMgTkZfU1RPTEVOIChpbiB3aGljaCBjYXNlLCBpdCdzIHVwIHRvIHRoZSBob29rIHRvIGRlYWwgd2l0aApAQCAtMTg4LDM1ICsyMTksMTcgQEAKIAogLyogVGhpcyBpcyBncm9zcywgYnV0IGlubGluZSBkb2Vzbid0IGN1dCBpdCBmb3IgYXZvaWRpbmcgdGhlIGZ1bmN0aW9uCiAgICBjYWxsIGluIGZhc3QgcGF0aDogZ2NjIGRvZXNuJ3QgaW5saW5lIChuZWVkcyB2YWx1ZSB0cmFja2luZz8pLiAtLVJSICovCi0jaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRwotI2RlZmluZSBORl9IT09LKHBmLCBob29rLCBza2IsIGluZGV2LCBvdXRkZXYsIG9rZm4pCQkJICAgICAgIFwKLSh7aW50IF9fcmV0OwkJCQkJCQkJICAgICAgIFwKLWlmICgoX19yZXQ9bmZfaG9va19zbG93KHBmLCBob29rLCAmKHNrYiksIGluZGV2LCBvdXRkZXYsIG9rZm4sIElOVF9NSU4pKSA9PSAxKSBcCi0JX19yZXQgPSAob2tmbikoc2tiKTsJCQkJCQkgICAgICAgXAotX19yZXQ7fSkKLSNkZWZpbmUgTkZfSE9PS19USFJFU0gocGYsIGhvb2ssIHNrYiwgaW5kZXYsIG91dGRldiwgb2tmbiwgdGhyZXNoKQkgICAgICAgXAotKHtpbnQgX19yZXQ7CQkJCQkJCQkgICAgICAgXAotaWYgKChfX3JldD1uZl9ob29rX3Nsb3cocGYsIGhvb2ssICYoc2tiKSwgaW5kZXYsIG91dGRldiwgb2tmbiwgdGhyZXNoKSkgPT0gMSkgIFwKLQlfX3JldCA9IChva2ZuKShza2IpOwkJCQkJCSAgICAgICBcCi1fX3JldDt9KQotI2Vsc2UKLSNkZWZpbmUgTkZfSE9PSyhwZiwgaG9vaywgc2tiLCBpbmRldiwgb3V0ZGV2LCBva2ZuKQkJCSAgICAgICBcCi0oe2ludCBfX3JldDsJCQkJCQkJCSAgICAgICBcCi1pZiAobGlzdF9lbXB0eSgmbmZfaG9va3NbcGZdW2hvb2tdKSB8fAkJCQkJICAgICAgIFwKLSAgICAoX19yZXQ9bmZfaG9va19zbG93KHBmLCBob29rLCAmKHNrYiksIGluZGV2LCBvdXRkZXYsIG9rZm4sIElOVF9NSU4pKSA9PSAxKSBcCi0JX19yZXQgPSAob2tmbikoc2tiKTsJCQkJCQkgICAgICAgXAotX19yZXQ7fSkKLSNkZWZpbmUgTkZfSE9PS19USFJFU0gocGYsIGhvb2ssIHNrYiwgaW5kZXYsIG91dGRldiwgb2tmbiwgdGhyZXNoKQkgICAgICAgXAotKHtpbnQgX19yZXQ7CQkJCQkJCQkgICAgICAgXAotaWYgKGxpc3RfZW1wdHkoJm5mX2hvb2tzW3BmXVtob29rXSkgfHwJCQkJCSAgICAgICBcCi0gICAgKF9fcmV0PW5mX2hvb2tfc2xvdyhwZiwgaG9vaywgJihza2IpLCBpbmRldiwgb3V0ZGV2LCBva2ZuLCB0aHJlc2gpKSA9PSAxKSAgXAotCV9fcmV0ID0gKG9rZm4pKHNrYik7CQkJCQkJICAgICAgIFwKLV9fcmV0O30pCi0jZW5kaWYKIAotaW50IG5mX2hvb2tfc2xvdyhpbnQgcGYsIHVuc2lnbmVkIGludCBob29rLCBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCSBzdHJ1Y3QgbmV0X2RldmljZSAqaW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpvdXRkZXYsCi0JCSBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSwgaW50IHRocmVzaCk7CisvKiBIWDogSXQncyBzbGlnaHRseSBsZXNzIGdyb3NzIG5vdy4gKi8KKworI2RlZmluZSBORl9IT09LX1RIUkVTSChwZiwgaG9vaywgc2tiLCBpbmRldiwgb3V0ZGV2LCBva2ZuLCB0aHJlc2gpCSAgICAgICBcCisoe2ludCBfX3JldDsJCQkJCQkJCSAgICAgICBcCitpZiAoKF9fcmV0PW5mX2hvb2tfdGhyZXNoKHBmLCBob29rLCAmKHNrYiksIGluZGV2LCBvdXRkZXYsIG9rZm4sIHRocmVzaCkpID09IDEpXAorCV9fcmV0ID0gKG9rZm4pKHNrYik7CQkJCQkJICAgICAgIFwKK19fcmV0O30pCisKKyNkZWZpbmUgTkZfSE9PSyhwZiwgaG9vaywgc2tiLCBpbmRldiwgb3V0ZGV2LCBva2ZuKSBcCisJTkZfSE9PS19USFJFU0gocGYsIGhvb2ssIHNrYiwgaW5kZXYsIG91dGRldiwgb2tmbiwgSU5UX01JTikKIAogLyogQ2FsbCBzZXRzb2Nrb3B0KCkgKi8KIGludCBuZl9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IHBmLCBpbnQgb3B0dmFsLCBjaGFyIF9fdXNlciAqb3B0LCAKQEAgLTI2MSw2ICsyNzQsMjAgQEAKIGV4dGVybiBpbnQgbmZfcmVnaXN0ZXJfcXVldWVfcmVyb3V0ZXIoaW50IHBmLCBzdHJ1Y3QgbmZfcXVldWVfcmVyb3V0ZXIgKnJlcik7CiBleHRlcm4gaW50IG5mX3VucmVnaXN0ZXJfcXVldWVfcmVyb3V0ZXIoaW50IHBmKTsKIAorI2luY2x1ZGUgPG5ldC9mbG93Lmg+CitleHRlcm4gdm9pZCAoKmlwX25hdF9kZWNvZGVfc2Vzc2lvbikoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IGZsb3dpICopOworCitzdGF0aWMgaW5saW5lIHZvaWQKK25mX25hdF9kZWNvZGVfc2Vzc2lvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZmxvd2kgKmZsLCBpbnQgZmFtaWx5KQoreworI2lmZGVmIENPTkZJR19JUF9ORl9OQVRfTkVFREVECisJdm9pZCAoKmRlY29kZWZuKShzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgZmxvd2kgKik7CisKKwlpZiAoZmFtaWx5ID09IEFGX0lORVQgJiYgKGRlY29kZWZuID0gaXBfbmF0X2RlY29kZV9zZXNzaW9uKSAhPSBOVUxMKQorCQlkZWNvZGVmbihza2IsIGZsKTsKKyNlbmRpZgorfQorCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiBleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX25ldF9uZXRmaWx0ZXI7CkBAIC0yNjgsNyArMjk1LDI0IEBACiAKICNlbHNlIC8qICFDT05GSUdfTkVURklMVEVSICovCiAjZGVmaW5lIE5GX0hPT0socGYsIGhvb2ssIHNrYiwgaW5kZXYsIG91dGRldiwgb2tmbikgKG9rZm4pKHNrYikKK3N0YXRpYyBpbmxpbmUgaW50IG5mX2hvb2tfdGhyZXNoKGludCBwZiwgdW5zaWduZWQgaW50IGhvb2ssCisJCQkJIHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmluZGV2LAorCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0ZGV2LAorCQkJCSBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSwgaW50IHRocmVzaCkKK3sKKwlyZXR1cm4gb2tmbigqcHNrYik7Cit9CitzdGF0aWMgaW5saW5lIGludCBuZl9ob29rKGludCBwZiwgdW5zaWduZWQgaW50IGhvb2ssIHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmluZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0ZGV2LAorCQkJICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlyZXR1cm4gb2tmbigqcHNrYik7Cit9CiBzdGF0aWMgaW5saW5lIHZvaWQgbmZfY3RfYXR0YWNoKHN0cnVjdCBza19idWZmICpuZXcsIHN0cnVjdCBza19idWZmICpza2IpIHt9CitzdHJ1Y3QgZmxvd2k7CitzdGF0aWMgaW5saW5lIHZvaWQKK25mX25hdF9kZWNvZGVfc2Vzc2lvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZmxvd2kgKmZsLCBpbnQgZmFtaWx5KSB7fQogI2VuZGlmIC8qQ09ORklHX05FVEZJTFRFUiovCiAKICNlbmRpZiAvKl9fS0VSTkVMX18qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oCmluZGV4IDZkMzliNTEuLjNmZjg4YzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21tb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmgKQEAgLTE1NCw2ICsxNTQsOSBAQAogCXVuc2lnbmVkIGludCBleHBlY3RfZGVsZXRlOwogfTsKIAorLyogY2FsbCB0byBjcmVhdGUgYW4gZXhwbGljaXQgZGVwZW5kZW5jeSBvbiBuZl9jb25udHJhY2suICovCitleHRlcm4gdm9pZCBuZWVkX2Nvbm50cmFjayh2b2lkKTsKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmIC8qIF9ORl9DT05OVFJBQ0tfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZmY2YzQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oCkBAIC0wLDAgKzEsMjI0IEBACisjaWZuZGVmIF9YX1RBQkxFU19ICisjZGVmaW5lIF9YX1RBQkxFU19ICisKKyNkZWZpbmUgWFRfRlVOQ1RJT05fTUFYTkFNRUxFTiAzMAorI2RlZmluZSBYVF9UQUJMRV9NQVhOQU1FTEVOIDMyCisKKy8qIFRoZSBhcmd1bWVudCB0byBJUFRfU09fR0VUX1JFVklTSU9OXyouICBSZXR1cm5zIGhpZ2hlc3QgcmV2aXNpb24KKyAqIGtlcm5lbCBzdXBwb3J0cywgaWYgPj0gcmV2aXNpb24uICovCitzdHJ1Y3QgeHRfZ2V0X3JldmlzaW9uCit7CisJY2hhciBuYW1lW1hUX0ZVTkNUSU9OX01BWE5BTUVMRU4tMV07CisKKwl1X2ludDhfdCByZXZpc2lvbjsKK307CisKKy8qIENPTlRJTlVFIHZlcmRpY3QgZm9yIHRhcmdldHMgKi8KKyNkZWZpbmUgWFRfQ09OVElOVUUgMHhGRkZGRkZGRgorCisvKiBGb3Igc3RhbmRhcmQgdGFyZ2V0ICovCisjZGVmaW5lIFhUX1JFVFVSTiAoLU5GX1JFUEVBVCAtIDEpCisKKyNkZWZpbmUgWFRfQUxJR04ocykgKCgocykgKyAoX19hbGlnbm9mX18odV9pbnQ2NF90KS0xKSkgJiB+KF9fYWxpZ25vZl9fKHVfaW50NjRfdCktMSkpCisKKy8qIFN0YW5kYXJkIHJldHVybiB2ZXJkaWN0LCBvciBkbyBqdW1wLiAqLworI2RlZmluZSBYVF9TVEFOREFSRF9UQVJHRVQgIiIKKy8qIEVycm9yIHZlcmRpY3QuICovCisjZGVmaW5lIFhUX0VSUk9SX1RBUkdFVCAiRVJST1IiCisKKy8qCisgKiBOZXcgSVAgZmlyZXdhbGwgb3B0aW9ucyBmb3IgW2dzXWV0c29ja29wdCBhdCB0aGUgUkFXIElQIGxldmVsLgorICogVW5saWtlIEJTRCBMaW51eCBpbmhlcml0cyBJUCBvcHRpb25zIHNvIHlvdSBkb24ndCBoYXZlIHRvIHVzZSBhIHJhdworICogc29ja2V0IGZvciB0aGlzLiBJbnN0ZWFkIHdlIGNoZWNrIHJpZ2h0cyBpbiB0aGUgY2FsbHMuICovCisjZGVmaW5lIFhUX0JBU0VfQ1RMCQk2NAkvKiBiYXNlIGZvciBmaXJld2FsbCBzb2NrZXQgb3B0aW9ucyAqLworCisjZGVmaW5lIFhUX1NPX1NFVF9SRVBMQUNFCShYVF9CQVNFX0NUTCkKKyNkZWZpbmUgWFRfU09fU0VUX0FERF9DT1VOVEVSUwkoWFRfQkFTRV9DVEwgKyAxKQorI2RlZmluZSBYVF9TT19TRVRfTUFYCQlYVF9TT19TRVRfQUREX0NPVU5URVJTCisKKyNkZWZpbmUgWFRfU09fR0VUX0lORk8JCQkoWFRfQkFTRV9DVEwpCisjZGVmaW5lIFhUX1NPX0dFVF9FTlRSSUVTCQkoWFRfQkFTRV9DVEwgKyAxKQorI2RlZmluZSBYVF9TT19HRVRfUkVWSVNJT05fTUFUQ0gJKFhUX0JBU0VfQ1RMICsgMikKKyNkZWZpbmUgWFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAkoWFRfQkFTRV9DVEwgKyAzKQorI2RlZmluZSBYVF9TT19HRVRfTUFYCQkJWFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAorCisjZGVmaW5lIFNFVF9DT1VOVEVSKGMsYixwKSBkbyB7IChjKS5iY250ID0gKGIpOyAoYykucGNudCA9IChwKTsgfSB3aGlsZSgwKQorI2RlZmluZSBBRERfQ09VTlRFUihjLGIscCkgZG8geyAoYykuYmNudCArPSAoYik7IChjKS5wY250ICs9IChwKTsgfSB3aGlsZSgwKQorCitzdHJ1Y3QgeHRfY291bnRlcnMKK3sKKwl1X2ludDY0X3QgcGNudCwgYmNudDsJCQkvKiBQYWNrZXQgYW5kIGJ5dGUgY291bnRlcnMgKi8KK307CisKKy8qIFRoZSBhcmd1bWVudCB0byBJUFRfU09fQUREX0NPVU5URVJTLiAqLworc3RydWN0IHh0X2NvdW50ZXJzX2luZm8KK3sKKwkvKiBXaGljaCB0YWJsZS4gKi8KKwljaGFyIG5hbWVbWFRfVEFCTEVfTUFYTkFNRUxFTl07CisKKwl1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzOworCisJLyogVGhlIGNvdW50ZXJzIChhY3R1YWxseSBgbnVtYmVyJyBvZiB0aGVzZSkuICovCisJc3RydWN0IHh0X2NvdW50ZXJzIGNvdW50ZXJzWzBdOworfTsKKworI2RlZmluZSBYVF9JTlZfUFJPVE8JCTB4NDAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBQUk9UTy4gKi8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisjZGVmaW5lIEFTU0VSVF9SRUFEX0xPQ0soeCkKKyNkZWZpbmUgQVNTRVJUX1dSSVRFX0xPQ0soeCkKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9saXN0aGVscC5oPgorCitzdHJ1Y3QgeHRfbWF0Y2gKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwljb25zdCBjaGFyIG5hbWVbWFRfRlVOQ1RJT05fTUFYTkFNRUxFTi0xXTsKKworCXVfaW50OF90IHJldmlzaW9uOworCisJLyogUmV0dXJuIHRydWUgb3IgZmFsc2U6IHJldHVybiBGQUxTRSBhbmQgc2V0ICpob3Rkcm9wID0gMSB0bworICAgICAgICAgICBmb3JjZSBpbW1lZGlhdGUgcGFja2V0IGRyb3AuICovCisJLyogQXJndW1lbnRzIGNoYW5nZWQgc2luY2UgMi42LjksIGFzIHRoaXMgbXVzdCBub3cgaGFuZGxlCisJICAgbm9uLWxpbmVhciBza2IsIHVzaW5nIHNrYl9oZWFkZXJfcG9pbnRlciBhbmQKKwkgICBza2JfaXBfbWFrZV93cml0YWJsZS4gKi8KKwlpbnQgKCptYXRjaCkoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisJCSAgICAgaW50IG9mZnNldCwKKwkJICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKwkJICAgICBpbnQgKmhvdGRyb3ApOworCisJLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLworCS8qIFNob3VsZCByZXR1cm4gdHJ1ZSBvciBmYWxzZS4gKi8KKwlpbnQgKCpjaGVja2VudHJ5KShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCQkgIGNvbnN0IHZvaWQgKmlwLAorCQkJICB2b2lkICptYXRjaGluZm8sCisJCQkgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAorCQkJICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKTsKKworCS8qIENhbGxlZCB3aGVuIGVudHJ5IG9mIHRoaXMgdHlwZSBkZWxldGVkLiAqLworCXZvaWQgKCpkZXN0cm95KSh2b2lkICptYXRjaGluZm8sIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplKTsKKworCS8qIFNldCB0aGlzIHRvIFRISVNfTU9EVUxFIGlmIHlvdSBhcmUgYSBtb2R1bGUsIG90aGVyd2lzZSBOVUxMICovCisJc3RydWN0IG1vZHVsZSAqbWU7Cit9OworCisvKiBSZWdpc3RyYXRpb24gaG9va3MgZm9yIHRhcmdldHMuICovCitzdHJ1Y3QgeHRfdGFyZ2V0Cit7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJY29uc3QgY2hhciBuYW1lW1hUX0ZVTkNUSU9OX01BWE5BTUVMRU4tMV07CisKKwl1X2ludDhfdCByZXZpc2lvbjsKKworCS8qIFJldHVybnMgdmVyZGljdC4gQXJndW1lbnQgb3JkZXIgY2hhbmdlZCBzaW5jZSAyLjYuOSwgYXMgdGhpcworCSAgIG11c3Qgbm93IGhhbmRsZSBub24tbGluZWFyIHNrYnMsIHVzaW5nIHNrYl9jb3B5X2JpdHMgYW5kCisJICAgc2tiX2lwX21ha2Vfd3JpdGFibGUuICovCisJdW5zaWduZWQgaW50ICgqdGFyZ2V0KShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCisJCQkgICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCisJCQkgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisJLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlOgorICAgICAgICAgICBob29rX21hc2sgaXMgYSBiaXRtYXNrIG9mIGhvb2tzIGZyb20gd2hpY2ggaXQgY2FuIGJlCisgICAgICAgICAgIGNhbGxlZC4gKi8KKwkvKiBTaG91bGQgcmV0dXJuIHRydWUgb3IgZmFsc2UuICovCisJaW50ICgqY2hlY2tlbnRyeSkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCQkJICBjb25zdCB2b2lkICplbnRyeSwKKwkJCSAgdm9pZCAqdGFyZ2luZm8sCisJCQkgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCisJCQkgIHVuc2lnbmVkIGludCBob29rX21hc2spOworCisJLyogQ2FsbGVkIHdoZW4gZW50cnkgb2YgdGhpcyB0eXBlIGRlbGV0ZWQuICovCisJdm9pZCAoKmRlc3Ryb3kpKHZvaWQgKnRhcmdpbmZvLCB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplKTsKKworCS8qIFNldCB0aGlzIHRvIFRISVNfTU9EVUxFIGlmIHlvdSBhcmUgYSBtb2R1bGUsIG90aGVyd2lzZSBOVUxMICovCisJc3RydWN0IG1vZHVsZSAqbWU7Cit9OworCisvKiBGdXJuaXR1cmUgc2hvcHBpbmcuLi4gKi8KK3N0cnVjdCB4dF90YWJsZQoreworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCS8qIEEgdW5pcXVlIG5hbWUuLi4gKi8KKwljaGFyIG5hbWVbWFRfVEFCTEVfTUFYTkFNRUxFTl07CisKKwkvKiBXaGF0IGhvb2tzIHlvdSB3aWxsIGVudGVyIG9uICovCisJdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzOworCisJLyogTG9jayBmb3IgdGhlIGN1cnRhaW4gKi8KKwlyd2xvY2tfdCBsb2NrOworCisJLyogTWFuIGJlaGluZCB0aGUgY3VydGFpbi4uLiAqLworCS8vc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqcHJpdmF0ZTsKKwl2b2lkICpwcml2YXRlOworCisJLyogU2V0IHRoaXMgdG8gVEhJU19NT0RVTEUgaWYgeW91IGFyZSBhIG1vZHVsZSwgb3RoZXJ3aXNlIE5VTEwgKi8KKwlzdHJ1Y3QgbW9kdWxlICptZTsKKworCWludCBhZjsJCS8qIGFkZHJlc3MvcHJvdG9jb2wgZmFtaWx5ICovCit9OworCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKworLyogVGhlIHRhYmxlIGl0c2VsZiAqLworc3RydWN0IHh0X3RhYmxlX2luZm8KK3sKKwkvKiBTaXplIHBlciB0YWJsZSAqLworCXVuc2lnbmVkIGludCBzaXplOworCS8qIE51bWJlciBvZiBlbnRyaWVzOiBGSVhNRS4gLS1SUiAqLworCXVuc2lnbmVkIGludCBudW1iZXI7CisJLyogSW5pdGlhbCBudW1iZXIgb2YgZW50cmllcy4gTmVlZGVkIGZvciBtb2R1bGUgdXNhZ2UgY291bnQgKi8KKwl1bnNpZ25lZCBpbnQgaW5pdGlhbF9lbnRyaWVzOworCisJLyogRW50cnkgcG9pbnRzIGFuZCB1bmRlcmZsb3dzICovCisJdW5zaWduZWQgaW50IGhvb2tfZW50cnlbTkZfSVBfTlVNSE9PS1NdOworCXVuc2lnbmVkIGludCB1bmRlcmZsb3dbTkZfSVBfTlVNSE9PS1NdOworCisJLyogaXB0X2VudHJ5IHRhYmxlczogb25lIHBlciBDUFUgKi8KKwljaGFyICplbnRyaWVzW05SX0NQVVNdOworfTsKKworZXh0ZXJuIGludCB4dF9yZWdpc3Rlcl90YXJnZXQoaW50IGFmLCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQpOworZXh0ZXJuIHZvaWQgeHRfdW5yZWdpc3Rlcl90YXJnZXQoaW50IGFmLCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQpOworZXh0ZXJuIGludCB4dF9yZWdpc3Rlcl9tYXRjaChpbnQgYWYsIHN0cnVjdCB4dF9tYXRjaCAqdGFyZ2V0KTsKK2V4dGVybiB2b2lkIHh0X3VucmVnaXN0ZXJfbWF0Y2goaW50IGFmLCBzdHJ1Y3QgeHRfbWF0Y2ggKnRhcmdldCk7CisKK2V4dGVybiBpbnQgeHRfcmVnaXN0ZXJfdGFibGUoc3RydWN0IHh0X3RhYmxlICp0YWJsZSwKKwkJCSAgICAgc3RydWN0IHh0X3RhYmxlX2luZm8gKmJvb3RzdHJhcCwKKwkJCSAgICAgc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm8pOworZXh0ZXJuIHZvaWQgKnh0X3VucmVnaXN0ZXJfdGFibGUoc3RydWN0IHh0X3RhYmxlICp0YWJsZSk7CisKK2V4dGVybiBzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqeHRfcmVwbGFjZV90YWJsZShzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzLAorCQkJCQkgICAgICBzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbywKKwkJCQkJICAgICAgaW50ICplcnJvcik7CisKK2V4dGVybiBzdHJ1Y3QgeHRfbWF0Y2ggKnh0X2ZpbmRfbWF0Y2goaW50IGFmLCBjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbik7CitleHRlcm4gc3RydWN0IHh0X3RhcmdldCAqeHRfZmluZF90YXJnZXQoaW50IGFmLCBjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbik7CitleHRlcm4gc3RydWN0IHh0X3RhcmdldCAqeHRfcmVxdWVzdF9maW5kX3RhcmdldChpbnQgYWYsIGNvbnN0IGNoYXIgKm5hbWUsIAorCQkJCQkJdTggcmV2aXNpb24pOworZXh0ZXJuIGludCB4dF9maW5kX3JldmlzaW9uKGludCBhZiwgY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24sIGludCB0YXJnZXQsCisJCQkgICAgaW50ICplcnIpOworCitleHRlcm4gc3RydWN0IHh0X3RhYmxlICp4dF9maW5kX3RhYmxlX2xvY2soaW50IGFmLCBjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiB2b2lkIHh0X3RhYmxlX3VubG9jayhzdHJ1Y3QgeHRfdGFibGUgKnQpOworCitleHRlcm4gaW50IHh0X3Byb3RvX2luaXQoaW50IGFmKTsKK2V4dGVybiB2b2lkIHh0X3Byb3RvX2ZpbmkoaW50IGFmKTsKKworZXh0ZXJuIHN0cnVjdCB4dF90YWJsZV9pbmZvICp4dF9hbGxvY190YWJsZV9pbmZvKHVuc2lnbmVkIGludCBzaXplKTsKK2V4dGVybiB2b2lkIHh0X2ZyZWVfdGFibGVfaW5mbyhzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqaW5mbyk7CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfWF9UQUJMRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfQ0xBU1NJRlkuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NMQVNTSUZZLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxMTEzNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NMQVNTSUZZLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9YVF9DTEFTU0lGWV9ICisjZGVmaW5lIF9YVF9DTEFTU0lGWV9ICisKK3N0cnVjdCB4dF9jbGFzc2lmeV90YXJnZXRfaW5mbyB7CisJdV9pbnQzMl90IHByaW9yaXR5OworfTsKKworI2VuZGlmIC8qX1hUX0NMQVNTSUZZX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DT05OTUFSSy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNzQ0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DT05OTUFSSy5oCkBAIC0wLDAgKzEsMjUgQEAKKyNpZm5kZWYgX1hUX0NPTk5NQVJLX0hfdGFyZ2V0CisjZGVmaW5lIF9YVF9DT05OTUFSS19IX3RhcmdldAorCisvKiBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwNCBNQVJBIFN5c3RlbXMgQUIgPGh0dHA6Ly93d3cubWFyYXN5c3RlbXMuY29tPgorICogYnkgSGVucmlrIE5vcmRzdHJvbSA8aG5vQG1hcmFzeXN0ZW1zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKK2VudW0geworCVhUX0NPTk5NQVJLX1NFVCA9IDAsCisJWFRfQ09OTk1BUktfU0FWRSwKKwlYVF9DT05OTUFSS19SRVNUT1JFCit9OworCitzdHJ1Y3QgeHRfY29ubm1hcmtfdGFyZ2V0X2luZm8geworCXVuc2lnbmVkIGxvbmcgbWFyazsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJdV9pbnQ4X3QgbW9kZTsKK307CisKKyNlbmRpZiAvKl9YVF9DT05OTUFSS19IX3RhcmdldCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9NQVJLLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9NQVJLLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAyMWU5MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X01BUksuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9YVF9NQVJLX0hfdGFyZ2V0CisjZGVmaW5lIF9YVF9NQVJLX0hfdGFyZ2V0CisKKy8qIFZlcnNpb24gMCAqLworc3RydWN0IHh0X21hcmtfdGFyZ2V0X2luZm8geworCXVuc2lnbmVkIGxvbmcgbWFyazsKK307CisKKy8qIFZlcnNpb24gMSAqLworZW51bSB7CisJWFRfTUFSS19TRVQ9MCwKKwlYVF9NQVJLX0FORCwKKwlYVF9NQVJLX09SLAorfTsKKworc3RydWN0IHh0X21hcmtfdGFyZ2V0X2luZm9fdjEgeworCXVuc2lnbmVkIGxvbmcgbWFyazsKKwl1X2ludDhfdCBtb2RlOworfTsKKworI2VuZGlmIC8qX1hUX01BUktfSF90YXJnZXQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X05GUVVFVUUuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X05GUVVFVUUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTlhZjc5ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X05GUVVFVUUuaApAQCAtMCwwICsxLDE2IEBACisvKiBpcHRhYmxlcyBtb2R1bGUgZm9yIHVzaW5nIE5GUVVFVUUgbWVjaGFuaXNtCisgKgorICogKEMpIDIwMDUgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciBHTlUgR1BMIHYyLCAxOTkxCisgKiAKKyovCisjaWZuZGVmIF9YVF9ORlFfVEFSR0VUX0gKKyNkZWZpbmUgX1hUX05GUV9UQVJHRVRfSAorCisvKiB0YXJnZXQgaW5mbyAqLworc3RydWN0IHh0X05GUV9pbmZvIHsKKwl1X2ludDE2X3QgcXVldWVudW07Cit9OworCisjZW5kaWYgLyogX1hUX05GUV9UQVJHRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29tbWVudC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29tbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhY2ZlZGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb21tZW50LmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfWFRfQ09NTUVOVF9ICisjZGVmaW5lIF9YVF9DT01NRU5UX0gKKworI2RlZmluZSBYVF9NQVhfQ09NTUVOVF9MRU4gMjU2CisKK3N0cnVjdCB4dF9jb21tZW50X2luZm8geworCXVuc2lnbmVkIGNoYXIgY29tbWVudFtYVF9NQVhfQ09NTUVOVF9MRU5dOworfTsKKworI2VuZGlmIC8qIFhUX0NPTU1FTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25uYnl0ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDIyYzk4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZiBfWFRfQ09OTkJZVEVTX0gKKyNkZWZpbmUgX1hUX0NPTk5CWVRFU19ICisKK2VudW0geHRfY29ubmJ5dGVzX3doYXQgeworCVhUX0NPTk5CWVRFU19QS1RTLAorCVhUX0NPTk5CWVRFU19CWVRFUywKKwlYVF9DT05OQllURVNfQVZHUEtULAorfTsKKworZW51bSB4dF9jb25uYnl0ZXNfZGlyZWN0aW9uIHsKKwlYVF9DT05OQllURVNfRElSX09SSUdJTkFMLAorCVhUX0NPTk5CWVRFU19ESVJfUkVQTFksCisJWFRfQ09OTkJZVEVTX0RJUl9CT1RILAorfTsKKworc3RydWN0IHh0X2Nvbm5ieXRlc19pbmZvCit7CisJc3RydWN0IHsKKwkJYWxpZ25lZF91NjQgZnJvbTsJLyogY291bnQgdG8gYmUgbWF0Y2hlZCAqLworCQlhbGlnbmVkX3U2NCB0bzsJCS8qIGNvdW50IHRvIGJlIG1hdGNoZWQgKi8KKwl9IGNvdW50OworCXVfaW50OF90IHdoYXQ7CQkvKiBpcHRfY29ubmJ5dGVzX3doYXQgKi8KKwl1X2ludDhfdCBkaXJlY3Rpb247CS8qIGlwdF9jb25uYnl0ZXNfZGlyZWN0aW9uICovCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25ubWFyay5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTkyZjZhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9YVF9DT05OTUFSS19ICisjZGVmaW5lIF9YVF9DT05OTUFSS19ICisKKy8qIENvcHlyaWdodCAoQykgMjAwMiwyMDA0IE1BUkEgU3lzdGVtcyBBQiA8aHR0cDovL3d3dy5tYXJhc3lzdGVtcy5jb20+CisgKiBieSBIZW5yaWsgTm9yZHN0cm9tIDxobm9AbWFyYXN5c3RlbXMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworc3RydWN0IHh0X2Nvbm5tYXJrX2luZm8geworCXVuc2lnbmVkIGxvbmcgbWFyaywgbWFzazsKKwl1X2ludDhfdCBpbnZlcnQ7Cit9OworCisjZW5kaWYgLypfWFRfQ09OTk1BUktfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25udHJhY2suaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZjYzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25udHJhY2suaApAQCAtMCwwICsxLDYzIEBACisvKiBIZWFkZXIgZmlsZSBmb3Iga2VybmVsIG1vZHVsZSB0byBtYXRjaCBjb25uZWN0aW9uIHRyYWNraW5nIGluZm9ybWF0aW9uLgorICogR1BMIChDKSAyMDAxICBNYXJjIEJvdWNoZXIgKG1hcmNAbWJzaS5jYSkuCisgKi8KKworI2lmbmRlZiBfWFRfQ09OTlRSQUNLX0gKKyNkZWZpbmUgX1hUX0NPTk5UUkFDS19ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlX2NvbW1vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1NUQVRFX0JJVChjdGluZm8pICgxIDw8ICgoY3RpbmZvKSVJUF9DVF9JU19SRVBMWSsxKSkKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1NUQVRFX0lOVkFMSUQgKDEgPDwgMCkKKworI2RlZmluZSBYVF9DT05OVFJBQ0tfU1RBVEVfU05BVCAoMSA8PCAoSVBfQ1RfTlVNQkVSICsgMSkpCisjZGVmaW5lIFhUX0NPTk5UUkFDS19TVEFURV9ETkFUICgxIDw8IChJUF9DVF9OVU1CRVIgKyAyKSkKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1NUQVRFX1VOVFJBQ0tFRCAoMSA8PCAoSVBfQ1RfTlVNQkVSICsgMykpCisKKy8qIGZsYWdzLCBpbnZmbGFnczogKi8KKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1NUQVRFCTB4MDEKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1BST1RPCTB4MDIKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX09SSUdTUkMJMHgwNAorI2RlZmluZSBYVF9DT05OVFJBQ0tfT1JJR0RTVAkweDA4CisjZGVmaW5lIFhUX0NPTk5UUkFDS19SRVBMU1JDCTB4MTAKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1JFUExEU1QJMHgyMAorI2RlZmluZSBYVF9DT05OVFJBQ0tfU1RBVFVTCTB4NDAKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX0VYUElSRVMJMHg4MAorCisvKiBUaGlzIGlzIGV4cG9zZWQgdG8gdXNlcnNwYWNlLCBzbyByZW1haW5zIGZyb3plbiBpbiB0aW1lLiAqLworc3RydWN0IGlwX2Nvbm50cmFja19vbGRfdHVwbGUKK3sKKwlzdHJ1Y3QgeworCQlfX3UzMiBpcDsKKwkJdW5pb24geworCQkJX191MTYgYWxsOworCQl9IHU7CisJfSBzcmM7CisKKwlzdHJ1Y3QgeworCQlfX3UzMiBpcDsKKwkJdW5pb24geworCQkJX191MTYgYWxsOworCQl9IHU7CisKKwkJLyogVGhlIHByb3RvY29sLiAqLworCQl1MTYgcHJvdG9udW07CisJfSBkc3Q7Cit9OworCitzdHJ1Y3QgeHRfY29ubnRyYWNrX2luZm8KK3sKKwl1bnNpZ25lZCBpbnQgc3RhdGVtYXNrLCBzdGF0dXNtYXNrOworCisJc3RydWN0IGlwX2Nvbm50cmFja19vbGRfdHVwbGUgdHVwbGVbSVBfQ1RfRElSX01BWF07CisJc3RydWN0IGluX2FkZHIgc2lwbXNrW0lQX0NUX0RJUl9NQVhdLCBkaXBtc2tbSVBfQ1RfRElSX01BWF07CisKKwl1bnNpZ25lZCBsb25nIGV4cGlyZXNfbWluLCBleHBpcmVzX21heDsKKworCS8qIEZsYWdzIHdvcmQgKi8KKwl1X2ludDhfdCBmbGFnczsKKwkvKiBJbnZlcnNlIGZsYWdzICovCisJdV9pbnQ4X3QgaW52ZmxhZ3M7Cit9OworI2VuZGlmIC8qX1hUX0NPTk5UUkFDS19IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2RjY3AuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2RjY3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDIyMWI5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfZGNjcC5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgX1hUX0RDQ1BfSF8KKyNkZWZpbmUgX1hUX0RDQ1BfSF8KKworI2RlZmluZSBYVF9EQ0NQX1NSQ19QT1JUUwkgICAgICAgIDB4MDEKKyNkZWZpbmUgWFRfRENDUF9ERVNUX1BPUlRTCSAgICAgICAgMHgwMgorI2RlZmluZSBYVF9EQ0NQX1RZUEUJCQkweDA0CisjZGVmaW5lIFhUX0RDQ1BfT1BUSU9OCQkJMHgwOAorCisjZGVmaW5lIFhUX0RDQ1BfVkFMSURfRkxBR1MJCTB4MGYKKworc3RydWN0IHh0X2RjY3BfaW5mbyB7CisJdV9pbnQxNl90IGRwdHNbMl07ICAvKiBNaW4sIE1heCAqLworCXVfaW50MTZfdCBzcHRzWzJdOyAgLyogTWluLCBNYXggKi8KKworCXVfaW50MTZfdCBmbGFnczsKKwl1X2ludDE2X3QgaW52ZmxhZ3M7CisKKwl1X2ludDE2X3QgdHlwZW1hc2s7CisJdV9pbnQ4X3Qgb3B0aW9uOworfTsKKworI2VuZGlmIC8qIF9YVF9EQ0NQX0hfICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2hlbHBlci5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfaGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI0Mjc2MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2hlbHBlci5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfWFRfSEVMUEVSX0gKKyNkZWZpbmUgX1hUX0hFTFBFUl9ICisKK3N0cnVjdCB4dF9oZWxwZXJfaW5mbyB7CisJaW50IGludmVydDsKKwljaGFyIG5hbWVbMzBdOworfTsKKyNlbmRpZiAvKiBfWFRfSEVMUEVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2xlbmd0aC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyYjQzOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2xlbmd0aC5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfWFRfTEVOR1RIX0gKKyNkZWZpbmUgX1hUX0xFTkdUSF9ICisKK3N0cnVjdCB4dF9sZW5ndGhfaW5mbyB7CisgICAgdV9pbnQxNl90CW1pbiwgbWF4OworICAgIHVfaW50OF90CWludmVydDsKK307CisKKyNlbmRpZiAvKl9YVF9MRU5HVEhfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9saW1pdC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbGltaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2NlNjUzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbGltaXQuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9YVF9SQVRFX0gKKyNkZWZpbmUgX1hUX1JBVEVfSAorCisvKiB0aW1pbmdzIGFyZSBpbiBtaWxsaXNlY29uZHMuICovCisjZGVmaW5lIFhUX0xJTUlUX1NDQUxFIDEwMDAwCisKKy8qIDEvMTAsMDAwIHNlYyBwZXJpb2QgPT4gbWF4IG9mIDEwLDAwMC9zZWMuICBNaW4gcmF0ZSBpcyB0aGVuIDQyOTQ5MAorICAgc2Vjb25kcywgb3Igb25lIGV2ZXJ5IDU5IGhvdXJzLiAqLworc3RydWN0IHh0X3JhdGVpbmZvIHsKKwl1X2ludDMyX3QgYXZnOyAgICAvKiBBdmVyYWdlIHNlY3MgYmV0d2VlbiBwYWNrZXRzICogc2NhbGUgKi8KKwl1X2ludDMyX3QgYnVyc3Q7ICAvKiBQZXJpb2QgbXVsdGlwbGllciBmb3IgdXBwZXIgbGltaXQuICovCisKKwkvKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIGtlcm5lbCAqLworCXVuc2lnbmVkIGxvbmcgcHJldjsKKwl1X2ludDMyX3QgY3JlZGl0OworCXVfaW50MzJfdCBjcmVkaXRfY2FwLCBjb3N0OworCisJLyogVWdseSwgdWdseSBmdWNrZXIuICovCisJc3RydWN0IHh0X3JhdGVpbmZvICptYXN0ZXI7Cit9OworI2VuZGlmIC8qX1hUX1JBVEVfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9tYWMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X21hYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OTJjZGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9tYWMuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX1hUX01BQ19ICisjZGVmaW5lIF9YVF9NQUNfSAorCitzdHJ1Y3QgeHRfbWFjX2luZm8geworICAgIHVuc2lnbmVkIGNoYXIgc3JjYWRkcltFVEhfQUxFTl07CisgICAgaW50IGludmVydDsKK307CisjZW5kaWYgLypfWFRfTUFDX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbWFyay5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbWFyay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMmRkNDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9tYXJrLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9YVF9NQVJLX0gKKyNkZWZpbmUgX1hUX01BUktfSAorCitzdHJ1Y3QgeHRfbWFya19pbmZvIHsKKyAgICB1bnNpZ25lZCBsb25nIG1hcmssIG1hc2s7CisgICAgdV9pbnQ4X3QgaW52ZXJ0OworfTsKKworI2VuZGlmIC8qX1hUX01BUktfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9waHlzZGV2LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9waHlzZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhN2ExOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIF9YVF9QSFlTREVWX0gKKyNkZWZpbmUgX1hUX1BIWVNERVZfSAorCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjZW5kaWYKKworI2RlZmluZSBYVF9QSFlTREVWX09QX0lOCQkweDAxCisjZGVmaW5lIFhUX1BIWVNERVZfT1BfT1VUCQkweDAyCisjZGVmaW5lIFhUX1BIWVNERVZfT1BfQlJJREdFRAkJMHgwNAorI2RlZmluZSBYVF9QSFlTREVWX09QX0lTSU4JCTB4MDgKKyNkZWZpbmUgWFRfUEhZU0RFVl9PUF9JU09VVAkJMHgxMAorI2RlZmluZSBYVF9QSFlTREVWX09QX01BU0sJCSgweDIwIC0gMSkKKworc3RydWN0IHh0X3BoeXNkZXZfaW5mbyB7CisJY2hhciBwaHlzaW5kZXZbSUZOQU1TSVpdOworCWNoYXIgaW5fbWFza1tJRk5BTVNJWl07CisJY2hhciBwaHlzb3V0ZGV2W0lGTkFNU0laXTsKKwljaGFyIG91dF9tYXNrW0lGTkFNU0laXTsKKwl1X2ludDhfdCBpbnZlcnQ7CisJdV9pbnQ4X3QgYml0bWFzazsKK307CisKKyNlbmRpZiAvKl9YVF9QSFlTREVWX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNjVjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9wa3R0eXBlLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9YVF9QS1RUWVBFX0gKKyNkZWZpbmUgX1hUX1BLVFRZUEVfSAorCitzdHJ1Y3QgeHRfcGt0dHlwZV9pbmZvIHsKKwlpbnQJcGt0dHlwZTsKKwlpbnQJaW52ZXJ0OworfTsKKyNlbmRpZiAvKl9YVF9QS1RUWVBFX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcmVhbG0uaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3JlYWxtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwZTg3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3JlYWxtLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfWFRfUkVBTE1fSAorI2RlZmluZSBfWFRfUkVBTE1fSAorCitzdHJ1Y3QgeHRfcmVhbG1faW5mbyB7CisJdV9pbnQzMl90IGlkOworCXVfaW50MzJfdCBtYXNrOworCXVfaW50OF90IGludmVydDsKK307CisKKyNlbmRpZiAvKiBfWFRfUkVBTE1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc2N0cC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc2N0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNTc4OTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zY3RwLmgKQEAgLTAsMCArMSwxMDcgQEAKKyNpZm5kZWYgX1hUX1NDVFBfSF8KKyNkZWZpbmUgX1hUX1NDVFBfSF8KKworI2RlZmluZSBYVF9TQ1RQX1NSQ19QT1JUUwkgICAgICAgIDB4MDEKKyNkZWZpbmUgWFRfU0NUUF9ERVNUX1BPUlRTCSAgICAgICAgMHgwMgorI2RlZmluZSBYVF9TQ1RQX0NIVU5LX1RZUEVTCQkweDA0CisKKyNkZWZpbmUgWFRfU0NUUF9WQUxJRF9GTEFHUwkJMHgwNworCisjZGVmaW5lIEVMRU1DT1VOVCh4KSAoc2l6ZW9mKHgpL3NpemVvZih4WzBdKSkKKworCitzdHJ1Y3QgeHRfc2N0cF9mbGFnX2luZm8geworCXVfaW50OF90IGNodW5rdHlwZTsKKwl1X2ludDhfdCBmbGFnOworCXVfaW50OF90IGZsYWdfbWFzazsKK307CisKKyNkZWZpbmUgWFRfTlVNX1NDVFBfRkxBR1MJNAorCitzdHJ1Y3QgeHRfc2N0cF9pbmZvIHsKKwl1X2ludDE2X3QgZHB0c1syXTsgIC8qIE1pbiwgTWF4ICovCisJdV9pbnQxNl90IHNwdHNbMl07ICAvKiBNaW4sIE1heCAqLworCisJdV9pbnQzMl90IGNodW5rbWFwWzI1NiAvIHNpemVvZiAodV9pbnQzMl90KV07ICAvKiBCaXQgbWFzayBvZiBjaHVua3MgdG8gYmUgbWF0Y2hlZCBhY2NvcmRpbmcgdG8gUkZDIDI5NjAgKi8KKworI2RlZmluZSBTQ1RQX0NIVU5LX01BVENIX0FOWSAgIDB4MDEgIC8qIE1hdGNoIGlmIGFueSBvZiB0aGUgY2h1bmsgdHlwZXMgYXJlIHByZXNlbnQgKi8KKyNkZWZpbmUgU0NUUF9DSFVOS19NQVRDSF9BTEwgICAweDAyICAvKiBNYXRjaCBpZiBhbGwgb2YgdGhlIGNodW5rIHR5cGVzIGFyZSBwcmVzZW50ICovCisjZGVmaW5lIFNDVFBfQ0hVTktfTUFUQ0hfT05MWSAgMHgwNCAgLyogTWF0Y2ggaWYgdGhlc2UgYXJlIHRoZSBvbmx5IGNodW5rIHR5cGVzIHByZXNlbnQgKi8KKworCXVfaW50MzJfdCBjaHVua19tYXRjaF90eXBlOworCXN0cnVjdCB4dF9zY3RwX2ZsYWdfaW5mbyBmbGFnX2luZm9bWFRfTlVNX1NDVFBfRkxBR1NdOworCWludCBmbGFnX2NvdW50OworCisJdV9pbnQzMl90IGZsYWdzOworCXVfaW50MzJfdCBpbnZmbGFnczsKK307CisKKyNkZWZpbmUgYnl0ZXModHlwZSkgKHNpemVvZih0eXBlKSAqIDgpCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9TRVQoY2h1bmttYXAsIHR5cGUpIAkJXAorCWRvIHsgCQkJCQkJXAorCQljaHVua21hcFt0eXBlIC8gYnl0ZXModV9pbnQzMl90KV0gfD0gCVwKKwkJCTEgPDwgKHR5cGUgJSBieXRlcyh1X2ludDMyX3QpKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9DTEVBUihjaHVua21hcCwgdHlwZSkJCSAJXAorCWRvIHsJCQkJCQkJXAorCQljaHVua21hcFt0eXBlIC8gYnl0ZXModV9pbnQzMl90KV0gJj0gCQlcCisJCQl+KDEgPDwgKHR5cGUgJSBieXRlcyh1X2ludDMyX3QpKSk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFNDVFBfQ0hVTktNQVBfSVNfU0VUKGNodW5rbWFwLCB0eXBlKSAJCQlcCisoewkJCQkJCQkJXAorCShjaHVua21hcFt0eXBlIC8gYnl0ZXMgKHVfaW50MzJfdCldICYgCQkJXAorCQkoMSA8PCAodHlwZSAlIGJ5dGVzICh1X2ludDMyX3QpKSkpID8gMTogMDsJXAorfSkKKworI2RlZmluZSBTQ1RQX0NIVU5LTUFQX1JFU0VUKGNodW5rbWFwKSAJCQkJXAorCWRvIHsJCQkJCQkJXAorCQlpbnQgaTsgCQkJCQkJXAorCQlmb3IgKGkgPSAwOyBpIDwgRUxFTUNPVU5UKGNodW5rbWFwKTsgaSsrKQlcCisJCQljaHVua21hcFtpXSA9IDA7CQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9TRVRfQUxMKGNodW5rbWFwKSAJCQlcCisJZG8gewkJCQkJCQlcCisJCWludCBpOyAJCQkJCQlcCisJCWZvciAoaSA9IDA7IGkgPCBFTEVNQ09VTlQoY2h1bmttYXApOyBpKyspIAlcCisJCQljaHVua21hcFtpXSA9IH4wOwkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFNDVFBfQ0hVTktNQVBfQ09QWShkZXN0bWFwLCBzcmNtYXApIAkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJaW50IGk7IAkJCQkJCVwKKwkJZm9yIChpID0gMDsgaSA8IEVMRU1DT1VOVChjaHVua21hcCk7IGkrKykgCVwKKwkJCWRlc3RtYXBbaV0gPSBzcmNtYXBbaV07CQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9JU19DTEVBUihjaHVua21hcCkgCQlcCisoewkJCQkJCQlcCisJaW50IGk7IAkJCQkJCVwKKwlpbnQgZmxhZyA9IDE7CQkJCQlcCisJZm9yIChpID0gMDsgaSA8IEVMRU1DT1VOVChjaHVua21hcCk7IGkrKykgewlcCisJCWlmIChjaHVua21hcFtpXSkgewkJCVwKKwkJCWZsYWcgPSAwOwkJCVwKKwkJCWJyZWFrOwkJCQlcCisJCX0JCQkJCVwKKwl9CQkJCQkJXAorICAgICAgICBmbGFnOwkJCQkJCVwKK30pCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9JU19BTExfU0VUKGNodW5rbWFwKSAJCVwKKyh7CQkJCQkJCVwKKwlpbnQgaTsgCQkJCQkJXAorCWludCBmbGFnID0gMTsJCQkJCVwKKwlmb3IgKGkgPSAwOyBpIDwgRUxFTUNPVU5UKGNodW5rbWFwKTsgaSsrKSB7CVwKKwkJaWYgKGNodW5rbWFwW2ldICE9IH4wKSB7CQlcCisJCQlmbGFnID0gMDsJCQlcCisJCQkJYnJlYWs7CQkJXAorCQl9CQkJCQlcCisJfQkJCQkJCVwKKyAgICAgICAgZmxhZzsJCQkJCQlcCit9KQorCisjZW5kaWYgLyogX1hUX1NDVFBfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc3RhdGUuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3N0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA2ZjMyZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3N0YXRlLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfWFRfU1RBVEVfSAorI2RlZmluZSBfWFRfU1RBVEVfSAorCisjZGVmaW5lIFhUX1NUQVRFX0JJVChjdGluZm8pICgxIDw8ICgoY3RpbmZvKSVJUF9DVF9JU19SRVBMWSsxKSkKKyNkZWZpbmUgWFRfU1RBVEVfSU5WQUxJRCAoMSA8PCAwKQorCisjZGVmaW5lIFhUX1NUQVRFX1VOVFJBQ0tFRCAoMSA8PCAoSVBfQ1RfTlVNQkVSICsgMSkpCisKK3N0cnVjdCB4dF9zdGF0ZV9pbmZvCit7CisJdW5zaWduZWQgaW50IHN0YXRlbWFzazsKK307CisjZW5kaWYgLypfWFRfU1RBVEVfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zdHJpbmcuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3N0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMzQxOWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zdHJpbmcuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9YVF9TVFJJTkdfSAorI2RlZmluZSBfWFRfU1RSSU5HX0gKKworI2RlZmluZSBYVF9TVFJJTkdfTUFYX1BBVFRFUk5fU0laRSAxMjgKKyNkZWZpbmUgWFRfU1RSSU5HX01BWF9BTEdPX05BTUVfU0laRSAxNgorCitzdHJ1Y3QgeHRfc3RyaW5nX2luZm8KK3sKKwl1X2ludDE2X3QgZnJvbV9vZmZzZXQ7CisJdV9pbnQxNl90IHRvX29mZnNldDsKKwljaGFyCSAgYWxnb1tYVF9TVFJJTkdfTUFYX0FMR09fTkFNRV9TSVpFXTsKKwljaGFyIAkgIHBhdHRlcm5bWFRfU1RSSU5HX01BWF9QQVRURVJOX1NJWkVdOworCXVfaW50OF90ICBwYXRsZW47CisJdV9pbnQ4X3QgIGludmVydDsKKwlzdHJ1Y3QgdHNfY29uZmlnIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKSAqY29uZmlnOworfTsKKworI2VuZGlmIC8qX1hUX1NUUklOR19IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3RjcG1zcy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfdGNwbXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAzMjc0YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3RjcG1zcy5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfWFRfVENQTVNTX01BVENIX0gKKyNkZWZpbmUgX1hUX1RDUE1TU19NQVRDSF9ICisKK3N0cnVjdCB4dF90Y3Btc3NfbWF0Y2hfaW5mbyB7CisgICAgdV9pbnQxNl90IG1zc19taW4sIG1zc19tYXg7CisgICAgdV9pbnQ4X3QgaW52ZXJ0OworfTsKKworI2VuZGlmIC8qX1hUX1RDUE1TU19NQVRDSF9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3RjcHVkcC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfdGNwdWRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhiYzY1ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3RjcHVkcC5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgX1hUX1RDUFVEUF9ICisjZGVmaW5lIF9YVF9UQ1BVRFBfSAorCisvKiBUQ1AgbWF0Y2hpbmcgc3R1ZmYgKi8KK3N0cnVjdCB4dF90Y3AKK3sKKwl1X2ludDE2X3Qgc3B0c1syXTsJCQkvKiBTb3VyY2UgcG9ydCByYW5nZS4gKi8KKwl1X2ludDE2X3QgZHB0c1syXTsJCQkvKiBEZXN0aW5hdGlvbiBwb3J0IHJhbmdlLiAqLworCXVfaW50OF90IG9wdGlvbjsJCQkvKiBUQ1AgT3B0aW9uIGlmZiBub24temVybyovCisJdV9pbnQ4X3QgZmxnX21hc2s7CQkJLyogVENQIGZsYWdzIG1hc2sgYnl0ZSAqLworCXVfaW50OF90IGZsZ19jbXA7CQkJLyogVENQIGZsYWdzIGNvbXBhcmUgYnl0ZSAqLworCXVfaW50OF90IGludmZsYWdzOwkJCS8qIEludmVyc2UgZmxhZ3MgKi8KK307CisKKy8qIFZhbHVlcyBmb3IgImludiIgZmllbGQgaW4gc3RydWN0IGlwdF90Y3AuICovCisjZGVmaW5lIFhUX1RDUF9JTlZfU1JDUFQJMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIHNvdXJjZSBwb3J0cy4gKi8KKyNkZWZpbmUgWFRfVENQX0lOVl9EU1RQVAkweDAyCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgZGVzdCBwb3J0cy4gKi8KKyNkZWZpbmUgWFRfVENQX0lOVl9GTEFHUwkweDA0CS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgVENQIGZsYWdzLiAqLworI2RlZmluZSBYVF9UQ1BfSU5WX09QVElPTgkweDA4CS8qIEludmVydCB0aGUgc2Vuc2Ugb2Ygb3B0aW9uIHRlc3QuICovCisjZGVmaW5lIFhUX1RDUF9JTlZfTUFTSwkJMHgwRgkvKiBBbGwgcG9zc2libGUgZmxhZ3MuICovCisKKy8qIFVEUCBtYXRjaGluZyBzdHVmZiAqLworc3RydWN0IHh0X3VkcAoreworCXVfaW50MTZfdCBzcHRzWzJdOwkJCS8qIFNvdXJjZSBwb3J0IHJhbmdlLiAqLworCXVfaW50MTZfdCBkcHRzWzJdOwkJCS8qIERlc3RpbmF0aW9uIHBvcnQgcmFuZ2UuICovCisJdV9pbnQ4X3QgaW52ZmxhZ3M7CQkJLyogSW52ZXJzZSBmbGFncyAqLworfTsKKworLyogVmFsdWVzIGZvciAiaW52ZmxhZ3MiIGZpZWxkIGluIHN0cnVjdCBpcHRfdWRwLiAqLworI2RlZmluZSBYVF9VRFBfSU5WX1NSQ1BUCTB4MDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBzb3VyY2UgcG9ydHMuICovCisjZGVmaW5lIFhUX1VEUF9JTlZfRFNUUFQJMHgwMgkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIGRlc3QgcG9ydHMuICovCisjZGVmaW5lIFhUX1VEUF9JTlZfTUFTSwkweDAzCS8qIEFsbCBwb3NzaWJsZSBmbGFncy4gKi8KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2FycC9hcnBfdGFibGVzLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9hcnAvYXJwX3RhYmxlcy5oCmluZGV4IGU5OGE4NzAuLmZkMjE3OTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2FycC9hcnBfdGFibGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYXJwL2FycF90YWJsZXMuaApAQCAtMTksOCArMTksMTIgQEAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9hcnAuaD4KIAotI2RlZmluZSBBUlBUX0ZVTkNUSU9OX01BWE5BTUVMRU4gMzAKLSNkZWZpbmUgQVJQVF9UQUJMRV9NQVhOQU1FTEVOIDMyCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisKKyNkZWZpbmUgQVJQVF9GVU5DVElPTl9NQVhOQU1FTEVOIFhUX0ZVTkNUSU9OX01BWE5BTUVMRU4KKyNkZWZpbmUgQVJQVF9UQUJMRV9NQVhOQU1FTEVOIFhUX1RBQkxFX01BWE5BTUVMRU4KKyNkZWZpbmUgYXJwdF90YXJnZXQgeHRfdGFyZ2V0CisjZGVmaW5lIGFycHRfdGFibGUgeHRfdGFibGUKIAogI2RlZmluZSBBUlBUX0RFVl9BRERSX0xFTl9NQVggMTYKIApAQCAtOTEsMTEgKzk1LDYgQEAKIAlpbnQgdmVyZGljdDsKIH07CiAKLXN0cnVjdCBhcnB0X2NvdW50ZXJzCi17Ci0JdV9pbnQ2NF90IHBjbnQsIGJjbnQ7CQkJLyogUGFja2V0IGFuZCBieXRlIGNvdW50ZXJzICovCi19OwotCiAvKiBWYWx1ZXMgZm9yICJmbGFnIiBmaWVsZCBpbiBzdHJ1Y3QgYXJwdF9pcCAoZ2VuZXJhbCBhcnAgc3RydWN0dXJlKS4KICAqIE5vIGZsYWdzIGRlZmluZWQgeWV0LgogICovCkBAIC0xMzAsNyArMTI5LDcgQEAKIAl1bnNpZ25lZCBpbnQgY29tZWZyb207CiAKIAkvKiBQYWNrZXQgYW5kIGJ5dGUgY291bnRlcnMuICovCi0Jc3RydWN0IGFycHRfY291bnRlcnMgY291bnRlcnM7CisJc3RydWN0IHh0X2NvdW50ZXJzIGNvdW50ZXJzOwogCiAJLyogVGhlIG1hdGNoZXMgKGlmIGFueSksIHRoZW4gdGhlIHRhcmdldC4gKi8KIAl1bnNpZ25lZCBjaGFyIGVsZW1zWzBdOwpAQCAtMTQxLDIzICsxNDAsMjQgQEAKICAqIFVubGlrZSBCU0QgTGludXggaW5oZXJpdHMgSVAgb3B0aW9ucyBzbyB5b3UgZG9uJ3QgaGF2ZSB0byB1c2UgYSByYXcKICAqIHNvY2tldCBmb3IgdGhpcy4gSW5zdGVhZCB3ZSBjaGVjayByaWdodHMgaW4gdGhlIGNhbGxzLgogICovCi0jZGVmaW5lIEFSUFRfQkFTRV9DVEwJCTk2CS8qIGJhc2UgZm9yIGZpcmV3YWxsIHNvY2tldCBvcHRpb25zICovCisjZGVmaW5lIEFSUFRfQ1RMX09GRlNFVAkJMzIKKyNkZWZpbmUgQVJQVF9CQVNFX0NUTAkJKFhUX0JBU0VfQ1RMK0FSUFRfQ1RMX09GRlNFVCkKIAotI2RlZmluZSBBUlBUX1NPX1NFVF9SRVBMQUNFCQkoQVJQVF9CQVNFX0NUTCkKLSNkZWZpbmUgQVJQVF9TT19TRVRfQUREX0NPVU5URVJTCShBUlBUX0JBU0VfQ1RMICsgMSkKLSNkZWZpbmUgQVJQVF9TT19TRVRfTUFYCQkJQVJQVF9TT19TRVRfQUREX0NPVU5URVJTCisjZGVmaW5lIEFSUFRfU09fU0VUX1JFUExBQ0UJCShYVF9TT19TRVRfUkVQTEFDRStBUlBUX0NUTF9PRkZTRVQpCisjZGVmaW5lIEFSUFRfU09fU0VUX0FERF9DT1VOVEVSUwkoWFRfU09fU0VUX0FERF9DT1VOVEVSUytBUlBUX0NUTF9PRkZTRVQpCisjZGVmaW5lIEFSUFRfU09fU0VUX01BWAkJCShYVF9TT19TRVRfTUFYK0FSUFRfQ1RMX09GRlNFVCkKIAotI2RlZmluZSBBUlBUX1NPX0dFVF9JTkZPCQkoQVJQVF9CQVNFX0NUTCkKLSNkZWZpbmUgQVJQVF9TT19HRVRfRU5UUklFUwkJKEFSUFRfQkFTRV9DVEwgKyAxKQotLyogI2RlZmluZSBBUlBUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAkoQVJQVF9CQVNFX0NUTCArIDIpKi8KLSNkZWZpbmUgQVJQVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCShBUlBUX0JBU0VfQ1RMICsgMykKLSNkZWZpbmUgQVJQVF9TT19HRVRfTUFYCQkJQVJQVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCisjZGVmaW5lIEFSUFRfU09fR0VUX0lORk8JCShYVF9TT19HRVRfSU5GTytBUlBUX0NUTF9PRkZTRVQpCisjZGVmaW5lIEFSUFRfU09fR0VUX0VOVFJJRVMJCShYVF9TT19HRVRfRU5UUklFUytBUlBUX0NUTF9PRkZTRVQpCisvKiAjZGVmaW5lIEFSUFRfU09fR0VUX1JFVklTSU9OX01BVENICVhUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSCAgKi8KKyNkZWZpbmUgQVJQVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCShYVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUK0FSUFRfQ1RMX09GRlNFVCkKKyNkZWZpbmUgQVJQVF9TT19HRVRfTUFYCQkJKFhUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQrQVJQVF9DVExfT0ZGU0VUKQogCiAvKiBDT05USU5VRSB2ZXJkaWN0IGZvciB0YXJnZXRzICovCi0jZGVmaW5lIEFSUFRfQ09OVElOVUUgMHhGRkZGRkZGRgorI2RlZmluZSBBUlBUX0NPTlRJTlVFIFhUX0NPTlRJTlVFCiAKIC8qIEZvciBzdGFuZGFyZCB0YXJnZXQgKi8KLSNkZWZpbmUgQVJQVF9SRVRVUk4gKC1ORl9SRVBFQVQgLSAxKQorI2RlZmluZSBBUlBUX1JFVFVSTiBYVF9SRVRVUk4KIAogLyogVGhlIGFyZ3VtZW50IHRvIEFSUFRfU09fR0VUX0lORk8gKi8KIHN0cnVjdCBhcnB0X2dldGluZm8KQEAgLTIwOCwyMyArMjA4LDE0IEBACiAJLyogTnVtYmVyIG9mIGNvdW50ZXJzIChtdXN0IGJlIGVxdWFsIHRvIGN1cnJlbnQgbnVtYmVyIG9mIGVudHJpZXMpLiAqLwogCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7CiAJLyogVGhlIG9sZCBlbnRyaWVzJyBjb3VudGVycy4gKi8KLQlzdHJ1Y3QgYXJwdF9jb3VudGVycyBfX3VzZXIgKmNvdW50ZXJzOworCXN0cnVjdCB4dF9jb3VudGVycyBfX3VzZXIgKmNvdW50ZXJzOwogCiAJLyogVGhlIGVudHJpZXMgKGhhbmcgb2ZmIGVuZDogbm90IHJlYWxseSBhbiBhcnJheSkuICovCiAJc3RydWN0IGFycHRfZW50cnkgZW50cmllc1swXTsKIH07CiAKIC8qIFRoZSBhcmd1bWVudCB0byBBUlBUX1NPX0FERF9DT1VOVEVSUy4gKi8KLXN0cnVjdCBhcnB0X2NvdW50ZXJzX2luZm8KLXsKLQkvKiBXaGljaCB0YWJsZS4gKi8KLQljaGFyIG5hbWVbQVJQVF9UQUJMRV9NQVhOQU1FTEVOXTsKLQotCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7Ci0KLQkvKiBUaGUgY291bnRlcnMgKGFjdHVhbGx5IGBudW1iZXInIG9mIHRoZXNlKS4gKi8KLQlzdHJ1Y3QgYXJwdF9jb3VudGVycyBjb3VudGVyc1swXTsKLX07CisjZGVmaW5lIGFycHRfY291bnRlcnNfaW5mbyB4dF9jb3VudGVyc19pbmZvCiAKIC8qIFRoZSBhcmd1bWVudCB0byBBUlBUX1NPX0dFVF9FTlRSSUVTLiAqLwogc3RydWN0IGFycHRfZ2V0X2VudHJpZXMKQEAgLTIzOSwxOSArMjMwLDEwIEBACiAJc3RydWN0IGFycHRfZW50cnkgZW50cnl0YWJsZVswXTsKIH07CiAKLS8qIFRoZSBhcmd1bWVudCB0byBBUlBUX1NPX0dFVF9SRVZJU0lPTl8qLiAgUmV0dXJucyBoaWdoZXN0IHJldmlzaW9uCi0gKiBrZXJuZWwgc3VwcG9ydHMsIGlmID49IHJldmlzaW9uLiAqLwotc3RydWN0IGFycHRfZ2V0X3JldmlzaW9uCi17Ci0JY2hhciBuYW1lW0FSUFRfRlVOQ1RJT05fTUFYTkFNRUxFTi0xXTsKLQotCXVfaW50OF90IHJldmlzaW9uOwotfTsKLQogLyogU3RhbmRhcmQgcmV0dXJuIHZlcmRpY3QsIG9yIGRvIGp1bXAuICovCi0jZGVmaW5lIEFSUFRfU1RBTkRBUkRfVEFSR0VUICIiCisjZGVmaW5lIEFSUFRfU1RBTkRBUkRfVEFSR0VUIFhUX1NUQU5EQVJEX1RBUkdFVAogLyogRXJyb3IgdmVyZGljdC4gKi8KLSNkZWZpbmUgQVJQVF9FUlJPUl9UQVJHRVQgIkVSUk9SIgorI2RlZmluZSBBUlBUX0VSUk9SX1RBUkdFVCBYVF9FUlJPUl9UQVJHRVQKIAogLyogSGVscGVyIGZ1bmN0aW9ucyAqLwogc3RhdGljIF9faW5saW5lX18gc3RydWN0IGFycHRfZW50cnlfdGFyZ2V0ICphcnB0X2dldF90YXJnZXQoc3RydWN0IGFycHRfZW50cnkgKmUpCkBAIC0yODEsNjMgKzI2Myw4IEBACiAgKi8KICNpZmRlZiBfX0tFUk5FTF9fCiAKLS8qIFJlZ2lzdHJhdGlvbiBob29rcyBmb3IgdGFyZ2V0cy4gKi8KLXN0cnVjdCBhcnB0X3RhcmdldAotewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCWNvbnN0IGNoYXIgbmFtZVtBUlBUX0ZVTkNUSU9OX01BWE5BTUVMRU4tMV07Ci0KLQl1X2ludDhfdCByZXZpc2lvbjsKLQotCS8qIFJldHVybnMgdmVyZGljdC4gKi8KLQl1bnNpZ25lZCBpbnQgKCp0YXJnZXQpKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCSAgICAgICBjb25zdCB2b2lkICp0YXJnaW5mbywKLQkJCSAgICAgICB2b2lkICp1c2VyZGF0YSk7Ci0KLQkvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGU6Ci0gICAgICAgICAgIGhvb2tfbWFzayBpcyBhIGJpdG1hc2sgb2YgaG9va3MgZnJvbSB3aGljaCBpdCBjYW4gYmUKLSAgICAgICAgICAgY2FsbGVkLiAqLwotCS8qIFNob3VsZCByZXR1cm4gdHJ1ZSBvciBmYWxzZS4gKi8KLQlpbnQgKCpjaGVja2VudHJ5KShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCQkgIGNvbnN0IHN0cnVjdCBhcnB0X2VudHJ5ICplLAotCQkJICB2b2lkICp0YXJnaW5mbywKLQkJCSAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKLQkJCSAgdW5zaWduZWQgaW50IGhvb2tfbWFzayk7Ci0KLQkvKiBDYWxsZWQgd2hlbiBlbnRyeSBvZiB0aGlzIHR5cGUgZGVsZXRlZC4gKi8KLQl2b2lkICgqZGVzdHJveSkodm9pZCAqdGFyZ2luZm8sIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUpOwotCi0JLyogU2V0IHRoaXMgdG8gVEhJU19NT0RVTEUgaWYgeW91IGFyZSBhIG1vZHVsZSwgb3RoZXJ3aXNlIE5VTEwgKi8KLQlzdHJ1Y3QgbW9kdWxlICptZTsKLX07Ci0KLWV4dGVybiBpbnQgYXJwdF9yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGFycHRfdGFyZ2V0ICp0YXJnZXQpOwotZXh0ZXJuIHZvaWQgYXJwdF91bnJlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgYXJwdF90YXJnZXQgKnRhcmdldCk7Ci0KLS8qIEZ1cm5pdHVyZSBzaG9wcGluZy4uLiAqLwotc3RydWN0IGFycHRfdGFibGUKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0KLQkvKiBBIHVuaXF1ZSBuYW1lLi4uICovCi0JY2hhciBuYW1lW0FSUFRfVEFCTEVfTUFYTkFNRUxFTl07Ci0KLQkvKiBXaGF0IGhvb2tzIHlvdSB3aWxsIGVudGVyIG9uICovCi0JdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzOwotCi0JLyogTG9jayBmb3IgdGhlIGN1cnRhaW4gKi8KLQlyd2xvY2tfdCBsb2NrOwotCi0JLyogTWFuIGJlaGluZCB0aGUgY3VydGFpbi4uLiAqLwotCXN0cnVjdCBhcnB0X3RhYmxlX2luZm8gKnByaXZhdGU7Ci0KLQkvKiBTZXQgdGhpcyB0byBUSElTX01PRFVMRSBpZiB5b3UgYXJlIGEgbW9kdWxlLCBvdGhlcndpc2UgTlVMTCAqLwotCXN0cnVjdCBtb2R1bGUgKm1lOwotfTsKKyNkZWZpbmUgYXJwdF9yZWdpc3Rlcl90YXJnZXQodGd0KSB4dF9yZWdpc3Rlcl90YXJnZXQoTkZfQVJQLCB0Z3QpCisjZGVmaW5lIGFycHRfdW5yZWdpc3Rlcl90YXJnZXQodGd0KSB4dF91bnJlZ2lzdGVyX3RhcmdldChORl9BUlAsIHRndCkKIAogZXh0ZXJuIGludCBhcnB0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCBhcnB0X3RhYmxlICp0YWJsZSwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYXJwdF9yZXBsYWNlICpyZXBsKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oCmluZGV4IGIzNDMyYWIuLjIxNTc2NWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaApAQCAtMTk5LDkgKzE5OSw2IEBACiAJbmZfY29ubnRyYWNrX3B1dCgmY3QtPmN0X2dlbmVyYWwpOwogfQogCi0vKiBjYWxsIHRvIGNyZWF0ZSBhbiBleHBsaWNpdCBkZXBlbmRlbmN5IG9uIGlwX2Nvbm50cmFjay4gKi8KLWV4dGVybiB2b2lkIG5lZWRfaXBfY29ubnRyYWNrKHZvaWQpOwotCiBleHRlcm4gaW50IGludmVydF90dXBsZXByKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKmludmVyc2UsCiAJCQkgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKm9yaWcpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9wcm90b2NvbC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcHJvdG9jb2wuaAppbmRleCBlZjYzYWE5Li42MTJhNDM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9wcm90b2NvbC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3Byb3RvY29sLmgKQEAgLTQyLDEzICs0Miw2IEBACiAJCQkgICAgZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUsCiAJCQkgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrKTsKIAotCXVuc2lnbmVkIGludCAoKnByaW50KShjaGFyICpidWZmZXIsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICptYXRjaCwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKm1hc2spOwotCi0JdW5zaWduZWQgaW50ICgqcHJpbnRfcmFuZ2UpKGNoYXIgKmJ1ZmZlciwKLQkJCQkgICAgY29uc3Qgc3RydWN0IGlwX25hdF9yYW5nZSAqcmFuZ2UpOwotCiAJaW50ICgqcmFuZ2VfdG9fbmZhdHRyKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmgKaW5kZXggZDE5ZDY1Yy4uNzZiYTI0YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oCkBAIC0yNSw4ICsyNSwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KIAotI2RlZmluZSBJUFRfRlVOQ1RJT05fTUFYTkFNRUxFTiAzMAotI2RlZmluZSBJUFRfVEFCTEVfTUFYTkFNRUxFTiAzMgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorCisjZGVmaW5lIElQVF9GVU5DVElPTl9NQVhOQU1FTEVOIFhUX0ZVTkNUSU9OX01BWE5BTUVMRU4KKyNkZWZpbmUgSVBUX1RBQkxFX01BWE5BTUVMRU4gWFRfRlVOQ1RJT05fTUFYTkFNRUxFTgorI2RlZmluZSBpcHRfbWF0Y2ggeHRfbWF0Y2gKKyNkZWZpbmUgaXB0X3RhcmdldCB4dF90YXJnZXQKKyNkZWZpbmUgaXB0X3RhYmxlIHh0X3RhYmxlCisjZGVmaW5lIGlwdF9nZXRfcmV2aXNpb24geHRfZ2V0X3JldmlzaW9uCiAKIC8qIFllcywgVmlyZ2luaWEsIHlvdSBoYXZlIHRvIHplcm8gdGhlIHBhZGRpbmcuICovCiBzdHJ1Y3QgaXB0X2lwIHsKQEAgLTEwMiwxMCArMTA4LDcgQEAKIAlpbnQgdmVyZGljdDsKIH07CiAKLXN0cnVjdCBpcHRfY291bnRlcnMKLXsKLQl1X2ludDY0X3QgcGNudCwgYmNudDsJCQkvKiBQYWNrZXQgYW5kIGJ5dGUgY291bnRlcnMgKi8KLX07CisjZGVmaW5lIGlwdF9jb3VudGVycyB4dF9jb3VudGVycwogCiAvKiBWYWx1ZXMgZm9yICJmbGFnIiBmaWVsZCBpbiBzdHJ1Y3QgaXB0X2lwIChnZW5lcmFsIGlwIHN0cnVjdHVyZSkuICovCiAjZGVmaW5lIElQVF9GX0ZSQUcJCTB4MDEJLyogU2V0IGlmIHJ1bGUgaXMgYSBmcmFnbWVudCBydWxlICovCkBAIC0xMTksNyArMTIyLDcgQEAKICNkZWZpbmUgSVBUX0lOVl9TUkNJUAkJMHgwOAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIFNSQyBJUC4gKi8KICNkZWZpbmUgSVBUX0lOVl9EU1RJUAkJMHgxMAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIERTVCBPUC4gKi8KICNkZWZpbmUgSVBUX0lOVl9GUkFHCQkweDIwCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgRlJBRy4gKi8KLSNkZWZpbmUgSVBUX0lOVl9QUk9UTwkJMHg0MAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIFBST1RPLiAqLworI2RlZmluZSBJUFRfSU5WX1BST1RPCQlYVF9JTlZfUFJPVE8KICNkZWZpbmUgSVBUX0lOVl9NQVNLCQkweDdGCS8qIEFsbCBwb3NzaWJsZSBmbGFnIGJpdHMgbWFzay4gKi8KIAogLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBlYWNoIG9mIHRoZSBmaXJld2FsbCBydWxlcy4gIENvbnNpc3RzIG9mIDMKQEAgLTE0MSw3ICsxNDQsNyBAQAogCXVuc2lnbmVkIGludCBjb21lZnJvbTsKIAogCS8qIFBhY2tldCBhbmQgYnl0ZSBjb3VudGVycy4gKi8KLQlzdHJ1Y3QgaXB0X2NvdW50ZXJzIGNvdW50ZXJzOworCXN0cnVjdCB4dF9jb3VudGVycyBjb3VudGVyczsKIAogCS8qIFRoZSBtYXRjaGVzIChpZiBhbnkpLCB0aGVuIHRoZSB0YXJnZXQuICovCiAJdW5zaWduZWQgY2hhciBlbGVtc1swXTsKQEAgLTE1MSw1NCArMTU0LDM0IEBACiAgKiBOZXcgSVAgZmlyZXdhbGwgb3B0aW9ucyBmb3IgW2dzXWV0c29ja29wdCBhdCB0aGUgUkFXIElQIGxldmVsLgogICogVW5saWtlIEJTRCBMaW51eCBpbmhlcml0cyBJUCBvcHRpb25zIHNvIHlvdSBkb24ndCBoYXZlIHRvIHVzZSBhIHJhdwogICogc29ja2V0IGZvciB0aGlzLiBJbnN0ZWFkIHdlIGNoZWNrIHJpZ2h0cyBpbiB0aGUgY2FsbHMuICovCi0jZGVmaW5lIElQVF9CQVNFX0NUTAkJNjQJLyogYmFzZSBmb3IgZmlyZXdhbGwgc29ja2V0IG9wdGlvbnMgKi8KKyNkZWZpbmUgSVBUX0JBU0VfQ1RMCQlYVF9CQVNFX0NUTAogCi0jZGVmaW5lIElQVF9TT19TRVRfUkVQTEFDRQkoSVBUX0JBU0VfQ1RMKQotI2RlZmluZSBJUFRfU09fU0VUX0FERF9DT1VOVEVSUwkoSVBUX0JBU0VfQ1RMICsgMSkKLSNkZWZpbmUgSVBUX1NPX1NFVF9NQVgJCUlQVF9TT19TRVRfQUREX0NPVU5URVJTCisjZGVmaW5lIElQVF9TT19TRVRfUkVQTEFDRQlYVF9TT19TRVRfUkVQTEFDRQorI2RlZmluZSBJUFRfU09fU0VUX0FERF9DT1VOVEVSUwlYVF9TT19TRVRfQUREX0NPVU5URVJTCisjZGVmaW5lIElQVF9TT19TRVRfTUFYCQlYVF9TT19TRVRfTUFYCiAKLSNkZWZpbmUgSVBUX1NPX0dFVF9JTkZPCQkJKElQVF9CQVNFX0NUTCkKLSNkZWZpbmUgSVBUX1NPX0dFVF9FTlRSSUVTCQkoSVBUX0JBU0VfQ1RMICsgMSkKLSNkZWZpbmUgSVBUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAkoSVBUX0JBU0VfQ1RMICsgMikKLSNkZWZpbmUgSVBUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQJKElQVF9CQVNFX0NUTCArIDMpCi0jZGVmaW5lIElQVF9TT19HRVRfTUFYCQkJSVBUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQKKyNkZWZpbmUgSVBUX1NPX0dFVF9JTkZPCQkJWFRfU09fR0VUX0lORk8KKyNkZWZpbmUgSVBUX1NPX0dFVF9FTlRSSUVTCQlYVF9TT19HRVRfRU5UUklFUworI2RlZmluZSBJUFRfU09fR0VUX1JFVklTSU9OX01BVENICVhUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAorI2RlZmluZSBJUFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAlYVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCisjZGVmaW5lIElQVF9TT19HRVRfTUFYCQkJWFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAogCi0vKiBDT05USU5VRSB2ZXJkaWN0IGZvciB0YXJnZXRzICovCi0jZGVmaW5lIElQVF9DT05USU5VRSAweEZGRkZGRkZGCisjZGVmaW5lIElQVF9DT05USU5VRSBYVF9DT05USU5VRQorI2RlZmluZSBJUFRfUkVUVVJOIFhUX1JFVFVSTgogCi0vKiBGb3Igc3RhbmRhcmQgdGFyZ2V0ICovCi0jZGVmaW5lIElQVF9SRVRVUk4gKC1ORl9SRVBFQVQgLSAxKQorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF90Y3B1ZHAuaD4KKyNkZWZpbmUgaXB0X3VkcCB4dF91ZHAKKyNkZWZpbmUgaXB0X3RjcCB4dF90Y3AKIAotLyogVENQIG1hdGNoaW5nIHN0dWZmICovCi1zdHJ1Y3QgaXB0X3RjcAotewotCXVfaW50MTZfdCBzcHRzWzJdOwkJCS8qIFNvdXJjZSBwb3J0IHJhbmdlLiAqLwotCXVfaW50MTZfdCBkcHRzWzJdOwkJCS8qIERlc3RpbmF0aW9uIHBvcnQgcmFuZ2UuICovCi0JdV9pbnQ4X3Qgb3B0aW9uOwkJCS8qIFRDUCBPcHRpb24gaWZmIG5vbi16ZXJvKi8KLQl1X2ludDhfdCBmbGdfbWFzazsJCQkvKiBUQ1AgZmxhZ3MgbWFzayBieXRlICovCi0JdV9pbnQ4X3QgZmxnX2NtcDsJCQkvKiBUQ1AgZmxhZ3MgY29tcGFyZSBieXRlICovCi0JdV9pbnQ4X3QgaW52ZmxhZ3M7CQkJLyogSW52ZXJzZSBmbGFncyAqLwotfTsKKyNkZWZpbmUgSVBUX1RDUF9JTlZfU1JDUFQJWFRfVENQX0lOVl9TUkNQVAorI2RlZmluZSBJUFRfVENQX0lOVl9EU1RQVAlYVF9UQ1BfSU5WX0RTVFBUCisjZGVmaW5lIElQVF9UQ1BfSU5WX0ZMQUdTCVhUX1RDUF9JTlZfRkxBR1MKKyNkZWZpbmUgSVBUX1RDUF9JTlZfT1BUSU9OCVhUX1RDUF9JTlZfT1BUSU9OCisjZGVmaW5lIElQVF9UQ1BfSU5WX01BU0sJWFRfVENQX0lOVl9NQVNLCiAKLS8qIFZhbHVlcyBmb3IgImludiIgZmllbGQgaW4gc3RydWN0IGlwdF90Y3AuICovCi0jZGVmaW5lIElQVF9UQ1BfSU5WX1NSQ1BUCTB4MDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBzb3VyY2UgcG9ydHMuICovCi0jZGVmaW5lIElQVF9UQ1BfSU5WX0RTVFBUCTB4MDIJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBkZXN0IHBvcnRzLiAqLwotI2RlZmluZSBJUFRfVENQX0lOVl9GTEFHUwkweDA0CS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgVENQIGZsYWdzLiAqLwotI2RlZmluZSBJUFRfVENQX0lOVl9PUFRJT04JMHgwOAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIG9wdGlvbiB0ZXN0LiAqLwotI2RlZmluZSBJUFRfVENQX0lOVl9NQVNLCTB4MEYJLyogQWxsIHBvc3NpYmxlIGZsYWdzLiAqLwotCi0vKiBVRFAgbWF0Y2hpbmcgc3R1ZmYgKi8KLXN0cnVjdCBpcHRfdWRwCi17Ci0JdV9pbnQxNl90IHNwdHNbMl07CQkJLyogU291cmNlIHBvcnQgcmFuZ2UuICovCi0JdV9pbnQxNl90IGRwdHNbMl07CQkJLyogRGVzdGluYXRpb24gcG9ydCByYW5nZS4gKi8KLQl1X2ludDhfdCBpbnZmbGFnczsJCQkvKiBJbnZlcnNlIGZsYWdzICovCi19OwotCi0vKiBWYWx1ZXMgZm9yICJpbnZmbGFncyIgZmllbGQgaW4gc3RydWN0IGlwdF91ZHAuICovCi0jZGVmaW5lIElQVF9VRFBfSU5WX1NSQ1BUCTB4MDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBzb3VyY2UgcG9ydHMuICovCi0jZGVmaW5lIElQVF9VRFBfSU5WX0RTVFBUCTB4MDIJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBkZXN0IHBvcnRzLiAqLwotI2RlZmluZSBJUFRfVURQX0lOVl9NQVNLCTB4MDMJLyogQWxsIHBvc3NpYmxlIGZsYWdzLiAqLworI2RlZmluZSBJUFRfVURQX0lOVl9TUkNQVAlYVF9VRFBfSU5WX1NSQ1BUCisjZGVmaW5lIElQVF9VRFBfSU5WX0RTVFBUCVhUX1VEUF9JTlZfRFNUUFQKKyNkZWZpbmUgSVBUX1VEUF9JTlZfTUFTSwlYVF9VRFBfSU5WX01BU0sKIAogLyogSUNNUCBtYXRjaGluZyBzdHVmZiAqLwogc3RydWN0IGlwdF9pY21wCkBAIC0yNjAsMjMgKzI0MywxNCBAQAogCS8qIE51bWJlciBvZiBjb3VudGVycyAobXVzdCBiZSBlcXVhbCB0byBjdXJyZW50IG51bWJlciBvZiBlbnRyaWVzKS4gKi8KIAl1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzOwogCS8qIFRoZSBvbGQgZW50cmllcycgY291bnRlcnMuICovCi0Jc3RydWN0IGlwdF9jb3VudGVycyBfX3VzZXIgKmNvdW50ZXJzOworCXN0cnVjdCB4dF9jb3VudGVycyBfX3VzZXIgKmNvdW50ZXJzOwogCiAJLyogVGhlIGVudHJpZXMgKGhhbmcgb2ZmIGVuZDogbm90IHJlYWxseSBhbiBhcnJheSkuICovCiAJc3RydWN0IGlwdF9lbnRyeSBlbnRyaWVzWzBdOwogfTsKIAogLyogVGhlIGFyZ3VtZW50IHRvIElQVF9TT19BRERfQ09VTlRFUlMuICovCi1zdHJ1Y3QgaXB0X2NvdW50ZXJzX2luZm8KLXsKLQkvKiBXaGljaCB0YWJsZS4gKi8KLQljaGFyIG5hbWVbSVBUX1RBQkxFX01BWE5BTUVMRU5dOwotCi0JdW5zaWduZWQgaW50IG51bV9jb3VudGVyczsKLQotCS8qIFRoZSBjb3VudGVycyAoYWN0dWFsbHkgYG51bWJlcicgb2YgdGhlc2UpLiAqLwotCXN0cnVjdCBpcHRfY291bnRlcnMgY291bnRlcnNbMF07Ci19OworI2RlZmluZSBpcHRfY291bnRlcnNfaW5mbyB4dF9jb3VudGVyc19pbmZvCiAKIC8qIFRoZSBhcmd1bWVudCB0byBJUFRfU09fR0VUX0VOVFJJRVMuICovCiBzdHJ1Y3QgaXB0X2dldF9lbnRyaWVzCkBAIC0yOTEsMTkgKzI2NSwxMCBAQAogCXN0cnVjdCBpcHRfZW50cnkgZW50cnl0YWJsZVswXTsKIH07CiAKLS8qIFRoZSBhcmd1bWVudCB0byBJUFRfU09fR0VUX1JFVklTSU9OXyouICBSZXR1cm5zIGhpZ2hlc3QgcmV2aXNpb24KLSAqIGtlcm5lbCBzdXBwb3J0cywgaWYgPj0gcmV2aXNpb24uICovCi1zdHJ1Y3QgaXB0X2dldF9yZXZpc2lvbgotewotCWNoYXIgbmFtZVtJUFRfRlVOQ1RJT05fTUFYTkFNRUxFTi0xXTsKLQotCXVfaW50OF90IHJldmlzaW9uOwotfTsKLQogLyogU3RhbmRhcmQgcmV0dXJuIHZlcmRpY3QsIG9yIGRvIGp1bXAuICovCi0jZGVmaW5lIElQVF9TVEFOREFSRF9UQVJHRVQgIiIKKyNkZWZpbmUgSVBUX1NUQU5EQVJEX1RBUkdFVCBYVF9TVEFOREFSRF9UQVJHRVQKIC8qIEVycm9yIHZlcmRpY3QuICovCi0jZGVmaW5lIElQVF9FUlJPUl9UQVJHRVQgIkVSUk9SIgorI2RlZmluZSBJUFRfRVJST1JfVEFSR0VUIFhUX0VSUk9SX1RBUkdFVAogCiAvKiBIZWxwZXIgZnVuY3Rpb25zICovCiBzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqCkBAIC0zNTYsMTAzICszMjEsMTggQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiBleHRlcm4gdm9pZCBpcHRfaW5pdCh2b2lkKSBfX2luaXQ7CiAKLXN0cnVjdCBpcHRfbWF0Y2gKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisjZGVmaW5lIGlwdF9yZWdpc3Rlcl90YXJnZXQodGd0KSB4dF9yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgdGd0KQorI2RlZmluZSBpcHRfdW5yZWdpc3Rlcl90YXJnZXQodGd0KSB4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVULCB0Z3QpCiAKLQljb25zdCBjaGFyIG5hbWVbSVBUX0ZVTkNUSU9OX01BWE5BTUVMRU4tMV07CisjZGVmaW5lIGlwdF9yZWdpc3Rlcl9tYXRjaChtdGNoKSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCBtdGNoKQorI2RlZmluZSBpcHRfdW5yZWdpc3Rlcl9tYXRjaChtdGNoKSB4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsIG10Y2gpCiAKLQl1X2ludDhfdCByZXZpc2lvbjsKKy8vI2RlZmluZSBpcHRfcmVnaXN0ZXJfdGFibGUodGJsLCByZXBsKSB4dF9yZWdpc3Rlcl90YWJsZShBRl9JTkVULCB0YmwsIHJlcGwpCisvLyNkZWZpbmUgaXB0X3VucmVnaXN0ZXJfdGFibGUodGJsKSB4dF91bnJlZ2lzdGVyX3RhYmxlKEFGX0lORVQsIHRibCkKIAotCS8qIFJldHVybiB0cnVlIG9yIGZhbHNlOiByZXR1cm4gRkFMU0UgYW5kIHNldCAqaG90ZHJvcCA9IDEgdG8KLSAgICAgICAgICAgZm9yY2UgaW1tZWRpYXRlIHBhY2tldCBkcm9wLiAqLwotCS8qIEFyZ3VtZW50cyBjaGFuZ2VkIHNpbmNlIDIuNCwgYXMgdGhpcyBtdXN0IG5vdyBoYW5kbGUKLSAgICAgICAgICAgbm9uLWxpbmVhciBza2JzLCB1c2luZyBza2JfY29weV9iaXRzIGFuZAotICAgICAgICAgICBza2JfaXBfbWFrZV93cml0YWJsZS4gKi8KLQlpbnQgKCptYXRjaCkoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCi0JCSAgICAgaW50IG9mZnNldCwKLQkJICAgICBpbnQgKmhvdGRyb3ApOwotCi0JLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwotCS8qIFNob3VsZCByZXR1cm4gdHJ1ZSBvciBmYWxzZS4gKi8KLQlpbnQgKCpjaGVja2VudHJ5KShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCQkgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAotCQkJICB2b2lkICptYXRjaGluZm8sCi0JCQkgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAotCQkJICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKTsKLQotCS8qIENhbGxlZCB3aGVuIGVudHJ5IG9mIHRoaXMgdHlwZSBkZWxldGVkLiAqLwotCXZvaWQgKCpkZXN0cm95KSh2b2lkICptYXRjaGluZm8sIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplKTsKLQotCS8qIFNldCB0aGlzIHRvIFRISVNfTU9EVUxFLiAqLwotCXN0cnVjdCBtb2R1bGUgKm1lOwotfTsKLQotLyogUmVnaXN0cmF0aW9uIGhvb2tzIGZvciB0YXJnZXRzLiAqLwotc3RydWN0IGlwdF90YXJnZXQKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0KLQljb25zdCBjaGFyIG5hbWVbSVBUX0ZVTkNUSU9OX01BWE5BTUVMRU4tMV07Ci0KLQl1X2ludDhfdCByZXZpc2lvbjsKLQotCS8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZToKLSAgICAgICAgICAgaG9va19tYXNrIGlzIGEgYml0bWFzayBvZiBob29rcyBmcm9tIHdoaWNoIGl0IGNhbiBiZQotICAgICAgICAgICBjYWxsZWQuICovCi0JLyogU2hvdWxkIHJldHVybiB0cnVlIG9yIGZhbHNlLiAqLwotCWludCAoKmNoZWNrZW50cnkpKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJCSAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKLQkJCSAgdm9pZCAqdGFyZ2luZm8sCi0JCQkgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCi0JCQkgIHVuc2lnbmVkIGludCBob29rX21hc2spOwotCi0JLyogQ2FsbGVkIHdoZW4gZW50cnkgb2YgdGhpcyB0eXBlIGRlbGV0ZWQuICovCi0Jdm9pZCAoKmRlc3Ryb3kpKHZvaWQgKnRhcmdpbmZvLCB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplKTsKLQotCS8qIFJldHVybnMgdmVyZGljdC4gIEFyZ3VtZW50IG9yZGVyIGNoYW5nZWQgc2luY2UgMi40LCBhcyB0aGlzCi0gICAgICAgICAgIG11c3Qgbm93IGhhbmRsZSBub24tbGluZWFyIHNrYnMsIHVzaW5nIHNrYl9jb3B5X2JpdHMgYW5kCi0gICAgICAgICAgIHNrYl9pcF9tYWtlX3dyaXRhYmxlLiAqLwotCXVuc2lnbmVkIGludCAoKnRhcmdldCkoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJICAgICAgIHVuc2lnbmVkIGludCBob29rbnVtLAotCQkJICAgICAgIGNvbnN0IHZvaWQgKnRhcmdpbmZvLAotCQkJICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKLQotCS8qIFNldCB0aGlzIHRvIFRISVNfTU9EVUxFLiAqLwotCXN0cnVjdCBtb2R1bGUgKm1lOwotfTsKLQotZXh0ZXJuIGludCBpcHRfcmVnaXN0ZXJfdGFyZ2V0KHN0cnVjdCBpcHRfdGFyZ2V0ICp0YXJnZXQpOwotZXh0ZXJuIHZvaWQgaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KHN0cnVjdCBpcHRfdGFyZ2V0ICp0YXJnZXQpOwotCi1leHRlcm4gaW50IGlwdF9yZWdpc3Rlcl9tYXRjaChzdHJ1Y3QgaXB0X21hdGNoICptYXRjaCk7Ci1leHRlcm4gdm9pZCBpcHRfdW5yZWdpc3Rlcl9tYXRjaChzdHJ1Y3QgaXB0X21hdGNoICptYXRjaCk7Ci0KLS8qIEZ1cm5pdHVyZSBzaG9wcGluZy4uLiAqLwotc3RydWN0IGlwdF90YWJsZQotewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCS8qIEEgdW5pcXVlIG5hbWUuLi4gKi8KLQljaGFyIG5hbWVbSVBUX1RBQkxFX01BWE5BTUVMRU5dOwotCi0JLyogV2hhdCBob29rcyB5b3Ugd2lsbCBlbnRlciBvbiAqLwotCXVuc2lnbmVkIGludCB2YWxpZF9ob29rczsKLQotCS8qIExvY2sgZm9yIHRoZSBjdXJ0YWluICovCi0Jcndsb2NrX3QgbG9jazsKLQotCS8qIE1hbiBiZWhpbmQgdGhlIGN1cnRhaW4uLi4gKi8KLQlzdHJ1Y3QgaXB0X3RhYmxlX2luZm8gKnByaXZhdGU7Ci0KLQkvKiBTZXQgdG8gVEhJU19NT0RVTEUuICovCi0Jc3RydWN0IG1vZHVsZSAqbWU7Ci19OworZXh0ZXJuIGludCBpcHRfcmVnaXN0ZXJfdGFibGUoc3RydWN0IGlwdF90YWJsZSAqdGFibGUsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgaXB0X3JlcGxhY2UgKnJlcGwpOworZXh0ZXJuIHZvaWQgaXB0X3VucmVnaXN0ZXJfdGFibGUoc3RydWN0IGlwdF90YWJsZSAqdGFibGUpOwogCiAvKiBuZXQvc2NoZWQvaXB0LmM6IEdpbW1lIGFjY2VzcyB0byB5b3VyIHRhcmdldHMhICBHZXRzIHRhcmdldC0+bWUuICovCiBleHRlcm4gc3RydWN0IGlwdF90YXJnZXQgKmlwdF9maW5kX3RhcmdldChjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbik7CkBAIC00NzYsOSArMzU2LDYgQEAKIAlzdHJ1Y3QgaXB0X2Vycm9yX3RhcmdldCB0YXJnZXQ7CiB9OwogCi1leHRlcm4gaW50IGlwdF9yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgaXB0X3RhYmxlICp0YWJsZSwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpcHRfcmVwbGFjZSAqcmVwbCk7Ci1leHRlcm4gdm9pZCBpcHRfdW5yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgaXB0X3RhYmxlICp0YWJsZSk7CiBleHRlcm4gdW5zaWduZWQgaW50IGlwdF9kb190YWJsZShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCiAJCQkJIHVuc2lnbmVkIGludCBob29rLAogCQkJCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCkBAIC00ODYsNiArMzYzLDYgQEAKIAkJCQkgc3RydWN0IGlwdF90YWJsZSAqdGFibGUsCiAJCQkJIHZvaWQgKnVzZXJkYXRhKTsKIAotI2RlZmluZSBJUFRfQUxJR04ocykgKCgocykgKyAoX19hbGlnbm9mX18oc3RydWN0IGlwdF9lbnRyeSktMSkpICYgfihfX2FsaWdub2ZfXyhzdHJ1Y3QgaXB0X2VudHJ5KS0xKSkKKyNkZWZpbmUgSVBUX0FMSUdOKHMpIFhUX0FMSUdOKHMpCiAjZW5kaWYgLypfX0tFUk5FTF9fKi8KICNlbmRpZiAvKiBfSVBUQUJMRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfQ0xBU1NJRlkuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0NMQVNTSUZZLmgKaW5kZXggNzU5NmUzZC4uYTQ2ZDUxMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfQ0xBU1NJRlkuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9DTEFTU0lGWS5oCkBAIC0xLDggKzEsNyBAQAogI2lmbmRlZiBfSVBUX0NMQVNTSUZZX0gKICNkZWZpbmUgX0lQVF9DTEFTU0lGWV9ICiAKLXN0cnVjdCBpcHRfY2xhc3NpZnlfdGFyZ2V0X2luZm8gewotCXVfaW50MzJfdCBwcmlvcml0eTsKLX07CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X0NMQVNTSUZZLmg+CisjZGVmaW5lIGlwdF9jbGFzc2lmeV90YXJnZXRfaW5mbyB4dF9jbGFzc2lmeV90YXJnZXRfaW5mbwogCiAjZW5kaWYgLypfSVBUX0NMQVNTSUZZX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0NPTk5NQVJLLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9DT05OTUFSSy5oCmluZGV4IGQzYzAyNTMuLjllY2ZlZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0NPTk5NQVJLLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfQ09OTk1BUksuaApAQCAtOSwxNyArOSwxMSBAQAogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfQ09OTk1BUksuaD4KKyNkZWZpbmUgSVBUX0NPTk5NQVJLX1NFVAlYVF9DT05OTUFSS19TRVQKKyNkZWZpbmUgSVBUX0NPTk5NQVJLX1NBVkUJWFRfQ09OTk1BUktfU0FWRQorI2RlZmluZQlJUFRfQ09OTk1BUktfUkVTVE9SRQlYVF9DT05OTUFSS19SRVNUT1JFCiAKLWVudW0gewotCUlQVF9DT05OTUFSS19TRVQgPSAwLAotCUlQVF9DT05OTUFSS19TQVZFLAotCUlQVF9DT05OTUFSS19SRVNUT1JFCi19OwotCi1zdHJ1Y3QgaXB0X2Nvbm5tYXJrX3RhcmdldF9pbmZvIHsKLQl1bnNpZ25lZCBsb25nIG1hcms7Ci0JdW5zaWduZWQgbG9uZyBtYXNrOwotCXVfaW50OF90IG1vZGU7Ci19OworI2RlZmluZSBpcHRfY29ubm1hcmtfdGFyZ2V0X2luZm8geHRfY29ubm1hcmtfdGFyZ2V0X2luZm8KIAogI2VuZGlmIC8qX0lQVF9DT05OTUFSS19IX3RhcmdldCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9NQVJLLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9NQVJLLmgKaW5kZXggZjQ3NDg1Ny4uNjk3YTQ4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTUFSSy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X01BUksuaApAQCAtMSwyMCArMSwxOCBAQAogI2lmbmRlZiBfSVBUX01BUktfSF90YXJnZXQKICNkZWZpbmUgX0lQVF9NQVJLX0hfdGFyZ2V0CiAKKy8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBvbGQgdXNlcnNwYWNlICovCisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfTUFSSy5oPgorCiAvKiBWZXJzaW9uIDAgKi8KLXN0cnVjdCBpcHRfbWFya190YXJnZXRfaW5mbyB7Ci0JdW5zaWduZWQgbG9uZyBtYXJrOwotfTsKKyNkZWZpbmUgaXB0X21hcmtfdGFyZ2V0X2luZm8geHRfbWFya190YXJnZXRfaW5mbwogCiAvKiBWZXJzaW9uIDEgKi8KLWVudW0gewotCUlQVF9NQVJLX1NFVD0wLAotCUlQVF9NQVJLX0FORCwKLQlJUFRfTUFSS19PUgotfTsKKyNkZWZpbmUgSVBUX01BUktfU0VUCVhUX01BUktfU0VUCisjZGVmaW5lIElQVF9NQVJLX0FORAlYVF9NQVJLX0FORAorI2RlZmluZQlJUFRfTUFSS19PUglYVF9NQVJLX09SCiAKLXN0cnVjdCBpcHRfbWFya190YXJnZXRfaW5mb192MSB7Ci0JdW5zaWduZWQgbG9uZyBtYXJrOwotCXVfaW50OF90IG1vZGU7Ci19OworI2RlZmluZSBpcHRfbWFya190YXJnZXRfaW5mb192MSB4dF9tYXJrX3RhcmdldF9pbmZvX3YxCisKICNlbmRpZiAvKl9JUFRfTUFSS19IX3RhcmdldCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9ORlFVRVVFLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9ORlFVRVVFLmgKaW5kZXggYjViMjk0My4uOTdhMmE3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTkZRVUVVRS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X05GUVVFVUUuaApAQCAtOCw5ICs4LDkgQEAKICNpZm5kZWYgX0lQVF9ORlFfVEFSR0VUX0gKICNkZWZpbmUgX0lQVF9ORlFfVEFSR0VUX0gKIAotLyogdGFyZ2V0IGluZm8gKi8KLXN0cnVjdCBpcHRfTkZRX2luZm8gewotCXVfaW50MTZfdCBxdWV1ZW51bTsKLX07CisvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3Igb2xkIHVzZXJzcGFjZSAqLworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9ORlFVRVVFLmg+CisKKyNkZWZpbmUgaXB0X05GUV9pbmZvIHh0X05GUV9pbmZvCiAKICNlbmRpZiAvKiBfSVBUX0RTQ1BfVEFSR0VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2NvbW1lbnQuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2NvbW1lbnQuaAppbmRleCA4NWMxMTIzLi5hZTJhZmMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb21tZW50LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29tbWVudC5oCkBAIC0xLDEwICsxLDEwIEBACiAjaWZuZGVmIF9JUFRfQ09NTUVOVF9ICiAjZGVmaW5lIF9JUFRfQ09NTUVOVF9ICiAKLSNkZWZpbmUgSVBUX01BWF9DT01NRU5UX0xFTiAyNTYKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfY29tbWVudC5oPgogCi1zdHJ1Y3QgaXB0X2NvbW1lbnRfaW5mbyB7Ci0JdW5zaWduZWQgY2hhciBjb21tZW50W0lQVF9NQVhfQ09NTUVOVF9MRU5dOwotfTsKKyNkZWZpbmUgSVBUX01BWF9DT01NRU5UX0xFTiBYVF9NQVhfQ09NTUVOVF9MRU4KKworI2RlZmluZSBpcHRfY29tbWVudF9pbmZvIHh0X2NvbW1lbnRfaW5mbwogCiAjZW5kaWYgLyogX0lQVF9DT01NRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2Nvbm5ieXRlcy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29ubmJ5dGVzLmgKaW5kZXggOWU1NTMyZi4uYjA0ZGZhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29ubmJ5dGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29ubmJ5dGVzLmgKQEAgLTEsMjUgKzEsMTggQEAKICNpZm5kZWYgX0lQVF9DT05OQllURVNfSAogI2RlZmluZSBfSVBUX0NPTk5CWVRFU19ICiAKLWVudW0gaXB0X2Nvbm5ieXRlc193aGF0IHsKLQlJUFRfQ09OTkJZVEVTX1BLVFMsCi0JSVBUX0NPTk5CWVRFU19CWVRFUywKLQlJUFRfQ09OTkJZVEVTX0FWR1BLVCwKLX07CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci94dF9jb25uYnl0ZXMuaD4KKyNkZWZpbmUgaXB0X2Nvbm5ieXRlc193aGF0IHh0X2Nvbm5ieXRlc193aGF0CiAKLWVudW0gaXB0X2Nvbm5ieXRlc19kaXJlY3Rpb24gewotCUlQVF9DT05OQllURVNfRElSX09SSUdJTkFMLAotCUlQVF9DT05OQllURVNfRElSX1JFUExZLAotCUlQVF9DT05OQllURVNfRElSX0JPVEgsCi19OworI2RlZmluZSBJUFRfQ09OTkJZVEVTX1BLVFMJWFRfQ09OTkJZVEVTX1BBQ0tFVFMKKyNkZWZpbmUgSVBUX0NPTk5CWVRFU19CWVRFUwlYVF9DT05OQllURVNfQllURVMKKyNkZWZpbmUgSVBUX0NPTk5CWVRFU19BVkdQS1QJWFRfQ09OTkJZVEVTX0FWR1BLVAogCi1zdHJ1Y3QgaXB0X2Nvbm5ieXRlc19pbmZvCi17Ci0Jc3RydWN0IHsKLQkJYWxpZ25lZF91NjQgZnJvbTsJLyogY291bnQgdG8gYmUgbWF0Y2hlZCAqLwotCQlhbGlnbmVkX3U2NCB0bzsJCS8qIGNvdW50IHRvIGJlIG1hdGNoZWQgKi8KLQl9IGNvdW50OwotCXVfaW50OF90IHdoYXQ7CQkvKiBpcHRfY29ubmJ5dGVzX3doYXQgKi8KLQl1X2ludDhfdCBkaXJlY3Rpb247CS8qIGlwdF9jb25uYnl0ZXNfZGlyZWN0aW9uICovCi19OworI2RlZmluZSBpcHRfY29ubmJ5dGVzX2RpcmVjdGlvbiAJeHRfY29ubmJ5dGVzX2RpcmVjdGlvbgorI2RlZmluZSBJUFRfQ09OTkJZVEVTX0RJUl9PUklHSU5BTCAJWFRfQ09OTkJZVEVTX0RJUl9PUklHSU5BTAorI2RlZmluZSBJUFRfQ09OTkJZVEVTX0RJUl9SRVBMWSAJWFRfQ09OTkJZVEVTX0RJUl9SRVBMWQorI2RlZmluZSBJUFRfQ09OTkJZVEVTX0RJUl9CT1RICQlYVF9DT05OQllURVNfRElSX0JPVEgKKworI2RlZmluZSBpcHRfY29ubmJ5dGVzX2luZm8geHRfY29ubmJ5dGVzX2luZm8KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25ubWFyay5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29ubm1hcmsuaAppbmRleCA0NjU3MzI3Li5jN2JhNjU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25ubWFyay5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2Nvbm5tYXJrLmgKQEAgLTEsMTggKzEsNyBAQAogI2lmbmRlZiBfSVBUX0NPTk5NQVJLX0gKICNkZWZpbmUgX0lQVF9DT05OTUFSS19ICiAKLS8qIENvcHlyaWdodCAoQykgMjAwMiwyMDA0IE1BUkEgU3lzdGVtcyBBQiA8aHR0cDovL3d3dy5tYXJhc3lzdGVtcy5jb20+Ci0gKiBieSBIZW5yaWsgTm9yZHN0cm9tIDxobm9AbWFyYXN5c3RlbXMuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotc3RydWN0IGlwdF9jb25ubWFya19pbmZvIHsKLQl1bnNpZ25lZCBsb25nIG1hcmssIG1hc2s7Ci0JdV9pbnQ4X3QgaW52ZXJ0OwotfTsKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuaD4KKyNkZWZpbmUgaXB0X2Nvbm5tYXJrX2luZm8geHRfY29ubm1hcmtfaW5mbwogCiAjZW5kaWYgLypfSVBUX0NPTk5NQVJLX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29ubnRyYWNrLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25udHJhY2suaAppbmRleCA0MTNjNTY1Li5jZGU2NzYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25udHJhY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25udHJhY2suaApAQCAtNSw1NiArNSwyNCBAQAogI2lmbmRlZiBfSVBUX0NPTk5UUkFDS19ICiAjZGVmaW5lIF9JUFRfQ09OTlRSQUNLX0gKIAotI2RlZmluZSBJUFRfQ09OTlRSQUNLX1NUQVRFX0JJVChjdGluZm8pICgxIDw8ICgoY3RpbmZvKSVJUF9DVF9JU19SRVBMWSsxKSkKLSNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFURV9JTlZBTElEICgxIDw8IDApCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5oPgogCi0jZGVmaW5lIElQVF9DT05OVFJBQ0tfU1RBVEVfU05BVCAoMSA8PCAoSVBfQ1RfTlVNQkVSICsgMSkpCi0jZGVmaW5lIElQVF9DT05OVFJBQ0tfU1RBVEVfRE5BVCAoMSA8PCAoSVBfQ1RfTlVNQkVSICsgMikpCi0jZGVmaW5lIElQVF9DT05OVFJBQ0tfU1RBVEVfVU5UUkFDS0VEICgxIDw8IChJUF9DVF9OVU1CRVIgKyAzKSkKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFURV9CSVQoY3RpbmZvKSBYVF9DT05OVFJBQ0tfU1RBVEVfQklUKGN0aW5mbykKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFURV9JTlZBTElEIAlYVF9DT05OVFJBQ0tfU1RBVEVfSU5WQUxJRAorCisjZGVmaW5lIElQVF9DT05OVFJBQ0tfU1RBVEVfU05BVCAJWFRfQ09OTlRSQUNLX1NUQVRFX1NOQVQKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFURV9ETkFUCVhUX0NPTk5UUkFDS19TVEFURV9ETkFUCisjZGVmaW5lIElQVF9DT05OVFJBQ0tfU1RBVEVfVU5UUkFDS0VECVhUX0NPTk5UUkFDS19TVEFURV9VTlRSQUNLRUQKIAogLyogZmxhZ3MsIGludmZsYWdzOiAqLwotI2RlZmluZSBJUFRfQ09OTlRSQUNLX1NUQVRFCTB4MDEKLSNkZWZpbmUgSVBUX0NPTk5UUkFDS19QUk9UTwkweDAyCi0jZGVmaW5lIElQVF9DT05OVFJBQ0tfT1JJR1NSQwkweDA0Ci0jZGVmaW5lIElQVF9DT05OVFJBQ0tfT1JJR0RTVAkweDA4Ci0jZGVmaW5lIElQVF9DT05OVFJBQ0tfUkVQTFNSQwkweDEwCi0jZGVmaW5lIElQVF9DT05OVFJBQ0tfUkVQTERTVAkweDIwCi0jZGVmaW5lIElQVF9DT05OVFJBQ0tfU1RBVFVTCTB4NDAKLSNkZWZpbmUgSVBUX0NPTk5UUkFDS19FWFBJUkVTCTB4ODAKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFURQkJWFRfQ09OTlRSQUNLX1NUQVRFCisjZGVmaW5lIElQVF9DT05OVFJBQ0tfUFJPVE8JCVhUX0NPTk5UUkFDS19QUk9UTworI2RlZmluZSBJUFRfQ09OTlRSQUNLX09SSUdTUkMJCVhUX0NPTk5UUkFDS19PUklHU1JDCisjZGVmaW5lIElQVF9DT05OVFJBQ0tfT1JJR0RTVAkJWFRfQ09OTlRSQUNLX09SSUdEU1QKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19SRVBMU1JDCQlYVF9DT05OVFJBQ0tfUkVQTFNSQworI2RlZmluZSBJUFRfQ09OTlRSQUNLX1JFUExEU1QJCVhUX0NPTk5UUkFDS19SRVBMRFNUCisjZGVmaW5lIElQVF9DT05OVFJBQ0tfU1RBVFVTCQlYVF9DT05OVFJBQ0tfU1RBVFVTCisjZGVmaW5lIElQVF9DT05OVFJBQ0tfRVhQSVJFUwkJWFRfQ09OTlRSQUNLX0VYUElSRVMKIAotLyogVGhpcyBpcyBleHBvc2VkIHRvIHVzZXJzcGFjZSwgc28gcmVtYWlucyBmcm96ZW4gaW4gdGltZS4gKi8KLXN0cnVjdCBpcF9jb25udHJhY2tfb2xkX3R1cGxlCi17Ci0Jc3RydWN0IHsKLQkJX191MzIgaXA7Ci0JCXVuaW9uIHsKLQkJCV9fdTE2IGFsbDsKLQkJfSB1OwotCX0gc3JjOwotCi0Jc3RydWN0IHsKLQkJX191MzIgaXA7Ci0JCXVuaW9uIHsKLQkJCV9fdTE2IGFsbDsKLQkJfSB1OwotCi0JCS8qIFRoZSBwcm90b2NvbC4gKi8KLQkJdTE2IHByb3RvbnVtOwotCX0gZHN0OwotfTsKLQotc3RydWN0IGlwdF9jb25udHJhY2tfaW5mbwotewotCXVuc2lnbmVkIGludCBzdGF0ZW1hc2ssIHN0YXR1c21hc2s7Ci0KLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX29sZF90dXBsZSB0dXBsZVtJUF9DVF9ESVJfTUFYXTsKLQlzdHJ1Y3QgaW5fYWRkciBzaXBtc2tbSVBfQ1RfRElSX01BWF0sIGRpcG1za1tJUF9DVF9ESVJfTUFYXTsKLQotCXVuc2lnbmVkIGxvbmcgZXhwaXJlc19taW4sIGV4cGlyZXNfbWF4OwotCi0JLyogRmxhZ3Mgd29yZCAqLwotCXVfaW50OF90IGZsYWdzOwotCS8qIEludmVyc2UgZmxhZ3MgKi8KLQl1X2ludDhfdCBpbnZmbGFnczsKLX07CisjZGVmaW5lIGlwdF9jb25udHJhY2tfaW5mbwkJeHRfY29ubnRyYWNrX2luZm8KICNlbmRpZiAvKl9JUFRfQ09OTlRSQUNLX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfZGNjcC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfZGNjcC5oCmluZGV4IDNjYjNhNTIuLmU3MGQxMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2RjY3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9kY2NwLmgKQEAgLTEsMjMgKzEsMTUgQEAKICNpZm5kZWYgX0lQVF9EQ0NQX0hfCiAjZGVmaW5lIF9JUFRfRENDUF9IXwogCi0jZGVmaW5lIElQVF9EQ0NQX1NSQ19QT1JUUwkgICAgICAgIDB4MDEKLSNkZWZpbmUgSVBUX0RDQ1BfREVTVF9QT1JUUwkgICAgICAgIDB4MDIKLSNkZWZpbmUgSVBUX0RDQ1BfVFlQRQkJCTB4MDQKLSNkZWZpbmUgSVBUX0RDQ1BfT1BUSU9OCQkJMHgwOAorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9kY2NwLmg+CisjZGVmaW5lIElQVF9EQ0NQX1NSQ19QT1JUUwlYVF9EQ0NQX1NSQ19QT1JUUworI2RlZmluZSBJUFRfRENDUF9ERVNUX1BPUlRTCVhUX0RDQ1BfREVTVF9QT1JUUworI2RlZmluZSBJUFRfRENDUF9UWVBFCQlYVF9EQ0NQX1RZUEUKKyNkZWZpbmUgSVBUX0RDQ1BfT1BUSU9OCQlYVF9EQ0NQX09QVElPTgogCi0jZGVmaW5lIElQVF9EQ0NQX1ZBTElEX0ZMQUdTCQkweDBmCisjZGVmaW5lIElQVF9EQ0NQX1ZBTElEX0ZMQUdTIAlYVF9EQ0NQX1ZBTElEX0ZMQUdTCiAKLXN0cnVjdCBpcHRfZGNjcF9pbmZvIHsKLQl1X2ludDE2X3QgZHB0c1syXTsgIC8qIE1pbiwgTWF4ICovCi0JdV9pbnQxNl90IHNwdHNbMl07ICAvKiBNaW4sIE1heCAqLwotCi0JdV9pbnQxNl90IGZsYWdzOwotCXVfaW50MTZfdCBpbnZmbGFnczsKLQotCXVfaW50MTZfdCB0eXBlbWFzazsKLQl1X2ludDhfdCBvcHRpb247Ci19OworI2RlZmluZSBpcHRfZGNjcF9pbmZvIHh0X2RjY3BfaW5mbwogCiAjZW5kaWYgLyogX0lQVF9EQ0NQX0hfICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2hlbHBlci5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfaGVscGVyLmgKaW5kZXggNmYxMmVjYi4uODA0NTJjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfaGVscGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfaGVscGVyLmgKQEAgLTEsOCArMSw3IEBACiAjaWZuZGVmIF9JUFRfSEVMUEVSX0gKICNkZWZpbmUgX0lQVF9IRUxQRVJfSAogCi1zdHJ1Y3QgaXB0X2hlbHBlcl9pbmZvIHsKLQlpbnQgaW52ZXJ0OwotCWNoYXIgbmFtZVszMF07Ci19OworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9oZWxwZXIuaD4KKyNkZWZpbmUgaXB0X2hlbHBlcl9pbmZvIHh0X2hlbHBlcl9pbmZvCisKICNlbmRpZiAvKiBfSVBUX0hFTFBFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9sZW5ndGguaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2xlbmd0aC5oCmluZGV4IDZlMDg4NTIuLjliNDUyMDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2xlbmd0aC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2xlbmd0aC5oCkBAIC0xLDkgKzEsNyBAQAogI2lmbmRlZiBfSVBUX0xFTkdUSF9ICiAjZGVmaW5lIF9JUFRfTEVOR1RIX0gKIAotc3RydWN0IGlwdF9sZW5ndGhfaW5mbyB7Ci0gICAgdV9pbnQxNl90CW1pbiwgbWF4OwotICAgIHVfaW50OF90CWludmVydDsKLX07CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2xlbmd0aC5oPgorI2RlZmluZSBpcHRfbGVuZ3RoX2luZm8geHRfbGVuZ3RoX2luZm8KIAogI2VuZGlmIC8qX0lQVF9MRU5HVEhfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9saW1pdC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbGltaXQuaAppbmRleCAyNTY0NTM0Li45MmY1Y2QwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9saW1pdC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2xpbWl0LmgKQEAgLTEsMjEgKzEsOCBAQAogI2lmbmRlZiBfSVBUX1JBVEVfSAogI2RlZmluZSBfSVBUX1JBVEVfSAogCi0vKiB0aW1pbmdzIGFyZSBpbiBtaWxsaXNlY29uZHMuICovCi0jZGVmaW5lIElQVF9MSU1JVF9TQ0FMRSAxMDAwMAorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9saW1pdC5oPgorI2RlZmluZSBJUFRfTElNSVRfU0NBTEUgWFRfTElNSVRfU0NBTEUKKyNkZWZpbmUgaXB0X3JhdGVpbmZvIHh0X3JhdGVpbmZvCiAKLS8qIDEvMTAsMDAwIHNlYyBwZXJpb2QgPT4gbWF4IG9mIDEwLDAwMC9zZWMuICBNaW4gcmF0ZSBpcyB0aGVuIDQyOTQ5MAotICAgc2Vjb25kcywgb3Igb25lIGV2ZXJ5IDU5IGhvdXJzLiAqLwotc3RydWN0IGlwdF9yYXRlaW5mbyB7Ci0JdV9pbnQzMl90IGF2ZzsgICAgLyogQXZlcmFnZSBzZWNzIGJldHdlZW4gcGFja2V0cyAqIHNjYWxlICovCi0JdV9pbnQzMl90IGJ1cnN0OyAgLyogUGVyaW9kIG11bHRpcGxpZXIgZm9yIHVwcGVyIGxpbWl0LiAqLwotCi0JLyogVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBrZXJuZWwgKi8KLQl1bnNpZ25lZCBsb25nIHByZXY7Ci0JdV9pbnQzMl90IGNyZWRpdDsKLQl1X2ludDMyX3QgY3JlZGl0X2NhcCwgY29zdDsKLQotCS8qIFVnbHksIHVnbHkgZnVja2VyLiAqLwotCXN0cnVjdCBpcHRfcmF0ZWluZm8gKm1hc3RlcjsKLX07CiAjZW5kaWYgLypfSVBUX1JBVEVfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9tYWMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X21hYy5oCmluZGV4IGY4ZDViOGUuLmIxODYwMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X21hYy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X21hYy5oCkBAIC0xLDggKzEsNyBAQAogI2lmbmRlZiBfSVBUX01BQ19ICiAjZGVmaW5lIF9JUFRfTUFDX0gKIAotc3RydWN0IGlwdF9tYWNfaW5mbyB7Ci0gICAgdW5zaWduZWQgY2hhciBzcmNhZGRyW0VUSF9BTEVOXTsKLSAgICBpbnQgaW52ZXJ0OwotfTsKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbWFjLmg+CisjZGVmaW5lIGlwdF9tYWNfaW5mbyB4dF9tYWNfaW5mbworCiAjZW5kaWYgLypfSVBUX01BQ19IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X21hcmsuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X21hcmsuaAppbmRleCBmMzk1MmI1Li5iZmRlNjdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9tYXJrLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbWFyay5oCkBAIC0xLDkgKzEsOSBAQAogI2lmbmRlZiBfSVBUX01BUktfSAogI2RlZmluZSBfSVBUX01BUktfSAogCi1zdHJ1Y3QgaXB0X21hcmtfaW5mbyB7Ci0gICAgdW5zaWduZWQgbG9uZyBtYXJrLCBtYXNrOwotICAgIHVfaW50OF90IGludmVydDsKLX07CisvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3Igb2xkIHVzZXJzcGFjZSAqLworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9tYXJrLmg+CisKKyNkZWZpbmUgaXB0X21hcmtfaW5mbyB4dF9tYXJrX2luZm8KIAogI2VuZGlmIC8qX0lQVF9NQVJLX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcGh5c2Rldi5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcGh5c2Rldi5oCmluZGV4IDc1MzhjODYuLjI0MDBlNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3BoeXNkZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9waHlzZGV2LmgKQEAgLTEsMjQgKzEsMTcgQEAKICNpZm5kZWYgX0lQVF9QSFlTREVWX0gKICNkZWZpbmUgX0lQVF9QSFlTREVWX0gKIAotI2lmZGVmIF9fS0VSTkVMX18KLSNpbmNsdWRlIDxsaW51eC9pZi5oPgotI2VuZGlmCisvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3Igb2xkIHVzZXJzcGFjZSAqLwogCi0jZGVmaW5lIElQVF9QSFlTREVWX09QX0lOCQkweDAxCi0jZGVmaW5lIElQVF9QSFlTREVWX09QX09VVAkJMHgwMgotI2RlZmluZSBJUFRfUEhZU0RFVl9PUF9CUklER0VECQkweDA0Ci0jZGVmaW5lIElQVF9QSFlTREVWX09QX0lTSU4JCTB4MDgKLSNkZWZpbmUgSVBUX1BIWVNERVZfT1BfSVNPVVQJCTB4MTAKLSNkZWZpbmUgSVBUX1BIWVNERVZfT1BfTUFTSwkJKDB4MjAgLSAxKQorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9waHlzZGV2Lmg+CiAKLXN0cnVjdCBpcHRfcGh5c2Rldl9pbmZvIHsKLQljaGFyIHBoeXNpbmRldltJRk5BTVNJWl07Ci0JY2hhciBpbl9tYXNrW0lGTkFNU0laXTsKLQljaGFyIHBoeXNvdXRkZXZbSUZOQU1TSVpdOwotCWNoYXIgb3V0X21hc2tbSUZOQU1TSVpdOwotCXVfaW50OF90IGludmVydDsKLQl1X2ludDhfdCBiaXRtYXNrOwotfTsKKyNkZWZpbmUgSVBUX1BIWVNERVZfT1BfSU4JCVhUX1BIWVNERVZfT1BfSU4KKyNkZWZpbmUgSVBUX1BIWVNERVZfT1BfT1VUCQlYVF9QSFlTREVWX09QX09VVAorI2RlZmluZSBJUFRfUEhZU0RFVl9PUF9CUklER0VECQlYVF9QSFlTREVWX09QX0JSSURHRUQKKyNkZWZpbmUgSVBUX1BIWVNERVZfT1BfSVNJTgkJWFRfUEhZU0RFVl9PUF9JU0lOCisjZGVmaW5lIElQVF9QSFlTREVWX09QX0lTT1VUCQlYVF9QSFlTREVWX09QX0lTT1VUCisjZGVmaW5lIElQVF9QSFlTREVWX09QX01BU0sJCVhUX1BIWVNERVZfT1BfTUFTSworCisjZGVmaW5lIGlwdF9waHlzZGV2X2luZm8geHRfcGh5c2Rldl9pbmZvCiAKICNlbmRpZiAvKl9JUFRfUEhZU0RFVl9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3BrdHR5cGUuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3BrdHR5cGUuaAppbmRleCBkNTNhNjU4Li5mZjFmYmM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9wa3R0eXBlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcGt0dHlwZS5oCkBAIC0xLDggKzEsNyBAQAogI2lmbmRlZiBfSVBUX1BLVFRZUEVfSAogI2RlZmluZSBfSVBUX1BLVFRZUEVfSAogCi1zdHJ1Y3QgaXB0X3BrdHR5cGVfaW5mbyB7Ci0JaW50CXBrdHR5cGU7Ci0JaW50CWludmVydDsKLX07CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3BrdHR5cGUuaD4KKyNkZWZpbmUgaXB0X3BrdHR5cGVfaW5mbyB4dF9wa3R0eXBlX2luZm8KKwogI2VuZGlmIC8qX0lQVF9QS1RUWVBFX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcG9saWN5LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9wb2xpY3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmQxYmVjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcG9saWN5LmgKQEAgLTAsMCArMSw1MiBAQAorI2lmbmRlZiBfSVBUX1BPTElDWV9ICisjZGVmaW5lIF9JUFRfUE9MSUNZX0gKKworI2RlZmluZSBJUFRfUE9MSUNZX01BWF9FTEVNCTQKKworZW51bSBpcHRfcG9saWN5X2ZsYWdzCit7CisJSVBUX1BPTElDWV9NQVRDSF9JTgk9IDB4MSwKKwlJUFRfUE9MSUNZX01BVENIX09VVAk9IDB4MiwKKwlJUFRfUE9MSUNZX01BVENIX05PTkUJPSAweDQsCisJSVBUX1BPTElDWV9NQVRDSF9TVFJJQ1QJPSAweDgsCit9OworCitlbnVtIGlwdF9wb2xpY3lfbW9kZXMKK3sKKwlJUFRfUE9MSUNZX01PREVfVFJBTlNQT1JULAorCUlQVF9QT0xJQ1lfTU9ERV9UVU5ORUwKK307CisKK3N0cnVjdCBpcHRfcG9saWN5X3NwZWMKK3sKKwl1X2ludDhfdAlzYWRkcjoxLAorCQkJZGFkZHI6MSwKKwkJCXByb3RvOjEsCisJCQltb2RlOjEsCisJCQlzcGk6MSwKKwkJCXJlcWlkOjE7Cit9OworCitzdHJ1Y3QgaXB0X3BvbGljeV9lbGVtCit7CisJdV9pbnQzMl90CXNhZGRyOworCXVfaW50MzJfdAlzbWFzazsKKwl1X2ludDMyX3QJZGFkZHI7CisJdV9pbnQzMl90CWRtYXNrOworCXVfaW50MzJfdAlzcGk7CisJdV9pbnQzMl90CXJlcWlkOworCXVfaW50OF90CXByb3RvOworCXVfaW50OF90CW1vZGU7CisKKwlzdHJ1Y3QgaXB0X3BvbGljeV9zcGVjCW1hdGNoOworCXN0cnVjdCBpcHRfcG9saWN5X3NwZWMJaW52ZXJ0OworfTsKKworc3RydWN0IGlwdF9wb2xpY3lfaW5mbworeworCXN0cnVjdCBpcHRfcG9saWN5X2VsZW0gcG9sW0lQVF9QT0xJQ1lfTUFYX0VMRU1dOworCXVfaW50MTZfdCBmbGFnczsKKwl1X2ludDE2X3QgbGVuOworfTsKKworI2VuZGlmIC8qIF9JUFRfUE9MSUNZX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3JlYWxtLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9yZWFsbS5oCmluZGV4IGE0ZDY2OTguLmIzOTk2ZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3JlYWxtLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcmVhbG0uaApAQCAtMSwxMCArMSw3IEBACiAjaWZuZGVmIF9JUFRfUkVBTE1fSAogI2RlZmluZSBfSVBUX1JFQUxNX0gKIAotc3RydWN0IGlwdF9yZWFsbV9pbmZvIHsKLQl1X2ludDMyX3QgaWQ7Ci0JdV9pbnQzMl90IG1hc2s7Ci0JdV9pbnQ4X3QgaW52ZXJ0OwotfTsKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfcmVhbG0uaD4KKyNkZWZpbmUgaXB0X3JlYWxtX2luZm8geHRfcmVhbG1faW5mbwogCiAjZW5kaWYgLyogX0lQVF9SRUFMTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9zdGF0ZS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfc3RhdGUuaAppbmRleCA1ZGYzNzg2Li5hNDRhOTljIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9zdGF0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3N0YXRlLmgKQEAgLTEsMTMgKzEsMTUgQEAKICNpZm5kZWYgX0lQVF9TVEFURV9ICiAjZGVmaW5lIF9JUFRfU1RBVEVfSAogCi0jZGVmaW5lIElQVF9TVEFURV9CSVQoY3RpbmZvKSAoMSA8PCAoKGN0aW5mbyklSVBfQ1RfSVNfUkVQTFkrMSkpCi0jZGVmaW5lIElQVF9TVEFURV9JTlZBTElEICgxIDw8IDApCisvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3Igb2xkIHVzZXJzcGFjZSAqLwogCi0jZGVmaW5lIElQVF9TVEFURV9VTlRSQUNLRUQgKDEgPDwgKElQX0NUX05VTUJFUiArIDEpKQorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9zdGF0ZS5oPgogCi1zdHJ1Y3QgaXB0X3N0YXRlX2luZm8KLXsKLQl1bnNpZ25lZCBpbnQgc3RhdGVtYXNrOwotfTsKKyNkZWZpbmUgSVBUX1NUQVRFX0JJVAkJWFRfU1RBVEVfQklUCisjZGVmaW5lIElQVF9TVEFURV9JTlZBTElECVhUX1NUQVRFX0lOVkFMSUQKKworI2RlZmluZSBJUFRfU1RBVEVfVU5UUkFDS0VECVhUX1NUQVRFX1VOVFJBQ0tFRAorCisjZGVmaW5lIGlwdF9zdGF0ZV9pbmZvCQl4dF9zdGF0ZV9pbmZvCisKICNlbmRpZiAvKl9JUFRfU1RBVEVfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9zdHJpbmcuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3N0cmluZy5oCmluZGV4IGEyNjVmNmUuLmMyNmRlMzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3N0cmluZy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3N0cmluZy5oCkBAIC0xLDE4ICsxLDEwIEBACiAjaWZuZGVmIF9JUFRfU1RSSU5HX0gKICNkZWZpbmUgX0lQVF9TVFJJTkdfSAogCi0jZGVmaW5lIElQVF9TVFJJTkdfTUFYX1BBVFRFUk5fU0laRSAxMjgKLSNkZWZpbmUgSVBUX1NUUklOR19NQVhfQUxHT19OQU1FX1NJWkUgMTYKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfc3RyaW5nLmg+CiAKLXN0cnVjdCBpcHRfc3RyaW5nX2luZm8KLXsKLQl1X2ludDE2X3QgZnJvbV9vZmZzZXQ7Ci0JdV9pbnQxNl90IHRvX29mZnNldDsKLQljaGFyCSAgYWxnb1tJUFRfU1RSSU5HX01BWF9BTEdPX05BTUVfU0laRV07Ci0JY2hhciAJICBwYXR0ZXJuW0lQVF9TVFJJTkdfTUFYX1BBVFRFUk5fU0laRV07Ci0JdV9pbnQ4X3QgIHBhdGxlbjsKLQl1X2ludDhfdCAgaW52ZXJ0OwotCXN0cnVjdCB0c19jb25maWcgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpICpjb25maWc7Ci19OworI2RlZmluZSBJUFRfU1RSSU5HX01BWF9QQVRURVJOX1NJWkUgWFRfU1RSSU5HX01BWF9QQVRURVJOX1NJWkUKKyNkZWZpbmUgSVBUX1NUUklOR19NQVhfQUxHT19OQU1FX1NJWkUgWFRfU1RSSU5HX01BWF9BTEdPX05BTUVfU0laRQorI2RlZmluZSBpcHRfc3RyaW5nX2luZm8geHRfc3RyaW5nX2luZm8KIAogI2VuZGlmIC8qX0lQVF9TVFJJTkdfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF90Y3Btc3MuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3RjcG1zcy5oCmluZGV4IGUyYjE0MzkuLjE4YmJjOGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3RjcG1zcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3RjcG1zcy5oCkBAIC0xLDkgKzEsNyBAQAogI2lmbmRlZiBfSVBUX1RDUE1TU19NQVRDSF9ICiAjZGVmaW5lIF9JUFRfVENQTVNTX01BVENIX0gKIAotc3RydWN0IGlwdF90Y3Btc3NfbWF0Y2hfaW5mbyB7Ci0gICAgdV9pbnQxNl90IG1zc19taW4sIG1zc19tYXg7Ci0gICAgdV9pbnQ4X3QgaW52ZXJ0OwotfTsKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfdGNwbXNzLmg+CisjZGVmaW5lIGlwdF90Y3Btc3NfbWF0Y2hfaW5mbyB4dF90Y3Btc3NfbWF0Y2hfaW5mbwogCiAjZW5kaWYgLypfSVBUX1RDUE1TU19NQVRDSF9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYuaAppbmRleCA1M2IyOTgzLi4xNGYyYmQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni5oCkBAIC03Miw3ICs3MiwxMiBAQAogCU5GX0lQNl9QUklfTEFTVCA9IElOVF9NQVgsCiB9OwogCisjaWZkZWYgQ09ORklHX05FVEZJTFRFUgogZXh0ZXJuIGludCBpcHY2X25ldGZpbHRlcl9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgaXB2Nl9uZXRmaWx0ZXJfZmluaSh2b2lkKTsKKyNlbHNlIC8qIENPTkZJR19ORVRGSUxURVIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlwdjZfbmV0ZmlsdGVyX2luaXQodm9pZCkgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIGlwdjZfbmV0ZmlsdGVyX2Zpbmkodm9pZCkgeyByZXR1cm47IH0KKyNlbmRpZiAvKiBDT05GSUdfTkVURklMVEVSICovCiAKICNlbmRpZiAvKl9fTElOVVhfSVA2X05FVEZJTFRFUl9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmgKaW5kZXggYzE2M2JhMy4uZjI0OWI1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmgKQEAgLTI1LDggKzI1LDE1IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni5oPgogCi0jZGVmaW5lIElQNlRfRlVOQ1RJT05fTUFYTkFNRUxFTiAzMAotI2RlZmluZSBJUDZUX1RBQkxFX01BWE5BTUVMRU4gMzIKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKworI2RlZmluZSBJUDZUX0ZVTkNUSU9OX01BWE5BTUVMRU4gWFRfRlVOQ1RJT05fTUFYTkFNRUxFTgorI2RlZmluZSBJUDZUX1RBQkxFX01BWE5BTUVMRU4gWFRfVEFCTEVfTUFYTkFNRUxFTgorCisjZGVmaW5lIGlwNnRfbWF0Y2ggeHRfbWF0Y2gKKyNkZWZpbmUgaXA2dF90YXJnZXQgeHRfdGFyZ2V0CisjZGVmaW5lIGlwNnRfdGFibGUgeHRfdGFibGUKKyNkZWZpbmUgaXA2dF9nZXRfcmV2aXNpb24geHRfZ2V0X3JldmlzaW9uCiAKIC8qIFllcywgVmlyZ2luaWEsIHlvdSBoYXZlIHRvIHplcm8gdGhlIHBhZGRpbmcuICovCiBzdHJ1Y3QgaXA2dF9pcDYgewpAQCAtMTA0LDEwICsxMTEsNyBAQAogCWludCB2ZXJkaWN0OwogfTsKIAotc3RydWN0IGlwNnRfY291bnRlcnMKLXsKLQl1X2ludDY0X3QgcGNudCwgYmNudDsJCQkvKiBQYWNrZXQgYW5kIGJ5dGUgY291bnRlcnMgKi8KLX07CisjZGVmaW5lIGlwNnRfY291bnRlcnMJeHRfY291bnRlcnMKIAogLyogVmFsdWVzIGZvciAiZmxhZyIgZmllbGQgaW4gc3RydWN0IGlwNnRfaXA2IChnZW5lcmFsIGlwNiBzdHJ1Y3R1cmUpLiAqLwogI2RlZmluZSBJUDZUX0ZfUFJPVE8JCTB4MDEJLyogU2V0IGlmIHJ1bGUgY2FyZXMgYWJvdXQgdXBwZXIgCkBAIC0xMjMsNyArMTI3LDcgQEAKICNkZWZpbmUgSVA2VF9JTlZfU1JDSVAJCTB4MDgJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBTUkMgSVAuICovCiAjZGVmaW5lIElQNlRfSU5WX0RTVElQCQkweDEwCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgRFNUIE9QLiAqLwogI2RlZmluZSBJUDZUX0lOVl9GUkFHCQkweDIwCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgRlJBRy4gKi8KLSNkZWZpbmUgSVA2VF9JTlZfUFJPVE8JCTB4NDAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBQUk9UTy4gKi8KKyNkZWZpbmUgSVA2VF9JTlZfUFJPVE8JCVhUX0lOVl9QUk9UTwogI2RlZmluZSBJUDZUX0lOVl9NQVNLCQkweDdGCS8qIEFsbCBwb3NzaWJsZSBmbGFnIGJpdHMgbWFzay4gKi8KIAogLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBlYWNoIG9mIHRoZSBmaXJld2FsbCBydWxlcy4gIENvbnNpc3RzIG9mIDMKQEAgLTE0NSw3ICsxNDksNyBAQAogCXVuc2lnbmVkIGludCBjb21lZnJvbTsKIAogCS8qIFBhY2tldCBhbmQgYnl0ZSBjb3VudGVycy4gKi8KLQlzdHJ1Y3QgaXA2dF9jb3VudGVycyBjb3VudGVyczsKKwlzdHJ1Y3QgeHRfY291bnRlcnMgY291bnRlcnM7CiAKIAkvKiBUaGUgbWF0Y2hlcyAoaWYgYW55KSwgdGhlbiB0aGUgdGFyZ2V0LiAqLwogCXVuc2lnbmVkIGNoYXIgZWxlbXNbMF07CkBAIC0xNTUsNTQgKzE1OSw0MSBAQAogICogTmV3IElQIGZpcmV3YWxsIG9wdGlvbnMgZm9yIFtnc11ldHNvY2tvcHQgYXQgdGhlIFJBVyBJUCBsZXZlbC4KICAqIFVubGlrZSBCU0QgTGludXggaW5oZXJpdHMgSVAgb3B0aW9ucyBzbyB5b3UgZG9uJ3QgaGF2ZSB0byB1c2UKICAqIGEgcmF3IHNvY2tldCBmb3IgdGhpcy4gSW5zdGVhZCB3ZSBjaGVjayByaWdodHMgaW4gdGhlIGNhbGxzLiAqLwotI2RlZmluZSBJUDZUX0JBU0VfQ1RMCQkJNjQJLyogYmFzZSBmb3IgZmlyZXdhbGwgc29ja2V0IG9wdGlvbnMgKi8KKyNkZWZpbmUgSVA2VF9CQVNFX0NUTAkJCVhUX0JBU0VfQ1RMCiAKLSNkZWZpbmUgSVA2VF9TT19TRVRfUkVQTEFDRQkJKElQNlRfQkFTRV9DVEwpCi0jZGVmaW5lIElQNlRfU09fU0VUX0FERF9DT1VOVEVSUwkoSVA2VF9CQVNFX0NUTCArIDEpCi0jZGVmaW5lIElQNlRfU09fU0VUX01BWAkJCUlQNlRfU09fU0VUX0FERF9DT1VOVEVSUworI2RlZmluZSBJUDZUX1NPX1NFVF9SRVBMQUNFCQlYVF9TT19TRVRfUkVQTEFDRQorI2RlZmluZSBJUDZUX1NPX1NFVF9BRERfQ09VTlRFUlMJWFRfU09fU0VUX0FERF9DT1VOVEVSUworI2RlZmluZSBJUDZUX1NPX1NFVF9NQVgJCQlYVF9TT19TRVRfTUFYCiAKLSNkZWZpbmUgSVA2VF9TT19HRVRfSU5GTwkJKElQNlRfQkFTRV9DVEwpCi0jZGVmaW5lIElQNlRfU09fR0VUX0VOVFJJRVMJCShJUDZUX0JBU0VfQ1RMICsgMSkKLSNkZWZpbmUJSVA2VF9TT19HRVRfUkVWSVNJT05fTUFUQ0gJKElQNlRfQkFTRV9DVEwgKyAyKQotI2RlZmluZQlJUDZUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQJKElQNlRfQkFTRV9DVEwgKyAzKQotI2RlZmluZSBJUDZUX1NPX0dFVF9NQVgJCQlJUDZUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQKKyNkZWZpbmUgSVA2VF9TT19HRVRfSU5GTwkJWFRfU09fR0VUX0lORk8KKyNkZWZpbmUgSVA2VF9TT19HRVRfRU5UUklFUwkJWFRfU09fR0VUX0VOVFJJRVMKKyNkZWZpbmUJSVA2VF9TT19HRVRfUkVWSVNJT05fTUFUQ0gJWFRfU09fR0VUX1JFVklTSU9OX01BVENICisjZGVmaW5lCUlQNlRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAlYVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCisjZGVmaW5lIElQNlRfU09fR0VUX01BWAkJCVhUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQKIAogLyogQ09OVElOVUUgdmVyZGljdCBmb3IgdGFyZ2V0cyAqLwotI2RlZmluZSBJUDZUX0NPTlRJTlVFIDB4RkZGRkZGRkYKKyNkZWZpbmUgSVA2VF9DT05USU5VRSBYVF9DT05USU5VRQogCiAvKiBGb3Igc3RhbmRhcmQgdGFyZ2V0ICovCi0jZGVmaW5lIElQNlRfUkVUVVJOICgtTkZfUkVQRUFUIC0gMSkKKyNkZWZpbmUgSVA2VF9SRVRVUk4gWFRfUkVUVVJOCiAKLS8qIFRDUCBtYXRjaGluZyBzdHVmZiAqLwotc3RydWN0IGlwNnRfdGNwCi17Ci0JdV9pbnQxNl90IHNwdHNbMl07CQkJLyogU291cmNlIHBvcnQgcmFuZ2UuICovCi0JdV9pbnQxNl90IGRwdHNbMl07CQkJLyogRGVzdGluYXRpb24gcG9ydCByYW5nZS4gKi8KLQl1X2ludDhfdCBvcHRpb247CQkJLyogVENQIE9wdGlvbiBpZmYgbm9uLXplcm8qLwotCXVfaW50OF90IGZsZ19tYXNrOwkJCS8qIFRDUCBmbGFncyBtYXNrIGJ5dGUgKi8KLQl1X2ludDhfdCBmbGdfY21wOwkJCS8qIFRDUCBmbGFncyBjb21wYXJlIGJ5dGUgKi8KLQl1X2ludDhfdCBpbnZmbGFnczsJCQkvKiBJbnZlcnNlIGZsYWdzICovCi19OworLyogVENQL1VEUCBtYXRjaGluZyBzdHVmZiAqLworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF90Y3B1ZHAuaD4KKworI2RlZmluZSBpcDZ0X3RjcCB4dF90Y3AKKyNkZWZpbmUgaXA2dF91ZHAgeHRfdWRwCiAKIC8qIFZhbHVlcyBmb3IgImludiIgZmllbGQgaW4gc3RydWN0IGlwdF90Y3AuICovCi0jZGVmaW5lIElQNlRfVENQX0lOVl9TUkNQVAkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2Ygc291cmNlIHBvcnRzLiAqLwotI2RlZmluZSBJUDZUX1RDUF9JTlZfRFNUUFQJMHgwMgkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIGRlc3QgcG9ydHMuICovCi0jZGVmaW5lIElQNlRfVENQX0lOVl9GTEFHUwkweDA0CS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgVENQIGZsYWdzLiAqLwotI2RlZmluZSBJUDZUX1RDUF9JTlZfT1BUSU9OCTB4MDgJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBvcHRpb24gdGVzdC4gKi8KLSNkZWZpbmUgSVA2VF9UQ1BfSU5WX01BU0sJMHgwRgkvKiBBbGwgcG9zc2libGUgZmxhZ3MuICovCi0KLS8qIFVEUCBtYXRjaGluZyBzdHVmZiAqLwotc3RydWN0IGlwNnRfdWRwCi17Ci0JdV9pbnQxNl90IHNwdHNbMl07CQkJLyogU291cmNlIHBvcnQgcmFuZ2UuICovCi0JdV9pbnQxNl90IGRwdHNbMl07CQkJLyogRGVzdGluYXRpb24gcG9ydCByYW5nZS4gKi8KLQl1X2ludDhfdCBpbnZmbGFnczsJCQkvKiBJbnZlcnNlIGZsYWdzICovCi19OworI2RlZmluZSBJUDZUX1RDUF9JTlZfU1JDUFQJWFRfVENQX0lOVl9TUkNQVAorI2RlZmluZSBJUDZUX1RDUF9JTlZfRFNUUFQJWFRfVENQX0lOVl9EU1RQVAorI2RlZmluZSBJUDZUX1RDUF9JTlZfRkxBR1MJWFRfVENQX0lOVl9GTEFHUworI2RlZmluZSBJUDZUX1RDUF9JTlZfT1BUSU9OCVhUX1RDUF9JTlZfT1BUSU9OCisjZGVmaW5lIElQNlRfVENQX0lOVl9NQVNLCVhUX1RDUF9JTlZfTUFTSwogCiAvKiBWYWx1ZXMgZm9yICJpbnZmbGFncyIgZmllbGQgaW4gc3RydWN0IGlwdF91ZHAuICovCi0jZGVmaW5lIElQNlRfVURQX0lOVl9TUkNQVAkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2Ygc291cmNlIHBvcnRzLiAqLwotI2RlZmluZSBJUDZUX1VEUF9JTlZfRFNUUFQJMHgwMgkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIGRlc3QgcG9ydHMuICovCi0jZGVmaW5lIElQNlRfVURQX0lOVl9NQVNLCTB4MDMJLyogQWxsIHBvc3NpYmxlIGZsYWdzLiAqLworI2RlZmluZSBJUDZUX1VEUF9JTlZfU1JDUFQJWFRfVURQX0lOVl9TUkNQVAorI2RlZmluZSBJUDZUX1VEUF9JTlZfRFNUUFQJWFRfVURQX0lOVl9EU1RQVAorI2RlZmluZSBJUDZUX1VEUF9JTlZfTUFTSwlYVF9VRFBfSU5WX01BU0sKIAogLyogSUNNUCBtYXRjaGluZyBzdHVmZiAqLwogc3RydWN0IGlwNnRfaWNtcApAQCAtMjY0LDIzICsyNTUsMTQgQEAKIAkvKiBOdW1iZXIgb2YgY291bnRlcnMgKG11c3QgYmUgZXF1YWwgdG8gY3VycmVudCBudW1iZXIgb2YgZW50cmllcykuICovCiAJdW5zaWduZWQgaW50IG51bV9jb3VudGVyczsKIAkvKiBUaGUgb2xkIGVudHJpZXMnIGNvdW50ZXJzLiAqLwotCXN0cnVjdCBpcDZ0X2NvdW50ZXJzIF9fdXNlciAqY291bnRlcnM7CisJc3RydWN0IHh0X2NvdW50ZXJzIF9fdXNlciAqY291bnRlcnM7CiAKIAkvKiBUaGUgZW50cmllcyAoaGFuZyBvZmYgZW5kOiBub3QgcmVhbGx5IGFuIGFycmF5KS4gKi8KIAlzdHJ1Y3QgaXA2dF9lbnRyeSBlbnRyaWVzWzBdOwogfTsKIAogLyogVGhlIGFyZ3VtZW50IHRvIElQNlRfU09fQUREX0NPVU5URVJTLiAqLwotc3RydWN0IGlwNnRfY291bnRlcnNfaW5mbwotewotCS8qIFdoaWNoIHRhYmxlLiAqLwotCWNoYXIgbmFtZVtJUDZUX1RBQkxFX01BWE5BTUVMRU5dOwotCi0JdW5zaWduZWQgaW50IG51bV9jb3VudGVyczsKLQotCS8qIFRoZSBjb3VudGVycyAoYWN0dWFsbHkgYG51bWJlcicgb2YgdGhlc2UpLiAqLwotCXN0cnVjdCBpcDZ0X2NvdW50ZXJzIGNvdW50ZXJzWzBdOwotfTsKKyNkZWZpbmUgaXA2dF9jb3VudGVyc19pbmZvIHh0X2NvdW50ZXJzX2luZm8KIAogLyogVGhlIGFyZ3VtZW50IHRvIElQNlRfU09fR0VUX0VOVFJJRVMuICovCiBzdHJ1Y3QgaXA2dF9nZXRfZW50cmllcwpAQCAtMjk1LDE5ICsyNzcsMTAgQEAKIAlzdHJ1Y3QgaXA2dF9lbnRyeSBlbnRyeXRhYmxlWzBdOwogfTsKIAotLyogVGhlIGFyZ3VtZW50IHRvIElQNlRfU09fR0VUX1JFVklTSU9OXyouICBSZXR1cm5zIGhpZ2hlc3QgcmV2aXNpb24KLSAqIGtlcm5lbCBzdXBwb3J0cywgaWYgPj0gcmV2aXNpb24uICovCi1zdHJ1Y3QgaXA2dF9nZXRfcmV2aXNpb24KLXsKLQljaGFyIG5hbWVbSVA2VF9GVU5DVElPTl9NQVhOQU1FTEVOLTFdOwotCi0JdV9pbnQ4X3QgcmV2aXNpb247Ci19OwotCiAvKiBTdGFuZGFyZCByZXR1cm4gdmVyZGljdCwgb3IgZG8ganVtcC4gKi8KLSNkZWZpbmUgSVA2VF9TVEFOREFSRF9UQVJHRVQgIiIKKyNkZWZpbmUgSVA2VF9TVEFOREFSRF9UQVJHRVQgWFRfU1RBTkRBUkRfVEFSR0VUCiAvKiBFcnJvciB2ZXJkaWN0LiAqLwotI2RlZmluZSBJUDZUX0VSUk9SX1RBUkdFVCAiRVJST1IiCisjZGVmaW5lIElQNlRfRVJST1JfVEFSR0VUIFhUX0VSUk9SX1RBUkdFVAogCiAvKiBIZWxwZXIgZnVuY3Rpb25zICovCiBzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgaXA2dF9lbnRyeV90YXJnZXQgKgpAQCAtMzYxLDEwNCArMzM0LDExIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogZXh0ZXJuIHZvaWQgaXA2dF9pbml0KHZvaWQpIF9faW5pdDsKIAotc3RydWN0IGlwNnRfbWF0Y2gKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisjZGVmaW5lIGlwNnRfcmVnaXN0ZXJfdGFyZ2V0KHRndCkgeHRfcmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQ2LCB0Z3QpCisjZGVmaW5lIGlwNnRfdW5yZWdpc3Rlcl90YXJnZXQodGd0KSB4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgdGd0KQogCi0JY29uc3QgY2hhciBuYW1lW0lQNlRfRlVOQ1RJT05fTUFYTkFNRUxFTi0xXTsKLQotCXVfaW50OF90IHJldmlzaW9uOwotCi0JLyogUmV0dXJuIHRydWUgb3IgZmFsc2U6IHJldHVybiBGQUxTRSBhbmQgc2V0ICpob3Rkcm9wID0gMSB0bwotICAgICAgICAgICBmb3JjZSBpbW1lZGlhdGUgcGFja2V0IGRyb3AuICovCi0JLyogQXJndW1lbnRzIGNoYW5nZWQgc2luY2UgMi42LjksIGFzIHRoaXMgbXVzdCBub3cgaGFuZGxlCi0JICAgbm9uLWxpbmVhciBza2IsIHVzaW5nIHNrYl9oZWFkZXJfcG9pbnRlciBhbmQKLQkgICBza2JfaXBfbWFrZV93cml0YWJsZS4gKi8KLQlpbnQgKCptYXRjaCkoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCi0JCSAgICAgaW50IG9mZnNldCwKLQkJICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLQkJICAgICBpbnQgKmhvdGRyb3ApOwotCi0JLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwotCS8qIFNob3VsZCByZXR1cm4gdHJ1ZSBvciBmYWxzZS4gKi8KLQlpbnQgKCpjaGVja2VudHJ5KShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCQkgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCi0JCQkgIHZvaWQgKm1hdGNoaW5mbywKLQkJCSAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCi0JCQkgIHVuc2lnbmVkIGludCBob29rX21hc2spOwotCi0JLyogQ2FsbGVkIHdoZW4gZW50cnkgb2YgdGhpcyB0eXBlIGRlbGV0ZWQuICovCi0Jdm9pZCAoKmRlc3Ryb3kpKHZvaWQgKm1hdGNoaW5mbywgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUpOwotCi0JLyogU2V0IHRoaXMgdG8gVEhJU19NT0RVTEUgaWYgeW91IGFyZSBhIG1vZHVsZSwgb3RoZXJ3aXNlIE5VTEwgKi8KLQlzdHJ1Y3QgbW9kdWxlICptZTsKLX07Ci0KLS8qIFJlZ2lzdHJhdGlvbiBob29rcyBmb3IgdGFyZ2V0cy4gKi8KLXN0cnVjdCBpcDZ0X3RhcmdldAotewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCWNvbnN0IGNoYXIgbmFtZVtJUDZUX0ZVTkNUSU9OX01BWE5BTUVMRU4tMV07Ci0KLQl1X2ludDhfdCByZXZpc2lvbjsKLQotCS8qIFJldHVybnMgdmVyZGljdC4gQXJndW1lbnQgb3JkZXIgY2hhbmdlZCBzaW5jZSAyLjYuOSwgYXMgdGhpcwotCSAgIG11c3Qgbm93IGhhbmRsZSBub24tbGluZWFyIHNrYnMsIHVzaW5nIHNrYl9jb3B5X2JpdHMgYW5kCi0JICAgc2tiX2lwX21ha2Vfd3JpdGFibGUuICovCi0JdW5zaWduZWQgaW50ICgqdGFyZ2V0KShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCi0JCQkgICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCi0JCQkgICAgICAgdm9pZCAqdXNlcmRhdGEpOwotCi0JLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlOgotICAgICAgICAgICBob29rX21hc2sgaXMgYSBiaXRtYXNrIG9mIGhvb2tzIGZyb20gd2hpY2ggaXQgY2FuIGJlCi0gICAgICAgICAgIGNhbGxlZC4gKi8KLQkvKiBTaG91bGQgcmV0dXJuIHRydWUgb3IgZmFsc2UuICovCi0JaW50ICgqY2hlY2tlbnRyeSkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkJICBjb25zdCBzdHJ1Y3QgaXA2dF9lbnRyeSAqZSwKLQkJCSAgdm9pZCAqdGFyZ2luZm8sCi0JCQkgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCi0JCQkgIHVuc2lnbmVkIGludCBob29rX21hc2spOwotCi0JLyogQ2FsbGVkIHdoZW4gZW50cnkgb2YgdGhpcyB0eXBlIGRlbGV0ZWQuICovCi0Jdm9pZCAoKmRlc3Ryb3kpKHZvaWQgKnRhcmdpbmZvLCB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplKTsKLQotCS8qIFNldCB0aGlzIHRvIFRISVNfTU9EVUxFIGlmIHlvdSBhcmUgYSBtb2R1bGUsIG90aGVyd2lzZSBOVUxMICovCi0Jc3RydWN0IG1vZHVsZSAqbWU7Ci19OwotCi1leHRlcm4gaW50IGlwNnRfcmVnaXN0ZXJfdGFyZ2V0KHN0cnVjdCBpcDZ0X3RhcmdldCAqdGFyZ2V0KTsKLWV4dGVybiB2b2lkIGlwNnRfdW5yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGlwNnRfdGFyZ2V0ICp0YXJnZXQpOwotCi1leHRlcm4gaW50IGlwNnRfcmVnaXN0ZXJfbWF0Y2goc3RydWN0IGlwNnRfbWF0Y2ggKm1hdGNoKTsKLWV4dGVybiB2b2lkIGlwNnRfdW5yZWdpc3Rlcl9tYXRjaChzdHJ1Y3QgaXA2dF9tYXRjaCAqbWF0Y2gpOwotCi0vKiBGdXJuaXR1cmUgc2hvcHBpbmcuLi4gKi8KLXN0cnVjdCBpcDZ0X3RhYmxlCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCi0JLyogQSB1bmlxdWUgbmFtZS4uLiAqLwotCWNoYXIgbmFtZVtJUDZUX1RBQkxFX01BWE5BTUVMRU5dOwotCi0JLyogV2hhdCBob29rcyB5b3Ugd2lsbCBlbnRlciBvbiAqLwotCXVuc2lnbmVkIGludCB2YWxpZF9ob29rczsKLQotCS8qIExvY2sgZm9yIHRoZSBjdXJ0YWluICovCi0Jcndsb2NrX3QgbG9jazsKLQotCS8qIE1hbiBiZWhpbmQgdGhlIGN1cnRhaW4uLi4gKi8KLQlzdHJ1Y3QgaXA2dF90YWJsZV9pbmZvICpwcml2YXRlOwotCi0JLyogU2V0IHRoaXMgdG8gVEhJU19NT0RVTEUgaWYgeW91IGFyZSBhIG1vZHVsZSwgb3RoZXJ3aXNlIE5VTEwgKi8KLQlzdHJ1Y3QgbW9kdWxlICptZTsKLX07CisjZGVmaW5lIGlwNnRfcmVnaXN0ZXJfbWF0Y2gobWF0Y2gpIHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCBtYXRjaCkKKyNkZWZpbmUgaXA2dF91bnJlZ2lzdGVyX21hdGNoKG1hdGNoKSB4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCBtYXRjaCkKIAogZXh0ZXJuIGludCBpcDZ0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCBpcDZ0X3RhYmxlICp0YWJsZSwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9yZXBsYWNlICpyZXBsKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9NQVJLLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfTUFSSy5oCmluZGV4IDdhZGU4ZDguLjdjZjYyOWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9NQVJLLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X01BUksuaApAQCAtMSw4ICsxLDkgQEAKICNpZm5kZWYgX0lQNlRfTUFSS19IX3RhcmdldAogI2RlZmluZSBfSVA2VF9NQVJLX0hfdGFyZ2V0CiAKLXN0cnVjdCBpcDZ0X21hcmtfdGFyZ2V0X2luZm8gewotCXVuc2lnbmVkIGxvbmcgbWFyazsKLX07CisvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3Igb2xkIHVzZXJzcGFjZSAqLworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9NQVJLLmg+CiAKLSNlbmRpZiAvKl9JUFRfTUFSS19IX3RhcmdldCovCisjZGVmaW5lIGlwNnRfbWFya190YXJnZXRfaW5mbyB4dF9tYXJrX3RhcmdldF9pbmZvCisKKyNlbmRpZiAvKl9JUDZUX01BUktfSF90YXJnZXQqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2FoLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfYWguaAppbmRleCBjNGYwNzkzLi44NTMxODc5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfYWguaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfYWguaApAQCAtMTgsMTMgKzE4LDQgQEAKICNkZWZpbmUgSVA2VF9BSF9JTlZfTEVOCQkweDAyCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgbGVuZ3RoLiAqLwogI2RlZmluZSBJUDZUX0FIX0lOVl9NQVNLCTB4MDMJLyogQWxsIHBvc3NpYmxlIGZsYWdzLiAqLwogCi0jZGVmaW5lIE1BU0tfSE9QT1BUUyAgICAxMjgKLSNkZWZpbmUgTUFTS19EU1RPUFRTICAgIDY0Ci0jZGVmaW5lIE1BU0tfUk9VVElORyAgICAzMgotI2RlZmluZSBNQVNLX0ZSQUdNRU5UICAgMTYKLSNkZWZpbmUgTUFTS19BSCAgICAgICAgIDgKLSNkZWZpbmUgTUFTS19FU1AgICAgICAgIDQKLSNkZWZpbmUgTUFTS19OT05FICAgICAgIDIKLSNkZWZpbmUgTUFTS19QUk9UTyAgICAgIDEKLQogI2VuZGlmIC8qX0lQNlRfQUhfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfZXNwLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfZXNwLmgKaW5kZXggMDExNDJiOS4uYTkxYjZhYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2VzcC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9lc3AuaApAQCAtNywxNSArNyw2IEBACiAJdV9pbnQ4X3QgIGludmZsYWdzOwkJCS8qIEludmVyc2UgZmxhZ3MgKi8KIH07CiAKLSNkZWZpbmUgTUFTS19IT1BPUFRTICAgIDEyOAotI2RlZmluZSBNQVNLX0RTVE9QVFMgICAgNjQKLSNkZWZpbmUgTUFTS19ST1VUSU5HICAgIDMyCi0jZGVmaW5lIE1BU0tfRlJBR01FTlQgICAxNgotI2RlZmluZSBNQVNLX0FIICAgICAgICAgOAotI2RlZmluZSBNQVNLX0VTUCAgICAgICAgNAotI2RlZmluZSBNQVNLX05PTkUgICAgICAgMgotI2RlZmluZSBNQVNLX1BST1RPICAgICAgMQotCiAvKiBWYWx1ZXMgZm9yICJpbnZmbGFncyIgZmllbGQgaW4gc3RydWN0IGlwNnRfZXNwLiAqLwogI2RlZmluZSBJUDZUX0VTUF9JTlZfU1BJCQkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2Ygc3BpLiAqLwogI2RlZmluZSBJUDZUX0VTUF9JTlZfTUFTSwkweDAxCS8qIEFsbCBwb3NzaWJsZSBmbGFncy4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9mcmFnLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfZnJhZy5oCmluZGV4IDQ0OWE1N2UuLjY2MDcwYTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9mcmFnLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2ZyYWcuaApAQCAtMjEsMTMgKzIxLDQgQEAKICNkZWZpbmUgSVA2VF9GUkFHX0lOVl9MRU4JMHgwMgkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIGxlbmd0aC4gKi8KICNkZWZpbmUgSVA2VF9GUkFHX0lOVl9NQVNLCTB4MDMJLyogQWxsIHBvc3NpYmxlIGZsYWdzLiAqLwogCi0jZGVmaW5lIE1BU0tfSE9QT1BUUyAgICAxMjgKLSNkZWZpbmUgTUFTS19EU1RPUFRTICAgIDY0Ci0jZGVmaW5lIE1BU0tfUk9VVElORyAgICAzMgotI2RlZmluZSBNQVNLX0ZSQUdNRU5UICAgMTYKLSNkZWZpbmUgTUFTS19BSCAgICAgICAgIDgKLSNkZWZpbmUgTUFTS19FU1AgICAgICAgIDQKLSNkZWZpbmUgTUFTS19OT05FICAgICAgIDIKLSNkZWZpbmUgTUFTS19QUk9UTyAgICAgIDEKLQogI2VuZGlmIC8qX0lQNlRfRlJBR19IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9sZW5ndGguaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9sZW5ndGguaAppbmRleCA3ZmMwOWY5Li45ZTk2ODlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbGVuZ3RoLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2xlbmd0aC5oCkBAIC0xLDEwICsxLDggQEAKICNpZm5kZWYgX0lQNlRfTEVOR1RIX0gKICNkZWZpbmUgX0lQNlRfTEVOR1RIX0gKIAotc3RydWN0IGlwNnRfbGVuZ3RoX2luZm8gewotCXVfaW50MTZfdCAgbWluLCBtYXg7Ci0JdV9pbnQ4X3QgICBpbnZlcnQ7Ci19OworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9sZW5ndGguaD4KKyNkZWZpbmUgaXA2dF9sZW5ndGhfaW5mbyB4dF9sZW5ndGhfaW5mbwogCiAjZW5kaWYgLypfSVA2VF9MRU5HVEhfSCovCiAJCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbGltaXQuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9saW1pdC5oCmluZGV4IGYyODY2ZTUuLjQ4N2U1ZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9saW1pdC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9saW1pdC5oCkBAIC0xLDIxICsxLDggQEAKICNpZm5kZWYgX0lQNlRfUkFURV9ICiAjZGVmaW5lIF9JUDZUX1JBVEVfSAogCi0vKiB0aW1pbmdzIGFyZSBpbiBtaWxsaXNlY29uZHMuICovCi0jZGVmaW5lIElQNlRfTElNSVRfU0NBTEUgMTAwMDAKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbGltaXQuaD4KKyNkZWZpbmUgSVA2VF9MSU1JVF9TQ0FMRSBYVF9MSU1JVF9TQ0FMRQorI2RlZmluZSBpcDZ0X3JhdGVpbmZvIHh0X3JhdGVpbmZvCiAKLS8qIDEvMTAsMDAwIHNlYyBwZXJpb2QgPT4gbWF4IG9mIDEwLDAwMC9zZWMuICBNaW4gcmF0ZSBpcyB0aGVuIDQyOTQ5MAotICAgc2Vjb25kcywgb3Igb25lIGV2ZXJ5IDU5IGhvdXJzLiAqLwotc3RydWN0IGlwNnRfcmF0ZWluZm8gewotCXVfaW50MzJfdCBhdmc7ICAgIC8qIEF2ZXJhZ2Ugc2VjcyBiZXR3ZWVuIHBhY2tldHMgKiBzY2FsZSAqLwotCXVfaW50MzJfdCBidXJzdDsgIC8qIFBlcmlvZCBtdWx0aXBsaWVyIGZvciB1cHBlciBsaW1pdC4gKi8KLQotCS8qIFVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsICovCi0JdW5zaWduZWQgbG9uZyBwcmV2OwotCXVfaW50MzJfdCBjcmVkaXQ7Ci0JdV9pbnQzMl90IGNyZWRpdF9jYXAsIGNvc3Q7Ci0KLQkvKiBVZ2x5LCB1Z2x5IGZ1Y2tlci4gKi8KLQlzdHJ1Y3QgaXA2dF9yYXRlaW5mbyAqbWFzdGVyOwotfTsKLSNlbmRpZiAvKl9JUFRfUkFURV9IKi8KKyNlbmRpZiAvKl9JUDZUX1JBVEVfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbWFjLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbWFjLmgKaW5kZXggODdjMDg4Yy4uYWM1OGU4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21hYy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9tYWMuaApAQCAtMSw4ICsxLDcgQEAKICNpZm5kZWYgX0lQNlRfTUFDX0gKICNkZWZpbmUgX0lQNlRfTUFDX0gKIAotc3RydWN0IGlwNnRfbWFjX2luZm8gewotICAgIHVuc2lnbmVkIGNoYXIgc3JjYWRkcltFVEhfQUxFTl07Ci0gICAgaW50IGludmVydDsKLX07Ci0jZW5kaWYgLypfSVBUX01BQ19IKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbWFjLmg+CisjZGVmaW5lIGlwNnRfbWFjX2luZm8geHRfbWFjX2luZm8KKworI2VuZGlmIC8qX0lQNlRfTUFDX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21hcmsuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9tYXJrLmgKaW5kZXggYTczNDQ0MS4uZmYyMDQ5NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21hcmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbWFyay5oCkBAIC0xLDkgKzEsOSBAQAogI2lmbmRlZiBfSVA2VF9NQVJLX0gKICNkZWZpbmUgX0lQNlRfTUFSS19ICiAKLXN0cnVjdCBpcDZ0X21hcmtfaW5mbyB7Ci0gICAgdW5zaWduZWQgbG9uZyBtYXJrLCBtYXNrOwotICAgIHVfaW50OF90IGludmVydDsKLX07CisvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3Igb2xkIHVzZXJzcGFjZSAqLworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9tYXJrLmg+CisKKyNkZWZpbmUgaXA2dF9tYXJrX2luZm8geHRfbWFya19pbmZvCiAKICNlbmRpZiAvKl9JUFRfTUFSS19IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9vcHRzLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfb3B0cy5oCmluZGV4IGUyNTliNjI3Li5hMDdlMzYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfb3B0cy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9vcHRzLmgKQEAgLTIwLDEzICsyMCw0IEBACiAjZGVmaW5lIElQNlRfT1BUU19JTlZfTEVOCTB4MDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBsZW5ndGguICovCiAjZGVmaW5lIElQNlRfT1BUU19JTlZfTUFTSwkweDAxCS8qIEFsbCBwb3NzaWJsZSBmbGFncy4gKi8KIAotI2RlZmluZSBNQVNLX0hPUE9QVFMgICAgMTI4Ci0jZGVmaW5lIE1BU0tfRFNUT1BUUyAgICA2NAotI2RlZmluZSBNQVNLX1JPVVRJTkcgICAgMzIKLSNkZWZpbmUgTUFTS19GUkFHTUVOVCAgIDE2Ci0jZGVmaW5lIE1BU0tfQUggICAgICAgICA4Ci0jZGVmaW5lIE1BU0tfRVNQICAgICAgICA0Ci0jZGVmaW5lIE1BU0tfTk9ORSAgICAgICAyCi0jZGVmaW5lIE1BU0tfUFJPVE8gICAgICAxCi0KICNlbmRpZiAvKl9JUDZUX09QVFNfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfcGh5c2Rldi5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X3BoeXNkZXYuaAppbmRleCBjMjM0NzMxLi5jMTYxYzBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfcGh5c2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9waHlzZGV2LmgKQEAgLTEsMjQgKzEsMTcgQEAKICNpZm5kZWYgX0lQNlRfUEhZU0RFVl9ICiAjZGVmaW5lIF9JUDZUX1BIWVNERVZfSAogCi0jaWZkZWYgX19LRVJORUxfXwotI2luY2x1ZGUgPGxpbnV4L2lmLmg+Ci0jZW5kaWYKKy8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBvbGQgdXNlcnNwYWNlICovCiAKLSNkZWZpbmUgSVA2VF9QSFlTREVWX09QX0lOCQkweDAxCi0jZGVmaW5lIElQNlRfUEhZU0RFVl9PUF9PVVQJCTB4MDIKLSNkZWZpbmUgSVA2VF9QSFlTREVWX09QX0JSSURHRUQJCTB4MDQKLSNkZWZpbmUgSVA2VF9QSFlTREVWX09QX0lTSU4JCTB4MDgKLSNkZWZpbmUgSVA2VF9QSFlTREVWX09QX0lTT1VUCQkweDEwCi0jZGVmaW5lIElQNlRfUEhZU0RFVl9PUF9NQVNLCQkoMHgyMCAtIDEpCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuaD4KIAotc3RydWN0IGlwNnRfcGh5c2Rldl9pbmZvIHsKLQljaGFyIHBoeXNpbmRldltJRk5BTVNJWl07Ci0JY2hhciBpbl9tYXNrW0lGTkFNU0laXTsKLQljaGFyIHBoeXNvdXRkZXZbSUZOQU1TSVpdOwotCWNoYXIgb3V0X21hc2tbSUZOQU1TSVpdOwotCXVfaW50OF90IGludmVydDsKLQl1X2ludDhfdCBiaXRtYXNrOwotfTsKKyNkZWZpbmUgSVA2VF9QSFlTREVWX09QX0lOCQlYVF9QSFlTREVWX09QX0lOCisjZGVmaW5lIElQNlRfUEhZU0RFVl9PUF9PVVQJCVhUX1BIWVNERVZfT1BfT1VUCisjZGVmaW5lIElQNlRfUEhZU0RFVl9PUF9CUklER0VECQlYVF9QSFlTREVWX09QX0JSSURHRUQKKyNkZWZpbmUgSVA2VF9QSFlTREVWX09QX0lTSU4JCVhUX1BIWVNERVZfT1BfSVNJTgorI2RlZmluZSBJUDZUX1BIWVNERVZfT1BfSVNPVVQJCVhUX1BIWVNERVZfT1BfSVNPVVQKKyNkZWZpbmUgSVA2VF9QSFlTREVWX09QX01BU0sJCVhUX1BIWVNERVZfT1BfTUFTSworCisjZGVmaW5lIGlwNnRfcGh5c2Rldl9pbmZvIHh0X3BoeXNkZXZfaW5mbwogCiAjZW5kaWYgLypfSVA2VF9QSFlTREVWX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X3BvbGljeS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X3BvbGljeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOTNhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfcG9saWN5LmgKQEAgLTAsMCArMSw1MiBAQAorI2lmbmRlZiBfSVA2VF9QT0xJQ1lfSAorI2RlZmluZSBfSVA2VF9QT0xJQ1lfSAorCisjZGVmaW5lIElQNlRfUE9MSUNZX01BWF9FTEVNCTQKKworZW51bSBpcDZ0X3BvbGljeV9mbGFncworeworCUlQNlRfUE9MSUNZX01BVENIX0lOCQk9IDB4MSwKKwlJUDZUX1BPTElDWV9NQVRDSF9PVVQJCT0gMHgyLAorCUlQNlRfUE9MSUNZX01BVENIX05PTkUJCT0gMHg0LAorCUlQNlRfUE9MSUNZX01BVENIX1NUUklDVAk9IDB4OCwKK307CisKK2VudW0gaXA2dF9wb2xpY3lfbW9kZXMKK3sKKwlJUDZUX1BPTElDWV9NT0RFX1RSQU5TUE9SVCwKKwlJUDZUX1BPTElDWV9NT0RFX1RVTk5FTAorfTsKKworc3RydWN0IGlwNnRfcG9saWN5X3NwZWMKK3sKKwl1X2ludDhfdAlzYWRkcjoxLAorCQkJZGFkZHI6MSwKKwkJCXByb3RvOjEsCisJCQltb2RlOjEsCisJCQlzcGk6MSwKKwkJCXJlcWlkOjE7Cit9OworCitzdHJ1Y3QgaXA2dF9wb2xpY3lfZWxlbQoreworCXN0cnVjdCBpbjZfYWRkcglzYWRkcjsKKwlzdHJ1Y3QgaW42X2FkZHIJc21hc2s7CisJc3RydWN0IGluNl9hZGRyCWRhZGRyOworCXN0cnVjdCBpbjZfYWRkcglkbWFzazsKKwl1X2ludDMyX3QJc3BpOworCXVfaW50MzJfdAlyZXFpZDsKKwl1X2ludDhfdAlwcm90bzsKKwl1X2ludDhfdAltb2RlOworCisJc3RydWN0IGlwNnRfcG9saWN5X3NwZWMJbWF0Y2g7CisJc3RydWN0IGlwNnRfcG9saWN5X3NwZWMJaW52ZXJ0OworfTsKKworc3RydWN0IGlwNnRfcG9saWN5X2luZm8KK3sKKwlzdHJ1Y3QgaXA2dF9wb2xpY3lfZWxlbSBwb2xbSVA2VF9QT0xJQ1lfTUFYX0VMRU1dOworCXVfaW50MTZfdCBmbGFnczsKKwl1X2ludDE2X3QgbGVuOworfTsKKworI2VuZGlmIC8qIF9JUDZUX1BPTElDWV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfcnQuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9ydC5oCmluZGV4IGYxMDcwZmIuLjUyMTU2MDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9ydC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9ydC5oCkBAIC0zMCwxMyArMzAsNCBAQAogI2RlZmluZSBJUDZUX1JUX0lOVl9MRU4JCTB4MDQJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBsZW5ndGguICovCiAjZGVmaW5lIElQNlRfUlRfSU5WX01BU0sJMHgwNwkvKiBBbGwgcG9zc2libGUgZmxhZ3MuICovCiAKLSNkZWZpbmUgTUFTS19IT1BPUFRTICAgIDEyOAotI2RlZmluZSBNQVNLX0RTVE9QVFMgICAgNjQKLSNkZWZpbmUgTUFTS19ST1VUSU5HICAgIDMyCi0jZGVmaW5lIE1BU0tfRlJBR01FTlQgICAxNgotI2RlZmluZSBNQVNLX0FIICAgICAgICAgOAotI2RlZmluZSBNQVNLX0VTUCAgICAgICAgNAotI2RlZmluZSBNQVNLX05PTkUgICAgICAgMgotI2RlZmluZSBNQVNLX1BST1RPICAgICAgMQotCiAjZW5kaWYgLypfSVA2VF9SVF9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmggYi9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oCmluZGV4IDUxYzIzMWEuLmVjN2MyZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaApAQCAtMTI0LDcgKzEyNCw3IEBACiAKIGludAkJbmZzZF9ub3RpZnlfY2hhbmdlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaWF0dHIgKik7CiBpbnQJCW5mc2RfcGVybWlzc2lvbihzdHJ1Y3Qgc3ZjX2V4cG9ydCAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7Ci12b2lkCQluZnNkX3N5bmNfZGlyKHN0cnVjdCBkZW50cnkgKmRwKTsKK2ludAkJbmZzZF9zeW5jX2RpcihzdHJ1Y3QgZGVudHJ5ICpkcCk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19ORlNEX1YyX0FDTCkgfHwgZGVmaW5lZChDT05GSUdfTkZTRF9WM19BQ0wpCiAjaWZkZWYgQ09ORklHX05GU0RfVjJfQUNMCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZmguaCBiL2luY2x1ZGUvbGludXgvbmZzZC9uZnNmaC5oCmluZGV4IGJiODQyZWEuLjA3OThiNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzZC9uZnNmaC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzZC9uZnNmaC5oCkBAIC0yOTQsNyArMjk0LDcgQEAKIC8qCiAgKiBMb2NrIGEgZmlsZSBoYW5kbGUvaW5vZGUKICAqIE5PVEU6IGJvdGggZmhfbG9jayBhbmQgZmhfdW5sb2NrIGFyZSBkb25lICJieSBoYW5kIiBpbgotICogdmZzLmM6bmZzZF9yZW5hbWUgYXMgaXQgbmVlZHMgdG8gZ3JhYiAyIGlfc2VtJ3MgYXQgb25jZQorICogdmZzLmM6bmZzZF9yZW5hbWUgYXMgaXQgbmVlZHMgdG8gZ3JhYiAyIGlfbXV0ZXgncyBhdCBvbmNlCiAgKiBzbywgYW55IGNoYW5nZXMgaGVyZSBzaG91bGQgYmUgcmVmbGVjdGVkIHRoZXJlLgogICovCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTMxNyw3ICszMTcsNyBAQAogCX0KIAogCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOwotCWRvd24oJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCWZpbGxfcHJlX3djYyhmaHApOwogCWZocC0+ZmhfbG9ja2VkID0gMTsKIH0KQEAgLTMzMyw3ICszMzMsNyBAQAogCiAJaWYgKGZocC0+ZmhfbG9ja2VkKSB7CiAJCWZpbGxfcG9zdF93Y2MoZmhwKTsKLQkJdXAoJmZocC0+ZmhfZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJCW11dGV4X3VubG9jaygmZmhwLT5maF9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCQlmaHAtPmZoX2xvY2tlZCA9IDA7CiAJfQogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkL3hkcjQuaCBiL2luY2x1ZGUvbGludXgvbmZzZC94ZHI0LmgKaW5kZXggODkwMzY4OC4uNzdhZGJhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL3hkcjQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc2QveGRyNC5oCkBAIC0xNDUsOCArMTQ1LDkgQEAKIAkJfSBvazsKIAkJc3RydWN0IG5mc2Q0X2xvY2tfZGVuaWVkICAgICAgICBkZW5pZWQ7CiAJfSB1OwotCi0Jc3RydWN0IG5mczRfc3RhdGVvd25lciAqbGtfc3RhdGVvd25lcjsKKwkvKiBUaGUgbGtfcmVwbGF5X293bmVyIGlzIHRoZSBvcGVuIG93bmVyIGluIHRoZSBvcGVuX3RvX2xvY2tfb3duZXIKKwkgKiBjYXNlIGFuZCB0aGUgbG9jayBvd25lciBvdGhlcndpc2U6ICovCisJc3RydWN0IG5mczRfc3RhdGVvd25lciAqbGtfcmVwbGF5X293bmVyOwogfTsKICNkZWZpbmUgbGtfbmV3X29wZW5fc2VxaWQgICAgICAgdi5uZXcub3Blbl9zZXFpZAogI2RlZmluZSBsa19uZXdfb3Blbl9zdGF0ZWlkICAgICB2Lm5ldy5vcGVuX3N0YXRlaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGFnZXZlYy5oIGIvaW5jbHVkZS9saW51eC9wYWdldmVjLmgKaW5kZXggZGVmMzJjNS4uOGViN2ZhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wYWdldmVjLmgKKysrIGIvaW5jbHVkZS9saW51eC9wYWdldmVjLmgKQEAgLTUsNiArNSw5IEBACiAgKiBwYWdlcy4gIEEgcGFnZXZlYyBpcyBhIG11bHRpcGFnZSBjb250YWluZXIgd2hpY2ggaXMgdXNlZCBmb3IgdGhhdC4KICAqLwogCisjaWZuZGVmIF9MSU5VWF9QQUdFVkVDX0gKKyNkZWZpbmUgX0xJTlVYX1BBR0VWRUNfSAorCiAvKiAxNCBwb2ludGVycyArIHR3byBsb25nJ3MgYWxpZ24gdGhlIHBhZ2V2ZWMgc3RydWN0dXJlIHRvIGEgcG93ZXIgb2YgdHdvICovCiAjZGVmaW5lIFBBR0VWRUNfU0laRQkxNAogCkBAIC04MywzICs4Niw1IEBACiAJaWYgKHBhZ2V2ZWNfY291bnQocHZlYykpCiAJCV9fcGFnZXZlY19scnVfYWRkKHB2ZWMpOwogfQorCisjZW5kaWYgLyogX0xJTlVYX1BBR0VWRUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wYXJwb3J0LmggYi9pbmNsdWRlL2xpbnV4L3BhcnBvcnQuaAppbmRleCBmN2ZmMGIwLi5mNjdmODM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BhcnBvcnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BhcnBvcnQuaApAQCAtMjM2LDEyICsyMzYsMTQgQEAKIAogLyogSUVFRTEyODQgaW5mb3JtYXRpb24gKi8KIAotLyogSUVFRTEyODQgcGhhc2VzICovCisvKiBJRUVFMTI4NCBwaGFzZXMuIFRoZXNlIGFyZSBleHBvc2VkIHRvIHVzZXJsYW5kIHRocm91Z2ggcHBkZXYgSU9DVEwKKyAqIFBQW0dTXUVUUEhBU0UsIHNvIGRvIG5vdCBjaGFuZ2UgZXhpc3RpbmcgdmFsdWVzLiAqLwogZW51bSBpZWVlMTI4NF9waGFzZSB7CiAJSUVFRTEyODRfUEhfRldEX0RBVEEsCiAJSUVFRTEyODRfUEhfRldEX0lETEUsCiAJSUVFRTEyODRfUEhfVEVSTUlOQVRFLAogCUlFRUUxMjg0X1BIX05FR09USUFUSU9OLAorCUlFRUUxMjg0X1BIX0hCVVNZX0ROQSwKIAlJRUVFMTI4NF9QSF9SRVZfSURMRSwKIAlJRUVFMTI4NF9QSF9IQlVTWV9EQVZBSUwsCiAJSUVFRTEyODRfUEhfUkVWX0RBVEEsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaS5oIGIvaW5jbHVkZS9saW51eC9wY2kuaAppbmRleCBkZTY5MGNhLi4wYTQ0MDcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpLmgKQEAgLTc4LDYgKzc4LDIzIEBACiAjZGVmaW5lIFBDSV9VTktOT1dOCSgocGNpX3Bvd2VyX3QgX19mb3JjZSkgNSkKICNkZWZpbmUgUENJX1BPV0VSX0VSUk9SCSgocGNpX3Bvd2VyX3QgX19mb3JjZSkgLTEpCiAKKy8qKiBUaGUgcGNpX2NoYW5uZWwgc3RhdGUgZGVzY3JpYmVzIGNvbm5lY3Rpdml0eSBiZXR3ZWVuIHRoZSBDUFUgYW5kCisgKiAgdGhlIHBjaSBkZXZpY2UuICBJZiBzb21lIFBDSSBidXMgYmV0d2VlbiBoZXJlIGFuZCB0aGUgcGNpIGRldmljZQorICogIGhhcyBjcmFzaGVkIG9yIGxvY2tlZCB1cCwgdGhpcyBpbmZvIGlzIHJlZmxlY3RlZCBoZXJlLgorICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBfX2JpdHdpc2UgcGNpX2NoYW5uZWxfc3RhdGVfdDsKKworZW51bSBwY2lfY2hhbm5lbF9zdGF0ZSB7CisJLyogSS9PIGNoYW5uZWwgaXMgaW4gbm9ybWFsIHN0YXRlICovCisJcGNpX2NoYW5uZWxfaW9fbm9ybWFsID0gKF9fZm9yY2UgcGNpX2NoYW5uZWxfc3RhdGVfdCkgMSwKKworCS8qIEkvTyB0byBjaGFubmVsIGlzIGJsb2NrZWQgKi8KKwlwY2lfY2hhbm5lbF9pb19mcm96ZW4gPSAoX19mb3JjZSBwY2lfY2hhbm5lbF9zdGF0ZV90KSAyLAorCisJLyogUENJIGNhcmQgaXMgZGVhZCAqLworCXBjaV9jaGFubmVsX2lvX3Blcm1fZmFpbHVyZSA9IChfX2ZvcmNlIHBjaV9jaGFubmVsX3N0YXRlX3QpIDMsCit9OworCiAvKgogICogVGhlIHBjaV9kZXYgc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVzY3JpYmUgUENJIGRldmljZXMuCiAgKi8KQEAgLTk4LDYgKzExNSw3IEBACiAJdW5zaWduZWQgaW50CWNsYXNzOwkJLyogMyBieXRlczogKGJhc2Usc3ViLHByb2ctaWYpICovCiAJdTgJCWhkcl90eXBlOwkvKiBQQ0kgaGVhZGVyIHR5cGUgKGBtdWx0aScgZmxhZyBtYXNrZWQgb3V0KSAqLwogCXU4CQlyb21fYmFzZV9yZWc7CS8qIHdoaWNoIGNvbmZpZyByZWdpc3RlciBjb250cm9scyB0aGUgUk9NICovCisJdTgJCXBpbjsgIAkJLyogd2hpY2ggaW50ZXJydXB0IHBpbiB0aGlzIGRldmljZSB1c2VzICovCiAKIAlzdHJ1Y3QgcGNpX2RyaXZlciAqZHJpdmVyOwkvKiB3aGljaCBkcml2ZXIgaGFzIGFsbG9jYXRlZCB0aGlzIGRldmljZSAqLwogCXU2NAkJZG1hX21hc2s7CS8qIE1hc2sgb2YgdGhlIGJpdHMgb2YgYnVzIGFkZHJlc3MgdGhpcwpAQCAtMTEwLDYgKzEyOCw3IEBACiAJCQkJCSAgIHRoaXMgaXMgRDAtRDMsIEQwIGJlaW5nIGZ1bGx5IGZ1bmN0aW9uYWwsCiAJCQkJCSAgIGFuZCBEMyBiZWluZyBvZmYuICovCiAKKwlwY2lfY2hhbm5lbF9zdGF0ZV90IGVycm9yX3N0YXRlOwkvKiBjdXJyZW50IGNvbm5lY3Rpdml0eSBzdGF0ZSAqLwogCXN0cnVjdAlkZXZpY2UJZGV2OwkJLyogR2VuZXJpYyBkZXZpY2UgaW50ZXJmYWNlICovCiAKIAkvKiBkZXZpY2UgaXMgY29tcGF0aWJsZSB3aXRoIHRoZXNlIElEcyAqLwpAQCAtMjMyLDYgKzI1MSw1NCBAQAogCXVuc2lnbmVkIGludCB1c2VfZHJpdmVyX2RhdGE6MTsgLyogcGNpX2RyaXZlci0+ZHJpdmVyX2RhdGEgaXMgdXNlZCAqLwogfTsKIAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqIFBDSSBFcnJvciBSZWNvdmVyeSBTeXN0ZW0gKFBDSS1FUlMpLiAgSWYgYSBQQ0kgZGV2aWNlIGRyaXZlciBwcm92aWRlcworICogIGEgc2V0IGZvZiBjYWxsYmFja3MgaW4gc3RydWN0IHBjaV9lcnJvcl9oYW5kbGVycywgdGhlbiB0aGF0IGRldmljZSBkcml2ZXIKKyAqICB3aWxsIGJlIG5vdGlmaWVkIG9mIFBDSSBidXMgZXJyb3JzLCBhbmQgd2lsbCBiZSBkcml2ZW4gdG8gcmVjb3ZlcnkKKyAqICB3aGVuIGFuIGVycm9yIG9jY3Vycy4KKyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGludCBfX2JpdHdpc2UgcGNpX2Vyc19yZXN1bHRfdDsKKworZW51bSBwY2lfZXJzX3Jlc3VsdCB7CisJLyogbm8gcmVzdWx0L25vbmUvbm90IHN1cHBvcnRlZCBpbiBkZXZpY2UgZHJpdmVyICovCisJUENJX0VSU19SRVNVTFRfTk9ORSA9IChfX2ZvcmNlIHBjaV9lcnNfcmVzdWx0X3QpIDEsCisKKwkvKiBEZXZpY2UgZHJpdmVyIGNhbiByZWNvdmVyIHdpdGhvdXQgc2xvdCByZXNldCAqLworCVBDSV9FUlNfUkVTVUxUX0NBTl9SRUNPVkVSID0gKF9fZm9yY2UgcGNpX2Vyc19yZXN1bHRfdCkgMiwKKworCS8qIERldmljZSBkcml2ZXIgd2FudHMgc2xvdCB0byBiZSByZXNldC4gKi8KKwlQQ0lfRVJTX1JFU1VMVF9ORUVEX1JFU0VUID0gKF9fZm9yY2UgcGNpX2Vyc19yZXN1bHRfdCkgMywKKworCS8qIERldmljZSBoYXMgY29tcGxldGVseSBmYWlsZWQsIGlzIHVucmVjb3ZlcmFibGUgKi8KKwlQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUID0gKF9fZm9yY2UgcGNpX2Vyc19yZXN1bHRfdCkgNCwKKworCS8qIERldmljZSBkcml2ZXIgaXMgZnVsbHkgcmVjb3ZlcmVkIGFuZCBvcGVyYXRpb25hbCAqLworCVBDSV9FUlNfUkVTVUxUX1JFQ09WRVJFRCA9IChfX2ZvcmNlIHBjaV9lcnNfcmVzdWx0X3QpIDUsCit9OworCisvKiBQQ0kgYnVzIGVycm9yIGV2ZW50IGNhbGxiYWNrcyAqLworc3RydWN0IHBjaV9lcnJvcl9oYW5kbGVycworeworCS8qIFBDSSBidXMgZXJyb3IgZGV0ZWN0ZWQgb24gdGhpcyBkZXZpY2UgKi8KKwlwY2lfZXJzX3Jlc3VsdF90ICgqZXJyb3JfZGV0ZWN0ZWQpKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJICAgICAgICAgICAgICAgICAgICAgIGVudW0gcGNpX2NoYW5uZWxfc3RhdGUgZXJyb3IpOworCisJLyogTU1JTyBoYXMgYmVlbiByZS1lbmFibGVkLCBidXQgbm90IERNQSAqLworCXBjaV9lcnNfcmVzdWx0X3QgKCptbWlvX2VuYWJsZWQpKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCisJLyogUENJIEV4cHJlc3MgbGluayBoYXMgYmVlbiByZXNldCAqLworCXBjaV9lcnNfcmVzdWx0X3QgKCpsaW5rX3Jlc2V0KShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKKworCS8qIFBDSSBzbG90IGhhcyBiZWVuIHJlc2V0ICovCisJcGNpX2Vyc19yZXN1bHRfdCAoKnNsb3RfcmVzZXQpKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCisJLyogRGV2aWNlIGRyaXZlciBtYXkgcmVzdW1lIG5vcm1hbCBvcGVyYXRpb25zICovCisJdm9pZCAoKnJlc3VtZSkoc3RydWN0IHBjaV9kZXYgKmRldik7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKIHN0cnVjdCBtb2R1bGU7CiBzdHJ1Y3QgcGNpX2RyaXZlciB7CiAJc3RydWN0IGxpc3RfaGVhZCBub2RlOwpAQCAtMjQ0LDYgKzMxMSw3IEBACiAJaW50ICAoKmVuYWJsZV93YWtlKSAoc3RydWN0IHBjaV9kZXYgKmRldiwgcGNpX3Bvd2VyX3Qgc3RhdGUsIGludCBlbmFibGUpOyAgIC8qIEVuYWJsZSB3YWtlIGV2ZW50ICovCiAJdm9pZCAoKnNodXRkb3duKSAoc3RydWN0IHBjaV9kZXYgKmRldik7CiAKKwlzdHJ1Y3QgcGNpX2Vycm9yX2hhbmRsZXJzICplcnJfaGFuZGxlcjsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlcglkcml2ZXI7CiAJc3RydWN0IHBjaV9keW5pZHMgZHluaWRzOwogfTsKQEAgLTQ0OCw2ICs1MTYsNyBAQAogCiB2b2lkIHBjaV93YWxrX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqdG9wLCB2b2lkICgqY2IpKHN0cnVjdCBwY2lfZGV2ICosIHZvaWQgKiksCiAJCSAgdm9pZCAqdXNlcmRhdGEpOworaW50IHBjaV9jZmdfc3BhY2Vfc2l6ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIAogLyoga21lbV9jYWNoZSBzdHlsZSB3cmFwcGVyIGFyb3VuZCBwY2lfYWxsb2NfY29uc2lzdGVudCgpICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKaW5kZXggYTIxM2U5OS4uZWNjMWZjMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKQEAgLTE4MSw2ICsxODEsNyBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xTSV9GQzkyOVgJMHgwNjI2CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTFNJX0ZDOTM5WAkweDA2NDIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9MU0lfRkM5NDlYCTB4MDY0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xTSV9GQzk0OUVTCTB4MDY0NgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xTSV9GQzkxOVgJMHgwNjI4CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkNSX1lFTExPV0ZJTgkweDA3MDEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9MU0lfNjFDMTAyCTB4MDkwMQpAQCAtMzc3LDYgKzM3OCw3IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlNfODc1NjBfVVNCCTB4MDAxMgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05TXzgzODE1CQkweDAwMjAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OU184MzgyMAkJMHgwMDIyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlNfQ1M1NTM1X0lTQQkweDAwMmIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OU19DUzU1MzVfSURFCTB4MDAyZAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05TX0NTNTUzNV9BVURJTwkweDAwMmUKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OU19DUzU1MzVfVVNCCTB4MDAyZgpAQCAtNTAwLDYgKzUwMiwxNCBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF84MTExX0FVRElPCTB4NzQ2ZAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF84MTUxXzAJMHg3NDU0CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EXzgxMzFfQVBJQyAgICAgMHg3NDUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0NTNTUzNl9JU0EgICAgMHgyMDkwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0NTNTUzNl9GTEFTSCAgMHgyMDkxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0NTNTUzNl9BVURJTyAgMHgyMDkzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0NTNTUzNl9PSEMgICAgMHgyMDk0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0NTNTUzNl9FSEMgICAgMHgyMDk1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0NTNTUzNl9VREMgICAgMHgyMDk2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0NTNTUzNl9VT0MgICAgMHgyMDk3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0NTNTUzNl9JREUgICAgMHgyMDlBCiAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfQ1M1NTM2X0lERQkweDIwOUEKIApAQCAtMTA0MSw2ICsxMDUxLDExIEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF82CQkweDAwZTYKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfQ0s4U19BVURJTwkJMHgwMGVhCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRTNTX1NBVEEyCTB4MDBlZQorI2RlZmluZSBQQ0lFX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV82ODAwX0FMVDEgMHgwMGYwCisjZGVmaW5lIFBDSUVfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFXzY2MDBfQUxUMSAweDAwZjEKKyNkZWZpbmUgUENJRV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfNjYwMF9BTFQyIDB4MDBmMgorI2RlZmluZSBQQ0lFX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV82MjAwX0FMVDEgMHgwMGYzCisjZGVmaW5lIFBDSUVfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFXzY4MDBfR1QgICAweDAwZjkKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV9TRFIJMHgwMTAwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfRERSCTB4MDEwMQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9RVUFEUk8JCTB4MDEwMwpAQCAtMTU4Myw2ICsxNTk4LDIzIEBACiAjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX0JIOF80ODVfMl82CTB4MDAwOQogI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9CSDA4MTEwMVYxCTB4MDAwQQogI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9CSDA0MTEwMVYxCTB4MDAwQgorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9CSDJfMjBNSFoJCTB4MDAwQworI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9CSDJfUFRNCQkweDAwMEQKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9DT05ORUNUX1RFQ0hfTlQ5NjBQQ0kJCTB4MDEwMAorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9USVRBTl8yCQkweDAyMDEKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9DT05ORUNUX1RFQ0hfVElUQU5fNAkJMHgwMjAyCisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX1BDSV9VQVJUXzJfMjMyCTB4MDMwMAorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9QQ0lfVUFSVF80XzIzMgkweDAzMDEKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9DT05ORUNUX1RFQ0hfUENJX1VBUlRfOF8yMzIJMHgwMzAyCisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX1BDSV9VQVJUXzFfMQkweDAzMTAKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9DT05ORUNUX1RFQ0hfUENJX1VBUlRfMl8yCTB4MDMxMQorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9QQ0lfVUFSVF80XzQJMHgwMzEyCisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX1BDSV9VQVJUXzIJMHgwMzIwCisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX1BDSV9VQVJUXzQJMHgwMzIxCisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX1BDSV9VQVJUXzgJMHgwMzIyCisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ09OTkVDVF9URUNIX1BDSV9VQVJUXzJfNDg1CTB4MDMzMAorI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0NPTk5FQ1RfVEVDSF9QQ0lfVUFSVF80XzQ4NQkweDAzMzEKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9DT05ORUNUX1RFQ0hfUENJX1VBUlRfOF80ODUJMHgwMzMyCiAKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX05WSURJQV9TR1MJMHgxMmQyCkBAIC0xOTYwLDYgKzE5OTIsNyBAQAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0RDSQkJMHg2NjY2CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRENJX1BDQ09NNAkweDAwMDEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9EQ0lfUENDT004CTB4MDAwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RDSV9QQ0NPTTIJMHgwMDA0CiAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JTlRFTAkJMHg4MDg2CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfRUVTU0MJMHgwMDA4CkBAIC0yMTIxLDYgKzIxNTQsOSBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lYUDI4MDAJMHg5MDA0CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfUzIxMTUyQkIJMHhiMTUyCiAKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TQ0FMRU1QCQkweDg2ODYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TQ0FMRU1QX1ZTTVBfQ1RMCTB4MTAxMAorCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ09NUFVUT05FCQkweDhlMGUKICNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01QVVRPTkVfSVAyRVgJMHgwMjkxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NUFVUT05FX1BHCTB4MDMwMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfcmVncy5oIGIvaW5jbHVkZS9saW51eC9wY2lfcmVncy5oCmluZGV4IGUyYTA4OWIuLmQyN2E3OGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmgKQEAgLTE5Niw2ICsxOTYsNyBAQAogI2RlZmluZSAgUENJX0NBUF9JRF9NU0kJCTB4MDUJLyogTWVzc2FnZSBTaWduYWxsZWQgSW50ZXJydXB0cyAqLwogI2RlZmluZSAgUENJX0NBUF9JRF9DSFNXUAkweDA2CS8qIENvbXBhY3RQQ0kgSG90U3dhcCAqLwogI2RlZmluZSAgUENJX0NBUF9JRF9QQ0lYCTB4MDcJLyogUENJLVggKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfSFRfSVJRQ09ORgkweDA4CS8qIEh5cGVyVHJhbnNwb3J0IElSUSBDb25maWd1cmF0aW9uICovCiAjZGVmaW5lICBQQ0lfQ0FQX0lEX1NIUEMgCTB4MEMJLyogUENJIFN0YW5kYXJkIEhvdC1QbHVnIENvbnRyb2xsZXIgKi8KICNkZWZpbmUgIFBDSV9DQVBfSURfRVhQIAkweDEwCS8qIFBDSSBFeHByZXNzICovCiAjZGVmaW5lICBQQ0lfQ0FQX0lEX01TSVgJMHgxMQkvKiBNU0ktWCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZXJjcHUuaCBiL2luY2x1ZGUvbGludXgvcGVyY3B1LmgKaW5kZXggZmI4ZDJkMi4uY2I5MDM5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wZXJjcHUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BlcmNwdS5oCkBAIC0xOSw3ICsxOSw2IEBACiAKIHN0cnVjdCBwZXJjcHVfZGF0YSB7CiAJdm9pZCAqcHRyc1tOUl9DUFVTXTsKLQl2b2lkICpibGtwOwogfTsKIAogLyogCkBAIC0zMywxNCArMzIsMTQgQEAKICAgICAgICAgKF9fdHlwZW9mX18ocHRyKSlfX3AtPnB0cnNbKGNwdSldOwlcCiB9KQogCi1leHRlcm4gdm9pZCAqX19hbGxvY19wZXJjcHUoc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbik7CitleHRlcm4gdm9pZCAqX19hbGxvY19wZXJjcHUoc2l6ZV90IHNpemUpOwogZXh0ZXJuIHZvaWQgZnJlZV9wZXJjcHUoY29uc3Qgdm9pZCAqKTsKIAogI2Vsc2UgLyogQ09ORklHX1NNUCAqLwogCiAjZGVmaW5lIHBlcl9jcHVfcHRyKHB0ciwgY3B1KSAoeyAodm9pZCkoY3B1KTsgKHB0cik7IH0pCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqX19hbGxvY19wZXJjcHUoc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbikKK3N0YXRpYyBpbmxpbmUgdm9pZCAqX19hbGxvY19wZXJjcHUoc2l6ZV90IHNpemUpCiB7CiAJdm9pZCAqcmV0ID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAocmV0KQpAQCAtNTUsNyArNTQsNiBAQAogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogLyogU2ltcGxlIHdyYXBwZXIgZm9yIHRoZSBjb21tb24gY2FzZTogemVyb3MgbWVtb3J5LiAqLwotI2RlZmluZSBhbGxvY19wZXJjcHUodHlwZSkgXAotCSgodHlwZSAqKShfX2FsbG9jX3BlcmNwdShzaXplb2YodHlwZSksIF9fYWxpZ25vZl9fKHR5cGUpKSkpCisjZGVmaW5lIGFsbG9jX3BlcmNwdSh0eXBlKQkoKHR5cGUgKikoX19hbGxvY19wZXJjcHUoc2l6ZW9mKHR5cGUpKSkpCiAKICNlbmRpZiAvKiBfX0xJTlVYX1BFUkNQVV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bma2V5djIuaCBiL2luY2x1ZGUvbGludXgvcGZrZXl2Mi5oCmluZGV4IDYzNTFjNDAuLmJhYzBmYjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGZrZXl2Mi5oCisrKyBiL2luY2x1ZGUvbGludXgvcGZrZXl2Mi5oCkBAIC0xMDQsNyArMTA0LDcgQEAKIC8qIGZvbGxvd2VkIGJ5OgogCXN0cnVjdCBzYWRiX2NvbWIgc2FkYl9jb21ic1soc2FkYl9wcm9wX2xlbiArCiAJCXNpemVvZih1aW50NjRfdCkgLSBzaXplb2Yoc3RydWN0IHNhZGJfcHJvcCkpIC8KLQkJc2l6ZW9mKHN0cnV0IHNhZGJfY29tYildOyAqLworCQlzaXplb2Yoc3RydWN0IHNhZGJfY29tYildOyAqLwogCiBzdHJ1Y3Qgc2FkYl9jb21iIHsKIAl1aW50OF90CQlzYWRiX2NvbWJfYXV0aDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGh5LmggYi9pbmNsdWRlL2xpbnV4L3BoeS5oCmluZGV4IDkyYTk2OTYuLjMzMTUyMWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGh5LmgKKysrIGIvaW5jbHVkZS9saW51eC9waHkuaApAQCAtNTMsNiArNTMsOSBAQAogCiAjZGVmaW5lIFBIWV9NQVhfQUREUiAzMgogCisvKiBVc2VkIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgdG8gYSBzcGVjaWZpYyBwaHkgKG1paSBidXMgaWQ6cGh5IGRldmljZSBpZCkgKi8KKyNkZWZpbmUgUEhZX0lEX0ZNVCAiJXg6JTAyeCIKKwogLyogVGhlIEJ1cyBjbGFzcyBmb3IgUEhZcy4gIERldmljZXMgd2hpY2ggcHJvdmlkZSBhY2Nlc3MgdG8KICAqIFBIWXMgc2hvdWxkIHJlZ2lzdGVyIHVzaW5nIHRoaXMgc3RydWN0dXJlICovCiBzdHJ1Y3QgbWlpX2J1cyB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BpcGVfZnNfaS5oIGIvaW5jbHVkZS9saW51eC9waXBlX2ZzX2kuaAppbmRleCAxNzY3MDczLi5iMTJlNTljIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BpcGVfZnNfaS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGlwZV9mc19pLmgKQEAgLTM3LDcgKzM3LDcgQEAKICAgIG1lbW9yeSBhbGxvY2F0aW9uLCB3aGVyZWFzIFBJUEVfQlVGIG1ha2VzIGF0b21pY2l0eSBndWFyYW50ZWVzLiAgKi8KICNkZWZpbmUgUElQRV9TSVpFCQlQQUdFX1NJWkUKIAotI2RlZmluZSBQSVBFX1NFTShpbm9kZSkJCSgmKGlub2RlKS5pX3NlbSkKKyNkZWZpbmUgUElQRV9NVVRFWChpbm9kZSkJKCYoaW5vZGUpLmlfbXV0ZXgpCiAjZGVmaW5lIFBJUEVfV0FJVChpbm9kZSkJKCYoaW5vZGUpLmlfcGlwZS0+d2FpdCkKICNkZWZpbmUgUElQRV9SRUFERVJTKGlub2RlKQkoKGlub2RlKS5pX3BpcGUtPnJlYWRlcnMpCiAjZGVmaW5lIFBJUEVfV1JJVEVSUyhpbm9kZSkJKChpbm9kZSkuaV9waXBlLT53cml0ZXJzKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbXUuaCBiL2luY2x1ZGUvbGludXgvcG11LmgKaW5kZXggMzczYmQzYi4uMjE3ZDNkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbXUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BtdS5oCkBAIC0xNDAsNyArMTQwLDcgQEAKIAogZXh0ZXJuIGludCBwbXVfcmVxdWVzdChzdHJ1Y3QgYWRiX3JlcXVlc3QgKnJlcSwKIAkJdm9pZCAoKmRvbmUpKHN0cnVjdCBhZGJfcmVxdWVzdCAqKSwgaW50IG5ieXRlcywgLi4uKTsKLQorZXh0ZXJuIGludCBwbXVfcXVldWVfcmVxdWVzdChzdHJ1Y3QgYWRiX3JlcXVlc3QgKnJlcSk7CiBleHRlcm4gdm9pZCBwbXVfcG9sbCh2b2lkKTsKIGV4dGVybiB2b2lkIHBtdV9wb2xsX2FkYih2b2lkKTsgLyogRm9yIHVzZSBieSB4bW9uICovCiBleHRlcm4gdm9pZCBwbXVfd2FpdF9jb21wbGV0ZShzdHJ1Y3QgYWRiX3JlcXVlc3QgKnJlcSk7CkBAIC0xNjAsMTIgKzE2MCw2IEBACiBleHRlcm4gaW50IHBtdV9wcmVzZW50KHZvaWQpOwogZXh0ZXJuIGludCBwbXVfZ2V0X21vZGVsKHZvaWQpOwogCi1leHRlcm4gaW50IHBtdV9pMmNfY29tYmluZWRfcmVhZChpbnQgYnVzLCBpbnQgYWRkciwgaW50IHN1YmFkZHIsICB1OCogZGF0YSwgaW50IGxlbik7Ci1leHRlcm4gaW50IHBtdV9pMmNfc3Rkc3ViX3dyaXRlKGludCBidXMsIGludCBhZGRyLCBpbnQgc3ViYWRkciwgIHU4KiBkYXRhLCBpbnQgbGVuKTsKLWV4dGVybiBpbnQgcG11X2kyY19zaW1wbGVfcmVhZChpbnQgYnVzLCBpbnQgYWRkciwgIHU4KiBkYXRhLCBpbnQgbGVuKTsKLWV4dGVybiBpbnQgcG11X2kyY19zaW1wbGVfd3JpdGUoaW50IGJ1cywgaW50IGFkZHIsICB1OCogZGF0YSwgaW50IGxlbik7Ci0KLQogI2lmZGVmIENPTkZJR19QTQogLyoKICAqIFN0dWZmIGZvciBwdXR0aW5nIHRoZSBwb3dlcmJvb2sgdG8gc2xlZXAgYW5kIHdha2luZyBpdCBhZ2Fpbi4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG9sbC5oIGIvaW5jbHVkZS9saW51eC9wb2xsLmgKaW5kZXggZjZkYTcwMi4uOGU4ZjYwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wb2xsLmgKKysrIGIvaW5jbHVkZS9saW51eC9wb2xsLmgKQEAgLTkyLDcgKzkyLDExIEBACiAJbWVtc2V0KGZkc2V0LCAwLCBGRFNfQllURVMobnIpKTsKIH0KIAotZXh0ZXJuIGludCBkb19zZWxlY3QoaW50IG4sIGZkX3NldF9iaXRzICpmZHMsIGxvbmcgKnRpbWVvdXQpOworI2RlZmluZSBNQVhfSU5UNjRfU0VDT05EUyAoKChzNjQpKH4oKHU2NCkwKT4+MSkvSFopLTEpCisKK2V4dGVybiBpbnQgZG9fc2VsZWN0KGludCBuLCBmZF9zZXRfYml0cyAqZmRzLCBzNjQgKnRpbWVvdXQpOworZXh0ZXJuIGludCBkb19zeXNfcG9sbChzdHJ1Y3QgcG9sbGZkIF9fdXNlciAqIHVmZHMsIHVuc2lnbmVkIGludCBuZmRzLAorCQkgICAgICAgczY0ICp0aW1lb3V0KTsKIAogI2VuZGlmIC8qIEtFUk5FTCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bvc2l4LXRpbWVycy5oIGIvaW5jbHVkZS9saW51eC9wb3NpeC10aW1lcnMuaAppbmRleCBmOTQyZTJiLi41NGZhZjUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Bvc2l4LXRpbWVycy5oCisrKyBiL2luY2x1ZGUvbGludXgvcG9zaXgtdGltZXJzLmgKQEAgLTQyLDcgKzQyLDcgQEAKIAl0aW1lcl90IGl0X2lkOwkJCS8qIHRpbWVyIGlkICovCiAJaW50IGl0X292ZXJydW47CQkJLyogb3ZlcnJ1biBvbiBwZW5kaW5nIHNpZ25hbCAgKi8KIAlpbnQgaXRfb3ZlcnJ1bl9sYXN0OwkJLyogb3ZlcnJ1biBvbiBsYXN0IGRlbGl2ZXJlZCBzaWduYWwgKi8KLQlpbnQgaXRfcmVxdWV1ZV9wZW5kaW5nOyAgICAgICAgIC8qIHdhaXRpbmcgdG8gcmVxdWV1ZSB0aGlzIHRpbWVyICovCisJaW50IGl0X3JlcXVldWVfcGVuZGluZzsJCS8qIHdhaXRpbmcgdG8gcmVxdWV1ZSB0aGlzIHRpbWVyICovCiAjZGVmaW5lIFJFUVVFVUVfUEVORElORyAxCiAJaW50IGl0X3NpZ2V2X25vdGlmeTsJCS8qIG5vdGlmeSB3b3JkIG9mIHNpZ2V2ZW50IHN0cnVjdCAqLwogCWludCBpdF9zaWdldl9zaWdubzsJCS8qIHNpZ25vIHdvcmQgb2Ygc2lnZXZlbnQgc3RydWN0ICovCkBAIC01MSwxMCArNTEsOCBAQAogCXN0cnVjdCBzaWdxdWV1ZSAqc2lncTsJCS8qIHNpZ25hbCBxdWV1ZSBlbnRyeS4gKi8KIAl1bmlvbiB7CiAJCXN0cnVjdCB7Ci0JCQlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKLQkJCXN0cnVjdCBsaXN0X2hlYWQgYWJzX3RpbWVyX2VudHJ5OyAvKiBjbG9jayBhYnNfdGltZXJfbGlzdCAqLwotCQkJc3RydWN0IHRpbWVzcGVjIHdhbGxfdG9fcHJldjsgICAvKiB3YWxsX3RvX21vbm90b25pYyB1c2VkIHdoZW4gc2V0ICovCi0JCQl1bnNpZ25lZCBsb25nIGluY3I7IC8qIGludGVydmFsIGluIGppZmZpZXMgKi8KKwkJCXN0cnVjdCBocnRpbWVyIHRpbWVyOworCQkJa3RpbWVfdCBpbnRlcnZhbDsKIAkJfSByZWFsOwogCQlzdHJ1Y3QgY3B1X3RpbWVyX2xpc3QgY3B1OwogCQlzdHJ1Y3QgewpAQCAtNjYsMTggKzY0LDE0IEBACiAJfSBpdDsKIH07CiAKLXN0cnVjdCBrX2Nsb2NrX2FicyB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXNwaW5sb2NrX3QgbG9jazsKLX07CiBzdHJ1Y3Qga19jbG9jayB7Ci0JaW50IHJlczsJCS8qIGluIG5hbm8gc2Vjb25kcyAqLwotCWludCAoKmNsb2NrX2dldHJlcykgKGNsb2NraWRfdCB3aGljaF9jbG9jaywgc3RydWN0IHRpbWVzcGVjICp0cCk7Ci0Jc3RydWN0IGtfY2xvY2tfYWJzICphYnNfc3RydWN0OwotCWludCAoKmNsb2NrX3NldCkgKGNsb2NraWRfdCB3aGljaF9jbG9jaywgc3RydWN0IHRpbWVzcGVjICogdHApOwotCWludCAoKmNsb2NrX2dldCkgKGNsb2NraWRfdCB3aGljaF9jbG9jaywgc3RydWN0IHRpbWVzcGVjICogdHApOworCWludCByZXM7CQkvKiBpbiBuYW5vc2Vjb25kcyAqLworCWludCAoKmNsb2NrX2dldHJlcykgKGNvbnN0IGNsb2NraWRfdCB3aGljaF9jbG9jaywgc3RydWN0IHRpbWVzcGVjICp0cCk7CisJaW50ICgqY2xvY2tfc2V0KSAoY29uc3QgY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBzdHJ1Y3QgdGltZXNwZWMgKiB0cCk7CisJaW50ICgqY2xvY2tfZ2V0KSAoY29uc3QgY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBzdHJ1Y3QgdGltZXNwZWMgKiB0cCk7CiAJaW50ICgqdGltZXJfY3JlYXRlKSAoc3RydWN0IGtfaXRpbWVyICp0aW1lcik7Ci0JaW50ICgqbnNsZWVwKSAoY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBpbnQgZmxhZ3MsIHN0cnVjdCB0aW1lc3BlYyAqKTsKKwlpbnQgKCpuc2xlZXApIChjb25zdCBjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssIGludCBmbGFncywKKwkJICAgICAgIHN0cnVjdCB0aW1lc3BlYyAqLCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICopOwogCWludCAoKnRpbWVyX3NldCkgKHN0cnVjdCBrX2l0aW1lciAqIHRpbXIsIGludCBmbGFncywKIAkJCSAgc3RydWN0IGl0aW1lcnNwZWMgKiBuZXdfc2V0dGluZywKIAkJCSAgc3RydWN0IGl0aW1lcnNwZWMgKiBvbGRfc2V0dGluZyk7CkBAIC04Nyw1MyArODEsMzUgQEAKIAkJCSAgIHN0cnVjdCBpdGltZXJzcGVjICogY3VyX3NldHRpbmcpOwogfTsKIAotdm9pZCByZWdpc3Rlcl9wb3NpeF9jbG9jayhjbG9ja2lkX3QgY2xvY2tfaWQsIHN0cnVjdCBrX2Nsb2NrICpuZXdfY2xvY2spOwordm9pZCByZWdpc3Rlcl9wb3NpeF9jbG9jayhjb25zdCBjbG9ja2lkX3QgY2xvY2tfaWQsIHN0cnVjdCBrX2Nsb2NrICpuZXdfY2xvY2spOwogCi0vKiBFcnJvciBoYW5kbGVycyBmb3IgdGltZXJfY3JlYXRlLCBuYW5vc2xlZXAgYW5kIHNldHRpbWUgKi8KKy8qIGVycm9yIGhhbmRsZXJzIGZvciB0aW1lcl9jcmVhdGUsIG5hbm9zbGVlcCBhbmQgc2V0dGltZSAqLwogaW50IGRvX3Bvc2l4X2Nsb2NrX25vdGltZXJfY3JlYXRlKHN0cnVjdCBrX2l0aW1lciAqdGltZXIpOwotaW50IGRvX3Bvc2l4X2Nsb2NrX25vbmFub3NsZWVwKGNsb2NraWRfdCwgaW50IGZsYWdzLCBzdHJ1Y3QgdGltZXNwZWMgKik7Ci1pbnQgZG9fcG9zaXhfY2xvY2tfbm9zZXR0aW1lKGNsb2NraWRfdCwgc3RydWN0IHRpbWVzcGVjICp0cCk7CitpbnQgZG9fcG9zaXhfY2xvY2tfbm9uYW5vc2xlZXAoY29uc3QgY2xvY2tpZF90LCBpbnQgZmxhZ3MsIHN0cnVjdCB0aW1lc3BlYyAqLAorCQkJICAgICAgIHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKik7CitpbnQgZG9fcG9zaXhfY2xvY2tfbm9zZXR0aW1lKGNvbnN0IGNsb2NraWRfdCwgc3RydWN0IHRpbWVzcGVjICp0cCk7CiAKIC8qIGZ1bmN0aW9uIHRvIGNhbGwgdG8gdHJpZ2dlciB0aW1lciBldmVudCAqLwogaW50IHBvc2l4X3RpbWVyX2V2ZW50KHN0cnVjdCBrX2l0aW1lciAqdGltciwgaW50IHNpX3ByaXZhdGUpOwogCi1zdHJ1Y3Qgbm93X3N0cnVjdCB7Ci0JdW5zaWduZWQgbG9uZyBqaWZmaWVzOwotfTsKK2ludCBwb3NpeF9jcHVfY2xvY2tfZ2V0cmVzKGNvbnN0IGNsb2NraWRfdCB3aGljaF9jbG9jaywgc3RydWN0IHRpbWVzcGVjICp0cyk7CitpbnQgcG9zaXhfY3B1X2Nsb2NrX2dldChjb25zdCBjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssIHN0cnVjdCB0aW1lc3BlYyAqdHMpOworaW50IHBvc2l4X2NwdV9jbG9ja19zZXQoY29uc3QgY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRzKTsKK2ludCBwb3NpeF9jcHVfdGltZXJfY3JlYXRlKHN0cnVjdCBrX2l0aW1lciAqdGltZXIpOworaW50IHBvc2l4X2NwdV9uc2xlZXAoY29uc3QgY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBpbnQgZmxhZ3MsCisJCSAgICAgc3RydWN0IHRpbWVzcGVjICpycXRwLCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICpybXRwKTsKK2ludCBwb3NpeF9jcHVfdGltZXJfc2V0KHN0cnVjdCBrX2l0aW1lciAqdGltZXIsIGludCBmbGFncywKKwkJCXN0cnVjdCBpdGltZXJzcGVjICpuZXcsIHN0cnVjdCBpdGltZXJzcGVjICpvbGQpOworaW50IHBvc2l4X2NwdV90aW1lcl9kZWwoc3RydWN0IGtfaXRpbWVyICp0aW1lcik7Cit2b2lkIHBvc2l4X2NwdV90aW1lcl9nZXQoc3RydWN0IGtfaXRpbWVyICp0aW1lciwgc3RydWN0IGl0aW1lcnNwZWMgKml0cCk7CiAKLSNkZWZpbmUgcG9zaXhfZ2V0X25vdyhub3cpIChub3cpLT5qaWZmaWVzID0gamlmZmllczsKLSNkZWZpbmUgcG9zaXhfdGltZV9iZWZvcmUodGltZXIsIG5vdykgXAotICAgICAgICAgICAgICAgICAgICAgIHRpbWVfYmVmb3JlKCh0aW1lciktPmV4cGlyZXMsIChub3cpLT5qaWZmaWVzKQordm9pZCBwb3NpeF9jcHVfdGltZXJfc2NoZWR1bGUoc3RydWN0IGtfaXRpbWVyICp0aW1lcik7CiAKLSNkZWZpbmUgcG9zaXhfYnVtcF90aW1lcih0aW1yLCBub3cpCQkJCQlcCi0gICAgICAgICBkbyB7CQkJCQkJCQlcCi0gICAgICAgICAgICAgIGxvbmcgZGVsdGEsIG9ydW47CQkJCQkJXAotCSAgICAgIGRlbHRhID0gbm93LmppZmZpZXMgLSAodGltciktPml0LnJlYWwudGltZXIuZXhwaXJlczsJXAotICAgICAgICAgICAgICBpZiAoZGVsdGEgPj0gMCkgewkJCQkJCVwKLQkgICAgICAgICAgIG9ydW4gPSAxICsgKGRlbHRhIC8gKHRpbXIpLT5pdC5yZWFsLmluY3IpOwkJXAotCSAgICAgICAgICAodGltciktPml0LnJlYWwudGltZXIuZXhwaXJlcyArPQkJCVwKLQkJCSBvcnVuICogKHRpbXIpLT5pdC5yZWFsLmluY3I7CQkJXAotICAgICAgICAgICAgICAgICAgKHRpbXIpLT5pdF9vdmVycnVuICs9IG9ydW47CQkJCVwKLSAgICAgICAgICAgICAgfQkJCQkJCQkJXAotICAgICAgICAgICAgfXdoaWxlICgwKQordm9pZCBydW5fcG9zaXhfY3B1X3RpbWVycyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwordm9pZCBwb3NpeF9jcHVfdGltZXJzX2V4aXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKK3ZvaWQgcG9zaXhfY3B1X3RpbWVyc19leGl0X2dyb3VwKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiAKLWludCBwb3NpeF9jcHVfY2xvY2tfZ2V0cmVzKGNsb2NraWRfdCB3aGljaF9jbG9jaywgc3RydWN0IHRpbWVzcGVjICopOwotaW50IHBvc2l4X2NwdV9jbG9ja19nZXQoY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBzdHJ1Y3QgdGltZXNwZWMgKik7Ci1pbnQgcG9zaXhfY3B1X2Nsb2NrX3NldChjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdHApOwotaW50IHBvc2l4X2NwdV90aW1lcl9jcmVhdGUoc3RydWN0IGtfaXRpbWVyICopOwotaW50IHBvc2l4X2NwdV9uc2xlZXAoY2xvY2tpZF90LCBpbnQsIHN0cnVjdCB0aW1lc3BlYyAqKTsKLWludCBwb3NpeF9jcHVfdGltZXJfc2V0KHN0cnVjdCBrX2l0aW1lciAqLCBpbnQsCi0JCQlzdHJ1Y3QgaXRpbWVyc3BlYyAqLCBzdHJ1Y3QgaXRpbWVyc3BlYyAqKTsKLWludCBwb3NpeF9jcHVfdGltZXJfZGVsKHN0cnVjdCBrX2l0aW1lciAqKTsKLXZvaWQgcG9zaXhfY3B1X3RpbWVyX2dldChzdHJ1Y3Qga19pdGltZXIgKiwgc3RydWN0IGl0aW1lcnNwZWMgKik7Ci0KLXZvaWQgcG9zaXhfY3B1X3RpbWVyX3NjaGVkdWxlKHN0cnVjdCBrX2l0aW1lciAqKTsKLQotdm9pZCBydW5fcG9zaXhfY3B1X3RpbWVycyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7Ci12b2lkIHBvc2l4X2NwdV90aW1lcnNfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7Ci12b2lkIHBvc2l4X2NwdV90aW1lcnNfZXhpdF9ncm91cChzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7Ci0KLXZvaWQgc2V0X3Byb2Nlc3NfY3B1X3RpbWVyKHN0cnVjdCB0YXNrX3N0cnVjdCAqLCB1bnNpZ25lZCBpbnQsCi0JCQkgICBjcHV0aW1lX3QgKiwgY3B1dGltZV90ICopOwordm9pZCBzZXRfcHJvY2Vzc19jcHVfdGltZXIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBpbnQgY2xvY2tfaWR4LAorCQkJICAgY3B1dGltZV90ICpuZXd2YWwsIGNwdXRpbWVfdCAqb2xkdmFsKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Byb2NfZnMuaCBiL2luY2x1ZGUvbGludXgvcHJvY19mcy5oCmluZGV4IDc0NDg4ZTQuLmFhNjMyMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHJvY19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcHJvY19mcy5oCkBAIC0xNDYsNiArMTQ2LDExIEBACiBleHRlcm4gdm9pZCBwcm9jX2RldmljZV90cmVlX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBwcm9jX2RldmljZV90cmVlX2FkZF9ub2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqLCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKik7CiBleHRlcm4gdm9pZCBwcm9jX2RldmljZV90cmVlX2FkZF9wcm9wKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlLCBzdHJ1Y3QgcHJvcGVydHkgKnByb3ApOworZXh0ZXJuIHZvaWQgcHJvY19kZXZpY2VfdHJlZV9yZW1vdmVfcHJvcChzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSwKKwkJCQkJIHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCk7CitleHRlcm4gdm9pZCBwcm9jX2RldmljZV90cmVlX3VwZGF0ZV9wcm9wKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlLAorCQkJCQkgc3RydWN0IHByb3BlcnR5ICpuZXdwcm9wLAorCQkJCQkgc3RydWN0IHByb3BlcnR5ICpvbGRwcm9wKTsKICNlbmRpZiAvKiBDT05GSUdfUFJPQ19ERVZJQ0VUUkVFICovCiAKIGV4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2Nfc3ltbGluayhjb25zdCBjaGFyICosCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oIGIvaW5jbHVkZS9saW51eC9wdHJhY2UuaAppbmRleCBiMmIzZGJhLi45ZDVjZDEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcHRyYWNlLmgKQEAgLTIwLDggKzIwLDYgQEAKICNkZWZpbmUgUFRSQUNFX0RFVEFDSAkJMHgxMQogCiAjZGVmaW5lIFBUUkFDRV9TWVNDQUxMCQkgIDI0Ci0jZGVmaW5lIFBUUkFDRV9TWVNFTVUJCSAgMzEKLSNkZWZpbmUgUFRSQUNFX1NZU0VNVV9TSU5HTEVTVEVQICAzMgogCiAvKiAweDQyMDAtMHg0MzAwIGFyZSByZXNlcnZlZCBmb3IgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGFkZGl0aW9ucy4gICovCiAjZGVmaW5lIFBUUkFDRV9TRVRPUFRJT05TCTB4NDIwMApAQCAtODAsNiArNzgsOCBAQAogCiAKIGV4dGVybiBsb25nIGFyY2hfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpOworZXh0ZXJuIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHRyYWNlX2dldF90YXNrX3N0cnVjdChwaWRfdCBwaWQpOworZXh0ZXJuIGludCBwdHJhY2VfdHJhY2VtZSh2b2lkKTsKIGV4dGVybiBpbnQgcHRyYWNlX3JlYWRkYXRhKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBsb25nIHNyYywgY2hhciBfX3VzZXIgKmRzdCwgaW50IGxlbik7CiBleHRlcm4gaW50IHB0cmFjZV93cml0ZWRhdGEoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGNoYXIgX191c2VyICpzcmMsIHVuc2lnbmVkIGxvbmcgZHN0LCBpbnQgbGVuKTsKIGV4dGVybiBpbnQgcHRyYWNlX2F0dGFjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhZGl4LXRyZWUuaCBiL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCmluZGV4IDM2ZTVkMjYuLmM1N2ZmMmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCkBAIC0xOSw2ICsxOSw3IEBACiAjaWZuZGVmIF9MSU5VWF9SQURJWF9UUkVFX0gKICNkZWZpbmUgX0xJTlVYX1JBRElYX1RSRUVfSAogCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkX2NsYXNzLmggYi9pbmNsdWRlL2xpbnV4L3JhaWRfY2xhc3MuaAppbmRleCA0ODgzMWVhLi5kMGRkMzhiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhaWRfY2xhc3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWRfY2xhc3MuaApAQCAtMzEsOSArMzEsMTEgQEAKIAlSQUlEX0xFVkVMX0xJTkVBUiwKIAlSQUlEX0xFVkVMXzAsCiAJUkFJRF9MRVZFTF8xLAorCVJBSURfTEVWRUxfMTAsCiAJUkFJRF9MRVZFTF8zLAogCVJBSURfTEVWRUxfNCwKIAlSQUlEX0xFVkVMXzUsCisJUkFJRF9MRVZFTF81MCwKIAlSQUlEX0xFVkVMXzYsCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmggYi9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgKaW5kZXggYTQ3MWYzYi4uOTgxZjlhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaApAQCAtNjUsNyArNjUsMTEgQEAKIAlsb25nCWN1cjsJCS8qIEN1cnJlbnQgYmF0Y2ggbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAqLwogCWxvbmcJY29tcGxldGVkOwkvKiBOdW1iZXIgb2YgdGhlIGxhc3QgY29tcGxldGVkIGJhdGNoICAgICAgICAgKi8KIAlpbnQJbmV4dF9wZW5kaW5nOwkvKiBJcyB0aGUgbmV4dCBiYXRjaCBhbHJlYWR5IHdhaXRpbmc/ICAgICAgICAgKi8KLX0gX19fX2NhY2hlbGluZV9tYXhhbGlnbmVkX2luX3NtcDsKKworCXNwaW5sb2NrX3QJbG9jawlfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wOworCWNwdW1hc2tfdAljcHVtYXNrOyAvKiBDUFVzIHRoYXQgbmVlZCB0byBzd2l0Y2ggaW4gb3JkZXIgICAgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIGN1cnJlbnQgYmF0Y2ggdG8gcHJvY2VlZC4gICAgICAgICovCit9IF9fX19jYWNoZWxpbmVfaW50ZXJub2RlYWxpZ25lZF9pbl9zbXA7CiAKIC8qIElzIGJhdGNoIGEgYmVmb3JlIGJhdGNoIGIgPyAqLwogc3RhdGljIGlubGluZSBpbnQgcmN1X2JhdGNoX2JlZm9yZShsb25nIGEsIGxvbmcgYikKQEAgLTEyNSwzNiArMTI5LDcgQEAKIAlyZHAtPnBhc3NlZF9xdWllc2MgPSAxOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBfX3JjdV9wZW5kaW5nKHN0cnVjdCByY3VfY3RybGJsayAqcmNwLAotCQkJCQkJc3RydWN0IHJjdV9kYXRhICpyZHApCi17Ci0JLyogVGhpcyBjcHUgaGFzIHBlbmRpbmcgcmN1IGVudHJpZXMgYW5kIHRoZSBncmFjZSBwZXJpb2QKLQkgKiBmb3IgdGhlbSBoYXMgY29tcGxldGVkLgotCSAqLwotCWlmIChyZHAtPmN1cmxpc3QgJiYgIXJjdV9iYXRjaF9iZWZvcmUocmNwLT5jb21wbGV0ZWQsIHJkcC0+YmF0Y2gpKQotCQlyZXR1cm4gMTsKLQotCS8qIFRoaXMgY3B1IGhhcyBubyBwZW5kaW5nIGVudHJpZXMsIGJ1dCB0aGVyZSBhcmUgbmV3IGVudHJpZXMgKi8KLQlpZiAoIXJkcC0+Y3VybGlzdCAmJiByZHAtPm54dGxpc3QpCi0JCXJldHVybiAxOwotCi0JLyogVGhpcyBjcHUgaGFzIGZpbmlzaGVkIGNhbGxiYWNrcyB0byBpbnZva2UgKi8KLQlpZiAocmRwLT5kb25lbGlzdCkKLQkJcmV0dXJuIDE7Ci0KLQkvKiBUaGUgcmN1IGNvcmUgd2FpdHMgZm9yIGEgcXVpZXNjZW50IHN0YXRlIGZyb20gdGhlIGNwdSAqLwotCWlmIChyZHAtPnF1aWVzY2JhdGNoICE9IHJjcC0+Y3VyIHx8IHJkcC0+cXNfcGVuZGluZykKLQkJcmV0dXJuIDE7Ci0KLQkvKiBub3RoaW5nIHRvIGRvICovCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHJjdV9wZW5kaW5nKGludCBjcHUpCi17Ci0JcmV0dXJuIF9fcmN1X3BlbmRpbmcoJnJjdV9jdHJsYmxrLCAmcGVyX2NwdShyY3VfZGF0YSwgY3B1KSkgfHwKLQkJX19yY3VfcGVuZGluZygmcmN1X2JoX2N0cmxibGssICZwZXJfY3B1KHJjdV9iaF9kYXRhLCBjcHUpKTsKLX0KK2V4dGVybiBpbnQgcmN1X3BlbmRpbmcoaW50IGNwdSk7CiAKIC8qKgogICogcmN1X3JlYWRfbG9jayAtIG1hcmsgdGhlIGJlZ2lubmluZyBvZiBhbiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24uCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JjdXJlZi5oIGIvaW5jbHVkZS9saW51eC9yY3VyZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFhZGJiYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L3JjdXJlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qCi0gKiByY3VyZWYuaAotICoKLSAqIFJlZmVyZW5jZSBjb3VudGluZyBmb3IgZWxlbWVudHMgb2YgbGlzdHMvYXJyYXlzIHByb3RlY3RlZCBieQotICogUkNVLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICogQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMDUKLSAqCi0gKiBBdXRob3I6IERpcGFua2FyIFNhcm1hIDxkaXBhbmthckBpbi5pYm0uY29tPgotICoJICAgUmF2aWtpcmFuIFRoaXJ1bWFsYWkgPGtpcmFuX3RoQGdtYWlsLmNvbT4KLSAqCi0gKiBTZWUgRG9jdW1lbnRhdGlvbi9SQ1UvcmN1cmVmLnR4dCBmb3IgZGV0YWlsZWQgdXNlciBndWlkZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfUkNVUkVGX0hfCi0jZGVmaW5lIF9SQ1VSRUZfSF8KLQotI2lmZGVmIF9fS0VSTkVMX18KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0KLS8qCi0gKiBUaGVzZSBBUElzIHdvcmsgb24gdHJhZGl0aW9uYWwgYXRvbWljX3QgY291bnRlcnMgdXNlZCBpbiB0aGUKLSAqIGtlcm5lbCBmb3IgcmVmZXJlbmNlIGNvdW50aW5nLiBVbmRlciBzcGVjaWFsIGNpcmN1bXN0YW5jZXMKLSAqIHdoZXJlIGEgbG9jay1mcmVlIGdldCgpIG9wZXJhdGlvbiByYWNlcyB3aXRoIGEgcHV0KCkgb3BlcmF0aW9uCi0gKiB0aGVzZSBBUElzIGNhbiBiZSB1c2VkLiBTZWUgRG9jdW1lbnRhdGlvbi9SQ1UvcmN1cmVmLnR4dC4KLSAqLwotCi0jaWZkZWYgX19IQVZFX0FSQ0hfQ01QWENIRwotCi0vKioKLSAqIHJjdXJlZl9pbmMgLSBpbmNyZW1lbnQgcmVmY291bnQgZm9yIG9iamVjdC4KLSAqIEByY3VyZWY6IHJlZmVyZW5jZSBjb3VudGVyIGluIHRoZSBvYmplY3QgaW4gcXVlc3Rpb24uCi0gKgotICogVGhpcyBzaG91bGQgYmUgdXNlZCBvbmx5IGZvciBvYmplY3RzIHdoZXJlIHdlIHVzZSBSQ1UgYW5kCi0gKiB1c2UgdGhlIHJjdXJlZl9pbmNfbGYoKSBhcGkgdG8gYWNxdWlyZSBhIHJlZmVyZW5jZQotICogaW4gYSBsb2NrLWZyZWUgcmVhZGVyLXNpZGUgY3JpdGljYWwgc2VjdGlvbi4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHJjdXJlZl9pbmMoYXRvbWljX3QgKnJjdXJlZikKLXsKLQlhdG9taWNfaW5jKHJjdXJlZik7Ci19Ci0KLS8qKgotICogcmN1cmVmX2RlYyAtIGRlY3JlbWVudCByZWZjb3VudCBmb3Igb2JqZWN0LgotICogQHJjdXJlZjogcmVmZXJlbmNlIGNvdW50ZXIgaW4gdGhlIG9iamVjdCBpbiBxdWVzdGlvbi4KLSAqCi0gKiBUaGlzIHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIG9iamVjdHMgd2hlcmUgd2UgdXNlIFJDVSBhbmQKLSAqIHVzZSB0aGUgcmN1cmVmX2luY19sZigpIGFwaSB0byBhY3F1aXJlIGEgcmVmZXJlbmNlCi0gKiBpbiBhIGxvY2stZnJlZSByZWFkZXItc2lkZSBjcml0aWNhbCBzZWN0aW9uLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcmN1cmVmX2RlYyhhdG9taWNfdCAqcmN1cmVmKQotewotCWF0b21pY19kZWMocmN1cmVmKTsKLX0KLQotLyoqCi0gKiByY3VyZWZfZGVjX2FuZF90ZXN0IC0gZGVjcmVtZW50IHJlZmNvdW50IGZvciBvYmplY3QgYW5kIHRlc3QKLSAqIEByY3VyZWY6IHJlZmVyZW5jZSBjb3VudGVyIGluIHRoZSBvYmplY3QuCi0gKiBAcmVsZWFzZTogcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIGNsZWFuIHVwIHRoZSBvYmplY3QKLSAqCSAgICAgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBpcyByZWxlYXNlZC4KLSAqCSAgICAgVGhpcyBwb2ludGVyIGlzIHJlcXVpcmVkLgotICoKLSAqIERlY3JlbWVudCB0aGUgcmVmY291bnQsIGFuZCBpZiAwLCByZXR1cm4gMS4gRWxzZSByZXR1cm4gMC4KLSAqCi0gKiBUaGlzIHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIG9iamVjdHMgd2hlcmUgd2UgdXNlIFJDVSBhbmQKLSAqIHVzZSB0aGUgcmN1cmVmX2luY19sZigpIGFwaSB0byBhY3F1aXJlIGEgcmVmZXJlbmNlCi0gKiBpbiBhIGxvY2stZnJlZSByZWFkZXItc2lkZSBjcml0aWNhbCBzZWN0aW9uLgotICovCi1zdGF0aWMgaW5saW5lIGludCByY3VyZWZfZGVjX2FuZF90ZXN0KGF0b21pY190ICpyY3VyZWYpCi17Ci0JcmV0dXJuIGF0b21pY19kZWNfYW5kX3Rlc3QocmN1cmVmKTsKLX0KLQotLyoKLSAqIGNtcHhjaGcgaXMgbmVlZGVkIG9uIFVQIHRvbywgaWYgZGVsZXRpb25zIHRvIHRoZSBsaXN0L2FycmF5IGNhbiBoYXBwZW4KLSAqIGluIGludGVycnVwdCBjb250ZXh0LgotICovCi0KLS8qKgotICogcmN1cmVmX2luY19sZiAtIFRha2UgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBpbiBhIHJlYWQtc2lkZQotICogY3JpdGljYWwgc2VjdGlvbiBwcm90ZWN0ZWQgYnkgUkNVLgotICogQHJjdXJlZjogcmVmZXJlbmNlIGNvdW50ZXIgaW4gdGhlIG9iamVjdCBpbiBxdWVzdGlvbi4KLSAqCi0gKiBUcnkgYW5kIGluY3JlbWVudCB0aGUgcmVmY291bnQgYnkgMS4gIFRoZSBpbmNyZW1lbnQgbWlnaHQgZmFpbCBpZgotICogdGhlIHJlZmVyZW5jZSBjb3VudGVyIGhhcyBiZWVuIHRocm91Z2ggYSAxIHRvIDAgdHJhbnNpdGlvbiBhbmQKLSAqIGlzIG5vIGxvbmdlciBwYXJ0IG9mIHRoZSBsb2NrLWZyZWUgbGlzdC4KLSAqIFJldHVybnMgbm9uLXplcm8gb24gc3VjY2Vzc2Z1bCBpbmNyZW1lbnQgYW5kIHplcm8gb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgaW5saW5lIGludCByY3VyZWZfaW5jX2xmKGF0b21pY190ICpyY3VyZWYpCi17Ci0JaW50IGMsIG9sZDsKLQljID0gYXRvbWljX3JlYWQocmN1cmVmKTsKLQl3aGlsZSAoYyAmJiAob2xkID0gY21weGNoZygmcmN1cmVmLT5jb3VudGVyLCBjLCBjICsgMSkpICE9IGMpCi0JCWMgPSBvbGQ7Ci0JcmV0dXJuIGM7Ci19Ci0KLSNlbHNlCQkJCS8qICFfX0hBVkVfQVJDSF9DTVBYQ0hHICovCi0KLWV4dGVybiBzcGlubG9ja190IF9fcmN1cmVmX2hhc2hbXTsKLQotLyoKLSAqIFVzZSBhIGhhc2ggdGFibGUgb2YgbG9ja3MgdG8gcHJvdGVjdCB0aGUgcmVmZXJlbmNlIGNvdW50Ci0gKiBzaW5jZSBjbXB4Y2hnIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBhcmNoLgotICovCi0jaWZkZWYJQ09ORklHX1NNUAotI2RlZmluZSBSQ1VSRUZfSEFTSF9TSVpFCTQKLSNkZWZpbmUgUkNVUkVGX0hBU0goaykgXAotCSgmX19yY3VyZWZfaGFzaFsoKCh1bnNpZ25lZCBsb25nKWspPj44KSAmIChSQ1VSRUZfSEFTSF9TSVpFLTEpXSkKLSNlbHNlCi0jZGVmaW5lCVJDVVJFRl9IQVNIX1NJWkUJMQotI2RlZmluZSBSQ1VSRUZfSEFTSChrKSAJJl9fcmN1cmVmX2hhc2hbMF0KLSNlbmRpZgkJCQkvKiBDT05GSUdfU01QICovCi0KLS8qKgotICogcmN1cmVmX2luYyAtIGluY3JlbWVudCByZWZjb3VudCBmb3Igb2JqZWN0LgotICogQHJjdXJlZjogcmVmZXJlbmNlIGNvdW50ZXIgaW4gdGhlIG9iamVjdCBpbiBxdWVzdGlvbi4KLSAqCi0gKiBUaGlzIHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIG9iamVjdHMgd2hlcmUgd2UgdXNlIFJDVSBhbmQKLSAqIHVzZSB0aGUgcmN1cmVmX2luY19sZigpIGFwaSB0byBhY3F1aXJlIGEgcmVmZXJlbmNlIGluIGEgbG9jay1mcmVlCi0gKiByZWFkZXItc2lkZSBjcml0aWNhbCBzZWN0aW9uLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcmN1cmVmX2luYyhhdG9taWNfdCAqcmN1cmVmKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoUkNVUkVGX0hBU0gocmN1cmVmKSwgZmxhZ3MpOwotCXJjdXJlZi0+Y291bnRlciArPSAxOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoUkNVUkVGX0hBU0gocmN1cmVmKSwgZmxhZ3MpOwotfQotCi0vKioKLSAqIHJjdXJlZl9kZWMgLSBkZWNyZW1lbnQgcmVmY291bnQgZm9yIG9iamVjdC4KLSAqIEByY3VyZWY6IHJlZmVyZW5jZSBjb3VudGVyIGluIHRoZSBvYmplY3QgaW4gcXVlc3Rpb24uCi0gKgotICogVGhpcyBzaG91bGQgYmUgdXNlZCBvbmx5IGZvciBvYmplY3RzIHdoZXJlIHdlIHVzZSBSQ1UgYW5kCi0gKiB1c2UgdGhlIHJjdXJlZl9pbmNfbGYoKSBhcGkgdG8gYWNxdWlyZSBhIHJlZmVyZW5jZSBpbiBhIGxvY2stZnJlZQotICogcmVhZGVyLXNpZGUgY3JpdGljYWwgc2VjdGlvbi4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHJjdXJlZl9kZWMoYXRvbWljX3QgKnJjdXJlZikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXNwaW5fbG9ja19pcnFzYXZlKFJDVVJFRl9IQVNIKHJjdXJlZiksIGZsYWdzKTsKLQlyY3VyZWYtPmNvdW50ZXIgLT0gMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKFJDVVJFRl9IQVNIKHJjdXJlZiksIGZsYWdzKTsKLX0KLQotLyoqCi0gKiByY3VyZWZfZGVjX2FuZF90ZXN0IC0gZGVjcmVtZW50IHJlZmNvdW50IGZvciBvYmplY3QgYW5kIHRlc3QKLSAqIEByY3VyZWY6IHJlZmVyZW5jZSBjb3VudGVyIGluIHRoZSBvYmplY3QuCi0gKiBAcmVsZWFzZTogcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIGNsZWFuIHVwIHRoZSBvYmplY3QKLSAqCSAgICAgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBpcyByZWxlYXNlZC4KLSAqCSAgICAgVGhpcyBwb2ludGVyIGlzIHJlcXVpcmVkLgotICoKLSAqIERlY3JlbWVudCB0aGUgcmVmY291bnQsIGFuZCBpZiAwLCByZXR1cm4gMS4gRWxzZSByZXR1cm4gMC4KLSAqCi0gKiBUaGlzIHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIG9iamVjdHMgd2hlcmUgd2UgdXNlIFJDVSBhbmQKLSAqIHVzZSB0aGUgcmN1cmVmX2luY19sZigpIGFwaSB0byBhY3F1aXJlIGEgcmVmZXJlbmNlIGluIGEgbG9jay1mcmVlCi0gKiByZWFkZXItc2lkZSBjcml0aWNhbCBzZWN0aW9uLgotICovCi1zdGF0aWMgaW5saW5lIGludCByY3VyZWZfZGVjX2FuZF90ZXN0KGF0b21pY190ICpyY3VyZWYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzcGluX2xvY2tfaXJxc2F2ZShSQ1VSRUZfSEFTSChyY3VyZWYpLCBmbGFncyk7Ci0JcmN1cmVmLT5jb3VudGVyLS07Ci0JaWYgKCFyY3VyZWYtPmNvdW50ZXIpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShSQ1VSRUZfSEFTSChyY3VyZWYpLCBmbGFncyk7Ci0JCXJldHVybiAxOwotCX0gZWxzZSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoUkNVUkVGX0hBU0gocmN1cmVmKSwgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLS8qKgotICogcmN1cmVmX2luY19sZiAtIFRha2UgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBvZiBhIGxvY2stZnJlZSBjb2xsZWN0aW9uCi0gKiBieSB0cmF2ZXJzaW5nIGEgbG9jay1mcmVlIGxpc3QvYXJyYXkuCi0gKiBAcmN1cmVmOiByZWZlcmVuY2UgY291bnRlciBpbiB0aGUgb2JqZWN0IGluIHF1ZXN0aW9uLgotICoKLSAqIFRyeSBhbmQgaW5jcmVtZW50IHRoZSByZWZjb3VudCBieSAxLiAgVGhlIGluY3JlbWVudCBtaWdodCBmYWlsIGlmCi0gKiB0aGUgcmVmZXJlbmNlIGNvdW50ZXIgaGFzIGJlZW4gdGhyb3VnaCBhIDEgdG8gMCB0cmFuc2l0aW9uIGFuZAotICogb2JqZWN0IGlzIG5vIGxvbmdlciBwYXJ0IG9mIHRoZSBsb2NrLWZyZWUgbGlzdC4KLSAqIFJldHVybnMgbm9uLXplcm8gb24gc3VjY2Vzc2Z1bCBpbmNyZW1lbnQgYW5kIHplcm8gb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgaW5saW5lIGludCByY3VyZWZfaW5jX2xmKGF0b21pY190ICpyY3VyZWYpCi17Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXNwaW5fbG9ja19pcnFzYXZlKFJDVVJFRl9IQVNIKHJjdXJlZiksIGZsYWdzKTsKLQlpZiAocmN1cmVmLT5jb3VudGVyKQotCQlyZXQgPSByY3VyZWYtPmNvdW50ZXIrKzsKLQllbHNlCi0JCXJldCA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShSQ1VSRUZfSEFTSChyY3VyZWYpLCBmbGFncyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi0jZW5kaWYgLyogIV9fSEFWRV9BUkNIX0NNUFhDSEcgKi8KLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLSNlbmRpZiAvKiBfUkNVUkVGX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlYm9vdC5oIGIvaW5jbHVkZS9saW51eC9yZWJvb3QuaAppbmRleCA3YWIyY2RiLi4wMTUyOTdmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlYm9vdC5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVib290LmgKQEAgLTYwLDggKzYwLDcgQEAKICAqLwogCiBleHRlcm4gdm9pZCBrZXJuZWxfcmVzdGFydF9wcmVwYXJlKGNoYXIgKmNtZCk7Ci1leHRlcm4gdm9pZCBrZXJuZWxfaGFsdF9wcmVwYXJlKHZvaWQpOwotZXh0ZXJuIHZvaWQga2VybmVsX3Bvd2VyX29mZl9wcmVwYXJlKHZvaWQpOworZXh0ZXJuIHZvaWQga2VybmVsX3NodXRkb3duX3ByZXBhcmUoZW51bSBzeXN0ZW1fc3RhdGVzIHN0YXRlKTsKIAogZXh0ZXJuIHZvaWQga2VybmVsX3Jlc3RhcnQoY2hhciAqY21kKTsKIGV4dGVybiB2b2lkIGtlcm5lbF9oYWx0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mcy5oIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mcy5oCmluZGV4IDAwMWFiODIuLmUyNzZjNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzLmgKQEAgLTE4NTcsNyArMTg1Nyw3IEBACiAjZGVmaW5lIEdFVF9CTE9DS19DUkVBVEUgMQkvKiBhZGQgYW55dGhpbmcgeW91IG5lZWQgdG8gZmluZCBibG9jayAqLwogI2RlZmluZSBHRVRfQkxPQ0tfTk9fSE9MRSAyCS8qIHJldHVybiAtRU5PRU5UIGZvciBmaWxlIGhvbGVzICovCiAjZGVmaW5lIEdFVF9CTE9DS19SRUFEX0RJUkVDVCA0CS8qIHJlYWQgdGhlIHRhaWwgaWYgaW5kaXJlY3QgaXRlbSBub3QgZm91bmQgKi8KLSNkZWZpbmUgR0VUX0JMT0NLX05PX0lTRU0gICAgIDgJLyogaV9zZW0gaXMgbm90IGhlbGQsIGRvbid0IHByZWFsbG9jYXRlICovCisjZGVmaW5lIEdFVF9CTE9DS19OT19JTVVYICAgICA4CS8qIGlfbXV0ZXggaXMgbm90IGhlbGQsIGRvbid0IHByZWFsbG9jYXRlICovCiAjZGVmaW5lIEdFVF9CTE9DS19OT19EQU5HTEUgICAxNgkvKiBkb24ndCBsZWF2ZSBhbnkgdHJhbnNhY3Rpb25zIHJ1bm5pbmcgKi8KIAogaW50IHJlc3RhcnRfdHJhbnNhY3Rpb24oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlbGF5ZnNfZnMuaCBiL2luY2x1ZGUvbGludXgvcmVsYXlmc19mcy5oCmluZGV4IGZiN2U4MDcuLjczNDJlNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVsYXlmc19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVsYXlmc19mcy5oCkBAIC02NSwyMCArNjUsNiBAQAogfTsKIAogLyoKLSAqIFJlbGF5ZnMgaW5vZGUKLSAqLwotc3RydWN0IHJlbGF5ZnNfaW5vZGVfaW5mbwotewotCXN0cnVjdCBpbm9kZSB2ZnNfaW5vZGU7Ci0Jc3RydWN0IHJjaGFuX2J1ZiAqYnVmOwotfTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVsYXlmc19pbm9kZV9pbmZvICpSRUxBWUZTX0koc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKGlub2RlLCBzdHJ1Y3QgcmVsYXlmc19pbm9kZV9pbmZvLCB2ZnNfaW5vZGUpOwotfQotCi0vKgogICogUmVsYXkgY2hhbm5lbCBjbGllbnQgY2FsbGJhY2tzCiAgKi8KIHN0cnVjdCByY2hhbl9jYWxsYmFja3MKQEAgLTEyNCw2ICsxMTAsNDYgQEAKIAkgKi8KICAgICAgICAgdm9pZCAoKmJ1Zl91bm1hcHBlZCkoc3RydWN0IHJjaGFuX2J1ZiAqYnVmLAogCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlscCk7CisJLyoKKwkgKiBjcmVhdGVfYnVmX2ZpbGUgLSBjcmVhdGUgZmlsZSB0byByZXByZXNlbnQgYSByZWxheWZzIGNoYW5uZWwgYnVmZmVyCisJICogQGZpbGVuYW1lOiB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjcmVhdGUKKwkgKiBAcGFyZW50OiB0aGUgcGFyZW50IG9mIHRoZSBmaWxlIHRvIGNyZWF0ZQorCSAqIEBtb2RlOiB0aGUgbW9kZSBvZiB0aGUgZmlsZSB0byBjcmVhdGUKKwkgKiBAYnVmOiB0aGUgY2hhbm5lbCBidWZmZXIKKwkgKiBAaXNfZ2xvYmFsOiBvdXRwYXJhbSAtIHNldCBub24temVybyBpZiB0aGUgYnVmZmVyIHNob3VsZCBiZSBnbG9iYWwKKwkgKgorCSAqIENhbGxlZCBkdXJpbmcgcmVsYXlfb3BlbigpLCBvbmNlIGZvciBlYWNoIHBlci1jcHUgYnVmZmVyLAorCSAqIHRvIGFsbG93IHRoZSBjbGllbnQgdG8gY3JlYXRlIGEgZmlsZSB0byBiZSB1c2VkIHRvCisJICogcmVwcmVzZW50IHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgYnVmZmVyLiAgSWYgdGhlIGZpbGUgaXMKKwkgKiBjcmVhdGVkIG91dHNpZGUgb2YgcmVsYXlmcywgdGhlIHBhcmVudCBtdXN0IGFsc28gZXhpc3QgaW4KKwkgKiB0aGF0IGZpbGVzeXN0ZW0uCisJICoKKwkgKiBUaGUgY2FsbGJhY2sgc2hvdWxkIHJldHVybiB0aGUgZGVudHJ5IG9mIHRoZSBmaWxlIGNyZWF0ZWQKKwkgKiB0byByZXByZXNlbnQgdGhlIHJlbGF5IGJ1ZmZlci4KKwkgKgorCSAqIFNldHRpbmcgdGhlIGlzX2dsb2JhbCBvdXRwYXJhbSB0byBhIG5vbi16ZXJvIHZhbHVlIHdpbGwKKwkgKiBjYXVzZSByZWxheV9vcGVuKCkgdG8gY3JlYXRlIGEgc2luZ2xlIGdsb2JhbCBidWZmZXIgcmF0aGVyCisJICogdGhhbiB0aGUgZGVmYXVsdCBzZXQgb2YgcGVyLWNwdSBidWZmZXJzLgorCSAqCisJICogU2VlIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcmVsYXlmcy50eHQgZm9yIG1vcmUgaW5mby4KKwkgKi8KKwlzdHJ1Y3QgZGVudHJ5ICooKmNyZWF0ZV9idWZfZmlsZSkoY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCQkJCSAgc3RydWN0IGRlbnRyeSAqcGFyZW50LAorCQkJCQkgIGludCBtb2RlLAorCQkJCQkgIHN0cnVjdCByY2hhbl9idWYgKmJ1ZiwKKwkJCQkJICBpbnQgKmlzX2dsb2JhbCk7CisKKwkvKgorCSAqIHJlbW92ZV9idWZfZmlsZSAtIHJlbW92ZSBmaWxlIHJlcHJlc2VudGluZyBhIHJlbGF5ZnMgY2hhbm5lbCBidWZmZXIKKwkgKiBAZGVudHJ5OiB0aGUgZGVudHJ5IG9mIHRoZSBmaWxlIHRvIHJlbW92ZQorCSAqCisJICogQ2FsbGVkIGR1cmluZyByZWxheV9jbG9zZSgpLCBvbmNlIGZvciBlYWNoIHBlci1jcHUgYnVmZmVyLAorCSAqIHRvIGFsbG93IHRoZSBjbGllbnQgdG8gcmVtb3ZlIGEgZmlsZSB1c2VkIHRvIHJlcHJlc2VudCBhCisJICogY2hhbm5lbCBidWZmZXIuCisJICoKKwkgKiBUaGUgY2FsbGJhY2sgc2hvdWxkIHJldHVybiAwIGlmIHN1Y2Nlc3NmdWwsIG5lZ2F0aXZlIGlmIG5vdC4KKwkgKi8KKwlpbnQgKCpyZW1vdmVfYnVmX2ZpbGUpKHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CiB9OwogCiAvKgpAQCAtMTQ4LDYgKzE3NCwxMiBAQAogZXh0ZXJuIHN0cnVjdCBkZW50cnkgKnJlbGF5ZnNfY3JlYXRlX2Rpcihjb25zdCBjaGFyICpuYW1lLAogCQkJCQkgc3RydWN0IGRlbnRyeSAqcGFyZW50KTsKIGV4dGVybiBpbnQgcmVsYXlmc19yZW1vdmVfZGlyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CitleHRlcm4gc3RydWN0IGRlbnRyeSAqcmVsYXlmc19jcmVhdGVfZmlsZShjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgIHN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJCQkJICBpbnQgbW9kZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzLAorCQkJCQkgIHZvaWQgKmRhdGEpOworZXh0ZXJuIGludCByZWxheWZzX3JlbW92ZV9maWxlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CiAKIC8qKgogICoJcmVsYXlfd3JpdGUgLSB3cml0ZSBkYXRhIGludG8gdGhlIGNoYW5uZWwKQEAgLTI0NywxMCArMjc5LDkgQEAKIH0KIAogLyoKLSAqIGV4cG9ydGVkIHJlbGF5ZnMgZmlsZSBvcGVyYXRpb25zLCBmcy9yZWxheWZzL2lub2RlLmMKKyAqIGV4cG9ydGVkIHJlbGF5IGZpbGUgb3BlcmF0aW9ucywgZnMvcmVsYXlmcy9pbm9kZS5jCiAgKi8KLQotZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVsYXlmc19maWxlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZWxheV9maWxlX29wZXJhdGlvbnM7CiAKICNlbmRpZiAvKiBfTElOVVhfUkVMQVlGU19GU19IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmlvX2Rydi5oIGIvaW5jbHVkZS9saW51eC9yaW9fZHJ2LmgKaW5kZXggM2JkN2NjZS4uZjU0NzcyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yaW9fZHJ2LmgKKysrIGIvaW5jbHVkZS9saW51eC9yaW9fZHJ2LmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9yaW8uaD4KIAogZXh0ZXJuIGludCBfX3Jpb19sb2NhbF9yZWFkX2NvbmZpZ18zMihzdHJ1Y3QgcmlvX21wb3J0ICpwb3J0LCB1MzIgb2Zmc2V0LApAQCAtMzM2LDggKzMzNyw4IEBACiAKIC8qKgogICogUklPX0RFVklDRSAtIG1hY3JvIHVzZWQgdG8gZGVzY3JpYmUgYSBzcGVjaWZpYyBSSU8gZGV2aWNlCi0gKiBAdmlkOiB0aGUgMTYgYml0IFJJTyB2ZW5kb3IgSUQKLSAqIEBkaWQ6IHRoZSAxNiBiaXQgUklPIGRldmljZSBJRAorICogQGRldjogdGhlIDE2IGJpdCBSSU8gZGV2aWNlIElECisgKiBAdmVuOiB0aGUgMTYgYml0IFJJTyB2ZW5kb3IgSUQKICAqCiAgKiBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gY3JlYXRlIGEgc3RydWN0IHJpb19kZXZpY2VfaWQgdGhhdCBtYXRjaGVzIGEKICAqIHNwZWNpZmljIGRldmljZS4gIFRoZSBhc3NlbWJseSB2ZW5kb3IgYW5kIGFzc2VtYmx5IGRldmljZSBmaWVsZHMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcnRjLmggYi9pbmNsdWRlL2xpbnV4L3J0Yy5oCmluZGV4IGUxYWFmMWYuLjBiMmJhNjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcnRjLmgKKysrIGIvaW5jbHVkZS9saW51eC9ydGMuaApAQCAtMTEsNiArMTEsOCBAQAogI2lmbmRlZiBfTElOVVhfUlRDX0hfCiAjZGVmaW5lIF9MSU5VWF9SVENfSF8KIAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCiAvKgogICogVGhlIHN0cnVjdCB1c2VkIHRvIHBhc3MgZGF0YSB2aWEgdGhlIGZvbGxvd2luZyBpb2N0bC4gU2ltaWxhciB0byB0aGUKICAqIHN0cnVjdCB0bSBpbiA8dGltZS5oPiwgYnV0IGl0IG5lZWRzIHRvIGJlIGhlcmUgc28gdGhhdCB0aGUga2VybmVsIApAQCAtMTAyLDYgKzEwNCw3IEBACiBpbnQgcnRjX3VucmVnaXN0ZXIocnRjX3Rhc2tfdCAqdGFzayk7CiBpbnQgcnRjX2NvbnRyb2wocnRjX3Rhc2tfdCAqdCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogdm9pZCBydGNfZ2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqcnRjX3RtKTsKK2lycXJldHVybl90IHJ0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCA3ZGEzMzYxLi4wY2ZjZDFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KICNpbmNsdWRlIDxsaW51eC9zZWNjb21wLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2F1eHZlYy5oPgkvKiBGb3IgQVRfVkVDVE9SX1NJWkUgKi8KIApAQCAtMTA0LDYgKzEwNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9yZXNvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCkBAIC0xNTgsNiArMTYwLDcgQEAKICNkZWZpbmUgU0NIRURfTk9STUFMCQkwCiAjZGVmaW5lIFNDSEVEX0ZJRk8JCTEKICNkZWZpbmUgU0NIRURfUlIJCTIKKyNkZWZpbmUgU0NIRURfQkFUQ0gJCTMKIAogc3RydWN0IHNjaGVkX3BhcmFtIHsKIAlpbnQgc2NoZWRfcHJpb3JpdHk7CkBAIC0zNTAsOCArMzUzLDE2IEBACiAJYXRvbWljX3QJCWNvdW50OwogCXN0cnVjdCBrX3NpZ2FjdGlvbglhY3Rpb25bX05TSUddOwogCXNwaW5sb2NrX3QJCXNpZ2xvY2s7CisJc3RydWN0IHJjdV9oZWFkCQlyY3U7CiB9OwogCitleHRlcm4gdm9pZCBzaWdoYW5kX2ZyZWVfY2Ioc3RydWN0IHJjdV9oZWFkICpyaHApOworCitzdGF0aWMgaW5saW5lIHZvaWQgc2lnaGFuZF9mcmVlKHN0cnVjdCBzaWdoYW5kX3N0cnVjdCAqc3ApCit7CisJY2FsbF9yY3UoJnNwLT5yY3UsIHNpZ2hhbmRfZnJlZV9jYik7Cit9CisKIC8qCiAgKiBOT1RFISAic2lnbmFsX3N0cnVjdCIgZG9lcyBub3QgaGF2ZSBpdCdzIG93bgogICogbG9ja2luZywgYmVjYXVzZSBhIHNoYXJlZCBzaWduYWxfc3RydWN0IGFsd2F5cwpAQCAtMzg5LDggKzQwMCw4IEBACiAJc3RydWN0IGxpc3RfaGVhZCBwb3NpeF90aW1lcnM7CiAKIAkvKiBJVElNRVJfUkVBTCB0aW1lciBmb3IgdGhlIHByb2Nlc3MgKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCByZWFsX3RpbWVyOwotCXVuc2lnbmVkIGxvbmcgaXRfcmVhbF92YWx1ZSwgaXRfcmVhbF9pbmNyOworCXN0cnVjdCBocnRpbWVyIHJlYWxfdGltZXI7CisJa3RpbWVfdCBpdF9yZWFsX2luY3I7CiAKIAkvKiBJVElNRVJfUFJPRiBhbmQgSVRJTUVSX1ZJUlRVQUwgdGltZXJzIGZvciB0aGUgcHJvY2VzcyAqLwogCWNwdXRpbWVfdCBpdF9wcm9mX2V4cGlyZXMsIGl0X3ZpcnRfZXhwaXJlczsKQEAgLTQ2MCw5ICs0NzEsOSBAQAogCiAvKgogICogUHJpb3JpdHkgb2YgYSBwcm9jZXNzIGdvZXMgZnJvbSAwLi5NQVhfUFJJTy0xLCB2YWxpZCBSVAotICogcHJpb3JpdHkgaXMgMC4uTUFYX1JUX1BSSU8tMSwgYW5kIFNDSEVEX05PUk1BTCB0YXNrcyBhcmUKLSAqIGluIHRoZSByYW5nZSBNQVhfUlRfUFJJTy4uTUFYX1BSSU8tMS4gUHJpb3JpdHkgdmFsdWVzCi0gKiBhcmUgaW52ZXJ0ZWQ6IGxvd2VyIHAtPnByaW8gdmFsdWUgbWVhbnMgaGlnaGVyIHByaW9yaXR5LgorICogcHJpb3JpdHkgaXMgMC4uTUFYX1JUX1BSSU8tMSwgYW5kIFNDSEVEX05PUk1BTC9TQ0hFRF9CQVRDSAorICogdGFza3MgYXJlIGluIHRoZSByYW5nZSBNQVhfUlRfUFJJTy4uTUFYX1BSSU8tMS4gUHJpb3JpdHkKKyAqIHZhbHVlcyBhcmUgaW52ZXJ0ZWQ6IGxvd2VyIHAtPnByaW8gdmFsdWUgbWVhbnMgaGlnaGVyIHByaW9yaXR5LgogICoKICAqIFRoZSBNQVhfVVNFUl9SVF9QUklPIHZhbHVlIGFsbG93cyB0aGUgYWN0dWFsIG1heGltdW0KICAqIFJUIHByaW9yaXR5IHRvIGJlIHNlcGFyYXRlIGZyb20gdGhlIHZhbHVlIGV4cG9ydGVkIHRvCkBAIC02MjEsNyArNjMyLDE0IEBACiAKIGV4dGVybiB2b2lkIHBhcnRpdGlvbl9zY2hlZF9kb21haW5zKGNwdW1hc2tfdCAqcGFydGl0aW9uMSwKIAkJCQkgICAgY3B1bWFza190ICpwYXJ0aXRpb24yKTsKLSNlbmRpZiAvKiBDT05GSUdfU01QICovCisKKy8qCisgKiBNYXhpbXVtIGNhY2hlIHNpemUgdGhlIG1pZ3JhdGlvbi1jb3N0cyBhdXRvLXR1bmluZyBjb2RlIHdpbGwKKyAqIHNlYXJjaCBmcm9tOgorICovCitleHRlcm4gdW5zaWduZWQgaW50IG1heF9jYWNoZV9zaXplOworCisjZW5kaWYJLyogQ09ORklHX1NNUCAqLwogCiAKIHN0cnVjdCBpb19jb250ZXh0OwkJCS8qIFNlZSBibGtkZXYuaCAqLwpAQCAtNjc5LDkgKzY5NywxMiBAQAogCiAJaW50IGxvY2tfZGVwdGg7CQkvKiBCS0wgbG9jayBkZXB0aCAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfU01QKSAmJiBkZWZpbmVkKF9fQVJDSF9XQU5UX1VOTE9DS0VEX0NUWFNXKQorI2lmIGRlZmluZWQoQ09ORklHX1NNUCkKKwlpbnQgbGFzdF93YWtlcl9jcHU7CS8qIENQVSB0aGF0IGxhc3Qgd29rZSB0aGlzIHRhc2sgdXAgKi8KKyNpZiBkZWZpbmVkKF9fQVJDSF9XQU5UX1VOTE9DS0VEX0NUWFNXKQogCWludCBvbmNwdTsKICNlbmRpZgorI2VuZGlmCiAJaW50IHByaW8sIHN0YXRpY19wcmlvOwogCXN0cnVjdCBsaXN0X2hlYWQgcnVuX2xpc3Q7CiAJcHJpb19hcnJheV90ICphcnJheTsKQEAgLTc2Miw2ICs3ODMsNyBAQAogCXVuc2lnbmVkIGtlZXBfY2FwYWJpbGl0aWVzOjE7CiAJc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyOwogI2lmZGVmIENPTkZJR19LRVlTCisJc3RydWN0IGtleSAqcmVxdWVzdF9rZXlfYXV0aDsJLyogYXNzdW1lZCByZXF1ZXN0X2tleSBhdXRob3JpdHkgKi8KIAlzdHJ1Y3Qga2V5ICp0aHJlYWRfa2V5cmluZzsJLyoga2V5cmluZyBwcml2YXRlIHRvIHRoaXMgdGhyZWFkICovCiAJdW5zaWduZWQgY2hhciBqaXRfa2V5cmluZzsJLyogZGVmYXVsdCBrZXlyaW5nIHRvIGF0dGFjaCByZXF1ZXN0ZWQga2V5cyB0byAqLwogI2VuZGlmCkBAIC03ODcsNiArODA5LDcgQEAKIAlzdHJ1Y3Qgc2lnaGFuZF9zdHJ1Y3QgKnNpZ2hhbmQ7CiAKIAlzaWdzZXRfdCBibG9ja2VkLCByZWFsX2Jsb2NrZWQ7CisJc2lnc2V0X3Qgc2F2ZWRfc2lnbWFzazsJCS8qIFRvIGJlIHJlc3RvcmVkIHdpdGggVElGX1JFU1RPUkVfU0lHTUFTSyAqLwogCXN0cnVjdCBzaWdwZW5kaW5nIHBlbmRpbmc7CiAKIAl1bnNpZ25lZCBsb25nIHNhc19zc19zcDsKQEAgLTgwNyw2ICs4MzAsMTEgQEAKIC8qIFByb3RlY3Rpb24gb2YgcHJvY19kZW50cnk6IG5lc3RpbmcgcHJvY19sb2NrLCBkY2FjaGVfbG9jaywgd3JpdGVfbG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOyAqLwogCXNwaW5sb2NrX3QgcHJvY19sb2NrOwogCisjaWZkZWYgQ09ORklHX0RFQlVHX01VVEVYRVMKKwkvKiBtdXRleCBkZWFkbG9jayBkZXRlY3Rpb24gKi8KKwlzdHJ1Y3QgbXV0ZXhfd2FpdGVyICpibG9ja2VkX29uOworI2VuZGlmCisKIC8qIGpvdXJuYWxsaW5nIGZpbGVzeXN0ZW0gaW5mbyAqLwogCXZvaWQgKmpvdXJuYWxfaW5mbzsKIApAQCAtODQ0LDYgKzg3Miw3IEBACiAJaW50IGNwdXNldF9tZW1zX2dlbmVyYXRpb247CiAjZW5kaWYKIAlhdG9taWNfdCBmc19leGNsOwkvKiBob2xkaW5nIGZzIGV4Y2x1c2l2ZSByZXNvdXJjZXMgKi8KKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwogfTsKIAogc3RhdGljIGlubGluZSBwaWRfdCBwcm9jZXNzX2dyb3VwKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQpAQCAtODY3LDggKzg5NiwxNCBAQAogZXh0ZXJuIHZvaWQgZnJlZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKIGV4dGVybiB2b2lkIF9fcHV0X3Rhc2tfc3RydWN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKICNkZWZpbmUgZ2V0X3Rhc2tfc3RydWN0KHRzaykgZG8geyBhdG9taWNfaW5jKCYodHNrKS0+dXNhZ2UpOyB9IHdoaWxlKDApCi0jZGVmaW5lIHB1dF90YXNrX3N0cnVjdCh0c2spIFwKLWRvIHsgaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJih0c2spLT51c2FnZSkpIF9fcHV0X3Rhc2tfc3RydWN0KHRzayk7IH0gd2hpbGUoMCkKKworZXh0ZXJuIHZvaWQgX19wdXRfdGFza19zdHJ1Y3RfY2Ioc3RydWN0IHJjdV9oZWFkICpyaHApOworCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3Rhc2tfc3RydWN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdC0+dXNhZ2UpKQorCQljYWxsX3JjdSgmdC0+cmN1LCBfX3B1dF90YXNrX3N0cnVjdF9jYik7Cit9CiAKIC8qCiAgKiBQZXIgcHJvY2VzcyBmbGFncwpAQCAtODk1LDYgKzkzMCw3IEBACiAjZGVmaW5lIFBGX1NZTkNXUklURQkweDAwMjAwMDAwCS8qIEkgYW0gZG9pbmcgYSBzeW5jIHdyaXRlICovCiAjZGVmaW5lIFBGX0JPUlJPV0VEX01NCTB4MDA0MDAwMDAJLyogSSBhbSBhIGt0aHJlYWQgZG9pbmcgdXNlX21tICovCiAjZGVmaW5lIFBGX1JBTkRPTUlaRQkweDAwODAwMDAwCS8qIHJhbmRvbWl6ZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKi8KKyNkZWZpbmUgUEZfU1dBUFdSSVRFCTB4MDEwMDAwMDAJLyogQWxsb3dlZCB0byB3cml0ZSB0byBzd2FwICovCiAKIC8qCiAgKiBPbmx5IHRoZSBfY3VycmVudF8gdGFzayBjYW4gcmVhZC93cml0ZSB0byB0c2stPmZsYWdzLCBidXQgb3RoZXIKQEAgLTEwODgsMjEgKzExMjQsNiBAQAogCQk6IG9uX3NpZ19zdGFjayhzcCkgPyBTU19PTlNUQUNLIDogMCk7CiB9CiAKLQotI2lmZGVmIENPTkZJR19TRUNVUklUWQotLyogY29kZSBpcyBpbiBzZWN1cml0eS5jICovCi1leHRlcm4gaW50IGNhcGFibGUoaW50IGNhcCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgY2FwYWJsZShpbnQgY2FwKQotewotCWlmIChjYXBfcmFpc2VkKGN1cnJlbnQtPmNhcF9lZmZlY3RpdmUsIGNhcCkpIHsKLQkJY3VycmVudC0+ZmxhZ3MgfD0gUEZfU1VQRVJQUklWOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQogLyoKICAqIFJvdXRpbmVzIGZvciBoYW5kbGluZyBtbV9zdHJ1Y3RzCiAgKi8KQEAgLTEyMjEsNiArMTI0Miw3IEBACiAjaWZuZGVmIF9fSEFWRV9USFJFQURfRlVOQ1RJT05TCiAKICNkZWZpbmUgdGFza190aHJlYWRfaW5mbyh0YXNrKSAodGFzayktPnRocmVhZF9pbmZvCisjZGVmaW5lIHRhc2tfc3RhY2tfcGFnZSh0YXNrKSAoKHZvaWQqKSgodGFzayktPnRocmVhZF9pbmZvKSkKIAogc3RhdGljIGlubGluZSB2b2lkIHNldHVwX3RocmVhZF9zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCB0YXNrX3N0cnVjdCAqb3JnKQogewpAQCAtMTM2NiwxMiArMTM4OCw4IEBACiBleHRlcm4gbG9uZyBzY2hlZF9zZXRhZmZpbml0eShwaWRfdCBwaWQsIGNwdW1hc2tfdCBuZXdfbWFzayk7CiBleHRlcm4gbG9uZyBzY2hlZF9nZXRhZmZpbml0eShwaWRfdCBwaWQsIGNwdW1hc2tfdCAqbWFzayk7CiAKLSNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKLQogZXh0ZXJuIHZvaWQgbm9ybWFsaXplX3J0X3Rhc2tzKHZvaWQpOwogCi0jZW5kaWYKLQogI2lmZGVmIENPTkZJR19QTQogLyoKICAqIENoZWNrIGlmIGEgcHJvY2VzcyBoYXMgYmVlbiBmcm96ZW4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NyZWVuX2luZm8uaCBiL2luY2x1ZGUvbGludXgvc2NyZWVuX2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzM2OTg3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zY3JlZW5faW5mby5oCkBAIC0wLDAgKzEsNzYgQEAKKyNpZm5kZWYgX1NDUkVFTl9JTkZPX0gKKyNkZWZpbmUgX1NDUkVFTl9JTkZPX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBUaGVzZSBhcmUgc2V0IHVwIGJ5IHRoZSBzZXR1cC1yb3V0aW5lIGF0IGJvb3QtdGltZToKKyAqLworCitzdHJ1Y3Qgc2NyZWVuX2luZm8geworCXU4ICBvcmlnX3g7CQkvKiAweDAwICovCisJdTggIG9yaWdfeTsJCS8qIDB4MDEgKi8KKwl1MTYgZG9udHVzZTE7CQkvKiAweDAyIC0tIEVYVF9NRU1fSyBzaXRzIGhlcmUgKi8KKwl1MTYgb3JpZ192aWRlb19wYWdlOwkvKiAweDA0ICovCisJdTggIG9yaWdfdmlkZW9fbW9kZTsJLyogMHgwNiAqLworCXU4ICBvcmlnX3ZpZGVvX2NvbHM7CS8qIDB4MDcgKi8KKwl1MTYgdW51c2VkMjsJCS8qIDB4MDggKi8KKwl1MTYgb3JpZ192aWRlb19lZ2FfYng7CS8qIDB4MGEgKi8KKwl1MTYgdW51c2VkMzsJCS8qIDB4MGMgKi8KKwl1OCAgb3JpZ192aWRlb19saW5lczsJLyogMHgwZSAqLworCXU4ICBvcmlnX3ZpZGVvX2lzVkdBOwkvKiAweDBmICovCisJdTE2IG9yaWdfdmlkZW9fcG9pbnRzOwkvKiAweDEwICovCisKKwkvKiBWRVNBIGdyYXBoaWMgbW9kZSAtLSBsaW5lYXIgZnJhbWUgYnVmZmVyICovCisJdTE2IGxmYl93aWR0aDsJCS8qIDB4MTIgKi8KKwl1MTYgbGZiX2hlaWdodDsJCS8qIDB4MTQgKi8KKwl1MTYgbGZiX2RlcHRoOwkJLyogMHgxNiAqLworCXUzMiBsZmJfYmFzZTsJCS8qIDB4MTggKi8KKwl1MzIgbGZiX3NpemU7CQkvKiAweDFjICovCisJdTE2IGRvbnR1c2UyLCBkb250dXNlMzsJLyogMHgyMCAtLSBDTF9NQUdJQyBhbmQgQ0xfT0ZGU0VUIGhlcmUgKi8KKwl1MTYgbGZiX2xpbmVsZW5ndGg7CS8qIDB4MjQgKi8KKwl1OCAgcmVkX3NpemU7CQkvKiAweDI2ICovCisJdTggIHJlZF9wb3M7CQkvKiAweDI3ICovCisJdTggIGdyZWVuX3NpemU7CQkvKiAweDI4ICovCisJdTggIGdyZWVuX3BvczsJCS8qIDB4MjkgKi8KKwl1OCAgYmx1ZV9zaXplOwkJLyogMHgyYSAqLworCXU4ICBibHVlX3BvczsJCS8qIDB4MmIgKi8KKwl1OCAgcnN2ZF9zaXplOwkJLyogMHgyYyAqLworCXU4ICByc3ZkX3BvczsJCS8qIDB4MmQgKi8KKwl1MTYgdmVzYXBtX3NlZzsJCS8qIDB4MmUgKi8KKwl1MTYgdmVzYXBtX29mZjsJCS8qIDB4MzAgKi8KKwl1MTYgcGFnZXM7CQkvKiAweDMyICovCisJdTE2IHZlc2FfYXR0cmlidXRlczsJLyogMHgzNCAqLworCQkJCS8qIDB4MzYgLS0gMHgzZiByZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworfTsKKworZXh0ZXJuIHN0cnVjdCBzY3JlZW5faW5mbyBzY3JlZW5faW5mbzsKKworI2RlZmluZSBPUklHX1gJCQkoc2NyZWVuX2luZm8ub3JpZ194KQorI2RlZmluZSBPUklHX1kJCQkoc2NyZWVuX2luZm8ub3JpZ195KQorI2RlZmluZSBPUklHX1ZJREVPX01PREUJCShzY3JlZW5faW5mby5vcmlnX3ZpZGVvX21vZGUpCisjZGVmaW5lIE9SSUdfVklERU9fQ09MUyAJKHNjcmVlbl9pbmZvLm9yaWdfdmlkZW9fY29scykKKyNkZWZpbmUgT1JJR19WSURFT19FR0FfQlgJKHNjcmVlbl9pbmZvLm9yaWdfdmlkZW9fZWdhX2J4KQorI2RlZmluZSBPUklHX1ZJREVPX0xJTkVTCShzY3JlZW5faW5mby5vcmlnX3ZpZGVvX2xpbmVzKQorI2RlZmluZSBPUklHX1ZJREVPX0lTVkdBCShzY3JlZW5faW5mby5vcmlnX3ZpZGVvX2lzVkdBKQorI2RlZmluZSBPUklHX1ZJREVPX1BPSU5UUyAgICAgICAoc2NyZWVuX2luZm8ub3JpZ192aWRlb19wb2ludHMpCisKKyNkZWZpbmUgVklERU9fVFlQRV9NREEJCTB4MTAJLyogTW9ub2Nocm9tZSBUZXh0IERpc3BsYXkJKi8KKyNkZWZpbmUgVklERU9fVFlQRV9DR0EJCTB4MTEJLyogQ0dBIERpc3BsYXkgCQkJKi8KKyNkZWZpbmUgVklERU9fVFlQRV9FR0FNCQkweDIwCS8qIEVHQS9WR0EgaW4gTW9ub2Nocm9tZSBNb2RlCSovCisjZGVmaW5lIFZJREVPX1RZUEVfRUdBQwkJMHgyMQkvKiBFR0EgaW4gQ29sb3IgTW9kZQkJKi8KKyNkZWZpbmUgVklERU9fVFlQRV9WR0FDCQkweDIyCS8qIFZHQSsgaW4gQ29sb3IgTW9kZQkJKi8KKyNkZWZpbmUgVklERU9fVFlQRV9WTEZCCQkweDIzCS8qIFZFU0EgVkdBIGluIGdyYXBoaWMgbW9kZQkqLworCisjZGVmaW5lIFZJREVPX1RZUEVfUElDQV9TMwkweDMwCS8qIEFDRVIgUElDQS02MSBsb2NhbCBTMyB2aWRlbwkqLworI2RlZmluZSBWSURFT19UWVBFX01JUFNfRzM2NAkweDMxICAgIC8qIE1JUFMgTWFnbnVtIDQwMDAgRzM2NCB2aWRlbyAgKi8KKyNkZWZpbmUgVklERU9fVFlQRV9TR0kgICAgICAgICAgMHgzMyAgICAvKiBWYXJpb3VzIFNHSSBncmFwaGljcyBoYXJkd2FyZSAqLworCisjZGVmaW5lIFZJREVPX1RZUEVfVEdBQwkJMHg0MAkvKiBERUMgVEdBICovCisKKyNkZWZpbmUgVklERU9fVFlQRV9TVU4gICAgICAgICAgMHg1MCAgICAvKiBTdW4gZnJhbWUgYnVmZmVyLiAqLworI2RlZmluZSBWSURFT19UWVBFX1NVTlBDSSAgICAgICAweDUxICAgIC8qIFN1biBQQ0kgYmFzZWQgZnJhbWUgYnVmZmVyLiAqLworCisjZGVmaW5lIFZJREVPX1RZUEVfUE1BQwkJMHg2MAkvKiBQb3dlck1hY2ludG9zaCBmcmFtZSBidWZmZXIuICovCisKKyNlbmRpZiAvKiBfU0NSRUVOX0lORk9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZGxhLmggYi9pbmNsdWRlL2xpbnV4L3NkbGEuaAppbmRleCAzYjZhZmI4Li41NjRhY2QzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NkbGEuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NkbGEuaApAQCAtMjkzLDQ2ICsyOTMsNDYgQEAKICNkZWZpbmUgU0RMQV9TNTA4X0lOVEVOCQkJMHgxMAogCiBzdHJ1Y3Qgc2RsYV9jbWQgewotICAgY2hhciAgb3BwX2ZsYWcJCV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgY2hhciAgY21kCQkJX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICBzaG9ydCBsZW5ndGgJCQlfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgIGNoYXIgIHJldHZhbAkJCV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgc2hvcnQgZGxjaQkJCV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgY2hhciAgZmxhZ3MJCQlfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgIHNob3J0IHJ4bG9zdF9pbnQJCV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgbG9uZyAgcnhsb3N0X2FwcAkJX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICBjaGFyICByZXNlcnZlWzJdCQlfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgIGNoYXIgIGRhdGFbU0RMQV9NQVhfREFUQV0JX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CS8qIHRyYW5zZmVyIGRhdGEgYnVmZmVyICovCi19OworICAgY2hhciAgb3BwX2ZsYWc7CisgICBjaGFyICBjbWQ7CisgICBzaG9ydCBsZW5ndGg7CisgICBjaGFyICByZXR2YWw7CisgICBzaG9ydCBkbGNpOworICAgY2hhciAgZmxhZ3M7CisgICBzaG9ydCByeGxvc3RfaW50OworICAgbG9uZyAgcnhsb3N0X2FwcDsKKyAgIGNoYXIgIHJlc2VydmVbMl07CisgICBjaGFyICBkYXRhW1NETEFfTUFYX0RBVEFdOwkvKiB0cmFuc2ZlciBkYXRhIGJ1ZmZlciAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IGludHJfaW5mbyB7Ci0gICBjaGFyICBmbGFncwkJX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICBzaG9ydCB0eGxlbgkJX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICBjaGFyICBpcnEJCV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgY2hhciAgZmxhZ3MyCQlfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgIHNob3J0IHRpbWVvdXQJX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci19OworICAgY2hhciAgZmxhZ3M7CisgICBzaG9ydCB0eGxlbjsKKyAgIGNoYXIgIGlycTsKKyAgIGNoYXIgIGZsYWdzMjsKKyAgIHNob3J0IHRpbWVvdXQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBmb3VuZCBpbiB0aGUgNTA4J3MgY29udHJvbCB3aW5kb3cgYXQgUlhCVUZfSU5GTyAqLwogc3RydWN0IGJ1Zl9pbmZvIHsKLSAgIHVuc2lnbmVkIHNob3J0IHJzZV9udW0JX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICB1bnNpZ25lZCBsb25nICByc2VfYmFzZQlfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgIHVuc2lnbmVkIGxvbmcgIHJzZV9uZXh0CV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgdW5zaWduZWQgbG9uZyAgYnVmX2Jhc2UJX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICB1bnNpZ25lZCBzaG9ydCByZXNlcnZlZAlfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgIHVuc2lnbmVkIGxvbmcgIGJ1Zl90b3AJX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci19OworICAgdW5zaWduZWQgc2hvcnQgcnNlX251bTsKKyAgIHVuc2lnbmVkIGxvbmcgIHJzZV9iYXNlOworICAgdW5zaWduZWQgbG9uZyAgcnNlX25leHQ7CisgICB1bnNpZ25lZCBsb25nICBidWZfYmFzZTsKKyAgIHVuc2lnbmVkIHNob3J0IHJlc2VydmVkOworICAgdW5zaWduZWQgbG9uZyAgYnVmX3RvcDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IHJzZV9iYXNlIGluIFJYQlVGX0lORk8gc3RydWN0ICovCiBzdHJ1Y3QgYnVmX2VudHJ5IHsKLSAgIGNoYXIgIG9wcF9mbGFnCV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgc2hvcnQgbGVuZ3RoCQlfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgIHNob3J0IGRsY2kJCV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgY2hhciAgZmxhZ3MJCV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgc2hvcnQgdGltZXN0YW1wCV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgc2hvcnQgcmVzZXJ2ZWRbMl0JX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICBsb25nICBidWZfYWRkcglfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLX07CisgICBjaGFyICBvcHBfZmxhZzsKKyAgIHNob3J0IGxlbmd0aDsKKyAgIHNob3J0IGRsY2k7CisgICBjaGFyICBmbGFnczsKKyAgIHNob3J0IHRpbWVzdGFtcDsKKyAgIHNob3J0IHJlc2VydmVkWzJdOworICAgbG9uZyAgYnVmX2FkZHI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZWNjb21wLmggYi9pbmNsdWRlL2xpbnV4L3NlY2NvbXAuaAppbmRleCBkYzg5MTE2Li5jZDI3NzNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlY2NvbXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlY2NvbXAuaApAQCAtMjYsMTEgKzI2LDcgQEAKIAogI2Vsc2UgLyogQ09ORklHX1NFQ0NPTVAgKi8KIAotI2lmIChfX0dOVUNfXyA+IDIpCi0gIHR5cGVkZWYgc3RydWN0IHsgfSBzZWNjb21wX3Q7Ci0jZWxzZQotICB0eXBlZGVmIHN0cnVjdCB7IGludCBnY2NfaXNfYnVnZ3k7IH0gc2VjY29tcF90OwotI2VuZGlmCit0eXBlZGVmIHN0cnVjdCB7IH0gc2VjY29tcF90OwogCiAjZGVmaW5lIHNlY3VyZV9jb21wdXRpbmcoeCkgZG8geyB9IHdoaWxlICgwKQogLyogc3RhdGljIGlubGluZSB0byBwcmVzZXJ2ZSB0eXBlY2hlY2tpbmcgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaAppbmRleCBlMzcxMGQ3Li5lYzM1MTAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCkBAIC02Nyw2ICs2Nyw5IEBACiAvKiBQYXJpc2MgdHlwZSBudW1iZXJzLiAqLwogI2RlZmluZSBQT1JUX01VWAk0OAogCisvKiBBdG1lbCBBVDkxUk05MjAwIFNvQyAqLworI2RlZmluZSBQT1JUX0FUOTFSTTkyMDAgNDkKKwogLyogTWFjaW50b3NoIFppbG9nIHR5cGUgbnVtYmVycyAqLwogI2RlZmluZSBQT1JUX01BQ19aSUxPRwk1MAkvKiBtNjhrIDogbm90IHlldCBpbXBsZW1lbnRlZCAqLwogI2RlZmluZSBQT1JUX1BNQUNfWklMT0cJNTEKQEAgLTEzMyw2ICsxMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiBzdHJ1Y3QgdWFydF9wb3J0Owogc3RydWN0IHVhcnRfaW5mbzsKQEAgLTI4MSw3ICsyODUsNyBAQAogCXN0cnVjdCB1YXJ0X2luZm8JKmluZm87CiAJc3RydWN0IHVhcnRfcG9ydAkqcG9ydDsKIAotCXN0cnVjdCBzZW1hcGhvcmUJc2VtOworCXN0cnVjdCBtdXRleAkJbXV0ZXg7CiB9OwogCiAjZGVmaW5lIFVBUlRfWE1JVF9TSVpFCVBBR0VfU0laRQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zaG1lbV9mcy5oIGIvaW5jbHVkZS9saW51eC9zaG1lbV9mcy5oCmluZGV4IGMzZTU5ODIuLmMwNTdmMGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2htZW1fZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NobWVtX2ZzLmgKQEAgLTI2LDYgKzI2LDggQEAKIAl1bnNpZ25lZCBsb25nIGZyZWVfYmxvY2tzOyAgLyogSG93IG1hbnkgYXJlIGxlZnQgZm9yIGFsbG9jYXRpb24gKi8KIAl1bnNpZ25lZCBsb25nIG1heF9pbm9kZXM7ICAgLyogSG93IG1hbnkgaW5vZGVzIGFyZSBhbGxvd2VkICovCiAJdW5zaWduZWQgbG9uZyBmcmVlX2lub2RlczsgIC8qIEhvdyBtYW55IGFyZSBsZWZ0IGZvciBhbGxvY2F0aW9uICovCisJaW50IHBvbGljeTsJCSAgICAvKiBEZWZhdWx0IE5VTUEgbWVtb3J5IGFsbG9jIHBvbGljeSAqLworCW5vZGVtYXNrX3QgcG9saWN5X25vZGVzOyAgICAvKiBub2RlbWFzayBmb3IgcHJlZmVycmVkIGFuZCBiaW5kICovCiAJc3BpbmxvY2tfdCAgICBzdGF0X2xvY2s7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oIGIvaW5jbHVkZS9saW51eC9zaWduYWwuaAppbmRleCA1ZGQ1ZjAyLi5iN2QwOTM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2lnbmFsLmgKQEAgLTE4LDYgKzE4LDE5IEBACiAjZGVmaW5lIFNBX1BST0JFCQlTQV9PTkVTSE9UCiAjZGVmaW5lIFNBX1NBTVBMRV9SQU5ET00JU0FfUkVTVEFSVAogI2RlZmluZSBTQV9TSElSUQkJMHgwNDAwMDAwMAorLyoKKyAqIEFzIGFib3ZlLCB0aGVzZSBjb3JyZXNwb25kIHRvIHRoZSBJT1JFU09VUkNFX0lSUV8qIGRlZmluZXMgaW4KKyAqIGxpbnV4L2lvcG9ydC5oIHRvIHNlbGVjdCB0aGUgaW50ZXJydXB0IGxpbmUgYmVoYXZpb3VyLiAgV2hlbgorICogcmVxdWVzdGluZyBhbiBpbnRlcnJ1cHQgd2l0aG91dCBzcGVjaWZ5aW5nIGEgU0FfVFJJR0dFUiwgdGhlCisgKiBzZXR0aW5nIHNob3VsZCBiZSBhc3N1bWVkIHRvIGJlICJhcyBhbHJlYWR5IGNvbmZpZ3VyZWQiLCB3aGljaAorICogbWF5IGJlIGFzIHBlciBtYWNoaW5lIG9yIGZpcm13YXJlIGluaXRpYWxpc2F0aW9uLgorICovCisjZGVmaW5lIFNBX1RSSUdHRVJfTE9XCQkweDAwMDAwMDA4CisjZGVmaW5lIFNBX1RSSUdHRVJfSElHSAkJMHgwMDAwMDAwNAorI2RlZmluZSBTQV9UUklHR0VSX0ZBTExJTkcJMHgwMDAwMDAwMgorI2RlZmluZSBTQV9UUklHR0VSX1JJU0lORwkweDAwMDAwMDAxCisjZGVmaW5lIFNBX1RSSUdHRVJfTUFTSwkoU0FfVFJJR0dFUl9ISUdIfFNBX1RSSUdHRVJfTE9XfFwKKwkJCQkgU0FfVFJJR0dFUl9SSVNJTkd8U0FfVFJJR0dFUl9GQUxMSU5HKQogCiAvKgogICogUmVhbCBUaW1lIHNpZ25hbHMgbWF5IGJlIHF1ZXVlZC4KQEAgLTgxLDYgKzk0LDIzIEBACiAKICNlbmRpZiAvKiBfX0hBVkVfQVJDSF9TSUdfQklUT1BTICovCiAKK3N0YXRpYyBpbmxpbmUgaW50IHNpZ2lzZW1wdHlzZXQoc2lnc2V0X3QgKnNldCkKK3sKKwlleHRlcm4gdm9pZCBfTlNJR19XT1JEU19pc191bnN1cHBvcnRlZF9zaXplKHZvaWQpOworCXN3aXRjaCAoX05TSUdfV09SRFMpIHsKKwljYXNlIDQ6CisJCXJldHVybiAoc2V0LT5zaWdbM10gfCBzZXQtPnNpZ1syXSB8CisJCQlzZXQtPnNpZ1sxXSB8IHNldC0+c2lnWzBdKSA9PSAwOworCWNhc2UgMjoKKwkJcmV0dXJuIChzZXQtPnNpZ1sxXSB8IHNldC0+c2lnWzBdKSA9PSAwOworCWNhc2UgMToKKwkJcmV0dXJuIHNldC0+c2lnWzBdID09IDA7CisJZGVmYXVsdDoKKwkJX05TSUdfV09SRFNfaXNfdW5zdXBwb3J0ZWRfc2l6ZSgpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKICNkZWZpbmUgc2lnbWFzayhzaWcpCSgxVUwgPDwgKChzaWcpIC0gMSkpCiAKICNpZm5kZWYgX19IQVZFX0FSQ0hfU0lHX1NFVE9QUwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaCBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKaW5kZXggNDgzY2ZjNC4uYWQ3Y2MyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCkBAIC0yNTEsNyArMjUxLDcgQEAKIAkgKiB3YW50IHRvIGtlZXAgdGhlbSBhY3Jvc3MgbGF5ZXJzIHlvdSBoYXZlIHRvIGRvIGEgc2tiX2Nsb25lKCkKIAkgKiBmaXJzdC4gVGhpcyBpcyBvd25lZCBieSB3aG9ldmVyIGhhcyB0aGUgc2tiIHF1ZXVlZCBBVE0uCiAJICovCi0JY2hhcgkJCWNiWzQwXTsKKwljaGFyCQkJY2JbNDhdOwogCiAJdW5zaWduZWQgaW50CQlsZW4sCiAJCQkJZGF0YV9sZW4sCkBAIC05MjYsNyArOTI2LDcgQEAKICAqCUluY3JlYXNlIHRoZSBoZWFkcm9vbSBvZiBhbiBlbXB0eSAmc2tfYnVmZiBieSByZWR1Y2luZyB0aGUgdGFpbAogICoJcm9vbS4gVGhpcyBpcyBvbmx5IGFsbG93ZWQgZm9yIGFuIGVtcHR5IGJ1ZmZlci4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIHNrYl9yZXNlcnZlKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3Jlc2VydmUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxlbikKIHsKIAlza2ItPmRhdGEgKz0gbGVuOwogCXNrYi0+dGFpbCArPSBsZW47CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NsYWIuaCBiL2luY2x1ZGUvbGludXgvc2xhYi5oCmluZGV4IGQxZWE0MDUuLjFmYjc3YTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2xhYi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2xhYi5oCkBAIC01Myw2ICs1Myw4IEBACiAjZGVmaW5lIFNMQUJfQ1RPUl9BVE9NSUMJMHgwMDJVTAkJLyogdGVsbCBjb25zdHJ1Y3RvciBpdCBjYW4ndCBzbGVlcCAqLwogI2RlZmluZQlTTEFCX0NUT1JfVkVSSUZZCTB4MDA0VUwJCS8qIHRlbGwgY29uc3RydWN0b3IgaXQncyBhIHZlcmlmeSBjYWxsICovCiAKKyNpZm5kZWYgQ09ORklHX1NMT0IKKwogLyogcHJvdG90eXBlcyAqLwogZXh0ZXJuIHZvaWQgX19pbml0IGttZW1fY2FjaGVfaW5pdCh2b2lkKTsKIApAQCAtMTM0LDYgKzEzNiwzOSBAQAogZXh0ZXJuIGludCBGQVNUQ0FMTChrbWVtX2NhY2hlX3JlYXAoaW50KSk7CiBleHRlcm4gaW50IEZBU1RDQUxMKGttZW1fcHRyX3ZhbGlkYXRlKGttZW1fY2FjaGVfdCAqY2FjaGVwLCB2b2lkICpwdHIpKTsKIAorI2Vsc2UgLyogQ09ORklHX1NMT0IgKi8KKworLyogU0xPQiBhbGxvY2F0b3Igcm91dGluZXMgKi8KKwordm9pZCBrbWVtX2NhY2hlX2luaXQodm9pZCk7CitzdHJ1Y3Qga21lbV9jYWNoZSAqa21lbV9maW5kX2dlbmVyYWxfY2FjaGVwKHNpemVfdCwgZ2ZwX3QgZ2ZwZmxhZ3MpOworc3RydWN0IGttZW1fY2FjaGUgKmttZW1fY2FjaGVfY3JlYXRlKGNvbnN0IGNoYXIgKmMsIHNpemVfdCwgc2l6ZV90LAorCXVuc2lnbmVkIGxvbmcsCisJdm9pZCAoKikodm9pZCAqLCBzdHJ1Y3Qga21lbV9jYWNoZSAqLCB1bnNpZ25lZCBsb25nKSwKKwl2b2lkICgqKSh2b2lkICosIHN0cnVjdCBrbWVtX2NhY2hlICosIHVuc2lnbmVkIGxvbmcpKTsKK2ludCBrbWVtX2NhY2hlX2Rlc3Ryb3koc3RydWN0IGttZW1fY2FjaGUgKmMpOwordm9pZCAqa21lbV9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqYywgZ2ZwX3QgZmxhZ3MpOwordm9pZCBrbWVtX2NhY2hlX2ZyZWUoc3RydWN0IGttZW1fY2FjaGUgKmMsIHZvaWQgKmIpOworY29uc3QgY2hhciAqa21lbV9jYWNoZV9uYW1lKHN0cnVjdCBrbWVtX2NhY2hlICopOwordm9pZCAqa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpOwordm9pZCAqa3phbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpOwordm9pZCBrZnJlZShjb25zdCB2b2lkICptKTsKK3Vuc2lnbmVkIGludCBrc2l6ZShjb25zdCB2b2lkICptKTsKK3Vuc2lnbmVkIGludCBrbWVtX2NhY2hlX3NpemUoc3RydWN0IGttZW1fY2FjaGUgKmMpOworCitzdGF0aWMgaW5saW5lIHZvaWQgKmtjYWxsb2Moc2l6ZV90IG4sIHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKK3sKKwlyZXR1cm4ga3phbGxvYyhuICogc2l6ZSwgZmxhZ3MpOworfQorCisjZGVmaW5lIGttZW1fY2FjaGVfc2hyaW5rKGQpICgwKQorI2RlZmluZSBrbWVtX2NhY2hlX3JlYXAoYSkKKyNkZWZpbmUga21lbV9wdHJfdmFsaWRhdGUoYSwgYikgKDApCisjZGVmaW5lIGttZW1fY2FjaGVfYWxsb2Nfbm9kZShjLCBmLCBuKSBrbWVtX2NhY2hlX2FsbG9jKGMsIGYpCisjZGVmaW5lIGttYWxsb2Nfbm9kZShzLCBmLCBuKSBrbWFsbG9jKHMsIGYpCisKKyNlbmRpZiAvKiBDT05GSUdfU0xPQiAqLworCiAvKiBTeXN0ZW0gd2lkZSBjYWNoZXMgKi8KIGV4dGVybiBrbWVtX2NhY2hlX3QJKnZtX2FyZWFfY2FjaGVwOwogZXh0ZXJuIGttZW1fY2FjaGVfdAkqbmFtZXNfY2FjaGVwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbWJfZnMuaCBiL2luY2x1ZGUvbGludXgvc21iX2ZzLmgKaW5kZXggYzQxNTMxMi4uNjIxYTNkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbWJfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NtYl9mcy5oCkBAIC01OCw1MyArNTgsNiBAQAogLyogd2hlcmUgdG8gZmluZCB0aGUgYmFzZSBvZiB0aGUgU01CIHBhY2tldCBwcm9wZXIgKi8KICNkZWZpbmUgc21iX2Jhc2UoYnVmKSAoKHU4ICopKCgodTggKikoYnVmKSkrNCkpCiAKLSNpZmRlZiBERUJVR19TTUJfTUFMTE9DCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLWV4dGVybiBpbnQgc21iX21hbGxvY2VkOwotZXh0ZXJuIGludCBzbWJfY3VycmVudF92bWFsbG9jZWQ7Ci1leHRlcm4gaW50IHNtYl9jdXJyZW50X2ttYWxsb2NlZDsKLQotc3RhdGljIGlubGluZSB2b2lkICoKLXNtYl92bWFsbG9jKHVuc2lnbmVkIGludCBzaXplKQotewotICAgICAgICBzbWJfbWFsbG9jZWQgKz0gMTsKLSAgICAgICAgc21iX2N1cnJlbnRfdm1hbGxvY2VkICs9IDE7Ci0gICAgICAgIHJldHVybiB2bWFsbG9jKHNpemUpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXNtYl92ZnJlZSh2b2lkICpvYmopCi17Ci0gICAgICAgIHNtYl9jdXJyZW50X3ZtYWxsb2NlZCAtPSAxOwotICAgICAgICB2ZnJlZShvYmopOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgKgotc21iX2ttYWxsb2Moc2l6ZV90IHNpemUsIGludCBmbGFncykKLXsKLQlzbWJfbWFsbG9jZWQgKz0gMTsKLQlzbWJfY3VycmVudF9rbWFsbG9jZWQgKz0gMTsKLQlyZXR1cm4ga21hbGxvYyhzaXplLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotc21iX2tmcmVlKHZvaWQgKm9iaikKLXsKLQlzbWJfY3VycmVudF9rbWFsbG9jZWQgLT0gMTsKLQlrZnJlZShvYmopOwotfQotCi0jZWxzZSAvKiBERUJVR19TTUJfTUFMTE9DICovCi0KLSNkZWZpbmUgc21iX2ttYWxsb2MocyxwKQlrbWFsbG9jKHMscCkKLSNkZWZpbmUgc21iX2tmcmVlKG8pCQlrZnJlZShvKQotI2RlZmluZSBzbWJfdm1hbGxvYyhzKQkJdm1hbGxvYyhzKQotI2RlZmluZSBzbWJfdmZyZWUobykJCXZmcmVlKG8pCi0KLSNlbmRpZiAvKiBERUJVR19TTUJfTUFMTE9DICovCi0KIC8qCiAgKiBGbGFncyBmb3IgdGhlIGluLW1lbW9yeSBpbm9kZQogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaAppbmRleCA5ZjQwMTkxLi5iMDJkZGE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCisrKyBiL2luY2x1ZGUvbGludXgvc29ja2V0LmgKQEAgLTE4Niw2ICsxODYsNyBAQAogI2RlZmluZSBBRl9QUFBPWAkyNAkvKiBQUFBvWCBzb2NrZXRzCQkqLwogI2RlZmluZSBBRl9XQU5QSVBFCTI1CS8qIFdhbnBpcGUgQVBJIFNvY2tldHMgKi8KICNkZWZpbmUgQUZfTExDCQkyNgkvKiBMaW51eCBMTEMJCQkqLworI2RlZmluZSBBRl9USVBDCQkzMAkvKiBUSVBDIHNvY2tldHMJCQkqLwogI2RlZmluZSBBRl9CTFVFVE9PVEgJMzEJLyogQmx1ZXRvb3RoIHNvY2tldHMgCQkqLwogI2RlZmluZSBBRl9NQVgJCTMyCS8qIEZvciBub3cuLiAqLwogCkBAIC0yMTgsNiArMjE5LDcgQEAKICNkZWZpbmUgUEZfUFBQT1gJQUZfUFBQT1gKICNkZWZpbmUgUEZfV0FOUElQRQlBRl9XQU5QSVBFCiAjZGVmaW5lIFBGX0xMQwkJQUZfTExDCisjZGVmaW5lIFBGX1RJUEMJCUFGX1RJUEMKICNkZWZpbmUgUEZfQkxVRVRPT1RICUFGX0JMVUVUT09USAogI2RlZmluZSBQRl9NQVgJCUFGX01BWAogCkBAIC0yNzksNiArMjgxLDcgQEAKICNkZWZpbmUgU09MX0xMQwkJMjY4CiAjZGVmaW5lIFNPTF9EQ0NQCTI2OQogI2RlZmluZSBTT0xfTkVUTElOSwkyNzAKKyNkZWZpbmUgU09MX1RJUEMJMjcxCiAKIC8qIElQWCBvcHRpb25zICovCiAjZGVmaW5lIElQWF9UWVBFCTEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL2Fkczc4NDYuaCBiL2luY2x1ZGUvbGludXgvc3BpL2Fkczc4NDYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjI2MWUwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zcGkvYWRzNzg0Ni5oCkBAIC0wLDAgKzEsMTggQEAKKy8qIGxpbnV4L3NwaS9hZHM3ODQ2LmggKi8KKworLyogVG91Y2hzY3JlZW4gY2hhcmFjdGVyaXN0aWNzIHZhcnkgYmV0d2VlbiBib2FyZHMgYW5kIG1vZGVscy4gIFRoZQorICogcGxhdGZvcm1fZGF0YSBmb3IgdGhlIGRldmljZSdzICJzdHJ1Y3QgZGV2aWNlIiBob2xkcyB0aGlzIGluZm9ybWF0aW9uLgorICoKKyAqIEl0J3MgT0sgaWYgdGhlIG1pbi9tYXggdmFsdWVzIGFyZSB6ZXJvLgorICovCitzdHJ1Y3QgYWRzNzg0Nl9wbGF0Zm9ybV9kYXRhIHsKKwl1MTYJbW9kZWw7CQkJLyogNzg0MywgNzg0NSwgNzg0Ni4gKi8KKwl1MTYJdnJlZl9kZWxheV91c2VjczsJLyogMCBmb3IgZXh0ZXJuYWwgdnJlZjsgZXRjICovCisJdTE2CXhfcGxhdGVfb2htczsKKwl1MTYJeV9wbGF0ZV9vaG1zOworCisJdTE2CXhfbWluLCB4X21heDsKKwl1MTYJeV9taW4sIHlfbWF4OworCXUxNglwcmVzc3VyZV9taW4sIHByZXNzdXJlX21heDsKK307CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL2ZsYXNoLmggYi9pbmNsdWRlL2xpbnV4L3NwaS9mbGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMjI5MzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS9mbGFzaC5oCkBAIC0wLDAgKzEsMzEgQEAKKyNpZm5kZWYgTElOVVhfU1BJX0ZMQVNIX0gKKyNkZWZpbmUgTElOVVhfU1BJX0ZMQVNIX0gKKworc3RydWN0IG10ZF9wYXJ0aXRpb247CisKKy8qKgorICogc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGE6IGJvYXJkLXNwZWNpZmljIGZsYXNoIGRhdGEKKyAqIEBuYW1lOiBvcHRpb25hbCBmbGFzaCBkZXZpY2UgbmFtZSAoZWcsIGFzIHVzZWQgd2l0aCBtdGRwYXJ0cz0pCisgKiBAcGFydHM6IG9wdGlvbmFsIGFycmF5IG9mIG10ZF9wYXJ0aXRpb25zIGZvciBzdGF0aWMgcGFydGl0aW9uaW5nCisgKiBAbnJfcGFydHM6IG51bWJlciBvZiBtdGRfcGFydGl0aW9ucyBmb3Igc3RhdGljIHBhcnRpdG9uaW5nCisgKiBAdHlwZTogb3B0aW9uYWwgZmxhc2ggZGV2aWNlIHR5cGUgKGUuZy4gbTI1cDgwIHZzIG0yNXA2NCksIGZvciB1c2UKKyAqCXdpdGggY2hpcHMgdGhhdCBjYW4ndCBiZSBxdWVyaWVkIGZvciBKRURFQyBvciBvdGhlciBJRHMKKyAqCisgKiBCb2FyZCBpbml0IGNvZGUgKGluIGFyY2gvLi4uL21hY2gteHh4L2JvYXJkLXl5eS5jIGZpbGVzKSBjYW4KKyAqIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgU1BJIGZsYXNoIHBhcnRzIChzdWNoIGFzIERhdGFGbGFzaCkgdG8KKyAqIGhlbHAgc2V0IHVwIHRoZSBkZXZpY2UgYW5kIGl0cyBhcHByb3ByaWF0ZSBkZWZhdWx0IHBhcnRpdGlvbmluZy4KKyAqCisgKiBOb3RlIHRoYXQgZm9yIERhdGFGbGFzaCwgc2l6ZXMgZm9yIHBhZ2VzLCBibG9ja3MsIGFuZCBzZWN0b3JzIGFyZQorICogcmFyZWx5IHBvd2VycyBvZiB0d287IGFuZCBwYXJ0aXRpb25zIHNob3VsZCBiZSBzZWN0b3ItYWxpZ25lZC4KKyAqLworc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgeworCWNoYXIJCSpuYW1lOworCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsKKwl1bnNpZ25lZCBpbnQJbnJfcGFydHM7CisKKwljaGFyCQkqdHlwZTsKKworCS8qIHdlJ2xsIGxpa2VseSBhZGQgbW9yZSAuLi4gdXNlIEpFREVDIElEcywgZXRjICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1ZjE0NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oCkBAIC0wLDAgKzEsNjY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IERhdmlkIEJyb3duZWxsCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1NQSV9ICisjZGVmaW5lIF9fTElOVVhfU1BJX0gKKworLyoKKyAqIElOVEVSRkFDRVMgYmV0d2VlbiBTUEkgbWFzdGVyLXNpZGUgZHJpdmVycyBhbmQgU1BJIGluZnJhc3RydWN0dXJlLgorICogKFRoZXJlJ3Mgbm8gU1BJIHNsYXZlIHN1cHBvcnQgZm9yIExpbnV4IHlldC4uLikKKyAqLworZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBzcGlfYnVzX3R5cGU7CisKKy8qKgorICogc3RydWN0IHNwaV9kZXZpY2UgLSBNYXN0ZXIgc2lkZSBwcm94eSBmb3IgYW4gU1BJIHNsYXZlIGRldmljZQorICogQGRldjogRHJpdmVyIG1vZGVsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkZXZpY2UuCisgKiBAbWFzdGVyOiBTUEkgY29udHJvbGxlciB1c2VkIHdpdGggdGhlIGRldmljZS4KKyAqIEBtYXhfc3BlZWRfaHo6IE1heGltdW0gY2xvY2sgcmF0ZSB0byBiZSB1c2VkIHdpdGggdGhpcyBjaGlwCisgKgkob24gdGhpcyBib2FyZCk7IG1heSBiZSBjaGFuZ2VkIGJ5IHRoZSBkZXZpY2UncyBkcml2ZXIuCisgKiBAY2hpcC1zZWxlY3Q6IENoaXBzZWxlY3QsIGRpc3Rpbmd1aXNoaW5nIGNoaXBzIGhhbmRsZWQgYnkgIm1hc3RlciIuCisgKiBAbW9kZTogVGhlIHNwaSBtb2RlIGRlZmluZXMgaG93IGRhdGEgaXMgY2xvY2tlZCBvdXQgYW5kIGluLgorICoJVGhpcyBtYXkgYmUgY2hhbmdlZCBieSB0aGUgZGV2aWNlJ3MgZHJpdmVyLgorICogQGJpdHNfcGVyX3dvcmQ6IERhdGEgdHJhbnNmZXJzIGludm9sdmUgb25lIG9yIG1vcmUgd29yZHM7IHdvcmQgc2l6ZXMKKyAqIAlsaWtlIGVpZ2h0IG9yIDEyIGJpdHMgYXJlIGNvbW1vbi4gIEluLW1lbW9yeSB3b3Jkc2l6ZXMgYXJlCisgKglwb3dlcnMgb2YgdHdvIGJ5dGVzIChlLmcuIDIwIGJpdCBzYW1wbGVzIHVzZSAzMiBiaXRzKS4KKyAqCVRoaXMgbWF5IGJlIGNoYW5nZWQgYnkgdGhlIGRldmljZSdzIGRyaXZlci4KKyAqIEBpcnE6IE5lZ2F0aXZlLCBvciB0aGUgbnVtYmVyIHBhc3NlZCB0byByZXF1ZXN0X2lycSgpIHRvIHJlY2VpdmUKKyAqIAlpbnRlcnJ1cHRzIGZyb20gdGhpcyBkZXZpY2UuCisgKiBAY29udHJvbGxlcl9zdGF0ZTogQ29udHJvbGxlcidzIHJ1bnRpbWUgc3RhdGUKKyAqIEBjb250cm9sbGVyX2RhdGE6IEJvYXJkLXNwZWNpZmljIGRlZmluaXRpb25zIGZvciBjb250cm9sbGVyLCBzdWNoIGFzCisgKiAJRklGTyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzOyBmcm9tIGJvYXJkX2luZm8uY29udHJvbGxlcl9kYXRhCisgKgorICogQW4gc3BpX2RldmljZSBpcyB1c2VkIHRvIGludGVyY2hhbmdlIGRhdGEgYmV0d2VlbiBhbiBTUEkgc2xhdmUKKyAqICh1c3VhbGx5IGEgZGlzY3JldGUgY2hpcCkgYW5kIENQVSBtZW1vcnkuCisgKgorICogSW4gImRldiIsIHRoZSBwbGF0Zm9ybV9kYXRhIGlzIHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzCisgKiBkZXZpY2UgdGhhdCdzIG1lYW5pbmdmdWwgdG8gdGhlIGRldmljZSdzIHByb3RvY29sIGRyaXZlciwgYnV0IG5vdAorICogdG8gaXRzIGNvbnRyb2xsZXIuICBPbmUgZXhhbXBsZSBtaWdodCBiZSBhbiBpZGVudGlmaWVyIGZvciBhIGNoaXAKKyAqIHZhcmlhbnQgd2l0aCBzbGlnaHRseSBkaWZmZXJlbnQgZnVuY3Rpb25hbGl0eS4KKyAqLworc3RydWN0IHNwaV9kZXZpY2UgeworCXN0cnVjdCBkZXZpY2UJCWRldjsKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOworCXUzMgkJCW1heF9zcGVlZF9oejsKKwl1OAkJCWNoaXBfc2VsZWN0OworCXU4CQkJbW9kZTsKKyNkZWZpbmUJU1BJX0NQSEEJMHgwMQkJCS8qIGNsb2NrIHBoYXNlICovCisjZGVmaW5lCVNQSV9DUE9MCTB4MDIJCQkvKiBjbG9jayBwb2xhcml0eSAqLworI2RlZmluZQlTUElfTU9ERV8wCSgwfDApCQkJLyogKG9yaWdpbmFsIE1pY3JvV2lyZSkgKi8KKyNkZWZpbmUJU1BJX01PREVfMQkoMHxTUElfQ1BIQSkKKyNkZWZpbmUJU1BJX01PREVfMgkoU1BJX0NQT0x8MCkKKyNkZWZpbmUJU1BJX01PREVfMwkoU1BJX0NQT0x8U1BJX0NQSEEpCisjZGVmaW5lCVNQSV9DU19ISUdICTB4MDQJCQkvKiBjaGlwc2VsZWN0IGFjdGl2ZSBoaWdoPyAqLworCXU4CQkJYml0c19wZXJfd29yZDsKKwlpbnQJCQlpcnE7CisJdm9pZAkJCSpjb250cm9sbGVyX3N0YXRlOworCXZvaWQJCQkqY29udHJvbGxlcl9kYXRhOworCWNvbnN0IGNoYXIJCSptb2RhbGlhczsKKworCS8vIGxpa2VseSBuZWVkIG1vcmUgaG9va3MgZm9yIG1vcmUgcHJvdG9jb2wgb3B0aW9ucyBhZmZlY3RpbmcgaG93CisJLy8gdGhlIGNvbnRyb2xsZXIgdGFsa3MgdG8gZWFjaCBjaGlwLCBsaWtlOgorCS8vICAtIGJpdCBvcmRlciAoZGVmYXVsdCBpcyB3b3Jkd2lzZSBtc2ItZmlyc3QpCisJLy8gIC0gbWVtb3J5IHBhY2tpbmcgKDEyIGJpdCBzYW1wbGVzIGludG8gbG93IGJpdHMsIG90aGVycyB6ZXJvZWQpCisJLy8gIC0gcHJpb3JpdHkKKwkvLyAgLSBkcm9wIGNoaXBzZWxlY3QgYWZ0ZXIgZWFjaCB3b3JkCisJLy8gIC0gY2hpcHNlbGVjdCBkZWxheXMKKwkvLyAgLSAuLi4KK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNwaV9kZXZpY2UgKnRvX3NwaV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXYgPyBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgc3BpX2RldmljZSwgZGV2KSA6IE5VTEw7Cit9CisKKy8qIG1vc3QgZHJpdmVycyB3b24ndCBuZWVkIHRvIGNhcmUgYWJvdXQgZGV2aWNlIHJlZmNvdW50aW5nICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2X2dldChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXJldHVybiAoc3BpICYmIGdldF9kZXZpY2UoJnNwaS0+ZGV2KSkgPyBzcGkgOiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3BpX2Rldl9wdXQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpZiAoc3BpKQorCQlwdXRfZGV2aWNlKCZzcGktPmRldik7Cit9CisKKy8qIGN0bGRhdGEgaXMgZm9yIHRoZSBidXNfbWFzdGVyIGRyaXZlcidzIHJ1bnRpbWUgc3RhdGUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqc3BpX2dldF9jdGxkYXRhKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJcmV0dXJuIHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNwaV9zZXRfY3RsZGF0YShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB2b2lkICpzdGF0ZSkKK3sKKwlzcGktPmNvbnRyb2xsZXJfc3RhdGUgPSBzdGF0ZTsKK30KKworCitzdHJ1Y3Qgc3BpX21lc3NhZ2U7CisKKworCitzdHJ1Y3Qgc3BpX2RyaXZlciB7CisJaW50CQkJKCpwcm9iZSkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSk7CisJaW50CQkJKCpyZW1vdmUpKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpOworCXZvaWQJCQkoKnNodXRkb3duKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKTsKKwlpbnQJCQkoKnN1c3BlbmQpKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHBtX21lc3NhZ2VfdCBtZXNnKTsKKwlpbnQJCQkoKnJlc3VtZSkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSk7CisJc3RydWN0IGRldmljZV9kcml2ZXIJZHJpdmVyOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3BpX2RyaXZlciAqdG9fc3BpX2RyaXZlcihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXJldHVybiBkcnYgPyBjb250YWluZXJfb2YoZHJ2LCBzdHJ1Y3Qgc3BpX2RyaXZlciwgZHJpdmVyKSA6IE5VTEw7Cit9CisKK2V4dGVybiBpbnQgc3BpX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3Qgc3BpX2RyaXZlciAqc2Rydik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHNwaV9kcml2ZXIgKnNkcnYpCit7CisJaWYgKCFzZHJ2KQorCQlyZXR1cm47CisJZHJpdmVyX3VucmVnaXN0ZXIoJnNkcnYtPmRyaXZlcik7Cit9CisKKworCisvKioKKyAqIHN0cnVjdCBzcGlfbWFzdGVyIC0gaW50ZXJmYWNlIHRvIFNQSSBtYXN0ZXIgY29udHJvbGxlcgorICogQGNkZXY6IGNsYXNzIGludGVyZmFjZSB0byB0aGlzIGRyaXZlcgorICogQGJ1c19udW06IGJvYXJkLXNwZWNpZmljIChhbmQgb2Z0ZW4gU09DLXNwZWNpZmljKSBpZGVudGlmaWVyIGZvciBhCisgKiAJZ2l2ZW4gU1BJIGNvbnRyb2xsZXIuCisgKiBAbnVtX2NoaXBzZWxlY3Q6IGNoaXBzZWxlY3RzIGFyZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGluZGl2aWR1YWwKKyAqIAlTUEkgc2xhdmVzLCBhbmQgYXJlIG51bWJlcmVkIGZyb20gemVybyB0byBudW1fY2hpcHNlbGVjdHMuCisgKiAJZWFjaCBzbGF2ZSBoYXMgYSBjaGlwc2VsZWN0IHNpZ25hbCwgYnV0IGl0J3MgY29tbW9uIHRoYXQgbm90CisgKiAJZXZlcnkgY2hpcHNlbGVjdCBpcyBjb25uZWN0ZWQgdG8gYSBzbGF2ZS4KKyAqIEBzZXR1cDogdXBkYXRlcyB0aGUgZGV2aWNlIG1vZGUgYW5kIGNsb2NraW5nIHJlY29yZHMgdXNlZCBieSBhCisgKiAJZGV2aWNlJ3MgU1BJIGNvbnRyb2xsZXI7IHByb3RvY29sIGNvZGUgbWF5IGNhbGwgdGhpcy4KKyAqIEB0cmFuc2ZlcjogYWRkcyBhIG1lc3NhZ2UgdG8gdGhlIGNvbnRyb2xsZXIncyB0cmFuc2ZlciBxdWV1ZS4KKyAqIEBjbGVhbnVwOiBmcmVlcyBjb250cm9sbGVyLXNwZWNpZmljIHN0YXRlCisgKgorICogRWFjaCBTUEkgbWFzdGVyIGNvbnRyb2xsZXIgY2FuIGNvbW11bmljYXRlIHdpdGggb25lIG9yIG1vcmUgc3BpX2RldmljZQorICogY2hpbGRyZW4uICBUaGVzZSBtYWtlIGEgc21hbGwgYnVzLCBzaGFyaW5nIE1PU0ksIE1JU08gYW5kIFNDSyBzaWduYWxzCisgKiBidXQgbm90IGNoaXAgc2VsZWN0IHNpZ25hbHMuICBFYWNoIGRldmljZSBtYXkgYmUgY29uZmlndXJlZCB0byB1c2UgYQorICogZGlmZmVyZW50IGNsb2NrIHJhdGUsIHNpbmNlIHRob3NlIHNoYXJlZCBzaWduYWxzIGFyZSBpZ25vcmVkIHVubGVzcworICogdGhlIGNoaXAgaXMgc2VsZWN0ZWQuCisgKgorICogVGhlIGRyaXZlciBmb3IgYW4gU1BJIGNvbnRyb2xsZXIgbWFuYWdlcyBhY2Nlc3MgdG8gdGhvc2UgZGV2aWNlcyB0aHJvdWdoCisgKiBhIHF1ZXVlIG9mIHNwaV9tZXNzYWdlIHRyYW5zYWN0aW9ucywgY29weWluIGRhdGEgYmV0d2VlbiBDUFUgbWVtb3J5IGFuZAorICogYW4gU1BJIHNsYXZlIGRldmljZSkuICBGb3IgZWFjaCBzdWNoIG1lc3NhZ2UgaXQgcXVldWVzLCBpdCBjYWxscyB0aGUKKyAqIG1lc3NhZ2UncyBjb21wbGV0aW9uIGZ1bmN0aW9uIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGNvbXBsZXRlcy4KKyAqLworc3RydWN0IHNwaV9tYXN0ZXIgeworCXN0cnVjdCBjbGFzc19kZXZpY2UJY2RldjsKKworCS8qIG90aGVyIHRoYW4gemVybyAoPT0gYXNzaWduIG9uZSBkeW5hbWljYWxseSksIGJ1c19udW0gaXMgZnVsbHkKKwkgKiBib2FyZC1zcGVjaWZpYy4gIHVzdWFsbHkgdGhhdCBzaW1wbGlmaWVzIHRvIGJlaW5nIFNPQy1zcGVjaWZpYy4KKwkgKiBleGFtcGxlOiAgb25lIFNPQyBoYXMgdGhyZWUgU1BJIGNvbnRyb2xsZXJzLCBudW1iZXJlZCAxLi4zLAorCSAqIGFuZCBvbmUgYm9hcmQncyBzY2hlbWF0aWNzIG1pZ2h0IHNob3cgaXQgdXNpbmcgU1BJLTIuICBzb2Z0d2FyZQorCSAqIHdvdWxkIG5vcm1hbGx5IHVzZSBidXNfbnVtPTIgZm9yIHRoYXQgY29udHJvbGxlci4KKwkgKi8KKwl1MTYJCQlidXNfbnVtOworCisJLyogY2hpcHNlbGVjdHMgd2lsbCBiZSBpbnRlZ3JhbCB0byBtYW55IGNvbnRyb2xsZXJzOyBzb21lIG90aGVycworCSAqIG1pZ2h0IHVzZSBib2FyZC1zcGVjaWZpYyBHUElPcy4KKwkgKi8KKwl1MTYJCQludW1fY2hpcHNlbGVjdDsKKworCS8qIHNldHVwIG1vZGUgYW5kIGNsb2NrLCBldGMgKHNwaSBkcml2ZXIgbWF5IGNhbGwgbWFueSB0aW1lcykgKi8KKwlpbnQJCQkoKnNldHVwKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKTsKKworCS8qIGJpZGlyZWN0aW9uYWwgYnVsayB0cmFuc2ZlcnMKKwkgKgorCSAqICsgVGhlIHRyYW5zZmVyKCkgbWV0aG9kIG1heSBub3Qgc2xlZXA7IGl0cyBtYWluIHJvbGUgaXMKKwkgKiAgIGp1c3QgdG8gYWRkIHRoZSBtZXNzYWdlIHRvIHRoZSBxdWV1ZS4KKwkgKiArIEZvciBub3cgdGhlcmUncyBubyByZW1vdmUtZnJvbS1xdWV1ZSBvcGVyYXRpb24sIG9yCisJICogICBhbnkgb3RoZXIgcmVxdWVzdCBtYW5hZ2VtZW50CisJICogKyBUbyBhIGdpdmVuIHNwaV9kZXZpY2UsIG1lc3NhZ2UgcXVldWVpbmcgaXMgcHVyZSBmaWZvCisJICoKKwkgKiArIFRoZSBtYXN0ZXIncyBtYWluIGpvYiBpcyB0byBwcm9jZXNzIGl0cyBtZXNzYWdlIHF1ZXVlLAorCSAqICAgc2VsZWN0aW5nIGEgY2hpcCB0aGVuIHRyYW5zZmVycmluZyBkYXRhCisJICogKyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgc3BpX2RldmljZSBjaGlsZHJlbiwgdGhlIGkvbyBxdWV1ZQorCSAqICAgYXJiaXRyYXRpb24gYWxnb3JpdGhtIGlzIHVuc3BlY2lmaWVkIChyb3VuZCByb2JpbiwgZmlmbywKKwkgKiAgIHByaW9yaXR5LCByZXNlcnZhdGlvbnMsIHByZWVtcHRpb24sIGV0YykKKwkgKgorCSAqICsgQ2hpcHNlbGVjdCBzdGF5cyBhY3RpdmUgZHVyaW5nIHRoZSBlbnRpcmUgbWVzc2FnZQorCSAqICAgKHVubGVzcyBtb2RpZmllZCBieSBzcGlfdHJhbnNmZXIuY3NfY2hhbmdlICE9IDApLgorCSAqICsgVGhlIG1lc3NhZ2UgdHJhbnNmZXJzIHVzZSBjbG9jayBhbmQgU1BJIG1vZGUgcGFyYW1ldGVycworCSAqICAgcHJldmlvdXNseSBlc3RhYmxpc2hlZCBieSBzZXR1cCgpIGZvciB0aGlzIGRldmljZQorCSAqLworCWludAkJCSgqdHJhbnNmZXIpKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc2cpOworCisJLyogY2FsbGVkIG9uIHJlbGVhc2UoKSB0byBmcmVlIG1lbW9yeSBwcm92aWRlZCBieSBzcGlfbWFzdGVyICovCisJdm9pZAkJCSgqY2xlYW51cCkoY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSk7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgKnNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKK3sKKwlyZXR1cm4gY2xhc3NfZ2V0X2RldmRhdGEoJm1hc3Rlci0+Y2Rldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcGlfbWFzdGVyX3NldF9kZXZkYXRhKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsIHZvaWQgKmRhdGEpCit7CisJY2xhc3Nfc2V0X2RldmRhdGEoJm1hc3Rlci0+Y2RldiwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNwaV9tYXN0ZXIgKnNwaV9tYXN0ZXJfZ2V0KHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpCit7CisJaWYgKCFtYXN0ZXIgfHwgIWNsYXNzX2RldmljZV9nZXQoJm1hc3Rlci0+Y2RldikpCisJCXJldHVybiBOVUxMOworCXJldHVybiBtYXN0ZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcGlfbWFzdGVyX3B1dChzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQoreworCWlmIChtYXN0ZXIpCisJCWNsYXNzX2RldmljZV9wdXQoJm1hc3Rlci0+Y2Rldik7Cit9CisKKworLyogdGhlIHNwaSBkcml2ZXIgY29yZSBtYW5hZ2VzIG1lbW9yeSBmb3IgdGhlIHNwaV9tYXN0ZXIgY2xhc3NkZXYgKi8KK2V4dGVybiBzdHJ1Y3Qgc3BpX21hc3RlciAqCitzcGlfYWxsb2NfbWFzdGVyKHN0cnVjdCBkZXZpY2UgKmhvc3QsIHVuc2lnbmVkIHNpemUpOworCitleHRlcm4gaW50IHNwaV9yZWdpc3Rlcl9tYXN0ZXIoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlcik7CitleHRlcm4gdm9pZCBzcGlfdW5yZWdpc3Rlcl9tYXN0ZXIoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlcik7CisKK2V4dGVybiBzdHJ1Y3Qgc3BpX21hc3RlciAqc3BpX2J1c251bV90b19tYXN0ZXIodTE2IGJ1c251bSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEkvTyBJTlRFUkZBQ0UgYmV0d2VlbiBTUEkgY29udHJvbGxlciBhbmQgcHJvdG9jb2wgZHJpdmVycworICoKKyAqIFByb3RvY29sIGRyaXZlcnMgdXNlIGEgcXVldWUgb2Ygc3BpX21lc3NhZ2VzLCBlYWNoIHRyYW5zZmVycmluZyBkYXRhCisgKiBiZXR3ZWVuIHRoZSBjb250cm9sbGVyIGFuZCBtZW1vcnkgYnVmZmVycy4KKyAqCisgKiBUaGUgc3BpX21lc3NhZ2VzIHRoZW1zZWx2ZXMgY29uc2lzdCBvZiBhIHNlcmllcyBvZiByZWFkK3dyaXRlIHRyYW5zZmVyCisgKiBzZWdtZW50cy4gIFRob3NlIHNlZ21lbnRzIGFsd2F5cyByZWFkIHRoZSBzYW1lIG51bWJlciBvZiBiaXRzIGFzIHRoZXkKKyAqIHdyaXRlOyBidXQgb25lIG9yIHRoZSBvdGhlciBpcyBlYXNpbHkgaWdub3JlZCBieSBwYXNzaW5nIGEgbnVsbCBidWZmZXIKKyAqIHBvaW50ZXIuICAoVGhpcyBpcyB1bmxpa2UgbW9zdCB0eXBlcyBvZiBJL08gQVBJLCBiZWNhdXNlIFNQSSBoYXJkd2FyZQorICogaXMgZnVsbCBkdXBsZXguKQorICoKKyAqIE5PVEU6ICBBbGxvY2F0aW9uIG9mIHNwaV90cmFuc2ZlciBhbmQgc3BpX21lc3NhZ2UgbWVtb3J5IGlzIGVudGlyZWx5CisgKiB1cCB0byB0aGUgcHJvdG9jb2wgZHJpdmVyLCB3aGljaCBndWFyYW50ZWVzIHRoZSBpbnRlZ3JpdHkgb2YgYm90aCAoYXMKKyAqIHdlbGwgYXMgdGhlIGRhdGEgYnVmZmVycykgZm9yIGFzIGxvbmcgYXMgdGhlIG1lc3NhZ2UgaXMgcXVldWVkLgorICovCisKKy8qKgorICogc3RydWN0IHNwaV90cmFuc2ZlciAtIGEgcmVhZC93cml0ZSBidWZmZXIgcGFpcgorICogQHR4X2J1ZjogZGF0YSB0byBiZSB3cml0dGVuIChkbWEtc2FmZSBtZW1vcnkpLCBvciBOVUxMCisgKiBAcnhfYnVmOiBkYXRhIHRvIGJlIHJlYWQgKGRtYS1zYWZlIG1lbW9yeSksIG9yIE5VTEwKKyAqIEB0eF9kbWE6IERNQSBhZGRyZXNzIG9mIHR4X2J1ZiwgaWYgc3BpX21lc3NhZ2UuaXNfZG1hX21hcHBlZAorICogQHJ4X2RtYTogRE1BIGFkZHJlc3Mgb2YgcnhfYnVmLCBpZiBzcGlfbWVzc2FnZS5pc19kbWFfbWFwcGVkCisgKiBAbGVuOiBzaXplIG9mIHJ4IGFuZCB0eCBidWZmZXJzIChpbiBieXRlcykKKyAqIEBjc19jaGFuZ2U6IGFmZmVjdHMgY2hpcHNlbGVjdCBhZnRlciB0aGlzIHRyYW5zZmVyIGNvbXBsZXRlcworICogQGRlbGF5X3VzZWNzOiBtaWNyb3NlY29uZHMgdG8gZGVsYXkgYWZ0ZXIgdGhpcyB0cmFuc2ZlciBiZWZvcmUKKyAqIAkob3B0aW9uYWxseSkgY2hhbmdpbmcgdGhlIGNoaXBzZWxlY3Qgc3RhdHVzLCB0aGVuIHN0YXJ0aW5nCisgKiAJdGhlIG5leHQgdHJhbnNmZXIgb3IgY29tcGxldGluZyB0aGlzIHNwaV9tZXNzYWdlLgorICogQHRyYW5zZmVyX2xpc3Q6IHRyYW5zZmVycyBhcmUgc2VxdWVuY2VkIHRocm91Z2ggc3BpX21lc3NhZ2UudHJhbnNmZXJzCisgKgorICogU1BJIHRyYW5zZmVycyBhbHdheXMgd3JpdGUgdGhlIHNhbWUgbnVtYmVyIG9mIGJ5dGVzIGFzIHRoZXkgcmVhZC4KKyAqIFByb3RvY29sIGRyaXZlcnMgc2hvdWxkIGFsd2F5cyBwcm92aWRlIHJ4X2J1ZiBhbmQvb3IgdHhfYnVmLgorICogSW4gc29tZSBjYXNlcywgdGhleSBtYXkgYWxzbyB3YW50IHRvIHByb3ZpZGUgRE1BIGFkZHJlc3NlcyBmb3IKKyAqIHRoZSBkYXRhIGJlaW5nIHRyYW5zZmVycmVkOyB0aGF0IG1heSByZWR1Y2Ugb3ZlcmhlYWQsIHdoZW4gdGhlCisgKiB1bmRlcmx5aW5nIGRyaXZlciB1c2VzIGRtYS4KKyAqCisgKiBJZiB0aGUgdHJhbnNtaXQgYnVmZmVyIGlzIG51bGwsIHVuZGVmaW5lZCBkYXRhIHdpbGwgYmUgc2hpZnRlZCBvdXQKKyAqIHdoaWxlIGZpbGxpbmcgcnhfYnVmLiAgSWYgdGhlIHJlY2VpdmUgYnVmZmVyIGlzIG51bGwsIHRoZSBkYXRhCisgKiBzaGlmdGVkIGluIHdpbGwgYmUgZGlzY2FyZGVkLiAgT25seSAibGVuIiBieXRlcyBzaGlmdCBvdXQgKG9yIGluKS4KKyAqIEl0J3MgYW4gZXJyb3IgdG8gdHJ5IHRvIHNoaWZ0IG91dCBhIHBhcnRpYWwgd29yZC4gIChGb3IgZXhhbXBsZSwgYnkKKyAqIHNoaWZ0aW5nIG91dCB0aHJlZSBieXRlcyB3aXRoIHdvcmQgc2l6ZSBvZiBzaXh0ZWVuIG9yIHR3ZW50eSBiaXRzOworICogdGhlIGZvcm1lciB1c2VzIHR3byBieXRlcyBwZXIgd29yZCwgdGhlIGxhdHRlciB1c2VzIGZvdXIgYnl0ZXMuKQorICoKKyAqIEFsbCBTUEkgdHJhbnNmZXJzIHN0YXJ0IHdpdGggdGhlIHJlbGV2YW50IGNoaXBzZWxlY3QgYWN0aXZlLiAgTm9ybWFsbHkKKyAqIGl0IHN0YXlzIHNlbGVjdGVkIHVudGlsIGFmdGVyIHRoZSBsYXN0IHRyYW5zZmVyIGluIGEgbWVzc2FnZS4gIERyaXZlcnMKKyAqIGNhbiBhZmZlY3QgdGhlIGNoaXBzZWxlY3Qgc2lnbmFsIHVzaW5nIGNzX2NoYW5nZToKKyAqCisgKiAoaSkgSWYgdGhlIHRyYW5zZmVyIGlzbid0IHRoZSBsYXN0IG9uZSBpbiB0aGUgbWVzc2FnZSwgdGhpcyBmbGFnIGlzCisgKiB1c2VkIHRvIG1ha2UgdGhlIGNoaXBzZWxlY3QgYnJpZWZseSBnbyBpbmFjdGl2ZSBpbiB0aGUgbWlkZGxlIG9mIHRoZQorICogbWVzc2FnZS4gIFRvZ2dsaW5nIGNoaXBzZWxlY3QgaW4gdGhpcyB3YXkgbWF5IGJlIG5lZWRlZCB0byB0ZXJtaW5hdGUKKyAqIGEgY2hpcCBjb21tYW5kLCBsZXR0aW5nIGEgc2luZ2xlIHNwaV9tZXNzYWdlIHBlcmZvcm0gYWxsIG9mIGdyb3VwIG9mCisgKiBjaGlwIHRyYW5zYWN0aW9ucyB0b2dldGhlci4KKyAqCisgKiAoaWkpIFdoZW4gdGhlIHRyYW5zZmVyIGlzIHRoZSBsYXN0IG9uZSBpbiB0aGUgbWVzc2FnZSwgdGhlIGNoaXAgbWF5CisgKiBzdGF5IHNlbGVjdGVkIHVudGlsIHRoZSBuZXh0IHRyYW5zZmVyLiAgVGhpcyBpcyBwdXJlbHkgYSBwZXJmb3JtYW5jZQorICogaGludDsgdGhlIGNvbnRyb2xsZXIgZHJpdmVyIG1heSBuZWVkIHRvIHNlbGVjdCBhIGRpZmZlcmVudCBkZXZpY2UKKyAqIGZvciB0aGUgbmV4dCBtZXNzYWdlLgorICoKKyAqIFRoZSBjb2RlIHRoYXQgc3VibWl0cyBhbiBzcGlfbWVzc2FnZSAoYW5kIGl0cyBzcGlfdHJhbnNmZXJzKQorICogdG8gdGhlIGxvd2VyIGxheWVycyBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgaXRzIG1lbW9yeS4KKyAqIFplcm8taW5pdGlhbGl6ZSBldmVyeSBmaWVsZCB5b3UgZG9uJ3Qgc2V0IHVwIGV4cGxpY2l0bHksIHRvCisgKiBpbnN1bGF0ZSBhZ2FpbnN0IGZ1dHVyZSBBUEkgdXBkYXRlcy4gIEFmdGVyIHlvdSBzdWJtaXQgYSBtZXNzYWdlCisgKiBhbmQgaXRzIHRyYW5zZmVycywgaWdub3JlIHRoZW0gdW50aWwgaXRzIGNvbXBsZXRpb24gY2FsbGJhY2suCisgKi8KK3N0cnVjdCBzcGlfdHJhbnNmZXIgeworCS8qIGl0J3Mgb2sgaWYgdHhfYnVmID09IHJ4X2J1ZiAocmlnaHQ/KQorCSAqIGZvciBNaWNyb1dpcmUsIG9uZSBidWZmZXIgbXVzdCBiZSBudWxsCisJICogYnVmZmVycyBtdXN0IHdvcmsgd2l0aCBkbWFfKm1hcF9zaW5nbGUoKSBjYWxscywgdW5sZXNzCisJICogICBzcGlfbWVzc2FnZS5pc19kbWFfbWFwcGVkIHJlcG9ydHMgYSBwcmUtZXhpc3RpbmcgbWFwcGluZworCSAqLworCWNvbnN0IHZvaWQJKnR4X2J1ZjsKKwl2b2lkCQkqcnhfYnVmOworCXVuc2lnbmVkCWxlbjsKKworCWRtYV9hZGRyX3QJdHhfZG1hOworCWRtYV9hZGRyX3QJcnhfZG1hOworCisJdW5zaWduZWQJY3NfY2hhbmdlOjE7CisJdTE2CQlkZWxheV91c2VjczsKKworCXN0cnVjdCBsaXN0X2hlYWQgdHJhbnNmZXJfbGlzdDsKK307CisKKy8qKgorICogc3RydWN0IHNwaV9tZXNzYWdlIC0gb25lIG11bHRpLXNlZ21lbnQgU1BJIHRyYW5zYWN0aW9uCisgKiBAdHJhbnNmZXJzOiBsaXN0IG9mIHRyYW5zZmVyIHNlZ21lbnRzIGluIHRoaXMgdHJhbnNhY3Rpb24KKyAqIEBzcGk6IFNQSSBkZXZpY2UgdG8gd2hpY2ggdGhlIHRyYW5zYWN0aW9uIGlzIHF1ZXVlZAorICogQGlzX2RtYV9tYXBwZWQ6IGlmIHRydWUsIHRoZSBjYWxsZXIgcHJvdmlkZWQgYm90aCBkbWEgYW5kIGNwdSB2aXJ0dWFsCisgKglhZGRyZXNzZXMgZm9yIGVhY2ggdHJhbnNmZXIgYnVmZmVyCisgKiBAY29tcGxldGU6IGNhbGxlZCB0byByZXBvcnQgdHJhbnNhY3Rpb24gY29tcGxldGlvbnMKKyAqIEBjb250ZXh0OiB0aGUgYXJndW1lbnQgdG8gY29tcGxldGUoKSB3aGVuIGl0J3MgY2FsbGVkCisgKiBAYWN0dWFsX2xlbmd0aDogdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyB0aGF0IHdlcmUgdHJhbnNmZXJyZWQgaW4gYWxsCisgKglzdWNjZXNzZnVsIHNlZ21lbnRzCisgKiBAc3RhdHVzOiB6ZXJvIGZvciBzdWNjZXNzLCBlbHNlIG5lZ2F0aXZlIGVycm5vCisgKiBAcXVldWU6IGZvciB1c2UgYnkgd2hpY2hldmVyIGRyaXZlciBjdXJyZW50bHkgb3ducyB0aGUgbWVzc2FnZQorICogQHN0YXRlOiBmb3IgdXNlIGJ5IHdoaWNoZXZlciBkcml2ZXIgY3VycmVudGx5IG93bnMgdGhlIG1lc3NhZ2UKKyAqCisgKiBBbiBzcGlfbWVzc2FnZSBpcyB1c2VkIHRvIGV4ZWN1dGUgYW4gYXRvbWljIHNlcXVlbmNlIG9mIGRhdGEgdHJhbnNmZXJzLAorICogZWFjaCByZXByZXNlbnRlZCBieSBhIHN0cnVjdCBzcGlfdHJhbnNmZXIuICBUaGUgc2VxdWVuY2UgaXMgImF0b21pYyIKKyAqIGluIHRoZSBzZW5zZSB0aGF0IG5vIG90aGVyIHNwaV9tZXNzYWdlIG1heSB1c2UgdGhhdCBTUEkgYnVzIHVudGlsIHRoYXQKKyAqIHNlcXVlbmNlIGNvbXBsZXRlcy4gIE9uIHNvbWUgc3lzdGVtcywgbWFueSBzdWNoIHNlcXVlbmNlcyBjYW4gZXhlY3V0ZSBhcworICogYXMgc2luZ2xlIHByb2dyYW1tZWQgRE1BIHRyYW5zZmVyLiAgT24gYWxsIHN5c3RlbXMsIHRoZXNlIG1lc3NhZ2VzIGFyZQorICogcXVldWVkLCBhbmQgbWlnaHQgY29tcGxldGUgYWZ0ZXIgdHJhbnNhY3Rpb25zIHRvIG90aGVyIGRldmljZXMuICBNZXNzYWdlcworICogc2VudCB0byBhIGdpdmVuIHNwaV9kZXZpY2UgYXJlIGFsd2F5IGV4ZWN1dGVkIGluIEZJRk8gb3JkZXIuCisgKgorICogVGhlIGNvZGUgdGhhdCBzdWJtaXRzIGFuIHNwaV9tZXNzYWdlIChhbmQgaXRzIHNwaV90cmFuc2ZlcnMpCisgKiB0byB0aGUgbG93ZXIgbGF5ZXJzIGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyBpdHMgbWVtb3J5LgorICogWmVyby1pbml0aWFsaXplIGV2ZXJ5IGZpZWxkIHlvdSBkb24ndCBzZXQgdXAgZXhwbGljaXRseSwgdG8KKyAqIGluc3VsYXRlIGFnYWluc3QgZnV0dXJlIEFQSSB1cGRhdGVzLiAgQWZ0ZXIgeW91IHN1Ym1pdCBhIG1lc3NhZ2UKKyAqIGFuZCBpdHMgdHJhbnNmZXJzLCBpZ25vcmUgdGhlbSB1bnRpbCBpdHMgY29tcGxldGlvbiBjYWxsYmFjay4KKyAqLworc3RydWN0IHNwaV9tZXNzYWdlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIAl0cmFuc2ZlcnM7CisKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpOworCisJdW5zaWduZWQJCWlzX2RtYV9tYXBwZWQ6MTsKKworCS8qIFJFVklTSVQ6ICB3ZSBtaWdodCB3YW50IGEgZmxhZyBhZmZlY3RpbmcgdGhlIGJlaGF2aW9yIG9mIHRoZQorCSAqIGxhc3QgdHJhbnNmZXIgLi4uIGFsbG93aW5nIHRoaW5ncyBsaWtlICJyZWFkIDE2IGJpdCBsZW5ndGggTCIKKwkgKiBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSAicmVhZCBMIGJ5dGVzIi4gIEJhc2ljYWxseSBpbXBvc2luZworCSAqIGEgc3BlY2lmaWMgbWVzc2FnZSBzY2hlZHVsaW5nIGFsZ29yaXRobS4KKwkgKgorCSAqIFNvbWUgY29udHJvbGxlciBkcml2ZXJzIChtZXNzYWdlLWF0LWEtdGltZSBxdWV1ZSBwcm9jZXNzaW5nKQorCSAqIGNvdWxkIHByb3ZpZGUgdGhhdCBhcyB0aGVpciBkZWZhdWx0IHNjaGVkdWxpbmcgYWxnb3JpdGhtLiAgQnV0CisJICogb3RoZXJzICh3aXRoIG11bHRpLW1lc3NhZ2UgcGlwZWxpbmVzKSBjb3VsZCBuZWVkIGEgZmxhZyB0bworCSAqIHRlbGwgdGhlbSBhYm91dCBzdWNoIHNwZWNpYWwgY2FzZXMuCisJICovCisKKwkvKiBjb21wbGV0aW9uIGlzIHJlcG9ydGVkIHRocm91Z2ggYSBjYWxsYmFjayAqLworCXZvaWQgCQkJKCpjb21wbGV0ZSkodm9pZCAqY29udGV4dCk7CisJdm9pZAkJCSpjb250ZXh0OworCXVuc2lnbmVkCQlhY3R1YWxfbGVuZ3RoOworCWludAkJCXN0YXR1czsKKworCS8qIGZvciBvcHRpb25hbCB1c2UgYnkgd2hhdGV2ZXIgZHJpdmVyIGN1cnJlbnRseSBvd25zIHRoZQorCSAqIHNwaV9tZXNzYWdlIC4uLiAgYmV0d2VlbiBjYWxscyB0byBzcGlfYXN5bmMgYW5kIHRoZW4gbGF0ZXIKKwkgKiBjb21wbGV0ZSgpLCB0aGF0J3MgdGhlIHNwaV9tYXN0ZXIgY29udHJvbGxlciBkcml2ZXIuCisJICovCisJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZTsKKwl2b2lkCQkJKnN0YXRlOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHNwaV9tZXNzYWdlX2luaXQoc3RydWN0IHNwaV9tZXNzYWdlICptKQoreworCW1lbXNldChtLCAwLCBzaXplb2YgKm0pOworCUlOSVRfTElTVF9IRUFEKCZtLT50cmFuc2ZlcnMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NwaV9tZXNzYWdlX2FkZF90YWlsKHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQsIHN0cnVjdCBzcGlfbWVzc2FnZSAqbSkKK3sKKwlsaXN0X2FkZF90YWlsKCZ0LT50cmFuc2Zlcl9saXN0LCAmbS0+dHJhbnNmZXJzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzcGlfdHJhbnNmZXJfZGVsKHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCit7CisJbGlzdF9kZWwoJnQtPnRyYW5zZmVyX2xpc3QpOworfQorCisvKiBJdCdzIGZpbmUgdG8gZW1iZWQgbWVzc2FnZSBhbmQgdHJhbnNhY3Rpb24gc3RydWN0dXJlcyBpbiBvdGhlciBkYXRhCisgKiBzdHJ1Y3R1cmVzIHNvIGxvbmcgYXMgeW91IGRvbid0IGZyZWUgdGhlbSB3aGlsZSB0aGV5J3JlIGluIHVzZS4KKyAqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzcGlfbWVzc2FnZSAqc3BpX21lc3NhZ2VfYWxsb2ModW5zaWduZWQgbnRyYW5zLCBnZnBfdCBmbGFncykKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm07CisKKwltID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNwaV9tZXNzYWdlKQorCQkJKyBudHJhbnMgKiBzaXplb2Yoc3RydWN0IHNwaV90cmFuc2ZlciksCisJCQlmbGFncyk7CisJaWYgKG0pIHsKKwkJaW50IGk7CisJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQgPSAoc3RydWN0IHNwaV90cmFuc2ZlciAqKShtICsgMSk7CisKKwkJSU5JVF9MSVNUX0hFQUQoJm0tPnRyYW5zZmVycyk7CisJCWZvciAoaSA9IDA7IGkgPCBudHJhbnM7IGkrKywgdCsrKQorCQkJc3BpX21lc3NhZ2VfYWRkX3RhaWwodCwgbSk7CisJfQorCXJldHVybiBtOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3BpX21lc3NhZ2VfZnJlZShzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0pCit7CisJa2ZyZWUobSk7Cit9CisKKy8qKgorICogc3BpX3NldHVwIC0tIHNldHVwIFNQSSBtb2RlIGFuZCBjbG9jayByYXRlCisgKiBAc3BpOiB0aGUgZGV2aWNlIHdob3NlIHNldHRpbmdzIGFyZSBiZWluZyBtb2RpZmllZAorICoKKyAqIFNQSSBwcm90b2NvbCBkcml2ZXJzIG1heSBuZWVkIHRvIHVwZGF0ZSB0aGUgdHJhbnNmZXIgbW9kZSBpZiB0aGUKKyAqIGRldmljZSBkb2Vzbid0IHdvcmsgd2l0aCB0aGUgbW9kZSAwIGRlZmF1bHQuICBUaGV5IG1heSBsaWtld2lzZSBuZWVkCisgKiB0byB1cGRhdGUgY2xvY2sgcmF0ZXMgb3Igd29yZCBzaXplcyBmcm9tIGluaXRpYWwgdmFsdWVzLiAgVGhpcyBmdW5jdGlvbgorICogY2hhbmdlcyB0aG9zZSBzZXR0aW5ncywgYW5kIG11c3QgYmUgY2FsbGVkIGZyb20gYSBjb250ZXh0IHRoYXQgY2FuIHNsZWVwLgorICogVGhlIGNoYW5nZXMgdGFrZSBlZmZlY3QgdGhlIG5leHQgdGltZSB0aGUgZGV2aWNlIGlzIHNlbGVjdGVkIGFuZCBkYXRhCisgKiBpcyB0cmFuc2ZlcnJlZCB0byBvciBmcm9tIGl0LgorICovCitzdGF0aWMgaW5saW5lIGludAorc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJcmV0dXJuIHNwaS0+bWFzdGVyLT5zZXR1cChzcGkpOworfQorCisKKy8qKgorICogc3BpX2FzeW5jIC0tIGFzeW5jaHJvbm91cyBTUEkgdHJhbnNmZXIKKyAqIEBzcGk6IGRldmljZSB3aXRoIHdoaWNoIGRhdGEgd2lsbCBiZSBleGNoYW5nZWQKKyAqIEBtZXNzYWdlOiBkZXNjcmliZXMgdGhlIGRhdGEgdHJhbnNmZXJzLCBpbmNsdWRpbmcgY29tcGxldGlvbiBjYWxsYmFjaworICoKKyAqIFRoaXMgY2FsbCBtYXkgYmUgdXNlZCBpbl9pcnEgYW5kIG90aGVyIGNvbnRleHRzIHdoaWNoIGNhbid0IHNsZWVwLAorICogYXMgd2VsbCBhcyBmcm9tIHRhc2sgY29udGV4dHMgd2hpY2ggY2FuIHNsZWVwLgorICoKKyAqIFRoZSBjb21wbGV0aW9uIGNhbGxiYWNrIGlzIGludm9rZWQgaW4gYSBjb250ZXh0IHdoaWNoIGNhbid0IHNsZWVwLgorICogQmVmb3JlIHRoYXQgaW52b2NhdGlvbiwgdGhlIHZhbHVlIG9mIG1lc3NhZ2UtPnN0YXR1cyBpcyB1bmRlZmluZWQuCisgKiBXaGVuIHRoZSBjYWxsYmFjayBpcyBpc3N1ZWQsIG1lc3NhZ2UtPnN0YXR1cyBob2xkcyBlaXRoZXIgemVybyAodG8KKyAqIGluZGljYXRlIGNvbXBsZXRlIHN1Y2Nlc3MpIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4gIEFmdGVyIHRoYXQKKyAqIGNhbGxiYWNrIHJldHVybnMsIHRoZSBkcml2ZXIgd2hpY2ggaXNzdWVkIHRoZSB0cmFuc2ZlciByZXF1ZXN0IG1heQorICogZGVhbGxvY2F0ZSB0aGUgYXNzb2NpYXRlZCBtZW1vcnk7IGl0J3Mgbm8gbG9uZ2VyIGluIHVzZSBieSBhbnkgU1BJCisgKiBjb3JlIG9yIGNvbnRyb2xsZXIgZHJpdmVyIGNvZGUuCisgKgorICogTm90ZSB0aGF0IGFsdGhvdWdoIGFsbCBtZXNzYWdlcyB0byBhIHNwaV9kZXZpY2UgYXJlIGhhbmRsZWQgaW4KKyAqIEZJRk8gb3JkZXIsIG1lc3NhZ2VzIG1heSBnbyB0byBkaWZmZXJlbnQgZGV2aWNlcyBpbiBvdGhlciBvcmRlcnMuCisgKiBTb21lIGRldmljZSBtaWdodCBiZSBoaWdoZXIgcHJpb3JpdHksIG9yIGhhdmUgdmFyaW91cyAiaGFyZCIgYWNjZXNzCisgKiB0aW1lIHJlcXVpcmVtZW50cywgZm9yIGV4YW1wbGUuCisgKgorICogT24gZGV0ZWN0aW9uIG9mIGFueSBmYXVsdCBkdXJpbmcgdGhlIHRyYW5zZmVyLCBwcm9jZXNzaW5nIG9mCisgKiB0aGUgZW50aXJlIG1lc3NhZ2UgaXMgYWJvcnRlZCwgYW5kIHRoZSBkZXZpY2UgaXMgZGVzZWxlY3RlZC4KKyAqIFVudGlsIHJldHVybmluZyBmcm9tIHRoZSBhc3NvY2lhdGVkIG1lc3NhZ2UgY29tcGxldGlvbiBjYWxsYmFjaywKKyAqIG5vIG90aGVyIHNwaV9tZXNzYWdlIHF1ZXVlZCB0byB0aGF0IGRldmljZSB3aWxsIGJlIHByb2Nlc3NlZC4KKyAqIChUaGlzIHJ1bGUgYXBwbGllcyBlcXVhbGx5IHRvIGFsbCB0aGUgc3luY2hyb25vdXMgdHJhbnNmZXIgY2FsbHMsCisgKiB3aGljaCBhcmUgd3JhcHBlcnMgYXJvdW5kIHRoaXMgY29yZSBhc3luY2hyb25vdXMgcHJpbWl0aXZlLikKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3NwaV9hc3luYyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc3NhZ2UpCit7CisJbWVzc2FnZS0+c3BpID0gc3BpOworCXJldHVybiBzcGktPm1hc3Rlci0+dHJhbnNmZXIoc3BpLCBtZXNzYWdlKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBBbGwgdGhlc2Ugc3luY2hyb25vdXMgU1BJIHRyYW5zZmVyIHJvdXRpbmVzIGFyZSB1dGlsaXRpZXMgbGF5ZXJlZAorICogb3ZlciB0aGUgY29yZSBhc3luYyB0cmFuc2ZlciBwcmltaXRpdmUuICBIZXJlLCAic3luY2hyb25vdXMiIG1lYW5zCisgKiB0aGV5IHdpbGwgc2xlZXAgdW5pbnRlcnJ1cHRpYmx5IHVudGlsIHRoZSBhc3luYyB0cmFuc2ZlciBjb21wbGV0ZXMuCisgKi8KKworZXh0ZXJuIGludCBzcGlfc3luYyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc3NhZ2UpOworCisvKioKKyAqIHNwaV93cml0ZSAtIFNQSSBzeW5jaHJvbm91cyB3cml0ZQorICogQHNwaTogZGV2aWNlIHRvIHdoaWNoIGRhdGEgd2lsbCBiZSB3cml0dGVuCisgKiBAYnVmOiBkYXRhIGJ1ZmZlcgorICogQGxlbjogZGF0YSBidWZmZXIgc2l6ZQorICoKKyAqIFRoaXMgd3JpdGVzIHRoZSBidWZmZXIgYW5kIHJldHVybnMgemVybyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKiBDYWxsYWJsZSBvbmx5IGZyb20gY29udGV4dHMgdGhhdCBjYW4gc2xlZXAuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzcGlfd3JpdGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXQgPSB7CisJCQkudHhfYnVmCQk9IGJ1ZiwKKwkJCS5sZW4JCT0gbGVuLAorCQl9OworCXN0cnVjdCBzcGlfbWVzc2FnZQltOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbSk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnQsICZtKTsKKwlyZXR1cm4gc3BpX3N5bmMoc3BpLCAmbSk7Cit9CisKKy8qKgorICogc3BpX3JlYWQgLSBTUEkgc3luY2hyb25vdXMgcmVhZAorICogQHNwaTogZGV2aWNlIGZyb20gd2hpY2ggZGF0YSB3aWxsIGJlIHJlYWQKKyAqIEBidWY6IGRhdGEgYnVmZmVyCisgKiBAbGVuOiBkYXRhIGJ1ZmZlciBzaXplCisgKgorICogVGhpcyB3cml0ZXMgdGhlIGJ1ZmZlciBhbmQgcmV0dXJucyB6ZXJvIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqIENhbGxhYmxlIG9ubHkgZnJvbSBjb250ZXh0cyB0aGF0IGNhbiBzbGVlcC4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK3NwaV9yZWFkKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4ICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNwaV90cmFuc2Zlcgl0ID0geworCQkJLnJ4X2J1ZgkJPSBidWYsCisJCQkubGVuCQk9IGxlbiwKKwkJfTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UJbTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm0pOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0LCAmbSk7CisJcmV0dXJuIHNwaV9zeW5jKHNwaSwgJm0pOworfQorCisvKiB0aGlzIGNvcGllcyB0eGJ1ZiBhbmQgcnhidWYgZGF0YTsgZm9yIHNtYWxsIHRyYW5zZmVycyBvbmx5ISAqLworZXh0ZXJuIGludCBzcGlfd3JpdGVfdGhlbl9yZWFkKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCWNvbnN0IHU4ICp0eGJ1ZiwgdW5zaWduZWQgbl90eCwKKwkJdTggKnJ4YnVmLCB1bnNpZ25lZCBuX3J4KTsKKworLyoqCisgKiBzcGlfdzhyOCAtIFNQSSBzeW5jaHJvbm91cyA4IGJpdCB3cml0ZSBmb2xsb3dlZCBieSA4IGJpdCByZWFkCisgKiBAc3BpOiBkZXZpY2Ugd2l0aCB3aGljaCBkYXRhIHdpbGwgYmUgZXhjaGFuZ2VkCisgKiBAY21kOiBjb21tYW5kIHRvIGJlIHdyaXR0ZW4gYmVmb3JlIGRhdGEgaXMgcmVhZCBiYWNrCisgKgorICogVGhpcyByZXR1cm5zIHRoZSAodW5zaWduZWQpIGVpZ2h0IGJpdCBudW1iZXIgcmV0dXJuZWQgYnkgdGhlCisgKiBkZXZpY2UsIG9yIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLiAgQ2FsbGFibGUgb25seSBmcm9tCisgKiBjb250ZXh0cyB0aGF0IGNhbiBzbGVlcC4KKyAqLworc3RhdGljIGlubGluZSBzc2l6ZV90IHNwaV93OHI4KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4IGNtZCkKK3sKKwlzc2l6ZV90CQkJc3RhdHVzOworCXU4CQkJcmVzdWx0OworCisJc3RhdHVzID0gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksICZjbWQsIDEsICZyZXN1bHQsIDEpOworCisJLyogcmV0dXJuIG5lZ2F0aXZlIGVycm5vIG9yIHVuc2lnbmVkIHZhbHVlICovCisJcmV0dXJuIChzdGF0dXMgPCAwKSA/IHN0YXR1cyA6IHJlc3VsdDsKK30KKworLyoqCisgKiBzcGlfdzhyMTYgLSBTUEkgc3luY2hyb25vdXMgOCBiaXQgd3JpdGUgZm9sbG93ZWQgYnkgMTYgYml0IHJlYWQKKyAqIEBzcGk6IGRldmljZSB3aXRoIHdoaWNoIGRhdGEgd2lsbCBiZSBleGNoYW5nZWQKKyAqIEBjbWQ6IGNvbW1hbmQgdG8gYmUgd3JpdHRlbiBiZWZvcmUgZGF0YSBpcyByZWFkIGJhY2sKKyAqCisgKiBUaGlzIHJldHVybnMgdGhlICh1bnNpZ25lZCkgc2l4dGVlbiBiaXQgbnVtYmVyIHJldHVybmVkIGJ5IHRoZQorICogZGV2aWNlLCBvciBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4gIENhbGxhYmxlIG9ubHkgZnJvbQorICogY29udGV4dHMgdGhhdCBjYW4gc2xlZXAuCisgKgorICogVGhlIG51bWJlciBpcyByZXR1cm5lZCBpbiB3aXJlLW9yZGVyLCB3aGljaCBpcyBhdCBsZWFzdCBzb21ldGltZXMKKyAqIGJpZy1lbmRpYW4uCisgKi8KK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBzcGlfdzhyMTYoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggY21kKQoreworCXNzaXplX3QJCQlzdGF0dXM7CisJdTE2CQkJcmVzdWx0OworCisJc3RhdHVzID0gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksICZjbWQsIDEsICh1OCAqKSAmcmVzdWx0LCAyKTsKKworCS8qIHJldHVybiBuZWdhdGl2ZSBlcnJubyBvciB1bnNpZ25lZCB2YWx1ZSAqLworCXJldHVybiAoc3RhdHVzIDwgMCkgPyBzdGF0dXMgOiByZXN1bHQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIElOVEVSRkFDRSBiZXR3ZWVuIGJvYXJkIGluaXQgY29kZSBhbmQgU1BJIGluZnJhc3RydWN0dXJlLgorICoKKyAqIE5vIFNQSSBkcml2ZXIgZXZlciBzZWVzIHRoZXNlIFNQSSBkZXZpY2UgdGFibGUgc2VnbWVudHMsIGJ1dAorICogaXQncyBob3cgdGhlIFNQSSBjb3JlIChvciBhZGFwdGVycyB0aGF0IGdldCBob3RwbHVnZ2VkKSBncm93cworICogdGhlIGRyaXZlciBtb2RlbCB0cmVlLgorICoKKyAqIEFzIGEgcnVsZSwgU1BJIGRldmljZXMgY2FuJ3QgYmUgcHJvYmVkLiAgSW5zdGVhZCwgYm9hcmQgaW5pdCBjb2RlCisgKiBwcm92aWRlcyBhIHRhYmxlIGxpc3RpbmcgdGhlIGRldmljZXMgd2hpY2ggYXJlIHByZXNlbnQsIHdpdGggZW5vdWdoCisgKiBpbmZvcm1hdGlvbiB0byBiaW5kIGFuZCBzZXQgdXAgdGhlIGRldmljZSdzIGRyaXZlci4gIFRoZXJlJ3MgYmFzaWMKKyAqIHN1cHBvcnQgZm9yIG5vbnN0YXRpYyBjb25maWd1cmF0aW9ucyB0b287IGVub3VnaCB0byBoYW5kbGUgYWRkaW5nCisgKiBwYXJwb3J0IGFkYXB0ZXJzLCBvciBtaWNyb2NvbnRyb2xsZXJzIGFjdGluZyBhcyBVU0ItdG8tU1BJIGJyaWRnZXMuCisgKi8KKworLyogYm9hcmQtc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBTUEkgZGV2aWNlICovCitzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8geworCS8qIHRoZSBkZXZpY2UgbmFtZSBhbmQgbW9kdWxlIG5hbWUgYXJlIGNvdXBsZWQsIGxpa2UgcGxhdGZvcm1fYnVzOworCSAqICJtb2RhbGlhcyIgaXMgbm9ybWFsbHkgdGhlIGRyaXZlciBuYW1lLgorCSAqCisJICogcGxhdGZvcm1fZGF0YSBnb2VzIHRvIHNwaV9kZXZpY2UuZGV2LnBsYXRmb3JtX2RhdGEsCisJICogY29udHJvbGxlcl9kYXRhIGdvZXMgdG8gc3BpX2RldmljZS5jb250cm9sbGVyX2RhdGEsCisJICogaXJxIGlzIGNvcGllZCB0b28KKwkgKi8KKwljaGFyCQltb2RhbGlhc1tLT0JKX05BTUVfTEVOXTsKKwljb25zdCB2b2lkCSpwbGF0Zm9ybV9kYXRhOworCXZvaWQJCSpjb250cm9sbGVyX2RhdGE7CisJaW50CQlpcnE7CisKKwkvKiBzbG93ZXIgc2lnbmFsaW5nIG9uIG5vaXN5IG9yIGxvdyB2b2x0YWdlIGJvYXJkcyAqLworCXUzMgkJbWF4X3NwZWVkX2h6OworCisKKwkvKiBidXNfbnVtIGlzIGJvYXJkIHNwZWNpZmljIGFuZCBtYXRjaGVzIHRoZSBidXNfbnVtIG9mIHNvbWUKKwkgKiBzcGlfbWFzdGVyIHRoYXQgd2lsbCBwcm9iYWJseSBiZSByZWdpc3RlcmVkIGxhdGVyLgorCSAqCisJICogY2hpcF9zZWxlY3QgcmVmbGVjdHMgaG93IHRoaXMgY2hpcCBpcyB3aXJlZCB0byB0aGF0IG1hc3RlcjsKKwkgKiBpdCdzIGxlc3MgdGhhbiBudW1fY2hpcHNlbGVjdC4KKwkgKi8KKwl1MTYJCWJ1c19udW07CisJdTE2CQljaGlwX3NlbGVjdDsKKworCS8qIC4uLiBtYXkgbmVlZCBhZGRpdGlvbmFsIHNwaV9kZXZpY2UgY2hpcCBjb25maWcgZGF0YSBoZXJlLgorCSAqIGF2b2lkIHN0dWZmIHByb3RvY29sIGRyaXZlcnMgY2FuIHNldDsgYnV0IGluY2x1ZGUgc3R1ZmYKKwkgKiBuZWVkZWQgdG8gYmVoYXZlIHdpdGhvdXQgYmVpbmcgYm91bmQgdG8gYSBkcml2ZXI6CisJICogIC0gY2hpcHNlbGVjdCBwb2xhcml0eQorCSAqICAtIHF1aXJrcyBsaWtlIGNsb2NrIHJhdGUgbWF0dGVyaW5nIHdoZW4gbm90IHNlbGVjdGVkCisJICovCit9OworCisjaWZkZWYJQ09ORklHX1NQSQorZXh0ZXJuIGludAorc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oc3RydWN0IHNwaV9ib2FyZF9pbmZvIGNvbnN0ICppbmZvLCB1bnNpZ25lZCBuKTsKKyNlbHNlCisvKiBib2FyZCBpbml0IGNvZGUgbWF5IGlnbm9yZSB3aGV0aGVyIFNQSSBpcyBjb25maWd1cmVkIG9yIG5vdCAqLworc3RhdGljIGlubGluZSBpbnQKK3NwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBjb25zdCAqaW5mbywgdW5zaWduZWQgbikKKwl7IHJldHVybiAwOyB9CisjZW5kaWYKKworCisvKiBJZiB5b3UncmUgaG90cGx1Z2dpbmcgYW4gYWRhcHRlciB3aXRoIGRldmljZXMgKHBhcnBvcnQsIHVzYiwgZXRjKQorICogdXNlIHNwaV9uZXdfZGV2aWNlKCkgdG8gZGVzY3JpYmUgZWFjaCBkZXZpY2UuICBZb3UgY2FuIGFsc28gY2FsbAorICogc3BpX3VucmVnaXN0ZXJfZGV2aWNlKCkgdG8gc3RhcnQgbWFraW5nIHRoYXQgZGV2aWNlIHZhbmlzaCwgYnV0CisgKiBub3JtYWxseSB0aGF0IHdvdWxkIGJlIGhhbmRsZWQgYnkgc3BpX3VucmVnaXN0ZXJfbWFzdGVyKCkuCisgKi8KK2V4dGVybiBzdHJ1Y3Qgc3BpX2RldmljZSAqCitzcGlfbmV3X2RldmljZShzdHJ1Y3Qgc3BpX21hc3RlciAqLCBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gKik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc3BpX3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaWYgKHNwaSkKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJnNwaS0+ZGV2KTsKK30KKworI2VuZGlmIC8qIF9fTElOVVhfU1BJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL3NwaV9iaXRiYW5nLmggYi9pbmNsdWRlL2xpbnV4L3NwaS9zcGlfYml0YmFuZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NjFmZTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS9zcGlfYml0YmFuZy5oCkBAIC0wLDAgKzEsMTM1IEBACisjaWZuZGVmCV9fU1BJX0JJVEJBTkdfSAorI2RlZmluZQlfX1NQSV9CSVRCQU5HX0gKKworLyoKKyAqIE1peCB0aGlzIHV0aWxpdHkgY29kZSB3aXRoIHNvbWUgZ2x1ZSBjb2RlIHRvIGdldCBvbmUgb2Ygc2V2ZXJhbCB0eXBlcyBvZgorICogc2ltcGxlIFNQSSBtYXN0ZXIgZHJpdmVyLiAgVHdvIGRvIHBvbGxlZCB3b3JkLWF0LWEtdGltZSBJL086CisgKgorICogICAtCUdQSU8vcGFycG9ydCBiaXRiYW5nZXJzLiAgUHJvdmlkZSBjaGlwc2VsZWN0KCkgYW5kIHR4cnhfd29yZFtdKCksCisgKglleHBhbmRpbmcgdGhlIHBlci13b3JkIHJvdXRpbmVzIGZyb20gdGhlIGlubGluZSB0ZW1wbGF0ZXMgYmVsb3cuCisgKgorICogICAtCURyaXZlcnMgZm9yIGNvbnRyb2xsZXJzIHJlc2VtYmxpbmcgYmFyZSBzaGlmdCByZWdpc3RlcnMuICBQcm92aWRlCisgKgljaGlwc2VsZWN0KCkgYW5kIHR4cnhfd29yZFtdKCksIHdpdGggY3VzdG9tIHNldHVwKCkvY2xlYW51cCgpIG1ldGhvZHMKKyAqCXRoYXQgdXNlIHlvdXIgY29udHJvbGxlcidzIGNsb2NrIGFuZCBjaGlwc2VsZWN0IHJlZ2lzdGVycy4KKyAqCisgKiBTb21lIGhhcmR3YXJlIHdvcmtzIHdlbGwgd2l0aCByZXF1ZXN0cyBhdCBzcGlfdHJhbnNmZXIgc2NvcGU6CisgKgorICogICAtCURyaXZlcnMgbGV2ZXJhZ2luZyBzbWFydGVyIGhhcmR3YXJlLCB3aXRoIGZpZm9zIG9yIERNQTsgb3IgZm9yIGhhbGYKKyAqCWR1cGxleCAoTWljcm9XaXJlKSBjb250cm9sbGVycy4gIFByb3ZpZGUgY2hpcHNsZWN0KCkgYW5kIHR4cnhfYnVmcygpLAorICoJYW5kIGN1c3RvbSBzZXR1cCgpL2NsZWFudXAoKSBtZXRob2RzLgorICovCitzdHJ1Y3Qgc3BpX2JpdGJhbmcgeworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0CSp3b3JrcXVldWU7CisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisKKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCBsaXN0X2hlYWQJcXVldWU7CisJdTgJCQlidXN5OworCXU4CQkJc2h1dGRvd247CisJdTgJCQl1c2VfZG1hOworCisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKKworCXZvaWQJKCpjaGlwc2VsZWN0KShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgaXNfb24pOworI2RlZmluZQlCSVRCQU5HX0NTX0FDVElWRQkxCS8qIG5vcm1hbGx5IG5DUywgYWN0aXZlIGxvdyAqLworI2RlZmluZQlCSVRCQU5HX0NTX0lOQUNUSVZFCTAKKworCS8qIHR4cnhfYnVmcygpIG1heSBoYW5kbGUgZG1hIG1hcHBpbmcgZm9yIHRyYW5zZmVycyB0aGF0IGRvbid0CisJICogYWxyZWFkeSBoYXZlIG9uZSAodHJhbnNmZXIue3R4LHJ4fV9kbWEgaXMgemVybyksIG9yIHVzZSBQSU8KKwkgKi8KKwlpbnQJKCp0eHJ4X2J1ZnMpKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpOworCisJLyogdHhyeF93b3JkW1NQSV9NT0RFXypdKCkganVzdCBsb29rcyBsaWtlIGEgc2hpZnQgcmVnaXN0ZXIgKi8KKwl1MzIJKCp0eHJ4X3dvcmRbNF0pKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQl1bnNpZ25lZCBuc2VjcywKKwkJCXUzMiB3b3JkLCB1OCBiaXRzKTsKK307CisKKy8qIHlvdSBjYW4gY2FsbCB0aGVzZSBkZWZhdWx0IGJpdGJhbmctPm1hc3RlciBtZXRob2RzIGZyb20geW91ciBjdXN0b20KKyAqIG1ldGhvZHMsIGlmIHlvdSBsaWtlLgorICovCitleHRlcm4gaW50IHNwaV9iaXRiYW5nX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpOworZXh0ZXJuIHZvaWQgc3BpX2JpdGJhbmdfY2xlYW51cChjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKTsKK2V4dGVybiBpbnQgc3BpX2JpdGJhbmdfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptKTsKKworLyogc3RhcnQgb3Igc3RvcCBxdWV1ZSBwcm9jZXNzaW5nICovCitleHRlcm4gaW50IHNwaV9iaXRiYW5nX3N0YXJ0KHN0cnVjdCBzcGlfYml0YmFuZyAqc3BpKTsKK2V4dGVybiBpbnQgc3BpX2JpdGJhbmdfc3RvcChzdHJ1Y3Qgc3BpX2JpdGJhbmcgKnNwaSk7CisKKyNlbmRpZgkvKiBfX1NQSV9CSVRCQU5HX0ggKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmCUVYUEFORF9CSVRCQU5HX1RYUlgKKworLyoKKyAqIFRoZSBjb2RlIHRoYXQga25vd3Mgd2hhdCBHUElPIHBpbnMgZG8gd2hhdCBzaG91bGQgaGF2ZSBkZWNsYXJlZCBmb3VyCisgKiBmdW5jdGlvbnMsIGlkZWFsbHkgYXMgaW5saW5lcywgYmVmb3JlICNkZWZpbmluZyBFWFBBTkRfQklUQkFOR19UWFJYCisgKiBhbmQgaW5jbHVkaW5nIHRoaXMgaGVhZGVyOgorICoKKyAqICB2b2lkIHNldHNjayhzdHJ1Y3Qgc3BpX2RldmljZSAqLCBpbnQgaXNfb24pOworICogIHZvaWQgc2V0bW9zaShzdHJ1Y3Qgc3BpX2RldmljZSAqLCBpbnQgaXNfb24pOworICogIGludCBnZXRtaXNvKHN0cnVjdCBzcGlfZGV2aWNlICopOworICogIHZvaWQgc3BpZGVsYXkodW5zaWduZWQpOworICoKKyAqIEEgbm9uLWlubGluZWQgcm91dGluZSB3b3VsZCBjYWxsIGJpdGJhbmdfdHhyeF8qKCkgcm91dGluZXMuICBUaGUKKyAqIG1haW4gbG9vcCBjb3VsZCBlYXNpbHkgY29tcGlsZSBkb3duIHRvIGEgaGFuZGZ1bCBvZiBpbnN0cnVjdGlvbnMsCisgKiBlc3BlY2lhbGx5IGlmIHRoZSBkZWxheSBpcyBhIE5PUCAodG8gcnVuIGF0IHBlYWsgc3BlZWQpLgorICoKKyAqIFNpbmNlIHRoaXMgaXMgc29mdHdhcmUsIHRoZSB0aW1pbmdzIG1heSBub3QgYmUgZXhhY3RseSB3aGF0IHlvdXIgYm9hcmQncworICogY2hpcHMgbmVlZCAuLi4gdGhlcmUgbWF5IGJlIHNldmVyYWwgcmVhc29ucyB5b3UnZCBuZWVkIHRvIHR3ZWFrIHRpbWluZ3MKKyAqIGluIHRoZXNlIHJvdXRpbmVzLCBub3QganVzdCBtYWtlIHRvIG1ha2UgaXQgZmFzdGVyIG9yIHNsb3dlciB0byBtYXRjaCBhCisgKiBwYXJ0aWN1bGFyIENQVSBjbG9jayByYXRlLgorICovCisKK3N0YXRpYyBpbmxpbmUgdTMyCitiaXRiYW5nX3R4cnhfYmVfY3BoYTAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJdW5zaWduZWQgbnNlY3MsIHVuc2lnbmVkIGNwb2wsCisJCXUzMiB3b3JkLCB1OCBiaXRzKQoreworCS8qIGlmIChjcG9sID09IDApIHRoaXMgaXMgU1BJX01PREVfMDsgZWxzZSB0aGlzIGlzIFNQSV9NT0RFXzIgKi8KKworCS8qIGNsb2NrIHN0YXJ0cyBhdCBpbmFjdGl2ZSBwb2xhcml0eSAqLworCWZvciAod29yZCA8PD0gKDMyIC0gYml0cyk7IGxpa2VseShiaXRzKTsgYml0cy0tKSB7CisKKwkJLyogc2V0dXAgTVNCICh0byBzbGF2ZSkgb24gdHJhaWxpbmcgZWRnZSAqLworCQlzZXRtb3NpKHNwaSwgd29yZCAmICgxIDw8IDMxKSk7CisJCXNwaWRlbGF5KG5zZWNzKTsJLyogVChzZXR1cCkgKi8KKworCQlzZXRzY2soc3BpLCAhY3BvbCk7CisJCXNwaWRlbGF5KG5zZWNzKTsKKworCQkvKiBzYW1wbGUgTVNCIChmcm9tIHNsYXZlKSBvbiBsZWFkaW5nIGVkZ2UgKi8KKwkJd29yZCA8PD0gMTsKKwkJd29yZCB8PSBnZXRtaXNvKHNwaSk7CisJCXNldHNjayhzcGksIGNwb2wpOworCX0KKwlyZXR1cm4gd29yZDsKK30KKworc3RhdGljIGlubGluZSB1MzIKK2JpdGJhbmdfdHhyeF9iZV9jcGhhMShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQl1bnNpZ25lZCBuc2VjcywgdW5zaWduZWQgY3BvbCwKKwkJdTMyIHdvcmQsIHU4IGJpdHMpCit7CisJLyogaWYgKGNwb2wgPT0gMCkgdGhpcyBpcyBTUElfTU9ERV8xOyBlbHNlIHRoaXMgaXMgU1BJX01PREVfMyAqLworCisJLyogY2xvY2sgc3RhcnRzIGF0IGluYWN0aXZlIHBvbGFyaXR5ICovCisJZm9yICh3b3JkIDw8PSAoMzIgLSBiaXRzKTsgbGlrZWx5KGJpdHMpOyBiaXRzLS0pIHsKKworCQkvKiBzZXR1cCBNU0IgKHRvIHNsYXZlKSBvbiBsZWFkaW5nIGVkZ2UgKi8KKwkJc2V0c2NrKHNwaSwgIWNwb2wpOworCQlzZXRtb3NpKHNwaSwgd29yZCAmICgxIDw8IDMxKSk7CisJCXNwaWRlbGF5KG5zZWNzKTsgLyogVChzZXR1cCkgKi8KKworCQlzZXRzY2soc3BpLCBjcG9sKTsKKwkJc3BpZGVsYXkobnNlY3MpOworCisJCS8qIHNhbXBsZSBNU0IgKGZyb20gc2xhdmUpIG9uIHRyYWlsaW5nIGVkZ2UgKi8KKwkJd29yZCA8PD0gMTsKKwkJd29yZCB8PSBnZXRtaXNvKHNwaSk7CisJfQorCXJldHVybiB3b3JkOworfQorCisjZW5kaWYJLyogRVhQQU5EX0JJVEJBTkdfVFhSWCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGlubG9ja190eXBlc191cC5oIGIvaW5jbHVkZS9saW51eC9zcGlubG9ja190eXBlc191cC5oCmluZGV4IGRlZjJkMTcuLjA0MTM1YjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3BpbmxvY2tfdHlwZXNfdXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrX3R5cGVzX3VwLmgKQEAgLTIyLDMwICsyMiwxNiBAQAogCiAjZWxzZQogCi0vKgotICogQWxsIGdjYyAyLjk1IHZlcnNpb25zIGFuZCBlYXJseSB2ZXJzaW9ucyBvZiAyLjk2IGhhdmUgYSBuYXN0eSBidWcKLSAqIHdpdGggZW1wdHkgaW5pdGlhbGl6ZXJzLgotICovCi0jaWYgKF9fR05VQ19fID4gMikKIHR5cGVkZWYgc3RydWN0IHsgfSByYXdfc3BpbmxvY2tfdDsKIAogI2RlZmluZSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQgeyB9Ci0jZWxzZQotdHlwZWRlZiBzdHJ1Y3QgeyBpbnQgZ2NjX2lzX2J1Z2d5OyB9IHJhd19zcGlubG9ja190OwotI2RlZmluZSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQgKHJhd19zcGlubG9ja190KSB7IDAgfQotI2VuZGlmCiAKICNlbmRpZgogCi0jaWYgKF9fR05VQ19fID4gMikKIHR5cGVkZWYgc3RydWN0IHsKIAkvKiBubyBkZWJ1ZyB2ZXJzaW9uIG9uIFVQICovCiB9IHJhd19yd2xvY2tfdDsKIAogI2RlZmluZSBfX1JBV19SV19MT0NLX1VOTE9DS0VEIHsgfQotI2Vsc2UKLXR5cGVkZWYgc3RydWN0IHsgaW50IGdjY19pc19idWdneTsgfSByYXdfcndsb2NrX3Q7Ci0jZGVmaW5lIF9fUkFXX1JXX0xPQ0tfVU5MT0NLRUQgKHJhd19yd2xvY2tfdCkgeyAwIH0KLSNlbmRpZgogCiAjZW5kaWYgLyogX19MSU5VWF9TUElOTE9DS19UWVBFU19VUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCmluZGV4IGU0MDg2ZWMuLjUwY2FiMmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCkBAIC0yNDYsNiArMjQ2LDcgQEAKIAl1MzIJCQlwcm90OwkvKiBwcm90b2NvbCAoVURQIG9yIFRDUCkgKi8KIAlzdHJ1Y3Qgc29ja2FkZHJfaW4JYWRkcjsKIAlzdHJ1Y3Qgc3ZjX3NvY2sJCSpzdnNrOwkvKiB3aGVyZSByZXBseSBtdXN0IGdvICovCisJdTMyCQkJZGFkZHI7CS8qIHdoZXJlIHJlcGx5IG11c3QgY29tZSBmcm9tICovCiAJc3RydWN0IGNhY2hlX2RlZmVycmVkX3JlcSBoYW5kbGU7CiAJaW50CQkJYXJnc2xlbjsKIAl1MzIJCQlhcmdzWzBdOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaAppbmRleCA1NTY2MTdiLi40YTk5ZTRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaApAQCAtMTY3LDYgKzE2Nyw3IEBACiBleHRlcm4gdm9pZCBGQVNUQ0FMTChhY3RpdmF0ZV9wYWdlKHN0cnVjdCBwYWdlICopKTsKIGV4dGVybiB2b2lkIEZBU1RDQUxMKG1hcmtfcGFnZV9hY2Nlc3NlZChzdHJ1Y3QgcGFnZSAqKSk7CiBleHRlcm4gdm9pZCBscnVfYWRkX2RyYWluKHZvaWQpOworZXh0ZXJuIGludCBscnVfYWRkX2RyYWluX2FsbCh2b2lkKTsKIGV4dGVybiBpbnQgcm90YXRlX3JlY2xhaW1hYmxlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwogZXh0ZXJuIHZvaWQgc3dhcF9zZXR1cCh2b2lkKTsKIApAQCAtMTc1LDYgKzE3NiwyOSBAQAogZXh0ZXJuIGludCBzaHJpbmtfYWxsX21lbW9yeShpbnQpOwogZXh0ZXJuIGludCB2bV9zd2FwcGluZXNzOwogCisjaWZkZWYgQ09ORklHX05VTUEKK2V4dGVybiBpbnQgem9uZV9yZWNsYWltX21vZGU7CitleHRlcm4gaW50IHpvbmVfcmVjbGFpbShzdHJ1Y3Qgem9uZSAqLCBnZnBfdCwgdW5zaWduZWQgaW50KTsKKyNlbHNlCisjZGVmaW5lIHpvbmVfcmVjbGFpbV9tb2RlIDAKK3N0YXRpYyBpbmxpbmUgaW50IHpvbmVfcmVjbGFpbShzdHJ1Y3Qgem9uZSAqeiwgZ2ZwX3QgbWFzaywgdW5zaWduZWQgaW50IG9yZGVyKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUlHUkFUSU9OCitleHRlcm4gaW50IGlzb2xhdGVfbHJ1X3BhZ2Uoc3RydWN0IHBhZ2UgKnApOworZXh0ZXJuIGludCBwdXRiYWNrX2xydV9wYWdlcyhzdHJ1Y3QgbGlzdF9oZWFkICpsKTsKK2V4dGVybiBpbnQgbWlncmF0ZV9wYWdlcyhzdHJ1Y3QgbGlzdF9oZWFkICpsLCBzdHJ1Y3QgbGlzdF9oZWFkICp0LAorCQlzdHJ1Y3QgbGlzdF9oZWFkICptb3ZlZCwgc3RydWN0IGxpc3RfaGVhZCAqZmFpbGVkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBpc29sYXRlX2xydV9wYWdlKHN0cnVjdCBwYWdlICpwKSB7IHJldHVybiAtRU5PU1lTOyB9CitzdGF0aWMgaW5saW5lIGludCBwdXRiYWNrX2xydV9wYWdlcyhzdHJ1Y3QgbGlzdF9oZWFkICpsKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBtaWdyYXRlX3BhZ2VzKHN0cnVjdCBsaXN0X2hlYWQgKmwsIHN0cnVjdCBsaXN0X2hlYWQgKnQsCisJc3RydWN0IGxpc3RfaGVhZCAqbW92ZWQsIHN0cnVjdCBsaXN0X2hlYWQgKmZhaWxlZCkgeyByZXR1cm4gLUVOT1NZUzsgfQorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfTU1VCiAvKiBsaW51eC9tbS9zaG1lbS5jICovCiBleHRlcm4gaW50IHNobWVtX3VudXNlKHN3cF9lbnRyeV90IGVudHJ5LCBzdHJ1Y3QgcGFnZSAqcGFnZSk7CkBAIC0xOTIsNyArMjE2LDcgQEAKIGV4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZSBzd2FwcGVyX3NwYWNlOwogI2RlZmluZSB0b3RhbF9zd2FwY2FjaGVfcGFnZXMgIHN3YXBwZXJfc3BhY2UubnJwYWdlcwogZXh0ZXJuIHZvaWQgc2hvd19zd2FwX2NhY2hlX2luZm8odm9pZCk7Ci1leHRlcm4gaW50IGFkZF90b19zd2FwKHN0cnVjdCBwYWdlICopOworZXh0ZXJuIGludCBhZGRfdG9fc3dhcChzdHJ1Y3QgcGFnZSAqLCBnZnBfdCk7CiBleHRlcm4gdm9pZCBfX2RlbGV0ZV9mcm9tX3N3YXBfY2FjaGUoc3RydWN0IHBhZ2UgKik7CiBleHRlcm4gdm9pZCBkZWxldGVfZnJvbV9zd2FwX2NhY2hlKHN0cnVjdCBwYWdlICopOwogZXh0ZXJuIGludCBtb3ZlX3RvX3N3YXBfY2FjaGUoc3RydWN0IHBhZ2UgKiwgc3dwX2VudHJ5X3QpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeW5jbGluay5oIGIvaW5jbHVkZS9saW51eC9zeW5jbGluay5oCmluZGV4IDc2M2JkMjkwLi4xYjdjZDhkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5bmNsaW5rLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeW5jbGluay5oCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFN5bmNMaW5rIE11bHRpcHJvdG9jb2wgU2VyaWFsIEFkYXB0ZXIgRHJpdmVyCiAgKgotICogJElkOiBzeW5jbGluay5oLHYgMy42IDIwMDIvMDIvMjAgMjE6NTg6MjAgcGF1bGtmIEV4cCAkCisgKiAkSWQ6IHN5bmNsaW5rLmgsdiAzLjEwIDIwMDUvMTEvMDggMTk6NTA6NTQgcGF1bGtmIEV4cCAkCiAgKgogICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgYnkgTWljcm9nYXRlIENvcnBvcmF0aW9uCiAgKgpAQCAtMTI4LDEwICsxMjgsMTQgQEAKICNkZWZpbmUgTUdTTF9CVVNfVFlQRV9FSVNBCTIKICNkZWZpbmUgTUdTTF9CVVNfVFlQRV9QQ0kJNQogCisjZGVmaW5lIE1HU0xfSU5URVJGQUNFX01BU0sgICAgIDB4ZgogI2RlZmluZSBNR1NMX0lOVEVSRkFDRV9ESVNBQkxFICAwCiAjZGVmaW5lIE1HU0xfSU5URVJGQUNFX1JTMjMyICAgIDEKICNkZWZpbmUgTUdTTF9JTlRFUkZBQ0VfVjM1ICAgICAgMgogI2RlZmluZSBNR1NMX0lOVEVSRkFDRV9SUzQyMiAgICAzCisjZGVmaW5lIE1HU0xfSU5URVJGQUNFX1JUU19FTiAgIDB4MTAKKyNkZWZpbmUgTUdTTF9JTlRFUkZBQ0VfTEwgICAgICAgMHgyMAorI2RlZmluZSBNR1NMX0lOVEVSRkFDRV9STCAgICAgICAweDQwCiAKIHR5cGVkZWYgc3RydWN0IF9NR1NMX1BBUkFNUwogewpAQCAtMTYzLDYgKzE2Nyw5IEBACiAjZGVmaW5lIFNZTkNMSU5LX0RFVklDRV9JRCAweDAwMTAKICNkZWZpbmUgTUdTQ0NfREVWSUNFX0lEIDB4MDAyMAogI2RlZmluZSBTWU5DTElOS19TQ0FfREVWSUNFX0lEIDB4MDAzMAorI2RlZmluZSBTWU5DTElOS19HVF9ERVZJQ0VfSUQgMHgwMDcwCisjZGVmaW5lIFNZTkNMSU5LX0dUNF9ERVZJQ0VfSUQgMHgwMDgwCisjZGVmaW5lIFNZTkNMSU5LX0FDX0RFVklDRV9JRCAgMHgwMDkwCiAjZGVmaW5lIE1HU0xfTUFYX1NFUklBTF9OVU1CRVIgMzAKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaCBiL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaAppbmRleCBjNzAwN2IxLi5lNjY2ZDYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oCkBAIC01MTAsNiArNTEwLDI4IEBACiBhc21saW5rYWdlIGxvbmcgc3lzX2lvcHJpb19zZXQoaW50IHdoaWNoLCBpbnQgd2hvLCBpbnQgaW9wcmlvKTsKIGFzbWxpbmthZ2UgbG9uZyBzeXNfaW9wcmlvX2dldChpbnQgd2hpY2gsIGludCB3aG8pOwogYXNtbGlua2FnZSBsb25nIHN5c19zZXRfbWVtcG9saWN5KGludCBtb2RlLCB1bnNpZ25lZCBsb25nIF9fdXNlciAqbm1hc2ssCi0JCQkJCXVuc2lnbmVkIGxvbmcgbWF4bm9kZSk7CisJCQkJdW5zaWduZWQgbG9uZyBtYXhub2RlKTsKK2FzbWxpbmthZ2UgbG9uZyBzeXNfbWlncmF0ZV9wYWdlcyhwaWRfdCBwaWQsIHVuc2lnbmVkIGxvbmcgbWF4bm9kZSwKKwkJCQljb25zdCB1bnNpZ25lZCBsb25nIF9fdXNlciAqZnJvbSwKKwkJCQljb25zdCB1bnNpZ25lZCBsb25nIF9fdXNlciAqdG8pOworYXNtbGlua2FnZSBsb25nIHN5c19tYmluZCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCQl1bnNpZ25lZCBsb25nIG1vZGUsCisJCQkJdW5zaWduZWQgbG9uZyBfX3VzZXIgKm5tYXNrLAorCQkJCXVuc2lnbmVkIGxvbmcgbWF4bm9kZSwKKwkJCQl1bnNpZ25lZCBmbGFncyk7Cithc21saW5rYWdlIGxvbmcgc3lzX2dldF9tZW1wb2xpY3koaW50IF9fdXNlciAqcG9saWN5LAorCQkJCXVuc2lnbmVkIGxvbmcgX191c2VyICpubWFzaywKKwkJCQl1bnNpZ25lZCBsb25nIG1heG5vZGUsCisJCQkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKworYXNtbGlua2FnZSBsb25nIHN5c19pbm90aWZ5X2luaXQodm9pZCk7Cithc21saW5rYWdlIGxvbmcgc3lzX2lub3RpZnlfYWRkX3dhdGNoKGludCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKnBhdGgsCisJCQkJCXUzMiBtYXNrKTsKK2FzbWxpbmthZ2UgbG9uZyBzeXNfaW5vdGlmeV9ybV93YXRjaChpbnQgZmQsIHUzMiB3ZCk7CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfc3B1X3J1bihpbnQgZmQsIF9fdTMyIF9fdXNlciAqdW5wYywKKwkJCQkgX191MzIgX191c2VyICp1c3RhdHVzKTsKK2FzbWxpbmthZ2UgbG9uZyBzeXNfc3B1X2NyZWF0ZShjb25zdCBjaGFyIF9fdXNlciAqbmFtZSwKKwkJdW5zaWduZWQgaW50IGZsYWdzLCBtb2RlX3QgbW9kZSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeXNjdGwuaCBiL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKaW5kZXggYTliODBmYy4uODM1MmE3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeXNjdGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCkBAIC0xODAsNiArMTgwLDkgQEAKIAlWTV9WRlNfQ0FDSEVfUFJFU1NVUkU9MjYsIC8qIGRjYWNoZS9pY2FjaGUgcmVjbGFpbSBwcmVzc3VyZSAqLwogCVZNX0xFR0FDWV9WQV9MQVlPVVQ9MjcsIC8qIGxlZ2FjeS9jb21wYXRpYmlsaXR5IHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBsYXlvdXQgKi8KIAlWTV9TV0FQX1RPS0VOX1RJTUVPVVQ9MjgsIC8qIGRlZmF1bHQgdGltZSBmb3IgdG9rZW4gdGltZSBvdXQgKi8KKwlWTV9EUk9QX1BBR0VDQUNIRT0yOSwJLyogaW50OiBudWtlIGxvdHMgb2YgcGFnZWNhY2hlICovCisJVk1fUEVSQ1BVX1BBR0VMSVNUX0ZSQUNUSU9OPTMwLC8qIGludDogZnJhY3Rpb24gb2YgcGFnZXMgaW4gZWFjaCBwZXJjcHVfcGFnZWxpc3QgKi8KKwlWTV9aT05FX1JFQ0xBSU1fTU9ERT0zMSwvKiByZWNsYWltIGxvY2FsIHpvbmUgbWVtb3J5IGJlZm9yZSBnb2luZyBvZmYgbm9kZSAqLwogfTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWUuaCBiL2luY2x1ZGUvbGludXgvdGltZS5oCmluZGV4IDc5N2NjZDguLjYxNGRkODQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGltZS5oCisrKyBiL2luY2x1ZGUvbGludXgvdGltZS5oCkBAIC00LDcgKzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8bGludXgvc2VxbG9jay5oPgorIyBpbmNsdWRlIDxsaW51eC9zZXFsb2NrLmg+CiAjZW5kaWYKIAogI2lmbmRlZiBfU1RSVUNUX1RJTUVTUEVDCkBAIC0xMyw3ICsxMyw3IEBACiAJdGltZV90CXR2X3NlYzsJCS8qIHNlY29uZHMgKi8KIAlsb25nCXR2X25zZWM7CS8qIG5hbm9zZWNvbmRzICovCiB9OwotI2VuZGlmIC8qIF9TVFJVQ1RfVElNRVNQRUMgKi8KKyNlbmRpZgogCiBzdHJ1Y3QgdGltZXZhbCB7CiAJdGltZV90CQl0dl9zZWM7CQkvKiBzZWNvbmRzICovCkBAIC0yNyw5MyArMjcsMTAzIEBACiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKLS8qIFBhcmFtZXRlcnMgdXNlZCB0byBjb252ZXJ0IHRoZSB0aW1lc3BlYyB2YWx1ZXMgKi8KLSNkZWZpbmUgTVNFQ19QRVJfU0VDICgxMDAwTCkKLSNkZWZpbmUgVVNFQ19QRVJfU0VDICgxMDAwMDAwTCkKLSNkZWZpbmUgTlNFQ19QRVJfU0VDICgxMDAwMDAwMDAwTCkKLSNkZWZpbmUgTlNFQ19QRVJfVVNFQyAoMTAwMEwpCisvKiBQYXJhbWV0ZXJzIHVzZWQgdG8gY29udmVydCB0aGUgdGltZXNwZWMgdmFsdWVzOiAqLworI2RlZmluZSBNU0VDX1BFUl9TRUMJCTEwMDBMCisjZGVmaW5lIFVTRUNfUEVSX1NFQwkJMTAwMDAwMEwKKyNkZWZpbmUgTlNFQ19QRVJfU0VDCQkxMDAwMDAwMDAwTAorI2RlZmluZSBOU0VDX1BFUl9VU0VDCQkxMDAwTAogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgdGltZXNwZWNfZXF1YWwoc3RydWN0IHRpbWVzcGVjICphLCBzdHJ1Y3QgdGltZXNwZWMgKmIpIAoteyAKLQlyZXR1cm4gKGEtPnR2X3NlYyA9PSBiLT50dl9zZWMpICYmIChhLT50dl9uc2VjID09IGItPnR2X25zZWMpOwotfSAKLQotLyogQ29udmVydHMgR3JlZ29yaWFuIGRhdGUgdG8gc2Vjb25kcyBzaW5jZSAxOTcwLTAxLTAxIDAwOjAwOjAwLgotICogQXNzdW1lcyBpbnB1dCBpbiBub3JtYWwgZGF0ZSBmb3JtYXQsIGkuZS4gMTk4MC0xMi0zMSAyMzo1OTo1OQotICogPT4geWVhcj0xOTgwLCBtb249MTIsIGRheT0zMSwgaG91cj0yMywgbWluPTU5LCBzZWM9NTkuCi0gKgotICogW0ZvciB0aGUgSnVsaWFuIGNhbGVuZGFyICh3aGljaCB3YXMgdXNlZCBpbiBSdXNzaWEgYmVmb3JlIDE5MTcsCi0gKiBCcml0YWluICYgY29sb25pZXMgYmVmb3JlIDE3NTIsIGFueXdoZXJlIGVsc2UgYmVmb3JlIDE1ODIsCi0gKiBhbmQgaXMgc3RpbGwgaW4gdXNlIGJ5IHNvbWUgY29tbXVuaXRpZXMpIGxlYXZlIG91dCB0aGUKLSAqIC15ZWFyLzEwMCt5ZWFyLzQwMCB0ZXJtcywgYW5kIGFkZCAxMC5dCi0gKgotICogVGhpcyBhbGdvcml0aG0gd2FzIGZpcnN0IHB1Ymxpc2hlZCBieSBHYXVzcyAoSSB0aGluaykuCi0gKgotICogV0FSTklORzogdGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJmbG93IG9uIDIxMDYtMDItMDcgMDY6Mjg6MTYgb24KLSAqIG1hY2hpbmVzIHdlcmUgbG9uZyBpcyAzMi1iaXQhIChIb3dldmVyLCBhcyB0aW1lX3QgaXMgc2lnbmVkLCB3ZQotICogd2lsbCBhbHJlYWR5IGdldCBwcm9ibGVtcyBhdCBvdGhlciBwbGFjZXMgb24gMjAzOC0wMS0xOSAwMzoxNDowOCkKLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1ta3RpbWUgKHVuc2lnbmVkIGludCB5ZWFyLCB1bnNpZ25lZCBpbnQgbW9uLAotCXVuc2lnbmVkIGludCBkYXksIHVuc2lnbmVkIGludCBob3VyLAotCXVuc2lnbmVkIGludCBtaW4sIHVuc2lnbmVkIGludCBzZWMpCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdGltZXNwZWNfZXF1YWwoc3RydWN0IHRpbWVzcGVjICphLCBzdHJ1Y3QgdGltZXNwZWMgKmIpCiB7Ci0JaWYgKDAgPj0gKGludCkgKG1vbiAtPSAyKSkgewkvKiAxLi4xMiAtPiAxMSwxMiwxLi4xMCAqLwotCQltb24gKz0gMTI7CQkvKiBQdXRzIEZlYiBsYXN0IHNpbmNlIGl0IGhhcyBsZWFwIGRheSAqLwotCQl5ZWFyIC09IDE7Ci0JfQotCi0JcmV0dXJuICgoKAotCQkodW5zaWduZWQgbG9uZykgKHllYXIvNCAtIHllYXIvMTAwICsgeWVhci80MDAgKyAzNjcqbW9uLzEyICsgZGF5KSArCi0JCQl5ZWFyKjM2NSAtIDcxOTQ5OQotCSAgICApKjI0ICsgaG91ciAvKiBub3cgaGF2ZSBob3VycyAqLwotCSAgKSo2MCArIG1pbiAvKiBub3cgaGF2ZSBtaW51dGVzICovCi0JKSo2MCArIHNlYzsgLyogZmluYWxseSBzZWNvbmRzICovCisJcmV0dXJuIChhLT50dl9zZWMgPT0gYi0+dHZfc2VjKSAmJiAoYS0+dHZfbnNlYyA9PSBiLT50dl9uc2VjKTsKIH0KIAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWt0aW1lKGNvbnN0IHVuc2lnbmVkIGludCB5ZWFyLCBjb25zdCB1bnNpZ25lZCBpbnQgbW9uLAorCQkJICAgIGNvbnN0IHVuc2lnbmVkIGludCBkYXksIGNvbnN0IHVuc2lnbmVkIGludCBob3VyLAorCQkJICAgIGNvbnN0IHVuc2lnbmVkIGludCBtaW4sIGNvbnN0IHVuc2lnbmVkIGludCBzZWMpOworCitleHRlcm4gdm9pZCBzZXRfbm9ybWFsaXplZF90aW1lc3BlYyhzdHJ1Y3QgdGltZXNwZWMgKnRzLCB0aW1lX3Qgc2VjLCBsb25nIG5zZWMpOworCisvKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSB0aW1lc3BlYyBpcyBub3JtLCBmYWxzZSBpZiBkZW5vcm06CisgKi8KKyNkZWZpbmUgdGltZXNwZWNfdmFsaWQodHMpIFwKKwkoKCh0cyktPnR2X3NlYyA+PSAwKSAmJiAoKCh1bnNpZ25lZCkgKHRzKS0+dHZfbnNlYykgPCBOU0VDX1BFUl9TRUMpKQorCisvKgorICogNjQtYml0IG5hbm9zZWMgdHlwZS4gTGFyZ2UgZW5vdWdoIHRvIHNwYW4gMjkyKyB5ZWFycyBpbiBuYW5vc2Vjb25kCisgKiByZXNvbHV0aW9uLiBPdWdodCB0byBiZSBlbm91Z2ggZm9yIGEgd2hpbGUuCisgKi8KK3R5cGVkZWYgczY0IG5zZWNfdDsKKwogZXh0ZXJuIHN0cnVjdCB0aW1lc3BlYyB4dGltZTsKIGV4dGVybiBzdHJ1Y3QgdGltZXNwZWMgd2FsbF90b19tb25vdG9uaWM7CiBleHRlcm4gc2VxbG9ja190IHh0aW1lX2xvY2s7CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfc2Vjb25kcyh2b2lkKQoteyAKK3sKIAlyZXR1cm4geHRpbWUudHZfc2VjOwogfQogCiBzdHJ1Y3QgdGltZXNwZWMgY3VycmVudF9rZXJuZWxfdGltZSh2b2lkKTsKIAotI2RlZmluZSBDVVJSRU5UX1RJTUUgKGN1cnJlbnRfa2VybmVsX3RpbWUoKSkKLSNkZWZpbmUgQ1VSUkVOVF9USU1FX1NFQyAoKHN0cnVjdCB0aW1lc3BlYykgeyB4dGltZS50dl9zZWMsIDAgfSkKKyNkZWZpbmUgQ1VSUkVOVF9USU1FCQkoY3VycmVudF9rZXJuZWxfdGltZSgpKQorI2RlZmluZSBDVVJSRU5UX1RJTUVfU0VDCSgoc3RydWN0IHRpbWVzcGVjKSB7IHh0aW1lLnR2X3NlYywgMCB9KQogCiBleHRlcm4gdm9pZCBkb19nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnR2KTsKIGV4dGVybiBpbnQgZG9fc2V0dGltZW9mZGF5KHN0cnVjdCB0aW1lc3BlYyAqdHYpOwogZXh0ZXJuIGludCBkb19zeXNfc2V0dGltZW9mZGF5KHN0cnVjdCB0aW1lc3BlYyAqdHYsIHN0cnVjdCB0aW1lem9uZSAqdHopOwotZXh0ZXJuIHZvaWQgY2xvY2tfd2FzX3NldCh2b2lkKTsgLy8gY2FsbCB3aGVuIGV2ZXIgdGhlIGNsb2NrIGlzIHNldAotZXh0ZXJuIGludCBkb19wb3NpeF9jbG9ja19tb25vdG9uaWNfZ2V0dGltZShzdHJ1Y3QgdGltZXNwZWMgKnRwKTsKLWV4dGVybiBsb25nIGRvX3V0aW1lcyhjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCBzdHJ1Y3QgdGltZXZhbCAqIHRpbWVzKTsKKyNkZWZpbmUgZG9fcG9zaXhfY2xvY2tfbW9ub3RvbmljX2dldHRpbWUodHMpIGt0aW1lX2dldF90cyh0cykKK2V4dGVybiBsb25nIGRvX3V0aW1lcyhpbnQgZGZkLCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsIHN0cnVjdCB0aW1ldmFsICp0aW1lcyk7CiBzdHJ1Y3QgaXRpbWVydmFsOwotZXh0ZXJuIGludCBkb19zZXRpdGltZXIoaW50IHdoaWNoLCBzdHJ1Y3QgaXRpbWVydmFsICp2YWx1ZSwgc3RydWN0IGl0aW1lcnZhbCAqb3ZhbHVlKTsKK2V4dGVybiBpbnQgZG9fc2V0aXRpbWVyKGludCB3aGljaCwgc3RydWN0IGl0aW1lcnZhbCAqdmFsdWUsCisJCQlzdHJ1Y3QgaXRpbWVydmFsICpvdmFsdWUpOwogZXh0ZXJuIGludCBkb19nZXRpdGltZXIoaW50IHdoaWNoLCBzdHJ1Y3QgaXRpbWVydmFsICp2YWx1ZSk7Ci1leHRlcm4gdm9pZCBnZXRuc3RpbWVvZmRheSAoc3RydWN0IHRpbWVzcGVjICp0dik7Ci1leHRlcm4gdm9pZCBnZXRuc3RpbWVzdGFtcChzdHJ1Y3QgdGltZXNwZWMgKnRzKTsKK2V4dGVybiB2b2lkIGdldG5zdGltZW9mZGF5KHN0cnVjdCB0aW1lc3BlYyAqdHYpOwogCiBleHRlcm4gc3RydWN0IHRpbWVzcGVjIHRpbWVzcGVjX3RydW5jKHN0cnVjdCB0aW1lc3BlYyB0LCB1bnNpZ25lZCBncmFuKTsKIAotc3RhdGljIGlubGluZSB2b2lkCi1zZXRfbm9ybWFsaXplZF90aW1lc3BlYyAoc3RydWN0IHRpbWVzcGVjICp0cywgdGltZV90IHNlYywgbG9uZyBuc2VjKQorLyoqCisgKiB0aW1lc3BlY190b19ucyAtIENvbnZlcnQgdGltZXNwZWMgdG8gbmFub3NlY29uZHMKKyAqIEB0czoJCXBvaW50ZXIgdG8gdGhlIHRpbWVzcGVjIHZhcmlhYmxlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybnMgdGhlIHNjYWxhciBuYW5vc2Vjb25kIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0aW1lc3BlYworICogcGFyYW1ldGVyLgorICovCitzdGF0aWMgaW5saW5lIG5zZWNfdCB0aW1lc3BlY190b19ucyhjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQogewotCXdoaWxlIChuc2VjID49IE5TRUNfUEVSX1NFQykgewotCQluc2VjIC09IE5TRUNfUEVSX1NFQzsKLQkJKytzZWM7Ci0JfQotCXdoaWxlIChuc2VjIDwgMCkgewotCQluc2VjICs9IE5TRUNfUEVSX1NFQzsKLQkJLS1zZWM7Ci0JfQotCXRzLT50dl9zZWMgPSBzZWM7Ci0JdHMtPnR2X25zZWMgPSBuc2VjOworCXJldHVybiAoKG5zZWNfdCkgdHMtPnR2X3NlYyAqIE5TRUNfUEVSX1NFQykgKyB0cy0+dHZfbnNlYzsKIH0KIAorLyoqCisgKiB0aW1ldmFsX3RvX25zIC0gQ29udmVydCB0aW1ldmFsIHRvIG5hbm9zZWNvbmRzCisgKiBAdHM6CQlwb2ludGVyIHRvIHRoZSB0aW1ldmFsIHZhcmlhYmxlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybnMgdGhlIHNjYWxhciBuYW5vc2Vjb25kIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0aW1ldmFsCisgKiBwYXJhbWV0ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgbnNlY190IHRpbWV2YWxfdG9fbnMoY29uc3Qgc3RydWN0IHRpbWV2YWwgKnR2KQoreworCXJldHVybiAoKG5zZWNfdCkgdHYtPnR2X3NlYyAqIE5TRUNfUEVSX1NFQykgKworCQl0di0+dHZfdXNlYyAqIE5TRUNfUEVSX1VTRUM7Cit9CisKKy8qKgorICogbnNfdG9fdGltZXNwZWMgLSBDb252ZXJ0IG5hbm9zZWNvbmRzIHRvIHRpbWVzcGVjCisgKiBAbnNlYzoJdGhlIG5hbm9zZWNvbmRzIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybnMgdGhlIHRpbWVzcGVjIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBuc2VjIHBhcmFtZXRlci4KKyAqLworZXh0ZXJuIHN0cnVjdCB0aW1lc3BlYyBuc190b190aW1lc3BlYyhjb25zdCBuc2VjX3QgbnNlYyk7CisKKy8qKgorICogbnNfdG9fdGltZXZhbCAtIENvbnZlcnQgbmFub3NlY29uZHMgdG8gdGltZXZhbAorICogQG5zZWM6CXRoZSBuYW5vc2Vjb25kcyB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm5zIHRoZSB0aW1ldmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBuc2VjIHBhcmFtZXRlci4KKyAqLworZXh0ZXJuIHN0cnVjdCB0aW1ldmFsIG5zX3RvX3RpbWV2YWwoY29uc3QgbnNlY190IG5zZWMpOworCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZGVmaW5lIE5GREJJVFMJCQlfX05GREJJVFMKQEAgLTEyNiw0OSArMTM2LDQxIEBACiAKIC8qCiAgKiBOYW1lcyBvZiB0aGUgaW50ZXJ2YWwgdGltZXJzLCBhbmQgc3RydWN0dXJlCi0gKiBkZWZpbmluZyBhIHRpbWVyIHNldHRpbmcuCisgKiBkZWZpbmluZyBhIHRpbWVyIHNldHRpbmc6CiAgKi8KLSNkZWZpbmUJSVRJTUVSX1JFQUwJMAotI2RlZmluZQlJVElNRVJfVklSVFVBTAkxCi0jZGVmaW5lCUlUSU1FUl9QUk9GCTIKKyNkZWZpbmUJSVRJTUVSX1JFQUwJCTAKKyNkZWZpbmUJSVRJTUVSX1ZJUlRVQUwJCTEKKyNkZWZpbmUJSVRJTUVSX1BST0YJCTIKIAotc3RydWN0ICBpdGltZXJzcGVjIHsKLSAgICAgICAgc3RydWN0ICB0aW1lc3BlYyBpdF9pbnRlcnZhbDsgICAgLyogdGltZXIgcGVyaW9kICovCi0gICAgICAgIHN0cnVjdCAgdGltZXNwZWMgaXRfdmFsdWU7ICAgICAgIC8qIHRpbWVyIGV4cGlyYXRpb24gKi8KK3N0cnVjdCBpdGltZXJzcGVjIHsKKwlzdHJ1Y3QgdGltZXNwZWMgaXRfaW50ZXJ2YWw7CS8qIHRpbWVyIHBlcmlvZCAqLworCXN0cnVjdCB0aW1lc3BlYyBpdF92YWx1ZTsJLyogdGltZXIgZXhwaXJhdGlvbiAqLwogfTsKIAotc3RydWN0CWl0aW1lcnZhbCB7Ci0Jc3RydWN0CXRpbWV2YWwgaXRfaW50ZXJ2YWw7CS8qIHRpbWVyIGludGVydmFsICovCi0Jc3RydWN0CXRpbWV2YWwgaXRfdmFsdWU7CS8qIGN1cnJlbnQgdmFsdWUgKi8KK3N0cnVjdCBpdGltZXJ2YWwgeworCXN0cnVjdCB0aW1ldmFsIGl0X2ludGVydmFsOwkvKiB0aW1lciBpbnRlcnZhbCAqLworCXN0cnVjdCB0aW1ldmFsIGl0X3ZhbHVlOwkvKiBjdXJyZW50IHZhbHVlICovCiB9OwogCisvKgorICogVGhlIElEcyBvZiB0aGUgdmFyaW91cyBzeXN0ZW0gY2xvY2tzIChmb3IgUE9TSVguMWIgaW50ZXJ2YWwgdGltZXJzKToKKyAqLworI2RlZmluZSBDTE9DS19SRUFMVElNRQkJCTAKKyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDCQkJMQorI2RlZmluZSBDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQJMgorI2RlZmluZSBDTE9DS19USFJFQURfQ1BVVElNRV9JRAkJMwogCiAvKgotICogVGhlIElEcyBvZiB0aGUgdmFyaW91cyBzeXN0ZW0gY2xvY2tzIChmb3IgUE9TSVguMWIgaW50ZXJ2YWwgdGltZXJzKS4KKyAqIFRoZSBJRHMgb2YgdmFyaW91cyBoYXJkd2FyZSBjbG9ja3M6CiAgKi8KLSNkZWZpbmUgQ0xPQ0tfUkVBTFRJTUUJCSAgMAotI2RlZmluZSBDTE9DS19NT05PVE9OSUMJICAxCi0jZGVmaW5lIENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCAyCi0jZGVmaW5lIENMT0NLX1RIUkVBRF9DUFVUSU1FX0lECSAzCi0jZGVmaW5lIENMT0NLX1JFQUxUSU1FX0hSCSA0Ci0jZGVmaW5lIENMT0NLX01PTk9UT05JQ19IUgkgIDUKKyNkZWZpbmUgQ0xPQ0tfU0dJX0NZQ0xFCQkJMTAKKyNkZWZpbmUgTUFYX0NMT0NLUwkJCTE2CisjZGVmaW5lIENMT0NLU19NQVNLCQkJKENMT0NLX1JFQUxUSU1FIHwgQ0xPQ0tfTU9OT1RPTklDKQorI2RlZmluZSBDTE9DS1NfTU9OTwkJCUNMT0NLX01PTk9UT05JQwogCiAvKgotICogVGhlIElEcyBvZiB2YXJpb3VzIGhhcmR3YXJlIGNsb2NrcworICogVGhlIHZhcmlvdXMgZmxhZ3MgZm9yIHNldHRpbmcgUE9TSVguMWIgaW50ZXJ2YWwgdGltZXJzOgogICovCi0KLQotI2RlZmluZSBDTE9DS19TR0lfQ1lDTEUgMTAKLSNkZWZpbmUgTUFYX0NMT0NLUyAxNgotI2RlZmluZSBDTE9DS1NfTUFTSyAgKENMT0NLX1JFQUxUSU1FIHwgQ0xPQ0tfTU9OT1RPTklDIHwgXAotICAgICAgICAgICAgICAgICAgICAgQ0xPQ0tfUkVBTFRJTUVfSFIgfCBDTE9DS19NT05PVE9OSUNfSFIpCi0jZGVmaW5lIENMT0NLU19NT05PIChDTE9DS19NT05PVE9OSUMgJiBDTE9DS19NT05PVE9OSUNfSFIpCi0KLS8qCi0gKiBUaGUgdmFyaW91cyBmbGFncyBmb3Igc2V0dGluZyBQT1NJWC4xYiBpbnRlcnZhbCB0aW1lcnMuCi0gKi8KLQotI2RlZmluZSBUSU1FUl9BQlNUSU1FIDB4MDEKLQorI2RlZmluZSBUSU1FUl9BQlNUSU1FCQkJMHgwMQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGltZXIuaCBiL2luY2x1ZGUvbGludXgvdGltZXIuaAppbmRleCA3MmYzYTc3Li45Yjk4NzdmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RpbWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC90aW1lci5oCkBAIC05Niw2ICs5Niw2IEBACiAKIGV4dGVybiB2b2lkIGluaXRfdGltZXJzKHZvaWQpOwogZXh0ZXJuIHZvaWQgcnVuX2xvY2FsX3RpbWVycyh2b2lkKTsKLWV4dGVybiB2b2lkIGl0X3JlYWxfZm4odW5zaWduZWQgbG9uZyk7CitleHRlcm4gaW50IGl0X3JlYWxfZm4odm9pZCAqKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpcGMuaCBiL2luY2x1ZGUvbGludXgvdGlwYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0M2ExNWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3RpcGMuaApAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIGluY2x1ZGUvbGludXgvdGlwYy5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgc29ja2V0IGludGVyZmFjZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9USVBDX0hfCisjZGVmaW5lIF9MSU5VWF9USVBDX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogVElQQyBhZGRyZXNzaW5nIHByaW1pdGl2ZXMKKyAqLworIAorc3RydWN0IHRpcGNfcG9ydGlkIHsKKwlfX3UzMiByZWY7CisJX191MzIgbm9kZTsKK307CisKK3N0cnVjdCB0aXBjX25hbWUgeworCV9fdTMyIHR5cGU7CisJX191MzIgaW5zdGFuY2U7Cit9OworCitzdHJ1Y3QgdGlwY19uYW1lX3NlcSB7CisJX191MzIgdHlwZTsKKwlfX3UzMiBsb3dlcjsKKwlfX3UzMiB1cHBlcjsKK307CisKK3N0YXRpYyBpbmxpbmUgX191MzIgdGlwY19hZGRyKHVuc2lnbmVkIGludCB6b25lLAorCQkJICAgICAgdW5zaWduZWQgaW50IGNsdXN0ZXIsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbm9kZSkKK3sKKwlyZXR1cm4gKHpvbmUgPDwgMjQpIHwgKGNsdXN0ZXIgPDwgMTIpIHwgbm9kZTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdGlwY196b25lKF9fdTMyIGFkZHIpCit7CisJcmV0dXJuIGFkZHIgPj4gMjQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHRpcGNfY2x1c3RlcihfX3UzMiBhZGRyKQoreworCXJldHVybiAoYWRkciA+PiAxMikgJiAweGZmZjsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdGlwY19ub2RlKF9fdTMyIGFkZHIpCit7CisJcmV0dXJuIGFkZHIgJiAweGZmZjsKK30KKworLyoKKyAqIEFwcGxpY2F0aW9uLWFjY2Vzc2libGUgcG9ydCBuYW1lIHR5cGVzCisgKi8KKworI2RlZmluZSBUSVBDX0NGR19TUlYJCTAJLyogY29uZmlndXJhdGlvbiBzZXJ2aWNlIG5hbWUgdHlwZSAqLworI2RlZmluZSBUSVBDX1RPUF9TUlYJCTEJLyogdG9wb2xvZ3kgc2VydmljZSBuYW1lIHR5cGUgKi8KKyNkZWZpbmUgVElQQ19SRVNFUlZFRF9UWVBFUwk2NAkvKiBsb3dlc3QgdXNlci1wdWJsaXNoYWJsZSBuYW1lIHR5cGUgKi8KKworLyogCisgKiBQdWJsaWNhdGlvbiBzY29wZXMgd2hlbiBiaW5kaW5nIHBvcnQgbmFtZXMgYW5kIHBvcnQgbmFtZSBzZXF1ZW5jZXMKKyAqLworCisjZGVmaW5lIFRJUENfWk9ORV9TQ09QRQkJMQorI2RlZmluZSBUSVBDX0NMVVNURVJfU0NPUEUJMgorI2RlZmluZSBUSVBDX05PREVfU0NPUEUJCTMKKworLyoKKyAqIExpbWl0aW5nIHZhbHVlcyBmb3IgbWVzc2FnZXMKKyAqLworCisjZGVmaW5lIFRJUENfTUFYX1VTRVJfTVNHX1NJWkUJNjYwMDAKKworLyoKKyAqIE1lc3NhZ2UgaW1wb3J0YW5jZSBsZXZlbHMKKyAqLworCisjZGVmaW5lIFRJUENfTE9XX0lNUE9SVEFOQ0UJCTAgIC8qIGRlZmF1bHQgKi8KKyNkZWZpbmUgVElQQ19NRURJVU1fSU1QT1JUQU5DRQkJMQorI2RlZmluZSBUSVBDX0hJR0hfSU1QT1JUQU5DRQkJMgorI2RlZmluZSBUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0UJMworCisvKiAKKyAqIE1zZyByZWplY3Rpb24vY29ubmVjdGlvbiBzaHV0ZG93biByZWFzb25zCisgKi8KKworI2RlZmluZSBUSVBDX09LCQkJMAorI2RlZmluZSBUSVBDX0VSUl9OT19OQU1FCTEKKyNkZWZpbmUgVElQQ19FUlJfTk9fUE9SVAkyCisjZGVmaW5lIFRJUENfRVJSX05PX05PREUJMworI2RlZmluZSBUSVBDX0VSUl9PVkVSTE9BRAk0CisjZGVmaW5lIFRJUENfQ09OTl9TSFVURE9XTgk1CisKKy8qCisgKiBUSVBDIHRvcG9sb2d5IHN1YnNjcmlwdGlvbiBzZXJ2aWNlIGRlZmluaXRpb25zCisgKi8KKworI2RlZmluZSBUSVBDX1NVQl9QT1JUUyAgICAgCTB4MDEgIAkvKiBmaWx0ZXIgZm9yIHBvcnQgYXZhaWxhYmlsaXR5ICovCisjZGVmaW5lIFRJUENfU1VCX1NFUlZJQ0UgICAgIAkweDAyICAJLyogZmlsdGVyIGZvciBzZXJ2aWNlIGF2YWlsYWJpbGl0eSAqLworI2lmIDAKKy8qIFRoZSBmb2xsb3dpbmcgZmlsdGVyIG9wdGlvbnMgYXJlIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUgVElQQ19TVUJfTk9fQklORF9FVlRTCTB4MDQJLyogZmlsdGVyIG91dCAicHVibGlzaCIgZXZlbnRzICovCisjZGVmaW5lIFRJUENfU1VCX05PX1VOQklORF9FVlRTCTB4MDgJLyogZmlsdGVyIG91dCAid2l0aGRyYXciIGV2ZW50cyAqLworI2RlZmluZSBUSVBDX1NVQl9TSU5HTEVfRVZUCTB4MTAJLyogZXhwaXJlIGFmdGVyIGZpcnN0IGV2ZW50ICovCisjZW5kaWYKKworI2RlZmluZSBUSVBDX1dBSVRfRk9SRVZFUgl+MAkvKiB0aW1lb3V0IGZvciBwZXJtYW5lbnQgc3Vic2NyaXB0aW9uICovCisKK3N0cnVjdCB0aXBjX3N1YnNjciB7CisJc3RydWN0IHRpcGNfbmFtZV9zZXEgc2VxOwkvKiBuYW1lIHNlcXVlbmNlIG9mIGludGVyZXN0ICovCisJX191MzIgdGltZW91dDsJCQkvKiBzdWJzY3JpcHRpb24gZHVyYXRpb24gKGluIG1zKSAqLworICAgICAgICBfX3UzMiBmaWx0ZXI7ICAgCQkvKiBiaXRtYXNrIG9mIGZpbHRlciBvcHRpb25zICovCisJY2hhciB1c3JfaGFuZGxlWzhdOwkJLyogYXZhaWxhYmxlIGZvciBzdWJzY3JpYmVyIHVzZSAqLworfTsKKworI2RlZmluZSBUSVBDX1BVQkxJU0hFRAkJMQkvKiBwdWJsaWNhdGlvbiBldmVudCAqLworI2RlZmluZSBUSVBDX1dJVEhEUkFXTgkJMgkvKiB3aXRoZHJhdyBldmVudCAqLworI2RlZmluZSBUSVBDX1NVQlNDUl9USU1FT1VUCTMJLyogc3Vic2NyaXB0aW9uIHRpbWVvdXQgZXZlbnQgKi8KKworc3RydWN0IHRpcGNfZXZlbnQgeworCV9fdTMyIGV2ZW50OwkJCS8qIGV2ZW50IHR5cGUgKi8KKwlfX3UzMiBmb3VuZF9sb3dlcjsJCS8qIG1hdGNoaW5nIG5hbWUgc2VxIGluc3RhbmNlcyAqLworCV9fdTMyIGZvdW5kX3VwcGVyOwkJLyogICAgIiAgICAgICIgICAgIiAgICAgIiAgICAgICovCisJc3RydWN0IHRpcGNfcG9ydGlkIHBvcnQ7CS8qIGFzc29jaWF0ZWQgcG9ydCAqLworCXN0cnVjdCB0aXBjX3N1YnNjciBzOwkJLyogYXNzb2NpYXRlZCBzdWJzY3JpcHRpb24gKi8KK307CisKKy8qCisgKiBTb2NrZXQgQVBJCisgKi8KKworI2lmbmRlZiBBRl9USVBDCisjZGVmaW5lIEFGX1RJUEMJCTMwCisjZW5kaWYKKworI2lmbmRlZiBQRl9USVBDCisjZGVmaW5lIFBGX1RJUEMJCUFGX1RJUEMKKyNlbmRpZgorCisjaWZuZGVmIFNPTF9USVBDCisjZGVmaW5lIFNPTF9USVBDCTI3MQorI2VuZGlmCisKKyNkZWZpbmUgVElQQ19BRERSX05BTUVTRVEJMQorI2RlZmluZSBUSVBDX0FERFJfTUNBU1QJCTEKKyNkZWZpbmUgVElQQ19BRERSX05BTUUJCTIKKyNkZWZpbmUgVElQQ19BRERSX0lECQkzCisKK3N0cnVjdCBzb2NrYWRkcl90aXBjIHsKKwl1bnNpZ25lZCBzaG9ydCBmYW1pbHk7CisJdW5zaWduZWQgY2hhciAgYWRkcnR5cGU7CisJc2lnbmVkICAgY2hhciAgc2NvcGU7CisJdW5pb24geworCQlzdHJ1Y3QgdGlwY19wb3J0aWQgaWQ7CisJCXN0cnVjdCB0aXBjX25hbWVfc2VxIG5hbWVzZXE7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgdGlwY19uYW1lIG5hbWU7CisJCQlfX3UzMiBkb21haW47IC8qIDA6IG93biB6b25lICovCisJCX0gbmFtZTsKKwl9IGFkZHI7Cit9OworCisvKgorICogQW5jaWxsYXJ5IGRhdGEgb2JqZWN0cyBzdXBwb3J0ZWQgYnkgcmVjdm1zZygpCisgKi8KKworI2RlZmluZSBUSVBDX0VSUklORk8JMQkvKiBlcnJvciBpbmZvICovCisjZGVmaW5lIFRJUENfUkVUREFUQQkyCS8qIHJldHVybmVkIGRhdGEgKi8KKyNkZWZpbmUgVElQQ19ERVNUTkFNRQkzCS8qIGRlc3RpbmF0aW9uIG5hbWUgKi8KKworLyoKKyAqIFRJUEMtc3BlY2lmaWMgc29ja2V0IG9wdGlvbiB2YWx1ZXMKKyAqLworCisjZGVmaW5lIFRJUENfSU1QT1JUQU5DRQkJMTI3CS8qIERlZmF1bHQ6IFRJUENfTE9XX0lNUE9SVEFOQ0UgKi8KKyNkZWZpbmUgVElQQ19TUkNfRFJPUFBBQkxFCTEyOAkvKiBEZWZhdWx0OiAwIChyZXNlbmQgY29uZ2VzdGVkIG1zZykgKi8KKyNkZWZpbmUgVElQQ19ERVNUX0RST1BQQUJMRQkxMjkJLyogRGVmYXVsdDogYmFzZWQgb24gc29ja2V0IHR5cGUgKi8KKyNkZWZpbmUgVElQQ19DT05OX1RJTUVPVVQJMTMwCS8qIERlZmF1bHQ6IDgwMDAgKG1zKSAgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpcGNfY29uZmlnLmggYi9pbmNsdWRlL2xpbnV4L3RpcGNfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhNjUzOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvdGlwY19jb25maWcuaApAQCAtMCwwICsxLDQxMCBAQAorLyoKKyAqIGluY2x1ZGUvbGludXgvdGlwY19jb25maWcuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX0xJTlVYX1RJUENfQ09ORklHX0hfCisjZGVmaW5lIF9MSU5VWF9USVBDX0NPTkZJR19IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKy8qCisgKiBDb25maWd1cmF0aW9uCisgKgorICogQWxsIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCBtZXNzYWdpbmcgaW52b2x2ZXMgc2VuZGluZyBhIHJlcXVlc3QgbWVzc2FnZQorICogdG8gdGhlIFRJUEMgY29uZmlndXJhdGlvbiBzZXJ2aWNlIG9uIGEgbm9kZSwgd2hpY2ggc2VuZHMgYSByZXBseSBtZXNzYWdlCisgKiBiYWNrLiAgKEluIHRoZSBmdXR1cmUgbXVsdGktbWVzc2FnZSByZXBsaWVzIG1heSBiZSBzdXBwb3J0ZWQuKQorICoKKyAqIEJvdGggcmVxdWVzdCBhbmQgcmVwbHkgbWVzc2FnZXMgY29uc2lzdCBvZiBhIHRyYW5zcG9ydCBoZWFkZXIgYW5kIHBheWxvYWQuCisgKiBUaGUgdHJhbnNwb3J0IGhlYWRlciBjb250YWlucyBpbmZvIGFib3V0IHRoZSBkZXNpcmVkIG9wZXJhdGlvbjsKKyAqIHRoZSBwYXlsb2FkIGNvbnNpc3RzIG9mIHplcm8gb3IgbW9yZSB0eXBlL2xlbmd0aC92YWx1ZSAoVExWKSBpdGVtcworICogd2hpY2ggc3BlY2lmeSBwYXJhbWV0ZXJzIG9yIHJlc3VsdHMgZm9yIHRoZSBvcGVyYXRpb24uCisgKgorICogRm9yIG1hbnkgb3BlcmF0aW9ucywgdGhlIHJlcXVlc3QgYW5kIHJlcGx5IG1lc3NhZ2VzIGhhdmUgYSBmaXhlZCBudW1iZXIKKyAqIG9mIFRMVnMgKHVzdWFsbHkgemVybyBvciBvbmUpOyBob3dldmVyLCBzb21lIHJlcGx5IG1lc3NhZ2VzIG1heSByZXR1cm4gCisgKiBhIHZhcmlhYmxlIG51bWJlciBvZiBUTFZzLiAgQSBmYWlsZWQgcmVxdWVzdCBpcyBkZW5vdGVkIGJ5IHRoZSBwcmVzZW5jZQorICogb2YgYW4gImVycm9yIHN0cmluZyIgVExWIGluIHRoZSByZXBseSBtZXNzYWdlIGluc3RlYWQgb2YgdGhlIFRMVihzKSB0aGUKKyAqIHJlcGx5IHNob3VsZCBjb250YWluIGlmIHRoZSByZXF1ZXN0IHN1Y2NlZWRzLgorICovCisgCisvKiAKKyAqIFB1YmxpYyBjb21tYW5kczoKKyAqIE1heSBiZSBpc3N1ZWQgYnkgYW55IHByb2Nlc3MuCisgKiBBY2NlcHRlZCBieSBvd24gbm9kZSwgb3IgYnkgcmVtb3RlIG5vZGUgb25seSBpZiByZW1vdGUgbWFuYWdlbWVudCBlbmFibGVkLiAgICAgICAgICAgICAgICAgICAgICAgCisgKi8KKyAKKyNkZWZpbmUgIFRJUENfQ01EX05PT1AgICAJICAgIDB4MDAwMCAgICAvKiB0eCBub25lLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTk9ERVMgICAgICAgICAweDAwMDEgICAgLyogdHggbmV0X2FkZHIsIHJ4IG5vZGVfaW5mbyhzKSAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX01FRElBX05BTUVTICAgMHgwMDAyICAgIC8qIHR4IG5vbmUsIHJ4IG1lZGlhX25hbWUocykgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9CRUFSRVJfTkFNRVMgIDB4MDAwMyAgICAvKiB0eCBub25lLCByeCBiZWFyZXJfbmFtZShzKSAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX0xJTktTICAgICAgICAgMHgwMDA0ICAgIC8qIHR4IG5ldF9hZGRyLCByeCBsaW5rX2luZm8ocykgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NIT1dfTkFNRV9UQUJMRSAgIDB4MDAwNSAgICAvKiB0eCBuYW1lX3RibF9xdWVyeSwgcnggdWx0cmFfc3RyaW5nICovCisjZGVmaW5lICBUSVBDX0NNRF9TSE9XX1BPUlRTICAgICAgICAweDAwMDYgICAgLyogdHggbm9uZSwgcnggdWx0cmFfc3RyaW5nICovCisjZGVmaW5lICBUSVBDX0NNRF9TSE9XX0xJTktfU1RBVFMgICAweDAwMEIgICAgLyogdHggbGlua19uYW1lLCByeCB1bHRyYV9zdHJpbmcgKi8KKworI2lmIDAKKyNkZWZpbmUgIFRJUENfQ01EX1NIT1dfUE9SVF9TVEFUUyAgIDB4MDAwOCAgICAvKiB0eCBwb3J0X3JlZiwgcnggdWx0cmFfc3RyaW5nICovCisjZGVmaW5lICBUSVBDX0NNRF9SRVNFVF9QT1JUX1NUQVRTICAweDAwMDkgICAgLyogdHggcG9ydF9yZWYsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9ST1VURVMgICAgICAgIDB4MDAwQSAgICAvKiB0eCA/LCByeCA/ICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTElOS19QRUVSICAgICAweDAwMEQgICAgLyogdHggbGlua19uYW1lLCByeCA/ICovCisjZW5kaWYKKworLyogCisgKiBQcm90ZWN0ZWQgY29tbWFuZHM6CisgKiBNYXkgb25seSBiZSBpc3N1ZWQgYnkgIm5ldHdvcmsgYWRtaW5pc3RyYXRpb24gY2FwYWJsZSIgcHJvY2Vzcy4KKyAqIEFjY2VwdGVkIGJ5IG93biBub2RlLCBvciBieSByZW1vdGUgbm9kZSBvbmx5IGlmIHJlbW90ZSBtYW5hZ2VtZW50IGVuYWJsZWQKKyAqIGFuZCB0aGlzIG5vZGUgaXMgem9uZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgCisgKi8KKworI2RlZmluZSAgVElQQ19DTURfR0VUX1JFTU9URV9NTkcgICAgMHg0MDAzICAgIC8qIHR4IG5vbmUsIHJ4IHVuc2lnbmVkICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTUFYX1BPUlRTICAgICAweDQwMDQgICAgLyogdHggbm9uZSwgcnggdW5zaWduZWQgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9NQVhfUFVCTCAgICAgIDB4NDAwNSAgICAvKiB0eCBub25lLCByeCB1bnNpZ25lZCAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX01BWF9TVUJTQ1IgICAgMHg0MDA2ICAgIC8qIHR4IG5vbmUsIHJ4IHVuc2lnbmVkICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTUFYX1pPTkVTICAgICAweDQwMDcgICAgLyogdHggbm9uZSwgcnggdW5zaWduZWQgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9NQVhfQ0xVU1RFUlMgIDB4NDAwOCAgICAvKiB0eCBub25lLCByeCB1bnNpZ25lZCAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX01BWF9OT0RFUyAgICAgMHg0MDA5ICAgIC8qIHR4IG5vbmUsIHJ4IHVuc2lnbmVkICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTUFYX1NMQVZFUyAgICAweDQwMEEgICAgLyogdHggbm9uZSwgcnggdW5zaWduZWQgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9ORVRJRCAgICAgICAgIDB4NDAwQiAgICAvKiB0eCBub25lLCByeCB1bnNpZ25lZCAqLworCisjZGVmaW5lICBUSVBDX0NNRF9FTkFCTEVfQkVBUkVSICAgICAweDQxMDEgICAgLyogdHggYmVhcmVyX2NvbmZpZywgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfRElTQUJMRV9CRUFSRVIgICAgMHg0MTAyICAgIC8qIHR4IGJlYXJlcl9uYW1lLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTElOS19UT0wgICAgICAweDQxMDcgICAgLyogdHggbGlua19jb25maWcsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9MSU5LX1BSSSAgICAgIDB4NDEwOCAgICAvKiB0eCBsaW5rX2NvbmZpZywgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX0xJTktfV0lORE9XICAgMHg0MTA5ICAgIC8qIHR4IGxpbmtfY29uZmlnLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTE9HX1NJWkUgICAgICAweDQxMEEgICAgLyogdHggdW5zaWduZWQsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0RVTVBfTE9HICAgICAgICAgIDB4NDEwQiAgICAvKiB0eCBub25lLCByeCB1bHRyYV9zdHJpbmcgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1JFU0VUX0xJTktfU1RBVFMgIDB4NDEwQyAgICAvKiB0eCBsaW5rX25hbWUsIHJ4IG5vbmUgKi8KKworI2lmIDAKKyNkZWZpbmUgIFRJUENfQ01EX0NSRUFURV9MSU5LICAgICAgIDB4NDEwMyAgICAvKiB0eCBsaW5rX2NyZWF0ZSwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfUkVNT1ZFX0xJTksgICAgICAgMHg0MTA0ICAgIC8qIHR4IGxpbmtfbmFtZSwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfQkxPQ0tfTElOSyAgICAgICAgMHg0MTA1ICAgIC8qIHR4IGxpbmtfbmFtZSwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfVU5CTE9DS19MSU5LICAgICAgMHg0MTA2ICAgIC8qIHR4IGxpbmtfbmFtZSwgcnggbm9uZSAqLworI2VuZGlmCisKKy8qIAorICogUHJpdmF0ZSBjb21tYW5kczoKKyAqIE1heSBvbmx5IGJlIGlzc3VlZCBieSAibmV0d29yayBhZG1pbmlzdHJhdGlvbiBjYXBhYmxlIiBwcm9jZXNzLgorICogQWNjZXB0ZWQgYnkgb3duIG5vZGUgb25seTsgY2Fubm90IGJlIHVzZWQgb24gYSByZW1vdGUgbm9kZS4gICAgICAgICAgICAgICAgICAgICAgIAorICovCisKKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9OT0RFX0FERFIgICAgIDB4ODAwMSAgICAvKiB0eCBuZXRfYWRkciwgcnggbm9uZSAqLworI2lmIDAKKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9aT05FX01BU1RFUiAgIDB4ODAwMiAgICAvKiB0eCBub25lLCByeCBub25lICovCisjZW5kaWYKKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9SRU1PVEVfTU5HICAgIDB4ODAwMyAgICAvKiB0eCB1bnNpZ25lZCwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX01BWF9QT1JUUyAgICAgMHg4MDA0ICAgIC8qIHR4IHVuc2lnbmVkLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTUFYX1BVQkwgICAgICAweDgwMDUgICAgLyogdHggdW5zaWduZWQsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9NQVhfU1VCU0NSICAgIDB4ODAwNiAgICAvKiB0eCB1bnNpZ25lZCwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX01BWF9aT05FUyAgICAgMHg4MDA3ICAgIC8qIHR4IHVuc2lnbmVkLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTUFYX0NMVVNURVJTICAweDgwMDggICAgLyogdHggdW5zaWduZWQsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9NQVhfTk9ERVMgICAgIDB4ODAwOSAgICAvKiB0eCB1bnNpZ25lZCwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX01BWF9TTEFWRVMgICAgMHg4MDBBICAgIC8qIHR4IHVuc2lnbmVkLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTkVUSUQgICAgICAgICAweDgwMEIgICAgLyogdHggdW5zaWduZWQsIHJ4IG5vbmUgKi8KKworLyoKKyAqIFRMViB0eXBlcyBkZWZpbmVkIGZvciBUSVBDCisgKi8KKworI2RlZmluZSBUSVBDX1RMVl9OT05FCQkwCS8qIG5vIFRMViBwcmVzZW50ICovCisjZGVmaW5lIFRJUENfVExWX1ZPSUQJCTEJLyogZW1wdHkgVExWICgwIGRhdGEgYnl0ZXMpKi8KKyNkZWZpbmUgVElQQ19UTFZfVU5TSUdORUQJMgkvKiAzMi1iaXQgaW50ZWdlciAqLworI2RlZmluZSBUSVBDX1RMVl9TVFJJTkcJCTMJLyogY2hhclsxMjhdIChtYXgpICovCisjZGVmaW5lIFRJUENfVExWX0xBUkdFX1NUUklORwk0CS8qIGNoYXJbMjA0OF0gKG1heCkgKi8KKyNkZWZpbmUgVElQQ19UTFZfVUxUUkFfU1RSSU5HCTUJLyogY2hhclszMjc2OF0gKG1heCkgKi8KKworI2RlZmluZSBUSVBDX1RMVl9FUlJPUl9TVFJJTkcJMTYJLyogY2hhclsxMjhdIGNvbnRhaW5pbmcgImVycm9yIGNvZGUiICovCisjZGVmaW5lIFRJUENfVExWX05FVF9BRERSICAgCTE3CS8qIDMyLWJpdCBpbnRlZ2VyIGRlbm90aW5nIDxaLkMuTj4gKi8KKyNkZWZpbmUgVElQQ19UTFZfTUVESUFfTkFNRQkxOAkvKiBjaGFyW1RJUENfTUFYX01FRElBX05BTUVdICovCisjZGVmaW5lIFRJUENfVExWX0JFQVJFUl9OQU1FCTE5CS8qIGNoYXJbVElQQ19NQVhfQkVBUkVSX05BTUVdICovCisjZGVmaW5lIFRJUENfVExWX0xJTktfTkFNRQkyMAkvKiBjaGFyW1RJUENfTUFYX0xJTktfTkFNRV0gKi8KKyNkZWZpbmUgVElQQ19UTFZfTk9ERV9JTkZPCTIxCS8qIHN0cnVjdCB0aXBjX25vZGVfaW5mbyAqLworI2RlZmluZSBUSVBDX1RMVl9MSU5LX0lORk8JMjIJLyogc3RydWN0IHRpcGNfbGlua19pbmZvICovCisjZGVmaW5lIFRJUENfVExWX0JFQVJFUl9DT05GSUcgIDIzCS8qIHN0cnVjdCB0aXBjX2JlYXJlcl9jb25maWcgKi8KKyNkZWZpbmUgVElQQ19UTFZfTElOS19DT05GSUcgICAgMjQJLyogc3RydWN0IHRpcGNfbGlua19jb25maWcgKi8KKyNkZWZpbmUgVElQQ19UTFZfTkFNRV9UQkxfUVVFUlkJMjUJLyogc3RydWN0IHRpcGNfbmFtZV90YWJsZV9xdWVyeSAqLworI2RlZmluZSBUSVBDX1RMVl9QT1JUX1JFRiAgIAkyNgkvKiAzMi1iaXQgcG9ydCByZWZlcmVuY2UgKi8KKworLyoKKyAqIE1heGltdW0gc2l6ZXMgb2YgVElQQyBiZWFyZXItcmVsYXRlZCBuYW1lcyAoaW5jbHVkaW5nIHRlcm1pbmF0aW5nIE5VTCkKKyAqLyAKKworI2RlZmluZSBUSVBDX01BWF9NRURJQV9OQU1FCTE2CS8qIGZvcm1hdCA9IG1lZGlhICovCisjZGVmaW5lIFRJUENfTUFYX0lGX05BTUUJMTYJLyogZm9ybWF0ID0gaW50ZXJmYWNlICovCisjZGVmaW5lIFRJUENfTUFYX0JFQVJFUl9OQU1FCTMyCS8qIGZvcm1hdCA9IG1lZGlhOmludGVyZmFjZSAqLworI2RlZmluZSBUSVBDX01BWF9MSU5LX05BTUUJNjAJLyogZm9ybWF0ID0gWi5DLk46aW50ZXJmYWNlLVouQy5OOmludGVyZmFjZSAqLworCisvKgorICogTGluayBwcmlvcml0eSBsaW1pdHMgKG1pbiwgZGVmYXVsdCwgbWF4LCBtZWRpYSBkZWZhdWx0KQorICovCisKKyNkZWZpbmUgVElQQ19NSU5fTElOS19QUkkJMAorI2RlZmluZSBUSVBDX0RFRl9MSU5LX1BSSQkxMAorI2RlZmluZSBUSVBDX01BWF9MSU5LX1BSSQkzMQorI2RlZmluZSBUSVBDX01FRElBX0xJTktfUFJJCShUSVBDX01BWF9MSU5LX1BSSSArIDEpCisKKy8qCisgKiBMaW5rIHRvbGVyYW5jZSBsaW1pdHMgKG1pbiwgZGVmYXVsdCwgbWF4KSwgaW4gbXMKKyAqLworCisjZGVmaW5lIFRJUENfTUlOX0xJTktfVE9MIDUwCisjZGVmaW5lIFRJUENfREVGX0xJTktfVE9MIDE1MDAKKyNkZWZpbmUgVElQQ19NQVhfTElOS19UT0wgMzAwMDAKKworLyoKKyAqIExpbmsgd2luZG93IGxpbWl0cyAobWluLCBkZWZhdWx0LCBtYXgpLCBpbiBwYWNrZXRzCisgKi8KKworI2RlZmluZSBUSVBDX01JTl9MSU5LX1dJTiAxNgorI2RlZmluZSBUSVBDX0RFRl9MSU5LX1dJTiA1MAorI2RlZmluZSBUSVBDX01BWF9MSU5LX1dJTiAxNTAKKworCitzdHJ1Y3QgdGlwY19ub2RlX2luZm8geworCV9fdTMyIGFkZHI7CQkJLyogbmV0d29yayBhZGRyZXNzIG9mIG5vZGUgKi8KKwlfX3UzMiB1cDsJCQkvKiAwPWRvd24sIDE9IHVwICovCit9OworCitzdHJ1Y3QgdGlwY19saW5rX2luZm8geworCV9fdTMyIGRlc3Q7CQkJLyogbmV0d29yayBhZGRyZXNzIG9mIHBlZXIgbm9kZSAqLworCV9fdTMyIHVwOwkJCS8qIDA9ZG93biwgMT11cCAqLworCWNoYXIgc3RyW1RJUENfTUFYX0xJTktfTkFNRV07CS8qIGxpbmsgbmFtZSAqLworfTsKKworc3RydWN0IHRpcGNfYmVhcmVyX2NvbmZpZyB7CisJX191MzIgcHJpb3JpdHk7CQkJLyogUmFuZ2UgWzEsMzFdLiBPdmVycmlkZSBwZXIgbGluayAgKi8KKwlfX3UzMiBkZXRlY3Rfc2NvcGU7ICAgICAKKwljaGFyIG5hbWVbVElQQ19NQVhfQkVBUkVSX05BTUVdOworfTsKKworc3RydWN0IHRpcGNfbGlua19jb25maWcgeworCV9fdTMyIHZhbHVlOworCWNoYXIgbmFtZVtUSVBDX01BWF9MSU5LX05BTUVdOworfTsKKworI2RlZmluZSBUSVBDX05UUV9BTExUWVBFUyAweDgwMDAwMDAwCisKK3N0cnVjdCB0aXBjX25hbWVfdGFibGVfcXVlcnkgeworCV9fdTMyIGRlcHRoOwkvKiAxOnR5cGUsIDI6K25hbWUgaW5mbywgMzorcG9ydCBpbmZvLCA0KzorZGVidWcgaW5mbyAqLworCV9fdTMyIHR5cGU7CS8qIHt0LGwsdX0gaW5mbyBpZ25vcmVkIGlmIGhpZ2ggYml0IG9mICJkZXB0aCIgaXMgc2V0ICovCisJX191MzIgbG93Ym91bmQ7IC8qIChpLmUuIGRpc3BsYXlzIGFsbCBlbnRyaWVzIG9mIG5hbWUgdGFibGUpICovCisJX191MzIgdXBib3VuZDsKK307CisKKy8qCisgKiBUaGUgZXJyb3Igc3RyaW5nIFRMViBpcyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgY2F1c2UgCisgKiBvZiB0aGUgcmVxdWVzdCBmYWlsdXJlLiAgVG8gc2ltcGxpZnkgZXJyb3IgcHJvY2Vzc2luZyAoYW5kIHRvIHNhdmUgc3BhY2UpCisgKiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgY2FuIGJlIGEgc3BlY2lhbCBlcnJvciBjb2RlIGNoYXJhY3RlcgorICogKGx5aW5nIGJ5IHRoZSByYW5nZSAweDgwIHRvIDB4RkYpIHdoaWNoIHJlcHJlc2VudHMgYSBwcmUtZGVmaW5lZCByZWFzb24uCisgKi8KKworI2RlZmluZSBUSVBDX0NGR19UTFZfRVJST1IgICAgICAiXHg4MCIgIC8qIHJlcXVlc3QgY29udGFpbnMgaW5jb3JyZWN0IFRMVihzKSAqLworI2RlZmluZSBUSVBDX0NGR19OT1RfTkVUX0FETUlOICAiXHg4MSIJLyogbXVzdCBiZSBuZXR3b3JrIGFkbWluaXN0cmF0b3IgKi8KKyNkZWZpbmUgVElQQ19DRkdfTk9UX1pPTkVfTVNUUgkiXHg4MiIJLyogbXVzdCBiZSB6b25lIG1hc3RlciAqLworI2RlZmluZSBUSVBDX0NGR19OT19SRU1PVEUJIlx4ODMiCS8qIHJlbW90ZSBtYW5hZ2VtZW50IG5vdCBlbmFibGVkICovCisjZGVmaW5lIFRJUENfQ0ZHX05PVF9TVVBQT1JURUQgICJceDg0IgkvKiByZXF1ZXN0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgVElQQyAqLworI2RlZmluZSBUSVBDX0NGR19JTlZBTElEX1ZBTFVFICAiXHg4NSIgIC8qIHJlcXVlc3QgaGFzIGludmFsaWQgYXJndW1lbnQgdmFsdWUgKi8KKworI2lmIDAKKy8qIHByb3RvdHlwZXMgVExWIHN0cnVjdHVyZXMgZm9yIHByb3Bvc2VkIGNvbW1hbmRzICovCitzdHJ1Y3QgdGlwY19saW5rX2NyZWF0ZSB7CisJX191MzIgICBkb21haW47CisJc3RydWN0IHRpcGNfbWVkaWFfYWRkciBwZWVyX2FkZHI7CisJY2hhciBiZWFyZXJfbmFtZVtUSVBDX01BWF9CRUFSRVJfTkFNRV07Cit9OworCitzdHJ1Y3QgdGlwY19yb3V0ZV9pbmZvIHsKKwlfX3UzMiBkZXN0OworCV9fdTMyIHJvdXRlcjsKK307CisjZW5kaWYKKworLyoKKyAqIEEgVExWIGNvbnNpc3RzIG9mIGEgZGVzY3JpcHRvciwgZm9sbG93ZWQgYnkgdGhlIFRMViB2YWx1ZS4KKyAqIFRMViBkZXNjcmlwdG9yIGZpZWxkcyBhcmUgc3RvcmVkIGluIG5ldHdvcmsgYnl0ZSBvcmRlcjsgCisgKiBUTFYgdmFsdWVzIG11c3QgYWxzbyBiZSBzdG9yZWQgaW4gbmV0d29yayBieXRlIG9yZGVyICh3aGVyZSBhcHBsaWNhYmxlKS4KKyAqIFRMViBkZXNjcmlwdG9ycyBtdXN0IGJlIGFsaWduZWQgdG8gYWRkcmVzc2VzIHdoaWNoIGFyZSBtdWx0aXBsZSBvZiA0LAorICogc28gdXAgdG8gMyBieXRlcyBvZiBwYWRkaW5nIG1heSBleGlzdCBhdCB0aGUgZW5kIG9mIHRoZSBUTFYgdmFsdWUgYXJlYS4KKyAqIFRoZXJlIG11c3Qgbm90IGJlIGFueSBwYWRkaW5nIGJldHdlZW4gdGhlIFRMViBkZXNjcmlwdG9yIGFuZCBpdHMgdmFsdWUuCisgKi8KKworc3RydWN0IHRsdl9kZXNjIHsKKwlfX3UxNiB0bHZfbGVuOwkJLyogVExWIGxlbmd0aCAoZGVzY3JpcHRvciArIHZhbHVlKSAqLworCV9fdTE2IHRsdl90eXBlOwkJLyogVExWIGlkZW50aWZpZXIgKi8KK307CisKKyNkZWZpbmUgVExWX0FMSUdOVE8gNAorCisjZGVmaW5lIFRMVl9BTElHTihkYXRhbGVuKSAoKChkYXRhbGVuKSsoVExWX0FMSUdOVE8tMSkpICYgfihUTFZfQUxJR05UTy0xKSkKKyNkZWZpbmUgVExWX0xFTkdUSChkYXRhbGVuKSAoc2l6ZW9mKHN0cnVjdCB0bHZfZGVzYykgKyAoZGF0YWxlbikpCisjZGVmaW5lIFRMVl9TUEFDRShkYXRhbGVuKSAoVExWX0FMSUdOKFRMVl9MRU5HVEgoZGF0YWxlbikpKQorI2RlZmluZSBUTFZfREFUQSh0bHYpICgodm9pZCAqKSgoY2hhciAqKSh0bHYpICsgVExWX0xFTkdUSCgwKSkpCisKK3N0YXRpYyBpbmxpbmUgaW50IFRMVl9PSyhjb25zdCB2b2lkICp0bHYsIF9fdTE2IHNwYWNlKQoreworCS8qCisJICogV291bGQgYWxzbyBsaWtlIHRvIGNoZWNrIHRoYXQgInRsdiIgaXMgYSBtdWx0aXBsZSBvZiA0LAorCSAqIGJ1dCBkb24ndCBrbm93IGhvdyB0byBkbyB0aGlzIGluIGEgcG9ydGFibGUgd2F5LgorCSAqIC0gVHJpZWQgZG9pbmcgKCEodGx2ICYgKFRMVl9BTElHTlRPLTEpKSksIGJ1dCBHQ0MgY29tcGlsZXIKKwkgKiAgIHdvbid0IGFsbG93IGJpbmFyeSAiJiIgd2l0aCBhIHBvaW50ZXIuCisJICogLSBUcmllZCBjYXN0aW5nICJ0bHYiIHRvIGludGVnZXIgdHlwZSwgYnV0IGNhdXNlcyB3YXJuaW5nIGFib3V0IHNpemUKKwkgKiAgIG1pc21hdGNoIHdoZW4gcG9pbnRlciBpcyBiaWdnZXIgdGhhbiBjaG9zZW4gdHlwZSAoaW50LCBsb25nLCAuLi4pLgorCSAqLworCisJcmV0dXJuIChzcGFjZSA+PSBUTFZfU1BBQ0UoMCkpICYmCisJCShudG9ocygoKHN0cnVjdCB0bHZfZGVzYyAqKXRsdiktPnRsdl9sZW4pIDw9IHNwYWNlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgVExWX0NIRUNLKGNvbnN0IHZvaWQgKnRsdiwgX191MTYgc3BhY2UsIF9fdTE2IGV4cF90eXBlKQoreworCXJldHVybiBUTFZfT0sodGx2LCBzcGFjZSkgJiYgCisJCShudG9ocygoKHN0cnVjdCB0bHZfZGVzYyAqKXRsdiktPnRsdl90eXBlKSA9PSBleHBfdHlwZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IFRMVl9TRVQodm9pZCAqdGx2LCBfX3UxNiB0eXBlLCB2b2lkICpkYXRhLCBfX3UxNiBsZW4pCit7CisJc3RydWN0IHRsdl9kZXNjICp0bHZfcHRyOworCWludCB0bHZfbGVuOworCisJdGx2X2xlbiA9IFRMVl9MRU5HVEgobGVuKTsKKwl0bHZfcHRyID0gKHN0cnVjdCB0bHZfZGVzYyAqKXRsdjsKKwl0bHZfcHRyLT50bHZfdHlwZSA9IGh0b25zKHR5cGUpOworCXRsdl9wdHItPnRsdl9sZW4gID0gaHRvbnModGx2X2xlbik7CisJaWYgKGxlbiAmJiBkYXRhKQorCQltZW1jcHkoVExWX0RBVEEodGx2X3B0ciksIGRhdGEsIHRsdl9sZW4pOworCXJldHVybiBUTFZfU1BBQ0UobGVuKTsKK30KKworLyoKKyAqIEEgVExWIGxpc3QgZGVzY3JpcHRvciBzaW1wbGlmaWVzIHByb2Nlc3Npbmcgb2YgbWVzc2FnZXMgCisgKiBjb250YWluaW5nIG11bHRpcGxlIFRMVnMuCisgKi8KKworc3RydWN0IHRsdl9saXN0X2Rlc2MgeworCXN0cnVjdCB0bHZfZGVzYyAqdGx2X3B0cjsJLyogcHRyIHRvIGN1cnJlbnQgVExWICovCisJX191MzIgdGx2X3NwYWNlOwkJLyogIyBieXRlcyBmcm9tIGN1cnIgVExWIHRvIGxpc3QgZW5kICovCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgVExWX0xJU1RfSU5JVChzdHJ1Y3QgdGx2X2xpc3RfZGVzYyAqbGlzdCwgCisJCQkJIHZvaWQgKmRhdGEsIF9fdTMyIHNwYWNlKQoreworCWxpc3QtPnRsdl9wdHIgPSAoc3RydWN0IHRsdl9kZXNjICopZGF0YTsKKwlsaXN0LT50bHZfc3BhY2UgPSBzcGFjZTsKK30KKwkgICAgIAorc3RhdGljIGlubGluZSBpbnQgVExWX0xJU1RfRU1QVFkoc3RydWN0IHRsdl9saXN0X2Rlc2MgKmxpc3QpCit7IAorCXJldHVybiAobGlzdC0+dGx2X3NwYWNlID09IDApOworfQorCitzdGF0aWMgaW5saW5lIGludCBUTFZfTElTVF9DSEVDSyhzdHJ1Y3QgdGx2X2xpc3RfZGVzYyAqbGlzdCwgX191MTYgZXhwX3R5cGUpCit7CisJcmV0dXJuIFRMVl9DSEVDSyhsaXN0LT50bHZfcHRyLCBsaXN0LT50bHZfc3BhY2UsIGV4cF90eXBlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpUTFZfTElTVF9EQVRBKHN0cnVjdCB0bHZfbGlzdF9kZXNjICpsaXN0KQoreworCXJldHVybiBUTFZfREFUQShsaXN0LT50bHZfcHRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIFRMVl9MSVNUX1NURVAoc3RydWN0IHRsdl9saXN0X2Rlc2MgKmxpc3QpCit7CisJX191MTYgdGx2X3NwYWNlID0gVExWX0FMSUdOKG50b2hzKGxpc3QtPnRsdl9wdHItPnRsdl9sZW4pKTsKKworICAgICAgICBsaXN0LT50bHZfcHRyID0gKHN0cnVjdCB0bHZfZGVzYyAqKSgoY2hhciAqKWxpc3QtPnRsdl9wdHIgKyB0bHZfc3BhY2UpOworCWxpc3QtPnRsdl9zcGFjZSAtPSB0bHZfc3BhY2U7Cit9CisKKy8qCisgKiBDb25maWd1cmF0aW9uIG1lc3NhZ2VzIGV4Y2hhbmdlZCB2aWEgTkVUTElOS19HRU5FUklDIHVzZSB0aGUgZm9sbG93aW5nCisgKiBmYW1pbHkgaWQsIG5hbWUsIHZlcnNpb24gYW5kIGNvbW1hbmQuCisgKi8KKyNkZWZpbmUgVElQQ19HRU5MX05BTUUJCSJUSVBDIgorI2RlZmluZSBUSVBDX0dFTkxfVkVSU0lPTgkweDEKKyNkZWZpbmUgVElQQ19HRU5MX0NNRAkJMHgxCisKKy8qCisgKiBUSVBDIHNwZWNpZmljIGhlYWRlciB1c2VkIGluIE5FVExJTktfR0VORVJJQyByZXF1ZXN0cy4KKyAqLworc3RydWN0IHRpcGNfZ2VubG1zZ2hkciB7CisJX191MzIgZGVzdDsJCS8qIERlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlfX3UxNiBjbWQ7CQkvKiBDb21tYW5kICovCisJX191MTYgcmVzZXJ2ZWQ7CQkvKiBVbnVzZWQgKi8KK307CisKKyNkZWZpbmUgVElQQ19HRU5MX0hEUkxFTglOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IHRpcGNfZ2VubG1zZ2hkcikpCisKKy8qCisgKiBDb25maWd1cmF0aW9uIG1lc3NhZ2VzIGV4Y2hhbmdlZCB2aWEgVElQQyBzb2NrZXRzIHVzZSB0aGUgVElQQyBjb25maWd1cmF0aW9uIAorICogbWVzc2FnZSBoZWFkZXIsIHdoaWNoIGlzIGRlZmluZWQgYmVsb3cuICBUaGlzIHN0cnVjdHVyZSBpcyBhbmFsb2dvdXMgCisgKiB0byB0aGUgTmV0bGluayBtZXNzYWdlIGhlYWRlciwgYnV0IGZpZWxkcyBhcmUgc3RvcmVkIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAKKyAqIGFuZCBubyBwYWRkaW5nIGlzIHBlcm1pdHRlZCBiZXR3ZWVuIHRoZSBoZWFkZXIgYW5kIHRoZSBtZXNzYWdlIGRhdGEgCisgKiB0aGF0IGZvbGxvd3MuCisgKi8KKworc3RydWN0IHRpcGNfY2ZnX21zZ19oZHIKK3sKKwlfX3UzMiB0Y21fbGVuOwkJLyogTWVzc2FnZSBsZW5ndGggKGluY2x1ZGluZyBoZWFkZXIpICovCisJX191MTYgdGNtX3R5cGU7CQkvKiBDb21tYW5kIHR5cGUgKi8KKwlfX3UxNiB0Y21fZmxhZ3M7CS8qIEFkZGl0aW9uYWwgZmxhZ3MgKi8KKwljaGFyICB0Y21fcmVzZXJ2ZWRbOF07CS8qIFVudXNlZCAqLworfTsKKworI2RlZmluZSBUQ01fRl9SRVFVRVNUCTB4MQkvKiBGbGFnOiBSZXF1ZXN0IG1lc3NhZ2UgKi8KKyNkZWZpbmUgVENNX0ZfTU9SRQkweDIJLyogRmxhZzogTWVzc2FnZSB0byBiZSBjb250aW51ZWQgKi8KKworI2RlZmluZSBUQ01fQUxJR04oZGF0YWxlbikgICgoKGRhdGFsZW4pKzMpICYgfjMpCisjZGVmaW5lIFRDTV9MRU5HVEgoZGF0YWxlbikgKHNpemVvZihzdHJ1Y3QgdGlwY19jZmdfbXNnX2hkcikgKyBkYXRhbGVuKQorI2RlZmluZSBUQ01fU1BBQ0UoZGF0YWxlbikgIChUQ01fQUxJR04oVENNX0xFTkdUSChkYXRhbGVuKSkpCisjZGVmaW5lIFRDTV9EQVRBKHRjbV9oZHIpICAgKCh2b2lkICopKChjaGFyICopKHRjbV9oZHIpICsgVENNX0xFTkdUSCgwKSkpCisKK3N0YXRpYyBpbmxpbmUgaW50IFRDTV9TRVQodm9pZCAqbXNnLCBfX3UxNiBjbWQsIF9fdTE2IGZsYWdzLAorCQkJICB2b2lkICpkYXRhLCBfX3UxNiBkYXRhX2xlbikKK3sKKwlzdHJ1Y3QgdGlwY19jZmdfbXNnX2hkciAqdGNtX2hkcjsKKwlpbnQgbXNnX2xlbjsKKworCW1zZ19sZW4gPSBUQ01fTEVOR1RIKGRhdGFfbGVuKTsKKwl0Y21faGRyID0gKHN0cnVjdCB0aXBjX2NmZ19tc2dfaGRyICopbXNnOworCXRjbV9oZHItPnRjbV9sZW4gICA9IGh0b25sKG1zZ19sZW4pOworCXRjbV9oZHItPnRjbV90eXBlICA9IGh0b25zKGNtZCk7CisJdGNtX2hkci0+dGNtX2ZsYWdzID0gaHRvbnMoZmxhZ3MpOworCWlmIChkYXRhX2xlbiAmJiBkYXRhKQorCQltZW1jcHkoVENNX0RBVEEobXNnKSwgZGF0YSwgZGF0YV9sZW4pOworCXJldHVybiBUQ01fU1BBQ0UoZGF0YV9sZW4pOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdG9wb2xvZ3kuaCBiL2luY2x1ZGUvbGludXgvdG9wb2xvZ3kuaAppbmRleCAzZGYxZDQ3Li5lOGViMDA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RvcG9sb2d5LmgKKysrIGIvaW5jbHVkZS9saW51eC90b3BvbG9neS5oCkBAIC01Niw2ICs1NiwxNCBAQAogI2RlZmluZSBSRU1PVEVfRElTVEFOQ0UJCTIwCiAjZGVmaW5lIG5vZGVfZGlzdGFuY2UoZnJvbSx0bykJKChmcm9tKSA9PSAodG8pID8gTE9DQUxfRElTVEFOQ0UgOiBSRU1PVEVfRElTVEFOQ0UpCiAjZW5kaWYKKyNpZm5kZWYgUkVDTEFJTV9ESVNUQU5DRQorLyoKKyAqIElmIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIG5vZGVzIGluIGEgc3lzdGVtIGlzIGxhcmdlciB0aGFuIFJFQ0xBSU1fRElTVEFOQ0UKKyAqIChpbiB3aGF0ZXZlciBhcmNoIHNwZWNpZmljIG1lYXN1cmVtZW50IHVuaXRzIHJldHVybmVkIGJ5IG5vZGVfZGlzdGFuY2UoKSkKKyAqIHRoZW4gc3dpdGNoIG9uIHpvbmUgcmVjbGFpbSBvbiBib290LgorICovCisjZGVmaW5lIFJFQ0xBSU1fRElTVEFOQ0UgMjAKKyNlbmRpZgogI2lmbmRlZiBQRU5BTFRZX0ZPUl9OT0RFX1dJVEhfQ1BVUwogI2RlZmluZSBQRU5BTFRZX0ZPUl9OT0RFX1dJVEhfQ1BVUwkoMSkKICNlbmRpZgpAQCAtODYsNyArOTQsNiBAQAogCS5tYXhfaW50ZXJ2YWwJCT0gMiwJCQlcCiAJLmJ1c3lfZmFjdG9yCQk9IDgsCQkJXAogCS5pbWJhbGFuY2VfcGN0CQk9IDExMCwJCQlcCi0JLmNhY2hlX2hvdF90aW1lCQk9IDAsCQkJXAogCS5jYWNoZV9uaWNlX3RyaWVzCT0gMCwJCQlcCiAJLnBlcl9jcHVfZ2FpbgkJPSAyNSwJCQlcCiAJLmJ1c3lfaWR4CQk9IDAsCQkJXApAQCAtMTE3LDcgKzEyNCw2IEBACiAJLm1heF9pbnRlcnZhbAkJPSA0LAkJCVwKIAkuYnVzeV9mYWN0b3IJCT0gNjQsCQkJXAogCS5pbWJhbGFuY2VfcGN0CQk9IDEyNSwJCQlcCi0JLmNhY2hlX2hvdF90aW1lCQk9ICg1KjEwMDAwMDAvMiksCVwKIAkuY2FjaGVfbmljZV90cmllcwk9IDEsCQkJXAogCS5wZXJfY3B1X2dhaW4JCT0gMTAwLAkJCVwKIAkuYnVzeV9pZHgJCT0gMiwJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3R0eS5oIGIvaW5jbHVkZS9saW51eC90dHkuaAppbmRleCAxMjY3Zjg4Li4zNzg3MTAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3R0eS5oCisrKyBiL2luY2x1ZGUvbGludXgvdHR5LmgKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC90dHlfZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5X2xkaXNjLmg+CisjaW5jbHVkZSA8bGludXgvc2NyZWVuX2luZm8uaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIApAQCAtMzcsNzcgKzM4LDYgQEAKICNkZWZpbmUgTlJfTERJU0NTCQkxNgogCiAvKgotICogVGhlc2UgYXJlIHNldCB1cCBieSB0aGUgc2V0dXAtcm91dGluZSBhdCBib290LXRpbWU6Ci0gKi8KLQotc3RydWN0IHNjcmVlbl9pbmZvIHsKLQl1OCAgb3JpZ194OwkJLyogMHgwMCAqLwotCXU4ICBvcmlnX3k7CQkvKiAweDAxICovCi0JdTE2IGRvbnR1c2UxOwkJLyogMHgwMiAtLSBFWFRfTUVNX0sgc2l0cyBoZXJlICovCi0JdTE2IG9yaWdfdmlkZW9fcGFnZTsJLyogMHgwNCAqLwotCXU4ICBvcmlnX3ZpZGVvX21vZGU7CS8qIDB4MDYgKi8KLQl1OCAgb3JpZ192aWRlb19jb2xzOwkvKiAweDA3ICovCi0JdTE2IHVudXNlZDI7CQkvKiAweDA4ICovCi0JdTE2IG9yaWdfdmlkZW9fZWdhX2J4OwkvKiAweDBhICovCi0JdTE2IHVudXNlZDM7CQkvKiAweDBjICovCi0JdTggIG9yaWdfdmlkZW9fbGluZXM7CS8qIDB4MGUgKi8KLQl1OCAgb3JpZ192aWRlb19pc1ZHQTsJLyogMHgwZiAqLwotCXUxNiBvcmlnX3ZpZGVvX3BvaW50czsJLyogMHgxMCAqLwotCi0JLyogVkVTQSBncmFwaGljIG1vZGUgLS0gbGluZWFyIGZyYW1lIGJ1ZmZlciAqLwotCXUxNiBsZmJfd2lkdGg7CQkvKiAweDEyICovCi0JdTE2IGxmYl9oZWlnaHQ7CQkvKiAweDE0ICovCi0JdTE2IGxmYl9kZXB0aDsJCS8qIDB4MTYgKi8KLQl1MzIgbGZiX2Jhc2U7CQkvKiAweDE4ICovCi0JdTMyIGxmYl9zaXplOwkJLyogMHgxYyAqLwotCXUxNiBkb250dXNlMiwgZG9udHVzZTM7CS8qIDB4MjAgLS0gQ0xfTUFHSUMgYW5kIENMX09GRlNFVCBoZXJlICovCi0JdTE2IGxmYl9saW5lbGVuZ3RoOwkvKiAweDI0ICovCi0JdTggIHJlZF9zaXplOwkJLyogMHgyNiAqLwotCXU4ICByZWRfcG9zOwkJLyogMHgyNyAqLwotCXU4ICBncmVlbl9zaXplOwkJLyogMHgyOCAqLwotCXU4ICBncmVlbl9wb3M7CQkvKiAweDI5ICovCi0JdTggIGJsdWVfc2l6ZTsJCS8qIDB4MmEgKi8KLQl1OCAgYmx1ZV9wb3M7CQkvKiAweDJiICovCi0JdTggIHJzdmRfc2l6ZTsJCS8qIDB4MmMgKi8KLQl1OCAgcnN2ZF9wb3M7CQkvKiAweDJkICovCi0JdTE2IHZlc2FwbV9zZWc7CQkvKiAweDJlICovCi0JdTE2IHZlc2FwbV9vZmY7CQkvKiAweDMwICovCi0JdTE2IHBhZ2VzOwkJLyogMHgzMiAqLwotCXUxNiB2ZXNhX2F0dHJpYnV0ZXM7CS8qIDB4MzQgKi8KLQl1MzIgIGNhcGFiaWxpdGllczsgICAgICAvKiAweDM2ICovCi0JCQkJLyogMHgzYSAtLSAweDNmIHJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCi19OwotCi1leHRlcm4gc3RydWN0IHNjcmVlbl9pbmZvIHNjcmVlbl9pbmZvOwotCi0jZGVmaW5lIE9SSUdfWAkJCShzY3JlZW5faW5mby5vcmlnX3gpCi0jZGVmaW5lIE9SSUdfWQkJCShzY3JlZW5faW5mby5vcmlnX3kpCi0jZGVmaW5lIE9SSUdfVklERU9fTU9ERQkJKHNjcmVlbl9pbmZvLm9yaWdfdmlkZW9fbW9kZSkKLSNkZWZpbmUgT1JJR19WSURFT19DT0xTIAkoc2NyZWVuX2luZm8ub3JpZ192aWRlb19jb2xzKQotI2RlZmluZSBPUklHX1ZJREVPX0VHQV9CWAkoc2NyZWVuX2luZm8ub3JpZ192aWRlb19lZ2FfYngpCi0jZGVmaW5lIE9SSUdfVklERU9fTElORVMJKHNjcmVlbl9pbmZvLm9yaWdfdmlkZW9fbGluZXMpCi0jZGVmaW5lIE9SSUdfVklERU9fSVNWR0EJKHNjcmVlbl9pbmZvLm9yaWdfdmlkZW9faXNWR0EpCi0jZGVmaW5lIE9SSUdfVklERU9fUE9JTlRTICAgICAgIChzY3JlZW5faW5mby5vcmlnX3ZpZGVvX3BvaW50cykKLQotI2RlZmluZSBWSURFT19UWVBFX01EQQkJMHgxMAkvKiBNb25vY2hyb21lIFRleHQgRGlzcGxheQkqLwotI2RlZmluZSBWSURFT19UWVBFX0NHQQkJMHgxMQkvKiBDR0EgRGlzcGxheSAJCQkqLwotI2RlZmluZSBWSURFT19UWVBFX0VHQU0JCTB4MjAJLyogRUdBL1ZHQSBpbiBNb25vY2hyb21lIE1vZGUJKi8KLSNkZWZpbmUgVklERU9fVFlQRV9FR0FDCQkweDIxCS8qIEVHQSBpbiBDb2xvciBNb2RlCQkqLwotI2RlZmluZSBWSURFT19UWVBFX1ZHQUMJCTB4MjIJLyogVkdBKyBpbiBDb2xvciBNb2RlCQkqLwotI2RlZmluZSBWSURFT19UWVBFX1ZMRkIJCTB4MjMJLyogVkVTQSBWR0EgaW4gZ3JhcGhpYyBtb2RlCSovCi0KLSNkZWZpbmUgVklERU9fVFlQRV9QSUNBX1MzCTB4MzAJLyogQUNFUiBQSUNBLTYxIGxvY2FsIFMzIHZpZGVvCSovCi0jZGVmaW5lIFZJREVPX1RZUEVfTUlQU19HMzY0CTB4MzEgICAgLyogTUlQUyBNYWdudW0gNDAwMCBHMzY0IHZpZGVvICAqLwotI2RlZmluZSBWSURFT19UWVBFX1NHSSAgICAgICAgICAweDMzICAgIC8qIFZhcmlvdXMgU0dJIGdyYXBoaWNzIGhhcmR3YXJlICovCi0KLSNkZWZpbmUgVklERU9fVFlQRV9UR0FDCQkweDQwCS8qIERFQyBUR0EgKi8KLQotI2RlZmluZSBWSURFT19UWVBFX1NVTiAgICAgICAgICAweDUwICAgIC8qIFN1biBmcmFtZSBidWZmZXIuICovCi0jZGVmaW5lIFZJREVPX1RZUEVfU1VOUENJICAgICAgIDB4NTEgICAgLyogU3VuIFBDSSBiYXNlZCBmcmFtZSBidWZmZXIuICovCi0KLSNkZWZpbmUgVklERU9fVFlQRV9QTUFDCQkweDYwCS8qIFBvd2VyTWFjaW50b3NoIGZyYW1lIGJ1ZmZlci4gKi8KLQotLyoKICAqIFRoaXMgY2hhcmFjdGVyIGlzIHRoZSBzYW1lIGFzIF9QT1NJWF9WRElTQUJMRTogaXQgY2Fubm90IGJlIHVzZWQgYXMKICAqIGEgY19jY1tdIGNoYXJhY3RlciwgYnV0IGluZGljYXRlcyB0aGF0IGEgcGFydGljdWxhciBzcGVjaWFsIGNoYXJhY3RlcgogICogaXNuJ3QgaW4gdXNlIChlZyBWSU5UUiBoYXMgbm8gY2hhcmFjdGVyIGV0YykKQEAgLTEyMSwxNiArNTEsMjIgQEAKICAqLwogI2RlZmluZSBUVFlfRkxJUEJVRl9TSVpFIDUxMgogCi1zdHJ1Y3QgdHR5X2ZsaXBfYnVmZmVyIHsKK3N0cnVjdCB0dHlfYnVmZmVyIHsKKwlzdHJ1Y3QgdHR5X2J1ZmZlciAqbmV4dDsKKwljaGFyICpjaGFyX2J1Zl9wdHI7CisJdW5zaWduZWQgY2hhciAqZmxhZ19idWZfcHRyOworCWludCB1c2VkOworCWludCBzaXplOworCS8qIERhdGEgcG9pbnRzIGhlcmUgKi8KKwl1bnNpZ25lZCBsb25nIGRhdGFbMF07Cit9OworCitzdHJ1Y3QgdHR5X2J1ZmhlYWQgewogCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29yazsKIAlzdHJ1Y3Qgc2VtYXBob3JlIHB0eV9zZW07Ci0JY2hhcgkJKmNoYXJfYnVmX3B0cjsKLQl1bnNpZ25lZCBjaGFyCSpmbGFnX2J1Zl9wdHI7Ci0JaW50CQljb3VudDsKLQlpbnQJCWJ1Zl9udW07Ci0JdW5zaWduZWQgY2hhcgljaGFyX2J1ZlsyKlRUWV9GTElQQlVGX1NJWkVdOwotCWNoYXIJCWZsYWdfYnVmWzIqVFRZX0ZMSVBCVUZfU0laRV07Ci0JdW5zaWduZWQgY2hhcglzbG9wWzRdOyAvKiBOLkIuIGJ1ZyBvdmVyd3JpdGVzIGJ1ZmZlciBieSAxICovCisJc3RydWN0IHR0eV9idWZmZXIgKmhlYWQ7CS8qIFF1ZXVlIGhlYWQgKi8KKwlzdHJ1Y3QgdHR5X2J1ZmZlciAqdGFpbDsJLyogQWN0aXZlIGJ1ZmZlciAqLworCXN0cnVjdCB0dHlfYnVmZmVyICpmcmVlOwkvKiBGcmVlIHF1ZXVlIGhlYWQgKi8KIH07CiAvKgogICogVGhlIHB0eSB1c2VzIGNoYXJfYnVmIGFuZCBmbGFnX2J1ZiBhcyBhIGNvbnRpZ3VvdXMgYnVmZmVyCkBAIC0yNTYsMTAgKzE5MiwxMSBAQAogCXVuc2lnbmVkIGNoYXIgc3RvcHBlZDoxLCBod19zdG9wcGVkOjEsIGZsb3dfc3RvcHBlZDoxLCBwYWNrZXQ6MTsKIAl1bnNpZ25lZCBjaGFyIGxvd19sYXRlbmN5OjEsIHdhcm5lZDoxOwogCXVuc2lnbmVkIGNoYXIgY3RybF9zdGF0dXM7CisJdW5zaWduZWQgaW50IHJlY2VpdmVfcm9vbTsJLyogQnl0ZXMgZnJlZSBmb3IgcXVldWUgKi8KIAogCXN0cnVjdCB0dHlfc3RydWN0ICpsaW5rOwogCXN0cnVjdCBmYXN5bmNfc3RydWN0ICpmYXN5bmM7Ci0Jc3RydWN0IHR0eV9mbGlwX2J1ZmZlciBmbGlwOworCXN0cnVjdCB0dHlfYnVmaGVhZCBidWY7CiAJaW50IG1heF9mbGlwX2NudDsKIAlpbnQgYWx0X3NwZWVkOwkJLyogRm9yIG1hZ2ljIHN1YnN0aXR1dGlvbiBvZiAzODQwMCBicHMgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCB3cml0ZV93YWl0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90dHlfZmxpcC5oIGIvaW5jbHVkZS9saW51eC90dHlfZmxpcC5oCmluZGV4IGFiZTliZmMuLmJlMTQwMGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdHR5X2ZsaXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3R0eV9mbGlwLmgKQEAgLTEsMjUgKzEsMzMgQEAKICNpZm5kZWYgX0xJTlVYX1RUWV9GTElQX0gKICNkZWZpbmUgX0xJTlVYX1RUWV9GTElQX0gKIAorZXh0ZXJuIGludCB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzaXplX3Qgc2l6ZSk7CitleHRlcm4gaW50IHR0eV9pbnNlcnRfZmxpcF9zdHJpbmcoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciAqY2hhcnMsIHNpemVfdCBzaXplKTsKK2V4dGVybiBpbnQgdHR5X2luc2VydF9mbGlwX3N0cmluZ19mbGFncyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyICpjaGFycywgY2hhciAqZmxhZ3MsIHNpemVfdCBzaXplKTsKK2V4dGVybiBpbnQgdHR5X3ByZXBhcmVfZmxpcF9zdHJpbmcoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciAqKmNoYXJzLCBzaXplX3Qgc2l6ZSk7CitleHRlcm4gaW50IHR0eV9wcmVwYXJlX2ZsaXBfc3RyaW5nX2ZsYWdzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgKipjaGFycywgY2hhciAqKmZsYWdzLCBzaXplX3Qgc2l6ZSk7CisKICNpZmRlZiBJTkNMVURFX0lOTElORV9GVU5DUwogI2RlZmluZSBfSU5MSU5FXyBleHRlcm4KICNlbHNlCiAjZGVmaW5lIF9JTkxJTkVfIHN0YXRpYyBfX2lubGluZV9fCiAjZW5kaWYKIAotX0lOTElORV8gdm9pZCB0dHlfaW5zZXJ0X2ZsaXBfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorX0lOTElORV8gaW50IHR0eV9pbnNlcnRfZmxpcF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCiAJCQkJICAgdW5zaWduZWQgY2hhciBjaCwgY2hhciBmbGFnKQogewotCWlmICh0dHktPmZsaXAuY291bnQgPCBUVFlfRkxJUEJVRl9TSVpFKSB7Ci0JCXR0eS0+ZmxpcC5jb3VudCsrOwotCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrID0gZmxhZzsKLQkJKnR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKyA9IGNoOworCXN0cnVjdCB0dHlfYnVmZmVyICp0YiA9IHR0eS0+YnVmLnRhaWw7CisJaWYgKHRiICYmIHRiLT51c2VkIDwgdGItPnNpemUpIHsKKwkJdGItPmZsYWdfYnVmX3B0clt0Yi0+dXNlZF0gPSBmbGFnOworCQl0Yi0+Y2hhcl9idWZfcHRyW3RiLT51c2VkKytdID0gY2g7CisJCXJldHVybiAxOwogCX0KKwlyZXR1cm4gdHR5X2luc2VydF9mbGlwX3N0cmluZ19mbGFncyh0dHksICZjaCwgJmZsYWcsIDEpOwogfQogCiBfSU5MSU5FXyB2b2lkIHR0eV9zY2hlZHVsZV9mbGlwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmZsaXAud29yaywgMSk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmJ1Zi53b3JrLCAxKTsKIH0KIAogI3VuZGVmIF9JTkxJTkVfCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3R0eV9sZGlzYy5oIGIvaW5jbHVkZS9saW51eC90dHlfbGRpc2MuaAppbmRleCA2MDY2YWZkLi44M2M2ZTZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3R0eV9sZGlzYy5oCisrKyBiL2luY2x1ZGUvbGludXgvdHR5X2xkaXNjLmgKQEAgLTgxLDE0ICs4MSw2IEBACiAgKiAJcG9pbnRlciBvZiBmbGFnIGJ5dGVzIHdoaWNoIGluZGljYXRlIHdoZXRoZXIgYSBjaGFyYWN0ZXIgd2FzCiAgKiAJcmVjZWl2ZWQgd2l0aCBhIHBhcml0eSBlcnJvciwgZXRjLgogICogCi0gKiBpbnQJKCpyZWNlaXZlX3Jvb20pKHN0cnVjdCB0dHlfc3RydWN0ICopOwotICoKLSAqIAlUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgbG93LWxldmVsIHR0eSBkcml2ZXIgdG8KLSAqIAlkZXRlcm1pbmUgaG93IG1hbnkgY2hhcmFjdGVycyB0aGUgbGluZSBkaXNjcGxpbmUgY2FuIGFjY2VwdC4KLSAqIAlUaGUgbG93LWxldmVsIGRyaXZlciBtdXN0IG5vdCBzZW5kIG1vcmUgY2hhcmFjdGVycyB0aGFuIHdhcwotICogCWluZGljYXRlZCBieSByZWNlaXZlX3Jvb20sIG9yIHRoZSBsaW5lIGRpc2NwbGluZSBtYXkgZHJvcAotICogCXRob3NlIGNoYXJhY3RlcnMuCi0gKiAKICAqIHZvaWQJKCp3cml0ZV93YWtldXApKHN0cnVjdCB0dHlfc3RydWN0ICopOwogICoKICAqIAlUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgbG93LWxldmVsIHR0eSBkcml2ZXIgdG8gc2lnbmFsCkBAIC0xMzYsNyArMTI4LDYgQEAKIAkgKi8KIAl2b2lkCSgqcmVjZWl2ZV9idWYpKHN0cnVjdCB0dHlfc3RydWN0ICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLAogCQkJICAgICAgIGNoYXIgKmZwLCBpbnQgY291bnQpOwotCWludAkoKnJlY2VpdmVfcm9vbSkoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CiAJdm9pZAkoKndyaXRlX3dha2V1cCkoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CiAKIAlzdHJ1Y3QgIG1vZHVsZSAqb3duZXI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpZGVvX2RlY29kZXIuaCBiL2luY2x1ZGUvbGludXgvdmlkZW9fZGVjb2Rlci5oCmluZGV4IDBlOWU0OGIuLjEyMWUyNmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlkZW9fZGVjb2Rlci5oCisrKyBiL2luY2x1ZGUvbGludXgvdmlkZW9fZGVjb2Rlci5oCkBAIC0xLDYgKzEsOCBAQAogI2lmbmRlZiBfTElOVVhfVklERU9fREVDT0RFUl9ICiAjZGVmaW5lIF9MSU5VWF9WSURFT19ERUNPREVSX0gKIAorI2RlZmluZSBIQVZFX1ZJREVPX0RFQ09ERVIgMQorCiBzdHJ1Y3QgdmlkZW9fZGVjb2Rlcl9jYXBhYmlsaXR5IHsgLyogdGhpcyBuYW1lIGlzIHRvbyBsb25nICovCiAJX191MzIJZmxhZ3M7CiAjZGVmaW5lCVZJREVPX0RFQ09ERVJfUEFMCTEJLyogY2FuIGRlY29kZSBQQUwgc2lnbmFsICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oIGIvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaAppbmRleCAxY2RlZDY4Li5jZTQwNjc1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oCisrKyBiL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmgKQEAgLTY0Miw2ICs2NDIsMTIgQEAKICNkZWZpbmUgVjRMMl9TVERfQVRTQ184X1ZTQiAgICAgKCh2NGwyX3N0ZF9pZCkweDAxMDAwMDAwKQogI2RlZmluZSBWNEwyX1NURF9BVFNDXzE2X1ZTQiAgICAoKHY0bDJfc3RkX2lkKTB4MDIwMDAwMDApCiAKKy8qIHNvbWUgbWVyZ2VkIHN0YW5kYXJkcyAqLworI2RlZmluZSBWNEwyX1NURF9NTgkoVjRMMl9TVERfUEFMX018VjRMMl9TVERfUEFMX058VjRMMl9TVERfUEFMX05jfFY0TDJfU1REX05UU0MpCisjZGVmaW5lIFY0TDJfU1REX0IJKFY0TDJfU1REX1BBTF9CfFY0TDJfU1REX1BBTF9CMXxWNEwyX1NURF9TRUNBTV9CKQorI2RlZmluZSBWNEwyX1NURF9HSAkoVjRMMl9TVERfUEFMX0d8VjRMMl9TVERfUEFMX0h8VjRMMl9TVERfU0VDQU1fR3xWNEwyX1NURF9TRUNBTV9IKQorI2RlZmluZSBWNEwyX1NURF9ESwkoVjRMMl9TVERfUEFMX0RLfFY0TDJfU1REX1NFQ0FNX0RLKQorCiAvKiBzb21lIGNvbW1vbiBuZWVkZWQgc3R1ZmYgKi8KICNkZWZpbmUgVjRMMl9TVERfUEFMX0JHCQkoVjRMMl9TVERfUEFMX0IJCXxcCiAJCQkJIFY0TDJfU1REX1BBTF9CMQl8XApAQCAtNjYyLDcgKzY2OCw4IEBACiAJCQkJIFY0TDJfU1REX1NFQ0FNX0cJfFwKIAkJCQkgVjRMMl9TVERfU0VDQU1fSAl8XAogCQkJCSBWNEwyX1NURF9TRUNBTV9ESwl8XAotCQkJCSBWNEwyX1NURF9TRUNBTV9MKQorCQkJCSBWNEwyX1NURF9TRUNBTV9MICAgICAgIHxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0xDKQogCiAjZGVmaW5lIFY0TDJfU1REXzUyNV82MAkJKFY0TDJfU1REX1BBTF9NCQl8XAogCQkJCSBWNEwyX1NURF9QQUxfNjAJfFwKQEAgLTg4OCw3ICs4OTUsNiBAQAogCiAvKiAgRmxhZ3MgZm9yIHRoZSAnbW9kZScgZmllbGQgKi8KICNkZWZpbmUgVjRMMl9BVURNT0RFX0FWTAkJMHgwMDAwMQotI2RlZmluZSBWNEwyX0FVRE1PREVfMzJCSVRTCQkweDAwMDAyCiAKIHN0cnVjdCB2NGwyX2F1ZGlvb3V0CiB7CkBAIC0xMTEwLDcgKzExMTYsNiBAQAogLyogbmFtZXMgZm9yIGZhbmN5IGRlYnVnIG91dHB1dCAqLwogZXh0ZXJuIGNoYXIgKnY0bDJfZmllbGRfbmFtZXNbXTsKIGV4dGVybiBjaGFyICp2NGwyX3R5cGVfbmFtZXNbXTsKLWV4dGVybiBjaGFyICp2NGwyX2lvY3RsX25hbWVzW107CiAKIC8qICBDb21wYXRpYmlsaXR5IGxheWVyIGludGVyZmFjZSAgLS0gIHY0bDEtY29tcGF0IG1vZHVsZSAqLwogdHlwZWRlZiBpbnQgKCp2NGwyX2tpb2N0bCkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCkBAIC0xMTE4LDYgKzExMjMsMTEgQEAKIGludCB2NGxfY29tcGF0X3RyYW5zbGF0ZV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCSAgICAgICBpbnQgY21kLCB2b2lkICphcmcsIHY0bDJfa2lvY3RsIGRyaXZlcl9pb2N0bCk7CiAKKy8qIDMyIEJpdHMgY29tcGF0aWJpbGl0eSBsYXllciBmb3IgNjQgYml0cyBwcm9jZXNzb3JzICovCitleHRlcm4gbG9uZyB2NGxfY29tcGF0X2lvY3RsMzIoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJdW5zaWduZWQgbG9uZyBhcmcpOworCisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX19MSU5VWF9WSURFT0RFVjJfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dhdmVmcm9udC5oIGIvaW5jbHVkZS9saW51eC93YXZlZnJvbnQuaAppbmRleCA2MWJkMGZkLi41MWFiM2M5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dhdmVmcm9udC5oCisrKyBiL2luY2x1ZGUvbGludXgvd2F2ZWZyb250LmgKQEAgLTQzNCwyMiArNDM0LDIyIEBACiB9IHdhdmVmcm9udF9tdWx0aXNhbXBsZTsKIAogdHlwZWRlZiBzdHJ1Y3Qgd2ZfYWxpYXMgewotICAgIElOVDE2IE9yaWdpbmFsU2FtcGxlIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyAgICBJTlQxNiBPcmlnaW5hbFNhbXBsZTsKIAotICAgIHN0cnVjdCB3Zl9zYW1wbGVfb2Zmc2V0IHNhbXBsZVN0YXJ0T2Zmc2V0IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLSAgICBzdHJ1Y3Qgd2Zfc2FtcGxlX29mZnNldCBsb29wU3RhcnRPZmZzZXQgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotICAgIHN0cnVjdCB3Zl9zYW1wbGVfb2Zmc2V0IHNhbXBsZUVuZE9mZnNldCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0gICAgc3RydWN0IHdmX3NhbXBsZV9vZmZzZXQgbG9vcEVuZE9mZnNldCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisgICAgc3RydWN0IHdmX3NhbXBsZV9vZmZzZXQgc2FtcGxlU3RhcnRPZmZzZXQ7CisgICAgc3RydWN0IHdmX3NhbXBsZV9vZmZzZXQgbG9vcFN0YXJ0T2Zmc2V0OworICAgIHN0cnVjdCB3Zl9zYW1wbGVfb2Zmc2V0IHNhbXBsZUVuZE9mZnNldDsKKyAgICBzdHJ1Y3Qgd2Zfc2FtcGxlX29mZnNldCBsb29wRW5kT2Zmc2V0OwogCi0gICAgSU5UMTYgIEZyZXF1ZW5jeUJpYXMgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworICAgIElOVDE2ICBGcmVxdWVuY3lCaWFzOwogCi0gICAgVUNIQVI4IFNhbXBsZVJlc29sdXRpb246MiAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotICAgIFVDSEFSOCBVbnVzZWQxOjEgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLSAgICBVQ0hBUjggTG9vcDoxIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLSAgICBVQ0hBUjggQmlkaXJlY3Rpb25hbDoxICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0gICAgVUNIQVI4IFVudXNlZDI6MSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0gICAgVUNIQVI4IFJldmVyc2U6MSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0gICAgVUNIQVI4IFVudXNlZDM6MSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7IAorICAgIFVDSEFSOCBTYW1wbGVSZXNvbHV0aW9uOjI7CisgICAgVUNIQVI4IFVudXNlZDE6MTsKKyAgICBVQ0hBUjggTG9vcDoxOworICAgIFVDSEFSOCBCaWRpcmVjdGlvbmFsOjE7CisgICAgVUNIQVI4IFVudXNlZDI6MTsKKyAgICBVQ0hBUjggUmV2ZXJzZToxOworICAgIFVDSEFSOCBVbnVzZWQzOjE7CiAgICAgCiAgICAgLyogVGhpcyBzdHJ1Y3R1cmUgaXMgbWVhbnQgdG8gYmUgcGFkZGVkIG9ubHkgdG8gMTYgYml0cyBvbiB0aGVpcgogICAgICAgIG9yaWdpbmFsLiBPZiBjb3Vyc2UsIHdob2V2ZXIgd3JvdGUgdGhlaXIgZG9jdW1lbnRhdGlvbiBkaWRuJ3QKQEAgLTQ2MCw4ICs0NjAsOCBAQAogICAgICAgIHN0YW5kYXJkIDE2LT4zMiBiaXQgaXNzdWVzLgogICAgICovCiAKLSAgICBVQ0hBUjggc2l4dGVlbl9iaXRfcGFkZGluZyBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci19IHdhdmVmcm9udF9hbGlhczsKKyAgICBVQ0hBUjggc2l4dGVlbl9iaXRfcGFkZGluZzsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgd2F2ZWZyb250X2FsaWFzOwogCiB0eXBlZGVmIHN0cnVjdCB3Zl9kcnVtIHsKICAgICBVQ0hBUjggUGF0Y2hOdW1iZXI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oIGIvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaAppbmRleCBhYzM5ZDA0Li44NmIxMTEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmgKQEAgLTY1LDYgKzY1LDcgQEAKIGV4dGVybiBpbnQgRkFTVENBTEwoc2NoZWR1bGVfZGVsYXllZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaywgdW5zaWduZWQgbG9uZyBkZWxheSkpOwogCiBleHRlcm4gaW50IHNjaGVkdWxlX2RlbGF5ZWRfd29ya19vbihpbnQgY3B1LCBzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmssIHVuc2lnbmVkIGxvbmcgZGVsYXkpOworZXh0ZXJuIGludCBzY2hlZHVsZV9vbl9lYWNoX2NwdSh2b2lkICgqZnVuYykodm9pZCAqaW5mbyksIHZvaWQgKmluZm8pOwogZXh0ZXJuIHZvaWQgZmx1c2hfc2NoZWR1bGVkX3dvcmsodm9pZCk7CiBleHRlcm4gaW50IGN1cnJlbnRfaXNfa2V2ZW50ZCh2b2lkKTsKIGV4dGVybiBpbnQga2V2ZW50ZF91cCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmggYi9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oCmluZGV4IGIwOTYxNTkuLmJlYWVmNWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmgKKysrIGIvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaApAQCAtMTAzLDcgKzEwMyw5IEBACiBpbnQgcGRmbHVzaF9vcGVyYXRpb24odm9pZCAoKmZuKSh1bnNpZ25lZCBsb25nKSwgdW5zaWduZWQgbG9uZyBhcmcwKTsKIGludCBkb193cml0ZXBhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYyk7CiBpbnQgc3luY19wYWdlX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAotCQkJbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KTsKKwkJCWxvZmZfdCBwb3MsIGxvZmZfdCBjb3VudCk7CitpbnQgc3luY19wYWdlX3JhbmdlX25vbG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCSAgIGxvZmZfdCBwb3MsIGxvZmZfdCBjb3VudCk7CiAKIC8qIHBkZmx1c2guYyAqLwogZXh0ZXJuIGludCBucl9wZGZsdXNoX3RocmVhZHM7CS8qIEdsb2JhbCBzbyBpdCBjYW4gYmUgZXhwb3J0ZWQgdG8gc3lzY3RsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3hhdHRyLmggYi9pbmNsdWRlL2xpbnV4L3hhdHRyLmgKaW5kZXggMjNmOWM2MS4uY2RhOGE5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC94YXR0ci5oCisrKyBiL2luY2x1ZGUvbGludXgveGF0dHIuaApAQCAtMTMsNyArMTMsMjIgQEAKICNkZWZpbmUgWEFUVFJfQ1JFQVRFCTB4MQkvKiBzZXQgdmFsdWUsIGZhaWwgaWYgYXR0ciBhbHJlYWR5IGV4aXN0cyAqLwogI2RlZmluZSBYQVRUUl9SRVBMQUNFCTB4MgkvKiBzZXQgdmFsdWUsIGZhaWwgaWYgYXR0ciBkb2VzIG5vdCBleGlzdCAqLwogCisvKiBOYW1lc3BhY2VzICovCisjZGVmaW5lIFhBVFRSX09TMl9QUkVGSVggIm9zMi4iCisjZGVmaW5lIFhBVFRSX09TMl9QUkVGSVhfTEVOIChzaXplb2YgKFhBVFRSX09TMl9QUkVGSVgpIC0gMSkKKwogI2RlZmluZSBYQVRUUl9TRUNVUklUWV9QUkVGSVgJInNlY3VyaXR5LiIKKyNkZWZpbmUgWEFUVFJfU0VDVVJJVFlfUFJFRklYX0xFTiAoc2l6ZW9mIChYQVRUUl9TRUNVUklUWV9QUkVGSVgpIC0gMSkKKworI2RlZmluZSBYQVRUUl9TWVNURU1fUFJFRklYICJzeXN0ZW0uIgorI2RlZmluZSBYQVRUUl9TWVNURU1fUFJFRklYX0xFTiAoc2l6ZW9mIChYQVRUUl9TWVNURU1fUFJFRklYKSAtIDEpCisKKyNkZWZpbmUgWEFUVFJfVFJVU1RFRF9QUkVGSVggInRydXN0ZWQuIgorI2RlZmluZSBYQVRUUl9UUlVTVEVEX1BSRUZJWF9MRU4gKHNpemVvZiAoWEFUVFJfVFJVU1RFRF9QUkVGSVgpIC0gMSkKKworI2RlZmluZSBYQVRUUl9VU0VSX1BSRUZJWCAidXNlci4iCisjZGVmaW5lIFhBVFRSX1VTRVJfUFJFRklYX0xFTiAoc2l6ZW9mIChYQVRUUl9VU0VSX1BSRUZJWCkgLSAxKQorCiAKIHN0cnVjdCB4YXR0cl9oYW5kbGVyIHsKIAljaGFyICpwcmVmaXg7CkBAIC0yNSw2ICs0MCwxMCBAQAogCQkgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKIH07CiAKK3NzaXplX3QgdmZzX2dldHhhdHRyKHN0cnVjdCBkZW50cnkgKiwgY2hhciAqLCB2b2lkICosIHNpemVfdCk7CitpbnQgdmZzX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKiwgY2hhciAqLCB2b2lkICosIHNpemVfdCwgaW50KTsKK2ludCB2ZnNfcmVtb3ZleGF0dHIoc3RydWN0IGRlbnRyeSAqLCBjaGFyICopOworCiBzc2l6ZV90IGdlbmVyaWNfZ2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKTsKIHNzaXplX3QgZ2VuZXJpY19saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSk7CiBpbnQgZ2VuZXJpY19zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvemxpYi5oIGIvaW5jbHVkZS9saW51eC96bGliLmgKaW5kZXggNzRmN2I3OC4uNGZhMzJmMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC96bGliLmgKKysrIGIvaW5jbHVkZS9saW51eC96bGliLmgKQEAgLTQ0Miw5ICs0NDIsMTEgQEAKICAgIG5vdCBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgogKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNpZiAwCiBleHRlcm4gaW50IHpsaWJfZGVmbGF0ZVNldERpY3Rpb25hcnkgKHpfc3RyZWFtcCBzdHJtLAogCQkJCQkJICAgICBjb25zdCBCeXRlICpkaWN0aW9uYXJ5LAogCQkJCQkJICAgICB1SW50ICBkaWN0TGVuZ3RoKTsKKyNlbmRpZgogLyoKICAgICAgSW5pdGlhbGl6ZXMgdGhlIGNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gYnl0ZSBzZXF1ZW5jZQogICAgd2l0aG91dCBwcm9kdWNpbmcgYW55IGNvbXByZXNzZWQgb3V0cHV0LiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkCkBAIC00NzgsNyArNDgwLDEwIEBACiAgICBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgogKi8KIAorI2lmIDAKIGV4dGVybiBpbnQgemxpYl9kZWZsYXRlQ29weSAoel9zdHJlYW1wIGRlc3QsIHpfc3RyZWFtcCBzb3VyY2UpOworI2VuZGlmCisKIC8qCiAgICAgIFNldHMgdGhlIGRlc3RpbmF0aW9uIHN0cmVhbSBhcyBhIGNvbXBsZXRlIGNvcHkgb2YgdGhlIHNvdXJjZSBzdHJlYW0uCiAKQEAgLTUxMSw3ICs1MTYsOSBAQAogCXJldHVybiBzICsgKChzICsgNykgPj4gMykgKyAoKHMgKyA2MykgPj4gNikgKyAxMTsKIH0KIAorI2lmIDAKIGV4dGVybiBpbnQgemxpYl9kZWZsYXRlUGFyYW1zICh6X3N0cmVhbXAgc3RybSwgaW50IGxldmVsLCBpbnQgc3RyYXRlZ3kpOworI2VuZGlmCiAvKgogICAgICBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIGFuZCBjb21wcmVzc2lvbiBzdHJhdGVneS4gIFRoZQogICAgaW50ZXJwcmV0YXRpb24gb2YgbGV2ZWwgYW5kIHN0cmF0ZWd5IGlzIGFzIGluIGRlZmxhdGVJbml0Mi4gIFRoaXMgY2FuIGJlCkBAIC01NzEsNyArNTc4LDkgQEAKICAgIGluZmxhdGUoKS4KICovCiAKKyNpZiAwCiBleHRlcm4gaW50IHpsaWJfaW5mbGF0ZVN5bmMgKHpfc3RyZWFtcCBzdHJtKTsKKyNlbmRpZgogLyogCiAgICAgU2tpcHMgaW52YWxpZCBjb21wcmVzc2VkIGRhdGEgdW50aWwgYSBmdWxsIGZsdXNoIHBvaW50IChzZWUgYWJvdmUgdGhlCiAgIGRlc2NyaXB0aW9uIG9mIGRlZmxhdGUgd2l0aCBaX0ZVTExfRkxVU0gpIGNhbiBiZSBmb3VuZCwgb3IgdW50aWwgYWxsCkBAIC02MzYsNyArNjQ1LDkgQEAKICNlbmRpZgogCiBleHRlcm4gY29uc3QgY2hhciAgKiB6bGliX3pFcnJvciAgICAgICAgICAgKGludCBlcnIpOworI2lmIDAKIGV4dGVybiBpbnQgICAgICAgICAgIHpsaWJfaW5mbGF0ZVN5bmNQb2ludCAoel9zdHJlYW1wIHopOworI2VuZGlmCiBleHRlcm4gY29uc3QgdUxvbmcgKiB6bGliX2dldF9jcmNfdGFibGUgICAgKHZvaWQpOwogCiAjZW5kaWYgLyogX1pMSUJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9hdWRpb2NoaXAuaCBiL2luY2x1ZGUvbWVkaWEvYXVkaW9jaGlwLmgKaW5kZXggYjdkNGIwOS4uMjk1ZDI1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9hdWRpb2NoaXAuaAorKysgYi9pbmNsdWRlL21lZGlhL2F1ZGlvY2hpcC5oCkBAIC0yMywxMSArMjMsNiBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qIHY0bCBkZXZpY2Ugd2FzIG9wZW5lZCBpbiBSYWRpbyBtb2RlICovCi0jZGVmaW5lIEFVRENfU0VUX1JBRElPICAgICAgICBfSU8oJ20nLDIpCi0vKiBzZWxlY3QgZnJvbSBUVixyYWRpbyxleHRlcm4sTVVURSAqLwotI2RlZmluZSBBVURDX1NFVF9JTlBVVCAgICAgICAgX0lPVygnbScsMTcsaW50KQotCiAvKiBhdWRpbyBpbnB1dHMgKi8KICNkZWZpbmUgQVVESU9fVFVORVIgICAgICAgIDB4MDAKICNkZWZpbmUgQVVESU9fUkFESU8gICAgICAgIDB4MDEKQEAgLTQwLDE1ICszNSw0IEBACiAjZGVmaW5lIEFVRElPX01VVEUgICAgICAgICAweDgwCiAjZGVmaW5lIEFVRElPX1VOTVVURSAgICAgICAweDgxCiAKLS8qIGFsbCB0aGUgc3R1ZmYgYmVsb3cgaXMgb2Jzb2xldGUgYW5kIGp1c3QgaGVyZSBmb3IgcmVmZXJlbmNlLiAgSSdsbAotICogcmVtb3ZlIGl0IG9uY2UgdGhlIGRyaXZlciBpcyB0ZXN0ZWQgYW5kIHdvcmtzIGZpbmUuCi0gKgotICogSW5zdGVhZCBjcmVhdGluZyBhbG90IG9mIHRpbnkgQVBJJ3MgZm9yIGFsbCBraW5kcyBvZiBkaWZmZXJlbnQKLSAqIGNoaXBzLCB3ZSdsbCBqdXN0IHBhc3MgdGhyb3V0aCB0aGUgdjRsIGlvY3RsIHN0cnVjdHMgKHY0bDIgbm90Ci0gKiB5ZXQuLi4pLiAgSXQgaXMgYSBiaXQgbGVzcyBmbGV4aWJsZSwgYnV0IG1vc3QvYWxsIHVzZWQgaTJjIGNoaXBzCi0gKiBtYWtlIHNlbnNlIGluIHY0bCBjb250ZXh0IG9ubHkuICBTbyBJIHRoaW5rIHRoYXQncyBhY2NlcHRhYmxlLi4uCi0gKi8KLQotLyogbWlzYyBzdHVmZiB0byBwYXNzIGFyb3VuZCBjb25maWcgaW5mbyB0byBpMmMgY2hpcHMgKi8KLSNkZWZpbmUgQVVEQ19DT05GSUdfUElOTkFDTEUgIF9JT1coJ20nLDMyLGludCkKICNlbmRpZiAvKiBBVURJT0NISVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zYWE3MTQ2X3Z2LmggYi9pbmNsdWRlL21lZGlhL3NhYTcxNDZfdnYuaAppbmRleCAxNmFmOTI5Li5lNWU3NDllIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3NhYTcxNDZfdnYuaAorKysgYi9pbmNsdWRlL21lZGlhL3NhYTcxNDZfdnYuaApAQCAtMTc4LDYgKzE3OCw4IEBACiAKIAlzdHJ1Y3Qgc2FhNzE0Nl9leHRlbnNpb25faW9jdGxzICppb2N0bHM7CiAJaW50ICgqaW9jdGwpKHN0cnVjdCBzYWE3MTQ2X2ZoKiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKKworCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmJpX2ZvcHM7CiB9OwogCiBzdHJ1Y3Qgc2FhNzE0Nl91c2Vfb3BzICB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3R1bmVyLXR5cGVzLmggYi9pbmNsdWRlL21lZGlhL3R1bmVyLXR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU4MjFhYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvdHVuZXItdHlwZXMuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogZGVzY3JpcHRpb25zIGZvciBzaW1wbGUgdHVuZXJzLgorICovCisKKyNpZm5kZWYgX19UVU5FUl9UWVBFU19IX18KKyNkZWZpbmUgX19UVU5FUl9UWVBFU19IX18KKworZW51bSBwYXJhbV90eXBlIHsKKwlUVU5FUl9QQVJBTV9UWVBFX1JBRElPLCBcCisJVFVORVJfUEFSQU1fVFlQRV9QQUwsIFwKKwlUVU5FUl9QQVJBTV9UWVBFX1NFQ0FNLCBcCisJVFVORVJfUEFSQU1fVFlQRV9OVFNDCit9OworCitzdHJ1Y3QgdHVuZXJfcmFuZ2UgeworCXVuc2lnbmVkIHNob3J0IGxpbWl0OworCXVuc2lnbmVkIGNoYXIgY2I7Cit9OworCitzdHJ1Y3QgdHVuZXJfcGFyYW1zIHsKKwllbnVtIHBhcmFtX3R5cGUgdHlwZTsKKwkvKiBNYW55IFBoaWxpcHMgYmFzZWQgdHVuZXJzIGhhdmUgYSBjb21tZW50IGxpa2UgdGhpcyBpbiB0aGVpcgorCSAqIGRhdGFzaGVldDoKKwkgKgorCSAqICAgRm9yIGNoYW5uZWwgc2VsZWN0aW9uIGludm9sdmluZyBiYW5kIHN3aXRjaGluZywgYW5kIHRvIGVuc3VyZQorCSAqICAgc21vb3RoIHR1bmluZyB0byB0aGUgZGVzaXJlZCBjaGFubmVsIHdpdGhvdXQgY2F1c2luZworCSAqICAgdW5uZWNlc3NhcnkgY2hhcmdlIHB1bXAgYWN0aW9uLCBpdCBpcyByZWNvbW1lbmRlZCB0byBjb25zaWRlcgorCSAqICAgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB3YW50ZWQgY2hhbm5lbCBmcmVxdWVuY3kgYW5kIHRoZQorCSAqICAgY3VycmVudCBjaGFubmVsIGZyZXF1ZW5jeS4gIFVubmVjZXNzYXJ5IGNoYXJnZSBwdW1wIGFjdGlvbgorCSAqICAgd2lsbCByZXN1bHQgaW4gdmVyeSBsb3cgdHVuaW5nIHZvbHRhZ2Ugd2hpY2ggbWF5IGRyaXZlIHRoZQorCSAqICAgb3NjaWxsYXRvciB0byBleHRyZW1lIGNvbmRpdGlvbnMuCisJICoKKwkgKiBTZXQgY2JfZmlyc3RfaWZfbG93ZXJfZnJlcSB0byAxLCBpZiB0aGlzIGNoZWNrIGlzCisJICogcmVxdWlyZWQgZm9yIHRoaXMgdHVuZXIuCisJICoKKwkgKiBJIHRlc3RlZCB0aGlzIGZvciBQQUwgYnkgZmlyc3Qgc2V0dGluZyB0aGUgVFYgZnJlcXVlbmN5IHRvCisJICogMjAzIE1IeiBhbmQgdGhlbiBzd2l0Y2hpbmcgdG8gOTYuNiBNSHogRk0gcmFkaW8uIFRoZSByZXN1bHQgd2FzCisJICogc3RhdGljIHVubGVzcyB0aGUgY29udHJvbCBieXRlIHdhcyBzZW50IGZpcnN0LgorCSAqLworCXVuc2lnbmVkIGludCBjYl9maXJzdF9pZl9sb3dlcl9mcmVxOjE7CisJdW5zaWduZWQgY2hhciBjb25maWc7IC8qIHRvIGJlIG1vdmVkIGludG8gc3RydWN0IHR1bmVyX3JhbmdlIGZvciBkdmItcGxsIG1lcmdlICovCisKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJc3RydWN0IHR1bmVyX3JhbmdlICpyYW5nZXM7Cit9OworCitzdHJ1Y3QgdHVuZXJ0eXBlIHsKKwljaGFyICpuYW1lOworCXN0cnVjdCB0dW5lcl9wYXJhbXMgKnBhcmFtczsKK307CisKK2V4dGVybiBzdHJ1Y3QgdHVuZXJ0eXBlIHR1bmVyc1tdOworZXh0ZXJuIHVuc2lnbmVkIGNvbnN0IGludCB0dW5lcl9jb3VudDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3R1bmVyLmggYi9pbmNsdWRlL21lZGlhL3R1bmVyLmgKaW5kZXggYjM3Y2RlNi4uYTViZWVhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS90dW5lci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdHVuZXIuaApAQCAtMjMsNiArMjMsNyBAQAogI2RlZmluZSBfVFVORVJfSAogCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bWVkaWEvdHVuZXItdHlwZXMuaD4KIAogI2RlZmluZSBBRERSX1VOU0VUICgyNTUpCiAKQEAgLTgyLDkgKzgzLDkgQEAKICNkZWZpbmUgVFVORVJfUEhJTElQU19GTTEyMzZfTUszCTQzCiAKICNkZWZpbmUgVFVORVJfUEhJTElQU180SU4xCQk0NAkvKiBBVEkgVFYgV29uZGVyIFBybyAtIENvbmV4YW50ICovCi0vKiBNaWNyb3R1bmUgbWVyZ2VnZWQgd2l0aCBUZW1pYyAxMi8zMS8xOTk5IHBhcnRpYWxseSBmaW5hbmNlZCBieSBBbHBzIC0gdGhlc2UgbWF5IGJlIHNpbWlsYXIgdG8gVGVtaWMgKi8KKy8qIE1pY3JvdHVuZSBtZXJnZWQgd2l0aCBUZW1pYyAxMi8zMS8xOTk5IHBhcnRpYWxseSBmaW5hbmNlZCBieSBBbHBzIC0gdGhlc2UgbWF5IGJlIHNpbWlsYXIgdG8gVGVtaWMgKi8KICNkZWZpbmUgVFVORVJfTUlDUk9UVU5FXzQwNDlGTTUgCTQ1Ci0jZGVmaW5lIFRVTkVSX01JQ1JPVFVORV80MDQyX0ZJNQk0NgorI2RlZmluZSBUVU5FUl9QQU5BU09OSUNfVlAyNwkJNDYKICNkZWZpbmUgVFVORVJfTEdfTlRTQ19UQVBFCQk0NwogCiAjZGVmaW5lIFRVTkVSX1RORl84ODMxQkdGRgkJNDgKQEAgLTEwMiw3ICsxMDMsNyBAQAogI2RlZmluZSBUVU5FUl9ZTUVDX1RWRl84NTMxTUYJCTU4CiAjZGVmaW5lIFRVTkVSX1lNRUNfVFZGXzU1MzNNRgkJNTkJLyogUGl4ZWx2aWV3IFBybyBVbHRyYSBOVFNDICovCiAKLSNkZWZpbmUgVFVORVJfVEhPTVNPTl9EVFQ3NjExCQk2MAkvKiBEVmlDTyBGdXNpb25IRFRWIDMgR29sZC1UICovCisjZGVmaW5lIFRVTkVSX1RIT01TT05fRFRUNzYxWAkJNjAJLyogRFRUIDc2MTEgNzYxMUEgNzYxMiA3NjEzIDc2MTNBIDc2MTQgNzYxNSA3NjE1QSAqLwogI2RlZmluZSBUVU5FUl9URU5BXzk1MzNfREkJCTYxCiAjZGVmaW5lIFRVTkVSX1RFQTU3NjcJCQk2MgkvKiBPbmx5IEZNIFJhZGlvIFR1bmVyICovCiAjZGVmaW5lIFRVTkVSX1BISUxJUFNfRk1EMTIxNk1FX01LMwk2MwpAQCAtMTE0LDQ4ICsxMTUsMjggQEAKIAogI2RlZmluZSBUVU5FUl9QSElMSVBTX1RVVjEyMzZECQk2OAkvKiBBVEkgSERUViBXb25kZXIgKi8KICNkZWZpbmUgVFVORVJfVE5GXzUzMzVNRiAgICAgICAgICAgICAgICA2OQkvKiBTYWJyZW50IEJ0ODQ4ICAgKi8KLQotI2RlZmluZSBOT1RVTkVSIDAKLSNkZWZpbmUgUEFMICAgICAxCS8qIFBBTF9CRyAqLwotI2RlZmluZSBQQUxfSSAgIDIKLSNkZWZpbmUgTlRTQyAgICAzCi0jZGVmaW5lIFNFQ0FNICAgNAotI2RlZmluZSBBVFNDICAgIDUKLSNkZWZpbmUgUkFESU8gICA2Ci0KLSNkZWZpbmUgTm9UdW5lciAwCi0jZGVmaW5lIFBoaWxpcHMgMQotI2RlZmluZSBURU1JQyAgIDIKLSNkZWZpbmUgU29ueSAgICAzCi0jZGVmaW5lIEFscHMgICAgNAotI2RlZmluZSBMR0lOTk9URUsgNQotI2RlZmluZSBTSEFSUCAgIDYKLSNkZWZpbmUgU2Ftc3VuZyA3Ci0jZGVmaW5lIE1pY3JvdHVuZSA4Ci0jZGVmaW5lIEhJVEFDSEkgOQotI2RlZmluZSBQYW5hc29uaWMgMTAKLSNkZWZpbmUgVENMICAgICAxMQotI2RlZmluZSBUSE9NU09OIDEyCi0KLSNkZWZpbmUgVFVORVJfU0VUX1RZUEVfQUREUiAgICAgICAgICBfSU9XKCdUJywzLGludCkKLSNkZWZpbmUgVFVORVJfU0VUX1NUQU5EQlkgICAgICAgICAgICBfSU9XKCdUJyw0LGludCkKLSNkZWZpbmUgVERBOTg4N19TRVRfQ09ORklHICAgICAgICAgICBfSU9XKCd0Jyw1LGludCkKKyNkZWZpbmUgVFVORVJfU0FNU1VOR19UQ1BOXzIxMjFQMzBBICAgICA3MCAJLyogSGF1cHBhdWdlIFBWUi01MDBNQ0UgTlRTQyAqLwogCiAvKiB0diBjYXJkIHNwZWNpZmljICovCi0jIGRlZmluZSBUREE5ODg3X1BSRVNFTlQgICAgICAgICAgICAgKDE8PDApCi0jIGRlZmluZSBUREE5ODg3X1BPUlQxX0lOQUNUSVZFICAgICAgKDE8PDEpCi0jIGRlZmluZSBUREE5ODg3X1BPUlQyX0lOQUNUSVZFICAgICAgKDE8PDIpCi0jIGRlZmluZSBUREE5ODg3X1FTUyAgICAgICAgICAgICAgICAgKDE8PDMpCi0jIGRlZmluZSBUREE5ODg3X0lOVEVSQ0FSUklFUiAgICAgICAgKDE8PDQpCi0jIGRlZmluZSBUREE5ODg3X1BPUlQxX0FDVElWRSAgICAgICAgKDE8PDUpCi0jIGRlZmluZSBUREE5ODg3X1BPUlQyX0FDVElWRSAgICAgICAgKDE8PDYpCi0jIGRlZmluZSBUREE5ODg3X0lOVEVSQ0FSUklFUl9OVFNDICAgKDE8PDcpCisjZGVmaW5lIFREQTk4ODdfUFJFU0VOVCAJCSgxPDwwKQorI2RlZmluZSBUREE5ODg3X1BPUlQxX0lOQUNUSVZFIAkJKDE8PDEpCisjZGVmaW5lIFREQTk4ODdfUE9SVDJfSU5BQ1RJVkUgCQkoMTw8MikKKyNkZWZpbmUgVERBOTg4N19RU1MgCQkJKDE8PDMpCisjZGVmaW5lIFREQTk4ODdfSU5URVJDQVJSSUVSIAkJKDE8PDQpCisjZGVmaW5lIFREQTk4ODdfUE9SVDFfQUNUSVZFIAkJKDE8PDUpCisjZGVmaW5lIFREQTk4ODdfUE9SVDJfQUNUSVZFIAkJKDE8PDYpCisjZGVmaW5lIFREQTk4ODdfSU5URVJDQVJSSUVSX05UU0MgCSgxPDw3KQorLyogVHVuZXIgdGFrZW92ZXIgcG9pbnQgYWRqdXN0bWVudCwgaW4gZEIsIC0xNiA8PSB0b3AgPD0gMTUgKi8KKyNkZWZpbmUgVERBOTg4N19UT1BfTUFTSyAJCSgweDNmIDw8IDgpCisjZGVmaW5lIFREQTk4ODdfVE9QX1NFVCAJCSgxIDw8IDEzKQorI2RlZmluZSBUREE5ODg3X1RPUCh0b3ApIAkJKFREQTk4ODdfVE9QX1NFVCB8ICgoKDE2ICsgKHRvcCkpICYgMHgxZikgPDwgOCkpCisKIC8qIGNvbmZpZyBvcHRpb25zICovCi0jIGRlZmluZSBUREE5ODg3X0RFRU1QSEFTSVNfTUFTSyAgICAgKDM8PDE2KQotIyBkZWZpbmUgVERBOTg4N19ERUVNUEhBU0lTX05PTkUgICAgICgxPDwxNikKLSMgZGVmaW5lIFREQTk4ODdfREVFTVBIQVNJU181MCAgICAgICAoMjw8MTYpCi0jIGRlZmluZSBUREE5ODg3X0RFRU1QSEFTSVNfNzUgICAgICAgKDM8PDE2KQotIyBkZWZpbmUgVERBOTg4N19BVVRPTVVURSAgICAgICAgICAgICgxPDwxOCkKKyNkZWZpbmUgVERBOTg4N19ERUVNUEhBU0lTX01BU0sgCSgzPDwxNikKKyNkZWZpbmUgVERBOTg4N19ERUVNUEhBU0lTX05PTkUgCSgxPDwxNikKKyNkZWZpbmUgVERBOTg4N19ERUVNUEhBU0lTXzUwIAkJKDI8PDE2KQorI2RlZmluZSBUREE5ODg3X0RFRU1QSEFTSVNfNzUgCQkoMzw8MTYpCisjZGVmaW5lIFREQTk4ODdfQVVUT01VVEUgCQkoMTw8MTgpCiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKQEAgLTE2NywxMCArMTQ4LDI2IEBACiAJVF9TVEFOREJZCT0gMSA8PCAzMQogfTsKIAorLyogT2xkZXIgYm9hcmRzIG9ubHkgaGFkIGEgc2luZ2xlIHR1bmVyIGRldmljZS4gTm93YWRheXMgbXVsdGlwbGUgdHVuZXIKKyAgIGRldmljZXMgbWF5IGJlIHByZXNlbnQgb24gYSBzaW5nbGUgYm9hcmQuIFVzaW5nIFRVTkVSX1NFVF9UWVBFX0FERFIKKyAgIHRvIHBhc3MgdGhlIHR1bmVyX3NldHVwIHN0cnVjdHVyZSBpdCBpcyBwb3NzaWJsZSB0byBzZXR1cCBlYWNoIHR1bmVyCisgICBkZXZpY2UgaW4gdHVybi4KKworICAgU2luY2UgbXVsdGlwbGUgZGV2aWNlcyBtYXkgYmUgcHJlc2VudCBpdCBpcyBubyBsb25nZXIgc3VmZmljaWVudCB0bworICAgc2VuZCBhIGNvbW1hbmQgdG8gYSBzaW5nbGUgaTJjIGRldmljZS4gSW5zdGVhZCB5b3Ugc2hvdWxkIGJyb2FkY2FzdAorICAgdGhlIGNvbW1hbmQgdG8gYWxsIGkyYyBkZXZpY2VzLgorCisgICBCeSBzZXR0aW5nIHRoZSBtb2RlX21hc2sgY29ycmVjdGx5IHlvdSBjYW4gc2VsZWN0IHdoaWNoIGNvbW1hbmRzIGFyZQorICAgYWNjZXB0ZWQgYnkgYSBzcGVjaWZpYyB0dW5lciBkZXZpY2UuIEZvciBleGFtcGxlLCBzZXQgbW9kZV9tYXNrIHRvCisgICBUX1JBRElPIGlmIHRoZSBkZXZpY2UgaXMgYSByYWRpby1vbmx5IHR1bmVyLiBUaGF0IHNwZWNpZmljIHR1bmVyIHdpbGwKKyAgIG9ubHkgYWNjZXB0IGNvbW1hbmRzIHdoZW4gdGhlIHR1bmVyIGlzIGluIHJhZGlvIG1vZGUgYW5kIGlnbm9yZSB0aGVtCisgICB3aGVuIHRoZSB0dW5lciBpcyBzZXQgdG8gVFYgbW9kZS4KKyAqLworCiBzdHJ1Y3QgdHVuZXJfc2V0dXAgewotCXVuc2lnbmVkIHNob3J0CWFkZHI7Ci0JdW5zaWduZWQgaW50CXR5cGU7Ci0JdW5zaWduZWQgaW50CW1vZGVfbWFzazsKKwl1bnNpZ25lZCBzaG9ydAlhZGRyOyAJLyogSTJDIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBpbnQJdHlwZTsgICAvKiBUdW5lciB0eXBlICovCisJdW5zaWduZWQgaW50CW1vZGVfbWFzazsgIC8qIEFsbG93ZWQgdHVuZXIgbW9kZXMgKi8KIH07CiAKIHN0cnVjdCB0dW5lciB7CkBAIC0xODIsNyArMTc5LDkgQEAKIAl1bnNpZ25lZCBpbnQgbW9kZTsKIAl1bnNpZ25lZCBpbnQgbW9kZV9tYXNrOwkvKiBDb21iaW5hdGlvbiBvZiBhbGxvd2FibGUgbW9kZXMgKi8KIAotCXVuc2lnbmVkIGludCBmcmVxOwkvKiBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IHNldHRpbmdzICovCisJdW5zaWduZWQgaW50IHR2X2ZyZXE7CS8qIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKwl1bnNpZ25lZCBpbnQgcmFkaW9fZnJlcTsKKwl1MTYgCSAgICAgbGFzdF9kaXY7CiAJdW5zaWduZWQgaW50IGF1ZG1vZGU7CiAJdjRsMl9zdGRfaWQgIHN0ZDsKIApAQCAtMjAwLDE0ICsxOTksMTMgQEAKIAl1bnNpZ25lZCBpbnQgc2dJRjsKIAogCS8qIGZ1bmN0aW9uIHB0cnMgKi8KLQl2b2lkICgqdHZfZnJlcSkoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGludCBmcmVxKTsKLQl2b2lkICgqcmFkaW9fZnJlcSkoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGludCBmcmVxKTsKKwl2b2lkICgqc2V0X3R2X2ZyZXEpKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgZnJlcSk7CisJdm9pZCAoKnNldF9yYWRpb19mcmVxKShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IGZyZXEpOwogCWludCAgKCpoYXNfc2lnbmFsKShzdHJ1Y3QgaTJjX2NsaWVudCAqYyk7CiAJaW50ICAoKmlzX3N0ZXJlbykoc3RydWN0IGkyY19jbGllbnQgKmMpOwogCXZvaWQgKCpzdGFuZGJ5KShzdHJ1Y3QgaTJjX2NsaWVudCAqYyk7CiB9OwogCi1leHRlcm4gdW5zaWduZWQgaW50IHR1bmVyX2RlYnVnOwogZXh0ZXJuIHVuc2lnbmVkIGNvbnN0IGludCB0dW5lcl9jb3VudDsKIAogZXh0ZXJuIGludCBtaWNyb3R1bmVfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYyk7CkBAIC0yMTksMTUgKzIxNywxNSBAQAogCiAjZGVmaW5lIHR1bmVyX3dhcm4oZm10LCBhcmcuLi4pIGRvIHtcCiAJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgJWQtJTA0eDogIiBmbXQsIHQtPmkyYy5kcml2ZXItPmRyaXZlci5uYW1lLCBcCi0JCQl0LT5pMmMuYWRhcHRlci0+bnIsIHQtPmkyYy5hZGRyICwgIyNhcmcpOyB9IHdoaWxlICgwKQorCQkJaTJjX2FkYXB0ZXJfaWQodC0+aTJjLmFkYXB0ZXIpLCB0LT5pMmMuYWRkciAsICMjYXJnKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgdHVuZXJfaW5mbyhmbXQsIGFyZy4uLikgZG8ge1wKIAlwcmludGsoS0VSTl9JTkZPICIlcyAlZC0lMDR4OiAiIGZtdCwgdC0+aTJjLmRyaXZlci0+ZHJpdmVyLm5hbWUsIFwKLQkJCXQtPmkyYy5hZGFwdGVyLT5uciwgdC0+aTJjLmFkZHIgLCAjI2FyZyk7IH0gd2hpbGUgKDApCisJCQlpMmNfYWRhcHRlcl9pZCh0LT5pMmMuYWRhcHRlciksIHQtPmkyYy5hZGRyICwgIyNhcmcpOyB9IHdoaWxlICgwKQogI2RlZmluZSB0dW5lcl9kYmcoZm10LCBhcmcuLi4pIGRvIHtcCisJZXh0ZXJuIGludCB0dW5lcl9kZWJ1ZzsgXAogCWlmICh0dW5lcl9kZWJ1ZykgXAotCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgJWQtJTA0eDogIiBmbXQsIFwKLQkJCXQtPmkyYy5kcml2ZXItPmRyaXZlci5uYW1lLCBcCi0JCQl0LT5pMmMuYWRhcHRlci0+bnIsIHQtPmkyYy5hZGRyICwgIyNhcmcpOyB9IHdoaWxlICgwKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgJWQtJTA0eDogIiBmbXQsIHQtPmkyYy5kcml2ZXItPmRyaXZlci5uYW1lLCBcCisJCQlpMmNfYWRhcHRlcl9pZCh0LT5pMmMuYWRhcHRlciksIHQtPmkyYy5hZGRyICwgIyNhcmcpOyB9IHdoaWxlICgwKQogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItY29tbW9uLmggYi9pbmNsdWRlL21lZGlhL3Y0bDItY29tbW9uLmgKaW5kZXggZDNmZDQ4MS4uZDQwMzBhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLWNvbW1vbi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1jb21tb24uaApAQCAtMjYsMTIgKzI2LDU2IEBACiAjaWZuZGVmIFY0TDJfQ09NTU9OX0hfCiAjZGVmaW5lIFY0TDJfQ09NTU9OX0hfCiAKLS8qIFZJRElPQ19JTlRfQVVESU9fQ0xPQ0tfRlJFUSAqLwotZW51bSB2NGwyX2F1ZGlvX2Nsb2NrX2ZyZXEgewotCVY0TDJfQVVEQ0xLXzMyX0tIWiAgPSAzMjAwMCwKLQlWNEwyX0FVRENMS180NDFfS0haID0gNDQxMDAsCi0JVjRMMl9BVURDTEtfNDhfS0haICA9IDQ4MDAwLAotfTsKKy8qIHY0bCBkZWJ1Z2dpbmcgYW5kIGRpYWdub3N0aWNzICovCisKKy8qIENvbW1vbiBwcmludGsgY29uc3R1Y3RzIGZvciB2NGwtaTJjIGRyaXZlcnMuIFRoZXNlIG1hY3JvcyBjcmVhdGUgYSB1bmlxdWUKKyAgIHByZWZpeCBjb25zaXN0aW5nIG9mIHRoZSBkcml2ZXIgbmFtZSwgdGhlIGFkYXB0ZXIgbnVtYmVyIGFuZCB0aGUgaTJjCisgICBhZGRyZXNzLiAqLworI2RlZmluZSB2NGxfcHJpbnRrKGxldmVsLCBuYW1lLCBhZGFwdGVyLCBhZGRyLCBmbXQsIGFyZy4uLikgXAorCXByaW50ayhsZXZlbCAiJXMgJWQtJTA0eDogIiBmbXQsIG5hbWUsIGkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpLCBhZGRyICwgIyMgYXJnKQorCisjZGVmaW5lIHY0bF9jbGllbnRfcHJpbnRrKGxldmVsLCBjbGllbnQsIGZtdCwgYXJnLi4uKQkJCSAgICBcCisJdjRsX3ByaW50ayhsZXZlbCwgKGNsaWVudCktPmRyaXZlci0+ZHJpdmVyLm5hbWUsIChjbGllbnQpLT5hZGFwdGVyLCBcCisJCSAgIChjbGllbnQpLT5hZGRyLCBmbXQgLCAjIyBhcmcpCisKKyNkZWZpbmUgdjRsX2VycihjbGllbnQsIGZtdCwgYXJnLi4uKSBcCisJdjRsX2NsaWVudF9wcmludGsoS0VSTl9FUlIsIGNsaWVudCwgZm10ICwgIyMgYXJnKQorCisjZGVmaW5lIHY0bF93YXJuKGNsaWVudCwgZm10LCBhcmcuLi4pIFwKKwl2NGxfY2xpZW50X3ByaW50ayhLRVJOX1dBUk5JTkcsIGNsaWVudCwgZm10ICwgIyMgYXJnKQorCisjZGVmaW5lIHY0bF9pbmZvKGNsaWVudCwgZm10LCBhcmcuLi4pIFwKKwl2NGxfY2xpZW50X3ByaW50ayhLRVJOX0lORk8sIGNsaWVudCwgZm10ICwgIyMgYXJnKQorCisvKiBUaGVzZSB0aHJlZSBtYWNyb3MgYXNzdW1lIHRoYXQgdGhlIGRlYnVnIGxldmVsIGlzIHNldCB3aXRoIGEgbW9kdWxlCisgICBwYXJhbWV0ZXIgY2FsbGVkICdkZWJ1ZycuICovCisjZGVmaW5lIHY0bF9kYmcobGV2ZWwsIGRlYnVnLCBjbGllbnQsIGZtdCwgYXJnLi4uKQkJCSAgICAgXAorCWRvIHsgCQkJCQkJCQkgICAgIFwKKwkJaWYgKGRlYnVnID49IChsZXZlbCkpCQkJCQkgICAgIFwKKwkJCXY0bF9jbGllbnRfcHJpbnRrKEtFUk5fREVCVUcsIGNsaWVudCwgZm10ICwgIyMgYXJnKTsgXAorCX0gd2hpbGUgKDApCisKKy8qIFByaW50cyB0aGUgaW9jdGwgaW4gYSBodW1hbi1yZWFkYWJsZSBmb3JtYXQgKi8KK2V4dGVybiB2b2lkIHY0bF9wcmludGtfaW9jdGwodW5zaWduZWQgaW50IGNtZCk7CisKKy8qIFVzZSB0aGlzIG1hY3JvIGZvciBub24tSTJDIGRyaXZlcnMuIFBhc3MgdGhlIGRyaXZlciBuYW1lIGFzIHRoZSBmaXJzdCBhcmcuICovCisjZGVmaW5lIHY0bF9wcmludF9pb2N0bChuYW1lLCBjbWQpICAJCSBcCisJZG8geyAgCQkJCQkgXAorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIsIG5hbWUpOyBcCisJCXY0bF9wcmludGtfaW9jdGwoY21kKTsJCSBcCisJfSB3aGlsZSAoMCkKKworLyogVXNlIHRoaXMgbWFjcm8gaW4gSTJDIGRyaXZlcnMgd2hlcmUgJ2NsaWVudCcgaXMgdGhlIHN0cnVjdCBpMmNfY2xpZW50CisgICBwb2ludGVyICovCisjZGVmaW5lIHY0bF9pMmNfcHJpbnRfaW9jdGwoY2xpZW50LCBjbWQpIAkJICAgXAorCWRvIHsgICAgICAJCQkJCSAgIFwKKwkJdjRsX2NsaWVudF9wcmludGsoS0VSTl9ERUJVRywgY2xpZW50LCAiIik7IFwKKwkJdjRsX3ByaW50a19pb2N0bChjbWQpOwkJCSAgIFwKKwl9IHdoaWxlICgwKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEludGVybmFsIGlvY3RscyAqLwogCiAvKiBWSURJT0NfSU5UX0dfUkVHSVNURVIgYW5kIFZJRElPQ19JTlRfU19SRUdJU1RFUiAqLwogc3RydWN0IHY0bDJfcmVnaXN0ZXIgewpAQCAtNzAsNiArMTE0LDI3IEBACiAJVjRMMl9JREVOVF9DWDI1ODQzID0gMjQzLAogfTsKIAorLyogYXVkaW8gaW9jdGxzICovCisvKiB2NGwgZGV2aWNlIHdhcyBvcGVuZWQgaW4gUmFkaW8gbW9kZSAqLworI2RlZmluZSBBVURDX1NFVF9SQURJTyAgICAgICAgX0lPKCdkJyw4OCkKKy8qIHNlbGVjdCBmcm9tIFRWLHJhZGlvLGV4dGVybixNVVRFICovCisjZGVmaW5lIEFVRENfU0VUX0lOUFVUICAgICAgICBfSU9XKCdkJyw4OSxpbnQpCisKKy8qIG1zcDM0MDAgaW9jdGw6IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUgKi8KK3N0cnVjdCBtc3BfbWF0cml4IHsKKyAgaW50IGlucHV0OworICBpbnQgb3V0cHV0OworfTsKKyNkZWZpbmUgTVNQX1NFVF9NQVRSSVggICAgIF9JT1coJ20nLDE3LHN0cnVjdCBtc3BfbWF0cml4KQorCisvKiB0dW5lciBpb2N0bHMgKi8KKy8qIFNldHMgdHVuZXIgdHlwZSBhbmQgaXRzIEkyQyBhZGRyICovCisjZGVmaW5lIFRVTkVSX1NFVF9UWVBFX0FERFIgICAgICAgICAgX0lPVygnZCcsOTAsaW50KQorLyogUHV0cyB0dW5lciBvbiBwb3dlcnNhdmluZyBzdGF0ZSwgZGlzYWJsaW5nIGl0LCBleGNlcHQgZm9yIGkyYyAqLworI2RlZmluZSBUVU5FUl9TRVRfU1RBTkRCWSAgICAgICAgICAgIF9JT1coJ2QnLDkxLGludCkKKy8qIFNldHMgdGRhOTg4NyBzcGVjaWZpYyBzdHVmZiwgbGlrZSBwb3J0MSwgcG9ydDIgYW5kIHFzcyAqLworI2RlZmluZSBUREE5ODg3X1NFVF9DT05GSUcgICAgICAgICAgIF9JT1coJ2QnLDkyLGludCkKKwogLyogb25seSBpbXBsZW1lbnRlZCBpZiBDT05GSUdfVklERU9fQURWX0RFQlVHIGlzIGRlZmluZWQgKi8KICNkZWZpbmUJVklESU9DX0lOVF9TX1JFR0lTVEVSIAkJX0lPUiAoJ2QnLCAxMDAsIHN0cnVjdCB2NGwyX3JlZ2lzdGVyKQogI2RlZmluZQlWSURJT0NfSU5UX0dfUkVHSVNURVIgCQlfSU9XUignZCcsIDEwMSwgc3RydWN0IHY0bDJfcmVnaXN0ZXIpCkBAIC03NywxMCArMTQyLDEyIEBACiAvKiBSZXNldCB0aGUgSTJDIGNoaXAgKi8KICNkZWZpbmUgVklESU9DX0lOVF9SRVNFVCAgICAgICAgICAgIAlfSU8gICgnZCcsIDEwMikKIAotLyogU2V0IHRoZSBmcmVxdWVuY3kgb2YgdGhlIGF1ZGlvIGNsb2NrIG91dHB1dC4KKy8qIFNldCB0aGUgZnJlcXVlbmN5IChpbiBIeikgb2YgdGhlIGF1ZGlvIGNsb2NrIG91dHB1dC4KICAgIFVzZWQgdG8gc2xhdmUgYW4gYXVkaW8gcHJvY2Vzc29yIHRvIHRoZSB2aWRlbyBkZWNvZGVyLCBlbnN1cmluZyB0aGF0IGF1ZGlvCi0gICBhbmQgdmlkZW8gcmVtYWluIHN5bmNocm9uaXplZC4gKi8KLSNkZWZpbmUgVklESU9DX0lOVF9BVURJT19DTE9DS19GUkVRIAlfSU9SICgnZCcsIDEwMywgZW51bSB2NGwyX2F1ZGlvX2Nsb2NrX2ZyZXEpCisgICBhbmQgdmlkZW8gcmVtYWluIHN5bmNocm9uaXplZC4KKyAgIFVzdWFsIHZhbHVlcyBmb3IgdGhlIGZyZXF1ZW5jeSBhcmUgNDgwMDAsIDQ0MTAwIG9yIDMyMDAwIEh6LgorICAgSWYgdGhlIGZyZXF1ZW5jeSBpcyBub3Qgc3VwcG9ydGVkLCB0aGVuIC1FSU5WQUwgaXMgcmV0dXJuZWQuICovCisjZGVmaW5lIFZJRElPQ19JTlRfQVVESU9fQ0xPQ0tfRlJFUSAJX0lPVyAoJ2QnLCAxMDMsIHUzMikKIAogLyogVmlkZW8gZGVjb2RlcnMgdGhhdCBzdXBwb3J0IHNsaWNlZCBWQkkgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBpb2N0bC4KICAgIEZpZWxkIHAgb2YgdGhlIHY0bDJfc2xpY2VkX3ZiaV9saW5lIHN0cnVjdCBpcyBzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBWQkkKQEAgLTEwNyw0ICsxNzQsMTAgQEAKICAgIGJlIG1hZGUuICovCiAjZGVmaW5lIFZJRElPQ19JTlRfR19DSElQX0lERU5UCQlfSU9SICgnZCcsIDEwNywgZW51bSB2NGwyX2NoaXBfaWRlbnQgKikKIAorLyogU2V0cyBJMlMgc3BlZWQgaW4gYnBzLiBUaGlzIGlzIHVzZWQgdG8gcHJvdmlkZSBhIHN0YW5kYXJkIHdheSB0byBzZWxlY3QgSTJTCisgICBjbG9jayB1c2VkIGJ5IGRyaXZpbmcgZGlnaXRhbCBhdWRpbyBzdHJlYW1zIGF0IHNvbWUgYm9hcmQgZGVzaWducy4KKyAgIFVzdWFsIHZhbHVlcyBmb3IgdGhlIGZyZXF1ZW5jeSBhcmUgMTAyNDAwMCBhbmQgMjA0ODAwMC4KKyAgIElmIHRoZSBmcmVxdWVuY3kgaXMgbm90IHN1cHBvcnRlZCwgdGhlbiAtRUlOVkFMIGlzIHJldHVybmVkLiAqLworI2RlZmluZSBWSURJT0NfSU5UX0kyU19DTE9DS19GUkVRIAlfSU9XICgnZCcsIDEwOCwgdTMyKQorCiAjZW5kaWYgLyogVjRMMl9DT01NT05fSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2FjdF9hcGkuaCBiL2luY2x1ZGUvbmV0L2FjdF9hcGkuaAppbmRleCBiNTVlYjdjLi4xMWU5ZWFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9hY3RfYXBpLmgKKysrIGIvaW5jbHVkZS9uZXQvYWN0X2FwaS5oCkBAIC02Myw3ICs2Myw3IEBACiAJX191MzIgICB0eXBlOyAvKiBUQkQgdG8gbWF0Y2gga2luZCAqLwogCV9fdTMyIAljYXBhYjsgIC8qIGNhcGFiaWxpdGllcyBpbmNsdWRlcyA0IGJpdCB2ZXJzaW9uICovCiAJc3RydWN0IG1vZHVsZQkJKm93bmVyOwotCWludCAgICAgKCphY3QpKHN0cnVjdCBza19idWZmICoqLCBzdHJ1Y3QgdGNfYWN0aW9uICosIHN0cnVjdCB0Y2ZfcmVzdWx0ICopOworCWludCAgICAgKCphY3QpKHN0cnVjdCBza19idWZmICosIHN0cnVjdCB0Y19hY3Rpb24gKiwgc3RydWN0IHRjZl9yZXN1bHQgKik7CiAJaW50ICAgICAoKmdldF9zdGF0cykoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IHRjX2FjdGlvbiAqKTsKIAlpbnQgICAgICgqZHVtcCkoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IHRjX2FjdGlvbiAqLGludCAsIGludCk7CiAJaW50ICAgICAoKmNsZWFudXApKHN0cnVjdCB0Y19hY3Rpb24gKiwgaW50IGJpbmQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZG5fZGV2LmggYi9pbmNsdWRlL25ldC9kbl9kZXYuaAppbmRleCA4NmU4ZTg2Li41YTg2ZTc4IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9kbl9kZXYuaAorKysgYi9pbmNsdWRlL25ldC9kbl9kZXYuaApAQCAtODgsOCArODgsOCBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IGRuX2Rldl9wYXJtcyBwYXJtczsKIAljaGFyIHVzZV9sb25nOwotICAgICAgICBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKLSAgICAgICAgdW5zaWduZWQgbG9uZyB0MzsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwl1bnNpZ25lZCBsb25nIHQzOwogCXN0cnVjdCBuZWlnaF9wYXJtcyAqbmVpZ2hfcGFybXM7CiAJdW5zaWduZWQgY2hhciBhZGRyW0VUSF9BTEVOXTsKIAlzdHJ1Y3QgbmVpZ2hib3VyICpyb3V0ZXI7IC8qIERlZmF1bHQgcm91dGVyIG9uIGNpcmN1aXQgKi8KQEAgLTk5LDU3ICs5OSw1NyBAQAogCiBzdHJ1Y3QgZG5fc2hvcnRfcGFja2V0CiB7Ci0JdW5zaWduZWQgY2hhciAgIG1zZ2ZsZyAgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgIGRzdG5vZGUgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgIHNyY25vZGUgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIGZvcndhcmQgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLX07CisJdW5zaWduZWQgY2hhciAgIG1zZ2ZsZzsKKwl1bnNpZ25lZCBzaG9ydCAgZHN0bm9kZTsKKwl1bnNpZ25lZCBzaG9ydCAgc3Jjbm9kZTsKKwl1bnNpZ25lZCBjaGFyICAgZm9yd2FyZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBkbl9sb25nX3BhY2tldAogewotCXVuc2lnbmVkIGNoYXIgICBtc2dmbGcgICAgICAgICAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICBkX2FyZWEgICAgICAgICAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICBkX3N1YmFyZWEgICAgICAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICBkX2lkWzZdICAgICAgICAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICBzX2FyZWEgICAgICAgICAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICBzX3N1YmFyZWEgICAgICAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICBzX2lkWzZdICAgICAgICAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICBubDIgICAgICAgICAgICAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICB2aXNpdF9jdCAgICAgICAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICBzX2NsYXNzICAgICAgICAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICBwdCAgICAgICAgICAgICAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci19OworCXVuc2lnbmVkIGNoYXIgICBtc2dmbGc7CisJdW5zaWduZWQgY2hhciAgIGRfYXJlYTsKKwl1bnNpZ25lZCBjaGFyICAgZF9zdWJhcmVhOworCXVuc2lnbmVkIGNoYXIgICBkX2lkWzZdOworCXVuc2lnbmVkIGNoYXIgICBzX2FyZWE7CisJdW5zaWduZWQgY2hhciAgIHNfc3ViYXJlYTsKKwl1bnNpZ25lZCBjaGFyICAgc19pZFs2XTsKKwl1bnNpZ25lZCBjaGFyICAgbmwyOworCXVuc2lnbmVkIGNoYXIgICB2aXNpdF9jdDsKKwl1bnNpZ25lZCBjaGFyICAgc19jbGFzczsKKwl1bnNpZ25lZCBjaGFyICAgcHQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRFJQIC0gUm91dGluZyBtZXNzYWdlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiBzdHJ1Y3QgZW5kbm9kZV9oZWxsb19tZXNzYWdlCiB7Ci0JdW5zaWduZWQgY2hhciAgIG1zZ2ZsZyAgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIHRpdmVyWzNdICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIGlkWzZdICAgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIGlpbmZvICAgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgIGJsa3NpemUgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIGFyZWEgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIHNlZWRbOF0gICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIG5laWdoYm9yWzZdICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgIHRpbWVyICAgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIG1wZCAgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIGRhdGFsZW4gICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIGRhdGFbMl0gICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLX07CisJdW5zaWduZWQgY2hhciAgIG1zZ2ZsZzsKKwl1bnNpZ25lZCBjaGFyICAgdGl2ZXJbM107CisJdW5zaWduZWQgY2hhciAgIGlkWzZdOworCXVuc2lnbmVkIGNoYXIgICBpaW5mbzsKKwl1bnNpZ25lZCBzaG9ydCAgYmxrc2l6ZTsKKwl1bnNpZ25lZCBjaGFyICAgYXJlYTsKKwl1bnNpZ25lZCBjaGFyICAgc2VlZFs4XTsKKwl1bnNpZ25lZCBjaGFyICAgbmVpZ2hib3JbNl07CisJdW5zaWduZWQgc2hvcnQgIHRpbWVyOworCXVuc2lnbmVkIGNoYXIgICBtcGQ7CisJdW5zaWduZWQgY2hhciAgIGRhdGFsZW47CisJdW5zaWduZWQgY2hhciAgIGRhdGFbMl07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgcnRub2RlX2hlbGxvX21lc3NhZ2UKIHsKLQl1bnNpZ25lZCBjaGFyICAgbXNnZmxnICAgICAgICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgdGl2ZXJbM10gICAgICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgaWRbNl0gICAgICAgICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgaWluZm8gICAgICAgICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCAgYmxrc2l6ZSAgICAgICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgcHJpb3JpdHkgICAgICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgYXJlYSAgICAgICAgICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCAgdGltZXIgICAgICAgICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgbXBkICAgICAgICAgICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotfTsKKwl1bnNpZ25lZCBjaGFyICAgbXNnZmxnOworCXVuc2lnbmVkIGNoYXIgICB0aXZlclszXTsKKwl1bnNpZ25lZCBjaGFyICAgaWRbNl07CisJdW5zaWduZWQgY2hhciAgIGlpbmZvOworCXVuc2lnbmVkIHNob3J0ICBibGtzaXplOworCXVuc2lnbmVkIGNoYXIgICBwcmlvcml0eTsKKwl1bnNpZ25lZCBjaGFyICAgYXJlYTsKKwl1bnNpZ25lZCBzaG9ydCAgdGltZXI7CisJdW5zaWduZWQgY2hhciAgIG1wZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIAogZXh0ZXJuIHZvaWQgZG5fZGV2X2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9kbl9uc3AuaCBiL2luY2x1ZGUvbmV0L2RuX25zcC5oCmluZGV4IDFiYTAzYmUuLmU2MTgyYjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2RuX25zcC5oCisrKyBiL2luY2x1ZGUvbmV0L2RuX25zcC5oCkBAIC03Miw3OCArNzIsNzggQEAKIAogc3RydWN0IG5zcF9kYXRhX3NlZ19tc2cKIHsKLQl1bnNpZ25lZCBjaGFyICAgbXNnZmxnICAgICAgICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCXVuc2lnbmVkIHNob3J0ICBkc3RhZGRyICAgICAgICAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JdW5zaWduZWQgc2hvcnQgIHNyY2FkZHIgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLX07CisJdW5zaWduZWQgY2hhciAgIG1zZ2ZsZzsKKwl1bnNpZ25lZCBzaG9ydCAgZHN0YWRkcjsKKwl1bnNpZ25lZCBzaG9ydCAgc3JjYWRkcjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBuc3BfZGF0YV9vcHRfbXNnCiB7Ci0JdW5zaWduZWQgc2hvcnQgIGFja251bSAgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQl1bnNpZ25lZCBzaG9ydCAgc2VnbnVtICAgICAgICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCXVuc2lnbmVkIHNob3J0ICBsc2ZsZ3MgICAgICAgICAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci19OworCXVuc2lnbmVkIHNob3J0ICBhY2tudW07CisJdW5zaWduZWQgc2hvcnQgIHNlZ251bTsKKwl1bnNpZ25lZCBzaG9ydCAgbHNmbGdzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IG5zcF9kYXRhX29wdF9tc2cxCiB7Ci0JdW5zaWduZWQgc2hvcnQgIGFja251bSAgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQl1bnNpZ25lZCBzaG9ydCAgc2VnbnVtICAgICAgICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotfTsKKwl1bnNpZ25lZCBzaG9ydCAgYWNrbnVtOworCXVuc2lnbmVkIHNob3J0ICBzZWdudW07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAKIC8qIEFja25vd2xlZGdtZW50IE1lc3NhZ2UgKGRhdGEvb3RoZXIgZGF0YSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiBzdHJ1Y3QgbnNwX2RhdGFfYWNrX21zZwogewotCXVuc2lnbmVkIGNoYXIgICBtc2dmbGcgICAgICAgICAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JdW5zaWduZWQgc2hvcnQgIGRzdGFkZHIgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQl1bnNpZ25lZCBzaG9ydCAgc3JjYWRkciAgICAgICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCXVuc2lnbmVkIHNob3J0ICBhY2tudW0gICAgICAgICAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci19OworCXVuc2lnbmVkIGNoYXIgICBtc2dmbGc7CisJdW5zaWduZWQgc2hvcnQgIGRzdGFkZHI7CisJdW5zaWduZWQgc2hvcnQgIHNyY2FkZHI7CisJdW5zaWduZWQgc2hvcnQgIGFja251bTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIENvbm5lY3QgQWNrbm93bGVkZ21lbnQgTWVzc2FnZSAqLwogc3RydWN0ICBuc3BfY29ubl9hY2tfbXNnCiB7Ci0JdW5zaWduZWQgY2hhciAgIG1zZ2ZsZyAgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQl1bnNpZ25lZCBzaG9ydCAgZHN0YWRkciAgICAgICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotfTsKKwl1bnNpZ25lZCBjaGFyICAgbXNnZmxnOworCXVuc2lnbmVkIHNob3J0ICBkc3RhZGRyOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogCiAvKiBDb25uZWN0IEluaXRpYXRlL1JldHJhbnNtaXQgSW5pdGlhdGUvQ29ubmVjdCBDb25maXJtICovCiBzdHJ1Y3QgIG5zcF9jb25uX2luaXRfbXNnCiB7Ci0JdW5zaWduZWQgY2hhciAgIG1zZ2ZsZyAgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwl1bnNpZ25lZCBjaGFyICAgbXNnZmxnOwogI2RlZmluZSBOU1BfQ0kgICAgICAweDE4ICAgICAgICAgICAgLyogQ29ubmVjdCBJbml0aWF0ZSAgICAgKi8KICNkZWZpbmUgTlNQX1JDSSAgICAgMHg2OCAgICAgICAgICAgIC8qIFJldHJhbnMuIENvbm4gSW5pdCAgICovCi0JdW5zaWduZWQgc2hvcnQgIGRzdGFkZHIgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgIHNyY2FkZHIgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIHNlcnZpY2VzICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwl1bnNpZ25lZCBzaG9ydCAgZHN0YWRkcjsKKwl1bnNpZ25lZCBzaG9ydCAgc3JjYWRkcjsKKwl1bnNpZ25lZCBjaGFyICAgc2VydmljZXM7CiAjZGVmaW5lIE5TUF9GQ19OT05FICAgMHgwMCAgICAgICAgICAgIC8qIEZsb3cgQ29udHJvbCBOb25lICAgICovCiAjZGVmaW5lIE5TUF9GQ19TUkMgICAgMHgwNCAgICAgICAgICAgIC8qIFNlZyBSZXEuIENvdW50ICAgICAgICovCiAjZGVmaW5lIE5TUF9GQ19TQ01DICAgMHgwOCAgICAgICAgICAgIC8qIFNlc3MuIENvbnRyb2wgTWVzcyAgICovCiAjZGVmaW5lIE5TUF9GQ19NQVNLICAgMHgwYyAgICAgICAgICAgIC8qIEZDIHR5cGUgbWFzayAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciAgIGluZm8gICAgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgIHNlZ3NpemUgICAgICAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLX07CisJdW5zaWduZWQgY2hhciAgIGluZm87CisJdW5zaWduZWQgc2hvcnQgIHNlZ3NpemU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBEaXNjb25uZWN0IEluaXRpYXRlL0Rpc2Nvbm5lY3QgQ29uZmlybSAqLwogc3RydWN0ICBuc3BfZGlzY29ubl9pbml0X21zZwogewotCXVuc2lnbmVkIGNoYXIgICBtc2dmbGcgICAgICAgICAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0ICBkc3RhZGRyICAgICAgICAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0ICBzcmNhZGRyICAgICAgICAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0ICByZWFzb24gICAgICAgICAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci19OworCXVuc2lnbmVkIGNoYXIgICBtc2dmbGc7CisJdW5zaWduZWQgc2hvcnQgIGRzdGFkZHI7CisJdW5zaWduZWQgc2hvcnQgIHNyY2FkZHI7CisJdW5zaWduZWQgc2hvcnQgIHJlYXNvbjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIAogCiBzdHJ1Y3QgIHNyY29ial9mbXQKIHsKLQljaGFyICAgICAgICAgICAgZm9ybWF0ICAgICAgICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgdGFzayAgICAgICAgICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCAgZ3JwY29kZSAgICAgICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCAgdXNyY29kZSAgICAgICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotICAgICAgICBjaGFyICAgICAgICAgICAgZGxlbiAgICAgICAgICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotfTsKKwljaGFyICAgICAgICAgICAgZm9ybWF0OworCXVuc2lnbmVkIGNoYXIgICB0YXNrOworCXVuc2lnbmVkIHNob3J0ICBncnBjb2RlOworCXVuc2lnbmVkIHNob3J0ICB1c3Jjb2RlOworCWNoYXIgICAgICAgICAgICBkbGVuOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyoKICAqIEEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyB0aGUgc2VxdWVuY2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2RzdC5oIGIvaW5jbHVkZS9uZXQvZHN0LmgKaW5kZXggYmVlOGI4NC4uNTE2MWU4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZHN0LmgKKysrIGIvaW5jbHVkZS9uZXQvZHN0LmgKQEAgLTIyNSwxNiArMjI1LDcgQEAKIC8qIE91dHB1dCBwYWNrZXQgdG8gbmV0d29yayBmcm9tIHRyYW5zcG9ydC4gICovCiBzdGF0aWMgaW5saW5lIGludCBkc3Rfb3V0cHV0KHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaW50IGVycjsKLQotCWZvciAoOzspIHsKLQkJZXJyID0gc2tiLT5kc3QtPm91dHB1dChza2IpOwotCi0JCWlmIChsaWtlbHkoZXJyID09IDApKQotCQkJcmV0dXJuIGVycjsKLQkJaWYgKHVubGlrZWx5KGVyciAhPSBORVRfWE1JVF9CWVBBU1MpKQotCQkJcmV0dXJuIGVycjsKLQl9CisJcmV0dXJuIHNrYi0+ZHN0LT5vdXRwdXQoc2tiKTsKIH0KIAogLyogSW5wdXQgcGFja2V0IGZyb20gbmV0d29yayB0byB0cmFuc3BvcnQuICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZ2VuZXRsaW5rLmggYi9pbmNsdWRlL25ldC9nZW5ldGxpbmsuaAppbmRleCBjNWI5NmIyLi44MDVkZTUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9nZW5ldGxpbmsuaAorKysgYi9pbmNsdWRlL25ldC9nZW5ldGxpbmsuaApAQCAtMjIsNyArMjIsNiBAQAogCWNoYXIJCQluYW1lW0dFTkxfTkFNU0laXTsKIAl1bnNpZ25lZCBpbnQJCXZlcnNpb247CiAJdW5zaWduZWQgaW50CQltYXhhdHRyOwotCXN0cnVjdCBtb2R1bGUgKgkJb3duZXI7CiAJc3RydWN0IG5sYXR0ciAqKglhdHRyYnVmOwkvKiBwcml2YXRlICovCiAJc3RydWN0IGxpc3RfaGVhZAlvcHNfbGlzdDsJLyogcHJpdmF0ZSAqLwogCXN0cnVjdCBsaXN0X2hlYWQJZmFtaWx5X2xpc3Q7CS8qIHByaXZhdGUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2llZWU4MDIxMS5oIGIvaW5jbHVkZS9uZXQvaWVlZTgwMjExLmgKaW5kZXggY2RlMmY0Zi4uZGYwNWY0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaWVlZTgwMjExLmgKKysrIGIvaW5jbHVkZS9uZXQvaWVlZTgwMjExLmgKQEAgLTM2Myw4ICszNjMsOSBAQAogI2RlZmluZSBJRUVFODAyMTFfT0ZETV9TSElGVF9NQVNLX0EgICAgICAgICA0CiAKIC8qIE5PVEU6IFRoaXMgZGF0YSBpcyBmb3Igc3RhdGlzdGljYWwgcHVycG9zZXM7IG5vdCBhbGwgaGFyZHdhcmUgcHJvdmlkZXMgdGhpcwotICogICAgICAgaW5mb3JtYXRpb24gZm9yIGZyYW1lcyByZWNlaXZlZC4gIE5vdCBzZXR0aW5nIHRoZXNlIHdpbGwgbm90IGNhdXNlCi0gKiAgICAgICBhbnkgYWR2ZXJzZSBhZmZlY3RzLiAqLworICogICAgICAgaW5mb3JtYXRpb24gZm9yIGZyYW1lcyByZWNlaXZlZC4KKyAqICAgICAgIEZvciBpZWVlODAyMTFfcnhfbWd0LCB5b3UgbmVlZCB0byBzZXQgYXQgbGVhc3QgdGhlICdsZW4nIHBhcmFtZXRlci4KKyAqLwogc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyB7CiAJdTMyIG1hY190aW1lOwogCXM4IHJzc2k7CkBAIC0xMDg4LDYgKzEwODksNyBAQAogLyogaWVlZTgwMjExX3J4LmMgKi8KIGV4dGVybiBpbnQgaWVlZTgwMjExX3J4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMpOworLyogbWFrZSBzdXJlIHRvIHNldCBzdGF0cy0+bGVuICovCiBleHRlcm4gdm9pZCBpZWVlODAyMTFfcnhfbWd0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAogCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGVhZGVyLAogCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pZWVlODAyMTFfY3J5cHQuaCBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMV9jcnlwdC5oCmluZGV4IDAzYjc2NmEuLmNkODJjM2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2llZWU4MDIxMV9jcnlwdC5oCisrKyBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMV9jcnlwdC5oCkBAIC0yNSw2ICsyNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxuZXQvaWVlZTgwMjExLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCiBlbnVtIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2luZXRfY29ubmVjdGlvbl9zb2NrLmggYi9pbmNsdWRlL25ldC9pbmV0X2Nvbm5lY3Rpb25fc29jay5oCmluZGV4IDUwMjM0ZmEuLmZhNTg3YzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRfY29ubmVjdGlvbl9zb2NrLmgKKysrIGIvaW5jbHVkZS9uZXQvaW5ldF9jb25uZWN0aW9uX3NvY2suaApAQCAtODMsOCArODMsOCBAQAogIAlzdHJ1Y3QgdGltZXJfbGlzdAkgIGljc2tfZGVsYWNrX3RpbWVyOwogCV9fdTMyCQkJICBpY3NrX3J0bzsKIAlfX3UzMgkJCSAgaWNza19wbXR1X2Nvb2tpZTsKLQlzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzICppY3NrX2NhX29wczsKLQlzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2tfYWZfb3BzICppY3NrX2FmX29wczsKKwljb25zdCBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzICppY3NrX2NhX29wczsKKwljb25zdCBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2tfYWZfb3BzICppY3NrX2FmX29wczsKIAl1bnNpZ25lZCBpbnQJCSAgKCppY3NrX3N5bmNfbXNzKShzdHJ1Y3Qgc29jayAqc2ssIHUzMiBwbXR1KTsKIAlfX3U4CQkJICBpY3NrX2NhX3N0YXRlOwogCV9fdTgJCQkgIGljc2tfcmV0cmFuc21pdHM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcC5oIGIvaW5jbHVkZS9uZXQvaXAuaAppbmRleCA3YmI1ODA0Li44ZGUwNjk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcC5oCisrKyBiL2luY2x1ZGUvbmV0L2lwLmgKQEAgLTM3LDExICszNywxMCBAQAogCXN0cnVjdCBpcF9vcHRpb25zCW9wdDsJCS8qIENvbXBpbGVkIElQIG9wdGlvbnMJCSovCiAJdW5zaWduZWQgY2hhcgkJZmxhZ3M7CiAKLSNkZWZpbmUgSVBTS0JfTUFTUVVFUkFERUQJMQotI2RlZmluZSBJUFNLQl9UUkFOU0xBVEVECTIKLSNkZWZpbmUgSVBTS0JfRk9SV0FSREVECQk0Ci0jZGVmaW5lIElQU0tCX1hGUk1fVFVOTkVMX1NJWkUJOAotI2RlZmluZSBJUFNLQl9GUkFHX0NPTVBMRVRFCTE2CisjZGVmaW5lIElQU0tCX0ZPUldBUkRFRAkJMQorI2RlZmluZSBJUFNLQl9YRlJNX1RVTk5FTF9TSVpFCTIKKyNkZWZpbmUgSVBTS0JfWEZSTV9UUkFOU0ZPUk1FRAk0CisjZGVmaW5lIElQU0tCX0ZSQUdfQ09NUExFVEUJOAogfTsKIAogc3RydWN0IGlwY21fY29va2llCkBAIC05NSw3ICs5NCw2IEBACiBleHRlcm4gaW50CQlpcF9tcl9pbnB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGV4dGVybiBpbnQJCWlwX291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGV4dGVybiBpbnQJCWlwX21jX291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWV4dGVybiBpbnQJCWlwX2ZyYWdtZW50KHN0cnVjdCBza19idWZmICpza2IsIGludCAoKm91dCkoc3RydWN0IHNrX2J1ZmYqKSk7CiBleHRlcm4gaW50CQlpcF9kb19uYXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gdm9pZAkJaXBfc2VuZF9jaGVjayhzdHJ1Y3QgaXBoZHIgKmlwKTsKIGV4dGVybiBpbnQJCWlwX3F1ZXVlX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGlwZnJhZ29rKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwdjYuaCBiL2luY2x1ZGUvbmV0L2lwdjYuaAppbmRleCA4NjBiYmFjLi4zYjFkOTYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcHY2LmgKKysrIGIvaW5jbHVkZS9uZXQvaXB2Ni5oCkBAIC00MTgsNiArNDE4LDggQEAKIAkJCQkJIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHQsCiAJCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpOwogCitleHRlcm4gaW50CQkJaXA2X3Jjdl9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKIC8qCiAgKgl1cHBlci1sYXllciBvdXRwdXQgZnVuY3Rpb25zCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2l3X2hhbmRsZXIuaCBiL2luY2x1ZGUvbmV0L2l3X2hhbmRsZXIuaAppbmRleCBkNjdjODM5Li5hMmM1ZTBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pd19oYW5kbGVyLmgKKysrIGIvaW5jbHVkZS9uZXQvaXdfaGFuZGxlci5oCkBAIC0zMjcsNyArMzI3LDcgQEAKIAlfX3UxNgkJCW51bV9wcml2YXRlX2FyZ3M7CiAKIAkvKiBBcnJheSBvZiBoYW5kbGVycyBmb3Igc3RhbmRhcmQgaW9jdGxzCi0JICogV2Ugd2lsbCBjYWxsIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnN0YW5kYXJkW2lvY3RsIC0gU0lPQ1NJV05BTUVdCisJICogV2Ugd2lsbCBjYWxsIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnN0YW5kYXJkW2lvY3RsIC0gU0lPQ1NJV0NPTU1JVF0KIAkgKi8KIAljb25zdCBpd19oYW5kbGVyICoJc3RhbmRhcmQ7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9pcHY0L25mX2Nvbm50cmFja19pcHY0LmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvaXB2NC9uZl9jb25udHJhY2tfaXB2NC5oCmluZGV4IDI1YjA4MWEuLjkxNjg0NDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9pcHY0L25mX2Nvbm50cmFja19pcHY0LmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL2lwdjQvbmZfY29ubnRyYWNrX2lwdjQuaApAQCAtMzcsNyArMzcsNCBAQAogc3RydWN0IHNrX2J1ZmYgKgogbmZfY3RfaXB2NF9jdF9nYXRoZXJfZnJhZ3Moc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKLS8qIGNhbGwgdG8gY3JlYXRlIGFuIGV4cGxpY2l0IGRlcGVuZGVuY3kgb24gbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NC4gKi8KLWV4dGVybiB2b2lkIG5lZWRfaXBfY29ubnRyYWNrKHZvaWQpOwotCiAjZW5kaWYgLypfTkZfQ09OTlRSQUNLX0lQVjRfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKaW5kZXggNjRiODJiNy4uNmQwNzVjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaApAQCAtMjIxLDkgKzIyMSw2IEBACiBleHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKgogX19uZl9jb25udHJhY2tfaGVscGVyX2ZpbmRfYnluYW1lKGNvbnN0IGNoYXIgKm5hbWUpOwogCi0vKiBjYWxsIHRvIGNyZWF0ZSBhbiBleHBsaWNpdCBkZXBlbmRlbmN5IG9uIG5mX2Nvbm50cmFjay4gKi8KLWV4dGVybiB2b2lkIG5lZWRfbmZfY29ubnRyYWNrKHZvaWQpOwotCiBleHRlcm4gaW50IG5mX2N0X2ludmVydF90dXBsZXByKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKmludmVyc2UsCiAJCQkJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqb3JpZyk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGUuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGUuaAppbmRleCAxNGNlNzkwLi41MzBlZjFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZS5oCkBAIC0xMTEsNyArMTExLDcgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNkZWZpbmUgTkZfQ1RfRFVNUF9UVVBMRSh0cCkJCQkJCQkgICAgXAotREVCVUdQKCJ0dXBsZSAlcDogJXUgJXUgJTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4ICVodSAtPiAlMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHggJWh1XG4iLAkJCQkJICAgIFwKK0RFQlVHUCgidHVwbGUgJXA6ICV1ICV1ICIgTklQNl9GTVQgIiAlaHUgLT4gIiBOSVA2X0ZNVCAiICVodVxuIiwJICAgIFwKIAkodHApLCAodHApLT5zcmMubDNudW0sICh0cCktPmRzdC5wcm90b251bSwJCQkgICAgXAogCU5JUDYoKihzdHJ1Y3QgaW42X2FkZHIgKikodHApLT5zcmMudTMuYWxsKSwgbnRvaHMoKHRwKS0+c3JjLnUuYWxsKSwgXAogCU5JUDYoKihzdHJ1Y3QgaW42X2FkZHIgKikodHApLT5kc3QudTMuYWxsKSwgbnRvaHMoKHRwKS0+ZHN0LnUuYWxsKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3BrdF9zY2hlZC5oIGIvaW5jbHVkZS9uZXQvcGt0X3NjaGVkLmgKaW5kZXggNjQ5MmU3My4uYjk0ZDFhZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcGt0X3NjaGVkLmgKKysrIGIvaW5jbHVkZS9uZXQvcGt0X3NjaGVkLmgKQEAgLTEsNiArMSw3IEBACiAjaWZuZGVmIF9fTkVUX1BLVF9TQ0hFRF9ICiAjZGVmaW5lIF9fTkVUX1BLVF9TQ0hFRF9ICiAKKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bmV0L3NjaF9nZW5lcmljLmg+CiAKIHN0cnVjdCBxZGlzY193YWxrZXIKQEAgLTU5LDggKzYwLDggQEAKIHR5cGVkZWYgbG9uZwkJcHNjaGVkX3RkaWZmX3Q7CiAKICNkZWZpbmUgUFNDSEVEX0dFVF9USU1FKHN0YW1wKSBkb19nZXR0aW1lb2ZkYXkoJihzdGFtcCkpCi0jZGVmaW5lIFBTQ0hFRF9VUzJKSUZGSUUodXNlY3MpICgoKHVzZWNzKSsoMTAwMDAwMC9IWi0xKSkvKDEwMDAwMDAvSFopKQotI2RlZmluZSBQU0NIRURfSklGRklFMlVTKGRlbGF5KSAoKGRlbGF5KSooMTAwMDAwMC9IWikpCisjZGVmaW5lIFBTQ0hFRF9VUzJKSUZGSUUodXNlY3MpIHVzZWNzX3RvX2ppZmZpZXModXNlY3MpCisjZGVmaW5lIFBTQ0hFRF9KSUZGSUUyVVMoZGVsYXkpIGppZmZpZXNfdG9fdXNlY3MoZGVsYXkpCiAKICNlbHNlIC8qICFDT05GSUdfTkVUX1NDSF9DTEtfR0VUVElNRU9GREFZICovCiAKQEAgLTEyMyw5ICsxMjQsOSBAQAogCQkgICBkZWZhdWx0OiBcCiAJCQkgICBfX2RlbHRhID0gMDsgXAogCQkgICBjYXNlIDI6IFwKLQkJCSAgIF9fZGVsdGEgKz0gMTAwMDAwMDsgXAorCQkJICAgX19kZWx0YSArPSBVU0VDX1BFUl9TRUM7IFwKIAkJICAgY2FzZSAxOiBcCi0JCQkgICBfX2RlbHRhICs9IDEwMDAwMDA7IFwKKwkJCSAgIF9fZGVsdGEgKz0gVVNFQ19QRVJfU0VDOyBcCiAJICAgICAgICAgICB9IFwKIAkgICB9IFwKIAkgICBfX2RlbHRhOyBcCkBAIC0xMzYsOSArMTM3LDkgQEAKIHsKIAlpbnQgZGVsdGE7CiAKLQlpZiAoYm91bmQgPD0gMTAwMDAwMCB8fCBkZWx0YV9zZWMgPiAoMHg3RkZGRkZGRi8xMDAwMDAwKS0xKQorCWlmIChib3VuZCA8PSBVU0VDX1BFUl9TRUMgfHwgZGVsdGFfc2VjID4gKDB4N0ZGRkZGRkYvVVNFQ19QRVJfU0VDKS0xKQogCQlyZXR1cm4gYm91bmQ7Ci0JZGVsdGEgPSBkZWx0YV9zZWMgKiAxMDAwMDAwOworCWRlbHRhID0gZGVsdGFfc2VjICogVVNFQ19QRVJfU0VDOwogCWlmIChkZWx0YSA+IGJvdW5kIHx8IGRlbHRhIDwgMCkKIAkJZGVsdGEgPSBib3VuZDsKIAlyZXR1cm4gZGVsdGE7CkBAIC0xNTIsOSArMTUzLDkgQEAKIAkgICBkZWZhdWx0OiBcCiAJCSAgIF9fZGVsdGEgPSBwc2NoZWRfdG9kX2RpZmYoX19kZWx0YV9zZWMsIGJvdW5kKTsgIGJyZWFrOyBcCiAJICAgY2FzZSAyOiBcCi0JCSAgIF9fZGVsdGEgKz0gMTAwMDAwMDsgXAorCQkgICBfX2RlbHRhICs9IFVTRUNfUEVSX1NFQzsgXAogCSAgIGNhc2UgMTogXAotCQkgICBfX2RlbHRhICs9IDEwMDAwMDA7IFwKKwkJICAgX19kZWx0YSArPSBVU0VDX1BFUl9TRUM7IFwKIAkgICBjYXNlIDA6IFwKICAJCSAgIGlmIChfX2RlbHRhID4gYm91bmQgfHwgX19kZWx0YSA8IDApIFwKICAJCQlfX2RlbHRhID0gYm91bmQ7IFwKQEAgLTE3MCwxNSArMTcxLDE1IEBACiAoeyBcCiAJICAgaW50IF9fZGVsdGEgPSAodHYpLnR2X3VzZWMgKyAoZGVsdGEpOyBcCiAJICAgKHR2X3JlcykudHZfc2VjID0gKHR2KS50dl9zZWM7IFwKLQkgICBpZiAoX19kZWx0YSA+IDEwMDAwMDApIHsgKHR2X3JlcykudHZfc2VjKys7IF9fZGVsdGEgLT0gMTAwMDAwMDsgfSBcCisJICAgaWYgKF9fZGVsdGEgPiBVU0VDX1BFUl9TRUMpIHsgKHR2X3JlcykudHZfc2VjKys7IF9fZGVsdGEgLT0gVVNFQ19QRVJfU0VDOyB9IFwKIAkgICAodHZfcmVzKS50dl91c2VjID0gX19kZWx0YTsgXAogfSkKIAogI2RlZmluZSBQU0NIRURfVEFERCh0diwgZGVsdGEpIFwKICh7IFwKIAkgICAodHYpLnR2X3VzZWMgKz0gKGRlbHRhKTsgXAotCSAgIGlmICgodHYpLnR2X3VzZWMgPiAxMDAwMDAwKSB7ICh0dikudHZfc2VjKys7IFwKLQkJICh0dikudHZfdXNlYyAtPSAxMDAwMDAwOyB9IFwKKwkgICBpZiAoKHR2KS50dl91c2VjID4gVVNFQ19QRVJfU0VDKSB7ICh0dikudHZfc2VjKys7IFwKKwkJICh0dikudHZfdXNlYyAtPSBVU0VDX1BFUl9TRUM7IH0gXAogfSkKIAogLyogU2V0L2NoZWNrIHRoYXQgdGltZSBpcyBpbiB0aGUgInBhc3QgcGVyZmVjdCI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wcm90b2NvbC5oIGIvaW5jbHVkZS9uZXQvcHJvdG9jb2wuaAppbmRleCA2M2Y3ZGI5Li42ZGM1OTcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9wcm90b2NvbC5oCisrKyBiL2luY2x1ZGUvbmV0L3Byb3RvY29sLmgKQEAgLTQzLDcgKzQzLDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpCiBzdHJ1Y3QgaW5ldDZfcHJvdG9jb2wgCiB7Ci0JaW50CSgqaGFuZGxlcikoc3RydWN0IHNrX2J1ZmYgKipza2IsIHVuc2lnbmVkIGludCAqbmhvZmZwKTsKKwlpbnQJKCpoYW5kbGVyKShzdHJ1Y3Qgc2tfYnVmZiAqKnNrYik7CiAKIAl2b2lkCSgqZXJyX2hhbmRsZXIpKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgICAgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaCBiL2luY2x1ZGUvbmV0L3NjdHAvc2N0cC5oCmluZGV4IDhmMjQxMjEuLmU2NzNiMmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvc2N0cC5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvc2N0cC5oCkBAIC0xNzUsNiArMTc1LDggQEAKIHZvaWQgc2N0cF9pY21wX3Byb3RvX3VucmVhY2hhYmxlKHN0cnVjdCBzb2NrICpzaywKIAkJCQkgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJCQkJIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdCk7Cit2b2lkIHNjdHBfYmFja2xvZ19taWdyYXRlKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc3NvYywKKwkJCSAgc3RydWN0IHNvY2sgKm9sZHNrLCBzdHJ1Y3Qgc29jayAqbmV3c2spOwogCiAvKgogICogIFNlY3Rpb246ICBNYWNyb3MsIGV4dGVybnMsIGFuZCBpbmxpbmVzCkBAIC0yMjUsMTMgKzIyNywxMyBAQAogCWlmIChzY3RwX2RlYnVnX2ZsYWcpIHsgXAogCQlpZiAoc2FkZHItPnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeyBcCiAJCQlwcmludGsoS0VSTl9ERUJVRyBcCi0JCQkgICAgICAgbGVhZCAiJTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4IiB0cmFpbCwgXAorCQkJICAgICAgIGxlYWQgTklQNl9GTVQgdHJhaWwsIFwKIAkJCSAgICAgICBsZWFkcGFybSwgXAogCQkJICAgICAgIE5JUDYoc2FkZHItPnY2LnNpbjZfYWRkciksIFwKIAkJCSAgICAgICBvdGhlcnBhcm1zKTsgXAogCQl9IGVsc2UgeyBcCiAJCQlwcmludGsoS0VSTl9ERUJVRyBcCi0JCQkgICAgICAgbGVhZCAiJXUuJXUuJXUuJXUiIHRyYWlsLCBcCisJCQkgICAgICAgbGVhZCBOSVBRVUFEX0ZNVCB0cmFpbCwgXAogCQkJICAgICAgIGxlYWRwYXJtLCBcCiAJCQkgICAgICAgTklQUVVBRChzYWRkci0+djQuc2luX2FkZHIuc19hZGRyKSwgXAogCQkJICAgICAgIG90aGVycGFybXMpOyBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaCBiL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oCmluZGV4IGY1YzIyZDcuLjhjNTIyYWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oCkBAIC0xMjcsOSArMTI3LDkgQEAKIAkgKiBSVE8uQWxwaGEJCSAgICAtIDEvOCAgKDMgd2hlbiBjb252ZXJ0ZWQgdG8gcmlnaHQgc2hpZnRzLikKIAkgKiBSVE8uQmV0YQkJICAgIC0gMS80ICAoMiB3aGVuIGNvbnZlcnRlZCB0byByaWdodCBzaGlmdHMuKQogCSAqLwotCV9fdTMyIHJ0b19pbml0aWFsOwotCV9fdTMyIHJ0b19taW47Ci0JX191MzIgcnRvX21heDsKKwl1bnNpZ25lZCBsb25nIHJ0b19pbml0aWFsOworCXVuc2lnbmVkIGxvbmcgcnRvX21pbjsKKwl1bnNpZ25lZCBsb25nIHJ0b19tYXg7CiAKIAkvKiBOb3RlOiBydG9fYWxwaGEgYW5kIHJ0b19iZXRhIGFyZSByZWFsbHkgZGVmaW5lZCBhcyBpbnZlcnNlCiAJICogcG93ZXJzIG9mIHR3byB0byBmYWNpbGl0YXRlIGludGVnZXIgb3BlcmF0aW9ucy4KQEAgLTE0MCwxMiArMTQwLDE4IEBACiAJLyogTWF4LkJ1cnN0CQkgICAgLSA0ICovCiAJaW50IG1heF9idXJzdDsKIAotCS8qIFZhbGlkLkNvb2tpZS5MaWZlCSAgICAtIDYwICBzZWNvbmRzICAqLwotCWludCB2YWxpZF9jb29raWVfbGlmZTsKLQogCS8qIFdoZXRoZXIgQ29va2llIFByZXNlcnZhdGl2ZSBpcyBlbmFibGVkKDEpIG9yIG5vdCgwKSAqLwogCWludCBjb29raWVfcHJlc2VydmVfZW5hYmxlOwogCisJLyogVmFsaWQuQ29va2llLkxpZmUJICAgIC0gNjAgIHNlY29uZHMgICovCisJdW5zaWduZWQgbG9uZyB2YWxpZF9jb29raWVfbGlmZTsKKworCS8qIERlbGF5ZWQgU0FDSyB0aW1lb3V0ICAyMDBtcyBkZWZhdWx0Ki8KKwl1bnNpZ25lZCBsb25nIHNhY2tfdGltZW91dDsKKworCS8qIEhCLmludGVydmFsCQkgICAgLSAzMCBzZWNvbmRzICAqLworCXVuc2lnbmVkIGxvbmcgaGJfaW50ZXJ2YWw7CisKIAkvKiBBc3NvY2lhdGlvbi5NYXguUmV0cmFucyAgLSAxMCBhdHRlbXB0cwogCSAqIFBhdGguTWF4LlJldHJhbnMJICAgIC0gNQkgYXR0ZW1wdHMgKHBlciBkZXN0aW5hdGlvbiBhZGRyZXNzKQogCSAqIE1heC5Jbml0LlJldHJhbnNtaXRzCSAgICAtIDgJIGF0dGVtcHRzCkBAIC0xNjgsMTIgKzE3NCw2IEBACiAJICovCiAJaW50IHJjdmJ1Zl9wb2xpY3k7CiAKLQkvKiBEZWxheWVkIFNBQ0sgdGltZW91dCAgMjAwbXMgZGVmYXVsdCovCi0JaW50IHNhY2tfdGltZW91dDsKLQotCS8qIEhCLmludGVydmFsCQkgICAgLSAzMCBzZWNvbmRzICAqLwotCWludCBoYl9pbnRlcnZhbDsKLQogCS8qIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYy4JICovCiAKIAkvKiBEZWZhdWx0IGluaXRpYWxpemF0aW9uIHZhbHVlcyB0byBiZSBhcHBsaWVkIHRvIG5ldyBhc3NvY2lhdGlvbnMuICovCkBAIC00MDUsOCArNDA1LDkgQEAKIC8qIFRoZSBmb3JtYXQgb2Ygb3VyIGNvb2tpZSB0aGF0IHdlIHNlbmQgdG8gb3VyIHBlZXIuICovCiBzdHJ1Y3Qgc2N0cF9zaWduZWRfY29va2llIHsKIAlfX3U4IHNpZ25hdHVyZVtTQ1RQX1NFQ1JFVF9TSVpFXTsKKwlfX3UzMiBfX3BhZDsJCS8qIGZvcmNlIHNjdHBfY29va2llIGFsaWdubWVudCB0byA2NCBiaXRzICovCiAJc3RydWN0IHNjdHBfY29va2llIGM7Ci19OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogVGhpcyBpcyBhbm90aGVyIGNvbnZlbmllbmNlIHR5cGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhZGRyZXNzCiAgKiBwYXJhbXMgZm9yIHRoZSBtYXhpbXVtIHNpemUgYW5kIHBhc3Mgc3VjaCBzdHJ1Y3R1cmVzIGFyb3VuZApAQCAtODI3LDcgKzgyOCw3IEBACiAJX191MzIgcnR0OwkJLyogVGhpcyBpcyB0aGUgbW9zdCByZWNlbnQgUlRULgkgKi8KIAogCS8qIFJUTwkgICAgICAgOiBUaGUgY3VycmVudCByZXRyYW5zbWlzc2lvbiB0aW1lb3V0IHZhbHVlLiAgKi8KLQlfX3UzMiBydG87CisJdW5zaWduZWQgbG9uZyBydG87CiAKIAkvKiBSVFRWQVIgICAgICA6IFRoZSBjdXJyZW50IFJUVCB2YXJpYXRpb24uICAqLwogCV9fdTMyIHJ0dHZhcjsKQEAgLTg3NywyMiArODc4LDEwIEBACiAJLyogSGVhcnRiZWF0IGludGVydmFsOiBUaGUgZW5kcG9pbnQgc2VuZHMgb3V0IGEgSGVhcnRiZWF0IGNodW5rIHRvCiAJICogdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgZXZlcnkgaGVhcnRiZWF0IGludGVydmFsLgogCSAqLwotCV9fdTMyIGhiaW50ZXJ2YWw7Ci0KLQkvKiBUaGlzIGlzIHRoZSBtYXhfcmV0cmFucyB2YWx1ZSBmb3IgdGhlIHRyYW5zcG9ydCBhbmQgd2lsbAotCSAqIGJlIGluaXRpYWxpemVkIGZyb20gdGhlIGFzc29jcyB2YWx1ZS4gIFRoaXMgY2FuIGJlIGNoYW5nZWQKLQkgKiB1c2luZyBTQ1RQX1NFVF9QRUVSX0FERFJfUEFSQU1TIHNvY2tldCBvcHRpb24uCi0JICovCi0JX191MTYgcGF0aG1heHJ4dDsKLQotCS8qIFBNVFUJICAgICAgOiBUaGUgY3VycmVudCBrbm93biBwYXRoIE1UVS4gICovCi0JX191MzIgcGF0aG10dTsKKwl1bnNpZ25lZCBsb25nIGhiaW50ZXJ2YWw7CiAKIAkvKiBTQUNLIGRlbGF5IHRpbWVvdXQgKi8KLQlfX3UzMiBzYWNrZGVsYXk7Ci0KLQkvKiBGbGFncyBjb250cm9saW5nIEhlYXJ0YmVhdCwgU0FDSyBkZWxheSwgYW5kIFBhdGggTVRVIERpc2NvdmVyeS4gKi8KLQlfX3UzMiBwYXJhbV9mbGFnczsKKwl1bnNpZ25lZCBsb25nIHNhY2tkZWxheTsKIAogCS8qIFdoZW4gd2FzIHRoZSBsYXN0IHRpbWUgKGluIGppZmZpZXMpIHRoYXQgd2UgaGVhcmQgZnJvbSB0aGlzCiAJICogdHJhbnNwb3J0PyAgV2UgdXNlIHRoaXMgdG8gcGljayBuZXcgYWN0aXZlIGFuZCByZXRyYW4gcGF0aHMuCkBAIC05MDQsNiArODkzLDE4IEBACiAJICovCiAJdW5zaWduZWQgbG9uZyBsYXN0X3RpbWVfZWNuZV9yZWR1Y2VkOwogCisJLyogVGhpcyBpcyB0aGUgbWF4X3JldHJhbnMgdmFsdWUgZm9yIHRoZSB0cmFuc3BvcnQgYW5kIHdpbGwKKwkgKiBiZSBpbml0aWFsaXplZCBmcm9tIHRoZSBhc3NvY3MgdmFsdWUuICBUaGlzIGNhbiBiZSBjaGFuZ2VkCisJICogdXNpbmcgU0NUUF9TRVRfUEVFUl9BRERSX1BBUkFNUyBzb2NrZXQgb3B0aW9uLgorCSAqLworCV9fdTE2IHBhdGhtYXhyeHQ7CisKKwkvKiBQTVRVCSAgICAgIDogVGhlIGN1cnJlbnQga25vd24gcGF0aCBNVFUuICAqLworCV9fdTMyIHBhdGhtdHU7CisKKwkvKiBGbGFncyBjb250cm9saW5nIEhlYXJ0YmVhdCwgU0FDSyBkZWxheSwgYW5kIFBhdGggTVRVIERpc2NvdmVyeS4gKi8KKwlfX3UzMiBwYXJhbV9mbGFnczsKKwogCS8qIFRoZSBudW1iZXIgb2YgdGltZXMgSU5JVCBoYXMgYmVlbiBzZW50IG9uIHRoaXMgdHJhbnNwb3J0LiAqLwogCWludCBpbml0X3NlbnRfY291bnQ7CiAKQEAgLTEyNDksNiArMTI1MCwxNCBAQAogCWludCBsYXN0X2tleTsKIAlpbnQga2V5X2NoYW5nZWRfYXQ7CiAKKyAJLyogZGlnZXN0OiAgVGhpcyBpcyBhIGRpZ2VzdCBvZiB0aGUgc2N0cCBjb29raWUuICBUaGlzIGZpZWxkIGlzCisgCSAqIAkgICAgb25seSB1c2VkIG9uIHRoZSByZWNlaXZlIHBhdGggd2hlbiB3ZSB0cnkgdG8gdmFsaWRhdGUKKyAJICogCSAgICB0aGF0IHRoZSBjb29raWUgaGFzIG5vdCBiZWVuIHRhbXBlcmVkIHdpdGguICBXZSBwdXQKKyAJICogCSAgICB0aGlzIGhlcmUgc28gd2UgcHJlLWFsbG9jYXRlIHRoaXMgb25jZSBhbmQgY2FuIHJlLXVzZQorIAkgKiAJICAgIG9uIGV2ZXJ5IHJlY2VpdmUuCisgCSAqLworIAlfX3U4IGRpZ2VzdFtTQ1RQX1NJR05BVFVSRV9TSVpFXTsKKyAKIAkvKiBzZW5kYnVmIGFjY3QuIHBvbGljeS4JKi8KIAlfX3UzMiBzbmRidWZfcG9saWN5OwogCkBAIC0xNDk5LDkgKzE1MDgsOSBAQAogCSAqIFRoZXNlIHZhbHVlcyB3aWxsIGJlIGluaXRpYWxpemVkIGJ5IHN5c3RlbSBkZWZhdWx0cywgYnV0IGNhbgogCSAqIGJlIG1vZGlmaWVkIHZpYSB0aGUgU0NUUF9SVE9JTkZPIHNvY2tldCBvcHRpb24uCiAJICovCi0JX191MzIgcnRvX2luaXRpYWw7Ci0JX191MzIgcnRvX21heDsKLQlfX3UzMiBydG9fbWluOworCXVuc2lnbmVkIGxvbmcgcnRvX2luaXRpYWw7CisJdW5zaWduZWQgbG9uZyBydG9fbWF4OworCXVuc2lnbmVkIGxvbmcgcnRvX21pbjsKIAogCS8qIE1heGltdW0gbnVtYmVyIG9mIG5ldyBkYXRhIHBhY2tldHMgdGhhdCBjYW4gYmUgc2VudCBpbiBhIGJ1cnN0LiAgKi8KIAlpbnQgbWF4X2J1cnN0OwpAQCAtMTUxOSwxMyArMTUyOCwxMyBAQAogCV9fdTE2IGluaXRfcmV0cmllczsKIAogCS8qIFRoZSBsYXJnZXN0IHRpbWVvdXQgb3IgUlRPIHZhbHVlIHRvIHVzZSBpbiBhdHRlbXB0aW5nIGFuIElOSVQgKi8KLQlfX3UxNiBtYXhfaW5pdF90aW1lbzsKKwl1bnNpZ25lZCBsb25nIG1heF9pbml0X3RpbWVvOwogCiAJLyogSGVhcnRiZWF0IGludGVydmFsOiBUaGUgZW5kcG9pbnQgc2VuZHMgb3V0IGEgSGVhcnRiZWF0IGNodW5rIHRvCiAJICogdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgZXZlcnkgaGVhcnRiZWF0IGludGVydmFsLiBUaGlzIHZhbHVlCiAJICogd2lsbCBiZSBpbmhlcml0ZWQgYnkgYWxsIG5ldyB0cmFuc3BvcnRzLgogCSAqLwotCV9fdTMyIGhiaW50ZXJ2YWw7CisJdW5zaWduZWQgbG9uZyBoYmludGVydmFsOwogCiAJLyogVGhpcyBpcyB0aGUgbWF4X3JldHJhbnMgdmFsdWUgZm9yIG5ldyB0cmFuc3BvcnRzIGluIHRoZQogCSAqIGFzc29jaWF0aW9uLgpAQCAtMTUzNywxMyArMTU0NiwxNCBAQAogCSAqLwogCV9fdTMyIHBhdGhtdHU7CiAKLQkvKiBTQUNLIGRlbGF5IHRpbWVvdXQgKi8KLQlfX3UzMiBzYWNrZGVsYXk7Ci0KIAkvKiBGbGFncyBjb250cm9saW5nIEhlYXJ0YmVhdCwgU0FDSyBkZWxheSwgYW5kIFBhdGggTVRVIERpc2NvdmVyeS4gKi8KIAlfX3UzMiBwYXJhbV9mbGFnczsKIAotCWludCB0aW1lb3V0c1tTQ1RQX05VTV9USU1FT1VUX1RZUEVTXTsKKwkvKiBTQUNLIGRlbGF5IHRpbWVvdXQgKi8KKwl1bnNpZ25lZCBsb25nIHNhY2tkZWxheTsKKworCisJdW5zaWduZWQgbG9uZyB0aW1lb3V0c1tTQ1RQX05VTV9USU1FT1VUX1RZUEVTXTsKIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcnNbU0NUUF9OVU1fVElNRU9VVF9UWVBFU107CiAKIAkvKiBUcmFuc3BvcnQgdG8gd2hpY2ggU0hVVERPV04gY2h1bmsgd2FzIGxhc3Qgc2VudC4gICovCkBAIC0xNjQ4LDcgKzE2NTgsMTAgQEAKIAkvKiBIb3cgbWFueSBkdXBsaWNhdGVkIFRTTnMgaGF2ZSB3ZSBzZWVuPyAgKi8KIAlpbnQgbnVtZHVwdHNuczsKIAotCS8qIE51bWJlciBvZiBzZWNvbmRzIG9mIGlkbGUgdGltZSBiZWZvcmUgYW4gYXNzb2NpYXRpb24gaXMgY2xvc2VkLiAgKi8KKwkvKiBOdW1iZXIgb2Ygc2Vjb25kcyBvZiBpZGxlIHRpbWUgYmVmb3JlIGFuIGFzc29jaWF0aW9uIGlzIGNsb3NlZC4KKwkgKiBJbiB0aGUgYXNzb2NpYXRpb24gY29udGV4dCwgdGhpcyBpcyByZWFsbHkgdXNlZCBhcyBhIGJvb2xlYW4KKwkgKiBzaW5jZSB0aGUgcmVhbCB0aW1lb3V0IGlzIHN0b3JlZCBpbiB0aGUgdGltZW91dHMgYXJyYXkKKwkgKi8KIAlfX3UzMiBhdXRvY2xvc2U7CiAKIAkvKiBUaGVzZSBhcmUgdG8gc3VwcG9ydApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGlwYy90aXBjLmggYi9pbmNsdWRlL25ldC90aXBjL3RpcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTY2NjA4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvdGlwYy90aXBjLmgKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiBpbmNsdWRlL25ldC90aXBjL3RpcGMuaDogTWFpbiBpbmNsdWRlIGZpbGUgZm9yIFRJUEMgdXNlcnMKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfTkVUX1RJUENfSF8KKyNkZWZpbmUgX05FVF9USVBDX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC90aXBjLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKy8qIAorICogTmF0aXZlIEFQSQorICovCisKKy8qCisgKiBUSVBDIG9wZXJhdGluZyBtb2RlIHJvdXRpbmVzCisgKi8KKwordTMyIHRpcGNfZ2V0X2FkZHIodm9pZCk7CisKKyNkZWZpbmUgVElQQ19OT1RfUlVOTklORyAgMAorI2RlZmluZSBUSVBDX05PREVfTU9ERSAgICAxCisjZGVmaW5lIFRJUENfTkVUX01PREUgICAgIDIKKwordHlwZWRlZiB2b2lkICgqdGlwY19tb2RlX2V2ZW50KSh2b2lkICp1c3JfaGFuZGxlLCBpbnQgbW9kZSwgdTMyIGFkZHIpOworCitpbnQgdGlwY19hdHRhY2godW5zaWduZWQgaW50ICp1c2VycmVmLCB0aXBjX21vZGVfZXZlbnQsIHZvaWQgKnVzcl9oYW5kbGUpOworCit2b2lkIHRpcGNfZGV0YWNoKHVuc2lnbmVkIGludCB1c2VycmVmKTsKKworaW50IHRpcGNfZ2V0X21vZGUodm9pZCk7CisKKy8qCisgKiBUSVBDIHBvcnQgbWFuaXB1bGF0aW9uIHJvdXRpbmVzCisgKi8KKwordHlwZWRlZiB2b2lkICgqdGlwY19tc2dfZXJyX2V2ZW50KSAodm9pZCAqdXNyX2hhbmRsZSwKKwkJCQkgICAgdTMyIHBvcnRyZWYsCisJCQkJICAgIHN0cnVjdCBza19idWZmICoqYnVmLAorCQkJCSAgICB1bnNpZ25lZCBjaGFyIGNvbnN0ICpkYXRhLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCQkgICAgaW50IHJlYXNvbiwgCisJCQkJICAgIHN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqYXR0bXB0X2Rlc3RpZCk7CisKK3R5cGVkZWYgdm9pZCAoKnRpcGNfbmFtZWRfbXNnX2Vycl9ldmVudCkgKHZvaWQgKnVzcl9oYW5kbGUsCisJCQkJCSAgdTMyIHBvcnRyZWYsCisJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKipidWYsCisJCQkJCSAgdW5zaWduZWQgY2hhciBjb25zdCAqZGF0YSwKKwkJCQkJICB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCQkJICBpbnQgcmVhc29uLCAKKwkJCQkJICBzdHJ1Y3QgdGlwY19uYW1lX3NlcSBjb25zdCAqYXR0bXB0X2Rlc3QpOworCit0eXBlZGVmIHZvaWQgKCp0aXBjX2Nvbm5fc2h1dGRvd25fZXZlbnQpICh2b2lkICp1c3JfaGFuZGxlLAorCQkJCQkgIHUzMiBwb3J0cmVmLAorCQkJCQkgIHN0cnVjdCBza19idWZmICoqYnVmLAorCQkJCQkgIHVuc2lnbmVkIGNoYXIgY29uc3QgKmRhdGEsCisJCQkJCSAgdW5zaWduZWQgaW50IHNpemUsCisJCQkJCSAgaW50IHJlYXNvbik7CisKK3R5cGVkZWYgdm9pZCAoKnRpcGNfbXNnX2V2ZW50KSAodm9pZCAqdXNyX2hhbmRsZSwKKwkJCQl1MzIgcG9ydHJlZiwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqKmJ1ZiwKKwkJCQl1bnNpZ25lZCBjaGFyIGNvbnN0ICpkYXRhLAorCQkJCXVuc2lnbmVkIGludCBzaXplLAorCQkJCXVuc2lnbmVkIGludCBpbXBvcnRhbmNlLCAKKwkJCQlzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKm9yaWdpbik7CisKK3R5cGVkZWYgdm9pZCAoKnRpcGNfbmFtZWRfbXNnX2V2ZW50KSAodm9pZCAqdXNyX2hhbmRsZSwKKwkJCQkgICAgICB1MzIgcG9ydHJlZiwKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKmJ1ZiwKKwkJCQkgICAgICB1bnNpZ25lZCBjaGFyIGNvbnN0ICpkYXRhLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBzaXplLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBpbXBvcnRhbmNlLCAKKwkJCQkgICAgICBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKm9yaWcsCisJCQkJICAgICAgc3RydWN0IHRpcGNfbmFtZV9zZXEgY29uc3QgKmRlc3QpOworCit0eXBlZGVmIHZvaWQgKCp0aXBjX2Nvbm5fbXNnX2V2ZW50KSAodm9pZCAqdXNyX2hhbmRsZSwKKwkJCQkgICAgIHUzMiBwb3J0cmVmLAorCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKipidWYsCisJCQkJICAgICB1bnNpZ25lZCBjaGFyIGNvbnN0ICpkYXRhLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHNpemUpOworCit0eXBlZGVmIHZvaWQgKCp0aXBjX2NvbnRpbnVlX2V2ZW50KSAodm9pZCAqdXNyX2hhbmRsZSwgCisJCQkJICAgICB1MzIgcG9ydHJlZik7CisKK2ludCB0aXBjX2NyZWF0ZXBvcnQodW5zaWduZWQgaW50IHRpcGNfdXNlciwgCisJCSAgICB2b2lkICp1c3JfaGFuZGxlLCAKKwkJICAgIHVuc2lnbmVkIGludCBpbXBvcnRhbmNlLCAKKwkJICAgIHRpcGNfbXNnX2Vycl9ldmVudCBlcnJvcl9jYiwgCisJCSAgICB0aXBjX25hbWVkX21zZ19lcnJfZXZlbnQgbmFtZWRfZXJyb3JfY2IsIAorCQkgICAgdGlwY19jb25uX3NodXRkb3duX2V2ZW50IGNvbm5fZXJyb3JfY2IsIAorCQkgICAgdGlwY19tc2dfZXZlbnQgbWVzc2FnZV9jYiwgCisJCSAgICB0aXBjX25hbWVkX21zZ19ldmVudCBuYW1lZF9tZXNzYWdlX2NiLCAKKwkJICAgIHRpcGNfY29ubl9tc2dfZXZlbnQgY29ubl9tZXNzYWdlX2NiLCAKKwkJICAgIHRpcGNfY29udGludWVfZXZlbnQgY29udGludWVfZXZlbnRfY2IsLyogTWF5IGJlIHplcm8gKi8KKwkJICAgIHUzMiAqcG9ydHJlZik7CisKK2ludCB0aXBjX2RlbGV0ZXBvcnQodTMyIHBvcnRyZWYpOworCitpbnQgdGlwY19vd25pZGVudGl0eSh1MzIgcG9ydHJlZiwgc3RydWN0IHRpcGNfcG9ydGlkICpwb3J0KTsKKworaW50IHRpcGNfcG9ydGltcG9ydGFuY2UodTMyIHBvcnRyZWYsIHVuc2lnbmVkIGludCAqaW1wb3J0YW5jZSk7CitpbnQgdGlwY19zZXRfcG9ydGltcG9ydGFuY2UodTMyIHBvcnRyZWYsIHVuc2lnbmVkIGludCBpbXBvcnRhbmNlKTsKKworaW50IHRpcGNfcG9ydHVucmVsaWFibGUodTMyIHBvcnRyZWYsIHVuc2lnbmVkIGludCAqaXN1bnJlbGlhYmxlKTsKK2ludCB0aXBjX3NldF9wb3J0dW5yZWxpYWJsZSh1MzIgcG9ydHJlZiwgdW5zaWduZWQgaW50IGlzdW5yZWxpYWJsZSk7CisKK2ludCB0aXBjX3BvcnR1bnJldHVybmFibGUodTMyIHBvcnRyZWYsIHVuc2lnbmVkIGludCAqaXN1bnJldHVybmFibGUpOworaW50IHRpcGNfc2V0X3BvcnR1bnJldHVybmFibGUodTMyIHBvcnRyZWYsIHVuc2lnbmVkIGludCBpc3VucmV0dXJuYWJsZSk7CisKK2ludCB0aXBjX3B1Ymxpc2godTMyIHBvcnRyZWYsIHVuc2lnbmVkIGludCBzY29wZSwgCisJCSBzdHJ1Y3QgdGlwY19uYW1lX3NlcSBjb25zdCAqbmFtZV9zZXEpOworaW50IHRpcGNfd2l0aGRyYXcodTMyIHBvcnRyZWYsIHVuc2lnbmVkIGludCBzY29wZSwKKwkJICBzdHJ1Y3QgdGlwY19uYW1lX3NlcSBjb25zdCAqbmFtZV9zZXEpOyAvKiAwOiBhbGwgKi8KKworaW50IHRpcGNfY29ubmVjdDJwb3J0KHUzMiBwb3J0cmVmLCBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKnBvcnQpOworCitpbnQgdGlwY19kaXNjb25uZWN0KHUzMiBwb3J0cmVmKTsKKworaW50IHRpcGNfc2h1dGRvd24odTMyIHJlZik7IC8qIFNlbmRzIFNIVVRET1dOIG1zZyAqLworCitpbnQgdGlwY19pc2Nvbm5lY3RlZCh1MzIgcG9ydHJlZiwgaW50ICppc2Nvbm5lY3RlZCk7CisKK2ludCB0aXBjX3BlZXIodTMyIHBvcnRyZWYsIHN0cnVjdCB0aXBjX3BvcnRpZCAqcGVlcik7CisKK2ludCB0aXBjX3JlZl92YWxpZCh1MzIgcG9ydHJlZik7IAorCisvKgorICogVElQQyBtZXNzYWdpbmcgcm91dGluZXMKKyAqLworCisjZGVmaW5lIFRJUENfUE9SVF9JTVBPUlRBTkNFIDEwMAkvKiBzZW5kIHVzaW5nIGN1cnJlbnQgcG9ydCBzZXR0aW5nICovCisKKworaW50IHRpcGNfc2VuZCh1MzIgcG9ydHJlZiwKKwkgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NlY3QsCisJICAgICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCk7CisKK2ludCB0aXBjX3NlbmRfYnVmKHUzMiBwb3J0cmVmLAorCQkgIHN0cnVjdCBza19idWZmICpidWYsCisJCSAgdW5zaWduZWQgaW50IGRzeik7CisKK2ludCB0aXBjX3NlbmQybmFtZSh1MzIgcG9ydHJlZiwgCisJCSAgIHN0cnVjdCB0aXBjX25hbWUgY29uc3QgKm5hbWUsIAorCQkgICB1MzIgZG9tYWluLAkvKiAwOm93biB6b25lICovCisJCSAgIHVuc2lnbmVkIGludCBudW1fc2VjdCwKKwkJICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCk7CisKK2ludCB0aXBjX3NlbmRfYnVmMm5hbWUodTMyIHBvcnRyZWYsCisJCSAgICAgICBzdHJ1Y3QgdGlwY19uYW1lIGNvbnN0ICpuYW1lLAorCQkgICAgICAgdTMyIGRvbWFpbiwKKwkJICAgICAgIHN0cnVjdCBza19idWZmICpidWYsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgZHN6KTsKKworaW50IHRpcGNfZm9yd2FyZDJuYW1lKHUzMiBwb3J0cmVmLCAKKwkJICAgICAgc3RydWN0IHRpcGNfbmFtZSBjb25zdCAqbmFtZSwgCisJCSAgICAgIHUzMiBkb21haW4sICAgLyowOiBvd24gem9uZSAqLworCQkgICAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9jb3VudCwKKwkJICAgICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCwKKwkJICAgICAgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpvcmlnaW4sCisJCSAgICAgIHVuc2lnbmVkIGludCBpbXBvcnRhbmNlKTsKKworaW50IHRpcGNfZm9yd2FyZF9idWYybmFtZSh1MzIgcG9ydHJlZiwKKwkJCSAgc3RydWN0IHRpcGNfbmFtZSBjb25zdCAqbmFtZSwKKwkJCSAgdTMyIGRvbWFpbiwKKwkJCSAgc3RydWN0IHNrX2J1ZmYgKmJ1ZiwKKwkJCSAgdW5zaWduZWQgaW50IGRzeiwKKwkJCSAgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpvcmlnLAorCQkJICB1bnNpZ25lZCBpbnQgaW1wb3J0YW5jZSk7CisKK2ludCB0aXBjX3NlbmQycG9ydCh1MzIgcG9ydHJlZiwKKwkJICAgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpkZXN0LAorCQkgICB1bnNpZ25lZCBpbnQgbnVtX3NlY3QsCisJCSAgIHN0cnVjdCBpb3ZlYyBjb25zdCAqbXNnX3NlY3QpOworCitpbnQgdGlwY19zZW5kX2J1ZjJwb3J0KHUzMiBwb3J0cmVmLAorCQkgICAgICAgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpkZXN0LAorCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKmJ1ZiwKKwkJICAgICAgIHVuc2lnbmVkIGludCBkc3opOworCitpbnQgdGlwY19mb3J3YXJkMnBvcnQodTMyIHBvcnRyZWYsCisJCSAgICAgIHN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqZGVzdCwKKwkJICAgICAgdW5zaWduZWQgaW50IG51bV9zZWN0LAorCQkgICAgICBzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZ19zZWN0LAorCQkgICAgICBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKm9yaWdpbiwKKwkJICAgICAgdW5zaWduZWQgaW50IGltcG9ydGFuY2UpOworCitpbnQgdGlwY19mb3J3YXJkX2J1ZjJwb3J0KHUzMiBwb3J0cmVmLAorCQkJICBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKmRlc3QsCisJCQkgIHN0cnVjdCBza19idWZmICpidWYsCisJCQkgIHVuc2lnbmVkIGludCBkc3osCisJCQkgIHN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqb3JpZywKKwkJCSAgdW5zaWduZWQgaW50IGltcG9ydGFuY2UpOworCitpbnQgdGlwY19tdWx0aWNhc3QodTMyIHBvcnRyZWYsIAorCQkgICBzdHJ1Y3QgdGlwY19uYW1lX3NlcSBjb25zdCAqc2VxLCAKKwkJICAgdTMyIGRvbWFpbiwJLyogMDpvd24gem9uZSAqLworCQkgICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9jb3VudCwKKwkJICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2cpOworCisjaWYgMAoraW50IHRpcGNfbXVsdGljYXN0X2J1Zih1MzIgcG9ydHJlZiwgCisJCSAgICAgICBzdHJ1Y3QgdGlwY19uYW1lX3NlcSBjb25zdCAqc2VxLCAKKwkJICAgICAgIHUzMiBkb21haW4sCS8qIDA6b3duIHpvbmUgKi8KKwkJICAgICAgIHZvaWQgKmJ1ZiwKKwkJICAgICAgIHVuc2lnbmVkIGludCBzaXplKTsKKyNlbmRpZgorCisvKgorICogVElQQyBzdWJzY3JpcHRpb24gcm91dGluZXMKKyAqLworCitpbnQgdGlwY19pc3B1Ymxpc2hlZChzdHJ1Y3QgdGlwY19uYW1lIGNvbnN0ICpuYW1lKTsKKworLyoKKyAqIEdldCBudW1iZXIgb2YgYXZhaWxhYmxlIG5vZGVzIHdpdGhpbiBzcGVjaWZpZWQgZG9tYWluIChleGNsdWRpbmcgb3duIG5vZGUpCisgKi8KKwordW5zaWduZWQgaW50IHRpcGNfYXZhaWxhYmxlX25vZGVzKGNvbnN0IHUzMiBkb21haW4pOworCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90aXBjL3RpcGNfYmVhcmVyLmggYi9pbmNsdWRlL25ldC90aXBjL3RpcGNfYmVhcmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk4NjA3YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19iZWFyZXIuaApAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIGluY2x1ZGUvbmV0L3RpcGMvdGlwY19iZWFyZXIuaDogSW5jbHVkZSBmaWxlIGZvciBwcml2aWxlZ2VkIGFjY2VzcyB0byBUSVBDIGJlYXJlcnMKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfTkVUX1RJUENfQkVBUkVSX0hfCisjZGVmaW5lIF9ORVRfVElQQ19CRUFSRVJfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L3RpcGNfY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworLyoKKyAqIElkZW50aWZpZXJzIG9mIHN1cHBvcnRlZCBUSVBDIG1lZGlhIHR5cGVzCisgKi8KKworI2RlZmluZSBUSVBDX01FRElBX1RZUEVfRVRICTEKKworc3RydWN0IHRpcGNfbWVkaWFfYWRkciB7CisJX191MzIgIHR5cGU7CisJdW5pb24geworCQlfX3U4ICAgZXRoX2FkZHJbNl07CS8qIEV0aGVybmV0IGJlYXJlciAqLyAKKyNpZiAwCisJCS8qIFByb3RvdHlwZXMgZm9yIG90aGVyIHBvc3NpYmxlIGJlYXJlciB0eXBlcyAqLworCisJCXN0cnVjdCB7CisJCQlfX3UxNiBzaW5fZmFtaWx5OworCQkJX191MTYgc2luX3BvcnQ7CisJCQlzdHJ1Y3QgeworCQkJCV9fdTMyIHNfYWRkcjsKKwkJCX0gc2luX2FkZHI7CisJCQljaGFyIHBhZFs0XTsKKwkJfSBhZGRyX2luOwkJLyogSVAtYmFzZWQgYmVhcmVyICovCisJCV9fdTE2ICBzb2NrX2Rlc2NyOwkvKiBnZW5lcmljIHNvY2tldCBiZWFyZXIgKi8KKyNlbmRpZgorCX0gZGV2X2FkZHI7Cit9OworCisvKioKKyAqIHN0cnVjdCB0aXBjX2JlYXJlciAtIFRJUEMgYmVhcmVyIGluZm8gYXZhaWxhYmxlIHRvIHByaXZpbGVnZWQgdXNlcnMKKyAqIEB1c3JfaGFuZGxlOiBwb2ludGVyIHRvIGFkZGl0aW9uYWwgdXNlci1kZWZpbmVkIGluZm9ybWF0aW9uIGFib3V0IGJlYXJlcgorICogQG10dTogbWF4IHBhY2tldCBzaXplIGJlYXJlciBjYW4gc3VwcG9ydAorICogQGJsb2NrZWQ6IG5vbi16ZXJvIGlmIGJlYXJlciBpcyBibG9ja2VkCisgKiBAbG9jazogc3BpbmxvY2sgZm9yIGNvbnRyb2xsaW5nIGFjY2VzcyB0byBiZWFyZXIKKyAqIEBhZGRyOiBtZWRpYS1zcGVjaWZpYyBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCBiZWFyZXIKKyAqIEBuYW1lOiBiZWFyZXIgbmFtZSAoZm9ybWF0ID0gbWVkaWE6aW50ZXJmYWNlKQorICogCisgKiBOb3RlOiBUSVBDIGluaXRpYWxpemVzICJuYW1lIiBhbmQgImxvY2siIGZpZWxkczsgdXNlciBpcyByZXNwb25zaWJsZSBmb3IKKyAqIGluaXRpYWxpemF0aW9uIGFsbCBvdGhlciBmaWVsZHMgd2hlbiBhIGJlYXJlciBpcyBlbmFibGVkLgorICovCisKK3N0cnVjdCB0aXBjX2JlYXJlciB7CisJdm9pZCAqdXNyX2hhbmRsZTsKKwl1MzIgbXR1OworCWludCBibG9ja2VkOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIGFkZHI7CisJY2hhciBuYW1lW1RJUENfTUFYX0JFQVJFUl9OQU1FXTsKK307CisKKworaW50ICB0aXBjX3JlZ2lzdGVyX21lZGlhKHUzMiBtZWRpYV90eXBlLAorCQkJIGNoYXIgKm1lZGlhX25hbWUsIAorCQkJIGludCAoKmVuYWJsZSkoc3RydWN0IHRpcGNfYmVhcmVyICopLCAKKwkJCSB2b2lkICgqZGlzYWJsZSkoc3RydWN0IHRpcGNfYmVhcmVyICopLCAKKwkJCSBpbnQgKCpzZW5kX21zZykoc3RydWN0IHNrX2J1ZmYgKiwgCisJCQkJCSBzdHJ1Y3QgdGlwY19iZWFyZXIgKiwKKwkJCQkJIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKiksIAorCQkJIGNoYXIgKigqYWRkcjJzdHIpKHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEsCisJCQkJCSAgIGNoYXIgKnN0cl9idWYsCisJCQkJCSAgIGludCBzdHJfc2l6ZSksCisJCQkgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYmNhc3RfYWRkciwKKwkJCSBjb25zdCB1MzIgYmVhcmVyX3ByaW9yaXR5LAorCQkJIGNvbnN0IHUzMiBsaW5rX3RvbGVyYW5jZSwgIC8qIFttc10gKi8KKwkJCSBjb25zdCB1MzIgc2VuZF93aW5kb3dfbGltaXQpOyAKKwordm9pZCB0aXBjX3JlY3ZfbXNnKHN0cnVjdCBza19idWZmICpidWYsIHN0cnVjdCB0aXBjX2JlYXJlciAqdGJfcHRyKTsKKworaW50ICB0aXBjX2Jsb2NrX2JlYXJlcihjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgdGlwY19jb250aW51ZShzdHJ1Y3QgdGlwY19iZWFyZXIgKnRiX3B0cik7IAorCitpbnQgdGlwY19lbmFibGVfYmVhcmVyKGNvbnN0IGNoYXIgKmJlYXJlcl9uYW1lLCB1MzIgYmNhc3Rfc2NvcGUsIHUzMiBwcmlvcml0eSk7CitpbnQgdGlwY19kaXNhYmxlX2JlYXJlcihjb25zdCBjaGFyICpuYW1lKTsKKworCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90aXBjL3RpcGNfbXNnLmggYi9pbmNsdWRlL25ldC90aXBjL3RpcGNfbXNnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQwOTZlZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19tc2cuaApAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIGluY2x1ZGUvbmV0L3RpcGMvdGlwY19tc2cuaDogSW5jbHVkZSBmaWxlIGZvciBwcml2aWxlZ2VkIGFjY2VzcyB0byBUSVBDIG1lc3NhZ2UgaGVhZGVycworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9ORVRfVElQQ19NU0dfSF8KKyNkZWZpbmUgX05FVF9USVBDX01TR19IXworCisjaWZkZWYgX19LRVJORUxfXworCitzdHJ1Y3QgdGlwY19tc2cgeworCXUzMiBoZHJbMTVdOworfTsKKworCisvKgorCQlUSVBDIHVzZXIgZGF0YSBtZXNzYWdlIGhlYWRlciBmb3JtYXQsIHZlcnNpb24gMjoKKworCisgICAgICAgMSAwIDkgOCA3IDYgNSA0fDMgMiAxIDAgOSA4IDcgNnw1IDQgMyAyIDEgMCA5IDh8NyA2IDUgNCAzIDIgMSAwIAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHcwOnx2ZXJzIHwgdXNlciAgfGhkciBzeiB8bnxkfHN8LXwgICAgICAgICAgbWVzc2FnZSBzaXplICAgICAgICAgICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgdzE6fG1zdHlwfCBlcnJvciB8cmVyIGNudHxsc2N8b3B0IHB8ICAgICAgYnJvYWRjYXN0IGFjayBubyAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB3Mjp8ICAgICAgICBsaW5rIGxldmVsIGFjayBubyAgICAgIHwgICBicm9hZGNhc3QvbGluayBsZXZlbCBzZXEgbm8gfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHczOnwgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzIG5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgdzQ6fCAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hdGluZyBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB3NTp8ICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsgICAgCisgICB3Njp8ICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmF0aW5nIG5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHc3OnwgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgdzg6fCAgICAgICAgICAgIG5hbWUgdHlwZSAvIHRyYW5zcG9ydCBzZXF1ZW5jZSBudW1iZXIgICAgICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB3OTp8ICAgICAgICAgICAgICBuYW1lIGluc3RhbmNlL211bHRpY2FzdCBsb3dlciBib3VuZCAgICAgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsgICAgCisgICB3QTp8ICAgICAgICAgICAgICAgICAgICBtdWx0aWNhc3QgdXBwZXIgYm91bmQgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsgICAgCisgICAgICAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLworICAgICAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvCisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCisqLworCisjZGVmaW5lIFRJUENfQ09OTl9NU0cJMAorI2RlZmluZSBUSVBDX01DQVNUX01TRwkxCisjZGVmaW5lIFRJUENfTkFNRURfTVNHCTIKKyNkZWZpbmUgVElQQ19ESVJFQ1RfTVNHCTMKKworCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfd29yZChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBwb3MpCit7CisJcmV0dXJuIG50b2hsKG0tPmhkcltwb3NdKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2JpdHMoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgdywgdTMyIHBvcywgdTMyIG1hc2spCit7CisJcmV0dXJuIChtc2dfd29yZChtLCB3KSA+PiBwb3MpICYgbWFzazsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2ltcG9ydGFuY2Uoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCAwLCAyNSwgMHhmKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2hkcl9zeihzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDAsIDIxLCAweGYpIDw8IDI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1zZ19zaG9ydChzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIChtc2dfaGRyX3N6KG0pID09IDI0KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX3NpemUoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCAwLCAwLCAweDFmZmZmKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2RhdGFfc3ooc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiAobXNnX3NpemUobSkgLSBtc2dfaGRyX3N6KG0pKTsKK30KKworc3RhdGljIGlubGluZSB1bmNoYXIgKm1zZ19kYXRhKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gKCh1bmNoYXIgKiltKSArIG1zZ19oZHJfc3oobSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ190eXBlKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgMSwgMjksIDB4Nyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19kaXJlY3Qoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiAobXNnX3R5cGUobSkgPT0gVElQQ19ESVJFQ1RfTVNHKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX25hbWVkKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gKG1zZ190eXBlKG0pID09IFRJUENfTkFNRURfTVNHKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX21jYXN0KHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gKG1zZ190eXBlKG0pID09IFRJUENfTUNBU1RfTVNHKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2Nvbm5lY3RlZChzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIChtc2dfdHlwZShtKSA9PSBUSVBDX0NPTk5fTVNHKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2VycmNvZGUoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCAxLCAyNSwgMHhmKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX3ByZXZub2RlKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX3dvcmQobSwgMyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19vcmlncG9ydChzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ193b3JkKG0sIDQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfZGVzdHBvcnQoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfd29yZChtLCA1KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX21jX25ldGlkKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX3dvcmQobSwgNSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19vcmlnbm9kZShzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJaWYgKGxpa2VseShtc2dfc2hvcnQobSkpKQorCQlyZXR1cm4gbXNnX3ByZXZub2RlKG0pOworCXJldHVybiBtc2dfd29yZChtLCA2KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2Rlc3Rub2RlKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX3dvcmQobSwgNyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19uYW1ldHlwZShzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ193b3JkKG0sIDgpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfbmFtZWluc3Qoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfd29yZChtLCA5KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX25hbWVsb3dlcihzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19uYW1laW5zdChtKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX25hbWV1cHBlcihzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ193b3JkKG0sIDEwKTsKK30KKworc3RhdGljIGlubGluZSBjaGFyICptc2dfb3B0aW9ucyhzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiAqbGVuKQoreworCXUzMiBwb3MgPSBtc2dfYml0cyhtLCAxLCAxNiwgMHg3KTsKKworCWlmICghcG9zKQorCQlyZXR1cm4gMDsKKwlwb3MgPSAocG9zICogNCkgKyAyODsKKwkqbGVuID0gbXNnX2hkcl9zeihtKSAtIHBvczsKKwlyZXR1cm4gKGNoYXIgKikmbS0+aGRyW3Bvcy80XTsKK30KKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGlwYy90aXBjX3BvcnQuaCBiL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19wb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMzYmJhNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19wb3J0LmgKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBpbmNsdWRlL25ldC90aXBjL3RpcGNfcG9ydC5oOiBJbmNsdWRlIGZpbGUgZm9yIHByaXZpbGVnZWQgYWNjZXNzIHRvIFRJUEMgcG9ydHMKKyAqIAorICogQ29weXJpZ2h0IChjKSAxOTk0LTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfTkVUX1RJUENfUE9SVF9IXworI2RlZmluZSBfTkVUX1RJUENfUE9SVF9IXworCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvdGlwYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC90aXBjL3RpcGNfbXNnLmg+CisKKyNkZWZpbmUgVElQQ19GTE9XX0NPTlRST0xfV0lOIDUxMgorCisvKioKKyAqIHN0cnVjdCB0aXBjX3BvcnQgLSBuYXRpdmUgVElQQyBwb3J0IGluZm8gYXZhaWxhYmxlIHRvIHByaXZpbGVnZWQgdXNlcnMKKyAqIEB1c3JfaGFuZGxlOiBwb2ludGVyIHRvIGFkZGl0aW9uYWwgdXNlci1kZWZpbmVkIGluZm9ybWF0aW9uIGFib3V0IHBvcnQKKyAqIEBsb2NrOiBwb2ludGVyIHRvIHNwaW5sb2NrIGZvciBjb250cm9sbGluZyBhY2Nlc3MgdG8gcG9ydAorICogQGNvbm5lY3RlZDogbm9uLXplcm8gaWYgcG9ydCBpcyBjdXJyZW50bHkgY29ubmVjdGVkIHRvIGEgcGVlciBwb3J0CisgKiBAY29ubl90eXBlOiBUSVBDIHR5cGUgdXNlZCB3aGVuIGNvbm5lY3Rpb24gd2FzIGVzdGFibGlzaGVkCisgKiBAY29ubl9pbnN0YW5jZTogVElQQyBpbnN0YW5jZSB1c2VkIHdoZW4gY29ubmVjdGlvbiB3YXMgZXN0YWJsaXNoZWQKKyAqIEBjb25uX3VuYWNrZWQ6IG51bWJlciBvZiB1bmFja25vd2xlZGdlZCBtZXNzYWdlcyByZWNlaXZlZCBmcm9tIHBlZXIgcG9ydAorICogQHB1Ymxpc2hlZDogbm9uLXplcm8gaWYgcG9ydCBoYXMgb25lIG9yIG1vcmUgYXNzb2NpYXRlZCBuYW1lcworICogQGNvbmdlc3RlZDogbm9uLXplcm8gaWYgY2Fubm90IHNlbmQgYmVjYXVzZSBvZiBsaW5rIG9yIHBvcnQgY29uZ2VzdGlvbgorICogQHJlZjogdW5pcXVlIHJlZmVyZW5jZSB0byBwb3J0IGluIFRJUEMgb2JqZWN0IHJlZ2lzdHJ5CisgKiBAcGhkcjogcHJlZm9ybWF0dGVkIG1lc3NhZ2UgaGVhZGVyIHVzZWQgd2hlbiBzZW5kaW5nIG1lc3NhZ2VzCisgKi8KKworc3RydWN0IHRpcGNfcG9ydCB7CisgICAgICAgIHZvaWQgKnVzcl9oYW5kbGU7CisgICAgICAgIHNwaW5sb2NrX3QgKmxvY2s7CisJaW50IGNvbm5lY3RlZDsKKyAgICAgICAgdTMyIGNvbm5fdHlwZTsKKyAgICAgICAgdTMyIGNvbm5faW5zdGFuY2U7CisJdTMyIGNvbm5fdW5hY2tlZDsKKwlpbnQgcHVibGlzaGVkOworCXUzMiBjb25nZXN0ZWQ7CisJdTMyIHJlZjsKKwlzdHJ1Y3QgdGlwY19tc2cgcGhkcjsKK307CisKKworLyoqCisgKiB0aXBjX2NyZWF0ZXBvcnRfcmF3IC0gY3JlYXRlIGEgbmF0aXZlIFRJUEMgcG9ydCBhbmQgcmV0dXJuIGl0J3MgcmVmZXJlbmNlCisgKgorICogTm90ZTogJ2Rpc3BhdGNoZXInIGFuZCAnd2FrZXVwJyBkZWxpdmVyIGEgbG9ja2VkIHBvcnQuCisgKi8KKwordTMyIHRpcGNfY3JlYXRlcG9ydF9yYXcodm9pZCAqdXNyX2hhbmRsZSwKKwkJCXUzMiAoKmRpc3BhdGNoZXIpKHN0cnVjdCB0aXBjX3BvcnQgKiwgc3RydWN0IHNrX2J1ZmYgKiksCisJCQl2b2lkICgqd2FrZXVwKShzdHJ1Y3QgdGlwY19wb3J0ICopLAorCQkJY29uc3QgdTMyIGltcG9ydGFuY2UpOworCisvKgorICogdGlwY19zZXRfbXNnX29wdGlvbigpOiBwb3J0IG11c3QgYmUgbG9ja2VkLgorICovCitpbnQgdGlwY19zZXRfbXNnX29wdGlvbihzdHJ1Y3QgdGlwY19wb3J0ICp0cF9wdHIsCisJCQljb25zdCBjaGFyICpvcHQsCisJCQljb25zdCB1MzIgbGVuKTsKKworaW50IHRpcGNfcmVqZWN0X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCB1MzIgZXJyKTsKKworaW50IHRpcGNfc2VuZF9idWZfZmFzdChzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCB1MzIgZGVzdG5vZGUpOworCit2b2lkIHRpcGNfYWNrbm93bGVkZ2UodTMyIHBvcnRfcmVmLHUzMiBhY2spOworCitzdHJ1Y3QgdGlwY19wb3J0ICp0aXBjX2dldF9wb3J0KGNvbnN0IHUzMiByZWYpOworCit2b2lkICp0aXBjX2dldF9oYW5kbGUoY29uc3QgdTMyIHJlZik7CisKKworI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC94ZnJtLmggYi9pbmNsdWRlL25ldC94ZnJtLmgKaW5kZXggMDdkN2I1MC4uZDA5Y2EwZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQveGZybS5oCisrKyBiL2luY2x1ZGUvbmV0L3hmcm0uaApAQCAtNjY4LDcgKzY2OCw3IEBACiAJcmV0dXJuIHhmcm1fcG9saWN5X2NoZWNrKHNrLCBkaXIsIHNrYiwgQUZfSU5FVDYpOwogfQogCi0KK2V4dGVybiBpbnQgeGZybV9kZWNvZGVfc2Vzc2lvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZmxvd2kgKmZsLCB1bnNpZ25lZCBzaG9ydCBmYW1pbHkpOwogZXh0ZXJuIGludCBfX3hmcm1fcm91dGVfZm9yd2FyZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBzaG9ydCBmYW1pbHkpOwogCiBzdGF0aWMgaW5saW5lIGludCB4ZnJtX3JvdXRlX2ZvcndhcmQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgc2hvcnQgZmFtaWx5KQpAQCAtODMxLDcgKzgzMSw3IEBACiB9OwogCiBzdHJ1Y3QgeGZybTZfdHVubmVsIHsKLQlpbnQgKCpoYW5kbGVyKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCAqbmhvZmZwKTsKKwlpbnQgKCpoYW5kbGVyKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpOwogCXZvaWQgKCplcnJfaGFuZGxlcikoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsCiAJCQkgICAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX3UzMiBpbmZvKTsKIH07CkBAIC04NjYsMTAgKzg2NiwxMSBAQAogZXh0ZXJuIGludCB4ZnJtX2luaXRfc3RhdGUoc3RydWN0IHhmcm1fc3RhdGUgKngpOwogZXh0ZXJuIGludCB4ZnJtNF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gaW50IHhmcm00X291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBpbnQgeGZybTRfb3V0cHV0X2ZpbmlzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGV4dGVybiBpbnQgeGZybTRfdHVubmVsX3JlZ2lzdGVyKHN0cnVjdCB4ZnJtX3R1bm5lbCAqaGFuZGxlcik7CiBleHRlcm4gaW50IHhmcm00X3R1bm5lbF9kZXJlZ2lzdGVyKHN0cnVjdCB4ZnJtX3R1bm5lbCAqaGFuZGxlcik7Ci1leHRlcm4gaW50IHhmcm02X3Jjdl9zcGkoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCB1bnNpZ25lZCBpbnQgKm5ob2ZmcCwgdTMyIHNwaSk7Ci1leHRlcm4gaW50IHhmcm02X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCAqbmhvZmZwKTsKK2V4dGVybiBpbnQgeGZybTZfcmN2X3NwaShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHUzMiBzcGkpOworZXh0ZXJuIGludCB4ZnJtNl9yY3Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiKTsKIGV4dGVybiBpbnQgeGZybTZfdHVubmVsX3JlZ2lzdGVyKHN0cnVjdCB4ZnJtNl90dW5uZWwgKmhhbmRsZXIpOwogZXh0ZXJuIGludCB4ZnJtNl90dW5uZWxfZGVyZWdpc3RlcihzdHJ1Y3QgeGZybTZfdHVubmVsICpoYW5kbGVyKTsKIGV4dGVybiB1MzIgeGZybTZfdHVubmVsX2FsbG9jX3NwaSh4ZnJtX2FkZHJlc3NfdCAqc2FkZHIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZG1hL2liX3ZlcmJzLmggYi9pbmNsdWRlL3JkbWEvaWJfdmVyYnMuaAppbmRleCBhN2Y0YzM1Li4yMmZjODg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3JkbWEvaWJfdmVyYnMuaAorKysgYi9pbmNsdWRlL3JkbWEvaWJfdmVyYnMuaApAQCAtODgsNyArODgsNiBAQAogCiBzdHJ1Y3QgaWJfZGV2aWNlX2F0dHIgewogCXU2NAkJCWZ3X3ZlcjsKLQlfX2JlNjQJCQlub2RlX2d1aWQ7CiAJX19iZTY0CQkJc3lzX2ltYWdlX2d1aWQ7CiAJdTY0CQkJbWF4X21yX3NpemU7CiAJdTY0CQkJcGFnZV9zaXplX2NhcDsKQEAgLTk1MSw2ICs5NTAsNyBAQAogCXU2NAkJCSAgICAgdXZlcmJzX2NtZF9tYXNrOwogCWludAkJCSAgICAgdXZlcmJzX2FiaV92ZXI7CiAKKwlfX2JlNjQJCQkgICAgIG5vZGVfZ3VpZDsKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVfdHlwZTsKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNfcG9ydF9jbnQ7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2lzY3NpX2lmLmggYi9pbmNsdWRlL3Njc2kvaXNjc2lfaWYuaAppbmRleCBiZTFiYzc5Li4zZTVjYjVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvaXNjc2lfaWYuaAorKysgYi9pbmNsdWRlL3Njc2kvaXNjc2lfaWYuaApAQCAtMTY4LDYgKzE2OCwxMiBAQAogCiAjZGVmaW5lIGlzY3NpX3B0cihfaGFuZGxlKSAoKHZvaWQqKSh1bnNpZ25lZCBsb25nKV9oYW5kbGUpCiAjZGVmaW5lIGlzY3NpX2hhbmRsZShfcHRyKSAoKHVpbnQ2NF90KSh1bnNpZ25lZCBsb25nKV9wdHIpCisjZGVmaW5lIGhvc3RkYXRhX3Nlc3Npb24oX2hvc3RkYXRhKSAoaXNjc2lfcHRyKCoodW5zaWduZWQgbG9uZyAqKV9ob3N0ZGF0YSkpCisKKy8qKgorICogaXNjc2lfaG9zdGRhdGEgLSBnZXQgTExEIGhvc3RkYXRhIGZyb20gc2NzaV9ob3N0CisgKiBAX2hvc3RkYXRhOiBwb2ludGVyIHRvIHNjc2kgaG9zdCdzIGhvc3RkYXRhCisgKiovCiAjZGVmaW5lIGlzY3NpX2hvc3RkYXRhKF9ob3N0ZGF0YSkgKCh2b2lkKilfaG9zdGRhdGEgKyBzaXplb2YodW5zaWduZWQgbG9uZykpCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaS5oIGIvaW5jbHVkZS9zY3NpL3Njc2kuaAppbmRleCA2Y2IxZTI3Li5jNjBiOGZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaS5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpLmgKQEAgLTMyLDYgKzMyLDEyIEBACiBleHRlcm4gY29uc3QgY2hhciAqY29uc3Qgc2NzaV9kZXZpY2VfdHlwZXNbTUFYX1NDU0lfREVWSUNFX0NPREVdOwogCiAvKgorICogU3BlY2lhbCB2YWx1ZSBmb3Igc2Nhbm5pbmcgdG8gc3BlY2lmeSBzY2FubmluZyBvciByZXNjYW5uaW5nIG9mIGFsbAorICogcG9zc2libGUgY2hhbm5lbHMsICh0YXJnZXQpIGlkcywgb3IgbHVucyBvbiBhIGdpdmVuIHNob3N0LgorICovCisjZGVmaW5lIFNDQU5fV0lMRF9DQVJECX4wCisKKy8qCiAgKiAgICAgIFNDU0kgb3Bjb2RlcwogICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX2NtbmQuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX2NtbmQuaAppbmRleCA0MWNmYzI5Li43NTI5ZjQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV9jbW5kLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfY21uZC5oCkBAIC0xNTEsNiArMTUxLDUgQEAKIGV4dGVybiB2b2lkIHNjc2lfcHV0X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqKTsKIGV4dGVybiB2b2lkIHNjc2lfaW9fY29tcGxldGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKIGV4dGVybiB2b2lkIHNjc2lfZmluaXNoX2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKLWV4dGVybiB2b2lkIHNjc2lfc2V0dXBfYmxrX3BjX2NtbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKIAogI2VuZGlmIC8qIF9TQ1NJX1NDU0lfQ01ORF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmggYi9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmgKaW5kZXggMjMwYmM1NS4uNDY3Mjc0YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaApAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiBzdHJ1Y3QgYmxvY2tfZGV2aWNlOwogc3RydWN0IGNvbXBsZXRpb247CkBAIC00NjksNyArNDcwLDcgQEAKIAlzcGlubG9ja190CQlkZWZhdWx0X2xvY2s7CiAJc3BpbmxvY2tfdAkJKmhvc3RfbG9jazsKIAotCXN0cnVjdCBzZW1hcGhvcmUJc2Nhbl9tdXRleDsvKiBzZXJpYWxpemUgc2Nhbm5pbmcgYWN0aXZpdHkgKi8KKwlzdHJ1Y3QgbXV0ZXgJCXNjYW5fbXV0ZXg7Lyogc2VyaWFsaXplIHNjYW5uaW5nIGFjdGl2aXR5ICovCiAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWVoX2NtZF9xOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAgICAqIGVoYW5kbGVyOyAgLyogRXJyb3IgcmVjb3ZlcnkgdGhyZWFkLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0LmggYi9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnQuaAppbmRleCBmNmUwYmI0Li5lN2IxMDU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnQuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnQuaApAQCAtMzAsMTIgKzMwLDkgQEAKIAlzdHJ1Y3QgdHJhbnNwb3J0X2NvbnRhaW5lciBkZXZpY2VfYXR0cnM7CiAKIAkvKgotCSAqIElmIHNldCwgY2FsbCB0YXJnZXRfcGFyZW50IHByaW9yIHRvIGFsbG9jYXRpbmcgYSBzY3NpX3RhcmdldCwKLQkgKiBzbyB3ZSBnZXQgdGhlIGFwcHJvcHJpYXRlIHBhcmVudCBmb3IgdGhlIHRhcmdldC4gVGhpcyBmdW5jdGlvbgotCSAqIGlzIHJlcXVpcmVkIGZvciB0cmFuc3BvcnRzIGxpa2UgRkMgYW5kIGlTQ1NJIHRoYXQgZG8gbm90IHB1dCB0aGUKLQkgKiBzY3NpX3RhcmdldCB1bmRlciBzY3NpX2hvc3QuCisJICogSWYgc2V0LCBjYWxsZWQgZnJvbSBzeXNmcyBhbmQgbGVnYWN5IHByb2NmcyByZXNjYW5uaW5nIGNvZGUuCiAJICovCi0Jc3RydWN0IGRldmljZSAqKCp0YXJnZXRfcGFyZW50KShzdHJ1Y3QgU2NzaV9Ib3N0ICosIGludCwgdWludCk7CisJaW50ICgqdXNlcl9zY2FuKShzdHJ1Y3QgU2NzaV9Ib3N0ICosIHVpbnQsIHVpbnQsIHVpbnQpOwogCiAJLyogVGhlIHNpemUgb2YgdGhlIHNwZWNpZmljIHRyYW5zcG9ydCBhdHRyaWJ1dGUgc3RydWN0dXJlIChhCiAJICogc3BhY2Ugb2YgdGhpcyBzaXplIHdpbGwgYmUgbGVmdCBhdCB0aGUgZW5kIG9mIHRoZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmggYi9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuaAppbmRleCAzOTRmMTRhLi5jZjNmZWM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuaApAQCAtMzAzLDYgKzMwMyw3IEBACiAJLyogRml4ZWQgQXR0cmlidXRlcyAqLwogCXU2NCBub2RlX25hbWU7CiAJdTY0IHBvcnRfbmFtZTsKKwl1NjQgcGVybWFuZW50X3BvcnRfbmFtZTsKIAl1MzIgc3VwcG9ydGVkX2NsYXNzZXM7CiAJdTggIHN1cHBvcnRlZF9mYzRzW0ZDX0ZDNF9MSVNUX1NJWkVdOwogCWNoYXIgc3ltYm9saWNfbmFtZVtGQ19TWU1CT0xJQ19OQU1FX1NJWkVdOwpAQCAtMzM4LDYgKzMzOSw4IEBACiAJKCgoc3RydWN0IGZjX2hvc3RfYXR0cnMgKikoeCktPnNob3N0X2RhdGEpLT5ub2RlX25hbWUpCiAjZGVmaW5lIGZjX2hvc3RfcG9ydF9uYW1lKHgpCVwKIAkoKChzdHJ1Y3QgZmNfaG9zdF9hdHRycyAqKSh4KS0+c2hvc3RfZGF0YSktPnBvcnRfbmFtZSkKKyNkZWZpbmUgZmNfaG9zdF9wZXJtYW5lbnRfcG9ydF9uYW1lKHgpCVwKKwkoKChzdHJ1Y3QgZmNfaG9zdF9hdHRycyAqKSh4KS0+c2hvc3RfZGF0YSktPnBlcm1hbmVudF9wb3J0X25hbWUpCiAjZGVmaW5lIGZjX2hvc3Rfc3VwcG9ydGVkX2NsYXNzZXMoeCkJXAogCSgoKHN0cnVjdCBmY19ob3N0X2F0dHJzICopKHgpLT5zaG9zdF9kYXRhKS0+c3VwcG9ydGVkX2NsYXNzZXMpCiAjZGVmaW5lIGZjX2hvc3Rfc3VwcG9ydGVkX2ZjNHMoeCkJXApAQCAtNDI2LDYgKzQyOSw3IEBACiAJLyogaG9zdCBmaXhlZCBhdHRyaWJ1dGVzICovCiAJdW5zaWduZWQgbG9uZwlzaG93X2hvc3Rfbm9kZV9uYW1lOjE7CiAJdW5zaWduZWQgbG9uZwlzaG93X2hvc3RfcG9ydF9uYW1lOjE7CisJdW5zaWduZWQgbG9uZwlzaG93X2hvc3RfcGVybWFuZW50X3BvcnRfbmFtZToxOwogCXVuc2lnbmVkIGxvbmcJc2hvd19ob3N0X3N1cHBvcnRlZF9jbGFzc2VzOjE7CiAJdW5zaWduZWQgbG9uZwlzaG93X2hvc3Rfc3VwcG9ydGVkX2ZjNHM6MTsKIAl1bnNpZ25lZCBsb25nCXNob3dfaG9zdF9zeW1ib2xpY19uYW1lOjE7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5oCmluZGV4IGYyNTA0MWMuLjE2NjAyYTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5oCkBAIC0yMyw4ICsyMywxNCBAQAogI2lmbmRlZiBTQ1NJX1RSQU5TUE9SVF9JU0NTSV9ICiAjZGVmaW5lIFNDU0lfVFJBTlNQT1JUX0lTQ1NJX0gKIAorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPHNjc2kvaXNjc2lfaWYuaD4KIAorc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlOworc3RydWN0IFNjc2lfSG9zdDsKK3N0cnVjdCBtZW1wb29sX3pvbmU7CitzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm47CisKIC8qKgogICogc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAtIGlTQ1NJIFRyYW5zcG9ydCB0ZW1wbGF0ZQogICoKQEAgLTQ4LDIzICs1NCwzMSBAQAogCWNoYXIgKm5hbWU7CiAJdW5zaWduZWQgaW50IGNhcHM7CiAJc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqaG9zdF90ZW1wbGF0ZTsKKwkvKiBMTEQgc2Vzc2lvbi9zY3NpX2hvc3QgZGF0YSBzaXplICovCiAJaW50IGhvc3RkYXRhX3NpemU7CisJLyogTExEIGlzY3NpX2hvc3QgZGF0YSBzaXplICovCisJaW50IGlob3N0ZGF0YV9zaXplOworCS8qIExMRCBjb25uZWN0aW9uIGRhdGEgc2l6ZSAqLworCWludCBjb25uZGF0YV9zaXplOwogCWludCBtYXhfbHVuOwogCXVuc2lnbmVkIGludCBtYXhfY29ubjsKIAl1bnNpZ25lZCBpbnQgbWF4X2NtZF9sZW47Ci0JaXNjc2lfc2Vzc2lvbmhfdCAoKmNyZWF0ZV9zZXNzaW9uKSAodWludDMyX3QgaW5pdGlhbF9jbWRzbiwKLQkJCQkJICAgIHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KTsKLQl2b2lkICgqZGVzdHJveV9zZXNzaW9uKSAoaXNjc2lfc2Vzc2lvbmhfdCBzZXNzaW9uKTsKLQlpc2NzaV9jb25uaF90ICgqY3JlYXRlX2Nvbm4pIChpc2NzaV9zZXNzaW9uaF90IHNlc3Npb24sIHVpbnQzMl90IGNpZCk7CisJc3RydWN0IFNjc2lfSG9zdCAqKCpjcmVhdGVfc2Vzc2lvbikgKHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqdCwKKwkJCQkJICAgICB1aW50MzJfdCBpbml0aWFsX2NtZHNuKTsKKwl2b2lkICgqZGVzdHJveV9zZXNzaW9uKSAoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpOworCXN0cnVjdCBpc2NzaV9jbHNfY29ubiAqKCpjcmVhdGVfY29ubikgKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAorCQkJCXVpbnQzMl90IGNpZCk7CiAJaW50ICgqYmluZF9jb25uKSAoaXNjc2lfc2Vzc2lvbmhfdCBzZXNzaW9uLCBpc2NzaV9jb25uaF90IGNvbm4sCiAJCQkgIHVpbnQzMl90IHRyYW5zcG9ydF9mZCwgaW50IGlzX2xlYWRpbmcpOwogCWludCAoKnN0YXJ0X2Nvbm4pIChpc2NzaV9jb25uaF90IGNvbm4pOwogCXZvaWQgKCpzdG9wX2Nvbm4pIChpc2NzaV9jb25uaF90IGNvbm4sIGludCBmbGFnKTsKLQl2b2lkICgqZGVzdHJveV9jb25uKSAoaXNjc2lfY29ubmhfdCBjb25uKTsKKwl2b2lkICgqZGVzdHJveV9jb25uKSAoc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uKTsKIAlpbnQgKCpzZXRfcGFyYW0pIChpc2NzaV9jb25uaF90IGNvbm4sIGVudW0gaXNjc2lfcGFyYW0gcGFyYW0sCiAJCQkgIHVpbnQzMl90IHZhbHVlKTsKLQlpbnQgKCpnZXRfcGFyYW0pIChpc2NzaV9jb25uaF90IGNvbm4sIGVudW0gaXNjc2lfcGFyYW0gcGFyYW0sCi0JCQkgIHVpbnQzMl90ICp2YWx1ZSk7CisJaW50ICgqZ2V0X2Nvbm5fcGFyYW0pICh2b2lkICpjb25uZGF0YSwgZW51bSBpc2NzaV9wYXJhbSBwYXJhbSwKKwkJCSAgICAgICB1aW50MzJfdCAqdmFsdWUpOworCWludCAoKmdldF9zZXNzaW9uX3BhcmFtKSAoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCisJCQkJICBlbnVtIGlzY3NpX3BhcmFtIHBhcmFtLCB1aW50MzJfdCAqdmFsdWUpOwogCWludCAoKnNlbmRfcGR1KSAoaXNjc2lfY29ubmhfdCBjb25uLCBzdHJ1Y3QgaXNjc2lfaGRyICpoZHIsCiAJCQkgY2hhciAqZGF0YSwgdWludDMyX3QgZGF0YV9zaXplKTsKIAl2b2lkICgqZ2V0X3N0YXRzKSAoaXNjc2lfY29ubmhfdCBjb25uLCBzdHJ1Y3QgaXNjc2lfc3RhdHMgKnN0YXRzKTsKQEAgLTczLDcgKzg3LDcgQEAKIC8qCiAgKiB0cmFuc3BvcnQgcmVnaXN0cmF0aW9uIHVwY2FsbHMKICAqLwotZXh0ZXJuIGludCBpc2NzaV9yZWdpc3Rlcl90cmFuc3BvcnQoc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHQpOworZXh0ZXJuIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqaXNjc2lfcmVnaXN0ZXJfdHJhbnNwb3J0KHN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnR0KTsKIGV4dGVybiBpbnQgaXNjc2lfdW5yZWdpc3Rlcl90cmFuc3BvcnQoc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHQpOwogCiAvKgpAQCAtODMsNCArOTcsNDkgQEAKIGV4dGVybiBpbnQgaXNjc2lfcmVjdl9wZHUoaXNjc2lfY29ubmhfdCBjb25uLCBzdHJ1Y3QgaXNjc2lfaGRyICpoZHIsCiAJCQkgIGNoYXIgKmRhdGEsIHVpbnQzMl90IGRhdGFfc2l6ZSk7CiAKK3N0cnVjdCBpc2NzaV9jbHNfY29ubiB7CisJc3RydWN0IGxpc3RfaGVhZCBjb25uX2xpc3Q7CS8qIGl0ZW0gaW4gY29ubmxpc3QgKi8KKwl2b2lkICpkZF9kYXRhOwkJCS8qIExMRCBwcml2YXRlIGRhdGEgKi8KKwlzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisJaXNjc2lfY29ubmhfdCBjb25uaDsKKwlpbnQgYWN0aXZlOwkJCS8qIG11c3QgYmUgYWNjZXNzZWQgd2l0aCB0aGUgY29ubmxvY2sgKi8KKwlzdHJ1Y3QgZGV2aWNlIGRldjsJCS8qIHN5c2ZzIHRyYW5zcG9ydC9jb250YWluZXIgZGV2aWNlICovCisJc3RydWN0IG1lbXBvb2xfem9uZSAqel9lcnJvcjsKKwlzdHJ1Y3QgbWVtcG9vbF96b25lICp6X3BkdTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVxdWV1ZTsKK307CisKKyNkZWZpbmUgaXNjc2lfZGV2X3RvX2Nvbm4oX2RldikgXAorCWNvbnRhaW5lcl9vZihfZGV2LCBzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4sIGRldikKKworc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CS8qIGl0ZW0gaW4gc2Vzc2lvbl9saXN0ICovCisJc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHJhbnNwb3J0OworCXN0cnVjdCBkZXZpY2UgZGV2OwkvKiBzeXNmcyB0cmFuc3BvcnQvY29udGFpbmVyIGRldmljZSAqLworfTsKKworI2RlZmluZSBpc2NzaV9kZXZfdG9fc2Vzc2lvbihfZGV2KSBcCisJY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiwgZGV2KQorCisjZGVmaW5lIGlzY3NpX3Nlc3Npb25fdG9fc2hvc3QoX3Nlc3Npb24pIFwKKwlkZXZfdG9fc2hvc3QoX3Nlc3Npb24tPmRldi5wYXJlbnQpCisKKy8qCisgKiBzZXNzaW9uIGFuZCBjb25uZWN0aW9uIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIGJ5IEhXIGlTQ1NJIExMRHMKKyAqLworZXh0ZXJuIHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqaXNjc2lfY3JlYXRlX3Nlc3Npb24oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCisJCQkJc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdCk7CitleHRlcm4gaW50IGlzY3NpX2Rlc3Ryb3lfc2Vzc2lvbihzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3Npb24pOworZXh0ZXJuIHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqaXNjc2lfY3JlYXRlX2Nvbm4oc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzLAorCQkJCQkgICAgdWludDMyX3QgY2lkKTsKK2V4dGVybiBpbnQgaXNjc2lfZGVzdHJveV9jb25uKHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY29ubik7CisKKy8qCisgKiBzZXNzaW9uIGZ1bmN0aW9ucyB1c2VkIGJ5IHNvZnR3YXJlIGlzY3NpCisgKi8KK2V4dGVybiBzdHJ1Y3QgU2NzaV9Ib3N0ICoKK2lzY3NpX3RyYW5zcG9ydF9jcmVhdGVfc2Vzc2lvbihzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKnNjc2l0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnRyYW5zcG9ydCk7CitleHRlcm4gaW50IGlzY3NpX3RyYW5zcG9ydF9kZXN0cm95X3Nlc3Npb24oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuaAppbmRleCA1NGE4OTYxLi5mYjVhMmZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfc3BpLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5oCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC90cmFuc3BvcnRfY2xhc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGU7CiBzdHJ1Y3Qgc2NzaV90YXJnZXQ7CkBAIC01NCw3ICs1NSw3IEBACiAJdW5zaWduZWQgaW50IHN1cHBvcnRfcWFzOyAvKiBzdXBwb3J0cyBxdWljayBhcmJpdHJhdGlvbiBhbmQgc2VsZWN0aW9uICovCiAJLyogUHJpdmF0ZSBGaWVsZHMgKi8KIAl1bnNpZ25lZCBpbnQgZHZfcGVuZGluZzoxOyAvKiBJbnRlcm5hbCBmbGFnICovCi0Jc3RydWN0IHNlbWFwaG9yZSBkdl9zZW07IC8qIHNlbWFwaG9yZSB0byBzZXJpYWxpc2UgZHYgKi8KKwlzdHJ1Y3QgbXV0ZXggZHZfbXV0ZXg7IC8qIHNlbWFwaG9yZSB0byBzZXJpYWxpc2UgZHYgKi8KIH07CiAKIGVudW0gc3BpX3NpZ25hbF90eXBlIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvY29yZS5oIGIvaW5jbHVkZS9zb3VuZC9jb3JlLmgKaW5kZXggOTBhYzYxMy4uMzA5M2UzZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9jb3JlLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9jb3JlLmgKQEAgLTMxNyw3ICszMTcsNyBAQAogI2lmZGVmIENPTkZJR19TTkRfVkVSQk9TRV9QUklOVEsKIC8qKgogICogc25kX3ByaW50ZCAtIGRlYnVnIHByaW50awotICogQGZvcm1hdDogZm9ybWF0IHN0cmluZworICogQGZtdDogZm9ybWF0IHN0cmluZwogICoKICAqIENvbXBpbGVkIG9ubHkgd2hlbiBXb3JrcyBsaWtlIHNuZF9wcmludGsoKSBmb3IgZGVidWdnaW5nIHB1cnBvc2UuCiAgKiBJZ25vcmVkIHdoZW4gQ09ORklHX1NORF9ERUJVRyBpcyBub3Qgc2V0LgpAQCAtMzMxLDcgKzMzMSw2IEBACiAvKioKICAqIHNuZF9hc3NlcnQgLSBydW4tdGltZSBhc3NlcnRpb24gbWFjcm8KICAqIEBleHByOiBleHByZXNzaW9uCi0gKiBAYXJncy4uLjogdGhlIGFjdGlvbgogICoKICAqIFRoaXMgbWFjcm8gY2hlY2tzIHRoZSBleHByZXNzaW9uIGluIHJ1bi10aW1lIGFuZCBpbnZva2VzIHRoZSBjb21tYW5kcwogICogZ2l2ZW4gaW4gdGhlIHJlc3QgYXJndW1lbnRzIGlmIHRoZSBhc3NlcnRpb24gaXMgZmFpbGVkLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC93YXZlZnJvbnQuaCBiL2luY2x1ZGUvc291bmQvd2F2ZWZyb250LmgKaW5kZXggOWU1NzJhZS4uMTVkODJlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC93YXZlZnJvbnQuaAorKysgYi9pbmNsdWRlL3NvdW5kL3dhdmVmcm9udC5oCkBAIC00NTQsMjIgKzQ1NCwyMiBAQAogfSB3YXZlZnJvbnRfbXVsdGlzYW1wbGU7CiAKIHR5cGVkZWYgc3RydWN0IHdmX2FsaWFzIHsKLSAgICBzMTYgT3JpZ2luYWxTYW1wbGUgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworICAgIHMxNiBPcmlnaW5hbFNhbXBsZTsKIAotICAgIHN0cnVjdCB3Zl9zYW1wbGVfb2Zmc2V0IHNhbXBsZVN0YXJ0T2Zmc2V0IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLSAgICBzdHJ1Y3Qgd2Zfc2FtcGxlX29mZnNldCBsb29wU3RhcnRPZmZzZXQgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotICAgIHN0cnVjdCB3Zl9zYW1wbGVfb2Zmc2V0IHNhbXBsZUVuZE9mZnNldCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0gICAgc3RydWN0IHdmX3NhbXBsZV9vZmZzZXQgbG9vcEVuZE9mZnNldCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisgICAgc3RydWN0IHdmX3NhbXBsZV9vZmZzZXQgc2FtcGxlU3RhcnRPZmZzZXQ7CisgICAgc3RydWN0IHdmX3NhbXBsZV9vZmZzZXQgbG9vcFN0YXJ0T2Zmc2V0OworICAgIHN0cnVjdCB3Zl9zYW1wbGVfb2Zmc2V0IHNhbXBsZUVuZE9mZnNldDsKKyAgICBzdHJ1Y3Qgd2Zfc2FtcGxlX29mZnNldCBsb29wRW5kT2Zmc2V0OwogCi0gICAgczE2ICBGcmVxdWVuY3lCaWFzIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyAgICBzMTYgIEZyZXF1ZW5jeUJpYXM7CiAKLSAgICB1OCBTYW1wbGVSZXNvbHV0aW9uOjIgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLSAgICB1OCBVbnVzZWQxOjEgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLSAgICB1OCBMb29wOjEgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotICAgIHU4IEJpZGlyZWN0aW9uYWw6MSAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotICAgIHU4IFVudXNlZDI6MSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0gICAgdTggUmV2ZXJzZToxIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLSAgICB1OCBVbnVzZWQzOjEgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOyAKKyAgICB1OCBTYW1wbGVSZXNvbHV0aW9uOjI7CisgICAgdTggVW51c2VkMToxOworICAgIHU4IExvb3A6MTsKKyAgICB1OCBCaWRpcmVjdGlvbmFsOjE7CisgICAgdTggVW51c2VkMjoxOworICAgIHU4IFJldmVyc2U6MTsKKyAgICB1OCBVbnVzZWQzOjE7CiAgICAgCiAgICAgLyogVGhpcyBzdHJ1Y3R1cmUgaXMgbWVhbnQgdG8gYmUgcGFkZGVkIG9ubHkgdG8gMTYgYml0cyBvbiB0aGVpcgogICAgICAgIG9yaWdpbmFsLiBPZiBjb3Vyc2UsIHdob2V2ZXIgd3JvdGUgdGhlaXIgZG9jdW1lbnRhdGlvbiBkaWRuJ3QKQEAgLTQ4MCw4ICs0ODAsOCBAQAogICAgICAgIHN0YW5kYXJkIDE2LT4zMiBiaXQgaXNzdWVzLgogICAgICovCiAKLSAgICB1OCBzaXh0ZWVuX2JpdF9wYWRkaW5nIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLX0gd2F2ZWZyb250X2FsaWFzOworICAgIHU4IHNpeHRlZW5fYml0X3BhZGRpbmc7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHdhdmVmcm9udF9hbGlhczsKIAogdHlwZWRlZiBzdHJ1Y3Qgd2ZfZHJ1bSB7CiAgICAgdTggUGF0Y2hOdW1iZXI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL2N5YmxhZmIuaCBiL2luY2x1ZGUvdmlkZW8vY3libGFmYi5oCmluZGV4IGE5OTQ4MjMuLjcxNzQ0MDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdmlkZW8vY3libGFmYi5oCisrKyBiL2luY2x1ZGUvdmlkZW8vY3libGFmYi5oCkBAIC0xNTMsNiArMTUzLDEwIEBACiAjZGVmaW5lIEdFMDQJKEdFQmFzZSsweDA0KQkvLyBzb3VyY2UgMiwgcCAxMTEKICNkZWZpbmUgR0UwOAkoR0VCYXNlKzB4MDgpCS8vIGRlc3RpbmF0aW9uIDEsIHAgMTExCiAjZGVmaW5lIEdFMEMJKEdFQmFzZSsweDBDKQkvLyBkZXN0aW5hdGlvbiAyLCBwIDExMgorI2RlZmluZSBHRTEwCShHRUJhc2UrMHgxMCkJLy8gcmlnaHQgdmlldyBiYXNlICYgZW5hYmxlLCBwIDExMgorI2RlZmluZSBHRTEzCShHRUJhc2UrMHgxMykJLy8gbGVmdCB2aWV3IGJhc2UgJiBlbmFibGUsIHAgMTEyCisjZGVmaW5lIEdFMTgJKEdFQmFzZSsweDE4KQkvLyBibG9jayB3cml0ZSBzdGFydCBhZGRyZXNzLCBwIDExMgorI2RlZmluZSBHRTFDCShHRUJhc2UrMHgxQykJLy8gYmxvY2sgd3JpdGUgZW5kIGFkZHJlc3MsIHAgMTEyCiAjZGVmaW5lIEdFMjAJKEdFQmFzZSsweDIwKQkvLyBlbmdpbmUgc3RhdHVzLCBwIDExMwogI2RlZmluZSBHRTI0CShHRUJhc2UrMHgyNCkJLy8gcmVzZXQgYWxsIEdFIHBvaW50ZXJzCiAjZGVmaW5lIEdFNDQJKEdFQmFzZSsweDQ0KQkvLyBjb21tYW5kIHJlZ2lzdGVyLCBwIDEyNgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS92aWRlby9reXJvLmggYi9pbmNsdWRlL3ZpZGVvL2t5cm8uaAppbmRleCAxYmVkMzdjLi5kYmE3ZGUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3ZpZGVvL2t5cm8uaAorKysgYi9pbmNsdWRlL3ZpZGVvL2t5cm8uaApAQCAtMTUsNiArMTUsNyBAQAogc3RydWN0IGt5cm9mYl9pbmZvIHsKIAl2b2lkIF9faW9tZW0gKnJlZ2Jhc2U7CiAKKwl1MzIgcGFsZXR0ZVsxNl07CiAJdTMyIEhUb3Q7CS8qIEhvciBUb3RhbCBUaW1lICAgICovCiAJdTMyIEhGUDsJLyogSG9yIEZyb250IFBvcmNoICAgKi8KIAl1MzIgSFNUOwkvKiBIb3IgU3luYyBUaW1lICAgICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS92aWRlby9uZW9tYWdpYy5oIGIvaW5jbHVkZS92aWRlby9uZW9tYWdpYy5oCmluZGV4IGJkYWVlNzAuLjFkNjkwNDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdmlkZW8vbmVvbWFnaWMuaAorKysgYi9pbmNsdWRlL3ZpZGVvL25lb21hZ2ljLmgKQEAgLTE5Niw2ICsxOTYsNyBAQAogCWludCBpbnRlcm5hbF9kaXNwbGF5OwogCWludCBleHRlcm5hbF9kaXNwbGF5OwogCWludCBsaWJyZXR0bzsKKwl1MzIgcGFsZXR0ZVsxNl07CiB9OwogCiB0eXBlZGVmIHN0cnVjdCB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL25ld3BvcnQuaCBiL2luY2x1ZGUvdmlkZW8vbmV3cG9ydC5oCmluZGV4IDgxMmRhYzUuLjFmNWViZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdmlkZW8vbmV3cG9ydC5oCisrKyBiL2luY2x1ZGUvdmlkZW8vbmV3cG9ydC5oCkBAIC0zODIsNyArMzgyLDggQEAKICNkZWZpbmUgVkMyX0lSRUdfQ09OVFJPTCAgICAgICAweDEwCiAjZGVmaW5lIFZDMl9JUkVHX0NPTkZJRyAgICAgICAgMHgyMAogCi1leHRlcm4gX19pbmxpbmVfXyB2b2lkIG5ld3BvcnRfdmMyX3NldChzdHJ1Y3QgbmV3cG9ydF9yZWdzICpyZWdzLCB1bnNpZ25lZCBjaGFyIHZjMmlyZWcsCitzdGF0aWMgaW5saW5lIHZvaWQgbmV3cG9ydF92YzJfc2V0KHN0cnVjdCBuZXdwb3J0X3JlZ3MgKnJlZ3MsCisJCQkJICAgdW5zaWduZWQgY2hhciB2YzJpcmVnLAogCQkJCSAgIHVuc2lnbmVkIHNob3J0IHZhbCkKIHsKIAlyZWdzLT5zZXQuZGNibW9kZSA9IChOUE9SVF9ETU9ERV9BVkMyIHwgVkMyX1JFR0FERFJfSU5ERVggfCBOUE9SVF9ETU9ERV9XMyB8CkBAIC0zOTAsNyArMzkxLDcgQEAKIAlyZWdzLT5zZXQuZGNiZGF0YTAuYnl3b3JkID0gKHZjMmlyZWcgPDwgMjQpIHwgKHZhbCA8PCA4KTsKIH0KIAotZXh0ZXJuIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgbmV3cG9ydF92YzJfZ2V0KHN0cnVjdCBuZXdwb3J0X3JlZ3MgKnJlZ3MsCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IG5ld3BvcnRfdmMyX2dldChzdHJ1Y3QgbmV3cG9ydF9yZWdzICpyZWdzLAogCQkJCQkgICAgIHVuc2lnbmVkIGNoYXIgdmMyaXJlZykKIHsKIAlyZWdzLT5zZXQuZGNibW9kZSA9IChOUE9SVF9ETU9ERV9BVkMyIHwgVkMyX1JFR0FERFJfSU5ERVggfCBOUE9SVF9ETU9ERV9XMSB8CmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL3NzdGZiLmggYi9pbmNsdWRlL3ZpZGVvL3NzdGZiLmgKaW5kZXggMGQ3N2I1Mi4uMzU3MGY5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS92aWRlby9zc3RmYi5oCisrKyBiL2luY2x1ZGUvdmlkZW8vc3N0ZmIuaApAQCAtMzM0LDYgKzMzNCw3IEBACiB9OwogCiBzdHJ1Y3Qgc3N0ZmJfcGFyIHsKKwl1MzIgcGFsZXR0ZVsxNl07CiAJdW5zaWduZWQgaW50IHlEaW07CiAJdW5zaWduZWQgaW50IGhTeW5jT247CS8qIGhzeW5jX2xlbiAqLwogCXVuc2lnbmVkIGludCBoU3luY09mZjsJLyogbGVmdF9tYXJnaW4gKyB4cmVzICsgcmlnaHRfbWFyZ2luICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL3RkZnguaCBiL2luY2x1ZGUvdmlkZW8vdGRmeC5oCmluZGV4IDA0MjM3NjcuLmMxY2M5NGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdmlkZW8vdGRmeC5oCisrKyBiL2luY2x1ZGUvdmlkZW8vdGRmeC5oCkBAIC0xNDAsNTIgKzE0MCw1MiBAQAogI2lmZGVmIF9fS0VSTkVMX18KIAogc3RydWN0IGJhbnNoZWVfcmVnIHsKLSAgLyogVkdBIHJ1YmJpc2ggKi8KLSAgdW5zaWduZWQgY2hhciBhdHRbMjFdOwotICB1bnNpZ25lZCBjaGFyIGNydFsyNV07Ci0gIHVuc2lnbmVkIGNoYXIgZ3JhWyA5XTsKLSAgdW5zaWduZWQgY2hhciBtaXNjWzFdOwotICB1bnNpZ25lZCBjaGFyIHNlcVsgNV07CisJLyogVkdBIHJ1YmJpc2ggKi8KKwl1bnNpZ25lZCBjaGFyIGF0dFsyMV07CisJdW5zaWduZWQgY2hhciBjcnRbMjVdOworCXVuc2lnbmVkIGNoYXIgZ3JhWyA5XTsKKwl1bnNpZ25lZCBjaGFyIG1pc2NbMV07CisJdW5zaWduZWQgY2hhciBzZXFbIDVdOwogCi0gIC8qIEJhbnNoZWUgZXh0ZW5zaW9ucyAqLwotICB1bnNpZ25lZCBjaGFyIGV4dFsyXTsKLSAgdW5zaWduZWQgbG9uZyB2aWRjZmc7Ci0gIHVuc2lnbmVkIGxvbmcgdmlkcGxsOwotICB1bnNpZ25lZCBsb25nIG1lbXBsbDsKLSAgdW5zaWduZWQgbG9uZyBnZnhwbGw7Ci0gIHVuc2lnbmVkIGxvbmcgZGFjbW9kZTsKLSAgdW5zaWduZWQgbG9uZyB2Z2Fpbml0MDsKLSAgdW5zaWduZWQgbG9uZyB2Z2Fpbml0MTsKLSAgdW5zaWduZWQgbG9uZyBzY3JlZW5zaXplOwotICB1bnNpZ25lZCBsb25nIHN0cmlkZTsKLSAgdW5zaWduZWQgbG9uZyBjdXJzbG9jOwotICB1bnNpZ25lZCBsb25nIGN1cnNwYXRhZGRyOwotICB1bnNpZ25lZCBsb25nIGN1cnNjMDsKLSAgdW5zaWduZWQgbG9uZyBjdXJzYzE7Ci0gIHVuc2lnbmVkIGxvbmcgc3RhcnRhZGRyOwotICB1bnNpZ25lZCBsb25nIGNsaXAwbWluOwotICB1bnNpZ25lZCBsb25nIGNsaXAwbWF4OwotICB1bnNpZ25lZCBsb25nIGNsaXAxbWluOwotICB1bnNpZ25lZCBsb25nIGNsaXAxbWF4OwotICB1bnNpZ25lZCBsb25nIHNyY2Jhc2U7Ci0gIHVuc2lnbmVkIGxvbmcgZHN0YmFzZTsKLSAgdW5zaWduZWQgbG9uZyBtaXNjaW5pdDA7CQorCS8qIEJhbnNoZWUgZXh0ZW5zaW9ucyAqLworCXVuc2lnbmVkIGNoYXIgZXh0WzJdOworCXVuc2lnbmVkIGxvbmcgdmlkY2ZnOworCXVuc2lnbmVkIGxvbmcgdmlkcGxsOworCXVuc2lnbmVkIGxvbmcgbWVtcGxsOworCXVuc2lnbmVkIGxvbmcgZ2Z4cGxsOworCXVuc2lnbmVkIGxvbmcgZGFjbW9kZTsKKwl1bnNpZ25lZCBsb25nIHZnYWluaXQwOworCXVuc2lnbmVkIGxvbmcgdmdhaW5pdDE7CisJdW5zaWduZWQgbG9uZyBzY3JlZW5zaXplOworCXVuc2lnbmVkIGxvbmcgc3RyaWRlOworCXVuc2lnbmVkIGxvbmcgY3Vyc2xvYzsKKwl1bnNpZ25lZCBsb25nIGN1cnNwYXRhZGRyOworCXVuc2lnbmVkIGxvbmcgY3Vyc2MwOworCXVuc2lnbmVkIGxvbmcgY3Vyc2MxOworCXVuc2lnbmVkIGxvbmcgc3RhcnRhZGRyOworCXVuc2lnbmVkIGxvbmcgY2xpcDBtaW47CisJdW5zaWduZWQgbG9uZyBjbGlwMG1heDsKKwl1bnNpZ25lZCBsb25nIGNsaXAxbWluOworCXVuc2lnbmVkIGxvbmcgY2xpcDFtYXg7CisJdW5zaWduZWQgbG9uZyBzcmNiYXNlOworCXVuc2lnbmVkIGxvbmcgZHN0YmFzZTsKKwl1bnNpZ25lZCBsb25nIG1pc2Npbml0MDsKIH07CiAKIHN0cnVjdCB0ZGZ4X3BhciB7Ci0gIHUzMiBtYXhfcGl4Y2xvY2s7CisJdTMyIG1heF9waXhjbG9jazsKKwl1MzIgcGFsZXR0ZVsxNl07CisJdm9pZCBfX2lvbWVtICpyZWdiYXNlX3ZpcnQ7CisJdW5zaWduZWQgbG9uZyBpb2Jhc2U7CisJdTMyIGJhc2VsaW5lOwogCi0gIHZvaWQgX19pb21lbSAqcmVnYmFzZV92aXJ0OwotICB1bnNpZ25lZCBsb25nIGlvYmFzZTsKLSAgdTMyIGJhc2VsaW5lOworCXN0cnVjdCB7CisJCWludCB3LHUsZDsKKwkJdW5zaWduZWQgbG9uZyBlbmFibGUsZGlzYWJsZTsKKwkJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJfSBod2N1cnNvcjsKIAotICBzdHJ1Y3QgewotICAgICBpbnQgdyx1LGQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZW5hYmxlLGRpc2FibGU7Ci0gICAgIHN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwotICB9IGh3Y3Vyc29yOyAKLQotICBzcGlubG9ja190IERBQ2xvY2s7CisJc3BpbmxvY2tfdCBEQUNsb2NrOwogfTsKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luaXQvS2NvbmZpZyBiL2luaXQvS2NvbmZpZwppbmRleCBiYTQyZjM3Li5iOTkyM2IxIDEwMDY0NAotLS0gYS9pbml0L0tjb25maWcKKysrIGIvaW5pdC9LY29uZmlnCkBAIC05OSw3ICs5OSw3IEBACiAJZGVmYXVsdCB5CiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBjaG9vc2Ugd2hldGhlciB5b3Ugd2FudCB0byBoYXZlIHN1cHBvcnQKLQkgIGZvciBzb2NhbGxlZCBzd2FwIGRldmljZXMgb3Igc3dhcCBmaWxlcyBpbiB5b3VyIGtlcm5lbCB0aGF0IGFyZQorCSAgZm9yIHNvIGNhbGxlZCBzd2FwIGRldmljZXMgb3Igc3dhcCBmaWxlcyBpbiB5b3VyIGtlcm5lbCB0aGF0IGFyZQogCSAgdXNlZCB0byBwcm92aWRlIG1vcmUgdmlydHVhbCBtZW1vcnkgdGhhbiB0aGUgYWN0dWFsIFJBTSBwcmVzZW50CiAJICBpbiB5b3VyIGNvbXB1dGVyLiAgSWYgdW5zdXJlIHNheSBZLgogCkBAIC0yMjgsNiArMjI4LDIzIEBACiAKIHNvdXJjZSAidXNyL0tjb25maWciCiAKK2NvbmZpZyBVSUQxNgorCWJvb2wgIkVuYWJsZSAxNi1iaXQgVUlEIHN5c3RlbSBjYWxscyIgaWYgRU1CRURERUQKKwlkZXBlbmRzIG9uIEFSTSB8fCBDUklTIHx8IEZSViB8fCBIODMwMCB8fCBYODZfMzIgfHwgTTY4SyB8fCAoUzM5MCAmJiAhNjRCSVQpIHx8IFNVUEVSSCB8fCBTUEFSQzMyIHx8IChTUEFSQzY0ICYmIFNQQVJDMzJfQ09NUEFUKSB8fCBVTUwgfHwgKFg4Nl82NCAmJiBJQTMyX0VNVUxBVElPTikKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgdGhlIGxlZ2FjeSAxNi1iaXQgVUlEIHN5c2NhbGwgd3JhcHBlcnMuCisKK2NvbmZpZyBWTTg2CisJZGVwZW5kcyBYODYKKwlkZWZhdWx0IHkKKwlib29sICJFbmFibGUgVk04NiBzdXBwb3J0IiBpZiBFTUJFRERFRAorCWhlbHAKKyAgICAgICAgICBUaGlzIG9wdGlvbiBpcyByZXF1aXJlZCBieSBwcm9ncmFtcyBsaWtlIERPU0VNVSB0byBydW4gMTYtYml0IGxlZ2FjeQorCSAgY29kZSBvbiBYODYgcHJvY2Vzc29ycy4gSXQgYWxzbyBtYXkgYmUgbmVlZGVkIGJ5IHNvZnR3YXJlIGxpa2UKKyAgICAgICAgICBYRnJlZTg2IHRvIGluaXRpYWxpemUgc29tZSB2aWRlbyBjYXJkcyB2aWEgQklPUy4gRGlzYWJsaW5nIHRoaXMKKyAgICAgICAgICBvcHRpb24gc2F2ZXMgYWJvdXQgNmsuCisKIGNvbmZpZyBDQ19PUFRJTUlaRV9GT1JfU0laRQogCWJvb2wgIk9wdGltaXplIGZvciBzaXplIChMb29rIG91dCBmb3IgYnJva2VuIGNvbXBpbGVycyEpIgogCWRlZmF1bHQgeQpAQCAtMzA5LDYgKzMyNiwxMiBAQAogICAgICAgICAgIG9wdGlvbiBmb3IgZW1iZWRkZWQgc3lzdGVtcyB3aXRoIG5vIGZhY2lsaXRpZXMgZm9yIHJlcG9ydGluZyBlcnJvcnMuCiAgICAgICAgICAgSnVzdCBzYXkgWS4KIAorY29uZmlnIEVMRl9DT1JFCisJZGVmYXVsdCB5CisJYm9vbCAiRW5hYmxlIEVMRiBjb3JlIGR1bXBzIiBpZiBFTUJFRERFRAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBnZW5lcmF0aW5nIGNvcmUgZHVtcHMuIERpc2FibGluZyBzYXZlcyBhYm91dCA0ay4KKwogY29uZmlnIEJBU0VfRlVMTAogCWRlZmF1bHQgeQogCWJvb2wgIkVuYWJsZSBmdWxsLXNpemVkIGRhdGEgc3RydWN0dXJlcyBmb3IgY29yZSIgaWYgRU1CRURERUQKQEAgLTM4MCw2ICs0MDMsMTUgQEAKIAkgIG5vIGR1bW15IG9wZXJhdGlvbnMgbmVlZCBiZSBleGVjdXRlZC4KIAkgIFplcm8gbWVhbnMgdXNlIGNvbXBpbGVyJ3MgZGVmYXVsdC4KIAorY29uZmlnIFNMQUIKKwlkZWZhdWx0IHkKKwlib29sICJVc2UgZnVsbCBTTEFCIGFsbG9jYXRvciIgaWYgRU1CRURERUQKKwloZWxwCisJICBEaXNhYmxpbmcgdGhpcyByZXBsYWNlcyB0aGUgYWR2YW5jZWQgU0xBQiBhbGxvY2F0b3IgYW5kCisJICBrbWFsbG9jIHN1cHBvcnQgd2l0aCB0aGUgZHJhc3RpY2FsbHkgc2ltcGxlciBTTE9CIGFsbG9jYXRvci4KKwkgIFNMT0IgaXMgbW9yZSBzcGFjZSBlZmZpY2llbnQgYnV0IGRvZXMgbm90IHNjYWxlIHdlbGwgYW5kIGlzCisJICBtb3JlIHN1c2NlcHRpYmxlIHRvIGZyYWdtZW50YXRpb24uCisKIGVuZG1lbnUJCSMgR2VuZXJhbCBzZXR1cAogCiBjb25maWcgVElOWV9TSE1FTQpAQCAtMzkxLDYgKzQyMywxMyBAQAogCWRlZmF1bHQgMCBpZiBCQVNFX0ZVTEwKIAlkZWZhdWx0IDEgaWYgIUJBU0VfRlVMTAogCitjb25maWcgU0xPQgorCWRlZmF1bHQgIVNMQUIKKwlib29sCisKK2NvbmZpZyBPQlNPTEVURV9JTlRFUk1PRFVMRQorCXRyaXN0YXRlCisKIG1lbnUgIkxvYWRhYmxlIG1vZHVsZSBzdXBwb3J0IgogCiBjb25maWcgTU9EVUxFUwpkaWZmIC0tZ2l0IGEvaW5pdC9tYWluLmMgYi9pbml0L21haW4uYwppbmRleCAyZWQzNjM4Li43Yzc5ZGE1IDEwMDY0NAotLS0gYS9pbml0L21haW4uYworKysgYi9pbml0L21haW4uYwpAQCAtNTQsMjcgKzU0LDIwIEBACiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAotLyoKLSAqIFRoaXMgaXMgb25lIG9mIHRoZSBmaXJzdCAuYyBmaWxlcyBidWlsdC4gRXJyb3Igb3V0IGVhcmx5Ci0gKiBpZiB3ZSBoYXZlIGNvbXBpbGVyIHRyb3VibGUuLgotICovCi0jaWYgX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA9PSA5NgotI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCi0jZXJyb3IgVGhpcyBjb21waWxlciBjYW5ub3QgY29tcGlsZSBjb3JyZWN0bHkgd2l0aCBmcmFtZSBwb2ludGVycyBlbmFibGVkCi0jZW5kaWYKLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2VuZGlmCiAKIC8qCi0gKiBWZXJzaW9ucyBvZiBnY2Mgb2xkZXIgdGhhbiB0aGF0IGxpc3RlZCBiZWxvdyBtYXkgYWN0dWFsbHkgY29tcGlsZQotICogYW5kIGxpbmsgb2theSwgYnV0IHRoZSBlbmQgcHJvZHVjdCBjYW4gaGF2ZSBzdWJ0bGUgcnVuIHRpbWUgYnVncy4KLSAqIFRvIGF2b2lkIGFzc29jaWF0ZWQgYm9ndXMgYnVnIHJlcG9ydHMsIHdlIGZsYXRseSByZWZ1c2UgdG8gY29tcGlsZQotICogd2l0aCBhIGdjYyB0aGF0IGlzIGtub3duIHRvIGJlIHRvbyBvbGQgZnJvbSB0aGUgdmVyeSBiZWdpbm5pbmcuCisgKiBUaGlzIGlzIG9uZSBvZiB0aGUgZmlyc3QgLmMgZmlsZXMgYnVpbHQuIEVycm9yIG91dCBlYXJseSBpZiB3ZSBoYXZlIGNvbXBpbGVyCisgKiB0cm91YmxlLgorICoKKyAqIFZlcnNpb25zIG9mIGdjYyBvbGRlciB0aGFuIHRoYXQgbGlzdGVkIGJlbG93IG1heSBhY3R1YWxseSBjb21waWxlIGFuZCBsaW5rCisgKiBva2F5LCBidXQgdGhlIGVuZCBwcm9kdWN0IGNhbiBoYXZlIHN1YnRsZSBydW4gdGltZSBidWdzLiAgVG8gYXZvaWQgYXNzb2NpYXRlZAorICogYm9ndXMgYnVnIHJlcG9ydHMsIHdlIGZsYXRseSByZWZ1c2UgdG8gY29tcGlsZSB3aXRoIGEgZ2NjIHRoYXQgaXMga25vd24gdG8gYmUKKyAqIHRvbyBvbGQgZnJvbSB0aGUgdmVyeSBiZWdpbm5pbmcuCiAgKi8KLSNpZiBfX0dOVUNfXyA8IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA5NSkKKyNpZiAoX19HTlVDX18gPCAzKSB8fCAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA8IDIpCiAjZXJyb3IgU29ycnksIHlvdXIgR0NDIGlzIHRvbyBvbGQuIEl0IGJ1aWxkcyBpbmNvcnJlY3Qga2VybmVscy4KICNlbmRpZgogCkBAIC00OTAsNiArNDgzLDcgQEAKIAlpbml0X0lSUSgpOwogCXBpZGhhc2hfaW5pdCgpOwogCWluaXRfdGltZXJzKCk7CisJaHJ0aW1lcnNfaW5pdCgpOwogCXNvZnRpcnFfaW5pdCgpOwogCXRpbWVfaW5pdCgpOwogCkBAIC01MTIsNiArNTA2LDcgQEAKIAl9CiAjZW5kaWYKIAl2ZnNfY2FjaGVzX2luaXRfZWFybHkoKTsKKwljcHVzZXRfaW5pdF9lYXJseSgpOwogCW1lbV9pbml0KCk7CiAJa21lbV9jYWNoZV9pbml0KCk7CiAJc2V0dXBfcGVyX2NwdV9wYWdlc2V0KCk7CmRpZmYgLS1naXQgYS9pcGMvbXF1ZXVlLmMgYi9pcGMvbXF1ZXVlLmMKaW5kZXggYzg5NDNiNS4uNTkzMDJmYyAxMDA2NDQKLS0tIGEvaXBjL21xdWV1ZS5jCisrKyBiL2lwYy9tcXVldWUuYwpAQCAtMTEsNiArMTEsNyBAQAogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KQEAgLTU5OCwxNSArNTk5LDE2IEBACiBzdGF0aWMgc3RydWN0IGZpbGUgKmRvX2NyZWF0ZShzdHJ1Y3QgZGVudHJ5ICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCWludCBvZmxhZywgbW9kZV90IG1vZGUsIHN0cnVjdCBtcV9hdHRyIF9fdXNlciAqdV9hdHRyKQogewotCXN0cnVjdCBmaWxlICpmaWxwOwogCXN0cnVjdCBtcV9hdHRyIGF0dHI7CiAJaW50IHJldDsKIAotCWlmICh1X2F0dHIgIT0gTlVMTCkgeworCWlmICh1X2F0dHIpIHsKKwkJcmV0ID0gLUVGQVVMVDsKIAkJaWYgKGNvcHlfZnJvbV91c2VyKCZhdHRyLCB1X2F0dHIsIHNpemVvZihhdHRyKSkpCi0JCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKKwkJCWdvdG8gb3V0OworCQlyZXQgPSAtRUlOVkFMOwogCQlpZiAoIW1xX2F0dHJfb2soJmF0dHIpKQotCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJCQlnb3RvIG91dDsKIAkJLyogc3RvcmUgZm9yIHVzZSBkdXJpbmcgY3JlYXRlICovCiAJCWRlbnRyeS0+ZF9mc2RhdGEgPSAmYXR0cjsKIAl9CkBAIC02MTUsMTMgKzYxNywxNCBAQAogCXJldCA9IHZmc19jcmVhdGUoZGlyLT5kX2lub2RlLCBkZW50cnksIG1vZGUsIE5VTEwpOwogCWRlbnRyeS0+ZF9mc2RhdGEgPSBOVUxMOwogCWlmIChyZXQpCi0JCXJldHVybiBFUlJfUFRSKHJldCk7CisJCWdvdG8gb3V0OwogCi0JZmlscCA9IGRlbnRyeV9vcGVuKGRlbnRyeSwgbXF1ZXVlX21udCwgb2ZsYWcpOwotCWlmICghSVNfRVJSKGZpbHApKQotCQlkZ2V0KGRlbnRyeSk7CisJcmV0dXJuIGRlbnRyeV9vcGVuKGRlbnRyeSwgbXF1ZXVlX21udCwgb2ZsYWcpOwogCi0JcmV0dXJuIGZpbHA7CitvdXQ6CisJZHB1dChkZW50cnkpOworCW1udHB1dChtcXVldWVfbW50KTsKKwlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQogCiAvKiBPcGVucyBleGlzdGluZyBxdWV1ZSAqLwpAQCAtNjI5LDIwICs2MzIsMjAgQEAKIHsKIHN0YXRpYyBpbnQgb2ZsYWcyYWNjW09fQUNDTU9ERV0gPSB7IE1BWV9SRUFELCBNQVlfV1JJVEUsCiAJCQkJCU1BWV9SRUFEIHwgTUFZX1dSSVRFIH07Ci0Jc3RydWN0IGZpbGUgKmZpbHA7CiAKLQlpZiAoKG9mbGFnICYgT19BQ0NNT0RFKSA9PSAoT19SRFdSIHwgT19XUk9OTFkpKQorCWlmICgob2ZsYWcgJiBPX0FDQ01PREUpID09IChPX1JEV1IgfCBPX1dST05MWSkpIHsKKwkJZHB1dChkZW50cnkpOworCQltbnRwdXQobXF1ZXVlX21udCk7CiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KIAotCWlmIChwZXJtaXNzaW9uKGRlbnRyeS0+ZF9pbm9kZSwgb2ZsYWcyYWNjW29mbGFnICYgT19BQ0NNT0RFXSwgTlVMTCkpCisJaWYgKHBlcm1pc3Npb24oZGVudHJ5LT5kX2lub2RlLCBvZmxhZzJhY2Nbb2ZsYWcgJiBPX0FDQ01PREVdLCBOVUxMKSkgeworCQlkcHV0KGRlbnRyeSk7CisJCW1udHB1dChtcXVldWVfbW50KTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisJfQogCi0JZmlscCA9IGRlbnRyeV9vcGVuKGRlbnRyeSwgbXF1ZXVlX21udCwgb2ZsYWcpOwotCi0JaWYgKCFJU19FUlIoZmlscCkpCi0JCWRnZXQoZGVudHJ5KTsKLQotCXJldHVybiBmaWxwOworCXJldHVybiBkZW50cnlfb3BlbihkZW50cnksIG1xdWV1ZV9tbnQsIG9mbGFnKTsKIH0KIAogYXNtbGlua2FnZSBsb25nIHN5c19tcV9vcGVuKGNvbnN0IGNoYXIgX191c2VyICp1X25hbWUsIGludCBvZmxhZywgbW9kZV90IG1vZGUsCkBAIC02NjAsNyArNjYzLDcgQEAKIAlpZiAoZmQgPCAwKQogCQlnb3RvIG91dF9wdXRuYW1lOwogCi0JZG93bigmbXF1ZXVlX21udC0+bW50X3Jvb3QtPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZtcXVldWVfbW50LT5tbnRfcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJZGVudHJ5ID0gbG9va3VwX29uZV9sZW4obmFtZSwgbXF1ZXVlX21udC0+bW50X3Jvb3QsIHN0cmxlbihuYW1lKSk7CiAJaWYgKElTX0VSUihkZW50cnkpKSB7CiAJCWVycm9yID0gUFRSX0VSUihkZW50cnkpOwpAQCAtNjcwLDE3ICs2NzMsMjAgQEAKIAogCWlmIChvZmxhZyAmIE9fQ1JFQVQpIHsKIAkJaWYgKGRlbnRyeS0+ZF9pbm9kZSkgewkvKiBlbnRyeSBhbHJlYWR5IGV4aXN0cyAqLwotCQkJZmlscCA9IChvZmxhZyAmIE9fRVhDTCkgPyBFUlJfUFRSKC1FRVhJU1QpIDoKLQkJCQkJZG9fb3BlbihkZW50cnksIG9mbGFnKTsKKwkJCWVycm9yID0gLUVFWElTVDsKKwkJCWlmIChvZmxhZyAmIE9fRVhDTCkKKwkJCQlnb3RvIG91dDsKKwkJCWZpbHAgPSBkb19vcGVuKGRlbnRyeSwgb2ZsYWcpOwogCQl9IGVsc2UgewogCQkJZmlscCA9IGRvX2NyZWF0ZShtcXVldWVfbW50LT5tbnRfcm9vdCwgZGVudHJ5LAogCQkJCQkJb2ZsYWcsIG1vZGUsIHVfYXR0cik7CiAJCX0KLQl9IGVsc2UKLQkJZmlscCA9IChkZW50cnktPmRfaW5vZGUpID8gZG9fb3BlbihkZW50cnksIG9mbGFnKSA6Ci0JCQkJCUVSUl9QVFIoLUVOT0VOVCk7Ci0KLQlkcHV0KGRlbnRyeSk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSAtRU5PRU5UOworCQlpZiAoIWRlbnRyeS0+ZF9pbm9kZSkKKwkJCWdvdG8gb3V0OworCQlmaWxwID0gZG9fb3BlbihkZW50cnksIG9mbGFnKTsKKwl9CiAKIAlpZiAoSVNfRVJSKGZpbHApKSB7CiAJCWVycm9yID0gUFRSX0VSUihmaWxwKTsKQEAgLTY5MSwxMyArNjk3LDE1IEBACiAJZmRfaW5zdGFsbChmZCwgZmlscCk7CiAJZ290byBvdXRfdXBzZW07CiAKLW91dF9wdXRmZDoKK291dDoKKwlkcHV0KGRlbnRyeSk7CiAJbW50cHV0KG1xdWV1ZV9tbnQpOworb3V0X3B1dGZkOgogCXB1dF91bnVzZWRfZmQoZmQpOwogb3V0X2VycjoKIAlmZCA9IGVycm9yOwogb3V0X3Vwc2VtOgotCXVwKCZtcXVldWVfbW50LT5tbnRfcm9vdC0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmbXF1ZXVlX21udC0+bW50X3Jvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOwogb3V0X3B1dG5hbWU6CiAJcHV0bmFtZShuYW1lKTsKIAlyZXR1cm4gZmQ7CkBAIC03MTQsNyArNzIyLDcgQEAKIAlpZiAoSVNfRVJSKG5hbWUpKQogCQlyZXR1cm4gUFRSX0VSUihuYW1lKTsKIAotCWRvd24oJm1xdWV1ZV9tbnQtPm1udF9yb290LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmbXF1ZXVlX21udC0+bW50X3Jvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCWRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKG5hbWUsIG1xdWV1ZV9tbnQtPm1udF9yb290LCBzdHJsZW4obmFtZSkpOwogCWlmIChJU19FUlIoZGVudHJ5KSkgewogCQllcnIgPSBQVFJfRVJSKGRlbnRyeSk7CkBAIC03MzUsNyArNzQzLDcgQEAKIAlkcHV0KGRlbnRyeSk7CiAKIG91dF91bmxvY2s6Ci0JdXAoJm1xdWV1ZV9tbnQtPm1udF9yb290LT5kX2lub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZtcXVldWVfbW50LT5tbnRfcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJcHV0bmFtZShuYW1lKTsKIAlpZiAoaW5vZGUpCiAJCWlwdXQoaW5vZGUpOwpkaWZmIC0tZ2l0IGEvaXBjL21zZy5jIGIvaXBjL21zZy5jCmluZGV4IGQwMzViZDJhLi5mYmY3NTcwIDEwMDY0NAotLS0gYS9pcGMvbXNnLmMKKysrIGIvaXBjL21zZy5jCkBAIC0xMiw5ICsxMiwxMCBAQAogICoKICAqIG1vc3RseSByZXdyaXR0ZW4sIHRocmVhZGVkIGFuZCB3YWtlLW9uZSBzZW1hbnRpY3MgYWRkZWQKICAqIE1TR01BWCBsaW1pdCByZW1vdmVkLCBzeXNjdGwncyBhZGRlZAotICogKGMpIDE5OTkgTWFuZnJlZCBTcHJhdWwgPG1hbmZyZWRzQGNvbG9yZnVsbGlmZS5jb20+CisgKiAoYykgMTk5OSBNYW5mcmVkIFNwcmF1bCA8bWFuZnJlZEBjb2xvcmZ1bGxpZmUuY29tPgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21zZy5oPgpkaWZmIC0tZ2l0IGEvaXBjL3NlbS5jIGIvaXBjL3NlbS5jCmluZGV4IGNiNWJiMmEuLjMxZmQ0MDIgMTAwNjQ0Ci0tLSBhL2lwYy9zZW0uYworKysgYi9pcGMvc2VtLmMKQEAgLTU2LDcgKzU2LDcgQEAKICAqIC9wcm9jL3N5c3ZpcGMvc2VtIHN1cHBvcnQgKGMpIDE5OTkgRHJhZ29zIEFjb3N0YWNoaW9haWUgPGRyYWdvc0BpbmFtZS5jb20+CiAgKgogICogU01QLXRocmVhZGVkLCBzeXNjdGwncyBhZGRlZAotICogKGMpIDE5OTkgTWFuZnJlZCBTcHJhdWwgPG1hbmZyZWRzQGNvbG9yZnVsbGlmZS5jb20+CisgKiAoYykgMTk5OSBNYW5mcmVkIFNwcmF1bCA8bWFuZnJlZEBjb2xvcmZ1bGxpZmUuY29tPgogICogRW5mb3JjZWQgcmFuZ2UgbGltaXQgb24gU0VNX1VORE8KICAqIChjKSAyMDAxIFJlZCBIYXQgSW5jIDxhbGFuQHJlZGhhdC5jb20+CiAgKiBMb2NrbGVzcyB3YWtldXAKQEAgLTczLDYgKzczLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgInV0aWwuaCIKZGlmZiAtLWdpdCBhL2lwYy9zaG0uYyBiL2lwYy9zaG0uYwppbmRleCAwZWY0YTFjLi40YzI4ZDJkIDEwMDY0NAotLS0gYS9pcGMvc2htLmMKKysrIGIvaXBjL3NobS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKQEAgLTM0LDggKzM1LDYgQEAKIAogI2luY2x1ZGUgInV0aWwuaCIKIAotI2RlZmluZSBzaG1fZmxhZ3MJc2htX3Blcm0ubW9kZQotCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzaG1fZmlsZV9vcGVyYXRpb25zOwogc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBzaG1fdm1fb3BzOwogCkBAIC0xNDgsNyArMTQ3LDcgQEAKIAlzaHAtPnNobV9kdGltID0gZ2V0X3NlY29uZHMoKTsKIAlzaHAtPnNobV9uYXR0Y2gtLTsKIAlpZihzaHAtPnNobV9uYXR0Y2ggPT0gMCAmJgotCSAgIHNocC0+c2htX2ZsYWdzICYgU0hNX0RFU1QpCisJICAgc2hwLT5zaG1fcGVybS5tb2RlICYgU0hNX0RFU1QpCiAJCXNobV9kZXN0cm95IChzaHApOwogCWVsc2UKIAkJc2htX3VubG9jayhzaHApOwpAQCAtMjA1LDcgKzIwNCw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJc2hwLT5zaG1fcGVybS5rZXkgPSBrZXk7Ci0Jc2hwLT5zaG1fZmxhZ3MgPSAoc2htZmxnICYgU19JUldYVUdPKTsKKwlzaHAtPnNobV9wZXJtLm1vZGUgPSAoc2htZmxnICYgU19JUldYVUdPKTsKIAlzaHAtPm1sb2NrX3VzZXIgPSBOVUxMOwogCiAJc2hwLT5zaG1fcGVybS5zZWN1cml0eSA9IE5VTEw7CkBAIC0zNDUsNyArMzQ0LDcgQEAKIAogCQlvdXQtPnVpZAk9IHRidWYuc2htX3Blcm0udWlkOwogCQlvdXQtPmdpZAk9IHRidWYuc2htX3Blcm0uZ2lkOwotCQlvdXQtPm1vZGUJPSB0YnVmLnNobV9mbGFnczsKKwkJb3V0LT5tb2RlCT0gdGJ1Zi5zaG1fcGVybS5tb2RlOwogCiAJCXJldHVybiAwOwogCSAgICB9CkBAIC0zNTgsNyArMzU3LDcgQEAKIAogCQlvdXQtPnVpZAk9IHRidWZfb2xkLnNobV9wZXJtLnVpZDsKIAkJb3V0LT5naWQJPSB0YnVmX29sZC5zaG1fcGVybS5naWQ7Ci0JCW91dC0+bW9kZQk9IHRidWZfb2xkLnNobV9mbGFnczsKKwkJb3V0LT5tb2RlCT0gdGJ1Zl9vbGQuc2htX3Blcm0ubW9kZTsKIAogCQlyZXR1cm4gMDsKIAkgICAgfQpAQCAtNTYwLDEzICs1NTksMTMgQEAKIAkJCWlmICghaXNfZmlsZV9odWdlcGFnZXMoc2hwLT5zaG1fZmlsZSkpIHsKIAkJCQllcnIgPSBzaG1lbV9sb2NrKHNocC0+c2htX2ZpbGUsIDEsIHVzZXIpOwogCQkJCWlmICghZXJyKSB7Ci0JCQkJCXNocC0+c2htX2ZsYWdzIHw9IFNITV9MT0NLRUQ7CisJCQkJCXNocC0+c2htX3Blcm0ubW9kZSB8PSBTSE1fTE9DS0VEOwogCQkJCQlzaHAtPm1sb2NrX3VzZXIgPSB1c2VyOwogCQkJCX0KIAkJCX0KIAkJfSBlbHNlIGlmICghaXNfZmlsZV9odWdlcGFnZXMoc2hwLT5zaG1fZmlsZSkpIHsKIAkJCXNobWVtX2xvY2soc2hwLT5zaG1fZmlsZSwgMCwgc2hwLT5tbG9ja191c2VyKTsKLQkJCXNocC0+c2htX2ZsYWdzICY9IH5TSE1fTE9DS0VEOworCQkJc2hwLT5zaG1fcGVybS5tb2RlICY9IH5TSE1fTE9DS0VEOwogCQkJc2hwLT5tbG9ja191c2VyID0gTlVMTDsKIAkJfQogCQlzaG1fdW5sb2NrKHNocCk7CkBAIC02MDUsNyArNjA0LDcgQEAKIAkJCWdvdG8gb3V0X3VubG9ja191cDsKIAogCQlpZiAoc2hwLT5zaG1fbmF0dGNoKXsKLQkJCXNocC0+c2htX2ZsYWdzIHw9IFNITV9ERVNUOworCQkJc2hwLT5zaG1fcGVybS5tb2RlIHw9IFNITV9ERVNUOwogCQkJLyogRG8gbm90IGZpbmQgaXQgYW55IG1vcmUgKi8KIAkJCXNocC0+c2htX3Blcm0ua2V5ID0gSVBDX1BSSVZBVEU7CiAJCQlzaG1fdW5sb2NrKHNocCk7CkBAIC02NDQsNyArNjQzLDcgQEAKIAkJCiAJCXNocC0+c2htX3Blcm0udWlkID0gc2V0YnVmLnVpZDsKIAkJc2hwLT5zaG1fcGVybS5naWQgPSBzZXRidWYuZ2lkOwotCQlzaHAtPnNobV9mbGFncyA9IChzaHAtPnNobV9mbGFncyAmIH5TX0lSV1hVR08pCisJCXNocC0+c2htX3Blcm0ubW9kZSA9IChzaHAtPnNobV9wZXJtLm1vZGUgJiB+U19JUldYVUdPKQogCQkJfCAoc2V0YnVmLm1vZGUgJiBTX0lSV1hVR08pOwogCQlzaHAtPnNobV9jdGltID0gZ2V0X3NlY29uZHMoKTsKIAkJYnJlYWs7CkBAIC03NzcsNyArNzc2LDcgQEAKIAkJQlVHKCk7CiAJc2hwLT5zaG1fbmF0dGNoLS07CiAJaWYoc2hwLT5zaG1fbmF0dGNoID09IDAgJiYKLQkgICBzaHAtPnNobV9mbGFncyAmIFNITV9ERVNUKQorCSAgIHNocC0+c2htX3Blcm0ubW9kZSAmIFNITV9ERVNUKQogCQlzaG1fZGVzdHJveSAoc2hwKTsKIAllbHNlCiAJCXNobV91bmxvY2soc2hwKTsKQEAgLTkwMiw3ICs5MDEsNyBAQAogCXJldHVybiBzZXFfcHJpbnRmKHMsIGZvcm1hdCwKIAkJCSAgc2hwLT5zaG1fcGVybS5rZXksCiAJCQkgIHNocC0+aWQsCi0JCQkgIHNocC0+c2htX2ZsYWdzLAorCQkJICBzaHAtPnNobV9wZXJtLm1vZGUsCiAJCQkgIHNocC0+c2htX3NlZ3N6LAogCQkJICBzaHAtPnNobV9jcHJpZCwKIAkJCSAgc2hwLT5zaG1fbHByaWQsCmRpZmYgLS1naXQgYS9pcGMvdXRpbC5jIGIvaXBjL3V0aWwuYwppbmRleCAyM2YxY2VjLi44NjI2MjE5IDEwMDY0NAotLS0gYS9pcGMvdXRpbC5jCisrKyBiL2lwYy91dGlsLmMKQEAgLTcsNyArNyw3IEBACiAgKiAgICAgICAgICAgIE9jY3VycyBpbiBzZXZlcmFsIHBsYWNlcyBpbiB0aGUgSVBDIGNvZGUuCiAgKiAgICAgICAgICAgIENocmlzIEV2YW5zLCA8Y2hyaXNAZmVycmV0LmxtaC5veC5hYy51az4KICAqIE5vdiAxOTk5IC0gaXBjIGhlbHBlciBmdW5jdGlvbnMsIHVuaWZpZWQgU01QIGxvY2tpbmcKLSAqCSAgICAgIE1hbmZyZWQgU3ByYXVsIDxtYW5mcmVkc0Bjb2xvcmZ1bGxpZmUuY29tPgorICoJICAgICAgTWFuZnJlZCBTcHJhdWwgPG1hbmZyZWRAY29sb3JmdWxsaWZlLmNvbT4KICAqIE9jdCAyMDAyIC0gT25lIGxvY2sgcGVyIElQQyBpZC4gUkNVIGlwY19mcmVlIGZvciBsb2NrLWZyZWUgZ3Jvd19hcnkoKS4KICAqICAgICAgICAgICAgTWluZ21pbmcgQ2FvIDxjbW1AdXMuaWJtLmNvbT4KICAqLwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaHVpZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KZGlmZiAtLWdpdCBhL2lwYy91dGlsLmggYi9pcGMvdXRpbC5oCmluZGV4IGZjOWEyOGIuLmVmYWZmM2UgMTAwNjQ0Ci0tLSBhL2lwYy91dGlsLmgKKysrIGIvaXBjL3V0aWwuaApAQCAtMiw3ICsyLDcgQEAKICAqIGxpbnV4L2lwYy91dGlsLmgKICAqIENvcHlyaWdodCAoQykgMTk5OSBDaHJpc3RvcGggUm9obGFuZAogICoKLSAqIGlwYyBoZWxwZXIgZnVuY3Rpb25zIChjKSAxOTk5IE1hbmZyZWQgU3ByYXVsIDxtYW5mcmVkc0Bjb2xvcmZ1bGxpZmUuY29tPgorICogaXBjIGhlbHBlciBmdW5jdGlvbnMgKGMpIDE5OTkgTWFuZnJlZCBTcHJhdWwgPG1hbmZyZWRAY29sb3JmdWxsaWZlLmNvbT4KICAqLwogCiAjaWZuZGVmIF9JUENfVVRJTF9ICmRpZmYgLS1naXQgYS9rZXJuZWwvTWFrZWZpbGUgYi9rZXJuZWwvTWFrZWZpbGUKaW5kZXggNGY1YTE0NS4uNGFlMGZiZCAxMDA2NDQKLS0tIGEva2VybmVsL01ha2VmaWxlCisrKyBiL2tlcm5lbC9NYWtlZmlsZQpAQCAtNiwxNSArNiwxOCBAQAogCSAgICBleGl0Lm8gaXRpbWVyLm8gdGltZS5vIHNvZnRpcnEubyByZXNvdXJjZS5vIFwKIAkgICAgc3lzY3RsLm8gY2FwYWJpbGl0eS5vIHB0cmFjZS5vIHRpbWVyLm8gdXNlci5vIFwKIAkgICAgc2lnbmFsLm8gc3lzLm8ga21vZC5vIHdvcmtxdWV1ZS5vIHBpZC5vIFwKLQkgICAgcmN1cGRhdGUubyBpbnRlcm1vZHVsZS5vIGV4dGFibGUubyBwYXJhbXMubyBwb3NpeC10aW1lcnMubyBcCi0JICAgIGt0aHJlYWQubyB3YWl0Lm8ga2ZpZm8ubyBzeXNfbmkubyBwb3NpeC1jcHUtdGltZXJzLm8KKwkgICAgcmN1cGRhdGUubyBleHRhYmxlLm8gcGFyYW1zLm8gcG9zaXgtdGltZXJzLm8gXAorCSAgICBrdGhyZWFkLm8gd2FpdC5vIGtmaWZvLm8gc3lzX25pLm8gcG9zaXgtY3B1LXRpbWVycy5vIG11dGV4Lm8gXAorCSAgICBocnRpbWVyLm8KIAorb2JqLSQoQ09ORklHX0RFQlVHX01VVEVYRVMpICs9IG11dGV4LWRlYnVnLm8KIG9iai0kKENPTkZJR19GVVRFWCkgKz0gZnV0ZXgubwogb2JqLSQoQ09ORklHX0dFTkVSSUNfSVNBX0RNQSkgKz0gZG1hLm8KIG9iai0kKENPTkZJR19TTVApICs9IGNwdS5vIHNwaW5sb2NrLm8KIG9iai0kKENPTkZJR19ERUJVR19TUElOTE9DSykgKz0gc3BpbmxvY2subwogb2JqLSQoQ09ORklHX1VJRDE2KSArPSB1aWQxNi5vCiBvYmotJChDT05GSUdfTU9EVUxFUykgKz0gbW9kdWxlLm8KK29iai0kKENPTkZJR19PQlNPTEVURV9JTlRFUk1PRFVMRSkgKz0gaW50ZXJtb2R1bGUubwogb2JqLSQoQ09ORklHX0tBTExTWU1TKSArPSBrYWxsc3ltcy5vCiBvYmotJChDT05GSUdfUE0pICs9IHBvd2VyLwogb2JqLSQoQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QpICs9IGFjY3QubwpAQCAtMjksNyArMzIsNiBAQAogb2JqLSQoQ09ORklHX1NZU0ZTKSArPSBrc3lzZnMubwogb2JqLSQoQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQKSArPSBzb2Z0bG9ja3VwLm8KIG9iai0kKENPTkZJR19HRU5FUklDX0hBUkRJUlFTKSArPSBpcnEvCi1vYmotJChDT05GSUdfQ1JBU0hfRFVNUCkgKz0gY3Jhc2hfZHVtcC5vCiBvYmotJChDT05GSUdfU0VDQ09NUCkgKz0gc2VjY29tcC5vCiBvYmotJChDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCkgKz0gcmN1dG9ydHVyZS5vCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9hY2N0LmMgYi9rZXJuZWwvYWNjdC5jCmluZGV4IDM4ZDU3ZmEuLjA2NWQ4YjQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hY2N0LmMKKysrIGIva2VybmVsL2FjY3QuYwpAQCAtNDcsNiArNDcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2FjY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXQuYyBiL2tlcm5lbC9hdWRpdC5jCmluZGV4IDMyZmEwM2EuLjBhODEzZDIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdC5jCisrKyBiL2tlcm5lbC9hdWRpdC5jCkBAIC00Miw4ICs0Miw4IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CkBAIC0yNjcsNyArMjY3LDcgQEAKIAlyZXR1cm4gb2xkOwogfQogCi1pbnQga2F1ZGl0ZF90aHJlYWQodm9pZCAqZHVtbXkpCitzdGF0aWMgaW50IGthdWRpdGRfdGhyZWFkKHZvaWQgKmR1bW15KQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9hdWRpdHNjLmMgYi9rZXJuZWwvYXVkaXRzYy5jCmluZGV4IGQ4YTY4NTAuLjY4NWMyNTEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdHNjLmMKKysrIGIva2VybmVsL2F1ZGl0c2MuYwpAQCAtMzAsOCArMzAsOCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvY2FwYWJpbGl0eS5jIGIva2VybmVsL2NhcGFiaWxpdHkuYwppbmRleCA4OTg2YTM3Li5iZmEzYzkyIDEwMDY0NAotLS0gYS9rZXJuZWwvY2FwYWJpbGl0eS5jCisrKyBiL2tlcm5lbC9jYXBhYmlsaXR5LmMKQEAgLTcsNiArNyw3IEBACiAgKiAzMCBNYXkgMjAwMjoJQ2xlYW51cCwgUm9iZXJ0IE0uIExvdmUgPHJtbEB0ZWNoOS5uZXQ+CiAgKi8gCiAKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL2NvbXBhdC5jIGIva2VybmVsL2NvbXBhdC5jCmluZGV4IDEwMjI5NmUuLjE4NjcyOTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jb21wYXQuYworKysgYi9rZXJuZWwvY29tcGF0LmMKQEAgLTUxNCw2ICs1MTQsMjQgQEAKIAlyZXR1cm4gMDsKIH0gCiAKK2xvbmcgY29tcGF0X3N5c190aW1lcl9jcmVhdGUoY2xvY2tpZF90IHdoaWNoX2Nsb2NrLAorCQkJc3RydWN0IGNvbXBhdF9zaWdldmVudCBfX3VzZXIgKnRpbWVyX2V2ZW50X3NwZWMsCisJCQl0aW1lcl90IF9fdXNlciAqY3JlYXRlZF90aW1lcl9pZCkKK3sKKwlzdHJ1Y3Qgc2lnZXZlbnQgX191c2VyICpldmVudCA9IE5VTEw7CisKKwlpZiAodGltZXJfZXZlbnRfc3BlYykgeworCQlzdHJ1Y3Qgc2lnZXZlbnQga2V2ZW50OworCisJCWV2ZW50ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpldmVudCkpOworCQlpZiAoZ2V0X2NvbXBhdF9zaWdldmVudCgma2V2ZW50LCB0aW1lcl9ldmVudF9zcGVjKSB8fAorCQkgICAgY29weV90b191c2VyKGV2ZW50LCAma2V2ZW50LCBzaXplb2YoKmV2ZW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gc3lzX3RpbWVyX2NyZWF0ZSh3aGljaF9jbG9jaywgZXZlbnQsIGNyZWF0ZWRfdGltZXJfaWQpOworfQorCiBsb25nIGNvbXBhdF9zeXNfdGltZXJfc2V0dGltZSh0aW1lcl90IHRpbWVyX2lkLCBpbnQgZmxhZ3MsCiAJCQkgIHN0cnVjdCBjb21wYXRfaXRpbWVyc3BlYyBfX3VzZXIgKm5ldywgCiAJCQkgIHN0cnVjdCBjb21wYXRfaXRpbWVyc3BlYyBfX3VzZXIgKm9sZCkKQEAgLTY0OSw4ICs2NjcsNiBAQAogCQk/IC1FRkFVTFQgOiAwOwogfQogCi0vKiB0aW1lcl9jcmVhdGUgaXMgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGJlY2F1c2UgaXQgbmVlZHMgc2lnZXZlbnQgY29udmVyc2lvbiAqLwotCiBsb25nIGNvbXBhdF9nZXRfYml0bWFwKHVuc2lnbmVkIGxvbmcgKm1hc2ssIGNvbXBhdF91bG9uZ190IF9fdXNlciAqdW1hc2ssCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIGJpdG1hcF9zaXplKQogewpAQCAtODU1LDMgKzg3MSwzMSBAQAogfQogCiAjZW5kaWYgLyogX19BUkNIX1dBTlRfQ09NUEFUX1NZU19USU1FICovCisKKyNpZmRlZiBfX0FSQ0hfV0FOVF9DT01QQVRfU1lTX1JUX1NJR1NVU1BFTkQKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3J0X3NpZ3N1c3BlbmQoY29tcGF0X3NpZ3NldF90IF9fdXNlciAqdW5ld3NldCwgY29tcGF0X3NpemVfdCBzaWdzZXRzaXplKQoreworCXNpZ3NldF90IG5ld3NldDsKKwljb21wYXRfc2lnc2V0X3QgbmV3c2V0MzI7CisKKwkvKiBYWFg6IERvbid0IHByZWNsdWRlIGhhbmRsaW5nIGRpZmZlcmVudCBzaXplZCBzaWdzZXRfdCdzLiAgKi8KKwlpZiAoc2lnc2V0c2l6ZSAhPSBzaXplb2Yoc2lnc2V0X3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3c2V0MzIsIHVuZXdzZXQsIHNpemVvZihjb21wYXRfc2lnc2V0X3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc2lnc2V0X2Zyb21fY29tcGF0KCZuZXdzZXQsICZuZXdzZXQzMik7CisJc2lnZGVsc2V0bWFzaygmbmV3c2V0LCBzaWdtYXNrKFNJR0tJTEwpfHNpZ21hc2soU0lHU1RPUCkpOworCisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJY3VycmVudC0+c2F2ZWRfc2lnbWFzayA9IGN1cnJlbnQtPmJsb2NrZWQ7CisJY3VycmVudC0+YmxvY2tlZCA9IG5ld3NldDsKKwlyZWNhbGNfc2lncGVuZGluZygpOworCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwlzY2hlZHVsZSgpOworCXNldF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwlyZXR1cm4gLUVSRVNUQVJUTk9IQU5EOworfQorI2VuZGlmIC8qIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfUlRfU0lHU1VTUEVORCAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL2NwdXNldC5jIGIva2VybmVsL2NwdXNldC5jCmluZGV4IDc0MzA2NDAuLmZlMmY3MWYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jcHVzZXQuYworKysgYi9rZXJuZWwvY3B1c2V0LmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNTQsNyArNTUsMjMgQEAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogCi0jZGVmaW5lIENQVVNFVF9TVVBFUl9NQUdJQyAJCTB4MjdlMGViCisjZGVmaW5lIENQVVNFVF9TVVBFUl9NQUdJQwkJMHgyN2UwZWIKKworLyoKKyAqIFRyYWNrcyBob3cgbWFueSBjcHVzZXRzIGFyZSBjdXJyZW50bHkgZGVmaW5lZCBpbiBzeXN0ZW0uCisgKiBXaGVuIHRoZXJlIGlzIG9ubHkgb25lIGNwdXNldCAodGhlIHJvb3QgY3B1c2V0KSB3ZSBjYW4KKyAqIHNob3J0IGNpcmN1aXQgc29tZSBob29rcy4KKyAqLworaW50IG51bWJlcl9vZl9jcHVzZXRzIF9fcmVhZF9tb3N0bHk7CisKKy8qIFNlZSAiRnJlcXVlbmN5IG1ldGVyIiBjb21tZW50cywgYmVsb3cuICovCisKK3N0cnVjdCBmbWV0ZXIgeworCWludCBjbnQ7CQkvKiB1bnByb2Nlc3NlZCBldmVudHMgY291bnQgKi8KKwlpbnQgdmFsOwkJLyogbW9zdCByZWNlbnQgb3V0cHV0IHZhbHVlICovCisJdGltZV90IHRpbWU7CQkvKiBjbG9jayAoc2Vjcykgd2hlbiB2YWwgY29tcHV0ZWQgKi8KKwlzcGlubG9ja190IGxvY2s7CS8qIGd1YXJkcyByZWFkIG9yIHdyaXRlIG9mIGFib3ZlICovCit9OwogCiBzdHJ1Y3QgY3B1c2V0IHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogInVuc2lnbmVkIGxvbmciIHNvIGJpdG9wcyB3b3JrICovCkBAIC04MCwxMyArOTcsMTYgQEAKIAkgKiBDb3B5IG9mIGdsb2JhbCBjcHVzZXRfbWVtc19nZW5lcmF0aW9uIGFzIG9mIHRoZSBtb3N0CiAJICogcmVjZW50IHRpbWUgdGhpcyBjcHVzZXQgY2hhbmdlZCBpdHMgbWVtc19hbGxvd2VkLgogCSAqLwotCSBpbnQgbWVtc19nZW5lcmF0aW9uOworCWludCBtZW1zX2dlbmVyYXRpb247CisKKwlzdHJ1Y3QgZm1ldGVyIGZtZXRlcjsJCS8qIG1lbW9yeV9wcmVzc3VyZSBmaWx0ZXIgKi8KIH07CiAKIC8qIGJpdHMgaW4gc3RydWN0IGNwdXNldCBmbGFncyBmaWVsZCAqLwogdHlwZWRlZiBlbnVtIHsKIAlDU19DUFVfRVhDTFVTSVZFLAogCUNTX01FTV9FWENMVVNJVkUsCisJQ1NfTUVNT1JZX01JR1JBVEUsCiAJQ1NfUkVNT1ZFRCwKIAlDU19OT1RJRllfT05fUkVMRUFTRQogfSBjcHVzZXRfZmxhZ2JpdHNfdDsKQEAgLTExMiw2ICsxMzIsMTEgQEAKIAlyZXR1cm4gISF0ZXN0X2JpdChDU19OT1RJRllfT05fUkVMRUFTRSwgJmNzLT5mbGFncyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGlzX21lbW9yeV9taWdyYXRlKGNvbnN0IHN0cnVjdCBjcHVzZXQgKmNzKQoreworCXJldHVybiAhIXRlc3RfYml0KENTX01FTU9SWV9NSUdSQVRFLCAmY3MtPmZsYWdzKTsKK30KKwogLyoKICAqIEluY3JlbWVudCB0aGlzIGF0b21pYyBpbnRlZ2VyIGV2ZXJ5dGltZSBhbnkgY3B1c2V0IGNoYW5nZXMgaXRzCiAgKiBtZW1zX2FsbG93ZWQgdmFsdWUuICBVc2VycyBvZiBjcHVzZXRzIGNhbiB0cmFjayB0aGlzIGdlbmVyYXRpb24KQEAgLTEzNywxMyArMTYyLDEwIEBACiAJLmNvdW50ID0gQVRPTUlDX0lOSVQoMCksCiAJLnNpYmxpbmcgPSBMSVNUX0hFQURfSU5JVCh0b3BfY3B1c2V0LnNpYmxpbmcpLAogCS5jaGlsZHJlbiA9IExJU1RfSEVBRF9JTklUKHRvcF9jcHVzZXQuY2hpbGRyZW4pLAotCS5wYXJlbnQgPSBOVUxMLAotCS5kZW50cnkgPSBOVUxMLAotCS5tZW1zX2dlbmVyYXRpb24gPSAwLAogfTsKIAogc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqY3B1c2V0X21vdW50Owotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqY3B1c2V0X3NiID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmNwdXNldF9zYjsKIAogLyoKICAqIFdlIGhhdmUgdHdvIGdsb2JhbCBjcHVzZXQgc2VtYXBob3JlcyBiZWxvdy4gIFRoZXkgY2FuIG5lc3QuCkBAIC0yMjcsNiArMjQ5LDExIEBACiAgKiBhIHRhc2tzIGNwdXNldCBwb2ludGVyIHdlIHVzZSB0YXNrX2xvY2soKSwgd2hpY2ggYWN0cyBvbiBhIHNwaW5sb2NrCiAgKiAodGFzay0+YWxsb2NfbG9jaykgYWxyZWFkeSBpbiB0aGUgdGFza19zdHJ1Y3Qgcm91dGluZWx5IHVzZWQgZm9yCiAgKiBzdWNoIG1hdHRlcnMuCisgKgorICogUC5TLiAgT25lIG1vcmUgbG9ja2luZyBleGNlcHRpb24uICBSQ1UgaXMgdXNlZCB0byBndWFyZCB0aGUKKyAqIHVwZGF0ZSBvZiBhIHRhc2tzIGNwdXNldCBwb2ludGVyIGJ5IGF0dGFjaF90YXNrKCkgYW5kIHRoZQorICogYWNjZXNzIG9mIHRhc2stPmNwdXNldC0+bWVtc19nZW5lcmF0aW9uIHZpYSB0aGF0IHBvaW50ZXIgaW4KKyAqIHRoZSByb3V0aW5lIGNwdXNldF91cGRhdGVfdGFza19tZW1vcnlfc3RhdGUoKS4KICAqLwogCiBzdGF0aWMgREVDTEFSRV9NVVRFWChtYW5hZ2Vfc2VtKTsKQEAgLTMwNCw3ICszMzEsNyBAQAogCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOwogCW5vZGUgPSBkZW50cnktPmRfc3ViZGlycy5uZXh0OwogCXdoaWxlIChub2RlICE9ICZkZW50cnktPmRfc3ViZGlycykgewotCQlzdHJ1Y3QgZGVudHJ5ICpkID0gbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgZGVudHJ5LCBkX2NoaWxkKTsKKwkJc3RydWN0IGRlbnRyeSAqZCA9IGxpc3RfZW50cnkobm9kZSwgc3RydWN0IGRlbnRyeSwgZF91LmRfY2hpbGQpOwogCQlsaXN0X2RlbF9pbml0KG5vZGUpOwogCQlpZiAoZC0+ZF9pbm9kZSkgewogCQkJZCA9IGRnZXRfbG9ja2VkKGQpOwpAQCAtMzE2LDcgKzM0Myw3IEBACiAJCX0KIAkJbm9kZSA9IGRlbnRyeS0+ZF9zdWJkaXJzLm5leHQ7CiAJfQotCWxpc3RfZGVsX2luaXQoJmRlbnRyeS0+ZF9jaGlsZCk7CisJbGlzdF9kZWxfaW5pdCgmZGVudHJ5LT5kX3UuZF9jaGlsZCk7CiAJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKIAlyZW1vdmVfZGlyKGRlbnRyeSk7CiB9CkBAIC01NzAsMjAgKzU5Nyw0MyBAQAogCUJVR19PTighbm9kZXNfaW50ZXJzZWN0cygqcG1hc2ssIG5vZGVfb25saW5lX21hcCkpOwogfQogCi0vKgotICogUmVmcmVzaCBjdXJyZW50IHRhc2tzIG1lbXNfYWxsb3dlZCBhbmQgbWVtc19nZW5lcmF0aW9uIGZyb20gY3VycmVudAotICogdGFza3MgY3B1c2V0LgorLyoqCisgKiBjcHVzZXRfdXBkYXRlX3Rhc2tfbWVtb3J5X3N0YXRlIC0gdXBkYXRlIHRhc2sgbWVtb3J5IHBsYWNlbWVudAogICoKLSAqIENhbGwgd2l0aG91dCBjYWxsYmFja19zZW0gb3IgdGFza19sb2NrKCkgaGVsZC4gIE1heSBiZSBjYWxsZWQgd2l0aAotICogb3Igd2l0aG91dCBtYW5hZ2Vfc2VtIGhlbGQuICBXaWxsIGFjcXVpcmUgdGFza19sb2NrKCkgYW5kIG1pZ2h0Ci0gKiBhY3F1aXJlIGNhbGxiYWNrX3NlbSBkdXJpbmcgY2FsbC4KKyAqIElmIHRoZSBjdXJyZW50IHRhc2tzIGNwdXNldHMgbWVtc19hbGxvd2VkIGNoYW5nZWQgYmVoaW5kIG91cgorICogYmFja3MsIHVwZGF0ZSBjdXJyZW50LT5tZW1zX2FsbG93ZWQsIG1lbXNfZ2VuZXJhdGlvbiBhbmQgdGFzayBOVU1BCisgKiBtZW1wb2xpY3kgdG8gdGhlIG5ldyB2YWx1ZS4KICAqCi0gKiBUaGUgdGFza19sb2NrKCkgaXMgcmVxdWlyZWQgdG8gZGVyZWZlcmVuY2UgY3VycmVudC0+Y3B1c2V0IHNhZmVseS4KLSAqIFdpdGhvdXQgaXQsIHdlIGNvdWxkIHBpY2sgdXAgdGhlIHBvaW50ZXIgdmFsdWUgb2YgY3VycmVudC0+Y3B1c2V0Ci0gKiBpbiBvbmUgaW5zdHJ1Y3Rpb24sIGFuZCB0aGVuIGF0dGFjaF90YXNrIGNvdWxkIGdpdmUgdXMgYSBkaWZmZXJlbnQKLSAqIGNwdXNldCwgYW5kIHRoZW4gdGhlIGNwdXNldCB3ZSBoYWQgY291bGQgYmUgcmVtb3ZlZCBhbmQgZnJlZWQsCi0gKiBhbmQgdGhlbiBvbiBvdXIgbmV4dCBpbnN0cnVjdGlvbiwgd2UgY291bGQgZGVyZWZlcmVuY2UgYSBubyBsb25nZXIKLSAqIHZhbGlkIGNwdXNldCBwb2ludGVyIHRvIGdldCBpdHMgbWVtc19nZW5lcmF0aW9uIGZpZWxkLgorICogVGFzayBtZW1wb2xpY3kgaXMgdXBkYXRlZCBieSByZWJpbmRpbmcgaXQgcmVsYXRpdmUgdG8gdGhlCisgKiBjdXJyZW50LT5jcHVzZXQgaWYgYSB0YXNrIGhhcyBpdHMgbWVtb3J5IHBsYWNlbWVudCBjaGFuZ2VkLgorICogRG8gbm90IGNhbGwgdGhpcyByb3V0aW5lIGlmIGluX2ludGVycnVwdCgpLgorICoKKyAqIENhbGwgd2l0aG91dCBjYWxsYmFja19zZW0gb3IgdGFza19sb2NrKCkgaGVsZC4gIE1heSBiZSBjYWxsZWQKKyAqIHdpdGggb3Igd2l0aG91dCBtYW5hZ2Vfc2VtIGhlbGQuICBEb2Vzbid0IG5lZWQgdGFza19sb2NrIHRvIGd1YXJkCisgKiBhZ2FpbnN0IGFub3RoZXIgdGFzayBjaGFuZ2luZyBhIG5vbi1OVUxMIGNwdXNldCBwb2ludGVyIHRvIE5VTEwsCisgKiBhcyB0aGF0IGlzIG9ubHkgZG9uZSBieSBhIHRhc2sgb24gaXRzZWxmLCBhbmQgaWYgdGhlIGN1cnJlbnQgdGFzaworICogaXMgaGVyZSwgaXQgaXMgbm90IHNpbXVsdGFuZW91c2x5IGluIHRoZSBleGl0IGNvZGUgTlVMTCdpbmcgaXRzCisgKiBjcHVzZXQgcG9pbnRlci4gIFRoaXMgcm91dGluZSBhbHNvIG1pZ2h0IGFjcXVpcmUgY2FsbGJhY2tfc2VtIGFuZAorICogY3VycmVudC0+bW0tPm1tYXBfc2VtIGR1cmluZyBjYWxsLgorICoKKyAqIFJlYWRpbmcgY3VycmVudC0+Y3B1c2V0LT5tZW1zX2dlbmVyYXRpb24gZG9lc24ndCBuZWVkIHRhc2tfbG9jaworICogdG8gZ3VhcmQgdGhlIGN1cnJlbnQtPmNwdXNldCBkZXJlZmVuY2UsIGJlY2F1c2UgaXQgaXMgZ3VhcmRlZAorICogZnJvbSBjb25jdXJyZW50IGZyZWVpbmcgb2YgY3VycmVudC0+Y3B1c2V0IGJ5IGF0dGFjaF90YXNrKCksCisgKiB1c2luZyBSQ1UuCisgKgorICogVGhlIHJjdV9kZXJlZmVyZW5jZSgpIGlzIHRlY2huaWNhbGx5IHByb2JhYmx5IG5vdCBuZWVkZWQsCisgKiBhcyBJIGRvbid0IGFjdHVhbGx5IG1pbmQgaWYgSSBzZWUgYSBuZXcgY3B1c2V0IHBvaW50ZXIgYnV0CisgKiBhbiBvbGQgdmFsdWUgb2YgbWVtc19nZW5lcmF0aW9uLiAgSG93ZXZlciB0aGlzIHJlYWxseSBvbmx5CisgKiBtYXR0ZXJzIG9uIGFscGhhIHN5c3RlbXMgdXNpbmcgY3B1c2V0cyBoZWF2aWx5LiAgSWYgSSBkcm9wcGVkCisgKiB0aGF0IHJjdV9kZXJlZmVyZW5jZSgpLCBpdCB3b3VsZCBzYXZlIHRoZW0gYSBtZW1vcnkgYmFycmllci4KKyAqIEZvciBhbGwgb3RoZXIgYXJjaCdzLCByY3VfZGVyZWZlcmVuY2UgaXMgYSBuby1vcCBhbnl3YXksIGFuZCBmb3IKKyAqIGFscGhhIHN5c3RlbXMgbm90IHVzaW5nIGNwdXNldHMsIGFub3RoZXIgcGxhbm5lZCBvcHRpbWl6YXRpb24sCisgKiBhdm9pZGluZyB0aGUgcmN1IGNyaXRpY2FsIHNlY3Rpb24gZm9yIHRhc2tzIGluIHRoZSByb290IGNwdXNldAorICogd2hpY2ggaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQsIHNvIGNhbid0IHZhbmlzaCwgd2lsbCBtYWtlIHRoaXMKKyAqIGlycmVsZXZhbnQuICBCZXR0ZXIgdG8gdXNlIFJDVSBhcyBpbnRlbmRlZCwgdGhhbiB0byBlbmdhZ2UgaW4KKyAqIHNvbWUgY3V0ZSB0cmljayB0byBzYXZlIGEgbWVtb3J5IGJhcnJpZXIgdGhhdCBpcyBpbXBvc3NpYmxlIHRvCisgKiB0ZXN0LCBmb3IgYWxwaGEgc3lzdGVtcyB1c2luZyBjcHVzZXRzIGhlYXZpbHksIHdoaWNoIG1pZ2h0IG5vdAorICogZXZlbiBleGlzdC4KICAqCiAgKiBUaGlzIHJvdXRpbmUgaXMgbmVlZGVkIHRvIHVwZGF0ZSB0aGUgcGVyLXRhc2sgbWVtc19hbGxvd2VkIGRhdGEsCiAgKiB3aXRoaW4gdGhlIHRhc2tzIGNvbnRleHQsIHdoZW4gaXQgaXMgdHJ5aW5nIHRvIGFsbG9jYXRlIG1lbW9yeQpAQCAtNTkxLDI3ICs2NDEsMzEgQEAKICAqIHRhc2sgaGFzIGJlZW4gbW9kaWZ5aW5nIGl0cyBjcHVzZXQuCiAgKi8KIAotc3RhdGljIHZvaWQgcmVmcmVzaF9tZW1zKHZvaWQpCit2b2lkIGNwdXNldF91cGRhdGVfdGFza19tZW1vcnlfc3RhdGUoKQogewogCWludCBteV9jcHVzZXRzX21lbV9nZW47CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCXN0cnVjdCBjcHVzZXQgKmNzOwogCi0JdGFza19sb2NrKGN1cnJlbnQpOwotCW15X2NwdXNldHNfbWVtX2dlbiA9IGN1cnJlbnQtPmNwdXNldC0+bWVtc19nZW5lcmF0aW9uOwotCXRhc2tfdW5sb2NrKGN1cnJlbnQpOworCWlmICh0c2stPmNwdXNldCA9PSAmdG9wX2NwdXNldCkgeworCQkvKiBEb24ndCBuZWVkIHJjdSBmb3IgdG9wX2NwdXNldC4gIEl0J3MgbmV2ZXIgZnJlZWQuICovCisJCW15X2NwdXNldHNfbWVtX2dlbiA9IHRvcF9jcHVzZXQubWVtc19nZW5lcmF0aW9uOworCX0gZWxzZSB7CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJY3MgPSByY3VfZGVyZWZlcmVuY2UodHNrLT5jcHVzZXQpOworCQlteV9jcHVzZXRzX21lbV9nZW4gPSBjcy0+bWVtc19nZW5lcmF0aW9uOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwl9CiAKLQlpZiAoY3VycmVudC0+Y3B1c2V0X21lbXNfZ2VuZXJhdGlvbiAhPSBteV9jcHVzZXRzX21lbV9nZW4pIHsKLQkJc3RydWN0IGNwdXNldCAqY3M7Ci0JCW5vZGVtYXNrX3Qgb2xkbWVtID0gY3VycmVudC0+bWVtc19hbGxvd2VkOwotCisJaWYgKG15X2NwdXNldHNfbWVtX2dlbiAhPSB0c2stPmNwdXNldF9tZW1zX2dlbmVyYXRpb24pIHsKIAkJZG93bigmY2FsbGJhY2tfc2VtKTsKLQkJdGFza19sb2NrKGN1cnJlbnQpOwotCQljcyA9IGN1cnJlbnQtPmNwdXNldDsKLQkJZ3VhcmFudGVlX29ubGluZV9tZW1zKGNzLCAmY3VycmVudC0+bWVtc19hbGxvd2VkKTsKLQkJY3VycmVudC0+Y3B1c2V0X21lbXNfZ2VuZXJhdGlvbiA9IGNzLT5tZW1zX2dlbmVyYXRpb247Ci0JCXRhc2tfdW5sb2NrKGN1cnJlbnQpOworCQl0YXNrX2xvY2sodHNrKTsKKwkJY3MgPSB0c2stPmNwdXNldDsJLyogTWF5YmUgY2hhbmdlZCB3aGVuIHRhc2sgbm90IGxvY2tlZCAqLworCQlndWFyYW50ZWVfb25saW5lX21lbXMoY3MsICZ0c2stPm1lbXNfYWxsb3dlZCk7CisJCXRzay0+Y3B1c2V0X21lbXNfZ2VuZXJhdGlvbiA9IGNzLT5tZW1zX2dlbmVyYXRpb247CisJCXRhc2tfdW5sb2NrKHRzayk7CiAJCXVwKCZjYWxsYmFja19zZW0pOwotCQlpZiAoIW5vZGVzX2VxdWFsKG9sZG1lbSwgY3VycmVudC0+bWVtc19hbGxvd2VkKSkKLQkJCW51bWFfcG9saWN5X3JlYmluZCgmb2xkbWVtLCAmY3VycmVudC0+bWVtc19hbGxvd2VkKTsKKwkJbXBvbF9yZWJpbmRfdGFzayh0c2ssICZ0c2stPm1lbXNfYWxsb3dlZCk7CiAJfQogfQogCkBAIC03NjYsMzYgKzgyMCwxNTAgQEAKIH0KIAogLyoKKyAqIEhhbmRsZSB1c2VyIHJlcXVlc3QgdG8gY2hhbmdlIHRoZSAnbWVtcycgbWVtb3J5IHBsYWNlbWVudAorICogb2YgYSBjcHVzZXQuICBOZWVkcyB0byB2YWxpZGF0ZSB0aGUgcmVxdWVzdCwgdXBkYXRlIHRoZQorICogY3B1c2V0cyBtZW1zX2FsbG93ZWQgYW5kIG1lbXNfZ2VuZXJhdGlvbiwgYW5kIGZvciBlYWNoCisgKiB0YXNrIGluIHRoZSBjcHVzZXQsIHJlYmluZCBhbnkgdm1hIG1lbXBvbGljaWVzIGFuZCBpZgorICogdGhlIGNwdXNldCBpcyBtYXJrZWQgJ21lbW9yeV9taWdyYXRlJywgbWlncmF0ZSB0aGUgdGFza3MKKyAqIHBhZ2VzIHRvIHRoZSBuZXcgbWVtb3J5LgorICoKICAqIENhbGwgd2l0aCBtYW5hZ2Vfc2VtIGhlbGQuICBNYXkgdGFrZSBjYWxsYmFja19zZW0gZHVyaW5nIGNhbGwuCisgKiBXaWxsIHRha2UgdGFza2xpc3RfbG9jaywgc2NhbiB0YXNrbGlzdCBmb3IgdGFza3MgaW4gY3B1c2V0IGNzLAorICogbG9jayBlYWNoIHN1Y2ggdGFza3MgbW0tPm1tYXBfc2VtLCBzY2FuIGl0cyB2bWEncyBhbmQgcmViaW5kCisgKiB0aGVpciBtZW1wb2xpY2llcyB0byB0aGUgY3B1c2V0cyBuZXcgbWVtc19hbGxvd2VkLgogICovCiAKIHN0YXRpYyBpbnQgdXBkYXRlX25vZGVtYXNrKHN0cnVjdCBjcHVzZXQgKmNzLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGNwdXNldCB0cmlhbGNzOworCW5vZGVtYXNrX3Qgb2xkbWVtOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqZywgKnA7CisJc3RydWN0IG1tX3N0cnVjdCAqKm1tYXJyYXk7CisJaW50IGksIG4sIG50YXNrczsKKwlpbnQgbWlncmF0ZTsKKwlpbnQgZnVkZ2U7CiAJaW50IHJldHZhbDsKIAogCXRyaWFsY3MgPSAqY3M7CiAJcmV0dmFsID0gbm9kZWxpc3RfcGFyc2UoYnVmLCB0cmlhbGNzLm1lbXNfYWxsb3dlZCk7CiAJaWYgKHJldHZhbCA8IDApCi0JCXJldHVybiByZXR2YWw7CisJCWdvdG8gZG9uZTsKIAlub2Rlc19hbmQodHJpYWxjcy5tZW1zX2FsbG93ZWQsIHRyaWFsY3MubWVtc19hbGxvd2VkLCBub2RlX29ubGluZV9tYXApOwotCWlmIChub2Rlc19lbXB0eSh0cmlhbGNzLm1lbXNfYWxsb3dlZCkpCi0JCXJldHVybiAtRU5PU1BDOwotCXJldHZhbCA9IHZhbGlkYXRlX2NoYW5nZShjcywgJnRyaWFsY3MpOwotCWlmIChyZXR2YWwgPT0gMCkgewotCQlkb3duKCZjYWxsYmFja19zZW0pOwotCQljcy0+bWVtc19hbGxvd2VkID0gdHJpYWxjcy5tZW1zX2FsbG93ZWQ7Ci0JCWF0b21pY19pbmMoJmNwdXNldF9tZW1zX2dlbmVyYXRpb24pOwotCQljcy0+bWVtc19nZW5lcmF0aW9uID0gYXRvbWljX3JlYWQoJmNwdXNldF9tZW1zX2dlbmVyYXRpb24pOwotCQl1cCgmY2FsbGJhY2tfc2VtKTsKKwlvbGRtZW0gPSBjcy0+bWVtc19hbGxvd2VkOworCWlmIChub2Rlc19lcXVhbChvbGRtZW0sIHRyaWFsY3MubWVtc19hbGxvd2VkKSkgeworCQlyZXR2YWwgPSAwOwkJLyogVG9vIGVhc3kgLSBub3RoaW5nIHRvIGRvICovCisJCWdvdG8gZG9uZTsKIAl9CisJaWYgKG5vZGVzX2VtcHR5KHRyaWFsY3MubWVtc19hbGxvd2VkKSkgeworCQlyZXR2YWwgPSAtRU5PU1BDOworCQlnb3RvIGRvbmU7CisJfQorCXJldHZhbCA9IHZhbGlkYXRlX2NoYW5nZShjcywgJnRyaWFsY3MpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGRvbmU7CisKKwlkb3duKCZjYWxsYmFja19zZW0pOworCWNzLT5tZW1zX2FsbG93ZWQgPSB0cmlhbGNzLm1lbXNfYWxsb3dlZDsKKwlhdG9taWNfaW5jKCZjcHVzZXRfbWVtc19nZW5lcmF0aW9uKTsKKwljcy0+bWVtc19nZW5lcmF0aW9uID0gYXRvbWljX3JlYWQoJmNwdXNldF9tZW1zX2dlbmVyYXRpb24pOworCXVwKCZjYWxsYmFja19zZW0pOworCisJc2V0X2NwdXNldF9iZWluZ19yZWJvdW5kKGNzKTsJCS8qIGNhdXNlcyBtcG9sX2NvcHkoKSByZWJpbmQgKi8KKworCWZ1ZGdlID0gMTA7CQkJCS8qIHNwYXJlIG1tYXJyYXlbXSBzbG90cyAqLworCWZ1ZGdlICs9IGNwdXNfd2VpZ2h0KGNzLT5jcHVzX2FsbG93ZWQpOwkvKiBpbWFnaW5lIG9uZSBmb3JrLWJvbWIvY3B1ICovCisJcmV0dmFsID0gLUVOT01FTTsKKworCS8qCisJICogQWxsb2NhdGUgbW1hcnJheVtdIHRvIGhvbGQgbW0gcmVmZXJlbmNlIGZvciBlYWNoIHRhc2sKKwkgKiBpbiBjcHVzZXQgY3MuICBDYW4ndCBrbWFsbG9jIEdGUF9LRVJORUwgd2hpbGUgaG9sZGluZworCSAqIHRhc2tsaXN0X2xvY2suICBXZSBjb3VsZCB1c2UgR0ZQX0FUT01JQywgYnV0IHdpdGggYQorCSAqIGZldyBtb3JlIGxpbmVzIG9mIGNvZGUsIHdlIGNhbiByZXRyeSB1bnRpbCB3ZSBnZXQgYSBiaWcKKwkgKiBlbm91Z2ggbW1hcnJheVtdIHcvbyB1c2luZyBHRlBfQVRPTUlDLgorCSAqLworCXdoaWxlICgxKSB7CisJCW50YXNrcyA9IGF0b21pY19yZWFkKCZjcy0+Y291bnQpOwkvKiBndWVzcyAqLworCQludGFza3MgKz0gZnVkZ2U7CisJCW1tYXJyYXkgPSBrbWFsbG9jKG50YXNrcyAqIHNpemVvZigqbW1hcnJheSksIEdGUF9LRVJORUwpOworCQlpZiAoIW1tYXJyYXkpCisJCQlnb3RvIGRvbmU7CisJCXdyaXRlX2xvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsJCS8qIGJsb2NrIGZvcmsgKi8KKwkJaWYgKGF0b21pY19yZWFkKCZjcy0+Y291bnQpIDw9IG50YXNrcykKKwkJCWJyZWFrOwkJCQkvKiBnb3QgZW5vdWdoICovCisJCXdyaXRlX3VubG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwkvKiB0cnkgYWdhaW4gKi8KKwkJa2ZyZWUobW1hcnJheSk7CisJfQorCisJbiA9IDA7CisKKwkvKiBMb2FkIHVwIG1tYXJyYXlbXSB3aXRoIG1tIHJlZmVyZW5jZSBmb3IgZWFjaCB0YXNrIGluIGNwdXNldC4gKi8KKwlkb19lYWNoX3RocmVhZChnLCBwKSB7CisJCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCisJCWlmIChuID49IG50YXNrcykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJDcHVzZXQgbWVtcG9saWN5IHJlYmluZCBpbmNvbXBsZXRlLlxuIik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocC0+Y3B1c2V0ICE9IGNzKQorCQkJY29udGludWU7CisJCW1tID0gZ2V0X3Rhc2tfbW0ocCk7CisJCWlmICghbW0pCisJCQljb250aW51ZTsKKwkJbW1hcnJheVtuKytdID0gbW07CisJfSB3aGlsZV9lYWNoX3RocmVhZChnLCBwKTsKKwl3cml0ZV91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKKworCS8qCisJICogTm93IHRoYXQgd2UndmUgZHJvcHBlZCB0aGUgdGFza2xpc3Qgc3BpbmxvY2ssIHdlIGNhbgorCSAqIHJlYmluZCB0aGUgdm1hIG1lbXBvbGljaWVzIG9mIGVhY2ggbW0gaW4gbW1hcnJheVtdIHRvIHRoZWlyCisJICogbmV3IGNwdXNldCwgYW5kIHJlbGVhc2UgdGhhdCBtbS4gIFRoZSBtcG9sX3JlYmluZF9tbSgpCisJICogY2FsbCB0YWtlcyBtbWFwX3NlbSwgd2hpY2ggd2UgY291bGRuJ3QgdGFrZSB3aGlsZSBob2xkaW5nCisJICogdGFza2xpc3RfbG9jay4gIEZvcmtzIGNhbiBoYXBwZW4gYWdhaW4gbm93IC0gdGhlIG1wb2xfY29weSgpCisJICogY3B1c2V0X2JlaW5nX3JlYm91bmQgY2hlY2sgd2lsbCBjYXRjaCBzdWNoIGZvcmtzLCBhbmQgcmViaW5kCisJICogdGhlaXIgdm1hIG1lbXBvbGljaWVzIHRvby4gIEJlY2F1c2Ugd2Ugc3RpbGwgaG9sZCB0aGUgZ2xvYmFsCisJICogY3B1c2V0IG1hbmFnZV9zZW0sIHdlIGtub3cgdGhhdCBubyBvdGhlciByZWJpbmQgZWZmb3J0IHdpbGwKKwkgKiBiZSBjb250ZW5kaW5nIGZvciB0aGUgZ2xvYmFsIHZhcmlhYmxlIGNwdXNldF9iZWluZ19yZWJvdW5kLgorCSAqIEl0J3Mgb2sgaWYgd2UgcmViaW5kIHRoZSBzYW1lIG1tIHR3aWNlOyBtcG9sX3JlYmluZF9tbSgpCisJICogaXMgaWRlbXBvdGVudC4gIEFsc28gbWlncmF0ZSBwYWdlcyBpbiBlYWNoIG1tIHRvIG5ldyBub2Rlcy4KKwkgKi8KKwltaWdyYXRlID0gaXNfbWVtb3J5X21pZ3JhdGUoY3MpOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBtbWFycmF5W2ldOworCisJCW1wb2xfcmViaW5kX21tKG1tLCAmY3MtPm1lbXNfYWxsb3dlZCk7CisJCWlmIChtaWdyYXRlKSB7CisJCQlkb19taWdyYXRlX3BhZ2VzKG1tLCAmb2xkbWVtLCAmY3MtPm1lbXNfYWxsb3dlZCwKKwkJCQkJCQlNUE9MX01GX01PVkVfQUxMKTsKKwkJfQorCQltbXB1dChtbSk7CisJfQorCisJLyogV2UncmUgZG9uZSByZWJpbmRpbmcgdm1hJ3MgdG8gdGhpcyBjcHVzZXRzIG5ldyBtZW1zX2FsbG93ZWQuICovCisJa2ZyZWUobW1hcnJheSk7CisJc2V0X2NwdXNldF9iZWluZ19yZWJvdW5kKE5VTEwpOworCXJldHZhbCA9IDA7Citkb25lOgogCXJldHVybiByZXR2YWw7CiB9CiAKIC8qCisgKiBDYWxsIHdpdGggbWFuYWdlX3NlbSBoZWxkLgorICovCisKK3N0YXRpYyBpbnQgdXBkYXRlX21lbW9yeV9wcmVzc3VyZV9lbmFibGVkKHN0cnVjdCBjcHVzZXQgKmNzLCBjaGFyICpidWYpCit7CisJaWYgKHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApICE9IDApCisJCWNwdXNldF9tZW1vcnlfcHJlc3N1cmVfZW5hYmxlZCA9IDE7CisJZWxzZQorCQljcHVzZXRfbWVtb3J5X3ByZXNzdXJlX2VuYWJsZWQgPSAwOworCXJldHVybiAwOworfQorCisvKgogICogdXBkYXRlX2ZsYWcgLSByZWFkIGEgMCBvciBhIDEgaW4gYSBmaWxlIGFuZCB1cGRhdGUgYXNzb2NpYXRlZCBmbGFnCiAgKiBiaXQ6CXRoZSBiaXQgdG8gdXBkYXRlIChDU19DUFVfRVhDTFVTSVZFLCBDU19NRU1fRVhDTFVTSVZFLAotICoJCQkJCQlDU19OT1RJRllfT05fUkVMRUFTRSkKKyAqCQkJCUNTX05PVElGWV9PTl9SRUxFQVNFLCBDU19NRU1PUllfTUlHUkFURSkKICAqIGNzOgl0aGUgY3B1c2V0IHRvIHVwZGF0ZQogICogYnVmOgl0aGUgYnVmZmVyIHdoZXJlIHdlIHJlYWQgdGhlIDAgb3IgMQogICoKQEAgLTgzNCw2ICsxMDAyLDEwNCBAQAogfQogCiAvKgorICogRnJlcXVlbmN5IG1ldGVyIC0gSG93IGZhc3QgaXMgc29tZSBldmVudCBvY2N1cmluZz8KKyAqCisgKiBUaGVzZSByb3V0aW5lcyBtYW5hZ2UgYSBkaWdpdGFsbHkgZmlsdGVyZWQsIGNvbnN0YW50IHRpbWUgYmFzZWQsCisgKiBldmVudCBmcmVxdWVuY3kgbWV0ZXIuICBUaGVyZSBhcmUgZm91ciByb3V0aW5lczoKKyAqICAgZm1ldGVyX2luaXQoKSAtIGluaXRpYWxpemUgYSBmcmVxdWVuY3kgbWV0ZXIuCisgKiAgIGZtZXRlcl9tYXJrZXZlbnQoKSAtIGNhbGxlZCBlYWNoIHRpbWUgdGhlIGV2ZW50IGhhcHBlbnMuCisgKiAgIGZtZXRlcl9nZXRyYXRlKCkgLSByZXR1cm5zIHRoZSByZWNlbnQgcmF0ZSBvZiBzdWNoIGV2ZW50cy4KKyAqICAgZm1ldGVyX3VwZGF0ZSgpIC0gaW50ZXJuYWwgcm91dGluZSB1c2VkIHRvIHVwZGF0ZSBmbWV0ZXIuCisgKgorICogQSBjb21tb24gZGF0YSBzdHJ1Y3R1cmUgaXMgcGFzc2VkIHRvIGVhY2ggb2YgdGhlc2Ugcm91dGluZXMsCisgKiB3aGljaCBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHN0YXRlIHJlcXVpcmVkIHRvIG1hbmFnZSB0aGUKKyAqIGZyZXF1ZW5jeSBtZXRlciBhbmQgaXRzIGRpZ2l0YWwgZmlsdGVyLgorICoKKyAqIFRoZSBmaWx0ZXIgd29ya3Mgb24gdGhlIG51bWJlciBvZiBldmVudHMgbWFya2VkIHBlciB1bml0IHRpbWUuCisgKiBUaGUgZmlsdGVyIGlzIHNpbmdsZS1wb2xlIGxvdy1wYXNzIHJlY3Vyc2l2ZSAoSUlSKS4gIFRoZSB0aW1lIHVuaXQKKyAqIGlzIDEgc2Vjb25kLiAgQXJpdGhtZXRpYyBpcyBkb25lIHVzaW5nIDMyLWJpdCBpbnRlZ2VycyBzY2FsZWQgdG8KKyAqIHNpbXVsYXRlIDMgZGVjaW1hbCBkaWdpdHMgb2YgcHJlY2lzaW9uIChtdWx0aXBsaWVkIGJ5IDEwMDApLgorICoKKyAqIFdpdGggYW4gRk1fQ09FRiBvZiA5MzMsIGFuZCBhIHRpbWUgYmFzZSBvZiAxIHNlY29uZCwgdGhlIGZpbHRlcgorICogaGFzIGEgaGFsZi1saWZlIG9mIDEwIHNlY29uZHMsIG1lYW5pbmcgdGhhdCBpZiB0aGUgZXZlbnRzIHF1aXQKKyAqIGhhcHBlbmluZywgdGhlbiB0aGUgcmF0ZSByZXR1cm5lZCBmcm9tIHRoZSBmbWV0ZXJfZ2V0cmF0ZSgpCisgKiB3aWxsIGJlIGN1dCBpbiBoYWxmIGVhY2ggMTAgc2Vjb25kcywgdW50aWwgaXQgY29udmVyZ2VzIHRvIHplcm8uCisgKgorICogSXQgaXMgbm90IHdvcnRoIGRvaW5nIGEgcmVhbCBpbmZpbml0ZWx5IHJlY3Vyc2l2ZSBmaWx0ZXIuICBJZiBtb3JlCisgKiB0aGFuIEZNX01BWFRJQ0tTIHRpY2tzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBmaWx0ZXIgZXZlbnQsCisgKiBqdXN0IGNvbXB1dGUgRk1fTUFYVElDS1MgdGlja3Mgd29ydGgsIGJ5IHdoaWNoIHBvaW50IHRoZSBsZXZlbAorICogd2lsbCBiZSBzdGFibGUuCisgKgorICogTGltaXQgdGhlIGNvdW50IG9mIHVucHJvY2Vzc2VkIGV2ZW50cyB0byBGTV9NQVhDTlQsIHNvIGFzIHRvIGF2b2lkCisgKiBhcml0aG1ldGljIG92ZXJmbG93IGluIHRoZSBmbWV0ZXJfdXBkYXRlKCkgcm91dGluZS4KKyAqCisgKiBHaXZlbiB0aGUgc2ltcGxlIDMyIGJpdCBpbnRlZ2VyIGFyaXRobWV0aWMgdXNlZCwgdGhpcyBtZXRlciB3b3JrcworICogYmVzdCBmb3IgcmVwb3J0aW5nIHJhdGVzIGJldHdlZW4gb25lIHBlciBtaWxsaXNlY29uZCAobXNlYykgYW5kCisgKiBvbmUgcGVyIDMyIChhcHByb3gpIHNlY29uZHMuICBBdCBjb25zdGFudCByYXRlcyBmYXN0ZXIgdGhhbiBvbmUKKyAqIHBlciBtc2VjIGl0IG1heGVzIG91dCBhdCB2YWx1ZXMganVzdCB1bmRlciAxLDAwMCwwMDAuICBBdCBjb25zdGFudAorICogcmF0ZXMgYmV0d2VlbiBvbmUgcGVyIG1zZWMsIGFuZCBvbmUgcGVyIHNlY29uZCBpdCB3aWxsIHN0YWJpbGl6ZQorICogdG8gYSB2YWx1ZSBOKjEwMDAsIHdoZXJlIE4gaXMgdGhlIHJhdGUgb2YgZXZlbnRzIHBlciBzZWNvbmQuCisgKiBBdCBjb25zdGFudCByYXRlcyBiZXR3ZWVuIG9uZSBwZXIgc2Vjb25kIGFuZCBvbmUgcGVyIDMyIHNlY29uZHMsCisgKiBpdCB3aWxsIGJlIGNob3BweSwgbW92aW5nIHVwIG9uIHRoZSBzZWNvbmRzIHRoYXQgaGF2ZSBhbiBldmVudCwKKyAqIGFuZCB0aGVuIGRlY2F5aW5nIHVudGlsIHRoZSBuZXh0IGV2ZW50LiAgQXQgcmF0ZXMgc2xvd2VyIHRoYW4KKyAqIGFib3V0IG9uZSBpbiAzMiBzZWNvbmRzLCBpdCBkZWNheXMgYWxsIHRoZSB3YXkgYmFjayB0byB6ZXJvIGJldHdlZW4KKyAqIGVhY2ggZXZlbnQuCisgKi8KKworI2RlZmluZSBGTV9DT0VGIDkzMwkJLyogY29lZmZpY2llbnQgZm9yIGhhbGYtbGlmZSBvZiAxMCBzZWNzICovCisjZGVmaW5lIEZNX01BWFRJQ0tTICgodGltZV90KTk5KSAvKiB1c2VsZXNzIGNvbXB1dGluZyBtb3JlIHRpY2tzIHRoYW4gdGhpcyAqLworI2RlZmluZSBGTV9NQVhDTlQgMTAwMDAwMAkvKiBsaW1pdCBjbnQgdG8gYXZvaWQgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgRk1fU0NBTEUgMTAwMAkJLyogZmF1eCBmaXhlZCBwb2ludCBzY2FsZSAqLworCisvKiBJbml0aWFsaXplIGEgZnJlcXVlbmN5IG1ldGVyICovCitzdGF0aWMgdm9pZCBmbWV0ZXJfaW5pdChzdHJ1Y3QgZm1ldGVyICpmbXApCit7CisJZm1wLT5jbnQgPSAwOworCWZtcC0+dmFsID0gMDsKKwlmbXAtPnRpbWUgPSAwOworCXNwaW5fbG9ja19pbml0KCZmbXAtPmxvY2spOworfQorCisvKiBJbnRlcm5hbCBtZXRlciB1cGRhdGUgLSBwcm9jZXNzIGNudCBldmVudHMgYW5kIHVwZGF0ZSB2YWx1ZSAqLworc3RhdGljIHZvaWQgZm1ldGVyX3VwZGF0ZShzdHJ1Y3QgZm1ldGVyICpmbXApCit7CisJdGltZV90IG5vdyA9IGdldF9zZWNvbmRzKCk7CisJdGltZV90IHRpY2tzID0gbm93IC0gZm1wLT50aW1lOworCisJaWYgKHRpY2tzID09IDApCisJCXJldHVybjsKKworCXRpY2tzID0gbWluKEZNX01BWFRJQ0tTLCB0aWNrcyk7CisJd2hpbGUgKHRpY2tzLS0gPiAwKQorCQlmbXAtPnZhbCA9IChGTV9DT0VGICogZm1wLT52YWwpIC8gRk1fU0NBTEU7CisJZm1wLT50aW1lID0gbm93OworCisJZm1wLT52YWwgKz0gKChGTV9TQ0FMRSAtIEZNX0NPRUYpICogZm1wLT5jbnQpIC8gRk1fU0NBTEU7CisJZm1wLT5jbnQgPSAwOworfQorCisvKiBQcm9jZXNzIGFueSBwcmV2aW91cyB0aWNrcywgdGhlbiBidW1wIGNudCBieSBvbmUgKHRpbWVzIHNjYWxlKS4gKi8KK3N0YXRpYyB2b2lkIGZtZXRlcl9tYXJrZXZlbnQoc3RydWN0IGZtZXRlciAqZm1wKQoreworCXNwaW5fbG9jaygmZm1wLT5sb2NrKTsKKwlmbWV0ZXJfdXBkYXRlKGZtcCk7CisJZm1wLT5jbnQgPSBtaW4oRk1fTUFYQ05ULCBmbXAtPmNudCArIEZNX1NDQUxFKTsKKwlzcGluX3VubG9jaygmZm1wLT5sb2NrKTsKK30KKworLyogUHJvY2VzcyBhbnkgcHJldmlvdXMgdGlja3MsIHRoZW4gcmV0dXJuIGN1cnJlbnQgdmFsdWUuICovCitzdGF0aWMgaW50IGZtZXRlcl9nZXRyYXRlKHN0cnVjdCBmbWV0ZXIgKmZtcCkKK3sKKwlpbnQgdmFsOworCisJc3Bpbl9sb2NrKCZmbXAtPmxvY2spOworCWZtZXRlcl91cGRhdGUoZm1wKTsKKwl2YWwgPSBmbXAtPnZhbDsKKwlzcGluX3VubG9jaygmZm1wLT5sb2NrKTsKKwlyZXR1cm4gdmFsOworfQorCisvKgogICogQXR0YWNrIHRhc2sgc3BlY2lmaWVkIGJ5IHBpZCBpbiAncGlkYnVmJyB0byBjcHVzZXQgJ2NzJywgcG9zc2libHkKICAqIHdyaXRpbmcgdGhlIHBhdGggb2YgdGhlIG9sZCBjcHVzZXQgaW4gJ3BwYXRoYnVmJyBpZiBpdCBuZWVkcyB0byBiZQogICogbm90aWZpZWQgb24gcmVsZWFzZS4KQEAgLTg0OCw2ICsxMTE0LDggQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKIAlzdHJ1Y3QgY3B1c2V0ICpvbGRjczsKIAljcHVtYXNrX3QgY3B1czsKKwlub2RlbWFza190IGZyb20sIHRvOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwogCiAJaWYgKHNzY2FuZihwaWRidWYsICIlZCIsICZwaWQpICE9IDEpCiAJCXJldHVybiAtRUlPOwpAQCAtODg3LDE0ICsxMTU1LDI3IEBACiAJCXJldHVybiAtRVNSQ0g7CiAJfQogCWF0b21pY19pbmMoJmNzLT5jb3VudCk7Ci0JdHNrLT5jcHVzZXQgPSBjczsKKwlyY3VfYXNzaWduX3BvaW50ZXIodHNrLT5jcHVzZXQsIGNzKTsKIAl0YXNrX3VubG9jayh0c2spOwogCiAJZ3VhcmFudGVlX29ubGluZV9jcHVzKGNzLCAmY3B1cyk7CiAJc2V0X2NwdXNfYWxsb3dlZCh0c2ssIGNwdXMpOwogCisJZnJvbSA9IG9sZGNzLT5tZW1zX2FsbG93ZWQ7CisJdG8gPSBjcy0+bWVtc19hbGxvd2VkOworCiAJdXAoJmNhbGxiYWNrX3NlbSk7CisKKwltbSA9IGdldF90YXNrX21tKHRzayk7CisJaWYgKG1tKSB7CisJCW1wb2xfcmViaW5kX21tKG1tLCAmdG8pOworCQltbXB1dChtbSk7CisJfQorCisJaWYgKGlzX21lbW9yeV9taWdyYXRlKGNzKSkKKwkJZG9fbWlncmF0ZV9wYWdlcyh0c2stPm1tLCAmZnJvbSwgJnRvLCBNUE9MX01GX01PVkVfQUxMKTsKIAlwdXRfdGFza19zdHJ1Y3QodHNrKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmb2xkY3MtPmNvdW50KSkKIAkJY2hlY2tfZm9yX3JlbGVhc2Uob2xkY3MsIHBwYXRoYnVmKTsKIAlyZXR1cm4gMDsKQEAgLTkwNSwxMSArMTE4NiwxNCBAQAogdHlwZWRlZiBlbnVtIHsKIAlGSUxFX1JPT1QsCiAJRklMRV9ESVIsCisJRklMRV9NRU1PUllfTUlHUkFURSwKIAlGSUxFX0NQVUxJU1QsCiAJRklMRV9NRU1MSVNULAogCUZJTEVfQ1BVX0VYQ0xVU0lWRSwKIAlGSUxFX01FTV9FWENMVVNJVkUsCiAJRklMRV9OT1RJRllfT05fUkVMRUFTRSwKKwlGSUxFX01FTU9SWV9QUkVTU1VSRV9FTkFCTEVELAorCUZJTEVfTUVNT1JZX1BSRVNTVVJFLAogCUZJTEVfVEFTS0xJU1QsCiB9IGNwdXNldF9maWxldHlwZV90OwogCkBAIC05NjAsNiArMTI0NCwxNSBAQAogCWNhc2UgRklMRV9OT1RJRllfT05fUkVMRUFTRToKIAkJcmV0dmFsID0gdXBkYXRlX2ZsYWcoQ1NfTk9USUZZX09OX1JFTEVBU0UsIGNzLCBidWZmZXIpOwogCQlicmVhazsKKwljYXNlIEZJTEVfTUVNT1JZX01JR1JBVEU6CisJCXJldHZhbCA9IHVwZGF0ZV9mbGFnKENTX01FTU9SWV9NSUdSQVRFLCBjcywgYnVmZmVyKTsKKwkJYnJlYWs7CisJY2FzZSBGSUxFX01FTU9SWV9QUkVTU1VSRV9FTkFCTEVEOgorCQlyZXR2YWwgPSB1cGRhdGVfbWVtb3J5X3ByZXNzdXJlX2VuYWJsZWQoY3MsIGJ1ZmZlcik7CisJCWJyZWFrOworCWNhc2UgRklMRV9NRU1PUllfUFJFU1NVUkU6CisJCXJldHZhbCA9IC1FQUNDRVM7CisJCWJyZWFrOwogCWNhc2UgRklMRV9UQVNLTElTVDoKIAkJcmV0dmFsID0gYXR0YWNoX3Rhc2soY3MsIGJ1ZmZlciwgJnBhdGhidWYpOwogCQlicmVhazsKQEAgLTEwNjAsNiArMTM1MywxNSBAQAogCWNhc2UgRklMRV9OT1RJRllfT05fUkVMRUFTRToKIAkJKnMrKyA9IG5vdGlmeV9vbl9yZWxlYXNlKGNzKSA/ICcxJyA6ICcwJzsKIAkJYnJlYWs7CisJY2FzZSBGSUxFX01FTU9SWV9NSUdSQVRFOgorCQkqcysrID0gaXNfbWVtb3J5X21pZ3JhdGUoY3MpID8gJzEnIDogJzAnOworCQlicmVhazsKKwljYXNlIEZJTEVfTUVNT1JZX1BSRVNTVVJFX0VOQUJMRUQ6CisJCSpzKysgPSBjcHVzZXRfbWVtb3J5X3ByZXNzdXJlX2VuYWJsZWQgPyAnMScgOiAnMCc7CisJCWJyZWFrOworCWNhc2UgRklMRV9NRU1PUllfUFJFU1NVUkU6CisJCXMgKz0gc3ByaW50ZihzLCAiJWQiLCBmbWV0ZXJfZ2V0cmF0ZSgmY3MtPmZtZXRlcikpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKQEAgLTExNzgsNyArMTQ4MCw3IEBACiAKIC8qCiAgKgljcHVzZXRfY3JlYXRlX2RpciAtIGNyZWF0ZSBhIGRpcmVjdG9yeSBmb3IgYW4gb2JqZWN0LgotICoJY3M6IAl0aGUgY3B1c2V0IHdlIGNyZWF0ZSB0aGUgZGlyZWN0b3J5IGZvci4KKyAqCWNzOgl0aGUgY3B1c2V0IHdlIGNyZWF0ZSB0aGUgZGlyZWN0b3J5IGZvci4KICAqCQlJdCBtdXN0IGhhdmUgYSB2YWxpZCAtPnBhcmVudCBmaWVsZAogICoJCUFuZCB3ZSBhcmUgZ29pbmcgdG8gZmlsbCBpdHMgLT5kZW50cnkgZmllbGQuCiAgKgluYW1lOglUaGUgbmFtZSB0byBnaXZlIHRvIHRoZSBjcHVzZXQgZGlyZWN0b3J5LiBXaWxsIGJlIGNvcGllZC4KQEAgLTEyMTEsNyArMTUxMyw3IEBACiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCWludCBlcnJvcjsKIAotCWRvd24oJmRpci0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmRpci0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJZGVudHJ5ID0gY3B1c2V0X2dldF9kZW50cnkoZGlyLCBjZnQtPm5hbWUpOwogCWlmICghSVNfRVJSKGRlbnRyeSkpIHsKIAkJZXJyb3IgPSBjcHVzZXRfY3JlYXRlX2ZpbGUoZGVudHJ5LCAwNjQ0IHwgU19JRlJFRyk7CkBAIC0xMjIwLDcgKzE1MjIsNyBAQAogCQlkcHV0KGRlbnRyeSk7CiAJfSBlbHNlCiAJCWVycm9yID0gUFRSX0VSUihkZW50cnkpOwotCXVwKCZkaXItPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmRpci0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0xMjUyLDcgKzE1NTQsNyBAQAogICogd2hlbiByZWFkaW5nIG91dCBwLT5jcHVzZXQsIGFzIHdlIGRvbid0IHJlYWxseSBjYXJlIGlmIGl0IGNoYW5nZXMKICAqIG9uIHRoZSBuZXh0IGN5Y2xlLCBhbmQgd2UgYXJlIG5vdCBnb2luZyB0byB0cnkgdG8gZGVyZWZlcmVuY2UgaXQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHBpZF9hcnJheV9sb2FkKHBpZF90ICpwaWRhcnJheSwgaW50IG5waWRzLCBzdHJ1Y3QgY3B1c2V0ICpjcykKK3N0YXRpYyBpbnQgcGlkX2FycmF5X2xvYWQocGlkX3QgKnBpZGFycmF5LCBpbnQgbnBpZHMsIHN0cnVjdCBjcHVzZXQgKmNzKQogewogCWludCBuID0gMDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmcsICpwOwpAQCAtMTQwOCw2ICsxNzEwLDIxIEBACiAJLnByaXZhdGUgPSBGSUxFX05PVElGWV9PTl9SRUxFQVNFLAogfTsKIAorc3RhdGljIHN0cnVjdCBjZnR5cGUgY2Z0X21lbW9yeV9taWdyYXRlID0geworCS5uYW1lID0gIm1lbW9yeV9taWdyYXRlIiwKKwkucHJpdmF0ZSA9IEZJTEVfTUVNT1JZX01JR1JBVEUsCit9OworCitzdGF0aWMgc3RydWN0IGNmdHlwZSBjZnRfbWVtb3J5X3ByZXNzdXJlX2VuYWJsZWQgPSB7CisJLm5hbWUgPSAibWVtb3J5X3ByZXNzdXJlX2VuYWJsZWQiLAorCS5wcml2YXRlID0gRklMRV9NRU1PUllfUFJFU1NVUkVfRU5BQkxFRCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2Z0eXBlIGNmdF9tZW1vcnlfcHJlc3N1cmUgPSB7CisJLm5hbWUgPSAibWVtb3J5X3ByZXNzdXJlIiwKKwkucHJpdmF0ZSA9IEZJTEVfTUVNT1JZX1BSRVNTVVJFLAorfTsKKwogc3RhdGljIGludCBjcHVzZXRfcG9wdWxhdGVfZGlyKHN0cnVjdCBkZW50cnkgKmNzX2RlbnRyeSkKIHsKIAlpbnQgZXJyOwpAQCAtMTQyMiw2ICsxNzM5LDEwIEBACiAJCXJldHVybiBlcnI7CiAJaWYgKChlcnIgPSBjcHVzZXRfYWRkX2ZpbGUoY3NfZGVudHJ5LCAmY2Z0X25vdGlmeV9vbl9yZWxlYXNlKSkgPCAwKQogCQlyZXR1cm4gZXJyOworCWlmICgoZXJyID0gY3B1c2V0X2FkZF9maWxlKGNzX2RlbnRyeSwgJmNmdF9tZW1vcnlfbWlncmF0ZSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlpZiAoKGVyciA9IGNwdXNldF9hZGRfZmlsZShjc19kZW50cnksICZjZnRfbWVtb3J5X3ByZXNzdXJlKSkgPCAwKQorCQlyZXR1cm4gZXJyOwogCWlmICgoZXJyID0gY3B1c2V0X2FkZF9maWxlKGNzX2RlbnRyeSwgJmNmdF90YXNrcykpIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlyZXR1cm4gMDsKQEAgLTE0NDYsNyArMTc2Nyw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJZG93bigmbWFuYWdlX3NlbSk7Ci0JcmVmcmVzaF9tZW1zKCk7CisJY3B1c2V0X3VwZGF0ZV90YXNrX21lbW9yeV9zdGF0ZSgpOwogCWNzLT5mbGFncyA9IDA7CiAJaWYgKG5vdGlmeV9vbl9yZWxlYXNlKHBhcmVudCkpCiAJCXNldF9iaXQoQ1NfTk9USUZZX09OX1JFTEVBU0UsICZjcy0+ZmxhZ3MpOwpAQCAtMTQ1NywxMSArMTc3OCwxMyBAQAogCUlOSVRfTElTVF9IRUFEKCZjcy0+Y2hpbGRyZW4pOwogCWF0b21pY19pbmMoJmNwdXNldF9tZW1zX2dlbmVyYXRpb24pOwogCWNzLT5tZW1zX2dlbmVyYXRpb24gPSBhdG9taWNfcmVhZCgmY3B1c2V0X21lbXNfZ2VuZXJhdGlvbik7CisJZm1ldGVyX2luaXQoJmNzLT5mbWV0ZXIpOwogCiAJY3MtPnBhcmVudCA9IHBhcmVudDsKIAogCWRvd24oJmNhbGxiYWNrX3NlbSk7CiAJbGlzdF9hZGQoJmNzLT5zaWJsaW5nLCAmY3MtPnBhcmVudC0+Y2hpbGRyZW4pOworCW51bWJlcl9vZl9jcHVzZXRzKys7CiAJdXAoJmNhbGxiYWNrX3NlbSk7CiAKIAllcnIgPSBjcHVzZXRfY3JlYXRlX2RpcihjcywgbmFtZSwgbW9kZSk7CkBAIC0xNDcwLDcgKzE3OTMsNyBAQAogCiAJLyoKIAkgKiBSZWxlYXNlIG1hbmFnZV9zZW0gYmVmb3JlIGNwdXNldF9wb3B1bGF0ZV9kaXIoKSBiZWNhdXNlIGl0Ci0JICogd2lsbCBkb3duKCkgdGhpcyBuZXcgZGlyZWN0b3J5J3MgaV9zZW0gYW5kIGlmIHdlIHJhY2Ugd2l0aAorCSAqIHdpbGwgZG93bigpIHRoaXMgbmV3IGRpcmVjdG9yeSdzIGlfbXV0ZXggYW5kIGlmIHdlIHJhY2Ugd2l0aAogCSAqIGFub3RoZXIgbWtkaXIsIHdlIG1pZ2h0IGRlYWRsb2NrLgogCSAqLwogCXVwKCZtYW5hZ2Vfc2VtKTsKQEAgLTE0ODksNyArMTgxMiw3IEBACiB7CiAJc3RydWN0IGNwdXNldCAqY19wYXJlbnQgPSBkZW50cnktPmRfcGFyZW50LT5kX2ZzZGF0YTsKIAotCS8qIHRoZSB2ZnMgaG9sZHMgaW5vZGUtPmlfc2VtIGFscmVhZHkgKi8KKwkvKiB0aGUgdmZzIGhvbGRzIGlub2RlLT5pX211dGV4IGFscmVhZHkgKi8KIAlyZXR1cm4gY3B1c2V0X2NyZWF0ZShjX3BhcmVudCwgZGVudHJ5LT5kX25hbWUubmFtZSwgbW9kZSB8IFNfSUZESVIpOwogfQogCkBAIC0xNTAwLDEwICsxODIzLDEwIEBACiAJc3RydWN0IGNwdXNldCAqcGFyZW50OwogCWNoYXIgKnBhdGhidWYgPSBOVUxMOwogCi0JLyogdGhlIHZmcyBob2xkcyBib3RoIGlub2RlLT5pX3NlbSBhbHJlYWR5ICovCisJLyogdGhlIHZmcyBob2xkcyBib3RoIGlub2RlLT5pX211dGV4IGFscmVhZHkgKi8KIAogCWRvd24oJm1hbmFnZV9zZW0pOwotCXJlZnJlc2hfbWVtcygpOworCWNwdXNldF91cGRhdGVfdGFza19tZW1vcnlfc3RhdGUoKTsKIAlpZiAoYXRvbWljX3JlYWQoJmNzLT5jb3VudCkgPiAwKSB7CiAJCXVwKCZtYW5hZ2Vfc2VtKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTE1MjQsNiArMTg0Nyw3IEBACiAJc3Bpbl91bmxvY2soJmQtPmRfbG9jayk7CiAJY3B1c2V0X2RfcmVtb3ZlX2RpcihkKTsKIAlkcHV0KGQpOworCW51bWJlcl9vZl9jcHVzZXRzLS07CiAJdXAoJmNhbGxiYWNrX3NlbSk7CiAJaWYgKGxpc3RfZW1wdHkoJnBhcmVudC0+Y2hpbGRyZW4pKQogCQljaGVja19mb3JfcmVsZWFzZShwYXJlbnQsICZwYXRoYnVmKTsKQEAgLTE1MzIsNiArMTg1NiwyMSBAQAogCXJldHVybiAwOwogfQogCisvKgorICogY3B1c2V0X2luaXRfZWFybHkgLSBqdXN0IGVub3VnaCBzbyB0aGF0IHRoZSBjYWxscyB0bworICogY3B1c2V0X3VwZGF0ZV90YXNrX21lbW9yeV9zdGF0ZSgpIGluIGVhcmx5IGluaXQgY29kZQorICogYXJlIGhhcm1sZXNzLgorICovCisKK2ludCBfX2luaXQgY3B1c2V0X2luaXRfZWFybHkodm9pZCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisKKwl0c2stPmNwdXNldCA9ICZ0b3BfY3B1c2V0OworCXRzay0+Y3B1c2V0LT5tZW1zX2dlbmVyYXRpb24gPSBhdG9taWNfcmVhZCgmY3B1c2V0X21lbXNfZ2VuZXJhdGlvbik7CisJcmV0dXJuIDA7Cit9CisKIC8qKgogICogY3B1c2V0X2luaXQgLSBpbml0aWFsaXplIGNwdXNldHMgYXQgc3lzdGVtIGJvb3QKICAqCkBAIC0xNTQ2LDYgKzE4ODUsNyBAQAogCXRvcF9jcHVzZXQuY3B1c19hbGxvd2VkID0gQ1BVX01BU0tfQUxMOwogCXRvcF9jcHVzZXQubWVtc19hbGxvd2VkID0gTk9ERV9NQVNLX0FMTDsKIAorCWZtZXRlcl9pbml0KCZ0b3BfY3B1c2V0LmZtZXRlcik7CiAJYXRvbWljX2luYygmY3B1c2V0X21lbXNfZ2VuZXJhdGlvbik7CiAJdG9wX2NwdXNldC5tZW1zX2dlbmVyYXRpb24gPSBhdG9taWNfcmVhZCgmY3B1c2V0X21lbXNfZ2VuZXJhdGlvbik7CiAKQEAgLTE1NjYsNyArMTkwNiwxMSBAQAogCXJvb3QtPmRfaW5vZGUtPmlfbmxpbmsrKzsKIAl0b3BfY3B1c2V0LmRlbnRyeSA9IHJvb3Q7CiAJcm9vdC0+ZF9pbm9kZS0+aV9vcCA9ICZjcHVzZXRfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJbnVtYmVyX29mX2NwdXNldHMgPSAxOwogCWVyciA9IGNwdXNldF9wb3B1bGF0ZV9kaXIocm9vdCk7CisJLyogbWVtb3J5X3ByZXNzdXJlX2VuYWJsZWQgaXMgaW4gcm9vdCBjcHVzZXQgb25seSAqLworCWlmIChlcnIgPT0gMCkKKwkJZXJyID0gY3B1c2V0X2FkZF9maWxlKHJvb3QsICZjZnRfbWVtb3J5X3ByZXNzdXJlX2VuYWJsZWQpOwogb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC0xNjMyLDE1ICsxOTc2LDEzIEBACiAgKgogICogV2UgZG9uJ3QgbmVlZCB0byB0YXNrX2xvY2soKSB0aGlzIHJlZmVyZW5jZSB0byB0c2stPmNwdXNldCwKICAqIGJlY2F1c2UgdHNrIGlzIGFscmVhZHkgbWFya2VkIFBGX0VYSVRJTkcsIHNvIGF0dGFjaF90YXNrKCkgd29uJ3QKLSAqIG1lc3Mgd2l0aCBpdC4KKyAqIG1lc3Mgd2l0aCBpdCwgb3IgdGFzayBpcyBhIGZhaWxlZCBmb3JrLCBuZXZlciB2aXNpYmxlIHRvIGF0dGFjaF90YXNrLgogICoqLwogCiB2b2lkIGNwdXNldF9leGl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewogCXN0cnVjdCBjcHVzZXQgKmNzOwogCi0JQlVHX09OKCEodHNrLT5mbGFncyAmIFBGX0VYSVRJTkcpKTsKLQogCWNzID0gdHNrLT5jcHVzZXQ7CiAJdHNrLT5jcHVzZXQgPSBOVUxMOwogCkBAIC0xNjY3LDE0ICsyMDA5LDE0IEBACiAgKiB0YXNrcyBjcHVzZXQuCiAgKiovCiAKLWNwdW1hc2tfdCBjcHVzZXRfY3B1c19hbGxvd2VkKGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQorY3B1bWFza190IGNwdXNldF9jcHVzX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJY3B1bWFza190IG1hc2s7CiAKIAlkb3duKCZjYWxsYmFja19zZW0pOwotCXRhc2tfbG9jaygoc3RydWN0IHRhc2tfc3RydWN0ICopdHNrKTsKKwl0YXNrX2xvY2sodHNrKTsKIAlndWFyYW50ZWVfb25saW5lX2NwdXModHNrLT5jcHVzZXQsICZtYXNrKTsKLQl0YXNrX3VubG9jaygoc3RydWN0IHRhc2tfc3RydWN0ICopdHNrKTsKKwl0YXNrX3VubG9jayh0c2spOwogCXVwKCZjYWxsYmFja19zZW0pOwogCiAJcmV0dXJuIG1hc2s7CkBAIC0xNjg2LDQzICsyMDI4LDI2IEBACiB9CiAKIC8qKgotICogY3B1c2V0X3VwZGF0ZV9jdXJyZW50X21lbXNfYWxsb3dlZCAtIHVwZGF0ZSBtZW1zIHBhcmFtZXRlcnMgdG8gbmV3IHZhbHVlcworICogY3B1c2V0X21lbXNfYWxsb3dlZCAtIHJldHVybiBtZW1zX2FsbG93ZWQgbWFzayBmcm9tIGEgdGFza3MgY3B1c2V0LgorICogQHRzazogcG9pbnRlciB0byB0YXNrX3N0cnVjdCBmcm9tIHdoaWNoIHRvIG9idGFpbiBjcHVzZXQtPm1lbXNfYWxsb3dlZC4KICAqCi0gKiBJZiB0aGUgY3VycmVudCB0YXNrcyBjcHVzZXRzIG1lbXNfYWxsb3dlZCBjaGFuZ2VkIGJlaGluZCBvdXIgYmFja3MsCi0gKiB1cGRhdGUgY3VycmVudC0+bWVtc19hbGxvd2VkIGFuZCBtZW1zX2dlbmVyYXRpb24gdG8gdGhlIG5ldyB2YWx1ZS4KLSAqIERvIG5vdCBjYWxsIHRoaXMgcm91dGluZSBpZiBpbl9pbnRlcnJ1cHQoKS4KLSAqCi0gKiBDYWxsIHdpdGhvdXQgY2FsbGJhY2tfc2VtIG9yIHRhc2tfbG9jaygpIGhlbGQuICBNYXkgYmUgY2FsbGVkCi0gKiB3aXRoIG9yIHdpdGhvdXQgbWFuYWdlX3NlbSBoZWxkLiAgVW5sZXNzIGV4aXRpbmcsIGl0IHdpbGwgYWNxdWlyZQotICogdGFza19sb2NrKCkuICBBbHNvIG1pZ2h0IGFjcXVpcmUgY2FsbGJhY2tfc2VtIGR1cmluZyBjYWxsIHRvCi0gKiByZWZyZXNoX21lbXMoKS4KLSAqLworICogRGVzY3JpcHRpb246IFJldHVybnMgdGhlIG5vZGVtYXNrX3QgbWVtc19hbGxvd2VkIG9mIHRoZSBjcHVzZXQKKyAqIGF0dGFjaGVkIHRvIHRoZSBzcGVjaWZpZWQgQHRzay4gIEd1YXJhbnRlZWQgdG8gcmV0dXJuIHNvbWUgbm9uLWVtcHR5CisgKiBzdWJzZXQgb2Ygbm9kZV9vbmxpbmVfbWFwLCBldmVuIGlmIHRoaXMgbWVhbnMgZ29pbmcgb3V0c2lkZSB0aGUKKyAqIHRhc2tzIGNwdXNldC4KKyAqKi8KIAotdm9pZCBjcHVzZXRfdXBkYXRlX2N1cnJlbnRfbWVtc19hbGxvd2VkKHZvaWQpCitub2RlbWFza190IGNwdXNldF9tZW1zX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7Ci0Jc3RydWN0IGNwdXNldCAqY3M7Ci0JaW50IG5lZWRfdG9fcmVmcmVzaCA9IDA7CisJbm9kZW1hc2tfdCBtYXNrOwogCi0JdGFza19sb2NrKGN1cnJlbnQpOwotCWNzID0gY3VycmVudC0+Y3B1c2V0OwotCWlmICghY3MpCi0JCWdvdG8gZG9uZTsKLQlpZiAoY3VycmVudC0+Y3B1c2V0X21lbXNfZ2VuZXJhdGlvbiAhPSBjcy0+bWVtc19nZW5lcmF0aW9uKQotCQluZWVkX3RvX3JlZnJlc2ggPSAxOwotZG9uZToKLQl0YXNrX3VubG9jayhjdXJyZW50KTsKLQlpZiAobmVlZF90b19yZWZyZXNoKQotCQlyZWZyZXNoX21lbXMoKTsKLX0KKwlkb3duKCZjYWxsYmFja19zZW0pOworCXRhc2tfbG9jayh0c2spOworCWd1YXJhbnRlZV9vbmxpbmVfbWVtcyh0c2stPmNwdXNldCwgJm1hc2spOworCXRhc2tfdW5sb2NrKHRzayk7CisJdXAoJmNhbGxiYWNrX3NlbSk7CiAKLS8qKgotICogY3B1c2V0X3Jlc3RyaWN0X3RvX21lbXNfYWxsb3dlZCAtIGxpbWl0IG5vZGVzIHRvIGN1cnJlbnQgbWVtc19hbGxvd2VkCi0gKiBAbm9kZXM6IHBvaW50ZXIgdG8gYSBub2RlIGJpdG1hcCB0aGF0IGlzIGFuZC1lZCB3aXRoIG1lbXNfYWxsb3dlZAotICovCi12b2lkIGNwdXNldF9yZXN0cmljdF90b19tZW1zX2FsbG93ZWQodW5zaWduZWQgbG9uZyAqbm9kZXMpCi17Ci0JYml0bWFwX2FuZChub2Rlcywgbm9kZXMsIG5vZGVzX2FkZHIoY3VycmVudC0+bWVtc19hbGxvd2VkKSwKLQkJCQkJCQlNQVhfTlVNTk9ERVMpOworCXJldHVybiBtYXNrOwogfQogCiAvKioKQEAgLTE3OTUsNyArMjEyMCw3IEBACiAgKglHRlBfVVNFUiAgICAgLSBvbmx5IG5vZGVzIGluIGN1cnJlbnQgdGFza3MgbWVtcyBhbGxvd2VkIG9rLgogICoqLwogCi1pbnQgY3B1c2V0X3pvbmVfYWxsb3dlZChzdHJ1Y3Qgem9uZSAqeiwgZ2ZwX3QgZ2ZwX21hc2spCitpbnQgX19jcHVzZXRfem9uZV9hbGxvd2VkKHN0cnVjdCB6b25lICp6LCBnZnBfdCBnZnBfbWFzaykKIHsKIAlpbnQgbm9kZTsJCQkvKiBub2RlIHRoYXQgem9uZSB6IGlzIG9uICovCiAJY29uc3Qgc3RydWN0IGNwdXNldCAqY3M7CS8qIGN1cnJlbnQgY3B1c2V0IGFuY2VzdG9ycyAqLwpAQCAtMTgyNSw2ICsyMTUwLDMzIEBACiB9CiAKIC8qKgorICogY3B1c2V0X2xvY2sgLSBsb2NrIG91dCBhbnkgY2hhbmdlcyB0byBjcHVzZXQgc3RydWN0dXJlcworICoKKyAqIFRoZSBvdXQgb2YgbWVtb3J5IChvb20pIGNvZGUgbmVlZHMgdG8gbG9jayBkb3duIGNwdXNldHMKKyAqIGZyb20gYmVpbmcgY2hhbmdlZCB3aGlsZSBpdCBzY2FucyB0aGUgdGFza2xpc3QgbG9va2luZyBmb3IgYQorICogdGFzayBpbiBhbiBvdmVybGFwcGluZyBjcHVzZXQuICBFeHBvc2UgY2FsbGJhY2tfc2VtIHZpYSB0aGlzCisgKiBjcHVzZXRfbG9jaygpIHJvdXRpbmUsIHNvIHRoZSBvb20gY29kZSBjYW4gbG9jayBpdCwgYmVmb3JlCisgKiBsb2NraW5nIHRoZSB0YXNrIGxpc3QuICBUaGUgdGFza2xpc3RfbG9jayBpcyBhIHNwaW5sb2NrLCBzbworICogbXVzdCBiZSB0YWtlbiBpbnNpZGUgY2FsbGJhY2tfc2VtLgorICovCisKK3ZvaWQgY3B1c2V0X2xvY2sodm9pZCkKK3sKKwlkb3duKCZjYWxsYmFja19zZW0pOworfQorCisvKioKKyAqIGNwdXNldF91bmxvY2sgLSByZWxlYXNlIGxvY2sgb24gY3B1c2V0IGNoYW5nZXMKKyAqCisgKiBVbmRvIHRoZSBsb2NrIHRha2VuIGluIGEgcHJldmlvdXMgY3B1c2V0X2xvY2soKSBjYWxsLgorICovCisKK3ZvaWQgY3B1c2V0X3VubG9jayh2b2lkKQoreworCXVwKCZjYWxsYmFja19zZW0pOworfQorCisvKioKICAqIGNwdXNldF9leGNsX25vZGVzX292ZXJsYXAgLSBEbyB3ZSBvdmVybGFwIEBwJ3MgbWVtX2V4Y2x1c2l2ZSBhbmNlc3RvcnM/CiAgKiBAcDogcG9pbnRlciB0byB0YXNrX3N0cnVjdCBvZiBzb21lIG90aGVyIHRhc2suCiAgKgpAQCAtMTgzMyw3ICsyMTg1LDcgQEAKICAqIGRldGVybWluZSBpZiB0YXNrIEBwJ3MgbWVtb3J5IHVzYWdlIG1pZ2h0IGltcGFjdCB0aGUgbWVtb3J5CiAgKiBhdmFpbGFibGUgdG8gdGhlIGN1cnJlbnQgdGFzay4KICAqCi0gKiBBY3F1aXJlcyBjYWxsYmFja19zZW0gLSBub3Qgc3VpdGFibGUgZm9yIGNhbGxpbmcgZnJvbSBhIGZhc3QgcGF0aC4KKyAqIENhbGwgd2hpbGUgaG9sZGluZyBjYWxsYmFja19zZW0uCiAgKiovCiAKIGludCBjcHVzZXRfZXhjbF9ub2Rlc19vdmVybGFwKGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKQEAgLTE4NDEsOCArMjE5Myw2IEBACiAJY29uc3Qgc3RydWN0IGNwdXNldCAqY3MxLCAqY3MyOwkvKiBteSBhbmQgcCdzIGNwdXNldCBhbmNlc3RvcnMgKi8KIAlpbnQgb3ZlcmxhcCA9IDA7CQkvKiBkbyBjcHVzZXRzIG92ZXJsYXA/ICovCiAKLQlkb3duKCZjYWxsYmFja19zZW0pOwotCiAJdGFza19sb2NrKGN1cnJlbnQpOwogCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX0VYSVRJTkcpIHsKIAkJdGFza191bmxvY2soY3VycmVudCk7CkBAIC0xODYxLDEyICsyMjExLDQ2IEBACiAKIAlvdmVybGFwID0gbm9kZXNfaW50ZXJzZWN0cyhjczEtPm1lbXNfYWxsb3dlZCwgY3MyLT5tZW1zX2FsbG93ZWQpOwogZG9uZToKLQl1cCgmY2FsbGJhY2tfc2VtKTsKLQogCXJldHVybiBvdmVybGFwOwogfQogCiAvKgorICogQ29sbGVjdGlvbiBvZiBtZW1vcnlfcHJlc3N1cmUgaXMgc3VwcHJlc3NlZCB1bmxlc3MKKyAqIHRoaXMgZmxhZyBpcyBlbmFibGVkIGJ5IHdyaXRpbmcgIjEiIHRvIHRoZSBzcGVjaWFsCisgKiBjcHVzZXQgZmlsZSAnbWVtb3J5X3ByZXNzdXJlX2VuYWJsZWQnIGluIHRoZSByb290IGNwdXNldC4KKyAqLworCitpbnQgY3B1c2V0X21lbW9yeV9wcmVzc3VyZV9lbmFibGVkIF9fcmVhZF9tb3N0bHk7CisKKy8qKgorICogY3B1c2V0X21lbW9yeV9wcmVzc3VyZV9idW1wIC0ga2VlcCBzdGF0cyBvZiBwZXItY3B1c2V0IHJlY2xhaW1zLgorICoKKyAqIEtlZXAgYSBydW5uaW5nIGF2ZXJhZ2Ugb2YgdGhlIHJhdGUgb2Ygc3luY2hyb25vdXMgKGRpcmVjdCkKKyAqIHBhZ2UgcmVjbGFpbSBlZmZvcnRzIGluaXRpYXRlZCBieSB0YXNrcyBpbiBlYWNoIGNwdXNldC4KKyAqCisgKiBUaGlzIHJlcHJlc2VudHMgdGhlIHJhdGUgYXQgd2hpY2ggc29tZSB0YXNrIGluIHRoZSBjcHVzZXQKKyAqIHJhbiBsb3cgb24gbWVtb3J5IG9uIGFsbCBub2RlcyBpdCB3YXMgYWxsb3dlZCB0byB1c2UsIGFuZAorICogaGFkIHRvIGVudGVyIHRoZSBrZXJuZWxzIHBhZ2UgcmVjbGFpbSBjb2RlIGluIGFuIGVmZm9ydCB0bworICogY3JlYXRlIG1vcmUgZnJlZSBtZW1vcnkgYnkgdG9zc2luZyBjbGVhbiBwYWdlcyBvciBzd2FwcGluZworICogb3Igd3JpdGluZyBkaXJ0eSBwYWdlcy4KKyAqCisgKiBEaXNwbGF5IHRvIHVzZXIgc3BhY2UgaW4gdGhlIHBlci1jcHVzZXQgcmVhZC1vbmx5IGZpbGUKKyAqICJtZW1vcnlfcHJlc3N1cmUiLiAgVmFsdWUgZGlzcGxheWVkIGlzIGFuIGludGVnZXIKKyAqIHJlcHJlc2VudGluZyB0aGUgcmVjZW50IHJhdGUgb2YgZW50cnkgaW50byB0aGUgc3luY2hyb25vdXMKKyAqIChkaXJlY3QpIHBhZ2UgcmVjbGFpbSBieSBhbnkgdGFzayBhdHRhY2hlZCB0byB0aGUgY3B1c2V0LgorICoqLworCit2b2lkIF9fY3B1c2V0X21lbW9yeV9wcmVzc3VyZV9idW1wKHZvaWQpCit7CisJc3RydWN0IGNwdXNldCAqY3M7CisKKwl0YXNrX2xvY2soY3VycmVudCk7CisJY3MgPSBjdXJyZW50LT5jcHVzZXQ7CisJZm1ldGVyX21hcmtldmVudCgmY3MtPmZtZXRlcik7CisJdGFza191bmxvY2soY3VycmVudCk7Cit9CisKKy8qCiAgKiBwcm9jX2NwdXNldF9zaG93KCkKICAqICAtIFByaW50IHRhc2tzIGNwdXNldCBwYXRoIGludG8gc2VxX2ZpbGUuCiAgKiAgLSBVc2VkIGZvciAvcHJvYy88cGlkPi9jcHVzZXQuCmRpZmYgLS1naXQgYS9rZXJuZWwvY3Jhc2hfZHVtcC5jIGIva2VybmVsL2NyYXNoX2R1bXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM0YzM3Zi4uMDAwMDAwMAotLS0gYS9rZXJuZWwvY3Jhc2hfZHVtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqCWtlcm5lbC9jcmFzaF9kdW1wLmMgLSBNZW1vcnkgcHJlc2VydmluZyByZWJvb3QgcmVsYXRlZCBjb2RlLgotICoKLSAqCUNyZWF0ZWQgYnk6IEhhcmlwcmFzYWQgTmVsbGl0aGVlcnRoYSAoaGFyaUBpbi5pYm0uY29tKQotICoJQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMDQuIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L2NyYXNoX2R1bXAuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLS8qIFN0b3JlcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBlbGYgaGVhZGVyIG9mIGNyYXNoIGltYWdlLiAqLwotdW5zaWduZWQgbG9uZyBsb25nIGVsZmNvcmVoZHJfYWRkciA9IEVMRkNPUkVfQUREUl9NQVg7Ci0KLS8qKgotICogY29weV9vbGRtZW1fcGFnZSAtIGNvcHkgb25lIHBhZ2UgZnJvbSAib2xkbWVtIgotICogQHBmbjogcGFnZSBmcmFtZSBudW1iZXIgdG8gYmUgY29waWVkCi0gKiBAYnVmOiB0YXJnZXQgbWVtb3J5IGFkZHJlc3MgZm9yIHRoZSBjb3B5OyB0aGlzIGNhbiBiZSBpbiBrZXJuZWwgYWRkcmVzcwotICoJc3BhY2Ugb3IgdXNlciBhZGRyZXNzIHNwYWNlIChzZWUgQHVzZXJidWYpCi0gKiBAY3NpemU6IG51bWJlciBvZiBieXRlcyB0byBjb3B5Ci0gKiBAb2Zmc2V0OiBvZmZzZXQgaW4gYnl0ZXMgaW50byB0aGUgcGFnZSAoYmFzZWQgb24gcGZuKSB0byBiZWdpbiB0aGUgY29weQotICogQHVzZXJidWY6IGlmIHNldCwgQGJ1ZiBpcyBpbiB1c2VyIGFkZHJlc3Mgc3BhY2UsIHVzZSBjb3B5X3RvX3VzZXIoKSwKLSAqCW90aGVyd2lzZSBAYnVmIGlzIGluIGtlcm5lbCBhZGRyZXNzIHNwYWNlLCB1c2UgbWVtY3B5KCkuCi0gKgotICogQ29weSBhIHBhZ2UgZnJvbSAib2xkbWVtIi4gRm9yIHRoaXMgcGFnZSwgdGhlcmUgaXMgbm8gcHRlIG1hcHBlZAotICogaW4gdGhlIGN1cnJlbnQga2VybmVsLiBXZSBzdGl0Y2ggdXAgYSBwdGUsIHNpbWlsYXIgdG8ga21hcF9hdG9taWMuCi0gKi8KLXNzaXplX3QgY29weV9vbGRtZW1fcGFnZSh1bnNpZ25lZCBsb25nIHBmbiwgY2hhciAqYnVmLAotCQkJCXNpemVfdCBjc2l6ZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCB1c2VyYnVmKQotewotCXZvaWQgKnBhZ2UsICp2YWRkcjsKLQotCWlmICghY3NpemUpCi0JCXJldHVybiAwOwotCi0JcGFnZSA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBhZ2UpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JdmFkZHIgPSBrbWFwX2F0b21pY19wZm4ocGZuLCBLTV9QVEUwKTsKLQljb3B5X3BhZ2UocGFnZSwgdmFkZHIpOwotCWt1bm1hcF9hdG9taWModmFkZHIsIEtNX1BURTApOwotCi0JaWYgKHVzZXJidWYpIHsKLQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIChwYWdlICsgb2Zmc2V0KSwgY3NpemUpKSB7Ci0JCQlrZnJlZShwYWdlKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JfSBlbHNlIHsKLQkJbWVtY3B5KGJ1ZiwgKHBhZ2UgKyBvZmZzZXQpLCBjc2l6ZSk7Ci0JfQotCi0Ja2ZyZWUocGFnZSk7Ci0JcmV0dXJuIGNzaXplOwotfQpkaWZmIC0tZ2l0IGEva2VybmVsL2V4aXQuYyBiL2tlcm5lbC9leGl0LmMKaW5kZXggZWU1MTU2OC4uOTNjZWUzNiAxMDA2NDQKLS0tIGEva2VybmVsL2V4aXQuYworKysgYi9rZXJuZWwvZXhpdC5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CkBAIC0yOSw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9jbl9wcm9jLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgpAQCAtNzIsNyArNzQsNiBAQAogCQlfX3B0cmFjZV91bmxpbmsocCk7CiAJQlVHX09OKCFsaXN0X2VtcHR5KCZwLT5wdHJhY2VfbGlzdCkgfHwgIWxpc3RfZW1wdHkoJnAtPnB0cmFjZV9jaGlsZHJlbikpOwogCV9fZXhpdF9zaWduYWwocCk7Ci0JX19leGl0X3NpZ2hhbmQocCk7CiAJLyoKIAkgKiBOb3RlIHRoYXQgdGhlIGZhc3RwYXRoIGluIHN5c190aW1lcyBkZXBlbmRzIG9uIF9fZXhpdF9zaWduYWwgaGF2aW5nCiAJICogdXBkYXRlZCB0aGUgY291bnRlcnMgYmVmb3JlIGEgdGFzayBpcyByZW1vdmVkIGZyb20gdGhlIHRhc2tsaXN0IG9mCkBAIC0xOTIsNyArMTkzLDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBoYXNfc3RvcHBlZF9qb2JzKGludCBwZ3JwKQorc3RhdGljIGludCBoYXNfc3RvcHBlZF9qb2JzKGludCBwZ3JwKQogewogCWludCByZXR2YWwgPSAwOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKQEAgLTIyOSw3ICsyMzAsNyBAQAogICoKICAqIE5PVEUgdGhhdCByZXBhcmVudF90b19pbml0KCkgZ2l2ZXMgdGhlIGNhbGxlciBmdWxsIGNhcGFiaWxpdGllcy4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIHJlcGFyZW50X3RvX2luaXQodm9pZCkKK3N0YXRpYyB2b2lkIHJlcGFyZW50X3RvX2luaXQodm9pZCkKIHsKIAl3cml0ZV9sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CiAKQEAgLTI0Myw3ICsyNDQsOSBAQAogCS8qIFNldCB0aGUgZXhpdCBzaWduYWwgdG8gU0lHQ0hMRCBzbyB3ZSBzaWduYWwgaW5pdCBvbiBleGl0ICovCiAJY3VycmVudC0+ZXhpdF9zaWduYWwgPSBTSUdDSExEOwogCi0JaWYgKChjdXJyZW50LT5wb2xpY3kgPT0gU0NIRURfTk9STUFMKSAmJiAodGFza19uaWNlKGN1cnJlbnQpIDwgMCkpCisJaWYgKChjdXJyZW50LT5wb2xpY3kgPT0gU0NIRURfTk9STUFMIHx8CisJCQljdXJyZW50LT5wb2xpY3kgPT0gU0NIRURfQkFUQ0gpCisJCQkJJiYgKHRhc2tfbmljZShjdXJyZW50KSA8IDApKQogCQlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIDApOwogCS8qIGNwdXNfYWxsb3dlZD8gKi8KIAkvKiBydF9wcmlvcml0eT8gKi8KQEAgLTI1OCw3ICsyNjEsNyBAQAogCiB2b2lkIF9fc2V0X3NwZWNpYWxfcGlkcyhwaWRfdCBzZXNzaW9uLCBwaWRfdCBwZ3JwKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyciA9IGN1cnJlbnQ7CisJc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyID0gY3VycmVudC0+Z3JvdXBfbGVhZGVyOwogCiAJaWYgKGN1cnItPnNpZ25hbC0+c2Vzc2lvbiAhPSBzZXNzaW9uKSB7CiAJCWRldGFjaF9waWQoY3VyciwgUElEVFlQRV9TSUQpOwpAQCAtMzY2LDcgKzM2OSw3IEBACiAKIEVYUE9SVF9TWU1CT0woZGFlbW9uaXplKTsKIAotc3RhdGljIGlubGluZSB2b2lkIGNsb3NlX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcykKK3N0YXRpYyB2b2lkIGNsb3NlX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcykKIHsKIAlpbnQgaSwgajsKIAlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwpAQCAtNTQwLDcgKzU0Myw3IEBACiAJcC0+cmVhbF9wYXJlbnQgPSByZWFwZXI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByZXBhcmVudF90aHJlYWQodGFza190ICpwLCB0YXNrX3QgKmZhdGhlciwgaW50IHRyYWNlZCkKK3N0YXRpYyB2b2lkIHJlcGFyZW50X3RocmVhZCh0YXNrX3QgKnAsIHRhc2tfdCAqZmF0aGVyLCBpbnQgdHJhY2VkKQogewogCS8qIFdlIGRvbid0IHdhbnQgcGVvcGxlIHNsYXlpbmcgaW5pdC4gICovCiAJaWYgKHAtPmV4aXRfc2lnbmFsICE9IC0xKQpAQCAtNjA0LDcgKzYwNyw3IEBACiAgKiBncm91cCwgYW5kIGlmIG5vIHN1Y2ggbWVtYmVyIGV4aXN0cywgZ2l2ZSBpdCB0bwogICogdGhlIGdsb2JhbCBjaGlsZCByZWFwZXIgcHJvY2VzcyAoaWUgImluaXQiKQogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZm9yZ2V0X29yaWdpbmFsX3BhcmVudChzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBmYXRoZXIsCitzdGF0aWMgdm9pZCBmb3JnZXRfb3JpZ2luYWxfcGFyZW50KHN0cnVjdCB0YXNrX3N0cnVjdCAqIGZhdGhlciwKIAkJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICp0b19yZWxlYXNlKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgKnJlYXBlciA9IGZhdGhlcjsKQEAgLTg0Miw3ICs4NDUsNyBAQAogCX0KIAlncm91cF9kZWFkID0gYXRvbWljX2RlY19hbmRfdGVzdCgmdHNrLT5zaWduYWwtPmxpdmUpOwogCWlmIChncm91cF9kZWFkKSB7Ci0gCQlkZWxfdGltZXJfc3luYygmdHNrLT5zaWduYWwtPnJlYWxfdGltZXIpOworIAkJaHJ0aW1lcl9jYW5jZWwoJnRzay0+c2lnbmFsLT5yZWFsX3RpbWVyKTsKIAkJZXhpdF9pdGltZXJzKHRzay0+c2lnbmFsKTsKIAkJYWNjdF9wcm9jZXNzKGNvZGUpOwogCX0KQEAgLTg3MCw2ICs4NzMsMTAgQEAKIAltcG9sX2ZyZWUodHNrLT5tZW1wb2xpY3kpOwogCXRzay0+bWVtcG9saWN5ID0gTlVMTDsKICNlbmRpZgorCS8qCisJICogSWYgREVCVUdfTVVURVhFUyBpcyBvbiwgbWFrZSBzdXJlIHdlIGFyZSBob2xkaW5nIG5vIGxvY2tzOgorCSAqLworCW11dGV4X2RlYnVnX2NoZWNrX25vX2xvY2tzX2hlbGQodHNrKTsKIAogCS8qIFBGX0RFQUQgY2F1c2VzIGZpbmFsIHB1dF90YXNrX3N0cnVjdCBhZnRlciB3ZSBzY2hlZHVsZS4gKi8KIAlwcmVlbXB0X2Rpc2FibGUoKTsKQEAgLTkyNiw3ICs5MzMsNiBAQAogCQkJLyogQW5vdGhlciB0aHJlYWQgZ290IGhlcmUgYmVmb3JlIHdlIHRvb2sgdGhlIGxvY2suICAqLwogCQkJZXhpdF9jb2RlID0gc2lnLT5ncm91cF9leGl0X2NvZGU7CiAJCWVsc2UgewotCQkJc2lnLT5mbGFncyA9IFNJR05BTF9HUk9VUF9FWElUOwogCQkJc2lnLT5ncm91cF9leGl0X2NvZGUgPSBleGl0X2NvZGU7CiAJCQl6YXBfb3RoZXJfdGhyZWFkcyhjdXJyZW50KTsKIAkJfQpAQCAtMTA2OCw2ICsxMDc0LDkgQEAKIAl9CiAKIAlpZiAobGlrZWx5KHAtPnJlYWxfcGFyZW50ID09IHAtPnBhcmVudCkgJiYgbGlrZWx5KHAtPnNpZ25hbCkpIHsKKwkJc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnBzaWc7CisJCXN0cnVjdCBzaWduYWxfc3RydWN0ICpzaWc7CisKIAkJLyoKIAkJICogVGhlIHJlc291cmNlIGNvdW50ZXJzIGZvciB0aGUgZ3JvdXAgbGVhZGVyIGFyZSBpbiBpdHMKIAkJICogb3duIHRhc2tfc3RydWN0LiAgVGhvc2UgZm9yIGRlYWQgdGhyZWFkcyBpbiB0aGUgZ3JvdXAKQEAgLTEwODQsMjQgKzEwOTMsMjYgQEAKIAkJICogaGVyZSByZWFwaW5nIG90aGVyIGNoaWxkcmVuIGF0IHRoZSBzYW1lIHRpbWUuCiAJCSAqLwogCQlzcGluX2xvY2tfaXJxKCZwLT5wYXJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCQlwLT5wYXJlbnQtPnNpZ25hbC0+Y3V0aW1lID0KLQkJCWNwdXRpbWVfYWRkKHAtPnBhcmVudC0+c2lnbmFsLT5jdXRpbWUsCisJCXBzaWcgPSBwLT5wYXJlbnQtPnNpZ25hbDsKKwkJc2lnID0gcC0+c2lnbmFsOworCQlwc2lnLT5jdXRpbWUgPQorCQkJY3B1dGltZV9hZGQocHNpZy0+Y3V0aW1lLAogCQkJY3B1dGltZV9hZGQocC0+dXRpbWUsCi0JCQljcHV0aW1lX2FkZChwLT5zaWduYWwtPnV0aW1lLAotCQkJCSAgICBwLT5zaWduYWwtPmN1dGltZSkpKTsKLQkJcC0+cGFyZW50LT5zaWduYWwtPmNzdGltZSA9Ci0JCQljcHV0aW1lX2FkZChwLT5wYXJlbnQtPnNpZ25hbC0+Y3N0aW1lLAorCQkJY3B1dGltZV9hZGQoc2lnLT51dGltZSwKKwkJCQkgICAgc2lnLT5jdXRpbWUpKSk7CisJCXBzaWctPmNzdGltZSA9CisJCQljcHV0aW1lX2FkZChwc2lnLT5jc3RpbWUsCiAJCQljcHV0aW1lX2FkZChwLT5zdGltZSwKLQkJCWNwdXRpbWVfYWRkKHAtPnNpZ25hbC0+c3RpbWUsCi0JCQkJICAgIHAtPnNpZ25hbC0+Y3N0aW1lKSkpOwotCQlwLT5wYXJlbnQtPnNpZ25hbC0+Y21pbl9mbHQgKz0KLQkJCXAtPm1pbl9mbHQgKyBwLT5zaWduYWwtPm1pbl9mbHQgKyBwLT5zaWduYWwtPmNtaW5fZmx0OwotCQlwLT5wYXJlbnQtPnNpZ25hbC0+Y21hal9mbHQgKz0KLQkJCXAtPm1hal9mbHQgKyBwLT5zaWduYWwtPm1hal9mbHQgKyBwLT5zaWduYWwtPmNtYWpfZmx0OwotCQlwLT5wYXJlbnQtPnNpZ25hbC0+Y252Y3N3ICs9Ci0JCQlwLT5udmNzdyArIHAtPnNpZ25hbC0+bnZjc3cgKyBwLT5zaWduYWwtPmNudmNzdzsKLQkJcC0+cGFyZW50LT5zaWduYWwtPmNuaXZjc3cgKz0KLQkJCXAtPm5pdmNzdyArIHAtPnNpZ25hbC0+bml2Y3N3ICsgcC0+c2lnbmFsLT5jbml2Y3N3OworCQkJY3B1dGltZV9hZGQoc2lnLT5zdGltZSwKKwkJCQkgICAgc2lnLT5jc3RpbWUpKSk7CisJCXBzaWctPmNtaW5fZmx0ICs9CisJCQlwLT5taW5fZmx0ICsgc2lnLT5taW5fZmx0ICsgc2lnLT5jbWluX2ZsdDsKKwkJcHNpZy0+Y21hal9mbHQgKz0KKwkJCXAtPm1hal9mbHQgKyBzaWctPm1hal9mbHQgKyBzaWctPmNtYWpfZmx0OworCQlwc2lnLT5jbnZjc3cgKz0KKwkJCXAtPm52Y3N3ICsgc2lnLT5udmNzdyArIHNpZy0+Y252Y3N3OworCQlwc2lnLT5jbml2Y3N3ICs9CisJCQlwLT5uaXZjc3cgKyBzaWctPm5pdmNzdyArIHNpZy0+Y25pdmNzdzsKIAkJc3Bpbl91bmxvY2tfaXJxKCZwLT5wYXJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogCX0KIApkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggZmI4NTcyYS4uNGFlOGNmYyAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvYmluZm10cy5oPgogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVzZXQuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgpAQCAtNzQzLDYgKzc0NCwxNCBAQAogCiBFWFBPUlRfU1lNQk9MKHVuc2hhcmVfZmlsZXMpOwogCit2b2lkIHNpZ2hhbmRfZnJlZV9jYihzdHJ1Y3QgcmN1X2hlYWQgKnJocCkKK3sKKwlzdHJ1Y3Qgc2lnaGFuZF9zdHJ1Y3QgKnNwOworCisJc3AgPSBjb250YWluZXJfb2YocmhwLCBzdHJ1Y3Qgc2lnaGFuZF9zdHJ1Y3QsIHJjdSk7CisJa21lbV9jYWNoZV9mcmVlKHNpZ2hhbmRfY2FjaGVwLCBzcCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGNvcHlfc2lnaGFuZCh1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKiB0c2spCiB7CiAJc3RydWN0IHNpZ2hhbmRfc3RydWN0ICpzaWc7CkBAIC03NTIsNyArNzYxLDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCXNpZyA9IGttZW1fY2FjaGVfYWxsb2Moc2lnaGFuZF9jYWNoZXAsIEdGUF9LRVJORUwpOwotCXRzay0+c2lnaGFuZCA9IHNpZzsKKwlyY3VfYXNzaWduX3BvaW50ZXIodHNrLT5zaWdoYW5kLCBzaWcpOwogCWlmICghc2lnKQogCQlyZXR1cm4gLUVOT01FTTsKIAlzcGluX2xvY2tfaW5pdCgmc2lnLT5zaWdsb2NrKTsKQEAgLTc5MywxOSArODAyLDE2IEBACiAJaW5pdF9zaWdwZW5kaW5nKCZzaWctPnNoYXJlZF9wZW5kaW5nKTsKIAlJTklUX0xJU1RfSEVBRCgmc2lnLT5wb3NpeF90aW1lcnMpOwogCi0Jc2lnLT5pdF9yZWFsX3ZhbHVlID0gc2lnLT5pdF9yZWFsX2luY3IgPSAwOworCWhydGltZXJfaW5pdCgmc2lnLT5yZWFsX3RpbWVyLCBDTE9DS19NT05PVE9OSUMpOworCXNpZy0+aXRfcmVhbF9pbmNyLnR2NjQgPSAwOwogCXNpZy0+cmVhbF90aW1lci5mdW5jdGlvbiA9IGl0X3JlYWxfZm47Ci0Jc2lnLT5yZWFsX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgdHNrOwotCWluaXRfdGltZXIoJnNpZy0+cmVhbF90aW1lcik7CisJc2lnLT5yZWFsX3RpbWVyLmRhdGEgPSB0c2s7CiAKIAlzaWctPml0X3ZpcnRfZXhwaXJlcyA9IGNwdXRpbWVfemVybzsKIAlzaWctPml0X3ZpcnRfaW5jciA9IGNwdXRpbWVfemVybzsKIAlzaWctPml0X3Byb2ZfZXhwaXJlcyA9IGNwdXRpbWVfemVybzsKIAlzaWctPml0X3Byb2ZfaW5jciA9IGNwdXRpbWVfemVybzsKIAotCXNpZy0+dHR5ID0gY3VycmVudC0+c2lnbmFsLT50dHk7Ci0Jc2lnLT5wZ3JwID0gcHJvY2Vzc19ncm91cChjdXJyZW50KTsKLQlzaWctPnNlc3Npb24gPSBjdXJyZW50LT5zaWduYWwtPnNlc3Npb247CiAJc2lnLT5sZWFkZXIgPSAwOwkvKiBzZXNzaW9uIGxlYWRlcnNoaXAgZG9lc24ndCBpbmhlcml0ICovCiAJc2lnLT50dHlfb2xkX3BncnAgPSAwOwogCkBAIC05NjQsMTUgKzk3MCwyMCBAQAogCXAtPmlvX2NvbnRleHQgPSBOVUxMOwogCXAtPmlvX3dhaXQgPSBOVUxMOwogCXAtPmF1ZGl0X2NvbnRleHQgPSBOVUxMOworCWNwdXNldF9mb3JrKHApOwogI2lmZGVmIENPTkZJR19OVU1BCiAgCXAtPm1lbXBvbGljeSA9IG1wb2xfY29weShwLT5tZW1wb2xpY3kpOwogIAlpZiAoSVNfRVJSKHAtPm1lbXBvbGljeSkpIHsKICAJCXJldHZhbCA9IFBUUl9FUlIocC0+bWVtcG9saWN5KTsKICAJCXAtPm1lbXBvbGljeSA9IE5VTEw7Ci0gCQlnb3RvIGJhZF9mb3JrX2NsZWFudXA7CisgCQlnb3RvIGJhZF9mb3JrX2NsZWFudXBfY3B1c2V0OwogIAl9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19ERUJVR19NVVRFWEVTCisJcC0+YmxvY2tlZF9vbiA9IE5VTEw7IC8qIG5vdCBibG9ja2VkIHlldCAqLworI2VuZGlmCisKIAlwLT50Z2lkID0gcC0+cGlkOwogCWlmIChjbG9uZV9mbGFncyAmIENMT05FX1RIUkVBRCkKIAkJcC0+dGdpZCA9IGN1cnJlbnQtPnRnaWQ7CkBAIC0xMTI3LDI1ICsxMTM4LDE5IEBACiAJYXR0YWNoX3BpZChwLCBQSURUWVBFX1BJRCwgcC0+cGlkKTsKIAlhdHRhY2hfcGlkKHAsIFBJRFRZUEVfVEdJRCwgcC0+dGdpZCk7CiAJaWYgKHRocmVhZF9ncm91cF9sZWFkZXIocCkpIHsKKwkJcC0+c2lnbmFsLT50dHkgPSBjdXJyZW50LT5zaWduYWwtPnR0eTsKKwkJcC0+c2lnbmFsLT5wZ3JwID0gcHJvY2Vzc19ncm91cChjdXJyZW50KTsKKwkJcC0+c2lnbmFsLT5zZXNzaW9uID0gY3VycmVudC0+c2lnbmFsLT5zZXNzaW9uOwogCQlhdHRhY2hfcGlkKHAsIFBJRFRZUEVfUEdJRCwgcHJvY2Vzc19ncm91cChwKSk7CiAJCWF0dGFjaF9waWQocCwgUElEVFlQRV9TSUQsIHAtPnNpZ25hbC0+c2Vzc2lvbik7CiAJCWlmIChwLT5waWQpCiAJCQlfX2dldF9jcHVfdmFyKHByb2Nlc3NfY291bnRzKSsrOwogCX0KIAotCWlmICghY3VycmVudC0+c2lnbmFsLT50dHkgJiYgcC0+c2lnbmFsLT50dHkpCi0JCXAtPnNpZ25hbC0+dHR5ID0gTlVMTDsKLQogCW5yX3RocmVhZHMrKzsKIAl0b3RhbF9mb3JrcysrOwogCXdyaXRlX3VubG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwogCXByb2NfZm9ya19jb25uZWN0b3IocCk7Ci0JY3B1c2V0X2ZvcmsocCk7Ci0JcmV0dmFsID0gMDsKLQotZm9ya19vdXQ6Ci0JaWYgKHJldHZhbCkKLQkJcmV0dXJuIEVSUl9QVFIocmV0dmFsKTsKIAlyZXR1cm4gcDsKIAogYmFkX2ZvcmtfY2xlYW51cF9uYW1lc3BhY2U6CkBAIC0xMTcyLDcgKzExNzcsOSBAQAogYmFkX2ZvcmtfY2xlYW51cF9wb2xpY3k6CiAjaWZkZWYgQ09ORklHX05VTUEKIAltcG9sX2ZyZWUocC0+bWVtcG9saWN5KTsKK2JhZF9mb3JrX2NsZWFudXBfY3B1c2V0OgogI2VuZGlmCisJY3B1c2V0X2V4aXQocCk7CiBiYWRfZm9ya19jbGVhbnVwOgogCWlmIChwLT5iaW5mbXQpCiAJCW1vZHVsZV9wdXQocC0+YmluZm10LT5tb2R1bGUpOwpAQCAtMTE4NCw3ICsxMTkxLDggQEAKIAlmcmVlX3VpZChwLT51c2VyKTsKIGJhZF9mb3JrX2ZyZWU6CiAJZnJlZV90YXNrKHApOwotCWdvdG8gZm9ya19vdXQ7Citmb3JrX291dDoKKwlyZXR1cm4gRVJSX1BUUihyZXR2YWwpOwogfQogCiBzdHJ1Y3QgcHRfcmVncyAqIF9fZGV2aW5pdCBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgaWRsZV9yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtMTI5MCw2ICsxMjk4LDEwIEBACiAJcmV0dXJuIHBpZDsKIH0KIAorI2lmbmRlZiBBUkNIX01JTl9NTVNUUlVDVF9BTElHTgorI2RlZmluZSBBUkNIX01JTl9NTVNUUlVDVF9BTElHTiAwCisjZW5kaWYKKwogdm9pZCBfX2luaXQgcHJvY19jYWNoZXNfaW5pdCh2b2lkKQogewogCXNpZ2hhbmRfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoInNpZ2hhbmRfY2FjaGUiLApAQCAtMTMwOCw2ICsxMzIwLDYgQEAKIAkJCXNpemVvZihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QpLCAwLAogCQkJU0xBQl9QQU5JQywgTlVMTCwgTlVMTCk7CiAJbW1fY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoIm1tX3N0cnVjdCIsCi0JCQlzaXplb2Yoc3RydWN0IG1tX3N0cnVjdCksIDAsCisJCQlzaXplb2Yoc3RydWN0IG1tX3N0cnVjdCksIEFSQ0hfTUlOX01NU1RSVUNUX0FMSUdOLAogCQkJU0xBQl9IV0NBQ0hFX0FMSUdOfFNMQUJfUEFOSUMsIE5VTEwsIE5VTEwpOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2hydGltZXIuYyBiL2tlcm5lbC9ocnRpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjNDE1NQotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9ocnRpbWVyLmMKQEAgLTAsMCArMSw4MjYgQEAKKy8qCisgKiAgbGludXgva2VybmVsL2hydGltZXIuYworICoKKyAqICBDb3B5cmlnaHQoQykgMjAwNSwgVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CisgKiAgQ29weXJpZ2h0KEMpIDIwMDUsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKgorICogIEhpZ2gtcmVzb2x1dGlvbiBrZXJuZWwgdGltZXJzCisgKgorICogIEluIGNvbnRyYXN0IHRvIHRoZSBsb3ctcmVzb2x1dGlvbiB0aW1lb3V0IEFQSSBpbXBsZW1lbnRlZCBpbgorICogIGtlcm5lbC90aW1lci5jLCBocnRpbWVycyBwcm92aWRlIGZpbmVyIHJlc29sdXRpb24gYW5kIGFjY3VyYWN5CisgKiAgZGVwZW5kaW5nIG9uIHN5c3RlbSBjb25maWd1cmF0aW9uIGFuZCBjYXBhYmlsaXRpZXMuCisgKgorICogIFRoZXNlIHRpbWVycyBhcmUgY3VycmVudGx5IHVzZWQgZm9yOgorICogICAtIGl0aW1lcnMKKyAqICAgLSBQT1NJWCB0aW1lcnMKKyAqICAgLSBuYW5vc2xlZXAKKyAqICAgLSBwcmVjaXNlIGluLWtlcm5lbCB0aW1pbmcKKyAqCisgKiAgU3RhcnRlZCBieTogVGhvbWFzIEdsZWl4bmVyIGFuZCBJbmdvIE1vbG5hcgorICoKKyAqICBDcmVkaXRzOgorICoJYmFzZWQgb24ga2VybmVsL3RpbWVyLmMKKyAqCisgKiAgRm9yIGxpY2VuY2luZyBkZXRhaWxzIHNlZSBrZXJuZWwtYmFzZS9DT1BZSU5HCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKioKKyAqIGt0aW1lX2dldCAtIGdldCB0aGUgbW9ub3RvbmljIHRpbWUgaW4ga3RpbWVfdCBmb3JtYXQKKyAqCisgKiByZXR1cm5zIHRoZSB0aW1lIGluIGt0aW1lX3QgZm9ybWF0CisgKi8KK3N0YXRpYyBrdGltZV90IGt0aW1lX2dldCh2b2lkKQoreworCXN0cnVjdCB0aW1lc3BlYyBub3c7CisKKwlrdGltZV9nZXRfdHMoJm5vdyk7CisKKwlyZXR1cm4gdGltZXNwZWNfdG9fa3RpbWUobm93KTsKK30KKworLyoqCisgKiBrdGltZV9nZXRfcmVhbCAtIGdldCB0aGUgcmVhbCAod2FsbC0pIHRpbWUgaW4ga3RpbWVfdCBmb3JtYXQKKyAqCisgKiByZXR1cm5zIHRoZSB0aW1lIGluIGt0aW1lX3QgZm9ybWF0CisgKi8KK3N0YXRpYyBrdGltZV90IGt0aW1lX2dldF9yZWFsKHZvaWQpCit7CisJc3RydWN0IHRpbWVzcGVjIG5vdzsKKworCWdldG5zdGltZW9mZGF5KCZub3cpOworCisJcmV0dXJuIHRpbWVzcGVjX3RvX2t0aW1lKG5vdyk7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGt0aW1lX2dldF9yZWFsKTsKKworLyoKKyAqIFRoZSB0aW1lciBiYXNlczoKKyAqLworCisjZGVmaW5lIE1BWF9IUlRJTUVSX0JBU0VTIDIKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBocnRpbWVyX2Jhc2UsIGhydGltZXJfYmFzZXNbTUFYX0hSVElNRVJfQkFTRVNdKSA9Cit7CisJeworCQkuaW5kZXggPSBDTE9DS19SRUFMVElNRSwKKwkJLmdldF90aW1lID0gJmt0aW1lX2dldF9yZWFsLAorCQkucmVzb2x1dGlvbiA9IEtUSU1FX1JFQUxUSU1FX1JFUywKKwl9LAorCXsKKwkJLmluZGV4ID0gQ0xPQ0tfTU9OT1RPTklDLAorCQkuZ2V0X3RpbWUgPSAma3RpbWVfZ2V0LAorCQkucmVzb2x1dGlvbiA9IEtUSU1FX01PTk9UT05JQ19SRVMsCisJfSwKK307CisKKy8qKgorICoga3RpbWVfZ2V0X3RzIC0gZ2V0IHRoZSBtb25vdG9uaWMgY2xvY2sgaW4gdGltZXNwZWMgZm9ybWF0CisgKgorICogQHRzOgkJcG9pbnRlciB0byB0aW1lc3BlYyB2YXJpYWJsZQorICoKKyAqIFRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBtb25vdG9uaWMgY2xvY2sgZnJvbSB0aGUgcmVhbHRpbWUKKyAqIGNsb2NrIGFuZCB0aGUgd2FsbF90b19tb25vdG9uaWMgb2Zmc2V0IGFuZCBzdG9yZXMgdGhlIHJlc3VsdAorICogaW4gbm9ybWFsaXplZCB0aW1lc3BlYyBmb3JtYXQgaW4gdGhlIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkgdHMuCisgKi8KK3ZvaWQga3RpbWVfZ2V0X3RzKHN0cnVjdCB0aW1lc3BlYyAqdHMpCit7CisJc3RydWN0IHRpbWVzcGVjIHRvbW9ubzsKKwl1bnNpZ25lZCBsb25nIHNlcTsKKworCWRvIHsKKwkJc2VxID0gcmVhZF9zZXFiZWdpbigmeHRpbWVfbG9jayk7CisJCWdldG5zdGltZW9mZGF5KHRzKTsKKwkJdG9tb25vID0gd2FsbF90b19tb25vdG9uaWM7CisKKwl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZ4dGltZV9sb2NrLCBzZXEpKTsKKworCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKHRzLCB0cy0+dHZfc2VjICsgdG9tb25vLnR2X3NlYywKKwkJCQl0cy0+dHZfbnNlYyArIHRvbW9uby50dl9uc2VjKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGt0aW1lX2dldF90cyk7CisKKy8qCisgKiBGdW5jdGlvbnMgYW5kIG1hY3JvcyB3aGljaCBhcmUgZGlmZmVyZW50IGZvciBVUC9TTVAgc3lzdGVtcyBhcmUga2VwdCBpbiBhCisgKiBzaW5nbGUgcGxhY2UKKyAqLworI2lmZGVmIENPTkZJR19TTVAKKworI2RlZmluZSBzZXRfY3Vycl90aW1lcihiLCB0KQkJZG8geyAoYiktPmN1cnJfdGltZXIgPSAodCk7IH0gd2hpbGUgKDApCisKKy8qCisgKiBXZSBhcmUgdXNpbmcgaGFzaGVkIGxvY2tpbmc6IGhvbGRpbmcgcGVyX2NwdShocnRpbWVyX2Jhc2VzKVtuXS5sb2NrCisgKiBtZWFucyB0aGF0IGFsbCB0aW1lcnMgd2hpY2ggYXJlIHRpZWQgdG8gdGhpcyBiYXNlIHZpYSB0aW1lci0+YmFzZSBhcmUKKyAqIGxvY2tlZCwgYW5kIHRoZSBiYXNlIGl0c2VsZiBpcyBsb2NrZWQgdG9vLgorICoKKyAqIFNvIF9fcnVuX3RpbWVycy9taWdyYXRlX3RpbWVycyBjYW4gc2FmZWx5IG1vZGlmeSBhbGwgdGltZXJzIHdoaWNoIGNvdWxkCisgKiBiZSBmb3VuZCBvbiB0aGUgbGlzdHMvcXVldWVzLgorICoKKyAqIFdoZW4gdGhlIHRpbWVyJ3MgYmFzZSBpcyBsb2NrZWQsIGFuZCB0aGUgdGltZXIgcmVtb3ZlZCBmcm9tIGxpc3QsIGl0IGlzCisgKiBwb3NzaWJsZSB0byBzZXQgdGltZXItPmJhc2UgPSBOVUxMIGFuZCBkcm9wIHRoZSBsb2NrOiB0aGUgdGltZXIgcmVtYWlucworICogbG9ja2VkLgorICovCitzdGF0aWMgc3RydWN0IGhydGltZXJfYmFzZSAqbG9ja19ocnRpbWVyX2Jhc2UoY29uc3Qgc3RydWN0IGhydGltZXIgKnRpbWVyLAorCQkJCQkgICAgICB1bnNpZ25lZCBsb25nICpmbGFncykKK3sKKwlzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpiYXNlOworCisJZm9yICg7OykgeworCQliYXNlID0gdGltZXItPmJhc2U7CisJCWlmIChsaWtlbHkoYmFzZSAhPSBOVUxMKSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJhc2UtPmxvY2ssICpmbGFncyk7CisJCQlpZiAobGlrZWx5KGJhc2UgPT0gdGltZXItPmJhc2UpKQorCQkJCXJldHVybiBiYXNlOworCQkJLyogVGhlIHRpbWVyIGhhcyBtaWdyYXRlZCB0byBhbm90aGVyIENQVTogKi8KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhc2UtPmxvY2ssICpmbGFncyk7CisJCX0KKwkJY3B1X3JlbGF4KCk7CisJfQorfQorCisvKgorICogU3dpdGNoIHRoZSB0aW1lciBiYXNlIHRvIHRoZSBjdXJyZW50IENQVSB3aGVuIHBvc3NpYmxlLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBocnRpbWVyX2Jhc2UgKgorc3dpdGNoX2hydGltZXJfYmFzZShzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsIHN0cnVjdCBocnRpbWVyX2Jhc2UgKmJhc2UpCit7CisJc3RydWN0IGhydGltZXJfYmFzZSAqbmV3X2Jhc2U7CisKKwluZXdfYmFzZSA9ICZfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXNbYmFzZS0+aW5kZXhdKTsKKworCWlmIChiYXNlICE9IG5ld19iYXNlKSB7CisJCS8qCisJCSAqIFdlIGFyZSB0cnlpbmcgdG8gc2NoZWR1bGUgdGhlIHRpbWVyIG9uIHRoZSBsb2NhbCBDUFUuCisJCSAqIEhvd2V2ZXIgd2UgY2FuJ3QgY2hhbmdlIHRpbWVyJ3MgYmFzZSB3aGlsZSBpdCBpcyBydW5uaW5nLAorCQkgKiBzbyB3ZSBrZWVwIGl0IG9uIHRoZSBzYW1lIENQVS4gTm8gaGFzc2xlIHZzLiByZXByb2dyYW1taW5nCisJCSAqIHRoZSBldmVudCBzb3VyY2UgaW4gdGhlIGhpZ2ggcmVzb2x1dGlvbiBjYXNlLiBUaGUgc29mdGlycQorCQkgKiBjb2RlIHdpbGwgdGFrZSBjYXJlIG9mIHRoaXMgd2hlbiB0aGUgdGltZXIgZnVuY3Rpb24gaGFzCisJCSAqIGNvbXBsZXRlZC4gVGhlcmUgaXMgbm8gY29uZmxpY3QgYXMgd2UgaG9sZCB0aGUgbG9jayB1bnRpbAorCQkgKiB0aGUgdGltZXIgaXMgZW5xdWV1ZWQuCisJCSAqLworCQlpZiAodW5saWtlbHkoYmFzZS0+Y3Vycl90aW1lciA9PSB0aW1lcikpCisJCQlyZXR1cm4gYmFzZTsKKworCQkvKiBTZWUgdGhlIGNvbW1lbnQgaW4gbG9ja190aW1lcl9iYXNlKCkgKi8KKwkJdGltZXItPmJhc2UgPSBOVUxMOworCQlzcGluX3VubG9jaygmYmFzZS0+bG9jayk7CisJCXNwaW5fbG9jaygmbmV3X2Jhc2UtPmxvY2spOworCQl0aW1lci0+YmFzZSA9IG5ld19iYXNlOworCX0KKwlyZXR1cm4gbmV3X2Jhc2U7Cit9CisKKyNlbHNlIC8qIENPTkZJR19TTVAgKi8KKworI2RlZmluZSBzZXRfY3Vycl90aW1lcihiLCB0KQkJZG8geyB9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBocnRpbWVyX2Jhc2UgKgorbG9ja19ocnRpbWVyX2Jhc2UoY29uc3Qgc3RydWN0IGhydGltZXIgKnRpbWVyLCB1bnNpZ25lZCBsb25nICpmbGFncykKK3sKKwlzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpiYXNlID0gdGltZXItPmJhc2U7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmFzZS0+bG9jaywgKmZsYWdzKTsKKworCXJldHVybiBiYXNlOworfQorCisjZGVmaW5lIHN3aXRjaF9ocnRpbWVyX2Jhc2UodCwgYikJKGIpCisKKyNlbmRpZgkvKiAhQ09ORklHX1NNUCAqLworCisvKgorICogRnVuY3Rpb25zIGZvciB0aGUgdW5pb24gdHlwZSBzdG9yYWdlIGZvcm1hdCBvZiBrdGltZV90IHdoaWNoIGFyZQorICogdG9vIGxhcmdlIGZvciBpbmxpbmluZzoKKyAqLworI2lmIEJJVFNfUEVSX0xPTkcgPCA2NAorIyBpZm5kZWYgQ09ORklHX0tUSU1FX1NDQUxBUgorLyoqCisgKiBrdGltZV9hZGRfbnMgLSBBZGQgYSBzY2FsYXIgbmFub3NlY29uZHMgdmFsdWUgdG8gYSBrdGltZV90IHZhcmlhYmxlCisgKgorICogQGt0OgkJYWRkZW5kCisgKiBAbnNlYzoJdGhlIHNjYWxhciBuc2VjIHZhbHVlIHRvIGFkZAorICoKKyAqIFJldHVybnMgdGhlIHN1bSBvZiBrdCBhbmQgbnNlYyBpbiBrdGltZV90IGZvcm1hdAorICovCitrdGltZV90IGt0aW1lX2FkZF9ucyhjb25zdCBrdGltZV90IGt0LCB1NjQgbnNlYykKK3sKKwlrdGltZV90IHRtcDsKKworCWlmIChsaWtlbHkobnNlYyA8IE5TRUNfUEVSX1NFQykpIHsKKwkJdG1wLnR2NjQgPSBuc2VjOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgcmVtID0gZG9fZGl2KG5zZWMsIE5TRUNfUEVSX1NFQyk7CisKKwkJdG1wID0ga3RpbWVfc2V0KChsb25nKW5zZWMsIHJlbSk7CisJfQorCisJcmV0dXJuIGt0aW1lX2FkZChrdCwgdG1wKTsKK30KKworI2Vsc2UgLyogQ09ORklHX0tUSU1FX1NDQUxBUiAqLworCisjIGVuZGlmIC8qICFDT05GSUdfS1RJTUVfU0NBTEFSICovCisKKy8qCisgKiBEaXZpZGUgYSBrdGltZSB2YWx1ZSBieSBhIG5hbm9zZWNvbmQgdmFsdWUKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcga3RpbWVfZGl2bnMoY29uc3Qga3RpbWVfdCBrdCwgbnNlY190IGRpdikKK3sKKwl1NjQgZGNsYywgaW5jLCBkbnM7CisJaW50IHNmdCA9IDA7CisKKwlkY2xjID0gZG5zID0ga3RpbWVfdG9fbnMoa3QpOworCWluYyA9IGRpdjsKKwkvKiBNYWtlIHN1cmUgdGhlIGRpdmlzb3IgaXMgbGVzcyB0aGFuIDJeMzI6ICovCisJd2hpbGUgKGRpdiA+PiAzMikgeworCQlzZnQrKzsKKwkJZGl2ID4+PSAxOworCX0KKwlkY2xjID4+PSBzZnQ7CisJZG9fZGl2KGRjbGMsICh1bnNpZ25lZCBsb25nKSBkaXYpOworCisJcmV0dXJuICh1bnNpZ25lZCBsb25nKSBkY2xjOworfQorCisjZWxzZSAvKiBCSVRTX1BFUl9MT05HIDwgNjQgKi8KKyMgZGVmaW5lIGt0aW1lX2Rpdm5zKGt0LCBkaXYpCQkodW5zaWduZWQgbG9uZykoKGt0KS50djY0IC8gKGRpdikpCisjZW5kaWYgLyogQklUU19QRVJfTE9ORyA+PSA2NCAqLworCisvKgorICogQ291bnRlcnBhcnQgdG8gbG9ja190aW1lcl9iYXNlIGFib3ZlOgorICovCitzdGF0aWMgaW5saW5lCit2b2lkIHVubG9ja19ocnRpbWVyX2Jhc2UoY29uc3Qgc3RydWN0IGhydGltZXIgKnRpbWVyLCB1bnNpZ25lZCBsb25nICpmbGFncykKK3sKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aW1lci0+YmFzZS0+bG9jaywgKmZsYWdzKTsKK30KKworLyoqCisgKiBocnRpbWVyX2ZvcndhcmQgLSBmb3J3YXJkIHRoZSB0aW1lciBleHBpcnkKKyAqCisgKiBAdGltZXI6CWhydGltZXIgdG8gZm9yd2FyZAorICogQGludGVydmFsOgl0aGUgaW50ZXJ2YWwgdG8gZm9yd2FyZAorICoKKyAqIEZvcndhcmQgdGhlIHRpbWVyIGV4cGlyeSBzbyBpdCB3aWxsIGV4cGlyZSBpbiB0aGUgZnV0dXJlLgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG92ZXJydW5zLgorICovCit1bnNpZ25lZCBsb25nCitocnRpbWVyX2ZvcndhcmQoc3RydWN0IGhydGltZXIgKnRpbWVyLCBrdGltZV90IGludGVydmFsKQoreworCXVuc2lnbmVkIGxvbmcgb3J1biA9IDE7CisJa3RpbWVfdCBkZWx0YSwgbm93OworCisJbm93ID0gdGltZXItPmJhc2UtPmdldF90aW1lKCk7CisKKwlkZWx0YSA9IGt0aW1lX3N1Yihub3csIHRpbWVyLT5leHBpcmVzKTsKKworCWlmIChkZWx0YS50djY0IDwgMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaW50ZXJ2YWwudHY2NCA8IHRpbWVyLT5iYXNlLT5yZXNvbHV0aW9uLnR2NjQpCisJCWludGVydmFsLnR2NjQgPSB0aW1lci0+YmFzZS0+cmVzb2x1dGlvbi50djY0OworCisJaWYgKHVubGlrZWx5KGRlbHRhLnR2NjQgPj0gaW50ZXJ2YWwudHY2NCkpIHsKKwkJbnNlY190IGluY3IgPSBrdGltZV90b19ucyhpbnRlcnZhbCk7CisKKwkJb3J1biA9IGt0aW1lX2Rpdm5zKGRlbHRhLCBpbmNyKTsKKwkJdGltZXItPmV4cGlyZXMgPSBrdGltZV9hZGRfbnModGltZXItPmV4cGlyZXMsIGluY3IgKiBvcnVuKTsKKwkJaWYgKHRpbWVyLT5leHBpcmVzLnR2NjQgPiBub3cudHY2NCkKKwkJCXJldHVybiBvcnVuOworCQkvKgorCQkgKiBUaGlzIChhbmQgdGhlIGt0aW1lX2FkZCgpIGJlbG93KSBpcyB0aGUKKwkJICogY29ycmVjdGlvbiBmb3IgZXhhY3Q6CisJCSAqLworCQlvcnVuKys7CisJfQorCXRpbWVyLT5leHBpcmVzID0ga3RpbWVfYWRkKHRpbWVyLT5leHBpcmVzLCBpbnRlcnZhbCk7CisKKwlyZXR1cm4gb3J1bjsKK30KKworLyoKKyAqIGVucXVldWVfaHJ0aW1lciAtIGludGVybmFsIGZ1bmN0aW9uIHRvIChyZSlzdGFydCBhIHRpbWVyCisgKgorICogVGhlIHRpbWVyIGlzIGluc2VydGVkIGluIGV4cGlyeSBvcmRlci4gSW5zZXJ0aW9uIGludG8gdGhlCisgKiByZWQgYmxhY2sgdHJlZSBpcyBPKGxvZyhuKSkuIE11c3QgaG9sZCB0aGUgYmFzZSBsb2NrLgorICovCitzdGF0aWMgdm9pZCBlbnF1ZXVlX2hydGltZXIoc3RydWN0IGhydGltZXIgKnRpbWVyLCBzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpiYXNlKQoreworCXN0cnVjdCByYl9ub2RlICoqbGluayA9ICZiYXNlLT5hY3RpdmUucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgaHJ0aW1lciAqZW50cnk7CisKKwkvKgorCSAqIEZpbmQgdGhlIHJpZ2h0IHBsYWNlIGluIHRoZSByYnRyZWU6CisJICovCisJd2hpbGUgKCpsaW5rKSB7CisJCXBhcmVudCA9ICpsaW5rOworCQllbnRyeSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGhydGltZXIsIG5vZGUpOworCQkvKgorCQkgKiBXZSBkb250IGNhcmUgYWJvdXQgY29sbGlzaW9ucy4gTm9kZXMgd2l0aAorCQkgKiB0aGUgc2FtZSBleHBpcnkgdGltZSBzdGF5IHRvZ2V0aGVyLgorCQkgKi8KKwkJaWYgKHRpbWVyLT5leHBpcmVzLnR2NjQgPCBlbnRyeS0+ZXhwaXJlcy50djY0KQorCQkJbGluayA9ICYoKmxpbmspLT5yYl9sZWZ0OworCQllbHNlCisJCQlsaW5rID0gJigqbGluayktPnJiX3JpZ2h0OworCX0KKworCS8qCisJICogSW5zZXJ0IHRoZSB0aW1lciB0byB0aGUgcmJ0cmVlIGFuZCBjaGVjayB3aGV0aGVyIGl0CisJICogcmVwbGFjZXMgdGhlIGZpcnN0IHBlbmRpbmcgdGltZXIKKwkgKi8KKwlyYl9saW5rX25vZGUoJnRpbWVyLT5ub2RlLCBwYXJlbnQsIGxpbmspOworCXJiX2luc2VydF9jb2xvcigmdGltZXItPm5vZGUsICZiYXNlLT5hY3RpdmUpOworCisJdGltZXItPnN0YXRlID0gSFJUSU1FUl9QRU5ESU5HOworCisJaWYgKCFiYXNlLT5maXJzdCB8fCB0aW1lci0+ZXhwaXJlcy50djY0IDwKKwkgICAgcmJfZW50cnkoYmFzZS0+Zmlyc3QsIHN0cnVjdCBocnRpbWVyLCBub2RlKS0+ZXhwaXJlcy50djY0KQorCQliYXNlLT5maXJzdCA9ICZ0aW1lci0+bm9kZTsKK30KKworLyoKKyAqIF9fcmVtb3ZlX2hydGltZXIgLSBpbnRlcm5hbCBmdW5jdGlvbiB0byByZW1vdmUgYSB0aW1lcgorICoKKyAqIENhbGxlciBtdXN0IGhvbGQgdGhlIGJhc2UgbG9jay4KKyAqLworc3RhdGljIHZvaWQgX19yZW1vdmVfaHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsIHN0cnVjdCBocnRpbWVyX2Jhc2UgKmJhc2UpCit7CisJLyoKKwkgKiBSZW1vdmUgdGhlIHRpbWVyIGZyb20gdGhlIHJidHJlZSBhbmQgcmVwbGFjZSB0aGUKKwkgKiBmaXJzdCBlbnRyeSBwb2ludGVyIGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwlpZiAoYmFzZS0+Zmlyc3QgPT0gJnRpbWVyLT5ub2RlKQorCQliYXNlLT5maXJzdCA9IHJiX25leHQoJnRpbWVyLT5ub2RlKTsKKwlyYl9lcmFzZSgmdGltZXItPm5vZGUsICZiYXNlLT5hY3RpdmUpOworfQorCisvKgorICogcmVtb3ZlIGhydGltZXIsIGNhbGxlZCB3aXRoIGJhc2UgbG9jayBoZWxkCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CityZW1vdmVfaHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsIHN0cnVjdCBocnRpbWVyX2Jhc2UgKmJhc2UpCit7CisJaWYgKGhydGltZXJfYWN0aXZlKHRpbWVyKSkgeworCQlfX3JlbW92ZV9ocnRpbWVyKHRpbWVyLCBiYXNlKTsKKwkJdGltZXItPnN0YXRlID0gSFJUSU1FUl9JTkFDVElWRTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGhydGltZXJfc3RhcnQgLSAocmUpc3RhcnQgYW4gcmVsYXRpdmUgdGltZXIgb24gdGhlIGN1cnJlbnQgQ1BVCisgKgorICogQHRpbWVyOgl0aGUgdGltZXIgdG8gYmUgYWRkZWQKKyAqIEB0aW06CWV4cGlyeSB0aW1lCisgKiBAbW9kZToJZXhwaXJ5IG1vZGU6IGFic29sdXRlIChIUlRJTUVSX0FCUykgb3IgcmVsYXRpdmUgKEhSVElNRVJfUkVMKQorICoKKyAqIFJldHVybnM6CisgKiAgMCBvbiBzdWNjZXNzCisgKiAgMSB3aGVuIHRoZSB0aW1lciB3YXMgYWN0aXZlCisgKi8KK2ludAoraHJ0aW1lcl9zdGFydChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsIGt0aW1lX3QgdGltLCBjb25zdCBlbnVtIGhydGltZXJfbW9kZSBtb2RlKQoreworCXN0cnVjdCBocnRpbWVyX2Jhc2UgKmJhc2UsICpuZXdfYmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwliYXNlID0gbG9ja19ocnRpbWVyX2Jhc2UodGltZXIsICZmbGFncyk7CisKKwkvKiBSZW1vdmUgYW4gYWN0aXZlIHRpbWVyIGZyb20gdGhlIHF1ZXVlOiAqLworCXJldCA9IHJlbW92ZV9ocnRpbWVyKHRpbWVyLCBiYXNlKTsKKworCS8qIFN3aXRjaCB0aGUgdGltZXIgYmFzZSwgaWYgbmVjZXNzYXJ5OiAqLworCW5ld19iYXNlID0gc3dpdGNoX2hydGltZXJfYmFzZSh0aW1lciwgYmFzZSk7CisKKwlpZiAobW9kZSA9PSBIUlRJTUVSX1JFTCkKKwkJdGltID0ga3RpbWVfYWRkKHRpbSwgbmV3X2Jhc2UtPmdldF90aW1lKCkpOworCXRpbWVyLT5leHBpcmVzID0gdGltOworCisJZW5xdWV1ZV9ocnRpbWVyKHRpbWVyLCBuZXdfYmFzZSk7CisKKwl1bmxvY2tfaHJ0aW1lcl9iYXNlKHRpbWVyLCAmZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBocnRpbWVyX3RyeV90b19jYW5jZWwgLSB0cnkgdG8gZGVhY3RpdmF0ZSBhIHRpbWVyCisgKgorICogQHRpbWVyOglocnRpbWVyIHRvIHN0b3AKKyAqCisgKiBSZXR1cm5zOgorICogIDAgd2hlbiB0aGUgdGltZXIgd2FzIG5vdCBhY3RpdmUKKyAqICAxIHdoZW4gdGhlIHRpbWVyIHdhcyBhY3RpdmUKKyAqIC0xIHdoZW4gdGhlIHRpbWVyIGlzIGN1cnJlbnRseSBleGN1dGluZyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gYW5kCisgKiAgICBjYW4gbm90IGJlIHN0b3BwZWQKKyAqLworaW50IGhydGltZXJfdHJ5X3RvX2NhbmNlbChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisJc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAtMTsKKworCWJhc2UgPSBsb2NrX2hydGltZXJfYmFzZSh0aW1lciwgJmZsYWdzKTsKKworCWlmIChiYXNlLT5jdXJyX3RpbWVyICE9IHRpbWVyKQorCQlyZXQgPSByZW1vdmVfaHJ0aW1lcih0aW1lciwgYmFzZSk7CisKKwl1bmxvY2tfaHJ0aW1lcl9iYXNlKHRpbWVyLCAmZmxhZ3MpOworCisJcmV0dXJuIHJldDsKKworfQorCisvKioKKyAqIGhydGltZXJfY2FuY2VsIC0gY2FuY2VsIGEgdGltZXIgYW5kIHdhaXQgZm9yIHRoZSBoYW5kbGVyIHRvIGZpbmlzaC4KKyAqCisgKiBAdGltZXI6CXRoZSB0aW1lciB0byBiZSBjYW5jZWxsZWQKKyAqCisgKiBSZXR1cm5zOgorICogIDAgd2hlbiB0aGUgdGltZXIgd2FzIG5vdCBhY3RpdmUKKyAqICAxIHdoZW4gdGhlIHRpbWVyIHdhcyBhY3RpdmUKKyAqLworaW50IGhydGltZXJfY2FuY2VsKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKwlmb3IgKDs7KSB7CisJCWludCByZXQgPSBocnRpbWVyX3RyeV90b19jYW5jZWwodGltZXIpOworCisJCWlmIChyZXQgPj0gMCkKKwkJCXJldHVybiByZXQ7CisJfQorfQorCisvKioKKyAqIGhydGltZXJfZ2V0X3JlbWFpbmluZyAtIGdldCByZW1haW5pbmcgdGltZSBmb3IgdGhlIHRpbWVyCisgKgorICogQHRpbWVyOgl0aGUgdGltZXIgdG8gcmVhZAorICovCitrdGltZV90IGhydGltZXJfZ2V0X3JlbWFpbmluZyhjb25zdCBzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisJc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWt0aW1lX3QgcmVtOworCisJYmFzZSA9IGxvY2tfaHJ0aW1lcl9iYXNlKHRpbWVyLCAmZmxhZ3MpOworCXJlbSA9IGt0aW1lX3N1Yih0aW1lci0+ZXhwaXJlcywgdGltZXItPmJhc2UtPmdldF90aW1lKCkpOworCXVubG9ja19ocnRpbWVyX2Jhc2UodGltZXIsICZmbGFncyk7CisKKwlyZXR1cm4gcmVtOworfQorCisvKioKKyAqIGhydGltZXJfcmViYXNlIC0gcmViYXNlIGFuIGluaXRpYWxpemVkIGhydGltZXIgdG8gYSBkaWZmZXJlbnQgYmFzZQorICoKKyAqIEB0aW1lcjoJdGhlIHRpbWVyIHRvIGJlIHJlYmFzZWQKKyAqIEBjbG9ja19pZDoJdGhlIGNsb2NrIHRvIGJlIHVzZWQKKyAqLwordm9pZCBocnRpbWVyX3JlYmFzZShzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsIGNvbnN0IGNsb2NraWRfdCBjbG9ja19pZCkKK3sKKwlzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpiYXNlczsKKworCWJhc2VzID0gcGVyX2NwdShocnRpbWVyX2Jhc2VzLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwl0aW1lci0+YmFzZSA9ICZiYXNlc1tjbG9ja19pZF07Cit9CisKKy8qKgorICogaHJ0aW1lcl9pbml0IC0gaW5pdGlhbGl6ZSBhIHRpbWVyIHRvIHRoZSBnaXZlbiBjbG9jaworICoKKyAqIEB0aW1lcjoJdGhlIHRpbWVyIHRvIGJlIGluaXRpYWxpemVkCisgKiBAY2xvY2tfaWQ6CXRoZSBjbG9jayB0byBiZSB1c2VkCisgKi8KK3ZvaWQgaHJ0aW1lcl9pbml0KHN0cnVjdCBocnRpbWVyICp0aW1lciwgY29uc3QgY2xvY2tpZF90IGNsb2NrX2lkKQoreworCW1lbXNldCh0aW1lciwgMCwgc2l6ZW9mKHN0cnVjdCBocnRpbWVyKSk7CisJaHJ0aW1lcl9yZWJhc2UodGltZXIsIGNsb2NrX2lkKTsKK30KKworLyoqCisgKiBocnRpbWVyX2dldF9yZXMgLSBnZXQgdGhlIHRpbWVyIHJlc29sdXRpb24gZm9yIGEgY2xvY2sKKyAqCisgKiBAd2hpY2hfY2xvY2s6IHdoaWNoIGNsb2NrIHRvIHF1ZXJ5CisgKiBAdHA6CQkgcG9pbnRlciB0byB0aW1lc3BlYyB2YXJpYWJsZSB0byBzdG9yZSB0aGUgcmVzb2x1dGlvbgorICoKKyAqIFN0b3JlIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBjbG9jayBzZWxlY3RlZCBieSB3aGljaF9jbG9jayBpbiB0aGUKKyAqIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkgdHAuCisgKi8KK2ludCBocnRpbWVyX2dldF9yZXMoY29uc3QgY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBzdHJ1Y3QgdGltZXNwZWMgKnRwKQoreworCXN0cnVjdCBocnRpbWVyX2Jhc2UgKmJhc2VzOworCisJYmFzZXMgPSBwZXJfY3B1KGhydGltZXJfYmFzZXMsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOworCSp0cCA9IGt0aW1lX3RvX3RpbWVzcGVjKGJhc2VzW3doaWNoX2Nsb2NrXS5yZXNvbHV0aW9uKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRXhwaXJlIHRoZSBwZXIgYmFzZSBocnRpbWVyLXF1ZXVlOgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcnVuX2hydGltZXJfcXVldWUoc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZSkKK3sKKwlrdGltZV90IG5vdyA9IGJhc2UtPmdldF90aW1lKCk7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisKKwlzcGluX2xvY2tfaXJxKCZiYXNlLT5sb2NrKTsKKworCXdoaWxlICgobm9kZSA9IGJhc2UtPmZpcnN0KSkgeworCQlzdHJ1Y3QgaHJ0aW1lciAqdGltZXI7CisJCWludCAoKmZuKSh2b2lkICopOworCQlpbnQgcmVzdGFydDsKKwkJdm9pZCAqZGF0YTsKKworCQl0aW1lciA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBocnRpbWVyLCBub2RlKTsKKwkJaWYgKG5vdy50djY0IDw9IHRpbWVyLT5leHBpcmVzLnR2NjQpCisJCQlicmVhazsKKworCQlmbiA9IHRpbWVyLT5mdW5jdGlvbjsKKwkJZGF0YSA9IHRpbWVyLT5kYXRhOworCQlzZXRfY3Vycl90aW1lcihiYXNlLCB0aW1lcik7CisJCV9fcmVtb3ZlX2hydGltZXIodGltZXIsIGJhc2UpOworCQlzcGluX3VubG9ja19pcnEoJmJhc2UtPmxvY2spOworCisJCS8qCisJCSAqIGZuID09IE5VTEwgaXMgc3BlY2lhbCBjYXNlIGZvciB0aGUgc2ltcGxlc3QgdGltZXIKKwkJICogdmFyaWFudCAtIHdha2UgdXAgcHJvY2VzcyBhbmQgZG8gbm90IHJlc3RhcnQ6CisJCSAqLworCQlpZiAoIWZuKSB7CisJCQl3YWtlX3VwX3Byb2Nlc3MoZGF0YSk7CisJCQlyZXN0YXJ0ID0gSFJUSU1FUl9OT1JFU1RBUlQ7CisJCX0gZWxzZQorCQkJcmVzdGFydCA9IGZuKGRhdGEpOworCisJCXNwaW5fbG9ja19pcnEoJmJhc2UtPmxvY2spOworCisJCWlmIChyZXN0YXJ0ID09IEhSVElNRVJfUkVTVEFSVCkKKwkJCWVucXVldWVfaHJ0aW1lcih0aW1lciwgYmFzZSk7CisJCWVsc2UKKwkJCXRpbWVyLT5zdGF0ZSA9IEhSVElNRVJfRVhQSVJFRDsKKwl9CisJc2V0X2N1cnJfdGltZXIoYmFzZSwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxKCZiYXNlLT5sb2NrKTsKK30KKworLyoKKyAqIENhbGxlZCBmcm9tIHRpbWVyIHNvZnRpcnEgZXZlcnkgamlmZnksIGV4cGlyZSBocnRpbWVyczoKKyAqLwordm9pZCBocnRpbWVyX3J1bl9xdWV1ZXModm9pZCkKK3sKKwlzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpiYXNlID0gX19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfSFJUSU1FUl9CQVNFUzsgaSsrKQorCQlydW5faHJ0aW1lcl9xdWV1ZSgmYmFzZVtpXSk7Cit9CisKKy8qCisgKiBTbGVlcCByZWxhdGVkIGZ1bmN0aW9uczoKKyAqLworCisvKioKKyAqIHNjaGVkdWxlX2hydGltZXIgLSBzbGVlcCB1bnRpbCB0aW1lb3V0CisgKgorICogQHRpbWVyOglocnRpbWVyIHZhcmlhYmxlIGluaXRpYWxpemVkIHdpdGggdGhlIGNvcnJlY3QgY2xvY2sgYmFzZQorICogQG1vZGU6CXRpbWVvdXQgdmFsdWUgaXMgYWJzL3JlbAorICoKKyAqIE1ha2UgdGhlIGN1cnJlbnQgdGFzayBzbGVlcCB1bnRpbCBAdGltZW91dCBpcworICogZWxhcHNlZC4KKyAqCisgKiBZb3UgY2FuIHNldCB0aGUgdGFzayBzdGF0ZSBhcyBmb2xsb3dzIC0KKyAqCisgKiAlVEFTS19VTklOVEVSUlVQVElCTEUgLSBhdCBsZWFzdCBAdGltZW91dCBpcyBndWFyYW50ZWVkIHRvCisgKiBwYXNzIGJlZm9yZSB0aGUgcm91dGluZSByZXR1cm5zLiBUaGUgcm91dGluZSB3aWxsIHJldHVybiAwCisgKgorICogJVRBU0tfSU5URVJSVVBUSUJMRSAtIHRoZSByb3V0aW5lIG1heSByZXR1cm4gZWFybHkgaWYgYSBzaWduYWwgaXMKKyAqIGRlbGl2ZXJlZCB0byB0aGUgY3VycmVudCB0YXNrLiBJbiB0aGlzIGNhc2UgdGhlIHJlbWFpbmluZyB0aW1lCisgKiB3aWxsIGJlIHJldHVybmVkCisgKgorICogVGhlIGN1cnJlbnQgdGFzayBzdGF0ZSBpcyBndWFyYW50ZWVkIHRvIGJlIFRBU0tfUlVOTklORyB3aGVuIHRoaXMKKyAqIHJvdXRpbmUgcmV0dXJucy4KKyAqLworc3RhdGljIGt0aW1lX3QgX19zY2hlZAorc2NoZWR1bGVfaHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsIGNvbnN0IGVudW0gaHJ0aW1lcl9tb2RlIG1vZGUpCit7CisJLyogZm4gc3RheXMgTlVMTCwgbWVhbmluZyBzaW5nbGUtc2hvdCB3YWtldXA6ICovCisJdGltZXItPmRhdGEgPSBjdXJyZW50OworCisJaHJ0aW1lcl9zdGFydCh0aW1lciwgdGltZXItPmV4cGlyZXMsIG1vZGUpOworCisJc2NoZWR1bGUoKTsKKwlocnRpbWVyX2NhbmNlbCh0aW1lcik7CisKKwkvKiBSZXR1cm4gdGhlIHJlbWFpbmluZyB0aW1lOiAqLworCWlmICh0aW1lci0+c3RhdGUgIT0gSFJUSU1FUl9FWFBJUkVEKQorCQlyZXR1cm4ga3RpbWVfc3ViKHRpbWVyLT5leHBpcmVzLCB0aW1lci0+YmFzZS0+Z2V0X3RpbWUoKSk7CisJZWxzZQorCQlyZXR1cm4gKGt0aW1lX3QpIHsudHY2NCA9IDAgfTsKK30KKworc3RhdGljIGlubGluZSBrdGltZV90IF9fc2NoZWQKK3NjaGVkdWxlX2hydGltZXJfaW50ZXJydXB0aWJsZShzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCisJCQkgICAgICAgY29uc3QgZW51bSBocnRpbWVyX21vZGUgbW9kZSkKK3sKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJcmV0dXJuIHNjaGVkdWxlX2hydGltZXIodGltZXIsIG1vZGUpOworfQorCitzdGF0aWMgbG9uZyBfX3NjaGVkCituYW5vc2xlZXBfcmVzdGFydChzdHJ1Y3QgcmVzdGFydF9ibG9jayAqcmVzdGFydCwgY2xvY2tpZF90IGNsb2NraWQpCit7CisJc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqcm10cDsKKwlzdHJ1Y3QgdGltZXNwZWMgdHU7CisJdm9pZCAqcmZuX3NhdmUgPSByZXN0YXJ0LT5mbjsKKwlzdHJ1Y3QgaHJ0aW1lciB0aW1lcjsKKwlrdGltZV90IHJlbTsKKworCXJlc3RhcnQtPmZuID0gZG9fbm9fcmVzdGFydF9zeXNjYWxsOworCisJaHJ0aW1lcl9pbml0KCZ0aW1lciwgY2xvY2tpZCk7CisKKwl0aW1lci5leHBpcmVzLnR2NjQgPSAoKHU2NClyZXN0YXJ0LT5hcmcxIDw8IDMyKSB8ICh1NjQpIHJlc3RhcnQtPmFyZzA7CisKKwlyZW0gPSBzY2hlZHVsZV9ocnRpbWVyX2ludGVycnVwdGlibGUoJnRpbWVyLCBIUlRJTUVSX0FCUyk7CisKKwlpZiAocmVtLnR2NjQgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwlybXRwID0gKHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKikgcmVzdGFydC0+YXJnMjsKKwl0dSA9IGt0aW1lX3RvX3RpbWVzcGVjKHJlbSk7CisJaWYgKHJtdHAgJiYgY29weV90b191c2VyKHJtdHAsICZ0dSwgc2l6ZW9mKHR1KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmVzdGFydC0+Zm4gPSByZm5fc2F2ZTsKKworCS8qIFRoZSBvdGhlciB2YWx1ZXMgaW4gcmVzdGFydCBhcmUgYWxyZWFkeSBmaWxsZWQgaW4gKi8KKwlyZXR1cm4gLUVSRVNUQVJUX1JFU1RBUlRCTE9DSzsKK30KKworc3RhdGljIGxvbmcgX19zY2hlZCBuYW5vc2xlZXBfcmVzdGFydF9tb25vKHN0cnVjdCByZXN0YXJ0X2Jsb2NrICpyZXN0YXJ0KQoreworCXJldHVybiBuYW5vc2xlZXBfcmVzdGFydChyZXN0YXJ0LCBDTE9DS19NT05PVE9OSUMpOworfQorCitzdGF0aWMgbG9uZyBfX3NjaGVkIG5hbm9zbGVlcF9yZXN0YXJ0X3JlYWwoc3RydWN0IHJlc3RhcnRfYmxvY2sgKnJlc3RhcnQpCit7CisJcmV0dXJuIG5hbm9zbGVlcF9yZXN0YXJ0KHJlc3RhcnQsIENMT0NLX1JFQUxUSU1FKTsKK30KKworbG9uZyBocnRpbWVyX25hbm9zbGVlcChzdHJ1Y3QgdGltZXNwZWMgKnJxdHAsIHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnJtdHAsCisJCSAgICAgICBjb25zdCBlbnVtIGhydGltZXJfbW9kZSBtb2RlLCBjb25zdCBjbG9ja2lkX3QgY2xvY2tpZCkKK3sKKwlzdHJ1Y3QgcmVzdGFydF9ibG9jayAqcmVzdGFydDsKKwlzdHJ1Y3QgaHJ0aW1lciB0aW1lcjsKKwlzdHJ1Y3QgdGltZXNwZWMgdHU7CisJa3RpbWVfdCByZW07CisKKwlocnRpbWVyX2luaXQoJnRpbWVyLCBjbG9ja2lkKTsKKworCXRpbWVyLmV4cGlyZXMgPSB0aW1lc3BlY190b19rdGltZSgqcnF0cCk7CisKKwlyZW0gPSBzY2hlZHVsZV9ocnRpbWVyX2ludGVycnVwdGlibGUoJnRpbWVyLCBtb2RlKTsKKwlpZiAocmVtLnR2NjQgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBBYnNvbHV0ZSB0aW1lcnMgZG8gbm90IHVwZGF0ZSB0aGUgcm10cCB2YWx1ZTogKi8KKwlpZiAobW9kZSA9PSBIUlRJTUVSX0FCUykKKwkJcmV0dXJuIC1FUkVTVEFSVE5PSEFORDsKKworCXR1ID0ga3RpbWVfdG9fdGltZXNwZWMocmVtKTsKKworCWlmIChybXRwICYmIGNvcHlfdG9fdXNlcihybXRwLCAmdHUsIHNpemVvZih0dSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJlc3RhcnQgPSAmY3VycmVudF90aHJlYWRfaW5mbygpLT5yZXN0YXJ0X2Jsb2NrOworCXJlc3RhcnQtPmZuID0gKGNsb2NraWQgPT0gQ0xPQ0tfTU9OT1RPTklDKSA/CisJCW5hbm9zbGVlcF9yZXN0YXJ0X21vbm8gOiBuYW5vc2xlZXBfcmVzdGFydF9yZWFsOworCXJlc3RhcnQtPmFyZzAgPSB0aW1lci5leHBpcmVzLnR2NjQgJiAweEZGRkZGRkZGOworCXJlc3RhcnQtPmFyZzEgPSB0aW1lci5leHBpcmVzLnR2NjQgPj4gMzI7CisJcmVzdGFydC0+YXJnMiA9ICh1bnNpZ25lZCBsb25nKSBybXRwOworCisJcmV0dXJuIC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0s7Cit9CisKK2FzbWxpbmthZ2UgbG9uZworc3lzX25hbm9zbGVlcChzdHJ1Y3QgdGltZXNwZWMgX191c2VyICpycXRwLCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICpybXRwKQoreworCXN0cnVjdCB0aW1lc3BlYyB0dTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdHUsIHJxdHAsIHNpemVvZih0dSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICghdGltZXNwZWNfdmFsaWQoJnR1KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gaHJ0aW1lcl9uYW5vc2xlZXAoJnR1LCBybXRwLCBIUlRJTUVSX1JFTCwgQ0xPQ0tfTU9OT1RPTklDKTsKK30KKworLyoKKyAqIEZ1bmN0aW9ucyByZWxhdGVkIHRvIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbjoKKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfaHJ0aW1lcnNfY3B1KGludCBjcHUpCit7CisJc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZSA9IHBlcl9jcHUoaHJ0aW1lcl9iYXNlcywgY3B1KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfSFJUSU1FUl9CQVNFUzsgaSsrKSB7CisJCXNwaW5fbG9ja19pbml0KCZiYXNlLT5sb2NrKTsKKwkJYmFzZSsrOworCX0KK30KKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCitzdGF0aWMgdm9pZCBtaWdyYXRlX2hydGltZXJfbGlzdChzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpvbGRfYmFzZSwKKwkJCQlzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpuZXdfYmFzZSkKK3sKKwlzdHJ1Y3QgaHJ0aW1lciAqdGltZXI7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisKKwl3aGlsZSAoKG5vZGUgPSByYl9maXJzdCgmb2xkX2Jhc2UtPmFjdGl2ZSkpKSB7CisJCXRpbWVyID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGhydGltZXIsIG5vZGUpOworCQlfX3JlbW92ZV9ocnRpbWVyKHRpbWVyLCBvbGRfYmFzZSk7CisJCXRpbWVyLT5iYXNlID0gbmV3X2Jhc2U7CisJCWVucXVldWVfaHJ0aW1lcih0aW1lciwgbmV3X2Jhc2UpOworCX0KK30KKworc3RhdGljIHZvaWQgbWlncmF0ZV9ocnRpbWVycyhpbnQgY3B1KQoreworCXN0cnVjdCBocnRpbWVyX2Jhc2UgKm9sZF9iYXNlLCAqbmV3X2Jhc2U7CisJaW50IGk7CisKKwlCVUdfT04oY3B1X29ubGluZShjcHUpKTsKKwlvbGRfYmFzZSA9IHBlcl9jcHUoaHJ0aW1lcl9iYXNlcywgY3B1KTsKKwluZXdfYmFzZSA9IGdldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfSFJUSU1FUl9CQVNFUzsgaSsrKSB7CisKKwkJc3Bpbl9sb2NrKCZuZXdfYmFzZS0+bG9jayk7CisJCXNwaW5fbG9jaygmb2xkX2Jhc2UtPmxvY2spOworCisJCUJVR19PTihvbGRfYmFzZS0+Y3Vycl90aW1lcik7CisKKwkJbWlncmF0ZV9ocnRpbWVyX2xpc3Qob2xkX2Jhc2UsIG5ld19iYXNlKTsKKworCQlzcGluX3VubG9jaygmb2xkX2Jhc2UtPmxvY2spOworCQlzcGluX3VubG9jaygmbmV3X2Jhc2UtPmxvY2spOworCQlvbGRfYmFzZSsrOworCQluZXdfYmFzZSsrOworCX0KKworCWxvY2FsX2lycV9lbmFibGUoKTsKKwlwdXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgaHJ0aW1lcl9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKKwkJCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJbG9uZyBjcHUgPSAobG9uZyloY3B1OworCisJc3dpdGNoIChhY3Rpb24pIHsKKworCWNhc2UgQ1BVX1VQX1BSRVBBUkU6CisJCWluaXRfaHJ0aW1lcnNfY3B1KGNwdSk7CisJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJY2FzZSBDUFVfREVBRDoKKwkJbWlncmF0ZV9ocnRpbWVycyhjcHUpOworCQlicmVhazsKKyNlbmRpZgorCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBfX2RldmluaXRkYXRhIGhydGltZXJzX25iID0geworCS5ub3RpZmllcl9jYWxsID0gaHJ0aW1lcl9jcHVfbm90aWZ5LAorfTsKKwordm9pZCBfX2luaXQgaHJ0aW1lcnNfaW5pdCh2b2lkKQoreworCWhydGltZXJfY3B1X25vdGlmeSgmaHJ0aW1lcnNfbmIsICh1bnNpZ25lZCBsb25nKUNQVV9VUF9QUkVQQVJFLAorCQkJICAodm9pZCAqKShsb25nKXNtcF9wcm9jZXNzb3JfaWQoKSk7CisJcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZocnRpbWVyc19uYik7Cit9CisKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvcHJvYy5jIGIva2VybmVsL2lycS9wcm9jLmMKaW5kZXggOGE2NGE0OC4uZDAzYjVlZSAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9wcm9jLmMKKysrIGIva2VybmVsL2lycS9wcm9jLmMKQEAgLTEwLDYgKzEwLDggQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKKyNpbmNsdWRlICJpbnRlcm5hbHMuaCIKKwogc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcm9vdF9pcnFfZGlyLCAqaXJxX2RpcltOUl9JUlFTXTsKIAogI2lmZGVmIENPTkZJR19TTVAKZGlmZiAtLWdpdCBhL2tlcm5lbC9pdGltZXIuYyBiL2tlcm5lbC9pdGltZXIuYwppbmRleCA3YzFiMjVlLi5jMmMwNWM0IDEwMDY0NAotLS0gYS9rZXJuZWwvaXRpbWVyLmMKKysrIGIva2VybmVsL2l0aW1lci5jCkBAIC0xMiwzNiArMTIsNDYgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9wb3NpeC10aW1lcnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBpdF9yZWFsX3ZhbHVlKHN0cnVjdCBzaWduYWxfc3RydWN0ICpzaWcpCisvKioKKyAqIGl0aW1lcl9nZXRfcmVtdGltZSAtIGdldCByZW1haW5pbmcgdGltZSBmb3IgdGhlIHRpbWVyCisgKgorICogQHRpbWVyOiB0aGUgdGltZXIgdG8gcmVhZAorICoKKyAqIFJldHVybnMgdGhlIGRlbHRhIGJldHdlZW4gdGhlIGV4cGlyeSB0aW1lIGFuZCBub3csIHdoaWNoIGNhbiBiZQorICogbGVzcyB0aGFuIHplcm8gb3IgMXVzZWMgZm9yIGFuIHBlbmRpbmcgZXhwaXJlZCB0aW1lcgorICovCitzdGF0aWMgc3RydWN0IHRpbWV2YWwgaXRpbWVyX2dldF9yZW10aW1lKHN0cnVjdCBocnRpbWVyICp0aW1lcikKIHsKLQl1bnNpZ25lZCBsb25nIHZhbCA9IDA7Ci0JaWYgKHRpbWVyX3BlbmRpbmcoJnNpZy0+cmVhbF90aW1lcikpIHsKLQkJdmFsID0gc2lnLT5yZWFsX3RpbWVyLmV4cGlyZXMgLSBqaWZmaWVzOworCWt0aW1lX3QgcmVtID0gaHJ0aW1lcl9nZXRfcmVtYWluaW5nKHRpbWVyKTsKIAotCQkvKiBsb29rIG91dCBmb3IgbmVnYXRpdmUvemVybyBpdGltZXIuLiAqLwotCQlpZiAoKGxvbmcpIHZhbCA8PSAwKQotCQkJdmFsID0gMTsKLQl9Ci0JcmV0dXJuIHZhbDsKKwkvKgorCSAqIFJhY3kgYnV0IHNhZmU6IGlmIHRoZSBpdGltZXIgZXhwaXJlcyBhZnRlciB0aGUgYWJvdmUKKwkgKiBocnRpbWVyX2dldF9yZW10aW1lKCkgY2FsbCBidXQgYmVmb3JlIHRoaXMgY29uZGl0aW9uCisJICogdGhlbiB3ZSByZXR1cm4gMCAtIHdoaWNoIGlzIGNvcnJlY3QuCisJICovCisJaWYgKGhydGltZXJfYWN0aXZlKHRpbWVyKSkgeworCQlpZiAocmVtLnR2NjQgPD0gMCkKKwkJCXJlbS50djY0ID0gTlNFQ19QRVJfVVNFQzsKKwl9IGVsc2UKKwkJcmVtLnR2NjQgPSAwOworCisJcmV0dXJuIGt0aW1lX3RvX3RpbWV2YWwocmVtKTsKIH0KIAogaW50IGRvX2dldGl0aW1lcihpbnQgd2hpY2gsIHN0cnVjdCBpdGltZXJ2YWwgKnZhbHVlKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKLQl1bnNpZ25lZCBsb25nIGludGVydmFsLCB2YWw7CiAJY3B1dGltZV90IGNpbnRlcnZhbCwgY3ZhbDsKIAogCXN3aXRjaCAod2hpY2gpIHsKIAljYXNlIElUSU1FUl9SRUFMOgotCQlzcGluX2xvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOwotCQlpbnRlcnZhbCA9IHRzay0+c2lnbmFsLT5pdF9yZWFsX2luY3I7Ci0JCXZhbCA9IGl0X3JlYWxfdmFsdWUodHNrLT5zaWduYWwpOwotCQlzcGluX3VubG9ja19pcnEoJnRzay0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JCWppZmZpZXNfdG9fdGltZXZhbCh2YWwsICZ2YWx1ZS0+aXRfdmFsdWUpOwotCQlqaWZmaWVzX3RvX3RpbWV2YWwoaW50ZXJ2YWwsICZ2YWx1ZS0+aXRfaW50ZXJ2YWwpOworCQl2YWx1ZS0+aXRfdmFsdWUgPSBpdGltZXJfZ2V0X3JlbXRpbWUoJnRzay0+c2lnbmFsLT5yZWFsX3RpbWVyKTsKKwkJdmFsdWUtPml0X2ludGVydmFsID0KKwkJCWt0aW1lX3RvX3RpbWV2YWwodHNrLT5zaWduYWwtPml0X3JlYWxfaW5jcik7CiAJCWJyZWFrOwogCWNhc2UgSVRJTUVSX1ZJUlRVQUw6CiAJCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CkBAIC0xMTMsNTkgKzEyMyw0NSBAQAogfQogCiAKLXZvaWQgaXRfcmVhbF9mbih1bnNpZ25lZCBsb25nIF9fZGF0YSkKKy8qCisgKiBUaGUgdGltZXIgaXMgYXV0b21hZ2ljYWxseSByZXN0YXJ0ZWQsIHdoZW4gaW50ZXJ2YWwgIT0gMAorICovCitpbnQgaXRfcmVhbF9mbih2b2lkICpkYXRhKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqIHAgPSAoc3RydWN0IHRhc2tfc3RydWN0ICopIF9fZGF0YTsKLQl1bnNpZ25lZCBsb25nIGluYyA9IHAtPnNpZ25hbC0+aXRfcmVhbF9pbmNyOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gKHN0cnVjdCB0YXNrX3N0cnVjdCAqKSBkYXRhOwogCi0Jc2VuZF9ncm91cF9zaWdfaW5mbyhTSUdBTFJNLCBTRU5EX1NJR19QUklWLCBwKTsKKwlzZW5kX2dyb3VwX3NpZ19pbmZvKFNJR0FMUk0sIFNFTkRfU0lHX1BSSVYsIHRzayk7CiAKLQkvKgotCSAqIE5vdyByZXN0YXJ0IHRoZSB0aW1lciBpZiBuZWNlc3NhcnkuICBXZSBkb24ndCBuZWVkIGFueSBsb2NraW5nCi0JICogaGVyZSBiZWNhdXNlIGRvX3NldGl0aW1lciBtYWtlcyBzdXJlIHdlIGhhdmUgZmluaXNoZWQgcnVubmluZwotCSAqIGJlZm9yZSBpdCB0b3VjaGVzIGFueXRoaW5nLgotCSAqIE5vdGUsIHdlIEtOT1cgd2UgYXJlIChvciBzaG91bGQgYmUpIGF0IGEgamlmZmllIGVkZ2UgaGVyZSBzbwotCSAqIHdlIGRvbid0IG5lZWQgdGhlICsxIHN0dWZmLiAgQWxzbywgd2Ugd2FudCB0byB1c2UgdGhlIHByaW9yCi0JICogZXhwaXJlIHZhbHVlIHNvIGFzIHRvIG5vdCAic2xpcCIgYSBqaWZmaWUgaWYgd2UgYXJlIGxhdGUuCi0JICogRGVhbCB3aXRoIHJlcXVlc3RpbmcgYSB0aW1lIHByaW9yIHRvICJub3ciIGhlcmUgcmF0aGVyIHRoYW4KLQkgKiBpbiBhZGRfdGltZXIuCi0JICovCi0JaWYgKCFpbmMpCi0JCXJldHVybjsKLQl3aGlsZSAodGltZV9iZWZvcmVfZXEocC0+c2lnbmFsLT5yZWFsX3RpbWVyLmV4cGlyZXMsIGppZmZpZXMpKQotCQlwLT5zaWduYWwtPnJlYWxfdGltZXIuZXhwaXJlcyArPSBpbmM7Ci0JYWRkX3RpbWVyKCZwLT5zaWduYWwtPnJlYWxfdGltZXIpOworCWlmICh0c2stPnNpZ25hbC0+aXRfcmVhbF9pbmNyLnR2NjQgIT0gMCkgeworCQlocnRpbWVyX2ZvcndhcmQoJnRzay0+c2lnbmFsLT5yZWFsX3RpbWVyLAorCQkJICAgICAgIHRzay0+c2lnbmFsLT5pdF9yZWFsX2luY3IpOworCisJCXJldHVybiBIUlRJTUVSX1JFU1RBUlQ7CisJfQorCXJldHVybiBIUlRJTUVSX05PUkVTVEFSVDsKIH0KIAogaW50IGRvX3NldGl0aW1lcihpbnQgd2hpY2gsIHN0cnVjdCBpdGltZXJ2YWwgKnZhbHVlLCBzdHJ1Y3QgaXRpbWVydmFsICpvdmFsdWUpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwotIAl1bnNpZ25lZCBsb25nIHZhbCwgaW50ZXJ2YWwsIGV4cGlyZXM7CisJc3RydWN0IGhydGltZXIgKnRpbWVyOworCWt0aW1lX3QgZXhwaXJlczsKIAljcHV0aW1lX3QgY3ZhbCwgY2ludGVydmFsLCBudmFsLCBuaW50ZXJ2YWw7CiAKIAlzd2l0Y2ggKHdoaWNoKSB7CiAJY2FzZSBJVElNRVJfUkVBTDoKLWFnYWluOgotCQlzcGluX2xvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOwotCQlpbnRlcnZhbCA9IHRzay0+c2lnbmFsLT5pdF9yZWFsX2luY3I7Ci0JCXZhbCA9IGl0X3JlYWxfdmFsdWUodHNrLT5zaWduYWwpOwotCQkvKiBXZSBhcmUgc2hhcmluZyAtPnNpZ2xvY2sgd2l0aCBpdF9yZWFsX2ZuKCkgKi8KLQkJaWYgKHRyeV90b19kZWxfdGltZXJfc3luYygmdHNrLT5zaWduYWwtPnJlYWxfdGltZXIpIDwgMCkgewotCQkJc3Bpbl91bmxvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOwotCQkJZ290byBhZ2FpbjsKKwkJdGltZXIgPSAmdHNrLT5zaWduYWwtPnJlYWxfdGltZXI7CisJCWhydGltZXJfY2FuY2VsKHRpbWVyKTsKKwkJaWYgKG92YWx1ZSkgeworCQkJb3ZhbHVlLT5pdF92YWx1ZSA9IGl0aW1lcl9nZXRfcmVtdGltZSh0aW1lcik7CisJCQlvdmFsdWUtPml0X2ludGVydmFsCisJCQkJPSBrdGltZV90b190aW1ldmFsKHRzay0+c2lnbmFsLT5pdF9yZWFsX2luY3IpOwogCQl9CiAJCXRzay0+c2lnbmFsLT5pdF9yZWFsX2luY3IgPQotCQkJdGltZXZhbF90b19qaWZmaWVzKCZ2YWx1ZS0+aXRfaW50ZXJ2YWwpOwotCQlleHBpcmVzID0gdGltZXZhbF90b19qaWZmaWVzKCZ2YWx1ZS0+aXRfdmFsdWUpOwotCQlpZiAoZXhwaXJlcykKLQkJCW1vZF90aW1lcigmdHNrLT5zaWduYWwtPnJlYWxfdGltZXIsCi0JCQkJICBqaWZmaWVzICsgMSArIGV4cGlyZXMpOwotCQlzcGluX3VubG9ja19pcnEoJnRzay0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JCWlmIChvdmFsdWUpIHsKLQkJCWppZmZpZXNfdG9fdGltZXZhbCh2YWwsICZvdmFsdWUtPml0X3ZhbHVlKTsKLQkJCWppZmZpZXNfdG9fdGltZXZhbChpbnRlcnZhbCwKLQkJCQkJICAgJm92YWx1ZS0+aXRfaW50ZXJ2YWwpOwotCQl9CisJCQl0aW1ldmFsX3RvX2t0aW1lKHZhbHVlLT5pdF9pbnRlcnZhbCk7CisJCWV4cGlyZXMgPSB0aW1ldmFsX3RvX2t0aW1lKHZhbHVlLT5pdF92YWx1ZSk7CisJCWlmIChleHBpcmVzLnR2NjQgIT0gMCkKKwkJCWhydGltZXJfc3RhcnQodGltZXIsIGV4cGlyZXMsIEhSVElNRVJfUkVMKTsKIAkJYnJlYWs7CiAJY2FzZSBJVElNRVJfVklSVFVBTDoKIAkJbnZhbCA9IHRpbWV2YWxfdG9fY3B1dGltZSgmdmFsdWUtPml0X3ZhbHVlKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9rZXhlYy5jIGIva2VybmVsL2tleGVjLmMKaW5kZXggMmM5NTg0OC4uYmYzOWQyOCAxMDA2NDQKLS0tIGEva2VybmVsL2tleGVjLmMKKysrIGIva2VybmVsL2tleGVjLmMKQEAgLTYsNiArNiw3IEBACiAgKiBWZXJzaW9uIDIuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMjYsNiArMjcsOSBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAKKy8qIFBlciBjcHUgbWVtb3J5IGZvciBzdG9yaW5nIGNwdSBzdGF0ZXMgaW4gY2FzZSBvZiBzeXN0ZW0gY3Jhc2guICovCitub3RlX2J1Zl90KiBjcmFzaF9ub3RlczsKKwogLyogTG9jYXRpb24gb2YgdGhlIHJlc2VydmVkIGFyZWEgZm9yIHRoZSBjcmFzaCBrZXJuZWwgKi8KIHN0cnVjdCByZXNvdXJjZSBjcmFzaGtfcmVzID0gewogCS5uYW1lICA9ICJDcmFzaCBrZXJuZWwiLApAQCAtMTA1NCw5ICsxMDU4LDI0IEBACiAJaWYgKCFsb2NrZWQpIHsKIAkJaW1hZ2UgPSB4Y2hnKCZrZXhlY19jcmFzaF9pbWFnZSwgTlVMTCk7CiAJCWlmIChpbWFnZSkgewotCQkJbWFjaGluZV9jcmFzaF9zaHV0ZG93bihyZWdzKTsKKwkJCXN0cnVjdCBwdF9yZWdzIGZpeGVkX3JlZ3M7CisJCQljcmFzaF9zZXR1cF9yZWdzKCZmaXhlZF9yZWdzLCByZWdzKTsKKwkJCW1hY2hpbmVfY3Jhc2hfc2h1dGRvd24oJmZpeGVkX3JlZ3MpOwogCQkJbWFjaGluZV9rZXhlYyhpbWFnZSk7CiAJCX0KIAkJeGNoZygma2V4ZWNfbG9jaywgMCk7CiAJfQogfQorCitzdGF0aWMgaW50IF9faW5pdCBjcmFzaF9ub3Rlc19tZW1vcnlfaW5pdCh2b2lkKQoreworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc2F2aW5nIGNwdSByZWdpc3RlcnMuICovCisJY3Jhc2hfbm90ZXMgPSBhbGxvY19wZXJjcHUobm90ZV9idWZfdCk7CisJaWYgKCFjcmFzaF9ub3RlcykgeworCQlwcmludGsoIktleGVjOiBNZW1vcnkgYWxsb2NhdGlvbiBmb3Igc2F2aW5nIGNwdSByZWdpc3RlciIKKwkJIiBzdGF0ZXMgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorbW9kdWxlX2luaXQoY3Jhc2hfbm90ZXNfbWVtb3J5X2luaXQpCmRpZmYgLS1naXQgYS9rZXJuZWwva3Byb2Jlcy5jIGIva2VybmVsL2twcm9iZXMuYwppbmRleCAzYmI3MWU2Li4zZWE2MzI1IDEwMDY0NAotLS0gYS9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2tlcm5lbC9rcHJvYmVzLmMKQEAgLTQ4LDEwICs0OCwxMSBAQAogc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIGtwcm9iZV90YWJsZVtLUFJPQkVfVEFCTEVfU0laRV07CiBzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQga3JldHByb2JlX2luc3RfdGFibGVbS1BST0JFX1RBQkxFX1NJWkVdOwogCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGtwcm9iZV9sb2NrKTsJLyogUHJvdGVjdHMga3Byb2JlX3RhYmxlICovCitERUNMQVJFX01VVEVYKGtwcm9iZV9tdXRleCk7CQkvKiBQcm90ZWN0cyBrcHJvYmVfdGFibGUgKi8KIERFRklORV9TUElOTE9DSyhrcmV0cHJvYmVfbG9jayk7CS8qIFByb3RlY3RzIGtyZXRwcm9iZV9pbnN0X3RhYmxlICovCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGtwcm9iZSAqLCBrcHJvYmVfaW5zdGFuY2UpID0gTlVMTDsKIAorI2lmZGVmIF9fQVJDSF9XQU5UX0tQUk9CRVNfSU5TTl9TTE9UCiAvKgogICoga3Byb2JlLT5haW5zbi5pbnNuIHBvaW50cyB0byB0aGUgY29weSBvZiB0aGUgaW5zdHJ1Y3Rpb24gdG8gYmUKICAqIHNpbmdsZS1zdGVwcGVkLiB4ODZfNjQsIFBPV0VSNCBhbmQgYWJvdmUgaGF2ZSBuby1leGVjIHN1cHBvcnQgYW5kCkBAIC0xNTEsNiArMTUyLDcgQEAKIAkJfQogCX0KIH0KKyNlbmRpZgogCiAvKiBXZSBoYXZlIHByZWVtcHRpb24gZGlzYWJsZWQuLiBzbyBpdCBpcyBzYWZlIHRvIHVzZSBfXyB2ZXJzaW9ucyAqLwogc3RhdGljIGlubGluZSB2b2lkIHNldF9rcHJvYmVfaW5zdGFuY2Uoc3RydWN0IGtwcm9iZSAqa3ApCkBAIC0xNjUsNyArMTY3LDcgQEAKIAogLyoKICAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZWl0aGVyOgotICogCS0gdW5kZXIgdGhlIGtwcm9iZV9sb2NrIHNwaW5sb2NrIC0gZHVyaW5nIGtwcm9iZV9bdW5dcmVnaXN0ZXIoKQorICogCS0gdW5kZXIgdGhlIGtwcm9iZV9tdXRleCAtIGR1cmluZyBrcHJvYmVfW3VuXXJlZ2lzdGVyKCkKICAqIAkJCQlPUgogICogCS0gd2l0aCBwcmVlbXB0aW9uIGRpc2FibGVkIC0gZnJvbSBhcmNoL3h4eC9rZXJuZWwva3Byb2Jlcy5jCiAgKi8KQEAgLTQxOCw3ICs0MjAsNiBAQAogLyoKICAqIFRoaXMgaXMgdGhlIHNlY29uZCBvciBzdWJzZXF1ZW50IGtwcm9iZSBhdCB0aGUgYWRkcmVzcyAtIGhhbmRsZQogICogdGhlIGludHJpY2FjaWVzCi0gKiBUT0RPOiBNb3ZlIGtjYWxsb2Mgb3V0c2lkZSB0aGUgc3Bpbl9sb2NrCiAgKi8KIHN0YXRpYyBpbnQgX19rcHJvYmVzIHJlZ2lzdGVyX2FnZ3Jfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKm9sZF9wLAogCQkJCQkgIHN0cnVjdCBrcHJvYmUgKnApCkBAIC00MzAsNyArNDMxLDcgQEAKIAkJY29weV9rcHJvYmUob2xkX3AsIHApOwogCQlyZXQgPSBhZGRfbmV3X2twcm9iZShvbGRfcCwgcCk7CiAJfSBlbHNlIHsKLQkJYXAgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qga3Byb2JlKSwgR0ZQX0FUT01JQyk7CisJCWFwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGtwcm9iZSksIEdGUF9LRVJORUwpOwogCQlpZiAoIWFwKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJCWFkZF9hZ2dyX2twcm9iZShhcCwgb2xkX3ApOwpAQCAtNDQwLDI1ICs0NDEsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIGtwcm9iZSByZW1vdmFsIGhvdXNlLWtlZXBpbmcgcm91dGluZXMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhbnVwX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCWFyY2hfZGlzYXJtX2twcm9iZShwKTsKLQlobGlzdF9kZWxfcmN1KCZwLT5obGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma3Byb2JlX2xvY2ssIGZsYWdzKTsKLQlhcmNoX3JlbW92ZV9rcHJvYmUocCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhbnVwX2FnZ3Jfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKm9sZF9wLAotCQlzdHJ1Y3Qga3Byb2JlICpwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCWxpc3RfZGVsX3JjdSgmcC0+bGlzdCk7Ci0JaWYgKGxpc3RfZW1wdHkoJm9sZF9wLT5saXN0KSkKLQkJY2xlYW51cF9rcHJvYmUob2xkX3AsIGZsYWdzKTsKLQllbHNlCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmtwcm9iZV9sb2NrLCBmbGFncyk7Ci19Ci0KIHN0YXRpYyBpbnQgX19rcHJvYmVzIGluX2twcm9iZXNfZnVuY3Rpb25zKHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlpZiAoYWRkciA+PSAodW5zaWduZWQgbG9uZylfX2twcm9iZXNfdGV4dF9zdGFydApAQCAtNDY3LDMzICs0NDksNDQgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IF9fa3Byb2JlcyByZWdpc3Rlcl9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3N0YXRpYyBpbnQgX19rcHJvYmVzIF9fcmVnaXN0ZXJfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnAsCisJdW5zaWduZWQgbG9uZyBjYWxsZWRfZnJvbSkKIHsKIAlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAlzdHJ1Y3Qga3Byb2JlICpvbGRfcDsKLQlzdHJ1Y3QgbW9kdWxlICptb2Q7CisJc3RydWN0IG1vZHVsZSAqcHJvYmVkX21vZDsKIAogCWlmICgoIWtlcm5lbF90ZXh0X2FkZHJlc3MoKHVuc2lnbmVkIGxvbmcpIHAtPmFkZHIpKSB8fAogCQlpbl9rcHJvYmVzX2Z1bmN0aW9ucygodW5zaWduZWQgbG9uZykgcC0+YWRkcikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKChtb2QgPSBtb2R1bGVfdGV4dF9hZGRyZXNzKCh1bnNpZ25lZCBsb25nKSBwLT5hZGRyKSkgJiYKLQkJCSh1bmxpa2VseSghdHJ5X21vZHVsZV9nZXQobW9kKSkpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICgocmV0ID0gYXJjaF9wcmVwYXJlX2twcm9iZShwKSkgIT0gMCkKLQkJZ290byBybV9rcHJvYmU7CisJcC0+bW9kX3JlZmNvdW50ZWQgPSAwOworCS8qIENoZWNrIGFyZSB3ZSBwcm9iaW5nIGEgbW9kdWxlICovCisJaWYgKChwcm9iZWRfbW9kID0gbW9kdWxlX3RleHRfYWRkcmVzcygodW5zaWduZWQgbG9uZykgcC0+YWRkcikpKSB7CisJCXN0cnVjdCBtb2R1bGUgKmNhbGxpbmdfbW9kID0gbW9kdWxlX3RleHRfYWRkcmVzcyhjYWxsZWRfZnJvbSk7CisJCS8qIFdlIG11c3QgYWxsb3cgbW9kdWxlcyB0byBwcm9iZSB0aGVtc2VsZiBhbmQKKwkJICogaW4gdGhpcyBjYXNlIGF2b2lkIGluY3JlbWVudGluZyB0aGUgbW9kdWxlIHJlZmNvdW50LAorCQkgKiBzbyBhcyB0byBhbGxvdyB1bmxvYWRpbmcgb2Ygc2VsZiBwcm9iaW5nIG1vZHVsZXMuCisJCSAqLworCQlpZiAoY2FsbGluZ19tb2QgJiYgKGNhbGxpbmdfbW9kICE9IHByb2JlZF9tb2QpKSB7CisJCQlpZiAodW5saWtlbHkoIXRyeV9tb2R1bGVfZ2V0KHByb2JlZF9tb2QpKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXAtPm1vZF9yZWZjb3VudGVkID0gMTsKKwkJfSBlbHNlCisJCQlwcm9iZWRfbW9kID0gTlVMTDsKKwl9CiAKIAlwLT5ubWlzc2VkID0gMDsKLQlzcGluX2xvY2tfaXJxc2F2ZSgma3Byb2JlX2xvY2ssIGZsYWdzKTsKKwlkb3duKCZrcHJvYmVfbXV0ZXgpOwogCW9sZF9wID0gZ2V0X2twcm9iZShwLT5hZGRyKTsKIAlpZiAob2xkX3ApIHsKIAkJcmV0ID0gcmVnaXN0ZXJfYWdncl9rcHJvYmUob2xkX3AsIHApOwogCQlnb3RvIG91dDsKIAl9CiAKLQlhcmNoX2NvcHlfa3Byb2JlKHApOworCWlmICgocmV0ID0gYXJjaF9wcmVwYXJlX2twcm9iZShwKSkgIT0gMCkKKwkJZ290byBvdXQ7CisKIAlJTklUX0hMSVNUX05PREUoJnAtPmhsaXN0KTsKIAlobGlzdF9hZGRfaGVhZF9yY3UoJnAtPmhsaXN0LAogCQkgICAgICAgJmtwcm9iZV90YWJsZVtoYXNoX3B0cihwLT5hZGRyLCBLUFJPQkVfSEFTSF9CSVRTKV0pOwpAQCAtNTAxLDQwICs0OTQsNjYgQEAKICAgCWFyY2hfYXJtX2twcm9iZShwKTsKIAogb3V0OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmtwcm9iZV9sb2NrLCBmbGFncyk7Ci1ybV9rcHJvYmU6Ci0JaWYgKHJldCA9PSAtRUVYSVNUKQotCQlhcmNoX3JlbW92ZV9rcHJvYmUocCk7Ci0JaWYgKHJldCAmJiBtb2QpCi0JCW1vZHVsZV9wdXQobW9kKTsKKwl1cCgma3Byb2JlX211dGV4KTsKKworCWlmIChyZXQgJiYgcHJvYmVkX21vZCkKKwkJbW9kdWxlX3B1dChwcm9iZWRfbW9kKTsKIAlyZXR1cm4gcmV0OwogfQogCitpbnQgX19rcHJvYmVzIHJlZ2lzdGVyX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQoreworCXJldHVybiBfX3JlZ2lzdGVyX2twcm9iZShwLAorCQkodW5zaWduZWQgbG9uZylfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworfQorCiB2b2lkIF9fa3Byb2JlcyB1bnJlZ2lzdGVyX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGtwcm9iZSAqb2xkX3A7CiAJc3RydWN0IG1vZHVsZSAqbW9kOworCXN0cnVjdCBrcHJvYmUgKm9sZF9wLCAqbGlzdF9wOworCWludCBjbGVhbnVwX3A7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgma3Byb2JlX2xvY2ssIGZsYWdzKTsKKwlkb3duKCZrcHJvYmVfbXV0ZXgpOwogCW9sZF9wID0gZ2V0X2twcm9iZShwLT5hZGRyKTsKLQlpZiAob2xkX3ApIHsKLQkJLyogY2xlYW51cF8qX2twcm9iZSgpIGRvZXMgdGhlIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKi8KLQkJaWYgKG9sZF9wLT5wcmVfaGFuZGxlciA9PSBhZ2dyX3ByZV9oYW5kbGVyKQotCQkJY2xlYW51cF9hZ2dyX2twcm9iZShvbGRfcCwgcCwgZmxhZ3MpOwotCQllbHNlCi0JCQljbGVhbnVwX2twcm9iZShwLCBmbGFncyk7CisJaWYgKHVubGlrZWx5KCFvbGRfcCkpIHsKKwkJdXAoJmtwcm9iZV9tdXRleCk7CisJCXJldHVybjsKKwl9CisJaWYgKHAgIT0gb2xkX3ApIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UobGlzdF9wLCAmb2xkX3AtPmxpc3QsIGxpc3QpCisJCQlpZiAobGlzdF9wID09IHApCisJCQkvKiBrcHJvYmUgcCBpcyBhIHZhbGlkIHByb2JlICovCisJCQkJZ290byB2YWxpZF9wOworCQl1cCgma3Byb2JlX211dGV4KTsKKwkJcmV0dXJuOworCX0KK3ZhbGlkX3A6CisJaWYgKChvbGRfcCA9PSBwKSB8fCAoKG9sZF9wLT5wcmVfaGFuZGxlciA9PSBhZ2dyX3ByZV9oYW5kbGVyKSAmJgorCQkocC0+bGlzdC5uZXh0ID09ICZvbGRfcC0+bGlzdCkgJiYKKwkJKHAtPmxpc3QucHJldiA9PSAmb2xkX3AtPmxpc3QpKSkgeworCQkvKiBPbmx5IHByb2JlIG9uIHRoZSBoYXNoIGxpc3QgKi8KKwkJYXJjaF9kaXNhcm1fa3Byb2JlKHApOworCQlobGlzdF9kZWxfcmN1KCZvbGRfcC0+aGxpc3QpOworCQljbGVhbnVwX3AgPSAxOworCX0gZWxzZSB7CisJCWxpc3RfZGVsX3JjdSgmcC0+bGlzdCk7CisJCWNsZWFudXBfcCA9IDA7CisJfQogCi0JCXN5bmNocm9uaXplX3NjaGVkKCk7CisJdXAoJmtwcm9iZV9tdXRleCk7CiAKLQkJaWYgKChtb2QgPSBtb2R1bGVfdGV4dF9hZGRyZXNzKCh1bnNpZ25lZCBsb25nKXAtPmFkZHIpKSkKLQkJCW1vZHVsZV9wdXQobW9kKTsKKwlzeW5jaHJvbml6ZV9zY2hlZCgpOworCWlmIChwLT5tb2RfcmVmY291bnRlZCAmJgorCSAgICAobW9kID0gbW9kdWxlX3RleHRfYWRkcmVzcygodW5zaWduZWQgbG9uZylwLT5hZGRyKSkpCisJCW1vZHVsZV9wdXQobW9kKTsKIAotCQlpZiAob2xkX3AtPnByZV9oYW5kbGVyID09IGFnZ3JfcHJlX2hhbmRsZXIgJiYKLQkJCQlsaXN0X2VtcHR5KCZvbGRfcC0+bGlzdCkpCisJaWYgKGNsZWFudXBfcCkgeworCQlpZiAocCAhPSBvbGRfcCkgeworCQkJbGlzdF9kZWxfcmN1KCZwLT5saXN0KTsKIAkJCWtmcmVlKG9sZF9wKTsKLQl9IGVsc2UKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma3Byb2JlX2xvY2ssIGZsYWdzKTsKKwkJfQorCQlhcmNoX3JlbW92ZV9rcHJvYmUocCk7CisJfQogfQogCiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGtwcm9iZV9leGNlcHRpb25zX25iID0gewpAQCAtNTQ4LDcgKzU2Nyw4IEBACiAJanAtPmtwLnByZV9oYW5kbGVyID0gc2V0am1wX3ByZV9oYW5kbGVyOwogCWpwLT5rcC5icmVha19oYW5kbGVyID0gbG9uZ2ptcF9icmVha19oYW5kbGVyOwogCi0JcmV0dXJuIHJlZ2lzdGVyX2twcm9iZSgmanAtPmtwKTsKKwlyZXR1cm4gX19yZWdpc3Rlcl9rcHJvYmUoJmpwLT5rcCwKKwkJKHVuc2lnbmVkIGxvbmcpX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIH0KIAogdm9pZCBfX2twcm9iZXMgdW5yZWdpc3Rlcl9qcHJvYmUoc3RydWN0IGpwcm9iZSAqanApCkBAIC01ODgsNyArNjA4LDggQEAKIAogCXJwLT5ubWlzc2VkID0gMDsKIAkvKiBFc3RhYmxpc2ggZnVuY3Rpb24gZW50cnkgcHJvYmUgcG9pbnQgKi8KLQlpZiAoKHJldCA9IHJlZ2lzdGVyX2twcm9iZSgmcnAtPmtwKSkgIT0gMCkKKwlpZiAoKHJldCA9IF9fcmVnaXN0ZXJfa3Byb2JlKCZycC0+a3AsCisJCSh1bnNpZ25lZCBsb25nKV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSkpICE9IDApCiAJCWZyZWVfcnBfaW5zdChycCk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9rc3lzZnMuYyBiL2tlcm5lbC9rc3lzZnMuYwppbmRleCA5OWFmOGIwLi5kNWVlYWUwIDEwMDY0NAotLS0gYS9rZXJuZWwva3N5c2ZzLmMKKysrIGIva2VybmVsL2tzeXNmcy5jCkBAIC01MSwxNiArNTEsNiBAQAogS0VSTkVMX0FUVFJfUlcodWV2ZW50X2hlbHBlcik7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19LRVhFQwotI2luY2x1ZGUgPGFzbS9rZXhlYy5oPgotCi1zdGF0aWMgc3NpemVfdCBjcmFzaF9ub3Rlc19zaG93KHN0cnVjdCBzdWJzeXN0ZW0gKnN1YnN5cywgY2hhciAqcGFnZSkKLXsKLQlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJXBcbiIsICh2b2lkICopY3Jhc2hfbm90ZXMpOwotfQotS0VSTkVMX0FUVFJfUk8oY3Jhc2hfbm90ZXMpOwotI2VuZGlmCi0KIGRlY2xfc3Vic3lzKGtlcm5lbCwgTlVMTCwgTlVMTCk7CiBFWFBPUlRfU1lNQk9MX0dQTChrZXJuZWxfc3Vic3lzKTsKIApAQCAtNjksOSArNTksNiBAQAogCSZ1ZXZlbnRfc2VxbnVtX2F0dHIuYXR0ciwKIAkmdWV2ZW50X2hlbHBlcl9hdHRyLmF0dHIsCiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfS0VYRUMKLQkmY3Jhc2hfbm90ZXNfYXR0ci5hdHRyLAotI2VuZGlmCiAJTlVMTAogfTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS5jIGIva2VybmVsL21vZHVsZS5jCmluZGV4IDRiMDZiYmEuLjYxOGVkNmUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tb2R1bGUuYworKysgYi9rZXJuZWwvbW9kdWxlLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpAQCAtNDk2LDE1ICs0OTcsMTUgQEAKIH0KIAogI2lmZGVmIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FECi1zdGF0aWMgaW5saW5lIGludCB0cnlfZm9yY2UodW5zaWduZWQgaW50IGZsYWdzKQorc3RhdGljIGlubGluZSBpbnQgdHJ5X2ZvcmNlX3VubG9hZCh1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJaW50IHJldCA9IChmbGFncyAmIE9fVFJVTkMpOwogCWlmIChyZXQpCi0JCWFkZF90YWludChUQUlOVF9GT1JDRURfTU9EVUxFKTsKKwkJYWRkX3RhaW50KFRBSU5UX0ZPUkNFRF9STU1PRCk7CiAJcmV0dXJuIHJldDsKIH0KICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCB0cnlfZm9yY2UodW5zaWduZWQgaW50IGZsYWdzKQorc3RhdGljIGlubGluZSBpbnQgdHJ5X2ZvcmNlX3VubG9hZCh1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC01MjQsNyArNTI1LDcgQEAKIAogCS8qIElmIGl0J3Mgbm90IHVudXNlZCwgcXVpdCB1bmxlc3Mgd2UgYXJlIHRvbGQgdG8gYmxvY2suICovCiAJaWYgKChzcmVmLT5mbGFncyAmIE9fTk9OQkxPQ0spICYmIG1vZHVsZV9yZWZjb3VudChzcmVmLT5tb2QpICE9IDApIHsKLQkJaWYgKCEoKnNyZWYtPmZvcmNlZCA9IHRyeV9mb3JjZShzcmVmLT5mbGFncykpKQorCQlpZiAoISgqc3JlZi0+Zm9yY2VkID0gdHJ5X2ZvcmNlX3VubG9hZChzcmVmLT5mbGFncykpKQogCQkJcmV0dXJuIC1FV09VTERCTE9DSzsKIAl9CiAKQEAgLTYwOSw3ICs2MTAsNyBAQAogCS8qIElmIGl0IGhhcyBhbiBpbml0IGZ1bmMsIGl0IG11c3QgaGF2ZSBhbiBleGl0IGZ1bmMgdG8gdW5sb2FkICovCiAJaWYgKChtb2QtPmluaXQgIT0gTlVMTCAmJiBtb2QtPmV4aXQgPT0gTlVMTCkKIAkgICAgfHwgbW9kLT51bnNhZmUpIHsKLQkJZm9yY2VkID0gdHJ5X2ZvcmNlKGZsYWdzKTsKKwkJZm9yY2VkID0gdHJ5X2ZvcmNlX3VubG9hZChmbGFncyk7CiAJCWlmICghZm9yY2VkKSB7CiAJCQkvKiBUaGlzIG1vZHVsZSBjYW4ndCBiZSByZW1vdmVkICovCiAJCQlyZXQgPSAtRUJVU1k7CkBAIC05NTgsNyArOTU5LDYgQEAKIAl1bnNpZ25lZCBsb25nIHJldDsKIAljb25zdCB1bnNpZ25lZCBsb25nICpjcmM7CiAKLQlzcGluX2xvY2tfaXJxKCZtb2RsaXN0X2xvY2spOwogCXJldCA9IF9fZmluZF9zeW1ib2wobmFtZSwgJm93bmVyLCAmY3JjLCBtb2QtPmxpY2Vuc2VfZ3Bsb2spOwogCWlmIChyZXQpIHsKIAkJLyogdXNlX21vZHVsZSBjYW4gZmFpbCBkdWUgdG8gT09NLCBvciBtb2R1bGUgdW5sb2FkaW5nICovCkBAIC05NjYsNyArOTY2LDYgQEAKIAkJICAgICF1c2VfbW9kdWxlKG1vZCwgb3duZXIpKQogCQkJcmV0ID0gMDsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtb2RsaXN0X2xvY2spOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEyMDQsNiArMTIwMywzOSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoX19zeW1ib2xfZ2V0KTsKIAorLyoKKyAqIEVuc3VyZSB0aGF0IGFuIGV4cG9ydGVkIHN5bWJvbCBbZ2xvYmFsIG5hbWVzcGFjZV0gZG9lcyBub3QgYWxyZWFkeSBleGlzdAorICogaW4gdGhlIEtlcm5lbCBvciBpbiBzb21lIG90aGVyIG1vZHVsZXMgZXhwb3J0ZWQgc3ltYm9sIHRhYmxlLgorICovCitzdGF0aWMgaW50IHZlcmlmeV9leHBvcnRfc3ltYm9scyhzdHJ1Y3QgbW9kdWxlICptb2QpCit7CisJY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBpLCByZXQgPSAwOworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmNyYzsKKworCWZvciAoaSA9IDA7IGkgPCBtb2QtPm51bV9zeW1zOyBpKyspCisJICAgICAgICBpZiAoX19maW5kX3N5bWJvbChtb2QtPnN5bXNbaV0ubmFtZSwgJm93bmVyLCAmY3JjLCAxKSkgeworCQkJbmFtZSA9IG1vZC0+c3ltc1tpXS5uYW1lOworCQkJcmV0ID0gLUVOT0VYRUM7CisJCQlnb3RvIGR1cDsKKwkJfQorCisJZm9yIChpID0gMDsgaSA8IG1vZC0+bnVtX2dwbF9zeW1zOyBpKyspCisJICAgICAgICBpZiAoX19maW5kX3N5bWJvbChtb2QtPmdwbF9zeW1zW2ldLm5hbWUsICZvd25lciwgJmNyYywgMSkpIHsKKwkJCW5hbWUgPSBtb2QtPmdwbF9zeW1zW2ldLm5hbWU7CisJCQlyZXQgPSAtRU5PRVhFQzsKKwkJCWdvdG8gZHVwOworCQl9CisKK2R1cDoKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBleHBvcnRzIGR1cGxpY2F0ZSBzeW1ib2wgJXMgKG93bmVkIGJ5ICVzKVxuIiwKKwkJCW1vZC0+bmFtZSwgbmFtZSwgbW9kdWxlX25hbWUob3duZXIpKTsKKworCXJldHVybiByZXQ7Cit9CisKIC8qIENoYW5nZSBhbGwgc3ltYm9scyBzbyB0aGF0IHNoX3ZhbHVlIGVuY29kZXMgdGhlIHBvaW50ZXIgZGlyZWN0bHkuICovCiBzdGF0aWMgaW50IHNpbXBsaWZ5X3N5bWJvbHMoRWxmX1NoZHIgKnNlY2hkcnMsCiAJCQkgICAgdW5zaWduZWQgaW50IHN5bWluZGV4LApAQCAtMTcxNSw2ICsxNzQ3LDExIEBACiAJLyogU2V0IHVwIGxpY2Vuc2UgaW5mbyBiYXNlZCBvbiB0aGUgaW5mbyBzZWN0aW9uICovCiAJc2V0X2xpY2Vuc2UobW9kLCBnZXRfbW9kaW5mbyhzZWNoZHJzLCBpbmZvaW5kZXgsICJsaWNlbnNlIikpOwogCisJaWYgKHN0cmNtcChtb2QtPm5hbWUsICJuZGlzd3JhcHBlciIpID09IDApCisJCWFkZF90YWludChUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEUpOworCWlmIChzdHJjbXAobW9kLT5uYW1lLCAiZHJpdmVybG9hZGVyIikgPT0gMCkKKwkJYWRkX3RhaW50KFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRSk7CisKICNpZmRlZiBDT05GSUdfTU9EVUxFX1VOTE9BRAogCS8qIFNldCB1cCBNT0RJTkZPX0FUVFIgZmllbGRzICovCiAJc2V0dXBfbW9kaW5mbyhtb2QsIHNlY2hkcnMsIGluZm9pbmRleCk7CkBAIC0xNzY3LDYgKzE4MDQsMTIgQEAKIAkJCWdvdG8gY2xlYW51cDsKIAl9CiAKKyAgICAgICAgLyogRmluZCBkdXBsaWNhdGUgc3ltYm9scyAqLworCWVyciA9IHZlcmlmeV9leHBvcnRfc3ltYm9scyhtb2QpOworCisJaWYgKGVyciA8IDApCisJCWdvdG8gY2xlYW51cDsKKwogICAJLyogU2V0IHVwIGFuZCBzb3J0IGV4Y2VwdGlvbiB0YWJsZSAqLwogCW1vZC0+bnVtX2V4ZW50cmllcyA9IHNlY2hkcnNbZXhpbmRleF0uc2hfc2l6ZSAvIHNpemVvZigqbW9kLT5leHRhYmxlKTsKIAltb2QtPmV4dGFibGUgPSBleHRhYmxlID0gKHZvaWQgKilzZWNoZHJzW2V4aW5kZXhdLnNoX2FkZHI7CmRpZmYgLS1naXQgYS9rZXJuZWwvbXV0ZXgtZGVidWcuYyBiL2tlcm5lbC9tdXRleC1kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OTEzYzMKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvbXV0ZXgtZGVidWcuYwpAQCAtMCwwICsxLDQ2MiBAQAorLyoKKyAqIGtlcm5lbC9tdXRleC1kZWJ1Zy5jCisgKgorICogRGVidWdnaW5nIGNvZGUgZm9yIG11dGV4ZXMKKyAqCisgKiBTdGFydGVkIGJ5IEluZ28gTW9sbmFyOgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+CisgKgorICogbG9jayBkZWJ1Z2dpbmcsIGxvY2tpbmcgdHJlZSwgZGVhZGxvY2sgZGV0ZWN0aW9uIHN0YXJ0ZWQgYnk6CisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCwgTHludXhXb3JrcywgSW5jLiwgSWdvciBNYW55aWxvdiwgQmlsbCBIdWV5CisgKiAgUmVsZWFzZWQgdW5kZXIgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlICJtdXRleC1kZWJ1Zy5oIgorCisvKgorICogV2UgbmVlZCBhIGdsb2JhbCBsb2NrIHdoZW4gd2Ugd2FsayB0aHJvdWdoIHRoZSBtdWx0aS1wcm9jZXNzCisgKiBsb2NrIHRyZWUuIE9ubHkgdXNlZCBpbiB0aGUgZGVhZGxvY2stZGVidWdnaW5nIGNhc2UuCisgKi8KK0RFRklORV9TUElOTE9DSyhkZWJ1Z19tdXRleF9sb2NrKTsKKworLyoKKyAqIEFsbCBsb2NrcyBoZWxkIGJ5IGFsbCB0YXNrcywgaW4gYSBzaW5nbGUgZ2xvYmFsIGxpc3Q6CisgKi8KK0xJU1RfSEVBRChkZWJ1Z19tdXRleF9oZWxkX2xvY2tzKTsKKworLyoKKyAqIEluIHRoZSBkZWJ1ZyBjYXNlIHdlIGNhcnJ5IHRoZSBjYWxsZXIncyBpbnN0cnVjdGlvbiBwb2ludGVyIGludG8KKyAqIG90aGVyIGZ1bmN0aW9ucywgYnV0IHdlIGRvbnQgd2FudCB0aGUgZnVuY3Rpb24gYXJndW1lbnQgb3ZlcmhlYWQKKyAqIGluIHRoZSBub25kZWJ1ZyBjYXNlIC0gaGVuY2UgdGhlc2UgbWFjcm9zOgorICovCisjZGVmaW5lIF9fSVBfREVDTF9fCQksIHVuc2lnbmVkIGxvbmcgaXAKKyNkZWZpbmUgX19JUF9fCQkJLCBpcAorI2RlZmluZSBfX1JFVF9JUF9fCQksICh1bnNpZ25lZCBsb25nKV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKQorCisvKgorICogIm11dGV4IGRlYnVnZ2luZyBlbmFibGVkIiBmbGFnLiBXZSB0dXJuIGl0IG9mZiB3aGVuIHdlIGRldGVjdAorICogdGhlIGZpcnN0IHByb2JsZW0gYmVjYXVzZSB3ZSBkb250IHdhbnQgdG8gcmVjdXJzZSBiYWNrCisgKiBpbnRvIHRoZSB0cmFjaW5nIGNvZGUgd2hlbiBkb2luZyBlcnJvciBwcmludGsgb3IKKyAqIGV4ZWN1dGluZyBhIEJVRygpOgorICovCitpbnQgZGVidWdfbXV0ZXhfb24gPSAxOworCitzdGF0aWMgdm9pZCBwcmludGtfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJaWYgKHApCisJCXByaW50aygiJTE2czolNWQgWyVwLCAlM2RdIiwgcC0+Y29tbSwgcC0+cGlkLCBwLCBwLT5wcmlvKTsKKwllbHNlCisJCXByaW50aygiPG5vbmU+Iik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50a190aShzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpKQoreworCWlmICh0aSkKKwkJcHJpbnRrX3Rhc2sodGktPnRhc2spOworCWVsc2UKKwkJcHJpbnRrKCI8bm9uZT4iKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRrX3Rhc2tfc2hvcnQoc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCWlmIChwKQorCQlwcmludGsoIiVzLyVkIFslcCwgJTNkXSIsIHAtPmNvbW0sIHAtPnBpZCwgcCwgcC0+cHJpbyk7CisJZWxzZQorCQlwcmludGsoIjxub25lPiIpOworfQorCitzdGF0aWMgdm9pZCBwcmludGtfbG9jayhzdHJ1Y3QgbXV0ZXggKmxvY2ssIGludCBwcmludF9vd25lcikKK3sKKwlwcmludGsoIiBbJXBdIHslc31cbiIsIGxvY2ssIGxvY2stPm5hbWUpOworCisJaWYgKHByaW50X293bmVyICYmIGxvY2stPm93bmVyKSB7CisJCXByaW50aygiLi4gaGVsZCBieTogICIpOworCQlwcmludGtfdGkobG9jay0+b3duZXIpOworCQlwcmludGsoIlxuIik7CisJfQorCWlmIChsb2NrLT5vd25lcikgeworCQlwcmludGsoIi4uLiBhY3F1aXJlZCBhdDogICAgICAgICAgICAgICAiKTsKKwkJcHJpbnRfc3ltYm9sKCIlc1xuIiwgbG9jay0+YWNxdWlyZV9pcCk7CisJfQorfQorCisvKgorICogcHJpbnRrIGxvY2tzIGhlbGQgYnkgYSB0YXNrOgorICovCitzdGF0aWMgdm9pZCBzaG93X3Rhc2tfbG9ja3Moc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXN3aXRjaCAocC0+c3RhdGUpIHsKKwljYXNlIFRBU0tfUlVOTklORzoJCXByaW50aygiUiIpOyBicmVhazsKKwljYXNlIFRBU0tfSU5URVJSVVBUSUJMRToJcHJpbnRrKCJTIik7IGJyZWFrOworCWNhc2UgVEFTS19VTklOVEVSUlVQVElCTEU6CXByaW50aygiRCIpOyBicmVhazsKKwljYXNlIFRBU0tfU1RPUFBFRDoJCXByaW50aygiVCIpOyBicmVhazsKKwljYXNlIEVYSVRfWk9NQklFOgkJcHJpbnRrKCJaIik7IGJyZWFrOworCWNhc2UgRVhJVF9ERUFEOgkJCXByaW50aygiWCIpOyBicmVhazsKKwlkZWZhdWx0OgkJCXByaW50aygiPyIpOyBicmVhazsKKwl9CisJcHJpbnRrX3Rhc2socCk7CisJaWYgKHAtPmJsb2NrZWRfb24pIHsKKwkJc3RydWN0IG11dGV4ICpsb2NrID0gcC0+YmxvY2tlZF9vbi0+bG9jazsKKworCQlwcmludGsoIiBibG9ja2VkIG9uIG11dGV4OiIpOworCQlwcmludGtfbG9jayhsb2NrLCAxKTsKKwl9IGVsc2UKKwkJcHJpbnRrKCIgKG5vdCBibG9ja2VkIG9uIG11dGV4KVxuIik7Cit9CisKKy8qCisgKiBwcmludGsgYWxsIGxvY2tzIGhlbGQgaW4gdGhlIHN5c3RlbSAoaWYgZmlsdGVyID09IE5VTEwpLAorICogb3IgYWxsIGxvY2tzIGJlbG9uZ2luZyB0byBhIHNpbmdsZSB0YXNrIChpZiBmaWx0ZXIgIT0gTlVMTCk6CisgKi8KK3ZvaWQgc2hvd19oZWxkX2xvY2tzKHN0cnVjdCB0YXNrX3N0cnVjdCAqZmlsdGVyKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmN1cnIsICpjdXJzb3IgPSBOVUxMOworCXN0cnVjdCBtdXRleCAqbG9jazsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY291bnQgPSAwOworCisJaWYgKGZpbHRlcikgeworCQlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCXByaW50aygifCBzaG93aW5nIGFsbCBsb2NrcyBoZWxkIGJ5OiB8ICAoIik7CisJCXByaW50a190YXNrX3Nob3J0KGZpbHRlcik7CisJCXByaW50aygiKTpcbiIpOworCQlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlwcmludGsoInwgc2hvd2luZyBhbGwgbG9ja3MgaGVsZDogfFxuIik7CisJCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwl9CisKKwkvKgorCSAqIFBsYXkgc2FmZSBhbmQgYWNxdWlyZSB0aGUgZ2xvYmFsIHRyYWNlIGxvY2suIFdlCisJICogY2Fubm90IHByaW50ayB3aXRoIHRoYXQgbG9jayBoZWxkIHNvIHdlIGl0ZXJhdGUKKwkgKiB2ZXJ5IGNhcmVmdWxseToKKwkgKi8KK25leHQ6CisJZGVidWdfc3Bpbl9sb2NrX3NhdmUoJmRlYnVnX211dGV4X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoKGN1cnIsICZkZWJ1Z19tdXRleF9oZWxkX2xvY2tzKSB7CisJCWlmIChjdXJzb3IgJiYgY3VyciAhPSBjdXJzb3IpCisJCQljb250aW51ZTsKKwkJbG9jayA9IGxpc3RfZW50cnkoY3Vyciwgc3RydWN0IG11dGV4LCBoZWxkX2xpc3QpOworCQl0ID0gbG9jay0+b3duZXI7CisJCWlmIChmaWx0ZXIgJiYgKHQgIT0gZmlsdGVyLT50aHJlYWRfaW5mbykpCisJCQljb250aW51ZTsKKwkJY291bnQrKzsKKwkJY3Vyc29yID0gY3Vyci0+bmV4dDsKKwkJZGVidWdfc3Bpbl9sb2NrX3Jlc3RvcmUoJmRlYnVnX211dGV4X2xvY2ssIGZsYWdzKTsKKworCQlwcmludGsoIlxuIyUwM2Q6ICAgICAgICAgICAgIiwgY291bnQpOworCQlwcmludGtfbG9jayhsb2NrLCBmaWx0ZXIgPyAwIDogMSk7CisJCWdvdG8gbmV4dDsKKwl9CisJZGVidWdfc3Bpbl9sb2NrX3Jlc3RvcmUoJmRlYnVnX211dGV4X2xvY2ssIGZsYWdzKTsKKwlwcmludGsoIlxuIik7Cit9CisKK3ZvaWQgbXV0ZXhfZGVidWdfc2hvd19hbGxfbG9ja3Modm9pZCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmcsICpwOworCWludCBjb3VudCA9IDEwOworCWludCB1bmxvY2sgPSAxOworCisJcHJpbnRrKCJcblNob3dpbmcgYWxsIGJsb2NraW5nIGxvY2tzIGluIHRoZSBzeXN0ZW06XG4iKTsKKworCS8qCisJICogSGVyZSB3ZSB0cnkgdG8gZ2V0IHRoZSB0YXNrbGlzdF9sb2NrIGFzIGhhcmQgYXMgcG9zc2libGUsCisJICogaWYgbm90IHN1Y2Nlc3NmdWwgYWZ0ZXIgMiBzZWNvbmRzIHdlIGlnbm9yZSBpdCAoYnV0IGtlZXAKKwkgKiB0cnlpbmcpLiBUaGlzIGlzIHRvIGVuYWJsZSBhIGRlYnVnIHByaW50b3V0IGV2ZW4gaWYgYQorCSAqIHRhc2tsaXN0X2xvY2staG9sZGluZyB0YXNrIGRlYWRsb2NrcyBvciBjcmFzaGVzLgorCSAqLworcmV0cnk6CisJaWYgKCFyZWFkX3RyeWxvY2soJnRhc2tsaXN0X2xvY2spKSB7CisJCWlmIChjb3VudCA9PSAxMCkKKwkJCXByaW50aygiaG0sIHRhc2tsaXN0X2xvY2sgbG9ja2VkLCByZXRyeWluZy4uLiAiKTsKKwkJaWYgKGNvdW50KSB7CisJCQljb3VudC0tOworCQkJcHJpbnRrKCIgIyVkIiwgMTAtY291bnQpOworCQkJbWRlbGF5KDIwMCk7CisJCQlnb3RvIHJldHJ5OworCQl9CisJCXByaW50aygiIGlnbm9yaW5nIGl0LlxuIik7CisJCXVubG9jayA9IDA7CisJfQorCWlmIChjb3VudCAhPSAxMCkKKwkJcHJpbnRrKCIgbG9ja2VkIGl0LlxuIik7CisKKwlkb19lYWNoX3RocmVhZChnLCBwKSB7CisJCXNob3dfdGFza19sb2NrcyhwKTsKKwkJaWYgKCF1bmxvY2spCisJCQlpZiAocmVhZF90cnlsb2NrKCZ0YXNrbGlzdF9sb2NrKSkKKwkJCQl1bmxvY2sgPSAxOworCX0gd2hpbGVfZWFjaF90aHJlYWQoZywgcCk7CisKKwlwcmludGsoIlxuIik7CisJc2hvd19oZWxkX2xvY2tzKE5VTEwpOworCXByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiIpOworCisJaWYgKHVubG9jaykKKwkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworfQorCitzdGF0aWMgdm9pZCByZXBvcnRfZGVhZGxvY2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgbXV0ZXggKmxvY2ssCisJCQkgICAgc3RydWN0IG11dGV4ICpsb2NrYmxrLCB1bnNpZ25lZCBsb25nIGlwKQoreworCXByaW50aygiXG4lcy8lZCBpcyB0cnlpbmcgdG8gYWNxdWlyZSB0aGlzIGxvY2s6XG4iLAorCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQpOworCXByaW50a19sb2NrKGxvY2ssIDEpOworCXByaW50aygiLi4uIHRyeWluZyBhdDogICAgICAgICAgICAgICAgICIpOworCXByaW50X3N5bWJvbCgiJXNcbiIsIGlwKTsKKwlzaG93X2hlbGRfbG9ja3MoY3VycmVudCk7CisKKwlpZiAobG9ja2JsaykgeworCQlwcmludGsoImJ1dCAlcy8lZCBpcyBkZWFkbG9ja2luZyBjdXJyZW50IHRhc2sgJXMvJWQhXG5cbiIsCisJCQl0YXNrLT5jb21tLCB0YXNrLT5waWQsIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCk7CisJCXByaW50aygiXG4lcy8lZCBpcyBibG9ja2VkIG9uIHRoaXMgbG9jazpcbiIsCisJCQl0YXNrLT5jb21tLCB0YXNrLT5waWQpOworCQlwcmludGtfbG9jayhsb2NrYmxrLCAxKTsKKworCQlzaG93X2hlbGRfbG9ja3ModGFzayk7CisKKwkJcHJpbnRrKCJcbiVzLyVkJ3MgW2Jsb2NrZWRdIHN0YWNrZHVtcDpcblxuIiwKKwkJCXRhc2stPmNvbW0sIHRhc2stPnBpZCk7CisJCXNob3dfc3RhY2sodGFzaywgTlVMTCk7CisJfQorCisJcHJpbnRrKCJcbiVzLyVkJ3MgW2N1cnJlbnRdIHN0YWNrZHVtcDpcblxuIiwKKwkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkKTsKKwlkdW1wX3N0YWNrKCk7CisJbXV0ZXhfZGVidWdfc2hvd19hbGxfbG9ja3MoKTsKKwlwcmludGsoIlsgdHVybmluZyBvZmYgZGVhZGxvY2sgZGV0ZWN0aW9uLiBQbGVhc2UgcmVwb3J0IHRoaXMuIF1cblxuIik7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKK30KKworLyoKKyAqIFJlY3Vyc2l2ZWx5IGNoZWNrIGZvciBtdXRleCBkZWFkbG9ja3M6CisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfZGVhZGxvY2soc3RydWN0IG11dGV4ICpsb2NrLCBpbnQgZGVwdGgsCisJCQkgIHN0cnVjdCB0aHJlYWRfaW5mbyAqdGksIHVuc2lnbmVkIGxvbmcgaXApCit7CisJc3RydWN0IG11dGV4ICpsb2NrYmxrOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKworCWlmICghZGVidWdfbXV0ZXhfb24pCisJCXJldHVybiAwOworCisJdGkgPSBsb2NrLT5vd25lcjsKKwlpZiAoIXRpKQorCQlyZXR1cm4gMDsKKworCXRhc2sgPSB0aS0+dGFzazsKKwlsb2NrYmxrID0gTlVMTDsKKwlpZiAodGFzay0+YmxvY2tlZF9vbikKKwkJbG9ja2JsayA9IHRhc2stPmJsb2NrZWRfb24tPmxvY2s7CisKKwkvKiBTZWxmLWRlYWRsb2NrOiAqLworCWlmIChjdXJyZW50ID09IHRhc2spIHsKKwkJREVCVUdfT0ZGKCk7CisJCWlmIChkZXB0aCkKKwkJCXJldHVybiAxOworCQlwcmludGsoIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKwkJcHJpbnRrKCAgIlsgQlVHOiBsb2NrIHJlY3Vyc2lvbiBkZWFkbG9jayBkZXRlY3RlZCEgfFxuIik7CisJCXByaW50ayggICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlyZXBvcnRfZGVhZGxvY2sodGFzaywgbG9jaywgTlVMTCwgaXApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBVZ2gsIHNvbWV0aGluZyBjb3JydXB0ZWQgdGhlIGxvY2sgZGF0YSBzdHJ1Y3R1cmU/ICovCisJaWYgKGRlcHRoID4gMjApIHsKKwkJREVCVUdfT0ZGKCk7CisJCXByaW50aygiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKwkJcHJpbnRrKCAgIlsgQlVHOiBpbmZpbml0ZSBsb2NrIGRlcGVuZGVuY3kgZGV0ZWN0ZWQhPyB8XG4iKTsKKwkJcHJpbnRrKCAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlyZXBvcnRfZGVhZGxvY2sodGFzaywgbG9jaywgbG9ja2JsaywgaXApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBSZWN1cnNpdmVseSBjaGVjayBmb3IgZGVwZW5kZW5jaWVzOiAqLworCWlmIChsb2NrYmxrICYmIGNoZWNrX2RlYWRsb2NrKGxvY2tibGssIGRlcHRoKzEsIHRpLCBpcCkpIHsKKwkJcHJpbnRrKCJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKwkJcHJpbnRrKCAgIlsgQlVHOiBjaXJjdWxhciBsb2NraW5nIGRlYWRsb2NrIGRldGVjdGVkISBdXG4iKTsKKwkJcHJpbnRrKCAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwkJcmVwb3J0X2RlYWRsb2NrKHRhc2ssIGxvY2ssIGxvY2tibGssIGlwKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gYSB0YXNrIGV4aXRzLCB0aGlzIGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIHRoZQorICogdGFzayBpcyBob2xkaW5nIGFueSBsb2NrcywgYW5kIHJlcG9ydHMgdGhlIGZpcnN0IG9uZSBpZiBzbzoKKyAqLwordm9pZCBtdXRleF9kZWJ1Z19jaGVja19ub19sb2Nrc19oZWxkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpjdXJyLCAqbmV4dDsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbXV0ZXggKmxvY2s7CisKKwlpZiAoIWRlYnVnX211dGV4X29uKQorCQlyZXR1cm47CisKKwlkZWJ1Z19zcGluX2xvY2tfc2F2ZSgmZGVidWdfbXV0ZXhfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfc2FmZShjdXJyLCBuZXh0LCAmZGVidWdfbXV0ZXhfaGVsZF9sb2NrcykgeworCQlsb2NrID0gbGlzdF9lbnRyeShjdXJyLCBzdHJ1Y3QgbXV0ZXgsIGhlbGRfbGlzdCk7CisJCXQgPSBsb2NrLT5vd25lcjsKKwkJaWYgKHQgIT0gdGFzay0+dGhyZWFkX2luZm8pCisJCQljb250aW51ZTsKKwkJbGlzdF9kZWxfaW5pdChjdXJyKTsKKwkJREVCVUdfT0ZGKCk7CisJCWRlYnVnX3NwaW5fbG9ja19yZXN0b3JlKCZkZWJ1Z19tdXRleF9sb2NrLCBmbGFncyk7CisKKwkJcHJpbnRrKCJCVUc6ICVzLyVkLCBsb2NrIGhlbGQgYXQgdGFzayBleGl0IHRpbWUhXG4iLAorCQkJdGFzay0+Y29tbSwgdGFzay0+cGlkKTsKKwkJcHJpbnRrX2xvY2sobG9jaywgMSk7CisJCWlmIChsb2NrLT5vd25lciAhPSB0YXNrLT50aHJlYWRfaW5mbykKKwkJCXByaW50aygiZXhpdGluZyB0YXNrIGlzIG5vdCBldmVuIHRoZSBvd25lcj8/XG4iKTsKKwkJcmV0dXJuOworCX0KKwlkZWJ1Z19zcGluX2xvY2tfcmVzdG9yZSgmZGVidWdfbXV0ZXhfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogQ2FsbGVkIHdoZW4ga2VybmVsIG1lbW9yeSBpcyBmcmVlZCAob3IgdW5tYXBwZWQpLCBvciBpZiBhIG11dGV4CisgKiBpcyBkZXN0cm95ZWQgb3IgcmVpbml0aWFsaXplZCAtIHRoaXMgY29kZSBjaGVja3Mgd2hldGhlciB0aGVyZSBpcworICogYW55IGhlbGQgbG9jayBpbiB0aGUgbWVtb3J5IHJhbmdlIG9mIDxmcm9tPiB0byA8dG8+OgorICovCit2b2lkIG11dGV4X2RlYnVnX2NoZWNrX25vX2xvY2tzX2ZyZWVkKGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmN1cnIsICpuZXh0OworCWNvbnN0IHZvaWQgKnRvID0gZnJvbSArIGxlbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBtdXRleCAqbG9jazsKKwl2b2lkICpsb2NrX2FkZHI7CisKKwlpZiAoIWRlYnVnX211dGV4X29uKQorCQlyZXR1cm47CisKKwlkZWJ1Z19zcGluX2xvY2tfc2F2ZSgmZGVidWdfbXV0ZXhfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfc2FmZShjdXJyLCBuZXh0LCAmZGVidWdfbXV0ZXhfaGVsZF9sb2NrcykgeworCQlsb2NrID0gbGlzdF9lbnRyeShjdXJyLCBzdHJ1Y3QgbXV0ZXgsIGhlbGRfbGlzdCk7CisJCWxvY2tfYWRkciA9IGxvY2s7CisJCWlmIChsb2NrX2FkZHIgPCBmcm9tIHx8IGxvY2tfYWRkciA+PSB0bykKKwkJCWNvbnRpbnVlOworCQlsaXN0X2RlbF9pbml0KGN1cnIpOworCQlERUJVR19PRkYoKTsKKwkJZGVidWdfc3Bpbl9sb2NrX3Jlc3RvcmUoJmRlYnVnX211dGV4X2xvY2ssIGZsYWdzKTsKKworCQlwcmludGsoIkJVRzogJXMvJWQsIGFjdGl2ZSBsb2NrIFslcCglcC0lcCldIGZyZWVkIVxuIiwKKwkJCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgbG9jaywgZnJvbSwgdG8pOworCQlkdW1wX3N0YWNrKCk7CisJCXByaW50a19sb2NrKGxvY2ssIDEpOworCQlpZiAobG9jay0+b3duZXIgIT0gY3VycmVudF90aHJlYWRfaW5mbygpKQorCQkJcHJpbnRrKCJmcmVlaW5nIHRhc2sgaXMgbm90IGV2ZW4gdGhlIG93bmVyPz9cbiIpOworCQlyZXR1cm47CisJfQorCWRlYnVnX3NwaW5fbG9ja19yZXN0b3JlKCZkZWJ1Z19tdXRleF9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGxvY2stPndhaXRfbG9jayBoZWxkLgorICovCit2b2lkIGRlYnVnX211dGV4X3NldF9vd25lcihzdHJ1Y3QgbXV0ZXggKmxvY2ssCisJCQkgICBzdHJ1Y3QgdGhyZWFkX2luZm8gKm5ld19vd25lciBfX0lQX0RFQ0xfXykKK3sKKwlsb2NrLT5vd25lciA9IG5ld19vd25lcjsKKwlERUJVR19XQVJOX09OKCFsaXN0X2VtcHR5KCZsb2NrLT5oZWxkX2xpc3QpKTsKKwlpZiAoZGVidWdfbXV0ZXhfb24pIHsKKwkJbGlzdF9hZGRfdGFpbCgmbG9jay0+aGVsZF9saXN0LCAmZGVidWdfbXV0ZXhfaGVsZF9sb2Nrcyk7CisJCWxvY2stPmFjcXVpcmVfaXAgPSBpcDsKKwl9Cit9CisKK3ZvaWQgZGVidWdfbXV0ZXhfaW5pdF93YWl0ZXIoc3RydWN0IG11dGV4X3dhaXRlciAqd2FpdGVyKQoreworCW1lbXNldCh3YWl0ZXIsIDB4MTEsIHNpemVvZigqd2FpdGVyKSk7CisJd2FpdGVyLT5tYWdpYyA9IHdhaXRlcjsKKwlJTklUX0xJU1RfSEVBRCgmd2FpdGVyLT5saXN0KTsKK30KKwordm9pZCBkZWJ1Z19tdXRleF93YWtlX3dhaXRlcihzdHJ1Y3QgbXV0ZXggKmxvY2ssIHN0cnVjdCBtdXRleF93YWl0ZXIgKndhaXRlcikKK3sKKwlTTVBfREVCVUdfV0FSTl9PTighc3Bpbl9pc19sb2NrZWQoJmxvY2stPndhaXRfbG9jaykpOworCURFQlVHX1dBUk5fT04obGlzdF9lbXB0eSgmbG9jay0+d2FpdF9saXN0KSk7CisJREVCVUdfV0FSTl9PTih3YWl0ZXItPm1hZ2ljICE9IHdhaXRlcik7CisJREVCVUdfV0FSTl9PTihsaXN0X2VtcHR5KCZ3YWl0ZXItPmxpc3QpKTsKK30KKwordm9pZCBkZWJ1Z19tdXRleF9mcmVlX3dhaXRlcihzdHJ1Y3QgbXV0ZXhfd2FpdGVyICp3YWl0ZXIpCit7CisJREVCVUdfV0FSTl9PTighbGlzdF9lbXB0eSgmd2FpdGVyLT5saXN0KSk7CisJbWVtc2V0KHdhaXRlciwgMHgyMiwgc2l6ZW9mKCp3YWl0ZXIpKTsKK30KKwordm9pZCBkZWJ1Z19tdXRleF9hZGRfd2FpdGVyKHN0cnVjdCBtdXRleCAqbG9jaywgc3RydWN0IG11dGV4X3dhaXRlciAqd2FpdGVyLAorCQkJICAgIHN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgX19JUF9ERUNMX18pCit7CisJU01QX0RFQlVHX1dBUk5fT04oIXNwaW5faXNfbG9ja2VkKCZsb2NrLT53YWl0X2xvY2spKTsKKwljaGVja19kZWFkbG9jayhsb2NrLCAwLCB0aSwgaXApOworCS8qIE1hcmsgdGhlIGN1cnJlbnQgdGhyZWFkIGFzIGJsb2NrZWQgb24gdGhlIGxvY2s6ICovCisJdGktPnRhc2stPmJsb2NrZWRfb24gPSB3YWl0ZXI7CisJd2FpdGVyLT5sb2NrID0gbG9jazsKK30KKwordm9pZCBtdXRleF9yZW1vdmVfd2FpdGVyKHN0cnVjdCBtdXRleCAqbG9jaywgc3RydWN0IG11dGV4X3dhaXRlciAqd2FpdGVyLAorCQkJIHN0cnVjdCB0aHJlYWRfaW5mbyAqdGkpCit7CisJREVCVUdfV0FSTl9PTihsaXN0X2VtcHR5KCZ3YWl0ZXItPmxpc3QpKTsKKwlERUJVR19XQVJOX09OKHdhaXRlci0+dGFzayAhPSB0aS0+dGFzayk7CisJREVCVUdfV0FSTl9PTih0aS0+dGFzay0+YmxvY2tlZF9vbiAhPSB3YWl0ZXIpOworCXRpLT50YXNrLT5ibG9ja2VkX29uID0gTlVMTDsKKworCWxpc3RfZGVsX2luaXQoJndhaXRlci0+bGlzdCk7CisJd2FpdGVyLT50YXNrID0gTlVMTDsKK30KKwordm9pZCBkZWJ1Z19tdXRleF91bmxvY2soc3RydWN0IG11dGV4ICpsb2NrKQoreworCURFQlVHX1dBUk5fT04obG9jay0+bWFnaWMgIT0gbG9jayk7CisJREVCVUdfV0FSTl9PTighbG9jay0+d2FpdF9saXN0LnByZXYgJiYgIWxvY2stPndhaXRfbGlzdC5uZXh0KTsKKwlERUJVR19XQVJOX09OKGxvY2stPm93bmVyICE9IGN1cnJlbnRfdGhyZWFkX2luZm8oKSk7CisJaWYgKGRlYnVnX211dGV4X29uKSB7CisJCURFQlVHX1dBUk5fT04obGlzdF9lbXB0eSgmbG9jay0+aGVsZF9saXN0KSk7CisJCWxpc3RfZGVsX2luaXQoJmxvY2stPmhlbGRfbGlzdCk7CisJfQorfQorCit2b2lkIGRlYnVnX211dGV4X2luaXQoc3RydWN0IG11dGV4ICpsb2NrLCBjb25zdCBjaGFyICpuYW1lKQoreworCS8qCisJICogTWFrZSBzdXJlIHdlIGFyZSBub3QgcmVpbml0aWFsaXppbmcgYSBoZWxkIGxvY2s6CisJICovCisJbXV0ZXhfZGVidWdfY2hlY2tfbm9fbG9ja3NfZnJlZWQoKHZvaWQgKilsb2NrLCBzaXplb2YoKmxvY2spKTsKKwlsb2NrLT5vd25lciA9IE5VTEw7CisJSU5JVF9MSVNUX0hFQUQoJmxvY2stPmhlbGRfbGlzdCk7CisJbG9jay0+bmFtZSA9IG5hbWU7CisJbG9jay0+bWFnaWMgPSBsb2NrOworfQorCisvKioqCisgKiBtdXRleF9kZXN0cm95IC0gbWFyayBhIG11dGV4IHVudXNhYmxlCisgKiBAbG9jazogdGhlIG11dGV4IHRvIGJlIGRlc3Ryb3llZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gbWFya3MgdGhlIG11dGV4IHVuaW5pdGlhbGl6ZWQsIGFuZCBhbnkgc3Vic2VxdWVudAorICogdXNlIG9mIHRoZSBtdXRleCBpcyBmb3JiaWRkZW4uIFRoZSBtdXRleCBtdXN0IG5vdCBiZSBsb2NrZWQgd2hlbgorICogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCisgKi8KK3ZvaWQgZmFzdGNhbGwgbXV0ZXhfZGVzdHJveShzdHJ1Y3QgbXV0ZXggKmxvY2spCit7CisJREVCVUdfV0FSTl9PTihtdXRleF9pc19sb2NrZWQobG9jaykpOworCWxvY2stPm1hZ2ljID0gTlVMTDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwobXV0ZXhfZGVzdHJveSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvbXV0ZXgtZGVidWcuaCBiL2tlcm5lbC9tdXRleC1kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMzg0MDUKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvbXV0ZXgtZGVidWcuaApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIE11dGV4ZXM6IGJsb2NraW5nIG11dHVhbCBleGNsdXNpb24gbG9ja3MKKyAqCisgKiBzdGFydGVkIGJ5IEluZ28gTW9sbmFyOgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+CisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIG11dGV4IGRlYnVnZ2luZyByZWxhdGVkIGludGVybmFsIGRlY2xhcmF0aW9ucywKKyAqIHByb3RvdHlwZXMgYW5kIGlubGluZSBmdW5jdGlvbnMsIGZvciB0aGUgQ09ORklHX0RFQlVHX01VVEVYRVMgY2FzZS4KKyAqIE1vcmUgZGV0YWlscyBhcmUgaW4ga2VybmVsL211dGV4LWRlYnVnLmMuCisgKi8KKworZXh0ZXJuIHNwaW5sb2NrX3QgZGVidWdfbXV0ZXhfbG9jazsKK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGRlYnVnX211dGV4X2hlbGRfbG9ja3M7CitleHRlcm4gaW50IGRlYnVnX211dGV4X29uOworCisvKgorICogSW4gdGhlIGRlYnVnIGNhc2Ugd2UgY2FycnkgdGhlIGNhbGxlcidzIGluc3RydWN0aW9uIHBvaW50ZXIgaW50bworICogb3RoZXIgZnVuY3Rpb25zLCBidXQgd2UgZG9udCB3YW50IHRoZSBmdW5jdGlvbiBhcmd1bWVudCBvdmVyaGVhZAorICogaW4gdGhlIG5vbmRlYnVnIGNhc2UgLSBoZW5jZSB0aGVzZSBtYWNyb3M6CisgKi8KKyNkZWZpbmUgX19JUF9ERUNMX18JCSwgdW5zaWduZWQgbG9uZyBpcAorI2RlZmluZSBfX0lQX18JCQksIGlwCisjZGVmaW5lIF9fUkVUX0lQX18JCSwgKHVuc2lnbmVkIGxvbmcpX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApCisKKy8qCisgKiBUaGlzIG11c3QgYmUgY2FsbGVkIHdpdGggbG9jay0+d2FpdF9sb2NrIGhlbGQuCisgKi8KK2V4dGVybiB2b2lkIGRlYnVnX211dGV4X3NldF9vd25lcihzdHJ1Y3QgbXV0ZXggKmxvY2ssCisJCQkJICBzdHJ1Y3QgdGhyZWFkX2luZm8gKm5ld19vd25lciBfX0lQX0RFQ0xfXyk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z19tdXRleF9jbGVhcl9vd25lcihzdHJ1Y3QgbXV0ZXggKmxvY2spCit7CisJbG9jay0+b3duZXIgPSBOVUxMOworfQorCitleHRlcm4gdm9pZCBkZWJ1Z19tdXRleF9pbml0X3dhaXRlcihzdHJ1Y3QgbXV0ZXhfd2FpdGVyICp3YWl0ZXIpOworZXh0ZXJuIHZvaWQgZGVidWdfbXV0ZXhfd2FrZV93YWl0ZXIoc3RydWN0IG11dGV4ICpsb2NrLAorCQkJCSAgICBzdHJ1Y3QgbXV0ZXhfd2FpdGVyICp3YWl0ZXIpOworZXh0ZXJuIHZvaWQgZGVidWdfbXV0ZXhfZnJlZV93YWl0ZXIoc3RydWN0IG11dGV4X3dhaXRlciAqd2FpdGVyKTsKK2V4dGVybiB2b2lkIGRlYnVnX211dGV4X2FkZF93YWl0ZXIoc3RydWN0IG11dGV4ICpsb2NrLAorCQkJCSAgIHN0cnVjdCBtdXRleF93YWl0ZXIgKndhaXRlciwKKwkJCQkgICBzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpIF9fSVBfREVDTF9fKTsKK2V4dGVybiB2b2lkIG11dGV4X3JlbW92ZV93YWl0ZXIoc3RydWN0IG11dGV4ICpsb2NrLCBzdHJ1Y3QgbXV0ZXhfd2FpdGVyICp3YWl0ZXIsCisJCQkJc3RydWN0IHRocmVhZF9pbmZvICp0aSk7CitleHRlcm4gdm9pZCBkZWJ1Z19tdXRleF91bmxvY2soc3RydWN0IG11dGV4ICpsb2NrKTsKK2V4dGVybiB2b2lkIGRlYnVnX211dGV4X2luaXQoc3RydWN0IG11dGV4ICpsb2NrLCBjb25zdCBjaGFyICpuYW1lKTsKKworI2RlZmluZSBkZWJ1Z19zcGluX2xvY2sobG9jaykJCQkJXAorCWRvIHsJCQkJCQlcCisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CQkJXAorCQlpZiAoZGVidWdfbXV0ZXhfb24pCQkJXAorCQkJc3Bpbl9sb2NrKGxvY2spOwkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgZGVidWdfc3Bpbl91bmxvY2sobG9jaykJCQkJXAorCWRvIHsJCQkJCQlcCisJCWlmIChkZWJ1Z19tdXRleF9vbikJCQlcCisJCQlzcGluX3VubG9jayhsb2NrKTsJCVwKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOwkJCVwKKwkJcHJlZW1wdF9jaGVja19yZXNjaGVkKCk7CQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBkZWJ1Z19zcGluX2xvY2tfc2F2ZShsb2NrLCBmbGFncykJCVwKKwlkbyB7CQkJCQkJXAorCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CQkJXAorCQlpZiAoZGVidWdfbXV0ZXhfb24pCQkJXAorCQkJc3Bpbl9sb2NrKGxvY2spOwkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgZGVidWdfc3Bpbl9sb2NrX3Jlc3RvcmUobG9jaywgZmxhZ3MpCQlcCisJZG8gewkJCQkJCVwKKwkJaWYgKGRlYnVnX211dGV4X29uKQkJCVwKKwkJCXNwaW5fdW5sb2NrKGxvY2spOwkJXAorCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CQlcCisJCXByZWVtcHRfY2hlY2tfcmVzY2hlZCgpOwkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgc3Bpbl9sb2NrX211dGV4KGxvY2spCQkJCVwKKwlkbyB7CQkJCQkJXAorCQlzdHJ1Y3QgbXV0ZXggKmwgPSBjb250YWluZXJfb2YobG9jaywgc3RydWN0IG11dGV4LCB3YWl0X2xvY2spOyBcCisJCQkJCQkJXAorCQlERUJVR19XQVJOX09OKGluX2ludGVycnVwdCgpKTsJCVwKKwkJZGVidWdfc3Bpbl9sb2NrKCZkZWJ1Z19tdXRleF9sb2NrKTsJXAorCQlzcGluX2xvY2sobG9jayk7CQkJXAorCQlERUJVR19XQVJOX09OKGwtPm1hZ2ljICE9IGwpOwkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgc3Bpbl91bmxvY2tfbXV0ZXgobG9jaykJCQkJXAorCWRvIHsJCQkJCQlcCisJCXNwaW5fdW5sb2NrKGxvY2spOwkJCVwKKwkJZGVidWdfc3Bpbl91bmxvY2soJmRlYnVnX211dGV4X2xvY2spOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBERUJVR19PRkYoKQkJCQkJXAorZG8gewkJCQkJCQlcCisJaWYgKGRlYnVnX211dGV4X29uKSB7CQkJCVwKKwkJZGVidWdfbXV0ZXhfb24gPSAwOwkJCVwKKwkJY29uc29sZV92ZXJib3NlKCk7CQkJXAorCQlpZiAoc3Bpbl9pc19sb2NrZWQoJmRlYnVnX211dGV4X2xvY2spKQlcCisJCQlzcGluX3VubG9jaygmZGVidWdfbXV0ZXhfbG9jayk7CVwKKwl9CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBERUJVR19CVUcoKQkJCQkJXAorZG8gewkJCQkJCQlcCisJaWYgKGRlYnVnX211dGV4X29uKSB7CQkJCVwKKwkJREVCVUdfT0ZGKCk7CQkJCVwKKwkJQlVHKCk7CQkJCQlcCisJfQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgREVCVUdfV0FSTl9PTihjKQkJCQlcCitkbyB7CQkJCQkJCVwKKwlpZiAodW5saWtlbHkoYyAmJiBkZWJ1Z19tdXRleF9vbikpIHsJCVwKKwkJREVCVUdfT0ZGKCk7CQkJCVwKKwkJV0FSTl9PTigxKTsJCQkJXAorCX0JCQkJCQlcCit9IHdoaWxlICgwKQorCisjIGRlZmluZSBERUJVR19CVUdfT04oYykJCQkJXAorZG8gewkJCQkJCQlcCisJaWYgKHVubGlrZWx5KGMpKQkJCQlcCisJCURFQlVHX0JVRygpOwkJCQlcCit9IHdoaWxlICgwKQorCisjaWZkZWYgQ09ORklHX1NNUAorIyBkZWZpbmUgU01QX0RFQlVHX1dBUk5fT04oYykJCQlERUJVR19XQVJOX09OKGMpCisjIGRlZmluZSBTTVBfREVCVUdfQlVHX09OKGMpCQkJREVCVUdfQlVHX09OKGMpCisjZWxzZQorIyBkZWZpbmUgU01QX0RFQlVHX1dBUk5fT04oYykJCQlkbyB7IH0gd2hpbGUgKDApCisjIGRlZmluZSBTTVBfREVCVUdfQlVHX09OKGMpCQkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2tlcm5lbC9tdXRleC5jIGIva2VybmVsL211dGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0OWIyMQotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9tdXRleC5jCkBAIC0wLDAgKzEsMzE1IEBACisvKgorICoga2VybmVsL211dGV4LmMKKyAqCisgKiBNdXRleGVzOiBibG9ja2luZyBtdXR1YWwgZXhjbHVzaW9uIGxvY2tzCisgKgorICogU3RhcnRlZCBieSBJbmdvIE1vbG5hcjoKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2IFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPgorICoKKyAqIE1hbnkgdGhhbmtzIHRvIEFyamFuIHZhbiBkZSBWZW4sIFRob21hcyBHbGVpeG5lciwgU3RldmVuIFJvc3RlZHQgYW5kCisgKiBEYXZpZCBIb3dlbGxzIGZvciBzdWdnZXN0aW9ucyBhbmQgaW1wcm92ZW1lbnRzLgorICoKKyAqIEFsc28gc2VlIERvY3VtZW50YXRpb24vbXV0ZXgtZGVzaWduLnR4dC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisvKgorICogSW4gdGhlIERFQlVHIGNhc2Ugd2UgYXJlIHVzaW5nIHRoZSAiTlVMTCBmYXN0cGF0aCIgZm9yIG11dGV4ZXMsCisgKiB3aGljaCBmb3JjZXMgYWxsIGNhbGxzIGludG8gdGhlIHNsb3dwYXRoOgorICovCisjaWZkZWYgQ09ORklHX0RFQlVHX01VVEVYRVMKKyMgaW5jbHVkZSAibXV0ZXgtZGVidWcuaCIKKyMgaW5jbHVkZSA8YXNtLWdlbmVyaWMvbXV0ZXgtbnVsbC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAibXV0ZXguaCIKKyMgaW5jbHVkZSA8YXNtL211dGV4Lmg+CisjZW5kaWYKKworLyoqKgorICogbXV0ZXhfaW5pdCAtIGluaXRpYWxpemUgdGhlIG11dGV4CisgKiBAbG9jazogdGhlIG11dGV4IHRvIGJlIGluaXRpYWxpemVkCisgKgorICogSW5pdGlhbGl6ZSB0aGUgbXV0ZXggdG8gdW5sb2NrZWQgc3RhdGUuCisgKgorICogSXQgaXMgbm90IGFsbG93ZWQgdG8gaW5pdGlhbGl6ZSBhbiBhbHJlYWR5IGxvY2tlZCBtdXRleC4KKyAqLwordm9pZCBmYXN0Y2FsbCBfX211dGV4X2luaXQoc3RydWN0IG11dGV4ICpsb2NrLCBjb25zdCBjaGFyICpuYW1lKQoreworCWF0b21pY19zZXQoJmxvY2stPmNvdW50LCAxKTsKKwlzcGluX2xvY2tfaW5pdCgmbG9jay0+d2FpdF9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmbG9jay0+d2FpdF9saXN0KTsKKworCWRlYnVnX211dGV4X2luaXQobG9jaywgbmFtZSk7Cit9CisKK0VYUE9SVF9TWU1CT0woX19tdXRleF9pbml0KTsKKworLyoKKyAqIFdlIHNwbGl0IHRoZSBtdXRleCBsb2NrL3VubG9jayBsb2dpYyBpbnRvIHNlcGFyYXRlIGZhc3RwYXRoIGFuZAorICogc2xvd3BhdGggZnVuY3Rpb25zLCB0byByZWR1Y2UgdGhlIHJlZ2lzdGVyIHByZXNzdXJlIG9uIHRoZSBmYXN0cGF0aC4KKyAqIFdlIGFsc28gcHV0IHRoZSBmYXN0cGF0aCBmaXJzdCBpbiB0aGUga2VybmVsIGltYWdlLCB0byBtYWtlIHN1cmUgdGhlCisgKiBicmFuY2ggaXMgcHJlZGljdGVkIGJ5IHRoZSBDUFUgYXMgZGVmYXVsdC11bnRha2VuLgorICovCitzdGF0aWMgdm9pZCBmYXN0Y2FsbCBub2lubGluZSBfX3NjaGVkCitfX211dGV4X2xvY2tfc2xvd3BhdGgoYXRvbWljX3QgKmxvY2tfY291bnQgX19JUF9ERUNMX18pOworCisvKioqCisgKiBtdXRleF9sb2NrIC0gYWNxdWlyZSB0aGUgbXV0ZXgKKyAqIEBsb2NrOiB0aGUgbXV0ZXggdG8gYmUgYWNxdWlyZWQKKyAqCisgKiBMb2NrIHRoZSBtdXRleCBleGNsdXNpdmVseSBmb3IgdGhpcyB0YXNrLiBJZiB0aGUgbXV0ZXggaXMgbm90CisgKiBhdmFpbGFibGUgcmlnaHQgbm93LCBpdCB3aWxsIHNsZWVwIHVudGlsIGl0IGNhbiBnZXQgaXQuCisgKgorICogVGhlIG11dGV4IG11c3QgbGF0ZXIgb24gYmUgcmVsZWFzZWQgYnkgdGhlIHNhbWUgdGFzayB0aGF0CisgKiBhY3F1aXJlZCBpdC4gUmVjdXJzaXZlIGxvY2tpbmcgaXMgbm90IGFsbG93ZWQuIFRoZSB0YXNrCisgKiBtYXkgbm90IGV4aXQgd2l0aG91dCBmaXJzdCB1bmxvY2tpbmcgdGhlIG11dGV4LiBBbHNvLCBrZXJuZWwKKyAqIG1lbW9yeSB3aGVyZSB0aGUgbXV0ZXggcmVzaWRlcyBtdXRleCBtdXN0IG5vdCBiZSBmcmVlZCB3aXRoCisgKiB0aGUgbXV0ZXggc3RpbGwgbG9ja2VkLiBUaGUgbXV0ZXggbXVzdCBmaXJzdCBiZSBpbml0aWFsaXplZAorICogKG9yIHN0YXRpY2FsbHkgZGVmaW5lZCkgYmVmb3JlIGl0IGNhbiBiZSBsb2NrZWQuIG1lbXNldCgpLWluZworICogdGhlIG11dGV4IHRvIDAgaXMgbm90IGFsbG93ZWQuCisgKgorICogKCBUaGUgQ09ORklHX0RFQlVHX01VVEVYRVMgLmNvbmZpZyBvcHRpb24gdHVybnMgb24gZGVidWdnaW5nCisgKiAgIGNoZWNrcyB0aGF0IHdpbGwgZW5mb3JjZSB0aGUgcmVzdHJpY3Rpb25zIGFuZCB3aWxsIGFsc28gZG8KKyAqICAgZGVhZGxvY2sgZGVidWdnaW5nLiApCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIChidXQgbm90IGVxdWl2YWxlbnQgdG8pIGRvd24oKS4KKyAqLwordm9pZCBmYXN0Y2FsbCBfX3NjaGVkIG11dGV4X2xvY2soc3RydWN0IG11dGV4ICpsb2NrKQoreworCW1pZ2h0X3NsZWVwKCk7CisJLyoKKwkgKiBUaGUgbG9ja2luZyBmYXN0cGF0aCBpcyB0aGUgMS0+MCB0cmFuc2l0aW9uIGZyb20KKwkgKiAndW5sb2NrZWQnIGludG8gJ2xvY2tlZCcgc3RhdGUuCisJICovCisJX19tdXRleF9mYXN0cGF0aF9sb2NrKCZsb2NrLT5jb3VudCwgX19tdXRleF9sb2NrX3Nsb3dwYXRoKTsKK30KKworRVhQT1JUX1NZTUJPTChtdXRleF9sb2NrKTsKKworc3RhdGljIHZvaWQgZmFzdGNhbGwgbm9pbmxpbmUgX19zY2hlZAorX19tdXRleF91bmxvY2tfc2xvd3BhdGgoYXRvbWljX3QgKmxvY2tfY291bnQgX19JUF9ERUNMX18pOworCisvKioqCisgKiBtdXRleF91bmxvY2sgLSByZWxlYXNlIHRoZSBtdXRleAorICogQGxvY2s6IHRoZSBtdXRleCB0byBiZSByZWxlYXNlZAorICoKKyAqIFVubG9jayBhIG11dGV4IHRoYXQgaGFzIGJlZW4gbG9ja2VkIGJ5IHRoaXMgdGFzayBwcmV2aW91c2x5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgdXNlZCBpbiBpbnRlcnJ1cHQgY29udGV4dC4gVW5sb2NraW5nCisgKiBvZiBhIG5vdCBsb2NrZWQgbXV0ZXggaXMgbm90IGFsbG93ZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIChidXQgbm90IGVxdWl2YWxlbnQgdG8pIHVwKCkuCisgKi8KK3ZvaWQgZmFzdGNhbGwgX19zY2hlZCBtdXRleF91bmxvY2soc3RydWN0IG11dGV4ICpsb2NrKQoreworCS8qCisJICogVGhlIHVubG9ja2luZyBmYXN0cGF0aCBpcyB0aGUgMC0+MSB0cmFuc2l0aW9uIGZyb20gJ2xvY2tlZCcKKwkgKiBpbnRvICd1bmxvY2tlZCcgc3RhdGU6CisJICovCisJX19tdXRleF9mYXN0cGF0aF91bmxvY2soJmxvY2stPmNvdW50LCBfX211dGV4X3VubG9ja19zbG93cGF0aCk7Cit9CisKK0VYUE9SVF9TWU1CT0wobXV0ZXhfdW5sb2NrKTsKKworLyoKKyAqIExvY2sgYSBtdXRleCAocG9zc2libHkgaW50ZXJydXB0aWJsZSksIHNsb3dwYXRoOgorICovCitzdGF0aWMgaW5saW5lIGludCBfX3NjaGVkCitfX211dGV4X2xvY2tfY29tbW9uKHN0cnVjdCBtdXRleCAqbG9jaywgbG9uZyBzdGF0ZSBfX0lQX0RFQ0xfXykKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBjdXJyZW50OworCXN0cnVjdCBtdXRleF93YWl0ZXIgd2FpdGVyOworCXVuc2lnbmVkIGludCBvbGRfdmFsOworCisJZGVidWdfbXV0ZXhfaW5pdF93YWl0ZXIoJndhaXRlcik7CisKKwlzcGluX2xvY2tfbXV0ZXgoJmxvY2stPndhaXRfbG9jayk7CisKKwlkZWJ1Z19tdXRleF9hZGRfd2FpdGVyKGxvY2ssICZ3YWl0ZXIsIHRhc2stPnRocmVhZF9pbmZvLCBpcCk7CisKKwkvKiBhZGQgd2FpdGluZyB0YXNrcyB0byB0aGUgZW5kIG9mIHRoZSB3YWl0cXVldWUgKEZJRk8pOiAqLworCWxpc3RfYWRkX3RhaWwoJndhaXRlci5saXN0LCAmbG9jay0+d2FpdF9saXN0KTsKKwl3YWl0ZXIudGFzayA9IHRhc2s7CisKKwlmb3IgKDs7KSB7CisJCS8qCisJCSAqIExldHMgdHJ5IHRvIHRha2UgdGhlIGxvY2sgYWdhaW4gLSB0aGlzIGlzIG5lZWRlZCBldmVuIGlmCisJCSAqIHdlIGdldCBoZXJlIGZvciB0aGUgZmlyc3QgdGltZSAoc2hvcnRseSBhZnRlciBmYWlsaW5nIHRvCisJCSAqIGFjcXVpcmUgdGhlIGxvY2spLCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBnZXQgYSB3YWtldXAgb25jZQorCQkgKiBpdCdzIHVubG9ja2VkLiBMYXRlciBvbiwgaWYgd2Ugc2xlZXAsIHRoaXMgaXMgdGhlCisJCSAqIG9wZXJhdGlvbiB0aGF0IGdpdmVzIHVzIHRoZSBsb2NrLiBXZSB4Y2hnIGl0IHRvIC0xLCBzbworCQkgKiB0aGF0IHdoZW4gd2UgcmVsZWFzZSB0aGUgbG9jaywgd2UgcHJvcGVybHkgd2FrZSB1cCB0aGUKKwkJICogb3RoZXIgd2FpdGVyczoKKwkJICovCisJCW9sZF92YWwgPSBhdG9taWNfeGNoZygmbG9jay0+Y291bnQsIC0xKTsKKwkJaWYgKG9sZF92YWwgPT0gMSkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIGdvdCBhIHNpZ25hbD8gKFRoaXMgY29kZSBnZXRzIGVsaW1pbmF0ZWQgaW4gdGhlCisJCSAqIFRBU0tfVU5JTlRFUlJVUFRJQkxFIGNhc2UuKQorCQkgKi8KKwkJaWYgKHVubGlrZWx5KHN0YXRlID09IFRBU0tfSU5URVJSVVBUSUJMRSAmJgorCQkJCQkJc2lnbmFsX3BlbmRpbmcodGFzaykpKSB7CisJCQltdXRleF9yZW1vdmVfd2FpdGVyKGxvY2ssICZ3YWl0ZXIsIHRhc2stPnRocmVhZF9pbmZvKTsKKwkJCXNwaW5fdW5sb2NrX211dGV4KCZsb2NrLT53YWl0X2xvY2spOworCisJCQlkZWJ1Z19tdXRleF9mcmVlX3dhaXRlcigmd2FpdGVyKTsKKwkJCXJldHVybiAtRUlOVFI7CisJCX0KKwkJX19zZXRfdGFza19zdGF0ZSh0YXNrLCBzdGF0ZSk7CisKKwkJLyogZGlkbnQgZ2V0IHRoZSBsb2NrLCBnbyB0byBzbGVlcDogKi8KKwkJc3Bpbl91bmxvY2tfbXV0ZXgoJmxvY2stPndhaXRfbG9jayk7CisJCXNjaGVkdWxlKCk7CisJCXNwaW5fbG9ja19tdXRleCgmbG9jay0+d2FpdF9sb2NrKTsKKwl9CisKKwkvKiBnb3QgdGhlIGxvY2sgLSByZWpvaWNlISAqLworCW11dGV4X3JlbW92ZV93YWl0ZXIobG9jaywgJndhaXRlciwgdGFzay0+dGhyZWFkX2luZm8pOworCWRlYnVnX211dGV4X3NldF9vd25lcihsb2NrLCB0YXNrLT50aHJlYWRfaW5mbyBfX0lQX18pOworCisJLyogc2V0IGl0IHRvIDAgaWYgdGhlcmUgYXJlIG5vIHdhaXRlcnMgbGVmdDogKi8KKwlpZiAobGlrZWx5KGxpc3RfZW1wdHkoJmxvY2stPndhaXRfbGlzdCkpKQorCQlhdG9taWNfc2V0KCZsb2NrLT5jb3VudCwgMCk7CisKKwlzcGluX3VubG9ja19tdXRleCgmbG9jay0+d2FpdF9sb2NrKTsKKworCWRlYnVnX211dGV4X2ZyZWVfd2FpdGVyKCZ3YWl0ZXIpOworCisJREVCVUdfV0FSTl9PTihsaXN0X2VtcHR5KCZsb2NrLT5oZWxkX2xpc3QpKTsKKwlERUJVR19XQVJOX09OKGxvY2stPm93bmVyICE9IHRhc2stPnRocmVhZF9pbmZvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmYXN0Y2FsbCBub2lubGluZSBfX3NjaGVkCitfX211dGV4X2xvY2tfc2xvd3BhdGgoYXRvbWljX3QgKmxvY2tfY291bnQgX19JUF9ERUNMX18pCit7CisJc3RydWN0IG11dGV4ICpsb2NrID0gY29udGFpbmVyX29mKGxvY2tfY291bnQsIHN0cnVjdCBtdXRleCwgY291bnQpOworCisJX19tdXRleF9sb2NrX2NvbW1vbihsb2NrLCBUQVNLX1VOSU5URVJSVVBUSUJMRSBfX0lQX18pOworfQorCisvKgorICogUmVsZWFzZSB0aGUgbG9jaywgc2xvd3BhdGg6CisgKi8KK3N0YXRpYyBmYXN0Y2FsbCBub2lubGluZSB2b2lkCitfX211dGV4X3VubG9ja19zbG93cGF0aChhdG9taWNfdCAqbG9ja19jb3VudCBfX0lQX0RFQ0xfXykKK3sKKwlzdHJ1Y3QgbXV0ZXggKmxvY2sgPSBjb250YWluZXJfb2YobG9ja19jb3VudCwgc3RydWN0IG11dGV4LCBjb3VudCk7CisKKwlERUJVR19XQVJOX09OKGxvY2stPm93bmVyICE9IGN1cnJlbnRfdGhyZWFkX2luZm8oKSk7CisKKwlzcGluX2xvY2tfbXV0ZXgoJmxvY2stPndhaXRfbG9jayk7CisKKwkvKgorCSAqIHNvbWUgYXJjaGl0ZWN0dXJlcyBsZWF2ZSB0aGUgbG9jayB1bmxvY2tlZCBpbiB0aGUgZmFzdHBhdGggZmFpbHVyZQorCSAqIGNhc2UsIG90aGVycyBuZWVkIHRvIGxlYXZlIGl0IGxvY2tlZC4gSW4gdGhlIGxhdGVyIGNhc2Ugd2UgaGF2ZSB0bworCSAqIHVubG9jayBpdCBoZXJlCisJICovCisJaWYgKF9fbXV0ZXhfc2xvd3BhdGhfbmVlZHNfdG9fdW5sb2NrKCkpCisJCWF0b21pY19zZXQoJmxvY2stPmNvdW50LCAxKTsKKworCWRlYnVnX211dGV4X3VubG9jayhsb2NrKTsKKworCWlmICghbGlzdF9lbXB0eSgmbG9jay0+d2FpdF9saXN0KSkgeworCQkvKiBnZXQgdGhlIGZpcnN0IGVudHJ5IGZyb20gdGhlIHdhaXQtbGlzdDogKi8KKwkJc3RydWN0IG11dGV4X3dhaXRlciAqd2FpdGVyID0KKwkJCQlsaXN0X2VudHJ5KGxvY2stPndhaXRfbGlzdC5uZXh0LAorCQkJCQkgICBzdHJ1Y3QgbXV0ZXhfd2FpdGVyLCBsaXN0KTsKKworCQlkZWJ1Z19tdXRleF93YWtlX3dhaXRlcihsb2NrLCB3YWl0ZXIpOworCisJCXdha2VfdXBfcHJvY2Vzcyh3YWl0ZXItPnRhc2spOworCX0KKworCWRlYnVnX211dGV4X2NsZWFyX293bmVyKGxvY2spOworCisJc3Bpbl91bmxvY2tfbXV0ZXgoJmxvY2stPndhaXRfbG9jayk7Cit9CisKKy8qCisgKiBIZXJlIGNvbWUgdGhlIGxlc3MgY29tbW9uIChhbmQgaGVuY2UgbGVzcyBwZXJmb3JtYW5jZS1jcml0aWNhbCkgQVBJczoKKyAqIG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgpIGFuZCBtdXRleF90cnlsb2NrKCkuCisgKi8KK3N0YXRpYyBpbnQgZmFzdGNhbGwgbm9pbmxpbmUgX19zY2hlZAorX19tdXRleF9sb2NrX2ludGVycnVwdGlibGVfc2xvd3BhdGgoYXRvbWljX3QgKmxvY2tfY291bnQgX19JUF9ERUNMX18pOworCisvKioqCisgKiBtdXRleF9sb2NrX2ludGVycnVwdGlibGUgLSBhY3F1aXJlIHRoZSBtdXRleCwgaW50ZXJydXB0YWJsZQorICogQGxvY2s6IHRoZSBtdXRleCB0byBiZSBhY3F1aXJlZAorICoKKyAqIExvY2sgdGhlIG11dGV4IGxpa2UgbXV0ZXhfbG9jaygpLCBhbmQgcmV0dXJuIDAgaWYgdGhlIG11dGV4IGhhcworICogYmVlbiBhY3F1aXJlZCBvciBzbGVlcCB1bnRpbCB0aGUgbXV0ZXggYmVjb21lcyBhdmFpbGFibGUuIElmIGEKKyAqIHNpZ25hbCBhcnJpdmVzIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBsb2NrIHRoZW4gdGhpcyBmdW5jdGlvbgorICogcmV0dXJucyAtRUlOVFIuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIChidXQgbm90IGVxdWl2YWxlbnQgdG8pIGRvd25faW50ZXJydXB0aWJsZSgpLgorICovCitpbnQgZmFzdGNhbGwgX19zY2hlZCBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoc3RydWN0IG11dGV4ICpsb2NrKQoreworCW1pZ2h0X3NsZWVwKCk7CisJcmV0dXJuIF9fbXV0ZXhfZmFzdHBhdGhfbG9ja19yZXR2YWwKKwkJCSgmbG9jay0+Y291bnQsIF9fbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlX3Nsb3dwYXRoKTsKK30KKworRVhQT1JUX1NZTUJPTChtdXRleF9sb2NrX2ludGVycnVwdGlibGUpOworCitzdGF0aWMgaW50IGZhc3RjYWxsIG5vaW5saW5lIF9fc2NoZWQKK19fbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlX3Nsb3dwYXRoKGF0b21pY190ICpsb2NrX2NvdW50IF9fSVBfREVDTF9fKQoreworCXN0cnVjdCBtdXRleCAqbG9jayA9IGNvbnRhaW5lcl9vZihsb2NrX2NvdW50LCBzdHJ1Y3QgbXV0ZXgsIGNvdW50KTsKKworCXJldHVybiBfX211dGV4X2xvY2tfY29tbW9uKGxvY2ssIFRBU0tfSU5URVJSVVBUSUJMRSBfX0lQX18pOworfQorCisvKgorICogU3BpbmxvY2sgYmFzZWQgdHJ5bG9jaywgd2UgdGFrZSB0aGUgc3BpbmxvY2sgYW5kIGNoZWNrIHdoZXRoZXIgd2UKKyAqIGNhbiBnZXQgdGhlIGxvY2s6CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fbXV0ZXhfdHJ5bG9ja19zbG93cGF0aChhdG9taWNfdCAqbG9ja19jb3VudCkKK3sKKwlzdHJ1Y3QgbXV0ZXggKmxvY2sgPSBjb250YWluZXJfb2YobG9ja19jb3VudCwgc3RydWN0IG11dGV4LCBjb3VudCk7CisJaW50IHByZXY7CisKKwlzcGluX2xvY2tfbXV0ZXgoJmxvY2stPndhaXRfbG9jayk7CisKKwlwcmV2ID0gYXRvbWljX3hjaGcoJmxvY2stPmNvdW50LCAtMSk7CisJaWYgKGxpa2VseShwcmV2ID09IDEpKQorCQlkZWJ1Z19tdXRleF9zZXRfb3duZXIobG9jaywgY3VycmVudF90aHJlYWRfaW5mbygpIF9fUkVUX0lQX18pOworCS8qIFNldCBpdCBiYWNrIHRvIDAgaWYgdGhlcmUgYXJlIG5vIHdhaXRlcnM6ICovCisJaWYgKGxpa2VseShsaXN0X2VtcHR5KCZsb2NrLT53YWl0X2xpc3QpKSkKKwkJYXRvbWljX3NldCgmbG9jay0+Y291bnQsIDApOworCisJc3Bpbl91bmxvY2tfbXV0ZXgoJmxvY2stPndhaXRfbG9jayk7CisKKwlyZXR1cm4gcHJldiA9PSAxOworfQorCisvKioqCisgKiBtdXRleF90cnlsb2NrIC0gdHJ5IGFjcXVpcmUgdGhlIG11dGV4LCB3aXRob3V0IHdhaXRpbmcKKyAqIEBsb2NrOiB0aGUgbXV0ZXggdG8gYmUgYWNxdWlyZWQKKyAqCisgKiBUcnkgdG8gYWNxdWlyZSB0aGUgbXV0ZXggYXRvbWljYWxseS4gUmV0dXJucyAxIGlmIHRoZSBtdXRleAorICogaGFzIGJlZW4gYWNxdWlyZWQgc3VjY2Vzc2Z1bGx5LCBhbmQgMCBvbiBjb250ZW50aW9uLgorICoKKyAqIE5PVEU6IHRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc3Bpbl90cnlsb2NrKCkgY29udmVudGlvbiwgc28KKyAqIGl0IGlzIG5lZ2F0ZWQgdG8gdGhlIGRvd25fdHJ5bG9jaygpIHJldHVybiB2YWx1ZXMhIEJlIGNhcmVmdWwKKyAqIGFib3V0IHRoaXMgd2hlbiBjb252ZXJ0aW5nIHNlbWFwaG9yZSB1c2VycyB0byBtdXRleGVzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgdXNlZCBpbiBpbnRlcnJ1cHQgY29udGV4dC4gVGhlCisgKiBtdXRleCBtdXN0IGJlIHJlbGVhc2VkIGJ5IHRoZSBzYW1lIHRhc2sgdGhhdCBhY3F1aXJlZCBpdC4KKyAqLworaW50IGZhc3RjYWxsIG11dGV4X3RyeWxvY2soc3RydWN0IG11dGV4ICpsb2NrKQoreworCXJldHVybiBfX211dGV4X2Zhc3RwYXRoX3RyeWxvY2soJmxvY2stPmNvdW50LAorCQkJCQlfX211dGV4X3RyeWxvY2tfc2xvd3BhdGgpOworfQorCitFWFBPUlRfU1lNQk9MKG11dGV4X3RyeWxvY2spOwpkaWZmIC0tZ2l0IGEva2VybmVsL211dGV4LmggYi9rZXJuZWwvbXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGZlODRlCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL211dGV4LmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIE11dGV4ZXM6IGJsb2NraW5nIG11dHVhbCBleGNsdXNpb24gbG9ja3MKKyAqCisgKiBzdGFydGVkIGJ5IEluZ28gTW9sbmFyOgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+CisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIG11dGV4IGRlYnVnZ2luZyByZWxhdGVkIGludGVybmFsIHByb3RvdHlwZXMsIGZvciB0aGUKKyAqICFDT05GSUdfREVCVUdfTVVURVhFUyBjYXNlLiBNb3N0IG9mIHRoZW0gYXJlIE5PUHM6CisgKi8KKworI2RlZmluZSBzcGluX2xvY2tfbXV0ZXgobG9jaykJCQlzcGluX2xvY2sobG9jaykKKyNkZWZpbmUgc3Bpbl91bmxvY2tfbXV0ZXgobG9jaykJCQlzcGluX3VubG9jayhsb2NrKQorI2RlZmluZSBtdXRleF9yZW1vdmVfd2FpdGVyKGxvY2ssIHdhaXRlciwgdGkpIFwKKwkJX19saXN0X2RlbCgod2FpdGVyKS0+bGlzdC5wcmV2LCAod2FpdGVyKS0+bGlzdC5uZXh0KQorCisjZGVmaW5lIERFQlVHX1dBUk5fT04oYykJCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBkZWJ1Z19tdXRleF9zZXRfb3duZXIobG9jaywgbmV3X293bmVyKQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBkZWJ1Z19tdXRleF9jbGVhcl9vd25lcihsb2NrKQkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZGVidWdfbXV0ZXhfaW5pdF93YWl0ZXIod2FpdGVyKQkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZGVidWdfbXV0ZXhfd2FrZV93YWl0ZXIobG9jaywgd2FpdGVyKQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBkZWJ1Z19tdXRleF9mcmVlX3dhaXRlcih3YWl0ZXIpCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBkZWJ1Z19tdXRleF9hZGRfd2FpdGVyKGxvY2ssIHdhaXRlciwgdGksIGlwKQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGRlYnVnX211dGV4X3VubG9jayhsb2NrKQkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZGVidWdfbXV0ZXhfaW5pdChsb2NrLCBuYW1lKQkJCWRvIHsgfSB3aGlsZSAoMCkKKworLyoKKyAqIFJldHVybi1hZGRyZXNzIHBhcmFtZXRlcnMvZGVjbGFyYXRpb25zLiBUaGV5IGFyZSB2ZXJ5IHVzZWZ1bCBmb3IKKyAqIGRlYnVnZ2luZywgYnV0IGFkZCBvdmVyaGVhZCBpbiB0aGUgIURFQlVHIGNhc2UgLSBzbyB3ZSBnbyB0aGUKKyAqIHRyb3VibGUgb2YgdXNpbmcgdGhpcyBub3QgdG9vIGVsZWdhbnQgYnV0IHplcm8tY29zdCBzb2x1dGlvbjoKKyAqLworI2RlZmluZSBfX0lQX0RFQ0xfXworI2RlZmluZSBfX0lQX18KKyNkZWZpbmUgX19SRVRfSVBfXworCmRpZmYgLS1naXQgYS9rZXJuZWwvcGlkLmMgYi9rZXJuZWwvcGlkLmMKaW5kZXggZWRiYTMxYy4uMWFjYzA3MiAxMDA2NDQKLS0tIGEva2VybmVsL3BpZC5jCisrKyBiL2tlcm5lbC9waWQuYwpAQCAtMTM2LDcgKzEzNiw3IEBACiAJc3RydWN0IGhsaXN0X25vZGUgKmVsZW07CiAJc3RydWN0IHBpZCAqcGlkOwogCi0JaGxpc3RfZm9yX2VhY2hfZW50cnkocGlkLCBlbGVtLAorCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwaWQsIGVsZW0sCiAJCQkmcGlkX2hhc2hbdHlwZV1bcGlkX2hhc2hmbihucildLCBwaWRfY2hhaW4pIHsKIAkJaWYgKHBpZC0+bnIgPT0gbnIpCiAJCQlyZXR1cm4gcGlkOwpAQCAtMTUwLDE1ICsxNTAsMTUgQEAKIAogCXRhc2tfcGlkID0gJnRhc2stPnBpZHNbdHlwZV07CiAJcGlkID0gZmluZF9waWQodHlwZSwgbnIpOworCXRhc2tfcGlkLT5uciA9IG5yOwogCWlmIChwaWQgPT0gTlVMTCkgewotCQlobGlzdF9hZGRfaGVhZCgmdGFza19waWQtPnBpZF9jaGFpbiwKLQkJCQkmcGlkX2hhc2hbdHlwZV1bcGlkX2hhc2hmbihucildKTsKIAkJSU5JVF9MSVNUX0hFQUQoJnRhc2tfcGlkLT5waWRfbGlzdCk7CisJCWhsaXN0X2FkZF9oZWFkX3JjdSgmdGFza19waWQtPnBpZF9jaGFpbiwKKwkJCQkgICAmcGlkX2hhc2hbdHlwZV1bcGlkX2hhc2hmbihucildKTsKIAl9IGVsc2UgewogCQlJTklUX0hMSVNUX05PREUoJnRhc2tfcGlkLT5waWRfY2hhaW4pOwotCQlsaXN0X2FkZF90YWlsKCZ0YXNrX3BpZC0+cGlkX2xpc3QsICZwaWQtPnBpZF9saXN0KTsKKwkJbGlzdF9hZGRfdGFpbF9yY3UoJnRhc2tfcGlkLT5waWRfbGlzdCwgJnBpZC0+cGlkX2xpc3QpOwogCX0KLQl0YXNrX3BpZC0+bnIgPSBucjsKIAogCXJldHVybiAwOwogfQpAQCAtMTcwLDIwICsxNzAsMjAgQEAKIAogCXBpZCA9ICZ0YXNrLT5waWRzW3R5cGVdOwogCWlmICghaGxpc3RfdW5oYXNoZWQoJnBpZC0+cGlkX2NoYWluKSkgewotCQlobGlzdF9kZWwoJnBpZC0+cGlkX2NoYWluKTsKIAotCQlpZiAobGlzdF9lbXB0eSgmcGlkLT5waWRfbGlzdCkpCisJCWlmIChsaXN0X2VtcHR5KCZwaWQtPnBpZF9saXN0KSkgewogCQkJbnIgPSBwaWQtPm5yOwotCQllbHNlIHsKKwkJCWhsaXN0X2RlbF9yY3UoJnBpZC0+cGlkX2NoYWluKTsKKwkJfSBlbHNlIHsKIAkJCXBpZF9uZXh0ID0gbGlzdF9lbnRyeShwaWQtPnBpZF9saXN0Lm5leHQsCiAJCQkJCQlzdHJ1Y3QgcGlkLCBwaWRfbGlzdCk7CiAJCQkvKiBpbnNlcnQgbmV4dCBwaWQgZnJvbSBwaWRfbGlzdCB0byBoYXNoICovCi0JCQlobGlzdF9hZGRfaGVhZCgmcGlkX25leHQtPnBpZF9jaGFpbiwKLQkJCQkmcGlkX2hhc2hbdHlwZV1bcGlkX2hhc2hmbihwaWRfbmV4dC0+bnIpXSk7CisJCQlobGlzdF9yZXBsYWNlX3JjdSgmcGlkLT5waWRfY2hhaW4sCisJCQkJCSAgJnBpZF9uZXh0LT5waWRfY2hhaW4pOwogCQl9CiAJfQogCi0JbGlzdF9kZWwoJnBpZC0+cGlkX2xpc3QpOworCWxpc3RfZGVsX3JjdSgmcGlkLT5waWRfbGlzdCk7CiAJcGlkLT5uciA9IDA7CiAKIAlyZXR1cm4gbnI7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG9zaXgtY3B1LXRpbWVycy5jIGIva2VybmVsL3Bvc2l4LWNwdS10aW1lcnMuYwppbmRleCA0YzY4ZWRmLi41MjBmNmM1IDEwMDY0NAotLS0gYS9rZXJuZWwvcG9zaXgtY3B1LXRpbWVycy5jCisrKyBiL2tlcm5lbC9wb3NpeC1jcHUtdGltZXJzLmMKQEAgLTcsNyArNyw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogCi1zdGF0aWMgaW50IGNoZWNrX2Nsb2NrKGNsb2NraWRfdCB3aGljaF9jbG9jaykKK3N0YXRpYyBpbnQgY2hlY2tfY2xvY2soY29uc3QgY2xvY2tpZF90IHdoaWNoX2Nsb2NrKQogewogCWludCBlcnJvciA9IDA7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwpAQCAtMzEsNyArMzEsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIHVuaW9uIGNwdV90aW1lX2NvdW50Ci10aW1lc3BlY190b19zYW1wbGUoY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRwKQordGltZXNwZWNfdG9fc2FtcGxlKGNvbnN0IGNsb2NraWRfdCB3aGljaF9jbG9jaywgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0cCkKIHsKIAl1bmlvbiBjcHVfdGltZV9jb3VudCByZXQ7CiAJcmV0LnNjaGVkID0gMDsJCS8qIGhpZ2ggaGFsZiBhbHdheXMgemVybyB3aGVuIC5jcHUgdXNlZCAqLwpAQCAtNDMsNyArNDMsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHNhbXBsZV90b190aW1lc3BlYyhjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssCitzdGF0aWMgdm9pZCBzYW1wbGVfdG9fdGltZXNwZWMoY29uc3QgY2xvY2tpZF90IHdoaWNoX2Nsb2NrLAogCQkJICAgICAgIHVuaW9uIGNwdV90aW1lX2NvdW50IGNwdSwKIAkJCSAgICAgICBzdHJ1Y3QgdGltZXNwZWMgKnRwKQogewpAQCAtNTUsNyArNTUsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSBpbnQgY3B1X3RpbWVfYmVmb3JlKGNsb2NraWRfdCB3aGljaF9jbG9jaywKK3N0YXRpYyBpbmxpbmUgaW50IGNwdV90aW1lX2JlZm9yZShjb25zdCBjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssCiAJCQkJICB1bmlvbiBjcHVfdGltZV9jb3VudCBub3csCiAJCQkJICB1bmlvbiBjcHVfdGltZV9jb3VudCB0aGVuKQogewpAQCAtNjUsNyArNjUsNyBAQAogCQlyZXR1cm4gY3B1dGltZV9sdChub3cuY3B1LCB0aGVuLmNwdSk7CiAJfQogfQotc3RhdGljIGlubGluZSB2b2lkIGNwdV90aW1lX2FkZChjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X3RpbWVfYWRkKGNvbnN0IGNsb2NraWRfdCB3aGljaF9jbG9jaywKIAkJCQl1bmlvbiBjcHVfdGltZV9jb3VudCAqYWNjLAogCQkJICAgICAgICB1bmlvbiBjcHVfdGltZV9jb3VudCB2YWwpCiB7CkBAIC03NSw3ICs3NSw3IEBACiAJCWFjYy0+Y3B1ID0gY3B1dGltZV9hZGQoYWNjLT5jcHUsIHZhbC5jcHUpOwogCX0KIH0KLXN0YXRpYyBpbmxpbmUgdW5pb24gY3B1X3RpbWVfY291bnQgY3B1X3RpbWVfc3ViKGNsb2NraWRfdCB3aGljaF9jbG9jaywKK3N0YXRpYyBpbmxpbmUgdW5pb24gY3B1X3RpbWVfY291bnQgY3B1X3RpbWVfc3ViKGNvbnN0IGNsb2NraWRfdCB3aGljaF9jbG9jaywKIAkJCQkJCXVuaW9uIGNwdV90aW1lX2NvdW50IGEsCiAJCQkJCQl1bmlvbiBjcHVfdGltZV9jb3VudCBiKQogewpAQCAtMTUxLDcgKzE1MSw3IEBACiAJcmV0dXJuIChwID09IGN1cnJlbnQpID8gY3VycmVudF9zY2hlZF90aW1lKHApIDogcC0+c2NoZWRfdGltZTsKIH0KIAotaW50IHBvc2l4X2NwdV9jbG9ja19nZXRyZXMoY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBzdHJ1Y3QgdGltZXNwZWMgKnRwKQoraW50IHBvc2l4X2NwdV9jbG9ja19nZXRyZXMoY29uc3QgY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBzdHJ1Y3QgdGltZXNwZWMgKnRwKQogewogCWludCBlcnJvciA9IGNoZWNrX2Nsb2NrKHdoaWNoX2Nsb2NrKTsKIAlpZiAoIWVycm9yKSB7CkBAIC0xNjksNyArMTY5LDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWludCBwb3NpeF9jcHVfY2xvY2tfc2V0KGNsb2NraWRfdCB3aGljaF9jbG9jaywgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0cCkKK2ludCBwb3NpeF9jcHVfY2xvY2tfc2V0KGNvbnN0IGNsb2NraWRfdCB3aGljaF9jbG9jaywgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0cCkKIHsKIAkvKgogCSAqIFlvdSBjYW4gbmV2ZXIgcmVzZXQgYSBDUFUgY2xvY2ssIGJ1dCB3ZSBjaGVjayBmb3Igb3RoZXIgZXJyb3JzCkBAIC0xODYsNyArMTg2LDcgQEAKIC8qCiAgKiBTYW1wbGUgYSBwZXItdGhyZWFkIGNsb2NrIGZvciB0aGUgZ2l2ZW4gdGFzay4KICAqLwotc3RhdGljIGludCBjcHVfY2xvY2tfc2FtcGxlKGNsb2NraWRfdCB3aGljaF9jbG9jaywgc3RydWN0IHRhc2tfc3RydWN0ICpwLAorc3RhdGljIGludCBjcHVfY2xvY2tfc2FtcGxlKGNvbnN0IGNsb2NraWRfdCB3aGljaF9jbG9jaywgc3RydWN0IHRhc2tfc3RydWN0ICpwLAogCQkJICAgIHVuaW9uIGNwdV90aW1lX2NvdW50ICpjcHUpCiB7CiAJc3dpdGNoIChDUFVDTE9DS19XSElDSCh3aGljaF9jbG9jaykpIHsKQEAgLTI0OCw3ICsyNDgsNyBAQAogICogU2FtcGxlIGEgcHJvY2VzcyAodGhyZWFkIGdyb3VwKSBjbG9jayBmb3IgdGhlIGdpdmVuIGdyb3VwX2xlYWRlciB0YXNrLgogICogTXVzdCBiZSBjYWxsZWQgd2l0aCB0YXNrbGlzdF9sb2NrIGhlbGQgZm9yIHJlYWRpbmcuCiAgKi8KLXN0YXRpYyBpbnQgY3B1X2Nsb2NrX3NhbXBsZV9ncm91cChjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssCitzdGF0aWMgaW50IGNwdV9jbG9ja19zYW1wbGVfZ3JvdXAoY29uc3QgY2xvY2tpZF90IHdoaWNoX2Nsb2NrLAogCQkJCSAgc3RydWN0IHRhc2tfc3RydWN0ICpwLAogCQkJCSAgdW5pb24gY3B1X3RpbWVfY291bnQgKmNwdSkKIHsKQEAgLTI2Miw3ICsyNjIsNyBAQAogfQogCiAKLWludCBwb3NpeF9jcHVfY2xvY2tfZ2V0KGNsb2NraWRfdCB3aGljaF9jbG9jaywgc3RydWN0IHRpbWVzcGVjICp0cCkKK2ludCBwb3NpeF9jcHVfY2xvY2tfZ2V0KGNvbnN0IGNsb2NraWRfdCB3aGljaF9jbG9jaywgc3RydWN0IHRpbWVzcGVjICp0cCkKIHsKIAljb25zdCBwaWRfdCBwaWQgPSBDUFVDTE9DS19QSUQod2hpY2hfY2xvY2spOwogCWludCBlcnJvciA9IC1FSU5WQUw7CkBAIC0xMzk5LDggKzEzOTksOCBAQAogCiBzdGF0aWMgbG9uZyBwb3NpeF9jcHVfY2xvY2tfbmFub3NsZWVwX3Jlc3RhcnQoc3RydWN0IHJlc3RhcnRfYmxvY2sgKik7CiAKLWludCBwb3NpeF9jcHVfbnNsZWVwKGNsb2NraWRfdCB3aGljaF9jbG9jaywgaW50IGZsYWdzLAotCQkgICAgIHN0cnVjdCB0aW1lc3BlYyAqcnF0cCkKK2ludCBwb3NpeF9jcHVfbnNsZWVwKGNvbnN0IGNsb2NraWRfdCB3aGljaF9jbG9jaywgaW50IGZsYWdzLAorCQkgICAgIHN0cnVjdCB0aW1lc3BlYyAqcnF0cCwgc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqcm10cCkKIHsKIAlzdHJ1Y3QgcmVzdGFydF9ibG9jayAqcmVzdGFydF9ibG9jayA9CiAJICAgICZjdXJyZW50X3RocmVhZF9pbmZvKCktPnJlc3RhcnRfYmxvY2s7CkBAIC0xNDI1LDcgKzE0MjUsNiBAQAogCWVycm9yID0gcG9zaXhfY3B1X3RpbWVyX2NyZWF0ZSgmdGltZXIpOwogCXRpbWVyLml0X3Byb2Nlc3MgPSBjdXJyZW50OwogCWlmICghZXJyb3IpIHsKLQkJc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqcm10cDsKIAkJc3RhdGljIHN0cnVjdCBpdGltZXJzcGVjIHplcm9faXQ7CiAJCXN0cnVjdCBpdGltZXJzcGVjIGl0ID0geyAuaXRfdmFsdWUgPSAqcnF0cCwKIAkJCQkJIC5pdF9pbnRlcnZhbCA9IHt9IH07CkBAIC0xNDcyLDcgKzE0NzEsNiBAQAogCQkvKgogCQkgKiBSZXBvcnQgYmFjayB0byB0aGUgdXNlciB0aGUgdGltZSBzdGlsbCByZW1haW5pbmcuCiAJCSAqLwotCQlybXRwID0gKHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKikgcmVzdGFydF9ibG9jay0+YXJnMTsKIAkJaWYgKHJtdHAgIT0gTlVMTCAmJiAhKGZsYWdzICYgVElNRVJfQUJTVElNRSkgJiYKIAkJICAgIGNvcHlfdG9fdXNlcihybXRwLCAmaXQuaXRfdmFsdWUsIHNpemVvZiAqcm10cCkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTE0ODAsNiArMTQ3OCw3IEBACiAJCXJlc3RhcnRfYmxvY2stPmZuID0gcG9zaXhfY3B1X2Nsb2NrX25hbm9zbGVlcF9yZXN0YXJ0OwogCQkvKiBDYWxsZXIgYWxyZWFkeSBzZXQgcmVzdGFydF9ibG9jay0+YXJnMSAqLwogCQlyZXN0YXJ0X2Jsb2NrLT5hcmcwID0gd2hpY2hfY2xvY2s7CisJCXJlc3RhcnRfYmxvY2stPmFyZzEgPSAodW5zaWduZWQgbG9uZykgcm10cDsKIAkJcmVzdGFydF9ibG9jay0+YXJnMiA9IHJxdHAtPnR2X3NlYzsKIAkJcmVzdGFydF9ibG9jay0+YXJnMyA9IHJxdHAtPnR2X25zZWM7CiAKQEAgLTE0OTMsMjEgKzE0OTIsMjggQEAKIHBvc2l4X2NwdV9jbG9ja19uYW5vc2xlZXBfcmVzdGFydChzdHJ1Y3QgcmVzdGFydF9ibG9jayAqcmVzdGFydF9ibG9jaykKIHsKIAljbG9ja2lkX3Qgd2hpY2hfY2xvY2sgPSByZXN0YXJ0X2Jsb2NrLT5hcmcwOwotCXN0cnVjdCB0aW1lc3BlYyB0ID0geyAudHZfc2VjID0gcmVzdGFydF9ibG9jay0+YXJnMiwKLQkJCSAgICAgIC50dl9uc2VjID0gcmVzdGFydF9ibG9jay0+YXJnMyB9OworCXN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnJtdHA7CisJc3RydWN0IHRpbWVzcGVjIHQ7CisKKwlybXRwID0gKHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKikgcmVzdGFydF9ibG9jay0+YXJnMTsKKwl0LnR2X3NlYyA9IHJlc3RhcnRfYmxvY2stPmFyZzI7CisJdC50dl9uc2VjID0gcmVzdGFydF9ibG9jay0+YXJnMzsKKwogCXJlc3RhcnRfYmxvY2stPmZuID0gZG9fbm9fcmVzdGFydF9zeXNjYWxsOwotCXJldHVybiBwb3NpeF9jcHVfbnNsZWVwKHdoaWNoX2Nsb2NrLCBUSU1FUl9BQlNUSU1FLCAmdCk7CisJcmV0dXJuIHBvc2l4X2NwdV9uc2xlZXAod2hpY2hfY2xvY2ssIFRJTUVSX0FCU1RJTUUsICZ0LCBybXRwKTsKIH0KIAogCiAjZGVmaW5lIFBST0NFU1NfQ0xPQ0sJTUFLRV9QUk9DRVNTX0NQVUNMT0NLKDAsIENQVUNMT0NLX1NDSEVEKQogI2RlZmluZSBUSFJFQURfQ0xPQ0sJTUFLRV9USFJFQURfQ1BVQ0xPQ0soMCwgQ1BVQ0xPQ0tfU0NIRUQpCiAKLXN0YXRpYyBpbnQgcHJvY2Vzc19jcHVfY2xvY2tfZ2V0cmVzKGNsb2NraWRfdCB3aGljaF9jbG9jaywgc3RydWN0IHRpbWVzcGVjICp0cCkKK3N0YXRpYyBpbnQgcHJvY2Vzc19jcHVfY2xvY2tfZ2V0cmVzKGNvbnN0IGNsb2NraWRfdCB3aGljaF9jbG9jaywKKwkJCQkgICAgc3RydWN0IHRpbWVzcGVjICp0cCkKIHsKIAlyZXR1cm4gcG9zaXhfY3B1X2Nsb2NrX2dldHJlcyhQUk9DRVNTX0NMT0NLLCB0cCk7CiB9Ci1zdGF0aWMgaW50IHByb2Nlc3NfY3B1X2Nsb2NrX2dldChjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssIHN0cnVjdCB0aW1lc3BlYyAqdHApCitzdGF0aWMgaW50IHByb2Nlc3NfY3B1X2Nsb2NrX2dldChjb25zdCBjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssCisJCQkJIHN0cnVjdCB0aW1lc3BlYyAqdHApCiB7CiAJcmV0dXJuIHBvc2l4X2NwdV9jbG9ja19nZXQoUFJPQ0VTU19DTE9DSywgdHApOwogfQpAQCAtMTUxNiwxNiArMTUyMiwxOSBAQAogCXRpbWVyLT5pdF9jbG9jayA9IFBST0NFU1NfQ0xPQ0s7CiAJcmV0dXJuIHBvc2l4X2NwdV90aW1lcl9jcmVhdGUodGltZXIpOwogfQotc3RhdGljIGludCBwcm9jZXNzX2NwdV9uc2xlZXAoY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBpbnQgZmxhZ3MsCi0JCQkgICAgICBzdHJ1Y3QgdGltZXNwZWMgKnJxdHApCitzdGF0aWMgaW50IHByb2Nlc3NfY3B1X25zbGVlcChjb25zdCBjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssIGludCBmbGFncywKKwkJCSAgICAgIHN0cnVjdCB0aW1lc3BlYyAqcnF0cCwKKwkJCSAgICAgIHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnJtdHApCiB7Ci0JcmV0dXJuIHBvc2l4X2NwdV9uc2xlZXAoUFJPQ0VTU19DTE9DSywgZmxhZ3MsIHJxdHApOworCXJldHVybiBwb3NpeF9jcHVfbnNsZWVwKFBST0NFU1NfQ0xPQ0ssIGZsYWdzLCBycXRwLCBybXRwKTsKIH0KLXN0YXRpYyBpbnQgdGhyZWFkX2NwdV9jbG9ja19nZXRyZXMoY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBzdHJ1Y3QgdGltZXNwZWMgKnRwKQorc3RhdGljIGludCB0aHJlYWRfY3B1X2Nsb2NrX2dldHJlcyhjb25zdCBjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssCisJCQkJICAgc3RydWN0IHRpbWVzcGVjICp0cCkKIHsKIAlyZXR1cm4gcG9zaXhfY3B1X2Nsb2NrX2dldHJlcyhUSFJFQURfQ0xPQ0ssIHRwKTsKIH0KLXN0YXRpYyBpbnQgdGhyZWFkX2NwdV9jbG9ja19nZXQoY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBzdHJ1Y3QgdGltZXNwZWMgKnRwKQorc3RhdGljIGludCB0aHJlYWRfY3B1X2Nsb2NrX2dldChjb25zdCBjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssCisJCQkJc3RydWN0IHRpbWVzcGVjICp0cCkKIHsKIAlyZXR1cm4gcG9zaXhfY3B1X2Nsb2NrX2dldChUSFJFQURfQ0xPQ0ssIHRwKTsKIH0KQEAgLTE1MzQsOCArMTU0Myw4IEBACiAJdGltZXItPml0X2Nsb2NrID0gVEhSRUFEX0NMT0NLOwogCXJldHVybiBwb3NpeF9jcHVfdGltZXJfY3JlYXRlKHRpbWVyKTsKIH0KLXN0YXRpYyBpbnQgdGhyZWFkX2NwdV9uc2xlZXAoY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBpbnQgZmxhZ3MsCi0JCQkgICAgICBzdHJ1Y3QgdGltZXNwZWMgKnJxdHApCitzdGF0aWMgaW50IHRocmVhZF9jcHVfbnNsZWVwKGNvbnN0IGNsb2NraWRfdCB3aGljaF9jbG9jaywgaW50IGZsYWdzLAorCQkJICAgICAgc3RydWN0IHRpbWVzcGVjICpycXRwLCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICpybXRwKQogewogCXJldHVybiAtRUlOVkFMOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvc2l4LXRpbWVycy5jIGIva2VybmVsL3Bvc2l4LXRpbWVycy5jCmluZGV4IDU4NzBlZmIuLjE5NzIwOGIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3NpeC10aW1lcnMuYworKysgYi9rZXJuZWwvcG9zaXgtdGltZXJzLmMKQEAgLTQ4LDIxICs0OCw2IEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKLSNpZm5kZWYgZGl2X2xvbmdfbG9uZ19yZW0KLSNpbmNsdWRlIDxhc20vZGl2NjQuaD4KLQotI2RlZmluZSBkaXZfbG9uZ19sb25nX3JlbShkaXZpZGVuZCxkaXZpc29yLHJlbWFpbmRlcikgKHsgXAotCQkgICAgICAgdTY0IHJlc3VsdCA9IGRpdmlkZW5kOwkJXAotCQkgICAgICAgKnJlbWFpbmRlciA9IGRvX2RpdihyZXN1bHQsZGl2aXNvcik7IFwKLQkJICAgICAgIHJlc3VsdDsgfSkKLQotI2VuZGlmCi0jZGVmaW5lIENMT0NLX1JFQUxUSU1FX1JFUyBUSUNLX05TRUMgIC8qIEluIG5hbm8gc2Vjb25kcy4gKi8KLQotc3RhdGljIGlubGluZSB1NjQgIG1weV9sX1hfbF9sbCh1bnNpZ25lZCBsb25nIG1weTEsdW5zaWduZWQgbG9uZyBtcHkyKQotewotCXJldHVybiAodTY0KW1weTEgKiBtcHkyOwotfQogLyoKICAqIE1hbmFnZW1lbnQgYXJyYXlzIGZvciBQT1NJWCB0aW1lcnMuCSBUaW1lcnMgYXJlIGtlcHQgaW4gc2xhYiBtZW1vcnkKICAqIFRpbWVyIGlkcyBhcmUgYWxsb2NhdGVkIGJ5IGFuIGV4dGVybmFsIHJvdXRpbmUgdGhhdCBrZWVwcyB0cmFjayBvZiB0aGUKQEAgLTE0OCwxOCArMTMzLDE4IEBACiAgKi8KIAogc3RhdGljIHN0cnVjdCBrX2Nsb2NrIHBvc2l4X2Nsb2Nrc1tNQVhfQ0xPQ0tTXTsKLS8qCi0gKiBXZSBvbmx5IGhhdmUgb25lIHJlYWwgY2xvY2sgdGhhdCBjYW4gYmUgc2V0IHNvIHdlIG5lZWQgb25seSBvbmUgYWJzIGxpc3QsCi0gKiBldmVuIGlmIHdlIHNob3VsZCB3YW50IHRvIGhhdmUgc2V2ZXJhbCBjbG9ja3Mgd2l0aCBkaWZmZXJpbmcgcmVzb2x1dGlvbnMuCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qga19jbG9ja19hYnMgYWJzX2xpc3QgPSB7Lmxpc3QgPSBMSVNUX0hFQURfSU5JVChhYnNfbGlzdC5saXN0KSwKLQkJCQkgICAgICAubG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRH07CiAKLXN0YXRpYyB2b2lkIHBvc2l4X3RpbWVyX2ZuKHVuc2lnbmVkIGxvbmcpOwotc3RhdGljIHU2NCBkb19wb3NpeF9jbG9ja19tb25vdG9uaWNfZ2V0dGltZV9wYXJ0cygKLQlzdHJ1Y3QgdGltZXNwZWMgKnRwLCBzdHJ1Y3QgdGltZXNwZWMgKm1vKTsKLWludCBkb19wb3NpeF9jbG9ja19tb25vdG9uaWNfZ2V0dGltZShzdHJ1Y3QgdGltZXNwZWMgKnRwKTsKLXN0YXRpYyBpbnQgZG9fcG9zaXhfY2xvY2tfbW9ub3RvbmljX2dldChjbG9ja2lkX3QsIHN0cnVjdCB0aW1lc3BlYyAqdHApOworLyoKKyAqIFRoZXNlIG9uZXMgYXJlIGRlZmluZWQgYmVsb3cuCisgKi8KK3N0YXRpYyBpbnQgY29tbW9uX25zbGVlcChjb25zdCBjbG9ja2lkX3QsIGludCBmbGFncywgc3RydWN0IHRpbWVzcGVjICp0LAorCQkJIHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnJtdHApOworc3RhdGljIHZvaWQgY29tbW9uX3RpbWVyX2dldChzdHJ1Y3Qga19pdGltZXIgKiwgc3RydWN0IGl0aW1lcnNwZWMgKik7CitzdGF0aWMgaW50IGNvbW1vbl90aW1lcl9zZXQoc3RydWN0IGtfaXRpbWVyICosIGludCwKKwkJCSAgICBzdHJ1Y3QgaXRpbWVyc3BlYyAqLCBzdHJ1Y3QgaXRpbWVyc3BlYyAqKTsKK3N0YXRpYyBpbnQgY29tbW9uX3RpbWVyX2RlbChzdHJ1Y3Qga19pdGltZXIgKnRpbWVyKTsKKworc3RhdGljIGludCBwb3NpeF90aW1lcl9mbih2b2lkICpkYXRhKTsKIAogc3RhdGljIHN0cnVjdCBrX2l0aW1lciAqbG9ja190aW1lcih0aW1lcl90IHRpbWVyX2lkLCB1bnNpZ25lZCBsb25nICpmbGFncyk7CiAKQEAgLTE4NCw3ICsxNjksNyBAQAogICogdGhlIGZ1bmN0aW9uIHBvaW50ZXIgQ0FMTCBpbiBzdHJ1Y3Qga19jbG9jay4KICAqLwogCi1zdGF0aWMgaW5saW5lIGludCBjb21tb25fY2xvY2tfZ2V0cmVzKGNsb2NraWRfdCB3aGljaF9jbG9jaywKK3N0YXRpYyBpbmxpbmUgaW50IGNvbW1vbl9jbG9ja19nZXRyZXMoY29uc3QgY2xvY2tpZF90IHdoaWNoX2Nsb2NrLAogCQkJCSAgICAgIHN0cnVjdCB0aW1lc3BlYyAqdHApCiB7CiAJdHAtPnR2X3NlYyA9IDA7CkBAIC0xOTIsMzkgKzE3NywzMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBjb21tb25fY2xvY2tfZ2V0KGNsb2NraWRfdCB3aGljaF9jbG9jaywgc3RydWN0IHRpbWVzcGVjICp0cCkKKy8qCisgKiBHZXQgcmVhbCB0aW1lIGZvciBwb3NpeCB0aW1lcnMKKyAqLworc3RhdGljIGludCBjb21tb25fY2xvY2tfZ2V0KGNsb2NraWRfdCB3aGljaF9jbG9jaywgc3RydWN0IHRpbWVzcGVjICp0cCkKIHsKLQlnZXRuc3RpbWVvZmRheSh0cCk7CisJa3RpbWVfZ2V0X3JlYWxfdHModHApOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBjb21tb25fY2xvY2tfc2V0KGNsb2NraWRfdCB3aGljaF9jbG9jaywgc3RydWN0IHRpbWVzcGVjICp0cCkKK3N0YXRpYyBpbmxpbmUgaW50IGNvbW1vbl9jbG9ja19zZXQoY29uc3QgY2xvY2tpZF90IHdoaWNoX2Nsb2NrLAorCQkJCSAgIHN0cnVjdCB0aW1lc3BlYyAqdHApCiB7CiAJcmV0dXJuIGRvX3N5c19zZXR0aW1lb2ZkYXkodHAsIE5VTEwpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBjb21tb25fdGltZXJfY3JlYXRlKHN0cnVjdCBrX2l0aW1lciAqbmV3X3RpbWVyKQorc3RhdGljIGludCBjb21tb25fdGltZXJfY3JlYXRlKHN0cnVjdCBrX2l0aW1lciAqbmV3X3RpbWVyKQogewotCUlOSVRfTElTVF9IRUFEKCZuZXdfdGltZXItPml0LnJlYWwuYWJzX3RpbWVyX2VudHJ5KTsKLQlpbml0X3RpbWVyKCZuZXdfdGltZXItPml0LnJlYWwudGltZXIpOwotCW5ld190aW1lci0+aXQucmVhbC50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIG5ld190aW1lcjsKKwlocnRpbWVyX2luaXQoJm5ld190aW1lci0+aXQucmVhbC50aW1lciwgbmV3X3RpbWVyLT5pdF9jbG9jayk7CisJbmV3X3RpbWVyLT5pdC5yZWFsLnRpbWVyLmRhdGEgPSBuZXdfdGltZXI7CiAJbmV3X3RpbWVyLT5pdC5yZWFsLnRpbWVyLmZ1bmN0aW9uID0gcG9zaXhfdGltZXJfZm47CiAJcmV0dXJuIDA7CiB9CiAKIC8qCi0gKiBUaGVzZSBvbmVzIGFyZSBkZWZpbmVkIGJlbG93LgorICogUmV0dXJuIG5vbnplcm8gaWYgd2Uga25vdyBhIHByaW9yaSB0aGlzIGNsb2NraWRfdCB2YWx1ZSBpcyBib2d1cy4KICAqLwotc3RhdGljIGludCBjb21tb25fbnNsZWVwKGNsb2NraWRfdCwgaW50IGZsYWdzLCBzdHJ1Y3QgdGltZXNwZWMgKnQpOwotc3RhdGljIHZvaWQgY29tbW9uX3RpbWVyX2dldChzdHJ1Y3Qga19pdGltZXIgKiwgc3RydWN0IGl0aW1lcnNwZWMgKik7Ci1zdGF0aWMgaW50IGNvbW1vbl90aW1lcl9zZXQoc3RydWN0IGtfaXRpbWVyICosIGludCwKLQkJCSAgICBzdHJ1Y3QgaXRpbWVyc3BlYyAqLCBzdHJ1Y3QgaXRpbWVyc3BlYyAqKTsKLXN0YXRpYyBpbnQgY29tbW9uX3RpbWVyX2RlbChzdHJ1Y3Qga19pdGltZXIgKnRpbWVyKTsKLQotLyoKLSAqIFJldHVybiBub256ZXJvIGlmZiB3ZSBrbm93IGEgcHJpb3JpIHRoaXMgY2xvY2tpZF90IHZhbHVlIGlzIGJvZ3VzLgotICovCi1zdGF0aWMgaW5saW5lIGludCBpbnZhbGlkX2Nsb2NraWQoY2xvY2tpZF90IHdoaWNoX2Nsb2NrKQorc3RhdGljIGlubGluZSBpbnQgaW52YWxpZF9jbG9ja2lkKGNvbnN0IGNsb2NraWRfdCB3aGljaF9jbG9jaykKIHsKIAlpZiAod2hpY2hfY2xvY2sgPCAwKQkvKiBDUFUgY2xvY2ssIHBvc2l4X2NwdV8qIHdpbGwgY2hlY2sgaXQgKi8KIAkJcmV0dXJuIDA7CkBAIC0yMzIsMjYgKzIxMSwzMiBAQAogCQlyZXR1cm4gMTsKIAlpZiAocG9zaXhfY2xvY2tzW3doaWNoX2Nsb2NrXS5jbG9ja19nZXRyZXMgIT0gTlVMTCkKIAkJcmV0dXJuIDA7Ci0jaWZuZGVmIENMT0NLX0RJU1BBVENIX0RJUkVDVAogCWlmIChwb3NpeF9jbG9ja3Nbd2hpY2hfY2xvY2tdLnJlcyAhPSAwKQogCQlyZXR1cm4gMDsKLSNlbmRpZgogCXJldHVybiAxOwogfQogCisvKgorICogR2V0IG1vbm90b25pYyB0aW1lIGZvciBwb3NpeCB0aW1lcnMKKyAqLworc3RhdGljIGludCBwb3NpeF9rdGltZV9nZXRfdHMoY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBzdHJ1Y3QgdGltZXNwZWMgKnRwKQoreworCWt0aW1lX2dldF90cyh0cCk7CisJcmV0dXJuIDA7Cit9CiAKIC8qCiAgKiBJbml0aWFsaXplIGV2ZXJ5dGhpbmcsIHdlbGwsIGp1c3QgZXZlcnl0aGluZyBpbiBQb3NpeCBjbG9ja3MvdGltZXJzIDspCiAgKi8KIHN0YXRpYyBfX2luaXQgaW50IGluaXRfcG9zaXhfdGltZXJzKHZvaWQpCiB7Ci0Jc3RydWN0IGtfY2xvY2sgY2xvY2tfcmVhbHRpbWUgPSB7LnJlcyA9IENMT0NLX1JFQUxUSU1FX1JFUywKLQkJCQkJIC5hYnNfc3RydWN0ID0gJmFic19saXN0CisJc3RydWN0IGtfY2xvY2sgY2xvY2tfcmVhbHRpbWUgPSB7CisJCS5jbG9ja19nZXRyZXMgPSBocnRpbWVyX2dldF9yZXMsCiAJfTsKLQlzdHJ1Y3Qga19jbG9jayBjbG9ja19tb25vdG9uaWMgPSB7LnJlcyA9IENMT0NLX1JFQUxUSU1FX1JFUywKLQkJLmFic19zdHJ1Y3QgPSBOVUxMLAotCQkuY2xvY2tfZ2V0ID0gZG9fcG9zaXhfY2xvY2tfbW9ub3RvbmljX2dldCwKLQkJLmNsb2NrX3NldCA9IGRvX3Bvc2l4X2Nsb2NrX25vc2V0dGltZQorCXN0cnVjdCBrX2Nsb2NrIGNsb2NrX21vbm90b25pYyA9IHsKKwkJLmNsb2NrX2dldHJlcyA9IGhydGltZXJfZ2V0X3JlcywKKwkJLmNsb2NrX2dldCA9IHBvc2l4X2t0aW1lX2dldF90cywKKwkJLmNsb2NrX3NldCA9IGRvX3Bvc2l4X2Nsb2NrX25vc2V0dGltZSwKIAl9OwogCiAJcmVnaXN0ZXJfcG9zaXhfY2xvY2soQ0xPQ0tfUkVBTFRJTUUsICZjbG9ja19yZWFsdGltZSk7CkBAIC0yNjUsMTE3ICsyNTAsMTcgQEAKIAogX19pbml0Y2FsbChpbml0X3Bvc2l4X3RpbWVycyk7CiAKLXN0YXRpYyB2b2lkIHRzdG9qaWZmaWUoc3RydWN0IHRpbWVzcGVjICp0cCwgaW50IHJlcywgdTY0ICpqaWZmKQotewotCWxvbmcgc2VjID0gdHAtPnR2X3NlYzsKLQlsb25nIG5zZWMgPSB0cC0+dHZfbnNlYyArIHJlcyAtIDE7Ci0KLQlpZiAobnNlYyA+PSBOU0VDX1BFUl9TRUMpIHsKLQkJc2VjKys7Ci0JCW5zZWMgLT0gTlNFQ19QRVJfU0VDOwotCX0KLQotCS8qCi0JICogVGhlIHNjYWxpbmcgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIDxsaW51eC90aW1lLmg+Ci0JICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVyZSBhbmQgaGVyZSBpcyB0aGF0IHdlIGRvIHRoZQotCSAqIHJlcyByb3VuZGluZyBhbmQgY29tcHV0ZSBhIDY0LWJpdCByZXN1bHQgKHdlbGwgc28gZG9lcyB0aGF0Ci0JICogYnV0IGl0IHRoZW4gdGhyb3dzIGF3YXkgdGhlIGhpZ2ggYml0cykuCi0gIAkgKi8KLQkqamlmZiA9ICAobXB5X2xfWF9sX2xsKHNlYywgU0VDX0NPTlZFUlNJT04pICsKLQkJICAobXB5X2xfWF9sX2xsKG5zZWMsIE5TRUNfQ09OVkVSU0lPTikgPj4gCi0JCSAgIChOU0VDX0pJRkZJRV9TQyAtIFNFQ19KSUZGSUVfU0MpKSkgPj4gU0VDX0pJRkZJRV9TQzsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gYWRqdXN0cyB0aGUgdGltZXIgYXMgbmVlZGVkIGFzIGEgcmVzdWx0IG9mIHRoZSBjbG9jawotICogYmVpbmcgc2V0LiAgSXQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZvciBhYnNvbHV0ZSB0aW1lcnMsIGFuZCB0aGVuCi0gKiB1bmRlciB0aGUgYWJzX2xpc3QgbG9jay4gIEl0IGNvbXB1dGVzIHRoZSB0aW1lIGRpZmZlcmVuY2UgYW5kIHNldHMKLSAqIHRoZSBuZXcgamlmZmllcyB2YWx1ZSBpbiB0aGUgdGltZXIuICBJdCBhbHNvIHVwZGF0ZXMgdGhlIHRpbWVycwotICogcmVmZXJlbmNlIHdhbGxfdG9fbW9ub3RvbmljIHZhbHVlLiAgSXQgaXMgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QKLSAqIHRoYXQgdHN0b2ppZmZpZXMoKSBvbmx5IGhhbmRsZXMgcG9zaXRpdmUgdGltZXMgYW5kIGl0IG5lZWRzIHRvIHdvcmsKLSAqIHdpdGggYm90aCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgdGltZXMuICBBbHNvLCBmb3IgbmVnYXRpdmUgb2Zmc2V0cywKLSAqIHdlIG5lZWQgdG8gZGVmZWF0IHRoZSByZXMgcm91bmQgdXAuCi0gKgotICogUmV0dXJuIGlzIHRydWUgaWYgdGhlcmUgaXMgYSBuZXcgdGltZSwgZWxzZSBmYWxzZS4KLSAqLwotc3RhdGljIGxvbmcgYWRkX2Nsb2Nrc2V0X2RlbHRhKHN0cnVjdCBrX2l0aW1lciAqdGltciwKLQkJCSAgICAgICBzdHJ1Y3QgdGltZXNwZWMgKm5ld193YWxsX3RvKQotewotCXN0cnVjdCB0aW1lc3BlYyBkZWx0YTsKLQlpbnQgc2lnbiA9IDA7Ci0JdTY0IGV4cDsKLQotCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZkZWx0YSwKLQkJCQluZXdfd2FsbF90by0+dHZfc2VjIC0KLQkJCQl0aW1yLT5pdC5yZWFsLndhbGxfdG9fcHJldi50dl9zZWMsCi0JCQkJbmV3X3dhbGxfdG8tPnR2X25zZWMgLQotCQkJCXRpbXItPml0LnJlYWwud2FsbF90b19wcmV2LnR2X25zZWMpOwotCWlmIChsaWtlbHkoIShkZWx0YS50dl9zZWMgfCBkZWx0YS50dl9uc2VjKSkpCi0JCXJldHVybiAwOwotCWlmIChkZWx0YS50dl9zZWMgPCAwKSB7Ci0JCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZkZWx0YSwKLQkJCQkJLWRlbHRhLnR2X3NlYywKLQkJCQkJMSAtIGRlbHRhLnR2X25zZWMgLQotCQkJCQlwb3NpeF9jbG9ja3NbdGltci0+aXRfY2xvY2tdLnJlcyk7Ci0JCXNpZ24rKzsKLQl9Ci0JdHN0b2ppZmZpZSgmZGVsdGEsIHBvc2l4X2Nsb2Nrc1t0aW1yLT5pdF9jbG9ja10ucmVzLCAmZXhwKTsKLQl0aW1yLT5pdC5yZWFsLndhbGxfdG9fcHJldiA9ICpuZXdfd2FsbF90bzsKLQl0aW1yLT5pdC5yZWFsLnRpbWVyLmV4cGlyZXMgKz0gKHNpZ24gPyAtZXhwIDogZXhwKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgcmVtb3ZlX2Zyb21fYWJzbGlzdChzdHJ1Y3Qga19pdGltZXIgKnRpbXIpCi17Ci0JaWYgKCFsaXN0X2VtcHR5KCZ0aW1yLT5pdC5yZWFsLmFic190aW1lcl9lbnRyeSkpIHsKLQkJc3Bpbl9sb2NrKCZhYnNfbGlzdC5sb2NrKTsKLQkJbGlzdF9kZWxfaW5pdCgmdGltci0+aXQucmVhbC5hYnNfdGltZXJfZW50cnkpOwotCQlzcGluX3VubG9jaygmYWJzX2xpc3QubG9jayk7Ci0JfQotfQotCiBzdGF0aWMgdm9pZCBzY2hlZHVsZV9uZXh0X3RpbWVyKHN0cnVjdCBrX2l0aW1lciAqdGltcikKIHsKLQlzdHJ1Y3QgdGltZXNwZWMgbmV3X3dhbGxfdG87Ci0Jc3RydWN0IG5vd19zdHJ1Y3Qgbm93OwotCXVuc2lnbmVkIGxvbmcgc2VxOwotCi0JLyoKLQkgKiBTZXQgdXAgdGhlIHRpbWVyIGZvciB0aGUgbmV4dCBpbnRlcnZhbCAoaWYgdGhlcmUgaXMgb25lKS4KLQkgKiBOb3RlOiB0aGlzIGNvZGUgdXNlcyB0aGUgYWJzX3RpbWVyX2xvY2sgdG8gcHJvdGVjdAotCSAqIGl0LnJlYWwud2FsbF90b19wcmV2IGFuZCBtdXN0IGhvbGQgaXQgdW50aWwgZXhwIGlzIHNldCwgbm90IGV4YWN0bHkKLQkgKiBvYnZpb3VzLi4uCi0KLQkgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIENMT0NLX1JFQUxUSU1FKiBhbmQKLQkgKiBDTE9DS19NT05PVE9OSUMqIHRpbWVycy4gIElmIHdlIGV2ZXIgd2FudCB0byBoYW5kbGUgb3RoZXIKLQkgKiBDTE9DS3MsIHRoZSBjYWxsaW5nIGNvZGUgKGRvX3NjaGVkdWxlX25leHRfdGltZXIpIHdvdWxkIG5lZWQKLQkgKiB0byBwdWxsIHRoZSAiY2xvY2siIGluZm8gZnJvbSB0aGUgdGltZXIgYW5kIGRpc3BhdGNoIHRoZQotCSAqICJvdGhlciIgQ0xPQ0tzICJuZXh0IHRpbWVyIiBjb2RlICh3aGljaCwgSSBzdXBwb3NlIHNob3VsZAotCSAqIGFsc28gYmUgYWRkZWQgdG8gdGhlIGtfY2xvY2sgc3RydWN0dXJlKS4KLQkgKi8KLQlpZiAoIXRpbXItPml0LnJlYWwuaW5jcikKKwlpZiAodGltci0+aXQucmVhbC5pbnRlcnZhbC50djY0ID09IDApCiAJCXJldHVybjsKIAotCWRvIHsKLQkJc2VxID0gcmVhZF9zZXFiZWdpbigmeHRpbWVfbG9jayk7Ci0JCW5ld193YWxsX3RvID0Jd2FsbF90b19tb25vdG9uaWM7Ci0JCXBvc2l4X2dldF9ub3coJm5vdyk7Ci0JfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmeHRpbWVfbG9jaywgc2VxKSk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJnRpbXItPml0LnJlYWwuYWJzX3RpbWVyX2VudHJ5KSkgewotCQlzcGluX2xvY2soJmFic19saXN0LmxvY2spOwotCQlhZGRfY2xvY2tzZXRfZGVsdGEodGltciwgJm5ld193YWxsX3RvKTsKLQotCQlwb3NpeF9idW1wX3RpbWVyKHRpbXIsIG5vdyk7Ci0KLQkJc3Bpbl91bmxvY2soJmFic19saXN0LmxvY2spOwotCX0gZWxzZSB7Ci0JCXBvc2l4X2J1bXBfdGltZXIodGltciwgbm93KTsKLQl9CisJdGltci0+aXRfb3ZlcnJ1biArPSBocnRpbWVyX2ZvcndhcmQoJnRpbXItPml0LnJlYWwudGltZXIsCisJCQkJCSAgICB0aW1yLT5pdC5yZWFsLmludGVydmFsKTsKIAl0aW1yLT5pdF9vdmVycnVuX2xhc3QgPSB0aW1yLT5pdF9vdmVycnVuOwogCXRpbXItPml0X292ZXJydW4gPSAtMTsKIAkrK3RpbXItPml0X3JlcXVldWVfcGVuZGluZzsKLQlhZGRfdGltZXIoJnRpbXItPml0LnJlYWwudGltZXIpOworCWhydGltZXJfcmVzdGFydCgmdGltci0+aXQucmVhbC50aW1lcik7CiB9CiAKIC8qCkBAIC0zOTYsMzEgKzI4MSwyMyBAQAogCiAJdGltciA9IGxvY2tfdGltZXIoaW5mby0+c2lfdGlkLCAmZmxhZ3MpOwogCi0JaWYgKCF0aW1yIHx8IHRpbXItPml0X3JlcXVldWVfcGVuZGluZyAhPSBpbmZvLT5zaV9zeXNfcHJpdmF0ZSkKLQkJZ290byBleGl0OworCWlmICh0aW1yICYmIHRpbXItPml0X3JlcXVldWVfcGVuZGluZyA9PSBpbmZvLT5zaV9zeXNfcHJpdmF0ZSkgeworCQlpZiAodGltci0+aXRfY2xvY2sgPCAwKQorCQkJcG9zaXhfY3B1X3RpbWVyX3NjaGVkdWxlKHRpbXIpOworCQllbHNlCisJCQlzY2hlZHVsZV9uZXh0X3RpbWVyKHRpbXIpOwogCi0JaWYgKHRpbXItPml0X2Nsb2NrIDwgMCkJLyogQ1BVIGNsb2NrICovCi0JCXBvc2l4X2NwdV90aW1lcl9zY2hlZHVsZSh0aW1yKTsKLQllbHNlCi0JCXNjaGVkdWxlX25leHRfdGltZXIodGltcik7Ci0JaW5mby0+c2lfb3ZlcnJ1biA9IHRpbXItPml0X292ZXJydW5fbGFzdDsKLWV4aXQ6Ci0JaWYgKHRpbXIpCi0JCXVubG9ja190aW1lcih0aW1yLCBmbGFncyk7CisJCWluZm8tPnNpX292ZXJydW4gPSB0aW1yLT5pdF9vdmVycnVuX2xhc3Q7CisJfQorCisJdW5sb2NrX3RpbWVyKHRpbXIsIGZsYWdzKTsKIH0KIAogaW50IHBvc2l4X3RpbWVyX2V2ZW50KHN0cnVjdCBrX2l0aW1lciAqdGltcixpbnQgc2lfcHJpdmF0ZSkKIHsKIAltZW1zZXQoJnRpbXItPnNpZ3EtPmluZm8sIDAsIHNpemVvZihzaWdpbmZvX3QpKTsKIAl0aW1yLT5zaWdxLT5pbmZvLnNpX3N5c19wcml2YXRlID0gc2lfcHJpdmF0ZTsKLQkvKgotCSAqIFNlbmQgc2lnbmFsIHRvIHRoZSBwcm9jZXNzIHRoYXQgb3ducyB0aGlzIHRpbWVyLgotCi0JICogVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCBhbGwgdGhlIHBvc3NpYmxlIGFic19saXN0cyBzaGFyZSB0aGUKLQkgKiBzYW1lIGxvY2sgKHRoZXJlIGlzIG9ubHkgb25lIGxpc3QgYXQgdGhpcyB0aW1lKS4gSWYgdGhpcyBpcwotCSAqIG5vdCB0aGUgY2FzZSwgdGhlIENMT0NLIGluZm8gd291bGQgbmVlZCB0byBiZSB1c2VkIHRvIGZpbmQKLQkgKiB0aGUgcHJvcGVyIGFicyBsaXN0IGxvY2suCi0JICovCisJLyogU2VuZCBzaWduYWwgdG8gdGhlIHByb2Nlc3MgdGhhdCBvd25zIHRoaXMgdGltZXIuKi8KIAogCXRpbXItPnNpZ3EtPmluZm8uc2lfc2lnbm8gPSB0aW1yLT5pdF9zaWdldl9zaWdubzsKIAl0aW1yLT5zaWdxLT5pbmZvLnNpX2Vycm5vID0gMDsKQEAgLTQ1NCw2NiArMzMxLDM3IEBACiAKICAqIFRoaXMgY29kZSBpcyBmb3IgQ0xPQ0tfUkVBTFRJTUUqIGFuZCBDTE9DS19NT05PVE9OSUMqIHRpbWVycy4KICAqLwotc3RhdGljIHZvaWQgcG9zaXhfdGltZXJfZm4odW5zaWduZWQgbG9uZyBfX2RhdGEpCitzdGF0aWMgaW50IHBvc2l4X3RpbWVyX2ZuKHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGtfaXRpbWVyICp0aW1yID0gKHN0cnVjdCBrX2l0aW1lciAqKSBfX2RhdGE7CisJc3RydWN0IGtfaXRpbWVyICp0aW1yID0gZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgc2VxOwotCXN0cnVjdCB0aW1lc3BlYyBkZWx0YSwgbmV3X3dhbGxfdG87Ci0JdTY0IGV4cCA9IDA7Ci0JaW50IGRvX25vdGlmeSA9IDE7CisJaW50IHNpX3ByaXZhdGUgPSAwOworCWludCByZXQgPSBIUlRJTUVSX05PUkVTVEFSVDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ0aW1yLT5pdF9sb2NrLCBmbGFncyk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZ0aW1yLT5pdC5yZWFsLmFic190aW1lcl9lbnRyeSkpIHsKLQkJc3Bpbl9sb2NrKCZhYnNfbGlzdC5sb2NrKTsKLQkJZG8gewotCQkJc2VxID0gcmVhZF9zZXFiZWdpbigmeHRpbWVfbG9jayk7Ci0JCQluZXdfd2FsbF90byA9CXdhbGxfdG9fbW9ub3RvbmljOwotCQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZ4dGltZV9sb2NrLCBzZXEpKTsKLQkJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJmRlbHRhLAotCQkJCQluZXdfd2FsbF90by50dl9zZWMgLQotCQkJCQl0aW1yLT5pdC5yZWFsLndhbGxfdG9fcHJldi50dl9zZWMsCi0JCQkJCW5ld193YWxsX3RvLnR2X25zZWMgLQotCQkJCQl0aW1yLT5pdC5yZWFsLndhbGxfdG9fcHJldi50dl9uc2VjKTsKLQkJaWYgKGxpa2VseSgoZGVsdGEudHZfc2VjIHwgZGVsdGEudHZfbnNlYyApID09IDApKSB7Ci0JCQkvKiBkbyBub3RoaW5nLCB0aW1lciBpcyBvbiB0aW1lICovCi0JCX0gZWxzZSBpZiAoZGVsdGEudHZfc2VjIDwgMCkgewotCQkJLyogZG8gbm90aGluZywgdGltZXIgaXMgYWxyZWFkeSBsYXRlICovCi0JCX0gZWxzZSB7Ci0JCQkvKiB0aW1lciBpcyBlYXJseSBkdWUgdG8gYSBjbG9jayBzZXQgKi8KLQkJCXRzdG9qaWZmaWUoJmRlbHRhLAotCQkJCSAgIHBvc2l4X2Nsb2Nrc1t0aW1yLT5pdF9jbG9ja10ucmVzLAotCQkJCSAgICZleHApOwotCQkJdGltci0+aXQucmVhbC53YWxsX3RvX3ByZXYgPSBuZXdfd2FsbF90bzsKLQkJCXRpbXItPml0LnJlYWwudGltZXIuZXhwaXJlcyArPSBleHA7Ci0JCQlhZGRfdGltZXIoJnRpbXItPml0LnJlYWwudGltZXIpOwotCQkJZG9fbm90aWZ5ID0gMDsKKworCWlmICh0aW1yLT5pdC5yZWFsLmludGVydmFsLnR2NjQgIT0gMCkKKwkJc2lfcHJpdmF0ZSA9ICsrdGltci0+aXRfcmVxdWV1ZV9wZW5kaW5nOworCisJaWYgKHBvc2l4X3RpbWVyX2V2ZW50KHRpbXIsIHNpX3ByaXZhdGUpKSB7CisJCS8qCisJCSAqIHNpZ25hbCB3YXMgbm90IHNlbnQgYmVjYXVzZSBvZiBzaWdfaWdub3IKKwkJICogd2Ugd2lsbCBub3QgZ2V0IGEgY2FsbCBiYWNrIHRvIHJlc3RhcnQgaXQgQU5ECisJCSAqIGl0IHNob3VsZCBiZSByZXN0YXJ0ZWQuCisJCSAqLworCQlpZiAodGltci0+aXQucmVhbC5pbnRlcnZhbC50djY0ICE9IDApIHsKKwkJCXRpbXItPml0X292ZXJydW4gKz0KKwkJCQlocnRpbWVyX2ZvcndhcmQoJnRpbXItPml0LnJlYWwudGltZXIsCisJCQkJCQl0aW1yLT5pdC5yZWFsLmludGVydmFsKTsKKwkJCXJldCA9IEhSVElNRVJfUkVTVEFSVDsKIAkJfQotCQlzcGluX3VubG9jaygmYWJzX2xpc3QubG9jayk7Ci0KIAl9Ci0JaWYgKGRvX25vdGlmeSkgIHsKLQkJaW50IHNpX3ByaXZhdGU9MDsKIAotCQlpZiAodGltci0+aXQucmVhbC5pbmNyKQotCQkJc2lfcHJpdmF0ZSA9ICsrdGltci0+aXRfcmVxdWV1ZV9wZW5kaW5nOwotCQllbHNlIHsKLQkJCXJlbW92ZV9mcm9tX2Fic2xpc3QodGltcik7Ci0JCX0KLQotCQlpZiAocG9zaXhfdGltZXJfZXZlbnQodGltciwgc2lfcHJpdmF0ZSkpCi0JCQkvKgotCQkJICogc2lnbmFsIHdhcyBub3Qgc2VudCBiZWNhdXNlIG9mIHNpZ19pZ25vcgotCQkJICogd2Ugd2lsbCBub3QgZ2V0IGEgY2FsbCBiYWNrIHRvIHJlc3RhcnQgaXQgQU5ECi0JCQkgKiBpdCBzaG91bGQgYmUgcmVzdGFydGVkLgotCQkJICovCi0JCQlzY2hlZHVsZV9uZXh0X3RpbWVyKHRpbXIpOwotCX0KLQl1bmxvY2tfdGltZXIodGltciwgZmxhZ3MpOyAvKiBob2xkIHRocnUgYWJzIGxvY2sgdG8ga2VlcCBpcnEgb2ZmICovCisJdW5sb2NrX3RpbWVyKHRpbXIsIGZsYWdzKTsKKwlyZXR1cm4gcmV0OwogfQogCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHRhc2tfc3RydWN0ICogZ29vZF9zaWdldmVudChzaWdldmVudF90ICogZXZlbnQpCitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICogZ29vZF9zaWdldmVudChzaWdldmVudF90ICogZXZlbnQpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpydG4gPSBjdXJyZW50LT5ncm91cF9sZWFkZXI7CiAKQEAgLTUzMCw3ICszNzgsNyBAQAogCXJldHVybiBydG47CiB9CiAKLXZvaWQgcmVnaXN0ZXJfcG9zaXhfY2xvY2soY2xvY2tpZF90IGNsb2NrX2lkLCBzdHJ1Y3Qga19jbG9jayAqbmV3X2Nsb2NrKQordm9pZCByZWdpc3Rlcl9wb3NpeF9jbG9jayhjb25zdCBjbG9ja2lkX3QgY2xvY2tfaWQsIHN0cnVjdCBrX2Nsb2NrICpuZXdfY2xvY2spCiB7CiAJaWYgKCh1bnNpZ25lZCkgY2xvY2tfaWQgPj0gTUFYX0NMT0NLUykgewogCQlwcmludGsoIlBPU0lYIGNsb2NrIHJlZ2lzdGVyIGZhaWxlZCBmb3IgY2xvY2tfaWQgJWRcbiIsCkBAIC01NzYsNyArNDI0LDcgQEAKIC8qIENyZWF0ZSBhIFBPU0lYLjFiIGludGVydmFsIHRpbWVyLiAqLwogCiBhc21saW5rYWdlIGxvbmcKLXN5c190aW1lcl9jcmVhdGUoY2xvY2tpZF90IHdoaWNoX2Nsb2NrLAorc3lzX3RpbWVyX2NyZWF0ZShjb25zdCBjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssCiAJCSBzdHJ1Y3Qgc2lnZXZlbnQgX191c2VyICp0aW1lcl9ldmVudF9zcGVjLAogCQkgdGltZXJfdCBfX3VzZXIgKiBjcmVhdGVkX3RpbWVyX2lkKQogewpAQCAtNjAyLDggKzQ1MCw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAlzcGluX2xvY2tfaXJxKCZpZHJfbG9jayk7Ci0JZXJyb3IgPSBpZHJfZ2V0X25ldygmcG9zaXhfdGltZXJzX2lkLAotCQkJICAgICh2b2lkICopIG5ld190aW1lciwKKwllcnJvciA9IGlkcl9nZXRfbmV3KCZwb3NpeF90aW1lcnNfaWQsICh2b2lkICopIG5ld190aW1lciwKIAkJCSAgICAmbmV3X3RpbWVyX2lkKTsKIAlzcGluX3VubG9ja19pcnEoJmlkcl9sb2NrKTsKIAlpZiAoZXJyb3IgPT0gLUVBR0FJTikKQEAgLTcwNCwyNyArNTUxLDYgQEAKIH0KIAogLyoKLSAqIGdvb2RfdGltZXNwZWMKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgZWxlbWVudHMgb2YgYSB0aW1lc3BlYyBzdHJ1Y3R1cmUuCi0gKgotICogQXJndW1lbnRzOgotICogdHMJICAgICA6IFBvaW50ZXIgdG8gdGhlIHRpbWVzcGVjIHN0cnVjdHVyZSB0byBjaGVjawotICoKLSAqIFJldHVybiB2YWx1ZToKLSAqIElmIGEgTlVMTCBwb2ludGVyIHdhcyBwYXNzZWQgaW4sIG9yIHRoZSB0dl9uc2VjIGZpZWxkIHdhcyBsZXNzIHRoYW4gMAotICogb3IgZ3JlYXRlciB0aGFuIE5TRUNfUEVSX1NFQywgb3IgdGhlIHR2X3NlYyBmaWVsZCB3YXMgbGVzcyB0aGFuIDAsCi0gKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgMC4gT3RoZXJ3aXNlIGl0IHJldHVybnMgMS4KLSAqLwotc3RhdGljIGludCBnb29kX3RpbWVzcGVjKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdHMpCi17Ci0JaWYgKCghdHMpIHx8ICh0cy0+dHZfc2VjIDwgMCkgfHwKLQkJCSgodW5zaWduZWQpIHRzLT50dl9uc2VjID49IE5TRUNfUEVSX1NFQykpCi0JCXJldHVybiAwOwotCXJldHVybiAxOwotfQotCi0vKgogICogTG9ja2luZyBpc3N1ZXM6IFdlIG5lZWQgdG8gcHJvdGVjdCB0aGUgcmVzdWx0IG9mIHRoZSBpZCBsb29rIHVwIHVudGlsCiAgKiB3ZSBnZXQgdGhlIHRpbWVyIGxvY2tlZCBkb3duIHNvIGl0IGlzIG5vdCBkZWxldGVkIHVuZGVyIHVzLiAgVGhlCiAgKiByZW1vdmFsIGlzIGRvbmUgdW5kZXIgdGhlIGlkciBzcGlubG9jayBzbyB3ZSB1c2UgdGhhdCBoZXJlIHRvIGJyaWRnZQpAQCAtNzc2LDM5ICs2MDIsMzkgQEAKIHN0YXRpYyB2b2lkCiBjb21tb25fdGltZXJfZ2V0KHN0cnVjdCBrX2l0aW1lciAqdGltciwgc3RydWN0IGl0aW1lcnNwZWMgKmN1cl9zZXR0aW5nKQogewotCXVuc2lnbmVkIGxvbmcgZXhwaXJlczsKLQlzdHJ1Y3Qgbm93X3N0cnVjdCBub3c7CisJa3RpbWVfdCByZW1haW5pbmc7CisJc3RydWN0IGhydGltZXIgKnRpbWVyID0gJnRpbXItPml0LnJlYWwudGltZXI7CiAKLQlkbwotCQlleHBpcmVzID0gdGltci0+aXQucmVhbC50aW1lci5leHBpcmVzOwotCXdoaWxlICgodm9sYXRpbGUgbG9uZykgKHRpbXItPml0LnJlYWwudGltZXIuZXhwaXJlcykgIT0gZXhwaXJlcyk7CisJbWVtc2V0KGN1cl9zZXR0aW5nLCAwLCBzaXplb2Yoc3RydWN0IGl0aW1lcnNwZWMpKTsKKwlyZW1haW5pbmcgPSBocnRpbWVyX2dldF9yZW1haW5pbmcodGltZXIpOwogCi0JcG9zaXhfZ2V0X25vdygmbm93KTsKLQotCWlmIChleHBpcmVzICYmCi0JICAgICgodGltci0+aXRfc2lnZXZfbm90aWZ5ICYgflNJR0VWX1RIUkVBRF9JRCkgPT0gU0lHRVZfTk9ORSkgJiYKLQkgICAgIXRpbXItPml0LnJlYWwuaW5jciAmJgotCSAgICBwb3NpeF90aW1lX2JlZm9yZSgmdGltci0+aXQucmVhbC50aW1lciwgJm5vdykpCi0JCXRpbXItPml0LnJlYWwudGltZXIuZXhwaXJlcyA9IGV4cGlyZXMgPSAwOwotCWlmIChleHBpcmVzKSB7Ci0JCWlmICh0aW1yLT5pdF9yZXF1ZXVlX3BlbmRpbmcgJiBSRVFVRVVFX1BFTkRJTkcgfHwKLQkJICAgICh0aW1yLT5pdF9zaWdldl9ub3RpZnkgJiB+U0lHRVZfVEhSRUFEX0lEKSA9PSBTSUdFVl9OT05FKSB7Ci0JCQlwb3NpeF9idW1wX3RpbWVyKHRpbXIsIG5vdyk7Ci0JCQlleHBpcmVzID0gdGltci0+aXQucmVhbC50aW1lci5leHBpcmVzOwotCQl9Ci0JCWVsc2UKLQkJCWlmICghdGltZXJfcGVuZGluZygmdGltci0+aXQucmVhbC50aW1lcikpCi0JCQkJZXhwaXJlcyA9IDA7Ci0JCWlmIChleHBpcmVzKQotCQkJZXhwaXJlcyAtPSBub3cuamlmZmllczsKKwkvKiBUaW1lIGxlZnQgPyBvciB0aW1lciBwZW5kaW5nICovCisJaWYgKHJlbWFpbmluZy50djY0ID4gMCB8fCBocnRpbWVyX2FjdGl2ZSh0aW1lcikpCisJCWdvdG8gY2FsY2k7CisJLyogaW50ZXJ2YWwgdGltZXIgPyAqLworCWlmICh0aW1yLT5pdC5yZWFsLmludGVydmFsLnR2NjQgPT0gMCkKKwkJcmV0dXJuOworCS8qCisJICogV2hlbiBhIHJlcXVldWUgaXMgcGVuZGluZyBvciB0aGlzIGlzIGEgU0lHRVZfTk9ORSB0aW1lcgorCSAqIG1vdmUgdGhlIGV4cGlyeSB0aW1lIGZvcndhcmQgYnkgaW50ZXJ2YWxzLCBzbyBleHBpcnkgaXMgPgorCSAqIG5vdy4KKwkgKi8KKwlpZiAodGltci0+aXRfcmVxdWV1ZV9wZW5kaW5nICYgUkVRVUVVRV9QRU5ESU5HIHx8CisJICAgICh0aW1yLT5pdF9zaWdldl9ub3RpZnkgJiB+U0lHRVZfVEhSRUFEX0lEKSA9PSBTSUdFVl9OT05FKSB7CisJCXRpbXItPml0X292ZXJydW4gKz0KKwkJCWhydGltZXJfZm9yd2FyZCh0aW1lciwgdGltci0+aXQucmVhbC5pbnRlcnZhbCk7CisJCXJlbWFpbmluZyA9IGhydGltZXJfZ2V0X3JlbWFpbmluZyh0aW1lcik7CiAJfQotCWppZmZpZXNfdG9fdGltZXNwZWMoZXhwaXJlcywgJmN1cl9zZXR0aW5nLT5pdF92YWx1ZSk7Ci0JamlmZmllc190b190aW1lc3BlYyh0aW1yLT5pdC5yZWFsLmluY3IsICZjdXJfc2V0dGluZy0+aXRfaW50ZXJ2YWwpOwotCi0JaWYgKGN1cl9zZXR0aW5nLT5pdF92YWx1ZS50dl9zZWMgPCAwKSB7CisgY2FsY2k6CisJLyogaW50ZXJ2YWwgdGltZXIgPyAqLworCWlmICh0aW1yLT5pdC5yZWFsLmludGVydmFsLnR2NjQgIT0gMCkKKwkJY3VyX3NldHRpbmctPml0X2ludGVydmFsID0KKwkJCWt0aW1lX3RvX3RpbWVzcGVjKHRpbXItPml0LnJlYWwuaW50ZXJ2YWwpOworCS8qIFJldHVybiAwIG9ubHksIHdoZW4gdGhlIHRpbWVyIGlzIGV4cGlyZWQgYW5kIG5vdCBwZW5kaW5nICovCisJaWYgKHJlbWFpbmluZy50djY0IDw9IDApCiAJCWN1cl9zZXR0aW5nLT5pdF92YWx1ZS50dl9uc2VjID0gMTsKLQkJY3VyX3NldHRpbmctPml0X3ZhbHVlLnR2X3NlYyA9IDA7Ci0JfQorCWVsc2UKKwkJY3VyX3NldHRpbmctPml0X3ZhbHVlID0ga3RpbWVfdG9fdGltZXNwZWMocmVtYWluaW5nKTsKIH0KIAogLyogR2V0IHRoZSB0aW1lIHJlbWFpbmluZyBvbiBhIFBPU0lYLjFiIGludGVydmFsIHRpbWVyLiAqLwpAQCAtODMyLDYgKzY1OCw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKwogLyoKICAqIEdldCB0aGUgbnVtYmVyIG9mIG92ZXJydW5zIG9mIGEgUE9TSVguMWIgaW50ZXJ2YWwgdGltZXIuICBUaGlzIGlzIHRvCiAgKiBiZSB0aGUgb3ZlcnJ1biBvZiB0aGUgdGltZXIgbGFzdCBkZWxpdmVyZWQuICBBdCB0aGUgc2FtZSB0aW1lIHdlIGFyZQpAQCAtODQxLDcgKzY2OCw2IEBACiAgKiB0aGUgY2FsbCBiYWNrIHRvIGRvX3NjaGVkdWxlX25leHRfdGltZXIoKS4gIFNvIGFsbCB3ZSBuZWVkIHRvIGRvIGlzCiAgKiB0byBwaWNrIHVwIHRoZSBmcm96ZW4gb3ZlcnJ1bi4KICAqLwotCiBhc21saW5rYWdlIGxvbmcKIHN5c190aW1lcl9nZXRvdmVycnVuKHRpbWVyX3QgdGltZXJfaWQpCiB7CkBAIC04NTgsMTUzICs2ODQsNTUgQEAKIAogCXJldHVybiBvdmVycnVuOwogfQotLyoKLSAqIEFkanVzdCBmb3IgYWJzb2x1dGUgdGltZQotICoKLSAqIElmIGFic29sdXRlIHRpbWUgaXMgZ2l2ZW4gYW5kIGl0IGlzIG5vdCBDTE9DS19NT05PVE9OSUMsIHdlIG5lZWQgdG8KLSAqIGFkanVzdCBmb3IgdGhlIG9mZnNldCBiZXR3ZWVuIHRoZSB0aW1lciBjbG9jayAoQ0xPQ0tfTU9OT1RPTklDKSBhbmQKLSAqIHdoYXQgZXZlciBjbG9jayBoZSBpcyB1c2luZy4KLSAqCi0gKiBJZiBpdCBpcyByZWxhdGl2ZSB0aW1lLCB3ZSBuZWVkIHRvIGFkZCB0aGUgY3VycmVudCAoQ0xPQ0tfTU9OT1RPTklDKQotICogdGltZSB0byBpdCB0byBnZXQgdGhlIHByb3BlciB0aW1lIGZvciB0aGUgdGltZXIuCi0gKi8KLXN0YXRpYyBpbnQgYWRqdXN0X2Fic190aW1lKHN0cnVjdCBrX2Nsb2NrICpjbG9jaywgc3RydWN0IHRpbWVzcGVjICp0cCwgCi0JCQkgICBpbnQgYWJzLCB1NjQgKmV4cCwgc3RydWN0IHRpbWVzcGVjICp3YWxsX3RvKQotewotCXN0cnVjdCB0aW1lc3BlYyBub3c7Ci0Jc3RydWN0IHRpbWVzcGVjIG9jID0gKnRwOwotCXU2NCBqaWZmaWVzXzY0X2Y7Ci0JaW50IHJ0biA9MDsKLQotCWlmIChhYnMpIHsKLQkJLyoKLQkJICogVGhlIG1hc2sgcGljayB1cCB0aGUgNCBiYXNpYyBjbG9ja3MgCi0JCSAqLwotCQlpZiAoISgoY2xvY2sgLSAmcG9zaXhfY2xvY2tzWzBdKSAmIH5DTE9DS1NfTUFTSykpIHsKLQkJCWppZmZpZXNfNjRfZiA9IGRvX3Bvc2l4X2Nsb2NrX21vbm90b25pY19nZXR0aW1lX3BhcnRzKAotCQkJCSZub3csICB3YWxsX3RvKTsKLQkJCS8qCi0JCQkgKiBJZiB3ZSBhcmUgZG9pbmcgYSBNT05PVE9OSUMgY2xvY2sKLQkJCSAqLwotCQkJaWYoKGNsb2NrIC0gJnBvc2l4X2Nsb2Nrc1swXSkgJiBDTE9DS1NfTU9OTyl7Ci0JCQkJbm93LnR2X3NlYyArPSB3YWxsX3RvLT50dl9zZWM7Ci0JCQkJbm93LnR2X25zZWMgKz0gd2FsbF90by0+dHZfbnNlYzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBOb3Qgb25lIG9mIHRoZSBiYXNpYyBjbG9ja3MKLQkJCSAqLwotCQkJY2xvY2stPmNsb2NrX2dldChjbG9jayAtIHBvc2l4X2Nsb2NrcywgJm5vdyk7Ci0JCQlqaWZmaWVzXzY0X2YgPSBnZXRfamlmZmllc182NCgpOwotCQl9Ci0JCS8qCi0JCSAqIFRha2UgYXdheSBub3cgdG8gZ2V0IGRlbHRhIGFuZCBub3JtYWxpemUKLQkJICovCi0JCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZvYywgb2MudHZfc2VjIC0gbm93LnR2X3NlYywKLQkJCQkJb2MudHZfbnNlYyAtIG5vdy50dl9uc2VjKTsKLQl9ZWxzZXsKLQkJamlmZmllc182NF9mID0gZ2V0X2ppZmZpZXNfNjQoKTsKLQl9Ci0JLyoKLQkgKiBDaGVjayBpZiB0aGUgcmVxdWVzdGVkIHRpbWUgaXMgcHJpb3IgdG8gbm93IChpZiBzbyBzZXQgbm93KQotCSAqLwotCWlmIChvYy50dl9zZWMgPCAwKQotCQlvYy50dl9zZWMgPSBvYy50dl9uc2VjID0gMDsKLQotCWlmIChvYy50dl9zZWMgfCBvYy50dl9uc2VjKQotCQlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmb2MsIG9jLnR2X3NlYywKLQkJCQkJb2MudHZfbnNlYyArIGNsb2NrLT5yZXMpOwotCXRzdG9qaWZmaWUoJm9jLCBjbG9jay0+cmVzLCBleHApOwotCi0JLyoKLQkgKiBDaGVjayBpZiB0aGUgcmVxdWVzdGVkIHRpbWUgaXMgbW9yZSB0aGFuIHRoZSB0aW1lciBjb2RlCi0JICogY2FuIGhhbmRsZSAoaWYgc28gd2UgZXJyb3Igb3V0IGJ1dCByZXR1cm4gdGhlIHZhbHVlIHRvbykuCi0JICovCi0JaWYgKCpleHAgPiAoKHU2NClNQVhfSklGRllfT0ZGU0VUKSkKLQkJCS8qCi0JCQkgKiBUaGlzIGlzIGEgY29uc2lkZXJlZCByZXNwb25zZSwgbm90IGV4YWN0bHkgaW4KLQkJCSAqIGxpbmUgd2l0aCB0aGUgc3RhbmRhcmQgKGluIGZhY3QgaXQgaXMgc2lsZW50IG9uCi0JCQkgKiBwb3NzaWJsZSBvdmVyZmxvd3MpLiAgV2UgYXNzdW1lIHN1Y2ggYSBsYXJnZSAKLQkJCSAqIHZhbHVlIGlzIEFMTU9TVCBhbHdheXMgYSBwcm9ncmFtbWluZyBlcnJvciBhbmQKLQkJCSAqIHRyeSBub3QgdG8gY29tcG91bmQgaXQgYnkgc2V0dGluZyBhIHJlYWxseSBkdW1iCi0JCQkgKiB2YWx1ZS4KLQkJCSAqLwotCQkJcnRuID0gLUVJTlZBTDsKLQkvKgotCSAqIHJldHVybiB0aGUgYWN0dWFsIGppZmZpZXMgZXhwaXJlIHRpbWUsIGZ1bGwgNjQgYml0cwotCSAqLwotCSpleHAgKz0gamlmZmllc182NF9mOwotCXJldHVybiBydG47Ci19CiAKIC8qIFNldCBhIFBPU0lYLjFiIGludGVydmFsIHRpbWVyLiAqLwogLyogdGltci0+aXRfbG9jayBpcyB0YWtlbi4gKi8KLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW50CiBjb21tb25fdGltZXJfc2V0KHN0cnVjdCBrX2l0aW1lciAqdGltciwgaW50IGZsYWdzLAogCQkgc3RydWN0IGl0aW1lcnNwZWMgKm5ld19zZXR0aW5nLCBzdHJ1Y3QgaXRpbWVyc3BlYyAqb2xkX3NldHRpbmcpCiB7Ci0Jc3RydWN0IGtfY2xvY2sgKmNsb2NrID0gJnBvc2l4X2Nsb2Nrc1t0aW1yLT5pdF9jbG9ja107Ci0JdTY0IGV4cGlyZV82NDsKKwlzdHJ1Y3QgaHJ0aW1lciAqdGltZXIgPSAmdGltci0+aXQucmVhbC50aW1lcjsKIAogCWlmIChvbGRfc2V0dGluZykKIAkJY29tbW9uX3RpbWVyX2dldCh0aW1yLCBvbGRfc2V0dGluZyk7CiAKIAkvKiBkaXNhYmxlIHRoZSB0aW1lciAqLwotCXRpbXItPml0LnJlYWwuaW5jciA9IDA7CisJdGltci0+aXQucmVhbC5pbnRlcnZhbC50djY0ID0gMDsKIAkvKgogCSAqIGNhcmVmdWwgaGVyZS4gIElmIHNtcCB3ZSBjb3VsZCBiZSBpbiB0aGUgImZpcmUiIHJvdXRpbmUgd2hpY2ggd2lsbAogCSAqIGJlIHNwaW5uaW5nIGFzIHdlIGhvbGQgdGhlIGxvY2suICBCdXQgdGhpcyBpcyBPTkxZIGFuIFNNUCBpc3N1ZS4KIAkgKi8KLQlpZiAodHJ5X3RvX2RlbF90aW1lcl9zeW5jKCZ0aW1yLT5pdC5yZWFsLnRpbWVyKSA8IDApIHsKLSNpZmRlZiBDT05GSUdfU01QCi0JCS8qCi0JCSAqIEl0IGNhbiBvbmx5IGJlIGFjdGl2ZSBpZiBvbiBhbiBvdGhlciBjcHUuICBTaW5jZQotCQkgKiB3ZSBoYXZlIGNsZWFyZWQgdGhlIGludGVydmFsIHN0dWZmIGFib3ZlLCBpdCBzaG91bGQKLQkJICogY2xlYXIgb25jZSB3ZSByZWxlYXNlIHRoZSBzcGluIGxvY2suICBPZiBjb3Vyc2Ugb25jZQotCQkgKiB3ZSBkbyB0aGF0IGFueXRoaW5nIGNvdWxkIGhhcHBlbiwgaW5jbHVkaW5nIHRoZQotCQkgKiBjb21wbGV0ZSBtZWx0IGRvd24gb2YgdGhlIHRpbWVyLiAgU28gcmV0dXJuIHdpdGgKLQkJICogYSAicmV0cnkiIGV4aXQgc3RhdHVzLgotCQkgKi8KKwlpZiAoaHJ0aW1lcl90cnlfdG9fY2FuY2VsKHRpbWVyKSA8IDApCiAJCXJldHVybiBUSU1FUl9SRVRSWTsKLSNlbmRpZgotCX0KLQotCXJlbW92ZV9mcm9tX2Fic2xpc3QodGltcik7CiAKIAl0aW1yLT5pdF9yZXF1ZXVlX3BlbmRpbmcgPSAodGltci0+aXRfcmVxdWV1ZV9wZW5kaW5nICsgMikgJiAKIAkJflJFUVVFVUVfUEVORElORzsKIAl0aW1yLT5pdF9vdmVycnVuX2xhc3QgPSAwOwotCXRpbXItPml0X292ZXJydW4gPSAtMTsKLQkvKgotCSAqc3dpdGNoIG9mZiB0aGUgdGltZXIgd2hlbiBpdF92YWx1ZSBpcyB6ZXJvCi0JICovCi0JaWYgKCFuZXdfc2V0dGluZy0+aXRfdmFsdWUudHZfc2VjICYmICFuZXdfc2V0dGluZy0+aXRfdmFsdWUudHZfbnNlYykgewotCQl0aW1yLT5pdC5yZWFsLnRpbWVyLmV4cGlyZXMgPSAwOworCisJLyogc3dpdGNoIG9mZiB0aGUgdGltZXIgd2hlbiBpdF92YWx1ZSBpcyB6ZXJvICovCisJaWYgKCFuZXdfc2V0dGluZy0+aXRfdmFsdWUudHZfc2VjICYmICFuZXdfc2V0dGluZy0+aXRfdmFsdWUudHZfbnNlYykKIAkJcmV0dXJuIDA7Ci0JfQogCi0JaWYgKGFkanVzdF9hYnNfdGltZShjbG9jaywKLQkJCSAgICAmbmV3X3NldHRpbmctPml0X3ZhbHVlLCBmbGFncyAmIFRJTUVSX0FCU1RJTUUsIAotCQkJICAgICZleHBpcmVfNjQsICYodGltci0+aXQucmVhbC53YWxsX3RvX3ByZXYpKSkgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JdGltci0+aXQucmVhbC50aW1lci5leHBpcmVzID0gKHVuc2lnbmVkIGxvbmcpZXhwaXJlXzY0OwotCXRzdG9qaWZmaWUoJm5ld19zZXR0aW5nLT5pdF9pbnRlcnZhbCwgY2xvY2stPnJlcywgJmV4cGlyZV82NCk7Ci0JdGltci0+aXQucmVhbC5pbmNyID0gKHVuc2lnbmVkIGxvbmcpZXhwaXJlXzY0OwotCi0JLyoKLQkgKiBXZSBkbyBub3QgZXZlbiBxdWV1ZSBTSUdFVl9OT05FIHRpbWVycyEgIEJ1dCB3ZSBkbyBwdXQgdGhlbQotCSAqIGluIHRoZSBhYnMgbGlzdCBzbyB3ZSBjYW4gZG8gdGhhdCByaWdodC4KKwkvKiBQb3NpeCBtYWRuZXNzLiBPbmx5IGFic29sdXRlIENMT0NLX1JFQUxUSU1FIHRpbWVycworCSAqIGFyZSBhZmZlY3RlZCBieSBjbG9jayBzZXRzLiBTbyB3ZSBtdXN0IHJlaW5pYXRpbGl6ZQorCSAqIHRoZSB0aW1lci4KIAkgKi8KLQlpZiAoKCh0aW1yLT5pdF9zaWdldl9ub3RpZnkgJiB+U0lHRVZfVEhSRUFEX0lEKSAhPSBTSUdFVl9OT05FKSkKLQkJYWRkX3RpbWVyKCZ0aW1yLT5pdC5yZWFsLnRpbWVyKTsKKwlpZiAodGltci0+aXRfY2xvY2sgPT0gQ0xPQ0tfUkVBTFRJTUUgJiYgKGZsYWdzICYgVElNRVJfQUJTVElNRSkpCisJCWhydGltZXJfcmViYXNlKHRpbWVyLCBDTE9DS19SRUFMVElNRSk7CisJZWxzZQorCQlocnRpbWVyX3JlYmFzZSh0aW1lciwgQ0xPQ0tfTU9OT1RPTklDKTsKIAotCWlmIChmbGFncyAmIFRJTUVSX0FCU1RJTUUgJiYgY2xvY2stPmFic19zdHJ1Y3QpIHsKLQkJc3Bpbl9sb2NrKCZjbG9jay0+YWJzX3N0cnVjdC0+bG9jayk7Ci0JCWxpc3RfYWRkX3RhaWwoJih0aW1yLT5pdC5yZWFsLmFic190aW1lcl9lbnRyeSksCi0JCQkgICAgICAmKGNsb2NrLT5hYnNfc3RydWN0LT5saXN0KSk7Ci0JCXNwaW5fdW5sb2NrKCZjbG9jay0+YWJzX3N0cnVjdC0+bG9jayk7Ci0JfQorCXRpbWVyLT5leHBpcmVzID0gdGltZXNwZWNfdG9fa3RpbWUobmV3X3NldHRpbmctPml0X3ZhbHVlKTsKKworCS8qIENvbnZlcnQgaW50ZXJ2YWwgKi8KKwl0aW1yLT5pdC5yZWFsLmludGVydmFsID0gdGltZXNwZWNfdG9fa3RpbWUobmV3X3NldHRpbmctPml0X2ludGVydmFsKTsKKworCS8qIFNJR0VWX05PTkUgdGltZXJzIGFyZSBub3QgcXVldWVkICEgU2VlIGNvbW1vbl90aW1lcl9nZXQgKi8KKwlpZiAoKCh0aW1yLT5pdF9zaWdldl9ub3RpZnkgJiB+U0lHRVZfVEhSRUFEX0lEKSA9PSBTSUdFVl9OT05FKSkKKwkJcmV0dXJuIDA7CisKKwlocnRpbWVyX3N0YXJ0KHRpbWVyLCB0aW1lci0+ZXhwaXJlcywgKGZsYWdzICYgVElNRVJfQUJTVElNRSkgPworCQkgICAgICBIUlRJTUVSX0FCUyA6IEhSVElNRVJfUkVMKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTAyNiw4ICs3NTQsOCBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X3NwZWMsIG5ld19zZXR0aW5nLCBzaXplb2YgKG5ld19zcGVjKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKCghZ29vZF90aW1lc3BlYygmbmV3X3NwZWMuaXRfaW50ZXJ2YWwpKSB8fAotCSAgICAoIWdvb2RfdGltZXNwZWMoJm5ld19zcGVjLml0X3ZhbHVlKSkpCisJaWYgKCF0aW1lc3BlY192YWxpZCgmbmV3X3NwZWMuaXRfaW50ZXJ2YWwpIHx8CisJICAgICF0aW1lc3BlY192YWxpZCgmbmV3X3NwZWMuaXRfdmFsdWUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIHJldHJ5OgogCXRpbXIgPSBsb2NrX3RpbWVyKHRpbWVyX2lkLCAmZmxhZyk7CkBAIC0xMDQzLDggKzc3MSw4IEBACiAJCWdvdG8gcmV0cnk7CiAJfQogCi0JaWYgKG9sZF9zZXR0aW5nICYmICFlcnJvciAmJiBjb3B5X3RvX3VzZXIob2xkX3NldHRpbmcsCi0JCQkJCQkgICZvbGRfc3BlYywgc2l6ZW9mIChvbGRfc3BlYykpKQorCWlmIChvbGRfc2V0dGluZyAmJiAhZXJyb3IgJiYKKwkgICAgY29weV90b191c2VyKG9sZF9zZXR0aW5nLCAmb2xkX3NwZWMsIHNpemVvZiAob2xkX3NwZWMpKSkKIAkJZXJyb3IgPSAtRUZBVUxUOwogCiAJcmV0dXJuIGVycm9yOwpAQCAtMTA1MiwyNCArNzgwLDEwIEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGNvbW1vbl90aW1lcl9kZWwoc3RydWN0IGtfaXRpbWVyICp0aW1lcikKIHsKLQl0aW1lci0+aXQucmVhbC5pbmNyID0gMDsKKwl0aW1lci0+aXQucmVhbC5pbnRlcnZhbC50djY0ID0gMDsKIAotCWlmICh0cnlfdG9fZGVsX3RpbWVyX3N5bmMoJnRpbWVyLT5pdC5yZWFsLnRpbWVyKSA8IDApIHsKLSNpZmRlZiBDT05GSUdfU01QCi0JCS8qCi0JCSAqIEl0IGNhbiBvbmx5IGJlIGFjdGl2ZSBpZiBvbiBhbiBvdGhlciBjcHUuICBTaW5jZQotCQkgKiB3ZSBoYXZlIGNsZWFyZWQgdGhlIGludGVydmFsIHN0dWZmIGFib3ZlLCBpdCBzaG91bGQKLQkJICogY2xlYXIgb25jZSB3ZSByZWxlYXNlIHRoZSBzcGluIGxvY2suICBPZiBjb3Vyc2Ugb25jZQotCQkgKiB3ZSBkbyB0aGF0IGFueXRoaW5nIGNvdWxkIGhhcHBlbiwgaW5jbHVkaW5nIHRoZQotCQkgKiBjb21wbGV0ZSBtZWx0IGRvd24gb2YgdGhlIHRpbWVyLiAgU28gcmV0dXJuIHdpdGgKLQkJICogYSAicmV0cnkiIGV4aXQgc3RhdHVzLgotCQkgKi8KKwlpZiAoaHJ0aW1lcl90cnlfdG9fY2FuY2VsKCZ0aW1lci0+aXQucmVhbC50aW1lcikgPCAwKQogCQlyZXR1cm4gVElNRVJfUkVUUlk7Ci0jZW5kaWYKLQl9Ci0KLQlyZW1vdmVfZnJvbV9hYnNsaXN0KHRpbWVyKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xMDg1LDI0ICs3OTksMTYgQEAKIAlzdHJ1Y3Qga19pdGltZXIgKnRpbWVyOwogCWxvbmcgZmxhZ3M7CiAKLSNpZmRlZiBDT05GSUdfU01QCi0JaW50IGVycm9yOwogcmV0cnlfZGVsZXRlOgotI2VuZGlmCiAJdGltZXIgPSBsb2NrX3RpbWVyKHRpbWVyX2lkLCAmZmxhZ3MpOwogCWlmICghdGltZXIpCiAJCXJldHVybiAtRUlOVkFMOwogCi0jaWZkZWYgQ09ORklHX1NNUAotCWVycm9yID0gdGltZXJfZGVsZXRlX2hvb2sodGltZXIpOwotCi0JaWYgKGVycm9yID09IFRJTUVSX1JFVFJZKSB7CisJaWYgKHRpbWVyX2RlbGV0ZV9ob29rKHRpbWVyKSA9PSBUSU1FUl9SRVRSWSkgewogCQl1bmxvY2tfdGltZXIodGltZXIsIGZsYWdzKTsKIAkJZ290byByZXRyeV9kZWxldGU7CiAJfQotI2Vsc2UKLQl0aW1lcl9kZWxldGVfaG9vayh0aW1lcik7Ci0jZW5kaWYKKwogCXNwaW5fbG9jaygmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJbGlzdF9kZWwoJnRpbWVyLT5saXN0KTsKIAlzcGluX3VubG9jaygmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CkBAIC0xMTE5LDI5ICs4MjUsMjEgQEAKIAlyZWxlYXNlX3Bvc2l4X3RpbWVyKHRpbWVyLCBJVF9JRF9TRVQpOwogCXJldHVybiAwOwogfQorCiAvKgogICogcmV0dXJuIHRpbWVyIG93bmVkIGJ5IHRoZSBwcm9jZXNzLCB1c2VkIGJ5IGV4aXRfaXRpbWVycwogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaXRpbWVyX2RlbGV0ZShzdHJ1Y3Qga19pdGltZXIgKnRpbWVyKQorc3RhdGljIHZvaWQgaXRpbWVyX2RlbGV0ZShzdHJ1Y3Qga19pdGltZXIgKnRpbWVyKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLSNpZmRlZiBDT05GSUdfU01QCi0JaW50IGVycm9yOwogcmV0cnlfZGVsZXRlOgotI2VuZGlmCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnRpbWVyLT5pdF9sb2NrLCBmbGFncyk7CiAKLSNpZmRlZiBDT05GSUdfU01QCi0JZXJyb3IgPSB0aW1lcl9kZWxldGVfaG9vayh0aW1lcik7Ci0KLQlpZiAoZXJyb3IgPT0gVElNRVJfUkVUUlkpIHsKKwlpZiAodGltZXJfZGVsZXRlX2hvb2sodGltZXIpID09IFRJTUVSX1JFVFJZKSB7CiAJCXVubG9ja190aW1lcih0aW1lciwgZmxhZ3MpOwogCQlnb3RvIHJldHJ5X2RlbGV0ZTsKIAl9Ci0jZWxzZQotCXRpbWVyX2RlbGV0ZV9ob29rKHRpbWVyKTsKLSNlbmRpZgogCWxpc3RfZGVsKCZ0aW1lci0+bGlzdCk7CiAJLyoKIAkgKiBUaGlzIGtlZXBzIGFueSB0YXNrcyB3YWl0aW5nIG9uIHRoZSBzcGluIGxvY2sgZnJvbSB0aGlua2luZwpAQCAtMTE3MCw1NyArODY4LDggQEAKIAl9CiB9CiAKLS8qCi0gKiBBbmQgbm93IGZvciB0aGUgImNsb2NrIiBjYWxscwotICoKLSAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGJvdGggZnJvbSB0aW1lciBmdW5jdGlvbnMgKHdpdGggdGhlIHRpbWVyCi0gKiBzcGluX2xvY2tfaXJxKCkgaGVsZCBhbmQgZnJvbSBjbG9jayBjYWxscyB3aXRoIG5vIGxvY2tpbmcuCVRoZXkgbXVzdAotICogdXNlIHRoZSBzYXZlIGZsYWdzIHZlcnNpb25zIG9mIGxvY2tzLgotICovCi0KLS8qCi0gKiBXZSBkbyB0aWNrcyBoZXJlIHRvIGF2b2lkIHRoZSBpcnEgbG9jayAoIHRoZXkgdGFrZSBzb29vIGxvbmcpLgotICogVGhlIHNlcWxvY2sgaXMgZ3JlYXQgaGVyZS4gIFNpbmNlIHdlIGEgcmVhZGVyLCB3ZSBkb24ndCByZWFsbHkgY2FyZQotICogaWYgd2UgYXJlIGludGVycnVwdGVkIHNpbmNlIHdlIGRvbid0IHRha2UgbG9jayB0aGF0IHdpbGwgc3RhbGwgdXMgb3IKLSAqIGFueSBvdGhlciBjcHUuIFZvaWxhLCBubyBpcnEgbG9jayBpcyBuZWVkZWQuCi0gKgotICovCi0KLXN0YXRpYyB1NjQgZG9fcG9zaXhfY2xvY2tfbW9ub3RvbmljX2dldHRpbWVfcGFydHMoCi0Jc3RydWN0IHRpbWVzcGVjICp0cCwgc3RydWN0IHRpbWVzcGVjICptbykKLXsKLQl1NjQgamlmZjsKLQl1bnNpZ25lZCBpbnQgc2VxOwotCi0JZG8gewotCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKLQkJZ2V0bnN0aW1lb2ZkYXkodHApOwotCQkqbW8gPSB3YWxsX3RvX21vbm90b25pYzsKLQkJamlmZiA9IGppZmZpZXNfNjQ7Ci0KLQl9IHdoaWxlKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOwotCi0JcmV0dXJuIGppZmY7Ci19Ci0KLXN0YXRpYyBpbnQgZG9fcG9zaXhfY2xvY2tfbW9ub3RvbmljX2dldChjbG9ja2lkX3QgY2xvY2ssIHN0cnVjdCB0aW1lc3BlYyAqdHApCi17Ci0Jc3RydWN0IHRpbWVzcGVjIHdhbGxfdG9fbW9ubzsKLQotCWRvX3Bvc2l4X2Nsb2NrX21vbm90b25pY19nZXR0aW1lX3BhcnRzKHRwLCAmd2FsbF90b19tb25vKTsKLQotCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKHRwLCB0cC0+dHZfc2VjICsgd2FsbF90b19tb25vLnR2X3NlYywKLQkJCQl0cC0+dHZfbnNlYyArIHdhbGxfdG9fbW9uby50dl9uc2VjKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgZG9fcG9zaXhfY2xvY2tfbW9ub3RvbmljX2dldHRpbWUoc3RydWN0IHRpbWVzcGVjICp0cCkKLXsKLQlyZXR1cm4gZG9fcG9zaXhfY2xvY2tfbW9ub3RvbmljX2dldChDTE9DS19NT05PVE9OSUMsIHRwKTsKLX0KLQotaW50IGRvX3Bvc2l4X2Nsb2NrX25vc2V0dGltZShjbG9ja2lkX3QgY2xvY2tpZCwgc3RydWN0IHRpbWVzcGVjICp0cCkKKy8qIE5vdCBhdmFpbGFibGUgLyBwb3NzaWJsZS4uLiBmdW5jdGlvbnMgKi8KK2ludCBkb19wb3NpeF9jbG9ja19ub3NldHRpbWUoY29uc3QgY2xvY2tpZF90IGNsb2NraWQsIHN0cnVjdCB0aW1lc3BlYyAqdHApCiB7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CkBAIC0xMjMyLDcgKzg4MSw4IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkb19wb3NpeF9jbG9ja19ub3RpbWVyX2NyZWF0ZSk7CiAKLWludCBkb19wb3NpeF9jbG9ja19ub25hbm9zbGVlcChjbG9ja2lkX3QgY2xvY2ssIGludCBmbGFncywgc3RydWN0IHRpbWVzcGVjICp0KQoraW50IGRvX3Bvc2l4X2Nsb2NrX25vbmFub3NsZWVwKGNvbnN0IGNsb2NraWRfdCBjbG9jaywgaW50IGZsYWdzLAorCQkJICAgICAgIHN0cnVjdCB0aW1lc3BlYyAqdCwgc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqcikKIHsKICNpZm5kZWYgRU5PVFNVUAogCXJldHVybiAtRU9QTk9UU1VQUDsJLyogYWthIEVOT1RTVVAgaW4gdXNlcmxhbmQgZm9yIFBPU0lYICovCkBAIC0xMjQyLDggKzg5Miw4IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkb19wb3NpeF9jbG9ja19ub25hbm9zbGVlcCk7CiAKLWFzbWxpbmthZ2UgbG9uZwotc3lzX2Nsb2NrX3NldHRpbWUoY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICp0cCkKK2FzbWxpbmthZ2UgbG9uZyBzeXNfY2xvY2tfc2V0dGltZShjb25zdCBjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssCisJCQkJICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICp0cCkKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgbmV3X3RwOwogCkBAIC0xMjU2LDcgKzkwNiw3IEBACiB9CiAKIGFzbWxpbmthZ2UgbG9uZwotc3lzX2Nsb2NrX2dldHRpbWUoY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICp0cCkKK3N5c19jbG9ja19nZXR0aW1lKGNvbnN0IGNsb2NraWRfdCB3aGljaF9jbG9jaywgc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqdHApCiB7CiAJc3RydWN0IHRpbWVzcGVjIGtlcm5lbF90cDsKIAlpbnQgZXJyb3I7CkBAIC0xMjczLDcgKzkyMyw3IEBACiB9CiAKIGFzbWxpbmthZ2UgbG9uZwotc3lzX2Nsb2NrX2dldHJlcyhjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssIHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnRwKQorc3lzX2Nsb2NrX2dldHJlcyhjb25zdCBjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssIHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnRwKQogewogCXN0cnVjdCB0aW1lc3BlYyBydG5fdHA7CiAJaW50IGVycm9yOwpAQCAtMTI5MiwxMTcgKzk0MiwzNCBAQAogfQogCiAvKgotICogVGhlIHN0YW5kYXJkIHNheXMgdGhhdCBhbiBhYnNvbHV0ZSBuYW5vc2xlZXAgY2FsbCBNVVNUIHdha2UgdXAgYXQKLSAqIHRoZSByZXF1ZXN0ZWQgdGltZSBpbiBzcGl0ZSBvZiBjbG9jayBzZXR0aW5ncy4gIEhlcmUgaXMgd2hhdCB3ZSBkbzoKLSAqIEZvciBlYWNoIG5hbm9zbGVlcCBjYWxsIHRoYXQgbmVlZHMgaXQgKG9ubHkgYWJzb2x1dGUgYW5kIG5vdCBvbgotICogQ0xPQ0tfTU9OT1RPTklDKiAoYXMgaXQgY2FuIG5vdCBiZSBzZXQpKSB3ZSB0aHJlYWQgYSBsaXR0bGUgc3RydWN0dXJlCi0gKiBpbnRvIHRoZSAibmFub3NsZWVwX2Fic19saXN0Ii4gIEFsbCB3ZSBuZWVkIGlzIHRoZSB0YXNrX3N0cnVjdCBwb2ludGVyLgotICogV2hlbiBldmVyIHRoZSBjbG9jayBpcyBzZXQgd2UganVzdCB3YWtlIHVwIGFsbCB0aG9zZSB0YXNrcy4JIFRoZSByZXN0Ci0gKiBpcyBkb25lIGJ5IHRoZSB3aGlsZSBsb29wIGluIGNsb2NrX25hbm9zbGVlcCgpLgotICoKLSAqIE9uIGxvY2tpbmcsIGNsb2NrX3dhc19zZXQoKSBpcyBjYWxsZWQgZnJvbSB1cGRhdGVfd2FsbF9jbG9jayB3aGljaAotICogaG9sZHMgKG9yIGhhcyBoZWxkIGZvciBpdCkgYSB3cml0ZV9sb2NrX2lycSggeHRpbWVfbG9jaykgYW5kIGlzCi0gKiBjYWxsZWQgZnJvbSB0aGUgdGltZXIgYmggY29kZS4gIFRodXMgd2UgbmVlZCB0aGUgaXJxIHNhdmUgbG9ja3MuCi0gKgotICogQWxzbywgb24gdGhlIGNhbGwgZnJvbSB1cGRhdGVfd2FsbF9jbG9jaywgdGhhdCBpcyBkb25lIGFzIHBhcnQgb2YgYQotICogc29mdGlycSB0aGluZy4gIFdlIGRvbid0IHdhbnQgdG8gZGVsYXkgdGhlIHN5c3RlbSB0aGF0IG11Y2ggKHBvc3NpYmx5Ci0gKiBsb25nIGxpc3Qgb2YgdGltZXJzIHRvIGZpeCksIHNvIHdlIGRlZmVyIHRoYXQgd29yayB0byBrZXZlbnRkLgorICogbmFub3NsZWVwIGZvciBtb25vdG9uaWMgYW5kIHJlYWx0aW1lIGNsb2NrcwogICovCi0KLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChuYW5vc2xlZXBfYWJzX3dxdWV1ZSk7Ci1zdGF0aWMgREVDTEFSRV9XT1JLKGNsb2NrX3dhc19zZXRfd29yaywgKHZvaWQoKikodm9pZCopKWNsb2NrX3dhc19zZXQsIE5VTEwpOwotCi1zdGF0aWMgREVDTEFSRV9NVVRFWChjbG9ja193YXNfc2V0X2xvY2spOwotCi12b2lkIGNsb2NrX3dhc19zZXQodm9pZCkKK3N0YXRpYyBpbnQgY29tbW9uX25zbGVlcChjb25zdCBjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssIGludCBmbGFncywKKwkJCSBzdHJ1Y3QgdGltZXNwZWMgKnRzYXZlLCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICpybXRwKQogewotCXN0cnVjdCBrX2l0aW1lciAqdGltcjsKLQlzdHJ1Y3QgdGltZXNwZWMgbmV3X3dhbGxfdG87Ci0JTElTVF9IRUFEKGN3c19saXN0KTsKLQl1bnNpZ25lZCBsb25nIHNlcTsKKwlpbnQgbW9kZSA9IGZsYWdzICYgVElNRVJfQUJTVElNRSA/IEhSVElNRVJfQUJTIDogSFJUSU1FUl9SRUw7CisJaW50IGNsb2NraWQgPSB3aGljaF9jbG9jazsKIAotCi0JaWYgKHVubGlrZWx5KGluX2ludGVycnVwdCgpKSkgewotCQlzY2hlZHVsZV93b3JrKCZjbG9ja193YXNfc2V0X3dvcmspOwotCQlyZXR1cm47CisJc3dpdGNoICh3aGljaF9jbG9jaykgeworCWNhc2UgQ0xPQ0tfUkVBTFRJTUU6CisJCS8qIFBvc2l4IG1hZG5lc3MuIE9ubHkgYWJzb2x1dGUgdGltZXJzIG9uIGNsb2NrIHJlYWx0aW1lCisJCSAgIGFyZSBhZmZlY3RlZCBieSBjbG9jayBzZXQuICovCisJCWlmIChtb2RlICE9IEhSVElNRVJfQUJTKQorCQkJY2xvY2tpZCA9IENMT0NLX01PTk9UT05JQzsKKwljYXNlIENMT0NLX01PTk9UT05JQzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXdha2VfdXBfYWxsKCZuYW5vc2xlZXBfYWJzX3dxdWV1ZSk7Ci0KLQkvKgotCSAqIENoZWNrIGlmIHRoZXJlIGV4aXN0IFRJTUVSX0FCU1RJTUUgdGltZXJzIHRvIGNvcnJlY3QuCi0JICoKLQkgKiBOb3RlcyBvbiBsb2NraW5nOiBUaGlzIGNvZGUgaXMgcnVuIGluIHRhc2sgY29udGV4dCB3aXRoIGlycQotCSAqIG9uLiAgV2UgQ0FOIGJlIGludGVycnVwdGVkISAgQWxsIG90aGVyIHVzYWdlIG9mIHRoZSBhYnMgbGlzdAotCSAqIGxvY2sgaXMgdW5kZXIgdGhlIHRpbWVyIGxvY2sgd2hpY2ggaG9sZHMgdGhlIGlycSBsb2NrIGFzCi0JICogd2VsbC4gIFdlIFJFQUxMWSBkb24ndCB3YW50IHRvIHNjYW4gdGhlIHdob2xlIGxpc3Qgd2l0aCB0aGUKLQkgKiBpbnRlcnJ1cHQgc3lzdGVtIG9mZiwgQU5EIHdlIHdvdWxkIGxpa2UgYSBzZXF1ZW5jZSBsb2NrIG9uCi0JICogdGhpcyBjb2RlIGFzIHdlbGwuICBTaW5jZSB3ZSBhc3N1bWUgdGhhdCB0aGUgY2xvY2sgd2lsbCBub3QKLQkgKiBiZSBzZXQgb2Z0ZW4sIGl0IHNlZW1zIG9rIHRvIHRha2UgYW5kIHJlbGVhc2UgdGhlIGlycSBsb2NrCi0JICogZm9yIGVhY2ggdGltZXIuICBJbiBmYWN0IGFkZF90aW1lciB3aWxsIGRvIHRoaXMsIHNvIHRoaXMgaXMKLQkgKiBub3QgYW4gaXNzdWUuICBTbyB3ZSBrbm93IHdoZW4gd2UgYXJlIGRvbmUsIHdlIHdpbGwgbW92ZSB0aGUKLQkgKiB3aG9sZSBsaXN0IHRvIGEgbmV3IGxvY2F0aW9uLiAgVGhlbiBhcyB3ZSBwcm9jZXNzIGVhY2ggZW50cnksCi0JICogd2Ugd2lsbCBtb3ZlIGl0IHRvIHRoZSBhY3R1YWwgbGlzdCBhZ2Fpbi4gIFRoaXMgd2F5LCB3aGVuIG91cgotCSAqIGNvcHkgaXMgZW1wdHksIHdlIGFyZSBkb25lLiAgV2UgYXJlIG5vdCBhbGwgdGhhdCBjb25jZXJuZWQKLQkgKiBhYm91dCBwcmVlbXB0aW9uIHNvIHdlIHdpbGwgdXNlIGEgc2VtYXBob3JlIGxvY2sgdG8gcHJvdGVjdAotCSAqIGFnaW5zdCByZWVudHJ5LiAgVGhpcyB3YXkgd2Ugd2lsbCBub3Qgc3RhbGwgYW5vdGhlcgotCSAqIHByb2Nlc3Nvci4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhpcyBtYXkgZGVsYXkgc29tZSB0aW1lcnMKLQkgKiB0aGF0IHNob3VsZCBoYXZlIGV4cGlyZWQsIGdpdmVuIHRoZSBuZXcgY2xvY2ssIGJ1dCBldmVuIHRoaXMKLQkgKiB3aWxsIGJlIG1pbmltYWwgYXMgd2Ugd2lsbCBhbHdheXMgdXBkYXRlIHRvIHRoZSBjdXJyZW50IHRpbWUsCi0JICogZXZlbiBpZiBpdCB3YXMgc2V0IGJ5IGEgdGFzayB0aGF0IGlzIHdhaXRpbmcgZm9yIGVudHJ5IHRvCi0JICogdGhpcyBjb2RlLiAgVGltZXJzIHRoYXQgZXhwaXJlIHRvbyBlYXJseSB3aWxsIGJlIGNhdWdodCBieQotCSAqIHRoZSBleHBpcmUgY29kZSBhbmQgcmVzdGFydGVkLgotCi0JICogQWJzb2x1dGUgdGltZXJzIHRoYXQgcmVwZWF0IGFyZSBsZWZ0IGluIHRoZSBhYnMgbGlzdCB3aGlsZQotCSAqIHdhaXRpbmcgZm9yIHRoZSB0YXNrIHRvIHBpY2sgdXAgdGhlIHNpZ25hbC4gIFRoaXMgbWVhbnMgd2UKLQkgKiBtYXkgZmluZCB0aW1lcnMgdGhhdCBhcmUgbm90IGluIHRoZSAiYWRkX3RpbWVyIiBsaXN0LCBidXQgYXJlCi0JICogaW4gdGhlIGFicyBsaXN0LiAgV2UgZG8gdGhlIHNhbWUgdGhpbmcgZm9yIHRoZXNlLCBzYXZlCi0JICogcHV0dGluZyB0aGVtIGJhY2sgaW4gdGhlICJhZGRfdGltZXIiIGxpc3QuICAoTm90ZSwgdGhlc2UgYXJlCi0JICogbGVmdCBpbiB0aGUgYWJzIGxpc3QgbWFpbmx5IHRvIGluZGljYXRlIHRoYXQgdGhleSBhcmUKLQkgKiBBQlNPTFVURSB0aW1lcnMsIGEgZmFjdCB0aGF0IGlzIHVzZWQgYnkgdGhlIHJlLWFybSBjb2RlLCBhbmQKLQkgKiBmb3Igd2hpY2ggd2UgaGF2ZSBubyBvdGhlciBmbGFnLikKLQotCSAqLwotCi0JZG93bigmY2xvY2tfd2FzX3NldF9sb2NrKTsKLQlzcGluX2xvY2tfaXJxKCZhYnNfbGlzdC5sb2NrKTsKLQlsaXN0X3NwbGljZV9pbml0KCZhYnNfbGlzdC5saXN0LCAmY3dzX2xpc3QpOwotCXNwaW5fdW5sb2NrX2lycSgmYWJzX2xpc3QubG9jayk7Ci0JZG8gewotCQlkbyB7Ci0JCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKLQkJCW5ld193YWxsX3RvID0Jd2FsbF90b19tb25vdG9uaWM7Ci0JCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOwotCi0JCXNwaW5fbG9ja19pcnEoJmFic19saXN0LmxvY2spOwotCQlpZiAobGlzdF9lbXB0eSgmY3dzX2xpc3QpKSB7Ci0JCQlzcGluX3VubG9ja19pcnEoJmFic19saXN0LmxvY2spOwotCQkJYnJlYWs7Ci0JCX0KLQkJdGltciA9IGxpc3RfZW50cnkoY3dzX2xpc3QubmV4dCwgc3RydWN0IGtfaXRpbWVyLAotCQkJCSAgaXQucmVhbC5hYnNfdGltZXJfZW50cnkpOwotCi0JCWxpc3RfZGVsX2luaXQoJnRpbXItPml0LnJlYWwuYWJzX3RpbWVyX2VudHJ5KTsKLQkJaWYgKGFkZF9jbG9ja3NldF9kZWx0YSh0aW1yLCAmbmV3X3dhbGxfdG8pICYmCi0JCSAgICBkZWxfdGltZXIoJnRpbXItPml0LnJlYWwudGltZXIpKSAgLyogdGltZXIgcnVuIHlldD8gKi8KLQkJCWFkZF90aW1lcigmdGltci0+aXQucmVhbC50aW1lcik7Ci0JCWxpc3RfYWRkKCZ0aW1yLT5pdC5yZWFsLmFic190aW1lcl9lbnRyeSwgJmFic19saXN0Lmxpc3QpOwotCQlzcGluX3VubG9ja19pcnEoJmFic19saXN0LmxvY2spOwotCX0gd2hpbGUgKDEpOwotCi0JdXAoJmNsb2NrX3dhc19zZXRfbG9jayk7CisJcmV0dXJuIGhydGltZXJfbmFub3NsZWVwKHRzYXZlLCBybXRwLCBtb2RlLCBjbG9ja2lkKTsKIH0KIAotbG9uZyBjbG9ja19uYW5vc2xlZXBfcmVzdGFydChzdHJ1Y3QgcmVzdGFydF9ibG9jayAqcmVzdGFydF9ibG9jayk7Ci0KIGFzbWxpbmthZ2UgbG9uZwotc3lzX2Nsb2NrX25hbm9zbGVlcChjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssIGludCBmbGFncywKK3N5c19jbG9ja19uYW5vc2xlZXAoY29uc3QgY2xvY2tpZF90IHdoaWNoX2Nsb2NrLCBpbnQgZmxhZ3MsCiAJCSAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICpycXRwLAogCQkgICAgc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqcm10cCkKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgdDsKLQlzdHJ1Y3QgcmVzdGFydF9ibG9jayAqcmVzdGFydF9ibG9jayA9Ci0JICAgICYoY3VycmVudF90aHJlYWRfaW5mbygpLT5yZXN0YXJ0X2Jsb2NrKTsKLQlpbnQgcmV0OwogCiAJaWYgKGludmFsaWRfY2xvY2tpZCh3aGljaF9jbG9jaykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTQxMCwxMjUgKzk3Nyw5IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZ0LCBycXRwLCBzaXplb2YgKHN0cnVjdCB0aW1lc3BlYykpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmICgodW5zaWduZWQpIHQudHZfbnNlYyA+PSBOU0VDX1BFUl9TRUMgfHwgdC50dl9zZWMgPCAwKQorCWlmICghdGltZXNwZWNfdmFsaWQoJnQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qCi0JICogRG8gdGhpcyBoZXJlIGFzIG5zbGVlcCBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRoZSByZWFsIGFkZHJlc3MuCi0JICovCi0JcmVzdGFydF9ibG9jay0+YXJnMSA9ICh1bnNpZ25lZCBsb25nKXJtdHA7Ci0KLQlyZXQgPSBDTE9DS19ESVNQQVRDSCh3aGljaF9jbG9jaywgbnNsZWVwLCAod2hpY2hfY2xvY2ssIGZsYWdzLCAmdCkpOwotCi0JaWYgKChyZXQgPT0gLUVSRVNUQVJUX1JFU1RBUlRCTE9DSykgJiYgcm10cCAmJgotCQkJCQljb3B5X3RvX3VzZXIocm10cCwgJnQsIHNpemVvZiAodCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgY29tbW9uX25zbGVlcChjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssCi0JCQkgaW50IGZsYWdzLCBzdHJ1Y3QgdGltZXNwZWMgKnRzYXZlKQotewotCXN0cnVjdCB0aW1lc3BlYyB0LCBkdW07Ci0JREVDTEFSRV9XQUlUUVVFVUUoYWJzX3dxdWV1ZSwgY3VycmVudCk7Ci0JdTY0IHJxX3RpbWUgPSAodTY0KTA7Ci0JczY0IGxlZnQ7Ci0JaW50IGFiczsKLQlzdHJ1Y3QgcmVzdGFydF9ibG9jayAqcmVzdGFydF9ibG9jayA9Ci0JICAgICZjdXJyZW50X3RocmVhZF9pbmZvKCktPnJlc3RhcnRfYmxvY2s7Ci0KLQlhYnNfd3F1ZXVlLmZsYWdzID0gMDsKLQlhYnMgPSBmbGFncyAmIFRJTUVSX0FCU1RJTUU7Ci0KLQlpZiAocmVzdGFydF9ibG9jay0+Zm4gPT0gY2xvY2tfbmFub3NsZWVwX3Jlc3RhcnQpIHsKLQkJLyoKLQkJICogSW50ZXJydXB0ZWQgYnkgYSBub24tZGVsaXZlcmVkIHNpZ25hbCwgcGljayB1cCByZW1haW5pbmcKLQkJICogdGltZSBhbmQgY29udGludWUuICBSZW1haW5pbmcgdGltZSBpcyBpbiBhcmcyICYgMy4KLQkJICovCi0JCXJlc3RhcnRfYmxvY2stPmZuID0gZG9fbm9fcmVzdGFydF9zeXNjYWxsOwotCi0JCXJxX3RpbWUgPSByZXN0YXJ0X2Jsb2NrLT5hcmczOwotCQlycV90aW1lID0gKHJxX3RpbWUgPDwgMzIpICsgcmVzdGFydF9ibG9jay0+YXJnMjsKLQkJaWYgKCFycV90aW1lKQotCQkJcmV0dXJuIC1FSU5UUjsKLQkJbGVmdCA9IHJxX3RpbWUgLSBnZXRfamlmZmllc182NCgpOwotCQlpZiAobGVmdCA8PSAoczY0KTApCi0JCQlyZXR1cm4gMDsJLyogQWxyZWFkeSBwYXNzZWQgKi8KLQl9Ci0KLQlpZiAoYWJzICYmIChwb3NpeF9jbG9ja3Nbd2hpY2hfY2xvY2tdLmNsb2NrX2dldCAhPQotCQkJICAgIHBvc2l4X2Nsb2Nrc1tDTE9DS19NT05PVE9OSUNdLmNsb2NrX2dldCkpCi0JCWFkZF93YWl0X3F1ZXVlKCZuYW5vc2xlZXBfYWJzX3dxdWV1ZSwgJmFic193cXVldWUpOwotCi0JZG8gewotCQl0ID0gKnRzYXZlOwotCQlpZiAoYWJzIHx8ICFycV90aW1lKSB7Ci0JCQlhZGp1c3RfYWJzX3RpbWUoJnBvc2l4X2Nsb2Nrc1t3aGljaF9jbG9ja10sICZ0LCBhYnMsCi0JCQkJCSZycV90aW1lLCAmZHVtKTsKLQkJfQotCi0JCWxlZnQgPSBycV90aW1lIC0gZ2V0X2ppZmZpZXNfNjQoKTsKLQkJaWYgKGxlZnQgPj0gKHM2NClNQVhfSklGRllfT0ZGU0VUKQotCQkJbGVmdCA9IChzNjQpTUFYX0pJRkZZX09GRlNFVDsKLQkJaWYgKGxlZnQgPCAoczY0KTApCi0JCQlicmVhazsKLQotCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobGVmdCk7Ci0KLQkJbGVmdCA9IHJxX3RpbWUgLSBnZXRfamlmZmllc182NCgpOwotCX0gd2hpbGUgKGxlZnQgPiAoczY0KTAgJiYgIXRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJR1BFTkRJTkcpKTsKLQotCWlmIChhYnNfd3F1ZXVlLnRhc2tfbGlzdC5uZXh0KQotCQlmaW5pc2hfd2FpdCgmbmFub3NsZWVwX2Fic193cXVldWUsICZhYnNfd3F1ZXVlKTsKLQotCWlmIChsZWZ0ID4gKHM2NCkwKSB7Ci0KLQkJLyoKLQkJICogQWx3YXlzIHJlc3RhcnQgYWJzIGNhbGxzIGZyb20gc2NyYXRjaCB0byBwaWNrIHVwIGFueQotCQkgKiBjbG9jayBzaGlmdGluZyB0aGF0IGhhcHBlbmVkIHdoaWxlIHdlIGFyZSBhd2F5LgotCQkgKi8KLQkJaWYgKGFicykKLQkJCXJldHVybiAtRVJFU1RBUlROT0hBTkQ7Ci0KLQkJbGVmdCAqPSBUSUNLX05TRUM7Ci0JCXRzYXZlLT50dl9zZWMgPSBkaXZfbG9uZ19sb25nX3JlbShsZWZ0LCAKLQkJCQkJCSAgTlNFQ19QRVJfU0VDLCAKLQkJCQkJCSAgJnRzYXZlLT50dl9uc2VjKTsKLQkJLyoKLQkJICogUmVzdGFydCB3b3JrcyBieSBzYXZpbmcgdGhlIHRpbWUgcmVtYWluZyBpbiAKLQkJICogYXJnMiAmIDMgKGl0IGlzIDY0LWJpdHMgb2YgamlmZmllcykuICBUaGUgb3RoZXIKLQkJICogaW5mbyB3ZSBuZWVkIGlzIHRoZSBjbG9ja19pZCAoc2F2ZWQgaW4gYXJnMCkuIAotCQkgKiBUaGUgc3lzX2NhbGwgaW50ZXJmYWNlIG5lZWRzIHRoZSB1c2VycyAKLQkJICogdGltZXNwZWMgcmV0dXJuIGFkZHJlc3Mgd2hpY2ggX2l0XyBzYXZlcyBpbiBhcmcxLgotCQkgKiBTaW5jZSB3ZSBoYXZlIGNhc3QgdGhlIG5hbm9zbGVlcCBjYWxsIHRvIGEgY2xvY2tfbmFub3NsZWVwCi0JCSAqIGJvdGggY2FuIGJlIHJlc3RhcnRlZCB3aXRoIHRoZSBzYW1lIGNvZGUuCi0JCSAqLwotCQlyZXN0YXJ0X2Jsb2NrLT5mbiA9IGNsb2NrX25hbm9zbGVlcF9yZXN0YXJ0OwotCQlyZXN0YXJ0X2Jsb2NrLT5hcmcwID0gd2hpY2hfY2xvY2s7Ci0JCS8qCi0JCSAqIENhbGxlciBzZXRzIGFyZzEKLQkJICovCi0JCXJlc3RhcnRfYmxvY2stPmFyZzIgPSBycV90aW1lICYgMHhmZmZmZmZmZkxMOwotCQlyZXN0YXJ0X2Jsb2NrLT5hcmczID0gcnFfdGltZSA+PiAzMjsKLQotCQlyZXR1cm4gLUVSRVNUQVJUX1JFU1RBUlRCTE9DSzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLS8qCi0gKiBUaGlzIHdpbGwgcmVzdGFydCBjbG9ja19uYW5vc2xlZXAuCi0gKi8KLWxvbmcKLWNsb2NrX25hbm9zbGVlcF9yZXN0YXJ0KHN0cnVjdCByZXN0YXJ0X2Jsb2NrICpyZXN0YXJ0X2Jsb2NrKQotewotCXN0cnVjdCB0aW1lc3BlYyB0OwotCWludCByZXQgPSBjb21tb25fbnNsZWVwKHJlc3RhcnRfYmxvY2stPmFyZzAsIDAsICZ0KTsKLQotCWlmICgocmV0ID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0spICYmIHJlc3RhcnRfYmxvY2stPmFyZzEgJiYKLQkgICAgY29weV90b191c2VyKChzdHJ1Y3QgdGltZXNwZWMgX191c2VyICopKHJlc3RhcnRfYmxvY2stPmFyZzEpLCAmdCwKLQkJCSBzaXplb2YgKHQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gQ0xPQ0tfRElTUEFUQ0god2hpY2hfY2xvY2ssIG5zbGVlcCwKKwkJCSAgICAgICh3aGljaF9jbG9jaywgZmxhZ3MsICZ0LCBybXRwKSk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvS2NvbmZpZyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCmluZGV4IDVlYzI0OGMuLjlmZDhkNGYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9LY29uZmlnCisrKyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCkBAIC0zOCw3ICszOCw3IEBACiAKIGNvbmZpZyBTT0ZUV0FSRV9TVVNQRU5ECiAJYm9vbCAiU29mdHdhcmUgU3VzcGVuZCIKLQlkZXBlbmRzIG9uIFBNICYmIFNXQVAgJiYgKFg4NiAmJiAoIVNNUCB8fCBTVVNQRU5EX1NNUCkpIHx8ICgoRlZSIHx8IFBQQzMyKSAmJiAhU01QKQorCWRlcGVuZHMgb24gUE0gJiYgU1dBUCAmJiAoWDg2ICYmICghU01QIHx8IFNVU1BFTkRfU01QKSkgfHwgKChGUlYgfHwgUFBDMzIpICYmICFTTVApCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHRoZSBwb3NzaWJpbGl0eSBvZiBzdXNwZW5kaW5nIHRoZSBtYWNoaW5lLgogCSAgSXQgZG9lc24ndCBuZWVkIEFQTS4KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9kaXNrLmMgYi9rZXJuZWwvcG93ZXIvZGlzay5jCmluZGV4IGUyNDQ0NmYuLmUwM2Q4NWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9kaXNrLmMKKysrIGIva2VybmVsL3Bvd2VyL2Rpc2suYwpAQCAtNTMsNyArNTMsNyBAQAogCiAJc3dpdGNoKG1vZGUpIHsKIAljYXNlIFBNX0RJU0tfUExBVEZPUk06Ci0JCWtlcm5lbF9wb3dlcl9vZmZfcHJlcGFyZSgpOworCQlrZXJuZWxfc2h1dGRvd25fcHJlcGFyZShTWVNURU1fU1VTUEVORF9ESVNLKTsKIAkJZXJyb3IgPSBwbV9vcHMtPmVudGVyKFBNX1NVU1BFTkRfRElTSyk7CiAJCWJyZWFrOwogCWNhc2UgUE1fRElTS19TSFVURE9XTjoKQEAgLTk1LDEzICs5NSw2IEBACiAJCWdvdG8gdGhhdzsKIAl9CiAKLQlpZiAocG1fZGlza19tb2RlID09IFBNX0RJU0tfUExBVEZPUk0pIHsKLQkJaWYgKHBtX29wcyAmJiBwbV9vcHMtPnByZXBhcmUpIHsKLQkJCWlmICgoZXJyb3IgPSBwbV9vcHMtPnByZXBhcmUoUE1fU1VTUEVORF9ESVNLKSkpCi0JCQkJZ290byB0aGF3OwotCQl9Ci0JfQotCiAJLyogRnJlZSBtZW1vcnkgYmVmb3JlIHNodXR0aW5nIGRvd24gZGV2aWNlcy4gKi8KIAlpZiAoIShlcnJvciA9IHN3c3VzcF9zaHJpbmtfbWVtb3J5KCkpKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9tYWluLmMgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCmluZGV4IGQyNTNmM2EuLjljYjIzNWMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9tYWluLmMKKysrIGIva2VybmVsL3Bvd2VyL21haW4uYwpAQCAtMTMzLDEwICsxMzMsMTAgQEAKIHN0YXRpYyB2b2lkIHN1c3BlbmRfZmluaXNoKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKIHsKIAlkZXZpY2VfcmVzdW1lKCk7Ci0JaWYgKHBtX29wcyAmJiBwbV9vcHMtPmZpbmlzaCkKLQkJcG1fb3BzLT5maW5pc2goc3RhdGUpOwogCXRoYXdfcHJvY2Vzc2VzKCk7CiAJZW5hYmxlX25vbmJvb3RfY3B1cygpOworCWlmIChwbV9vcHMgJiYgcG1fb3BzLT5maW5pc2gpCisJCXBtX29wcy0+ZmluaXNoKHN0YXRlKTsKIAlwbV9yZXN0b3JlX2NvbnNvbGUoKTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3ByaW50ay5jIGIva2VybmVsL3ByaW50ay5jCmluZGV4IDUyODdiZTguLjEzY2VkMGYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wcmludGsuYworKysgYi9rZXJuZWwvcHJpbnRrLmMKQEAgLTExLDcgKzExLDcgQEAKICAqIFRlZCBUcydvLCAyLzExLzkzLgogICogTW9kaWZpZWQgZm9yIHN5c2N0bCBzdXBwb3J0LCAxLzgvOTcsIENocmlzIEhvcm4uCiAgKiBGaXhlZCBTTVAgc3luY2hyb25pemF0aW9uLCAwOC8wOC85OSwgTWFuZnJlZCBTcHJhdWwKLSAqICAgICBtYW5mcmVkc0Bjb2xvcmZ1bGxpZmUuY29tCisgKiAgICAgbWFuZnJlZEBjb2xvcmZ1bGxpZmUuY29tCiAgKiBSZXdyb3RlIGJpdHMgdG8gZ2V0IHJpZCBvZiBjb25zb2xlX2xvY2sKICAqCTAxTWFyMDEgQW5kcmV3IE1vcnRvbiA8YW5kcmV3bUB1b3cuZWR1LmF1PgogICovCkBAIC01NjksNyArNTY5LDcgQEAKIAkJCQkgICBwWzFdIDw9ICc3JyAmJiBwWzJdID09ICc+JykgewogCQkJCQlsb2dsZXZfY2hhciA9IHBbMV07CiAJCQkJCXAgKz0gMzsKLQkJCQkJcHJpbnRlZF9sZW4gKz0gMzsKKwkJCQkJcHJpbnRlZF9sZW4gLT0gMzsKIAkJCQl9IGVsc2UgewogCQkJCQlsb2dsZXZfY2hhciA9IGRlZmF1bHRfbWVzc2FnZV9sb2dsZXZlbAogCQkJCQkJKyAnMCc7CkBAIC01ODQsNyArNTg0LDcgQEAKIAogCQkJCWZvciAodHAgPSB0YnVmOyB0cCA8IHRidWYgKyB0bGVuOyB0cCsrKQogCQkJCQllbWl0X2xvZ19jaGFyKCp0cCk7Ci0JCQkJcHJpbnRlZF9sZW4gKz0gdGxlbiAtIDM7CisJCQkJcHJpbnRlZF9sZW4gKz0gdGxlbjsKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKHBbMF0gIT0gJzwnIHx8IHBbMV0gPCAnMCcgfHwKIAkJCQkgICBwWzFdID4gJzcnIHx8IHBbMl0gIT0gJz4nKSB7CkBAIC01OTIsOCArNTkyLDggQEAKIAkJCQkJZW1pdF9sb2dfY2hhcihkZWZhdWx0X21lc3NhZ2VfbG9nbGV2ZWwKIAkJCQkJCSsgJzAnKTsKIAkJCQkJZW1pdF9sb2dfY2hhcignPicpOworCQkJCQlwcmludGVkX2xlbiArPSAzOwogCQkJCX0KLQkJCQlwcmludGVkX2xlbiArPSAzOwogCQkJfQogCQkJbG9nX2xldmVsX3Vua25vd24gPSAwOwogCQkJaWYgKCEqcCkKZGlmZiAtLWdpdCBhL2tlcm5lbC9wdHJhY2UuYyBiL2tlcm5lbC9wdHJhY2UuYwppbmRleCA2NTY0NzZlLi41ZjMzY2RiIDEwMDY0NAotLS0gYS9rZXJuZWwvcHRyYWNlLmMKKysrIGIva2VybmVsL3B0cmFjZS5jCkBAIC03LDYgKzcsNyBAQAogICogdG8gY29udGludWFsbHkgZHVwbGljYXRlIGFjcm9zcyBldmVyeSBhcmNoaXRlY3R1cmUuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CkBAIC00MDgsNTQgKzQwOSw2MiBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNpZm5kZWYgX19BUkNIX1NZU19QVFJBQ0UKLXN0YXRpYyBpbnQgcHRyYWNlX2dldF90YXNrX3N0cnVjdChsb25nIHJlcXVlc3QsIGxvbmcgcGlkLAotCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKipjaGlsZHApCisvKioKKyAqIHB0cmFjZV90cmFjZW1lICAtLSAgaGVscGVyIGZvciBQVFJBQ0VfVFJBQ0VNRQorICoKKyAqIFBlcmZvcm1zIGNoZWNrcyBhbmQgc2V0cyBQVF9QVFJBQ0VELgorICogU2hvdWxkIGJlIHVzZWQgYnkgYWxsIHB0cmFjZSBpbXBsZW1lbnRhdGlvbnMgZm9yIFBUUkFDRV9UUkFDRU1FLgorICovCitpbnQgcHRyYWNlX3RyYWNlbWUodm9pZCkKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkOwogCWludCByZXQ7CiAKIAkvKgotCSAqIENhbGxlcnMgdXNlIGNoaWxkID09IE5VTEwgYXMgYW4gaW5kaWNhdGlvbiB0byBleGl0IGVhcmx5IGV2ZW4KLQkgKiB3aGVuIHRoZSByZXR1cm4gdmFsdWUgaXMgMCwgc28gbWFrZSBzdXJlIGl0IGlzIG5vbi1OVUxMIGhlcmUuCisJICogQXJlIHdlIGFscmVhZHkgYmVpbmcgdHJhY2VkPwogCSAqLwotCSpjaGlsZHAgPSBOVUxMOworCWlmIChjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKQorCQlyZXR1cm4gLUVQRVJNOworCXJldCA9IHNlY3VyaXR5X3B0cmFjZShjdXJyZW50LT5wYXJlbnQsIGN1cnJlbnQpOworCWlmIChyZXQpCisJCXJldHVybiAtRVBFUk07CisJLyoKKwkgKiBTZXQgdGhlIHB0cmFjZSBiaXQgaW4gdGhlIHByb2Nlc3MgcHRyYWNlIGZsYWdzLgorCSAqLworCWN1cnJlbnQtPnB0cmFjZSB8PSBQVF9QVFJBQ0VEOworCXJldHVybiAwOworfQogCi0JaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1RSQUNFTUUpIHsKLQkJLyoKLQkJICogQXJlIHdlIGFscmVhZHkgYmVpbmcgdHJhY2VkPwotCQkgKi8KLQkJaWYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpCi0JCQlyZXR1cm4gLUVQRVJNOwotCQlyZXQgPSBzZWN1cml0eV9wdHJhY2UoY3VycmVudC0+cGFyZW50LCBjdXJyZW50KTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiAtRVBFUk07Ci0JCS8qCi0JCSAqIFNldCB0aGUgcHRyYWNlIGJpdCBpbiB0aGUgcHJvY2VzcyBwdHJhY2UgZmxhZ3MuCi0JCSAqLwotCQljdXJyZW50LT5wdHJhY2UgfD0gUFRfUFRSQUNFRDsKLQkJcmV0dXJuIDA7Ci0JfQorLyoqCisgKiBwdHJhY2VfZ2V0X3Rhc2tfc3RydWN0ICAtLSAgZ3JhYiBhIHRhc2sgc3RydWN0IHJlZmVyZW5jZSBmb3IgcHRyYWNlCisgKiBAcGlkOiAgICAgICBwcm9jZXNzIGlkIHRvIGdyYWIgYSB0YXNrX3N0cnVjdCByZWZlcmVuY2Ugb2YKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgaGVscGVyIGZvciBwdHJhY2UgaW1wbGVtZW50YXRpb25zLiAgSXQgY2hlY2tzCisgKiBwZXJtaXNzaW9ucyBhbmQgdGhlbiBncmFicyBhIHRhc2sgc3RydWN0IGZvciB1c2Ugb2YgdGhlIGFjdHVhbAorICogcHRyYWNlIGltcGxlbWVudGF0aW9uLgorICoKKyAqIFJldHVybnMgdGhlIHRhc2tfc3RydWN0IGZvciBAcGlkIG9yIGFuIEVSUl9QVFIoKSBvbiBmYWlsdXJlLgorICovCitzdHJ1Y3QgdGFza19zdHJ1Y3QgKnB0cmFjZV9nZXRfdGFza19zdHJ1Y3QocGlkX3QgcGlkKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQ7CiAKIAkvKgotCSAqIFlvdSBtYXkgbm90IG1lc3Mgd2l0aCBpbml0CisJICogVHJhY2luZyBpbml0IGlzIG5vdCBhbGxvd2VkLgogCSAqLwogCWlmIChwaWQgPT0gMSkKLQkJcmV0dXJuIC1FUEVSTTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVQRVJNKTsKIAotCXJldCA9IC1FU1JDSDsKIAlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwogCWNoaWxkID0gZmluZF90YXNrX2J5X3BpZChwaWQpOwogCWlmIChjaGlsZCkKIAkJZ2V0X3Rhc2tfc3RydWN0KGNoaWxkKTsKIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAJaWYgKCFjaGlsZCkKLQkJcmV0dXJuIC1FU1JDSDsKLQotCSpjaGlsZHAgPSBjaGlsZDsKLQlyZXR1cm4gMDsKKwkJcmV0dXJuIEVSUl9QVFIoLUVTUkNIKTsKKwlyZXR1cm4gY2hpbGQ7CiB9CiAKKyNpZm5kZWYgX19BUkNIX1NZU19QVFJBQ0UKIGFzbWxpbmthZ2UgbG9uZyBzeXNfcHRyYWNlKGxvbmcgcmVxdWVzdCwgbG9uZyBwaWQsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQ7CkBAIC00NjUsOSArNDc0LDE2IEBACiAJICogVGhpcyBsb2NrX2tlcm5lbCBmaXhlcyBhIHN1YnRsZSByYWNlIHdpdGggc3VpZCBleGVjCiAJICovCiAJbG9ja19rZXJuZWwoKTsKLQlyZXQgPSBwdHJhY2VfZ2V0X3Rhc2tfc3RydWN0KHJlcXVlc3QsIHBpZCwgJmNoaWxkKTsKLQlpZiAoIWNoaWxkKQorCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9UUkFDRU1FKSB7CisJCXJldCA9IHB0cmFjZV90cmFjZW1lKCk7CiAJCWdvdG8gb3V0OworCX0KKworCWNoaWxkID0gcHRyYWNlX2dldF90YXNrX3N0cnVjdChwaWQpOworCWlmIChJU19FUlIoY2hpbGQpKSB7CisJCXJldCA9IFBUUl9FUlIoY2hpbGQpOworCQlnb3RvIG91dDsKKwl9CiAKIAlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfQVRUQUNIKSB7CiAJCXJldCA9IHB0cmFjZV9hdHRhY2goY2hpbGQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXBkYXRlLmMgYi9rZXJuZWwvcmN1cGRhdGUuYwppbmRleCA0OGQzYmNlLi4wY2Y4MTQ2IDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1cGRhdGUuYworKysgYi9rZXJuZWwvcmN1cGRhdGUuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CkBAIC00NSwyNiArNDYsMjEgQEAKICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+Ci0jaW5jbHVkZSA8bGludXgvcmN1cmVmLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAKIC8qIERlZmluaXRpb24gZm9yIHJjdXBkYXRlIGNvbnRyb2wgYmxvY2suICovCi1zdHJ1Y3QgcmN1X2N0cmxibGsgcmN1X2N0cmxibGsgPSAKLQl7IC5jdXIgPSAtMzAwLCAuY29tcGxldGVkID0gLTMwMCB9Owotc3RydWN0IHJjdV9jdHJsYmxrIHJjdV9iaF9jdHJsYmxrID0KLQl7IC5jdXIgPSAtMzAwLCAuY29tcGxldGVkID0gLTMwMCB9OwotCi0vKiBCb29ra2VlcGluZyBvZiB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIGdyYWNlIHBlcmlvZCAqLwotc3RydWN0IHJjdV9zdGF0ZSB7Ci0Jc3BpbmxvY2tfdAlsb2NrOyAvKiBHdWFyZCB0aGlzIHN0cnVjdCBhbmQgd3JpdGVzIHRvIHJjdV9jdHJsYmxrICovCi0JY3B1bWFza190CWNwdW1hc2s7IC8qIENQVXMgdGhhdCBuZWVkIHRvIHN3aXRjaCBpbiBvcmRlciAgICAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBjdXJyZW50IGJhdGNoIHRvIHByb2NlZWQuICAgICAgICAqLworc3RydWN0IHJjdV9jdHJsYmxrIHJjdV9jdHJsYmxrID0geworCS5jdXIgPSAtMzAwLAorCS5jb21wbGV0ZWQgPSAtMzAwLAorCS5sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VELAorCS5jcHVtYXNrID0gQ1BVX01BU0tfTk9ORSwKIH07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmN1X3N0YXRlIHJjdV9zdGF0ZSBfX19fY2FjaGVsaW5lX21heGFsaWduZWRfaW5fc21wID0KLQkgIHsubG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRCwgLmNwdW1hc2sgPSBDUFVfTUFTS19OT05FIH07Ci1zdGF0aWMgc3RydWN0IHJjdV9zdGF0ZSByY3VfYmhfc3RhdGUgX19fX2NhY2hlbGluZV9tYXhhbGlnbmVkX2luX3NtcCA9Ci0JICB7LmxvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQsIC5jcHVtYXNrID0gQ1BVX01BU0tfTk9ORSB9Oworc3RydWN0IHJjdV9jdHJsYmxrIHJjdV9iaF9jdHJsYmxrID0geworCS5jdXIgPSAtMzAwLAorCS5jb21wbGV0ZWQgPSAtMzAwLAorCS5sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VELAorCS5jcHVtYXNrID0gQ1BVX01BU0tfTk9ORSwKK307CiAKIERFRklORV9QRVJfQ1BVKHN0cnVjdCByY3VfZGF0YSwgcmN1X2RhdGEpID0geyAwTCB9OwogREVGSU5FX1BFUl9DUFUoc3RydWN0IHJjdV9kYXRhLCByY3VfYmhfZGF0YSkgPSB7IDBMIH07CkBAIC03MywxOSArNjksNiBAQAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB0YXNrbGV0X3N0cnVjdCwgcmN1X3Rhc2tsZXQpID0ge05VTEx9Owogc3RhdGljIGludCBtYXhiYXRjaCA9IDEwMDAwOwogCi0jaWZuZGVmIF9fSEFWRV9BUkNIX0NNUFhDSEcKLS8qCi0gKiBXZSB1c2UgYW4gYXJyYXkgb2Ygc3BpbmxvY2tzIGZvciB0aGUgcmN1cmVmcyAtLSBzaW1pbGFyIHRvIG9uZXMgaW4gc3BhcmMKLSAqIDMyIGJpdCBhdG9taWNfdCBpbXBsZW1lbnRhdGlvbnMsIGFuZCBhIGhhc2ggZnVuY3Rpb24gc2ltaWxhciB0byB0aGF0Ci0gKiBmb3Igb3VyIHJlZmNvdW50aW5nIG5lZWRzLgotICogQ2FuJ3QgaGVscCBtdWx0aXByb2Nlc3NvcnMgd2hpY2ggZG9ub3QgaGF2ZSBjbXB4Y2hnIDooCi0gKi8KLQotc3BpbmxvY2tfdCBfX3JjdXJlZl9oYXNoW1JDVVJFRl9IQVNIX1NJWkVdID0gewotCVswIC4uLiAoUkNVUkVGX0hBU0hfU0laRS0xKV0gPSBTUElOX0xPQ0tfVU5MT0NLRUQKLX07Ci0jZW5kaWYKLQogLyoqCiAgKiBjYWxsX3JjdSAtIFF1ZXVlIGFuIFJDVSBjYWxsYmFjayBmb3IgaW52b2NhdGlvbiBhZnRlciBhIGdyYWNlIHBlcmlvZC4KICAqIEBoZWFkOiBzdHJ1Y3R1cmUgdG8gYmUgdXNlZCBmb3IgcXVldWVpbmcgdGhlIFJDVSB1cGRhdGVzLgpAQCAtMjMzLDEzICsyMTYsMTMgQEAKICAqICAgVGhpcyBpcyBkb25lIGJ5IHJjdV9zdGFydF9iYXRjaC4gVGhlIHN0YXJ0IGlzIG5vdCBicm9hZGNhc3RlZCB0bwogICogICBhbGwgY3B1cywgdGhleSBtdXN0IHBpY2sgdGhpcyB1cCBieSBjb21wYXJpbmcgcmNwLT5jdXIgd2l0aAogICogICByZHAtPnF1aWVzY2JhdGNoLiBBbGwgY3B1cyBhcmUgcmVjb3JkZWQgIGluIHRoZQotICogICByY3Vfc3RhdGUuY3B1bWFzayBiaXRtYXAuCisgKiAgIHJjdV9jdHJsYmxrLmNwdW1hc2sgYml0bWFwLgogICogLSBBbGwgY3B1cyBtdXN0IGdvIHRocm91Z2ggYSBxdWllc2NlbnQgc3RhdGUuCiAgKiAgIFNpbmNlIHRoZSBzdGFydCBvZiB0aGUgZ3JhY2UgcGVyaW9kIGlzIG5vdCBicm9hZGNhc3RlZCwgYXQgbGVhc3QgdHdvCiAgKiAgIGNhbGxzIHRvIHJjdV9jaGVja19xdWllc2NlbnRfc3RhdGUgYXJlIHJlcXVpcmVkOgogICogICBUaGUgZmlyc3QgY2FsbCBqdXN0IG5vdGljZXMgdGhhdCBhIG5ldyBncmFjZSBwZXJpb2QgaXMgcnVubmluZy4gVGhlCiAgKiAgIGZvbGxvd2luZyBjYWxscyBjaGVjayBpZiB0aGVyZSB3YXMgYSBxdWllc2NlbnQgc3RhdGUgc2luY2UgdGhlIGJlZ2lubmluZwotICogICBvZiB0aGUgZ3JhY2UgcGVyaW9kLiBJZiBzbywgaXQgdXBkYXRlcyByY3Vfc3RhdGUuY3B1bWFzay4gSWYKKyAqICAgb2YgdGhlIGdyYWNlIHBlcmlvZC4gSWYgc28sIGl0IHVwZGF0ZXMgcmN1X2N0cmxibGsuY3B1bWFzay4gSWYKICAqICAgdGhlIGJpdG1hcCBpcyBlbXB0eSwgdGhlbiB0aGUgZ3JhY2UgcGVyaW9kIGlzIGNvbXBsZXRlZC4KICAqICAgcmN1X2NoZWNrX3F1aWVzY2VudF9zdGF0ZSBjYWxscyByY3Vfc3RhcnRfYmF0Y2goMCkgdG8gc3RhcnQgdGhlIG5leHQgZ3JhY2UKICAqICAgcGVyaW9kIChpZiBuZWNlc3NhcnkpLgpAQCAtMjQ3LDE0ICsyMzAsMTAgQEAKIC8qCiAgKiBSZWdpc3RlciBhIG5ldyBiYXRjaCBvZiBjYWxsYmFja3MsIGFuZCBzdGFydCBpdCB1cCBpZiB0aGVyZSBpcyBjdXJyZW50bHkgbm8KICAqIGFjdGl2ZSBiYXRjaCBhbmQgdGhlIGJhdGNoIHRvIGJlIHJlZ2lzdGVyZWQgaGFzIG5vdCBhbHJlYWR5IG9jY3VycmVkLgotICogQ2FsbGVyIG11c3QgaG9sZCByY3Vfc3RhdGUubG9jay4KKyAqIENhbGxlciBtdXN0IGhvbGQgcmN1X2N0cmxibGsubG9jay4KICAqLwotc3RhdGljIHZvaWQgcmN1X3N0YXJ0X2JhdGNoKHN0cnVjdCByY3VfY3RybGJsayAqcmNwLCBzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsCi0JCQkJaW50IG5leHRfcGVuZGluZykKK3N0YXRpYyB2b2lkIHJjdV9zdGFydF9iYXRjaChzdHJ1Y3QgcmN1X2N0cmxibGsgKnJjcCkKIHsKLQlpZiAobmV4dF9wZW5kaW5nKQotCQlyY3AtPm5leHRfcGVuZGluZyA9IDE7Ci0KIAlpZiAocmNwLT5uZXh0X3BlbmRpbmcgJiYKIAkJCXJjcC0+Y29tcGxldGVkID09IHJjcC0+Y3VyKSB7CiAJCXJjcC0+bmV4dF9wZW5kaW5nID0gMDsKQEAgLTI2OCwxMSArMjQ3LDExIEBACiAJCS8qCiAJCSAqIEFjY2Vzc2luZyBub2h6X2NwdV9tYXNrIGJlZm9yZSBpbmNyZW1lbnRpbmcgcmNwLT5jdXIgbmVlZHMgYQogCQkgKiBCYXJyaWVyICBPdGhlcndpc2UgaXQgY2FuIGNhdXNlIHRpY2tsZXNzIGlkbGUgQ1BVcyB0byBiZQotCQkgKiBpbmNsdWRlZCBpbiByc3AtPmNwdW1hc2ssIHdoaWNoIHdpbGwgZXh0ZW5kIGdyYWNlcGVyaW9kcworCQkgKiBpbmNsdWRlZCBpbiByY3AtPmNwdW1hc2ssIHdoaWNoIHdpbGwgZXh0ZW5kIGdyYWNlcGVyaW9kcwogCQkgKiB1bm5lY2Vzc2FyaWx5LgogCQkgKi8KIAkJc21wX21iKCk7Ci0JCWNwdXNfYW5kbm90KHJzcC0+Y3B1bWFzaywgY3B1X29ubGluZV9tYXAsIG5vaHpfY3B1X21hc2spOworCQljcHVzX2FuZG5vdChyY3AtPmNwdW1hc2ssIGNwdV9vbmxpbmVfbWFwLCBub2h6X2NwdV9tYXNrKTsKIAogCX0KIH0KQEAgLTI4MiwxMyArMjYxLDEzIEBACiAgKiBDbGVhciBpdCBmcm9tIHRoZSBjcHUgbWFzayBhbmQgY29tcGxldGUgdGhlIGdyYWNlIHBlcmlvZCBpZiBpdCB3YXMgdGhlIGxhc3QKICAqIGNwdS4gU3RhcnQgYW5vdGhlciBncmFjZSBwZXJpb2QgaWYgc29tZW9uZSBoYXMgZnVydGhlciBlbnRyaWVzIHBlbmRpbmcKICAqLwotc3RhdGljIHZvaWQgY3B1X3F1aWV0KGludCBjcHUsIHN0cnVjdCByY3VfY3RybGJsayAqcmNwLCBzdHJ1Y3QgcmN1X3N0YXRlICpyc3ApCitzdGF0aWMgdm9pZCBjcHVfcXVpZXQoaW50IGNwdSwgc3RydWN0IHJjdV9jdHJsYmxrICpyY3ApCiB7Ci0JY3B1X2NsZWFyKGNwdSwgcnNwLT5jcHVtYXNrKTsKLQlpZiAoY3B1c19lbXB0eShyc3AtPmNwdW1hc2spKSB7CisJY3B1X2NsZWFyKGNwdSwgcmNwLT5jcHVtYXNrKTsKKwlpZiAoY3B1c19lbXB0eShyY3AtPmNwdW1hc2spKSB7CiAJCS8qIGJhdGNoIGNvbXBsZXRlZCAhICovCiAJCXJjcC0+Y29tcGxldGVkID0gcmNwLT5jdXI7Ci0JCXJjdV9zdGFydF9iYXRjaChyY3AsIHJzcCwgMCk7CisJCXJjdV9zdGFydF9iYXRjaChyY3ApOwogCX0KIH0KIApAQCAtMjk4LDcgKzI3Nyw3IEBACiAgKiBxdWllc2NlbnQgY3ljbGUsIHRoZW4gaW5kaWNhdGUgdGhhdCBpdCBoYXMgZG9uZSBzby4KICAqLwogc3RhdGljIHZvaWQgcmN1X2NoZWNrX3F1aWVzY2VudF9zdGF0ZShzdHJ1Y3QgcmN1X2N0cmxibGsgKnJjcCwKLQkJCXN0cnVjdCByY3Vfc3RhdGUgKnJzcCwgc3RydWN0IHJjdV9kYXRhICpyZHApCisJCQkJCXN0cnVjdCByY3VfZGF0YSAqcmRwKQogewogCWlmIChyZHAtPnF1aWVzY2JhdGNoICE9IHJjcC0+Y3VyKSB7CiAJCS8qIHN0YXJ0IG5ldyBncmFjZSBwZXJpb2Q6ICovCkBAIC0zMjMsMTUgKzMwMiwxNSBAQAogCQlyZXR1cm47CiAJcmRwLT5xc19wZW5kaW5nID0gMDsKIAotCXNwaW5fbG9jaygmcnNwLT5sb2NrKTsKKwlzcGluX2xvY2soJnJjcC0+bG9jayk7CiAJLyoKIAkgKiByZHAtPnF1aWVzY2JhdGNoL3JjcC0+Y3VyIGFuZCB0aGUgY3B1IGJpdG1hcCBjYW4gY29tZSBvdXQgb2Ygc3luYwogCSAqIGR1cmluZyBjcHUgc3RhcnR1cC4gSWdub3JlIHRoZSBxdWllc2NlbnQgc3RhdGUuCiAJICovCiAJaWYgKGxpa2VseShyZHAtPnF1aWVzY2JhdGNoID09IHJjcC0+Y3VyKSkKLQkJY3B1X3F1aWV0KHJkcC0+Y3B1LCByY3AsIHJzcCk7CisJCWNwdV9xdWlldChyZHAtPmNwdSwgcmNwKTsKIAotCXNwaW5fdW5sb2NrKCZyc3AtPmxvY2spOworCXNwaW5fdW5sb2NrKCZyY3AtPmxvY2spOwogfQogCiAKQEAgLTM1MiwyOCArMzMxLDI5IEBACiB9CiAKIHN0YXRpYyB2b2lkIF9fcmN1X29mZmxpbmVfY3B1KHN0cnVjdCByY3VfZGF0YSAqdGhpc19yZHAsCi0Jc3RydWN0IHJjdV9jdHJsYmxrICpyY3AsIHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwgc3RydWN0IHJjdV9kYXRhICpyZHApCisJCQkJc3RydWN0IHJjdV9jdHJsYmxrICpyY3AsIHN0cnVjdCByY3VfZGF0YSAqcmRwKQogewogCS8qIGlmIHRoZSBjcHUgZ29pbmcgb2ZmbGluZSBvd25zIHRoZSBncmFjZSBwZXJpb2QKIAkgKiB3ZSBjYW4gYmxvY2sgaW5kZWZpbml0ZWx5IHdhaXRpbmcgZm9yIGl0LCBzbyBmbHVzaAogCSAqIGl0IGhlcmUKIAkgKi8KLQlzcGluX2xvY2tfYmgoJnJzcC0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZyY3AtPmxvY2spOwogCWlmIChyY3AtPmN1ciAhPSByY3AtPmNvbXBsZXRlZCkKLQkJY3B1X3F1aWV0KHJkcC0+Y3B1LCByY3AsIHJzcCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnJzcC0+bG9jayk7CisJCWNwdV9xdWlldChyZHAtPmNwdSwgcmNwKTsKKwlzcGluX3VubG9ja19iaCgmcmNwLT5sb2NrKTsKIAlyY3VfbW92ZV9iYXRjaCh0aGlzX3JkcCwgcmRwLT5jdXJsaXN0LCByZHAtPmN1cnRhaWwpOwogCXJjdV9tb3ZlX2JhdGNoKHRoaXNfcmRwLCByZHAtPm54dGxpc3QsIHJkcC0+bnh0dGFpbCk7Ci0KKwlyY3VfbW92ZV9iYXRjaCh0aGlzX3JkcCwgcmRwLT5kb25lbGlzdCwgcmRwLT5kb25ldGFpbCk7CiB9CisKIHN0YXRpYyB2b2lkIHJjdV9vZmZsaW5lX2NwdShpbnQgY3B1KQogewogCXN0cnVjdCByY3VfZGF0YSAqdGhpc19yZHAgPSAmZ2V0X2NwdV92YXIocmN1X2RhdGEpOwogCXN0cnVjdCByY3VfZGF0YSAqdGhpc19iaF9yZHAgPSAmZ2V0X2NwdV92YXIocmN1X2JoX2RhdGEpOwogCi0JX19yY3Vfb2ZmbGluZV9jcHUodGhpc19yZHAsICZyY3VfY3RybGJsaywgJnJjdV9zdGF0ZSwKKwlfX3JjdV9vZmZsaW5lX2NwdSh0aGlzX3JkcCwgJnJjdV9jdHJsYmxrLAogCQkJCQkmcGVyX2NwdShyY3VfZGF0YSwgY3B1KSk7Ci0JX19yY3Vfb2ZmbGluZV9jcHUodGhpc19iaF9yZHAsICZyY3VfYmhfY3RybGJsaywgJnJjdV9iaF9zdGF0ZSwKKwlfX3JjdV9vZmZsaW5lX2NwdSh0aGlzX2JoX3JkcCwgJnJjdV9iaF9jdHJsYmxrLAogCQkJCQkmcGVyX2NwdShyY3VfYmhfZGF0YSwgY3B1KSk7CiAJcHV0X2NwdV92YXIocmN1X2RhdGEpOwogCXB1dF9jcHVfdmFyKHJjdV9iaF9kYXRhKTsKQEAgLTM5Miw3ICszNzIsNyBAQAogICogVGhpcyBkb2VzIHRoZSBSQ1UgcHJvY2Vzc2luZyB3b3JrIGZyb20gdGFza2xldCBjb250ZXh0LiAKICAqLwogc3RhdGljIHZvaWQgX19yY3VfcHJvY2Vzc19jYWxsYmFja3Moc3RydWN0IHJjdV9jdHJsYmxrICpyY3AsCi0JCQlzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsIHN0cnVjdCByY3VfZGF0YSAqcmRwKQorCQkJCQlzdHJ1Y3QgcmN1X2RhdGEgKnJkcCkKIHsKIAlpZiAocmRwLT5jdXJsaXN0ICYmICFyY3VfYmF0Y2hfYmVmb3JlKHJjcC0+Y29tcGxldGVkLCByZHAtPmJhdGNoKSkgewogCQkqcmRwLT5kb25ldGFpbCA9IHJkcC0+Y3VybGlzdDsKQEAgLTQyMiwyNCArNDAyLDUzIEBACiAKIAkJaWYgKCFyY3AtPm5leHRfcGVuZGluZykgewogCQkJLyogYW5kIHN0YXJ0IGl0L3NjaGVkdWxlIHN0YXJ0IGlmIGl0J3MgYSBuZXcgYmF0Y2ggKi8KLQkJCXNwaW5fbG9jaygmcnNwLT5sb2NrKTsKLQkJCXJjdV9zdGFydF9iYXRjaChyY3AsIHJzcCwgMSk7Ci0JCQlzcGluX3VubG9jaygmcnNwLT5sb2NrKTsKKwkJCXNwaW5fbG9jaygmcmNwLT5sb2NrKTsKKwkJCXJjcC0+bmV4dF9wZW5kaW5nID0gMTsKKwkJCXJjdV9zdGFydF9iYXRjaChyY3ApOworCQkJc3Bpbl91bmxvY2soJnJjcC0+bG9jayk7CiAJCX0KIAl9IGVsc2UgewogCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJfQotCXJjdV9jaGVja19xdWllc2NlbnRfc3RhdGUocmNwLCByc3AsIHJkcCk7CisJcmN1X2NoZWNrX3F1aWVzY2VudF9zdGF0ZShyY3AsIHJkcCk7CiAJaWYgKHJkcC0+ZG9uZWxpc3QpCiAJCXJjdV9kb19iYXRjaChyZHApOwogfQogCiBzdGF0aWMgdm9pZCByY3VfcHJvY2Vzc19jYWxsYmFja3ModW5zaWduZWQgbG9uZyB1bnVzZWQpCiB7Ci0JX19yY3VfcHJvY2Vzc19jYWxsYmFja3MoJnJjdV9jdHJsYmxrLCAmcmN1X3N0YXRlLAotCQkJCSZfX2dldF9jcHVfdmFyKHJjdV9kYXRhKSk7Ci0JX19yY3VfcHJvY2Vzc19jYWxsYmFja3MoJnJjdV9iaF9jdHJsYmxrLCAmcmN1X2JoX3N0YXRlLAotCQkJCSZfX2dldF9jcHVfdmFyKHJjdV9iaF9kYXRhKSk7CisJX19yY3VfcHJvY2Vzc19jYWxsYmFja3MoJnJjdV9jdHJsYmxrLCAmX19nZXRfY3B1X3ZhcihyY3VfZGF0YSkpOworCV9fcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKCZyY3VfYmhfY3RybGJsaywgJl9fZ2V0X2NwdV92YXIocmN1X2JoX2RhdGEpKTsKK30KKworc3RhdGljIGludCBfX3JjdV9wZW5kaW5nKHN0cnVjdCByY3VfY3RybGJsayAqcmNwLCBzdHJ1Y3QgcmN1X2RhdGEgKnJkcCkKK3sKKwkvKiBUaGlzIGNwdSBoYXMgcGVuZGluZyByY3UgZW50cmllcyBhbmQgdGhlIGdyYWNlIHBlcmlvZAorCSAqIGZvciB0aGVtIGhhcyBjb21wbGV0ZWQuCisJICovCisJaWYgKHJkcC0+Y3VybGlzdCAmJiAhcmN1X2JhdGNoX2JlZm9yZShyY3AtPmNvbXBsZXRlZCwgcmRwLT5iYXRjaCkpCisJCXJldHVybiAxOworCisJLyogVGhpcyBjcHUgaGFzIG5vIHBlbmRpbmcgZW50cmllcywgYnV0IHRoZXJlIGFyZSBuZXcgZW50cmllcyAqLworCWlmICghcmRwLT5jdXJsaXN0ICYmIHJkcC0+bnh0bGlzdCkKKwkJcmV0dXJuIDE7CisKKwkvKiBUaGlzIGNwdSBoYXMgZmluaXNoZWQgY2FsbGJhY2tzIHRvIGludm9rZSAqLworCWlmIChyZHAtPmRvbmVsaXN0KQorCQlyZXR1cm4gMTsKKworCS8qIFRoZSByY3UgY29yZSB3YWl0cyBmb3IgYSBxdWllc2NlbnQgc3RhdGUgZnJvbSB0aGUgY3B1ICovCisJaWYgKHJkcC0+cXVpZXNjYmF0Y2ggIT0gcmNwLT5jdXIgfHwgcmRwLT5xc19wZW5kaW5nKQorCQlyZXR1cm4gMTsKKworCS8qIG5vdGhpbmcgdG8gZG8gKi8KKwlyZXR1cm4gMDsKK30KKworaW50IHJjdV9wZW5kaW5nKGludCBjcHUpCit7CisJcmV0dXJuIF9fcmN1X3BlbmRpbmcoJnJjdV9jdHJsYmxrLCAmcGVyX2NwdShyY3VfZGF0YSwgY3B1KSkgfHwKKwkJX19yY3VfcGVuZGluZygmcmN1X2JoX2N0cmxibGssICZwZXJfY3B1KHJjdV9iaF9kYXRhLCBjcHUpKTsKIH0KIAogdm9pZCByY3VfY2hlY2tfY2FsbGJhY2tzKGludCBjcHUsIGludCB1c2VyKQpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRvcnR1cmUuYyBiL2tlcm5lbC9yY3V0b3J0dXJlLmMKaW5kZXggNDlmYmJlZi4uNzczMjE5OSAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRvcnR1cmUuYworKysgYi9rZXJuZWwvcmN1dG9ydHVyZS5jCkBAIC0zOSw3ICszOSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgotI2luY2x1ZGUgPGxpbnV4L3JjdXJlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC00OSw5ICs0OCwxMSBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBzdGF0aWMgaW50IG5yZWFkZXJzID0gLTE7CS8qICMgcmVhZGVyIHRocmVhZHMsIGRlZmF1bHRzIHRvIDQqbmNwdXMgKi8KLXN0YXRpYyBpbnQgc3RhdF9pbnRlcnZhbCA9IDA7CS8qIEludGVydmFsIGJldHdlZW4gc3RhdHMsIGluIHNlY29uZHMuICovCitzdGF0aWMgaW50IHN0YXRfaW50ZXJ2YWw7CS8qIEludGVydmFsIGJldHdlZW4gc3RhdHMsIGluIHNlY29uZHMuICovCiAJCQkJLyogIERlZmF1bHRzIHRvICJvbmx5IGF0IGVuZCBvZiB0ZXN0Ii4gKi8KLXN0YXRpYyBpbnQgdmVyYm9zZSA9IDA7CQkvKiBQcmludCBtb3JlIGRlYnVnIGluZm8uICovCitzdGF0aWMgaW50IHZlcmJvc2U7CQkvKiBQcmludCBtb3JlIGRlYnVnIGluZm8uICovCitzdGF0aWMgaW50IHRlc3Rfbm9faWRsZV9oejsJLyogVGVzdCBSQ1UncyBzdXBwb3J0IGZvciB0aWNrbGVzcyBpZGxlIENQVXMuICovCitzdGF0aWMgaW50IHNodWZmbGVfaW50ZXJ2YWwgPSA1OyAvKiBJbnRlcnZhbCBiZXR3ZWVuIHNodWZmbGVzIChpbiBzZWMpKi8KIAogTU9EVUxFX1BBUk0obnJlYWRlcnMsICJpIik7CiBNT0RVTEVfUEFSTV9ERVNDKG5yZWFkZXJzLCAiTnVtYmVyIG9mIFJDVSByZWFkZXIgdGhyZWFkcyIpOwpAQCAtNTksNiArNjAsMTAgQEAKIE1PRFVMRV9QQVJNX0RFU0Moc3RhdF9pbnRlcnZhbCwgIk51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gc3RhdHMgcHJpbnRrKClzIik7CiBNT0RVTEVfUEFSTSh2ZXJib3NlLCAiaSIpOwogTU9EVUxFX1BBUk1fREVTQyh2ZXJib3NlLCAiRW5hYmxlIHZlcmJvc2UgZGVidWdnaW5nIHByaW50aygpcyIpOworTU9EVUxFX1BBUk0odGVzdF9ub19pZGxlX2h6LCAiaSIpOworTU9EVUxFX1BBUk1fREVTQyh0ZXN0X25vX2lkbGVfaHosICJUZXN0IHN1cHBvcnQgZm9yIHRpY2tsZXNzIGlkbGUgQ1BVcyIpOworTU9EVUxFX1BBUk0oc2h1ZmZsZV9pbnRlcnZhbCwgImkiKTsKK01PRFVMRV9QQVJNX0RFU0Moc2h1ZmZsZV9pbnRlcnZhbCwgIk51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gc2h1ZmZsZXMiKTsKICNkZWZpbmUgVE9SVFVSRV9GTEFHICJyY3V0b3J0dXJlOiAiCiAjZGVmaW5lIFBSSU5US19TVFJJTkcocykgXAogCWRvIHsgcHJpbnRrKEtFUk5fQUxFUlQgVE9SVFVSRV9GTEFHIHMgIlxuIik7IH0gd2hpbGUgKDApCkBAIC03Myw2ICs3OCw3IEBACiBzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICp3cml0ZXJfdGFzazsKIHN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKipyZWFkZXJfdGFza3M7CiBzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpzdGF0c190YXNrOworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc2h1ZmZsZXJfdGFzazsKIAogI2RlZmluZSBSQ1VfVE9SVFVSRV9QSVBFX0xFTiAxMAogCkBAIC0xMDMsNyArMTA5LDcgQEAKIC8qCiAgKiBBbGxvY2F0ZSBhbiBlbGVtZW50IGZyb20gdGhlIHJjdV90b3J0dXJlcyBwb29sLgogICovCi1zdHJ1Y3QgcmN1X3RvcnR1cmUgKgorc3RhdGljIHN0cnVjdCByY3VfdG9ydHVyZSAqCiByY3VfdG9ydHVyZV9hbGxvYyh2b2lkKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnA7CkBAIC0zNzYsMTIgKzM4Miw3NyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHJjdV9pZGxlX2NwdTsJLyogRm9yY2UgYWxsIHRvcnR1cmUgdGFza3Mgb2ZmIHRoaXMgQ1BVICovCisKKy8qIFNodWZmbGUgdGFza3Mgc3VjaCB0aGF0IHdlIGFsbG93IEByY3VfaWRsZV9jcHUgdG8gYmVjb21lIGlkbGUuIEEgc3BlY2lhbCBjYXNlCisgKiBpcyB3aGVuIEByY3VfaWRsZV9jcHUgPSAtMSwgd2hlbiB3ZSBhbGxvdyB0aGUgdGFza3MgdG8gcnVuIG9uIGFsbCBDUFVzLgorICovCit2b2lkIHJjdV90b3J0dXJlX3NodWZmbGVfdGFza3Modm9pZCkKK3sKKwljcHVtYXNrX3QgdG1wX21hc2sgPSBDUFVfTUFTS19BTEw7CisJaW50IGk7CisKKwlsb2NrX2NwdV9ob3RwbHVnKCk7CisKKwkvKiBObyBwb2ludCBpbiBzaHVmZmxpbmcgaWYgdGhlcmUgaXMgb25seSBvbmUgb25saW5lIENQVSAoZXg6IFVQKSAqLworCWlmIChudW1fb25saW5lX2NwdXMoKSA9PSAxKSB7CisJCXVubG9ja19jcHVfaG90cGx1ZygpOworCQlyZXR1cm47CisJfQorCisJaWYgKHJjdV9pZGxlX2NwdSAhPSAtMSkKKwkJY3B1X2NsZWFyKHJjdV9pZGxlX2NwdSwgdG1wX21hc2spOworCisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCB0bXBfbWFzayk7CisKKwlpZiAocmVhZGVyX3Rhc2tzICE9IE5VTEwpIHsKKwkJZm9yIChpID0gMDsgaSA8IG5yZWFscmVhZGVyczsgaSsrKQorCQkJaWYgKHJlYWRlcl90YXNrc1tpXSkKKwkJCQlzZXRfY3B1c19hbGxvd2VkKHJlYWRlcl90YXNrc1tpXSwgdG1wX21hc2spOworCX0KKworCWlmICh3cml0ZXJfdGFzaykKKwkJc2V0X2NwdXNfYWxsb3dlZCh3cml0ZXJfdGFzaywgdG1wX21hc2spOworCisJaWYgKHN0YXRzX3Rhc2spCisJCXNldF9jcHVzX2FsbG93ZWQoc3RhdHNfdGFzaywgdG1wX21hc2spOworCisJaWYgKHJjdV9pZGxlX2NwdSA9PSAtMSkKKwkJcmN1X2lkbGVfY3B1ID0gbnVtX29ubGluZV9jcHVzKCkgLSAxOworCWVsc2UKKwkJcmN1X2lkbGVfY3B1LS07CisKKwl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKK30KKworLyogU2h1ZmZsZSB0YXNrcyBhY3Jvc3MgQ1BVcywgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIGVhY2ggQ1BVIGluIHRoZQorICogc3lzdGVtIHRvIGJlY29tZSBpZGxlIGF0IGEgdGltZSBhbmQgY3V0IG9mZiBpdHMgdGltZXIgdGlja3MuIFRoaXMgaXMgbWVhbnQKKyAqIHRvIHRlc3QgdGhlIHN1cHBvcnQgZm9yIHN1Y2ggdGlja2xlc3MgaWRsZSBDUFUgaW4gUkNVLgorICovCitzdGF0aWMgaW50CityY3VfdG9ydHVyZV9zaHVmZmxlKHZvaWQgKmFyZykKK3sKKwlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3NodWZmbGUgdGFzayBzdGFydGVkIik7CisJZG8geworCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoc2h1ZmZsZV9pbnRlcnZhbCAqIEhaKTsKKwkJcmN1X3RvcnR1cmVfc2h1ZmZsZV90YXNrcygpOworCX0gd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOworCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfc2h1ZmZsZSB0YXNrIHN0b3BwaW5nIik7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkCiByY3VfdG9ydHVyZV9jbGVhbnVwKHZvaWQpCiB7CiAJaW50IGk7CiAKIAlmdWxsc3RvcCA9IDE7CisJaWYgKHNodWZmbGVyX3Rhc2sgIT0gTlVMTCkgeworCQlWRVJCT1NFX1BSSU5US19TVFJJTkcoIlN0b3BwaW5nIHJjdV90b3J0dXJlX3NodWZmbGUgdGFzayIpOworCQlrdGhyZWFkX3N0b3Aoc2h1ZmZsZXJfdGFzayk7CisJfQorCXNodWZmbGVyX3Rhc2sgPSBOVUxMOworCiAJaWYgKHdyaXRlcl90YXNrICE9IE5VTEwpIHsKIAkJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJTdG9wcGluZyByY3VfdG9ydHVyZV93cml0ZXIgdGFzayIpOwogCQlrdGhyZWFkX3N0b3Aod3JpdGVyX3Rhc2spOwpAQCAtNDMwLDkgKzUwMSwxMSBAQAogCQlucmVhbHJlYWRlcnMgPSBucmVhZGVyczsKIAllbHNlCiAJCW5yZWFscmVhZGVycyA9IDIgKiBudW1fb25saW5lX2NwdXMoKTsKLQlwcmludGsoS0VSTl9BTEVSVCBUT1JUVVJFX0ZMQUcKLQkgICAgICAgIi0tLSBTdGFydCBvZiB0ZXN0OiBucmVhZGVycz0lZCBzdGF0X2ludGVydmFsPSVkIHZlcmJvc2U9JWRcbiIsCi0JICAgICAgIG5yZWFscmVhZGVycywgc3RhdF9pbnRlcnZhbCwgdmVyYm9zZSk7CisJcHJpbnRrKEtFUk5fQUxFUlQgVE9SVFVSRV9GTEFHICItLS0gU3RhcnQgb2YgdGVzdDogbnJlYWRlcnM9JWQgIgorCQkic3RhdF9pbnRlcnZhbD0lZCB2ZXJib3NlPSVkIHRlc3Rfbm9faWRsZV9oej0lZCAiCisJCSJzaHVmZmxlX2ludGVydmFsID0gJWRcbiIsCisJCW5yZWFscmVhZGVycywgc3RhdF9pbnRlcnZhbCwgdmVyYm9zZSwgdGVzdF9ub19pZGxlX2h6LAorCQlzaHVmZmxlX2ludGVydmFsKTsKIAlmdWxsc3RvcCA9IDA7CiAKIAkvKiBTZXQgdXAgdGhlIGZyZWVsaXN0LiAqLwpAQCAtNTAyLDYgKzU3NSwxOCBAQAogCQkJZ290byB1bndpbmQ7CiAJCX0KIAl9CisJaWYgKHRlc3Rfbm9faWRsZV9oeikgeworCQlyY3VfaWRsZV9jcHUgPSBudW1fb25saW5lX2NwdXMoKSAtIDE7CisJCS8qIENyZWF0ZSB0aGUgc2h1ZmZsZXIgdGhyZWFkICovCisJCXNodWZmbGVyX3Rhc2sgPSBrdGhyZWFkX3J1bihyY3VfdG9ydHVyZV9zaHVmZmxlLCBOVUxMLAorCQkJCQkgICJyY3VfdG9ydHVyZV9zaHVmZmxlIik7CisJCWlmIChJU19FUlIoc2h1ZmZsZXJfdGFzaykpIHsKKwkJCWZpcnN0ZXJyID0gUFRSX0VSUihzaHVmZmxlcl90YXNrKTsKKwkJCVZFUkJPU0VfUFJJTlRLX0VSUlNUUklORygiRmFpbGVkIHRvIGNyZWF0ZSBzaHVmZmxlciIpOworCQkJc2h1ZmZsZXJfdGFzayA9IE5VTEw7CisJCQlnb3RvIHVud2luZDsKKwkJfQorCX0KIAlyZXR1cm4gMDsKIAogdW53aW5kOgpkaWZmIC0tZ2l0IGEva2VybmVsL3Jlc291cmNlLmMgYi9rZXJuZWwvcmVzb3VyY2UuYwppbmRleCA5MjI4NWQ4Li5lMzA4MGZjIDEwMDY0NAotLS0gYS9rZXJuZWwvcmVzb3VyY2UuYworKysgYi9rZXJuZWwvcmVzb3VyY2UuYwpAQCAtNDY0LDcgKzQ2NCw3IEBACiAKIEVYUE9SVF9TWU1CT0woX19yZXF1ZXN0X3JlZ2lvbik7CiAKLWludCBfX2RlcHJlY2F0ZWQgX19jaGVja19yZWdpb24oc3RydWN0IHJlc291cmNlICpwYXJlbnQsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbikKK2ludCBfX2NoZWNrX3JlZ2lvbihzdHJ1Y3QgcmVzb3VyY2UgKnBhcmVudCwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBuKQogewogCXN0cnVjdCByZXNvdXJjZSAqIHJlczsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkLmMgYi9rZXJuZWwvc2NoZWQuYwppbmRleCA2ZjQ2Yzk0Li4zZWUyYWU0IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQuYworKysgYi9rZXJuZWwvc2NoZWQuYwpAQCAtMjcsMTIgKzI3LDE0IEBACiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CkBAIC0xNzYsNiArMTc4LDEzIEBACiAjZGVmaW5lIHRhc2tfaG90KHAsIG5vdywgc2QpICgobG9uZyBsb25nKSAoKG5vdykgLSAocCktPmxhc3RfcmFuKQlcCiAJCQkJPCAobG9uZyBsb25nKSAoc2QpLT5jYWNoZV9ob3RfdGltZSkKIAordm9pZCBfX3B1dF90YXNrX3N0cnVjdF9jYihzdHJ1Y3QgcmN1X2hlYWQgKnJocCkKK3sKKwlfX3B1dF90YXNrX3N0cnVjdChjb250YWluZXJfb2YocmhwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QsIHJjdSkpOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChfX3B1dF90YXNrX3N0cnVjdF9jYik7CisKIC8qCiAgKiBUaGVzZSBhcmUgdGhlIHJ1bnF1ZXVlIGRhdGEgc3RydWN0dXJlczoKICAqLwpAQCAtNTEyLDcgKzUyMSw3IEBACiAgKiBsb25nIGl0IHdhcyB3YWl0aW5nIHRvIHJ1bi4gIFdlIGFsc28gbm90ZSB3aGVuIGl0IGJlZ2FuIHNvIHRoYXQgd2UKICAqIGNhbiBrZWVwIHN0YXRzIG9uIGhvdyBsb25nIGl0cyB0aW1lc2xpY2UgaXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZF9pbmZvX2Fycml2ZSh0YXNrX3QgKnQpCitzdGF0aWMgdm9pZCBzY2hlZF9pbmZvX2Fycml2ZSh0YXNrX3QgKnQpCiB7CiAJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzLCBkaWZmID0gMDsKIAlzdHJ1Y3QgcnVucXVldWUgKnJxID0gdGFza19ycSh0KTsKQEAgLTczOSwxMCArNzQ4LDE0IEBACiAJdW5zaWduZWQgbG9uZyBsb25nIF9fc2xlZXBfdGltZSA9IG5vdyAtIHAtPnRpbWVzdGFtcDsKIAl1bnNpZ25lZCBsb25nIHNsZWVwX3RpbWU7CiAKLQlpZiAoX19zbGVlcF90aW1lID4gTlNfTUFYX1NMRUVQX0FWRykKLQkJc2xlZXBfdGltZSA9IE5TX01BWF9TTEVFUF9BVkc7Ci0JZWxzZQotCQlzbGVlcF90aW1lID0gKHVuc2lnbmVkIGxvbmcpX19zbGVlcF90aW1lOworCWlmICh1bmxpa2VseShwLT5wb2xpY3kgPT0gU0NIRURfQkFUQ0gpKQorCQlzbGVlcF90aW1lID0gMDsKKwllbHNlIHsKKwkJaWYgKF9fc2xlZXBfdGltZSA+IE5TX01BWF9TTEVFUF9BVkcpCisJCQlzbGVlcF90aW1lID0gTlNfTUFYX1NMRUVQX0FWRzsKKwkJZWxzZQorCQkJc2xlZXBfdGltZSA9ICh1bnNpZ25lZCBsb25nKV9fc2xlZXBfdGltZTsKKwl9CiAKIAlpZiAobGlrZWx5KHNsZWVwX3RpbWUgPiAwKSkgewogCQkvKgpAQCAtOTk0LDcgKzEwMDcsNyBAQAogICogV2Ugd2FudCB0byB1bmRlci1lc3RpbWF0ZSB0aGUgbG9hZCBvZiBtaWdyYXRpb24gc291cmNlcywgdG8KICAqIGJhbGFuY2UgY29uc2VydmF0aXZlbHkuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3NvdXJjZV9sb2FkKGludCBjcHUsIGludCB0eXBlLCBlbnVtIGlkbGVfdHlwZSBpZGxlKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgX19zb3VyY2VfbG9hZChpbnQgY3B1LCBpbnQgdHlwZSwgZW51bSBpZGxlX3R5cGUgaWRsZSkKIHsKIAlydW5xdWV1ZV90ICpycSA9IGNwdV9ycShjcHUpOwogCXVuc2lnbmVkIGxvbmcgcnVubmluZyA9IHJxLT5ucl9ydW5uaW5nOwpAQCAtMTI4MSw2ICsxMjk0LDkgQEAKIAkJfQogCX0KIAorCWlmIChwLT5sYXN0X3dha2VyX2NwdSAhPSB0aGlzX2NwdSkKKwkJZ290byBvdXRfc2V0X2NwdTsKKwogCWlmICh1bmxpa2VseSghY3B1X2lzc2V0KHRoaXNfY3B1LCBwLT5jcHVzX2FsbG93ZWQpKSkKIAkJZ290byBvdXRfc2V0X2NwdTsKIApAQCAtMTM1MSw2ICsxMzY3LDggQEAKIAkJY3B1ID0gdGFza19jcHUocCk7CiAJfQogCisJcC0+bGFzdF93YWtlcl9jcHUgPSB0aGlzX2NwdTsKKwogb3V0X2FjdGl2YXRlOgogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAlpZiAob2xkX3N0YXRlID09IFRBU0tfVU5JTlRFUlJVUFRJQkxFKSB7CkBAIC0xNDMyLDkgKzE0NTAsMTIgQEAKICNpZmRlZiBDT05GSUdfU0NIRURTVEFUUwogCW1lbXNldCgmcC0+c2NoZWRfaW5mbywgMCwgc2l6ZW9mKHAtPnNjaGVkX2luZm8pKTsKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgZGVmaW5lZChfX0FSQ0hfV0FOVF9VTkxPQ0tFRF9DVFhTVykKKyNpZiBkZWZpbmVkKENPTkZJR19TTVApCisJcC0+bGFzdF93YWtlcl9jcHUgPSBjcHU7CisjaWYgZGVmaW5lZChfX0FSQ0hfV0FOVF9VTkxPQ0tFRF9DVFhTVykKIAlwLT5vbmNwdSA9IDA7CiAjZW5kaWYKKyNlbmRpZgogI2lmZGVmIENPTkZJR19QUkVFTVBUCiAJLyogV2FudCB0byBzdGFydCB3aXRoIGtlcm5lbCBwcmVlbXB0aW9uIGRpc2FibGVkLiAqLwogCXRhc2tfdGhyZWFkX2luZm8ocCktPnByZWVtcHRfY291bnQgPSAxOwpAQCAtMTg0OSw3ICsxODcwLDcgQEAKICAqIHB1bGxfdGFzayAtIG1vdmUgYSB0YXNrIGZyb20gYSByZW1vdGUgcnVucXVldWUgdG8gdGhlIGxvY2FsIHJ1bnF1ZXVlLgogICogQm90aCBydW5xdWV1ZXMgbXVzdCBiZSBsb2NrZWQuCiAgKi8KLXN0YXRpYyBpbmxpbmUKK3N0YXRpYwogdm9pZCBwdWxsX3Rhc2socnVucXVldWVfdCAqc3JjX3JxLCBwcmlvX2FycmF5X3QgKnNyY19hcnJheSwgdGFza190ICpwLAogCSAgICAgICBydW5xdWV1ZV90ICp0aGlzX3JxLCBwcmlvX2FycmF5X3QgKnRoaXNfYXJyYXksIGludCB0aGlzX2NwdSkKIHsKQEAgLTE4NzEsNyArMTg5Miw3IEBACiAvKgogICogY2FuX21pZ3JhdGVfdGFzayAtIG1heSB0YXNrIHAgZnJvbSBydW5xdWV1ZSBycSBiZSBtaWdyYXRlZCB0byB0aGlzX2NwdT8KICAqLwotc3RhdGljIGlubGluZQorc3RhdGljCiBpbnQgY2FuX21pZ3JhdGVfdGFzayh0YXNrX3QgKnAsIHJ1bnF1ZXVlX3QgKnJxLCBpbnQgdGhpc19jcHUsCiAJCSAgICAgc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGVudW0gaWRsZV90eXBlIGlkbGUsCiAJCSAgICAgaW50ICphbGxfcGlubmVkKQpAQCAtMjM1Nyw3ICsyMzc4LDcgQEAKICAqIGlkbGVfYmFsYW5jZSBpcyBjYWxsZWQgYnkgc2NoZWR1bGUoKSBpZiB0aGlzX2NwdSBpcyBhYm91dCB0byBiZWNvbWUKICAqIGlkbGUuIEF0dGVtcHRzIHRvIHB1bGwgdGFza3MgZnJvbSBvdGhlciBDUFVzLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaWRsZV9iYWxhbmNlKGludCB0aGlzX2NwdSwgcnVucXVldWVfdCAqdGhpc19ycSkKK3N0YXRpYyB2b2lkIGlkbGVfYmFsYW5jZShpbnQgdGhpc19jcHUsIHJ1bnF1ZXVlX3QgKnRoaXNfcnEpCiB7CiAJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CiAKQEAgLTI3NDEsNyArMjc2Miw3IEBACiAJCXJlc2NoZWRfdGFzayhycS0+aWRsZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB3YWtlX3NsZWVwaW5nX2RlcGVuZGVudChpbnQgdGhpc19jcHUsIHJ1bnF1ZXVlX3QgKnRoaXNfcnEpCitzdGF0aWMgdm9pZCB3YWtlX3NsZWVwaW5nX2RlcGVuZGVudChpbnQgdGhpc19jcHUsIHJ1bnF1ZXVlX3QgKnRoaXNfcnEpCiB7CiAJc3RydWN0IHNjaGVkX2RvbWFpbiAqdG1wLCAqc2QgPSBOVUxMOwogCWNwdW1hc2tfdCBzaWJsaW5nX21hcDsKQEAgLTI3OTUsNyArMjgxNiw3IEBACiAJcmV0dXJuIHAtPnRpbWVfc2xpY2UgKiAoMTAwIC0gc2QtPnBlcl9jcHVfZ2FpbikgLyAxMDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGRlcGVuZGVudF9zbGVlcGVyKGludCB0aGlzX2NwdSwgcnVucXVldWVfdCAqdGhpc19ycSkKK3N0YXRpYyBpbnQgZGVwZW5kZW50X3NsZWVwZXIoaW50IHRoaXNfY3B1LCBydW5xdWV1ZV90ICp0aGlzX3JxKQogewogCXN0cnVjdCBzY2hlZF9kb21haW4gKnRtcCwgKnNkID0gTlVMTDsKIAljcHVtYXNrX3Qgc2libGluZ19tYXA7CkBAIC0zNTQzLDcgKzM1NjQsNyBAQAogCSAqIFRoZSBSVCBwcmlvcml0aWVzIGFyZSBzZXQgdmlhIHNjaGVkX3NldHNjaGVkdWxlcigpLCBidXQgd2Ugc3RpbGwKIAkgKiBhbGxvdyB0aGUgJ25vcm1hbCcgbmljZSB2YWx1ZSB0byBiZSBzZXQgLSBidXQgYXMgZXhwZWN0ZWQKIAkgKiBpdCB3b250IGhhdmUgYW55IGVmZmVjdCBvbiBzY2hlZHVsaW5nIHVudGlsIHRoZSB0YXNrIGlzCi0JICogbm90IFNDSEVEX05PUk1BTDoKKwkgKiBub3QgU0NIRURfTk9STUFML1NDSEVEX0JBVENIOgogCSAqLwogCWlmIChydF90YXNrKHApKSB7CiAJCXAtPnN0YXRpY19wcmlvID0gTklDRV9UT19QUklPKG5pY2UpOwpAQCAtMzY4OSwxMCArMzcxMCwxNiBAQAogCUJVR19PTihwLT5hcnJheSk7CiAJcC0+cG9saWN5ID0gcG9saWN5OwogCXAtPnJ0X3ByaW9yaXR5ID0gcHJpbzsKLQlpZiAocG9saWN5ICE9IFNDSEVEX05PUk1BTCkKKwlpZiAocG9saWN5ICE9IFNDSEVEX05PUk1BTCAmJiBwb2xpY3kgIT0gU0NIRURfQkFUQ0gpIHsKIAkJcC0+cHJpbyA9IE1BWF9SVF9QUklPLTEgLSBwLT5ydF9wcmlvcml0eTsKLQllbHNlCisJfSBlbHNlIHsKIAkJcC0+cHJpbyA9IHAtPnN0YXRpY19wcmlvOworCQkvKgorCQkgKiBTQ0hFRF9CQVRDSCB0YXNrcyBhcmUgdHJlYXRlZCBhcyBwZXJwZXR1YWwgQ1BVIGhvZ3M6CisJCSAqLworCQlpZiAocG9saWN5ID09IFNDSEVEX0JBVENIKQorCQkJcC0+c2xlZXBfYXZnID0gMDsKKwl9CiB9CiAKIC8qKgpAQCAtMzcxNiwyOSArMzc0MywzNSBAQAogCWlmIChwb2xpY3kgPCAwKQogCQlwb2xpY3kgPSBvbGRwb2xpY3kgPSBwLT5wb2xpY3k7CiAJZWxzZSBpZiAocG9saWN5ICE9IFNDSEVEX0ZJRk8gJiYgcG9saWN5ICE9IFNDSEVEX1JSICYmCi0JCQkJcG9saWN5ICE9IFNDSEVEX05PUk1BTCkKLQkJCXJldHVybiAtRUlOVkFMOworCQkJcG9saWN5ICE9IFNDSEVEX05PUk1BTCAmJiBwb2xpY3kgIT0gU0NIRURfQkFUQ0gpCisJCXJldHVybiAtRUlOVkFMOwogCS8qCiAJICogVmFsaWQgcHJpb3JpdGllcyBmb3IgU0NIRURfRklGTyBhbmQgU0NIRURfUlIgYXJlCi0JICogMS4uTUFYX1VTRVJfUlRfUFJJTy0xLCB2YWxpZCBwcmlvcml0eSBmb3IgU0NIRURfTk9STUFMIGlzIDAuCisJICogMS4uTUFYX1VTRVJfUlRfUFJJTy0xLCB2YWxpZCBwcmlvcml0eSBmb3IgU0NIRURfTk9STUFMIGFuZAorCSAqIFNDSEVEX0JBVENIIGlzIDAuCiAJICovCiAJaWYgKHBhcmFtLT5zY2hlZF9wcmlvcml0eSA8IDAgfHwKIAkgICAgKHAtPm1tICYmIHBhcmFtLT5zY2hlZF9wcmlvcml0eSA+IE1BWF9VU0VSX1JUX1BSSU8tMSkgfHwKIAkgICAgKCFwLT5tbSAmJiBwYXJhbS0+c2NoZWRfcHJpb3JpdHkgPiBNQVhfUlRfUFJJTy0xKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKChwb2xpY3kgPT0gU0NIRURfTk9STUFMKSAhPSAocGFyYW0tPnNjaGVkX3ByaW9yaXR5ID09IDApKQorCWlmICgocG9saWN5ID09IFNDSEVEX05PUk1BTCB8fCBwb2xpY3kgPT0gU0NIRURfQkFUQ0gpCisJCQkJCSE9IChwYXJhbS0+c2NoZWRfcHJpb3JpdHkgPT0gMCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyoKIAkgKiBBbGxvdyB1bnByaXZpbGVnZWQgUlQgdGFza3MgdG8gZGVjcmVhc2UgcHJpb3JpdHk6CiAJICovCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfTklDRSkpIHsKLQkJLyogY2FuJ3QgY2hhbmdlIHBvbGljeSAqLwotCQlpZiAocG9saWN5ICE9IHAtPnBvbGljeSAmJgotCQkJIXAtPnNpZ25hbC0+cmxpbVtSTElNSVRfUlRQUklPXS5ybGltX2N1cikKKwkJLyoKKwkJICogY2FuJ3QgY2hhbmdlIHBvbGljeSwgZXhjZXB0IGJldHdlZW4gU0NIRURfTk9STUFMCisJCSAqIGFuZCBTQ0hFRF9CQVRDSDoKKwkJICovCisJCWlmICgoKHBvbGljeSAhPSBTQ0hFRF9OT1JNQUwgJiYgcC0+cG9saWN5ICE9IFNDSEVEX0JBVENIKSAmJgorCQkJKHBvbGljeSAhPSBTQ0hFRF9CQVRDSCAmJiBwLT5wb2xpY3kgIT0gU0NIRURfTk9STUFMKSkgJiYKKwkJCQkhcC0+c2lnbmFsLT5ybGltW1JMSU1JVF9SVFBSSU9dLnJsaW1fY3VyKQogCQkJcmV0dXJuIC1FUEVSTTsKIAkJLyogY2FuJ3QgaW5jcmVhc2UgcHJpb3JpdHkgKi8KLQkJaWYgKHBvbGljeSAhPSBTQ0hFRF9OT1JNQUwgJiYKKwkJaWYgKChwb2xpY3kgIT0gU0NIRURfTk9STUFMICYmIHBvbGljeSAhPSBTQ0hFRF9CQVRDSCkgJiYKIAkJICAgIHBhcmFtLT5zY2hlZF9wcmlvcml0eSA+IHAtPnJ0X3ByaW9yaXR5ICYmCiAJCSAgICBwYXJhbS0+c2NoZWRfcHJpb3JpdHkgPgogCQkJCXAtPnNpZ25hbC0+cmxpbVtSTElNSVRfUlRQUklPXS5ybGltX2N1cikKQEAgLTM4MTcsNiArMzg1MCwxMCBAQAogYXNtbGlua2FnZSBsb25nIHN5c19zY2hlZF9zZXRzY2hlZHVsZXIocGlkX3QgcGlkLCBpbnQgcG9saWN5LAogCQkJCSAgICAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gX191c2VyICpwYXJhbSkKIHsKKwkvKiBuZWdhdGl2ZSB2YWx1ZXMgZm9yIHBvbGljeSBhcmUgbm90IHZhbGlkICovCisJaWYgKHBvbGljeSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCiAJcmV0dXJuIGRvX3NjaGVkX3NldHNjaGVkdWxlcihwaWQsIHBvbGljeSwgcGFyYW0pOwogfQogCkBAIC0zOTcyLDEyICs0MDA5LDEyIEBACiAgKiBtZXRob2QsIHN1Y2ggYXMgQUNQSSBmb3IgZS5nLgogICovCiAKLWNwdW1hc2tfdCBjcHVfcHJlc2VudF9tYXA7CitjcHVtYXNrX3QgY3B1X3ByZXNlbnRfbWFwIF9fcmVhZF9tb3N0bHk7CiBFWFBPUlRfU1lNQk9MKGNwdV9wcmVzZW50X21hcCk7CiAKICNpZm5kZWYgQ09ORklHX1NNUAotY3B1bWFza190IGNwdV9vbmxpbmVfbWFwID0gQ1BVX01BU0tfQUxMOwotY3B1bWFza190IGNwdV9wb3NzaWJsZV9tYXAgPSBDUFVfTUFTS19BTEw7CitjcHVtYXNrX3QgY3B1X29ubGluZV9tYXAgX19yZWFkX21vc3RseSA9IENQVV9NQVNLX0FMTDsKK2NwdW1hc2tfdCBjcHVfcG9zc2libGVfbWFwIF9fcmVhZF9tb3N0bHkgPSBDUFVfTUFTS19BTEw7CiAjZW5kaWYKIAogbG9uZyBzY2hlZF9nZXRhZmZpbml0eShwaWRfdCBwaWQsIGNwdW1hc2tfdCAqbWFzaykKQEAgLTQyMTYsNiArNDI1Myw3IEBACiAJCXJldCA9IE1BWF9VU0VSX1JUX1BSSU8tMTsKIAkJYnJlYWs7CiAJY2FzZSBTQ0hFRF9OT1JNQUw6CisJY2FzZSBTQ0hFRF9CQVRDSDoKIAkJcmV0ID0gMDsKIAkJYnJlYWs7CiAJfQpAQCAtNDIzOSw2ICs0Mjc3LDcgQEAKIAkJcmV0ID0gMTsKIAkJYnJlYWs7CiAJY2FzZSBTQ0hFRF9OT1JNQUw6CisJY2FzZSBTQ0hFRF9CQVRDSDoKIAkJcmV0ID0gMDsKIAl9CiAJcmV0dXJuIHJldDsKQEAgLTQzNzksNiArNDQxOCw3IEBACiAJfSB3aGlsZV9lYWNoX3RocmVhZChnLCBwKTsKIAogCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwltdXRleF9kZWJ1Z19zaG93X2FsbF9sb2NrcygpOwogfQogCiAvKioKQEAgLTUwNzMsNyArNTExMyw0NzAgQEAKIAogI2RlZmluZSBTRF9OT0RFU19QRVJfRE9NQUlOIDE2CiAKKy8qCisgKiBTZWxmLXR1bmluZyB0YXNrIG1pZ3JhdGlvbiBjb3N0IG1lYXN1cmVtZW50IGJldHdlZW4gc291cmNlIGFuZCB0YXJnZXQgQ1BVcy4KKyAqCisgKiBUaGlzIGlzIGRvbmUgYnkgbWVhc3VyaW5nIHRoZSBjb3N0IG9mIG1hbmlwdWxhdGluZyBidWZmZXJzIG9mIHZhcnlpbmcKKyAqIHNpemVzLiBGb3IgYSBnaXZlbiBidWZmZXItc2l6ZSBoZXJlIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgdGFrZW46CisgKgorICogMSkgdGhlIHNvdXJjZSBDUFUgcmVhZHMrZGlydGllcyBhIHNoYXJlZCBidWZmZXIKKyAqIDIpIHRoZSB0YXJnZXQgQ1BVIHJlYWRzK2RpcnRpZXMgdGhlIHNhbWUgc2hhcmVkIGJ1ZmZlcgorICoKKyAqIFdlIG1lYXN1cmUgaG93IGxvbmcgdGhleSB0YWtlLCBpbiB0aGUgZm9sbG93aW5nIDQgc2NlbmFyaW9zOgorICoKKyAqICAtIHNvdXJjZTogQ1BVMSwgdGFyZ2V0OiBDUFUyIHwgY29zdDEKKyAqICAtIHNvdXJjZTogQ1BVMiwgdGFyZ2V0OiBDUFUxIHwgY29zdDIKKyAqICAtIHNvdXJjZTogQ1BVMSwgdGFyZ2V0OiBDUFUxIHwgY29zdDMKKyAqICAtIHNvdXJjZTogQ1BVMiwgdGFyZ2V0OiBDUFUyIHwgY29zdDQKKyAqCisgKiBXZSB0aGVuIGNhbGN1bGF0ZSB0aGUgY29zdDMrY29zdDQtY29zdDEtY29zdDIgZGlmZmVyZW5jZSAtIHRoaXMgaXMKKyAqIHRoZSBjb3N0IG9mIG1pZ3JhdGlvbi4KKyAqCisgKiBXZSB0aGVuIHN0YXJ0IG9mZiBmcm9tIGEgc21hbGwgYnVmZmVyLXNpemUgYW5kIGl0ZXJhdGUgdXAgdG8gbGFyZ2VyCisgKiBidWZmZXIgc2l6ZXMsIGluIDUlIHN0ZXBzIC0gbWVhc3VyaW5nIGVhY2ggYnVmZmVyLXNpemUgc2VwYXJhdGVseSwgYW5kCisgKiBkb2luZyBhIG1heGltdW0gc2VhcmNoIGZvciB0aGUgY29zdC4gKFRoZSBtYXhpbXVtIGNvc3QgZm9yIGEgbWlncmF0aW9uCisgKiBub3JtYWxseSBvY2N1cnMgd2hlbiB0aGUgd29ya2luZyBzZXQgc2l6ZSBpcyBhcm91bmQgdGhlIGVmZmVjdGl2ZSBjYWNoZQorICogc2l6ZS4pCisgKi8KKyNkZWZpbmUgU0VBUkNIX1NDT1BFCQkyCisjZGVmaW5lIE1JTl9DQUNIRV9TSVpFCQkoNjQqMTAyNFUpCisjZGVmaW5lIERFRkFVTFRfQ0FDSEVfU0laRQkoNSoxMDI0KjEwMjRVKQorI2RlZmluZSBJVEVSQVRJT05TCQkyCisjZGVmaW5lIFNJWkVfVEhSRVNICQkxMzAKKyNkZWZpbmUgQ09TVF9USFJFU0gJCTEzMAorCisvKgorICogVGhlIG1pZ3JhdGlvbiBjb3N0IGlzIGEgZnVuY3Rpb24gb2YgJ2RvbWFpbiBkaXN0YW5jZScuIERvbWFpbgorICogZGlzdGFuY2UgaXMgdGhlIG51bWJlciBvZiBzdGVwcyBhIENQVSBoYXMgdG8gaXRlcmF0ZSBkb3duIGl0cworICogZG9tYWluIHRyZWUgdG8gc2hhcmUgYSBkb21haW4gd2l0aCB0aGUgb3RoZXIgQ1BVLiBUaGUgZmFydGhlcgorICogdHdvIENQVXMgYXJlIGZyb20gZWFjaCBvdGhlciwgdGhlIGxhcmdlciB0aGUgZGlzdGFuY2UgZ2V0cy4KKyAqCisgKiBOb3RlIHRoYXQgd2UgdXNlIHRoZSBkaXN0YW5jZSBvbmx5IHRvIGNhY2hlIG1lYXN1cmVtZW50IHJlc3VsdHMsCisgKiB0aGUgZGlzdGFuY2UgdmFsdWUgaXMgbm90IHVzZWQgbnVtZXJpY2FsbHkgb3RoZXJ3aXNlLiBXaGVuIHR3bworICogQ1BVcyBoYXZlIHRoZSBzYW1lIGRpc3RhbmNlIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgbWlncmF0aW9uCisgKiBjb3N0IGlzIHRoZSBzYW1lLiAodGhpcyBpcyBhIHNpbXBsaWZpY2F0aW9uIGJ1dCBxdWl0ZSBwcmFjdGljYWwpCisgKi8KKyNkZWZpbmUgTUFYX0RPTUFJTl9ESVNUQU5DRSAzMgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIG1pZ3JhdGlvbl9jb3N0W01BWF9ET01BSU5fRElTVEFOQ0VdID0KKwkJeyBbIDAgLi4uIE1BWF9ET01BSU5fRElTVEFOQ0UtMSBdID0gLTFMTCB9OworCisvKgorICogQWxsb3cgb3ZlcnJpZGUgb2YgbWlncmF0aW9uIGNvc3QgLSBpbiB1bml0cyBvZiBtaWNyb3NlY29uZHMuCisgKiBFLmcuIG1pZ3JhdGlvbl9jb3N0PTEwMDAsMjAwMCwzMDAwIHdpbGwgc2V0IHVwIGEgbGV2ZWwtMSBjb3N0CisgKiBvZiAxIG1zZWMsIGxldmVsLTIgY29zdCBvZiAyIG1zZWNzIGFuZCBsZXZlbDMgY29zdCBvZiAzIG1zZWNzOgorICovCitzdGF0aWMgaW50IF9faW5pdCBtaWdyYXRpb25fY29zdF9zZXR1cChjaGFyICpzdHIpCit7CisJaW50IGludHNbTUFYX0RPTUFJTl9ESVNUQU5DRSsxXSwgaTsKKworCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisKKwlwcmludGsoIiNpbnRzOiAlZFxuIiwgaW50c1swXSk7CisJZm9yIChpID0gMTsgaSA8PSBpbnRzWzBdOyBpKyspIHsKKwkJbWlncmF0aW9uX2Nvc3RbaS0xXSA9ICh1bnNpZ25lZCBsb25nIGxvbmcpaW50c1tpXSoxMDAwOworCQlwcmludGsoIm1pZ3JhdGlvbl9jb3N0WyVkXTogJUxkXG4iLCBpLTEsIG1pZ3JhdGlvbl9jb3N0W2ktMV0pOworCX0KKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCAoIm1pZ3JhdGlvbl9jb3N0PSIsIG1pZ3JhdGlvbl9jb3N0X3NldHVwKTsKKworLyoKKyAqIEdsb2JhbCBtdWx0aXBsaWVyIChkaXZpc29yKSBmb3IgbWlncmF0aW9uLWN1dG9mZiB2YWx1ZXMsCisgKiBpbiBwZXJjZW50aWxlcy4gRS5nLiB1c2UgYSB2YWx1ZSBvZiAxNTAgdG8gZ2V0IDEuNSB0aW1lcworICogbG9uZ2VyIGNhY2hlLWhvdCBjdXRvZmYgdGltZXMuCisgKgorICogKFdlIHNjYWxlIGl0IGZyb20gMTAwIHRvIDEyOCB0byBsb25nIGxvbmcgaGFuZGxpbmcgZWFzaWVyLikKKyAqLworCisjZGVmaW5lIE1JR1JBVElPTl9GQUNUT1JfU0NBTEUgMTI4CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWlncmF0aW9uX2ZhY3RvciA9IE1JR1JBVElPTl9GQUNUT1JfU0NBTEU7CisKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX21pZ3JhdGlvbl9mYWN0b3IoY2hhciAqc3RyKQoreworCWdldF9vcHRpb24oJnN0ciwgJm1pZ3JhdGlvbl9mYWN0b3IpOworCW1pZ3JhdGlvbl9mYWN0b3IgPSBtaWdyYXRpb25fZmFjdG9yICogTUlHUkFUSU9OX0ZBQ1RPUl9TQ0FMRSAvIDEwMDsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgibWlncmF0aW9uX2ZhY3Rvcj0iLCBzZXR1cF9taWdyYXRpb25fZmFjdG9yKTsKKworLyoKKyAqIEVzdGltYXRlZCBkaXN0YW5jZSBvZiB0d28gQ1BVcywgbWVhc3VyZWQgdmlhIHRoZSBudW1iZXIgb2YgZG9tYWlucworICogd2UgaGF2ZSB0byBwYXNzIGZvciB0aGUgdHdvIENQVXMgdG8gYmUgaW4gdGhlIHNhbWUgc3BhbjoKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9tYWluX2Rpc3RhbmNlKGludCBjcHUxLCBpbnQgY3B1MikKK3sKKwl1bnNpZ25lZCBsb25nIGRpc3RhbmNlID0gMDsKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKKworCWZvcl9lYWNoX2RvbWFpbihjcHUxLCBzZCkgeworCQlXQVJOX09OKCFjcHVfaXNzZXQoY3B1MSwgc2QtPnNwYW4pKTsKKwkJaWYgKGNwdV9pc3NldChjcHUyLCBzZC0+c3BhbikpCisJCQlyZXR1cm4gZGlzdGFuY2U7CisJCWRpc3RhbmNlKys7CisJfQorCWlmIChkaXN0YW5jZSA+PSBNQVhfRE9NQUlOX0RJU1RBTkNFKSB7CisJCVdBUk5fT04oMSk7CisJCWRpc3RhbmNlID0gTUFYX0RPTUFJTl9ESVNUQU5DRS0xOworCX0KKworCXJldHVybiBkaXN0YW5jZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBtaWdyYXRpb25fZGVidWc7CisKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX21pZ3JhdGlvbl9kZWJ1ZyhjaGFyICpzdHIpCit7CisJZ2V0X29wdGlvbigmc3RyLCAmbWlncmF0aW9uX2RlYnVnKTsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgibWlncmF0aW9uX2RlYnVnPSIsIHNldHVwX21pZ3JhdGlvbl9kZWJ1Zyk7CisKKy8qCisgKiBNYXhpbXVtIGNhY2hlLXNpemUgdGhhdCB0aGUgc2NoZWR1bGVyIHNob3VsZCB0cnkgdG8gbWVhc3VyZS4KKyAqIEFyY2hpdGVjdHVyZXMgd2l0aCBsYXJnZXIgY2FjaGVzIHNob3VsZCB0dW5lIHRoaXMgdXAgZHVyaW5nCisgKiBib290dXAuIEdldHMgdXNlZCBpbiB0aGUgZG9tYWluLXNldHVwIGNvZGUgKGkuZS4gZHVyaW5nIFNNUAorICogYm9vdHVwKS4KKyAqLwordW5zaWduZWQgaW50IG1heF9jYWNoZV9zaXplOworCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9tYXhfY2FjaGVfc2l6ZShjaGFyICpzdHIpCit7CisJZ2V0X29wdGlvbigmc3RyLCAmbWF4X2NhY2hlX3NpemUpOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJtYXhfY2FjaGVfc2l6ZT0iLCBzZXR1cF9tYXhfY2FjaGVfc2l6ZSk7CisKKy8qCisgKiBEaXJ0eSBhIGJpZyBidWZmZXIgaW4gYSBoYXJkLXRvLXByZWRpY3QgKGZvciB0aGUgTDIgY2FjaGUpIHdheS4gVGhpcworICogaXMgdGhlIG9wZXJhdGlvbiB0aGF0IGlzIHRpbWVkLCBzbyB3ZSB0cnkgdG8gZ2VuZXJhdGUgdW5wcmVkaWN0YWJsZQorICogY2FjaGVtaXNzZXMgdGhhdCBzdGlsbCBlbmQgdXAgZmlsbGluZyB0aGUgTDIgY2FjaGU6CisgKi8KK3N0YXRpYyB2b2lkIHRvdWNoX2NhY2hlKHZvaWQgKl9fY2FjaGUsIHVuc2lnbmVkIGxvbmcgX19zaXplKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IF9fc2l6ZS9zaXplb2YobG9uZyksIGNodW5rMSA9IHNpemUvMywKKwkJCWNodW5rMiA9IDIqc2l6ZS8zOworCXVuc2lnbmVkIGxvbmcgKmNhY2hlID0gX19jYWNoZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplLzY7IGkgKz0gOCkgeworCQlzd2l0Y2ggKGkgJSA2KSB7CisJCQljYXNlIDA6IGNhY2hlW2ldKys7CisJCQljYXNlIDE6IGNhY2hlW3NpemUtMS1pXSsrOworCQkJY2FzZSAyOiBjYWNoZVtjaHVuazEtaV0rKzsKKwkJCWNhc2UgMzogY2FjaGVbY2h1bmsxK2ldKys7CisJCQljYXNlIDQ6IGNhY2hlW2NodW5rMi1pXSsrOworCQkJY2FzZSA1OiBjYWNoZVtjaHVuazIraV0rKzsKKwkJfQorCX0KK30KKworLyoKKyAqIE1lYXN1cmUgdGhlIGNhY2hlLWNvc3Qgb2Ygb25lIHRhc2sgbWlncmF0aW9uLiBSZXR1cm5zIGluIHVuaXRzIG9mIG5zZWMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbWVhc3VyZV9vbmUodm9pZCAqY2FjaGUsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkgICAgICBpbnQgc291cmNlLCBpbnQgdGFyZ2V0KQoreworCWNwdW1hc2tfdCBtYXNrLCBzYXZlZF9tYXNrOworCXVuc2lnbmVkIGxvbmcgbG9uZyB0MCwgdDEsIHQyLCB0MywgY29zdDsKKworCXNhdmVkX21hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisKKwkvKgorCSAqIEZsdXNoIHNvdXJjZSBjYWNoZXMgdG8gUkFNIGFuZCBpbnZhbGlkYXRlIHRoZW06CisJICovCisJc2NoZWRfY2FjaGVmbHVzaCgpOworCisJLyoKKwkgKiBNaWdyYXRlIHRvIHRoZSBzb3VyY2UgQ1BVOgorCSAqLworCW1hc2sgPSBjcHVtYXNrX29mX2NwdShzb3VyY2UpOworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgbWFzayk7CisJV0FSTl9PTihzbXBfcHJvY2Vzc29yX2lkKCkgIT0gc291cmNlKTsKKworCS8qCisJICogRGlydHkgdGhlIHdvcmtpbmcgc2V0OgorCSAqLworCXQwID0gc2NoZWRfY2xvY2soKTsKKwl0b3VjaF9jYWNoZShjYWNoZSwgc2l6ZSk7CisJdDEgPSBzY2hlZF9jbG9jaygpOworCisJLyoKKwkgKiBNaWdyYXRlIHRvIHRoZSB0YXJnZXQgQ1BVLCBkaXJ0eSB0aGUgTDIgY2FjaGUgYW5kIGFjY2VzcworCSAqIHRoZSBzaGFyZWQgYnVmZmVyLiAod2hpY2ggcmVwcmVzZW50cyB0aGUgd29ya2luZyBzZXQKKwkgKiBvZiBhIG1pZ3JhdGVkIHRhc2suKQorCSAqLworCW1hc2sgPSBjcHVtYXNrX29mX2NwdSh0YXJnZXQpOworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgbWFzayk7CisJV0FSTl9PTihzbXBfcHJvY2Vzc29yX2lkKCkgIT0gdGFyZ2V0KTsKKworCXQyID0gc2NoZWRfY2xvY2soKTsKKwl0b3VjaF9jYWNoZShjYWNoZSwgc2l6ZSk7CisJdDMgPSBzY2hlZF9jbG9jaygpOworCisJY29zdCA9IHQxLXQwICsgdDMtdDI7CisKKwlpZiAobWlncmF0aW9uX2RlYnVnID49IDIpCisJCXByaW50aygiWyVkLT4lZF06ICU4TGQgJThMZCAlOExkID0+ICUxMExkLlxuIiwKKwkJCXNvdXJjZSwgdGFyZ2V0LCB0MS10MCwgdDEtdDAsIHQzLXQyLCBjb3N0KTsKKwkvKgorCSAqIEZsdXNoIHRhcmdldCBjYWNoZXMgdG8gUkFNIGFuZCBpbnZhbGlkYXRlIHRoZW06CisJICovCisJc2NoZWRfY2FjaGVmbHVzaCgpOworCisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBzYXZlZF9tYXNrKTsKKworCXJldHVybiBjb3N0OworfQorCisvKgorICogTWVhc3VyZSBhIHNlcmllcyBvZiB0YXNrIG1pZ3JhdGlvbnMgYW5kIHJldHVybiB0aGUgYXZlcmFnZQorICogcmVzdWx0LiBTaW5jZSB0aGlzIGNvZGUgcnVucyBlYXJseSBkdXJpbmcgYm9vdHVwIHRoZSBzeXN0ZW0KKyAqIGlzICd1bmRpc3R1cmJlZCcgYW5kIHRoZSBhdmVyYWdlIGxhdGVuY3kgbWFrZXMgc2Vuc2UuCisgKgorICogVGhlIGFsZ29yaXRobSBpbiBlc3NlbmNlIGF1dG8tZGV0ZWN0cyB0aGUgcmVsZXZhbnQgY2FjaGUtc2l6ZSwKKyAqIHNvIGl0IHdpbGwgcHJvcGVybHkgZGV0ZWN0IGRpZmZlcmVudCBjYWNoZXNpemVzIGZvciBkaWZmZXJlbnQKKyAqIGNhY2hlLWhpZXJhcmNoaWVzLCBkZXBlbmRpbmcgb24gaG93IHRoZSBDUFVzIGFyZSBjb25uZWN0ZWQuCisgKgorICogQXJjaGl0ZWN0dXJlcyBjYW4gcHJpbWUgdGhlIHVwcGVyIGxpbWl0IG9mIHRoZSBzZWFyY2ggcmFuZ2UgdmlhCisgKiBtYXhfY2FjaGVfc2l6ZSwgb3RoZXJ3aXNlIHRoZSBzZWFyY2ggcmFuZ2UgZGVmYXVsdHMgdG8gMjBNQi4uLjY0Sy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZworbWVhc3VyZV9jb3N0KGludCBjcHUxLCBpbnQgY3B1Miwgdm9pZCAqY2FjaGUsIHVuc2lnbmVkIGludCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBjb3N0MSwgY29zdDI7CisJaW50IGk7CisKKwkvKgorCSAqIE1lYXN1cmUgdGhlIG1pZ3JhdGlvbiBjb3N0IG9mICdzaXplJyBieXRlcywgb3ZlciBhbgorCSAqIGF2ZXJhZ2Ugb2YgMTAgcnVuczoKKwkgKgorCSAqIChXZSBwZXJ0dXJiIHRoZSBjYWNoZSBzaXplIGJ5IGEgc21hbGwgKDAuLjRrKQorCSAqICB2YWx1ZSB0byBjb21wZW5zYXRlIHNpemUvYWxpZ25tZW50IHJlbGF0ZWQgYXJ0aWZhY3RzLgorCSAqICBXZSBhbHNvIHN1YnRyYWN0IHRoZSBjb3N0IG9mIHRoZSBvcGVyYXRpb24gZG9uZSBvbgorCSAqICB0aGUgc2FtZSBDUFUuKQorCSAqLworCWNvc3QxID0gMDsKKworCS8qCisJICogZHJ5IHJ1biwgdG8gbWFrZSBzdXJlIHdlIHN0YXJ0IG9mZiBjYWNoZS1jb2xkIG9uIGNwdTEsCisJICogYW5kIHRvIGdldCBhbnkgdm1hbGxvYyBwYWdlZmF1bHRzIGluIGFkdmFuY2U6CisJICovCisJbWVhc3VyZV9vbmUoY2FjaGUsIHNpemUsIGNwdTEsIGNwdTIpOworCWZvciAoaSA9IDA7IGkgPCBJVEVSQVRJT05TOyBpKyspCisJCWNvc3QxICs9IG1lYXN1cmVfb25lKGNhY2hlLCBzaXplIC0gaSoxMDI0LCBjcHUxLCBjcHUyKTsKKworCW1lYXN1cmVfb25lKGNhY2hlLCBzaXplLCBjcHUyLCBjcHUxKTsKKwlmb3IgKGkgPSAwOyBpIDwgSVRFUkFUSU9OUzsgaSsrKQorCQljb3N0MSArPSBtZWFzdXJlX29uZShjYWNoZSwgc2l6ZSAtIGkqMTAyNCwgY3B1MiwgY3B1MSk7CisKKwkvKgorCSAqIChXZSBtZWFzdXJlIHRoZSBub24tbWlncmF0aW5nIFtjYWNoZWRdIGNvc3Qgb24gYm90aAorCSAqICBjcHUxIGFuZCBjcHUyLCB0byBoYW5kbGUgQ1BVcyB3aXRoIGRpZmZlcmVudCBzcGVlZHMpCisJICovCisJY29zdDIgPSAwOworCisJbWVhc3VyZV9vbmUoY2FjaGUsIHNpemUsIGNwdTEsIGNwdTEpOworCWZvciAoaSA9IDA7IGkgPCBJVEVSQVRJT05TOyBpKyspCisJCWNvc3QyICs9IG1lYXN1cmVfb25lKGNhY2hlLCBzaXplIC0gaSoxMDI0LCBjcHUxLCBjcHUxKTsKKworCW1lYXN1cmVfb25lKGNhY2hlLCBzaXplLCBjcHUyLCBjcHUyKTsKKwlmb3IgKGkgPSAwOyBpIDwgSVRFUkFUSU9OUzsgaSsrKQorCQljb3N0MiArPSBtZWFzdXJlX29uZShjYWNoZSwgc2l6ZSAtIGkqMTAyNCwgY3B1MiwgY3B1Mik7CisKKwkvKgorCSAqIEdldCB0aGUgcGVyLWl0ZXJhdGlvbiBtaWdyYXRpb24gY29zdDoKKwkgKi8KKwlkb19kaXYoY29zdDEsIDIqSVRFUkFUSU9OUyk7CisJZG9fZGl2KGNvc3QyLCAyKklURVJBVElPTlMpOworCisJcmV0dXJuIGNvc3QxIC0gY29zdDI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbWVhc3VyZV9taWdyYXRpb25fY29zdChpbnQgY3B1MSwgaW50IGNwdTIpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIG1heF9jb3N0ID0gMCwgZmx1Y3QgPSAwLCBhdmdfZmx1Y3QgPSAwOworCXVuc2lnbmVkIGludCBtYXhfc2l6ZSwgc2l6ZSwgc2l6ZV9mb3VuZCA9IDA7CisJbG9uZyBsb25nIGNvc3QgPSAwLCBwcmV2X2Nvc3Q7CisJdm9pZCAqY2FjaGU7CisKKwkvKgorCSAqIFNlYXJjaCBmcm9tIG1heF9jYWNoZV9zaXplKjUgZG93biB0byA2NEsgLSB0aGUgcmVhbCByZWxldmFudAorCSAqIGNhY2hlc2l6ZSBoYXMgdG8gbGllIHNvbWV3aGVyZSBpbmJldHdlZW4uCisJICovCisJaWYgKG1heF9jYWNoZV9zaXplKSB7CisJCW1heF9zaXplID0gbWF4KG1heF9jYWNoZV9zaXplICogU0VBUkNIX1NDT1BFLCBNSU5fQ0FDSEVfU0laRSk7CisJCXNpemUgPSBtYXgobWF4X2NhY2hlX3NpemUgLyBTRUFSQ0hfU0NPUEUsIE1JTl9DQUNIRV9TSVpFKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTaW5jZSB3ZSBoYXZlIG5vIGVzdGltYXRpb24gYWJvdXQgdGhlIHJlbGV2YW50CisJCSAqIHNlYXJjaCByYW5nZQorCQkgKi8KKwkJbWF4X3NpemUgPSBERUZBVUxUX0NBQ0hFX1NJWkUgKiBTRUFSQ0hfU0NPUEU7CisJCXNpemUgPSBNSU5fQ0FDSEVfU0laRTsKKwl9CisKKwlpZiAoIWNwdV9vbmxpbmUoY3B1MSkgfHwgIWNwdV9vbmxpbmUoY3B1MikpIHsKKwkJcHJpbnRrKCJjcHUgJWQgYW5kICVkIG5vdCBib3RoIG9ubGluZSFcbiIsIGNwdTEsIGNwdTIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIHRoZSB3b3JraW5nIHNldDoKKwkgKi8KKwljYWNoZSA9IHZtYWxsb2MobWF4X3NpemUpOworCWlmICghY2FjaGUpIHsKKwkJcHJpbnRrKCJjb3VsZCBub3Qgdm1hbGxvYyAlZCBieXRlcyBmb3IgY2FjaGUhXG4iLCAyKm1heF9zaXplKTsKKwkJcmV0dXJuIDEwMDAwMDA7IC8vIHJldHVybiAxIG1zZWMgb24gdmVyeSBzbWFsbCBib3hlbgorCX0KKworCXdoaWxlIChzaXplIDw9IG1heF9zaXplKSB7CisJCXByZXZfY29zdCA9IGNvc3Q7CisJCWNvc3QgPSBtZWFzdXJlX2Nvc3QoY3B1MSwgY3B1MiwgY2FjaGUsIHNpemUpOworCisJCS8qCisJCSAqIFVwZGF0ZSB0aGUgbWF4OgorCQkgKi8KKwkJaWYgKGNvc3QgPiAwKSB7CisJCQlpZiAobWF4X2Nvc3QgPCBjb3N0KSB7CisJCQkJbWF4X2Nvc3QgPSBjb3N0OworCQkJCXNpemVfZm91bmQgPSBzaXplOworCQkJfQorCQl9CisJCS8qCisJCSAqIENhbGN1bGF0ZSBhdmVyYWdlIGZsdWN0dWF0aW9uLCB3ZSB1c2UgdGhpcyB0byBwcmV2ZW50CisJCSAqIG5vaXNlIGZyb20gdHJpZ2dlcmluZyBhbiBlYXJseSBicmVhayBvdXQgb2YgdGhlIGxvb3A6CisJCSAqLworCQlmbHVjdCA9IGFicyhjb3N0IC0gcHJldl9jb3N0KTsKKwkJYXZnX2ZsdWN0ID0gKGF2Z19mbHVjdCArIGZsdWN0KS8yOworCisJCWlmIChtaWdyYXRpb25fZGVidWcpCisJCQlwcmludGsoIi0+IFslZF1bJWRdWyU3ZF0gJTNsZC4lbGQgWyUzbGQuJWxkXSAoJWxkKTogKCU4TGQgJThMZClcbiIsCisJCQkJY3B1MSwgY3B1Miwgc2l6ZSwKKwkJCQkobG9uZyljb3N0IC8gMTAwMDAwMCwKKwkJCQkoKGxvbmcpY29zdCAvIDEwMDAwMCkgJSAxMCwKKwkJCQkobG9uZyltYXhfY29zdCAvIDEwMDAwMDAsCisJCQkJKChsb25nKW1heF9jb3N0IC8gMTAwMDAwKSAlIDEwLAorCQkJCWRvbWFpbl9kaXN0YW5jZShjcHUxLCBjcHUyKSwKKwkJCQljb3N0LCBhdmdfZmx1Y3QpOworCisJCS8qCisJCSAqIElmIHdlIGl0ZXJhdGVkIGF0IGxlYXN0IDIwJSBwYXN0IHRoZSBwcmV2aW91cyBtYXhpbXVtLAorCQkgKiBhbmQgdGhlIGNvc3QgaGFzIGRyb3BwZWQgYnkgbW9yZSB0aGFuIDIwJSBhbHJlYWR5LAorCQkgKiAodGFraW5nIGZsdWN0dWF0aW9ucyBpbnRvIGFjY291bnQpIHRoZW4gd2UgYXNzdW1lIHRvCisJCSAqIGhhdmUgZm91bmQgdGhlIG1heGltdW0gYW5kIGJyZWFrIG91dCBvZiB0aGUgbG9vcCBlYXJseToKKwkJICovCisJCWlmIChzaXplX2ZvdW5kICYmIChzaXplKjEwMCA+IHNpemVfZm91bmQqU0laRV9USFJFU0gpKQorCQkJaWYgKGNvc3QrYXZnX2ZsdWN0IDw9IDAgfHwKKwkJCQltYXhfY29zdCoxMDAgPiAoY29zdCthdmdfZmx1Y3QpKkNPU1RfVEhSRVNIKSB7CisKKwkJCQlpZiAobWlncmF0aW9uX2RlYnVnKQorCQkJCQlwcmludGsoIi0+IGZvdW5kIG1heC5cbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkvKgorCQkgKiBJbmNyZWFzZSB0aGUgY2FjaGVzaXplIGluIDUlIHN0ZXBzOgorCQkgKi8KKwkJc2l6ZSA9IHNpemUgKiAyMCAvIDE5OworCX0KKworCWlmIChtaWdyYXRpb25fZGVidWcpCisJCXByaW50aygiWyVkXVslZF0gd29ya2luZyBzZXQgc2l6ZSBmb3VuZDogJWQsIGNvc3Q6ICVMZFxuIiwKKwkJCWNwdTEsIGNwdTIsIHNpemVfZm91bmQsIG1heF9jb3N0KTsKKworCXZmcmVlKGNhY2hlKTsKKworCS8qCisJICogQSB0YXNrIGlzIGNvbnNpZGVyZWQgJ2NhY2hlIGNvbGQnIGlmIGF0IGxlYXN0IDIgdGltZXMKKwkgKiB0aGUgd29yc3QtY2FzZSBjb3N0IG9mIG1pZ3JhdGlvbiBoYXMgcGFzc2VkLgorCSAqCisJICogKHRoaXMgbGltaXQgaXMgb25seSBsaXN0ZW5lZCB0byBpZiB0aGUgbG9hZC1iYWxhbmNpbmcKKwkgKiBzaXR1YXRpb24gaXMgJ25pY2UnIC0gaWYgdGhlcmUgaXMgYSBsYXJnZSBpbWJhbGFuY2Ugd2UKKwkgKiBpZ25vcmUgaXQgZm9yIHRoZSBzYWtlIG9mIENQVSB1dGlsaXphdGlvbiBhbmQKKwkgKiBwcm9jZXNzaW5nIGZhaXJuZXNzLikKKwkgKi8KKwlyZXR1cm4gMiAqIG1heF9jb3N0ICogbWlncmF0aW9uX2ZhY3RvciAvIE1JR1JBVElPTl9GQUNUT1JfU0NBTEU7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGlicmF0ZV9taWdyYXRpb25fY29zdHMoY29uc3QgY3B1bWFza190ICpjcHVfbWFwKQoreworCWludCBjcHUxID0gLTEsIGNwdTIgPSAtMSwgY3B1LCBvcmlnX2NwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CisJdW5zaWduZWQgbG9uZyBqMCwgajEsIGRpc3RhbmNlLCBtYXhfZGlzdGFuY2UgPSAwOworCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOworCisJajAgPSBqaWZmaWVzOworCisJLyoKKwkgKiBGaXJzdCBwYXNzIC0gY2FsY3VsYXRlIHRoZSBjYWNoZWZsdXNoIHRpbWVzOgorCSAqLworCWZvcl9lYWNoX2NwdV9tYXNrKGNwdTEsICpjcHVfbWFwKSB7CisJCWZvcl9lYWNoX2NwdV9tYXNrKGNwdTIsICpjcHVfbWFwKSB7CisJCQlpZiAoY3B1MSA9PSBjcHUyKQorCQkJCWNvbnRpbnVlOworCQkJZGlzdGFuY2UgPSBkb21haW5fZGlzdGFuY2UoY3B1MSwgY3B1Mik7CisJCQltYXhfZGlzdGFuY2UgPSBtYXgobWF4X2Rpc3RhbmNlLCBkaXN0YW5jZSk7CisJCQkvKgorCQkJICogTm8gcmVzdWx0IGNhY2hlZCB5ZXQ/CisJCQkgKi8KKwkJCWlmIChtaWdyYXRpb25fY29zdFtkaXN0YW5jZV0gPT0gLTFMTCkKKwkJCQltaWdyYXRpb25fY29zdFtkaXN0YW5jZV0gPQorCQkJCQltZWFzdXJlX21pZ3JhdGlvbl9jb3N0KGNwdTEsIGNwdTIpOworCQl9CisJfQorCS8qCisJICogU2Vjb25kIHBhc3MgLSB1cGRhdGUgdGhlIHNjaGVkIGRvbWFpbiBoaWVyYXJjaHkgd2l0aAorCSAqIHRoZSBuZXcgY2FjaGUtaG90LXRpbWUgZXN0aW1hdGlvbnM6CisJICovCisJZm9yX2VhY2hfY3B1X21hc2soY3B1LCAqY3B1X21hcCkgeworCQlkaXN0YW5jZSA9IDA7CisJCWZvcl9lYWNoX2RvbWFpbihjcHUsIHNkKSB7CisJCQlzZC0+Y2FjaGVfaG90X3RpbWUgPSBtaWdyYXRpb25fY29zdFtkaXN0YW5jZV07CisJCQlkaXN0YW5jZSsrOworCQl9CisJfQorCS8qCisJICogUHJpbnQgdGhlIG1hdHJpeDoKKwkgKi8KKwlpZiAobWlncmF0aW9uX2RlYnVnKQorCQlwcmludGsoIm1pZ3JhdGlvbjogbWF4X2NhY2hlX3NpemU6ICVkLCBjcHU6ICVkIE1IejpcbiIsCisJCQltYXhfY2FjaGVfc2l6ZSwKKyNpZmRlZiBDT05GSUdfWDg2CisJCQljcHVfa2h6LzEwMDAKKyNlbHNlCisJCQktMQorI2VuZGlmCisJCSk7CisJcHJpbnRrKCJtaWdyYXRpb25fY29zdD0iKTsKKwlmb3IgKGRpc3RhbmNlID0gMDsgZGlzdGFuY2UgPD0gbWF4X2Rpc3RhbmNlOyBkaXN0YW5jZSsrKSB7CisJCWlmIChkaXN0YW5jZSkKKwkJCXByaW50aygiLCIpOworCQlwcmludGsoIiVsZCIsIChsb25nKW1pZ3JhdGlvbl9jb3N0W2Rpc3RhbmNlXSAvIDEwMDApOworCX0KKwlwcmludGsoIlxuIik7CisJajEgPSBqaWZmaWVzOworCWlmIChtaWdyYXRpb25fZGVidWcpCisJCXByaW50aygibWlncmF0aW9uOiAlbGQgc2Vjb25kc1xuIiwgKGoxLWowKS9IWik7CisKKwkvKgorCSAqIE1vdmUgYmFjayB0byB0aGUgb3JpZ2luYWwgQ1BVLiBOVU1BLVEgZ2V0cyBjb25mdXNlZAorCSAqIGlmIHdlIG1pZ3JhdGUgdG8gYW5vdGhlciBxdWFkIGR1cmluZyBib290dXAuCisJICovCisJaWYgKHJhd19zbXBfcHJvY2Vzc29yX2lkKCkgIT0gb3JpZ19jcHUpIHsKKwkJY3B1bWFza190IG1hc2sgPSBjcHVtYXNrX29mX2NwdShvcmlnX2NwdSksCisJCQlzYXZlZF9tYXNrID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCisJCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgbWFzayk7CisJCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgc2F2ZWRfbWFzayk7CisJfQorfQorCiAjaWZkZWYgQ09ORklHX05VTUEKKwogLyoqCiAgKiBmaW5kX25leHRfYmVzdF9ub2RlIC0gZmluZCB0aGUgbmV4dCBub2RlIHRvIGluY2x1ZGUgaW4gYSBzY2hlZF9kb21haW4KICAqIEBub2RlOiBub2RlIHdob3NlIHNjaGVkX2RvbWFpbiB3ZSdyZSBidWlsZGluZwpAQCAtNTQzOSw2ICs1OTQyLDEwIEBACiAjZW5kaWYKIAkJY3B1X2F0dGFjaF9kb21haW4oc2QsIGkpOwogCX0KKwkvKgorCSAqIFR1bmUgY2FjaGUtaG90IHZhbHVlczoKKwkgKi8KKwljYWxpYnJhdGVfbWlncmF0aW9uX2Nvc3RzKGNwdV9tYXApOwogfQogLyoKICAqIFNldCB1cCBzY2hlZHVsZXIgZG9tYWlucyBhbmQgZ3JvdXBzLiAgQ2FsbGVycyBtdXN0IGhvbGQgdGhlIGhvdHBsdWcgbG9jay4KQEAgLTU1MDUsNyArNjAxMiw3IEBACiAgKiBEZXRhY2ggc2NoZWQgZG9tYWlucyBmcm9tIGEgZ3JvdXAgb2YgY3B1cyBzcGVjaWZpZWQgaW4gY3B1X21hcAogICogVGhlc2UgY3B1cyB3aWxsIG5vdyBiZSBhdHRhY2hlZCB0byB0aGUgTlVMTCBkb21haW4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIGRldGFjaF9kZXN0cm95X2RvbWFpbnMoY29uc3QgY3B1bWFza190ICpjcHVfbWFwKQorc3RhdGljIHZvaWQgZGV0YWNoX2Rlc3Ryb3lfZG9tYWlucyhjb25zdCBjcHVtYXNrX3QgKmNwdV9tYXApCiB7CiAJaW50IGk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zaWduYWwuYyBiL2tlcm5lbC9zaWduYWwuYwppbmRleCBkNzYxMWYxLi5kM2VmYWZkIDEwMDY0NAotLS0gYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIva2VybmVsL3NpZ25hbC5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcG9zaXgtdGltZXJzLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8YXNtL3BhcmFtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CkBAIC0zMjksMTMgKzMzMCwyMCBAQAogCS8qIE9rLCB3ZSdyZSBkb25lIHdpdGggdGhlIHNpZ25hbCBoYW5kbGVycyAqLwogCXRzay0+c2lnaGFuZCA9IE5VTEw7CiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnNpZ2hhbmQtPmNvdW50KSkKLQkJa21lbV9jYWNoZV9mcmVlKHNpZ2hhbmRfY2FjaGVwLCBzaWdoYW5kKTsKKwkJc2lnaGFuZF9mcmVlKHNpZ2hhbmQpOwogfQogCiB2b2lkIGV4aXRfc2lnaGFuZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAl3cml0ZV9sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7Ci0JX19leGl0X3NpZ2hhbmQodHNrKTsKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKHRzay0+c2lnaGFuZCAhPSBOVUxMKSB7CisJCXN0cnVjdCBzaWdoYW5kX3N0cnVjdCAqc2lnaGFuZCA9IHJjdV9kZXJlZmVyZW5jZSh0c2stPnNpZ2hhbmQpOworCQlzcGluX2xvY2soJnNpZ2hhbmQtPnNpZ2xvY2spOworCQlfX2V4aXRfc2lnaGFuZCh0c2spOworCQlzcGluX3VubG9jaygmc2lnaGFuZC0+c2lnbG9jayk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOwogCXdyaXRlX3VubG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwogfQogCkBAIC0zNDUsMTkgKzM1MywyMCBAQAogdm9pZCBfX2V4aXRfc2lnbmFsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewogCXN0cnVjdCBzaWduYWxfc3RydWN0ICogc2lnID0gdHNrLT5zaWduYWw7Ci0Jc3RydWN0IHNpZ2hhbmRfc3RydWN0ICogc2lnaGFuZCA9IHRzay0+c2lnaGFuZDsKKwlzdHJ1Y3Qgc2lnaGFuZF9zdHJ1Y3QgKiBzaWdoYW5kOwogCiAJaWYgKCFzaWcpCiAJCUJVRygpOwogCWlmICghYXRvbWljX3JlYWQoJnNpZy0+Y291bnQpKQogCQlCVUcoKTsKKwlyY3VfcmVhZF9sb2NrKCk7CisJc2lnaGFuZCA9IHJjdV9kZXJlZmVyZW5jZSh0c2stPnNpZ2hhbmQpOwogCXNwaW5fbG9jaygmc2lnaGFuZC0+c2lnbG9jayk7CiAJcG9zaXhfY3B1X3RpbWVyc19leGl0KHRzayk7CiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnNpZy0+Y291bnQpKSB7CiAJCXBvc2l4X2NwdV90aW1lcnNfZXhpdF9ncm91cCh0c2spOwotCQlpZiAodHNrID09IHNpZy0+Y3Vycl90YXJnZXQpCi0JCQlzaWctPmN1cnJfdGFyZ2V0ID0gbmV4dF90aHJlYWQodHNrKTsKIAkJdHNrLT5zaWduYWwgPSBOVUxMOworCQlfX2V4aXRfc2lnaGFuZCh0c2spOwogCQlzcGluX3VubG9jaygmc2lnaGFuZC0+c2lnbG9jayk7CiAJCWZsdXNoX3NpZ3F1ZXVlKCZzaWctPnNoYXJlZF9wZW5kaW5nKTsKIAl9IGVsc2UgewpAQCAtMzg5LDkgKzM5OCwxMSBAQAogCQlzaWctPm52Y3N3ICs9IHRzay0+bnZjc3c7CiAJCXNpZy0+bml2Y3N3ICs9IHRzay0+bml2Y3N3OwogCQlzaWctPnNjaGVkX3RpbWUgKz0gdHNrLT5zY2hlZF90aW1lOworCQlfX2V4aXRfc2lnaGFuZCh0c2spOwogCQlzcGluX3VubG9jaygmc2lnaGFuZC0+c2lnbG9jayk7CiAJCXNpZyA9IE5VTEw7CS8qIE1hcmtlciBmb3IgYmVsb3cuICAqLwogCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKIAljbGVhcl90c2tfdGhyZWFkX2ZsYWcodHNrLFRJRl9TSUdQRU5ESU5HKTsKIAlmbHVzaF9zaWdxdWV1ZSgmdHNrLT5wZW5kaW5nKTsKIAlpZiAoc2lnKSB7CkBAIC00NjUsNyArNDc2LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGNvbGxlY3Rfc2lnbmFsKGludCBzaWcsIHN0cnVjdCBzaWdwZW5kaW5nICpsaXN0LCBzaWdpbmZvX3QgKmluZm8pCitzdGF0aWMgaW50IGNvbGxlY3Rfc2lnbmFsKGludCBzaWcsIHN0cnVjdCBzaWdwZW5kaW5nICpsaXN0LCBzaWdpbmZvX3QgKmluZm8pCiB7CiAJc3RydWN0IHNpZ3F1ZXVlICpxLCAqZmlyc3QgPSBOVUxMOwogCWludCBzdGlsbF9wZW5kaW5nID0gMDsKQEAgLTYxMyw2ICs2MjQsMzMgQEAKICAqIFJldHVybnMgMSBpZiBhbnkgc2lnbmFscyB3ZXJlIGZvdW5kLgogICoKICAqIEFsbCBjYWxsZXJzIG11c3QgYmUgaG9sZGluZyB0aGUgc2lnbG9jay4KKyAqCisgKiBUaGlzIHZlcnNpb24gdGFrZXMgYSBzaWdzZXQgbWFzayBhbmQgbG9va3MgYXQgYWxsIHNpZ25hbHMsCisgKiBub3QganVzdCB0aG9zZSBpbiB0aGUgZmlyc3QgbWFzayB3b3JkLgorICovCitzdGF0aWMgaW50IHJtX2Zyb21fcXVldWVfZnVsbChzaWdzZXRfdCAqbWFzaywgc3RydWN0IHNpZ3BlbmRpbmcgKnMpCit7CisJc3RydWN0IHNpZ3F1ZXVlICpxLCAqbjsKKwlzaWdzZXRfdCBtOworCisJc2lnYW5kc2V0cygmbSwgbWFzaywgJnMtPnNpZ25hbCk7CisJaWYgKHNpZ2lzZW1wdHlzZXQoJm0pKQorCQlyZXR1cm4gMDsKKworCXNpZ25hbmRzZXRzKCZzLT5zaWduYWwsICZzLT5zaWduYWwsIG1hc2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShxLCBuLCAmcy0+bGlzdCwgbGlzdCkgeworCQlpZiAoc2lnaXNtZW1iZXIobWFzaywgcS0+aW5mby5zaV9zaWdubykpIHsKKwkJCWxpc3RfZGVsX2luaXQoJnEtPmxpc3QpOworCQkJX19zaWdxdWV1ZV9mcmVlKHEpOworCQl9CisJfQorCXJldHVybiAxOworfQorLyoKKyAqIFJlbW92ZSBzaWduYWxzIGluIG1hc2sgZnJvbSB0aGUgcGVuZGluZyBzZXQgYW5kIHF1ZXVlLgorICogUmV0dXJucyAxIGlmIGFueSBzaWduYWxzIHdlcmUgZm91bmQuCisgKgorICogQWxsIGNhbGxlcnMgbXVzdCBiZSBob2xkaW5nIHRoZSBzaWdsb2NrLgogICovCiBzdGF0aWMgaW50IHJtX2Zyb21fcXVldWUodW5zaWduZWQgbG9uZyBtYXNrLCBzdHJ1Y3Qgc2lncGVuZGluZyAqcykKIHsKQEAgLTEwODAsMTggKzExMTgsMjkgQEAKIH0KIAogLyoKLSAqIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHRhc2tsaXN0X2xvY2sgaGVsZCBmb3IgcmVhZGluZyEKKyAqIE11c3QgYmUgY2FsbGVkIHVuZGVyIHJjdV9yZWFkX2xvY2soKSBvciB3aXRoIHRhc2tsaXN0X2xvY2sgcmVhZC1oZWxkLgogICovCiBpbnQgZ3JvdXBfc2VuZF9zaWdfaW5mbyhpbnQgc2lnLCBzdHJ1Y3Qgc2lnaW5mbyAqaW5mbywgc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNpZ2hhbmRfc3RydWN0ICpzcDsKIAlpbnQgcmV0OwogCityZXRyeToKIAlyZXQgPSBjaGVja19raWxsX3Blcm1pc3Npb24oc2lnLCBpbmZvLCBwKTsKLQlpZiAoIXJldCAmJiBzaWcgJiYgcC0+c2lnaGFuZCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCWlmICghcmV0ICYmIHNpZyAmJiAoc3AgPSByY3VfZGVyZWZlcmVuY2UocC0+c2lnaGFuZCkpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzcC0+c2lnbG9jaywgZmxhZ3MpOworCQlpZiAocC0+c2lnaGFuZCAhPSBzcCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPnNpZ2xvY2ssIGZsYWdzKTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwkJaWYgKChhdG9taWNfcmVhZCgmc3AtPmNvdW50KSA9PSAwKSB8fAorCQkJCShhdG9taWNfcmVhZCgmcC0+dXNhZ2UpID09IDApKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcC0+c2lnbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIC1FU1JDSDsKKwkJfQogCQlyZXQgPSBfX2dyb3VwX3NlbmRfc2lnX2luZm8oc2lnLCBpbmZvLCBwKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcC0+c2lnbG9jaywgZmxhZ3MpOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0xMTM2LDE0ICsxMTg1LDIxIEBACiBraWxsX3Byb2NfaW5mbyhpbnQgc2lnLCBzdHJ1Y3Qgc2lnaW5mbyAqaW5mbywgcGlkX3QgcGlkKQogewogCWludCBlcnJvcjsKKwlpbnQgYWNxdWlyZWRfdGFza2xpc3RfbG9jayA9IDA7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwogCi0JcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKHVubGlrZWx5KHNpZ19rZXJuZWxfc3RvcChzaWcpIHx8IHNpZyA9PSBTSUdDT05UKSkgeworCQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCQlhY3F1aXJlZF90YXNrbGlzdF9sb2NrID0gMTsKKwl9CiAJcCA9IGZpbmRfdGFza19ieV9waWQocGlkKTsKIAllcnJvciA9IC1FU1JDSDsKIAlpZiAocCkKIAkJZXJyb3IgPSBncm91cF9zZW5kX3NpZ19pbmZvKHNpZywgaW5mbywgcCk7Ci0JcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCWlmICh1bmxpa2VseShhY3F1aXJlZF90YXNrbGlzdF9sb2NrKSkKKwkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMTE2Myw4ICsxMjE5LDcgQEAKIAkJcmV0ID0gLUVTUkNIOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQotCWlmICgoIWluZm8gfHwgKCh1bnNpZ25lZCBsb25nKWluZm8gIT0gMSAmJgotCQkJKHVuc2lnbmVkIGxvbmcpaW5mbyAhPSAyICYmIFNJX0ZST01VU0VSKGluZm8pKSkKKwlpZiAoKGluZm8gPT0gU0VORF9TSUdfTk9JTkZPIHx8ICghaXNfc2lfc3BlY2lhbChpbmZvKSAmJiBTSV9GUk9NVVNFUihpbmZvKSkpCiAJICAgICYmIChldWlkICE9IHAtPnN1aWQpICYmIChldWlkICE9IHAtPnVpZCkKIAkgICAgJiYgKHVpZCAhPSBwLT5zdWlkKSAmJiAodWlkICE9IHAtPnVpZCkpIHsKIAkJcmV0ID0gLUVQRVJNOwpAQCAtMTM1NSwxNiArMTQxMCw1NCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCA9IDA7CisJc3RydWN0IHNpZ2hhbmRfc3RydWN0ICpzaDsKIAogCUJVR19PTighKHEtPmZsYWdzICYgU0lHUVVFVUVfUFJFQUxMT0MpKTsKLQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCisJLyoKKwkgKiBUaGUgcmN1IGJhc2VkIGRlbGF5ZWQgc2lnaGFuZCBkZXN0cm95IG1ha2VzIGl0IHBvc3NpYmxlIHRvCisJICogcnVuIHRoaXMgd2l0aG91dCB0YXNrbGlzdCBsb2NrIGhlbGQuIFRoZSB0YXNrIHN0cnVjdCBpdHNlbGYKKwkgKiBjYW5ub3QgZ28gYXdheSBhcyBjcmVhdGVfdGltZXIgZGlkIGdldF90YXNrX3N0cnVjdCgpLgorCSAqCisJICogV2UgcmV0dXJuIC0xLCB3aGVuIHRoZSB0YXNrIGlzIG1hcmtlZCBleGl0aW5nLCBzbworCSAqIHBvc2l4X3RpbWVyX2V2ZW50IGNhbiByZWRpcmVjdCBpdCB0byB0aGUgZ3JvdXAgbGVhZGVyCisJICovCisJcmN1X3JlYWRfbG9jaygpOwogCiAJaWYgKHVubGlrZWx5KHAtPmZsYWdzICYgUEZfRVhJVElORykpIHsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworcmV0cnk6CisJc2ggPSByY3VfZGVyZWZlcmVuY2UocC0+c2lnaGFuZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2gtPnNpZ2xvY2ssIGZsYWdzKTsKKwlpZiAocC0+c2lnaGFuZCAhPSBzaCkgeworCQkvKiBXZSByYWNlZCB3aXRoIGV4ZWMoKSBpbiBhIG11bHRpdGhyZWFkZWQgcHJvY2Vzcy4uLiAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzaC0+c2lnbG9jaywgZmxhZ3MpOworCQlnb3RvIHJldHJ5OworCX0KKworCS8qCisJICogV2UgZG8gdGhlIGNoZWNrIGhlcmUgYWdhaW4gdG8gaGFuZGxlIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW86CisJICoKKwkgKiBDUFUgMAkJQ1BVIDEKKwkgKiBzZW5kX3NpZ3F1ZXVlCisJICogY2hlY2sgUEZfRVhJVElORworCSAqIGludGVycnVwdAkJZXhpdCBjb2RlIHJ1bm5pbmcKKwkgKgkJCV9fZXhpdF9zaWduYWwKKwkgKgkJCWxvY2sgc2lnaGFuZC0+c2lnbG9jaworCSAqCQkJdW5sb2NrIHNpZ2hhbmQtPnNpZ2xvY2sKKwkgKiBsb2NrIHNoLT5zaWdsb2NrCisJICogYWRkKHRzay0+cGVuZGluZykgCWZsdXNoX3NpZ3F1ZXVlKHRzay0+cGVuZGluZykKKwkgKgorCSAqLworCisJaWYgKHVubGlrZWx5KHAtPmZsYWdzICYgUEZfRVhJVElORykpIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KIAogCWlmICh1bmxpa2VseSghbGlzdF9lbXB0eSgmcS0+bGlzdCkpKSB7CiAJCS8qCkBAIC0xMzg4LDkgKzE0ODEsOSBAQAogCQlzaWduYWxfd2FrZV91cChwLCBzaWcgPT0gU0lHS0lMTCk7CiAKIG91dDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2gtPnNpZ2xvY2ssIGZsYWdzKTsKIG91dF9lcnI6Ci0JcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE0MDIsNyArMTQ5NSw5IEBACiAJaW50IHJldCA9IDA7CiAKIAlCVUdfT04oIShxLT5mbGFncyAmIFNJR1FVRVVFX1BSRUFMTE9DKSk7CisKIAlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCS8qIFNpbmNlIGl0X2xvY2sgaXMgaGVsZCwgcC0+c2lnaGFuZCBjYW5ub3QgYmUgTlVMTC4gKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOwogCWhhbmRsZV9zdG9wX3NpZ25hbChzaWcsIHApOwogCkBAIC0xNDM2LDcgKzE1MzEsNyBAQAogb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7Ci0JcmV0dXJuKHJldCk7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTE3ODYsNyArMTg4MSw3IEBACiAgKiBXZSByZXR1cm4gemVybyBpZiB3ZSBzdGlsbCBob2xkIHRoZSBzaWdsb2NrIGFuZCBzaG91bGQgbG9vawogICogZm9yIGFub3RoZXIgc2lnbmFsIHdpdGhvdXQgY2hlY2tpbmcgZ3JvdXBfc3RvcF9jb3VudCBhZ2Fpbi4KICAqLwotc3RhdGljIGlubGluZSBpbnQgaGFuZGxlX2dyb3VwX3N0b3Aodm9pZCkKK3N0YXRpYyBpbnQgaGFuZGxlX2dyb3VwX3N0b3Aodm9pZCkKIHsKIAlpbnQgc3RvcF9jb3VudDsKIApAQCAtMjMzOCw2ICsyNDMzLDcgQEAKIGRvX3NpZ2FjdGlvbihpbnQgc2lnLCBjb25zdCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmFjdCwgc3RydWN0IGtfc2lnYWN0aW9uICpvYWN0KQogewogCXN0cnVjdCBrX3NpZ2FjdGlvbiAqazsKKwlzaWdzZXRfdCBtYXNrOwogCiAJaWYgKCF2YWxpZF9zaWduYWwoc2lnKSB8fCBzaWcgPCAxIHx8IChhY3QgJiYgc2lnX2tlcm5lbF9vbmx5KHNpZykpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIzODUsOSArMjQ4MSwxMSBAQAogCQkJKmsgPSAqYWN0OwogCQkJc2lnZGVsc2V0bWFzaygmay0+c2Euc2FfbWFzaywKIAkJCQkgICAgICBzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSk7Ci0JCQlybV9mcm9tX3F1ZXVlKHNpZ21hc2soc2lnKSwgJnQtPnNpZ25hbC0+c2hhcmVkX3BlbmRpbmcpOworCQkJc2lnZW1wdHlzZXQoJm1hc2spOworCQkJc2lnYWRkc2V0KCZtYXNrLCBzaWcpOworCQkJcm1fZnJvbV9xdWV1ZV9mdWxsKCZtYXNrLCAmdC0+c2lnbmFsLT5zaGFyZWRfcGVuZGluZyk7CiAJCQlkbyB7Ci0JCQkJcm1fZnJvbV9xdWV1ZShzaWdtYXNrKHNpZyksICZ0LT5wZW5kaW5nKTsKKwkJCQlybV9mcm9tX3F1ZXVlX2Z1bGwoJm1hc2ssICZ0LT5wZW5kaW5nKTsKIAkJCQlyZWNhbGNfc2lncGVuZGluZ190c2sodCk7CiAJCQkJdCA9IG5leHRfdGhyZWFkKHQpOwogCQkJfSB3aGlsZSAodCAhPSBjdXJyZW50KTsKQEAgLTI2MjMsNiArMjcyMSwzMiBAQAogCiAjZW5kaWYKIAorI2lmZGVmIF9fQVJDSF9XQU5UX1NZU19SVF9TSUdTVVNQRU5ECithc21saW5rYWdlIGxvbmcgc3lzX3J0X3NpZ3N1c3BlbmQoc2lnc2V0X3QgX191c2VyICp1bmV3c2V0LCBzaXplX3Qgc2lnc2V0c2l6ZSkKK3sKKwlzaWdzZXRfdCBuZXdzZXQ7CisKKwkvKiBYWFg6IERvbid0IHByZWNsdWRlIGhhbmRsaW5nIGRpZmZlcmVudCBzaXplZCBzaWdzZXRfdCdzLiAgKi8KKwlpZiAoc2lnc2V0c2l6ZSAhPSBzaXplb2Yoc2lnc2V0X3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3c2V0LCB1bmV3c2V0LCBzaXplb2YobmV3c2V0KSkpCisJCXJldHVybiAtRUZBVUxUOworCXNpZ2RlbHNldG1hc2soJm5ld3NldCwgc2lnbWFzayhTSUdLSUxMKXxzaWdtYXNrKFNJR1NUT1ApKTsKKworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWN1cnJlbnQtPnNhdmVkX3NpZ21hc2sgPSBjdXJyZW50LT5ibG9ja2VkOworCWN1cnJlbnQtPmJsb2NrZWQgPSBuZXdzZXQ7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJc2NoZWR1bGUoKTsKKwlzZXRfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CisJcmV0dXJuIC1FUkVTVEFSVE5PSEFORDsKK30KKyNlbmRpZiAvKiBfX0FSQ0hfV0FOVF9TWVNfUlRfU0lHU1VTUEVORCAqLworCiB2b2lkIF9faW5pdCBzaWduYWxzX2luaXQodm9pZCkKIHsKIAlzaWdxdWV1ZV9jYWNoZXAgPQpkaWZmIC0tZ2l0IGEva2VybmVsL3N0b3BfbWFjaGluZS5jIGIva2VybmVsL3N0b3BfbWFjaGluZS5jCmluZGV4IGIzZDRkYzguLmRjZmI1ZDcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zdG9wX21hY2hpbmUuYworKysgYi9rZXJuZWwvc3RvcF9tYWNoaW5lLmMKQEAgLTg3LDEzICs4Nyw5IEBACiB7CiAJaW50IGksIHJldCA9IDA7CiAJc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtID0geyAuc2NoZWRfcHJpb3JpdHkgPSBNQVhfUlRfUFJJTy0xIH07Ci0JbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOwogCiAJLyogT25lIGhpZ2gtcHJpbyB0aHJlYWQgcGVyIGNwdS4gIFdlJ2xsIGRvIHRoaXMgb25lLiAqLwotCXNldF9mcyhLRVJORUxfRFMpOwotCXN5c19zY2hlZF9zZXRzY2hlZHVsZXIoY3VycmVudC0+cGlkLCBTQ0hFRF9GSUZPLAotCQkJCShzdHJ1Y3Qgc2NoZWRfcGFyYW0gX191c2VyICopJnBhcmFtKTsKLQlzZXRfZnMob2xkX2ZzKTsKKwlzY2hlZF9zZXRzY2hlZHVsZXIoY3VycmVudCwgU0NIRURfRklGTywgJnBhcmFtKTsKIAogCWF0b21pY19zZXQoJnN0b3BtYWNoaW5lX3RocmVhZF9hY2ssIDApOwogCXN0b3BtYWNoaW5lX251bV90aHJlYWRzID0gMDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXMuYyBiL2tlcm5lbC9zeXMuYwppbmRleCBlZWNmODQ1Li4wOTI5YzY5IDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzLmMKKysrIGIva2VybmVsL3N5cy5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2V5Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXMuaD4KQEAgLTIyMyw2ICsyMjQsMTggQEAKIAogRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcik7CiAKKyNpZm5kZWYgQ09ORklHX1NFQ1VSSVRZCitpbnQgY2FwYWJsZShpbnQgY2FwKQoreworICAgICAgICBpZiAoY2FwX3JhaXNlZChjdXJyZW50LT5jYXBfZWZmZWN0aXZlLCBjYXApKSB7CisJICAgICAgIGN1cnJlbnQtPmZsYWdzIHw9IFBGX1NVUEVSUFJJVjsKKwkgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGNhcGFibGUpOworI2VuZGlmCisKIHN0YXRpYyBpbnQgc2V0X29uZV9wcmlvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IG5pY2V2YWwsIGludCBlcnJvcikKIHsKIAlpbnQgbm9fbmljZTsKQEAgLTQyNywyMyArNDQwLDI1IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChrZXJuZWxfa2V4ZWMpOwogCit2b2lkIGtlcm5lbF9zaHV0ZG93bl9wcmVwYXJlKGVudW0gc3lzdGVtX3N0YXRlcyBzdGF0ZSkKK3sKKwlub3RpZmllcl9jYWxsX2NoYWluKCZyZWJvb3Rfbm90aWZpZXJfbGlzdCwKKwkJKHN0YXRlID09IFNZU1RFTV9IQUxUKT9TWVNfSEFMVDpTWVNfUE9XRVJfT0ZGLCBOVUxMKTsKKwlzeXN0ZW1fc3RhdGUgPSBzdGF0ZTsKKwlkZXZpY2Vfc2h1dGRvd24oKTsKK30KIC8qKgogICoJa2VybmVsX2hhbHQgLSBoYWx0IHRoZSBzeXN0ZW0KICAqCiAgKglTaHV0ZG93biBldmVyeXRoaW5nIGFuZCBwZXJmb3JtIGEgY2xlYW4gc3lzdGVtIGhhbHQuCiAgKi8KLXZvaWQga2VybmVsX2hhbHRfcHJlcGFyZSh2b2lkKQotewotCW5vdGlmaWVyX2NhbGxfY2hhaW4oJnJlYm9vdF9ub3RpZmllcl9saXN0LCBTWVNfSEFMVCwgTlVMTCk7Ci0Jc3lzdGVtX3N0YXRlID0gU1lTVEVNX0hBTFQ7Ci0JZGV2aWNlX3NodXRkb3duKCk7Ci19CiB2b2lkIGtlcm5lbF9oYWx0KHZvaWQpCiB7Ci0Ja2VybmVsX2hhbHRfcHJlcGFyZSgpOworCWtlcm5lbF9zaHV0ZG93bl9wcmVwYXJlKFNZU1RFTV9IQUxUKTsKIAlwcmludGsoS0VSTl9FTUVSRyAiU3lzdGVtIGhhbHRlZC5cbiIpOwogCW1hY2hpbmVfaGFsdCgpOwogfQorCiBFWFBPUlRfU1lNQk9MX0dQTChrZXJuZWxfaGFsdCk7CiAKIC8qKgpAQCAtNDUxLDIwICs0NjYsMTMgQEAKICAqCiAgKglTaHV0ZG93biBldmVyeXRoaW5nIGFuZCBwZXJmb3JtIGEgY2xlYW4gc3lzdGVtIHBvd2VyX29mZi4KICAqLwotdm9pZCBrZXJuZWxfcG93ZXJfb2ZmX3ByZXBhcmUodm9pZCkKLXsKLQlub3RpZmllcl9jYWxsX2NoYWluKCZyZWJvb3Rfbm90aWZpZXJfbGlzdCwgU1lTX1BPV0VSX09GRiwgTlVMTCk7Ci0Jc3lzdGVtX3N0YXRlID0gU1lTVEVNX1BPV0VSX09GRjsKLQlkZXZpY2Vfc2h1dGRvd24oKTsKLX0KIHZvaWQga2VybmVsX3Bvd2VyX29mZih2b2lkKQogewotCWtlcm5lbF9wb3dlcl9vZmZfcHJlcGFyZSgpOworCWtlcm5lbF9zaHV0ZG93bl9wcmVwYXJlKFNZU1RFTV9QT1dFUl9PRkYpOwogCXByaW50ayhLRVJOX0VNRVJHICJQb3dlciBkb3duLlxuIik7CiAJbWFjaGluZV9wb3dlcl9vZmYoKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGtlcm5lbF9wb3dlcl9vZmYpOwotCiAvKgogICogUmVib290IHN5c3RlbSBjYWxsOiBmb3Igb2J2aW91cyByZWFzb25zIG9ubHkgcm9vdCBtYXkgY2FsbCBpdCwKICAqIGFuZCBldmVuIHJvb3QgbmVlZHMgdG8gc2V0IHVwIHNvbWUgbWFnaWMgbnVtYmVycyBpbiB0aGUgcmVnaXN0ZXJzCkBAIC00ODksNiArNDk3LDEyIEBACiAJICAgICAgICAgICAgICAgIG1hZ2ljMiAhPSBMSU5VWF9SRUJPT1RfTUFHSUMyQykpCiAJCXJldHVybiAtRUlOVkFMOwogCisJLyogSW5zdGVhZCBvZiB0cnlpbmcgdG8gbWFrZSB0aGUgcG93ZXJfb2ZmIGNvZGUgbG9vayBsaWtlCisJICogaGFsdCB3aGVuIHBtX3Bvd2VyX29mZiBpcyBub3Qgc2V0IGRvIGl0IHRoZSBlYXN5IHdheS4KKwkgKi8KKwlpZiAoKGNtZCA9PSBMSU5VWF9SRUJPT1RfQ01EX1BPV0VSX09GRikgJiYgIXBtX3Bvd2VyX29mZikKKwkJY21kID0gTElOVVhfUkVCT09UX0NNRF9IQUxUOworCiAJbG9ja19rZXJuZWwoKTsKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgTElOVVhfUkVCT09UX0NNRF9SRVNUQVJUOgpAQCAtMTA4NCwxMCArMTA5OCwxMSBAQAogYXNtbGlua2FnZSBsb25nIHN5c19zZXRwZ2lkKHBpZF90IHBpZCwgcGlkX3QgcGdpZCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CisJc3RydWN0IHRhc2tfc3RydWN0ICpncm91cF9sZWFkZXIgPSBjdXJyZW50LT5ncm91cF9sZWFkZXI7CiAJaW50IGVyciA9IC1FSU5WQUw7CiAKIAlpZiAoIXBpZCkKLQkJcGlkID0gY3VycmVudC0+cGlkOworCQlwaWQgPSBncm91cF9sZWFkZXItPnBpZDsKIAlpZiAoIXBnaWQpCiAJCXBnaWQgPSBwaWQ7CiAJaWYgKHBnaWQgPCAwKQpAQCAtMTEwNywxNiArMTEyMiwxNiBAQAogCWlmICghdGhyZWFkX2dyb3VwX2xlYWRlcihwKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAocC0+cGFyZW50ID09IGN1cnJlbnQgfHwgcC0+cmVhbF9wYXJlbnQgPT0gY3VycmVudCkgeworCWlmIChwLT5yZWFsX3BhcmVudCA9PSBncm91cF9sZWFkZXIpIHsKIAkJZXJyID0gLUVQRVJNOwotCQlpZiAocC0+c2lnbmFsLT5zZXNzaW9uICE9IGN1cnJlbnQtPnNpZ25hbC0+c2Vzc2lvbikKKwkJaWYgKHAtPnNpZ25hbC0+c2Vzc2lvbiAhPSBncm91cF9sZWFkZXItPnNpZ25hbC0+c2Vzc2lvbikKIAkJCWdvdG8gb3V0OwogCQllcnIgPSAtRUFDQ0VTOwogCQlpZiAocC0+ZGlkX2V4ZWMpCiAJCQlnb3RvIG91dDsKIAl9IGVsc2UgewogCQllcnIgPSAtRVNSQ0g7Ci0JCWlmIChwICE9IGN1cnJlbnQpCisJCWlmIChwICE9IGdyb3VwX2xlYWRlcikKIAkJCWdvdG8gb3V0OwogCX0KIApAQCAtMTEyOCw3ICsxMTQzLDcgQEAKIAkJc3RydWN0IHRhc2tfc3RydWN0ICpwOwogCiAJCWRvX2VhY2hfdGFza19waWQocGdpZCwgUElEVFlQRV9QR0lELCBwKSB7Ci0JCQlpZiAocC0+c2lnbmFsLT5zZXNzaW9uID09IGN1cnJlbnQtPnNpZ25hbC0+c2Vzc2lvbikKKwkJCWlmIChwLT5zaWduYWwtPnNlc3Npb24gPT0gZ3JvdXBfbGVhZGVyLT5zaWduYWwtPnNlc3Npb24pCiAJCQkJZ290byBva19wZ2lkOwogCQl9IHdoaWxlX2VhY2hfdGFza19waWQocGdpZCwgUElEVFlQRV9QR0lELCBwKTsKIAkJZ290byBvdXQ7CkBAIC0xMjA4LDI0ICsxMjIzLDIyIEBACiAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfc2V0c2lkKHZvaWQpCiB7CisJc3RydWN0IHRhc2tfc3RydWN0ICpncm91cF9sZWFkZXIgPSBjdXJyZW50LT5ncm91cF9sZWFkZXI7CiAJc3RydWN0IHBpZCAqcGlkOwogCWludCBlcnIgPSAtRVBFUk07CiAKLQlpZiAoIXRocmVhZF9ncm91cF9sZWFkZXIoY3VycmVudCkpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJZG93bigmdHR5X3NlbSk7CiAJd3JpdGVfbG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwogCi0JcGlkID0gZmluZF9waWQoUElEVFlQRV9QR0lELCBjdXJyZW50LT5waWQpOworCXBpZCA9IGZpbmRfcGlkKFBJRFRZUEVfUEdJRCwgZ3JvdXBfbGVhZGVyLT5waWQpOwogCWlmIChwaWQpCiAJCWdvdG8gb3V0OwogCi0JY3VycmVudC0+c2lnbmFsLT5sZWFkZXIgPSAxOwotCV9fc2V0X3NwZWNpYWxfcGlkcyhjdXJyZW50LT5waWQsIGN1cnJlbnQtPnBpZCk7Ci0JY3VycmVudC0+c2lnbmFsLT50dHkgPSBOVUxMOwotCWN1cnJlbnQtPnNpZ25hbC0+dHR5X29sZF9wZ3JwID0gMDsKLQllcnIgPSBwcm9jZXNzX2dyb3VwKGN1cnJlbnQpOworCWdyb3VwX2xlYWRlci0+c2lnbmFsLT5sZWFkZXIgPSAxOworCV9fc2V0X3NwZWNpYWxfcGlkcyhncm91cF9sZWFkZXItPnBpZCwgZ3JvdXBfbGVhZGVyLT5waWQpOworCWdyb3VwX2xlYWRlci0+c2lnbmFsLT50dHkgPSBOVUxMOworCWdyb3VwX2xlYWRlci0+c2lnbmFsLT50dHlfb2xkX3BncnAgPSAwOworCWVyciA9IHByb2Nlc3NfZ3JvdXAoZ3JvdXBfbGVhZGVyKTsKIG91dDoKIAl3cml0ZV91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKIAl1cCgmdHR5X3NlbSk7CkBAIC0xNjg3LDcgKzE3MDAsMTAgQEAKIAlpZiAodW5saWtlbHkoIXAtPnNpZ25hbCkpCiAJCXJldHVybjsKIAorCXV0aW1lID0gc3RpbWUgPSBjcHV0aW1lX3plcm87CisKIAlzd2l0Y2ggKHdobykgeworCQljYXNlIFJVU0FHRV9CT1RIOgogCQljYXNlIFJVU0FHRV9DSElMRFJFTjoKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZwLT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CiAJCQl1dGltZSA9IHAtPnNpZ25hbC0+Y3V0aW1lOwpAQCAtMTY5NywyMiArMTcxMywxMSBAQAogCQkJci0+cnVfbWluZmx0ID0gcC0+c2lnbmFsLT5jbWluX2ZsdDsKIAkJCXItPnJ1X21hamZsdCA9IHAtPnNpZ25hbC0+Y21hal9mbHQ7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7Ci0JCQljcHV0aW1lX3RvX3RpbWV2YWwodXRpbWUsICZyLT5ydV91dGltZSk7Ci0JCQljcHV0aW1lX3RvX3RpbWV2YWwoc3RpbWUsICZyLT5ydV9zdGltZSk7Ci0JCQlicmVhazsKKworCQkJaWYgKHdobyA9PSBSVVNBR0VfQ0hJTERSRU4pCisJCQkJYnJlYWs7CisKIAkJY2FzZSBSVVNBR0VfU0VMRjoKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwLT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7Ci0JCQl1dGltZSA9IHN0aW1lID0gY3B1dGltZV96ZXJvOwotCQkJZ290byBzdW1fZ3JvdXA7Ci0JCWNhc2UgUlVTQUdFX0JPVEg6Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOwotCQkJdXRpbWUgPSBwLT5zaWduYWwtPmN1dGltZTsKLQkJCXN0aW1lID0gcC0+c2lnbmFsLT5jc3RpbWU7Ci0JCQlyLT5ydV9udmNzdyA9IHAtPnNpZ25hbC0+Y252Y3N3OwotCQkJci0+cnVfbml2Y3N3ID0gcC0+c2lnbmFsLT5jbml2Y3N3OwotCQkJci0+cnVfbWluZmx0ID0gcC0+c2lnbmFsLT5jbWluX2ZsdDsKLQkJCXItPnJ1X21hamZsdCA9IHAtPnNpZ25hbC0+Y21hal9mbHQ7Ci0JCXN1bV9ncm91cDoKIAkJCXV0aW1lID0gY3B1dGltZV9hZGQodXRpbWUsIHAtPnNpZ25hbC0+dXRpbWUpOwogCQkJc3RpbWUgPSBjcHV0aW1lX2FkZChzdGltZSwgcC0+c2lnbmFsLT5zdGltZSk7CiAJCQlyLT5ydV9udmNzdyArPSBwLT5zaWduYWwtPm52Y3N3OwpAQCAtMTcyOSwxMyArMTczNCwxNCBAQAogCQkJCXItPnJ1X21hamZsdCArPSB0LT5tYWpfZmx0OwogCQkJCXQgPSBuZXh0X3RocmVhZCh0KTsKIAkJCX0gd2hpbGUgKHQgIT0gcCk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7Ci0JCQljcHV0aW1lX3RvX3RpbWV2YWwodXRpbWUsICZyLT5ydV91dGltZSk7Ci0JCQljcHV0aW1lX3RvX3RpbWV2YWwoc3RpbWUsICZyLT5ydV9zdGltZSk7CiAJCQlicmVhazsKKwogCQlkZWZhdWx0OgogCQkJQlVHKCk7CiAJfQorCisJY3B1dGltZV90b190aW1ldmFsKHV0aW1lLCAmci0+cnVfdXRpbWUpOworCWNwdXRpbWVfdG9fdGltZXZhbChzdGltZSwgJnItPnJ1X3N0aW1lKTsKIH0KIAogaW50IGdldHJ1c2FnZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCB3aG8sIHN0cnVjdCBydXNhZ2UgX191c2VyICpydSkKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNfbmkuYyBiL2tlcm5lbC9zeXNfbmkuYwppbmRleCAxYWIyMzcwLi4xNzMxM2I5IDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzX25pLmMKKysrIGIva2VybmVsL3N5c19uaS5jCkBAIC04Miw2ICs4MiwyOCBAQAogY29uZF9zeXNjYWxsKHN5c19pbm90aWZ5X2luaXQpOwogY29uZF9zeXNjYWxsKHN5c19pbm90aWZ5X2FkZF93YXRjaCk7CiBjb25kX3N5c2NhbGwoc3lzX2lub3RpZnlfcm1fd2F0Y2gpOworY29uZF9zeXNjYWxsKHN5c19taWdyYXRlX3BhZ2VzKTsKK2NvbmRfc3lzY2FsbChzeXNfY2hvd24xNik7Citjb25kX3N5c2NhbGwoc3lzX2ZjaG93bjE2KTsKK2NvbmRfc3lzY2FsbChzeXNfZ2V0ZWdpZDE2KTsKK2NvbmRfc3lzY2FsbChzeXNfZ2V0ZXVpZDE2KTsKK2NvbmRfc3lzY2FsbChzeXNfZ2V0Z2lkMTYpOworY29uZF9zeXNjYWxsKHN5c19nZXRncm91cHMxNik7Citjb25kX3N5c2NhbGwoc3lzX2dldHJlc2dpZDE2KTsKK2NvbmRfc3lzY2FsbChzeXNfZ2V0cmVzdWlkMTYpOworY29uZF9zeXNjYWxsKHN5c19nZXR1aWQxNik7Citjb25kX3N5c2NhbGwoc3lzX2xjaG93bjE2KTsKK2NvbmRfc3lzY2FsbChzeXNfc2V0ZnNnaWQxNik7Citjb25kX3N5c2NhbGwoc3lzX3NldGZzdWlkMTYpOworY29uZF9zeXNjYWxsKHN5c19zZXRnaWQxNik7Citjb25kX3N5c2NhbGwoc3lzX3NldGdyb3VwczE2KTsKK2NvbmRfc3lzY2FsbChzeXNfc2V0cmVnaWQxNik7Citjb25kX3N5c2NhbGwoc3lzX3NldHJlc2dpZDE2KTsKK2NvbmRfc3lzY2FsbChzeXNfc2V0cmVzdWlkMTYpOworY29uZF9zeXNjYWxsKHN5c19zZXRyZXVpZDE2KTsKK2NvbmRfc3lzY2FsbChzeXNfc2V0dWlkMTYpOworY29uZF9zeXNjYWxsKHN5c192bTg2b2xkKTsKK2NvbmRfc3lzY2FsbChzeXNfdm04Nik7CiAKIC8qIGFyY2gtc3BlY2lmaWMgd2VhayBzeXNjYWxsIGVudHJpZXMgKi8KIGNvbmRfc3lzY2FsbChzeXNfcGNpY29uZmlnX3JlYWQpOwpAQCAtOTAsMyArMTEyLDUgQEAKIGNvbmRfc3lzY2FsbChzeXMzMl9pcGMpOwogY29uZF9zeXNjYWxsKHN5czMyX3N5c2N0bCk7CiBjb25kX3N5c2NhbGwocHBjX3J0YXMpOworY29uZF9zeXNjYWxsKHN5c19zcHVfcnVuKTsKK2NvbmRfc3lzY2FsbChzeXNfc3B1X2NyZWF0ZSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsLmMgYi9rZXJuZWwvc3lzY3RsLmMKaW5kZXggYTg1MDQ3Yi4uY2I5OWE0MiAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bC5jCisrKyBiL2tlcm5lbC9zeXNjdGwuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KQEAgLTY4LDYgKzY5LDggQEAKIGV4dGVybiBpbnQgcHJpbnRrX3JhdGVsaW1pdF9qaWZmaWVzOwogZXh0ZXJuIGludCBwcmludGtfcmF0ZWxpbWl0X2J1cnN0OwogZXh0ZXJuIGludCBwaWRfbWF4X21pbiwgcGlkX21heF9tYXg7CitleHRlcm4gaW50IHN5c2N0bF9kcm9wX2NhY2hlczsKK2V4dGVybiBpbnQgcGVyY3B1X3BhZ2VsaXN0X2ZyYWN0aW9uOwogCiAjaWYgZGVmaW5lZChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpICYmIGRlZmluZWQoQ09ORklHX1g4NikKIGludCB1bmtub3duX25taV9wYW5pYzsKQEAgLTc4LDYgKzgxLDcgQEAKIC8qIHRoaXMgaXMgbmVlZGVkIGZvciB0aGUgcHJvY19kb2ludHZlY19taW5tYXggZm9yIFtmc19db3ZlcmZsb3cgVUlEIGFuZCBHSUQgKi8KIHN0YXRpYyBpbnQgbWF4b2xkdWlkID0gNjU1MzU7CiBzdGF0aWMgaW50IG1pbm9sZHVpZDsKK3N0YXRpYyBpbnQgbWluX3BlcmNwdV9wYWdlbGlzdF9mcmFjdCA9IDg7CiAKIHN0YXRpYyBpbnQgbmdyb3Vwc19tYXggPSBOR1JPVVBTX01BWDsKIApAQCAtNjQ0LDcgKzY0OCw3IEBACiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKIAl9LAotI2lmIGRlZmluZWQoQ09ORklHX1MzOTApCisjaWYgZGVmaW5lZChDT05GSUdfUzM5MCkgJiYgZGVmaW5lZChDT05GSUdfU01QKQogCXsKIAkJLmN0bF9uYW1lCT0gS0VSTl9TUElOX1JFVFJZLAogCQkucHJvY25hbWUJPSAic3Bpbl9yZXRyeSIsCkBAIC03NzUsNiArNzc5LDE1IEBACiAJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAogCX0sCiAJeworCQkuY3RsX25hbWUJPSBWTV9EUk9QX1BBR0VDQUNIRSwKKwkJLnByb2NuYW1lCT0gImRyb3BfY2FjaGVzIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9kcm9wX2NhY2hlcywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IGRyb3BfY2FjaGVzX3N5c2N0bF9oYW5kbGVyLAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwl9LAorCXsKIAkJLmN0bF9uYW1lCT0gVk1fTUlOX0ZSRUVfS0JZVEVTLAogCQkucHJvY25hbWUJPSAibWluX2ZyZWVfa2J5dGVzIiwKIAkJLmRhdGEJCT0gJm1pbl9mcmVlX2tieXRlcywKQEAgLTc4NCw2ICs3OTcsMTYgQEAKIAkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCiAJCS5leHRyYTEJCT0gJnplcm8sCiAJfSwKKwl7CisJCS5jdGxfbmFtZQk9IFZNX1BFUkNQVV9QQUdFTElTVF9GUkFDVElPTiwKKwkJLnByb2NuYW1lCT0gInBlcmNwdV9wYWdlbGlzdF9mcmFjdGlvbiIsCisJCS5kYXRhCQk9ICZwZXJjcHVfcGFnZWxpc3RfZnJhY3Rpb24sCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHBlcmNwdV9wYWdlbGlzdF9mcmFjdGlvbiksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcGVyY3B1X3BhZ2VsaXN0X2ZyYWN0aW9uX3N5c2N0bF9oYW5kbGVyLAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmbWluX3BlcmNwdV9wYWdlbGlzdF9mcmFjdCwKKwl9LAogI2lmZGVmIENPTkZJR19NTVUKIAl7CiAJCS5jdGxfbmFtZQk9IFZNX01BWF9NQVBfQ09VTlQsCkBAIC04NDcsNiArODcwLDE3IEBACiAJCS5zdHJhdGVneQk9ICZzeXNjdGxfamlmZmllcywKIAl9LAogI2VuZGlmCisjaWZkZWYgQ09ORklHX05VTUEKKwl7CisJCS5jdGxfbmFtZQk9IFZNX1pPTkVfUkVDTEFJTV9NT0RFLAorCQkucHJvY25hbWUJPSAiem9uZV9yZWNsYWltX21vZGUiLAorCQkuZGF0YQkJPSAmem9uZV9yZWNsYWltX21vZGUsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHpvbmVfcmVjbGFpbV9tb2RlKSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCQkuc3RyYXRlZ3kJPSAmemVybywKKwl9LAorI2VuZGlmCiAJeyAuY3RsX25hbWUgPSAwIH0KIH07CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lLmMgYi9rZXJuZWwvdGltZS5jCmluZGV4IGI5NGJmYTguLjc0NzdiMWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lLmMKKysrIGIva2VybmVsL3RpbWUuYwpAQCAtMjksNiArMjksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CkBAIC0xNTQsNiArMTU1LDkgQEAKIAlzdGF0aWMgaW50IGZpcnN0dGltZSA9IDE7CiAJaW50IGVycm9yID0gMDsKIAorCWlmICghdGltZXNwZWNfdmFsaWQodHYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWVycm9yID0gc2VjdXJpdHlfc2V0dGltZSh0diwgdHopOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwpAQCAtNTYxLDI3ICs1NjUsMTA3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChnZXRuc3RpbWVvZmRheSk7CiAjZW5kaWYKIAotdm9pZCBnZXRuc3RpbWVzdGFtcChzdHJ1Y3QgdGltZXNwZWMgKnRzKQorLyogQ29udmVydHMgR3JlZ29yaWFuIGRhdGUgdG8gc2Vjb25kcyBzaW5jZSAxOTcwLTAxLTAxIDAwOjAwOjAwLgorICogQXNzdW1lcyBpbnB1dCBpbiBub3JtYWwgZGF0ZSBmb3JtYXQsIGkuZS4gMTk4MC0xMi0zMSAyMzo1OTo1OQorICogPT4geWVhcj0xOTgwLCBtb249MTIsIGRheT0zMSwgaG91cj0yMywgbWluPTU5LCBzZWM9NTkuCisgKgorICogW0ZvciB0aGUgSnVsaWFuIGNhbGVuZGFyICh3aGljaCB3YXMgdXNlZCBpbiBSdXNzaWEgYmVmb3JlIDE5MTcsCisgKiBCcml0YWluICYgY29sb25pZXMgYmVmb3JlIDE3NTIsIGFueXdoZXJlIGVsc2UgYmVmb3JlIDE1ODIsCisgKiBhbmQgaXMgc3RpbGwgaW4gdXNlIGJ5IHNvbWUgY29tbXVuaXRpZXMpIGxlYXZlIG91dCB0aGUKKyAqIC15ZWFyLzEwMCt5ZWFyLzQwMCB0ZXJtcywgYW5kIGFkZCAxMC5dCisgKgorICogVGhpcyBhbGdvcml0aG0gd2FzIGZpcnN0IHB1Ymxpc2hlZCBieSBHYXVzcyAoSSB0aGluaykuCisgKgorICogV0FSTklORzogdGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJmbG93IG9uIDIxMDYtMDItMDcgMDY6Mjg6MTYgb24KKyAqIG1hY2hpbmVzIHdlcmUgbG9uZyBpcyAzMi1iaXQhIChIb3dldmVyLCBhcyB0aW1lX3QgaXMgc2lnbmVkLCB3ZQorICogd2lsbCBhbHJlYWR5IGdldCBwcm9ibGVtcyBhdCBvdGhlciBwbGFjZXMgb24gMjAzOC0wMS0xOSAwMzoxNDowOCkKKyAqLwordW5zaWduZWQgbG9uZworbWt0aW1lKGNvbnN0IHVuc2lnbmVkIGludCB5ZWFyMCwgY29uc3QgdW5zaWduZWQgaW50IG1vbjAsCisgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGRheSwgY29uc3QgdW5zaWduZWQgaW50IGhvdXIsCisgICAgICAgY29uc3QgdW5zaWduZWQgaW50IG1pbiwgY29uc3QgdW5zaWduZWQgaW50IHNlYykKIHsKLQl1bnNpZ25lZCBpbnQgc2VxOwotCXN0cnVjdCB0aW1lc3BlYyB3YWxsMm1vbm87CisJdW5zaWduZWQgaW50IG1vbiA9IG1vbjAsIHllYXIgPSB5ZWFyMDsKIAotCS8qIHN5bmNocm9uaXplIHdpdGggc2V0dGltZW9mZGF5KCkgY2hhbmdlcyAqLwotCWRvIHsKLQkJc2VxID0gcmVhZF9zZXFiZWdpbigmeHRpbWVfbG9jayk7Ci0JCWdldG5zdGltZW9mZGF5KHRzKTsKLQkJd2FsbDJtb25vID0gd2FsbF90b19tb25vdG9uaWM7Ci0JfSB3aGlsZSh1bmxpa2VseShyZWFkX3NlcXJldHJ5KCZ4dGltZV9sb2NrLCBzZXEpKSk7Ci0KLQkvKiBhZGp1c3QgdG8gbW9ub3RvbmljYWx5LWluY3JlYXNpbmcgdmFsdWVzICovCi0JdHMtPnR2X3NlYyArPSB3YWxsMm1vbm8udHZfc2VjOwotCXRzLT50dl9uc2VjICs9IHdhbGwybW9uby50dl9uc2VjOwotCXdoaWxlICh1bmxpa2VseSh0cy0+dHZfbnNlYyA+PSBOU0VDX1BFUl9TRUMpKSB7Ci0JCXRzLT50dl9uc2VjIC09IE5TRUNfUEVSX1NFQzsKLQkJdHMtPnR2X3NlYysrOworCS8qIDEuLjEyIC0+IDExLDEyLDEuLjEwICovCisJaWYgKDAgPj0gKGludCkgKG1vbiAtPSAyKSkgeworCQltb24gKz0gMTI7CS8qIFB1dHMgRmViIGxhc3Qgc2luY2UgaXQgaGFzIGxlYXAgZGF5ICovCisJCXllYXIgLT0gMTsKIAl9CisKKwlyZXR1cm4gKCgoKHVuc2lnbmVkIGxvbmcpCisJCSAgKHllYXIvNCAtIHllYXIvMTAwICsgeWVhci80MDAgKyAzNjcqbW9uLzEyICsgZGF5KSArCisJCSAgeWVhciozNjUgLSA3MTk0OTkKKwkgICAgKSoyNCArIGhvdXIgLyogbm93IGhhdmUgaG91cnMgKi8KKwkgICkqNjAgKyBtaW4gLyogbm93IGhhdmUgbWludXRlcyAqLworCSkqNjAgKyBzZWM7IC8qIGZpbmFsbHkgc2Vjb25kcyAqLwogfQotRVhQT1JUX1NZTUJPTF9HUEwoZ2V0bnN0aW1lc3RhbXApOworCitFWFBPUlRfU1lNQk9MKG1rdGltZSk7CisKKy8qKgorICogc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMgLSBzZXQgdGltZXNwZWMgc2VjIGFuZCBuc2VjIHBhcnRzIGFuZCBub3JtYWxpemUKKyAqCisgKiBAdHM6CQlwb2ludGVyIHRvIHRpbWVzcGVjIHZhcmlhYmxlIHRvIGJlIHNldAorICogQHNlYzoJc2Vjb25kcyB0byBzZXQKKyAqIEBuc2VjOgluYW5vc2Vjb25kcyB0byBzZXQKKyAqCisgKiBTZXQgc2Vjb25kcyBhbmQgbmFub3NlY29uZHMgZmllbGQgb2YgYSB0aW1lc3BlYyB2YXJpYWJsZSBhbmQKKyAqIG5vcm1hbGl6ZSB0byB0aGUgdGltZXNwZWMgc3RvcmFnZSBmb3JtYXQKKyAqCisgKiBOb3RlOiBUaGUgdHZfbnNlYyBwYXJ0IGlzIGFsd2F5cyBpbiB0aGUgcmFuZ2Ugb2YKKyAqIAkwIDw9IHR2X25zZWMgPCBOU0VDX1BFUl9TRUMKKyAqIEZvciBuZWdhdGl2ZSB2YWx1ZXMgb25seSB0aGUgdHZfc2VjIGZpZWxkIGlzIG5lZ2F0aXZlICEKKyAqLwordm9pZCBzZXRfbm9ybWFsaXplZF90aW1lc3BlYyhzdHJ1Y3QgdGltZXNwZWMgKnRzLCB0aW1lX3Qgc2VjLCBsb25nIG5zZWMpCit7CisJd2hpbGUgKG5zZWMgPj0gTlNFQ19QRVJfU0VDKSB7CisJCW5zZWMgLT0gTlNFQ19QRVJfU0VDOworCQkrK3NlYzsKKwl9CisJd2hpbGUgKG5zZWMgPCAwKSB7CisJCW5zZWMgKz0gTlNFQ19QRVJfU0VDOworCQktLXNlYzsKKwl9CisJdHMtPnR2X3NlYyA9IHNlYzsKKwl0cy0+dHZfbnNlYyA9IG5zZWM7Cit9CisKKy8qKgorICogbnNfdG9fdGltZXNwZWMgLSBDb252ZXJ0IG5hbm9zZWNvbmRzIHRvIHRpbWVzcGVjCisgKiBAbnNlYzogICAgICAgdGhlIG5hbm9zZWNvbmRzIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybnMgdGhlIHRpbWVzcGVjIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBuc2VjIHBhcmFtZXRlci4KKyAqLworaW5saW5lIHN0cnVjdCB0aW1lc3BlYyBuc190b190aW1lc3BlYyhjb25zdCBuc2VjX3QgbnNlYykKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisKKwlpZiAobnNlYykKKwkJdHMudHZfc2VjID0gZGl2X2xvbmdfbG9uZ19yZW1fc2lnbmVkKG5zZWMsIE5TRUNfUEVSX1NFQywKKwkJCQkJCSAgICAgJnRzLnR2X25zZWMpOworCWVsc2UKKwkJdHMudHZfc2VjID0gdHMudHZfbnNlYyA9IDA7CisKKwlyZXR1cm4gdHM7Cit9CisKKy8qKgorICogbnNfdG9fdGltZXZhbCAtIENvbnZlcnQgbmFub3NlY29uZHMgdG8gdGltZXZhbAorICogQG5zZWM6ICAgICAgIHRoZSBuYW5vc2Vjb25kcyB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm5zIHRoZSB0aW1ldmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBuc2VjIHBhcmFtZXRlci4KKyAqLworc3RydWN0IHRpbWV2YWwgbnNfdG9fdGltZXZhbChjb25zdCBuc2VjX3QgbnNlYykKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHMgPSBuc190b190aW1lc3BlYyhuc2VjKTsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKworCXR2LnR2X3NlYyA9IHRzLnR2X3NlYzsKKwl0di50dl91c2VjID0gKHN1c2Vjb25kc190KSB0cy50dl9uc2VjIC8gMTAwMDsKKworCXJldHVybiB0djsKK30KIAogI2lmIChCSVRTX1BFUl9MT05HIDwgNjQpCiB1NjQgZ2V0X2ppZmZpZXNfNjQodm9pZCkKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lci5jIGIva2VybmVsL3RpbWVyLmMKaW5kZXggZmQ3NDI2OC4uNGYxY2IwYSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWVyLmMKKysrIGIva2VybmVsL3RpbWVyLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wb3NpeC10aW1lcnMuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KQEAgLTg1Nyw2ICs4NTgsNyBAQAogewogCXR2ZWNfYmFzZV90ICpiYXNlID0gJl9fZ2V0X2NwdV92YXIodHZlY19iYXNlcyk7CiAKKyAJaHJ0aW1lcl9ydW5fcXVldWVzKCk7CiAJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgYmFzZS0+dGltZXJfamlmZmllcykpCiAJCV9fcnVuX3RpbWVycyhiYXNlKTsKIH0KQEAgLTExMTgsNjIgKzExMjAsNiBAQAogCXJldHVybiBjdXJyZW50LT5waWQ7CiB9CiAKLXN0YXRpYyBsb25nIF9fc2NoZWQgbmFub3NsZWVwX3Jlc3RhcnQoc3RydWN0IHJlc3RhcnRfYmxvY2sgKnJlc3RhcnQpCi17Ci0JdW5zaWduZWQgbG9uZyBleHBpcmUgPSByZXN0YXJ0LT5hcmcwLCBub3cgPSBqaWZmaWVzOwotCXN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnJtdHAgPSAoc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKSByZXN0YXJ0LT5hcmcxOwotCWxvbmcgcmV0OwotCi0JLyogRGlkIGl0IGV4cGlyZSB3aGlsZSB3ZSBoYW5kbGVkIHNpZ25hbHM/ICovCi0JaWYgKCF0aW1lX2FmdGVyKGV4cGlyZSwgbm93KSkKLQkJcmV0dXJuIDA7Ci0KLQlleHBpcmUgPSBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoZXhwaXJlIC0gbm93KTsKLQotCXJldCA9IDA7Ci0JaWYgKGV4cGlyZSkgewotCQlzdHJ1Y3QgdGltZXNwZWMgdDsKLQkJamlmZmllc190b190aW1lc3BlYyhleHBpcmUsICZ0KTsKLQotCQlyZXQgPSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLOwotCQlpZiAocm10cCAmJiBjb3B5X3RvX3VzZXIocm10cCwgJnQsIHNpemVvZih0KSkpCi0JCQlyZXQgPSAtRUZBVUxUOwotCQkvKiBUaGUgJ3Jlc3RhcnQnIGJsb2NrIGlzIGFscmVhZHkgZmlsbGVkIGluICovCi0JfQotCXJldHVybiByZXQ7Ci19Ci0KLWFzbWxpbmthZ2UgbG9uZyBzeXNfbmFub3NsZWVwKHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnJxdHAsIHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnJtdHApCi17Ci0Jc3RydWN0IHRpbWVzcGVjIHQ7Ci0JdW5zaWduZWQgbG9uZyBleHBpcmU7Ci0JbG9uZyByZXQ7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnQsIHJxdHAsIHNpemVvZih0KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKCh0LnR2X25zZWMgPj0gMTAwMDAwMDAwMEwpIHx8ICh0LnR2X25zZWMgPCAwKSB8fCAodC50dl9zZWMgPCAwKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlleHBpcmUgPSB0aW1lc3BlY190b19qaWZmaWVzKCZ0KSArICh0LnR2X3NlYyB8fCB0LnR2X25zZWMpOwotCWV4cGlyZSA9IHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShleHBpcmUpOwotCi0JcmV0ID0gMDsKLQlpZiAoZXhwaXJlKSB7Ci0JCXN0cnVjdCByZXN0YXJ0X2Jsb2NrICpyZXN0YXJ0OwotCQlqaWZmaWVzX3RvX3RpbWVzcGVjKGV4cGlyZSwgJnQpOwotCQlpZiAocm10cCAmJiBjb3B5X3RvX3VzZXIocm10cCwgJnQsIHNpemVvZih0KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlyZXN0YXJ0ID0gJmN1cnJlbnRfdGhyZWFkX2luZm8oKS0+cmVzdGFydF9ibG9jazsKLQkJcmVzdGFydC0+Zm4gPSBuYW5vc2xlZXBfcmVzdGFydDsKLQkJcmVzdGFydC0+YXJnMCA9IGppZmZpZXMgKyBleHBpcmU7Ci0JCXJlc3RhcnQtPmFyZzEgPSAodW5zaWduZWQgbG9uZykgcm10cDsKLQkJcmV0ID0gLUVSRVNUQVJUX1JFU1RBUlRCTE9DSzsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQogLyoKICAqIHN5c19zeXNpbmZvIC0gZmlsbCBpbiBzeXNpbmZvIHN0cnVjdAogICovIApkaWZmIC0tZ2l0IGEva2VybmVsL3VpZDE2LmMgYi9rZXJuZWwvdWlkMTYuYwppbmRleCBmNjY5OTQxLi5hYTI1NjA1IDEwMDY0NAotLS0gYS9rZXJuZWwvdWlkMTYuYworKysgYi9rZXJuZWwvdWlkMTYuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvcHJjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3dvcmtxdWV1ZS5jIGIva2VybmVsL3dvcmtxdWV1ZS5jCmluZGV4IDJiZDVhZWUuLmIwNTJlMmMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC93b3JrcXVldWUuYworKysgYi9rZXJuZWwvd29ya3F1ZXVlLmMKQEAgLTI5LDcgKzI5LDggQEAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAKIC8qCi0gKiBUaGUgcGVyLUNQVSB3b3JrcXVldWUgKGlmIHNpbmdsZSB0aHJlYWQsIHdlIGFsd2F5cyB1c2UgY3B1IDAncykuCisgKiBUaGUgcGVyLUNQVSB3b3JrcXVldWUgKGlmIHNpbmdsZSB0aHJlYWQsIHdlIGFsd2F5cyB1c2UgdGhlIGZpcnN0CisgKiBwb3NzaWJsZSBjcHUpLgogICoKICAqIFRoZSBzZXF1ZW5jZSBjb3VudGVycyBhcmUgZm9yIGZsdXNoX3NjaGVkdWxlZF93b3JrKCkuICBJdCB3YW50cyB0byB3YWl0CiAgKiB1bnRpbCB1bnRpbCBhbGwgY3VycmVudGx5LXNjaGVkdWxlZCB3b3JrcyBhcmUgY29tcGxldGVkLCBidXQgaXQgZG9lc24ndApAQCAtNjksNiArNzAsOCBAQAogc3RhdGljIERFRklORV9TUElOTE9DSyh3b3JrcXVldWVfbG9jayk7CiBzdGF0aWMgTElTVF9IRUFEKHdvcmtxdWV1ZXMpOwogCitzdGF0aWMgaW50IHNpbmdsZXRocmVhZF9jcHU7CisKIC8qIElmIGl0J3Mgc2luZ2xlIHRocmVhZGVkLCBpdCBpc24ndCBpbiB0aGUgbGlzdCBvZiB3b3JrcXVldWVzLiAqLwogc3RhdGljIGlubGluZSBpbnQgaXNfc2luZ2xlX3RocmVhZGVkKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSkKIHsKQEAgLTEwMiw3ICsxMDUsNyBAQAogCiAJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KDAsICZ3b3JrLT5wZW5kaW5nKSkgewogCQlpZiAodW5saWtlbHkoaXNfc2luZ2xlX3RocmVhZGVkKHdxKSkpCi0JCQljcHUgPSBhbnlfb25saW5lX2NwdShjcHVfb25saW5lX21hcCk7CisJCQljcHUgPSBzaW5nbGV0aHJlYWRfY3B1OwogCQlCVUdfT04oIWxpc3RfZW1wdHkoJndvcmstPmVudHJ5KSk7CiAJCV9fcXVldWVfd29yayhwZXJfY3B1X3B0cih3cS0+Y3B1X3dxLCBjcHUpLCB3b3JrKTsKIAkJcmV0ID0gMTsKQEAgLTExOCw3ICsxMjEsNyBAQAogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAlpZiAodW5saWtlbHkoaXNfc2luZ2xlX3RocmVhZGVkKHdxKSkpCi0JCWNwdSA9IGFueV9vbmxpbmVfY3B1KGNwdV9vbmxpbmVfbWFwKTsKKwkJY3B1ID0gc2luZ2xldGhyZWFkX2NwdTsKIAogCV9fcXVldWVfd29yayhwZXJfY3B1X3B0cih3cS0+Y3B1X3dxLCBjcHUpLCB3b3JrKTsKIH0KQEAgLTE0NCw3ICsxNDcsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBydW5fd29ya3F1ZXVlKHN0cnVjdCBjcHVfd29ya3F1ZXVlX3N0cnVjdCAqY3dxKQorc3RhdGljIHZvaWQgcnVuX3dvcmtxdWV1ZShzdHJ1Y3QgY3B1X3dvcmtxdWV1ZV9zdHJ1Y3QgKmN3cSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0yNjcsNyArMjcwLDcgQEAKIAogCWlmIChpc19zaW5nbGVfdGhyZWFkZWQod3EpKSB7CiAJCS8qIEFsd2F5cyB1c2UgZmlyc3QgY3B1J3MgYXJlYS4gKi8KLQkJZmx1c2hfY3B1X3dvcmtxdWV1ZShwZXJfY3B1X3B0cih3cS0+Y3B1X3dxLCBhbnlfb25saW5lX2NwdShjcHVfb25saW5lX21hcCkpKTsKKwkJZmx1c2hfY3B1X3dvcmtxdWV1ZShwZXJfY3B1X3B0cih3cS0+Y3B1X3dxLCBzaW5nbGV0aHJlYWRfY3B1KSk7CiAJfSBlbHNlIHsKIAkJaW50IGNwdTsKIApAQCAtMzE1LDEyICszMTgsMTcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAl3cS0+Y3B1X3dxID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBjcHVfd29ya3F1ZXVlX3N0cnVjdCk7CisJaWYgKCF3cS0+Y3B1X3dxKSB7CisJCWtmcmVlKHdxKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCiAJd3EtPm5hbWUgPSBuYW1lOwogCS8qIFdlIGRvbid0IG5lZWQgdGhlIGRpc3RyYWN0aW9uIG9mIENQVXMgYXBwZWFyaW5nIGFuZCB2YW5pc2hpbmcuICovCiAJbG9ja19jcHVfaG90cGx1ZygpOwogCWlmIChzaW5nbGV0aHJlYWQpIHsKIAkJSU5JVF9MSVNUX0hFQUQoJndxLT5saXN0KTsKLQkJcCA9IGNyZWF0ZV93b3JrcXVldWVfdGhyZWFkKHdxLCBhbnlfb25saW5lX2NwdShjcHVfb25saW5lX21hcCkpOworCQlwID0gY3JlYXRlX3dvcmtxdWV1ZV90aHJlYWQod3EsIHNpbmdsZXRocmVhZF9jcHUpOwogCQlpZiAoIXApCiAJCQlkZXN0cm95ID0gMTsKIAkJZWxzZQpAQCAtMzc0LDcgKzM4Miw3IEBACiAJLyogV2UgZG9uJ3QgbmVlZCB0aGUgZGlzdHJhY3Rpb24gb2YgQ1BVcyBhcHBlYXJpbmcgYW5kIHZhbmlzaGluZy4gKi8KIAlsb2NrX2NwdV9ob3RwbHVnKCk7CiAJaWYgKGlzX3NpbmdsZV90aHJlYWRlZCh3cSkpCi0JCWNsZWFudXBfd29ya3F1ZXVlX3RocmVhZCh3cSwgYW55X29ubGluZV9jcHUoY3B1X29ubGluZV9tYXApKTsKKwkJY2xlYW51cF93b3JrcXVldWVfdGhyZWFkKHdxLCBzaW5nbGV0aHJlYWRfY3B1KTsKIAllbHNlIHsKIAkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCiAJCQljbGVhbnVwX3dvcmtxdWV1ZV90aHJlYWQod3EsIGNwdSk7CkBAIC00MTksNiArNDI3LDI1IEBACiAJcmV0dXJuIHJldDsKIH0KIAoraW50IHNjaGVkdWxlX29uX2VhY2hfY3B1KHZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbyksIHZvaWQgKmluZm8pCit7CisJaW50IGNwdTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcms7CisKKwl3b3JrID0ga21hbGxvYyhOUl9DUFVTICogc2l6ZW9mKHN0cnVjdCB3b3JrX3N0cnVjdCksIEdGUF9LRVJORUwpOworCisJaWYgKCF3b3JrKQorCQlyZXR1cm4gLUVOT01FTTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlJTklUX1dPUksod29yayArIGNwdSwgZnVuYywgaW5mbyk7CisJCV9fcXVldWVfd29yayhwZXJfY3B1X3B0cihrZXZlbnRkX3dxLT5jcHVfd3EsIGNwdSksCisJCQkJd29yayArIGNwdSk7CisJfQorCWZsdXNoX3dvcmtxdWV1ZShrZXZlbnRkX3dxKTsKKwlrZnJlZSh3b3JrKTsKKwlyZXR1cm4gMDsKK30KKwogdm9pZCBmbHVzaF9zY2hlZHVsZWRfd29yayh2b2lkKQogewogCWZsdXNoX3dvcmtxdWV1ZShrZXZlbnRkX3dxKTsKQEAgLTU0Myw2ICs1NzAsNyBAQAogCiB2b2lkIGluaXRfd29ya3F1ZXVlcyh2b2lkKQogeworCXNpbmdsZXRocmVhZF9jcHUgPSBmaXJzdF9jcHUoY3B1X3Bvc3NpYmxlX21hcCk7CiAJaG90Y3B1X25vdGlmaWVyKHdvcmtxdWV1ZV9jcHVfY2FsbGJhY2ssIDApOwogCWtldmVudGRfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJldmVudHMiKTsKIAlCVUdfT04oIWtldmVudGRfd3EpOwpkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcuZGVidWcgYi9saWIvS2NvbmZpZy5kZWJ1ZwppbmRleCA4MDU5OGNmLi5hMzE0ZTY2IDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZy5kZWJ1ZworKysgYi9saWIvS2NvbmZpZy5kZWJ1ZwpAQCAtOSwxNSArOSw5IEBACiAJICBpbiBrZXJuZWwgc3RhcnR1cC4KIAogCi1jb25maWcgREVCVUdfS0VSTkVMCi0JYm9vbCAiS2VybmVsIGRlYnVnZ2luZyIKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgZGV2ZWxvcGluZyBkcml2ZXJzIG9yIHRyeWluZyB0byBkZWJ1ZyBhbmQKLQkgIGlkZW50aWZ5IGtlcm5lbCBwcm9ibGVtcy4KLQogY29uZmlnIE1BR0lDX1NZU1JRCiAJYm9vbCAiTWFnaWMgU3lzUnEga2V5IgotCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmICFVTUwKKwlkZXBlbmRzIG9uICFVTUwKIAloZWxwCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgaGF2ZSBzb21lIGNvbnRyb2wgb3ZlciB0aGUgc3lzdGVtIGV2ZW4KIAkgIGlmIHRoZSBzeXN0ZW0gY3Jhc2hlcyBmb3IgZXhhbXBsZSBkdXJpbmcga2VybmVsIGRlYnVnZ2luZyAoZS5nLiwgeW91CkBAIC0yOSw2ICsyMywxMiBAQAogCSAga2V5cyBhcmUgZG9jdW1lbnRlZCBpbiA8ZmlsZTpEb2N1bWVudGF0aW9uL3N5c3JxLnR4dD4uIERvbid0IHNheSBZCiAJICB1bmxlc3MgeW91IHJlYWxseSBrbm93IHdoYXQgdGhpcyBoYWNrIGRvZXMuCiAKK2NvbmZpZyBERUJVR19LRVJORUwKKwlib29sICJLZXJuZWwgZGVidWdnaW5nIgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSBkZXZlbG9waW5nIGRyaXZlcnMgb3IgdHJ5aW5nIHRvIGRlYnVnIGFuZAorCSAgaWRlbnRpZnkga2VybmVsIHByb2JsZW1zLgorCiBjb25maWcgTE9HX0JVRl9TSElGVAogCWludCAiS2VybmVsIGxvZyBidWZmZXIgc2l6ZSAoMTYgPT4gNjRLQiwgMTcgPT4gMTI4S0IpIiBpZiBERUJVR19LRVJORUwKIAlyYW5nZSAxMiAyMQpAQCAtNzksNyArNzksNyBAQAogCiBjb25maWcgREVCVUdfU0xBQgogCWJvb2wgIkRlYnVnIG1lbW9yeSBhbGxvY2F0aW9ucyIKLQlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmIFNMQUIKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGhhdmUgdGhlIGtlcm5lbCBkbyBsaW1pdGVkIHZlcmlmaWNhdGlvbiBvbiBtZW1vcnkKIAkgIGFsbG9jYXRpb24gYXMgd2VsbCBhcyBwb2lzb25pbmcgbWVtb3J5IG9uIGZyZWUgdG8gY2F0Y2ggdXNlIG9mIGZyZWVkCkBAIC05NSw2ICs5NSwxNCBAQAogCSAgaWYga2VybmVsIGNvZGUgdXNlcyBpdCBpbiBhIHByZWVtcHRpb24tdW5zYWZlIHdheS4gQWxzbywgdGhlIGtlcm5lbAogCSAgd2lsbCBkZXRlY3QgcHJlZW1wdGlvbiBjb3VudCB1bmRlcmZsb3dzLgogCitjb25maWcgREVCVUdfTVVURVhFUworCWJvb2wgIk11dGV4IGRlYnVnZ2luZywgZGVhZGxvY2sgZGV0ZWN0aW9uIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJaGVscAorCSBUaGlzIGFsbG93cyBtdXRleCBzZW1hbnRpY3MgdmlvbGF0aW9ucyBhbmQgbXV0ZXggcmVsYXRlZCBkZWFkbG9ja3MKKwkgKGxvY2t1cHMpIHRvIGJlIGRldGVjdGVkIGFuZCByZXBvcnRlZCBhdXRvbWF0aWNhbGx5LgorCiBjb25maWcgREVCVUdfU1BJTkxPQ0sKIAlib29sICJTcGlubG9jayBkZWJ1Z2dpbmciCiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKQEAgLTE4Nyw2ICsxOTUsMjAgQEAKIAkgIHNvbWUgYXJjaGl0ZWN0dXJlcyBvciBpZiB5b3UgdXNlIGV4dGVybmFsIGRlYnVnZ2Vycy4KIAkgIElmIHlvdSBkb24ndCBkZWJ1ZyB0aGUga2VybmVsLCB5b3UgY2FuIHNheSBOLgogCitjb25maWcgRk9SQ0VEX0lOTElOSU5HCisJYm9vbCAiRm9yY2UgZ2NjIHRvIGlubGluZSBmdW5jdGlvbnMgbWFya2VkICdpbmxpbmUnIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBvcHRpb24gZGV0ZXJtaW5lcyBpZiB0aGUga2VybmVsIGZvcmNlcyBnY2MgdG8gaW5saW5lIHRoZSBmdW5jdGlvbnMKKwkgIGRldmVsb3BlcnMgaGF2ZSBtYXJrZWQgJ2lubGluZScuIERvaW5nIHNvIHRha2VzIGF3YXkgZnJlZWRvbSBmcm9tIGdjYyB0bworCSAgZG8gd2hhdCBpdCB0aGlua3MgaXMgYmVzdCwgd2hpY2ggaXMgZGVzaXJhYmxlIGZvciB0aGUgZ2NjIDMueCBzZXJpZXMgb2YKKwkgIGNvbXBpbGVycy4gVGhlIGdjYyA0Lnggc2VyaWVzIGhhdmUgYSByZXdyaXR0ZW4gaW5saW5pbmcgYWxnb3JpdGhtIGFuZAorCSAgZGlzYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgZ2VuZXJhdGUgYSBzbWFsbGVyIGtlcm5lbCB0aGVyZS4gSG9wZWZ1bGx5CisJICB0aGlzIGFsZ29yaXRobSBpcyBzbyBnb29kIHRoYXQgYWxsb3dpbmcgZ2NjNCB0byBtYWtlIHRoZSBkZWNpc2lvbiBjYW4KKwkgIGJlY29tZSB0aGUgZGVmYXVsdCBpbiB0aGUgZnV0dXJlLCB1bnRpbCB0aGVuIHRoaXMgb3B0aW9uIGlzIHRoZXJlIHRvCisJICB0ZXN0IGdjYyBmb3IgdGhpcy4KKwogY29uZmlnIFJDVV9UT1JUVVJFX1RFU1QKIAl0cmlzdGF0ZSAidG9ydHVyZSB0ZXN0cyBmb3IgUkNVIgogCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCmRpZmYgLS1naXQgYS9saWIvYml0bWFwLmMgYi9saWIvYml0bWFwLmMKaW5kZXggMjNkM2IxMS4uNDhlNzA4MyAxMDA2NDQKLS0tIGEvbGliL2JpdG1hcC5jCisrKyBiL2xpYi9iaXRtYXAuYwpAQCAtNTE5LDcgKzUxOSw3IEBACiAgKgogICogTWFwIHRoZSBiaXQgYXQgcG9zaXRpb24gQHBvcyBpbiBAYnVmIChvZiBsZW5ndGggQGJpdHMpIHRvIHRoZQogICogb3JkaW5hbCBvZiB3aGljaCBzZXQgYml0IGl0IGlzLiAgSWYgaXQgaXMgbm90IHNldCBvciBpZiBAcG9zCi0gKiBpcyBub3QgYSB2YWxpZCBiaXQgcG9zaXRpb24sIG1hcCB0byB6ZXJvICgwKS4KKyAqIGlzIG5vdCBhIHZhbGlkIGJpdCBwb3NpdGlvbiwgbWFwIHRvIC0xLgogICoKICAqIElmIGZvciBleGFtcGxlLCBqdXN0IGJpdHMgNCB0aHJvdWdoIDcgYXJlIHNldCBpbiBAYnVmLCB0aGVuIEBwb3MKICAqIHZhbHVlcyA0IHRocm91Z2ggNyB3aWxsIGdldCBtYXBwZWQgdG8gMCB0aHJvdWdoIDMsIHJlc3BlY3RpdmVseSwKQEAgLTUzMSwxOCArNTMxLDE5IEBACiAgKi8KIHN0YXRpYyBpbnQgYml0bWFwX3Bvc190b19vcmQoY29uc3QgdW5zaWduZWQgbG9uZyAqYnVmLCBpbnQgcG9zLCBpbnQgYml0cykKIHsKLQlpbnQgb3JkID0gMDsKKwlpbnQgaSwgb3JkOwogCi0JaWYgKHBvcyA+PSAwICYmIHBvcyA8IGJpdHMpIHsKLQkJaW50IGk7CisJaWYgKHBvcyA8IDAgfHwgcG9zID49IGJpdHMgfHwgIXRlc3RfYml0KHBvcywgYnVmKSkKKwkJcmV0dXJuIC0xOwogCi0JCWZvciAoaSA9IGZpbmRfZmlyc3RfYml0KGJ1ZiwgYml0cyk7Ci0JCSAgICAgaSA8IHBvczsKLQkJICAgICBpID0gZmluZF9uZXh0X2JpdChidWYsIGJpdHMsIGkgKyAxKSkKLQkgICAgIAkJb3JkKys7Ci0JCWlmIChpID4gcG9zKQotCQkJb3JkID0gMDsKKwlpID0gZmluZF9maXJzdF9iaXQoYnVmLCBiaXRzKTsKKwlvcmQgPSAwOworCXdoaWxlIChpIDwgcG9zKSB7CisJCWkgPSBmaW5kX25leHRfYml0KGJ1ZiwgYml0cywgaSArIDEpOworCSAgICAgCW9yZCsrOwogCX0KKwlCVUdfT04oaSAhPSBwb3MpOworCiAJcmV0dXJuIG9yZDsKIH0KIApAQCAtNTUzLDExICs1NTQsMTIgQEAKICAqCUBiaXRzOiBudW1iZXIgb2YgdmFsaWQgYml0IHBvc2l0aW9ucyBpbiBAYnVmCiAgKgogICogTWFwIHRoZSBvcmRpbmFsIG9mZnNldCBvZiBiaXQgQG9yZCBpbiBAYnVmIHRvIGl0cyBwb3NpdGlvbiBpbiBAYnVmLgotICogSWYgQG9yZCBpcyBub3QgdGhlIG9yZGluYWwgb2Zmc2V0IG9mIGEgc2V0IGJpdCBpbiBAYnVmLCBtYXAgdG8gemVybyAoMCkuCisgKiBWYWx1ZSBvZiBAb3JkIHNob3VsZCBiZSBpbiByYW5nZSAwIDw9IEBvcmQgPCB3ZWlnaHQoYnVmKSwgZWxzZQorICogcmVzdWx0cyBhcmUgdW5kZWZpbmVkLgogICoKICAqIElmIGZvciBleGFtcGxlLCBqdXN0IGJpdHMgNCB0aHJvdWdoIDcgYXJlIHNldCBpbiBAYnVmLCB0aGVuIEBvcmQKICAqIHZhbHVlcyAwIHRocm91Z2ggMyB3aWxsIGdldCBtYXBwZWQgdG8gNCB0aHJvdWdoIDcsIHJlc3BlY3RpdmVseSwKLSAqIGFuZCBhbGwgb3RoZXIgQG9yZCB2YWx1ZHMgd2lsbCBnZXQgbWFwcGVkIHRvIDAuICBXaGVuIEBvcmQgdmFsdWUgMworICogYW5kIGFsbCBvdGhlciBAb3JkIHZhbHVlcyByZXR1cm4gdW5kZWZpbmVkIHZhbHVlcy4gIFdoZW4gQG9yZCB2YWx1ZSAzCiAgKiBnZXRzIG1hcHBlZCB0byAocmV0dXJucykgQHBvcyB2YWx1ZSA3IGluIHRoaXMgZXhhbXBsZSwgdGhhdCBtZWFucwogICogdGhhdCB0aGUgM3JkIHNldCBiaXQgKHN0YXJ0aW5nIHdpdGggMHRoKSBpcyBhdCBwb3NpdGlvbiA3IGluIEBidWYuCiAgKgpAQCAtNTgzLDggKzU4NSw4IEBACiAKIC8qKgogICogYml0bWFwX3JlbWFwIC0gQXBwbHkgbWFwIGRlZmluZWQgYnkgYSBwYWlyIG9mIGJpdG1hcHMgdG8gYW5vdGhlciBiaXRtYXAKLSAqCUBzcmM6IHN1YnNldCB0byBiZSByZW1hcHBlZAogICoJQGRzdDogcmVtYXBwZWQgcmVzdWx0CisgKglAc3JjOiBzdWJzZXQgdG8gYmUgcmVtYXBwZWQKICAqCUBvbGQ6IGRlZmluZXMgZG9tYWluIG9mIG1hcAogICoJQG5ldzogZGVmaW5lcyByYW5nZSBvZiBtYXAKICAqCUBiaXRzOiBudW1iZXIgb2YgYml0cyBpbiBlYWNoIG9mIHRoZXNlIGJpdG1hcHMKQEAgLTU5Niw0OSArNTk4LDQyIEBACiAgKiB3ZWlnaHQgb2YgQG9sZCwgbWFwIHRoZSBwb3NpdGlvbiBvZiB0aGUgbi10aCBzZXQgYml0IGluIEBvbGQgdG8KICAqIHRoZSBwb3NpdGlvbiBvZiB0aGUgbS10aCBzZXQgYml0IGluIEBuZXcsIHdoZXJlIG0gPT0gbiAlIHcuCiAgKgotICogSWYgZWl0aGVyIG9mIHRoZSBAb2xkIGFuZCBAbmV3IGJpdG1hcHMgYXJlIGVtcHR5LCBvciBpZkBzcmMgYW5kIEBkc3QKLSAqIHBvaW50IHRvIHRoZSBzYW1lIGxvY2F0aW9uLCB0aGVuIHRoaXMgcm91dGluZSBkb2VzIG5vdGhpbmcuCisgKiBJZiBlaXRoZXIgb2YgdGhlIEBvbGQgYW5kIEBuZXcgYml0bWFwcyBhcmUgZW1wdHksIG9yIGlmIEBzcmMgYW5kCisgKiBAZHN0IHBvaW50IHRvIHRoZSBzYW1lIGxvY2F0aW9uLCB0aGVuIHRoaXMgcm91dGluZSBjb3BpZXMgQHNyYworICogdG8gQGRzdC4KICAqCi0gKiBUaGUgcG9zaXRpb25zIG9mIHVuc2V0IGJpdHMgaW4gQG9sZCBhcmUgbWFwcGVkIHRvIHRoZSBwb3NpdGlvbiBvZgotICogdGhlIGZpcnN0IHNldCBiaXQgaW4gQG5ldy4KKyAqIFRoZSBwb3NpdGlvbnMgb2YgdW5zZXQgYml0cyBpbiBAb2xkIGFyZSBtYXBwZWQgdG8gdGhlbXNlbHZlcworICogKHRoZSBpZGVudGlmeSBtYXApLgogICoKICAqIEFwcGx5IHRoZSBhYm92ZSBzcGVjaWZpZWQgbWFwcGluZyB0byBAc3JjLCBwbGFjaW5nIHRoZSByZXN1bHQgaW4KICAqIEBkc3QsIGNsZWFyaW5nIGFueSBiaXRzIHByZXZpb3VzbHkgc2V0IGluIEBkc3QuCiAgKgotICogVGhlIHJlc3VsdGluZyB2YWx1ZSBvZiBAZHN0IHdpbGwgaGF2ZSBlaXRoZXIgdGhlIHNhbWUgd2VpZ2h0IGFzCi0gKiBAc3JjLCBvciBsZXNzIHdlaWdodCBpbiB0aGUgZ2VuZXJhbCBjYXNlIHRoYXQgdGhlIG1hcHBpbmcgd2Fzbid0Ci0gKiBpbmplY3RpdmUgZHVlIHRvIHRoZSB3ZWlnaHQgb2YgQG5ldyBiZWluZyBsZXNzIHRoYW4gdGhhdCBvZiBAb2xkLgotICogVGhlIHJlc3VsdGluZyB2YWx1ZSBvZiBAZHN0IHdpbGwgbmV2ZXIgaGF2ZSBncmVhdGVyIHdlaWdodCB0aGFuCi0gKiB0aGF0IG9mIEBzcmMsIGV4Y2VwdCBwZXJoYXBzIGluIHRoZSBjYXNlIHRoYXQgb25lIG9mIHRoZSBhYm92ZQotICogY29uZGl0aW9ucyB3YXMgbm90IG1ldCBhbmQgdGhpcyByb3V0aW5lIGp1c3QgcmV0dXJuZWQuCi0gKgogICogRm9yIGV4YW1wbGUsIGxldHMgc2F5IHRoYXQgQG9sZCBoYXMgYml0cyA0IHRocm91Z2ggNyBzZXQsIGFuZAogICogQG5ldyBoYXMgYml0cyAxMiB0aHJvdWdoIDE1IHNldC4gIFRoaXMgZGVmaW5lcyB0aGUgbWFwcGluZyBvZiBiaXQKICAqIHBvc2l0aW9uIDQgdG8gMTIsIDUgdG8gMTMsIDYgdG8gMTQgYW5kIDcgdG8gMTUsIGFuZCBvZiBhbGwgb3RoZXIKLSAqIGJpdCBwb3NpdGlvbnMgdG8gMTIgKHRoZSBmaXJzdCBzZXQgYml0IGluIEBuZXcuICBTbyBpZiBzYXkgQHNyYwotICogY29tZXMgaW50byB0aGlzIHJvdXRpbmUgd2l0aCBiaXRzIDEsIDUgYW5kIDcgc2V0LCB0aGVuIEBkc3Qgc2hvdWxkCi0gKiBsZWF2ZSB3aXRoIGJpdHMgMTIsIDEzIGFuZCAxNSBzZXQuCisgKiBiaXQgcG9zaXRpb25zIHVuY2hhbmdlZC4gIFNvIGlmIHNheSBAc3JjIGNvbWVzIGludG8gdGhpcyByb3V0aW5lCisgKiB3aXRoIGJpdHMgMSwgNSBhbmQgNyBzZXQsIHRoZW4gQGRzdCBzaG91bGQgbGVhdmUgd2l0aCBiaXRzIDEsCisgKiAxMyBhbmQgMTUgc2V0LgogICovCiB2b2lkIGJpdG1hcF9yZW1hcCh1bnNpZ25lZCBsb25nICpkc3QsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNyYywKIAkJY29uc3QgdW5zaWduZWQgbG9uZyAqb2xkLCBjb25zdCB1bnNpZ25lZCBsb25nICpuZXcsCiAJCWludCBiaXRzKQogewotCWludCBzOworCWludCBvbGRiaXQsIHc7CiAKLQlpZiAoYml0bWFwX3dlaWdodChvbGQsIGJpdHMpID09IDApCi0JCXJldHVybjsKLQlpZiAoYml0bWFwX3dlaWdodChuZXcsIGJpdHMpID09IDApCi0JCXJldHVybjsKIAlpZiAoZHN0ID09IHNyYykJCS8qIGZvbGxvd2luZyBkb2Vzbid0IGhhbmRsZSBpbnBsYWNlIHJlbWFwcyAqLwogCQlyZXR1cm47Ci0KIAliaXRtYXBfemVybyhkc3QsIGJpdHMpOwotCWZvciAocyA9IGZpbmRfZmlyc3RfYml0KHNyYywgYml0cyk7Ci0JICAgICBzIDwgYml0czsKLQkgICAgIHMgPSBmaW5kX25leHRfYml0KHNyYywgYml0cywgcyArIDEpKSB7Ci0JICAgICAJaW50IHggPSBiaXRtYXBfcG9zX3RvX29yZChvbGQsIHMsIGJpdHMpOwotCQlpbnQgeSA9IGJpdG1hcF9vcmRfdG9fcG9zKG5ldywgeCwgYml0cyk7Ci0JCXNldF9iaXQoeSwgZHN0KTsKKworCXcgPSBiaXRtYXBfd2VpZ2h0KG5ldywgYml0cyk7CisJZm9yIChvbGRiaXQgPSBmaW5kX2ZpcnN0X2JpdChzcmMsIGJpdHMpOworCSAgICAgb2xkYml0IDwgYml0czsKKwkgICAgIG9sZGJpdCA9IGZpbmRfbmV4dF9iaXQoc3JjLCBiaXRzLCBvbGRiaXQgKyAxKSkgeworCSAgICAgCWludCBuID0gYml0bWFwX3Bvc190b19vcmQob2xkLCBvbGRiaXQsIGJpdHMpOworCQlpZiAobiA8IDAgfHwgdyA9PSAwKQorCQkJc2V0X2JpdChvbGRiaXQsIGRzdCk7CS8qIGlkZW50aXR5IG1hcCAqLworCQllbHNlCisJCQlzZXRfYml0KGJpdG1hcF9vcmRfdG9fcG9zKG5ldywgbiAlIHcsIGJpdHMpLCBkc3QpOwogCX0KIH0KIEVYUE9SVF9TWU1CT0woYml0bWFwX3JlbWFwKTsKQEAgLTY1Nyw4ICs2NTIsOCBAQAogICogd2VpZ2h0IG9mIEBvbGQsIG1hcCB0aGUgcG9zaXRpb24gb2YgdGhlIG4tdGggc2V0IGJpdCBpbiBAb2xkIHRvCiAgKiB0aGUgcG9zaXRpb24gb2YgdGhlIG0tdGggc2V0IGJpdCBpbiBAbmV3LCB3aGVyZSBtID09IG4gJSB3LgogICoKLSAqIFRoZSBwb3NpdGlvbnMgb2YgdW5zZXQgYml0cyBpbiBAb2xkIGFyZSBtYXBwZWQgdG8gdGhlIHBvc2l0aW9uIG9mCi0gKiB0aGUgZmlyc3Qgc2V0IGJpdCBpbiBAbmV3LgorICogVGhlIHBvc2l0aW9ucyBvZiB1bnNldCBiaXRzIGluIEBvbGQgYXJlIG1hcHBlZCB0byB0aGVtc2VsdmVzCisgKiAodGhlIGlkZW50aWZ5IG1hcCkuCiAgKgogICogQXBwbHkgdGhlIGFib3ZlIHNwZWNpZmllZCBtYXBwaW5nIHRvIGJpdCBwb3NpdGlvbiBAb2xkYml0LCByZXR1cm5pbmcKICAqIHRoZSBuZXcgYml0IHBvc2l0aW9uLgpAQCAtNjY2LDE0ICs2NjEsMTggQEAKICAqIEZvciBleGFtcGxlLCBsZXRzIHNheSB0aGF0IEBvbGQgaGFzIGJpdHMgNCB0aHJvdWdoIDcgc2V0LCBhbmQKICAqIEBuZXcgaGFzIGJpdHMgMTIgdGhyb3VnaCAxNSBzZXQuICBUaGlzIGRlZmluZXMgdGhlIG1hcHBpbmcgb2YgYml0CiAgKiBwb3NpdGlvbiA0IHRvIDEyLCA1IHRvIDEzLCA2IHRvIDE0IGFuZCA3IHRvIDE1LCBhbmQgb2YgYWxsIG90aGVyCi0gKiBiaXQgcG9zaXRpb25zIHRvIDEyICh0aGUgZmlyc3Qgc2V0IGJpdCBpbiBAbmV3LiAgU28gaWYgc2F5IEBvbGRiaXQKLSAqIGlzIDUsIHRoZW4gdGhpcyByb3V0aW5lIHJldHVybnMgMTMuCisgKiBiaXQgcG9zaXRpb25zIHVuY2hhbmdlZC4gIFNvIGlmIHNheSBAb2xkYml0IGlzIDUsIHRoZW4gdGhpcyByb3V0aW5lCisgKiByZXR1cm5zIDEzLgogICovCiBpbnQgYml0bWFwX2JpdHJlbWFwKGludCBvbGRiaXQsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKm9sZCwKIAkJCQljb25zdCB1bnNpZ25lZCBsb25nICpuZXcsIGludCBiaXRzKQogewotCWludCB4ID0gYml0bWFwX3Bvc190b19vcmQob2xkLCBvbGRiaXQsIGJpdHMpOwotCXJldHVybiBiaXRtYXBfb3JkX3RvX3BvcyhuZXcsIHgsIGJpdHMpOworCWludCB3ID0gYml0bWFwX3dlaWdodChuZXcsIGJpdHMpOworCWludCBuID0gYml0bWFwX3Bvc190b19vcmQob2xkLCBvbGRiaXQsIGJpdHMpOworCWlmIChuIDwgMCB8fCB3ID09IDApCisJCXJldHVybiBvbGRiaXQ7CisJZWxzZQorCQlyZXR1cm4gYml0bWFwX29yZF90b19wb3MobmV3LCBuICUgdywgYml0cyk7CiB9CiBFWFBPUlRfU1lNQk9MKGJpdG1hcF9iaXRyZW1hcCk7CiAKZGlmZiAtLWdpdCBhL2xpYi9kZWNfYW5kX2xvY2suYyBiL2xpYi9kZWNfYW5kX2xvY2suYwppbmRleCAzMDVhOTY2Li5hNjVjMzE0IDEwMDY0NAotLS0gYS9saWIvZGVjX2FuZF9sb2NrLmMKKysrIGIvbGliL2RlY19hbmRfbG9jay5jCkBAIC0xLDQ3ICsxLDExIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jaWZkZWYgX19IQVZFX0FSQ0hfQ01QWENIRwogLyoKICAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG5vdGlvbiBvZiAiZGVjcmVtZW50IGEKICAqIHJlZmVyZW5jZSBjb3VudCwgYW5kIHJldHVybiBsb2NrZWQgaWYgaXQgZGVjcmVtZW50ZWQgdG8gemVybyIuCiAgKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgdXNlZCBvbiBhbnkgYXJjaGl0ZWN0dXJlIHRoYXQKLSAqIGhhcyBhIGNtcHhjaGcsIGFuZCB3aGVyZSBhdG9taWMtPnZhbHVlIGlzIGFuIGludCBob2xkaW5nCi0gKiB0aGUgdmFsdWUgb2YgdGhlIGF0b21pYyAoaS5lLiB0aGUgaGlnaCBiaXRzIGFyZW4ndCB1c2VkCi0gKiBmb3IgYSBsb2NrIG9yIGFueXRoaW5nIGxpa2UgdGhhdCkuCi0gKi8KLWludCBfYXRvbWljX2RlY19hbmRfbG9jayhhdG9taWNfdCAqYXRvbWljLCBzcGlubG9ja190ICpsb2NrKQotewotCWludCBjb3VudGVyOwotCWludCBuZXdjb3VudDsKLQotCWZvciAoOzspIHsKLQkJY291bnRlciA9IGF0b21pY19yZWFkKGF0b21pYyk7Ci0JCW5ld2NvdW50ID0gY291bnRlciAtIDE7Ci0JCWlmICghbmV3Y291bnQpCi0JCQlicmVhazsJCS8qIGRvIGl0IHRoZSBzbG93IHdheSAqLwotCi0JCW5ld2NvdW50ID0gY21weGNoZygmYXRvbWljLT5jb3VudGVyLCBjb3VudGVyLCBuZXdjb3VudCk7Ci0JCWlmIChuZXdjb3VudCA9PSBjb3VudGVyKQotCQkJcmV0dXJuIDA7Ci0JfQotCi0Jc3Bpbl9sb2NrKGxvY2spOwotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KGF0b21pYykpCi0JCXJldHVybiAxOwotCXNwaW5fdW5sb2NrKGxvY2spOwotCXJldHVybiAwOwotfQotI2Vsc2UKLS8qCi0gKiBUaGlzIGlzIGFuIGFyY2hpdGVjdHVyZS1uZXV0cmFsLCBidXQgc2xvdywKLSAqIGltcGxlbWVudGF0aW9uIG9mIHRoZSBub3Rpb24gb2YgImRlY3JlbWVudAotICogYSByZWZlcmVuY2UgY291bnQsIGFuZCByZXR1cm4gbG9ja2VkIGlmIGl0Ci0gKiBkZWNyZW1lbnRlZCB0byB6ZXJvIi4KLSAqCiAgKiBOT1RFIE5PVEUgTk9URSEgVGhpcyBpcyBfbm90XyBlcXVpdmFsZW50IHRvCiAgKgogICoJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmF0b21pYykpIHsKQEAgLTUyLDIxICsxNiwyMCBAQAogICoKICAqIGJlY2F1c2UgdGhlIHNwaW4tbG9jayBhbmQgdGhlIGRlY3JlbWVudCBtdXN0IGJlCiAgKiAiYXRvbWljIi4KLSAqCi0gKiBUaGlzIHNsb3cgdmVyc2lvbiBnZXRzIHRoZSBzcGlubG9jayB1bmNvbmRpdGlvbmFsbHksCi0gKiBhbmQgcmVsZWFzZXMgaXQgaWYgaXQgaXNuJ3QgbmVlZGVkLiBBcmNoaXRlY3R1cmVzCi0gKiBhcmUgZW5jb3VyYWdlZCB0byBjb21lIHVwIHdpdGggYmV0dGVyIGFwcHJvYWNoZXMsCi0gKiB0aGlzIGlzIHRyaXZpYWxseSBkb25lIGVmZmljaWVudGx5IHVzaW5nIGEgbG9hZC1sb2NrZWQKLSAqIHN0b3JlLWNvbmRpdGlvbmFsIGFwcHJvYWNoLCBmb3IgZXhhbXBsZS4KICAqLwogaW50IF9hdG9taWNfZGVjX2FuZF9sb2NrKGF0b21pY190ICphdG9taWMsIHNwaW5sb2NrX3QgKmxvY2spCiB7CisjaWZkZWYgQ09ORklHX1NNUAorCS8qIFN1YnRyYWN0IDEgZnJvbSBjb3VudGVyIHVubGVzcyB0aGF0IGRyb3BzIGl0IHRvIDAgKGllLiBpdCB3YXMgMSkgKi8KKwlpZiAoYXRvbWljX2FkZF91bmxlc3MoYXRvbWljLCAtMSwgMSkpCisJCXJldHVybiAwOworI2VuZGlmCisJLyogT3RoZXJ3aXNlIGRvIGl0IHRoZSBzbG93IHdheSAqLwogCXNwaW5fbG9jayhsb2NrKTsKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdChhdG9taWMpKQogCQlyZXR1cm4gMTsKIAlzcGluX3VubG9jayhsb2NrKTsKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgogCiBFWFBPUlRfU1lNQk9MKF9hdG9taWNfZGVjX2FuZF9sb2NrKTsKZGlmZiAtLWdpdCBhL2xpYi9maW5kX25leHRfYml0LmMgYi9saWIvZmluZF9uZXh0X2JpdC5jCmluZGV4IGQwODMwMmQuLmMwNWI0YjEgMTAwNjQ0Ci0tLSBhL2xpYi9maW5kX25leHRfYml0LmMKKysrIGIvbGliL2ZpbmRfbmV4dF9iaXQuYwpAQCAtMTAsNiArMTAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogaW50IGZpbmRfbmV4dF9iaXQoY29uc3QgdW5zaWduZWQgbG9uZyAqYWRkciwgaW50IHNpemUsIGludCBvZmZzZXQpCiB7CkBAIC01MywzICs1NCw1IEBACiAKIAlyZXR1cm4gb2Zmc2V0OwogfQorCitFWFBPUlRfU1lNQk9MKGZpbmRfbmV4dF9iaXQpOwpkaWZmIC0tZ2l0IGEvbGliL3JhZGl4LXRyZWUuYyBiL2xpYi9yYWRpeC10cmVlLmMKaW5kZXggODg1MTFjMy4uYzBiZDRhOSAxMDA2NDQKLS0tIGEvbGliL3JhZGl4LXRyZWUuYworKysgYi9saWIvcmFkaXgtdHJlZS5jCkBAIC0xMzcsMTggKzEzNywzMSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGFnX3NldChzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlLCBpbnQgdGFnLCBpbnQgb2Zmc2V0KQogewotCWlmICghdGVzdF9iaXQob2Zmc2V0LCAmbm9kZS0+dGFnc1t0YWddWzBdKSkKLQkJX19zZXRfYml0KG9mZnNldCwgJm5vZGUtPnRhZ3NbdGFnXVswXSk7CisJX19zZXRfYml0KG9mZnNldCwgbm9kZS0+dGFnc1t0YWddKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHRhZ19jbGVhcihzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlLCBpbnQgdGFnLCBpbnQgb2Zmc2V0KQogewotCV9fY2xlYXJfYml0KG9mZnNldCwgJm5vZGUtPnRhZ3NbdGFnXVswXSk7CisJX19jbGVhcl9iaXQob2Zmc2V0LCBub2RlLT50YWdzW3RhZ10pOwogfQogCiBzdGF0aWMgaW5saW5lIGludCB0YWdfZ2V0KHN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUsIGludCB0YWcsIGludCBvZmZzZXQpCiB7Ci0JcmV0dXJuIHRlc3RfYml0KG9mZnNldCwgJm5vZGUtPnRhZ3NbdGFnXVswXSk7CisJcmV0dXJuIHRlc3RfYml0KG9mZnNldCwgbm9kZS0+dGFnc1t0YWddKTsKK30KKworLyoKKyAqIFJldHVybnMgMSBpZiBhbnkgc2xvdCBpbiB0aGUgbm9kZSBoYXMgdGhpcyB0YWcgc2V0LgorICogT3RoZXJ3aXNlIHJldHVybnMgMC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYW55X3RhZ19zZXQoc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSwgaW50IHRhZykKK3sKKwlpbnQgaWR4OworCWZvciAoaWR4ID0gMDsgaWR4IDwgUkFESVhfVFJFRV9UQUdfTE9OR1M7IGlkeCsrKSB7CisJCWlmIChub2RlLT50YWdzW3RhZ11baWR4XSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTE4NSwxNSArMTk4LDkgQEAKIAkgKiBpbnRvIHRoZSBuZXdseS1wdXNoZWQgdG9wLWxldmVsIG5vZGUocykKIAkgKi8KIAlmb3IgKHRhZyA9IDA7IHRhZyA8IFJBRElYX1RSRUVfVEFHUzsgdGFnKyspIHsKLQkJaW50IGlkeDsKLQogCQl0YWdzW3RhZ10gPSAwOwotCQlmb3IgKGlkeCA9IDA7IGlkeCA8IFJBRElYX1RSRUVfVEFHX0xPTkdTOyBpZHgrKykgewotCQkJaWYgKHJvb3QtPnJub2RlLT50YWdzW3RhZ11baWR4XSkgewotCQkJCXRhZ3NbdGFnXSA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KKwkJaWYgKGFueV90YWdfc2V0KHJvb3QtPnJub2RlLCB0YWcpKQorCQkJdGFnc1t0YWddID0gMTsKIAl9CiAKIAlkbyB7CkBAIC0yNDYsNyArMjUzLDcgQEAKIAlzaGlmdCA9IChoZWlnaHQtMSkgKiBSQURJWF9UUkVFX01BUF9TSElGVDsKIAogCW9mZnNldCA9IDA7CQkJLyogdW5pbml0aWFsaXNlZCB2YXIgd2FybmluZyAqLwotCXdoaWxlIChoZWlnaHQgPiAwKSB7CisJZG8gewogCQlpZiAoc2xvdCA9PSBOVUxMKSB7CiAJCQkvKiBIYXZlIHRvIGFkZCBhIGNoaWxkIG5vZGUuICAqLwogCQkJaWYgKCEoc2xvdCA9IHJhZGl4X3RyZWVfbm9kZV9hbGxvYyhyb290KSkpCkBAIC0yNjQsMTggKzI3MSwxNiBAQAogCQlzbG90ID0gbm9kZS0+c2xvdHNbb2Zmc2V0XTsKIAkJc2hpZnQgLT0gUkFESVhfVFJFRV9NQVBfU0hJRlQ7CiAJCWhlaWdodC0tOwotCX0KKwl9IHdoaWxlIChoZWlnaHQgPiAwKTsKIAogCWlmIChzbG90ICE9IE5VTEwpCiAJCXJldHVybiAtRUVYSVNUOwogCi0JaWYgKG5vZGUpIHsKLQkJbm9kZS0+Y291bnQrKzsKLQkJbm9kZS0+c2xvdHNbb2Zmc2V0XSA9IGl0ZW07Ci0JCUJVR19PTih0YWdfZ2V0KG5vZGUsIDAsIG9mZnNldCkpOwotCQlCVUdfT04odGFnX2dldChub2RlLCAxLCBvZmZzZXQpKTsKLQl9IGVsc2UKLQkJcm9vdC0+cm5vZGUgPSBpdGVtOworCUJVR19PTighbm9kZSk7CisJbm9kZS0+Y291bnQrKzsKKwlub2RlLT5zbG90c1tvZmZzZXRdID0gaXRlbTsKKwlCVUdfT04odGFnX2dldChub2RlLCAwLCBvZmZzZXQpKTsKKwlCVUdfT04odGFnX2dldChub2RlLCAxLCBvZmZzZXQpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzY3LDcgKzM3Miw4IEBACiAJCWludCBvZmZzZXQ7CiAKIAkJb2Zmc2V0ID0gKGluZGV4ID4+IHNoaWZ0KSAmIFJBRElYX1RSRUVfTUFQX01BU0s7Ci0JCXRhZ19zZXQoc2xvdCwgdGFnLCBvZmZzZXQpOworCQlpZiAoIXRhZ19nZXQoc2xvdCwgdGFnLCBvZmZzZXQpKQorCQkJdGFnX3NldChzbG90LCB0YWcsIG9mZnNldCk7CiAJCXNsb3QgPSBzbG90LT5zbG90c1tvZmZzZXRdOwogCQlCVUdfT04oc2xvdCA9PSBOVUxMKTsKIAkJc2hpZnQgLT0gUkFESVhfVFJFRV9NQVBfU0hJRlQ7CkBAIC00MjcsMTMgKzQzMywxMSBAQAogCQlnb3RvIG91dDsKIAogCWRvIHsKLQkJaW50IGlkeDsKLQorCQlpZiAoIXRhZ19nZXQocGF0aHAtPm5vZGUsIHRhZywgcGF0aHAtPm9mZnNldCkpCisJCQlnb3RvIG91dDsKIAkJdGFnX2NsZWFyKHBhdGhwLT5ub2RlLCB0YWcsIHBhdGhwLT5vZmZzZXQpOwotCQlmb3IgKGlkeCA9IDA7IGlkeCA8IFJBRElYX1RSRUVfVEFHX0xPTkdTOyBpZHgrKykgewotCQkJaWYgKHBhdGhwLT5ub2RlLT50YWdzW3RhZ11baWR4XSkKLQkJCQlnb3RvIG91dDsKLQkJfQorCQlpZiAoYW55X3RhZ19zZXQocGF0aHAtPm5vZGUsIHRhZykpCisJCQlnb3RvIG91dDsKIAkJcGF0aHAtLTsKIAl9IHdoaWxlIChwYXRocC0+bm9kZSk7CiBvdXQ6CkBAIC02NzQsNiArNjc4LDI5IEBACiBFWFBPUlRfU1lNQk9MKHJhZGl4X3RyZWVfZ2FuZ19sb29rdXBfdGFnKTsKIAogLyoqCisgKglyYWRpeF90cmVlX3NocmluayAgICAtICAgIHNocmluayBoZWlnaHQgb2YgYSByYWRpeCB0cmVlIHRvIG1pbmltYWwKKyAqCUByb290CQlyYWRpeCB0cmVlIHJvb3QKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJhZGl4X3RyZWVfc2hyaW5rKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QpCit7CisJLyogdHJ5IHRvIHNocmluayB0cmVlIGhlaWdodCAqLworCXdoaWxlIChyb290LT5oZWlnaHQgPiAxICYmCisJCQlyb290LT5ybm9kZS0+Y291bnQgPT0gMSAmJgorCQkJcm9vdC0+cm5vZGUtPnNsb3RzWzBdKSB7CisJCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKnRvX2ZyZWUgPSByb290LT5ybm9kZTsKKworCQlyb290LT5ybm9kZSA9IHRvX2ZyZWUtPnNsb3RzWzBdOworCQlyb290LT5oZWlnaHQtLTsKKwkJLyogbXVzdCBvbmx5IGZyZWUgemVyb2VkIG5vZGVzIGludG8gdGhlIHNsYWIgKi8KKwkJdGFnX2NsZWFyKHRvX2ZyZWUsIDAsIDApOworCQl0YWdfY2xlYXIodG9fZnJlZSwgMSwgMCk7CisJCXRvX2ZyZWUtPnNsb3RzWzBdID0gTlVMTDsKKwkJdG9fZnJlZS0+Y291bnQgPSAwOworCQlyYWRpeF90cmVlX25vZGVfZnJlZSh0b19mcmVlKTsKKwl9Cit9CisKKy8qKgogICoJcmFkaXhfdHJlZV9kZWxldGUgICAgLSAgICBkZWxldGUgYW4gaXRlbSBmcm9tIGEgcmFkaXggdHJlZQogICoJQHJvb3Q6CQlyYWRpeCB0cmVlIHJvb3QKICAqCUBpbmRleDoJCWluZGV4IGtleQpAQCAtNjkxLDYgKzcxOCw4IEBACiAJdm9pZCAqcmV0ID0gTlVMTDsKIAljaGFyIHRhZ3NbUkFESVhfVFJFRV9UQUdTXTsKIAlpbnQgbnJfY2xlYXJlZF90YWdzOworCWludCB0YWc7CisJaW50IG9mZnNldDsKIAogCWhlaWdodCA9IHJvb3QtPmhlaWdodDsKIAlpZiAoaW5kZXggPiByYWRpeF90cmVlX21heGluZGV4KGhlaWdodCkpCkBAIC03MDEsMTYgKzczMCwxNCBAQAogCXNsb3QgPSByb290LT5ybm9kZTsKIAogCWZvciAoIDsgaGVpZ2h0ID4gMDsgaGVpZ2h0LS0pIHsKLQkJaW50IG9mZnNldDsKLQogCQlpZiAoc2xvdCA9PSBOVUxMKQogCQkJZ290byBvdXQ7CiAKLQkJb2Zmc2V0ID0gKGluZGV4ID4+IHNoaWZ0KSAmIFJBRElYX1RSRUVfTUFQX01BU0s7Ci0JCXBhdGhwWzFdLm9mZnNldCA9IG9mZnNldDsKLQkJcGF0aHBbMV0ubm9kZSA9IHNsb3Q7Ci0JCXNsb3QgPSBzbG90LT5zbG90c1tvZmZzZXRdOwogCQlwYXRocCsrOworCQlvZmZzZXQgPSAoaW5kZXggPj4gc2hpZnQpICYgUkFESVhfVFJFRV9NQVBfTUFTSzsKKwkJcGF0aHAtPm9mZnNldCA9IG9mZnNldDsKKwkJcGF0aHAtPm5vZGUgPSBzbG90OworCQlzbG90ID0gc2xvdC0+c2xvdHNbb2Zmc2V0XTsKIAkJc2hpZnQgLT0gUkFESVhfVFJFRV9NQVBfU0hJRlQ7CiAJfQogCkBAIC03MjMsMzUgKzc1MCwzOSBAQAogCS8qCiAJICogQ2xlYXIgYWxsIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBqdXN0LWRlbGV0ZWQgaXRlbQogCSAqLwotCW1lbXNldCh0YWdzLCAwLCBzaXplb2YodGFncykpOwotCWRvIHsKLQkJaW50IHRhZzsKKwlucl9jbGVhcmVkX3RhZ3MgPSAwOworCWZvciAodGFnID0gMDsgdGFnIDwgUkFESVhfVFJFRV9UQUdTOyB0YWcrKykgeworCQlpZiAodGFnX2dldChwYXRocC0+bm9kZSwgdGFnLCBwYXRocC0+b2Zmc2V0KSkgeworCQkJdGFnX2NsZWFyKHBhdGhwLT5ub2RlLCB0YWcsIHBhdGhwLT5vZmZzZXQpOworCQkJdGFnc1t0YWddID0gMDsKKwkJCW5yX2NsZWFyZWRfdGFncysrOworCQl9IGVsc2UKKwkJCXRhZ3NbdGFnXSA9IDE7CisJfQogCi0JCW5yX2NsZWFyZWRfdGFncyA9IFJBRElYX1RSRUVfVEFHUzsKKwlmb3IgKHBhdGhwLS07IG5yX2NsZWFyZWRfdGFncyAmJiBwYXRocC0+bm9kZTsgcGF0aHAtLSkgewogCQlmb3IgKHRhZyA9IDA7IHRhZyA8IFJBRElYX1RSRUVfVEFHUzsgdGFnKyspIHsKLQkJCWludCBpZHg7Ci0KIAkJCWlmICh0YWdzW3RhZ10pCiAJCQkJY29udGludWU7CiAKIAkJCXRhZ19jbGVhcihwYXRocC0+bm9kZSwgdGFnLCBwYXRocC0+b2Zmc2V0KTsKLQotCQkJZm9yIChpZHggPSAwOyBpZHggPCBSQURJWF9UUkVFX1RBR19MT05HUzsgaWR4KyspIHsKLQkJCQlpZiAocGF0aHAtPm5vZGUtPnRhZ3NbdGFnXVtpZHhdKSB7Ci0JCQkJCXRhZ3NbdGFnXSA9IDE7Ci0JCQkJCW5yX2NsZWFyZWRfdGFncy0tOwotCQkJCQlicmVhazsKLQkJCQl9CisJCQlpZiAoYW55X3RhZ19zZXQocGF0aHAtPm5vZGUsIHRhZykpIHsKKwkJCQl0YWdzW3RhZ10gPSAxOworCQkJCW5yX2NsZWFyZWRfdGFncy0tOwogCQkJfQogCQl9Ci0JCXBhdGhwLS07Ci0JfSB3aGlsZSAocGF0aHAtPm5vZGUgJiYgbnJfY2xlYXJlZF90YWdzKTsKKwl9CiAKIAkvKiBOb3cgZnJlZSB0aGUgbm9kZXMgd2UgZG8gbm90IG5lZWQgYW55bW9yZSAqLwogCWZvciAocGF0aHAgPSBvcmlnX3BhdGhwOyBwYXRocC0+bm9kZTsgcGF0aHAtLSkgewogCQlwYXRocC0+bm9kZS0+c2xvdHNbcGF0aHAtPm9mZnNldF0gPSBOVUxMOwotCQlpZiAoLS1wYXRocC0+bm9kZS0+Y291bnQpCisJCXBhdGhwLT5ub2RlLT5jb3VudC0tOworCisJCWlmIChwYXRocC0+bm9kZS0+Y291bnQpIHsKKwkJCWlmIChwYXRocC0+bm9kZSA9PSByb290LT5ybm9kZSkKKwkJCQlyYWRpeF90cmVlX3Nocmluayhyb290KTsKIAkJCWdvdG8gb3V0OworCQl9CiAKIAkJLyogTm9kZSB3aXRoIHplcm8gc2xvdHMgaW4gdXNlIHNvIGZyZWUgaXQgKi8KIAkJcmFkaXhfdHJlZV9ub2RlX2ZyZWUocGF0aHAtPm5vZGUpOwpAQCAtNzcwLDE1ICs4MDEsMTEgQEAKICAqLwogaW50IHJhZGl4X3RyZWVfdGFnZ2VkKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsIGludCB0YWcpCiB7Ci0JaW50IGlkeDsKLQotCWlmICghcm9vdC0+cm5vZGUpCi0JCXJldHVybiAwOwotCWZvciAoaWR4ID0gMDsgaWR4IDwgUkFESVhfVFJFRV9UQUdfTE9OR1M7IGlkeCsrKSB7Ci0JCWlmIChyb290LT5ybm9kZS0+dGFnc1t0YWddW2lkeF0pCi0JCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7CisgIAlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpybm9kZTsKKyAgCXJub2RlID0gcm9vdC0+cm5vZGU7CisgIAlpZiAoIXJub2RlKQorICAJCXJldHVybiAwOworCXJldHVybiBhbnlfdGFnX3NldChybm9kZSwgdGFnKTsKIH0KIEVYUE9SVF9TWU1CT0wocmFkaXhfdHJlZV90YWdnZWQpOwogCmRpZmYgLS1naXQgYS9saWIvc3BpbmxvY2tfZGVidWcuYyBiL2xpYi9zcGlubG9ja19kZWJ1Zy5jCmluZGV4IGRjZDRiZTkuLmM4YmI4Y2MgMTAwNjQ0Ci0tLSBhL2xpYi9zcGlubG9ja19kZWJ1Zy5jCisrKyBiL2xpYi9zcGlubG9ja19kZWJ1Zy5jCkBAIC0xOSwxMCArMTksMTEgQEAKIAlpZiAoeGNoZygmcHJpbnRfb25jZSwgMCkpIHsKIAkJaWYgKGxvY2stPm93bmVyICYmIGxvY2stPm93bmVyICE9IFNQSU5MT0NLX09XTkVSX0lOSVQpCiAJCQlvd25lciA9IGxvY2stPm93bmVyOwotCQlwcmludGsoIkJVRzogc3BpbmxvY2sgJXMgb24gQ1BVIyVkLCAlcy8lZFxuIiwKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIkJVRzogc3BpbmxvY2sgJXMgb24gQ1BVIyVkLCAlcy8lZFxuIiwKIAkJCW1zZywgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSwKIAkJCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCk7Ci0JCXByaW50aygiIGxvY2s6ICVwLCAubWFnaWM6ICUwOHgsIC5vd25lcjogJXMvJWQsIC5vd25lcl9jcHU6ICVkXG4iLAorCQlwcmludGsoS0VSTl9FTUVSRyAiIGxvY2s6ICVwLCAubWFnaWM6ICUwOHgsIC5vd25lcjogJXMvJWQsICIKKwkJCQkiLm93bmVyX2NwdTogJWRcbiIsCiAJCQlsb2NrLCBsb2NrLT5tYWdpYywKIAkJCW93bmVyID8gb3duZXItPmNvbW0gOiAiPG5vbmU+IiwKIAkJCW93bmVyID8gb3duZXItPnBpZCA6IC0xLApAQCAtNzgsNyArNzksOCBAQAogCQkvKiBsb2NrdXAgc3VzcGVjdGVkOiAqLwogCQlpZiAocHJpbnRfb25jZSkgewogCQkJcHJpbnRfb25jZSA9IDA7Ci0JCQlwcmludGsoIkJVRzogc3BpbmxvY2sgbG9ja3VwIG9uIENQVSMlZCwgJXMvJWQsICVwXG4iLAorCQkJcHJpbnRrKEtFUk5fRU1FUkcgIkJVRzogc3BpbmxvY2sgbG9ja3VwIG9uIENQVSMlZCwgIgorCQkJCQkiJXMvJWQsICVwXG4iLAogCQkJCXJhd19zbXBfcHJvY2Vzc29yX2lkKCksIGN1cnJlbnQtPmNvbW0sCiAJCQkJY3VycmVudC0+cGlkLCBsb2NrKTsKIAkJCWR1bXBfc3RhY2soKTsKQEAgLTEyMCw4ICsxMjIsOCBAQAogCXN0YXRpYyBsb25nIHByaW50X29uY2UgPSAxOwogCiAJaWYgKHhjaGcoJnByaW50X29uY2UsIDApKSB7Ci0JCXByaW50aygiQlVHOiByd2xvY2sgJXMgb24gQ1BVIyVkLCAlcy8lZCwgJXBcbiIsIG1zZywKLQkJCXJhd19zbXBfcHJvY2Vzc29yX2lkKCksIGN1cnJlbnQtPmNvbW0sCisJCXByaW50ayhLRVJOX0VNRVJHICJCVUc6IHJ3bG9jayAlcyBvbiBDUFUjJWQsICVzLyVkLCAlcFxuIiwKKwkJCW1zZywgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSwgY3VycmVudC0+Y29tbSwKIAkJCWN1cnJlbnQtPnBpZCwgbG9jayk7CiAJCWR1bXBfc3RhY2soKTsKICNpZmRlZiBDT05GSUdfU01QCkBAIC0xNDksNyArMTUxLDggQEAKIAkJLyogbG9ja3VwIHN1c3BlY3RlZDogKi8KIAkJaWYgKHByaW50X29uY2UpIHsKIAkJCXByaW50X29uY2UgPSAwOwotCQkJcHJpbnRrKCJCVUc6IHJlYWQtbG9jayBsb2NrdXAgb24gQ1BVIyVkLCAlcy8lZCwgJXBcbiIsCisJCQlwcmludGsoS0VSTl9FTUVSRyAiQlVHOiByZWFkLWxvY2sgbG9ja3VwIG9uIENQVSMlZCwgIgorCQkJCQkiJXMvJWQsICVwXG4iLAogCQkJCXJhd19zbXBfcHJvY2Vzc29yX2lkKCksIGN1cnJlbnQtPmNvbW0sCiAJCQkJY3VycmVudC0+cGlkLCBsb2NrKTsKIAkJCWR1bXBfc3RhY2soKTsKQEAgLTIyMSw3ICsyMjQsOCBAQAogCQkvKiBsb2NrdXAgc3VzcGVjdGVkOiAqLwogCQlpZiAocHJpbnRfb25jZSkgewogCQkJcHJpbnRfb25jZSA9IDA7Ci0JCQlwcmludGsoIkJVRzogd3JpdGUtbG9jayBsb2NrdXAgb24gQ1BVIyVkLCAlcy8lZCwgJXBcbiIsCisJCQlwcmludGsoS0VSTl9FTUVSRyAiQlVHOiB3cml0ZS1sb2NrIGxvY2t1cCBvbiBDUFUjJWQsICIKKwkJCQkJIiVzLyVkLCAlcFxuIiwKIAkJCQlyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpLCBjdXJyZW50LT5jb21tLAogCQkJCWN1cnJlbnQtPnBpZCwgbG9jayk7CiAJCQlkdW1wX3N0YWNrKCk7CmRpZmYgLS1naXQgYS9saWIvc3dpb3RsYi5jIGIvbGliL3N3aW90bGIuYwppbmRleCAzYjQ4MjA1Li4wYWY0OTdiIDEwMDY0NAotLS0gYS9saWIvc3dpb3RsYi5jCisrKyBiL2xpYi9zd2lvdGxiLmMKQEAgLTQ2Myw3ICs0NjMsNyBAQAogCQkgKi8KIAkJZG1hX2FkZHJfdCBoYW5kbGU7CiAJCWhhbmRsZSA9IHN3aW90bGJfbWFwX3NpbmdsZShOVUxMLCBOVUxMLCBzaXplLCBETUFfRlJPTV9ERVZJQ0UpOwotCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoaGFuZGxlKSkKKwkJaWYgKHN3aW90bGJfZG1hX21hcHBpbmdfZXJyb3IoaGFuZGxlKSkKIAkJCXJldHVybiBOVUxMOwogCiAJCXJldCA9IHBoeXNfdG9fdmlydChoYW5kbGUpOwpkaWZmIC0tZ2l0IGEvbGliL3psaWJfZGVmbGF0ZS9kZWZsYXRlLmMgYi9saWIvemxpYl9kZWZsYXRlL2RlZmxhdGUuYwppbmRleCBhZDlhMWJmLi4xNjUzZGQ5IDEwMDY0NAotLS0gYS9saWIvemxpYl9kZWZsYXRlL2RlZmxhdGUuYworKysgYi9saWIvemxpYl9kZWZsYXRlL2RlZmxhdGUuYwpAQCAtMjU1LDYgKzI1NSw3IEBACiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNpZiAwCiBpbnQgemxpYl9kZWZsYXRlU2V0RGljdGlvbmFyeSgKIAl6X3N0cmVhbXAgc3RybSwKIAljb25zdCBCeXRlICpkaWN0aW9uYXJ5LApAQCAtMjk3LDYgKzI5OCw3IEBACiAgICAgaWYgKGhhc2hfaGVhZCkgaGFzaF9oZWFkID0gMDsgIC8qIHRvIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KICAgICByZXR1cm4gWl9PSzsKIH0KKyNlbmRpZiAgLyogIDAgICovCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIGludCB6bGliX2RlZmxhdGVSZXNldCgKQEAgLTMzMCw2ICszMzIsNyBAQAogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjaWYgMAogaW50IHpsaWJfZGVmbGF0ZVBhcmFtcygKIAl6X3N0cmVhbXAgc3RybSwKIAlpbnQgbGV2ZWwsCkBAIC0zNjUsNiArMzY4LDcgQEAKICAgICBzLT5zdHJhdGVneSA9IHN0cmF0ZWd5OwogICAgIHJldHVybiBlcnI7CiB9CisjZW5kaWYgIC8qICAwICAqLwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBQdXQgYSBzaG9ydCBpbiB0aGUgcGVuZGluZyBidWZmZXIuIFRoZSAxNi1iaXQgdmFsdWUgaXMgcHV0IGluIE1TQiBvcmRlci4KQEAgLTU3Miw2ICs1NzYsNyBAQAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogQ29weSB0aGUgc291cmNlIHN0YXRlIHRvIHRoZSBkZXN0aW5hdGlvbiBzdGF0ZS4KICAqLworI2lmIDAKIGludCB6bGliX2RlZmxhdGVDb3B5ICgKIAl6X3N0cmVhbXAgZGVzdCwKIAl6X3N0cmVhbXAgc291cmNlCkBAIC02MjQsNiArNjI5LDcgQEAKICAgICByZXR1cm4gWl9PSzsKICNlbmRpZgogfQorI2VuZGlmICAvKiAgMCAgKi8KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBSZWFkIGEgbmV3IGJ1ZmZlciBmcm9tIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbSwgdXBkYXRlIHRoZSBhZGxlcjMyCmRpZmYgLS1naXQgYS9saWIvemxpYl9kZWZsYXRlL2RlZmxhdGVfc3ltcy5jIGIvbGliL3psaWJfZGVmbGF0ZS9kZWZsYXRlX3N5bXMuYwppbmRleCA1OTg1YjI4Li43NjdiNTczIDEwMDY0NAotLS0gYS9saWIvemxpYl9kZWZsYXRlL2RlZmxhdGVfc3ltcy5jCisrKyBiL2xpYi96bGliX2RlZmxhdGUvZGVmbGF0ZV9zeW1zLmMKQEAgLTE2LDYgKzE2LDQgQEAKIEVYUE9SVF9TWU1CT0woemxpYl9kZWZsYXRlSW5pdDJfKTsKIEVYUE9SVF9TWU1CT0woemxpYl9kZWZsYXRlRW5kKTsKIEVYUE9SVF9TWU1CT0woemxpYl9kZWZsYXRlUmVzZXQpOwotRVhQT1JUX1NZTUJPTCh6bGliX2RlZmxhdGVDb3B5KTsKLUVYUE9SVF9TWU1CT0woemxpYl9kZWZsYXRlUGFyYW1zKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2xpYi96bGliX2luZmxhdGUvaW5mYmxvY2suYyBiL2xpYi96bGliX2luZmxhdGUvaW5mYmxvY2suYwppbmRleCA1MGYyMWNhNC4uYzE2Y2RlZiAxMDA2NDQKLS0tIGEvbGliL3psaWJfaW5mbGF0ZS9pbmZibG9jay5jCisrKyBiL2xpYi96bGliX2luZmxhdGUvaW5mYmxvY2suYwpAQCAtMzM4LDYgKzMzOCw3IEBACiB9CiAKIAorI2lmIDAKIHZvaWQgemxpYl9pbmZsYXRlX3NldF9kaWN0aW9uYXJ5KAogCWluZmxhdGVfYmxvY2tzX3N0YXRlZiAqcywKIAljb25zdCBCeXRlICpkLApAQCAtMzQ3LDE1ICszNDgsMTggQEAKICAgbWVtY3B5KHMtPndpbmRvdywgZCwgbik7CiAgIHMtPnJlYWQgPSBzLT53cml0ZSA9IHMtPndpbmRvdyArIG47CiB9CisjZW5kaWYgIC8qICAwICAqLwogCiAKIC8qIFJldHVybnMgdHJ1ZSBpZiBpbmZsYXRlIGlzIGN1cnJlbnRseSBhdCB0aGUgZW5kIG9mIGEgYmxvY2sgZ2VuZXJhdGVkCiAgKiBieSBaX1NZTkNfRkxVU0ggb3IgWl9GVUxMX0ZMVVNILiAKICAqIElOIGFzc2VydGlvbjogcyAhPSBOVUxMCiAgKi8KKyNpZiAwCiBpbnQgemxpYl9pbmZsYXRlX2Jsb2Nrc19zeW5jX3BvaW50KAogCWluZmxhdGVfYmxvY2tzX3N0YXRlZiAqcwogKQogewogICByZXR1cm4gcy0+bW9kZSA9PSBMRU5TOwogfQorI2VuZGlmICAvKiAgMCAgKi8KZGlmZiAtLWdpdCBhL2xpYi96bGliX2luZmxhdGUvaW5mYmxvY2suaCBiL2xpYi96bGliX2luZmxhdGUvaW5mYmxvY2suaAppbmRleCBmNTIyMWRkLi5jZWVlNjBiIDEwMDY0NAotLS0gYS9saWIvemxpYl9pbmZsYXRlL2luZmJsb2NrLmgKKysrIGIvbGliL3psaWJfaW5mbGF0ZS9pbmZibG9jay5oCkBAIC0zMywxMiArMzMsMTYgQEAKICAgICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKiwKICAgICB6X3N0cmVhbXApOwogCisjaWYgMAogZXh0ZXJuIHZvaWQgemxpYl9pbmZsYXRlX3NldF9kaWN0aW9uYXJ5ICgKICAgICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKnMsCiAgICAgY29uc3QgQnl0ZSAqZCwgIC8qIGRpY3Rpb25hcnkgKi8KICAgICB1SW50ICBuKTsgICAgICAgLyogZGljdGlvbmFyeSBsZW5ndGggKi8KKyNlbmRpZiAgLyogIDAgICovCiAKKyNpZiAwCiBleHRlcm4gaW50IHpsaWJfaW5mbGF0ZV9ibG9ja3Nfc3luY19wb2ludCAoCiAgICAgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzKTsKKyNlbmRpZiAgLyogIDAgICovCiAKICNlbmRpZiAvKiBfSU5GQkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL3psaWJfaW5mbGF0ZS9pbmZsYXRlX3N5bXMuYyBiL2xpYi96bGliX2luZmxhdGUvaW5mbGF0ZV9zeW1zLmMKaW5kZXggYWExYjA4MS4uZWY0OTczOCAxMDA2NDQKLS0tIGEvbGliL3psaWJfaW5mbGF0ZS9pbmZsYXRlX3N5bXMuYworKysgYi9saWIvemxpYl9pbmZsYXRlL2luZmxhdGVfc3ltcy5jCkBAIC0xNSw4ICsxNSw2IEBACiBFWFBPUlRfU1lNQk9MKHpsaWJfaW5mbGF0ZUluaXRfKTsKIEVYUE9SVF9TWU1CT0woemxpYl9pbmZsYXRlSW5pdDJfKTsKIEVYUE9SVF9TWU1CT0woemxpYl9pbmZsYXRlRW5kKTsKLUVYUE9SVF9TWU1CT0woemxpYl9pbmZsYXRlU3luYyk7CiBFWFBPUlRfU1lNQk9MKHpsaWJfaW5mbGF0ZVJlc2V0KTsKLUVYUE9SVF9TWU1CT0woemxpYl9pbmZsYXRlU3luY1BvaW50KTsKIEVYUE9SVF9TWU1CT0woemxpYl9pbmZsYXRlSW5jb21wKTsgCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9saWIvemxpYl9pbmZsYXRlL2luZmxhdGVfc3luYy5jIGIvbGliL3psaWJfaW5mbGF0ZS9pbmZsYXRlX3N5bmMuYwppbmRleCBlMDdiZGIyLi42MTQxMWZmIDEwMDY0NAotLS0gYS9saWIvemxpYl9pbmZsYXRlL2luZmxhdGVfc3luYy5jCisrKyBiL2xpYi96bGliX2luZmxhdGUvaW5mbGF0ZV9zeW5jLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSAiaW5mYmxvY2suaCIKICNpbmNsdWRlICJpbmZ1dGlsLmgiCiAKKyNpZiAwCiBpbnQgemxpYl9pbmZsYXRlU3luYygKIAl6X3N0cmVhbXAgegogKQpAQCAtNTcsNiArNTgsNyBAQAogICB6LT5zdGF0ZS0+bW9kZSA9IEJMT0NLUzsKICAgcmV0dXJuIFpfT0s7CiB9CisjZW5kaWYgIC8qICAwICAqLwogCiAKIC8qIFJldHVybnMgdHJ1ZSBpZiBpbmZsYXRlIGlzIGN1cnJlbnRseSBhdCB0aGUgZW5kIG9mIGEgYmxvY2sgZ2VuZXJhdGVkCkBAIC02Niw2ICs2OCw3IEBACiAgKiBkZWNvbXByZXNzaW5nLCBQUFAgY2hlY2tzIHRoYXQgYXQgdGhlIGVuZCBvZiBpbnB1dCBwYWNrZXQsIGluZmxhdGUgaXMKICAqIHdhaXRpbmcgZm9yIHRoZXNlIGxlbmd0aCBieXRlcy4KICAqLworI2lmIDAKIGludCB6bGliX2luZmxhdGVTeW5jUG9pbnQoCiAJel9zdHJlYW1wIHoKICkKQEAgLTc0LDYgKzc3LDcgQEAKICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CiAgIHJldHVybiB6bGliX2luZmxhdGVfYmxvY2tzX3N5bmNfcG9pbnQoei0+c3RhdGUtPmJsb2Nrcyk7CiB9CisjZW5kaWYgIC8qICAwICAqLwogCiAvKgogICogVGhpcyBzdWJyb3V0aW5lIGFkZHMgdGhlIGRhdGEgYXQgbmV4dF9pbi9hdmFpbF9pbiB0byB0aGUgb3V0cHV0IGhpc3RvcnkKZGlmZiAtLWdpdCBhL21tL0tjb25maWcgYi9tbS9LY29uZmlnCmluZGV4IGIzZGIxMWYuLmE5Y2I4MGEgMTAwNjQ0Ci0tLSBhL21tL0tjb25maWcKKysrIGIvbW0vS2NvbmZpZwpAQCAtMTMyLDMgKzEzMiwxMCBAQAogCWRlZmF1bHQgIjQwOTYiIGlmIEFSTSAmJiAhQ1BVX0NBQ0hFX1ZJUFQKIAlkZWZhdWx0ICI0MDk2IiBpZiBQQVJJU0MgJiYgIVBBMjAKIAlkZWZhdWx0ICI0IgorCisjCisjIHN1cHBvcnQgZm9yIHBhZ2UgbWlncmF0aW9uCisjCitjb25maWcgTUlHUkFUSU9OCisJZGVmX2Jvb2wgeSBpZiBOVU1BIHx8IFNQQVJTRU1FTSB8fCBESVNDT05USUdNRU0KKwlkZXBlbmRzIG9uIFNXQVAKZGlmZiAtLWdpdCBhL21tL01ha2VmaWxlIGIvbW0vTWFrZWZpbGUKaW5kZXggMmZhNmQyYy4uOWFhMDNmYSAxMDA2NDQKLS0tIGEvbW0vTWFrZWZpbGUKKysrIGIvbW0vTWFrZWZpbGUKQEAgLTksOCArOSw4IEBACiAKIG9iai15CQkJOj0gYm9vdG1lbS5vIGZpbGVtYXAubyBtZW1wb29sLm8gb29tX2tpbGwubyBmYWR2aXNlLm8gXAogCQkJICAgcGFnZV9hbGxvYy5vIHBhZ2Utd3JpdGViYWNrLm8gcGRmbHVzaC5vIFwKLQkJCSAgIHJlYWRhaGVhZC5vIHNsYWIubyBzd2FwLm8gdHJ1bmNhdGUubyB2bXNjYW4ubyBcCi0JCQkgICBwcmlvX3RyZWUubyAkKG1tdS15KQorCQkJICAgcmVhZGFoZWFkLm8gc3dhcC5vIHRydW5jYXRlLm8gdm1zY2FuLm8gXAorCQkJICAgcHJpb190cmVlLm8gdXRpbC5vICQobW11LXkpCiAKIG9iai0kKENPTkZJR19TV0FQKQkrPSBwYWdlX2lvLm8gc3dhcF9zdGF0ZS5vIHN3YXBmaWxlLm8gdGhyYXNoLm8KIG9iai0kKENPTkZJR19IVUdFVExCRlMpCSs9IGh1Z2V0bGIubwpAQCAtMTgsNSArMTgsNyBAQAogb2JqLSQoQ09ORklHX1NQQVJTRU1FTSkJKz0gc3BhcnNlLm8KIG9iai0kKENPTkZJR19TSE1FTSkgKz0gc2htZW0ubwogb2JqLSQoQ09ORklHX1RJTllfU0hNRU0pICs9IHRpbnktc2htZW0ubworb2JqLSQoQ09ORklHX1NMT0IpICs9IHNsb2Iubworb2JqLSQoQ09ORklHX1NMQUIpICs9IHNsYWIubwogb2JqLSQoQ09ORklHX01FTU9SWV9IT1RQTFVHKSArPSBtZW1vcnlfaG90cGx1Zy5vCiBvYmotJChDT05GSUdfRlNfWElQKSArPSBmaWxlbWFwX3hpcC5vCmRpZmYgLS1naXQgYS9tbS9mYWR2aXNlLmMgYi9tbS9mYWR2aXNlLmMKaW5kZXggNWYxOWU4Ny4uZDI1N2M4OSAxMDA2NDQKLS0tIGEvbW0vZmFkdmlzZS5jCisrKyBiL21tL2ZhZHZpc2UuYwpAQCAtMzcsNiArMzcsMTEgQEAKIAlpZiAoIWZpbGUpCiAJCXJldHVybiAtRUJBREY7CiAKKwlpZiAoU19JU0ZJRk8oZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpIHsKKwkJcmV0ID0gLUVTUElQRTsKKwkJZ290byBvdXQ7CisJfQorCiAJbWFwcGluZyA9IGZpbGUtPmZfbWFwcGluZzsKIAlpZiAoIW1hcHBpbmcgfHwgbGVuIDwgMCkgewogCQlyZXQgPSAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcC5jIGIvbW0vZmlsZW1hcC5jCmluZGV4IDRlZjI0YTMuLjQ0ZGEzZDQgMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXAuYworKysgYi9tbS9maWxlbWFwLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvYWlvLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CkBAIC02MSw3ICs2Miw3IEBACiAgKiAgICAgIC0+c3dhcF9sb2NrCQkoZXhjbHVzaXZlX3N3YXBfcGFnZSwgb3RoZXJzKQogICogICAgICAgIC0+bWFwcGluZy0+dHJlZV9sb2NrCiAgKgotICogIC0+aV9zZW0KKyAqICAtPmlfbXV0ZXgKICAqICAgIC0+aV9tbWFwX2xvY2sJCSh0cnVuY2F0ZS0+dW5tYXBfbWFwcGluZ19yYW5nZSkKICAqCiAgKiAgLT5tbWFwX3NlbQpAQCAtNzMsOSArNzQsOSBAQAogICogICAgLT5sb2NrX3BhZ2UJCShhY2Nlc3NfcHJvY2Vzc192bSkKICAqCiAgKiAgLT5tbWFwX3NlbQotICogICAgLT5pX3NlbQkJCShtc3luYykKKyAqICAgIC0+aV9tdXRleAkJCShtc3luYykKICAqCi0gKiAgLT5pX3NlbQorICogIC0+aV9tdXRleAogICogICAgLT5pX2FsbG9jX3NlbSAgICAgICAgICAgICAodmFyaW91cykKICAqCiAgKiAgLT5pbm9kZV9sb2NrCkBAIC05Myw2ICs5NCw3IEBACiAgKiAgICAtPnByaXZhdGVfbG9jawkJKHRyeV90b191bm1hcF9vbmUpCiAgKiAgICAtPnRyZWVfbG9jawkJKHRyeV90b191bm1hcF9vbmUpCiAgKiAgICAtPnpvbmUubHJ1X2xvY2sJCShmb2xsb3dfcGFnZS0+bWFya19wYWdlX2FjY2Vzc2VkKQorICogICAgLT56b25lLmxydV9sb2NrCQkoY2hlY2tfcHRlX3JhbmdlLT5pc29sYXRlX2xydV9wYWdlKQogICogICAgLT5wcml2YXRlX2xvY2sJCShwYWdlX3JlbW92ZV9ybWFwLT5zZXRfcGFnZV9kaXJ0eSkKICAqICAgIC0+dHJlZV9sb2NrCQkocGFnZV9yZW1vdmVfcm1hcC0+c2V0X3BhZ2VfZGlydHkpCiAgKiAgICAtPmlub2RlX2xvY2sJCShwYWdlX3JlbW92ZV9ybWFwLT5zZXRfcGFnZV9kaXJ0eSkKQEAgLTI3NiwxMSArMjc4LDExIEBACiAgKiBpbnRlZ3JpdHkiIG9wZXJhdGlvbi4gIEl0IHdhaXRzIHVwb24gaW4tZmxpZ2h0IHdyaXRlb3V0IGJlZm9yZSBzdGFydGluZyBhbmQKICAqIHdhaXRpbmcgdXBvbiBuZXcgd3JpdGVvdXQuICBJZiB0aGVyZSB3YXMgYW4gSU8gZXJyb3IsIHJldHVybiBpdC4KICAqCi0gKiBXZSBuZWVkIHRvIHJlLXRha2UgaV9zZW0gZHVyaW5nIHRoZSBnZW5lcmljX29zeW5jX2lub2RlIGxpc3Qgd2FsayBiZWNhdXNlCisgKiBXZSBuZWVkIHRvIHJlLXRha2UgaV9tdXRleCBkdXJpbmcgdGhlIGdlbmVyaWNfb3N5bmNfaW5vZGUgbGlzdCB3YWxrIGJlY2F1c2UKICAqIGl0IGlzIG90aGVyd2lzZSBsaXZlbG9ja2FibGUuCiAgKi8KIGludCBzeW5jX3BhZ2VfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCi0JCQlsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpCisJCQlsb2ZmX3QgcG9zLCBsb2ZmX3QgY291bnQpCiB7CiAJcGdvZmZfdCBzdGFydCA9IHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCXBnb2ZmX3QgZW5kID0gKHBvcyArIGNvdW50IC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKQEAgLTI5MCw5ICsyOTIsOSBAQAogCQlyZXR1cm4gMDsKIAlyZXQgPSBmaWxlbWFwX2ZkYXRhd3JpdGVfcmFuZ2UobWFwcGluZywgcG9zLCBwb3MgKyBjb3VudCAtIDEpOwogCWlmIChyZXQgPT0gMCkgewotCQlkb3duKCZpbm9kZS0+aV9zZW0pOworCQltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJCXJldCA9IGdlbmVyaWNfb3N5bmNfaW5vZGUoaW5vZGUsIG1hcHBpbmcsIE9TWU5DX01FVEFEQVRBKTsKLQkJdXAoJmlub2RlLT5pX3NlbSk7CisJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCX0KIAlpZiAocmV0ID09IDApCiAJCXJldCA9IHdhaXRfb25fcGFnZV93cml0ZWJhY2tfcmFuZ2UobWFwcGluZywgc3RhcnQsIGVuZCk7CkBAIC0zMDEsMTMgKzMwMywxMiBAQAogRVhQT1JUX1NZTUJPTChzeW5jX3BhZ2VfcmFuZ2UpOwogCiAvKgotICogTm90ZTogSG9sZGluZyBpX3NlbSBhY3Jvc3Mgc3luY19wYWdlX3JhbmdlX25vbG9jayBpcyBub3QgYSBnb29kIGlkZWEKKyAqIE5vdGU6IEhvbGRpbmcgaV9tdXRleCBhY3Jvc3Mgc3luY19wYWdlX3JhbmdlX25vbG9jayBpcyBub3QgYSBnb29kIGlkZWEKICAqIGFzIGl0IGZvcmNlcyBPX1NZTkMgd3JpdGVycyB0byBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIHNhbWUgZmlsZQogICogdG8gYmUgc2VyaWFsaXNlZCByaWdodCB1bnRpbCBpbyBjb21wbGV0aW9uLgogICovCi1zdGF0aWMgaW50IHN5bmNfcGFnZV9yYW5nZV9ub2xvY2soc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAotCQkJCSAgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KQoraW50IHN5bmNfcGFnZV9yYW5nZV9ub2xvY2soc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkgICBsb2ZmX3QgcG9zLCBsb2ZmX3QgY291bnQpCiB7CiAJcGdvZmZfdCBzdGFydCA9IHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCXBnb2ZmX3QgZW5kID0gKHBvcyArIGNvdW50IC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKQEAgLTMyMiw2ICszMjMsNyBAQAogCQlyZXQgPSB3YWl0X29uX3BhZ2Vfd3JpdGViYWNrX3JhbmdlKG1hcHBpbmcsIHN0YXJ0LCBlbmQpOwogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MKHN5bmNfcGFnZV9yYW5nZV9ub2xvY2spOwogCiAvKioKICAqIGZpbGVtYXBfZmRhdGF3YWl0IC0gd2FsayB0aGUgbGlzdCBvZiB1bmRlci13cml0ZWJhY2sgcGFnZXMgb2YgdGhlIGdpdmVuCkBAIC0zNDMsMzAgKzM0NSw0NCBAQAogCiBpbnQgZmlsZW1hcF93cml0ZV9hbmRfd2FpdChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZykKIHsKLQlpbnQgcmV0dmFsID0gMDsKKwlpbnQgZXJyID0gMDsKIAogCWlmIChtYXBwaW5nLT5ucnBhZ2VzKSB7Ci0JCXJldHZhbCA9IGZpbGVtYXBfZmRhdGF3cml0ZShtYXBwaW5nKTsKLQkJaWYgKHJldHZhbCA9PSAwKQotCQkJcmV0dmFsID0gZmlsZW1hcF9mZGF0YXdhaXQobWFwcGluZyk7CisJCWVyciA9IGZpbGVtYXBfZmRhdGF3cml0ZShtYXBwaW5nKTsKKwkJLyoKKwkJICogRXZlbiBpZiB0aGUgYWJvdmUgcmV0dXJuZWQgZXJyb3IsIHRoZSBwYWdlcyBtYXkgYmUKKwkJICogd3JpdHRlbiBwYXJ0aWFsbHkgKGUuZy4gLUVOT1NQQyksIHNvIHdlIHdhaXQgZm9yIGl0LgorCQkgKiBCdXQgdGhlIC1FSU8gaXMgc3BlY2lhbCBjYXNlLCBpdCBtYXkgaW5kaWNhdGUgdGhlIHdvcnN0CisJCSAqIHRoaW5nIChlLmcuIGJ1ZykgaGFwcGVuZWQsIHNvIHdlIGF2b2lkIHdhaXRpbmcgZm9yIGl0LgorCQkgKi8KKwkJaWYgKGVyciAhPSAtRUlPKSB7CisJCQlpbnQgZXJyMiA9IGZpbGVtYXBfZmRhdGF3YWl0KG1hcHBpbmcpOworCQkJaWYgKCFlcnIpCisJCQkJZXJyID0gZXJyMjsKKwkJfQogCX0KLQlyZXR1cm4gcmV0dmFsOworCXJldHVybiBlcnI7CiB9CitFWFBPUlRfU1lNQk9MKGZpbGVtYXBfd3JpdGVfYW5kX3dhaXQpOwogCiBpbnQgZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJCQkgbG9mZl90IGxzdGFydCwgbG9mZl90IGxlbmQpCiB7Ci0JaW50IHJldHZhbCA9IDA7CisJaW50IGVyciA9IDA7CiAKIAlpZiAobWFwcGluZy0+bnJwYWdlcykgewotCQlyZXR2YWwgPSBfX2ZpbGVtYXBfZmRhdGF3cml0ZV9yYW5nZShtYXBwaW5nLCBsc3RhcnQsIGxlbmQsCi0JCQkJCQkgICAgV0JfU1lOQ19BTEwpOwotCQlpZiAocmV0dmFsID09IDApCi0JCQlyZXR2YWwgPSB3YWl0X29uX3BhZ2Vfd3JpdGViYWNrX3JhbmdlKG1hcHBpbmcsCi0JCQkJCQkgICAgbHN0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQsCi0JCQkJCQkgICAgbGVuZCA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJZXJyID0gX19maWxlbWFwX2ZkYXRhd3JpdGVfcmFuZ2UobWFwcGluZywgbHN0YXJ0LCBsZW5kLAorCQkJCQkJIFdCX1NZTkNfQUxMKTsKKwkJLyogU2VlIGNvbW1lbnQgb2YgZmlsZW1hcF93cml0ZV9hbmRfd2FpdCgpICovCisJCWlmIChlcnIgIT0gLUVJTykgeworCQkJaW50IGVycjIgPSB3YWl0X29uX3BhZ2Vfd3JpdGViYWNrX3JhbmdlKG1hcHBpbmcsCisJCQkJCQlsc3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVCwKKwkJCQkJCWxlbmQgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJCQlpZiAoIWVycikKKwkJCQllcnIgPSBlcnIyOworCQl9CiAJfQotCXJldHVybiByZXR2YWw7CisJcmV0dXJuIGVycjsKIH0KIAogLyoKQEAgLTE4NzgsNyArMTg5NCw3IEBACiAJLyoKIAkgKiBTeW5jIHRoZSBmcyBtZXRhZGF0YSBidXQgbm90IHRoZSBtaW5vciBpbm9kZSBjaGFuZ2VzIGFuZAogCSAqIG9mIGNvdXJzZSBub3QgdGhlIGRhdGEgYXMgd2UgZGlkIGRpcmVjdCBETUEgZm9yIHRoZSBJTy4KLQkgKiBpX3NlbSBpcyBoZWxkLCB3aGljaCBwcm90ZWN0cyBnZW5lcmljX29zeW5jX2lub2RlKCkgZnJvbQorCSAqIGlfbXV0ZXggaXMgaGVsZCwgd2hpY2ggcHJvdGVjdHMgZ2VuZXJpY19vc3luY19pbm9kZSgpIGZyb20KIAkgKiBsaXZlbG9ja2luZy4KIAkgKi8KIAlpZiAod3JpdHRlbiA+PSAwICYmICgoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykgfHwgSVNfU1lOQyhpbm9kZSkpKSB7CkBAIC0yMDk0LDcgKzIxMTAsNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCi0JaW5vZGVfdXBkYXRlX3RpbWUoaW5vZGUsIDEpOworCWZpbGVfdXBkYXRlX3RpbWUoZmlsZSk7CiAKIAkvKiBjb2FsZXNjZSB0aGUgaW92ZWNzIGFuZCBnbyBkaXJlY3QtdG8tQklPIGZvciBPX0RJUkVDVCAqLwogCWlmICh1bmxpa2VseShmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1QpKSB7CkBAIC0yMTgxLDEwICsyMTk3LDEwIEBACiAKIAlCVUdfT04oaW9jYi0+a2lfcG9zICE9IHBvcyk7CiAKLQlkb3duKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAlyZXQgPSBfX2dlbmVyaWNfZmlsZV9haW9fd3JpdGVfbm9sb2NrKGlvY2IsICZsb2NhbF9pb3YsIDEsCiAJCQkJCQkmaW9jYi0+a2lfcG9zKTsKLQl1cCgmaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAogCWlmIChyZXQgPiAwICYmICgoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykgfHwgSVNfU1lOQyhpbm9kZSkpKSB7CiAJCXNzaXplX3QgZXJyOwpAQCAtMjIwNiw5ICsyMjIyLDkgQEAKIAlzdHJ1Y3QgaW92ZWMgbG9jYWxfaW92ID0geyAuaW92X2Jhc2UgPSAodm9pZCBfX3VzZXIgKilidWYsCiAJCQkJCS5pb3ZfbGVuID0gY291bnQgfTsKIAotCWRvd24oJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJldCA9IF9fZ2VuZXJpY19maWxlX3dyaXRlX25vbG9jayhmaWxlLCAmbG9jYWxfaW92LCAxLCBwcG9zKTsKLQl1cCgmaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAogCWlmIChyZXQgPiAwICYmICgoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykgfHwgSVNfU1lOQyhpbm9kZSkpKSB7CiAJCXNzaXplX3QgZXJyOwpAQCAtMjI0Miw5ICsyMjU4LDkgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKIAlzc2l6ZV90IHJldDsKIAotCWRvd24oJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJldCA9IF9fZ2VuZXJpY19maWxlX3dyaXRlX25vbG9jayhmaWxlLCBpb3YsIG5yX3NlZ3MsIHBwb3MpOwotCXVwKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCiAJaWYgKHJldCA+IDAgJiYgKChmaWxlLT5mX2ZsYWdzICYgT19TWU5DKSB8fCBJU19TWU5DKGlub2RlKSkpIHsKIAkJaW50IGVycjsKQEAgLTIyNTgsNyArMjI3NCw3IEBACiBFWFBPUlRfU1lNQk9MKGdlbmVyaWNfZmlsZV93cml0ZXYpOwogCiAvKgotICogQ2FsbGVkIHVuZGVyIGlfc2VtIGZvciB3cml0ZXMgdG8gU19JU1JFRyBmaWxlcy4gICBSZXR1cm5zIC1FSU8gaWYgc29tZXRoaW5nCisgKiBDYWxsZWQgdW5kZXIgaV9tdXRleCBmb3Igd3JpdGVzIHRvIFNfSVNSRUcgZmlsZXMuICAgUmV0dXJucyAtRUlPIGlmIHNvbWV0aGluZwogICogd2VudCB3cm9uZyBkdXJpbmcgcGFnZWNhY2hlIHNob290ZG93bi4KICAqLwogc3RhdGljIHNzaXplX3QKZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXBfeGlwLmMgYi9tbS9maWxlbWFwX3hpcC5jCmluZGV4IDljZjY4N2UuLmI5NjBhYzggMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXBfeGlwLmMKKysrIGIvbW0vZmlsZW1hcF94aXAuYwpAQCAtMzM4LDcgKzMzOCw3IEBACiAJKnBwb3MgPSBwb3M7CiAJLyoKIAkgKiBObyBuZWVkIHRvIHVzZSBpX3NpemVfcmVhZCgpIGhlcmUsIHRoZSBpX3NpemUKLQkgKiBjYW5ub3QgY2hhbmdlIHVuZGVyIHVzIGJlY2F1c2Ugd2UgaG9sZCBpX3NlbS4KKwkgKiBjYW5ub3QgY2hhbmdlIHVuZGVyIHVzIGJlY2F1c2Ugd2UgaG9sZCBpX211dGV4LgogCSAqLwogCWlmIChwb3MgPiBpbm9kZS0+aV9zaXplKSB7CiAJCWlfc2l6ZV93cml0ZShpbm9kZSwgcG9zKTsKQEAgLTM1OCw3ICszNTgsNyBAQAogCWxvZmZfdCBwb3M7CiAJc3NpemVfdCByZXQ7CiAKLQlkb3duKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAogCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWYsIGxlbikpIHsKIAkJcmV0PS1FRkFVTFQ7CkBAIC0zODMsMTQgKzM4MywxNCBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2JhY2tpbmc7CiAKLQlpbm9kZV91cGRhdGVfdGltZShpbm9kZSwgMSk7CisJZmlsZV91cGRhdGVfdGltZShmaWxwKTsKIAogCXJldCA9IF9feGlwX2ZpbGVfd3JpdGUgKGZpbHAsIGJ1ZiwgY291bnQsIHBvcywgcHBvcyk7CiAKICBvdXRfYmFja2luZzoKIAljdXJyZW50LT5iYWNraW5nX2Rldl9pbmZvID0gTlVMTDsKICBvdXRfdXA6Ci0JdXAoJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHhpcF9maWxlX3dyaXRlKTsKZGlmZiAtLWdpdCBhL21tL2h1Z2V0bGIuYyBiL21tL2h1Z2V0bGIuYwppbmRleCBmNGM0M2Q3Li5iMjFkNzhjIDEwMDY0NAotLS0gYS9tbS9odWdldGxiLmMKKysrIGIvbW0vaHVnZXRsYi5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtcG9saWN5Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1c2V0Lmg+CiAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC00OCw3ICs0OSw4IEBACiAKIAlmb3IgKHogPSB6b25lbGlzdC0+em9uZXM7ICp6OyB6KyspIHsKIAkJbmlkID0gKCp6KS0+em9uZV9wZ2RhdC0+bm9kZV9pZDsKLQkJaWYgKCFsaXN0X2VtcHR5KCZodWdlcGFnZV9mcmVlbGlzdHNbbmlkXSkpCisJCWlmIChjcHVzZXRfem9uZV9hbGxvd2VkKCp6LCBHRlBfSElHSFVTRVIpICYmCisJCSAgICAhbGlzdF9lbXB0eSgmaHVnZXBhZ2VfZnJlZWxpc3RzW25pZF0pKQogCQkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9tbS9tZW1vcnkuYyBiL21tL21lbW9yeS5jCmluZGV4IDcxOTdmOWIuLjdhMTFkZGQgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeS5jCisrKyBiL21tL21lbW9yeS5jCkBAIC0xNzg0LDEzICsxNzg0LDEzIEBACiAJaWYgKCFpbm9kZS0+aV9vcCB8fCAhaW5vZGUtPmlfb3AtPnRydW5jYXRlX3JhbmdlKQogCQlyZXR1cm4gLUVOT1NZUzsKIAotCWRvd24oJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCWRvd25fd3JpdGUoJmlub2RlLT5pX2FsbG9jX3NlbSk7CiAJdW5tYXBfbWFwcGluZ19yYW5nZShtYXBwaW5nLCBvZmZzZXQsIChlbmQgLSBvZmZzZXQpLCAxKTsKIAl0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShtYXBwaW5nLCBvZmZzZXQsIGVuZCk7CiAJaW5vZGUtPmlfb3AtPnRydW5jYXRlX3JhbmdlKGlub2RlLCBvZmZzZXQsIGVuZCk7CiAJdXBfd3JpdGUoJmlub2RlLT5pX2FsbG9jX3NlbSk7Ci0JdXAoJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIyNjcsNiArMjI2Nyw4IEBACiAJcmV0dXJuIGhhbmRsZV9wdGVfZmF1bHQobW0sIHZtYSwgYWRkcmVzcywgcHRlLCBwbWQsIHdyaXRlX2FjY2Vzcyk7CiB9CiAKK0VYUE9SVF9TWU1CT0xfR1BMKF9faGFuZGxlX21tX2ZhdWx0KTsKKwogI2lmbmRlZiBfX1BBR0VUQUJMRV9QVURfRk9MREVECiAvKgogICogQWxsb2NhdGUgcGFnZSB1cHBlciBkaXJlY3RvcnkuCmRpZmYgLS1naXQgYS9tbS9tZW1wb2xpY3kuYyBiL21tL21lbXBvbGljeS5jCmluZGV4IDBmMWQyYjguLjczNzkwMTggMTAwNjQ0Ci0tLSBhL21tL21lbXBvbGljeS5jCisrKyBiL21tL21lbXBvbGljeS5jCkBAIC04Myw5ICs4MywxOCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCisvKiBJbnRlcm5hbCBmbGFncyAqLworI2RlZmluZSBNUE9MX01GX0RJU0NPTlRJR19PSyAoTVBPTF9NRl9JTlRFUk5BTCA8PCAwKQkvKiBTa2lwIGNoZWNrcyBmb3IgY29udGludW91cyB2bWFzICovCisjZGVmaW5lIE1QT0xfTUZfSU5WRVJUIChNUE9MX01GX0lOVEVSTkFMIDw8IDEpCQkvKiBJbnZlcnQgY2hlY2sgZm9yIG5vZGVtYXNrICovCisjZGVmaW5lIE1QT0xfTUZfU1RBVFMgKE1QT0xfTUZfSU5URVJOQUwgPDwgMikJCS8qIEdhdGhlciBzdGF0aXN0aWNzICovCisKIHN0YXRpYyBrbWVtX2NhY2hlX3QgKnBvbGljeV9jYWNoZTsKIHN0YXRpYyBrbWVtX2NhY2hlX3QgKnNuX2NhY2hlOwogCkBAIC0xNzEsMTIgKzE4MCwxOSBAQAogCQlicmVhazsKIAl9CiAJcG9saWN5LT5wb2xpY3kgPSBtb2RlOworCXBvbGljeS0+Y3B1c2V0X21lbXNfYWxsb3dlZCA9IGNwdXNldF9tZW1zX2FsbG93ZWQoY3VycmVudCk7CiAJcmV0dXJuIHBvbGljeTsKIH0KIAotLyogRW5zdXJlIGFsbCBleGlzdGluZyBwYWdlcyBmb2xsb3cgdGhlIHBvbGljeS4gKi8KK3N0YXRpYyB2b2lkIGdhdGhlcl9zdGF0cyhzdHJ1Y3QgcGFnZSAqLCB2b2lkICopOworc3RhdGljIHZvaWQgbWlncmF0ZV9wYWdlX2FkZChzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqcGFnZWxpc3QsCisJCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7CisKKy8qIFNjYW4gdGhyb3VnaCBwYWdlcyBjaGVja2luZyBpZiBwYWdlcyBmb2xsb3cgY2VydGFpbiBjb25kaXRpb25zLiAqLwogc3RhdGljIGludCBjaGVja19wdGVfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsCi0JCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsIG5vZGVtYXNrX3QgKm5vZGVzKQorCQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLAorCQljb25zdCBub2RlbWFza190ICpub2RlcywgdW5zaWduZWQgbG9uZyBmbGFncywKKwkJdm9pZCAqcHJpdmF0ZSkKIHsKIAlwdGVfdCAqb3JpZ19wdGU7CiAJcHRlX3QgKnB0ZTsKQEAgLTE5Miw4ICsyMDgsMjggQEAKIAkJcGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgKnB0ZSk7CiAJCWlmICghcGFnZSkKIAkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBUaGUgY2hlY2sgZm9yIFBhZ2VSZXNlcnZlZCBoZXJlIGlzIGltcG9ydGFudCB0byBhdm9pZAorCQkgKiBoYW5kbGluZyB6ZXJvIHBhZ2VzIGFuZCBvdGhlciBwYWdlcyB0aGF0IG1heSBoYXZlIGJlZW4KKwkJICogbWFya2VkIHNwZWNpYWwgYnkgdGhlIHN5c3RlbS4KKwkJICoKKwkJICogSWYgdGhlIFBhZ2VSZXNlcnZlZCB3b3VsZCBub3QgYmUgY2hlY2tlZCBoZXJlIHRoZW4gZi5lLgorCQkgKiB0aGUgbG9jYXRpb24gb2YgdGhlIHplcm8gcGFnZSBjb3VsZCBoYXZlIGFuIGluZmx1ZW5jZQorCQkgKiBvbiBNUE9MX01GX1NUUklDVCwgemVybyBwYWdlcyB3b3VsZCBiZSBjb3VudGVkIGZvcgorCQkgKiB0aGUgcGVyIG5vZGUgc3RhdHMsIGFuZCB0aGVyZSB3b3VsZCBiZSB1c2VsZXNzIGF0dGVtcHRzCisJCSAqIHRvIHB1dCB6ZXJvIHBhZ2VzIG9uIHRoZSBtaWdyYXRpb24gbGlzdC4KKwkJICovCisJCWlmIChQYWdlUmVzZXJ2ZWQocGFnZSkpCisJCQljb250aW51ZTsKIAkJbmlkID0gcGFnZV90b19uaWQocGFnZSk7Ci0JCWlmICghbm9kZV9pc3NldChuaWQsICpub2RlcykpCisJCWlmIChub2RlX2lzc2V0KG5pZCwgKm5vZGVzKSA9PSAhIShmbGFncyAmIE1QT0xfTUZfSU5WRVJUKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChmbGFncyAmIE1QT0xfTUZfU1RBVFMpCisJCQlnYXRoZXJfc3RhdHMocGFnZSwgcHJpdmF0ZSk7CisJCWVsc2UgaWYgKGZsYWdzICYgKE1QT0xfTUZfTU9WRSB8IE1QT0xfTUZfTU9WRV9BTEwpKQorCQkJbWlncmF0ZV9wYWdlX2FkZChwYWdlLCBwcml2YXRlLCBmbGFncyk7CisJCWVsc2UKIAkJCWJyZWFrOwogCX0gd2hpbGUgKHB0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSwgYWRkciAhPSBlbmQpOwogCXB0ZV91bm1hcF91bmxvY2sob3JpZ19wdGUsIHB0bCk7CkBAIC0yMDEsNyArMjM3LDkgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQgY2hlY2tfcG1kX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwdWRfdCAqcHVkLAotCQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLCBub2RlbWFza190ICpub2RlcykKKwkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwKKwkJY29uc3Qgbm9kZW1hc2tfdCAqbm9kZXMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCXZvaWQgKnByaXZhdGUpCiB7CiAJcG1kX3QgKnBtZDsKIAl1bnNpZ25lZCBsb25nIG5leHQ7CkBAIC0yMTEsMTQgKzI0OSwxNyBAQAogCQluZXh0ID0gcG1kX2FkZHJfZW5kKGFkZHIsIGVuZCk7CiAJCWlmIChwbWRfbm9uZV9vcl9jbGVhcl9iYWQocG1kKSkKIAkJCWNvbnRpbnVlOwotCQlpZiAoY2hlY2tfcHRlX3JhbmdlKHZtYSwgcG1kLCBhZGRyLCBuZXh0LCBub2RlcykpCisJCWlmIChjaGVja19wdGVfcmFuZ2Uodm1hLCBwbWQsIGFkZHIsIG5leHQsIG5vZGVzLAorCQkJCSAgICBmbGFncywgcHJpdmF0ZSkpCiAJCQlyZXR1cm4gLUVJTzsKIAl9IHdoaWxlIChwbWQrKywgYWRkciA9IG5leHQsIGFkZHIgIT0gZW5kKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgY2hlY2tfcHVkX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwZ2RfdCAqcGdkLAotCQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLCBub2RlbWFza190ICpub2RlcykKKwkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwKKwkJY29uc3Qgbm9kZW1hc2tfdCAqbm9kZXMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCXZvaWQgKnByaXZhdGUpCiB7CiAJcHVkX3QgKnB1ZDsKIAl1bnNpZ25lZCBsb25nIG5leHQ7CkBAIC0yMjgsMTQgKzI2OSwxNyBAQAogCQluZXh0ID0gcHVkX2FkZHJfZW5kKGFkZHIsIGVuZCk7CiAJCWlmIChwdWRfbm9uZV9vcl9jbGVhcl9iYWQocHVkKSkKIAkJCWNvbnRpbnVlOwotCQlpZiAoY2hlY2tfcG1kX3JhbmdlKHZtYSwgcHVkLCBhZGRyLCBuZXh0LCBub2RlcykpCisJCWlmIChjaGVja19wbWRfcmFuZ2Uodm1hLCBwdWQsIGFkZHIsIG5leHQsIG5vZGVzLAorCQkJCSAgICBmbGFncywgcHJpdmF0ZSkpCiAJCQlyZXR1cm4gLUVJTzsKIAl9IHdoaWxlIChwdWQrKywgYWRkciA9IG5leHQsIGFkZHIgIT0gZW5kKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgY2hlY2tfcGdkX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLCBub2RlbWFza190ICpub2RlcykKKwkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwKKwkJY29uc3Qgbm9kZW1hc2tfdCAqbm9kZXMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCXZvaWQgKnByaXZhdGUpCiB7CiAJcGdkX3QgKnBnZDsKIAl1bnNpZ25lZCBsb25nIG5leHQ7CkBAIC0yNDUsMzYgKzI4OSw2MSBAQAogCQluZXh0ID0gcGdkX2FkZHJfZW5kKGFkZHIsIGVuZCk7CiAJCWlmIChwZ2Rfbm9uZV9vcl9jbGVhcl9iYWQocGdkKSkKIAkJCWNvbnRpbnVlOwotCQlpZiAoY2hlY2tfcHVkX3JhbmdlKHZtYSwgcGdkLCBhZGRyLCBuZXh0LCBub2RlcykpCisJCWlmIChjaGVja19wdWRfcmFuZ2Uodm1hLCBwZ2QsIGFkZHIsIG5leHQsIG5vZGVzLAorCQkJCSAgICBmbGFncywgcHJpdmF0ZSkpCiAJCQlyZXR1cm4gLUVJTzsKIAl9IHdoaWxlIChwZ2QrKywgYWRkciA9IG5leHQsIGFkZHIgIT0gZW5kKTsKIAlyZXR1cm4gMDsKIH0KIAotLyogU3RlcCAxOiBjaGVjayB0aGUgcmFuZ2UgKi8KKy8qIENoZWNrIGlmIGEgdm1hIGlzIG1pZ3JhdGFibGUgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHZtYV9taWdyYXRhYmxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWlmICh2bWEtPnZtX2ZsYWdzICYgKAorCQlWTV9MT0NLRUR8Vk1fSU98Vk1fSFVHRVRMQnxWTV9QRk5NQVB8Vk1fUkVTRVJWRUQpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIENoZWNrIGlmIGFsbCBwYWdlcyBpbiBhIHJhbmdlIGFyZSBvbiBhIHNldCBvZiBub2Rlcy4KKyAqIElmIHBhZ2VsaXN0ICE9IE5VTEwgdGhlbiBpc29sYXRlIHBhZ2VzIGZyb20gdGhlIExSVSBhbmQKKyAqIHB1dCB0aGVtIG9uIHRoZSBwYWdlbGlzdC4KKyAqLwogc3RhdGljIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqCiBjaGVja19yYW5nZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsCi0JICAgIG5vZGVtYXNrX3QgKm5vZGVzLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCQljb25zdCBub2RlbWFza190ICpub2RlcywgdW5zaWduZWQgbG9uZyBmbGFncywgdm9pZCAqcHJpdmF0ZSkKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZmlyc3QsICp2bWEsICpwcmV2OwogCisJLyogQ2xlYXIgdGhlIExSVSBsaXN0cyBzbyBwYWdlcyBjYW4gYmUgaXNvbGF0ZWQgKi8KKwlpZiAoZmxhZ3MgJiAoTVBPTF9NRl9NT1ZFIHwgTVBPTF9NRl9NT1ZFX0FMTCkpCisJCWxydV9hZGRfZHJhaW5fYWxsKCk7CisKIAlmaXJzdCA9IGZpbmRfdm1hKG1tLCBzdGFydCk7CiAJaWYgKCFmaXJzdCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CiAJcHJldiA9IE5VTEw7CiAJZm9yICh2bWEgPSBmaXJzdDsgdm1hICYmIHZtYS0+dm1fc3RhcnQgPCBlbmQ7IHZtYSA9IHZtYS0+dm1fbmV4dCkgewotCQlpZiAoIXZtYS0+dm1fbmV4dCAmJiB2bWEtPnZtX2VuZCA8IGVuZCkKLQkJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOwotCQlpZiAocHJldiAmJiBwcmV2LT52bV9lbmQgPCB2bWEtPnZtX3N0YXJ0KQotCQkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7Ci0JCWlmICgoZmxhZ3MgJiBNUE9MX01GX1NUUklDVCkgJiYgIWlzX3ZtX2h1Z2V0bGJfcGFnZSh2bWEpKSB7CisJCWlmICghKGZsYWdzICYgTVBPTF9NRl9ESVNDT05USUdfT0spKSB7CisJCQlpZiAoIXZtYS0+dm1fbmV4dCAmJiB2bWEtPnZtX2VuZCA8IGVuZCkKKwkJCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKKwkJCWlmIChwcmV2ICYmIHByZXYtPnZtX2VuZCA8IHZtYS0+dm1fc3RhcnQpCisJCQkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CisJCX0KKwkJaWYgKCFpc192bV9odWdldGxiX3BhZ2Uodm1hKSAmJgorCQkgICAgKChmbGFncyAmIE1QT0xfTUZfU1RSSUNUKSB8fAorCQkgICAgICgoZmxhZ3MgJiAoTVBPTF9NRl9NT1ZFIHwgTVBPTF9NRl9NT1ZFX0FMTCkpICYmCisJCQkJdm1hX21pZ3JhdGFibGUodm1hKSkpKSB7CiAJCQl1bnNpZ25lZCBsb25nIGVuZHZtYSA9IHZtYS0+dm1fZW5kOworCiAJCQlpZiAoZW5kdm1hID4gZW5kKQogCQkJCWVuZHZtYSA9IGVuZDsKIAkJCWlmICh2bWEtPnZtX3N0YXJ0ID4gc3RhcnQpCiAJCQkJc3RhcnQgPSB2bWEtPnZtX3N0YXJ0OwotCQkJZXJyID0gY2hlY2tfcGdkX3JhbmdlKHZtYSwgc3RhcnQsIGVuZHZtYSwgbm9kZXMpOworCQkJZXJyID0gY2hlY2tfcGdkX3JhbmdlKHZtYSwgc3RhcnQsIGVuZHZtYSwgbm9kZXMsCisJCQkJCQlmbGFncywgcHJpdmF0ZSk7CiAJCQlpZiAoZXJyKSB7CiAJCQkJZmlyc3QgPSBFUlJfUFRSKGVycik7CiAJCQkJYnJlYWs7CkBAIC0zMzMsNTMgKzQwMiwxMiBAQAogCWlmICghbm9kZXMpCiAJCXJldHVybiAwOwogCi0JLyogVXBkYXRlIGN1cnJlbnQgbWVtc19hbGxvd2VkICovCi0JY3B1c2V0X3VwZGF0ZV9jdXJyZW50X21lbXNfYWxsb3dlZCgpOwotCS8qIElnbm9yZSBub2RlcyBub3Qgc2V0IGluIGN1cnJlbnQtPm1lbXNfYWxsb3dlZCAqLwotCWNwdXNldF9yZXN0cmljdF90b19tZW1zX2FsbG93ZWQobm9kZXMtPmJpdHMpOworCWNwdXNldF91cGRhdGVfdGFza19tZW1vcnlfc3RhdGUoKTsKKwlpZiAoIWNwdXNldF9ub2Rlc19zdWJzZXRfY3VycmVudF9tZW1zX2FsbG93ZWQoKm5vZGVzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIG1wb2xfY2hlY2tfcG9saWN5KG1vZGUsIG5vZGVzKTsKIH0KIAotbG9uZyBkb19tYmluZCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwKLQkJdW5zaWduZWQgbG9uZyBtb2RlLCBub2RlbWFza190ICpubWFzaywgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKLQlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwotCXN0cnVjdCBtZW1wb2xpY3kgKm5ldzsKLQl1bnNpZ25lZCBsb25nIGVuZDsKLQlpbnQgZXJyOwotCi0JaWYgKChmbGFncyAmIH4odW5zaWduZWQgbG9uZykoTVBPTF9NRl9TVFJJQ1QpKSB8fCBtb2RlID4gTVBPTF9NQVgpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChzdGFydCAmIH5QQUdFX01BU0spCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChtb2RlID09IE1QT0xfREVGQVVMVCkKLQkJZmxhZ3MgJj0gfk1QT0xfTUZfU1RSSUNUOwotCWxlbiA9IChsZW4gKyBQQUdFX1NJWkUgLSAxKSAmIFBBR0VfTUFTSzsKLQllbmQgPSBzdGFydCArIGxlbjsKLQlpZiAoZW5kIDwgc3RhcnQpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChlbmQgPT0gc3RhcnQpCi0JCXJldHVybiAwOwotCWlmIChtcG9sX2NoZWNrX3BvbGljeShtb2RlLCBubWFzaykpCi0JCXJldHVybiAtRUlOVkFMOwotCW5ldyA9IG1wb2xfbmV3KG1vZGUsIG5tYXNrKTsKLQlpZiAoSVNfRVJSKG5ldykpCi0JCXJldHVybiBQVFJfRVJSKG5ldyk7Ci0KLQlQRHByaW50aygibWJpbmQgJWx4LSVseCBtb2RlOiVsZCBub2RlczolbHhcbiIsc3RhcnQsc3RhcnQrbGVuLAotCQkJbW9kZSxub2Rlc19hZGRyKG5vZGVzKVswXSk7Ci0KLQlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwotCXZtYSA9IGNoZWNrX3JhbmdlKG1tLCBzdGFydCwgZW5kLCBubWFzaywgZmxhZ3MpOwotCWVyciA9IFBUUl9FUlIodm1hKTsKLQlpZiAoIUlTX0VSUih2bWEpKQotCQllcnIgPSBtYmluZF9yYW5nZSh2bWEsIHN0YXJ0LCBlbmQsIG5ldyk7Ci0JdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7Ci0JbXBvbF9mcmVlKG5ldyk7Ci0JcmV0dXJuIGVycjsKLX0KLQogLyogU2V0IHRoZSBwcm9jZXNzIG1lbW9yeSBwb2xpY3kgKi8KIGxvbmcgZG9fc2V0X21lbXBvbGljeShpbnQgbW9kZSwgbm9kZW1hc2tfdCAqbm9kZXMpCiB7CkBAIC00NDgsNyArNDc2LDcgQEAKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7CiAJc3RydWN0IG1lbXBvbGljeSAqcG9sID0gY3VycmVudC0+bWVtcG9saWN5OwogCi0JY3B1c2V0X3VwZGF0ZV9jdXJyZW50X21lbXNfYWxsb3dlZCgpOworCWNwdXNldF91cGRhdGVfdGFza19tZW1vcnlfc3RhdGUoKTsKIAlpZiAoZmxhZ3MgJiB+KHVuc2lnbmVkIGxvbmcpKE1QT0xfRl9OT0RFfE1QT0xfRl9BRERSKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGZsYWdzICYgTVBPTF9GX0FERFIpIHsKQEAgLTUwMCwxMSArNTI4LDE0MSBAQAogfQogCiAvKgorICogcGFnZSBtaWdyYXRpb24KKyAqLworCitzdGF0aWMgdm9pZCBtaWdyYXRlX3BhZ2VfYWRkKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlbGlzdCwKKwkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCS8qCisJICogQXZvaWQgbWlncmF0aW5nIGEgcGFnZSB0aGF0IGlzIHNoYXJlZCB3aXRoIG90aGVycy4KKwkgKi8KKwlpZiAoKGZsYWdzICYgTVBPTF9NRl9NT1ZFX0FMTCkgfHwgcGFnZV9tYXBjb3VudChwYWdlKSA9PSAxKSB7CisJCWlmIChpc29sYXRlX2xydV9wYWdlKHBhZ2UpKQorCQkJbGlzdF9hZGQoJnBhZ2UtPmxydSwgcGFnZWxpc3QpOworCX0KK30KKworc3RhdGljIGludCBzd2FwX3BhZ2VzKHN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VsaXN0KQoreworCUxJU1RfSEVBRChtb3ZlZCk7CisJTElTVF9IRUFEKGZhaWxlZCk7CisJaW50IG47CisKKwluID0gbWlncmF0ZV9wYWdlcyhwYWdlbGlzdCwgTlVMTCwgJm1vdmVkLCAmZmFpbGVkKTsKKwlwdXRiYWNrX2xydV9wYWdlcygmZmFpbGVkKTsKKwlwdXRiYWNrX2xydV9wYWdlcygmbW92ZWQpOworCisJcmV0dXJuIG47Cit9CisKKy8qCisgKiBGb3Igbm93IG1pZ3JhdGVfcGFnZXMgc2ltcGx5IHN3YXBzIG91dCB0aGUgcGFnZXMgZnJvbSBub2RlcyB0aGF0IGFyZSBpbgorICogdGhlIHNvdXJjZSBzZXQgYnV0IG5vdCBpbiB0aGUgdGFyZ2V0IHNldC4gSW4gdGhlIGZ1dHVyZSwgd2Ugd291bGQKKyAqIHdhbnQgYSBmdW5jdGlvbiB0aGF0IG1vdmVzIHBhZ2VzIGJldHdlZW4gdGhlIHR3byBub2Rlc2V0cyBpbiBzdWNoCisgKiBhIHdheSBhcyB0byBwcmVzZXJ2ZSB0aGUgcGh5c2ljYWwgbGF5b3V0IGFzIG11Y2ggYXMgcG9zc2libGUuCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhZ2UgdGhhdCBjb3VsZCBub3QgYmUgbW92ZWQuCisgKi8KK2ludCBkb19taWdyYXRlX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCWNvbnN0IG5vZGVtYXNrX3QgKmZyb21fbm9kZXMsIGNvbnN0IG5vZGVtYXNrX3QgKnRvX25vZGVzLCBpbnQgZmxhZ3MpCit7CisJTElTVF9IRUFEKHBhZ2VsaXN0KTsKKwlpbnQgY291bnQgPSAwOworCW5vZGVtYXNrX3Qgbm9kZXM7CisKKwlub2Rlc19hbmRub3Qobm9kZXMsICpmcm9tX25vZGVzLCAqdG9fbm9kZXMpOworCisJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOworCWNoZWNrX3JhbmdlKG1tLCBtbS0+bW1hcC0+dm1fc3RhcnQsIFRBU0tfU0laRSwgJm5vZGVzLAorCQkJZmxhZ3MgfCBNUE9MX01GX0RJU0NPTlRJR19PSywgJnBhZ2VsaXN0KTsKKworCWlmICghbGlzdF9lbXB0eSgmcGFnZWxpc3QpKSB7CisJCWNvdW50ID0gc3dhcF9wYWdlcygmcGFnZWxpc3QpOworCQlwdXRiYWNrX2xydV9wYWdlcygmcGFnZWxpc3QpOworCX0KKworCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJcmV0dXJuIGNvdW50OworfQorCitsb25nIGRvX21iaW5kKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuLAorCQl1bnNpZ25lZCBsb25nIG1vZGUsIG5vZGVtYXNrX3QgKm5tYXNrLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CisJc3RydWN0IG1lbXBvbGljeSAqbmV3OworCXVuc2lnbmVkIGxvbmcgZW5kOworCWludCBlcnI7CisJTElTVF9IRUFEKHBhZ2VsaXN0KTsKKworCWlmICgoZmxhZ3MgJiB+KHVuc2lnbmVkIGxvbmcpKE1QT0xfTUZfU1RSSUNUIHwKKwkJCQkgICAgICBNUE9MX01GX01PVkUgfCBNUE9MX01GX01PVkVfQUxMKSkKKwkgICAgfHwgbW9kZSA+IE1QT0xfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoKGZsYWdzICYgTVBPTF9NRl9NT1ZFX0FMTCkgJiYgIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoc3RhcnQgJiB+UEFHRV9NQVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtb2RlID09IE1QT0xfREVGQVVMVCkKKwkJZmxhZ3MgJj0gfk1QT0xfTUZfU1RSSUNUOworCisJbGVuID0gKGxlbiArIFBBR0VfU0laRSAtIDEpICYgUEFHRV9NQVNLOworCWVuZCA9IHN0YXJ0ICsgbGVuOworCisJaWYgKGVuZCA8IHN0YXJ0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZW5kID09IHN0YXJ0KQorCQlyZXR1cm4gMDsKKworCWlmIChtcG9sX2NoZWNrX3BvbGljeShtb2RlLCBubWFzaykpCisJCXJldHVybiAtRUlOVkFMOworCisJbmV3ID0gbXBvbF9uZXcobW9kZSwgbm1hc2spOworCWlmIChJU19FUlIobmV3KSkKKwkJcmV0dXJuIFBUUl9FUlIobmV3KTsKKworCS8qCisJICogSWYgd2UgYXJlIHVzaW5nIHRoZSBkZWZhdWx0IHBvbGljeSB0aGVuIG9wZXJhdGlvbgorCSAqIG9uIGRpc2NvbnRpbnVvdXMgYWRkcmVzcyBzcGFjZXMgaXMgb2theSBhZnRlciBhbGwKKwkgKi8KKwlpZiAoIW5ldykKKwkJZmxhZ3MgfD0gTVBPTF9NRl9ESVNDT05USUdfT0s7CisKKwlQRHByaW50aygibWJpbmQgJWx4LSVseCBtb2RlOiVsZCBub2RlczolbHhcbiIsc3RhcnQsc3RhcnQrbGVuLAorCQkJbW9kZSxub2Rlc19hZGRyKG5vZGVzKVswXSk7CisKKwlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCXZtYSA9IGNoZWNrX3JhbmdlKG1tLCBzdGFydCwgZW5kLCBubWFzaywKKwkJCSAgZmxhZ3MgfCBNUE9MX01GX0lOVkVSVCwgJnBhZ2VsaXN0KTsKKworCWVyciA9IFBUUl9FUlIodm1hKTsKKwlpZiAoIUlTX0VSUih2bWEpKSB7CisJCWludCBucl9mYWlsZWQgPSAwOworCisJCWVyciA9IG1iaW5kX3JhbmdlKHZtYSwgc3RhcnQsIGVuZCwgbmV3KTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZwYWdlbGlzdCkpCisJCQlucl9mYWlsZWQgPSBzd2FwX3BhZ2VzKCZwYWdlbGlzdCk7CisKKwkJaWYgKCFlcnIgJiYgbnJfZmFpbGVkICYmIChmbGFncyAmIE1QT0xfTUZfU1RSSUNUKSkKKwkJCWVyciA9IC1FSU87CisJfQorCWlmICghbGlzdF9lbXB0eSgmcGFnZWxpc3QpKQorCQlwdXRiYWNrX2xydV9wYWdlcygmcGFnZWxpc3QpOworCisJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJbXBvbF9mcmVlKG5ldyk7CisJcmV0dXJuIGVycjsKK30KKworLyoKICAqIFVzZXIgc3BhY2UgaW50ZXJmYWNlIHdpdGggdmFyaWFibGUgc2l6ZWQgYml0bWFwcyBmb3Igbm9kZWxpc3RzLgogICovCiAKIC8qIENvcHkgYSBub2RlIG1hc2sgZnJvbSB1c2VyIHNwYWNlLiAqLwotc3RhdGljIGludCBnZXRfbm9kZXMobm9kZW1hc2tfdCAqbm9kZXMsIHVuc2lnbmVkIGxvbmcgX191c2VyICpubWFzaywKK3N0YXRpYyBpbnQgZ2V0X25vZGVzKG5vZGVtYXNrX3QgKm5vZGVzLCBjb25zdCB1bnNpZ25lZCBsb25nIF9fdXNlciAqbm1hc2ssCiAJCSAgICAgdW5zaWduZWQgbG9uZyBtYXhub2RlKQogewogCXVuc2lnbmVkIGxvbmcgazsKQEAgLTU5Myw2ICs3NTEsNjUgQEAKIAlyZXR1cm4gZG9fc2V0X21lbXBvbGljeShtb2RlLCAmbm9kZXMpOwogfQogCithc21saW5rYWdlIGxvbmcgc3lzX21pZ3JhdGVfcGFnZXMocGlkX3QgcGlkLCB1bnNpZ25lZCBsb25nIG1heG5vZGUsCisJCWNvbnN0IHVuc2lnbmVkIGxvbmcgX191c2VyICpvbGRfbm9kZXMsCisJCWNvbnN0IHVuc2lnbmVkIGxvbmcgX191c2VyICpuZXdfbm9kZXMpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCW5vZGVtYXNrX3Qgb2xkOworCW5vZGVtYXNrX3QgbmV3OworCW5vZGVtYXNrX3QgdGFza19ub2RlczsKKwlpbnQgZXJyOworCisJZXJyID0gZ2V0X25vZGVzKCZvbGQsIG9sZF9ub2RlcywgbWF4bm9kZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGdldF9ub2RlcygmbmV3LCBuZXdfbm9kZXMsIG1heG5vZGUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBGaW5kIHRoZSBtbV9zdHJ1Y3QgKi8KKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCXRhc2sgPSBwaWQgPyBmaW5kX3Rhc2tfYnlfcGlkKHBpZCkgOiBjdXJyZW50OworCWlmICghdGFzaykgeworCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJCXJldHVybiAtRVNSQ0g7CisJfQorCW1tID0gZ2V0X3Rhc2tfbW0odGFzayk7CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCisJaWYgKCFtbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIENoZWNrIGlmIHRoaXMgcHJvY2VzcyBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGUgc3BlY2lmaWVkCisJICogcHJvY2Vzcy4gVGhlIHJpZ2h0IGV4aXN0cyBpZiB0aGUgcHJvY2VzcyBoYXMgYWRtaW5pc3RyYXRpdmUKKwkgKiBjYXBhYmlsaXRpZXMsIHN1cGVydXNlciBwcml2aWxlZGdlcyBvciB0aGUgc2FtZQorCSAqIHVzZXJpZCBhcyB0aGUgdGFyZ2V0IHByb2Nlc3MuCisJICovCisJaWYgKChjdXJyZW50LT5ldWlkICE9IHRhc2stPnN1aWQpICYmIChjdXJyZW50LT5ldWlkICE9IHRhc2stPnVpZCkgJiYKKwkgICAgKGN1cnJlbnQtPnVpZCAhPSB0YXNrLT5zdWlkKSAmJiAoY3VycmVudC0+dWlkICE9IHRhc2stPnVpZCkgJiYKKwkgICAgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJZXJyID0gLUVQRVJNOworCQlnb3RvIG91dDsKKwl9CisKKwl0YXNrX25vZGVzID0gY3B1c2V0X21lbXNfYWxsb3dlZCh0YXNrKTsKKwkvKiBJcyB0aGUgdXNlciBhbGxvd2VkIHRvIGFjY2VzcyB0aGUgdGFyZ2V0IG5vZGVzPyAqLworCWlmICghbm9kZXNfc3Vic2V0KG5ldywgdGFza19ub2RlcykgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJZXJyID0gLUVQRVJNOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBkb19taWdyYXRlX3BhZ2VzKG1tLCAmb2xkLCAmbmV3LCBNUE9MX01GX01PVkUpOworb3V0OgorCW1tcHV0KG1tKTsKKwlyZXR1cm4gZXJyOworfQorCisKIC8qIFJldHJpZXZlIE5VTUEgcG9saWN5ICovCiBhc21saW5rYWdlIGxvbmcgc3lzX2dldF9tZW1wb2xpY3koaW50IF9fdXNlciAqcG9saWN5LAogCQkJCXVuc2lnbmVkIGxvbmcgX191c2VyICpubWFzaywKQEAgLTY5OSw4ICs5MTYsOCBAQAogI2VuZGlmCiAKIC8qIFJldHVybiBlZmZlY3RpdmUgcG9saWN5IGZvciBhIFZNQSAqLwotc3RydWN0IG1lbXBvbGljeSAqCi1nZXRfdm1hX3BvbGljeShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIpCitzdGF0aWMgc3RydWN0IG1lbXBvbGljeSAqIGdldF92bWFfcG9saWN5KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlzdHJ1Y3QgbWVtcG9saWN5ICpwb2wgPSB0YXNrLT5tZW1wb2xpY3k7CiAKQEAgLTc1OSw2ICs5NzYsMzMgQEAKIAlyZXR1cm4gbmlkOwogfQogCisvKgorICogRGVwZW5kaW5nIG9uIHRoZSBtZW1vcnkgcG9saWN5IHByb3ZpZGUgYSBub2RlIGZyb20gd2hpY2ggdG8gYWxsb2NhdGUgdGhlCisgKiBuZXh0IHNsYWIgZW50cnkuCisgKi8KK3Vuc2lnbmVkIHNsYWJfbm9kZShzdHJ1Y3QgbWVtcG9saWN5ICpwb2xpY3kpCit7CisJc3dpdGNoIChwb2xpY3ktPnBvbGljeSkgeworCWNhc2UgTVBPTF9JTlRFUkxFQVZFOgorCQlyZXR1cm4gaW50ZXJsZWF2ZV9ub2Rlcyhwb2xpY3kpOworCisJY2FzZSBNUE9MX0JJTkQ6CisJCS8qCisJCSAqIEZvbGxvdyBiaW5kIHBvbGljeSBiZWhhdmlvciBhbmQgc3RhcnQgYWxsb2NhdGlvbiBhdCB0aGUKKwkJICogZmlyc3Qgbm9kZS4KKwkJICovCisJCXJldHVybiBwb2xpY3ktPnYuem9uZWxpc3QtPnpvbmVzWzBdLT56b25lX3BnZGF0LT5ub2RlX2lkOworCisJY2FzZSBNUE9MX1BSRUZFUlJFRDoKKwkJaWYgKHBvbGljeS0+di5wcmVmZXJyZWRfbm9kZSA+PSAwKQorCQkJcmV0dXJuIHBvbGljeS0+di5wcmVmZXJyZWRfbm9kZTsKKwkJLyogRmFsbCB0aHJvdWdoICovCisKKwlkZWZhdWx0OgorCQlyZXR1cm4gbnVtYV9ub2RlX2lkKCk7CisJfQorfQorCiAvKiBEbyBzdGF0aWMgaW50ZXJsZWF2aW5nIGZvciBhIFZNQSB3aXRoIGtub3duIG9mZnNldC4gKi8KIHN0YXRpYyB1bnNpZ25lZCBvZmZzZXRfaWxfbm9kZShzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsCiAJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIG9mZikKQEAgLTg0OCw3ICsxMDkyLDcgQEAKIHsKIAlzdHJ1Y3QgbWVtcG9saWN5ICpwb2wgPSBnZXRfdm1hX3BvbGljeShjdXJyZW50LCB2bWEsIGFkZHIpOwogCi0JY3B1c2V0X3VwZGF0ZV9jdXJyZW50X21lbXNfYWxsb3dlZCgpOworCWNwdXNldF91cGRhdGVfdGFza19tZW1vcnlfc3RhdGUoKTsKIAogCWlmICh1bmxpa2VseShwb2wtPnBvbGljeSA9PSBNUE9MX0lOVEVSTEVBVkUpKSB7CiAJCXVuc2lnbmVkIG5pZDsKQEAgLTg3NCw3ICsxMTE4LDcgQEAKICAqCWludGVycnVwdCBjb250ZXh0IGFuZCBhcHBseSB0aGUgY3VycmVudCBwcm9jZXNzIE5VTUEgcG9saWN5LgogICoJUmV0dXJucyBOVUxMIHdoZW4gbm8gcGFnZSBjYW4gYmUgYWxsb2NhdGVkLgogICoKLSAqCURvbid0IGNhbGwgY3B1c2V0X3VwZGF0ZV9jdXJyZW50X21lbXNfYWxsb3dlZCgpIHVubGVzcworICoJRG9uJ3QgY2FsbCBjcHVzZXRfdXBkYXRlX3Rhc2tfbWVtb3J5X3N0YXRlKCkgdW5sZXNzCiAgKgkxKSBpdCdzIG9rIHRvIHRha2UgY3B1c2V0X3NlbSAoY2FuIFdBSVQpLCBhbmQKICAqCTIpIGFsbG9jYXRpbmcgZm9yIGN1cnJlbnQgdGFzayAobm90IGludGVycnVwdCkuCiAgKi8KQEAgLTg4Myw3ICsxMTI3LDcgQEAKIAlzdHJ1Y3QgbWVtcG9saWN5ICpwb2wgPSBjdXJyZW50LT5tZW1wb2xpY3k7CiAKIAlpZiAoKGdmcCAmIF9fR0ZQX1dBSVQpICYmICFpbl9pbnRlcnJ1cHQoKSkKLQkJY3B1c2V0X3VwZGF0ZV9jdXJyZW50X21lbXNfYWxsb3dlZCgpOworCQljcHVzZXRfdXBkYXRlX3Rhc2tfbWVtb3J5X3N0YXRlKCk7CiAJaWYgKCFwb2wgfHwgaW5faW50ZXJydXB0KCkpCiAJCXBvbCA9ICZkZWZhdWx0X3BvbGljeTsKIAlpZiAocG9sLT5wb2xpY3kgPT0gTVBPTF9JTlRFUkxFQVZFKQpAQCAtODkyLDYgKzExMzYsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0woYWxsb2NfcGFnZXNfY3VycmVudCk7CiAKKy8qCisgKiBJZiBtcG9sX2NvcHkoKSBzZWVzIGN1cnJlbnQtPmNwdXNldCA9PSBjcHVzZXRfYmVpbmdfcmVib3VuZCwgdGhlbiBpdAorICogcmViaW5kcyB0aGUgbWVtcG9saWN5IGl0cyBjb3B5aW5nIGJ5IGNhbGxpbmcgbXBvbF9yZWJpbmRfcG9saWN5KCkKKyAqIHdpdGggdGhlIG1lbXNfYWxsb3dlZCByZXR1cm5lZCBieSBjcHVzZXRfbWVtc19hbGxvd2VkKCkuICBUaGlzCisgKiBrZWVwcyBtZW1wb2xpY2llcyBjcHVzZXQgcmVsYXRpdmUgYWZ0ZXIgaXRzIGNwdXNldCBtb3Zlcy4gIFNlZQorICogZnVydGhlciBrZXJuZWwvY3B1c2V0LmMgdXBkYXRlX25vZGVtYXNrKCkuCisgKi8KK3ZvaWQgKmNwdXNldF9iZWluZ19yZWJvdW5kOworCiAvKiBTbG93IHBhdGggb2YgYSBtZW1wb2xpY3kgY29weSAqLwogc3RydWN0IG1lbXBvbGljeSAqX19tcG9sX2NvcHkoc3RydWN0IG1lbXBvbGljeSAqb2xkKQogewpAQCAtODk5LDYgKzExNTIsMTAgQEAKIAogCWlmICghbmV3KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZiAoY3VycmVudF9jcHVzZXRfaXNfYmVpbmdfcmVib3VuZCgpKSB7CisJCW5vZGVtYXNrX3QgbWVtcyA9IGNwdXNldF9tZW1zX2FsbG93ZWQoY3VycmVudCk7CisJCW1wb2xfcmViaW5kX3BvbGljeShvbGQsICZtZW1zKTsKKwl9CiAJKm5ldyA9ICpvbGQ7CiAJYXRvbWljX3NldCgmbmV3LT5yZWZjbnQsIDEpOwogCWlmIChuZXctPnBvbGljeSA9PSBNUE9MX0JJTkQpIHsKQEAgLTExMDUsNiArMTM2MiwzMCBAQAogCXJldHVybiAwOwogfQogCit2b2lkIG1wb2xfc2hhcmVkX3BvbGljeV9pbml0KHN0cnVjdCBzaGFyZWRfcG9saWN5ICppbmZvLCBpbnQgcG9saWN5LAorCQkJCW5vZGVtYXNrX3QgKnBvbGljeV9ub2RlcykKK3sKKwlpbmZvLT5yb290ID0gUkJfUk9PVDsKKwlzcGluX2xvY2tfaW5pdCgmaW5mby0+bG9jayk7CisKKwlpZiAocG9saWN5ICE9IE1QT0xfREVGQVVMVCkgeworCQlzdHJ1Y3QgbWVtcG9saWN5ICpuZXdwb2w7CisKKwkJLyogRmFsbHMgYmFjayB0byBNUE9MX0RFRkFVTFQgb24gYW55IGVycm9yICovCisJCW5ld3BvbCA9IG1wb2xfbmV3KHBvbGljeSwgcG9saWN5X25vZGVzKTsKKwkJaWYgKCFJU19FUlIobmV3cG9sKSkgeworCQkJLyogQ3JlYXRlIHBzZXVkby12bWEgdGhhdCBjb250YWlucyBqdXN0IHRoZSBwb2xpY3kgKi8KKwkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCBwdm1hOworCisJCQltZW1zZXQoJnB2bWEsIDAsIHNpemVvZihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QpKTsKKwkJCS8qIFBvbGljeSBjb3ZlcnMgZW50aXJlIGZpbGUgKi8KKwkJCXB2bWEudm1fZW5kID0gVEFTS19TSVpFOworCQkJbXBvbF9zZXRfc2hhcmVkX3BvbGljeShpbmZvLCAmcHZtYSwgbmV3cG9sKTsKKwkJCW1wb2xfZnJlZShuZXdwb2wpOworCQl9CisJfQorfQorCiBpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqaW5mbywKIAkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICpucG9sKQogewpAQCAtMTE3MywyNSArMTQ1NCwzMSBAQAogfQogCiAvKiBNaWdyYXRlIGEgcG9saWN5IHRvIGEgZGlmZmVyZW50IHNldCBvZiBub2RlcyAqLwotc3RhdGljIHZvaWQgcmViaW5kX3BvbGljeShzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIGNvbnN0IG5vZGVtYXNrX3QgKm9sZCwKLQkJCQkJCQljb25zdCBub2RlbWFza190ICpuZXcpCit2b2lkIG1wb2xfcmViaW5kX3BvbGljeShzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIGNvbnN0IG5vZGVtYXNrX3QgKm5ld21hc2spCiB7CisJbm9kZW1hc2tfdCAqbXBvbG1hc2s7CiAJbm9kZW1hc2tfdCB0bXA7CiAKIAlpZiAoIXBvbCkKIAkJcmV0dXJuOworCW1wb2xtYXNrID0gJnBvbC0+Y3B1c2V0X21lbXNfYWxsb3dlZDsKKwlpZiAobm9kZXNfZXF1YWwoKm1wb2xtYXNrLCAqbmV3bWFzaykpCisJCXJldHVybjsKIAogCXN3aXRjaCAocG9sLT5wb2xpY3kpIHsKIAljYXNlIE1QT0xfREVGQVVMVDoKIAkJYnJlYWs7CiAJY2FzZSBNUE9MX0lOVEVSTEVBVkU6Ci0JCW5vZGVzX3JlbWFwKHRtcCwgcG9sLT52Lm5vZGVzLCAqb2xkLCAqbmV3KTsKKwkJbm9kZXNfcmVtYXAodG1wLCBwb2wtPnYubm9kZXMsICptcG9sbWFzaywgKm5ld21hc2spOwogCQlwb2wtPnYubm9kZXMgPSB0bXA7Ci0JCWN1cnJlbnQtPmlsX25leHQgPSBub2RlX3JlbWFwKGN1cnJlbnQtPmlsX25leHQsICpvbGQsICpuZXcpOworCQkqbXBvbG1hc2sgPSAqbmV3bWFzazsKKwkJY3VycmVudC0+aWxfbmV4dCA9IG5vZGVfcmVtYXAoY3VycmVudC0+aWxfbmV4dCwKKwkJCQkJCSptcG9sbWFzaywgKm5ld21hc2spOwogCQlicmVhazsKIAljYXNlIE1QT0xfUFJFRkVSUkVEOgogCQlwb2wtPnYucHJlZmVycmVkX25vZGUgPSBub2RlX3JlbWFwKHBvbC0+di5wcmVmZXJyZWRfbm9kZSwKLQkJCQkJCQkJKm9sZCwgKm5ldyk7CisJCQkJCQkqbXBvbG1hc2ssICpuZXdtYXNrKTsKKwkJKm1wb2xtYXNrID0gKm5ld21hc2s7CiAJCWJyZWFrOwogCWNhc2UgTVBPTF9CSU5EOiB7CiAJCW5vZGVtYXNrX3Qgbm9kZXM7CkBAIC0xMjAxLDcgKzE0ODgsNyBAQAogCQlub2Rlc19jbGVhcihub2Rlcyk7CiAJCWZvciAoeiA9IHBvbC0+di56b25lbGlzdC0+em9uZXM7ICp6OyB6KyspCiAJCQlub2RlX3NldCgoKnopLT56b25lX3BnZGF0LT5ub2RlX2lkLCBub2Rlcyk7Ci0JCW5vZGVzX3JlbWFwKHRtcCwgbm9kZXMsICpvbGQsICpuZXcpOworCQlub2Rlc19yZW1hcCh0bXAsIG5vZGVzLCAqbXBvbG1hc2ssICpuZXdtYXNrKTsKIAkJbm9kZXMgPSB0bXA7CiAKIAkJem9uZWxpc3QgPSBiaW5kX3pvbmVsaXN0KCZub2Rlcyk7CkBAIC0xMjE2LDYgKzE1MDMsNyBAQAogCQkJa2ZyZWUocG9sLT52LnpvbmVsaXN0KTsKIAkJCXBvbC0+di56b25lbGlzdCA9IHpvbmVsaXN0OwogCQl9CisJCSptcG9sbWFzayA9ICpuZXdtYXNrOwogCQlicmVhazsKIAl9CiAJZGVmYXVsdDoKQEAgLTEyMjUsMTIgKzE1MTMsMTU2IEBACiB9CiAKIC8qCi0gKiBTb21lb25lIG1vdmVkIHRoaXMgdGFzayB0byBkaWZmZXJlbnQgbm9kZXMuICBGaXh1cCBtZW1wb2xpY2llcy4KLSAqCi0gKiBUT0RPIC0gZml4dXAgY3VycmVudC0+bW0tPnZtYSBhbmQgc2htZnMvdG1wZnMvaHVnZXRsYmZzIHBvbGljaWVzIGFzIHdlbGwsCi0gKiBvbmNlIHdlIGhhdmUgYSBjcHVzZXQgbWVjaGFuaXNtIHRvIG1hcmsgd2hpY2ggY3B1c2V0IHN1YnRyZWUgaXMgbWlncmF0aW5nLgorICogV3JhcHBlciBmb3IgbXBvbF9yZWJpbmRfcG9saWN5KCkgdGhhdCBqdXN0IHJlcXVpcmVzIHRhc2sKKyAqIHBvaW50ZXIsIGFuZCB1cGRhdGVzIHRhc2sgbWVtcG9saWN5LgogICovCi12b2lkIG51bWFfcG9saWN5X3JlYmluZChjb25zdCBub2RlbWFza190ICpvbGQsIGNvbnN0IG5vZGVtYXNrX3QgKm5ldykKKwordm9pZCBtcG9sX3JlYmluZF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBjb25zdCBub2RlbWFza190ICpuZXcpCiB7Ci0JcmViaW5kX3BvbGljeShjdXJyZW50LT5tZW1wb2xpY3ksIG9sZCwgbmV3KTsKKwltcG9sX3JlYmluZF9wb2xpY3kodHNrLT5tZW1wb2xpY3ksIG5ldyk7CiB9CisKKy8qCisgKiBSZWJpbmQgZWFjaCB2bWEgaW4gbW0gdG8gbmV3IG5vZGVtYXNrLgorICoKKyAqIENhbGwgaG9sZGluZyBhIHJlZmVyZW5jZSB0byBtbS4gIFRha2VzIG1tLT5tbWFwX3NlbSBkdXJpbmcgY2FsbC4KKyAqLworCit2b2lkIG1wb2xfcmViaW5kX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBub2RlbWFza190ICpuZXcpCit7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisKKwlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCWZvciAodm1hID0gbW0tPm1tYXA7IHZtYTsgdm1hID0gdm1hLT52bV9uZXh0KQorCQltcG9sX3JlYmluZF9wb2xpY3kodm1hLT52bV9wb2xpY3ksIG5ldyk7CisJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7Cit9CisKKy8qCisgKiBEaXNwbGF5IHBhZ2VzIGFsbG9jYXRlZCBwZXIgbm9kZSBhbmQgbWVtb3J5IHBvbGljeSB2aWEgL3Byb2MuCisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKnBvbGljeV90eXBlc1tdID0geyAiZGVmYXVsdCIsICJwcmVmZXIiLCAiYmluZCIsCisJCQkJICAgICAgImludGVybGVhdmUiIH07CisKKy8qCisgKiBDb252ZXJ0IGEgbWVtcG9saWN5IGludG8gYSBzdHJpbmcuCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBidWZmZXIgKGlmIHBvc2l0aXZlKQorICogb3IgYW4gZXJyb3IgKG5lZ2F0aXZlKQorICovCitzdGF0aWMgaW5saW5lIGludCBtcG9sX3RvX3N0cihjaGFyICpidWZmZXIsIGludCBtYXhsZW4sIHN0cnVjdCBtZW1wb2xpY3kgKnBvbCkKK3sKKwljaGFyICpwID0gYnVmZmVyOworCWludCBsOworCW5vZGVtYXNrX3Qgbm9kZXM7CisJaW50IG1vZGUgPSBwb2wgPyBwb2wtPnBvbGljeSA6IE1QT0xfREVGQVVMVDsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgTVBPTF9ERUZBVUxUOgorCQlub2Rlc19jbGVhcihub2Rlcyk7CisJCWJyZWFrOworCisJY2FzZSBNUE9MX1BSRUZFUlJFRDoKKwkJbm9kZXNfY2xlYXIobm9kZXMpOworCQlub2RlX3NldChwb2wtPnYucHJlZmVycmVkX25vZGUsIG5vZGVzKTsKKwkJYnJlYWs7CisKKwljYXNlIE1QT0xfQklORDoKKwkJZ2V0X3pvbmVtYXNrKHBvbCwgJm5vZGVzKTsKKwkJYnJlYWs7CisKKwljYXNlIE1QT0xfSU5URVJMRUFWRToKKwkJbm9kZXMgPSBwb2wtPnYubm9kZXM7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWwgPSBzdHJsZW4ocG9saWN5X3R5cGVzW21vZGVdKTsKKyAJaWYgKGJ1ZmZlciArIG1heGxlbiA8IHAgKyBsICsgMSkKKyAJCXJldHVybiAtRU5PU1BDOworCisJc3RyY3B5KHAsIHBvbGljeV90eXBlc1ttb2RlXSk7CisJcCArPSBsOworCisJaWYgKCFub2Rlc19lbXB0eShub2RlcykpIHsKKwkJaWYgKGJ1ZmZlciArIG1heGxlbiA8IHAgKyAyKQorCQkJcmV0dXJuIC1FTk9TUEM7CisJCSpwKysgPSAnPSc7CisJIAlwICs9IG5vZGVsaXN0X3NjbnByaW50ZihwLCBidWZmZXIgKyBtYXhsZW4gLSBwLCBub2Rlcyk7CisJfQorCXJldHVybiBwIC0gYnVmZmVyOworfQorCitzdHJ1Y3QgbnVtYV9tYXBzIHsKKwl1bnNpZ25lZCBsb25nIHBhZ2VzOworCXVuc2lnbmVkIGxvbmcgYW5vbjsKKwl1bnNpZ25lZCBsb25nIG1hcHBlZDsKKwl1bnNpZ25lZCBsb25nIG1hcGNvdW50X21heDsKKwl1bnNpZ25lZCBsb25nIG5vZGVbTUFYX05VTU5PREVTXTsKK307CisKK3N0YXRpYyB2b2lkIGdhdGhlcl9zdGF0cyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3QgbnVtYV9tYXBzICptZCA9IHByaXZhdGU7CisJaW50IGNvdW50ID0gcGFnZV9tYXBjb3VudChwYWdlKTsKKworCWlmIChjb3VudCkKKwkJbWQtPm1hcHBlZCsrOworCisJaWYgKGNvdW50ID4gbWQtPm1hcGNvdW50X21heCkKKwkJbWQtPm1hcGNvdW50X21heCA9IGNvdW50OworCisJbWQtPnBhZ2VzKys7CisKKwlpZiAoUGFnZUFub24ocGFnZSkpCisJCW1kLT5hbm9uKys7CisKKwltZC0+bm9kZVtwYWdlX3RvX25pZChwYWdlKV0rKzsKKwljb25kX3Jlc2NoZWQoKTsKK30KKworaW50IHNob3dfbnVtYV9tYXAoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IG0tPnByaXZhdGU7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSB2OworCXN0cnVjdCBudW1hX21hcHMgKm1kOworCWludCBuOworCWNoYXIgYnVmZmVyWzUwXTsKKworCWlmICghdm1hLT52bV9tbSkKKwkJcmV0dXJuIDA7CisKKwltZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBudW1hX21hcHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1kKQorCQlyZXR1cm4gMDsKKworCWNoZWNrX3BnZF9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLAorCQkgICAgJm5vZGVfb25saW5lX21hcCwgTVBPTF9NRl9TVEFUUywgbWQpOworCisJaWYgKG1kLT5wYWdlcykgeworCQltcG9sX3RvX3N0cihidWZmZXIsIHNpemVvZihidWZmZXIpLAorCQkJICAgIGdldF92bWFfcG9saWN5KHRhc2ssIHZtYSwgdm1hLT52bV9zdGFydCkpOworCisJCXNlcV9wcmludGYobSwgIiUwOGx4ICVzIHBhZ2VzPSVsdSBtYXBwZWQ9JWx1IG1heHJlZj0lbHUiLAorCQkJICAgdm1hLT52bV9zdGFydCwgYnVmZmVyLCBtZC0+cGFnZXMsCisJCQkgICBtZC0+bWFwcGVkLCBtZC0+bWFwY291bnRfbWF4KTsKKworCQlpZiAobWQtPmFub24pCisJCQlzZXFfcHJpbnRmKG0sIiBhbm9uPSVsdSIsbWQtPmFub24pOworCisJCWZvcl9lYWNoX29ubGluZV9ub2RlKG4pCisJCQlpZiAobWQtPm5vZGVbbl0pCisJCQkJc2VxX3ByaW50ZihtLCAiIE4lZD0lbHUiLCBuLCBtZC0+bm9kZVtuXSk7CisKKwkJc2VxX3B1dGMobSwgJ1xuJyk7CisJfQorCWtmcmVlKG1kKTsKKworCWlmIChtLT5jb3VudCA8IG0tPnNpemUpCisJCW0tPnZlcnNpb24gPSAodm1hICE9IGdldF9nYXRlX3ZtYSh0YXNrKSkgPyB2bWEtPnZtX3N0YXJ0IDogMDsKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvbW0vbWxvY2suYyBiL21tL21sb2NrLmMKaW5kZXggNGFlM2E0NmYuLmI5MGM1OTUgMTAwNjQ0Ci0tLSBhL21tL21sb2NrLmMKKysrIGIvbW0vbWxvY2suYwpAQCAtNSw2ICs1LDcgQEAKICAqICAoQykgQ29weXJpZ2h0IDIwMDIgQ2hyaXN0b3BoIEhlbGx3aWcKICAqLwogCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21lbXBvbGljeS5oPgpkaWZmIC0tZ2l0IGEvbW0vbW1hcC5jIGIvbW0vbW1hcC5jCmluZGV4IDY0YmE0ZGIuLjQ3NTU2ZDIgMTAwNjQ0Ci0tLSBhL21tL21tYXAuYworKysgYi9tbS9tbWFwLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KZGlmZiAtLWdpdCBhL21tL21yZW1hcC5jIGIvbW0vbXJlbWFwLmMKaW5kZXggZGRhZWVlOS4uMTkwM2JkZiAxMDA2NDQKLS0tIGEvbW0vbXJlbWFwLmMKKysrIGIvbW0vbXJlbWFwLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zaG0uaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgpkaWZmIC0tZ2l0IGEvbW0vbXN5bmMuYyBiL21tL21zeW5jLmMKaW5kZXggMWI1YjZmNi4uMzU2M2E1NiAxMDA2NDQKLS0tIGEvbW0vbXN5bmMuYworKysgYi9tbS9tc3luYy5jCkBAIC0xMzcsNyArMTM3LDcgQEAKIAkJCXJldCA9IGZpbGVtYXBfZmRhdGF3cml0ZShtYXBwaW5nKTsKIAkJCWlmIChmaWxlLT5mX29wICYmIGZpbGUtPmZfb3AtPmZzeW5jKSB7CiAJCQkJLyoKLQkJCQkgKiBXZSBkb24ndCB0YWtlIGlfc2VtIGhlcmUgYmVjYXVzZSBtbWFwX3NlbQorCQkJCSAqIFdlIGRvbid0IHRha2UgaV9tdXRleCBoZXJlIGJlY2F1c2UgbW1hcF9zZW0KIAkJCQkgKiBpcyBhbHJlYWR5IGhlbGQuCiAJCQkJICovCiAJCQkJZXJyID0gZmlsZS0+Zl9vcC0+ZnN5bmMoZmlsZSxmaWxlLT5mX2RlbnRyeSwxKTsKZGlmZiAtLWdpdCBhL21tL29vbV9raWxsLmMgYi9tbS9vb21fa2lsbC5jCmluZGV4IGQzNDhiOTAuLjE0YmQ0ZWMgMTAwNjQ0Ci0tLSBhL21tL29vbV9raWxsLmMKKysrIGIvbW0vb29tX2tpbGwuYwpAQCAtMjc0LDYgKzI3NCw3IEBACiAJCXNob3dfbWVtKCk7CiAJfQogCisJY3B1c2V0X2xvY2soKTsKIAlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwogcmV0cnk6CiAJcCA9IHNlbGVjdF9iYWRfcHJvY2VzcygpOwpAQCAtMjg0LDYgKzI4NSw3IEBACiAJLyogRm91bmQgbm90aGluZz8hPyEgRWl0aGVyIHdlIGhhbmcgZm9yZXZlciwgb3Igd2UgcGFuaWMuICovCiAJaWYgKCFwKSB7CiAJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkJY3B1c2V0X3VubG9jaygpOwogCQlwYW5pYygiT3V0IG9mIG1lbW9yeSBhbmQgbm8ga2lsbGFibGUgcHJvY2Vzc2VzLi4uXG4iKTsKIAl9CiAKQEAgLTI5MywxMiArMjk1LDE0IEBACiAKICBvdXQ6CiAJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCWNwdXNldF91bmxvY2soKTsKIAlpZiAobW0pCiAJCW1tcHV0KG1tKTsKIAogCS8qCiAJICogR2l2ZSAicCIgYSBnb29kIGNoYW5jZSBvZiBraWxsaW5nIGl0c2VsZiBiZWZvcmUgd2UKLQkgKiByZXRyeSB0byBhbGxvY2F0ZSBtZW1vcnkuCisJICogcmV0cnkgdG8gYWxsb2NhdGUgbWVtb3J5IHVubGVzcyAicCIgaXMgY3VycmVudAogCSAqLwotCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKKwlpZiAoIXRlc3RfdGhyZWFkX2ZsYWcoVElGX01FTURJRSkpCisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKIH0KZGlmZiAtLWdpdCBhL21tL3BhZ2Utd3JpdGViYWNrLmMgYi9tbS9wYWdlLXdyaXRlYmFjay5jCmluZGV4IDUyNDBlNDIuLjk0NTU1OWYgMTAwNjQ0Ci0tLSBhL21tL3BhZ2Utd3JpdGViYWNrLmMKKysrIGIvbW0vcGFnZS13cml0ZWJhY2suYwpAQCAtNDYsNyArNDYsNyBAQAogc3RhdGljIGxvbmcgcmF0ZWxpbWl0X3BhZ2VzID0gMzI7CiAKIHN0YXRpYyBsb25nIHRvdGFsX3BhZ2VzOwkvKiBUaGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBtYWNoaW5lLiAqLwotc3RhdGljIGludCBkaXJ0eV9leGNlZWRlZDsJLyogRGlydHkgbWVtIG1heSBiZSBvdmVyIGxpbWl0ICovCitzdGF0aWMgaW50IGRpcnR5X2V4Y2VlZGVkIF9fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwkvKiBEaXJ0eSBtZW0gbWF5IGJlIG92ZXIgbGltaXQgKi8KIAogLyoKICAqIFdoZW4gYmFsYW5jZV9kaXJ0eV9wYWdlcyBkZWNpZGVzIHRoYXQgdGhlIGNhbGxlciBuZWVkcyB0byBwZXJmb3JtIHNvbWUKQEAgLTIxMiw3ICsyMTIsOCBAQAogCQlpZiAobnJfcmVjbGFpbWFibGUgKyB3YnMubnJfd3JpdGViYWNrIDw9IGRpcnR5X3RocmVzaCkKIAkJCWJyZWFrOwogCi0JCWRpcnR5X2V4Y2VlZGVkID0gMTsKKwkJaWYgKCFkaXJ0eV9leGNlZWRlZCkKKwkJCWRpcnR5X2V4Y2VlZGVkID0gMTsKIAogCQkvKiBOb3RlOiBucl9yZWNsYWltYWJsZSBkZW5vdGVzIG5yX2RpcnR5ICsgbnJfdW5zdGFibGUuCiAJCSAqIFVuc3RhYmxlIHdyaXRlcyBhcmUgYSBmZWF0dXJlIG9mIGNlcnRhaW4gbmV0d29ya2VkCkBAIC0yMzQsNyArMjM1LDcgQEAKIAkJYmxrX2Nvbmdlc3Rpb25fd2FpdChXUklURSwgSFovMTApOwogCX0KIAotCWlmIChucl9yZWNsYWltYWJsZSArIHdicy5ucl93cml0ZWJhY2sgPD0gZGlydHlfdGhyZXNoKQorCWlmIChucl9yZWNsYWltYWJsZSArIHdicy5ucl93cml0ZWJhY2sgPD0gZGlydHlfdGhyZXNoICYmIGRpcnR5X2V4Y2VlZGVkKQogCQlkaXJ0eV9leGNlZWRlZCA9IDA7CiAKIAlpZiAod3JpdGViYWNrX2luX3Byb2dyZXNzKGJkaSkpCmRpZmYgLS1naXQgYS9tbS9wYWdlX2FsbG9jLmMgYi9tbS9wYWdlX2FsbG9jLmMKaW5kZXggZmQ0NzQ5NC4uZGY1NGUyZiAxMDA2NDQKLS0tIGEvbW0vcGFnZV9hbGxvYy5jCisrKyBiL21tL3BhZ2VfYWxsb2MuYwpAQCAtNTMsNiArNTMsNyBAQAogdW5zaWduZWQgbG9uZyB0b3RhbHJhbV9wYWdlcyBfX3JlYWRfbW9zdGx5OwogdW5zaWduZWQgbG9uZyB0b3RhbGhpZ2hfcGFnZXMgX19yZWFkX21vc3RseTsKIGxvbmcgbnJfc3dhcF9wYWdlczsKK2ludCBwZXJjcHVfcGFnZWxpc3RfZnJhY3Rpb247CiAKIHN0YXRpYyB2b2lkIGZhc3RjYWxsIGZyZWVfaG90X2NvbGRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGNvbGQpOwogCkBAIC0xMzYsOSArMTM3LDkgQEAKIHN0YXRpYyB2b2lkIGJhZF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQogewogCXByaW50ayhLRVJOX0VNRVJHICJCYWQgcGFnZSBzdGF0ZSBpbiBwcm9jZXNzICclcydcbiIKLQkJInBhZ2U6JXAgZmxhZ3M6MHglMCpseCBtYXBwaW5nOiVwIG1hcGNvdW50OiVkIGNvdW50OiVkXG4iCi0JCSJUcnlpbmcgdG8gZml4IGl0IHVwLCBidXQgYSByZWJvb3QgaXMgbmVlZGVkXG4iCi0JCSJCYWNrdHJhY2U6XG4iLAorCQlLRVJOX0VNRVJHICJwYWdlOiVwIGZsYWdzOjB4JTAqbHggbWFwcGluZzolcCBtYXBjb3VudDolZCBjb3VudDolZFxuIgorCQlLRVJOX0VNRVJHICJUcnlpbmcgdG8gZml4IGl0IHVwLCBidXQgYSByZWJvb3QgaXMgbmVlZGVkXG4iCisJCUtFUk5fRU1FUkcgIkJhY2t0cmFjZTpcbiIsCiAJCWN1cnJlbnQtPmNvbW0sIHBhZ2UsIChpbnQpKDIqc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSwKIAkJKHVuc2lnbmVkIGxvbmcpcGFnZS0+ZmxhZ3MsIHBhZ2UtPm1hcHBpbmcsCiAJCXBhZ2VfbWFwY291bnQocGFnZSksIHBhZ2VfY291bnQocGFnZSkpOwpAQCAtMzA3LDcgKzMwOCw3IEBACiAgKiAtLSB3bGkKICAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19mcmVlX3BhZ2VzX2J1bGsgKHN0cnVjdCBwYWdlICpwYWdlLAorc3RhdGljIGlubGluZSB2b2lkIF9fZnJlZV9vbmVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGludCBvcmRlcikKIHsKIAl1bnNpZ25lZCBsb25nIHBhZ2VfaWR4OwpAQCAtMzgyLDQwICszODMsNDUgQEAKICAqIEFuZCBjbGVhciB0aGUgem9uZSdzIHBhZ2VzX3NjYW5uZWQgY291bnRlciwgdG8gaG9sZCBvZmYgdGhlICJhbGwgcGFnZXMgYXJlCiAgKiBwaW5uZWQiIGRldGVjdGlvbiBsb2dpYy4KICAqLwotc3RhdGljIGludAotZnJlZV9wYWdlc19idWxrKHN0cnVjdCB6b25lICp6b25lLCBpbnQgY291bnQsCi0JCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIHVuc2lnbmVkIGludCBvcmRlcikKK3N0YXRpYyB2b2lkIGZyZWVfcGFnZXNfYnVsayhzdHJ1Y3Qgem9uZSAqem9uZSwgaW50IGNvdW50LAorCQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBpbnQgb3JkZXIpCiB7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwotCWludCByZXQgPSAwOwotCiAJc3Bpbl9sb2NrKCZ6b25lLT5sb2NrKTsKIAl6b25lLT5hbGxfdW5yZWNsYWltYWJsZSA9IDA7CiAJem9uZS0+cGFnZXNfc2Nhbm5lZCA9IDA7Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KGxpc3QpICYmIGNvdW50LS0pIHsKKwl3aGlsZSAoY291bnQtLSkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCQlCVUdfT04obGlzdF9lbXB0eShsaXN0KSk7CiAJCXBhZ2UgPSBsaXN0X2VudHJ5KGxpc3QtPnByZXYsIHN0cnVjdCBwYWdlLCBscnUpOwotCQkvKiBoYXZlIHRvIGRlbGV0ZSBpdCBhcyBfX2ZyZWVfcGFnZXNfYnVsayBsaXN0IG1hbmlwdWxhdGVzICovCisJCS8qIGhhdmUgdG8gZGVsZXRlIGl0IGFzIF9fZnJlZV9vbmVfcGFnZSBsaXN0IG1hbmlwdWxhdGVzICovCiAJCWxpc3RfZGVsKCZwYWdlLT5scnUpOwotCQlfX2ZyZWVfcGFnZXNfYnVsayhwYWdlLCB6b25lLCBvcmRlcik7Ci0JCXJldCsrOworCQlfX2ZyZWVfb25lX3BhZ2UocGFnZSwgem9uZSwgb3JkZXIpOwogCX0KIAlzcGluX3VubG9jaygmem9uZS0+bG9jayk7Ci0JcmV0dXJuIHJldDsKIH0KIAotdm9pZCBfX2ZyZWVfcGFnZXNfb2soc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBvcmRlcikKK3N0YXRpYyB2b2lkIGZyZWVfb25lX3BhZ2Uoc3RydWN0IHpvbmUgKnpvbmUsIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb3JkZXIpCit7CisJTElTVF9IRUFEKGxpc3QpOworCWxpc3RfYWRkKCZwYWdlLT5scnUsICZsaXN0KTsKKwlmcmVlX3BhZ2VzX2J1bGsoem9uZSwgMSwgJmxpc3QsIG9yZGVyKTsKK30KKworc3RhdGljIHZvaWQgX19mcmVlX3BhZ2VzX29rKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgb3JkZXIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlMSVNUX0hFQUQobGlzdCk7CiAJaW50IGk7CiAJaW50IHJlc2VydmVkID0gMDsKIAogCWFyY2hfZnJlZV9wYWdlKHBhZ2UsIG9yZGVyKTsKKwlpZiAoIVBhZ2VIaWdoTWVtKHBhZ2UpKQorCQltdXRleF9kZWJ1Z19jaGVja19ub19sb2Nrc19mcmVlZChwYWdlX2FkZHJlc3MocGFnZSksCisJCQkJCQkgUEFHRV9TSVpFPDxvcmRlcik7CiAKICNpZm5kZWYgQ09ORklHX01NVQotCWlmIChvcmRlciA+IDApCi0JCWZvciAoaSA9IDEgOyBpIDwgKDEgPDwgb3JkZXIpIDsgKytpKQotCQkJX19wdXRfcGFnZShwYWdlICsgaSk7CisJZm9yIChpID0gMSA7IGkgPCAoMSA8PCBvcmRlcikgOyArK2kpCisJCV9fcHV0X3BhZ2UocGFnZSArIGkpOwogI2VuZGlmCiAKIAlmb3IgKGkgPSAwIDsgaSA8ICgxIDw8IG9yZGVyKSA7ICsraSkKQEAgLTQyMywxMSArNDI5LDEwIEBACiAJaWYgKHJlc2VydmVkKQogCQlyZXR1cm47CiAKLQlsaXN0X2FkZCgmcGFnZS0+bHJ1LCAmbGlzdCk7Ci0Ja2VybmVsX21hcF9wYWdlcyhwYWdlLCAxPDxvcmRlciwgMCk7CisJa2VybmVsX21hcF9wYWdlcyhwYWdlLCAxIDw8IG9yZGVyLCAwKTsKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJX19tb2RfcGFnZV9zdGF0ZShwZ2ZyZWUsIDEgPDwgb3JkZXIpOwotCWZyZWVfcGFnZXNfYnVsayhwYWdlX3pvbmUocGFnZSksIDEsICZsaXN0LCBvcmRlcik7CisJZnJlZV9vbmVfcGFnZShwYWdlX3pvbmUocGFnZSksIHBhZ2UsIG9yZGVyKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKQEAgLTU5NiwxNCArNjAxLDEzIEBACiAJCWlmICh6b25lLT56b25lX3BnZGF0LT5ub2RlX2lkID09IG51bWFfbm9kZV9pZCgpKQogCQkJY29udGludWU7CiAKLQkJcHNldCA9IHpvbmUtPnBhZ2VzZXRbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwkJcHNldCA9IHpvbmVfcGNwKHpvbmUsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBzZXQtPnBjcCk7IGkrKykgewogCQkJc3RydWN0IHBlcl9jcHVfcGFnZXMgKnBjcDsKIAogCQkJcGNwID0gJnBzZXQtPnBjcFtpXTsKLQkJCWlmIChwY3AtPmNvdW50KQotCQkJCXBjcC0+Y291bnQgLT0gZnJlZV9wYWdlc19idWxrKHpvbmUsIHBjcC0+Y291bnQsCi0JCQkJCQkmcGNwLT5saXN0LCAwKTsKKwkJCWZyZWVfcGFnZXNfYnVsayh6b25lLCBwY3AtPmNvdW50LCAmcGNwLT5saXN0LCAwKTsKKwkJCXBjcC0+Y291bnQgPSAwOwogCQl9CiAJfQogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKQEAgLTYyNiw4ICs2MzAsOCBAQAogCiAJCQlwY3AgPSAmcHNldC0+cGNwW2ldOwogCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQkJcGNwLT5jb3VudCAtPSBmcmVlX3BhZ2VzX2J1bGsoem9uZSwgcGNwLT5jb3VudCwKLQkJCQkJCSZwY3AtPmxpc3QsIDApOworCQkJZnJlZV9wYWdlc19idWxrKHpvbmUsIHBjcC0+Y291bnQsICZwY3AtPmxpc3QsIDApOworCQkJcGNwLT5jb3VudCA9IDA7CiAJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJCX0KIAl9CkBAIC03MTgsOCArNzIyLDEwIEBACiAJX19pbmNfcGFnZV9zdGF0ZShwZ2ZyZWUpOwogCWxpc3RfYWRkKCZwYWdlLT5scnUsICZwY3AtPmxpc3QpOwogCXBjcC0+Y291bnQrKzsKLQlpZiAocGNwLT5jb3VudCA+PSBwY3AtPmhpZ2gpCi0JCXBjcC0+Y291bnQgLT0gZnJlZV9wYWdlc19idWxrKHpvbmUsIHBjcC0+YmF0Y2gsICZwY3AtPmxpc3QsIDApOworCWlmIChwY3AtPmNvdW50ID49IHBjcC0+aGlnaCkgeworCQlmcmVlX3BhZ2VzX2J1bGsoem9uZSwgcGNwLT5iYXRjaCwgJnBjcC0+bGlzdCwgMCk7CisJCXBjcC0+Y291bnQgLT0gcGNwLT5iYXRjaDsKKwl9CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCXB1dF9jcHUoKTsKIH0KQEAgLTc1OCw3ICs3NjQsNyBAQAogCiBhZ2FpbjoKIAljcHUgID0gZ2V0X2NwdSgpOwotCWlmIChvcmRlciA9PSAwKSB7CisJaWYgKGxpa2VseShvcmRlciA9PSAwKSkgewogCQlzdHJ1Y3QgcGVyX2NwdV9wYWdlcyAqcGNwOwogCiAJCXBjcCA9ICZ6b25lX3BjcCh6b25lLCBjcHUpLT5wY3BbY29sZF07CkBAIC04NzIsNyArODc4LDkgQEAKIAkJCQltYXJrID0gKCp6KS0+cGFnZXNfaGlnaDsKIAkJCWlmICghem9uZV93YXRlcm1hcmtfb2soKnosIG9yZGVyLCBtYXJrLAogCQkJCSAgICBjbGFzc3pvbmVfaWR4LCBhbGxvY19mbGFncykpCi0JCQkJY29udGludWU7CisJCQkJaWYgKCF6b25lX3JlY2xhaW1fbW9kZSB8fAorCQkJCSAgICAhem9uZV9yZWNsYWltKCp6LCBnZnBfbWFzaywgb3JkZXIpKQorCQkJCQljb250aW51ZTsKIAkJfQogCiAJCXBhZ2UgPSBidWZmZXJlZF9ybXF1ZXVlKHpvbmVsaXN0LCAqeiwgb3JkZXIsIGdmcF9tYXNrKTsKQEAgLTkyNSw3ICs5MzMsOCBAQAogCSAqCiAJICogVGhlIGNhbGxlciBtYXkgZGlwIGludG8gcGFnZSByZXNlcnZlcyBhIGJpdCBtb3JlIGlmIHRoZSBjYWxsZXIKIAkgKiBjYW5ub3QgcnVuIGRpcmVjdCByZWNsYWltLCBvciBpZiB0aGUgY2FsbGVyIGhhcyByZWFsdGltZSBzY2hlZHVsaW5nCi0JICogcG9saWN5LgorCSAqIHBvbGljeSBvciBpcyBhc2tpbmcgZm9yIF9fR0ZQX0hJR0ggbWVtb3J5LiAgR0ZQX0FUT01JQyByZXF1ZXN0cyB3aWxsCisJICogc2V0IGJvdGggQUxMT0NfSEFSREVSICghd2FpdCkgYW5kIEFMTE9DX0hJR0ggKF9fR0ZQX0hJR0gpLgogCSAqLwogCWFsbG9jX2ZsYWdzID0gQUxMT0NfV01BUktfTUlOOwogCWlmICgodW5saWtlbHkocnRfdGFzayhwKSkgJiYgIWluX2ludGVycnVwdCgpKSB8fCAhd2FpdCkKQEAgLTk3Myw2ICs5ODIsNyBAQAogCWNvbmRfcmVzY2hlZCgpOwogCiAJLyogV2Ugbm93IGdvIGludG8gc3luY2hyb25vdXMgcmVjbGFpbSAqLworCWNwdXNldF9tZW1vcnlfcHJlc3N1cmVfYnVtcCgpOwogCXAtPmZsYWdzIHw9IFBGX01FTUFMTE9DOwogCXJlY2xhaW1fc3RhdGUucmVjbGFpbWVkX3NsYWIgPSAwOwogCXAtPnJlY2xhaW1fc3RhdGUgPSAmcmVjbGFpbV9zdGF0ZTsKQEAgLTEyMDQsNiArMTIxNCw3IEBACiAJaW50IGNwdSA9IDA7CiAKIAltZW1zZXQocmV0LCAwLCBzaXplb2YoKnJldCkpOworCWNwdXNfYW5kKCpjcHVtYXNrLCAqY3B1bWFzaywgY3B1X29ubGluZV9tYXApOwogCiAJY3B1ID0gZmlyc3RfY3B1KCpjcHVtYXNrKTsKIAl3aGlsZSAoY3B1IDwgTlJfQ1BVUykgewpAQCAtMTI1Niw3ICsxMjY3LDcgQEAKIAl1bnNpZ25lZCBsb25nIHJldCA9IDA7CiAJaW50IGNwdTsKIAotCWZvcl9lYWNoX2NwdShjcHUpIHsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQl1bnNpZ25lZCBsb25nIGluOwogCiAJCWluID0gKHVuc2lnbmVkIGxvbmcpJnBlcl9jcHUocGFnZV9zdGF0ZXMsIGNwdSkgKyBvZmZzZXQ7CkBAIC0xNTg2LDEzICsxNTk3LDIyIEBACiAJcHJldl9ub2RlID0gbG9jYWxfbm9kZTsKIAlub2Rlc19jbGVhcih1c2VkX21hc2spOwogCXdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGUobG9jYWxfbm9kZSwgJnVzZWRfbWFzaykpID49IDApIHsKKwkJaW50IGRpc3RhbmNlID0gbm9kZV9kaXN0YW5jZShsb2NhbF9ub2RlLCBub2RlKTsKKworCQkvKgorCQkgKiBJZiBhbm90aGVyIG5vZGUgaXMgc3VmZmljaWVudGx5IGZhciBhd2F5IHRoZW4gaXQgaXMgYmV0dGVyCisJCSAqIHRvIHJlY2xhaW0gcGFnZXMgaW4gYSB6b25lIGJlZm9yZSBnb2luZyBvZmYgbm9kZS4KKwkJICovCisJCWlmIChkaXN0YW5jZSA+IFJFQ0xBSU1fRElTVEFOQ0UpCisJCQl6b25lX3JlY2xhaW1fbW9kZSA9IDE7CisKIAkJLyoKIAkJICogV2UgZG9uJ3Qgd2FudCB0byBwcmVzc3VyZSBhIHBhcnRpY3VsYXIgbm9kZS4KIAkJICogU28gYWRkaW5nIHBlbmFsdHkgdG8gdGhlIGZpcnN0IG5vZGUgaW4gc2FtZQogCQkgKiBkaXN0YW5jZSBncm91cCB0byBtYWtlIGl0IHJvdW5kLXJvYmluLgogCQkgKi8KLQkJaWYgKG5vZGVfZGlzdGFuY2UobG9jYWxfbm9kZSwgbm9kZSkgIT0KLQkJCQlub2RlX2Rpc3RhbmNlKGxvY2FsX25vZGUsIHByZXZfbm9kZSkpCisKKwkJaWYgKGRpc3RhbmNlICE9IG5vZGVfZGlzdGFuY2UobG9jYWxfbm9kZSwgcHJldl9ub2RlKSkKIAkJCW5vZGVfbG9hZFtub2RlXSArPSBsb2FkOwogCQlwcmV2X25vZGUgPSBub2RlOwogCQlsb2FkLS07CkBAIC0xNzI2LDE0ICsxNzQ2LDE0IEBACiAgKiB1cCBieSBmcmVlX2FsbF9ib290bWVtKCkgb25jZSB0aGUgZWFybHkgYm9vdCBwcm9jZXNzIGlzCiAgKiBkb25lLiBOb24tYXRvbWljIGluaXRpYWxpemF0aW9uLCBzaW5nbGUtcGFzcy4KICAqLwotdm9pZCBfX2RldmluaXQgbWVtbWFwX2luaXRfem9uZSh1bnNpZ25lZCBsb25nIHNpemUsIGludCBuaWQsIHVuc2lnbmVkIGxvbmcgem9uZSwKK3ZvaWQgX19tZW1pbml0IG1lbW1hcF9pbml0X3pvbmUodW5zaWduZWQgbG9uZyBzaXplLCBpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHpvbmUsCiAJCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuKQogewogCXN0cnVjdCBwYWdlICpwYWdlOwogCXVuc2lnbmVkIGxvbmcgZW5kX3BmbiA9IHN0YXJ0X3BmbiArIHNpemU7CiAJdW5zaWduZWQgbG9uZyBwZm47CiAKLQlmb3IgKHBmbiA9IHN0YXJ0X3BmbjsgcGZuIDwgZW5kX3BmbjsgcGZuKyssIHBhZ2UrKykgeworCWZvciAocGZuID0gc3RhcnRfcGZuOyBwZm4gPCBlbmRfcGZuOyBwZm4rKykgewogCQlpZiAoIWVhcmx5X3Bmbl92YWxpZChwZm4pKQogCQkJY29udGludWU7CiAJCXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOwpAQCAtMTc3OSw3ICsxNzk5LDcgQEAKIAltZW1tYXBfaW5pdF96b25lKChzaXplKSwgKG5pZCksICh6b25lKSwgKHN0YXJ0X3BmbikpCiAjZW5kaWYKIAotc3RhdGljIGludCBfX2RldmluaXQgem9uZV9iYXRjaHNpemUoc3RydWN0IHpvbmUgKnpvbmUpCitzdGF0aWMgaW50IF9fbWVtaW5pdCB6b25lX2JhdGNoc2l6ZShzdHJ1Y3Qgem9uZSAqem9uZSkKIHsKIAlpbnQgYmF0Y2g7CiAKQEAgLTE4MzAsNiArMTg1MCwyNCBAQAogCUlOSVRfTElTVF9IRUFEKCZwY3AtPmxpc3QpOwogfQogCisvKgorICogc2V0dXBfcGFnZWxpc3RfaGlnaG1hcmsoKSBzZXRzIHRoZSBoaWdoIHdhdGVyIG1hcmsgZm9yIGhvdCBwZXJfY3B1X3BhZ2VsaXN0CisgKiB0byB0aGUgdmFsdWUgaGlnaCBmb3IgdGhlIHBhZ2VzZXQgcC4KKyAqLworCitzdGF0aWMgdm9pZCBzZXR1cF9wYWdlbGlzdF9oaWdobWFyayhzdHJ1Y3QgcGVyX2NwdV9wYWdlc2V0ICpwLAorCQkJCXVuc2lnbmVkIGxvbmcgaGlnaCkKK3sKKwlzdHJ1Y3QgcGVyX2NwdV9wYWdlcyAqcGNwOworCisJcGNwID0gJnAtPnBjcFswXTsgLyogaG90IGxpc3QgKi8KKwlwY3AtPmhpZ2ggPSBoaWdoOworCXBjcC0+YmF0Y2ggPSBtYXgoMVVMLCBoaWdoLzQpOworCWlmICgoaGlnaC80KSA+IChQQUdFX1NISUZUICogOCkpCisJCXBjcC0+YmF0Y2ggPSBQQUdFX1NISUZUICogODsKK30KKworCiAjaWZkZWYgQ09ORklHX05VTUEKIC8qCiAgKiBCb290IHBhZ2VzZXQgdGFibGUuIE9uZSBwZXIgY3B1IHdoaWNoIGlzIGdvaW5nIHRvIGJlIHVzZWQgZm9yIGFsbApAQCAtMTg1NSwxOCArMTg5MywyMiBAQAogICogRHluYW1pY2FsbHkgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUKICAqIHBlciBjcHUgcGFnZXNldCBhcnJheSBpbiBzdHJ1Y3Qgem9uZS4KICAqLwotc3RhdGljIGludCBfX2RldmluaXQgcHJvY2Vzc196b25lcyhpbnQgY3B1KQorc3RhdGljIGludCBfX21lbWluaXQgcHJvY2Vzc196b25lcyhpbnQgY3B1KQogewogCXN0cnVjdCB6b25lICp6b25lLCAqZHpvbmU7CiAKIAlmb3JfZWFjaF96b25lKHpvbmUpIHsKIAotCQl6b25lLT5wYWdlc2V0W2NwdV0gPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBwZXJfY3B1X3BhZ2VzZXQpLAorCQl6b25lX3BjcCh6b25lLCBjcHUpID0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgcGVyX2NwdV9wYWdlc2V0KSwKIAkJCQkJIEdGUF9LRVJORUwsIGNwdV90b19ub2RlKGNwdSkpOwotCQlpZiAoIXpvbmUtPnBhZ2VzZXRbY3B1XSkKKwkJaWYgKCF6b25lX3BjcCh6b25lLCBjcHUpKQogCQkJZ290byBiYWQ7CiAKLQkJc2V0dXBfcGFnZXNldCh6b25lLT5wYWdlc2V0W2NwdV0sIHpvbmVfYmF0Y2hzaXplKHpvbmUpKTsKKwkJc2V0dXBfcGFnZXNldCh6b25lX3BjcCh6b25lLCBjcHUpLCB6b25lX2JhdGNoc2l6ZSh6b25lKSk7CisKKwkJaWYgKHBlcmNwdV9wYWdlbGlzdF9mcmFjdGlvbikKKwkJCXNldHVwX3BhZ2VsaXN0X2hpZ2htYXJrKHpvbmVfcGNwKHpvbmUsIGNwdSksCisJCQkgCSh6b25lLT5wcmVzZW50X3BhZ2VzIC8gcGVyY3B1X3BhZ2VsaXN0X2ZyYWN0aW9uKSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xODc0LDE1ICsxOTE2LDE0IEBACiAJZm9yX2VhY2hfem9uZShkem9uZSkgewogCQlpZiAoZHpvbmUgPT0gem9uZSkKIAkJCWJyZWFrOwotCQlrZnJlZShkem9uZS0+cGFnZXNldFtjcHVdKTsKLQkJZHpvbmUtPnBhZ2VzZXRbY3B1XSA9IE5VTEw7CisJCWtmcmVlKHpvbmVfcGNwKGR6b25lLCBjcHUpKTsKKwkJem9uZV9wY3AoZHpvbmUsIGNwdSkgPSBOVUxMOwogCX0KIAlyZXR1cm4gLUVOT01FTTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGZyZWVfem9uZV9wYWdlc2V0cyhpbnQgY3B1KQogewotI2lmZGVmIENPTkZJR19OVU1BCiAJc3RydWN0IHpvbmUgKnpvbmU7CiAKIAlmb3JfZWFjaF96b25lKHpvbmUpIHsKQEAgLTE4OTEsMTAgKzE5MzIsOSBAQAogCQl6b25lX3BjcCh6b25lLCBjcHUpID0gTlVMTDsKIAkJa2ZyZWUocHNldCk7CiAJfQotI2VuZGlmCiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHBhZ2VzZXRfY3B1dXBfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCitzdGF0aWMgaW50IF9fbWVtaW5pdCBwYWdlc2V0X2NwdXVwX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAogCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwKIAkJdm9pZCAqaGNwdSkKIHsKQEAgLTE5MzQsNyArMTk3NCw3IEBACiAKICNlbmRpZgogCi1zdGF0aWMgX19kZXZpbml0CitzdGF0aWMgX19tZW1pbml0CiB2b2lkIHpvbmVfd2FpdF90YWJsZV9pbml0KHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHpvbmVfc2l6ZV9wYWdlcykKIHsKIAlpbnQgaTsKQEAgLTE5NTQsNyArMTk5NCw3IEBACiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoem9uZS0+d2FpdF90YWJsZSArIGkpOwogfQogCi1zdGF0aWMgX19kZXZpbml0IHZvaWQgem9uZV9wY3BfaW5pdChzdHJ1Y3Qgem9uZSAqem9uZSkKK3N0YXRpYyBfX21lbWluaXQgdm9pZCB6b25lX3BjcF9pbml0KHN0cnVjdCB6b25lICp6b25lKQogewogCWludCBjcHU7CiAJdW5zaWduZWQgbG9uZyBiYXRjaCA9IHpvbmVfYmF0Y2hzaXplKHpvbmUpOwpAQCAtMTk2Miw3ICsyMDAyLDcgQEAKIAlmb3IgKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVM7IGNwdSsrKSB7CiAjaWZkZWYgQ09ORklHX05VTUEKIAkJLyogRWFybHkgYm9vdC4gU2xhYiBhbGxvY2F0b3Igbm90IGZ1bmN0aW9uYWwgeWV0ICovCi0JCXpvbmUtPnBhZ2VzZXRbY3B1XSA9ICZib290X3BhZ2VzZXRbY3B1XTsKKwkJem9uZV9wY3Aoem9uZSwgY3B1KSA9ICZib290X3BhZ2VzZXRbY3B1XTsKIAkJc2V0dXBfcGFnZXNldCgmYm9vdF9wYWdlc2V0W2NwdV0sMCk7CiAjZWxzZQogCQlzZXR1cF9wYWdlc2V0KHpvbmVfcGNwKHpvbmUsY3B1KSwgYmF0Y2gpOwpAQCAtMTk3Miw3ICsyMDEyLDcgQEAKIAkJem9uZS0+bmFtZSwgem9uZS0+cHJlc2VudF9wYWdlcywgYmF0Y2gpOwogfQogCi1zdGF0aWMgX19kZXZpbml0IHZvaWQgaW5pdF9jdXJyZW50bHlfZW1wdHlfem9uZShzdHJ1Y3Qgem9uZSAqem9uZSwKK3N0YXRpYyBfX21lbWluaXQgdm9pZCBpbml0X2N1cnJlbnRseV9lbXB0eV96b25lKHN0cnVjdCB6b25lICp6b25lLAogCQl1bnNpZ25lZCBsb25nIHpvbmVfc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCA9IHpvbmUtPnpvbmVfcGdkYXQ7CkBAIC0yMjA1LDcgKzIyNDUsNyBAQAogCQlzZXFfcHJpbnRmKG0sCiAJCQkgICAiKSIKIAkJCSAgICJcbiAgcGFnZXNldHMiKTsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoem9uZS0+cGFnZXNldCk7IGkrKykgeworCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKIAkJCXN0cnVjdCBwZXJfY3B1X3BhZ2VzZXQgKnBhZ2VzZXQ7CiAJCQlpbnQgajsKIApAQCAtMjU2OCw2ICsyNjA4LDMyIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBwZXJjcHVfcGFnZWxpc3RfZnJhY3Rpb24gLSBjaGFuZ2VzIHRoZSBwY3AtPmhpZ2ggZm9yIGVhY2ggem9uZSBvbiBlYWNoCisgKiBjcHUuICBJdCBpcyB0aGUgZnJhY3Rpb24gb2YgdG90YWwgcGFnZXMgaW4gZWFjaCB6b25lIHRoYXQgYSBob3QgcGVyIGNwdSBwYWdlbGlzdAorICogY2FuIGhhdmUgYmVmb3JlIGl0IGdldHMgZmx1c2hlZCBiYWNrIHRvIGJ1ZGR5IGFsbG9jYXRvci4KKyAqLworCitpbnQgcGVyY3B1X3BhZ2VsaXN0X2ZyYWN0aW9uX3N5c2N0bF9oYW5kbGVyKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwlzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgem9uZSAqem9uZTsKKwl1bnNpZ25lZCBpbnQgY3B1OworCWludCByZXQ7CisKKwlyZXQgPSBwcm9jX2RvaW50dmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGZpbGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTsKKwlpZiAoIXdyaXRlIHx8IChyZXQgPT0gLUVJTlZBTCkpCisJCXJldHVybiByZXQ7CisJZm9yX2VhY2hfem9uZSh6b25lKSB7CisJCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCQl1bnNpZ25lZCBsb25nICBoaWdoOworCQkJaGlnaCA9IHpvbmUtPnByZXNlbnRfcGFnZXMgLyBwZXJjcHVfcGFnZWxpc3RfZnJhY3Rpb247CisJCQlzZXR1cF9wYWdlbGlzdF9oaWdobWFyayh6b25lX3BjcCh6b25lLCBjcHUpLCBoaWdoKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKwogX19pbml0ZGF0YSBpbnQgaGFzaGRpc3QgPSBIQVNIRElTVF9ERUZBVUxUOwogCiAjaWZkZWYgQ09ORklHX05VTUEKZGlmZiAtLWdpdCBhL21tL3BkZmx1c2guYyBiL21tL3BkZmx1c2guYwppbmRleCA1MjgyMmM5Li5jNGI2ZDBhIDEwMDY0NAotLS0gYS9tbS9wZGZsdXNoLmMKKysrIGIvbW0vcGRmbHVzaC5jCkBAIC05MCw3ICs5MCw3IEBACiAKIHN0YXRpYyBpbnQgX19wZGZsdXNoKHN0cnVjdCBwZGZsdXNoX3dvcmsgKm15X3dvcmspCiB7Ci0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfRkxVU0hFUjsKKwljdXJyZW50LT5mbGFncyB8PSBQRl9GTFVTSEVSIHwgUEZfU1dBUFdSSVRFOwogCW15X3dvcmstPmZuID0gTlVMTDsKIAlteV93b3JrLT53aG8gPSBjdXJyZW50OwogCUlOSVRfTElTVF9IRUFEKCZteV93b3JrLT5saXN0KTsKZGlmZiAtLWdpdCBhL21tL3JtYXAuYyBiL21tL3JtYXAuYwppbmRleCA2ZjNmN2RiLi5kODVhOTlkIDEwMDY0NAotLS0gYS9tbS9ybWFwLmMKKysrIGIvbW0vcm1hcC5jCkBAIC0yMCwyMCArMjAsMjAgQEAKIC8qCiAgKiBMb2NrIG9yZGVyaW5nIGluIG1tOgogICoKLSAqIGlub2RlLT5pX3NlbQkod2hpbGUgd3JpdGluZyBvciB0cnVuY2F0aW5nLCBub3QgcmVhZGluZyBvciBmYXVsdGluZykKKyAqIGlub2RlLT5pX211dGV4CSh3aGlsZSB3cml0aW5nIG9yIHRydW5jYXRpbmcsIG5vdCByZWFkaW5nIG9yIGZhdWx0aW5nKQogICogICBpbm9kZS0+aV9hbGxvY19zZW0KICAqCiAgKiBXaGVuIGEgcGFnZSBmYXVsdCBvY2N1cnMgaW4gd3JpdGluZyBmcm9tIHVzZXIgdG8gZmlsZSwgZG93bl9yZWFkCi0gKiBvZiBtbWFwX3NlbSBuZXN0cyB3aXRoaW4gaV9zZW07IGluIHN5c19tc3luYywgaV9zZW0gbmVzdHMgd2l0aGluCi0gKiBkb3duX3JlYWQgb2YgbW1hcF9zZW07IGlfc2VtIGFuZCBkb3duX3dyaXRlIG9mIG1tYXBfc2VtIGFyZSBuZXZlcgotICogdGFrZW4gdG9nZXRoZXI7IGluIHRydW5jYXRpb24sIGlfc2VtIGlzIHRha2VuIG91dGVybW9zdC4KKyAqIG9mIG1tYXBfc2VtIG5lc3RzIHdpdGhpbiBpX211dGV4OyBpbiBzeXNfbXN5bmMsIGlfbXV0ZXggbmVzdHMgd2l0aGluCisgKiBkb3duX3JlYWQgb2YgbW1hcF9zZW07IGlfbXV0ZXggYW5kIGRvd25fd3JpdGUgb2YgbW1hcF9zZW0gYXJlIG5ldmVyCisgKiB0YWtlbiB0b2dldGhlcjsgaW4gdHJ1bmNhdGlvbiwgaV9tdXRleCBpcyB0YWtlbiBvdXRlcm1vc3QuCiAgKgogICogbW0tPm1tYXBfc2VtCiAgKiAgIHBhZ2UtPmZsYWdzIFBHX2xvY2tlZCAobG9ja19wYWdlKQogICogICAgIG1hcHBpbmctPmlfbW1hcF9sb2NrCiAgKiAgICAgICBhbm9uX3ZtYS0+bG9jawogICogICAgICAgICBtbS0+cGFnZV90YWJsZV9sb2NrIG9yIHB0ZV9sb2NrCi0gKiAgICAgICAgICAgem9uZS0+bHJ1X2xvY2sgKGluIG1hcmtfcGFnZV9hY2Nlc3NlZCkKKyAqICAgICAgICAgICB6b25lLT5scnVfbG9jayAoaW4gbWFya19wYWdlX2FjY2Vzc2VkLCBpc29sYXRlX2xydV9wYWdlKQogICogICAgICAgICAgIHN3YXBfbG9jayAoaW4gc3dhcF9kdXBsaWNhdGUsIHN3YXBfaW5mb19nZXQpCiAgKiAgICAgICAgICAgICBtbWxpc3RfbG9jayAoaW4gbW1wdXQsIGRyYWluX21tbGlzdCBhbmQgb3RoZXJzKQogICogICAgICAgICAgICAgbWFwcGluZy0+cHJpdmF0ZV9sb2NrIChpbiBfX3NldF9wYWdlX2RpcnR5X2J1ZmZlcnMpCkBAIC01MTQsNiArNTE0LDEzIEBACiB2b2lkIHBhZ2VfcmVtb3ZlX3JtYXAoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJaWYgKGF0b21pY19hZGRfbmVnYXRpdmUoLTEsICZwYWdlLT5fbWFwY291bnQpKSB7CisJCWlmIChwYWdlX21hcGNvdW50KHBhZ2UpIDwgMCkgeworCQkJcHJpbnRrIChLRVJOX0VNRVJHICJFZWVrISBwYWdlX21hcGNvdW50KHBhZ2UpIHdlbnQgbmVnYXRpdmUhICglZClcbiIsIHBhZ2VfbWFwY291bnQocGFnZSkpOworCQkJcHJpbnRrIChLRVJOX0VNRVJHICIgIHBhZ2UtPmZsYWdzID0gJWx4XG4iLCBwYWdlLT5mbGFncyk7CisJCQlwcmludGsgKEtFUk5fRU1FUkcgIiAgcGFnZS0+Y291bnQgPSAleFxuIiwgcGFnZV9jb3VudChwYWdlKSk7CisJCQlwcmludGsgKEtFUk5fRU1FUkcgIiAgcGFnZS0+bWFwcGluZyA9ICVwXG4iLCBwYWdlLT5tYXBwaW5nKTsKKwkJfQorCiAJCUJVR19PTihwYWdlX21hcGNvdW50KHBhZ2UpIDwgMCk7CiAJCS8qCiAJCSAqIEl0IHdvdWxkIGJlIHRpZHkgdG8gcmVzZXQgdGhlIFBhZ2VBbm9uIG1hcHBpbmcgaGVyZSwKZGlmZiAtLWdpdCBhL21tL3NobWVtLmMgYi9tbS9zaG1lbS5jCmluZGV4IGExZjJmMDIuLmNlNTAxYmMgMTAwNjQ0Ci0tLSBhL21tL3NobWVtLmMKKysrIGIvbW0vc2htZW0uYwpAQCAtMTMxNiw3ICsxMzE2LDggQEAKIAkJY2FzZSBTX0lGUkVHOgogCQkJaW5vZGUtPmlfb3AgPSAmc2htZW1faW5vZGVfb3BlcmF0aW9uczsKIAkJCWlub2RlLT5pX2ZvcCA9ICZzaG1lbV9maWxlX29wZXJhdGlvbnM7Ci0JCQltcG9sX3NoYXJlZF9wb2xpY3lfaW5pdCgmaW5mby0+cG9saWN5KTsKKwkJCW1wb2xfc2hhcmVkX3BvbGljeV9pbml0KCZpbmZvLT5wb2xpY3ksIHNiaW5mby0+cG9saWN5LAorCQkJCQkJCSZzYmluZm8tPnBvbGljeV9ub2Rlcyk7CiAJCQlicmVhazsKIAkJY2FzZSBTX0lGRElSOgogCQkJaW5vZGUtPmlfbmxpbmsrKzsKQEAgLTEzMzAsNyArMTMzMSw4IEBACiAJCQkgKiBNdXN0IG5vdCBsb2FkIGFueXRoaW5nIGluIHRoZSByYnRyZWUsCiAJCQkgKiBtcG9sX2ZyZWVfc2hhcmVkX3BvbGljeSB3aWxsIG5vdCBiZSBjYWxsZWQuCiAJCQkgKi8KLQkJCW1wb2xfc2hhcmVkX3BvbGljeV9pbml0KCZpbmZvLT5wb2xpY3kpOworCQkJbXBvbF9zaGFyZWRfcG9saWN5X2luaXQoJmluZm8tPnBvbGljeSwgTVBPTF9ERUZBVUxULAorCQkJCQkJTlVMTCk7CiAJCQlicmVhazsKIAkJfQogCX0gZWxzZSBpZiAoc2JpbmZvLT5tYXhfaW5vZGVzKSB7CkBAIC0xMzcwLDcgKzEzNzIsNyBAQAogCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWYsIGNvdW50KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlkb3duKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAogCXBvcyA9ICpwcG9zOwogCXdyaXR0ZW4gPSAwOwpAQCAtMTQ1NSw3ICsxNDU3LDcgQEAKIAlpZiAod3JpdHRlbikKIAkJZXJyID0gd3JpdHRlbjsKIG91dDoKLQl1cCgmaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xNDkxLDcgKzE0OTMsNyBAQAogCiAJCS8qCiAJCSAqIFdlIG11c3QgZXZhbHVhdGUgYWZ0ZXIsIHNpbmNlIHJlYWRzICh1bmxpa2Ugd3JpdGVzKQotCQkgKiBhcmUgY2FsbGVkIHdpdGhvdXQgaV9zZW0gcHJvdGVjdGlvbiBhZ2FpbnN0IHRydW5jYXRlCisJCSAqIGFyZSBjYWxsZWQgd2l0aG91dCBpX211dGV4IHByb3RlY3Rpb24gYWdhaW5zdCB0cnVuY2F0ZQogCQkgKi8KIAkJbnIgPSBQQUdFX0NBQ0hFX1NJWkU7CiAJCWlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKQEAgLTE4NDMsNyArMTg0NSw5IEBACiAJLnB1dF9saW5rCT0gc2htZW1fcHV0X2xpbmssCiB9OwogCi1zdGF0aWMgaW50IHNobWVtX3BhcnNlX29wdGlvbnMoY2hhciAqb3B0aW9ucywgaW50ICptb2RlLCB1aWRfdCAqdWlkLCBnaWRfdCAqZ2lkLCB1bnNpZ25lZCBsb25nICpibG9ja3MsIHVuc2lnbmVkIGxvbmcgKmlub2RlcykKK3N0YXRpYyBpbnQgc2htZW1fcGFyc2Vfb3B0aW9ucyhjaGFyICpvcHRpb25zLCBpbnQgKm1vZGUsIHVpZF90ICp1aWQsCisJZ2lkX3QgKmdpZCwgdW5zaWduZWQgbG9uZyAqYmxvY2tzLCB1bnNpZ25lZCBsb25nICppbm9kZXMsCisJaW50ICpwb2xpY3ksIG5vZGVtYXNrX3QgKnBvbGljeV9ub2RlcykKIHsKIAljaGFyICp0aGlzX2NoYXIsICp2YWx1ZSwgKnJlc3Q7CiAKQEAgLTE4OTcsNiArMTkwMSwxOSBAQAogCQkJKmdpZCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCZyZXN0LDApOwogCQkJaWYgKCpyZXN0KQogCQkJCWdvdG8gYmFkX3ZhbDsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwibXBvbCIpKSB7CisJCQlpZiAoIXN0cmNtcCh2YWx1ZSwiZGVmYXVsdCIpKQorCQkJCSpwb2xpY3kgPSBNUE9MX0RFRkFVTFQ7CisJCQllbHNlIGlmICghc3RyY21wKHZhbHVlLCJwcmVmZXJyZWQiKSkKKwkJCQkqcG9saWN5ID0gTVBPTF9QUkVGRVJSRUQ7CisJCQllbHNlIGlmICghc3RyY21wKHZhbHVlLCJiaW5kIikpCisJCQkJKnBvbGljeSA9IE1QT0xfQklORDsKKwkJCWVsc2UgaWYgKCFzdHJjbXAodmFsdWUsImludGVybGVhdmUiKSkKKwkJCQkqcG9saWN5ID0gTVBPTF9JTlRFUkxFQVZFOworCQkJZWxzZQorCQkJCWdvdG8gYmFkX3ZhbDsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwibXBvbF9ub2RlbGlzdCIpKSB7CisJCQlub2RlbGlzdF9wYXJzZSh2YWx1ZSwgKnBvbGljeV9ub2Rlcyk7CiAJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9FUlIgInRtcGZzOiBCYWQgbW91bnQgb3B0aW9uICVzXG4iLAogCQkJICAgICAgIHRoaXNfY2hhcik7CkBAIC0xOTE3LDEyICsxOTM0LDE0IEBACiAJc3RydWN0IHNobWVtX3NiX2luZm8gKnNiaW5mbyA9IFNITUVNX1NCKHNiKTsKIAl1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MgPSBzYmluZm8tPm1heF9ibG9ja3M7CiAJdW5zaWduZWQgbG9uZyBtYXhfaW5vZGVzID0gc2JpbmZvLT5tYXhfaW5vZGVzOworCWludCBwb2xpY3kgPSBzYmluZm8tPnBvbGljeTsKKwlub2RlbWFza190IHBvbGljeV9ub2RlcyA9IHNiaW5mby0+cG9saWN5X25vZGVzOwogCXVuc2lnbmVkIGxvbmcgYmxvY2tzOwogCXVuc2lnbmVkIGxvbmcgaW5vZGVzOwogCWludCBlcnJvciA9IC1FSU5WQUw7CiAKLQlpZiAoc2htZW1fcGFyc2Vfb3B0aW9ucyhkYXRhLCBOVUxMLCBOVUxMLCBOVUxMLAotCQkJCSZtYXhfYmxvY2tzLCAmbWF4X2lub2RlcykpCisJaWYgKHNobWVtX3BhcnNlX29wdGlvbnMoZGF0YSwgTlVMTCwgTlVMTCwgTlVMTCwgJm1heF9ibG9ja3MsCisJCQkJJm1heF9pbm9kZXMsICZwb2xpY3ksICZwb2xpY3lfbm9kZXMpKQogCQlyZXR1cm4gZXJyb3I7CiAKIAlzcGluX2xvY2soJnNiaW5mby0+c3RhdF9sb2NrKTsKQEAgLTE5NDgsNiArMTk2Nyw4IEBACiAJc2JpbmZvLT5mcmVlX2Jsb2NrcyA9IG1heF9ibG9ja3MgLSBibG9ja3M7CiAJc2JpbmZvLT5tYXhfaW5vZGVzICA9IG1heF9pbm9kZXM7CiAJc2JpbmZvLT5mcmVlX2lub2RlcyA9IG1heF9pbm9kZXMgLSBpbm9kZXM7CisJc2JpbmZvLT5wb2xpY3kgPSBwb2xpY3k7CisJc2JpbmZvLT5wb2xpY3lfbm9kZXMgPSBwb2xpY3lfbm9kZXM7CiBvdXQ6CiAJc3Bpbl91bmxvY2soJnNiaW5mby0+c3RhdF9sb2NrKTsKIAlyZXR1cm4gZXJyb3I7CkBAIC0xOTcyLDYgKzE5OTMsOCBAQAogCXN0cnVjdCBzaG1lbV9zYl9pbmZvICpzYmluZm87CiAJdW5zaWduZWQgbG9uZyBibG9ja3MgPSAwOwogCXVuc2lnbmVkIGxvbmcgaW5vZGVzID0gMDsKKwlpbnQgcG9saWN5ID0gTVBPTF9ERUZBVUxUOworCW5vZGVtYXNrX3QgcG9saWN5X25vZGVzID0gbm9kZV9vbmxpbmVfbWFwOwogCiAjaWZkZWYgQ09ORklHX1RNUEZTCiAJLyoKQEAgLTE5ODQsOCArMjAwNyw4IEBACiAJCWlub2RlcyA9IHRvdGFscmFtX3BhZ2VzIC0gdG90YWxoaWdoX3BhZ2VzOwogCQlpZiAoaW5vZGVzID4gYmxvY2tzKQogCQkJaW5vZGVzID0gYmxvY2tzOwotCQlpZiAoc2htZW1fcGFyc2Vfb3B0aW9ucyhkYXRhLCAmbW9kZSwgJnVpZCwgJmdpZCwKLQkJCQkJJmJsb2NrcywgJmlub2RlcykpCisJCWlmIChzaG1lbV9wYXJzZV9vcHRpb25zKGRhdGEsICZtb2RlLCAmdWlkLCAmZ2lkLCAmYmxvY2tzLAorCQkJCQkmaW5vZGVzLCAmcG9saWN5LCAmcG9saWN5X25vZGVzKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KICNlbHNlCkBAIC0yMDAzLDYgKzIwMjYsOCBAQAogCXNiaW5mby0+ZnJlZV9ibG9ja3MgPSBibG9ja3M7CiAJc2JpbmZvLT5tYXhfaW5vZGVzID0gaW5vZGVzOwogCXNiaW5mby0+ZnJlZV9pbm9kZXMgPSBpbm9kZXM7CisJc2JpbmZvLT5wb2xpY3kgPSBwb2xpY3k7CisJc2JpbmZvLT5wb2xpY3lfbm9kZXMgPSBwb2xpY3lfbm9kZXM7CiAKIAlzYi0+c19mc19pbmZvID0gc2JpbmZvOwogCXNiLT5zX21heGJ5dGVzID0gU0hNRU1fTUFYX0JZVEVTOwpkaWZmIC0tZ2l0IGEvbW0vc2xhYi5jIGIvbW0vc2xhYi5jCmluZGV4IGU1ZWMyNmUuLjZmODQ5NWUgMTAwNjQ0Ci0tLSBhL21tL3NsYWIuYworKysgYi9tbS9zbGFiLmMKQEAgLTY4LDcgKzY4LDcgQEAKICAqIEZ1cnRoZXIgbm90ZXMgZnJvbSB0aGUgb3JpZ2luYWwgZG9jdW1lbnRhdGlvbjoKICAqCiAgKiAxMSBBcHJpbCAnOTcuICBTdGFydGVkIG11bHRpLXRocmVhZGluZyAtIG1hcmtoZQotICoJVGhlIGdsb2JhbCBjYWNoZS1jaGFpbiBpcyBwcm90ZWN0ZWQgYnkgdGhlIHNlbWFwaG9yZSAnY2FjaGVfY2hhaW5fc2VtJy4KKyAqCVRoZSBnbG9iYWwgY2FjaGUtY2hhaW4gaXMgcHJvdGVjdGVkIGJ5IHRoZSBtdXRleCAnY2FjaGVfY2hhaW5fbXV0ZXgnLgogICoJVGhlIHNlbSBpcyBvbmx5IG5lZWRlZCB3aGVuIGFjY2Vzc2luZy9leHRlbmRpbmcgdGhlIGNhY2hlLWNoYWluLCB3aGljaAogICoJY2FuIG5ldmVyIGhhcHBlbiBpbnNpZGUgYW4gaW50ZXJydXB0IChrbWVtX2NhY2hlX2NyZWF0ZSgpLAogICoJa21lbV9jYWNoZV9zaHJpbmsoKSBhbmQga21lbV9jYWNoZV9yZWFwKCkpLgpAQCAtMTAzLDYgKzEwMyw4IEBACiAjaW5jbHVkZQk8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlCTxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlCTxsaW51eC9ub2RlbWFzay5oPgorI2luY2x1ZGUJPGxpbnV4L21lbXBvbGljeS5oPgorI2luY2x1ZGUJPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlCTxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUJPGFzbS9jYWNoZWZsdXNoLmg+CkBAIC0xMzAsNyArMTMyLDYgQEAKICNkZWZpbmUJRk9SQ0VEX0RFQlVHCTAKICNlbmRpZgogCi0KIC8qIFNob3VsZG4ndCB0aGlzIGJlIGluIGEgaGVhZGVyIGZpbGUgc29tZXdoZXJlPyAqLwogI2RlZmluZQlCWVRFU19QRVJfV09SRAkJc2l6ZW9mKHZvaWQgKikKIApAQCAtMjE3LDEyICsyMTgsMTIgQEAKICAqIFNsYWJzIGFyZSBjaGFpbmVkIGludG8gdGhyZWUgbGlzdDogZnVsbHkgdXNlZCwgcGFydGlhbCwgZnVsbHkgZnJlZSBzbGFicy4KICAqLwogc3RydWN0IHNsYWIgewotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKLQl1bnNpZ25lZCBsb25nCQljb2xvdXJvZmY7Ci0Jdm9pZAkJCSpzX21lbTsJCS8qIGluY2x1ZGluZyBjb2xvdXIgb2Zmc2V0ICovCi0JdW5zaWduZWQgaW50CQlpbnVzZTsJCS8qIG51bSBvZiBvYmpzIGFjdGl2ZSBpbiBzbGFiICovCi0Ja21lbV9idWZjdGxfdAkJZnJlZTsKLQl1bnNpZ25lZCBzaG9ydCAgICAgICAgICBub2RlaWQ7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVuc2lnbmVkIGxvbmcgY29sb3Vyb2ZmOworCXZvaWQgKnNfbWVtOwkJLyogaW5jbHVkaW5nIGNvbG91ciBvZmZzZXQgKi8KKwl1bnNpZ25lZCBpbnQgaW51c2U7CS8qIG51bSBvZiBvYmpzIGFjdGl2ZSBpbiBzbGFiICovCisJa21lbV9idWZjdGxfdCBmcmVlOworCXVuc2lnbmVkIHNob3J0IG5vZGVpZDsKIH07CiAKIC8qCkBAIC0yNDIsOSArMjQzLDkgQEAKICAqIFdlIGFzc3VtZSBzdHJ1Y3Qgc2xhYl9yY3UgY2FuIG92ZXJsYXkgc3RydWN0IHNsYWIgd2hlbiBkZXN0cm95aW5nLgogICovCiBzdHJ1Y3Qgc2xhYl9yY3UgewotCXN0cnVjdCByY3VfaGVhZAkJaGVhZDsKLQlrbWVtX2NhY2hlX3QJCSpjYWNoZXA7Ci0Jdm9pZAkJCSphZGRyOworCXN0cnVjdCByY3VfaGVhZCBoZWFkOworCWttZW1fY2FjaGVfdCAqY2FjaGVwOworCXZvaWQgKmFkZHI7CiB9OwogCiAvKgpAQCAtMjc5LDIzICsyODAsMjMgQEAKICNkZWZpbmUgQk9PVF9DUFVDQUNIRV9FTlRSSUVTCTEKIHN0cnVjdCBhcnJheWNhY2hlX2luaXQgewogCXN0cnVjdCBhcnJheV9jYWNoZSBjYWNoZTsKLQl2b2lkICogZW50cmllc1tCT09UX0NQVUNBQ0hFX0VOVFJJRVNdOworCXZvaWQgKmVudHJpZXNbQk9PVF9DUFVDQUNIRV9FTlRSSUVTXTsKIH07CiAKIC8qCiAgKiBUaGUgc2xhYiBsaXN0cyBmb3IgYWxsIG9iamVjdHMuCiAgKi8KIHN0cnVjdCBrbWVtX2xpc3QzIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCXNsYWJzX3BhcnRpYWw7CS8qIHBhcnRpYWwgbGlzdCBmaXJzdCwgYmV0dGVyIGFzbSBjb2RlICovCi0Jc3RydWN0IGxpc3RfaGVhZAlzbGFic19mdWxsOwotCXN0cnVjdCBsaXN0X2hlYWQJc2xhYnNfZnJlZTsKLQl1bnNpZ25lZCBsb25nCWZyZWVfb2JqZWN0czsKLQl1bnNpZ25lZCBsb25nCW5leHRfcmVhcDsKLQlpbnQJCWZyZWVfdG91Y2hlZDsKLQl1bnNpZ25lZCBpbnQgCWZyZWVfbGltaXQ7Ci0Jc3BpbmxvY2tfdCAgICAgIGxpc3RfbG9jazsKLQlzdHJ1Y3QgYXJyYXlfY2FjaGUJKnNoYXJlZDsJLyogc2hhcmVkIHBlciBub2RlICovCi0Jc3RydWN0IGFycmF5X2NhY2hlCSoqYWxpZW47CS8qIG9uIG90aGVyIG5vZGVzICovCisJc3RydWN0IGxpc3RfaGVhZCBzbGFic19wYXJ0aWFsOwkvKiBwYXJ0aWFsIGxpc3QgZmlyc3QsIGJldHRlciBhc20gY29kZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgc2xhYnNfZnVsbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHNsYWJzX2ZyZWU7CisJdW5zaWduZWQgbG9uZyBmcmVlX29iamVjdHM7CisJdW5zaWduZWQgbG9uZyBuZXh0X3JlYXA7CisJaW50IGZyZWVfdG91Y2hlZDsKKwl1bnNpZ25lZCBpbnQgZnJlZV9saW1pdDsKKwlzcGlubG9ja190IGxpc3RfbG9jazsKKwlzdHJ1Y3QgYXJyYXlfY2FjaGUgKnNoYXJlZDsJLyogc2hhcmVkIHBlciBub2RlICovCisJc3RydWN0IGFycmF5X2NhY2hlICoqYWxpZW47CS8qIG9uIG90aGVyIG5vZGVzICovCiB9OwogCiAvKgpAQCAtMzY3LDYzICszNjgsNjMgQEAKICAqCiAgKiBtYW5hZ2VzIGEgY2FjaGUuCiAgKi8KLQkKKwogc3RydWN0IGttZW1fY2FjaGUgewogLyogMSkgcGVyLWNwdSBkYXRhLCB0b3VjaGVkIGR1cmluZyBldmVyeSBhbGxvYy9mcmVlICovCi0Jc3RydWN0IGFycmF5X2NhY2hlCSphcnJheVtOUl9DUFVTXTsKLQl1bnNpZ25lZCBpbnQJCWJhdGNoY291bnQ7Ci0JdW5zaWduZWQgaW50CQlsaW1pdDsKLQl1bnNpZ25lZCBpbnQgCQlzaGFyZWQ7Ci0JdW5zaWduZWQgaW50CQlvYmpzaXplOworCXN0cnVjdCBhcnJheV9jYWNoZSAqYXJyYXlbTlJfQ1BVU107CisJdW5zaWduZWQgaW50IGJhdGNoY291bnQ7CisJdW5zaWduZWQgaW50IGxpbWl0OworCXVuc2lnbmVkIGludCBzaGFyZWQ7CisJdW5zaWduZWQgaW50IG9ianNpemU7CiAvKiAyKSB0b3VjaGVkIGJ5IGV2ZXJ5IGFsbG9jICYgZnJlZSBmcm9tIHRoZSBiYWNrZW5kICovCi0Jc3RydWN0IGttZW1fbGlzdDMJKm5vZGVsaXN0c1tNQVhfTlVNTk9ERVNdOwotCXVuc2lnbmVkIGludAkgCWZsYWdzOwkvKiBjb25zdGFudCBmbGFncyAqLwotCXVuc2lnbmVkIGludAkJbnVtOwkvKiAjIG9mIG9ianMgcGVyIHNsYWIgKi8KLQlzcGlubG9ja190CQlzcGlubG9jazsKKwlzdHJ1Y3Qga21lbV9saXN0MyAqbm9kZWxpc3RzW01BWF9OVU1OT0RFU107CisJdW5zaWduZWQgaW50IGZsYWdzOwkvKiBjb25zdGFudCBmbGFncyAqLworCXVuc2lnbmVkIGludCBudW07CS8qICMgb2Ygb2JqcyBwZXIgc2xhYiAqLworCXNwaW5sb2NrX3Qgc3BpbmxvY2s7CiAKIC8qIDMpIGNhY2hlX2dyb3cvc2hyaW5rICovCiAJLyogb3JkZXIgb2YgcGdzIHBlciBzbGFiICgyXm4pICovCi0JdW5zaWduZWQgaW50CQlnZnBvcmRlcjsKKwl1bnNpZ25lZCBpbnQgZ2Zwb3JkZXI7CiAKIAkvKiBmb3JjZSBHRlAgZmxhZ3MsIGUuZy4gR0ZQX0RNQSAqLwotCWdmcF90CQkJZ2ZwZmxhZ3M7CisJZ2ZwX3QgZ2ZwZmxhZ3M7CiAKLQlzaXplX3QJCQljb2xvdXI7CQkvKiBjYWNoZSBjb2xvdXJpbmcgcmFuZ2UgKi8KLQl1bnNpZ25lZCBpbnQJCWNvbG91cl9vZmY7CS8qIGNvbG91ciBvZmZzZXQgKi8KLQl1bnNpZ25lZCBpbnQJCWNvbG91cl9uZXh0OwkvKiBjYWNoZSBjb2xvdXJpbmcgKi8KLQlrbWVtX2NhY2hlX3QJCSpzbGFicF9jYWNoZTsKLQl1bnNpZ25lZCBpbnQJCXNsYWJfc2l6ZTsKLQl1bnNpZ25lZCBpbnQJCWRmbGFnczsJCS8qIGR5bmFtaWMgZmxhZ3MgKi8KKwlzaXplX3QgY29sb3VyOwkJLyogY2FjaGUgY29sb3VyaW5nIHJhbmdlICovCisJdW5zaWduZWQgaW50IGNvbG91cl9vZmY7CS8qIGNvbG91ciBvZmZzZXQgKi8KKwl1bnNpZ25lZCBpbnQgY29sb3VyX25leHQ7CS8qIGNhY2hlIGNvbG91cmluZyAqLworCWttZW1fY2FjaGVfdCAqc2xhYnBfY2FjaGU7CisJdW5zaWduZWQgaW50IHNsYWJfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZGZsYWdzOwkvKiBkeW5hbWljIGZsYWdzICovCiAKIAkvKiBjb25zdHJ1Y3RvciBmdW5jICovCi0Jdm9pZCAoKmN0b3IpKHZvaWQgKiwga21lbV9jYWNoZV90ICosIHVuc2lnbmVkIGxvbmcpOworCXZvaWQgKCpjdG9yKSAodm9pZCAqLCBrbWVtX2NhY2hlX3QgKiwgdW5zaWduZWQgbG9uZyk7CiAKIAkvKiBkZS1jb25zdHJ1Y3RvciBmdW5jICovCi0Jdm9pZCAoKmR0b3IpKHZvaWQgKiwga21lbV9jYWNoZV90ICosIHVuc2lnbmVkIGxvbmcpOworCXZvaWQgKCpkdG9yKSAodm9pZCAqLCBrbWVtX2NhY2hlX3QgKiwgdW5zaWduZWQgbG9uZyk7CiAKIC8qIDQpIGNhY2hlIGNyZWF0aW9uL3JlbW92YWwgKi8KLQljb25zdCBjaGFyCQkqbmFtZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkCW5leHQ7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5leHQ7CiAKIC8qIDUpIHN0YXRpc3RpY3MgKi8KICNpZiBTVEFUUwotCXVuc2lnbmVkIGxvbmcJCW51bV9hY3RpdmU7Ci0JdW5zaWduZWQgbG9uZwkJbnVtX2FsbG9jYXRpb25zOwotCXVuc2lnbmVkIGxvbmcJCWhpZ2hfbWFyazsKLQl1bnNpZ25lZCBsb25nCQlncm93bjsKLQl1bnNpZ25lZCBsb25nCQlyZWFwZWQ7Ci0JdW5zaWduZWQgbG9uZyAJCWVycm9yczsKLQl1bnNpZ25lZCBsb25nCQltYXhfZnJlZWFibGU7Ci0JdW5zaWduZWQgbG9uZwkJbm9kZV9hbGxvY3M7Ci0JdW5zaWduZWQgbG9uZwkJbm9kZV9mcmVlczsKLQlhdG9taWNfdAkJYWxsb2NoaXQ7Ci0JYXRvbWljX3QJCWFsbG9jbWlzczsKLQlhdG9taWNfdAkJZnJlZWhpdDsKLQlhdG9taWNfdAkJZnJlZW1pc3M7CisJdW5zaWduZWQgbG9uZyBudW1fYWN0aXZlOworCXVuc2lnbmVkIGxvbmcgbnVtX2FsbG9jYXRpb25zOworCXVuc2lnbmVkIGxvbmcgaGlnaF9tYXJrOworCXVuc2lnbmVkIGxvbmcgZ3Jvd247CisJdW5zaWduZWQgbG9uZyByZWFwZWQ7CisJdW5zaWduZWQgbG9uZyBlcnJvcnM7CisJdW5zaWduZWQgbG9uZyBtYXhfZnJlZWFibGU7CisJdW5zaWduZWQgbG9uZyBub2RlX2FsbG9jczsKKwl1bnNpZ25lZCBsb25nIG5vZGVfZnJlZXM7CisJYXRvbWljX3QgYWxsb2NoaXQ7CisJYXRvbWljX3QgYWxsb2NtaXNzOworCWF0b21pY190IGZyZWVoaXQ7CisJYXRvbWljX3QgZnJlZW1pc3M7CiAjZW5kaWYKICNpZiBERUJVRwotCWludAkJCWRiZ2hlYWQ7Ci0JaW50CQkJcmVhbGxlbjsKKwlpbnQgZGJnaGVhZDsKKwlpbnQgcmVhbGxlbjsKICNlbmRpZgogfTsKIApAQCAtNTIzLDE0ICs1MjQsMTUgQEAKIHsKIAlCVUdfT04oIShjYWNoZXAtPmZsYWdzICYgU0xBQl9SRURfWk9ORSkpOwogCWlmIChjYWNoZXAtPmZsYWdzICYgU0xBQl9TVE9SRV9VU0VSKQotCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcqKSAob2JqcCtjYWNoZXAtPm9ianNpemUtMipCWVRFU19QRVJfV09SRCk7Ci0JcmV0dXJuICh1bnNpZ25lZCBsb25nKikgKG9ianArY2FjaGVwLT5vYmpzaXplLUJZVEVTX1BFUl9XT1JEKTsKKwkJcmV0dXJuICh1bnNpZ25lZCBsb25nICopKG9ianAgKyBjYWNoZXAtPm9ianNpemUgLQorCQkJCQkgMiAqIEJZVEVTX1BFUl9XT1JEKTsKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcgKikob2JqcCArIGNhY2hlcC0+b2Jqc2l6ZSAtIEJZVEVTX1BFUl9XT1JEKTsKIH0KIAogc3RhdGljIHZvaWQgKipkYmdfdXNlcndvcmQoa21lbV9jYWNoZV90ICpjYWNoZXAsIHZvaWQgKm9ianApCiB7CiAJQlVHX09OKCEoY2FjaGVwLT5mbGFncyAmIFNMQUJfU1RPUkVfVVNFUikpOwotCXJldHVybiAodm9pZCoqKShvYmpwK2NhY2hlcC0+b2Jqc2l6ZS1CWVRFU19QRVJfV09SRCk7CisJcmV0dXJuICh2b2lkICoqKShvYmpwICsgY2FjaGVwLT5vYmpzaXplIC0gQllURVNfUEVSX1dPUkQpOwogfQogCiAjZWxzZQpAQCAtNjA3LDMxICs2MDksMzEgQEAKIHN0YXRpYyBzdHJ1Y3QgY2FjaGVfbmFtZXMgX19pbml0ZGF0YSBjYWNoZV9uYW1lc1tdID0gewogI2RlZmluZSBDQUNIRSh4KSB7IC5uYW1lID0gInNpemUtIiAjeCwgLm5hbWVfZG1hID0gInNpemUtIiAjeCAiKERNQSkiIH0sCiAjaW5jbHVkZSA8bGludXgva21hbGxvY19zaXplcy5oPgotCXsgTlVMTCwgfQorCXtOVUxMLH0KICN1bmRlZiBDQUNIRQogfTsKIAogc3RhdGljIHN0cnVjdCBhcnJheWNhY2hlX2luaXQgaW5pdGFycmF5X2NhY2hlIF9faW5pdGRhdGEgPQotCXsgeyAwLCBCT09UX0NQVUNBQ0hFX0VOVFJJRVMsIDEsIDB9IH07CisgICAgeyB7MCwgQk9PVF9DUFVDQUNIRV9FTlRSSUVTLCAxLCAwfSB9Owogc3RhdGljIHN0cnVjdCBhcnJheWNhY2hlX2luaXQgaW5pdGFycmF5X2dlbmVyaWMgPQotCXsgeyAwLCBCT09UX0NQVUNBQ0hFX0VOVFJJRVMsIDEsIDB9IH07CisgICAgeyB7MCwgQk9PVF9DUFVDQUNIRV9FTlRSSUVTLCAxLCAwfSB9OwogCiAvKiBpbnRlcm5hbCBjYWNoZSBvZiBjYWNoZSBkZXNjcmlwdGlvbiBvYmpzICovCiBzdGF0aWMga21lbV9jYWNoZV90IGNhY2hlX2NhY2hlID0gewotCS5iYXRjaGNvdW50CT0gMSwKLQkubGltaXQJCT0gQk9PVF9DUFVDQUNIRV9FTlRSSUVTLAotCS5zaGFyZWQJCT0gMSwKLQkub2Jqc2l6ZQk9IHNpemVvZihrbWVtX2NhY2hlX3QpLAotCS5mbGFncwkJPSBTTEFCX05PX1JFQVAsCi0JLnNwaW5sb2NrCT0gU1BJTl9MT0NLX1VOTE9DS0VELAotCS5uYW1lCQk9ICJrbWVtX2NhY2hlIiwKKwkuYmF0Y2hjb3VudCA9IDEsCisJLmxpbWl0ID0gQk9PVF9DUFVDQUNIRV9FTlRSSUVTLAorCS5zaGFyZWQgPSAxLAorCS5vYmpzaXplID0gc2l6ZW9mKGttZW1fY2FjaGVfdCksCisJLmZsYWdzID0gU0xBQl9OT19SRUFQLAorCS5zcGlubG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRCwKKwkubmFtZSA9ICJrbWVtX2NhY2hlIiwKICNpZiBERUJVRwotCS5yZWFsbGVuCT0gc2l6ZW9mKGttZW1fY2FjaGVfdCksCisJLnJlYWxsZW4gPSBzaXplb2Yoa21lbV9jYWNoZV90KSwKICNlbmRpZgogfTsKIAogLyogR3VhcmQgYWNjZXNzIHRvIHRoZSBjYWNoZS1jaGFpbi4gKi8KLXN0YXRpYyBzdHJ1Y3Qgc2VtYXBob3JlCWNhY2hlX2NoYWluX3NlbTsKK3N0YXRpYyBERUZJTkVfTVVURVgoY2FjaGVfY2hhaW5fbXV0ZXgpOwogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgY2FjaGVfY2hhaW47CiAKIC8qCkBAIC02NTUsOSArNjU3LDkgQEAKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB3b3JrX3N0cnVjdCwgcmVhcF93b3JrKTsKIAotc3RhdGljIHZvaWQgZnJlZV9ibG9jayhrbWVtX2NhY2hlX3QqIGNhY2hlcCwgdm9pZCoqIG9ianBwLCBpbnQgbGVuLCBpbnQgbm9kZSk7Ci1zdGF0aWMgdm9pZCBlbmFibGVfY3B1Y2FjaGUgKGttZW1fY2FjaGVfdCAqY2FjaGVwKTsKLXN0YXRpYyB2b2lkIGNhY2hlX3JlYXAgKHZvaWQgKnVudXNlZCk7CitzdGF0aWMgdm9pZCBmcmVlX2Jsb2NrKGttZW1fY2FjaGVfdCAqY2FjaGVwLCB2b2lkICoqb2JqcHAsIGludCBsZW4sIGludCBub2RlKTsKK3N0YXRpYyB2b2lkIGVuYWJsZV9jcHVjYWNoZShrbWVtX2NhY2hlX3QgKmNhY2hlcCk7CitzdGF0aWMgdm9pZCBjYWNoZV9yZWFwKHZvaWQgKnVudXNlZCk7CiBzdGF0aWMgaW50IF9fbm9kZV9zaHJpbmsoa21lbV9jYWNoZV90ICpjYWNoZXAsIGludCBub2RlKTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgYXJyYXlfY2FjaGUgKmFjX2RhdGEoa21lbV9jYWNoZV90ICpjYWNoZXApCkBAIC02NzEsOSArNjczLDkgQEAKIAogI2lmIERFQlVHCiAJLyogVGhpcyBoYXBwZW5zIGlmIHNvbWVvbmUgdHJpZXMgdG8gY2FsbAotIAkqIGttZW1fY2FjaGVfY3JlYXRlKCksIG9yIF9fa21hbGxvYygpLCBiZWZvcmUKLSAJKiB0aGUgZ2VuZXJpYyBjYWNoZXMgYXJlIGluaXRpYWxpemVkLgotIAkqLworCSAqIGttZW1fY2FjaGVfY3JlYXRlKCksIG9yIF9fa21hbGxvYygpLCBiZWZvcmUKKwkgKiB0aGUgZ2VuZXJpYyBjYWNoZXMgYXJlIGluaXRpYWxpemVkLgorCSAqLwogCUJVR19PTihtYWxsb2Nfc2l6ZXNbSU5ERVhfQUNdLmNzX2NhY2hlcCA9PSBOVUxMKTsKICNlbmRpZgogCXdoaWxlIChzaXplID4gY3NpemVwLT5jc19zaXplKQpAQCAtNjk3LDEwICs2OTksMTAgQEAKIAogLyogQ2FsIHRoZSBudW0gb2Jqcywgd2FzdGFnZSwgYW5kIGJ5dGVzIGxlZnQgb3ZlciBmb3IgYSBnaXZlbiBzbGFiIHNpemUuICovCiBzdGF0aWMgdm9pZCBjYWNoZV9lc3RpbWF0ZSh1bnNpZ25lZCBsb25nIGdmcG9yZGVyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduLAotCQkgaW50IGZsYWdzLCBzaXplX3QgKmxlZnRfb3ZlciwgdW5zaWduZWQgaW50ICpudW0pCisJCQkgICBpbnQgZmxhZ3MsIHNpemVfdCAqbGVmdF9vdmVyLCB1bnNpZ25lZCBpbnQgKm51bSkKIHsKIAlpbnQgaTsKLQlzaXplX3Qgd2FzdGFnZSA9IFBBR0VfU0laRTw8Z2Zwb3JkZXI7CisJc2l6ZV90IHdhc3RhZ2UgPSBQQUdFX1NJWkUgPDwgZ2Zwb3JkZXI7CiAJc2l6ZV90IGV4dHJhID0gMDsKIAlzaXplX3QgYmFzZSA9IDA7CiAKQEAgLTcwOSw3ICs3MTEsNyBAQAogCQlleHRyYSA9IHNpemVvZihrbWVtX2J1ZmN0bF90KTsKIAl9CiAJaSA9IDA7Ci0Jd2hpbGUgKGkqc2l6ZSArIEFMSUdOKGJhc2UraSpleHRyYSwgYWxpZ24pIDw9IHdhc3RhZ2UpCisJd2hpbGUgKGkgKiBzaXplICsgQUxJR04oYmFzZSArIGkgKiBleHRyYSwgYWxpZ24pIDw9IHdhc3RhZ2UpCiAJCWkrKzsKIAlpZiAoaSA+IDApCiAJCWktLTsKQEAgLTcxOCw4ICs3MjAsOCBAQAogCQlpID0gU0xBQl9MSU1JVDsKIAogCSpudW0gPSBpOwotCXdhc3RhZ2UgLT0gaSpzaXplOwotCXdhc3RhZ2UgLT0gQUxJR04oYmFzZStpKmV4dHJhLCBhbGlnbik7CisJd2FzdGFnZSAtPSBpICogc2l6ZTsKKwl3YXN0YWdlIC09IEFMSUdOKGJhc2UgKyBpICogZXh0cmEsIGFsaWduKTsKIAkqbGVmdF9vdmVyID0gd2FzdGFnZTsKIH0KIApAQCAtNzI4LDcgKzczMCw3IEBACiBzdGF0aWMgdm9pZCBfX3NsYWJfZXJyb3IoY29uc3QgY2hhciAqZnVuY3Rpb24sIGttZW1fY2FjaGVfdCAqY2FjaGVwLCBjaGFyICptc2cpCiB7CiAJcHJpbnRrKEtFUk5fRVJSICJzbGFiIGVycm9yIGluICVzKCk6IGNhY2hlIGAlcyc6ICVzXG4iLAotCQlmdW5jdGlvbiwgY2FjaGVwLT5uYW1lLCBtc2cpOworCSAgICAgICBmdW5jdGlvbiwgY2FjaGVwLT5uYW1lLCBtc2cpOwogCWR1bXBfc3RhY2soKTsKIH0KIApAQCAtNzU1LDkgKzc1Nyw5IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYXJyYXlfY2FjaGUgKmFsbG9jX2FycmF5Y2FjaGUoaW50IG5vZGUsIGludCBlbnRyaWVzLAotCQkJCQkJaW50IGJhdGNoY291bnQpCisJCQkJCSAgICBpbnQgYmF0Y2hjb3VudCkKIHsKLQlpbnQgbWVtc2l6ZSA9IHNpemVvZih2b2lkKikqZW50cmllcytzaXplb2Yoc3RydWN0IGFycmF5X2NhY2hlKTsKKwlpbnQgbWVtc2l6ZSA9IHNpemVvZih2b2lkICopICogZW50cmllcyArIHNpemVvZihzdHJ1Y3QgYXJyYXlfY2FjaGUpOwogCXN0cnVjdCBhcnJheV9jYWNoZSAqbmMgPSBOVUxMOwogCiAJbmMgPSBrbWFsbG9jX25vZGUobWVtc2l6ZSwgR0ZQX0tFUk5FTCwgbm9kZSk7CkBAIC03NzIsMTAgKzc3NCwxMiBAQAogfQogCiAjaWZkZWYgQ09ORklHX05VTUEKK3N0YXRpYyB2b2lkICpfX2NhY2hlX2FsbG9jX25vZGUoa21lbV9jYWNoZV90ICosIGdmcF90LCBpbnQpOworCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBhcnJheV9jYWNoZSAqKmFsbG9jX2FsaWVuX2NhY2hlKGludCBub2RlLCBpbnQgbGltaXQpCiB7CiAJc3RydWN0IGFycmF5X2NhY2hlICoqYWNfcHRyOwotCWludCBtZW1zaXplID0gc2l6ZW9mKHZvaWQqKSpNQVhfTlVNTk9ERVM7CisJaW50IG1lbXNpemUgPSBzaXplb2Yodm9pZCAqKSAqIE1BWF9OVU1OT0RFUzsKIAlpbnQgaTsKIAogCWlmIChsaW1pdCA+IDEpCkBAIC03ODksNyArNzkzLDcgQEAKIAkJCX0KIAkJCWFjX3B0cltpXSA9IGFsbG9jX2FycmF5Y2FjaGUobm9kZSwgbGltaXQsIDB4YmFhZGYwMGQpOwogCQkJaWYgKCFhY19wdHJbaV0pIHsKLQkJCQlmb3IgKGktLTsgaSA8PTA7IGktLSkKKwkJCQlmb3IgKGktLTsgaSA8PSAwOyBpLS0pCiAJCQkJCWtmcmVlKGFjX3B0cltpXSk7CiAJCQkJa2ZyZWUoYWNfcHRyKTsKIAkJCQlyZXR1cm4gTlVMTDsKQEAgLTgwNywxMiArODExLDEzIEBACiAJCXJldHVybjsKIAogCWZvcl9lYWNoX25vZGUoaSkKLQkJa2ZyZWUoYWNfcHRyW2ldKTsKKwkgICAga2ZyZWUoYWNfcHRyW2ldKTsKIAogCWtmcmVlKGFjX3B0cik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2RyYWluX2FsaWVuX2NhY2hlKGttZW1fY2FjaGVfdCAqY2FjaGVwLCBzdHJ1Y3QgYXJyYXlfY2FjaGUgKmFjLCBpbnQgbm9kZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2RyYWluX2FsaWVuX2NhY2hlKGttZW1fY2FjaGVfdCAqY2FjaGVwLAorCQkJCSAgICAgICBzdHJ1Y3QgYXJyYXlfY2FjaGUgKmFjLCBpbnQgbm9kZSkKIHsKIAlzdHJ1Y3Qga21lbV9saXN0MyAqcmwzID0gY2FjaGVwLT5ub2RlbGlzdHNbbm9kZV07CiAKQEAgLTgyNiw3ICs4MzEsNyBAQAogCiBzdGF0aWMgdm9pZCBkcmFpbl9hbGllbl9jYWNoZShrbWVtX2NhY2hlX3QgKmNhY2hlcCwgc3RydWN0IGttZW1fbGlzdDMgKmwzKQogewotCWludCBpPTA7CisJaW50IGkgPSAwOwogCXN0cnVjdCBhcnJheV9jYWNoZSAqYWM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtODQ2LDE4ICs4NTEsMTcgQEAKICNlbmRpZgogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBjcHV1cF9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQorCQkJCSAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKIAlsb25nIGNwdSA9IChsb25nKWhjcHU7Ci0Ja21lbV9jYWNoZV90KiBjYWNoZXA7CisJa21lbV9jYWNoZV90ICpjYWNoZXA7CiAJc3RydWN0IGttZW1fbGlzdDMgKmwzID0gTlVMTDsKIAlpbnQgbm9kZSA9IGNwdV90b19ub2RlKGNwdSk7CiAJaW50IG1lbXNpemUgPSBzaXplb2Yoc3RydWN0IGttZW1fbGlzdDMpOwotCXN0cnVjdCBhcnJheV9jYWNoZSAqbmMgPSBOVUxMOwogCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIENQVV9VUF9QUkVQQVJFOgotCQlkb3duKCZjYWNoZV9jaGFpbl9zZW0pOworCQltdXRleF9sb2NrKCZjYWNoZV9jaGFpbl9tdXRleCk7CiAJCS8qIHdlIG5lZWQgdG8gZG8gdGhpcyByaWdodCBpbiB0aGUgYmVnaW5uaW5nIHNpbmNlCiAJCSAqIGFsbG9jX2FycmF5Y2FjaGUncyBhcmUgZ29pbmcgdG8gdXNlIHRoaXMgbGlzdC4KIAkJICoga21hbGxvY19ub2RlIGFsbG93cyB1cyB0byBhZGQgdGhlIHNsYWIgdG8gdGhlIHJpZ2h0CkBAIC04NzEsMjcgKzg3NSwyOSBAQAogCQkJICovCiAJCQlpZiAoIWNhY2hlcC0+bm9kZWxpc3RzW25vZGVdKSB7CiAJCQkJaWYgKCEobDMgPSBrbWFsbG9jX25vZGUobWVtc2l6ZSwKLQkJCQkJCUdGUF9LRVJORUwsIG5vZGUpKSkKKwkJCQkJCQlHRlBfS0VSTkVMLCBub2RlKSkpCiAJCQkJCWdvdG8gYmFkOwogCQkJCWttZW1fbGlzdDNfaW5pdChsMyk7CiAJCQkJbDMtPm5leHRfcmVhcCA9IGppZmZpZXMgKyBSRUFQVElNRU9VVF9MSVNUMyArCi0JCQkJICAoKHVuc2lnbmVkIGxvbmcpY2FjaGVwKSVSRUFQVElNRU9VVF9MSVNUMzsKKwkJCQkgICAgKCh1bnNpZ25lZCBsb25nKWNhY2hlcCkgJSBSRUFQVElNRU9VVF9MSVNUMzsKIAogCQkJCWNhY2hlcC0+bm9kZWxpc3RzW25vZGVdID0gbDM7CiAJCQl9CiAKIAkJCXNwaW5fbG9ja19pcnEoJmNhY2hlcC0+bm9kZWxpc3RzW25vZGVdLT5saXN0X2xvY2spOwogCQkJY2FjaGVwLT5ub2RlbGlzdHNbbm9kZV0tPmZyZWVfbGltaXQgPQotCQkJCSgxICsgbnJfY3B1c19ub2RlKG5vZGUpKSAqCi0JCQkJY2FjaGVwLT5iYXRjaGNvdW50ICsgY2FjaGVwLT5udW07CisJCQkgICAgKDEgKyBucl9jcHVzX25vZGUobm9kZSkpICoKKwkJCSAgICBjYWNoZXAtPmJhdGNoY291bnQgKyBjYWNoZXAtPm51bTsKIAkJCXNwaW5fdW5sb2NrX2lycSgmY2FjaGVwLT5ub2RlbGlzdHNbbm9kZV0tPmxpc3RfbG9jayk7CiAJCX0KIAogCQkvKiBOb3cgd2UgY2FuIGdvIGFoZWFkIHdpdGggYWxsb2NhdGluZyB0aGUgc2hhcmVkIGFycmF5J3MKLQkJICAmIGFycmF5IGNhY2hlJ3MgKi8KKwkJICAgJiBhcnJheSBjYWNoZSdzICovCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FjaGVwLCAmY2FjaGVfY2hhaW4sIG5leHQpIHsKKwkJCXN0cnVjdCBhcnJheV9jYWNoZSAqbmM7CisKIAkJCW5jID0gYWxsb2NfYXJyYXljYWNoZShub2RlLCBjYWNoZXAtPmxpbWl0LAotCQkJCQljYWNoZXAtPmJhdGNoY291bnQpOworCQkJCQkgICAgICBjYWNoZXAtPmJhdGNoY291bnQpOwogCQkJaWYgKCFuYykKIAkJCQlnb3RvIGJhZDsKIAkJCWNhY2hlcC0+YXJyYXlbY3B1XSA9IG5jOwpAQCAtOTAwLDE2ICs5MDYsMTcgQEAKIAkJCUJVR19PTighbDMpOwogCQkJaWYgKCFsMy0+c2hhcmVkKSB7CiAJCQkJaWYgKCEobmMgPSBhbGxvY19hcnJheWNhY2hlKG5vZGUsCi0JCQkJCWNhY2hlcC0+c2hhcmVkKmNhY2hlcC0+YmF0Y2hjb3VudCwKLQkJCQkJMHhiYWFkZjAwZCkpKQotCQkJCQlnb3RvICBiYWQ7CisJCQkJCQkJICAgIGNhY2hlcC0+c2hhcmVkICoKKwkJCQkJCQkgICAgY2FjaGVwLT5iYXRjaGNvdW50LAorCQkJCQkJCSAgICAweGJhYWRmMDBkKSkpCisJCQkJCWdvdG8gYmFkOwogCiAJCQkJLyogd2UgYXJlIHNlcmlhbGlzZWQgZnJvbSBDUFVfREVBRCBvcgotCQkJCSAgQ1BVX1VQX0NBTkNFTExFRCBieSB0aGUgY3B1Y29udHJvbCBsb2NrICovCisJCQkJICAgQ1BVX1VQX0NBTkNFTExFRCBieSB0aGUgY3B1Y29udHJvbCBsb2NrICovCiAJCQkJbDMtPnNoYXJlZCA9IG5jOwogCQkJfQogCQl9Ci0JCXVwKCZjYWNoZV9jaGFpbl9zZW0pOworCQltdXRleF91bmxvY2soJmNhY2hlX2NoYWluX211dGV4KTsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfT05MSU5FOgogCQlzdGFydF9jcHVfdGltZXIoY3B1KTsKQEAgLTkxOCw3ICs5MjUsNyBAQAogCWNhc2UgQ1BVX0RFQUQ6CiAJCS8qIGZhbGwgdGhydSAqLwogCWNhc2UgQ1BVX1VQX0NBTkNFTEVEOgotCQlkb3duKCZjYWNoZV9jaGFpbl9zZW0pOworCQltdXRleF9sb2NrKCZjYWNoZV9jaGFpbl9tdXRleCk7CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShjYWNoZXAsICZjYWNoZV9jaGFpbiwgbmV4dCkgewogCQkJc3RydWN0IGFycmF5X2NhY2hlICpuYzsKQEAgLTk0MiwxMyArOTQ5LDEzIEBACiAJCQkJZnJlZV9ibG9jayhjYWNoZXAsIG5jLT5lbnRyeSwgbmMtPmF2YWlsLCBub2RlKTsKIAogCQkJaWYgKCFjcHVzX2VtcHR5KG1hc2spKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrKCZsMy0+bGlzdF9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB1bmxvY2tfY2FjaGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisJCQkJc3Bpbl91bmxvY2soJmwzLT5saXN0X2xvY2spOworCQkJCWdvdG8gdW5sb2NrX2NhY2hlOworCQkJfQogCiAJCQlpZiAobDMtPnNoYXJlZCkgewogCQkJCWZyZWVfYmxvY2soY2FjaGVwLCBsMy0+c2hhcmVkLT5lbnRyeSwKLQkJCQkJCWwzLT5zaGFyZWQtPmF2YWlsLCBub2RlKTsKKwkJCQkJICAgbDMtPnNoYXJlZC0+YXZhaWwsIG5vZGUpOwogCQkJCWtmcmVlKGwzLT5zaGFyZWQpOwogCQkJCWwzLT5zaGFyZWQgPSBOVUxMOwogCQkJfQpAQCAtOTY2LDE3ICs5NzMsMTcgQEAKIAkJCX0gZWxzZSB7CiAJCQkJc3Bpbl91bmxvY2soJmwzLT5saXN0X2xvY2spOwogCQkJfQotdW5sb2NrX2NhY2hlOgorCQkgICAgICB1bmxvY2tfY2FjaGU6CiAJCQlzcGluX3VubG9ja19pcnEoJmNhY2hlcC0+c3BpbmxvY2spOwogCQkJa2ZyZWUobmMpOwogCQl9Ci0JCXVwKCZjYWNoZV9jaGFpbl9zZW0pOworCQltdXRleF91bmxvY2soJmNhY2hlX2NoYWluX211dGV4KTsKIAkJYnJlYWs7CiAjZW5kaWYKIAl9CiAJcmV0dXJuIE5PVElGWV9PSzsKLWJhZDoKLQl1cCgmY2FjaGVfY2hhaW5fc2VtKTsKKyAgICAgIGJhZDoKKwltdXRleF91bmxvY2soJmNhY2hlX2NoYWluX211dGV4KTsKIAlyZXR1cm4gTk9USUZZX0JBRDsKIH0KIApAQCAtOTg1LDggKzk5Miw3IEBACiAvKgogICogc3dhcCB0aGUgc3RhdGljIGttZW1fbGlzdDMgd2l0aCBrbWFsbG9jZWQgbWVtb3J5CiAgKi8KLXN0YXRpYyB2b2lkIGluaXRfbGlzdChrbWVtX2NhY2hlX3QgKmNhY2hlcCwgc3RydWN0IGttZW1fbGlzdDMgKmxpc3QsCi0JCWludCBub2RlaWQpCitzdGF0aWMgdm9pZCBpbml0X2xpc3Qoa21lbV9jYWNoZV90ICpjYWNoZXAsIHN0cnVjdCBrbWVtX2xpc3QzICpsaXN0LCBpbnQgbm9kZWlkKQogewogCXN0cnVjdCBrbWVtX2xpc3QzICpwdHI7CiAKQEAgLTEwNDUsNyArMTA1MSw2IEBACiAJICovCiAKIAkvKiAxKSBjcmVhdGUgdGhlIGNhY2hlX2NhY2hlICovCi0JaW5pdF9NVVRFWCgmY2FjaGVfY2hhaW5fc2VtKTsKIAlJTklUX0xJU1RfSEVBRCgmY2FjaGVfY2hhaW4pOwogCWxpc3RfYWRkKCZjYWNoZV9jYWNoZS5uZXh0LCAmY2FjaGVfY2hhaW4pOwogCWNhY2hlX2NhY2hlLmNvbG91cl9vZmYgPSBjYWNoZV9saW5lX3NpemUoKTsKQEAgLTEwNTUsMTQgKzEwNjAsMTQgQEAKIAljYWNoZV9jYWNoZS5vYmpzaXplID0gQUxJR04oY2FjaGVfY2FjaGUub2Jqc2l6ZSwgY2FjaGVfbGluZV9zaXplKCkpOwogCiAJY2FjaGVfZXN0aW1hdGUoMCwgY2FjaGVfY2FjaGUub2Jqc2l6ZSwgY2FjaGVfbGluZV9zaXplKCksIDAsCi0JCQkJJmxlZnRfb3ZlciwgJmNhY2hlX2NhY2hlLm51bSk7CisJCSAgICAgICAmbGVmdF9vdmVyLCAmY2FjaGVfY2FjaGUubnVtKTsKIAlpZiAoIWNhY2hlX2NhY2hlLm51bSkKIAkJQlVHKCk7CiAKLQljYWNoZV9jYWNoZS5jb2xvdXIgPSBsZWZ0X292ZXIvY2FjaGVfY2FjaGUuY29sb3VyX29mZjsKKwljYWNoZV9jYWNoZS5jb2xvdXIgPSBsZWZ0X292ZXIgLyBjYWNoZV9jYWNoZS5jb2xvdXJfb2ZmOwogCWNhY2hlX2NhY2hlLmNvbG91cl9uZXh0ID0gMDsKLQljYWNoZV9jYWNoZS5zbGFiX3NpemUgPSBBTElHTihjYWNoZV9jYWNoZS5udW0qc2l6ZW9mKGttZW1fYnVmY3RsX3QpICsKLQkJCQlzaXplb2Yoc3RydWN0IHNsYWIpLCBjYWNoZV9saW5lX3NpemUoKSk7CisJY2FjaGVfY2FjaGUuc2xhYl9zaXplID0gQUxJR04oY2FjaGVfY2FjaGUubnVtICogc2l6ZW9mKGttZW1fYnVmY3RsX3QpICsKKwkJCQkgICAgICBzaXplb2Yoc3RydWN0IHNsYWIpLCBjYWNoZV9saW5lX3NpemUoKSk7CiAKIAkvKiAyKzMpIGNyZWF0ZSB0aGUga21hbGxvYyBjYWNoZXMgKi8KIAlzaXplcyA9IG1hbGxvY19zaXplczsKQEAgLTEwNzQsMTQgKzEwNzksMTggQEAKIAkgKi8KIAogCXNpemVzW0lOREVYX0FDXS5jc19jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZShuYW1lc1tJTkRFWF9BQ10ubmFtZSwKLQkJCQlzaXplc1tJTkRFWF9BQ10uY3Nfc2l6ZSwgQVJDSF9LTUFMTE9DX01JTkFMSUdOLAotCQkJCShBUkNIX0tNQUxMT0NfRkxBR1MgfCBTTEFCX1BBTklDKSwgTlVMTCwgTlVMTCk7CisJCQkJCQkgICAgICBzaXplc1tJTkRFWF9BQ10uY3Nfc2l6ZSwKKwkJCQkJCSAgICAgIEFSQ0hfS01BTExPQ19NSU5BTElHTiwKKwkJCQkJCSAgICAgIChBUkNIX0tNQUxMT0NfRkxBR1MgfAorCQkJCQkJICAgICAgIFNMQUJfUEFOSUMpLCBOVUxMLCBOVUxMKTsKIAogCWlmIChJTkRFWF9BQyAhPSBJTkRFWF9MMykKIAkJc2l6ZXNbSU5ERVhfTDNdLmNzX2NhY2hlcCA9Ci0JCQlrbWVtX2NhY2hlX2NyZWF0ZShuYW1lc1tJTkRFWF9MM10ubmFtZSwKLQkJCQlzaXplc1tJTkRFWF9MM10uY3Nfc2l6ZSwgQVJDSF9LTUFMTE9DX01JTkFMSUdOLAotCQkJCShBUkNIX0tNQUxMT0NfRkxBR1MgfCBTTEFCX1BBTklDKSwgTlVMTCwgTlVMTCk7CisJCSAgICBrbWVtX2NhY2hlX2NyZWF0ZShuYW1lc1tJTkRFWF9MM10ubmFtZSwKKwkJCQkgICAgICBzaXplc1tJTkRFWF9MM10uY3Nfc2l6ZSwKKwkJCQkgICAgICBBUkNIX0tNQUxMT0NfTUlOQUxJR04sCisJCQkJICAgICAgKEFSQ0hfS01BTExPQ19GTEFHUyB8IFNMQUJfUEFOSUMpLCBOVUxMLAorCQkJCSAgICAgIE5VTEwpOwogCiAJd2hpbGUgKHNpemVzLT5jc19zaXplICE9IFVMT05HX01BWCkgewogCQkvKgpAQCAtMTA5MSwzNSArMTEwMCw0MSBAQAogCQkgKiBOb3RlIGZvciBzeXN0ZW1zIHNob3J0IG9uIG1lbW9yeSByZW1vdmluZyB0aGUgYWxpZ25tZW50IHdpbGwKIAkJICogYWxsb3cgdGlnaHRlciBwYWNraW5nIG9mIHRoZSBzbWFsbGVyIGNhY2hlcy4KIAkJICovCi0JCWlmKCFzaXplcy0+Y3NfY2FjaGVwKQorCQlpZiAoIXNpemVzLT5jc19jYWNoZXApCiAJCQlzaXplcy0+Y3NfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUobmFtZXMtPm5hbWUsCi0JCQkJc2l6ZXMtPmNzX3NpemUsIEFSQ0hfS01BTExPQ19NSU5BTElHTiwKLQkJCQkoQVJDSF9LTUFMTE9DX0ZMQUdTIHwgU0xBQl9QQU5JQyksIE5VTEwsIE5VTEwpOworCQkJCQkJCSAgICAgc2l6ZXMtPmNzX3NpemUsCisJCQkJCQkJICAgICBBUkNIX0tNQUxMT0NfTUlOQUxJR04sCisJCQkJCQkJICAgICAoQVJDSF9LTUFMTE9DX0ZMQUdTCisJCQkJCQkJICAgICAgfCBTTEFCX1BBTklDKSwKKwkJCQkJCQkgICAgIE5VTEwsIE5VTEwpOwogCiAJCS8qIEluYyBvZmYtc2xhYiBidWZjdGwgbGltaXQgdW50aWwgdGhlIGNlaWxpbmcgaXMgaGl0LiAqLwogCQlpZiAoIShPRkZfU0xBQihzaXplcy0+Y3NfY2FjaGVwKSkpIHsKLQkJCW9mZnNsYWJfbGltaXQgPSBzaXplcy0+Y3Nfc2l6ZS1zaXplb2Yoc3RydWN0IHNsYWIpOworCQkJb2Zmc2xhYl9saW1pdCA9IHNpemVzLT5jc19zaXplIC0gc2l6ZW9mKHN0cnVjdCBzbGFiKTsKIAkJCW9mZnNsYWJfbGltaXQgLz0gc2l6ZW9mKGttZW1fYnVmY3RsX3QpOwogCQl9CiAKIAkJc2l6ZXMtPmNzX2RtYWNhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKG5hbWVzLT5uYW1lX2RtYSwKLQkJCXNpemVzLT5jc19zaXplLCBBUkNIX0tNQUxMT0NfTUlOQUxJR04sCi0JCQkoQVJDSF9LTUFMTE9DX0ZMQUdTIHwgU0xBQl9DQUNIRV9ETUEgfCBTTEFCX1BBTklDKSwKLQkJCU5VTEwsIE5VTEwpOworCQkJCQkJCXNpemVzLT5jc19zaXplLAorCQkJCQkJCUFSQ0hfS01BTExPQ19NSU5BTElHTiwKKwkJCQkJCQkoQVJDSF9LTUFMTE9DX0ZMQUdTIHwKKwkJCQkJCQkgU0xBQl9DQUNIRV9ETUEgfAorCQkJCQkJCSBTTEFCX1BBTklDKSwgTlVMTCwKKwkJCQkJCQlOVUxMKTsKIAogCQlzaXplcysrOwogCQluYW1lcysrOwogCX0KIAkvKiA0KSBSZXBsYWNlIHRoZSBib290c3RyYXAgaGVhZCBhcnJheXMgKi8KIAl7Ci0JCXZvaWQgKiBwdHI7CisJCXZvaWQgKnB0cjsKIAogCQlwdHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXJyYXljYWNoZV9pbml0KSwgR0ZQX0tFUk5FTCk7CiAKIAkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAkJQlVHX09OKGFjX2RhdGEoJmNhY2hlX2NhY2hlKSAhPSAmaW5pdGFycmF5X2NhY2hlLmNhY2hlKTsKIAkJbWVtY3B5KHB0ciwgYWNfZGF0YSgmY2FjaGVfY2FjaGUpLAotCQkJCXNpemVvZihzdHJ1Y3QgYXJyYXljYWNoZV9pbml0KSk7CisJCSAgICAgICBzaXplb2Yoc3RydWN0IGFycmF5Y2FjaGVfaW5pdCkpOwogCQljYWNoZV9jYWNoZS5hcnJheVtzbXBfcHJvY2Vzc29yX2lkKCldID0gcHRyOwogCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKQEAgLTExMjcsMTEgKzExNDIsMTEgQEAKIAogCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCQlCVUdfT04oYWNfZGF0YShtYWxsb2Nfc2l6ZXNbSU5ERVhfQUNdLmNzX2NhY2hlcCkKLQkJCQkhPSAmaW5pdGFycmF5X2dlbmVyaWMuY2FjaGUpOworCQkgICAgICAgIT0gJmluaXRhcnJheV9nZW5lcmljLmNhY2hlKTsKIAkJbWVtY3B5KHB0ciwgYWNfZGF0YShtYWxsb2Nfc2l6ZXNbSU5ERVhfQUNdLmNzX2NhY2hlcCksCi0JCQkJc2l6ZW9mKHN0cnVjdCBhcnJheWNhY2hlX2luaXQpKTsKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgYXJyYXljYWNoZV9pbml0KSk7CiAJCW1hbGxvY19zaXplc1tJTkRFWF9BQ10uY3NfY2FjaGVwLT5hcnJheVtzbXBfcHJvY2Vzc29yX2lkKCldID0KLQkJCQkJCXB0cjsKKwkJICAgIHB0cjsKIAkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCX0KIAkvKiA1KSBSZXBsYWNlIHRoZSBib290c3RyYXAga21lbV9saXN0MydzICovCkBAIC0xMTM5LDE2ICsxMTU0LDE2IEBACiAJCWludCBub2RlOwogCQkvKiBSZXBsYWNlIHRoZSBzdGF0aWMga21lbV9saXN0MyBzdHJ1Y3R1cmVzIGZvciB0aGUgYm9vdCBjcHUgKi8KIAkJaW5pdF9saXN0KCZjYWNoZV9jYWNoZSwgJmluaXRrbWVtX2xpc3QzW0NBQ0hFX0NBQ0hFXSwKLQkJCQludW1hX25vZGVfaWQoKSk7CisJCQkgIG51bWFfbm9kZV9pZCgpKTsKIAogCQlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKSB7CiAJCQlpbml0X2xpc3QobWFsbG9jX3NpemVzW0lOREVYX0FDXS5jc19jYWNoZXAsCi0JCQkJCSZpbml0a21lbV9saXN0M1tTSVpFX0FDK25vZGVdLCBub2RlKTsKKwkJCQkgICZpbml0a21lbV9saXN0M1tTSVpFX0FDICsgbm9kZV0sIG5vZGUpOwogCiAJCQlpZiAoSU5ERVhfQUMgIT0gSU5ERVhfTDMpIHsKIAkJCQlpbml0X2xpc3QobWFsbG9jX3NpemVzW0lOREVYX0wzXS5jc19jYWNoZXAsCi0JCQkJCQkmaW5pdGttZW1fbGlzdDNbU0laRV9MMytub2RlXSwKLQkJCQkJCW5vZGUpOworCQkJCQkgICZpbml0a21lbV9saXN0M1tTSVpFX0wzICsgbm9kZV0sCisJCQkJCSAgbm9kZSk7CiAJCQl9CiAJCX0KIAl9CkBAIC0xMTU2LDEwICsxMTcxLDEwIEBACiAJLyogNikgcmVzaXplIHRoZSBoZWFkIGFycmF5cyB0byB0aGVpciBmaW5hbCBzaXplcyAqLwogCXsKIAkJa21lbV9jYWNoZV90ICpjYWNoZXA7Ci0JCWRvd24oJmNhY2hlX2NoYWluX3NlbSk7CisJCW11dGV4X2xvY2soJmNhY2hlX2NoYWluX211dGV4KTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShjYWNoZXAsICZjYWNoZV9jaGFpbiwgbmV4dCkKLQkJCWVuYWJsZV9jcHVjYWNoZShjYWNoZXApOwotCQl1cCgmY2FjaGVfY2hhaW5fc2VtKTsKKwkJICAgIGVuYWJsZV9jcHVjYWNoZShjYWNoZXApOworCQltdXRleF91bmxvY2soJmNhY2hlX2NoYWluX211dGV4KTsKIAl9CiAKIAkvKiBEb25lISAqLwpAQCAtMTE4NCw3ICsxMTk5LDcgQEAKIAkgKiBwYWdlcyB0byBnZnAuCiAJICovCiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCi0JCXN0YXJ0X2NwdV90aW1lcihjcHUpOworCSAgICBzdGFydF9jcHVfdGltZXIoY3B1KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTIyNiw3ICsxMjQxLDcgQEAKICAqLwogc3RhdGljIHZvaWQga21lbV9mcmVlcGFnZXMoa21lbV9jYWNoZV90ICpjYWNoZXAsIHZvaWQgKmFkZHIpCiB7Ci0JdW5zaWduZWQgbG9uZyBpID0gKDE8PGNhY2hlcC0+Z2Zwb3JkZXIpOworCXVuc2lnbmVkIGxvbmcgaSA9ICgxIDw8IGNhY2hlcC0+Z2Zwb3JkZXIpOwogCXN0cnVjdCBwYWdlICpwYWdlID0gdmlydF90b19wYWdlKGFkZHIpOwogCWNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfZnJlZWQgPSBpOwogCkBAIC0xMjM5LDEzICsxMjU0LDEzIEBACiAJaWYgKGN1cnJlbnQtPnJlY2xhaW1fc3RhdGUpCiAJCWN1cnJlbnQtPnJlY2xhaW1fc3RhdGUtPnJlY2xhaW1lZF9zbGFiICs9IG5yX2ZyZWVkOwogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpYWRkciwgY2FjaGVwLT5nZnBvcmRlcik7Ci0JaWYgKGNhY2hlcC0+ZmxhZ3MgJiBTTEFCX1JFQ0xBSU1fQUNDT1VOVCkgCi0JCWF0b21pY19zdWIoMTw8Y2FjaGVwLT5nZnBvcmRlciwgJnNsYWJfcmVjbGFpbV9wYWdlcyk7CisJaWYgKGNhY2hlcC0+ZmxhZ3MgJiBTTEFCX1JFQ0xBSU1fQUNDT1VOVCkKKwkJYXRvbWljX3N1YigxIDw8IGNhY2hlcC0+Z2Zwb3JkZXIsICZzbGFiX3JlY2xhaW1fcGFnZXMpOwogfQogCiBzdGF0aWMgdm9pZCBrbWVtX3JjdV9mcmVlKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKIHsKLQlzdHJ1Y3Qgc2xhYl9yY3UgKnNsYWJfcmN1ID0gKHN0cnVjdCBzbGFiX3JjdSAqKSBoZWFkOworCXN0cnVjdCBzbGFiX3JjdSAqc2xhYl9yY3UgPSAoc3RydWN0IHNsYWJfcmN1ICopaGVhZDsKIAlrbWVtX2NhY2hlX3QgKmNhY2hlcCA9IHNsYWJfcmN1LT5jYWNoZXA7CiAKIAlrbWVtX2ZyZWVwYWdlcyhjYWNoZXAsIHNsYWJfcmN1LT5hZGRyKTsKQEAgLTEyNTcsMTkgKzEyNzIsMTkgQEAKIAogI2lmZGVmIENPTkZJR19ERUJVR19QQUdFQUxMT0MKIHN0YXRpYyB2b2lkIHN0b3JlX3N0YWNraW5mbyhrbWVtX2NhY2hlX3QgKmNhY2hlcCwgdW5zaWduZWQgbG9uZyAqYWRkciwKLQkJCQl1bnNpZ25lZCBsb25nIGNhbGxlcikKKwkJCSAgICB1bnNpZ25lZCBsb25nIGNhbGxlcikKIHsKIAlpbnQgc2l6ZSA9IG9ial9yZWFsbGVuKGNhY2hlcCk7CiAKLQlhZGRyID0gKHVuc2lnbmVkIGxvbmcgKikmKChjaGFyKilhZGRyKVtvYmpfZGJnaGVhZChjYWNoZXApXTsKKwlhZGRyID0gKHVuc2lnbmVkIGxvbmcgKikmKChjaGFyICopYWRkcilbb2JqX2RiZ2hlYWQoY2FjaGVwKV07CiAKLQlpZiAoc2l6ZSA8IDUqc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCWlmIChzaXplIDwgNSAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkKIAkJcmV0dXJuOwogCi0JKmFkZHIrKz0weDEyMzQ1Njc4OwotCSphZGRyKys9Y2FsbGVyOwotCSphZGRyKys9c21wX3Byb2Nlc3Nvcl9pZCgpOwotCXNpemUgLT0gMypzaXplb2YodW5zaWduZWQgbG9uZyk7CisJKmFkZHIrKyA9IDB4MTIzNDU2Nzg7CisJKmFkZHIrKyA9IGNhbGxlcjsKKwkqYWRkcisrID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXNpemUgLT0gMyAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKIAl7CiAJCXVuc2lnbmVkIGxvbmcgKnNwdHIgPSAmY2FsbGVyOwogCQl1bnNpZ25lZCBsb25nIHN2YWx1ZTsKQEAgLTEyNzcsNyArMTI5Miw3IEBACiAJCXdoaWxlICgha3N0YWNrX2VuZChzcHRyKSkgewogCQkJc3ZhbHVlID0gKnNwdHIrKzsKIAkJCWlmIChrZXJuZWxfdGV4dF9hZGRyZXNzKHN2YWx1ZSkpIHsKLQkJCQkqYWRkcisrPXN2YWx1ZTsKKwkJCQkqYWRkcisrID0gc3ZhbHVlOwogCQkJCXNpemUgLT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOwogCQkJCWlmIChzaXplIDw9IHNpemVvZih1bnNpZ25lZCBsb25nKSkKIAkJCQkJYnJlYWs7CkBAIC0xMjg1LDI1ICsxMzAwLDI1IEBACiAJCX0KIAogCX0KLQkqYWRkcisrPTB4ODc2NTQzMjE7CisJKmFkZHIrKyA9IDB4ODc2NTQzMjE7CiB9CiAjZW5kaWYKIAogc3RhdGljIHZvaWQgcG9pc29uX29iaihrbWVtX2NhY2hlX3QgKmNhY2hlcCwgdm9pZCAqYWRkciwgdW5zaWduZWQgY2hhciB2YWwpCiB7CiAJaW50IHNpemUgPSBvYmpfcmVhbGxlbihjYWNoZXApOwotCWFkZHIgPSAmKChjaGFyKilhZGRyKVtvYmpfZGJnaGVhZChjYWNoZXApXTsKKwlhZGRyID0gJigoY2hhciAqKWFkZHIpW29ial9kYmdoZWFkKGNhY2hlcCldOwogCiAJbWVtc2V0KGFkZHIsIHZhbCwgc2l6ZSk7Ci0JKih1bnNpZ25lZCBjaGFyICopKGFkZHIrc2l6ZS0xKSA9IFBPSVNPTl9FTkQ7CisJKih1bnNpZ25lZCBjaGFyICopKGFkZHIgKyBzaXplIC0gMSkgPSBQT0lTT05fRU5EOwogfQogCiBzdGF0aWMgdm9pZCBkdW1wX2xpbmUoY2hhciAqZGF0YSwgaW50IG9mZnNldCwgaW50IGxpbWl0KQogewogCWludCBpOwogCXByaW50ayhLRVJOX0VSUiAiJTAzeDoiLCBvZmZzZXQpOwotCWZvciAoaT0wO2k8bGltaXQ7aSsrKSB7Ci0JCXByaW50aygiICUwMngiLCAodW5zaWduZWQgY2hhcilkYXRhW29mZnNldCtpXSk7CisJZm9yIChpID0gMDsgaSA8IGxpbWl0OyBpKyspIHsKKwkJcHJpbnRrKCIgJTAyeCIsICh1bnNpZ25lZCBjaGFyKWRhdGFbb2Zmc2V0ICsgaV0pOwogCX0KIAlwcmludGsoIlxuIik7CiB9CkBAIC0xMzE4LDI0ICsxMzMzLDI0IEBACiAKIAlpZiAoY2FjaGVwLT5mbGFncyAmIFNMQUJfUkVEX1pPTkUpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJSZWR6b25lOiAweCVseC8weCVseC5cbiIsCi0JCQkqZGJnX3JlZHpvbmUxKGNhY2hlcCwgb2JqcCksCi0JCQkqZGJnX3JlZHpvbmUyKGNhY2hlcCwgb2JqcCkpOworCQkgICAgICAgKmRiZ19yZWR6b25lMShjYWNoZXAsIG9ianApLAorCQkgICAgICAgKmRiZ19yZWR6b25lMihjYWNoZXAsIG9ianApKTsKIAl9CiAKIAlpZiAoY2FjaGVwLT5mbGFncyAmIFNMQUJfU1RPUkVfVVNFUikgewogCQlwcmludGsoS0VSTl9FUlIgIkxhc3QgdXNlcjogWzwlcD5dIiwKLQkJCQkqZGJnX3VzZXJ3b3JkKGNhY2hlcCwgb2JqcCkpOworCQkgICAgICAgKmRiZ191c2Vyd29yZChjYWNoZXAsIG9ianApKTsKIAkJcHJpbnRfc3ltYm9sKCIoJXMpIiwKLQkJCQkodW5zaWduZWQgbG9uZykqZGJnX3VzZXJ3b3JkKGNhY2hlcCwgb2JqcCkpOworCQkJICAgICAodW5zaWduZWQgbG9uZykqZGJnX3VzZXJ3b3JkKGNhY2hlcCwgb2JqcCkpOwogCQlwcmludGsoIlxuIik7CiAJfQotCXJlYWxvYmogPSAoY2hhciopb2JqcCtvYmpfZGJnaGVhZChjYWNoZXApOworCXJlYWxvYmogPSAoY2hhciAqKW9ianAgKyBvYmpfZGJnaGVhZChjYWNoZXApOwogCXNpemUgPSBvYmpfcmVhbGxlbihjYWNoZXApOwotCWZvciAoaT0wOyBpPHNpemUgJiYgbGluZXM7aSs9MTYsIGxpbmVzLS0pIHsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZSAmJiBsaW5lczsgaSArPSAxNiwgbGluZXMtLSkgewogCQlpbnQgbGltaXQ7CiAJCWxpbWl0ID0gMTY7Ci0JCWlmIChpK2xpbWl0ID4gc2l6ZSkKLQkJCWxpbWl0ID0gc2l6ZS1pOworCQlpZiAoaSArIGxpbWl0ID4gc2l6ZSkKKwkJCWxpbWl0ID0gc2l6ZSAtIGk7CiAJCWR1bXBfbGluZShyZWFsb2JqLCBpLCBsaW1pdCk7CiAJfQogfQpAQCAtMTM0NiwyNyArMTM2MSwyOCBAQAogCWludCBzaXplLCBpOwogCWludCBsaW5lcyA9IDA7CiAKLQlyZWFsb2JqID0gKGNoYXIqKW9ianArb2JqX2RiZ2hlYWQoY2FjaGVwKTsKKwlyZWFsb2JqID0gKGNoYXIgKilvYmpwICsgb2JqX2RiZ2hlYWQoY2FjaGVwKTsKIAlzaXplID0gb2JqX3JlYWxsZW4oY2FjaGVwKTsKIAotCWZvciAoaT0wO2k8c2l6ZTtpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAJCWNoYXIgZXhwID0gUE9JU09OX0ZSRUU7Ci0JCWlmIChpID09IHNpemUtMSkKKwkJaWYgKGkgPT0gc2l6ZSAtIDEpCiAJCQlleHAgPSBQT0lTT05fRU5EOwogCQlpZiAocmVhbG9ialtpXSAhPSBleHApIHsKIAkJCWludCBsaW1pdDsKIAkJCS8qIE1pc21hdGNoICEgKi8KIAkJCS8qIFByaW50IGhlYWRlciAqLwogCQkJaWYgKGxpbmVzID09IDApIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIlNsYWIgY29ycnVwdGlvbjogc3RhcnQ9JXAsIGxlbj0lZFxuIiwKLQkJCQkJCXJlYWxvYmosIHNpemUpOworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICAiU2xhYiBjb3JydXB0aW9uOiBzdGFydD0lcCwgbGVuPSVkXG4iLAorCQkJCSAgICAgICByZWFsb2JqLCBzaXplKTsKIAkJCQlwcmludF9vYmppbmZvKGNhY2hlcCwgb2JqcCwgMCk7CiAJCQl9CiAJCQkvKiBIZXhkdW1wIHRoZSBhZmZlY3RlZCBsaW5lICovCi0JCQlpID0gKGkvMTYpKjE2OworCQkJaSA9IChpIC8gMTYpICogMTY7CiAJCQlsaW1pdCA9IDE2OwotCQkJaWYgKGkrbGltaXQgPiBzaXplKQotCQkJCWxpbWl0ID0gc2l6ZS1pOworCQkJaWYgKGkgKyBsaW1pdCA+IHNpemUpCisJCQkJbGltaXQgPSBzaXplIC0gaTsKIAkJCWR1bXBfbGluZShyZWFsb2JqLCBpLCBsaW1pdCk7CiAJCQlpICs9IDE2OwogCQkJbGluZXMrKzsKQEAgLTEzODIsMTkgKzEzOTgsMTkgQEAKIAkJc3RydWN0IHNsYWIgKnNsYWJwID0gcGFnZV9nZXRfc2xhYih2aXJ0X3RvX3BhZ2Uob2JqcCkpOwogCQlpbnQgb2JqbnI7CiAKLQkJb2JqbnIgPSAob2JqcC1zbGFicC0+c19tZW0pL2NhY2hlcC0+b2Jqc2l6ZTsKKwkJb2JqbnIgPSAob2JqcCAtIHNsYWJwLT5zX21lbSkgLyBjYWNoZXAtPm9ianNpemU7CiAJCWlmIChvYmpucikgewotCQkJb2JqcCA9IHNsYWJwLT5zX21lbSsob2JqbnItMSkqY2FjaGVwLT5vYmpzaXplOwotCQkJcmVhbG9iaiA9IChjaGFyKilvYmpwK29ial9kYmdoZWFkKGNhY2hlcCk7CisJCQlvYmpwID0gc2xhYnAtPnNfbWVtICsgKG9iam5yIC0gMSkgKiBjYWNoZXAtPm9ianNpemU7CisJCQlyZWFsb2JqID0gKGNoYXIgKilvYmpwICsgb2JqX2RiZ2hlYWQoY2FjaGVwKTsKIAkJCXByaW50ayhLRVJOX0VSUiAiUHJldiBvYmo6IHN0YXJ0PSVwLCBsZW49JWRcbiIsCi0JCQkJCQlyZWFsb2JqLCBzaXplKTsKKwkJCSAgICAgICByZWFsb2JqLCBzaXplKTsKIAkJCXByaW50X29iamluZm8oY2FjaGVwLCBvYmpwLCAyKTsKIAkJfQotCQlpZiAob2JqbnIrMSA8IGNhY2hlcC0+bnVtKSB7Ci0JCQlvYmpwID0gc2xhYnAtPnNfbWVtKyhvYmpucisxKSpjYWNoZXAtPm9ianNpemU7Ci0JCQlyZWFsb2JqID0gKGNoYXIqKW9ianArb2JqX2RiZ2hlYWQoY2FjaGVwKTsKKwkJaWYgKG9iam5yICsgMSA8IGNhY2hlcC0+bnVtKSB7CisJCQlvYmpwID0gc2xhYnAtPnNfbWVtICsgKG9iam5yICsgMSkgKiBjYWNoZXAtPm9ianNpemU7CisJCQlyZWFsb2JqID0gKGNoYXIgKilvYmpwICsgb2JqX2RiZ2hlYWQoY2FjaGVwKTsKIAkJCXByaW50ayhLRVJOX0VSUiAiTmV4dCBvYmo6IHN0YXJ0PSVwLCBsZW49JWRcbiIsCi0JCQkJCQlyZWFsb2JqLCBzaXplKTsKKwkJCSAgICAgICByZWFsb2JqLCBzaXplKTsKIAkJCXByaW50X29iamluZm8oY2FjaGVwLCBvYmpwLCAyKTsKIAkJfQogCX0KQEAgLTE0MDUsNyArMTQyMSw3IEBACiAgKiBCZWZvcmUgY2FsbGluZyB0aGUgc2xhYiBtdXN0IGhhdmUgYmVlbiB1bmxpbmtlZCBmcm9tIHRoZSBjYWNoZS4KICAqIFRoZSBjYWNoZS1sb2NrIGlzIG5vdCBoZWxkL25lZWRlZC4KICAqLwotc3RhdGljIHZvaWQgc2xhYl9kZXN0cm95IChrbWVtX2NhY2hlX3QgKmNhY2hlcCwgc3RydWN0IHNsYWIgKnNsYWJwKQorc3RhdGljIHZvaWQgc2xhYl9kZXN0cm95KGttZW1fY2FjaGVfdCAqY2FjaGVwLCBzdHJ1Y3Qgc2xhYiAqc2xhYnApCiB7CiAJdm9pZCAqYWRkciA9IHNsYWJwLT5zX21lbSAtIHNsYWJwLT5jb2xvdXJvZmY7CiAKQEAgLTE0MTYsOCArMTQzMiwxMSBAQAogCiAJCWlmIChjYWNoZXAtPmZsYWdzICYgU0xBQl9QT0lTT04pIHsKICNpZmRlZiBDT05GSUdfREVCVUdfUEFHRUFMTE9DCi0JCQlpZiAoKGNhY2hlcC0+b2Jqc2l6ZSVQQUdFX1NJWkUpPT0wICYmIE9GRl9TTEFCKGNhY2hlcCkpCi0JCQkJa2VybmVsX21hcF9wYWdlcyh2aXJ0X3RvX3BhZ2Uob2JqcCksIGNhY2hlcC0+b2Jqc2l6ZS9QQUdFX1NJWkUsMSk7CisJCQlpZiAoKGNhY2hlcC0+b2Jqc2l6ZSAlIFBBR0VfU0laRSkgPT0gMAorCQkJICAgICYmIE9GRl9TTEFCKGNhY2hlcCkpCisJCQkJa2VybmVsX21hcF9wYWdlcyh2aXJ0X3RvX3BhZ2Uob2JqcCksCisJCQkJCQkgY2FjaGVwLT5vYmpzaXplIC8gUEFHRV9TSVpFLAorCQkJCQkJIDEpOwogCQkJZWxzZQogCQkJCWNoZWNrX3BvaXNvbl9vYmooY2FjaGVwLCBvYmpwKTsKICNlbHNlCkBAIC0xNDI3LDIwICsxNDQ2LDIwIEBACiAJCWlmIChjYWNoZXAtPmZsYWdzICYgU0xBQl9SRURfWk9ORSkgewogCQkJaWYgKCpkYmdfcmVkem9uZTEoY2FjaGVwLCBvYmpwKSAhPSBSRURfSU5BQ1RJVkUpCiAJCQkJc2xhYl9lcnJvcihjYWNoZXAsICJzdGFydCBvZiBhIGZyZWVkIG9iamVjdCAiCi0JCQkJCQkJIndhcyBvdmVyd3JpdHRlbiIpOworCQkJCQkgICAid2FzIG92ZXJ3cml0dGVuIik7CiAJCQlpZiAoKmRiZ19yZWR6b25lMihjYWNoZXAsIG9ianApICE9IFJFRF9JTkFDVElWRSkKIAkJCQlzbGFiX2Vycm9yKGNhY2hlcCwgImVuZCBvZiBhIGZyZWVkIG9iamVjdCAiCi0JCQkJCQkJIndhcyBvdmVyd3JpdHRlbiIpOworCQkJCQkgICAid2FzIG92ZXJ3cml0dGVuIik7CiAJCX0KIAkJaWYgKGNhY2hlcC0+ZHRvciAmJiAhKGNhY2hlcC0+ZmxhZ3MgJiBTTEFCX1BPSVNPTikpCi0JCQkoY2FjaGVwLT5kdG9yKShvYmpwK29ial9kYmdoZWFkKGNhY2hlcCksIGNhY2hlcCwgMCk7CisJCQkoY2FjaGVwLT5kdG9yKSAob2JqcCArIG9ial9kYmdoZWFkKGNhY2hlcCksIGNhY2hlcCwgMCk7CiAJfQogI2Vsc2UKIAlpZiAoY2FjaGVwLT5kdG9yKSB7CiAJCWludCBpOwogCQlmb3IgKGkgPSAwOyBpIDwgY2FjaGVwLT5udW07IGkrKykgewotCQkJdm9pZCogb2JqcCA9IHNsYWJwLT5zX21lbStjYWNoZXAtPm9ianNpemUqaTsKLQkJCShjYWNoZXAtPmR0b3IpKG9ianAsIGNhY2hlcCwgMCk7CisJCQl2b2lkICpvYmpwID0gc2xhYnAtPnNfbWVtICsgY2FjaGVwLT5vYmpzaXplICogaTsKKwkJCShjYWNoZXAtPmR0b3IpIChvYmpwLCBjYWNoZXAsIDApOwogCQl9CiAJfQogI2VuZGlmCkBAIC0xNDQ4LDcgKzE0NjcsNyBAQAogCWlmICh1bmxpa2VseShjYWNoZXAtPmZsYWdzICYgU0xBQl9ERVNUUk9ZX0JZX1JDVSkpIHsKIAkJc3RydWN0IHNsYWJfcmN1ICpzbGFiX3JjdTsKIAotCQlzbGFiX3JjdSA9IChzdHJ1Y3Qgc2xhYl9yY3UgKikgc2xhYnA7CisJCXNsYWJfcmN1ID0gKHN0cnVjdCBzbGFiX3JjdSAqKXNsYWJwOwogCQlzbGFiX3JjdS0+Y2FjaGVwID0gY2FjaGVwOwogCQlzbGFiX3JjdS0+YWRkciA9IGFkZHI7CiAJCWNhbGxfcmN1KCZzbGFiX3JjdS0+aGVhZCwga21lbV9yY3VfZnJlZSk7CkBAIC0xNDY2LDE0ICsxNDg1LDYxIEBACiAJaW50IG5vZGU7CiAKIAlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKSB7Ci0JCWNhY2hlcC0+bm9kZWxpc3RzW25vZGVdID0gJmluaXRrbWVtX2xpc3QzW2luZGV4K25vZGVdOworCQljYWNoZXAtPm5vZGVsaXN0c1tub2RlXSA9ICZpbml0a21lbV9saXN0M1tpbmRleCArIG5vZGVdOwogCQljYWNoZXAtPm5vZGVsaXN0c1tub2RlXS0+bmV4dF9yZWFwID0gamlmZmllcyArCi0JCQlSRUFQVElNRU9VVF9MSVNUMyArCi0JCQkoKHVuc2lnbmVkIGxvbmcpY2FjaGVwKSVSRUFQVElNRU9VVF9MSVNUMzsKKwkJICAgIFJFQVBUSU1FT1VUX0xJU1QzICsKKwkJICAgICgodW5zaWduZWQgbG9uZyljYWNoZXApICUgUkVBUFRJTUVPVVRfTElTVDM7CiAJfQogfQogCiAvKioKKyAqIGNhbGN1bGF0ZV9zbGFiX29yZGVyIC0gY2FsY3VsYXRlIHNpemUgKHBhZ2Ugb3JkZXIpIG9mIHNsYWJzIGFuZCB0aGUgbnVtYmVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgIG9mIG9iamVjdHMgcGVyIHNsYWIuCisgKgorICogVGhpcyBjb3VsZCBiZSBtYWRlIG11Y2ggbW9yZSBpbnRlbGxpZ2VudC4gIEZvciBub3csIHRyeSB0byBhdm9pZCB1c2luZworICogaGlnaCBvcmRlciBwYWdlcyBmb3Igc2xhYnMuICBXaGVuIHRoZSBnZnAoKSBmdW5jdGlvbnMgYXJlIG1vcmUgZnJpZW5kbHkKKyAqIHRvd2FyZHMgaGlnaC1vcmRlciByZXF1ZXN0cywgdGhpcyBzaG91bGQgYmUgY2hhbmdlZC4KKyAqLworc3RhdGljIGlubGluZSBzaXplX3QgY2FsY3VsYXRlX3NsYWJfb3JkZXIoa21lbV9jYWNoZV90ICpjYWNoZXAsIHNpemVfdCBzaXplLAorCQkJCQkgIHNpemVfdCBhbGlnbiwgZ2ZwX3QgZmxhZ3MpCit7CisJc2l6ZV90IGxlZnRfb3ZlciA9IDA7CisKKwlmb3IgKDs7IGNhY2hlcC0+Z2Zwb3JkZXIrKykgeworCQl1bnNpZ25lZCBpbnQgbnVtOworCQlzaXplX3QgcmVtYWluZGVyOworCisJCWlmIChjYWNoZXAtPmdmcG9yZGVyID4gTUFYX0dGUF9PUkRFUikgeworCQkJY2FjaGVwLT5udW0gPSAwOworCQkJYnJlYWs7CisJCX0KKworCQljYWNoZV9lc3RpbWF0ZShjYWNoZXAtPmdmcG9yZGVyLCBzaXplLCBhbGlnbiwgZmxhZ3MsCisJCQkgICAgICAgJnJlbWFpbmRlciwgJm51bSk7CisJCWlmICghbnVtKQorCQkJY29udGludWU7CisJCS8qIE1vcmUgdGhhbiBvZmZzbGFiX2xpbWl0IG9iamVjdHMgd2lsbCBjYXVzZSBwcm9ibGVtcyAqLworCQlpZiAoZmxhZ3MgJiBDRkxHU19PRkZfU0xBQiAmJiBjYWNoZXAtPm51bSA+IG9mZnNsYWJfbGltaXQpCisJCQlicmVhazsKKworCQljYWNoZXAtPm51bSA9IG51bTsKKwkJbGVmdF9vdmVyID0gcmVtYWluZGVyOworCisJCS8qCisJCSAqIExhcmdlIG51bWJlciBvZiBvYmplY3RzIGlzIGdvb2QsIGJ1dCB2ZXJ5IGxhcmdlIHNsYWJzIGFyZQorCQkgKiBjdXJyZW50bHkgYmFkIGZvciB0aGUgZ2ZwKClzLgorCQkgKi8KKwkJaWYgKGNhY2hlcC0+Z2Zwb3JkZXIgPj0gc2xhYl9icmVha19nZnBfb3JkZXIpCisJCQlicmVhazsKKworCQlpZiAoKGxlZnRfb3ZlciAqIDgpIDw9IChQQUdFX1NJWkUgPDwgY2FjaGVwLT5nZnBvcmRlcikpCisJCQkvKiBBY2NlcHRhYmxlIGludGVybmFsIGZyYWdtZW50YXRpb24gKi8KKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gbGVmdF9vdmVyOworfQorCisvKioKICAqIGttZW1fY2FjaGVfY3JlYXRlIC0gQ3JlYXRlIGEgY2FjaGUuCiAgKiBAbmFtZTogQSBzdHJpbmcgd2hpY2ggaXMgdXNlZCBpbiAvcHJvYy9zbGFiaW5mbyB0byBpZGVudGlmeSB0aGlzIGNhY2hlLgogICogQHNpemU6IFRoZSBzaXplIG9mIG9iamVjdHMgdG8gYmUgY3JlYXRlZCBpbiB0aGlzIGNhY2hlLgpAQCAtMTUxOSwxNiArMTU4NSwxNSBAQAogCSAqIFNhbml0eSBjaGVja3MuLi4gdGhlc2UgYXJlIGFsbCBzZXJpb3VzIHVzYWdlIGJ1Z3MuCiAJICovCiAJaWYgKCghbmFtZSkgfHwKLQkJaW5faW50ZXJydXB0KCkgfHwKLQkJKHNpemUgPCBCWVRFU19QRVJfV09SRCkgfHwKLQkJKHNpemUgPiAoMTw8TUFYX09CSl9PUkRFUikqUEFHRV9TSVpFKSB8fAotCQkoZHRvciAmJiAhY3RvcikpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVhcmx5IGVycm9yIGluIHNsYWIgJXNcbiIsCi0JCQkJCV9fRlVOQ1RJT05fXywgbmFtZSk7Ci0JCQlCVUcoKTsKLQkJfQorCSAgICBpbl9pbnRlcnJ1cHQoKSB8fAorCSAgICAoc2l6ZSA8IEJZVEVTX1BFUl9XT1JEKSB8fAorCSAgICAoc2l6ZSA+ICgxIDw8IE1BWF9PQkpfT1JERVIpICogUEFHRV9TSVpFKSB8fCAoZHRvciAmJiAhY3RvcikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRWFybHkgZXJyb3IgaW4gc2xhYiAlc1xuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgbmFtZSk7CisJCUJVRygpOworCX0KIAotCWRvd24oJmNhY2hlX2NoYWluX3NlbSk7CisJbXV0ZXhfbG9jaygmY2FjaGVfY2hhaW5fbXV0ZXgpOwogCiAJbGlzdF9mb3JfZWFjaChwLCAmY2FjaGVfY2hhaW4pIHsKIAkJa21lbV9jYWNoZV90ICpwYyA9IGxpc3RfZW50cnkocCwga21lbV9jYWNoZV90LCBuZXh0KTsKQEAgLTE1NDYsMTEgKzE2MTEsMTEgQEAKIAkJc2V0X2ZzKG9sZF9mcyk7CiAJCWlmIChyZXMpIHsKIAkJCXByaW50aygiU0xBQjogY2FjaGUgd2l0aCBzaXplICVkIGhhcyBsb3N0IGl0cyBuYW1lXG4iLAotCQkJCQlwYy0+b2Jqc2l6ZSk7CisJCQkgICAgICAgcGMtPm9ianNpemUpOwogCQkJY29udGludWU7CiAJCX0KIAotCQlpZiAoIXN0cmNtcChwYy0+bmFtZSxuYW1lKSkgeworCQlpZiAoIXN0cmNtcChwYy0+bmFtZSwgbmFtZSkpIHsKIAkJCXByaW50aygia21lbV9jYWNoZV9jcmVhdGU6IGR1cGxpY2F0ZSBjYWNoZSAlc1xuIiwgbmFtZSk7CiAJCQlkdW1wX3N0YWNrKCk7CiAJCQlnb3RvIG9vcHM7CkBAIC0xNTYyLDEwICsxNjI3LDkgQEAKIAlpZiAoKGZsYWdzICYgU0xBQl9ERUJVR19JTklUSUFMKSAmJiAhY3RvcikgewogCQkvKiBObyBjb25zdHJ1Y3RvciwgYnV0IGluaXRhbCBzdGF0ZSBjaGVjayByZXF1ZXN0ZWQgKi8KIAkJcHJpbnRrKEtFUk5fRVJSICIlczogTm8gY29uLCBidXQgaW5pdCBzdGF0ZSBjaGVjayAiCi0JCQkJInJlcXVlc3RlZCAtICVzXG4iLCBfX0ZVTkNUSU9OX18sIG5hbWUpOworCQkgICAgICAgInJlcXVlc3RlZCAtICVzXG4iLCBfX0ZVTkNUSU9OX18sIG5hbWUpOwogCQlmbGFncyAmPSB+U0xBQl9ERUJVR19JTklUSUFMOwogCX0KLQogI2lmIEZPUkNFRF9ERUJVRwogCS8qCiAJICogRW5hYmxlIHJlZHpvbmluZyBhbmQgbGFzdCB1c2VyIGFjY291bnRpbmcsIGV4Y2VwdCBmb3IgY2FjaGVzIHdpdGgKQEAgLTE1NzMsOCArMTYzNyw5IEBACiAJICogYWJvdmUgdGhlIG5leHQgcG93ZXIgb2YgdHdvOiBjYWNoZXMgd2l0aCBvYmplY3Qgc2l6ZXMganVzdCBhYm92ZSBhCiAJICogcG93ZXIgb2YgdHdvIGhhdmUgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgaW50ZXJuYWwgZnJhZ21lbnRhdGlvbi4KIAkgKi8KLQlpZiAoKHNpemUgPCA0MDk2IHx8IGZscyhzaXplLTEpID09IGZscyhzaXplLTErMypCWVRFU19QRVJfV09SRCkpKQotCQlmbGFncyB8PSBTTEFCX1JFRF9aT05FfFNMQUJfU1RPUkVfVVNFUjsKKwlpZiAoKHNpemUgPCA0MDk2CisJICAgICB8fCBmbHMoc2l6ZSAtIDEpID09IGZscyhzaXplIC0gMSArIDMgKiBCWVRFU19QRVJfV09SRCkpKQorCQlmbGFncyB8PSBTTEFCX1JFRF9aT05FIHwgU0xBQl9TVE9SRV9VU0VSOwogCWlmICghKGZsYWdzICYgU0xBQl9ERVNUUk9ZX0JZX1JDVSkpCiAJCWZsYWdzIHw9IFNMQUJfUE9JU09OOwogI2VuZGlmCkBAIC0xNTk1LDkgKzE2NjAsOSBAQAogCSAqIHVuYWxpZ25lZCBhY2Nlc3NlcyBmb3Igc29tZSBhcmNocyB3aGVuIHJlZHpvbmluZyBpcyB1c2VkLCBhbmQgbWFrZXMKIAkgKiBzdXJlIGFueSBvbi1zbGFiIGJ1ZmN0bCdzIGFyZSBhbHNvIGNvcnJlY3RseSBhbGlnbmVkLgogCSAqLwotCWlmIChzaXplICYgKEJZVEVTX1BFUl9XT1JELTEpKSB7Ci0JCXNpemUgKz0gKEJZVEVTX1BFUl9XT1JELTEpOwotCQlzaXplICY9IH4oQllURVNfUEVSX1dPUkQtMSk7CisJaWYgKHNpemUgJiAoQllURVNfUEVSX1dPUkQgLSAxKSkgeworCQlzaXplICs9IChCWVRFU19QRVJfV09SRCAtIDEpOworCQlzaXplICY9IH4oQllURVNfUEVSX1dPUkQgLSAxKTsKIAl9CiAKIAkvKiBjYWxjdWxhdGUgb3V0IHRoZSBmaW5hbCBidWZmZXIgYWxpZ25tZW50OiAqLwpAQCAtMTYwOCw3ICsxNjczLDcgQEAKIAkJICogb2JqZWN0cyBpbnRvIG9uZSBjYWNoZWxpbmUuCiAJCSAqLwogCQlyYWxpZ24gPSBjYWNoZV9saW5lX3NpemUoKTsKLQkJd2hpbGUgKHNpemUgPD0gcmFsaWduLzIpCisJCXdoaWxlIChzaXplIDw9IHJhbGlnbiAvIDIpCiAJCQlyYWxpZ24gLz0gMjsKIAl9IGVsc2UgewogCQlyYWxpZ24gPSBCWVRFU19QRVJfV09SRDsKQEAgLTE2MTcsMTMgKzE2ODIsMTMgQEAKIAlpZiAocmFsaWduIDwgQVJDSF9TTEFCX01JTkFMSUdOKSB7CiAJCXJhbGlnbiA9IEFSQ0hfU0xBQl9NSU5BTElHTjsKIAkJaWYgKHJhbGlnbiA+IEJZVEVTX1BFUl9XT1JEKQotCQkJZmxhZ3MgJj0gfihTTEFCX1JFRF9aT05FfFNMQUJfU1RPUkVfVVNFUik7CisJCQlmbGFncyAmPSB+KFNMQUJfUkVEX1pPTkUgfCBTTEFCX1NUT1JFX1VTRVIpOwogCX0KIAkvKiAzKSBjYWxsZXIgbWFuZGF0ZWQgYWxpZ25tZW50OiBkaXNhYmxlcyBkZWJ1ZyBpZiBuZWNlc3NhcnkgKi8KIAlpZiAocmFsaWduIDwgYWxpZ24pIHsKIAkJcmFsaWduID0gYWxpZ247CiAJCWlmIChyYWxpZ24gPiBCWVRFU19QRVJfV09SRCkKLQkJCWZsYWdzICY9IH4oU0xBQl9SRURfWk9ORXxTTEFCX1NUT1JFX1VTRVIpOworCQkJZmxhZ3MgJj0gfihTTEFCX1JFRF9aT05FIHwgU0xBQl9TVE9SRV9VU0VSKTsKIAl9CiAJLyogNCkgU3RvcmUgaXQuIE5vdGUgdGhhdCB0aGUgZGVidWcgY29kZSBiZWxvdyBjYW4gcmVkdWNlCiAJICogICAgdGhlIGFsaWdubWVudCB0byBCWVRFU19QRVJfV09SRC4KQEAgLTE2NDUsNyArMTcxMCw3IEBACiAKIAkJLyogYWRkIHNwYWNlIGZvciByZWQgem9uZSB3b3JkcyAqLwogCQljYWNoZXAtPmRiZ2hlYWQgKz0gQllURVNfUEVSX1dPUkQ7Ci0JCXNpemUgKz0gMipCWVRFU19QRVJfV09SRDsKKwkJc2l6ZSArPSAyICogQllURVNfUEVSX1dPUkQ7CiAJfQogCWlmIChmbGFncyAmIFNMQUJfU1RPUkVfVVNFUikgewogCQkvKiB1c2VyIHN0b3JlIHJlcXVpcmVzIHdvcmQgYWxpZ25tZW50IGFuZApAQCAtMTY1Niw3ICsxNzIxLDggQEAKIAkJc2l6ZSArPSBCWVRFU19QRVJfV09SRDsKIAl9CiAjaWYgRk9SQ0VEX0RFQlVHICYmIGRlZmluZWQoQ09ORklHX0RFQlVHX1BBR0VBTExPQykKLQlpZiAoc2l6ZSA+PSBtYWxsb2Nfc2l6ZXNbSU5ERVhfTDMrMV0uY3Nfc2l6ZSAmJiBjYWNoZXAtPnJlYWxsZW4gPiBjYWNoZV9saW5lX3NpemUoKSAmJiBzaXplIDwgUEFHRV9TSVpFKSB7CisJaWYgKHNpemUgPj0gbWFsbG9jX3NpemVzW0lOREVYX0wzICsgMV0uY3Nfc2l6ZQorCSAgICAmJiBjYWNoZXAtPnJlYWxsZW4gPiBjYWNoZV9saW5lX3NpemUoKSAmJiBzaXplIDwgUEFHRV9TSVpFKSB7CiAJCWNhY2hlcC0+ZGJnaGVhZCArPSBQQUdFX1NJWkUgLSBzaXplOwogCQlzaXplID0gUEFHRV9TSVpFOwogCX0KQEAgLTE2NjQsNyArMTczMCw3IEBACiAjZW5kaWYKIAogCS8qIERldGVybWluZSBpZiB0aGUgc2xhYiBtYW5hZ2VtZW50IGlzICdvbicgb3IgJ29mZicgc2xhYi4gKi8KLQlpZiAoc2l6ZSA+PSAoUEFHRV9TSVpFPj4zKSkKKwlpZiAoc2l6ZSA+PSAoUEFHRV9TSVpFID4+IDMpKQogCQkvKgogCQkgKiBTaXplIGlzIGxhcmdlLCBhc3N1bWUgYmVzdCB0byBwbGFjZSB0aGUgc2xhYiBtYW5hZ2VtZW50IG9iagogCQkgKiBvZmYtc2xhYiAoc2hvdWxkIGFsbG93IGJldHRlciBwYWNraW5nIG9mIG9ianMpLgpAQCAtMTY4MSw0NyArMTc0Nyw5IEBACiAJCSAqLwogCQljYWNoZXAtPmdmcG9yZGVyID0gMDsKIAkJY2FjaGVfZXN0aW1hdGUoY2FjaGVwLT5nZnBvcmRlciwgc2l6ZSwgYWxpZ24sIGZsYWdzLAotCQkJCQkmbGVmdF9vdmVyLCAmY2FjaGVwLT5udW0pOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIENhbGN1bGF0ZSBzaXplIChpbiBwYWdlcykgb2Ygc2xhYnMsIGFuZCB0aGUgbnVtIG9mIG9ianMgcGVyCi0JCSAqIHNsYWIuICBUaGlzIGNvdWxkIGJlIG1hZGUgbXVjaCBtb3JlIGludGVsbGlnZW50LiAgRm9yIG5vdywKLQkJICogdHJ5IHRvIGF2b2lkIHVzaW5nIGhpZ2ggcGFnZS1vcmRlcnMgZm9yIHNsYWJzLiAgV2hlbiB0aGUKLQkJICogZ2ZwKCkgZnVuY3MgYXJlIG1vcmUgZnJpZW5kbHkgdG93YXJkcyBoaWdoLW9yZGVyIHJlcXVlc3RzLAotCQkgKiB0aGlzIHNob3VsZCBiZSBjaGFuZ2VkLgotCQkgKi8KLQkJZG8gewotCQkJdW5zaWduZWQgaW50IGJyZWFrX2ZsYWcgPSAwOwotY2FsX3dhc3RhZ2U6Ci0JCQljYWNoZV9lc3RpbWF0ZShjYWNoZXAtPmdmcG9yZGVyLCBzaXplLCBhbGlnbiwgZmxhZ3MsCi0JCQkJCQkmbGVmdF9vdmVyLCAmY2FjaGVwLT5udW0pOwotCQkJaWYgKGJyZWFrX2ZsYWcpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoY2FjaGVwLT5nZnBvcmRlciA+PSBNQVhfR0ZQX09SREVSKQotCQkJCWJyZWFrOwotCQkJaWYgKCFjYWNoZXAtPm51bSkKLQkJCQlnb3RvIG5leHQ7Ci0JCQlpZiAoZmxhZ3MgJiBDRkxHU19PRkZfU0xBQiAmJgotCQkJCQljYWNoZXAtPm51bSA+IG9mZnNsYWJfbGltaXQpIHsKLQkJCQkvKiBUaGlzIG51bSBvZiBvYmpzIHdpbGwgY2F1c2UgcHJvYmxlbXMuICovCi0JCQkJY2FjaGVwLT5nZnBvcmRlci0tOwotCQkJCWJyZWFrX2ZsYWcrKzsKLQkJCQlnb3RvIGNhbF93YXN0YWdlOwotCQkJfQotCi0JCQkvKgotCQkJICogTGFyZ2UgbnVtIG9mIG9ianMgaXMgZ29vZCwgYnV0IHYuIGxhcmdlIHNsYWJzIGFyZQotCQkJICogY3VycmVudGx5IGJhZCBmb3IgdGhlIGdmcCgpcy4KLQkJCSAqLwotCQkJaWYgKGNhY2hlcC0+Z2Zwb3JkZXIgPj0gc2xhYl9icmVha19nZnBfb3JkZXIpCi0JCQkJYnJlYWs7Ci0KLQkJCWlmICgobGVmdF9vdmVyKjgpIDw9IChQQUdFX1NJWkU8PGNhY2hlcC0+Z2Zwb3JkZXIpKQotCQkJCWJyZWFrOwkvKiBBY2NlcHRhYmxlIGludGVybmFsIGZyYWdtZW50YXRpb24uICovCi1uZXh0OgotCQkJY2FjaGVwLT5nZnBvcmRlcisrOwotCQl9IHdoaWxlICgxKTsKLQl9CisJCQkgICAgICAgJmxlZnRfb3ZlciwgJmNhY2hlcC0+bnVtKTsKKwl9IGVsc2UKKwkJbGVmdF9vdmVyID0gY2FsY3VsYXRlX3NsYWJfb3JkZXIoY2FjaGVwLCBzaXplLCBhbGlnbiwgZmxhZ3MpOwogCiAJaWYgKCFjYWNoZXAtPm51bSkgewogCQlwcmludGsoImttZW1fY2FjaGVfY3JlYXRlOiBjb3VsZG4ndCBjcmVhdGUgY2FjaGUgJXMuXG4iLCBuYW1lKTsKQEAgLTE3MjksOCArMTc1Nyw4IEBACiAJCWNhY2hlcCA9IE5VTEw7CiAJCWdvdG8gb29wczsKIAl9Ci0Jc2xhYl9zaXplID0gQUxJR04oY2FjaGVwLT5udW0qc2l6ZW9mKGttZW1fYnVmY3RsX3QpCi0JCQkJKyBzaXplb2Yoc3RydWN0IHNsYWIpLCBhbGlnbik7CisJc2xhYl9zaXplID0gQUxJR04oY2FjaGVwLT5udW0gKiBzaXplb2Yoa21lbV9idWZjdGxfdCkKKwkJCSAgKyBzaXplb2Yoc3RydWN0IHNsYWIpLCBhbGlnbik7CiAKIAkvKgogCSAqIElmIHRoZSBzbGFiIGhhcyBiZWVuIHBsYWNlZCBvZmYtc2xhYiwgYW5kIHdlIGhhdmUgZW5vdWdoIHNwYWNlIHRoZW4KQEAgLTE3NDMsMTQgKzE3NzEsMTUgQEAKIAogCWlmIChmbGFncyAmIENGTEdTX09GRl9TTEFCKSB7CiAJCS8qIHJlYWxseSBvZmYgc2xhYi4gTm8gbmVlZCBmb3IgbWFudWFsIGFsaWdubWVudCAqLwotCQlzbGFiX3NpemUgPSBjYWNoZXAtPm51bSpzaXplb2Yoa21lbV9idWZjdGxfdCkrc2l6ZW9mKHN0cnVjdCBzbGFiKTsKKwkJc2xhYl9zaXplID0KKwkJICAgIGNhY2hlcC0+bnVtICogc2l6ZW9mKGttZW1fYnVmY3RsX3QpICsgc2l6ZW9mKHN0cnVjdCBzbGFiKTsKIAl9CiAKIAljYWNoZXAtPmNvbG91cl9vZmYgPSBjYWNoZV9saW5lX3NpemUoKTsKIAkvKiBPZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBhbGlnbm1lbnQuICovCiAJaWYgKGNhY2hlcC0+Y29sb3VyX29mZiA8IGFsaWduKQogCQljYWNoZXAtPmNvbG91cl9vZmYgPSBhbGlnbjsKLQljYWNoZXAtPmNvbG91ciA9IGxlZnRfb3Zlci9jYWNoZXAtPmNvbG91cl9vZmY7CisJY2FjaGVwLT5jb2xvdXIgPSBsZWZ0X292ZXIgLyBjYWNoZXAtPmNvbG91cl9vZmY7CiAJY2FjaGVwLT5zbGFiX3NpemUgPSBzbGFiX3NpemU7CiAJY2FjaGVwLT5mbGFncyA9IGZsYWdzOwogCWNhY2hlcC0+Z2ZwZmxhZ3MgPSAwOwpAQCAtMTc3Nyw3ICsxODA2LDcgQEAKIAkJCSAqIHRoZSBjcmVhdGlvbiBvZiBmdXJ0aGVyIGNhY2hlcyB3aWxsIEJVRygpLgogCQkJICovCiAJCQljYWNoZXAtPmFycmF5W3NtcF9wcm9jZXNzb3JfaWQoKV0gPQotCQkJCSZpbml0YXJyYXlfZ2VuZXJpYy5jYWNoZTsKKwkJCSAgICAmaW5pdGFycmF5X2dlbmVyaWMuY2FjaGU7CiAKIAkJCS8qIElmIHRoZSBjYWNoZSB0aGF0J3MgdXNlZCBieQogCQkJICoga21hbGxvYyhzaXplb2Yoa21lbV9saXN0MykpIGlzIHRoZSBmaXJzdCBjYWNoZSwKQEAgLTE3OTEsOCArMTgyMCw3IEBACiAJCQkJZ19jcHVjYWNoZV91cCA9IFBBUlRJQUxfQUM7CiAJCX0gZWxzZSB7CiAJCQljYWNoZXAtPmFycmF5W3NtcF9wcm9jZXNzb3JfaWQoKV0gPQotCQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhcnJheWNhY2hlX2luaXQpLAotCQkJCQkJR0ZQX0tFUk5FTCk7CisJCQkgICAga21hbGxvYyhzaXplb2Yoc3RydWN0IGFycmF5Y2FjaGVfaW5pdCksIEdGUF9LRVJORUwpOwogCiAJCQlpZiAoZ19jcHVjYWNoZV91cCA9PSBQQVJUSUFMX0FDKSB7CiAJCQkJc2V0X3VwX2xpc3QzcyhjYWNoZXAsIFNJWkVfTDMpOwpAQCAtMTgwMiwxNiArMTgzMCwxOCBAQAogCQkJCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKIAogCQkJCQljYWNoZXAtPm5vZGVsaXN0c1tub2RlXSA9Ci0JCQkJCQlrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBrbWVtX2xpc3QzKSwKLQkJCQkJCQkJR0ZQX0tFUk5FTCwgbm9kZSk7CisJCQkJCSAgICBrbWFsbG9jX25vZGUoc2l6ZW9mCisJCQkJCQkJIChzdHJ1Y3Qga21lbV9saXN0MyksCisJCQkJCQkJIEdGUF9LRVJORUwsIG5vZGUpOwogCQkJCQlCVUdfT04oIWNhY2hlcC0+bm9kZWxpc3RzW25vZGVdKTsKLQkJCQkJa21lbV9saXN0M19pbml0KGNhY2hlcC0+bm9kZWxpc3RzW25vZGVdKTsKKwkJCQkJa21lbV9saXN0M19pbml0KGNhY2hlcC0+CisJCQkJCQkJbm9kZWxpc3RzW25vZGVdKTsKIAkJCQl9CiAJCQl9CiAJCX0KIAkJY2FjaGVwLT5ub2RlbGlzdHNbbnVtYV9ub2RlX2lkKCldLT5uZXh0X3JlYXAgPQotCQkJamlmZmllcyArIFJFQVBUSU1FT1VUX0xJU1QzICsKLQkJCSgodW5zaWduZWQgbG9uZyljYWNoZXApJVJFQVBUSU1FT1VUX0xJU1QzOworCQkgICAgamlmZmllcyArIFJFQVBUSU1FT1VUX0xJU1QzICsKKwkJICAgICgodW5zaWduZWQgbG9uZyljYWNoZXApICUgUkVBUFRJTUVPVVRfTElTVDM7CiAKIAkJQlVHX09OKCFhY19kYXRhKGNhY2hlcCkpOwogCQlhY19kYXRhKGNhY2hlcCktPmF2YWlsID0gMDsKQEAgLTE4MjAsMTYgKzE4NTAsMTYgQEAKIAkJYWNfZGF0YShjYWNoZXApLT50b3VjaGVkID0gMDsKIAkJY2FjaGVwLT5iYXRjaGNvdW50ID0gMTsKIAkJY2FjaGVwLT5saW1pdCA9IEJPT1RfQ1BVQ0FDSEVfRU5UUklFUzsKLQl9IAorCX0KIAogCS8qIGNhY2hlIHNldHVwIGNvbXBsZXRlZCwgbGluayBpdCBpbnRvIHRoZSBsaXN0ICovCiAJbGlzdF9hZGQoJmNhY2hlcC0+bmV4dCwgJmNhY2hlX2NoYWluKTsKIAl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKLW9vcHM6CisgICAgICBvb3BzOgogCWlmICghY2FjaGVwICYmIChmbGFncyAmIFNMQUJfUEFOSUMpKQogCQlwYW5pYygia21lbV9jYWNoZV9jcmVhdGUoKTogZmFpbGVkIHRvIGNyZWF0ZSBzbGFiIGAlcydcbiIsCi0JCQluYW1lKTsKLQl1cCgmY2FjaGVfY2hhaW5fc2VtKTsKKwkJICAgICAgbmFtZSk7CisJbXV0ZXhfdW5sb2NrKCZjYWNoZV9jaGFpbl9tdXRleCk7CiAJcmV0dXJuIGNhY2hlcDsKIH0KIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9jcmVhdGUpOwpAQCAtMTg3MSw3ICsxOTAxLDcgQEAKIC8qCiAgKiBXYWl0cyBmb3IgYWxsIENQVXMgdG8gZXhlY3V0ZSBmdW5jKCkuCiAgKi8KLXN0YXRpYyB2b2lkIHNtcF9jYWxsX2Z1bmN0aW9uX2FsbF9jcHVzKHZvaWQgKCpmdW5jKSAodm9pZCAqYXJnKSwgdm9pZCAqYXJnKQorc3RhdGljIHZvaWQgc21wX2NhbGxfZnVuY3Rpb25fYWxsX2NwdXModm9pZCAoKmZ1bmMpKHZvaWQgKmFyZyksIHZvaWQgKmFyZykKIHsKIAljaGVja19pcnFfb24oKTsKIAlwcmVlbXB0X2Rpc2FibGUoKTsKQEAgLTE4ODYsMTIgKzE5MTYsMTIgQEAKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCi1zdGF0aWMgdm9pZCBkcmFpbl9hcnJheV9sb2NrZWQoa21lbV9jYWNoZV90KiBjYWNoZXAsCi0JCQkJc3RydWN0IGFycmF5X2NhY2hlICphYywgaW50IGZvcmNlLCBpbnQgbm9kZSk7CitzdGF0aWMgdm9pZCBkcmFpbl9hcnJheV9sb2NrZWQoa21lbV9jYWNoZV90ICpjYWNoZXAsIHN0cnVjdCBhcnJheV9jYWNoZSAqYWMsCisJCQkJaW50IGZvcmNlLCBpbnQgbm9kZSk7CiAKIHN0YXRpYyB2b2lkIGRvX2RyYWluKHZvaWQgKmFyZykKIHsKLQlrbWVtX2NhY2hlX3QgKmNhY2hlcCA9IChrbWVtX2NhY2hlX3QqKWFyZzsKKwlrbWVtX2NhY2hlX3QgKmNhY2hlcCA9IChrbWVtX2NhY2hlX3QgKikgYXJnOwogCXN0cnVjdCBhcnJheV9jYWNoZSAqYWM7CiAJaW50IG5vZGUgPSBudW1hX25vZGVfaWQoKTsKIApAQCAtMTkxMSw3ICsxOTQxLDcgQEAKIAlzbXBfY2FsbF9mdW5jdGlvbl9hbGxfY3B1cyhkb19kcmFpbiwgY2FjaGVwKTsKIAljaGVja19pcnFfb24oKTsKIAlzcGluX2xvY2tfaXJxKCZjYWNoZXAtPnNwaW5sb2NrKTsKLQlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKSAgeworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKIAkJbDMgPSBjYWNoZXAtPm5vZGVsaXN0c1tub2RlXTsKIAkJaWYgKGwzKSB7CiAJCQlzcGluX2xvY2soJmwzLT5saXN0X2xvY2spOwpAQCAtMTk0OSw4ICsxOTc5LDcgQEAKIAkJc2xhYl9kZXN0cm95KGNhY2hlcCwgc2xhYnApOwogCQlzcGluX2xvY2tfaXJxKCZsMy0+bGlzdF9sb2NrKTsKIAl9Ci0JcmV0ID0gIWxpc3RfZW1wdHkoJmwzLT5zbGFic19mdWxsKSB8fAotCQkhbGlzdF9lbXB0eSgmbDMtPnNsYWJzX3BhcnRpYWwpOworCXJldCA9ICFsaXN0X2VtcHR5KCZsMy0+c2xhYnNfZnVsbCkgfHwgIWxpc3RfZW1wdHkoJmwzLT5zbGFic19wYXJ0aWFsKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yMDA2LDcgKzIwMzUsNyBAQAogICogVGhlIGNhbGxlciBtdXN0IGd1YXJhbnRlZSB0aGF0IG5vb25lIHdpbGwgYWxsb2NhdGUgbWVtb3J5IGZyb20gdGhlIGNhY2hlCiAgKiBkdXJpbmcgdGhlIGttZW1fY2FjaGVfZGVzdHJveSgpLgogICovCi1pbnQga21lbV9jYWNoZV9kZXN0cm95KGttZW1fY2FjaGVfdCAqIGNhY2hlcCkKK2ludCBrbWVtX2NhY2hlX2Rlc3Ryb3koa21lbV9jYWNoZV90ICpjYWNoZXApCiB7CiAJaW50IGk7CiAJc3RydWN0IGttZW1fbGlzdDMgKmwzOwpAQCAtMjAxOCwxOCArMjA0NywxOCBAQAogCWxvY2tfY3B1X2hvdHBsdWcoKTsKIAogCS8qIEZpbmQgdGhlIGNhY2hlIGluIHRoZSBjaGFpbiBvZiBjYWNoZXMuICovCi0JZG93bigmY2FjaGVfY2hhaW5fc2VtKTsKKwltdXRleF9sb2NrKCZjYWNoZV9jaGFpbl9tdXRleCk7CiAJLyoKIAkgKiB0aGUgY2hhaW4gaXMgbmV2ZXIgZW1wdHksIGNhY2hlX2NhY2hlIGlzIG5ldmVyIGRlc3Ryb3llZAogCSAqLwogCWxpc3RfZGVsKCZjYWNoZXAtPm5leHQpOwotCXVwKCZjYWNoZV9jaGFpbl9zZW0pOworCW11dGV4X3VubG9jaygmY2FjaGVfY2hhaW5fbXV0ZXgpOwogCiAJaWYgKF9fY2FjaGVfc2hyaW5rKGNhY2hlcCkpIHsKIAkJc2xhYl9lcnJvcihjYWNoZXAsICJDYW4ndCBmcmVlIGFsbCBvYmplY3RzIik7Ci0JCWRvd24oJmNhY2hlX2NoYWluX3NlbSk7Ci0JCWxpc3RfYWRkKCZjYWNoZXAtPm5leHQsJmNhY2hlX2NoYWluKTsKLQkJdXAoJmNhY2hlX2NoYWluX3NlbSk7CisJCW11dGV4X2xvY2soJmNhY2hlX2NoYWluX211dGV4KTsKKwkJbGlzdF9hZGQoJmNhY2hlcC0+bmV4dCwgJmNhY2hlX2NoYWluKTsKKwkJbXV0ZXhfdW5sb2NrKCZjYWNoZV9jaGFpbl9tdXRleCk7CiAJCXVubG9ja19jcHVfaG90cGx1ZygpOwogCQlyZXR1cm4gMTsKIAl9CkBAIC0yMDM4LDcgKzIwNjcsNyBAQAogCQlzeW5jaHJvbml6ZV9yY3UoKTsKIAogCWZvcl9lYWNoX29ubGluZV9jcHUoaSkKLQkJa2ZyZWUoY2FjaGVwLT5hcnJheVtpXSk7CisJICAgIGtmcmVlKGNhY2hlcC0+YXJyYXlbaV0pOwogCiAJLyogTlVNQTogZnJlZSB0aGUgbGlzdDMgc3RydWN0dXJlcyAqLwogCWZvcl9lYWNoX29ubGluZV9ub2RlKGkpIHsKQEAgLTIwNTcsMzkgKzIwODYsMzkgQEAKIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9kZXN0cm95KTsKIAogLyogR2V0IHRoZSBtZW1vcnkgZm9yIGEgc2xhYiBtYW5hZ2VtZW50IG9iai4gKi8KLXN0YXRpYyBzdHJ1Y3Qgc2xhYiogYWxsb2Nfc2xhYm1nbXQoa21lbV9jYWNoZV90ICpjYWNoZXAsIHZvaWQgKm9ianAsCi0JCQlpbnQgY29sb3VyX29mZiwgZ2ZwX3QgbG9jYWxfZmxhZ3MpCitzdGF0aWMgc3RydWN0IHNsYWIgKmFsbG9jX3NsYWJtZ210KGttZW1fY2FjaGVfdCAqY2FjaGVwLCB2b2lkICpvYmpwLAorCQkJCSAgIGludCBjb2xvdXJfb2ZmLCBnZnBfdCBsb2NhbF9mbGFncykKIHsKIAlzdHJ1Y3Qgc2xhYiAqc2xhYnA7Ci0JCisKIAlpZiAoT0ZGX1NMQUIoY2FjaGVwKSkgewogCQkvKiBTbGFiIG1hbmFnZW1lbnQgb2JqIGlzIG9mZi1zbGFiLiAqLwogCQlzbGFicCA9IGttZW1fY2FjaGVfYWxsb2MoY2FjaGVwLT5zbGFicF9jYWNoZSwgbG9jYWxfZmxhZ3MpOwogCQlpZiAoIXNsYWJwKQogCQkJcmV0dXJuIE5VTEw7CiAJfSBlbHNlIHsKLQkJc2xhYnAgPSBvYmpwK2NvbG91cl9vZmY7CisJCXNsYWJwID0gb2JqcCArIGNvbG91cl9vZmY7CiAJCWNvbG91cl9vZmYgKz0gY2FjaGVwLT5zbGFiX3NpemU7CiAJfQogCXNsYWJwLT5pbnVzZSA9IDA7CiAJc2xhYnAtPmNvbG91cm9mZiA9IGNvbG91cl9vZmY7Ci0Jc2xhYnAtPnNfbWVtID0gb2JqcCtjb2xvdXJfb2ZmOworCXNsYWJwLT5zX21lbSA9IG9ianAgKyBjb2xvdXJfb2ZmOwogCiAJcmV0dXJuIHNsYWJwOwogfQogCiBzdGF0aWMgaW5saW5lIGttZW1fYnVmY3RsX3QgKnNsYWJfYnVmY3RsKHN0cnVjdCBzbGFiICpzbGFicCkKIHsKLQlyZXR1cm4gKGttZW1fYnVmY3RsX3QgKikoc2xhYnArMSk7CisJcmV0dXJuIChrbWVtX2J1ZmN0bF90ICopIChzbGFicCArIDEpOwogfQogCiBzdGF0aWMgdm9pZCBjYWNoZV9pbml0X29ianMoa21lbV9jYWNoZV90ICpjYWNoZXAsCi0JCQlzdHJ1Y3Qgc2xhYiAqc2xhYnAsIHVuc2lnbmVkIGxvbmcgY3Rvcl9mbGFncykKKwkJCSAgICBzdHJ1Y3Qgc2xhYiAqc2xhYnAsIHVuc2lnbmVkIGxvbmcgY3Rvcl9mbGFncykKIHsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBjYWNoZXAtPm51bTsgaSsrKSB7Ci0JCXZvaWQgKm9ianAgPSBzbGFicC0+c19tZW0rY2FjaGVwLT5vYmpzaXplKmk7CisJCXZvaWQgKm9ianAgPSBzbGFicC0+c19tZW0gKyBjYWNoZXAtPm9ianNpemUgKiBpOwogI2lmIERFQlVHCiAJCS8qIG5lZWQgdG8gcG9pc29uIHRoZSBvYmpzPyAqLwogCQlpZiAoY2FjaGVwLT5mbGFncyAmIFNMQUJfUE9JU09OKQpAQCAtMjEwNywyNSArMjEzNiwyOCBAQAogCQkgKiBPdGhlcndpc2UsIGRlYWRsb2NrLiBUaGV5IG11c3QgYWxzbyBiZSB0aHJlYWRlZC4KIAkJICovCiAJCWlmIChjYWNoZXAtPmN0b3IgJiYgIShjYWNoZXAtPmZsYWdzICYgU0xBQl9QT0lTT04pKQotCQkJY2FjaGVwLT5jdG9yKG9ianArb2JqX2RiZ2hlYWQoY2FjaGVwKSwgY2FjaGVwLCBjdG9yX2ZsYWdzKTsKKwkJCWNhY2hlcC0+Y3RvcihvYmpwICsgb2JqX2RiZ2hlYWQoY2FjaGVwKSwgY2FjaGVwLAorCQkJCSAgICAgY3Rvcl9mbGFncyk7CiAKIAkJaWYgKGNhY2hlcC0+ZmxhZ3MgJiBTTEFCX1JFRF9aT05FKSB7CiAJCQlpZiAoKmRiZ19yZWR6b25lMihjYWNoZXAsIG9ianApICE9IFJFRF9JTkFDVElWRSkKIAkJCQlzbGFiX2Vycm9yKGNhY2hlcCwgImNvbnN0cnVjdG9yIG92ZXJ3cm90ZSB0aGUiCi0JCQkJCQkJIiBlbmQgb2YgYW4gb2JqZWN0Iik7CisJCQkJCSAgICIgZW5kIG9mIGFuIG9iamVjdCIpOwogCQkJaWYgKCpkYmdfcmVkem9uZTEoY2FjaGVwLCBvYmpwKSAhPSBSRURfSU5BQ1RJVkUpCiAJCQkJc2xhYl9lcnJvcihjYWNoZXAsICJjb25zdHJ1Y3RvciBvdmVyd3JvdGUgdGhlIgotCQkJCQkJCSIgc3RhcnQgb2YgYW4gb2JqZWN0Iik7CisJCQkJCSAgICIgc3RhcnQgb2YgYW4gb2JqZWN0Iik7CiAJCX0KLQkJaWYgKChjYWNoZXAtPm9ianNpemUgJSBQQUdFX1NJWkUpID09IDAgJiYgT0ZGX1NMQUIoY2FjaGVwKSAmJiBjYWNoZXAtPmZsYWdzICYgU0xBQl9QT0lTT04pCi0JICAgICAgIAkJa2VybmVsX21hcF9wYWdlcyh2aXJ0X3RvX3BhZ2Uob2JqcCksIGNhY2hlcC0+b2Jqc2l6ZS9QQUdFX1NJWkUsIDApOworCQlpZiAoKGNhY2hlcC0+b2Jqc2l6ZSAlIFBBR0VfU0laRSkgPT0gMCAmJiBPRkZfU0xBQihjYWNoZXApCisJCSAgICAmJiBjYWNoZXAtPmZsYWdzICYgU0xBQl9QT0lTT04pCisJCQlrZXJuZWxfbWFwX3BhZ2VzKHZpcnRfdG9fcGFnZShvYmpwKSwKKwkJCQkJIGNhY2hlcC0+b2Jqc2l6ZSAvIFBBR0VfU0laRSwgMCk7CiAjZWxzZQogCQlpZiAoY2FjaGVwLT5jdG9yKQogCQkJY2FjaGVwLT5jdG9yKG9ianAsIGNhY2hlcCwgY3Rvcl9mbGFncyk7CiAjZW5kaWYKLQkJc2xhYl9idWZjdGwoc2xhYnApW2ldID0gaSsxOworCQlzbGFiX2J1ZmN0bChzbGFicClbaV0gPSBpICsgMTsKIAl9Ci0Jc2xhYl9idWZjdGwoc2xhYnApW2ktMV0gPSBCVUZDVExfRU5EOworCXNsYWJfYnVmY3RsKHNsYWJwKVtpIC0gMV0gPSBCVUZDVExfRU5EOwogCXNsYWJwLT5mcmVlID0gMDsKIH0KIApAQCAtMjE2MSwxNyArMjE5MywxNyBAQAogICovCiBzdGF0aWMgaW50IGNhY2hlX2dyb3coa21lbV9jYWNoZV90ICpjYWNoZXAsIGdmcF90IGZsYWdzLCBpbnQgbm9kZWlkKQogewotCXN0cnVjdCBzbGFiCSpzbGFicDsKLQl2b2lkCQkqb2JqcDsKLQlzaXplX3QJCSBvZmZzZXQ7Ci0JZ2ZwX3QJIAkgbG9jYWxfZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZwkgY3Rvcl9mbGFnczsKKwlzdHJ1Y3Qgc2xhYiAqc2xhYnA7CisJdm9pZCAqb2JqcDsKKwlzaXplX3Qgb2Zmc2V0OworCWdmcF90IGxvY2FsX2ZsYWdzOworCXVuc2lnbmVkIGxvbmcgY3Rvcl9mbGFnczsKIAlzdHJ1Y3Qga21lbV9saXN0MyAqbDM7CiAKIAkvKiBCZSBsYXp5IGFuZCBvbmx5IGNoZWNrIGZvciB2YWxpZCBmbGFncyBoZXJlLAotIAkgKiBrZWVwaW5nIGl0IG91dCBvZiB0aGUgY3JpdGljYWwgcGF0aCBpbiBrbWVtX2NhY2hlX2FsbG9jKCkuCisJICoga2VlcGluZyBpdCBvdXQgb2YgdGhlIGNyaXRpY2FsIHBhdGggaW4ga21lbV9jYWNoZV9hbGxvYygpLgogCSAqLwotCWlmIChmbGFncyAmIH4oU0xBQl9ETUF8U0xBQl9MRVZFTF9NQVNLfFNMQUJfTk9fR1JPVykpCisJaWYgKGZsYWdzICYgfihTTEFCX0RNQSB8IFNMQUJfTEVWRUxfTUFTSyB8IFNMQUJfTk9fR1JPVykpCiAJCUJVRygpOwogCWlmIChmbGFncyAmIFNMQUJfTk9fR1JPVykKIAkJcmV0dXJuIDA7CkBAIC0yMjM3LDkgKzIyNjksOSBAQAogCWwzLT5mcmVlX29iamVjdHMgKz0gY2FjaGVwLT5udW07CiAJc3Bpbl91bmxvY2soJmwzLT5saXN0X2xvY2spOwogCXJldHVybiAxOwotb3BwczE6CisgICAgICBvcHBzMToKIAlrbWVtX2ZyZWVwYWdlcyhjYWNoZXAsIG9ianApOwotZmFpbGVkOgorICAgICAgZmFpbGVkOgogCWlmIChsb2NhbF9mbGFncyAmIF9fR0ZQX1dBSVQpCiAJCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJcmV0dXJuIDA7CkBAIC0yMjU5LDE4ICsyMjkxLDE5IEBACiAKIAlpZiAoIXZpcnRfYWRkcl92YWxpZChvYmpwKSkgewogCQlwcmludGsoS0VSTl9FUlIgImtmcmVlX2RlYnVnY2hlY2s6IG91dCBvZiByYW5nZSBwdHIgJWx4aC5cbiIsCi0JCQkodW5zaWduZWQgbG9uZylvYmpwKTsJCi0JCUJVRygpOwkKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKW9ianApOworCQlCVUcoKTsKIAl9CiAJcGFnZSA9IHZpcnRfdG9fcGFnZShvYmpwKTsKIAlpZiAoIVBhZ2VTbGFiKHBhZ2UpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAia2ZyZWVfZGVidWdjaGVjazogYmFkIHB0ciAlbHhoLlxuIiwgKHVuc2lnbmVkIGxvbmcpb2JqcCk7CisJCXByaW50ayhLRVJOX0VSUiAia2ZyZWVfZGVidWdjaGVjazogYmFkIHB0ciAlbHhoLlxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKW9ianApOwogCQlCVUcoKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkICpjYWNoZV9mcmVlX2RlYnVnY2hlY2soa21lbV9jYWNoZV90ICpjYWNoZXAsIHZvaWQgKm9ianAsCi0JCQkJCXZvaWQgKmNhbGxlcikKKwkJCQkgICB2b2lkICpjYWxsZXIpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdW5zaWduZWQgaW50IG9iam5yOwpAQCAtMjI4MSwyMCArMjMxNCwyNiBAQAogCXBhZ2UgPSB2aXJ0X3RvX3BhZ2Uob2JqcCk7CiAKIAlpZiAocGFnZV9nZXRfY2FjaGUocGFnZSkgIT0gY2FjaGVwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibWlzbWF0Y2ggaW4ga21lbV9jYWNoZV9mcmVlOiBleHBlY3RlZCBjYWNoZSAlcCwgZ290ICVwXG4iLAotCQkJCXBhZ2VfZ2V0X2NhY2hlKHBhZ2UpLGNhY2hlcCk7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIm1pc21hdGNoIGluIGttZW1fY2FjaGVfZnJlZTogZXhwZWN0ZWQgY2FjaGUgJXAsIGdvdCAlcFxuIiwKKwkJICAgICAgIHBhZ2VfZ2V0X2NhY2hlKHBhZ2UpLCBjYWNoZXApOwogCQlwcmludGsoS0VSTl9FUlIgIiVwIGlzICVzLlxuIiwgY2FjaGVwLCBjYWNoZXAtPm5hbWUpOwotCQlwcmludGsoS0VSTl9FUlIgIiVwIGlzICVzLlxuIiwgcGFnZV9nZXRfY2FjaGUocGFnZSksIHBhZ2VfZ2V0X2NhY2hlKHBhZ2UpLT5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlcCBpcyAlcy5cbiIsIHBhZ2VfZ2V0X2NhY2hlKHBhZ2UpLAorCQkgICAgICAgcGFnZV9nZXRfY2FjaGUocGFnZSktPm5hbWUpOwogCQlXQVJOX09OKDEpOwogCX0KIAlzbGFicCA9IHBhZ2VfZ2V0X3NsYWIocGFnZSk7CiAKIAlpZiAoY2FjaGVwLT5mbGFncyAmIFNMQUJfUkVEX1pPTkUpIHsKLQkJaWYgKCpkYmdfcmVkem9uZTEoY2FjaGVwLCBvYmpwKSAhPSBSRURfQUNUSVZFIHx8ICpkYmdfcmVkem9uZTIoY2FjaGVwLCBvYmpwKSAhPSBSRURfQUNUSVZFKSB7Ci0JCQlzbGFiX2Vycm9yKGNhY2hlcCwgImRvdWJsZSBmcmVlLCBvciBtZW1vcnkgb3V0c2lkZSIKLQkJCQkJCSIgb2JqZWN0IHdhcyBvdmVyd3JpdHRlbiIpOwotCQkJcHJpbnRrKEtFUk5fRVJSICIlcDogcmVkem9uZSAxOiAweCVseCwgcmVkem9uZSAyOiAweCVseC5cbiIsCi0JCQkJCW9ianAsICpkYmdfcmVkem9uZTEoY2FjaGVwLCBvYmpwKSwgKmRiZ19yZWR6b25lMihjYWNoZXAsIG9ianApKTsKKwkJaWYgKCpkYmdfcmVkem9uZTEoY2FjaGVwLCBvYmpwKSAhPSBSRURfQUNUSVZFCisJCSAgICB8fCAqZGJnX3JlZHpvbmUyKGNhY2hlcCwgb2JqcCkgIT0gUkVEX0FDVElWRSkgeworCQkJc2xhYl9lcnJvcihjYWNoZXAsCisJCQkJICAgImRvdWJsZSBmcmVlLCBvciBtZW1vcnkgb3V0c2lkZSIKKwkJCQkgICAiIG9iamVjdCB3YXMgb3ZlcndyaXR0ZW4iKTsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICIlcDogcmVkem9uZSAxOiAweCVseCwgcmVkem9uZSAyOiAweCVseC5cbiIsCisJCQkgICAgICAgb2JqcCwgKmRiZ19yZWR6b25lMShjYWNoZXAsIG9ianApLAorCQkJICAgICAgICpkYmdfcmVkem9uZTIoY2FjaGVwLCBvYmpwKSk7CiAJCX0KIAkJKmRiZ19yZWR6b25lMShjYWNoZXAsIG9ianApID0gUkVEX0lOQUNUSVZFOwogCQkqZGJnX3JlZHpvbmUyKGNhY2hlcCwgb2JqcCkgPSBSRURfSU5BQ1RJVkU7CkBAIC0yMzAyLDMwICsyMzQxLDMxIEBACiAJaWYgKGNhY2hlcC0+ZmxhZ3MgJiBTTEFCX1NUT1JFX1VTRVIpCiAJCSpkYmdfdXNlcndvcmQoY2FjaGVwLCBvYmpwKSA9IGNhbGxlcjsKIAotCW9iam5yID0gKG9ianAtc2xhYnAtPnNfbWVtKS9jYWNoZXAtPm9ianNpemU7CisJb2JqbnIgPSAob2JqcCAtIHNsYWJwLT5zX21lbSkgLyBjYWNoZXAtPm9ianNpemU7CiAKIAlCVUdfT04ob2JqbnIgPj0gY2FjaGVwLT5udW0pOwotCUJVR19PTihvYmpwICE9IHNsYWJwLT5zX21lbSArIG9iam5yKmNhY2hlcC0+b2Jqc2l6ZSk7CisJQlVHX09OKG9ianAgIT0gc2xhYnAtPnNfbWVtICsgb2JqbnIgKiBjYWNoZXAtPm9ianNpemUpOwogCiAJaWYgKGNhY2hlcC0+ZmxhZ3MgJiBTTEFCX0RFQlVHX0lOSVRJQUwpIHsKIAkJLyogTmVlZCB0byBjYWxsIHRoZSBzbGFiJ3MgY29uc3RydWN0b3Igc28gdGhlCiAJCSAqIGNhbGxlciBjYW4gcGVyZm9ybSBhIHZlcmlmeSBvZiBpdHMgc3RhdGUgKGRlYnVnZ2luZykuCiAJCSAqIENhbGxlZCB3aXRob3V0IHRoZSBjYWNoZS1sb2NrIGhlbGQuCiAJCSAqLwotCQljYWNoZXAtPmN0b3Iob2JqcCtvYmpfZGJnaGVhZChjYWNoZXApLAotCQkJCQljYWNoZXAsIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUnxTTEFCX0NUT1JfVkVSSUZZKTsKKwkJY2FjaGVwLT5jdG9yKG9ianAgKyBvYmpfZGJnaGVhZChjYWNoZXApLAorCQkJICAgICBjYWNoZXAsIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUiB8IFNMQUJfQ1RPUl9WRVJJRlkpOwogCX0KIAlpZiAoY2FjaGVwLT5mbGFncyAmIFNMQUJfUE9JU09OICYmIGNhY2hlcC0+ZHRvcikgewogCQkvKiB3ZSB3YW50IHRvIGNhY2hlIHBvaXNvbiB0aGUgb2JqZWN0LAogCQkgKiBjYWxsIHRoZSBkZXN0cnVjdGlvbiBjYWxsYmFjawogCQkgKi8KLQkJY2FjaGVwLT5kdG9yKG9ianArb2JqX2RiZ2hlYWQoY2FjaGVwKSwgY2FjaGVwLCAwKTsKKwkJY2FjaGVwLT5kdG9yKG9ianAgKyBvYmpfZGJnaGVhZChjYWNoZXApLCBjYWNoZXAsIDApOwogCX0KIAlpZiAoY2FjaGVwLT5mbGFncyAmIFNMQUJfUE9JU09OKSB7CiAjaWZkZWYgQ09ORklHX0RFQlVHX1BBR0VBTExPQwogCQlpZiAoKGNhY2hlcC0+b2Jqc2l6ZSAlIFBBR0VfU0laRSkgPT0gMCAmJiBPRkZfU0xBQihjYWNoZXApKSB7CiAJCQlzdG9yZV9zdGFja2luZm8oY2FjaGVwLCBvYmpwLCAodW5zaWduZWQgbG9uZyljYWxsZXIpOwotCSAgICAgICAJCWtlcm5lbF9tYXBfcGFnZXModmlydF90b19wYWdlKG9ianApLCBjYWNoZXAtPm9ianNpemUvUEFHRV9TSVpFLCAwKTsKKwkJCWtlcm5lbF9tYXBfcGFnZXModmlydF90b19wYWdlKG9ianApLAorCQkJCQkgY2FjaGVwLT5vYmpzaXplIC8gUEFHRV9TSVpFLCAwKTsKIAkJfSBlbHNlIHsKIAkJCXBvaXNvbl9vYmooY2FjaGVwLCBvYmpwLCBQT0lTT05fRlJFRSk7CiAJCX0KQEAgLTIzNDAsNyArMjM4MCw3IEBACiB7CiAJa21lbV9idWZjdGxfdCBpOwogCWludCBlbnRyaWVzID0gMDsKLQkKKwogCS8qIENoZWNrIHNsYWIncyBmcmVlbGlzdCB0byBzZWUgaWYgdGhpcyBvYmogaXMgdGhlcmUuICovCiAJZm9yIChpID0gc2xhYnAtPmZyZWU7IGkgIT0gQlVGQ1RMX0VORDsgaSA9IHNsYWJfYnVmY3RsKHNsYWJwKVtpXSkgewogCQllbnRyaWVzKys7CkBAIC0yMzQ4LDEzICsyMzg4LDE2IEBACiAJCQlnb3RvIGJhZDsKIAl9CiAJaWYgKGVudHJpZXMgIT0gY2FjaGVwLT5udW0gLSBzbGFicC0+aW51c2UpIHsKLWJhZDoKLQkJcHJpbnRrKEtFUk5fRVJSICJzbGFiOiBJbnRlcm5hbCBsaXN0IGNvcnJ1cHRpb24gZGV0ZWN0ZWQgaW4gY2FjaGUgJyVzJyglZCksIHNsYWJwICVwKCVkKS4gSGV4ZHVtcDpcbiIsCi0JCQkJY2FjaGVwLT5uYW1lLCBjYWNoZXAtPm51bSwgc2xhYnAsIHNsYWJwLT5pbnVzZSk7Ci0JCWZvciAoaT0wO2k8c2l6ZW9mKHNsYWJwKStjYWNoZXAtPm51bSpzaXplb2Yoa21lbV9idWZjdGxfdCk7aSsrKSB7Ci0JCQlpZiAoKGklMTYpPT0wKQorCSAgICAgIGJhZDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAic2xhYjogSW50ZXJuYWwgbGlzdCBjb3JydXB0aW9uIGRldGVjdGVkIGluIGNhY2hlICclcycoJWQpLCBzbGFicCAlcCglZCkuIEhleGR1bXA6XG4iLAorCQkgICAgICAgY2FjaGVwLT5uYW1lLCBjYWNoZXAtPm51bSwgc2xhYnAsIHNsYWJwLT5pbnVzZSk7CisJCWZvciAoaSA9IDA7CisJCSAgICAgaSA8IHNpemVvZihzbGFicCkgKyBjYWNoZXAtPm51bSAqIHNpemVvZihrbWVtX2J1ZmN0bF90KTsKKwkJICAgICBpKyspIHsKKwkJCWlmICgoaSAlIDE2KSA9PSAwKQogCQkJCXByaW50aygiXG4lMDN4OiIsIGkpOwotCQkJcHJpbnRrKCIgJTAyeCIsICgodW5zaWduZWQgY2hhciopc2xhYnApW2ldKTsKKwkJCXByaW50aygiICUwMngiLCAoKHVuc2lnbmVkIGNoYXIgKilzbGFicClbaV0pOwogCQl9CiAJCXByaW50aygiXG4iKTsKIAkJQlVHKCk7CkBAIC0yMzc0LDcgKzI0MTcsNyBAQAogCiAJY2hlY2tfaXJxX29mZigpOwogCWFjID0gYWNfZGF0YShjYWNoZXApOwotcmV0cnk6CisgICAgICByZXRyeToKIAliYXRjaGNvdW50ID0gYWMtPmJhdGNoY291bnQ7CiAJaWYgKCFhYy0+dG91Y2hlZCAmJiBiYXRjaGNvdW50ID4gQkFUQ0hSRUZJTExfTElNSVQpIHsKIAkJLyogaWYgdGhlcmUgd2FzIGxpdHRsZSByZWNlbnQgYWN0aXZpdHkgb24gdGhpcwpAQCAtMjM5Niw4ICsyNDM5LDggQEAKIAkJCXNoYXJlZF9hcnJheS0+YXZhaWwgLT0gYmF0Y2hjb3VudDsKIAkJCWFjLT5hdmFpbCA9IGJhdGNoY291bnQ7CiAJCQltZW1jcHkoYWMtPmVudHJ5LAotCQkJCSYoc2hhcmVkX2FycmF5LT5lbnRyeVtzaGFyZWRfYXJyYXktPmF2YWlsXSksCi0JCQkJc2l6ZW9mKHZvaWQqKSpiYXRjaGNvdW50KTsKKwkJCSAgICAgICAmKHNoYXJlZF9hcnJheS0+ZW50cnlbc2hhcmVkX2FycmF5LT5hdmFpbF0pLAorCQkJICAgICAgIHNpemVvZih2b2lkICopICogYmF0Y2hjb3VudCk7CiAJCQlzaGFyZWRfYXJyYXktPnRvdWNoZWQgPSAxOwogCQkJZ290byBhbGxvY19kb25lOwogCQl9CkBAIC0yNDI1LDcgKzI0NjgsNyBAQAogCiAJCQkvKiBnZXQgb2JqIHBvaW50ZXIgKi8KIAkJCWFjLT5lbnRyeVthYy0+YXZhaWwrK10gPSBzbGFicC0+c19tZW0gKwotCQkJCXNsYWJwLT5mcmVlKmNhY2hlcC0+b2Jqc2l6ZTsKKwkJCSAgICBzbGFicC0+ZnJlZSAqIGNhY2hlcC0+b2Jqc2l6ZTsKIAogCQkJc2xhYnAtPmludXNlKys7CiAJCQluZXh0ID0gc2xhYl9idWZjdGwoc2xhYnApW3NsYWJwLT5mcmVlXTsKQEAgLTI0MzMsNyArMjQ3Niw3IEBACiAJCQlzbGFiX2J1ZmN0bChzbGFicClbc2xhYnAtPmZyZWVdID0gQlVGQ1RMX0ZSRUU7CiAJCQlXQVJOX09OKG51bWFfbm9kZV9pZCgpICE9IHNsYWJwLT5ub2RlaWQpOwogI2VuZGlmCi0JCSAgICAgICAJc2xhYnAtPmZyZWUgPSBuZXh0OworCQkJc2xhYnAtPmZyZWUgPSBuZXh0OwogCQl9CiAJCWNoZWNrX3NsYWJwKGNhY2hlcCwgc2xhYnApOwogCkBAIC0yNDQ1LDkgKzI0ODgsOSBAQAogCQkJbGlzdF9hZGQoJnNsYWJwLT5saXN0LCAmbDMtPnNsYWJzX3BhcnRpYWwpOwogCX0KIAotbXVzdF9ncm93OgorICAgICAgbXVzdF9ncm93OgogCWwzLT5mcmVlX29iamVjdHMgLT0gYWMtPmF2YWlsOwotYWxsb2NfZG9uZToKKyAgICAgIGFsbG9jX2RvbmU6CiAJc3Bpbl91bmxvY2soJmwzLT5saXN0X2xvY2spOwogCiAJaWYgKHVubGlrZWx5KCFhYy0+YXZhaWwpKSB7CkBAIC0yNDU5LDcgKzI1MDIsNyBAQAogCQlpZiAoIXggJiYgYWMtPmF2YWlsID09IDApCS8vIG5vIG9iamVjdHMgaW4gc2lnaHQ/IGFib3J0CiAJCQlyZXR1cm4gTlVMTDsKIAotCQlpZiAoIWFjLT5hdmFpbCkJCS8vIG9iamVjdHMgcmVmaWxsZWQgYnkgaW50ZXJydXB0PworCQlpZiAoIWFjLT5hdmFpbCkJLy8gb2JqZWN0cyByZWZpbGxlZCBieSBpbnRlcnJ1cHQ/CiAJCQlnb3RvIHJldHJ5OwogCX0KIAlhYy0+dG91Y2hlZCA9IDE7CkBAIC0yNDc2LDE2ICsyNTE5LDE2IEBACiB9CiAKICNpZiBERUJVRwotc3RhdGljIHZvaWQgKgotY2FjaGVfYWxsb2NfZGVidWdjaGVja19hZnRlcihrbWVtX2NhY2hlX3QgKmNhY2hlcCwKLQkJCWdmcF90IGZsYWdzLCB2b2lkICpvYmpwLCB2b2lkICpjYWxsZXIpCitzdGF0aWMgdm9pZCAqY2FjaGVfYWxsb2NfZGVidWdjaGVja19hZnRlcihrbWVtX2NhY2hlX3QgKmNhY2hlcCwgZ2ZwX3QgZmxhZ3MsCisJCQkJCXZvaWQgKm9ianAsIHZvaWQgKmNhbGxlcikKIHsKLQlpZiAoIW9ianApCQorCWlmICghb2JqcCkKIAkJcmV0dXJuIG9ianA7Ci0gCWlmIChjYWNoZXAtPmZsYWdzICYgU0xBQl9QT0lTT04pIHsKKwlpZiAoY2FjaGVwLT5mbGFncyAmIFNMQUJfUE9JU09OKSB7CiAjaWZkZWYgQ09ORklHX0RFQlVHX1BBR0VBTExPQwogCQlpZiAoKGNhY2hlcC0+b2Jqc2l6ZSAlIFBBR0VfU0laRSkgPT0gMCAmJiBPRkZfU0xBQihjYWNoZXApKQotCQkJa2VybmVsX21hcF9wYWdlcyh2aXJ0X3RvX3BhZ2Uob2JqcCksIGNhY2hlcC0+b2Jqc2l6ZS9QQUdFX1NJWkUsIDEpOworCQkJa2VybmVsX21hcF9wYWdlcyh2aXJ0X3RvX3BhZ2Uob2JqcCksCisJCQkJCSBjYWNoZXAtPm9ianNpemUgLyBQQUdFX1NJWkUsIDEpOwogCQllbHNlCiAJCQljaGVja19wb2lzb25fb2JqKGNhY2hlcCwgb2JqcCk7CiAjZWxzZQpAQCAtMjQ5NywyNCArMjU0MCwyOCBAQAogCQkqZGJnX3VzZXJ3b3JkKGNhY2hlcCwgb2JqcCkgPSBjYWxsZXI7CiAKIAlpZiAoY2FjaGVwLT5mbGFncyAmIFNMQUJfUkVEX1pPTkUpIHsKLQkJaWYgKCpkYmdfcmVkem9uZTEoY2FjaGVwLCBvYmpwKSAhPSBSRURfSU5BQ1RJVkUgfHwgKmRiZ19yZWR6b25lMihjYWNoZXAsIG9ianApICE9IFJFRF9JTkFDVElWRSkgewotCQkJc2xhYl9lcnJvcihjYWNoZXAsICJkb3VibGUgZnJlZSwgb3IgbWVtb3J5IG91dHNpZGUiCi0JCQkJCQkiIG9iamVjdCB3YXMgb3ZlcndyaXR0ZW4iKTsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXA6IHJlZHpvbmUgMTogMHglbHgsIHJlZHpvbmUgMjogMHglbHguXG4iLAotCQkJCQlvYmpwLCAqZGJnX3JlZHpvbmUxKGNhY2hlcCwgb2JqcCksICpkYmdfcmVkem9uZTIoY2FjaGVwLCBvYmpwKSk7CisJCWlmICgqZGJnX3JlZHpvbmUxKGNhY2hlcCwgb2JqcCkgIT0gUkVEX0lOQUNUSVZFCisJCSAgICB8fCAqZGJnX3JlZHpvbmUyKGNhY2hlcCwgb2JqcCkgIT0gUkVEX0lOQUNUSVZFKSB7CisJCQlzbGFiX2Vycm9yKGNhY2hlcCwKKwkJCQkgICAiZG91YmxlIGZyZWUsIG9yIG1lbW9yeSBvdXRzaWRlIgorCQkJCSAgICIgb2JqZWN0IHdhcyBvdmVyd3JpdHRlbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIiVwOiByZWR6b25lIDE6IDB4JWx4LCByZWR6b25lIDI6IDB4JWx4LlxuIiwKKwkJCSAgICAgICBvYmpwLCAqZGJnX3JlZHpvbmUxKGNhY2hlcCwgb2JqcCksCisJCQkgICAgICAgKmRiZ19yZWR6b25lMihjYWNoZXAsIG9ianApKTsKIAkJfQogCQkqZGJnX3JlZHpvbmUxKGNhY2hlcCwgb2JqcCkgPSBSRURfQUNUSVZFOwogCQkqZGJnX3JlZHpvbmUyKGNhY2hlcCwgb2JqcCkgPSBSRURfQUNUSVZFOwogCX0KIAlvYmpwICs9IG9ial9kYmdoZWFkKGNhY2hlcCk7CiAJaWYgKGNhY2hlcC0+Y3RvciAmJiBjYWNoZXAtPmZsYWdzICYgU0xBQl9QT0lTT04pIHsKLQkJdW5zaWduZWQgbG9uZwljdG9yX2ZsYWdzID0gU0xBQl9DVE9SX0NPTlNUUlVDVE9SOworCQl1bnNpZ25lZCBsb25nIGN0b3JfZmxhZ3MgPSBTTEFCX0NUT1JfQ09OU1RSVUNUT1I7CiAKIAkJaWYgKCEoZmxhZ3MgJiBfX0dGUF9XQUlUKSkKIAkJCWN0b3JfZmxhZ3MgfD0gU0xBQl9DVE9SX0FUT01JQzsKIAogCQljYWNoZXAtPmN0b3Iob2JqcCwgY2FjaGVwLCBjdG9yX2ZsYWdzKTsKLQl9CQorCX0KIAlyZXR1cm4gb2JqcDsKIH0KICNlbHNlCkBAIC0yNTIzLDkgKzI1NzAsMTggQEAKIAogc3RhdGljIGlubGluZSB2b2lkICpfX19fY2FjaGVfYWxsb2Moa21lbV9jYWNoZV90ICpjYWNoZXAsIGdmcF90IGZsYWdzKQogewotCXZvaWQqIG9ianA7CisJdm9pZCAqb2JqcDsKIAlzdHJ1Y3QgYXJyYXlfY2FjaGUgKmFjOwogCisjaWZkZWYgQ09ORklHX05VTUEKKwlpZiAodW5saWtlbHkoY3VycmVudC0+bWVtcG9saWN5ICYmICFpbl9pbnRlcnJ1cHQoKSkpIHsKKwkJaW50IG5pZCA9IHNsYWJfbm9kZShjdXJyZW50LT5tZW1wb2xpY3kpOworCisJCWlmIChuaWQgIT0gbnVtYV9ub2RlX2lkKCkpCisJCQlyZXR1cm4gX19jYWNoZV9hbGxvY19ub2RlKGNhY2hlcCwgZmxhZ3MsIG5pZCk7CisJfQorI2VuZGlmCisKIAljaGVja19pcnFfb2ZmKCk7CiAJYWMgPSBhY19kYXRhKGNhY2hlcCk7CiAJaWYgKGxpa2VseShhYy0+YXZhaWwpKSB7CkBAIC0yNTQyLDcgKzI1OTgsNyBAQAogc3RhdGljIGlubGluZSB2b2lkICpfX2NhY2hlX2FsbG9jKGttZW1fY2FjaGVfdCAqY2FjaGVwLCBnZnBfdCBmbGFncykKIHsKIAl1bnNpZ25lZCBsb25nIHNhdmVfZmxhZ3M7Ci0Jdm9pZCogb2JqcDsKKwl2b2lkICpvYmpwOwogCiAJY2FjaGVfYWxsb2NfZGVidWdjaGVja19iZWZvcmUoY2FjaGVwLCBmbGFncyk7CiAKQEAgLTI1NTAsNyArMjYwNiw3IEBACiAJb2JqcCA9IF9fX19jYWNoZV9hbGxvYyhjYWNoZXAsIGZsYWdzKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShzYXZlX2ZsYWdzKTsKIAlvYmpwID0gY2FjaGVfYWxsb2NfZGVidWdjaGVja19hZnRlcihjYWNoZXAsIGZsYWdzLCBvYmpwLAotCQkJCQlfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCQkJCQkgICAgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIAlwcmVmZXRjaHcob2JqcCk7CiAJcmV0dXJuIG9ianA7CiB9CkBAIC0yNTYyLDc0ICsyNjE4LDc1IEBACiBzdGF0aWMgdm9pZCAqX19jYWNoZV9hbGxvY19ub2RlKGttZW1fY2FjaGVfdCAqY2FjaGVwLCBnZnBfdCBmbGFncywgaW50IG5vZGVpZCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKLSAJc3RydWN0IHNsYWIgKnNsYWJwOwotIAlzdHJ1Y3Qga21lbV9saXN0MyAqbDM7Ci0gCXZvaWQgKm9iajsKLSAJa21lbV9idWZjdGxfdCBuZXh0OwotIAlpbnQgeDsKKwlzdHJ1Y3Qgc2xhYiAqc2xhYnA7CisJc3RydWN0IGttZW1fbGlzdDMgKmwzOworCXZvaWQgKm9iajsKKwlrbWVtX2J1ZmN0bF90IG5leHQ7CisJaW50IHg7CiAKLSAJbDMgPSBjYWNoZXAtPm5vZGVsaXN0c1tub2RlaWRdOwotIAlCVUdfT04oIWwzKTsKKwlsMyA9IGNhY2hlcC0+bm9kZWxpc3RzW25vZGVpZF07CisJQlVHX09OKCFsMyk7CiAKLXJldHJ5OgotIAlzcGluX2xvY2soJmwzLT5saXN0X2xvY2spOwotIAllbnRyeSA9IGwzLT5zbGFic19wYXJ0aWFsLm5leHQ7Ci0gCWlmIChlbnRyeSA9PSAmbDMtPnNsYWJzX3BhcnRpYWwpIHsKLSAJCWwzLT5mcmVlX3RvdWNoZWQgPSAxOwotIAkJZW50cnkgPSBsMy0+c2xhYnNfZnJlZS5uZXh0OwotIAkJaWYgKGVudHJ5ID09ICZsMy0+c2xhYnNfZnJlZSkKLSAJCQlnb3RvIG11c3RfZ3JvdzsKLSAJfQorICAgICAgcmV0cnk6CisJc3Bpbl9sb2NrKCZsMy0+bGlzdF9sb2NrKTsKKwllbnRyeSA9IGwzLT5zbGFic19wYXJ0aWFsLm5leHQ7CisJaWYgKGVudHJ5ID09ICZsMy0+c2xhYnNfcGFydGlhbCkgeworCQlsMy0+ZnJlZV90b3VjaGVkID0gMTsKKwkJZW50cnkgPSBsMy0+c2xhYnNfZnJlZS5uZXh0OworCQlpZiAoZW50cnkgPT0gJmwzLT5zbGFic19mcmVlKQorCQkJZ290byBtdXN0X2dyb3c7CisJfQogCi0gCXNsYWJwID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHNsYWIsIGxpc3QpOwotIAljaGVja19zcGlubG9ja19hY3F1aXJlZF9ub2RlKGNhY2hlcCwgbm9kZWlkKTsKLSAJY2hlY2tfc2xhYnAoY2FjaGVwLCBzbGFicCk7CisJc2xhYnAgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3Qgc2xhYiwgbGlzdCk7CisJY2hlY2tfc3BpbmxvY2tfYWNxdWlyZWRfbm9kZShjYWNoZXAsIG5vZGVpZCk7CisJY2hlY2tfc2xhYnAoY2FjaGVwLCBzbGFicCk7CiAKLSAJU1RBVFNfSU5DX05PREVBTExPQ1MoY2FjaGVwKTsKLSAJU1RBVFNfSU5DX0FDVElWRShjYWNoZXApOwotIAlTVEFUU19TRVRfSElHSChjYWNoZXApOworCVNUQVRTX0lOQ19OT0RFQUxMT0NTKGNhY2hlcCk7CisJU1RBVFNfSU5DX0FDVElWRShjYWNoZXApOworCVNUQVRTX1NFVF9ISUdIKGNhY2hlcCk7CiAKLSAJQlVHX09OKHNsYWJwLT5pbnVzZSA9PSBjYWNoZXAtPm51bSk7CisJQlVHX09OKHNsYWJwLT5pbnVzZSA9PSBjYWNoZXAtPm51bSk7CiAKLSAJLyogZ2V0IG9iaiBwb2ludGVyICovCi0gCW9iaiA9ICBzbGFicC0+c19tZW0gKyBzbGFicC0+ZnJlZSpjYWNoZXAtPm9ianNpemU7Ci0gCXNsYWJwLT5pbnVzZSsrOwotIAluZXh0ID0gc2xhYl9idWZjdGwoc2xhYnApW3NsYWJwLT5mcmVlXTsKKwkvKiBnZXQgb2JqIHBvaW50ZXIgKi8KKwlvYmogPSBzbGFicC0+c19tZW0gKyBzbGFicC0+ZnJlZSAqIGNhY2hlcC0+b2Jqc2l6ZTsKKwlzbGFicC0+aW51c2UrKzsKKwluZXh0ID0gc2xhYl9idWZjdGwoc2xhYnApW3NsYWJwLT5mcmVlXTsKICNpZiBERUJVRwotIAlzbGFiX2J1ZmN0bChzbGFicClbc2xhYnAtPmZyZWVdID0gQlVGQ1RMX0ZSRUU7CisJc2xhYl9idWZjdGwoc2xhYnApW3NsYWJwLT5mcmVlXSA9IEJVRkNUTF9GUkVFOwogI2VuZGlmCi0gCXNsYWJwLT5mcmVlID0gbmV4dDsKLSAJY2hlY2tfc2xhYnAoY2FjaGVwLCBzbGFicCk7Ci0gCWwzLT5mcmVlX29iamVjdHMtLTsKLSAJLyogbW92ZSBzbGFicCB0byBjb3JyZWN0IHNsYWJwIGxpc3Q6ICovCi0gCWxpc3RfZGVsKCZzbGFicC0+bGlzdCk7CisJc2xhYnAtPmZyZWUgPSBuZXh0OworCWNoZWNrX3NsYWJwKGNhY2hlcCwgc2xhYnApOworCWwzLT5mcmVlX29iamVjdHMtLTsKKwkvKiBtb3ZlIHNsYWJwIHRvIGNvcnJlY3Qgc2xhYnAgbGlzdDogKi8KKwlsaXN0X2RlbCgmc2xhYnAtPmxpc3QpOwogCi0gCWlmIChzbGFicC0+ZnJlZSA9PSBCVUZDVExfRU5EKSB7Ci0gCQlsaXN0X2FkZCgmc2xhYnAtPmxpc3QsICZsMy0+c2xhYnNfZnVsbCk7Ci0gCX0gZWxzZSB7Ci0gCQlsaXN0X2FkZCgmc2xhYnAtPmxpc3QsICZsMy0+c2xhYnNfcGFydGlhbCk7Ci0gCX0KKwlpZiAoc2xhYnAtPmZyZWUgPT0gQlVGQ1RMX0VORCkgeworCQlsaXN0X2FkZCgmc2xhYnAtPmxpc3QsICZsMy0+c2xhYnNfZnVsbCk7CisJfSBlbHNlIHsKKwkJbGlzdF9hZGQoJnNsYWJwLT5saXN0LCAmbDMtPnNsYWJzX3BhcnRpYWwpOworCX0KIAotIAlzcGluX3VubG9jaygmbDMtPmxpc3RfbG9jayk7Ci0gCWdvdG8gZG9uZTsKKwlzcGluX3VubG9jaygmbDMtPmxpc3RfbG9jayk7CisJZ290byBkb25lOwogCi1tdXN0X2dyb3c6Ci0gCXNwaW5fdW5sb2NrKCZsMy0+bGlzdF9sb2NrKTsKLSAJeCA9IGNhY2hlX2dyb3coY2FjaGVwLCBmbGFncywgbm9kZWlkKTsKKyAgICAgIG11c3RfZ3JvdzoKKwlzcGluX3VubG9jaygmbDMtPmxpc3RfbG9jayk7CisJeCA9IGNhY2hlX2dyb3coY2FjaGVwLCBmbGFncywgbm9kZWlkKTsKIAotIAlpZiAoIXgpCi0gCQlyZXR1cm4gTlVMTDsKKwlpZiAoIXgpCisJCXJldHVybiBOVUxMOwogCi0gCWdvdG8gcmV0cnk7Ci1kb25lOgotIAlyZXR1cm4gb2JqOworCWdvdG8gcmV0cnk7CisgICAgICBkb25lOgorCXJldHVybiBvYmo7CiB9CiAjZW5kaWYKIAogLyoKICAqIENhbGxlciBuZWVkcyB0byBhY3F1aXJlIGNvcnJlY3Qga21lbV9saXN0J3MgbGlzdF9sb2NrCiAgKi8KLXN0YXRpYyB2b2lkIGZyZWVfYmxvY2soa21lbV9jYWNoZV90ICpjYWNoZXAsIHZvaWQgKipvYmpwcCwgaW50IG5yX29iamVjdHMsIGludCBub2RlKQorc3RhdGljIHZvaWQgZnJlZV9ibG9jayhrbWVtX2NhY2hlX3QgKmNhY2hlcCwgdm9pZCAqKm9ianBwLCBpbnQgbnJfb2JqZWN0cywKKwkJICAgICAgIGludCBub2RlKQogewogCWludCBpOwogCXN0cnVjdCBrbWVtX2xpc3QzICpsMzsKQEAgLTI2NTIsNyArMjcwOSw3IEBACiAKIAkJaWYgKHNsYWJfYnVmY3RsKHNsYWJwKVtvYmpucl0gIT0gQlVGQ1RMX0ZSRUUpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAic2xhYjogZG91YmxlIGZyZWUgZGV0ZWN0ZWQgaW4gY2FjaGUgIgotCQkJCQkiJyVzJywgb2JqcCAlcFxuIiwgY2FjaGVwLT5uYW1lLCBvYmpwKTsKKwkJCSAgICAgICAiJyVzJywgb2JqcCAlcFxuIiwgY2FjaGVwLT5uYW1lLCBvYmpwKTsKIAkJCUJVRygpOwogCQl9CiAjZW5kaWYKQEAgLTI2OTYsMjAgKzI3NTMsMTkgQEAKIAlzcGluX2xvY2soJmwzLT5saXN0X2xvY2spOwogCWlmIChsMy0+c2hhcmVkKSB7CiAJCXN0cnVjdCBhcnJheV9jYWNoZSAqc2hhcmVkX2FycmF5ID0gbDMtPnNoYXJlZDsKLQkJaW50IG1heCA9IHNoYXJlZF9hcnJheS0+bGltaXQtc2hhcmVkX2FycmF5LT5hdmFpbDsKKwkJaW50IG1heCA9IHNoYXJlZF9hcnJheS0+bGltaXQgLSBzaGFyZWRfYXJyYXktPmF2YWlsOwogCQlpZiAobWF4KSB7CiAJCQlpZiAoYmF0Y2hjb3VudCA+IG1heCkKIAkJCQliYXRjaGNvdW50ID0gbWF4OwogCQkJbWVtY3B5KCYoc2hhcmVkX2FycmF5LT5lbnRyeVtzaGFyZWRfYXJyYXktPmF2YWlsXSksCi0JCQkJCWFjLT5lbnRyeSwKLQkJCQkJc2l6ZW9mKHZvaWQqKSpiYXRjaGNvdW50KTsKKwkJCSAgICAgICBhYy0+ZW50cnksIHNpemVvZih2b2lkICopICogYmF0Y2hjb3VudCk7CiAJCQlzaGFyZWRfYXJyYXktPmF2YWlsICs9IGJhdGNoY291bnQ7CiAJCQlnb3RvIGZyZWVfZG9uZTsKIAkJfQogCX0KIAogCWZyZWVfYmxvY2soY2FjaGVwLCBhYy0+ZW50cnksIGJhdGNoY291bnQsIG5vZGUpOwotZnJlZV9kb25lOgorICAgICAgZnJlZV9kb25lOgogI2lmIFNUQVRTCiAJewogCQlpbnQgaSA9IDA7CkBAIC0yNzMxLDEwICsyNzg3LDkgQEAKIAlzcGluX3VubG9jaygmbDMtPmxpc3RfbG9jayk7CiAJYWMtPmF2YWlsIC09IGJhdGNoY291bnQ7CiAJbWVtbW92ZShhYy0+ZW50cnksICYoYWMtPmVudHJ5W2JhdGNoY291bnRdKSwKLQkJCXNpemVvZih2b2lkKikqYWMtPmF2YWlsKTsKKwkJc2l6ZW9mKHZvaWQgKikgKiBhYy0+YXZhaWwpOwogfQogCi0KIC8qCiAgKiBfX2NhY2hlX2ZyZWUKICAqIFJlbGVhc2UgYW4gb2JqIGJhY2sgdG8gaXRzIGNhY2hlLiBJZiB0aGUgb2JqIGhhcyBhIGNvbnN0cnVjdGVkCkBAIC0yNzU5LDcgKzI4MTQsOCBAQAogCQlpZiAodW5saWtlbHkoc2xhYnAtPm5vZGVpZCAhPSBudW1hX25vZGVfaWQoKSkpIHsKIAkJCXN0cnVjdCBhcnJheV9jYWNoZSAqYWxpZW4gPSBOVUxMOwogCQkJaW50IG5vZGVpZCA9IHNsYWJwLT5ub2RlaWQ7Ci0JCQlzdHJ1Y3Qga21lbV9saXN0MyAqbDMgPSBjYWNoZXAtPm5vZGVsaXN0c1tudW1hX25vZGVfaWQoKV07CisJCQlzdHJ1Y3Qga21lbV9saXN0MyAqbDMgPQorCQkJICAgIGNhY2hlcC0+bm9kZWxpc3RzW251bWFfbm9kZV9pZCgpXTsKIAogCQkJU1RBVFNfSU5DX05PREVGUkVFUyhjYWNoZXApOwogCQkJaWYgKGwzLT5hbGllbiAmJiBsMy0+YWxpZW5bbm9kZWlkXSkgewpAQCAtMjc2NywxNSArMjgyMywxNSBAQAogCQkJCXNwaW5fbG9jaygmYWxpZW4tPmxvY2spOwogCQkJCWlmICh1bmxpa2VseShhbGllbi0+YXZhaWwgPT0gYWxpZW4tPmxpbWl0KSkKIAkJCQkJX19kcmFpbl9hbGllbl9jYWNoZShjYWNoZXAsCi0JCQkJCQkJYWxpZW4sIG5vZGVpZCk7CisJCQkJCQkJICAgIGFsaWVuLCBub2RlaWQpOwogCQkJCWFsaWVuLT5lbnRyeVthbGllbi0+YXZhaWwrK10gPSBvYmpwOwogCQkJCXNwaW5fdW5sb2NrKCZhbGllbi0+bG9jayk7CiAJCQl9IGVsc2UgewogCQkJCXNwaW5fbG9jaygmKGNhY2hlcC0+bm9kZWxpc3RzW25vZGVpZF0pLT4KLQkJCQkJCWxpc3RfbG9jayk7CisJCQkJCSAgbGlzdF9sb2NrKTsKIAkJCQlmcmVlX2Jsb2NrKGNhY2hlcCwgJm9ianAsIDEsIG5vZGVpZCk7CiAJCQkJc3Bpbl91bmxvY2soJihjYWNoZXAtPm5vZGVsaXN0c1tub2RlaWRdKS0+Ci0JCQkJCQlsaXN0X2xvY2spOworCQkJCQkgICAgbGlzdF9sb2NrKTsKIAkJCX0KIAkJCXJldHVybjsKIAkJfQpAQCAtMjgyMiw5ICsyODc4LDkgQEAKICAqLwogaW50IGZhc3RjYWxsIGttZW1fcHRyX3ZhbGlkYXRlKGttZW1fY2FjaGVfdCAqY2FjaGVwLCB2b2lkICpwdHIpCiB7Ci0JdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHB0cjsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZylwdHI7CiAJdW5zaWduZWQgbG9uZyBtaW5fYWRkciA9IFBBR0VfT0ZGU0VUOwotCXVuc2lnbmVkIGxvbmcgYWxpZ25fbWFzayA9IEJZVEVTX1BFUl9XT1JELTE7CisJdW5zaWduZWQgbG9uZyBhbGlnbl9tYXNrID0gQllURVNfUEVSX1dPUkQgLSAxOwogCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGNhY2hlcC0+b2Jqc2l6ZTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIApAQCAtMjg0NCw3ICsyOTAwLDcgQEAKIAlpZiAodW5saWtlbHkocGFnZV9nZXRfY2FjaGUocGFnZSkgIT0gY2FjaGVwKSkKIAkJZ290byBvdXQ7CiAJcmV0dXJuIDE7Ci1vdXQ6CisgICAgICBvdXQ6CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI4NzEsOCArMjkyNywxMCBAQAogCiAJaWYgKHVubGlrZWx5KCFjYWNoZXAtPm5vZGVsaXN0c1tub2RlaWRdKSkgewogCQkvKiBGYWxsIGJhY2sgdG8gX19jYWNoZV9hbGxvYyBpZiB3ZSBydW4gaW50byB0cm91YmxlICovCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgInNsYWI6IG5vdCBhbGxvY2F0aW5nIGluIGluYWN0aXZlIG5vZGUgJWQgZm9yIGNhY2hlICVzXG4iLCBub2RlaWQsIGNhY2hlcC0+bmFtZSk7Ci0JCXJldHVybiBfX2NhY2hlX2FsbG9jKGNhY2hlcCxmbGFncyk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJzbGFiOiBub3QgYWxsb2NhdGluZyBpbiBpbmFjdGl2ZSBub2RlICVkIGZvciBjYWNoZSAlc1xuIiwKKwkJICAgICAgIG5vZGVpZCwgY2FjaGVwLT5uYW1lKTsKKwkJcmV0dXJuIF9fY2FjaGVfYWxsb2MoY2FjaGVwLCBmbGFncyk7CiAJfQogCiAJY2FjaGVfYWxsb2NfZGVidWdjaGVja19iZWZvcmUoY2FjaGVwLCBmbGFncyk7CkBAIC0yODgyLDcgKzI5NDAsOSBAQAogCWVsc2UKIAkJcHRyID0gX19jYWNoZV9hbGxvY19ub2RlKGNhY2hlcCwgZmxhZ3MsIG5vZGVpZCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoc2F2ZV9mbGFncyk7Ci0JcHRyID0gY2FjaGVfYWxsb2NfZGVidWdjaGVja19hZnRlcihjYWNoZXAsIGZsYWdzLCBwdHIsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CisJcHRyID0KKwkgICAgY2FjaGVfYWxsb2NfZGVidWdjaGVja19hZnRlcihjYWNoZXAsIGZsYWdzLCBwdHIsCisJCQkJCSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogCiAJcmV0dXJuIHB0cjsKIH0KQEAgLTI5NDQsMTIgKzMwMDQsMTEgQEAKICAqIE9iamVjdHMgc2hvdWxkIGJlIGRlcmVmZXJlbmNlZCB1c2luZyB0aGUgcGVyX2NwdV9wdHIgbWFjcm8gb25seS4KICAqCiAgKiBAc2l6ZTogaG93IG1hbnkgYnl0ZXMgb2YgbWVtb3J5IGFyZSByZXF1aXJlZC4KLSAqIEBhbGlnbjogdGhlIGFsaWdubWVudCwgd2hpY2ggY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIFNNUF9DQUNIRV9CWVRFUy4KICAqLwotdm9pZCAqX19hbGxvY19wZXJjcHUoc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbikKK3ZvaWQgKl9fYWxsb2NfcGVyY3B1KHNpemVfdCBzaXplKQogewogCWludCBpOwotCXN0cnVjdCBwZXJjcHVfZGF0YSAqcGRhdGEgPSBrbWFsbG9jKHNpemVvZiAoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IHBlcmNwdV9kYXRhICpwZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOwogCiAJaWYgKCFwZGF0YSkKIAkJcmV0dXJuIE5VTEw7CkBAIC0yOTczLDkgKzMwMzIsOSBAQAogCX0KIAogCS8qIENhdGNoIGRlcmVmcyB3L28gd3JhcHBlcnMgKi8KLQlyZXR1cm4gKHZvaWQgKikgKH4odW5zaWduZWQgbG9uZykgcGRhdGEpOworCXJldHVybiAodm9pZCAqKSh+KHVuc2lnbmVkIGxvbmcpcGRhdGEpOwogCi11bndpbmRfb29tOgorICAgICAgdW53aW5kX29vbToKIAl3aGlsZSAoLS1pID49IDApIHsKIAkJaWYgKCFjcHVfcG9zc2libGUoaSkpCiAJCQljb250aW51ZTsKQEAgLTMwMDYsMjAgKzMwNjUsNiBAQAogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2ZyZWUpOwogCiAvKioKLSAqIGt6YWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkuIFRoZSBtZW1vcnkgaXMgc2V0IHRvIHplcm8uCi0gKiBAc2l6ZTogaG93IG1hbnkgYnl0ZXMgb2YgbWVtb3J5IGFyZSByZXF1aXJlZC4KLSAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlLgotICovCi12b2lkICpremFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKLXsKLQl2b2lkICpyZXQgPSBrbWFsbG9jKHNpemUsIGZsYWdzKTsKLQlpZiAocmV0KQotCQltZW1zZXQocmV0LCAwLCBzaXplKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChremFsbG9jKTsKLQotLyoqCiAgKiBrZnJlZSAtIGZyZWUgcHJldmlvdXNseSBhbGxvY2F0ZWQgbWVtb3J5CiAgKiBAb2JqcDogcG9pbnRlciByZXR1cm5lZCBieSBrbWFsbG9jLgogICoKQEAgLTMwMzgsNyArMzA4Myw4IEBACiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWtmcmVlX2RlYnVnY2hlY2sob2JqcCk7CiAJYyA9IHBhZ2VfZ2V0X2NhY2hlKHZpcnRfdG9fcGFnZShvYmpwKSk7Ci0JX19jYWNoZV9mcmVlKGMsICh2b2lkKilvYmpwKTsKKwltdXRleF9kZWJ1Z19jaGVja19ub19sb2Nrc19mcmVlZChvYmpwLCBvYmpfcmVhbGxlbihjKSk7CisJX19jYWNoZV9mcmVlKGMsICh2b2lkICopb2JqcCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTChrZnJlZSk7CkBAIC0zMDUxLDE3ICszMDk3LDE2IEBACiAgKiBEb24ndCBmcmVlIG1lbW9yeSBub3Qgb3JpZ2luYWxseSBhbGxvY2F0ZWQgYnkgYWxsb2NfcGVyY3B1KCkKICAqIFRoZSBjb21wbGVtZW50ZWQgb2JqcCBpcyB0byBjaGVjayBmb3IgdGhhdC4KICAqLwotdm9pZAotZnJlZV9wZXJjcHUoY29uc3Qgdm9pZCAqb2JqcCkKK3ZvaWQgZnJlZV9wZXJjcHUoY29uc3Qgdm9pZCAqb2JqcCkKIHsKIAlpbnQgaTsKLQlzdHJ1Y3QgcGVyY3B1X2RhdGEgKnAgPSAoc3RydWN0IHBlcmNwdV9kYXRhICopICh+KHVuc2lnbmVkIGxvbmcpIG9ianApOworCXN0cnVjdCBwZXJjcHVfZGF0YSAqcCA9IChzdHJ1Y3QgcGVyY3B1X2RhdGEgKikofih1bnNpZ25lZCBsb25nKW9ianApOwogCiAJLyoKIAkgKiBXZSBhbGxvY2F0ZSBmb3IgYWxsIGNwdXMgc28gd2UgY2Fubm90IHVzZSBmb3Igb25saW5lIGNwdSBoZXJlLgogCSAqLwogCWZvcl9lYWNoX2NwdShpKQotCQlrZnJlZShwLT5wdHJzW2ldKTsKKwkgICAga2ZyZWUocC0+cHRyc1tpXSk7CiAJa2ZyZWUocCk7CiB9CiBFWFBPUlRfU1lNQk9MKGZyZWVfcGVyY3B1KTsKQEAgLTMwOTUsNDQgKzMxNDAsNDQgQEAKIAkJaWYgKCEobmV3X2FsaWVuID0gYWxsb2NfYWxpZW5fY2FjaGUobm9kZSwgY2FjaGVwLT5saW1pdCkpKQogCQkJZ290byBmYWlsOwogI2VuZGlmCi0JCWlmICghKG5ldyA9IGFsbG9jX2FycmF5Y2FjaGUobm9kZSwgKGNhY2hlcC0+c2hhcmVkKgotCQkJCWNhY2hlcC0+YmF0Y2hjb3VudCksIDB4YmFhZGYwMGQpKSkKKwkJaWYgKCEobmV3ID0gYWxsb2NfYXJyYXljYWNoZShub2RlLCAoY2FjaGVwLT5zaGFyZWQgKgorCQkJCQkJICAgIGNhY2hlcC0+YmF0Y2hjb3VudCksCisJCQkJCSAgICAgMHhiYWFkZjAwZCkpKQogCQkJZ290byBmYWlsOwogCQlpZiAoKGwzID0gY2FjaGVwLT5ub2RlbGlzdHNbbm9kZV0pKSB7CiAKIAkJCXNwaW5fbG9ja19pcnEoJmwzLT5saXN0X2xvY2spOwogCiAJCQlpZiAoKG5jID0gY2FjaGVwLT5ub2RlbGlzdHNbbm9kZV0tPnNoYXJlZCkpCi0JCQkJZnJlZV9ibG9jayhjYWNoZXAsIG5jLT5lbnRyeSwKLQkJCQkJCQluYy0+YXZhaWwsIG5vZGUpOworCQkJCWZyZWVfYmxvY2soY2FjaGVwLCBuYy0+ZW50cnksIG5jLT5hdmFpbCwgbm9kZSk7CiAKIAkJCWwzLT5zaGFyZWQgPSBuZXc7CiAJCQlpZiAoIWNhY2hlcC0+bm9kZWxpc3RzW25vZGVdLT5hbGllbikgewogCQkJCWwzLT5hbGllbiA9IG5ld19hbGllbjsKIAkJCQluZXdfYWxpZW4gPSBOVUxMOwogCQkJfQotCQkJbDMtPmZyZWVfbGltaXQgPSAoMSArIG5yX2NwdXNfbm9kZShub2RlKSkqCi0JCQkJY2FjaGVwLT5iYXRjaGNvdW50ICsgY2FjaGVwLT5udW07CisJCQlsMy0+ZnJlZV9saW1pdCA9ICgxICsgbnJfY3B1c19ub2RlKG5vZGUpKSAqCisJCQkgICAgY2FjaGVwLT5iYXRjaGNvdW50ICsgY2FjaGVwLT5udW07CiAJCQlzcGluX3VubG9ja19pcnEoJmwzLT5saXN0X2xvY2spOwogCQkJa2ZyZWUobmMpOwogCQkJZnJlZV9hbGllbl9jYWNoZShuZXdfYWxpZW4pOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKCEobDMgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBrbWVtX2xpc3QzKSwKLQkJCQkJCUdGUF9LRVJORUwsIG5vZGUpKSkKKwkJCQkJR0ZQX0tFUk5FTCwgbm9kZSkpKQogCQkJZ290byBmYWlsOwogCiAJCWttZW1fbGlzdDNfaW5pdChsMyk7CiAJCWwzLT5uZXh0X3JlYXAgPSBqaWZmaWVzICsgUkVBUFRJTUVPVVRfTElTVDMgKwotCQkJKCh1bnNpZ25lZCBsb25nKWNhY2hlcCklUkVBUFRJTUVPVVRfTElTVDM7CisJCSAgICAoKHVuc2lnbmVkIGxvbmcpY2FjaGVwKSAlIFJFQVBUSU1FT1VUX0xJU1QzOwogCQlsMy0+c2hhcmVkID0gbmV3OwogCQlsMy0+YWxpZW4gPSBuZXdfYWxpZW47Ci0JCWwzLT5mcmVlX2xpbWl0ID0gKDEgKyBucl9jcHVzX25vZGUobm9kZSkpKgotCQkJY2FjaGVwLT5iYXRjaGNvdW50ICsgY2FjaGVwLT5udW07CisJCWwzLT5mcmVlX2xpbWl0ID0gKDEgKyBucl9jcHVzX25vZGUobm9kZSkpICoKKwkJICAgIGNhY2hlcC0+YmF0Y2hjb3VudCArIGNhY2hlcC0+bnVtOwogCQljYWNoZXAtPm5vZGVsaXN0c1tub2RlXSA9IGwzOwogCX0KIAlyZXR1cm4gZXJyOwotZmFpbDoKKyAgICAgIGZhaWw6CiAJZXJyID0gLUVOT01FTTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMzE1NCwxOCArMzE5OSwxOSBAQAogCW5ldy0+bmV3W3NtcF9wcm9jZXNzb3JfaWQoKV0gPSBvbGQ7CiB9CiAKLQogc3RhdGljIGludCBkb190dW5lX2NwdWNhY2hlKGttZW1fY2FjaGVfdCAqY2FjaGVwLCBpbnQgbGltaXQsIGludCBiYXRjaGNvdW50LAotCQkJCWludCBzaGFyZWQpCisJCQkgICAgaW50IHNoYXJlZCkKIHsKIAlzdHJ1Y3QgY2N1cGRhdGVfc3RydWN0IG5ldzsKIAlpbnQgaSwgZXJyOwogCi0JbWVtc2V0KCZuZXcubmV3LDAsc2l6ZW9mKG5ldy5uZXcpKTsKKwltZW1zZXQoJm5ldy5uZXcsIDAsIHNpemVvZihuZXcubmV3KSk7CiAJZm9yX2VhY2hfb25saW5lX2NwdShpKSB7Ci0JCW5ldy5uZXdbaV0gPSBhbGxvY19hcnJheWNhY2hlKGNwdV90b19ub2RlKGkpLCBsaW1pdCwgYmF0Y2hjb3VudCk7CisJCW5ldy5uZXdbaV0gPQorCQkgICAgYWxsb2NfYXJyYXljYWNoZShjcHVfdG9fbm9kZShpKSwgbGltaXQsIGJhdGNoY291bnQpOwogCQlpZiAoIW5ldy5uZXdbaV0pIHsKLQkJCWZvciAoaS0tOyBpID49IDA7IGktLSkga2ZyZWUobmV3Lm5ld1tpXSk7CisJCQlmb3IgKGktLTsgaSA+PSAwOyBpLS0pCisJCQkJa2ZyZWUobmV3Lm5ld1tpXSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KQEAgLTMxOTMsMTMgKzMyMzksMTIgQEAKIAllcnIgPSBhbGxvY19rbWVtbGlzdChjYWNoZXApOwogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJhbGxvY19rbWVtbGlzdCBmYWlsZWQgZm9yICVzLCBlcnJvciAlZC5cbiIsCi0JCQkJY2FjaGVwLT5uYW1lLCAtZXJyKTsKKwkJICAgICAgIGNhY2hlcC0+bmFtZSwgLWVycik7CiAJCUJVRygpOwogCX0KIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgdm9pZCBlbmFibGVfY3B1Y2FjaGUoa21lbV9jYWNoZV90ICpjYWNoZXApCiB7CiAJaW50IGVycjsKQEAgLTMyNDYsMTQgKzMyOTEsMTQgQEAKIAlpZiAobGltaXQgPiAzMikKIAkJbGltaXQgPSAzMjsKICNlbmRpZgotCWVyciA9IGRvX3R1bmVfY3B1Y2FjaGUoY2FjaGVwLCBsaW1pdCwgKGxpbWl0KzEpLzIsIHNoYXJlZCk7CisJZXJyID0gZG9fdHVuZV9jcHVjYWNoZShjYWNoZXAsIGxpbWl0LCAobGltaXQgKyAxKSAvIDIsIHNoYXJlZCk7CiAJaWYgKGVycikKIAkJcHJpbnRrKEtFUk5fRVJSICJlbmFibGVfY3B1Y2FjaGUgZmFpbGVkIGZvciAlcywgZXJyb3IgJWQuXG4iLAotCQkJCQljYWNoZXAtPm5hbWUsIC1lcnIpOworCQkgICAgICAgY2FjaGVwLT5uYW1lLCAtZXJyKTsKIH0KIAotc3RhdGljIHZvaWQgZHJhaW5fYXJyYXlfbG9ja2VkKGttZW1fY2FjaGVfdCAqY2FjaGVwLAotCQkJCXN0cnVjdCBhcnJheV9jYWNoZSAqYWMsIGludCBmb3JjZSwgaW50IG5vZGUpCitzdGF0aWMgdm9pZCBkcmFpbl9hcnJheV9sb2NrZWQoa21lbV9jYWNoZV90ICpjYWNoZXAsIHN0cnVjdCBhcnJheV9jYWNoZSAqYWMsCisJCQkJaW50IGZvcmNlLCBpbnQgbm9kZSkKIHsKIAlpbnQgdG9mcmVlOwogCkBAIC0zMjYxLDE0ICszMzA2LDE0IEBACiAJaWYgKGFjLT50b3VjaGVkICYmICFmb3JjZSkgewogCQlhYy0+dG91Y2hlZCA9IDA7CiAJfSBlbHNlIGlmIChhYy0+YXZhaWwpIHsKLQkJdG9mcmVlID0gZm9yY2UgPyBhYy0+YXZhaWwgOiAoYWMtPmxpbWl0KzQpLzU7CisJCXRvZnJlZSA9IGZvcmNlID8gYWMtPmF2YWlsIDogKGFjLT5saW1pdCArIDQpIC8gNTsKIAkJaWYgKHRvZnJlZSA+IGFjLT5hdmFpbCkgewotCQkJdG9mcmVlID0gKGFjLT5hdmFpbCsxKS8yOworCQkJdG9mcmVlID0gKGFjLT5hdmFpbCArIDEpIC8gMjsKIAkJfQogCQlmcmVlX2Jsb2NrKGNhY2hlcCwgYWMtPmVudHJ5LCB0b2ZyZWUsIG5vZGUpOwogCQlhYy0+YXZhaWwgLT0gdG9mcmVlOwogCQltZW1tb3ZlKGFjLT5lbnRyeSwgJihhYy0+ZW50cnlbdG9mcmVlXSksCi0JCQkJCXNpemVvZih2b2lkKikqYWMtPmF2YWlsKTsKKwkJCXNpemVvZih2b2lkICopICogYWMtPmF2YWlsKTsKIAl9CiB9CiAKQEAgLTMyODEsNyArMzMyNiw3IEBACiAgKiAtIGNsZWFyIHRoZSBwZXItY3B1IGNhY2hlcyBmb3IgdGhpcyBDUFUuCiAgKiAtIHJldHVybiBmcmVlYWJsZSBwYWdlcyB0byB0aGUgbWFpbiBmcmVlIG1lbW9yeSBwb29sLgogICoKLSAqIElmIHdlIGNhbm5vdCBhY3F1aXJlIHRoZSBjYWNoZSBjaGFpbiBzZW1hcGhvcmUgdGhlbiBqdXN0IGdpdmUgdXAgLSB3ZSdsbAorICogSWYgd2UgY2Fubm90IGFjcXVpcmUgdGhlIGNhY2hlIGNoYWluIG11dGV4IHRoZW4ganVzdCBnaXZlIHVwIC0gd2UnbGwKICAqIHRyeSBhZ2FpbiBvbiB0aGUgbmV4dCBpdGVyYXRpb24uCiAgKi8KIHN0YXRpYyB2b2lkIGNhY2hlX3JlYXAodm9pZCAqdW51c2VkKQpAQCAtMzI4OSwxNSArMzMzNCwxNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKndhbGs7CiAJc3RydWN0IGttZW1fbGlzdDMgKmwzOwogCi0JaWYgKGRvd25fdHJ5bG9jaygmY2FjaGVfY2hhaW5fc2VtKSkgeworCWlmICghbXV0ZXhfdHJ5bG9jaygmY2FjaGVfY2hhaW5fbXV0ZXgpKSB7CiAJCS8qIEdpdmUgdXAuIFNldHVwIHRoZSBuZXh0IGl0ZXJhdGlvbi4gKi8KLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZfX2dldF9jcHVfdmFyKHJlYXBfd29yayksIFJFQVBUSU1FT1VUX0NQVUMpOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJl9fZ2V0X2NwdV92YXIocmVhcF93b3JrKSwKKwkJCQkgICAgICBSRUFQVElNRU9VVF9DUFVDKTsKIAkJcmV0dXJuOwogCX0KIAogCWxpc3RfZm9yX2VhY2god2FsaywgJmNhY2hlX2NoYWluKSB7CiAJCWttZW1fY2FjaGVfdCAqc2VhcmNocDsKLQkJc3RydWN0IGxpc3RfaGVhZCogcDsKKwkJc3RydWN0IGxpc3RfaGVhZCAqcDsKIAkJaW50IHRvZnJlZTsKIAkJc3RydWN0IHNsYWIgKnNsYWJwOwogCkBAIC0zMzE0LDcgKzMzNjAsNyBAQAogCQlzcGluX2xvY2tfaXJxKCZsMy0+bGlzdF9sb2NrKTsKIAogCQlkcmFpbl9hcnJheV9sb2NrZWQoc2VhcmNocCwgYWNfZGF0YShzZWFyY2hwKSwgMCwKLQkJCQludW1hX25vZGVfaWQoKSk7CisJCQkJICAgbnVtYV9ub2RlX2lkKCkpOwogCiAJCWlmICh0aW1lX2FmdGVyKGwzLT5uZXh0X3JlYXAsIGppZmZpZXMpKQogCQkJZ290byBuZXh0X3VubG9jazsKQEAgLTMzMjMsMTQgKzMzNjksMTYgQEAKIAogCQlpZiAobDMtPnNoYXJlZCkKIAkJCWRyYWluX2FycmF5X2xvY2tlZChzZWFyY2hwLCBsMy0+c2hhcmVkLCAwLAotCQkJCW51bWFfbm9kZV9pZCgpKTsKKwkJCQkJICAgbnVtYV9ub2RlX2lkKCkpOwogCiAJCWlmIChsMy0+ZnJlZV90b3VjaGVkKSB7CiAJCQlsMy0+ZnJlZV90b3VjaGVkID0gMDsKIAkJCWdvdG8gbmV4dF91bmxvY2s7CiAJCX0KIAotCQl0b2ZyZWUgPSAobDMtPmZyZWVfbGltaXQrNSpzZWFyY2hwLT5udW0tMSkvKDUqc2VhcmNocC0+bnVtKTsKKwkJdG9mcmVlID0KKwkJICAgIChsMy0+ZnJlZV9saW1pdCArIDUgKiBzZWFyY2hwLT5udW0gLQorCQkgICAgIDEpIC8gKDUgKiBzZWFyY2hwLT5udW0pOwogCQlkbyB7CiAJCQlwID0gbDMtPnNsYWJzX2ZyZWUubmV4dDsKIAkJCWlmIChwID09ICYobDMtPnNsYWJzX2ZyZWUpKQpAQCAtMzM1MCwxNCArMzM5OCwxNCBAQAogCQkJc3Bpbl91bmxvY2tfaXJxKCZsMy0+bGlzdF9sb2NrKTsKIAkJCXNsYWJfZGVzdHJveShzZWFyY2hwLCBzbGFicCk7CiAJCQlzcGluX2xvY2tfaXJxKCZsMy0+bGlzdF9sb2NrKTsKLQkJfSB3aGlsZSgtLXRvZnJlZSA+IDApOwotbmV4dF91bmxvY2s6CisJCX0gd2hpbGUgKC0tdG9mcmVlID4gMCk7CisJICAgICAgbmV4dF91bmxvY2s6CiAJCXNwaW5fdW5sb2NrX2lycSgmbDMtPmxpc3RfbG9jayk7Ci1uZXh0OgorCSAgICAgIG5leHQ6CiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KIAljaGVja19pcnFfb24oKTsKLQl1cCgmY2FjaGVfY2hhaW5fc2VtKTsKKwltdXRleF91bmxvY2soJmNhY2hlX2NoYWluX211dGV4KTsKIAlkcmFpbl9yZW1vdGVfcGFnZXMoKTsKIAkvKiBTZXR1cCB0aGUgbmV4dCBpdGVyYXRpb24gKi8KIAlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJl9fZ2V0X2NwdV92YXIocmVhcF93b3JrKSwgUkVBUFRJTUVPVVRfQ1BVQyk7CkBAIC0zMzY1LDMyICszNDEzLDM3IEBACiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogCitzdGF0aWMgdm9pZCBwcmludF9zbGFiaW5mb19oZWFkZXIoc3RydWN0IHNlcV9maWxlICptKQoreworCS8qCisJICogT3V0cHV0IGZvcm1hdCB2ZXJzaW9uLCBzbyBhdCBsZWFzdCB3ZSBjYW4gY2hhbmdlIGl0CisJICogd2l0aG91dCBfdG9vXyBtYW55IGNvbXBsYWludHMuCisJICovCisjaWYgU1RBVFMKKwlzZXFfcHV0cyhtLCAic2xhYmluZm8gLSB2ZXJzaW9uOiAyLjEgKHN0YXRpc3RpY3MpXG4iKTsKKyNlbHNlCisJc2VxX3B1dHMobSwgInNsYWJpbmZvIC0gdmVyc2lvbjogMi4xXG4iKTsKKyNlbmRpZgorCXNlcV9wdXRzKG0sICIjIG5hbWUgICAgICAgICAgICA8YWN0aXZlX29ianM+IDxudW1fb2Jqcz4gPG9ianNpemU+ICIKKwkJICI8b2JqcGVyc2xhYj4gPHBhZ2VzcGVyc2xhYj4iKTsKKwlzZXFfcHV0cyhtLCAiIDogdHVuYWJsZXMgPGxpbWl0PiA8YmF0Y2hjb3VudD4gPHNoYXJlZGZhY3Rvcj4iKTsKKwlzZXFfcHV0cyhtLCAiIDogc2xhYmRhdGEgPGFjdGl2ZV9zbGFicz4gPG51bV9zbGFicz4gPHNoYXJlZGF2YWlsPiIpOworI2lmIFNUQVRTCisJc2VxX3B1dHMobSwgIiA6IGdsb2JhbHN0YXQgPGxpc3RhbGxvY3M+IDxtYXhvYmpzPiA8Z3Jvd24+IDxyZWFwZWQ+ICIKKwkJICI8ZXJyb3I+IDxtYXhmcmVlYWJsZT4gPG5vZGVhbGxvY3M+IDxyZW1vdGVmcmVlcz4iKTsKKwlzZXFfcHV0cyhtLCAiIDogY3B1c3RhdCA8YWxsb2NoaXQ+IDxhbGxvY21pc3M+IDxmcmVlaGl0PiA8ZnJlZW1pc3M+Iik7CisjZW5kaWYKKwlzZXFfcHV0YyhtLCAnXG4nKTsKK30KKwogc3RhdGljIHZvaWQgKnNfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKIHsKIAlsb2ZmX3QgbiA9ICpwb3M7CiAJc3RydWN0IGxpc3RfaGVhZCAqcDsKIAotCWRvd24oJmNhY2hlX2NoYWluX3NlbSk7Ci0JaWYgKCFuKSB7Ci0JCS8qCi0JCSAqIE91dHB1dCBmb3JtYXQgdmVyc2lvbiwgc28gYXQgbGVhc3Qgd2UgY2FuIGNoYW5nZSBpdAotCQkgKiB3aXRob3V0IF90b29fIG1hbnkgY29tcGxhaW50cy4KLQkJICovCi0jaWYgU1RBVFMKLQkJc2VxX3B1dHMobSwgInNsYWJpbmZvIC0gdmVyc2lvbjogMi4xIChzdGF0aXN0aWNzKVxuIik7Ci0jZWxzZQotCQlzZXFfcHV0cyhtLCAic2xhYmluZm8gLSB2ZXJzaW9uOiAyLjFcbiIpOwotI2VuZGlmCi0JCXNlcV9wdXRzKG0sICIjIG5hbWUgICAgICAgICAgICA8YWN0aXZlX29ianM+IDxudW1fb2Jqcz4gPG9ianNpemU+IDxvYmpwZXJzbGFiPiA8cGFnZXNwZXJzbGFiPiIpOwotCQlzZXFfcHV0cyhtLCAiIDogdHVuYWJsZXMgPGxpbWl0PiA8YmF0Y2hjb3VudD4gPHNoYXJlZGZhY3Rvcj4iKTsKLQkJc2VxX3B1dHMobSwgIiA6IHNsYWJkYXRhIDxhY3RpdmVfc2xhYnM+IDxudW1fc2xhYnM+IDxzaGFyZWRhdmFpbD4iKTsKLSNpZiBTVEFUUwotCQlzZXFfcHV0cyhtLCAiIDogZ2xvYmFsc3RhdCA8bGlzdGFsbG9jcz4gPG1heG9ianM+IDxncm93bj4gPHJlYXBlZD4iCi0JCQkJIiA8ZXJyb3I+IDxtYXhmcmVlYWJsZT4gPG5vZGVhbGxvY3M+IDxyZW1vdGVmcmVlcz4iKTsKLQkJc2VxX3B1dHMobSwgIiA6IGNwdXN0YXQgPGFsbG9jaGl0PiA8YWxsb2NtaXNzPiA8ZnJlZWhpdD4gPGZyZWVtaXNzPiIpOwotI2VuZGlmCi0JCXNlcV9wdXRjKG0sICdcbicpOwotCX0KKwltdXRleF9sb2NrKCZjYWNoZV9jaGFpbl9tdXRleCk7CisJaWYgKCFuKQorCQlwcmludF9zbGFiaW5mb19oZWFkZXIobSk7CiAJcCA9IGNhY2hlX2NoYWluLm5leHQ7CiAJd2hpbGUgKG4tLSkgewogCQlwID0gcC0+bmV4dDsKQEAgLTM0MDUsMjMgKzM0NTgsMjMgQEAKIAlrbWVtX2NhY2hlX3QgKmNhY2hlcCA9IHA7CiAJKysqcG9zOwogCXJldHVybiBjYWNoZXAtPm5leHQubmV4dCA9PSAmY2FjaGVfY2hhaW4gPyBOVUxMCi0JCTogbGlzdF9lbnRyeShjYWNoZXAtPm5leHQubmV4dCwga21lbV9jYWNoZV90LCBuZXh0KTsKKwkgICAgOiBsaXN0X2VudHJ5KGNhY2hlcC0+bmV4dC5uZXh0LCBrbWVtX2NhY2hlX3QsIG5leHQpOwogfQogCiBzdGF0aWMgdm9pZCBzX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQogewotCXVwKCZjYWNoZV9jaGFpbl9zZW0pOworCW11dGV4X3VubG9jaygmY2FjaGVfY2hhaW5fbXV0ZXgpOwogfQogCiBzdGF0aWMgaW50IHNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnApCiB7CiAJa21lbV9jYWNoZV90ICpjYWNoZXAgPSBwOwogCXN0cnVjdCBsaXN0X2hlYWQgKnE7Ci0Jc3RydWN0IHNsYWIJKnNsYWJwOwotCXVuc2lnbmVkIGxvbmcJYWN0aXZlX29ianM7Ci0JdW5zaWduZWQgbG9uZwludW1fb2JqczsKLQl1bnNpZ25lZCBsb25nCWFjdGl2ZV9zbGFicyA9IDA7Ci0JdW5zaWduZWQgbG9uZwludW1fc2xhYnMsIGZyZWVfb2JqZWN0cyA9IDAsIHNoYXJlZF9hdmFpbCA9IDA7CisJc3RydWN0IHNsYWIgKnNsYWJwOworCXVuc2lnbmVkIGxvbmcgYWN0aXZlX29ianM7CisJdW5zaWduZWQgbG9uZyBudW1fb2JqczsKKwl1bnNpZ25lZCBsb25nIGFjdGl2ZV9zbGFicyA9IDA7CisJdW5zaWduZWQgbG9uZyBudW1fc2xhYnMsIGZyZWVfb2JqZWN0cyA9IDAsIHNoYXJlZF9hdmFpbCA9IDA7CiAJY29uc3QgY2hhciAqbmFtZTsKIAljaGFyICplcnJvciA9IE5VTEw7CiAJaW50IG5vZGU7CkBAIC0zNDM4LDE0ICszNDkxLDE0IEBACiAKIAkJc3Bpbl9sb2NrKCZsMy0+bGlzdF9sb2NrKTsKIAotCQlsaXN0X2Zvcl9lYWNoKHEsJmwzLT5zbGFic19mdWxsKSB7CisJCWxpc3RfZm9yX2VhY2gocSwgJmwzLT5zbGFic19mdWxsKSB7CiAJCQlzbGFicCA9IGxpc3RfZW50cnkocSwgc3RydWN0IHNsYWIsIGxpc3QpOwogCQkJaWYgKHNsYWJwLT5pbnVzZSAhPSBjYWNoZXAtPm51bSAmJiAhZXJyb3IpCiAJCQkJZXJyb3IgPSAic2xhYnNfZnVsbCBhY2NvdW50aW5nIGVycm9yIjsKIAkJCWFjdGl2ZV9vYmpzICs9IGNhY2hlcC0+bnVtOwogCQkJYWN0aXZlX3NsYWJzKys7CiAJCX0KLQkJbGlzdF9mb3JfZWFjaChxLCZsMy0+c2xhYnNfcGFydGlhbCkgeworCQlsaXN0X2Zvcl9lYWNoKHEsICZsMy0+c2xhYnNfcGFydGlhbCkgewogCQkJc2xhYnAgPSBsaXN0X2VudHJ5KHEsIHN0cnVjdCBzbGFiLCBsaXN0KTsKIAkJCWlmIChzbGFicC0+aW51c2UgPT0gY2FjaGVwLT5udW0gJiYgIWVycm9yKQogCQkJCWVycm9yID0gInNsYWJzX3BhcnRpYWwgaW51c2UgYWNjb3VudGluZyBlcnJvciI7CkBAIC0zNDU0LDcgKzM1MDcsNyBAQAogCQkJYWN0aXZlX29ianMgKz0gc2xhYnAtPmludXNlOwogCQkJYWN0aXZlX3NsYWJzKys7CiAJCX0KLQkJbGlzdF9mb3JfZWFjaChxLCZsMy0+c2xhYnNfZnJlZSkgeworCQlsaXN0X2Zvcl9lYWNoKHEsICZsMy0+c2xhYnNfZnJlZSkgewogCQkJc2xhYnAgPSBsaXN0X2VudHJ5KHEsIHN0cnVjdCBzbGFiLCBsaXN0KTsKIAkJCWlmIChzbGFicC0+aW51c2UgJiYgIWVycm9yKQogCQkJCWVycm9yID0gInNsYWJzX2ZyZWUvaW51c2UgYWNjb3VudGluZyBlcnJvciI7CkBAIC0zNDY1LDI1ICszNTE4LDI0IEBACiAKIAkJc3Bpbl91bmxvY2soJmwzLT5saXN0X2xvY2spOwogCX0KLQludW1fc2xhYnMrPWFjdGl2ZV9zbGFiczsKLQludW1fb2JqcyA9IG51bV9zbGFicypjYWNoZXAtPm51bTsKKwludW1fc2xhYnMgKz0gYWN0aXZlX3NsYWJzOworCW51bV9vYmpzID0gbnVtX3NsYWJzICogY2FjaGVwLT5udW07CiAJaWYgKG51bV9vYmpzIC0gYWN0aXZlX29ianMgIT0gZnJlZV9vYmplY3RzICYmICFlcnJvcikKIAkJZXJyb3IgPSAiZnJlZV9vYmplY3RzIGFjY291bnRpbmcgZXJyb3IiOwogCi0JbmFtZSA9IGNhY2hlcC0+bmFtZTsgCisJbmFtZSA9IGNhY2hlcC0+bmFtZTsKIAlpZiAoZXJyb3IpCiAJCXByaW50ayhLRVJOX0VSUiAic2xhYjogY2FjaGUgJXMgZXJyb3I6ICVzXG4iLCBuYW1lLCBlcnJvcik7CiAKIAlzZXFfcHJpbnRmKG0sICIlLTE3cyAlNmx1ICU2bHUgJTZ1ICU0dSAlNGQiLAotCQluYW1lLCBhY3RpdmVfb2JqcywgbnVtX29ianMsIGNhY2hlcC0+b2Jqc2l6ZSwKLQkJY2FjaGVwLT5udW0sICgxPDxjYWNoZXAtPmdmcG9yZGVyKSk7CisJCSAgIG5hbWUsIGFjdGl2ZV9vYmpzLCBudW1fb2JqcywgY2FjaGVwLT5vYmpzaXplLAorCQkgICBjYWNoZXAtPm51bSwgKDEgPDwgY2FjaGVwLT5nZnBvcmRlcikpOwogCXNlcV9wcmludGYobSwgIiA6IHR1bmFibGVzICU0dSAlNHUgJTR1IiwKLQkJCWNhY2hlcC0+bGltaXQsIGNhY2hlcC0+YmF0Y2hjb3VudCwKLQkJCWNhY2hlcC0+c2hhcmVkKTsKKwkJICAgY2FjaGVwLT5saW1pdCwgY2FjaGVwLT5iYXRjaGNvdW50LCBjYWNoZXAtPnNoYXJlZCk7CiAJc2VxX3ByaW50ZihtLCAiIDogc2xhYmRhdGEgJTZsdSAlNmx1ICU2bHUiLAotCQkJYWN0aXZlX3NsYWJzLCBudW1fc2xhYnMsIHNoYXJlZF9hdmFpbCk7CisJCSAgIGFjdGl2ZV9zbGFicywgbnVtX3NsYWJzLCBzaGFyZWRfYXZhaWwpOwogI2lmIFNUQVRTCi0JewkvKiBsaXN0MyBzdGF0cyAqLworCXsJCQkvKiBsaXN0MyBzdGF0cyAqLwogCQl1bnNpZ25lZCBsb25nIGhpZ2ggPSBjYWNoZXAtPmhpZ2hfbWFyazsKIAkJdW5zaWduZWQgbG9uZyBhbGxvY3MgPSBjYWNoZXAtPm51bV9hbGxvY2F0aW9uczsKIAkJdW5zaWduZWQgbG9uZyBncm93biA9IGNhY2hlcC0+Z3Jvd247CkBAIC0zNDk0LDkgKzM1NDYsNyBAQAogCQl1bnNpZ25lZCBsb25nIG5vZGVfZnJlZXMgPSBjYWNoZXAtPm5vZGVfZnJlZXM7CiAKIAkJc2VxX3ByaW50ZihtLCAiIDogZ2xvYmFsc3RhdCAlN2x1ICU2bHUgJTVsdSAlNGx1IFwKLQkJCQklNGx1ICU0bHUgJTRsdSAlNGx1IiwKLQkJCQlhbGxvY3MsIGhpZ2gsIGdyb3duLCByZWFwZWQsIGVycm9ycywKLQkJCQltYXhfZnJlZWFibGUsIG5vZGVfYWxsb2NzLCBub2RlX2ZyZWVzKTsKKwkJCQklNGx1ICU0bHUgJTRsdSAlNGx1IiwgYWxsb2NzLCBoaWdoLCBncm93biwgcmVhcGVkLCBlcnJvcnMsIG1heF9mcmVlYWJsZSwgbm9kZV9hbGxvY3MsIG5vZGVfZnJlZXMpOwogCX0KIAkvKiBjcHUgc3RhdHMgKi8KIAl7CkBAIC0zNTA2LDcgKzM1NTYsNyBAQAogCQl1bnNpZ25lZCBsb25nIGZyZWVtaXNzID0gYXRvbWljX3JlYWQoJmNhY2hlcC0+ZnJlZW1pc3MpOwogCiAJCXNlcV9wcmludGYobSwgIiA6IGNwdXN0YXQgJTZsdSAlNmx1ICU2bHUgJTZsdSIsCi0JCQlhbGxvY2hpdCwgYWxsb2NtaXNzLCBmcmVlaGl0LCBmcmVlbWlzcyk7CisJCQkgICBhbGxvY2hpdCwgYWxsb2NtaXNzLCBmcmVlaGl0LCBmcmVlbWlzcyk7CiAJfQogI2VuZGlmCiAJc2VxX3B1dGMobSwgJ1xuJyk7CkBAIC0zNTI5LDEwICszNTc5LDEwIEBACiAgKi8KIAogc3RydWN0IHNlcV9vcGVyYXRpb25zIHNsYWJpbmZvX29wID0gewotCS5zdGFydAk9IHNfc3RhcnQsCi0JLm5leHQJPSBzX25leHQsCi0JLnN0b3AJPSBzX3N0b3AsCi0JLnNob3cJPSBzX3Nob3csCisJLnN0YXJ0ID0gc19zdGFydCwKKwkubmV4dCA9IHNfbmV4dCwKKwkuc3RvcCA9IHNfc3RvcCwKKwkuc2hvdyA9IHNfc2hvdywKIH07CiAKICNkZWZpbmUgTUFYX1NMQUJJTkZPX1dSSVRFIDEyOApAQCAtMzU0MywxOCArMzU5MywxOCBAQAogICogQGNvdW50OiBkYXRhIGxlbmd0aAogICogQHBwb3M6IHVudXNlZAogICovCi1zc2l6ZV90IHNsYWJpbmZvX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQorc3NpemVfdCBzbGFiaW5mb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQljaGFyIGtidWZbTUFYX1NMQUJJTkZPX1dSSVRFKzFdLCAqdG1wOworCWNoYXIga2J1ZltNQVhfU0xBQklORk9fV1JJVEUgKyAxXSwgKnRtcDsKIAlpbnQgbGltaXQsIGJhdGNoY291bnQsIHNoYXJlZCwgcmVzOwogCXN0cnVjdCBsaXN0X2hlYWQgKnA7Ci0JCisKIAlpZiAoY291bnQgPiBNQVhfU0xBQklORk9fV1JJVEUpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChjb3B5X2Zyb21fdXNlcigma2J1ZiwgYnVmZmVyLCBjb3VudCkpCiAJCXJldHVybiAtRUZBVUxUOwotCWtidWZbTUFYX1NMQUJJTkZPX1dSSVRFXSA9ICdcMCc7IAorCWtidWZbTUFYX1NMQUJJTkZPX1dSSVRFXSA9ICdcMCc7CiAKIAl0bXAgPSBzdHJjaHIoa2J1ZiwgJyAnKTsKIAlpZiAoIXRtcCkKQEAgLTM1NjUsMjUgKzM2MTUsMjQgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBGaW5kIHRoZSBjYWNoZSBpbiB0aGUgY2hhaW4gb2YgY2FjaGVzLiAqLwotCWRvd24oJmNhY2hlX2NoYWluX3NlbSk7CisJbXV0ZXhfbG9jaygmY2FjaGVfY2hhaW5fbXV0ZXgpOwogCXJlcyA9IC1FSU5WQUw7Ci0JbGlzdF9mb3JfZWFjaChwLCZjYWNoZV9jaGFpbikgeworCWxpc3RfZm9yX2VhY2gocCwgJmNhY2hlX2NoYWluKSB7CiAJCWttZW1fY2FjaGVfdCAqY2FjaGVwID0gbGlzdF9lbnRyeShwLCBrbWVtX2NhY2hlX3QsIG5leHQpOwogCiAJCWlmICghc3RyY21wKGNhY2hlcC0+bmFtZSwga2J1ZikpIHsKIAkJCWlmIChsaW1pdCA8IDEgfHwKIAkJCSAgICBiYXRjaGNvdW50IDwgMSB8fAotCQkJICAgIGJhdGNoY291bnQgPiBsaW1pdCB8fAotCQkJICAgIHNoYXJlZCA8IDApIHsKKwkJCSAgICBiYXRjaGNvdW50ID4gbGltaXQgfHwgc2hhcmVkIDwgMCkgewogCQkJCXJlcyA9IDA7CiAJCQl9IGVsc2UgewogCQkJCXJlcyA9IGRvX3R1bmVfY3B1Y2FjaGUoY2FjaGVwLCBsaW1pdCwKLQkJCQkJCQliYXRjaGNvdW50LCBzaGFyZWQpOworCQkJCQkJICAgICAgIGJhdGNoY291bnQsIHNoYXJlZCk7CiAJCQl9CiAJCQlicmVhazsKIAkJfQogCX0KLQl1cCgmY2FjaGVfY2hhaW5fc2VtKTsKKwltdXRleF91bmxvY2soJmNhY2hlX2NoYWluX211dGV4KTsKIAlpZiAocmVzID49IDApCiAJCXJlcyA9IGNvdW50OwogCXJldHVybiByZXM7CkBAIC0zNjA5LDI2ICszNjU4LDMgQEAKIAogCXJldHVybiBvYmpfcmVhbGxlbihwYWdlX2dldF9jYWNoZSh2aXJ0X3RvX3BhZ2Uob2JqcCkpKTsKIH0KLQotCi0vKgotICoga3N0cmR1cCAtIGFsbG9jYXRlIHNwYWNlIGZvciBhbmQgY29weSBhbiBleGlzdGluZyBzdHJpbmcKLSAqCi0gKiBAczogdGhlIHN0cmluZyB0byBkdXBsaWNhdGUKLSAqIEBnZnA6IHRoZSBHRlAgbWFzayB1c2VkIGluIHRoZSBrbWFsbG9jKCkgY2FsbCB3aGVuIGFsbG9jYXRpbmcgbWVtb3J5Ci0gKi8KLWNoYXIgKmtzdHJkdXAoY29uc3QgY2hhciAqcywgZ2ZwX3QgZ2ZwKQotewotCXNpemVfdCBsZW47Ci0JY2hhciAqYnVmOwotCi0JaWYgKCFzKQotCQlyZXR1cm4gTlVMTDsKLQotCWxlbiA9IHN0cmxlbihzKSArIDE7Ci0JYnVmID0ga21hbGxvYyhsZW4sIGdmcCk7Ci0JaWYgKGJ1ZikKLQkJbWVtY3B5KGJ1ZiwgcywgbGVuKTsKLQlyZXR1cm4gYnVmOwotfQotRVhQT1JUX1NZTUJPTChrc3RyZHVwKTsKZGlmZiAtLWdpdCBhL21tL3Nsb2IuYyBiL21tL3Nsb2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzI0MGM0Ci0tLSAvZGV2L251bGwKKysrIGIvbW0vc2xvYi5jCkBAIC0wLDAgKzEsMzg1IEBACisvKgorICogU0xPQiBBbGxvY2F0b3I6IFNpbXBsZSBMaXN0IE9mIEJsb2NrcworICoKKyAqIE1hdHQgTWFja2FsbCA8bXBtQHNlbGVuaWMuY29tPiAxMi8zMC8wMworICoKKyAqIEhvdyBTTE9CIHdvcmtzOgorICoKKyAqIFRoZSBjb3JlIG9mIFNMT0IgaXMgYSB0cmFkaXRpb25hbCBLJlIgc3R5bGUgaGVhcCBhbGxvY2F0b3IsIHdpdGgKKyAqIHN1cHBvcnQgZm9yIHJldHVybmluZyBhbGlnbmVkIG9iamVjdHMuIFRoZSBncmFudWxhcml0eSBvZiB0aGlzCisgKiBhbGxvY2F0b3IgaXMgOCBieXRlcyBvbiB4ODYsIHRob3VnaCBpdCdzIHBlcmhhcHMgcG9zc2libGUgdG8gcmVkdWNlCisgKiB0aGlzIHRvIDQgaWYgaXQncyBkZWVtZWQgd29ydGggdGhlIGVmZm9ydC4gVGhlIHNsb2IgaGVhcCBpcyBhCisgKiBzaW5nbHktbGlua2VkIGxpc3Qgb2YgcGFnZXMgZnJvbSBfX2dldF9mcmVlX3BhZ2UsIGdyb3duIG9uIGRlbWFuZAorICogYW5kIGFsbG9jYXRpb24gZnJvbSB0aGUgaGVhcCBpcyBjdXJyZW50bHkgZmlyc3QtZml0LgorICoKKyAqIEFib3ZlIHRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2Yga21hbGxvYy9rZnJlZS4gQmxvY2tzIHJldHVybmVkCisgKiBmcm9tIGttYWxsb2MgYXJlIDgtYnl0ZSBhbGlnbmVkIGFuZCBwcmVwZW5kZWQgd2l0aCBhIDgtYnl0ZSBoZWFkZXIuCisgKiBJZiBrbWFsbG9jIGlzIGFza2VkIGZvciBvYmplY3RzIG9mIFBBR0VfU0laRSBvciBsYXJnZXIsIGl0IGNhbGxzCisgKiBfX2dldF9mcmVlX3BhZ2VzIGRpcmVjdGx5IHNvIHRoYXQgaXQgY2FuIHJldHVybiBwYWdlLWFsaWduZWQgYmxvY2tzCisgKiBhbmQga2VlcHMgYSBsaW5rZWQgbGlzdCBvZiBzdWNoIHBhZ2VzIGFuZCB0aGVpciBvcmRlcnMuIFRoZXNlCisgKiBvYmplY3RzIGFyZSBkZXRlY3RlZCBpbiBrZnJlZSgpIGJ5IHRoZWlyIHBhZ2UgYWxpZ25tZW50LgorICoKKyAqIFNMQUIgaXMgZW11bGF0ZWQgb24gdG9wIG9mIFNMT0IgYnkgc2ltcGx5IGNhbGxpbmcgY29uc3RydWN0b3JzIGFuZAorICogZGVzdHJ1Y3RvcnMgZm9yIGV2ZXJ5IFNMQUIgYWxsb2NhdGlvbi4gT2JqZWN0cyBhcmUgcmV0dXJuZWQgd2l0aAorICogdGhlIDgtYnl0ZSBhbGlnbm1lbnQgdW5sZXNzIHRoZSBTTEFCX01VU1RfSFdDQUNIRV9BTElHTiBmbGFnIGlzCisgKiBzZXQsIGluIHdoaWNoIGNhc2UgdGhlIGxvdy1sZXZlbCBhbGxvY2F0b3Igd2lsbCBmcmFnbWVudCBibG9ja3MgdG8KKyAqIGNyZWF0ZSB0aGUgcHJvcGVyIGFsaWdubWVudC4gQWdhaW4sIG9iamVjdHMgb2YgcGFnZS1zaXplIG9yIGdyZWF0ZXIKKyAqIGFyZSBhbGxvY2F0ZWQgYnkgY2FsbGluZyBfX2dldF9mcmVlX3BhZ2VzLiBBcyBTTEFCIG9iamVjdHMga25vdworICogdGhlaXIgc2l6ZSwgbm8gc2VwYXJhdGUgc2l6ZSBib29ra2VlcGluZyBpcyBuZWNlc3NhcnkgYW5kIHRoZXJlIGlzCisgKiBlc3NlbnRpYWxseSBubyBhbGxvY2F0aW9uIHNwYWNlIG92ZXJoZWFkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorCitzdHJ1Y3Qgc2xvYl9ibG9jayB7CisJaW50IHVuaXRzOworCXN0cnVjdCBzbG9iX2Jsb2NrICpuZXh0OworfTsKK3R5cGVkZWYgc3RydWN0IHNsb2JfYmxvY2sgc2xvYl90OworCisjZGVmaW5lIFNMT0JfVU5JVCBzaXplb2Yoc2xvYl90KQorI2RlZmluZSBTTE9CX1VOSVRTKHNpemUpICgoKHNpemUpICsgU0xPQl9VTklUIC0gMSkvU0xPQl9VTklUKQorI2RlZmluZSBTTE9CX0FMSUdOIEwxX0NBQ0hFX0JZVEVTCisKK3N0cnVjdCBiaWdibG9jayB7CisJaW50IG9yZGVyOworCXZvaWQgKnBhZ2VzOworCXN0cnVjdCBiaWdibG9jayAqbmV4dDsKK307Cit0eXBlZGVmIHN0cnVjdCBiaWdibG9jayBiaWdibG9ja190OworCitzdGF0aWMgc2xvYl90IGFyZW5hID0geyAubmV4dCA9ICZhcmVuYSwgLnVuaXRzID0gMSB9Oworc3RhdGljIHNsb2JfdCAqc2xvYmZyZWUgPSAmYXJlbmE7CitzdGF0aWMgYmlnYmxvY2tfdCAqYmlnYmxvY2tzOworc3RhdGljIERFRklORV9TUElOTE9DSyhzbG9iX2xvY2spOworc3RhdGljIERFRklORV9TUElOTE9DSyhibG9ja19sb2NrKTsKKworc3RhdGljIHZvaWQgc2xvYl9mcmVlKHZvaWQgKmIsIGludCBzaXplKTsKKworc3RhdGljIHZvaWQgKnNsb2JfYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGdmcCwgaW50IGFsaWduKQoreworCXNsb2JfdCAqcHJldiwgKmN1ciwgKmFsaWduZWQgPSAwOworCWludCBkZWx0YSA9IDAsIHVuaXRzID0gU0xPQl9VTklUUyhzaXplKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNsb2JfbG9jaywgZmxhZ3MpOworCXByZXYgPSBzbG9iZnJlZTsKKwlmb3IgKGN1ciA9IHByZXYtPm5leHQ7IDsgcHJldiA9IGN1ciwgY3VyID0gY3VyLT5uZXh0KSB7CisJCWlmIChhbGlnbikgeworCQkJYWxpZ25lZCA9IChzbG9iX3QgKilBTElHTigodW5zaWduZWQgbG9uZyljdXIsIGFsaWduKTsKKwkJCWRlbHRhID0gYWxpZ25lZCAtIGN1cjsKKwkJfQorCQlpZiAoY3VyLT51bml0cyA+PSB1bml0cyArIGRlbHRhKSB7IC8qIHJvb20gZW5vdWdoPyAqLworCQkJaWYgKGRlbHRhKSB7IC8qIG5lZWQgdG8gZnJhZ21lbnQgaGVhZCB0byBhbGlnbj8gKi8KKwkJCQlhbGlnbmVkLT51bml0cyA9IGN1ci0+dW5pdHMgLSBkZWx0YTsKKwkJCQlhbGlnbmVkLT5uZXh0ID0gY3VyLT5uZXh0OworCQkJCWN1ci0+bmV4dCA9IGFsaWduZWQ7CisJCQkJY3VyLT51bml0cyA9IGRlbHRhOworCQkJCXByZXYgPSBjdXI7CisJCQkJY3VyID0gYWxpZ25lZDsKKwkJCX0KKworCQkJaWYgKGN1ci0+dW5pdHMgPT0gdW5pdHMpIC8qIGV4YWN0IGZpdD8gKi8KKwkJCQlwcmV2LT5uZXh0ID0gY3VyLT5uZXh0OyAvKiB1bmxpbmsgKi8KKwkJCWVsc2UgeyAvKiBmcmFnbWVudCAqLworCQkJCXByZXYtPm5leHQgPSBjdXIgKyB1bml0czsKKwkJCQlwcmV2LT5uZXh0LT51bml0cyA9IGN1ci0+dW5pdHMgLSB1bml0czsKKwkJCQlwcmV2LT5uZXh0LT5uZXh0ID0gY3VyLT5uZXh0OworCQkJCWN1ci0+dW5pdHMgPSB1bml0czsKKwkJCX0KKworCQkJc2xvYmZyZWUgPSBwcmV2OworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2xvYl9sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gY3VyOworCQl9CisJCWlmIChjdXIgPT0gc2xvYmZyZWUpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNsb2JfbG9jaywgZmxhZ3MpOworCisJCQlpZiAoc2l6ZSA9PSBQQUdFX1NJWkUpIC8qIHRyeWluZyB0byBzaHJpbmsgYXJlbmE/ICovCisJCQkJcmV0dXJuIDA7CisKKwkJCWN1ciA9IChzbG9iX3QgKilfX2dldF9mcmVlX3BhZ2UoZ2ZwKTsKKwkJCWlmICghY3VyKQorCQkJCXJldHVybiAwOworCisJCQlzbG9iX2ZyZWUoY3VyLCBQQUdFX1NJWkUpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNsb2JfbG9jaywgZmxhZ3MpOworCQkJY3VyID0gc2xvYmZyZWU7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNsb2JfZnJlZSh2b2lkICpibG9jaywgaW50IHNpemUpCit7CisJc2xvYl90ICpjdXIsICpiID0gKHNsb2JfdCAqKWJsb2NrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWJsb2NrKQorCQlyZXR1cm47CisKKwlpZiAoc2l6ZSkKKwkJYi0+dW5pdHMgPSBTTE9CX1VOSVRTKHNpemUpOworCisJLyogRmluZCByZWluc2VydGlvbiBwb2ludCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzbG9iX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGN1ciA9IHNsb2JmcmVlOyAhKGIgPiBjdXIgJiYgYiA8IGN1ci0+bmV4dCk7IGN1ciA9IGN1ci0+bmV4dCkKKwkJaWYgKGN1ciA+PSBjdXItPm5leHQgJiYgKGIgPiBjdXIgfHwgYiA8IGN1ci0+bmV4dCkpCisJCQlicmVhazsKKworCWlmIChiICsgYi0+dW5pdHMgPT0gY3VyLT5uZXh0KSB7CisJCWItPnVuaXRzICs9IGN1ci0+bmV4dC0+dW5pdHM7CisJCWItPm5leHQgPSBjdXItPm5leHQtPm5leHQ7CisJfSBlbHNlCisJCWItPm5leHQgPSBjdXItPm5leHQ7CisKKwlpZiAoY3VyICsgY3VyLT51bml0cyA9PSBiKSB7CisJCWN1ci0+dW5pdHMgKz0gYi0+dW5pdHM7CisJCWN1ci0+bmV4dCA9IGItPm5leHQ7CisJfSBlbHNlCisJCWN1ci0+bmV4dCA9IGI7CisKKwlzbG9iZnJlZSA9IGN1cjsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNsb2JfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IEZBU1RDQUxMKGZpbmRfb3JkZXIoaW50IHNpemUpKTsKK3N0YXRpYyBpbnQgZmFzdGNhbGwgZmluZF9vcmRlcihpbnQgc2l6ZSkKK3sKKwlpbnQgb3JkZXIgPSAwOworCWZvciAoIDsgc2l6ZSA+IDQwOTYgOyBzaXplID4+PTEpCisJCW9yZGVyKys7CisJcmV0dXJuIG9yZGVyOworfQorCit2b2lkICprbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBnZnApCit7CisJc2xvYl90ICptOworCWJpZ2Jsb2NrX3QgKmJiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2l6ZSA8IFBBR0VfU0laRSAtIFNMT0JfVU5JVCkgeworCQltID0gc2xvYl9hbGxvYyhzaXplICsgU0xPQl9VTklULCBnZnAsIDApOworCQlyZXR1cm4gbSA/ICh2b2lkICopKG0gKyAxKSA6IDA7CisJfQorCisJYmIgPSBzbG9iX2FsbG9jKHNpemVvZihiaWdibG9ja190KSwgZ2ZwLCAwKTsKKwlpZiAoIWJiKQorCQlyZXR1cm4gMDsKKworCWJiLT5vcmRlciA9IGZpbmRfb3JkZXIoc2l6ZSk7CisJYmItPnBhZ2VzID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKGdmcCwgYmItPm9yZGVyKTsKKworCWlmIChiYi0+cGFnZXMpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJsb2NrX2xvY2ssIGZsYWdzKTsKKwkJYmItPm5leHQgPSBiaWdibG9ja3M7CisJCWJpZ2Jsb2NrcyA9IGJiOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibG9ja19sb2NrLCBmbGFncyk7CisJCXJldHVybiBiYi0+cGFnZXM7CisJfQorCisJc2xvYl9mcmVlKGJiLCBzaXplb2YoYmlnYmxvY2tfdCkpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKGttYWxsb2MpOworCit2b2lkIGtmcmVlKGNvbnN0IHZvaWQgKmJsb2NrKQoreworCWJpZ2Jsb2NrX3QgKmJiLCAqKmxhc3QgPSAmYmlnYmxvY2tzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWJsb2NrKQorCQlyZXR1cm47CisKKwlpZiAoISgodW5zaWduZWQgbG9uZylibG9jayAmIChQQUdFX1NJWkUtMSkpKSB7CisJCS8qIG1pZ2h0IGJlIG9uIHRoZSBiaWcgYmxvY2sgbGlzdCAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmxvY2tfbG9jaywgZmxhZ3MpOworCQlmb3IgKGJiID0gYmlnYmxvY2tzOyBiYjsgbGFzdCA9ICZiYi0+bmV4dCwgYmIgPSBiYi0+bmV4dCkgeworCQkJaWYgKGJiLT5wYWdlcyA9PSBibG9jaykgeworCQkJCSpsYXN0ID0gYmItPm5leHQ7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxvY2tfbG9jaywgZmxhZ3MpOworCQkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpYmxvY2ssIGJiLT5vcmRlcik7CisJCQkJc2xvYl9mcmVlKGJiLCBzaXplb2YoYmlnYmxvY2tfdCkpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibG9ja19sb2NrLCBmbGFncyk7CisJfQorCisJc2xvYl9mcmVlKChzbG9iX3QgKilibG9jayAtIDEsIDApOworCXJldHVybjsKK30KKworRVhQT1JUX1NZTUJPTChrZnJlZSk7CisKK3Vuc2lnbmVkIGludCBrc2l6ZShjb25zdCB2b2lkICpibG9jaykKK3sKKwliaWdibG9ja190ICpiYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFibG9jaykKKwkJcmV0dXJuIDA7CisKKwlpZiAoISgodW5zaWduZWQgbG9uZylibG9jayAmIChQQUdFX1NJWkUtMSkpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZibG9ja19sb2NrLCBmbGFncyk7CisJCWZvciAoYmIgPSBiaWdibG9ja3M7IGJiOyBiYiA9IGJiLT5uZXh0KQorCQkJaWYgKGJiLT5wYWdlcyA9PSBibG9jaykgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNsb2JfbG9jaywgZmxhZ3MpOworCQkJCXJldHVybiBQQUdFX1NJWkUgPDwgYmItPm9yZGVyOworCQkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibG9ja19sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuICgoc2xvYl90ICopYmxvY2sgLSAxKS0+dW5pdHMgKiBTTE9CX1VOSVQ7Cit9CisKK3N0cnVjdCBrbWVtX2NhY2hlIHsKKwl1bnNpZ25lZCBpbnQgc2l6ZSwgYWxpZ247CisJY29uc3QgY2hhciAqbmFtZTsKKwl2b2lkICgqY3Rvcikodm9pZCAqLCBzdHJ1Y3Qga21lbV9jYWNoZSAqLCB1bnNpZ25lZCBsb25nKTsKKwl2b2lkICgqZHRvcikodm9pZCAqLCBzdHJ1Y3Qga21lbV9jYWNoZSAqLCB1bnNpZ25lZCBsb25nKTsKK307CisKK3N0cnVjdCBrbWVtX2NhY2hlICprbWVtX2NhY2hlX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBzaXplX3Qgc2l6ZSwKKwlzaXplX3QgYWxpZ24sIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJdm9pZCAoKmN0b3IpKHZvaWQqLCBzdHJ1Y3Qga21lbV9jYWNoZSAqLCB1bnNpZ25lZCBsb25nKSwKKwl2b2lkICgqZHRvcikodm9pZCosIHN0cnVjdCBrbWVtX2NhY2hlICosIHVuc2lnbmVkIGxvbmcpKQoreworCXN0cnVjdCBrbWVtX2NhY2hlICpjOworCisJYyA9IHNsb2JfYWxsb2Moc2l6ZW9mKHN0cnVjdCBrbWVtX2NhY2hlKSwgZmxhZ3MsIDApOworCisJaWYgKGMpIHsKKwkJYy0+bmFtZSA9IG5hbWU7CisJCWMtPnNpemUgPSBzaXplOworCQljLT5jdG9yID0gY3RvcjsKKwkJYy0+ZHRvciA9IGR0b3I7CisJCS8qIGlnbm9yZSBhbGlnbm1lbnQgdW5sZXNzIGl0J3MgZm9yY2VkICovCisJCWMtPmFsaWduID0gKGZsYWdzICYgU0xBQl9NVVNUX0hXQ0FDSEVfQUxJR04pID8gU0xPQl9BTElHTiA6IDA7CisJCWlmIChjLT5hbGlnbiA8IGFsaWduKQorCQkJYy0+YWxpZ24gPSBhbGlnbjsKKwl9CisKKwlyZXR1cm4gYzsKK30KK0VYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9jcmVhdGUpOworCitpbnQga21lbV9jYWNoZV9kZXN0cm95KHN0cnVjdCBrbWVtX2NhY2hlICpjKQoreworCXNsb2JfZnJlZShjLCBzaXplb2Yoc3RydWN0IGttZW1fY2FjaGUpKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9kZXN0cm95KTsKKwordm9pZCAqa21lbV9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqYywgZ2ZwX3QgZmxhZ3MpCit7CisJdm9pZCAqYjsKKworCWlmIChjLT5zaXplIDwgUEFHRV9TSVpFKQorCQliID0gc2xvYl9hbGxvYyhjLT5zaXplLCBmbGFncywgYy0+YWxpZ24pOworCWVsc2UKKwkJYiA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhmbGFncywgZmluZF9vcmRlcihjLT5zaXplKSk7CisKKwlpZiAoYy0+Y3RvcikKKwkJYy0+Y3RvcihiLCBjLCBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpOworCisJcmV0dXJuIGI7Cit9CitFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfYWxsb2MpOworCit2b2lkIGttZW1fY2FjaGVfZnJlZShzdHJ1Y3Qga21lbV9jYWNoZSAqYywgdm9pZCAqYikKK3sKKwlpZiAoYy0+ZHRvcikKKwkJYy0+ZHRvcihiLCBjLCAwKTsKKworCWlmIChjLT5zaXplIDwgUEFHRV9TSVpFKQorCQlzbG9iX2ZyZWUoYiwgYy0+c2l6ZSk7CisJZWxzZQorCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWIsIGZpbmRfb3JkZXIoYy0+c2l6ZSkpOworfQorRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2ZyZWUpOworCit1bnNpZ25lZCBpbnQga21lbV9jYWNoZV9zaXplKHN0cnVjdCBrbWVtX2NhY2hlICpjKQoreworCXJldHVybiBjLT5zaXplOworfQorRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX3NpemUpOworCitjb25zdCBjaGFyICprbWVtX2NhY2hlX25hbWUoc3RydWN0IGttZW1fY2FjaGUgKmMpCit7CisJcmV0dXJuIGMtPm5hbWU7Cit9CitFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfbmFtZSk7CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzbG9iX3RpbWVyID0gVElNRVJfSU5JVElBTElaRVIoCisJKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKWttZW1fY2FjaGVfaW5pdCwgMCwgMCk7CisKK3ZvaWQga21lbV9jYWNoZV9pbml0KHZvaWQpCit7CisJdm9pZCAqcCA9IHNsb2JfYWxsb2MoUEFHRV9TSVpFLCAwLCBQQUdFX1NJWkUtMSk7CisKKwlpZiAocCkKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXApOworCisJbW9kX3RpbWVyKCZzbG9iX3RpbWVyLCBqaWZmaWVzICsgSFopOworfQorCithdG9taWNfdCBzbGFiX3JlY2xhaW1fcGFnZXMgPSBBVE9NSUNfSU5JVCgwKTsKK0VYUE9SVF9TWU1CT0woc2xhYl9yZWNsYWltX3BhZ2VzKTsKKworI2lmZGVmIENPTkZJR19TTVAKKwordm9pZCAqX19hbGxvY19wZXJjcHUoc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcGVyY3B1X2RhdGEgKnBkYXRhID0ga21hbGxvYyhzaXplb2YgKCpwZGF0YSksIEdGUF9LRVJORUwpOworCisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7CisJCWlmICghY3B1X3Bvc3NpYmxlKGkpKQorCQkJY29udGludWU7CisJCXBkYXRhLT5wdHJzW2ldID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwZGF0YS0+cHRyc1tpXSkKKwkJCWdvdG8gdW53aW5kX29vbTsKKwkJbWVtc2V0KHBkYXRhLT5wdHJzW2ldLCAwLCBzaXplKTsKKwl9CisKKwkvKiBDYXRjaCBkZXJlZnMgdy9vIHdyYXBwZXJzICovCisJcmV0dXJuICh2b2lkICopICh+KHVuc2lnbmVkIGxvbmcpIHBkYXRhKTsKKwordW53aW5kX29vbToKKwl3aGlsZSAoLS1pID49IDApIHsKKwkJaWYgKCFjcHVfcG9zc2libGUoaSkpCisJCQljb250aW51ZTsKKwkJa2ZyZWUocGRhdGEtPnB0cnNbaV0pOworCX0KKwlrZnJlZShwZGF0YSk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKF9fYWxsb2NfcGVyY3B1KTsKKwordm9pZAorZnJlZV9wZXJjcHUoY29uc3Qgdm9pZCAqb2JqcCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcGVyY3B1X2RhdGEgKnAgPSAoc3RydWN0IHBlcmNwdV9kYXRhICopICh+KHVuc2lnbmVkIGxvbmcpIG9ianApOworCisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlpZiAoIWNwdV9wb3NzaWJsZShpKSkKKwkJCWNvbnRpbnVlOworCQlrZnJlZShwLT5wdHJzW2ldKTsKKwl9CisJa2ZyZWUocCk7Cit9CitFWFBPUlRfU1lNQk9MKGZyZWVfcGVyY3B1KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tbS9zcGFyc2UuYyBiL21tL3NwYXJzZS5jCmluZGV4IDcyMDc5YjUuLjBhNTFmMzYgMTAwNjQ0Ci0tLSBhL21tL3NwYXJzZS5jCisrKyBiL21tL3NwYXJzZS5jCkBAIC0xOCwxMCArMTgsMTAgQEAKICAqLwogI2lmZGVmIENPTkZJR19TUEFSU0VNRU1fRVhUUkVNRQogc3RydWN0IG1lbV9zZWN0aW9uICptZW1fc2VjdGlvbltOUl9TRUNUSU9OX1JPT1RTXQotCV9fX19jYWNoZWxpbmVfbWF4YWxpZ25lZF9pbl9zbXA7CisJX19fX2NhY2hlbGluZV9pbnRlcm5vZGVhbGlnbmVkX2luX3NtcDsKICNlbHNlCiBzdHJ1Y3QgbWVtX3NlY3Rpb24gbWVtX3NlY3Rpb25bTlJfU0VDVElPTl9ST09UU11bU0VDVElPTlNfUEVSX1JPT1RdCi0JX19fX2NhY2hlbGluZV9tYXhhbGlnbmVkX2luX3NtcDsKKwlfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wOwogI2VuZGlmCiBFWFBPUlRfU1lNQk9MKG1lbV9zZWN0aW9uKTsKIApkaWZmIC0tZ2l0IGEvbW0vc3dhcC5jIGIvbW0vc3dhcC5jCmluZGV4IGVlNmQ3MWMuLmJjMjQ0MmE3IDEwMDY0NAotLS0gYS9tbS9zd2FwLmMKKysrIGIvbW0vc3dhcC5jCkBAIC0xNzQsNiArMTc0LDMyIEBACiAJcHV0X2NwdSgpOwogfQogCisjaWZkZWYgQ09ORklHX05VTUEKK3N0YXRpYyB2b2lkIGxydV9hZGRfZHJhaW5fcGVyX2NwdSh2b2lkICpkdW1teSkKK3sKKwlscnVfYWRkX2RyYWluKCk7Cit9CisKKy8qCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MKKyAqLworaW50IGxydV9hZGRfZHJhaW5fYWxsKHZvaWQpCit7CisJcmV0dXJuIHNjaGVkdWxlX29uX2VhY2hfY3B1KGxydV9hZGRfZHJhaW5fcGVyX2NwdSwgTlVMTCk7Cit9CisKKyNlbHNlCisKKy8qCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MKKyAqLworaW50IGxydV9hZGRfZHJhaW5fYWxsKHZvaWQpCit7CisJbHJ1X2FkZF9kcmFpbigpOworCXJldHVybiAwOworfQorI2VuZGlmCisKIC8qCiAgKiBUaGlzIHBhdGggYWxtb3N0IG5ldmVyIGhhcHBlbnMgZm9yIFZNIGFjdGl2aXR5IC0gcGFnZXMgYXJlIG5vcm1hbGx5CiAgKiBmcmVlZCB2aWEgcGFnZXZlY3MuICBCdXQgaXQgZ2V0cyB1c2VkIGJ5IG5ldHdvcmtpbmcuCkBAIC0zODQsNiArNDEwLDggQEAKIAlyZXR1cm4gcGFnZXZlY19jb3VudChwdmVjKTsKIH0KIAorRVhQT1JUX1NZTUJPTChwYWdldmVjX2xvb2t1cCk7CisKIHVuc2lnbmVkIHBhZ2V2ZWNfbG9va3VwX3RhZyhzdHJ1Y3QgcGFnZXZlYyAqcHZlYywgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCXBnb2ZmX3QgKmluZGV4LCBpbnQgdGFnLCB1bnNpZ25lZCBucl9wYWdlcykKIHsKZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuYwppbmRleCBmYzJhZWNiLi43YjA5YWM1IDEwMDY0NAotLS0gYS9tbS9zd2FwX3N0YXRlLmMKKysrIGIvbW0vc3dhcF9zdGF0ZS5jCkBAIC0xNDEsNyArMTQxLDcgQEAKICAqIEFsbG9jYXRlIHN3YXAgc3BhY2UgZm9yIHRoZSBwYWdlIGFuZCBhZGQgdGhlIHBhZ2UgdG8gdGhlCiAgKiBzd2FwIGNhY2hlLiAgQ2FsbGVyIG5lZWRzIHRvIGhvbGQgdGhlIHBhZ2UgbG9jay4gCiAgKi8KLWludCBhZGRfdG9fc3dhcChzdHJ1Y3QgcGFnZSAqIHBhZ2UpCitpbnQgYWRkX3RvX3N3YXAoc3RydWN0IHBhZ2UgKiBwYWdlLCBnZnBfdCBnZnBfbWFzaykKIHsKIAlzd3BfZW50cnlfdCBlbnRyeTsKIAlpbnQgZXJyOwpAQCAtMTY2LDcgKzE2Niw3IEBACiAJCSAqIEFkZCBpdCB0byB0aGUgc3dhcCBjYWNoZSBhbmQgbWFyayBpdCBkaXJ0eQogCQkgKi8KIAkJZXJyID0gX19hZGRfdG9fc3dhcF9jYWNoZShwYWdlLCBlbnRyeSwKLQkJCQlHRlBfQVRPTUlDfF9fR0ZQX05PTUVNQUxMT0N8X19HRlBfTk9XQVJOKTsKKwkJCQlnZnBfbWFza3xfX0dGUF9OT01FTUFMTE9DfF9fR0ZQX05PV0FSTik7CiAKIAkJc3dpdGNoIChlcnIpIHsKIAkJY2FzZSAwOgkJCQkvKiBTdWNjZXNzICovCmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuYwppbmRleCA2ZGE0YjI4Li5mMWU2OWMzIDEwMDY0NAotLS0gYS9tbS9zd2FwZmlsZS5jCisrKyBiL21tL3N3YXBmaWxlLmMKQEAgLTI1LDYgKzI1LDggQEAKICNpbmNsdWRlIDxsaW51eC9ybWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpAQCAtNDUsMTIgKzQ3LDEyIEBACiAKIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0IHN3YXBfaW5mb1tNQVhfU1dBUEZJTEVTXTsKIAotc3RhdGljIERFQ0xBUkVfTVVURVgoc3dhcG9uX3NlbSk7CitzdGF0aWMgREVGSU5FX01VVEVYKHN3YXBvbl9tdXRleCk7CiAKIC8qCiAgKiBXZSBuZWVkIHRoaXMgYmVjYXVzZSB0aGUgYmRldi0+dW5wbHVnX2ZuIGNhbiBzbGVlcCBhbmQgd2UgY2Fubm90CiAgKiBob2xkIHN3YXBfbG9jayB3aGlsZSBjYWxsaW5nIHRoZSB1bnBsdWdfZm4uIEFuZCBzd2FwX2xvY2sKLSAqIGNhbm5vdCBiZSB0dXJuZWQgaW50byBhIHNlbWFwaG9yZS4KKyAqIGNhbm5vdCBiZSB0dXJuZWQgaW50byBhIG11dGV4LgogICovCiBzdGF0aWMgREVDTEFSRV9SV1NFTShzd2FwX3VucGx1Z19zZW0pOwogCkBAIC0xMTYwLDcgKzExNjIsNyBAQAogCXVwX3dyaXRlKCZzd2FwX3VucGx1Z19zZW0pOwogCiAJZGVzdHJveV9zd2FwX2V4dGVudHMocCk7Ci0JZG93bigmc3dhcG9uX3NlbSk7CisJbXV0ZXhfbG9jaygmc3dhcG9uX211dGV4KTsKIAlzcGluX2xvY2soJnN3YXBfbG9jayk7CiAJZHJhaW5fbW1saXN0KCk7CiAKQEAgLTExNzksNyArMTE4MSw3IEBACiAJcC0+c3dhcF9tYXAgPSBOVUxMOwogCXAtPmZsYWdzID0gMDsKIAlzcGluX3VubG9jaygmc3dhcF9sb2NrKTsKLQl1cCgmc3dhcG9uX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZzd2Fwb25fbXV0ZXgpOwogCXZmcmVlKHN3YXBfbWFwKTsKIAlpbm9kZSA9IG1hcHBpbmctPmhvc3Q7CiAJaWYgKFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpIHsKQEAgLTExODcsOSArMTE4OSw5IEBACiAJCXNldF9ibG9ja3NpemUoYmRldiwgcC0+b2xkX2Jsb2NrX3NpemUpOwogCQliZF9yZWxlYXNlKGJkZXYpOwogCX0gZWxzZSB7Ci0JCWRvd24oJmlub2RlLT5pX3NlbSk7CisJCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAkJaW5vZGUtPmlfZmxhZ3MgJj0gflNfU1dBUEZJTEU7Ci0JCXVwKCZpbm9kZS0+aV9zZW0pOworCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAl9CiAJZmlscF9jbG9zZShzd2FwX2ZpbGUsIE5VTEwpOwogCWVyciA9IDA7CkBAIC0xMjA4LDcgKzEyMTAsNyBAQAogCWludCBpOwogCWxvZmZfdCBsID0gKnBvczsKIAotCWRvd24oJnN3YXBvbl9zZW0pOworCW11dGV4X2xvY2soJnN3YXBvbl9tdXRleCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnJfc3dhcGZpbGVzOyBpKyssIHB0cisrKSB7CiAJCWlmICghKHB0ci0+ZmxhZ3MgJiBTV1BfVVNFRCkgfHwgIXB0ci0+c3dhcF9tYXApCkBAIC0xMjM3LDcgKzEyMzksNyBAQAogCiBzdGF0aWMgdm9pZCBzd2FwX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzd2FwLCB2b2lkICp2KQogewotCXVwKCZzd2Fwb25fc2VtKTsKKwltdXRleF91bmxvY2soJnN3YXBvbl9tdXRleCk7CiB9CiAKIHN0YXRpYyBpbnQgc3dhcF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc3dhcCwgdm9pZCAqdikKQEAgLTE0MDYsNyArMTQwOCw3IEBACiAJCXAtPmJkZXYgPSBiZGV2OwogCX0gZWxzZSBpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgewogCQlwLT5iZGV2ID0gaW5vZGUtPmlfc2ItPnNfYmRldjsKLQkJZG93bigmaW5vZGUtPmlfc2VtKTsKKwkJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQlkaWRfZG93biA9IDE7CiAJCWlmIChJU19TV0FQRklMRShpbm9kZSkpIHsKIAkJCWVycm9yID0gLUVCVVNZOwpAQCAtMTQ0Miw3ICsxNDQ0LDcgQEAKIAllbHNlIGlmICghbWVtY21wKCJTV0FQU1BBQ0UyIixzd2FwX2hlYWRlci0+bWFnaWMubWFnaWMsMTApKQogCQlzd2FwX2hlYWRlcl92ZXJzaW9uID0gMjsKIAllbHNlIHsKLQkJcHJpbnRrKCJVbmFibGUgdG8gZmluZCBzd2FwLXNwYWNlIHNpZ25hdHVyZVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGZpbmQgc3dhcC1zcGFjZSBzaWduYXR1cmVcbiIpOwogCQllcnJvciA9IC1FSU5WQUw7CiAJCWdvdG8gYmFkX3N3YXA7CiAJfQpAQCAtMTQ5Myw3ICsxNDk1LDcgQEAKIAkJCWdvdG8gYmFkX3N3YXA7CiAJCWlmIChzd2FwX2hlYWRlci0+aW5mby5ucl9iYWRwYWdlcyA+IE1BWF9TV0FQX0JBRFBBR0VTKQogCQkJZ290byBiYWRfc3dhcDsKLQkJCisKIAkJLyogT0ssIHNldCB1cCB0aGUgc3dhcCBtYXAgYW5kIGFwcGx5IHRoZSBiYWQgYmxvY2sgbGlzdCAqLwogCQlpZiAoIShwLT5zd2FwX21hcCA9IHZtYWxsb2MobWF4cGFnZXMgKiBzaXplb2Yoc2hvcnQpKSkpIHsKIAkJCWVycm9yID0gLUVOT01FTTsKQEAgLTE1MDIsMTcgKzE1MDQsMTcgQEAKIAogCQllcnJvciA9IDA7CiAJCW1lbXNldChwLT5zd2FwX21hcCwgMCwgbWF4cGFnZXMgKiBzaXplb2Yoc2hvcnQpKTsKLQkJZm9yIChpPTA7IGk8c3dhcF9oZWFkZXItPmluZm8ubnJfYmFkcGFnZXM7IGkrKykgewotCQkJaW50IHBhZ2UgPSBzd2FwX2hlYWRlci0+aW5mby5iYWRwYWdlc1tpXTsKLQkJCWlmIChwYWdlIDw9IDAgfHwgcGFnZSA+PSBzd2FwX2hlYWRlci0+aW5mby5sYXN0X3BhZ2UpCisJCWZvciAoaSA9IDA7IGkgPCBzd2FwX2hlYWRlci0+aW5mby5ucl9iYWRwYWdlczsgaSsrKSB7CisJCQlpbnQgcGFnZV9uciA9IHN3YXBfaGVhZGVyLT5pbmZvLmJhZHBhZ2VzW2ldOworCQkJaWYgKHBhZ2VfbnIgPD0gMCB8fCBwYWdlX25yID49IHN3YXBfaGVhZGVyLT5pbmZvLmxhc3RfcGFnZSkKIAkJCQllcnJvciA9IC1FSU5WQUw7CiAJCQllbHNlCi0JCQkJcC0+c3dhcF9tYXBbcGFnZV0gPSBTV0FQX01BUF9CQUQ7CisJCQkJcC0+c3dhcF9tYXBbcGFnZV9ucl0gPSBTV0FQX01BUF9CQUQ7CiAJCX0KIAkJbnJfZ29vZF9wYWdlcyA9IHN3YXBfaGVhZGVyLT5pbmZvLmxhc3RfcGFnZSAtCiAJCQkJc3dhcF9oZWFkZXItPmluZm8ubnJfYmFkcGFnZXMgLQogCQkJCTEgLyogaGVhZGVyIHBhZ2UgKi87Ci0JCWlmIChlcnJvcikgCisJCWlmIChlcnJvcikKIAkJCWdvdG8gYmFkX3N3YXA7CiAJfQogCkBAIC0xNTM5LDcgKzE1NDEsNyBAQAogCQlnb3RvIGJhZF9zd2FwOwogCX0KIAotCWRvd24oJnN3YXBvbl9zZW0pOworCW11dGV4X2xvY2soJnN3YXBvbl9tdXRleCk7CiAJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOwogCXAtPmZsYWdzID0gU1dQX0FDVElWRTsKIAlucl9zd2FwX3BhZ2VzICs9IG5yX2dvb2RfcGFnZXM7CkBAIC0xNTY1LDcgKzE1NjcsNyBAQAogCQlzd2FwX2luZm9bcHJldl0ubmV4dCA9IHAgLSBzd2FwX2luZm87CiAJfQogCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOwotCXVwKCZzd2Fwb25fc2VtKTsKKwltdXRleF91bmxvY2soJnN3YXBvbl9tdXRleCk7CiAJZXJyb3IgPSAwOwogCWdvdG8gb3V0OwogYmFkX3N3YXA6CkBAIC0xNTk2LDcgKzE1OTgsNyBAQAogCWlmIChkaWRfZG93bikgewogCQlpZiAoIWVycm9yKQogCQkJaW5vZGUtPmlfZmxhZ3MgfD0gU19TV0FQRklMRTsKLQkJdXAoJmlub2RlLT5pX3NlbSk7CisJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCX0KIAlyZXR1cm4gZXJyb3I7CiB9CmRpZmYgLS1naXQgYS9tbS90aW55LXNobWVtLmMgYi9tbS90aW55LXNobWVtLmMKaW5kZXggY2RjNmQ0My4uZjlkNmE5YyAxMDA2NDQKLS0tIGEvbW0vdGlueS1zaG1lbS5jCisrKyBiL21tL3Rpbnktc2htZW0uYwpAQCAtOTAsNyArOTAsNyBAQAogCWZpbGUtPmZfbW9kZSA9IEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRDsKIAogCS8qIG5vdGlmeSBldmVyeW9uZSBhcyB0byB0aGUgY2hhbmdlIG9mIGZpbGUgc2l6ZSAqLwotCWVycm9yID0gZG9fdHJ1bmNhdGUoZGVudHJ5LCBzaXplLCBmaWxlKTsKKwllcnJvciA9IGRvX3RydW5jYXRlKGRlbnRyeSwgc2l6ZSwgMCwgZmlsZSk7CiAJaWYgKGVycm9yIDwgMCkKIAkJZ290byBjbG9zZV9maWxlOwogCmRpZmYgLS1naXQgYS9tbS90cnVuY2F0ZS5jIGIvbW0vdHJ1bmNhdGUuYwppbmRleCA3ZGVlMzI3Li42Y2IzZmZmIDEwMDY0NAotLS0gYS9tbS90cnVuY2F0ZS5jCisrKyBiL21tL3RydW5jYXRlLmMKQEAgLTE5Niw3ICsxOTYsNyBAQAogICogQG1hcHBpbmc6IG1hcHBpbmcgdG8gdHJ1bmNhdGUKICAqIEBsc3RhcnQ6IG9mZnNldCBmcm9tIHdoaWNoIHRvIHRydW5jYXRlCiAgKgotICogQ2FsbGVkIHVuZGVyIChhbmQgc2VyaWFsaXNlZCBieSkgaW5vZGUtPmlfc2VtLgorICogQ2FsbGVkIHVuZGVyIChhbmQgc2VyaWFsaXNlZCBieSkgaW5vZGUtPmlfbXV0ZXguCiAgKi8KIHZvaWQgdHJ1bmNhdGVfaW5vZGVfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGxvZmZfdCBsc3RhcnQpCiB7CkBAIC0yNDksNyArMjQ5LDYgQEAKIAkJCQlicmVhazsKIAkJfQogCQlwYWdldmVjX3JlbGVhc2UoJnB2ZWMpOwotCQljb25kX3Jlc2NoZWQoKTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL21tL3V0aWwuYyBiL21tL3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjRiYjU5Ci0tLSAvZGV2L251bGwKKysrIGIvbW0vdXRpbC5jCkBAIC0wLDAgKzEsMzkgQEAKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKy8qKgorICoga3phbGxvYyAtIGFsbG9jYXRlIG1lbW9yeS4gVGhlIG1lbW9yeSBpcyBzZXQgdG8gemVyby4KKyAqIEBzaXplOiBob3cgbWFueSBieXRlcyBvZiBtZW1vcnkgYXJlIHJlcXVpcmVkLgorICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuCisgKi8KK3ZvaWQgKmt6YWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQoreworCXZvaWQgKnJldCA9IGttYWxsb2Moc2l6ZSwgZmxhZ3MpOworCWlmIChyZXQpCisJCW1lbXNldChyZXQsIDAsIHNpemUpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGt6YWxsb2MpOworCisvKgorICoga3N0cmR1cCAtIGFsbG9jYXRlIHNwYWNlIGZvciBhbmQgY29weSBhbiBleGlzdGluZyBzdHJpbmcKKyAqCisgKiBAczogdGhlIHN0cmluZyB0byBkdXBsaWNhdGUKKyAqIEBnZnA6IHRoZSBHRlAgbWFzayB1c2VkIGluIHRoZSBrbWFsbG9jKCkgY2FsbCB3aGVuIGFsbG9jYXRpbmcgbWVtb3J5CisgKi8KK2NoYXIgKmtzdHJkdXAoY29uc3QgY2hhciAqcywgZ2ZwX3QgZ2ZwKQoreworCXNpemVfdCBsZW47CisJY2hhciAqYnVmOworCisJaWYgKCFzKQorCQlyZXR1cm4gTlVMTDsKKworCWxlbiA9IHN0cmxlbihzKSArIDE7CisJYnVmID0ga21hbGxvYyhsZW4sIGdmcCk7CisJaWYgKGJ1ZikKKwkJbWVtY3B5KGJ1ZiwgcywgbGVuKTsKKwlyZXR1cm4gYnVmOworfQorRVhQT1JUX1NZTUJPTChrc3RyZHVwKTsKZGlmZiAtLWdpdCBhL21tL3Ztc2Nhbi5jIGIvbW0vdm1zY2FuLmMKaW5kZXggYmU4MjM1Zi4uMmUzNGI2MSAxMDA2NDQKLS0tIGEvbW0vdm1zY2FuLmMKKysrIGIvbW0vdm1zY2FuLmMKQEAgLTcxLDYgKzcxLDkgQEAKIAogCWludCBtYXlfd3JpdGVwYWdlOwogCisJLyogQ2FuIHBhZ2VzIGJlIHN3YXBwZWQgYXMgcGFydCBvZiByZWNsYWltPyAqLworCWludCBtYXlfc3dhcDsKKwogCS8qIFRoaXMgY29udGV4dCdzIFNXQVBfQ0xVU1RFUl9NQVguIElmIGZyZWVpbmcgbWVtb3J5IGZvcgogCSAqIHN1c3BlbmQsIHdlIGVmZmVjdGl2ZWx5IGlnbm9yZSBTV0FQX0NMVVNURVJfTUFYLgogCSAqIEluIHRoaXMgY29udGV4dCwgaXQgZG9lc24ndCBtYXR0ZXIgdGhhdCB3ZSBzY2FuIHRoZQpAQCAtMTgwLDggKzE4Myw3IEBACiAgKgogICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHNsYWIgb2JqZWN0cyB3aGljaCB3ZSBzaHJ1bmsuCiAgKi8KLXN0YXRpYyBpbnQgc2hyaW5rX3NsYWIodW5zaWduZWQgbG9uZyBzY2FubmVkLCBnZnBfdCBnZnBfbWFzaywKLQkJCXVuc2lnbmVkIGxvbmcgbHJ1X3BhZ2VzKQoraW50IHNocmlua19zbGFiKHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCwgZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGxvbmcgbHJ1X3BhZ2VzKQogewogCXN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXI7CiAJaW50IHJldCA9IDA7CkBAIC0yNjksOSArMjcxLDcgQEAKIAogc3RhdGljIGludCBtYXlfd3JpdGVfdG9fcXVldWUoc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSkKIHsKLQlpZiAoY3VycmVudF9pc19rc3dhcGQoKSkKLQkJcmV0dXJuIDE7Ci0JaWYgKGN1cnJlbnRfaXNfcGRmbHVzaCgpKQkvKiBUaGlzIGlzIHVubGlrZWx5LCBidXQgd2h5IG5vdC4uLiAqLworCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX1NXQVBXUklURSkKIAkJcmV0dXJuIDE7CiAJaWYgKCFiZGlfd3JpdGVfY29uZ2VzdGVkKGJkaSkpCiAJCXJldHVybiAxOwpAQCAtMzc2LDYgKzM3Niw0MyBAQAogCXJldHVybiBQQUdFX0NMRUFOOwogfQogCitzdGF0aWMgaW50IHJlbW92ZV9tYXBwaW5nKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpZiAoIW1hcHBpbmcpCisJCXJldHVybiAwOwkJLyogdHJ1bmNhdGUgZ290IHRoZXJlIGZpcnN0ICovCisKKwl3cml0ZV9sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKKworCS8qCisJICogVGhlIG5vbi1yYWN5IGNoZWNrIGZvciBidXN5IHBhZ2UuICBJdCBpcyBjcml0aWNhbCB0byBjaGVjaworCSAqIFBhZ2VEaXJ0eSBfYWZ0ZXJfIG1ha2luZyBzdXJlIHRoYXQgdGhlIHBhZ2UgaXMgZnJlZWFibGUgYW5kCisJICogbm90IGluIHVzZSBieSBhbnlib2R5LiAJKHBhZ2VjYWNoZSArIHVzID09IDIpCisJICovCisJaWYgKHVubGlrZWx5KHBhZ2VfY291bnQocGFnZSkgIT0gMikpCisJCWdvdG8gY2Fubm90X2ZyZWU7CisJc21wX3JtYigpOworCWlmICh1bmxpa2VseShQYWdlRGlydHkocGFnZSkpKQorCQlnb3RvIGNhbm5vdF9mcmVlOworCisJaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkpIHsKKwkJc3dwX2VudHJ5X3Qgc3dhcCA9IHsgLnZhbCA9IHBhZ2VfcHJpdmF0ZShwYWdlKSB9OworCQlfX2RlbGV0ZV9mcm9tX3N3YXBfY2FjaGUocGFnZSk7CisJCXdyaXRlX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJCXN3YXBfZnJlZShzd2FwKTsKKwkJX19wdXRfcGFnZShwYWdlKTsJLyogVGhlIHBhZ2VjYWNoZSByZWYgKi8KKwkJcmV0dXJuIDE7CisJfQorCisJX19yZW1vdmVfZnJvbV9wYWdlX2NhY2hlKHBhZ2UpOworCXdyaXRlX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJX19wdXRfcGFnZShwYWdlKTsKKwlyZXR1cm4gMTsKKworY2Fubm90X2ZyZWU6CisJd3JpdGVfdW5sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIHNocmlua19saXN0IGFkZHMgdGhlIG51bWJlciBvZiByZWNsYWltZWQgcGFnZXMgdG8gc2MtPm5yX3JlY2xhaW1lZAogICovCkBAIC00MjQsNyArNDYxLDkgQEAKIAkJICogVHJ5IHRvIGFsbG9jYXRlIGl0IHNvbWUgc3dhcCBzcGFjZSBoZXJlLgogCQkgKi8KIAkJaWYgKFBhZ2VBbm9uKHBhZ2UpICYmICFQYWdlU3dhcENhY2hlKHBhZ2UpKSB7Ci0JCQlpZiAoIWFkZF90b19zd2FwKHBhZ2UpKQorCQkJaWYgKCFzYy0+bWF5X3N3YXApCisJCQkJZ290byBrZWVwX2xvY2tlZDsKKwkJCWlmICghYWRkX3RvX3N3YXAocGFnZSwgR0ZQX0FUT01JQykpCiAJCQkJZ290byBhY3RpdmF0ZV9sb2NrZWQ7CiAJCX0KICNlbmRpZiAvKiBDT05GSUdfU1dBUCAqLwpAQCAtNTA3LDM2ICs1NDYsOCBAQAogCQkJCWdvdG8gZnJlZV9pdDsKIAkJfQogCi0JCWlmICghbWFwcGluZykKLQkJCWdvdG8ga2VlcF9sb2NrZWQ7CS8qIHRydW5jYXRlIGdvdCB0aGVyZSBmaXJzdCAqLwotCi0JCXdyaXRlX2xvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwotCi0JCS8qCi0JCSAqIFRoZSBub24tcmFjeSBjaGVjayBmb3IgYnVzeSBwYWdlLiAgSXQgaXMgY3JpdGljYWwgdG8gY2hlY2sKLQkJICogUGFnZURpcnR5IF9hZnRlcl8gbWFraW5nIHN1cmUgdGhhdCB0aGUgcGFnZSBpcyBmcmVlYWJsZSBhbmQKLQkJICogbm90IGluIHVzZSBieSBhbnlib2R5LiAJKHBhZ2VjYWNoZSArIHVzID09IDIpCi0JCSAqLwotCQlpZiAodW5saWtlbHkocGFnZV9jb3VudChwYWdlKSAhPSAyKSkKLQkJCWdvdG8gY2Fubm90X2ZyZWU7Ci0JCXNtcF9ybWIoKTsKLQkJaWYgKHVubGlrZWx5KFBhZ2VEaXJ0eShwYWdlKSkpCi0JCQlnb3RvIGNhbm5vdF9mcmVlOwotCi0jaWZkZWYgQ09ORklHX1NXQVAKLQkJaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkpIHsKLQkJCXN3cF9lbnRyeV90IHN3YXAgPSB7IC52YWwgPSBwYWdlX3ByaXZhdGUocGFnZSkgfTsKLQkJCV9fZGVsZXRlX2Zyb21fc3dhcF9jYWNoZShwYWdlKTsKLQkJCXdyaXRlX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7Ci0JCQlzd2FwX2ZyZWUoc3dhcCk7Ci0JCQlfX3B1dF9wYWdlKHBhZ2UpOwkvKiBUaGUgcGFnZWNhY2hlIHJlZiAqLwotCQkJZ290byBmcmVlX2l0OwotCQl9Ci0jZW5kaWYgLyogQ09ORklHX1NXQVAgKi8KLQotCQlfX3JlbW92ZV9mcm9tX3BhZ2VfY2FjaGUocGFnZSk7Ci0JCXdyaXRlX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7Ci0JCV9fcHV0X3BhZ2UocGFnZSk7CisJCWlmICghcmVtb3ZlX21hcHBpbmcobWFwcGluZywgcGFnZSkpCisJCQlnb3RvIGtlZXBfbG9ja2VkOwogCiBmcmVlX2l0OgogCQl1bmxvY2tfcGFnZShwYWdlKTsKQEAgLTU0NSwxMCArNTU2LDYgQEAKIAkJCV9fcGFnZXZlY19yZWxlYXNlX25vbmxydSgmZnJlZWRfcHZlYyk7CiAJCWNvbnRpbnVlOwogCi1jYW5ub3RfZnJlZToKLQkJd3JpdGVfdW5sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKLQkJZ290byBrZWVwX2xvY2tlZDsKLQogYWN0aXZhdGVfbG9ja2VkOgogCQlTZXRQYWdlQWN0aXZlKHBhZ2UpOwogCQlwZ2FjdGl2YXRlKys7CkBAIC01NjYsNiArNTczLDIyOCBAQAogCXJldHVybiByZWNsYWltZWQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfTUlHUkFUSU9OCitzdGF0aWMgaW5saW5lIHZvaWQgbW92ZV90b19scnUoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJbGlzdF9kZWwoJnBhZ2UtPmxydSk7CisJaWYgKFBhZ2VBY3RpdmUocGFnZSkpIHsKKwkJLyoKKwkJICogbHJ1X2NhY2hlX2FkZF9hY3RpdmUgY2hlY2tzIHRoYXQKKwkJICogdGhlIFBHX2FjdGl2ZSBiaXQgaXMgb2ZmLgorCQkgKi8KKwkJQ2xlYXJQYWdlQWN0aXZlKHBhZ2UpOworCQlscnVfY2FjaGVfYWRkX2FjdGl2ZShwYWdlKTsKKwl9IGVsc2UgeworCQlscnVfY2FjaGVfYWRkKHBhZ2UpOworCX0KKwlwdXRfcGFnZShwYWdlKTsKK30KKworLyoKKyAqIEFkZCBpc29sYXRlZCBwYWdlcyBvbiB0aGUgbGlzdCBiYWNrIHRvIHRoZSBMUlUuCisgKgorICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHB1dCBiYWNrLgorICovCitpbnQgcHV0YmFja19scnVfcGFnZXMoc3RydWN0IGxpc3RfaGVhZCAqbCkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTI7CisJaW50IGNvdW50ID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWdlLCBwYWdlMiwgbCwgbHJ1KSB7CisJCW1vdmVfdG9fbHJ1KHBhZ2UpOworCQljb3VudCsrOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKiBzd2Fwb3V0IGEgc2luZ2xlIHBhZ2UKKyAqIHBhZ2UgaXMgbG9ja2VkIHVwb24gZW50cnksIHVubG9ja2VkIG9uIGV4aXQKKyAqLworc3RhdGljIGludCBzd2FwX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlX21hcHBpbmcocGFnZSk7CisKKwlpZiAocGFnZV9tYXBwZWQocGFnZSkgJiYgbWFwcGluZykKKwkJaWYgKHRyeV90b191bm1hcChwYWdlKSAhPSBTV0FQX1NVQ0NFU1MpCisJCQlnb3RvIHVubG9ja19yZXRyeTsKKworCWlmIChQYWdlRGlydHkocGFnZSkpIHsKKwkJLyogUGFnZSBpcyBkaXJ0eSwgdHJ5IHRvIHdyaXRlIGl0IG91dCBoZXJlICovCisJCXN3aXRjaChwYWdlb3V0KHBhZ2UsIG1hcHBpbmcpKSB7CisJCWNhc2UgUEFHRV9LRUVQOgorCQljYXNlIFBBR0VfQUNUSVZBVEU6CisJCQlnb3RvIHVubG9ja19yZXRyeTsKKworCQljYXNlIFBBR0VfU1VDQ0VTUzoKKwkJCWdvdG8gcmV0cnk7CisKKwkJY2FzZSBQQUdFX0NMRUFOOgorCQkJOyAvKiB0cnkgdG8gZnJlZSB0aGUgcGFnZSBiZWxvdyAqLworCQl9CisJfQorCisJaWYgKFBhZ2VQcml2YXRlKHBhZ2UpKSB7CisJCWlmICghdHJ5X3RvX3JlbGVhc2VfcGFnZShwYWdlLCBHRlBfS0VSTkVMKSB8fAorCQkgICAgKCFtYXBwaW5nICYmIHBhZ2VfY291bnQocGFnZSkgPT0gMSkpCisJCQlnb3RvIHVubG9ja19yZXRyeTsKKwl9CisKKwlpZiAocmVtb3ZlX21hcHBpbmcobWFwcGluZywgcGFnZSkpIHsKKwkJLyogU3VjY2VzcyAqLworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJcmV0dXJuIDA7CisJfQorCit1bmxvY2tfcmV0cnk6CisJdW5sb2NrX3BhZ2UocGFnZSk7CisKK3JldHJ5OgorCXJldHVybiAtRUFHQUlOOworfQorLyoKKyAqIG1pZ3JhdGVfcGFnZXMKKyAqCisgKiBUd28gbGlzdHMgYXJlIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uLiBUaGUgZmlyc3QgbGlzdAorICogY29udGFpbnMgdGhlIHBhZ2VzIGlzb2xhdGVkIGZyb20gdGhlIExSVSB0byBiZSBtaWdyYXRlZC4KKyAqIFRoZSBzZWNvbmQgbGlzdCBjb250YWlucyBuZXcgcGFnZXMgdGhhdCB0aGUgcGFnZXMgaXNvbGF0ZWQKKyAqIGNhbiBiZSBtb3ZlZCB0by4gSWYgdGhlIHNlY29uZCBsaXN0IGlzIE5VTEwgdGhlbiBhbGwKKyAqIHBhZ2VzIGFyZSBzd2FwcGVkIG91dC4KKyAqCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhZnRlciAxMCBhdHRlbXB0cyBvciBpZiBubyBwYWdlcworICogYXJlIG1vdmFibGUgYW55bW9yZSBiZWNhdXNlIHQgaGFzIGJlY29tZSBlbXB0eQorICogb3Igbm8gcmV0cnlhYmxlIHBhZ2VzIGV4aXN0IGFueW1vcmUuCisgKgorICogU0lNUExJRklFRCBWRVJTSU9OOiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIG1pZ3JhdGVfcGFnZXMKKyAqIGlzIG9ubHkgc3dhcHBpbmcgb3V0IHBhZ2VzIGFuZCBuZXZlciB0b3VjaGVzIHRoZSBzZWNvbmQKKyAqIGxpc3QuIFRoZSBkaXJlY3QgbWlncmF0aW9uIHBhdGNoc2V0CisgKiBleHRlbmRzIHRoaXMgZnVuY3Rpb24gdG8gYXZvaWQgdGhlIHVzZSBvZiBzd2FwLgorICoKKyAqIFJldHVybjogTnVtYmVyIG9mIHBhZ2VzIG5vdCBtaWdyYXRlZCB3aGVuICJ0byIgcmFuIGVtcHR5LgorICovCitpbnQgbWlncmF0ZV9wYWdlcyhzdHJ1Y3QgbGlzdF9oZWFkICpmcm9tLCBzdHJ1Y3QgbGlzdF9oZWFkICp0bywKKwkJICBzdHJ1Y3QgbGlzdF9oZWFkICptb3ZlZCwgc3RydWN0IGxpc3RfaGVhZCAqZmFpbGVkKQoreworCWludCByZXRyeTsKKwlpbnQgbnJfZmFpbGVkID0gMDsKKwlpbnQgcGFzcyA9IDA7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IHBhZ2UgKnBhZ2UyOworCWludCBzd2Fwd3JpdGUgPSBjdXJyZW50LT5mbGFncyAmIFBGX1NXQVBXUklURTsKKwlpbnQgcmM7CisKKwlpZiAoIXN3YXB3cml0ZSkKKwkJY3VycmVudC0+ZmxhZ3MgfD0gUEZfU1dBUFdSSVRFOworCityZWRvOgorCXJldHJ5ID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWdlLCBwYWdlMiwgZnJvbSwgbHJ1KSB7CisJCWNvbmRfcmVzY2hlZCgpOworCisJCXJjID0gMDsKKwkJaWYgKHBhZ2VfY291bnQocGFnZSkgPT0gMSkKKwkJCS8qIHBhZ2Ugd2FzIGZyZWVkIGZyb20gdW5kZXIgdXMuIFNvIHdlIGFyZSBkb25lLiAqLworCQkJZ290byBuZXh0OworCisJCS8qCisJCSAqIFNraXAgbG9ja2VkIHBhZ2VzIGR1cmluZyB0aGUgZmlyc3QgdHdvIHBhc3NlcyB0byBnaXZlIHRoZQorCQkgKiBmdW5jdGlvbnMgaG9sZGluZyB0aGUgbG9jayB0aW1lIHRvIHJlbGVhc2UgdGhlIHBhZ2UuIExhdGVyIHdlCisJCSAqIHVzZSBsb2NrX3BhZ2UoKSB0byBoYXZlIGEgaGlnaGVyIGNoYW5jZSBvZiBhY3F1aXJpbmcgdGhlCisJCSAqIGxvY2suCisJCSAqLworCQlyYyA9IC1FQUdBSU47CisJCWlmIChwYXNzID4gMikKKwkJCWxvY2tfcGFnZShwYWdlKTsKKwkJZWxzZQorCQkJaWYgKFRlc3RTZXRQYWdlTG9ja2VkKHBhZ2UpKQorCQkJCWdvdG8gbmV4dDsKKworCQkvKgorCQkgKiBPbmx5IHdhaXQgb24gd3JpdGViYWNrIGlmIHdlIGhhdmUgYWxyZWFkeSBkb25lIGEgcGFzcyB3aGVyZQorCQkgKiB3ZSB3ZSBtYXkgaGF2ZSB0cmlnZ2VyZWQgd3JpdGVvdXRzIGZvciBsb3RzIG9mIHBhZ2VzLgorCQkgKi8KKwkJaWYgKHBhc3MgPiAwKSB7CisJCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCQl9IGVsc2UgeworCQkJaWYgKFBhZ2VXcml0ZWJhY2socGFnZSkpCisJCQkJZ290byB1bmxvY2tfcGFnZTsKKwkJfQorCisJCS8qCisJCSAqIEFub255bW91cyBwYWdlcyBtdXN0IGhhdmUgc3dhcCBjYWNoZSByZWZlcmVuY2VzIG90aGVyd2lzZQorCQkgKiB0aGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSBwYWdlIG1hcHMgY2Fubm90IGJlCisJCSAqIHByZXNlcnZlZC4KKwkJICovCisJCWlmIChQYWdlQW5vbihwYWdlKSAmJiAhUGFnZVN3YXBDYWNoZShwYWdlKSkgeworCQkJaWYgKCFhZGRfdG9fc3dhcChwYWdlLCBHRlBfS0VSTkVMKSkgeworCQkJCXJjID0gLUVOT01FTTsKKwkJCQlnb3RvIHVubG9ja19wYWdlOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogUGFnZSBpcyBwcm9wZXJseSBsb2NrZWQgYW5kIHdyaXRlYmFjayBpcyBjb21wbGV0ZS4KKwkJICogVHJ5IHRvIG1pZ3JhdGUgdGhlIHBhZ2UuCisJCSAqLworCQlyYyA9IHN3YXBfcGFnZShwYWdlKTsKKwkJZ290byBuZXh0OworCit1bmxvY2tfcGFnZToKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisKK25leHQ6CisJCWlmIChyYyA9PSAtRUFHQUlOKSB7CisJCQlyZXRyeSsrOworCQl9IGVsc2UgaWYgKHJjKSB7CisJCQkvKiBQZXJtYW5lbnQgZmFpbHVyZSAqLworCQkJbGlzdF9tb3ZlKCZwYWdlLT5scnUsIGZhaWxlZCk7CisJCQlucl9mYWlsZWQrKzsKKwkJfSBlbHNlIHsKKwkJCS8qIFN1Y2Nlc3MgKi8KKwkJCWxpc3RfbW92ZSgmcGFnZS0+bHJ1LCBtb3ZlZCk7CisJCX0KKwl9CisJaWYgKHJldHJ5ICYmIHBhc3MrKyA8IDEwKQorCQlnb3RvIHJlZG87CisKKwlpZiAoIXN3YXB3cml0ZSkKKwkJY3VycmVudC0+ZmxhZ3MgJj0gflBGX1NXQVBXUklURTsKKworCXJldHVybiBucl9mYWlsZWQgKyByZXRyeTsKK30KKworLyoKKyAqIElzb2xhdGUgb25lIHBhZ2UgZnJvbSB0aGUgTFJVIGxpc3RzIGFuZCBwdXQgaXQgb24gdGhlCisgKiBpbmRpY2F0ZWQgbGlzdCB3aXRoIGVsZXZhdGVkIHJlZmNvdW50LgorICoKKyAqIFJlc3VsdDoKKyAqICAwID0gcGFnZSBub3Qgb24gTFJVIGxpc3QKKyAqICAxID0gcGFnZSByZW1vdmVkIGZyb20gTFJVIGxpc3QgYW5kIGFkZGVkIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KKyAqLworaW50IGlzb2xhdGVfbHJ1X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoUGFnZUxSVShwYWdlKSkgeworCQlzdHJ1Y3Qgem9uZSAqem9uZSA9IHBhZ2Vfem9uZShwYWdlKTsKKwkJc3Bpbl9sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOworCQlpZiAoVGVzdENsZWFyUGFnZUxSVShwYWdlKSkgeworCQkJcmV0ID0gMTsKKwkJCWdldF9wYWdlKHBhZ2UpOworCQkJaWYgKFBhZ2VBY3RpdmUocGFnZSkpCisJCQkJZGVsX3BhZ2VfZnJvbV9hY3RpdmVfbGlzdCh6b25lLCBwYWdlKTsKKwkJCWVsc2UKKwkJCQlkZWxfcGFnZV9mcm9tX2luYWN0aXZlX2xpc3Qoem9uZSwgcGFnZSk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCiAvKgogICogem9uZS0+bHJ1X2xvY2sgaXMgaGVhdmlseSBjb250ZW5kZWQuICBTb21lIG9mIHRoZSBmdW5jdGlvbnMgdGhhdAogICogc2hyaW5rIHRoZSBsaXN0cyBwZXJmb3JtIGJldHRlciBieSB0YWtpbmcgb3V0IGEgYmF0Y2ggb2YgcGFnZXMKQEAgLTk0Miw2ICsxMTcxLDcgQEAKIAogCXNjLmdmcF9tYXNrID0gZ2ZwX21hc2s7CiAJc2MubWF5X3dyaXRlcGFnZSA9IDA7CisJc2MubWF5X3N3YXAgPSAxOwogCiAJaW5jX3BhZ2Vfc3RhdGUoYWxsb2NzdGFsbCk7CiAKQEAgLTEwNDQsNiArMTI3NCw3IEBACiAJdG90YWxfcmVjbGFpbWVkID0gMDsKIAlzYy5nZnBfbWFzayA9IEdGUF9LRVJORUw7CiAJc2MubWF5X3dyaXRlcGFnZSA9IDA7CisJc2MubWF5X3N3YXAgPSAxOwogCXNjLm5yX21hcHBlZCA9IHJlYWRfcGFnZV9zdGF0ZShucl9tYXBwZWQpOwogCiAJaW5jX3BhZ2Vfc3RhdGUocGFnZW91dHJ1bik7CkBAIC0xMjI2LDcgKzE0NTcsNyBAQAogCSAqIHVzIGZyb20gcmVjdXJzaXZlbHkgdHJ5aW5nIHRvIGZyZWUgbW9yZSBtZW1vcnkgYXMgd2UncmUKIAkgKiB0cnlpbmcgdG8gZnJlZSB0aGUgZmlyc3QgcGllY2Ugb2YgbWVtb3J5IGluIHRoZSBmaXJzdCBwbGFjZSkuCiAJICovCi0JdHNrLT5mbGFncyB8PSBQRl9NRU1BTExPQ3xQRl9LU1dBUEQ7CisJdHNrLT5mbGFncyB8PSBQRl9NRU1BTExPQyB8IFBGX1NXQVBXUklURSB8IFBGX0tTV0FQRDsKIAogCW9yZGVyID0gMDsKIAlmb3IgKCA7IDsgKSB7CkBAIC0xMzQxLDMgKzE1NzIsNzEgQEAKIH0KIAogbW9kdWxlX2luaXQoa3N3YXBkX2luaXQpCisKKyNpZmRlZiBDT05GSUdfTlVNQQorLyoKKyAqIFpvbmUgcmVjbGFpbSBtb2RlCisgKgorICogSWYgbm9uLXplcm8gY2FsbCB6b25lX3JlY2xhaW0gd2hlbiB0aGUgbnVtYmVyIG9mIGZyZWUgcGFnZXMgZmFsbHMgYmVsb3cKKyAqIHRoZSB3YXRlcm1hcmtzLgorICoKKyAqIEluIHRoZSBmdXR1cmUgd2UgbWF5IGFkZCBmbGFncyB0byB0aGUgbW9kZS4gSG93ZXZlciwgdGhlIHBhZ2UgYWxsb2NhdG9yCisgKiBzaG91bGQgb25seSBoYXZlIHRvIGNoZWNrIHRoYXQgem9uZV9yZWNsYWltX21vZGUgIT0gMCBiZWZvcmUgY2FsbGluZworICogem9uZV9yZWNsYWltKCkuCisgKi8KK2ludCB6b25lX3JlY2xhaW1fbW9kZSBfX3JlYWRfbW9zdGx5OworCisvKgorICogTWluaW51bSB0aW1lIGJldHdlZW4gem9uZSByZWNsYWltIHNjYW5zCisgKi8KKyNkZWZpbmUgWk9ORV9SRUNMQUlNX0lOVEVSVkFMIEhaLzIKKy8qCisgKiBUcnkgdG8gZnJlZSB1cCBzb21lIHBhZ2VzIGZyb20gdGhpcyB6b25lIHRocm91Z2ggcmVjbGFpbS4KKyAqLworaW50IHpvbmVfcmVjbGFpbShzdHJ1Y3Qgem9uZSAqem9uZSwgZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcikKK3sKKwlpbnQgbnJfcGFnZXMgPSAxIDw8IG9yZGVyOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCA9IGN1cnJlbnQ7CisJc3RydWN0IHJlY2xhaW1fc3RhdGUgcmVjbGFpbV9zdGF0ZTsKKwlzdHJ1Y3Qgc2Nhbl9jb250cm9sIHNjID0geworCQkuZ2ZwX21hc2sJPSBnZnBfbWFzaywKKwkJLm1heV93cml0ZXBhZ2UJPSAwLAorCQkubWF5X3N3YXAJPSAwLAorCQkubnJfbWFwcGVkCT0gcmVhZF9wYWdlX3N0YXRlKG5yX21hcHBlZCksCisJCS5ucl9zY2FubmVkCT0gMCwKKwkJLm5yX3JlY2xhaW1lZAk9IDAsCisJCS5wcmlvcml0eQk9IDAKKwl9OworCisJaWYgKCEoZ2ZwX21hc2sgJiBfX0dGUF9XQUlUKSB8fAorCQl6b25lLT56b25lX3BnZGF0LT5ub2RlX2lkICE9IG51bWFfbm9kZV9pZCgpIHx8CisJCXpvbmUtPmFsbF91bnJlY2xhaW1hYmxlIHx8CisJCWF0b21pY19yZWFkKCZ6b25lLT5yZWNsYWltX2luX3Byb2dyZXNzKSA+IDApCisJCQlyZXR1cm4gMDsKKworCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLAorCQl6b25lLT5sYXN0X3Vuc3VjY2Vzc2Z1bF96b25lX3JlY2xhaW0gKyBaT05FX1JFQ0xBSU1fSU5URVJWQUwpKQorCQkJcmV0dXJuIDA7CisKKwlkaXNhYmxlX3N3YXBfdG9rZW4oKTsKKworCWlmIChucl9wYWdlcyA+IFNXQVBfQ0xVU1RFUl9NQVgpCisJCXNjLnN3YXBfY2x1c3Rlcl9tYXggPSBucl9wYWdlczsKKwllbHNlCisJCXNjLnN3YXBfY2x1c3Rlcl9tYXggPSBTV0FQX0NMVVNURVJfTUFYOworCisJY29uZF9yZXNjaGVkKCk7CisJcC0+ZmxhZ3MgfD0gUEZfTUVNQUxMT0M7CisJcmVjbGFpbV9zdGF0ZS5yZWNsYWltZWRfc2xhYiA9IDA7CisJcC0+cmVjbGFpbV9zdGF0ZSA9ICZyZWNsYWltX3N0YXRlOworCXNocmlua196b25lKHpvbmUsICZzYyk7CisJcC0+cmVjbGFpbV9zdGF0ZSA9IE5VTEw7CisJY3VycmVudC0+ZmxhZ3MgJj0gflBGX01FTUFMTE9DOworCisJaWYgKHNjLm5yX3JlY2xhaW1lZCA9PSAwKQorCQl6b25lLT5sYXN0X3Vuc3VjY2Vzc2Z1bF96b25lX3JlY2xhaW0gPSBqaWZmaWVzOworCisJcmV0dXJuIHNjLm5yX3JlY2xhaW1lZCA+IG5yX3BhZ2VzOworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL25ldC84MDIvTWFrZWZpbGUgYi9uZXQvODAyL01ha2VmaWxlCmluZGV4IDAxODYxOTIuLjk3NzcwNGEgMTAwNjQ0Ci0tLSBhL25ldC84MDIvTWFrZWZpbGUKKysrIGIvbmV0LzgwMi9NYWtlZmlsZQpAQCAtMiw4ICsyLDYgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCA4MDIueCBwcm90b2NvbCBsYXllcnMuCiAjCiAKLW9iai15CQkJOj0gcDgwMjMubwotCiAjIENoZWNrIHRoZSBwODAyMiBzZWxlY3Rpb25zIGFnYWluc3QgbmV0L2NvcmUvTWFrZWZpbGUuCiBvYmotJChDT05GSUdfU1lTQ1RMKQkrPSBzeXNjdGxfbmV0XzgwMi5vCiBvYmotJChDT05GSUdfTExDKQkrPSBwODAyMi5vIHBzbmFwLm8KQEAgLTExLDUgKzksNSBAQAogb2JqLSQoQ09ORklHX05FVF9GQykJKz0gICAgICAgICAgICAgICAgIGZjLm8KIG9iai0kKENPTkZJR19GRERJKQkrPSAgICAgICAgICAgICAgICAgZmRkaS5vCiBvYmotJChDT05GSUdfSElQUEkpCSs9ICAgICAgICAgICAgICAgICBoaXBwaS5vCi1vYmotJChDT05GSUdfSVBYKQkrPSBwODAyMi5vIHBzbmFwLm8KK29iai0kKENPTkZJR19JUFgpCSs9IHA4MDIyLm8gcHNuYXAubyBwODAyMy5vCiBvYmotJChDT05GSUdfQVRBTEspCSs9IHA4MDIyLm8gcHNuYXAubwpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW4uYyBiL25ldC84MDIxcS92bGFuLmMKaW5kZXggNjc0NjViNi4uZmE3NjIyMCAxMDA2NDQKLS0tIGEvbmV0LzgwMjFxL3ZsYW4uYworKysgYi9uZXQvODAyMXEvdmxhbi5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+IC8qIGZvciBjb3B5X2Zyb21fdXNlciAqLworI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFuX2Rldi5jIGIvbmV0LzgwMjFxL3ZsYW5fZGV2LmMKaW5kZXggZjJhODc1MC4uMGY2MDRkMjIgMTAwNjQ0Ci0tLSBhL25ldC84MDIxcS92bGFuX2Rldi5jCisrKyBiL25ldC84MDIxcS92bGFuX2Rldi5jCkBAIC0yMTQsNyArMjE0LDcgQEAKIAkJICogVGhpcyBhbGxvd3MgdGhlIFZMQU4gdG8gaGF2ZSBhIGRpZmZlcmVudCBNQUMgdGhhbiB0aGUgdW5kZXJseWluZwogCQkgKiBkZXZpY2UsIGFuZCBzdGlsbCByb3V0ZSBjb3JyZWN0bHkuCiAJCSAqLwotCQlpZiAobWVtY21wKGV0aF9oZHIoc2tiKS0+aF9kZXN0LCBza2ItPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSA9PSAwKSB7CisJCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKGV0aF9oZHIoc2tiKS0+aF9kZXN0LCBza2ItPmRldi0+ZGV2X2FkZHIpKSB7CiAJCQkvKiBJdCBpcyBmb3Igb3VyIChjaGFuZ2VkKSBNQUMtYWRkcmVzcyEgKi8KIAkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKIAkJfQpkaWZmIC0tZ2l0IGEvbmV0L0tjb25maWcgYi9uZXQvS2NvbmZpZwppbmRleCA2MGY2ZjMyLi5iYzYwM2Q5IDEwMDY0NAotLS0gYS9uZXQvS2NvbmZpZworKysgYi9uZXQvS2NvbmZpZwpAQCAtMTUwLDYgKzE1MCw3IEBACiAKIHNvdXJjZSAibmV0L2RjY3AvS2NvbmZpZyIKIHNvdXJjZSAibmV0L3NjdHAvS2NvbmZpZyIKK3NvdXJjZSAibmV0L3RpcGMvS2NvbmZpZyIKIHNvdXJjZSAibmV0L2F0bS9LY29uZmlnIgogc291cmNlICJuZXQvYnJpZGdlL0tjb25maWciCiBzb3VyY2UgIm5ldC84MDIxcS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvbmV0L01ha2VmaWxlIGIvbmV0L01ha2VmaWxlCmluZGV4IGY1MTQxYjkuLjA2NTc5NmYgMTAwNjQ0Ci0tLSBhL25ldC9NYWtlZmlsZQorKysgYi9uZXQvTWFrZWZpbGUKQEAgLTQ1LDYgKzQ1LDcgQEAKIG9iai0kKENPTkZJR19JUF9EQ0NQKQkJKz0gZGNjcC8KIG9iai0kKENPTkZJR19JUF9TQ1RQKQkJKz0gc2N0cC8KIG9iai0kKENPTkZJR19JRUVFODAyMTEpCQkrPSBpZWVlODAyMTEvCitvYmotJChDT05GSUdfVElQQykJCSs9IHRpcGMvCiAKIGlmZXEgKCQoQ09ORklHX05FVCkseSkKIG9iai0kKENPTkZJR19TWVNDVEwpCQkrPSBzeXNjdGxfbmV0Lm8KZGlmZiAtLWdpdCBhL25ldC9hcHBsZXRhbGsvZGRwLmMgYi9uZXQvYXBwbGV0YWxrL2RkcC5jCmluZGV4IGE1MTQ0ZTQuLjY5N2FjNTVlIDEwMDY0NAotLS0gYS9uZXQvYXBwbGV0YWxrL2RkcC5jCisrKyBiL25ldC9hcHBsZXRhbGsvZGRwLmMKQEAgLTUyLDYgKzUyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4JLyogRm9yIFRJT0NPVVRRL0lOUSAqLwpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9icjI2ODQuYyBiL25ldC9hdG0vYnIyNjg0LmMKaW5kZXggYmRiNGQ4OS4uNjgwY2NiMSAxMDA2NDQKLS0tIGEvbmV0L2F0bS9icjI2ODQuYworKysgYi9uZXQvYXRtL2JyMjY4NC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bmV0L2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L2F0bS5oPgogI2luY2x1ZGUgPGxpbnV4L2F0bWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogCiAjaW5jbHVkZSA8bGludXgvYXRtYnIyNjg0Lmg+CkBAIC0yOTYsMTMgKzI5NywxMyBAQAogCWV0aCA9IGV0aF9oZHIoc2tiKTsKIAogCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihldGgtPmhfZGVzdCkpIHsKLQkJaWYgKG1lbWNtcChldGgtPmhfZGVzdCwgZGV2LT5icm9hZGNhc3QsIEVUSF9BTEVOKSA9PSAwKQorCQlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihldGgtPmhfZGVzdCwgZGV2LT5icm9hZGNhc3QpKQogCQkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9CUk9BRENBU1Q7CiAJCWVsc2UKIAkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfTVVMVElDQVNUOwogCX0KIAotCWVsc2UgaWYgKG1lbWNtcChldGgtPmhfZGVzdCwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pKQorCWVsc2UgaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihldGgtPmhfZGVzdCwgZGV2LT5kZXZfYWRkcikpCiAJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOwogCiAJaWYgKG50b2hzKGV0aC0+aF9wcm90bykgPj0gMTUzNikKZGlmZiAtLWdpdCBhL25ldC9hdG0vY2xpcC5jIGIvbmV0L2F0bS9jbGlwLmMKaW5kZXggNGY1NGM5YS4uNzMzNzBkZSAxMDA2NDQKLS0tIGEvbmV0L2F0bS9jbGlwLmMKKysrIGIvbmV0L2F0bS9jbGlwLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9hdG1kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9hdG1jbGlwLmg+CiAjaW5jbHVkZSA8bGludXgvYXRtYXJwLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+IC8qIGZvciBuZXQvcm91dGUuaCAqLwogI2luY2x1ZGUgPGxpbnV4L2luLmg+IC8qIGZvciBzdHJ1Y3Qgc29ja2FkZHJfaW4gKi8KICNpbmNsdWRlIDxsaW51eC9pZi5oPiAvKiBmb3IgSUZGX1VQICovCmRpZmYgLS1naXQgYS9uZXQvYXRtL2lvY3RsLmMgYi9uZXQvYXRtL2lvY3RsLmMKaW5kZXggYTE1MDE5OC4uZWIxMDlhZiAxMDA2NDQKLS0tIGEvbmV0L2F0bS9pb2N0bC5jCisrKyBiL25ldC9hdG0vaW9jdGwuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2F0bWRldi5oPgogI2luY2x1ZGUgPGxpbnV4L2F0bWNsaXAuaD4JLyogQ0xJUF8qRU5DQVAgKi8KICNpbmNsdWRlIDxsaW51eC9hdG1hcnAuaD4JLyogbWFuaWZlc3QgY29uc3RhbnRzICovCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3NvbmV0Lmg+CS8qIGZvciBpb2N0bHMgKi8KICNpbmNsdWRlIDxsaW51eC9hdG1zdmMuaD4KICNpbmNsdWRlIDxsaW51eC9hdG1tcGMuaD4KZGlmZiAtLWdpdCBhL25ldC9hdG0vbGVjLmMgYi9uZXQvYXRtL2xlYy5jCmluZGV4IGFkODQwYjkuLmM0ZmM3MjIgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vbGVjLmMKKysrIGIvbmV0L2F0bS9sZWMuYwpAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAKIC8qIFdlIGFyZSBldGhlcm5ldCBkZXZpY2UgKi8KICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgpAQCAtMTMyMSw3ICsxMzIyLDcgQEAKICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKICAgICAgICAgc3RydWN0IGxlY19wcml2ICpwcml2ID0gKHN0cnVjdCBsZWNfcHJpdiopZGV2LT5wcml2OwogCi0gICAgICAgIGlmICggbWVtY21wKGxhbl9kc3QsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSAhPSAwICkKKyAgICAgICAgaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihsYW5fZHN0LCBkZXYtPmRldl9hZGRyKSkKICAgICAgICAgICAgICAgICByZXR1cm4gKDApOyAgICAgICAvKiBub3Qgb3VyIG1hYyBhZGRyZXNzICovCiAKICAgICAgICAga2ZyZWUocHJpdi0+dGx2cyk7IC8qIE5VTEwgaWYgdGhlcmUgd2FzIG5vIHByZXZpb3VzIGFzc29jaWF0aW9uICovCkBAIC0xNzk4LDcgKzE3OTksNyBAQAogICAKICAgICAgICAgdG9fcmV0dXJuID0gcHJpdi0+bGVjX2FycF90YWJsZXNbcGxhY2VdOwogICAgICAgICB3aGlsZSh0b19yZXR1cm4pIHsKLSAgICAgICAgICAgICAgICBpZiAobWVtY21wKG1hY19hZGRyLCB0b19yZXR1cm4tPm1hY19hZGRyLCBFVEhfQUxFTikgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICghY29tcGFyZV9ldGhlcl9hZGRyKG1hY19hZGRyLCB0b19yZXR1cm4tPm1hY19hZGRyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvX3JldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdG9fcmV0dXJuID0gdG9fcmV0dXJuLT5uZXh0OwpAQCAtMTgxMSw4ICsxODEyLDcgQEAKIHsKICAgICAgICAgc3RydWN0IGxlY19hcnBfdGFibGUgKnRvX3JldHVybjsKIAotICAgICAgICB0b19yZXR1cm4gPSAoc3RydWN0IGxlY19hcnBfdGFibGUgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGxlY19hcnBfdGFibGUpLAotCQkJCQkJICAgICBHRlBfQVRPTUlDKTsKKyAgICAgICAgdG9fcmV0dXJuID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxlY19hcnBfdGFibGUpLCBHRlBfQVRPTUlDKTsKICAgICAgICAgaWYgKCF0b19yZXR1cm4pIHsKICAgICAgICAgICAgICAgICBwcmludGsoIkxFQzogQXJwIGVudHJ5IGttYWxsb2MgZmFpbGVkXG4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTIwMDIsNyArMjAwMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJpdi0+bWNhc3RfdmNjOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyOiAgLyogTEFORTIgd2FudHMgYXJwIGZvciBtdWx0aWNhc3QgYWRkcmVzc2VzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG1lbWNtcChtYWNfdG9fZmluZCwgYnVzX21hYywgRVRIX0FMRU4pID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihtYWNfdG9fZmluZCwgYnVzX21hYykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcml2LT5tY2FzdF92Y2M7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9tcGMuYyBiL25ldC9hdG0vbXBjLmMKaW5kZXggNTI2ZDk1My4uYzMwNGVmMSAxMDA2NDQKLS0tIGEvbmV0L2F0bS9tcGMuYworKysgYi9uZXQvYXRtL21wYy5jCkBAIC0zLDYgKzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogCiAvKiBXZSBhcmUgYW4gZXRoZXJuZXQgZGV2aWNlICovCkBAIC01NTIsNyArNTUzLDcgQEAKIAkJZ290byBub25faXA7IC8qIE11bHRpLVByb3RvY29sIE92ZXIgQVRNIDotKSAqLwogCiAJd2hpbGUgKGkgPCBtcGMtPm51bWJlcl9vZl9tcHNfbWFjcykgewotCQlpZiAobWVtY21wKGV0aC0+aF9kZXN0LCAobXBjLT5tcHNfbWFjcyArIGkqRVRIX0FMRU4pLCBFVEhfQUxFTikgPT0gMCkKKwkJaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIoZXRoLT5oX2Rlc3QsIChtcGMtPm1wc19tYWNzICsgaSpFVEhfQUxFTikpKQogCQkJaWYgKCBzZW5kX3ZpYV9zaG9ydGN1dChza2IsIG1wYykgPT0gMCApICAgICAgICAgICAvKiB0cnkgc2hvcnRjdXQgKi8KIAkJCQlyZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdWNjZXNzISAgICAgKi8KIAkJaSsrOwpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9wcHBvYXRtLmMgYi9uZXQvYXRtL3BwcG9hdG0uYwppbmRleCA1OGY0YTJiLi4xNDg5MDY3IDEwMDY0NAotLS0gYS9uZXQvYXRtL3BwcG9hdG0uYworKysgYi9uZXQvYXRtL3BwcG9hdG0uYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2F0bS5oPgogI2luY2x1ZGUgPGxpbnV4L2F0bWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9wcHBfZGVmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3BwcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BwcF9jaGFubmVsLmg+CmRpZmYgLS1naXQgYS9uZXQvYXRtL3Jhdy5jIGIvbmV0L2F0bS9yYXcuYwppbmRleCA0YTA0NjZlLi4zZTU3YjE3IDEwMDY0NAotLS0gYS9uZXQvYXRtL3Jhdy5jCisrKyBiL25ldC9hdG0vcmF3LmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9hdG1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KZGlmZiAtLWdpdCBhL25ldC9hdG0vcmVzb3VyY2VzLmMgYi9uZXQvYXRtL3Jlc291cmNlcy5jCmluZGV4IGM4YzQ1OWYuLjIyNDE5MDUgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vcmVzb3VyY2VzLmMKKysrIGIvbmV0L2F0bS9yZXNvdXJjZXMuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPiAvKiBmb3IgYmFycmllciAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CSAvKiBmb3Igc3RydWN0IHNvY2sgKi8KIApkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYWZfYXgyNS5jIGIvbmV0L2F4MjUvYWZfYXgyNS5jCmluZGV4IGU4NzUzYzcuLmRiZjliNDcgMTAwNjQ0Ci0tLSBhL25ldC9heDI1L2FmX2F4MjUuYworKysgYi9uZXQvYXgyNS9hZl9heDI1LmMKQEAgLTE0LDYgKzE0LDcgQEAKICAqIENvcHlyaWdodCAoQykgRnJlZGVyaWMgUmlibGUgRjFPQVQgKGZyaWJsZUB0ZWFzZXIuZnIpCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV9yb3V0ZS5jIGIvbmV0L2F4MjUvYXgyNV9yb3V0ZS5jCmluZGV4IGIxZTk0NWJkLi5mMDRmODYzIDEwMDY0NAotLS0gYS9uZXQvYXgyNS9heDI1X3JvdXRlLmMKKysrIGIvbmV0L2F4MjUvYXgyNV9yb3V0ZS5jCkBAIC0xMSw2ICsxMSw4IEBACiAgKiBDb3B5cmlnaHQgKEMpIEhhbnMtSm9hY2hpbSBIZXRzY2hlciBERDhORSAoZGQ4bmVAYm52LWJhbWJlcmcuZGUpCiAgKiBDb3B5cmlnaHQgKEMpIEZyZWRlcmljIFJpYmxlIEYxT0FUIChmcmlibGVAdGVhc2VyLmZyKQogICovCisKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV91aWQuYyBiL25ldC9heDI1L2F4MjVfdWlkLmMKaW5kZXggZDUzY2M4Ni4uYjhiNTg1NCAxMDA2NDQKLS0tIGEvbmV0L2F4MjUvYXgyNV91aWQuYworKysgYi9uZXQvYXgyNS9heDI1X3VpZC5jCkBAIC02LDYgKzYsOCBAQAogICoKICAqIENvcHlyaWdodCAoQykgSm9uYXRoYW4gTmF5bG9yIEc0S0xYIChnNGtseEBnNGtseC5kZW1vbi5jby51aykKICAqLworCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jCmluZGV4IDY4MmJmMjAuLmNiYjIwYzMgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYwpAQCAtNzUsNyArNzUsNyBAQAogCiAJbGlzdF9mb3JfZWFjaChwLCAmYm5lcF9zZXNzaW9uX2xpc3QpIHsKIAkJcyA9IGxpc3RfZW50cnkocCwgc3RydWN0IGJuZXBfc2Vzc2lvbiwgbGlzdCk7CQotCQlpZiAoIW1lbWNtcChkc3QsIHMtPmVoLmhfc291cmNlLCBFVEhfQUxFTikpCisJCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKGRzdCwgcy0+ZWguaF9zb3VyY2UpKQogCQkJcmV0dXJuIHM7CiAJfQogCXJldHVybiBOVUxMOwpAQCAtNDIwLDEwICs0MjAsMTAgQEAKIAlpdltpbCsrXSA9IChzdHJ1Y3Qga3ZlYykgeyAmdHlwZSwgMSB9OwogCWxlbisrOwogCi0JaWYgKCFtZW1jbXAoZWgtPmhfZGVzdCwgcy0+ZWguaF9zb3VyY2UsIEVUSF9BTEVOKSkKKwlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihlaC0+aF9kZXN0LCBzLT5laC5oX3NvdXJjZSkpCiAJCXR5cGUgfD0gMHgwMTsKIAotCWlmICghbWVtY21wKGVoLT5oX3NvdXJjZSwgcy0+ZWguaF9kZXN0LCBFVEhfQUxFTikpCisJaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIoZWgtPmhfc291cmNlLCBzLT5laC5oX2Rlc3QpKQogCQl0eXBlIHw9IDB4MDI7CiAKIAlpZiAodHlwZSkKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYm5lcC9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvc29jay5jCmluZGV4IGNjYmFmNjkuLjJiZmU3OTYgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvYm5lcC9zb2NrLmMKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL3NvY2suYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9jbXRwL3NvY2suYyBiL25ldC9ibHVldG9vdGgvY210cC9zb2NrLmMKaW5kZXggNWUyMjM0My4uOGY4ZmFkMiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9jbXRwL3NvY2suYworKysgYi9uZXQvYmx1ZXRvb3RoL2NtdHAvc29jay5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMKaW5kZXggYTMxMjQ0ZS4uZjgxMmVkMSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfY29ubi5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYwpAQCAtNDAzLDcgKzQwMyw3IEBACiAKIAlzaXplID0gc2l6ZW9mKHJlcSkgKyByZXEuY29ubl9udW0gKiBzaXplb2YoKmNpKTsKIAotCWlmICghKGNsID0gKHZvaWQgKikga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKSkpCisJaWYgKCEoY2wgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpZiAoIShoZGV2ID0gaGNpX2Rldl9nZXQocmVxLmRldl9pZCkpKSB7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMKaW5kZXggODRlNmM5My4uYmRiNjQ1OCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfc29jay5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oaWRwL3NvY2suYyBiL25ldC9ibHVldG9vdGgvaGlkcC9zb2NrLmMKaW5kZXggOGY4ZGQ5My4uYjhmNjc3NiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oaWRwL3NvY2suYworKysgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvc29jay5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2wyY2FwLmMgYi9uZXQvYmx1ZXRvb3RoL2wyY2FwLmMKaW5kZXggN2YwNzgxZS4uZjZiNGE4MCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9sMmNhcC5jCisrKyBiL25ldC9ibHVldG9vdGgvbDJjYXAuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vdHR5LmMgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS90dHkuYwppbmRleCAxNThhOWM0Li43NDM2OGY3IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS90dHkuYworKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS90dHkuYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R0eV9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgogCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KIApAQCAtNDgwLDEzICs0ODEsOCBAQAogCUJUX0RCRygiZGxjICVwIHR0eSAlcCBsZW4gJWQiLCBkbGMsIHR0eSwgc2tiLT5sZW4pOwogCiAJaWYgKHRlc3RfYml0KFRUWV9ET05UX0ZMSVAsICZ0dHktPmZsYWdzKSkgewotCQlyZWdpc3RlciBpbnQgaTsKLQkJZm9yIChpID0gMDsgaSA8IHNrYi0+bGVuOyBpKyspIHsKLQkJCWlmICh0dHktPmZsaXAuY291bnQgPj0gVFRZX0ZMSVBCVUZfU0laRSkKLQkJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCi0JCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIHNrYi0+ZGF0YVtpXSwgMCk7Ci0JCX0KKwkJdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBza2ItPmxlbik7CisJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKIAl9IGVsc2UKIAkJdHR5LT5sZGlzYy5yZWNlaXZlX2J1Zih0dHksIHNrYi0+ZGF0YSwgTlVMTCwgc2tiLT5sZW4pOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9pb2N0bC5jIGIvbmV0L2JyaWRnZS9icl9pb2N0bC5jCmluZGV4IGI4Y2UxNGIuLjE1OWZiODQgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfaW9jdGwuYworKysgYi9uZXQvYnJpZGdlL2JyX2lvY3RsLmMKQEAgLTEzLDYgKzEzLDcgQEAKICAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9icmlkZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfc3lzZnNfYnIuYyBiL25ldC9icmlkZ2UvYnJfc3lzZnNfYnIuYwppbmRleCA5OGNmNTNjLi42ZjU3N2YxIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX3N5c2ZzX2JyLmMKKysrIGIvbmV0L2JyaWRnZS9icl9zeXNmc19ici5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYnJpZGdlLmg+CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3N5c2ZzX2lmLmMgYi9uZXQvYnJpZGdlL2JyX3N5c2ZzX2lmLmMKaW5kZXggMmViZGMyMy4uMGFjMDM1NSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9zeXNmc19pZi5jCisrKyBiL25ldC9icmlkZ2UvYnJfc3lzZnNfaWYuYwpAQCAtMTEsNiArMTEsNyBAQAogICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2JyaWRnZS5oPgpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2lwLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfaXAuYwppbmRleCA3MzIzODA1Li5kYzVkMGIyIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfaXAuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfaXAuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIApAQCAtNTEsNiArNTIsOCBAQAogCQlpZiAoIShpbmZvLT5iaXRtYXNrICYgRUJUX0lQX0RQT1JUKSAmJgogCQkgICAgIShpbmZvLT5iaXRtYXNrICYgRUJUX0lQX1NQT1JUKSkKIAkJCXJldHVybiBFQlRfTUFUQ0g7CisJCWlmIChudG9ocyhpaC0+ZnJhZ19vZmYpICYgSVBfT0ZGU0VUKQorCQkJcmV0dXJuIEVCVF9OT01BVENIOwogCQlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaWgtPmlobCo0LAogCQkJCQkgIHNpemVvZihfcG9ydHMpLCAmX3BvcnRzKTsKIAkJaWYgKHBwdHIgPT0gTlVMTCkKQEAgLTg5LDcgKzkyLDkgQEAKIAkJaWYgKGluZm8tPmludmZsYWdzICYgRUJUX0lQX1BST1RPKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmIChpbmZvLT5wcm90b2NvbCAhPSBJUFBST1RPX1RDUCAmJgotCQkgICAgaW5mby0+cHJvdG9jb2wgIT0gSVBQUk9UT19VRFApCisJCSAgICBpbmZvLT5wcm90b2NvbCAhPSBJUFBST1RPX1VEUCAmJgorCQkgICAgaW5mby0+cHJvdG9jb2wgIT0gSVBQUk9UT19TQ1RQICYmCisJCSAgICBpbmZvLT5wcm90b2NvbCAhPSBJUFBST1RPX0RDQ1ApCiAJCQkgcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0lQX0RQT1JUICYmIGluZm8tPmRwb3J0WzBdID4gaW5mby0+ZHBvcnRbMV0pCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMKaW5kZXggOWY2ZTAxOS4uMDEyOGZiYiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xvZy5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCkBAIC05NCw3ICs5NSw5IEBACiAJCSAgICAgICAidG9zPTB4JTAyWCwgSVAgcHJvdG89JWQiLCBOSVBRVUFEKGloLT5zYWRkciksCiAJCSAgICAgICBOSVBRVUFEKGloLT5kYWRkciksIGloLT50b3MsIGloLT5wcm90b2NvbCk7CiAJCWlmIChpaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1AgfHwKLQkJICAgIGloLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgeworCQkgICAgaWgtPnByb3RvY29sID09IElQUFJPVE9fVURQIHx8CisJCSAgICBpaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19TQ1RQIHx8CisJCSAgICBpaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19EQ0NQKSB7CiAJCQlzdHJ1Y3QgdGNwdWRwaGRyIF9wb3J0cywgKnBwdHI7CiAKIAkJCXBwdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpaC0+aWhsKjQsCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfc3RwLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfc3RwLmMKaW5kZXggZjhhOGNkZS4uMDI0OGM2NyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3N0cC5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9zdHAuYwpAQCAtMTAsNiArMTAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3N0cC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgQlBEVV9UWVBFX0NPTkZJRyAwCkBAIC0xNjQsOCArMTY1LDggQEAKIAlpZiAoZGF0YWxlbiAhPSBsZW4pCiAJCXJldHVybiAtRUlOVkFMOwogCS8qIE1ha2Ugc3VyZSB0aGUgbWF0Y2ggb25seSByZWNlaXZlcyBzdHAgZnJhbWVzICovCi0JaWYgKG1lbWNtcChlLT5kZXN0bWFjLCBicmlkZ2VfdWxhLCBFVEhfQUxFTikgfHwKLQkgICAgbWVtY21wKGUtPmRlc3Rtc2ssIG1zaywgRVRIX0FMRU4pIHx8ICEoZS0+Yml0bWFzayAmIEVCVF9ERVNUTUFDKSkKKwlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKGUtPmRlc3RtYWMsIGJyaWRnZV91bGEpIHx8CisJICAgIGNvbXBhcmVfZXRoZXJfYWRkcihlLT5kZXN0bXNrLCBtc2spIHx8ICEoZS0+Yml0bWFzayAmIEVCVF9ERVNUTUFDKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVzLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlcy5jCmluZGV4IGY4ZmZiZjYuLjAwNzI5YjMgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVzLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZXMuYwpAQCAtOTQ0LDcgKzk0NCw3IEBACiAJaWYgKGNvdW50ZXJzaXplKQogCQltZW1zZXQobmV3aW5mby0+Y291bnRlcnMsIDAsIGNvdW50ZXJzaXplKTsKIAotCW5ld2luZm8tPmVudHJpZXMgPSAoY2hhciAqKXZtYWxsb2ModG1wLmVudHJpZXNfc2l6ZSk7CisJbmV3aW5mby0+ZW50cmllcyA9IHZtYWxsb2ModG1wLmVudHJpZXNfc2l6ZSk7CiAJaWYgKCFuZXdpbmZvLT5lbnRyaWVzKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZnJlZV9uZXdpbmZvOwpAQCAtMTE0Niw3ICsxMTQ2LDcgQEAKIAlpZiAoIW5ld2luZm8pCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbmV3aW5mby0+ZW50cmllcyA9IChjaGFyICopdm1hbGxvYyh0YWJsZS0+dGFibGUtPmVudHJpZXNfc2l6ZSk7CisJbmV3aW5mby0+ZW50cmllcyA9IHZtYWxsb2ModGFibGUtPnRhYmxlLT5lbnRyaWVzX3NpemUpOwogCWlmICghKG5ld2luZm8tPmVudHJpZXMpKQogCQlnb3RvIGZyZWVfbmV3aW5mbzsKIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZGV2LmMgYi9uZXQvY29yZS9kZXYuYwppbmRleCA1MDgxMjg3Li5mZDA3MGEwIDEwMDY0NAotLS0gYS9uZXQvY29yZS9kZXYuYworKysgYi9uZXQvY29yZS9kZXYuYwpAQCAtNzUsNiArNzUsNyBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtMTA5MiwxNSArMTA5MywxMiBAQAogCQkJZ290byBvdXQ7CiAJfQogCi0JaWYgKG9mZnNldCA+IChpbnQpc2tiLT5sZW4pCi0JCUJVRygpOworCUJVR19PTihvZmZzZXQgPiAoaW50KXNrYi0+bGVuKTsKIAljc3VtID0gc2tiX2NoZWNrc3VtKHNrYiwgb2Zmc2V0LCBza2ItPmxlbi1vZmZzZXQsIDApOwogCiAJb2Zmc2V0ID0gc2tiLT50YWlsIC0gc2tiLT5oLnJhdzsKLQlpZiAob2Zmc2V0IDw9IDApCi0JCUJVRygpOwotCWlmIChza2ItPmNzdW0gKyAyID4gb2Zmc2V0KQotCQlCVUcoKTsKKwlCVUdfT04ob2Zmc2V0IDw9IDApOworCUJVR19PTihza2ItPmNzdW0gKyAyID4gb2Zmc2V0KTsKIAogCSoodTE2Kikoc2tiLT5oLnJhdyArIHNrYi0+Y3N1bSkgPSBjc3VtX2ZvbGQoY3N1bSk7CiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZGV2X21jYXN0LmMgYi9uZXQvY29yZS9kZXZfbWNhc3QuYwppbmRleCBjYjUzMGVlLi4wNWQ2MDg1MCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGV2X21jYXN0LmMKKysrIGIvbmV0L2NvcmUvZGV2X21jYXN0LmMKQEAgLTE1OCw3ICsxNTgsNyBAQAogCWludCBlcnIgPSAwOwogCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pLCAqZG1pMTsKIAotCWRtaTEgPSAoc3RydWN0IGRldl9tY19saXN0ICopa21hbGxvYyhzaXplb2YoKmRtaSksIEdGUF9BVE9NSUMpOworCWRtaTEgPSBrbWFsbG9jKHNpemVvZigqZG1pKSwgR0ZQX0FUT01JQyk7CiAKIAlzcGluX2xvY2tfYmgoJmRldi0+eG1pdF9sb2NrKTsKIAlmb3IgKGRtaSA9IGRldi0+bWNfbGlzdDsgZG1pICE9IE5VTEw7IGRtaSA9IGRtaS0+bmV4dCkgewpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZHYuYyBiL25ldC9jb3JlL2R2LmMKaW5kZXggM2YyNWY0YS4uY2Y1ODE0MCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZHYuYworKysgYi9uZXQvY29yZS9kdi5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bmV0L2RzdC5oPgpAQCAtNDU3LDcgKzQ1OCw3IEBACiAJdW5zaWduZWQgY2hhcgkJCSpza2JfZGF0YV9lbmQgPSBza2ItPmRhdGEgKyBza2ItPmxlbjsKIAogCS8qIFBhY2tldCBpcyBhbHJlYWR5IGFpbWVkIGF0IHVzLCByZXR1cm4gKi8KLQlpZiAoIW1lbWNtcChldGgsIHNrYi0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pKQorCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKGV0aC0+aF9kZXN0LCBza2ItPmRldi0+ZGV2X2FkZHIpKQogCQlyZXR1cm47CiAJCiAJLyogcHJvdG8gaXMgbm90IElQLCBkbyBub3RoaW5nICovCmRpZmYgLS1naXQgYS9uZXQvY29yZS9ldGh0b29sLmMgYi9uZXQvY29yZS9ldGh0b29sLmMKaW5kZXggMDM1MDU4Ni4uZTZmNzYxMCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZXRodG9vbC5jCisrKyBiL25ldC9jb3JlL2V0aHRvb2wuYwpAQCAtMTEsNiArMTEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9uZXQvY29yZS9maWx0ZXIuYyBiL25ldC9jb3JlL2ZpbHRlci5jCmluZGV4IDllYjlkMDAuLjk1NDA5NDYgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2ZpbHRlci5jCisrKyBiL25ldC9jb3JlL2ZpbHRlci5jCkBAIC03NCw3ICs3NCw2IEBACiAgKiBmaWx0ZXJpbmcsIGZpbHRlciBpcyB0aGUgYXJyYXkgb2YgZmlsdGVyIGluc3RydWN0aW9ucywgYW5kCiAgKiBsZW4gaXMgdGhlIG51bWJlciBvZiBmaWx0ZXIgYmxvY2tzIGluIHRoZSBhcnJheS4KICAqLwotIAogdW5zaWduZWQgaW50IHNrX3J1bl9maWx0ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNvY2tfZmlsdGVyICpmaWx0ZXIsIGludCBmbGVuKQogewogCXN0cnVjdCBzb2NrX2ZpbHRlciAqZmVudHJ5OwkvKiBXZSB3YWxrIGRvd24gdGhlc2UgKi8KQEAgLTE3NSw3ICsxNzQsNyBAQAogCQkJY29udGludWU7CiAJCWNhc2UgQlBGX0xEfEJQRl9XfEJQRl9BQlM6CiAJCQlrID0gZmVudHJ5LT5rOwotIGxvYWRfdzoKK2xvYWRfdzoKIAkJCXB0ciA9IGxvYWRfcG9pbnRlcihza2IsIGssIDQsICZ0bXApOwogCQkJaWYgKHB0ciAhPSBOVUxMKSB7CiAJCQkJQSA9IG50b2hsKCoodTMyICopcHRyKTsKQEAgLTE4NCw3ICsxODMsNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgQlBGX0xEfEJQRl9IfEJQRl9BQlM6CiAJCQlrID0gZmVudHJ5LT5rOwotIGxvYWRfaDoKK2xvYWRfaDoKIAkJCXB0ciA9IGxvYWRfcG9pbnRlcihza2IsIGssIDIsICZ0bXApOwogCQkJaWYgKHB0ciAhPSBOVUxMKSB7CiAJCQkJQSA9IG50b2hzKCoodTE2ICopcHRyKTsKQEAgLTI4Nyw3ICsyODYsOSBAQAogICogbm8gcmVmZXJlbmNlcyBvciBqdW1wcyB0aGF0IGFyZSBvdXQgb2YgcmFuZ2UsIG5vIGlsbGVnYWwKICAqIGluc3RydWN0aW9ucywgYW5kIG11c3QgZW5kIHdpdGggYSBSRVQgaW5zdHJ1Y3Rpb24uCiAgKgotICogUmV0dXJucyAwIGlmIHRoZSBydWxlIHNldCBpcyBsZWdhbCBvciBhIG5lZ2F0aXZlIGVycm5vIGNvZGUgaWYgbm90LgorICogQWxsIGp1bXBzIGFyZSBmb3J3YXJkIGFzIHRoZXkgYXJlIG5vdCBzaWduZWQuCisgKgorICogUmV0dXJucyAwIGlmIHRoZSBydWxlIHNldCBpcyBsZWdhbCBvciAtRUlOVkFMIGlmIG5vdC4KICAqLwogaW50IHNrX2Noa19maWx0ZXIoc3RydWN0IHNvY2tfZmlsdGVyICpmaWx0ZXIsIGludCBmbGVuKQogewpAQCAtMjk5LDcgKzMwMCw2IEBACiAKIAkvKiBjaGVjayB0aGUgZmlsdGVyIGNvZGUgbm93ICovCiAJZm9yIChwYyA9IDA7IHBjIDwgZmxlbjsgcGMrKykgewotCQkvKiBhbGwganVtcHMgYXJlIGZvcndhcmQgYXMgdGhleSBhcmUgbm90IHNpZ25lZCAqLwogCQlmdGVzdCA9ICZmaWx0ZXJbcGNdOwogCiAJCS8qIE9ubHkgYWxsb3cgdmFsaWQgaW5zdHJ1Y3Rpb25zICovCkBAIC0zNzMsNyArMzczLDcgQEAKIAkJY2FzZSBCUEZfSk1QfEJQRl9KU0VUfEJQRl9LOgogCQljYXNlIEJQRl9KTVB8QlBGX0pTRVR8QlBGX1g6CiAJCQkvKiBmb3IgY29uZGl0aW9uYWxzIGJvdGggbXVzdCBiZSBzYWZlICovCi0gCQkJaWYgKHBjICsgZnRlc3QtPmp0ICsgMSA+PSBmbGVuIHx8CisJCQlpZiAocGMgKyBmdGVzdC0+anQgKyAxID49IGZsZW4gfHwKIAkJCSAgICBwYyArIGZ0ZXN0LT5qZiArIDEgPj0gZmxlbikKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCWJyZWFrOwpAQCAtMzgzLDEyICszODMsNyBAQAogCQl9CiAJfQogCi0JLyoKLQkgKiBUaGUgcHJvZ3JhbSBtdXN0IGVuZCB3aXRoIGEgcmV0dXJuLiBXZSBkb24ndCBjYXJlIHdoZXJlIHRoZXkKLQkgKiBqdW1wZWQgd2l0aGluIHRoZSBzY3JpcHQgKGl0cyBhbHdheXMgZm9yd2FyZHMpIGJ1dCBpbiB0aGUgZW5kCi0JICogdGhleSBfd2lsbF8gaGl0IHRoaXMuCi0JICovCi0gICAgICAgIHJldHVybiAoQlBGX0NMQVNTKGZpbHRlcltmbGVuIC0gMV0uY29kZSkgPT0gQlBGX1JFVCkgPyAwIDogLUVJTlZBTDsKKwlyZXR1cm4gKEJQRl9DTEFTUyhmaWx0ZXJbZmxlbiAtIDFdLmNvZGUpID09IEJQRl9SRVQpID8gMCA6IC1FSU5WQUw7CiB9CiAKIC8qKgpAQCAtNDA4LDggKzQwMyw4IEBACiAJaW50IGVycjsKIAogCS8qIE1ha2Ugc3VyZSBuZXcgZmlsdGVyIGlzIHRoZXJlIGFuZCBpbiB0aGUgcmlnaHQgYW1vdW50cy4gKi8KLSAgICAgICAgaWYgKGZwcm9nLT5maWx0ZXIgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwlpZiAoZnByb2ctPmZpbHRlciA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWZwID0gc29ja19rbWFsbG9jKHNrLCBmc2l6ZStzaXplb2YoKmZwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmcCkKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldC1zeXNmcy5jIGIvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKaW5kZXggZTFkYTgxZC4uZThiMmFjYiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKKysrIGIvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKQEAgLTksNiArOSw3IEBACiAgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CkBAIC0xNiw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CiAKICNkZWZpbmUgdG9fY2xhc3NfZGV2KG9iaikgY29udGFpbmVyX29mKG9iaixzdHJ1Y3QgY2xhc3NfZGV2aWNlLGtvYmopCiAjZGVmaW5lIHRvX25ldF9kZXYoY2xhc3MpIGNvbnRhaW5lcl9vZihjbGFzcywgc3RydWN0IG5ldF9kZXZpY2UsIGNsYXNzX2RldikKQEAgLTI5NCwxMyArMjk2LDE5IEBACiAJCQkJCSAgICAgICBjaGFyICopKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB0b19uZXRfZGV2KGNkKTsKLQljb25zdCBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqaXc7CisJY29uc3Qgc3RydWN0IGl3X3N0YXRpc3RpY3MgKml3ID0gTlVMTDsKIAlzc2l6ZV90IHJldCA9IC1FSU5WQUw7CiAJCiAJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKLQlpZiAoZGV2X2lzYWxpdmUoZGV2KSAmJiBkZXYtPmdldF93aXJlbGVzc19zdGF0cyAKLQkgICAgJiYgKGl3ID0gZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMoZGV2KSkgIT0gTlVMTCkgCi0JCXJldCA9ICgqZm9ybWF0KShpdywgYnVmKTsKKwlpZiAoZGV2X2lzYWxpdmUoZGV2KSkgeworCQlpZihkZXYtPndpcmVsZXNzX2hhbmRsZXJzICYmCisJCSAgIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPmdldF93aXJlbGVzc19zdGF0cykKKwkJCWl3ID0gZGV2LT53aXJlbGVzc19oYW5kbGVycy0+Z2V0X3dpcmVsZXNzX3N0YXRzKGRldik7CisJCWVsc2UgaWYgKGRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzKQorCQkJaXcgPSBkZXYtPmdldF93aXJlbGVzc19zdGF0cyhkZXYpOworCQlpZiAoaXcgIT0gTlVMTCkKKwkJCXJldCA9ICgqZm9ybWF0KShpdywgYnVmKTsKKwl9CiAJcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOwogCiAJcmV0dXJuIHJldDsKQEAgLTQwMiw3ICs0MTAsOCBAQAogCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsYXNzX2Rldi0+a29iaiwgJm5ldHN0YXRfZ3JvdXApOwogCiAjaWZkZWYgV0lSRUxFU1NfRVhUCi0JaWYgKG5ldC0+Z2V0X3dpcmVsZXNzX3N0YXRzKQorCWlmIChuZXQtPmdldF93aXJlbGVzc19zdGF0cyB8fCAobmV0LT53aXJlbGVzc19oYW5kbGVycyAmJgorCQkJbmV0LT53aXJlbGVzc19oYW5kbGVycy0+Z2V0X3dpcmVsZXNzX3N0YXRzKSkKIAkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGFzc19kZXYtPmtvYmosICZ3aXJlbGVzc19ncm91cCk7CiAjZW5kaWYKIAljbGFzc19kZXZpY2VfZGVsKGNsYXNzX2Rldik7CkBAIC00MjcsMTAgKzQzNiwxMiBAQAogCQlnb3RvIG91dF91bnJlZzsgCiAKICNpZmRlZiBXSVJFTEVTU19FWFQKLQlpZiAobmV0LT5nZXRfd2lyZWxlc3Nfc3RhdHMgJiYKLQkgICAgKHJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xhc3NfZGV2LT5rb2JqLCAmd2lyZWxlc3NfZ3JvdXApKSkKLQkJZ290byBvdXRfY2xlYW51cDsgCi0KKwlpZiAobmV0LT5nZXRfd2lyZWxlc3Nfc3RhdHMgfHwgKG5ldC0+d2lyZWxlc3NfaGFuZGxlcnMgJiYKKwkJCW5ldC0+d2lyZWxlc3NfaGFuZGxlcnMtPmdldF93aXJlbGVzc19zdGF0cykpIHsKKwkJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGFzc19kZXYtPmtvYmosICZ3aXJlbGVzc19ncm91cCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF9jbGVhbnVwOworCX0KIAlyZXR1cm4gMDsKIG91dF9jbGVhbnVwOgogCWlmIChuZXQtPmdldF9zdGF0cykKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldHBvbGwuYyBiL25ldC9jb3JlL25ldHBvbGwuYwppbmRleCAyODFhNjMyLi5lYTUxZjhkIDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZXRwb2xsLmMKKysrIGIvbmV0L2NvcmUvbmV0cG9sbC5jCkBAIC03MDMsNyArNzAzLDcgQEAKIAkJfQogCX0KIAotCWlmICghbWVtY21wKG5wLT5sb2NhbF9tYWMsICJcMFwwXDBcMFwwXDAiLCA2KSAmJiBuZGV2LT5kZXZfYWRkcikKKwlpZiAoaXNfemVyb19ldGhlcl9hZGRyKG5wLT5sb2NhbF9tYWMpICYmIG5kZXYtPmRldl9hZGRyKQogCQltZW1jcHkobnAtPmxvY2FsX21hYywgbmRldi0+ZGV2X2FkZHIsIDYpOwogCiAJaWYgKCFucC0+bG9jYWxfaXApIHsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3BrdGdlbi5jIGIvbmV0L2NvcmUvcGt0Z2VuLmMKaW5kZXggNjMxMDU2ZC4uZGExNmY4ZiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvcGt0Z2VuLmMKKysrIGIvbmV0L2NvcmUvcGt0Z2VuLmMKQEAgLTExNiwxMyArMTE2LDEzIEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTEzOSw2ICsxMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CkBAIC0yODEsOCArMjgyLDggQEAKICAgICAgICAgX191MzIgc3JjX21hY19jb3VudDsgLyogSG93IG1hbnkgTUFDcyB0byBpdGVyYXRlIHRocm91Z2ggKi8KICAgICAgICAgX191MzIgZHN0X21hY19jb3VudDsgLyogSG93IG1hbnkgTUFDcyB0byBpdGVyYXRlIHRocm91Z2ggKi8KICAgICAgICAgCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgZHN0X21hY1s2XTsKLSAgICAgICAgdW5zaWduZWQgY2hhciBzcmNfbWFjWzZdOworICAgICAgICB1bnNpZ25lZCBjaGFyIGRzdF9tYWNbRVRIX0FMRU5dOworICAgICAgICB1bnNpZ25lZCBjaGFyIHNyY19tYWNbRVRIX0FMRU5dOwogICAgICAgICAKICAgICAgICAgX191MzIgY3VyX2RzdF9tYWNfb2Zmc2V0OwogICAgICAgICBfX3UzMiBjdXJfc3JjX21hY19vZmZzZXQ7CkBAIC01OTQsMTYgKzU5NSw5IEBACiAKIAlzZXFfcHV0cyhzZXEsICIgICAgIHNyY19tYWM6ICIpOwogCi0JaWYgKChwa3RfZGV2LT5zcmNfbWFjWzBdID09IDApICYmIAotCSAgICAocGt0X2Rldi0+c3JjX21hY1sxXSA9PSAwKSAmJiAKLQkgICAgKHBrdF9kZXYtPnNyY19tYWNbMl0gPT0gMCkgJiYgCi0JICAgIChwa3RfZGV2LT5zcmNfbWFjWzNdID09IDApICYmIAotCSAgICAocGt0X2Rldi0+c3JjX21hY1s0XSA9PSAwKSAmJiAKLQkgICAgKHBrdF9kZXYtPnNyY19tYWNbNV0gPT0gMCkpIAotCisJaWYgKGlzX3plcm9fZXRoZXJfYWRkcihwa3RfZGV2LT5zcmNfbWFjKSkKIAkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgCiAJCQlzZXFfcHJpbnRmKHNlcSwgICIlMDJYJXMiLCBwa3RfZGV2LT5vZGV2LT5kZXZfYWRkcltpXSwgaSA9PSA1ID8gIiAgIiA6ICI6Iik7Ci0KIAllbHNlIAogCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSAKIAkJCXNlcV9wcmludGYoc2VxLCAgIiUwMlglcyIsIHBrdF9kZXYtPnNyY19tYWNbaV0sIGkgPT0gNSA/ICIgICIgOiAiOiIpOwpAQCAtMTE4OSw5ICsxMTgzLDkgQEAKIAl9CiAJaWYgKCFzdHJjbXAobmFtZSwgImRzdF9tYWMiKSkgewogCQljaGFyICp2ID0gdmFsc3RyOwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgb2xkX2RtYWNbNl07CisJCXVuc2lnbmVkIGNoYXIgb2xkX2RtYWNbRVRIX0FMRU5dOwogCQl1bnNpZ25lZCBjaGFyICptID0gcGt0X2Rldi0+ZHN0X21hYzsKLSAgICAgICAgICAgICAgICBtZW1jcHkob2xkX2RtYWMsIHBrdF9kZXYtPmRzdF9tYWMsIDYpOworCQltZW1jcHkob2xkX2RtYWMsIHBrdF9kZXYtPmRzdF9tYWMsIEVUSF9BTEVOKTsKICAgICAgICAgICAgICAgICAKIAkJbGVuID0gc3Rybl9sZW4oJnVzZXJfYnVmZmVyW2ldLCBzaXplb2YodmFsc3RyKSAtIDEpOwogICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KQEAgLTEyMjAsOCArMTIxNCw4IEBACiAJCX0KIAogCQkvKiBTZXQgdXAgRGVzdCBNQUMgKi8KLSAgICAgICAgICAgICAgICBpZiAobWVtY21wKG9sZF9kbWFjLCBwa3RfZGV2LT5kc3RfbWFjLCA2KSAhPSAwKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmKHBrdF9kZXYtPmhoWzBdKSwgcGt0X2Rldi0+ZHN0X21hYywgNik7CisJCWlmIChjb21wYXJlX2V0aGVyX2FkZHIob2xkX2RtYWMsIHBrdF9kZXYtPmRzdF9tYWMpKQorCQkJbWVtY3B5KCYocGt0X2Rldi0+aGhbMF0pLCBwa3RfZGV2LT5kc3RfbWFjLCBFVEhfQUxFTik7CiAgICAgICAgICAgICAgICAgCiAJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGRzdG1hYyIpOwogCQlyZXR1cm4gY291bnQ7CkBAIC0xNTYwLDE3ICsxNTU0LDExIEBACiAgICAgICAgIAogICAgICAgICAvKiBEZWZhdWx0IHRvIHRoZSBpbnRlcmZhY2UncyBtYWMgaWYgbm90IGV4cGxpY2l0bHkgc2V0LiAqLwogCi0JaWYgKChwa3RfZGV2LT5zcmNfbWFjWzBdID09IDApICYmIAotCSAgICAocGt0X2Rldi0+c3JjX21hY1sxXSA9PSAwKSAmJiAKLQkgICAgKHBrdF9kZXYtPnNyY19tYWNbMl0gPT0gMCkgJiYgCi0JICAgIChwa3RfZGV2LT5zcmNfbWFjWzNdID09IDApICYmIAotCSAgICAocGt0X2Rldi0+c3JjX21hY1s0XSA9PSAwKSAmJiAKLQkgICAgKHBrdF9kZXYtPnNyY19tYWNbNV0gPT0gMCkpIHsKKwlpZiAoaXNfemVyb19ldGhlcl9hZGRyKHBrdF9kZXYtPnNyY19tYWMpKQorCSAgICAgICBtZW1jcHkoJihwa3RfZGV2LT5oaFs2XSksIHBrdF9kZXYtPm9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CiAKLQkgICAgICAgbWVtY3B5KCYocGt0X2Rldi0+aGhbNl0pLCBwa3RfZGV2LT5vZGV2LT5kZXZfYWRkciwgNik7Ci0gICAgICAgfQogICAgICAgICAvKiBTZXQgdXAgRGVzdCBNQUMgKi8KLSAgICAgICAgbWVtY3B5KCYocGt0X2Rldi0+aGhbMF0pLCBwa3RfZGV2LT5kc3RfbWFjLCA2KTsKKwltZW1jcHkoJihwa3RfZGV2LT5oaFswXSksIHBrdF9kZXYtPmRzdF9tYWMsIEVUSF9BTEVOKTsKIAogICAgICAgICAvKiBTZXQgdXAgcGt0IHNpemUgKi8KICAgICAgICAgcGt0X2Rldi0+Y3VyX3BrdF9zaXplID0gcGt0X2Rldi0+bWluX3BrdF9zaXplOwpAQCAtMTg3MiwxMyArMTg2MCwxNCBAQAogCSAqLwogCW1vZF9jdXJfaGVhZGVycyhwa3RfZGV2KTsKIAotCXNrYiA9IGFsbG9jX3NrYihwa3RfZGV2LT5jdXJfcGt0X3NpemUgKyA2NCArIDE2LCBHRlBfQVRPTUlDKTsKKwlkYXRhbGVuID0gKG9kZXYtPmhhcmRfaGVhZGVyX2xlbiArIDE2KSAmIH4weGY7CisJc2tiID0gYWxsb2Nfc2tiKHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZSArIDY0ICsgZGF0YWxlbiwgR0ZQX0FUT01JQyk7CiAJaWYgKCFza2IpIHsKIAkJc3ByaW50Zihwa3RfZGV2LT5yZXN1bHQsICJObyBtZW1vcnkiKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0Jc2tiX3Jlc2VydmUoc2tiLCAxNik7CisJc2tiX3Jlc2VydmUoc2tiLCBkYXRhbGVuKTsKIAogCS8qICBSZXNlcnZlIGZvciBldGhlcm5ldCBhbmQgSVAgaGVhZGVyICAqLwogCWV0aCA9IChfX3U4ICopIHNrYl9wdXNoKHNrYiwgMTQpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc2NtLmMgYi9uZXQvY29yZS9zY20uYwppbmRleCBlODg3ZDE5Li42NDlkMDFlIDEwMDY0NAotLS0gYS9uZXQvY29yZS9zY20uYworKysgYi9uZXQvY29yZS9zY20uYwpAQCAtMTEsNiArMTEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc2tidWZmLmMgYi9uZXQvY29yZS9za2J1ZmYuYwppbmRleCAwNzBmOTFjLi5kMDczMmU5IDEwMDY0NAotLS0gYS9uZXQvY29yZS9za2J1ZmYuYworKysgYi9uZXQvY29yZS9za2J1ZmYuYwpAQCAtNzkxLDggKzc5MSw3IEBACiAJCWludCBlbmQgPSBvZmZzZXQgKyBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CiAJCWlmIChlbmQgPiBsZW4pIHsKIAkJCWlmIChza2JfY2xvbmVkKHNrYikpIHsKLQkJCQlpZiAoIXJlYWxsb2MpCi0JCQkJCUJVRygpOworCQkJCUJVR19PTighcmVhbGxvYyk7CiAJCQkJaWYgKHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLCBHRlBfQVRPTUlDKSkKIAkJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CkBAIC04OTQsOCArODkzLDcgQEAKIAkJc3RydWN0IHNrX2J1ZmYgKmluc3AgPSBOVUxMOwogCiAJCWRvIHsKLQkJCWlmICghbGlzdCkKLQkJCQlCVUcoKTsKKwkJCUJVR19PTighbGlzdCk7CiAKIAkJCWlmIChsaXN0LT5sZW4gPD0gZWF0KSB7CiAJCQkJLyogRWF0ZW4gYXMgd2hvbGUuICovCkBAIC0xMTk5LDggKzExOTcsNyBAQAogCQkJc3RhcnQgPSBlbmQ7CiAJCX0KIAl9Ci0JaWYgKGxlbikKLQkJQlVHKCk7CisJQlVHX09OKGxlbik7CiAKIAlyZXR1cm4gY3N1bTsKIH0KQEAgLTEyODIsOCArMTI3OSw3IEBACiAJCQlzdGFydCA9IGVuZDsKIAkJfQogCX0KLQlpZiAobGVuKQotCQlCVUcoKTsKKwlCVUdfT04obGVuKTsKIAlyZXR1cm4gY3N1bTsKIH0KIApAQCAtMTI5Nyw4ICsxMjkzLDcgQEAKIAllbHNlCiAJCWNzc3RhcnQgPSBza2JfaGVhZGxlbihza2IpOwogCi0JaWYgKGNzc3RhcnQgPiBza2JfaGVhZGxlbihza2IpKQotCQlCVUcoKTsKKwlCVUdfT04oY3NzdGFydCA+IHNrYl9oZWFkbGVuKHNrYikpOwogCiAJbWVtY3B5KHRvLCBza2ItPmRhdGEsIGNzc3RhcnQpOwogCmRpZmYgLS1naXQgYS9uZXQvY29yZS9zb2NrLmMgYi9uZXQvY29yZS9zb2NrLmMKaW5kZXggNjQ2NWIwZS4uNmUwMDgxMSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc29jay5jCisrKyBiL25ldC9jb3JlL3NvY2suYwpAQCAtOTEsNiArOTEsNyBAQAogICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CmRpZmYgLS1naXQgYS9uZXQvY29yZS93aXJlbGVzcy5jIGIvbmV0L2NvcmUvd2lyZWxlc3MuYwppbmRleCAyNzFkZGIzLi4yYWRkN2VkIDEwMDY0NAotLS0gYS9uZXQvY29yZS93aXJlbGVzcy5jCisrKyBiL25ldC9jb3JlL3dpcmVsZXNzLmMKQEAgLTc4LDYgKzc4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4JCQkvKiBmb3IgX19pbml0ICovCiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CQkvKiBBUlBIUkRfRVRIRVIgKi8KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgkJLyogY29tcGFyZV9ldGhlcl9hZGRyICovCiAKICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgkJLyogUHJldHR5IG9idmlvdXMgKi8KICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgkJLyogTmV3IGRyaXZlciBBUEkgKi8KQEAgLTE1MDYsNyArMTUwNyw3IEBACiAKIAkvKiBVcGRhdGUgYWxsIHJlY29yZHMgdGhhdCBtYXRjaCAqLwogCWZvcihpID0gMDsgaSA8IHNweWRhdGEtPnNweV9udW1iZXI7IGkrKykKLQkJaWYoIW1lbWNtcChhZGRyZXNzLCBzcHlkYXRhLT5zcHlfYWRkcmVzc1tpXSwgRVRIX0FMRU4pKSB7CisJCWlmKCFjb21wYXJlX2V0aGVyX2FkZHIoYWRkcmVzcywgc3B5ZGF0YS0+c3B5X2FkZHJlc3NbaV0pKSB7CiAJCQltZW1jcHkoJihzcHlkYXRhLT5zcHlfc3RhdFtpXSksIHdzdGF0cywKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpKTsKIAkJCW1hdGNoID0gaTsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2Fja3ZlYy5jIGIvbmV0L2RjY3AvYWNrdmVjLmMKaW5kZXggY2U5Y2I3Ny4uMmM3N2RhZiAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvYWNrdmVjLmMKKysrIGIvbmV0L2RjY3AvYWNrdmVjLmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogCQkJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgc3RhdGUpCiB7CiAJdW5zaWduZWQgaW50IGdhcDsKLQlzaWduZWQgbG9uZyBuZXdfaGVhZDsKKwlsb25nIG5ld19oZWFkOwogCiAJaWYgKGF2LT5kY2NwYXZfdmVjX2xlbiArIHBhY2tldHMgPiBhdi0+ZGNjcGF2X2J1Zl9sZW4pCiAJCXJldHVybiAtRU5PQlVGUzsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2lwdjQuYyBiL25ldC9kY2NwL2lwdjQuYwppbmRleCAzZjI0NDY3Li4wMGY5ODMyIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9pcHY0LmMKKysrIGIvbmV0L2RjY3AvaXB2NC5jCkBAIC05ODYsNiArOTg2LDcgQEAKIAogCWlmICgheGZybTRfcG9saWN5X2NoZWNrKHNrLCBYRlJNX1BPTElDWV9JTiwgc2tiKSkKIAkJZ290byBkaXNjYXJkX2FuZF9yZWxzZTsKKwluZl9yZXNldChza2IpOwogCiAJcmV0dXJuIHNrX3JlY2VpdmVfc2tiKHNrLCBza2IpOwogCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9pcHY2LmMgYi9uZXQvZGNjcC9pcHY2LmMKaW5kZXggYzYwOWRjNy4uZGYwNzQyNSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvaXB2Ni5jCisrKyBiL25ldC9kY2NwL2lwdjYuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CiAjaW5jbHVkZSA8bmV0L3RyYW5zcF92Ni5oPgorI2luY2x1ZGUgPG5ldC9pcDZfY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxuZXQveGZybS5oPgogCiAjaW5jbHVkZSAiZGNjcC5oIgpAQCAtMTAyOCw3ICsxMDI5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkY2NwX3Y2X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCAqbmhvZmZwKQorc3RhdGljIGludCBkY2NwX3Y2X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpCiB7CiAJY29uc3Qgc3RydWN0IGRjY3BfaGRyICpkaDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnBza2I7CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2FmX2RlY25ldC5jIGIvbmV0L2RlY25ldC9hZl9kZWNuZXQuYwppbmRleCA3OGVjNTM0Li5jZTRhYWY5IDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2FmX2RlY25ldC5jCisrKyBiL25ldC9kZWNuZXQvYWZfZGVjbmV0LmMKQEAgLTEyMiw2ICsxMjIsNyBAQAogI2luY2x1ZGUgPG5ldC9mbG93Lmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX2Rldi5jIGIvbmV0L2RlY25ldC9kbl9kZXYuYwppbmRleCA1NjEwYmIxLi5lZmJlYWQ4IDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX2Rldi5jCisrKyBiL25ldC9kZWNuZXQvZG5fZGV2LmMKQEAgLTI1LDYgKzI1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9uZXRmaWx0ZXIvZG5fcnRtc2cuYyBiL25ldC9kZWNuZXQvbmV0ZmlsdGVyL2RuX3J0bXNnLmMKaW5kZXggMWFiOTRjNi4uMTZhNWEzMSAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9uZXRmaWx0ZXIvZG5fcnRtc2cuYworKysgYi9uZXQvZGVjbmV0L25ldGZpbHRlci9kbl9ydG1zZy5jCkBAIC0yNiw4ICsyNiw2IEBACiAjaW5jbHVkZSA8bmV0L2RuLmg+CiAjaW5jbHVkZSA8bmV0L2RuX3JvdXRlLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfZGVjbmV0Lmg+Ci0KIHN0YXRpYyBzdHJ1Y3Qgc29jayAqZG5ybWcgPSBOVUxMOwogCiAKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfd2VwLmMKaW5kZXggMDczYWViZC4uZjhkY2EzMSAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfd2VwLmMKKysrIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfd2VwLmMKQEAgLTc1LDIyICs3NSwxNCBAQAogCWtmcmVlKHByaXYpOwogfQogCi0vKiBQZXJmb3JtIFdFUCBlbmNyeXB0aW9uIG9uIGdpdmVuIHNrYiB0aGF0IGhhcyBhdCBsZWFzdCA0IGJ5dGVzIG9mIGhlYWRyb29tCi0gKiBmb3IgSVYgYW5kIDQgYnl0ZXMgb2YgdGFpbHJvb20gZm9yIElDVi4gQm90aCBJViBhbmQgSUNWIHdpbGwgYmUgdHJhbnNtaXR0ZWQsCi0gKiBzbyB0aGUgcGF5bG9hZCBsZW5ndGggaW5jcmVhc2VzIHdpdGggOCBieXRlcy4KLSAqCi0gKiBXRVAgZnJhbWUgcGF5bG9hZDogSVYgKyBUWCBrZXkgaWR4LCBSQzQoZGF0YSksIElDViA9IFJDNChDUkMzMihkYXRhKSkKLSAqLwotc3RhdGljIGludCBwcmlzbTJfd2VwX2VuY3J5cHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCisvKiBBZGQgV0VQIElWL2tleSBpbmZvIHRvIGEgZnJhbWUgdGhhdCBoYXMgYXQgbGVhc3QgNCBieXRlcyBvZiBoZWFkcm9vbSAqLworc3RhdGljIGludCBwcmlzbTJfd2VwX2J1aWxkX2l2KHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQogewogCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKndlcCA9IHByaXY7Ci0JdTMyIGNyYywga2xlbiwgbGVuOwotCXU4IGtleVtXRVBfS0VZX0xFTiArIDNdOwotCXU4ICpwb3MsICppY3Y7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0IHNnOwotCi0JaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgNCB8fCBza2JfdGFpbHJvb20oc2tiKSA8IDQgfHwKLQkgICAgc2tiLT5sZW4gPCBoZHJfbGVuKQorCXUzMiBrbGVuLCBsZW47CisJdTggKnBvczsKKwkKKwlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCA0IHx8IHNrYi0+bGVuIDwgaGRyX2xlbikKIAkJcmV0dXJuIC0xOwogCiAJbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuOwpAQCAtMTEyLDE1ICsxMDQsNDcgQEAKIAl9CiAKIAkvKiBQcmVwZW5kIDI0LWJpdCBJViB0byBSQzQga2V5IGFuZCBUWCBmcmFtZSAqLwotCSpwb3MrKyA9IGtleVswXSA9ICh3ZXAtPml2ID4+IDE2KSAmIDB4ZmY7Ci0JKnBvcysrID0ga2V5WzFdID0gKHdlcC0+aXYgPj4gOCkgJiAweGZmOwotCSpwb3MrKyA9IGtleVsyXSA9IHdlcC0+aXYgJiAweGZmOworCSpwb3MrKyA9ICh3ZXAtPml2ID4+IDE2KSAmIDB4ZmY7CisJKnBvcysrID0gKHdlcC0+aXYgPj4gOCkgJiAweGZmOworCSpwb3MrKyA9IHdlcC0+aXYgJiAweGZmOwogCSpwb3MrKyA9IHdlcC0+a2V5X2lkeCA8PCA2OwogCisJcmV0dXJuIDA7Cit9CisKKy8qIFBlcmZvcm0gV0VQIGVuY3J5cHRpb24gb24gZ2l2ZW4gc2tiIHRoYXQgaGFzIGF0IGxlYXN0IDQgYnl0ZXMgb2YgaGVhZHJvb20KKyAqIGZvciBJViBhbmQgNCBieXRlcyBvZiB0YWlscm9vbSBmb3IgSUNWLiBCb3RoIElWIGFuZCBJQ1Ygd2lsbCBiZSB0cmFuc21pdHRlZCwKKyAqIHNvIHRoZSBwYXlsb2FkIGxlbmd0aCBpbmNyZWFzZXMgd2l0aCA4IGJ5dGVzLgorICoKKyAqIFdFUCBmcmFtZSBwYXlsb2FkOiBJViArIFRYIGtleSBpZHgsIFJDNChkYXRhKSwgSUNWID0gUkM0KENSQzMyKGRhdGEpKQorICovCitzdGF0aWMgaW50IHByaXNtMl93ZXBfZW5jcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICp3ZXAgPSBwcml2OworCXUzMiBjcmMsIGtsZW4sIGxlbjsKKwl1OCAqcG9zLCAqaWN2OworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKwl1OCBrZXlbV0VQX0tFWV9MRU4gKyAzXTsKKworCS8qIG90aGVyIGNoZWNrcyBhcmUgaW4gcHJpc20yX3dlcF9idWlsZF9pdiAqLworCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IDQpCisJCXJldHVybiAtMTsKKwkKKwkvKiBhZGQgdGhlIElWIHRvIHRoZSBmcmFtZSAqLworCWlmIChwcmlzbTJfd2VwX2J1aWxkX2l2KHNrYiwgaGRyX2xlbiwgcHJpdikpCisJCXJldHVybiAtMTsKKwkKKwkvKiBDb3B5IHRoZSBJViBpbnRvIHRoZSBmaXJzdCAzIGJ5dGVzIG9mIHRoZSBrZXkgKi8KKwltZW1jcHkoa2V5LCBza2ItPmRhdGEgKyBoZHJfbGVuLCAzKTsKKwogCS8qIENvcHkgcmVzdCBvZiB0aGUgV0VQIGtleSAodGhlIHNlY3JldCBwYXJ0KSAqLwogCW1lbWNweShrZXkgKyAzLCB3ZXAtPmtleSwgd2VwLT5rZXlfbGVuKTsKKwkKKwlsZW4gPSBza2ItPmxlbiAtIGhkcl9sZW4gLSA0OworCXBvcyA9IHNrYi0+ZGF0YSArIGhkcl9sZW4gKyA0OworCWtsZW4gPSAzICsgd2VwLT5rZXlfbGVuOwogCi0JLyogQXBwZW5kIGxpdHRsZS1lbmRpYW4gQ1JDMzIgYW5kIGVuY3J5cHQgaXQgdG8gcHJvZHVjZSBJQ1YgKi8KKwkvKiBBcHBlbmQgbGl0dGxlLWVuZGlhbiBDUkMzMiBvdmVyIG9ubHkgdGhlIGRhdGEgYW5kIGVuY3J5cHQgaXQgdG8gcHJvZHVjZSBJQ1YgKi8KIAljcmMgPSB+Y3JjMzJfbGUofjAsIHBvcywgbGVuKTsKIAlpY3YgPSBza2JfcHV0KHNrYiwgNCk7CiAJaWN2WzBdID0gY3JjOwpAQCAtMjMxLDYgKzI1NSw3IEBACiAJLm5hbWUgPSAiV0VQIiwKIAkuaW5pdCA9IHByaXNtMl93ZXBfaW5pdCwKIAkuZGVpbml0ID0gcHJpc20yX3dlcF9kZWluaXQsCisJLmJ1aWxkX2l2ID0gcHJpc20yX3dlcF9idWlsZF9pdiwKIAkuZW5jcnlwdF9tcGR1ID0gcHJpc20yX3dlcF9lbmNyeXB0LAogCS5kZWNyeXB0X21wZHUgPSBwcmlzbTJfd2VwX2RlY3J5cHQsCiAJLmVuY3J5cHRfbXNkdSA9IE5VTEwsCmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCmluZGV4IDMyMTI4N2IuLjkwZDE4YjcgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCisrKyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCkBAIC02Miw3ICs2Miw3IEBACiBNT0RVTEVfQVVUSE9SKERSVl9DT1BZUklHSFQpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1zdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfbmV0d29ya3NfYWxsb2NhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCitzdGF0aWMgaW50IGllZWU4MDIxMV9uZXR3b3Jrc19hbGxvY2F0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlpZiAoaWVlZS0+bmV0d29ya3MpCiAJCXJldHVybiAwOwpAQCAtOTAsNyArOTAsNyBAQAogCWllZWUtPm5ldHdvcmtzID0gTlVMTDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9uZXR3b3Jrc19pbml0aWFsaXplKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX25ldHdvcmtzX2luaXRpYWxpemUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJaW50IGk7CiAKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCmluZGV4IDRjYzZmNDEuLjdhMTIxODAgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKKysrIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpAQCAtMzUsNyArMzUsNyBAQAogCiAjaW5jbHVkZSA8bmV0L2llZWU4MDIxMS5oPgogCi1zdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX21vbml0b3Jfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfbW9uaXRvcl9yeChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKIAkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMpCiB7CkBAIC03Niw4ICs3Niw4IEBACiAKIAkJaWYgKGVudHJ5LT5za2IgIT0gTlVMTCAmJiBlbnRyeS0+c2VxID09IHNlcSAmJgogCQkgICAgKGVudHJ5LT5sYXN0X2ZyYWcgKyAxID09IGZyYWcgfHwgZnJhZyA9PSAtMSkgJiYKLQkJICAgIG1lbWNtcChlbnRyeS0+c3JjX2FkZHIsIHNyYywgRVRIX0FMRU4pID09IDAgJiYKLQkJICAgIG1lbWNtcChlbnRyeS0+ZHN0X2FkZHIsIGRzdCwgRVRIX0FMRU4pID09IDApCisJCSAgICAhY29tcGFyZV9ldGhlcl9hZGRyKGVudHJ5LT5zcmNfYWRkciwgc3JjKSAmJgorCQkgICAgIWNvbXBhcmVfZXRoZXJfYWRkcihlbnRyeS0+ZHN0X2FkZHIsIGRzdCkpCiAJCQlyZXR1cm4gZW50cnk7CiAJfQogCkBAIC0xNjUsNyArMTY1LDcgQEAKICAqIFJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyBtYW5hZ2VtZW50IGNvbnRyb2wgZnJhbWVzCiAgKgogICogQ2FsbGVkIGJ5IGllZWU4MDIxMV9yeCAqLwotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbnQKIGllZWU4MDIxMV9yeF9mcmFtZV9tZ210KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMsIHUxNiB0eXBlLAogCQkJdTE2IHN0eXBlKQpAQCAtMjQzLDEyICsyNDMsMTIgQEAKIAkvKiBjaGVjayB0aGF0IHRoZSBmcmFtZSBpcyB1bmljYXN0IGZyYW1lIHRvIHVzICovCiAJaWYgKChmYyAmIChJRUVFODAyMTFfRkNUTF9UT0RTIHwgSUVFRTgwMjExX0ZDVExfRlJPTURTKSkgPT0KIAkgICAgSUVFRTgwMjExX0ZDVExfVE9EUyAmJgotCSAgICBtZW1jbXAoaGRyLT5hZGRyMSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pID09IDAgJiYKLQkgICAgbWVtY21wKGhkci0+YWRkcjMsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSA9PSAwKSB7CisJICAgICFjb21wYXJlX2V0aGVyX2FkZHIoaGRyLT5hZGRyMSwgZGV2LT5kZXZfYWRkcikgJiYKKwkgICAgIWNvbXBhcmVfZXRoZXJfYWRkcihoZHItPmFkZHIzLCBkZXYtPmRldl9hZGRyKSkgewogCQkvKiBUb0RTIGZyYW1lIHdpdGggb3duIGFkZHIgQlNTSUQgYW5kIERBICovCiAJfSBlbHNlIGlmICgoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09CiAJCSAgIElFRUU4MDIxMV9GQ1RMX0ZST01EUyAmJgotCQkgICBtZW1jbXAoaGRyLT5hZGRyMSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pID09IDApIHsKKwkJICAgIWNvbXBhcmVfZXRoZXJfYWRkcihoZHItPmFkZHIxLCBkZXYtPmRldl9hZGRyKSkgewogCQkvKiBGcm9tRFMgZnJhbWUgd2l0aCBvd24gYWRkciBhcyBEQSAqLwogCX0gZWxzZQogCQlyZXR1cm4gMDsKQEAgLTI2Niw3ICsyNjYsNyBAQAogfQogCiAvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSksIGJ5IGllZWU4MDIxMV9yeCAqLwotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbnQKIGllZWU4MDIxMV9yeF9mcmFtZV9kZWNyeXB0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCkKIHsKQEAgLTI5Nyw3ICsyOTcsNyBAQAogfQogCiAvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSksIGJ5IGllZWU4MDIxMV9yeCAqLwotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbnQKIGllZWU4MDIxMV9yeF9mcmFtZV9kZWNyeXB0X21zZHUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCiAJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGtleWlkeCwKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0KQpAQCAtNTA1LDcgKzUwNSw3IEBACiAJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIgJiYgIXdkcyAmJgogCSAgICAoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09CiAJICAgIElFRUU4MDIxMV9GQ1RMX0ZST01EUyAmJiBpZWVlLT5zdGFkZXYKLQkgICAgJiYgbWVtY21wKGhkci0+YWRkcjIsIGllZWUtPmFzc29jX2FwX2FkZHIsIEVUSF9BTEVOKSA9PSAwKSB7CisJICAgICYmICFjb21wYXJlX2V0aGVyX2FkZHIoaGRyLT5hZGRyMiwgaWVlZS0+YXNzb2NfYXBfYWRkcikpIHsKIAkJLyogRnJhbWUgZnJvbSBCU1NJRCBvZiB0aGUgQVAgZm9yIHdoaWNoIHdlIGFyZSBhIGNsaWVudCAqLwogCQlza2ItPmRldiA9IGRldiA9IGllZWUtPnN0YWRldjsKIAkJc3RhdHMgPSBob3N0YXBfZ2V0X3N0YXRzKGRldik7CkBAIC0xMTU2LDcgKzExNTYsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfbmV0d29ya19pbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlCitzdGF0aWMgaW50IGllZWU4MDIxMV9uZXR3b3JrX2luaXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UKIAkJCQkJICpiZWFjb24sCiAJCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmssCiAJCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cykKQEAgLTEyMzEsMTEgKzEyMzEsMTEgQEAKIAkgKiBhcyBvbmUgbmV0d29yayAqLwogCXJldHVybiAoKHNyYy0+c3NpZF9sZW4gPT0gZHN0LT5zc2lkX2xlbikgJiYKIAkJKHNyYy0+Y2hhbm5lbCA9PSBkc3QtPmNoYW5uZWwpICYmCi0JCSFtZW1jbXAoc3JjLT5ic3NpZCwgZHN0LT5ic3NpZCwgRVRIX0FMRU4pICYmCisJCSFjb21wYXJlX2V0aGVyX2FkZHIoc3JjLT5ic3NpZCwgZHN0LT5ic3NpZCkgJiYKIAkJIW1lbWNtcChzcmMtPnNzaWQsIGRzdC0+c3NpZCwgc3JjLT5zc2lkX2xlbikpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX25ldHdvcmsoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpkc3QsCitzdGF0aWMgdm9pZCB1cGRhdGVfbmV0d29yayhzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmRzdCwKIAkJCQkgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqc3JjKQogewogCWludCBxb3NfYWN0aXZlOwpAQCAtMTI5NCw3ICsxMjk0LDcgQEAKIAlyZXR1cm4gKFdMQU5fRkNfR0VUX1NUWVBFKGxlMTZfdG9fY3B1KGZjKSkgPT0gSUVFRTgwMjExX1NUWVBFX0JFQUNPTik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfcHJvY2Vzc19wcm9iZV9yZXNwb25zZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZQorc3RhdGljIHZvaWQgaWVlZTgwMjExX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2Uoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UKIAkJCQkJCSAgICAqaWVlZSwgc3RydWN0CiAJCQkJCQkgICAgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlCiAJCQkJCQkgICAgKmJlYWNvbiwgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cwpkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKaW5kZXggNDQ1ZjIwNi4uOGZkZDk0MyAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYworKysgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIHN0YXRpYyB1OCBQODAyXzFIX09VSVtQODAyMTFfT1VJX0xFTl0gPSB7IDB4MDAsIDB4MDAsIDB4ZjggfTsKIHN0YXRpYyB1OCBSRkMxMDQyX09VSVtQODAyMTFfT1VJX0xFTl0gPSB7IDB4MDAsIDB4MDAsIDB4MDAgfTsKIAotc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX2NvcHlfc25hcCh1OCAqIGRhdGEsIHUxNiBoX3Byb3RvKQorc3RhdGljIGludCBpZWVlODAyMTFfY29weV9zbmFwKHU4ICogZGF0YSwgdTE2IGhfcHJvdG8pCiB7CiAJc3RydWN0IGllZWU4MDIxMV9zbmFwX2hkciAqc25hcDsKIAl1OCAqb3VpOwpAQCAtMTUwLDcgKzE1MCw3IEBACiAJcmV0dXJuIFNOQVBfU0laRSArIHNpemVvZih1MTYpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfZW5jcnlwdF9mcmFnbWVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCiAJCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKmZyYWcsIGludCBoZHJfbGVuKQogewogCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQgPSBpZWVlLT5jcnlwdFtpZWVlLT50eF9rZXlpZHhdOwpAQCAtMjg4LDcgKzI4OCw3IEBACiAJLyogRGV0ZXJtaW5lIHRvdGFsIGFtb3VudCBvZiBzdG9yYWdlIHJlcXVpcmVkIGZvciBUWEIgcGFja2V0cyAqLwogCWJ5dGVzID0gc2tiLT5sZW4gKyBTTkFQX1NJWkUgKyBzaXplb2YodTE2KTsKIAotCWlmIChob3N0X2VuY3J5cHQpCisJaWYgKGhvc3RfZW5jcnlwdCB8fCBob3N0X2J1aWxkX2l2KQogCQlmYyA9IElFRUU4MDIxMV9GVFlQRV9EQVRBIHwgSUVFRTgwMjExX1NUWVBFX0RBVEEgfAogCQkgICAgSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEOwogCWVsc2UKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCmluZGV4IDE4MTc1NWYuLjIzZTE2MzAgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMKKysrIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwpAQCAtNDIsNyArNDIsNyBAQAogfTsKIAogI2RlZmluZSBNQVhfQ1VTVE9NX0xFTiA2NAotc3RhdGljIGlubGluZSBjaGFyICppcHcyMTAwX3RyYW5zbGF0ZV9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorc3RhdGljIGNoYXIgKmlwdzIxMDBfdHJhbnNsYXRlX3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCiAJCQkJCSAgIGNoYXIgKnN0YXJ0LCBjaGFyICpzdG9wLAogCQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmspCiB7CkBAIC0yODQsNyArMjg0LDcgQEAKIAl9OwogCWludCBpLCBrZXksIGtleV9wcm92aWRlZCwgbGVuOwogCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKmNyeXB0OwotCWludCBob3N0X2NyeXB0byA9IGllZWUtPmhvc3RfZW5jcnlwdCB8fCBpZWVlLT5ob3N0X2RlY3J5cHQ7CisJaW50IGhvc3RfY3J5cHRvID0gaWVlZS0+aG9zdF9lbmNyeXB0IHx8IGllZWUtPmhvc3RfZGVjcnlwdCB8fCBpZWVlLT5ob3N0X2J1aWxkX2l2OwogCiAJSUVFRTgwMjExX0RFQlVHX1dYKCJTRVRfRU5DT0RFXG4iKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvTWFrZWZpbGUgYi9uZXQvaXB2NC9NYWtlZmlsZQppbmRleCBjNTRlZGQ3Li4zNWU1ZjU5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9NYWtlZmlsZQorKysgYi9uZXQvaXB2NC9NYWtlZmlsZQpAQCAtOSw3ICs5LDcgQEAKIAkgICAgIHRjcC5vIHRjcF9pbnB1dC5vIHRjcF9vdXRwdXQubyB0Y3BfdGltZXIubyB0Y3BfaXB2NC5vIFwKIAkgICAgIHRjcF9taW5pc29ja3MubyB0Y3BfY29uZy5vIFwKIAkgICAgIGRhdGFncmFtLm8gcmF3Lm8gdWRwLm8gYXJwLm8gaWNtcC5vIGRldmluZXQubyBhZl9pbmV0Lm8gaWdtcC5vIFwKLQkgICAgIHN5c2N0bF9uZXRfaXB2NC5vIGZpYl9mcm9udGVuZC5vIGZpYl9zZW1hbnRpY3MubyBuZXRmaWx0ZXIubworCSAgICAgc3lzY3RsX25ldF9pcHY0Lm8gZmliX2Zyb250ZW5kLm8gZmliX3NlbWFudGljcy5vCiAKIG9iai0kKENPTkZJR19JUF9GSUJfSEFTSCkgKz0gZmliX2hhc2gubwogb2JqLSQoQ09ORklHX0lQX0ZJQl9UUklFKSArPSBmaWJfdHJpZS5vCkBAIC0yOCw3ICsyOCw3IEBACiBvYmotJChDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX1JBTkRPTSkgKz0gbXVsdGlwYXRoX3JhbmRvbS5vCiBvYmotJChDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX1dSQU5ET00pICs9IG11bHRpcGF0aF93cmFuZG9tLm8KIG9iai0kKENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfRFJSKSArPSBtdWx0aXBhdGhfZHJyLm8KLW9iai0kKENPTkZJR19ORVRGSUxURVIpCSs9IG5ldGZpbHRlci8KK29iai0kKENPTkZJR19ORVRGSUxURVIpCSs9IG5ldGZpbHRlci5vIG5ldGZpbHRlci8KIG9iai0kKENPTkZJR19JUF9WUykgKz0gaXB2cy8KIG9iai0kKENPTkZJR19JTkVUX0RJQUcpICs9IGluZXRfZGlhZy5vIAogb2JqLSQoQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSF9DQUNIRUQpICs9IG11bHRpcGF0aC5vCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9hZl9pbmV0LmMgYi9uZXQvaXB2NC9hZl9pbmV0LmMKaW5kZXggOTY2YTA3MS4uOTdjMjc2ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvYWZfaW5ldC5jCisrKyBiL25ldC9pcHY0L2FmX2luZXQuYwpAQCAtNzksNiArNzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvYXJwLmMgYi9uZXQvaXB2NC9hcnAuYwppbmRleCAzNzQzMjA4Li5hY2NkZWZlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9hcnAuYworKysgYi9uZXQvaXB2NC9hcnAuYwpAQCAtNzksNiArNzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2RldmluZXQuYyBiL25ldC9pcHY0L2RldmluZXQuYwppbmRleCA3YjliYjI4Li45NWI5ZDgxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9kZXZpbmV0LmMKKysrIGIvbmV0L2lwdjQvZGV2aW5ldC5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfZnJvbnRlbmQuYyBiL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jCmluZGV4IDE4ZjVlNTAuLjRlM2QzODEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jCisrKyBiL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTI4OCwxMyArMjg5LDEzIEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGk9MTsgaTw9UlRBX01BWDsgaSsrKSB7Ci0JCXN0cnVjdCBydGF0dHIgKmF0dHIgPSBydGFbaS0xXTsKKwlmb3IgKGk9MTsgaTw9UlRBX01BWDsgaSsrLCBydGErKykgeworCQlzdHJ1Y3QgcnRhdHRyICphdHRyID0gKnJ0YTsKIAkJaWYgKGF0dHIpIHsKIAkJCWlmIChSVEFfUEFZTE9BRChhdHRyKSA8IDQpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlpZiAoaSAhPSBSVEFfTVVMVElQQVRIICYmIGkgIT0gUlRBX01FVFJJQ1MpCi0JCQkJcnRhW2ktMV0gPSAoc3RydWN0IHJ0YXR0ciopUlRBX0RBVEEoYXR0cik7CisJCQkJKnJ0YSA9IChzdHJ1Y3QgcnRhdHRyKilSVEFfREFUQShhdHRyKTsKIAkJfQogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ljbXAuYyBiL25ldC9pcHY0L2ljbXAuYwppbmRleCBiZTVhNTE5Li4xMDUwMzllIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pY21wLmMKKysrIGIvbmV0L2lwdjQvaWNtcC5jCkBAIC04OTksOCArODk5LDcgQEAKIAkJdTMyIF9tYXNrLCAqbXA7CiAKIAkJbXAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCAwLCBzaXplb2YoX21hc2spLCAmX21hc2spOwotCQlpZiAobXAgPT0gTlVMTCkKLQkJCUJVRygpOworCQlCVUdfT04obXAgPT0gTlVMTCk7CiAJCWZvciAoaWZhID0gaW5fZGV2LT5pZmFfbGlzdDsgaWZhOyBpZmEgPSBpZmEtPmlmYV9uZXh0KSB7CiAJCQlpZiAoKm1wID09IGlmYS0+aWZhX21hc2sgJiYKIAkJCSAgICBpbmV0X2lmYV9tYXRjaChydC0+cnRfc3JjLCBpZmEpKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaWdtcC5jIGIvbmV0L2lwdjQvaWdtcC5jCmluZGV4IDM0NzU4MTEuLmQ4Y2U3MTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lnbXAuYworKysgYi9uZXQvaXB2NC9pZ21wLmMKQEAgLTIzMyw3ICsyMzMsMTggQEAKIAljYXNlIElHTVBWM19NT0RFX0lTX0VYQ0xVREU6CiAJCWlmIChnZGVsZXRlZCB8fCBzZGVsZXRlZCkKIAkJCXJldHVybiAwOwotCQlyZXR1cm4gIShwbWMtPmdzcXVlcnkgJiYgIXBzZi0+c2ZfZ3NyZXNwKTsKKwkJaWYgKCEocG1jLT5nc3F1ZXJ5ICYmICFwc2YtPnNmX2dzcmVzcCkpIHsKKwkJCWlmIChwbWMtPnNmbW9kZSA9PSBNQ0FTVF9JTkNMVURFKQorCQkJCXJldHVybiAxOworCQkJLyogZG9uJ3QgaW5jbHVkZSBpZiB0aGlzIHNvdXJjZSBpcyBleGNsdWRlZAorCQkJICogaW4gYWxsIGZpbHRlcnMKKwkJCSAqLworCQkJaWYgKHBzZi0+c2ZfY291bnRbTUNBU1RfSU5DTFVERV0pCisJCQkJcmV0dXJuIHR5cGUgPT0gSUdNUFYzX01PREVfSVNfSU5DTFVERTsKKwkJCXJldHVybiBwbWMtPnNmY291bnRbTUNBU1RfRVhDTFVERV0gPT0KKwkJCQlwc2YtPnNmX2NvdW50W01DQVNUX0VYQ0xVREVdOworCQl9CisJCXJldHVybiAwOwogCWNhc2UgSUdNUFYzX0NIQU5HRV9UT19JTkNMVURFOgogCQlpZiAoZ2RlbGV0ZWQgfHwgc2RlbGV0ZWQpCiAJCQlyZXR1cm4gMDsKQEAgLTM4NSw3ICszOTYsNyBAQAogCXN0cnVjdCBpZ21wdjNfcmVwb3J0ICpwaWg7CiAJc3RydWN0IGlnbXB2M19ncmVjICpwZ3IgPSBOVUxMOwogCXN0cnVjdCBpcF9zZl9saXN0ICpwc2YsICpwc2ZfbmV4dCwgKnBzZl9wcmV2LCAqKnBzZl9saXN0OwotCWludCBzY291bnQsIGZpcnN0LCBpc3F1ZXJ5LCB0cnVuY2F0ZTsKKwlpbnQgc2NvdW50LCBzdG90YWwsIGZpcnN0LCBpc3F1ZXJ5LCB0cnVuY2F0ZTsKIAogCWlmIChwbWMtPm11bHRpYWRkciA9PSBJR01QX0FMTF9IT1NUUykKIAkJcmV0dXJuIHNrYjsKQEAgLTM5NSwyNSArNDA2LDEzIEBACiAJdHJ1bmNhdGUgPSB0eXBlID09IElHTVBWM19NT0RFX0lTX0VYQ0xVREUgfHwKIAkJICAgIHR5cGUgPT0gSUdNUFYzX0NIQU5HRV9UT19FWENMVURFOwogCisJc3RvdGFsID0gc2NvdW50ID0gMDsKKwogCXBzZl9saXN0ID0gc2RlbGV0ZWQgPyAmcG1jLT50b21iIDogJnBtYy0+c291cmNlczsKIAotCWlmICghKnBzZl9saXN0KSB7Ci0JCWlmICh0eXBlID09IElHTVBWM19BTExPV19ORVdfU09VUkNFUyB8fAotCQkgICAgdHlwZSA9PSBJR01QVjNfQkxPQ0tfT0xEX1NPVVJDRVMpCi0JCQlyZXR1cm4gc2tiOwotCQlpZiAocG1jLT5jcmNvdW50IHx8IGlzcXVlcnkpIHsKLQkJCS8qIG1ha2Ugc3VyZSB3ZSBoYXZlIHJvb20gZm9yIGdyb3VwIGhlYWRlciBhbmQgYXQKLQkJCSAqIGxlYXN0IG9uZSBzb3VyY2UuCi0JCQkgKi8KLQkJCWlmIChza2IgJiYgQVZBSUxBQkxFKHNrYikgPCBzaXplb2Yoc3RydWN0IGlnbXB2M19ncmVjKSsKLQkJCSAgICBzaXplb2YoX191MzIpKSB7Ci0JCQkJaWdtcHYzX3NlbmRwYWNrKHNrYik7Ci0JCQkJc2tiID0gTlVMTDsgLyogYWRkX2dyaGVhZCB3aWxsIGdldCBhIG5ldyBvbmUgKi8KLQkJCX0KLQkJCXNrYiA9IGFkZF9ncmhlYWQoc2tiLCBwbWMsIHR5cGUsICZwZ3IpOwotCQl9Ci0JCXJldHVybiBza2I7Ci0JfQorCWlmICghKnBzZl9saXN0KQorCQlnb3RvIGVtcHR5X3NvdXJjZTsKKwogCXBpaCA9IHNrYiA/IChzdHJ1Y3QgaWdtcHYzX3JlcG9ydCAqKXNrYi0+aC5pZ21waCA6IE5VTEw7CiAKIAkvKiBFWCBhbmQgVE9fRVggZ2V0IGEgZnJlc2ggcGFja2V0LCBpZiBuZWVkZWQgKi8KQEAgLTQyNiw3ICs0MjUsNiBAQAogCQl9CiAJfQogCWZpcnN0ID0gMTsKLQlzY291bnQgPSAwOwogCXBzZl9wcmV2ID0gTlVMTDsKIAlmb3IgKHBzZj0qcHNmX2xpc3Q7IHBzZjsgcHNmPXBzZl9uZXh0KSB7CiAJCXUzMiAqcHNyYzsKQEAgLTQ2MCw3ICs0NTgsNyBAQAogCQl9CiAJCXBzcmMgPSAodTMyICopc2tiX3B1dChza2IsIHNpemVvZih1MzIpKTsKIAkJKnBzcmMgPSBwc2YtPnNmX2luYWRkcjsKLQkJc2NvdW50Kys7CisJCXNjb3VudCsrOyBzdG90YWwrKzsKIAkJaWYgKCh0eXBlID09IElHTVBWM19BTExPV19ORVdfU09VUkNFUyB8fAogCQkgICAgIHR5cGUgPT0gSUdNUFYzX0JMT0NLX09MRF9TT1VSQ0VTKSAmJiBwc2YtPnNmX2NyY291bnQpIHsKIAkJCXBzZi0+c2ZfY3Jjb3VudC0tOwpAQCAtNDc1LDYgKzQ3MywyMSBAQAogCQl9CiAJCXBzZl9wcmV2ID0gcHNmOwogCX0KKworZW1wdHlfc291cmNlOgorCWlmICghc3RvdGFsKSB7CisJCWlmICh0eXBlID09IElHTVBWM19BTExPV19ORVdfU09VUkNFUyB8fAorCQkgICAgdHlwZSA9PSBJR01QVjNfQkxPQ0tfT0xEX1NPVVJDRVMpCisJCQlyZXR1cm4gc2tiOworCQlpZiAocG1jLT5jcmNvdW50IHx8IGlzcXVlcnkpIHsKKwkJCS8qIG1ha2Ugc3VyZSB3ZSBoYXZlIHJvb20gZm9yIGdyb3VwIGhlYWRlciAqLworCQkJaWYgKHNrYiAmJiBBVkFJTEFCTEUoc2tiKTxzaXplb2Yoc3RydWN0IGlnbXB2M19ncmVjKSkgeworCQkJCWlnbXB2M19zZW5kcGFjayhza2IpOworCQkJCXNrYiA9IE5VTEw7IC8qIGFkZF9ncmhlYWQgd2lsbCBnZXQgYSBuZXcgb25lICovCisJCQl9CisJCQlza2IgPSBhZGRfZ3JoZWFkKHNrYiwgcG1jLCB0eXBlLCAmcGdyKTsKKwkJfQorCX0KIAlpZiAocGdyKQogCQlwZ3ItPmdyZWNfbnNyY3MgPSBodG9ucyhzY291bnQpOwogCkBAIC01NTcsMTEgKzU3MCwxMSBAQAogCQkJc2tiID0gYWRkX2dyZWMoc2tiLCBwbWMsIGR0eXBlLCAxLCAxKTsKIAkJfQogCQlpZiAocG1jLT5jcmNvdW50KSB7Ci0JCQlwbWMtPmNyY291bnQtLTsKIAkJCWlmIChwbWMtPnNmbW9kZSA9PSBNQ0FTVF9FWENMVURFKSB7CiAJCQkJdHlwZSA9IElHTVBWM19DSEFOR0VfVE9fSU5DTFVERTsKIAkJCQlza2IgPSBhZGRfZ3JlYyhza2IsIHBtYywgdHlwZSwgMSwgMCk7CiAJCQl9CisJCQlwbWMtPmNyY291bnQtLTsKIAkJCWlmIChwbWMtPmNyY291bnQgPT0gMCkgewogCQkJCWlnbXB2M19jbGVhcl96ZXJvcygmcG1jLT50b21iKTsKIAkJCQlpZ21wdjNfY2xlYXJfemVyb3MoJnBtYy0+c291cmNlcyk7CkBAIC01OTQsMTIgKzYwNywxMiBAQAogCiAJCS8qIGZpbHRlciBtb2RlIGNoYW5nZXMgKi8KIAkJaWYgKHBtYy0+Y3Jjb3VudCkgewotCQkJcG1jLT5jcmNvdW50LS07CiAJCQlpZiAocG1jLT5zZm1vZGUgPT0gTUNBU1RfRVhDTFVERSkKIAkJCQl0eXBlID0gSUdNUFYzX0NIQU5HRV9UT19FWENMVURFOwogCQkJZWxzZQogCQkJCXR5cGUgPSBJR01QVjNfQ0hBTkdFX1RPX0lOQ0xVREU7CiAJCQlza2IgPSBhZGRfZ3JlYyhza2IsIHBtYywgdHlwZSwgMCwgMCk7CisJCQlwbWMtPmNyY291bnQtLTsKIAkJfQogCQlzcGluX3VubG9ja19iaCgmcG1jLT5sb2NrKTsKIAl9CkBAIC03MzUsNyArNzQ4LDggQEAKIAlpcF9tYV9wdXQoaW0pOwogfQogCi1zdGF0aWMgdm9pZCBpZ21wX21hcmtzb3VyY2VzKHN0cnVjdCBpcF9tY19saXN0ICpwbWMsIGludCBuc3JjcywgX191MzIgKnNyY3MpCisvKiBtYXJrIEVYQ0xVREUtbW9kZSBzb3VyY2VzICovCitzdGF0aWMgaW50IGlnbXBfeG1hcmtzb3VyY2VzKHN0cnVjdCBpcF9tY19saXN0ICpwbWMsIGludCBuc3JjcywgX191MzIgKnNyY3MpCiB7CiAJc3RydWN0IGlwX3NmX2xpc3QgKnBzZjsKIAlpbnQgaSwgc2NvdW50OwpAQCAtNzQ0LDYgKzc1OCwzNyBAQAogCWZvciAocHNmPXBtYy0+c291cmNlczsgcHNmOyBwc2Y9cHNmLT5zZl9uZXh0KSB7CiAJCWlmIChzY291bnQgPT0gbnNyY3MpCiAJCQlicmVhazsKKwkJZm9yIChpPTA7IGk8bnNyY3M7IGkrKykgeworCQkJLyogc2tpcCBpbmFjdGl2ZSBmaWx0ZXJzICovCisJCQlpZiAocG1jLT5zZmNvdW50W01DQVNUX0lOQ0xVREVdIHx8CisJCQkgICAgcG1jLT5zZmNvdW50W01DQVNUX0VYQ0xVREVdICE9CisJCQkgICAgcHNmLT5zZl9jb3VudFtNQ0FTVF9FWENMVURFXSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChzcmNzW2ldID09IHBzZi0+c2ZfaW5hZGRyKSB7CisJCQkJc2NvdW50Kys7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcG1jLT5nc3F1ZXJ5ID0gMDsKKwlpZiAoc2NvdW50ID09IG5zcmNzKQkvKiBhbGwgc291cmNlcyBleGNsdWRlZCAqLworCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBpZ21wX21hcmtzb3VyY2VzKHN0cnVjdCBpcF9tY19saXN0ICpwbWMsIGludCBuc3JjcywgX191MzIgKnNyY3MpCit7CisJc3RydWN0IGlwX3NmX2xpc3QgKnBzZjsKKwlpbnQgaSwgc2NvdW50OworCisJaWYgKHBtYy0+c2Ztb2RlID09IE1DQVNUX0VYQ0xVREUpCisJCXJldHVybiBpZ21wX3htYXJrc291cmNlcyhwbWMsIG5zcmNzLCBzcmNzKTsKKworCS8qIG1hcmsgSU5DTFVERS1tb2RlIHNvdXJjZXMgKi8KKwlzY291bnQgPSAwOworCWZvciAocHNmPXBtYy0+c291cmNlczsgcHNmOyBwc2Y9cHNmLT5zZl9uZXh0KSB7CisJCWlmIChzY291bnQgPT0gbnNyY3MpCisJCQlicmVhazsKIAkJZm9yIChpPTA7IGk8bnNyY3M7IGkrKykKIAkJCWlmIChzcmNzW2ldID09IHBzZi0+c2ZfaW5hZGRyKSB7CiAJCQkJcHNmLT5zZl9nc3Jlc3AgPSAxOwpAQCAtNzUxLDYgKzc5NiwxMiBAQAogCQkJCWJyZWFrOwogCQkJfQogCX0KKwlpZiAoIXNjb3VudCkgeworCQlwbWMtPmdzcXVlcnkgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJcG1jLT5nc3F1ZXJ5ID0gMTsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgaWdtcF9oZWFyZF9yZXBvcnQoc3RydWN0IGluX2RldmljZSAqaW5fZGV2LCB1MzIgZ3JvdXApCkBAIC04NDUsNiArODk2LDggQEAKIAkgKi8KIAlyZWFkX2xvY2soJmluX2Rldi0+bWNfbGlzdF9sb2NrKTsKIAlmb3IgKGltPWluX2Rldi0+bWNfbGlzdDsgaW0hPU5VTEw7IGltPWltLT5uZXh0KSB7CisJCWludCBjaGFuZ2VkOworCiAJCWlmIChncm91cCAmJiBncm91cCAhPSBpbS0+bXVsdGlhZGRyKQogCQkJY29udGludWU7CiAJCWlmIChpbS0+bXVsdGlhZGRyID09IElHTVBfQUxMX0hPU1RTKQpAQCAtODU0LDEwICs5MDcsMTEgQEAKIAkJCWltLT5nc3F1ZXJ5ID0gaW0tPmdzcXVlcnkgJiYgbWFyazsKIAkJZWxzZQogCQkJaW0tPmdzcXVlcnkgPSBtYXJrOwotCQlpZiAoaW0tPmdzcXVlcnkpCi0JCQlpZ21wX21hcmtzb3VyY2VzKGltLCBudG9ocyhpaDMtPm5zcmNzKSwgaWgzLT5zcmNzKTsKKwkJY2hhbmdlZCA9ICFpbS0+Z3NxdWVyeSB8fAorCQkgICAgCWlnbXBfbWFya3NvdXJjZXMoaW0sIG50b2hzKGloMy0+bnNyY3MpLCBpaDMtPnNyY3MpOwogCQlzcGluX3VubG9ja19iaCgmaW0tPmxvY2spOwotCQlpZ21wX21vZF90aW1lcihpbSwgbWF4X2RlbGF5KTsKKwkJaWYgKGNoYW5nZWQpCisJCQlpZ21wX21vZF90aW1lcihpbSwgbWF4X2RlbGF5KTsKIAl9CiAJcmVhZF91bmxvY2soJmluX2Rldi0+bWNfbGlzdF9sb2NrKTsKIH0KQEAgLTk3NSw3ICsxMDI5LDcgQEAKIAkgKiBmb3IgZGVsZXRlZCBpdGVtcyBhbGxvd3MgY2hhbmdlIHJlcG9ydHMgdG8gdXNlIGNvbW1vbiBjb2RlIHdpdGgKIAkgKiBub24tZGVsZXRlZCBvciBxdWVyeS1yZXNwb25zZSBNQ0Ency4KIAkgKi8KLQlwbWMgPSAoc3RydWN0IGlwX21jX2xpc3QgKilrbWFsbG9jKHNpemVvZigqcG1jKSwgR0ZQX0tFUk5FTCk7CisJcG1jID0ga21hbGxvYyhzaXplb2YoKnBtYyksIEdGUF9LRVJORUwpOwogCWlmICghcG1jKQogCQlyZXR1cm47CiAJbWVtc2V0KHBtYywgMCwgc2l6ZW9mKCpwbWMpKTsKQEAgLTExNTUsNyArMTIwOSw3IEBACiAJCX0KIAl9CiAKLQlpbSA9IChzdHJ1Y3QgaXBfbWNfbGlzdCAqKWttYWxsb2Moc2l6ZW9mKCppbSksIEdGUF9LRVJORUwpOworCWltID0ga21hbGxvYyhzaXplb2YoKmltKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbSkKIAkJZ290byBvdXQ7CiAKQEAgLTE0NzYsNyArMTUzMCw3IEBACiAJCXBzZl9wcmV2ID0gcHNmOwogCX0KIAlpZiAoIXBzZikgewotCQlwc2YgPSAoc3RydWN0IGlwX3NmX2xpc3QgKilrbWFsbG9jKHNpemVvZigqcHNmKSwgR0ZQX0FUT01JQyk7CisJCXBzZiA9IGttYWxsb2Moc2l6ZW9mKCpwc2YpLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFwc2YpCiAJCQlyZXR1cm4gLUVOT0JVRlM7CiAJCW1lbXNldChwc2YsIDAsIHNpemVvZigqcHNmKSk7CkBAIC0xNTEwLDcgKzE1NjQsNyBAQAogCiBzdGF0aWMgaW50IHNmX3NldHN0YXRlKHN0cnVjdCBpcF9tY19saXN0ICpwbWMpCiB7Ci0Jc3RydWN0IGlwX3NmX2xpc3QgKnBzZjsKKwlzdHJ1Y3QgaXBfc2ZfbGlzdCAqcHNmLCAqZHBzZjsKIAlpbnQgbWNhX3hjb3VudCA9IHBtYy0+c2Zjb3VudFtNQ0FTVF9FWENMVURFXTsKIAlpbnQgcXJ2ID0gcG1jLT5pbnRlcmZhY2UtPm1yX3FydjsKIAlpbnQgbmV3X2luLCBydjsKQEAgLTE1MjIsOCArMTU3Niw0NiBAQAogCQkJCSFwc2YtPnNmX2NvdW50W01DQVNUX0lOQ0xVREVdOwogCQl9IGVsc2UKIAkJCW5ld19pbiA9IHBzZi0+c2ZfY291bnRbTUNBU1RfSU5DTFVERV0gIT0gMDsKLQkJaWYgKG5ld19pbiAhPSBwc2YtPnNmX29sZGluKSB7Ci0JCQlwc2YtPnNmX2NyY291bnQgPSBxcnY7CisJCWlmIChuZXdfaW4pIHsKKwkJCWlmICghcHNmLT5zZl9vbGRpbikgeworCQkJCXN0cnVjdCBpcF9zZl9saXN0ICpwcmV2ID0gMDsKKworCQkJCWZvciAoZHBzZj1wbWMtPnRvbWI7IGRwc2Y7IGRwc2Y9ZHBzZi0+c2ZfbmV4dCkgeworCQkJCQlpZiAoZHBzZi0+c2ZfaW5hZGRyID09IHBzZi0+c2ZfaW5hZGRyKQorCQkJCQkJYnJlYWs7CisJCQkJCXByZXYgPSBkcHNmOworCQkJCX0KKwkJCQlpZiAoZHBzZikgeworCQkJCQlpZiAocHJldikKKwkJCQkJCXByZXYtPnNmX25leHQgPSBkcHNmLT5zZl9uZXh0OworCQkJCQllbHNlCisJCQkJCQlwbWMtPnRvbWIgPSBkcHNmLT5zZl9uZXh0OworCQkJCQlrZnJlZShkcHNmKTsKKwkJCQl9CisJCQkJcHNmLT5zZl9jcmNvdW50ID0gcXJ2OworCQkJCXJ2Kys7CisJCQl9CisJCX0gZWxzZSBpZiAocHNmLT5zZl9vbGRpbikgeworCisJCQlwc2YtPnNmX2NyY291bnQgPSAwOworCQkJLyoKKwkJCSAqIGFkZCBvciB1cGRhdGUgImRlbGV0ZSIgcmVjb3JkcyBpZiBhbiBhY3RpdmUgZmlsdGVyCisJCQkgKiBpcyBub3cgaW5hY3RpdmUKKwkJCSAqLworCQkJZm9yIChkcHNmPXBtYy0+dG9tYjsgZHBzZjsgZHBzZj1kcHNmLT5zZl9uZXh0KQorCQkJCWlmIChkcHNmLT5zZl9pbmFkZHIgPT0gcHNmLT5zZl9pbmFkZHIpCisJCQkJCWJyZWFrOworCQkJaWYgKCFkcHNmKSB7CisJCQkJZHBzZiA9IChzdHJ1Y3QgaXBfc2ZfbGlzdCAqKQorCQkJCQlrbWFsbG9jKHNpemVvZigqZHBzZiksIEdGUF9BVE9NSUMpOworCQkJCWlmICghZHBzZikKKwkJCQkJY29udGludWU7CisJCQkJKmRwc2YgPSAqcHNmOworCQkJCS8qIHBtYy0+bG9jayBoZWxkIGJ5IGNhbGxlcnMgKi8KKwkJCQlkcHNmLT5zZl9uZXh0ID0gcG1jLT50b21iOworCQkJCXBtYy0+dG9tYiA9IGRwc2Y7CisJCQl9CisJCQlkcHNmLT5zZl9jcmNvdW50ID0gcXJ2OwogCQkJcnYrKzsKIAkJfQogCX0KQEAgLTE2NTksNyArMTc1MSw3IEBACiAJZXJyID0gLUVOT0JVRlM7CiAJaWYgKGNvdW50ID49IHN5c2N0bF9pZ21wX21heF9tZW1iZXJzaGlwcykKIAkJZ290byBkb25lOwotCWltbCA9IChzdHJ1Y3QgaXBfbWNfc29ja2xpc3QgKilzb2NrX2ttYWxsb2Moc2ssc2l6ZW9mKCppbWwpLEdGUF9LRVJORUwpOworCWltbCA9IHNvY2tfa21hbGxvYyhzayxzaXplb2YoKmltbCksR0ZQX0tFUk5FTCk7CiAJaWYgKGltbCA9PSBOVUxMKQogCQlnb3RvIGRvbmU7CiAKQEAgLTE4MjMsOCArMTkxNSw3IEBACiAKIAkJaWYgKHBzbCkKIAkJCWNvdW50ICs9IHBzbC0+c2xfbWF4OwotCQluZXdwc2wgPSAoc3RydWN0IGlwX3NmX3NvY2tsaXN0ICopc29ja19rbWFsbG9jKHNrLAotCQkJSVBfU0ZMU0laRShjb3VudCksIEdGUF9LRVJORUwpOworCQluZXdwc2wgPSBzb2NrX2ttYWxsb2Moc2ssIElQX1NGTFNJWkUoY291bnQpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFuZXdwc2wpIHsKIAkJCWVyciA9IC1FTk9CVUZTOwogCQkJZ290byBkb25lOwpAQCAtMTkwNyw4ICsxOTk4LDggQEAKIAkJZ290byBkb25lOwogCX0KIAlpZiAobXNmLT5pbXNmX251bXNyYykgewotCQluZXdwc2wgPSAoc3RydWN0IGlwX3NmX3NvY2tsaXN0ICopc29ja19rbWFsbG9jKHNrLAotCQkJCUlQX1NGTFNJWkUobXNmLT5pbXNmX251bXNyYyksIEdGUF9LRVJORUwpOworCQluZXdwc2wgPSBzb2NrX2ttYWxsb2Moc2ssIElQX1NGTFNJWkUobXNmLT5pbXNmX251bXNyYyksCisJCQkJCQkJICAgR0ZQX0tFUk5FTCk7CiAJCWlmICghbmV3cHNsKSB7CiAJCQllcnIgPSAtRU5PQlVGUzsKIAkJCWdvdG8gZG9uZTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2luZXRfZGlhZy5jIGIvbmV0L2lwdjQvaW5ldF9kaWFnLmMKaW5kZXggYzQ5OTA4MS4uNDU3ZGI5OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaW5ldF9kaWFnLmMKKysrIGIvbmV0L2lwdjQvaW5ldF9kaWFnLmMKQEAgLTUwLDkgKzUwLDEwIEBACiAjZGVmaW5lIElORVRfRElBR19QVVQoc2tiLCBhdHRydHlwZSwgYXR0cmxlbikgXAogCVJUQV9EQVRBKF9fUlRBX1BVVChza2IsIGF0dHJ0eXBlLCBhdHRybGVuKSkKIAotc3RhdGljIGludCBpbmV0X2RpYWdfZmlsbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc29jayAqc2ssCi0JCQlpbnQgZXh0LCB1MzIgcGlkLCB1MzIgc2VxLCB1MTYgbmxtc2dfZmxhZ3MsCi0JCQljb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKnVubGgpCitzdGF0aWMgaW50IGluZXRfY3NrX2RpYWdfZmlsbChzdHJ1Y3Qgc29jayAqc2ssCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgaW50IGV4dCwgdTMyIHBpZCwgdTMyIHNlcSwgdTE2IG5sbXNnX2ZsYWdzLAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoKQogewogCWNvbnN0IHN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAljb25zdCBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CkBAIC03MCwyMCArNzEsMjIgQEAKIAlubGgtPm5sbXNnX2ZsYWdzID0gbmxtc2dfZmxhZ3M7CiAKIAlyID0gTkxNU0dfREFUQShubGgpOwotCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX1RJTUVfV0FJVCkgewotCQlpZiAoZXh0ICYgKDEgPDwgKElORVRfRElBR19NRU1JTkZPIC0gMSkpKQotCQkJbWluZm8gPSBJTkVUX0RJQUdfUFVUKHNrYiwgSU5FVF9ESUFHX01FTUlORk8sCi0JCQkJCSAgICAgIHNpemVvZigqbWluZm8pKTsKLQkJaWYgKGV4dCAmICgxIDw8IChJTkVUX0RJQUdfSU5GTyAtIDEpKSkKLQkJCWluZm8gPSBJTkVUX0RJQUdfUFVUKHNrYiwgSU5FVF9ESUFHX0lORk8sCi0JCQkJCSAgIGhhbmRsZXItPmlkaWFnX2luZm9fc2l6ZSk7Ci0JCQotCQlpZiAoKGV4dCAmICgxIDw8IChJTkVUX0RJQUdfQ09ORyAtIDEpKSkgJiYgaWNzay0+aWNza19jYV9vcHMpIHsKLQkJCXNpemVfdCBsZW4gPSBzdHJsZW4oaWNzay0+aWNza19jYV9vcHMtPm5hbWUpOwotCQkJc3RyY3B5KElORVRfRElBR19QVVQoc2tiLCBJTkVUX0RJQUdfQ09ORywgbGVuICsgMSksCi0JCQkgICAgICAgaWNzay0+aWNza19jYV9vcHMtPm5hbWUpOwotCQl9CisJQlVHX09OKHNrLT5za19zdGF0ZSA9PSBUQ1BfVElNRV9XQUlUKTsKKworCWlmIChleHQgJiAoMSA8PCAoSU5FVF9ESUFHX01FTUlORk8gLSAxKSkpCisJCW1pbmZvID0gSU5FVF9ESUFHX1BVVChza2IsIElORVRfRElBR19NRU1JTkZPLCBzaXplb2YoKm1pbmZvKSk7CisKKwlpZiAoZXh0ICYgKDEgPDwgKElORVRfRElBR19JTkZPIC0gMSkpKQorCQlpbmZvID0gSU5FVF9ESUFHX1BVVChza2IsIElORVRfRElBR19JTkZPLAorCQkJCSAgICAgaGFuZGxlci0+aWRpYWdfaW5mb19zaXplKTsKKworCWlmICgoZXh0ICYgKDEgPDwgKElORVRfRElBR19DT05HIC0gMSkpKSAmJiBpY3NrLT5pY3NrX2NhX29wcykgeworCQljb25zdCBzaXplX3QgbGVuID0gc3RybGVuKGljc2stPmljc2tfY2Ffb3BzLT5uYW1lKTsKKworCQlzdHJjcHkoSU5FVF9ESUFHX1BVVChza2IsIElORVRfRElBR19DT05HLCBsZW4gKyAxKSwKKwkJICAgICAgIGljc2stPmljc2tfY2Ffb3BzLT5uYW1lKTsKIAl9CisKIAlyLT5pZGlhZ19mYW1pbHkgPSBzay0+c2tfZmFtaWx5OwogCXItPmlkaWFnX3N0YXRlID0gc2stPnNrX3N0YXRlOwogCXItPmlkaWFnX3RpbWVyID0gMDsKQEAgLTkzLDM3ICs5Niw2IEBACiAJci0+aWQuaWRpYWdfY29va2llWzBdID0gKHUzMikodW5zaWduZWQgbG9uZylzazsKIAlyLT5pZC5pZGlhZ19jb29raWVbMV0gPSAodTMyKSgoKHVuc2lnbmVkIGxvbmcpc2sgPj4gMzEpID4+IDEpOwogCi0JaWYgKHItPmlkaWFnX3N0YXRlID09IFRDUF9USU1FX1dBSVQpIHsKLQkJY29uc3Qgc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHcgPSBpbmV0X3R3c2soc2spOwotCQlsb25nIHRtbyA9IHR3LT50d190dGQgLSBqaWZmaWVzOwotCQlpZiAodG1vIDwgMCkKLQkJCXRtbyA9IDA7Ci0KLQkJci0+aWQuaWRpYWdfc3BvcnQgPSB0dy0+dHdfc3BvcnQ7Ci0JCXItPmlkLmlkaWFnX2Rwb3J0ID0gdHctPnR3X2Rwb3J0OwotCQlyLT5pZC5pZGlhZ19zcmNbMF0gPSB0dy0+dHdfcmN2X3NhZGRyOwotCQlyLT5pZC5pZGlhZ19kc3RbMF0gPSB0dy0+dHdfZGFkZHI7Ci0JCXItPmlkaWFnX3N0YXRlID0gdHctPnR3X3N1YnN0YXRlOwotCQlyLT5pZGlhZ190aW1lciA9IDM7Ci0JCXItPmlkaWFnX2V4cGlyZXMgPSAodG1vICogMTAwMCArIEhaIC0gMSkgLyBIWjsKLQkJci0+aWRpYWdfcnF1ZXVlID0gMDsKLQkJci0+aWRpYWdfd3F1ZXVlID0gMDsKLQkJci0+aWRpYWdfdWlkID0gMDsKLQkJci0+aWRpYWdfaW5vZGUgPSAwOwotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQgKENPTkZJR19JUFY2X01PRFVMRSkKLQkJaWYgKHItPmlkaWFnX2ZhbWlseSA9PSBBRl9JTkVUNikgewotCQkJY29uc3Qgc3RydWN0IGluZXQ2X3RpbWV3YWl0X3NvY2sgKnR3NiA9IGluZXQ2X3R3c2soc2spOwotCi0JCQlpcHY2X2FkZHJfY29weSgoc3RydWN0IGluNl9hZGRyICopci0+aWQuaWRpYWdfc3JjLAotCQkJCSAgICAgICAmdHc2LT50d192Nl9yY3Zfc2FkZHIpOwotCQkJaXB2Nl9hZGRyX2NvcHkoKHN0cnVjdCBpbjZfYWRkciAqKXItPmlkLmlkaWFnX2RzdCwKLQkJCQkgICAgICAgJnR3Ni0+dHdfdjZfZGFkZHIpOwotCQl9Ci0jZW5kaWYKLQkJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOwotCQlyZXR1cm4gc2tiLT5sZW47Ci0JfQotCiAJci0+aWQuaWRpYWdfc3BvcnQgPSBpbmV0LT5zcG9ydDsKIAlyLT5pZC5pZGlhZ19kcG9ydCA9IGluZXQtPmRwb3J0OwogCXItPmlkLmlkaWFnX3NyY1swXSA9IGluZXQtPnJjdl9zYWRkcjsKQEAgLTE4NSw3ICsxNTcsNzUgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbnQgaW5ldF9kaWFnX2dldF9leGFjdChzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLCBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCkKK3N0YXRpYyBpbnQgaW5ldF90d3NrX2RpYWdfZmlsbChzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dywKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZXh0LCB1MzIgcGlkLAorCQkJICAgICAgIHUzMiBzZXEsIHUxNiBubG1zZ19mbGFncywKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKnVubGgpCit7CisJbG9uZyB0bW87CisJc3RydWN0IGluZXRfZGlhZ19tc2cgKnI7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcHJldmlvdXNfdGFpbCA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9IE5MTVNHX1BVVChza2IsIHBpZCwgc2VxLAorCQkJCQkgdW5saC0+bmxtc2dfdHlwZSwgc2l6ZW9mKCpyKSk7CisKKwlyID0gTkxNU0dfREFUQShubGgpOworCUJVR19PTih0dy0+dHdfc3RhdGUgIT0gVENQX1RJTUVfV0FJVCk7CisKKwlubGgtPm5sbXNnX2ZsYWdzID0gbmxtc2dfZmxhZ3M7CisKKwl0bW8gPSB0dy0+dHdfdHRkIC0gamlmZmllczsKKwlpZiAodG1vIDwgMCkKKwkJdG1vID0gMDsKKworCXItPmlkaWFnX2ZhbWlseQkgICAgICA9IHR3LT50d19mYW1pbHk7CisJci0+aWRpYWdfc3RhdGUJICAgICAgPSB0dy0+dHdfc3RhdGU7CisJci0+aWRpYWdfdGltZXIJICAgICAgPSAwOworCXItPmlkaWFnX3JldHJhbnMgICAgICA9IDA7CisJci0+aWQuaWRpYWdfaWYJICAgICAgPSB0dy0+dHdfYm91bmRfZGV2X2lmOworCXItPmlkLmlkaWFnX2Nvb2tpZVswXSA9ICh1MzIpKHVuc2lnbmVkIGxvbmcpdHc7CisJci0+aWQuaWRpYWdfY29va2llWzFdID0gKHUzMikoKCh1bnNpZ25lZCBsb25nKXR3ID4+IDMxKSA+PiAxKTsKKwlyLT5pZC5pZGlhZ19zcG9ydCAgICAgPSB0dy0+dHdfc3BvcnQ7CisJci0+aWQuaWRpYWdfZHBvcnQgICAgID0gdHctPnR3X2Rwb3J0OworCXItPmlkLmlkaWFnX3NyY1swXSAgICA9IHR3LT50d19yY3Zfc2FkZHI7CisJci0+aWQuaWRpYWdfZHN0WzBdICAgID0gdHctPnR3X2RhZGRyOworCXItPmlkaWFnX3N0YXRlCSAgICAgID0gdHctPnR3X3N1YnN0YXRlOworCXItPmlkaWFnX3RpbWVyCSAgICAgID0gMzsKKwlyLT5pZGlhZ19leHBpcmVzICAgICAgPSAodG1vICogMTAwMCArIEhaIC0gMSkgLyBIWjsKKwlyLT5pZGlhZ19ycXVldWUJICAgICAgPSAwOworCXItPmlkaWFnX3dxdWV1ZQkgICAgICA9IDA7CisJci0+aWRpYWdfdWlkCSAgICAgID0gMDsKKwlyLT5pZGlhZ19pbm9kZQkgICAgICA9IDA7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZCAoQ09ORklHX0lQVjZfTU9EVUxFKQorCWlmICh0dy0+dHdfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCWNvbnN0IHN0cnVjdCBpbmV0Nl90aW1ld2FpdF9zb2NrICp0dzYgPQorCQkJCQkJaW5ldDZfdHdzaygoc3RydWN0IHNvY2sgKil0dyk7CisKKwkJaXB2Nl9hZGRyX2NvcHkoKHN0cnVjdCBpbjZfYWRkciAqKXItPmlkLmlkaWFnX3NyYywKKwkJCSAgICAgICAmdHc2LT50d192Nl9yY3Zfc2FkZHIpOworCQlpcHY2X2FkZHJfY29weSgoc3RydWN0IGluNl9hZGRyICopci0+aWQuaWRpYWdfZHN0LAorCQkJICAgICAgICZ0dzYtPnR3X3Y2X2RhZGRyKTsKKwl9CisjZW5kaWYKKwlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIHByZXZpb3VzX3RhaWw7CisJcmV0dXJuIHNrYi0+bGVuOworbmxtc2dfZmFpbHVyZToKKwlza2JfdHJpbShza2IsIHByZXZpb3VzX3RhaWwgLSBza2ItPmRhdGEpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBza19kaWFnX2ZpbGwoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJaW50IGV4dCwgdTMyIHBpZCwgdTMyIHNlcSwgdTE2IG5sbXNnX2ZsYWdzLAorCQkJY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoKQoreworCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX1RJTUVfV0FJVCkKKwkJcmV0dXJuIGluZXRfdHdza19kaWFnX2ZpbGwoKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKilzaywKKwkJCQkJICAgc2tiLCBleHQsIHBpZCwgc2VxLCBubG1zZ19mbGFncywKKwkJCQkJICAgdW5saCk7CisJcmV0dXJuIGluZXRfY3NrX2RpYWdfZmlsbChzaywgc2tiLCBleHQsIHBpZCwgc2VxLCBubG1zZ19mbGFncywgdW5saCk7Cit9CisKK3N0YXRpYyBpbnQgaW5ldF9kaWFnX2dldF9leGFjdChzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoKQogewogCWludCBlcnI7CiAJc3RydWN0IHNvY2sgKnNrOwpAQCAtMjM1LDcgKzI3NSw3IEBACiAJaWYgKCFyZXApCiAJCWdvdG8gb3V0OwogCi0JaWYgKGluZXRfZGlhZ19maWxsKHJlcCwgc2ssIHJlcS0+aWRpYWdfZXh0LAorCWlmIChza19kaWFnX2ZpbGwoc2ssIHJlcCwgcmVxLT5pZGlhZ19leHQsCiAJCQkgTkVUTElOS19DQihpbl9za2IpLnBpZCwKIAkJCSBubGgtPm5sbXNnX3NlcSwgMCwgbmxoKSA8PSAwKQogCQlCVUcoKTsKQEAgLTI4Myw3ICszMjMsNyBAQAogCiAKIHN0YXRpYyBpbnQgaW5ldF9kaWFnX2JjX3J1bihjb25zdCB2b2lkICpiYywgaW50IGxlbiwKLQkJCSAgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19lbnRyeSAqZW50cnkpCisJCQkgICAgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19lbnRyeSAqZW50cnkpCiB7CiAJd2hpbGUgKGxlbiA+IDApIHsKIAkJaW50IHllcyA9IDE7CkBAIC0zMjIsNyArMzYyLDcgQEAKIAkJCQl5ZXMgPSAwOwogCQkJCWJyZWFrOwogCQkJfQotCQkJCisKIAkJCWlmIChjb25kLT5wcmVmaXhfbGVuID09IDApCiAJCQkJYnJlYWs7CiAKQEAgLTMzMSw3ICszNzEsOCBAQAogCQkJZWxzZQogCQkJCWFkZHIgPSBlbnRyeS0+ZGFkZHI7CiAKLQkJCWlmIChiaXRzdHJpbmdfbWF0Y2goYWRkciwgY29uZC0+YWRkciwgY29uZC0+cHJlZml4X2xlbikpCisJCQlpZiAoYml0c3RyaW5nX21hdGNoKGFkZHIsIGNvbmQtPmFkZHIsCisJCQkJCSAgICBjb25kLT5wcmVmaXhfbGVuKSkKIAkJCQlicmVhazsKIAkJCWlmIChlbnRyeS0+ZmFtaWx5ID09IEFGX0lORVQ2ICYmCiAJCQkgICAgY29uZC0+ZmFtaWx5ID09IEFGX0lORVQpIHsKQEAgLTM0Niw3ICszODcsNyBAQAogCQl9CiAJCX0KIAotCQlpZiAoeWVzKSB7IAorCQlpZiAoeWVzKSB7CiAJCQlsZW4gLT0gb3AtPnllczsKIAkJCWJjICs9IG9wLT55ZXM7CiAJCX0gZWxzZSB7CkBAIC00MDcsMTQgKzQ0OCwxNSBAQAogCQlkZWZhdWx0OgogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJYmMgKz0gb3AtPnllczsKKwkJYmMgICs9IG9wLT55ZXM7CiAJCWxlbiAtPSBvcC0+eWVzOwogCX0KIAlyZXR1cm4gbGVuID09IDAgPyAwIDogLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBpbmV0X2RpYWdfZHVtcF9zb2NrKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzb2NrICpzaywKLQkJCSAgICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQorc3RhdGljIGludCBpbmV0X2Nza19kaWFnX2R1bXAoc3RydWN0IHNvY2sgKnNrLAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKIHsKIAlzdHJ1Y3QgaW5ldF9kaWFnX3JlcSAqciA9IE5MTVNHX0RBVEEoY2ItPm5saCk7CiAKQEAgLTQ0NCwxNCArNDg2LDUwIEBACiAJCQlyZXR1cm4gMDsKIAl9CiAKLQlyZXR1cm4gaW5ldF9kaWFnX2ZpbGwoc2tiLCBzaywgci0+aWRpYWdfZXh0LCBORVRMSU5LX0NCKGNiLT5za2IpLnBpZCwKLQkJCSAgICBjYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLCBjYi0+bmxoKTsKKwlyZXR1cm4gaW5ldF9jc2tfZGlhZ19maWxsKHNrLCBza2IsIHItPmlkaWFnX2V4dCwKKwkJCQkgIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLAorCQkJCSAgY2ItPm5saC0+bmxtc2dfc2VxLCBOTE1fRl9NVUxUSSwgY2ItPm5saCk7Cit9CisKK3N0YXRpYyBpbnQgaW5ldF90d3NrX2RpYWdfZHVtcChzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dywKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgaW5ldF9kaWFnX3JlcSAqciA9IE5MTVNHX0RBVEEoY2ItPm5saCk7CisKKwlpZiAoY2ItPm5saC0+bmxtc2dfbGVuID4gNCArIE5MTVNHX1NQQUNFKHNpemVvZigqcikpKSB7CisJCXN0cnVjdCBpbmV0X2RpYWdfZW50cnkgZW50cnk7CisJCXN0cnVjdCBydGF0dHIgKmJjID0gKHN0cnVjdCBydGF0dHIgKikociArIDEpOworCisJCWVudHJ5LmZhbWlseSA9IHR3LT50d19mYW1pbHk7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZCAoQ09ORklHX0lQVjZfTU9EVUxFKQorCQlpZiAodHctPnR3X2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQkJc3RydWN0IGluZXQ2X3RpbWV3YWl0X3NvY2sgKnR3NiA9CisJCQkJCQlpbmV0Nl90d3NrKChzdHJ1Y3Qgc29jayAqKXR3KTsKKwkJCWVudHJ5LnNhZGRyID0gdHc2LT50d192Nl9yY3Zfc2FkZHIuczZfYWRkcjMyOworCQkJZW50cnkuZGFkZHIgPSB0dzYtPnR3X3Y2X2RhZGRyLnM2X2FkZHIzMjsKKwkJfSBlbHNlCisjZW5kaWYKKwkJeworCQkJZW50cnkuc2FkZHIgPSAmdHctPnR3X3Jjdl9zYWRkcjsKKwkJCWVudHJ5LmRhZGRyID0gJnR3LT50d19kYWRkcjsKKwkJfQorCQllbnRyeS5zcG9ydCA9IHR3LT50d19udW07CisJCWVudHJ5LmRwb3J0ID0gbnRvaHModHctPnR3X2Rwb3J0KTsKKwkJZW50cnkudXNlcmxvY2tzID0gMDsgCisKKwkJaWYgKCFpbmV0X2RpYWdfYmNfcnVuKFJUQV9EQVRBKGJjKSwgUlRBX1BBWUxPQUQoYmMpLCAmZW50cnkpKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGluZXRfdHdza19kaWFnX2ZpbGwodHcsIHNrYiwgci0+aWRpYWdfZXh0LAorCQkJCSAgIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLAorCQkJCSAgIGNiLT5ubGgtPm5sbXNnX3NlcSwgTkxNX0ZfTVVMVEksIGNiLT5ubGgpOwogfQogCiBzdGF0aWMgaW50IGluZXRfZGlhZ19maWxsX3JlcShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc29jayAqc2ssCi0JCQkgICAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAotCQkJICAgIHUzMiBwaWQsIHUzMiBzZXEsCi0JCQkgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoKQorCQkJICAgICAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLCB1MzIgcGlkLCB1MzIgc2VxLAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoKQogewogCWNvbnN0IHN0cnVjdCBpbmV0X3JlcXVlc3Rfc29jayAqaXJlcSA9IGluZXRfcnNrKHJlcSk7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwpAQCAtNTA0LDcgKzU4Miw3IEBACiB9CiAKIHN0YXRpYyBpbnQgaW5ldF9kaWFnX2R1bXBfcmVxcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc29jayAqc2ssCi0JCQkgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKKwkJCSAgICAgICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCiB7CiAJc3RydWN0IGluZXRfZGlhZ19lbnRyeSBlbnRyeTsKIAlzdHJ1Y3QgaW5ldF9kaWFnX3JlcSAqciA9IE5MTVNHX0RBVEEoY2ItPm5saCk7CkBAIC01NTYsNyArNjM0LDcgQEAKIAkJCQkJaW5ldDZfcnNrKHJlcSktPmxvY19hZGRyLnM2X2FkZHIzMiA6CiAjZW5kaWYKIAkJCQkJJmlyZXEtPmxvY19hZGRyOwotCQkJCWVudHJ5LmRhZGRyID0gCisJCQkJZW50cnkuZGFkZHIgPQogI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQgKENPTkZJR19JUFY2X01PRFVMRSkKIAkJCQkJKGVudHJ5LmZhbWlseSA9PSBBRl9JTkVUNikgPwogCQkJCQlpbmV0Nl9yc2socmVxKS0+cm10X2FkZHIuczZfYWRkcjMyIDoKQEAgLTU5OSw3ICs2NzcsNyBAQAogCWhhbmRsZXIgPSBpbmV0X2RpYWdfdGFibGVbY2ItPm5saC0+bmxtc2dfdHlwZV07CiAJQlVHX09OKGhhbmRsZXIgPT0gTlVMTCk7CiAJaGFzaGluZm8gPSBoYW5kbGVyLT5pZGlhZ19oYXNoaW5mbzsKLQkJCisKIAlzX2kgPSBjYi0+YXJnc1sxXTsKIAlzX251bSA9IG51bSA9IGNiLT5hcmdzWzJdOwogCkBAIC02MzAsNyArNzA4LDcgQEAKIAkJCQkgICAgY2ItPmFyZ3NbM10gPiAwKQogCQkJCQlnb3RvIHN5bl9yZWN2OwogCi0JCQkJaWYgKGluZXRfZGlhZ19kdW1wX3NvY2soc2tiLCBzaywgY2IpIDwgMCkgeworCQkJCWlmIChpbmV0X2Nza19kaWFnX2R1bXAoc2ssIHNrYiwgY2IpIDwgMCkgewogCQkJCQlpbmV0X2xpc3Rlbl91bmxvY2soaGFzaGluZm8pOwogCQkJCQlnb3RvIGRvbmU7CiAJCQkJfQpAQCAtNjcyLDcgKzc1MCw2IEBACiAJCQlzX251bSA9IDA7CiAKIAkJcmVhZF9sb2NrX2JoKCZoZWFkLT5sb2NrKTsKLQogCQludW0gPSAwOwogCQlza19mb3JfZWFjaChzaywgbm9kZSwgJmhlYWQtPmNoYWluKSB7CiAJCQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CkBAIC02ODQsOSArNzYxLDEwIEBACiAJCQlpZiAoci0+aWQuaWRpYWdfc3BvcnQgIT0gaW5ldC0+c3BvcnQgJiYKIAkJCSAgICByLT5pZC5pZGlhZ19zcG9ydCkKIAkJCQlnb3RvIG5leHRfbm9ybWFsOwotCQkJaWYgKHItPmlkLmlkaWFnX2Rwb3J0ICE9IGluZXQtPmRwb3J0ICYmIHItPmlkLmlkaWFnX2Rwb3J0KQorCQkJaWYgKHItPmlkLmlkaWFnX2Rwb3J0ICE9IGluZXQtPmRwb3J0ICYmCisJCQkgICAgci0+aWQuaWRpYWdfZHBvcnQpCiAJCQkJZ290byBuZXh0X25vcm1hbDsKLQkJCWlmIChpbmV0X2RpYWdfZHVtcF9zb2NrKHNrYiwgc2ssIGNiKSA8IDApIHsKKwkJCWlmIChpbmV0X2Nza19kaWFnX2R1bXAoc2ssIHNrYiwgY2IpIDwgMCkgewogCQkJCXJlYWRfdW5sb2NrX2JoKCZoZWFkLT5sb2NrKTsKIAkJCQlnb3RvIGRvbmU7CiAJCQl9CkBAIC02OTUsMTkgKzc3MywyMCBAQAogCQl9CiAKIAkJaWYgKHItPmlkaWFnX3N0YXRlcyAmIFRDUEZfVElNRV9XQUlUKSB7Ci0JCQlza19mb3JfZWFjaChzaywgbm9kZSwKKwkJCXN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3OworCisJCQlpbmV0X3R3c2tfZm9yX2VhY2godHcsIG5vZGUsCiAJCQkJICAgICZoYXNoaW5mby0+ZWhhc2hbaSArIGhhc2hpbmZvLT5laGFzaF9zaXplXS5jaGFpbikgewotCQkJCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAogCQkJCWlmIChudW0gPCBzX251bSkKIAkJCQkJZ290byBuZXh0X2R5aW5nOwotCQkJCWlmIChyLT5pZC5pZGlhZ19zcG9ydCAhPSBpbmV0LT5zcG9ydCAmJgorCQkJCWlmIChyLT5pZC5pZGlhZ19zcG9ydCAhPSB0dy0+dHdfc3BvcnQgJiYKIAkJCQkgICAgci0+aWQuaWRpYWdfc3BvcnQpCiAJCQkJCWdvdG8gbmV4dF9keWluZzsKLQkJCQlpZiAoci0+aWQuaWRpYWdfZHBvcnQgIT0gaW5ldC0+ZHBvcnQgJiYKKwkJCQlpZiAoci0+aWQuaWRpYWdfZHBvcnQgIT0gdHctPnR3X2Rwb3J0ICYmCiAJCQkJICAgIHItPmlkLmlkaWFnX2Rwb3J0KQogCQkJCQlnb3RvIG5leHRfZHlpbmc7Ci0JCQkJaWYgKGluZXRfZGlhZ19kdW1wX3NvY2soc2tiLCBzaywgY2IpIDwgMCkgeworCQkJCWlmIChpbmV0X3R3c2tfZGlhZ19kdW1wKHR3LCBza2IsIGNiKSA8IDApIHsKIAkJCQkJcmVhZF91bmxvY2tfYmgoJmhlYWQtPmxvY2spOwogCQkJCQlnb3RvIGRvbmU7CiAJCQkJfQpAQCAtNzI0LDggKzgwMyw3IEBACiAJcmV0dXJuIHNrYi0+bGVuOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQKLWluZXRfZGlhZ19yY3ZfbXNnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoKQorc3RhdGljIGlubGluZSBpbnQgaW5ldF9kaWFnX3Jjdl9tc2coc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgpCiB7CiAJaWYgKCEobmxoLT5ubG1zZ19mbGFncyZOTE1fRl9SRVFVRVNUKSkKIAkJcmV0dXJuIDA7CkBAIC03NTUsOSArODMzLDggQEAKIAkJfQogCQlyZXR1cm4gbmV0bGlua19kdW1wX3N0YXJ0KGlkaWFnbmwsIHNrYiwgbmxoLAogCQkJCQkgIGluZXRfZGlhZ19kdW1wLCBOVUxMKTsKLQl9IGVsc2UgeworCX0gZWxzZQogCQlyZXR1cm4gaW5ldF9kaWFnX2dldF9leGFjdChza2IsIG5saCk7Ci0JfQogCiBlcnJfaW52YWw6CiAJcmV0dXJuIC1FSU5WQUw7CkBAIC03NjYsMTUgKzg0MywxNSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5ldF9kaWFnX3Jjdl9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpbnQgZXJyOwotCXN0cnVjdCBubG1zZ2hkciAqIG5saDsKLQogCWlmIChza2ItPmxlbiA+PSBOTE1TR19TUEFDRSgwKSkgewotCQlubGggPSAoc3RydWN0IG5sbXNnaGRyICopc2tiLT5kYXRhOwotCQlpZiAobmxoLT5ubG1zZ19sZW4gPCBzaXplb2YoKm5saCkgfHwgc2tiLT5sZW4gPCBubGgtPm5sbXNnX2xlbikKKwkJaW50IGVycjsKKwkJc3RydWN0IG5sbXNnaGRyICpubGggPSAoc3RydWN0IG5sbXNnaGRyICopc2tiLT5kYXRhOworCisJCWlmIChubGgtPm5sbXNnX2xlbiA8IHNpemVvZigqbmxoKSB8fAorCQkgICAgc2tiLT5sZW4gPCBubGgtPm5sbXNnX2xlbikKIAkJCXJldHVybjsKIAkJZXJyID0gaW5ldF9kaWFnX3Jjdl9tc2coc2tiLCBubGgpOwotCQlpZiAoZXJyIHx8IG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9BQ0spIAorCQlpZiAoZXJyIHx8IG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9BQ0spCiAJCQluZXRsaW5rX2Fjayhza2IsIG5saCwgZXJyKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0cGVlci5jIGIvbmV0L2lwdjQvaW5ldHBlZXIuYwppbmRleCBjZTVmZTNmLi4yMTYwODc0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pbmV0cGVlci5jCisrKyBiL25ldC9pcHY0L2luZXRwZWVyLmMKQEAgLTMwNCw4ICszMDQsNyBAQAogCQkJLyogbG9vayBmb3IgYSBub2RlIHRvIGluc2VydCBpbnN0ZWFkIG9mIHAgKi8KIAkJCXN0cnVjdCBpbmV0X3BlZXIgKnQ7CiAJCQl0ID0gbG9va3VwX3JpZ2h0ZW1wdHkocCk7Ci0JCQlpZiAoKnN0YWNrcHRyWy0xXSAhPSB0KQotCQkJCUJVRygpOworCQkJQlVHX09OKCpzdGFja3B0clstMV0gIT0gdCk7CiAJCQkqKi0tc3RhY2twdHIgPSB0LT5hdmxfbGVmdDsKIAkJCS8qIHQgaXMgcmVtb3ZlZCwgdC0+djRkYWRkciA+IHgtPnY0ZGFkZHIgZm9yIGFueQogCQkJICogeCBpbiBwLT5hdmxfbGVmdCBzdWJ0cmVlLgpAQCAtMzE0LDggKzMxMyw3IEBACiAJCQl0LT5hdmxfbGVmdCA9IHAtPmF2bF9sZWZ0OwogCQkJdC0+YXZsX3JpZ2h0ID0gcC0+YXZsX3JpZ2h0OwogCQkJdC0+YXZsX2hlaWdodCA9IHAtPmF2bF9oZWlnaHQ7Ci0JCQlpZiAoZGVscFsxXSAhPSAmcC0+YXZsX2xlZnQpCi0JCQkJQlVHKCk7CisJCQlCVUdfT04oZGVscFsxXSAhPSAmcC0+YXZsX2xlZnQpOwogCQkJZGVscFsxXSA9ICZ0LT5hdmxfbGVmdDsgLyogd2FzICZwLT5hdmxfbGVmdCAqLwogCQl9CiAJCXBlZXJfYXZsX3JlYmFsYW5jZShzdGFjaywgc3RhY2twdHIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfZ3JlLmMgYi9uZXQvaXB2NC9pcF9ncmUuYwppbmRleCA5MTJjNDJmLi5hYmUyMzkyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9ncmUuYworKysgYi9uZXQvaXB2NC9pcF9ncmUuYwpAQCAtMTAsNiArMTAsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC0xODgsNyArMTg5LDcgQEAKIAl9CiAKIAlpZiAoaXBncmVfZmJfdHVubmVsX2Rldi0+ZmxhZ3MmSUZGX1VQKQotCQlyZXR1cm4gaXBncmVfZmJfdHVubmVsX2Rldi0+cHJpdjsKKwkJcmV0dXJuIG5ldGRldl9wcml2KGlwZ3JlX2ZiX3R1bm5lbF9kZXYpOwogCXJldHVybiBOVUxMOwogfQogCkBAIC0yNzgsNyArMjc5LDcgQEAKIAkgIHJldHVybiBOVUxMOwogCiAJZGV2LT5pbml0ID0gaXBncmVfdHVubmVsX2luaXQ7Ci0JbnQgPSBkZXYtPnByaXY7CisJbnQgPSBuZXRkZXZfcHJpdihkZXYpOwogCW50LT5wYXJtcyA9ICpwYXJtczsKIAogCWlmIChyZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KSA8IDApIHsKQEAgLTI4Niw5ICsyODcsNiBAQAogCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQludCA9IGRldi0+cHJpdjsKLQludC0+cGFybXMgPSAqcGFybXM7Ci0KIAlkZXZfaG9sZChkZXYpOwogCWlwZ3JlX3R1bm5lbF9saW5rKG50KTsKIAlyZXR1cm4gbnQ7CkBAIC0yOTksNyArMjk3LDcgQEAKIAogc3RhdGljIHZvaWQgaXBncmVfdHVubmVsX3VuaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCWlwZ3JlX3R1bm5lbF91bmxpbmsoKHN0cnVjdCBpcF90dW5uZWwqKWRldi0+cHJpdik7CisJaXBncmVfdHVubmVsX3VubGluayhuZXRkZXZfcHJpdihkZXYpKTsKIAlkZXZfcHV0KGRldik7CiB9CiAKQEAgLTUxOCw3ICs1MTYsNyBAQAogCQlza2IyLT5kc3QtPm9wcy0+dXBkYXRlX3BtdHUoc2tiMi0+ZHN0LCByZWxfaW5mbyk7CiAJCXJlbF9pbmZvID0gaHRvbmwocmVsX2luZm8pOwogCX0gZWxzZSBpZiAodHlwZSA9PSBJQ01QX1RJTUVfRVhDRUVERUQpIHsKLQkJc3RydWN0IGlwX3R1bm5lbCAqdCA9IChzdHJ1Y3QgaXBfdHVubmVsKilza2IyLT5kZXYtPnByaXY7CisJCXN0cnVjdCBpcF90dW5uZWwgKnQgPSBuZXRkZXZfcHJpdihza2IyLT5kZXYpOwogCQlpZiAodC0+cGFybXMuaXBoLnR0bCkgewogCQkJcmVsX3R5cGUgPSBJQ01QX0RFU1RfVU5SRUFDSDsKIAkJCXJlbF9jb2RlID0gSUNNUF9IT1NUX1VOUkVBQ0g7CkBAIC02NjksNyArNjY3LDcgQEAKIAogc3RhdGljIGludCBpcGdyZV90dW5uZWxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbCA9IChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXY7CisJc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmdHVubmVsLT5zdGF0OwogCXN0cnVjdCBpcGhkciAgKm9sZF9pcGggPSBza2ItPm5oLmlwaDsKIAlzdHJ1Y3QgaXBoZHIgICp0aXBoOwpAQCAtODMyLDYgKzgzMCw3IEBACiAJc2tiLT5oLnJhdyA9IHNrYi0+bmgucmF3OwogCXNrYi0+bmgucmF3ID0gc2tiX3B1c2goc2tiLCBncmVfaGxlbik7CiAJbWVtc2V0KCYoSVBDQihza2IpLT5vcHQpLCAwLCBzaXplb2YoSVBDQihza2IpLT5vcHQpKTsKKwlJUENCKHNrYiktPmZsYWdzICY9IH4oSVBTS0JfWEZSTV9UVU5ORUxfU0laRXxJUFNLQl9YRlJNX1RSQU5TRk9STUVEKTsKIAlkc3RfcmVsZWFzZShza2ItPmRzdCk7CiAJc2tiLT5kc3QgPSAmcnQtPnUuZHN0OwogCkBAIC05MTQsNyArOTEzLDcgQEAKIAkJCXQgPSBpcGdyZV90dW5uZWxfbG9jYXRlKCZwLCAwKTsKIAkJfQogCQlpZiAodCA9PSBOVUxMKQotCQkJdCA9IChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXY7CisJCQl0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAkJbWVtY3B5KCZwLCAmdC0+cGFybXMsIHNpemVvZihwKSk7CiAJCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEsICZwLCBzaXplb2YocCkpKQogCQkJZXJyID0gLUVGQVVMVDsKQEAgLTk1NCw3ICs5NTMsNyBAQAogCQkJfSBlbHNlIHsKIAkJCQl1bnNpZ25lZCBuZmxhZ3M9MDsKIAotCQkJCXQgPSAoc3RydWN0IGlwX3R1bm5lbCopZGV2LT5wcml2OworCQkJCXQgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJCQkJaWYgKE1VTFRJQ0FTVChwLmlwaC5kYWRkcikpCiAJCQkJCW5mbGFncyA9IElGRl9CUk9BRENBU1Q7CkBAIC0xMDAzLDcgKzEwMDIsNyBAQAogCQkJaWYgKCh0ID0gaXBncmVfdHVubmVsX2xvY2F0ZSgmcCwgMCkpID09IE5VTEwpCiAJCQkJZ290byBkb25lOwogCQkJZXJyID0gLUVQRVJNOwotCQkJaWYgKHQgPT0gaXBncmVfZmJfdHVubmVsX2Rldi0+cHJpdikKKwkJCWlmICh0ID09IG5ldGRldl9wcml2KGlwZ3JlX2ZiX3R1bm5lbF9kZXYpKQogCQkJCWdvdG8gZG9uZTsKIAkJCWRldiA9IHQtPmRldjsKIAkJfQpAQCAtMTAyMCwxMiArMTAxOSwxMiBAQAogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlwZ3JlX3R1bm5lbF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gJigoKHN0cnVjdCBpcF90dW5uZWwqKWRldi0+cHJpdiktPnN0YXQpOworCXJldHVybiAmKCgoc3RydWN0IGlwX3R1bm5lbCopbmV0ZGV2X3ByaXYoZGV2KSktPnN0YXQpOwogfQogCiBzdGF0aWMgaW50IGlwZ3JlX3R1bm5lbF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQogewotCXN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbCA9IChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXY7CisJc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpZiAobmV3X210dSA8IDY4IHx8IG5ld19tdHUgPiAweEZGRjggLSB0dW5uZWwtPmhsZW4pCiAJCXJldHVybiAtRUlOVkFMOwogCWRldi0+bXR1ID0gbmV3X210dTsKQEAgLTEwNjUsNyArMTA2NCw3IEBACiBzdGF0aWMgaW50IGlwZ3JlX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB0eXBlLAogCQkJdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pCiB7Ci0Jc3RydWN0IGlwX3R1bm5lbCAqdCA9IChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXY7CisJc3RydWN0IGlwX3R1bm5lbCAqdCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyICopc2tiX3B1c2goc2tiLCB0LT5obGVuKTsKIAl1MTYgKnAgPSAodTE2KikoaXBoKzEpOwogCkBAIC0xMDkyLDcgKzEwOTEsNyBAQAogCiBzdGF0aWMgaW50IGlwZ3JlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgaXBfdHVubmVsICp0ID0gKHN0cnVjdCBpcF90dW5uZWwqKWRldi0+cHJpdjsKKwlzdHJ1Y3QgaXBfdHVubmVsICp0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWlmIChNVUxUSUNBU1QodC0+cGFybXMuaXBoLmRhZGRyKSkgewogCQlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5vaWYgPSB0LT5wYXJtcy5saW5rLApAQCAtMTExNiw3ICsxMTE1LDcgQEAKIAogc3RhdGljIGludCBpcGdyZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBpcF90dW5uZWwgKnQgPSAoc3RydWN0IGlwX3R1bm5lbCopZGV2LT5wcml2OworCXN0cnVjdCBpcF90dW5uZWwgKnQgPSBuZXRkZXZfcHJpdihkZXYpOwogCWlmIChNVUxUSUNBU1QodC0+cGFybXMuaXBoLmRhZGRyKSAmJiB0LT5tbGluaykgewogCQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBpbmV0ZGV2X2J5X2luZGV4KHQtPm1saW5rKTsKIAkJaWYgKGluX2RldikgewpAQCAtMTE1Niw3ICsxMTU1LDcgQEAKIAlpbnQgbXR1ID0gRVRIX0RBVEFfTEVOOwogCWludCBhZGRlbmQgPSBzaXplb2Yoc3RydWN0IGlwaGRyKSArIDQ7CiAKLQl0dW5uZWwgPSAoc3RydWN0IGlwX3R1bm5lbCopZGV2LT5wcml2OworCXR1bm5lbCA9IG5ldGRldl9wcml2KGRldik7CiAJaXBoID0gJnR1bm5lbC0+cGFybXMuaXBoOwogCiAJdHVubmVsLT5kZXYgPSBkZXY7CkBAIC0xMjIwLDcgKzEyMTksNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpcGdyZV9mYl90dW5uZWxfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbCA9IChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXY7CisJc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXBoZHIgKmlwaCA9ICZ0dW5uZWwtPnBhcm1zLmlwaDsKIAogCXR1bm5lbC0+ZGV2ID0gZGV2OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfaW5wdXQuYyBiL25ldC9pcHY0L2lwX2lucHV0LmMKaW5kZXggZTQ1ODQ2YS4uMThkN2ZhZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfaW5wdXQuYworKysgYi9uZXQvaXB2NC9pcF9pbnB1dC5jCkBAIC0xODUsNyArMTg1LDYgQEAKIAkJCQkJcmF3X3JjdihsYXN0LCBza2IyKTsKIAkJCX0KIAkJCWxhc3QgPSBzazsKLQkJCW5mX3Jlc2V0KHNrYik7CiAJCX0KIAl9CiAKQEAgLTIwNCwxMCArMjAzLDYgQEAKIAogCV9fc2tiX3B1bGwoc2tiLCBpaGwpOwogCi0JLyogRnJlZSByZWZlcmVuY2UgZWFybHk6IHdlIGRvbid0IG5lZWQgaXQgYW55IG1vcmUsIGFuZCBpdCBtYXkKLSAgICAgICAgICAgaG9sZCBpcF9jb25udHJhY2sgbW9kdWxlIGxvYWRlZCBpbmRlZmluaXRlbHkuICovCi0JbmZfcmVzZXQoc2tiKTsKLQogICAgICAgICAvKiBQb2ludCBpbnRvIHRoZSBJUCBkYXRhZ3JhbSwganVzdCBwYXN0IHRoZSBoZWFkZXIuICovCiAgICAgICAgIHNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CiAKQEAgLTIzMiwxMCArMjI3LDEyIEBACiAJCWlmICgoaXBwcm90ID0gcmN1X2RlcmVmZXJlbmNlKGluZXRfcHJvdG9zW2hhc2hdKSkgIT0gTlVMTCkgewogCQkJaW50IHJldDsKIAotCQkJaWYgKCFpcHByb3QtPm5vX3BvbGljeSAmJgotCQkJICAgICF4ZnJtNF9wb2xpY3lfY2hlY2soTlVMTCwgWEZSTV9QT0xJQ1lfSU4sIHNrYikpIHsKLQkJCQlrZnJlZV9za2Ioc2tiKTsKLQkJCQlnb3RvIG91dDsKKwkJCWlmICghaXBwcm90LT5ub19wb2xpY3kpIHsKKwkJCQlpZiAoIXhmcm00X3BvbGljeV9jaGVjayhOVUxMLCBYRlJNX1BPTElDWV9JTiwgc2tiKSkgeworCQkJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCW5mX3Jlc2V0KHNrYik7CiAJCQl9CiAJCQlyZXQgPSBpcHByb3QtPmhhbmRsZXIoc2tiKTsKIAkJCWlmIChyZXQgPCAwKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9vcHRpb25zLmMgYi9uZXQvaXB2NC9pcF9vcHRpb25zLmMKaW5kZXggZDNmNmM0Ni4uOWJlYmFkMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfb3B0aW9ucy5jCisrKyBiL25ldC9pcHY0L2lwX29wdGlvbnMuYwpAQCAtMTEsNiArMTEsNyBAQAogICoJCQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfb3V0cHV0LmMgYi9uZXQvaXB2NC9pcF9vdXRwdXQuYwppbmRleCA4YjFjOWJkLi4zMzI0ZmJmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9vdXRwdXQuYworKysgYi9uZXQvaXB2NC9pcF9vdXRwdXQuYwpAQCAtNjksNiArNjksNyBAQAogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC94ZnJtLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvYXJwLmg+CkBAIC04NSw2ICs4Niw4IEBACiAKIGludCBzeXNjdGxfaXBfZGVmYXVsdF90dGwgPSBJUERFRlRUTDsKIAorc3RhdGljIGludCBpcF9mcmFnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgKCpvdXRwdXQpKHN0cnVjdCBza19idWZmKikpOworCiAvKiBHZW5lcmF0ZSBhIGNoZWNrc3VtIGZvciBhbiBvdXRnb2luZyBJUCBkYXRhZ3JhbS4gKi8KIF9faW5saW5lX18gdm9pZCBpcF9zZW5kX2NoZWNrKHN0cnVjdCBpcGhkciAqaXBoKQogewpAQCAtMjAyLDYgKzIwNSwxMSBAQAogCiBzdGF0aWMgaW5saW5lIGludCBpcF9maW5pc2hfb3V0cHV0KHN0cnVjdCBza19idWZmICpza2IpCiB7CisjaWYgZGVmaW5lZChDT05GSUdfTkVURklMVEVSKSAmJiBkZWZpbmVkKENPTkZJR19YRlJNKQorCS8qIFBvbGljeSBsb29rdXAgYWZ0ZXIgU05BVCB5aWVsZGVkIGEgbmV3IHBvbGljeSAqLworCWlmIChza2ItPmRzdC0+eGZybSAhPSBOVUxMKQorCQlyZXR1cm4geGZybTRfb3V0cHV0X2ZpbmlzaChza2IpOworI2VuZGlmCiAJaWYgKHNrYi0+bGVuID4gZHN0X210dShza2ItPmRzdCkgJiYKIAkgICAgIShza2Jfc2hpbmZvKHNrYiktPnVmb19zaXplIHx8IHNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemUpKQogCQlyZXR1cm4gaXBfZnJhZ21lbnQoc2tiLCBpcF9maW5pc2hfb3V0cHV0Mik7CkBAIC00MDksNyArNDE3LDcgQEAKICAqCXNpbmdsZSBkZXZpY2UgZnJhbWUsIGFuZCBxdWV1ZSBzdWNoIGEgZnJhbWUgZm9yIHNlbmRpbmcuCiAgKi8KIAotaW50IGlwX2ZyYWdtZW50KHN0cnVjdCBza19idWZmICpza2IsIGludCAoKm91dHB1dCkoc3RydWN0IHNrX2J1ZmYqKSkKK3N0YXRpYyBpbnQgaXBfZnJhZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50ICgqb3V0cHV0KShzdHJ1Y3Qgc2tfYnVmZiopKQogewogCXN0cnVjdCBpcGhkciAqaXBoOwogCWludCByYXcgPSAwOwpAQCAtMTM5MSw3ICsxMzk5LDYgQEAKICNlbmRpZgogfQogCi1FWFBPUlRfU1lNQk9MKGlwX2ZyYWdtZW50KTsKIEVYUE9SVF9TWU1CT0woaXBfZ2VuZXJpY19nZXRmcmFnKTsKIEVYUE9SVF9TWU1CT0woaXBfcXVldWVfeG1pdCk7CiBFWFBPUlRfU1lNQk9MKGlwX3NlbmRfY2hlY2spOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfc29ja2dsdWUuYyBiL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMKaW5kZXggNjk4NmUxMWQuLjJiZjhkNzggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMKKysrIGIvbmV0L2lwdjQvaXBfc29ja2dsdWUuYwpAQCAtNjIxLDcgKzYyMSw3IEBACiAJCQkJZXJyID0gLUVOT0JVRlM7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQltc2YgPSAoc3RydWN0IGlwX21zZmlsdGVyICopa21hbGxvYyhvcHRsZW4sIEdGUF9LRVJORUwpOworCQkJbXNmID0ga21hbGxvYyhvcHRsZW4sIEdGUF9LRVJORUwpOwogCQkJaWYgKG1zZiA9PSAwKSB7CiAJCQkJZXJyID0gLUVOT0JVRlM7CiAJCQkJYnJlYWs7CkBAIC03NzgsNyArNzc4LDcgQEAKIAkJCQllcnIgPSAtRU5PQlVGUzsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWdzZiA9IChzdHJ1Y3QgZ3JvdXBfZmlsdGVyICopa21hbGxvYyhvcHRsZW4sR0ZQX0tFUk5FTCk7CisJCQlnc2YgPSBrbWFsbG9jKG9wdGxlbixHRlBfS0VSTkVMKTsKIAkJCWlmIChnc2YgPT0gMCkgewogCQkJCWVyciA9IC1FTk9CVUZTOwogCQkJCWJyZWFrOwpAQCAtNzk4LDcgKzc5OCw3IEBACiAJCQkJZ290byBtY19tc2Zfb3V0OwogCQkJfQogCQkJbXNpemUgPSBJUF9NU0ZJTFRFUl9TSVpFKGdzZi0+Z2ZfbnVtc3JjKTsKLQkJCW1zZiA9IChzdHJ1Y3QgaXBfbXNmaWx0ZXIgKilrbWFsbG9jKG1zaXplLEdGUF9LRVJORUwpOworCQkJbXNmID0ga21hbGxvYyhtc2l6ZSxHRlBfS0VSTkVMKTsKIAkJCWlmIChtc2YgPT0gMCkgewogCQkJCWVyciA9IC1FTk9CVUZTOwogCQkJCWdvdG8gbWNfbXNmX291dDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwaXAuYyBiL25ldC9pcHY0L2lwaXAuYwppbmRleCAzNTU3MWNmLi5lNWNiZTcyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcGlwLmMKKysrIGIvbmV0L2lwdjQvaXBpcC5jCkBAIC05Myw2ICs5Myw3IEBACiAgKi8KIAogIAorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtMjQ0LDcgKzI0NSw3IEBACiAJaWYgKGRldiA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCW50ID0gZGV2LT5wcml2OworCW50ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlTRVRfTU9EVUxFX09XTkVSKGRldik7CiAJZGV2LT5pbml0ID0gaXBpcF90dW5uZWxfaW5pdDsKIAludC0+cGFybXMgPSAqcGFybXM7CkBAIC0yNjksNyArMjcwLDcgQEAKIAkJdHVubmVsc193Y1swXSA9IE5VTEw7CiAJCXdyaXRlX3VubG9ja19iaCgmaXBpcF9sb2NrKTsKIAl9IGVsc2UKLQkJaXBpcF90dW5uZWxfdW5saW5rKChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXYpOworCQlpcGlwX3R1bm5lbF91bmxpbmsobmV0ZGV2X3ByaXYoZGV2KSk7CiAJZGV2X3B1dChkZXYpOwogfQogCkBAIC00NDMsNyArNDQ0LDcgQEAKIAkJc2tiMi0+ZHN0LT5vcHMtPnVwZGF0ZV9wbXR1KHNrYjItPmRzdCwgcmVsX2luZm8pOwogCQlyZWxfaW5mbyA9IGh0b25sKHJlbF9pbmZvKTsKIAl9IGVsc2UgaWYgKHR5cGUgPT0gSUNNUF9USU1FX0VYQ0VFREVEKSB7Ci0JCXN0cnVjdCBpcF90dW5uZWwgKnQgPSAoc3RydWN0IGlwX3R1bm5lbCopc2tiMi0+ZGV2LT5wcml2OworCQlzdHJ1Y3QgaXBfdHVubmVsICp0ID0gbmV0ZGV2X3ByaXYoc2tiMi0+ZGV2KTsKIAkJaWYgKHQtPnBhcm1zLmlwaC50dGwpIHsKIAkJCXJlbF90eXBlID0gSUNNUF9ERVNUX1VOUkVBQ0g7CiAJCQlyZWxfY29kZSA9IElDTVBfSE9TVF9VTlJFQUNIOwpAQCAtNTE0LDcgKzUxNSw3IEBACiAKIHN0YXRpYyBpbnQgaXBpcF90dW5uZWxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbCA9IChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXY7CisJc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmdHVubmVsLT5zdGF0OwogCXN0cnVjdCBpcGhkciAgKnRpcGggPSAmdHVubmVsLT5wYXJtcy5pcGg7CiAJdTggICAgIHRvcyA9IHR1bm5lbC0+cGFybXMuaXBoLnRvczsKQEAgLTYyMSw2ICs2MjIsNyBAQAogCXNrYi0+aC5yYXcgPSBza2ItPm5oLnJhdzsKIAlza2ItPm5oLnJhdyA9IHNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOwogCW1lbXNldCgmKElQQ0Ioc2tiKS0+b3B0KSwgMCwgc2l6ZW9mKElQQ0Ioc2tiKS0+b3B0KSk7CisJSVBDQihza2IpLT5mbGFncyAmPSB+KElQU0tCX1hGUk1fVFVOTkVMX1NJWkV8SVBTS0JfWEZSTV9UUkFOU0ZPUk1FRCk7CiAJZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOwogCXNrYi0+ZHN0ID0gJnJ0LT51LmRzdDsKIApAQCAtNjczLDcgKzY3NSw3IEBACiAJCQl0ID0gaXBpcF90dW5uZWxfbG9jYXRlKCZwLCAwKTsKIAkJfQogCQlpZiAodCA9PSBOVUxMKQotCQkJdCA9IChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXY7CisJCQl0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAkJbWVtY3B5KCZwLCAmdC0+cGFybXMsIHNpemVvZihwKSk7CiAJCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEsICZwLCBzaXplb2YocCkpKQogCQkJZXJyID0gLUVGQVVMVDsKQEAgLTcxMCw3ICs3MTIsNyBAQAogCQkJCQllcnIgPSAtRUlOVkFMOwogCQkJCQlicmVhazsKIAkJCQl9Ci0JCQkJdCA9IChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXY7CisJCQkJdCA9IG5ldGRldl9wcml2KGRldik7CiAJCQkJaXBpcF90dW5uZWxfdW5saW5rKHQpOwogCQkJCXQtPnBhcm1zLmlwaC5zYWRkciA9IHAuaXBoLnNhZGRyOwogCQkJCXQtPnBhcm1zLmlwaC5kYWRkciA9IHAuaXBoLmRhZGRyOwpAQCAtNzY0LDcgKzc2Niw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXBpcF90dW5uZWxfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuICYoKChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXYpLT5zdGF0KTsKKwlyZXR1cm4gJigoKHN0cnVjdCBpcF90dW5uZWwqKW5ldGRldl9wcml2KGRldikpLT5zdGF0KTsKIH0KIAogc3RhdGljIGludCBpcGlwX3R1bm5lbF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQpAQCAtNzk5LDcgKzgwMSw3IEBACiAJc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsOwogCXN0cnVjdCBpcGhkciAqaXBoOwogCi0JdHVubmVsID0gKHN0cnVjdCBpcF90dW5uZWwqKWRldi0+cHJpdjsKKwl0dW5uZWwgPSBuZXRkZXZfcHJpdihkZXYpOwogCWlwaCA9ICZ0dW5uZWwtPnBhcm1zLmlwaDsKIAogCXR1bm5lbC0+ZGV2ID0gZGV2OwpAQCAtODM3LDcgKzgzOSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwaXBfZmJfdHVubmVsX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgaXBfdHVubmVsICp0dW5uZWwgPSBkZXYtPnByaXY7CisJc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXBoZHIgKmlwaCA9ICZ0dW5uZWwtPnBhcm1zLmlwaDsKIAogCXR1bm5lbC0+ZGV2ID0gZGV2OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBtci5jIGIvbmV0L2lwdjQvaXBtci5jCmluZGV4IDlhNWMwY2UuLjVjOTRjMjIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwbXIuYworKysgYi9uZXQvaXB2NC9pcG1yLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CkBAIC0xNzgsOCArMTc5LDggQEAKIHN0YXRpYyBpbnQgcmVnX3ZpZl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJcmVhZF9sb2NrKCZtcnRfbG9jayk7Ci0JKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyopZGV2LT5wcml2KS0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47Ci0JKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyopZGV2LT5wcml2KS0+dHhfcGFja2V0cysrOworCSgoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqKW5ldGRldl9wcml2KGRldikpLT50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkoKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKiluZXRkZXZfcHJpdihkZXYpKS0+dHhfcGFja2V0cysrOwogCWlwbXJfY2FjaGVfcmVwb3J0KHNrYiwgcmVnX3ZpZl9udW0sIElHTVBNU0dfV0hPTEVQS1QpOwogCXJlYWRfdW5sb2NrKCZtcnRfbG9jayk7CiAJa2ZyZWVfc2tiKHNrYik7CkBAIC0xODgsNyArMTg5LDcgQEAKIAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpyZWdfdmlmX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXJldHVybiAoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqKWRldi0+cHJpdjsKKwlyZXR1cm4gKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKiluZXRkZXZfcHJpdihkZXYpOwogfQogCiBzdGF0aWMgdm9pZCByZWdfdmlmX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xMTQ5LDggKzExNTAsOCBAQAogCWlmICh2aWYtPmZsYWdzICYgVklGRl9SRUdJU1RFUikgewogCQl2aWYtPnBrdF9vdXQrKzsKIAkJdmlmLT5ieXRlc19vdXQrPXNrYi0+bGVuOwotCQkoKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKil2aWYtPmRldi0+cHJpdiktPnR4X2J5dGVzICs9IHNrYi0+bGVuOwotCQkoKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKil2aWYtPmRldi0+cHJpdiktPnR4X3BhY2tldHMrKzsKKwkJKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyopbmV0ZGV2X3ByaXYodmlmLT5kZXYpKS0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCSgoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqKW5ldGRldl9wcml2KHZpZi0+ZGV2KSktPnR4X3BhY2tldHMrKzsKIAkJaXBtcl9jYWNoZV9yZXBvcnQoc2tiLCB2aWZpLCBJR01QTVNHX1dIT0xFUEtUKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybjsKQEAgLTEyMTAsOCArMTIxMSw4IEBACiAJaWYgKHZpZi0+ZmxhZ3MgJiBWSUZGX1RVTk5FTCkgewogCQlpcF9lbmNhcChza2IsIHZpZi0+bG9jYWwsIHZpZi0+cmVtb3RlKTsKIAkJLyogRklYTUU6IGV4dHJhIG91dHB1dCBmaXJld2FsbCBzdGVwIHVzZWQgdG8gYmUgaGVyZS4gLS1SUiAqLwotCQkoKHN0cnVjdCBpcF90dW5uZWwgKil2aWYtPmRldi0+cHJpdiktPnN0YXQudHhfcGFja2V0cysrOwotCQkoKHN0cnVjdCBpcF90dW5uZWwgKil2aWYtPmRldi0+cHJpdiktPnN0YXQudHhfYnl0ZXMrPXNrYi0+bGVuOworCQkoKHN0cnVjdCBpcF90dW5uZWwgKiluZXRkZXZfcHJpdih2aWYtPmRldikpLT5zdGF0LnR4X3BhY2tldHMrKzsKKwkJKChzdHJ1Y3QgaXBfdHVubmVsICopbmV0ZGV2X3ByaXYodmlmLT5kZXYpKS0+c3RhdC50eF9ieXRlcys9c2tiLT5sZW47CiAJfQogCiAJSVBDQihza2IpLT5mbGFncyB8PSBJUFNLQl9GT1JXQVJERUQ7CkBAIC0xNDY3LDggKzE0NjgsOCBAQAogCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKIAlkc3RfcmVsZWFzZShza2ItPmRzdCk7CiAJc2tiLT5kc3QgPSBOVUxMOwotCSgoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqKXJlZ19kZXYtPnByaXYpLT5yeF9ieXRlcyArPSBza2ItPmxlbjsKLQkoKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKilyZWdfZGV2LT5wcml2KS0+cnhfcGFja2V0cysrOworCSgoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqKW5ldGRldl9wcml2KHJlZ19kZXYpKS0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyopbmV0ZGV2X3ByaXYocmVnX2RldikpLT5yeF9wYWNrZXRzKys7CiAJbmZfcmVzZXQoc2tiKTsKIAluZXRpZl9yeChza2IpOwogCWRldl9wdXQocmVnX2Rldik7CkBAIC0xNTIyLDggKzE1MjMsOCBAQAogCXNrYi0+aXBfc3VtbWVkID0gMDsKIAlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CiAJZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOwotCSgoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqKXJlZ19kZXYtPnByaXYpLT5yeF9ieXRlcyArPSBza2ItPmxlbjsKLQkoKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKilyZWdfZGV2LT5wcml2KS0+cnhfcGFja2V0cysrOworCSgoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqKW5ldGRldl9wcml2KHJlZ19kZXYpKS0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyopbmV0ZGV2X3ByaXYocmVnX2RldikpLT5yeF9wYWNrZXRzKys7CiAJc2tiLT5kc3QgPSBOVUxMOwogCW5mX3Jlc2V0KHNrYik7CiAJbmV0aWZfcngoc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfY3RsLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2N0bC5jCmluZGV4IGM5MzVjNTAuLjdmMDI4OGIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfY3RsLmMKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19jdGwuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyLmMKaW5kZXggYWUwNzc5ZC4uNTJhM2Q3YyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyLmMKQEAgLTEsMTcgKzEsMTEgQEAKIC8qIElQdjQgc3BlY2lmaWMgZnVuY3Rpb25zIG9mIG5ldGZpbHRlciBjb3JlICovCi0KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpZmRlZiBDT05GSUdfTkVURklMVEVSCi0KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgotCi0jaW5jbHVkZSA8bGludXgvdGNwLmg+Ci0jaW5jbHVkZSA8bGludXgvdWRwLmg+Ci0jaW5jbHVkZSA8bGludXgvaWNtcC5oPgotI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KIAogLyogcm91dGVfbWVfaGFyZGVyIGZ1bmN0aW9uLCB1c2VkIGJ5IGlwdGFibGVfbmF0LCBpcHRhYmxlX21hbmdsZSArIGlwX3F1ZXVlICovCiBpbnQgaXBfcm91dGVfbWVfaGFyZGVyKHN0cnVjdCBza19idWZmICoqcHNrYikKQEAgLTMzLDcgKzI3LDYgQEAKICNpZmRlZiBDT05GSUdfSVBfUk9VVEVfRldNQVJLCiAJCWZsLm5sX3UuaXA0X3UuZndtYXJrID0gKCpwc2tiKS0+bmZtYXJrOwogI2VuZGlmCi0JCWZsLnByb3RvID0gaXBoLT5wcm90b2NvbDsKIAkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpICE9IDApCiAJCQlyZXR1cm4gLTE7CiAKQEAgLTYwLDYgKzUzLDEzIEBACiAJaWYgKCgqcHNrYiktPmRzdC0+ZXJyb3IpCiAJCXJldHVybiAtMTsKIAorI2lmZGVmIENPTkZJR19YRlJNCisJaWYgKCEoSVBDQigqcHNrYiktPmZsYWdzICYgSVBTS0JfWEZSTV9UUkFOU0ZPUk1FRCkgJiYKKwkgICAgeGZybV9kZWNvZGVfc2Vzc2lvbigqcHNrYiwgJmZsLCBBRl9JTkVUKSA9PSAwKQorCQlpZiAoeGZybV9sb29rdXAoJigqcHNrYiktPmRzdCwgJmZsLCAoKnBza2IpLT5zaywgMCkpCisJCQlyZXR1cm4gLTE7CisjZW5kaWYKKwogCS8qIENoYW5nZSBpbiBvaWYgbWF5IG1lYW4gY2hhbmdlIGluIGhoX2xlbi4gKi8KIAloaF9sZW4gPSAoKnBza2IpLT5kc3QtPmRldi0+aGFyZF9oZWFkZXJfbGVuOwogCWlmIChza2JfaGVhZHJvb20oKnBza2IpIDwgaGhfbGVuKSB7CkBAIC03OCw2ICs3OCw5IEBACiB9CiBFWFBPUlRfU1lNQk9MKGlwX3JvdXRlX21lX2hhcmRlcik7CiAKK3ZvaWQgKCppcF9uYXRfZGVjb2RlX3Nlc3Npb24pKHN0cnVjdCBza19idWZmICosIHN0cnVjdCBmbG93aSAqKTsKK0VYUE9SVF9TWU1CT0woaXBfbmF0X2RlY29kZV9zZXNzaW9uKTsKKwogLyoKICAqIEV4dHJhIHJvdXRpbmcgbWF5IG5lZWRlZCBvbiBsb2NhbCBvdXQsIGFzIHRoZSBRVUVVRSB0YXJnZXQgbmV2ZXIKICAqIHJldHVybnMgY29udHJvbCB0byB0aGUgdGFibGUuCkBAIC0xMzUsNSArMTM4LDMgQEAKIAogbW9kdWxlX2luaXQoaW5pdCk7CiBtb2R1bGVfZXhpdChmaW5pKTsKLQotI2VuZGlmIC8qIENPTkZJR19ORVRGSUxURVIgKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKaW5kZXggODhhNjA2NS4uZGI3ODMwMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTE4Miw2ICsxODIsNyBAQAogCiBjb25maWcgSVBfTkZfSVBUQUJMRVMKIAl0cmlzdGF0ZSAiSVAgdGFibGVzIHN1cHBvcnQgKHJlcXVpcmVkIGZvciBmaWx0ZXJpbmcvbWFzcS9OQVQpIgorCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKIAloZWxwCiAJICBpcHRhYmxlcyBpcyBhIGdlbmVyYWwsIGV4dGVuc2libGUgcGFja2V0IGlkZW50aWZpY2F0aW9uIGZyYW1ld29yay4KIAkgIFRoZSBwYWNrZXQgZmlsdGVyaW5nIGFuZCBmdWxsIE5BVCAobWFzcXVlcmFkaW5nLCBwb3J0IGZvcndhcmRpbmcsCkBAIC0xOTEsMTYgKzE5Miw2IEBACiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAogIyBUaGUgbWF0Y2hlcy4KLWNvbmZpZyBJUF9ORl9NQVRDSF9MSU1JVAotCXRyaXN0YXRlICJsaW1pdCBtYXRjaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQloZWxwCi0JICBsaW1pdCBtYXRjaGluZyBhbGxvd3MgeW91IHRvIGNvbnRyb2wgdGhlIHJhdGUgYXQgd2hpY2ggYSBydWxlIGNhbiBiZQotCSAgbWF0Y2hlZDogbWFpbmx5IHVzZWZ1bCBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBMT0cgdGFyZ2V0ICgiTE9HCi0JICB0YXJnZXQgc3VwcG9ydCIsIGJlbG93KSBhbmQgdG8gYXZvaWQgc29tZSBEZW5pYWwgb2YgU2VydmljZSBhdHRhY2tzLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIElQX05GX01BVENIX0lQUkFOR0UKIAl0cmlzdGF0ZSAiSVAgcmFuZ2UgbWF0Y2ggc3VwcG9ydCIKIAlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCkBAIC0yMTAsMzcgKzIwMSw2IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgSVBfTkZfTUFUQ0hfTUFDCi0JdHJpc3RhdGUgIk1BQyBhZGRyZXNzIG1hdGNoIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwotCWhlbHAKLQkgIE1BQyBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIHBhY2tldHMgYmFzZWQgb24gdGhlIHNvdXJjZQotCSAgRXRoZXJuZXQgYWRkcmVzcyBvZiB0aGUgcGFja2V0LgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIElQX05GX01BVENIX1BLVFRZUEUKLQl0cmlzdGF0ZSAiUGFja2V0IHR5cGUgbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JaGVscAotCSAgUGFja2V0IHR5cGUgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBhIHBhY2tldCBieQotCSAgaXRzICJjbGFzcyIsIGVnLiBCUk9BRENBU1QsIE1VTFRJQ0FTVCwgLi4uCi0KLQkgIFR5cGljYWwgdXNhZ2U6Ci0JICBpcHRhYmxlcyAtQSBJTlBVVCAtbSBwa3R0eXBlIC0tcGt0LXR5cGUgYnJvYWRjYXN0IC1qIExPRwotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIElQX05GX01BVENIX01BUksKLQl0cmlzdGF0ZSAibmV0ZmlsdGVyIE1BUksgbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JaGVscAotCSAgTmV0ZmlsdGVyIG1hcmsgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGJhc2VkIG9uIHRoZQotCSAgYG5mbWFyaycgdmFsdWUgaW4gdGhlIHBhY2tldC4gIFRoaXMgY2FuIGJlIHNldCBieSB0aGUgTUFSSyB0YXJnZXQKLQkgIChzZWUgYmVsb3cpLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIElQX05GX01BVENIX01VTFRJUE9SVAogCXRyaXN0YXRlICJNdWx0aXBsZSBwb3J0IG1hdGNoIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwpAQCAtMzAxLDE1ICsyNjEsNiBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIElQX05GX01BVENIX0xFTkdUSAotCXRyaXN0YXRlICJMRU5HVEggbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIGEgcGFja2V0IGFnYWluc3QgYQotCSAgc3BlY2lmaWMgdmFsdWUgb3IgcmFuZ2Ugb2YgdmFsdWVzLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIElQX05GX01BVENIX1RUTAogCXRyaXN0YXRlICJUVEwgbWF0Y2ggc3VwcG9ydCIKIAlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCkBAIC0zMTksNTAgKzI3MCw2IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgSVBfTkZfTUFUQ0hfVENQTVNTCi0JdHJpc3RhdGUgInRjcG1zcyBtYXRjaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBhZGRzIGEgYHRjcG1zcycgbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gZXhhbWluZSB0aGUKLQkgIE1TUyB2YWx1ZSBvZiBUQ1AgU1lOIHBhY2tldHMsIHdoaWNoIGNvbnRyb2wgdGhlIG1heGltdW0gcGFja2V0IHNpemUKLQkgIGZvciB0aGF0IGNvbm5lY3Rpb24uCi0KLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcgSVBfTkZfTUFUQ0hfSEVMUEVSCi0JdHJpc3RhdGUgIkhlbHBlciBtYXRjaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyB8fCBORl9DT05OVFJBQ0tfSVBWNAotCWhlbHAKLQkgIEhlbHBlciBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIHBhY2tldHMgaW4gZHluYW1pYyBjb25uZWN0aW9ucwotCSAgdHJhY2tlZCBieSBhIGNvbm50cmFjay1oZWxwZXIsIGllLiBpcF9jb25udHJhY2tfZnRwCi0KLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBZLgotCi1jb25maWcgSVBfTkZfTUFUQ0hfU1RBVEUKLQl0cmlzdGF0ZSAiQ29ubmVjdGlvbiBzdGF0ZSBtYXRjaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyB8fCBORl9DT05OVFJBQ0tfSVBWNAotCWhlbHAKLQkgIENvbm5lY3Rpb24gc3RhdGUgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGJhc2VkIG9uIHRoZWlyCi0JICByZWxhdGlvbnNoaXAgdG8gYSB0cmFja2VkIGNvbm5lY3Rpb24gKGllLiBwcmV2aW91cyBwYWNrZXRzKS4gIFRoaXMKLQkgIGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgcGFja2V0IGNsYXNzaWZpY2F0aW9uLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIElQX05GX01BVENIX0NPTk5UUkFDSwotCXRyaXN0YXRlICJDb25uZWN0aW9uIHRyYWNraW5nIG1hdGNoIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwotCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLIHx8IE5GX0NPTk5UUkFDS19JUFY0Ci0JaGVscAotCSAgVGhpcyBpcyBhIGdlbmVyYWwgY29ubnRyYWNrIG1hdGNoIG1vZHVsZSwgYSBzdXBlcnNldCBvZiB0aGUgc3RhdGUgbWF0Y2guCi0KLQkgIEl0IGFsbG93cyBtYXRjaGluZyBvbiBhZGRpdGlvbmFsIGNvbm50cmFjayBpbmZvcm1hdGlvbiwgd2hpY2ggaXMKLQkgIHVzZWZ1bCBpbiBjb21wbGV4IGNvbmZpZ3VyYXRpb25zLCBzdWNoIGFzIE5BVCBnYXRld2F5cyB3aXRoIG11bHRpcGxlCi0JICBpbnRlcm5ldCBsaW5rcyBvciB0dW5uZWxzLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIElQX05GX01BVENIX09XTkVSCiAJdHJpc3RhdGUgIk93bmVyIG1hdGNoIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwpAQCAtMzcyLDE1ICsyNzksNiBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIElQX05GX01BVENIX1BIWVNERVYKLQl0cmlzdGF0ZSAiUGh5c2RldiBtYXRjaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMgJiYgQlJJREdFX05FVEZJTFRFUgotCWhlbHAKLQkgIFBoeXNkZXYgcGFja2V0IG1hdGNoaW5nIG1hdGNoZXMgYWdhaW5zdCB0aGUgcGh5c2ljYWwgYnJpZGdlIHBvcnRzCi0JICB0aGUgSVAgcGFja2V0IGFycml2ZWQgb24gb3Igd2lsbCBsZWF2ZSBieS4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBJUF9ORl9NQVRDSF9BRERSVFlQRQogCXRyaXN0YXRlICAnYWRkcmVzcyB0eXBlIG1hdGNoIHN1cHBvcnQnCiAJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwpAQCAtMzkxLDc1ICsyODksNiBAQAogCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAogCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBJZiB1bnN1cmUsIHNheSBgTicuCiAKLWNvbmZpZyBJUF9ORl9NQVRDSF9SRUFMTQotCXRyaXN0YXRlICAncmVhbG0gbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0Jc2VsZWN0IE5FVF9DTFNfUk9VVEUKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBhZGRzIGEgYHJlYWxtJyBtYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byB1c2UgdGhlIHJlYWxtCi0JICBrZXkgZnJvbSB0aGUgcm91dGluZyBzdWJzeXN0ZW0gaW5zaWRlIGlwdGFibGVzLgotCQotCSAgVGhpcyBtYXRjaCBwcmV0dHkgbXVjaCByZXNlbWJsZXMgdGhlIENPTkZJR19ORVRfQ0xTX1JPVVRFNCBvcHRpb24gCi0JICBpbiB0YyB3b3JsZC4KLQkKLQkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgotCi1jb25maWcgSVBfTkZfTUFUQ0hfU0NUUAotCXRyaXN0YXRlICAnU0NUUCBwcm90b2NvbCBtYXRjaCBzdXBwb3J0JwotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQloZWxwCi0JICBXaXRoIHRoaXMgb3B0aW9uIGVuYWJsZWQsIHlvdSB3aWxsIGJlIGFibGUgdG8gdXNlIHRoZSBpcHRhYmxlcwotCSAgYHNjdHAnIG1hdGNoIGluIG9yZGVyIHRvIG1hdGNoIG9uIFNDVFAgc291cmNlL2Rlc3RpbmF0aW9uIHBvcnRzCi0JICBhbmQgU0NUUCBjaHVuayB0eXBlcy4KLQotCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBJZiB1bnN1cmUsIHNheSBgTicuCi0KLWNvbmZpZyBJUF9ORl9NQVRDSF9EQ0NQCi0JdHJpc3RhdGUgICdEQ0NQIHByb3RvY29sIG1hdGNoIHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwotCWhlbHAKLQkgIFdpdGggdGhpcyBvcHRpb24gZW5hYmxlZCwgeW91IHdpbGwgYmUgYWJsZSB0byB1c2UgdGhlIGlwdGFibGVzCi0JICBgZGNjcCcgbWF0Y2ggaW4gb3JkZXIgdG8gbWF0Y2ggb24gRENDUCBzb3VyY2UvZGVzdGluYXRpb24gcG9ydHMKLQkgIGFuZCBEQ0NQIGZsYWdzLgotCi0JICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCi0JICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KLQotY29uZmlnIElQX05GX01BVENIX0NPTU1FTlQKLQl0cmlzdGF0ZSAgJ2NvbW1lbnQgbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBjb21tZW50JyBkdW1teS1tYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byBwdXQKLQkgIGNvbW1lbnRzIGluIHlvdXIgaXB0YWJsZXMgcnVsZXNldC4KLQotCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBJZiB1bnN1cmUsIHNheSBgTicuCi0KLWNvbmZpZyBJUF9ORl9NQVRDSF9DT05OTUFSSwotCXRyaXN0YXRlICAnQ29ubmVjdGlvbiBtYXJrIG1hdGNoIHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwotCWRlcGVuZHMgb24gKElQX05GX0NPTk5UUkFDSyAmJiBJUF9ORl9DT05OVFJBQ0tfTUFSSykgfHwgKE5GX0NPTk5UUkFDS19NQVJLICYmIE5GX0NPTk5UUkFDS19JUFY0KQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgY29ubm1hcmsnIG1hdGNoLCB3aGljaCBhbGxvd3MgeW91IHRvIG1hdGNoIHRoZQotCSAgY29ubmVjdGlvbiBtYXJrIHZhbHVlIHByZXZpb3VzbHkgc2V0IGZvciB0aGUgc2Vzc2lvbiBieSBgQ09OTk1BUksnLiAKLQkKLQkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAotCSAgaXB0X2Nvbm5tYXJrLm8uICBJZiB1bnN1cmUsIHNheSBgTicuCi0KLWNvbmZpZyBJUF9ORl9NQVRDSF9DT05OQllURVMKLQl0cmlzdGF0ZSAgJ0Nvbm5lY3Rpb24gYnl0ZS9wYWNrZXQgY291bnRlciBtYXRjaCBzdXBwb3J0JwotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQlkZXBlbmRzIG9uIChJUF9ORl9DT05OVFJBQ0sgJiYgSVBfTkZfQ1RfQUNDVCkgfHwgKE5GX0NUX0FDQ1QgJiYgTkZfQ09OTlRSQUNLX0lQVjQpCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBjb25uYnl0ZXMnIG1hdGNoLCB3aGljaCBhbGxvd3MgeW91IHRvIG1hdGNoIHRoZQotCSAgbnVtYmVyIG9mIGJ5dGVzIGFuZC9vciBwYWNrZXRzIGZvciBlYWNoIGRpcmVjdGlvbiB3aXRoaW4gYSBjb25uZWN0aW9uLgotCi0JICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCi0JICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KLQogY29uZmlnIElQX05GX01BVENIX0hBU0hMSU1JVAogCXRyaXN0YXRlICAnaGFzaGxpbWl0IG1hdGNoIHN1cHBvcnQnCiAJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwpAQCAtNDc0LDE4ICszMDMsMTUgQEAKIAkgIGRlc3RpbmF0aW9uIElQJyBvciBgNTAwcHBzIGZyb20gYW55IGdpdmVuIHNvdXJjZSBJUCcgIHdpdGggYSBzaW5nbGUKIAkgIElQdGFibGVzIHJ1bGUuCiAKLWNvbmZpZyBJUF9ORl9NQVRDSF9TVFJJTkcKLQl0cmlzdGF0ZSAgJ3N0cmluZyBtYXRjaCBzdXBwb3J0JwotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMgCi0Jc2VsZWN0IFRFWFRTRUFSQ0gKLQlzZWxlY3QgVEVYVFNFQVJDSF9LTVAKLQlzZWxlY3QgVEVYVFNFQVJDSF9CTQotCXNlbGVjdCBURVhUU0VBUkNIX0ZTTQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgc3RyaW5nJyBtYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byBsb29rIGZvcgotCSAgcGF0dGVybiBtYXRjaGluZ3MgaW4gcGFja2V0cy4KK2NvbmZpZyBJUF9ORl9NQVRDSF9QT0xJQ1kKKyAgICAgICB0cmlzdGF0ZSAiSVBzZWMgcG9saWN5IG1hdGNoIHN1cHBvcnQiCisgICAgICAgZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyAmJiBYRlJNCisgICAgICAgaGVscAorICAgICAgICAgUG9saWN5IG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggcGFja2V0cyBiYXNlZCBvbiB0aGUKKyAgICAgICAgIElQc2VjIHBvbGljeSB0aGF0IHdhcyB1c2VkIGR1cmluZyBkZWNhcHN1bGF0aW9uL3dpbGwKKyAgICAgICAgIGJlIHVzZWQgZHVyaW5nIGVuY2Fwc3VsYXRpb24uCiAKLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorICAgICAgICAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKICMgYGZpbHRlcicsIGdlbmVyaWMgYW5kIHNwZWNpZmljIHRhcmdldHMKIGNvbmZpZyBJUF9ORl9GSUxURVIKQEAgLTU2MiwxNyArMzg4LDYgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJUF9ORl9UQVJHRVRfTkZRVUVVRQotCXRyaXN0YXRlICJORlFVRVVFIFRhcmdldCBTdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQloZWxwCi0JICBUaGlzIFRhcmdldCByZXBsYWNlZCB0aGUgb2xkIG9ic29sZXRlIFFVRVVFIHRhcmdldC4KLQotCSAgQXMgb3Bwb3NlZCB0byBRVUVVRSwgaXQgc3VwcG9ydHMgNjU1MzUgZGlmZmVyZW50IHF1ZXVlcywKLQkgIG5vdCBqdXN0IG9uZS4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KICMgTkFUICsgc3BlY2lmaWMgdGFyZ2V0cwogY29uZmlnIElQX05GX05BVAogCXRyaXN0YXRlICJGdWxsIE5BVCIKQEAgLTcyNSwzMSArNTQwLDYgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJUF9ORl9UQVJHRVRfTUFSSwotCXRyaXN0YXRlICJNQVJLIHRhcmdldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfTUFOR0xFCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBNQVJLJyB0YXJnZXQsIHdoaWNoIGFsbG93cyB5b3UgdG8gY3JlYXRlIHJ1bGVzCi0JICBpbiB0aGUgYG1hbmdsZScgdGFibGUgd2hpY2ggYWx0ZXIgdGhlIG5ldGZpbHRlciBtYXJrIChuZm1hcmspIGZpZWxkCi0JICBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2tldCBwcmlvciB0byByb3V0aW5nLiBUaGlzIGNhbiBjaGFuZ2UKLQkgIHRoZSByb3V0aW5nIG1ldGhvZCAoc2VlIGBVc2UgbmV0ZmlsdGVyIE1BUksgdmFsdWUgYXMgcm91dGluZwotCSAga2V5JykgYW5kIGNhbiBhbHNvIGJlIHVzZWQgYnkgb3RoZXIgc3Vic3lzdGVtcyB0byBjaGFuZ2UgdGhlaXIKLQkgIGJlaGF2aW9yLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIElQX05GX1RBUkdFVF9DTEFTU0lGWQotCXRyaXN0YXRlICJDTEFTU0lGWSB0YXJnZXQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX01BTkdMRQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgQ0xBU1NJRlknIHRhcmdldCwgd2hpY2ggZW5hYmxlcyB0aGUgdXNlciB0byBzZXQKLQkgIHRoZSBwcmlvcml0eSBvZiBhIHBhY2tldC4gU29tZSBxZGlzY3MgY2FuIHVzZSB0aGlzIHZhbHVlIGZvcgotCSAgY2xhc3NpZmljYXRpb24sIGFtb25nIHRoZXNlIGFyZToKLQotICAJICBhdG0sIGNicSwgZHNtYXJrLCBwZmlmb19mYXN0LCBodGIsIHByaW8KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBJUF9ORl9UQVJHRVRfVFRMCiAJdHJpc3RhdGUgICdUVEwgdGFyZ2V0IHN1cHBvcnQnCiAJZGVwZW5kcyBvbiBJUF9ORl9NQU5HTEUKQEAgLTc2NCwxOSArNTU0LDYgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJUF9ORl9UQVJHRVRfQ09OTk1BUksKLQl0cmlzdGF0ZSAgJ0NPTk5NQVJLIHRhcmdldCBzdXBwb3J0JwotCWRlcGVuZHMgb24gSVBfTkZfTUFOR0xFCi0JZGVwZW5kcyBvbiAoSVBfTkZfQ09OTlRSQUNLICYmIElQX05GX0NPTk5UUkFDS19NQVJLKSB8fCAoTkZfQ09OTlRSQUNLX01BUksgJiYgTkZfQ09OTlRSQUNLX0lQVjQpCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBDT05OTUFSSycgdGFyZ2V0LCB3aGljaCBhbGxvd3Mgb25lIHRvIG1hbmlwdWxhdGUKLQkgIHRoZSBjb25uZWN0aW9uIG1hcmsgdmFsdWUuICBTaW1pbGFyIHRvIHRoZSBNQVJLIHRhcmdldCwgYnV0Ci0JICBhZmZlY3RzIHRoZSBjb25uZWN0aW9uIG1hcmsgdmFsdWUgcmF0aGVyIHRoYW4gdGhlIHBhY2tldCBtYXJrIHZhbHVlLgotCQotCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCi0JICBpcHRfQ09OTk1BUksuby4gIElmIHVuc3VyZSwgc2F5IGBOJy4KLQogY29uZmlnIElQX05GX1RBUkdFVF9DTFVTVEVSSVAKIAl0cmlzdGF0ZSAiQ0xVU1RFUklQIHRhcmdldCBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gSVBfTkZfTUFOR0xFICYmIEVYUEVSSU1FTlRBTApAQCAtODAwLDIzICs1NzcsMTAgQEAKIAkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKIAkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgogCi1jb25maWcgSVBfTkZfVEFSR0VUX05PVFJBQ0sKLQl0cmlzdGF0ZSAgJ05PVFJBQ0sgdGFyZ2V0IHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBJUF9ORl9SQVcKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyB8fCBORl9DT05OVFJBQ0tfSVBWNAotCWhlbHAKLQkgIFRoZSBOT1RSQUNLIHRhcmdldCBhbGxvd3MgYSBzZWxlY3QgcnVsZSB0byBzcGVjaWZ5Ci0JICB3aGljaCBwYWNrZXRzICpub3QqIHRvIGVudGVyIHRoZSBjb25udHJhY2svTkFUCi0JICBzdWJzeXN0ZW0gd2l0aCBhbGwgdGhlIGNvbnNlcXVlbmNlcyAobm8gSUNNUCBlcnJvciB0cmFja2luZywKLQkgIG5vIHByb3RvY29sIGhlbHBlcnMgZm9yIHRoZSBzZWxlY3RlZCBwYWNrZXRzKS4KLQkKLQkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgotCi0KICMgQVJQIHRhYmxlcwogY29uZmlnIElQX05GX0FSUFRBQkxFUwogCXRyaXN0YXRlICJBUlAgdGFibGVzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwogCWhlbHAKIAkgIGFycHRhYmxlcyBpcyBhIGdlbmVyYWwsIGV4dGVuc2libGUgcGFja2V0IGlkZW50aWZpY2F0aW9uIGZyYW1ld29yay4KIAkgIFRoZSBBUlAgcGFja2V0IGZpbHRlcmluZyBhbmQgbWFuZ2xpbmcgKG1hbmlwdWxhdGlvbilzdWJzeXN0ZW1zCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUKaW5kZXggZDBhNDQ3ZS4uZTVjNWIzMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9NYWtlZmlsZQpAQCAtNDYsMTUgKzQ2LDggQEAKIG9iai0kKENPTkZJR19JUF9ORl9SQVcpICs9IGlwdGFibGVfcmF3Lm8KIAogIyBtYXRjaGVzCi1vYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfSEVMUEVSKSArPSBpcHRfaGVscGVyLm8KLW9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9MSU1JVCkgKz0gaXB0X2xpbWl0Lm8KIG9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9IQVNITElNSVQpICs9IGlwdF9oYXNobGltaXQubwotb2JqLSQoQ09ORklHX0lQX05GX01BVENIX1NDVFApICs9IGlwdF9zY3RwLm8KLW9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9EQ0NQKSArPSBpcHRfZGNjcC5vCi1vYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfTUFSSykgKz0gaXB0X21hcmsubwotb2JqLSQoQ09ORklHX0lQX05GX01BVENIX01BQykgKz0gaXB0X21hYy5vCiBvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfSVBSQU5HRSkgKz0gaXB0X2lwcmFuZ2Uubwotb2JqLSQoQ09ORklHX0lQX05GX01BVENIX1BLVFRZUEUpICs9IGlwdF9wa3R0eXBlLm8KIG9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9NVUxUSVBPUlQpICs9IGlwdF9tdWx0aXBvcnQubwogb2JqLSQoQ09ORklHX0lQX05GX01BVENIX09XTkVSKSArPSBpcHRfb3duZXIubwogb2JqLSQoQ09ORklHX0lQX05GX01BVENIX1RPUykgKz0gaXB0X3Rvcy5vCkBAIC02MiwzOSArNTUsMjUgQEAKIG9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9FQ04pICs9IGlwdF9lY24ubwogb2JqLSQoQ09ORklHX0lQX05GX01BVENIX0RTQ1ApICs9IGlwdF9kc2NwLm8KIG9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9BSF9FU1ApICs9IGlwdF9haC5vIGlwdF9lc3Aubwotb2JqLSQoQ09ORklHX0lQX05GX01BVENIX0xFTkdUSCkgKz0gaXB0X2xlbmd0aC5vCiBvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfVFRMKSArPSBpcHRfdHRsLm8KLW9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9TVEFURSkgKz0gaXB0X3N0YXRlLm8KLW9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9DT05OTUFSSykgKz0gaXB0X2Nvbm5tYXJrLm8KLW9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9DT05OVFJBQ0spICs9IGlwdF9jb25udHJhY2subwotb2JqLSQoQ09ORklHX0lQX05GX01BVENIX0NPTk5CWVRFUykgKz0gaXB0X2Nvbm5ieXRlcy5vCi1vYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfVENQTVNTKSArPSBpcHRfdGNwbXNzLm8KLW9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9SRUFMTSkgKz0gaXB0X3JlYWxtLm8KIG9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9BRERSVFlQRSkgKz0gaXB0X2FkZHJ0eXBlLm8KLW9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9QSFlTREVWKSArPSBpcHRfcGh5c2Rldi5vCi1vYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfQ09NTUVOVCkgKz0gaXB0X2NvbW1lbnQubwotb2JqLSQoQ09ORklHX0lQX05GX01BVENIX1NUUklORykgKz0gaXB0X3N0cmluZy5vCitvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfUE9MSUNZKSArPSBpcHRfcG9saWN5Lm8KIAogIyB0YXJnZXRzCiBvYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVCkgKz0gaXB0X1JFSkVDVC5vCiBvYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX1RPUykgKz0gaXB0X1RPUy5vCiBvYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX0VDTikgKz0gaXB0X0VDTi5vCiBvYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX0RTQ1ApICs9IGlwdF9EU0NQLm8KLW9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfTUFSSykgKz0gaXB0X01BUksubwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9NQVNRVUVSQURFKSArPSBpcHRfTUFTUVVFUkFERS5vCiBvYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX1JFRElSRUNUKSArPSBpcHRfUkVESVJFQ1Qubwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9ORVRNQVApICs9IGlwdF9ORVRNQVAubwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9TQU1FKSArPSBpcHRfU0FNRS5vCi1vYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX0NMQVNTSUZZKSArPSBpcHRfQ0xBU1NJRlkubwogb2JqLSQoQ09ORklHX0lQX05GX05BVF9TTk1QX0JBU0lDKSArPSBpcF9uYXRfc25tcF9iYXNpYy5vCiBvYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX0xPRykgKz0gaXB0X0xPRy5vCi1vYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX0NPTk5NQVJLKSArPSBpcHRfQ09OTk1BUksubwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9VTE9HKSArPSBpcHRfVUxPRy5vCiBvYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX1RDUE1TUykgKz0gaXB0X1RDUE1TUy5vCi1vYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX05PVFJBQ0spICs9IGlwdF9OT1RSQUNLLm8KIG9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfQ0xVU1RFUklQKSArPSBpcHRfQ0xVU1RFUklQLm8KIG9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfVFRMKSArPSBpcHRfVFRMLm8KLW9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfTkZRVUVVRSkgKz0gaXB0X05GUVVFVUUubwogCiAjIGdlbmVyaWMgQVJQIHRhYmxlcwogb2JqLSQoQ09ORklHX0lQX05GX0FSUFRBQkxFUykgKz0gYXJwX3RhYmxlcy5vCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwX3RhYmxlcy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycF90YWJsZXMuYwppbmRleCBiYmExNTYzLi5hZmUzZDhmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwX3RhYmxlcy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9hcnBfdGFibGVzLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KQEAgLTIzLDYgKzI0LDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KIAorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9hcnAvYXJwX3RhYmxlcy5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CkBAIC01NCwyOCArNTYsOSBAQAogI2Vsc2UKICNkZWZpbmUgQVJQX05GX0FTU0VSVCh4KQogI2VuZGlmCi0jZGVmaW5lIFNNUF9BTElHTih4KSAoKCh4KSArIFNNUF9DQUNIRV9CWVRFUy0xKSAmIH4oU01QX0NBQ0hFX0JZVEVTLTEpKQogCi1zdGF0aWMgREVDTEFSRV9NVVRFWChhcnB0X211dGV4KTsKLQotI2RlZmluZSBBU1NFUlRfUkVBRF9MT0NLKHgpIEFSUF9ORl9BU1NFUlQoZG93bl90cnlsb2NrKCZhcnB0X211dGV4KSAhPSAwKQotI2RlZmluZSBBU1NFUlRfV1JJVEVfTE9DSyh4KSBBUlBfTkZfQVNTRVJUKGRvd25fdHJ5bG9jaygmYXJwdF9tdXRleCkgIT0gMCkKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9saXN0aGVscC5oPgogCi1zdHJ1Y3QgYXJwdF90YWJsZV9pbmZvIHsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQl1bnNpZ25lZCBpbnQgbnVtYmVyOwotCXVuc2lnbmVkIGludCBpbml0aWFsX2VudHJpZXM7Ci0JdW5zaWduZWQgaW50IGhvb2tfZW50cnlbTkZfQVJQX05VTUhPT0tTXTsKLQl1bnNpZ25lZCBpbnQgdW5kZXJmbG93W05GX0FSUF9OVU1IT09LU107Ci0Jdm9pZCAqZW50cmllc1tOUl9DUFVTXTsKLX07Ci0KLXN0YXRpYyBMSVNUX0hFQUQoYXJwdF90YXJnZXQpOwotc3RhdGljIExJU1RfSEVBRChhcnB0X3RhYmxlcyk7Ci0jZGVmaW5lIFNFVF9DT1VOVEVSKGMsYixwKSBkbyB7IChjKS5iY250ID0gKGIpOyAoYykucGNudCA9IChwKTsgfSB3aGlsZSgwKQotI2RlZmluZSBBRERfQ09VTlRFUihjLGIscCkgZG8geyAoYykuYmNudCArPSAoYik7IChjKS5wY250ICs9IChwKTsgfSB3aGlsZSgwKQotCiBzdGF0aWMgaW5saW5lIGludCBhcnBfZGV2YWRkcl9jb21wYXJlKGNvbnN0IHN0cnVjdCBhcnB0X2RldmFkZHJfaW5mbyAqYXAsCiAJCQkJICAgICAgY2hhciAqaGRyX2FkZHIsIGludCBsZW4pCiB7CkBAIC0yMjIsOSArMjA1LDkgQEAKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBhcnB0X2Vycm9yKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKIAkJCSAgICAgICBjb25zdCB2b2lkICp0YXJnaW5mbywKIAkJCSAgICAgICB2b2lkICp1c2VyaW5mbykKIHsKQEAgLTI1Myw2ICsyMzYsNyBAQAogCXN0cnVjdCBhcnB0X2VudHJ5ICplLCAqYmFjazsKIAljb25zdCBjaGFyICppbmRldiwgKm91dGRldjsKIAl2b2lkICp0YWJsZV9iYXNlOworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlID0gdGFibGUtPnByaXZhdGU7CiAKIAkvKiBBUlAgaGVhZGVyLCBwbHVzIDIgZGV2aWNlIGFkZHJlc3NlcywgcGx1cyAyIElQIGFkZHJlc3Nlcy4gICovCiAJaWYgKCFwc2tiX21heV9wdWxsKCgqcHNrYiksIChzaXplb2Yoc3RydWN0IGFycGhkcikgKwpAQCAtMjY0LDkgKzI0OCw5IEBACiAJb3V0ZGV2ID0gb3V0ID8gb3V0LT5uYW1lIDogbnVsbGRldm5hbWU7CiAKIAlyZWFkX2xvY2tfYmgoJnRhYmxlLT5sb2NrKTsKLQl0YWJsZV9iYXNlID0gKHZvaWQgKil0YWJsZS0+cHJpdmF0ZS0+ZW50cmllc1tzbXBfcHJvY2Vzc29yX2lkKCldOwotCWUgPSBnZXRfZW50cnkodGFibGVfYmFzZSwgdGFibGUtPnByaXZhdGUtPmhvb2tfZW50cnlbaG9va10pOwotCWJhY2sgPSBnZXRfZW50cnkodGFibGVfYmFzZSwgdGFibGUtPnByaXZhdGUtPnVuZGVyZmxvd1tob29rXSk7CisJdGFibGVfYmFzZSA9ICh2b2lkICopcHJpdmF0ZS0+ZW50cmllc1tzbXBfcHJvY2Vzc29yX2lkKCldOworCWUgPSBnZXRfZW50cnkodGFibGVfYmFzZSwgcHJpdmF0ZS0+aG9va19lbnRyeVtob29rXSk7CisJYmFjayA9IGdldF9lbnRyeSh0YWJsZV9iYXNlLCBwcml2YXRlLT51bmRlcmZsb3dbaG9va10pOwogCiAJYXJwID0gKCpwc2tiKS0+bmguYXJwaDsKIAlkbyB7CkBAIC0zMTQsOCArMjk4LDggQEAKIAkJCQkgKiBhYnMuIHZlcmRpY3RzCiAJCQkJICovCiAJCQkJdmVyZGljdCA9IHQtPnUua2VybmVsLnRhcmdldC0+dGFyZ2V0KHBza2IsCi0JCQkJCQkJCSAgICAgaG9vaywKIAkJCQkJCQkJICAgICBpbiwgb3V0LAorCQkJCQkJCQkgICAgIGhvb2ssCiAJCQkJCQkJCSAgICAgdC0+ZGF0YSwKIAkJCQkJCQkJICAgICB1c2VyZGF0YSk7CiAKQEAgLTM0MCwxMDYgKzMyNCw2IEBACiAJCXJldHVybiB2ZXJkaWN0OwogfQogCi0vKgotICogVGhlc2UgYXJlIHdlaXJkLCBidXQgbW9kdWxlIGxvYWRpbmcgbXVzdCBub3QgYmUgZG9uZSB3aXRoIG11dGV4Ci0gKiBoZWxkIChzaW5jZSB0aGV5IHdpbGwgcmVnaXN0ZXIpLCBhbmQgd2UgaGF2ZSB0byBoYXZlIGEgc2luZ2xlCi0gKiBmdW5jdGlvbiB0byB1c2UgdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoKS4KLSAqLwotCi0vKiBGaW5kIHRhYmxlIGJ5IG5hbWUsIGdyYWJzIG11dGV4ICYgcmVmLiAgUmV0dXJucyBFUlJfUFRSKCkgb24gZXJyb3IuICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBhcnB0X3RhYmxlICpmaW5kX3RhYmxlX2xvY2soY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgYXJwdF90YWJsZSAqdDsKLQotCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFycHRfbXV0ZXgpICE9IDApCi0JCXJldHVybiBFUlJfUFRSKC1FSU5UUik7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZhcnB0X3RhYmxlcywgbGlzdCkKLQkJaWYgKHN0cmNtcCh0LT5uYW1lLCBuYW1lKSA9PSAwICYmIHRyeV9tb2R1bGVfZ2V0KHQtPm1lKSkKLQkJCXJldHVybiB0OwotCXVwKCZhcnB0X211dGV4KTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotCi0vKiBGaW5kIHRhcmdldCwgZ3JhYnMgcmVmLiAgUmV0dXJucyBFUlJfUFRSKCkgb24gZXJyb3IuICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBhcnB0X3RhcmdldCAqZmluZF90YXJnZXQoY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24pCi17Ci0Jc3RydWN0IGFycHRfdGFyZ2V0ICp0OwotCWludCBlcnIgPSAwOwotCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYXJwdF9tdXRleCkgIT0gMCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlRSKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJmFycHRfdGFyZ2V0LCBsaXN0KSB7Ci0JCWlmIChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCkgewotCQkJaWYgKHQtPnJldmlzaW9uID09IHJldmlzaW9uKSB7Ci0JCQkJaWYgKHRyeV9tb2R1bGVfZ2V0KHQtPm1lKSkgewotCQkJCQl1cCgmYXJwdF9tdXRleCk7Ci0JCQkJCXJldHVybiB0OwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCWVyciA9IC1FUFJPVE9UWVBFOyAvKiBGb3VuZCBzb21ldGhpbmcuICovCi0JCX0KLQl9Ci0JdXAoJmFycHRfbXV0ZXgpOwotCXJldHVybiBFUlJfUFRSKGVycik7Ci19Ci0KLXN0cnVjdCBhcnB0X3RhcmdldCAqYXJwdF9maW5kX3RhcmdldChjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbikKLXsKLQlzdHJ1Y3QgYXJwdF90YXJnZXQgKnRhcmdldDsKLQotCXRhcmdldCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfdGFyZ2V0KG5hbWUsIHJldmlzaW9uKSwKLQkJCQkJICJhcnB0XyVzIiwgbmFtZSk7Ci0JaWYgKElTX0VSUih0YXJnZXQpIHx8ICF0YXJnZXQpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiB0YXJnZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGFyZ2V0X3JldmZuKGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uLCBpbnQgKmJlc3RwKQotewotCXN0cnVjdCBhcnB0X3RhcmdldCAqdDsKLQlpbnQgaGF2ZV9yZXYgPSAwOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmYXJwdF90YXJnZXQsIGxpc3QpIHsKLQkJaWYgKHN0cmNtcCh0LT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0JCQlpZiAodC0+cmV2aXNpb24gPiAqYmVzdHApCi0JCQkJKmJlc3RwID0gdC0+cmV2aXNpb247Ci0JCQlpZiAodC0+cmV2aXNpb24gPT0gcmV2aXNpb24pCi0JCQkJaGF2ZV9yZXYgPTE7Ci0JCX0KLQl9Ci0JcmV0dXJuIGhhdmVfcmV2OwotfQotCi0vKiBSZXR1cm5zIHRydWUgb3IgZmFsc2UgKGlmIG5vIHN1Y2ggZXh0ZW5zaW9uIGF0IGFsbCkgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGZpbmRfcmV2aXNpb24oY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24sCi0JCQkJaW50ICgqcmV2Zm4pKGNvbnN0IGNoYXIgKiwgdTgsIGludCAqKSwKLQkJCQlpbnQgKmVycikKLXsKLQlpbnQgaGF2ZV9yZXYsIGJlc3QgPSAtMTsKLQotCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFycHRfbXV0ZXgpICE9IDApIHsKLQkJKmVyciA9IC1FSU5UUjsKLQkJcmV0dXJuIDE7Ci0JfQotCWhhdmVfcmV2ID0gcmV2Zm4obmFtZSwgcmV2aXNpb24sICZiZXN0KTsKLQl1cCgmYXJwdF9tdXRleCk7Ci0KLQkvKiBOb3RoaW5nIGF0IGFsbD8gIFJldHVybiAwIHRvIHRyeSBsb2FkaW5nIG1vZHVsZS4gKi8KLQlpZiAoYmVzdCA9PSAtMSkgewotCQkqZXJyID0gLUVOT0VOVDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JKmVyciA9IGJlc3Q7Ci0JaWYgKCFoYXZlX3JldikKLQkJKmVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7Ci0JcmV0dXJuIDE7Ci19Ci0KLQogLyogQWxsIHplcm9lcyA9PSB1bmNvbmRpdGlvbmFsIHJ1bGUuICovCiBzdGF0aWMgaW5saW5lIGludCB1bmNvbmRpdGlvbmFsKGNvbnN0IHN0cnVjdCBhcnB0X2FycCAqYXJwKQogewpAQCAtNDU1LDcgKzMzOSw3IEBACiAvKiBGaWd1cmVzIG91dCBmcm9tIHdoYXQgaG9vayBlYWNoIHJ1bGUgY2FuIGJlIGNhbGxlZDogcmV0dXJucyAwIGlmCiAgKiB0aGVyZSBhcmUgbG9vcHMuICBQdXRzIGhvb2sgYml0bWFzayBpbiBjb21lZnJvbS4KICAqLwotc3RhdGljIGludCBtYXJrX3NvdXJjZV9jaGFpbnMoc3RydWN0IGFycHRfdGFibGVfaW5mbyAqbmV3aW5mbywKK3N0YXRpYyBpbnQgbWFya19zb3VyY2VfY2hhaW5zKHN0cnVjdCB4dF90YWJsZV9pbmZvICpuZXdpbmZvLAogCQkJICAgICAgdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzLCB2b2lkICplbnRyeTApCiB7CiAJdW5zaWduZWQgaW50IGhvb2s7CkBAIC01ODYsOCArNDcwLDggQEAKIAl9CiAKIAl0ID0gYXJwdF9nZXRfdGFyZ2V0KGUpOwotCXRhcmdldCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfdGFyZ2V0KHQtPnUudXNlci5uYW1lLAotCQkJCQkJICAgICB0LT51LnVzZXIucmV2aXNpb24pLAorCXRhcmdldCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfdGFyZ2V0KE5GX0FSUCwgdC0+dS51c2VyLm5hbWUsCisJCQkJCQkJdC0+dS51c2VyLnJldmlzaW9uKSwKIAkJCQkJICJhcnB0XyVzIiwgdC0+dS51c2VyLm5hbWUpOwogCWlmIChJU19FUlIodGFyZ2V0KSB8fCAhdGFyZ2V0KSB7CiAJCWR1cHJpbnRmKCJjaGVja19lbnRyeTogYCVzJyBub3QgZm91bmRcbiIsIHQtPnUudXNlci5uYW1lKTsKQEAgLTYyMSw3ICs1MDUsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCBjaGVja19lbnRyeV9zaXplX2FuZF9ob29rcyhzdHJ1Y3QgYXJwdF9lbnRyeSAqZSwKLQkJCQkJICAgICBzdHJ1Y3QgYXJwdF90YWJsZV9pbmZvICpuZXdpbmZvLAorCQkJCQkgICAgIHN0cnVjdCB4dF90YWJsZV9pbmZvICpuZXdpbmZvLAogCQkJCQkgICAgIHVuc2lnbmVkIGNoYXIgKmJhc2UsCiAJCQkJCSAgICAgdW5zaWduZWQgY2hhciAqbGltaXQsCiAJCQkJCSAgICAgY29uc3QgdW5zaWduZWQgaW50ICpob29rX2VudHJpZXMsCkBAIC02NTUsNyArNTM5LDcgQEAKICAgICAgICAgICAgPCAwIChub3QgQVJQVF9SRVRVUk4pLiAtLVJSICovCiAKIAkvKiBDbGVhciBjb3VudGVycyBhbmQgY29tZWZyb20gKi8KLQllLT5jb3VudGVycyA9ICgoc3RydWN0IGFycHRfY291bnRlcnMpIHsgMCwgMCB9KTsKKwllLT5jb3VudGVycyA9ICgoc3RydWN0IHh0X2NvdW50ZXJzKSB7IDAsIDAgfSk7CiAJZS0+Y29tZWZyb20gPSAwOwogCiAJKCppKSsrOwpAQCAtNjgyLDcgKzU2Niw3IEBACiAgKi8KIHN0YXRpYyBpbnQgdHJhbnNsYXRlX3RhYmxlKGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICB1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3MsCi0JCQkgICBzdHJ1Y3QgYXJwdF90YWJsZV9pbmZvICpuZXdpbmZvLAorCQkJICAgc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm8sCiAJCQkgICB2b2lkICplbnRyeTAsCiAJCQkgICB1bnNpZ25lZCBpbnQgc2l6ZSwKIAkJCSAgIHVuc2lnbmVkIGludCBudW1iZXIsCkBAIC03NjMsMzQgKzY0Nyw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBhcnB0X3RhYmxlX2luZm8gKnJlcGxhY2VfdGFibGUoc3RydWN0IGFycHRfdGFibGUgKnRhYmxlLAotCQkJCQkgICAgIHVuc2lnbmVkIGludCBudW1fY291bnRlcnMsCi0JCQkJCSAgICAgc3RydWN0IGFycHRfdGFibGVfaW5mbyAqbmV3aW5mbywKLQkJCQkJICAgICBpbnQgKmVycm9yKQotewotCXN0cnVjdCBhcnB0X3RhYmxlX2luZm8gKm9sZGluZm87Ci0KLQkvKiBEbyB0aGUgc3Vic3RpdHV0aW9uLiAqLwotCXdyaXRlX2xvY2tfYmgoJnRhYmxlLT5sb2NrKTsKLQkvKiBDaGVjayBpbnNpZGUgbG9jazogaXMgdGhlIG9sZCBudW1iZXIgY29ycmVjdD8gKi8KLQlpZiAobnVtX2NvdW50ZXJzICE9IHRhYmxlLT5wcml2YXRlLT5udW1iZXIpIHsKLQkJZHVwcmludGYoIm51bV9jb3VudGVycyAhPSB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyICgldS8ldSlcbiIsCi0JCQkgbnVtX2NvdW50ZXJzLCB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyKTsKLQkJd3JpdGVfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7Ci0JCSplcnJvciA9IC1FQUdBSU47Ci0JCXJldHVybiBOVUxMOwotCX0KLQlvbGRpbmZvID0gdGFibGUtPnByaXZhdGU7Ci0JdGFibGUtPnByaXZhdGUgPSBuZXdpbmZvOwotCW5ld2luZm8tPmluaXRpYWxfZW50cmllcyA9IG9sZGluZm8tPmluaXRpYWxfZW50cmllczsKLQl3cml0ZV91bmxvY2tfYmgoJnRhYmxlLT5sb2NrKTsKLQotCXJldHVybiBvbGRpbmZvOwotfQotCiAvKiBHZXRzIGNvdW50ZXJzLiAqLwogc3RhdGljIGlubGluZSBpbnQgYWRkX2VudHJ5X3RvX2NvdW50ZXIoY29uc3Qgc3RydWN0IGFycHRfZW50cnkgKmUsCi0JCQkJICAgICAgIHN0cnVjdCBhcnB0X2NvdW50ZXJzIHRvdGFsW10sCisJCQkJICAgICAgIHN0cnVjdCB4dF9jb3VudGVycyB0b3RhbFtdLAogCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmkpCiB7CiAJQUREX0NPVU5URVIodG90YWxbKmldLCBlLT5jb3VudGVycy5iY250LCBlLT5jb3VudGVycy5wY250KTsKQEAgLTgwMCw3ICs2NTksNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCBzZXRfZW50cnlfdG9fY291bnRlcihjb25zdCBzdHJ1Y3QgYXJwdF9lbnRyeSAqZSwKLQkJCQkgICAgICAgc3RydWN0IGFycHRfY291bnRlcnMgdG90YWxbXSwKKwkJCQkgICAgICAgc3RydWN0IHh0X2NvdW50ZXJzIHRvdGFsW10sCiAJCQkJICAgICAgIHVuc2lnbmVkIGludCAqaSkKIHsKIAlTRVRfQ09VTlRFUih0b3RhbFsqaV0sIGUtPmNvdW50ZXJzLmJjbnQsIGUtPmNvdW50ZXJzLnBjbnQpOwpAQCAtODA5LDggKzY2OCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGdldF9jb3VudGVycyhjb25zdCBzdHJ1Y3QgYXJwdF90YWJsZV9pbmZvICp0LAotCQkJIHN0cnVjdCBhcnB0X2NvdW50ZXJzIGNvdW50ZXJzW10pCitzdGF0aWMgdm9pZCBnZXRfY291bnRlcnMoY29uc3Qgc3RydWN0IHh0X3RhYmxlX2luZm8gKnQsCisJCQkgc3RydWN0IHh0X2NvdW50ZXJzIGNvdW50ZXJzW10pCiB7CiAJdW5zaWduZWQgaW50IGNwdTsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTg0OCw3ICs3MDcsOCBAQAogewogCXVuc2lnbmVkIGludCBvZmYsIG51bSwgY291bnRlcnNpemU7CiAJc3RydWN0IGFycHRfZW50cnkgKmU7Ci0Jc3RydWN0IGFycHRfY291bnRlcnMgKmNvdW50ZXJzOworCXN0cnVjdCB4dF9jb3VudGVycyAqY291bnRlcnM7CisJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGUgPSB0YWJsZS0+cHJpdmF0ZTsKIAlpbnQgcmV0ID0gMDsKIAl2b2lkICpsb2NfY3B1X2VudHJ5OwogCkBAIC04NTYsMTggKzcxNiwxOCBAQAogCSAqIChvdGhlciB0aGFuIGNvbWVmcm9tLCB3aGljaCB1c2Vyc3BhY2UgZG9lc24ndCBjYXJlCiAJICogYWJvdXQpLgogCSAqLwotCWNvdW50ZXJzaXplID0gc2l6ZW9mKHN0cnVjdCBhcnB0X2NvdW50ZXJzKSAqIHRhYmxlLT5wcml2YXRlLT5udW1iZXI7Ci0JY291bnRlcnMgPSB2bWFsbG9jKGNvdW50ZXJzaXplKTsKKwljb3VudGVyc2l6ZSA9IHNpemVvZihzdHJ1Y3QgeHRfY291bnRlcnMpICogcHJpdmF0ZS0+bnVtYmVyOworCWNvdW50ZXJzID0gdm1hbGxvY19ub2RlKGNvdW50ZXJzaXplLCBudW1hX25vZGVfaWQoKSk7CiAKIAlpZiAoY291bnRlcnMgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBGaXJzdCwgc3VtIGNvdW50ZXJzLi4uICovCiAJd3JpdGVfbG9ja19iaCgmdGFibGUtPmxvY2spOwotCWdldF9jb3VudGVycyh0YWJsZS0+cHJpdmF0ZSwgY291bnRlcnMpOworCWdldF9jb3VudGVycyhwcml2YXRlLCBjb3VudGVycyk7CiAJd3JpdGVfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CiAKLQlsb2NfY3B1X2VudHJ5ID0gdGFibGUtPnByaXZhdGUtPmVudHJpZXNbcmF3X3NtcF9wcm9jZXNzb3JfaWQoKV07CisJbG9jX2NwdV9lbnRyeSA9IHByaXZhdGUtPmVudHJpZXNbcmF3X3NtcF9wcm9jZXNzb3JfaWQoKV07CiAJLyogLi4uIHRoZW4gY29weSBlbnRpcmUgdGhpbmcgLi4uICovCiAJaWYgKGNvcHlfdG9fdXNlcih1c2VycHRyLCBsb2NfY3B1X2VudHJ5LCB0b3RhbF9zaXplKSAhPSAwKSB7CiAJCXJldCA9IC1FRkFVTFQ7CkBAIC05MTAsNzUgKzc3MCwzNCBAQAogCWludCByZXQ7CiAJc3RydWN0IGFycHRfdGFibGUgKnQ7CiAKLQl0ID0gZmluZF90YWJsZV9sb2NrKGVudHJpZXMtPm5hbWUpOworCXQgPSB4dF9maW5kX3RhYmxlX2xvY2soTkZfQVJQLCBlbnRyaWVzLT5uYW1lKTsKIAlpZiAodCB8fCAhSVNfRVJSKHQpKSB7CisJCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlID0gdC0+cHJpdmF0ZTsKIAkJZHVwcmludGYoInQtPnByaXZhdGUtPm51bWJlciA9ICV1XG4iLAotCQkJIHQtPnByaXZhdGUtPm51bWJlcik7Ci0JCWlmIChlbnRyaWVzLT5zaXplID09IHQtPnByaXZhdGUtPnNpemUpCi0JCQlyZXQgPSBjb3B5X2VudHJpZXNfdG9fdXNlcih0LT5wcml2YXRlLT5zaXplLAorCQkJIHByaXZhdGUtPm51bWJlcik7CisJCWlmIChlbnRyaWVzLT5zaXplID09IHByaXZhdGUtPnNpemUpCisJCQlyZXQgPSBjb3B5X2VudHJpZXNfdG9fdXNlcihwcml2YXRlLT5zaXplLAogCQkJCQkJICAgdCwgdXB0ci0+ZW50cnl0YWJsZSk7CiAJCWVsc2UgewogCQkJZHVwcmludGYoImdldF9lbnRyaWVzOiBJJ3ZlIGdvdCAldSBub3QgJXUhXG4iLAotCQkJCSB0LT5wcml2YXRlLT5zaXplLAotCQkJCSBlbnRyaWVzLT5zaXplKTsKKwkJCQkgcHJpdmF0ZS0+c2l6ZSwgZW50cmllcy0+c2l6ZSk7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQl9CiAJCW1vZHVsZV9wdXQodC0+bWUpOwotCQl1cCgmYXJwdF9tdXRleCk7CisJCXh0X3RhYmxlX3VubG9jayh0KTsKIAl9IGVsc2UKIAkJcmV0ID0gdCA/IFBUUl9FUlIodCkgOiAtRU5PRU5UOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV90YWJsZV9pbmZvKHN0cnVjdCBhcnB0X3RhYmxlX2luZm8gKmluZm8pCi17Ci0JaW50IGNwdTsKLQlmb3JfZWFjaF9jcHUoY3B1KSB7Ci0JCWlmIChpbmZvLT5zaXplIDw9IFBBR0VfU0laRSkKLQkJCWtmcmVlKGluZm8tPmVudHJpZXNbY3B1XSk7Ci0JCWVsc2UKLQkJCXZmcmVlKGluZm8tPmVudHJpZXNbY3B1XSk7Ci0JfQotCWtmcmVlKGluZm8pOwotfQotCi1zdGF0aWMgc3RydWN0IGFycHRfdGFibGVfaW5mbyAqYWxsb2NfdGFibGVfaW5mbyh1bnNpZ25lZCBpbnQgc2l6ZSkKLXsKLQlzdHJ1Y3QgYXJwdF90YWJsZV9pbmZvICpuZXdpbmZvOwotCWludCBjcHU7Ci0JCi0JbmV3aW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhcnB0X3RhYmxlX2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5ld2luZm8pCi0JCXJldHVybiBOVUxMOwotCi0JbmV3aW5mby0+c2l6ZSA9IHNpemU7Ci0KLQlmb3JfZWFjaF9jcHUoY3B1KSB7Ci0JCWlmIChzaXplIDw9IFBBR0VfU0laRSkKLQkJCW5ld2luZm8tPmVudHJpZXNbY3B1XSA9IGttYWxsb2Nfbm9kZShzaXplLAotCQkJCQkJCUdGUF9LRVJORUwsCi0JCQkJCQkJY3B1X3RvX25vZGUoY3B1KSk7Ci0JCWVsc2UKLQkJCW5ld2luZm8tPmVudHJpZXNbY3B1XSA9IHZtYWxsb2Nfbm9kZShzaXplLAotCQkJCQkJCSAgICAgY3B1X3RvX25vZGUoY3B1KSk7Ci0KLQkJaWYgKG5ld2luZm8tPmVudHJpZXNbY3B1XSA9PSBOVUxMKSB7Ci0JCQlmcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQotCXJldHVybiBuZXdpbmZvOwotfQotCiBzdGF0aWMgaW50IGRvX3JlcGxhY2Uodm9pZCBfX3VzZXIgKnVzZXIsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgYXJwdF9yZXBsYWNlIHRtcDsKIAlzdHJ1Y3QgYXJwdF90YWJsZSAqdDsKLQlzdHJ1Y3QgYXJwdF90YWJsZV9pbmZvICpuZXdpbmZvLCAqb2xkaW5mbzsKLQlzdHJ1Y3QgYXJwdF9jb3VudGVycyAqY291bnRlcnM7CisJc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm8sICpvbGRpbmZvOworCXN0cnVjdCB4dF9jb3VudGVycyAqY291bnRlcnM7CiAJdm9pZCAqbG9jX2NwdV9lbnRyeSwgKmxvY19jcHVfb2xkX2VudHJ5OwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXAsIHVzZXIsIHNpemVvZih0bXApKSAhPSAwKQpAQCAtOTg4LDExICs4MDcsNyBAQAogCWlmIChsZW4gIT0gc2l6ZW9mKHRtcCkgKyB0bXAuc2l6ZSkKIAkJcmV0dXJuIC1FTk9QUk9UT09QVDsKIAotCS8qIFBlZGFudHJ5OiBwcmV2ZW50IHRoZW0gZnJvbSBoaXR0aW5nIEJVRygpIGluIHZtYWxsb2MuYyAtLVJSICovCi0JaWYgKChTTVBfQUxJR04odG1wLnNpemUpID4+IFBBR0VfU0hJRlQpICsgMiA+IG51bV9waHlzcGFnZXMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbmV3aW5mbyA9IGFsbG9jX3RhYmxlX2luZm8odG1wLnNpemUpOworCW5ld2luZm8gPSB4dF9hbGxvY190YWJsZV9pbmZvKHRtcC5zaXplKTsKIAlpZiAoIW5ld2luZm8pCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xMDA0LDcgKzgxOSw3IEBACiAJCWdvdG8gZnJlZV9uZXdpbmZvOwogCX0KIAotCWNvdW50ZXJzID0gdm1hbGxvYyh0bXAubnVtX2NvdW50ZXJzICogc2l6ZW9mKHN0cnVjdCBhcnB0X2NvdW50ZXJzKSk7CisJY291bnRlcnMgPSB2bWFsbG9jKHRtcC5udW1fY291bnRlcnMgKiBzaXplb2Yoc3RydWN0IHh0X2NvdW50ZXJzKSk7CiAJaWYgKCFjb3VudGVycykgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZyZWVfbmV3aW5mbzsKQEAgLTEwMTgsNyArODMzLDcgQEAKIAogCWR1cHJpbnRmKCJhcnBfdGFibGVzOiBUcmFuc2xhdGVkIHRhYmxlXG4iKTsKIAotCXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShmaW5kX3RhYmxlX2xvY2sodG1wLm5hbWUpLAorCXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3RhYmxlX2xvY2soTkZfQVJQLCB0bXAubmFtZSksCiAJCQkJICAgICJhcnB0YWJsZV8lcyIsIHRtcC5uYW1lKTsKIAlpZiAoIXQgfHwgSVNfRVJSKHQpKSB7CiAJCXJldCA9IHQgPyBQVFJfRVJSKHQpIDogLUVOT0VOVDsKQEAgLTEwMzMsNyArODQ4LDcgQEAKIAkJZ290byBwdXRfbW9kdWxlOwogCX0KIAotCW9sZGluZm8gPSByZXBsYWNlX3RhYmxlKHQsIHRtcC5udW1fY291bnRlcnMsIG5ld2luZm8sICZyZXQpOworCW9sZGluZm8gPSB4dF9yZXBsYWNlX3RhYmxlKHQsIHRtcC5udW1fY291bnRlcnMsIG5ld2luZm8sICZyZXQpOwogCWlmICghb2xkaW5mbykKIAkJZ290byBwdXRfbW9kdWxlOwogCkBAIC0xMDUzLDIzICs4NjgsMjMgQEAKIAlsb2NfY3B1X29sZF9lbnRyeSA9IG9sZGluZm8tPmVudHJpZXNbcmF3X3NtcF9wcm9jZXNzb3JfaWQoKV07CiAJQVJQVF9FTlRSWV9JVEVSQVRFKGxvY19jcHVfb2xkX2VudHJ5LCBvbGRpbmZvLT5zaXplLCBjbGVhbnVwX2VudHJ5LE5VTEwpOwogCi0JZnJlZV90YWJsZV9pbmZvKG9sZGluZm8pOworCXh0X2ZyZWVfdGFibGVfaW5mbyhvbGRpbmZvKTsKIAlpZiAoY29weV90b191c2VyKHRtcC5jb3VudGVycywgY291bnRlcnMsCi0JCQkgc2l6ZW9mKHN0cnVjdCBhcnB0X2NvdW50ZXJzKSAqIHRtcC5udW1fY291bnRlcnMpICE9IDApCisJCQkgc2l6ZW9mKHN0cnVjdCB4dF9jb3VudGVycykgKiB0bXAubnVtX2NvdW50ZXJzKSAhPSAwKQogCQlyZXQgPSAtRUZBVUxUOwogCXZmcmVlKGNvdW50ZXJzKTsKLQl1cCgmYXJwdF9tdXRleCk7CisJeHRfdGFibGVfdW5sb2NrKHQpOwogCXJldHVybiByZXQ7CiAKICBwdXRfbW9kdWxlOgogCW1vZHVsZV9wdXQodC0+bWUpOwotCXVwKCZhcnB0X211dGV4KTsKKwl4dF90YWJsZV91bmxvY2sodCk7CiAgZnJlZV9uZXdpbmZvX2NvdW50ZXJzX3VudHJhbnM6CiAJQVJQVF9FTlRSWV9JVEVSQVRFKGxvY19jcHVfZW50cnksIG5ld2luZm8tPnNpemUsIGNsZWFudXBfZW50cnksIE5VTEwpOwogIGZyZWVfbmV3aW5mb19jb3VudGVyczoKIAl2ZnJlZShjb3VudGVycyk7CiAgZnJlZV9uZXdpbmZvOgotCWZyZWVfdGFibGVfaW5mbyhuZXdpbmZvKTsKKwl4dF9mcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTA3Nyw3ICs4OTIsNyBAQAogICogYW5kIGV2ZXJ5dGhpbmcgaXMgT0suCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGFkZF9jb3VudGVyX3RvX2VudHJ5KHN0cnVjdCBhcnB0X2VudHJ5ICplLAotCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYXJwdF9jb3VudGVycyBhZGRtZVtdLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgeHRfY291bnRlcnMgYWRkbWVbXSwKIAkJCQkgICAgICAgdW5zaWduZWQgaW50ICppKQogewogCkBAIC0xMDkwLDE1ICs5MDUsMTYgQEAKIHN0YXRpYyBpbnQgZG9fYWRkX2NvdW50ZXJzKHZvaWQgX191c2VyICp1c2VyLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCXVuc2lnbmVkIGludCBpOwotCXN0cnVjdCBhcnB0X2NvdW50ZXJzX2luZm8gdG1wLCAqcGFkZGM7CisJc3RydWN0IHh0X2NvdW50ZXJzX2luZm8gdG1wLCAqcGFkZGM7CiAJc3RydWN0IGFycHRfdGFibGUgKnQ7CisJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGU7CiAJaW50IHJldCA9IDA7CiAJdm9pZCAqbG9jX2NwdV9lbnRyeTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCB1c2VyLCBzaXplb2YodG1wKSkgIT0gMCkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpZiAobGVuICE9IHNpemVvZih0bXApICsgdG1wLm51bV9jb3VudGVycypzaXplb2Yoc3RydWN0IGFycHRfY291bnRlcnMpKQorCWlmIChsZW4gIT0gc2l6ZW9mKHRtcCkgKyB0bXAubnVtX2NvdW50ZXJzKnNpemVvZihzdHJ1Y3QgeHRfY291bnRlcnMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXBhZGRjID0gdm1hbGxvYyhsZW4pOwpAQCAtMTExMCwyOSArOTI2LDMwIEBACiAJCWdvdG8gZnJlZTsKIAl9CiAKLQl0ID0gZmluZF90YWJsZV9sb2NrKHRtcC5uYW1lKTsKKwl0ID0geHRfZmluZF90YWJsZV9sb2NrKE5GX0FSUCwgdG1wLm5hbWUpOwogCWlmICghdCB8fCBJU19FUlIodCkpIHsKIAkJcmV0ID0gdCA/IFBUUl9FUlIodCkgOiAtRU5PRU5UOwogCQlnb3RvIGZyZWU7CiAJfQogCiAJd3JpdGVfbG9ja19iaCgmdC0+bG9jayk7Ci0JaWYgKHQtPnByaXZhdGUtPm51bWJlciAhPSBwYWRkYy0+bnVtX2NvdW50ZXJzKSB7CisJcHJpdmF0ZSA9IHQtPnByaXZhdGU7CisJaWYgKHByaXZhdGUtPm51bWJlciAhPSBwYWRkYy0+bnVtX2NvdW50ZXJzKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gdW5sb2NrX3VwX2ZyZWU7CiAJfQogCiAJaSA9IDA7CiAJLyogQ2hvb3NlIHRoZSBjb3B5IHRoYXQgaXMgb24gb3VyIG5vZGUgKi8KLQlsb2NfY3B1X2VudHJ5ID0gdC0+cHJpdmF0ZS0+ZW50cmllc1tzbXBfcHJvY2Vzc29yX2lkKCldOworCWxvY19jcHVfZW50cnkgPSBwcml2YXRlLT5lbnRyaWVzW3NtcF9wcm9jZXNzb3JfaWQoKV07CiAJQVJQVF9FTlRSWV9JVEVSQVRFKGxvY19jcHVfZW50cnksCi0JCQkgICB0LT5wcml2YXRlLT5zaXplLAorCQkJICAgcHJpdmF0ZS0+c2l6ZSwKIAkJCSAgIGFkZF9jb3VudGVyX3RvX2VudHJ5LAogCQkJICAgcGFkZGMtPmNvdW50ZXJzLAogCQkJICAgJmkpOwogIHVubG9ja191cF9mcmVlOgogCXdyaXRlX3VubG9ja19iaCgmdC0+bG9jayk7Ci0JdXAoJmFycHRfbXV0ZXgpOworCXh0X3RhYmxlX3VubG9jayh0KTsKIAltb2R1bGVfcHV0KHQtPm1lKTsKICBmcmVlOgogCXZmcmVlKHBhZGRjKTsKQEAgLTExODksMjUgKzEwMDYsMjYgQEAKIAkJfQogCQluYW1lW0FSUFRfVEFCTEVfTUFYTkFNRUxFTi0xXSA9ICdcMCc7CiAKLQkJdCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfdGFibGVfbG9jayhuYW1lKSwKKwkJdCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfdGFibGVfbG9jayhORl9BUlAsIG5hbWUpLAogCQkJCQkgICAgImFycHRhYmxlXyVzIiwgbmFtZSk7CiAJCWlmICh0ICYmICFJU19FUlIodCkpIHsKIAkJCXN0cnVjdCBhcnB0X2dldGluZm8gaW5mbzsKKwkJCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlID0gdC0+cHJpdmF0ZTsKIAogCQkJaW5mby52YWxpZF9ob29rcyA9IHQtPnZhbGlkX2hvb2tzOwotCQkJbWVtY3B5KGluZm8uaG9va19lbnRyeSwgdC0+cHJpdmF0ZS0+aG9va19lbnRyeSwKKwkJCW1lbWNweShpbmZvLmhvb2tfZW50cnksIHByaXZhdGUtPmhvb2tfZW50cnksCiAJCQkgICAgICAgc2l6ZW9mKGluZm8uaG9va19lbnRyeSkpOwotCQkJbWVtY3B5KGluZm8udW5kZXJmbG93LCB0LT5wcml2YXRlLT51bmRlcmZsb3csCisJCQltZW1jcHkoaW5mby51bmRlcmZsb3csIHByaXZhdGUtPnVuZGVyZmxvdywKIAkJCSAgICAgICBzaXplb2YoaW5mby51bmRlcmZsb3cpKTsKLQkJCWluZm8ubnVtX2VudHJpZXMgPSB0LT5wcml2YXRlLT5udW1iZXI7Ci0JCQlpbmZvLnNpemUgPSB0LT5wcml2YXRlLT5zaXplOworCQkJaW5mby5udW1fZW50cmllcyA9IHByaXZhdGUtPm51bWJlcjsKKwkJCWluZm8uc2l6ZSA9IHByaXZhdGUtPnNpemU7CiAJCQlzdHJjcHkoaW5mby5uYW1lLCBuYW1lKTsKIAogCQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyLCAmaW5mbywgKmxlbikgIT0gMCkKIAkJCQlyZXQgPSAtRUZBVUxUOwogCQkJZWxzZQogCQkJCXJldCA9IDA7Ci0JCQl1cCgmYXJwdF9tdXRleCk7CisJCQl4dF90YWJsZV91bmxvY2sodCk7CiAJCQltb2R1bGVfcHV0KHQtPm1lKTsKIAkJfSBlbHNlCiAJCQlyZXQgPSB0ID8gUFRSX0VSUih0KSA6IC1FTk9FTlQ7CkBAIC0xMjMyLDcgKzEwNTAsNyBAQAogCX0KIAogCWNhc2UgQVJQVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUOiB7Ci0JCXN0cnVjdCBhcnB0X2dldF9yZXZpc2lvbiByZXY7CisJCXN0cnVjdCB4dF9nZXRfcmV2aXNpb24gcmV2OwogCiAJCWlmICgqbGVuICE9IHNpemVvZihyZXYpKSB7CiAJCQlyZXQgPSAtRUlOVkFMOwpAQCAtMTI0Myw4ICsxMDYxLDggQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoZmluZF9yZXZpc2lvbihyZXYubmFtZSwgcmV2LnJldmlzaW9uLAotCQkJCQkJICAgICAgdGFyZ2V0X3JldmZuLCAmcmV0KSwKKwkJdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeHRfZmluZF9yZXZpc2lvbihORl9BUlAsIHJldi5uYW1lLAorCQkJCQkJCSByZXYucmV2aXNpb24sIDEsICZyZXQpLAogCQkJCQkiYXJwdF8lcyIsIHJldi5uYW1lKTsKIAkJYnJlYWs7CiAJfQpAQCAtMTI1NywzOCArMTA3NSwxNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIFJlZ2lzdHJhdGlvbiBob29rcyBmb3IgdGFyZ2V0cy4gKi8KLWludCBhcnB0X3JlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgYXJwdF90YXJnZXQgKnRhcmdldCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZhcnB0X211dGV4KTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7Ci0KLQlsaXN0X2FkZCgmdGFyZ2V0LT5saXN0LCAmYXJwdF90YXJnZXQpOwotCXVwKCZhcnB0X211dGV4KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgYXJwdF91bnJlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgYXJwdF90YXJnZXQgKnRhcmdldCkKLXsKLQlkb3duKCZhcnB0X211dGV4KTsKLQlMSVNUX0RFTEVURSgmYXJwdF90YXJnZXQsIHRhcmdldCk7Ci0JdXAoJmFycHRfbXV0ZXgpOwotfQotCiBpbnQgYXJwdF9yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgYXJwdF90YWJsZSAqdGFibGUsCiAJCQljb25zdCBzdHJ1Y3QgYXJwdF9yZXBsYWNlICpyZXBsKQogewogCWludCByZXQ7Ci0Jc3RydWN0IGFycHRfdGFibGVfaW5mbyAqbmV3aW5mbzsKLQlzdGF0aWMgc3RydWN0IGFycHRfdGFibGVfaW5mbyBib290c3RyYXAKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbzsKKwlzdGF0aWMgc3RydWN0IHh0X3RhYmxlX2luZm8gYm9vdHN0cmFwCiAJCT0geyAwLCAwLCAwLCB7IDAgfSwgeyAwIH0sIHsgfSB9OwogCXZvaWQgKmxvY19jcHVfZW50cnk7CiAKLQluZXdpbmZvID0gYWxsb2NfdGFibGVfaW5mbyhyZXBsLT5zaXplKTsKKwluZXdpbmZvID0geHRfYWxsb2NfdGFibGVfaW5mbyhyZXBsLT5zaXplKTsKIAlpZiAoIW5ld2luZm8pIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJcmV0dXJuIHJldDsKQEAgLTEzMDMsNjAgKzEwOTksMzMgQEAKIAkJCSAgICAgIHJlcGwtPm51bV9lbnRyaWVzLAogCQkJICAgICAgcmVwbC0+aG9va19lbnRyeSwKIAkJCSAgICAgIHJlcGwtPnVuZGVyZmxvdyk7CisKIAlkdXByaW50ZigiYXJwdF9yZWdpc3Rlcl90YWJsZTogdHJhbnNsYXRlIHRhYmxlIGdpdmVzICVkXG4iLCByZXQpOwogCWlmIChyZXQgIT0gMCkgewotCQlmcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7CisJCXh0X2ZyZWVfdGFibGVfaW5mbyhuZXdpbmZvKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJmFycHRfbXV0ZXgpOwotCWlmIChyZXQgIT0gMCkgewotCQlmcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7CisJaWYgKHh0X3JlZ2lzdGVyX3RhYmxlKHRhYmxlLCAmYm9vdHN0cmFwLCBuZXdpbmZvKSAhPSAwKSB7CisJCXh0X2ZyZWVfdGFibGVfaW5mbyhuZXdpbmZvKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQkvKiBEb24ndCBhdXRvbG9hZDogd2UnZCBlYXQgb3VyIHRhaWwuLi4gKi8KLQlpZiAobGlzdF9uYW1lZF9maW5kKCZhcnB0X3RhYmxlcywgdGFibGUtPm5hbWUpKSB7Ci0JCXJldCA9IC1FRVhJU1Q7Ci0JCWdvdG8gZnJlZV91bmxvY2s7Ci0JfQotCi0JLyogU2ltcGxpZmllcyByZXBsYWNlX3RhYmxlIGNvZGUuICovCi0JdGFibGUtPnByaXZhdGUgPSAmYm9vdHN0cmFwOwotCWlmICghcmVwbGFjZV90YWJsZSh0YWJsZSwgMCwgbmV3aW5mbywgJnJldCkpCi0JCWdvdG8gZnJlZV91bmxvY2s7Ci0KLQlkdXByaW50ZigidGFibGUtPnByaXZhdGUtPm51bWJlciA9ICV1XG4iLAotCQkgdGFibGUtPnByaXZhdGUtPm51bWJlcik7Ci0JCi0JLyogc2F2ZSBudW1iZXIgb2YgaW5pdGlhbCBlbnRyaWVzICovCi0JdGFibGUtPnByaXZhdGUtPmluaXRpYWxfZW50cmllcyA9IHRhYmxlLT5wcml2YXRlLT5udW1iZXI7Ci0KLQlyd2xvY2tfaW5pdCgmdGFibGUtPmxvY2spOwotCWxpc3RfcHJlcGVuZCgmYXJwdF90YWJsZXMsIHRhYmxlKTsKLQotIHVubG9jazoKLQl1cCgmYXJwdF9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLQotIGZyZWVfdW5sb2NrOgotCWZyZWVfdGFibGVfaW5mbyhuZXdpbmZvKTsKLQlnb3RvIHVubG9jazsKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCBhcnB0X3VucmVnaXN0ZXJfdGFibGUoc3RydWN0IGFycHRfdGFibGUgKnRhYmxlKQogeworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlOwogCXZvaWQgKmxvY19jcHVfZW50cnk7CiAKLQlkb3duKCZhcnB0X211dGV4KTsKLQlMSVNUX0RFTEVURSgmYXJwdF90YWJsZXMsIHRhYmxlKTsKLQl1cCgmYXJwdF9tdXRleCk7CisJcHJpdmF0ZSA9IHh0X3VucmVnaXN0ZXJfdGFibGUodGFibGUpOwogCiAJLyogRGVjcmVhc2UgbW9kdWxlIHVzYWdlIGNvdW50cyBhbmQgZnJlZSByZXNvdXJjZXMgKi8KLQlsb2NfY3B1X2VudHJ5ID0gdGFibGUtPnByaXZhdGUtPmVudHJpZXNbcmF3X3NtcF9wcm9jZXNzb3JfaWQoKV07Ci0JQVJQVF9FTlRSWV9JVEVSQVRFKGxvY19jcHVfZW50cnksIHRhYmxlLT5wcml2YXRlLT5zaXplLAorCWxvY19jcHVfZW50cnkgPSBwcml2YXRlLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOworCUFSUFRfRU5UUllfSVRFUkFURShsb2NfY3B1X2VudHJ5LCBwcml2YXRlLT5zaXplLAogCQkJICAgY2xlYW51cF9lbnRyeSwgTlVMTCk7Ci0JZnJlZV90YWJsZV9pbmZvKHRhYmxlLT5wcml2YXRlKTsKKwl4dF9mcmVlX3RhYmxlX2luZm8ocHJpdmF0ZSk7CiB9CiAKIC8qIFRoZSBidWlsdC1pbiB0YXJnZXRzOiBzdGFuZGFyZCAoTlVMTCkgYW5kIGVycm9yLiAqLwpAQCAtMTM3OSw1MiArMTE0OCwxNSBAQAogCS5nZXQJCT0gZG9fYXJwdF9nZXRfY3RsLAogfTsKIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgaW5saW5lIGludCBwcmludF9uYW1lKGNvbnN0IHN0cnVjdCBhcnB0X3RhYmxlICp0LAotCQkJICAgICBvZmZfdCBzdGFydF9vZmZzZXQsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCwKLQkJCSAgICAgb2ZmX3QgKnBvcywgdW5zaWduZWQgaW50ICpjb3VudCkKLXsKLQlpZiAoKCpjb3VudCkrKyA+PSBzdGFydF9vZmZzZXQpIHsKLQkJdW5zaWduZWQgaW50IG5hbWVsZW47Ci0KLQkJbmFtZWxlbiA9IHNwcmludGYoYnVmZmVyICsgKnBvcywgIiVzXG4iLCB0LT5uYW1lKTsKLQkJaWYgKCpwb3MgKyBuYW1lbGVuID4gbGVuZ3RoKSB7Ci0JCQkvKiBTdG9wIGl0ZXJhdGluZyAqLwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJKnBvcyArPSBuYW1lbGVuOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhcnB0X2dldF90YWJsZXMoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCkKLXsKLQlvZmZfdCBwb3MgPSAwOwotCXVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhcnB0X211dGV4KSAhPSAwKQotCQlyZXR1cm4gMDsKLQotCUxJU1RfRklORCgmYXJwdF90YWJsZXMsIHByaW50X25hbWUsIHN0cnVjdCBhcnB0X3RhYmxlICosCi0JCSAgb2Zmc2V0LCBidWZmZXIsIGxlbmd0aCwgJnBvcywgJmNvdW50KTsKLQotCXVwKCZhcnB0X211dGV4KTsKLQotCS8qIGBzdGFydCcgaGFjayAtIHNlZSBmcy9wcm9jL2dlbmVyaWMuYyBsaW5lIH4xMDUgKi8KLQkqc3RhcnQ9KGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpY291bnQtb2Zmc2V0KTsKLQlyZXR1cm4gcG9zOwotfQotI2VuZGlmIC8qQ09ORklHX1BST0NfRlMqLwotCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7CiAJaW50IHJldDsKIAorCXh0X3Byb3RvX2luaXQoTkZfQVJQKTsKKwogCS8qIE5vb25lIGVsc2Ugd2lsbCBiZSBkb3duaW5nIHNlbSBub3csIHNvIHdlIHdvbid0IHNsZWVwICovCi0JZG93bigmYXJwdF9tdXRleCk7Ci0JbGlzdF9hcHBlbmQoJmFycHRfdGFyZ2V0LCAmYXJwdF9zdGFuZGFyZF90YXJnZXQpOwotCWxpc3RfYXBwZW5kKCZhcnB0X3RhcmdldCwgJmFycHRfZXJyb3JfdGFyZ2V0KTsKLQl1cCgmYXJwdF9tdXRleCk7CisJeHRfcmVnaXN0ZXJfdGFyZ2V0KE5GX0FSUCwgJmFycHRfc3RhbmRhcmRfdGFyZ2V0KTsKKwl4dF9yZWdpc3Rlcl90YXJnZXQoTkZfQVJQLCAmYXJwdF9lcnJvcl90YXJnZXQpOwogCiAJLyogUmVnaXN0ZXIgc2V0c29ja29wdCAqLwogCXJldCA9IG5mX3JlZ2lzdGVyX3NvY2tvcHQoJmFycHRfc29ja29wdHMpOwpAQCAtMTQzMywxOSArMTE2NSw2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQl7Ci0JCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYzsKLQotCQlwcm9jID0gcHJvY19uZXRfY3JlYXRlKCJhcnBfdGFibGVzX25hbWVzIiwgMCwgYXJwdF9nZXRfdGFibGVzKTsKLQkJaWYgKCFwcm9jKSB7Ci0JCQluZl91bnJlZ2lzdGVyX3NvY2tvcHQoJmFycHRfc29ja29wdHMpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJcHJvYy0+b3duZXIgPSBUSElTX01PRFVMRTsKLQl9Ci0jZW5kaWYKLQogCXByaW50aygiYXJwX3RhYmxlczogKEMpIDIwMDIgRGF2aWQgUy4gTWlsbGVyXG4iKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE0NTMsMTYgKzExNzIsMTIgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCiB7CiAJbmZfdW5yZWdpc3Rlcl9zb2Nrb3B0KCZhcnB0X3NvY2tvcHRzKTsKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCXByb2NfbmV0X3JlbW92ZSgiYXJwX3RhYmxlc19uYW1lcyIpOwotI2VuZGlmCisJeHRfcHJvdG9fZmluaShORl9BUlApOwogfQogCiBFWFBPUlRfU1lNQk9MKGFycHRfcmVnaXN0ZXJfdGFibGUpOwogRVhQT1JUX1NZTUJPTChhcnB0X3VucmVnaXN0ZXJfdGFibGUpOwogRVhQT1JUX1NZTUJPTChhcnB0X2RvX3RhYmxlKTsKLUVYUE9SVF9TWU1CT0woYXJwdF9yZWdpc3Rlcl90YXJnZXQpOwotRVhQT1JUX1NZTUJPTChhcnB0X3VucmVnaXN0ZXJfdGFyZ2V0KTsKIAogbW9kdWxlX2luaXQoaW5pdCk7CiBtb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9hcnB0X21hbmdsZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycHRfbWFuZ2xlLmMKaW5kZXggM2U1OTJlYy4uYzk3NjUwYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycHRfbWFuZ2xlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycHRfbWFuZ2xlLmMKQEAgLTgsOCArOCw5IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oImFycHRhYmxlcyBhcnAgcGF5bG9hZCBtYW5nbGUgdGFyZ2V0Iik7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKLXRhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCBob29rbnVtLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCB2b2lkICp0YXJnaW5mbywgdm9pZCAqdXNlcmluZm8pCit0YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCB1bnNpZ25lZCBpbnQgaG9va251bSwgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCisgICB2b2lkICp1c2VyaW5mbykKIHsKIAljb25zdCBzdHJ1Y3QgYXJwdF9tYW5nbGUgKm1hbmdsZSA9IHRhcmdpbmZvOwogCXN0cnVjdCBhcnBoZHIgKmFycDsKQEAgLTY0LDcgKzY1LDcgQEAKIH0KIAogc3RhdGljIGludAotY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHN0cnVjdCBhcnB0X2VudHJ5ICplLCB2b2lkICp0YXJnaW5mbywKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCB2b2lkICplLCB2b2lkICp0YXJnaW5mbywKICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7CiAJY29uc3Qgc3RydWN0IGFycHRfbWFuZ2xlICptYW5nbGUgPSB0YXJnaW5mbzsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9hcnB0YWJsZV9maWx0ZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci9hcnB0YWJsZV9maWx0ZXIuYwppbmRleCAwZDc1OWY1Li5mNmFiNDVmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwdGFibGVfZmlsdGVyLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycHRhYmxlX2ZpbHRlci5jCkBAIC0xNDUsNiArMTQ1LDcgQEAKIAkubG9jawkJPSBSV19MT0NLX1VOTE9DS0VELAogCS5wcml2YXRlCT0gTlVMTCwKIAkubWUJCT0gVEhJU19NT0RVTEUsCisJLmFmCQk9IE5GX0FSUCwKIH07CiAKIC8qIFRoZSB3b3JrIGNvbWVzIGluIGhlcmUgZnJvbSBuZXRmaWx0ZXIuYyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19oZWxwZXJfcHB0cC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19oZWxwZXJfcHB0cC5jCmluZGV4IDQxMDhhNWUuLmQ3MTZiYmEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaGVscGVyX3BwdHAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2hlbHBlcl9wcHRwLmMKQEAgLTc2Miw3ICs3NjIsNyBAQAogCS5oZWxwID0gY29ubnRyYWNrX3BwdHBfaGVscAogfTsKIAotZXh0ZXJuIHZvaWQgX19leGl0IGlwX2N0X3Byb3RvX2dyZV9maW5pKHZvaWQpOworZXh0ZXJuIHZvaWQgaXBfY3RfcHJvdG9fZ3JlX2Zpbmkodm9pZCk7CiBleHRlcm4gaW50IF9faW5pdCBpcF9jdF9wcm90b19ncmVfaW5pdCh2b2lkKTsKIAogLyogaXBfY29ubnRyYWNrX3BwdHAgaW5pdGlhbGl6YXRpb24gKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b19nZW5lcmljLmMKaW5kZXggODhjMzcxMi4uZjg5MTMwOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b19nZW5lcmljLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b19nZW5lcmljLmMKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfcHJvdG9jb2wuaD4KIAotdW5zaWduZWQgbG9uZyBpcF9jdF9nZW5lcmljX3RpbWVvdXQgPSA2MDAqSFo7Cit1bnNpZ25lZCBpbnQgaXBfY3RfZ2VuZXJpY190aW1lb3V0ID0gNjAwKkhaOwogCiBzdGF0aWMgaW50IGdlbmVyaWNfcGt0X3RvX3R1cGxlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJdW5zaWduZWQgaW50IGRhdGFvZmYsCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX2dyZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b19ncmUuYwppbmRleCA1Nzk1NmRlLi41Njc5NDc5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX2dyZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fZ3JlLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCiBzdGF0aWMgREVGSU5FX1JXTE9DSyhpcF9jdF9ncmVfbG9jayk7CiAjZGVmaW5lIEFTU0VSVF9SRUFEX0xPQ0soeCkKQEAgLTMwOSw3ICszMTAsMTAgQEAKIAlyZXR1cm4gaXBfY29ubnRyYWNrX3Byb3RvY29sX3JlZ2lzdGVyKCZncmUpOwogfQogCi12b2lkIF9fZXhpdCBpcF9jdF9wcm90b19ncmVfZmluaSh2b2lkKQorLyogVGhpcyBjYW5ub3QgYmUgX19leGl0LCBhcyBpdCBpcyBpbnZva2VkIGZyb20gaXBfY29ubnRyYWNrX2hlbHBlcl9wcHRwLmMncworICogaW5pdCgpIGNvZGUgb24gZXJyb3JzLgorICovCit2b2lkIGlwX2N0X3Byb3RvX2dyZV9maW5pKHZvaWQpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqbjsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b19pY21wLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX2ljbXAuYwppbmRleCAzMGZjMjFkLi4zMDIxYWYwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX2ljbXAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX2ljbXAuYwpAQCAtMTYsMTMgKzE2LDEyIEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcm90b2NvbC5oPgogCi11bnNpZ25lZCBsb25nIGlwX2N0X2ljbXBfdGltZW91dCA9IDMwKkhaOwordW5zaWduZWQgaW50IGlwX2N0X2ljbXBfdGltZW91dCA9IDMwKkhaOwogCiAjaWYgMAogI2RlZmluZSBERUJVR1AgcHJpbnRrCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX3NjdHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fc2N0cC5jCmluZGV4IDk3N2ZiNTkuLmJlNjAyZTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fc2N0cC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fc2N0cC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW4uaD4KQEAgLTU3LDE1ICs1OCwxNSBAQAogI2RlZmluZSBIT1VSUyAqIDYwIE1JTlMKICNkZWZpbmUgREFZUyAgKiAyNCBIT1VSUwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBpcF9jdF9zY3RwX3RpbWVvdXRfY2xvc2VkICAgICAgICAgICAgPSAgMTAgU0VDUzsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlwX2N0X3NjdHBfdGltZW91dF9jb29raWVfd2FpdCAgICAgICA9ICAgMyBTRUNTOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaXBfY3Rfc2N0cF90aW1lb3V0X2Nvb2tpZV9lY2hvZWQgICAgID0gICAzIFNFQ1M7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpcF9jdF9zY3RwX3RpbWVvdXRfZXN0YWJsaXNoZWQgICAgICAgPSAgIDUgREFZUzsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlwX2N0X3NjdHBfdGltZW91dF9zaHV0ZG93bl9zZW50ICAgICA9IDMwMCBTRUNTIC8gMTAwMDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlwX2N0X3NjdHBfdGltZW91dF9zaHV0ZG93bl9yZWNkICAgICA9IDMwMCBTRUNTIC8gMTAwMDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlwX2N0X3NjdHBfdGltZW91dF9zaHV0ZG93bl9hY2tfc2VudCA9ICAgMyBTRUNTOworc3RhdGljIHVuc2lnbmVkIGludCBpcF9jdF9zY3RwX3RpbWVvdXRfY2xvc2VkICAgICAgICAgICAgPSAgMTAgU0VDUzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXBfY3Rfc2N0cF90aW1lb3V0X2Nvb2tpZV93YWl0ICAgICAgID0gICAzIFNFQ1M7CitzdGF0aWMgdW5zaWduZWQgaW50IGlwX2N0X3NjdHBfdGltZW91dF9jb29raWVfZWNob2VkICAgICA9ICAgMyBTRUNTOworc3RhdGljIHVuc2lnbmVkIGludCBpcF9jdF9zY3RwX3RpbWVvdXRfZXN0YWJsaXNoZWQgICAgICAgPSAgIDUgREFZUzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXBfY3Rfc2N0cF90aW1lb3V0X3NodXRkb3duX3NlbnQgICAgID0gMzAwIFNFQ1MgLyAxMDAwOworc3RhdGljIHVuc2lnbmVkIGludCBpcF9jdF9zY3RwX3RpbWVvdXRfc2h1dGRvd25fcmVjZCAgICAgPSAzMDAgU0VDUyAvIDEwMDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGlwX2N0X3NjdHBfdGltZW91dF9zaHV0ZG93bl9hY2tfc2VudCA9ICAgMyBTRUNTOwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyAqIHNjdHBfdGltZW91dHNbXQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCAqIHNjdHBfdGltZW91dHNbXQogPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNDVFBfQ09OTlRSQUNLX05PTkUgICovCiAgICAgJmlwX2N0X3NjdHBfdGltZW91dF9jbG9zZWQsCSAgICAgICAgICAgLyogU0NUUF9DT05OVFJBQ0tfQ0xPU0VEICovCiAgICAgJmlwX2N0X3NjdHBfdGltZW91dF9jb29raWVfd2FpdCwgICAgICAgLyogU0NUUF9DT05OVFJBQ0tfQ09PS0lFX1dBSVQgKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fdGNwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX3RjcC5jCmluZGV4IGU3ZmEyOWUuLmUwZGMzNzAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fdGNwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b190Y3AuYwpAQCAtMzIsNyArMzIsNiBAQAogCiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfcHJvdG9jb2wuaD4KQEAgLTg1LDIxICs4NCwyMSBAQAogI2RlZmluZSBIT1VSUyAqIDYwIE1JTlMKICNkZWZpbmUgREFZUyAqIDI0IEhPVVJTCiAKLXVuc2lnbmVkIGxvbmcgaXBfY3RfdGNwX3RpbWVvdXRfc3luX3NlbnQgPSAgICAgIDIgTUlOUzsKLXVuc2lnbmVkIGxvbmcgaXBfY3RfdGNwX3RpbWVvdXRfc3luX3JlY3YgPSAgICAgNjAgU0VDUzsKLXVuc2lnbmVkIGxvbmcgaXBfY3RfdGNwX3RpbWVvdXRfZXN0YWJsaXNoZWQgPSAgIDUgREFZUzsKLXVuc2lnbmVkIGxvbmcgaXBfY3RfdGNwX3RpbWVvdXRfZmluX3dhaXQgPSAgICAgIDIgTUlOUzsKLXVuc2lnbmVkIGxvbmcgaXBfY3RfdGNwX3RpbWVvdXRfY2xvc2Vfd2FpdCA9ICAgNjAgU0VDUzsKLXVuc2lnbmVkIGxvbmcgaXBfY3RfdGNwX3RpbWVvdXRfbGFzdF9hY2sgPSAgICAgMzAgU0VDUzsKLXVuc2lnbmVkIGxvbmcgaXBfY3RfdGNwX3RpbWVvdXRfdGltZV93YWl0ID0gICAgIDIgTUlOUzsKLXVuc2lnbmVkIGxvbmcgaXBfY3RfdGNwX3RpbWVvdXRfY2xvc2UgPSAgICAgICAgMTAgU0VDUzsKK3Vuc2lnbmVkIGludCBpcF9jdF90Y3BfdGltZW91dF9zeW5fc2VudCA9ICAgICAgMiBNSU5TOwordW5zaWduZWQgaW50IGlwX2N0X3RjcF90aW1lb3V0X3N5bl9yZWN2ID0gICAgIDYwIFNFQ1M7Cit1bnNpZ25lZCBpbnQgaXBfY3RfdGNwX3RpbWVvdXRfZXN0YWJsaXNoZWQgPSAgIDUgREFZUzsKK3Vuc2lnbmVkIGludCBpcF9jdF90Y3BfdGltZW91dF9maW5fd2FpdCA9ICAgICAgMiBNSU5TOwordW5zaWduZWQgaW50IGlwX2N0X3RjcF90aW1lb3V0X2Nsb3NlX3dhaXQgPSAgIDYwIFNFQ1M7Cit1bnNpZ25lZCBpbnQgaXBfY3RfdGNwX3RpbWVvdXRfbGFzdF9hY2sgPSAgICAgMzAgU0VDUzsKK3Vuc2lnbmVkIGludCBpcF9jdF90Y3BfdGltZW91dF90aW1lX3dhaXQgPSAgICAgMiBNSU5TOwordW5zaWduZWQgaW50IGlwX2N0X3RjcF90aW1lb3V0X2Nsb3NlID0gICAgICAgIDEwIFNFQ1M7CiAKIC8qIFJGQzExMjIgc2F5cyB0aGUgUjIgbGltaXQgc2hvdWxkIGJlIGF0IGxlYXN0IDEwMCBzZWNvbmRzLgogICAgTGludXggdXNlcyAxNSBwYWNrZXRzIGFzIGxpbWl0LCB3aGljaCBjb3JyZXNwb25kcyAKICAgIHRvIH4xMy0zMG1pbiBkZXBlbmRpbmcgb24gUlRPLiAqLwotdW5zaWduZWQgbG9uZyBpcF9jdF90Y3BfdGltZW91dF9tYXhfcmV0cmFucyA9ICAgICA1IE1JTlM7Cit1bnNpZ25lZCBpbnQgaXBfY3RfdGNwX3RpbWVvdXRfbWF4X3JldHJhbnMgPSAgICAgNSBNSU5TOwogIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgKiB0Y3BfdGltZW91dHNbXQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCAqIHRjcF90aW1lb3V0c1tdCiA9IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIFRDUF9DT05OVFJBQ0tfTk9ORSAqLwogICAgICZpcF9jdF90Y3BfdGltZW91dF9zeW5fc2VudCwgICAgICAgLyogICAgICBUQ1BfQ09OTlRSQUNLX1NZTl9TRU5ULCAqLwogICAgICZpcF9jdF90Y3BfdGltZW91dF9zeW5fcmVjdiwgICAgICAgLyogICAgICBUQ1BfQ09OTlRSQUNLX1NZTl9SRUNWLCAqLwpAQCAtOTk1LDcgKzk5NCw3IEBACiAJCSAgICAgICAgfHwgKCF0ZXN0X2JpdChJUFNfQVNTVVJFRF9CSVQsICZjb25udHJhY2stPnN0YXR1cykKIAkJICAgICAgICAgICAgJiYgY29ubnRyYWNrLT5wcm90by50Y3AubGFzdF9pbmRleCA9PSBUQ1BfQUNLX1NFVCkpCiAJCSAgICAmJiBudG9obCh0aC0+YWNrX3NlcSkgPT0gY29ubnRyYWNrLT5wcm90by50Y3AubGFzdF9lbmQpIHsKLQkJCS8qIFJTVCBzZW50IHRvIGludmFsaWQgU1lOIG9yIEFDSyB3ZSBoYWQgbGV0IHRyb3VnaAorCQkJLyogUlNUIHNlbnQgdG8gaW52YWxpZCBTWU4gb3IgQUNLIHdlIGhhZCBsZXQgdGhyb3VnaAogCQkJICogYXQgYSkgYW5kIGMpIGFib3ZlOgogCQkJICoKIAkJCSAqIGEpIFNZTiB3YXMgaW4gd2luZG93IHRoZW4KQEAgLTEwMDYsNyArMTAwNSw3IEBACiAJCQkgKiBzZWdtZW50cyB3ZSBpZ25vcmVkLiAqLwogCQkJZ290byBpbl93aW5kb3c7CiAJCX0KLQkJLyogSnVzdCBmYWxsIHRyb3VnaCAqLworCQkvKiBKdXN0IGZhbGwgdGhyb3VnaCAqLwogCWRlZmF1bHQ6CiAJCS8qIEtlZXAgY29tcGlsZXJzIGhhcHB5LiAqLwogCQlicmVhazsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fdWRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX3VkcC5jCmluZGV4IDQ2YmVjYmUuLjU1YjdkMzIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fdWRwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b191ZHAuYwpAQCAtMTUsMTIgKzE1LDExIEBACiAjaW5jbHVkZSA8bGludXgvdWRwLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcm90b2NvbC5oPgogCi11bnNpZ25lZCBsb25nIGlwX2N0X3VkcF90aW1lb3V0ID0gMzAqSFo7Ci11bnNpZ25lZCBsb25nIGlwX2N0X3VkcF90aW1lb3V0X3N0cmVhbSA9IDE4MCpIWjsKK3Vuc2lnbmVkIGludCBpcF9jdF91ZHBfdGltZW91dCA9IDMwKkhaOwordW5zaWduZWQgaW50IGlwX2N0X3VkcF90aW1lb3V0X3N0cmVhbSA9IDE4MCpIWjsKIAogc3RhdGljIGludCB1ZHBfcGt0X3RvX3R1cGxlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3N0YW5kYWxvbmUuYwppbmRleCA3YmE5Nzc4Li44MzNmY2I0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3N0YW5kYWxvbmUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3N0YW5kYWxvbmUuYwpAQCAtNTQ0LDI4ICs1NDQsMjggQEAKIGV4dGVybiB1bnNpZ25lZCBpbnQgaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplOwogCiAvKiBGcm9tIGlwX2Nvbm50cmFja19wcm90b190Y3AuYyAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaXBfY3RfdGNwX3RpbWVvdXRfc3luX3NlbnQ7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBpcF9jdF90Y3BfdGltZW91dF9zeW5fcmVjdjsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGlwX2N0X3RjcF90aW1lb3V0X2VzdGFibGlzaGVkOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaXBfY3RfdGNwX3RpbWVvdXRfZmluX3dhaXQ7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBpcF9jdF90Y3BfdGltZW91dF9jbG9zZV93YWl0OwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaXBfY3RfdGNwX3RpbWVvdXRfbGFzdF9hY2s7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBpcF9jdF90Y3BfdGltZW91dF90aW1lX3dhaXQ7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBpcF9jdF90Y3BfdGltZW91dF9jbG9zZTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGlwX2N0X3RjcF90aW1lb3V0X21heF9yZXRyYW5zOworZXh0ZXJuIHVuc2lnbmVkIGludCBpcF9jdF90Y3BfdGltZW91dF9zeW5fc2VudDsKK2V4dGVybiB1bnNpZ25lZCBpbnQgaXBfY3RfdGNwX3RpbWVvdXRfc3luX3JlY3Y7CitleHRlcm4gdW5zaWduZWQgaW50IGlwX2N0X3RjcF90aW1lb3V0X2VzdGFibGlzaGVkOworZXh0ZXJuIHVuc2lnbmVkIGludCBpcF9jdF90Y3BfdGltZW91dF9maW5fd2FpdDsKK2V4dGVybiB1bnNpZ25lZCBpbnQgaXBfY3RfdGNwX3RpbWVvdXRfY2xvc2Vfd2FpdDsKK2V4dGVybiB1bnNpZ25lZCBpbnQgaXBfY3RfdGNwX3RpbWVvdXRfbGFzdF9hY2s7CitleHRlcm4gdW5zaWduZWQgaW50IGlwX2N0X3RjcF90aW1lb3V0X3RpbWVfd2FpdDsKK2V4dGVybiB1bnNpZ25lZCBpbnQgaXBfY3RfdGNwX3RpbWVvdXRfY2xvc2U7CitleHRlcm4gdW5zaWduZWQgaW50IGlwX2N0X3RjcF90aW1lb3V0X21heF9yZXRyYW5zOwogZXh0ZXJuIGludCBpcF9jdF90Y3BfbG9vc2U7CiBleHRlcm4gaW50IGlwX2N0X3RjcF9iZV9saWJlcmFsOwogZXh0ZXJuIGludCBpcF9jdF90Y3BfbWF4X3JldHJhbnM7CiAKIC8qIEZyb20gaXBfY29ubnRyYWNrX3Byb3RvX3VkcC5jICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBpcF9jdF91ZHBfdGltZW91dDsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGlwX2N0X3VkcF90aW1lb3V0X3N0cmVhbTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgaXBfY3RfdWRwX3RpbWVvdXQ7CitleHRlcm4gdW5zaWduZWQgaW50IGlwX2N0X3VkcF90aW1lb3V0X3N0cmVhbTsKIAogLyogRnJvbSBpcF9jb25udHJhY2tfcHJvdG9faWNtcC5jICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBpcF9jdF9pY21wX3RpbWVvdXQ7CitleHRlcm4gdW5zaWduZWQgaW50IGlwX2N0X2ljbXBfdGltZW91dDsKIAogLyogRnJvbSBpcF9jb25udHJhY2tfcHJvdG9faWNtcC5jICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBpcF9jdF9nZW5lcmljX3RpbWVvdXQ7CitleHRlcm4gdW5zaWduZWQgaW50IGlwX2N0X2dlbmVyaWNfdGltZW91dDsKIAogLyogTG9nIGludmFsaWQgcGFja2V0cyBvZiBhIGdpdmVuIHByb3RvY29sICovCiBzdGF0aWMgaW50IGxvZ19pbnZhbGlkX3Byb3RvX21pbiA9IDA7CkBAIC05NDQsNyArOTQ0LDcgQEAKIAogLyogU29tZSBtb2R1bGVzIG5lZWQgdXMsIGJ1dCBkb24ndCBkZXBlbmQgZGlyZWN0bHkgb24gYW55IHN5bWJvbC4KICAgIFRoZXkgc2hvdWxkIGNhbGwgdGhpcy4gKi8KLXZvaWQgbmVlZF9pcF9jb25udHJhY2sodm9pZCkKK3ZvaWQgbmVlZF9jb25udHJhY2sodm9pZCkKIHsKIH0KIApAQCAtOTYyLDcgKzk2Miw3IEBACiBFWFBPUlRfU1lNQk9MKGludmVydF90dXBsZXByKTsKIEVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX2FsdGVyX3JlcGx5KTsKIEVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX2Rlc3Ryb3llZCk7Ci1FWFBPUlRfU1lNQk9MKG5lZWRfaXBfY29ubnRyYWNrKTsKK0VYUE9SVF9TWU1CT0wobmVlZF9jb25udHJhY2spOwogRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKTsKIEVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKTsKIEVYUE9SVF9TWU1CT0woaXBfY3RfaXRlcmF0ZV9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaGVscGVyX3BwdHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaGVscGVyX3BwdHAuYwppbmRleCBlNTQ2MjAzLi5hYzAwNDg5NSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9oZWxwZXJfcHB0cC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaGVscGVyX3BwdHAuYwpAQCAtMTQ4LDE0ICsxNDgsMTQgQEAKIHsKIAlzdHJ1Y3QgaXBfY3RfcHB0cF9tYXN0ZXIgKmN0X3BwdHBfaW5mbyA9ICZjdC0+aGVscC5jdF9wcHRwX2luZm87CiAJc3RydWN0IGlwX25hdF9wcHRwICpuYXRfcHB0cF9pbmZvID0gJmN0LT5uYXQuaGVscC5uYXRfcHB0cF9pbmZvOwotCi0JdV9pbnQxNl90IG1zZywgKmNpZCA9IE5VTEwsIG5ld19jYWxsaWQ7CisJdV9pbnQxNl90IG1zZywgbmV3X2NhbGxpZDsKKwl1bnNpZ25lZCBpbnQgY2lkX29mZjsKIAogCW5ld19jYWxsaWQgPSBodG9ucyhjdF9wcHRwX2luZm8tPnBuc19jYWxsX2lkKTsKIAkKIAlzd2l0Y2ggKG1zZyA9IG50b2hzKGN0bGgtPm1lc3NhZ2VUeXBlKSkgewogCQljYXNlIFBQVFBfT1VUX0NBTExfUkVRVUVTVDoKLQkJCWNpZCA9ICZwcHRwUmVxLT5vY3JlcS5jYWxsSUQ7CisJCQljaWRfb2ZmID0gb2Zmc2V0b2YodW5pb24gcHB0cF9jdHJsX3VuaW9uLCBvY3JlcS5jYWxsSUQpOwogCQkJLyogRklYTUU6IGlkZWFsbHkgd2Ugd291bGQgd2FudCB0byByZXNlcnZlIGEgY2FsbCBJRAogCQkJICogaGVyZS4gIGN1cnJlbnQgbmV0ZmlsdGVyIE5BVCBjb3JlIGlzIG5vdCBhYmxlIHRvIGRvCiAJCQkgKiB0aGlzIDooIEZvciBub3cgd2UgdXNlIFRDUCBzb3VyY2UgcG9ydC4gVGhpcyBicmVha3MKQEAgLTE3MiwxMCArMTcyLDEwIEBACiAJCQljdF9wcHRwX2luZm8tPnBuc19jYWxsX2lkID0gbnRvaHMobmV3X2NhbGxpZCk7CiAJCQlicmVhazsKIAkJY2FzZSBQUFRQX0lOX0NBTExfUkVQTFk6Ci0JCQljaWQgPSAmcHB0cFJlcS0+aWNyZXEuY2FsbElEOworCQkJY2lkX29mZiA9IG9mZnNldG9mKHVuaW9uIHBwdHBfY3RybF91bmlvbiwgaWNyZXEuY2FsbElEKTsKIAkJCWJyZWFrOwogCQljYXNlIFBQVFBfQ0FMTF9DTEVBUl9SRVFVRVNUOgotCQkJY2lkID0gJnBwdHBSZXEtPmNscnJlcS5jYWxsSUQ7CisJCQljaWRfb2ZmID0gb2Zmc2V0b2YodW5pb24gcHB0cF9jdHJsX3VuaW9uLCBjbHJyZXEuY2FsbElEKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJREVCVUdQKCJ1bmtub3duIG91dGJvdW5kIHBhY2tldCAweCUwNHg6JXNcbiIsIG1zZywKQEAgLTE5NywxOCArMTk3LDE1IEBACiAKIAkvKiBvbmx5IE9VVF9DQUxMX1JFUVVFU1QsIElOX0NBTExfUkVQTFksIENBTExfQ0xFQVJfUkVRVUVTVCBwYXNzCiAJICogZG93biB0byBoZXJlICovCi0KLQlJUF9ORl9BU1NFUlQoY2lkKTsKLQogCURFQlVHUCgiYWx0ZXJpbmcgY2FsbCBpZCBmcm9tIDB4JTA0eCB0byAweCUwNHhcbiIsCi0JCW50b2hzKCpjaWQpLCBudG9ocyhuZXdfY2FsbGlkKSk7CisJCW50b2hzKCoodV9pbnQxNl90ICopcHB0cFJlcSArIGNpZF9vZmYpLCBudG9ocyhuZXdfY2FsbGlkKSk7CiAKIAkvKiBtYW5nbGUgcGFja2V0ICovCiAJaWYgKGlwX25hdF9tYW5nbGVfdGNwX3BhY2tldChwc2tiLCBjdCwgY3RpbmZvLAotCQkodm9pZCAqKWNpZCAtICgodm9pZCAqKWN0bGggLSBzaXplb2Yoc3RydWN0IHBwdHBfcGt0X2hkcikpLAotCQkJCSAJc2l6ZW9mKG5ld19jYWxsaWQpLCAKLQkJCQkJKGNoYXIgKikmbmV3X2NhbGxpZCwKLQkJCQkgCXNpemVvZihuZXdfY2FsbGlkKSkgPT0gMCkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpZF9vZmYgKyBzaXplb2Yoc3RydWN0IHBwdHBfcGt0X2hkcikgKworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBQcHRwQ29udHJvbEhlYWRlciksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobmV3X2NhbGxpZCksIChjaGFyICopJm5ld19jYWxsaWQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobmV3X2NhbGxpZCkpID09IDApCiAJCXJldHVybiBORl9EUk9QOwogCiAJcmV0dXJuIE5GX0FDQ0VQVDsKQEAgLTI5OSwzMSArMjk2LDMwIEBACiAJCSB1bmlvbiBwcHRwX2N0cmxfdW5pb24gKnBwdHBSZXEpCiB7CiAJc3RydWN0IGlwX25hdF9wcHRwICpuYXRfcHB0cF9pbmZvID0gJmN0LT5uYXQuaGVscC5uYXRfcHB0cF9pbmZvOwotCXVfaW50MTZfdCBtc2csIG5ld19jaWQgPSAwLCBuZXdfcGNpZCwgKnBjaWQgPSBOVUxMLCAqY2lkID0gTlVMTDsKLQotCWludCByZXQgPSBORl9BQ0NFUFQsIHJ2OworCXVfaW50MTZfdCBtc2csIG5ld19jaWQgPSAwLCBuZXdfcGNpZDsKKwl1bnNpZ25lZCBpbnQgcGNpZF9vZmYsIGNpZF9vZmYgPSAwOwogCiAJbmV3X3BjaWQgPSBodG9ucyhuYXRfcHB0cF9pbmZvLT5wbnNfY2FsbF9pZCk7CiAKIAlzd2l0Y2ggKG1zZyA9IG50b2hzKGN0bGgtPm1lc3NhZ2VUeXBlKSkgewogCWNhc2UgUFBUUF9PVVRfQ0FMTF9SRVBMWToKLQkJcGNpZCA9ICZwcHRwUmVxLT5vY2Fjay5wZWVyc0NhbGxJRDsJCi0JCWNpZCA9ICZwcHRwUmVxLT5vY2Fjay5jYWxsSUQ7CisJCXBjaWRfb2ZmID0gb2Zmc2V0b2YodW5pb24gcHB0cF9jdHJsX3VuaW9uLCBvY2Fjay5wZWVyc0NhbGxJRCk7CisJCWNpZF9vZmYgPSBvZmZzZXRvZih1bmlvbiBwcHRwX2N0cmxfdW5pb24sIG9jYWNrLmNhbGxJRCk7CiAJCWJyZWFrOwogCWNhc2UgUFBUUF9JTl9DQUxMX0NPTk5FQ1Q6Ci0JCXBjaWQgPSAmcHB0cFJlcS0+aWNjb24ucGVlcnNDYWxsSUQ7CisJCXBjaWRfb2ZmID0gb2Zmc2V0b2YodW5pb24gcHB0cF9jdHJsX3VuaW9uLCBpY2Nvbi5wZWVyc0NhbGxJRCk7CiAJCWJyZWFrOwogCWNhc2UgUFBUUF9JTl9DQUxMX1JFUVVFU1Q6CiAJCS8qIG9ubHkgbmVlZCB0byBuYXQgaW4gY2FzZSBQQUMgaXMgYmVoaW5kIE5BVCBib3ggKi8KLQkJYnJlYWs7CisJCXJldHVybiBORl9BQ0NFUFQ7CiAJY2FzZSBQUFRQX1dBTl9FUlJPUl9OT1RJRlk6Ci0JCXBjaWQgPSAmcHB0cFJlcS0+d2FuZXJyLnBlZXJzQ2FsbElEOworCQlwY2lkX29mZiA9IG9mZnNldG9mKHVuaW9uIHBwdHBfY3RybF91bmlvbiwgd2FuZXJyLnBlZXJzQ2FsbElEKTsKIAkJYnJlYWs7CiAJY2FzZSBQUFRQX0NBTExfRElTQ09OTkVDVF9OT1RJRlk6Ci0JCXBjaWQgPSAmcHB0cFJlcS0+ZGlzYy5jYWxsSUQ7CisJCXBjaWRfb2ZmID0gb2Zmc2V0b2YodW5pb24gcHB0cF9jdHJsX3VuaW9uLCBkaXNjLmNhbGxJRCk7CiAJCWJyZWFrOwogCWNhc2UgUFBUUF9TRVRfTElOS19JTkZPOgotCQlwY2lkID0gJnBwdHBSZXEtPnNldGxpbmsucGVlcnNDYWxsSUQ7CisJCXBjaWRfb2ZmID0gb2Zmc2V0b2YodW5pb24gcHB0cF9jdHJsX3VuaW9uLCBzZXRsaW5rLnBlZXJzQ2FsbElEKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMzQ1LDM1ICszNDEsMjYgQEAKIAkgKiBXQU5fRVJST1JfTk9USUZZLCBDQUxMX0RJU0NPTk5FQ1RfTk9USUZZIHBhc3MgZG93biBoZXJlICovCiAKIAkvKiBtYW5nbGUgcGFja2V0ICovCi0JSVBfTkZfQVNTRVJUKHBjaWQpOwogCURFQlVHUCgiYWx0ZXJpbmcgcGVlciBjYWxsIGlkIGZyb20gMHglMDR4IHRvIDB4JTA0eFxuIiwKLQkJbnRvaHMoKnBjaWQpLCBudG9ocyhuZXdfcGNpZCkpOwotCQotCXJ2ID0gaXBfbmF0X21hbmdsZV90Y3BfcGFja2V0KHBza2IsIGN0LCBjdGluZm8sIAotCQkJCSAgICAgICh2b2lkICopcGNpZCAtICgodm9pZCAqKWN0bGggLSBzaXplb2Yoc3RydWN0IHBwdHBfcGt0X2hkcikpLAotCQkJCSAgICAgIHNpemVvZihuZXdfcGNpZCksIChjaGFyICopJm5ld19wY2lkLCAKLQkJCQkgICAgICBzaXplb2YobmV3X3BjaWQpKTsKLQlpZiAocnYgIT0gTkZfQUNDRVBUKSAKLQkJcmV0dXJuIHJ2OworCQludG9ocygqKHVfaW50MTZfdCAqKXBwdHBSZXEgKyBwY2lkX29mZiksIG50b2hzKG5ld19wY2lkKSk7CisKKwlpZiAoaXBfbmF0X21hbmdsZV90Y3BfcGFja2V0KHBza2IsIGN0LCBjdGluZm8sCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lkX29mZiArIHNpemVvZihzdHJ1Y3QgcHB0cF9wa3RfaGRyKSArCisJCQkJICAgICBzaXplb2Yoc3RydWN0IFBwdHBDb250cm9sSGVhZGVyKSwKKwkJCQkgICAgIHNpemVvZihuZXdfcGNpZCksIChjaGFyICopJm5ld19wY2lkLAorCQkJCSAgICAgc2l6ZW9mKG5ld19wY2lkKSkgPT0gMCkKKwkJcmV0dXJuIE5GX0RST1A7CiAKIAlpZiAobmV3X2NpZCkgewotCQlJUF9ORl9BU1NFUlQoY2lkKTsKIAkJREVCVUdQKCJhbHRlcmluZyBjYWxsIGlkIGZyb20gMHglMDR4IHRvIDB4JTA0eFxuIiwKLQkJCW50b2hzKCpjaWQpLCBudG9ocyhuZXdfY2lkKSk7Ci0JCXJ2ID0gaXBfbmF0X21hbmdsZV90Y3BfcGFja2V0KHBza2IsIGN0LCBjdGluZm8sIAotCQkJCQkgICAgICAodm9pZCAqKWNpZCAtICgodm9pZCAqKWN0bGggLSBzaXplb2Yoc3RydWN0IHBwdHBfcGt0X2hkcikpLCAKLQkJCQkJICAgICAgc2l6ZW9mKG5ld19jaWQpLAotCQkJCQkgICAgICAoY2hhciAqKSZuZXdfY2lkLCAKLQkJCQkJICAgICAgc2l6ZW9mKG5ld19jaWQpKTsKLQkJaWYgKHJ2ICE9IE5GX0FDQ0VQVCkKLQkJCXJldHVybiBydjsKKwkJCW50b2hzKCoodV9pbnQxNl90ICopcHB0cFJlcSArIGNpZF9vZmYpLCBudG9ocyhuZXdfY2lkKSk7CisJCWlmIChpcF9uYXRfbWFuZ2xlX3RjcF9wYWNrZXQocHNrYiwgY3QsIGN0aW5mbywKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaWRfb2ZmICsgc2l6ZW9mKHN0cnVjdCBwcHRwX3BrdF9oZHIpICsKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IFBwdHBDb250cm9sSGVhZGVyKSwKKwkJCQkJICAgICBzaXplb2YobmV3X2NpZCksIChjaGFyICopJm5ld19jaWQsCisJCQkJCSAgICAgc2l6ZW9mKG5ld19jaWQpKSA9PSAwKQorCQkJcmV0dXJuIE5GX0RST1A7CiAJfQotCi0JLyogY2hlY2sgZm9yIGVhcmxpZXIgcmV0dXJuIHZhbHVlIG9mICdzd2l0Y2gnIGFib3ZlICovCi0JaWYgKHJldCAhPSBORl9BQ0NFUFQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBncmVhdCwgYXQgbGVhc3Qgd2UgZG9uJ3QgbmVlZCB0byByZXNpemUgcGFja2V0cyAqLwogCXJldHVybiBORl9BQ0NFUFQ7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fZ3JlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX2dyZS5jCmluZGV4IGY3Y2FkN2MuLjZjNDg5OWQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fZ3JlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b19ncmUuYwpAQCAtMTUxLDQyICsxNTEsNiBAQAogCXJldHVybiAxOwogfQogCi0vKiBwcmludCBvdXQgYSBuYXQgdHVwbGUgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgCi1ncmVfcHJpbnQoY2hhciAqYnVmZmVyLCAKLQkgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKm1hdGNoLAotCSAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqbWFzaykKLXsKLQl1bnNpZ25lZCBpbnQgbGVuID0gMDsKLQotCWlmIChtYXNrLT5zcmMudS5ncmUua2V5KQotCQlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICJzcmNrZXk9MHgleCAiLCAKLQkJCQludG9obChtYXRjaC0+c3JjLnUuZ3JlLmtleSkpOwotCi0JaWYgKG1hc2stPmRzdC51LmdyZS5rZXkpCi0JCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgImRzdGtleT0weCV4ICIsCi0JCQkJbnRvaGwobWF0Y2gtPnNyYy51LmdyZS5rZXkpKTsKLQotCXJldHVybiBsZW47Ci19Ci0KLS8qIHByaW50IGEgcmFuZ2Ugb2Yga2V5cyAqLwotc3RhdGljIHVuc2lnbmVkIGludCAKLWdyZV9wcmludF9yYW5nZShjaGFyICpidWZmZXIsIGNvbnN0IHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlKQotewotCWlmIChyYW5nZS0+bWluLmdyZS5rZXkgIT0gMCAKLQkgICAgfHwgcmFuZ2UtPm1heC5ncmUua2V5ICE9IDB4RkZGRikgewotCQlpZiAocmFuZ2UtPm1pbi5ncmUua2V5ID09IHJhbmdlLT5tYXguZ3JlLmtleSkKLQkJCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgImtleSAweCV4ICIsCi0JCQkJCW50b2hsKHJhbmdlLT5taW4uZ3JlLmtleSkpOwotCQllbHNlCi0JCQlyZXR1cm4gc3ByaW50ZihidWZmZXIsICJrZXlzIDB4JXUtMHgldSAiLAotCQkJCQludG9obChyYW5nZS0+bWluLmdyZS5rZXkpLAotCQkJCQludG9obChyYW5nZS0+bWF4LmdyZS5rZXkpKTsKLQl9IGVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KIC8qIG5hdCBoZWxwZXIgc3RydWN0ICovCiBzdGF0aWMgc3RydWN0IGlwX25hdF9wcm90b2NvbCBncmUgPSB7IAogCS5uYW1lCQk9ICJHUkUiLCAKQEAgLTE5NCw4ICsxNTgsNiBAQAogCS5tYW5pcF9wa3QJPSBncmVfbWFuaXBfcGt0LAogCS5pbl9yYW5nZQk9IGdyZV9pbl9yYW5nZSwKIAkudW5pcXVlX3R1cGxlCT0gZ3JlX3VuaXF1ZV90dXBsZSwKLQkucHJpbnQJCT0gZ3JlX3ByaW50LAotCS5wcmludF9yYW5nZQk9IGdyZV9wcmludF9yYW5nZSwKICNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTkVUTElOSykgfHwgXAogICAgIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LX01PRFVMRSkKIAkucmFuZ2VfdG9fbmZhdHRyCT0gaXBfbmF0X3BvcnRfcmFuZ2VfdG9fbmZhdHRyLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b19pY21wLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX2ljbXAuYwppbmRleCA5Mzg3MTkwLi4zMWEzZjRjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX2ljbXAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX2ljbXAuYwpAQCAtNzQsMzggKzc0LDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludAotaWNtcF9wcmludChjaGFyICpidWZmZXIsCi0JICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqbWF0Y2gsCi0JICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqbWFzaykKLXsKLQl1bnNpZ25lZCBpbnQgbGVuID0gMDsKLQotCWlmIChtYXNrLT5zcmMudS5pY21wLmlkKQotCQlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICJpZD0ldSAiLAotCQkJICAgICAgIG50b2hzKG1hdGNoLT5zcmMudS5pY21wLmlkKSk7Ci0KLQlpZiAobWFzay0+ZHN0LnUuaWNtcC50eXBlKQotCQlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICJ0eXBlPSV1ICIsCi0JCQkgICAgICAgbnRvaHMobWF0Y2gtPmRzdC51LmljbXAudHlwZSkpOwotCi0JaWYgKG1hc2stPmRzdC51LmljbXAuY29kZSkKLQkJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiY29kZT0ldSAiLAotCQkJICAgICAgIG50b2hzKG1hdGNoLT5kc3QudS5pY21wLmNvZGUpKTsKLQotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWljbXBfcHJpbnRfcmFuZ2UoY2hhciAqYnVmZmVyLCBjb25zdCBzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyYW5nZSkKLXsKLQlpZiAocmFuZ2UtPm1pbi5pY21wLmlkICE9IDAgfHwgcmFuZ2UtPm1heC5pY21wLmlkICE9IDB4RkZGRikKLQkJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiaWQgJXUtJXUgIiwKLQkJCSAgICAgICBudG9ocyhyYW5nZS0+bWluLmljbXAuaWQpLAotCQkJICAgICAgIG50b2hzKHJhbmdlLT5tYXguaWNtcC5pZCkpOwotCWVsc2UgcmV0dXJuIDA7Ci19Ci0KIHN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgaXBfbmF0X3Byb3RvY29sX2ljbXAgPSB7CiAJLm5hbWUJCQk9ICJJQ01QIiwKIAkucHJvdG9udW0JCT0gSVBQUk9UT19JQ01QLApAQCAtMTEzLDggKzgxLDYgQEAKIAkubWFuaXBfcGt0CQk9IGljbXBfbWFuaXBfcGt0LAogCS5pbl9yYW5nZQkJPSBpY21wX2luX3JhbmdlLAogCS51bmlxdWVfdHVwbGUJCT0gaWNtcF91bmlxdWVfdHVwbGUsCi0JLnByaW50CQkJPSBpY21wX3ByaW50LAotCS5wcmludF9yYW5nZQkJPSBpY21wX3ByaW50X3JhbmdlLAogI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LKSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTktfTU9EVUxFKQogCS5yYW5nZV90b19uZmF0dHIJPSBpcF9uYXRfcG9ydF9yYW5nZV90b19uZmF0dHIsCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3RjcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b190Y3AuYwppbmRleCAxZDM4MWJmLi5hM2QxNDA3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3RjcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdGNwLmMKQEAgLTEzNiw0MCArMTM2LDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludAotdGNwX3ByaW50KGNoYXIgKmJ1ZmZlciwKLQkgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKm1hdGNoLAotCSAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqbWFzaykKLXsKLQl1bnNpZ25lZCBpbnQgbGVuID0gMDsKLQotCWlmIChtYXNrLT5zcmMudS50Y3AucG9ydCkKLQkJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAic3JjcHQ9JXUgIiwKLQkJCSAgICAgICBudG9ocyhtYXRjaC0+c3JjLnUudGNwLnBvcnQpKTsKLQotCi0JaWYgKG1hc2stPmRzdC51LnRjcC5wb3J0KQotCQlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICJkc3RwdD0ldSAiLAotCQkJICAgICAgIG50b2hzKG1hdGNoLT5kc3QudS50Y3AucG9ydCkpOwotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotdGNwX3ByaW50X3JhbmdlKGNoYXIgKmJ1ZmZlciwgY29uc3Qgc3RydWN0IGlwX25hdF9yYW5nZSAqcmFuZ2UpCi17Ci0JaWYgKHJhbmdlLT5taW4udGNwLnBvcnQgIT0gMCB8fCByYW5nZS0+bWF4LnRjcC5wb3J0ICE9IDB4RkZGRikgewotCQlpZiAocmFuZ2UtPm1pbi50Y3AucG9ydCA9PSByYW5nZS0+bWF4LnRjcC5wb3J0KQotCQkJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAicG9ydCAldSAiLAotCQkJCSAgICAgICBudG9ocyhyYW5nZS0+bWluLnRjcC5wb3J0KSk7Ci0JCWVsc2UKLQkJCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgInBvcnRzICV1LSV1ICIsCi0JCQkJICAgICAgIG50b2hzKHJhbmdlLT5taW4udGNwLnBvcnQpLAotCQkJCSAgICAgICBudG9ocyhyYW5nZS0+bWF4LnRjcC5wb3J0KSk7Ci0JfQotCWVsc2UgcmV0dXJuIDA7Ci19Ci0KIHN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgaXBfbmF0X3Byb3RvY29sX3RjcCA9IHsKIAkubmFtZQkJCT0gIlRDUCIsCiAJLnByb3RvbnVtCQk9IElQUFJPVE9fVENQLApAQCAtMTc3LDggKzE0Myw2IEBACiAJLm1hbmlwX3BrdAkJPSB0Y3BfbWFuaXBfcGt0LAogCS5pbl9yYW5nZQkJPSB0Y3BfaW5fcmFuZ2UsCiAJLnVuaXF1ZV90dXBsZQkJPSB0Y3BfdW5pcXVlX3R1cGxlLAotCS5wcmludAkJCT0gdGNwX3ByaW50LAotCS5wcmludF9yYW5nZQkJPSB0Y3BfcHJpbnRfcmFuZ2UsCiAjaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTkspIHx8IFwKICAgICBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTkVUTElOS19NT0RVTEUpCiAJLnJhbmdlX3RvX25mYXR0cgk9IGlwX25hdF9wb3J0X3JhbmdlX3RvX25mYXR0ciwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdWRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3VkcC5jCmluZGV4IGM0OTA2ZTEuLmVjNjA1M2YgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdWRwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b191ZHAuYwpAQCAtMTIyLDQwICsxMjIsNiBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50Ci11ZHBfcHJpbnQoY2hhciAqYnVmZmVyLAotCSAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqbWF0Y2gsCi0JICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICptYXNrKQotewotCXVuc2lnbmVkIGludCBsZW4gPSAwOwotCi0JaWYgKG1hc2stPnNyYy51LnVkcC5wb3J0KQotCQlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICJzcmNwdD0ldSAiLAotCQkJICAgICAgIG50b2hzKG1hdGNoLT5zcmMudS51ZHAucG9ydCkpOwotCi0KLQlpZiAobWFzay0+ZHN0LnUudWRwLnBvcnQpCi0JCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgImRzdHB0PSV1ICIsCi0JCQkgICAgICAgbnRvaHMobWF0Y2gtPmRzdC51LnVkcC5wb3J0KSk7Ci0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci11ZHBfcHJpbnRfcmFuZ2UoY2hhciAqYnVmZmVyLCBjb25zdCBzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyYW5nZSkKLXsKLQlpZiAocmFuZ2UtPm1pbi51ZHAucG9ydCAhPSAwIHx8IHJhbmdlLT5tYXgudWRwLnBvcnQgIT0gMHhGRkZGKSB7Ci0JCWlmIChyYW5nZS0+bWluLnVkcC5wb3J0ID09IHJhbmdlLT5tYXgudWRwLnBvcnQpCi0JCQlyZXR1cm4gc3ByaW50ZihidWZmZXIsICJwb3J0ICV1ICIsCi0JCQkJICAgICAgIG50b2hzKHJhbmdlLT5taW4udWRwLnBvcnQpKTsKLQkJZWxzZQotCQkJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAicG9ydHMgJXUtJXUgIiwKLQkJCQkgICAgICAgbnRvaHMocmFuZ2UtPm1pbi51ZHAucG9ydCksCi0JCQkJICAgICAgIG50b2hzKHJhbmdlLT5tYXgudWRwLnBvcnQpKTsKLQl9Ci0JZWxzZSByZXR1cm4gMDsKLX0KLQogc3RydWN0IGlwX25hdF9wcm90b2NvbCBpcF9uYXRfcHJvdG9jb2xfdWRwID0gewogCS5uYW1lCQkJPSAiVURQIiwKIAkucHJvdG9udW0JCT0gSVBQUk9UT19VRFAsCkBAIC0xNjMsOCArMTI5LDYgQEAKIAkubWFuaXBfcGt0CQk9IHVkcF9tYW5pcF9wa3QsCiAJLmluX3JhbmdlCQk9IHVkcF9pbl9yYW5nZSwKIAkudW5pcXVlX3R1cGxlCQk9IHVkcF91bmlxdWVfdHVwbGUsCi0JLnByaW50CQkJPSB1ZHBfcHJpbnQsCi0JLnByaW50X3JhbmdlCQk9IHVkcF9wcmludF9yYW5nZSwKICNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTkVUTElOSykgfHwgXAogICAgIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LX01PRFVMRSkKIAkucmFuZ2VfdG9fbmZhdHRyCT0gaXBfbmF0X3BvcnRfcmFuZ2VfdG9fbmZhdHRyLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b191bmtub3duLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3Vua25vd24uYwppbmRleCBmMDA5OWE2Li4zYmYwNDk1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3Vua25vd24uYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3Vua25vd24uYwpAQCAtNDYsMjYgKzQ2LDEwIEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXVua25vd25fcHJpbnQoY2hhciAqYnVmZmVyLAotCSAgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKm1hdGNoLAotCSAgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKm1hc2spCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXVua25vd25fcHJpbnRfcmFuZ2UoY2hhciAqYnVmZmVyLCBjb25zdCBzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyYW5nZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RydWN0IGlwX25hdF9wcm90b2NvbCBpcF9uYXRfdW5rbm93bl9wcm90b2NvbCA9IHsKIAkubmFtZQkJCT0gInVua25vd24iLAogCS8qIC5tZSBpc24ndCBzZXQ6IGdldHRpbmcgYSByZWYgdG8gdGhpcyBjYW5ub3QgZmFpbC4gKi8KIAkubWFuaXBfcGt0CQk9IHVua25vd25fbWFuaXBfcGt0LAogCS5pbl9yYW5nZQkJPSB1bmtub3duX2luX3JhbmdlLAogCS51bmlxdWVfdHVwbGUJCT0gdW5rbm93bl91bmlxdWVfdHVwbGUsCi0JLnByaW50CQkJPSB1bmtub3duX3ByaW50LAotCS5wcmludF9yYW5nZQkJPSB1bmtub3duX3ByaW50X3JhbmdlCiB9OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9ydWxlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3J1bGUuYwppbmRleCBjYjY2YjhiLi4xZGU4NjI4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3J1bGUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3J1bGUuYwpAQCAtOTUsNiArOTUsNyBAQAogCS52YWxpZF9ob29rcwk9IE5BVF9WQUxJRF9IT09LUywKIAkubG9jawkJPSBSV19MT0NLX1VOTE9DS0VELAogCS5tZQkJPSBUSElTX01PRFVMRSwKKwkuYWYJCT0gQUZfSU5FVCwKIH07CiAKIC8qIFNvdXJjZSBOQVQgKi8KQEAgLTE2OCw3ICsxNjksNyBAQAogfQogCiBzdGF0aWMgaW50IGlwdF9zbmF0X2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJCQkgICAgICAgY29uc3Qgdm9pZCAqZW50cnksCiAJCQkgICAgICAgdm9pZCAqdGFyZ2luZm8sCiAJCQkgICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpAQCAtMjAxLDcgKzIwMiw3IEBACiB9CiAKIHN0YXRpYyBpbnQgaXB0X2RuYXRfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkJCSAgICAgICBjb25zdCB2b2lkICplbnRyeSwKIAkJCSAgICAgICB2b2lkICp0YXJnaW5mbywKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3N0YW5kYWxvbmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc3RhbmRhbG9uZS5jCmluZGV4IGYwNDExMWYuLmFkNDM4ZmIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc3RhbmRhbG9uZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc3RhbmRhbG9uZS5jCkBAIC01NSw2ICs1NSw0NCBAQAogCQkJICAgICAgICAgOiAoKGhvb2tudW0pID09IE5GX0lQX0xPQ0FMX0lOID8gIkxPQ0FMX0lOIiAgXAogCQkJCSAgICA6ICIqRVJST1IqIikpKQogCisjaWZkZWYgQ09ORklHX1hGUk0KK3N0YXRpYyB2b2lkIG5hdF9kZWNvZGVfc2Vzc2lvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZmxvd2kgKmZsKQoreworCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OworCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnQ7CisJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CisJZW51bSBpcF9jb25udHJhY2tfZGlyIGRpcjsKKwl1bnNpZ25lZCBsb25nIHN0YXR1c2JpdDsKKworCWN0ID0gaXBfY29ubnRyYWNrX2dldChza2IsICZjdGluZm8pOworCWlmIChjdCA9PSBOVUxMKQorCQlyZXR1cm47CisJZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCXQgPSAmY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlOworCisJaWYgKGRpciA9PSBJUF9DVF9ESVJfT1JJR0lOQUwpCisJCXN0YXR1c2JpdCA9IElQU19EU1RfTkFUOworCWVsc2UKKwkJc3RhdHVzYml0ID0gSVBTX1NSQ19OQVQ7CisKKwlpZiAoY3QtPnN0YXR1cyAmIHN0YXR1c2JpdCkgeworCQlmbC0+Zmw0X2RzdCA9IHQtPmRzdC5pcDsKKwkJaWYgKHQtPmRzdC5wcm90b251bSA9PSBJUFBST1RPX1RDUCB8fAorCQkgICAgdC0+ZHN0LnByb3RvbnVtID09IElQUFJPVE9fVURQKQorCQkJZmwtPmZsX2lwX2Rwb3J0ID0gdC0+ZHN0LnUudGNwLnBvcnQ7CisJfQorCisJc3RhdHVzYml0IF49IElQU19OQVRfTUFTSzsKKworCWlmIChjdC0+c3RhdHVzICYgc3RhdHVzYml0KSB7CisJCWZsLT5mbDRfc3JjID0gdC0+c3JjLmlwOworCQlpZiAodC0+ZHN0LnByb3RvbnVtID09IElQUFJPVE9fVENQIHx8CisJCSAgICB0LT5kc3QucHJvdG9udW0gPT0gSVBQUk9UT19VRFApCisJCQlmbC0+ZmxfaXBfc3BvcnQgPSB0LT5zcmMudS50Y3AucG9ydDsKKwl9Cit9CisjZW5kaWYKKwkJCiBzdGF0aWMgdW5zaWduZWQgaW50CiBpcF9uYXRfZm4odW5zaWduZWQgaW50IGhvb2tudW0sCiAJICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCkBAIC0xNjIsMTggKzIwMCwyMCBAQAogICAgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAgICAgICAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCiB7Ci0JdV9pbnQzMl90IHNhZGRyLCBkYWRkcjsKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKKwllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKIAl1bnNpZ25lZCBpbnQgcmV0OwogCi0Jc2FkZHIgPSAoKnBza2IpLT5uaC5pcGgtPnNhZGRyOwotCWRhZGRyID0gKCpwc2tiKS0+bmguaXBoLT5kYWRkcjsKLQogCXJldCA9IGlwX25hdF9mbihob29rbnVtLCBwc2tiLCBpbiwgb3V0LCBva2ZuKTsKIAlpZiAocmV0ICE9IE5GX0RST1AgJiYgcmV0ICE9IE5GX1NUT0xFTgotCSAgICAmJiAoKCpwc2tiKS0+bmguaXBoLT5zYWRkciAhPSBzYWRkcgotCSAgICAgICAgfHwgKCpwc2tiKS0+bmguaXBoLT5kYWRkciAhPSBkYWRkcikpIHsKLQkJZHN0X3JlbGVhc2UoKCpwc2tiKS0+ZHN0KTsKLQkJKCpwc2tiKS0+ZHN0ID0gTlVMTDsKKwkgICAgJiYgKGN0ID0gaXBfY29ubnRyYWNrX2dldCgqcHNrYiwgJmN0aW5mbykpICE9IE5VTEwpIHsKKwkJZW51bSBpcF9jb25udHJhY2tfZGlyIGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKworCQlpZiAoY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5pcCAhPQorCQkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXApIHsKKwkJCWRzdF9yZWxlYXNlKCgqcHNrYiktPmRzdCk7CisJCQkoKnBza2IpLT5kc3QgPSBOVUxMOworCQl9CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC0xODUsMTIgKzIyNSwzMCBAQAogCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAJICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCiB7CisJc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7CisJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CisJdW5zaWduZWQgaW50IHJldDsKKwogCS8qIHJvb3QgaXMgcGxheWluZyB3aXRoIHJhdyBzb2NrZXRzLiAqLwogCWlmICgoKnBza2IpLT5sZW4gPCBzaXplb2Yoc3RydWN0IGlwaGRyKQogCSAgICB8fCAoKnBza2IpLT5uaC5pcGgtPmlobCAqIDQgPCBzaXplb2Yoc3RydWN0IGlwaGRyKSkKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAotCXJldHVybiBpcF9uYXRfZm4oaG9va251bSwgcHNrYiwgaW4sIG91dCwgb2tmbik7CisJcmV0ID0gaXBfbmF0X2ZuKGhvb2tudW0sIHBza2IsIGluLCBvdXQsIG9rZm4pOworCWlmIChyZXQgIT0gTkZfRFJPUCAmJiByZXQgIT0gTkZfU1RPTEVOCisJICAgICYmIChjdCA9IGlwX2Nvbm50cmFja19nZXQoKnBza2IsICZjdGluZm8pKSAhPSBOVUxMKSB7CisJCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CisKKwkJaWYgKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMuaXAgIT0KKwkJICAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwCisjaWZkZWYgQ09ORklHX1hGUk0KKwkJICAgIHx8IGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMudS5hbGwgIT0KKwkJICAgICAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LnUuYWxsCisjZW5kaWYKKwkJICAgICkKKwkJCXJldHVybiBpcF9yb3V0ZV9tZV9oYXJkZXIocHNrYikgPT0gMCA/IHJldCA6IE5GX0RST1A7CisJfQorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKQEAgLTIwMCw3ICsyNTgsOCBAQAogCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogCQlpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKIHsKLQl1X2ludDMyX3Qgc2FkZHIsIGRhZGRyOworCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OworCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwogCXVuc2lnbmVkIGludCByZXQ7CiAKIAkvKiByb290IGlzIHBsYXlpbmcgd2l0aCByYXcgc29ja2V0cy4gKi8KQEAgLTIwOCwxNCArMjY3LDIwIEBACiAJICAgIHx8ICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpKQogCQlyZXR1cm4gTkZfQUNDRVBUOwogCi0Jc2FkZHIgPSAoKnBza2IpLT5uaC5pcGgtPnNhZGRyOwotCWRhZGRyID0gKCpwc2tiKS0+bmguaXBoLT5kYWRkcjsKLQogCXJldCA9IGlwX25hdF9mbihob29rbnVtLCBwc2tiLCBpbiwgb3V0LCBva2ZuKTsKIAlpZiAocmV0ICE9IE5GX0RST1AgJiYgcmV0ICE9IE5GX1NUT0xFTgotCSAgICAmJiAoKCpwc2tiKS0+bmguaXBoLT5zYWRkciAhPSBzYWRkcgotCQl8fCAoKnBza2IpLT5uaC5pcGgtPmRhZGRyICE9IGRhZGRyKSkKLQkJcmV0dXJuIGlwX3JvdXRlX21lX2hhcmRlcihwc2tiKSA9PSAwID8gcmV0IDogTkZfRFJPUDsKKwkgICAgJiYgKGN0ID0gaXBfY29ubnRyYWNrX2dldCgqcHNrYiwgJmN0aW5mbykpICE9IE5VTEwpIHsKKwkJZW51bSBpcF9jb25udHJhY2tfZGlyIGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKworCQlpZiAoY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLmRzdC5pcCAhPQorCQkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMuaXAKKyNpZmRlZiBDT05GSUdfWEZSTQorCQkgICAgfHwgY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLmRzdC51LmFsbCAhPQorCQkgICAgICAgY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy51LmFsbAorI2VuZGlmCisJCSAgICApCisJCQlyZXR1cm4gaXBfcm91dGVfbWVfaGFyZGVyKHBza2IpID09IDAgPyByZXQgOiBORl9EUk9QOworCX0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yOTksMTQgKzM2NCwxOCBAQAogewogCWludCByZXQgPSAwOwogCi0JbmVlZF9pcF9jb25udHJhY2soKTsKKwluZWVkX2Nvbm50cmFjaygpOwogCiAJaWYgKCFpbml0KSBnb3RvIGNsZWFudXA7CiAKKyNpZmRlZiBDT05GSUdfWEZSTQorCUJVR19PTihpcF9uYXRfZGVjb2RlX3Nlc3Npb24gIT0gTlVMTCk7CisJaXBfbmF0X2RlY29kZV9zZXNzaW9uID0gbmF0X2RlY29kZV9zZXNzaW9uOworI2VuZGlmCiAJcmV0ID0gaXBfbmF0X3J1bGVfaW5pdCgpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50aygiaXBfbmF0X2luaXQ6IGNhbid0IHNldHVwIHJ1bGVzLlxuIik7Ci0JCWdvdG8gY2xlYW51cF9ub3RoaW5nOworCQlnb3RvIGNsZWFudXBfZGVjb2RlX3Nlc3Npb247CiAJfQogCXJldCA9IG5mX3JlZ2lzdGVyX2hvb2soJmlwX25hdF9pbl9vcHMpOwogCWlmIChyZXQgPCAwKSB7CkBAIC0zNTQsNyArNDIzLDExIEBACiAJbmZfdW5yZWdpc3Rlcl9ob29rKCZpcF9uYXRfaW5fb3BzKTsKICBjbGVhbnVwX3J1bGVfaW5pdDoKIAlpcF9uYXRfcnVsZV9jbGVhbnVwKCk7Ci0gY2xlYW51cF9ub3RoaW5nOgorIGNsZWFudXBfZGVjb2RlX3Nlc3Npb246CisjaWZkZWYgQ09ORklHX1hGUk0KKwlpcF9uYXRfZGVjb2RlX3Nlc3Npb24gPSBOVUxMOworCXN5bmNocm9uaXplX25ldCgpOworI2VuZGlmCiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jCmluZGV4IDJhMjZkMTYuLjIzNzFiMjAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKQEAgLTIsNyArMiw3IEBACiAgKiBQYWNrZXQgbWF0Y2hpbmcgY29kZS4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgUGF1bCBgUnVzdHknIFJ1c3NlbGwgJiBNaWNoYWVsIEouIE5ldWxpbmcKLSAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtMTEsMTYgKzExLDE3IEBACiAgKiAxOSBKYW4gMjAwMiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgogICogCS0gaW5jcmVhc2UgbW9kdWxlIHVzYWdlIGNvdW50IGFzIHNvb24gYXMgd2UgaGF2ZSBydWxlcyBpbnNpZGUKICAqIAkgIGEgdGFibGUKKyAqIDA4IE9jdCAyMDA1IEhhcmFsZCBXZWx0ZSA8bGFmb3JlQG5ldGZpbHRlci5vcmc+CisgKiAJLSBHZW5lcmFsaXplIGludG8gInhfdGFibGVzIiBsYXllciBhbmQgIntpcCxpcDYsYXJwfV90YWJsZXMiCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgotI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMjksNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KIAorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CkBAIC02MSwxNCArNjMsNiBAQAogI2Vsc2UKICNkZWZpbmUgSVBfTkZfQVNTRVJUKHgpCiAjZW5kaWYKLSNkZWZpbmUgU01QX0FMSUdOKHgpICgoKHgpICsgU01QX0NBQ0hFX0JZVEVTLTEpICYgfihTTVBfQ0FDSEVfQllURVMtMSkpCi0KLXN0YXRpYyBERUNMQVJFX01VVEVYKGlwdF9tdXRleCk7Ci0KLS8qIE11c3QgaGF2ZSBtdXRleCAqLwotI2RlZmluZSBBU1NFUlRfUkVBRF9MT0NLKHgpIElQX05GX0FTU0VSVChkb3duX3RyeWxvY2soJmlwdF9tdXRleCkgIT0gMCkKLSNkZWZpbmUgQVNTRVJUX1dSSVRFX0xPQ0soeCkgSVBfTkZfQVNTRVJUKGRvd25fdHJ5bG9jaygmaXB0X211dGV4KSAhPSAwKQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2xpc3RoZWxwLmg+CiAKICNpZiAwCiAvKiBBbGwgdGhlIGJldHRlciB0byBkZWJ1ZyB5b3Ugd2l0aC4uLiAqLwpAQCAtODUsMzYgKzc5LDYgQEAKIAogICAgSGVuY2UgdGhlIHN0YXJ0IG9mIGFueSB0YWJsZSBpcyBnaXZlbiBieSBnZXRfdGFibGUoKSBiZWxvdy4gICovCiAKLS8qIFRoZSB0YWJsZSBpdHNlbGYgKi8KLXN0cnVjdCBpcHRfdGFibGVfaW5mbwotewotCS8qIFNpemUgcGVyIHRhYmxlICovCi0JdW5zaWduZWQgaW50IHNpemU7Ci0JLyogTnVtYmVyIG9mIGVudHJpZXM6IEZJWE1FLiAtLVJSICovCi0JdW5zaWduZWQgaW50IG51bWJlcjsKLQkvKiBJbml0aWFsIG51bWJlciBvZiBlbnRyaWVzLiBOZWVkZWQgZm9yIG1vZHVsZSB1c2FnZSBjb3VudCAqLwotCXVuc2lnbmVkIGludCBpbml0aWFsX2VudHJpZXM7Ci0KLQkvKiBFbnRyeSBwb2ludHMgYW5kIHVuZGVyZmxvd3MgKi8KLQl1bnNpZ25lZCBpbnQgaG9va19lbnRyeVtORl9JUF9OVU1IT09LU107Ci0JdW5zaWduZWQgaW50IHVuZGVyZmxvd1tORl9JUF9OVU1IT09LU107Ci0KLQkvKiBpcHRfZW50cnkgdGFibGVzOiBvbmUgcGVyIENQVSAqLwotCXZvaWQgKmVudHJpZXNbTlJfQ1BVU107Ci19OwotCi1zdGF0aWMgTElTVF9IRUFEKGlwdF90YXJnZXQpOwotc3RhdGljIExJU1RfSEVBRChpcHRfbWF0Y2gpOwotc3RhdGljIExJU1RfSEVBRChpcHRfdGFibGVzKTsKLSNkZWZpbmUgU0VUX0NPVU5URVIoYyxiLHApIGRvIHsgKGMpLmJjbnQgPSAoYik7IChjKS5wY250ID0gKHApOyB9IHdoaWxlKDApCi0jZGVmaW5lIEFERF9DT1VOVEVSKGMsYixwKSBkbyB7IChjKS5iY250ICs9IChiKTsgKGMpLnBjbnQgKz0gKHApOyB9IHdoaWxlKDApCi0KLSNpZiAwCi0jZGVmaW5lIGRvd24oeCkgZG8geyBwcmludGsoIkRPV046JXU6IiAjeCAiXG4iLCBfX0xJTkVfXyk7IGRvd24oeCk7IH0gd2hpbGUoMCkKLSNkZWZpbmUgZG93bl9pbnRlcnJ1cHRpYmxlKHgpICh7IGludCBfX3I7IHByaW50aygiRE9XTmk6JXU6IiAjeCAiXG4iLCBfX0xJTkVfXyk7IF9fciA9IGRvd25faW50ZXJydXB0aWJsZSh4KTsgaWYgKF9fciAhPSAwKSBwcmludGsoIkFCT1JULURPV05pOiV1XG4iLCBfX0xJTkVfXyk7IF9fcjsgfSkKLSNkZWZpbmUgdXAoeCkgZG8geyBwcmludGsoIlVQOiV1OiIgI3ggIlxuIiwgX19MSU5FX18pOyB1cCh4KTsgfSB3aGlsZSgwKQotI2VuZGlmCi0KIC8qIFJldHVybnMgd2hldGhlciBtYXRjaGVzIHJ1bGUgb3Igbm90LiAqLwogc3RhdGljIGlubGluZSBpbnQKIGlwX3BhY2tldF9tYXRjaChjb25zdCBzdHJ1Y3QgaXBoZHIgKmlwLApAQCAtMjMzLDcgKzE5Nyw4IEBACiAJICAgICBpbnQgKmhvdGRyb3ApCiB7CiAJLyogU3RvcCBpdGVyYXRpb24gaWYgaXQgZG9lc24ndCBtYXRjaCAqLwotCWlmICghbS0+dS5rZXJuZWwubWF0Y2gtPm1hdGNoKHNrYiwgaW4sIG91dCwgbS0+ZGF0YSwgb2Zmc2V0LCBob3Rkcm9wKSkKKwlpZiAoIW0tPnUua2VybmVsLm1hdGNoLT5tYXRjaChza2IsIGluLCBvdXQsIG0tPmRhdGEsIG9mZnNldCwgCisJICAgIHNrYi0+bmguaXBoLT5paGwqNCwgaG90ZHJvcCkpCiAJCXJldHVybiAxOwogCWVsc2UKIAkJcmV0dXJuIDA7CkBAIC0yNjQsNiArMjI5LDcgQEAKIAljb25zdCBjaGFyICppbmRldiwgKm91dGRldjsKIAl2b2lkICp0YWJsZV9iYXNlOwogCXN0cnVjdCBpcHRfZW50cnkgKmUsICpiYWNrOworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlID0gdGFibGUtPnByaXZhdGU7CiAKIAkvKiBJbml0aWFsaXphdGlvbiAqLwogCWlwID0gKCpwc2tiKS0+bmguaXBoOwpAQCAtMjgwLDI0ICsyNDYsMTEgQEAKIAogCXJlYWRfbG9ja19iaCgmdGFibGUtPmxvY2spOwogCUlQX05GX0FTU0VSVCh0YWJsZS0+dmFsaWRfaG9va3MgJiAoMSA8PCBob29rKSk7Ci0JdGFibGVfYmFzZSA9ICh2b2lkICopdGFibGUtPnByaXZhdGUtPmVudHJpZXNbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKLQllID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHRhYmxlLT5wcml2YXRlLT5ob29rX2VudHJ5W2hvb2tdKTsKLQotI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKLQkvKiBDaGVjayBub29uZSBlbHNlIHVzaW5nIG91ciB0YWJsZSAqLwotCWlmICgoKHN0cnVjdCBpcHRfZW50cnkgKil0YWJsZV9iYXNlKS0+Y29tZWZyb20gIT0gMHhkZWFkNTdhYwotCSAgICAmJiAoKHN0cnVjdCBpcHRfZW50cnkgKil0YWJsZV9iYXNlKS0+Y29tZWZyb20gIT0gMHhlZWVlZWVlYykgewotCQlwcmludGsoIkFTU0VSVDogQ1BVICMldSwgJXMgY29tZWZyb20oJXApID0gJVhcbiIsCi0JCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCksCi0JCSAgICAgICB0YWJsZS0+bmFtZSwKLQkJICAgICAgICYoKHN0cnVjdCBpcHRfZW50cnkgKil0YWJsZV9iYXNlKS0+Y29tZWZyb20sCi0JCSAgICAgICAoKHN0cnVjdCBpcHRfZW50cnkgKil0YWJsZV9iYXNlKS0+Y29tZWZyb20pOwotCX0KLQkoKHN0cnVjdCBpcHRfZW50cnkgKil0YWJsZV9iYXNlKS0+Y29tZWZyb20gPSAweDU3YWNjMDAxOwotI2VuZGlmCisJdGFibGVfYmFzZSA9ICh2b2lkICopcHJpdmF0ZS0+ZW50cmllc1tzbXBfcHJvY2Vzc29yX2lkKCldOworCWUgPSBnZXRfZW50cnkodGFibGVfYmFzZSwgcHJpdmF0ZS0+aG9va19lbnRyeVtob29rXSk7CiAKIAkvKiBGb3IgcmV0dXJuIGZyb20gYnVpbHRpbiBjaGFpbiAqLwotCWJhY2sgPSBnZXRfZW50cnkodGFibGVfYmFzZSwgdGFibGUtPnByaXZhdGUtPnVuZGVyZmxvd1tob29rXSk7CisJYmFjayA9IGdldF9lbnRyeSh0YWJsZV9iYXNlLCBwcml2YXRlLT51bmRlcmZsb3dbaG9va10pOwogCiAJZG8gewogCQlJUF9ORl9BU1NFUlQoZSk7CkBAIC0zODMsOSArMzM2LDYgQEAKIAkJfQogCX0gd2hpbGUgKCFob3Rkcm9wKTsKIAotI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKLQkoKHN0cnVjdCBpcHRfZW50cnkgKil0YWJsZV9iYXNlKS0+Y29tZWZyb20gPSAweGRlYWQ1N2FjOwotI2VuZGlmCiAJcmVhZF91bmxvY2tfYmgoJnRhYmxlLT5sb2NrKTsKIAogI2lmZGVmIERFQlVHX0FMTE9XX0FMTApAQCAtMzk3LDE0NSArMzQ3LDYgQEAKICNlbmRpZgogfQogCi0vKgotICogVGhlc2UgYXJlIHdlaXJkLCBidXQgbW9kdWxlIGxvYWRpbmcgbXVzdCBub3QgYmUgZG9uZSB3aXRoIG11dGV4Ci0gKiBoZWxkIChzaW5jZSB0aGV5IHdpbGwgcmVnaXN0ZXIpLCBhbmQgd2UgaGF2ZSB0byBoYXZlIGEgc2luZ2xlCi0gKiBmdW5jdGlvbiB0byB1c2UgdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoKS4KLSAqLwotCi0vKiBGaW5kIHRhYmxlIGJ5IG5hbWUsIGdyYWJzIG11dGV4ICYgcmVmLiAgUmV0dXJucyBFUlJfUFRSKCkgb24gZXJyb3IuICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpcHRfdGFibGUgKmZpbmRfdGFibGVfbG9jayhjb25zdCBjaGFyICpuYW1lKQotewotCXN0cnVjdCBpcHRfdGFibGUgKnQ7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpcHRfbXV0ZXgpICE9IDApCi0JCXJldHVybiBFUlJfUFRSKC1FSU5UUik7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZpcHRfdGFibGVzLCBsaXN0KQotCQlpZiAoc3RyY21wKHQtPm5hbWUsIG5hbWUpID09IDAgJiYgdHJ5X21vZHVsZV9nZXQodC0+bWUpKQotCQkJcmV0dXJuIHQ7Ci0JdXAoJmlwdF9tdXRleCk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEZpbmQgbWF0Y2gsIGdyYWJzIHJlZi4gIFJldHVybnMgRVJSX1BUUigpIG9uIGVycm9yLiAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXB0X21hdGNoICpmaW5kX21hdGNoKGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uKQotewotCXN0cnVjdCBpcHRfbWF0Y2ggKm07Ci0JaW50IGVyciA9IDA7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpcHRfbXV0ZXgpICE9IDApCi0JCXJldHVybiBFUlJfUFRSKC1FSU5UUik7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG0sICZpcHRfbWF0Y2gsIGxpc3QpIHsKLQkJaWYgKHN0cmNtcChtLT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0JCQlpZiAobS0+cmV2aXNpb24gPT0gcmV2aXNpb24pIHsKLQkJCQlpZiAodHJ5X21vZHVsZV9nZXQobS0+bWUpKSB7Ci0JCQkJCXVwKCZpcHRfbXV0ZXgpOwotCQkJCQlyZXR1cm4gbTsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQllcnIgPSAtRVBST1RPVFlQRTsgLyogRm91bmQgc29tZXRoaW5nLiAqLwotCQl9Ci0JfQotCXVwKCZpcHRfbXV0ZXgpOwotCXJldHVybiBFUlJfUFRSKGVycik7Ci19Ci0KLS8qIEZpbmQgdGFyZ2V0LCBncmFicyByZWYuICBSZXR1cm5zIEVSUl9QVFIoKSBvbiBlcnJvci4gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlwdF90YXJnZXQgKmZpbmRfdGFyZ2V0KGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uKQotewotCXN0cnVjdCBpcHRfdGFyZ2V0ICp0OwotCWludCBlcnIgPSAwOwotCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmaXB0X211dGV4KSAhPSAwKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVFIpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmaXB0X3RhcmdldCwgbGlzdCkgewotCQlpZiAoc3RyY21wKHQtPm5hbWUsIG5hbWUpID09IDApIHsKLQkJCWlmICh0LT5yZXZpc2lvbiA9PSByZXZpc2lvbikgewotCQkJCWlmICh0cnlfbW9kdWxlX2dldCh0LT5tZSkpIHsKLQkJCQkJdXAoJmlwdF9tdXRleCk7Ci0JCQkJCXJldHVybiB0OwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCWVyciA9IC1FUFJPVE9UWVBFOyAvKiBGb3VuZCBzb21ldGhpbmcuICovCi0JCX0KLQl9Ci0JdXAoJmlwdF9tdXRleCk7Ci0JcmV0dXJuIEVSUl9QVFIoZXJyKTsKLX0KLQotc3RydWN0IGlwdF90YXJnZXQgKmlwdF9maW5kX3RhcmdldChjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbikKLXsKLQlzdHJ1Y3QgaXB0X3RhcmdldCAqdGFyZ2V0OwotCi0JdGFyZ2V0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoZmluZF90YXJnZXQobmFtZSwgcmV2aXNpb24pLAotCQkJCQkgImlwdF8lcyIsIG5hbWUpOwotCWlmIChJU19FUlIodGFyZ2V0KSB8fCAhdGFyZ2V0KQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gdGFyZ2V0OwotfQotCi1zdGF0aWMgaW50IG1hdGNoX3JldmZuKGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uLCBpbnQgKmJlc3RwKQotewotCXN0cnVjdCBpcHRfbWF0Y2ggKm07Ci0JaW50IGhhdmVfcmV2ID0gMDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkobSwgJmlwdF9tYXRjaCwgbGlzdCkgewotCQlpZiAoc3RyY21wKG0tPm5hbWUsIG5hbWUpID09IDApIHsKLQkJCWlmIChtLT5yZXZpc2lvbiA+ICpiZXN0cCkKLQkJCQkqYmVzdHAgPSBtLT5yZXZpc2lvbjsKLQkJCWlmIChtLT5yZXZpc2lvbiA9PSByZXZpc2lvbikKLQkJCQloYXZlX3JldiA9IDE7Ci0JCX0KLQl9Ci0JcmV0dXJuIGhhdmVfcmV2OwotfQotCi1zdGF0aWMgaW50IHRhcmdldF9yZXZmbihjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbiwgaW50ICpiZXN0cCkKLXsKLQlzdHJ1Y3QgaXB0X3RhcmdldCAqdDsKLQlpbnQgaGF2ZV9yZXYgPSAwOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmaXB0X3RhcmdldCwgbGlzdCkgewotCQlpZiAoc3RyY21wKHQtPm5hbWUsIG5hbWUpID09IDApIHsKLQkJCWlmICh0LT5yZXZpc2lvbiA+ICpiZXN0cCkKLQkJCQkqYmVzdHAgPSB0LT5yZXZpc2lvbjsKLQkJCWlmICh0LT5yZXZpc2lvbiA9PSByZXZpc2lvbikKLQkJCQloYXZlX3JldiA9IDE7Ci0JCX0KLQl9Ci0JcmV0dXJuIGhhdmVfcmV2OwotfQotCi0vKiBSZXR1cm5zIHRydWUgb3IgZmFsc2UgKGlmIG5vIHN1Y2ggZXh0ZW5zaW9uIGF0IGFsbCkgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGZpbmRfcmV2aXNpb24oY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24sCi0JCQkJaW50ICgqcmV2Zm4pKGNvbnN0IGNoYXIgKiwgdTgsIGludCAqKSwKLQkJCQlpbnQgKmVycikKLXsKLQlpbnQgaGF2ZV9yZXYsIGJlc3QgPSAtMTsKLQotCWlmIChkb3duX2ludGVycnVwdGlibGUoJmlwdF9tdXRleCkgIT0gMCkgewotCQkqZXJyID0gLUVJTlRSOwotCQlyZXR1cm4gMTsKLQl9Ci0JaGF2ZV9yZXYgPSByZXZmbihuYW1lLCByZXZpc2lvbiwgJmJlc3QpOwotCXVwKCZpcHRfbXV0ZXgpOwotCi0JLyogTm90aGluZyBhdCBhbGw/ICBSZXR1cm4gMCB0byB0cnkgbG9hZGluZyBtb2R1bGUuICovCi0JaWYgKGJlc3QgPT0gLTEpIHsKLQkJKmVyciA9IC1FTk9FTlQ7Ci0JCXJldHVybiAwOwotCX0KLQotCSplcnIgPSBiZXN0OwotCWlmICghaGF2ZV9yZXYpCi0JCSplcnIgPSAtRVBST1RPTk9TVVBQT1JUOwotCXJldHVybiAxOwotfQotCi0KIC8qIEFsbCB6ZXJvZXMgPT0gdW5jb25kaXRpb25hbCBydWxlLiAqLwogc3RhdGljIGlubGluZSBpbnQKIHVuY29uZGl0aW9uYWwoY29uc3Qgc3RydWN0IGlwdF9pcCAqaXApCkBAIC01NTIsNyArMzYzLDcgQEAKIC8qIEZpZ3VyZXMgb3V0IGZyb20gd2hhdCBob29rIGVhY2ggcnVsZSBjYW4gYmUgY2FsbGVkOiByZXR1cm5zIDAgaWYKICAgIHRoZXJlIGFyZSBsb29wcy4gIFB1dHMgaG9vayBiaXRtYXNrIGluIGNvbWVmcm9tLiAqLwogc3RhdGljIGludAotbWFya19zb3VyY2VfY2hhaW5zKHN0cnVjdCBpcHRfdGFibGVfaW5mbyAqbmV3aW5mbywKK21hcmtfc291cmNlX2NoYWlucyhzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbywKIAkJICAgdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzLCB2b2lkICplbnRyeTApCiB7CiAJdW5zaWduZWQgaW50IGhvb2s7CkBAIC02OTgsNyArNTA5LDcgQEAKIHsKIAlzdHJ1Y3QgaXB0X21hdGNoICptYXRjaDsKIAotCW1hdGNoID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoZmluZF9tYXRjaChtLT51LnVzZXIubmFtZSwKKwltYXRjaCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfbWF0Y2goQUZfSU5FVCwgbS0+dS51c2VyLm5hbWUsCiAJCQkJCQkgICBtLT51LnVzZXIucmV2aXNpb24pLAogCQkJCQkiaXB0XyVzIiwgbS0+dS51c2VyLm5hbWUpOwogCWlmIChJU19FUlIobWF0Y2gpIHx8ICFtYXRjaCkgewpAQCAtNzQzLDcgKzU1NCw4IEBACiAJCWdvdG8gY2xlYW51cF9tYXRjaGVzOwogCiAJdCA9IGlwdF9nZXRfdGFyZ2V0KGUpOwotCXRhcmdldCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfdGFyZ2V0KHQtPnUudXNlci5uYW1lLAorCXRhcmdldCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfdGFyZ2V0KEFGX0lORVQsCisJCQkJCQkgICAgIHQtPnUudXNlci5uYW1lLAogCQkJCQkJICAgICB0LT51LnVzZXIucmV2aXNpb24pLAogCQkJCQkgImlwdF8lcyIsIHQtPnUudXNlci5uYW1lKTsKIAlpZiAoSVNfRVJSKHRhcmdldCkgfHwgIXRhcmdldCkgewpAQCAtNzgwLDcgKzU5Miw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50CiBjaGVja19lbnRyeV9zaXplX2FuZF9ob29rcyhzdHJ1Y3QgaXB0X2VudHJ5ICplLAotCQkJICAgc3RydWN0IGlwdF90YWJsZV9pbmZvICpuZXdpbmZvLAorCQkJICAgc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm8sCiAJCQkgICB1bnNpZ25lZCBjaGFyICpiYXNlLAogCQkJICAgdW5zaWduZWQgY2hhciAqbGltaXQsCiAJCQkgICBjb25zdCB1bnNpZ25lZCBpbnQgKmhvb2tfZW50cmllcywKQEAgLTgxNCw3ICs2MjYsNyBAQAogICAgICAgICAgICA8IDAgKG5vdCBJUFRfUkVUVVJOKS4gLS1SUiAqLwogCiAJLyogQ2xlYXIgY291bnRlcnMgYW5kIGNvbWVmcm9tICovCi0JZS0+Y291bnRlcnMgPSAoKHN0cnVjdCBpcHRfY291bnRlcnMpIHsgMCwgMCB9KTsKKwllLT5jb3VudGVycyA9ICgoc3RydWN0IHh0X2NvdW50ZXJzKSB7IDAsIDAgfSk7CiAJZS0+Y29tZWZyb20gPSAwOwogCiAJKCppKSsrOwpAQCAtODQ0LDcgKzY1Niw3IEBACiBzdGF0aWMgaW50CiB0cmFuc2xhdGVfdGFibGUoY29uc3QgY2hhciAqbmFtZSwKIAkJdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzLAotCQlzdHJ1Y3QgaXB0X3RhYmxlX2luZm8gKm5ld2luZm8sCisJCXN0cnVjdCB4dF90YWJsZV9pbmZvICpuZXdpbmZvLAogCQl2b2lkICplbnRyeTAsCiAJCXVuc2lnbmVkIGludCBzaXplLAogCQl1bnNpZ25lZCBpbnQgbnVtYmVyLApAQCAtOTIxLDQ4ICs3MzMsMTAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF90YWJsZV9pbmZvICoKLXJlcGxhY2VfdGFibGUoc3RydWN0IGlwdF90YWJsZSAqdGFibGUsCi0JICAgICAgdW5zaWduZWQgaW50IG51bV9jb3VudGVycywKLQkgICAgICBzdHJ1Y3QgaXB0X3RhYmxlX2luZm8gKm5ld2luZm8sCi0JICAgICAgaW50ICplcnJvcikKLXsKLQlzdHJ1Y3QgaXB0X3RhYmxlX2luZm8gKm9sZGluZm87Ci0KLSNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCi0JewotCQlpbnQgY3B1OwotCi0JCWZvcl9lYWNoX2NwdShjcHUpIHsKLQkJCXN0cnVjdCBpcHRfZW50cnkgKnRhYmxlX2Jhc2UgPSBuZXdpbmZvLT5lbnRyaWVzW2NwdV07Ci0JCQlpZiAodGFibGVfYmFzZSkKLQkJCQl0YWJsZV9iYXNlLT5jb21lZnJvbSA9IDB4ZGVhZDU3YWM7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCS8qIERvIHRoZSBzdWJzdGl0dXRpb24uICovCi0Jd3JpdGVfbG9ja19iaCgmdGFibGUtPmxvY2spOwotCS8qIENoZWNrIGluc2lkZSBsb2NrOiBpcyB0aGUgb2xkIG51bWJlciBjb3JyZWN0PyAqLwotCWlmIChudW1fY291bnRlcnMgIT0gdGFibGUtPnByaXZhdGUtPm51bWJlcikgewotCQlkdXByaW50ZigibnVtX2NvdW50ZXJzICE9IHRhYmxlLT5wcml2YXRlLT5udW1iZXIgKCV1LyV1KVxuIiwKLQkJCSBudW1fY291bnRlcnMsIHRhYmxlLT5wcml2YXRlLT5udW1iZXIpOwotCQl3cml0ZV91bmxvY2tfYmgoJnRhYmxlLT5sb2NrKTsKLQkJKmVycm9yID0gLUVBR0FJTjsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW9sZGluZm8gPSB0YWJsZS0+cHJpdmF0ZTsKLQl0YWJsZS0+cHJpdmF0ZSA9IG5ld2luZm87Ci0JbmV3aW5mby0+aW5pdGlhbF9lbnRyaWVzID0gb2xkaW5mby0+aW5pdGlhbF9lbnRyaWVzOwotCXdyaXRlX3VubG9ja19iaCgmdGFibGUtPmxvY2spOwotCi0JcmV0dXJuIG9sZGluZm87Ci19Ci0KIC8qIEdldHMgY291bnRlcnMuICovCiBzdGF0aWMgaW5saW5lIGludAogYWRkX2VudHJ5X3RvX2NvdW50ZXIoY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKLQkJICAgICBzdHJ1Y3QgaXB0X2NvdW50ZXJzIHRvdGFsW10sCisJCSAgICAgc3RydWN0IHh0X2NvdW50ZXJzIHRvdGFsW10sCiAJCSAgICAgdW5zaWduZWQgaW50ICppKQogewogCUFERF9DT1VOVEVSKHRvdGFsWyppXSwgZS0+Y291bnRlcnMuYmNudCwgZS0+Y291bnRlcnMucGNudCk7CkBAIC05ODMsOCArNzU3LDggQEAKIH0KIAogc3RhdGljIHZvaWQKLWdldF9jb3VudGVycyhjb25zdCBzdHJ1Y3QgaXB0X3RhYmxlX2luZm8gKnQsCi0JICAgICBzdHJ1Y3QgaXB0X2NvdW50ZXJzIGNvdW50ZXJzW10pCitnZXRfY291bnRlcnMoY29uc3Qgc3RydWN0IHh0X3RhYmxlX2luZm8gKnQsCisJICAgICBzdHJ1Y3QgeHRfY291bnRlcnMgY291bnRlcnNbXSkKIHsKIAl1bnNpZ25lZCBpbnQgY3B1OwogCXVuc2lnbmVkIGludCBpOwpAQCAtMTAyMywxNCArNzk3LDE1IEBACiB7CiAJdW5zaWduZWQgaW50IG9mZiwgbnVtLCBjb3VudGVyc2l6ZTsKIAlzdHJ1Y3QgaXB0X2VudHJ5ICplOwotCXN0cnVjdCBpcHRfY291bnRlcnMgKmNvdW50ZXJzOworCXN0cnVjdCB4dF9jb3VudGVycyAqY291bnRlcnM7CisJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGUgPSB0YWJsZS0+cHJpdmF0ZTsKIAlpbnQgcmV0ID0gMDsKIAl2b2lkICpsb2NfY3B1X2VudHJ5OwogCiAJLyogV2UgbmVlZCBhdG9taWMgc25hcHNob3Qgb2YgY291bnRlcnM6IHJlc3QgZG9lc24ndCBjaGFuZ2UKIAkgICAob3RoZXIgdGhhbiBjb21lZnJvbSwgd2hpY2ggdXNlcnNwYWNlIGRvZXNuJ3QgY2FyZQogCSAgIGFib3V0KS4gKi8KLQljb3VudGVyc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXB0X2NvdW50ZXJzKSAqIHRhYmxlLT5wcml2YXRlLT5udW1iZXI7CisJY291bnRlcnNpemUgPSBzaXplb2Yoc3RydWN0IHh0X2NvdW50ZXJzKSAqIHByaXZhdGUtPm51bWJlcjsKIAljb3VudGVycyA9IHZtYWxsb2Nfbm9kZShjb3VudGVyc2l6ZSwgbnVtYV9ub2RlX2lkKCkpOwogCiAJaWYgKGNvdW50ZXJzID09IE5VTEwpCkBAIC0xMDM4LDE0ICs4MTMsMTQgQEAKIAogCS8qIEZpcnN0LCBzdW0gY291bnRlcnMuLi4gKi8KIAl3cml0ZV9sb2NrX2JoKCZ0YWJsZS0+bG9jayk7Ci0JZ2V0X2NvdW50ZXJzKHRhYmxlLT5wcml2YXRlLCBjb3VudGVycyk7CisJZ2V0X2NvdW50ZXJzKHByaXZhdGUsIGNvdW50ZXJzKTsKIAl3cml0ZV91bmxvY2tfYmgoJnRhYmxlLT5sb2NrKTsKIAogCS8qIGNob29zZSB0aGUgY29weSB0aGF0IGlzIG9uIG91ciBub2RlL2NwdSwgLi4uCiAJICogVGhpcyBjaG9pY2UgaXMgbGF6eSAoYmVjYXVzZSBjdXJyZW50IHRocmVhZCBpcwogCSAqIGFsbG93ZWQgdG8gbWlncmF0ZSB0byBhbm90aGVyIGNwdSkKIAkgKi8KLQlsb2NfY3B1X2VudHJ5ID0gdGFibGUtPnByaXZhdGUtPmVudHJpZXNbcmF3X3NtcF9wcm9jZXNzb3JfaWQoKV07CisJbG9jX2NwdV9lbnRyeSA9IHByaXZhdGUtPmVudHJpZXNbcmF3X3NtcF9wcm9jZXNzb3JfaWQoKV07CiAJLyogLi4uIHRoZW4gY29weSBlbnRpcmUgdGhpbmcgLi4uICovCiAJaWYgKGNvcHlfdG9fdXNlcih1c2VycHRyLCBsb2NfY3B1X2VudHJ5LCB0b3RhbF9zaXplKSAhPSAwKSB7CiAJCXJldCA9IC1FRkFVTFQ7CkBAIC0xMTA3LDc0ICs4ODIsMzYgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBpcHRfdGFibGUgKnQ7CiAKLQl0ID0gZmluZF90YWJsZV9sb2NrKGVudHJpZXMtPm5hbWUpOworCXQgPSB4dF9maW5kX3RhYmxlX2xvY2soQUZfSU5FVCwgZW50cmllcy0+bmFtZSk7CiAJaWYgKHQgJiYgIUlTX0VSUih0KSkgeworCQlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZSA9IHQtPnByaXZhdGU7CiAJCWR1cHJpbnRmKCJ0LT5wcml2YXRlLT5udW1iZXIgPSAldVxuIiwKLQkJCSB0LT5wcml2YXRlLT5udW1iZXIpOwotCQlpZiAoZW50cmllcy0+c2l6ZSA9PSB0LT5wcml2YXRlLT5zaXplKQotCQkJcmV0ID0gY29weV9lbnRyaWVzX3RvX3VzZXIodC0+cHJpdmF0ZS0+c2l6ZSwKKwkJCSBwcml2YXRlLT5udW1iZXIpOworCQlpZiAoZW50cmllcy0+c2l6ZSA9PSBwcml2YXRlLT5zaXplKQorCQkJcmV0ID0gY29weV9lbnRyaWVzX3RvX3VzZXIocHJpdmF0ZS0+c2l6ZSwKIAkJCQkJCSAgIHQsIHVwdHItPmVudHJ5dGFibGUpOwogCQllbHNlIHsKIAkJCWR1cHJpbnRmKCJnZXRfZW50cmllczogSSd2ZSBnb3QgJXUgbm90ICV1IVxuIiwKLQkJCQkgdC0+cHJpdmF0ZS0+c2l6ZSwKKwkJCQkgcHJpdmF0ZS0+c2l6ZSwKIAkJCQkgZW50cmllcy0+c2l6ZSk7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQl9CiAJCW1vZHVsZV9wdXQodC0+bWUpOwotCQl1cCgmaXB0X211dGV4KTsKKwkJeHRfdGFibGVfdW5sb2NrKHQpOwogCX0gZWxzZQogCQlyZXQgPSB0ID8gUFRSX0VSUih0KSA6IC1FTk9FTlQ7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBmcmVlX3RhYmxlX2luZm8oc3RydWN0IGlwdF90YWJsZV9pbmZvICppbmZvKQotewotCWludCBjcHU7Ci0JZm9yX2VhY2hfY3B1KGNwdSkgewotCQlpZiAoaW5mby0+c2l6ZSA8PSBQQUdFX1NJWkUpCi0JCQlrZnJlZShpbmZvLT5lbnRyaWVzW2NwdV0pOwotCQllbHNlCi0JCQl2ZnJlZShpbmZvLT5lbnRyaWVzW2NwdV0pOwotCX0KLQlrZnJlZShpbmZvKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcHRfdGFibGVfaW5mbyAqYWxsb2NfdGFibGVfaW5mbyh1bnNpZ25lZCBpbnQgc2l6ZSkKLXsKLQlzdHJ1Y3QgaXB0X3RhYmxlX2luZm8gKm5ld2luZm87Ci0JaW50IGNwdTsKLQotCW5ld2luZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXB0X3RhYmxlX2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5ld2luZm8pCi0JCXJldHVybiBOVUxMOwotCi0JbmV3aW5mby0+c2l6ZSA9IHNpemU7Ci0KLQlmb3JfZWFjaF9jcHUoY3B1KSB7Ci0JCWlmIChzaXplIDw9IFBBR0VfU0laRSkKLQkJCW5ld2luZm8tPmVudHJpZXNbY3B1XSA9IGttYWxsb2Nfbm9kZShzaXplLAotCQkJCUdGUF9LRVJORUwsCi0JCQkJY3B1X3RvX25vZGUoY3B1KSk7Ci0JCWVsc2UKLQkJCW5ld2luZm8tPmVudHJpZXNbY3B1XSA9IHZtYWxsb2Nfbm9kZShzaXplLCBjcHVfdG9fbm9kZShjcHUpKTsKLQkJaWYgKG5ld2luZm8tPmVudHJpZXNbY3B1XSA9PSAwKSB7Ci0JCQlmcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQotCXJldHVybiBuZXdpbmZvOwotfQotCiBzdGF0aWMgaW50CiBkb19yZXBsYWNlKHZvaWQgX191c2VyICp1c2VyLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCWludCByZXQ7CiAJc3RydWN0IGlwdF9yZXBsYWNlIHRtcDsKIAlzdHJ1Y3QgaXB0X3RhYmxlICp0OwotCXN0cnVjdCBpcHRfdGFibGVfaW5mbyAqbmV3aW5mbywgKm9sZGluZm87Ci0Jc3RydWN0IGlwdF9jb3VudGVycyAqY291bnRlcnM7CisJc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm8sICpvbGRpbmZvOworCXN0cnVjdCB4dF9jb3VudGVycyAqY291bnRlcnM7CiAJdm9pZCAqbG9jX2NwdV9lbnRyeSwgKmxvY19jcHVfb2xkX2VudHJ5OwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXAsIHVzZXIsIHNpemVvZih0bXApKSAhPSAwKQpAQCAtMTE4NCwxMSArOTIxLDcgQEAKIAlpZiAobGVuICE9IHNpemVvZih0bXApICsgdG1wLnNpemUpCiAJCXJldHVybiAtRU5PUFJPVE9PUFQ7CiAKLQkvKiBQZWRhbnRyeTogcHJldmVudCB0aGVtIGZyb20gaGl0dGluZyBCVUcoKSBpbiB2bWFsbG9jLmMgLS1SUiAqLwotCWlmICgoU01QX0FMSUdOKHRtcC5zaXplKSA+PiBQQUdFX1NISUZUKSArIDIgPiBudW1fcGh5c3BhZ2VzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW5ld2luZm8gPSBhbGxvY190YWJsZV9pbmZvKHRtcC5zaXplKTsKKwluZXdpbmZvID0geHRfYWxsb2NfdGFibGVfaW5mbyh0bXAuc2l6ZSk7CiAJaWYgKCFuZXdpbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTIwMCw3ICs5MzMsNyBAQAogCQlnb3RvIGZyZWVfbmV3aW5mbzsKIAl9CiAKLQljb3VudGVycyA9IHZtYWxsb2ModG1wLm51bV9jb3VudGVycyAqIHNpemVvZihzdHJ1Y3QgaXB0X2NvdW50ZXJzKSk7CisJY291bnRlcnMgPSB2bWFsbG9jKHRtcC5udW1fY291bnRlcnMgKiBzaXplb2Yoc3RydWN0IHh0X2NvdW50ZXJzKSk7CiAJaWYgKCFjb3VudGVycykgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZyZWVfbmV3aW5mbzsKQEAgLTEyMTQsNyArOTQ3LDcgQEAKIAogCWR1cHJpbnRmKCJpcF90YWJsZXM6IFRyYW5zbGF0ZWQgdGFibGVcbiIpOwogCi0JdCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfdGFibGVfbG9jayh0bXAubmFtZSksCisJdCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfdGFibGVfbG9jayhBRl9JTkVULCB0bXAubmFtZSksCiAJCQkJICAgICJpcHRhYmxlXyVzIiwgdG1wLm5hbWUpOwogCWlmICghdCB8fCBJU19FUlIodCkpIHsKIAkJcmV0ID0gdCA/IFBUUl9FUlIodCkgOiAtRU5PRU5UOwpAQCAtMTIyOSw3ICs5NjIsNyBAQAogCQlnb3RvIHB1dF9tb2R1bGU7CiAJfQogCi0Jb2xkaW5mbyA9IHJlcGxhY2VfdGFibGUodCwgdG1wLm51bV9jb3VudGVycywgbmV3aW5mbywgJnJldCk7CisJb2xkaW5mbyA9IHh0X3JlcGxhY2VfdGFibGUodCwgdG1wLm51bV9jb3VudGVycywgbmV3aW5mbywgJnJldCk7CiAJaWYgKCFvbGRpbmZvKQogCQlnb3RvIHB1dF9tb2R1bGU7CiAKQEAgLTEyNDgsMjMgKzk4MSwyMyBAQAogCS8qIERlY3JlYXNlIG1vZHVsZSB1c2FnZSBjb3VudHMgYW5kIGZyZWUgcmVzb3VyY2UgKi8KIAlsb2NfY3B1X29sZF9lbnRyeSA9IG9sZGluZm8tPmVudHJpZXNbcmF3X3NtcF9wcm9jZXNzb3JfaWQoKV07CiAJSVBUX0VOVFJZX0lURVJBVEUobG9jX2NwdV9vbGRfZW50cnksIG9sZGluZm8tPnNpemUsIGNsZWFudXBfZW50cnksTlVMTCk7Ci0JZnJlZV90YWJsZV9pbmZvKG9sZGluZm8pOworCXh0X2ZyZWVfdGFibGVfaW5mbyhvbGRpbmZvKTsKIAlpZiAoY29weV90b191c2VyKHRtcC5jb3VudGVycywgY291bnRlcnMsCi0JCQkgc2l6ZW9mKHN0cnVjdCBpcHRfY291bnRlcnMpICogdG1wLm51bV9jb3VudGVycykgIT0gMCkKKwkJCSBzaXplb2Yoc3RydWN0IHh0X2NvdW50ZXJzKSAqIHRtcC5udW1fY291bnRlcnMpICE9IDApCiAJCXJldCA9IC1FRkFVTFQ7CiAJdmZyZWUoY291bnRlcnMpOwotCXVwKCZpcHRfbXV0ZXgpOworCXh0X3RhYmxlX3VubG9jayh0KTsKIAlyZXR1cm4gcmV0OwogCiAgcHV0X21vZHVsZToKIAltb2R1bGVfcHV0KHQtPm1lKTsKLQl1cCgmaXB0X211dGV4KTsKKwl4dF90YWJsZV91bmxvY2sodCk7CiAgZnJlZV9uZXdpbmZvX2NvdW50ZXJzX3VudHJhbnM6CiAJSVBUX0VOVFJZX0lURVJBVEUobG9jX2NwdV9lbnRyeSwgbmV3aW5mby0+c2l6ZSwgY2xlYW51cF9lbnRyeSxOVUxMKTsKICBmcmVlX25ld2luZm9fY291bnRlcnM6CiAJdmZyZWUoY291bnRlcnMpOwogIGZyZWVfbmV3aW5mbzoKLQlmcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7CisJeHRfZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEyNzIsNyArMTAwNSw3IEBACiAgKiBhbmQgZXZlcnl0aGluZyBpcyBPSy4gKi8KIHN0YXRpYyBpbmxpbmUgaW50CiBhZGRfY291bnRlcl90b19lbnRyeShzdHJ1Y3QgaXB0X2VudHJ5ICplLAotCQkgICAgIGNvbnN0IHN0cnVjdCBpcHRfY291bnRlcnMgYWRkbWVbXSwKKwkJICAgICBjb25zdCBzdHJ1Y3QgeHRfY291bnRlcnMgYWRkbWVbXSwKIAkJICAgICB1bnNpZ25lZCBpbnQgKmkpCiB7CiAjaWYgMApAQCAtMTI5NCwxNSArMTAyNywxNiBAQAogZG9fYWRkX2NvdW50ZXJzKHZvaWQgX191c2VyICp1c2VyLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCXVuc2lnbmVkIGludCBpOwotCXN0cnVjdCBpcHRfY291bnRlcnNfaW5mbyB0bXAsICpwYWRkYzsKKwlzdHJ1Y3QgeHRfY291bnRlcnNfaW5mbyB0bXAsICpwYWRkYzsKIAlzdHJ1Y3QgaXB0X3RhYmxlICp0OworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlOwogCWludCByZXQgPSAwOwogCXZvaWQgKmxvY19jcHVfZW50cnk7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwgdXNlciwgc2l6ZW9mKHRtcCkpICE9IDApCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKGxlbiAhPSBzaXplb2YodG1wKSArIHRtcC5udW1fY291bnRlcnMqc2l6ZW9mKHN0cnVjdCBpcHRfY291bnRlcnMpKQorCWlmIChsZW4gIT0gc2l6ZW9mKHRtcCkgKyB0bXAubnVtX2NvdW50ZXJzKnNpemVvZihzdHJ1Y3QgeHRfY291bnRlcnMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXBhZGRjID0gdm1hbGxvY19ub2RlKGxlbiwgbnVtYV9ub2RlX2lkKCkpOwpAQCAtMTMxNCwyOSArMTA0OCwzMCBAQAogCQlnb3RvIGZyZWU7CiAJfQogCi0JdCA9IGZpbmRfdGFibGVfbG9jayh0bXAubmFtZSk7CisJdCA9IHh0X2ZpbmRfdGFibGVfbG9jayhBRl9JTkVULCB0bXAubmFtZSk7CiAJaWYgKCF0IHx8IElTX0VSUih0KSkgewogCQlyZXQgPSB0ID8gUFRSX0VSUih0KSA6IC1FTk9FTlQ7CiAJCWdvdG8gZnJlZTsKIAl9CiAKIAl3cml0ZV9sb2NrX2JoKCZ0LT5sb2NrKTsKLQlpZiAodC0+cHJpdmF0ZS0+bnVtYmVyICE9IHBhZGRjLT5udW1fY291bnRlcnMpIHsKKwlwcml2YXRlID0gdC0+cHJpdmF0ZTsKKwlpZiAocHJpdmF0ZS0+bnVtYmVyICE9IHBhZGRjLT5udW1fY291bnRlcnMpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byB1bmxvY2tfdXBfZnJlZTsKIAl9CiAKIAlpID0gMDsKIAkvKiBDaG9vc2UgdGhlIGNvcHkgdGhhdCBpcyBvbiBvdXIgbm9kZSAqLwotCWxvY19jcHVfZW50cnkgPSB0LT5wcml2YXRlLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOworCWxvY19jcHVfZW50cnkgPSBwcml2YXRlLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOwogCUlQVF9FTlRSWV9JVEVSQVRFKGxvY19jcHVfZW50cnksCi0JCQkgIHQtPnByaXZhdGUtPnNpemUsCisJCQkgIHByaXZhdGUtPnNpemUsCiAJCQkgIGFkZF9jb3VudGVyX3RvX2VudHJ5LAogCQkJICBwYWRkYy0+Y291bnRlcnMsCiAJCQkgICZpKTsKICB1bmxvY2tfdXBfZnJlZToKIAl3cml0ZV91bmxvY2tfYmgoJnQtPmxvY2spOwotCXVwKCZpcHRfbXV0ZXgpOworCXh0X3RhYmxlX3VubG9jayh0KTsKIAltb2R1bGVfcHV0KHQtPm1lKTsKICBmcmVlOgogCXZmcmVlKHBhZGRjKTsKQEAgLTEzOTUsMjUgKzExMzAsMjYgQEAKIAkJfQogCQluYW1lW0lQVF9UQUJMRV9NQVhOQU1FTEVOLTFdID0gJ1wwJzsKIAotCQl0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoZmluZF90YWJsZV9sb2NrKG5hbWUpLAorCQl0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeHRfZmluZF90YWJsZV9sb2NrKEFGX0lORVQsIG5hbWUpLAogCQkJCQkgICAgImlwdGFibGVfJXMiLCBuYW1lKTsKIAkJaWYgKHQgJiYgIUlTX0VSUih0KSkgewogCQkJc3RydWN0IGlwdF9nZXRpbmZvIGluZm87CisJCQlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZSA9IHQtPnByaXZhdGU7CiAKIAkJCWluZm8udmFsaWRfaG9va3MgPSB0LT52YWxpZF9ob29rczsKLQkJCW1lbWNweShpbmZvLmhvb2tfZW50cnksIHQtPnByaXZhdGUtPmhvb2tfZW50cnksCisJCQltZW1jcHkoaW5mby5ob29rX2VudHJ5LCBwcml2YXRlLT5ob29rX2VudHJ5LAogCQkJICAgICAgIHNpemVvZihpbmZvLmhvb2tfZW50cnkpKTsKLQkJCW1lbWNweShpbmZvLnVuZGVyZmxvdywgdC0+cHJpdmF0ZS0+dW5kZXJmbG93LAorCQkJbWVtY3B5KGluZm8udW5kZXJmbG93LCBwcml2YXRlLT51bmRlcmZsb3csCiAJCQkgICAgICAgc2l6ZW9mKGluZm8udW5kZXJmbG93KSk7Ci0JCQlpbmZvLm51bV9lbnRyaWVzID0gdC0+cHJpdmF0ZS0+bnVtYmVyOwotCQkJaW5mby5zaXplID0gdC0+cHJpdmF0ZS0+c2l6ZTsKKwkJCWluZm8ubnVtX2VudHJpZXMgPSBwcml2YXRlLT5udW1iZXI7CisJCQlpbmZvLnNpemUgPSBwcml2YXRlLT5zaXplOwogCQkJbWVtY3B5KGluZm8ubmFtZSwgbmFtZSwgc2l6ZW9mKGluZm8ubmFtZSkpOwogCiAJCQlpZiAoY29weV90b191c2VyKHVzZXIsICZpbmZvLCAqbGVuKSAhPSAwKQogCQkJCXJldCA9IC1FRkFVTFQ7CiAJCQllbHNlCiAJCQkJcmV0ID0gMDsKLQkJCXVwKCZpcHRfbXV0ZXgpOworCQkJeHRfdGFibGVfdW5sb2NrKHQpOwogCQkJbW9kdWxlX3B1dCh0LT5tZSk7CiAJCX0gZWxzZQogCQkJcmV0ID0gdCA/IFBUUl9FUlIodCkgOiAtRU5PRU5UOwpAQCAtMTQ0MCw3ICsxMTc2LDcgQEAKIAljYXNlIElQVF9TT19HRVRfUkVWSVNJT05fTUFUQ0g6CiAJY2FzZSBJUFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVDogewogCQlzdHJ1Y3QgaXB0X2dldF9yZXZpc2lvbiByZXY7Ci0JCWludCAoKnJldmZuKShjb25zdCBjaGFyICosIHU4LCBpbnQgKik7CisJCWludCB0YXJnZXQ7CiAKIAkJaWYgKCpsZW4gIT0gc2l6ZW9mKHJldikpIHsKIAkJCXJldCA9IC1FSU5WQUw7CkBAIC0xNDUyLDEyICsxMTg4LDEzIEBACiAJCX0KIAogCQlpZiAoY21kID09IElQVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUKQotCQkJcmV2Zm4gPSB0YXJnZXRfcmV2Zm47CisJCQl0YXJnZXQgPSAxOwogCQllbHNlCi0JCQlyZXZmbiA9IG1hdGNoX3JldmZuOworCQkJdGFyZ2V0ID0gMDsKIAotCQl0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShmaW5kX3JldmlzaW9uKHJldi5uYW1lLCByZXYucmV2aXNpb24sCi0JCQkJCQkgICAgICByZXZmbiwgJnJldCksCisJCXRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfcmV2aXNpb24oQUZfSU5FVCwgcmV2Lm5hbWUsCisJCQkJCQkJIHJldi5yZXZpc2lvbiwKKwkJCQkJCQkgdGFyZ2V0LCAmcmV0KSwKIAkJCQkJImlwdF8lcyIsIHJldi5uYW1lKTsKIAkJYnJlYWs7CiAJfQpAQCAtMTQ3MCw2MCArMTIwNywxNSBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIFJlZ2lzdHJhdGlvbiBob29rcyBmb3IgdGFyZ2V0cy4gKi8KLWludAotaXB0X3JlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgaXB0X3RhcmdldCAqdGFyZ2V0KQoraW50IGlwdF9yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlLCBjb25zdCBzdHJ1Y3QgaXB0X3JlcGxhY2UgKnJlcGwpCiB7CiAJaW50IHJldDsKLQotCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmaXB0X211dGV4KTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7Ci0JbGlzdF9hZGQoJnRhcmdldC0+bGlzdCwgJmlwdF90YXJnZXQpOwotCXVwKCZpcHRfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQKLWlwdF91bnJlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgaXB0X3RhcmdldCAqdGFyZ2V0KQotewotCWRvd24oJmlwdF9tdXRleCk7Ci0JTElTVF9ERUxFVEUoJmlwdF90YXJnZXQsIHRhcmdldCk7Ci0JdXAoJmlwdF9tdXRleCk7Ci19Ci0KLWludAotaXB0X3JlZ2lzdGVyX21hdGNoKHN0cnVjdCBpcHRfbWF0Y2ggKm1hdGNoKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJmlwdF9tdXRleCk7Ci0JaWYgKHJldCAhPSAwKQotCQlyZXR1cm4gcmV0OwotCi0JbGlzdF9hZGQoJm1hdGNoLT5saXN0LCAmaXB0X21hdGNoKTsKLQl1cCgmaXB0X211dGV4KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQKLWlwdF91bnJlZ2lzdGVyX21hdGNoKHN0cnVjdCBpcHRfbWF0Y2ggKm1hdGNoKQotewotCWRvd24oJmlwdF9tdXRleCk7Ci0JTElTVF9ERUxFVEUoJmlwdF9tYXRjaCwgbWF0Y2gpOwotCXVwKCZpcHRfbXV0ZXgpOwotfQotCi1pbnQgaXB0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCBpcHRfdGFibGUgKnRhYmxlLCBjb25zdCBzdHJ1Y3QgaXB0X3JlcGxhY2UgKnJlcGwpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgaXB0X3RhYmxlX2luZm8gKm5ld2luZm87Ci0Jc3RhdGljIHN0cnVjdCBpcHRfdGFibGVfaW5mbyBib290c3RyYXAKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbzsKKwlzdGF0aWMgc3RydWN0IHh0X3RhYmxlX2luZm8gYm9vdHN0cmFwCiAJCT0geyAwLCAwLCAwLCB7IDAgfSwgeyAwIH0sIHsgfSB9OwogCXZvaWQgKmxvY19jcHVfZW50cnk7CiAKLQluZXdpbmZvID0gYWxsb2NfdGFibGVfaW5mbyhyZXBsLT5zaXplKTsKKwluZXdpbmZvID0geHRfYWxsb2NfdGFibGVfaW5mbyhyZXBsLT5zaXplKTsKIAlpZiAoIW5ld2luZm8pCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xNTM5LDI0NiArMTIzMSwyOSBAQAogCQkJICAgICAgcmVwbC0+aG9va19lbnRyeSwKIAkJCSAgICAgIHJlcGwtPnVuZGVyZmxvdyk7CiAJaWYgKHJldCAhPSAwKSB7Ci0JCWZyZWVfdGFibGVfaW5mbyhuZXdpbmZvKTsKKwkJeHRfZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmaXB0X211dGV4KTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOworCWlmICh4dF9yZWdpc3Rlcl90YWJsZSh0YWJsZSwgJmJvb3RzdHJhcCwgbmV3aW5mbykgIT0gMCkgeworCQl4dF9mcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JLyogRG9uJ3QgYXV0b2xvYWQ6IHdlJ2QgZWF0IG91ciB0YWlsLi4uICovCi0JaWYgKGxpc3RfbmFtZWRfZmluZCgmaXB0X3RhYmxlcywgdGFibGUtPm5hbWUpKSB7Ci0JCXJldCA9IC1FRVhJU1Q7Ci0JCWdvdG8gZnJlZV91bmxvY2s7Ci0JfQotCi0JLyogU2ltcGxpZmllcyByZXBsYWNlX3RhYmxlIGNvZGUuICovCi0JdGFibGUtPnByaXZhdGUgPSAmYm9vdHN0cmFwOwotCWlmICghcmVwbGFjZV90YWJsZSh0YWJsZSwgMCwgbmV3aW5mbywgJnJldCkpCi0JCWdvdG8gZnJlZV91bmxvY2s7Ci0KLQlkdXByaW50ZigidGFibGUtPnByaXZhdGUtPm51bWJlciA9ICV1XG4iLAotCQkgdGFibGUtPnByaXZhdGUtPm51bWJlcik7Ci0JCi0JLyogc2F2ZSBudW1iZXIgb2YgaW5pdGlhbCBlbnRyaWVzICovCi0JdGFibGUtPnByaXZhdGUtPmluaXRpYWxfZW50cmllcyA9IHRhYmxlLT5wcml2YXRlLT5udW1iZXI7Ci0KLQlyd2xvY2tfaW5pdCgmdGFibGUtPmxvY2spOwotCWxpc3RfcHJlcGVuZCgmaXB0X3RhYmxlcywgdGFibGUpOwotCi0gdW5sb2NrOgotCXVwKCZpcHRfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci0KLSBmcmVlX3VubG9jazoKLQlmcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7Ci0JZ290byB1bmxvY2s7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgaXB0X3VucmVnaXN0ZXJfdGFibGUoc3RydWN0IGlwdF90YWJsZSAqdGFibGUpCiB7CisJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGU7CiAJdm9pZCAqbG9jX2NwdV9lbnRyeTsKIAotCWRvd24oJmlwdF9tdXRleCk7Ci0JTElTVF9ERUxFVEUoJmlwdF90YWJsZXMsIHRhYmxlKTsKLQl1cCgmaXB0X211dGV4KTsKKyAJcHJpdmF0ZSA9IHh0X3VucmVnaXN0ZXJfdGFibGUodGFibGUpOwogCiAJLyogRGVjcmVhc2UgbW9kdWxlIHVzYWdlIGNvdW50cyBhbmQgZnJlZSByZXNvdXJjZXMgKi8KLQlsb2NfY3B1X2VudHJ5ID0gdGFibGUtPnByaXZhdGUtPmVudHJpZXNbcmF3X3NtcF9wcm9jZXNzb3JfaWQoKV07Ci0JSVBUX0VOVFJZX0lURVJBVEUobG9jX2NwdV9lbnRyeSwgdGFibGUtPnByaXZhdGUtPnNpemUsCi0JCQkgIGNsZWFudXBfZW50cnksIE5VTEwpOwotCWZyZWVfdGFibGVfaW5mbyh0YWJsZS0+cHJpdmF0ZSk7Ci19Ci0KLS8qIFJldHVybnMgMSBpZiB0aGUgcG9ydCBpcyBtYXRjaGVkIGJ5IHRoZSByYW5nZSwgMCBvdGhlcndpc2UgKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1wb3J0X21hdGNoKHVfaW50MTZfdCBtaW4sIHVfaW50MTZfdCBtYXgsIHVfaW50MTZfdCBwb3J0LCBpbnQgaW52ZXJ0KQotewotCWludCByZXQ7Ci0KLQlyZXQgPSAocG9ydCA+PSBtaW4gJiYgcG9ydCA8PSBtYXgpIF4gaW52ZXJ0OwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQKLXRjcF9maW5kX29wdGlvbih1X2ludDhfdCBvcHRpb24sCi0JCWNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCXVuc2lnbmVkIGludCBvcHRsZW4sCi0JCWludCBpbnZlcnQsCi0JCWludCAqaG90ZHJvcCkKLXsKLQkvKiB0Y3AuZG9mZiBpcyBvbmx5IDQgYml0cywgaWUuIG1heCAxNSAqIDQgYnl0ZXMgKi8KLQl1X2ludDhfdCBfb3B0WzYwIC0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpXSwgKm9wOwotCXVuc2lnbmVkIGludCBpOwotCi0JZHVwcmludGYoInRjcF9tYXRjaDogZmluZGluZyBvcHRpb25cbiIpOwotCi0JaWYgKCFvcHRsZW4pCi0JCXJldHVybiBpbnZlcnQ7Ci0KLQkvKiBJZiB3ZSBkb24ndCBoYXZlIHRoZSB3aG9sZSBoZWFkZXIsIGRyb3AgcGFja2V0LiAqLwotCW9wID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwKLQkJCQlza2ItPm5oLmlwaC0+aWhsKjQgKyBzaXplb2Yoc3RydWN0IHRjcGhkciksCi0JCQkJb3B0bGVuLCBfb3B0KTsKLQlpZiAob3AgPT0gTlVMTCkgewotCQkqaG90ZHJvcCA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBvcHRsZW47ICkgewotCQlpZiAob3BbaV0gPT0gb3B0aW9uKSByZXR1cm4gIWludmVydDsKLQkJaWYgKG9wW2ldIDwgMikgaSsrOwotCQllbHNlIGkgKz0gb3BbaSsxXT86MTsKLQl9Ci0KLQlyZXR1cm4gaW52ZXJ0OwotfQotCi1zdGF0aWMgaW50Ci10Y3BfbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JICBjb25zdCB2b2lkICptYXRjaGluZm8sCi0JICBpbnQgb2Zmc2V0LAotCSAgaW50ICpob3Rkcm9wKQotewotCXN0cnVjdCB0Y3BoZHIgX3RjcGgsICp0aDsKLQljb25zdCBzdHJ1Y3QgaXB0X3RjcCAqdGNwaW5mbyA9IG1hdGNoaW5mbzsKLQotCWlmIChvZmZzZXQpIHsKLQkJLyogVG8gcXVvdGUgQWxhbjoKLQotCQkgICBEb24ndCBhbGxvdyBhIGZyYWdtZW50IG9mIFRDUCA4IGJ5dGVzIGluLiBOb2JvZHkgbm9ybWFsCi0JCSAgIGNhdXNlcyB0aGlzLiBJdHMgYSBjcmFja2VyIHRyeWluZyB0byBicmVhayBpbiBieSBkb2luZyBhCi0JCSAgIGZsYWcgb3ZlcndyaXRlIHRvIHBhc3MgdGhlIGRpcmVjdGlvbiBjaGVja3MuCi0JCSovCi0JCWlmIChvZmZzZXQgPT0gMSkgewotCQkJZHVwcmludGYoIkRyb3BwaW5nIGV2aWwgVENQIG9mZnNldD0xIGZyYWcuXG4iKTsKLQkJCSpob3Rkcm9wID0gMTsKLQkJfQotCQkvKiBNdXN0IG5vdCBiZSBhIGZyYWdtZW50LiAqLwotCQlyZXR1cm4gMDsKLQl9Ci0KLSNkZWZpbmUgRldJTlZUQ1AoYm9vbCxpbnZmbGcpICgoYm9vbCkgXiAhISh0Y3BpbmZvLT5pbnZmbGFncyAmIGludmZsZykpCi0KLQl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwqNCwKLQkJCQlzaXplb2YoX3RjcGgpLCAmX3RjcGgpOwotCWlmICh0aCA9PSBOVUxMKSB7Ci0JCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCi0JCSAgIGNhbid0LiAgSGVuY2UsIG5vIGNob2ljZSBidXQgdG8gZHJvcC4gKi8KLQkJZHVwcmludGYoIkRyb3BwaW5nIGV2aWwgVENQIG9mZnNldD0wIHRpbnlncmFtLlxuIik7Ci0JCSpob3Rkcm9wID0gMTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKCFwb3J0X21hdGNoKHRjcGluZm8tPnNwdHNbMF0sIHRjcGluZm8tPnNwdHNbMV0sCi0JCQludG9ocyh0aC0+c291cmNlKSwKLQkJCSEhKHRjcGluZm8tPmludmZsYWdzICYgSVBUX1RDUF9JTlZfU1JDUFQpKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFwb3J0X21hdGNoKHRjcGluZm8tPmRwdHNbMF0sIHRjcGluZm8tPmRwdHNbMV0sCi0JCQludG9ocyh0aC0+ZGVzdCksCi0JCQkhISh0Y3BpbmZvLT5pbnZmbGFncyAmIElQVF9UQ1BfSU5WX0RTVFBUKSkpCi0JCXJldHVybiAwOwotCWlmICghRldJTlZUQ1AoKCgodW5zaWduZWQgY2hhciAqKXRoKVsxM10gJiB0Y3BpbmZvLT5mbGdfbWFzaykKLQkJICAgICAgPT0gdGNwaW5mby0+ZmxnX2NtcCwKLQkJICAgICAgSVBUX1RDUF9JTlZfRkxBR1MpKQotCQlyZXR1cm4gMDsKLQlpZiAodGNwaW5mby0+b3B0aW9uKSB7Ci0JCWlmICh0aC0+ZG9mZiAqIDQgPCBzaXplb2YoX3RjcGgpKSB7Ci0JCQkqaG90ZHJvcCA9IDE7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoIXRjcF9maW5kX29wdGlvbih0Y3BpbmZvLT5vcHRpb24sIHNrYiwKLQkJCQkgICAgIHRoLT5kb2ZmKjQgLSBzaXplb2YoX3RjcGgpLAotCQkJCSAgICAgdGNwaW5mby0+aW52ZmxhZ3MgJiBJUFRfVENQX0lOVl9PUFRJT04sCi0JCQkJICAgICBob3Rkcm9wKSkKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwotc3RhdGljIGludAotdGNwX2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKLQkgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAotCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAotCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWNvbnN0IHN0cnVjdCBpcHRfdGNwICp0Y3BpbmZvID0gbWF0Y2hpbmZvOwotCi0JLyogTXVzdCBzcGVjaWZ5IHByb3RvID09IFRDUCwgYW5kIG5vIHVua25vd24gaW52ZmxhZ3MgKi8KLQlyZXR1cm4gaXAtPnByb3RvID09IElQUFJPVE9fVENQCi0JCSYmICEoaXAtPmludmZsYWdzICYgSVBUX0lOVl9QUk9UTykKLQkJJiYgbWF0Y2hzaXplID09IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF90Y3ApKQotCQkmJiAhKHRjcGluZm8tPmludmZsYWdzICYgfklQVF9UQ1BfSU5WX01BU0spOwotfQotCi1zdGF0aWMgaW50Ci11ZHBfbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JICBjb25zdCB2b2lkICptYXRjaGluZm8sCi0JICBpbnQgb2Zmc2V0LAotCSAgaW50ICpob3Rkcm9wKQotewotCXN0cnVjdCB1ZHBoZHIgX3VkcGgsICp1aDsKLQljb25zdCBzdHJ1Y3QgaXB0X3VkcCAqdWRwaW5mbyA9IG1hdGNoaW5mbzsKLQotCS8qIE11c3Qgbm90IGJlIGEgZnJhZ21lbnQuICovCi0JaWYgKG9mZnNldCkKLQkJcmV0dXJuIDA7Ci0KLQl1aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwqNCwKLQkJCQlzaXplb2YoX3VkcGgpLCAmX3VkcGgpOwotCWlmICh1aCA9PSBOVUxMKSB7Ci0JCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCi0JCSAgIGNhbid0LiAgSGVuY2UsIG5vIGNob2ljZSBidXQgdG8gZHJvcC4gKi8KLQkJZHVwcmludGYoIkRyb3BwaW5nIGV2aWwgVURQIHRpbnlncmFtLlxuIik7Ci0JCSpob3Rkcm9wID0gMTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIHBvcnRfbWF0Y2godWRwaW5mby0+c3B0c1swXSwgdWRwaW5mby0+c3B0c1sxXSwKLQkJCSAgbnRvaHModWgtPnNvdXJjZSksCi0JCQkgICEhKHVkcGluZm8tPmludmZsYWdzICYgSVBUX1VEUF9JTlZfU1JDUFQpKQotCQkmJiBwb3J0X21hdGNoKHVkcGluZm8tPmRwdHNbMF0sIHVkcGluZm8tPmRwdHNbMV0sCi0JCQkgICAgICBudG9ocyh1aC0+ZGVzdCksCi0JCQkgICAgICAhISh1ZHBpbmZvLT5pbnZmbGFncyAmIElQVF9VRFBfSU5WX0RTVFBUKSk7Ci19Ci0KLS8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KLXN0YXRpYyBpbnQKLXVkcF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICAgICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCi0JICAgICAgIHZvaWQgKm1hdGNoaW5mbywKLQkgICAgICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCi0JICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0JY29uc3Qgc3RydWN0IGlwdF91ZHAgKnVkcGluZm8gPSBtYXRjaGluZm87Ci0KLQkvKiBNdXN0IHNwZWNpZnkgcHJvdG8gPT0gVURQLCBhbmQgbm8gdW5rbm93biBpbnZmbGFncyAqLwotCWlmIChpcC0+cHJvdG8gIT0gSVBQUk9UT19VRFAgfHwgKGlwLT5pbnZmbGFncyAmIElQVF9JTlZfUFJPVE8pKSB7Ci0JCWR1cHJpbnRmKCJpcHRfdWRwOiBQcm90b2NvbCAldSAhPSAldVxuIiwgaXAtPnByb3RvLAotCQkJIElQUFJPVE9fVURQKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChtYXRjaGluZm9zaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF91ZHApKSkgewotCQlkdXByaW50ZigiaXB0X3VkcDogbWF0Y2hzaXplICV1ICE9ICV1XG4iLAotCQkJIG1hdGNoaW5mb3NpemUsIElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF91ZHApKSk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAodWRwaW5mby0+aW52ZmxhZ3MgJiB+SVBUX1VEUF9JTlZfTUFTSykgewotCQlkdXByaW50ZigiaXB0X3VkcDogdW5rbm93biBmbGFncyAlWFxuIiwKLQkJCSB1ZHBpbmZvLT5pbnZmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiAxOworCWxvY19jcHVfZW50cnkgPSBwcml2YXRlLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOworCUlQVF9FTlRSWV9JVEVSQVRFKGxvY19jcHVfZW50cnksIHByaXZhdGUtPnNpemUsIGNsZWFudXBfZW50cnksIE5VTEwpOworCXh0X2ZyZWVfdGFibGVfaW5mbyhwcml2YXRlKTsKIH0KIAogLyogUmV0dXJucyAxIGlmIHRoZSB0eXBlIGFuZCBjb2RlIGlzIG1hdGNoZWQgYnkgdGhlIHJhbmdlLCAwIG90aGVyd2lzZSAqLwpAQCAtMTc5Nyw2ICsxMjcyLDcgQEAKIAkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogCSAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKIAkgICBpbnQgb2Zmc2V0LAorCSAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAogCSAgIGludCAqaG90ZHJvcCkKIHsKIAlzdHJ1Y3QgaWNtcGhkciBfaWNtcGgsICppYzsKQEAgLTE4MDYsOCArMTI4Miw3IEBACiAJaWYgKG9mZnNldCkKIAkJcmV0dXJuIDA7CiAKLQlpYyA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwqNCwKLQkJCQlzaXplb2YoX2ljbXBoKSwgJl9pY21waCk7CisJaWMgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b2ZmLCBzaXplb2YoX2ljbXBoKSwgJl9pY21waCk7CiAJaWYgKGljID09IE5VTEwpIHsKIAkJLyogV2UndmUgYmVlbiBhc2tlZCB0byBleGFtaW5lIHRoaXMgcGFja2V0LCBhbmQgd2UKIAkJICogY2FuJ3QuICBIZW5jZSwgbm8gY2hvaWNlIGJ1dCB0byBkcm9wLgpAQCAtMTgyNywxMSArMTMwMiwxMiBAQAogLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwogc3RhdGljIGludAogaWNtcF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkgICBjb25zdCB2b2lkICppbmZvLAogCSAgIHZvaWQgKm1hdGNoaW5mbywKIAkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7CisJY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAgPSBpbmZvOwogCWNvbnN0IHN0cnVjdCBpcHRfaWNtcCAqaWNtcGluZm8gPSBtYXRjaGluZm87CiAKIAkvKiBNdXN0IHNwZWNpZnkgcHJvdG8gPT0gSUNNUCwgYW5kIG5vIHVua25vd24gaW52ZmxhZ3MgKi8KQEAgLTE4NjEsMTIzICsxMzM3LDIyIEBACiAJLmdldAkJPSBkb19pcHRfZ2V0X2N0bCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIHRjcF9tYXRjaHN0cnVjdCA9IHsKLQkubmFtZQkJPSAidGNwIiwKLQkubWF0Y2gJCT0gJnRjcF9tYXRjaCwKLQkuY2hlY2tlbnRyeQk9ICZ0Y3BfY2hlY2tlbnRyeSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIHVkcF9tYXRjaHN0cnVjdCA9IHsKLQkubmFtZQkJPSAidWRwIiwKLQkubWF0Y2gJCT0gJnVkcF9tYXRjaCwKLQkuY2hlY2tlbnRyeQk9ICZ1ZHBfY2hlY2tlbnRyeSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIGljbXBfbWF0Y2hzdHJ1Y3QgPSB7CiAJLm5hbWUJCT0gImljbXAiLAogCS5tYXRjaAkJPSAmaWNtcF9tYXRjaCwKIAkuY2hlY2tlbnRyeQk9ICZpY21wX2NoZWNrZW50cnksCiB9OwogCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLXN0YXRpYyBpbmxpbmUgaW50IHByaW50X25hbWUoY29uc3QgY2hhciAqaSwKLQkJCSAgICAgb2ZmX3Qgc3RhcnRfb2Zmc2V0LCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgsCi0JCQkgICAgIG9mZl90ICpwb3MsIHVuc2lnbmVkIGludCAqY291bnQpCi17Ci0JaWYgKCgqY291bnQpKysgPj0gc3RhcnRfb2Zmc2V0KSB7Ci0JCXVuc2lnbmVkIGludCBuYW1lbGVuOwotCi0JCW5hbWVsZW4gPSBzcHJpbnRmKGJ1ZmZlciArICpwb3MsICIlc1xuIiwKLQkJCQkgIGkgKyBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkpOwotCQlpZiAoKnBvcyArIG5hbWVsZW4gPiBsZW5ndGgpIHsKLQkJCS8qIFN0b3AgaXRlcmF0aW5nICovCi0JCQlyZXR1cm4gMTsKLQkJfQotCQkqcG9zICs9IG5hbWVsZW47Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBwcmludF90YXJnZXQoY29uc3Qgc3RydWN0IGlwdF90YXJnZXQgKnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX3Qgc3RhcnRfb2Zmc2V0LCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX3QgKnBvcywgdW5zaWduZWQgaW50ICpjb3VudCkKLXsKLQlpZiAodCA9PSAmaXB0X3N0YW5kYXJkX3RhcmdldCB8fCB0ID09ICZpcHRfZXJyb3JfdGFyZ2V0KQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gcHJpbnRfbmFtZSgoY2hhciAqKXQsIHN0YXJ0X29mZnNldCwgYnVmZmVyLCBsZW5ndGgsIHBvcywgY291bnQpOwotfQotCi1zdGF0aWMgaW50IGlwdF9nZXRfdGFibGVzKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgpCi17Ci0Jb2ZmX3QgcG9zID0gMDsKLQl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwotCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmaXB0X211dGV4KSAhPSAwKQotCQlyZXR1cm4gMDsKLQotCUxJU1RfRklORCgmaXB0X3RhYmxlcywgcHJpbnRfbmFtZSwgdm9pZCAqLAotCQkgIG9mZnNldCwgYnVmZmVyLCBsZW5ndGgsICZwb3MsICZjb3VudCk7Ci0KLQl1cCgmaXB0X211dGV4KTsKLQotCS8qIGBzdGFydCcgaGFjayAtIHNlZSBmcy9wcm9jL2dlbmVyaWMuYyBsaW5lIH4xMDUgKi8KLQkqc3RhcnQ9KGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpY291bnQtb2Zmc2V0KTsKLQlyZXR1cm4gcG9zOwotfQotCi1zdGF0aWMgaW50IGlwdF9nZXRfdGFyZ2V0cyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoKQotewotCW9mZl90IHBvcyA9IDA7Ci0JdW5zaWduZWQgaW50IGNvdW50ID0gMDsKLQotCWlmIChkb3duX2ludGVycnVwdGlibGUoJmlwdF9tdXRleCkgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlMSVNUX0ZJTkQoJmlwdF90YXJnZXQsIHByaW50X3RhcmdldCwgc3RydWN0IGlwdF90YXJnZXQgKiwKLQkJICBvZmZzZXQsIGJ1ZmZlciwgbGVuZ3RoLCAmcG9zLCAmY291bnQpOwotCQotCXVwKCZpcHRfbXV0ZXgpOwotCi0JKnN0YXJ0ID0gKGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpY291bnQgLSBvZmZzZXQpOwotCXJldHVybiBwb3M7Ci19Ci0KLXN0YXRpYyBpbnQgaXB0X2dldF9tYXRjaGVzKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgpCi17Ci0Jb2ZmX3QgcG9zID0gMDsKLQl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwotCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmaXB0X211dGV4KSAhPSAwKQotCQlyZXR1cm4gMDsKLQkKLQlMSVNUX0ZJTkQoJmlwdF9tYXRjaCwgcHJpbnRfbmFtZSwgdm9pZCAqLAotCQkgIG9mZnNldCwgYnVmZmVyLCBsZW5ndGgsICZwb3MsICZjb3VudCk7Ci0KLQl1cCgmaXB0X211dGV4KTsKLQotCSpzdGFydCA9IChjaGFyICopKCh1bnNpZ25lZCBsb25nKWNvdW50IC0gb2Zmc2V0KTsKLQlyZXR1cm4gcG9zOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHsgY2hhciAqbmFtZTsgZ2V0X2luZm9fdCAqZ2V0X2luZm87IH0gaXB0X3Byb2NfZW50cnlbXSA9Ci17IHsgImlwX3RhYmxlc19uYW1lcyIsIGlwdF9nZXRfdGFibGVzIH0sCi0gIHsgImlwX3RhYmxlc190YXJnZXRzIiwgaXB0X2dldF90YXJnZXRzIH0sCi0gIHsgImlwX3RhYmxlc19tYXRjaGVzIiwgaXB0X2dldF9tYXRjaGVzIH0sCi0gIHsgTlVMTCwgTlVMTH0gfTsKLSNlbmRpZiAvKkNPTkZJR19QUk9DX0ZTKi8KLQogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewogCWludCByZXQ7CiAKKwl4dF9wcm90b19pbml0KEFGX0lORVQpOworCiAJLyogTm9vbmUgZWxzZSB3aWxsIGJlIGRvd25pbmcgc2VtIG5vdywgc28gd2Ugd29uJ3Qgc2xlZXAgKi8KLQlkb3duKCZpcHRfbXV0ZXgpOwotCWxpc3RfYXBwZW5kKCZpcHRfdGFyZ2V0LCAmaXB0X3N0YW5kYXJkX3RhcmdldCk7Ci0JbGlzdF9hcHBlbmQoJmlwdF90YXJnZXQsICZpcHRfZXJyb3JfdGFyZ2V0KTsKLQlsaXN0X2FwcGVuZCgmaXB0X21hdGNoLCAmdGNwX21hdGNoc3RydWN0KTsKLQlsaXN0X2FwcGVuZCgmaXB0X21hdGNoLCAmdWRwX21hdGNoc3RydWN0KTsKLQlsaXN0X2FwcGVuZCgmaXB0X21hdGNoLCAmaWNtcF9tYXRjaHN0cnVjdCk7Ci0JdXAoJmlwdF9tdXRleCk7CisJeHRfcmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZpcHRfc3RhbmRhcmRfdGFyZ2V0KTsKKwl4dF9yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmlwdF9lcnJvcl90YXJnZXQpOworCXh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZpY21wX21hdGNoc3RydWN0KTsKIAogCS8qIFJlZ2lzdGVyIHNldHNvY2tvcHQgKi8KIAlyZXQgPSBuZl9yZWdpc3Rlcl9zb2Nrb3B0KCZpcHRfc29ja29wdHMpOwpAQCAtMTk4Niw0OSArMTM2MSwyMyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYzsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGlwdF9wcm9jX2VudHJ5W2ldLm5hbWU7IGkrKykgewotCQlwcm9jID0gcHJvY19uZXRfY3JlYXRlKGlwdF9wcm9jX2VudHJ5W2ldLm5hbWUsIDAsCi0JCQkJICAgICAgIGlwdF9wcm9jX2VudHJ5W2ldLmdldF9pbmZvKTsKLQkJaWYgKCFwcm9jKSB7Ci0JCQl3aGlsZSAoLS1pID49IDApCi0JCQkJcHJvY19uZXRfcmVtb3ZlKGlwdF9wcm9jX2VudHJ5W2ldLm5hbWUpOwotCQkJbmZfdW5yZWdpc3Rlcl9zb2Nrb3B0KCZpcHRfc29ja29wdHMpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJcHJvYy0+b3duZXIgPSBUSElTX01PRFVMRTsKLQl9Ci0JfQotI2VuZGlmCi0KLQlwcmludGsoImlwX3RhYmxlczogKEMpIDIwMDAtMjAwMiBOZXRmaWx0ZXIgY29yZSB0ZWFtXG4iKTsKKwlwcmludGsoImlwX3RhYmxlczogKEMpIDIwMDAtMjAwNiBOZXRmaWx0ZXIgQ29yZSBUZWFtXG4iKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKIHsKIAluZl91bnJlZ2lzdGVyX3NvY2tvcHQoJmlwdF9zb2Nrb3B0cyk7Ci0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQl7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaXB0X3Byb2NfZW50cnlbaV0ubmFtZTsgaSsrKQotCQlwcm9jX25ldF9yZW1vdmUoaXB0X3Byb2NfZW50cnlbaV0ubmFtZSk7Ci0JfQotI2VuZGlmCisKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZpY21wX21hdGNoc3RydWN0KTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmaXB0X2Vycm9yX3RhcmdldCk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmlwdF9zdGFuZGFyZF90YXJnZXQpOworCisJeHRfcHJvdG9fZmluaShBRl9JTkVUKTsKIH0KIAogRVhQT1JUX1NZTUJPTChpcHRfcmVnaXN0ZXJfdGFibGUpOwogRVhQT1JUX1NZTUJPTChpcHRfdW5yZWdpc3Rlcl90YWJsZSk7Ci1FWFBPUlRfU1lNQk9MKGlwdF9yZWdpc3Rlcl9tYXRjaCk7Ci1FWFBPUlRfU1lNQk9MKGlwdF91bnJlZ2lzdGVyX21hdGNoKTsKIEVYUE9SVF9TWU1CT0woaXB0X2RvX3RhYmxlKTsKLUVYUE9SVF9TWU1CT0woaXB0X3JlZ2lzdGVyX3RhcmdldCk7Ci1FWFBPUlRfU1lNQk9MKGlwdF91bnJlZ2lzdGVyX3RhcmdldCk7Ci1FWFBPUlRfU1lNQk9MKGlwdF9maW5kX3RhcmdldCk7Ci0KIG1vZHVsZV9pbml0KGluaXQpOwogbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMQVNTSUZZLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMQVNTSUZZLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYjc4ZDguLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTEFTU0lGWS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIFRoaXMgaXMgYSBtb2R1bGUgd2hpY2ggaXMgdXNlZCBmb3Igc2V0dGluZyB0aGUgc2tiLT5wcmlvcml0eSBmaWVsZAotICogb2YgYW4gc2tiIGZvciBxZGlzYyBjbGFzc2lmaWNhdGlvbi4KLSAqLwotCi0vKiAoQykgMjAwMS0yMDAyIFBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfQ0xBU1NJRlkuaD4KLQotTU9EVUxFX0FVVEhPUigiUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIHFkaXNjIGNsYXNzaWZpY2F0aW9uIHRhcmdldCBtb2R1bGUiKTsKLQotc3RhdGljIHVuc2lnbmVkIGludAotdGFyZ2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKLSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKLSAgICAgICBjb25zdCB2b2lkICp0YXJnaW5mbywKLSAgICAgICB2b2lkICp1c2VyaW5mbykKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X2NsYXNzaWZ5X3RhcmdldF9pbmZvICpjbGluZm8gPSB0YXJnaW5mbzsKLQotCWlmKCgqcHNrYiktPnByaW9yaXR5ICE9IGNsaW5mby0+cHJpb3JpdHkpIAotCQkoKnBza2IpLT5wcmlvcml0eSA9IGNsaW5mby0+cHJpb3JpdHk7Ci0KLQlyZXR1cm4gSVBUX0NPTlRJTlVFOwotfQotCi1zdGF0aWMgaW50Ci1jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLSAgICAgICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKLSAgICAgICAgICAgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0JaWYgKHRhcmdpbmZvc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfY2xhc3NpZnlfdGFyZ2V0X2luZm8pKSl7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ0xBU1NJRlk6IGludmFsaWQgc2l6ZSAoJXUgIT0gJVp1KS5cbiIsCi0JCSAgICAgICB0YXJnaW5mb3NpemUsCi0JCSAgICAgICBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfY2xhc3NpZnlfdGFyZ2V0X2luZm8pKSk7Ci0JCXJldHVybiAwOwotCX0KLQkKLQlpZiAoaG9va19tYXNrICYgfigoMSA8PCBORl9JUF9MT0NBTF9PVVQpIHwgKDEgPDwgTkZfSVBfRk9SV0FSRCkgfAotCSAgICAgICAgICAgICAgICAgICgxIDw8IE5GX0lQX1BPU1RfUk9VVElORykpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ0xBU1NJRlk6IG9ubHkgdmFsaWQgaW4gTE9DQUxfT1VULCBGT1JXQVJEICIKLQkJICAgICAgICAgICAgICAgICJhbmQgUE9TVF9ST1VUSU5HLlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChzdHJjbXAodGFibGVuYW1lLCAibWFuZ2xlIikgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkNMQVNTSUZZOiBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSAiCi0JCSAgICAgICAgICAgICAgICAiXCJtYW5nbGVcIiB0YWJsZSwgbm90IFwiJXNcIi5cbiIsCi0JCSAgICAgICAgICAgICAgICB0YWJsZW5hbWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9jbGFzc2lmeV9yZWcgPSB7IAotCS5uYW1lIAkJPSAiQ0xBU1NJRlkiLCAKLQkudGFyZ2V0IAk9IHRhcmdldCwKLQkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCi0JLm1lIAkJPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X2NsYXNzaWZ5X3JlZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCi17Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfY2xhc3NpZnlfcmVnKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jCmluZGV4IDQ1YzUyZDguLmQ5YmM5NzEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYwpAQCAtMzc5LDEyICszNzksMTMgQEAKIAogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkgICBjb25zdCB2b2lkICplX3ZvaWQsCiAgICAgICAgICAgIHZvaWQgKnRhcmdpbmZvLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewogCXN0cnVjdCBpcHRfY2x1c3RlcmlwX3RndF9pbmZvICpjaXBpbmZvID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSA9IGVfdm9pZDsKIAogCXN0cnVjdCBjbHVzdGVyaXBfY29uZmlnICpjb25maWc7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ09OTk1BUksuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ09OTk1BUksuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFjYWM1YS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NPTk5NQVJLLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyogVGhpcyBrZXJuZWwgbW9kdWxlIGlzIHVzZWQgdG8gbW9kaWZ5IHRoZSBjb25uZWN0aW9uIG1hcmsgdmFsdWVzLCBvcgotICogdG8gb3B0aW9uYWxseSByZXN0b3JlIHRoZSBza2IgbmZtYXJrIGZyb20gdGhlIGNvbm5lY3Rpb24gbWFyawotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiwyMDA0IE1BUkEgU3lzdGVtcyBBQiA8aHR0cDovL3d3dy5tYXJhc3lzdGVtcy5jb20+Ci0gKiBieSBIZW5yaWsgTm9yZHN0cm9tIDxobm9AbWFyYXN5c3RlbXMuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+Ci0KLU1PRFVMRV9BVVRIT1IoIkhlbnJpayBOb3Jkc3Ryb20gPGhub0BtYXJhc3l0ZW1zLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSVAgdGFibGVzIENPTk5NQVJLIG1hdGNoaW5nIG1vZHVsZSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0NPTk5NQVJLLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tcGF0Lmg+Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXRhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0gICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgdm9pZCAqdXNlcmluZm8pCi17Ci0JY29uc3Qgc3RydWN0IGlwdF9jb25ubWFya190YXJnZXRfaW5mbyAqbWFya2luZm8gPSB0YXJnaW5mbzsKLQl1X2ludDMyX3QgZGlmZjsKLQl1X2ludDMyX3QgbmZtYXJrOwotCXVfaW50MzJfdCBuZXdtYXJrOwotCXVfaW50MzJfdCBjdGluZm87Ci0JdV9pbnQzMl90ICpjdG1hcmsgPSBuZl9jdF9nZXRfbWFyaygqcHNrYiwgJmN0aW5mbyk7Ci0KLQlpZiAoY3RtYXJrKSB7Ci0JICAgIHN3aXRjaChtYXJraW5mby0+bW9kZSkgewotCSAgICBjYXNlIElQVF9DT05OTUFSS19TRVQ6Ci0JCW5ld21hcmsgPSAoKmN0bWFyayAmIH5tYXJraW5mby0+bWFzaykgfCBtYXJraW5mby0+bWFyazsKLQkJaWYgKG5ld21hcmsgIT0gKmN0bWFyaykKLQkJICAgICpjdG1hcmsgPSBuZXdtYXJrOwotCQlicmVhazsKLQkgICAgY2FzZSBJUFRfQ09OTk1BUktfU0FWRToKLQkJbmV3bWFyayA9ICgqY3RtYXJrICYgfm1hcmtpbmZvLT5tYXNrKSB8ICgoKnBza2IpLT5uZm1hcmsgJiBtYXJraW5mby0+bWFzayk7Ci0JCWlmICgqY3RtYXJrICE9IG5ld21hcmspCi0JCSAgICAqY3RtYXJrID0gbmV3bWFyazsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgSVBUX0NPTk5NQVJLX1JFU1RPUkU6Ci0JCW5mbWFyayA9ICgqcHNrYiktPm5mbWFyazsKLQkJZGlmZiA9ICgqY3RtYXJrIF4gbmZtYXJrKSAmIG1hcmtpbmZvLT5tYXNrOwotCQlpZiAoZGlmZiAhPSAwKQotCQkgICAgKCpwc2tiKS0+bmZtYXJrID0gbmZtYXJrIF4gZGlmZjsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLQlyZXR1cm4gSVBUX0NPTlRJTlVFOwotfQotCi1zdGF0aWMgaW50Ci1jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAotCSAgIHZvaWQgKnRhcmdpbmZvLAotCSAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCi0JICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLQlzdHJ1Y3QgaXB0X2Nvbm5tYXJrX3RhcmdldF9pbmZvICptYXRjaGluZm8gPSB0YXJnaW5mbzsKLQlpZiAodGFyZ2luZm9zaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9jb25ubWFya190YXJnZXRfaW5mbykpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkNPTk5NQVJLOiB0YXJnaW5mb3NpemUgJXUgIT0gJVp1XG4iLAotCQkgICAgICAgdGFyZ2luZm9zaXplLAotCQkgICAgICAgSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2Nvbm5tYXJrX3RhcmdldF9pbmZvKSkpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAobWF0Y2hpbmZvLT5tb2RlID09IElQVF9DT05OTUFSS19SRVNUT1JFKSB7Ci0JICAgIGlmIChzdHJjbXAodGFibGVuYW1lLCAibWFuZ2xlIikgIT0gMCkgewotCQkgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiQ09OTk1BUks6IHJlc3RvcmUgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gXCJtYW5nbGVcIiB0YWJsZSwgbm90IFwiJXNcIlxuIiwgdGFibGVuYW1lKTsKLQkJICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotCi0JaWYgKG1hdGNoaW5mby0+bWFyayA+IDB4ZmZmZmZmZmYgfHwgbWF0Y2hpbmZvLT5tYXNrID4gMHhmZmZmZmZmZikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJDT05OTUFSSzogT25seSBzdXBwb3J0cyAzMmJpdCBtYXJrXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCBpcHRfY29ubm1hcmtfcmVnID0gewotCS5uYW1lID0gIkNPTk5NQVJLIiwKLQkudGFyZ2V0ID0gJnRhcmdldCwKLQkuY2hlY2tlbnRyeSA9ICZjaGVja2VudHJ5LAotCS5tZSA9IFRISVNfTU9EVUxFCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JbmVlZF9pcF9jb25udHJhY2soKTsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X2Nvbm5tYXJrX3JlZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCi17Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfY29ubm1hcmtfcmVnKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfRFNDUC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9EU0NQLmMKaW5kZXggNmUzMTk1Ny4uODk4Y2RmNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9EU0NQLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9EU0NQLmMKQEAgLTU3LDcgKzU3LDcgQEAKIAogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkgICBjb25zdCB2b2lkICplX3ZvaWQsCiAgICAgICAgICAgIHZvaWQgKnRhcmdpbmZvLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9FQ04uYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfRUNOLmMKaW5kZXggYTEzMTk2OS4uNzA2NDQ1NCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9FQ04uYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0VDTi5jCkBAIC0xMTMsMTIgKzExMywxMyBAQAogCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCSAgIGNvbnN0IHZvaWQgKmVfdm9pZCwKICAgICAgICAgICAgdm9pZCAqdGFyZ2luZm8sCiAgICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7CiAJY29uc3Qgc3RydWN0IGlwdF9FQ05faW5mbyAqZWluZm8gPSAoc3RydWN0IGlwdF9FQ05faW5mbyAqKXRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUgPSBlX3ZvaWQ7CiAKIAlpZiAodGFyZ2luZm9zaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9FQ05faW5mbykpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVDTjogdGFyZ2luZm9zaXplICV1ICE9ICVadVxuIiwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTE9HLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0xPRy5jCmluZGV4IDMwYmUwZjEuLjY2MDZkZGIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTE9HLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9MT0cuYwpAQCAtNDMxLDcgKzQzMSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgaXB0X2xvZ19jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJCQkgICAgICBjb25zdCB2b2lkICplLAogCQkJICAgICAgdm9pZCAqdGFyZ2luZm8sCiAJCQkgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogCQkJICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFSSy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVJLLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYjRmMmMuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVJLLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyogVGhpcyBpcyBhIG1vZHVsZSB3aGljaCBpcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBORk1BUksgZmllbGQgb2YgYW4gc2tiLiAqLwotCi0vKiAoQykgMTk5OS0yMDAxIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTUFSSy5oPgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgTUFSSyBtb2RpZmljYXRpb24gbW9kdWxlIik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXRhcmdldF92MChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCSAgdW5zaWduZWQgaW50IGhvb2tudW0sCi0JICBjb25zdCB2b2lkICp0YXJnaW5mbywKLQkgIHZvaWQgKnVzZXJpbmZvKQotewotCWNvbnN0IHN0cnVjdCBpcHRfbWFya190YXJnZXRfaW5mbyAqbWFya2luZm8gPSB0YXJnaW5mbzsKLQotCWlmKCgqcHNrYiktPm5mbWFyayAhPSBtYXJraW5mby0+bWFyaykKLQkJKCpwc2tiKS0+bmZtYXJrID0gbWFya2luZm8tPm1hcms7Ci0KLQlyZXR1cm4gSVBUX0NPTlRJTlVFOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci10YXJnZXRfdjEoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkgIHVuc2lnbmVkIGludCBob29rbnVtLAotCSAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCi0JICB2b2lkICp1c2VyaW5mbykKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X21hcmtfdGFyZ2V0X2luZm9fdjEgKm1hcmtpbmZvID0gdGFyZ2luZm87Ci0JaW50IG1hcmsgPSAwOwotCi0Jc3dpdGNoIChtYXJraW5mby0+bW9kZSkgewotCWNhc2UgSVBUX01BUktfU0VUOgotCQltYXJrID0gbWFya2luZm8tPm1hcms7Ci0JCWJyZWFrOwotCQkKLQljYXNlIElQVF9NQVJLX0FORDoKLQkJbWFyayA9ICgqcHNrYiktPm5mbWFyayAmIG1hcmtpbmZvLT5tYXJrOwotCQlicmVhazsKLQkJCi0JY2FzZSBJUFRfTUFSS19PUjoKLQkJbWFyayA9ICgqcHNrYiktPm5mbWFyayB8IG1hcmtpbmZvLT5tYXJrOwotCQlicmVhazsKLQl9Ci0KLQlpZigoKnBza2IpLT5uZm1hcmsgIT0gbWFyaykKLQkJKCpwc2tiKS0+bmZtYXJrID0gbWFyazsKLQotCXJldHVybiBJUFRfQ09OVElOVUU7Ci19Ci0KLQotc3RhdGljIGludAotY2hlY2tlbnRyeV92MChjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKLQkgICAgICB2b2lkICp0YXJnaW5mbywKLQkgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAotCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0Jc3RydWN0IGlwdF9tYXJrX3RhcmdldF9pbmZvICptYXJraW5mbyA9IHRhcmdpbmZvOwotCi0JaWYgKHRhcmdpbmZvc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfbWFya190YXJnZXRfaW5mbykpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIk1BUks6IHRhcmdpbmZvc2l6ZSAldSAhPSAlWnVcbiIsCi0JCSAgICAgICB0YXJnaW5mb3NpemUsCi0JCSAgICAgICBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfbWFya190YXJnZXRfaW5mbykpKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHN0cmNtcCh0YWJsZW5hbWUsICJtYW5nbGUiKSAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIk1BUks6IGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIFwibWFuZ2xlXCIgdGFibGUsIG5vdCBcIiVzXCJcbiIsIHRhYmxlbmFtZSk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChtYXJraW5mby0+bWFyayA+IDB4ZmZmZmZmZmYpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTUFSSzogT25seSBzdXBwb3J0cyAzMmJpdCB3aWRlIG1hcmtcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotY2hlY2tlbnRyeV92MShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKLQkgICAgICB2b2lkICp0YXJnaW5mbywKLQkgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAotCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0Jc3RydWN0IGlwdF9tYXJrX3RhcmdldF9pbmZvX3YxICptYXJraW5mbyA9IHRhcmdpbmZvOwotCi0JaWYgKHRhcmdpbmZvc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfbWFya190YXJnZXRfaW5mb192MSkpKXsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTUFSSzogdGFyZ2luZm9zaXplICV1ICE9ICVadVxuIiwKLQkJICAgICAgIHRhcmdpbmZvc2l6ZSwKLQkJICAgICAgIElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9tYXJrX3RhcmdldF9pbmZvX3YxKSkpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoc3RyY21wKHRhYmxlbmFtZSwgIm1hbmdsZSIpICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTUFSSzogY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gXCJtYW5nbGVcIiB0YWJsZSwgbm90IFwiJXNcIlxuIiwgdGFibGVuYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKG1hcmtpbmZvLT5tb2RlICE9IElQVF9NQVJLX1NFVAotCSAgICAmJiBtYXJraW5mby0+bW9kZSAhPSBJUFRfTUFSS19BTkQKLQkgICAgJiYgbWFya2luZm8tPm1vZGUgIT0gSVBUX01BUktfT1IpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTUFSSzogdW5rbm93biBtb2RlICV1XG4iLAotCQkgICAgICAgbWFya2luZm8tPm1vZGUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAobWFya2luZm8tPm1hcmsgPiAweGZmZmZmZmZmKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIk1BUks6IE9ubHkgc3VwcG9ydHMgMzJiaXQgd2lkZSBtYXJrXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCBpcHRfbWFya19yZWdfdjAgPSB7Ci0JLm5hbWUJCT0gIk1BUksiLAotCS50YXJnZXQJCT0gdGFyZ2V0X3YwLAotCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeV92MCwKLQkubWUJCT0gVEhJU19NT0RVTEUsCi0JLnJldmlzaW9uCT0gMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCBpcHRfbWFya19yZWdfdjEgPSB7Ci0JLm5hbWUJCT0gIk1BUksiLAotCS50YXJnZXQJCT0gdGFyZ2V0X3YxLAotCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeV92MSwKLQkubWUJCT0gVEhJU19NT0RVTEUsCi0JLnJldmlzaW9uCT0gMSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gaXB0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X21hcmtfcmVnX3YwKTsKLQlpZiAoIWVycikgewotCQllcnIgPSBpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfbWFya19yZWdfdjEpOwotCQlpZiAoZXJyKQotCQkJaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfbWFya19yZWdfdjApOwotCX0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X21hcmtfcmVnX3YwKTsKLQlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9tYXJrX3JlZ192MSk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X01BU1FVRVJBREUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jCmluZGV4IDI3ODYwNTEuLjEyYzU2ZDMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jCkBAIC00MCw3ICs0MCw3IEBACiAvKiBGSVhNRTogTXVsdGlwbGUgdGFyZ2V0cy4gLS1SUiAqLwogc3RhdGljIGludAogbWFzcXVlcmFkZV9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCQkgY29uc3Qgdm9pZCAqZSwKIAkJIHZvaWQgKnRhcmdpbmZvLAogCQkgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKIAkJIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05FVE1BUC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9ORVRNQVAuYwppbmRleCBlNmU3YjYwLi5iMDc0NDY3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05FVE1BUC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTkVUTUFQLmMKQEAgLTMxLDcgKzMxLDcgQEAKIAogc3RhdGljIGludAogY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKyAgICAgIGNvbnN0IHZvaWQgKmUsCiAgICAgICB2b2lkICp0YXJnaW5mbywKICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9ORlFVRVVFLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05GUVVFVUUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NlZGM5Yi4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05GUVVFVUUuYworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qIGlwdGFibGVzIG1vZHVsZSBmb3IgdXNpbmcgbmV3IG5ldGZpbHRlciBuZXRsaW5rIHF1ZXVlCi0gKgotICogKEMpIDIwMDUgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIAotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKiAKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTkZRVUVVRS5oPgotCi1NT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgTkZRVUVVRSB0YXJnZXQiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIHVuc2lnbmVkIGludAotdGFyZ2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKLSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKLSAgICAgICBjb25zdCB2b2lkICp0YXJnaW5mbywKLSAgICAgICB2b2lkICp1c2VyaW5mbykKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X05GUV9pbmZvICp0aW5mbyA9IHRhcmdpbmZvOwotCi0JcmV0dXJuIE5GX1FVRVVFX05SKHRpbmZvLT5xdWV1ZW51bSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCi0gICAgICAgICAgIHZvaWQgKnRhcmdpbmZvLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWlmICh0YXJnaW5mb3NpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X05GUV9pbmZvKSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZRVUVVRTogdGFyZ2luZm9zaXplICV1ICE9ICVadVxuIiwKLQkJICAgICAgIHRhcmdpbmZvc2l6ZSwKLQkJICAgICAgIElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9ORlFfaW5mbykpKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCBpcHRfTkZRX3JlZyA9IHsKLQkubmFtZQkJPSAiTkZRVUVVRSIsCi0JLnRhcmdldAkJPSB0YXJnZXQsCi0JLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LAotCS5tZQkJPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X05GUV9yZWcpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X05GUV9yZWcpOwotfQotCi1tb2R1bGVfaW5pdChpbml0KTsKLW1vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9OT1RSQUNLLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05PVFJBQ0suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjNjlkMC4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05PVFJBQ0suYworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qIFRoaXMgaXMgYSBtb2R1bGUgd2hpY2ggaXMgdXNlZCBmb3Igc2V0dGluZyB1cCBmYWtlIGNvbm50cmFja3MKLSAqIG9uIHBhY2tldHMgc28gdGhhdCB0aGV5IGFyZSBub3Qgc2VlbiBieSB0aGUgY29ubnRyYWNrL05BVCBjb2RlLgotICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaD4KLQotc3RhdGljIHVuc2lnbmVkIGludAotdGFyZ2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKLSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKLSAgICAgICBjb25zdCB2b2lkICp0YXJnaW5mbywKLSAgICAgICB2b2lkICp1c2VyaW5mbykKLXsKLQkvKiBQcmV2aW91c2x5IHNlZW4gKGxvb3BiYWNrKT8gSWdub3JlLiAqLwotCWlmICgoKnBza2IpLT5uZmN0ICE9IE5VTEwpCi0JCXJldHVybiBJUFRfQ09OVElOVUU7Ci0KLQkvKiBBdHRhY2ggZmFrZSBjb25udHJhY2sgZW50cnkuIAotCSAgIElmIHRoZXJlIGlzIGEgcmVhbCBjdCBlbnRyeSBjb3JyZXNwb25kaWcgdG8gdGhpcyBwYWNrZXQsIAotCSAgIGl0J2xsIGhhbmcgYXJvdW4gdGlsbCB0aW1pbmcgb3V0LiBXZSBkb24ndCBkZWFsIHdpdGggaXQKLQkgICBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gSksgKi8KLQluZl9jdF91bnRyYWNrKCpwc2tiKTsKLQkoKnBza2IpLT5uZmN0aW5mbyA9IElQX0NUX05FVzsKLQluZl9jb25udHJhY2tfZ2V0KCgqcHNrYiktPm5mY3QpOwotCi0JcmV0dXJuIElQVF9DT05USU5VRTsKLX0KLQotc3RhdGljIGludAotY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKLSAgICAgICAgICAgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0JaWYgKHRhcmdpbmZvc2l6ZSAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIk5PVFJBQ0s6IHRhcmdpbmZvc2l6ZSAldSAhPSAwXG4iLAotCQkgICAgICAgdGFyZ2luZm9zaXplKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHN0cmNtcCh0YWJsZW5hbWUsICJyYXciKSAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIk5PVFJBQ0s6IGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIFwicmF3XCIgdGFibGUsIG5vdCBcIiVzXCJcbiIsIHRhYmxlbmFtZSk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X25vdHJhY2tfcmVnID0geyAKLQkubmFtZSA9ICJOT1RSQUNLIiwgCi0JLnRhcmdldCA9IHRhcmdldCwgCi0JLmNoZWNrZW50cnkgPSBjaGVja2VudHJ5LAotCS5tZSA9IFRISVNfTU9EVUxFIAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQotewotCWlmIChpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfbm90cmFja19yZWcpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X25vdHJhY2tfcmVnKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVESVJFQ1QuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVESVJFQ1QuYwppbmRleCA1MjQ1YmZkLi4xNDBiZTUxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFRElSRUNULmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRURJUkVDVC5jCkBAIC0zMyw3ICszMyw3IEBACiAvKiBGSVhNRTogVGFrZSBtdWx0aXBsZSByYW5nZXMgLS1SUiAqLwogc3RhdGljIGludAogcmVkaXJlY3RfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCSAgICAgICBjb25zdCB2b2lkICplLAogCSAgICAgICB2b2lkICp0YXJnaW5mbywKIAkgICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKIAkgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jCmluZGV4IDY2OTM1MjYuLjNlYjQ3YWEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYwpAQCAtMjgyLDEyICsyODIsMTMgQEAKIH0KIAogc3RhdGljIGludCBjaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCQkgY29uc3Qgdm9pZCAqZV92b2lkLAogCQkgdm9pZCAqdGFyZ2luZm8sCiAJCSB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogCQkgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKICAJY29uc3Qgc3RydWN0IGlwdF9yZWplY3RfaW5mbyAqcmVqaW5mbyA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUgPSBlX3ZvaWQ7CiAKICAJaWYgKHRhcmdpbmZvc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfcmVqZWN0X2luZm8pKSkgewogICAJCURFQlVHUCgiUkVKRUNUOiB0YXJnaW5mb3NpemUgJXUgIT0gMFxuIiwgdGFyZ2luZm9zaXplKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfU0FNRS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9TQU1FLmMKaW5kZXggN2EwNTM2ZC4uYTIyZGU1OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9TQU1FLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9TQU1FLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogc3RhdGljIGludAogc2FtZV9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkgICAgICBjb25zdCB2b2lkICplLAogCSAgICAgIHZvaWQgKnRhcmdpbmZvLAogCSAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAJICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVENQTVNTLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RDUE1TUy5jCmluZGV4IDhkYjcwZDYuLmMxMjI4NDEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVENQTVNTLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UQ1BNU1MuYwpAQCAtMjEwLDEyICsyMTAsMTMgQEAKIC8qIE11c3Qgc3BlY2lmeSAtcCB0Y3AgLS1zeW4vLS10Y3AtZmxhZ3MgU1lOICovCiBzdGF0aWMgaW50CiBpcHRfdGNwbXNzX2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCQkgICAgICBjb25zdCB2b2lkICplX3ZvaWQsCiAJCSAgICAgIHZvaWQgKnRhcmdpbmZvLAogCQkgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogCQkgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewogCWNvbnN0IHN0cnVjdCBpcHRfdGNwbXNzX2luZm8gKnRjcG1zc2luZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplID0gZV92b2lkOwogCiAJaWYgKHRhcmdpbmZvc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfdGNwbXNzX2luZm8pKSkgewogCQlERUJVR1AoImlwdF90Y3Btc3NfY2hlY2tlbnRyeTogdGFyZ2luZm9zaXplICV1ICE9ICV1XG4iLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UT1MuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVE9TLmMKaW5kZXggZGVhZGIzNi4uM2E0NGE1NiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UT1MuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RPUy5jCkBAIC01Miw3ICs1Miw3IEBACiAKIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJICAgY29uc3Qgdm9pZCAqZV92b2lkLAogICAgICAgICAgICB2b2lkICp0YXJnaW5mbywKICAgICAgICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVFRMLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RUTC5jCmluZGV4IGI5YWU2YTkuLmI3NjllYjIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVFRMLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UVEwuYwpAQCAtNjYsNyArNjYsNyBAQAogfQogCiBzdGF0aWMgaW50IGlwdF90dGxfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCWNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJCWNvbnN0IHZvaWQgKmUsCiAJCXZvaWQgKnRhcmdpbmZvLAogCQl1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogCQl1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9VTE9HLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1VMT0cuYwppbmRleCAzODY0MWNkLi42NDFkYmM0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1VMT0cuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1VMT0cuYwpAQCAtMzMwLDcgKzMzMCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgaXB0X3Vsb2dfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkJCSAgICAgICBjb25zdCB2b2lkICplLAogCQkJICAgICAgIHZvaWQgKnRhcmdpbmZvLAogCQkJICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAJCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2ttYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9hZGRydHlwZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9hZGRydHlwZS5jCmluZGV4IGUxOWMyYTUuLmQ2YjgzYTkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfYWRkcnR5cGUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2FkZHJ0eXBlLmMKQEAgLTI5LDcgKzI5LDcgQEAKIAogc3RhdGljIGludCBtYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCiAJCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCB2b2lkICptYXRjaGluZm8sCi0JCSBpbnQgb2Zmc2V0LCBpbnQgKmhvdGRyb3ApCisJCSBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwgaW50ICpob3Rkcm9wKQogewogCWNvbnN0IHN0cnVjdCBpcHRfYWRkcnR5cGVfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKIAljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOwpAQCAtNDMsNyArNDMsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorc3RhdGljIGludCBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqaXAsCiAJCSAgICAgIHZvaWQgKm1hdGNoaW5mbywgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkJICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfYWguYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfYWguYwppbmRleCBhMGZlYTg0Li4xNDRhZGZlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2FoLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9haC5jCkBAIC00MSw2ICs0MSw3IEBACiAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAogICAgICAgaW50ICpob3Rkcm9wKQogewogCXN0cnVjdCBpcF9hdXRoX2hkciBfYWhkciwgKmFoOwpAQCAtNTAsNyArNTEsNyBAQAogCWlmIChvZmZzZXQpCiAJCXJldHVybiAwOwogCi0JYWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsICogNCwKKwlhaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsCiAJCQkJc2l6ZW9mKF9haGRyKSwgJl9haGRyKTsKIAlpZiAoYWggPT0gTlVMTCkgewogCQkvKiBXZSd2ZSBiZWVuIGFza2VkIHRvIGV4YW1pbmUgdGhpcyBwYWNrZXQsIGFuZCB3ZQpAQCAtNjksMTIgKzcwLDEzIEBACiAvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkgICBjb25zdCB2b2lkICppcF92b2lkLAogCSAgIHZvaWQgKm1hdGNoaW5mbywKIAkgICB1bnNpZ25lZCBpbnQgbWF0Y2hpbmZvc2l6ZSwKIAkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewogCWNvbnN0IHN0cnVjdCBpcHRfYWggKmFoaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXB0X2lwICppcCA9IGlwX3ZvaWQ7CiAKIAkvKiBNdXN0IHNwZWNpZnkgcHJvdG8gPT0gQUgsIGFuZCBubyB1bmtub3duIGludmZsYWdzICovCiAJaWYgKGlwLT5wcm90byAhPSBJUFBST1RPX0FIIHx8IChpcC0+aW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKSkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9jb21tZW50LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2NvbW1lbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3NmExZS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2NvbW1lbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBJbXBsZW1lbnRzIGEgZHVtbXkgbWF0Y2ggdG8gYWxsb3cgYXR0YWNoaW5nIGNvbW1lbnRzIHRvIHJ1bGVzCi0gKgotICogMjAwMy0wNS0xMyBCcmFkIEZpc2hlciAoYnJhZEBpbmZvLWxpbmsubmV0KQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29tbWVudC5oPgotCi1NT0RVTEVfQVVUSE9SKCJCcmFkIEZpc2hlciA8YnJhZEBpbmZvLWxpbmsubmV0PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBjb21tZW50IG1hdGNoIG1vZHVsZSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgaW50Ci1tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLSAgICAgIGludCBvZmZzZXQsCi0gICAgICBpbnQgKmhvdGRyb3ApCi17Ci0JLyogV2UgYWx3YXlzIG1hdGNoICovCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKLSAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCS8qIENoZWNrIHRoZSBzaXplICovCi0JaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfY29tbWVudF9pbmZvKSkpCi0JCXJldHVybiAwOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBjb21tZW50X21hdGNoID0gewotCS5uYW1lCQk9ICJjb21tZW50IiwKLQkubWF0Y2gJCT0gbWF0Y2gsCi0JLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LAotCS5tZQkJPSBUSElTX01PRFVMRQotfTsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQotewotCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJmNvbW1lbnRfbWF0Y2gpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZjb21tZW50X21hdGNoKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfY29ubmJ5dGVzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Nvbm5ieXRlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjhhMDQ4Li4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfY29ubmJ5dGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBjb25uZWN0aW9uIHRyYWNraW5nIGJ5dGUgY291bnRlci4KLSAqIEdQTCAoQykgMjAwMiBNYXJ0aW4gRGV2ZXJhIChkZXZpa0BjZGkuY3opLgotICoKLSAqIDIwMDQtMDctMjAgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Ci0gKiAJLSByZWltcGxlbWVudGVkIHRvIHVzZSBwZXItY29ubmVjdGlvbiBhY2NvdW50aW5nIGNvdW50ZXJzCi0gKiAJLSBhZGQgZnVuY3Rpb25hbGl0eSB0byBtYXRjaCBudW1iZXIgb2YgcGFja2V0cwotICogCS0gYWRkIGZ1bmN0aW9uYWxpdHkgdG8gbWF0Y2ggYXZlcmFnZSBwYWNrZXQgc2l6ZQotICogCS0gYWRkIHN1cHBvcnQgdG8gbWF0Y2ggZGlyZWN0aW9ucyBzZXBlcmF0ZWx5Ci0gKgotICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tcGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2Nvbm5ieXRlcy5oPgotCi0jaW5jbHVkZSA8YXNtL2RpdjY0Lmg+Ci0jaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgbWF0Y2ggZm9yIG1hdGNoaW5nIG51bWJlciBvZiBwa3RzL2J5dGVzIHBlciBjb25uZWN0aW9uIik7Ci0KLS8qIDY0Yml0IGRpdmlzb3IsIGRpdmlkZW5kIGFuZCByZXN1bHQuIGR5bmFtaWMgcHJlY2lzaW9uICovCi1zdGF0aWMgdV9pbnQ2NF90IGRpdjY0XzY0KHVfaW50NjRfdCBkaXZpZGVuZCwgdV9pbnQ2NF90IGRpdmlzb3IpCi17Ci0JdV9pbnQzMl90IGQgPSBkaXZpc29yOwotCi0JaWYgKGRpdmlzb3IgPiAweGZmZmZmZmZmVUxMKSB7Ci0JCXVuc2lnbmVkIGludCBzaGlmdCA9IGZscyhkaXZpc29yID4+IDMyKTsKLQotCQlkID0gZGl2aXNvciA+PiBzaGlmdDsKLQkJZGl2aWRlbmQgPj49IHNoaWZ0OwotCX0KLQotCWRvX2RpdihkaXZpZGVuZCwgZCk7Ci0JcmV0dXJuIGRpdmlkZW5kOwotfQotCi1zdGF0aWMgaW50Ci1tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLSAgICAgIGludCBvZmZzZXQsCi0gICAgICBpbnQgKmhvdGRyb3ApCi17Ci0JY29uc3Qgc3RydWN0IGlwdF9jb25uYnl0ZXNfaW5mbyAqc2luZm8gPSBtYXRjaGluZm87Ci0JdV9pbnQ2NF90IHdoYXQgPSAwOwkvKiBpbml0aWFsaXplIHRvIG1ha2UgZ2NjIGhhcHB5ICovCi0JY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja19jb3VudGVyICpjb3VudGVyczsKLQotCWlmICghKGNvdW50ZXJzID0gbmZfY3RfZ2V0X2NvdW50ZXJzKHNrYikpKQotCQlyZXR1cm4gMDsgLyogbm8gbWF0Y2ggKi8KLQotCXN3aXRjaCAoc2luZm8tPndoYXQpIHsKLQljYXNlIElQVF9DT05OQllURVNfUEtUUzoKLQkJc3dpdGNoIChzaW5mby0+ZGlyZWN0aW9uKSB7Ci0JCWNhc2UgSVBUX0NPTk5CWVRFU19ESVJfT1JJR0lOQUw6Ci0JCQl3aGF0ID0gY291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXS5wYWNrZXRzOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBUX0NPTk5CWVRFU19ESVJfUkVQTFk6Ci0JCQl3aGF0ID0gY291bnRlcnNbSVBfQ1RfRElSX1JFUExZXS5wYWNrZXRzOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBUX0NPTk5CWVRFU19ESVJfQk9USDoKLQkJCXdoYXQgPSBjb3VudGVyc1tJUF9DVF9ESVJfT1JJR0lOQUxdLnBhY2tldHM7Ci0JCQl3aGF0ICs9IGNvdW50ZXJzW0lQX0NUX0RJUl9SRVBMWV0ucGFja2V0czsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgSVBUX0NPTk5CWVRFU19CWVRFUzoKLQkJc3dpdGNoIChzaW5mby0+ZGlyZWN0aW9uKSB7Ci0JCWNhc2UgSVBUX0NPTk5CWVRFU19ESVJfT1JJR0lOQUw6Ci0JCQl3aGF0ID0gY291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXS5ieXRlczsKLQkJCWJyZWFrOwotCQljYXNlIElQVF9DT05OQllURVNfRElSX1JFUExZOgotCQkJd2hhdCA9IGNvdW50ZXJzW0lQX0NUX0RJUl9SRVBMWV0uYnl0ZXM7Ci0JCQlicmVhazsKLQkJY2FzZSBJUFRfQ09OTkJZVEVTX0RJUl9CT1RIOgotCQkJd2hhdCA9IGNvdW50ZXJzW0lQX0NUX0RJUl9PUklHSU5BTF0uYnl0ZXM7Ci0JCQl3aGF0ICs9IGNvdW50ZXJzW0lQX0NUX0RJUl9SRVBMWV0uYnl0ZXM7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQljYXNlIElQVF9DT05OQllURVNfQVZHUEtUOgotCQlzd2l0Y2ggKHNpbmZvLT5kaXJlY3Rpb24pIHsKLQkJY2FzZSBJUFRfQ09OTkJZVEVTX0RJUl9PUklHSU5BTDoKLQkJCXdoYXQgPSBkaXY2NF82NChjb3VudGVyc1tJUF9DVF9ESVJfT1JJR0lOQUxdLmJ5dGVzLAotCQkJCQljb3VudGVyc1tJUF9DVF9ESVJfT1JJR0lOQUxdLnBhY2tldHMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBUX0NPTk5CWVRFU19ESVJfUkVQTFk6Ci0JCQl3aGF0ID0gZGl2NjRfNjQoY291bnRlcnNbSVBfQ1RfRElSX1JFUExZXS5ieXRlcywKLQkJCQkJY291bnRlcnNbSVBfQ1RfRElSX1JFUExZXS5wYWNrZXRzKTsKLQkJCWJyZWFrOwotCQljYXNlIElQVF9DT05OQllURVNfRElSX0JPVEg6Ci0JCQl7Ci0JCQkJdV9pbnQ2NF90IGJ5dGVzOwotCQkJCXVfaW50NjRfdCBwa3RzOwotCQkJCWJ5dGVzID0gY291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXS5ieXRlcyArCi0JCQkJCWNvdW50ZXJzW0lQX0NUX0RJUl9SRVBMWV0uYnl0ZXM7Ci0JCQkJcGt0cyA9IGNvdW50ZXJzW0lQX0NUX0RJUl9PUklHSU5BTF0ucGFja2V0cysKLQkJCQkJY291bnRlcnNbSVBfQ1RfRElSX1JFUExZXS5wYWNrZXRzOwotCi0JCQkJLyogRklYTUVfVEhFT1JFVElDQUw6IHdoYXQgdG8gZG8gaWYgc3VtCi0JCQkJICogb3ZlcmZsb3dzID8gKi8KLQotCQkJCXdoYXQgPSBkaXY2NF82NChieXRlcywgcGt0cyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQlpZiAoc2luZm8tPmNvdW50LnRvKQotCQlyZXR1cm4gKHdoYXQgPD0gc2luZm8tPmNvdW50LnRvICYmIHdoYXQgPj0gc2luZm8tPmNvdW50LmZyb20pOwotCWVsc2UKLQkJcmV0dXJuICh3aGF0ID49IHNpbmZvLT5jb3VudC5mcm9tKTsKLX0KLQotc3RhdGljIGludCBjaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKLQkJIHZvaWQgKm1hdGNoaW5mbywKLQkJIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0JCSB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWNvbnN0IHN0cnVjdCBpcHRfY29ubmJ5dGVzX2luZm8gKnNpbmZvID0gbWF0Y2hpbmZvOwotCi0JaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfY29ubmJ5dGVzX2luZm8pKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoc2luZm8tPndoYXQgIT0gSVBUX0NPTk5CWVRFU19QS1RTICYmCi0JICAgIHNpbmZvLT53aGF0ICE9IElQVF9DT05OQllURVNfQllURVMgJiYKLQkgICAgc2luZm8tPndoYXQgIT0gSVBUX0NPTk5CWVRFU19BVkdQS1QpCi0JCXJldHVybiAwOwotCi0JaWYgKHNpbmZvLT5kaXJlY3Rpb24gIT0gSVBUX0NPTk5CWVRFU19ESVJfT1JJR0lOQUwgJiYKLQkgICAgc2luZm8tPmRpcmVjdGlvbiAhPSBJUFRfQ09OTkJZVEVTX0RJUl9SRVBMWSAmJgotCSAgICBzaW5mby0+ZGlyZWN0aW9uICE9IElQVF9DT05OQllURVNfRElSX0JPVEgpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIHN0YXRlX21hdGNoID0gewotCS5uYW1lCQk9ICJjb25uYnl0ZXMiLAotCS5tYXRjaAkJPSAmbWF0Y2gsCi0JLmNoZWNrZW50cnkJPSAmY2hlY2ssCi0JLm1lCQk9IFRISVNfTU9EVUxFCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmc3RhdGVfbWF0Y2gpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZzdGF0ZV9tYXRjaCk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Nvbm5tYXJrLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Nvbm5tYXJrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMDZlZjIuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9jb25ubWFyay5jCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyogVGhpcyBrZXJuZWwgbW9kdWxlIG1hdGNoZXMgY29ubmVjdGlvbiBtYXJrIHZhbHVlcyBzZXQgYnkgdGhlCi0gKiBDT05OTUFSSyB0YXJnZXQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwNCBNQVJBIFN5c3RlbXMgQUIgPGh0dHA6Ly93d3cubWFyYXN5c3RlbXMuY29tPgotICogYnkgSGVucmlrIE5vcmRzdHJvbSA8aG5vQG1hcmFzeXN0ZW1zLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotCi1NT0RVTEVfQVVUSE9SKCJIZW5yaWsgTm9yZHN0cm9tIDxobm9AbWFyYXN5dGVtcy5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIklQIHRhYmxlcyBjb25ubWFyayBtYXRjaCBtb2R1bGUiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25ubWFyay5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbXBhdC5oPgotCi1zdGF0aWMgaW50Ci1tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLSAgICAgIGludCBvZmZzZXQsCi0gICAgICBpbnQgKmhvdGRyb3ApCi17Ci0JY29uc3Qgc3RydWN0IGlwdF9jb25ubWFya19pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCXVfaW50MzJfdCBjdGluZm87Ci0JY29uc3QgdV9pbnQzMl90ICpjdG1hcmsgPSBuZl9jdF9nZXRfbWFyayhza2IsICZjdGluZm8pOwotCWlmICghY3RtYXJrKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAoKCgqY3RtYXJrKSAmIGluZm8tPm1hc2spID09IGluZm8tPm1hcmspIF4gaW5mby0+aW52ZXJ0OwotfQotCi1zdGF0aWMgaW50Ci1jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKLQkgICB2b2lkICptYXRjaGluZm8sCi0JICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKLQkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCXN0cnVjdCBpcHRfY29ubm1hcmtfaW5mbyAqY20gPSAKLQkJCQkoc3RydWN0IGlwdF9jb25ubWFya19pbmZvICopbWF0Y2hpbmZvOwotCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2Nvbm5tYXJrX2luZm8pKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoY20tPm1hcmsgPiAweGZmZmZmZmZmIHx8IGNtLT5tYXNrID4gMHhmZmZmZmZmZikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJjb25ubWFyazogb25seSBzdXBwb3J0IDMyYml0IG1hcmtcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggY29ubm1hcmtfbWF0Y2ggPSB7Ci0JLm5hbWUgPSAiY29ubm1hcmsiLAotCS5tYXRjaCA9ICZtYXRjaCwKLQkuY2hlY2tlbnRyeSA9ICZjaGVja2VudHJ5LAotCS5tZSA9IFRISVNfTU9EVUxFCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmY29ubm1hcmtfbWF0Y2gpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZjb25ubWFya19tYXRjaCk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Nvbm50cmFjay5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9jb25udHJhY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkMTg3MC4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Nvbm50cmFjay5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggY29ubmVjdGlvbiB0cmFja2luZyBpbmZvcm1hdGlvbi4KLSAqIFN1cGVyc2V0IG9mIFJ1c3R5J3MgbWluaW1hbGlzdGljIHN0YXRlIG1hdGNoLgotICoKLSAqIChDKSAyMDAxICBNYXJjIEJvdWNoZXIgKG1hcmNAbWJzaS5jYSkuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19NT0RVTEUpCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3R1cGxlLmg+Ci0jZWxzZQotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25udHJhY2suaD4KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIGNvbm5lY3Rpb24gdHJhY2tpbmcgbWF0Y2ggbW9kdWxlIik7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19NT0RVTEUpCi0KLXN0YXRpYyBpbnQKLW1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgaW50IG9mZnNldCwKLSAgICAgIGludCAqaG90ZHJvcCkKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X2Nvbm50cmFja19pbmZvICpzaW5mbyA9IG1hdGNoaW5mbzsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKLQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLQl1bnNpZ25lZCBpbnQgc3RhdGViaXQ7Ci0KLQljdCA9IGlwX2Nvbm50cmFja19nZXQoKHN0cnVjdCBza19idWZmICopc2tiLCAmY3RpbmZvKTsKLQotI2RlZmluZSBGV0lOVihib29sLGludmZsZykgKChib29sKSBeICEhKHNpbmZvLT5pbnZmbGFncyAmIGludmZsZykpCi0KLQlpZiAoY3QgPT0gJmlwX2Nvbm50cmFja191bnRyYWNrZWQpCi0JCXN0YXRlYml0ID0gSVBUX0NPTk5UUkFDS19TVEFURV9VTlRSQUNLRUQ7Ci0JZWxzZSBpZiAoY3QpCi0gCQlzdGF0ZWJpdCA9IElQVF9DT05OVFJBQ0tfU1RBVEVfQklUKGN0aW5mbyk7Ci0gCWVsc2UKLSAJCXN0YXRlYml0ID0gSVBUX0NPTk5UUkFDS19TVEFURV9JTlZBTElEOwotIAotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfU1RBVEUpIHsKLQkJaWYgKGN0KSB7Ci0JCQlpZihjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmlwICE9Ci0JCQkgICAgY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC5pcCkKLQkJCQlzdGF0ZWJpdCB8PSBJUFRfQ09OTlRSQUNLX1NUQVRFX1NOQVQ7Ci0KLQkJCWlmKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QuaXAgIT0KLQkJCSAgICBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLmlwKQotCQkJCXN0YXRlYml0IHw9IElQVF9DT05OVFJBQ0tfU1RBVEVfRE5BVDsKLQkJfQotCi0JCWlmIChGV0lOVigoc3RhdGViaXQgJiBzaW5mby0+c3RhdGVtYXNrKSA9PSAwLCBJUFRfQ09OTlRSQUNLX1NUQVRFKSkKLQkJCXJldHVybiAwOwotCX0KLQotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfUFJPVE8pIHsKLQkJaWYgKCFjdCB8fCBGV0lOVihjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnByb3RvbnVtICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLmRzdC5wcm90b251bSwgSVBUX0NPTk5UUkFDS19QUk9UTykpCi0gICAgICAgICAgICAgICAgCXJldHVybiAwOwotCX0KLQotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfT1JJR1NSQykgewotCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmlwJnNpbmZvLT5zaXBtc2tbSVBfQ1RfRElSX09SSUdJTkFMXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLnNyYy5pcCwgSVBUX0NPTk5UUkFDS19PUklHU1JDKSkKLQkJCXJldHVybiAwOwotCX0KLQotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfT1JJR0RTVCkgewotCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LmlwJnNpbmZvLT5kaXBtc2tbSVBfQ1RfRElSX09SSUdJTkFMXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLmRzdC5pcCwgSVBUX0NPTk5UUkFDS19PUklHRFNUKSkKLQkJCXJldHVybiAwOwotCX0KLQotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfUkVQTFNSQykgewotCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLmlwJnNpbmZvLT5zaXBtc2tbSVBfQ1RfRElSX1JFUExZXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfUkVQTFldLnNyYy5pcCwgSVBUX0NPTk5UUkFDS19SRVBMU1JDKSkKLQkJCXJldHVybiAwOwotCX0KLQotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfUkVQTERTVCkgewotCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LmlwJnNpbmZvLT5kaXBtc2tbSVBfQ1RfRElSX1JFUExZXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfUkVQTFldLmRzdC5pcCwgSVBUX0NPTk5UUkFDS19SRVBMRFNUKSkKLQkJCXJldHVybiAwOwotCX0KLQotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfU1RBVFVTKSB7Ci0JCWlmICghY3QgfHwgRldJTlYoKGN0LT5zdGF0dXMgJiBzaW5mby0+c3RhdHVzbWFzaykgPT0gMCwgSVBUX0NPTk5UUkFDS19TVEFUVVMpKQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYoc2luZm8tPmZsYWdzICYgSVBUX0NPTk5UUkFDS19FWFBJUkVTKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZXhwaXJlczsKLQotCQlpZighY3QpCi0JCQlyZXR1cm4gMDsKLQotCQlleHBpcmVzID0gdGltZXJfcGVuZGluZygmY3QtPnRpbWVvdXQpID8gKGN0LT50aW1lb3V0LmV4cGlyZXMgLSBqaWZmaWVzKS9IWiA6IDA7Ci0KLQkJaWYgKEZXSU5WKCEoZXhwaXJlcyA+PSBzaW5mby0+ZXhwaXJlc19taW4gJiYgZXhwaXJlcyA8PSBzaW5mby0+ZXhwaXJlc19tYXgpLCBJUFRfQ09OTlRSQUNLX0VYUElSRVMpKQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLSNlbHNlIC8qIENPTkZJR19JUF9ORl9DT05OVFJBQ0sgKi8KLXN0YXRpYyBpbnQKLW1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgaW50IG9mZnNldCwKLSAgICAgIGludCAqaG90ZHJvcCkKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X2Nvbm50cmFja19pbmZvICpzaW5mbyA9IG1hdGNoaW5mbzsKLQlzdHJ1Y3QgbmZfY29ubiAqY3Q7Ci0JZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87Ci0JdW5zaWduZWQgaW50IHN0YXRlYml0OwotCi0JY3QgPSBuZl9jdF9nZXQoKHN0cnVjdCBza19idWZmICopc2tiLCAmY3RpbmZvKTsKLQotI2RlZmluZSBGV0lOVihib29sLGludmZsZykgKChib29sKSBeICEhKHNpbmZvLT5pbnZmbGFncyAmIGludmZsZykpCi0KLQlpZiAoY3QgPT0gJm5mX2Nvbm50cmFja191bnRyYWNrZWQpCi0JCXN0YXRlYml0ID0gSVBUX0NPTk5UUkFDS19TVEFURV9VTlRSQUNLRUQ7Ci0JZWxzZSBpZiAoY3QpCi0gCQlzdGF0ZWJpdCA9IElQVF9DT05OVFJBQ0tfU1RBVEVfQklUKGN0aW5mbyk7Ci0gCWVsc2UKLSAJCXN0YXRlYml0ID0gSVBUX0NPTk5UUkFDS19TVEFURV9JTlZBTElEOwotIAotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfU1RBVEUpIHsKLQkJaWYgKGN0KSB7Ci0JCQlpZihjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLnUzLmlwICE9Ci0JCQkgICAgY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC51My5pcCkKLQkJCQlzdGF0ZWJpdCB8PSBJUFRfQ09OTlRSQUNLX1NUQVRFX1NOQVQ7Ci0KLQkJCWlmKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QudTMuaXAgIT0KLQkJCSAgICBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLnUzLmlwKQotCQkJCXN0YXRlYml0IHw9IElQVF9DT05OVFJBQ0tfU1RBVEVfRE5BVDsKLQkJfQotCi0JCWlmIChGV0lOVigoc3RhdGViaXQgJiBzaW5mby0+c3RhdGVtYXNrKSA9PSAwLCBJUFRfQ09OTlRSQUNLX1NUQVRFKSkKLQkJCXJldHVybiAwOwotCX0KLQotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfUFJPVE8pIHsKLQkJaWYgKCFjdCB8fCBGV0lOVihjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnByb3RvbnVtICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLmRzdC5wcm90b251bSwgSVBUX0NPTk5UUkFDS19QUk9UTykpCi0gICAgICAgICAgICAgICAgCXJldHVybiAwOwotCX0KLQotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfT1JJR1NSQykgewotCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLnUzLmlwJnNpbmZvLT5zaXBtc2tbSVBfQ1RfRElSX09SSUdJTkFMXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLnNyYy5pcCwgSVBUX0NPTk5UUkFDS19PUklHU1JDKSkKLQkJCXJldHVybiAwOwotCX0KLQotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfT1JJR0RTVCkgewotCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnUzLmlwJnNpbmZvLT5kaXBtc2tbSVBfQ1RfRElSX09SSUdJTkFMXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLmRzdC5pcCwgSVBUX0NPTk5UUkFDS19PUklHRFNUKSkKLQkJCXJldHVybiAwOwotCX0KLQotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfUkVQTFNSQykgewotCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLnUzLmlwJnNpbmZvLT5zaXBtc2tbSVBfQ1RfRElSX1JFUExZXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfUkVQTFldLnNyYy5pcCwgSVBUX0NPTk5UUkFDS19SRVBMU1JDKSkKLQkJCXJldHVybiAwOwotCX0KLQotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfUkVQTERTVCkgewotCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LnUzLmlwJnNpbmZvLT5kaXBtc2tbSVBfQ1RfRElSX1JFUExZXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfUkVQTFldLmRzdC5pcCwgSVBUX0NPTk5UUkFDS19SRVBMRFNUKSkKLQkJCXJldHVybiAwOwotCX0KLQotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfU1RBVFVTKSB7Ci0JCWlmICghY3QgfHwgRldJTlYoKGN0LT5zdGF0dXMgJiBzaW5mby0+c3RhdHVzbWFzaykgPT0gMCwgSVBUX0NPTk5UUkFDS19TVEFUVVMpKQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYoc2luZm8tPmZsYWdzICYgSVBUX0NPTk5UUkFDS19FWFBJUkVTKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZXhwaXJlczsKLQotCQlpZighY3QpCi0JCQlyZXR1cm4gMDsKLQotCQlleHBpcmVzID0gdGltZXJfcGVuZGluZygmY3QtPnRpbWVvdXQpID8gKGN0LT50aW1lb3V0LmV4cGlyZXMgLSBqaWZmaWVzKS9IWiA6IDA7Ci0KLQkJaWYgKEZXSU5WKCEoZXhwaXJlcyA+PSBzaW5mby0+ZXhwaXJlc19taW4gJiYgZXhwaXJlcyA8PSBzaW5mby0+ZXhwaXJlc19tYXgpLCBJUFRfQ09OTlRSQUNLX0VYUElSRVMpKQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfTkZfSVBfQ09OTlRSQUNLICovCi0KLXN0YXRpYyBpbnQgY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCi0JCSB2b2lkICptYXRjaGluZm8sCi0JCSB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAotCQkgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLQlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9jb25udHJhY2tfaW5mbykpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBjb25udHJhY2tfbWF0Y2ggPSB7Ci0JLm5hbWUJCT0gImNvbm50cmFjayIsCi0JLm1hdGNoCQk9ICZtYXRjaCwKLQkuY2hlY2tlbnRyeQk9ICZjaGVjaywKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JbmVlZF9pcF9jb25udHJhY2soKTsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZjb25udHJhY2tfbWF0Y2gpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZjb25udHJhY2tfbWF0Y2gpOwotfQotCi1tb2R1bGVfaW5pdChpbml0KTsKLW1vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9kY2NwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2RjY3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzMjc4Yi4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2RjY3AuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKgotICogaXB0YWJsZXMgbW9kdWxlIGZvciBEQ0NQIHByb3RvY29sIGhlYWRlciBtYXRjaGluZwotICoKLSAqIChDKSAyMDA1IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bmV0L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvZGNjcC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2RjY3AuaD4KLQotI2RlZmluZSBEQ0NIRUNLKGNvbmQsIG9wdGlvbiwgZmxhZywgaW52ZmxhZykgKCEoKGZsYWcpICYgKG9wdGlvbikpIFwKLQkJICAgICAgICAgICAgICAgICAgfHwgKCEhKChpbnZmbGFnKSAmIChvcHRpb24pKSBeIChjb25kKSkpCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICpkY2NwX29wdGJ1ZjsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZGNjcF9idWZsb2NrKTsKLQotc3RhdGljIGlubGluZSBpbnQKLWRjY3BfZmluZF9vcHRpb24odV9pbnQ4X3Qgb3B0aW9uLAotCQkgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJIGNvbnN0IHN0cnVjdCBkY2NwX2hkciAqZGgsCi0JCSBpbnQgKmhvdGRyb3ApCi17Ci0JLyogdGNwLmRvZmYgaXMgb25seSA0IGJpdHMsIGllLiBtYXggMTUgKiA0IGJ5dGVzICovCi0JdW5zaWduZWQgY2hhciAqb3A7Ci0JdW5zaWduZWQgaW50IG9wdG9mZiA9IF9fZGNjcF9oZHJfbGVuKGRoKTsKLQl1bnNpZ25lZCBpbnQgb3B0bGVuID0gZGgtPmRjY3BoX2RvZmYqNCAtIF9fZGNjcF9oZHJfbGVuKGRoKTsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWlmIChkaC0+ZGNjcGhfZG9mZiAqIDQgPCBfX2RjY3BfaGRyX2xlbihkaCkpIHsKLQkJKmhvdGRyb3AgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoIW9wdGxlbikKLQkJcmV0dXJuIDA7Ci0KLQlzcGluX2xvY2tfYmgoJmRjY3BfYnVmbG9jayk7Ci0Jb3AgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLAotCQkJCXNrYi0+bmguaXBoLT5paGwqNCArIG9wdG9mZiwKLQkJCQlvcHRsZW4sIGRjY3Bfb3B0YnVmKTsKLQlpZiAob3AgPT0gTlVMTCkgewotCQkvKiBJZiB3ZSBkb24ndCBoYXZlIHRoZSB3aG9sZSBoZWFkZXIsIGRyb3AgcGFja2V0LiAqLwotCQlzcGluX3VubG9ja19iaCgmZGNjcF9idWZsb2NrKTsKLQkJKmhvdGRyb3AgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgb3B0bGVuOyApIHsKLQkJaWYgKG9wW2ldID09IG9wdGlvbikgewotCQkJc3Bpbl91bmxvY2tfYmgoJmRjY3BfYnVmbG9jayk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCi0JCWlmIChvcFtpXSA8IDIpIAotCQkJaSsrOwotCQllbHNlIAotCQkJaSArPSBvcFtpKzFdPzoxOwotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZkY2NwX2J1ZmxvY2spOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgaW50Ci1tYXRjaF90eXBlcyhjb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoLCB1X2ludDE2X3QgdHlwZW1hc2spCi17Ci0JcmV0dXJuICh0eXBlbWFzayAmICgxIDw8IGRoLT5kY2NwaF90eXBlKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1tYXRjaF9vcHRpb24odV9pbnQ4X3Qgb3B0aW9uLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgICAgY29uc3Qgc3RydWN0IGRjY3BfaGRyICpkaCwgaW50ICpob3Rkcm9wKQotewotCXJldHVybiBkY2NwX2ZpbmRfb3B0aW9uKG9wdGlvbiwgc2tiLCBkaCwgaG90ZHJvcCk7Ci19Ci0KLXN0YXRpYyBpbnQKLW1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgaW50IG9mZnNldCwKLSAgICAgIGludCAqaG90ZHJvcCkKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X2RjY3BfaW5mbyAqaW5mbyA9IAotCQkJCShjb25zdCBzdHJ1Y3QgaXB0X2RjY3BfaW5mbyAqKW1hdGNoaW5mbzsKLQlzdHJ1Y3QgZGNjcF9oZHIgX2RoLCAqZGg7Ci0KLQlpZiAob2Zmc2V0KQotCQlyZXR1cm4gMDsKLQkKLQlkaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwqNCwgc2l6ZW9mKF9kaCksICZfZGgpOwotCWlmIChkaCA9PSBOVUxMKSB7Ci0JCSpob3Rkcm9wID0gMTsKLQkJcmV0dXJuIDA7Ci0gICAgICAgCX0KLQotCXJldHVybiAgRENDSEVDSygoKG50b2hzKGRoLT5kY2NwaF9zcG9ydCkgPj0gaW5mby0+c3B0c1swXSkgCi0JCQkmJiAobnRvaHMoZGgtPmRjY3BoX3Nwb3J0KSA8PSBpbmZvLT5zcHRzWzFdKSksIAotCQkgICAJSVBUX0RDQ1BfU1JDX1BPUlRTLCBpbmZvLT5mbGFncywgaW5mby0+aW52ZmxhZ3MpCi0JCSYmIERDQ0hFQ0soKChudG9ocyhkaC0+ZGNjcGhfZHBvcnQpID49IGluZm8tPmRwdHNbMF0pIAotCQkJJiYgKG50b2hzKGRoLT5kY2NwaF9kcG9ydCkgPD0gaW5mby0+ZHB0c1sxXSkpLCAKLQkJCUlQVF9EQ0NQX0RFU1RfUE9SVFMsIGluZm8tPmZsYWdzLCBpbmZvLT5pbnZmbGFncykKLQkJJiYgRENDSEVDSyhtYXRjaF90eXBlcyhkaCwgaW5mby0+dHlwZW1hc2spLAotCQkJICAgSVBUX0RDQ1BfVFlQRSwgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKQotCQkmJiBEQ0NIRUNLKG1hdGNoX29wdGlvbihpbmZvLT5vcHRpb24sIHNrYiwgZGgsIGhvdGRyb3ApLAotCQkJICAgSVBUX0RDQ1BfT1BUSU9OLCBpbmZvLT5mbGFncywgaW5mby0+aW52ZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50Ci1jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKLQkgICB2b2lkICptYXRjaGluZm8sCi0JICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKLQkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWNvbnN0IHN0cnVjdCBpcHRfZGNjcF9pbmZvICppbmZvOwotCi0JaW5mbyA9IChjb25zdCBzdHJ1Y3QgaXB0X2RjY3BfaW5mbyAqKW1hdGNoaW5mbzsKLQotCXJldHVybiBpcC0+cHJvdG8gPT0gSVBQUk9UT19EQ0NQCi0JCSYmICEoaXAtPmludmZsYWdzICYgSVBUX0lOVl9QUk9UTykKLQkJJiYgbWF0Y2hzaXplID09IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9kY2NwX2luZm8pKQotCQkmJiAhKGluZm8tPmZsYWdzICYgfklQVF9EQ0NQX1ZBTElEX0ZMQUdTKQotCQkmJiAhKGluZm8tPmludmZsYWdzICYgfklQVF9EQ0NQX1ZBTElEX0ZMQUdTKQotCQkmJiAhKGluZm8tPmludmZsYWdzICYgfmluZm8tPmZsYWdzKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggZGNjcF9tYXRjaCA9IAoteyAKLQkubmFtZSAJCT0gImRjY3AiLAotCS5tYXRjaAkJPSAmbWF0Y2gsCi0JLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKLQkubWUgCQk9IFRISVNfTU9EVUxFLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQkvKiBkb2ZmIGlzIDggYml0cywgc28gdGhlIG1heGltdW0gb3B0aW9uIHNpemUgaXMgKDQqMjU2KS4gIERvbid0IHB1dAotCSAqIHRoaXMgaW4gQlNTIHNpbmNlIERhdmVNIGlzIHdvcnJpZWQgYWJvdXQgbG9ja2VkIFRMQidzIGZvciBrZXJuZWwKLQkgKiBCU1MuICovCi0JZGNjcF9vcHRidWYgPSBrbWFsbG9jKDI1NiAqIDQsIEdGUF9LRVJORUwpOwotCWlmICghZGNjcF9vcHRidWYpCi0JCXJldHVybiAtRU5PTUVNOwotCXJldCA9IGlwdF9yZWdpc3Rlcl9tYXRjaCgmZGNjcF9tYXRjaCk7Ci0JaWYgKHJldCkKLQkJa2ZyZWUoZGNjcF9vcHRidWYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKLXsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmZGNjcF9tYXRjaCk7Ci0Ja2ZyZWUoZGNjcF9vcHRidWYpOwotfQotCi1tb2R1bGVfaW5pdChpbml0KTsKLW1vZHVsZV9leGl0KGZpbmkpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTWF0Y2ggZm9yIERDQ1AgcHJvdG9jb2wgcGFja2V0cyIpOwotCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2RzY3AuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZHNjcC5jCmluZGV4IDVkZjUyYTYuLjkyMDYzYjQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZHNjcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZHNjcC5jCkBAIC0yMSw3ICsyMSw3IEBACiAKIHN0YXRpYyBpbnQgbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAogCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotCQkgaW50IG9mZnNldCwgaW50ICpob3Rkcm9wKQorCQkgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsIGludCAqaG90ZHJvcCkKIHsKIAljb25zdCBzdHJ1Y3QgaXB0X2RzY3BfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKIAljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOwpAQCAtMzEsNyArMzEsNyBAQAogCXJldHVybiAoKGlwaC0+dG9zJklQVF9EU0NQX01BU0spID09IHNoX2RzY3ApIF4gaW5mby0+aW52ZXJ0OwogfQogCi1zdGF0aWMgaW50IGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKK3N0YXRpYyBpbnQgY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmlwLAogCQkgICAgICB2b2lkICptYXRjaGluZm8sIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Vjbi5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lY24uYwppbmRleCBiNmY3MTgxLi5lNjhiMGM3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Vjbi5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZWNuLmMKQEAgLTY3LDcgKzY3LDcgQEAKIAogc3RhdGljIGludCBtYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCiAJCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCB2b2lkICptYXRjaGluZm8sCi0JCSBpbnQgb2Zmc2V0LCBpbnQgKmhvdGRyb3ApCisJCSBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwgaW50ICpob3Rkcm9wKQogewogCWNvbnN0IHN0cnVjdCBpcHRfZWNuX2luZm8gKmluZm8gPSBtYXRjaGluZm87CiAKQEAgLTg1LDExICs4NSwxMiBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKK3N0YXRpYyBpbnQgY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmlwX3ZvaWQsCiAJCSAgICAgIHZvaWQgKm1hdGNoaW5mbywgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkJICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKIAljb25zdCBzdHJ1Y3QgaXB0X2Vjbl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwID0gaXBfdm9pZDsKIAogCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2Vjbl9pbmZvKSkpCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lc3AuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZXNwLmMKaW5kZXggZTFkMGRkMy4uOWRlMTkxYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lc3AuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2VzcC5jCkBAIC00Miw2ICs0Miw3IEBACiAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAogICAgICAgaW50ICpob3Rkcm9wKQogewogCXN0cnVjdCBpcF9lc3BfaGRyIF9lc3AsICplaDsKQEAgLTUxLDcgKzUyLDcgQEAKIAlpZiAob2Zmc2V0KQogCQlyZXR1cm4gMDsKIAotCWVoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2tiLT5uaC5pcGgtPmlobCAqIDQsCisJZWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b2ZmLAogCQkJCXNpemVvZihfZXNwKSwgJl9lc3ApOwogCWlmIChlaCA9PSBOVUxMKSB7CiAJCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCkBAIC03MCwxMiArNzEsMTMgQEAKIC8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCSAgIGNvbnN0IHZvaWQgKmlwX3ZvaWQsCiAJICAgdm9pZCAqbWF0Y2hpbmZvLAogCSAgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAogCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7CiAJY29uc3Qgc3RydWN0IGlwdF9lc3AgKmVzcGluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAgPSBpcF92b2lkOwogCiAJLyogTXVzdCBzcGVjaWZ5IHByb3RvID09IEVTUCwgYW5kIG5vIHVua25vd24gaW52ZmxhZ3MgKi8KIAlpZiAoaXAtPnByb3RvICE9IElQUFJPVE9fRVNQIHx8IChpcC0+aW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKSkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9oYXNobGltaXQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaGFzaGxpbWl0LmMKaW5kZXggMmRkMWNjYy4uNGZlNDhjMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9oYXNobGltaXQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2hhc2hsaW1pdC5jCkBAIC00MjksNiArNDI5LDcgQEAKIAkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKIAkJY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAogCQlpbnQgb2Zmc2V0LAorCQl1bnNpZ25lZCBpbnQgcHJvdG9mZiwKIAkJaW50ICpob3Rkcm9wKQogewogCXN0cnVjdCBpcHRfaGFzaGxpbWl0X2luZm8gKnIgPSAKQEAgLTUwNCw3ICs1MDUsNyBAQAogCiBzdGF0aWMgaW50CiBoYXNobGltaXRfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSAgICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisJCSAgICAgY29uc3Qgdm9pZCAqaW5mLAogCQkgICAgIHZvaWQgKm1hdGNoaW5mbywKIAkJICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogCQkgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2hlbHBlci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9oZWxwZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVmNjQ5ZS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2hlbHBlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qIGlwdGFibGVzIG1vZHVsZSB0byBtYXRjaCBvbiByZWxhdGVkIGNvbm5lY3Rpb25zICovCi0vKgotICogKEMpIDIwMDEgTWFydGluIEpvc2Vmc3NvbiA8Z2FuZGFsZkB3bHVnLndlc3Riby5zZT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqICAgMTkgTWFyIDIwMDIgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz46Ci0gKiAgIAkJIC0gUG9ydCB0byBuZXduYXQgaW5mcmFzdHJ1Y3R1cmUKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTU9EVUxFKQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oPgotI2Vsc2UKLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9oZWxwZXIuaD4KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiTWFydGluIEpvc2Vmc3NvbiA8Z2FuZGFsZkBuZXRmaWx0ZXIub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBoZWxwZXIgbWF0Y2ggbW9kdWxlIik7Ci0KLSNpZiAwCi0jZGVmaW5lIERFQlVHUCBwcmludGsKLSNlbHNlCi0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01PRFVMRSkKLXN0YXRpYyBpbnQKLW1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgaW50IG9mZnNldCwKLSAgICAgIGludCAqaG90ZHJvcCkKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X2hlbHBlcl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwotCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCWludCByZXQgPSBpbmZvLT5pbnZlcnQ7Ci0JCi0JY3QgPSBpcF9jb25udHJhY2tfZ2V0KChzdHJ1Y3Qgc2tfYnVmZiAqKXNrYiwgJmN0aW5mbyk7Ci0JaWYgKCFjdCkgewotCQlERUJVR1AoImlwdF9oZWxwZXI6IEVlayEgaW52YWxpZCBjb25udHJhY2s/XG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoIWN0LT5tYXN0ZXIpIHsKLQkJREVCVUdQKCJpcHRfaGVscGVyOiBjb25udHJhY2sgJXAgaGFzIG5vIG1hc3RlclxuIiwgY3QpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJlYWRfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCWlmICghY3QtPm1hc3Rlci0+aGVscGVyKSB7Ci0JCURFQlVHUCgiaXB0X2hlbHBlcjogbWFzdGVyIGN0ICVwIGhhcyBubyBoZWxwZXJcbiIsIAotCQkJZXhwLT5leHBlY3RhbnQpOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0JREVCVUdQKCJtYXN0ZXIncyBuYW1lID0gJXMgLCBpbmZvLT5uYW1lID0gJXNcbiIsIAotCQljdC0+bWFzdGVyLT5oZWxwZXItPm5hbWUsIGluZm8tPm5hbWUpOwotCi0JaWYgKGluZm8tPm5hbWVbMF0gPT0gJ1wwJykKLQkJcmV0IF49IDE7Ci0JZWxzZQotCQlyZXQgXj0gIXN0cm5jbXAoY3QtPm1hc3Rlci0+aGVscGVyLT5uYW1lLCBpbmZvLT5uYW1lLCAKLQkJICAgICAgICAgICAgICAgIHN0cmxlbihjdC0+bWFzdGVyLT5oZWxwZXItPm5hbWUpKTsKLW91dF91bmxvY2s6Ci0JcmVhZF91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi0jZWxzZSAvKiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLICovCi0KLXN0YXRpYyBpbnQKLW1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgaW50IG9mZnNldCwKLSAgICAgIGludCAqaG90ZHJvcCkKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X2hlbHBlcl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCXN0cnVjdCBuZl9jb25uICpjdDsKLQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLQlpbnQgcmV0ID0gaW5mby0+aW52ZXJ0OwotCQotCWN0ID0gbmZfY3RfZ2V0KChzdHJ1Y3Qgc2tfYnVmZiAqKXNrYiwgJmN0aW5mbyk7Ci0JaWYgKCFjdCkgewotCQlERUJVR1AoImlwdF9oZWxwZXI6IEVlayEgaW52YWxpZCBjb25udHJhY2s/XG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoIWN0LT5tYXN0ZXIpIHsKLQkJREVCVUdQKCJpcHRfaGVscGVyOiBjb25udHJhY2sgJXAgaGFzIG5vIG1hc3RlclxuIiwgY3QpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJlYWRfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCWlmICghY3QtPm1hc3Rlci0+aGVscGVyKSB7Ci0JCURFQlVHUCgiaXB0X2hlbHBlcjogbWFzdGVyIGN0ICVwIGhhcyBubyBoZWxwZXJcbiIsIAotCQkJZXhwLT5leHBlY3RhbnQpOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0JREVCVUdQKCJtYXN0ZXIncyBuYW1lID0gJXMgLCBpbmZvLT5uYW1lID0gJXNcbiIsIAotCQljdC0+bWFzdGVyLT5oZWxwZXItPm5hbWUsIGluZm8tPm5hbWUpOwotCi0JaWYgKGluZm8tPm5hbWVbMF0gPT0gJ1wwJykKLQkJcmV0IF49IDE7Ci0JZWxzZQotCQlyZXQgXj0gIXN0cm5jbXAoY3QtPm1hc3Rlci0+aGVscGVyLT5uYW1lLCBpbmZvLT5uYW1lLCAKLQkJICAgICAgICAgICAgICAgIHN0cmxlbihjdC0+bWFzdGVyLT5oZWxwZXItPm5hbWUpKTsKLW91dF91bmxvY2s6Ci0JcmVhZF91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCi0JCSB2b2lkICptYXRjaGluZm8sCi0JCSB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAotCQkgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLQlzdHJ1Y3QgaXB0X2hlbHBlcl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCi0JaW5mby0+bmFtZVsyOV0gPSAnXDAnOwotCi0JLyogdmVyaWZ5IHNpemUgKi8KLQlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9oZWxwZXJfaW5mbykpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBoZWxwZXJfbWF0Y2ggPSB7Ci0JLm5hbWUJCT0gImhlbHBlciIsCi0JLm1hdGNoCQk9ICZtYXRjaCwKLQkuY2hlY2tlbnRyeQk9ICZjaGVjaywKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JbmVlZF9pcF9jb25udHJhY2soKTsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZoZWxwZXJfbWF0Y2gpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZoZWxwZXJfbWF0Y2gpOwotfQotCi1tb2R1bGVfaW5pdChpbml0KTsKLW1vZHVsZV9leGl0KGZpbmkpOwotCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2lwcmFuZ2UuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaXByYW5nZS5jCmluZGV4IGI4MzViN2IuLjEzZmIxNmYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaXByYW5nZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaXByYW5nZS5jCkBAIC0yOCw3ICsyOCw3IEBACiAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCiAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgaW50IG9mZnNldCwgaW50ICpob3Rkcm9wKQorICAgICAgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsIGludCAqaG90ZHJvcCkKIHsKIAljb25zdCBzdHJ1Y3QgaXB0X2lwcmFuZ2VfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKIAljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOwpAQCAtNjMsNyArNjMsNyBAQAogfQogCiBzdGF0aWMgaW50IGNoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCQkgY29uc3Qgdm9pZCAqaW5mLAogCQkgdm9pZCAqbWF0Y2hpbmZvLAogCQkgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkJIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2xlbmd0aC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9sZW5ndGguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhYmNmYi4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2xlbmd0aC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBwYWNrZXQgbGVuZ3RoLiAqLwotLyogKEMpIDE5OTktMjAwMSBKYW1lcyBNb3JyaXMgPGptb3Jyb3NAaW50ZXJjb2RlLmNvbS5hdT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9sZW5ndGguaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLQotTU9EVUxFX0FVVEhPUigiSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIklQIHRhYmxlcyBwYWNrZXQgbGVuZ3RoIG1hdGNoaW5nIG1vZHVsZSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgaW50Ci1tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLSAgICAgIGludCBvZmZzZXQsCi0gICAgICBpbnQgKmhvdGRyb3ApCi17Ci0JY29uc3Qgc3RydWN0IGlwdF9sZW5ndGhfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKLQl1X2ludDE2X3QgcGt0bGVuID0gbnRvaHMoc2tiLT5uaC5pcGgtPnRvdF9sZW4pOwotCQotCXJldHVybiAocGt0bGVuID49IGluZm8tPm1pbiAmJiBwa3RsZW4gPD0gaW5mby0+bWF4KSBeIGluZm8tPmludmVydDsKLX0KLQotc3RhdGljIGludAotY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0gICAgICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAotICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0JaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfbGVuZ3RoX2luZm8pKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggbGVuZ3RoX21hdGNoID0gewotCS5uYW1lCQk9ICJsZW5ndGgiLAotCS5tYXRjaAkJPSAmbWF0Y2gsCi0JLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmbGVuZ3RoX21hdGNoKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKLXsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmbGVuZ3RoX21hdGNoKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfbGltaXQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfbGltaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMyNGRjYy4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2xpbWl0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyogS2VybmVsIG1vZHVsZSB0byBjb250cm9sIHRoZSByYXRlCi0gKgotICogMiBTZXB0ZW1iZXIgMTk5OTogQ2hhbmdlZCBmcm9tIHRoZSB0YXJnZXQgUkFURSB0byB0aGUgbWF0Y2gKLSAqICAgICAgICAgICAgICAgICAgIGBsaW1pdCcsIHJlbW92ZWQgbG9nZ2luZy4gIERpZCBJIG1lbnRpb24gdGhhdAotICogICAgICAgICAgICAgICAgICAgQWxleGV5IGlzIGEgZnVja2luZyBnZW5pdXM/Ci0gKiAgICAgICAgICAgICAgICAgICBSdXN0eSBSdXNzZWxsIChydXN0eUBydXN0Y29ycC5jb20uYXUpLiAgKi8KLQotLyogKEMpIDE5OTkgSuly9G1lIGRlIFZpdmllIDxkZXZpdmllQGluZm8uZW5zZXJiLnUtYm9yZGVhdXguZnI+Ci0gKiAoQykgMTk5OSBIZXJ26SBFeWNoZW5uZSA8ZXljaGVubmVAaW5mby5lbnNlcmIudS1ib3JkZWF1eC5mcj4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2xpbWl0Lmg+Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkhlcnZlIEV5Y2hlbm5lIDxydkB3YWxsZmlyZS5vcmc+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIHJhdGUgbGltaXQgbWF0Y2giKTsKLQotLyogVGhlIGFsZ29yaXRobSB1c2VkIGlzIHRoZSBTaW1wbGUgVG9rZW4gQnVja2V0IEZpbHRlciAoVEJGKQotICogc2VlIG5ldC9zY2hlZC9zY2hfdGJmLmMgaW4gdGhlIGxpbnV4IHNvdXJjZSB0cmVlCi0gKi8KLQotc3RhdGljIERFRklORV9TUElOTE9DSyhsaW1pdF9sb2NrKTsKLQotLyogUnVzdHk6IFRoaXMgaXMgbXkgKG5vbi1tYXRoZW1hdGljYWxseS1pbmNsaW5lZCkgdW5kZXJzdGFuZGluZyBvZgotICAgdGhpcyBhbGdvcml0aG0uICBUaGUgYGF2ZXJhZ2UgcmF0ZScgaW4gamlmZmllcyBiZWNvbWVzIHlvdXIgaW5pdGlhbAotICAgYW1vdW50IG9mIGNyZWRpdCBgY3JlZGl0JyBhbmQgdGhlIG1vc3QgY3JlZGl0IHlvdSBjYW4gZXZlciBoYXZlCi0gICBgY3JlZGl0X2NhcCcuICBUaGUgYHBlYWsgcmF0ZScgYmVjb21lcyB0aGUgY29zdCBvZiBwYXNzaW5nIHRoZQotICAgdGVzdCwgYGNvc3QnLgotCi0gICBgcHJldicgdHJhY2tzIHRoZSBsYXN0IHBhY2tldCBoaXQ6IHlvdSBnYWluIG9uZSBjcmVkaXQgcGVyIGppZmZ5LgotICAgSWYgeW91IGdldCBjcmVkaXQgYmFsYW5jZSBtb3JlIHRoYW4gdGhpcywgdGhlIGV4dHJhIGNyZWRpdCBpcwotICAgZGlzY2FyZGVkLiAgRXZlcnkgdGltZSB0aGUgbWF0Y2ggcGFzc2VzLCB5b3UgbG9zZSBgY29zdCcgY3JlZGl0czsKLSAgIGlmIHlvdSBkb24ndCBoYXZlIHRoYXQgbWFueSwgdGhlIHRlc3QgZmFpbHMuCi0KLSAgIFNlZSBBbGV4ZXkncyBmb3JtYWwgZXhwbGFuYXRpb24gaW4gbmV0L3NjaGVkL3NjaF90YmYuYy4KLQotICAgVG8gZ2V0IHRoZSBtYXhtdW0gcmFuZ2UsIHdlIG11bHRpcGx5IGJ5IHRoaXMgZmFjdG9yIChpZS4geW91IGdldCBOCi0gICBjcmVkaXRzIHBlciBqaWZmeSkuICBXZSB3YW50IHRvIGFsbG93IGEgcmF0ZSBhcyBsb3cgYXMgMSBwZXIgZGF5Ci0gICAoc2xvd2VzdCB1c2Vyc3BhY2UgdG9vbCBhbGxvd3MpLCB3aGljaCBtZWFucwotICAgQ1JFRElUU19QRVJfSklGRlkqSFoqNjAqNjAqMjQgPCAyXjMyLiBpZS4gKi8KLSNkZWZpbmUgTUFYX0NQSiAoMHhGRkZGRkZGRiAvIChIWio2MCo2MCoyNCkpCi0KLS8qIFJlcGVhdGVkIHNoaWZ0IGFuZCBvciBnaXZlcyB1cyBhbGwgMXMsIGZpbmFsIHNoaWZ0IGFuZCBhZGQgMSBnaXZlcwotICogdXMgdGhlIHBvd2VyIG9mIDIgYmVsb3cgdGhlIHRoZW9yZXRpY2FsIG1heCwgc28gR0NDIHNpbXBseSBkb2VzIGEKLSAqIHNoaWZ0LiAqLwotI2RlZmluZSBfUE9XMl9CRUxPVzIoeCkgKCh4KXwoKHgpPj4xKSkKLSNkZWZpbmUgX1BPVzJfQkVMT1c0KHgpIChfUE9XMl9CRUxPVzIoeCl8X1BPVzJfQkVMT1cyKCh4KT4+MikpCi0jZGVmaW5lIF9QT1cyX0JFTE9XOCh4KSAoX1BPVzJfQkVMT1c0KHgpfF9QT1cyX0JFTE9XNCgoeCk+PjQpKQotI2RlZmluZSBfUE9XMl9CRUxPVzE2KHgpIChfUE9XMl9CRUxPVzgoeCl8X1BPVzJfQkVMT1c4KCh4KT4+OCkpCi0jZGVmaW5lIF9QT1cyX0JFTE9XMzIoeCkgKF9QT1cyX0JFTE9XMTYoeCl8X1BPVzJfQkVMT1cxNigoeCk+PjE2KSkKLSNkZWZpbmUgUE9XMl9CRUxPVzMyKHgpICgoX1BPVzJfQkVMT1czMih4KT4+MSkgKyAxKQotCi0jZGVmaW5lIENSRURJVFNfUEVSX0pJRkZZIFBPVzJfQkVMT1czMihNQVhfQ1BKKQotCi1zdGF0aWMgaW50Ci1pcHRfbGltaXRfbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQljb25zdCB2b2lkICptYXRjaGluZm8sCi0JCWludCBvZmZzZXQsCi0JCWludCAqaG90ZHJvcCkKLXsKLQlzdHJ1Y3QgaXB0X3JhdGVpbmZvICpyID0gKChzdHJ1Y3QgaXB0X3JhdGVpbmZvICopbWF0Y2hpbmZvKS0+bWFzdGVyOwotCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKLQotCXNwaW5fbG9ja19iaCgmbGltaXRfbG9jayk7Ci0Jci0+Y3JlZGl0ICs9IChub3cgLSB4Y2hnKCZyLT5wcmV2LCBub3cpKSAqIENSRURJVFNfUEVSX0pJRkZZOwotCWlmIChyLT5jcmVkaXQgPiByLT5jcmVkaXRfY2FwKQotCQlyLT5jcmVkaXQgPSByLT5jcmVkaXRfY2FwOwotCi0JaWYgKHItPmNyZWRpdCA+PSByLT5jb3N0KSB7Ci0JCS8qIFdlJ3JlIG5vdCBsaW1pdGVkLiAqLwotCQlyLT5jcmVkaXQgLT0gci0+Y29zdDsKLQkJc3Bpbl91bmxvY2tfYmgoJmxpbWl0X2xvY2spOwotCQlyZXR1cm4gMTsKLQl9Ci0KLSAgICAgICAJc3Bpbl91bmxvY2tfYmgoJmxpbWl0X2xvY2spOwotCXJldHVybiAwOwotfQotCi0vKiBQcmVjaXNpb24gc2F2ZXIuICovCi1zdGF0aWMgdV9pbnQzMl90Ci11c2VyMmNyZWRpdHModV9pbnQzMl90IHVzZXIpCi17Ci0JLyogSWYgbXVsdGlwbHlpbmcgd291bGQgb3ZlcmZsb3cuLi4gKi8KLQlpZiAodXNlciA+IDB4RkZGRkZGRkYgLyAoSFoqQ1JFRElUU19QRVJfSklGRlkpKQotCQkvKiBEaXZpZGUgZmlyc3QuICovCi0JCXJldHVybiAodXNlciAvIElQVF9MSU1JVF9TQ0FMRSkgKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZOwotCi0JcmV0dXJuICh1c2VyICogSFogKiBDUkVESVRTX1BFUl9KSUZGWSkgLyBJUFRfTElNSVRfU0NBTEU7Ci19Ci0KLXN0YXRpYyBpbnQKLWlwdF9saW1pdF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKLQkJICAgICB2b2lkICptYXRjaGluZm8sCi0JCSAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKLQkJICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCXN0cnVjdCBpcHRfcmF0ZWluZm8gKnIgPSBtYXRjaGluZm87Ci0KLQlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9yYXRlaW5mbykpKQotCQlyZXR1cm4gMDsKLQotCS8qIENoZWNrIGZvciBvdmVyZmxvdy4gKi8KLQlpZiAoci0+YnVyc3QgPT0gMAotCSAgICB8fCB1c2VyMmNyZWRpdHMoci0+YXZnICogci0+YnVyc3QpIDwgdXNlcjJjcmVkaXRzKHItPmF2ZykpIHsKLQkJcHJpbnRrKCJPdmVyZmxvdyBpbiBpcHRfbGltaXQsIHRyeSBsb3dlcjogJXUvJXVcbiIsCi0JCSAgICAgICByLT5hdmcsIHItPmJ1cnN0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogVXNlciBhdmcgaW4gc2Vjb25kcyAqIElQVF9MSU1JVF9TQ0FMRTogY29udmVydCB0byBqaWZmaWVzICoKLQkgICAxMjguICovCi0Jci0+cHJldiA9IGppZmZpZXM7Ci0Jci0+Y3JlZGl0ID0gdXNlcjJjcmVkaXRzKHItPmF2ZyAqIHItPmJ1cnN0KTsJIC8qIENyZWRpdHMgZnVsbC4gKi8KLQlyLT5jcmVkaXRfY2FwID0gdXNlcjJjcmVkaXRzKHItPmF2ZyAqIHItPmJ1cnN0KTsgLyogQ3JlZGl0cyBmdWxsLiAqLwotCXItPmNvc3QgPSB1c2VyMmNyZWRpdHMoci0+YXZnKTsKLQotCS8qIEZvciBTTVAsIHdlIG9ubHkgd2FudCB0byB1c2Ugb25lIHNldCBvZiBjb3VudGVycy4gKi8KLQlyLT5tYXN0ZXIgPSByOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIGlwdF9saW1pdF9yZWcgPSB7Ci0JLm5hbWUJCT0gImxpbWl0IiwKLQkubWF0Y2gJCT0gaXB0X2xpbWl0X21hdGNoLAotCS5jaGVja2VudHJ5CT0gaXB0X2xpbWl0X2NoZWNrZW50cnksCi0JLm1lCQk9IFRISVNfTU9EVUxFLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQotewotCWlmIChpcHRfcmVnaXN0ZXJfbWF0Y2goJmlwdF9saW1pdF9yZWcpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKLXsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmaXB0X2xpbWl0X3JlZyk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X21hYy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9tYWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhNDU5ZS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X21hYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBNQUMgYWRkcmVzcyBwYXJhbWV0ZXJzLiAqLwotCi0vKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCi0gKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9tYWMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgbWFjIG1hdGNoaW5nIG1vZHVsZSIpOwotCi1zdGF0aWMgaW50Ci1tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLSAgICAgIGludCBvZmZzZXQsCi0gICAgICBpbnQgKmhvdGRyb3ApCi17Ci0gICAgY29uc3Qgc3RydWN0IGlwdF9tYWNfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKLQotICAgIC8qIElzIG1hYyBwb2ludGVyIHZhbGlkPyAqLwotICAgIHJldHVybiAoc2tiLT5tYWMucmF3ID49IHNrYi0+aGVhZAotCSAgICAmJiAoc2tiLT5tYWMucmF3ICsgRVRIX0hMRU4pIDw9IHNrYi0+ZGF0YQotCSAgICAvKiBJZiBzbywgY29tcGFyZS4uLiAqLwotCSAgICAmJiAoKG1lbWNtcChldGhfaGRyKHNrYiktPmhfc291cmNlLCBpbmZvLT5zcmNhZGRyLCBFVEhfQUxFTikKLQkJPT0gMCkgXiBpbmZvLT5pbnZlcnQpKTsKLX0KLQotc3RhdGljIGludAotaXB0X21hY19jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCi0JCSAgIHZvaWQgKm1hdGNoaW5mbywKLQkJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKLQkJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLQkvKiBGT1JXQVJEIGlzbid0IGFsd2F5cyB2YWxpZCwgYnV0IGl0J3MgbmljZSB0byBiZSBhYmxlIHRvIGRvIC0tUlIgKi8KLQlpZiAoaG9va19tYXNrCi0JICAgICYgfigoMSA8PCBORl9JUF9QUkVfUk9VVElORykgfCAoMSA8PCBORl9JUF9MT0NBTF9JTikKLQkJfCAoMSA8PCBORl9JUF9GT1JXQVJEKSkpIHsKLQkJcHJpbnRrKCJpcHRfbWFjOiBvbmx5IHZhbGlkIGZvciBQUkVfUk9VVElORywgTE9DQUxfSU4gb3IgRk9SV0FSRC5cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9tYWNfaW5mbykpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBtYWNfbWF0Y2ggPSB7Ci0JLm5hbWUJCT0gIm1hYyIsCi0JLm1hdGNoCQk9ICZtYXRjaCwKLQkuY2hlY2tlbnRyeQk9ICZpcHRfbWFjX2NoZWNrZW50cnksCi0JLm1lCQk9IFRISVNfTU9EVUxFLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQotewotCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJm1hY19tYXRjaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCi17Ci0JaXB0X3VucmVnaXN0ZXJfbWF0Y2goJm1hY19tYXRjaCk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X21hcmsuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfbWFyay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGJlZjZjLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfbWFyay5jCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBORk1BUksgdmFsdWVzLiAqLwotCi0vKiAoQykgMTk5OS0yMDAxIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X21hcmsuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIG1hcmsgbWF0Y2hpbmcgbW9kdWxlIik7Ci0KLXN0YXRpYyBpbnQKLW1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgaW50IG9mZnNldCwKLSAgICAgIGludCAqaG90ZHJvcCkKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X21hcmtfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKLQotCXJldHVybiAoKHNrYi0+bmZtYXJrICYgaW5mby0+bWFzaykgPT0gaW5mby0+bWFyaykgXiBpbmZvLT5pbnZlcnQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKLSAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCXN0cnVjdCBpcHRfbWFya19pbmZvICptaW5mbyA9IChzdHJ1Y3QgaXB0X21hcmtfaW5mbyAqKSBtYXRjaGluZm87Ci0KLQlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9tYXJrX2luZm8pKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAobWluZm8tPm1hcmsgPiAweGZmZmZmZmZmIHx8IG1pbmZvLT5tYXNrID4gMHhmZmZmZmZmZikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJtYXJrOiBvbmx5IHN1cHBvcnRzIDMyYml0IG1hcmtcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggbWFya19tYXRjaCA9IHsKLQkubmFtZQkJPSAibWFyayIsCi0JLm1hdGNoCQk9ICZtYXRjaCwKLQkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAotCS5tZQkJPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZtYXJrX21hdGNoKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKLXsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmbWFya19tYXRjaCk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X211bHRpcG9ydC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9tdWx0aXBvcnQuYwppbmRleCA5OWU4MTg4Li4yZDUyMzI2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X211bHRpcG9ydC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfbXVsdGlwb3J0LmMKQEAgLTk3LDYgKzk3LDcgQEAKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCiAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCiAgICAgICBpbnQgKmhvdGRyb3ApCiB7CiAJdTE2IF9wb3J0c1syXSwgKnBwdHI7CkBAIC0xMDUsNyArMTA2LDcgQEAKIAlpZiAob2Zmc2V0KQogCQlyZXR1cm4gMDsKIAotCXBwdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsICogNCwKKwlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwKIAkJCQkgIHNpemVvZihfcG9ydHMpLCBfcG9ydHMpOwogCWlmIChwcHRyID09IE5VTEwpIHsKIAkJLyogV2UndmUgYmVlbiBhc2tlZCB0byBleGFtaW5lIHRoaXMgcGFja2V0LCBhbmQgd2UKQEAgLTEyOCw2ICsxMjksNyBAQAogCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogCSBjb25zdCB2b2lkICptYXRjaGluZm8sCiAJIGludCBvZmZzZXQsCisJIHVuc2lnbmVkIGludCBwcm90b2ZmLAogCSBpbnQgKmhvdGRyb3ApCiB7CiAJdTE2IF9wb3J0c1syXSwgKnBwdHI7CkBAIC0xMzYsNyArMTM4LDcgQEAKIAlpZiAob2Zmc2V0KQogCQlyZXR1cm4gMDsKIAotCXBwdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsICogNCwKKwlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwKIAkJCQkgIHNpemVvZihfcG9ydHMpLCBfcG9ydHMpOwogCWlmIChwcHRyID09IE5VTEwpIHsKIAkJLyogV2UndmUgYmVlbiBhc2tlZCB0byBleGFtaW5lIHRoaXMgcGFja2V0LCBhbmQgd2UKQEAgLTE1NCw3ICsxNTYsNyBAQAogLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisJICAgY29uc3Qgdm9pZCAqaXAsCiAJICAgdm9pZCAqbWF0Y2hpbmZvLAogCSAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKQEAgLTE2NCw3ICsxNjYsNyBAQAogCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5X3YxKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkgICAgICBjb25zdCB2b2lkICppcCwKIAkgICAgICB2b2lkICptYXRjaGluZm8sCiAJICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9vd25lci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9vd25lci5jCmluZGV4IDBjZWUyODYuLjQ4NDNkMGMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfb3duZXIuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X293bmVyLmMKQEAgLTI3LDYgKzI3LDcgQEAKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCiAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCiAgICAgICBpbnQgKmhvdGRyb3ApCiB7CiAJY29uc3Qgc3RydWN0IGlwdF9vd25lcl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwpAQCAtNTEsNyArNTIsNyBAQAogCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLSAgICAgICAgICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisgICAgICAgICAgIGNvbnN0IHZvaWQgKmlwLAogICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCiAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3BoeXNkZXYuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfcGh5c2Rldi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2Y1NTQ4Li4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfcGh5c2Rldi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggdGhlIGJyaWRnZSBwb3J0IGluIGFuZAotICogb3V0IGRldmljZSBmb3IgSVAgcGFja2V0cyBjb21pbmcgaW50byBjb250YWN0IHdpdGggYSBicmlkZ2UuICovCi0KLS8qIChDKSAyMDAxLTIwMDMgQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcGh5c2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UuaD4KLSNkZWZpbmUgTUFUQ0ggICAxCi0jZGVmaW5lIE5PTUFUQ0ggMAotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJCYXJ0IERlIFNjaHV5bWVyIDxiZHNjaHV5bUBwYW5kb3JhLmJlPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBicmlkZ2UgcGh5c2ljYWwgZGV2aWNlIG1hdGNoIG1vZHVsZSIpOwotCi1zdGF0aWMgaW50Ci1tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLSAgICAgIGludCBvZmZzZXQsCi0gICAgICBpbnQgKmhvdGRyb3ApCi17Ci0JaW50IGk7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgbnVsbGRldm5hbWVbSUZOQU1TSVpdOwotCWNvbnN0IHN0cnVjdCBpcHRfcGh5c2Rldl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCXVuc2lnbmVkIGludCByZXQ7Ci0JY29uc3QgY2hhciAqaW5kZXYsICpvdXRkZXY7Ci0Jc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2U7Ci0KLQkvKiBOb3QgYSBicmlkZ2VkIElQIHBhY2tldCBvciBubyBpbmZvIGF2YWlsYWJsZSB5ZXQ6Ci0JICogTE9DQUxfT1VUL21hbmdsZSBhbmQgTE9DQUxfT1VUL25hdCBkb24ndCBrbm93IGlmCi0JICogdGhlIGRlc3RpbmF0aW9uIGRldmljZSB3aWxsIGJlIGEgYnJpZGdlLiAqLwotCWlmICghKG5mX2JyaWRnZSA9IHNrYi0+bmZfYnJpZGdlKSkgewotCQkvKiBSZXR1cm4gTUFUQ0ggaWYgdGhlIGludmVydCBmbGFncyBvZiB0aGUgdXNlZCBvcHRpb25zIGFyZSBvbiAqLwotCQlpZiAoKGluZm8tPmJpdG1hc2sgJiBJUFRfUEhZU0RFVl9PUF9CUklER0VEKSAmJgotCQkgICAgIShpbmZvLT5pbnZlcnQgJiBJUFRfUEhZU0RFVl9PUF9CUklER0VEKSkKLQkJCXJldHVybiBOT01BVENIOwotCQlpZiAoKGluZm8tPmJpdG1hc2sgJiBJUFRfUEhZU0RFVl9PUF9JU0lOKSAmJgotCQkgICAgIShpbmZvLT5pbnZlcnQgJiBJUFRfUEhZU0RFVl9PUF9JU0lOKSkKLQkJCXJldHVybiBOT01BVENIOwotCQlpZiAoKGluZm8tPmJpdG1hc2sgJiBJUFRfUEhZU0RFVl9PUF9JU09VVCkgJiYKLQkJICAgICEoaW5mby0+aW52ZXJ0ICYgSVBUX1BIWVNERVZfT1BfSVNPVVQpKQotCQkJcmV0dXJuIE5PTUFUQ0g7Ci0JCWlmICgoaW5mby0+Yml0bWFzayAmIElQVF9QSFlTREVWX09QX0lOKSAmJgotCQkgICAgIShpbmZvLT5pbnZlcnQgJiBJUFRfUEhZU0RFVl9PUF9JTikpCi0JCQlyZXR1cm4gTk9NQVRDSDsKLQkJaWYgKChpbmZvLT5iaXRtYXNrICYgSVBUX1BIWVNERVZfT1BfT1VUKSAmJgotCQkgICAgIShpbmZvLT5pbnZlcnQgJiBJUFRfUEhZU0RFVl9PUF9PVVQpKQotCQkJcmV0dXJuIE5PTUFUQ0g7Ci0JCXJldHVybiBNQVRDSDsKLQl9Ci0KLQkvKiBUaGlzIG9ubHkgbWFrZXMgc2Vuc2UgaW4gdGhlIEZPUldBUkQgYW5kIFBPU1RST1VUSU5HIGNoYWlucyAqLwotCWlmICgoaW5mby0+Yml0bWFzayAmIElQVF9QSFlTREVWX09QX0JSSURHRUQpICYmCi0JICAgICghIShuZl9icmlkZ2UtPm1hc2sgJiBCUk5GX0JSSURHRUQpIF4KLQkgICAgIShpbmZvLT5pbnZlcnQgJiBJUFRfUEhZU0RFVl9PUF9CUklER0VEKSkpCi0JCXJldHVybiBOT01BVENIOwotCi0JaWYgKChpbmZvLT5iaXRtYXNrICYgSVBUX1BIWVNERVZfT1BfSVNJTiAmJgotCSAgICAoIW5mX2JyaWRnZS0+cGh5c2luZGV2IF4gISEoaW5mby0+aW52ZXJ0ICYgSVBUX1BIWVNERVZfT1BfSVNJTikpKSB8fAotCSAgICAoaW5mby0+Yml0bWFzayAmIElQVF9QSFlTREVWX09QX0lTT1VUICYmCi0JICAgICghbmZfYnJpZGdlLT5waHlzb3V0ZGV2IF4gISEoaW5mby0+aW52ZXJ0ICYgSVBUX1BIWVNERVZfT1BfSVNPVVQpKSkpCi0JCXJldHVybiBOT01BVENIOwotCi0JaWYgKCEoaW5mby0+Yml0bWFzayAmIElQVF9QSFlTREVWX09QX0lOKSkKLQkJZ290byBtYXRjaF9vdXRkZXY7Ci0JaW5kZXYgPSBuZl9icmlkZ2UtPnBoeXNpbmRldiA/IG5mX2JyaWRnZS0+cGh5c2luZGV2LT5uYW1lIDogbnVsbGRldm5hbWU7Ci0JZm9yIChpID0gMCwgcmV0ID0gMDsgaSA8IElGTkFNU0laL3NpemVvZih1bnNpZ25lZCBpbnQpOyBpKyspIHsKLQkJcmV0IHw9ICgoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZGV2KVtpXQotCQkJXiAoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZm8tPnBoeXNpbmRldilbaV0pCi0JCQkmICgoY29uc3QgdW5zaWduZWQgaW50ICopaW5mby0+aW5fbWFzaylbaV07Ci0JfQotCi0JaWYgKChyZXQgPT0gMCkgXiAhKGluZm8tPmludmVydCAmIElQVF9QSFlTREVWX09QX0lOKSkKLQkJcmV0dXJuIE5PTUFUQ0g7Ci0KLW1hdGNoX291dGRldjoKLQlpZiAoIShpbmZvLT5iaXRtYXNrICYgSVBUX1BIWVNERVZfT1BfT1VUKSkKLQkJcmV0dXJuIE1BVENIOwotCW91dGRldiA9IG5mX2JyaWRnZS0+cGh5c291dGRldiA/Ci0JCSBuZl9icmlkZ2UtPnBoeXNvdXRkZXYtPm5hbWUgOiBudWxsZGV2bmFtZTsKLQlmb3IgKGkgPSAwLCByZXQgPSAwOyBpIDwgSUZOQU1TSVovc2l6ZW9mKHVuc2lnbmVkIGludCk7IGkrKykgewotCQlyZXQgfD0gKCgoY29uc3QgdW5zaWduZWQgaW50ICopb3V0ZGV2KVtpXQotCQkJXiAoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZm8tPnBoeXNvdXRkZXYpW2ldKQotCQkJJiAoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZm8tPm91dF9tYXNrKVtpXTsKLQl9Ci0KLQlyZXR1cm4gKHJldCAhPSAwKSBeICEoaW5mby0+aW52ZXJ0ICYgSVBUX1BIWVNERVZfT1BfT1VUKTsKLX0KLQotc3RhdGljIGludAotY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKLQkJICAgICAgIHZvaWQgKm1hdGNoaW5mbywKLQkJICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWNvbnN0IHN0cnVjdCBpcHRfcGh5c2Rldl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCi0JaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfcGh5c2Rldl9pbmZvKSkpCi0JCXJldHVybiAwOwotCWlmICghKGluZm8tPmJpdG1hc2sgJiBJUFRfUEhZU0RFVl9PUF9NQVNLKSB8fAotCSAgICBpbmZvLT5iaXRtYXNrICYgfklQVF9QSFlTREVWX09QX01BU0spCi0JCXJldHVybiAwOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBwaHlzZGV2X21hdGNoID0gewotCS5uYW1lCQk9ICJwaHlzZGV2IiwKLQkubWF0Y2gJCT0gJm1hdGNoLAotCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCi0JLm1lCQk9IFRISVNfTU9EVUxFLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQotewotCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJnBoeXNkZXZfbWF0Y2gpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZwaHlzZGV2X21hdGNoKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfcGt0dHlwZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9wa3R0eXBlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZGIxZGMuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9wa3R0eXBlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiAoQykgMTk5OS0yMDAxIE1pY2hhbCBMdWR2aWcgPG1pY2hhbEBsb2dpeC5jej4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX3BhY2tldC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3BrdHR5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiTWljaGFsIEx1ZHZpZyA8bWljaGFsQGxvZ2l4LmN6PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJJUCB0YWJsZXMgbWF0Y2ggdG8gbWF0Y2ggb24gbGlua2xheWVyIHBhY2tldCB0eXBlIik7Ci0KLXN0YXRpYyBpbnQgbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCi0gICAgICBpbnQgb2Zmc2V0LAotICAgICAgaW50ICpob3Rkcm9wKQotewotICAgIGNvbnN0IHN0cnVjdCBpcHRfcGt0dHlwZV9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCi0gICAgcmV0dXJuIChza2ItPnBrdF90eXBlID09IGluZm8tPnBrdHR5cGUpIF4gaW5mby0+aW52ZXJ0OwotfQotCi1zdGF0aWMgaW50IGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKLQkJICAgdm9pZCAqbWF0Y2hpbmZvLAotCQkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAotCQkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotLyoKLQlpZiAoaG9va19tYXNrCi0JICAgICYgfigoMSA8PCBORl9JUF9QUkVfUk9VVElORykgfCAoMSA8PCBORl9JUF9MT0NBTF9JTikKLQkJfCAoMSA8PCBORl9JUF9GT1JXQVJEKSkpIHsKLQkJcHJpbnRrKCJpcHRfcGt0dHlwZTogb25seSB2YWxpZCBmb3IgUFJFX1JPVVRJTkcsIExPQ0FMX0lOIG9yIEZPUldBUkQuXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotKi8KLQlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9wa3R0eXBlX2luZm8pKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggcGt0dHlwZV9tYXRjaCA9IHsKLQkubmFtZQkJPSAicGt0dHlwZSIsCi0JLm1hdGNoCQk9ICZtYXRjaCwKLQkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAotCS5tZQkJPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZwa3R0eXBlX21hdGNoKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKLXsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmcGt0dHlwZV9tYXRjaCk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3BvbGljeS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9wb2xpY3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGNhODI1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9wb2xpY3kuYwpAQCAtMCwwICsxLDE3MyBAQAorLyogSVAgdGFibGVzIG1vZHVsZSBmb3IgbWF0Y2hpbmcgSVBzZWMgcG9saWN5CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LDIwMDUgUGF0cmljayBNY0hhcmR5LCA8a2FiZXJAdHJhc2gubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxuZXQveGZybS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcG9saWN5Lmg+CisKK01PRFVMRV9BVVRIT1IoIlBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJUHRhYmxlcyBJUHNlYyBwb2xpY3kgbWF0Y2hpbmcgbW9kdWxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworc3RhdGljIGlubGluZSBpbnQKK21hdGNoX3hmcm1fc3RhdGUoc3RydWN0IHhmcm1fc3RhdGUgKngsIGNvbnN0IHN0cnVjdCBpcHRfcG9saWN5X2VsZW0gKmUpCit7CisjZGVmaW5lIE1BVENIKHgseSkJKCFlLT5tYXRjaC54IHx8ICgoZS0+eCA9PSAoeSkpIF4gZS0+aW52ZXJ0LngpKQorCisJcmV0dXJuIE1BVENIKHNhZGRyLCB4LT5wcm9wcy5zYWRkci5hNCAmIGUtPnNtYXNrKSAmJgorCSAgICAgICBNQVRDSChkYWRkciwgeC0+aWQuZGFkZHIuYTQgJiBlLT5kbWFzaykgJiYKKwkgICAgICAgTUFUQ0gocHJvdG8sIHgtPmlkLnByb3RvKSAmJgorCSAgICAgICBNQVRDSChtb2RlLCB4LT5wcm9wcy5tb2RlKSAmJgorCSAgICAgICBNQVRDSChzcGksIHgtPmlkLnNwaSkgJiYKKwkgICAgICAgTUFUQ0gocmVxaWQsIHgtPnByb3BzLnJlcWlkKTsKK30KKworc3RhdGljIGludAorbWF0Y2hfcG9saWN5X2luKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBpcHRfcG9saWN5X2luZm8gKmluZm8pCit7CisJY29uc3Qgc3RydWN0IGlwdF9wb2xpY3lfZWxlbSAqZTsKKwlzdHJ1Y3Qgc2VjX3BhdGggKnNwID0gc2tiLT5zcDsKKwlpbnQgc3RyaWN0ID0gaW5mby0+ZmxhZ3MgJiBJUFRfUE9MSUNZX01BVENIX1NUUklDVDsKKwlpbnQgaSwgcG9zOworCisJaWYgKHNwID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlpZiAoc3RyaWN0ICYmIGluZm8tPmxlbiAhPSBzcC0+bGVuKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IHNwLT5sZW4gLSAxOyBpID49IDA7IGktLSkgeworCQlwb3MgPSBzdHJpY3QgPyBpIC0gc3AtPmxlbiArIDEgOiAwOworCQlpZiAocG9zID49IGluZm8tPmxlbikKKwkJCXJldHVybiAwOworCQllID0gJmluZm8tPnBvbFtwb3NdOworCisJCWlmIChtYXRjaF94ZnJtX3N0YXRlKHNwLT54W2ldLnh2ZWMsIGUpKSB7CisJCQlpZiAoIXN0cmljdCkKKwkJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIGlmIChzdHJpY3QpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gc3RyaWN0ID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQKK21hdGNoX3BvbGljeV9vdXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGlwdF9wb2xpY3lfaW5mbyAqaW5mbykKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X3BvbGljeV9lbGVtICplOworCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYi0+ZHN0OworCWludCBzdHJpY3QgPSBpbmZvLT5mbGFncyAmIElQVF9QT0xJQ1lfTUFUQ0hfU1RSSUNUOworCWludCBpLCBwb3M7CisKKwlpZiAoZHN0LT54ZnJtID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDA7IGRzdCAmJiBkc3QtPnhmcm07IGRzdCA9IGRzdC0+Y2hpbGQsIGkrKykgeworCQlwb3MgPSBzdHJpY3QgPyBpIDogMDsKKwkJaWYgKHBvcyA+PSBpbmZvLT5sZW4pCisJCQlyZXR1cm4gMDsKKwkJZSA9ICZpbmZvLT5wb2xbcG9zXTsKKworCQlpZiAobWF0Y2hfeGZybV9zdGF0ZShkc3QtPnhmcm0sIGUpKSB7CisJCQlpZiAoIXN0cmljdCkKKwkJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIGlmIChzdHJpY3QpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gc3RyaWN0ID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgICAgICAgICAgICBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IGlwdF9wb2xpY3lfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwlpbnQgcmV0OworCisJaWYgKGluZm8tPmZsYWdzICYgSVBUX1BPTElDWV9NQVRDSF9JTikKKwkJcmV0ID0gbWF0Y2hfcG9saWN5X2luKHNrYiwgaW5mbyk7CisJZWxzZQorCQlyZXQgPSBtYXRjaF9wb2xpY3lfb3V0KHNrYiwgaW5mbyk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0ID0gaW5mby0+ZmxhZ3MgJiBJUFRfUE9MSUNZX01BVENIX05PTkUgPyAxIDogMDsKKwllbHNlIGlmIChpbmZvLT5mbGFncyAmIElQVF9QT0xJQ1lfTUFUQ0hfTk9ORSkKKwkJcmV0ID0gMDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmlwX3ZvaWQsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLCB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJc3RydWN0IGlwdF9wb2xpY3lfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKworCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZigqaW5mbykpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXB0X3BvbGljeTogbWF0Y2hzaXplICV1ICE9ICV6dVxuIiwKKwkJICAgICAgIG1hdGNoc2l6ZSwgSVBUX0FMSUdOKHNpemVvZigqaW5mbykpKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghKGluZm8tPmZsYWdzICYgKElQVF9QT0xJQ1lfTUFUQ0hfSU58SVBUX1BPTElDWV9NQVRDSF9PVVQpKSkgeworCQlwcmludGsoS0VSTl9FUlIgImlwdF9wb2xpY3k6IG5laXRoZXIgaW5jb21pbmcgbm9yICIKKwkJICAgICAgICAgICAgICAgICJvdXRnb2luZyBwb2xpY3kgc2VsZWN0ZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGhvb2tfbWFzayAmICgxIDw8IE5GX0lQX1BSRV9ST1VUSU5HIHwgMSA8PCBORl9JUF9MT0NBTF9JTikKKwkgICAgJiYgaW5mby0+ZmxhZ3MgJiBJUFRfUE9MSUNZX01BVENIX09VVCkgeworCQlwcmludGsoS0VSTl9FUlIgImlwdF9wb2xpY3k6IG91dHB1dCBwb2xpY3kgbm90IHZhbGlkIGluICIKKwkJICAgICAgICAgICAgICAgICJQUkVfUk9VVElORyBhbmQgSU5QVVRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGhvb2tfbWFzayAmICgxIDw8IE5GX0lQX1BPU1RfUk9VVElORyB8IDEgPDwgTkZfSVBfTE9DQUxfT1VUKQorCSAgICAmJiBpbmZvLT5mbGFncyAmIElQVF9QT0xJQ1lfTUFUQ0hfSU4pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpcHRfcG9saWN5OiBpbnB1dCBwb2xpY3kgbm90IHZhbGlkIGluICIKKwkJICAgICAgICAgICAgICAgICJQT1NUX1JPVVRJTkcgYW5kIE9VVFBVVFxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoaW5mby0+bGVuID4gSVBUX1BPTElDWV9NQVhfRUxFTSkgeworCQlwcmludGsoS0VSTl9FUlIgImlwdF9wb2xpY3k6IHRvbyBtYW55IHBvbGljeSBlbGVtZW50c1xuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBwb2xpY3lfbWF0Y2ggPSB7CisJLm5hbWUJCT0gInBvbGljeSIsCisJLm1hdGNoCQk9IG1hdGNoLAorCS5jaGVja2VudHJ5IAk9IGNoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJnBvbGljeV9tYXRjaCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaXB0X3VucmVnaXN0ZXJfbWF0Y2goJnBvbGljeV9tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlYWxtLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlYWxtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YTY4OTcuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9yZWFsbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyogSVAgdGFibGVzIG1vZHVsZSBmb3IgbWF0Y2hpbmcgdGhlIHJvdXRpbmcgcmVhbG0KLSAqCi0gKiAkSWQ6IGlwdF9yZWFsbS5jLHYgMS4zIDIwMDQvMDMvMDUgMTM6MjU6NDAgbGFmb3JnZSBFeHAgJAotICoKLSAqIChDKSAyMDAzIGJ5IFNhbXBzYSBSYW50YSA8c2FtcHNhQG5ldHNvbmljLmZpPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3JlYWxtLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0KLU1PRFVMRV9BVVRIT1IoIlNhbXBzYSBSYW50YSA8c2FtcHNhQG5ldHNvbmljLmZpPiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyByZWFsbSBtYXRjaCIpOwotCi1zdGF0aWMgaW50Ci1tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLSAgICAgIGludCBvZmZzZXQsCi0gICAgICBpbnQgKmhvdGRyb3ApCi17Ci0JY29uc3Qgc3RydWN0IGlwdF9yZWFsbV9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYi0+ZHN0OwotICAgIAotCXJldHVybiAoaW5mby0+aWQgPT0gKGRzdC0+dGNsYXNzaWQgJiBpbmZvLT5tYXNrKSkgXiBpbmZvLT5pbnZlcnQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKLSAgICAgICAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAotICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWlmIChob29rX21hc2sKLQkgICAgJiB+KCgxIDw8IE5GX0lQX1BPU1RfUk9VVElORykgfCAoMSA8PCBORl9JUF9GT1JXQVJEKSB8Ci0JICAgICAgICAoMSA8PCBORl9JUF9MT0NBTF9PVVQpIHwgKDEgPDwgTkZfSVBfTE9DQUxfSU4pKSkgewotCQlwcmludGsoImlwdF9yZWFsbTogb25seSB2YWxpZCBmb3IgUE9TVF9ST1VUSU5HLCBMT0NBTF9PVVQsICIKLQkJICAgICAgICJMT0NBTF9JTiBvciBGT1JXQVJELlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9yZWFsbV9pbmZvKSkpIHsKLQkJcHJpbnRrKCJpcHRfcmVhbG06IGludmFsaWQgbWF0Y2hzaXplLlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggcmVhbG1fbWF0Y2ggPSB7Ci0JLm5hbWUJCT0gInJlYWxtIiwKLQkubWF0Y2gJCT0gbWF0Y2gsIAotCS5jaGVja2VudHJ5CT0gY2hlY2ssCi0JLm1lCQk9IFRISVNfTU9EVUxFCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmcmVhbG1fbWF0Y2gpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZyZWFsbV9tYXRjaCk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlY2VudC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9yZWNlbnQuYwppbmRleCA1ZGRjY2IxLi40NDYxMWQ2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlY2VudC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfcmVjZW50LmMKQEAgLTEwNCw2ICsxMDQsNyBAQAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKICAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKICAgICAgIGludCAqaG90ZHJvcCk7CiAKIC8qIEZ1bmN0aW9uIHRvIGhhc2ggYSBnaXZlbiBhZGRyZXNzIGludG8gdGhlIGhhc2ggdGFibGUgb2YgdGFibGVfc2l6ZSBzaXplICovCkBAIC0zMTcsNyArMzE4LDcgQEAKIAlza2ItPm5oLmlwaC0+ZGFkZHIgPSAwOwogCS8qIENsZWFyIHR0bCBzaW5jZSB3ZSBoYXZlIG5vIHdheSBvZiBrbm93aW5nIGl0ICovCiAJc2tiLT5uaC5pcGgtPnR0bCA9IDA7Ci0JbWF0Y2goc2tiLE5VTEwsTlVMTCxpbmZvLDAsTlVMTCk7CisJbWF0Y2goc2tiLE5VTEwsTlVMTCxpbmZvLDAsMCxOVUxMKTsKIAogCWtmcmVlKHNrYi0+bmguaXBoKTsKIG91dF9mcmVlX3NrYjoKQEAgLTM1Nyw2ICszNTgsNyBAQAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKICAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKICAgICAgIGludCAqaG90ZHJvcCkKIHsKIAlpbnQgcGt0X2NvdW50LCBoaXRzX2ZvdW5kLCBhbnM7CkBAIC02NTQsNyArNjU2LDcgQEAKICAqLwogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0gICAgICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorICAgICAgICAgICBjb25zdCB2b2lkICppcCwKICAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9zY3RwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3NjdHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyYjMyNy4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3NjdHAuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bmV0L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvc2N0cC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3NjdHAuaD4KLQotI2lmZGVmIERFQlVHX1NDVFAKLSNkZWZpbmUgZHVwcmludGYoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoZm9ybWF0ICwgIyMgYXJncykKLSNlbHNlCi0jZGVmaW5lIGR1cHJpbnRmKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCi0jZGVmaW5lIFNDQ0hFQ0soY29uZCwgb3B0aW9uLCBmbGFnLCBpbnZmbGFnKSAoISgoZmxhZykgJiAob3B0aW9uKSkgXAotCQkJCQkgICAgICB8fCAoISEoKGludmZsYWcpICYgKG9wdGlvbikpIF4gKGNvbmQpKSkKLQotc3RhdGljIGludAotbWF0Y2hfZmxhZ3MoY29uc3Qgc3RydWN0IGlwdF9zY3RwX2ZsYWdfaW5mbyAqZmxhZ19pbmZvLAotCSAgICBjb25zdCBpbnQgZmxhZ19jb3VudCwKLQkgICAgdV9pbnQ4X3QgY2h1bmt0eXBlLAotCSAgICB1X2ludDhfdCBjaHVua2ZsYWdzKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGZsYWdfY291bnQ7IGkrKykgewotCQlpZiAoZmxhZ19pbmZvW2ldLmNodW5rdHlwZSA9PSBjaHVua3R5cGUpIHsKLQkJCXJldHVybiAoY2h1bmtmbGFncyAmIGZsYWdfaW5mb1tpXS5mbGFnX21hc2spID09IGZsYWdfaW5mb1tpXS5mbGFnOwotCQl9Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLW1hdGNoX3BhY2tldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgICAgY29uc3QgdV9pbnQzMl90ICpjaHVua21hcCwKLQkgICAgIGludCBjaHVua19tYXRjaF90eXBlLAotCSAgICAgY29uc3Qgc3RydWN0IGlwdF9zY3RwX2ZsYWdfaW5mbyAqZmxhZ19pbmZvLAotCSAgICAgY29uc3QgaW50IGZsYWdfY291bnQsCi0JICAgICBpbnQgKmhvdGRyb3ApCi17Ci0JaW50IG9mZnNldDsKLQl1X2ludDMyX3QgY2h1bmttYXBjb3B5WzI1NiAvIHNpemVvZiAodV9pbnQzMl90KV07Ci0Jc2N0cF9jaHVua2hkcl90IF9zY2gsICpzY2g7Ci0KLSNpZmRlZiBERUJVR19TQ1RQCi0JaW50IGkgPSAwOwotI2VuZGlmCi0KLQlpZiAoY2h1bmtfbWF0Y2hfdHlwZSA9PSBTQ1RQX0NIVU5LX01BVENIX0FMTCkgewotCQlTQ1RQX0NIVU5LTUFQX0NPUFkoY2h1bmttYXBjb3B5LCBjaHVua21hcCk7Ci0JfQotCi0Jb2Zmc2V0ID0gc2tiLT5uaC5pcGgtPmlobCAqIDQgKyBzaXplb2YgKHNjdHBfc2N0cGhkcl90KTsKLQlkbyB7Ci0JCXNjaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgc2l6ZW9mKF9zY2gpLCAmX3NjaCk7Ci0JCWlmIChzY2ggPT0gTlVMTCkgewotCQkJZHVwcmludGYoIkRyb3BwaW5nIGludmFsaWQgU0NUUCBwYWNrZXQuXG4iKTsKLQkJCSpob3Rkcm9wID0gMTsKLQkJCXJldHVybiAwOwotICAgICAgICAJfQotCi0JCWR1cHJpbnRmKCJDaHVuayBudW06ICVkXHRvZmZzZXQ6ICVkXHR0eXBlOiAlZFx0bGVuZ3RoOiAlZFx0ZmxhZ3M6ICV4XG4iLCAKLQkJCQkrK2ksIG9mZnNldCwgc2NoLT50eXBlLCBodG9ucyhzY2gtPmxlbmd0aCksIHNjaC0+ZmxhZ3MpOwotCi0JCW9mZnNldCArPSAoaHRvbnMoc2NoLT5sZW5ndGgpICsgMykgJiB+MzsKLQotCQlkdXByaW50Zigic2tiLT5sZW46ICVkXHRvZmZzZXQ6ICVkXG4iLCBza2ItPmxlbiwgb2Zmc2V0KTsKLQotCQlpZiAoU0NUUF9DSFVOS01BUF9JU19TRVQoY2h1bmttYXAsIHNjaC0+dHlwZSkpIHsKLQkJCXN3aXRjaCAoY2h1bmtfbWF0Y2hfdHlwZSkgewotCQkJY2FzZSBTQ1RQX0NIVU5LX01BVENIX0FOWToKLQkJCQlpZiAobWF0Y2hfZmxhZ3MoZmxhZ19pbmZvLCBmbGFnX2NvdW50LCAKLQkJCQkJc2NoLT50eXBlLCBzY2gtPmZsYWdzKSkgewotCQkJCQlyZXR1cm4gMTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU0NUUF9DSFVOS19NQVRDSF9BTEw6Ci0JCQkJaWYgKG1hdGNoX2ZsYWdzKGZsYWdfaW5mbywgZmxhZ19jb3VudCwgCi0JCQkJCXNjaC0+dHlwZSwgc2NoLT5mbGFncykpIHsKLQkJCQkJU0NUUF9DSFVOS01BUF9DTEVBUihjaHVua21hcGNvcHksIHNjaC0+dHlwZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNDVFBfQ0hVTktfTUFUQ0hfT05MWToKLQkJCQlpZiAoIW1hdGNoX2ZsYWdzKGZsYWdfaW5mbywgZmxhZ19jb3VudCwgCi0JCQkJCXNjaC0+dHlwZSwgc2NoLT5mbGFncykpIHsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJc3dpdGNoIChjaHVua19tYXRjaF90eXBlKSB7Ci0JCQljYXNlIFNDVFBfQ0hVTktfTUFUQ0hfT05MWToKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCX0gd2hpbGUgKG9mZnNldCA8IHNrYi0+bGVuKTsKLQotCXN3aXRjaCAoY2h1bmtfbWF0Y2hfdHlwZSkgewotCWNhc2UgU0NUUF9DSFVOS19NQVRDSF9BTEw6Ci0JCXJldHVybiBTQ1RQX0NIVU5LTUFQX0lTX0NMRUFSKGNodW5rbWFwKTsKLQljYXNlIFNDVFBfQ0hVTktfTUFUQ0hfQU5ZOgotCQlyZXR1cm4gMDsKLQljYXNlIFNDVFBfQ0hVTktfTUFUQ0hfT05MWToKLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyogVGhpcyB3aWxsIG5ldmVyIGJlIHJlYWNoZWQsIGJ1dCByZXF1aXJlZCB0byBzdG9wIGNvbXBpbGVyIHdoaW5lICovCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgaW50IG9mZnNldCwKLSAgICAgIGludCAqaG90ZHJvcCkKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X3NjdHBfaW5mbyAqaW5mbzsKLQlzY3RwX3NjdHBoZHJfdCBfc2gsICpzaDsKLQotCWluZm8gPSAoY29uc3Qgc3RydWN0IGlwdF9zY3RwX2luZm8gKiltYXRjaGluZm87Ci0KLQlpZiAob2Zmc2V0KSB7Ci0JCWR1cHJpbnRmKCJEcm9wcGluZyBub24tZmlyc3QgZnJhZ21lbnQuLiBGSVhNRVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQkKLQlzaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwqNCwgc2l6ZW9mKF9zaCksICZfc2gpOwotCWlmIChzaCA9PSBOVUxMKSB7Ci0JCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIFRDUCBvZmZzZXQ9MCB0aW55Z3JhbS5cbiIpOwotCQkqaG90ZHJvcCA9IDE7Ci0JCXJldHVybiAwOwotICAgICAgIAl9Ci0JZHVwcmludGYoInNwdDogJWRcdGRwdDogJWRcbiIsIG50b2hzKHNoLT5zb3VyY2UpLCBudG9ocyhzaC0+ZGVzdCkpOwotCi0JcmV0dXJuICBTQ0NIRUNLKCgobnRvaHMoc2gtPnNvdXJjZSkgPj0gaW5mby0+c3B0c1swXSkgCi0JCQkmJiAobnRvaHMoc2gtPnNvdXJjZSkgPD0gaW5mby0+c3B0c1sxXSkpLCAKLQkJICAgCUlQVF9TQ1RQX1NSQ19QT1JUUywgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKQotCQkmJiBTQ0NIRUNLKCgobnRvaHMoc2gtPmRlc3QpID49IGluZm8tPmRwdHNbMF0pIAotCQkJJiYgKG50b2hzKHNoLT5kZXN0KSA8PSBpbmZvLT5kcHRzWzFdKSksIAotCQkJSVBUX1NDVFBfREVTVF9QT1JUUywgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKQotCQkmJiBTQ0NIRUNLKG1hdGNoX3BhY2tldChza2IsIGluZm8tPmNodW5rbWFwLCBpbmZvLT5jaHVua19tYXRjaF90eXBlLAotIAkJCQkJaW5mby0+ZmxhZ19pbmZvLCBpbmZvLT5mbGFnX2NvdW50LCAKLQkJCQkJaG90ZHJvcCksCi0JCQkgICBJUFRfU0NUUF9DSFVOS19UWVBFUywgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKTsKLX0KLQotc3RhdGljIGludAotY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCi0JICAgdm9pZCAqbWF0Y2hpbmZvLAotCSAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0JICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X3NjdHBfaW5mbyAqaW5mbzsKLQotCWluZm8gPSAoY29uc3Qgc3RydWN0IGlwdF9zY3RwX2luZm8gKiltYXRjaGluZm87Ci0KLQlyZXR1cm4gaXAtPnByb3RvID09IElQUFJPVE9fU0NUUAotCQkmJiAhKGlwLT5pbnZmbGFncyAmIElQVF9JTlZfUFJPVE8pCi0JCSYmIG1hdGNoc2l6ZSA9PSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc2N0cF9pbmZvKSkKLQkJJiYgIShpbmZvLT5mbGFncyAmIH5JUFRfU0NUUF9WQUxJRF9GTEFHUykKLQkJJiYgIShpbmZvLT5pbnZmbGFncyAmIH5JUFRfU0NUUF9WQUxJRF9GTEFHUykKLQkJJiYgIShpbmZvLT5pbnZmbGFncyAmIH5pbmZvLT5mbGFncykKLQkJJiYgKCghKGluZm8tPmZsYWdzICYgSVBUX1NDVFBfQ0hVTktfVFlQRVMpKSB8fCAKLQkJCShpbmZvLT5jaHVua19tYXRjaF90eXBlICYKLQkJCQkoU0NUUF9DSFVOS19NQVRDSF9BTEwgCi0JCQkJfCBTQ1RQX0NIVU5LX01BVENIX0FOWQotCQkJCXwgU0NUUF9DSFVOS19NQVRDSF9PTkxZKSkpOwotfQotCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBzY3RwX21hdGNoID0gCi17IAotCS5saXN0ID0geyBOVUxMLCBOVUxMfSwKLQkubmFtZSA9ICJzY3RwIiwKLQkubWF0Y2ggPSAmbWF0Y2gsCi0JLmNoZWNrZW50cnkgPSAmY2hlY2tlbnRyeSwKLQkuZGVzdHJveSA9IE5VTEwsCi0JLm1lID0gVEhJU19NT0RVTEUKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZzY3RwX21hdGNoKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKLXsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmc2N0cF9tYXRjaCk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIktpcmFuIEt1bWFyIEltbWlkaSIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXRjaCBmb3IgU0NUUCBwcm90b2NvbCBwYWNrZXRzIik7Ci0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfc3RhdGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfc3RhdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3ZjE2Yi4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3N0YXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKiBLZXJuZWwgbW9kdWxlIHRvIG1hdGNoIGNvbm5lY3Rpb24gdHJhY2tpbmcgaW5mb3JtYXRpb24uICovCi0KLS8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKLSAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfc3RhdGUuaD4KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVzdGNvcnAuY29tLmF1PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBjb25uZWN0aW9uIHRyYWNraW5nIHN0YXRlIG1hdGNoIG1vZHVsZSIpOwotCi1zdGF0aWMgaW50Ci1tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLSAgICAgIGludCBvZmZzZXQsCi0gICAgICBpbnQgKmhvdGRyb3ApCi17Ci0JY29uc3Qgc3RydWN0IGlwdF9zdGF0ZV9pbmZvICpzaW5mbyA9IG1hdGNoaW5mbzsKLQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLQl1bnNpZ25lZCBpbnQgc3RhdGViaXQ7Ci0KLQlpZiAobmZfY3RfaXNfdW50cmFja2VkKHNrYikpCi0JCXN0YXRlYml0ID0gSVBUX1NUQVRFX1VOVFJBQ0tFRDsKLQllbHNlIGlmICghbmZfY3RfZ2V0X2N0aW5mbyhza2IsICZjdGluZm8pKQotCQlzdGF0ZWJpdCA9IElQVF9TVEFURV9JTlZBTElEOwotCWVsc2UKLQkJc3RhdGViaXQgPSBJUFRfU1RBVEVfQklUKGN0aW5mbyk7Ci0KLQlyZXR1cm4gKHNpbmZvLT5zdGF0ZW1hc2sgJiBzdGF0ZWJpdCk7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCi0JCSB2b2lkICptYXRjaGluZm8sCi0JCSB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAotCQkgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLQlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9zdGF0ZV9pbmZvKSkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIHN0YXRlX21hdGNoID0gewotCS5uYW1lCQk9ICJzdGF0ZSIsCi0JLm1hdGNoCQk9ICZtYXRjaCwKLQkuY2hlY2tlbnRyeQk9ICZjaGVjaywKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JbmVlZF9pcF9jb25udHJhY2soKTsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZzdGF0ZV9tYXRjaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCi17Ci0JaXB0X3VucmVnaXN0ZXJfbWF0Y2goJnN0YXRlX21hdGNoKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfc3RyaW5nLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3N0cmluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWRlZjIwLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfc3RyaW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKiBTdHJpbmcgbWF0Y2hpbmcgbWF0Y2ggZm9yIGlwdGFibGVzCi0gKiAKLSAqIChDKSAyMDA1IFBhYmxvIE5laXJhIEF5dXNvIDxwYWJsb0BldXJvZGV2Lm5ldD4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3RleHRzZWFyY2guaD4KLQotTU9EVUxFX0FVVEhPUigiUGFibG8gTmVpcmEgQXl1c28gPHBhYmxvQGV1cm9kZXYubmV0PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJJUCB0YWJsZXMgc3RyaW5nIG1hdGNoIG1vZHVsZSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgaW50IG1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotCQkgaW50IG9mZnNldCwKLQkJIGludCAqaG90ZHJvcCkKLXsKLQlzdHJ1Y3QgdHNfc3RhdGUgc3RhdGU7Ci0Jc3RydWN0IGlwdF9zdHJpbmdfaW5mbyAqY29uZiA9IChzdHJ1Y3QgaXB0X3N0cmluZ19pbmZvICopIG1hdGNoaW5mbzsKLQotCW1lbXNldCgmc3RhdGUsIDAsIHNpemVvZihzdHJ1Y3QgdHNfc3RhdGUpKTsKLQotCXJldHVybiAoc2tiX2ZpbmRfdGV4dCgoc3RydWN0IHNrX2J1ZmYgKilza2IsIGNvbmYtPmZyb21fb2Zmc2V0LCAKLQkJCSAgICAgY29uZi0+dG9fb2Zmc2V0LCBjb25mLT5jb25maWcsICZzdGF0ZSkgCi0JCQkgICAgICE9IFVJTlRfTUFYKSAmJiAhY29uZi0+aW52ZXJ0OwotfQotCi0jZGVmaW5lIFNUUklOR19URVhUX1BSSVYobSkgKChzdHJ1Y3QgaXB0X3N0cmluZ19pbmZvICopIG0pCi0KLXN0YXRpYyBpbnQgY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSAgICAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAotCQkgICAgICB2b2lkICptYXRjaGluZm8sCi0JCSAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0JCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0Jc3RydWN0IGlwdF9zdHJpbmdfaW5mbyAqY29uZiA9IG1hdGNoaW5mbzsKLQlzdHJ1Y3QgdHNfY29uZmlnICp0c19jb25mOwotCi0JaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc3RyaW5nX2luZm8pKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBEYW1uLCBjYW4ndCBoYW5kbGUgdGhpcyBjYXNlIHByb3Blcmx5IHdpdGggaXB0YWJsZXMuLi4gKi8KLQlpZiAoY29uZi0+ZnJvbV9vZmZzZXQgPiBjb25mLT50b19vZmZzZXQpCi0JCXJldHVybiAwOwotCi0JdHNfY29uZiA9IHRleHRzZWFyY2hfcHJlcGFyZShjb25mLT5hbGdvLCBjb25mLT5wYXR0ZXJuLCBjb25mLT5wYXRsZW4sCi0JCQkJICAgICBHRlBfS0VSTkVMLCBUU19BVVRPTE9BRCk7Ci0JaWYgKElTX0VSUih0c19jb25mKSkKLQkJcmV0dXJuIDA7Ci0KLQljb25mLT5jb25maWcgPSB0c19jb25mOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlc3Ryb3kodm9pZCAqbWF0Y2hpbmZvLCB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplKQotewotCXRleHRzZWFyY2hfZGVzdHJveShTVFJJTkdfVEVYVF9QUklWKG1hdGNoaW5mbyktPmNvbmZpZyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIHN0cmluZ19tYXRjaCA9IHsKLQkubmFtZSAJCT0gInN0cmluZyIsCi0JLm1hdGNoIAkJPSBtYXRjaCwKLQkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCi0JLmRlc3Ryb3kgCT0gZGVzdHJveSwKLQkubWUgCQk9IFRISVNfTU9EVUxFCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmc3RyaW5nX21hdGNoKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKLXsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmc3RyaW5nX21hdGNoKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdGNwbXNzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3RjcG1zcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGM5YjE2Li4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdGNwbXNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBUQ1AgTVNTIHZhbHVlcy4gKi8KLQotLyogQ29weXJpZ2h0IChDKSAyMDAwIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPG5ldC90Y3AuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF90Y3Btc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLQotI2RlZmluZSBUSF9TWU4gMHgwMgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgVENQIE1TUyBtYXRjaCBtb2R1bGUiKTsKLQotLyogUmV0dXJucyAxIGlmIHRoZSBtc3Mgb3B0aW9uIGlzIHNldCBhbmQgbWF0Y2hlZCBieSB0aGUgcmFuZ2UsIDAgb3RoZXJ3aXNlICovCi1zdGF0aWMgaW5saW5lIGludAotbXNzb3B0aW9uX21hdGNoKHVfaW50MTZfdCBtaW4sIHVfaW50MTZfdCBtYXgsCi0JCWNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCWludCBpbnZlcnQsCi0JCWludCAqaG90ZHJvcCkKLXsKLQlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7Ci0JLyogdGNwLmRvZmYgaXMgb25seSA0IGJpdHMsIGllLiBtYXggMTUgKiA0IGJ5dGVzICovCi0JdTggX29wdFsxNSAqIDQgLSBzaXplb2YoX3RjcGgpXSwgKm9wOwotCXVuc2lnbmVkIGludCBpLCBvcHRsZW47Ci0KLQkvKiBJZiB3ZSBkb24ndCBoYXZlIHRoZSB3aG9sZSBoZWFkZXIsIGRyb3AgcGFja2V0LiAqLwotCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2tiLT5uaC5pcGgtPmlobCAqIDQsCi0JCQkJc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKLQlpZiAodGggPT0gTlVMTCkKLQkJZ290byBkcm9waXQ7Ci0KLQkvKiBNYWxmb3JtZWQuICovCi0JaWYgKHRoLT5kb2ZmKjQgPCBzaXplb2YoKnRoKSkKLQkJZ290byBkcm9waXQ7Ci0KLQlvcHRsZW4gPSB0aC0+ZG9mZio0IC0gc2l6ZW9mKCp0aCk7Ci0JaWYgKCFvcHRsZW4pCi0JCWdvdG8gb3V0OwotCi0JLyogVHJ1bmNhdGVkIG9wdGlvbnMuICovCi0Jb3AgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsICogNCArIHNpemVvZigqdGgpLAotCQkJCW9wdGxlbiwgX29wdCk7Ci0JaWYgKG9wID09IE5VTEwpCi0JCWdvdG8gZHJvcGl0OwotCi0JZm9yIChpID0gMDsgaSA8IG9wdGxlbjsgKSB7Ci0JCWlmIChvcFtpXSA9PSBUQ1BPUFRfTVNTCi0JCSAgICAmJiAob3B0bGVuIC0gaSkgPj0gVENQT0xFTl9NU1MKLQkJICAgICYmIG9wW2krMV0gPT0gVENQT0xFTl9NU1MpIHsKLQkJCXVfaW50MTZfdCBtc3N2YWw7Ci0KLQkJCW1zc3ZhbCA9IChvcFtpKzJdIDw8IDgpIHwgb3BbaSszXTsKLQkJCQotCQkJcmV0dXJuIChtc3N2YWwgPj0gbWluICYmIG1zc3ZhbCA8PSBtYXgpIF4gaW52ZXJ0OwotCQl9Ci0JCWlmIChvcFtpXSA8IDIpIGkrKzsKLQkJZWxzZSBpICs9IG9wW2krMV0/OjE7Ci0JfQotb3V0OgotCXJldHVybiBpbnZlcnQ7Ci0KLSBkcm9waXQ6Ci0JKmhvdGRyb3AgPSAxOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLSAgICAgIGludCBvZmZzZXQsCi0gICAgICBpbnQgKmhvdGRyb3ApCi17Ci0JY29uc3Qgc3RydWN0IGlwdF90Y3Btc3NfbWF0Y2hfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKLQotCXJldHVybiBtc3NvcHRpb25fbWF0Y2goaW5mby0+bXNzX21pbiwgaW5mby0+bXNzX21heCwgc2tiLAotCQkJICAgICAgIGluZm8tPmludmVydCwgaG90ZHJvcCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKLSAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3RjcG1zc19tYXRjaF9pbmZvKSkpCi0JCXJldHVybiAwOwotCi0JLyogTXVzdCBzcGVjaWZ5IC1wIHRjcCAqLwotCWlmIChpcC0+cHJvdG8gIT0gSVBQUk9UT19UQ1AgfHwgKGlwLT5pbnZmbGFncyAmIElQVF9JTlZfUFJPVE8pKSB7Ci0JCXByaW50aygidGNwbXNzOiBPbmx5IHdvcmtzIG9uIFRDUCBwYWNrZXRzXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIHRjcG1zc19tYXRjaCA9IHsKLQkubmFtZQkJPSAidGNwbXNzIiwKLQkubWF0Y2gJCT0gJm1hdGNoLAotCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCi0JLm1lCQk9IFRISVNfTU9EVUxFLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQotewotCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJnRjcG1zc19tYXRjaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCi17Ci0JaXB0X3VucmVnaXN0ZXJfbWF0Y2goJnRjcG1zc19tYXRjaCk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3Rvcy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90b3MuYwppbmRleCAwODZhMWJiLi45YWI3NjVlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3Rvcy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdG9zLmMKQEAgLTIzLDYgKzIzLDcgQEAKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCiAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCiAgICAgICBpbnQgKmhvdGRyb3ApCiB7CiAJY29uc3Qgc3RydWN0IGlwdF90b3NfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKQEAgLTMyLDcgKzMzLDcgQEAKIAogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0gICAgICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorICAgICAgICAgICBjb25zdCB2b2lkICppcCwKICAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90dGwuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdHRsLmMKaW5kZXggMjE5YWE5ZC4uODJkYTUzZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90dGwuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3R0bC5jCkBAIC0yMSw3ICsyMSw3IEBACiAKIHN0YXRpYyBpbnQgbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAogCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotCQkgaW50IG9mZnNldCwgaW50ICpob3Rkcm9wKQorCQkgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsIGludCAqaG90ZHJvcCkKIHsKIAljb25zdCBzdHJ1Y3QgaXB0X3R0bF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwogCkBAIC00Nyw3ICs0Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorc3RhdGljIGludCBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAgKmlwLAogCQkgICAgICB2b2lkICptYXRjaGluZm8sIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9maWx0ZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX2ZpbHRlci5jCmluZGV4IDI2MGE0ZjAuLjIxMmEzMDcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX2ZpbHRlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX2ZpbHRlci5jCkBAIC03OCw3ICs3OCw4IEBACiAJLm5hbWUJCT0gImZpbHRlciIsCiAJLnZhbGlkX2hvb2tzCT0gRklMVEVSX1ZBTElEX0hPT0tTLAogCS5sb2NrCQk9IFJXX0xPQ0tfVU5MT0NLRUQsCi0JLm1lCQk9IFRISVNfTU9EVUxFCisJLm1lCQk9IFRISVNfTU9EVUxFLAorCS5hZgkJPSBBRl9JTkVULAogfTsKIAogLyogVGhlIHdvcmsgY29tZXMgaW4gaGVyZSBmcm9tIG5ldGZpbHRlci5jLiAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfbWFuZ2xlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYwppbmRleCAxNjBlYjExLi4zMjEyYTVjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYwpAQCAtMTA5LDYgKzEwOSw3IEBACiAJLnZhbGlkX2hvb2tzCT0gTUFOR0xFX1ZBTElEX0hPT0tTLAogCS5sb2NrCQk9IFJXX0xPQ0tfVU5MT0NLRUQsCiAJLm1lCQk9IFRISVNfTU9EVUxFLAorCS5hZgkJPSBBRl9JTkVULAogfTsKIAogLyogVGhlIHdvcmsgY29tZXMgaW4gaGVyZSBmcm9tIG5ldGZpbHRlci5jLiAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfcmF3LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9yYXcuYwppbmRleCA0NzQ0OWJhLi5mZGI5ZTljIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9yYXcuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9yYXcuYwpAQCAtODMsNyArODMsOCBAQAogCS5uYW1lID0gInJhdyIsIAogCS52YWxpZF9ob29rcyA9ICBSQVdfVkFMSURfSE9PS1MsIAogCS5sb2NrID0gUldfTE9DS19VTkxPQ0tFRCwgCi0JLm1lID0gVEhJU19NT0RVTEUKKwkubWUgPSBUSElTX01PRFVMRSwKKwkuYWYgPSBBRl9JTkVULAogfTsKIAogLyogVGhlIHdvcmsgY29tZXMgaW4gaGVyZSBmcm9tIG5ldGZpbHRlci5jLiAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMKaW5kZXggOWJkYmI3Ny4uMTY3NjE5ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NC5jCkBAIC0yNzcsNyArMjc3LDcgQEAKIAogI2lmZGVmIENPTkZJR19TWVNDVEwKIC8qIEZyb20gbmZfY29ubnRyYWNrX3Byb3RvX2ljbXAuYyAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbmZfY3RfaWNtcF90aW1lb3V0OworZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jdF9pY21wX3RpbWVvdXQ7CiBzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKm5mX2N0X2lwdjRfc3lzY3RsX2hlYWRlcjsKIAogc3RhdGljIGN0bF90YWJsZSBuZl9jdF9zeXNjdGxfdGFibGVbXSA9IHsKQEAgLTU3NSw3ICs1NzUsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7Ci0JbmVlZF9uZl9jb25udHJhY2soKTsKKwluZWVkX2Nvbm50cmFjaygpOwogCXJldHVybiBpbml0X29yX2NsZWFudXAoMSk7CiB9CiAKQEAgLTU4Nyw5ICs1ODcsNCBAQAogbW9kdWxlX2luaXQoaW5pdCk7CiBtb2R1bGVfZXhpdChmaW5pKTsKIAotdm9pZCBuZWVkX2lwX2Nvbm50cmFjayh2b2lkKQotewotfQotCi1FWFBPUlRfU1lNQk9MKG5lZWRfaXBfY29ubnRyYWNrKTsKIEVYUE9SVF9TWU1CT0wobmZfY3RfaXB2NF9nYXRoZXJfZnJhZ3MpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcmF3LmMgYi9uZXQvaXB2NC9yYXcuYwppbmRleCA0YjBkN2U0Li5mMjlhMTJkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9yYXcuYworKysgYi9uZXQvaXB2NC9yYXcuYwpAQCAtNDAsMTIgKzQwLDEyIEBACiAgKi8KICAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4gCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KQEAgLTI1NSw2ICsyNTUsNyBAQAogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIE5FVF9SWF9EUk9QOwogCX0KKwluZl9yZXNldChza2IpOwogCiAJc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2ItPm5oLnJhdyk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3JvdXRlLmMgYi9uZXQvaXB2NC9yb3V0ZS5jCmluZGV4IGY3MDFhMTMuLmQ4MmMyNDIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3JvdXRlLmMKKysrIGIvbmV0L2lwdjQvcm91dGUuYwpAQCAtMjQwLDkgKzI0MCw5IEBACiBzdGF0aWMgaW50CQkJcnRfaGFzaF9sb2c7CiBzdGF0aWMgdW5zaWduZWQgaW50CQlydF9oYXNoX3JuZDsKIAotc3RhdGljIHN0cnVjdCBydF9jYWNoZV9zdGF0ICpydF9jYWNoZV9zdGF0OwotI2RlZmluZSBSVF9DQUNIRV9TVEFUX0lOQyhmaWVsZCkJCQkJCSAgXAotCQkocGVyX2NwdV9wdHIocnRfY2FjaGVfc3RhdCwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSktPmZpZWxkKyspCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHJ0X2NhY2hlX3N0YXQsIHJ0X2NhY2hlX3N0YXQpOworI2RlZmluZSBSVF9DQUNIRV9TVEFUX0lOQyhmaWVsZCkgXAorCShwZXJfY3B1KHJ0X2NhY2hlX3N0YXQsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpLmZpZWxkKyspCiAKIHN0YXRpYyBpbnQgcnRfaW50ZXJuX2hhc2godW5zaWduZWQgaGFzaCwgc3RydWN0IHJ0YWJsZSAqcnRoLAogCQkJCXN0cnVjdCBydGFibGUgKipyZXMpOwpAQCAtNDAxLDcgKzQwMSw3IEBACiAJCWlmICghY3B1X3Bvc3NpYmxlKGNwdSkpCiAJCQljb250aW51ZTsKIAkJKnBvcyA9IGNwdSsxOwotCQlyZXR1cm4gcGVyX2NwdV9wdHIocnRfY2FjaGVfc3RhdCwgY3B1KTsKKwkJcmV0dXJuICZwZXJfY3B1KHJ0X2NhY2hlX3N0YXQsIGNwdSk7CiAJfQogCXJldHVybiBOVUxMOwogfQpAQCAtNDE0LDcgKzQxNCw3IEBACiAJCWlmICghY3B1X3Bvc3NpYmxlKGNwdSkpCiAJCQljb250aW51ZTsKIAkJKnBvcyA9IGNwdSsxOwotCQlyZXR1cm4gcGVyX2NwdV9wdHIocnRfY2FjaGVfc3RhdCwgY3B1KTsKKwkJcmV0dXJuICZwZXJfY3B1KHJ0X2NhY2hlX3N0YXQsIGNwdSk7CiAJfQogCXJldHVybiBOVUxMOwogCQpAQCAtMzE2MCwxMCArMzE2MCw2IEBACiAJaXB2NF9kc3Rfb3BzLmdjX3RocmVzaCA9IChydF9oYXNoX21hc2sgKyAxKTsKIAlpcF9ydF9tYXhfc2l6ZSA9IChydF9oYXNoX21hc2sgKyAxKSAqIDE2OwogCi0JcnRfY2FjaGVfc3RhdCA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgcnRfY2FjaGVfc3RhdCk7Ci0JaWYgKCFydF9jYWNoZV9zdGF0KQotCQlyZXR1cm4gLUVOT01FTTsKLQogCWRldmluZXRfaW5pdCgpOwogCWlwX2ZpYl9pbml0KCk7CiAKQEAgLTMxOTEsNyArMzE4Nyw2IEBACiAJaWYgKCFwcm9jX25ldF9mb3BzX2NyZWF0ZSgicnRfY2FjaGUiLCBTX0lSVUdPLCAmcnRfY2FjaGVfc2VxX2ZvcHMpIHx8CiAJICAgICEocnRzdGF0X3BkZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJydF9jYWNoZSIsIFNfSVJVR08sIAogCQkJICAgIAkJICAgICBwcm9jX25ldF9zdGF0KSkpIHsKLQkJZnJlZV9wZXJjcHUocnRfY2FjaGVfc3RhdCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlydHN0YXRfcGRlLT5wcm9jX2ZvcHMgPSAmcnRfY3B1X3NlcV9mb3BzOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lucHV0LmMgYi9uZXQvaXB2NC90Y3BfaW5wdXQuYwppbmRleCAwYTQ2MTIzLi5hOTdlZDU0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaW5wdXQuYworKysgYi9uZXQvaXB2NC90Y3BfaW5wdXQuYwpAQCAtMzM0Nyw3ICszMzQ3LDcgQEAKIAkJCWludCBvZmZzZXQgPSBzdGFydCAtIFRDUF9TS0JfQ0Ioc2tiKS0+c2VxOwogCQkJaW50IHNpemUgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgLSBzdGFydDsKIAotCQkJaWYgKG9mZnNldCA8IDApIEJVRygpOworCQkJQlVHX09OKG9mZnNldCA8IDApOwogCQkJaWYgKHNpemUgPiAwKSB7CiAJCQkJc2l6ZSA9IG1pbihjb3B5LCBzaXplKTsKIAkJCQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIG9mZnNldCwgc2tiX3B1dChuc2tiLCBzaXplKSwgc2l6ZSkpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaXB2NC5jIGIvbmV0L2lwdjQvdGNwX2lwdjQuYwppbmRleCBlOWY4M2U1Li42ZWEzNTM5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaXB2NC5jCisrKyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKQEAgLTEwODAsNiArMTA4MCw3IEBACiAKIAlpZiAoIXhmcm00X3BvbGljeV9jaGVjayhzaywgWEZSTV9QT0xJQ1lfSU4sIHNrYikpCiAJCWdvdG8gZGlzY2FyZF9hbmRfcmVsc2U7CisJbmZfcmVzZXQoc2tiKTsKIAogCWlmIChza19maWx0ZXIoc2ssIHNrYiwgMCkpCiAJCWdvdG8gZGlzY2FyZF9hbmRfcmVsc2U7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC91ZHAuYyBiL25ldC9pcHY0L3VkcC5jCmluZGV4IDIyM2FiYWEuLjAwODQwNDcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3VkcC5jCisrKyBiL25ldC9pcHY0L3VkcC5jCkBAIC05ODksNiArOTg5LDcgQEAKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAtMTsKIAl9CisJbmZfcmVzZXQoc2tiKTsKIAogCWlmICh1cC0+ZW5jYXBfdHlwZSkgewogCQkvKgpAQCAtMTE0OSw2ICsxMTUwLDcgQEAKIAogCWlmICgheGZybTRfcG9saWN5X2NoZWNrKE5VTEwsIFhGUk1fUE9MSUNZX0lOLCBza2IpKQogCQlnb3RvIGRyb3A7CisJbmZfcmVzZXQoc2tiKTsKIAogCS8qIE5vIHNvY2tldC4gRHJvcCBwYWNrZXQgc2lsZW50bHksIGlmIGNoZWNrc3VtIGlzIHdyb25nICovCiAJaWYgKHVkcF9jaGVja3N1bV9jb21wbGV0ZShza2IpKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQveGZybTRfaW5wdXQuYyBiL25ldC9pcHY0L3hmcm00X2lucHV0LmMKaW5kZXggMmQzODQ5Yy4uODUwZDkxOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQveGZybTRfaW5wdXQuYworKysgYi9uZXQvaXB2NC94ZnJtNF9pbnB1dC5jCkBAIC0xMSw2ICsxMSw4IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgogI2luY2x1ZGUgPG5ldC9pbmV0X2Vjbi5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC94ZnJtLmg+CkBAIC00NSw2ICs0NywyMyBAQAogCXJldHVybiB4ZnJtX3BhcnNlX3NwaShza2IsIG5leHRoZHIsIHNwaSwgc2VxKTsKIH0KIAorI2lmZGVmIENPTkZJR19ORVRGSUxURVIKK3N0YXRpYyBpbmxpbmUgaW50IHhmcm00X3Jjdl9lbmNhcF9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCisJaWYgKHNrYi0+ZHN0ID09IE5VTEwpIHsKKwkJaWYgKGlwX3JvdXRlX2lucHV0KHNrYiwgaXBoLT5kYWRkciwgaXBoLT5zYWRkciwgaXBoLT50b3MsCisJCSAgICAgICAgICAgICAgICAgICBza2ItPmRldikpCisJCQlnb3RvIGRyb3A7CisJfQorCXJldHVybiBkc3RfaW5wdXQoc2tiKTsKK2Ryb3A6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIE5FVF9SWF9EUk9QOworfQorI2VuZGlmCisKIGludCB4ZnJtNF9yY3ZfZW5jYXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgX191MTYgZW5jYXBfdHlwZSkKIHsKIAlpbnQgZXJyOwpAQCAtMTM3LDYgKzE1Niw4IEBACiAJbWVtY3B5KHNrYi0+c3AtPngrc2tiLT5zcC0+bGVuLCB4ZnJtX3ZlYywgeGZybV9ucipzaXplb2Yoc3RydWN0IHNlY19kZWNhcF9zdGF0ZSkpOwogCXNrYi0+c3AtPmxlbiArPSB4ZnJtX25yOwogCisJbmZfcmVzZXQoc2tiKTsKKwogCWlmIChkZWNhcHMpIHsKIAkJaWYgKCEoc2tiLT5kZXYtPmZsYWdzJklGRl9MT09QQkFDSykpIHsKIAkJCWRzdF9yZWxlYXNlKHNrYi0+ZHN0KTsKQEAgLTE0NSw3ICsxNjYsMTcgQEAKIAkJbmV0aWZfcngoc2tiKTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIHsKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSCisJCV9fc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2ItPm5oLnJhdyk7CisJCXNrYi0+bmguaXBoLT50b3RfbGVuID0gaHRvbnMoc2tiLT5sZW4pOworCQlpcF9zZW5kX2NoZWNrKHNrYi0+bmguaXBoKTsKKworCQlORl9IT09LKFBGX0lORVQsIE5GX0lQX1BSRV9ST1VUSU5HLCBza2IsIHNrYi0+ZGV2LCBOVUxMLAorCQkgICAgICAgIHhmcm00X3Jjdl9lbmNhcF9maW5pc2gpOworCQlyZXR1cm4gMDsKKyNlbHNlCiAJCXJldHVybiAtc2tiLT5uaC5pcGgtPnByb3RvY29sOworI2VuZGlmCiAJfQogCiBkcm9wX3VubG9jazoKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3hmcm00X291dHB1dC5jIGIvbmV0L2lwdjQveGZybTRfb3V0cHV0LmMKaW5kZXggNjY2MjBhOS4uZDRkZjBkZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQveGZybTRfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQveGZybTRfb3V0cHV0LmMKQEAgLTgsOCArOCwxMCBAQAogICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CiAjaW5jbHVkZSA8bmV0L2luZXRfZWNuLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L3hmcm0uaD4KQEAgLTk1LDcgKzk3LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgeGZybTRfb3V0cHV0KHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IHhmcm00X291dHB1dF9vbmUoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2ItPmRzdDsKIAlzdHJ1Y3QgeGZybV9zdGF0ZSAqeCA9IGRzdC0+eGZybTsKQEAgLTExMywyNyArMTE1LDMzIEBACiAJCQlnb3RvIGVycm9yX25vbG9jazsKIAl9CiAKLQlzcGluX2xvY2tfYmgoJngtPmxvY2spOwotCWVyciA9IHhmcm1fc3RhdGVfY2hlY2soeCwgc2tiKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycm9yOworCWRvIHsKKwkJc3Bpbl9sb2NrX2JoKCZ4LT5sb2NrKTsKKwkJZXJyID0geGZybV9zdGF0ZV9jaGVjayh4LCBza2IpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJvcjsKIAotCXhmcm00X2VuY2FwKHNrYik7CisJCXhmcm00X2VuY2FwKHNrYik7CiAKLQllcnIgPSB4LT50eXBlLT5vdXRwdXQoeCwgc2tiKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycm9yOworCQllcnIgPSB4LT50eXBlLT5vdXRwdXQoeCwgc2tiKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyb3I7CiAKLQl4LT5jdXJsZnQuYnl0ZXMgKz0gc2tiLT5sZW47Ci0JeC0+Y3VybGZ0LnBhY2tldHMrKzsKKwkJeC0+Y3VybGZ0LmJ5dGVzICs9IHNrYi0+bGVuOworCQl4LT5jdXJsZnQucGFja2V0cysrOwogCi0Jc3Bpbl91bmxvY2tfYmgoJngtPmxvY2spOworCQlzcGluX3VubG9ja19iaCgmeC0+bG9jayk7CiAJCi0JaWYgKCEoc2tiLT5kc3QgPSBkc3RfcG9wKGRzdCkpKSB7Ci0JCWVyciA9IC1FSE9TVFVOUkVBQ0g7Ci0JCWdvdG8gZXJyb3Jfbm9sb2NrOwotCX0KLQllcnIgPSBORVRfWE1JVF9CWVBBU1M7CisJCWlmICghKHNrYi0+ZHN0ID0gZHN0X3BvcChkc3QpKSkgeworCQkJZXJyID0gLUVIT1NUVU5SRUFDSDsKKwkJCWdvdG8gZXJyb3Jfbm9sb2NrOworCQl9CisJCWRzdCA9IHNrYi0+ZHN0OworCQl4ID0gZHN0LT54ZnJtOworCX0gd2hpbGUgKHggJiYgIXgtPnByb3BzLm1vZGUpOworCisJSVBDQihza2IpLT5mbGFncyB8PSBJUFNLQl9YRlJNX1RSQU5TRk9STUVEOworCWVyciA9IDA7CiAKIG91dF9leGl0OgogCXJldHVybiBlcnI7CkBAIC0xNDMsMyArMTUxLDMzIEBACiAJa2ZyZWVfc2tiKHNrYik7CiAJZ290byBvdXRfZXhpdDsKIH0KKworaW50IHhmcm00X291dHB1dF9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgZXJyOworCisJd2hpbGUgKGxpa2VseSgoZXJyID0geGZybTRfb3V0cHV0X29uZShza2IpKSA9PSAwKSkgeworCQluZl9yZXNldChza2IpOworCisJCWVyciA9IG5mX2hvb2soUEZfSU5FVCwgTkZfSVBfTE9DQUxfT1VULCAmc2tiLCBOVUxMLAorCQkJICAgICAgc2tiLT5kc3QtPmRldiwgZHN0X291dHB1dCk7CisJCWlmICh1bmxpa2VseShlcnIgIT0gMSkpCisJCQlicmVhazsKKworCQlpZiAoIXNrYi0+ZHN0LT54ZnJtKQorCQkJcmV0dXJuIGRzdF9vdXRwdXQoc2tiKTsKKworCQllcnIgPSBuZl9ob29rKFBGX0lORVQsIE5GX0lQX1BPU1RfUk9VVElORywgJnNrYiwgTlVMTCwKKwkJCSAgICAgIHNrYi0+ZHN0LT5kZXYsIHhmcm00X291dHB1dF9maW5pc2gpOworCQlpZiAodW5saWtlbHkoZXJyICE9IDEpKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworaW50IHhmcm00X291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBORl9IT09LKFBGX0lORVQsIE5GX0lQX1BPU1RfUk9VVElORywgc2tiLCBOVUxMLCBza2ItPmRzdC0+ZGV2LAorCQkgICAgICAgeGZybTRfb3V0cHV0X2ZpbmlzaCk7Cit9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC94ZnJtNF9zdGF0ZS5jIGIvbmV0L2lwdjQveGZybTRfc3RhdGUuYwppbmRleCBkMjNlMDdmLi5kYmFiZjgxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC94ZnJtNF9zdGF0ZS5jCisrKyBiL25ldC9pcHY0L3hmcm00X3N0YXRlLmMKQEAgLTQyLDYgKzQyLDIxIEBACiAJeC0+cHJvcHMuc2FkZHIgPSB0bXBsLT5zYWRkcjsKIAlpZiAoeC0+cHJvcHMuc2FkZHIuYTQgPT0gMCkKIAkJeC0+cHJvcHMuc2FkZHIuYTQgPSBzYWRkci0+YTQ7CisJaWYgKHRtcGwtPm1vZGUgJiYgeC0+cHJvcHMuc2FkZHIuYTQgPT0gMCkgeworCQlzdHJ1Y3QgcnRhYmxlICpydDsKKwkgICAgICAgIHN0cnVjdCBmbG93aSBmbF90dW5uZWwgPSB7CisgICAgICAgIAkgICAgICAgIC5ubF91ID0geworICAgICAgICAJCQkuaXA0X3UgPSB7CisJCQkJCS5kYWRkciA9IHgtPmlkLmRhZGRyLmE0LAorCQkJCX0KKwkJCX0KKwkJfTsKKwkJaWYgKCF4ZnJtX2RzdF9sb29rdXAoKHN0cnVjdCB4ZnJtX2RzdCAqKikmcnQsCisJCSAgICAgICAgICAgICAgICAgICAgICZmbF90dW5uZWwsIEFGX0lORVQpKSB7CisJCQl4LT5wcm9wcy5zYWRkci5hNCA9IHJ0LT5ydF9zcmM7CisJCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwkJfQorCX0KIAl4LT5wcm9wcy5tb2RlID0gdG1wbC0+bW9kZTsKIAl4LT5wcm9wcy5yZXFpZCA9IHRtcGwtPnJlcWlkOwogCXgtPnByb3BzLmZhbWlseSA9IEFGX0lORVQ7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9NYWtlZmlsZSBiL25ldC9pcHY2L01ha2VmaWxlCmluZGV4IDk2MDFmZDcuLjQxODc3YWIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L01ha2VmaWxlCisrKyBiL25ldC9pcHY2L01ha2VmaWxlCkBAIC04LDExICs4LDExIEBACiAJCXJvdXRlLm8gaXA2X2ZpYi5vIGlwdjZfc29ja2dsdWUubyBuZGlzYy5vIHVkcC5vIHJhdy5vIFwKIAkJcHJvdG9jb2wubyBpY21wLm8gbWNhc3QubyByZWFzc2VtYmx5Lm8gdGNwX2lwdjYubyBcCiAJCWV4dGhkcnMubyBzeXNjdGxfbmV0X2lwdjYubyBkYXRhZ3JhbS5vIHByb2MubyBcCi0JCWlwNl9mbG93bGFiZWwubyBpcHY2X3N5bXMubyBuZXRmaWx0ZXIubyBcCi0JCWluZXQ2X2Nvbm5lY3Rpb25fc29jay5vCisJCWlwNl9mbG93bGFiZWwubyBpcHY2X3N5bXMubyBpbmV0Nl9jb25uZWN0aW9uX3NvY2subwogCiBpcHY2LSQoQ09ORklHX1hGUk0pICs9IHhmcm02X3BvbGljeS5vIHhmcm02X3N0YXRlLm8geGZybTZfaW5wdXQubyBcCiAJeGZybTZfb3V0cHV0Lm8KK2lwdjYtJChDT05GSUdfTkVURklMVEVSKSArPSBuZXRmaWx0ZXIubwogaXB2Ni1vYmpzICs9ICQoaXB2Ni15KQogCiBvYmotJChDT05GSUdfSU5FVDZfQUgpICs9IGFoNi5vCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9hZGRyY29uZi5jIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwppbmRleCA3MDRmYjczLi5kMzI4ZDU5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9hZGRyY29uZi5jCisrKyBiL25ldC9pcHY2L2FkZHJjb25mLmMKQEAgLTU4LDYgKzU4LDcgQEAKICNpZmRlZiBDT05GSUdfU1lTQ1RMCiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgpAQCAtMTIyOCw3ICsxMjI5LDcgQEAKIAogLyogR2V0cyByZWZlcmVuY2VkIGFkZHJlc3MsIGRlc3Ryb3lzIGlmYWRkciAqLwogCi12b2lkIGFkZHJjb25mX2RhZF9zdG9wKHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCkKK3N0YXRpYyB2b2lkIGFkZHJjb25mX2RhZF9zdG9wKHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCkKIHsKIAlpZiAoaWZwLT5mbGFncyZJRkFfRl9QRVJNQU5FTlQpIHsKIAkJc3Bpbl9sb2NrX2JoKCZpZnAtPmxvY2spOwpAQCAtMjY0Myw3ICsyNjQ0LDcgQEAKIHsKIAlzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnAgPSAoc3RydWN0IGluZXQ2X2lmYWRkciAqKXY7CiAJc2VxX3ByaW50ZihzZXEsCi0JCSAgICIlMDR4JTA0eCUwNHglMDR4JTA0eCUwNHglMDR4JTA0eCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICU4c1xuIiwKKwkJICAgTklQNl9TRVFGTVQgIiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICU4c1xuIiwKIAkJICAgTklQNihpZnAtPmFkZHIpLAogCQkgICBpZnAtPmlkZXYtPmRldi0+aWZpbmRleCwKIAkJICAgaWZwLT5wcmVmaXhfbGVuLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWZfaW5ldDYuYyBiL25ldC9pcHY2L2FmX2luZXQ2LmMKaW5kZXggNjhhZmM1My4uMDY0ZmZhYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWZfaW5ldDYuYworKysgYi9uZXQvaXB2Ni9hZl9pbmV0Ni5jCkBAIC0yMiw2ICsyMiw3IEBACiAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC02ODksMTEgKzY5MCwxMSBAQAogCWlmIChwdHIgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwdHJbMF0gPSBfX2FsbG9jX3BlcmNwdShtaWJzaXplLCBtaWJhbGlnbik7CisJcHRyWzBdID0gX19hbGxvY19wZXJjcHUobWlic2l6ZSk7CiAJaWYgKCFwdHJbMF0pCiAJCWdvdG8gZXJyMDsKIAotCXB0clsxXSA9IF9fYWxsb2NfcGVyY3B1KG1pYnNpemUsIG1pYmFsaWduKTsKKwlwdHJbMV0gPSBfX2FsbG9jX3BlcmNwdShtaWJzaXplKTsKIAlpZiAoIXB0clsxXSkKIAkJZ290byBlcnIxOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9haDYuYyBiL25ldC9pcHY2L2FoNi5jCmluZGV4IDEzY2M3ZjguLmM3OTMyY2IgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FoNi5jCisrKyBiL25ldC9pcHY2L2FoNi5jCkBAIC0zMzIsOCArMzMyLDcgQEAKIAlpZiAoIXgpCiAJCXJldHVybjsKIAotCU5FVERFQlVHKEtFUk5fREVCVUcgInBtdHUgZGlzY292ZXJ5IG9uIFNBIEFILyUwOHgvIgotCQkgIiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eFxuIiwKKwlORVRERUJVRyhLRVJOX0RFQlVHICJwbXR1IGRpc2NvdmVyeSBvbiBTQSBBSC8lMDh4LyIgTklQNl9GTVQgIlxuIiwKIAkJIG50b2hsKGFoLT5zcGkpLCBOSVA2KGlwaC0+ZGFkZHIpKTsKIAogCXhmcm1fc3RhdGVfcHV0KHgpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYW55Y2FzdC5jIGIvbmV0L2lwdjYvYW55Y2FzdC5jCmluZGV4IDZiNzI5NDAuLjg0MGEzM2QgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FueWNhc3QuYworKysgYi9uZXQvaXB2Ni9hbnljYXN0LmMKQEAgLTEzLDYgKzEzLDcgQEAKICAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CkBAIC01MzEsOSArNTMyLDcgQEAKIAlzdHJ1Y3QgYWM2X2l0ZXJfc3RhdGUgKnN0YXRlID0gYWM2X3NlcV9wcml2YXRlKHNlcSk7CiAKIAlzZXFfcHJpbnRmKHNlcSwKLQkJICAgIiUtNGQgJS0xNXMgIgotCQkgICAiJTA0eCUwNHglMDR4JTA0eCUwNHglMDR4JTA0eCUwNHggIgotCQkgICAiJTVkXG4iLAorCQkgICAiJS00ZCAlLTE1cyAiIE5JUDZfU0VRRk1UICIgJTVkXG4iLAogCQkgICBzdGF0ZS0+ZGV2LT5pZmluZGV4LCBzdGF0ZS0+ZGV2LT5uYW1lLAogCQkgICBOSVA2KGltLT5hY2FfYWRkciksCiAJCSAgIGltLT5hY2FfdXNlcnMpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZGF0YWdyYW0uYyBiL25ldC9pcHY2L2RhdGFncmFtLmMKaW5kZXggYzRhM2E5OS4uOTlhNmViMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvZGF0YWdyYW0uYworKysgYi9uZXQvaXB2Ni9kYXRhZ3JhbS5jCkBAIC0xMyw2ICsxMyw3IEBACiAgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9lc3A2LmMgYi9uZXQvaXB2Ni9lc3A2LmMKaW5kZXggNmRlOGVlMS4uN2I1Yjk0ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvZXNwNi5jCisrKyBiL25ldC9pcHY2L2VzcDYuYwpAQCAtMjY2LDggKzI2Niw3IEBACiAJeCA9IHhmcm1fc3RhdGVfbG9va3VwKCh4ZnJtX2FkZHJlc3NfdCAqKSZpcGgtPmRhZGRyLCBlc3BoLT5zcGksIElQUFJPVE9fRVNQLCBBRl9JTkVUNik7CiAJaWYgKCF4KQogCQlyZXR1cm47Ci0JcHJpbnRrKEtFUk5fREVCVUcgInBtdHUgZGlzY292ZXJ5IG9uIFNBIEVTUC8lMDh4LyIKLQkJCSIlMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHhcbiIsIAorCXByaW50ayhLRVJOX0RFQlVHICJwbXR1IGRpc2NvdmVyeSBvbiBTQSBFU1AvJTA4eC8iIE5JUDZfRk1UICJcbiIsIAogCQkJbnRvaGwoZXNwaC0+c3BpKSwgTklQNihpcGgtPmRhZGRyKSk7CiAJeGZybV9zdGF0ZV9wdXQoeCk7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9leHRoZHJzLmMgYi9uZXQvaXB2Ni9leHRoZHJzLmMKaW5kZXggMTEzMzc0ZC4uMmExZTdlNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvZXh0aGRycy5jCisrKyBiL25ldC9pcHY2L2V4dGhkcnMuYwpAQCAtMTUyLDcgKzE1Miw3IEBACiAJey0xLAkJCU5VTEx9CiB9OwogCi1zdGF0aWMgaW50IGlwdjZfZGVzdG9wdF9yY3Yoc3RydWN0IHNrX2J1ZmYgKipza2JwLCB1bnNpZ25lZCBpbnQgKm5ob2ZmcCkKK3N0YXRpYyBpbnQgaXB2Nl9kZXN0b3B0X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqKnNrYnApCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpza2JwOwogCXN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0ID0gSVA2Q0Ioc2tiKTsKQEAgLTE2OSw3ICsxNjksNyBAQAogCiAJaWYgKGlwNl9wYXJzZV90bHYodGx2cHJvY2Rlc3RvcHRfbHN0LCBza2IpKSB7CiAJCXNrYi0+aC5yYXcgKz0gKChza2ItPmgucmF3WzFdKzEpPDwzKTsKLQkJKm5ob2ZmcCA9IG9wdC0+ZHN0MTsKKwkJb3B0LT5uaG9mZiA9IG9wdC0+ZHN0MTsKIAkJcmV0dXJuIDE7CiAJfQogCkBAIC0xOTIsNyArMTkyLDcgQEAKICAgTk9ORSBoZWFkZXIuIE5vIGRhdGEgaW4gcGFja2V0LgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgaW50IGlwdjZfbm9kYXRhX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqKnNrYnAsIHVuc2lnbmVkIGludCAqbmhvZmZwKQorc3RhdGljIGludCBpcHY2X25vZGF0YV9yY3Yoc3RydWN0IHNrX2J1ZmYgKipza2JwKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSAqc2ticDsKIApAQCAtMjE1LDcgKzIxNSw3IEBACiAgIFJvdXRpbmcgaGVhZGVyLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgaW50IGlwdjZfcnRoZHJfcmN2KHN0cnVjdCBza19idWZmICoqc2ticCwgdW5zaWduZWQgaW50ICpuaG9mZnApCitzdGF0aWMgaW50IGlwdjZfcnRoZHJfcmN2KHN0cnVjdCBza19idWZmICoqc2ticCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnNrYnA7CiAJc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQgPSBJUDZDQihza2IpOwpAQCAtMjQ5LDcgKzI0OSw3IEBACiAJCXNrYi0+aC5yYXcgKz0gKGhkci0+aGRybGVuICsgMSkgPDwgMzsKIAkJb3B0LT5kc3QwID0gb3B0LT5kc3QxOwogCQlvcHQtPmRzdDEgPSAwOwotCQkqbmhvZmZwID0gKCZoZHItPm5leHRoZHIpIC0gc2tiLT5uaC5yYXc7CisJCW9wdC0+bmhvZmYgPSAoJmhkci0+bmV4dGhkcikgLSBza2ItPm5oLnJhdzsKIAkJcmV0dXJuIDE7CiAJfQogCkBAIC00ODcsOSArNDg3LDE0IEBACiAKIGludCBpcHY2X3BhcnNlX2hvcG9wdHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG5ob2ZmKQogewotCUlQNkNCKHNrYiktPmhvcCA9IHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7Ci0JaWYgKGlwNl9wYXJzZV90bHYodGx2cHJvY2hvcG9wdF9sc3QsIHNrYikpCisJc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQgPSBJUDZDQihza2IpOworCisJb3B0LT5ob3AgPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCWlmIChpcDZfcGFyc2VfdGx2KHRsdnByb2Nob3BvcHRfbHN0LCBza2IpKSB7CisJCXNrYi0+aC5yYXcgKz0gKHNrYi0+aC5yYXdbMV0rMSk8PDM7CisJCW9wdC0+bmhvZmYgPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOwogCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKKwl9CiAJcmV0dXJuIC0xOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pY21wLmMgYi9uZXQvaXB2Ni9pY21wLmMKaW5kZXggNmVjNmEyYi4uZmNmODgzMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaWNtcC5jCisrKyBiL25ldC9pcHY2L2ljbXAuYwpAQCAtNzksNyArNzksNyBAQAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzb2NrZXQgKiwgX19pY21wdjZfc29ja2V0KSA9IE5VTEw7CiAjZGVmaW5lIGljbXB2Nl9zb2NrZXQJX19nZXRfY3B1X3ZhcihfX2ljbXB2Nl9zb2NrZXQpCiAKLXN0YXRpYyBpbnQgaWNtcHY2X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCAqbmhvZmZwKTsKK3N0YXRpYyBpbnQgaWNtcHY2X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpOwogCiBzdGF0aWMgc3RydWN0IGluZXQ2X3Byb3RvY29sIGljbXB2Nl9wcm90b2NvbCA9IHsKIAkuaGFuZGxlcgk9CWljbXB2Nl9yY3YsCkBAIC01ODEsNyArNTgxLDcgQEAKICAqCUhhbmRsZSBpY21wIG1lc3NhZ2VzCiAgKi8KIAotc3RhdGljIGludCBpY21wdjZfcmN2KHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50ICpuaG9mZnApCitzdGF0aWMgaW50IGljbXB2Nl9yY3Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSAqcHNrYjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CkBAIC02MDcsNyArNjA3LDcgQEAKIAkJc2tiLT5jc3VtID0gfmNzdW1faXB2Nl9tYWdpYyhzYWRkciwgZGFkZHIsIHNrYi0+bGVuLAogCQkJCQkgICAgIElQUFJPVE9fSUNNUFY2LCAwKTsKIAkJaWYgKF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpIHsKLQkJCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgIklDTVB2NiBjaGVja3N1bSBmYWlsZWQgWyUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eCA+ICUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eF1cbiIsCisJCQlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJJQ01QdjYgY2hlY2tzdW0gZmFpbGVkIFsiIE5JUDZfRk1UICIgPiAiIE5JUDZfRk1UICJdXG4iLAogCQkJCSAgICAgICBOSVA2KCpzYWRkciksIE5JUDYoKmRhZGRyKSk7CiAJCQlnb3RvIGRpc2NhcmRfaXQ7CiAJCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L2luZXQ2X2Nvbm5lY3Rpb25fc29jay5jIGIvbmV0L2lwdjYvaW5ldDZfY29ubmVjdGlvbl9zb2NrLmMKaW5kZXggNzkyZjkwZi4uZjhmM2EzNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaW5ldDZfY29ubmVjdGlvbl9zb2NrLmMKKysrIGIvbmV0L2lwdjYvaW5ldDZfY29ubmVjdGlvbl9zb2NrLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxuZXQvaW5ldF9oYXNodGFibGVzLmg+CiAjaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2luZXQ2X2Nvbm5lY3Rpb25fc29jay5oPgogCiBpbnQgaW5ldDZfY3NrX2JpbmRfY29uZmxpY3QoY29uc3Qgc3RydWN0IHNvY2sgKnNrLAogCQkJICAgIGNvbnN0IHN0cnVjdCBpbmV0X2JpbmRfYnVja2V0ICp0YikKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYyBiL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYwppbmRleCA4OWQxMmI0Li42OWNiZThhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfZmxvd2xhYmVsLmMKKysrIGIvbmV0L2lwdjYvaXA2X2Zsb3dsYWJlbC5jCkBAIC05LDYgKzksNyBAQAogICoJQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtNjI4LDkgKzYyOSw3IEBACiB7CiAJd2hpbGUoZmwpIHsKIAkJc2VxX3ByaW50ZihzZXEsCi0JCQkgICAiJTA1WCAlLTFkICUtNmQgJS02ZCAlLTZsZCAlLThsZCAiCi0JCQkgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgotCQkJICAgIiUtNGRcbiIsCisJCQkgICAiJTA1WCAlLTFkICUtNmQgJS02ZCAlLTZsZCAlLThsZCAiIE5JUDZfU0VRRk1UICIgJS00ZFxuIiwKIAkJCSAgICh1bnNpZ25lZCludG9obChmbC0+bGFiZWwpLAogCQkJICAgZmwtPnNoYXJlLAogCQkJICAgKHVuc2lnbmVkKWZsLT5vd25lciwKQEAgLTY0Niw4ICs2NDUsOCBAQAogc3RhdGljIGludCBpcDZmbF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKIAlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCi0JCXNlcV9wdXRzKHNlcSwgIkxhYmVsIFMgT3duZXIgIFVzZXJzICBMaW5nZXIgRXhwaXJlcyAgIgotCQkJICAgICAgIkRzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFxuIik7CisJCXNlcV9wcmludGYoc2VxLCAiJS01cyAlLTFzICUtNnMgJS02cyAlLTZzICUtOHMgJS0zMnMgJXNcbiIsCisJCQkgICAiTGFiZWwiLCAiUyIsICJPd25lciIsICJVc2VycyIsICJMaW5nZXIiLCAiRXhwaXJlcyIsICJEc3QiLCAiT3B0Iik7CiAJZWxzZQogCQlpcDZmbF9mbF9zZXFfc2hvdyhzZXEsIHYpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X2lucHV0LmMgYi9uZXQvaXB2Ni9pcDZfaW5wdXQuYwppbmRleCBhNjAyNmQyLi4yOWY3MzU5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfaW5wdXQuYworKysgYi9uZXQvaXB2Ni9pcDZfaW5wdXQuYwpAQCAtNDgsNyArNDgsNyBAQAogCiAKIAotc3RhdGljIGlubGluZSBpbnQgaXA2X3Jjdl9maW5pc2goIHN0cnVjdCBza19idWZmICpza2IpIAoraW5saW5lIGludCBpcDZfcmN2X2ZpbmlzaCggc3RydWN0IHNrX2J1ZmYgKnNrYikgCiB7CiAJaWYgKHNrYi0+ZHN0ID09IE5VTEwpCiAJCWlwNl9yb3V0ZV9pbnB1dChza2IpOwpAQCAtOTcsNiArOTcsOSBAQAogCWlmIChoZHItPnZlcnNpb24gIT0gNikKIAkJZ290byBlcnI7CiAKKwlza2ItPmgucmF3ID0gKHU4ICopKGhkciArIDEpOworCUlQNkNCKHNrYiktPm5ob2ZmID0gb2Zmc2V0b2Yoc3RydWN0IGlwdjZoZHIsIG5leHRoZHIpOworCiAJcGt0X2xlbiA9IG50b2hzKGhkci0+cGF5bG9hZF9sZW4pOwogCiAJLyogcGt0X2xlbiBtYXkgYmUgemVybyBpZiBKdW1ibyBwYXlsb2FkIG9wdGlvbiBpcyBwcmVzZW50ICovCkBAIC0xMTEsOCArMTE0LDcgQEAKIAl9CiAKIAlpZiAoaGRyLT5uZXh0aGRyID09IE5FWFRIRFJfSE9QKSB7Ci0JCXNrYi0+aC5yYXcgPSAodTgqKShoZHIrMSk7Ci0JCWlmIChpcHY2X3BhcnNlX2hvcG9wdHMoc2tiLCBvZmZzZXRvZihzdHJ1Y3QgaXB2NmhkciwgbmV4dGhkcikpIDwgMCkgeworCQlpZiAoaXB2Nl9wYXJzZV9ob3BvcHRzKHNrYiwgSVA2Q0Ioc2tiKS0+bmhvZmYpIDwgMCkgewogCQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMTQzLDI2ICsxNDUsMTUgQEAKIAlpbnQgbmV4dGhkcjsKIAl1OCBoYXNoOwogCi0Jc2tiLT5oLnJhdyA9IHNrYi0+bmgucmF3ICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKLQogCS8qCiAJICoJUGFyc2UgZXh0ZW5zaW9uIGhlYWRlcnMKIAkgKi8KIAotCW5leHRoZHIgPSBza2ItPm5oLmlwdjZoLT5uZXh0aGRyOwotCW5ob2ZmID0gb2Zmc2V0b2Yoc3RydWN0IGlwdjZoZHIsIG5leHRoZHIpOwotCi0JLyogU2tpcCBob3AtYnktaG9wIG9wdGlvbnMsIHRoZXkgYXJlIGFscmVhZHkgcGFyc2VkLiAqLwotCWlmIChuZXh0aGRyID09IE5FWFRIRFJfSE9QKSB7Ci0JCW5ob2ZmID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKLQkJbmV4dGhkciA9IHNrYi0+aC5yYXdbMF07Ci0JCXNrYi0+aC5yYXcgKz0gKHNrYi0+aC5yYXdbMV0rMSk8PDM7Ci0JfQotCiAJcmN1X3JlYWRfbG9jaygpOwogcmVzdWJtaXQ6CiAJaWYgKCFwc2tiX3B1bGwoc2tiLCBza2ItPmgucmF3IC0gc2tiLT5kYXRhKSkKIAkJZ290byBkaXNjYXJkOworCW5ob2ZmID0gSVA2Q0Ioc2tiKS0+bmhvZmY7CiAJbmV4dGhkciA9IHNrYi0+bmgucmF3W25ob2ZmXTsKIAogCXJhd19zayA9IHNrX2hlYWQoJnJhd192Nl9odGFibGVbbmV4dGhkciAmIChNQVhfSU5FVF9QUk9UT1MgLSAxKV0pOwpAQCAtMTk0LDcgKzE4NSw3IEBACiAJCSAgICAheGZybTZfcG9saWN5X2NoZWNrKE5VTEwsIFhGUk1fUE9MSUNZX0lOLCBza2IpKSAKIAkJCWdvdG8gZGlzY2FyZDsKIAkJCi0JCXJldCA9IGlwcHJvdC0+aGFuZGxlcigmc2tiLCAmbmhvZmYpOworCQlyZXQgPSBpcHByb3QtPmhhbmRsZXIoJnNrYik7CiAJCWlmIChyZXQgPiAwKQogCQkJZ290byByZXN1Ym1pdDsKIAkJZWxzZSBpZiAocmV0ID09IDApCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMgYi9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKaW5kZXggYjRjNGJlYi4uZWZhM2U3MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X291dHB1dC5jCisrKyBiL25ldC9pcHY2L2lwNl9vdXRwdXQuYwpAQCAtMjI2LDYgKzIyNiw4IEBACiAJaXB2Nl9hZGRyX2NvcHkoJmhkci0+c2FkZHIsICZmbC0+Zmw2X3NyYyk7CiAJaXB2Nl9hZGRyX2NvcHkoJmhkci0+ZGFkZHIsIGZpcnN0X2hvcCk7CiAKKwlza2ItPnByaW9yaXR5ID0gc2stPnNrX3ByaW9yaXR5OworCiAJbXR1ID0gZHN0X210dShkc3QpOwogCWlmICgoc2tiLT5sZW4gPD0gbXR1KSB8fCBpcGZyYWdvaykgewogCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKQEAgLTExODIsNiArMTE4NCw4IEBACiAJaXB2Nl9hZGRyX2NvcHkoJmhkci0+c2FkZHIsICZmbC0+Zmw2X3NyYyk7CiAJaXB2Nl9hZGRyX2NvcHkoJmhkci0+ZGFkZHIsIGZpbmFsX2RzdCk7CiAKKwlza2ItPnByaW9yaXR5ID0gc2stPnNrX3ByaW9yaXR5OworCiAJc2tiLT5kc3QgPSBkc3RfY2xvbmUoJnJ0LT51LmRzdCk7CiAJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CQogCWVyciA9IE5GX0hPT0soUEZfSU5FVDYsIE5GX0lQNl9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgc2tiLT5kc3QtPmRldiwgZHN0X291dHB1dCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfdHVubmVsLmMgYi9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKaW5kZXggZTMxNWQwZi4uOTJlYWQzYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCisrKyBiL25ldC9pcHY2L2lwNl90dW5uZWwuYwpAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CkBAIC0yNDMsNyArMjQ0LDcgQEAKIAlpZiAoZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JdCA9IGRldi0+cHJpdjsKKwl0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlkZXYtPmluaXQgPSBpcDZpcDZfdG5sX2Rldl9pbml0OwogCXQtPnBhcm1zID0gKnA7CiAKQEAgLTMwOCw3ICszMDksNyBAQAogc3RhdGljIHZvaWQKIGlwNmlwNl90bmxfZGV2X3VuaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBpcDZfdG5sICp0ID0gZGV2LT5wcml2OworCXN0cnVjdCBpcDZfdG5sICp0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWlmIChkZXYgPT0gaXA2aXA2X2ZiX3RubF9kZXYpIHsKIAkJd3JpdGVfbG9ja19iaCgmaXA2aXA2X2xvY2spOwpAQCAtNTEwLDcgKzUxMSw3IEBACiAgKiovCiAKIHN0YXRpYyBpbnQgCi1pcDZpcDZfcmN2KHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50ICpuaG9mZnApCitpcDZpcDZfcmN2KHN0cnVjdCBza19idWZmICoqcHNrYikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnBza2I7CiAJc3RydWN0IGlwdjZoZHIgKmlwdjZoOwpAQCAtNjIzLDcgKzYyNCw3IEBACiBzdGF0aWMgaW50IAogaXA2aXA2X3RubF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGlwNl90bmwgKnQgPSAoc3RydWN0IGlwNl90bmwgKikgZGV2LT5wcml2OworCXN0cnVjdCBpcDZfdG5sICp0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmdC0+c3RhdDsKIAlzdHJ1Y3QgaXB2NmhkciAqaXB2NmggPSBza2ItPm5oLmlwdjZoOwogCXN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqb3B0ID0gTlVMTDsKQEAgLTkzMywxMSArOTM0LDExIEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAoKGVyciA9IGlwNmlwNl90bmxfbG9jYXRlKCZwLCAmdCwgMCkpID09IC1FTk9ERVYpCi0JCQkJdCA9IChzdHJ1Y3QgaXA2X3RubCAqKSBkZXYtPnByaXY7CisJCQkJdCA9IG5ldGRldl9wcml2KGRldik7CiAJCQllbHNlIGlmIChlcnIpCiAJCQkJYnJlYWs7CiAJCX0gZWxzZQotCQkJdCA9IChzdHJ1Y3QgaXA2X3RubCAqKSBkZXYtPnByaXY7CisJCQl0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCQltZW1jcHkoJnAsICZ0LT5wYXJtcywgc2l6ZW9mIChwKSk7CiAJCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEsICZwLCBzaXplb2YgKHApKSkgewpAQCAtOTU1LDcgKzk1Niw3IEBACiAJCQlicmVhazsKIAkJfQogCQlpZiAoIWNyZWF0ZSAmJiBkZXYgIT0gaXA2aXA2X2ZiX3RubF9kZXYpIHsKLQkJCXQgPSAoc3RydWN0IGlwNl90bmwgKikgZGV2LT5wcml2OworCQkJdCA9IG5ldGRldl9wcml2KGRldik7CiAJCX0KIAkJaWYgKCF0ICYmIChlcnIgPSBpcDZpcDZfdG5sX2xvY2F0ZSgmcCwgJnQsIGNyZWF0ZSkpKSB7CiAJCQlicmVhazsKQEAgLTk5MSwxMiArOTkyLDEyIEBACiAJCQllcnIgPSBpcDZpcDZfdG5sX2xvY2F0ZSgmcCwgJnQsIDApOwogCQkJaWYgKGVycikKIAkJCQlicmVhazsKLQkJCWlmICh0ID09IGlwNmlwNl9mYl90bmxfZGV2LT5wcml2KSB7CisJCQlpZiAodCA9PSBuZXRkZXZfcHJpdihpcDZpcDZfZmJfdG5sX2RldikpIHsKIAkJCQllcnIgPSAtRVBFUk07CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQl0ID0gKHN0cnVjdCBpcDZfdG5sICopIGRldi0+cHJpdjsKKwkJCXQgPSBuZXRkZXZfcHJpdihkZXYpOwogCQl9CiAJCWVyciA9IHVucmVnaXN0ZXJfbmV0ZGV2aWNlKHQtPmRldik7CiAJCWJyZWFrOwpAQCAtMTAxNiw3ICsxMDE3LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCiBpcDZpcDZfdG5sX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXJldHVybiAmKCgoc3RydWN0IGlwNl90bmwgKikgZGV2LT5wcml2KS0+c3RhdCk7CisJcmV0dXJuICYoKChzdHJ1Y3QgaXA2X3RubCAqKW5ldGRldl9wcml2KGRldikpLT5zdGF0KTsKIH0KIAogLyoqCkBAIC0xMDczLDcgKzEwNzQsNyBAQAogc3RhdGljIGlubGluZSB2b2lkCiBpcDZpcDZfdG5sX2Rldl9pbml0X2dlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBpcDZfdG5sICp0ID0gKHN0cnVjdCBpcDZfdG5sICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXA2X3RubCAqdCA9IG5ldGRldl9wcml2KGRldik7CiAJdC0+ZmwucHJvdG8gPSBJUFBST1RPX0lQVjY7CiAJdC0+ZGV2ID0gZGV2OwogCXN0cmNweSh0LT5wYXJtcy5uYW1lLCBkZXYtPm5hbWUpOwpAQCAtMTA4Nyw3ICsxMDg4LDcgQEAKIHN0YXRpYyBpbnQKIGlwNmlwNl90bmxfZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgaXA2X3RubCAqdCA9IChzdHJ1Y3QgaXA2X3RubCAqKSBkZXYtPnByaXY7CisJc3RydWN0IGlwNl90bmwgKnQgPSBuZXRkZXZfcHJpdihkZXYpOwogCWlwNmlwNl90bmxfZGV2X2luaXRfZ2VuKGRldik7CiAJaXA2aXA2X3RubF9saW5rX2NvbmZpZyh0KTsKIAlyZXR1cm4gMDsKQEAgLTExMDMsNyArMTEwNCw3IEBACiBzdGF0aWMgaW50IAogaXA2aXA2X2ZiX3RubF9kZXZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBpcDZfdG5sICp0ID0gZGV2LT5wcml2OworCXN0cnVjdCBpcDZfdG5sICp0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpcDZpcDZfdG5sX2Rldl9pbml0X2dlbihkZXYpOwogCWRldl9ob2xkKGRldik7CiAJdG5sc193Y1swXSA9IHQ7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcGNvbXA2LmMgYi9uZXQvaXB2Ni9pcGNvbXA2LmMKaW5kZXggNjI2ZGQzOS4uZDUxMWE4OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXBjb21wNi5jCisrKyBiL25ldC9pcHY2L2lwY29tcDYuYwpAQCAtMjEyLDggKzIxMiw3IEBACiAJaWYgKCF4KQogCQlyZXR1cm47CiAKLQlwcmludGsoS0VSTl9ERUJVRyAicG10dSBkaXNjb3Zlcnkgb24gU0EgSVBDT01QLyUwOHgvIgotCQkJIiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eFxuIiwKKwlwcmludGsoS0VSTl9ERUJVRyAicG10dSBkaXNjb3Zlcnkgb24gU0EgSVBDT01QLyUwOHgvIiBOSVA2X0ZNVCAiXG4iLAogCQkJc3BpLCBOSVA2KGlwaC0+ZGFkZHIpKTsKIAl4ZnJtX3N0YXRlX3B1dCh4KTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwdjZfc29ja2dsdWUuYyBiL25ldC9pcHY2L2lwdjZfc29ja2dsdWUuYwppbmRleCBjNjM4NjhkLi5mNzE0MmJhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMKKysrIGIvbmV0L2lwdjYvaXB2Nl9zb2NrZ2x1ZS5jCkBAIC0yNiw2ICsyNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC01NDksNyArNTUwLDcgQEAKIAkJCXJldHYgPSAtRU5PQlVGUzsKIAkJCWJyZWFrOwogCQl9Ci0JCWdzZiA9IChzdHJ1Y3QgZ3JvdXBfZmlsdGVyICopa21hbGxvYyhvcHRsZW4sR0ZQX0tFUk5FTCk7CisJCWdzZiA9IGttYWxsb2Mob3B0bGVuLEdGUF9LRVJORUwpOwogCQlpZiAoZ3NmID09IDApIHsKIAkJCXJldHYgPSAtRU5PQlVGUzsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbWNhc3QuYyBiL25ldC9pcHY2L21jYXN0LmMKaW5kZXggMWNmMzA1YS4uNmMwNWM3OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbWNhc3QuYworKysgYi9uZXQvaXB2Ni9tY2FzdC5jCkBAIC00NDksOCArNDQ5LDcgQEAKIAogCQlpZiAocHNsKQogCQkJY291bnQgKz0gcHNsLT5zbF9tYXg7Ci0JCW5ld3BzbCA9IChzdHJ1Y3QgaXA2X3NmX3NvY2tsaXN0ICopc29ja19rbWFsbG9jKHNrLAotCQkJSVA2X1NGTFNJWkUoY291bnQpLCBHRlBfQVRPTUlDKTsKKwkJbmV3cHNsID0gc29ja19rbWFsbG9jKHNrLCBJUDZfU0ZMU0laRShjb3VudCksIEdGUF9BVE9NSUMpOwogCQlpZiAoIW5ld3BzbCkgewogCQkJZXJyID0gLUVOT0JVRlM7CiAJCQlnb3RvIGRvbmU7CkBAIC01MzUsOCArNTM0LDggQEAKIAkJZ290byBkb25lOwogCX0KIAlpZiAoZ3NmLT5nZl9udW1zcmMpIHsKLQkJbmV3cHNsID0gKHN0cnVjdCBpcDZfc2Zfc29ja2xpc3QgKilzb2NrX2ttYWxsb2Moc2ssCi0JCQkJSVA2X1NGTFNJWkUoZ3NmLT5nZl9udW1zcmMpLCBHRlBfQVRPTUlDKTsKKwkJbmV3cHNsID0gc29ja19rbWFsbG9jKHNrLCBJUDZfU0ZMU0laRShnc2YtPmdmX251bXNyYyksCisJCQkJCQkJICBHRlBfQVRPTUlDKTsKIAkJaWYgKCFuZXdwc2wpIHsKIAkJCWVyciA9IC1FTk9CVUZTOwogCQkJZ290byBkb25lOwpAQCAtNzY4LDcgKzc2Nyw3IEBACiAJICogZm9yIGRlbGV0ZWQgaXRlbXMgYWxsb3dzIGNoYW5nZSByZXBvcnRzIHRvIHVzZSBjb21tb24gY29kZSB3aXRoCiAJICogbm9uLWRlbGV0ZWQgb3IgcXVlcnktcmVzcG9uc2UgTUNBJ3MuCiAJICovCi0JcG1jID0gKHN0cnVjdCBpZm1jYWRkcjYgKilrbWFsbG9jKHNpemVvZigqcG1jKSwgR0ZQX0FUT01JQyk7CisJcG1jID0ga21hbGxvYyhzaXplb2YoKnBtYyksIEdGUF9BVE9NSUMpOwogCWlmICghcG1jKQogCQlyZXR1cm47CiAJbWVtc2V0KHBtYywgMCwgc2l6ZW9mKCpwbWMpKTsKQEAgLTE5MzcsNyArMTkzNiw3IEBACiAJCXBzZl9wcmV2ID0gcHNmOwogCX0KIAlpZiAoIXBzZikgewotCQlwc2YgPSAoc3RydWN0IGlwNl9zZl9saXN0ICopa21hbGxvYyhzaXplb2YoKnBzZiksIEdGUF9BVE9NSUMpOworCQlwc2YgPSBrbWFsbG9jKHNpemVvZigqcHNmKSwgR0ZQX0FUT01JQyk7CiAJCWlmICghcHNmKQogCQkJcmV0dXJuIC1FTk9CVUZTOwogCQltZW1zZXQocHNmLCAwLCBzaXplb2YoKnBzZikpOwpAQCAtMjM3NCw3ICsyMzczLDcgQEAKIAlzdHJ1Y3QgaWdtcDZfbWNfaXRlcl9zdGF0ZSAqc3RhdGUgPSBpZ21wNl9tY19zZXFfcHJpdmF0ZShzZXEpOwogCiAJc2VxX3ByaW50ZihzZXEsCi0JCSAgICIlLTRkICUtMTVzICUwNHglMDR4JTA0eCUwNHglMDR4JTA0eCUwNHglMDR4ICU1ZCAlMDhYICVsZFxuIiwgCisJCSAgICIlLTRkICUtMTVzICIgTklQNl9TRVFGTVQgIiAlNWQgJTA4WCAlbGRcbiIsIAogCQkgICBzdGF0ZS0+ZGV2LT5pZmluZGV4LCBzdGF0ZS0+ZGV2LT5uYW1lLAogCQkgICBOSVA2KGltLT5tY2FfYWRkciksCiAJCSAgIGltLT5tY2FfdXNlcnMsIGltLT5tY2FfZmxhZ3MsCkBAIC0yNTQ4LDEwICsyNTQ3LDcgQEAKIAkJCSAgICJTb3VyY2UgQWRkcmVzcyIsICJJTkMiLCAiRVhDIik7CiAJfSBlbHNlIHsKIAkJc2VxX3ByaW50ZihzZXEsCi0JCQkgICAiJTNkICU2LjZzICIKLQkJCSAgICIlMDR4JTA0eCUwNHglMDR4JTA0eCUwNHglMDR4JTA0eCAiCi0JCQkgICAiJTA0eCUwNHglMDR4JTA0eCUwNHglMDR4JTA0eCUwNHggIgotCQkJICAgIiU2bHUgJTZsdVxuIiwKKwkJCSAgICIlM2QgJTYuNnMgIiBOSVA2X1NFUUZNVCAiICIgTklQNl9TRVFGTVQgIiAlNmx1ICU2bHVcbiIsCiAJCQkgICBzdGF0ZS0+ZGV2LT5pZmluZGV4LCBzdGF0ZS0+ZGV2LT5uYW1lLAogCQkJICAgTklQNihzdGF0ZS0+aW0tPm1jYV9hZGRyKSwKIAkJCSAgIE5JUDYocHNmLT5zZl9hZGRyKSwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25kaXNjLmMgYi9uZXQvaXB2Ni9uZGlzYy5jCmluZGV4IDMwNWQ5ZWUuLmNiODg1NmIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25kaXNjLmMKKysrIGIvbmV0L2lwdjYvbmRpc2MuYwpAQCAtNjkyLDcgKzY5Miw3IEBACiAJCWlmICghKG5laWdoLT5udWRfc3RhdGUgJiBOVURfVkFMSUQpKSB7CiAJCQlORF9QUklOVEsxKEtFUk5fREVCVUcKIAkJCQkgICAiJXMoKTogdHJ5aW5nIHRvIHVjYXN0IHByb2JlIGluIE5VRF9JTlZBTElEOiAiCi0JCQkJICAgIiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eFxuIiwKKwkJCQkgICBOSVA2X0ZNVCAiXG4iLAogCQkJCSAgIF9fRlVOQ1RJT05fXywKIAkJCQkgICBOSVA2KCp0YXJnZXQpKTsKIAkJfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIuYwppbmRleCBmODYyNmViLi5kNzUwY2ZjIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIuYwpAQCAtMSwxNSArMSwxMiBAQAotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2lmZGVmIENPTkZJR19ORVRGSUxURVIKLQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvZHN0Lmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvaXA2X3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L3hmcm0uaD4KIAogaW50IGlwNl9yb3V0ZV9tZV9oYXJkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKQEAgLTIxLDExICsxOCwxNyBAQAogCQl7IC5pcDZfdSA9CiAJCSAgeyAuZGFkZHIgPSBpcGgtPmRhZGRyLAogCQkgICAgLnNhZGRyID0gaXBoLT5zYWRkciwgfSB9LAotCQkucHJvdG8gPSBpcGgtPm5leHRoZHIsCiAJfTsKIAogCWRzdCA9IGlwNl9yb3V0ZV9vdXRwdXQoc2tiLT5zaywgJmZsKTsKIAorI2lmZGVmIENPTkZJR19YRlJNCisJaWYgKCEoSVA2Q0Ioc2tiKS0+ZmxhZ3MgJiBJUDZTS0JfWEZSTV9UUkFOU0ZPUk1FRCkgJiYKKwkgICAgeGZybV9kZWNvZGVfc2Vzc2lvbihza2IsICZmbCwgQUZfSU5FVDYpID09IDApCisJCWlmICh4ZnJtX2xvb2t1cCgmc2tiLT5kc3QsICZmbCwgc2tiLT5zaywgMCkpCisJCQlyZXR1cm4gLTE7CisjZW5kaWYKKwogCWlmIChkc3QtPmVycm9yKSB7CiAJCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfT1VUTk9ST1VURVMpOwogCQlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJpcDZfcm91dGVfbWVfaGFyZGVyOiBObyBtb3JlIHJvdXRlLlxuIik7CkBAIC04NywxOCArOTAsMTAgQEAKIAlyZXR1cm4gbmZfcmVnaXN0ZXJfcXVldWVfcmVyb3V0ZXIoUEZfSU5FVDYsICZpcDZfcmVyb3V0ZSk7CiB9CiAKKy8qIFRoaXMgY2FuIGJlIGNhbGxlZCBmcm9tIGluZXQ2X2luaXQoKSBvbiBlcnJvcnMsIHNvIGl0IGNhbm5vdAorICogYmUgbWFya2VkIF9fZXhpdC4gLURhdmVNCisgKi8KIHZvaWQgaXB2Nl9uZXRmaWx0ZXJfZmluaSh2b2lkKQogewogCW5mX3VucmVnaXN0ZXJfcXVldWVfcmVyb3V0ZXIoUEZfSU5FVDYpOwogfQotCi0jZWxzZSAvKiBDT05GSUdfTkVURklMVEVSICovCi1pbnQgX19pbml0IGlwdjZfbmV0ZmlsdGVyX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBpcHY2X25ldGZpbHRlcl9maW5pKHZvaWQpCi17Ci19Ci0jZW5kaWYgLyogQ09ORklHX05FVEZJTFRFUiAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL0tjb25maWcgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvS2NvbmZpZwppbmRleCAwNDkxMmY5Li4yZDZmOGVjIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvS2NvbmZpZworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvS2NvbmZpZwpAQCAtNDEsNiArNDEsNyBAQAogCiBjb25maWcgSVA2X05GX0lQVEFCTEVTCiAJdHJpc3RhdGUgIklQNiB0YWJsZXMgc3VwcG9ydCAocmVxdWlyZWQgZm9yIGZpbHRlcmluZy9tYXNxL05BVCkiCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwogCWhlbHAKIAkgIGlwNnRhYmxlcyBpcyBhIGdlbmVyYWwsIGV4dGVuc2libGUgcGFja2V0IGlkZW50aWZpY2F0aW9uIGZyYW1ld29yay4KIAkgIEN1cnJlbnRseSBvbmx5IHRoZSBwYWNrZXQgZmlsdGVyaW5nIGFuZCBwYWNrZXQgbWFuZ2xpbmcgc3Vic3lzdGVtCkBAIC01MCwyNSArNTEsNiBAQAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKICMgVGhlIHNpbXBsZSBtYXRjaGVzLgotY29uZmlnIElQNl9ORl9NQVRDSF9MSU1JVAotCXRyaXN0YXRlICJsaW1pdCBtYXRjaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCi0JaGVscAotCSAgbGltaXQgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBjb250cm9sIHRoZSByYXRlIGF0IHdoaWNoIGEgcnVsZSBjYW4gYmUKLQkgIG1hdGNoZWQ6IG1haW5seSB1c2VmdWwgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgTE9HIHRhcmdldCAoIkxPRwotCSAgdGFyZ2V0IHN1cHBvcnQiLCBiZWxvdykgYW5kIHRvIGF2b2lkIHNvbWUgRGVuaWFsIG9mIFNlcnZpY2UgYXR0YWNrcy4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBJUDZfTkZfTUFUQ0hfTUFDCi0JdHJpc3RhdGUgIk1BQyBhZGRyZXNzIG1hdGNoIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUDZfTkZfSVBUQUJMRVMKLQloZWxwCi0JICBtYWMgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGJhc2VkIG9uIHRoZSBzb3VyY2UKLQkgIEV0aGVybmV0IGFkZHJlc3Mgb2YgdGhlIHBhY2tldC4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBJUDZfTkZfTUFUQ0hfUlQKIAl0cmlzdGF0ZSAiUm91dGluZyBoZWFkZXIgbWF0Y2ggc3VwcG9ydCIKIAlkZXBlbmRzIG9uIElQNl9ORl9JUFRBQkxFUwpAQCAtMTI0LDE2ICsxMDYsNiBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIElQNl9ORl9NQVRDSF9NQVJLCi0JdHJpc3RhdGUgIm5ldGZpbHRlciBNQVJLIG1hdGNoIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUDZfTkZfSVBUQUJMRVMKLQloZWxwCi0JICBOZXRmaWx0ZXIgbWFyayBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIHBhY2tldHMgYmFzZWQgb24gdGhlCi0JICBgbmZtYXJrJyB2YWx1ZSBpbiB0aGUgcGFja2V0LiAgVGhpcyBjYW4gYmUgc2V0IGJ5IHRoZSBNQVJLIHRhcmdldAotCSAgKHNlZSBiZWxvdykuCi0KLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgotCiBjb25maWcgSVA2X05GX01BVENIX0lQVjZIRUFERVIKIAl0cmlzdGF0ZSAiSVB2NiBFeHRlbnNpb24gSGVhZGVycyBNYXRjaCIKIAlkZXBlbmRzIG9uIElQNl9ORl9JUFRBQkxFUwpAQCAtMTUxLDE1ICsxMjMsNiBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIElQNl9ORl9NQVRDSF9MRU5HVEgKLQl0cmlzdGF0ZSAiUGFja2V0IExlbmd0aCBtYXRjaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIGEgcGFja2V0IGFnYWluc3QgYQotCSAgc3BlY2lmaWMgdmFsdWUgb3IgcmFuZ2Ugb2YgdmFsdWVzLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIElQNl9ORl9NQVRDSF9FVUk2NAogCXRyaXN0YXRlICJFVUk2NCBhZGRyZXNzIGNoZWNrIgogCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCkBAIC0xNzAsMTIgKzEzMywxMyBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIElQNl9ORl9NQVRDSF9QSFlTREVWCi0JdHJpc3RhdGUgIlBoeXNkZXYgbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQNl9ORl9JUFRBQkxFUyAmJiBCUklER0VfTkVURklMVEVSCitjb25maWcgSVA2X05GX01BVENIX1BPTElDWQorCXRyaXN0YXRlICJJUHNlYyBwb2xpY3kgbWF0Y2ggc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQNl9ORl9JUFRBQkxFUyAmJiBYRlJNCiAJaGVscAotCSAgUGh5c2RldiBwYWNrZXQgbWF0Y2hpbmcgbWF0Y2hlcyBhZ2FpbnN0IHRoZSBwaHlzaWNhbCBicmlkZ2UgcG9ydHMKLQkgIHRoZSBJUCBwYWNrZXQgYXJyaXZlZCBvbiBvciB3aWxsIGxlYXZlIGJ5LgorCSAgUG9saWN5IG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggcGFja2V0cyBiYXNlZCBvbiB0aGUKKwkgIElQc2VjIHBvbGljeSB0aGF0IHdhcyB1c2VkIGR1cmluZyBkZWNhcHN1bGF0aW9uL3dpbGwKKwkgIGJlIHVzZWQgZHVyaW5nIGVuY2Fwc3VsYXRpb24uCiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCkBAIC0yMDksMTcgKzE3Myw2IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgSVA2X05GX1RBUkdFVF9ORlFVRVVFCi0JdHJpc3RhdGUgIk5GUVVFVUUgVGFyZ2V0IFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUDZfTkZfSVBUQUJMRVMKLQloZWxwCi0JICBUaGlzIFRhcmdldCByZXBsYWNlZCB0aGUgb2xkIG9ic29sZXRlIFFVRVVFIHRhcmdldC4KLQotCSAgQXMgb3Bwb3NlZCB0byBRVUVVRSwgaXQgc3VwcG9ydHMgNjU1MzUgZGlmZmVyZW50IHF1ZXVlcywKLQkgIG5vdCBqdXN0IG9uZS4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBJUDZfTkZfTUFOR0xFCiAJdHJpc3RhdGUgIlBhY2tldCBtYW5nbGluZyIKIAlkZXBlbmRzIG9uIElQNl9ORl9JUFRBQkxFUwpAQCAtMjMwLDE5ICsxODMsNiBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIElQNl9ORl9UQVJHRVRfTUFSSwotCXRyaXN0YXRlICJNQVJLIHRhcmdldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVA2X05GX01BTkdMRQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgTUFSSycgdGFyZ2V0LCB3aGljaCBhbGxvd3MgeW91IHRvIGNyZWF0ZSBydWxlcwotCSAgaW4gdGhlIGBtYW5nbGUnIHRhYmxlIHdoaWNoIGFsdGVyIHRoZSBuZXRmaWx0ZXIgbWFyayAobmZtYXJrKSBmaWVsZAotCSAgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrZXQgcGFja2V0IHByaW9yIHRvIHJvdXRpbmcuIFRoaXMgY2FuIGNoYW5nZQotCSAgdGhlIHJvdXRpbmcgbWV0aG9kIChzZWUgYFVzZSBuZXRmaWx0ZXIgTUFSSyB2YWx1ZSBhcyByb3V0aW5nCi0JICBrZXknKSBhbmQgY2FuIGFsc28gYmUgdXNlZCBieSBvdGhlciBzdWJzeXN0ZW1zIHRvIGNoYW5nZSB0aGVpcgotCSAgYmVoYXZpb3IuCi0KLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgotCiBjb25maWcgSVA2X05GX1RBUkdFVF9ITAogCXRyaXN0YXRlICAnSEwgKGhvcGxpbWl0KSB0YXJnZXQgc3VwcG9ydCcKIAlkZXBlbmRzIG9uIElQNl9ORl9NQU5HTEUKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9NYWtlZmlsZSBiL25ldC9pcHY2L25ldGZpbHRlci9NYWtlZmlsZQppbmRleCA5YWI1YjJjLi5kYjYwNzNjOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL01ha2VmaWxlCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9NYWtlZmlsZQpAQCAtNCwyNCArNCwxOCBAQAogCiAjIExpbmsgb3JkZXIgbWF0dGVycyBoZXJlLgogb2JqLSQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykgKz0gaXA2X3RhYmxlcy5vCi1vYmotJChDT05GSUdfSVA2X05GX01BVENIX0xJTUlUKSArPSBpcDZ0X2xpbWl0Lm8KLW9iai0kKENPTkZJR19JUDZfTkZfTUFUQ0hfTUFSSykgKz0gaXA2dF9tYXJrLm8KLW9iai0kKENPTkZJR19JUDZfTkZfTUFUQ0hfTEVOR1RIKSArPSBpcDZ0X2xlbmd0aC5vCi1vYmotJChDT05GSUdfSVA2X05GX01BVENIX01BQykgKz0gaXA2dF9tYWMubwogb2JqLSQoQ09ORklHX0lQNl9ORl9NQVRDSF9SVCkgKz0gaXA2dF9ydC5vCiBvYmotJChDT05GSUdfSVA2X05GX01BVENIX09QVFMpICs9IGlwNnRfaGJoLm8gaXA2dF9kc3Qubwogb2JqLSQoQ09ORklHX0lQNl9ORl9NQVRDSF9JUFY2SEVBREVSKSArPSBpcDZ0X2lwdjZoZWFkZXIubwogb2JqLSQoQ09ORklHX0lQNl9ORl9NQVRDSF9GUkFHKSArPSBpcDZ0X2ZyYWcubwogb2JqLSQoQ09ORklHX0lQNl9ORl9NQVRDSF9BSEVTUCkgKz0gaXA2dF9lc3AubyBpcDZ0X2FoLm8KK29iai0kKENPTkZJR19JUDZfTkZfTUFUQ0hfUE9MSUNZKSArPSBpcDZ0X3BvbGljeS5vCiBvYmotJChDT05GSUdfSVA2X05GX01BVENIX0VVSTY0KSArPSBpcDZ0X2V1aTY0Lm8KIG9iai0kKENPTkZJR19JUDZfTkZfTUFUQ0hfTVVMVElQT1JUKSArPSBpcDZ0X211bHRpcG9ydC5vCiBvYmotJChDT05GSUdfSVA2X05GX01BVENIX09XTkVSKSArPSBpcDZ0X293bmVyLm8KLW9iai0kKENPTkZJR19JUDZfTkZfTUFUQ0hfUEhZU0RFVikgKz0gaXA2dF9waHlzZGV2Lm8KIG9iai0kKENPTkZJR19JUDZfTkZfRklMVEVSKSArPSBpcDZ0YWJsZV9maWx0ZXIubwogb2JqLSQoQ09ORklHX0lQNl9ORl9NQU5HTEUpICs9IGlwNnRhYmxlX21hbmdsZS5vCi1vYmotJChDT05GSUdfSVA2X05GX1RBUkdFVF9NQVJLKSArPSBpcDZ0X01BUksubwogb2JqLSQoQ09ORklHX0lQNl9ORl9UQVJHRVRfSEwpICs9IGlwNnRfSEwubwotb2JqLSQoQ09ORklHX0lQNl9ORl9UQVJHRVRfTkZRVUVVRSkgKz0gaXA2dF9ORlFVRVVFLm8KIG9iai0kKENPTkZJR19JUDZfTkZfUVVFVUUpICs9IGlwNl9xdWV1ZS5vCiBvYmotJChDT05GSUdfSVA2X05GX1RBUkdFVF9MT0cpICs9IGlwNnRfTE9HLm8KIG9iai0kKENPTkZJR19JUDZfTkZfUkFXKSArPSBpcDZ0YWJsZV9yYXcubwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMKaW5kZXggOTI1YjQyZDQuLjg0NzA2OGYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYwpAQCAtMTMsNyArMTMsMTIgQEAKICAqIAkgIGEgdGFibGUKICAqIDA2IEp1biAyMDAyIEFuZHJhcyBLaXMtU3phYm8gPGtpc3phQHNjaC5ibWUuaHU+CiAgKiAgICAgIC0gbmV3IGV4dGVuc2lvbiBoZWFkZXIgcGFyc2VyIGNvZGUKKyAqIDE1IE9jdCAyMDA1IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgorICogCS0gVW5pZmljYXRpb24gb2Yge2lwLGlwNn1fdGFibGVzIGludG8geF90YWJsZXMKKyAqIAktIFJlbW92ZWQgdGNwIGFuZCB1ZHAgY29kZSwgc2luY2UgaXQncyBub3QgaXB2NiBzcGVjaWZpYwogICovCisKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KQEAgLTIxLDggKzI2LDYgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdGNwLmg+Ci0jaW5jbHVkZSA8bGludXgvdWRwLmg+CiAjaW5jbHVkZSA8bGludXgvaWNtcHY2Lmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMzEsNiArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4iKTsKQEAgLTY1LDEzICs2OSw4IEBACiAjZWxzZQogI2RlZmluZSBJUF9ORl9BU1NFUlQoeCkKICNlbmRpZgotI2RlZmluZSBTTVBfQUxJR04oeCkgKCgoeCkgKyBTTVBfQ0FDSEVfQllURVMtMSkgJiB+KFNNUF9DQUNIRV9CWVRFUy0xKSkKIAotc3RhdGljIERFQ0xBUkVfTVVURVgoaXA2dF9tdXRleCk7CiAKLS8qIE11c3QgaGF2ZSBtdXRleCAqLwotI2RlZmluZSBBU1NFUlRfUkVBRF9MT0NLKHgpIElQX05GX0FTU0VSVChkb3duX3RyeWxvY2soJmlwNnRfbXV0ZXgpICE9IDApCi0jZGVmaW5lIEFTU0VSVF9XUklURV9MT0NLKHgpIElQX05GX0FTU0VSVChkb3duX3RyeWxvY2soJmlwNnRfbXV0ZXgpICE9IDApCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvbGlzdGhlbHAuaD4KIAogI2lmIDAKQEAgLTg5LDMwICs4OCw2IEBACiAKICAgIEhlbmNlIHRoZSBzdGFydCBvZiBhbnkgdGFibGUgaXMgZ2l2ZW4gYnkgZ2V0X3RhYmxlKCkgYmVsb3cuICAqLwogCi0vKiBUaGUgdGFibGUgaXRzZWxmICovCi1zdHJ1Y3QgaXA2dF90YWJsZV9pbmZvCi17Ci0JLyogU2l6ZSBwZXIgdGFibGUgKi8KLQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQkvKiBOdW1iZXIgb2YgZW50cmllczogRklYTUUuIC0tUlIgKi8KLQl1bnNpZ25lZCBpbnQgbnVtYmVyOwotCS8qIEluaXRpYWwgbnVtYmVyIG9mIGVudHJpZXMuIE5lZWRlZCBmb3IgbW9kdWxlIHVzYWdlIGNvdW50ICovCi0JdW5zaWduZWQgaW50IGluaXRpYWxfZW50cmllczsKLQotCS8qIEVudHJ5IHBvaW50cyBhbmQgdW5kZXJmbG93cyAqLwotCXVuc2lnbmVkIGludCBob29rX2VudHJ5W05GX0lQNl9OVU1IT09LU107Ci0JdW5zaWduZWQgaW50IHVuZGVyZmxvd1tORl9JUDZfTlVNSE9PS1NdOwotCi0JLyogaXA2dF9lbnRyeSB0YWJsZXM6IG9uZSBwZXIgQ1BVICovCi0Jdm9pZCAqZW50cmllc1tOUl9DUFVTXTsKLX07Ci0KLXN0YXRpYyBMSVNUX0hFQUQoaXA2dF90YXJnZXQpOwotc3RhdGljIExJU1RfSEVBRChpcDZ0X21hdGNoKTsKLXN0YXRpYyBMSVNUX0hFQUQoaXA2dF90YWJsZXMpOwotI2RlZmluZSBTRVRfQ09VTlRFUihjLGIscCkgZG8geyAoYykuYmNudCA9IChiKTsgKGMpLnBjbnQgPSAocCk7IH0gd2hpbGUoMCkKLSNkZWZpbmUgQUREX0NPVU5URVIoYyxiLHApIGRvIHsgKGMpLmJjbnQgKz0gKGIpOyAoYykucGNudCArPSAocCk7IH0gd2hpbGUoMCkKLQogI2lmIDAKICNkZWZpbmUgZG93bih4KSBkbyB7IHByaW50aygiRE9XTjoldToiICN4ICJcbiIsIF9fTElORV9fKTsgZG93bih4KTsgfSB3aGlsZSgwKQogI2RlZmluZSBkb3duX2ludGVycnVwdGlibGUoeCkgKHsgaW50IF9fcjsgcHJpbnRrKCJET1dOaToldToiICN4ICJcbiIsIF9fTElORV9fKTsgX19yID0gZG93bl9pbnRlcnJ1cHRpYmxlKHgpOyBpZiAoX19yICE9IDApIHByaW50aygiQUJPUlQtRE9XTmk6JXVcbiIsIF9fTElORV9fKTsgX19yOyB9KQpAQCAtMjk1LDcgKzI3MCw3IEBACiAJICAgICAgdW5zaWduZWQgaW50IGhvb2ssCiAJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAogCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JICAgICAgc3RydWN0IGlwNnRfdGFibGUgKnRhYmxlLAorCSAgICAgIHN0cnVjdCB4dF90YWJsZSAqdGFibGUsCiAJICAgICAgdm9pZCAqdXNlcmRhdGEpCiB7CiAJc3RhdGljIGNvbnN0IGNoYXIgbnVsbGRldm5hbWVbSUZOQU1TSVpdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoc2l6ZW9mKGxvbmcpKSkpOwpAQCAtMzA3LDYgKzI4Miw3IEBACiAJY29uc3QgY2hhciAqaW5kZXYsICpvdXRkZXY7CiAJdm9pZCAqdGFibGVfYmFzZTsKIAlzdHJ1Y3QgaXA2dF9lbnRyeSAqZSwgKmJhY2s7CisJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGU7CiAKIAkvKiBJbml0aWFsaXphdGlvbiAqLwogCWluZGV2ID0gaW4gPyBpbi0+bmFtZSA6IG51bGxkZXZuYW1lOwpAQCAtMzE5LDkgKzI5NSwxMCBAQAogCSAqIG1hdGNoIGl0LiAqLwogCiAJcmVhZF9sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CisJcHJpdmF0ZSA9IHRhYmxlLT5wcml2YXRlOwogCUlQX05GX0FTU0VSVCh0YWJsZS0+dmFsaWRfaG9va3MgJiAoMSA8PCBob29rKSk7Ci0JdGFibGVfYmFzZSA9ICh2b2lkICopdGFibGUtPnByaXZhdGUtPmVudHJpZXNbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKLQllID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHRhYmxlLT5wcml2YXRlLT5ob29rX2VudHJ5W2hvb2tdKTsKKwl0YWJsZV9iYXNlID0gKHZvaWQgKilwcml2YXRlLT5lbnRyaWVzW3NtcF9wcm9jZXNzb3JfaWQoKV07CisJZSA9IGdldF9lbnRyeSh0YWJsZV9iYXNlLCBwcml2YXRlLT5ob29rX2VudHJ5W2hvb2tdKTsKIAogI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKIAkvKiBDaGVjayBub29uZSBlbHNlIHVzaW5nIG91ciB0YWJsZSAqLwpAQCAtMzM3LDcgKzMxNCw3IEBACiAjZW5kaWYKIAogCS8qIEZvciByZXR1cm4gZnJvbSBidWlsdGluIGNoYWluICovCi0JYmFjayA9IGdldF9lbnRyeSh0YWJsZV9iYXNlLCB0YWJsZS0+cHJpdmF0ZS0+dW5kZXJmbG93W2hvb2tdKTsKKwliYWNrID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHByaXZhdGUtPnVuZGVyZmxvd1tob29rXSk7CiAKIAlkbyB7CiAJCUlQX05GX0FTU0VSVChlKTsKQEAgLTQzNywxNDUgKzQxNCw2IEBACiAjZW5kaWYKIH0KIAotLyoKLSAqIFRoZXNlIGFyZSB3ZWlyZCwgYnV0IG1vZHVsZSBsb2FkaW5nIG11c3Qgbm90IGJlIGRvbmUgd2l0aCBtdXRleAotICogaGVsZCAoc2luY2UgdGhleSB3aWxsIHJlZ2lzdGVyKSwgYW5kIHdlIGhhdmUgdG8gaGF2ZSBhIHNpbmdsZQotICogZnVuY3Rpb24gdG8gdXNlIHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKCkuCi0gKi8KLQotLyogRmluZCB0YWJsZSBieSBuYW1lLCBncmFicyBtdXRleCAmIHJlZi4gIFJldHVybnMgRVJSX1BUUigpIG9uIGVycm9yLiAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXA2dF90YWJsZSAqZmluZF90YWJsZV9sb2NrKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IGlwNnRfdGFibGUgKnQ7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpcDZ0X211dGV4KSAhPSAwKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVFIpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmaXA2dF90YWJsZXMsIGxpc3QpCi0JCWlmIChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCAmJiB0cnlfbW9kdWxlX2dldCh0LT5tZSkpCi0JCQlyZXR1cm4gdDsKLQl1cCgmaXA2dF9tdXRleCk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEZpbmQgbWF0Y2gsIGdyYWJzIHJlZi4gIFJldHVybnMgRVJSX1BUUigpIG9uIGVycm9yLiAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXA2dF9tYXRjaCAqZmluZF9tYXRjaChjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbikKLXsKLQlzdHJ1Y3QgaXA2dF9tYXRjaCAqbTsKLQlpbnQgZXJyID0gMDsKLQotCWlmIChkb3duX2ludGVycnVwdGlibGUoJmlwNnRfbXV0ZXgpICE9IDApCi0JCXJldHVybiBFUlJfUFRSKC1FSU5UUik7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG0sICZpcDZ0X21hdGNoLCBsaXN0KSB7Ci0JCWlmIChzdHJjbXAobS0+bmFtZSwgbmFtZSkgPT0gMCkgewotCQkJaWYgKG0tPnJldmlzaW9uID09IHJldmlzaW9uKSB7Ci0JCQkJaWYgKHRyeV9tb2R1bGVfZ2V0KG0tPm1lKSkgewotCQkJCQl1cCgmaXA2dF9tdXRleCk7Ci0JCQkJCXJldHVybiBtOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCWVyciA9IC1FUFJPVE9UWVBFOyAvKiBGb3VuZCBzb21ldGhpbmcuICovCi0JCX0KLQl9Ci0JdXAoJmlwNnRfbXV0ZXgpOwotCXJldHVybiBFUlJfUFRSKGVycik7Ci19Ci0KLS8qIEZpbmQgdGFyZ2V0LCBncmFicyByZWYuICBSZXR1cm5zIEVSUl9QVFIoKSBvbiBlcnJvci4gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlwNnRfdGFyZ2V0ICpmaW5kX3RhcmdldChjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbikKLXsKLQlzdHJ1Y3QgaXA2dF90YXJnZXQgKnQ7Ci0JaW50IGVyciA9IDA7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpcDZ0X211dGV4KSAhPSAwKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVFIpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmaXA2dF90YXJnZXQsIGxpc3QpIHsKLQkJaWYgKHN0cmNtcCh0LT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0JCQlpZiAodC0+cmV2aXNpb24gPT0gcmV2aXNpb24pIHsKLQkJCQlpZiAodHJ5X21vZHVsZV9nZXQodC0+bWUpKSB7Ci0JCQkJCXVwKCZpcDZ0X211dGV4KTsKLQkJCQkJcmV0dXJuIHQ7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJZXJyID0gLUVQUk9UT1RZUEU7IC8qIEZvdW5kIHNvbWV0aGluZy4gKi8KLQkJfQotCX0KLQl1cCgmaXA2dF9tdXRleCk7Ci0JcmV0dXJuIEVSUl9QVFIoZXJyKTsKLX0KLQotc3RydWN0IGlwNnRfdGFyZ2V0ICppcDZ0X2ZpbmRfdGFyZ2V0KGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uKQotewotCXN0cnVjdCBpcDZ0X3RhcmdldCAqdGFyZ2V0OwotCi0JdGFyZ2V0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoZmluZF90YXJnZXQobmFtZSwgcmV2aXNpb24pLAotCQkJCQkgImlwNnRfJXMiLCBuYW1lKTsKLQlpZiAoSVNfRVJSKHRhcmdldCkgfHwgIXRhcmdldCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHRhcmdldDsKLX0KLQotc3RhdGljIGludCBtYXRjaF9yZXZmbihjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbiwgaW50ICpiZXN0cCkKLXsKLQlzdHJ1Y3QgaXA2dF9tYXRjaCAqbTsKLQlpbnQgaGF2ZV9yZXYgPSAwOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShtLCAmaXA2dF9tYXRjaCwgbGlzdCkgewotCQlpZiAoc3RyY21wKG0tPm5hbWUsIG5hbWUpID09IDApIHsKLQkJCWlmIChtLT5yZXZpc2lvbiA+ICpiZXN0cCkKLQkJCQkqYmVzdHAgPSBtLT5yZXZpc2lvbjsKLQkJCWlmIChtLT5yZXZpc2lvbiA9PSByZXZpc2lvbikKLQkJCQloYXZlX3JldiA9IDE7Ci0JCX0KLQl9Ci0JcmV0dXJuIGhhdmVfcmV2OwotfQotCi1zdGF0aWMgaW50IHRhcmdldF9yZXZmbihjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbiwgaW50ICpiZXN0cCkKLXsKLQlzdHJ1Y3QgaXA2dF90YXJnZXQgKnQ7Ci0JaW50IGhhdmVfcmV2ID0gMDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJmlwNnRfdGFyZ2V0LCBsaXN0KSB7Ci0JCWlmIChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCkgewotCQkJaWYgKHQtPnJldmlzaW9uID4gKmJlc3RwKQotCQkJCSpiZXN0cCA9IHQtPnJldmlzaW9uOwotCQkJaWYgKHQtPnJldmlzaW9uID09IHJldmlzaW9uKQotCQkJCWhhdmVfcmV2ID0gMTsKLQkJfQotCX0KLQlyZXR1cm4gaGF2ZV9yZXY7Ci19Ci0KLS8qIFJldHVybnMgdHJ1ZSBvciBmYWxzIChpZiBubyBzdWNoIGV4dGVuc2lvbiBhdCBhbGwpICovCi1zdGF0aWMgaW5saW5lIGludCBmaW5kX3JldmlzaW9uKGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uLAotCQkJCWludCAoKnJldmZuKShjb25zdCBjaGFyICosIHU4LCBpbnQgKiksCi0JCQkJaW50ICplcnIpCi17Ci0JaW50IGhhdmVfcmV2LCBiZXN0ID0gLTE7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpcDZ0X211dGV4KSAhPSAwKSB7Ci0JCSplcnIgPSAtRUlOVFI7Ci0JCXJldHVybiAxOwotCX0KLQloYXZlX3JldiA9IHJldmZuKG5hbWUsIHJldmlzaW9uLCAmYmVzdCk7Ci0JdXAoJmlwNnRfbXV0ZXgpOwotCi0JLyogTm90aGluZyBhdCBhbGw/ICBSZXR1cm4gMCB0byB0cnkgbG9hZGluZyBtb2R1bGUuICovCi0JaWYgKGJlc3QgPT0gLTEpIHsKLQkJKmVyciA9IC1FTk9FTlQ7Ci0JCXJldHVybiAwOwotCX0KLQotCSplcnIgPSBiZXN0OwotCWlmICghaGF2ZV9yZXYpCi0JCSplcnIgPSAtRVBST1RPTk9TVVBQT1JUOwotCXJldHVybiAxOwotfQotCi0KIC8qIEFsbCB6ZXJvZXMgPT0gdW5jb25kaXRpb25hbCBydWxlLiAqLwogc3RhdGljIGlubGluZSBpbnQKIHVuY29uZGl0aW9uYWwoY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcHY2KQpAQCAtNTkyLDcgKzQzMCw3IEBACiAvKiBGaWd1cmVzIG91dCBmcm9tIHdoYXQgaG9vayBlYWNoIHJ1bGUgY2FuIGJlIGNhbGxlZDogcmV0dXJucyAwIGlmCiAgICB0aGVyZSBhcmUgbG9vcHMuICBQdXRzIGhvb2sgYml0bWFzayBpbiBjb21lZnJvbS4gKi8KIHN0YXRpYyBpbnQKLW1hcmtfc291cmNlX2NoYWlucyhzdHJ1Y3QgaXA2dF90YWJsZV9pbmZvICpuZXdpbmZvLAorbWFya19zb3VyY2VfY2hhaW5zKHN0cnVjdCB4dF90YWJsZV9pbmZvICpuZXdpbmZvLAogCQkgICB1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3MsIHZvaWQgKmVudHJ5MCkKIHsKIAl1bnNpZ25lZCBpbnQgaG9vazsKQEAgLTczOCwxMSArNTc2LDExIEBACiB7CiAJc3RydWN0IGlwNnRfbWF0Y2ggKm1hdGNoOwogCi0JbWF0Y2ggPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShmaW5kX21hdGNoKG0tPnUudXNlci5uYW1lLAotCQkJCQkJICAgbS0+dS51c2VyLnJldmlzaW9uKSwKKwltYXRjaCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfbWF0Y2goQUZfSU5FVDYsIG0tPnUudXNlci5uYW1lLAorCQkJICAgICAgCQltLT51LnVzZXIucmV2aXNpb24pLAogCQkJCQkiaXA2dF8lcyIsIG0tPnUudXNlci5uYW1lKTsKIAlpZiAoSVNfRVJSKG1hdGNoKSB8fCAhbWF0Y2gpIHsKLQkJZHVwcmludGYoImNoZWNrX21hdGNoOiBgJXMnIG5vdCBmb3VuZFxuIiwgbS0+dS51c2VyLm5hbWUpOworCSAgCWR1cHJpbnRmKCJjaGVja19tYXRjaDogYCVzJyBub3QgZm91bmRcbiIsIG0tPnUudXNlci5uYW1lKTsKIAkJcmV0dXJuIG1hdGNoID8gUFRSX0VSUihtYXRjaCkgOiAtRU5PRU5UOwogCX0KIAltLT51Lmtlcm5lbC5tYXRjaCA9IG1hdGNoOwpAQCAtNzgzLDggKzYyMSw5IEBACiAJCWdvdG8gY2xlYW51cF9tYXRjaGVzOwogCiAJdCA9IGlwNnRfZ2V0X3RhcmdldChlKTsKLQl0YXJnZXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShmaW5kX3RhcmdldCh0LT51LnVzZXIubmFtZSwKLQkJCQkJCSAgICAgdC0+dS51c2VyLnJldmlzaW9uKSwKKwl0YXJnZXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3RhcmdldChBRl9JTkVUNiwKKwkJCQkJCQl0LT51LnVzZXIubmFtZSwKKwkJCQkJCQl0LT51LnVzZXIucmV2aXNpb24pLAogCQkJCQkgImlwNnRfJXMiLCB0LT51LnVzZXIubmFtZSk7CiAJaWYgKElTX0VSUih0YXJnZXQpIHx8ICF0YXJnZXQpIHsKIAkJZHVwcmludGYoImNoZWNrX2VudHJ5OiBgJXMnIG5vdCBmb3VuZFxuIiwgdC0+dS51c2VyLm5hbWUpOwpAQCAtODIwLDcgKzY1OSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50CiBjaGVja19lbnRyeV9zaXplX2FuZF9ob29rcyhzdHJ1Y3QgaXA2dF9lbnRyeSAqZSwKLQkJCSAgIHN0cnVjdCBpcDZ0X3RhYmxlX2luZm8gKm5ld2luZm8sCisJCQkgICBzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbywKIAkJCSAgIHVuc2lnbmVkIGNoYXIgKmJhc2UsCiAJCQkgICB1bnNpZ25lZCBjaGFyICpsaW1pdCwKIAkJCSAgIGNvbnN0IHVuc2lnbmVkIGludCAqaG9va19lbnRyaWVzLApAQCAtODU0LDcgKzY5Myw3IEBACiAgICAgICAgICAgIDwgMCAobm90IElQNlRfUkVUVVJOKS4gLS1SUiAqLwogCiAJLyogQ2xlYXIgY291bnRlcnMgYW5kIGNvbWVmcm9tICovCi0JZS0+Y291bnRlcnMgPSAoKHN0cnVjdCBpcDZ0X2NvdW50ZXJzKSB7IDAsIDAgfSk7CisJZS0+Y291bnRlcnMgPSAoKHN0cnVjdCB4dF9jb3VudGVycykgeyAwLCAwIH0pOwogCWUtPmNvbWVmcm9tID0gMDsKIAogCSgqaSkrKzsKQEAgLTg4NCw3ICs3MjMsNyBAQAogc3RhdGljIGludAogdHJhbnNsYXRlX3RhYmxlKGNvbnN0IGNoYXIgKm5hbWUsCiAJCXVuc2lnbmVkIGludCB2YWxpZF9ob29rcywKLQkJc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqbmV3aW5mbywKKwkJc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm8sCiAJCXZvaWQgKmVudHJ5MCwKIAkJdW5zaWduZWQgaW50IHNpemUsCiAJCXVuc2lnbmVkIGludCBudW1iZXIsCkBAIC05NjEsNDggKzgwMCwxMCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXA2dF90YWJsZV9pbmZvICoKLXJlcGxhY2VfdGFibGUoc3RydWN0IGlwNnRfdGFibGUgKnRhYmxlLAotCSAgICAgIHVuc2lnbmVkIGludCBudW1fY291bnRlcnMsCi0JICAgICAgc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqbmV3aW5mbywKLQkgICAgICBpbnQgKmVycm9yKQotewotCXN0cnVjdCBpcDZ0X3RhYmxlX2luZm8gKm9sZGluZm87Ci0KLSNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCi0JewotCQlpbnQgY3B1OwotCi0JCWZvcl9lYWNoX2NwdShjcHUpIHsKLQkJCXN0cnVjdCBpcDZ0X2VudHJ5ICp0YWJsZV9iYXNlID0gbmV3aW5mby0+ZW50cmllc1tjcHVdOwotCQkJaWYgKHRhYmxlX2Jhc2UpCi0JCQkJdGFibGVfYmFzZS0+Y29tZWZyb20gPSAweGRlYWQ1N2FjOwotCQl9Ci0JfQotI2VuZGlmCi0KLQkvKiBEbyB0aGUgc3Vic3RpdHV0aW9uLiAqLwotCXdyaXRlX2xvY2tfYmgoJnRhYmxlLT5sb2NrKTsKLQkvKiBDaGVjayBpbnNpZGUgbG9jazogaXMgdGhlIG9sZCBudW1iZXIgY29ycmVjdD8gKi8KLQlpZiAobnVtX2NvdW50ZXJzICE9IHRhYmxlLT5wcml2YXRlLT5udW1iZXIpIHsKLQkJZHVwcmludGYoIm51bV9jb3VudGVycyAhPSB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyICgldS8ldSlcbiIsCi0JCQkgbnVtX2NvdW50ZXJzLCB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyKTsKLQkJd3JpdGVfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7Ci0JCSplcnJvciA9IC1FQUdBSU47Ci0JCXJldHVybiBOVUxMOwotCX0KLQlvbGRpbmZvID0gdGFibGUtPnByaXZhdGU7Ci0JdGFibGUtPnByaXZhdGUgPSBuZXdpbmZvOwotCW5ld2luZm8tPmluaXRpYWxfZW50cmllcyA9IG9sZGluZm8tPmluaXRpYWxfZW50cmllczsKLQl3cml0ZV91bmxvY2tfYmgoJnRhYmxlLT5sb2NrKTsKLQotCXJldHVybiBvbGRpbmZvOwotfQotCiAvKiBHZXRzIGNvdW50ZXJzLiAqLwogc3RhdGljIGlubGluZSBpbnQKIGFkZF9lbnRyeV90b19jb3VudGVyKGNvbnN0IHN0cnVjdCBpcDZ0X2VudHJ5ICplLAotCQkgICAgIHN0cnVjdCBpcDZ0X2NvdW50ZXJzIHRvdGFsW10sCisJCSAgICAgc3RydWN0IHh0X2NvdW50ZXJzIHRvdGFsW10sCiAJCSAgICAgdW5zaWduZWQgaW50ICppKQogewogCUFERF9DT1VOVEVSKHRvdGFsWyppXSwgZS0+Y291bnRlcnMuYmNudCwgZS0+Y291bnRlcnMucGNudCk7CkBAIC0xMDIzLDggKzgyNCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1nZXRfY291bnRlcnMoY29uc3Qgc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqdCwKLQkgICAgIHN0cnVjdCBpcDZ0X2NvdW50ZXJzIGNvdW50ZXJzW10pCitnZXRfY291bnRlcnMoY29uc3Qgc3RydWN0IHh0X3RhYmxlX2luZm8gKnQsCisJICAgICBzdHJ1Y3QgeHRfY291bnRlcnMgY291bnRlcnNbXSkKIHsKIAl1bnNpZ25lZCBpbnQgY3B1OwogCXVuc2lnbmVkIGludCBpOwpAQCAtMTA1OCwxOSArODU5LDIwIEBACiAKIHN0YXRpYyBpbnQKIGNvcHlfZW50cmllc190b191c2VyKHVuc2lnbmVkIGludCB0b3RhbF9zaXplLAotCQkgICAgIHN0cnVjdCBpcDZ0X3RhYmxlICp0YWJsZSwKKwkJICAgICBzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlLAogCQkgICAgIHZvaWQgX191c2VyICp1c2VycHRyKQogewogCXVuc2lnbmVkIGludCBvZmYsIG51bSwgY291bnRlcnNpemU7CiAJc3RydWN0IGlwNnRfZW50cnkgKmU7Ci0Jc3RydWN0IGlwNnRfY291bnRlcnMgKmNvdW50ZXJzOworCXN0cnVjdCB4dF9jb3VudGVycyAqY291bnRlcnM7CisJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGUgPSB0YWJsZS0+cHJpdmF0ZTsKIAlpbnQgcmV0ID0gMDsKIAl2b2lkICpsb2NfY3B1X2VudHJ5OwogCiAJLyogV2UgbmVlZCBhdG9taWMgc25hcHNob3Qgb2YgY291bnRlcnM6IHJlc3QgZG9lc24ndCBjaGFuZ2UKIAkgICAob3RoZXIgdGhhbiBjb21lZnJvbSwgd2hpY2ggdXNlcnNwYWNlIGRvZXNuJ3QgY2FyZQogCSAgIGFib3V0KS4gKi8KLQljb3VudGVyc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXA2dF9jb3VudGVycykgKiB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyOworCWNvdW50ZXJzaXplID0gc2l6ZW9mKHN0cnVjdCB4dF9jb3VudGVycykgKiBwcml2YXRlLT5udW1iZXI7CiAJY291bnRlcnMgPSB2bWFsbG9jKGNvdW50ZXJzaXplKTsKIAogCWlmIChjb3VudGVycyA9PSBOVUxMKQpAQCAtMTA3OCwxMSArODgwLDExIEBACiAKIAkvKiBGaXJzdCwgc3VtIGNvdW50ZXJzLi4uICovCiAJd3JpdGVfbG9ja19iaCgmdGFibGUtPmxvY2spOwotCWdldF9jb3VudGVycyh0YWJsZS0+cHJpdmF0ZSwgY291bnRlcnMpOworCWdldF9jb3VudGVycyhwcml2YXRlLCBjb3VudGVycyk7CiAJd3JpdGVfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CiAKIAkvKiBjaG9vc2UgdGhlIGNvcHkgdGhhdCBpcyBvbiBvdXJjIG5vZGUvY3B1ICovCi0JbG9jX2NwdV9lbnRyeSA9IHRhYmxlLT5wcml2YXRlLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOworCWxvY19jcHVfZW50cnkgPSBwcml2YXRlLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOwogCWlmIChjb3B5X3RvX3VzZXIodXNlcnB0ciwgbG9jX2NwdV9lbnRyeSwgdG90YWxfc2l6ZSkgIT0gMCkgewogCQlyZXQgPSAtRUZBVUxUOwogCQlnb3RvIGZyZWVfY291bnRlcnM7CkBAIC0xMTQxLDg3ICs5NDMsNDIgQEAKIAkgICAgc3RydWN0IGlwNnRfZ2V0X2VudHJpZXMgX191c2VyICp1cHRyKQogewogCWludCByZXQ7Ci0Jc3RydWN0IGlwNnRfdGFibGUgKnQ7CisJc3RydWN0IHh0X3RhYmxlICp0OwogCi0JdCA9IGZpbmRfdGFibGVfbG9jayhlbnRyaWVzLT5uYW1lKTsKKwl0ID0geHRfZmluZF90YWJsZV9sb2NrKEFGX0lORVQ2LCBlbnRyaWVzLT5uYW1lKTsKIAlpZiAodCAmJiAhSVNfRVJSKHQpKSB7Ci0JCWR1cHJpbnRmKCJ0LT5wcml2YXRlLT5udW1iZXIgPSAldVxuIiwKLQkJCSB0LT5wcml2YXRlLT5udW1iZXIpOwotCQlpZiAoZW50cmllcy0+c2l6ZSA9PSB0LT5wcml2YXRlLT5zaXplKQotCQkJcmV0ID0gY29weV9lbnRyaWVzX3RvX3VzZXIodC0+cHJpdmF0ZS0+c2l6ZSwKKwkJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGUgPSB0LT5wcml2YXRlOworCQlkdXByaW50ZigidC0+cHJpdmF0ZS0+bnVtYmVyID0gJXVcbiIsIHByaXZhdGUtPm51bWJlcik7CisJCWlmIChlbnRyaWVzLT5zaXplID09IHByaXZhdGUtPnNpemUpCisJCQlyZXQgPSBjb3B5X2VudHJpZXNfdG9fdXNlcihwcml2YXRlLT5zaXplLAogCQkJCQkJICAgdCwgdXB0ci0+ZW50cnl0YWJsZSk7CiAJCWVsc2UgewogCQkJZHVwcmludGYoImdldF9lbnRyaWVzOiBJJ3ZlIGdvdCAldSBub3QgJXUhXG4iLAotCQkJCSB0LT5wcml2YXRlLT5zaXplLAotCQkJCSBlbnRyaWVzLT5zaXplKTsKKwkJCQkgcHJpdmF0ZS0+c2l6ZSwgZW50cmllcy0+c2l6ZSk7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQl9CiAJCW1vZHVsZV9wdXQodC0+bWUpOwotCQl1cCgmaXA2dF9tdXRleCk7CisJCXh0X3RhYmxlX3VubG9jayh0KTsKIAl9IGVsc2UKIAkJcmV0ID0gdCA/IFBUUl9FUlIodCkgOiAtRU5PRU5UOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV90YWJsZV9pbmZvKHN0cnVjdCBpcDZ0X3RhYmxlX2luZm8gKmluZm8pCi17Ci0JaW50IGNwdTsKLQlmb3JfZWFjaF9jcHUoY3B1KSB7Ci0JCWlmIChpbmZvLT5zaXplIDw9IFBBR0VfU0laRSkKLQkJCWtmcmVlKGluZm8tPmVudHJpZXNbY3B1XSk7Ci0JCWVsc2UKLQkJCXZmcmVlKGluZm8tPmVudHJpZXNbY3B1XSk7Ci0JfQotCWtmcmVlKGluZm8pOwotfQotCi1zdGF0aWMgc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqYWxsb2NfdGFibGVfaW5mbyh1bnNpZ25lZCBpbnQgc2l6ZSkKLXsKLQlzdHJ1Y3QgaXA2dF90YWJsZV9pbmZvICpuZXdpbmZvOwotCWludCBjcHU7Ci0KLQluZXdpbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlwNnRfdGFibGVfaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghbmV3aW5mbykKLQkJcmV0dXJuIE5VTEw7Ci0KLQluZXdpbmZvLT5zaXplID0gc2l6ZTsKLQotCWZvcl9lYWNoX2NwdShjcHUpIHsKLQkJaWYgKHNpemUgPD0gUEFHRV9TSVpFKQotCQkJbmV3aW5mby0+ZW50cmllc1tjcHVdID0ga21hbGxvY19ub2RlKHNpemUsCi0JCQkJCQkJR0ZQX0tFUk5FTCwKLQkJCQkJCQljcHVfdG9fbm9kZShjcHUpKTsKLQkJZWxzZQotCQkJbmV3aW5mby0+ZW50cmllc1tjcHVdID0gdm1hbGxvY19ub2RlKHNpemUsCi0JCQkJCQkJICAgICBjcHVfdG9fbm9kZShjcHUpKTsKLQkJaWYgKG5ld2luZm8tPmVudHJpZXNbY3B1XSA9PSBOVUxMKSB7Ci0JCQlmcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQotCXJldHVybiBuZXdpbmZvOwotfQotCiBzdGF0aWMgaW50CiBkb19yZXBsYWNlKHZvaWQgX191c2VyICp1c2VyLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCWludCByZXQ7CiAJc3RydWN0IGlwNnRfcmVwbGFjZSB0bXA7Ci0Jc3RydWN0IGlwNnRfdGFibGUgKnQ7Ci0Jc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqbmV3aW5mbywgKm9sZGluZm87Ci0Jc3RydWN0IGlwNnRfY291bnRlcnMgKmNvdW50ZXJzOworCXN0cnVjdCB4dF90YWJsZSAqdDsKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbywgKm9sZGluZm87CisJc3RydWN0IHh0X2NvdW50ZXJzICpjb3VudGVyczsKIAl2b2lkICpsb2NfY3B1X2VudHJ5LCAqbG9jX2NwdV9vbGRfZW50cnk7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwgdXNlciwgc2l6ZW9mKHRtcCkpICE9IDApCiAJCXJldHVybiAtRUZBVUxUOwogCi0JLyogUGVkYW50cnk6IHByZXZlbnQgdGhlbSBmcm9tIGhpdHRpbmcgQlVHKCkgaW4gdm1hbGxvYy5jIC0tUlIgKi8KLQlpZiAoKFNNUF9BTElHTih0bXAuc2l6ZSkgPj4gUEFHRV9TSElGVCkgKyAyID4gbnVtX3BoeXNwYWdlcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQluZXdpbmZvID0gYWxsb2NfdGFibGVfaW5mbyh0bXAuc2l6ZSk7CisJbmV3aW5mbyA9IHh0X2FsbG9jX3RhYmxlX2luZm8odG1wLnNpemUpOwogCWlmICghbmV3aW5mbykKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTEyMzMsNyArOTkwLDcgQEAKIAkJZ290byBmcmVlX25ld2luZm87CiAJfQogCi0JY291bnRlcnMgPSB2bWFsbG9jKHRtcC5udW1fY291bnRlcnMgKiBzaXplb2Yoc3RydWN0IGlwNnRfY291bnRlcnMpKTsKKwljb3VudGVycyA9IHZtYWxsb2ModG1wLm51bV9jb3VudGVycyAqIHNpemVvZihzdHJ1Y3QgeHRfY291bnRlcnMpKTsKIAlpZiAoIWNvdW50ZXJzKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZnJlZV9uZXdpbmZvOwpAQCAtMTI0Nyw3ICsxMDA0LDcgQEAKIAogCWR1cHJpbnRmKCJpcF90YWJsZXM6IFRyYW5zbGF0ZWQgdGFibGVcbiIpOwogCi0JdCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfdGFibGVfbG9jayh0bXAubmFtZSksCisJdCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfdGFibGVfbG9jayhBRl9JTkVUNiwgdG1wLm5hbWUpLAogCQkJCSAgICAiaXA2dGFibGVfJXMiLCB0bXAubmFtZSk7CiAJaWYgKCF0IHx8IElTX0VSUih0KSkgewogCQlyZXQgPSB0ID8gUFRSX0VSUih0KSA6IC1FTk9FTlQ7CkBAIC0xMjYyLDcgKzEwMTksNyBAQAogCQlnb3RvIHB1dF9tb2R1bGU7CiAJfQogCi0Jb2xkaW5mbyA9IHJlcGxhY2VfdGFibGUodCwgdG1wLm51bV9jb3VudGVycywgbmV3aW5mbywgJnJldCk7CisJb2xkaW5mbyA9IHh0X3JlcGxhY2VfdGFibGUodCwgdG1wLm51bV9jb3VudGVycywgbmV3aW5mbywgJnJldCk7CiAJaWYgKCFvbGRpbmZvKQogCQlnb3RvIHB1dF9tb2R1bGU7CiAKQEAgLTEyODEsMjMgKzEwMzgsMjMgQEAKIAkvKiBEZWNyZWFzZSBtb2R1bGUgdXNhZ2UgY291bnRzIGFuZCBmcmVlIHJlc291cmNlICovCiAJbG9jX2NwdV9vbGRfZW50cnkgPSBvbGRpbmZvLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOwogCUlQNlRfRU5UUllfSVRFUkFURShsb2NfY3B1X29sZF9lbnRyeSwgb2xkaW5mby0+c2l6ZSwgY2xlYW51cF9lbnRyeSxOVUxMKTsKLQlmcmVlX3RhYmxlX2luZm8ob2xkaW5mbyk7CisJeHRfZnJlZV90YWJsZV9pbmZvKG9sZGluZm8pOwogCWlmIChjb3B5X3RvX3VzZXIodG1wLmNvdW50ZXJzLCBjb3VudGVycywKLQkJCSBzaXplb2Yoc3RydWN0IGlwNnRfY291bnRlcnMpICogdG1wLm51bV9jb3VudGVycykgIT0gMCkKKwkJCSBzaXplb2Yoc3RydWN0IHh0X2NvdW50ZXJzKSAqIHRtcC5udW1fY291bnRlcnMpICE9IDApCiAJCXJldCA9IC1FRkFVTFQ7CiAJdmZyZWUoY291bnRlcnMpOwotCXVwKCZpcDZ0X211dGV4KTsKKwl4dF90YWJsZV91bmxvY2sodCk7CiAJcmV0dXJuIHJldDsKIAogIHB1dF9tb2R1bGU6CiAJbW9kdWxlX3B1dCh0LT5tZSk7Ci0JdXAoJmlwNnRfbXV0ZXgpOworCXh0X3RhYmxlX3VubG9jayh0KTsKICBmcmVlX25ld2luZm9fY291bnRlcnNfdW50cmFuczoKIAlJUDZUX0VOVFJZX0lURVJBVEUobG9jX2NwdV9lbnRyeSwgbmV3aW5mby0+c2l6ZSwgY2xlYW51cF9lbnRyeSxOVUxMKTsKICBmcmVlX25ld2luZm9fY291bnRlcnM6CiAJdmZyZWUoY291bnRlcnMpOwogIGZyZWVfbmV3aW5mbzoKLQlmcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7CisJeHRfZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEzMDUsNyArMTA2Miw3IEBACiAgKiBhbmQgZXZlcnl0aGluZyBpcyBPSy4gKi8KIHN0YXRpYyBpbmxpbmUgaW50CiBhZGRfY291bnRlcl90b19lbnRyeShzdHJ1Y3QgaXA2dF9lbnRyeSAqZSwKLQkJICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9jb3VudGVycyBhZGRtZVtdLAorCQkgICAgIGNvbnN0IHN0cnVjdCB4dF9jb3VudGVycyBhZGRtZVtdLAogCQkgICAgIHVuc2lnbmVkIGludCAqaSkKIHsKICNpZiAwCkBAIC0xMzI3LDE1ICsxMDg0LDE2IEBACiBkb19hZGRfY291bnRlcnModm9pZCBfX3VzZXIgKnVzZXIsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJdW5zaWduZWQgaW50IGk7Ci0Jc3RydWN0IGlwNnRfY291bnRlcnNfaW5mbyB0bXAsICpwYWRkYzsKLQlzdHJ1Y3QgaXA2dF90YWJsZSAqdDsKKwlzdHJ1Y3QgeHRfY291bnRlcnNfaW5mbyB0bXAsICpwYWRkYzsKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZTsKKwlzdHJ1Y3QgeHRfdGFibGUgKnQ7CiAJaW50IHJldCA9IDA7CiAJdm9pZCAqbG9jX2NwdV9lbnRyeTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCB1c2VyLCBzaXplb2YodG1wKSkgIT0gMCkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpZiAobGVuICE9IHNpemVvZih0bXApICsgdG1wLm51bV9jb3VudGVycypzaXplb2Yoc3RydWN0IGlwNnRfY291bnRlcnMpKQorCWlmIChsZW4gIT0gc2l6ZW9mKHRtcCkgKyB0bXAubnVtX2NvdW50ZXJzKnNpemVvZihzdHJ1Y3QgeHRfY291bnRlcnMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXBhZGRjID0gdm1hbGxvYyhsZW4pOwpAQCAtMTM0NywyOSArMTEwNSwzMCBAQAogCQlnb3RvIGZyZWU7CiAJfQogCi0JdCA9IGZpbmRfdGFibGVfbG9jayh0bXAubmFtZSk7CisJdCA9IHh0X2ZpbmRfdGFibGVfbG9jayhBRl9JTkVUNiwgdG1wLm5hbWUpOwogCWlmICghdCB8fCBJU19FUlIodCkpIHsKIAkJcmV0ID0gdCA/IFBUUl9FUlIodCkgOiAtRU5PRU5UOwogCQlnb3RvIGZyZWU7CiAJfQogCiAJd3JpdGVfbG9ja19iaCgmdC0+bG9jayk7Ci0JaWYgKHQtPnByaXZhdGUtPm51bWJlciAhPSBwYWRkYy0+bnVtX2NvdW50ZXJzKSB7CisJcHJpdmF0ZSA9IHQtPnByaXZhdGU7CisJaWYgKHByaXZhdGUtPm51bWJlciAhPSBwYWRkYy0+bnVtX2NvdW50ZXJzKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gdW5sb2NrX3VwX2ZyZWU7CiAJfQogCiAJaSA9IDA7CiAJLyogQ2hvb3NlIHRoZSBjb3B5IHRoYXQgaXMgb24gb3VyIG5vZGUgKi8KLQlsb2NfY3B1X2VudHJ5ID0gdC0+cHJpdmF0ZS0+ZW50cmllc1tzbXBfcHJvY2Vzc29yX2lkKCldOworCWxvY19jcHVfZW50cnkgPSBwcml2YXRlLT5lbnRyaWVzW3NtcF9wcm9jZXNzb3JfaWQoKV07CiAJSVA2VF9FTlRSWV9JVEVSQVRFKGxvY19jcHVfZW50cnksCi0JCQkgIHQtPnByaXZhdGUtPnNpemUsCisJCQkgIHByaXZhdGUtPnNpemUsCiAJCQkgIGFkZF9jb3VudGVyX3RvX2VudHJ5LAogCQkJICBwYWRkYy0+Y291bnRlcnMsCiAJCQkgICZpKTsKICB1bmxvY2tfdXBfZnJlZToKIAl3cml0ZV91bmxvY2tfYmgoJnQtPmxvY2spOwotCXVwKCZpcDZ0X211dGV4KTsKKwl4dF90YWJsZV91bmxvY2sodCk7CiAJbW9kdWxlX3B1dCh0LT5tZSk7CiAgZnJlZToKIAl2ZnJlZShwYWRkYyk7CkBAIC0xNDEzLDcgKzExNzIsNyBAQAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBJUDZUX1NPX0dFVF9JTkZPOiB7CiAJCWNoYXIgbmFtZVtJUDZUX1RBQkxFX01BWE5BTUVMRU5dOwotCQlzdHJ1Y3QgaXA2dF90YWJsZSAqdDsKKwkJc3RydWN0IHh0X3RhYmxlICp0OwogCiAJCWlmICgqbGVuICE9IHNpemVvZihzdHJ1Y3QgaXA2dF9nZXRpbmZvKSkgewogCQkJZHVwcmludGYoImxlbmd0aCAldSAhPSAldVxuIiwgKmxlbiwKQEAgLTE0MjgsMjUgKzExODcsMjYgQEAKIAkJfQogCQluYW1lW0lQNlRfVEFCTEVfTUFYTkFNRUxFTi0xXSA9ICdcMCc7CiAKLQkJdCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfdGFibGVfbG9jayhuYW1lKSwKKwkJdCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfdGFibGVfbG9jayhBRl9JTkVUNiwgbmFtZSksCiAJCQkJCSAgICAiaXA2dGFibGVfJXMiLCBuYW1lKTsKIAkJaWYgKHQgJiYgIUlTX0VSUih0KSkgewogCQkJc3RydWN0IGlwNnRfZ2V0aW5mbyBpbmZvOworCQkJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGUgPSB0LT5wcml2YXRlOwogCiAJCQlpbmZvLnZhbGlkX2hvb2tzID0gdC0+dmFsaWRfaG9va3M7Ci0JCQltZW1jcHkoaW5mby5ob29rX2VudHJ5LCB0LT5wcml2YXRlLT5ob29rX2VudHJ5LAorCQkJbWVtY3B5KGluZm8uaG9va19lbnRyeSwgcHJpdmF0ZS0+aG9va19lbnRyeSwKIAkJCSAgICAgICBzaXplb2YoaW5mby5ob29rX2VudHJ5KSk7Ci0JCQltZW1jcHkoaW5mby51bmRlcmZsb3csIHQtPnByaXZhdGUtPnVuZGVyZmxvdywKKwkJCW1lbWNweShpbmZvLnVuZGVyZmxvdywgcHJpdmF0ZS0+dW5kZXJmbG93LAogCQkJICAgICAgIHNpemVvZihpbmZvLnVuZGVyZmxvdykpOwotCQkJaW5mby5udW1fZW50cmllcyA9IHQtPnByaXZhdGUtPm51bWJlcjsKLQkJCWluZm8uc2l6ZSA9IHQtPnByaXZhdGUtPnNpemU7CisJCQlpbmZvLm51bV9lbnRyaWVzID0gcHJpdmF0ZS0+bnVtYmVyOworCQkJaW5mby5zaXplID0gcHJpdmF0ZS0+c2l6ZTsKIAkJCW1lbWNweShpbmZvLm5hbWUsIG5hbWUsIHNpemVvZihpbmZvLm5hbWUpKTsKIAogCQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyLCAmaW5mbywgKmxlbikgIT0gMCkKIAkJCQlyZXQgPSAtRUZBVUxUOwogCQkJZWxzZQogCQkJCXJldCA9IDA7Ci0JCQl1cCgmaXA2dF9tdXRleCk7CisJCQl4dF90YWJsZV91bmxvY2sodCk7CiAJCQltb2R1bGVfcHV0KHQtPm1lKTsKIAkJfSBlbHNlCiAJCQlyZXQgPSB0ID8gUFRSX0VSUih0KSA6IC1FTk9FTlQ7CkBAIC0xNDczLDcgKzEyMzMsNyBAQAogCWNhc2UgSVA2VF9TT19HRVRfUkVWSVNJT05fTUFUQ0g6CiAJY2FzZSBJUDZUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQ6IHsKIAkJc3RydWN0IGlwNnRfZ2V0X3JldmlzaW9uIHJldjsKLQkJaW50ICgqcmV2Zm4pKGNvbnN0IGNoYXIgKiwgdTgsIGludCAqKTsKKwkJaW50IHRhcmdldDsKIAogCQlpZiAoKmxlbiAhPSBzaXplb2YocmV2KSkgewogCQkJcmV0ID0gLUVJTlZBTDsKQEAgLTE0ODUsMTIgKzEyNDUsMTMgQEAKIAkJfQogCiAJCWlmIChjbWQgPT0gSVA2VF9TT19HRVRfUkVWSVNJT05fVEFSR0VUKQotCQkJcmV2Zm4gPSB0YXJnZXRfcmV2Zm47CisJCQl0YXJnZXQgPSAxOwogCQllbHNlCi0JCQlyZXZmbiA9IG1hdGNoX3JldmZuOworCQkJdGFyZ2V0ID0gMDsKIAotCQl0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShmaW5kX3JldmlzaW9uKHJldi5uYW1lLCByZXYucmV2aXNpb24sCi0JCQkJCQkgICAgICByZXZmbiwgJnJldCksCisJCXRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfcmV2aXNpb24oQUZfSU5FVDYsIHJldi5uYW1lLAorCQkJCQkJCSByZXYucmV2aXNpb24sCisJCQkJCQkJIHRhcmdldCwgJnJldCksCiAJCQkJCSJpcDZ0XyVzIiwgcmV2Lm5hbWUpOwogCQlicmVhazsKIAl9CkBAIC0xNTAzLDYxICsxMjY0LDE2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogUmVnaXN0cmF0aW9uIGhvb2tzIGZvciB0YXJnZXRzLiAqLwotaW50Ci1pcDZ0X3JlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgaXA2dF90YXJnZXQgKnRhcmdldCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZpcDZ0X211dGV4KTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7Ci0JbGlzdF9hZGQoJnRhcmdldC0+bGlzdCwgJmlwNnRfdGFyZ2V0KTsKLQl1cCgmaXA2dF9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZAotaXA2dF91bnJlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgaXA2dF90YXJnZXQgKnRhcmdldCkKLXsKLQlkb3duKCZpcDZ0X211dGV4KTsKLQlMSVNUX0RFTEVURSgmaXA2dF90YXJnZXQsIHRhcmdldCk7Ci0JdXAoJmlwNnRfbXV0ZXgpOwotfQotCi1pbnQKLWlwNnRfcmVnaXN0ZXJfbWF0Y2goc3RydWN0IGlwNnRfbWF0Y2ggKm1hdGNoKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJmlwNnRfbXV0ZXgpOwotCWlmIChyZXQgIT0gMCkKLQkJcmV0dXJuIHJldDsKLQotCWxpc3RfYWRkKCZtYXRjaC0+bGlzdCwgJmlwNnRfbWF0Y2gpOwotCXVwKCZpcDZ0X211dGV4KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQKLWlwNnRfdW5yZWdpc3Rlcl9tYXRjaChzdHJ1Y3QgaXA2dF9tYXRjaCAqbWF0Y2gpCi17Ci0JZG93bigmaXA2dF9tdXRleCk7Ci0JTElTVF9ERUxFVEUoJmlwNnRfbWF0Y2gsIG1hdGNoKTsKLQl1cCgmaXA2dF9tdXRleCk7Ci19Ci0KLWludCBpcDZ0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCBpcDZ0X3RhYmxlICp0YWJsZSwKK2ludCBpcDZ0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCB4dF90YWJsZSAqdGFibGUsCiAJCQljb25zdCBzdHJ1Y3QgaXA2dF9yZXBsYWNlICpyZXBsKQogewogCWludCByZXQ7Ci0Jc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqbmV3aW5mbzsKLQlzdGF0aWMgc3RydWN0IGlwNnRfdGFibGVfaW5mbyBib290c3RyYXAKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbzsKKwlzdGF0aWMgc3RydWN0IHh0X3RhYmxlX2luZm8gYm9vdHN0cmFwCiAJCT0geyAwLCAwLCAwLCB7IDAgfSwgeyAwIH0sIHsgfSB9OwogCXZvaWQgKmxvY19jcHVfZW50cnk7CiAKLQluZXdpbmZvID0gYWxsb2NfdGFibGVfaW5mbyhyZXBsLT5zaXplKTsKKwluZXdpbmZvID0geHRfYWxsb2NfdGFibGVfaW5mbyhyZXBsLT5zaXplKTsKIAlpZiAoIW5ld2luZm8pCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xNTcxLDI0NCArMTI4NywyOSBAQAogCQkJICAgICAgcmVwbC0+aG9va19lbnRyeSwKIAkJCSAgICAgIHJlcGwtPnVuZGVyZmxvdyk7CiAJaWYgKHJldCAhPSAwKSB7Ci0JCWZyZWVfdGFibGVfaW5mbyhuZXdpbmZvKTsKKwkJeHRfZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmaXA2dF9tdXRleCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWZyZWVfdGFibGVfaW5mbyhuZXdpbmZvKTsKKwlpZiAoeHRfcmVnaXN0ZXJfdGFibGUodGFibGUsICZib290c3RyYXAsIG5ld2luZm8pICE9IDApIHsKKwkJeHRfZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCS8qIERvbid0IGF1dG9sb2FkOiB3ZSdkIGVhdCBvdXIgdGFpbC4uLiAqLwotCWlmIChsaXN0X25hbWVkX2ZpbmQoJmlwNnRfdGFibGVzLCB0YWJsZS0+bmFtZSkpIHsKLQkJcmV0ID0gLUVFWElTVDsKLQkJZ290byBmcmVlX3VubG9jazsKLQl9Ci0KLQkvKiBTaW1wbGlmaWVzIHJlcGxhY2VfdGFibGUgY29kZS4gKi8KLQl0YWJsZS0+cHJpdmF0ZSA9ICZib290c3RyYXA7Ci0JaWYgKCFyZXBsYWNlX3RhYmxlKHRhYmxlLCAwLCBuZXdpbmZvLCAmcmV0KSkKLQkJZ290byBmcmVlX3VubG9jazsKLQotCWR1cHJpbnRmKCJ0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyID0gJXVcbiIsCi0JCSB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyKTsKLQotCS8qIHNhdmUgbnVtYmVyIG9mIGluaXRpYWwgZW50cmllcyAqLwotCXRhYmxlLT5wcml2YXRlLT5pbml0aWFsX2VudHJpZXMgPSB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyOwotCi0Jcndsb2NrX2luaXQoJnRhYmxlLT5sb2NrKTsKLQlsaXN0X3ByZXBlbmQoJmlwNnRfdGFibGVzLCB0YWJsZSk7Ci0KLSB1bmxvY2s6Ci0JdXAoJmlwNnRfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci0KLSBmcmVlX3VubG9jazoKLQlmcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7Ci0JZ290byB1bmxvY2s7CisJcmV0dXJuIDA7CiB9CiAKLXZvaWQgaXA2dF91bnJlZ2lzdGVyX3RhYmxlKHN0cnVjdCBpcDZ0X3RhYmxlICp0YWJsZSkKK3ZvaWQgaXA2dF91bnJlZ2lzdGVyX3RhYmxlKHN0cnVjdCB4dF90YWJsZSAqdGFibGUpCiB7CisJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGU7CiAJdm9pZCAqbG9jX2NwdV9lbnRyeTsKIAotCWRvd24oJmlwNnRfbXV0ZXgpOwotCUxJU1RfREVMRVRFKCZpcDZ0X3RhYmxlcywgdGFibGUpOwotCXVwKCZpcDZ0X211dGV4KTsKKwlwcml2YXRlID0geHRfdW5yZWdpc3Rlcl90YWJsZSh0YWJsZSk7CiAKIAkvKiBEZWNyZWFzZSBtb2R1bGUgdXNhZ2UgY291bnRzIGFuZCBmcmVlIHJlc291cmNlcyAqLwotCWxvY19jcHVfZW50cnkgPSB0YWJsZS0+cHJpdmF0ZS0+ZW50cmllc1tyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXTsKLQlJUDZUX0VOVFJZX0lURVJBVEUobG9jX2NwdV9lbnRyeSwgdGFibGUtPnByaXZhdGUtPnNpemUsCi0JCQkgIGNsZWFudXBfZW50cnksIE5VTEwpOwotCWZyZWVfdGFibGVfaW5mbyh0YWJsZS0+cHJpdmF0ZSk7Ci19Ci0KLS8qIFJldHVybnMgMSBpZiB0aGUgcG9ydCBpcyBtYXRjaGVkIGJ5IHRoZSByYW5nZSwgMCBvdGhlcndpc2UgKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1wb3J0X21hdGNoKHVfaW50MTZfdCBtaW4sIHVfaW50MTZfdCBtYXgsIHVfaW50MTZfdCBwb3J0LCBpbnQgaW52ZXJ0KQotewotCWludCByZXQ7Ci0KLQlyZXQgPSAocG9ydCA+PSBtaW4gJiYgcG9ydCA8PSBtYXgpIF4gaW52ZXJ0OwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQKLXRjcF9maW5kX29wdGlvbih1X2ludDhfdCBvcHRpb24sCi0JCWNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCXVuc2lnbmVkIGludCB0Y3BvZmYsCi0JCXVuc2lnbmVkIGludCBvcHRsZW4sCi0JCWludCBpbnZlcnQsCi0JCWludCAqaG90ZHJvcCkKLXsKLQkvKiB0Y3AuZG9mZiBpcyBvbmx5IDQgYml0cywgaWUuIG1heCAxNSAqIDQgYnl0ZXMgKi8KLQl1X2ludDhfdCBfb3B0WzYwIC0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpXSwgKm9wOwotCXVuc2lnbmVkIGludCBpOwotCi0JZHVwcmludGYoInRjcF9tYXRjaDogZmluZGluZyBvcHRpb25cbiIpOwotCWlmICghb3B0bGVuKQotCQlyZXR1cm4gaW52ZXJ0OwotCS8qIElmIHdlIGRvbid0IGhhdmUgdGhlIHdob2xlIGhlYWRlciwgZHJvcCBwYWNrZXQuICovCi0Jb3AgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCB0Y3BvZmYgKyBzaXplb2Yoc3RydWN0IHRjcGhkciksIG9wdGxlbiwKLQkJCQlfb3B0KTsKLQlpZiAob3AgPT0gTlVMTCkgewotCQkqaG90ZHJvcCA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBvcHRsZW47ICkgewotCQlpZiAob3BbaV0gPT0gb3B0aW9uKSByZXR1cm4gIWludmVydDsKLQkJaWYgKG9wW2ldIDwgMikgaSsrOwotCQllbHNlIGkgKz0gb3BbaSsxXT86MTsKLQl9Ci0KLQlyZXR1cm4gaW52ZXJ0OwotfQotCi1zdGF0aWMgaW50Ci10Y3BfbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JICBjb25zdCB2b2lkICptYXRjaGluZm8sCi0JICBpbnQgb2Zmc2V0LAotCSAgdW5zaWduZWQgaW50IHByb3RvZmYsCi0JICBpbnQgKmhvdGRyb3ApCi17Ci0Jc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOwotCWNvbnN0IHN0cnVjdCBpcDZ0X3RjcCAqdGNwaW5mbyA9IG1hdGNoaW5mbzsKLQotCWlmIChvZmZzZXQpIHsKLQkJLyogVG8gcXVvdGUgQWxhbjoKLQotCQkgICBEb24ndCBhbGxvdyBhIGZyYWdtZW50IG9mIFRDUCA4IGJ5dGVzIGluLiBOb2JvZHkgbm9ybWFsCi0JCSAgIGNhdXNlcyB0aGlzLiBJdHMgYSBjcmFja2VyIHRyeWluZyB0byBicmVhayBpbiBieSBkb2luZyBhCi0JCSAgIGZsYWcgb3ZlcndyaXRlIHRvIHBhc3MgdGhlIGRpcmVjdGlvbiBjaGVja3MuCi0JCSovCi0JCWlmIChvZmZzZXQgPT0gMSkgewotCQkJZHVwcmludGYoIkRyb3BwaW5nIGV2aWwgVENQIG9mZnNldD0xIGZyYWcuXG4iKTsKLQkJCSpob3Rkcm9wID0gMTsKLQkJfQotCQkvKiBNdXN0IG5vdCBiZSBhIGZyYWdtZW50LiAqLwotCQlyZXR1cm4gMDsKLQl9Ci0KLSNkZWZpbmUgRldJTlZUQ1AoYm9vbCxpbnZmbGcpICgoYm9vbCkgXiAhISh0Y3BpbmZvLT5pbnZmbGFncyAmIGludmZsZykpCi0KLQl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsIHNpemVvZihfdGNwaCksICZfdGNwaCk7Ci0JaWYgKHRoID09IE5VTEwpIHsKLQkJLyogV2UndmUgYmVlbiBhc2tlZCB0byBleGFtaW5lIHRoaXMgcGFja2V0LCBhbmQgd2UKLQkJICAgY2FuJ3QuICBIZW5jZSwgbm8gY2hvaWNlIGJ1dCB0byBkcm9wLiAqLwotCQlkdXByaW50ZigiRHJvcHBpbmcgZXZpbCBUQ1Agb2Zmc2V0PTAgdGlueWdyYW0uXG4iKTsKLQkJKmhvdGRyb3AgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoIXBvcnRfbWF0Y2godGNwaW5mby0+c3B0c1swXSwgdGNwaW5mby0+c3B0c1sxXSwKLQkJCW50b2hzKHRoLT5zb3VyY2UpLAotCQkJISEodGNwaW5mby0+aW52ZmxhZ3MgJiBJUDZUX1RDUF9JTlZfU1JDUFQpKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFwb3J0X21hdGNoKHRjcGluZm8tPmRwdHNbMF0sIHRjcGluZm8tPmRwdHNbMV0sCi0JCQludG9ocyh0aC0+ZGVzdCksCi0JCQkhISh0Y3BpbmZvLT5pbnZmbGFncyAmIElQNlRfVENQX0lOVl9EU1RQVCkpKQotCQlyZXR1cm4gMDsKLQlpZiAoIUZXSU5WVENQKCgoKHVuc2lnbmVkIGNoYXIgKil0aClbMTNdICYgdGNwaW5mby0+ZmxnX21hc2spCi0JCSAgICAgID09IHRjcGluZm8tPmZsZ19jbXAsCi0JCSAgICAgIElQNlRfVENQX0lOVl9GTEFHUykpCi0JCXJldHVybiAwOwotCWlmICh0Y3BpbmZvLT5vcHRpb24pIHsKLQkJaWYgKHRoLT5kb2ZmICogNCA8IHNpemVvZihfdGNwaCkpIHsKLQkJCSpob3Rkcm9wID0gMTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmICghdGNwX2ZpbmRfb3B0aW9uKHRjcGluZm8tPm9wdGlvbiwgc2tiLCBwcm90b2ZmLAotCQkJCSAgICAgdGgtPmRvZmYqNCAtIHNpemVvZigqdGgpLAotCQkJCSAgICAgdGNwaW5mby0+aW52ZmxhZ3MgJiBJUDZUX1RDUF9JTlZfT1BUSU9OLAotCQkJCSAgICAgaG90ZHJvcCkpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KLXN0YXRpYyBpbnQKLXRjcF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICAgICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcHY2LAotCSAgICAgICB2b2lkICptYXRjaGluZm8sCi0JICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0JICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0JY29uc3Qgc3RydWN0IGlwNnRfdGNwICp0Y3BpbmZvID0gbWF0Y2hpbmZvOwotCi0JLyogTXVzdCBzcGVjaWZ5IHByb3RvID09IFRDUCwgYW5kIG5vIHVua25vd24gaW52ZmxhZ3MgKi8KLQlyZXR1cm4gaXB2Ni0+cHJvdG8gPT0gSVBQUk9UT19UQ1AKLQkJJiYgIShpcHY2LT5pbnZmbGFncyAmIElQNlRfSU5WX1BST1RPKQotCQkmJiBtYXRjaHNpemUgPT0gSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfdGNwKSkKLQkJJiYgISh0Y3BpbmZvLT5pbnZmbGFncyAmIH5JUDZUX1RDUF9JTlZfTUFTSyk7Ci19Ci0KLXN0YXRpYyBpbnQKLXVkcF9tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLQkgIGludCBvZmZzZXQsCi0JICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLQkgIGludCAqaG90ZHJvcCkKLXsKLQlzdHJ1Y3QgdWRwaGRyIF91ZHBoLCAqdWg7Ci0JY29uc3Qgc3RydWN0IGlwNnRfdWRwICp1ZHBpbmZvID0gbWF0Y2hpbmZvOwotCi0JLyogTXVzdCBub3QgYmUgYSBmcmFnbWVudC4gKi8KLQlpZiAob2Zmc2V0KQotCQlyZXR1cm4gMDsKLQotCXVoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwgc2l6ZW9mKF91ZHBoKSwgJl91ZHBoKTsKLQlpZiAodWggPT0gTlVMTCkgewotCQkvKiBXZSd2ZSBiZWVuIGFza2VkIHRvIGV4YW1pbmUgdGhpcyBwYWNrZXQsIGFuZCB3ZQotCQkgICBjYW4ndC4gIEhlbmNlLCBubyBjaG9pY2UgYnV0IHRvIGRyb3AuICovCi0JCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIFVEUCB0aW55Z3JhbS5cbiIpOwotCQkqaG90ZHJvcCA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiBwb3J0X21hdGNoKHVkcGluZm8tPnNwdHNbMF0sIHVkcGluZm8tPnNwdHNbMV0sCi0JCQkgIG50b2hzKHVoLT5zb3VyY2UpLAotCQkJICAhISh1ZHBpbmZvLT5pbnZmbGFncyAmIElQNlRfVURQX0lOVl9TUkNQVCkpCi0JCSYmIHBvcnRfbWF0Y2godWRwaW5mby0+ZHB0c1swXSwgdWRwaW5mby0+ZHB0c1sxXSwKLQkJCSAgICAgIG50b2hzKHVoLT5kZXN0KSwKLQkJCSAgICAgICEhKHVkcGluZm8tPmludmZsYWdzICYgSVA2VF9VRFBfSU5WX0RTVFBUKSk7Ci19Ci0KLS8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KLXN0YXRpYyBpbnQKLXVkcF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICAgICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcHY2LAotCSAgICAgICB2b2lkICptYXRjaGluZm8sCi0JICAgICAgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAotCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWNvbnN0IHN0cnVjdCBpcDZ0X3VkcCAqdWRwaW5mbyA9IG1hdGNoaW5mbzsKLQotCS8qIE11c3Qgc3BlY2lmeSBwcm90byA9PSBVRFAsIGFuZCBubyB1bmtub3duIGludmZsYWdzICovCi0JaWYgKGlwdjYtPnByb3RvICE9IElQUFJPVE9fVURQIHx8IChpcHY2LT5pbnZmbGFncyAmIElQNlRfSU5WX1BST1RPKSkgewotCQlkdXByaW50ZigiaXA2dF91ZHA6IFByb3RvY29sICV1ICE9ICV1XG4iLCBpcHY2LT5wcm90bywKLQkJCSBJUFBST1RPX1VEUCk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAobWF0Y2hpbmZvc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF91ZHApKSkgewotCQlkdXByaW50ZigiaXA2dF91ZHA6IG1hdGNoc2l6ZSAldSAhPSAldVxuIiwKLQkJCSBtYXRjaGluZm9zaXplLCBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF91ZHApKSk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAodWRwaW5mby0+aW52ZmxhZ3MgJiB+SVA2VF9VRFBfSU5WX01BU0spIHsKLQkJZHVwcmludGYoImlwNnRfdWRwOiB1bmtub3duIGZsYWdzICVYXG4iLAotCQkJIHVkcGluZm8tPmludmZsYWdzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7CisJbG9jX2NwdV9lbnRyeSA9IHByaXZhdGUtPmVudHJpZXNbcmF3X3NtcF9wcm9jZXNzb3JfaWQoKV07CisJSVA2VF9FTlRSWV9JVEVSQVRFKGxvY19jcHVfZW50cnksIHByaXZhdGUtPnNpemUsIGNsZWFudXBfZW50cnksIE5VTEwpOworCXh0X2ZyZWVfdGFibGVfaW5mbyhwcml2YXRlKTsKIH0KIAogLyogUmV0dXJucyAxIGlmIHRoZSB0eXBlIGFuZCBjb2RlIGlzIG1hdGNoZWQgYnkgdGhlIHJhbmdlLCAwIG90aGVyd2lzZSAqLwpAQCAtMTg1NiwxMSArMTM1NywxMiBAQAogLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwogc3RhdGljIGludAogaWNtcDZfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcHY2LAorCSAgIGNvbnN0IHZvaWQgKmVudHJ5LAogCSAgIHZvaWQgKm1hdGNoaW5mbywKIAkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7CisJY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcHY2ID0gZW50cnk7CiAJY29uc3Qgc3RydWN0IGlwNnRfaWNtcCAqaWNtcGluZm8gPSBtYXRjaGluZm87CiAKIAkvKiBNdXN0IHNwZWNpZnkgcHJvdG8gPT0gSUNNUCwgYW5kIG5vIHVua25vd24gaW52ZmxhZ3MgKi8KQEAgLTE4OTAsMTY0ICsxMzkyLDQyIEBACiAJLmdldAkJPSBkb19pcDZ0X2dldF9jdGwsCiB9OwogCi1zdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggdGNwX21hdGNoc3RydWN0ID0gewotCS5uYW1lCQk9ICJ0Y3AiLAotCS5tYXRjaAkJPSAmdGNwX21hdGNoLAotCS5jaGVja2VudHJ5CT0gJnRjcF9jaGVja2VudHJ5LAotfTsKLQotc3RhdGljIHN0cnVjdCBpcDZ0X21hdGNoIHVkcF9tYXRjaHN0cnVjdCA9IHsKLQkubmFtZQkJPSAidWRwIiwKLQkubWF0Y2gJCT0gJnVkcF9tYXRjaCwKLQkuY2hlY2tlbnRyeQk9ICZ1ZHBfY2hlY2tlbnRyeSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgaXA2dF9tYXRjaCBpY21wNl9tYXRjaHN0cnVjdCA9IHsKIAkubmFtZQkJPSAiaWNtcDYiLAogCS5tYXRjaAkJPSAmaWNtcDZfbWF0Y2gsCiAJLmNoZWNrZW50cnkJPSAmaWNtcDZfY2hlY2tlbnRyeSwKIH07CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotc3RhdGljIGlubGluZSBpbnQgcHJpbnRfbmFtZShjb25zdCBjaGFyICppLAotCQkJICAgICBvZmZfdCBzdGFydF9vZmZzZXQsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCwKLQkJCSAgICAgb2ZmX3QgKnBvcywgdW5zaWduZWQgaW50ICpjb3VudCkKLXsKLQlpZiAoKCpjb3VudCkrKyA+PSBzdGFydF9vZmZzZXQpIHsKLQkJdW5zaWduZWQgaW50IG5hbWVsZW47Ci0KLQkJbmFtZWxlbiA9IHNwcmludGYoYnVmZmVyICsgKnBvcywgIiVzXG4iLAotCQkJCSAgaSArIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSk7Ci0JCWlmICgqcG9zICsgbmFtZWxlbiA+IGxlbmd0aCkgewotCQkJLyogU3RvcCBpdGVyYXRpbmcgKi8KLQkJCXJldHVybiAxOwotCQl9Ci0JCSpwb3MgKz0gbmFtZWxlbjsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHByaW50X3RhcmdldChjb25zdCBzdHJ1Y3QgaXA2dF90YXJnZXQgKnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX3Qgc3RhcnRfb2Zmc2V0LCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX3QgKnBvcywgdW5zaWduZWQgaW50ICpjb3VudCkKLXsKLQlpZiAodCA9PSAmaXA2dF9zdGFuZGFyZF90YXJnZXQgfHwgdCA9PSAmaXA2dF9lcnJvcl90YXJnZXQpCi0JCXJldHVybiAwOwotCXJldHVybiBwcmludF9uYW1lKChjaGFyICopdCwgc3RhcnRfb2Zmc2V0LCBidWZmZXIsIGxlbmd0aCwgcG9zLCBjb3VudCk7Ci19Ci0KLXN0YXRpYyBpbnQgaXA2dF9nZXRfdGFibGVzKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgpCi17Ci0Jb2ZmX3QgcG9zID0gMDsKLQl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwotCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmaXA2dF9tdXRleCkgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlMSVNUX0ZJTkQoJmlwNnRfdGFibGVzLCBwcmludF9uYW1lLCBjaGFyICosCi0JCSAgb2Zmc2V0LCBidWZmZXIsIGxlbmd0aCwgJnBvcywgJmNvdW50KTsKLQotCXVwKCZpcDZ0X211dGV4KTsKLQotCS8qIGBzdGFydCcgaGFjayAtIHNlZSBmcy9wcm9jL2dlbmVyaWMuYyBsaW5lIH4xMDUgKi8KLQkqc3RhcnQ9KGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpY291bnQtb2Zmc2V0KTsKLQlyZXR1cm4gcG9zOwotfQotCi1zdGF0aWMgaW50IGlwNnRfZ2V0X3RhcmdldHMoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCkKLXsKLQlvZmZfdCBwb3MgPSAwOwotCXVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpcDZ0X211dGV4KSAhPSAwKQotCQlyZXR1cm4gMDsKLQotCUxJU1RfRklORCgmaXA2dF90YXJnZXQsIHByaW50X3RhcmdldCwgc3RydWN0IGlwNnRfdGFyZ2V0ICosCi0JCSAgb2Zmc2V0LCBidWZmZXIsIGxlbmd0aCwgJnBvcywgJmNvdW50KTsKLQotCXVwKCZpcDZ0X211dGV4KTsKLQotCSpzdGFydCA9IChjaGFyICopKCh1bnNpZ25lZCBsb25nKWNvdW50IC0gb2Zmc2V0KTsKLQlyZXR1cm4gcG9zOwotfQotCi1zdGF0aWMgaW50IGlwNnRfZ2V0X21hdGNoZXMoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCkKLXsKLQlvZmZfdCBwb3MgPSAwOwotCXVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpcDZ0X211dGV4KSAhPSAwKQotCQlyZXR1cm4gMDsKLQotCUxJU1RfRklORCgmaXA2dF9tYXRjaCwgcHJpbnRfbmFtZSwgY2hhciAqLAotCQkgIG9mZnNldCwgYnVmZmVyLCBsZW5ndGgsICZwb3MsICZjb3VudCk7Ci0KLQl1cCgmaXA2dF9tdXRleCk7Ci0KLQkqc3RhcnQgPSAoY2hhciAqKSgodW5zaWduZWQgbG9uZyljb3VudCAtIG9mZnNldCk7Ci0JcmV0dXJuIHBvczsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB7IGNoYXIgKm5hbWU7IGdldF9pbmZvX3QgKmdldF9pbmZvOyB9IGlwNnRfcHJvY19lbnRyeVtdID0KLXsgeyAiaXA2X3RhYmxlc19uYW1lcyIsIGlwNnRfZ2V0X3RhYmxlcyB9LAotICB7ICJpcDZfdGFibGVzX3RhcmdldHMiLCBpcDZ0X2dldF90YXJnZXRzIH0sCi0gIHsgImlwNl90YWJsZXNfbWF0Y2hlcyIsIGlwNnRfZ2V0X21hdGNoZXMgfSwKLSAgeyBOVUxMLCBOVUxMfSB9OwotI2VuZGlmIC8qQ09ORklHX1BST0NfRlMqLwotCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7CiAJaW50IHJldDsKIAorCXh0X3Byb3RvX2luaXQoQUZfSU5FVDYpOworCiAJLyogTm9vbmUgZWxzZSB3aWxsIGJlIGRvd25pbmcgc2VtIG5vdywgc28gd2Ugd29uJ3Qgc2xlZXAgKi8KLQlkb3duKCZpcDZ0X211dGV4KTsKLQlsaXN0X2FwcGVuZCgmaXA2dF90YXJnZXQsICZpcDZ0X3N0YW5kYXJkX3RhcmdldCk7Ci0JbGlzdF9hcHBlbmQoJmlwNnRfdGFyZ2V0LCAmaXA2dF9lcnJvcl90YXJnZXQpOwotCWxpc3RfYXBwZW5kKCZpcDZ0X21hdGNoLCAmdGNwX21hdGNoc3RydWN0KTsKLQlsaXN0X2FwcGVuZCgmaXA2dF9tYXRjaCwgJnVkcF9tYXRjaHN0cnVjdCk7Ci0JbGlzdF9hcHBlbmQoJmlwNnRfbWF0Y2gsICZpY21wNl9tYXRjaHN0cnVjdCk7Ci0JdXAoJmlwNnRfbXV0ZXgpOworCXh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgJmlwNnRfc3RhbmRhcmRfdGFyZ2V0KTsKKwl4dF9yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsICZpcDZ0X2Vycm9yX3RhcmdldCk7CisJeHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZpY21wNl9tYXRjaHN0cnVjdCk7CiAKIAkvKiBSZWdpc3RlciBzZXRzb2Nrb3B0ICovCiAJcmV0ID0gbmZfcmVnaXN0ZXJfc29ja29wdCgmaXA2dF9zb2Nrb3B0cyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZHVwcmludGYoIlVuYWJsZSB0byByZWdpc3RlciBzb2Nrb3B0cy5cbiIpOworCQl4dF9wcm90b19maW5pKEFGX0lORVQ2KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCXsKLQkJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jOwotCQlpbnQgaTsKLQotCQlmb3IgKGkgPSAwOyBpcDZ0X3Byb2NfZW50cnlbaV0ubmFtZTsgaSsrKSB7Ci0JCQlwcm9jID0gcHJvY19uZXRfY3JlYXRlKGlwNnRfcHJvY19lbnRyeVtpXS5uYW1lLCAwLAotCQkJCQkgICAgICAgaXA2dF9wcm9jX2VudHJ5W2ldLmdldF9pbmZvKTsKLQkJCWlmICghcHJvYykgewotCQkJCXdoaWxlICgtLWkgPj0gMCkKLQkJCQkgICAgICAgcHJvY19uZXRfcmVtb3ZlKGlwNnRfcHJvY19lbnRyeVtpXS5uYW1lKTsKLQkJCQluZl91bnJlZ2lzdGVyX3NvY2tvcHQoJmlwNnRfc29ja29wdHMpOwotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQotCQkJcHJvYy0+b3duZXIgPSBUSElTX01PRFVMRTsKLQkJfQotCX0KLSNlbmRpZgotCi0JcHJpbnRrKCJpcDZfdGFibGVzOiAoQykgMjAwMC0yMDAyIE5ldGZpbHRlciBjb3JlIHRlYW1cbiIpOworCXByaW50aygiaXA2X3RhYmxlczogKEMpIDIwMDAtMjAwNiBOZXRmaWx0ZXIgQ29yZSBUZWFtXG4iKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKIHsKIAluZl91bnJlZ2lzdGVyX3NvY2tvcHQoJmlwNnRfc29ja29wdHMpOwotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JewotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaXA2dF9wcm9jX2VudHJ5W2ldLm5hbWU7IGkrKykKLQkJCXByb2NfbmV0X3JlbW92ZShpcDZ0X3Byb2NfZW50cnlbaV0ubmFtZSk7Ci0JfQotI2VuZGlmCisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJmljbXA2X21hdGNoc3RydWN0KTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgJmlwNnRfZXJyb3JfdGFyZ2V0KTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgJmlwNnRfc3RhbmRhcmRfdGFyZ2V0KTsKKwl4dF9wcm90b19maW5pKEFGX0lORVQ2KTsKIH0KIAogLyoKQEAgLTIxMjYsMTAgKzE1MDYsNiBAQAogRVhQT1JUX1NZTUJPTChpcDZ0X3JlZ2lzdGVyX3RhYmxlKTsKIEVYUE9SVF9TWU1CT0woaXA2dF91bnJlZ2lzdGVyX3RhYmxlKTsKIEVYUE9SVF9TWU1CT0woaXA2dF9kb190YWJsZSk7Ci1FWFBPUlRfU1lNQk9MKGlwNnRfcmVnaXN0ZXJfbWF0Y2gpOwotRVhQT1JUX1NZTUJPTChpcDZ0X3VucmVnaXN0ZXJfbWF0Y2gpOwotRVhQT1JUX1NZTUJPTChpcDZ0X3JlZ2lzdGVyX3RhcmdldCk7Ci1FWFBPUlRfU1lNQk9MKGlwNnRfdW5yZWdpc3Rlcl90YXJnZXQpOwogRVhQT1JUX1NZTUJPTChpcDZ0X2V4dF9oZHIpOwogRVhQT1JUX1NZTUJPTChpcHY2X2ZpbmRfaGRyKTsKIEVYUE9SVF9TWU1CT0woaXA2X21hc2tlZF9hZGRyY21wKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0hMLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ITC5jCmluZGV4IDhmNTU0OWIuLjMwNjIwMGMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0hMLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfSEwuYwpAQCAtNjIsNyArNjIsNyBAQAogfQogCiBzdGF0aWMgaW50IGlwNnRfaGxfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCWNvbnN0IHN0cnVjdCBpcDZ0X2VudHJ5ICplLAorCQljb25zdCB2b2lkICplbnRyeSwKIAkJdm9pZCAqdGFyZ2luZm8sCiAJCXVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAJCXVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9MT0cuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0xPRy5jCmluZGV4IGFlNDY1M2IuLjc3YzcyNTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0xPRy5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0xPRy5jCkBAIC02Myw5ICs2Myw4IEBACiAJCXJldHVybjsKIAl9CiAKLQkvKiBNYXggbGVuZ3RoOiA4OCAiU1JDPTAwMDAuMDAwMC4wMDAwLjAwMDAuMDAwMC4wMDAwLjAwMDAuMDAwMCBEU1Q9MDAwMC4wMDAwLjAwMDAuMDAwMC4wMDAwLjAwMDAuMDAwMC4wMDAwIiAqLwotCXByaW50aygiU1JDPSUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eCAiLCBOSVA2KGloLT5zYWRkcikpOwotCXByaW50aygiRFNUPSUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eCAiLCBOSVA2KGloLT5kYWRkcikpOworCS8qIE1heCBsZW5ndGg6IDg4ICJTUkM9MDAwMC4wMDAwLjAwMDAuMDAwMC4wMDAwLjAwMDAuMDAwMC4wMDAwIERTVD0wMDAwLjAwMDAuMDAwMC4wMDAwLjAwMDAuMDAwMC4wMDAwLjAwMDAgIiAqLworCXByaW50aygiU1JDPSIgTklQNl9GTVQgIiBEU1Q9IiBOSVA2X0ZNVCAiICIsIE5JUDYoaWgtPnNhZGRyKSwgTklQNihpaC0+ZGFkZHIpKTsKIAogCS8qIE1heCBsZW5ndGg6IDQ0ICJMRU49NjU1MzUgVEM9MjU1IEhPUExJTUlUPTI1NSBGTE9XTEJMPUZGRkZGICIgKi8KIAlwcmludGsoIkxFTj0lWnUgVEM9JXUgSE9QTElNSVQ9JXUgRkxPV0xCTD0ldSAiLApAQCAtNDQ0LDcgKzQ0Myw3IEBACiAKIAogc3RhdGljIGludCBpcDZ0X2xvZ19jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9lbnRyeSAqZSwKKwkJCSAgICAgICBjb25zdCB2b2lkICplbnRyeSwKIAkJCSAgICAgICB2b2lkICp0YXJnaW5mbywKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9NQVJLLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9NQVJLLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYjhmYjguLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTUFSSy5jCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyogVGhpcyBpcyBhIG1vZHVsZSB3aGljaCBpcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBORk1BUksgZmllbGQgb2YgYW4gc2tiLiAqLwotCi0vKiAoQykgMTk5OS0yMDAxIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9NQVJLLmg+Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIk5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Iik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXRhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0gICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgdm9pZCAqdXNlcmluZm8pCi17Ci0JY29uc3Qgc3RydWN0IGlwNnRfbWFya190YXJnZXRfaW5mbyAqbWFya2luZm8gPSB0YXJnaW5mbzsKLQotCWlmKCgqcHNrYiktPm5mbWFyayAhPSBtYXJraW5mby0+bWFyaykKLQkJKCpwc2tiKS0+bmZtYXJrID0gbWFya2luZm8tPm1hcms7Ci0KLQlyZXR1cm4gSVA2VF9DT05USU5VRTsKLX0KLQotc3RhdGljIGludAotY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgc3RydWN0IGlwNnRfZW50cnkgKmUsCi0gICAgICAgICAgIHZvaWQgKnRhcmdpbmZvLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWlmICh0YXJnaW5mb3NpemUgIT0gSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfbWFya190YXJnZXRfaW5mbykpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIk1BUks6IHRhcmdpbmZvc2l6ZSAldSAhPSAlWnVcbiIsCi0JCSAgICAgICB0YXJnaW5mb3NpemUsCi0JCSAgICAgICBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9tYXJrX3RhcmdldF9pbmZvKSkpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoc3RyY21wKHRhYmxlbmFtZSwgIm1hbmdsZSIpICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTUFSSzogY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gXCJtYW5nbGVcIiB0YWJsZSwgbm90IFwiJXNcIlxuIiwgdGFibGVuYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXA2dF90YXJnZXQgaXA2dF9tYXJrX3JlZyA9IHsgCi0JLm5hbWUJCT0gIk1BUksiLAotCS50YXJnZXQJCT0gdGFyZ2V0LAotCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKLQkubWUJCT0gVEhJU19NT0RVTEUKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQlwcmludGsoS0VSTl9ERUJVRyAicmVnaXN0ZXJpbmcgaXB2NiBtYXJrIHRhcmdldFxuIik7Ci0JaWYgKGlwNnRfcmVnaXN0ZXJfdGFyZ2V0KCZpcDZ0X21hcmtfcmVnKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKLXsKLQlpcDZ0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcDZ0X21hcmtfcmVnKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X05GUVVFVUUuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X05GUVVFVUUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZlMzczMC4uMDAwMDAwMAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ORlFVRVVFLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiBpcDZ0YWJsZXMgbW9kdWxlIGZvciB1c2luZyBuZXcgbmV0ZmlsdGVyIG5ldGxpbmsgcXVldWUKLSAqCi0gKiAoQykgMjAwNSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqIAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTkZRVUVVRS5oPgotCi1NT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiaXA2dGFibGVzIE5GUVVFVUUgdGFyZ2V0Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXRhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0gICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgdm9pZCAqdXNlcmluZm8pCi17Ci0JY29uc3Qgc3RydWN0IGlwdF9ORlFfaW5mbyAqdGluZm8gPSB0YXJnaW5mbzsKLQotCXJldHVybiBORl9RVUVVRV9OUih0aW5mby0+cXVldWVudW0pOwotfQotCi1zdGF0aWMgaW50Ci1jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICBjb25zdCBzdHJ1Y3QgaXA2dF9lbnRyeSAqZSwKLSAgICAgICAgICAgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0JaWYgKHRhcmdpbmZvc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X05GUV9pbmZvKSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZRVUVVRTogdGFyZ2luZm9zaXplICV1ICE9ICVadVxuIiwKLQkJICAgICAgIHRhcmdpbmZvc2l6ZSwKLQkJICAgICAgIElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfTkZRX2luZm8pKSk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlwNnRfdGFyZ2V0IGlwdF9ORlFfcmVnID0gewotCS5uYW1lCQk9ICJORlFVRVVFIiwKLQkudGFyZ2V0CQk9IHRhcmdldCwKLQkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCi0JLm1lCQk9IFRISVNfTU9EVUxFLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQotewotCXJldHVybiBpcDZ0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X05GUV9yZWcpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwNnRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9ORlFfcmVnKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X1JFSkVDVC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMKaW5kZXggYjAzZTg3YS4uYzc0NTcxNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMKQEAgLTIxOCwxMiArMjE4LDEzIEBACiB9CiAKIHN0YXRpYyBpbnQgY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgY29uc3Qgc3RydWN0IGlwNnRfZW50cnkgKmUsCisJCSBjb25zdCB2b2lkICplbnRyeSwKIAkJIHZvaWQgKnRhcmdpbmZvLAogCQkgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKIAkJIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7CiAgCWNvbnN0IHN0cnVjdCBpcDZ0X3JlamVjdF9pbmZvICpyZWppbmZvID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IGlwNnRfZW50cnkgKmUgPSBlbnRyeTsKIAogIAlpZiAodGFyZ2luZm9zaXplICE9IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X3JlamVjdF9pbmZvKSkpIHsKICAgCQlERUJVR1AoImlwNnRfUkVKRUNUOiB0YXJnaW5mb3NpemUgJXUgIT0gMFxuIiwgdGFyZ2luZm9zaXplKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2FoLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9haC5jCmluZGV4IGY1YzFhN2YuLjIxOWEzMDMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2FoLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfYWguYwpAQCAtOTgsNyArOTgsNyBAQAogLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0gICAgICAgICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKKyAgICAgICAgICBjb25zdCB2b2lkICplbnRyeSwKICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCiAgICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCiAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2RzdC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZHN0LmMKaW5kZXggNDhjZjVmOS4uYjRjMTUzYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZHN0LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZHN0LmMKQEAgLTM2LDE5ICszNiwxOSBAQAogI2VuZGlmCiAKIC8qCi0gKiAoVHlwZSAmIDB4QzApID4+IDYKLSAqIAkwCS0+IGlnbm9yYWJsZQotICogCTEJLT4gbXVzdCBkcm9wIHRoZSBwYWNrZXQKLSAqIAkyCS0+IHNlbmQgSUNNUCBQQVJNIFBST0IgcmVnYXJkbGVzcyBhbmQgZHJvcCBwYWNrZXQKLSAqIAkzCS0+IFNlbmQgSUNNUCBpZiBub3QgYSBtdWx0aWNhc3QgYWRkcmVzcyBhbmQgZHJvcCBwYWNrZXQKKyAqICAoVHlwZSAmIDB4QzApID4+IDYKKyAqCTAJLT4gaWdub3JhYmxlCisgKgkxCS0+IG11c3QgZHJvcCB0aGUgcGFja2V0CisgKgkyCS0+IHNlbmQgSUNNUCBQQVJNIFBST0IgcmVnYXJkbGVzcyBhbmQgZHJvcCBwYWNrZXQKKyAqCTMJLT4gU2VuZCBJQ01QIGlmIG5vdCBhIG11bHRpY2FzdCBhZGRyZXNzIGFuZCBkcm9wIHBhY2tldAogICogIChUeXBlICYgMHgyMCkgPj4gNQotICogIAkwCS0+IGludmFyaWFudAotICogIAkxCS0+IGNhbiBjaGFuZ2UgdGhlIHJvdXRpbmcKKyAqCTAJLT4gaW52YXJpYW50CisgKgkxCS0+IGNhbiBjaGFuZ2UgdGhlIHJvdXRpbmcKICAqICAoVHlwZSAmIDB4MUYpIFR5cGUKLSAqICAgICAgMAktPiBQYWQxIChvbmx5IDEgYnl0ZSEpCi0gKiAgICAgIDEJLT4gUGFkTiBMRU5HVEggaW5mbyAodG90YWwgbGVuZ3RoID0gbGVuZ3RoICsgMikKLSAqICAgICAgQzAgfCAyCS0+IEpVTUJPIDQgeCB4IHggeCAoIHh4eHggPiA2NGsgKQotICogICAgICA1CS0+IFJUQUxFUlQgMiB4IHgKKyAqCTAJLT4gUGFkMSAob25seSAxIGJ5dGUhKQorICoJMQktPiBQYWROIExFTkdUSCBpbmZvICh0b3RhbCBsZW5ndGggPSBsZW5ndGggKyAyKQorICoJQzAgfCAyCS0+IEpVTUJPIDQgeCB4IHggeCAoIHh4eHggPiA2NGsgKQorICoJNQktPiBSVEFMRVJUIDIgeCB4CiAgKi8KIAogc3RhdGljIGludApAQCAtNjAsMTYgKzYwLDE2IEBACiAgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKICAgICAgIGludCAqaG90ZHJvcCkKIHsKLSAgICAgICBzdHJ1Y3QgaXB2Nl9vcHRfaGRyIF9vcHRzaCwgKm9oOwotICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X29wdHMgKm9wdGluZm8gPSBtYXRjaGluZm87Ci0gICAgICAgdW5zaWduZWQgaW50IHRlbXA7Ci0gICAgICAgdW5zaWduZWQgaW50IHB0cjsKLSAgICAgICB1bnNpZ25lZCBpbnQgaGRybGVuID0gMDsKLSAgICAgICB1bnNpZ25lZCBpbnQgcmV0ID0gMDsKLSAgICAgICB1OCBfb3B0dHlwZSwgKnRwID0gTlVMTDsKLSAgICAgICB1OCBfb3B0bGVuLCAqbHAgPSBOVUxMOwotICAgICAgIHVuc2lnbmVkIGludCBvcHRsZW47Ci0gICAgICAgCisJc3RydWN0IGlwdjZfb3B0X2hkciBfb3B0c2gsICpvaDsKKwljb25zdCBzdHJ1Y3QgaXA2dF9vcHRzICpvcHRpbmZvID0gbWF0Y2hpbmZvOworCXVuc2lnbmVkIGludCB0ZW1wOworCXVuc2lnbmVkIGludCBwdHI7CisJdW5zaWduZWQgaW50IGhkcmxlbiA9IDA7CisJdW5zaWduZWQgaW50IHJldCA9IDA7CisJdTggX29wdHR5cGUsICp0cCA9IE5VTEw7CisJdTggX29wdGxlbiwgKmxwID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgb3B0bGVuOworCiAjaWYgSE9QQllIT1AKIAlpZiAoaXB2Nl9maW5kX2hkcihza2IsICZwdHIsIE5FWFRIRFJfSE9QLCBOVUxMKSA8IDApCiAjZWxzZQpAQCAtNzcsNDIgKzc3LDQxIEBACiAjZW5kaWYKIAkJcmV0dXJuIDA7CiAKLSAgICAgICBvaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHB0ciwgc2l6ZW9mKF9vcHRzaCksICZfb3B0c2gpOwotICAgICAgIGlmIChvaCA9PSBOVUxMKXsKLQkgICAgICAgKmhvdGRyb3AgPSAxOwotICAgICAgIAkJcmV0dXJuIDA7Ci0gICAgICAgfQorCW9oID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHRyLCBzaXplb2YoX29wdHNoKSwgJl9vcHRzaCk7CisJaWYgKG9oID09IE5VTEwpIHsKKwkJKmhvdGRyb3AgPSAxOworCQlyZXR1cm4gMDsKKwl9CiAKLSAgICAgICBoZHJsZW4gPSBpcHY2X29wdGxlbihvaCk7Ci0gICAgICAgaWYgKHNrYi0+bGVuIC0gcHRyIDwgaGRybGVuKXsKLQkgICAgICAgLyogUGFja2V0IHNtYWxsZXIgdGhhbiBpdCdzIGxlbmd0aCBmaWVsZCAqLwotICAgICAgIAkJcmV0dXJuIDA7Ci0gICAgICAgfQorCWhkcmxlbiA9IGlwdjZfb3B0bGVuKG9oKTsKKwlpZiAoc2tiLT5sZW4gLSBwdHIgPCBoZHJsZW4pIHsKKwkJLyogUGFja2V0IHNtYWxsZXIgdGhhbiBpdCdzIGxlbmd0aCBmaWVsZCAqLworCQlyZXR1cm4gMDsKKwl9CiAKLSAgICAgICBERUJVR1AoIklQdjYgT1BUUyBMRU4gJXUgJXUgIiwgaGRybGVuLCBvaC0+aGRybGVuKTsKKwlERUJVR1AoIklQdjYgT1BUUyBMRU4gJXUgJXUgIiwgaGRybGVuLCBvaC0+aGRybGVuKTsKIAotICAgICAgIERFQlVHUCgibGVuICUwMlggJTA0WCAlMDJYICIsCi0gICAgICAgCQlvcHRpbmZvLT5oZHJsZW4sIGhkcmxlbiwKLSAgICAgICAJCSghKG9wdGluZm8tPmZsYWdzICYgSVA2VF9PUFRTX0xFTikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3B0aW5mby0+aGRybGVuID09IGhkcmxlbikgXgotICAgICAgICAgICAgICAgICAgICAgICAgICAgISEob3B0aW5mby0+aW52ZmxhZ3MgJiBJUDZUX09QVFNfSU5WX0xFTikpKSk7CisJREVCVUdQKCJsZW4gJTAyWCAlMDRYICUwMlggIiwKKwkgICAgICAgb3B0aW5mby0+aGRybGVuLCBoZHJsZW4sCisJICAgICAgICghKG9wdGluZm8tPmZsYWdzICYgSVA2VF9PUFRTX0xFTikgfHwKKwkJKChvcHRpbmZvLT5oZHJsZW4gPT0gaGRybGVuKSBeCisJCSAhIShvcHRpbmZvLT5pbnZmbGFncyAmIElQNlRfT1BUU19JTlZfTEVOKSkpKTsKIAotICAgICAgIHJldCA9IChvaCAhPSBOVUxMKQotICAgICAgIAkJJiYKLQkgICAgICAJKCEob3B0aW5mby0+ZmxhZ3MgJiBJUDZUX09QVFNfTEVOKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChvcHRpbmZvLT5oZHJsZW4gPT0gaGRybGVuKSBeCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAhIShvcHRpbmZvLT5pbnZmbGFncyAmIElQNlRfT1BUU19JTlZfTEVOKSkpOworCXJldCA9IChvaCAhPSBOVUxMKSAmJgorCSAgICAgICghKG9wdGluZm8tPmZsYWdzICYgSVA2VF9PUFRTX0xFTikgfHwKKwkgICAgICAgKChvcHRpbmZvLT5oZHJsZW4gPT0gaGRybGVuKSBeCisJCSEhKG9wdGluZm8tPmludmZsYWdzICYgSVA2VF9PUFRTX0lOVl9MRU4pKSk7CiAKLSAgICAgICBwdHIgKz0gMjsKLSAgICAgICBoZHJsZW4gLT0gMjsKLSAgICAgICBpZiAoICEob3B0aW5mby0+ZmxhZ3MgJiBJUDZUX09QVFNfT1BUUykgKXsKLQkgICAgICAgcmV0dXJuIHJldDsKKwlwdHIgKz0gMjsKKwloZHJsZW4gLT0gMjsKKwlpZiAoIShvcHRpbmZvLT5mbGFncyAmIElQNlRfT1BUU19PUFRTKSkgeworCQlyZXR1cm4gcmV0OwogCX0gZWxzZSBpZiAob3B0aW5mby0+ZmxhZ3MgJiBJUDZUX09QVFNfTlNUUklDVCkgewogCQlERUJVR1AoIk5vdCBzdHJpY3QgLSBub3QgaW1wbGVtZW50ZWQiKTsKIAl9IGVsc2UgewogCQlERUJVR1AoIlN0cmljdCAiKTsKLQkJREVCVUdQKCIjJWQgIixvcHRpbmZvLT5vcHRzbnIpOwotCQlmb3IodGVtcD0wOyB0ZW1wPG9wdGluZm8tPm9wdHNucjsgdGVtcCsrKXsKKwkJREVCVUdQKCIjJWQgIiwgb3B0aW5mby0+b3B0c25yKTsKKwkJZm9yICh0ZW1wID0gMDsgdGVtcCA8IG9wdGluZm8tPm9wdHNucjsgdGVtcCsrKSB7CiAJCQkvKiB0eXBlIGZpZWxkIGV4aXN0cyA/ICovCiAJCQlpZiAoaGRybGVuIDwgMSkKIAkJCQlicmVhazsKQEAgLTEyMiwxMCArMTIxLDEwIEBACiAJCQkJYnJlYWs7CiAKIAkJCS8qIFR5cGUgY2hlY2sgKi8KLQkJCWlmICgqdHAgIT0gKG9wdGluZm8tPm9wdHNbdGVtcF0gJiAweEZGMDApPj44KXsKKwkJCWlmICgqdHAgIT0gKG9wdGluZm8tPm9wdHNbdGVtcF0gJiAweEZGMDApID4+IDgpIHsKIAkJCQlERUJVR1AoIlRiYWQgJTAyWCAlMDJYXG4iLAogCQkJCSAgICAgICAqdHAsCi0JCQkJICAgICAgIChvcHRpbmZvLT5vcHRzW3RlbXBdICYgMHhGRjAwKT4+OCk7CisJCQkJICAgICAgIChvcHRpbmZvLT5vcHRzW3RlbXBdICYgMHhGRjAwKSA+PiA4KTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0gZWxzZSB7CiAJCQkJREVCVUdQKCJUb2sgIik7CkBAIC0xNjksNyArMTY4LDggQEAKIAkJfQogCQlpZiAodGVtcCA9PSBvcHRpbmZvLT5vcHRzbnIpCiAJCQlyZXR1cm4gcmV0OwotCQllbHNlIHJldHVybiAwOworCQllbHNlCisJCQlyZXR1cm4gMDsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE3OCwyNSArMTc4LDI0IEBACiAvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLSAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAotICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hpbmZvc2l6ZSwKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQorCSAgIGNvbnN0IHZvaWQgKmluZm8sCisJICAgdm9pZCAqbWF0Y2hpbmZvLAorCSAgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAorCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7Ci0gICAgICAgY29uc3Qgc3RydWN0IGlwNnRfb3B0cyAqb3B0c2luZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IGlwNnRfb3B0cyAqb3B0c2luZm8gPSBtYXRjaGluZm87CiAKLSAgICAgICBpZiAobWF0Y2hpbmZvc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9vcHRzKSkpIHsKLSAgICAgICAgICAgICAgREVCVUdQKCJpcDZ0X29wdHM6IG1hdGNoc2l6ZSAldSAhPSAldVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBtYXRjaGluZm9zaXplLCBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9vcHRzKSkpOwotICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICB9Ci0gICAgICAgaWYgKG9wdHNpbmZvLT5pbnZmbGFncyAmIH5JUDZUX09QVFNfSU5WX01BU0spIHsKLSAgICAgICAgICAgICAgREVCVUdQKCJpcDZ0X29wdHM6IHVua25vd24gZmxhZ3MgJVhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgb3B0c2luZm8tPmludmZsYWdzKTsKLSAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgfQorCWlmIChtYXRjaGluZm9zaXplICE9IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X29wdHMpKSkgeworCQlERUJVR1AoImlwNnRfb3B0czogbWF0Y2hzaXplICV1ICE9ICV1XG4iLAorCQkgICAgICAgbWF0Y2hpbmZvc2l6ZSwgSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfb3B0cykpKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChvcHRzaW5mby0+aW52ZmxhZ3MgJiB+SVA2VF9PUFRTX0lOVl9NQVNLKSB7CisJCURFQlVHUCgiaXA2dF9vcHRzOiB1bmtub3duIGZsYWdzICVYXG4iLCBvcHRzaW5mby0+aW52ZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CiAKLSAgICAgICByZXR1cm4gMTsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIHN0cnVjdCBpcDZ0X21hdGNoIG9wdHNfbWF0Y2ggPSB7CkBAIC0yMTIsMTIgKzIxMSwxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7Ci0gICAgICAgcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJm9wdHNfbWF0Y2gpOworCXJldHVybiBpcDZ0X3JlZ2lzdGVyX21hdGNoKCZvcHRzX21hdGNoKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXAodm9pZCkKIHsKLSAgICAgICBpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJm9wdHNfbWF0Y2gpOworCWlwNnRfdW5yZWdpc3Rlcl9tYXRjaCgmb3B0c19tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZXNwLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9lc3AuYwppbmRleCBlMTgyOGY2Li43MjQyODVkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9lc3AuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9lc3AuYwpAQCAtNzYsNyArNzYsNyBAQAogLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKKwkgICBjb25zdCB2b2lkICppcCwKIAkgICB2b2lkICptYXRjaGluZm8sCiAJICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCiAJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2V1aTY0LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ldWk2NC5jCmluZGV4IDYxNmMyY2IuLjI3Mzk2YWMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2V1aTY0LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZXVpNjQuYwpAQCAtMjcsNDUgKzI3LDQ1IEBACiAgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKICAgICAgIGludCAqaG90ZHJvcCkKIHsKKwl1bnNpZ25lZCBjaGFyIGV1aTY0WzhdOworCWludCBpID0gMDsKIAotICAgIHVuc2lnbmVkIGNoYXIgZXVpNjRbOF07Ci0gICAgaW50IGk9MDsKKwlpZiAoIShza2ItPm1hYy5yYXcgPj0gc2tiLT5oZWFkICYmCisJICAgICAgKHNrYi0+bWFjLnJhdyArIEVUSF9ITEVOKSA8PSBza2ItPmRhdGEpICYmCisJICAgIG9mZnNldCAhPSAwKSB7CisJCSpob3Rkcm9wID0gMTsKKwkJcmV0dXJuIDA7CisJfQogCi0gICAgIGlmICggIShza2ItPm1hYy5yYXcgPj0gc2tiLT5oZWFkCi0gICAgICAgICAgICAgICAgJiYgKHNrYi0+bWFjLnJhdyArIEVUSF9ITEVOKSA8PSBza2ItPmRhdGEpCi0gICAgICAgICAgICAgICAgJiYgb2Zmc2V0ICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpob3Rkcm9wID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICBtZW1zZXQoZXVpNjQsIDAsIHNpemVvZihldWk2NCkpOworCW1lbXNldChldWk2NCwgMCwgc2l6ZW9mKGV1aTY0KSk7CiAKLSAgICBpZiAoZXRoX2hkcihza2IpLT5oX3Byb3RvID09IG50b2hzKEVUSF9QX0lQVjYpKSB7Ci0gICAgICBpZiAoc2tiLT5uaC5pcHY2aC0+dmVyc2lvbiA9PSAweDYpIHsgCi0gICAgICAgICBtZW1jcHkoZXVpNjQsIGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UsIDMpOwotICAgICAgICAgbWVtY3B5KGV1aTY0ICsgNSwgZXRoX2hkcihza2IpLT5oX3NvdXJjZSArIDMsIDMpOwotCSBldWk2NFszXT0weGZmOwotCSBldWk2NFs0XT0weGZlOwotCSBldWk2NFswXSB8PSAweDAyOworCWlmIChldGhfaGRyKHNrYiktPmhfcHJvdG8gPT0gbnRvaHMoRVRIX1BfSVBWNikpIHsKKwkJaWYgKHNrYi0+bmguaXB2NmgtPnZlcnNpb24gPT0gMHg2KSB7CisJCQltZW1jcHkoZXVpNjQsIGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UsIDMpOworCQkJbWVtY3B5KGV1aTY0ICsgNSwgZXRoX2hkcihza2IpLT5oX3NvdXJjZSArIDMsIDMpOworCQkJZXVpNjRbM10gPSAweGZmOworCQkJZXVpNjRbNF0gPSAweGZlOworCQkJZXVpNjRbMF0gfD0gMHgwMjsKIAotCSBpPTA7Ci0JIHdoaWxlICgoc2tiLT5uaC5pcHY2aC0+c2FkZHIuczZfYWRkcls4K2ldID09Ci0JCQkgZXVpNjRbaV0pICYmIChpPDgpKSBpKys7CisJCQlpID0gMDsKKwkJCXdoaWxlICgoc2tiLT5uaC5pcHY2aC0+c2FkZHIuczZfYWRkcls4K2ldID09IGV1aTY0W2ldKQorCQkJICAgICAgICYmIChpIDwgOCkpCisJCQkJaSsrOwogCi0JIGlmICggaSA9PSA4ICkKLQkgCXJldHVybiAxOwotICAgICAgfQotICAgIH0KKwkJCWlmIChpID09IDgpCisJCQkJcmV0dXJuIDE7CisJCX0KKwl9CiAKLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogaXA2dF9ldWk2NF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKLQkJICAgdm9pZCAqbWF0Y2hpbmZvLAotCQkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAotCQkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQorCQkgICAgICBjb25zdCB2b2lkICppcCwKKwkJICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorCQkgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorCQkgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewogCWlmIChob29rX21hc2sKIAkgICAgJiB+KCgxIDw8IE5GX0lQNl9QUkVfUk9VVElORykgfCAoMSA8PCBORl9JUDZfTE9DQUxfSU4pIHwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2ZyYWcuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2ZyYWcuYwppbmRleCBkMTU0OWIyLi40YzE0MTI1IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9mcmFnLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZnJhZy5jCkBAIC0zMSwxMiArMzEsMTIgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBpZF9tYXRjaCh1X2ludDMyX3QgbWluLCB1X2ludDMyX3QgbWF4LCB1X2ludDMyX3QgaWQsIGludCBpbnZlcnQpCiB7Ci0gICAgICAgaW50IHI9MDsKLSAgICAgICBERUJVR1AoImZyYWcgaWRfbWF0Y2g6JWMgMHgleCA8PSAweCV4IDw9IDB4JXgiLGludmVydD8gJyEnOicgJywKLSAgICAgICAgICAgICAgbWluLGlkLG1heCk7Ci0gICAgICAgcj0oaWQgPj0gbWluICYmIGlkIDw9IG1heCkgXiBpbnZlcnQ7Ci0gICAgICAgREVCVUdQKCIgcmVzdWx0ICVzXG4iLHI/ICJQQVNTIiA6ICJGQUlMRUQiKTsKLSAgICAgICByZXR1cm4gcjsKKwlpbnQgciA9IDA7CisJREVCVUdQKCJmcmFnIGlkX21hdGNoOiVjIDB4JXggPD0gMHgleCA8PSAweCV4IiwgaW52ZXJ0ID8gJyEnIDogJyAnLAorCSAgICAgICBtaW4sIGlkLCBtYXgpOworCXIgPSAoaWQgPj0gbWluICYmIGlkIDw9IG1heCkgXiBpbnZlcnQ7CisJREVCVUdQKCIgcmVzdWx0ICVzXG4iLCByID8gIlBBU1MiIDogIkZBSUxFRCIpOworCXJldHVybiByOwogfQogCiBzdGF0aWMgaW50CkBAIC00OCw5MiArNDgsOTEgQEAKICAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAogICAgICAgaW50ICpob3Rkcm9wKQogewotICAgICAgIHN0cnVjdCBmcmFnX2hkciBfZnJhZywgKmZoOwotICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2ZyYWcgKmZyYWdpbmZvID0gbWF0Y2hpbmZvOwotICAgICAgIHVuc2lnbmVkIGludCBwdHI7CisJc3RydWN0IGZyYWdfaGRyIF9mcmFnLCAqZmg7CisJY29uc3Qgc3RydWN0IGlwNnRfZnJhZyAqZnJhZ2luZm8gPSBtYXRjaGluZm87CisJdW5zaWduZWQgaW50IHB0cjsKIAogCWlmIChpcHY2X2ZpbmRfaGRyKHNrYiwgJnB0ciwgTkVYVEhEUl9GUkFHTUVOVCwgTlVMTCkgPCAwKQogCQlyZXR1cm4gMDsKIAogCWZoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHRyLCBzaXplb2YoX2ZyYWcpLCAmX2ZyYWcpOwotCWlmIChmaCA9PSBOVUxMKXsKKwlpZiAoZmggPT0gTlVMTCkgewogCQkqaG90ZHJvcCA9IDE7CiAJCXJldHVybiAwOwogCX0KIAotICAgICAgIERFQlVHUCgiSU5GTyAlMDRYICIsIGZoLT5mcmFnX29mZik7Ci0gICAgICAgREVCVUdQKCJPRkZTRVQgJTA0WCAiLCBudG9ocyhmaC0+ZnJhZ19vZmYpICYgfjB4Nyk7Ci0gICAgICAgREVCVUdQKCJSRVMgJTAyWCAlMDRYIiwgZmgtPnJlc2VydmVkLCBudG9ocyhmaC0+ZnJhZ19vZmYpICYgMHg2KTsKLSAgICAgICBERUJVR1AoIk1GICUwNFggIiwgZmgtPmZyYWdfb2ZmICYgaHRvbnMoSVA2X01GKSk7Ci0gICAgICAgREVCVUdQKCJJRCAldSAlMDhYXG4iLCBudG9obChmaC0+aWRlbnRpZmljYXRpb24pLAotCSAgICAgIG50b2hsKGZoLT5pZGVudGlmaWNhdGlvbikpOworCURFQlVHUCgiSU5GTyAlMDRYICIsIGZoLT5mcmFnX29mZik7CisJREVCVUdQKCJPRkZTRVQgJTA0WCAiLCBudG9ocyhmaC0+ZnJhZ19vZmYpICYgfjB4Nyk7CisJREVCVUdQKCJSRVMgJTAyWCAlMDRYIiwgZmgtPnJlc2VydmVkLCBudG9ocyhmaC0+ZnJhZ19vZmYpICYgMHg2KTsKKwlERUJVR1AoIk1GICUwNFggIiwgZmgtPmZyYWdfb2ZmICYgaHRvbnMoSVA2X01GKSk7CisJREVCVUdQKCJJRCAldSAlMDhYXG4iLCBudG9obChmaC0+aWRlbnRpZmljYXRpb24pLAorCSAgICAgICBudG9obChmaC0+aWRlbnRpZmljYXRpb24pKTsKIAotICAgICAgIERFQlVHUCgiSVB2NiBGUkFHIGlkICUwMlggIiwKLSAgICAgICAJCShpZF9tYXRjaChmcmFnaW5mby0+aWRzWzBdLCBmcmFnaW5mby0+aWRzWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRvaGwoZmgtPmlkZW50aWZpY2F0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICEhKGZyYWdpbmZvLT5pbnZmbGFncyAmIElQNlRfRlJBR19JTlZfSURTKSkpKTsKLSAgICAgICBERUJVR1AoInJlcyAlMDJYICUwMlglMDRYICUwMlggIiwgCi0gICAgICAgCQkoZnJhZ2luZm8tPmZsYWdzICYgSVA2VF9GUkFHX1JFUyksIGZoLT5yZXNlcnZlZCwKLQkJbnRvaHMoZmgtPmZyYWdfb2ZmKSAmIDB4NiwKLSAgICAgICAJCSEoKGZyYWdpbmZvLT5mbGFncyAmIElQNlRfRlJBR19SRVMpCi0JCQkmJiAoZmgtPnJlc2VydmVkIHx8IChudG9ocyhmaC0+ZnJhZ19vZmYpICYgMHgwNikpKSk7Ci0gICAgICAgREVCVUdQKCJmaXJzdCAlMDJYICUwMlggJTAyWCAiLCAKLSAgICAgICAJCShmcmFnaW5mby0+ZmxhZ3MgJiBJUDZUX0ZSQUdfRlNUKSwKLQkJbnRvaHMoZmgtPmZyYWdfb2ZmKSAmIH4weDcsCi0gICAgICAgCQkhKChmcmFnaW5mby0+ZmxhZ3MgJiBJUDZUX0ZSQUdfRlNUKQotCQkJJiYgKG50b2hzKGZoLT5mcmFnX29mZikgJiB+MHg3KSkpOwotICAgICAgIERFQlVHUCgibWYgJTAyWCAlMDJYICUwMlggIiwgCi0gICAgICAgCQkoZnJhZ2luZm8tPmZsYWdzICYgSVA2VF9GUkFHX01GKSwKLQkJbnRvaHMoZmgtPmZyYWdfb2ZmKSAmIElQNl9NRiwKLSAgICAgICAJCSEoKGZyYWdpbmZvLT5mbGFncyAmIElQNlRfRlJBR19NRikKLQkJCSYmICEoKG50b2hzKGZoLT5mcmFnX29mZikgJiBJUDZfTUYpKSkpOwotICAgICAgIERFQlVHUCgibGFzdCAlMDJYICUwMlggJTAyWFxuIiwgCi0gICAgICAgCQkoZnJhZ2luZm8tPmZsYWdzICYgSVA2VF9GUkFHX05NRiksCi0JCW50b2hzKGZoLT5mcmFnX29mZikgJiBJUDZfTUYsCi0gICAgICAgCQkhKChmcmFnaW5mby0+ZmxhZ3MgJiBJUDZUX0ZSQUdfTk1GKQotCQkJJiYgKG50b2hzKGZoLT5mcmFnX29mZikgJiBJUDZfTUYpKSk7CisJREVCVUdQKCJJUHY2IEZSQUcgaWQgJTAyWCAiLAorCSAgICAgICAoaWRfbWF0Y2goZnJhZ2luZm8tPmlkc1swXSwgZnJhZ2luZm8tPmlkc1sxXSwKKwkJCSBudG9obChmaC0+aWRlbnRpZmljYXRpb24pLAorCQkJICEhKGZyYWdpbmZvLT5pbnZmbGFncyAmIElQNlRfRlJBR19JTlZfSURTKSkpKTsKKwlERUJVR1AoInJlcyAlMDJYICUwMlglMDRYICUwMlggIiwKKwkgICAgICAgKGZyYWdpbmZvLT5mbGFncyAmIElQNlRfRlJBR19SRVMpLCBmaC0+cmVzZXJ2ZWQsCisJICAgICAgIG50b2hzKGZoLT5mcmFnX29mZikgJiAweDYsCisJICAgICAgICEoKGZyYWdpbmZvLT5mbGFncyAmIElQNlRfRlJBR19SRVMpCisJCSAmJiAoZmgtPnJlc2VydmVkIHx8IChudG9ocyhmaC0+ZnJhZ19vZmYpICYgMHgwNikpKSk7CisJREVCVUdQKCJmaXJzdCAlMDJYICUwMlggJTAyWCAiLAorCSAgICAgICAoZnJhZ2luZm8tPmZsYWdzICYgSVA2VF9GUkFHX0ZTVCksCisJICAgICAgIG50b2hzKGZoLT5mcmFnX29mZikgJiB+MHg3LAorCSAgICAgICAhKChmcmFnaW5mby0+ZmxhZ3MgJiBJUDZUX0ZSQUdfRlNUKQorCQkgJiYgKG50b2hzKGZoLT5mcmFnX29mZikgJiB+MHg3KSkpOworCURFQlVHUCgibWYgJTAyWCAlMDJYICUwMlggIiwKKwkgICAgICAgKGZyYWdpbmZvLT5mbGFncyAmIElQNlRfRlJBR19NRiksCisJICAgICAgIG50b2hzKGZoLT5mcmFnX29mZikgJiBJUDZfTUYsCisJICAgICAgICEoKGZyYWdpbmZvLT5mbGFncyAmIElQNlRfRlJBR19NRikKKwkJICYmICEoKG50b2hzKGZoLT5mcmFnX29mZikgJiBJUDZfTUYpKSkpOworCURFQlVHUCgibGFzdCAlMDJYICUwMlggJTAyWFxuIiwKKwkgICAgICAgKGZyYWdpbmZvLT5mbGFncyAmIElQNlRfRlJBR19OTUYpLAorCSAgICAgICBudG9ocyhmaC0+ZnJhZ19vZmYpICYgSVA2X01GLAorCSAgICAgICAhKChmcmFnaW5mby0+ZmxhZ3MgJiBJUDZUX0ZSQUdfTk1GKQorCQkgJiYgKG50b2hzKGZoLT5mcmFnX29mZikgJiBJUDZfTUYpKSk7CiAKLSAgICAgICByZXR1cm4gKGZoICE9IE5VTEwpCi0gICAgICAgCQkmJgotICAgICAgIAkJKGlkX21hdGNoKGZyYWdpbmZvLT5pZHNbMF0sIGZyYWdpbmZvLT5pZHNbMV0sCi0JCQkgIG50b2hsKGZoLT5pZGVudGlmaWNhdGlvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAhIShmcmFnaW5mby0+aW52ZmxhZ3MgJiBJUDZUX0ZSQUdfSU5WX0lEUykpKQotCQkmJgotCQkhKChmcmFnaW5mby0+ZmxhZ3MgJiBJUDZUX0ZSQUdfUkVTKQotCQkJJiYgKGZoLT5yZXNlcnZlZCB8fCAobnRvaHMoZmgtPmZyYWdfb2ZmKSAmIDB4NikpKQotCQkmJgotCQkhKChmcmFnaW5mby0+ZmxhZ3MgJiBJUDZUX0ZSQUdfRlNUKQotCQkJJiYgKG50b2hzKGZoLT5mcmFnX29mZikgJiB+MHg3KSkKLQkJJiYKLQkJISgoZnJhZ2luZm8tPmZsYWdzICYgSVA2VF9GUkFHX01GKQotCQkJJiYgIShudG9ocyhmaC0+ZnJhZ19vZmYpICYgSVA2X01GKSkKLQkJJiYKLQkJISgoZnJhZ2luZm8tPmZsYWdzICYgSVA2VF9GUkFHX05NRikKLQkJCSYmIChudG9ocyhmaC0+ZnJhZ19vZmYpICYgSVA2X01GKSk7CisJcmV0dXJuIChmaCAhPSBOVUxMKQorCSAgICAgICAmJgorCSAgICAgICAoaWRfbWF0Y2goZnJhZ2luZm8tPmlkc1swXSwgZnJhZ2luZm8tPmlkc1sxXSwKKwkJCSBudG9obChmaC0+aWRlbnRpZmljYXRpb24pLAorCQkJICEhKGZyYWdpbmZvLT5pbnZmbGFncyAmIElQNlRfRlJBR19JTlZfSURTKSkpCisJICAgICAgICYmCisJICAgICAgICEoKGZyYWdpbmZvLT5mbGFncyAmIElQNlRfRlJBR19SRVMpCisJCSAmJiAoZmgtPnJlc2VydmVkIHx8IChudG9ocyhmaC0+ZnJhZ19vZmYpICYgMHg2KSkpCisJICAgICAgICYmCisJICAgICAgICEoKGZyYWdpbmZvLT5mbGFncyAmIElQNlRfRlJBR19GU1QpCisJCSAmJiAobnRvaHMoZmgtPmZyYWdfb2ZmKSAmIH4weDcpKQorCSAgICAgICAmJgorCSAgICAgICAhKChmcmFnaW5mby0+ZmxhZ3MgJiBJUDZUX0ZSQUdfTUYpCisJCSAmJiAhKG50b2hzKGZoLT5mcmFnX29mZikgJiBJUDZfTUYpKQorCSAgICAgICAmJgorCSAgICAgICAhKChmcmFnaW5mby0+ZmxhZ3MgJiBJUDZUX0ZSQUdfTk1GKQorCQkgJiYgKG50b2hzKGZoLT5mcmFnX29mZikgJiBJUDZfTUYpKTsKIH0KIAogLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0gICAgICAgICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKLSAgICAgICAgICB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCi0gICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKKwkgICBjb25zdCB2b2lkICppcCwKKwkgICB2b2lkICptYXRjaGluZm8sCisJICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCisJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKLSAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9mcmFnICpmcmFnaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXA2dF9mcmFnICpmcmFnaW5mbyA9IG1hdGNoaW5mbzsKIAotICAgICAgIGlmIChtYXRjaGluZm9zaXplICE9IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X2ZyYWcpKSkgewotICAgICAgICAgICAgICBERUJVR1AoImlwNnRfZnJhZzogbWF0Y2hzaXplICV1ICE9ICV1XG4iLAotICAgICAgICAgICAgICAgICAgICAgIG1hdGNoaW5mb3NpemUsIElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X2ZyYWcpKSk7Ci0gICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgIH0KLSAgICAgICBpZiAoZnJhZ2luZm8tPmludmZsYWdzICYgfklQNlRfRlJBR19JTlZfTUFTSykgewotICAgICAgICAgICAgICBERUJVR1AoImlwNnRfZnJhZzogdW5rbm93biBmbGFncyAlWFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBmcmFnaW5mby0+aW52ZmxhZ3MpOwotICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICB9CisJaWYgKG1hdGNoaW5mb3NpemUgIT0gSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfZnJhZykpKSB7CisJCURFQlVHUCgiaXA2dF9mcmFnOiBtYXRjaHNpemUgJXUgIT0gJXVcbiIsCisJCSAgICAgICBtYXRjaGluZm9zaXplLCBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9mcmFnKSkpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGZyYWdpbmZvLT5pbnZmbGFncyAmIH5JUDZUX0ZSQUdfSU5WX01BU0spIHsKKwkJREVCVUdQKCJpcDZ0X2ZyYWc6IHVua25vd24gZmxhZ3MgJVhcbiIsIGZyYWdpbmZvLT5pbnZmbGFncyk7CisJCXJldHVybiAwOworCX0KIAotICAgICAgIHJldHVybiAxOworCXJldHVybiAxOwogfQogCiBzdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggZnJhZ19tYXRjaCA9IHsKQEAgLTE0NSwxMiArMTQ0LDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKIHsKLSAgICAgICByZXR1cm4gaXA2dF9yZWdpc3Rlcl9tYXRjaCgmZnJhZ19tYXRjaCk7CisJcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJmZyYWdfbWF0Y2gpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cCh2b2lkKQogewotICAgICAgIGlwNnRfdW5yZWdpc3Rlcl9tYXRjaCgmZnJhZ19tYXRjaCk7CisJaXA2dF91bnJlZ2lzdGVyX21hdGNoKCZmcmFnX21hdGNoKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9oYmguYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hiaC5jCmluZGV4IGUzYmM4ZTIuLjM3YTg0NzQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hiaC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hiaC5jCkBAIC0zNiwxOSArMzYsMTkgQEAKICNlbmRpZgogCiAvKgotICogKFR5cGUgJiAweEMwKSA+PiA2Ci0gKiAJMAktPiBpZ25vcmFibGUKLSAqIAkxCS0+IG11c3QgZHJvcCB0aGUgcGFja2V0Ci0gKiAJMgktPiBzZW5kIElDTVAgUEFSTSBQUk9CIHJlZ2FyZGxlc3MgYW5kIGRyb3AgcGFja2V0Ci0gKiAJMwktPiBTZW5kIElDTVAgaWYgbm90IGEgbXVsdGljYXN0IGFkZHJlc3MgYW5kIGRyb3AgcGFja2V0CisgKiAgKFR5cGUgJiAweEMwKSA+PiA2CisgKgkwCS0+IGlnbm9yYWJsZQorICoJMQktPiBtdXN0IGRyb3AgdGhlIHBhY2tldAorICoJMgktPiBzZW5kIElDTVAgUEFSTSBQUk9CIHJlZ2FyZGxlc3MgYW5kIGRyb3AgcGFja2V0CisgKgkzCS0+IFNlbmQgSUNNUCBpZiBub3QgYSBtdWx0aWNhc3QgYWRkcmVzcyBhbmQgZHJvcCBwYWNrZXQKICAqICAoVHlwZSAmIDB4MjApID4+IDUKLSAqICAJMAktPiBpbnZhcmlhbnQKLSAqICAJMQktPiBjYW4gY2hhbmdlIHRoZSByb3V0aW5nCisgKgkwCS0+IGludmFyaWFudAorICoJMQktPiBjYW4gY2hhbmdlIHRoZSByb3V0aW5nCiAgKiAgKFR5cGUgJiAweDFGKSBUeXBlCi0gKiAgICAgIDAJLT4gUGFkMSAob25seSAxIGJ5dGUhKQotICogICAgICAxCS0+IFBhZE4gTEVOR1RIIGluZm8gKHRvdGFsIGxlbmd0aCA9IGxlbmd0aCArIDIpCi0gKiAgICAgIEMwIHwgMgktPiBKVU1CTyA0IHggeCB4IHggKCB4eHh4ID4gNjRrICkKLSAqICAgICAgNQktPiBSVEFMRVJUIDIgeCB4CisgKgkwCS0+IFBhZDEgKG9ubHkgMSBieXRlISkKKyAqCTEJLT4gUGFkTiBMRU5HVEggaW5mbyAodG90YWwgbGVuZ3RoID0gbGVuZ3RoICsgMikKKyAqCUMwIHwgMgktPiBKVU1CTyA0IHggeCB4IHggKCB4eHh4ID4gNjRrICkKKyAqCTUJLT4gUlRBTEVSVCAyIHggeAogICovCiAKIHN0YXRpYyBpbnQKQEAgLTYwLDE2ICs2MCwxNiBAQAogICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCiAgICAgICBpbnQgKmhvdGRyb3ApCiB7Ci0gICAgICAgc3RydWN0IGlwdjZfb3B0X2hkciBfb3B0c2gsICpvaDsKLSAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9vcHRzICpvcHRpbmZvID0gbWF0Y2hpbmZvOwotICAgICAgIHVuc2lnbmVkIGludCB0ZW1wOwotICAgICAgIHVuc2lnbmVkIGludCBwdHI7Ci0gICAgICAgdW5zaWduZWQgaW50IGhkcmxlbiA9IDA7Ci0gICAgICAgdW5zaWduZWQgaW50IHJldCA9IDA7Ci0gICAgICAgdTggX29wdHR5cGUsICp0cCA9IE5VTEw7Ci0gICAgICAgdTggX29wdGxlbiwgKmxwID0gTlVMTDsKLSAgICAgICB1bnNpZ25lZCBpbnQgb3B0bGVuOwotICAgICAgIAorCXN0cnVjdCBpcHY2X29wdF9oZHIgX29wdHNoLCAqb2g7CisJY29uc3Qgc3RydWN0IGlwNnRfb3B0cyAqb3B0aW5mbyA9IG1hdGNoaW5mbzsKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKwl1bnNpZ25lZCBpbnQgcHRyOworCXVuc2lnbmVkIGludCBoZHJsZW4gPSAwOworCXVuc2lnbmVkIGludCByZXQgPSAwOworCXU4IF9vcHR0eXBlLCAqdHAgPSBOVUxMOworCXU4IF9vcHRsZW4sICpscCA9IE5VTEw7CisJdW5zaWduZWQgaW50IG9wdGxlbjsKKwogI2lmIEhPUEJZSE9QCiAJaWYgKGlwdjZfZmluZF9oZHIoc2tiLCAmcHRyLCBORVhUSERSX0hPUCwgTlVMTCkgPCAwKQogI2Vsc2UKQEAgLTc3LDQyICs3Nyw0MSBAQAogI2VuZGlmCiAJCXJldHVybiAwOwogCi0gICAgICAgb2ggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwdHIsIHNpemVvZihfb3B0c2gpLCAmX29wdHNoKTsKLSAgICAgICBpZiAob2ggPT0gTlVMTCl7Ci0JICAgICAgICpob3Rkcm9wID0gMTsKLSAgICAgICAJCXJldHVybiAwOwotICAgICAgIH0KKwlvaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHB0ciwgc2l6ZW9mKF9vcHRzaCksICZfb3B0c2gpOworCWlmIChvaCA9PSBOVUxMKSB7CisJCSpob3Rkcm9wID0gMTsKKwkJcmV0dXJuIDA7CisJfQogCi0gICAgICAgaGRybGVuID0gaXB2Nl9vcHRsZW4ob2gpOwotICAgICAgIGlmIChza2ItPmxlbiAtIHB0ciA8IGhkcmxlbil7Ci0JICAgICAgIC8qIFBhY2tldCBzbWFsbGVyIHRoYW4gaXQncyBsZW5ndGggZmllbGQgKi8KLSAgICAgICAJCXJldHVybiAwOwotICAgICAgIH0KKwloZHJsZW4gPSBpcHY2X29wdGxlbihvaCk7CisJaWYgKHNrYi0+bGVuIC0gcHRyIDwgaGRybGVuKSB7CisJCS8qIFBhY2tldCBzbWFsbGVyIHRoYW4gaXQncyBsZW5ndGggZmllbGQgKi8KKwkJcmV0dXJuIDA7CisJfQogCi0gICAgICAgREVCVUdQKCJJUHY2IE9QVFMgTEVOICV1ICV1ICIsIGhkcmxlbiwgb2gtPmhkcmxlbik7CisJREVCVUdQKCJJUHY2IE9QVFMgTEVOICV1ICV1ICIsIGhkcmxlbiwgb2gtPmhkcmxlbik7CiAKLSAgICAgICBERUJVR1AoImxlbiAlMDJYICUwNFggJTAyWCAiLAotICAgICAgIAkJb3B0aW5mby0+aGRybGVuLCBoZHJsZW4sCi0gICAgICAgCQkoIShvcHRpbmZvLT5mbGFncyAmIElQNlRfT1BUU19MRU4pIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKG9wdGluZm8tPmhkcmxlbiA9PSBoZHJsZW4pIF4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICEhKG9wdGluZm8tPmludmZsYWdzICYgSVA2VF9PUFRTX0lOVl9MRU4pKSkpOworCURFQlVHUCgibGVuICUwMlggJTA0WCAlMDJYICIsCisJICAgICAgIG9wdGluZm8tPmhkcmxlbiwgaGRybGVuLAorCSAgICAgICAoIShvcHRpbmZvLT5mbGFncyAmIElQNlRfT1BUU19MRU4pIHx8CisJCSgob3B0aW5mby0+aGRybGVuID09IGhkcmxlbikgXgorCQkgISEob3B0aW5mby0+aW52ZmxhZ3MgJiBJUDZUX09QVFNfSU5WX0xFTikpKSk7CiAKLSAgICAgICByZXQgPSAob2ggIT0gTlVMTCkKLSAgICAgICAJCSYmCi0JICAgICAgCSghKG9wdGluZm8tPmZsYWdzICYgSVA2VF9PUFRTX0xFTikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3B0aW5mby0+aGRybGVuID09IGhkcmxlbikgXgotICAgICAgICAgICAgICAgICAgICAgICAgICAgISEob3B0aW5mby0+aW52ZmxhZ3MgJiBJUDZUX09QVFNfSU5WX0xFTikpKTsKKwlyZXQgPSAob2ggIT0gTlVMTCkgJiYKKwkgICAgICAoIShvcHRpbmZvLT5mbGFncyAmIElQNlRfT1BUU19MRU4pIHx8CisJICAgICAgICgob3B0aW5mby0+aGRybGVuID09IGhkcmxlbikgXgorCQkhIShvcHRpbmZvLT5pbnZmbGFncyAmIElQNlRfT1BUU19JTlZfTEVOKSkpOwogCi0gICAgICAgcHRyICs9IDI7Ci0gICAgICAgaGRybGVuIC09IDI7Ci0gICAgICAgaWYgKCAhKG9wdGluZm8tPmZsYWdzICYgSVA2VF9PUFRTX09QVFMpICl7Ci0JICAgICAgIHJldHVybiByZXQ7CisJcHRyICs9IDI7CisJaGRybGVuIC09IDI7CisJaWYgKCEob3B0aW5mby0+ZmxhZ3MgJiBJUDZUX09QVFNfT1BUUykpIHsKKwkJcmV0dXJuIHJldDsKIAl9IGVsc2UgaWYgKG9wdGluZm8tPmZsYWdzICYgSVA2VF9PUFRTX05TVFJJQ1QpIHsKIAkJREVCVUdQKCJOb3Qgc3RyaWN0IC0gbm90IGltcGxlbWVudGVkIik7CiAJfSBlbHNlIHsKIAkJREVCVUdQKCJTdHJpY3QgIik7Ci0JCURFQlVHUCgiIyVkICIsb3B0aW5mby0+b3B0c25yKTsKLQkJZm9yKHRlbXA9MDsgdGVtcDxvcHRpbmZvLT5vcHRzbnI7IHRlbXArKyl7CisJCURFQlVHUCgiIyVkICIsIG9wdGluZm8tPm9wdHNucik7CisJCWZvciAodGVtcCA9IDA7IHRlbXAgPCBvcHRpbmZvLT5vcHRzbnI7IHRlbXArKykgewogCQkJLyogdHlwZSBmaWVsZCBleGlzdHMgPyAqLwogCQkJaWYgKGhkcmxlbiA8IDEpCiAJCQkJYnJlYWs7CkBAIC0xMjIsMTAgKzEyMSwxMCBAQAogCQkJCWJyZWFrOwogCiAJCQkvKiBUeXBlIGNoZWNrICovCi0JCQlpZiAoKnRwICE9IChvcHRpbmZvLT5vcHRzW3RlbXBdICYgMHhGRjAwKT4+OCl7CisJCQlpZiAoKnRwICE9IChvcHRpbmZvLT5vcHRzW3RlbXBdICYgMHhGRjAwKSA+PiA4KSB7CiAJCQkJREVCVUdQKCJUYmFkICUwMlggJTAyWFxuIiwKIAkJCQkgICAgICAgKnRwLAotCQkJCSAgICAgICAob3B0aW5mby0+b3B0c1t0ZW1wXSAmIDB4RkYwMCk+PjgpOworCQkJCSAgICAgICAob3B0aW5mby0+b3B0c1t0ZW1wXSAmIDB4RkYwMCkgPj4gOCk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9IGVsc2UgewogCQkJCURFQlVHUCgiVG9rICIpOwpAQCAtMTY5LDcgKzE2OCw4IEBACiAJCX0KIAkJaWYgKHRlbXAgPT0gb3B0aW5mby0+b3B0c25yKQogCQkJcmV0dXJuIHJldDsKLQkJZWxzZSByZXR1cm4gMDsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xNzgsMjUgKzE3OCwyNCBAQAogLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0gICAgICAgICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKLSAgICAgICAgICB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCi0gICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKKwkgICBjb25zdCB2b2lkICplbnRyeSwKKwkgICB2b2lkICptYXRjaGluZm8sCisJICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCisJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKLSAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9vcHRzICpvcHRzaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXA2dF9vcHRzICpvcHRzaW5mbyA9IG1hdGNoaW5mbzsKIAotICAgICAgIGlmIChtYXRjaGluZm9zaXplICE9IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X29wdHMpKSkgewotICAgICAgICAgICAgICBERUJVR1AoImlwNnRfb3B0czogbWF0Y2hzaXplICV1ICE9ICV1XG4iLAotICAgICAgICAgICAgICAgICAgICAgIG1hdGNoaW5mb3NpemUsIElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X29wdHMpKSk7Ci0gICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgIH0KLSAgICAgICBpZiAob3B0c2luZm8tPmludmZsYWdzICYgfklQNlRfT1BUU19JTlZfTUFTSykgewotICAgICAgICAgICAgICBERUJVR1AoImlwNnRfb3B0czogdW5rbm93biBmbGFncyAlWFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBvcHRzaW5mby0+aW52ZmxhZ3MpOwotICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICB9CisJaWYgKG1hdGNoaW5mb3NpemUgIT0gSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfb3B0cykpKSB7CisJCURFQlVHUCgiaXA2dF9vcHRzOiBtYXRjaHNpemUgJXUgIT0gJXVcbiIsCisJCSAgICAgICBtYXRjaGluZm9zaXplLCBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9vcHRzKSkpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKG9wdHNpbmZvLT5pbnZmbGFncyAmIH5JUDZUX09QVFNfSU5WX01BU0spIHsKKwkJREVCVUdQKCJpcDZ0X29wdHM6IHVua25vd24gZmxhZ3MgJVhcbiIsIG9wdHNpbmZvLT5pbnZmbGFncyk7CisJCXJldHVybiAwOworCX0KIAotICAgICAgIHJldHVybiAxOworCXJldHVybiAxOwogfQogCiBzdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggb3B0c19tYXRjaCA9IHsKQEAgLTIxMiwxMiArMjExLDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKIHsKLSAgICAgICByZXR1cm4gaXA2dF9yZWdpc3Rlcl9tYXRjaCgmb3B0c19tYXRjaCk7CisJcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJm9wdHNfbWF0Y2gpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cCh2b2lkKQogewotICAgICAgIGlwNnRfdW5yZWdpc3Rlcl9tYXRjaCgmb3B0c19tYXRjaCk7CisJaXA2dF91bnJlZ2lzdGVyX21hdGNoKCZvcHRzX21hdGNoKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9obC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaGwuYwppbmRleCAwYmVhZmY1Li5jNWQ5MDc5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9obC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hsLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKK3N0YXRpYyBpbnQgY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmVudHJ5LAogCQkgICAgICB2b2lkICptYXRjaGluZm8sIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9pcHY2aGVhZGVyLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9pcHY2aGVhZGVyLmMKaW5kZXggMzJlNjdmMC4uODNhZDZiMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaXB2NmhlYWRlci5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2lwdjZoZWFkZXIuYwpAQCAtNTAsMjAgKzUwLDIwIEBACiAJbGVuID0gc2tiLT5sZW4gLSBwdHI7CiAJdGVtcCA9IDA7CiAKLSAgICAgICAgd2hpbGUgKGlwNnRfZXh0X2hkcihuZXh0aGRyKSkgeworCXdoaWxlIChpcDZ0X2V4dF9oZHIobmV4dGhkcikpIHsKIAkJc3RydWN0IGlwdjZfb3B0X2hkciBfaGRyLCAqaHA7Ci0gICAgICAgIAlpbnQgaGRybGVuOworCQlpbnQgaGRybGVuOwogCiAJCS8qIElzIHRoZXJlIGVub3VnaCBzcGFjZSBmb3IgdGhlIG5leHQgZXh0IGhlYWRlcj8gKi8KLSAgICAgICAgICAgICAgICBpZiAobGVuIDwgKGludClzaXplb2Yoc3RydWN0IGlwdjZfb3B0X2hkcikpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwkJaWYgKGxlbiA8IChpbnQpc2l6ZW9mKHN0cnVjdCBpcHY2X29wdF9oZHIpKQorCQkJcmV0dXJuIDA7CiAJCS8qIE5vIG1vcmUgZXh0aGRyIC0+IGV2YWx1YXRlICovCi0gICAgICAgICAgICAgICAgaWYgKG5leHRoZHIgPT0gTkVYVEhEUl9OT05FKSB7CisJCWlmIChuZXh0aGRyID09IE5FWFRIRFJfTk9ORSkgewogCQkJdGVtcCB8PSBNQVNLX05PTkU7CiAJCQlicmVhazsKIAkJfQogCQkvKiBFU1AgLT4gZXZhbHVhdGUgKi8KLSAgICAgICAgICAgICAgICBpZiAobmV4dGhkciA9PSBORVhUSERSX0VTUCkgeworCQlpZiAobmV4dGhkciA9PSBORVhUSERSX0VTUCkgewogCQkJdGVtcCB8PSBNQVNLX0VTUDsKIAkJCWJyZWFrOwogCQl9CkBAIC03Miw0MyArNzIsNDMgQEAKIAkJQlVHX09OKGhwID09IE5VTEwpOwogCiAJCS8qIENhbGN1bGF0ZSB0aGUgaGVhZGVyIGxlbmd0aCAqLwotICAgICAgICAgICAgICAgIGlmIChuZXh0aGRyID09IE5FWFRIRFJfRlJBR01FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhkcmxlbiA9IDg7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0aGRyID09IE5FWFRIRFJfQVVUSCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGhkcmxlbiA9IChocC0+aGRybGVuKzIpPDwyOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGhkcmxlbiA9IGlwdjZfb3B0bGVuKGhwKTsKKwkJaWYgKG5leHRoZHIgPT0gTkVYVEhEUl9GUkFHTUVOVCkgeworCQkJaGRybGVuID0gODsKKwkJfSBlbHNlIGlmIChuZXh0aGRyID09IE5FWFRIRFJfQVVUSCkKKwkJCWhkcmxlbiA9IChocC0+aGRybGVuICsgMikgPDwgMjsKKwkJZWxzZQorCQkJaGRybGVuID0gaXB2Nl9vcHRsZW4oaHApOwogCiAJCS8qIHNldCB0aGUgZmxhZyAqLwotCQlzd2l0Y2ggKG5leHRoZHIpewotCQkJY2FzZSBORVhUSERSX0hPUDoKLQkJCQl0ZW1wIHw9IE1BU0tfSE9QT1BUUzsKLQkJCQlicmVhazsKLQkJCWNhc2UgTkVYVEhEUl9ST1VUSU5HOgotCQkJCXRlbXAgfD0gTUFTS19ST1VUSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBORVhUSERSX0ZSQUdNRU5UOgotCQkJCXRlbXAgfD0gTUFTS19GUkFHTUVOVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgTkVYVEhEUl9BVVRIOgotCQkJCXRlbXAgfD0gTUFTS19BSDsKLQkJCQlicmVhazsKLQkJCWNhc2UgTkVYVEhEUl9ERVNUOgotCQkJCXRlbXAgfD0gTUFTS19EU1RPUFRTOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gMDsKLQkJCQlicmVhazsKKwkJc3dpdGNoIChuZXh0aGRyKSB7CisJCWNhc2UgTkVYVEhEUl9IT1A6CisJCQl0ZW1wIHw9IE1BU0tfSE9QT1BUUzsKKwkJCWJyZWFrOworCQljYXNlIE5FWFRIRFJfUk9VVElORzoKKwkJCXRlbXAgfD0gTUFTS19ST1VUSU5HOworCQkJYnJlYWs7CisJCWNhc2UgTkVYVEhEUl9GUkFHTUVOVDoKKwkJCXRlbXAgfD0gTUFTS19GUkFHTUVOVDsKKwkJCWJyZWFrOworCQljYXNlIE5FWFRIRFJfQVVUSDoKKwkJCXRlbXAgfD0gTUFTS19BSDsKKwkJCWJyZWFrOworCQljYXNlIE5FWFRIRFJfREVTVDoKKwkJCXRlbXAgfD0gTUFTS19EU1RPUFRTOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOwogCQl9CiAKLSAgICAgICAgICAgICAgICBuZXh0aGRyID0gaHAtPm5leHRoZHI7Ci0gICAgICAgICAgICAgICAgbGVuIC09IGhkcmxlbjsKLSAgICAgICAgICAgICAgICBwdHIgKz0gaGRybGVuOworCQluZXh0aGRyID0gaHAtPm5leHRoZHI7CisJCWxlbiAtPSBoZHJsZW47CisJCXB0ciArPSBoZHJsZW47CiAJCWlmIChwdHIgPiBza2ItPmxlbikKIAkJCWJyZWFrOwotICAgICAgICB9CisJfQogCi0JaWYgKCAobmV4dGhkciAhPSBORVhUSERSX05PTkUgKSAmJiAobmV4dGhkciAhPSBORVhUSERSX0VTUCkgKQorCWlmICgobmV4dGhkciAhPSBORVhUSERSX05PTkUpICYmIChuZXh0aGRyICE9IE5FWFRIRFJfRVNQKSkKIAkJdGVtcCB8PSBNQVNLX1BST1RPOwogCiAJaWYgKGluZm8tPm1vZGVmbGFnKQpAQCAtMTI0LDcgKzEyNCw3IEBACiAKIHN0YXRpYyBpbnQKIGlwdjZoZWFkZXJfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCisJCSAgICAgIGNvbnN0IHZvaWQgKmlwLAogCQkgICAgICB2b2lkICptYXRjaGluZm8sCiAJCSAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCkBAIC0xMzcsOCArMTM3LDggQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBpbnZmbGFncyBpcyAwIG9yIDB4ZmYgaW4gaGFyZCBtb2RlICovCi0JaWYgKCghaW5mby0+bW9kZWZsYWcpICYmIGluZm8tPmludmZsYWdzICE9IDB4MDAKLQkJCSAgICAgICYmIGluZm8tPmludmZsYWdzICE9IDB4RkYpCisJaWYgKCghaW5mby0+bW9kZWZsYWcpICYmIGluZm8tPmludmZsYWdzICE9IDB4MDAgJiYKKwkgICAgaW5mby0+aW52ZmxhZ3MgIT0gMHhGRikKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gMTsKQEAgLTE1Miw3ICsxNTIsNyBAQAogCS5tZQkJPSBUSElTX01PRFVMRSwKIH07CiAKLXN0YXRpYyBpbnQgIF9faW5pdCBpcHY2aGVhZGVyX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGlwdjZoZWFkZXJfaW5pdCh2b2lkKQogewogCXJldHVybiBpcDZ0X3JlZ2lzdGVyX21hdGNoKCZpcDZ0X2lwdjZoZWFkZXJfbWF0Y2gpOwogfQpAQCAtMTY0LDQgKzE2NCwzIEBACiAKIG1vZHVsZV9pbml0KGlwdjZoZWFkZXJfaW5pdCk7CiBtb2R1bGVfZXhpdChpcHY2aGVhZGVyX2V4aXQpOwotCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9sZW5ndGguYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2xlbmd0aC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDUzN2QzLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2xlbmd0aC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyogTGVuZ3RoIE1hdGNoIC0gSVB2NiBQb3J0ICovCi0KLS8qIChDKSAxOTk5LTIwMDEgSmFtZXMgTW9ycmlzIDxqbW9ycm9zQGludGVyY29kZS5jb20uYXU+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2xlbmd0aC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIklQdjYgcGFja2V0IGxlbmd0aCBtYXRjaCIpOwotCi1zdGF0aWMgaW50Ci1tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLSAgICAgIGludCBvZmZzZXQsCi0gICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgIGludCAqaG90ZHJvcCkKLXsKLQljb25zdCBzdHJ1Y3QgaXA2dF9sZW5ndGhfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKLQl1X2ludDE2X3QgcGt0bGVuID0gbnRvaHMoc2tiLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4pICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKLQkKLQlyZXR1cm4gKHBrdGxlbiA+PSBpbmZvLT5taW4gJiYgcGt0bGVuIDw9IGluZm8tPm1heCkgXiBpbmZvLT5pbnZlcnQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAotICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0JaWYgKG1hdGNoc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9sZW5ndGhfaW5mbykpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggbGVuZ3RoX21hdGNoID0gewotCS5uYW1lCQk9ICJsZW5ndGgiLAotCS5tYXRjaAkJPSAmbWF0Y2gsCi0JLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJmxlbmd0aF9tYXRjaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCi17Ci0JaXA2dF91bnJlZ2lzdGVyX21hdGNoKCZsZW5ndGhfbWF0Y2gpOwotfQotCi1tb2R1bGVfaW5pdChpbml0KTsKLW1vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfbGltaXQuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2xpbWl0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNzgyZjYuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfbGltaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKiBLZXJuZWwgbW9kdWxlIHRvIGNvbnRyb2wgdGhlIHJhdGUKLSAqCi0gKiAyIFNlcHRlbWJlciAxOTk5OiBDaGFuZ2VkIGZyb20gdGhlIHRhcmdldCBSQVRFIHRvIHRoZSBtYXRjaAotICogICAgICAgICAgICAgICAgICAgYGxpbWl0JywgcmVtb3ZlZCBsb2dnaW5nLiAgRGlkIEkgbWVudGlvbiB0aGF0Ci0gKiAgICAgICAgICAgICAgICAgICBBbGV4ZXkgaXMgYSBmdWNraW5nIGdlbml1cz8KLSAqICAgICAgICAgICAgICAgICAgIFJ1c3R5IFJ1c3NlbGwgKHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdSkuICAqLwotCi0vKiAoQykgMTk5OSBK6XL0bWUgZGUgVml2aWUgPGRldml2aWVAaW5mby5lbnNlcmIudS1ib3JkZWF1eC5mcj4KLSAqIChDKSAxOTk5IEhlcnbpIEV5Y2hlbm5lIDxleWNoZW5uZUBpbmZvLmVuc2VyYi51LWJvcmRlYXV4LmZyPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9saW1pdC5oPgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJIZXJ2ZSBFeWNoZW5uZSA8cnZAd2FsbGZpcmUub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJyYXRlIGxpbWl0aW5nIHdpdGhpbiBpcDZ0YWJsZXMiKTsKLQotLyogVGhlIGFsZ29yaXRobSB1c2VkIGlzIHRoZSBTaW1wbGUgVG9rZW4gQnVja2V0IEZpbHRlciAoVEJGKQotICogc2VlIG5ldC9zY2hlZC9zY2hfdGJmLmMgaW4gdGhlIGxpbnV4IHNvdXJjZSB0cmVlCi0gKi8KLQotc3RhdGljIERFRklORV9TUElOTE9DSyhsaW1pdF9sb2NrKTsKLQotLyogUnVzdHk6IFRoaXMgaXMgbXkgKG5vbi1tYXRoZW1hdGljYWxseS1pbmNsaW5lZCkgdW5kZXJzdGFuZGluZyBvZgotICAgdGhpcyBhbGdvcml0aG0uICBUaGUgYGF2ZXJhZ2UgcmF0ZScgaW4gamlmZmllcyBiZWNvbWVzIHlvdXIgaW5pdGlhbAotICAgYW1vdW50IG9mIGNyZWRpdCBgY3JlZGl0JyBhbmQgdGhlIG1vc3QgY3JlZGl0IHlvdSBjYW4gZXZlciBoYXZlCi0gICBgY3JlZGl0X2NhcCcuICBUaGUgYHBlYWsgcmF0ZScgYmVjb21lcyB0aGUgY29zdCBvZiBwYXNzaW5nIHRoZQotICAgdGVzdCwgYGNvc3QnLgotCi0gICBgcHJldicgdHJhY2tzIHRoZSBsYXN0IHBhY2tldCBoaXQ6IHlvdSBnYWluIG9uZSBjcmVkaXQgcGVyIGppZmZ5LgotICAgSWYgeW91IGdldCBjcmVkaXQgYmFsYW5jZSBtb3JlIHRoYW4gdGhpcywgdGhlIGV4dHJhIGNyZWRpdCBpcwotICAgZGlzY2FyZGVkLiAgRXZlcnkgdGltZSB0aGUgbWF0Y2ggcGFzc2VzLCB5b3UgbG9zZSBgY29zdCcgY3JlZGl0czsKLSAgIGlmIHlvdSBkb24ndCBoYXZlIHRoYXQgbWFueSwgdGhlIHRlc3QgZmFpbHMuCi0KLSAgIFNlZSBBbGV4ZXkncyBmb3JtYWwgZXhwbGFuYXRpb24gaW4gbmV0L3NjaGVkL3NjaF90YmYuYy4KLQotICAgVG8gYXZvaWQgdW5kZXJmbG93LCB3ZSBtdWx0aXBseSBieSAxMjggKGllLiB5b3UgZ2V0IDEyOCBjcmVkaXRzIHBlcgotICAgamlmZnkpLiAgSGVuY2UgYSBjb3N0IG9mIDJeMzItMSwgbWVhbnMgb25lIHBhc3MgcGVyIDMyNzY4IHNlY29uZHMKLSAgIGF0IDEwMjRIWiAob3Igb25lIGV2ZXJ5IDkgaG91cnMpLiAgQSBjb3N0IG9mIDEgbWVhbnMgMTI4MDAgcGFzc2VzCi0gICBwZXIgc2Vjb25kIGF0IDEwMEhaLiAgKi8KLQotI2RlZmluZSBDUkVESVRTX1BFUl9KSUZGWSAxMjgKLQotc3RhdGljIGludAotaXA2dF9saW1pdF9tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCWNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLQkJaW50IG9mZnNldCwKLQkJdW5zaWduZWQgaW50IHByb3RvZmYsCi0JCWludCAqaG90ZHJvcCkKLXsKLQlzdHJ1Y3QgaXA2dF9yYXRlaW5mbyAqciA9ICgoc3RydWN0IGlwNnRfcmF0ZWluZm8gKiltYXRjaGluZm8pLT5tYXN0ZXI7Ci0JdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwotCi0Jc3Bpbl9sb2NrX2JoKCZsaW1pdF9sb2NrKTsKLQlyLT5jcmVkaXQgKz0gKG5vdyAtIHhjaGcoJnItPnByZXYsIG5vdykpICogQ1JFRElUU19QRVJfSklGRlk7Ci0JaWYgKHItPmNyZWRpdCA+IHItPmNyZWRpdF9jYXApCi0JCXItPmNyZWRpdCA9IHItPmNyZWRpdF9jYXA7Ci0KLQlpZiAoci0+Y3JlZGl0ID49IHItPmNvc3QpIHsKLQkJLyogV2UncmUgbm90IGxpbWl0ZWQuICovCi0JCXItPmNyZWRpdCAtPSByLT5jb3N0OwotCQlzcGluX3VubG9ja19iaCgmbGltaXRfbG9jayk7Ci0JCXJldHVybiAxOwotCX0KLQotICAgICAgIAlzcGluX3VubG9ja19iaCgmbGltaXRfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFByZWNpc2lvbiBzYXZlci4gKi8KLXN0YXRpYyB1X2ludDMyX3QKLXVzZXIyY3JlZGl0cyh1X2ludDMyX3QgdXNlcikKLXsKLQkvKiBJZiBtdWx0aXBseWluZyB3b3VsZCBvdmVyZmxvdy4uLiAqLwotCWlmICh1c2VyID4gMHhGRkZGRkZGRiAvIChIWipDUkVESVRTX1BFUl9KSUZGWSkpCi0JCS8qIERpdmlkZSBmaXJzdC4gKi8KLQkJcmV0dXJuICh1c2VyIC8gSVA2VF9MSU1JVF9TQ0FMRSkgKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZOwotCi0JcmV0dXJuICh1c2VyICogSFogKiBDUkVESVRTX1BFUl9KSUZGWSkgLyBJUDZUX0xJTUlUX1NDQUxFOwotfQotCi1zdGF0aWMgaW50Ci1pcDZ0X2xpbWl0X2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCi0JCSAgICAgdm9pZCAqbWF0Y2hpbmZvLAotCQkgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0JCSAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLQlzdHJ1Y3QgaXA2dF9yYXRlaW5mbyAqciA9IG1hdGNoaW5mbzsKLQotCWlmIChtYXRjaHNpemUgIT0gSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfcmF0ZWluZm8pKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBDaGVjayBmb3Igb3ZlcmZsb3cuICovCi0JaWYgKHItPmJ1cnN0ID09IDAKLQkgICAgfHwgdXNlcjJjcmVkaXRzKHItPmF2ZyAqIHItPmJ1cnN0KSA8IHVzZXIyY3JlZGl0cyhyLT5hdmcpKSB7Ci0JCXByaW50aygiQ2FsbCBydXN0eTogb3ZlcmZsb3cgaW4gaXA2dF9saW1pdDogJXUvJXVcbiIsCi0JCSAgICAgICByLT5hdmcsIHItPmJ1cnN0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogVXNlciBhdmcgaW4gc2Vjb25kcyAqIElQNlRfTElNSVRfU0NBTEU6IGNvbnZlcnQgdG8gamlmZmllcyAqCi0JICAgMTI4LiAqLwotCXItPnByZXYgPSBqaWZmaWVzOwotCXItPmNyZWRpdCA9IHVzZXIyY3JlZGl0cyhyLT5hdmcgKiByLT5idXJzdCk7CSAvKiBDcmVkaXRzIGZ1bGwuICovCi0Jci0+Y3JlZGl0X2NhcCA9IHVzZXIyY3JlZGl0cyhyLT5hdmcgKiByLT5idXJzdCk7IC8qIENyZWRpdHMgZnVsbC4gKi8KLQlyLT5jb3N0ID0gdXNlcjJjcmVkaXRzKHItPmF2Zyk7Ci0KLQkvKiBGb3IgU01QLCB3ZSBvbmx5IHdhbnQgdG8gdXNlIG9uZSBzZXQgb2YgY291bnRlcnMuICovCi0Jci0+bWFzdGVyID0gcjsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggaXA2dF9saW1pdF9yZWcgPSB7Ci0JLm5hbWUJCT0gImxpbWl0IiwKLQkubWF0Y2gJCT0gaXA2dF9saW1pdF9tYXRjaCwKLQkuY2hlY2tlbnRyeQk9IGlwNnRfbGltaXRfY2hlY2tlbnRyeSwKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JaWYgKGlwNnRfcmVnaXN0ZXJfbWF0Y2goJmlwNnRfbGltaXRfcmVnKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCi17Ci0JaXA2dF91bnJlZ2lzdGVyX21hdGNoKCZpcDZ0X2xpbWl0X3JlZyk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9tYWMuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X21hYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjZkNDNlLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X21hYy5jCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBNQUMgYWRkcmVzcyBwYXJhbWV0ZXJzLiAqLwotCi0vKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCi0gKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbWFjLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oPgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk1BQyBhZGRyZXNzIG1hdGNoaW5nIG1vZHVsZSBmb3IgSVB2NiIpOwotTU9EVUxFX0FVVEhPUigiTmV0ZmlsdGVyIENvcmUgVGVhYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Iik7Ci0KLXN0YXRpYyBpbnQKLW1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgaW50IG9mZnNldCwKLSAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAotICAgICAgaW50ICpob3Rkcm9wKQotewotICAgIGNvbnN0IHN0cnVjdCBpcDZ0X21hY19pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCi0gICAgLyogSXMgbWFjIHBvaW50ZXIgdmFsaWQ/ICovCi0gICAgcmV0dXJuIChza2ItPm1hYy5yYXcgPj0gc2tiLT5oZWFkCi0JICAgICYmIChza2ItPm1hYy5yYXcgKyBFVEhfSExFTikgPD0gc2tiLT5kYXRhCi0JICAgIC8qIElmIHNvLCBjb21wYXJlLi4uICovCi0JICAgICYmICgobWVtY21wKGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UsIGluZm8tPnNyY2FkZHIsIEVUSF9BTEVOKQotCQk9PSAwKSBeIGluZm8tPmludmVydCkpOwotfQotCi1zdGF0aWMgaW50Ci1pcDZ0X21hY19jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKLQkJICAgdm9pZCAqbWF0Y2hpbmZvLAotCQkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAotCQkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWlmIChob29rX21hc2sKLQkgICAgJiB+KCgxIDw8IE5GX0lQNl9QUkVfUk9VVElORykgfCAoMSA8PCBORl9JUDZfTE9DQUxfSU4pCi0JCXwgKDEgPDwgTkZfSVA2X0ZPUldBUkQpKSkgewotCQlwcmludGsoImlwNnRfbWFjOiBvbmx5IHZhbGlkIGZvciBQUkVfUk9VVElORywgTE9DQUxfSU4gb3IiCi0JCSAgICAgICAiIEZPUldBUkRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAobWF0Y2hzaXplICE9IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X21hY19pbmZvKSkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXA2dF9tYXRjaCBtYWNfbWF0Y2ggPSB7Ci0JLm5hbWUJCT0gIm1hYyIsCi0JLm1hdGNoCQk9ICZtYXRjaCwKLQkuY2hlY2tlbnRyeQk9ICZpcDZ0X21hY19jaGVja2VudHJ5LAotCS5tZQkJPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQlyZXR1cm4gaXA2dF9yZWdpc3Rlcl9tYXRjaCgmbWFjX21hdGNoKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKLXsKLQlpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJm1hY19tYXRjaCk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9tYXJrLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9tYXJrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZmMzZGUuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfbWFyay5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBORk1BUksgdmFsdWVzLiAqLwotCi0vKiAoQykgMTk5OS0yMDAxIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21hcmsuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIk5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImlwNnRhYmxlcyBtYXJrIG1hdGNoIik7Ci0KLXN0YXRpYyBpbnQKLW1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgaW50IG9mZnNldCwKLSAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAotICAgICAgaW50ICpob3Rkcm9wKQotewotCWNvbnN0IHN0cnVjdCBpcDZ0X21hcmtfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKLQotCXJldHVybiAoKHNrYi0+bmZtYXJrICYgaW5mby0+bWFzaykgPT0gaW5mby0+bWFyaykgXiBpbmZvLT5pbnZlcnQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAotICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0JaWYgKG1hdGNoc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9tYXJrX2luZm8pKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcDZ0X21hdGNoIG1hcmtfbWF0Y2ggPSB7Ci0JLm5hbWUJCT0gIm1hcmsiLAotCS5tYXRjaAkJPSAmbWF0Y2gsCi0JLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJm1hcmtfbWF0Y2gpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwNnRfdW5yZWdpc3Rlcl9tYXRjaCgmbWFya19tYXRjaCk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9tdWx0aXBvcnQuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X211bHRpcG9ydC5jCmluZGV4IDZlMzI0NjEuLjQ5Zjc4MjkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X211bHRpcG9ydC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X211bHRpcG9ydC5jCkBAIC04NCwxMSArODQsMTIgQEAKIC8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCisJICAgY29uc3Qgdm9pZCAqaW5mbywKIAkgICB2b2lkICptYXRjaGluZm8sCiAJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogeworCWNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAgPSBpbmZvOwogCWNvbnN0IHN0cnVjdCBpcDZ0X211bHRpcG9ydCAqbXVsdGlpbmZvID0gbWF0Y2hpbmZvOwogCiAJaWYgKG1hdGNoc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9tdWx0aXBvcnQpKSkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X293bmVyLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9vd25lci5jCmluZGV4IDRkZTRjZGEuLjhjOGE0YzcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X293bmVyLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfb3duZXIuYwpAQCAtMzYsMTQgKzM2LDE0IEBACiAJaWYgKCFza2ItPnNrIHx8ICFza2ItPnNrLT5za19zb2NrZXQgfHwgIXNrYi0+c2stPnNrX3NvY2tldC0+ZmlsZSkKIAkJcmV0dXJuIDA7CiAKLQlpZihpbmZvLT5tYXRjaCAmIElQNlRfT1dORVJfVUlEKSB7Ci0JCWlmKChza2ItPnNrLT5za19zb2NrZXQtPmZpbGUtPmZfdWlkICE9IGluZm8tPnVpZCkgXgorCWlmIChpbmZvLT5tYXRjaCAmIElQNlRfT1dORVJfVUlEKSB7CisJCWlmICgoc2tiLT5zay0+c2tfc29ja2V0LT5maWxlLT5mX3VpZCAhPSBpbmZvLT51aWQpIF4KIAkJICAgICEhKGluZm8tPmludmVydCAmIElQNlRfT1dORVJfVUlEKSkKIAkJCXJldHVybiAwOwogCX0KIAotCWlmKGluZm8tPm1hdGNoICYgSVA2VF9PV05FUl9HSUQpIHsKLQkJaWYoKHNrYi0+c2stPnNrX3NvY2tldC0+ZmlsZS0+Zl9naWQgIT0gaW5mby0+Z2lkKSBeCisJaWYgKGluZm8tPm1hdGNoICYgSVA2VF9PV05FUl9HSUQpIHsKKwkJaWYgKChza2ItPnNrLT5za19zb2NrZXQtPmZpbGUtPmZfZ2lkICE9IGluZm8tPmdpZCkgXgogCQkgICAgISEoaW5mby0+aW52ZXJ0ICYgSVA2VF9PV05FUl9HSUQpKQogCQkJcmV0dXJuIDA7CiAJfQpAQCAtNTMsMjMgKzUzLDIzIEBACiAKIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAotICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCisJICAgY29uc3Qgdm9pZCAqaXAsCisJICAgdm9pZCAqbWF0Y2hpbmZvLAorCSAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKIAljb25zdCBzdHJ1Y3QgaXA2dF9vd25lcl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwogCi0gICAgICAgIGlmIChob29rX21hc2sKLSAgICAgICAgICAgICYgfigoMSA8PCBORl9JUDZfTE9DQUxfT1VUKSB8ICgxIDw8IE5GX0lQNl9QT1NUX1JPVVRJTkcpKSkgewotICAgICAgICAgICAgICAgIHByaW50aygiaXA2dF9vd25lcjogb25seSB2YWxpZCBmb3IgTE9DQUxfT1VUIG9yIFBPU1RfUk9VVElORy5cbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9CisJaWYgKGhvb2tfbWFzaworCSAgICAmIH4oKDEgPDwgTkZfSVA2X0xPQ0FMX09VVCkgfCAoMSA8PCBORl9JUDZfUE9TVF9ST1VUSU5HKSkpIHsKKwkJcHJpbnRrKCJpcDZ0X293bmVyOiBvbmx5IHZhbGlkIGZvciBMT0NBTF9PVVQgb3IgUE9TVF9ST1VUSU5HLlxuIik7CisJCXJldHVybiAwOworCX0KIAogCWlmIChtYXRjaHNpemUgIT0gSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfb3duZXJfaW5mbykpKQogCQlyZXR1cm4gMDsKIAotCWlmIChpbmZvLT5tYXRjaCAmIChJUDZUX09XTkVSX1BJRHxJUDZUX09XTkVSX1NJRCkpIHsKKwlpZiAoaW5mby0+bWF0Y2ggJiAoSVA2VF9PV05FUl9QSUQgfCBJUDZUX09XTkVSX1NJRCkpIHsKIAkJcHJpbnRrKCJpcHRfb3duZXI6IHBpZCBhbmQgc2lkIG1hdGNoaW5nICIKIAkJICAgICAgICJub3Qgc3VwcG9ydGVkIGFueW1vcmVcbiIpOwogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X3BoeXNkZXYuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X3BoeXNkZXYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1MTVjOC4uMDAwMDAwMAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9waHlzZGV2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCB0aGUgYnJpZGdlIHBvcnQgaW4gYW5kCi0gKiBvdXQgZGV2aWNlIGZvciBJUCBwYWNrZXRzIGNvbWluZyBpbnRvIGNvbnRhY3Qgd2l0aCBhIGJyaWRnZS4gKi8KLQotLyogKEMpIDIwMDEtMjAwMyBCYXJ0IERlIFNjaHV5bWVyIDxiZHNjaHV5bUBwYW5kb3JhLmJlPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfcGh5c2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlLmg+Ci0jZGVmaW5lIE1BVENIICAgMQotI2RlZmluZSBOT01BVENIIDAKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgYnJpZGdlIHBoeXNpY2FsIGRldmljZSBtYXRjaCBtb2R1bGUiKTsKLQotc3RhdGljIGludAotbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCi0gICAgICBpbnQgb2Zmc2V0LAotICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCi0gICAgICBpbnQgKmhvdGRyb3ApCi17Ci0JaW50IGk7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgbnVsbGRldm5hbWVbSUZOQU1TSVpdOwotCWNvbnN0IHN0cnVjdCBpcDZ0X3BoeXNkZXZfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKLQl1bnNpZ25lZCBpbnQgcmV0OwotCWNvbnN0IGNoYXIgKmluZGV2LCAqb3V0ZGV2OwotCXN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlOwotCi0JLyogTm90IGEgYnJpZGdlZCBJUCBwYWNrZXQgb3Igbm8gaW5mbyBhdmFpbGFibGUgeWV0OgotCSAqIExPQ0FMX09VVC9tYW5nbGUgYW5kIExPQ0FMX09VVC9uYXQgZG9uJ3Qga25vdyBpZgotCSAqIHRoZSBkZXN0aW5hdGlvbiBkZXZpY2Ugd2lsbCBiZSBhIGJyaWRnZS4gKi8KLQlpZiAoIShuZl9icmlkZ2UgPSBza2ItPm5mX2JyaWRnZSkpIHsKLQkJLyogUmV0dXJuIE1BVENIIGlmIHRoZSBpbnZlcnQgZmxhZ3Mgb2YgdGhlIHVzZWQgb3B0aW9ucyBhcmUgb24gKi8KLQkJaWYgKChpbmZvLT5iaXRtYXNrICYgSVA2VF9QSFlTREVWX09QX0JSSURHRUQpICYmCi0JCSAgICAhKGluZm8tPmludmVydCAmIElQNlRfUEhZU0RFVl9PUF9CUklER0VEKSkKLQkJCXJldHVybiBOT01BVENIOwotCQlpZiAoKGluZm8tPmJpdG1hc2sgJiBJUDZUX1BIWVNERVZfT1BfSVNJTikgJiYKLQkJICAgICEoaW5mby0+aW52ZXJ0ICYgSVA2VF9QSFlTREVWX09QX0lTSU4pKQotCQkJcmV0dXJuIE5PTUFUQ0g7Ci0JCWlmICgoaW5mby0+Yml0bWFzayAmIElQNlRfUEhZU0RFVl9PUF9JU09VVCkgJiYKLQkJICAgICEoaW5mby0+aW52ZXJ0ICYgSVA2VF9QSFlTREVWX09QX0lTT1VUKSkKLQkJCXJldHVybiBOT01BVENIOwotCQlpZiAoKGluZm8tPmJpdG1hc2sgJiBJUDZUX1BIWVNERVZfT1BfSU4pICYmCi0JCSAgICAhKGluZm8tPmludmVydCAmIElQNlRfUEhZU0RFVl9PUF9JTikpCi0JCQlyZXR1cm4gTk9NQVRDSDsKLQkJaWYgKChpbmZvLT5iaXRtYXNrICYgSVA2VF9QSFlTREVWX09QX09VVCkgJiYKLQkJICAgICEoaW5mby0+aW52ZXJ0ICYgSVA2VF9QSFlTREVWX09QX09VVCkpCi0JCQlyZXR1cm4gTk9NQVRDSDsKLQkJcmV0dXJuIE1BVENIOwotCX0KLQotCS8qIFRoaXMgb25seSBtYWtlcyBzZW5zZSBpbiB0aGUgRk9SV0FSRCBhbmQgUE9TVFJPVVRJTkcgY2hhaW5zICovCi0JaWYgKChpbmZvLT5iaXRtYXNrICYgSVA2VF9QSFlTREVWX09QX0JSSURHRUQpICYmCi0JICAgICghIShuZl9icmlkZ2UtPm1hc2sgJiBCUk5GX0JSSURHRUQpIF4KLQkgICAgIShpbmZvLT5pbnZlcnQgJiBJUDZUX1BIWVNERVZfT1BfQlJJREdFRCkpKQotCQlyZXR1cm4gTk9NQVRDSDsKLQotCWlmICgoaW5mby0+Yml0bWFzayAmIElQNlRfUEhZU0RFVl9PUF9JU0lOICYmCi0JICAgICghbmZfYnJpZGdlLT5waHlzaW5kZXYgXiAhIShpbmZvLT5pbnZlcnQgJiBJUDZUX1BIWVNERVZfT1BfSVNJTikpKSB8fAotCSAgICAoaW5mby0+Yml0bWFzayAmIElQNlRfUEhZU0RFVl9PUF9JU09VVCAmJgotCSAgICAoIW5mX2JyaWRnZS0+cGh5c291dGRldiBeICEhKGluZm8tPmludmVydCAmIElQNlRfUEhZU0RFVl9PUF9JU09VVCkpKSkKLQkJcmV0dXJuIE5PTUFUQ0g7Ci0KLQlpZiAoIShpbmZvLT5iaXRtYXNrICYgSVA2VF9QSFlTREVWX09QX0lOKSkKLQkJZ290byBtYXRjaF9vdXRkZXY7Ci0JaW5kZXYgPSBuZl9icmlkZ2UtPnBoeXNpbmRldiA/IG5mX2JyaWRnZS0+cGh5c2luZGV2LT5uYW1lIDogbnVsbGRldm5hbWU7Ci0JZm9yIChpID0gMCwgcmV0ID0gMDsgaSA8IElGTkFNU0laL3NpemVvZih1bnNpZ25lZCBpbnQpOyBpKyspIHsKLQkJcmV0IHw9ICgoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZGV2KVtpXQotCQkJXiAoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZm8tPnBoeXNpbmRldilbaV0pCi0JCQkmICgoY29uc3QgdW5zaWduZWQgaW50ICopaW5mby0+aW5fbWFzaylbaV07Ci0JfQotCi0JaWYgKChyZXQgPT0gMCkgXiAhKGluZm8tPmludmVydCAmIElQNlRfUEhZU0RFVl9PUF9JTikpCi0JCXJldHVybiBOT01BVENIOwotCi1tYXRjaF9vdXRkZXY6Ci0JaWYgKCEoaW5mby0+Yml0bWFzayAmIElQNlRfUEhZU0RFVl9PUF9PVVQpKQotCQlyZXR1cm4gTUFUQ0g7Ci0Jb3V0ZGV2ID0gbmZfYnJpZGdlLT5waHlzb3V0ZGV2ID8KLQkJIG5mX2JyaWRnZS0+cGh5c291dGRldi0+bmFtZSA6IG51bGxkZXZuYW1lOwotCWZvciAoaSA9IDAsIHJldCA9IDA7IGkgPCBJRk5BTVNJWi9zaXplb2YodW5zaWduZWQgaW50KTsgaSsrKSB7Ci0JCXJldCB8PSAoKChjb25zdCB1bnNpZ25lZCBpbnQgKilvdXRkZXYpW2ldCi0JCQleICgoY29uc3QgdW5zaWduZWQgaW50ICopaW5mby0+cGh5c291dGRldilbaV0pCi0JCQkmICgoY29uc3QgdW5zaWduZWQgaW50ICopaW5mby0+b3V0X21hc2spW2ldOwotCX0KLQotCXJldHVybiAocmV0ICE9IDApIF4gIShpbmZvLT5pbnZlcnQgJiBJUDZUX1BIWVNERVZfT1BfT1VUKTsKLX0KLQotc3RhdGljIGludAotY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAotCQkgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAotCQkgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKLQkJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0JY29uc3Qgc3RydWN0IGlwNnRfcGh5c2Rldl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCi0JaWYgKG1hdGNoc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9waHlzZGV2X2luZm8pKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKCEoaW5mby0+Yml0bWFzayAmIElQNlRfUEhZU0RFVl9PUF9NQVNLKSB8fAotCSAgICBpbmZvLT5iaXRtYXNrICYgfklQNlRfUEhZU0RFVl9PUF9NQVNLKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcDZ0X21hdGNoIHBoeXNkZXZfbWF0Y2ggPSB7Ci0JLm5hbWUJCT0gInBoeXNkZXYiLAotCS5tYXRjaAkJPSAmbWF0Y2gsCi0JLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJnBoeXNkZXZfbWF0Y2gpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwNnRfdW5yZWdpc3Rlcl9tYXRjaCgmcGh5c2Rldl9tYXRjaCk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9wb2xpY3kuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X3BvbGljeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZTFjYzQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9wb2xpY3kuYwpAQCAtMCwwICsxLDE3NSBAQAorLyogSVAgdGFibGVzIG1vZHVsZSBmb3IgbWF0Y2hpbmcgSVBzZWMgcG9saWN5CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LDIwMDUgUGF0cmljayBNY0hhcmR5LCA8a2FiZXJAdHJhc2gubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxuZXQveGZybS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9wb2xpY3kuaD4KKworTU9EVUxFX0FVVEhPUigiUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklQdGFibGVzIElQc2VjIHBvbGljeSBtYXRjaGluZyBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCitzdGF0aWMgaW5saW5lIGludAorbWF0Y2hfeGZybV9zdGF0ZShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgY29uc3Qgc3RydWN0IGlwNnRfcG9saWN5X2VsZW0gKmUpCit7CisjZGVmaW5lIE1BVENIX0FERFIoeCx5LHopCSghZS0+bWF0Y2gueCB8fCBcCisJCQkJICgoaXA2X21hc2tlZF9hZGRyY21wKCh6KSwgJmUtPngsICZlLT55KSkgPT0gMCkgXiBlLT5pbnZlcnQueCkKKyNkZWZpbmUgTUFUQ0goeCx5KQkJKCFlLT5tYXRjaC54IHx8ICgoZS0+eCA9PSAoeSkpIF4gZS0+aW52ZXJ0LngpKQorCQorCXJldHVybiBNQVRDSF9BRERSKHNhZGRyLCBzbWFzaywgKHN0cnVjdCBpbjZfYWRkciAqKSZ4LT5wcm9wcy5zYWRkci5hNikgJiYKKwkgICAgICAgTUFUQ0hfQUREUihkYWRkciwgZG1hc2ssIChzdHJ1Y3QgaW42X2FkZHIgKikmeC0+aWQuZGFkZHIuYTYpICYmCisJICAgICAgIE1BVENIKHByb3RvLCB4LT5pZC5wcm90bykgJiYKKwkgICAgICAgTUFUQ0gobW9kZSwgeC0+cHJvcHMubW9kZSkgJiYKKwkgICAgICAgTUFUQ0goc3BpLCB4LT5pZC5zcGkpICYmCisJICAgICAgIE1BVENIKHJlcWlkLCB4LT5wcm9wcy5yZXFpZCk7Cit9CisKK3N0YXRpYyBpbnQKK21hdGNoX3BvbGljeV9pbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgaXA2dF9wb2xpY3lfaW5mbyAqaW5mbykKK3sKKwljb25zdCBzdHJ1Y3QgaXA2dF9wb2xpY3lfZWxlbSAqZTsKKwlzdHJ1Y3Qgc2VjX3BhdGggKnNwID0gc2tiLT5zcDsKKwlpbnQgc3RyaWN0ID0gaW5mby0+ZmxhZ3MgJiBJUDZUX1BPTElDWV9NQVRDSF9TVFJJQ1Q7CisJaW50IGksIHBvczsKKworCWlmIChzcCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJaWYgKHN0cmljdCAmJiBpbmZvLT5sZW4gIT0gc3AtPmxlbikKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSBzcC0+bGVuIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJcG9zID0gc3RyaWN0ID8gaSAtIHNwLT5sZW4gKyAxIDogMDsKKwkJaWYgKHBvcyA+PSBpbmZvLT5sZW4pCisJCQlyZXR1cm4gMDsKKwkJZSA9ICZpbmZvLT5wb2xbcG9zXTsKKworCQlpZiAobWF0Y2hfeGZybV9zdGF0ZShzcC0+eFtpXS54dmVjLCBlKSkgeworCQkJaWYgKCFzdHJpY3QpCisJCQkJcmV0dXJuIDE7CisJCX0gZWxzZSBpZiAoc3RyaWN0KQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHN0cmljdCA/IDEgOiAwOworfQorCitzdGF0aWMgaW50CittYXRjaF9wb2xpY3lfb3V0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBpcDZ0X3BvbGljeV9pbmZvICppbmZvKQoreworCWNvbnN0IHN0cnVjdCBpcDZ0X3BvbGljeV9lbGVtICplOworCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYi0+ZHN0OworCWludCBzdHJpY3QgPSBpbmZvLT5mbGFncyAmIElQNlRfUE9MSUNZX01BVENIX1NUUklDVDsKKwlpbnQgaSwgcG9zOworCisJaWYgKGRzdC0+eGZybSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlmb3IgKGkgPSAwOyBkc3QgJiYgZHN0LT54ZnJtOyBkc3QgPSBkc3QtPmNoaWxkLCBpKyspIHsKKwkJcG9zID0gc3RyaWN0ID8gaSA6IDA7CisJCWlmIChwb3MgPj0gaW5mby0+bGVuKQorCQkJcmV0dXJuIDA7CisJCWUgPSAmaW5mby0+cG9sW3Bvc107CisKKwkJaWYgKG1hdGNoX3hmcm1fc3RhdGUoZHN0LT54ZnJtLCBlKSkgeworCQkJaWYgKCFzdHJpY3QpCisJCQkJcmV0dXJuIDE7CisJCX0gZWxzZSBpZiAoc3RyaWN0KQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHN0cmljdCA/IDEgOiAwOworfQorCitzdGF0aWMgaW50IG1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorCQkgaW50IG9mZnNldCwKKwkJIHVuc2lnbmVkIGludCBwcm90b2ZmLAorCQkgaW50ICpob3Rkcm9wKQoreworCWNvbnN0IHN0cnVjdCBpcDZ0X3BvbGljeV9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWludCByZXQ7CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBJUDZUX1BPTElDWV9NQVRDSF9JTikKKwkJcmV0ID0gbWF0Y2hfcG9saWN5X2luKHNrYiwgaW5mbyk7CisJZWxzZQorCQlyZXQgPSBtYXRjaF9wb2xpY3lfb3V0KHNrYiwgaW5mbyk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0ID0gaW5mby0+ZmxhZ3MgJiBJUDZUX1BPTElDWV9NQVRDSF9OT05FID8gMSA6IDA7CisJZWxzZSBpZiAoaW5mby0+ZmxhZ3MgJiBJUDZUX1BPTElDWV9NQVRDSF9OT05FKQorCQlyZXQgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqaXBfdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICptYXRjaGluZm8sIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlzdHJ1Y3QgaXA2dF9wb2xpY3lfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKworCWlmIChtYXRjaHNpemUgIT0gSVA2VF9BTElHTihzaXplb2YoKmluZm8pKSkgeworCQlwcmludGsoS0VSTl9FUlIgImlwNnRfcG9saWN5OiBtYXRjaHNpemUgJXUgIT0gJXp1XG4iLAorCQkgICAgICAgbWF0Y2hzaXplLCBJUDZUX0FMSUdOKHNpemVvZigqaW5mbykpKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghKGluZm8tPmZsYWdzICYgKElQNlRfUE9MSUNZX01BVENIX0lOfElQNlRfUE9MSUNZX01BVENIX09VVCkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXA2dF9wb2xpY3k6IG5laXRoZXIgaW5jb21pbmcgbm9yICIKKwkJICAgICAgICAgICAgICAgICJvdXRnb2luZyBwb2xpY3kgc2VsZWN0ZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGhvb2tfbWFzayAmICgxIDw8IE5GX0lQNl9QUkVfUk9VVElORyB8IDEgPDwgTkZfSVA2X0xPQ0FMX0lOKQorCSAgICAmJiBpbmZvLT5mbGFncyAmIElQNlRfUE9MSUNZX01BVENIX09VVCkgeworCQlwcmludGsoS0VSTl9FUlIgImlwNnRfcG9saWN5OiBvdXRwdXQgcG9saWN5IG5vdCB2YWxpZCBpbiAiCisJCSAgICAgICAgICAgICAgICAiUFJFX1JPVVRJTkcgYW5kIElOUFVUXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChob29rX21hc2sgJiAoMSA8PCBORl9JUDZfUE9TVF9ST1VUSU5HIHwgMSA8PCBORl9JUDZfTE9DQUxfT1VUKQorCSAgICAmJiBpbmZvLT5mbGFncyAmIElQNlRfUE9MSUNZX01BVENIX0lOKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXA2dF9wb2xpY3k6IGlucHV0IHBvbGljeSBub3QgdmFsaWQgaW4gIgorCQkgICAgICAgICAgICAgICAgIlBPU1RfUk9VVElORyBhbmQgT1VUUFVUXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChpbmZvLT5sZW4gPiBJUDZUX1BPTElDWV9NQVhfRUxFTSkgeworCQlwcmludGsoS0VSTl9FUlIgImlwNnRfcG9saWN5OiB0b28gbWFueSBwb2xpY3kgZWxlbWVudHNcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcDZ0X21hdGNoIHBvbGljeV9tYXRjaCA9IHsKKwkubmFtZQkJPSAicG9saWN5IiwKKwkubWF0Y2gJCT0gbWF0Y2gsCisJLmNoZWNrZW50cnkgCT0gY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJnBvbGljeV9tYXRjaCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaXA2dF91bnJlZ2lzdGVyX21hdGNoKCZwb2xpY3lfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfcnQuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X3J0LmMKaW5kZXggYzFlNzcwZS4uOGY4MjQ3NiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfcnQuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ydC5jCkBAIC0zMywxMiArMzMsMTIgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBzZWdzbGVmdF9tYXRjaCh1X2ludDMyX3QgbWluLCB1X2ludDMyX3QgbWF4LCB1X2ludDMyX3QgaWQsIGludCBpbnZlcnQpCiB7Ci0gICAgICAgaW50IHI9MDsKLSAgICAgICBERUJVR1AoInJ0IHNlZ3NsZWZ0X21hdGNoOiVjIDB4JXggPD0gMHgleCA8PSAweCV4IixpbnZlcnQ/ICchJzonICcsCi0gICAgICAgICAgICAgIG1pbixpZCxtYXgpOwotICAgICAgIHI9KGlkID49IG1pbiAmJiBpZCA8PSBtYXgpIF4gaW52ZXJ0OwotICAgICAgIERFQlVHUCgiIHJlc3VsdCAlc1xuIixyPyAiUEFTUyIgOiAiRkFJTEVEIik7Ci0gICAgICAgcmV0dXJuIHI7CisJaW50IHIgPSAwOworCURFQlVHUCgicnQgc2Vnc2xlZnRfbWF0Y2g6JWMgMHgleCA8PSAweCV4IDw9IDB4JXgiLAorCSAgICAgICBpbnZlcnQgPyAnIScgOiAnICcsIG1pbiwgaWQsIG1heCk7CisJciA9IChpZCA+PSBtaW4gJiYgaWQgPD0gbWF4KSBeIGludmVydDsKKwlERUJVR1AoIiByZXN1bHQgJXNcbiIsIHIgPyAiUEFTUyIgOiAiRkFJTEVEIik7CisJcmV0dXJuIHI7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTUwLDg3ICs1MCw5MyBAQAogICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCiAgICAgICBpbnQgKmhvdGRyb3ApCiB7Ci0gICAgICAgc3RydWN0IGlwdjZfcnRfaGRyIF9yb3V0ZSwgKnJoOwotICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X3J0ICpydGluZm8gPSBtYXRjaGluZm87Ci0gICAgICAgdW5zaWduZWQgaW50IHRlbXA7Ci0gICAgICAgdW5zaWduZWQgaW50IHB0cjsKLSAgICAgICB1bnNpZ25lZCBpbnQgaGRybGVuID0gMDsKLSAgICAgICB1bnNpZ25lZCBpbnQgcmV0ID0gMDsKLSAgICAgICBzdHJ1Y3QgaW42X2FkZHIgKmFwLCBfYWRkcjsKKwlzdHJ1Y3QgaXB2Nl9ydF9oZHIgX3JvdXRlLCAqcmg7CisJY29uc3Qgc3RydWN0IGlwNnRfcnQgKnJ0aW5mbyA9IG1hdGNoaW5mbzsKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKwl1bnNpZ25lZCBpbnQgcHRyOworCXVuc2lnbmVkIGludCBoZHJsZW4gPSAwOworCXVuc2lnbmVkIGludCByZXQgPSAwOworCXN0cnVjdCBpbjZfYWRkciAqYXAsIF9hZGRyOwogCiAJaWYgKGlwdjZfZmluZF9oZHIoc2tiLCAmcHRyLCBORVhUSERSX1JPVVRJTkcsIE5VTEwpIDwgMCkKIAkJcmV0dXJuIDA7CiAKLSAgICAgICByaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHB0ciwgc2l6ZW9mKF9yb3V0ZSksICZfcm91dGUpOwotICAgICAgIGlmIChyaCA9PSBOVUxMKXsKLQkgICAgICAgKmhvdGRyb3AgPSAxOwotICAgICAgIAkJcmV0dXJuIDA7Ci0gICAgICAgfQorCXJoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHRyLCBzaXplb2YoX3JvdXRlKSwgJl9yb3V0ZSk7CisJaWYgKHJoID09IE5VTEwpIHsKKwkJKmhvdGRyb3AgPSAxOworCQlyZXR1cm4gMDsKKwl9CiAKLSAgICAgICBoZHJsZW4gPSBpcHY2X29wdGxlbihyaCk7Ci0gICAgICAgaWYgKHNrYi0+bGVuIC0gcHRyIDwgaGRybGVuKXsKLQkgICAgICAgLyogUGNrZXQgc21hbGxlciB0aGFuIGl0cyBsZW5ndGggZmllbGQgKi8KLSAgICAgICAJCXJldHVybiAwOwotICAgICAgIH0KKwloZHJsZW4gPSBpcHY2X29wdGxlbihyaCk7CisJaWYgKHNrYi0+bGVuIC0gcHRyIDwgaGRybGVuKSB7CisJCS8qIFBja2V0IHNtYWxsZXIgdGhhbiBpdHMgbGVuZ3RoIGZpZWxkICovCisJCXJldHVybiAwOworCX0KIAotICAgICAgIERFQlVHUCgiSVB2NiBSVCBMRU4gJXUgJXUgIiwgaGRybGVuLCByaC0+aGRybGVuKTsKLSAgICAgICBERUJVR1AoIlRZUEUgJTA0WCAiLCByaC0+dHlwZSk7Ci0gICAgICAgREVCVUdQKCJTR1NfTEVGVCAldSAlMDJYXG4iLCByaC0+c2VnbWVudHNfbGVmdCwgcmgtPnNlZ21lbnRzX2xlZnQpOworCURFQlVHUCgiSVB2NiBSVCBMRU4gJXUgJXUgIiwgaGRybGVuLCByaC0+aGRybGVuKTsKKwlERUJVR1AoIlRZUEUgJTA0WCAiLCByaC0+dHlwZSk7CisJREVCVUdQKCJTR1NfTEVGVCAldSAlMDJYXG4iLCByaC0+c2VnbWVudHNfbGVmdCwgcmgtPnNlZ21lbnRzX2xlZnQpOwogCi0gICAgICAgREVCVUdQKCJJUHY2IFJUIHNlZ3NsZWZ0ICUwMlggIiwKLSAgICAgICAJCShzZWdzbGVmdF9tYXRjaChydGluZm8tPnNlZ3NsZWZ0WzBdLCBydGluZm8tPnNlZ3NsZWZ0WzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmgtPnNlZ21lbnRzX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAhIShydGluZm8tPmludmZsYWdzICYgSVA2VF9SVF9JTlZfU0dTKSkpKTsKLSAgICAgICBERUJVR1AoInR5cGUgJTAyWCAlMDJYICUwMlggIiwKLSAgICAgICAJCXJ0aW5mby0+cnRfdHlwZSwgcmgtPnR5cGUsIAotICAgICAgIAkJKCEocnRpbmZvLT5mbGFncyAmIElQNlRfUlRfVFlQKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChydGluZm8tPnJ0X3R5cGUgPT0gcmgtPnR5cGUpIF4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICEhKHJ0aW5mby0+aW52ZmxhZ3MgJiBJUDZUX1JUX0lOVl9UWVApKSkpOwotICAgICAgIERFQlVHUCgibGVuICUwMlggJTA0WCAlMDJYICIsCi0gICAgICAgCQlydGluZm8tPmhkcmxlbiwgaGRybGVuLAotICAgICAgIAkJKCEocnRpbmZvLT5mbGFncyAmIElQNlRfUlRfTEVOKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChydGluZm8tPmhkcmxlbiA9PSBoZHJsZW4pIF4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICEhKHJ0aW5mby0+aW52ZmxhZ3MgJiBJUDZUX1JUX0lOVl9MRU4pKSkpOwotICAgICAgIERFQlVHUCgicmVzICUwMlggJTAyWCAlMDJYICIsIAotICAgICAgIAkJKHJ0aW5mby0+ZmxhZ3MgJiBJUDZUX1JUX1JFUyksICgoc3RydWN0IHJ0MF9oZHIgKilyaCktPnJlc2VydmVkLAotICAgICAgIAkJISgocnRpbmZvLT5mbGFncyAmIElQNlRfUlRfUkVTKSAmJiAoKChzdHJ1Y3QgcnQwX2hkciAqKXJoKS0+cmVzZXJ2ZWQpKSk7CisJREVCVUdQKCJJUHY2IFJUIHNlZ3NsZWZ0ICUwMlggIiwKKwkgICAgICAgKHNlZ3NsZWZ0X21hdGNoKHJ0aW5mby0+c2Vnc2xlZnRbMF0sIHJ0aW5mby0+c2Vnc2xlZnRbMV0sCisJCQkgICAgICAgcmgtPnNlZ21lbnRzX2xlZnQsCisJCQkgICAgICAgISEocnRpbmZvLT5pbnZmbGFncyAmIElQNlRfUlRfSU5WX1NHUykpKSk7CisJREVCVUdQKCJ0eXBlICUwMlggJTAyWCAlMDJYICIsCisJICAgICAgIHJ0aW5mby0+cnRfdHlwZSwgcmgtPnR5cGUsCisJICAgICAgICghKHJ0aW5mby0+ZmxhZ3MgJiBJUDZUX1JUX1RZUCkgfHwKKwkJKChydGluZm8tPnJ0X3R5cGUgPT0gcmgtPnR5cGUpIF4KKwkJICEhKHJ0aW5mby0+aW52ZmxhZ3MgJiBJUDZUX1JUX0lOVl9UWVApKSkpOworCURFQlVHUCgibGVuICUwMlggJTA0WCAlMDJYICIsCisJICAgICAgIHJ0aW5mby0+aGRybGVuLCBoZHJsZW4sCisJICAgICAgICghKHJ0aW5mby0+ZmxhZ3MgJiBJUDZUX1JUX0xFTikgfHwKKwkJKChydGluZm8tPmhkcmxlbiA9PSBoZHJsZW4pIF4KKwkJICEhKHJ0aW5mby0+aW52ZmxhZ3MgJiBJUDZUX1JUX0lOVl9MRU4pKSkpOworCURFQlVHUCgicmVzICUwMlggJTAyWCAlMDJYICIsCisJICAgICAgIChydGluZm8tPmZsYWdzICYgSVA2VF9SVF9SRVMpLAorCSAgICAgICAoKHN0cnVjdCBydDBfaGRyICopcmgpLT5yZXNlcnZlZCwKKwkgICAgICAgISgocnRpbmZvLT5mbGFncyAmIElQNlRfUlRfUkVTKSAmJgorCQkgKCgoc3RydWN0IHJ0MF9oZHIgKilyaCktPnJlc2VydmVkKSkpOwogCi0gICAgICAgcmV0ID0gKHJoICE9IE5VTEwpCi0gICAgICAgCQkmJgotICAgICAgIAkJKHNlZ3NsZWZ0X21hdGNoKHJ0aW5mby0+c2Vnc2xlZnRbMF0sIHJ0aW5mby0+c2Vnc2xlZnRbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByaC0+c2VnbWVudHNfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICEhKHJ0aW5mby0+aW52ZmxhZ3MgJiBJUDZUX1JUX0lOVl9TR1MpKSkKLQkJJiYKLQkgICAgICAJKCEocnRpbmZvLT5mbGFncyAmIElQNlRfUlRfTEVOKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChydGluZm8tPmhkcmxlbiA9PSBoZHJsZW4pIF4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICEhKHJ0aW5mby0+aW52ZmxhZ3MgJiBJUDZUX1JUX0lOVl9MRU4pKSkKLQkJJiYKLSAgICAgICAJCSghKHJ0aW5mby0+ZmxhZ3MgJiBJUDZUX1JUX1RZUCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgocnRpbmZvLT5ydF90eXBlID09IHJoLT50eXBlKSBeCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAhIShydGluZm8tPmludmZsYWdzICYgSVA2VF9SVF9JTlZfVFlQKSkpOworCXJldCA9IChyaCAhPSBOVUxMKQorCSAgICAgICYmCisJICAgICAgKHNlZ3NsZWZ0X21hdGNoKHJ0aW5mby0+c2Vnc2xlZnRbMF0sIHJ0aW5mby0+c2Vnc2xlZnRbMV0sCisJCQkgICAgICByaC0+c2VnbWVudHNfbGVmdCwKKwkJCSAgICAgICEhKHJ0aW5mby0+aW52ZmxhZ3MgJiBJUDZUX1JUX0lOVl9TR1MpKSkKKwkgICAgICAmJgorCSAgICAgICghKHJ0aW5mby0+ZmxhZ3MgJiBJUDZUX1JUX0xFTikgfHwKKwkgICAgICAgKChydGluZm8tPmhkcmxlbiA9PSBoZHJsZW4pIF4KKwkJISEocnRpbmZvLT5pbnZmbGFncyAmIElQNlRfUlRfSU5WX0xFTikpKQorCSAgICAgICYmCisJICAgICAgKCEocnRpbmZvLT5mbGFncyAmIElQNlRfUlRfVFlQKSB8fAorCSAgICAgICAoKHJ0aW5mby0+cnRfdHlwZSA9PSByaC0+dHlwZSkgXgorCQkhIShydGluZm8tPmludmZsYWdzICYgSVA2VF9SVF9JTlZfVFlQKSkpOwogCiAJaWYgKHJldCAmJiAocnRpbmZvLT5mbGFncyAmIElQNlRfUlRfUkVTKSkgewogCQl1X2ludDMyX3QgKnJwLCBfcmVzZXJ2ZWQ7CiAJCXJwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwKLQkJCQkJcHRyICsgb2Zmc2V0b2Yoc3RydWN0IHJ0MF9oZHIsIHJlc2VydmVkKSwKLQkJCQkJc2l6ZW9mKF9yZXNlcnZlZCksICZfcmVzZXJ2ZWQpOworCQkJCQlwdHIgKyBvZmZzZXRvZihzdHJ1Y3QgcnQwX2hkciwKKwkJCQkJCSAgICAgICByZXNlcnZlZCksCisJCQkJCXNpemVvZihfcmVzZXJ2ZWQpLAorCQkJCQkmX3Jlc2VydmVkKTsKIAogCQlyZXQgPSAoKnJwID09IDApOwogCX0KIAotCURFQlVHUCgiIyVkICIscnRpbmZvLT5hZGRybnIpOwotICAgICAgIGlmICggIShydGluZm8tPmZsYWdzICYgSVA2VF9SVF9GU1QpICl7Ci0JICAgICAgIHJldHVybiByZXQ7CisJREVCVUdQKCIjJWQgIiwgcnRpbmZvLT5hZGRybnIpOworCWlmICghKHJ0aW5mby0+ZmxhZ3MgJiBJUDZUX1JUX0ZTVCkpIHsKKwkJcmV0dXJuIHJldDsKIAl9IGVsc2UgaWYgKHJ0aW5mby0+ZmxhZ3MgJiBJUDZUX1JUX0ZTVF9OU1RSSUNUKSB7CiAJCURFQlVHUCgiTm90IHN0cmljdCAiKTsKLQkJaWYgKCBydGluZm8tPmFkZHJuciA+ICh1bnNpZ25lZCBpbnQpKChoZHJsZW4tOCkvMTYpICl7CisJCWlmIChydGluZm8tPmFkZHJuciA+ICh1bnNpZ25lZCBpbnQpKChoZHJsZW4gLSA4KSAvIDE2KSkgewogCQkJREVCVUdQKCJUaGVyZSBpc24ndCBlbm91Z2ggc3BhY2VcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0gZWxzZSB7CiAJCQl1bnNpZ25lZCBpbnQgaSA9IDA7CiAKLQkJCURFQlVHUCgiIyVkICIscnRpbmZvLT5hZGRybnIpOwotCQkJZm9yKHRlbXA9MDsgdGVtcDwodW5zaWduZWQgaW50KSgoaGRybGVuLTgpLzE2KTsgdGVtcCsrKXsKKwkJCURFQlVHUCgiIyVkICIsIHJ0aW5mby0+YWRkcm5yKTsKKwkJCWZvciAodGVtcCA9IDA7CisJCQkgICAgIHRlbXAgPCAodW5zaWduZWQgaW50KSgoaGRybGVuIC0gOCkgLyAxNik7CisJCQkgICAgIHRlbXArKykgewogCQkJCWFwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwKIAkJCQkJCQlwdHIKIAkJCQkJCQkrIHNpemVvZihzdHJ1Y3QgcnQwX2hkcikKQEAgLTE0MSwyNCArMTQ3LDI2IEBACiAJCQkJQlVHX09OKGFwID09IE5VTEwpOwogCiAJCQkJaWYgKGlwdjZfYWRkcl9lcXVhbChhcCwgJnJ0aW5mby0+YWRkcnNbaV0pKSB7Ci0JCQkJCURFQlVHUCgiaT0lZCB0ZW1wPSVkO1xuIixpLHRlbXApOworCQkJCQlERUJVR1AoImk9JWQgdGVtcD0lZDtcbiIsIGksIHRlbXApOwogCQkJCQlpKys7CiAJCQkJfQotCQkJCWlmIChpPT1ydGluZm8tPmFkZHJucikgYnJlYWs7CisJCQkJaWYgKGkgPT0gcnRpbmZvLT5hZGRybnIpCisJCQkJCWJyZWFrOwogCQkJfQogCQkJREVCVUdQKCJpPSVkICMlZFxuIiwgaSwgcnRpbmZvLT5hZGRybnIpOwogCQkJaWYgKGkgPT0gcnRpbmZvLT5hZGRybnIpCiAJCQkJcmV0dXJuIHJldDsKLQkJCWVsc2UgcmV0dXJuIDA7CisJCQllbHNlCisJCQkJcmV0dXJuIDA7CiAJCX0KIAl9IGVsc2UgewogCQlERUJVR1AoIlN0cmljdCAiKTsKLQkJaWYgKCBydGluZm8tPmFkZHJuciA+ICh1bnNpZ25lZCBpbnQpKChoZHJsZW4tOCkvMTYpICl7CisJCWlmIChydGluZm8tPmFkZHJuciA+ICh1bnNpZ25lZCBpbnQpKChoZHJsZW4gLSA4KSAvIDE2KSkgewogCQkJREVCVUdQKCJUaGVyZSBpc24ndCBlbm91Z2ggc3BhY2VcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0gZWxzZSB7Ci0JCQlERUJVR1AoIiMlZCAiLHJ0aW5mby0+YWRkcm5yKTsKLQkJCWZvcih0ZW1wPTA7IHRlbXA8cnRpbmZvLT5hZGRybnI7IHRlbXArKyl7CisJCQlERUJVR1AoIiMlZCAiLCBydGluZm8tPmFkZHJucik7CisJCQlmb3IgKHRlbXAgPSAwOyB0ZW1wIDwgcnRpbmZvLT5hZGRybnI7IHRlbXArKykgewogCQkJCWFwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwKIAkJCQkJCQlwdHIKIAkJCQkJCQkrIHNpemVvZihzdHJ1Y3QgcnQwX2hkcikKQEAgLTE3MSw5ICsxNzksMTEgQEAKIAkJCQkJYnJlYWs7CiAJCQl9CiAJCQlERUJVR1AoInRlbXA9JWQgIyVkXG4iLCB0ZW1wLCBydGluZm8tPmFkZHJucik7Ci0JCQlpZiAoKHRlbXAgPT0gcnRpbmZvLT5hZGRybnIpICYmICh0ZW1wID09ICh1bnNpZ25lZCBpbnQpKChoZHJsZW4tOCkvMTYpKSkKKwkJCWlmICgodGVtcCA9PSBydGluZm8tPmFkZHJucikgJiYKKwkJCSAgICAodGVtcCA9PSAodW5zaWduZWQgaW50KSgoaGRybGVuIC0gOCkgLyAxNikpKQogCQkJCXJldHVybiByZXQ7Ci0JCQllbHNlIHJldHVybiAwOworCQkJZWxzZQorCQkJCXJldHVybiAwOwogCQl9CiAJfQogCkBAIC0xODMsMzIgKzE5MywzMSBAQAogLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0gICAgICAgICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKLSAgICAgICAgICB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCi0gICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKKwkgICBjb25zdCB2b2lkICplbnRyeSwKKwkgICB2b2lkICptYXRjaGluZm8sCisJICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCisJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKLSAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9ydCAqcnRpbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCBpcDZ0X3J0ICpydGluZm8gPSBtYXRjaGluZm87CiAKLSAgICAgICBpZiAobWF0Y2hpbmZvc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9ydCkpKSB7Ci0gICAgICAgICAgICAgIERFQlVHUCgiaXA2dF9ydDogbWF0Y2hzaXplICV1ICE9ICV1XG4iLAotICAgICAgICAgICAgICAgICAgICAgIG1hdGNoaW5mb3NpemUsIElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X3J0KSkpOwotICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICB9Ci0gICAgICAgaWYgKHJ0aW5mby0+aW52ZmxhZ3MgJiB+SVA2VF9SVF9JTlZfTUFTSykgewotICAgICAgICAgICAgICBERUJVR1AoImlwNnRfcnQ6IHVua25vd24gZmxhZ3MgJVhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgcnRpbmZvLT5pbnZmbGFncyk7Ci0gICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgIH0KLSAgICAgICBpZiAoIChydGluZm8tPmZsYWdzICYgKElQNlRfUlRfUkVTfElQNlRfUlRfRlNUX01BU0spKSAmJiAKLQkJICAgICAgICghKHJ0aW5mby0+ZmxhZ3MgJiBJUDZUX1JUX1RZUCkgfHwgCi0JCSAgICAgICAocnRpbmZvLT5ydF90eXBlICE9IDApIHx8IAotCQkgICAgICAgKHJ0aW5mby0+aW52ZmxhZ3MgJiBJUDZUX1JUX0lOVl9UWVApKSApIHsKLQkgICAgICBERUJVR1AoImAtLXJ0LXR5cGUgMCcgcmVxdWlyZWQgYmVmb3JlIGAtLXJ0LTAtKiciKTsKLSAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgfQorCWlmIChtYXRjaGluZm9zaXplICE9IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X3J0KSkpIHsKKwkJREVCVUdQKCJpcDZ0X3J0OiBtYXRjaHNpemUgJXUgIT0gJXVcbiIsCisJCSAgICAgICBtYXRjaGluZm9zaXplLCBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9ydCkpKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChydGluZm8tPmludmZsYWdzICYgfklQNlRfUlRfSU5WX01BU0spIHsKKwkJREVCVUdQKCJpcDZ0X3J0OiB1bmtub3duIGZsYWdzICVYXG4iLCBydGluZm8tPmludmZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICgocnRpbmZvLT5mbGFncyAmIChJUDZUX1JUX1JFUyB8IElQNlRfUlRfRlNUX01BU0spKSAmJgorCSAgICAoIShydGluZm8tPmZsYWdzICYgSVA2VF9SVF9UWVApIHx8CisJICAgICAocnRpbmZvLT5ydF90eXBlICE9IDApIHx8CisJICAgICAocnRpbmZvLT5pbnZmbGFncyAmIElQNlRfUlRfSU5WX1RZUCkpKSB7CisJCURFQlVHUCgiYC0tcnQtdHlwZSAwJyByZXF1aXJlZCBiZWZvcmUgYC0tcnQtMC0qJyIpOworCQlyZXR1cm4gMDsKKwl9CiAKLSAgICAgICByZXR1cm4gMTsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIHN0cnVjdCBpcDZ0X21hdGNoIHJ0X21hdGNoID0gewpAQCAtMjIwLDEyICsyMjksMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewotICAgICAgIHJldHVybiBpcDZ0X3JlZ2lzdGVyX21hdGNoKCZydF9tYXRjaCk7CisJcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJnJ0X21hdGNoKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXAodm9pZCkKIHsKLSAgICAgICBpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJnJ0X21hdGNoKTsKKwlpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJnJ0X21hdGNoKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfZmlsdGVyLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfZmlsdGVyLmMKaW5kZXggNGMwMDI4Ni4uY2U0YTk2OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX2ZpbHRlci5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9maWx0ZXIuYwpAQCAtOTcsNiArOTcsNyBAQAogCS52YWxpZF9ob29rcwk9IEZJTFRFUl9WQUxJRF9IT09LUywKIAkubG9jawkJPSBSV19MT0NLX1VOTE9DS0VELAogCS5tZQkJPSBUSElTX01PRFVMRSwKKwkuYWYJCT0gQUZfSU5FVDYsCiB9OwogCiAvKiBUaGUgd29yayBjb21lcyBpbiBoZXJlIGZyb20gbmV0ZmlsdGVyLmMuICovCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbWFuZ2xlLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbWFuZ2xlLmMKaW5kZXggODVjMWU2ZS4uMzBhNDYyNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX21hbmdsZS5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9tYW5nbGUuYwpAQCAtMTI3LDYgKzEyNyw3IEBACiAJLnZhbGlkX2hvb2tzCT0gTUFOR0xFX1ZBTElEX0hPT0tTLAogCS5sb2NrCQk9IFJXX0xPQ0tfVU5MT0NLRUQsCiAJLm1lCQk9IFRISVNfTU9EVUxFLAorCS5hZgkJPSBBRl9JTkVUNiwKIH07CiAKIC8qIFRoZSB3b3JrIGNvbWVzIGluIGhlcmUgZnJvbSBuZXRmaWx0ZXIuYy4gKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9yYXcuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9yYXcuYwppbmRleCBjMjk4MmVmLi5kYjI4YmEzIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfcmF3LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX3Jhdy5jCkBAIC0xMDYsMTEgKzEwNiwxMiBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXA2dF90YWJsZSBwYWNrZXRfcmF3ID0geyAKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFibGUgcGFja2V0X3JhdyA9IHsgCiAJLm5hbWUgPSAicmF3IiwgCiAJLnZhbGlkX2hvb2tzID0gUkFXX1ZBTElEX0hPT0tTLCAKIAkubG9jayA9IFJXX0xPQ0tfVU5MT0NLRUQsIAotCS5tZSA9IFRISVNfTU9EVUxFCisJLm1lID0gVEhJU19NT0RVTEUsCisJLmFmID0gQUZfSU5FVDYsCiB9OwogCiAvKiBUaGUgd29yayBjb21lcyBpbiBoZXJlIGZyb20gbmV0ZmlsdGVyLmMuICovCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYuYwppbmRleCA3MDRmYmJlLi5hYzcwMmEyIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY2LmMKQEAgLTc0LDcgKzc0LDcgQEAKIHN0YXRpYyBpbnQgaXB2Nl9wcmludF90dXBsZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCiAJCQkgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCiB7Ci0JcmV0dXJuIHNlcV9wcmludGYocywgInNyYz0leDoleDoleDoleDoleDoleDoleDoleCBkc3Q9JXg6JXg6JXg6JXg6JXg6JXg6JXg6JXggIiwKKwlyZXR1cm4gc2VxX3ByaW50ZihzLCAic3JjPSIgTklQNl9GTVQgIiBkc3Q9IiBOSVA2X0ZNVCAiICIsCiAJCQkgIE5JUDYoKigoc3RydWN0IGluNl9hZGRyICopdHVwbGUtPnNyYy51My5pcDYpKSwKIAkJCSAgTklQNigqKChzdHJ1Y3QgaW42X2FkZHIgKil0dXBsZS0+ZHN0LnUzLmlwNikpKTsKIH0KQEAgLTMzNSwxMCArMzM1LDEwIEBACiAjaWZkZWYgQ09ORklHX1NZU0NUTAogCiAvKiBGcm9tIG5mX2Nvbm50cmFja19wcm90b19pY21wdjYuYyAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbmZfY3RfaWNtcHY2X3RpbWVvdXQ7CitleHRlcm4gdW5zaWduZWQgaW50IG5mX2N0X2ljbXB2Nl90aW1lb3V0OwogCiAvKiBGcm9tIG5mX2Nvbm50cmFja19mcmFnNi5jICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBuZl9jdF9mcmFnNl90aW1lb3V0OworZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jdF9mcmFnNl90aW1lb3V0OwogZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jdF9mcmFnNl9sb3dfdGhyZXNoOwogZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jdF9mcmFnNl9oaWdoX3RocmVzaDsKIApAQCAtNTg0LDcgKzU4NCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKIHsKLQluZWVkX25mX2Nvbm50cmFjaygpOworCW5lZWRfY29ubnRyYWNrKCk7CiAJcmV0dXJuIGluaXRfb3JfY2xlYW51cCgxKTsKIH0KIApAQCAtNTk1LDkgKzU5NSwzIEBACiAKIG1vZHVsZV9pbml0KGluaXQpOwogbW9kdWxlX2V4aXQoZmluaSk7Ci0KLXZvaWQgbmVlZF9pcDZfY29ubnRyYWNrKHZvaWQpCi17Ci19Ci0KLUVYUE9SVF9TWU1CT0wobmVlZF9pcDZfY29ubnRyYWNrKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcmVhc20uYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcmVhc20uYwppbmRleCBmM2U1ZmZiLi44NGVmOWExIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3JlYXNtLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19yZWFzbS5jCkBAIC03MCw4ICs3MCw4IEBACiAKIHN0cnVjdCBuZl9jdF9mcmFnNl9xdWV1ZQogewotCXN0cnVjdCBuZl9jdF9mcmFnNl9xdWV1ZQkqbmV4dDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxydV9saXN0OwkJLyogbHJ1IGxpc3QgbWVtYmVyCSovCisJc3RydWN0IGhsaXN0X25vZGUJbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxydV9saXN0OwkvKiBscnUgbGlzdCBtZW1iZXIJKi8KIAogCV9fdTMyCQkJaWQ7CQkvKiBmcmFnbWVudCBpZAkJKi8KIAlzdHJ1Y3QgaW42X2FkZHIJCXNhZGRyOwpAQCAtOTAsMTQgKzkwLDEzIEBACiAjZGVmaW5lIEZJUlNUX0lOCQkyCiAjZGVmaW5lIExBU1RfSU4JCQkxCiAJX191MTYJCQluaG9mZnNldDsKLQlzdHJ1Y3QgbmZfY3RfZnJhZzZfcXVldWUJKipwcHJldjsKIH07CiAKIC8qIEhhc2ggdGFibGUuICovCiAKICNkZWZpbmUgRlJBRzZRX0hBU0hTWgk2NAogCi1zdGF0aWMgc3RydWN0IG5mX2N0X2ZyYWc2X3F1ZXVlICpuZl9jdF9mcmFnNl9oYXNoW0ZSQUc2UV9IQVNIU1pdOworc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIG5mX2N0X2ZyYWc2X2hhc2hbRlJBRzZRX0hBU0hTWl07CiBzdGF0aWMgREVGSU5FX1JXTE9DSyhuZl9jdF9mcmFnNl9sb2NrKTsKIHN0YXRpYyB1MzIgbmZfY3RfZnJhZzZfaGFzaF9ybmQ7CiBzdGF0aWMgTElTVF9IRUFEKG5mX2N0X2ZyYWc2X2xydV9saXN0KTsKQEAgLTEwNSw5ICsxMDQsNyBAQAogCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fZnFfdW5saW5rKHN0cnVjdCBuZl9jdF9mcmFnNl9xdWV1ZSAqZnEpCiB7Ci0JaWYgKGZxLT5uZXh0KQotCQlmcS0+bmV4dC0+cHByZXYgPSBmcS0+cHByZXY7Ci0JKmZxLT5wcHJldiA9IGZxLT5uZXh0OworCWhsaXN0X2RlbCgmZnEtPmxpc3QpOwogCWxpc3RfZGVsKCZmcS0+bHJ1X2xpc3QpOwogCW5mX2N0X2ZyYWc2X25xdWV1ZXMtLTsKIH0KQEAgLTE1OCwyOCArMTU1LDE4IEBACiAJZ2V0X3JhbmRvbV9ieXRlcygmbmZfY3RfZnJhZzZfaGFzaF9ybmQsIHNpemVvZih1MzIpKTsKIAlmb3IgKGkgPSAwOyBpIDwgRlJBRzZRX0hBU0hTWjsgaSsrKSB7CiAJCXN0cnVjdCBuZl9jdF9mcmFnNl9xdWV1ZSAqcTsKKwkJc3RydWN0IGhsaXN0X25vZGUgKnAsICpuOwogCi0JCXEgPSBuZl9jdF9mcmFnNl9oYXNoW2ldOwotCQl3aGlsZSAocSkgewotCQkJc3RydWN0IG5mX2N0X2ZyYWc2X3F1ZXVlICpuZXh0ID0gcS0+bmV4dDsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShxLCBwLCBuLCAmbmZfY3RfZnJhZzZfaGFzaFtpXSwgbGlzdCkgewogCQkJdW5zaWduZWQgaW50IGh2YWwgPSBpcDZxaGFzaGZuKHEtPmlkLAogCQkJCQkJICAgICAgICZxLT5zYWRkciwKIAkJCQkJCSAgICAgICAmcS0+ZGFkZHIpOwotCiAJCQlpZiAoaHZhbCAhPSBpKSB7Ci0JCQkJLyogVW5saW5rLiAqLwotCQkJCWlmIChxLT5uZXh0KQotCQkJCQlxLT5uZXh0LT5wcHJldiA9IHEtPnBwcmV2OwotCQkJCSpxLT5wcHJldiA9IHEtPm5leHQ7Ci0KKwkJCQlobGlzdF9kZWwoJnEtPmxpc3QpOwogCQkJCS8qIFJlbGluayB0byBuZXcgaGFzaCBjaGFpbi4gKi8KLQkJCQlpZiAoKHEtPm5leHQgPSBuZl9jdF9mcmFnNl9oYXNoW2h2YWxdKSAhPSBOVUxMKQotCQkJCQlxLT5uZXh0LT5wcHJldiA9ICZxLT5uZXh0OwotCQkJCW5mX2N0X2ZyYWc2X2hhc2hbaHZhbF0gPSBxOwotCQkJCXEtPnBwcmV2ID0gJm5mX2N0X2ZyYWc2X2hhc2hbaHZhbF07CisJCQkJaGxpc3RfYWRkX2hlYWQoJnEtPmxpc3QsCisJCQkJCSAgICAgICAmbmZfY3RfZnJhZzZfaGFzaFtodmFsXSk7CiAJCQl9Ci0KLQkJCXEgPSBuZXh0OwogCQl9CiAJfQogCXdyaXRlX3VubG9jaygmbmZfY3RfZnJhZzZfbG9jayk7CkBAIC0zMTQsMTUgKzMwMSwxNyBAQAogCiAvKiBDcmVhdGlvbiBwcmltaXRpdmVzLiAqLwogCi0KIHN0YXRpYyBzdHJ1Y3QgbmZfY3RfZnJhZzZfcXVldWUgKm5mX2N0X2ZyYWc2X2ludGVybih1bnNpZ25lZCBpbnQgaGFzaCwKIAkJCQkJICBzdHJ1Y3QgbmZfY3RfZnJhZzZfcXVldWUgKmZxX2luKQogewogCXN0cnVjdCBuZl9jdF9mcmFnNl9xdWV1ZSAqZnE7CisjaWZkZWYgQ09ORklHX1NNUAorCXN0cnVjdCBobGlzdF9ub2RlICpuOworI2VuZGlmCiAKIAl3cml0ZV9sb2NrKCZuZl9jdF9mcmFnNl9sb2NrKTsKICNpZmRlZiBDT05GSUdfU01QCi0JZm9yIChmcSA9IG5mX2N0X2ZyYWc2X2hhc2hbaGFzaF07IGZxOyBmcSA9IGZxLT5uZXh0KSB7CisJaGxpc3RfZm9yX2VhY2hfZW50cnkoZnEsIG4sICZuZl9jdF9mcmFnNl9oYXNoW2hhc2hdLCBsaXN0KSB7CiAJCWlmIChmcS0+aWQgPT0gZnFfaW4tPmlkICYmIAogCQkgICAgIWlwdjZfYWRkcl9jbXAoJmZxX2luLT5zYWRkciwgJmZxLT5zYWRkcikgJiYKIAkJICAgICFpcHY2X2FkZHJfY21wKCZmcV9pbi0+ZGFkZHIsICZmcS0+ZGFkZHIpKSB7CkBAIC0zNDAsMTAgKzMyOSw3IEBACiAJCWF0b21pY19pbmMoJmZxLT5yZWZjbnQpOwogCiAJYXRvbWljX2luYygmZnEtPnJlZmNudCk7Ci0JaWYgKChmcS0+bmV4dCA9IG5mX2N0X2ZyYWc2X2hhc2hbaGFzaF0pICE9IE5VTEwpCi0JCWZxLT5uZXh0LT5wcHJldiA9ICZmcS0+bmV4dDsKLQluZl9jdF9mcmFnNl9oYXNoW2hhc2hdID0gZnE7Ci0JZnEtPnBwcmV2ID0gJm5mX2N0X2ZyYWc2X2hhc2hbaGFzaF07CisJaGxpc3RfYWRkX2hlYWQoJmZxLT5saXN0LCAmbmZfY3RfZnJhZzZfaGFzaFtoYXNoXSk7CiAJSU5JVF9MSVNUX0hFQUQoJmZxLT5scnVfbGlzdCk7CiAJbGlzdF9hZGRfdGFpbCgmZnEtPmxydV9saXN0LCAmbmZfY3RfZnJhZzZfbHJ1X2xpc3QpOwogCW5mX2N0X2ZyYWc2X25xdWV1ZXMrKzsKQEAgLTM4NCwxMCArMzcwLDExIEBACiBmcV9maW5kKHUzMiBpZCwgc3RydWN0IGluNl9hZGRyICpzcmMsIHN0cnVjdCBpbjZfYWRkciAqZHN0KQogewogCXN0cnVjdCBuZl9jdF9mcmFnNl9xdWV1ZSAqZnE7CisJc3RydWN0IGhsaXN0X25vZGUgKm47CiAJdW5zaWduZWQgaW50IGhhc2ggPSBpcDZxaGFzaGZuKGlkLCBzcmMsIGRzdCk7CiAKIAlyZWFkX2xvY2soJm5mX2N0X2ZyYWc2X2xvY2spOwotCWZvciAoZnEgPSBuZl9jdF9mcmFnNl9oYXNoW2hhc2hdOyBmcTsgZnEgPSBmcS0+bmV4dCkgeworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGZxLCBuLCAmbmZfY3RfZnJhZzZfaGFzaFtoYXNoXSwgbGlzdCkgewogCQlpZiAoZnEtPmlkID09IGlkICYmIAogCQkgICAgIWlwdjZfYWRkcl9jbXAoc3JjLCAmZnEtPnNhZGRyKSAmJgogCQkgICAgIWlwdjZfYWRkcl9jbXAoZHN0LCAmZnEtPmRhZGRyKSkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcmVhc3NlbWJseS5jIGIvbmV0L2lwdjYvcmVhc3NlbWJseS5jCmluZGV4IDVkMzE2Y2IuLjE1ZTE0NTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3JlYXNzZW1ibHkuYworKysgYi9uZXQvaXB2Ni9yZWFzc2VtYmx5LmMKQEAgLTU4MSw3ICs1ODEsNiBAQAogICoJdGhlIGxhc3QgYW5kIHRoZSBmaXJzdCBmcmFtZXMgYXJyaXZlZCBhbmQgYWxsIHRoZSBiaXRzIGFyZSBoZXJlLgogICovCiBzdGF0aWMgaW50IGlwNl9mcmFnX3JlYXNtKHN0cnVjdCBmcmFnX3F1ZXVlICpmcSwgc3RydWN0IHNrX2J1ZmYgKipza2JfaW4sCi0JCQkgIHVuc2lnbmVkIGludCAqbmhvZmZwLAogCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBza19idWZmICpmcCwgKmhlYWQgPSBmcS0+ZnJhZ21lbnRzOwpAQCAtNjU0LDYgKzY1Myw3IEBACiAJaGVhZC0+ZGV2ID0gZGV2OwogCXNrYl9zZXRfdGltZXN0YW1wKGhlYWQsICZmcS0+c3RhbXApOwogCWhlYWQtPm5oLmlwdjZoLT5wYXlsb2FkX2xlbiA9IGh0b25zKHBheWxvYWRfbGVuKTsKKwlJUDZDQihoZWFkKS0+bmhvZmYgPSBuaG9mZjsKIAogCSpza2JfaW4gPSBoZWFkOwogCkBAIC02NjMsNyArNjYzLDYgQEAKIAogCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfUkVBU01PS1MpOwogCWZxLT5mcmFnbWVudHMgPSBOVUxMOwotCSpuaG9mZnAgPSBuaG9mZjsKIAlyZXR1cm4gMTsKIAogb3V0X292ZXJzaXplOgpAQCAtNjc4LDcgKzY3Nyw3IEBACiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW50IGlwdjZfZnJhZ19yY3Yoc3RydWN0IHNrX2J1ZmYgKipza2JwLCB1bnNpZ25lZCBpbnQgKm5ob2ZmcCkKK3N0YXRpYyBpbnQgaXB2Nl9mcmFnX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqKnNrYnApCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpza2JwOyAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CkBAIC03MTAsNyArNzA5LDcgQEAKIAkJc2tiLT5oLnJhdyArPSBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKTsKIAkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9SRUFTTU9LUyk7CiAKLQkJKm5ob2ZmcCA9ICh1OCopZmhkciAtIHNrYi0+bmgucmF3OworCQlJUDZDQihza2IpLT5uaG9mZiA9ICh1OCopZmhkciAtIHNrYi0+bmgucmF3OwogCQlyZXR1cm4gMTsKIAl9CiAKQEAgLTcyMiwxMSArNzIxLDExIEBACiAKIAkJc3Bpbl9sb2NrKCZmcS0+bG9jayk7CiAKLQkJaXA2X2ZyYWdfcXVldWUoZnEsIHNrYiwgZmhkciwgKm5ob2ZmcCk7CisJCWlwNl9mcmFnX3F1ZXVlKGZxLCBza2IsIGZoZHIsIElQNkNCKHNrYiktPm5ob2ZmKTsKIAogCQlpZiAoZnEtPmxhc3RfaW4gPT0gKEZJUlNUX0lOfExBU1RfSU4pICYmCiAJCSAgICBmcS0+bWVhdCA9PSBmcS0+bGVuKQotCQkJcmV0ID0gaXA2X2ZyYWdfcmVhc20oZnEsIHNrYnAsIG5ob2ZmcCwgZGV2KTsKKwkJCXJldCA9IGlwNl9mcmFnX3JlYXNtKGZxLCBza2JwLCBkZXYpOwogCiAJCXNwaW5fdW5sb2NrKCZmcS0+bG9jayk7CiAJCWZxX3B1dChmcSwgTlVMTCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yb3V0ZS5jIGIvbmV0L2lwdjYvcm91dGUuYwppbmRleCA2NjE0MGYxLi5lMGQzYWQwIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yb3V0ZS5jCisrKyBiL25ldC9pcHY2L3JvdXRlLmMKQEAgLTI0LDYgKzI0LDcgQEAKICAqCQlyZWFjaGFibGUuICBvdGhlcndpc2UsIHJvdW5kLXJvYmluIHRoZSBsaXN0LgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvc2l0LmMgYi9uZXQvaXB2Ni9zaXQuYwppbmRleCA1NzdkNDk3Li5jMmQzZTE3IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9zaXQuYworKysgYi9uZXQvaXB2Ni9zaXQuYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KQEAgLTE4NCw3ICsxODUsNyBAQAogCWlmIChkZXYgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQludCA9IGRldi0+cHJpdjsKKwludCA9IG5ldGRldl9wcml2KGRldik7CiAJZGV2LT5pbml0ID0gaXBpcDZfdHVubmVsX2luaXQ7CiAJbnQtPnBhcm1zID0gKnBhcm1zOwogCkBAIC0yMTAsNyArMjExLDcgQEAKIAkJd3JpdGVfdW5sb2NrX2JoKCZpcGlwNl9sb2NrKTsKIAkJZGV2X3B1dChkZXYpOwogCX0gZWxzZSB7Ci0JCWlwaXA2X3R1bm5lbF91bmxpbmsoKHN0cnVjdCBpcF90dW5uZWwqKWRldi0+cHJpdik7CisJCWlwaXA2X3R1bm5lbF91bmxpbmsobmV0ZGV2X3ByaXYoZGV2KSk7CiAJCWRldl9wdXQoZGV2KTsKIAl9CiB9CkBAIC0zNDYsNyArMzQ3LDcgQEAKIAkJcnQ2aSA9IHJ0Nl9sb29rdXAoJmlwaDYtPmRhZGRyLCAmaXBoNi0+c2FkZHIsIE5VTEwsIDApOwogCiAJCWlmIChydDZpICYmIHJ0NmktPnJ0NmlfZGV2ICYmIHJ0NmktPnJ0NmlfZGV2LT50eXBlID09IEFSUEhSRF9TSVQpIHsKLQkJCXN0cnVjdCBpcF90dW5uZWwgKiB0ID0gKHN0cnVjdCBpcF90dW5uZWwqKXJ0NmktPnJ0NmlfZGV2LT5wcml2OworCQkJc3RydWN0IGlwX3R1bm5lbCAqdCA9IG5ldGRldl9wcml2KHJ0NmktPnJ0NmlfZGV2KTsKIAkJCWlmIChyZWxfdHlwZSA9PSBJQ01QVjZfVElNRV9FWENFRUQgJiYgdC0+cGFybXMuaXBoLnR0bCkgewogCQkJCXJlbF90eXBlID0gSUNNUFY2X0RFU1RfVU5SRUFDSDsKIAkJCQlyZWxfY29kZSA9IElDTVBWNl9BRERSX1VOUkVBQ0g7CkBAIC0zODEsNiArMzgyLDcgQEAKIAkJc2tiLT5tYWMucmF3ID0gc2tiLT5uaC5yYXc7CiAJCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOwogCQltZW1zZXQoJihJUENCKHNrYiktPm9wdCksIDAsIHNpemVvZihzdHJ1Y3QgaXBfb3B0aW9ucykpOworCQlJUENCKHNrYiktPmZsYWdzID0gMDsKIAkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQVjYpOwogCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CiAJCXR1bm5lbC0+c3RhdC5yeF9wYWNrZXRzKys7CkBAIC00MjMsNyArNDI1LDcgQEAKIAogc3RhdGljIGludCBpcGlwNl90dW5uZWxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbCA9IChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXY7CisJc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmdHVubmVsLT5zdGF0OwogCXN0cnVjdCBpcGhkciAgKnRpcGggPSAmdHVubmVsLT5wYXJtcy5pcGg7CiAJc3RydWN0IGlwdjZoZHIgKmlwaDYgPSBza2ItPm5oLmlwdjZoOwpAQCAtNTUyLDYgKzU1NCw3IEBACiAJc2tiLT5oLnJhdyA9IHNrYi0+bmgucmF3OwogCXNrYi0+bmgucmF3ID0gc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CiAJbWVtc2V0KCYoSVBDQihza2IpLT5vcHQpLCAwLCBzaXplb2YoSVBDQihza2IpLT5vcHQpKTsKKwlJUENCKHNrYiktPmZsYWdzID0gMDsKIAlkc3RfcmVsZWFzZShza2ItPmRzdCk7CiAJc2tiLT5kc3QgPSAmcnQtPnUuZHN0OwogCkBAIC02MDgsNyArNjExLDcgQEAKIAkJCXQgPSBpcGlwNl90dW5uZWxfbG9jYXRlKCZwLCAwKTsKIAkJfQogCQlpZiAodCA9PSBOVUxMKQotCQkJdCA9IChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXY7CisJCQl0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAkJbWVtY3B5KCZwLCAmdC0+cGFybXMsIHNpemVvZihwKSk7CiAJCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEsICZwLCBzaXplb2YocCkpKQogCQkJZXJyID0gLUVGQVVMVDsKQEAgLTY0NSw3ICs2NDgsNyBAQAogCQkJCQllcnIgPSAtRUlOVkFMOwogCQkJCQlicmVhazsKIAkJCQl9Ci0JCQkJdCA9IChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXY7CisJCQkJdCA9IG5ldGRldl9wcml2KGRldik7CiAJCQkJaXBpcDZfdHVubmVsX3VubGluayh0KTsKIAkJCQl0LT5wYXJtcy5pcGguc2FkZHIgPSBwLmlwaC5zYWRkcjsKIAkJCQl0LT5wYXJtcy5pcGguZGFkZHIgPSBwLmlwaC5kYWRkcjsKQEAgLTY4MSw3ICs2ODQsNyBAQAogCQkJaWYgKCh0ID0gaXBpcDZfdHVubmVsX2xvY2F0ZSgmcCwgMCkpID09IE5VTEwpCiAJCQkJZ290byBkb25lOwogCQkJZXJyID0gLUVQRVJNOwotCQkJaWYgKHQgPT0gaXBpcDZfZmJfdHVubmVsX2Rldi0+cHJpdikKKwkJCWlmICh0ID09IG5ldGRldl9wcml2KGlwaXA2X2ZiX3R1bm5lbF9kZXYpKQogCQkJCWdvdG8gZG9uZTsKIAkJCWRldiA9IHQtPmRldjsKIAkJfQpAQCAtNjk4LDcgKzcwMSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXBpcDZfdHVubmVsX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXJldHVybiAmKCgoc3RydWN0IGlwX3R1bm5lbCopZGV2LT5wcml2KS0+c3RhdCk7CisJcmV0dXJuICYoKChzdHJ1Y3QgaXBfdHVubmVsKiluZXRkZXZfcHJpdihkZXYpKS0+c3RhdCk7CiB9CiAKIHN0YXRpYyBpbnQgaXBpcDZfdHVubmVsX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCkBAIC03MzMsNyArNzM2LDcgQEAKIAlzdHJ1Y3QgaXBfdHVubmVsICp0dW5uZWw7CiAJc3RydWN0IGlwaGRyICppcGg7CiAKLQl0dW5uZWwgPSAoc3RydWN0IGlwX3R1bm5lbCopZGV2LT5wcml2OworCXR1bm5lbCA9IG5ldGRldl9wcml2KGRldik7CiAJaXBoID0gJnR1bm5lbC0+cGFybXMuaXBoOwogCiAJdHVubmVsLT5kZXYgPSBkZXY7CkBAIC03NzMsNyArNzc2LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgaXBpcDZfZmJfdHVubmVsX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgaXBfdHVubmVsICp0dW5uZWwgPSBkZXYtPnByaXY7CisJc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXBoZHIgKmlwaCA9ICZ0dW5uZWwtPnBhcm1zLmlwaDsKIAogCXR1bm5lbC0+ZGV2ID0gZGV2OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdGNwX2lwdjYuYyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKaW5kZXggMjk0N2JjNS4uNjZkMDQwMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdGNwX2lwdjYuYworKysgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCkBAIC02Nyw2ICs2Nyw5IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKKy8qIFNvY2tldCB1c2VkIGZvciBzZW5kaW5nIFJTVHMgYW5kIEFDS3MgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ja2V0ICp0Y3A2X3NvY2tldDsKKwogc3RhdGljIHZvaWQJdGNwX3Y2X3NlbmRfcmVzZXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBzdGF0aWMgdm9pZAl0Y3BfdjZfcmVxc2tfc2VuZF9hY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKTsKIHN0YXRpYyB2b2lkCXRjcF92Nl9zZW5kX2NoZWNrKHN0cnVjdCBzb2NrICpzaywgaW50IGxlbiwgCkBAIC02MTEsNyArNjE0LDcgQEAKIAlpZiAoIWlwNl9kc3RfbG9va3VwKE5VTEwsICZidWZmLT5kc3QsICZmbCkpIHsKIAogCQlpZiAoeGZybV9sb29rdXAoJmJ1ZmYtPmRzdCwgJmZsLCBOVUxMLCAwKSA+PSAwKSB7Ci0JCQlpcDZfeG1pdChOVUxMLCBidWZmLCAmZmwsIE5VTEwsIDApOworCQkJaXA2X3htaXQodGNwNl9zb2NrZXQtPnNrLCBidWZmLCAmZmwsIE5VTEwsIDApOwogCQkJVENQX0lOQ19TVEFUU19CSChUQ1BfTUlCX09VVFNFR1MpOwogCQkJVENQX0lOQ19TVEFUU19CSChUQ1BfTUlCX09VVFJTVFMpOwogCQkJcmV0dXJuOwpAQCAtNjc1LDcgKzY3OCw3IEBACiAKIAlpZiAoIWlwNl9kc3RfbG9va3VwKE5VTEwsICZidWZmLT5kc3QsICZmbCkpIHsKIAkJaWYgKHhmcm1fbG9va3VwKCZidWZmLT5kc3QsICZmbCwgTlVMTCwgMCkgPj0gMCkgewotCQkJaXA2X3htaXQoTlVMTCwgYnVmZiwgJmZsLCBOVUxMLCAwKTsKKwkJCWlwNl94bWl0KHRjcDZfc29ja2V0LT5zaywgYnVmZiwgJmZsLCBOVUxMLCAwKTsKIAkJCVRDUF9JTkNfU1RBVFNfQkgoVENQX01JQl9PVVRTRUdTKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtMTE1Myw3ICsxMTU2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0Y3BfdjZfcmN2KHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50ICpuaG9mZnApCitzdGF0aWMgaW50IHRjcF92Nl9yY3Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSAqcHNrYjsKIAlzdHJ1Y3QgdGNwaGRyICp0aDsJCkBAIC0xNjAwLDggKzE2MDMsMjEgQEAKIAogdm9pZCBfX2luaXQgdGNwdjZfaW5pdCh2b2lkKQogeworCWludCBlcnI7CisKIAkvKiByZWdpc3RlciBpbmV0NiBwcm90b2NvbCAqLwogCWlmIChpbmV0Nl9hZGRfcHJvdG9jb2woJnRjcHY2X3Byb3RvY29sLCBJUFBST1RPX1RDUCkgPCAwKQogCQlwcmludGsoS0VSTl9FUlIgInRjcHY2X2luaXQ6IENvdWxkIG5vdCByZWdpc3RlciBwcm90b2NvbFxuIik7CiAJaW5ldDZfcmVnaXN0ZXJfcHJvdG9zdygmdGNwdjZfcHJvdG9zdyk7CisKKwllcnIgPSBzb2NrX2NyZWF0ZV9rZXJuKFBGX0lORVQ2LCBTT0NLX1JBVywgSVBQUk9UT19UQ1AsICZ0Y3A2X3NvY2tldCk7CisJaWYgKGVyciA8IDApCisJCXBhbmljKCJGYWlsZWQgdG8gY3JlYXRlIHRoZSBUQ1B2NiBjb250cm9sIHNvY2tldC5cbiIpOworCXRjcDZfc29ja2V0LT5zay0+c2tfYWxsb2NhdGlvbiA9IEdGUF9BVE9NSUM7CisKKwkvKiBVbmhhc2ggaXQgc28gdGhhdCBJUCBpbnB1dCBwcm9jZXNzaW5nIGRvZXMgbm90IGV2ZW4KKwkgKiBzZWUgaXQsIHdlIGRvIG5vdCB3aXNoIHRoaXMgc29ja2V0IHRvIHNlZSBpbmNvbWluZworCSAqIHBhY2tldHMuCisJICovCisJdGNwNl9zb2NrZXQtPnNrLT5za19wcm90LT51bmhhc2godGNwNl9zb2NrZXQtPnNrKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L3VkcC5jIGIvbmV0L2lwdjYvdWRwLmMKaW5kZXggZDg1MzhkYy4uYzQ3NjQ4OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdWRwLmMKKysrIGIvbmV0L2lwdjYvdWRwLmMKQEAgLTQzNSw3ICs0MzUsNyBAQAogCXJlYWRfdW5sb2NrKCZ1ZHBfaGFzaF9sb2NrKTsKIH0KIAotc3RhdGljIGludCB1ZHB2Nl9yY3Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCB1bnNpZ25lZCBpbnQgKm5ob2ZmcCkKK3N0YXRpYyBpbnQgdWRwdjZfcmN2KHN0cnVjdCBza19idWZmICoqcHNrYikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnBza2I7CiAJc3RydWN0IHNvY2sgKnNrOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfaW5wdXQuYyBiL25ldC9pcHY2L3hmcm02X2lucHV0LmMKaW5kZXggMjhjMjlkNy4uMWNhMmRhNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYveGZybTZfaW5wdXQuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9pbnB1dC5jCkBAIC0xMSw2ICsxMSw4IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni5oPgogI2luY2x1ZGUgPG5ldC9kc2ZpZWxkLmg+CiAjaW5jbHVkZSA8bmV0L2luZXRfZWNuLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CkBAIC0yNiw3ICsyOCw3IEBACiAJCUlQNl9FQ05fc2V0X2NlKGlubmVyX2lwaCk7CiB9CiAKLWludCB4ZnJtNl9yY3Zfc3BpKHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50ICpuaG9mZnAsIHUzMiBzcGkpCitpbnQgeGZybTZfcmN2X3NwaShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHUzMiBzcGkpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpwc2tiOwogCWludCBlcnI7CkBAIC0zOCw3ICs0MCw3IEBACiAJaW50IG5leHRoZHI7CiAJdW5zaWduZWQgaW50IG5ob2ZmOwogCi0JbmhvZmYgPSAqbmhvZmZwOworCW5ob2ZmID0gSVA2Q0Ioc2tiKS0+bmhvZmY7CiAJbmV4dGhkciA9IHNrYi0+bmgucmF3W25ob2ZmXTsKIAogCXNlcSA9IDA7CkBAIC0xMjEsNiArMTIzLDggQEAKIAlza2ItPnNwLT5sZW4gKz0geGZybV9ucjsKIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAKKwluZl9yZXNldChza2IpOworCiAJaWYgKGRlY2FwcykgewogCQlpZiAoIShza2ItPmRldi0+ZmxhZ3MmSUZGX0xPT1BCQUNLKSkgewogCQkJZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOwpAQCAtMTI5LDcgKzEzMywxNiBAQAogCQluZXRpZl9yeChza2IpOwogCQlyZXR1cm4gLTE7CiAJfSBlbHNlIHsKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSCisJCXNrYi0+bmguaXB2NmgtPnBheWxvYWRfbGVuID0gaHRvbnMoc2tiLT5sZW4pOworCQlfX3NrYl9wdXNoKHNrYiwgc2tiLT5kYXRhIC0gc2tiLT5uaC5yYXcpOworCisJCU5GX0hPT0soUEZfSU5FVDYsIE5GX0lQNl9QUkVfUk9VVElORywgc2tiLCBza2ItPmRldiwgTlVMTCwKKwkJICAgICAgICBpcDZfcmN2X2ZpbmlzaCk7CisJCXJldHVybiAtMTsKKyNlbHNlCiAJCXJldHVybiAxOworI2VuZGlmCiAJfQogCiBkcm9wX3VubG9jazoKQEAgLTE0NCw3ICsxNTcsNyBAQAogCiBFWFBPUlRfU1lNQk9MKHhmcm02X3Jjdl9zcGkpOwogCi1pbnQgeGZybTZfcmN2KHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50ICpuaG9mZnApCitpbnQgeGZybTZfcmN2KHN0cnVjdCBza19idWZmICoqcHNrYikKIHsKLQlyZXR1cm4geGZybTZfcmN2X3NwaShwc2tiLCBuaG9mZnAsIDApOworCXJldHVybiB4ZnJtNl9yY3Zfc3BpKHBza2IsIDApOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfb3V0cHV0LmMgYi9uZXQvaXB2Ni94ZnJtNl9vdXRwdXQuYwppbmRleCA2Yjk4Njc3Li44MDI0MjE3IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni94ZnJtNl9vdXRwdXQuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9vdXRwdXQuYwpAQCAtOSw5ICs5LDExIEBACiAgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaWNtcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvZHNmaWVsZC5oPgogI2luY2x1ZGUgPG5ldC9pbmV0X2Vjbi5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CkBAIC05Miw3ICs5NCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHhmcm02X291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCB4ZnJtNl9vdXRwdXRfb25lKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiLT5kc3Q7CiAJc3RydWN0IHhmcm1fc3RhdGUgKnggPSBkc3QtPnhmcm07CkBAIC0xMTAsMjkgKzExMiwzNSBAQAogCQkJZ290byBlcnJvcl9ub2xvY2s7CiAJfQogCi0Jc3Bpbl9sb2NrX2JoKCZ4LT5sb2NrKTsKLQllcnIgPSB4ZnJtX3N0YXRlX2NoZWNrKHgsIHNrYik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJvcjsKKwlkbyB7CisJCXNwaW5fbG9ja19iaCgmeC0+bG9jayk7CisJCWVyciA9IHhmcm1fc3RhdGVfY2hlY2soeCwgc2tiKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyb3I7CiAKLQl4ZnJtNl9lbmNhcChza2IpOworCQl4ZnJtNl9lbmNhcChza2IpOwogCi0JZXJyID0geC0+dHlwZS0+b3V0cHV0KHgsIHNrYik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJvcjsKKwkJZXJyID0geC0+dHlwZS0+b3V0cHV0KHgsIHNrYik7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycm9yOwogCi0JeC0+Y3VybGZ0LmJ5dGVzICs9IHNrYi0+bGVuOwotCXgtPmN1cmxmdC5wYWNrZXRzKys7CisJCXgtPmN1cmxmdC5ieXRlcyArPSBza2ItPmxlbjsKKwkJeC0+Y3VybGZ0LnBhY2tldHMrKzsKIAotCXNwaW5fdW5sb2NrX2JoKCZ4LT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJngtPmxvY2spOwogCi0Jc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7Ci0JCi0JaWYgKCEoc2tiLT5kc3QgPSBkc3RfcG9wKGRzdCkpKSB7Ci0JCWVyciA9IC1FSE9TVFVOUkVBQ0g7Ci0JCWdvdG8gZXJyb3Jfbm9sb2NrOwotCX0KLQllcnIgPSBORVRfWE1JVF9CWVBBU1M7CisJCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCQkKKwkJaWYgKCEoc2tiLT5kc3QgPSBkc3RfcG9wKGRzdCkpKSB7CisJCQllcnIgPSAtRUhPU1RVTlJFQUNIOworCQkJZ290byBlcnJvcl9ub2xvY2s7CisJCX0KKwkJZHN0ID0gc2tiLT5kc3Q7CisJCXggPSBkc3QtPnhmcm07CisJfSB3aGlsZSAoeCAmJiAheC0+cHJvcHMubW9kZSk7CisKKwlJUDZDQihza2IpLT5mbGFncyB8PSBJUDZTS0JfWEZSTV9UUkFOU0ZPUk1FRDsKKwllcnIgPSAwOwogCiBvdXRfZXhpdDoKIAlyZXR1cm4gZXJyOwpAQCAtMTQyLDMgKzE1MCwzMyBAQAogCWtmcmVlX3NrYihza2IpOwogCWdvdG8gb3V0X2V4aXQ7CiB9CisKK3N0YXRpYyBpbnQgeGZybTZfb3V0cHV0X2ZpbmlzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBlcnI7CisKKwl3aGlsZSAobGlrZWx5KChlcnIgPSB4ZnJtNl9vdXRwdXRfb25lKHNrYikpID09IDApKSB7CisJCW5mX3Jlc2V0KHNrYik7CisJCisJCWVyciA9IG5mX2hvb2soUEZfSU5FVDYsIE5GX0lQNl9MT0NBTF9PVVQsICZza2IsIE5VTEwsCisJCQkgICAgICBza2ItPmRzdC0+ZGV2LCBkc3Rfb3V0cHV0KTsKKwkJaWYgKHVubGlrZWx5KGVyciAhPSAxKSkKKwkJCWJyZWFrOworCisJCWlmICghc2tiLT5kc3QtPnhmcm0pCisJCQlyZXR1cm4gZHN0X291dHB1dChza2IpOworCisJCWVyciA9IG5mX2hvb2soUEZfSU5FVDYsIE5GX0lQNl9QT1NUX1JPVVRJTkcsICZza2IsIE5VTEwsCisJCQkgICAgICBza2ItPmRzdC0+ZGV2LCB4ZnJtNl9vdXRwdXRfZmluaXNoKTsKKwkJaWYgKHVubGlrZWx5KGVyciAhPSAxKSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK2ludCB4ZnJtNl9vdXRwdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X1BPU1RfUk9VVElORywgc2tiLCBOVUxMLCBza2ItPmRzdC0+ZGV2LAorCQkgICAgICAgeGZybTZfb3V0cHV0X2ZpbmlzaCk7Cit9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni94ZnJtNl9zdGF0ZS5jIGIvbmV0L2lwdjYveGZybTZfc3RhdGUuYwppbmRleCBiZjBkMGFiLi5hNTcyMzAyIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni94ZnJtNl9zdGF0ZS5jCisrKyBiL25ldC9pcHY2L3hmcm02X3N0YXRlLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wZmtleXYyLmg+CiAjaW5jbHVkZSA8bGludXgvaXBzZWMuaD4KICNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgogCiBzdGF0aWMgc3RydWN0IHhmcm1fc3RhdGVfYWZpbmZvIHhmcm02X3N0YXRlX2FmaW5mbzsKIApAQCAtNDEsNiArNDIsMjIgQEAKIAltZW1jcHkoJngtPnByb3BzLnNhZGRyLCAmdG1wbC0+c2FkZHIsIHNpemVvZih4LT5wcm9wcy5zYWRkcikpOwogCWlmIChpcHY2X2FkZHJfYW55KChzdHJ1Y3QgaW42X2FkZHIqKSZ4LT5wcm9wcy5zYWRkcikpCiAJCW1lbWNweSgmeC0+cHJvcHMuc2FkZHIsIHNhZGRyLCBzaXplb2YoeC0+cHJvcHMuc2FkZHIpKTsKKwlpZiAodG1wbC0+bW9kZSAmJiBpcHY2X2FkZHJfYW55KChzdHJ1Y3QgaW42X2FkZHIqKSZ4LT5wcm9wcy5zYWRkcikpIHsKKwkJc3RydWN0IHJ0Nl9pbmZvICpydDsKKwkJc3RydWN0IGZsb3dpIGZsX3R1bm5lbCA9IHsKKwkJCS5ubF91ID0geworCQkJCS5pcDZfdSA9IHsKKwkJCQkJLmRhZGRyID0gKihzdHJ1Y3QgaW42X2FkZHIgKilkYWRkciwKKwkJCQl9CisJCQl9CisJCX07CisJCWlmICgheGZybV9kc3RfbG9va3VwKChzdHJ1Y3QgeGZybV9kc3QgKiopJnJ0LAorCQkgICAgICAgICAgICAgICAgICAgICAmZmxfdHVubmVsLCBBRl9JTkVUNikpIHsKKwkJCWlwdjZfZ2V0X3NhZGRyKCZydC0+dS5kc3QsIChzdHJ1Y3QgaW42X2FkZHIgKilkYWRkciwKKwkJCSAgICAgICAgICAgICAgIChzdHJ1Y3QgaW42X2FkZHIgKikmeC0+cHJvcHMuc2FkZHIpOworCQkJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CisJCX0KKwl9CiAJeC0+cHJvcHMubW9kZSA9IHRtcGwtPm1vZGU7CiAJeC0+cHJvcHMucmVxaWQgPSB0bXBsLT5yZXFpZDsKIAl4LT5wcm9wcy5mYW1pbHkgPSBBRl9JTkVUNjsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X3R1bm5lbC5jIGIvbmV0L2lwdjYveGZybTZfdHVubmVsLmMKaW5kZXggZmJlZjc4Mi4uOGNmYzU4YiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYveGZybTZfdHVubmVsLmMKKysrIGIvbmV0L2lwdjYveGZybTZfdHVubmVsLmMKQEAgLTI1OSw4ICsyNTksNyBAQAogCXNwaSA9IDA7CiAJZ290byBvdXQ7CiBhbGxvY19zcGk6Ci0JWDZUUFJJTlRLMyhLRVJOX0RFQlVHICIlcygpOiBhbGxvY2F0ZSBuZXcgc3BpIGZvciAiCi0JCQkgICAgICAiJTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4XG4iLCAKKwlYNlRQUklOVEszKEtFUk5fREVCVUcgIiVzKCk6IGFsbG9jYXRlIG5ldyBzcGkgZm9yICIgTklQNl9GTVQgIlxuIiwKIAkJCSAgICAgIF9fRlVOQ1RJT05fXywgCiAJCQkgICAgICBOSVA2KCooc3RydWN0IGluNl9hZGRyICopc2FkZHIpKTsKIAl4NnNwaSA9IGttZW1fY2FjaGVfYWxsb2MoeGZybTZfdHVubmVsX3NwaV9rbWVtLCBTTEFCX0FUT01JQyk7CkBAIC0zMjMsOSArMzIyLDggQEAKIAkJCQkgIGxpc3RfYnlhZGRyKQogCXsKIAkJaWYgKG1lbWNtcCgmeDZzcGktPmFkZHIsIHNhZGRyLCBzaXplb2YoeDZzcGktPmFkZHIpKSA9PSAwKSB7Ci0JCQlYNlRQUklOVEszKEtFUk5fREVCVUcgIiVzKCk6IHg2c3BpIG9iamVjdCAiCi0JCQkJCSAgICAgICJmb3IgJTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4ICIKLQkJCQkJICAgICAgImZvdW5kIGF0ICVwXG4iLAorCQkJWDZUUFJJTlRLMyhLRVJOX0RFQlVHICIlcygpOiB4NnNwaSBvYmplY3QgZm9yICIgTklQNl9GTVQgCisJCQkJCSAgICAgICIgZm91bmQgYXQgJXBcbiIsCiAJCQkJICAgX19GVU5DVElPTl9fLCAKIAkJCQkgICBOSVA2KCooc3RydWN0IGluNl9hZGRyICopc2FkZHIpLAogCQkJCSAgIHg2c3BpKTsKQEAgLTM5Nyw3ICszOTUsNyBAQAogCiBFWFBPUlRfU1lNQk9MKHhmcm02X3R1bm5lbF9kZXJlZ2lzdGVyKTsKIAotc3RhdGljIGludCB4ZnJtNl90dW5uZWxfcmN2KHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50ICpuaG9mZnApCitzdGF0aWMgaW50IHhmcm02X3R1bm5lbF9yY3Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSAqcHNrYjsKIAlzdHJ1Y3QgeGZybTZfdHVubmVsICpoYW5kbGVyID0geGZybTZfdHVubmVsX2hhbmRsZXI7CkBAIC00MDUsMTEgKzQwMywxMSBAQAogCXUzMiBzcGk7CiAKIAkvKiBkZXZpY2UtbGlrZV9pcDZpcDZfaGFuZGxlcigpICovCi0JaWYgKGhhbmRsZXIgJiYgaGFuZGxlci0+aGFuZGxlcihwc2tiLCBuaG9mZnApID09IDApCisJaWYgKGhhbmRsZXIgJiYgaGFuZGxlci0+aGFuZGxlcihwc2tiKSA9PSAwKQogCQlyZXR1cm4gMDsKIAogCXNwaSA9IHhmcm02X3R1bm5lbF9zcGlfbG9va3VwKCh4ZnJtX2FkZHJlc3NfdCAqKSZpcGgtPnNhZGRyKTsKLQlyZXR1cm4geGZybTZfcmN2X3NwaShwc2tiLCBuaG9mZnAsIHNwaSk7CisJcmV0dXJuIHhmcm02X3Jjdl9zcGkocHNrYiwgc3BpKTsKIH0KIAogc3RhdGljIHZvaWQgeGZybTZfdHVubmVsX2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwKZGlmZiAtLWdpdCBhL25ldC9pcHgvYWZfaXB4LmMgYi9uZXQvaXB4L2FmX2lweC5jCmluZGV4IDBkYzUxOWIuLjBmYjUxM2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHgvYWZfaXB4LmMKKysrIGIvbmV0L2lweC9hZl9pcHguYwpAQCAtMjksNiArMjksNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvYWZfaXJkYS5jIGIvbmV0L2lyZGEvYWZfaXJkYS5jCmluZGV4IGZiZmE5NjcuLjc1OTQ0NTYgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2FmX2lyZGEuYworKysgYi9uZXQvaXJkYS9hZl9pcmRhLmMKQEAgLTQzLDYgKzQzLDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJkYV9kZXZpY2UuYyBiL25ldC9pcmRhL2lyZGFfZGV2aWNlLmMKaW5kZXggNzA1NDNkOC4uODkwYmFjMCAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJkYV9kZXZpY2UuYworKysgYi9uZXQvaXJkYS9pcmRhX2RldmljZS5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9pZi5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmlhc19vYmplY3QuYyBiL25ldC9pcmRhL2lyaWFzX29iamVjdC5jCmluZGV4IDc1ZjI2NjYuLmM2ZDE2OWYgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lyaWFzX29iamVjdC5jCisrKyBiL25ldC9pcmRhL2lyaWFzX29iamVjdC5jCkBAIC04Miw4ICs4Miw3IEBACiAKIAlJUkRBX0RFQlVHKCA0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKIAotCW9iaiA9IChzdHJ1Y3QgaWFzX29iamVjdCAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWFzX29iamVjdCksCi0JCQkJCSAgICBHRlBfQVRPTUlDKTsKKwlvYmogPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWFzX29iamVjdCksIEdGUF9BVE9NSUMpOwogCWlmIChvYmogPT0gTlVMTCkgewogCQlJUkRBX1dBUk5JTkcoIiVzKCksIFVuYWJsZSB0byBhbGxvY2F0ZSBvYmplY3QhXG4iLAogCQkJICAgICBfX0ZVTkNUSU9OX18pOwpAQCAtMzQ4LDggKzM0Nyw3IEBACiAJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm47KTsKIAlJUkRBX0FTU0VSVChuYW1lICE9IE5VTEwsIHJldHVybjspOwogCi0JYXR0cmliID0gKHN0cnVjdCBpYXNfYXR0cmliICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfYXR0cmliKSwKLQkJCQkJICAgICAgIEdGUF9BVE9NSUMpOworCWF0dHJpYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfYXR0cmliKSwgR0ZQX0FUT01JQyk7CiAJaWYgKGF0dHJpYiA9PSBOVUxMKSB7CiAJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBhdHRyaWJ1dGUhXG4iLAogCQkJICAgICBfX0ZVTkNUSU9OX18pOwpAQCAtMzg1LDggKzM4Myw3IEBACiAJSVJEQV9BU1NFUlQobmFtZSAhPSBOVUxMLCByZXR1cm47KTsKIAlJUkRBX0FTU0VSVChvY3RldHMgIT0gTlVMTCwgcmV0dXJuOyk7CiAKLQlhdHRyaWIgPSAoc3RydWN0IGlhc19hdHRyaWIgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGlhc19hdHRyaWIpLAotCQkJCQkgICAgICAgR0ZQX0FUT01JQyk7CisJYXR0cmliID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlhc19hdHRyaWIpLCBHRlBfQVRPTUlDKTsKIAlpZiAoYXR0cmliID09IE5VTEwpIHsKIAkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGF0dHJpYnV0ZSFcbiIsCiAJCQkgICAgIF9fRlVOQ1RJT05fXyk7CkBAIC00MjAsOCArNDE3LDcgQEAKIAlJUkRBX0FTU0VSVChuYW1lICE9IE5VTEwsIHJldHVybjspOwogCUlSREFfQVNTRVJUKHZhbHVlICE9IE5VTEwsIHJldHVybjspOwogCi0JYXR0cmliID0gKHN0cnVjdCBpYXNfYXR0cmliICopIGttYWxsb2Moc2l6ZW9mKCBzdHJ1Y3QgaWFzX2F0dHJpYiksCi0JCQkJCSAgICAgICBHRlBfQVRPTUlDKTsKKwlhdHRyaWIgPSBrbWFsbG9jKHNpemVvZiggc3RydWN0IGlhc19hdHRyaWIpLCBHRlBfQVRPTUlDKTsKIAlpZiAoYXR0cmliID09IE5VTEwpIHsKIAkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGF0dHJpYnV0ZSFcbiIsCiAJCQkgICAgIF9fRlVOQ1RJT05fXyk7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcm5ldC9pcm5ldC5oIGIvbmV0L2lyZGEvaXJuZXQvaXJuZXQuaAppbmRleCBiMzkxY2IzLi5lNGZlMWU4IDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcm5ldC9pcm5ldC5oCisrKyBiL25ldC9pcmRhL2lybmV0L2lybmV0LmgKQEAgLTI0OCw2ICsyNDgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CS8qIGlzc3BhY2UoKSAqLwogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9uZXQva2V5L2FmX2tleS5jIGIvbmV0L2tleS9hZl9rZXkuYwppbmRleCA1MmVmZDA0Li40M2YxY2U3IDEwMDY0NAotLS0gYS9uZXQva2V5L2FmX2tleS5jCisrKyBiL25ldC9rZXkvYWZfa2V5LmMKQEAgLTE1LDYgKzE1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgpAQCAtMjk3LDggKzI5OCw3IEBACiAJCWVyciA9IEVJTlRSOwogCWlmIChlcnIgPj0gNTEyKQogCQllcnIgPSBFSU5WQUw7Ci0JaWYgKGVyciA8PSAwIHx8IGVyciA+PSAyNTYpCi0JCUJVRygpOworCUJVR19PTihlcnIgPD0gMCB8fCBlcnIgPj0gMjU2KTsKIAogCWhkciA9IChzdHJ1Y3Qgc2FkYl9tc2cgKikgc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3Qgc2FkYl9tc2cpKTsKIAlwZmtleV9oZHJfZHVwKGhkciwgb3JpZyk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL0tjb25maWcgYi9uZXQvbmV0ZmlsdGVyL0tjb25maWcKaW5kZXggN2Q1NWY5Yy4uOTljMGEwZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9LY29uZmlnCisrKyBiL25ldC9uZXRmaWx0ZXIvS2NvbmZpZwpAQCAtMTAzLDMgKzEwMywyNjEgQEAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgYSBuZXRsaW5rLWJhc2VkIHVzZXJzcGFjZSBpbnRlcmZhY2UKIAogZW5kbWVudQorCitjb25maWcgTkVURklMVEVSX1hUQUJMRVMKKwl0cmlzdGF0ZSAiTmV0ZmlsdGVyIFh0YWJsZXMgc3VwcG9ydCAocmVxdWlyZWQgZm9yIGlwX3RhYmxlcykiCisJaGVscAorCSAgVGhpcyBpcyByZXF1aXJlZCBpZiB5b3UgaW50ZW5kIHRvIHVzZSBhbnkgb2YgaXBfdGFibGVzLAorCSAgaXA2X3RhYmxlcyBvciBhcnBfdGFibGVzLgorCisjIGFscGhhYmV0aWNhbGx5IG9yZGVyZWQgbGlzdCBvZiB0YXJnZXRzCisKK2NvbmZpZyBORVRGSUxURVJfWFRfVEFSR0VUX0NMQVNTSUZZCisJdHJpc3RhdGUgJyJDTEFTU0lGWSIgdGFyZ2V0IHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgQ0xBU1NJRlknIHRhcmdldCwgd2hpY2ggZW5hYmxlcyB0aGUgdXNlciB0byBzZXQKKwkgIHRoZSBwcmlvcml0eSBvZiBhIHBhY2tldC4gU29tZSBxZGlzY3MgY2FuIHVzZSB0aGlzIHZhbHVlIGZvcgorCSAgY2xhc3NpZmljYXRpb24sIGFtb25nIHRoZXNlIGFyZToKKworICAJICBhdG0sIGNicSwgZHNtYXJrLCBwZmlmb19mYXN0LCBodGIsIHByaW8KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5NQVJLCisJdHJpc3RhdGUgICciQ09OTk1BUksiIHRhcmdldCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwlkZXBlbmRzIG9uIElQX05GX01BTkdMRSB8fCBJUDZfTkZfTUFOR0xFCisJZGVwZW5kcyBvbiAoSVBfTkZfQ09OTlRSQUNLICYmIElQX05GX0NPTk5UUkFDS19NQVJLKSB8fCAoTkZfQ09OTlRSQUNLX01BUksgJiYgTkZfQ09OTlRSQUNLX0lQVjQpCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBDT05OTUFSSycgdGFyZ2V0LCB3aGljaCBhbGxvd3Mgb25lIHRvIG1hbmlwdWxhdGUKKwkgIHRoZSBjb25uZWN0aW9uIG1hcmsgdmFsdWUuICBTaW1pbGFyIHRvIHRoZSBNQVJLIHRhcmdldCwgYnV0CisJICBhZmZlY3RzIHRoZSBjb25uZWN0aW9uIG1hcmsgdmFsdWUgcmF0aGVyIHRoYW4gdGhlIHBhY2tldCBtYXJrIHZhbHVlLgorCQorCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCisJICBpcHRfQ09OTk1BUksuby4gIElmIHVuc3VyZSwgc2F5IGBOJy4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSworCXRyaXN0YXRlICciTUFSSyIgdGFyZ2V0IHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgTUFSSycgdGFyZ2V0LCB3aGljaCBhbGxvd3MgeW91IHRvIGNyZWF0ZSBydWxlcworCSAgaW4gdGhlIGBtYW5nbGUnIHRhYmxlIHdoaWNoIGFsdGVyIHRoZSBuZXRmaWx0ZXIgbWFyayAobmZtYXJrKSBmaWVsZAorCSAgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrZXQgcHJpb3IgdG8gcm91dGluZy4gVGhpcyBjYW4gY2hhbmdlCisJICB0aGUgcm91dGluZyBtZXRob2QgKHNlZSBgVXNlIG5ldGZpbHRlciBNQVJLIHZhbHVlIGFzIHJvdXRpbmcKKwkgIGtleScpIGFuZCBjYW4gYWxzbyBiZSB1c2VkIGJ5IG90aGVyIHN1YnN5c3RlbXMgdG8gY2hhbmdlIHRoZWlyCisJICBiZWhhdmlvci4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBORVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUUKKwl0cmlzdGF0ZSAnIk5GUVVFVUUiIHRhcmdldCBTdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwloZWxwCisJICBUaGlzIFRhcmdldCByZXBsYWNlZCB0aGUgb2xkIG9ic29sZXRlIFFVRVVFIHRhcmdldC4KKworCSAgQXMgb3Bwb3NlZCB0byBRVUVVRSwgaXQgc3VwcG9ydHMgNjU1MzUgZGlmZmVyZW50IHF1ZXVlcywKKwkgIG5vdCBqdXN0IG9uZS4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBORVRGSUxURVJfWFRfVEFSR0VUX05PVFJBQ0sKKwl0cmlzdGF0ZSAgJyJOT1RSQUNLIiB0YXJnZXQgc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJZGVwZW5kcyBvbiBJUF9ORl9SQVcgfHwgSVA2X05GX1JBVworCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLIHx8IE5GX0NPTk5UUkFDSworCWhlbHAKKwkgIFRoZSBOT1RSQUNLIHRhcmdldCBhbGxvd3MgYSBzZWxlY3QgcnVsZSB0byBzcGVjaWZ5CisJICB3aGljaCBwYWNrZXRzICpub3QqIHRvIGVudGVyIHRoZSBjb25udHJhY2svTkFUCisJICBzdWJzeXN0ZW0gd2l0aCBhbGwgdGhlIGNvbnNlcXVlbmNlcyAobm8gSUNNUCBlcnJvciB0cmFja2luZywKKwkgIG5vIHByb3RvY29sIGhlbHBlcnMgZm9yIHRoZSBzZWxlY3RlZCBwYWNrZXRzKS4KKwkKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX0NPTU1FTlQKKwl0cmlzdGF0ZSAgJyJjb21tZW50IiBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYGNvbW1lbnQnIGR1bW15LW1hdGNoLCB3aGljaCBhbGxvd3MgeW91IHRvIHB1dAorCSAgY29tbWVudHMgaW4geW91ciBpcHRhYmxlcyBydWxlc2V0LgorCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9DT05OQllURVMKKwl0cmlzdGF0ZSAgJyJjb25uYnl0ZXMiIHBlci1jb25uZWN0aW9uIGNvdW50ZXIgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJZGVwZW5kcyBvbiAoSVBfTkZfQ09OTlRSQUNLICYmIElQX05GX0NUX0FDQ1QpIHx8IE5GX0NUX0FDQ1QKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYGNvbm5ieXRlcycgbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gbWF0Y2ggdGhlCisJICBudW1iZXIgb2YgYnl0ZXMgYW5kL29yIHBhY2tldHMgZm9yIGVhY2ggZGlyZWN0aW9uIHdpdGhpbiBhIGNvbm5lY3Rpb24uCisKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX0NPTk5NQVJLCisJdHJpc3RhdGUgICciY29ubm1hcmsiIGNvbm5lY3Rpb24gbWFyayBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwlkZXBlbmRzIG9uIChJUF9ORl9DT05OVFJBQ0sgJiYgSVBfTkZfQ09OTlRSQUNLX01BUkspIHx8IE5GX0NPTk5UUkFDS19NQVJLCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBjb25ubWFyaycgbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gbWF0Y2ggdGhlCisJICBjb25uZWN0aW9uIG1hcmsgdmFsdWUgcHJldmlvdXNseSBzZXQgZm9yIHRoZSBzZXNzaW9uIGJ5IGBDT05OTUFSSycuIAorCQorCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCisJICBpcHRfY29ubm1hcmsuby4gIElmIHVuc3VyZSwgc2F5IGBOJy4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9DT05OVFJBQ0sKKwl0cmlzdGF0ZSAnImNvbm50cmFjayIgY29ubmVjdGlvbiB0cmFja2luZyBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyB8fCBORl9DT05OVFJBQ0sKKwloZWxwCisJICBUaGlzIGlzIGEgZ2VuZXJhbCBjb25udHJhY2sgbWF0Y2ggbW9kdWxlLCBhIHN1cGVyc2V0IG9mIHRoZSBzdGF0ZSBtYXRjaC4KKworCSAgSXQgYWxsb3dzIG1hdGNoaW5nIG9uIGFkZGl0aW9uYWwgY29ubnRyYWNrIGluZm9ybWF0aW9uLCB3aGljaCBpcworCSAgdXNlZnVsIGluIGNvbXBsZXggY29uZmlndXJhdGlvbnMsIHN1Y2ggYXMgTkFUIGdhdGV3YXlzIHdpdGggbXVsdGlwbGUKKwkgIGludGVybmV0IGxpbmtzIG9yIHR1bm5lbHMuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX0RDQ1AKKwl0cmlzdGF0ZSAgJyJEQ0NQIiBwcm90b2NvbCBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwloZWxwCisJICBXaXRoIHRoaXMgb3B0aW9uIGVuYWJsZWQsIHlvdSB3aWxsIGJlIGFibGUgdG8gdXNlIHRoZSBpcHRhYmxlcworCSAgYGRjY3AnIG1hdGNoIGluIG9yZGVyIHRvIG1hdGNoIG9uIERDQ1Agc291cmNlL2Rlc3RpbmF0aW9uIHBvcnRzCisJICBhbmQgRENDUCBmbGFncy4KKworCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBJZiB1bnN1cmUsIHNheSBgTicuCisKK2NvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSCisJdHJpc3RhdGUgJyJoZWxwZXIiIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLIHx8IE5GX0NPTk5UUkFDSworCWhlbHAKKwkgIEhlbHBlciBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIHBhY2tldHMgaW4gZHluYW1pYyBjb25uZWN0aW9ucworCSAgdHJhY2tlZCBieSBhIGNvbm50cmFjay1oZWxwZXIsIGllLiBpcF9jb25udHJhY2tfZnRwCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX0xFTkdUSAorCXRyaXN0YXRlICcibGVuZ3RoIiBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIG1hdGNoIHRoZSBsZW5ndGggb2YgYSBwYWNrZXQgYWdhaW5zdCBhCisJICBzcGVjaWZpYyB2YWx1ZSBvciByYW5nZSBvZiB2YWx1ZXMuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX0xJTUlUCisJdHJpc3RhdGUgJyJsaW1pdCIgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJaGVscAorCSAgbGltaXQgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBjb250cm9sIHRoZSByYXRlIGF0IHdoaWNoIGEgcnVsZSBjYW4gYmUKKwkgIG1hdGNoZWQ6IG1haW5seSB1c2VmdWwgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgTE9HIHRhcmdldCAoIkxPRworCSAgdGFyZ2V0IHN1cHBvcnQiLCBiZWxvdykgYW5kIHRvIGF2b2lkIHNvbWUgRGVuaWFsIG9mIFNlcnZpY2UgYXR0YWNrcy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfTUFDCisJdHJpc3RhdGUgJyJtYWMiIGFkZHJlc3MgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJaGVscAorCSAgTUFDIG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggcGFja2V0cyBiYXNlZCBvbiB0aGUgc291cmNlCisJICBFdGhlcm5ldCBhZGRyZXNzIG9mIHRoZSBwYWNrZXQuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX01BUksKKwl0cmlzdGF0ZSAnIm1hcmsiIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCWhlbHAKKwkgIE5ldGZpbHRlciBtYXJrIG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggcGFja2V0cyBiYXNlZCBvbiB0aGUKKwkgIGBuZm1hcmsnIHZhbHVlIGluIHRoZSBwYWNrZXQuICBUaGlzIGNhbiBiZSBzZXQgYnkgdGhlIE1BUksgdGFyZ2V0CisJICAoc2VlIGJlbG93KS4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfUEhZU0RFVgorCXRyaXN0YXRlICcicGh5c2RldiIgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTICYmIEJSSURHRV9ORVRGSUxURVIKKwloZWxwCisJICBQaHlzZGV2IHBhY2tldCBtYXRjaGluZyBtYXRjaGVzIGFnYWluc3QgdGhlIHBoeXNpY2FsIGJyaWRnZSBwb3J0cworCSAgdGhlIElQIHBhY2tldCBhcnJpdmVkIG9uIG9yIHdpbGwgbGVhdmUgYnkuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX1BLVFRZUEUKKwl0cmlzdGF0ZSAnInBrdHR5cGUiIHBhY2tldCB0eXBlIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCWhlbHAKKwkgIFBhY2tldCB0eXBlIG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggYSBwYWNrZXQgYnkKKwkgIGl0cyAiY2xhc3MiLCBlZy4gQlJPQURDQVNULCBNVUxUSUNBU1QsIC4uLgorCisJICBUeXBpY2FsIHVzYWdlOgorCSAgaXB0YWJsZXMgLUEgSU5QVVQgLW0gcGt0dHlwZSAtLXBrdC10eXBlIGJyb2FkY2FzdCAtaiBMT0cKKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfUkVBTE0KKwl0cmlzdGF0ZSAgJyJyZWFsbSIgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJc2VsZWN0IE5FVF9DTFNfUk9VVEUKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYHJlYWxtJyBtYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byB1c2UgdGhlIHJlYWxtCisJICBrZXkgZnJvbSB0aGUgcm91dGluZyBzdWJzeXN0ZW0gaW5zaWRlIGlwdGFibGVzLgorCQorCSAgVGhpcyBtYXRjaCBwcmV0dHkgbXVjaCByZXNlbWJsZXMgdGhlIENPTkZJR19ORVRfQ0xTX1JPVVRFNCBvcHRpb24gCisJICBpbiB0YyB3b3JsZC4KKwkKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX1NDVFAKKwl0cmlzdGF0ZSAgJyJzY3RwIiBwcm90b2NvbCBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwloZWxwCisJICBXaXRoIHRoaXMgb3B0aW9uIGVuYWJsZWQsIHlvdSB3aWxsIGJlIGFibGUgdG8gdXNlIHRoZSAKKwkgIGBzY3RwJyBtYXRjaCBpbiBvcmRlciB0byBtYXRjaCBvbiBTQ1RQIHNvdXJjZS9kZXN0aW5hdGlvbiBwb3J0cworCSAgYW5kIFNDVFAgY2h1bmsgdHlwZXMuCisKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX1NUQVRFCisJdHJpc3RhdGUgJyJzdGF0ZSIgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sgfHwgTkZfQ09OTlRSQUNLCisJaGVscAorCSAgQ29ubmVjdGlvbiBzdGF0ZSBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIHBhY2tldHMgYmFzZWQgb24gdGhlaXIKKwkgIHJlbGF0aW9uc2hpcCB0byBhIHRyYWNrZWQgY29ubmVjdGlvbiAoaWUuIHByZXZpb3VzIHBhY2tldHMpLiAgVGhpcworCSAgaXMgYSBwb3dlcmZ1bCB0b29sIGZvciBwYWNrZXQgY2xhc3NpZmljYXRpb24uCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX1NUUklORworCXRyaXN0YXRlICAnInN0cmluZyIgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJc2VsZWN0IFRFWFRTRUFSQ0gKKwlzZWxlY3QgVEVYVFNFQVJDSF9LTVAKKwlzZWxlY3QgVEVYVFNFQVJDSF9CTQorCXNlbGVjdCBURVhUU0VBUkNIX0ZTTQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgc3RyaW5nJyBtYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byBsb29rIGZvcgorCSAgcGF0dGVybiBtYXRjaGluZ3MgaW4gcGFja2V0cy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfVENQTVNTCisJdHJpc3RhdGUgJyJ0Y3Btc3MiIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgdGNwbXNzJyBtYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byBleGFtaW5lIHRoZQorCSAgTVNTIHZhbHVlIG9mIFRDUCBTWU4gcGFja2V0cywgd2hpY2ggY29udHJvbCB0aGUgbWF4aW11bSBwYWNrZXQgc2l6ZQorCSAgZm9yIHRoYXQgY29ubmVjdGlvbi4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUgYi9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlCmluZGV4IGNiMjE4MzEuLjc0NjE3MmUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUKKysrIGIvbmV0L25ldGZpbHRlci9NYWtlZmlsZQpAQCAtMSw0ICsxLDUgQEAKIG5ldGZpbHRlci1vYmpzIDo9IGNvcmUubyBuZl9sb2cubyBuZl9xdWV1ZS5vIG5mX3NvY2tvcHQubworbmZfY29ubnRyYWNrLW9ianMJOj0gbmZfY29ubnRyYWNrX2NvcmUubyBuZl9jb25udHJhY2tfc3RhbmRhbG9uZS5vIG5mX2Nvbm50cmFja19sM3Byb3RvX2dlbmVyaWMubyBuZl9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5vIG5mX2Nvbm50cmFja19wcm90b190Y3AubyBuZl9jb25udHJhY2tfcHJvdG9fdWRwLm8KIAogb2JqLSQoQ09ORklHX05FVEZJTFRFUikgPSBuZXRmaWx0ZXIubwogCkBAIC02LDEzICs3LDQzIEBACiBvYmotJChDT05GSUdfTkVURklMVEVSX05FVExJTktfUVVFVUUpICs9IG5mbmV0bGlua19xdWV1ZS5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX05FVExJTktfTE9HKSArPSBuZm5ldGxpbmtfbG9nLm8KIAotbmZfY29ubnRyYWNrLW9ianMJOj0gbmZfY29ubnRyYWNrX2NvcmUubyBuZl9jb25udHJhY2tfc3RhbmRhbG9uZS5vIG5mX2Nvbm50cmFja19sM3Byb3RvX2dlbmVyaWMubyBuZl9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5vIG5mX2Nvbm50cmFja19wcm90b190Y3AubyBuZl9jb25udHJhY2tfcHJvdG9fdWRwLm8KLQorIyBjb25uZWN0aW9uIHRyYWNraW5nCiBvYmotJChDT05GSUdfTkZfQ09OTlRSQUNLKSArPSBuZl9jb25udHJhY2subwotb2JqLSQoQ09ORklHX05GX0NPTk5UUkFDS19GVFApICs9IG5mX2Nvbm50cmFja19mdHAubwogCiAjIFNDVFAgcHJvdG9jb2wgY29ubmVjdGlvbiB0cmFja2luZwogb2JqLSQoQ09ORklHX05GX0NUX1BST1RPX1NDVFApICs9IG5mX2Nvbm50cmFja19wcm90b19zY3RwLm8KIAogIyBuZXRsaW5rIGludGVyZmFjZSBmb3IgbmZfY29ubnRyYWNrCiBvYmotJChDT05GSUdfTkZfQ1RfTkVUTElOSykgKz0gbmZfY29ubnRyYWNrX25ldGxpbmsubworCisjIGNvbm5lY3Rpb24gdHJhY2tpbmcgaGVscGVycworb2JqLSQoQ09ORklHX05GX0NPTk5UUkFDS19GVFApICs9IG5mX2Nvbm50cmFja19mdHAubworCisjIGdlbmVyaWMgWCB0YWJsZXMgCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUQUJMRVMpICs9IHhfdGFibGVzLm8geHRfdGNwdWRwLm8KKworIyB0YXJnZXRzCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DTEFTU0lGWSkgKz0geHRfQ0xBU1NJRlkubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ09OTk1BUkspICs9IHh0X0NPTk5NQVJLLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX01BUkspICs9IHh0X01BUksubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZRVUVVRSkgKz0geHRfTkZRVUVVRS5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9OT1RSQUNLKSArPSB4dF9OT1RSQUNLLm8KKworIyBtYXRjaGVzCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTU1FTlQpICs9IHh0X2NvbW1lbnQubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OQllURVMpICs9IHh0X2Nvbm5ieXRlcy5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5NQVJLKSArPSB4dF9jb25ubWFyay5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5UUkFDSykgKz0geHRfY29ubnRyYWNrLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRENDUCkgKz0geHRfZGNjcC5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hFTFBFUikgKz0geHRfaGVscGVyLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTEVOR1RIKSArPSB4dF9sZW5ndGgubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVCkgKz0geHRfbGltaXQubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQUMpICs9IHh0X21hYy5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BUkspICs9IHh0X21hcmsubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QS1RUWVBFKSArPSB4dF9wa3R0eXBlLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVBTE0pICs9IHh0X3JlYWxtLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU0NUUCkgKz0geHRfc2N0cC5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRFKSArPSB4dF9zdGF0ZS5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUUklORykgKz0geHRfc3RyaW5nLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVENQTVNTKSArPSB4dF90Y3Btc3Mubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QSFlTREVWKSArPSB4dF9waHlzZGV2Lm8KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmMKaW5kZXggZDVhNmVhZi4uYWIwYzkyMCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmMKQEAgLTU0NSwxMSArNTQ1LDExIEBACiAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IElQIGFkZHJlc3MuICBTaW1wbHkgZG9uJ3QgcmVjb3JkIGl0IGZvcgogICAgICAgICAgICAgICAgICAgIE5BVC4gKi8KIAkJaWYgKGNtZC5sM251bSA9PSBQRl9JTkVUKSB7Ci0gICAgICAgICAgICAgICAgCURFQlVHUCgiY29ubnRyYWNrX2Z0cDogTk9UIFJFQ09SRElORzogJXUsJXUsJXUsJXUgIT0gJXUuJXUuJXUuJXVcbiIsCisgICAgICAgICAgICAgICAgCURFQlVHUCgiY29ubnRyYWNrX2Z0cDogTk9UIFJFQ09SRElORzogIiBOSVBRVUFEX0ZNVCAiICE9ICIgTklQUVVBRF9GTVQgIlxuIiwKIAkJCSAgICAgICBOSVBRVUFEKGNtZC51My5pcCksCiAJCQkgICAgICAgTklQUVVBRChjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLnUzLmlwKSk7CiAJCX0gZWxzZSB7Ci0JCQlERUJVR1AoImNvbm50cmFja19mdHA6IE5PVCBSRUNPUkRJTkc6ICV4OiV4OiV4OiV4OiV4OiV4OiV4OiV4ICE9ICV4OiV4OiV4OiV4OiV4OiV4OiV4OiV4XG4iLAorCQkJREVCVUdQKCJjb25udHJhY2tfZnRwOiBOT1QgUkVDT1JESU5HOiAiIE5JUDZfRk1UICIgIT0gIiBOSVA2X0ZNVCAiXG4iLAogCQkJICAgICAgIE5JUDYoKigoc3RydWN0IGluNl9hZGRyICopY21kLnUzLmlwNikpLAogCQkJICAgICAgIE5JUDYoKigoc3RydWN0IGluNl9hZGRyICopY3QtPnR1cGxlaGFzaFtkaXJdCiAJCQkJCQkJLnR1cGxlLnNyYy51My5pcDYpKSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19nZW5lcmljLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19nZW5lcmljLmMKaW5kZXggMzY0MjVmNi4uNDZiYzI3ZSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMuYwpAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvY29sLmg+CiAKLXVuc2lnbmVkIGxvbmcgbmZfY3RfZ2VuZXJpY190aW1lb3V0ID0gNjAwKkhaOwordW5zaWduZWQgaW50IG5mX2N0X2dlbmVyaWNfdGltZW91dCA9IDYwMCpIWjsKIAogc3RhdGljIGludCBnZW5lcmljX3BrdF90b190dXBsZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCXVuc2lnbmVkIGludCBkYXRhb2ZmLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fc2N0cC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fc2N0cC5jCmluZGV4IDNhNjAwZjcuLmNmNzk4ZTYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3NjdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19zY3RwLmMKQEAgLTYyLDE1ICs2MiwxNSBAQAogI2RlZmluZSBIT1VSUyAqIDYwIE1JTlMKICNkZWZpbmUgREFZUyAgKiAyNCBIT1VSUwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBuZl9jdF9zY3RwX3RpbWVvdXRfY2xvc2VkICAgICAgICAgICAgPSAgMTAgU0VDUzsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG5mX2N0X3NjdHBfdGltZW91dF9jb29raWVfd2FpdCAgICAgICA9ICAgMyBTRUNTOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbmZfY3Rfc2N0cF90aW1lb3V0X2Nvb2tpZV9lY2hvZWQgICAgID0gICAzIFNFQ1M7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBuZl9jdF9zY3RwX3RpbWVvdXRfZXN0YWJsaXNoZWQgICAgICAgPSAgIDUgREFZUzsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG5mX2N0X3NjdHBfdGltZW91dF9zaHV0ZG93bl9zZW50ICAgICA9IDMwMCBTRUNTIC8gMTAwMDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG5mX2N0X3NjdHBfdGltZW91dF9zaHV0ZG93bl9yZWNkICAgICA9IDMwMCBTRUNTIC8gMTAwMDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG5mX2N0X3NjdHBfdGltZW91dF9zaHV0ZG93bl9hY2tfc2VudCA9ICAgMyBTRUNTOworc3RhdGljIHVuc2lnbmVkIGludCBuZl9jdF9zY3RwX3RpbWVvdXRfY2xvc2VkICAgICAgICAgICAgPSAgMTAgU0VDUzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmZfY3Rfc2N0cF90aW1lb3V0X2Nvb2tpZV93YWl0ICAgICAgID0gICAzIFNFQ1M7CitzdGF0aWMgdW5zaWduZWQgaW50IG5mX2N0X3NjdHBfdGltZW91dF9jb29raWVfZWNob2VkICAgICA9ICAgMyBTRUNTOworc3RhdGljIHVuc2lnbmVkIGludCBuZl9jdF9zY3RwX3RpbWVvdXRfZXN0YWJsaXNoZWQgICAgICAgPSAgIDUgREFZUzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmZfY3Rfc2N0cF90aW1lb3V0X3NodXRkb3duX3NlbnQgICAgID0gMzAwIFNFQ1MgLyAxMDAwOworc3RhdGljIHVuc2lnbmVkIGludCBuZl9jdF9zY3RwX3RpbWVvdXRfc2h1dGRvd25fcmVjZCAgICAgPSAzMDAgU0VDUyAvIDEwMDA7CitzdGF0aWMgdW5zaWduZWQgaW50IG5mX2N0X3NjdHBfdGltZW91dF9zaHV0ZG93bl9hY2tfc2VudCA9ICAgMyBTRUNTOwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyAqIHNjdHBfdGltZW91dHNbXQorc3RhdGljIHVuc2lnbmVkIGludCAqIHNjdHBfdGltZW91dHNbXQogPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNDVFBfQ09OTlRSQUNLX05PTkUgICovCiAgICAgJm5mX2N0X3NjdHBfdGltZW91dF9jbG9zZWQsCSAgICAgICAgICAgLyogU0NUUF9DT05OVFJBQ0tfQ0xPU0VEICovCiAgICAgJm5mX2N0X3NjdHBfdGltZW91dF9jb29raWVfd2FpdCwgICAgICAgLyogU0NUUF9DT05OVFJBQ0tfQ09PS0lFX1dBSVQgKi8KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fdGNwLmMKaW5kZXggNjE2NzEzNy4uZGY5OTEzOCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fdGNwLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fdGNwLmMKQEAgLTkzLDIxICs5MywyMSBAQAogI2RlZmluZSBIT1VSUyAqIDYwIE1JTlMKICNkZWZpbmUgREFZUyAqIDI0IEhPVVJTCiAKLXVuc2lnbmVkIGxvbmcgbmZfY3RfdGNwX3RpbWVvdXRfc3luX3NlbnQgPSAgICAgIDIgTUlOUzsKLXVuc2lnbmVkIGxvbmcgbmZfY3RfdGNwX3RpbWVvdXRfc3luX3JlY3YgPSAgICAgNjAgU0VDUzsKLXVuc2lnbmVkIGxvbmcgbmZfY3RfdGNwX3RpbWVvdXRfZXN0YWJsaXNoZWQgPSAgIDUgREFZUzsKLXVuc2lnbmVkIGxvbmcgbmZfY3RfdGNwX3RpbWVvdXRfZmluX3dhaXQgPSAgICAgIDIgTUlOUzsKLXVuc2lnbmVkIGxvbmcgbmZfY3RfdGNwX3RpbWVvdXRfY2xvc2Vfd2FpdCA9ICAgNjAgU0VDUzsKLXVuc2lnbmVkIGxvbmcgbmZfY3RfdGNwX3RpbWVvdXRfbGFzdF9hY2sgPSAgICAgMzAgU0VDUzsKLXVuc2lnbmVkIGxvbmcgbmZfY3RfdGNwX3RpbWVvdXRfdGltZV93YWl0ID0gICAgIDIgTUlOUzsKLXVuc2lnbmVkIGxvbmcgbmZfY3RfdGNwX3RpbWVvdXRfY2xvc2UgPSAgICAgICAgMTAgU0VDUzsKK3Vuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF9zeW5fc2VudCA9ICAgICAgMiBNSU5TOwordW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X3N5bl9yZWN2ID0gICAgIDYwIFNFQ1M7Cit1bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfZXN0YWJsaXNoZWQgPSAgIDUgREFZUzsKK3Vuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF9maW5fd2FpdCA9ICAgICAgMiBNSU5TOwordW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X2Nsb3NlX3dhaXQgPSAgIDYwIFNFQ1M7Cit1bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfbGFzdF9hY2sgPSAgICAgMzAgU0VDUzsKK3Vuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF90aW1lX3dhaXQgPSAgICAgMiBNSU5TOwordW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X2Nsb3NlID0gICAgICAgIDEwIFNFQ1M7CiAKIC8qIFJGQzExMjIgc2F5cyB0aGUgUjIgbGltaXQgc2hvdWxkIGJlIGF0IGxlYXN0IDEwMCBzZWNvbmRzLgogICAgTGludXggdXNlcyAxNSBwYWNrZXRzIGFzIGxpbWl0LCB3aGljaCBjb3JyZXNwb25kcyAKICAgIHRvIH4xMy0zMG1pbiBkZXBlbmRpbmcgb24gUlRPLiAqLwotdW5zaWduZWQgbG9uZyBuZl9jdF90Y3BfdGltZW91dF9tYXhfcmV0cmFucyA9ICAgICA1IE1JTlM7Cit1bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfbWF4X3JldHJhbnMgPSAgICAgNSBNSU5TOwogIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgKiB0Y3BfdGltZW91dHNbXQorc3RhdGljIHVuc2lnbmVkIGludCAqIHRjcF90aW1lb3V0c1tdCiA9IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUQ1BfQ09OTlRSQUNLX05PTkUgKi8KICAgICAmbmZfY3RfdGNwX3RpbWVvdXRfc3luX3NlbnQsICAgICAgIC8qIFRDUF9DT05OVFJBQ0tfU1lOX1NFTlQsICovCiAgICAgJm5mX2N0X3RjcF90aW1lb3V0X3N5bl9yZWN2LCAgICAgICAvKiBUQ1BfQ09OTlRSQUNLX1NZTl9SRUNWLCAqLwpAQCAtOTg4LDcgKzk4OCw3IEBACiAJCSAgICAgICAgfHwgKCF0ZXN0X2JpdChJUFNfQVNTVVJFRF9CSVQsICZjb25udHJhY2stPnN0YXR1cykKIAkJICAgICAgICAgICAgJiYgY29ubnRyYWNrLT5wcm90by50Y3AubGFzdF9pbmRleCA9PSBUQ1BfQUNLX1NFVCkpCiAJCSAgICAmJiBudG9obCh0aC0+YWNrX3NlcSkgPT0gY29ubnRyYWNrLT5wcm90by50Y3AubGFzdF9lbmQpIHsKLQkJCS8qIFJTVCBzZW50IHRvIGludmFsaWQgU1lOIG9yIEFDSyB3ZSBoYWQgbGV0IHRyb3VnaAorCQkJLyogUlNUIHNlbnQgdG8gaW52YWxpZCBTWU4gb3IgQUNLIHdlIGhhZCBsZXQgdGhyb3VnaAogCQkJICogYXQgYSkgYW5kIGMpIGFib3ZlOgogCQkJICoKIAkJCSAqIGEpIFNZTiB3YXMgaW4gd2luZG93IHRoZW4KQEAgLTk5OSw3ICs5OTksNyBAQAogCQkJICogc2VnbWVudHMgd2UgaWdub3JlZC4gKi8KIAkJCWdvdG8gaW5fd2luZG93OwogCQl9Ci0JCS8qIEp1c3QgZmFsbCB0cm91Z2ggKi8KKwkJLyogSnVzdCBmYWxsIHRocm91Z2ggKi8KIAlkZWZhdWx0OgogCQkvKiBLZWVwIGNvbXBpbGVycyBoYXBweS4gKi8KIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b191ZHAuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5jCmluZGV4IDFhNTkyYTUuLjQyNjRkZDAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5jCkBAIC0yNyw4ICsyNyw4IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b2NvbC5oPgogCi11bnNpZ25lZCBsb25nIG5mX2N0X3VkcF90aW1lb3V0ID0gMzAqSFo7Ci11bnNpZ25lZCBsb25nIG5mX2N0X3VkcF90aW1lb3V0X3N0cmVhbSA9IDE4MCpIWjsKK3Vuc2lnbmVkIGludCBuZl9jdF91ZHBfdGltZW91dCA9IDMwKkhaOwordW5zaWduZWQgaW50IG5mX2N0X3VkcF90aW1lb3V0X3N0cmVhbSA9IDE4MCpIWjsKIAogc3RhdGljIGludCB1ZHBfcGt0X3RvX3R1cGxlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3RhbmRhbG9uZS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3RhbmRhbG9uZS5jCmluZGV4IGQxN2U0MmIuLjYxNzU5OWEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zdGFuZGFsb25lLmMKQEAgLTQzMSwyNSArNDMxLDI1IEBACiBleHRlcm4gdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsKIAogLyogRnJvbSBuZl9jb25udHJhY2tfcHJvdG9fdGNwLmMgKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIG5mX2N0X3RjcF90aW1lb3V0X3N5bl9zZW50OwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbmZfY3RfdGNwX3RpbWVvdXRfc3luX3JlY3Y7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBuZl9jdF90Y3BfdGltZW91dF9lc3RhYmxpc2hlZDsKLWV4dGVybiB1bnNpZ25lZCBsb25nIG5mX2N0X3RjcF90aW1lb3V0X2Zpbl93YWl0OwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbmZfY3RfdGNwX3RpbWVvdXRfY2xvc2Vfd2FpdDsKLWV4dGVybiB1bnNpZ25lZCBsb25nIG5mX2N0X3RjcF90aW1lb3V0X2xhc3RfYWNrOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbmZfY3RfdGNwX3RpbWVvdXRfdGltZV93YWl0OwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbmZfY3RfdGNwX3RpbWVvdXRfY2xvc2U7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBuZl9jdF90Y3BfdGltZW91dF9tYXhfcmV0cmFuczsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfc3luX3NlbnQ7CitleHRlcm4gdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X3N5bl9yZWN2OworZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF9lc3RhYmxpc2hlZDsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfZmluX3dhaXQ7CitleHRlcm4gdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X2Nsb3NlX3dhaXQ7CitleHRlcm4gdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X2xhc3RfYWNrOworZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF90aW1lX3dhaXQ7CitleHRlcm4gdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X2Nsb3NlOworZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF9tYXhfcmV0cmFuczsKIGV4dGVybiBpbnQgbmZfY3RfdGNwX2xvb3NlOwogZXh0ZXJuIGludCBuZl9jdF90Y3BfYmVfbGliZXJhbDsKIGV4dGVybiBpbnQgbmZfY3RfdGNwX21heF9yZXRyYW5zOwogCiAvKiBGcm9tIG5mX2Nvbm50cmFja19wcm90b191ZHAuYyAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbmZfY3RfdWRwX3RpbWVvdXQ7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBuZl9jdF91ZHBfdGltZW91dF9zdHJlYW07CitleHRlcm4gdW5zaWduZWQgaW50IG5mX2N0X3VkcF90aW1lb3V0OworZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jdF91ZHBfdGltZW91dF9zdHJlYW07CiAKIC8qIEZyb20gbmZfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMuYyAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbmZfY3RfZ2VuZXJpY190aW1lb3V0OworZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jdF9nZW5lcmljX3RpbWVvdXQ7CiAKIC8qIExvZyBpbnZhbGlkIHBhY2tldHMgb2YgYSBnaXZlbiBwcm90b2NvbCAqLwogc3RhdGljIGludCBsb2dfaW52YWxpZF9wcm90b19taW4gPSAwOwpAQCAtODIxLDcgKzgyMSw3IEBACiAKIC8qIFNvbWUgbW9kdWxlcyBuZWVkIHVzLCBidXQgZG9uJ3QgZGVwZW5kIGRpcmVjdGx5IG9uIGFueSBzeW1ib2wuCiAgICBUaGV5IHNob3VsZCBjYWxsIHRoaXMuICovCi12b2lkIG5lZWRfbmZfY29ubnRyYWNrKHZvaWQpCit2b2lkIG5lZWRfY29ubnRyYWNrKHZvaWQpCiB7CiB9CiAKQEAgLTg0MSw3ICs4NDEsNyBAQAogRVhQT1JUX1NZTUJPTChuZl9jdF9pbnZlcnRfdHVwbGVwcik7CiBFWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19hbHRlcl9yZXBseSk7CiBFWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19kZXN0cm95ZWQpOwotRVhQT1JUX1NZTUJPTChuZWVkX25mX2Nvbm50cmFjayk7CitFWFBPUlRfU1lNQk9MKG5lZWRfY29ubnRyYWNrKTsKIEVYUE9SVF9TWU1CT0wobmZfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3Rlcik7CiBFWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3Rlcik7CiBFWFBPUlRfU1lNQk9MKG5mX2N0X2l0ZXJhdGVfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGluay5jIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmsuYwppbmRleCA5NWZkZjA0Li5mNjA2M2U4IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGluay5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmMKQEAgLTIxMiw3ICsyMTIsNyBAQAogfQogCiAvKiBQcm9jZXNzIG9uZSBjb21wbGV0ZSBuZm5ldGxpbmsgbWVzc2FnZS4gKi8KLXN0YXRpYyBpbmxpbmUgaW50IG5mbmV0bGlua19yY3ZfbXNnKHN0cnVjdCBza19idWZmICpza2IsCitzdGF0aWMgaW50IG5mbmV0bGlua19yY3ZfbXNnKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgIHN0cnVjdCBubG1zZ2hkciAqbmxoLCBpbnQgKmVycnApCiB7CiAJc3RydWN0IG5mbmxfY2FsbGJhY2sgKm5jOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94X3RhYmxlcy5jIGIvbmV0L25ldGZpbHRlci94X3RhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ODE3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3hfdGFibGVzLmMKQEAgLTAsMCArMSw2MjQgQEAKKy8qCisgKiB4X3RhYmxlcyBjb3JlIC0gQmFja2VuZCBmb3Ige2lwLGlwNixhcnB9X3RhYmxlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA2IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIEJhc2VkIG9uIGV4aXN0aW5nIGlwX3RhYmxlcyBjb2RlIHdoaWNoIGlzCisgKiAgIENvcHlyaWdodCAoQykgMTk5OSBQYXVsIGBSdXN0eScgUnVzc2VsbCAmIE1pY2hhZWwgSi4gTmV1bGluZworICogICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYXJwLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJbaXAsaXA2LGFycF1fdGFibGVzIGJhY2tlbmQgbW9kdWxlIik7CisKKyNkZWZpbmUgU01QX0FMSUdOKHgpICgoKHgpICsgU01QX0NBQ0hFX0JZVEVTLTEpICYgfihTTVBfQ0FDSEVfQllURVMtMSkpCisKK3N0cnVjdCB4dF9hZiB7CisJc3RydWN0IHNlbWFwaG9yZSBtdXRleDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1hdGNoOworCXN0cnVjdCBsaXN0X2hlYWQgdGFyZ2V0OworCXN0cnVjdCBsaXN0X2hlYWQgdGFibGVzOworfTsKKworc3RhdGljIHN0cnVjdCB4dF9hZiAqeHQ7CisKKyNpZmRlZiBERUJVR19JUF9GSVJFV0FMTF9VU0VSCisjZGVmaW5lIGR1cHJpbnRmKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBkdXByaW50Zihmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworZW51bSB7CisJVEFCTEUsCisJVEFSR0VULAorCU1BVENILAorfTsKKworLyogUmVnaXN0cmF0aW9uIGhvb2tzIGZvciB0YXJnZXRzLiAqLworaW50Cit4dF9yZWdpc3Rlcl90YXJnZXQoaW50IGFmLCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQpCit7CisJaW50IHJldDsKKworCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmeHRbYWZdLm11dGV4KTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisJbGlzdF9hZGQoJnRhcmdldC0+bGlzdCwgJnh0W2FmXS50YXJnZXQpOworCXVwKCZ4dFthZl0ubXV0ZXgpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHh0X3JlZ2lzdGVyX3RhcmdldCk7CisKK3ZvaWQKK3h0X3VucmVnaXN0ZXJfdGFyZ2V0KGludCBhZiwgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0KQoreworCWRvd24oJnh0W2FmXS5tdXRleCk7CisJTElTVF9ERUxFVEUoJnh0W2FmXS50YXJnZXQsIHRhcmdldCk7CisJdXAoJnh0W2FmXS5tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKHh0X3VucmVnaXN0ZXJfdGFyZ2V0KTsKKworaW50Cit4dF9yZWdpc3Rlcl9tYXRjaChpbnQgYWYsIHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gpCit7CisJaW50IHJldDsKKworCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmeHRbYWZdLm11dGV4KTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwlsaXN0X2FkZCgmbWF0Y2gtPmxpc3QsICZ4dFthZl0ubWF0Y2gpOworCXVwKCZ4dFthZl0ubXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woeHRfcmVnaXN0ZXJfbWF0Y2gpOworCit2b2lkCit4dF91bnJlZ2lzdGVyX21hdGNoKGludCBhZiwgc3RydWN0IHh0X21hdGNoICptYXRjaCkKK3sKKwlkb3duKCZ4dFthZl0ubXV0ZXgpOworCUxJU1RfREVMRVRFKCZ4dFthZl0ubWF0Y2gsIG1hdGNoKTsKKwl1cCgmeHRbYWZdLm11dGV4KTsKK30KK0VYUE9SVF9TWU1CT0woeHRfdW5yZWdpc3Rlcl9tYXRjaCk7CisKKworLyoKKyAqIFRoZXNlIGFyZSB3ZWlyZCwgYnV0IG1vZHVsZSBsb2FkaW5nIG11c3Qgbm90IGJlIGRvbmUgd2l0aCBtdXRleAorICogaGVsZCAoc2luY2UgdGhleSB3aWxsIHJlZ2lzdGVyKSwgYW5kIHdlIGhhdmUgdG8gaGF2ZSBhIHNpbmdsZQorICogZnVuY3Rpb24gdG8gdXNlIHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKCkuCisgKi8KKworLyogRmluZCBtYXRjaCwgZ3JhYnMgcmVmLiAgUmV0dXJucyBFUlJfUFRSKCkgb24gZXJyb3IuICovCitzdHJ1Y3QgeHRfbWF0Y2ggKnh0X2ZpbmRfbWF0Y2goaW50IGFmLCBjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbikKK3sKKwlzdHJ1Y3QgeHRfbWF0Y2ggKm07CisJaW50IGVyciA9IDA7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ4dFthZl0ubXV0ZXgpICE9IDApCisJCXJldHVybiBFUlJfUFRSKC1FSU5UUik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG0sICZ4dFthZl0ubWF0Y2gsIGxpc3QpIHsKKwkJaWYgKHN0cmNtcChtLT5uYW1lLCBuYW1lKSA9PSAwKSB7CisJCQlpZiAobS0+cmV2aXNpb24gPT0gcmV2aXNpb24pIHsKKwkJCQlpZiAodHJ5X21vZHVsZV9nZXQobS0+bWUpKSB7CisJCQkJCXVwKCZ4dFthZl0ubXV0ZXgpOworCQkJCQlyZXR1cm4gbTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQllcnIgPSAtRVBST1RPVFlQRTsgLyogRm91bmQgc29tZXRoaW5nLiAqLworCQl9CisJfQorCXVwKCZ4dFthZl0ubXV0ZXgpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CitFWFBPUlRfU1lNQk9MKHh0X2ZpbmRfbWF0Y2gpOworCisvKiBGaW5kIHRhcmdldCwgZ3JhYnMgcmVmLiAgUmV0dXJucyBFUlJfUFRSKCkgb24gZXJyb3IuICovCitzdHJ1Y3QgeHRfdGFyZ2V0ICp4dF9maW5kX3RhcmdldChpbnQgYWYsIGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uKQoreworCXN0cnVjdCB4dF90YXJnZXQgKnQ7CisJaW50IGVyciA9IDA7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ4dFthZl0ubXV0ZXgpICE9IDApCisJCXJldHVybiBFUlJfUFRSKC1FSU5UUik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZ4dFthZl0udGFyZ2V0LCBsaXN0KSB7CisJCWlmIChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJaWYgKHQtPnJldmlzaW9uID09IHJldmlzaW9uKSB7CisJCQkJaWYgKHRyeV9tb2R1bGVfZ2V0KHQtPm1lKSkgeworCQkJCQl1cCgmeHRbYWZdLm11dGV4KTsKKwkJCQkJcmV0dXJuIHQ7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJZXJyID0gLUVQUk9UT1RZUEU7IC8qIEZvdW5kIHNvbWV0aGluZy4gKi8KKwkJfQorCX0KKwl1cCgmeHRbYWZdLm11dGV4KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorRVhQT1JUX1NZTUJPTCh4dF9maW5kX3RhcmdldCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICp4dF9wcmVmaXhbTlBST1RPXSA9IHsKKwlbQUZfSU5FVF0gCT0gImlwdF8lcyIsCisJW0FGX0lORVQ2XSAJPSAiaXA2dF8lcyIsCisJW05GX0FSUF0JPSAiYXJwdF8lcyIsCit9OworCitzdHJ1Y3QgeHRfdGFyZ2V0ICp4dF9yZXF1ZXN0X2ZpbmRfdGFyZ2V0KGludCBhZiwgY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24pCit7CisJc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0OworCisJdGFyZ2V0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeHRfZmluZF90YXJnZXQoYWYsIG5hbWUsIHJldmlzaW9uKSwKKwkJCQkJIHh0X3ByZWZpeFthZl0sIG5hbWUpOworCWlmIChJU19FUlIodGFyZ2V0KSB8fCAhdGFyZ2V0KQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gdGFyZ2V0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoeHRfcmVxdWVzdF9maW5kX3RhcmdldCk7CisKK3N0YXRpYyBpbnQgbWF0Y2hfcmV2Zm4oaW50IGFmLCBjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbiwgaW50ICpiZXN0cCkKK3sKKwlzdHJ1Y3QgeHRfbWF0Y2ggKm07CisJaW50IGhhdmVfcmV2ID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobSwgJnh0W2FmXS5tYXRjaCwgbGlzdCkgeworCQlpZiAoc3RyY21wKG0tPm5hbWUsIG5hbWUpID09IDApIHsKKwkJCWlmIChtLT5yZXZpc2lvbiA+ICpiZXN0cCkKKwkJCQkqYmVzdHAgPSBtLT5yZXZpc2lvbjsKKwkJCWlmIChtLT5yZXZpc2lvbiA9PSByZXZpc2lvbikKKwkJCQloYXZlX3JldiA9IDE7CisJCX0KKwl9CisJcmV0dXJuIGhhdmVfcmV2OworfQorCitzdGF0aWMgaW50IHRhcmdldF9yZXZmbihpbnQgYWYsIGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uLCBpbnQgKmJlc3RwKQoreworCXN0cnVjdCB4dF90YXJnZXQgKnQ7CisJaW50IGhhdmVfcmV2ID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJnh0W2FmXS50YXJnZXQsIGxpc3QpIHsKKwkJaWYgKHN0cmNtcCh0LT5uYW1lLCBuYW1lKSA9PSAwKSB7CisJCQlpZiAodC0+cmV2aXNpb24gPiAqYmVzdHApCisJCQkJKmJlc3RwID0gdC0+cmV2aXNpb247CisJCQlpZiAodC0+cmV2aXNpb24gPT0gcmV2aXNpb24pCisJCQkJaGF2ZV9yZXYgPSAxOworCQl9CisJfQorCXJldHVybiBoYXZlX3JldjsKK30KKworLyogUmV0dXJucyB0cnVlIG9yIGZhbHNlIChpZiBubyBzdWNoIGV4dGVuc2lvbiBhdCBhbGwpICovCitpbnQgeHRfZmluZF9yZXZpc2lvbihpbnQgYWYsIGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uLCBpbnQgdGFyZ2V0LAorCQkgICAgIGludCAqZXJyKQoreworCWludCBoYXZlX3JldiwgYmVzdCA9IC0xOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmeHRbYWZdLm11dGV4KSAhPSAwKSB7CisJCSplcnIgPSAtRUlOVFI7CisJCXJldHVybiAxOworCX0KKwlpZiAodGFyZ2V0ID09IDEpCisJCWhhdmVfcmV2ID0gdGFyZ2V0X3JldmZuKGFmLCBuYW1lLCByZXZpc2lvbiwgJmJlc3QpOworCWVsc2UKKwkJaGF2ZV9yZXYgPSBtYXRjaF9yZXZmbihhZiwgbmFtZSwgcmV2aXNpb24sICZiZXN0KTsKKwl1cCgmeHRbYWZdLm11dGV4KTsKKworCS8qIE5vdGhpbmcgYXQgYWxsPyAgUmV0dXJuIDAgdG8gdHJ5IGxvYWRpbmcgbW9kdWxlLiAqLworCWlmIChiZXN0ID09IC0xKSB7CisJCSplcnIgPSAtRU5PRU5UOworCQlyZXR1cm4gMDsKKwl9CisKKwkqZXJyID0gYmVzdDsKKwlpZiAoIWhhdmVfcmV2KQorCQkqZXJyID0gLUVQUk9UT05PU1VQUE9SVDsKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHh0X2ZpbmRfcmV2aXNpb24pOworCitzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqeHRfYWxsb2NfdGFibGVfaW5mbyh1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbzsKKwlpbnQgY3B1OworCisJLyogUGVkYW50cnk6IHByZXZlbnQgdGhlbSBmcm9tIGhpdHRpbmcgQlVHKCkgaW4gdm1hbGxvYy5jIC0tUlIgKi8KKwlpZiAoKFNNUF9BTElHTihzaXplKSA+PiBQQUdFX1NISUZUKSArIDIgPiBudW1fcGh5c3BhZ2VzKQorCQlyZXR1cm4gTlVMTDsKKworCW5ld2luZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgeHRfdGFibGVfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghbmV3aW5mbykKKwkJcmV0dXJuIE5VTEw7CisKKwluZXdpbmZvLT5zaXplID0gc2l6ZTsKKworCWZvcl9lYWNoX2NwdShjcHUpIHsKKwkJaWYgKHNpemUgPD0gUEFHRV9TSVpFKQorCQkJbmV3aW5mby0+ZW50cmllc1tjcHVdID0ga21hbGxvY19ub2RlKHNpemUsCisJCQkJCQkJR0ZQX0tFUk5FTCwKKwkJCQkJCQljcHVfdG9fbm9kZShjcHUpKTsKKwkJZWxzZQorCQkJbmV3aW5mby0+ZW50cmllc1tjcHVdID0gdm1hbGxvY19ub2RlKHNpemUsCisJCQkJCQkJY3B1X3RvX25vZGUoY3B1KSk7CisKKwkJaWYgKG5ld2luZm8tPmVudHJpZXNbY3B1XSA9PSBOVUxMKSB7CisJCQl4dF9mcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiBuZXdpbmZvOworfQorRVhQT1JUX1NZTUJPTCh4dF9hbGxvY190YWJsZV9pbmZvKTsKKwordm9pZCB4dF9mcmVlX3RhYmxlX2luZm8oc3RydWN0IHh0X3RhYmxlX2luZm8gKmluZm8pCit7CisJaW50IGNwdTsKKworCWZvcl9lYWNoX2NwdShjcHUpIHsKKwkJaWYgKGluZm8tPnNpemUgPD0gUEFHRV9TSVpFKQorCQkJa2ZyZWUoaW5mby0+ZW50cmllc1tjcHVdKTsKKwkJZWxzZQorCQkJdmZyZWUoaW5mby0+ZW50cmllc1tjcHVdKTsKKwl9CisJa2ZyZWUoaW5mbyk7Cit9CitFWFBPUlRfU1lNQk9MKHh0X2ZyZWVfdGFibGVfaW5mbyk7CisKKy8qIEZpbmQgdGFibGUgYnkgbmFtZSwgZ3JhYnMgbXV0ZXggJiByZWYuICBSZXR1cm5zIEVSUl9QVFIoKSBvbiBlcnJvci4gKi8KK3N0cnVjdCB4dF90YWJsZSAqeHRfZmluZF90YWJsZV9sb2NrKGludCBhZiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgeHRfdGFibGUgKnQ7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ4dFthZl0ubXV0ZXgpICE9IDApCisJCXJldHVybiBFUlJfUFRSKC1FSU5UUik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZ4dFthZl0udGFibGVzLCBsaXN0KQorCQlpZiAoc3RyY21wKHQtPm5hbWUsIG5hbWUpID09IDAgJiYgdHJ5X21vZHVsZV9nZXQodC0+bWUpKQorCQkJcmV0dXJuIHQ7CisJdXAoJnh0W2FmXS5tdXRleCk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh4dF9maW5kX3RhYmxlX2xvY2spOworCit2b2lkIHh0X3RhYmxlX3VubG9jayhzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlKQoreworCXVwKCZ4dFt0YWJsZS0+YWZdLm11dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHh0X3RhYmxlX3VubG9jayk7CisKKworc3RydWN0IHh0X3RhYmxlX2luZm8gKgoreHRfcmVwbGFjZV90YWJsZShzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlLAorCSAgICAgIHVuc2lnbmVkIGludCBudW1fY291bnRlcnMsCisJICAgICAgc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm8sCisJICAgICAgaW50ICplcnJvcikKK3sKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqb2xkaW5mbywgKnByaXZhdGU7CisKKwkvKiBEbyB0aGUgc3Vic3RpdHV0aW9uLiAqLworCXdyaXRlX2xvY2tfYmgoJnRhYmxlLT5sb2NrKTsKKwlwcml2YXRlID0gdGFibGUtPnByaXZhdGU7CisJLyogQ2hlY2sgaW5zaWRlIGxvY2s6IGlzIHRoZSBvbGQgbnVtYmVyIGNvcnJlY3Q/ICovCisJaWYgKG51bV9jb3VudGVycyAhPSBwcml2YXRlLT5udW1iZXIpIHsKKwkJZHVwcmludGYoIm51bV9jb3VudGVycyAhPSB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyICgldS8ldSlcbiIsCisJCQkgbnVtX2NvdW50ZXJzLCBwcml2YXRlLT5udW1iZXIpOworCQl3cml0ZV91bmxvY2tfYmgoJnRhYmxlLT5sb2NrKTsKKwkJKmVycm9yID0gLUVBR0FJTjsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW9sZGluZm8gPSBwcml2YXRlOworCXRhYmxlLT5wcml2YXRlID0gbmV3aW5mbzsKKwluZXdpbmZvLT5pbml0aWFsX2VudHJpZXMgPSBvbGRpbmZvLT5pbml0aWFsX2VudHJpZXM7CisJd3JpdGVfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CisKKwlyZXR1cm4gb2xkaW5mbzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHh0X3JlcGxhY2VfdGFibGUpOworCitpbnQgeHRfcmVnaXN0ZXJfdGFibGUoc3RydWN0IHh0X3RhYmxlICp0YWJsZSwKKwkJICAgICAgc3RydWN0IHh0X3RhYmxlX2luZm8gKmJvb3RzdHJhcCwKKwkJICAgICAgc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm8pCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZTsKKworCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmeHRbdGFibGUtPmFmXS5tdXRleCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJLyogRG9uJ3QgYXV0b2xvYWQ6IHdlJ2QgZWF0IG91ciB0YWlsLi4uICovCisJaWYgKGxpc3RfbmFtZWRfZmluZCgmeHRbdGFibGUtPmFmXS50YWJsZXMsIHRhYmxlLT5uYW1lKSkgeworCQlyZXQgPSAtRUVYSVNUOworCQlnb3RvIHVubG9jazsKKwl9CisKKwkvKiBTaW1wbGlmaWVzIHJlcGxhY2VfdGFibGUgY29kZS4gKi8KKwl0YWJsZS0+cHJpdmF0ZSA9IGJvb3RzdHJhcDsKKwlpZiAoIXh0X3JlcGxhY2VfdGFibGUodGFibGUsIDAsIG5ld2luZm8sICZyZXQpKQorCQlnb3RvIHVubG9jazsKKworCXByaXZhdGUgPSB0YWJsZS0+cHJpdmF0ZTsKKwlkdXByaW50ZigidGFibGUtPnByaXZhdGUtPm51bWJlciA9ICV1XG4iLCBwcml2YXRlLT5udW1iZXIpOworCisJLyogc2F2ZSBudW1iZXIgb2YgaW5pdGlhbCBlbnRyaWVzICovCisJcHJpdmF0ZS0+aW5pdGlhbF9lbnRyaWVzID0gcHJpdmF0ZS0+bnVtYmVyOworCisJcndsb2NrX2luaXQoJnRhYmxlLT5sb2NrKTsKKwlsaXN0X3ByZXBlbmQoJnh0W3RhYmxlLT5hZl0udGFibGVzLCB0YWJsZSk7CisKKwlyZXQgPSAwOworIHVubG9jazoKKwl1cCgmeHRbdGFibGUtPmFmXS5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHh0X3JlZ2lzdGVyX3RhYmxlKTsKKwordm9pZCAqeHRfdW5yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlKQoreworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlOworCisJZG93bigmeHRbdGFibGUtPmFmXS5tdXRleCk7CisJcHJpdmF0ZSA9IHRhYmxlLT5wcml2YXRlOworCUxJU1RfREVMRVRFKCZ4dFt0YWJsZS0+YWZdLnRhYmxlcywgdGFibGUpOworCXVwKCZ4dFt0YWJsZS0+YWZdLm11dGV4KTsKKworCXJldHVybiBwcml2YXRlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoeHRfdW5yZWdpc3Rlcl90YWJsZSk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGNoYXIgKnh0X3Byb3RvX3ByZWZpeFtOUFJPVE9dID0geworCVtBRl9JTkVUXQk9ICJpcCIsCisJW0FGX0lORVQ2XQk9ICJpcDYiLAorCVtORl9BUlBdCT0gImFycCIsCit9OworCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqeHRfZ2V0X2lkeChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gbGlzdC0+bmV4dDsKKworCWlmICghaGVhZCB8fCBsaXN0X2VtcHR5KGxpc3QpKQorCQlyZXR1cm4gTlVMTDsKKworCXdoaWxlIChwb3MgJiYgKGhlYWQgPSBoZWFkLT5uZXh0KSkgeworCQlpZiAoaGVhZCA9PSBsaXN0KQorCQkJcmV0dXJuIE5VTEw7CisJCXBvcy0tOworCX0KKwlyZXR1cm4gcG9zID8gTlVMTCA6IGhlYWQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICp0eXBlMmxpc3QodV9pbnQxNl90IGFmLCB1X2ludDE2X3QgdHlwZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBUQVJHRVQ6CisJCWxpc3QgPSAmeHRbYWZdLnRhcmdldDsKKwkJYnJlYWs7CisJY2FzZSBNQVRDSDoKKwkJbGlzdCA9ICZ4dFthZl0ubWF0Y2g7CisJCWJyZWFrOworCWNhc2UgVEFCTEU6CisJCWxpc3QgPSAmeHRbYWZdLnRhYmxlczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbGlzdCA9IE5VTEw7CisJCWJyZWFrOworCX0KKworCXJldHVybiBsaXN0OworfQorCitzdGF0aWMgdm9pZCAqeHRfdGd0X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSAoc3RydWN0IHByb2NfZGlyX2VudHJ5ICopIHNlcS0+cHJpdmF0ZTsKKwl1X2ludDE2X3QgYWYgPSAodW5zaWduZWQgbG9uZylwZGUtPmRhdGEgJiAweGZmZmY7CisJdV9pbnQxNl90IHR5cGUgPSAodW5zaWduZWQgbG9uZylwZGUtPmRhdGEgPj4gMTY7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKworCWlmIChhZiA+PSBOUFJPVE8pCisJCXJldHVybiBOVUxMOworCisJbGlzdCA9IHR5cGUybGlzdChhZiwgdHlwZSk7CisJaWYgKCFsaXN0KQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnh0W2FmXS5tdXRleCkgIT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJCisJcmV0dXJuIHh0X2dldF9pZHgobGlzdCwgc2VxLCAqcG9zKTsKK30KKworc3RhdGljIHZvaWQgKnh0X3RndF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBzZXEtPnByaXZhdGU7CisJdV9pbnQxNl90IGFmID0gKHVuc2lnbmVkIGxvbmcpcGRlLT5kYXRhICYgMHhmZmZmOworCXVfaW50MTZfdCB0eXBlID0gKHVuc2lnbmVkIGxvbmcpcGRlLT5kYXRhID4+IDE2OworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisKKwlpZiAoYWYgPj0gTlBST1RPKQorCQlyZXR1cm4gTlVMTDsKKwkKKwlsaXN0ID0gdHlwZTJsaXN0KGFmLCB0eXBlKTsKKwlpZiAoIWxpc3QpCisJCXJldHVybiBOVUxMOworCisJKCpwb3MpKys7CisJcmV0dXJuIHh0X2dldF9pZHgobGlzdCwgc2VxLCAqcG9zKTsKK30KKworc3RhdGljIHZvaWQgeHRfdGd0X3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gc2VxLT5wcml2YXRlOworCXVfaW50MTZfdCBhZiA9ICh1bnNpZ25lZCBsb25nKXBkZS0+ZGF0YSAmIDB4ZmZmZjsKKworCXVwKCZ4dFthZl0ubXV0ZXgpOworfQorCitzdGF0aWMgaW50IHh0X25hbWVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJY2hhciAqbmFtZSA9IChjaGFyICopdiArIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKTsKKworCWlmIChzdHJsZW4obmFtZSkpCisJCXJldHVybiBzZXFfcHJpbnRmKHNlcSwgIiVzXG4iLCBuYW1lKTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHh0X3RndF9zZXFfb3BzID0geworCS5zdGFydAk9IHh0X3RndF9zZXFfc3RhcnQsCisJLm5leHQJPSB4dF90Z3Rfc2VxX25leHQsCisJLnN0b3AJPSB4dF90Z3Rfc2VxX3N0b3AsCisJLnNob3cJPSB4dF9uYW1lX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCB4dF90Z3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc2VxX29wZW4oZmlsZSwgJnh0X3RndF9zZXFfb3BzKTsKKwlpZiAoIXJldCkgeworCQlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwkJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoaW5vZGUpOworCisJCXNlcS0+cHJpdmF0ZSA9IHBkZTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB4dF9maWxlX29wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm9wZW4JID0geHRfdGd0X29wZW4sCisJLnJlYWQJID0gc2VxX3JlYWQsCisJLmxsc2VlawkgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKKyNkZWZpbmUgRk9STUFUX1RBQkxFUwkiX3RhYmxlc19uYW1lcyIKKyNkZWZpbmUJRk9STUFUX01BVENIRVMJIl90YWJsZXNfbWF0Y2hlcyIKKyNkZWZpbmUgRk9STUFUX1RBUkdFVFMgCSJfdGFibGVzX3RhcmdldHMiCisKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCitpbnQgeHRfcHJvdG9faW5pdChpbnQgYWYpCit7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwljaGFyIGJ1ZltYVF9GVU5DVElPTl9NQVhOQU1FTEVOXTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7CisjZW5kaWYKKworCWlmIChhZiA+PSBOUFJPVE8pCisJCXJldHVybiAtRUlOVkFMOworCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXN0cmxjcHkoYnVmLCB4dF9wcm90b19wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CisJc3RybGNhdChidWYsIEZPUk1BVF9UQUJMRVMsIHNpemVvZihidWYpKTsKKwlwcm9jID0gcHJvY19uZXRfZm9wc19jcmVhdGUoYnVmLCAwNDQwLCAmeHRfZmlsZV9vcHMpOworCWlmICghcHJvYykKKwkJZ290byBvdXQ7CisJcHJvYy0+ZGF0YSA9ICh2b2lkICopICgodW5zaWduZWQgbG9uZykgYWYgfCAoVEFCTEUgPDwgMTYpKTsKKworCisJc3RybGNweShidWYsIHh0X3Byb3RvX3ByZWZpeFthZl0sIHNpemVvZihidWYpKTsKKwlzdHJsY2F0KGJ1ZiwgRk9STUFUX01BVENIRVMsIHNpemVvZihidWYpKTsKKwlwcm9jID0gcHJvY19uZXRfZm9wc19jcmVhdGUoYnVmLCAwNDQwLCAmeHRfZmlsZV9vcHMpOworCWlmICghcHJvYykKKwkJZ290byBvdXRfcmVtb3ZlX3RhYmxlczsKKwlwcm9jLT5kYXRhID0gKHZvaWQgKikgKCh1bnNpZ25lZCBsb25nKSBhZiB8IChNQVRDSCA8PCAxNikpOworCisJc3RybGNweShidWYsIHh0X3Byb3RvX3ByZWZpeFthZl0sIHNpemVvZihidWYpKTsKKwlzdHJsY2F0KGJ1ZiwgRk9STUFUX1RBUkdFVFMsIHNpemVvZihidWYpKTsKKwlwcm9jID0gcHJvY19uZXRfZm9wc19jcmVhdGUoYnVmLCAwNDQwLCAmeHRfZmlsZV9vcHMpOworCWlmICghcHJvYykKKwkJZ290byBvdXRfcmVtb3ZlX21hdGNoZXM7CisJcHJvYy0+ZGF0YSA9ICh2b2lkICopICgodW5zaWduZWQgbG9uZykgYWYgfCAoVEFSR0VUIDw8IDE2KSk7CisjZW5kaWYKKworCXJldHVybiAwOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK291dF9yZW1vdmVfbWF0Y2hlczoKKwlzdHJsY3B5KGJ1ZiwgeHRfcHJvdG9fcHJlZml4W2FmXSwgc2l6ZW9mKGJ1ZikpOworCXN0cmxjYXQoYnVmLCBGT1JNQVRfTUFUQ0hFUywgc2l6ZW9mKGJ1ZikpOworCXByb2NfbmV0X3JlbW92ZShidWYpOworCitvdXRfcmVtb3ZlX3RhYmxlczoKKwlzdHJsY3B5KGJ1ZiwgeHRfcHJvdG9fcHJlZml4W2FmXSwgc2l6ZW9mKGJ1ZikpOworCXN0cmxjYXQoYnVmLCBGT1JNQVRfVEFCTEVTLCBzaXplb2YoYnVmKSk7CisJcHJvY19uZXRfcmVtb3ZlKGJ1Zik7CitvdXQ6CisJcmV0dXJuIC0xOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MX0dQTCh4dF9wcm90b19pbml0KTsKKwordm9pZCB4dF9wcm90b19maW5pKGludCBhZikKK3sKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCWNoYXIgYnVmW1hUX0ZVTkNUSU9OX01BWE5BTUVMRU5dOworCisJc3RybGNweShidWYsIHh0X3Byb3RvX3ByZWZpeFthZl0sIHNpemVvZihidWYpKTsKKwlzdHJsY2F0KGJ1ZiwgRk9STUFUX1RBQkxFUywgc2l6ZW9mKGJ1ZikpOworCXByb2NfbmV0X3JlbW92ZShidWYpOworCisJc3RybGNweShidWYsIHh0X3Byb3RvX3ByZWZpeFthZl0sIHNpemVvZihidWYpKTsKKwlzdHJsY2F0KGJ1ZiwgRk9STUFUX1RBUkdFVFMsIHNpemVvZihidWYpKTsKKwlwcm9jX25ldF9yZW1vdmUoYnVmKTsKKworCXN0cmxjcHkoYnVmLCB4dF9wcm90b19wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CisJc3RybGNhdChidWYsIEZPUk1BVF9NQVRDSEVTLCBzaXplb2YoYnVmKSk7CisJcHJvY19uZXRfcmVtb3ZlKGJ1Zik7CisjZW5kaWYgLypDT05GSUdfUFJPQ19GUyovCit9CitFWFBPUlRfU1lNQk9MX0dQTCh4dF9wcm90b19maW5pKTsKKworCitzdGF0aWMgaW50IF9faW5pdCB4dF9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwl4dCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB4dF9hZikgKiBOUFJPVE8sIEdGUF9LRVJORUwpOworCWlmICgheHQpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IE5QUk9UTzsgaSsrKSB7CisJCWluaXRfTVVURVgoJnh0W2ldLm11dGV4KTsKKwkJSU5JVF9MSVNUX0hFQUQoJnh0W2ldLnRhcmdldCk7CisJCUlOSVRfTElTVF9IRUFEKCZ4dFtpXS5tYXRjaCk7CisJCUlOSVRfTElTVF9IRUFEKCZ4dFtpXS50YWJsZXMpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHh0X2Zpbmkodm9pZCkKK3sKKwlrZnJlZSh4dCk7Cit9CisKK21vZHVsZV9pbml0KHh0X2luaXQpOworbW9kdWxlX2V4aXQoeHRfZmluaSk7CisKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfQ0xBU1NJRlkuYyBiL25ldC9uZXRmaWx0ZXIveHRfQ0xBU1NJRlkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGVlMjY2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci94dF9DTEFTU0lGWS5jCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogVGhpcyBpcyBhIG1vZHVsZSB3aGljaCBpcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBza2ItPnByaW9yaXR5IGZpZWxkCisgKiBvZiBhbiBza2IgZm9yIHFkaXNjIGNsYXNzaWZpY2F0aW9uLgorICovCisKKy8qIChDKSAyMDAxLTIwMDIgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9DTEFTU0lGWS5oPgorCitNT0RVTEVfQVVUSE9SKCJQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgcWRpc2MgY2xhc3NpZmljYXRpb24gdGFyZ2V0IG1vZHVsZSIpOworTU9EVUxFX0FMSUFTKCJpcHRfQ0xBU1NJRlkiKTsKKworc3RhdGljIHVuc2lnbmVkIGludAordGFyZ2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKKyAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKKyAgICAgICBjb25zdCB2b2lkICp0YXJnaW5mbywKKyAgICAgICB2b2lkICp1c2VyaW5mbykKK3sKKwljb25zdCBzdHJ1Y3QgeHRfY2xhc3NpZnlfdGFyZ2V0X2luZm8gKmNsaW5mbyA9IHRhcmdpbmZvOworCisJaWYgKCgqcHNrYiktPnByaW9yaXR5ICE9IGNsaW5mby0+cHJpb3JpdHkpCisJCSgqcHNrYiktPnByaW9yaXR5ID0gY2xpbmZvLT5wcmlvcml0eTsKKworCXJldHVybiBYVF9DT05USU5VRTsKK30KKworc3RhdGljIGludAorY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisgICAgICAgICAgIGNvbnN0IHZvaWQgKmUsCisgICAgICAgICAgIHZvaWQgKnRhcmdpbmZvLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWlmICh0YXJnaW5mb3NpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9jbGFzc2lmeV90YXJnZXRfaW5mbykpKXsKKwkJcHJpbnRrKEtFUk5fRVJSICJDTEFTU0lGWTogaW52YWxpZCBzaXplICgldSAhPSAlWnUpLlxuIiwKKwkJICAgICAgIHRhcmdpbmZvc2l6ZSwKKwkJICAgICAgIFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfY2xhc3NpZnlfdGFyZ2V0X2luZm8pKSk7CisJCXJldHVybiAwOworCX0KKwkKKwlpZiAoaG9va19tYXNrICYgfigoMSA8PCBORl9JUF9MT0NBTF9PVVQpIHwgKDEgPDwgTkZfSVBfRk9SV0FSRCkgfAorCSAgICAgICAgICAgICAgICAgICgxIDw8IE5GX0lQX1BPU1RfUk9VVElORykpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ0xBU1NJRlk6IG9ubHkgdmFsaWQgaW4gTE9DQUxfT1VULCBGT1JXQVJEICIKKwkJICAgICAgICAgICAgICAgICJhbmQgUE9TVF9ST1VUSU5HLlxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdHJjbXAodGFibGVuYW1lLCAibWFuZ2xlIikgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkNMQVNTSUZZOiBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSAiCisJCSAgICAgICAgICAgICAgICAiXCJtYW5nbGVcIiB0YWJsZSwgbm90IFwiJXNcIi5cbiIsCisJCSAgICAgICAgICAgICAgICB0YWJsZW5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgY2xhc3NpZnlfcmVnID0geyAKKwkubmFtZSAJCT0gIkNMQVNTSUZZIiwgCisJLnRhcmdldCAJPSB0YXJnZXQsCisJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LAorCS5tZSAJCT0gVEhJU19NT0RVTEUsCit9Oworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgY2xhc3NpZnk2X3JlZyA9IHsgCisJLm5hbWUgCQk9ICJDTEFTU0lGWSIsIAorCS50YXJnZXQgCT0gdGFyZ2V0LAorCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKKwkubWUgCQk9IFRISVNfTU9EVUxFLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmY2xhc3NpZnlfcmVnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQ2LCAmY2xhc3NpZnk2X3JlZyk7CisJaWYgKHJldCkKKwkJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmNsYXNzaWZ5X3JlZyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZjbGFzc2lmeV9yZWcpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQ2LCAmY2xhc3NpZnk2X3JlZyk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI1MDZlMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfQ09OTk1BUksuYwpAQCAtMCwwICsxLDE0MSBAQAorLyogVGhpcyBrZXJuZWwgbW9kdWxlIGlzIHVzZWQgdG8gbW9kaWZ5IHRoZSBjb25uZWN0aW9uIG1hcmsgdmFsdWVzLCBvcgorICogdG8gb3B0aW9uYWxseSByZXN0b3JlIHRoZSBza2IgbmZtYXJrIGZyb20gdGhlIGNvbm5lY3Rpb24gbWFyaworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwyMDA0IE1BUkEgU3lzdGVtcyBBQiA8aHR0cDovL3d3dy5tYXJhc3lzdGVtcy5jb20+CisgKiBieSBIZW5yaWsgTm9yZHN0cm9tIDxobm9AbWFyYXN5c3RlbXMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisKK01PRFVMRV9BVVRIT1IoIkhlbnJpayBOb3Jkc3Ryb20gPGhub0BtYXJhc3l0ZW1zLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVAgdGFibGVzIENPTk5NQVJLIG1hdGNoaW5nIG1vZHVsZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcHRfQ09OTk1BUksiKTsKKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9DT05OTUFSSy5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbXBhdC5oPgorCitzdGF0aWMgdW5zaWduZWQgaW50Cit0YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgIHVuc2lnbmVkIGludCBob29rbnVtLAorICAgICAgIGNvbnN0IHZvaWQgKnRhcmdpbmZvLAorICAgICAgIHZvaWQgKnVzZXJpbmZvKQoreworCWNvbnN0IHN0cnVjdCB4dF9jb25ubWFya190YXJnZXRfaW5mbyAqbWFya2luZm8gPSB0YXJnaW5mbzsKKwl1X2ludDMyX3QgZGlmZjsKKwl1X2ludDMyX3QgbmZtYXJrOworCXVfaW50MzJfdCBuZXdtYXJrOworCXVfaW50MzJfdCBjdGluZm87CisJdV9pbnQzMl90ICpjdG1hcmsgPSBuZl9jdF9nZXRfbWFyaygqcHNrYiwgJmN0aW5mbyk7CisKKwlpZiAoY3RtYXJrKSB7CisJICAgIHN3aXRjaChtYXJraW5mby0+bW9kZSkgeworCSAgICBjYXNlIFhUX0NPTk5NQVJLX1NFVDoKKwkJbmV3bWFyayA9ICgqY3RtYXJrICYgfm1hcmtpbmZvLT5tYXNrKSB8IG1hcmtpbmZvLT5tYXJrOworCQlpZiAobmV3bWFyayAhPSAqY3RtYXJrKQorCQkgICAgKmN0bWFyayA9IG5ld21hcms7CisJCWJyZWFrOworCSAgICBjYXNlIFhUX0NPTk5NQVJLX1NBVkU6CisJCW5ld21hcmsgPSAoKmN0bWFyayAmIH5tYXJraW5mby0+bWFzaykgfCAoKCpwc2tiKS0+bmZtYXJrICYgbWFya2luZm8tPm1hc2spOworCQlpZiAoKmN0bWFyayAhPSBuZXdtYXJrKQorCQkgICAgKmN0bWFyayA9IG5ld21hcms7CisJCWJyZWFrOworCSAgICBjYXNlIFhUX0NPTk5NQVJLX1JFU1RPUkU6CisJCW5mbWFyayA9ICgqcHNrYiktPm5mbWFyazsKKwkJZGlmZiA9ICgqY3RtYXJrIF4gbmZtYXJrKSAmIG1hcmtpbmZvLT5tYXNrOworCQlpZiAoZGlmZiAhPSAwKQorCQkgICAgKCpwc2tiKS0+bmZtYXJrID0gbmZtYXJrIF4gZGlmZjsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisKKwlyZXR1cm4gWFRfQ09OVElOVUU7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgIGNvbnN0IHZvaWQgKmVudHJ5LAorCSAgIHZvaWQgKnRhcmdpbmZvLAorCSAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCisJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlzdHJ1Y3QgeHRfY29ubm1hcmtfdGFyZ2V0X2luZm8gKm1hdGNoaW5mbyA9IHRhcmdpbmZvOworCWlmICh0YXJnaW5mb3NpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9jb25ubWFya190YXJnZXRfaW5mbykpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNPTk5NQVJLOiB0YXJnaW5mb3NpemUgJXUgIT0gJVp1XG4iLAorCQkgICAgICAgdGFyZ2luZm9zaXplLAorCQkgICAgICAgWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9jb25ubWFya190YXJnZXRfaW5mbykpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG1hdGNoaW5mby0+bW9kZSA9PSBYVF9DT05OTUFSS19SRVNUT1JFKSB7CisJICAgIGlmIChzdHJjbXAodGFibGVuYW1lLCAibWFuZ2xlIikgIT0gMCkgeworCQkgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiQ09OTk1BUks6IHJlc3RvcmUgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gXCJtYW5nbGVcIiB0YWJsZSwgbm90IFwiJXNcIlxuIiwgdGFibGVuYW1lKTsKKwkJICAgIHJldHVybiAwOworCSAgICB9CisJfQorCisJaWYgKG1hdGNoaW5mby0+bWFyayA+IDB4ZmZmZmZmZmYgfHwgbWF0Y2hpbmZvLT5tYXNrID4gMHhmZmZmZmZmZikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJDT05OTUFSSzogT25seSBzdXBwb3J0cyAzMmJpdCBtYXJrXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGNvbm5tYXJrX3JlZyA9IHsKKwkubmFtZSA9ICJDT05OTUFSSyIsCisJLnRhcmdldCA9ICZ0YXJnZXQsCisJLmNoZWNrZW50cnkgPSAmY2hlY2tlbnRyeSwKKwkubWUgPSBUSElTX01PRFVMRQorfTsKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGNvbm5tYXJrNl9yZWcgPSB7CisJLm5hbWUgPSAiQ09OTk1BUksiLAorCS50YXJnZXQgPSAmdGFyZ2V0LAorCS5jaGVja2VudHJ5ID0gJmNoZWNrZW50cnksCisJLm1lID0gVEhJU19NT0RVTEUKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJbmVlZF9jb25udHJhY2soKTsKKworCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmY29ubm1hcmtfcmVnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQ2LCAmY29ubm1hcms2X3JlZyk7CisJaWYgKHJldCkKKwkJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmNvbm5tYXJrX3JlZyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZjb25ubWFya19yZWcpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQ2LCAmY29ubm1hcms2X3JlZyk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X01BUksuYyBiL25ldC9uZXRmaWx0ZXIveHRfTUFSSy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMTFlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X01BUksuYwpAQCAtMCwwICsxLDE5MSBAQAorLyogVGhpcyBpcyBhIG1vZHVsZSB3aGljaCBpcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBORk1BUksgZmllbGQgb2YgYW4gc2tiLiAqLworCisvKiAoQykgMTk5OS0yMDAxIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfTUFSSy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXBbNl10YWJsZXMgTUFSSyBtb2RpZmljYXRpb24gbW9kdWxlIik7CitNT0RVTEVfQUxJQVMoImlwdF9NQVJLIik7CitNT0RVTEVfQUxJQVMoImlwNnRfTUFSSyIpOworCitzdGF0aWMgdW5zaWduZWQgaW50Cit0YXJnZXRfdjAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkgIHVuc2lnbmVkIGludCBob29rbnVtLAorCSAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCisJICB2b2lkICp1c2VyaW5mbykKK3sKKwljb25zdCBzdHJ1Y3QgeHRfbWFya190YXJnZXRfaW5mbyAqbWFya2luZm8gPSB0YXJnaW5mbzsKKworCWlmKCgqcHNrYiktPm5mbWFyayAhPSBtYXJraW5mby0+bWFyaykKKwkJKCpwc2tiKS0+bmZtYXJrID0gbWFya2luZm8tPm1hcms7CisKKwlyZXR1cm4gWFRfQ09OVElOVUU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3RhcmdldF92MShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSAgdW5zaWduZWQgaW50IGhvb2tudW0sCisJICBjb25zdCB2b2lkICp0YXJnaW5mbywKKwkgIHZvaWQgKnVzZXJpbmZvKQoreworCWNvbnN0IHN0cnVjdCB4dF9tYXJrX3RhcmdldF9pbmZvX3YxICptYXJraW5mbyA9IHRhcmdpbmZvOworCWludCBtYXJrID0gMDsKKworCXN3aXRjaCAobWFya2luZm8tPm1vZGUpIHsKKwljYXNlIFhUX01BUktfU0VUOgorCQltYXJrID0gbWFya2luZm8tPm1hcms7CisJCWJyZWFrOworCQkKKwljYXNlIFhUX01BUktfQU5EOgorCQltYXJrID0gKCpwc2tiKS0+bmZtYXJrICYgbWFya2luZm8tPm1hcms7CisJCWJyZWFrOworCQkKKwljYXNlIFhUX01BUktfT1I6CisJCW1hcmsgPSAoKnBza2IpLT5uZm1hcmsgfCBtYXJraW5mby0+bWFyazsKKwkJYnJlYWs7CisJfQorCisJaWYoKCpwc2tiKS0+bmZtYXJrICE9IG1hcmspCisJCSgqcHNrYiktPm5mbWFyayA9IG1hcms7CisKKwlyZXR1cm4gWFRfQ09OVElOVUU7Cit9CisKKworc3RhdGljIGludAorY2hlY2tlbnRyeV92MChjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgICAgY29uc3Qgdm9pZCAqZW50cnksCisJICAgICAgdm9pZCAqdGFyZ2luZm8sCisJICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKKwkgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCXN0cnVjdCB4dF9tYXJrX3RhcmdldF9pbmZvICptYXJraW5mbyA9IHRhcmdpbmZvOworCisJaWYgKHRhcmdpbmZvc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X21hcmtfdGFyZ2V0X2luZm8pKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJNQVJLOiB0YXJnaW5mb3NpemUgJXUgIT0gJVp1XG4iLAorCQkgICAgICAgdGFyZ2luZm9zaXplLAorCQkgICAgICAgWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9tYXJrX3RhcmdldF9pbmZvKSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RyY21wKHRhYmxlbmFtZSwgIm1hbmdsZSIpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTUFSSzogY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gXCJtYW5nbGVcIiB0YWJsZSwgbm90IFwiJXNcIlxuIiwgdGFibGVuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG1hcmtpbmZvLT5tYXJrID4gMHhmZmZmZmZmZikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJNQVJLOiBPbmx5IHN1cHBvcnRzIDMyYml0IHdpZGUgbWFya1xuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5X3YxKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkgICAgICBjb25zdCB2b2lkICplbnRyeSwKKwkgICAgICB2b2lkICp0YXJnaW5mbywKKwkgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAorCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJc3RydWN0IHh0X21hcmtfdGFyZ2V0X2luZm9fdjEgKm1hcmtpbmZvID0gdGFyZ2luZm87CisKKwlpZiAodGFyZ2luZm9zaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfbWFya190YXJnZXRfaW5mb192MSkpKXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTUFSSzogdGFyZ2luZm9zaXplICV1ICE9ICVadVxuIiwKKwkJICAgICAgIHRhcmdpbmZvc2l6ZSwKKwkJICAgICAgIFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfbWFya190YXJnZXRfaW5mb192MSkpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0cmNtcCh0YWJsZW5hbWUsICJtYW5nbGUiKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1BUks6IGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIFwibWFuZ2xlXCIgdGFibGUsIG5vdCBcIiVzXCJcbiIsIHRhYmxlbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChtYXJraW5mby0+bW9kZSAhPSBYVF9NQVJLX1NFVAorCSAgICAmJiBtYXJraW5mby0+bW9kZSAhPSBYVF9NQVJLX0FORAorCSAgICAmJiBtYXJraW5mby0+bW9kZSAhPSBYVF9NQVJLX09SKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1BUks6IHVua25vd24gbW9kZSAldVxuIiwKKwkJICAgICAgIG1hcmtpbmZvLT5tb2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG1hcmtpbmZvLT5tYXJrID4gMHhmZmZmZmZmZikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJNQVJLOiBPbmx5IHN1cHBvcnRzIDMyYml0IHdpZGUgbWFya1xuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcHRfbWFya19yZWdfdjAgPSB7CisJLm5hbWUJCT0gIk1BUksiLAorCS50YXJnZXQJCT0gdGFyZ2V0X3YwLAorCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeV92MCwKKwkubWUJCT0gVEhJU19NT0RVTEUsCisJLnJldmlzaW9uCT0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGlwdF9tYXJrX3JlZ192MSA9IHsKKwkubmFtZQkJPSAiTUFSSyIsCisJLnRhcmdldAkJPSB0YXJnZXRfdjEsCisJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5X3YxLAorCS5tZQkJPSBUSElTX01PRFVMRSwKKwkucmV2aXNpb24JPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXA2dF9tYXJrX3JlZ192MCA9IHsKKwkubmFtZQkJPSAiTUFSSyIsCisJLnRhcmdldAkJPSB0YXJnZXRfdjAsCisJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5X3YwLAorCS5tZQkJPSBUSElTX01PRFVMRSwKKwkucmV2aXNpb24JPSAwLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSB4dF9yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmlwdF9tYXJrX3JlZ192MCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmaXB0X21hcmtfcmVnX3YxKTsKKwlpZiAoZXJyKQorCQl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmaXB0X21hcmtfcmVnX3YwKTsKKworCWVyciA9IHh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgJmlwNnRfbWFya19yZWdfdjApOworCWlmIChlcnIpIHsKKwkJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmlwdF9tYXJrX3JlZ192MCk7CisJCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZpcHRfbWFya19yZWdfdjEpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmlwdF9tYXJrX3JlZ192MCk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmlwdF9tYXJrX3JlZ192MSk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsICZpcDZ0X21hcmtfcmVnX3YwKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfTkZRVUVVRS5jIGIvbmV0L25ldGZpbHRlci94dF9ORlFVRVVFLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI3NmI2ZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfTkZRVUVVRS5jCkBAIC0wLDAgKzEsMTA3IEBACisvKiBpcHRhYmxlcyBtb2R1bGUgZm9yIHVzaW5nIG5ldyBuZXRmaWx0ZXIgbmV0bGluayBxdWV1ZQorICoKKyAqIChDKSAyMDA1IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyAKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9ORlFVRVVFLmg+CisKK01PRFVMRV9BVVRIT1IoIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJbaXAsaXA2LGFycF1fdGFibGVzIE5GUVVFVUUgdGFyZ2V0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlwdF9ORlFVRVVFIik7CitNT0RVTEVfQUxJQVMoImlwNnRfTkZRVUVVRSIpOworTU9EVUxFX0FMSUFTKCJhcnB0X05GUVVFVUUiKTsKKworc3RhdGljIHVuc2lnbmVkIGludAordGFyZ2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKKyAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKKyAgICAgICBjb25zdCB2b2lkICp0YXJnaW5mbywKKyAgICAgICB2b2lkICp1c2VyaW5mbykKK3sKKwljb25zdCBzdHJ1Y3QgeHRfTkZRX2luZm8gKnRpbmZvID0gdGFyZ2luZm87CisKKwlyZXR1cm4gTkZfUVVFVUVfTlIodGluZm8tPnF1ZXVlbnVtKTsKK30KKworc3RhdGljIGludAorY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgY29uc3Qgdm9pZCAqZW50cnksCisgICAgICAgICAgIHZvaWQgKnRhcmdpbmZvLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWlmICh0YXJnaW5mb3NpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9ORlFfaW5mbykpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5GUVVFVUU6IHRhcmdpbmZvc2l6ZSAldSAhPSAlWnVcbiIsCisJCSAgICAgICB0YXJnaW5mb3NpemUsCisJCSAgICAgICBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X05GUV9pbmZvKSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXB0X05GUV9yZWcgPSB7CisJLm5hbWUJCT0gIk5GUVVFVUUiLAorCS50YXJnZXQJCT0gdGFyZ2V0LAorCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcDZ0X05GUV9yZWcgPSB7CisJLm5hbWUJCT0gIk5GUVVFVUUiLAorCS50YXJnZXQJCT0gdGFyZ2V0LAorCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBhcnB0X05GUV9yZWcgPSB7CisJLm5hbWUJCT0gIk5GUVVFVUUiLAorCS50YXJnZXQJCT0gdGFyZ2V0LAorCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlyZXQgPSB4dF9yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmlwdF9ORlFfcmVnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgJmlwNnRfTkZRX3JlZyk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfaXA7CisJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KE5GX0FSUCwgJmFycHRfTkZRX3JlZyk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfaXA2OworCisJcmV0dXJuIHJldDsKK291dF9pcDY6CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsICZpcDZ0X05GUV9yZWcpOworb3V0X2lwOgorCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZpcHRfTkZRX3JlZyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KE5GX0FSUCwgJmFycHRfTkZRX3JlZyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsICZpcDZ0X05GUV9yZWcpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZpcHRfTkZRX3JlZyk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X05PVFJBQ0suYyBiL25ldC9uZXRmaWx0ZXIveHRfTk9UUkFDSy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZDQ3N2EKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X05PVFJBQ0suYwpAQCAtMCwwICsxLDkyIEBACisvKiBUaGlzIGlzIGEgbW9kdWxlIHdoaWNoIGlzIHVzZWQgZm9yIHNldHRpbmcgdXAgZmFrZSBjb25udHJhY2tzCisgKiBvbiBwYWNrZXRzIHNvIHRoYXQgdGhleSBhcmUgbm90IHNlZW4gYnkgdGhlIGNvbm50cmFjay9OQVQgY29kZS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tcGF0Lmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXB0X05PVFJBQ0siKTsKKworc3RhdGljIHVuc2lnbmVkIGludAordGFyZ2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKKyAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKKyAgICAgICBjb25zdCB2b2lkICp0YXJnaW5mbywKKyAgICAgICB2b2lkICp1c2VyaW5mbykKK3sKKwkvKiBQcmV2aW91c2x5IHNlZW4gKGxvb3BiYWNrKT8gSWdub3JlLiAqLworCWlmICgoKnBza2IpLT5uZmN0ICE9IE5VTEwpCisJCXJldHVybiBYVF9DT05USU5VRTsKKworCS8qIEF0dGFjaCBmYWtlIGNvbm50cmFjayBlbnRyeS4gCisJICAgSWYgdGhlcmUgaXMgYSByZWFsIGN0IGVudHJ5IGNvcnJlc3BvbmRpZyB0byB0aGlzIHBhY2tldCwgCisJICAgaXQnbGwgaGFuZyBhcm91biB0aWxsIHRpbWluZyBvdXQuIFdlIGRvbid0IGRlYWwgd2l0aCBpdAorCSAgIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiBKSyAqLworCW5mX2N0X3VudHJhY2soKnBza2IpOworCSgqcHNrYiktPm5mY3RpbmZvID0gSVBfQ1RfTkVXOworCW5mX2Nvbm50cmFja19nZXQoKCpwc2tiKS0+bmZjdCk7CisKKwlyZXR1cm4gWFRfQ09OVElOVUU7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgIGNvbnN0IHZvaWQgKmVudHJ5LAorICAgICAgICAgICB2b2lkICp0YXJnaW5mbywKKyAgICAgICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKKyAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlpZiAodGFyZ2luZm9zaXplICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTk9UUkFDSzogdGFyZ2luZm9zaXplICV1ICE9IDBcbiIsCisJCSAgICAgICB0YXJnaW5mb3NpemUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RyY21wKHRhYmxlbmFtZSwgInJhdyIpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTk9UUkFDSzogY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gXCJyYXdcIiB0YWJsZSwgbm90IFwiJXNcIlxuIiwgdGFibGVuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IG5vdHJhY2tfcmVnID0geyAKKwkubmFtZSA9ICJOT1RSQUNLIiwgCisJLnRhcmdldCA9IHRhcmdldCwgCisJLmNoZWNrZW50cnkgPSBjaGVja2VudHJ5LAorCS5tZSA9IFRISVNfTU9EVUxFLAorfTsKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IG5vdHJhY2s2X3JlZyA9IHsgCisJLm5hbWUgPSAiTk9UUkFDSyIsIAorCS50YXJnZXQgPSB0YXJnZXQsIAorCS5jaGVja2VudHJ5ID0gY2hlY2tlbnRyeSwKKwkubWUgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZub3RyYWNrX3JlZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgJm5vdHJhY2s2X3JlZyk7CisJaWYgKHJldCkKKwkJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJm5vdHJhY2tfcmVnKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsICZub3RyYWNrNl9yZWcpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZub3RyYWNrX3JlZyk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2NvbW1lbnQuYyBiL25ldC9uZXRmaWx0ZXIveHRfY29tbWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYTZmZDYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2NvbW1lbnQuYwpAQCAtMCwwICsxLDgwIEBACisvKgorICogSW1wbGVtZW50cyBhIGR1bW15IG1hdGNoIHRvIGFsbG93IGF0dGFjaGluZyBjb21tZW50cyB0byBydWxlcworICoKKyAqIDIwMDMtMDUtMTMgQnJhZCBGaXNoZXIgKGJyYWRAaW5mby1saW5rLm5ldCkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2NvbW1lbnQuaD4KKworTU9EVUxFX0FVVEhPUigiQnJhZCBGaXNoZXIgPGJyYWRAaW5mby1saW5rLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgY29tbWVudCBtYXRjaCBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXB0X2NvbW1lbnQiKTsKK01PRFVMRV9BTElBUygiaXA2dF9jb21tZW50Iik7CisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b29mZiwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKwkvKiBXZSBhbHdheXMgbWF0Y2ggKi8KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisgICAgICAgICAgIGNvbnN0IHZvaWQgKmlwLAorICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCisgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJLyogQ2hlY2sgdGhlIHNpemUgKi8KKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfY29tbWVudF9pbmZvKSkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGNvbW1lbnRfbWF0Y2ggPSB7CisJLm5hbWUJCT0gImNvbW1lbnQiLAorCS5tYXRjaAkJPSBtYXRjaCwKKwkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFCit9OworCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGNvbW1lbnQ2X21hdGNoID0geworCS5uYW1lCQk9ICJjb21tZW50IiwKKwkubWF0Y2gJCT0gbWF0Y2gsCisJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRQorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmY29tbWVudF9tYXRjaCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmY29tbWVudDZfbWF0Y2gpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbW1lbnRfbWF0Y2gpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZjb21tZW50X21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmY29tbWVudDZfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9jb25uYnl0ZXMuYyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUwZDJhNAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmMKQEAgLTAsMCArMSwxODAgQEAKKy8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggY29ubmVjdGlvbiB0cmFja2luZyBieXRlIGNvdW50ZXIuCisgKiBHUEwgKEMpIDIwMDIgTWFydGluIERldmVyYSAoZGV2aWtAY2RpLmN6KS4KKyAqCisgKiAyMDA0LTA3LTIwIEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgorICogCS0gcmVpbXBsZW1lbnRlZCB0byB1c2UgcGVyLWNvbm5lY3Rpb24gYWNjb3VudGluZyBjb3VudGVycworICogCS0gYWRkIGZ1bmN0aW9uYWxpdHkgdG8gbWF0Y2ggbnVtYmVyIG9mIHBhY2tldHMKKyAqIAktIGFkZCBmdW5jdGlvbmFsaXR5IHRvIG1hdGNoIGF2ZXJhZ2UgcGFja2V0IHNpemUKKyAqIAktIGFkZCBzdXBwb3J0IHRvIG1hdGNoIGRpcmVjdGlvbnMgc2VwZXJhdGVseQorICogMjAwNS0xMC0xNiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KKyAqIAktIFBvcnQgdG8geF90YWJsZXMKKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmg+CisKKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBtYXRjaCBmb3IgbWF0Y2hpbmcgbnVtYmVyIG9mIHBrdHMvYnl0ZXMgcGVyIGNvbm5lY3Rpb24iKTsKK01PRFVMRV9BTElBUygiaXB0X2Nvbm5ieXRlcyIpOworCisvKiA2NGJpdCBkaXZpc29yLCBkaXZpZGVuZCBhbmQgcmVzdWx0LiBkeW5hbWljIHByZWNpc2lvbiAqLworc3RhdGljIHVfaW50NjRfdCBkaXY2NF82NCh1X2ludDY0X3QgZGl2aWRlbmQsIHVfaW50NjRfdCBkaXZpc29yKQoreworCXVfaW50MzJfdCBkID0gZGl2aXNvcjsKKworCWlmIChkaXZpc29yID4gMHhmZmZmZmZmZlVMTCkgeworCQl1bnNpZ25lZCBpbnQgc2hpZnQgPSBmbHMoZGl2aXNvciA+PiAzMik7CisKKwkJZCA9IGRpdmlzb3IgPj4gc2hpZnQ7CisJCWRpdmlkZW5kID4+PSBzaGlmdDsKKwl9CisKKwlkb19kaXYoZGl2aWRlbmQsIGQpOworCXJldHVybiBkaXZpZGVuZDsKK30KKworc3RhdGljIGludAorbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IHh0X2Nvbm5ieXRlc19pbmZvICpzaW5mbyA9IG1hdGNoaW5mbzsKKwl1X2ludDY0X3Qgd2hhdCA9IDA7CS8qIGluaXRpYWxpemUgdG8gbWFrZSBnY2MgaGFwcHkgKi8KKwljb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX2NvdW50ZXIgKmNvdW50ZXJzOworCisJaWYgKCEoY291bnRlcnMgPSBuZl9jdF9nZXRfY291bnRlcnMoc2tiKSkpCisJCXJldHVybiAwOyAvKiBubyBtYXRjaCAqLworCisJc3dpdGNoIChzaW5mby0+d2hhdCkgeworCWNhc2UgWFRfQ09OTkJZVEVTX1BLVFM6CisJCXN3aXRjaCAoc2luZm8tPmRpcmVjdGlvbikgeworCQljYXNlIFhUX0NPTk5CWVRFU19ESVJfT1JJR0lOQUw6CisJCQl3aGF0ID0gY291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXS5wYWNrZXRzOworCQkJYnJlYWs7CisJCWNhc2UgWFRfQ09OTkJZVEVTX0RJUl9SRVBMWToKKwkJCXdoYXQgPSBjb3VudGVyc1tJUF9DVF9ESVJfUkVQTFldLnBhY2tldHM7CisJCQlicmVhazsKKwkJY2FzZSBYVF9DT05OQllURVNfRElSX0JPVEg6CisJCQl3aGF0ID0gY291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXS5wYWNrZXRzOworCQkJd2hhdCArPSBjb3VudGVyc1tJUF9DVF9ESVJfUkVQTFldLnBhY2tldHM7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFhUX0NPTk5CWVRFU19CWVRFUzoKKwkJc3dpdGNoIChzaW5mby0+ZGlyZWN0aW9uKSB7CisJCWNhc2UgWFRfQ09OTkJZVEVTX0RJUl9PUklHSU5BTDoKKwkJCXdoYXQgPSBjb3VudGVyc1tJUF9DVF9ESVJfT1JJR0lOQUxdLmJ5dGVzOworCQkJYnJlYWs7CisJCWNhc2UgWFRfQ09OTkJZVEVTX0RJUl9SRVBMWToKKwkJCXdoYXQgPSBjb3VudGVyc1tJUF9DVF9ESVJfUkVQTFldLmJ5dGVzOworCQkJYnJlYWs7CisJCWNhc2UgWFRfQ09OTkJZVEVTX0RJUl9CT1RIOgorCQkJd2hhdCA9IGNvdW50ZXJzW0lQX0NUX0RJUl9PUklHSU5BTF0uYnl0ZXM7CisJCQl3aGF0ICs9IGNvdW50ZXJzW0lQX0NUX0RJUl9SRVBMWV0uYnl0ZXM7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFhUX0NPTk5CWVRFU19BVkdQS1Q6CisJCXN3aXRjaCAoc2luZm8tPmRpcmVjdGlvbikgeworCQljYXNlIFhUX0NPTk5CWVRFU19ESVJfT1JJR0lOQUw6CisJCQl3aGF0ID0gZGl2NjRfNjQoY291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXS5ieXRlcywKKwkJCQkJY291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXS5wYWNrZXRzKTsKKwkJCWJyZWFrOworCQljYXNlIFhUX0NPTk5CWVRFU19ESVJfUkVQTFk6CisJCQl3aGF0ID0gZGl2NjRfNjQoY291bnRlcnNbSVBfQ1RfRElSX1JFUExZXS5ieXRlcywKKwkJCQkJY291bnRlcnNbSVBfQ1RfRElSX1JFUExZXS5wYWNrZXRzKTsKKwkJCWJyZWFrOworCQljYXNlIFhUX0NPTk5CWVRFU19ESVJfQk9USDoKKwkJCXsKKwkJCQl1X2ludDY0X3QgYnl0ZXM7CisJCQkJdV9pbnQ2NF90IHBrdHM7CisJCQkJYnl0ZXMgPSBjb3VudGVyc1tJUF9DVF9ESVJfT1JJR0lOQUxdLmJ5dGVzICsKKwkJCQkJY291bnRlcnNbSVBfQ1RfRElSX1JFUExZXS5ieXRlczsKKwkJCQlwa3RzID0gY291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXS5wYWNrZXRzKworCQkJCQljb3VudGVyc1tJUF9DVF9ESVJfUkVQTFldLnBhY2tldHM7CisKKwkJCQkvKiBGSVhNRV9USEVPUkVUSUNBTDogd2hhdCB0byBkbyBpZiBzdW0KKwkJCQkgKiBvdmVyZmxvd3MgPyAqLworCisJCQkJd2hhdCA9IGRpdjY0XzY0KGJ5dGVzLCBwa3RzKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKworCWlmIChzaW5mby0+Y291bnQudG8pCisJCXJldHVybiAod2hhdCA8PSBzaW5mby0+Y291bnQudG8gJiYgd2hhdCA+PSBzaW5mby0+Y291bnQuZnJvbSk7CisJZWxzZQorCQlyZXR1cm4gKHdoYXQgPj0gc2luZm8tPmNvdW50LmZyb20pOworfQorCitzdGF0aWMgaW50IGNoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkJIGNvbnN0IHZvaWQgKmlwLAorCQkgdm9pZCAqbWF0Y2hpbmZvLAorCQkgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkJIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IHh0X2Nvbm5ieXRlc19pbmZvICpzaW5mbyA9IG1hdGNoaW5mbzsKKworCWlmIChtYXRjaHNpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9jb25uYnl0ZXNfaW5mbykpKQorCQlyZXR1cm4gMDsKKworCWlmIChzaW5mby0+d2hhdCAhPSBYVF9DT05OQllURVNfUEtUUyAmJgorCSAgICBzaW5mby0+d2hhdCAhPSBYVF9DT05OQllURVNfQllURVMgJiYKKwkgICAgc2luZm8tPndoYXQgIT0gWFRfQ09OTkJZVEVTX0FWR1BLVCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2luZm8tPmRpcmVjdGlvbiAhPSBYVF9DT05OQllURVNfRElSX09SSUdJTkFMICYmCisJICAgIHNpbmZvLT5kaXJlY3Rpb24gIT0gWFRfQ09OTkJZVEVTX0RJUl9SRVBMWSAmJgorCSAgICBzaW5mby0+ZGlyZWN0aW9uICE9IFhUX0NPTk5CWVRFU19ESVJfQk9USCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBjb25uYnl0ZXNfbWF0Y2ggPSB7CisJLm5hbWUJCT0gImNvbm5ieXRlcyIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVjaywKKwkubWUJCT0gVEhJU19NT0RVTEUKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGNvbm5ieXRlczZfbWF0Y2ggPSB7CisJLm5hbWUJCT0gImNvbm5ieXRlcyIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVjaywKKwkubWUJCT0gVEhJU19NT0RVTEUKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZjb25uYnl0ZXNfbWF0Y2gpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJmNvbm5ieXRlczZfbWF0Y2gpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbm5ieXRlc19tYXRjaCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZjb25uYnl0ZXNfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZjb25uYnl0ZXM2X21hdGNoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuYyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDZlOTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci94dF9jb25ubWFyay5jCkBAIC0wLDAgKzEsMTA5IEBACisvKiBUaGlzIGtlcm5lbCBtb2R1bGUgbWF0Y2hlcyBjb25uZWN0aW9uIG1hcmsgdmFsdWVzIHNldCBieSB0aGUKKyAqIENPTk5NQVJLIHRhcmdldAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwyMDA0IE1BUkEgU3lzdGVtcyBBQiA8aHR0cDovL3d3dy5tYXJhc3lzdGVtcy5jb20+CisgKiBieSBIZW5yaWsgTm9yZHN0cm9tIDxobm9AbWFyYXN5c3RlbXMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKK01PRFVMRV9BVVRIT1IoIkhlbnJpayBOb3Jkc3Ryb20gPGhub0BtYXJhc3l0ZW1zLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVAgdGFibGVzIGNvbm5tYXJrIG1hdGNoIG1vZHVsZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcHRfY29ubm1hcmsiKTsKKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9jb25ubWFyay5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbXBhdC5oPgorCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKwljb25zdCBzdHJ1Y3QgeHRfY29ubm1hcmtfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwl1X2ludDMyX3QgY3RpbmZvOworCWNvbnN0IHVfaW50MzJfdCAqY3RtYXJrID0gbmZfY3RfZ2V0X21hcmsoc2tiLCAmY3RpbmZvKTsKKwlpZiAoIWN0bWFyaykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKCgoKmN0bWFyaykgJiBpbmZvLT5tYXNrKSA9PSBpbmZvLT5tYXJrKSBeIGluZm8tPmludmVydDsKK30KKworc3RhdGljIGludAorY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgY29uc3Qgdm9pZCAqaXAsCisJICAgdm9pZCAqbWF0Y2hpbmZvLAorCSAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlzdHJ1Y3QgeHRfY29ubm1hcmtfaW5mbyAqY20gPSAKKwkJCQkoc3RydWN0IHh0X2Nvbm5tYXJrX2luZm8gKiltYXRjaGluZm87CisJaWYgKG1hdGNoc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X2Nvbm5tYXJrX2luZm8pKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY20tPm1hcmsgPiAweGZmZmZmZmZmIHx8IGNtLT5tYXNrID4gMHhmZmZmZmZmZikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJjb25ubWFyazogb25seSBzdXBwb3J0IDMyYml0IG1hcmtcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBjb25ubWFya19tYXRjaCA9IHsKKwkubmFtZSA9ICJjb25ubWFyayIsCisJLm1hdGNoID0gJm1hdGNoLAorCS5jaGVja2VudHJ5ID0gJmNoZWNrZW50cnksCisJLm1lID0gVEhJU19NT0RVTEUKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGNvbm5tYXJrNl9tYXRjaCA9IHsKKwkubmFtZSA9ICJjb25ubWFyayIsCisJLm1hdGNoID0gJm1hdGNoLAorCS5jaGVja2VudHJ5ID0gJmNoZWNrZW50cnksCisJLm1lID0gVEhJU19NT0RVTEUKK307CisKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwluZWVkX2Nvbm50cmFjaygpOworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbm5tYXJrX21hdGNoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZjb25ubWFyazZfbWF0Y2gpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbm5tYXJrX21hdGNoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZjb25ubWFyazZfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbm5tYXJrX21hdGNoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfY29ubnRyYWNrLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZGViYzkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jCkBAIC0wLDAgKzEsMjM4IEBACisvKiBLZXJuZWwgbW9kdWxlIHRvIG1hdGNoIGNvbm5lY3Rpb24gdHJhY2tpbmcgaW5mb3JtYXRpb24uCisgKiBTdXBlcnNldCBvZiBSdXN0eSdzIG1pbmltYWxpc3RpYyBzdGF0ZSBtYXRjaC4KKyAqCisgKiAoQykgMjAwMSAgTWFyYyBCb3VjaGVyIChtYXJjQG1ic2kuY2EpLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTU9EVUxFKQorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja190dXBsZS5oPgorI2Vsc2UKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfY29ubnRyYWNrLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBjb25uZWN0aW9uIHRyYWNraW5nIG1hdGNoIG1vZHVsZSIpOworTU9EVUxFX0FMSUFTKCJpcHRfY29ubnRyYWNrIik7CisKKyNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19NT0RVTEUpCisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgaW50ICpob3Rkcm9wKQoreworCWNvbnN0IHN0cnVjdCB4dF9jb25udHJhY2tfaW5mbyAqc2luZm8gPSBtYXRjaGluZm87CisJc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7CisJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CisJdW5zaWduZWQgaW50IHN0YXRlYml0OworCisJY3QgPSBpcF9jb25udHJhY2tfZ2V0KChzdHJ1Y3Qgc2tfYnVmZiAqKXNrYiwgJmN0aW5mbyk7CisKKyNkZWZpbmUgRldJTlYoYm9vbCxpbnZmbGcpICgoYm9vbCkgXiAhIShzaW5mby0+aW52ZmxhZ3MgJiBpbnZmbGcpKQorCisJaWYgKGN0ID09ICZpcF9jb25udHJhY2tfdW50cmFja2VkKQorCQlzdGF0ZWJpdCA9IFhUX0NPTk5UUkFDS19TVEFURV9VTlRSQUNLRUQ7CisJZWxzZSBpZiAoY3QpCisgCQlzdGF0ZWJpdCA9IFhUX0NPTk5UUkFDS19TVEFURV9CSVQoY3RpbmZvKTsKKyAJZWxzZQorIAkJc3RhdGViaXQgPSBYVF9DT05OVFJBQ0tfU1RBVEVfSU5WQUxJRDsKKyAKKwlpZihzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfU1RBVEUpIHsKKwkJaWYgKGN0KSB7CisJCQlpZihjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmlwICE9CisJCQkgICAgY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC5pcCkKKwkJCQlzdGF0ZWJpdCB8PSBYVF9DT05OVFJBQ0tfU1RBVEVfU05BVDsKKworCQkJaWYoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5pcCAhPQorCQkJICAgIGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5zcmMuaXApCisJCQkJc3RhdGViaXQgfD0gWFRfQ09OTlRSQUNLX1NUQVRFX0ROQVQ7CisJCX0KKworCQlpZiAoRldJTlYoKHN0YXRlYml0ICYgc2luZm8tPnN0YXRlbWFzaykgPT0gMCwgWFRfQ09OTlRSQUNLX1NUQVRFKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19QUk9UTykgeworCQlpZiAoIWN0IHx8IEZXSU5WKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QucHJvdG9udW0gIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9PUklHSU5BTF0uZHN0LnByb3RvbnVtLCBYVF9DT05OVFJBQ0tfUFJPVE8pKQorICAgICAgICAgICAgICAgIAlyZXR1cm4gMDsKKwl9CisKKwlpZihzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfT1JJR1NSQykgeworCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmlwJnNpbmZvLT5zaXBtc2tbSVBfQ1RfRElSX09SSUdJTkFMXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLnNyYy5pcCwgWFRfQ09OTlRSQUNLX09SSUdTUkMpKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX09SSUdEU1QpIHsKKwkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5pcCZzaW5mby0+ZGlwbXNrW0lQX0NUX0RJUl9PUklHSU5BTF0uc19hZGRyKSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX09SSUdJTkFMXS5kc3QuaXAsIFhUX0NPTk5UUkFDS19PUklHRFNUKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19SRVBMU1JDKSB7CisJCWlmICghY3QgfHwgRldJTlYoKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5zcmMuaXAmc2luZm8tPnNpcG1za1tJUF9DVF9ESVJfUkVQTFldLnNfYWRkcikgIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9SRVBMWV0uc3JjLmlwLCBYVF9DT05OVFJBQ0tfUkVQTFNSQykpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZihzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfUkVQTERTVCkgeworCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LmlwJnNpbmZvLT5kaXBtc2tbSVBfQ1RfRElSX1JFUExZXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfUkVQTFldLmRzdC5pcCwgWFRfQ09OTlRSQUNLX1JFUExEU1QpKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX1NUQVRVUykgeworCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+c3RhdHVzICYgc2luZm8tPnN0YXR1c21hc2spID09IDAsIFhUX0NPTk5UUkFDS19TVEFUVVMpKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX0VYUElSRVMpIHsKKwkJdW5zaWduZWQgbG9uZyBleHBpcmVzOworCisJCWlmKCFjdCkKKwkJCXJldHVybiAwOworCisJCWV4cGlyZXMgPSB0aW1lcl9wZW5kaW5nKCZjdC0+dGltZW91dCkgPyAoY3QtPnRpbWVvdXQuZXhwaXJlcyAtIGppZmZpZXMpL0haIDogMDsKKworCQlpZiAoRldJTlYoIShleHBpcmVzID49IHNpbmZvLT5leHBpcmVzX21pbiAmJiBleHBpcmVzIDw9IHNpbmZvLT5leHBpcmVzX21heCksIFhUX0NPTk5UUkFDS19FWFBJUkVTKSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisjZWxzZSAvKiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLICovCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKwljb25zdCBzdHJ1Y3QgeHRfY29ubnRyYWNrX2luZm8gKnNpbmZvID0gbWF0Y2hpbmZvOworCXN0cnVjdCBuZl9jb25uICpjdDsKKwllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKKwl1bnNpZ25lZCBpbnQgc3RhdGViaXQ7CisKKwljdCA9IG5mX2N0X2dldCgoc3RydWN0IHNrX2J1ZmYgKilza2IsICZjdGluZm8pOworCisjZGVmaW5lIEZXSU5WKGJvb2wsaW52ZmxnKSAoKGJvb2wpIF4gISEoc2luZm8tPmludmZsYWdzICYgaW52ZmxnKSkKKworCWlmIChjdCA9PSAmbmZfY29ubnRyYWNrX3VudHJhY2tlZCkKKwkJc3RhdGViaXQgPSBYVF9DT05OVFJBQ0tfU1RBVEVfVU5UUkFDS0VEOworCWVsc2UgaWYgKGN0KQorIAkJc3RhdGViaXQgPSBYVF9DT05OVFJBQ0tfU1RBVEVfQklUKGN0aW5mbyk7CisgCWVsc2UKKyAJCXN0YXRlYml0ID0gWFRfQ09OTlRSQUNLX1NUQVRFX0lOVkFMSUQ7CisgCisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX1NUQVRFKSB7CisJCWlmIChjdCkgeworCQkJaWYoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy51My5pcCAhPQorCQkJICAgIGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QudTMuaXApCisJCQkJc3RhdGViaXQgfD0gWFRfQ09OTlRSQUNLX1NUQVRFX1NOQVQ7CisKKwkJCWlmKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QudTMuaXAgIT0KKwkJCSAgICBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLnUzLmlwKQorCQkJCXN0YXRlYml0IHw9IFhUX0NPTk5UUkFDS19TVEFURV9ETkFUOworCQl9CisKKwkJaWYgKEZXSU5WKChzdGF0ZWJpdCAmIHNpbmZvLT5zdGF0ZW1hc2spID09IDAsIFhUX0NPTk5UUkFDS19TVEFURSkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZihzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfUFJPVE8pIHsKKwkJaWYgKCFjdCB8fCBGV0lOVihjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnByb3RvbnVtICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLmRzdC5wcm90b251bSwgWFRfQ09OTlRSQUNLX1BST1RPKSkKKyAgICAgICAgICAgICAgICAJcmV0dXJuIDA7CisJfQorCisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX09SSUdTUkMpIHsKKwkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy51My5pcCZzaW5mby0+c2lwbXNrW0lQX0NUX0RJUl9PUklHSU5BTF0uc19hZGRyKSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX09SSUdJTkFMXS5zcmMuaXAsIFhUX0NPTk5UUkFDS19PUklHU1JDKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19PUklHRFNUKSB7CisJCWlmICghY3QgfHwgRldJTlYoKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QudTMuaXAmc2luZm8tPmRpcG1za1tJUF9DVF9ESVJfT1JJR0lOQUxdLnNfYWRkcikgIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9PUklHSU5BTF0uZHN0LmlwLCBYVF9DT05OVFJBQ0tfT1JJR0RTVCkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZihzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfUkVQTFNSQykgeworCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLnUzLmlwJnNpbmZvLT5zaXBtc2tbSVBfQ1RfRElSX1JFUExZXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfUkVQTFldLnNyYy5pcCwgWFRfQ09OTlRSQUNLX1JFUExTUkMpKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX1JFUExEU1QpIHsKKwkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC51My5pcCZzaW5mby0+ZGlwbXNrW0lQX0NUX0RJUl9SRVBMWV0uc19hZGRyKSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX1JFUExZXS5kc3QuaXAsIFhUX0NPTk5UUkFDS19SRVBMRFNUKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19TVEFUVVMpIHsKKwkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnN0YXR1cyAmIHNpbmZvLT5zdGF0dXNtYXNrKSA9PSAwLCBYVF9DT05OVFJBQ0tfU1RBVFVTKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19FWFBJUkVTKSB7CisJCXVuc2lnbmVkIGxvbmcgZXhwaXJlczsKKworCQlpZighY3QpCisJCQlyZXR1cm4gMDsKKworCQlleHBpcmVzID0gdGltZXJfcGVuZGluZygmY3QtPnRpbWVvdXQpID8gKGN0LT50aW1lb3V0LmV4cGlyZXMgLSBqaWZmaWVzKS9IWiA6IDA7CisKKwkJaWYgKEZXSU5WKCEoZXhwaXJlcyA+PSBzaW5mby0+ZXhwaXJlc19taW4gJiYgZXhwaXJlcyA8PSBzaW5mby0+ZXhwaXJlc19tYXgpLCBYVF9DT05OVFJBQ0tfRVhQSVJFUykpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworI2VuZGlmIC8qIENPTkZJR19ORl9JUF9DT05OVFJBQ0sgKi8KKworc3RhdGljIGludCBjaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCSBjb25zdCB2b2lkICppcCwKKwkJIHZvaWQgKm1hdGNoaW5mbywKKwkJIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisJCSB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWlmIChtYXRjaHNpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9jb25udHJhY2tfaW5mbykpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGNvbm50cmFja19tYXRjaCA9IHsKKwkubmFtZQkJPSAiY29ubnRyYWNrIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrLAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCW5lZWRfY29ubnRyYWNrKCk7CisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbm50cmFja19tYXRjaCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbm50cmFja19tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2RjY3AuYyBiL25ldC9uZXRmaWx0ZXIveHRfZGNjcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OWY0MmYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2RjY3AuYwpAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIGlwdGFibGVzIG1vZHVsZSBmb3IgRENDUCBwcm90b2NvbCBoZWFkZXIgbWF0Y2hpbmcKKyAqCisgKiAoQykgMjAwNSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RjY3AuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9kY2NwLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXRjaCBmb3IgRENDUCBwcm90b2NvbCBwYWNrZXRzIik7CitNT0RVTEVfQUxJQVMoImlwdF9kY2NwIik7CisKKyNkZWZpbmUgRENDSEVDSyhjb25kLCBvcHRpb24sIGZsYWcsIGludmZsYWcpICghKChmbGFnKSAmIChvcHRpb24pKSBcCisJCSAgICAgICAgICAgICAgICAgIHx8ICghISgoaW52ZmxhZykgJiAob3B0aW9uKSkgXiAoY29uZCkpKQorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqZGNjcF9vcHRidWY7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRjY3BfYnVmbG9jayk7CisKK3N0YXRpYyBpbmxpbmUgaW50CitkY2NwX2ZpbmRfb3B0aW9uKHVfaW50OF90IG9wdGlvbiwKKwkJIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCSB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKwkJIGNvbnN0IHN0cnVjdCBkY2NwX2hkciAqZGgsCisJCSBpbnQgKmhvdGRyb3ApCit7CisJLyogdGNwLmRvZmYgaXMgb25seSA0IGJpdHMsIGllLiBtYXggMTUgKiA0IGJ5dGVzICovCisJdW5zaWduZWQgY2hhciAqb3A7CisJdW5zaWduZWQgaW50IG9wdG9mZiA9IF9fZGNjcF9oZHJfbGVuKGRoKTsKKwl1bnNpZ25lZCBpbnQgb3B0bGVuID0gZGgtPmRjY3BoX2RvZmYqNCAtIF9fZGNjcF9oZHJfbGVuKGRoKTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChkaC0+ZGNjcGhfZG9mZiAqIDQgPCBfX2RjY3BfaGRyX2xlbihkaCkpIHsKKwkJKmhvdGRyb3AgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIW9wdGxlbikKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfYmgoJmRjY3BfYnVmbG9jayk7CisJb3AgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b2ZmICsgb3B0b2ZmLCBvcHRsZW4sIGRjY3Bfb3B0YnVmKTsKKwlpZiAob3AgPT0gTlVMTCkgeworCQkvKiBJZiB3ZSBkb24ndCBoYXZlIHRoZSB3aG9sZSBoZWFkZXIsIGRyb3AgcGFja2V0LiAqLworCQlzcGluX3VubG9ja19iaCgmZGNjcF9idWZsb2NrKTsKKwkJKmhvdGRyb3AgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgb3B0bGVuOyApIHsKKwkJaWYgKG9wW2ldID09IG9wdGlvbikgeworCQkJc3Bpbl91bmxvY2tfYmgoJmRjY3BfYnVmbG9jayk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCWlmIChvcFtpXSA8IDIpIAorCQkJaSsrOworCQllbHNlIAorCQkJaSArPSBvcFtpKzFdPzoxOworCX0KKworCXNwaW5fdW5sb2NrX2JoKCZkY2NwX2J1ZmxvY2spOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50CittYXRjaF90eXBlcyhjb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoLCB1X2ludDE2X3QgdHlwZW1hc2spCit7CisJcmV0dXJuICh0eXBlbWFzayAmICgxIDw8IGRoLT5kY2NwaF90eXBlKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CittYXRjaF9vcHRpb24odV9pbnQ4X3Qgb3B0aW9uLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKwkgICAgIGNvbnN0IHN0cnVjdCBkY2NwX2hkciAqZGgsIGludCAqaG90ZHJvcCkKK3sKKwlyZXR1cm4gZGNjcF9maW5kX29wdGlvbihvcHRpb24sIHNrYiwgcHJvdG9mZiwgZGgsIGhvdGRyb3ApOworfQorCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKwljb25zdCBzdHJ1Y3QgeHRfZGNjcF9pbmZvICppbmZvID0gCisJCQkJKGNvbnN0IHN0cnVjdCB4dF9kY2NwX2luZm8gKiltYXRjaGluZm87CisJc3RydWN0IGRjY3BfaGRyIF9kaCwgKmRoOworCisJaWYgKG9mZnNldCkKKwkJcmV0dXJuIDA7CisJCisJZGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b2ZmLCBzaXplb2YoX2RoKSwgJl9kaCk7CisJaWYgKGRoID09IE5VTEwpIHsKKwkJKmhvdGRyb3AgPSAxOworCQlyZXR1cm4gMDsKKyAgICAgICAJfQorCisJcmV0dXJuICBEQ0NIRUNLKCgobnRvaHMoZGgtPmRjY3BoX3Nwb3J0KSA+PSBpbmZvLT5zcHRzWzBdKSAKKwkJCSYmIChudG9ocyhkaC0+ZGNjcGhfc3BvcnQpIDw9IGluZm8tPnNwdHNbMV0pKSwgCisJCSAgIAlYVF9EQ0NQX1NSQ19QT1JUUywgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKQorCQkmJiBEQ0NIRUNLKCgobnRvaHMoZGgtPmRjY3BoX2Rwb3J0KSA+PSBpbmZvLT5kcHRzWzBdKSAKKwkJCSYmIChudG9ocyhkaC0+ZGNjcGhfZHBvcnQpIDw9IGluZm8tPmRwdHNbMV0pKSwgCisJCQlYVF9EQ0NQX0RFU1RfUE9SVFMsIGluZm8tPmZsYWdzLCBpbmZvLT5pbnZmbGFncykKKwkJJiYgRENDSEVDSyhtYXRjaF90eXBlcyhkaCwgaW5mby0+dHlwZW1hc2spLAorCQkJICAgWFRfRENDUF9UWVBFLCBpbmZvLT5mbGFncywgaW5mby0+aW52ZmxhZ3MpCisJCSYmIERDQ0hFQ0sobWF0Y2hfb3B0aW9uKGluZm8tPm9wdGlvbiwgc2tiLCBwcm90b2ZmLCBkaCwKKwkJCQkJaG90ZHJvcCksCisJCQkgICBYVF9EQ0NQX09QVElPTiwgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKTsKK30KKworc3RhdGljIGludAorY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgY29uc3Qgdm9pZCAqaW5mLAorCSAgIHZvaWQgKm1hdGNoaW5mbywKKwkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAgPSBpbmY7CisJY29uc3Qgc3RydWN0IHh0X2RjY3BfaW5mbyAqaW5mbzsKKworCWluZm8gPSAoY29uc3Qgc3RydWN0IHh0X2RjY3BfaW5mbyAqKW1hdGNoaW5mbzsKKworCXJldHVybiBpcC0+cHJvdG8gPT0gSVBQUk9UT19EQ0NQCisJCSYmICEoaXAtPmludmZsYWdzICYgWFRfSU5WX1BST1RPKQorCQkmJiBtYXRjaHNpemUgPT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9kY2NwX2luZm8pKQorCQkmJiAhKGluZm8tPmZsYWdzICYgflhUX0RDQ1BfVkFMSURfRkxBR1MpCisJCSYmICEoaW5mby0+aW52ZmxhZ3MgJiB+WFRfRENDUF9WQUxJRF9GTEFHUykKKwkJJiYgIShpbmZvLT5pbnZmbGFncyAmIH5pbmZvLT5mbGFncyk7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnk2KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkgICBjb25zdCB2b2lkICppbmYsCisJICAgdm9pZCAqbWF0Y2hpbmZvLAorCSAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwID0gaW5mOworCWNvbnN0IHN0cnVjdCB4dF9kY2NwX2luZm8gKmluZm87CisKKwlpbmZvID0gKGNvbnN0IHN0cnVjdCB4dF9kY2NwX2luZm8gKiltYXRjaGluZm87CisKKwlyZXR1cm4gaXAtPnByb3RvID09IElQUFJPVE9fRENDUAorCQkmJiAhKGlwLT5pbnZmbGFncyAmIFhUX0lOVl9QUk9UTykKKwkJJiYgbWF0Y2hzaXplID09IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfZGNjcF9pbmZvKSkKKwkJJiYgIShpbmZvLT5mbGFncyAmIH5YVF9EQ0NQX1ZBTElEX0ZMQUdTKQorCQkmJiAhKGluZm8tPmludmZsYWdzICYgflhUX0RDQ1BfVkFMSURfRkxBR1MpCisJCSYmICEoaW5mby0+aW52ZmxhZ3MgJiB+aW5mby0+ZmxhZ3MpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggZGNjcF9tYXRjaCA9IAoreyAKKwkubmFtZSAJCT0gImRjY3AiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUgCQk9IFRISVNfTU9EVUxFLAorfTsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggZGNjcDZfbWF0Y2ggPSAKK3sgCisJLm5hbWUgCQk9ICJkY2NwIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnk2LAorCS5tZSAJCT0gVEhJU19NT0RVTEUsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJLyogZG9mZiBpcyA4IGJpdHMsIHNvIHRoZSBtYXhpbXVtIG9wdGlvbiBzaXplIGlzICg0KjI1NikuICBEb24ndCBwdXQKKwkgKiB0aGlzIGluIEJTUyBzaW5jZSBEYXZlTSBpcyB3b3JyaWVkIGFib3V0IGxvY2tlZCBUTEIncyBmb3Iga2VybmVsCisJICogQlNTLiAqLworCWRjY3Bfb3B0YnVmID0ga21hbGxvYygyNTYgKiA0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRjY3Bfb3B0YnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmZGNjcF9tYXRjaCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfa2ZyZWU7CisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZkY2NwNl9tYXRjaCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfdW5yZWc7CisKKwlyZXR1cm4gcmV0OworCitvdXRfdW5yZWc6CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmZGNjcF9tYXRjaCk7CitvdXRfa2ZyZWU6CisJa2ZyZWUoZGNjcF9vcHRidWYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmZGNjcDZfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmRjY3BfbWF0Y2gpOworCWtmcmVlKGRjY3Bfb3B0YnVmKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfaGVscGVyLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2hlbHBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YjY3MTUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2hlbHBlci5jCkBAIC0wLDAgKzEsMTg4IEBACisvKiBpcHRhYmxlcyBtb2R1bGUgdG8gbWF0Y2ggb24gcmVsYXRlZCBjb25uZWN0aW9ucyAqLworLyoKKyAqIChDKSAyMDAxIE1hcnRpbiBKb3NlZnNzb24gPGdhbmRhbGZAd2x1Zy53ZXN0Ym8uc2U+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgIDE5IE1hciAyMDAyIEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+OgorICogICAJCSAtIFBvcnQgdG8gbmV3bmF0IGluZnJhc3RydWN0dXJlCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01PRFVMRSkKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaD4KKyNlbHNlCisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfaGVscGVyLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk1hcnRpbiBKb3NlZnNzb24gPGdhbmRhbGZAbmV0ZmlsdGVyLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgaGVscGVyIG1hdGNoIG1vZHVsZSIpOworTU9EVUxFX0FMSUFTKCJpcHRfaGVscGVyIik7CitNT0RVTEVfQUxJQVMoImlwNnRfaGVscGVyIik7CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUCBwcmludGsKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01PRFVMRSkKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgaW50ICpob3Rkcm9wKQoreworCWNvbnN0IHN0cnVjdCB4dF9oZWxwZXJfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKKwllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKKwlpbnQgcmV0ID0gaW5mby0+aW52ZXJ0OworCQorCWN0ID0gaXBfY29ubnRyYWNrX2dldCgoc3RydWN0IHNrX2J1ZmYgKilza2IsICZjdGluZm8pOworCWlmICghY3QpIHsKKwkJREVCVUdQKCJ4dF9oZWxwZXI6IEVlayEgaW52YWxpZCBjb25udHJhY2s/XG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIWN0LT5tYXN0ZXIpIHsKKwkJREVCVUdQKCJ4dF9oZWxwZXI6IGNvbm50cmFjayAlcCBoYXMgbm8gbWFzdGVyXG4iLCBjdCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmVhZF9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7CisJaWYgKCFjdC0+bWFzdGVyLT5oZWxwZXIpIHsKKwkJREVCVUdQKCJ4dF9oZWxwZXI6IG1hc3RlciBjdCAlcCBoYXMgbm8gaGVscGVyXG4iLCAKKwkJCWV4cC0+ZXhwZWN0YW50KTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCURFQlVHUCgibWFzdGVyJ3MgbmFtZSA9ICVzICwgaW5mby0+bmFtZSA9ICVzXG4iLCAKKwkJY3QtPm1hc3Rlci0+aGVscGVyLT5uYW1lLCBpbmZvLT5uYW1lKTsKKworCWlmIChpbmZvLT5uYW1lWzBdID09ICdcMCcpCisJCXJldCBePSAxOworCWVsc2UKKwkJcmV0IF49ICFzdHJuY21wKGN0LT5tYXN0ZXItPmhlbHBlci0+bmFtZSwgaW5mby0+bmFtZSwgCisJCSAgICAgICAgICAgICAgICBzdHJsZW4oY3QtPm1hc3Rlci0+aGVscGVyLT5uYW1lKSk7CitvdXRfdW5sb2NrOgorCXJlYWRfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworI2Vsc2UgLyogQ09ORklHX0lQX05GX0NPTk5UUkFDSyAqLworCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKwljb25zdCBzdHJ1Y3QgeHRfaGVscGVyX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJc3RydWN0IG5mX2Nvbm4gKmN0OworCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOworCWludCByZXQgPSBpbmZvLT5pbnZlcnQ7CisJCisJY3QgPSBuZl9jdF9nZXQoKHN0cnVjdCBza19idWZmICopc2tiLCAmY3RpbmZvKTsKKwlpZiAoIWN0KSB7CisJCURFQlVHUCgieHRfaGVscGVyOiBFZWshIGludmFsaWQgY29ubnRyYWNrP1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCFjdC0+bWFzdGVyKSB7CisJCURFQlVHUCgieHRfaGVscGVyOiBjb25udHJhY2sgJXAgaGFzIG5vIG1hc3RlclxuIiwgY3QpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJlYWRfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCWlmICghY3QtPm1hc3Rlci0+aGVscGVyKSB7CisJCURFQlVHUCgieHRfaGVscGVyOiBtYXN0ZXIgY3QgJXAgaGFzIG5vIGhlbHBlclxuIiwgCisJCQlleHAtPmV4cGVjdGFudCk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlERUJVR1AoIm1hc3RlcidzIG5hbWUgPSAlcyAsIGluZm8tPm5hbWUgPSAlc1xuIiwgCisJCWN0LT5tYXN0ZXItPmhlbHBlci0+bmFtZSwgaW5mby0+bmFtZSk7CisKKwlpZiAoaW5mby0+bmFtZVswXSA9PSAnXDAnKQorCQlyZXQgXj0gMTsKKwllbHNlCisJCXJldCBePSAhc3RybmNtcChjdC0+bWFzdGVyLT5oZWxwZXItPm5hbWUsIGluZm8tPm5hbWUsIAorCQkgICAgICAgICAgICAgICAgc3RybGVuKGN0LT5tYXN0ZXItPmhlbHBlci0+bmFtZSkpOworb3V0X3VubG9jazoKKwlyZWFkX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBjaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCSBjb25zdCB2b2lkICppbmYsCisJCSB2b2lkICptYXRjaGluZm8sCisJCSB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorCQkgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlzdHJ1Y3QgeHRfaGVscGVyX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisKKwlpbmZvLT5uYW1lWzI5XSA9ICdcMCc7CisKKwkvKiB2ZXJpZnkgc2l6ZSAqLworCWlmIChtYXRjaHNpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9oZWxwZXJfaW5mbykpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGhlbHBlcl9tYXRjaCA9IHsKKwkubmFtZQkJPSAiaGVscGVyIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrLAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGhlbHBlcjZfbWF0Y2ggPSB7CisJLm5hbWUJCT0gImhlbHBlciIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVjaywKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldDsKKwluZWVkX2Nvbm50cmFjaygpOworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmhlbHBlcl9tYXRjaCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJmhlbHBlcjZfbWF0Y2gpOworCWlmIChyZXQgPCAwKQorCQl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZoZWxwZXJfbWF0Y2gpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZoZWxwZXJfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZoZWxwZXI2X21hdGNoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKKwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9sZW5ndGguYyBiL25ldC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljOGZhZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmMKQEAgLTAsMCArMSw5OSBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBwYWNrZXQgbGVuZ3RoLiAqLworLyogKEMpIDE5OTktMjAwMSBKYW1lcyBNb3JyaXMgPGptb3Jyb3NAaW50ZXJjb2RlLmNvbS5hdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisKK01PRFVMRV9BVVRIT1IoIkphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJUCB0YWJsZXMgcGFja2V0IGxlbmd0aCBtYXRjaGluZyBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXB0X2xlbmd0aCIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X2xlbmd0aCIpOworCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKwljb25zdCBzdHJ1Y3QgeHRfbGVuZ3RoX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJdV9pbnQxNl90IHBrdGxlbiA9IG50b2hzKHNrYi0+bmguaXBoLT50b3RfbGVuKTsKKwkKKwlyZXR1cm4gKHBrdGxlbiA+PSBpbmZvLT5taW4gJiYgcGt0bGVuIDw9IGluZm8tPm1heCkgXiBpbmZvLT5pbnZlcnQ7Cit9CisKK3N0YXRpYyBpbnQKK21hdGNoNihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgIGludCAqaG90ZHJvcCkKK3sKKwljb25zdCBzdHJ1Y3QgeHRfbGVuZ3RoX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJdV9pbnQxNl90IHBrdGxlbiA9IG50b2hzKHNrYi0+bmguaXB2NmgtPnBheWxvYWRfbGVuKSArIHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJCisJcmV0dXJuIChwa3RsZW4gPj0gaW5mby0+bWluICYmIHBrdGxlbiA8PSBpbmZvLT5tYXgpIF4gaW5mby0+aW52ZXJ0OworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKyAgICAgICAgICAgY29uc3Qgdm9pZCAqaXAsCisgICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKyAgICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKyAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfbGVuZ3RoX2luZm8pKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBsZW5ndGhfbWF0Y2ggPSB7CisJLm5hbWUJCT0gImxlbmd0aCIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGxlbmd0aDZfbWF0Y2ggPSB7CisJLm5hbWUJCT0gImxlbmd0aCIsCisJLm1hdGNoCQk9ICZtYXRjaDYsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmbGVuZ3RoX21hdGNoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmbGVuZ3RoNl9tYXRjaCk7CisJaWYgKHJldCkKKwkJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmbGVuZ3RoX21hdGNoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmbGVuZ3RoX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmbGVuZ3RoNl9tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2xpbWl0LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2xpbWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlNDA1MAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfbGltaXQuYwpAQCAtMCwwICsxLDE3NSBAQAorLyogS2VybmVsIG1vZHVsZSB0byBjb250cm9sIHRoZSByYXRlCisgKgorICogMiBTZXB0ZW1iZXIgMTk5OTogQ2hhbmdlZCBmcm9tIHRoZSB0YXJnZXQgUkFURSB0byB0aGUgbWF0Y2gKKyAqICAgICAgICAgICAgICAgICAgIGBsaW1pdCcsIHJlbW92ZWQgbG9nZ2luZy4gIERpZCBJIG1lbnRpb24gdGhhdAorICogICAgICAgICAgICAgICAgICAgQWxleGV5IGlzIGEgZnVja2luZyBnZW5pdXM/CisgKiAgICAgICAgICAgICAgICAgICBSdXN0eSBSdXNzZWxsIChydXN0eUBydXN0Y29ycC5jb20uYXUpLiAgKi8KKworLyogKEMpIDE5OTkgSuly9G1lIGRlIFZpdmllIDxkZXZpdmllQGluZm8uZW5zZXJiLnUtYm9yZGVhdXguZnI+CisgKiAoQykgMTk5OSBIZXJ26SBFeWNoZW5uZSA8ZXljaGVubmVAaW5mby5lbnNlcmIudS1ib3JkZWF1eC5mcj4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2xpbWl0Lmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkhlcnZlIEV5Y2hlbm5lIDxydkB3YWxsZmlyZS5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIHJhdGUgbGltaXQgbWF0Y2giKTsKK01PRFVMRV9BTElBUygiaXB0X2xpbWl0Iik7CitNT0RVTEVfQUxJQVMoImlwNnRfbGltaXQiKTsKKworLyogVGhlIGFsZ29yaXRobSB1c2VkIGlzIHRoZSBTaW1wbGUgVG9rZW4gQnVja2V0IEZpbHRlciAoVEJGKQorICogc2VlIG5ldC9zY2hlZC9zY2hfdGJmLmMgaW4gdGhlIGxpbnV4IHNvdXJjZSB0cmVlCisgKi8KKworc3RhdGljIERFRklORV9TUElOTE9DSyhsaW1pdF9sb2NrKTsKKworLyogUnVzdHk6IFRoaXMgaXMgbXkgKG5vbi1tYXRoZW1hdGljYWxseS1pbmNsaW5lZCkgdW5kZXJzdGFuZGluZyBvZgorICAgdGhpcyBhbGdvcml0aG0uICBUaGUgYGF2ZXJhZ2UgcmF0ZScgaW4gamlmZmllcyBiZWNvbWVzIHlvdXIgaW5pdGlhbAorICAgYW1vdW50IG9mIGNyZWRpdCBgY3JlZGl0JyBhbmQgdGhlIG1vc3QgY3JlZGl0IHlvdSBjYW4gZXZlciBoYXZlCisgICBgY3JlZGl0X2NhcCcuICBUaGUgYHBlYWsgcmF0ZScgYmVjb21lcyB0aGUgY29zdCBvZiBwYXNzaW5nIHRoZQorICAgdGVzdCwgYGNvc3QnLgorCisgICBgcHJldicgdHJhY2tzIHRoZSBsYXN0IHBhY2tldCBoaXQ6IHlvdSBnYWluIG9uZSBjcmVkaXQgcGVyIGppZmZ5LgorICAgSWYgeW91IGdldCBjcmVkaXQgYmFsYW5jZSBtb3JlIHRoYW4gdGhpcywgdGhlIGV4dHJhIGNyZWRpdCBpcworICAgZGlzY2FyZGVkLiAgRXZlcnkgdGltZSB0aGUgbWF0Y2ggcGFzc2VzLCB5b3UgbG9zZSBgY29zdCcgY3JlZGl0czsKKyAgIGlmIHlvdSBkb24ndCBoYXZlIHRoYXQgbWFueSwgdGhlIHRlc3QgZmFpbHMuCisKKyAgIFNlZSBBbGV4ZXkncyBmb3JtYWwgZXhwbGFuYXRpb24gaW4gbmV0L3NjaGVkL3NjaF90YmYuYy4KKworICAgVG8gZ2V0IHRoZSBtYXhtdW0gcmFuZ2UsIHdlIG11bHRpcGx5IGJ5IHRoaXMgZmFjdG9yIChpZS4geW91IGdldCBOCisgICBjcmVkaXRzIHBlciBqaWZmeSkuICBXZSB3YW50IHRvIGFsbG93IGEgcmF0ZSBhcyBsb3cgYXMgMSBwZXIgZGF5CisgICAoc2xvd2VzdCB1c2Vyc3BhY2UgdG9vbCBhbGxvd3MpLCB3aGljaCBtZWFucworICAgQ1JFRElUU19QRVJfSklGRlkqSFoqNjAqNjAqMjQgPCAyXjMyLiBpZS4gKi8KKyNkZWZpbmUgTUFYX0NQSiAoMHhGRkZGRkZGRiAvIChIWio2MCo2MCoyNCkpCisKKy8qIFJlcGVhdGVkIHNoaWZ0IGFuZCBvciBnaXZlcyB1cyBhbGwgMXMsIGZpbmFsIHNoaWZ0IGFuZCBhZGQgMSBnaXZlcworICogdXMgdGhlIHBvd2VyIG9mIDIgYmVsb3cgdGhlIHRoZW9yZXRpY2FsIG1heCwgc28gR0NDIHNpbXBseSBkb2VzIGEKKyAqIHNoaWZ0LiAqLworI2RlZmluZSBfUE9XMl9CRUxPVzIoeCkgKCh4KXwoKHgpPj4xKSkKKyNkZWZpbmUgX1BPVzJfQkVMT1c0KHgpIChfUE9XMl9CRUxPVzIoeCl8X1BPVzJfQkVMT1cyKCh4KT4+MikpCisjZGVmaW5lIF9QT1cyX0JFTE9XOCh4KSAoX1BPVzJfQkVMT1c0KHgpfF9QT1cyX0JFTE9XNCgoeCk+PjQpKQorI2RlZmluZSBfUE9XMl9CRUxPVzE2KHgpIChfUE9XMl9CRUxPVzgoeCl8X1BPVzJfQkVMT1c4KCh4KT4+OCkpCisjZGVmaW5lIF9QT1cyX0JFTE9XMzIoeCkgKF9QT1cyX0JFTE9XMTYoeCl8X1BPVzJfQkVMT1cxNigoeCk+PjE2KSkKKyNkZWZpbmUgUE9XMl9CRUxPVzMyKHgpICgoX1BPVzJfQkVMT1czMih4KT4+MSkgKyAxKQorCisjZGVmaW5lIENSRURJVFNfUEVSX0pJRkZZIFBPVzJfQkVMT1czMihNQVhfQ1BKKQorCitzdGF0aWMgaW50CitpcHRfbGltaXRfbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQljb25zdCB2b2lkICptYXRjaGluZm8sCisJCWludCBvZmZzZXQsCisJCXVuc2lnbmVkIGludCBwcm90b2ZmLAorCQlpbnQgKmhvdGRyb3ApCit7CisJc3RydWN0IHh0X3JhdGVpbmZvICpyID0gKChzdHJ1Y3QgeHRfcmF0ZWluZm8gKiltYXRjaGluZm8pLT5tYXN0ZXI7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOworCisJc3Bpbl9sb2NrX2JoKCZsaW1pdF9sb2NrKTsKKwlyLT5jcmVkaXQgKz0gKG5vdyAtIHhjaGcoJnItPnByZXYsIG5vdykpICogQ1JFRElUU19QRVJfSklGRlk7CisJaWYgKHItPmNyZWRpdCA+IHItPmNyZWRpdF9jYXApCisJCXItPmNyZWRpdCA9IHItPmNyZWRpdF9jYXA7CisKKwlpZiAoci0+Y3JlZGl0ID49IHItPmNvc3QpIHsKKwkJLyogV2UncmUgbm90IGxpbWl0ZWQuICovCisJCXItPmNyZWRpdCAtPSByLT5jb3N0OworCQlzcGluX3VubG9ja19iaCgmbGltaXRfbG9jayk7CisJCXJldHVybiAxOworCX0KKworICAgICAgIAlzcGluX3VubG9ja19iaCgmbGltaXRfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFByZWNpc2lvbiBzYXZlci4gKi8KK3N0YXRpYyB1X2ludDMyX3QKK3VzZXIyY3JlZGl0cyh1X2ludDMyX3QgdXNlcikKK3sKKwkvKiBJZiBtdWx0aXBseWluZyB3b3VsZCBvdmVyZmxvdy4uLiAqLworCWlmICh1c2VyID4gMHhGRkZGRkZGRiAvIChIWipDUkVESVRTX1BFUl9KSUZGWSkpCisJCS8qIERpdmlkZSBmaXJzdC4gKi8KKwkJcmV0dXJuICh1c2VyIC8gWFRfTElNSVRfU0NBTEUpICogSFogKiBDUkVESVRTX1BFUl9KSUZGWTsKKworCXJldHVybiAodXNlciAqIEhaICogQ1JFRElUU19QRVJfSklGRlkpIC8gWFRfTElNSVRfU0NBTEU7Cit9CisKK3N0YXRpYyBpbnQKK2lwdF9saW1pdF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkJICAgICBjb25zdCB2b2lkICppbmYsCisJCSAgICAgdm9pZCAqbWF0Y2hpbmZvLAorCQkgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisJCSAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlzdHJ1Y3QgeHRfcmF0ZWluZm8gKnIgPSBtYXRjaGluZm87CisKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfcmF0ZWluZm8pKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBDaGVjayBmb3Igb3ZlcmZsb3cuICovCisJaWYgKHItPmJ1cnN0ID09IDAKKwkgICAgfHwgdXNlcjJjcmVkaXRzKHItPmF2ZyAqIHItPmJ1cnN0KSA8IHVzZXIyY3JlZGl0cyhyLT5hdmcpKSB7CisJCXByaW50aygiT3ZlcmZsb3cgaW4geHRfbGltaXQsIHRyeSBsb3dlcjogJXUvJXVcbiIsCisJCSAgICAgICByLT5hdmcsIHItPmJ1cnN0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVXNlciBhdmcgaW4gc2Vjb25kcyAqIFhUX0xJTUlUX1NDQUxFOiBjb252ZXJ0IHRvIGppZmZpZXMgKgorCSAgIDEyOC4gKi8KKwlyLT5wcmV2ID0gamlmZmllczsKKwlyLT5jcmVkaXQgPSB1c2VyMmNyZWRpdHMoci0+YXZnICogci0+YnVyc3QpOwkgLyogQ3JlZGl0cyBmdWxsLiAqLworCXItPmNyZWRpdF9jYXAgPSB1c2VyMmNyZWRpdHMoci0+YXZnICogci0+YnVyc3QpOyAvKiBDcmVkaXRzIGZ1bGwuICovCisJci0+Y29zdCA9IHVzZXIyY3JlZGl0cyhyLT5hdmcpOworCisJLyogRm9yIFNNUCwgd2Ugb25seSB3YW50IHRvIHVzZSBvbmUgc2V0IG9mIGNvdW50ZXJzLiAqLworCXItPm1hc3RlciA9IHI7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBpcHRfbGltaXRfcmVnID0geworCS5uYW1lCQk9ICJsaW1pdCIsCisJLm1hdGNoCQk9IGlwdF9saW1pdF9tYXRjaCwKKwkuY2hlY2tlbnRyeQk9IGlwdF9saW1pdF9jaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGxpbWl0Nl9yZWcgPSB7CisJLm5hbWUJCT0gImxpbWl0IiwKKwkubWF0Y2gJCT0gaXB0X2xpbWl0X21hdGNoLAorCS5jaGVja2VudHJ5CT0gaXB0X2xpbWl0X2NoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCByZXQ7CisJCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmlwdF9saW1pdF9yZWcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZsaW1pdDZfcmVnKTsKKwlpZiAocmV0KQorCQl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZpcHRfbGltaXRfcmVnKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmaXB0X2xpbWl0X3JlZyk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJmxpbWl0Nl9yZWcpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9tYWMuYyBiL25ldC9uZXRmaWx0ZXIveHRfbWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ2MWRjYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfbWFjLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggTUFDIGFkZHJlc3MgcGFyYW1ldGVycy4gKi8KKworLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAorICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X21hYy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBtYWMgbWF0Y2hpbmcgbW9kdWxlIik7CitNT0RVTEVfQUxJQVMoImlwdF9tYWMiKTsKK01PRFVMRV9BTElBUygiaXA2dF9tYWMiKTsKKworc3RhdGljIGludAorbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisgICAgY29uc3Qgc3RydWN0IHh0X21hY19pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCisgICAgLyogSXMgbWFjIHBvaW50ZXIgdmFsaWQ/ICovCisgICAgcmV0dXJuIChza2ItPm1hYy5yYXcgPj0gc2tiLT5oZWFkCisJICAgICYmIChza2ItPm1hYy5yYXcgKyBFVEhfSExFTikgPD0gc2tiLT5kYXRhCisJICAgIC8qIElmIHNvLCBjb21wYXJlLi4uICovCisJICAgICYmICgoIWNvbXBhcmVfZXRoZXJfYWRkcihldGhfaGRyKHNrYiktPmhfc291cmNlLCBpbmZvLT5zcmNhZGRyKSkKKwkJXiBpbmZvLT5pbnZlcnQpKTsKK30KKworc3RhdGljIGludAoraXB0X21hY19jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkJICAgY29uc3Qgdm9pZCAqaW5mLAorCQkgICB2b2lkICptYXRjaGluZm8sCisJCSAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisJCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJLyogRk9SV0FSRCBpc24ndCBhbHdheXMgdmFsaWQsIGJ1dCBpdCdzIG5pY2UgdG8gYmUgYWJsZSB0byBkbyAtLVJSICovCisJaWYgKGhvb2tfbWFzaworCSAgICAmIH4oKDEgPDwgTkZfSVBfUFJFX1JPVVRJTkcpIHwgKDEgPDwgTkZfSVBfTE9DQUxfSU4pCisJCXwgKDEgPDwgTkZfSVBfRk9SV0FSRCkpKSB7CisJCXByaW50aygieHRfbWFjOiBvbmx5IHZhbGlkIGZvciBQUkVfUk9VVElORywgTE9DQUxfSU4gb3IgRk9SV0FSRC5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfbWFjX2luZm8pKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBtYWNfbWF0Y2ggPSB7CisJLm5hbWUJCT0gIm1hYyIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZpcHRfbWFjX2NoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggbWFjNl9tYXRjaCA9IHsKKwkubmFtZQkJPSAibWFjIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmlwdF9tYWNfY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmbWFjX21hdGNoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZtYWM2X21hdGNoKTsKKwlpZiAocmV0KQorCQl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZtYWNfbWF0Y2gpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZtYWNfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZtYWM2X21hdGNoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfbWFyay5jIGIvbmV0L25ldGZpbHRlci94dF9tYXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEwYWM2MgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfbWFyay5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggTkZNQVJLIHZhbHVlcy4gKi8KKworLyogKEMpIDE5OTktMjAwMSBNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9tYXJrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBtYXJrIG1hdGNoaW5nIG1vZHVsZSIpOworTU9EVUxFX0FMSUFTKCJpcHRfbWFyayIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X21hcmsiKTsKKworc3RhdGljIGludAorbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IHh0X21hcmtfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKworCXJldHVybiAoKHNrYi0+bmZtYXJrICYgaW5mby0+bWFzaykgPT0gaW5mby0+bWFyaykgXiBpbmZvLT5pbnZlcnQ7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorICAgICAgICAgICBjb25zdCB2b2lkICplbnRyeSwKKyAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCXN0cnVjdCB4dF9tYXJrX2luZm8gKm1pbmZvID0gKHN0cnVjdCB4dF9tYXJrX2luZm8gKikgbWF0Y2hpbmZvOworCisJaWYgKG1hdGNoc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X21hcmtfaW5mbykpKQorCQlyZXR1cm4gMDsKKworCWlmIChtaW5mby0+bWFyayA+IDB4ZmZmZmZmZmYgfHwgbWluZm8tPm1hc2sgPiAweGZmZmZmZmZmKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1hcms6IG9ubHkgc3VwcG9ydHMgMzJiaXQgbWFya1xuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIG1hcmtfbWF0Y2ggPSB7CisJLm5hbWUJCT0gIm1hcmsiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIG1hcms2X21hdGNoID0geworCS5uYW1lCQk9ICJtYXJrIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCByZXQ7CisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJm1hcmtfbWF0Y2gpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJm1hcms2X21hdGNoKTsKKwlpZiAocmV0KQorCQl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZtYXJrX21hdGNoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmbWFya19tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJm1hcms2X21hdGNoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5jIGIvbmV0L25ldGZpbHRlci94dF9waHlzZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliYjU3YwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5jCkBAIC0wLDAgKzEsMTU1IEBACisvKiBLZXJuZWwgbW9kdWxlIHRvIG1hdGNoIHRoZSBicmlkZ2UgcG9ydCBpbiBhbmQKKyAqIG91dCBkZXZpY2UgZm9yIElQIHBhY2tldHMgY29taW5nIGludG8gY29udGFjdCB3aXRoIGEgYnJpZGdlLiAqLworCisvKiAoQykgMjAwMS0yMDAzIEJhcnQgRGUgU2NodXltZXIgPGJkc2NodXltQHBhbmRvcmEuYmU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlLmg+CisjZGVmaW5lIE1BVENIICAgMQorI2RlZmluZSBOT01BVENIIDAKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgYnJpZGdlIHBoeXNpY2FsIGRldmljZSBtYXRjaCBtb2R1bGUiKTsKK01PRFVMRV9BTElBUygiaXB0X3BoeXNkZXYiKTsKK01PRFVMRV9BTElBUygiaXA2dF9waHlzZGV2Iik7CisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgaW50ICpob3Rkcm9wKQoreworCWludCBpOworCXN0YXRpYyBjb25zdCBjaGFyIG51bGxkZXZuYW1lW0lGTkFNU0laXTsKKwljb25zdCBzdHJ1Y3QgeHRfcGh5c2Rldl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCXVuc2lnbmVkIGludCByZXQ7CisJY29uc3QgY2hhciAqaW5kZXYsICpvdXRkZXY7CisJc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2U7CisKKwkvKiBOb3QgYSBicmlkZ2VkIElQIHBhY2tldCBvciBubyBpbmZvIGF2YWlsYWJsZSB5ZXQ6CisJICogTE9DQUxfT1VUL21hbmdsZSBhbmQgTE9DQUxfT1VUL25hdCBkb24ndCBrbm93IGlmCisJICogdGhlIGRlc3RpbmF0aW9uIGRldmljZSB3aWxsIGJlIGEgYnJpZGdlLiAqLworCWlmICghKG5mX2JyaWRnZSA9IHNrYi0+bmZfYnJpZGdlKSkgeworCQkvKiBSZXR1cm4gTUFUQ0ggaWYgdGhlIGludmVydCBmbGFncyBvZiB0aGUgdXNlZCBvcHRpb25zIGFyZSBvbiAqLworCQlpZiAoKGluZm8tPmJpdG1hc2sgJiBYVF9QSFlTREVWX09QX0JSSURHRUQpICYmCisJCSAgICAhKGluZm8tPmludmVydCAmIFhUX1BIWVNERVZfT1BfQlJJREdFRCkpCisJCQlyZXR1cm4gTk9NQVRDSDsKKwkJaWYgKChpbmZvLT5iaXRtYXNrICYgWFRfUEhZU0RFVl9PUF9JU0lOKSAmJgorCQkgICAgIShpbmZvLT5pbnZlcnQgJiBYVF9QSFlTREVWX09QX0lTSU4pKQorCQkJcmV0dXJuIE5PTUFUQ0g7CisJCWlmICgoaW5mby0+Yml0bWFzayAmIFhUX1BIWVNERVZfT1BfSVNPVVQpICYmCisJCSAgICAhKGluZm8tPmludmVydCAmIFhUX1BIWVNERVZfT1BfSVNPVVQpKQorCQkJcmV0dXJuIE5PTUFUQ0g7CisJCWlmICgoaW5mby0+Yml0bWFzayAmIFhUX1BIWVNERVZfT1BfSU4pICYmCisJCSAgICAhKGluZm8tPmludmVydCAmIFhUX1BIWVNERVZfT1BfSU4pKQorCQkJcmV0dXJuIE5PTUFUQ0g7CisJCWlmICgoaW5mby0+Yml0bWFzayAmIFhUX1BIWVNERVZfT1BfT1VUKSAmJgorCQkgICAgIShpbmZvLT5pbnZlcnQgJiBYVF9QSFlTREVWX09QX09VVCkpCisJCQlyZXR1cm4gTk9NQVRDSDsKKwkJcmV0dXJuIE1BVENIOworCX0KKworCS8qIFRoaXMgb25seSBtYWtlcyBzZW5zZSBpbiB0aGUgRk9SV0FSRCBhbmQgUE9TVFJPVVRJTkcgY2hhaW5zICovCisJaWYgKChpbmZvLT5iaXRtYXNrICYgWFRfUEhZU0RFVl9PUF9CUklER0VEKSAmJgorCSAgICAoISEobmZfYnJpZGdlLT5tYXNrICYgQlJORl9CUklER0VEKSBeCisJICAgICEoaW5mby0+aW52ZXJ0ICYgWFRfUEhZU0RFVl9PUF9CUklER0VEKSkpCisJCXJldHVybiBOT01BVENIOworCisJaWYgKChpbmZvLT5iaXRtYXNrICYgWFRfUEhZU0RFVl9PUF9JU0lOICYmCisJICAgICghbmZfYnJpZGdlLT5waHlzaW5kZXYgXiAhIShpbmZvLT5pbnZlcnQgJiBYVF9QSFlTREVWX09QX0lTSU4pKSkgfHwKKwkgICAgKGluZm8tPmJpdG1hc2sgJiBYVF9QSFlTREVWX09QX0lTT1VUICYmCisJICAgICghbmZfYnJpZGdlLT5waHlzb3V0ZGV2IF4gISEoaW5mby0+aW52ZXJ0ICYgWFRfUEhZU0RFVl9PUF9JU09VVCkpKSkKKwkJcmV0dXJuIE5PTUFUQ0g7CisKKwlpZiAoIShpbmZvLT5iaXRtYXNrICYgWFRfUEhZU0RFVl9PUF9JTikpCisJCWdvdG8gbWF0Y2hfb3V0ZGV2OworCWluZGV2ID0gbmZfYnJpZGdlLT5waHlzaW5kZXYgPyBuZl9icmlkZ2UtPnBoeXNpbmRldi0+bmFtZSA6IG51bGxkZXZuYW1lOworCWZvciAoaSA9IDAsIHJldCA9IDA7IGkgPCBJRk5BTVNJWi9zaXplb2YodW5zaWduZWQgaW50KTsgaSsrKSB7CisJCXJldCB8PSAoKChjb25zdCB1bnNpZ25lZCBpbnQgKilpbmRldilbaV0KKwkJCV4gKChjb25zdCB1bnNpZ25lZCBpbnQgKilpbmZvLT5waHlzaW5kZXYpW2ldKQorCQkJJiAoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZm8tPmluX21hc2spW2ldOworCX0KKworCWlmICgocmV0ID09IDApIF4gIShpbmZvLT5pbnZlcnQgJiBYVF9QSFlTREVWX09QX0lOKSkKKwkJcmV0dXJuIE5PTUFUQ0g7CisKK21hdGNoX291dGRldjoKKwlpZiAoIShpbmZvLT5iaXRtYXNrICYgWFRfUEhZU0RFVl9PUF9PVVQpKQorCQlyZXR1cm4gTUFUQ0g7CisJb3V0ZGV2ID0gbmZfYnJpZGdlLT5waHlzb3V0ZGV2ID8KKwkJIG5mX2JyaWRnZS0+cGh5c291dGRldi0+bmFtZSA6IG51bGxkZXZuYW1lOworCWZvciAoaSA9IDAsIHJldCA9IDA7IGkgPCBJRk5BTVNJWi9zaXplb2YodW5zaWduZWQgaW50KTsgaSsrKSB7CisJCXJldCB8PSAoKChjb25zdCB1bnNpZ25lZCBpbnQgKilvdXRkZXYpW2ldCisJCQleICgoY29uc3QgdW5zaWduZWQgaW50ICopaW5mby0+cGh5c291dGRldilbaV0pCisJCQkmICgoY29uc3QgdW5zaWduZWQgaW50ICopaW5mby0+b3V0X21hc2spW2ldOworCX0KKworCXJldHVybiAocmV0ICE9IDApIF4gIShpbmZvLT5pbnZlcnQgJiBYVF9QSFlTREVWX09QX09VVCk7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCQkgICAgICAgY29uc3Qgdm9pZCAqaXAsCisJCSAgICAgICB2b2lkICptYXRjaGluZm8sCisJCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgeHRfcGh5c2Rldl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCisJaWYgKG1hdGNoc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X3BoeXNkZXZfaW5mbykpKQorCQlyZXR1cm4gMDsKKwlpZiAoIShpbmZvLT5iaXRtYXNrICYgWFRfUEhZU0RFVl9PUF9NQVNLKSB8fAorCSAgICBpbmZvLT5iaXRtYXNrICYgflhUX1BIWVNERVZfT1BfTUFTSykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggcGh5c2Rldl9tYXRjaCA9IHsKKwkubmFtZQkJPSAicGh5c2RldiIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggcGh5c2RldjZfbWF0Y2ggPSB7CisJLm5hbWUJCT0gInBoeXNkZXYiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZwaHlzZGV2X21hdGNoKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmcGh5c2RldjZfbWF0Y2gpOworCWlmIChyZXQgPCAwKQorCQl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZwaHlzZGV2X21hdGNoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmcGh5c2Rldl9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJnBoeXNkZXY2X21hdGNoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5jIGIvbmV0L25ldGZpbHRlci94dF9wa3R0eXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIxYjI2MwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5jCkBAIC0wLDAgKzEsODIgQEAKKy8qIChDKSAxOTk5LTIwMDEgTWljaGFsIEx1ZHZpZyA8bWljaGFsQGxvZ2l4LmN6PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcGFja2V0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNaWNoYWwgTHVkdmlnIDxtaWNoYWxAbG9naXguY3o+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklQIHRhYmxlcyBtYXRjaCB0byBtYXRjaCBvbiBsaW5rbGF5ZXIgcGFja2V0IHR5cGUiKTsKK01PRFVMRV9BTElBUygiaXB0X3BrdHR5cGUiKTsKK01PRFVMRV9BTElBUygiaXA2dF9wa3R0eXBlIik7CisKK3N0YXRpYyBpbnQgbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IHh0X3BrdHR5cGVfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKworCXJldHVybiAoc2tiLT5wa3RfdHlwZSA9PSBpbmZvLT5wa3R0eXBlKSBeIGluZm8tPmludmVydDsKK30KKworc3RhdGljIGludCBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkJICAgY29uc3Qgdm9pZCAqaXAsCisJCSAgIHZvaWQgKm1hdGNoaW5mbywKKwkJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfcGt0dHlwZV9pbmZvKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggcGt0dHlwZV9tYXRjaCA9IHsKKwkubmFtZQkJPSAicGt0dHlwZSIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHBrdHR5cGU2X21hdGNoID0geworCS5uYW1lCQk9ICJwa3R0eXBlIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmcGt0dHlwZV9tYXRjaCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmcGt0dHlwZTZfbWF0Y2gpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnBrdHR5cGVfbWF0Y2gpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZwa3R0eXBlX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmcGt0dHlwZTZfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9yZWFsbS5jIGIvbmV0L25ldGZpbHRlci94dF9yZWFsbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiN2UxNzgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3JlYWxtLmMKQEAgLTAsMCArMSw3OSBAQAorLyogSVAgdGFibGVzIG1vZHVsZSBmb3IgbWF0Y2hpbmcgdGhlIHJvdXRpbmcgcmVhbG0KKyAqCisgKiAkSWQ6IGlwdF9yZWFsbS5jLHYgMS4zIDIwMDQvMDMvMDUgMTM6MjU6NDAgbGFmb3JnZSBFeHAgJAorICoKKyAqIChDKSAyMDAzIGJ5IFNhbXBzYSBSYW50YSA8c2FtcHNhQG5ldHNvbmljLmZpPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfcmVhbG0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKworTU9EVUxFX0FVVEhPUigiU2FtcHNhIFJhbnRhIDxzYW1wc2FAbmV0c29uaWMuZmk+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlhfdGFibGVzIHJlYWxtIG1hdGNoIik7CitNT0RVTEVfQUxJQVMoImlwdF9yZWFsbSIpOworCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKwljb25zdCBzdHJ1Y3QgeHRfcmVhbG1faW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2ItPmRzdDsKKyAgICAKKwlyZXR1cm4gKGluZm8tPmlkID09IChkc3QtPnRjbGFzc2lkICYgaW5mby0+bWFzaykpIF4gaW5mby0+aW52ZXJ0OworfQorCitzdGF0aWMgaW50IGNoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqaXAsCisgICAgICAgICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlpZiAoaG9va19tYXNrCisJICAgICYgfigoMSA8PCBORl9JUF9QT1NUX1JPVVRJTkcpIHwgKDEgPDwgTkZfSVBfRk9SV0FSRCkgfAorCSAgICAgICAgKDEgPDwgTkZfSVBfTE9DQUxfT1VUKSB8ICgxIDw8IE5GX0lQX0xPQ0FMX0lOKSkpIHsKKwkJcHJpbnRrKCJ4dF9yZWFsbTogb25seSB2YWxpZCBmb3IgUE9TVF9ST1VUSU5HLCBMT0NBTF9PVVQsICIKKwkJICAgICAgICJMT0NBTF9JTiBvciBGT1JXQVJELlxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfcmVhbG1faW5mbykpKSB7CisJCXByaW50aygieHRfcmVhbG06IGludmFsaWQgbWF0Y2hzaXplLlxuIik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCByZWFsbV9tYXRjaCA9IHsKKwkubmFtZQkJPSAicmVhbG0iLAorCS5tYXRjaAkJPSBtYXRjaCwgCisJLmNoZWNrZW50cnkJPSBjaGVjaywKKwkubWUJCT0gVEhJU19NT0RVTEUKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnJlYWxtX21hdGNoKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZyZWFsbV9tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3NjdHAuYyBiL25ldC9uZXRmaWx0ZXIveHRfc2N0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZmJmYzUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3NjdHAuYwpAQCAtMCwwICsxLDI1MCBAQAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvc2N0cC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3NjdHAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIktpcmFuIEt1bWFyIEltbWlkaSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXRjaCBmb3IgU0NUUCBwcm90b2NvbCBwYWNrZXRzIik7CitNT0RVTEVfQUxJQVMoImlwdF9zY3RwIik7CisKKyNpZmRlZiBERUJVR19TQ1RQCisjZGVmaW5lIGR1cHJpbnRmKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBkdXByaW50Zihmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2RlZmluZSBTQ0NIRUNLKGNvbmQsIG9wdGlvbiwgZmxhZywgaW52ZmxhZykgKCEoKGZsYWcpICYgKG9wdGlvbikpIFwKKwkJCQkJICAgICAgfHwgKCEhKChpbnZmbGFnKSAmIChvcHRpb24pKSBeIChjb25kKSkpCisKK3N0YXRpYyBpbnQKK21hdGNoX2ZsYWdzKGNvbnN0IHN0cnVjdCB4dF9zY3RwX2ZsYWdfaW5mbyAqZmxhZ19pbmZvLAorCSAgICBjb25zdCBpbnQgZmxhZ19jb3VudCwKKwkgICAgdV9pbnQ4X3QgY2h1bmt0eXBlLAorCSAgICB1X2ludDhfdCBjaHVua2ZsYWdzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGZsYWdfY291bnQ7IGkrKykgeworCQlpZiAoZmxhZ19pbmZvW2ldLmNodW5rdHlwZSA9PSBjaHVua3R5cGUpIHsKKwkJCXJldHVybiAoY2h1bmtmbGFncyAmIGZsYWdfaW5mb1tpXS5mbGFnX21hc2spID09IGZsYWdfaW5mb1tpXS5mbGFnOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CittYXRjaF9wYWNrZXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsCisJICAgICBjb25zdCB1X2ludDMyX3QgKmNodW5rbWFwLAorCSAgICAgaW50IGNodW5rX21hdGNoX3R5cGUsCisJICAgICBjb25zdCBzdHJ1Y3QgeHRfc2N0cF9mbGFnX2luZm8gKmZsYWdfaW5mbywKKwkgICAgIGNvbnN0IGludCBmbGFnX2NvdW50LAorCSAgICAgaW50ICpob3Rkcm9wKQoreworCXVfaW50MzJfdCBjaHVua21hcGNvcHlbMjU2IC8gc2l6ZW9mICh1X2ludDMyX3QpXTsKKwlzY3RwX2NodW5raGRyX3QgX3NjaCwgKnNjaDsKKworI2lmZGVmIERFQlVHX1NDVFAKKwlpbnQgaSA9IDA7CisjZW5kaWYKKworCWlmIChjaHVua19tYXRjaF90eXBlID09IFNDVFBfQ0hVTktfTUFUQ0hfQUxMKSB7CisJCVNDVFBfQ0hVTktNQVBfQ09QWShjaHVua21hcGNvcHksIGNodW5rbWFwKTsKKwl9CisKKwlkbyB7CisJCXNjaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgc2l6ZW9mKF9zY2gpLCAmX3NjaCk7CisJCWlmIChzY2ggPT0gTlVMTCkgeworCQkJZHVwcmludGYoIkRyb3BwaW5nIGludmFsaWQgU0NUUCBwYWNrZXQuXG4iKTsKKwkJCSpob3Rkcm9wID0gMTsKKwkJCXJldHVybiAwOworICAgICAgICAJfQorCisJCWR1cHJpbnRmKCJDaHVuayBudW06ICVkXHRvZmZzZXQ6ICVkXHR0eXBlOiAlZFx0bGVuZ3RoOiAlZFx0ZmxhZ3M6ICV4XG4iLCAKKwkJCQkrK2ksIG9mZnNldCwgc2NoLT50eXBlLCBodG9ucyhzY2gtPmxlbmd0aCksIHNjaC0+ZmxhZ3MpOworCisJCW9mZnNldCArPSAoaHRvbnMoc2NoLT5sZW5ndGgpICsgMykgJiB+MzsKKworCQlkdXByaW50Zigic2tiLT5sZW46ICVkXHRvZmZzZXQ6ICVkXG4iLCBza2ItPmxlbiwgb2Zmc2V0KTsKKworCQlpZiAoU0NUUF9DSFVOS01BUF9JU19TRVQoY2h1bmttYXAsIHNjaC0+dHlwZSkpIHsKKwkJCXN3aXRjaCAoY2h1bmtfbWF0Y2hfdHlwZSkgeworCQkJY2FzZSBTQ1RQX0NIVU5LX01BVENIX0FOWToKKwkJCQlpZiAobWF0Y2hfZmxhZ3MoZmxhZ19pbmZvLCBmbGFnX2NvdW50LCAKKwkJCQkJc2NoLT50eXBlLCBzY2gtPmZsYWdzKSkgeworCQkJCQlyZXR1cm4gMTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU0NUUF9DSFVOS19NQVRDSF9BTEw6CisJCQkJaWYgKG1hdGNoX2ZsYWdzKGZsYWdfaW5mbywgZmxhZ19jb3VudCwgCisJCQkJCXNjaC0+dHlwZSwgc2NoLT5mbGFncykpIHsKKwkJCQkJU0NUUF9DSFVOS01BUF9DTEVBUihjaHVua21hcGNvcHksIHNjaC0+dHlwZSk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFNDVFBfQ0hVTktfTUFUQ0hfT05MWToKKwkJCQlpZiAoIW1hdGNoX2ZsYWdzKGZsYWdfaW5mbywgZmxhZ19jb3VudCwgCisJCQkJCXNjaC0+dHlwZSwgc2NoLT5mbGFncykpIHsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJc3dpdGNoIChjaHVua19tYXRjaF90eXBlKSB7CisJCQljYXNlIFNDVFBfQ0hVTktfTUFUQ0hfT05MWToKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKG9mZnNldCA8IHNrYi0+bGVuKTsKKworCXN3aXRjaCAoY2h1bmtfbWF0Y2hfdHlwZSkgeworCWNhc2UgU0NUUF9DSFVOS19NQVRDSF9BTEw6CisJCXJldHVybiBTQ1RQX0NIVU5LTUFQX0lTX0NMRUFSKGNodW5rbWFwKTsKKwljYXNlIFNDVFBfQ0hVTktfTUFUQ0hfQU5ZOgorCQlyZXR1cm4gMDsKKwljYXNlIFNDVFBfQ0hVTktfTUFUQ0hfT05MWToKKwkJcmV0dXJuIDE7CisJfQorCisJLyogVGhpcyB3aWxsIG5ldmVyIGJlIHJlYWNoZWQsIGJ1dCByZXF1aXJlZCB0byBzdG9wIGNvbXBpbGVyIHdoaW5lICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgaW50ICpob3Rkcm9wKQoreworCWNvbnN0IHN0cnVjdCB4dF9zY3RwX2luZm8gKmluZm87CisJc2N0cF9zY3RwaGRyX3QgX3NoLCAqc2g7CisKKwlpbmZvID0gKGNvbnN0IHN0cnVjdCB4dF9zY3RwX2luZm8gKiltYXRjaGluZm87CisKKwlpZiAob2Zmc2V0KSB7CisJCWR1cHJpbnRmKCJEcm9wcGluZyBub24tZmlyc3QgZnJhZ21lbnQuLiBGSVhNRVxuIik7CisJCXJldHVybiAwOworCX0KKwkKKwlzaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsIHNpemVvZihfc2gpLCAmX3NoKTsKKwlpZiAoc2ggPT0gTlVMTCkgeworCQlkdXByaW50ZigiRHJvcHBpbmcgZXZpbCBUQ1Agb2Zmc2V0PTAgdGlueWdyYW0uXG4iKTsKKwkJKmhvdGRyb3AgPSAxOworCQlyZXR1cm4gMDsKKyAgICAgICAJfQorCWR1cHJpbnRmKCJzcHQ6ICVkXHRkcHQ6ICVkXG4iLCBudG9ocyhzaC0+c291cmNlKSwgbnRvaHMoc2gtPmRlc3QpKTsKKworCXJldHVybiAgU0NDSEVDSygoKG50b2hzKHNoLT5zb3VyY2UpID49IGluZm8tPnNwdHNbMF0pIAorCQkJJiYgKG50b2hzKHNoLT5zb3VyY2UpIDw9IGluZm8tPnNwdHNbMV0pKSwgCisJCSAgIAlYVF9TQ1RQX1NSQ19QT1JUUywgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKQorCQkmJiBTQ0NIRUNLKCgobnRvaHMoc2gtPmRlc3QpID49IGluZm8tPmRwdHNbMF0pIAorCQkJJiYgKG50b2hzKHNoLT5kZXN0KSA8PSBpbmZvLT5kcHRzWzFdKSksIAorCQkJWFRfU0NUUF9ERVNUX1BPUlRTLCBpbmZvLT5mbGFncywgaW5mby0+aW52ZmxhZ3MpCisJCSYmIFNDQ0hFQ0sobWF0Y2hfcGFja2V0KHNrYiwgcHJvdG9mZiwKKwkJCQkJaW5mby0+Y2h1bmttYXAsIGluZm8tPmNodW5rX21hdGNoX3R5cGUsCisgCQkJCQlpbmZvLT5mbGFnX2luZm8sIGluZm8tPmZsYWdfY291bnQsIAorCQkJCQlob3Rkcm9wKSwKKwkJCSAgIFhUX1NDVFBfQ0hVTktfVFlQRVMsIGluZm8tPmZsYWdzLCBpbmZvLT5pbnZmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgIGNvbnN0IHZvaWQgKmluZiwKKwkgICB2b2lkICptYXRjaGluZm8sCisJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCB4dF9zY3RwX2luZm8gKmluZm87CisJY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAgPSBpbmY7CisKKwlpbmZvID0gKGNvbnN0IHN0cnVjdCB4dF9zY3RwX2luZm8gKiltYXRjaGluZm87CisKKwlyZXR1cm4gaXAtPnByb3RvID09IElQUFJPVE9fU0NUUAorCQkmJiAhKGlwLT5pbnZmbGFncyAmIFhUX0lOVl9QUk9UTykKKwkJJiYgbWF0Y2hzaXplID09IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfc2N0cF9pbmZvKSkKKwkJJiYgIShpbmZvLT5mbGFncyAmIH5YVF9TQ1RQX1ZBTElEX0ZMQUdTKQorCQkmJiAhKGluZm8tPmludmZsYWdzICYgflhUX1NDVFBfVkFMSURfRkxBR1MpCisJCSYmICEoaW5mby0+aW52ZmxhZ3MgJiB+aW5mby0+ZmxhZ3MpCisJCSYmICgoIShpbmZvLT5mbGFncyAmIFhUX1NDVFBfQ0hVTktfVFlQRVMpKSB8fCAKKwkJCShpbmZvLT5jaHVua19tYXRjaF90eXBlICYKKwkJCQkoU0NUUF9DSFVOS19NQVRDSF9BTEwgCisJCQkJfCBTQ1RQX0NIVU5LX01BVENIX0FOWQorCQkJCXwgU0NUUF9DSFVOS19NQVRDSF9PTkxZKSkpOworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5Nihjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgY29uc3Qgdm9pZCAqaW5mLAorCSAgIHZvaWQgKm1hdGNoaW5mbywKKwkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IHh0X3NjdHBfaW5mbyAqaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwID0gaW5mOworCisJaW5mbyA9IChjb25zdCBzdHJ1Y3QgeHRfc2N0cF9pbmZvICopbWF0Y2hpbmZvOworCisJcmV0dXJuIGlwLT5wcm90byA9PSBJUFBST1RPX1NDVFAKKwkJJiYgIShpcC0+aW52ZmxhZ3MgJiBYVF9JTlZfUFJPVE8pCisJCSYmIG1hdGNoc2l6ZSA9PSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X3NjdHBfaW5mbykpCisJCSYmICEoaW5mby0+ZmxhZ3MgJiB+WFRfU0NUUF9WQUxJRF9GTEFHUykKKwkJJiYgIShpbmZvLT5pbnZmbGFncyAmIH5YVF9TQ1RQX1ZBTElEX0ZMQUdTKQorCQkmJiAhKGluZm8tPmludmZsYWdzICYgfmluZm8tPmZsYWdzKQorCQkmJiAoKCEoaW5mby0+ZmxhZ3MgJiBYVF9TQ1RQX0NIVU5LX1RZUEVTKSkgfHwgCisJCQkoaW5mby0+Y2h1bmtfbWF0Y2hfdHlwZSAmCisJCQkJKFNDVFBfQ0hVTktfTUFUQ0hfQUxMIAorCQkJCXwgU0NUUF9DSFVOS19NQVRDSF9BTlkKKwkJCQl8IFNDVFBfQ0hVTktfTUFUQ0hfT05MWSkpKTsKK30KKworCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHNjdHBfbWF0Y2ggPSAKK3sgCisJLm5hbWUgPSAic2N0cCIsCisJLm1hdGNoID0gJm1hdGNoLAorCS5jaGVja2VudHJ5ID0gJmNoZWNrZW50cnksCisJLm1lID0gVEhJU19NT0RVTEUKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHNjdHA2X21hdGNoID0gCit7IAorCS5uYW1lID0gInNjdHAiLAorCS5tYXRjaCA9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeSA9ICZjaGVja2VudHJ5NiwKKwkubWUgPSBUSElTX01PRFVMRQorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmc2N0cF9tYXRjaCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmc2N0cDZfbWF0Y2gpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnNjdHBfbWF0Y2gpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmc2N0cDZfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnNjdHBfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9zdGF0ZS5jIGIvbmV0L25ldGZpbHRlci94dF9zdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5Y2U4MDgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3N0YXRlLmMKQEAgLTAsMCArMSw5NiBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBjb25uZWN0aW9uIHRyYWNraW5nIGluZm9ybWF0aW9uLiAqLworCisvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCisgKiAoQykgMjAwMi0yMDA1IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3N0YXRlLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlJ1c3R5IFJ1c3NlbGwgPHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXBbNl1fdGFibGVzIGNvbm5lY3Rpb24gdHJhY2tpbmcgc3RhdGUgbWF0Y2ggbW9kdWxlIik7CitNT0RVTEVfQUxJQVMoImlwdF9zdGF0ZSIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X3N0YXRlIik7CisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgaW50ICpob3Rkcm9wKQoreworCWNvbnN0IHN0cnVjdCB4dF9zdGF0ZV9pbmZvICpzaW5mbyA9IG1hdGNoaW5mbzsKKwllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKKwl1bnNpZ25lZCBpbnQgc3RhdGViaXQ7CisKKwlpZiAobmZfY3RfaXNfdW50cmFja2VkKHNrYikpCisJCXN0YXRlYml0ID0gWFRfU1RBVEVfVU5UUkFDS0VEOworCWVsc2UgaWYgKCFuZl9jdF9nZXRfY3RpbmZvKHNrYiwgJmN0aW5mbykpCisJCXN0YXRlYml0ID0gWFRfU1RBVEVfSU5WQUxJRDsKKwllbHNlCisJCXN0YXRlYml0ID0gWFRfU1RBVEVfQklUKGN0aW5mbyk7CisKKwlyZXR1cm4gKHNpbmZvLT5zdGF0ZW1hc2sgJiBzdGF0ZWJpdCk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAorCQkgY29uc3Qgdm9pZCAqaXAsCisJCSB2b2lkICptYXRjaGluZm8sCisJCSB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorCQkgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfc3RhdGVfaW5mbykpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHN0YXRlX21hdGNoID0geworCS5uYW1lCQk9ICJzdGF0ZSIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVjaywKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHN0YXRlNl9tYXRjaCA9IHsKKwkubmFtZQkJPSAic3RhdGUiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2ssCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwluZWVkX2Nvbm50cmFjaygpOworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnN0YXRlX21hdGNoKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmc3RhdGU2X21hdGNoKTsKKwlpZiAocmV0IDwgMCkKKwkJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCZzdGF0ZV9tYXRjaCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnN0YXRlX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmc3RhdGU2X21hdGNoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfc3RyaW5nLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3N0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjN2Q1YzgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3N0cmluZy5jCkBAIC0wLDAgKzEsMTExIEBACisvKiBTdHJpbmcgbWF0Y2hpbmcgbWF0Y2ggZm9yIGlwdGFibGVzCisgKiAKKyAqIChDKSAyMDA1IFBhYmxvIE5laXJhIEF5dXNvIDxwYWJsb0BldXJvZGV2Lm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RleHRzZWFyY2guaD4KKworTU9EVUxFX0FVVEhPUigiUGFibG8gTmVpcmEgQXl1c28gPHBhYmxvQGV1cm9kZXYubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJUCB0YWJsZXMgc3RyaW5nIG1hdGNoIG1vZHVsZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcHRfc3RyaW5nIik7CitNT0RVTEVfQUxJQVMoImlwNnRfc3RyaW5nIik7CisKK3N0YXRpYyBpbnQgbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCSBjb25zdCB2b2lkICptYXRjaGluZm8sCisJCSBpbnQgb2Zmc2V0LAorCQkgdW5zaWduZWQgaW50IHByb3RvZmYsCisJCSBpbnQgKmhvdGRyb3ApCit7CisJc3RydWN0IHRzX3N0YXRlIHN0YXRlOworCXN0cnVjdCB4dF9zdHJpbmdfaW5mbyAqY29uZiA9IChzdHJ1Y3QgeHRfc3RyaW5nX2luZm8gKikgbWF0Y2hpbmZvOworCisJbWVtc2V0KCZzdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCB0c19zdGF0ZSkpOworCisJcmV0dXJuIChza2JfZmluZF90ZXh0KChzdHJ1Y3Qgc2tfYnVmZiAqKXNrYiwgY29uZi0+ZnJvbV9vZmZzZXQsIAorCQkJICAgICBjb25mLT50b19vZmZzZXQsIGNvbmYtPmNvbmZpZywgJnN0YXRlKSAKKwkJCSAgICAgIT0gVUlOVF9NQVgpICYmICFjb25mLT5pbnZlcnQ7Cit9CisKKyNkZWZpbmUgU1RSSU5HX1RFWFRfUFJJVihtKSAoKHN0cnVjdCB4dF9zdHJpbmdfaW5mbyAqKSBtKQorCitzdGF0aWMgaW50IGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCQkgICAgICBjb25zdCB2b2lkICppcCwKKwkJICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorCQkgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorCQkgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCXN0cnVjdCB4dF9zdHJpbmdfaW5mbyAqY29uZiA9IG1hdGNoaW5mbzsKKwlzdHJ1Y3QgdHNfY29uZmlnICp0c19jb25mOworCisJaWYgKG1hdGNoc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X3N0cmluZ19pbmZvKSkpCisJCXJldHVybiAwOworCisJLyogRGFtbiwgY2FuJ3QgaGFuZGxlIHRoaXMgY2FzZSBwcm9wZXJseSB3aXRoIGlwdGFibGVzLi4uICovCisJaWYgKGNvbmYtPmZyb21fb2Zmc2V0ID4gY29uZi0+dG9fb2Zmc2V0KQorCQlyZXR1cm4gMDsKKworCXRzX2NvbmYgPSB0ZXh0c2VhcmNoX3ByZXBhcmUoY29uZi0+YWxnbywgY29uZi0+cGF0dGVybiwgY29uZi0+cGF0bGVuLAorCQkJCSAgICAgR0ZQX0tFUk5FTCwgVFNfQVVUT0xPQUQpOworCWlmIChJU19FUlIodHNfY29uZikpCisJCXJldHVybiAwOworCisJY29uZi0+Y29uZmlnID0gdHNfY29uZjsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95KHZvaWQgKm1hdGNoaW5mbywgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSkKK3sKKwl0ZXh0c2VhcmNoX2Rlc3Ryb3koU1RSSU5HX1RFWFRfUFJJVihtYXRjaGluZm8pLT5jb25maWcpOworfQorCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHN0cmluZ19tYXRjaCA9IHsKKwkubmFtZSAJCT0gInN0cmluZyIsCisJLm1hdGNoIAkJPSBtYXRjaCwKKwkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCisJLmRlc3Ryb3kgCT0gZGVzdHJveSwKKwkubWUgCQk9IFRISVNfTU9EVUxFCit9Oworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBzdHJpbmc2X21hdGNoID0geworCS5uYW1lIAkJPSAic3RyaW5nIiwKKwkubWF0Y2ggCQk9IG1hdGNoLAorCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKKwkuZGVzdHJveSAJPSBkZXN0cm95LAorCS5tZSAJCT0gVEhJU19NT0RVTEUKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnN0cmluZ19tYXRjaCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJnN0cmluZzZfbWF0Y2gpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnN0cmluZ19tYXRjaCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnN0cmluZ19tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJnN0cmluZzZfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF90Y3Btc3MuYyBiL25ldC9uZXRmaWx0ZXIveHRfdGNwbXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNmN2Y1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3RjcG1zcy5jCkBAIC0wLDAgKzEsMTcyIEBACisvKiBLZXJuZWwgbW9kdWxlIHRvIG1hdGNoIFRDUCBNU1MgdmFsdWVzLiAqLworCisvKiBDb3B5cmlnaHQgKEMpIDIwMDAgTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+CisgKiBQb3J0aW9ucyAoQykgMjAwNSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfdGNwbXNzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CisKKyNkZWZpbmUgVEhfU1lOIDB4MDIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIFRDUCBNU1MgbWF0Y2ggbW9kdWxlIik7CitNT0RVTEVfQUxJQVMoImlwdF90Y3Btc3MiKTsKKworLyogUmV0dXJucyAxIGlmIHRoZSBtc3Mgb3B0aW9uIGlzIHNldCBhbmQgbWF0Y2hlZCBieSB0aGUgcmFuZ2UsIDAgb3RoZXJ3aXNlICovCitzdGF0aWMgaW5saW5lIGludAorbXNzb3B0aW9uX21hdGNoKHVfaW50MTZfdCBtaW4sIHVfaW50MTZfdCBtYXgsCisJCWNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCXVuc2lnbmVkIGludCBwcm90b2ZmLAorCQlpbnQgaW52ZXJ0LAorCQlpbnQgKmhvdGRyb3ApCit7CisJc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOworCS8qIHRjcC5kb2ZmIGlzIG9ubHkgNCBiaXRzLCBpZS4gbWF4IDE1ICogNCBieXRlcyAqLworCXU4IF9vcHRbMTUgKiA0IC0gc2l6ZW9mKF90Y3BoKV0sICpvcDsKKwl1bnNpZ25lZCBpbnQgaSwgb3B0bGVuOworCisJLyogSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgd2hvbGUgaGVhZGVyLCBkcm9wIHBhY2tldC4gKi8KKwl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsIHNpemVvZihfdGNwaCksICZfdGNwaCk7CisJaWYgKHRoID09IE5VTEwpCisJCWdvdG8gZHJvcGl0OworCisJLyogTWFsZm9ybWVkLiAqLworCWlmICh0aC0+ZG9mZio0IDwgc2l6ZW9mKCp0aCkpCisJCWdvdG8gZHJvcGl0OworCisJb3B0bGVuID0gdGgtPmRvZmYqNCAtIHNpemVvZigqdGgpOworCWlmICghb3B0bGVuKQorCQlnb3RvIG91dDsKKworCS8qIFRydW5jYXRlZCBvcHRpb25zLiAqLworCW9wID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiArIHNpemVvZigqdGgpLCBvcHRsZW4sIF9vcHQpOworCWlmIChvcCA9PSBOVUxMKQorCQlnb3RvIGRyb3BpdDsKKworCWZvciAoaSA9IDA7IGkgPCBvcHRsZW47ICkgeworCQlpZiAob3BbaV0gPT0gVENQT1BUX01TUworCQkgICAgJiYgKG9wdGxlbiAtIGkpID49IFRDUE9MRU5fTVNTCisJCSAgICAmJiBvcFtpKzFdID09IFRDUE9MRU5fTVNTKSB7CisJCQl1X2ludDE2X3QgbXNzdmFsOworCisJCQltc3N2YWwgPSAob3BbaSsyXSA8PCA4KSB8IG9wW2krM107CisJCQkKKwkJCXJldHVybiAobXNzdmFsID49IG1pbiAmJiBtc3N2YWwgPD0gbWF4KSBeIGludmVydDsKKwkJfQorCQlpZiAob3BbaV0gPCAyKSBpKys7CisJCWVsc2UgaSArPSBvcFtpKzFdPzoxOworCX0KK291dDoKKwlyZXR1cm4gaW52ZXJ0OworCisgZHJvcGl0OgorCSpob3Rkcm9wID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IHh0X3RjcG1zc19tYXRjaF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCisJcmV0dXJuIG1zc29wdGlvbl9tYXRjaChpbmZvLT5tc3NfbWluLCBpbmZvLT5tc3NfbWF4LCBza2IsIHByb3RvZmYsCisJCQkgICAgICAgaW5mby0+aW52ZXJ0LCBob3Rkcm9wKTsKK30KKworc3RhdGljIGludAorY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisgICAgICAgICAgIGNvbnN0IHZvaWQgKmlwaW5mbywKKyAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwID0gaXBpbmZvOworCWlmIChtYXRjaHNpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF90Y3Btc3NfbWF0Y2hfaW5mbykpKQorCQlyZXR1cm4gMDsKKworCS8qIE11c3Qgc3BlY2lmeSAtcCB0Y3AgKi8KKwlpZiAoaXAtPnByb3RvICE9IElQUFJPVE9fVENQIHx8IChpcC0+aW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKSkgeworCQlwcmludGsoInRjcG1zczogT25seSB3b3JrcyBvbiBUQ1AgcGFja2V0c1xuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5Nihjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgY29uc3Qgdm9pZCAqaXBpbmZvLAorICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCisgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCA9IGlwaW5mbzsKKworCWlmIChtYXRjaHNpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF90Y3Btc3NfbWF0Y2hfaW5mbykpKQorCQlyZXR1cm4gMDsKKworCS8qIE11c3Qgc3BlY2lmeSAtcCB0Y3AgKi8KKwlpZiAoaXAtPnByb3RvICE9IElQUFJPVE9fVENQIHx8IChpcC0+aW52ZmxhZ3MgJiBYVF9JTlZfUFJPVE8pKSB7CisJCXByaW50aygidGNwbXNzOiBPbmx5IHdvcmtzIG9uIFRDUCBwYWNrZXRzXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggdGNwbXNzX21hdGNoID0geworCS5uYW1lCQk9ICJ0Y3Btc3MiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHRjcG1zczZfbWF0Y2ggPSB7CisJLm5hbWUJCT0gInRjcG1zcyIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5NiwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZ0Y3Btc3NfbWF0Y2gpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJnRjcG1zczZfbWF0Y2gpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnRjcG1zc19tYXRjaCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZ0Y3Btc3M2X21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZ0Y3Btc3NfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF90Y3B1ZHAuYyBiL25ldC9uZXRmaWx0ZXIveHRfdGNwdWRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5YzgxMQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfdGNwdWRwLmMKQEAgLTAsMCArMSwzMzQgQEAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3RjcHVkcC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJ4X3RhYmxlcyBtYXRjaCBmb3IgVENQIGFuZCBVRFAsIHN1cHBvcnRzIElQdjQgYW5kIElQdjYiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygieHRfdGNwIik7CitNT0RVTEVfQUxJQVMoInh0X3VkcCIpOworTU9EVUxFX0FMSUFTKCJpcHRfdWRwIik7CitNT0RVTEVfQUxJQVMoImlwdF90Y3AiKTsKK01PRFVMRV9BTElBUygiaXA2dF91ZHAiKTsKK01PRFVMRV9BTElBUygiaXA2dF90Y3AiKTsKKworI2lmZGVmIERFQlVHX0lQX0ZJUkVXQUxMX1VTRVIKKyNkZWZpbmUgZHVwcmludGYoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIGR1cHJpbnRmKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCisKKy8qIFJldHVybnMgMSBpZiB0aGUgcG9ydCBpcyBtYXRjaGVkIGJ5IHRoZSByYW5nZSwgMCBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citwb3J0X21hdGNoKHVfaW50MTZfdCBtaW4sIHVfaW50MTZfdCBtYXgsIHVfaW50MTZfdCBwb3J0LCBpbnQgaW52ZXJ0KQoreworCWludCByZXQ7CisKKwlyZXQgPSAocG9ydCA+PSBtaW4gJiYgcG9ydCA8PSBtYXgpIF4gaW52ZXJ0OworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3RjcF9maW5kX29wdGlvbih1X2ludDhfdCBvcHRpb24sCisJCWNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCXVuc2lnbmVkIGludCBwcm90b2ZmLAorCQl1bnNpZ25lZCBpbnQgb3B0bGVuLAorCQlpbnQgaW52ZXJ0LAorCQlpbnQgKmhvdGRyb3ApCit7CisJLyogdGNwLmRvZmYgaXMgb25seSA0IGJpdHMsIGllLiBtYXggMTUgKiA0IGJ5dGVzICovCisJdV9pbnQ4X3QgX29wdFs2MCAtIHNpemVvZihzdHJ1Y3QgdGNwaGRyKV0sICpvcDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWR1cHJpbnRmKCJ0Y3BfbWF0Y2g6IGZpbmRpbmcgb3B0aW9uXG4iKTsKKworCWlmICghb3B0bGVuKQorCQlyZXR1cm4gaW52ZXJ0OworCisJLyogSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgd2hvbGUgaGVhZGVyLCBkcm9wIHBhY2tldC4gKi8KKwlvcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYgKyBzaXplb2Yoc3RydWN0IHRjcGhkciksCisJCQkJb3B0bGVuLCBfb3B0KTsKKwlpZiAob3AgPT0gTlVMTCkgeworCQkqaG90ZHJvcCA9IDE7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBvcHRsZW47ICkgeworCQlpZiAob3BbaV0gPT0gb3B0aW9uKSByZXR1cm4gIWludmVydDsKKwkJaWYgKG9wW2ldIDwgMikgaSsrOworCQllbHNlIGkgKz0gb3BbaSsxXT86MTsKKwl9CisKKwlyZXR1cm4gaW52ZXJ0OworfQorCitzdGF0aWMgaW50Cit0Y3BfbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJICBjb25zdCB2b2lkICptYXRjaGluZm8sCisJICBpbnQgb2Zmc2V0LAorCSAgdW5zaWduZWQgaW50IHByb3RvZmYsCisJICBpbnQgKmhvdGRyb3ApCit7CisJc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOworCWNvbnN0IHN0cnVjdCB4dF90Y3AgKnRjcGluZm8gPSBtYXRjaGluZm87CisKKwlpZiAob2Zmc2V0KSB7CisJCS8qIFRvIHF1b3RlIEFsYW46CisKKwkJICAgRG9uJ3QgYWxsb3cgYSBmcmFnbWVudCBvZiBUQ1AgOCBieXRlcyBpbi4gTm9ib2R5IG5vcm1hbAorCQkgICBjYXVzZXMgdGhpcy4gSXRzIGEgY3JhY2tlciB0cnlpbmcgdG8gYnJlYWsgaW4gYnkgZG9pbmcgYQorCQkgICBmbGFnIG92ZXJ3cml0ZSB0byBwYXNzIHRoZSBkaXJlY3Rpb24gY2hlY2tzLgorCQkqLworCQlpZiAob2Zmc2V0ID09IDEpIHsKKwkJCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIFRDUCBvZmZzZXQ9MSBmcmFnLlxuIik7CisJCQkqaG90ZHJvcCA9IDE7CisJCX0KKwkJLyogTXVzdCBub3QgYmUgYSBmcmFnbWVudC4gKi8KKwkJcmV0dXJuIDA7CisJfQorCisjZGVmaW5lIEZXSU5WVENQKGJvb2wsaW52ZmxnKSAoKGJvb2wpIF4gISEodGNwaW5mby0+aW52ZmxhZ3MgJiBpbnZmbGcpKQorCisJdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b2ZmLCBzaXplb2YoX3RjcGgpLCAmX3RjcGgpOworCWlmICh0aCA9PSBOVUxMKSB7CisJCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCisJCSAgIGNhbid0LiAgSGVuY2UsIG5vIGNob2ljZSBidXQgdG8gZHJvcC4gKi8KKwkJZHVwcmludGYoIkRyb3BwaW5nIGV2aWwgVENQIG9mZnNldD0wIHRpbnlncmFtLlxuIik7CisJCSpob3Rkcm9wID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFwb3J0X21hdGNoKHRjcGluZm8tPnNwdHNbMF0sIHRjcGluZm8tPnNwdHNbMV0sCisJCQludG9ocyh0aC0+c291cmNlKSwKKwkJCSEhKHRjcGluZm8tPmludmZsYWdzICYgWFRfVENQX0lOVl9TUkNQVCkpKQorCQlyZXR1cm4gMDsKKwlpZiAoIXBvcnRfbWF0Y2godGNwaW5mby0+ZHB0c1swXSwgdGNwaW5mby0+ZHB0c1sxXSwKKwkJCW50b2hzKHRoLT5kZXN0KSwKKwkJCSEhKHRjcGluZm8tPmludmZsYWdzICYgWFRfVENQX0lOVl9EU1RQVCkpKQorCQlyZXR1cm4gMDsKKwlpZiAoIUZXSU5WVENQKCgoKHVuc2lnbmVkIGNoYXIgKil0aClbMTNdICYgdGNwaW5mby0+ZmxnX21hc2spCisJCSAgICAgID09IHRjcGluZm8tPmZsZ19jbXAsCisJCSAgICAgIFhUX1RDUF9JTlZfRkxBR1MpKQorCQlyZXR1cm4gMDsKKwlpZiAodGNwaW5mby0+b3B0aW9uKSB7CisJCWlmICh0aC0+ZG9mZiAqIDQgPCBzaXplb2YoX3RjcGgpKSB7CisJCQkqaG90ZHJvcCA9IDE7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIXRjcF9maW5kX29wdGlvbih0Y3BpbmZvLT5vcHRpb24sIHNrYiwgcHJvdG9mZiwKKwkJCQkgICAgIHRoLT5kb2ZmKjQgLSBzaXplb2YoX3RjcGgpLAorCQkJCSAgICAgdGNwaW5mby0+aW52ZmxhZ3MgJiBYVF9UQ1BfSU5WX09QVElPTiwKKwkJCQkgICAgIGhvdGRyb3ApKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCitzdGF0aWMgaW50Cit0Y3BfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgICAgIGNvbnN0IHZvaWQgKmluZm8sCisJICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKwkgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X2lwICppcCA9IGluZm87CisJY29uc3Qgc3RydWN0IHh0X3RjcCAqdGNwaW5mbyA9IG1hdGNoaW5mbzsKKworCS8qIE11c3Qgc3BlY2lmeSBwcm90byA9PSBUQ1AsIGFuZCBubyB1bmtub3duIGludmZsYWdzICovCisJcmV0dXJuIGlwLT5wcm90byA9PSBJUFBST1RPX1RDUAorCQkmJiAhKGlwLT5pbnZmbGFncyAmIFhUX0lOVl9QUk9UTykKKwkJJiYgbWF0Y2hzaXplID09IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfdGNwKSkKKwkJJiYgISh0Y3BpbmZvLT5pbnZmbGFncyAmIH5YVF9UQ1BfSU5WX01BU0spOworfQorCisvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCitzdGF0aWMgaW50Cit0Y3A2X2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgICAgICBjb25zdCB2b2lkICplbnRyeSwKKwkgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXB2NiA9IGVudHJ5OworCWNvbnN0IHN0cnVjdCB4dF90Y3AgKnRjcGluZm8gPSBtYXRjaGluZm87CisKKwkvKiBNdXN0IHNwZWNpZnkgcHJvdG8gPT0gVENQLCBhbmQgbm8gdW5rbm93biBpbnZmbGFncyAqLworCXJldHVybiBpcHY2LT5wcm90byA9PSBJUFBST1RPX1RDUAorCQkmJiAhKGlwdjYtPmludmZsYWdzICYgWFRfSU5WX1BST1RPKQorCQkmJiBtYXRjaHNpemUgPT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF90Y3ApKQorCQkmJiAhKHRjcGluZm8tPmludmZsYWdzICYgflhUX1RDUF9JTlZfTUFTSyk7Cit9CisKKworc3RhdGljIGludAordWRwX21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorCSAgaW50IG9mZnNldCwKKwkgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorCSAgaW50ICpob3Rkcm9wKQoreworCXN0cnVjdCB1ZHBoZHIgX3VkcGgsICp1aDsKKwljb25zdCBzdHJ1Y3QgeHRfdWRwICp1ZHBpbmZvID0gbWF0Y2hpbmZvOworCisJLyogTXVzdCBub3QgYmUgYSBmcmFnbWVudC4gKi8KKwlpZiAob2Zmc2V0KQorCQlyZXR1cm4gMDsKKworCXVoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwgc2l6ZW9mKF91ZHBoKSwgJl91ZHBoKTsKKwlpZiAodWggPT0gTlVMTCkgeworCQkvKiBXZSd2ZSBiZWVuIGFza2VkIHRvIGV4YW1pbmUgdGhpcyBwYWNrZXQsIGFuZCB3ZQorCQkgICBjYW4ndC4gIEhlbmNlLCBubyBjaG9pY2UgYnV0IHRvIGRyb3AuICovCisJCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIFVEUCB0aW55Z3JhbS5cbiIpOworCQkqaG90ZHJvcCA9IDE7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBwb3J0X21hdGNoKHVkcGluZm8tPnNwdHNbMF0sIHVkcGluZm8tPnNwdHNbMV0sCisJCQkgIG50b2hzKHVoLT5zb3VyY2UpLAorCQkJICAhISh1ZHBpbmZvLT5pbnZmbGFncyAmIFhUX1VEUF9JTlZfU1JDUFQpKQorCQkmJiBwb3J0X21hdGNoKHVkcGluZm8tPmRwdHNbMF0sIHVkcGluZm8tPmRwdHNbMV0sCisJCQkgICAgICBudG9ocyh1aC0+ZGVzdCksCisJCQkgICAgICAhISh1ZHBpbmZvLT5pbnZmbGFncyAmIFhUX1VEUF9JTlZfRFNUUFQpKTsKK30KKworLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLworc3RhdGljIGludAordWRwX2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgICAgICBjb25zdCB2b2lkICppbmZvLAorCSAgICAgICB2b2lkICptYXRjaGluZm8sCisJICAgICAgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAorCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwID0gaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfdWRwICp1ZHBpbmZvID0gbWF0Y2hpbmZvOworCisJLyogTXVzdCBzcGVjaWZ5IHByb3RvID09IFVEUCwgYW5kIG5vIHVua25vd24gaW52ZmxhZ3MgKi8KKwlpZiAoaXAtPnByb3RvICE9IElQUFJPVE9fVURQIHx8IChpcC0+aW52ZmxhZ3MgJiBYVF9JTlZfUFJPVE8pKSB7CisJCWR1cHJpbnRmKCJpcHRfdWRwOiBQcm90b2NvbCAldSAhPSAldVxuIiwgaXAtPnByb3RvLAorCQkJIElQUFJPVE9fVURQKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChtYXRjaGluZm9zaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfdWRwKSkpIHsKKwkJZHVwcmludGYoImlwdF91ZHA6IG1hdGNoc2l6ZSAldSAhPSAldVxuIiwKKwkJCSBtYXRjaGluZm9zaXplLCBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X3VkcCkpKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICh1ZHBpbmZvLT5pbnZmbGFncyAmIH5YVF9VRFBfSU5WX01BU0spIHsKKwkJZHVwcmludGYoImlwdF91ZHA6IHVua25vd24gZmxhZ3MgJVhcbiIsCisJCQkgdWRwaW5mby0+aW52ZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLworc3RhdGljIGludAordWRwNl9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkgICAgICAgY29uc3Qgdm9pZCAqZW50cnksCisJICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKwkgICAgICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCisJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcHY2ID0gZW50cnk7CisJY29uc3Qgc3RydWN0IHh0X3VkcCAqdWRwaW5mbyA9IG1hdGNoaW5mbzsKKworCS8qIE11c3Qgc3BlY2lmeSBwcm90byA9PSBVRFAsIGFuZCBubyB1bmtub3duIGludmZsYWdzICovCisJaWYgKGlwdjYtPnByb3RvICE9IElQUFJPVE9fVURQIHx8IChpcHY2LT5pbnZmbGFncyAmIFhUX0lOVl9QUk9UTykpIHsKKwkJZHVwcmludGYoImlwNnRfdWRwOiBQcm90b2NvbCAldSAhPSAldVxuIiwgaXB2Ni0+cHJvdG8sCisJCQkgSVBQUk9UT19VRFApOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKG1hdGNoaW5mb3NpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF91ZHApKSkgeworCQlkdXByaW50ZigiaXA2dF91ZHA6IG1hdGNoc2l6ZSAldSAhPSAldVxuIiwKKwkJCSBtYXRjaGluZm9zaXplLCBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X3VkcCkpKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICh1ZHBpbmZvLT5pbnZmbGFncyAmIH5YVF9VRFBfSU5WX01BU0spIHsKKwkJZHVwcmludGYoImlwNnRfdWRwOiB1bmtub3duIGZsYWdzICVYXG4iLAorCQkJIHVkcGluZm8tPmludmZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggdGNwX21hdGNoc3RydWN0ID0geworCS5uYW1lCQk9ICJ0Y3AiLAorCS5tYXRjaAkJPSAmdGNwX21hdGNoLAorCS5jaGVja2VudHJ5CT0gJnRjcF9jaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHRjcDZfbWF0Y2hzdHJ1Y3QgPSB7CisJLm5hbWUJCT0gInRjcCIsCisJLm1hdGNoCQk9ICZ0Y3BfbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmdGNwNl9jaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggdWRwX21hdGNoc3RydWN0ID0geworCS5uYW1lCQk9ICJ1ZHAiLAorCS5tYXRjaAkJPSAmdWRwX21hdGNoLAorCS5jaGVja2VudHJ5CT0gJnVkcF9jaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHVkcDZfbWF0Y2hzdHJ1Y3QgPSB7CisJLm5hbWUJCT0gInVkcCIsCisJLm1hdGNoCQk9ICZ1ZHBfbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmdWRwNl9jaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZ0Y3BfbWF0Y2hzdHJ1Y3QpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJnRjcDZfbWF0Y2hzdHJ1Y3QpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VucmVnX3RjcDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZ1ZHBfbWF0Y2hzdHJ1Y3QpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VucmVnX3RjcDY7CisJCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZ1ZHA2X21hdGNoc3RydWN0KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF91bnJlZ191ZHA7CisKKwlyZXR1cm4gcmV0OworCitvdXRfdW5yZWdfdWRwOgorCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnRjcF9tYXRjaHN0cnVjdCk7CitvdXRfdW5yZWdfdGNwNjoKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmdGNwNl9tYXRjaHN0cnVjdCk7CitvdXRfdW5yZWdfdGNwOgorCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnRjcF9tYXRjaHN0cnVjdCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmdWRwNl9tYXRjaHN0cnVjdCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmdWRwX21hdGNoc3RydWN0KTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmdGNwNl9tYXRjaHN0cnVjdCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmdGNwX21hdGNoc3RydWN0KTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYwppbmRleCA3ODQ5Y2FjLi4yMTAxYjQ1IDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKKysrIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgpAQCAtNDAyLDcgKzQwMyw3IEBACiAJZ3JvdXBzID0gbmxfdGFibGVbcHJvdG9jb2xdLmdyb3VwczsKIAluZXRsaW5rX3VubG9ja190YWJsZSgpOwogCi0JaWYgKChlcnIgPSBfX25ldGxpbmtfY3JlYXRlKHNvY2ssIHByb3RvY29sKSA8IDApKQorCWlmICgoZXJyID0gX19uZXRsaW5rX2NyZWF0ZShzb2NrLCBwcm90b2NvbCkpIDwgMCkKIAkJZ290byBvdXRfbW9kdWxlOwogCiAJbmxrID0gbmxrX3NrKHNvY2stPnNrKTsKQEAgLTE0MjIsNyArMTQyMyw3IEBACiAJd2hpbGUgKHNrYi0+bGVuID49IG5sbXNnX3RvdGFsX3NpemUoMCkpIHsKIAkJbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKSBza2ItPmRhdGE7CiAKLQkJaWYgKHNrYi0+bGVuIDwgbmxoLT5ubG1zZ19sZW4pCisJCWlmIChubGgtPm5sbXNnX2xlbiA8IE5MTVNHX0hEUkxFTiB8fCBza2ItPmxlbiA8IG5saC0+bmxtc2dfbGVuKQogCQkJcmV0dXJuIDA7CiAKIAkJdG90YWxfbGVuID0gbWluKE5MTVNHX0FMSUdOKG5saC0+bmxtc2dfbGVuKSwgc2tiLT5sZW4pOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvZ2VuZXRsaW5rLmMgYi9uZXQvbmV0bGluay9nZW5ldGxpbmsuYwppbmRleCAzYjEzNzg0Li40YWUxNTM4IDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9nZW5ldGxpbmsuYworKysgYi9uZXQvbmV0bGluay9nZW5ldGxpbmsuYwpAQCAtMjIyLDExICsyMjIsNiBAQAogCQlnb3RvIGVycm91dF9sb2NrZWQ7CiAJfQogCi0JaWYgKCF0cnlfbW9kdWxlX2dldChmYW1pbHktPm93bmVyKSkgewotCQllcnIgPSAtRUJVU1k7Ci0JCWdvdG8gZXJyb3V0X2xvY2tlZDsKLQl9Ci0KIAlpZiAoZmFtaWx5LT5pZCA9PSBHRU5MX0lEX0dFTkVSQVRFKSB7CiAJCXUxNiBuZXdpZCA9IGdlbmxfZ2VuZXJhdGVfaWQoKTsKIApAQCAtMjgzLDcgKzI3OCw2IEBACiAJCUlOSVRfTElTVF9IRUFEKCZmYW1pbHktPm9wc19saXN0KTsKIAkJZ2VubF91bmxvY2soKTsKIAotCQltb2R1bGVfcHV0KGZhbWlseS0+b3duZXIpOwogCQlrZnJlZShmYW1pbHktPmF0dHJidWYpOwogCQlnZW5sX2N0cmxfZXZlbnQoQ1RSTF9DTURfREVMRkFNSUxZLCBmYW1pbHkpOwogCQlyZXR1cm4gMDsKQEAgLTUzNSw3ICs1MjksNiBAQAogCS5uYW1lID0gIm5sY3RybCIsCiAJLnZlcnNpb24gPSAweDEsCiAJLm1heGF0dHIgPSBDVFJMX0FUVFJfTUFYLAotCS5vd25lciA9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgZ2VubF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9uZXQvbmV0cm9tL2FmX25ldHJvbS5jIGIvbmV0L25ldHJvbS9hZl9uZXRyb20uYwppbmRleCA2M2IwZTRhLi5kNDQ5ODFmIDEwMDY0NAotLS0gYS9uZXQvbmV0cm9tL2FmX25ldHJvbS5jCisrKyBiL25ldC9uZXRyb20vYWZfbmV0cm9tLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CmRpZmYgLS1naXQgYS9uZXQvcGFja2V0L2FmX3BhY2tldC5jIGIvbmV0L3BhY2tldC9hZl9wYWNrZXQuYwppbmRleCBmNjllNWVkLi5lZTkzYWJjIDEwMDY0NAotLS0gYS9uZXQvcGFja2V0L2FmX3BhY2tldC5jCisrKyBiL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKQEAgLTUzLDYgKzUzLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgpAQCAtMTIzNyw3ICsxMjM4LDcgQEAKIAkJZ290byBkb25lOwogCiAJZXJyID0gLUVOT0JVRlM7Ci0JaSA9IChzdHJ1Y3QgcGFja2V0X21jbGlzdCAqKWttYWxsb2Moc2l6ZW9mKCppKSwgR0ZQX0tFUk5FTCk7CisJaSA9IGttYWxsb2Moc2l6ZW9mKCppKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGkgPT0gTlVMTCkKIAkJZ290byBkb25lOwogCmRpZmYgLS1naXQgYS9uZXQvcm9zZS9hZl9yb3NlLmMgYi9uZXQvcm9zZS9hZl9yb3NlLmMKaW5kZXggNjMwOTBiZS4uZWE2NTM5NiAxMDA2NDQKLS0tIGEvbmV0L3Jvc2UvYWZfcm9zZS5jCisrKyBiL25ldC9yb3NlL2FmX3Jvc2UuYwpAQCAtOSw3ICs5LDkgQEAKICAqIENvcHlyaWdodCAoQykgVGVycnkgRGF3c29uIFZLMktUSiAodGVycnlAYW5pbWF0cy5uZXQpCiAgKiBDb3B5cmlnaHQgKEMpIFRvbWkgTWFubmluZW4gT0gyQk5TIChvaDJibnNAc3JhbC5maSkKICAqLworCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2Nvbm5lY3Rpb24uYyBiL25ldC9yeHJwYy9jb25uZWN0aW9uLmMKaW5kZXggMmJhMTRhNy4uMGUwYTQ1NSAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL2Nvbm5lY3Rpb24uYworKysgYi9uZXQvcnhycGMvY29ubmVjdGlvbi5jCkBAIC0yMjAsNiArMjIwLDcgQEAKIHsKIAlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwgKmNhbmRpZGF0ZSA9IE5VTEw7CiAJc3RydWN0IGxpc3RfaGVhZCAqX3A7CisJc3RydWN0IHNrX2J1ZmYgKnBrdCA9IG1zZy0+cGt0OwogCWludCByZXQsIGZyZXNoID0gMDsKIAlfX2JlMzIgeF9lcG9jaCwgeF9jb25uaWQ7CiAJX19iZTE2IHhfcG9ydCwgeF9zZXJ2aWQ7CkBAIC0yMjksMTAgKzIzMCwxMCBAQAogCV9lbnRlcigiJXB7eyVodX19LCV1LCVodSIsCiAJICAgICAgIHBlZXIsCiAJICAgICAgIHBlZXItPnRyYW5zLT5wb3J0LAotCSAgICAgICBudG9ocyhtc2ctPnBrdC0+aC51aC0+c291cmNlKSwKKwkgICAgICAgbnRvaHMocGt0LT5oLnVoLT5zb3VyY2UpLAogCSAgICAgICBudG9ocyhtc2ctPmhkci5zZXJ2aWNlSWQpKTsKIAotCXhfcG9ydAkJPSBtc2ctPnBrdC0+aC51aC0+c291cmNlOworCXhfcG9ydAkJPSBwa3QtPmgudWgtPnNvdXJjZTsKIAl4X2Vwb2NoCQk9IG1zZy0+aGRyLmVwb2NoOwogCXhfY2xmbGFnCT0gbXNnLT5oZHIuZmxhZ3MgJiBSWFJQQ19DTElFTlRfSU5JVElBVEVEOwogCXhfY29ubmlkCT0gaHRvbmwobnRvaGwobXNnLT5oZHIuY2lkKSAmIFJYUlBDX0NJRE1BU0spOwpAQCAtMjY3LDcgKzI2OCw3IEBACiAJCS8qIGZpbGwgaW4gdGhlIHNwZWNpZmljcyAqLwogCQljYW5kaWRhdGUtPmFkZHIuc2luX2ZhbWlseQk9IEFGX0lORVQ7CiAJCWNhbmRpZGF0ZS0+YWRkci5zaW5fcG9ydAk9IHhfcG9ydDsKLQkJY2FuZGlkYXRlLT5hZGRyLnNpbl9hZGRyLnNfYWRkciA9IG1zZy0+cGt0LT5uaC5pcGgtPnNhZGRyOworCQljYW5kaWRhdGUtPmFkZHIuc2luX2FkZHIuc19hZGRyID0gcGt0LT5uaC5pcGgtPnNhZGRyOwogCQljYW5kaWRhdGUtPmluX2Vwb2NoCQk9IHhfZXBvY2g7CiAJCWNhbmRpZGF0ZS0+b3V0X2Vwb2NoCQk9IHhfZXBvY2g7CiAJCWNhbmRpZGF0ZS0+aW5fY2xpZW50ZmxhZwk9IFJYUlBDX0NMSUVOVF9JTklUSUFURUQ7CkBAIC02NzUsNiArNjc2LDcgQEAKIAkJCQkgICBzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnKQogewogCXN0cnVjdCByeHJwY19tZXNzYWdlICpwbXNnOworCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKIAl1bnNpZ25lZCBjaXgsIHNlcTsKIAlpbnQgcmV0ID0gMDsKQEAgLTcxMCwxMCArNzEyLDEwIEBACiAKIAljYWxsLT5wa3RfcmN2X2NvdW50Kys7CiAKLQlpZiAobXNnLT5wa3QtPmRzdCAmJiBtc2ctPnBrdC0+ZHN0LT5kZXYpCisJZHN0ID0gbXNnLT5wa3QtPmRzdDsKKwlpZiAoZHN0ICYmIGRzdC0+ZGV2KQogCQljb25uLT5wZWVyLT5pZl9tdHUgPQotCQkJbXNnLT5wa3QtPmRzdC0+ZGV2LT5tdHUgLQotCQkJbXNnLT5wa3QtPmRzdC0+ZGV2LT5oYXJkX2hlYWRlcl9sZW47CisJCQlkc3QtPmRldi0+bXR1IC0gZHN0LT5kZXYtPmhhcmRfaGVhZGVyX2xlbjsKIAogCS8qIHF1ZXVlIG9uIHRoZSBjYWxsIGluIHNlcSBvcmRlciAqLwogCXJ4cnBjX2dldF9tZXNzYWdlKG1zZyk7CmRpZmYgLS1naXQgYS9uZXQvcnhycGMva3J4dGltb2QuYyBiL25ldC9yeHJwYy9rcnh0aW1vZC5jCmluZGV4IDNhYzgxY2QuLjNlNzQ2NjkgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9rcnh0aW1vZC5jCisrKyBiL25ldC9yeHJwYy9rcnh0aW1vZC5jCkBAIC04MSw3ICs4MSw3IEBACiAKIAlmb3IgKDs7KSB7CiAJCXVuc2lnbmVkIGxvbmcgamlmOwotCQlzaWduZWQgbG9uZyB0aW1lb3V0OworCQlsb25nIHRpbWVvdXQ7CiAKIAkJLyogZGVhbCB3aXRoIHRoZSBzZXJ2ZXIgYmVpbmcgYXNrZWQgdG8gZGllICovCiAJCWlmIChrcnh0aW1vZF9kaWUpIHsKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9wcm9jLmMgYi9uZXQvcnhycGMvcHJvYy5jCmluZGV4IDNiNWVjZDguLjI5OTc1ZDkgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9wcm9jLmMKKysrIGIvbmV0L3J4cnBjL3Byb2MuYwpAQCAtMzYxLDcgKzM2MSw3IEBACiBzdGF0aWMgaW50IHJ4cnBjX3Byb2NfcGVlcnNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7CiAJc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIgPSBsaXN0X2VudHJ5KHYsIHN0cnVjdCByeHJwY19wZWVyLCBwcm9jX2xpbmspOwotCXNpZ25lZCBsb25nIHRpbWVvdXQ7CisJbG9uZyB0aW1lb3V0OwogCiAJLyogZGlzcGxheSBoZWFkZXIgb24gbGluZSAxICovCiAJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CkBAIC0zNzMsOCArMzczLDggQEAKIAkvKiBkaXNwbGF5IG9uZSBwZWVyIHBlciBsaW5lIG9uIHN1YnNlcXVlbnQgbGluZXMgKi8KIAl0aW1lb3V0ID0gMDsKIAlpZiAoIWxpc3RfZW1wdHkoJnBlZXItPnRpbWVvdXQubGluaykpCi0JCXRpbWVvdXQgPSAoc2lnbmVkIGxvbmcpIHBlZXItPnRpbWVvdXQudGltb19qaWYgLQotCQkJKHNpZ25lZCBsb25nKSBqaWZmaWVzOworCQl0aW1lb3V0ID0gKGxvbmcpIHBlZXItPnRpbWVvdXQudGltb19qaWYgLQorCQkJKGxvbmcpIGppZmZpZXM7CiAKIAlzZXFfcHJpbnRmKG0sICIlNWh1ICUwOHggJTVkICU1ZCAlOGxkICU1WnUgJTdsdVxuIiwKIAkJICAgcGVlci0+dHJhbnMtPnBvcnQsCkBAIC00NjgsNyArNDY4LDcgQEAKIHN0YXRpYyBpbnQgcnhycGNfcHJvY19jb25uc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKIAlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKLQlzaWduZWQgbG9uZyB0aW1lb3V0OworCWxvbmcgdGltZW91dDsKIAogCWNvbm4gPSBsaXN0X2VudHJ5KHYsIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLCBwcm9jX2xpbmspOwogCkBAIC00ODQsOCArNDg0LDggQEAKIAkvKiBkaXNwbGF5IG9uZSBjb25uIHBlciBsaW5lIG9uIHN1YnNlcXVlbnQgbGluZXMgKi8KIAl0aW1lb3V0ID0gMDsKIAlpZiAoIWxpc3RfZW1wdHkoJmNvbm4tPnRpbWVvdXQubGluaykpCi0JCXRpbWVvdXQgPSAoc2lnbmVkIGxvbmcpIGNvbm4tPnRpbWVvdXQudGltb19qaWYgLQotCQkJKHNpZ25lZCBsb25nKSBqaWZmaWVzOworCQl0aW1lb3V0ID0gKGxvbmcpIGNvbm4tPnRpbWVvdXQudGltb19qaWYgLQorCQkJKGxvbmcpIGppZmZpZXM7CiAKIAlzZXFfcHJpbnRmKG0sCiAJCSAgICIlNWh1ICUwOHggJTVodSAlMDRoeCAlMDh4ICUtMy4zcyAlMDh4ICUwOHggJTVadSAlOGxkXG4iLApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL0tjb25maWcgYi9uZXQvc2NoZWQvS2NvbmZpZwppbmRleCA1NWNkNTMyLi43NzhiMWU1IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvS2NvbmZpZworKysgYi9uZXQvc2NoZWQvS2NvbmZpZwpAQCAtNDQsNyArNDQsNyBAQAogCiBjaG9pY2UKIAlwcm9tcHQgIlBhY2tldCBzY2hlZHVsZXIgY2xvY2sgc291cmNlIgotCWRlZmF1bHQgTkVUX1NDSF9DTEtfSklGRklFUworCWRlZmF1bHQgTkVUX1NDSF9DTEtfR0VUVElNRU9GREFZCiAJLS0taGVscC0tLQogCSAgUGFja2V0IHNjaGVkdWxlcnMgbmVlZCBhIG1vbm90b25pYyBjbG9jayB0aGF0IGluY3JlbWVudHMgYXQgYSBzdGF0aWMKIAkgIHJhdGUuIFRoZSBrZXJuZWwgcHJvdmlkZXMgc2V2ZXJhbCBzdWl0YWJsZSBpbnRlcmZhY2VzLCBlYWNoIHdpdGgKQEAgLTQxMSw3ICs0MTEsNyBAQAogCXRyaXN0YXRlICJNZXRhZGF0YSIKIAlkZXBlbmRzIG9uIE5FVF9FTUFUQ0gKIAktLS1oZWxwLS0tCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJlIGFibHQgdG8gY2xhc3NpZnkgcGFja2V0cyBiYXNlZCBvbgorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIGNsYXNzaWZ5IHBhY2tldHMgYmFzZWQgb24KIAkgIG1ldGFkYXRhIHN1Y2ggYXMgbG9hZCBhdmVyYWdlLCBuZXRmaWx0ZXIgYXR0cmlidXRlcywgc29ja2V0CiAJICBhdHRyaWJ1dGVzIGFuZCByb3V0aW5nIGRlY2lzaW9ucy4KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL01ha2VmaWxlIGIvbmV0L3NjaGVkL01ha2VmaWxlCmluZGV4IGU0OGQwZDQuLjBmMDZhZWMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9NYWtlZmlsZQorKysgYi9uZXQvc2NoZWQvTWFrZWZpbGUKQEAgLTcsMTMgKzcsMTMgQEAKIG9iai0kKENPTkZJR19ORVRfU0NIRUQpCQkrPSBzY2hfYXBpLm8gc2NoX2ZpZm8ubyBzY2hfYmxhY2tob2xlLm8KIG9iai0kKENPTkZJR19ORVRfQ0xTKQkJKz0gY2xzX2FwaS5vCiBvYmotJChDT05GSUdfTkVUX0NMU19BQ1QpCSs9IGFjdF9hcGkubwotb2JqLSQoQ09ORklHX05FVF9BQ1RfUE9MSUNFKQkrPSBwb2xpY2Uubwotb2JqLSQoQ09ORklHX05FVF9DTFNfUE9MSUNFKQkrPSBwb2xpY2Uubwotb2JqLSQoQ09ORklHX05FVF9BQ1RfR0FDVCkJKz0gZ2FjdC5vCi1vYmotJChDT05GSUdfTkVUX0FDVF9NSVJSRUQpCSs9IG1pcnJlZC5vCi1vYmotJChDT05GSUdfTkVUX0FDVF9JUFQpCSs9IGlwdC5vCi1vYmotJChDT05GSUdfTkVUX0FDVF9QRURJVCkJKz0gcGVkaXQubwotb2JqLSQoQ09ORklHX05FVF9BQ1RfU0lNUCkJKz0gc2ltcGxlLm8KK29iai0kKENPTkZJR19ORVRfQUNUX1BPTElDRSkJKz0gYWN0X3BvbGljZS5vCitvYmotJChDT05GSUdfTkVUX0NMU19QT0xJQ0UpCSs9IGFjdF9wb2xpY2Uubworb2JqLSQoQ09ORklHX05FVF9BQ1RfR0FDVCkJKz0gYWN0X2dhY3Qubworb2JqLSQoQ09ORklHX05FVF9BQ1RfTUlSUkVEKQkrPSBhY3RfbWlycmVkLm8KK29iai0kKENPTkZJR19ORVRfQUNUX0lQVCkJKz0gYWN0X2lwdC5vCitvYmotJChDT05GSUdfTkVUX0FDVF9QRURJVCkJKz0gYWN0X3BlZGl0Lm8KK29iai0kKENPTkZJR19ORVRfQUNUX1NJTVApCSs9IGFjdF9zaW1wbGUubwogb2JqLSQoQ09ORklHX05FVF9TQ0hfQ0JRKQkrPSBzY2hfY2JxLm8KIG9iai0kKENPTkZJR19ORVRfU0NIX0hUQikJKz0gc2NoX2h0Yi5vCiBvYmotJChDT05GSUdfTkVUX1NDSF9IUEZRKQkrPSBzY2hfaHBmcS5vCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X2FwaS5jIGIvbmV0L3NjaGVkL2FjdF9hcGkuYwppbmRleCAyY2UxY2IyLi43OTJjZTU5IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X2FwaS5jCisrKyBiL25ldC9zY2hlZC9hY3RfYXBpLmMKQEAgLTE2NSw3ICsxNjUsNyBAQAogCXdoaWxlICgoYSA9IGFjdCkgIT0gTlVMTCkgewogcmVwZWF0OgogCQlpZiAoYS0+b3BzICYmIGEtPm9wcy0+YWN0KSB7Ci0JCQlyZXQgPSBhLT5vcHMtPmFjdCgmc2tiLCBhLCByZXMpOworCQkJcmV0ID0gYS0+b3BzLT5hY3Qoc2tiLCBhLCByZXMpOwogCQkJaWYgKFRDX01VTkdFRCAmIHNrYi0+dGNfdmVyZCkgewogCQkJCS8qIGNvcGllZCBhbHJlYWR5LCBhbGxvdyB0cmFtcGxpbmcgKi8KIAkJCQlza2ItPnRjX3ZlcmQgPSBTRVRfVENfT0syTVVOR0Uoc2tiLT50Y192ZXJkKTsKQEAgLTI5MCw3ICsyOTAsNyBAQAogCWlmIChhX28gPT0gTlVMTCkgewogI2lmZGVmIENPTkZJR19LTU9ECiAJCXJ0bmxfdW5sb2NrKCk7Ci0JCXJlcXVlc3RfbW9kdWxlKGFjdF9uYW1lKTsKKwkJcmVxdWVzdF9tb2R1bGUoImFjdF8lcyIsIGFjdF9uYW1lKTsKIAkJcnRubF9sb2NrKCk7CiAKIAkJYV9vID0gdGNfbG9va3VwX2FjdGlvbl9uKGFjdF9uYW1lKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfZ2FjdC5jIGIvbmV0L3NjaGVkL2FjdF9nYWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFlNjhmNwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY2hlZC9hY3RfZ2FjdC5jCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogbmV0L3NjaGVkL2dhY3QuYwlHZW5lcmljIGFjdGlvbnMKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBjb3B5cmlnaHQgCUphbWFsIEhhZGkgU2FsaW0gKDIwMDItNCkKKyAqCisgKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90Y19hY3QvdGNfZ2FjdC5oPgorI2luY2x1ZGUgPG5ldC90Y19hY3QvdGNfZ2FjdC5oPgorCisvKiB1c2UgZ2VuZXJpYyBoYXNoIHRhYmxlICovCisjZGVmaW5lIE1ZX1RBQl9TSVpFCTE2CisjZGVmaW5lIE1ZX1RBQl9NQVNLCTE1CisKK3N0YXRpYyB1MzIgaWR4X2dlbjsKK3N0YXRpYyBzdHJ1Y3QgdGNmX2dhY3QgKnRjZl9nYWN0X2h0W01ZX1RBQl9TSVpFXTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKGdhY3RfbG9jayk7CisKKy8qIG92ZXdycmlkZSB0aGUgZGVmYXVsdHMgKi8KKyNkZWZpbmUgdGNmX3N0CQl0Y2ZfZ2FjdAorI2RlZmluZSB0Y19zdAkJdGNfZ2FjdAorI2RlZmluZSB0Y2ZfdF9sb2NrCWdhY3RfbG9jaworI2RlZmluZSB0Y2ZfaHQJCXRjZl9nYWN0X2h0CisKKyNkZWZpbmUgQ09ORklHX05FVF9BQ1RfSU5JVCAxCisjaW5jbHVkZSA8bmV0L3BrdF9hY3QuaD4KKworI2lmZGVmIENPTkZJR19HQUNUX1BST0IKK3N0YXRpYyBpbnQgZ2FjdF9uZXRfcmFuZChzdHJ1Y3QgdGNmX2dhY3QgKnApCit7CisJaWYgKG5ldF9yYW5kb20oKSVwLT5wdmFsKQorCQlyZXR1cm4gcC0+YWN0aW9uOworCXJldHVybiBwLT5wYWN0aW9uOworfQorCitzdGF0aWMgaW50IGdhY3RfZGV0ZXJtKHN0cnVjdCB0Y2ZfZ2FjdCAqcCkKK3sKKwlpZiAocC0+YnN0YXRzLnBhY2tldHMlcC0+cHZhbCkKKwkJcmV0dXJuIHAtPmFjdGlvbjsKKwlyZXR1cm4gcC0+cGFjdGlvbjsKK30KKwordHlwZWRlZiBpbnQgKCpnX3JhbmQpKHN0cnVjdCB0Y2ZfZ2FjdCAqcCk7CitzdGF0aWMgZ19yYW5kIGdhY3RfcmFuZFtNQVhfUkFORF09IHsgTlVMTCwgZ2FjdF9uZXRfcmFuZCwgZ2FjdF9kZXRlcm0gfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IHRjZl9nYWN0X2luaXQoc3RydWN0IHJ0YXR0ciAqcnRhLCBzdHJ1Y3QgcnRhdHRyICplc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRjX2FjdGlvbiAqYSwgaW50IG92ciwgaW50IGJpbmQpCit7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX0dBQ1RfTUFYXTsKKwlzdHJ1Y3QgdGNfZ2FjdCAqcGFybTsKKwlzdHJ1Y3QgdGNmX2dhY3QgKnA7CisJaW50IHJldCA9IDA7CisKKwlpZiAocnRhID09IE5VTEwgfHwgcnRhdHRyX3BhcnNlX25lc3RlZCh0YiwgVENBX0dBQ1RfTUFYLCBydGEpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGJbVENBX0dBQ1RfUEFSTVMgLSAxXSA9PSBOVUxMIHx8CisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9HQUNUX1BBUk1TIC0gMV0pIDwgc2l6ZW9mKCpwYXJtKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcGFybSA9IFJUQV9EQVRBKHRiW1RDQV9HQUNUX1BBUk1TIC0gMV0pOworCisJaWYgKHRiW1RDQV9HQUNUX1BST0ItMV0gIT0gTlVMTCkKKyNpZmRlZiBDT05GSUdfR0FDVF9QUk9CCisJCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfR0FDVF9QUk9CLTFdKSA8IHNpemVvZihzdHJ1Y3QgdGNfZ2FjdF9wKSkKKwkJCXJldHVybiAtRUlOVkFMOworI2Vsc2UKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworI2VuZGlmCisKKwlwID0gdGNmX2hhc2hfY2hlY2socGFybS0+aW5kZXgsIGEsIG92ciwgYmluZCk7CisJaWYgKHAgPT0gTlVMTCkgeworCQlwID0gdGNmX2hhc2hfY3JlYXRlKHBhcm0tPmluZGV4LCBlc3QsIGEsIHNpemVvZigqcCksIG92ciwgYmluZCk7CisJCWlmIChwID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0ID0gQUNUX1BfQ1JFQVRFRDsKKwl9IGVsc2UgeworCQlpZiAoIW92cikgeworCQkJdGNmX2hhc2hfcmVsZWFzZShwLCBiaW5kKTsKKwkJCXJldHVybiAtRUVYSVNUOworCQl9CisJfQorCisJc3Bpbl9sb2NrX2JoKCZwLT5sb2NrKTsKKwlwLT5hY3Rpb24gPSBwYXJtLT5hY3Rpb247CisjaWZkZWYgQ09ORklHX0dBQ1RfUFJPQgorCWlmICh0YltUQ0FfR0FDVF9QUk9CLTFdICE9IE5VTEwpIHsKKwkJc3RydWN0IHRjX2dhY3RfcCAqcF9wYXJtID0gUlRBX0RBVEEodGJbVENBX0dBQ1RfUFJPQi0xXSk7CisJCXAtPnBhY3Rpb24gPSBwX3Bhcm0tPnBhY3Rpb247CisJCXAtPnB2YWwgICAgPSBwX3Bhcm0tPnB2YWw7CisJCXAtPnB0eXBlICAgPSBwX3Bhcm0tPnB0eXBlOworCX0KKyNlbmRpZgorCXNwaW5fdW5sb2NrX2JoKCZwLT5sb2NrKTsKKwlpZiAocmV0ID09IEFDVF9QX0NSRUFURUQpCisJCXRjZl9oYXNoX2luc2VydChwKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50Cit0Y2ZfZ2FjdF9jbGVhbnVwKHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kKQoreworCXN0cnVjdCB0Y2ZfZ2FjdCAqcCA9IFBSSVYoYSwgZ2FjdCk7CisKKwlpZiAocCAhPSBOVUxMKQorCQlyZXR1cm4gdGNmX2hhc2hfcmVsZWFzZShwLCBiaW5kKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGNmX2dhY3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjX2FjdGlvbiAqYSwgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKK3sKKwlzdHJ1Y3QgdGNmX2dhY3QgKnAgPSBQUklWKGEsIGdhY3QpOworCWludCBhY3Rpb24gPSBUQ19BQ1RfU0hPVDsKKworCXNwaW5fbG9jaygmcC0+bG9jayk7CisjaWZkZWYgQ09ORklHX0dBQ1RfUFJPQgorCWlmIChwLT5wdHlwZSAmJiBnYWN0X3JhbmRbcC0+cHR5cGVdICE9IE5VTEwpCisJCWFjdGlvbiA9IGdhY3RfcmFuZFtwLT5wdHlwZV0ocCk7CisJZWxzZQorCQlhY3Rpb24gPSBwLT5hY3Rpb247CisjZWxzZQorCWFjdGlvbiA9IHAtPmFjdGlvbjsKKyNlbmRpZgorCXAtPmJzdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKKwlwLT5ic3RhdHMucGFja2V0cysrOworCWlmIChhY3Rpb24gPT0gVENfQUNUX1NIT1QpCisJCXAtPnFzdGF0cy5kcm9wcysrOworCXAtPnRtLmxhc3R1c2UgPSBqaWZmaWVzOworCXNwaW5fdW5sb2NrKCZwLT5sb2NrKTsKKworCXJldHVybiBhY3Rpb247Cit9CisKK3N0YXRpYyBpbnQKK3RjZl9nYWN0X2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjX2FjdGlvbiAqYSwgaW50IGJpbmQsIGludCByZWYpCit7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgdGNfZ2FjdCBvcHQ7CisJc3RydWN0IHRjZl9nYWN0ICpwID0gUFJJVihhLCBnYWN0KTsKKwlzdHJ1Y3QgdGNmX3QgdDsKKworCW9wdC5pbmRleCA9IHAtPmluZGV4OworCW9wdC5yZWZjbnQgPSBwLT5yZWZjbnQgLSByZWY7CisJb3B0LmJpbmRjbnQgPSBwLT5iaW5kY250IC0gYmluZDsKKwlvcHQuYWN0aW9uID0gcC0+YWN0aW9uOworCVJUQV9QVVQoc2tiLCBUQ0FfR0FDVF9QQVJNUywgc2l6ZW9mKG9wdCksICZvcHQpOworI2lmZGVmIENPTkZJR19HQUNUX1BST0IKKwlpZiAocC0+cHR5cGUpIHsKKwkJc3RydWN0IHRjX2dhY3RfcCBwX29wdDsKKwkJcF9vcHQucGFjdGlvbiA9IHAtPnBhY3Rpb247CisJCXBfb3B0LnB2YWwgPSBwLT5wdmFsOworCQlwX29wdC5wdHlwZSA9IHAtPnB0eXBlOworCQlSVEFfUFVUKHNrYiwgVENBX0dBQ1RfUFJPQiwgc2l6ZW9mKHBfb3B0KSwgJnBfb3B0KTsKKwl9CisjZW5kaWYKKwl0Lmluc3RhbGwgPSBqaWZmaWVzX3RvX2Nsb2NrX3QoamlmZmllcyAtIHAtPnRtLmluc3RhbGwpOworCXQubGFzdHVzZSA9IGppZmZpZXNfdG9fY2xvY2tfdChqaWZmaWVzIC0gcC0+dG0ubGFzdHVzZSk7CisJdC5leHBpcmVzID0gamlmZmllc190b19jbG9ja190KHAtPnRtLmV4cGlyZXMpOworCVJUQV9QVVQoc2tiLCBUQ0FfR0FDVF9UTSwgc2l6ZW9mKHQpLCAmdCk7CisJcmV0dXJuIHNrYi0+bGVuOworCisgICAgICBydGF0dHJfZmFpbHVyZToKKwlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHN0cnVjdCB0Y19hY3Rpb25fb3BzIGFjdF9nYWN0X29wcyA9IHsKKwkua2luZAkJPQkiZ2FjdCIsCisJLnR5cGUJCT0JVENBX0FDVF9HQUNULAorCS5jYXBhYgkJPQlUQ0FfQ0FQX05PTkUsCisJLm93bmVyCQk9CVRISVNfTU9EVUxFLAorCS5hY3QJCT0JdGNmX2dhY3QsCisJLmR1bXAJCT0JdGNmX2dhY3RfZHVtcCwKKwkuY2xlYW51cAk9CXRjZl9nYWN0X2NsZWFudXAsCisJLmxvb2t1cAkJPQl0Y2ZfaGFzaF9zZWFyY2gsCisJLmluaXQJCT0JdGNmX2dhY3RfaW5pdCwKKwkud2FsawkJPQl0Y2ZfZ2VuZXJpY193YWxrZXIKK307CisKK01PRFVMRV9BVVRIT1IoIkphbWFsIEhhZGkgU2FsaW0oMjAwMi00KSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJHZW5lcmljIENsYXNzaWZpZXIgYWN0aW9ucyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IF9faW5pdAorZ2FjdF9pbml0X21vZHVsZSh2b2lkKQoreworI2lmZGVmIENPTkZJR19HQUNUX1BST0IKKwlwcmludGsoIkdBQ1QgcHJvYmFiaWxpdHkgb25cbiIpOworI2Vsc2UKKwlwcmludGsoIkdBQ1QgcHJvYmFiaWxpdHkgTk9UIG9uXG4iKTsKKyNlbmRpZgorCXJldHVybiB0Y2ZfcmVnaXN0ZXJfYWN0aW9uKCZhY3RfZ2FjdF9vcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2dhY3RfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl0Y2ZfdW5yZWdpc3Rlcl9hY3Rpb24oJmFjdF9nYWN0X29wcyk7Cit9CisKK21vZHVsZV9pbml0KGdhY3RfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZ2FjdF9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X2lwdC5jIGIvbmV0L3NjaGVkL2FjdF9pcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWEyMmEzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjaGVkL2FjdF9pcHQuYwpAQCAtMCwwICsxLDMyOCBAQAorLyoKKyAqIG5ldC9zY2hlZC9pcHQuYwlpcHRhYmxlcyB0YXJnZXQgaW50ZXJmYWNlCisgKgorICpUT0RPOiBBZGQgb3RoZXIgdGFibGVzLiBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCB0aGUgaXB2NCB0YWJsZSB0YXJnZXRzCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQ29weXJpZ2h0OglKYW1hbCBIYWRpIFNhbGltICgyMDAyLTQpCisgKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjX2FjdC90Y19pcHQuaD4KKyNpbmNsdWRlIDxuZXQvdGNfYWN0L3RjX2lwdC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisKKy8qIHVzZSBnZW5lcmljIGhhc2ggdGFibGUgKi8KKyNkZWZpbmUgTVlfVEFCX1NJWkUgICAgIDE2CisjZGVmaW5lIE1ZX1RBQl9NQVNLICAgICAxNQorCitzdGF0aWMgdTMyIGlkeF9nZW47CitzdGF0aWMgc3RydWN0IHRjZl9pcHQgKnRjZl9pcHRfaHRbTVlfVEFCX1NJWkVdOworLyogaXB0IGhhc2ggdGFibGUgbG9jayAqLworc3RhdGljIERFRklORV9SV0xPQ0soaXB0X2xvY2spOworCisvKiBvdmV3cnJpZGUgdGhlIGRlZmF1bHRzICovCisjZGVmaW5lIHRjZl9zdAkJdGNmX2lwdAorI2RlZmluZSB0Y2ZfdF9sb2NrCWlwdF9sb2NrCisjZGVmaW5lIHRjZl9odAkJdGNmX2lwdF9odAorCisjZGVmaW5lIENPTkZJR19ORVRfQUNUX0lOSVQKKyNpbmNsdWRlIDxuZXQvcGt0X2FjdC5oPgorCitzdGF0aWMgaW50CitpcHRfaW5pdF90YXJnZXQoc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnQsIGNoYXIgKnRhYmxlLCB1bnNpZ25lZCBpbnQgaG9vaykKK3sKKwlzdHJ1Y3QgaXB0X3RhcmdldCAqdGFyZ2V0OworCWludCByZXQgPSAwOworCisJdGFyZ2V0ID0geHRfZmluZF90YXJnZXQoQUZfSU5FVCwgdC0+dS51c2VyLm5hbWUsIHQtPnUudXNlci5yZXZpc2lvbik7CisJaWYgKCF0YXJnZXQpCisJCXJldHVybiAtRU5PRU5UOworCisJRFBSSU5USygiaXB0X2luaXRfdGFyZ2V0OiBmb3VuZCAlc1xuIiwgdGFyZ2V0LT5uYW1lKTsKKwl0LT51Lmtlcm5lbC50YXJnZXQgPSB0YXJnZXQ7CisKKwlpZiAodC0+dS5rZXJuZWwudGFyZ2V0LT5jaGVja2VudHJ5CisJICAgICYmICF0LT51Lmtlcm5lbC50YXJnZXQtPmNoZWNrZW50cnkodGFibGUsIE5VTEwsIHQtPmRhdGEsCisJCQkJCSAgICAgICB0LT51LnRhcmdldF9zaXplIC0gc2l6ZW9mKCp0KSwKKwkJCQkJICAgICAgIGhvb2spKSB7CisJCURQUklOVEsoImlwdF9pbml0X3RhcmdldDogY2hlY2sgZmFpbGVkIGZvciBgJXMnLlxuIiwKKwkJCXQtPnUua2VybmVsLnRhcmdldC0+bmFtZSk7CisJCW1vZHVsZV9wdXQodC0+dS5rZXJuZWwudGFyZ2V0LT5tZSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2lwdF9kZXN0cm95X3RhcmdldChzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdCkKK3sKKwlpZiAodC0+dS5rZXJuZWwudGFyZ2V0LT5kZXN0cm95KQorCQl0LT51Lmtlcm5lbC50YXJnZXQtPmRlc3Ryb3kodC0+ZGF0YSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPnUudGFyZ2V0X3NpemUgLSBzaXplb2YoKnQpKTsKKyAgICAgICAgbW9kdWxlX3B1dCh0LT51Lmtlcm5lbC50YXJnZXQtPm1lKTsKK30KKworc3RhdGljIGludAordGNmX2lwdF9yZWxlYXNlKHN0cnVjdCB0Y2ZfaXB0ICpwLCBpbnQgYmluZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpZiAocCkgeworCQlpZiAoYmluZCkKKwkJCXAtPmJpbmRjbnQtLTsKKwkJcC0+cmVmY250LS07CisJCWlmIChwLT5iaW5kY250IDw9IDAgJiYgcC0+cmVmY250IDw9IDApIHsKKwkJCWlwdF9kZXN0cm95X3RhcmdldChwLT50KTsKKwkJCWtmcmVlKHAtPnRuYW1lKTsKKwkJCWtmcmVlKHAtPnQpOworCQkJdGNmX2hhc2hfZGVzdHJveShwKTsKKwkJCXJldCA9IEFDVF9QX0RFTEVURUQ7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAordGNmX2lwdF9pbml0KHN0cnVjdCBydGF0dHIgKnJ0YSwgc3RydWN0IHJ0YXR0ciAqZXN0LCBzdHJ1Y3QgdGNfYWN0aW9uICphLAorICAgICAgICAgICAgIGludCBvdnIsIGludCBiaW5kKQoreworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9JUFRfTUFYXTsKKwlzdHJ1Y3QgdGNmX2lwdCAqcDsKKwlzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdGQsICp0OworCWNoYXIgKnRuYW1lOworCWludCByZXQgPSAwLCBlcnI7CisJdTMyIGhvb2sgPSAwOworCXUzMiBpbmRleCA9IDA7CisKKwlpZiAocnRhID09IE5VTEwgfHwgcnRhdHRyX3BhcnNlX25lc3RlZCh0YiwgVENBX0lQVF9NQVgsIHJ0YSkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh0YltUQ0FfSVBUX0hPT0stMV0gPT0gTlVMTCB8fAorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfSVBUX0hPT0stMV0pIDwgc2l6ZW9mKHUzMikpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh0YltUQ0FfSVBUX1RBUkctMV0gPT0gTlVMTCB8fAorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfSVBUX1RBUkctMV0pIDwgc2l6ZW9mKCp0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdGQgPSAoc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKilSVEFfREFUQSh0YltUQ0FfSVBUX1RBUkctMV0pOworCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfSVBUX1RBUkctMV0pIDwgdGQtPnUudGFyZ2V0X3NpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRiW1RDQV9JUFRfSU5ERVgtMV0gIT0gTlVMTCAmJgorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfSVBUX0lOREVYLTFdKSA+PSBzaXplb2YodTMyKSkKKwkJaW5kZXggPSAqKHUzMiAqKVJUQV9EQVRBKHRiW1RDQV9JUFRfSU5ERVgtMV0pOworCisJcCA9IHRjZl9oYXNoX2NoZWNrKGluZGV4LCBhLCBvdnIsIGJpbmQpOworCWlmIChwID09IE5VTEwpIHsKKwkJcCA9IHRjZl9oYXNoX2NyZWF0ZShpbmRleCwgZXN0LCBhLCBzaXplb2YoKnApLCBvdnIsIGJpbmQpOworCQlpZiAocCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJldCA9IEFDVF9QX0NSRUFURUQ7CisJfSBlbHNlIHsKKwkJaWYgKCFvdnIpIHsKKwkJCXRjZl9pcHRfcmVsZWFzZShwLCBiaW5kKTsKKwkJCXJldHVybiAtRUVYSVNUOworCQl9CisJfQorCisJaG9vayA9ICoodTMyICopUlRBX0RBVEEodGJbVENBX0lQVF9IT09LLTFdKTsKKworCWVyciA9IC1FTk9NRU07CisJdG5hbWUgPSBrbWFsbG9jKElGTkFNU0laLCBHRlBfS0VSTkVMKTsKKwlpZiAodG5hbWUgPT0gTlVMTCkKKwkJZ290byBlcnIxOworCWlmICh0YltUQ0FfSVBUX1RBQkxFIC0gMV0gPT0gTlVMTCB8fAorCSAgICBydGF0dHJfc3RybGNweSh0bmFtZSwgdGJbVENBX0lQVF9UQUJMRS0xXSwgSUZOQU1TSVopID49IElGTkFNU0laKQorCQlzdHJjcHkodG5hbWUsICJtYW5nbGUiKTsKKworCXQgPSBrbWFsbG9jKHRkLT51LnRhcmdldF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAodCA9PSBOVUxMKQorCQlnb3RvIGVycjI7CisJbWVtY3B5KHQsIHRkLCB0ZC0+dS50YXJnZXRfc2l6ZSk7CisKKwlpZiAoKGVyciA9IGlwdF9pbml0X3RhcmdldCh0LCB0bmFtZSwgaG9vaykpIDwgMCkKKwkJZ290byBlcnIzOworCisJc3Bpbl9sb2NrX2JoKCZwLT5sb2NrKTsKKwlpZiAocmV0ICE9IEFDVF9QX0NSRUFURUQpIHsKKwkJaXB0X2Rlc3Ryb3lfdGFyZ2V0KHAtPnQpOworCQlrZnJlZShwLT50bmFtZSk7CisJCWtmcmVlKHAtPnQpOworCX0KKwlwLT50bmFtZSA9IHRuYW1lOworCXAtPnQgICAgID0gdDsKKwlwLT5ob29rICA9IGhvb2s7CisJc3Bpbl91bmxvY2tfYmgoJnAtPmxvY2spOworCWlmIChyZXQgPT0gQUNUX1BfQ1JFQVRFRCkKKwkJdGNmX2hhc2hfaW5zZXJ0KHApOworCXJldHVybiByZXQ7CisKK2VycjM6CisJa2ZyZWUodCk7CitlcnIyOgorCWtmcmVlKHRuYW1lKTsKK2VycjE6CisJa2ZyZWUocCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAordGNmX2lwdF9jbGVhbnVwKHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kKQoreworCXN0cnVjdCB0Y2ZfaXB0ICpwID0gUFJJVihhLCBpcHQpOworCXJldHVybiB0Y2ZfaXB0X3JlbGVhc2UocCwgYmluZCk7Cit9CisKK3N0YXRpYyBpbnQKK3RjZl9pcHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjX2FjdGlvbiAqYSwgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKK3sKKwlpbnQgcmV0ID0gMCwgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgdGNmX2lwdCAqcCA9IFBSSVYoYSwgaXB0KTsKKworCWlmIChza2JfY2xvbmVkKHNrYikpIHsKKwkJaWYgKHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLCBHRlBfQVRPTUlDKSkKKwkJCXJldHVybiBUQ19BQ1RfVU5TUEVDOworCX0KKworCXNwaW5fbG9jaygmcC0+bG9jayk7CisKKwlwLT50bS5sYXN0dXNlID0gamlmZmllczsKKwlwLT5ic3RhdHMuYnl0ZXMgKz0gc2tiLT5sZW47CisJcC0+YnN0YXRzLnBhY2tldHMrKzsKKworCS8qIHllcywgd2UgaGF2ZSB0byB3b3JyeSBhYm91dCBib3RoIGluIGFuZCBvdXQgZGV2CisJIHdvcnJ5IGxhdGVyIC0gZGFuZ2VyIC0gdGhpcyBBUEkgc2VlbXMgdG8gaGF2ZSBjaGFuZ2VkCisJIGZyb20gZWFybGllciBrZXJuZWxzICovCisKKwkvKiBpcHRhYmxlcyB0YXJnZXRzIHRha2UgYSBkb3VibGUgc2tiIHBvaW50ZXIgaW4gY2FzZSB0aGUgc2tiCisJICogbmVlZHMgdG8gYmUgcmVwbGFjZWQuIFdlIGRvbid0IG93biB0aGUgc2tiLCBzbyB0aGlzIG11c3Qgbm90CisJICogaGFwcGVuLiBUaGUgcHNrYl9leHBhbmRfaGVhZCBhYm92ZSBzaG91bGQgbWFrZSBzdXJlIG9mIHRoaXMgKi8KKwlyZXQgPSBwLT50LT51Lmtlcm5lbC50YXJnZXQtPnRhcmdldCgmc2tiLCBza2ItPmRldiwgTlVMTCwKKwkJCQkJICAgIHAtPmhvb2ssIHAtPnQtPmRhdGEsIE5VTEwpOworCXN3aXRjaCAocmV0KSB7CisJY2FzZSBORl9BQ0NFUFQ6CisJCXJlc3VsdCA9IFRDX0FDVF9PSzsKKwkJYnJlYWs7CisJY2FzZSBORl9EUk9QOgorCQlyZXN1bHQgPSBUQ19BQ1RfU0hPVDsKKwkJcC0+cXN0YXRzLmRyb3BzKys7CisJCWJyZWFrOworCWNhc2UgSVBUX0NPTlRJTlVFOgorCQlyZXN1bHQgPSBUQ19BQ1RfUElQRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50aygiQm9ndXMgbmV0ZmlsdGVyIGNvZGUgJWQgYXNzdW1lIEFDQ0VQVFxuIiwgcmV0KTsKKwkJcmVzdWx0ID0gVENfUE9MSUNFX09LOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJnAtPmxvY2spOworCXJldHVybiByZXN1bHQ7CisKK30KKworc3RhdGljIGludAordGNmX2lwdF9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kLCBpbnQgcmVmKQoreworCXN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0OworCXN0cnVjdCB0Y2ZfdCB0bTsKKwlzdHJ1Y3QgdGNfY250IGM7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgdGNmX2lwdCAqcCA9IFBSSVYoYSwgaXB0KTsKKworCS8qIGZvciBzaW1wbGUgdGFyZ2V0cyBrZXJuZWwgc2l6ZSA9PSB1c2VyIHNpemUKKwkqKiB1c2VyIG5hbWUgPSB0YXJnZXQgbmFtZQorCSoqIGZvciBmb29scHJvb2YgeW91IG5lZWQgdG8gbm90IGFzc3VtZSB0aGlzCisJKi8KKworCXQgPSBrbWFsbG9jKHAtPnQtPnUudXNlci50YXJnZXRfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKHQgPT0gTlVMTCkKKwkJZ290byBydGF0dHJfZmFpbHVyZTsKKworCWMuYmluZGNudCA9IHAtPmJpbmRjbnQgLSBiaW5kOworCWMucmVmY250ID0gcC0+cmVmY250IC0gcmVmOworCW1lbWNweSh0LCBwLT50LCBwLT50LT51LnVzZXIudGFyZ2V0X3NpemUpOworCXN0cmNweSh0LT51LnVzZXIubmFtZSwgcC0+dC0+dS5rZXJuZWwudGFyZ2V0LT5uYW1lKTsKKworCURQUklOVEsoIlx0dGNmX2lwdF9kdW1wIHRhYmxlbmFtZSAlcyBsZW5ndGggJWRcbiIsIHAtPnRuYW1lLAorCQlzdHJsZW4ocC0+dG5hbWUpKTsKKwlEUFJJTlRLKCJcdGR1bXAgdGFyZ2V0IG5hbWUgJXMgc2l6ZSAlZCBzaXplIHVzZXIgJWQgIgorCSAgICAgICAgImRhdGFbMF0gJXggZGF0YVsxXSAleFxuIiwgcC0+dC0+dS5rZXJuZWwudGFyZ2V0LT5uYW1lLAorCSAgICAgICAgcC0+dC0+dS50YXJnZXRfc2l6ZSwgcC0+dC0+dS51c2VyLnRhcmdldF9zaXplLAorCSAgICAgICAgcC0+dC0+ZGF0YVswXSwgcC0+dC0+ZGF0YVsxXSk7CisJUlRBX1BVVChza2IsIFRDQV9JUFRfVEFSRywgcC0+dC0+dS51c2VyLnRhcmdldF9zaXplLCB0KTsKKwlSVEFfUFVUKHNrYiwgVENBX0lQVF9JTkRFWCwgNCwgJnAtPmluZGV4KTsKKwlSVEFfUFVUKHNrYiwgVENBX0lQVF9IT09LLCA0LCAmcC0+aG9vayk7CisJUlRBX1BVVChza2IsIFRDQV9JUFRfQ05ULCBzaXplb2Yoc3RydWN0IHRjX2NudCksICZjKTsKKwlSVEFfUFVUKHNrYiwgVENBX0lQVF9UQUJMRSwgSUZOQU1TSVosIHAtPnRuYW1lKTsKKwl0bS5pbnN0YWxsID0gamlmZmllc190b19jbG9ja190KGppZmZpZXMgLSBwLT50bS5pbnN0YWxsKTsKKwl0bS5sYXN0dXNlID0gamlmZmllc190b19jbG9ja190KGppZmZpZXMgLSBwLT50bS5sYXN0dXNlKTsKKwl0bS5leHBpcmVzID0gamlmZmllc190b19jbG9ja190KHAtPnRtLmV4cGlyZXMpOworCVJUQV9QVVQoc2tiLCBUQ0FfSVBUX1RNLCBzaXplb2YgKHRtKSwgJnRtKTsKKwlrZnJlZSh0KTsKKwlyZXR1cm4gc2tiLT5sZW47CisKKyAgICAgIHJ0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJa2ZyZWUodCk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgc3RydWN0IHRjX2FjdGlvbl9vcHMgYWN0X2lwdF9vcHMgPSB7CisJLmtpbmQJCT0JImlwdCIsCisJLnR5cGUJCT0JVENBX0FDVF9JUFQsCisJLmNhcGFiCQk9CVRDQV9DQVBfTk9ORSwKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCisJLmFjdAkJPQl0Y2ZfaXB0LAorCS5kdW1wCQk9CXRjZl9pcHRfZHVtcCwKKwkuY2xlYW51cAk9CXRjZl9pcHRfY2xlYW51cCwKKwkubG9va3VwCQk9CXRjZl9oYXNoX3NlYXJjaCwKKwkuaW5pdAkJPQl0Y2ZfaXB0X2luaXQsCisJLndhbGsJCT0JdGNmX2dlbmVyaWNfd2Fsa2VyCit9OworCitNT0RVTEVfQVVUSE9SKCJKYW1hbCBIYWRpIFNhbGltKDIwMDItNCkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSXB0YWJsZXMgdGFyZ2V0IGFjdGlvbnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBfX2luaXQKK2lwdF9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiB0Y2ZfcmVnaXN0ZXJfYWN0aW9uKCZhY3RfaXB0X29wcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAoraXB0X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdGNmX3VucmVnaXN0ZXJfYWN0aW9uKCZhY3RfaXB0X29wcyk7Cit9CisKK21vZHVsZV9pbml0KGlwdF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChpcHRfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9taXJyZWQuYyBiL25ldC9zY2hlZC9hY3RfbWlycmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZjY2NiZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY2hlZC9hY3RfbWlycmVkLmMKQEAgLTAsMCArMSwyNzUgQEAKKy8qCisgKiBuZXQvc2NoZWQvbWlycmVkLmMJcGFja2V0IG1pcnJvcmluZyBhbmQgcmVkaXJlY3QgYWN0aW9ucworICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUphbWFsIEhhZGkgU2FsaW0gKDIwMDItNCkKKyAqCisgKiBUT0RPOiBBZGQgaW5ncmVzcyBzdXBwb3J0IChhbmQgc29ja2V0IHJlZGlyZWN0IHN1cHBvcnQpCisgKgorICovCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjX2FjdC90Y19taXJyZWQuaD4KKyNpbmNsdWRlIDxuZXQvdGNfYWN0L3RjX21pcnJlZC5oPgorCisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKworCisvKiB1c2UgZ2VuZXJpYyBoYXNoIHRhYmxlICovCisjZGVmaW5lIE1ZX1RBQl9TSVpFICAgICA4CisjZGVmaW5lIE1ZX1RBQl9NQVNLICAgICAoTVlfVEFCX1NJWkUgLSAxKQorc3RhdGljIHUzMiBpZHhfZ2VuOworc3RhdGljIHN0cnVjdCB0Y2ZfbWlycmVkICp0Y2ZfbWlycmVkX2h0W01ZX1RBQl9TSVpFXTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKG1pcnJlZF9sb2NrKTsKKworLyogb3Zld3JyaWRlIHRoZSBkZWZhdWx0cyAqLworI2RlZmluZSB0Y2Zfc3QJCXRjZl9taXJyZWQKKyNkZWZpbmUgdGNfc3QJCXRjX21pcnJlZAorI2RlZmluZSB0Y2ZfdF9sb2NrCW1pcnJlZF9sb2NrCisjZGVmaW5lIHRjZl9odAkJdGNmX21pcnJlZF9odAorCisjZGVmaW5lIENPTkZJR19ORVRfQUNUX0lOSVQgMQorI2luY2x1ZGUgPG5ldC9wa3RfYWN0Lmg+CisKK3N0YXRpYyBpbmxpbmUgaW50Cit0Y2ZfbWlycmVkX3JlbGVhc2Uoc3RydWN0IHRjZl9taXJyZWQgKnAsIGludCBiaW5kKQoreworCWlmIChwKSB7CisJCWlmIChiaW5kKQorCQkJcC0+YmluZGNudC0tOworCQlwLT5yZWZjbnQtLTsKKwkJaWYoIXAtPmJpbmRjbnQgJiYgcC0+cmVmY250IDw9IDApIHsKKwkJCWRldl9wdXQocC0+ZGV2KTsKKwkJCXRjZl9oYXNoX2Rlc3Ryb3kocCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGNmX21pcnJlZF9pbml0KHN0cnVjdCBydGF0dHIgKnJ0YSwgc3RydWN0IHJ0YXR0ciAqZXN0LCBzdHJ1Y3QgdGNfYWN0aW9uICphLAorICAgICAgICAgICAgICAgIGludCBvdnIsIGludCBiaW5kKQoreworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9NSVJSRURfTUFYXTsKKwlzdHJ1Y3QgdGNfbWlycmVkICpwYXJtOworCXN0cnVjdCB0Y2ZfbWlycmVkICpwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCWludCByZXQgPSAwOworCWludCBva19wdXNoID0gMDsKKworCWlmIChydGEgPT0gTlVMTCB8fCBydGF0dHJfcGFyc2VfbmVzdGVkKHRiLCBUQ0FfTUlSUkVEX01BWCwgcnRhKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRiW1RDQV9NSVJSRURfUEFSTVMtMV0gPT0gTlVMTCB8fAorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfTUlSUkVEX1BBUk1TLTFdKSA8IHNpemVvZigqcGFybSkpCisJCXJldHVybiAtRUlOVkFMOworCXBhcm0gPSBSVEFfREFUQSh0YltUQ0FfTUlSUkVEX1BBUk1TLTFdKTsKKworCWlmIChwYXJtLT5pZmluZGV4KSB7CisJCWRldiA9IF9fZGV2X2dldF9ieV9pbmRleChwYXJtLT5pZmluZGV4KTsKKwkJaWYgKGRldiA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXN3aXRjaCAoZGV2LT50eXBlKSB7CisJCQljYXNlIEFSUEhSRF9UVU5ORUw6CisJCQljYXNlIEFSUEhSRF9UVU5ORUw2OgorCQkJY2FzZSBBUlBIUkRfU0lUOgorCQkJY2FzZSBBUlBIUkRfSVBHUkU6CisJCQljYXNlIEFSUEhSRF9WT0lEOgorCQkJY2FzZSBBUlBIUkRfTk9ORToKKwkJCQlva19wdXNoID0gMDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJb2tfcHVzaCA9IDE7CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwID0gdGNmX2hhc2hfY2hlY2socGFybS0+aW5kZXgsIGEsIG92ciwgYmluZCk7CisJaWYgKHAgPT0gTlVMTCkgeworCQlpZiAoIXBhcm0tPmlmaW5kZXgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcCA9IHRjZl9oYXNoX2NyZWF0ZShwYXJtLT5pbmRleCwgZXN0LCBhLCBzaXplb2YoKnApLCBvdnIsIGJpbmQpOworCQlpZiAocCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJldCA9IEFDVF9QX0NSRUFURUQ7CisJfSBlbHNlIHsKKwkJaWYgKCFvdnIpIHsKKwkJCXRjZl9taXJyZWRfcmVsZWFzZShwLCBiaW5kKTsKKwkJCXJldHVybiAtRUVYSVNUOworCQl9CisJfQorCisJc3Bpbl9sb2NrX2JoKCZwLT5sb2NrKTsKKwlwLT5hY3Rpb24gPSBwYXJtLT5hY3Rpb247CisJcC0+ZWFjdGlvbiA9IHBhcm0tPmVhY3Rpb247CisJaWYgKHBhcm0tPmlmaW5kZXgpIHsKKwkJcC0+aWZpbmRleCA9IHBhcm0tPmlmaW5kZXg7CisJCWlmIChyZXQgIT0gQUNUX1BfQ1JFQVRFRCkKKwkJCWRldl9wdXQocC0+ZGV2KTsKKwkJcC0+ZGV2ID0gZGV2OworCQlkZXZfaG9sZChkZXYpOworCQlwLT5va19wdXNoID0gb2tfcHVzaDsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnAtPmxvY2spOworCWlmIChyZXQgPT0gQUNUX1BfQ1JFQVRFRCkKKwkJdGNmX2hhc2hfaW5zZXJ0KHApOworCisJRFBSSU5USygidGNmX21pcnJlZF9pbml0IGluZGV4ICVkIGFjdGlvbiAlZCBlYWN0aW9uICVkIGRldmljZSAlcyAiCisJICAgICAgICAiaWZpbmRleCAlZFxuIiwgcGFybS0+aW5kZXgsIHBhcm0tPmFjdGlvbiwgcGFybS0+ZWFjdGlvbiwKKwkgICAgICAgIGRldi0+bmFtZSwgcGFybS0+aWZpbmRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAordGNmX21pcnJlZF9jbGVhbnVwKHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kKQoreworCXN0cnVjdCB0Y2ZfbWlycmVkICpwID0gUFJJVihhLCBtaXJyZWQpOworCisJaWYgKHAgIT0gTlVMTCkKKwkJcmV0dXJuIHRjZl9taXJyZWRfcmVsZWFzZShwLCBiaW5kKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGNmX21pcnJlZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLCBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQoreworCXN0cnVjdCB0Y2ZfbWlycmVkICpwID0gUFJJVihhLCBtaXJyZWQpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBOVUxMOworCXUzMiBhdCA9IEdfVENfQVQoc2tiLT50Y192ZXJkKTsKKworCXNwaW5fbG9jaygmcC0+bG9jayk7CisKKwlkZXYgPSBwLT5kZXY7CisJcC0+dG0ubGFzdHVzZSA9IGppZmZpZXM7CisKKwlpZiAoIShkZXYtPmZsYWdzJklGRl9VUCkgKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoIm1pcnJlZCB0byBIb3VzdG9uOiBkZXZpY2UgJXMgaXMgZ29uZSFcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKK2JhZF9taXJyZWQ6CisJCWlmIChza2IyICE9IE5VTEwpCisJCQlrZnJlZV9za2Ioc2tiMik7CisJCXAtPnFzdGF0cy5vdmVybGltaXRzKys7CisJCXAtPmJzdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKKwkJcC0+YnN0YXRzLnBhY2tldHMrKzsKKwkJc3Bpbl91bmxvY2soJnAtPmxvY2spOworCQkvKiBzaG91bGQgd2UgYmUgYXNraW5nIGZvciBwYWNrZXQgdG8gYmUgZHJvcHBlZD8KKwkJICogbWF5IG1ha2Ugc2Vuc2UgZm9yIHJlZGlyZWN0IGNhc2Ugb25seQorCQkqLworCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisJfQorCisJc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCWlmIChza2IyID09IE5VTEwpCisJCWdvdG8gYmFkX21pcnJlZDsKKwlpZiAocC0+ZWFjdGlvbiAhPSBUQ0FfRUdSRVNTX01JUlJPUiAmJiBwLT5lYWN0aW9uICE9IFRDQV9FR1JFU1NfUkVESVIpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50aygidGNmX21pcnJlZCB1bmtub3duIGFjdGlvbiAlZFxuIiwgcC0+ZWFjdGlvbik7CisJCWdvdG8gYmFkX21pcnJlZDsKKwl9CisKKwlwLT5ic3RhdHMuYnl0ZXMgKz0gc2tiMi0+bGVuOworCXAtPmJzdGF0cy5wYWNrZXRzKys7CisJaWYgKCEoYXQgJiBBVF9FR1JFU1MpKQorCQlpZiAocC0+b2tfcHVzaCkKKwkJCXNrYl9wdXNoKHNrYjIsIHNrYjItPmRldi0+aGFyZF9oZWFkZXJfbGVuKTsKKworCS8qIG1pcnJvciBpcyBhbHdheXMgc3dhbGxvd2VkICovCisJaWYgKHAtPmVhY3Rpb24gIT0gVENBX0VHUkVTU19NSVJST1IpCisJCXNrYjItPnRjX3ZlcmQgPSBTRVRfVENfRlJPTShza2IyLT50Y192ZXJkLCBhdCk7CisKKwlza2IyLT5kZXYgPSBkZXY7CisJc2tiMi0+aW5wdXRfZGV2ID0gc2tiLT5kZXY7CisJZGV2X3F1ZXVlX3htaXQoc2tiMik7CisJc3Bpbl91bmxvY2soJnAtPmxvY2spOworCXJldHVybiBwLT5hY3Rpb247Cit9CisKK3N0YXRpYyBpbnQKK3RjZl9taXJyZWRfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQgYmluZCwgaW50IHJlZikKK3sKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXN0cnVjdCB0Y19taXJyZWQgb3B0OworCXN0cnVjdCB0Y2ZfbWlycmVkICpwID0gUFJJVihhLCBtaXJyZWQpOworCXN0cnVjdCB0Y2ZfdCB0OworCisJb3B0LmluZGV4ID0gcC0+aW5kZXg7CisJb3B0LmFjdGlvbiA9IHAtPmFjdGlvbjsKKwlvcHQucmVmY250ID0gcC0+cmVmY250IC0gcmVmOworCW9wdC5iaW5kY250ID0gcC0+YmluZGNudCAtIGJpbmQ7CisJb3B0LmVhY3Rpb24gPSBwLT5lYWN0aW9uOworCW9wdC5pZmluZGV4ID0gcC0+aWZpbmRleDsKKwlEUFJJTlRLKCJ0Y2ZfbWlycmVkX2R1bXAgaW5kZXggJWQgYWN0aW9uICVkIGVhY3Rpb24gJWQgaWZpbmRleCAlZFxuIiwKKwkgICAgICAgICBwLT5pbmRleCwgcC0+YWN0aW9uLCBwLT5lYWN0aW9uLCBwLT5pZmluZGV4KTsKKwlSVEFfUFVUKHNrYiwgVENBX01JUlJFRF9QQVJNUywgc2l6ZW9mKG9wdCksICZvcHQpOworCXQuaW5zdGFsbCA9IGppZmZpZXNfdG9fY2xvY2tfdChqaWZmaWVzIC0gcC0+dG0uaW5zdGFsbCk7CisJdC5sYXN0dXNlID0gamlmZmllc190b19jbG9ja190KGppZmZpZXMgLSBwLT50bS5sYXN0dXNlKTsKKwl0LmV4cGlyZXMgPSBqaWZmaWVzX3RvX2Nsb2NrX3QocC0+dG0uZXhwaXJlcyk7CisJUlRBX1BVVChza2IsIFRDQV9NSVJSRURfVE0sIHNpemVvZih0KSwgJnQpOworCXJldHVybiBza2ItPmxlbjsKKworICAgICAgcnRhdHRyX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGNfYWN0aW9uX29wcyBhY3RfbWlycmVkX29wcyA9IHsKKwkua2luZAkJPQkibWlycmVkIiwKKwkudHlwZQkJPQlUQ0FfQUNUX01JUlJFRCwKKwkuY2FwYWIJCT0JVENBX0NBUF9OT05FLAorCS5vd25lcgkJPQlUSElTX01PRFVMRSwKKwkuYWN0CQk9CXRjZl9taXJyZWQsCisJLmR1bXAJCT0JdGNmX21pcnJlZF9kdW1wLAorCS5jbGVhbnVwCT0JdGNmX21pcnJlZF9jbGVhbnVwLAorCS5sb29rdXAJCT0JdGNmX2hhc2hfc2VhcmNoLAorCS5pbml0CQk9CXRjZl9taXJyZWRfaW5pdCwKKwkud2FsawkJPQl0Y2ZfZ2VuZXJpY193YWxrZXIKK307CisKK01PRFVMRV9BVVRIT1IoIkphbWFsIEhhZGkgU2FsaW0oMjAwMikiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIE1pcnJvci9yZWRpcmVjdCBhY3Rpb25zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgX19pbml0CittaXJyZWRfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlwcmludGsoIk1pcnJvci9yZWRpcmVjdCBhY3Rpb24gb25cbiIpOworCXJldHVybiB0Y2ZfcmVnaXN0ZXJfYWN0aW9uKCZhY3RfbWlycmVkX29wcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorbWlycmVkX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdGNmX3VucmVnaXN0ZXJfYWN0aW9uKCZhY3RfbWlycmVkX29wcyk7Cit9CisKK21vZHVsZV9pbml0KG1pcnJlZF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChtaXJyZWRfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9wZWRpdC5jIGIvbmV0L3NjaGVkL2FjdF9wZWRpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NDJhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2NoZWQvYWN0X3BlZGl0LmMKQEAgLTAsMCArMSwyODkgQEAKKy8qCisgKiBuZXQvc2NoZWQvcGVkaXQuYwlHZW5lcmljIHBhY2tldCBlZGl0b3IKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglKYW1hbCBIYWRpIFNhbGltICgyMDAyLTQpCisgKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGNfYWN0L3RjX3BlZGl0Lmg+CisjaW5jbHVkZSA8bmV0L3RjX2FjdC90Y19wZWRpdC5oPgorCisKKyNkZWZpbmUgUEVESVRfREVCIDEKKworLyogdXNlIGdlbmVyaWMgaGFzaCB0YWJsZSAqLworI2RlZmluZSBNWV9UQUJfU0laRSAgICAgMTYKKyNkZWZpbmUgTVlfVEFCX01BU0sgICAgIDE1CitzdGF0aWMgdTMyIGlkeF9nZW47CitzdGF0aWMgc3RydWN0IHRjZl9wZWRpdCAqdGNmX3BlZGl0X2h0W01ZX1RBQl9TSVpFXTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKHBlZGl0X2xvY2spOworCisjZGVmaW5lIHRjZl9zdAkJdGNmX3BlZGl0CisjZGVmaW5lIHRjX3N0CQl0Y19wZWRpdAorI2RlZmluZSB0Y2ZfdF9sb2NrCXBlZGl0X2xvY2sKKyNkZWZpbmUgdGNmX2h0CQl0Y2ZfcGVkaXRfaHQKKworI2RlZmluZSBDT05GSUdfTkVUX0FDVF9JTklUIDEKKyNpbmNsdWRlIDxuZXQvcGt0X2FjdC5oPgorCitzdGF0aWMgaW50Cit0Y2ZfcGVkaXRfaW5pdChzdHJ1Y3QgcnRhdHRyICpydGEsIHN0cnVjdCBydGF0dHIgKmVzdCwgc3RydWN0IHRjX2FjdGlvbiAqYSwKKyAgICAgICAgICAgICAgIGludCBvdnIsIGludCBiaW5kKQoreworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9QRURJVF9NQVhdOworCXN0cnVjdCB0Y19wZWRpdCAqcGFybTsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgdGNmX3BlZGl0ICpwOworCXN0cnVjdCB0Y19wZWRpdF9rZXkgKmtleXMgPSBOVUxMOworCWludCBrc2l6ZTsKKworCWlmIChydGEgPT0gTlVMTCB8fCBydGF0dHJfcGFyc2VfbmVzdGVkKHRiLCBUQ0FfUEVESVRfTUFYLCBydGEpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGJbVENBX1BFRElUX1BBUk1TIC0gMV0gPT0gTlVMTCB8fAorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfUEVESVRfUEFSTVMtMV0pIDwgc2l6ZW9mKCpwYXJtKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcGFybSA9IFJUQV9EQVRBKHRiW1RDQV9QRURJVF9QQVJNUy0xXSk7CisJa3NpemUgPSBwYXJtLT5ua2V5cyAqIHNpemVvZihzdHJ1Y3QgdGNfcGVkaXRfa2V5KTsKKwlpZiAoUlRBX1BBWUxPQUQodGJbVENBX1BFRElUX1BBUk1TLTFdKSA8IHNpemVvZigqcGFybSkgKyBrc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwID0gdGNmX2hhc2hfY2hlY2socGFybS0+aW5kZXgsIGEsIG92ciwgYmluZCk7CisJaWYgKHAgPT0gTlVMTCkgeworCQlpZiAoIXBhcm0tPm5rZXlzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXAgPSB0Y2ZfaGFzaF9jcmVhdGUocGFybS0+aW5kZXgsIGVzdCwgYSwgc2l6ZW9mKCpwKSwgb3ZyLCBiaW5kKTsKKwkJaWYgKHAgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlrZXlzID0ga21hbGxvYyhrc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmIChrZXlzID09IE5VTEwpIHsKKwkJCWtmcmVlKHApOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJcmV0ID0gQUNUX1BfQ1JFQVRFRDsKKwl9IGVsc2UgeworCQlpZiAoIW92cikgeworCQkJdGNmX2hhc2hfcmVsZWFzZShwLCBiaW5kKTsKKwkJCXJldHVybiAtRUVYSVNUOworCQl9CisJCWlmIChwLT5ua2V5cyAmJiBwLT5ua2V5cyAhPSBwYXJtLT5ua2V5cykgeworCQkJa2V5cyA9IGttYWxsb2Moa3NpemUsIEdGUF9LRVJORUwpOworCQkJaWYgKGtleXMgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCXNwaW5fbG9ja19iaCgmcC0+bG9jayk7CisJcC0+ZmxhZ3MgPSBwYXJtLT5mbGFnczsKKwlwLT5hY3Rpb24gPSBwYXJtLT5hY3Rpb247CisJaWYgKGtleXMpIHsKKwkJa2ZyZWUocC0+a2V5cyk7CisJCXAtPmtleXMgPSBrZXlzOworCQlwLT5ua2V5cyA9IHBhcm0tPm5rZXlzOworCX0KKwltZW1jcHkocC0+a2V5cywgcGFybS0+a2V5cywga3NpemUpOworCXNwaW5fdW5sb2NrX2JoKCZwLT5sb2NrKTsKKwlpZiAocmV0ID09IEFDVF9QX0NSRUFURUQpCisJCXRjZl9oYXNoX2luc2VydChwKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50Cit0Y2ZfcGVkaXRfY2xlYW51cChzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQgYmluZCkKK3sKKwlzdHJ1Y3QgdGNmX3BlZGl0ICpwID0gUFJJVihhLCBwZWRpdCk7CisKKwlpZiAocCAhPSBOVUxMKSB7CisJCXN0cnVjdCB0Y19wZWRpdF9rZXkgKmtleXMgPSBwLT5rZXlzOworCQlpZiAodGNmX2hhc2hfcmVsZWFzZShwLCBiaW5kKSkgeworCQkJa2ZyZWUoa2V5cyk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGNmX3BlZGl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCit7CisJc3RydWN0IHRjZl9wZWRpdCAqcCA9IFBSSVYoYSwgcGVkaXQpOworCWludCBpLCBtdW5nZWQgPSAwOworCXU4ICpwcHRyOworCisJaWYgKCEoc2tiLT50Y192ZXJkICYgVENfT0syTVVOR0UpKSB7CisJCS8qIHNob3VsZCB3ZSBzZXQgc2tiLT5jbG9uZWQ/ICovCisJCWlmIChwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgMCwgR0ZQX0FUT01JQykpIHsKKwkJCXJldHVybiBwLT5hY3Rpb247CisJCX0KKwl9CisKKwlwcHRyID0gc2tiLT5uaC5yYXc7CisKKwlzcGluX2xvY2soJnAtPmxvY2spOworCisJcC0+dG0ubGFzdHVzZSA9IGppZmZpZXM7CisKKwlpZiAocC0+bmtleXMgPiAwKSB7CisJCXN0cnVjdCB0Y19wZWRpdF9rZXkgKnRrZXkgPSBwLT5rZXlzOworCisJCWZvciAoaSA9IHAtPm5rZXlzOyBpID4gMDsgaS0tLCB0a2V5KyspIHsKKwkJCXUzMiAqcHRyOworCQkJaW50IG9mZnNldCA9IHRrZXktPm9mZjsKKworCQkJaWYgKHRrZXktPm9mZm1hc2spIHsKKwkJCQlpZiAoc2tiLT5sZW4gPiB0a2V5LT5hdCkgeworCQkJCQkgY2hhciAqaiA9IHBwdHIgKyB0a2V5LT5hdDsKKwkJCQkJIG9mZnNldCArPSAoKCpqICYgdGtleS0+b2ZmbWFzaykgPj4gCisJCQkJCSAgICAgICAgICAgdGtleS0+c2hpZnQpOworCQkJCX0gZWxzZSB7CisJCQkJCWdvdG8gYmFkOworCQkJCX0KKwkJCX0KKworCQkJaWYgKG9mZnNldCAlIDQpIHsKKwkJCQlwcmludGsoIm9mZnNldCBtdXN0IGJlIG9uIDMyIGJpdCBib3VuZGFyaWVzXG4iKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChza2ItPmxlbiA8IDAgfHwgKG9mZnNldCA+IDAgJiYgb2Zmc2V0ID4gc2tiLT5sZW4pKSB7CisJCQkJcHJpbnRrKCJvZmZzZXQgJWQgY2FudCBleGNlZWQgcGt0IGxlbmd0aCAlZFxuIiwKKwkJCQkgICAgICAgb2Zmc2V0LCBza2ItPmxlbik7CisJCQkJZ290byBiYWQ7CisJCQl9CisKKwkJCXB0ciA9ICh1MzIgKikocHB0citvZmZzZXQpOworCQkJLyoganVzdCBkbyBpdCwgYmFieSAqLworCQkJKnB0ciA9ICgoKnB0ciAmIHRrZXktPm1hc2spIF4gdGtleS0+dmFsKTsKKwkJCW11bmdlZCsrOworCQl9CisJCQorCQlpZiAobXVuZ2VkKQorCQkJc2tiLT50Y192ZXJkID0gU0VUX1RDX01VTkdFRChza2ItPnRjX3ZlcmQpOworCQlnb3RvIGRvbmU7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJwZWRpdCBCVUc6IGluZGV4ICVkXG4iLHAtPmluZGV4KTsKKwl9CisKK2JhZDoKKwlwLT5xc3RhdHMub3ZlcmxpbWl0cysrOworZG9uZToKKwlwLT5ic3RhdHMuYnl0ZXMgKz0gc2tiLT5sZW47CisJcC0+YnN0YXRzLnBhY2tldHMrKzsKKwlzcGluX3VubG9jaygmcC0+bG9jayk7CisJcmV0dXJuIHAtPmFjdGlvbjsKK30KKworc3RhdGljIGludAordGNmX3BlZGl0X2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjX2FjdGlvbiAqYSxpbnQgYmluZCwgaW50IHJlZikKK3sKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXN0cnVjdCB0Y19wZWRpdCAqb3B0OworCXN0cnVjdCB0Y2ZfcGVkaXQgKnAgPSBQUklWKGEsIHBlZGl0KTsKKwlzdHJ1Y3QgdGNmX3QgdDsKKwlpbnQgczsgCisJCQorCXMgPSBzaXplb2YoKm9wdCkgKyBwLT5ua2V5cyAqIHNpemVvZihzdHJ1Y3QgdGNfcGVkaXRfa2V5KTsKKworCS8qIG5ldGxpbmsgc3BpbmxvY2tzIGhlbGQgYWJvdmUgdXMgLSBtdXN0IHVzZSBBVE9NSUMgKi8KKwlvcHQgPSBrbWFsbG9jKHMsIEdGUF9BVE9NSUMpOworCWlmIChvcHQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9CVUZTOworCW1lbXNldChvcHQsIDAsIHMpOworCisJbWVtY3B5KG9wdC0+a2V5cywgcC0+a2V5cywgcC0+bmtleXMgKiBzaXplb2Yoc3RydWN0IHRjX3BlZGl0X2tleSkpOworCW9wdC0+aW5kZXggPSBwLT5pbmRleDsKKwlvcHQtPm5rZXlzID0gcC0+bmtleXM7CisJb3B0LT5mbGFncyA9IHAtPmZsYWdzOworCW9wdC0+YWN0aW9uID0gcC0+YWN0aW9uOworCW9wdC0+cmVmY250ID0gcC0+cmVmY250IC0gcmVmOworCW9wdC0+YmluZGNudCA9IHAtPmJpbmRjbnQgLSBiaW5kOworCisKKyNpZmRlZiBQRURJVF9ERUIKKwl7ICAgICAgICAgICAgICAgIAorCQkvKiBEZWJ1ZyAtIGdldCByaWQgb2YgbGF0ZXIgKi8KKwkJaW50IGk7CisJCXN0cnVjdCB0Y19wZWRpdF9rZXkgKmtleSA9IG9wdC0+a2V5czsKKworCQlmb3IgKGk9MDsgaTxvcHQtPm5rZXlzOyBpKyssIGtleSsrKSB7CisJCQlwcmludGsoICJcbiBrZXkgIyVkIixpKTsKKwkJCXByaW50ayggIiAgYXQgJWQ6IHZhbCAlMDh4IG1hc2sgJTA4eCIsCisJCQkodW5zaWduZWQgaW50KWtleS0+b2ZmLAorCQkJKHVuc2lnbmVkIGludClrZXktPnZhbCwKKwkJCSh1bnNpZ25lZCBpbnQpa2V5LT5tYXNrKTsKKwkJfQorCX0KKyNlbmRpZgorCisJUlRBX1BVVChza2IsIFRDQV9QRURJVF9QQVJNUywgcywgb3B0KTsKKwl0Lmluc3RhbGwgPSBqaWZmaWVzX3RvX2Nsb2NrX3QoamlmZmllcyAtIHAtPnRtLmluc3RhbGwpOworCXQubGFzdHVzZSA9IGppZmZpZXNfdG9fY2xvY2tfdChqaWZmaWVzIC0gcC0+dG0ubGFzdHVzZSk7CisJdC5leHBpcmVzID0gamlmZmllc190b19jbG9ja190KHAtPnRtLmV4cGlyZXMpOworCVJUQV9QVVQoc2tiLCBUQ0FfUEVESVRfVE0sIHNpemVvZih0KSwgJnQpOworCWtmcmVlKG9wdCk7CisJcmV0dXJuIHNrYi0+bGVuOworCitydGF0dHJfZmFpbHVyZToKKwlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCWtmcmVlKG9wdCk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMKK3N0cnVjdCB0Y19hY3Rpb25fb3BzIGFjdF9wZWRpdF9vcHMgPSB7CisJLmtpbmQJCT0JInBlZGl0IiwKKwkudHlwZQkJPQlUQ0FfQUNUX1BFRElULAorCS5jYXBhYgkJPQlUQ0FfQ0FQX05PTkUsCisJLm93bmVyCQk9CVRISVNfTU9EVUxFLAorCS5hY3QJCT0JdGNmX3BlZGl0LAorCS5kdW1wCQk9CXRjZl9wZWRpdF9kdW1wLAorCS5jbGVhbnVwCT0JdGNmX3BlZGl0X2NsZWFudXAsCisJLmxvb2t1cAkJPQl0Y2ZfaGFzaF9zZWFyY2gsCisJLmluaXQJCT0JdGNmX3BlZGl0X2luaXQsCisJLndhbGsJCT0JdGNmX2dlbmVyaWNfd2Fsa2VyCit9OworCitNT0RVTEVfQVVUSE9SKCJKYW1hbCBIYWRpIFNhbGltKDIwMDItNCkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiR2VuZXJpYyBQYWNrZXQgRWRpdG9yIGFjdGlvbnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBfX2luaXQKK3BlZGl0X2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHRjZl9yZWdpc3Rlcl9hY3Rpb24oJmFjdF9wZWRpdF9vcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3BlZGl0X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdGNmX3VucmVnaXN0ZXJfYWN0aW9uKCZhY3RfcGVkaXRfb3BzKTsKK30KKworbW9kdWxlX2luaXQocGVkaXRfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQocGVkaXRfY2xlYW51cF9tb2R1bGUpOworCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X3BvbGljZS5jIGIvbmV0L3NjaGVkL2FjdF9wb2xpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTg3N2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjaGVkL2FjdF9wb2xpY2UuYwpAQCAtMCwwICsxLDYwNCBAQAorLyoKKyAqIG5ldC9zY2hlZC9wb2xpY2UuYwlJbnB1dCBwb2xpY2UgZmlsdGVyLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqIAkJSiBIYWRpIFNhbGltIChhY3Rpb24gY2hhbmdlcykKKyAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWN0X2FwaS5oPgorCisjZGVmaW5lIEwyVChwLEwpICAgKChwKS0+Ul90YWItPmRhdGFbKEwpPj4ocCktPlJfdGFiLT5yYXRlLmNlbGxfbG9nXSkKKyNkZWZpbmUgTDJUX1AocCxMKSAoKHApLT5QX3RhYi0+ZGF0YVsoTCk+PihwKS0+UF90YWItPnJhdGUuY2VsbF9sb2ddKQorI2RlZmluZSBQUklWKGEpICgoc3RydWN0IHRjZl9wb2xpY2UgKikgKGEpLT5wcml2KQorCisvKiB1c2UgZ2VuZXJpYyBoYXNoIHRhYmxlICovCisjZGVmaW5lIE1ZX1RBQl9TSVpFICAgICAxNgorI2RlZmluZSBNWV9UQUJfTUFTSyAgICAgMTUKK3N0YXRpYyB1MzIgaWR4X2dlbjsKK3N0YXRpYyBzdHJ1Y3QgdGNmX3BvbGljZSAqdGNmX3BvbGljZV9odFtNWV9UQUJfU0laRV07CisvKiBQb2xpY2VyIGhhc2ggdGFibGUgbG9jayAqLworc3RhdGljIERFRklORV9SV0xPQ0socG9saWNlX2xvY2spOworCisvKiBFYWNoIHBvbGljZXIgaXMgc2VyaWFsaXplZCBieSBpdHMgaW5kaXZpZHVhbCBzcGlubG9jayAqLworCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCB0Y2ZfcG9saWNlX2hhc2godTMyIGluZGV4KQoreworCXJldHVybiBpbmRleCYweEY7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCB0Y2ZfcG9saWNlICogdGNmX3BvbGljZV9sb29rdXAodTMyIGluZGV4KQoreworCXN0cnVjdCB0Y2ZfcG9saWNlICpwOworCisJcmVhZF9sb2NrKCZwb2xpY2VfbG9jayk7CisJZm9yIChwID0gdGNmX3BvbGljZV9odFt0Y2ZfcG9saWNlX2hhc2goaW5kZXgpXTsgcDsgcCA9IHAtPm5leHQpIHsKKwkJaWYgKHAtPmluZGV4ID09IGluZGV4KQorCQkJYnJlYWs7CisJfQorCXJlYWRfdW5sb2NrKCZwb2xpY2VfbG9jayk7CisJcmV0dXJuIHA7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKK3N0YXRpYyBpbnQgdGNmX2dlbmVyaWNfd2Fsa2VyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCBzdHJ1Y3QgdGNfYWN0aW9uICphKQoreworCXN0cnVjdCB0Y2ZfcG9saWNlICpwOworCWludCBlcnIgPSAwLCBpbmRleCA9IC0xLCBpID0gMCwgc19pID0gMCwgbl9pID0gMDsKKwlzdHJ1Y3QgcnRhdHRyICpyOworCisJcmVhZF9sb2NrKCZwb2xpY2VfbG9jayk7CisKKwlzX2kgPSBjYi0+YXJnc1swXTsKKworCWZvciAoaSA9IDA7IGkgPCBNWV9UQUJfU0laRTsgaSsrKSB7CisJCXAgPSB0Y2ZfcG9saWNlX2h0W3RjZl9wb2xpY2VfaGFzaChpKV07CisKKwkJZm9yICg7IHA7IHAgPSBwLT5uZXh0KSB7CisJCQlpbmRleCsrOworCQkJaWYgKGluZGV4IDwgc19pKQorCQkJCWNvbnRpbnVlOworCQkJYS0+cHJpdiA9IHA7CisJCQlhLT5vcmRlciA9IGluZGV4OworCQkJciA9IChzdHJ1Y3QgcnRhdHRyKikgc2tiLT50YWlsOworCQkJUlRBX1BVVChza2IsIGEtPm9yZGVyLCAwLCBOVUxMKTsKKwkJCWlmICh0eXBlID09IFJUTV9ERUxBQ1RJT04pCisJCQkJZXJyID0gdGNmX2FjdGlvbl9kdW1wXzEoc2tiLCBhLCAwLCAxKTsKKwkJCWVsc2UKKwkJCQllcnIgPSB0Y2ZfYWN0aW9uX2R1bXBfMShza2IsIGEsIDAsIDApOworCQkJaWYgKGVyciA8IDApIHsKKwkJCQlpbmRleC0tOworCQkJCXNrYl90cmltKHNrYiwgKHU4KilyIC0gc2tiLT5kYXRhKTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQlyLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4KilyOworCQkJbl9pKys7CisJCX0KKwl9Citkb25lOgorCXJlYWRfdW5sb2NrKCZwb2xpY2VfbG9jayk7CisJaWYgKG5faSkKKwkJY2ItPmFyZ3NbMF0gKz0gbl9pOworCXJldHVybiBuX2k7CisKK3J0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgKHU4KilyIC0gc2tiLT5kYXRhKTsKKwlnb3RvIGRvbmU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit0Y2ZfaGFzaF9zZWFyY2goc3RydWN0IHRjX2FjdGlvbiAqYSwgdTMyIGluZGV4KQoreworCXN0cnVjdCB0Y2ZfcG9saWNlICpwID0gdGNmX3BvbGljZV9sb29rdXAoaW5kZXgpOworCisJaWYgKHAgIT0gTlVMTCkgeworCQlhLT5wcml2ID0gcDsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdTMyIHRjZl9wb2xpY2VfbmV3X2luZGV4KHZvaWQpCit7CisJZG8geworCQlpZiAoKytpZHhfZ2VuID09IDApCisJCQlpZHhfZ2VuID0gMTsKKwl9IHdoaWxlICh0Y2ZfcG9saWNlX2xvb2t1cChpZHhfZ2VuKSk7CisKKwlyZXR1cm4gaWR4X2dlbjsKK30KKwordm9pZCB0Y2ZfcG9saWNlX2Rlc3Ryb3koc3RydWN0IHRjZl9wb2xpY2UgKnApCit7CisJdW5zaWduZWQgaCA9IHRjZl9wb2xpY2VfaGFzaChwLT5pbmRleCk7CisJc3RydWN0IHRjZl9wb2xpY2UgKipwMXA7CisJCisJZm9yIChwMXAgPSAmdGNmX3BvbGljZV9odFtoXTsgKnAxcDsgcDFwID0gJigqcDFwKS0+bmV4dCkgeworCQlpZiAoKnAxcCA9PSBwKSB7CisJCQl3cml0ZV9sb2NrX2JoKCZwb2xpY2VfbG9jayk7CisJCQkqcDFwID0gcC0+bmV4dDsKKwkJCXdyaXRlX3VubG9ja19iaCgmcG9saWNlX2xvY2spOworI2lmZGVmIENPTkZJR19ORVRfRVNUSU1BVE9SCisJCQlnZW5fa2lsbF9lc3RpbWF0b3IoJnAtPmJzdGF0cywgJnAtPnJhdGVfZXN0KTsKKyNlbmRpZgorCQkJaWYgKHAtPlJfdGFiKQorCQkJCXFkaXNjX3B1dF9ydGFiKHAtPlJfdGFiKTsKKwkJCWlmIChwLT5QX3RhYikKKwkJCQlxZGlzY19wdXRfcnRhYihwLT5QX3RhYik7CisJCQlrZnJlZShwKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlCVUdfVFJBUCgwKTsKK30KKworI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAorc3RhdGljIGludCB0Y2ZfYWN0X3BvbGljZV9sb2NhdGUoc3RydWN0IHJ0YXR0ciAqcnRhLCBzdHJ1Y3QgcnRhdHRyICplc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQgb3ZyLCBpbnQgYmluZCkKK3sKKwl1bnNpZ25lZCBoOworCWludCByZXQgPSAwLCBlcnI7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX1BPTElDRV9NQVhdOworCXN0cnVjdCB0Y19wb2xpY2UgKnBhcm07CisJc3RydWN0IHRjZl9wb2xpY2UgKnA7CisJc3RydWN0IHFkaXNjX3JhdGVfdGFibGUgKlJfdGFiID0gTlVMTCwgKlBfdGFiID0gTlVMTDsKKworCWlmIChydGEgPT0gTlVMTCB8fCBydGF0dHJfcGFyc2VfbmVzdGVkKHRiLCBUQ0FfUE9MSUNFX01BWCwgcnRhKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRiW1RDQV9QT0xJQ0VfVEJGLTFdID09IE5VTEwgfHwKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX1BPTElDRV9UQkYtMV0pICE9IHNpemVvZigqcGFybSkpCisJCXJldHVybiAtRUlOVkFMOworCXBhcm0gPSBSVEFfREFUQSh0YltUQ0FfUE9MSUNFX1RCRi0xXSk7CisKKwlpZiAodGJbVENBX1BPTElDRV9SRVNVTFQtMV0gIT0gTlVMTCAmJgorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfUE9MSUNFX1JFU1VMVC0xXSkgIT0gc2l6ZW9mKHUzMikpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh0YltUQ0FfUE9MSUNFX1JFU1VMVC0xXSAhPSBOVUxMICYmCisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9QT0xJQ0VfUkVTVUxULTFdKSAhPSBzaXplb2YodTMyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocGFybS0+aW5kZXggJiYgKHAgPSB0Y2ZfcG9saWNlX2xvb2t1cChwYXJtLT5pbmRleCkpICE9IE5VTEwpIHsKKwkJYS0+cHJpdiA9IHA7CisJCWlmIChiaW5kKSB7CisJCQlwLT5iaW5kY250ICs9IDE7CisJCQlwLT5yZWZjbnQgKz0gMTsKKwkJfQorCQlpZiAob3ZyKQorCQkJZ290byBvdmVycmlkZTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwID0ga21hbGxvYyhzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CisKKwlyZXQgPSBBQ1RfUF9DUkVBVEVEOworCXAtPnJlZmNudCA9IDE7CisJc3Bpbl9sb2NrX2luaXQoJnAtPmxvY2spOworCXAtPnN0YXRzX2xvY2sgPSAmcC0+bG9jazsKKwlpZiAoYmluZCkKKwkJcC0+YmluZGNudCA9IDE7CitvdmVycmlkZToKKwlpZiAocGFybS0+cmF0ZS5yYXRlKSB7CisJCWVyciA9IC1FTk9NRU07CisJCVJfdGFiID0gcWRpc2NfZ2V0X3J0YWIoJnBhcm0tPnJhdGUsIHRiW1RDQV9QT0xJQ0VfUkFURS0xXSk7CisJCWlmIChSX3RhYiA9PSBOVUxMKQorCQkJZ290byBmYWlsdXJlOworCQlpZiAocGFybS0+cGVha3JhdGUucmF0ZSkgeworCQkJUF90YWIgPSBxZGlzY19nZXRfcnRhYigmcGFybS0+cGVha3JhdGUsCisJCQkJCSAgICAgICB0YltUQ0FfUE9MSUNFX1BFQUtSQVRFLTFdKTsKKwkJCWlmIChwLT5QX3RhYiA9PSBOVUxMKSB7CisJCQkJcWRpc2NfcHV0X3J0YWIoUl90YWIpOworCQkJCWdvdG8gZmFpbHVyZTsKKwkJCX0KKwkJfQorCX0KKwkvKiBObyBmYWlsdXJlIGFsbG93ZWQgYWZ0ZXIgdGhpcyBwb2ludCAqLworCXNwaW5fbG9ja19iaCgmcC0+bG9jayk7CisJaWYgKFJfdGFiICE9IE5VTEwpIHsKKwkJcWRpc2NfcHV0X3J0YWIocC0+Ul90YWIpOworCQlwLT5SX3RhYiA9IFJfdGFiOworCX0KKwlpZiAoUF90YWIgIT0gTlVMTCkgeworCQlxZGlzY19wdXRfcnRhYihwLT5QX3RhYik7CisJCXAtPlBfdGFiID0gUF90YWI7CisJfQorCisJaWYgKHRiW1RDQV9QT0xJQ0VfUkVTVUxULTFdKQorCQlwLT5yZXN1bHQgPSAqKHUzMiopUlRBX0RBVEEodGJbVENBX1BPTElDRV9SRVNVTFQtMV0pOworCXAtPnRva3MgPSBwLT5idXJzdCA9IHBhcm0tPmJ1cnN0OworCXAtPm10dSA9IHBhcm0tPm10dTsKKwlpZiAocC0+bXR1ID09IDApIHsKKwkJcC0+bXR1ID0gfjA7CisJCWlmIChwLT5SX3RhYikKKwkJCXAtPm10dSA9IDI1NTw8cC0+Ul90YWItPnJhdGUuY2VsbF9sb2c7CisJfQorCWlmIChwLT5QX3RhYikKKwkJcC0+cHRva3MgPSBMMlRfUChwLCBwLT5tdHUpOworCXAtPmFjdGlvbiA9IHBhcm0tPmFjdGlvbjsKKworI2lmZGVmIENPTkZJR19ORVRfRVNUSU1BVE9SCisJaWYgKHRiW1RDQV9QT0xJQ0VfQVZSQVRFLTFdKQorCQlwLT5ld21hX3JhdGUgPSAqKHUzMiopUlRBX0RBVEEodGJbVENBX1BPTElDRV9BVlJBVEUtMV0pOworCWlmIChlc3QpCisJCWdlbl9yZXBsYWNlX2VzdGltYXRvcigmcC0+YnN0YXRzLCAmcC0+cmF0ZV9lc3QsIHAtPnN0YXRzX2xvY2ssIGVzdCk7CisjZW5kaWYKKworCXNwaW5fdW5sb2NrX2JoKCZwLT5sb2NrKTsKKwlpZiAocmV0ICE9IEFDVF9QX0NSRUFURUQpCisJCXJldHVybiByZXQ7CisKKwlQU0NIRURfR0VUX1RJTUUocC0+dF9jKTsKKwlwLT5pbmRleCA9IHBhcm0tPmluZGV4ID8gOiB0Y2ZfcG9saWNlX25ld19pbmRleCgpOworCWggPSB0Y2ZfcG9saWNlX2hhc2gocC0+aW5kZXgpOworCXdyaXRlX2xvY2tfYmgoJnBvbGljZV9sb2NrKTsKKwlwLT5uZXh0ID0gdGNmX3BvbGljZV9odFtoXTsKKwl0Y2ZfcG9saWNlX2h0W2hdID0gcDsKKwl3cml0ZV91bmxvY2tfYmgoJnBvbGljZV9sb2NrKTsKKworCWEtPnByaXYgPSBwOworCXJldHVybiByZXQ7CisKK2ZhaWx1cmU6CisJaWYgKHJldCA9PSBBQ1RfUF9DUkVBVEVEKQorCQlrZnJlZShwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHRjZl9hY3RfcG9saWNlX2NsZWFudXAoc3RydWN0IHRjX2FjdGlvbiAqYSwgaW50IGJpbmQpCit7CisJc3RydWN0IHRjZl9wb2xpY2UgKnAgPSBQUklWKGEpOworCisJaWYgKHAgIT0gTlVMTCkKKwkJcmV0dXJuIHRjZl9wb2xpY2VfcmVsZWFzZShwLCBiaW5kKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0Y2ZfYWN0X3BvbGljZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQoreworCXBzY2hlZF90aW1lX3Qgbm93OworCXN0cnVjdCB0Y2ZfcG9saWNlICpwID0gUFJJVihhKTsKKwlsb25nIHRva3M7CisJbG9uZyBwdG9rcyA9IDA7CisKKwlzcGluX2xvY2soJnAtPmxvY2spOworCisJcC0+YnN0YXRzLmJ5dGVzICs9IHNrYi0+bGVuOworCXAtPmJzdGF0cy5wYWNrZXRzKys7CisKKyNpZmRlZiBDT05GSUdfTkVUX0VTVElNQVRPUgorCWlmIChwLT5ld21hX3JhdGUgJiYgcC0+cmF0ZV9lc3QuYnBzID49IHAtPmV3bWFfcmF0ZSkgeworCQlwLT5xc3RhdHMub3ZlcmxpbWl0cysrOworCQlzcGluX3VubG9jaygmcC0+bG9jayk7CisJCXJldHVybiBwLT5hY3Rpb247CisJfQorI2VuZGlmCisKKwlpZiAoc2tiLT5sZW4gPD0gcC0+bXR1KSB7CisJCWlmIChwLT5SX3RhYiA9PSBOVUxMKSB7CisJCQlzcGluX3VubG9jaygmcC0+bG9jayk7CisJCQlyZXR1cm4gcC0+cmVzdWx0OworCQl9CisKKwkJUFNDSEVEX0dFVF9USU1FKG5vdyk7CisKKwkJdG9rcyA9IFBTQ0hFRF9URElGRl9TQUZFKG5vdywgcC0+dF9jLCBwLT5idXJzdCk7CisKKwkJaWYgKHAtPlBfdGFiKSB7CisJCQlwdG9rcyA9IHRva3MgKyBwLT5wdG9rczsKKwkJCWlmIChwdG9rcyA+IChsb25nKUwyVF9QKHAsIHAtPm10dSkpCisJCQkJcHRva3MgPSAobG9uZylMMlRfUChwLCBwLT5tdHUpOworCQkJcHRva3MgLT0gTDJUX1AocCwgc2tiLT5sZW4pOworCQl9CisJCXRva3MgKz0gcC0+dG9rczsKKwkJaWYgKHRva3MgPiAobG9uZylwLT5idXJzdCkKKwkJCXRva3MgPSBwLT5idXJzdDsKKwkJdG9rcyAtPSBMMlQocCwgc2tiLT5sZW4pOworCisJCWlmICgodG9rc3xwdG9rcykgPj0gMCkgeworCQkJcC0+dF9jID0gbm93OworCQkJcC0+dG9rcyA9IHRva3M7CisJCQlwLT5wdG9rcyA9IHB0b2tzOworCQkJc3Bpbl91bmxvY2soJnAtPmxvY2spOworCQkJcmV0dXJuIHAtPnJlc3VsdDsKKwkJfQorCX0KKworCXAtPnFzdGF0cy5vdmVybGltaXRzKys7CisJc3Bpbl91bmxvY2soJnAtPmxvY2spOworCXJldHVybiBwLT5hY3Rpb247Cit9CisKK3N0YXRpYyBpbnQKK3RjZl9hY3RfcG9saWNlX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjX2FjdGlvbiAqYSwgaW50IGJpbmQsIGludCByZWYpCit7CisJdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJc3RydWN0IHRjX3BvbGljZSBvcHQ7CisJc3RydWN0IHRjZl9wb2xpY2UgKnAgPSBQUklWKGEpOworCisJb3B0LmluZGV4ID0gcC0+aW5kZXg7CisJb3B0LmFjdGlvbiA9IHAtPmFjdGlvbjsKKwlvcHQubXR1ID0gcC0+bXR1OworCW9wdC5idXJzdCA9IHAtPmJ1cnN0OworCW9wdC5yZWZjbnQgPSBwLT5yZWZjbnQgLSByZWY7CisJb3B0LmJpbmRjbnQgPSBwLT5iaW5kY250IC0gYmluZDsKKwlpZiAocC0+Ul90YWIpCisJCW9wdC5yYXRlID0gcC0+Ul90YWItPnJhdGU7CisJZWxzZQorCQltZW1zZXQoJm9wdC5yYXRlLCAwLCBzaXplb2Yob3B0LnJhdGUpKTsKKwlpZiAocC0+UF90YWIpCisJCW9wdC5wZWFrcmF0ZSA9IHAtPlBfdGFiLT5yYXRlOworCWVsc2UKKwkJbWVtc2V0KCZvcHQucGVha3JhdGUsIDAsIHNpemVvZihvcHQucGVha3JhdGUpKTsKKwlSVEFfUFVUKHNrYiwgVENBX1BPTElDRV9UQkYsIHNpemVvZihvcHQpLCAmb3B0KTsKKwlpZiAocC0+cmVzdWx0KQorCQlSVEFfUFVUKHNrYiwgVENBX1BPTElDRV9SRVNVTFQsIHNpemVvZihpbnQpLCAmcC0+cmVzdWx0KTsKKyNpZmRlZiBDT05GSUdfTkVUX0VTVElNQVRPUgorCWlmIChwLT5ld21hX3JhdGUpCisJCVJUQV9QVVQoc2tiLCBUQ0FfUE9MSUNFX0FWUkFURSwgNCwgJnAtPmV3bWFfcmF0ZSk7CisjZW5kaWYKKwlyZXR1cm4gc2tiLT5sZW47CisKK3J0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitNT0RVTEVfQVVUSE9SKCJBbGV4ZXkgS3V6bmV0c292Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBvbGljaW5nIGFjdGlvbnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHN0cnVjdCB0Y19hY3Rpb25fb3BzIGFjdF9wb2xpY2Vfb3BzID0geworCS5raW5kCQk9CSJwb2xpY2UiLAorCS50eXBlCQk9CVRDQV9JRF9QT0xJQ0UsCisJLmNhcGFiCQk9CVRDQV9DQVBfTk9ORSwKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCisJLmFjdAkJPQl0Y2ZfYWN0X3BvbGljZSwKKwkuZHVtcAkJPQl0Y2ZfYWN0X3BvbGljZV9kdW1wLAorCS5jbGVhbnVwCT0JdGNmX2FjdF9wb2xpY2VfY2xlYW51cCwKKwkubG9va3VwCQk9CXRjZl9oYXNoX3NlYXJjaCwKKwkuaW5pdAkJPQl0Y2ZfYWN0X3BvbGljZV9sb2NhdGUsCisJLndhbGsJCT0JdGNmX2dlbmVyaWNfd2Fsa2VyCit9OworCitzdGF0aWMgaW50IF9faW5pdAorcG9saWNlX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHRjZl9yZWdpc3Rlcl9hY3Rpb24oJmFjdF9wb2xpY2Vfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0Citwb2xpY2VfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl0Y2ZfdW5yZWdpc3Rlcl9hY3Rpb24oJmFjdF9wb2xpY2Vfb3BzKTsKK30KKworbW9kdWxlX2luaXQocG9saWNlX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHBvbGljZV9jbGVhbnVwX21vZHVsZSk7CisKKyNlbHNlIC8qIENPTkZJR19ORVRfQ0xTX0FDVCAqLworCitzdHJ1Y3QgdGNmX3BvbGljZSAqIHRjZl9wb2xpY2VfbG9jYXRlKHN0cnVjdCBydGF0dHIgKnJ0YSwgc3RydWN0IHJ0YXR0ciAqZXN0KQoreworCXVuc2lnbmVkIGg7CisJc3RydWN0IHRjZl9wb2xpY2UgKnA7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX1BPTElDRV9NQVhdOworCXN0cnVjdCB0Y19wb2xpY2UgKnBhcm07CisKKwlpZiAocnRhdHRyX3BhcnNlX25lc3RlZCh0YiwgVENBX1BPTElDRV9NQVgsIHJ0YSkgPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICh0YltUQ0FfUE9MSUNFX1RCRi0xXSA9PSBOVUxMIHx8CisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9QT0xJQ0VfVEJGLTFdKSAhPSBzaXplb2YoKnBhcm0pKQorCQlyZXR1cm4gTlVMTDsKKworCXBhcm0gPSBSVEFfREFUQSh0YltUQ0FfUE9MSUNFX1RCRi0xXSk7CisKKwlpZiAocGFybS0+aW5kZXggJiYgKHAgPSB0Y2ZfcG9saWNlX2xvb2t1cChwYXJtLT5pbmRleCkpICE9IE5VTEwpIHsKKwkJcC0+cmVmY250Kys7CisJCXJldHVybiBwOworCX0KKworCXAgPSBrbWFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworCXAtPnJlZmNudCA9IDE7CisJc3Bpbl9sb2NrX2luaXQoJnAtPmxvY2spOworCXAtPnN0YXRzX2xvY2sgPSAmcC0+bG9jazsKKwlpZiAocGFybS0+cmF0ZS5yYXRlKSB7CisJCXAtPlJfdGFiID0gcWRpc2NfZ2V0X3J0YWIoJnBhcm0tPnJhdGUsIHRiW1RDQV9QT0xJQ0VfUkFURS0xXSk7CisJCWlmIChwLT5SX3RhYiA9PSBOVUxMKQorCQkJZ290byBmYWlsdXJlOworCQlpZiAocGFybS0+cGVha3JhdGUucmF0ZSkgeworCQkJcC0+UF90YWIgPSBxZGlzY19nZXRfcnRhYigmcGFybS0+cGVha3JhdGUsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgIHRiW1RDQV9QT0xJQ0VfUEVBS1JBVEUtMV0pOworCQkJaWYgKHAtPlBfdGFiID09IE5VTEwpCisJCQkJZ290byBmYWlsdXJlOworCQl9CisJfQorCWlmICh0YltUQ0FfUE9MSUNFX1JFU1VMVC0xXSkgeworCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX1BPTElDRV9SRVNVTFQtMV0pICE9IHNpemVvZih1MzIpKQorCQkJZ290byBmYWlsdXJlOworCQlwLT5yZXN1bHQgPSAqKHUzMiopUlRBX0RBVEEodGJbVENBX1BPTElDRV9SRVNVTFQtMV0pOworCX0KKyNpZmRlZiBDT05GSUdfTkVUX0VTVElNQVRPUgorCWlmICh0YltUQ0FfUE9MSUNFX0FWUkFURS0xXSkgeworCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX1BPTElDRV9BVlJBVEUtMV0pICE9IHNpemVvZih1MzIpKQorCQkJZ290byBmYWlsdXJlOworCQlwLT5ld21hX3JhdGUgPSAqKHUzMiopUlRBX0RBVEEodGJbVENBX1BPTElDRV9BVlJBVEUtMV0pOworCX0KKyNlbmRpZgorCXAtPnRva3MgPSBwLT5idXJzdCA9IHBhcm0tPmJ1cnN0OworCXAtPm10dSA9IHBhcm0tPm10dTsKKwlpZiAocC0+bXR1ID09IDApIHsKKwkJcC0+bXR1ID0gfjA7CisJCWlmIChwLT5SX3RhYikKKwkJCXAtPm10dSA9IDI1NTw8cC0+Ul90YWItPnJhdGUuY2VsbF9sb2c7CisJfQorCWlmIChwLT5QX3RhYikKKwkJcC0+cHRva3MgPSBMMlRfUChwLCBwLT5tdHUpOworCVBTQ0hFRF9HRVRfVElNRShwLT50X2MpOworCXAtPmluZGV4ID0gcGFybS0+aW5kZXggPyA6IHRjZl9wb2xpY2VfbmV3X2luZGV4KCk7CisJcC0+YWN0aW9uID0gcGFybS0+YWN0aW9uOworI2lmZGVmIENPTkZJR19ORVRfRVNUSU1BVE9SCisJaWYgKGVzdCkKKwkJZ2VuX25ld19lc3RpbWF0b3IoJnAtPmJzdGF0cywgJnAtPnJhdGVfZXN0LCBwLT5zdGF0c19sb2NrLCBlc3QpOworI2VuZGlmCisJaCA9IHRjZl9wb2xpY2VfaGFzaChwLT5pbmRleCk7CisJd3JpdGVfbG9ja19iaCgmcG9saWNlX2xvY2spOworCXAtPm5leHQgPSB0Y2ZfcG9saWNlX2h0W2hdOworCXRjZl9wb2xpY2VfaHRbaF0gPSBwOworCXdyaXRlX3VubG9ja19iaCgmcG9saWNlX2xvY2spOworCXJldHVybiBwOworCitmYWlsdXJlOgorCWlmIChwLT5SX3RhYikKKwkJcWRpc2NfcHV0X3J0YWIocC0+Ul90YWIpOworCWtmcmVlKHApOworCXJldHVybiBOVUxMOworfQorCitpbnQgdGNmX3BvbGljZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX3BvbGljZSAqcCkKK3sKKwlwc2NoZWRfdGltZV90IG5vdzsKKwlsb25nIHRva3M7CisJbG9uZyBwdG9rcyA9IDA7CisKKwlzcGluX2xvY2soJnAtPmxvY2spOworCisJcC0+YnN0YXRzLmJ5dGVzICs9IHNrYi0+bGVuOworCXAtPmJzdGF0cy5wYWNrZXRzKys7CisKKyNpZmRlZiBDT05GSUdfTkVUX0VTVElNQVRPUgorCWlmIChwLT5ld21hX3JhdGUgJiYgcC0+cmF0ZV9lc3QuYnBzID49IHAtPmV3bWFfcmF0ZSkgeworCQlwLT5xc3RhdHMub3ZlcmxpbWl0cysrOworCQlzcGluX3VubG9jaygmcC0+bG9jayk7CisJCXJldHVybiBwLT5hY3Rpb247CisJfQorI2VuZGlmCisKKwlpZiAoc2tiLT5sZW4gPD0gcC0+bXR1KSB7CisJCWlmIChwLT5SX3RhYiA9PSBOVUxMKSB7CisJCQlzcGluX3VubG9jaygmcC0+bG9jayk7CisJCQlyZXR1cm4gcC0+cmVzdWx0OworCQl9CisKKwkJUFNDSEVEX0dFVF9USU1FKG5vdyk7CisKKwkJdG9rcyA9IFBTQ0hFRF9URElGRl9TQUZFKG5vdywgcC0+dF9jLCBwLT5idXJzdCk7CisKKwkJaWYgKHAtPlBfdGFiKSB7CisJCQlwdG9rcyA9IHRva3MgKyBwLT5wdG9rczsKKwkJCWlmIChwdG9rcyA+IChsb25nKUwyVF9QKHAsIHAtPm10dSkpCisJCQkJcHRva3MgPSAobG9uZylMMlRfUChwLCBwLT5tdHUpOworCQkJcHRva3MgLT0gTDJUX1AocCwgc2tiLT5sZW4pOworCQl9CisJCXRva3MgKz0gcC0+dG9rczsKKwkJaWYgKHRva3MgPiAobG9uZylwLT5idXJzdCkKKwkJCXRva3MgPSBwLT5idXJzdDsKKwkJdG9rcyAtPSBMMlQocCwgc2tiLT5sZW4pOworCisJCWlmICgodG9rc3xwdG9rcykgPj0gMCkgeworCQkJcC0+dF9jID0gbm93OworCQkJcC0+dG9rcyA9IHRva3M7CisJCQlwLT5wdG9rcyA9IHB0b2tzOworCQkJc3Bpbl91bmxvY2soJnAtPmxvY2spOworCQkJcmV0dXJuIHAtPnJlc3VsdDsKKwkJfQorCX0KKworCXAtPnFzdGF0cy5vdmVybGltaXRzKys7CisJc3Bpbl91bmxvY2soJnAtPmxvY2spOworCXJldHVybiBwLT5hY3Rpb247Cit9CitFWFBPUlRfU1lNQk9MKHRjZl9wb2xpY2UpOworCitpbnQgdGNmX3BvbGljZV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y2ZfcG9saWNlICpwKQoreworCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXN0cnVjdCB0Y19wb2xpY2Ugb3B0OworCisJb3B0LmluZGV4ID0gcC0+aW5kZXg7CisJb3B0LmFjdGlvbiA9IHAtPmFjdGlvbjsKKwlvcHQubXR1ID0gcC0+bXR1OworCW9wdC5idXJzdCA9IHAtPmJ1cnN0OworCWlmIChwLT5SX3RhYikKKwkJb3B0LnJhdGUgPSBwLT5SX3RhYi0+cmF0ZTsKKwllbHNlCisJCW1lbXNldCgmb3B0LnJhdGUsIDAsIHNpemVvZihvcHQucmF0ZSkpOworCWlmIChwLT5QX3RhYikKKwkJb3B0LnBlYWtyYXRlID0gcC0+UF90YWItPnJhdGU7CisJZWxzZQorCQltZW1zZXQoJm9wdC5wZWFrcmF0ZSwgMCwgc2l6ZW9mKG9wdC5wZWFrcmF0ZSkpOworCVJUQV9QVVQoc2tiLCBUQ0FfUE9MSUNFX1RCRiwgc2l6ZW9mKG9wdCksICZvcHQpOworCWlmIChwLT5yZXN1bHQpCisJCVJUQV9QVVQoc2tiLCBUQ0FfUE9MSUNFX1JFU1VMVCwgc2l6ZW9mKGludCksICZwLT5yZXN1bHQpOworI2lmZGVmIENPTkZJR19ORVRfRVNUSU1BVE9SCisJaWYgKHAtPmV3bWFfcmF0ZSkKKwkJUlRBX1BVVChza2IsIFRDQV9QT0xJQ0VfQVZSQVRFLCA0LCAmcC0+ZXdtYV9yYXRlKTsKKyNlbmRpZgorCXJldHVybiBza2ItPmxlbjsKKworcnRhdHRyX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKK2ludCB0Y2ZfcG9saWNlX2R1bXBfc3RhdHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjZl9wb2xpY2UgKnApCit7CisJc3RydWN0IGduZXRfZHVtcCBkOworCQorCWlmIChnbmV0X3N0YXRzX3N0YXJ0X2NvcHlfY29tcGF0KHNrYiwgVENBX1NUQVRTMiwgVENBX1NUQVRTLAorCQkJVENBX1hTVEFUUywgcC0+c3RhdHNfbG9jaywgJmQpIDwgMCkKKwkJZ290byBlcnJvdXQ7CisJCisJaWYgKGduZXRfc3RhdHNfY29weV9iYXNpYygmZCwgJnAtPmJzdGF0cykgPCAwIHx8CisjaWZkZWYgQ09ORklHX05FVF9FU1RJTUFUT1IKKwkgICAgZ25ldF9zdGF0c19jb3B5X3JhdGVfZXN0KCZkLCAmcC0+cmF0ZV9lc3QpIDwgMCB8fAorI2VuZGlmCisJICAgIGduZXRfc3RhdHNfY29weV9xdWV1ZSgmZCwgJnAtPnFzdGF0cykgPCAwKQorCQlnb3RvIGVycm91dDsKKworCWlmIChnbmV0X3N0YXRzX2ZpbmlzaF9jb3B5KCZkKSA8IDApCisJCWdvdG8gZXJyb3V0OworCisJcmV0dXJuIDA7CisKK2Vycm91dDoKKwlyZXR1cm4gLTE7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfTkVUX0NMU19BQ1QgKi8KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3Rfc2ltcGxlLmMgYi9uZXQvc2NoZWQvYWN0X3NpbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZjJlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2NoZWQvYWN0X3NpbXBsZS5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBuZXQvc2NoZWQvc2ltcC5jCVNpbXBsZSBleGFtcGxlIG9mIGFuIGFjdGlvbgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUphbWFsIEhhZGkgU2FsaW0gKDIwMDUpCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorCisjZGVmaW5lIFRDQV9BQ1RfU0lNUCAyMgorCisvKiBYWFg6IEhpZGUgYWxsIHRoZXNlIGNvbW1vbiBlbGVtZW50cyB1bmRlciBzb21lIG1hY3JvIAorICogcHJvYmFibHkKKyovCisjaW5jbHVkZSA8bGludXgvdGNfYWN0L3RjX2RlZmFjdC5oPgorI2luY2x1ZGUgPG5ldC90Y19hY3QvdGNfZGVmYWN0Lmg+CisKKy8qIHVzZSBnZW5lcmljIGhhc2ggdGFibGUgd2l0aCA4IGJ1Y2tldHMgKi8KKyNkZWZpbmUgTVlfVEFCX1NJWkUgICAgIDgKKyNkZWZpbmUgTVlfVEFCX01BU0sgICAgIChNWV9UQUJfU0laRSAtIDEpCitzdGF0aWMgdTMyIGlkeF9nZW47CitzdGF0aWMgc3RydWN0IHRjZl9kZWZhY3QgKnRjZl9zaW1wX2h0W01ZX1RBQl9TSVpFXTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKHNpbXBfbG9jayk7CisKKy8qIG92ZXJyaWRlIHRoZSBkZWZhdWx0cyAqLworI2RlZmluZSB0Y2Zfc3QJCXRjZl9kZWZhY3QKKyNkZWZpbmUgdGNfc3QJCXRjX2RlZmFjdAorI2RlZmluZSB0Y2ZfdF9sb2NrCXNpbXBfbG9jaworI2RlZmluZSB0Y2ZfaHQJCXRjZl9zaW1wX2h0CisKKyNkZWZpbmUgQ09ORklHX05FVF9BQ1RfSU5JVCAxCisjaW5jbHVkZSA8bmV0L3BrdF9hY3QuaD4KKyNpbmNsdWRlIDxuZXQvYWN0X2dlbmVyaWMuaD4KKworc3RhdGljIGludCB0Y2Zfc2ltcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLCBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQoreworCXN0cnVjdCB0Y2ZfZGVmYWN0ICpwID0gUFJJVihhLCBkZWZhY3QpOworCisJc3Bpbl9sb2NrKCZwLT5sb2NrKTsKKwlwLT50bS5sYXN0dXNlID0gamlmZmllczsKKwlwLT5ic3RhdHMuYnl0ZXMgKz0gc2tiLT5sZW47CisJcC0+YnN0YXRzLnBhY2tldHMrKzsKKworCS8qIHByaW50IHBvbGljeSBzdHJpbmcgZm9sbG93ZWQgYnkgXyB0aGVuIHBhY2tldCBjb3VudCAKKwkgKiBFeGFtcGxlIGlmIHRoaXMgd2FzIHRoZSAzcmQgcGFja2V0IGFuZCB0aGUgc3RyaW5nIHdhcyAiaGVsbG8iIAorCSAqIHRoZW4gaXQgd291bGQgbG9vayBsaWtlICJoZWxsb18zIiAod2l0aG91dCBxdW90ZXMpIAorCSAqKi8KKwlwcmludGsoInNpbXBsZTogJXNfJWRcbiIsIChjaGFyICopcC0+ZGVmZGF0YSwgcC0+YnN0YXRzLnBhY2tldHMpOworCXNwaW5fdW5sb2NrKCZwLT5sb2NrKTsKKwlyZXR1cm4gcC0+YWN0aW9uOworfQorCitzdGF0aWMgc3RydWN0IHRjX2FjdGlvbl9vcHMgYWN0X3NpbXBfb3BzID0geworCS5raW5kID0gInNpbXBsZSIsCisJLnR5cGUgPSBUQ0FfQUNUX1NJTVAsCisJLmNhcGFiID0gVENBX0NBUF9OT05FLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5hY3QgPSB0Y2Zfc2ltcCwKKwl0Y2FfdXNlX2RlZmF1bHRfb3BzCit9OworCitNT0RVTEVfQVVUSE9SKCJKYW1hbCBIYWRpIFNhbGltKDIwMDUpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNpbXBsZSBleGFtcGxlIGFjdGlvbiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IF9faW5pdCBzaW1wX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldCA9IHRjZl9yZWdpc3Rlcl9hY3Rpb24oJmFjdF9zaW1wX29wcyk7CisJaWYgKCFyZXQpCisJCXByaW50aygiU2ltcGxlIFRDIGFjdGlvbiBMb2FkZWRcbiIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzaW1wX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdGNmX3VucmVnaXN0ZXJfYWN0aW9uKCZhY3Rfc2ltcF9vcHMpOworfQorCittb2R1bGVfaW5pdChzaW1wX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHNpbXBfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2VtYXRjaC5jIGIvbmV0L3NjaGVkL2VtYXRjaC5jCmluZGV4IDY0YjA0N2MuLjVjYjk1NmIgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9lbWF0Y2guYworKysgYi9uZXQvc2NoZWQvZW1hdGNoLmMKQEAgLTkyLDcgKzkyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxuZXQvcGt0X2Nscy5oPgotI2luY2x1ZGUgPGNvbmZpZy9uZXQvZW1hdGNoL3N0YWNrLmg+CiAKIHN0YXRpYyBMSVNUX0hFQUQoZW1hdGNoX29wcyk7CiBzdGF0aWMgREVGSU5FX1JXTE9DSyhlbWF0Y2hfbW9kX2xvY2spOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2dhY3QuYyBiL25ldC9zY2hlZC9nYWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYzZkNTQuLjAwMDAwMDAKLS0tIGEvbmV0L3NjaGVkL2dhY3QuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKgotICogbmV0L3NjaGVkL2dhY3QuYwlHZW5lcmljIGFjdGlvbnMKLSAqCi0gKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBjb3B5cmlnaHQgCUphbWFsIEhhZGkgU2FsaW0gKDIwMDItNCkKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgotI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxuZXQvc29jay5oPgotI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC90Y19hY3QvdGNfZ2FjdC5oPgotI2luY2x1ZGUgPG5ldC90Y19hY3QvdGNfZ2FjdC5oPgotCi0vKiB1c2UgZ2VuZXJpYyBoYXNoIHRhYmxlICovCi0jZGVmaW5lIE1ZX1RBQl9TSVpFCTE2Ci0jZGVmaW5lIE1ZX1RBQl9NQVNLCTE1Ci0KLXN0YXRpYyB1MzIgaWR4X2dlbjsKLXN0YXRpYyBzdHJ1Y3QgdGNmX2dhY3QgKnRjZl9nYWN0X2h0W01ZX1RBQl9TSVpFXTsKLXN0YXRpYyBERUZJTkVfUldMT0NLKGdhY3RfbG9jayk7Ci0KLS8qIG92ZXdycmlkZSB0aGUgZGVmYXVsdHMgKi8KLSNkZWZpbmUgdGNmX3N0CQl0Y2ZfZ2FjdAotI2RlZmluZSB0Y19zdAkJdGNfZ2FjdAotI2RlZmluZSB0Y2ZfdF9sb2NrCWdhY3RfbG9jawotI2RlZmluZSB0Y2ZfaHQJCXRjZl9nYWN0X2h0Ci0KLSNkZWZpbmUgQ09ORklHX05FVF9BQ1RfSU5JVCAxCi0jaW5jbHVkZSA8bmV0L3BrdF9hY3QuaD4KLQotI2lmZGVmIENPTkZJR19HQUNUX1BST0IKLXN0YXRpYyBpbnQgZ2FjdF9uZXRfcmFuZChzdHJ1Y3QgdGNmX2dhY3QgKnApCi17Ci0JaWYgKG5ldF9yYW5kb20oKSVwLT5wdmFsKQotCQlyZXR1cm4gcC0+YWN0aW9uOwotCXJldHVybiBwLT5wYWN0aW9uOwotfQotCi1zdGF0aWMgaW50IGdhY3RfZGV0ZXJtKHN0cnVjdCB0Y2ZfZ2FjdCAqcCkKLXsKLQlpZiAocC0+YnN0YXRzLnBhY2tldHMlcC0+cHZhbCkKLQkJcmV0dXJuIHAtPmFjdGlvbjsKLQlyZXR1cm4gcC0+cGFjdGlvbjsKLX0KLQotdHlwZWRlZiBpbnQgKCpnX3JhbmQpKHN0cnVjdCB0Y2ZfZ2FjdCAqcCk7Ci1zdGF0aWMgZ19yYW5kIGdhY3RfcmFuZFtNQVhfUkFORF09IHsgTlVMTCwgZ2FjdF9uZXRfcmFuZCwgZ2FjdF9kZXRlcm0gfTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IHRjZl9nYWN0X2luaXQoc3RydWN0IHJ0YXR0ciAqcnRhLCBzdHJ1Y3QgcnRhdHRyICplc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRjX2FjdGlvbiAqYSwgaW50IG92ciwgaW50IGJpbmQpCi17Ci0Jc3RydWN0IHJ0YXR0ciAqdGJbVENBX0dBQ1RfTUFYXTsKLQlzdHJ1Y3QgdGNfZ2FjdCAqcGFybTsKLQlzdHJ1Y3QgdGNmX2dhY3QgKnA7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAocnRhID09IE5VTEwgfHwgcnRhdHRyX3BhcnNlX25lc3RlZCh0YiwgVENBX0dBQ1RfTUFYLCBydGEpIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAodGJbVENBX0dBQ1RfUEFSTVMgLSAxXSA9PSBOVUxMIHx8Ci0JICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9HQUNUX1BBUk1TIC0gMV0pIDwgc2l6ZW9mKCpwYXJtKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcGFybSA9IFJUQV9EQVRBKHRiW1RDQV9HQUNUX1BBUk1TIC0gMV0pOwotCi0JaWYgKHRiW1RDQV9HQUNUX1BST0ItMV0gIT0gTlVMTCkKLSNpZmRlZiBDT05GSUdfR0FDVF9QUk9CCi0JCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfR0FDVF9QUk9CLTFdKSA8IHNpemVvZihzdHJ1Y3QgdGNfZ2FjdF9wKSkKLQkJCXJldHVybiAtRUlOVkFMOwotI2Vsc2UKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotI2VuZGlmCi0KLQlwID0gdGNmX2hhc2hfY2hlY2socGFybS0+aW5kZXgsIGEsIG92ciwgYmluZCk7Ci0JaWYgKHAgPT0gTlVMTCkgewotCQlwID0gdGNmX2hhc2hfY3JlYXRlKHBhcm0tPmluZGV4LCBlc3QsIGEsIHNpemVvZigqcCksIG92ciwgYmluZCk7Ci0JCWlmIChwID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJcmV0ID0gQUNUX1BfQ1JFQVRFRDsKLQl9IGVsc2UgewotCQlpZiAoIW92cikgewotCQkJdGNmX2hhc2hfcmVsZWFzZShwLCBiaW5kKTsKLQkJCXJldHVybiAtRUVYSVNUOwotCQl9Ci0JfQotCi0Jc3Bpbl9sb2NrX2JoKCZwLT5sb2NrKTsKLQlwLT5hY3Rpb24gPSBwYXJtLT5hY3Rpb247Ci0jaWZkZWYgQ09ORklHX0dBQ1RfUFJPQgotCWlmICh0YltUQ0FfR0FDVF9QUk9CLTFdICE9IE5VTEwpIHsKLQkJc3RydWN0IHRjX2dhY3RfcCAqcF9wYXJtID0gUlRBX0RBVEEodGJbVENBX0dBQ1RfUFJPQi0xXSk7Ci0JCXAtPnBhY3Rpb24gPSBwX3Bhcm0tPnBhY3Rpb247Ci0JCXAtPnB2YWwgICAgPSBwX3Bhcm0tPnB2YWw7Ci0JCXAtPnB0eXBlICAgPSBwX3Bhcm0tPnB0eXBlOwotCX0KLSNlbmRpZgotCXNwaW5fdW5sb2NrX2JoKCZwLT5sb2NrKTsKLQlpZiAocmV0ID09IEFDVF9QX0NSRUFURUQpCi0JCXRjZl9oYXNoX2luc2VydChwKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50Ci10Y2ZfZ2FjdF9jbGVhbnVwKHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kKQotewotCXN0cnVjdCB0Y2ZfZ2FjdCAqcCA9IFBSSVYoYSwgZ2FjdCk7Ci0KLQlpZiAocCAhPSBOVUxMKQotCQlyZXR1cm4gdGNmX2hhc2hfcmVsZWFzZShwLCBiaW5kKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotdGNmX2dhY3Qoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLCBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQotewotCXN0cnVjdCB0Y2ZfZ2FjdCAqcCA9IFBSSVYoYSwgZ2FjdCk7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpwc2tiOwotCWludCBhY3Rpb24gPSBUQ19BQ1RfU0hPVDsKLQotCXNwaW5fbG9jaygmcC0+bG9jayk7Ci0jaWZkZWYgQ09ORklHX0dBQ1RfUFJPQgotCWlmIChwLT5wdHlwZSAmJiBnYWN0X3JhbmRbcC0+cHR5cGVdICE9IE5VTEwpCi0JCWFjdGlvbiA9IGdhY3RfcmFuZFtwLT5wdHlwZV0ocCk7Ci0JZWxzZQotCQlhY3Rpb24gPSBwLT5hY3Rpb247Ci0jZWxzZQotCWFjdGlvbiA9IHAtPmFjdGlvbjsKLSNlbmRpZgotCXAtPmJzdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKLQlwLT5ic3RhdHMucGFja2V0cysrOwotCWlmIChhY3Rpb24gPT0gVENfQUNUX1NIT1QpCi0JCXAtPnFzdGF0cy5kcm9wcysrOwotCXAtPnRtLmxhc3R1c2UgPSBqaWZmaWVzOwotCXNwaW5fdW5sb2NrKCZwLT5sb2NrKTsKLQotCXJldHVybiBhY3Rpb247Ci19Ci0KLXN0YXRpYyBpbnQKLXRjZl9nYWN0X2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjX2FjdGlvbiAqYSwgaW50IGJpbmQsIGludCByZWYpCi17Ci0JdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKLQlzdHJ1Y3QgdGNfZ2FjdCBvcHQ7Ci0Jc3RydWN0IHRjZl9nYWN0ICpwID0gUFJJVihhLCBnYWN0KTsKLQlzdHJ1Y3QgdGNmX3QgdDsKLQotCW9wdC5pbmRleCA9IHAtPmluZGV4OwotCW9wdC5yZWZjbnQgPSBwLT5yZWZjbnQgLSByZWY7Ci0Jb3B0LmJpbmRjbnQgPSBwLT5iaW5kY250IC0gYmluZDsKLQlvcHQuYWN0aW9uID0gcC0+YWN0aW9uOwotCVJUQV9QVVQoc2tiLCBUQ0FfR0FDVF9QQVJNUywgc2l6ZW9mKG9wdCksICZvcHQpOwotI2lmZGVmIENPTkZJR19HQUNUX1BST0IKLQlpZiAocC0+cHR5cGUpIHsKLQkJc3RydWN0IHRjX2dhY3RfcCBwX29wdDsKLQkJcF9vcHQucGFjdGlvbiA9IHAtPnBhY3Rpb247Ci0JCXBfb3B0LnB2YWwgPSBwLT5wdmFsOwotCQlwX29wdC5wdHlwZSA9IHAtPnB0eXBlOwotCQlSVEFfUFVUKHNrYiwgVENBX0dBQ1RfUFJPQiwgc2l6ZW9mKHBfb3B0KSwgJnBfb3B0KTsKLQl9Ci0jZW5kaWYKLQl0Lmluc3RhbGwgPSBqaWZmaWVzX3RvX2Nsb2NrX3QoamlmZmllcyAtIHAtPnRtLmluc3RhbGwpOwotCXQubGFzdHVzZSA9IGppZmZpZXNfdG9fY2xvY2tfdChqaWZmaWVzIC0gcC0+dG0ubGFzdHVzZSk7Ci0JdC5leHBpcmVzID0gamlmZmllc190b19jbG9ja190KHAtPnRtLmV4cGlyZXMpOwotCVJUQV9QVVQoc2tiLCBUQ0FfR0FDVF9UTSwgc2l6ZW9mKHQpLCAmdCk7Ci0JcmV0dXJuIHNrYi0+bGVuOwotCi0gICAgICBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOwotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIHN0cnVjdCB0Y19hY3Rpb25fb3BzIGFjdF9nYWN0X29wcyA9IHsKLQkua2luZAkJPQkiZ2FjdCIsCi0JLnR5cGUJCT0JVENBX0FDVF9HQUNULAotCS5jYXBhYgkJPQlUQ0FfQ0FQX05PTkUsCi0JLm93bmVyCQk9CVRISVNfTU9EVUxFLAotCS5hY3QJCT0JdGNmX2dhY3QsCi0JLmR1bXAJCT0JdGNmX2dhY3RfZHVtcCwKLQkuY2xlYW51cAk9CXRjZl9nYWN0X2NsZWFudXAsCi0JLmxvb2t1cAkJPQl0Y2ZfaGFzaF9zZWFyY2gsCi0JLmluaXQJCT0JdGNmX2dhY3RfaW5pdCwKLQkud2FsawkJPQl0Y2ZfZ2VuZXJpY193YWxrZXIKLX07Ci0KLU1PRFVMRV9BVVRIT1IoIkphbWFsIEhhZGkgU2FsaW0oMjAwMi00KSIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJHZW5lcmljIENsYXNzaWZpZXIgYWN0aW9ucyIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgaW50IF9faW5pdAotZ2FjdF9pbml0X21vZHVsZSh2b2lkKQotewotI2lmZGVmIENPTkZJR19HQUNUX1BST0IKLQlwcmludGsoIkdBQ1QgcHJvYmFiaWxpdHkgb25cbiIpOwotI2Vsc2UKLQlwcmludGsoIkdBQ1QgcHJvYmFiaWxpdHkgTk9UIG9uXG4iKTsKLSNlbmRpZgotCXJldHVybiB0Y2ZfcmVnaXN0ZXJfYWN0aW9uKCZhY3RfZ2FjdF9vcHMpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQKLWdhY3RfY2xlYW51cF9tb2R1bGUodm9pZCkKLXsKLQl0Y2ZfdW5yZWdpc3Rlcl9hY3Rpb24oJmFjdF9nYWN0X29wcyk7Ci19Ci0KLW1vZHVsZV9pbml0KGdhY3RfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQoZ2FjdF9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvaXB0LmMgYi9uZXQvc2NoZWQvaXB0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MDEzNmUuLjAwMDAwMDAKLS0tIGEvbmV0L3NjaGVkL2lwdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qCi0gKiBuZXQvc2NoZWQvaXB0LmMJaXB0YWJsZXMgdGFyZ2V0IGludGVyZmFjZQotICoKLSAqVE9ETzogQWRkIG90aGVyIHRhYmxlcy4gRm9yIG5vdyB3ZSBvbmx5IHN1cHBvcnQgdGhlIGlwdjQgdGFibGUgdGFyZ2V0cwotICoKLSAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIENvcHlyaWdodDoJSmFtYWwgSGFkaSBTYWxpbSAoMjAwMi00KQotICovCi0KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KLSNpbmNsdWRlIDxuZXQvc29jay5oPgotI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC90Y19hY3QvdGNfaXB0Lmg+Ci0jaW5jbHVkZSA8bmV0L3RjX2FjdC90Y19pcHQuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotCi0vKiB1c2UgZ2VuZXJpYyBoYXNoIHRhYmxlICovCi0jZGVmaW5lIE1ZX1RBQl9TSVpFICAgICAxNgotI2RlZmluZSBNWV9UQUJfTUFTSyAgICAgMTUKLQotc3RhdGljIHUzMiBpZHhfZ2VuOwotc3RhdGljIHN0cnVjdCB0Y2ZfaXB0ICp0Y2ZfaXB0X2h0W01ZX1RBQl9TSVpFXTsKLS8qIGlwdCBoYXNoIHRhYmxlIGxvY2sgKi8KLXN0YXRpYyBERUZJTkVfUldMT0NLKGlwdF9sb2NrKTsKLQotLyogb3Zld3JyaWRlIHRoZSBkZWZhdWx0cyAqLwotI2RlZmluZSB0Y2Zfc3QJCXRjZl9pcHQKLSNkZWZpbmUgdGNmX3RfbG9jawlpcHRfbG9jawotI2RlZmluZSB0Y2ZfaHQJCXRjZl9pcHRfaHQKLQotI2RlZmluZSBDT05GSUdfTkVUX0FDVF9JTklUCi0jaW5jbHVkZSA8bmV0L3BrdF9hY3QuaD4KLQotc3RhdGljIGludAotaXB0X2luaXRfdGFyZ2V0KHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0LCBjaGFyICp0YWJsZSwgdW5zaWduZWQgaW50IGhvb2spCi17Ci0Jc3RydWN0IGlwdF90YXJnZXQgKnRhcmdldDsKLQlpbnQgcmV0ID0gMDsKLQotCXRhcmdldCA9IGlwdF9maW5kX3RhcmdldCh0LT51LnVzZXIubmFtZSwgdC0+dS51c2VyLnJldmlzaW9uKTsKLQlpZiAoIXRhcmdldCkKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0KLQlEUFJJTlRLKCJpcHRfaW5pdF90YXJnZXQ6IGZvdW5kICVzXG4iLCB0YXJnZXQtPm5hbWUpOwotCXQtPnUua2VybmVsLnRhcmdldCA9IHRhcmdldDsKLQotCWlmICh0LT51Lmtlcm5lbC50YXJnZXQtPmNoZWNrZW50cnkKLQkgICAgJiYgIXQtPnUua2VybmVsLnRhcmdldC0+Y2hlY2tlbnRyeSh0YWJsZSwgTlVMTCwgdC0+ZGF0YSwKLQkJCQkJICAgICAgIHQtPnUudGFyZ2V0X3NpemUgLSBzaXplb2YoKnQpLAotCQkJCQkgICAgICAgaG9vaykpIHsKLQkJRFBSSU5USygiaXB0X2luaXRfdGFyZ2V0OiBjaGVjayBmYWlsZWQgZm9yIGAlcycuXG4iLAotCQkJdC0+dS5rZXJuZWwudGFyZ2V0LT5uYW1lKTsKLQkJbW9kdWxlX3B1dCh0LT51Lmtlcm5lbC50YXJnZXQtPm1lKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZAotaXB0X2Rlc3Ryb3lfdGFyZ2V0KHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0KQotewotCWlmICh0LT51Lmtlcm5lbC50YXJnZXQtPmRlc3Ryb3kpCi0JCXQtPnUua2VybmVsLnRhcmdldC0+ZGVzdHJveSh0LT5kYXRhLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+dS50YXJnZXRfc2l6ZSAtIHNpemVvZigqdCkpOwotICAgICAgICBtb2R1bGVfcHV0KHQtPnUua2VybmVsLnRhcmdldC0+bWUpOwotfQotCi1zdGF0aWMgaW50Ci10Y2ZfaXB0X3JlbGVhc2Uoc3RydWN0IHRjZl9pcHQgKnAsIGludCBiaW5kKQotewotCWludCByZXQgPSAwOwotCWlmIChwKSB7Ci0JCWlmIChiaW5kKQotCQkJcC0+YmluZGNudC0tOwotCQlwLT5yZWZjbnQtLTsKLQkJaWYgKHAtPmJpbmRjbnQgPD0gMCAmJiBwLT5yZWZjbnQgPD0gMCkgewotCQkJaXB0X2Rlc3Ryb3lfdGFyZ2V0KHAtPnQpOwotCQkJa2ZyZWUocC0+dG5hbWUpOwotCQkJa2ZyZWUocC0+dCk7Ci0JCQl0Y2ZfaGFzaF9kZXN0cm95KHApOwotCQkJcmV0ID0gQUNUX1BfREVMRVRFRDsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50Ci10Y2ZfaXB0X2luaXQoc3RydWN0IHJ0YXR0ciAqcnRhLCBzdHJ1Y3QgcnRhdHRyICplc3QsIHN0cnVjdCB0Y19hY3Rpb24gKmEsCi0gICAgICAgICAgICAgaW50IG92ciwgaW50IGJpbmQpCi17Ci0Jc3RydWN0IHJ0YXR0ciAqdGJbVENBX0lQVF9NQVhdOwotCXN0cnVjdCB0Y2ZfaXB0ICpwOwotCXN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0ZCwgKnQ7Ci0JY2hhciAqdG5hbWU7Ci0JaW50IHJldCA9IDAsIGVycjsKLQl1MzIgaG9vayA9IDA7Ci0JdTMyIGluZGV4ID0gMDsKLQotCWlmIChydGEgPT0gTlVMTCB8fCBydGF0dHJfcGFyc2VfbmVzdGVkKHRiLCBUQ0FfSVBUX01BWCwgcnRhKSA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHRiW1RDQV9JUFRfSE9PSy0xXSA9PSBOVUxMIHx8Ci0JICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9JUFRfSE9PSy0xXSkgPCBzaXplb2YodTMyKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHRiW1RDQV9JUFRfVEFSRy0xXSA9PSBOVUxMIHx8Ci0JICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9JUFRfVEFSRy0xXSkgPCBzaXplb2YoKnQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQl0ZCA9IChzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqKVJUQV9EQVRBKHRiW1RDQV9JUFRfVEFSRy0xXSk7Ci0JaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9JUFRfVEFSRy0xXSkgPCB0ZC0+dS50YXJnZXRfc2l6ZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAodGJbVENBX0lQVF9JTkRFWC0xXSAhPSBOVUxMICYmCi0JICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9JUFRfSU5ERVgtMV0pID49IHNpemVvZih1MzIpKQotCQlpbmRleCA9ICoodTMyICopUlRBX0RBVEEodGJbVENBX0lQVF9JTkRFWC0xXSk7Ci0KLQlwID0gdGNmX2hhc2hfY2hlY2soaW5kZXgsIGEsIG92ciwgYmluZCk7Ci0JaWYgKHAgPT0gTlVMTCkgewotCQlwID0gdGNmX2hhc2hfY3JlYXRlKGluZGV4LCBlc3QsIGEsIHNpemVvZigqcCksIG92ciwgYmluZCk7Ci0JCWlmIChwID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJcmV0ID0gQUNUX1BfQ1JFQVRFRDsKLQl9IGVsc2UgewotCQlpZiAoIW92cikgewotCQkJdGNmX2lwdF9yZWxlYXNlKHAsIGJpbmQpOwotCQkJcmV0dXJuIC1FRVhJU1Q7Ci0JCX0KLQl9Ci0KLQlob29rID0gKih1MzIgKilSVEFfREFUQSh0YltUQ0FfSVBUX0hPT0stMV0pOwotCi0JZXJyID0gLUVOT01FTTsKLQl0bmFtZSA9IGttYWxsb2MoSUZOQU1TSVosIEdGUF9LRVJORUwpOwotCWlmICh0bmFtZSA9PSBOVUxMKQotCQlnb3RvIGVycjE7Ci0JaWYgKHRiW1RDQV9JUFRfVEFCTEUgLSAxXSA9PSBOVUxMIHx8Ci0JICAgIHJ0YXR0cl9zdHJsY3B5KHRuYW1lLCB0YltUQ0FfSVBUX1RBQkxFLTFdLCBJRk5BTVNJWikgPj0gSUZOQU1TSVopCi0JCXN0cmNweSh0bmFtZSwgIm1hbmdsZSIpOwotCi0JdCA9IGttYWxsb2ModGQtPnUudGFyZ2V0X3NpemUsIEdGUF9LRVJORUwpOwotCWlmICh0ID09IE5VTEwpCi0JCWdvdG8gZXJyMjsKLQltZW1jcHkodCwgdGQsIHRkLT51LnRhcmdldF9zaXplKTsKLQotCWlmICgoZXJyID0gaXB0X2luaXRfdGFyZ2V0KHQsIHRuYW1lLCBob29rKSkgPCAwKQotCQlnb3RvIGVycjM7Ci0KLQlzcGluX2xvY2tfYmgoJnAtPmxvY2spOwotCWlmIChyZXQgIT0gQUNUX1BfQ1JFQVRFRCkgewotCQlpcHRfZGVzdHJveV90YXJnZXQocC0+dCk7Ci0JCWtmcmVlKHAtPnRuYW1lKTsKLQkJa2ZyZWUocC0+dCk7Ci0JfQotCXAtPnRuYW1lID0gdG5hbWU7Ci0JcC0+dCAgICAgPSB0OwotCXAtPmhvb2sgID0gaG9vazsKLQlzcGluX3VubG9ja19iaCgmcC0+bG9jayk7Ci0JaWYgKHJldCA9PSBBQ1RfUF9DUkVBVEVEKQotCQl0Y2ZfaGFzaF9pbnNlcnQocCk7Ci0JcmV0dXJuIHJldDsKLQotZXJyMzoKLQlrZnJlZSh0KTsKLWVycjI6Ci0Ja2ZyZWUodG5hbWUpOwotZXJyMToKLQlrZnJlZShwKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50Ci10Y2ZfaXB0X2NsZWFudXAoc3RydWN0IHRjX2FjdGlvbiAqYSwgaW50IGJpbmQpCi17Ci0Jc3RydWN0IHRjZl9pcHQgKnAgPSBQUklWKGEsIGlwdCk7Ci0JcmV0dXJuIHRjZl9pcHRfcmVsZWFzZShwLCBiaW5kKTsKLX0KLQotc3RhdGljIGludAotdGNmX2lwdChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCi17Ci0JaW50IHJldCA9IDAsIHJlc3VsdCA9IDA7Ci0Jc3RydWN0IHRjZl9pcHQgKnAgPSBQUklWKGEsIGlwdCk7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpwc2tiOwotCi0JaWYgKHNrYl9jbG9uZWQoc2tiKSkgewotCQlpZiAocHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpKQotCQkJcmV0dXJuIFRDX0FDVF9VTlNQRUM7Ci0JfQotCi0Jc3Bpbl9sb2NrKCZwLT5sb2NrKTsKLQotCXAtPnRtLmxhc3R1c2UgPSBqaWZmaWVzOwotCXAtPmJzdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKLQlwLT5ic3RhdHMucGFja2V0cysrOwotCi0JLyogeWVzLCB3ZSBoYXZlIHRvIHdvcnJ5IGFib3V0IGJvdGggaW4gYW5kIG91dCBkZXYKLQkgd29ycnkgbGF0ZXIgLSBkYW5nZXIgLSB0aGlzIEFQSSBzZWVtcyB0byBoYXZlIGNoYW5nZWQKLQkgZnJvbSBlYXJsaWVyIGtlcm5lbHMgKi8KLQotCXJldCA9IHAtPnQtPnUua2VybmVsLnRhcmdldC0+dGFyZ2V0KCZza2IsIHNrYi0+ZGV2LCBOVUxMLAotCQkJCQkgICAgcC0+aG9vaywgcC0+dC0+ZGF0YSwgTlVMTCk7Ci0Jc3dpdGNoIChyZXQpIHsKLQljYXNlIE5GX0FDQ0VQVDoKLQkJcmVzdWx0ID0gVENfQUNUX09LOwotCQlicmVhazsKLQljYXNlIE5GX0RST1A6Ci0JCXJlc3VsdCA9IFRDX0FDVF9TSE9UOwotCQlwLT5xc3RhdHMuZHJvcHMrKzsKLQkJYnJlYWs7Ci0JY2FzZSBJUFRfQ09OVElOVUU6Ci0JCXJlc3VsdCA9IFRDX0FDVF9QSVBFOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKCJCb2d1cyBuZXRmaWx0ZXIgY29kZSAlZCBhc3N1bWUgQUNDRVBUXG4iLCByZXQpOwotCQlyZXN1bHQgPSBUQ19QT0xJQ0VfT0s7Ci0JCWJyZWFrOwotCX0KLQlzcGluX3VubG9jaygmcC0+bG9jayk7Ci0JcmV0dXJuIHJlc3VsdDsKLQotfQotCi1zdGF0aWMgaW50Ci10Y2ZfaXB0X2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjX2FjdGlvbiAqYSwgaW50IGJpbmQsIGludCByZWYpCi17Ci0Jc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnQ7Ci0Jc3RydWN0IHRjZl90IHRtOwotCXN0cnVjdCB0Y19jbnQgYzsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOwotCXN0cnVjdCB0Y2ZfaXB0ICpwID0gUFJJVihhLCBpcHQpOwotCi0JLyogZm9yIHNpbXBsZSB0YXJnZXRzIGtlcm5lbCBzaXplID09IHVzZXIgc2l6ZQotCSoqIHVzZXIgbmFtZSA9IHRhcmdldCBuYW1lCi0JKiogZm9yIGZvb2xwcm9vZiB5b3UgbmVlZCB0byBub3QgYXNzdW1lIHRoaXMKLQkqLwotCi0JdCA9IGttYWxsb2MocC0+dC0+dS51c2VyLnRhcmdldF9zaXplLCBHRlBfQVRPTUlDKTsKLQlpZiAodCA9PSBOVUxMKQotCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOwotCi0JYy5iaW5kY250ID0gcC0+YmluZGNudCAtIGJpbmQ7Ci0JYy5yZWZjbnQgPSBwLT5yZWZjbnQgLSByZWY7Ci0JbWVtY3B5KHQsIHAtPnQsIHAtPnQtPnUudXNlci50YXJnZXRfc2l6ZSk7Ci0Jc3RyY3B5KHQtPnUudXNlci5uYW1lLCBwLT50LT51Lmtlcm5lbC50YXJnZXQtPm5hbWUpOwotCi0JRFBSSU5USygiXHR0Y2ZfaXB0X2R1bXAgdGFibGVuYW1lICVzIGxlbmd0aCAlZFxuIiwgcC0+dG5hbWUsCi0JCXN0cmxlbihwLT50bmFtZSkpOwotCURQUklOVEsoIlx0ZHVtcCB0YXJnZXQgbmFtZSAlcyBzaXplICVkIHNpemUgdXNlciAlZCAiCi0JICAgICAgICAiZGF0YVswXSAleCBkYXRhWzFdICV4XG4iLCBwLT50LT51Lmtlcm5lbC50YXJnZXQtPm5hbWUsCi0JICAgICAgICBwLT50LT51LnRhcmdldF9zaXplLCBwLT50LT51LnVzZXIudGFyZ2V0X3NpemUsCi0JICAgICAgICBwLT50LT5kYXRhWzBdLCBwLT50LT5kYXRhWzFdKTsKLQlSVEFfUFVUKHNrYiwgVENBX0lQVF9UQVJHLCBwLT50LT51LnVzZXIudGFyZ2V0X3NpemUsIHQpOwotCVJUQV9QVVQoc2tiLCBUQ0FfSVBUX0lOREVYLCA0LCAmcC0+aW5kZXgpOwotCVJUQV9QVVQoc2tiLCBUQ0FfSVBUX0hPT0ssIDQsICZwLT5ob29rKTsKLQlSVEFfUFVUKHNrYiwgVENBX0lQVF9DTlQsIHNpemVvZihzdHJ1Y3QgdGNfY250KSwgJmMpOwotCVJUQV9QVVQoc2tiLCBUQ0FfSVBUX1RBQkxFLCBJRk5BTVNJWiwgcC0+dG5hbWUpOwotCXRtLmluc3RhbGwgPSBqaWZmaWVzX3RvX2Nsb2NrX3QoamlmZmllcyAtIHAtPnRtLmluc3RhbGwpOwotCXRtLmxhc3R1c2UgPSBqaWZmaWVzX3RvX2Nsb2NrX3QoamlmZmllcyAtIHAtPnRtLmxhc3R1c2UpOwotCXRtLmV4cGlyZXMgPSBqaWZmaWVzX3RvX2Nsb2NrX3QocC0+dG0uZXhwaXJlcyk7Ci0JUlRBX1BVVChza2IsIFRDQV9JUFRfVE0sIHNpemVvZiAodG0pLCAmdG0pOwotCWtmcmVlKHQpOwotCXJldHVybiBza2ItPmxlbjsKLQotICAgICAgcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKLQlrZnJlZSh0KTsKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdGNfYWN0aW9uX29wcyBhY3RfaXB0X29wcyA9IHsKLQkua2luZAkJPQkiaXB0IiwKLQkudHlwZQkJPQlUQ0FfQUNUX0lQVCwKLQkuY2FwYWIJCT0JVENBX0NBUF9OT05FLAotCS5vd25lcgkJPQlUSElTX01PRFVMRSwKLQkuYWN0CQk9CXRjZl9pcHQsCi0JLmR1bXAJCT0JdGNmX2lwdF9kdW1wLAotCS5jbGVhbnVwCT0JdGNmX2lwdF9jbGVhbnVwLAotCS5sb29rdXAJCT0JdGNmX2hhc2hfc2VhcmNoLAotCS5pbml0CQk9CXRjZl9pcHRfaW5pdCwKLQkud2FsawkJPQl0Y2ZfZ2VuZXJpY193YWxrZXIKLX07Ci0KLU1PRFVMRV9BVVRIT1IoIkphbWFsIEhhZGkgU2FsaW0oMjAwMi00KSIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJJcHRhYmxlcyB0YXJnZXQgYWN0aW9ucyIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgaW50IF9faW5pdAotaXB0X2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JcmV0dXJuIHRjZl9yZWdpc3Rlcl9hY3Rpb24oJmFjdF9pcHRfb3BzKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0Ci1pcHRfY2xlYW51cF9tb2R1bGUodm9pZCkKLXsKLQl0Y2ZfdW5yZWdpc3Rlcl9hY3Rpb24oJmFjdF9pcHRfb3BzKTsKLX0KLQotbW9kdWxlX2luaXQoaXB0X2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KGlwdF9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvbWlycmVkLmMgYi9uZXQvc2NoZWQvbWlycmVkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZDA2OTEuLjAwMDAwMDAKLS0tIGEvbmV0L3NjaGVkL21pcnJlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qCi0gKiBuZXQvc2NoZWQvbWlycmVkLmMJcGFja2V0IG1pcnJvcmluZyBhbmQgcmVkaXJlY3QgYWN0aW9ucwotICoKLSAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEF1dGhvcnM6CUphbWFsIEhhZGkgU2FsaW0gKDIwMDItNCkKLSAqCi0gKiBUT0RPOiBBZGQgaW5ncmVzcyBzdXBwb3J0IChhbmQgc29ja2V0IHJlZGlyZWN0IHN1cHBvcnQpCi0gKgotICovCi0KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0jaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3RjX2FjdC90Y19taXJyZWQuaD4KLSNpbmNsdWRlIDxuZXQvdGNfYWN0L3RjX21pcnJlZC5oPgotCi0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLQotCi0vKiB1c2UgZ2VuZXJpYyBoYXNoIHRhYmxlICovCi0jZGVmaW5lIE1ZX1RBQl9TSVpFICAgICA4Ci0jZGVmaW5lIE1ZX1RBQl9NQVNLICAgICAoTVlfVEFCX1NJWkUgLSAxKQotc3RhdGljIHUzMiBpZHhfZ2VuOwotc3RhdGljIHN0cnVjdCB0Y2ZfbWlycmVkICp0Y2ZfbWlycmVkX2h0W01ZX1RBQl9TSVpFXTsKLXN0YXRpYyBERUZJTkVfUldMT0NLKG1pcnJlZF9sb2NrKTsKLQotLyogb3Zld3JyaWRlIHRoZSBkZWZhdWx0cyAqLwotI2RlZmluZSB0Y2Zfc3QJCXRjZl9taXJyZWQKLSNkZWZpbmUgdGNfc3QJCXRjX21pcnJlZAotI2RlZmluZSB0Y2ZfdF9sb2NrCW1pcnJlZF9sb2NrCi0jZGVmaW5lIHRjZl9odAkJdGNmX21pcnJlZF9odAotCi0jZGVmaW5lIENPTkZJR19ORVRfQUNUX0lOSVQgMQotI2luY2x1ZGUgPG5ldC9wa3RfYWN0Lmg+Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci10Y2ZfbWlycmVkX3JlbGVhc2Uoc3RydWN0IHRjZl9taXJyZWQgKnAsIGludCBiaW5kKQotewotCWlmIChwKSB7Ci0JCWlmIChiaW5kKQotCQkJcC0+YmluZGNudC0tOwotCQlwLT5yZWZjbnQtLTsKLQkJaWYoIXAtPmJpbmRjbnQgJiYgcC0+cmVmY250IDw9IDApIHsKLQkJCWRldl9wdXQocC0+ZGV2KTsKLQkJCXRjZl9oYXNoX2Rlc3Ryb3kocCk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotdGNmX21pcnJlZF9pbml0KHN0cnVjdCBydGF0dHIgKnJ0YSwgc3RydWN0IHJ0YXR0ciAqZXN0LCBzdHJ1Y3QgdGNfYWN0aW9uICphLAotICAgICAgICAgICAgICAgIGludCBvdnIsIGludCBiaW5kKQotewotCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9NSVJSRURfTUFYXTsKLQlzdHJ1Y3QgdGNfbWlycmVkICpwYXJtOwotCXN0cnVjdCB0Y2ZfbWlycmVkICpwOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOwotCWludCByZXQgPSAwOwotCWludCBva19wdXNoID0gMDsKLQotCWlmIChydGEgPT0gTlVMTCB8fCBydGF0dHJfcGFyc2VfbmVzdGVkKHRiLCBUQ0FfTUlSUkVEX01BWCwgcnRhKSA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHRiW1RDQV9NSVJSRURfUEFSTVMtMV0gPT0gTlVMTCB8fAotCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfTUlSUkVEX1BBUk1TLTFdKSA8IHNpemVvZigqcGFybSkpCi0JCXJldHVybiAtRUlOVkFMOwotCXBhcm0gPSBSVEFfREFUQSh0YltUQ0FfTUlSUkVEX1BBUk1TLTFdKTsKLQotCWlmIChwYXJtLT5pZmluZGV4KSB7Ci0JCWRldiA9IF9fZGV2X2dldF9ieV9pbmRleChwYXJtLT5pZmluZGV4KTsKLQkJaWYgKGRldiA9PSBOVUxMKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCXN3aXRjaCAoZGV2LT50eXBlKSB7Ci0JCQljYXNlIEFSUEhSRF9UVU5ORUw6Ci0JCQljYXNlIEFSUEhSRF9UVU5ORUw2OgotCQkJY2FzZSBBUlBIUkRfU0lUOgotCQkJY2FzZSBBUlBIUkRfSVBHUkU6Ci0JCQljYXNlIEFSUEhSRF9WT0lEOgotCQkJY2FzZSBBUlBIUkRfTk9ORToKLQkJCQlva19wdXNoID0gMDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJb2tfcHVzaCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwID0gdGNmX2hhc2hfY2hlY2socGFybS0+aW5kZXgsIGEsIG92ciwgYmluZCk7Ci0JaWYgKHAgPT0gTlVMTCkgewotCQlpZiAoIXBhcm0tPmlmaW5kZXgpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcCA9IHRjZl9oYXNoX2NyZWF0ZShwYXJtLT5pbmRleCwgZXN0LCBhLCBzaXplb2YoKnApLCBvdnIsIGJpbmQpOwotCQlpZiAocCA9PSBOVUxMKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCXJldCA9IEFDVF9QX0NSRUFURUQ7Ci0JfSBlbHNlIHsKLQkJaWYgKCFvdnIpIHsKLQkJCXRjZl9taXJyZWRfcmVsZWFzZShwLCBiaW5kKTsKLQkJCXJldHVybiAtRUVYSVNUOwotCQl9Ci0JfQotCi0Jc3Bpbl9sb2NrX2JoKCZwLT5sb2NrKTsKLQlwLT5hY3Rpb24gPSBwYXJtLT5hY3Rpb247Ci0JcC0+ZWFjdGlvbiA9IHBhcm0tPmVhY3Rpb247Ci0JaWYgKHBhcm0tPmlmaW5kZXgpIHsKLQkJcC0+aWZpbmRleCA9IHBhcm0tPmlmaW5kZXg7Ci0JCWlmIChyZXQgIT0gQUNUX1BfQ1JFQVRFRCkKLQkJCWRldl9wdXQocC0+ZGV2KTsKLQkJcC0+ZGV2ID0gZGV2OwotCQlkZXZfaG9sZChkZXYpOwotCQlwLT5va19wdXNoID0gb2tfcHVzaDsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnAtPmxvY2spOwotCWlmIChyZXQgPT0gQUNUX1BfQ1JFQVRFRCkKLQkJdGNmX2hhc2hfaW5zZXJ0KHApOwotCi0JRFBSSU5USygidGNmX21pcnJlZF9pbml0IGluZGV4ICVkIGFjdGlvbiAlZCBlYWN0aW9uICVkIGRldmljZSAlcyAiCi0JICAgICAgICAiaWZpbmRleCAlZFxuIiwgcGFybS0+aW5kZXgsIHBhcm0tPmFjdGlvbiwgcGFybS0+ZWFjdGlvbiwKLQkgICAgICAgIGRldi0+bmFtZSwgcGFybS0+aWZpbmRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludAotdGNmX21pcnJlZF9jbGVhbnVwKHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kKQotewotCXN0cnVjdCB0Y2ZfbWlycmVkICpwID0gUFJJVihhLCBtaXJyZWQpOwotCi0JaWYgKHAgIT0gTlVMTCkKLQkJcmV0dXJuIHRjZl9taXJyZWRfcmVsZWFzZShwLCBiaW5kKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotdGNmX21pcnJlZChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCi17Ci0Jc3RydWN0IHRjZl9taXJyZWQgKnAgPSBQUklWKGEsIG1pcnJlZCk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IE5VTEw7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpwc2tiOwotCXUzMiBhdCA9IEdfVENfQVQoc2tiLT50Y192ZXJkKTsKLQotCXNwaW5fbG9jaygmcC0+bG9jayk7Ci0KLQlkZXYgPSBwLT5kZXY7Ci0JcC0+dG0ubGFzdHVzZSA9IGppZmZpZXM7Ci0KLQlpZiAoIShkZXYtPmZsYWdzJklGRl9VUCkgKSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoIm1pcnJlZCB0byBIb3VzdG9uOiBkZXZpY2UgJXMgaXMgZ29uZSFcbiIsCi0JCQkgICAgICAgZGV2LT5uYW1lKTsKLWJhZF9taXJyZWQ6Ci0JCWlmIChza2IyICE9IE5VTEwpCi0JCQlrZnJlZV9za2Ioc2tiMik7Ci0JCXAtPnFzdGF0cy5vdmVybGltaXRzKys7Ci0JCXAtPmJzdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKLQkJcC0+YnN0YXRzLnBhY2tldHMrKzsKLQkJc3Bpbl91bmxvY2soJnAtPmxvY2spOwotCQkvKiBzaG91bGQgd2UgYmUgYXNraW5nIGZvciBwYWNrZXQgdG8gYmUgZHJvcHBlZD8KLQkJICogbWF5IG1ha2Ugc2Vuc2UgZm9yIHJlZGlyZWN0IGNhc2Ugb25seQotCQkqLwotCQlyZXR1cm4gVENfQUNUX1NIT1Q7Ci0JfQotCi0Jc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOwotCWlmIChza2IyID09IE5VTEwpCi0JCWdvdG8gYmFkX21pcnJlZDsKLQlpZiAocC0+ZWFjdGlvbiAhPSBUQ0FfRUdSRVNTX01JUlJPUiAmJiBwLT5lYWN0aW9uICE9IFRDQV9FR1JFU1NfUkVESVIpIHsKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50aygidGNmX21pcnJlZCB1bmtub3duIGFjdGlvbiAlZFxuIiwgcC0+ZWFjdGlvbik7Ci0JCWdvdG8gYmFkX21pcnJlZDsKLQl9Ci0KLQlwLT5ic3RhdHMuYnl0ZXMgKz0gc2tiMi0+bGVuOwotCXAtPmJzdGF0cy5wYWNrZXRzKys7Ci0JaWYgKCEoYXQgJiBBVF9FR1JFU1MpKQotCQlpZiAocC0+b2tfcHVzaCkKLQkJCXNrYl9wdXNoKHNrYjIsIHNrYjItPmRldi0+aGFyZF9oZWFkZXJfbGVuKTsKLQotCS8qIG1pcnJvciBpcyBhbHdheXMgc3dhbGxvd2VkICovCi0JaWYgKHAtPmVhY3Rpb24gIT0gVENBX0VHUkVTU19NSVJST1IpCi0JCXNrYjItPnRjX3ZlcmQgPSBTRVRfVENfRlJPTShza2IyLT50Y192ZXJkLCBhdCk7Ci0KLQlza2IyLT5kZXYgPSBkZXY7Ci0Jc2tiMi0+aW5wdXRfZGV2ID0gc2tiLT5kZXY7Ci0JZGV2X3F1ZXVlX3htaXQoc2tiMik7Ci0Jc3Bpbl91bmxvY2soJnAtPmxvY2spOwotCXJldHVybiBwLT5hY3Rpb247Ci19Ci0KLXN0YXRpYyBpbnQKLXRjZl9taXJyZWRfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQgYmluZCwgaW50IHJlZikKLXsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOwotCXN0cnVjdCB0Y19taXJyZWQgb3B0OwotCXN0cnVjdCB0Y2ZfbWlycmVkICpwID0gUFJJVihhLCBtaXJyZWQpOwotCXN0cnVjdCB0Y2ZfdCB0OwotCi0Jb3B0LmluZGV4ID0gcC0+aW5kZXg7Ci0Jb3B0LmFjdGlvbiA9IHAtPmFjdGlvbjsKLQlvcHQucmVmY250ID0gcC0+cmVmY250IC0gcmVmOwotCW9wdC5iaW5kY250ID0gcC0+YmluZGNudCAtIGJpbmQ7Ci0Jb3B0LmVhY3Rpb24gPSBwLT5lYWN0aW9uOwotCW9wdC5pZmluZGV4ID0gcC0+aWZpbmRleDsKLQlEUFJJTlRLKCJ0Y2ZfbWlycmVkX2R1bXAgaW5kZXggJWQgYWN0aW9uICVkIGVhY3Rpb24gJWQgaWZpbmRleCAlZFxuIiwKLQkgICAgICAgICBwLT5pbmRleCwgcC0+YWN0aW9uLCBwLT5lYWN0aW9uLCBwLT5pZmluZGV4KTsKLQlSVEFfUFVUKHNrYiwgVENBX01JUlJFRF9QQVJNUywgc2l6ZW9mKG9wdCksICZvcHQpOwotCXQuaW5zdGFsbCA9IGppZmZpZXNfdG9fY2xvY2tfdChqaWZmaWVzIC0gcC0+dG0uaW5zdGFsbCk7Ci0JdC5sYXN0dXNlID0gamlmZmllc190b19jbG9ja190KGppZmZpZXMgLSBwLT50bS5sYXN0dXNlKTsKLQl0LmV4cGlyZXMgPSBqaWZmaWVzX3RvX2Nsb2NrX3QocC0+dG0uZXhwaXJlcyk7Ci0JUlRBX1BVVChza2IsIFRDQV9NSVJSRURfVE0sIHNpemVvZih0KSwgJnQpOwotCXJldHVybiBza2ItPmxlbjsKLQotICAgICAgcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdGNfYWN0aW9uX29wcyBhY3RfbWlycmVkX29wcyA9IHsKLQkua2luZAkJPQkibWlycmVkIiwKLQkudHlwZQkJPQlUQ0FfQUNUX01JUlJFRCwKLQkuY2FwYWIJCT0JVENBX0NBUF9OT05FLAotCS5vd25lcgkJPQlUSElTX01PRFVMRSwKLQkuYWN0CQk9CXRjZl9taXJyZWQsCi0JLmR1bXAJCT0JdGNmX21pcnJlZF9kdW1wLAotCS5jbGVhbnVwCT0JdGNmX21pcnJlZF9jbGVhbnVwLAotCS5sb29rdXAJCT0JdGNmX2hhc2hfc2VhcmNoLAotCS5pbml0CQk9CXRjZl9taXJyZWRfaW5pdCwKLQkud2FsawkJPQl0Y2ZfZ2VuZXJpY193YWxrZXIKLX07Ci0KLU1PRFVMRV9BVVRIT1IoIkphbWFsIEhhZGkgU2FsaW0oMjAwMikiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIE1pcnJvci9yZWRpcmVjdCBhY3Rpb25zIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyBpbnQgX19pbml0Ci1taXJyZWRfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlwcmludGsoIk1pcnJvci9yZWRpcmVjdCBhY3Rpb24gb25cbiIpOwotCXJldHVybiB0Y2ZfcmVnaXN0ZXJfYWN0aW9uKCZhY3RfbWlycmVkX29wcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdAotbWlycmVkX2NsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0JdGNmX3VucmVnaXN0ZXJfYWN0aW9uKCZhY3RfbWlycmVkX29wcyk7Ci19Ci0KLW1vZHVsZV9pbml0KG1pcnJlZF9pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChtaXJyZWRfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3BlZGl0LmMgYi9uZXQvc2NoZWQvcGVkaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3ZDI0Zi4uMDAwMDAwMAotLS0gYS9uZXQvc2NoZWQvcGVkaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vKgotICogbmV0L3NjaGVkL3BlZGl0LmMJR2VuZXJpYyBwYWNrZXQgZWRpdG9yCi0gKgotICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogQXV0aG9yczoJSmFtYWwgSGFkaSBTYWxpbSAoMjAwMi00KQotICovCi0KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0jaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3RjX2FjdC90Y19wZWRpdC5oPgotI2luY2x1ZGUgPG5ldC90Y19hY3QvdGNfcGVkaXQuaD4KLQotCi0jZGVmaW5lIFBFRElUX0RFQiAxCi0KLS8qIHVzZSBnZW5lcmljIGhhc2ggdGFibGUgKi8KLSNkZWZpbmUgTVlfVEFCX1NJWkUgICAgIDE2Ci0jZGVmaW5lIE1ZX1RBQl9NQVNLICAgICAxNQotc3RhdGljIHUzMiBpZHhfZ2VuOwotc3RhdGljIHN0cnVjdCB0Y2ZfcGVkaXQgKnRjZl9wZWRpdF9odFtNWV9UQUJfU0laRV07Ci1zdGF0aWMgREVGSU5FX1JXTE9DSyhwZWRpdF9sb2NrKTsKLQotI2RlZmluZSB0Y2Zfc3QJCXRjZl9wZWRpdAotI2RlZmluZSB0Y19zdAkJdGNfcGVkaXQKLSNkZWZpbmUgdGNmX3RfbG9jawlwZWRpdF9sb2NrCi0jZGVmaW5lIHRjZl9odAkJdGNmX3BlZGl0X2h0Ci0KLSNkZWZpbmUgQ09ORklHX05FVF9BQ1RfSU5JVCAxCi0jaW5jbHVkZSA8bmV0L3BrdF9hY3QuaD4KLQotc3RhdGljIGludAotdGNmX3BlZGl0X2luaXQoc3RydWN0IHJ0YXR0ciAqcnRhLCBzdHJ1Y3QgcnRhdHRyICplc3QsIHN0cnVjdCB0Y19hY3Rpb24gKmEsCi0gICAgICAgICAgICAgICBpbnQgb3ZyLCBpbnQgYmluZCkKLXsKLQlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfUEVESVRfTUFYXTsKLQlzdHJ1Y3QgdGNfcGVkaXQgKnBhcm07Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHRjZl9wZWRpdCAqcDsKLQlzdHJ1Y3QgdGNfcGVkaXRfa2V5ICprZXlzID0gTlVMTDsKLQlpbnQga3NpemU7Ci0KLQlpZiAocnRhID09IE5VTEwgfHwgcnRhdHRyX3BhcnNlX25lc3RlZCh0YiwgVENBX1BFRElUX01BWCwgcnRhKSA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHRiW1RDQV9QRURJVF9QQVJNUyAtIDFdID09IE5VTEwgfHwKLQkgICAgUlRBX1BBWUxPQUQodGJbVENBX1BFRElUX1BBUk1TLTFdKSA8IHNpemVvZigqcGFybSkpCi0JCXJldHVybiAtRUlOVkFMOwotCXBhcm0gPSBSVEFfREFUQSh0YltUQ0FfUEVESVRfUEFSTVMtMV0pOwotCWtzaXplID0gcGFybS0+bmtleXMgKiBzaXplb2Yoc3RydWN0IHRjX3BlZGl0X2tleSk7Ci0JaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9QRURJVF9QQVJNUy0xXSkgPCBzaXplb2YoKnBhcm0pICsga3NpemUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcCA9IHRjZl9oYXNoX2NoZWNrKHBhcm0tPmluZGV4LCBhLCBvdnIsIGJpbmQpOwotCWlmIChwID09IE5VTEwpIHsKLQkJaWYgKCFwYXJtLT5ua2V5cykKLQkJCXJldHVybiAtRUlOVkFMOwotCQlwID0gdGNmX2hhc2hfY3JlYXRlKHBhcm0tPmluZGV4LCBlc3QsIGEsIHNpemVvZigqcCksIG92ciwgYmluZCk7Ci0JCWlmIChwID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJa2V5cyA9IGttYWxsb2Moa3NpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoa2V5cyA9PSBOVUxMKSB7Ci0JCQlrZnJlZShwKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCXJldCA9IEFDVF9QX0NSRUFURUQ7Ci0JfSBlbHNlIHsKLQkJaWYgKCFvdnIpIHsKLQkJCXRjZl9oYXNoX3JlbGVhc2UocCwgYmluZCk7Ci0JCQlyZXR1cm4gLUVFWElTVDsKLQkJfQotCQlpZiAocC0+bmtleXMgJiYgcC0+bmtleXMgIT0gcGFybS0+bmtleXMpIHsKLQkJCWtleXMgPSBrbWFsbG9jKGtzaXplLCBHRlBfS0VSTkVMKTsKLQkJCWlmIChrZXlzID09IE5VTEwpCi0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9Ci0KLQlzcGluX2xvY2tfYmgoJnAtPmxvY2spOwotCXAtPmZsYWdzID0gcGFybS0+ZmxhZ3M7Ci0JcC0+YWN0aW9uID0gcGFybS0+YWN0aW9uOwotCWlmIChrZXlzKSB7Ci0JCWtmcmVlKHAtPmtleXMpOwotCQlwLT5rZXlzID0ga2V5czsKLQkJcC0+bmtleXMgPSBwYXJtLT5ua2V5czsKLQl9Ci0JbWVtY3B5KHAtPmtleXMsIHBhcm0tPmtleXMsIGtzaXplKTsKLQlzcGluX3VubG9ja19iaCgmcC0+bG9jayk7Ci0JaWYgKHJldCA9PSBBQ1RfUF9DUkVBVEVEKQotCQl0Y2ZfaGFzaF9pbnNlcnQocCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludAotdGNmX3BlZGl0X2NsZWFudXAoc3RydWN0IHRjX2FjdGlvbiAqYSwgaW50IGJpbmQpCi17Ci0Jc3RydWN0IHRjZl9wZWRpdCAqcCA9IFBSSVYoYSwgcGVkaXQpOwotCi0JaWYgKHAgIT0gTlVMTCkgewotCQlzdHJ1Y3QgdGNfcGVkaXRfa2V5ICprZXlzID0gcC0+a2V5czsKLQkJaWYgKHRjZl9oYXNoX3JlbGVhc2UocCwgYmluZCkpIHsKLQkJCWtmcmVlKGtleXMpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXRjZl9wZWRpdChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCi17Ci0Jc3RydWN0IHRjZl9wZWRpdCAqcCA9IFBSSVYoYSwgcGVkaXQpOwotCXN0cnVjdCBza19idWZmICpza2IgPSAqcHNrYjsKLQlpbnQgaSwgbXVuZ2VkID0gMDsKLQl1OCAqcHB0cjsKLQotCWlmICghKHNrYi0+dGNfdmVyZCAmIFRDX09LMk1VTkdFKSkgewotCQkvKiBzaG91bGQgd2Ugc2V0IHNrYi0+Y2xvbmVkPyAqLwotCQlpZiAocHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpKSB7Ci0JCQlyZXR1cm4gcC0+YWN0aW9uOwotCQl9Ci0JfQotCi0JcHB0ciA9IHNrYi0+bmgucmF3OwotCi0Jc3Bpbl9sb2NrKCZwLT5sb2NrKTsKLQotCXAtPnRtLmxhc3R1c2UgPSBqaWZmaWVzOwotCi0JaWYgKHAtPm5rZXlzID4gMCkgewotCQlzdHJ1Y3QgdGNfcGVkaXRfa2V5ICp0a2V5ID0gcC0+a2V5czsKLQotCQlmb3IgKGkgPSBwLT5ua2V5czsgaSA+IDA7IGktLSwgdGtleSsrKSB7Ci0JCQl1MzIgKnB0cjsKLQkJCWludCBvZmZzZXQgPSB0a2V5LT5vZmY7Ci0KLQkJCWlmICh0a2V5LT5vZmZtYXNrKSB7Ci0JCQkJaWYgKHNrYi0+bGVuID4gdGtleS0+YXQpIHsKLQkJCQkJIGNoYXIgKmogPSBwcHRyICsgdGtleS0+YXQ7Ci0JCQkJCSBvZmZzZXQgKz0gKCgqaiAmIHRrZXktPm9mZm1hc2spID4+IAotCQkJCQkgICAgICAgICAgIHRrZXktPnNoaWZ0KTsKLQkJCQl9IGVsc2UgewotCQkJCQlnb3RvIGJhZDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChvZmZzZXQgJSA0KSB7Ci0JCQkJcHJpbnRrKCJvZmZzZXQgbXVzdCBiZSBvbiAzMiBiaXQgYm91bmRhcmllc1xuIik7Ci0JCQkJZ290byBiYWQ7Ci0JCQl9Ci0JCQlpZiAoc2tiLT5sZW4gPCAwIHx8IChvZmZzZXQgPiAwICYmIG9mZnNldCA+IHNrYi0+bGVuKSkgewotCQkJCXByaW50aygib2Zmc2V0ICVkIGNhbnQgZXhjZWVkIHBrdCBsZW5ndGggJWRcbiIsCi0JCQkJICAgICAgIG9mZnNldCwgc2tiLT5sZW4pOwotCQkJCWdvdG8gYmFkOwotCQkJfQotCi0JCQlwdHIgPSAodTMyICopKHBwdHIrb2Zmc2V0KTsKLQkJCS8qIGp1c3QgZG8gaXQsIGJhYnkgKi8KLQkJCSpwdHIgPSAoKCpwdHIgJiB0a2V5LT5tYXNrKSBeIHRrZXktPnZhbCk7Ci0JCQltdW5nZWQrKzsKLQkJfQotCQkKLQkJaWYgKG11bmdlZCkKLQkJCXNrYi0+dGNfdmVyZCA9IFNFVF9UQ19NVU5HRUQoc2tiLT50Y192ZXJkKTsKLQkJZ290byBkb25lOwotCX0gZWxzZSB7Ci0JCXByaW50aygicGVkaXQgQlVHOiBpbmRleCAlZFxuIixwLT5pbmRleCk7Ci0JfQotCi1iYWQ6Ci0JcC0+cXN0YXRzLm92ZXJsaW1pdHMrKzsKLWRvbmU6Ci0JcC0+YnN0YXRzLmJ5dGVzICs9IHNrYi0+bGVuOwotCXAtPmJzdGF0cy5wYWNrZXRzKys7Ci0Jc3Bpbl91bmxvY2soJnAtPmxvY2spOwotCXJldHVybiBwLT5hY3Rpb247Ci19Ci0KLXN0YXRpYyBpbnQKLXRjZl9wZWRpdF9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsaW50IGJpbmQsIGludCByZWYpCi17Ci0JdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKLQlzdHJ1Y3QgdGNfcGVkaXQgKm9wdDsKLQlzdHJ1Y3QgdGNmX3BlZGl0ICpwID0gUFJJVihhLCBwZWRpdCk7Ci0Jc3RydWN0IHRjZl90IHQ7Ci0JaW50IHM7IAotCQkKLQlzID0gc2l6ZW9mKCpvcHQpICsgcC0+bmtleXMgKiBzaXplb2Yoc3RydWN0IHRjX3BlZGl0X2tleSk7Ci0KLQkvKiBuZXRsaW5rIHNwaW5sb2NrcyBoZWxkIGFib3ZlIHVzIC0gbXVzdCB1c2UgQVRPTUlDICovCi0Jb3B0ID0ga21hbGxvYyhzLCBHRlBfQVRPTUlDKTsKLQlpZiAob3B0ID09IE5VTEwpCi0JCXJldHVybiAtRU5PQlVGUzsKLQltZW1zZXQob3B0LCAwLCBzKTsKLQotCW1lbWNweShvcHQtPmtleXMsIHAtPmtleXMsIHAtPm5rZXlzICogc2l6ZW9mKHN0cnVjdCB0Y19wZWRpdF9rZXkpKTsKLQlvcHQtPmluZGV4ID0gcC0+aW5kZXg7Ci0Jb3B0LT5ua2V5cyA9IHAtPm5rZXlzOwotCW9wdC0+ZmxhZ3MgPSBwLT5mbGFnczsKLQlvcHQtPmFjdGlvbiA9IHAtPmFjdGlvbjsKLQlvcHQtPnJlZmNudCA9IHAtPnJlZmNudCAtIHJlZjsKLQlvcHQtPmJpbmRjbnQgPSBwLT5iaW5kY250IC0gYmluZDsKLQotCi0jaWZkZWYgUEVESVRfREVCCi0JeyAgICAgICAgICAgICAgICAKLQkJLyogRGVidWcgLSBnZXQgcmlkIG9mIGxhdGVyICovCi0JCWludCBpOwotCQlzdHJ1Y3QgdGNfcGVkaXRfa2V5ICprZXkgPSBvcHQtPmtleXM7Ci0KLQkJZm9yIChpPTA7IGk8b3B0LT5ua2V5czsgaSsrLCBrZXkrKykgewotCQkJcHJpbnRrKCAiXG4ga2V5ICMlZCIsaSk7Ci0JCQlwcmludGsoICIgIGF0ICVkOiB2YWwgJTA4eCBtYXNrICUwOHgiLAotCQkJKHVuc2lnbmVkIGludClrZXktPm9mZiwKLQkJCSh1bnNpZ25lZCBpbnQpa2V5LT52YWwsCi0JCQkodW5zaWduZWQgaW50KWtleS0+bWFzayk7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCVJUQV9QVVQoc2tiLCBUQ0FfUEVESVRfUEFSTVMsIHMsIG9wdCk7Ci0JdC5pbnN0YWxsID0gamlmZmllc190b19jbG9ja190KGppZmZpZXMgLSBwLT50bS5pbnN0YWxsKTsKLQl0Lmxhc3R1c2UgPSBqaWZmaWVzX3RvX2Nsb2NrX3QoamlmZmllcyAtIHAtPnRtLmxhc3R1c2UpOwotCXQuZXhwaXJlcyA9IGppZmZpZXNfdG9fY2xvY2tfdChwLT50bS5leHBpcmVzKTsKLQlSVEFfUFVUKHNrYiwgVENBX1BFRElUX1RNLCBzaXplb2YodCksICZ0KTsKLQlyZXR1cm4gc2tiLT5sZW47Ci0KLXJ0YXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMKLXN0cnVjdCB0Y19hY3Rpb25fb3BzIGFjdF9wZWRpdF9vcHMgPSB7Ci0JLmtpbmQJCT0JInBlZGl0IiwKLQkudHlwZQkJPQlUQ0FfQUNUX1BFRElULAotCS5jYXBhYgkJPQlUQ0FfQ0FQX05PTkUsCi0JLm93bmVyCQk9CVRISVNfTU9EVUxFLAotCS5hY3QJCT0JdGNmX3BlZGl0LAotCS5kdW1wCQk9CXRjZl9wZWRpdF9kdW1wLAotCS5jbGVhbnVwCT0JdGNmX3BlZGl0X2NsZWFudXAsCi0JLmxvb2t1cAkJPQl0Y2ZfaGFzaF9zZWFyY2gsCi0JLmluaXQJCT0JdGNmX3BlZGl0X2luaXQsCi0JLndhbGsJCT0JdGNmX2dlbmVyaWNfd2Fsa2VyCi19OwotCi1NT0RVTEVfQVVUSE9SKCJKYW1hbCBIYWRpIFNhbGltKDIwMDItNCkiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiR2VuZXJpYyBQYWNrZXQgRWRpdG9yIGFjdGlvbnMiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIGludCBfX2luaXQKLXBlZGl0X2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JcmV0dXJuIHRjZl9yZWdpc3Rlcl9hY3Rpb24oJmFjdF9wZWRpdF9vcHMpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQKLXBlZGl0X2NsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0JdGNmX3VucmVnaXN0ZXJfYWN0aW9uKCZhY3RfcGVkaXRfb3BzKTsKLX0KLQotbW9kdWxlX2luaXQocGVkaXRfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQocGVkaXRfY2xlYW51cF9tb2R1bGUpOwotCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvcG9saWNlLmMgYi9uZXQvc2NoZWQvcG9saWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMzlmYjIuLjAwMDAwMDAKLS0tIGEvbmV0L3NjaGVkL3BvbGljZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjEzICswLDAgQEAKLS8qCi0gKiBuZXQvc2NoZWQvcG9saWNlLmMJSW5wdXQgcG9saWNlIGZpbHRlci4KLSAqCi0gKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+Ci0gKiAJCUogSGFkaSBTYWxpbSAoYWN0aW9uIGNoYW5nZXMpCi0gKi8KLQotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgotI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0jaW5jbHVkZSA8bmV0L2FjdF9hcGkuaD4KLQotI2RlZmluZSBMMlQocCxMKSAgICgocCktPlJfdGFiLT5kYXRhWyhMKT4+KHApLT5SX3RhYi0+cmF0ZS5jZWxsX2xvZ10pCi0jZGVmaW5lIEwyVF9QKHAsTCkgKChwKS0+UF90YWItPmRhdGFbKEwpPj4ocCktPlBfdGFiLT5yYXRlLmNlbGxfbG9nXSkKLSNkZWZpbmUgUFJJVihhKSAoKHN0cnVjdCB0Y2ZfcG9saWNlICopIChhKS0+cHJpdikKLQotLyogdXNlIGdlbmVyaWMgaGFzaCB0YWJsZSAqLwotI2RlZmluZSBNWV9UQUJfU0laRSAgICAgMTYKLSNkZWZpbmUgTVlfVEFCX01BU0sgICAgIDE1Ci1zdGF0aWMgdTMyIGlkeF9nZW47Ci1zdGF0aWMgc3RydWN0IHRjZl9wb2xpY2UgKnRjZl9wb2xpY2VfaHRbTVlfVEFCX1NJWkVdOwotLyogUG9saWNlciBoYXNoIHRhYmxlIGxvY2sgKi8KLXN0YXRpYyBERUZJTkVfUldMT0NLKHBvbGljZV9sb2NrKTsKLQotLyogRWFjaCBwb2xpY2VyIGlzIHNlcmlhbGl6ZWQgYnkgaXRzIGluZGl2aWR1YWwgc3BpbmxvY2sgKi8KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgdGNmX3BvbGljZV9oYXNoKHUzMiBpbmRleCkKLXsKLQlyZXR1cm4gaW5kZXgmMHhGOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgdGNmX3BvbGljZSAqIHRjZl9wb2xpY2VfbG9va3VwKHUzMiBpbmRleCkKLXsKLQlzdHJ1Y3QgdGNmX3BvbGljZSAqcDsKLQotCXJlYWRfbG9jaygmcG9saWNlX2xvY2spOwotCWZvciAocCA9IHRjZl9wb2xpY2VfaHRbdGNmX3BvbGljZV9oYXNoKGluZGV4KV07IHA7IHAgPSBwLT5uZXh0KSB7Ci0JCWlmIChwLT5pbmRleCA9PSBpbmRleCkKLQkJCWJyZWFrOwotCX0KLQlyZWFkX3VubG9jaygmcG9saWNlX2xvY2spOwotCXJldHVybiBwOwotfQotCi0jaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCi1zdGF0aWMgaW50IHRjZl9nZW5lcmljX3dhbGtlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgc3RydWN0IHRjX2FjdGlvbiAqYSkKLXsKLQlzdHJ1Y3QgdGNmX3BvbGljZSAqcDsKLQlpbnQgZXJyID0gMCwgaW5kZXggPSAtMSwgaSA9IDAsIHNfaSA9IDAsIG5faSA9IDA7Ci0Jc3RydWN0IHJ0YXR0ciAqcjsKLQotCXJlYWRfbG9jaygmcG9saWNlX2xvY2spOwotCi0Jc19pID0gY2ItPmFyZ3NbMF07Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTVlfVEFCX1NJWkU7IGkrKykgewotCQlwID0gdGNmX3BvbGljZV9odFt0Y2ZfcG9saWNlX2hhc2goaSldOwotCi0JCWZvciAoOyBwOyBwID0gcC0+bmV4dCkgewotCQkJaW5kZXgrKzsKLQkJCWlmIChpbmRleCA8IHNfaSkKLQkJCQljb250aW51ZTsKLQkJCWEtPnByaXYgPSBwOwotCQkJYS0+b3JkZXIgPSBpbmRleDsKLQkJCXIgPSAoc3RydWN0IHJ0YXR0ciopIHNrYi0+dGFpbDsKLQkJCVJUQV9QVVQoc2tiLCBhLT5vcmRlciwgMCwgTlVMTCk7Ci0JCQlpZiAodHlwZSA9PSBSVE1fREVMQUNUSU9OKQotCQkJCWVyciA9IHRjZl9hY3Rpb25fZHVtcF8xKHNrYiwgYSwgMCwgMSk7Ci0JCQllbHNlCi0JCQkJZXJyID0gdGNmX2FjdGlvbl9kdW1wXzEoc2tiLCBhLCAwLCAwKTsKLQkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJaW5kZXgtLTsKLQkJCQlza2JfdHJpbShza2IsICh1OCopciAtIHNrYi0+ZGF0YSk7Ci0JCQkJZ290byBkb25lOwotCQkJfQotCQkJci0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtICh1OCopcjsKLQkJCW5faSsrOwotCQl9Ci0JfQotZG9uZToKLQlyZWFkX3VubG9jaygmcG9saWNlX2xvY2spOwotCWlmIChuX2kpCi0JCWNiLT5hcmdzWzBdICs9IG5faTsKLQlyZXR1cm4gbl9pOwotCi1ydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsICh1OCopciAtIHNrYi0+ZGF0YSk7Ci0JZ290byBkb25lOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotdGNmX2hhc2hfc2VhcmNoKHN0cnVjdCB0Y19hY3Rpb24gKmEsIHUzMiBpbmRleCkKLXsKLQlzdHJ1Y3QgdGNmX3BvbGljZSAqcCA9IHRjZl9wb2xpY2VfbG9va3VwKGluZGV4KTsKLQotCWlmIChwICE9IE5VTEwpIHsKLQkJYS0+cHJpdiA9IHA7Ci0JCXJldHVybiAxOwotCX0gZWxzZSB7Ci0JCXJldHVybiAwOwotCX0KLX0KLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIHUzMiB0Y2ZfcG9saWNlX25ld19pbmRleCh2b2lkKQotewotCWRvIHsKLQkJaWYgKCsraWR4X2dlbiA9PSAwKQotCQkJaWR4X2dlbiA9IDE7Ci0JfSB3aGlsZSAodGNmX3BvbGljZV9sb29rdXAoaWR4X2dlbikpOwotCi0JcmV0dXJuIGlkeF9nZW47Ci19Ci0KLXZvaWQgdGNmX3BvbGljZV9kZXN0cm95KHN0cnVjdCB0Y2ZfcG9saWNlICpwKQotewotCXVuc2lnbmVkIGggPSB0Y2ZfcG9saWNlX2hhc2gocC0+aW5kZXgpOwotCXN0cnVjdCB0Y2ZfcG9saWNlICoqcDFwOwotCQotCWZvciAocDFwID0gJnRjZl9wb2xpY2VfaHRbaF07ICpwMXA7IHAxcCA9ICYoKnAxcCktPm5leHQpIHsKLQkJaWYgKCpwMXAgPT0gcCkgewotCQkJd3JpdGVfbG9ja19iaCgmcG9saWNlX2xvY2spOwotCQkJKnAxcCA9IHAtPm5leHQ7Ci0JCQl3cml0ZV91bmxvY2tfYmgoJnBvbGljZV9sb2NrKTsKLSNpZmRlZiBDT05GSUdfTkVUX0VTVElNQVRPUgotCQkJZ2VuX2tpbGxfZXN0aW1hdG9yKCZwLT5ic3RhdHMsICZwLT5yYXRlX2VzdCk7Ci0jZW5kaWYKLQkJCWlmIChwLT5SX3RhYikKLQkJCQlxZGlzY19wdXRfcnRhYihwLT5SX3RhYik7Ci0JCQlpZiAocC0+UF90YWIpCi0JCQkJcWRpc2NfcHV0X3J0YWIocC0+UF90YWIpOwotCQkJa2ZyZWUocCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JQlVHX1RSQVAoMCk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKLXN0YXRpYyBpbnQgdGNmX2FjdF9wb2xpY2VfbG9jYXRlKHN0cnVjdCBydGF0dHIgKnJ0YSwgc3RydWN0IHJ0YXR0ciAqZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRjX2FjdGlvbiAqYSwgaW50IG92ciwgaW50IGJpbmQpCi17Ci0JdW5zaWduZWQgaDsKLQlpbnQgcmV0ID0gMCwgZXJyOwotCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9QT0xJQ0VfTUFYXTsKLQlzdHJ1Y3QgdGNfcG9saWNlICpwYXJtOwotCXN0cnVjdCB0Y2ZfcG9saWNlICpwOwotCXN0cnVjdCBxZGlzY19yYXRlX3RhYmxlICpSX3RhYiA9IE5VTEwsICpQX3RhYiA9IE5VTEw7Ci0KLQlpZiAocnRhID09IE5VTEwgfHwgcnRhdHRyX3BhcnNlX25lc3RlZCh0YiwgVENBX1BPTElDRV9NQVgsIHJ0YSkgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICh0YltUQ0FfUE9MSUNFX1RCRi0xXSA9PSBOVUxMIHx8Ci0JICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9QT0xJQ0VfVEJGLTFdKSAhPSBzaXplb2YoKnBhcm0pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlwYXJtID0gUlRBX0RBVEEodGJbVENBX1BPTElDRV9UQkYtMV0pOwotCi0JaWYgKHRiW1RDQV9QT0xJQ0VfUkVTVUxULTFdICE9IE5VTEwgJiYKLQkgICAgUlRBX1BBWUxPQUQodGJbVENBX1BPTElDRV9SRVNVTFQtMV0pICE9IHNpemVvZih1MzIpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAodGJbVENBX1BPTElDRV9SRVNVTFQtMV0gIT0gTlVMTCAmJgotCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfUE9MSUNFX1JFU1VMVC0xXSkgIT0gc2l6ZW9mKHUzMikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHBhcm0tPmluZGV4ICYmIChwID0gdGNmX3BvbGljZV9sb29rdXAocGFybS0+aW5kZXgpKSAhPSBOVUxMKSB7Ci0JCWEtPnByaXYgPSBwOwotCQlpZiAoYmluZCkgewotCQkJcC0+YmluZGNudCArPSAxOwotCQkJcC0+cmVmY250ICs9IDE7Ci0JCX0KLQkJaWYgKG92cikKLQkJCWdvdG8gb3ZlcnJpZGU7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcCA9IGttYWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOwotCi0JcmV0ID0gQUNUX1BfQ1JFQVRFRDsKLQlwLT5yZWZjbnQgPSAxOwotCXNwaW5fbG9ja19pbml0KCZwLT5sb2NrKTsKLQlwLT5zdGF0c19sb2NrID0gJnAtPmxvY2s7Ci0JaWYgKGJpbmQpCi0JCXAtPmJpbmRjbnQgPSAxOwotb3ZlcnJpZGU6Ci0JaWYgKHBhcm0tPnJhdGUucmF0ZSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlSX3RhYiA9IHFkaXNjX2dldF9ydGFiKCZwYXJtLT5yYXRlLCB0YltUQ0FfUE9MSUNFX1JBVEUtMV0pOwotCQlpZiAoUl90YWIgPT0gTlVMTCkKLQkJCWdvdG8gZmFpbHVyZTsKLQkJaWYgKHBhcm0tPnBlYWtyYXRlLnJhdGUpIHsKLQkJCVBfdGFiID0gcWRpc2NfZ2V0X3J0YWIoJnBhcm0tPnBlYWtyYXRlLAotCQkJCQkgICAgICAgdGJbVENBX1BPTElDRV9QRUFLUkFURS0xXSk7Ci0JCQlpZiAocC0+UF90YWIgPT0gTlVMTCkgewotCQkJCXFkaXNjX3B1dF9ydGFiKFJfdGFiKTsKLQkJCQlnb3RvIGZhaWx1cmU7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyogTm8gZmFpbHVyZSBhbGxvd2VkIGFmdGVyIHRoaXMgcG9pbnQgKi8KLQlzcGluX2xvY2tfYmgoJnAtPmxvY2spOwotCWlmIChSX3RhYiAhPSBOVUxMKSB7Ci0JCXFkaXNjX3B1dF9ydGFiKHAtPlJfdGFiKTsKLQkJcC0+Ul90YWIgPSBSX3RhYjsKLQl9Ci0JaWYgKFBfdGFiICE9IE5VTEwpIHsKLQkJcWRpc2NfcHV0X3J0YWIocC0+UF90YWIpOwotCQlwLT5QX3RhYiA9IFBfdGFiOwotCX0KLQotCWlmICh0YltUQ0FfUE9MSUNFX1JFU1VMVC0xXSkKLQkJcC0+cmVzdWx0ID0gKih1MzIqKVJUQV9EQVRBKHRiW1RDQV9QT0xJQ0VfUkVTVUxULTFdKTsKLQlwLT50b2tzID0gcC0+YnVyc3QgPSBwYXJtLT5idXJzdDsKLQlwLT5tdHUgPSBwYXJtLT5tdHU7Ci0JaWYgKHAtPm10dSA9PSAwKSB7Ci0JCXAtPm10dSA9IH4wOwotCQlpZiAocC0+Ul90YWIpCi0JCQlwLT5tdHUgPSAyNTU8PHAtPlJfdGFiLT5yYXRlLmNlbGxfbG9nOwotCX0KLQlpZiAocC0+UF90YWIpCi0JCXAtPnB0b2tzID0gTDJUX1AocCwgcC0+bXR1KTsKLQlwLT5hY3Rpb24gPSBwYXJtLT5hY3Rpb247Ci0KLSNpZmRlZiBDT05GSUdfTkVUX0VTVElNQVRPUgotCWlmICh0YltUQ0FfUE9MSUNFX0FWUkFURS0xXSkKLQkJcC0+ZXdtYV9yYXRlID0gKih1MzIqKVJUQV9EQVRBKHRiW1RDQV9QT0xJQ0VfQVZSQVRFLTFdKTsKLQlpZiAoZXN0KQotCQlnZW5fcmVwbGFjZV9lc3RpbWF0b3IoJnAtPmJzdGF0cywgJnAtPnJhdGVfZXN0LCBwLT5zdGF0c19sb2NrLCBlc3QpOwotI2VuZGlmCi0KLQlzcGluX3VubG9ja19iaCgmcC0+bG9jayk7Ci0JaWYgKHJldCAhPSBBQ1RfUF9DUkVBVEVEKQotCQlyZXR1cm4gcmV0OwotCi0JUFNDSEVEX0dFVF9USU1FKHAtPnRfYyk7Ci0JcC0+aW5kZXggPSBwYXJtLT5pbmRleCA/IDogdGNmX3BvbGljZV9uZXdfaW5kZXgoKTsKLQloID0gdGNmX3BvbGljZV9oYXNoKHAtPmluZGV4KTsKLQl3cml0ZV9sb2NrX2JoKCZwb2xpY2VfbG9jayk7Ci0JcC0+bmV4dCA9IHRjZl9wb2xpY2VfaHRbaF07Ci0JdGNmX3BvbGljZV9odFtoXSA9IHA7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZwb2xpY2VfbG9jayk7Ci0KLQlhLT5wcml2ID0gcDsKLQlyZXR1cm4gcmV0OwotCi1mYWlsdXJlOgotCWlmIChyZXQgPT0gQUNUX1BfQ1JFQVRFRCkKLQkJa2ZyZWUocCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCB0Y2ZfYWN0X3BvbGljZV9jbGVhbnVwKHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kKQotewotCXN0cnVjdCB0Y2ZfcG9saWNlICpwID0gUFJJVihhKTsKLQotCWlmIChwICE9IE5VTEwpCi0JCXJldHVybiB0Y2ZfcG9saWNlX3JlbGVhc2UocCwgYmluZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGNmX2FjdF9wb2xpY2Uoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQotewotCXBzY2hlZF90aW1lX3Qgbm93OwotCXN0cnVjdCBza19idWZmICpza2IgPSAqcHNrYjsKLQlzdHJ1Y3QgdGNmX3BvbGljZSAqcCA9IFBSSVYoYSk7Ci0JbG9uZyB0b2tzOwotCWxvbmcgcHRva3MgPSAwOwotCi0Jc3Bpbl9sb2NrKCZwLT5sb2NrKTsKLQotCXAtPmJzdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKLQlwLT5ic3RhdHMucGFja2V0cysrOwotCi0jaWZkZWYgQ09ORklHX05FVF9FU1RJTUFUT1IKLQlpZiAocC0+ZXdtYV9yYXRlICYmIHAtPnJhdGVfZXN0LmJwcyA+PSBwLT5ld21hX3JhdGUpIHsKLQkJcC0+cXN0YXRzLm92ZXJsaW1pdHMrKzsKLQkJc3Bpbl91bmxvY2soJnAtPmxvY2spOwotCQlyZXR1cm4gcC0+YWN0aW9uOwotCX0KLSNlbmRpZgotCi0JaWYgKHNrYi0+bGVuIDw9IHAtPm10dSkgewotCQlpZiAocC0+Ul90YWIgPT0gTlVMTCkgewotCQkJc3Bpbl91bmxvY2soJnAtPmxvY2spOwotCQkJcmV0dXJuIHAtPnJlc3VsdDsKLQkJfQotCi0JCVBTQ0hFRF9HRVRfVElNRShub3cpOwotCi0JCXRva3MgPSBQU0NIRURfVERJRkZfU0FGRShub3csIHAtPnRfYywgcC0+YnVyc3QpOwotCi0JCWlmIChwLT5QX3RhYikgewotCQkJcHRva3MgPSB0b2tzICsgcC0+cHRva3M7Ci0JCQlpZiAocHRva3MgPiAobG9uZylMMlRfUChwLCBwLT5tdHUpKQotCQkJCXB0b2tzID0gKGxvbmcpTDJUX1AocCwgcC0+bXR1KTsKLQkJCXB0b2tzIC09IEwyVF9QKHAsIHNrYi0+bGVuKTsKLQkJfQotCQl0b2tzICs9IHAtPnRva3M7Ci0JCWlmICh0b2tzID4gKGxvbmcpcC0+YnVyc3QpCi0JCQl0b2tzID0gcC0+YnVyc3Q7Ci0JCXRva3MgLT0gTDJUKHAsIHNrYi0+bGVuKTsKLQotCQlpZiAoKHRva3N8cHRva3MpID49IDApIHsKLQkJCXAtPnRfYyA9IG5vdzsKLQkJCXAtPnRva3MgPSB0b2tzOwotCQkJcC0+cHRva3MgPSBwdG9rczsKLQkJCXNwaW5fdW5sb2NrKCZwLT5sb2NrKTsKLQkJCXJldHVybiBwLT5yZXN1bHQ7Ci0JCX0KLQl9Ci0KLQlwLT5xc3RhdHMub3ZlcmxpbWl0cysrOwotCXNwaW5fdW5sb2NrKCZwLT5sb2NrKTsKLQlyZXR1cm4gcC0+YWN0aW9uOwotfQotCi1zdGF0aWMgaW50Ci10Y2ZfYWN0X3BvbGljZV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kLCBpbnQgcmVmKQotewotCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOwotCXN0cnVjdCB0Y19wb2xpY2Ugb3B0OwotCXN0cnVjdCB0Y2ZfcG9saWNlICpwID0gUFJJVihhKTsKLQotCW9wdC5pbmRleCA9IHAtPmluZGV4OwotCW9wdC5hY3Rpb24gPSBwLT5hY3Rpb247Ci0Jb3B0Lm10dSA9IHAtPm10dTsKLQlvcHQuYnVyc3QgPSBwLT5idXJzdDsKLQlvcHQucmVmY250ID0gcC0+cmVmY250IC0gcmVmOwotCW9wdC5iaW5kY250ID0gcC0+YmluZGNudCAtIGJpbmQ7Ci0JaWYgKHAtPlJfdGFiKQotCQlvcHQucmF0ZSA9IHAtPlJfdGFiLT5yYXRlOwotCWVsc2UKLQkJbWVtc2V0KCZvcHQucmF0ZSwgMCwgc2l6ZW9mKG9wdC5yYXRlKSk7Ci0JaWYgKHAtPlBfdGFiKQotCQlvcHQucGVha3JhdGUgPSBwLT5QX3RhYi0+cmF0ZTsKLQllbHNlCi0JCW1lbXNldCgmb3B0LnBlYWtyYXRlLCAwLCBzaXplb2Yob3B0LnBlYWtyYXRlKSk7Ci0JUlRBX1BVVChza2IsIFRDQV9QT0xJQ0VfVEJGLCBzaXplb2Yob3B0KSwgJm9wdCk7Ci0JaWYgKHAtPnJlc3VsdCkKLQkJUlRBX1BVVChza2IsIFRDQV9QT0xJQ0VfUkVTVUxULCBzaXplb2YoaW50KSwgJnAtPnJlc3VsdCk7Ci0jaWZkZWYgQ09ORklHX05FVF9FU1RJTUFUT1IKLQlpZiAocC0+ZXdtYV9yYXRlKQotCQlSVEFfUFVUKHNrYiwgVENBX1BPTElDRV9BVlJBVEUsIDQsICZwLT5ld21hX3JhdGUpOwotI2VuZGlmCi0JcmV0dXJuIHNrYi0+bGVuOwotCi1ydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOwotCXJldHVybiAtMTsKLX0KLQotTU9EVUxFX0FVVEhPUigiQWxleGV5IEt1em5ldHNvdiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJQb2xpY2luZyBhY3Rpb25zIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyBzdHJ1Y3QgdGNfYWN0aW9uX29wcyBhY3RfcG9saWNlX29wcyA9IHsKLQkua2luZAkJPQkicG9saWNlIiwKLQkudHlwZQkJPQlUQ0FfSURfUE9MSUNFLAotCS5jYXBhYgkJPQlUQ0FfQ0FQX05PTkUsCi0JLm93bmVyCQk9CVRISVNfTU9EVUxFLAotCS5hY3QJCT0JdGNmX2FjdF9wb2xpY2UsCi0JLmR1bXAJCT0JdGNmX2FjdF9wb2xpY2VfZHVtcCwKLQkuY2xlYW51cAk9CXRjZl9hY3RfcG9saWNlX2NsZWFudXAsCi0JLmxvb2t1cAkJPQl0Y2ZfaGFzaF9zZWFyY2gsCi0JLmluaXQJCT0JdGNmX2FjdF9wb2xpY2VfbG9jYXRlLAotCS53YWxrCQk9CXRjZl9nZW5lcmljX3dhbGtlcgotfTsKLQotc3RhdGljIGludCBfX2luaXQKLXBvbGljZV9pbml0X21vZHVsZSh2b2lkKQotewotCXJldHVybiB0Y2ZfcmVnaXN0ZXJfYWN0aW9uKCZhY3RfcG9saWNlX29wcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdAotcG9saWNlX2NsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0JdGNmX3VucmVnaXN0ZXJfYWN0aW9uKCZhY3RfcG9saWNlX29wcyk7Ci19Ci0KLW1vZHVsZV9pbml0KHBvbGljZV9pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChwb2xpY2VfY2xlYW51cF9tb2R1bGUpOwotCi0jZW5kaWYKLQotc3RydWN0IHRjZl9wb2xpY2UgKiB0Y2ZfcG9saWNlX2xvY2F0ZShzdHJ1Y3QgcnRhdHRyICpydGEsIHN0cnVjdCBydGF0dHIgKmVzdCkKLXsKLQl1bnNpZ25lZCBoOwotCXN0cnVjdCB0Y2ZfcG9saWNlICpwOwotCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9QT0xJQ0VfTUFYXTsKLQlzdHJ1Y3QgdGNfcG9saWNlICpwYXJtOwotCi0JaWYgKHJ0YXR0cl9wYXJzZV9uZXN0ZWQodGIsIFRDQV9QT0xJQ0VfTUFYLCBydGEpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAodGJbVENBX1BPTElDRV9UQkYtMV0gPT0gTlVMTCB8fAotCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfUE9MSUNFX1RCRi0xXSkgIT0gc2l6ZW9mKCpwYXJtKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlwYXJtID0gUlRBX0RBVEEodGJbVENBX1BPTElDRV9UQkYtMV0pOwotCi0JaWYgKHBhcm0tPmluZGV4ICYmIChwID0gdGNmX3BvbGljZV9sb29rdXAocGFybS0+aW5kZXgpKSAhPSBOVUxMKSB7Ci0JCXAtPnJlZmNudCsrOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQlwID0ga21hbGxvYyhzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKLQlwLT5yZWZjbnQgPSAxOwotCXNwaW5fbG9ja19pbml0KCZwLT5sb2NrKTsKLQlwLT5zdGF0c19sb2NrID0gJnAtPmxvY2s7Ci0JaWYgKHBhcm0tPnJhdGUucmF0ZSkgewotCQlwLT5SX3RhYiA9IHFkaXNjX2dldF9ydGFiKCZwYXJtLT5yYXRlLCB0YltUQ0FfUE9MSUNFX1JBVEUtMV0pOwotCQlpZiAocC0+Ul90YWIgPT0gTlVMTCkKLQkJCWdvdG8gZmFpbHVyZTsKLQkJaWYgKHBhcm0tPnBlYWtyYXRlLnJhdGUpIHsKLQkJCXAtPlBfdGFiID0gcWRpc2NfZ2V0X3J0YWIoJnBhcm0tPnBlYWtyYXRlLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICB0YltUQ0FfUE9MSUNFX1BFQUtSQVRFLTFdKTsKLQkJCWlmIChwLT5QX3RhYiA9PSBOVUxMKQotCQkJCWdvdG8gZmFpbHVyZTsKLQkJfQotCX0KLQlpZiAodGJbVENBX1BPTElDRV9SRVNVTFQtMV0pIHsKLQkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9QT0xJQ0VfUkVTVUxULTFdKSAhPSBzaXplb2YodTMyKSkKLQkJCWdvdG8gZmFpbHVyZTsKLQkJcC0+cmVzdWx0ID0gKih1MzIqKVJUQV9EQVRBKHRiW1RDQV9QT0xJQ0VfUkVTVUxULTFdKTsKLQl9Ci0jaWZkZWYgQ09ORklHX05FVF9FU1RJTUFUT1IKLQlpZiAodGJbVENBX1BPTElDRV9BVlJBVEUtMV0pIHsKLQkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9QT0xJQ0VfQVZSQVRFLTFdKSAhPSBzaXplb2YodTMyKSkKLQkJCWdvdG8gZmFpbHVyZTsKLQkJcC0+ZXdtYV9yYXRlID0gKih1MzIqKVJUQV9EQVRBKHRiW1RDQV9QT0xJQ0VfQVZSQVRFLTFdKTsKLQl9Ci0jZW5kaWYKLQlwLT50b2tzID0gcC0+YnVyc3QgPSBwYXJtLT5idXJzdDsKLQlwLT5tdHUgPSBwYXJtLT5tdHU7Ci0JaWYgKHAtPm10dSA9PSAwKSB7Ci0JCXAtPm10dSA9IH4wOwotCQlpZiAocC0+Ul90YWIpCi0JCQlwLT5tdHUgPSAyNTU8PHAtPlJfdGFiLT5yYXRlLmNlbGxfbG9nOwotCX0KLQlpZiAocC0+UF90YWIpCi0JCXAtPnB0b2tzID0gTDJUX1AocCwgcC0+bXR1KTsKLQlQU0NIRURfR0VUX1RJTUUocC0+dF9jKTsKLQlwLT5pbmRleCA9IHBhcm0tPmluZGV4ID8gOiB0Y2ZfcG9saWNlX25ld19pbmRleCgpOwotCXAtPmFjdGlvbiA9IHBhcm0tPmFjdGlvbjsKLSNpZmRlZiBDT05GSUdfTkVUX0VTVElNQVRPUgotCWlmIChlc3QpCi0JCWdlbl9uZXdfZXN0aW1hdG9yKCZwLT5ic3RhdHMsICZwLT5yYXRlX2VzdCwgcC0+c3RhdHNfbG9jaywgZXN0KTsKLSNlbmRpZgotCWggPSB0Y2ZfcG9saWNlX2hhc2gocC0+aW5kZXgpOwotCXdyaXRlX2xvY2tfYmgoJnBvbGljZV9sb2NrKTsKLQlwLT5uZXh0ID0gdGNmX3BvbGljZV9odFtoXTsKLQl0Y2ZfcG9saWNlX2h0W2hdID0gcDsKLQl3cml0ZV91bmxvY2tfYmgoJnBvbGljZV9sb2NrKTsKLQlyZXR1cm4gcDsKLQotZmFpbHVyZToKLQlpZiAocC0+Ul90YWIpCi0JCXFkaXNjX3B1dF9ydGFiKHAtPlJfdGFiKTsKLQlrZnJlZShwKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotaW50IHRjZl9wb2xpY2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjZl9wb2xpY2UgKnApCi17Ci0JcHNjaGVkX3RpbWVfdCBub3c7Ci0JbG9uZyB0b2tzOwotCWxvbmcgcHRva3MgPSAwOwotCi0Jc3Bpbl9sb2NrKCZwLT5sb2NrKTsKLQotCXAtPmJzdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKLQlwLT5ic3RhdHMucGFja2V0cysrOwotCi0jaWZkZWYgQ09ORklHX05FVF9FU1RJTUFUT1IKLQlpZiAocC0+ZXdtYV9yYXRlICYmIHAtPnJhdGVfZXN0LmJwcyA+PSBwLT5ld21hX3JhdGUpIHsKLQkJcC0+cXN0YXRzLm92ZXJsaW1pdHMrKzsKLQkJc3Bpbl91bmxvY2soJnAtPmxvY2spOwotCQlyZXR1cm4gcC0+YWN0aW9uOwotCX0KLSNlbmRpZgotCi0JaWYgKHNrYi0+bGVuIDw9IHAtPm10dSkgewotCQlpZiAocC0+Ul90YWIgPT0gTlVMTCkgewotCQkJc3Bpbl91bmxvY2soJnAtPmxvY2spOwotCQkJcmV0dXJuIHAtPnJlc3VsdDsKLQkJfQotCi0JCVBTQ0hFRF9HRVRfVElNRShub3cpOwotCi0JCXRva3MgPSBQU0NIRURfVERJRkZfU0FGRShub3csIHAtPnRfYywgcC0+YnVyc3QpOwotCi0JCWlmIChwLT5QX3RhYikgewotCQkJcHRva3MgPSB0b2tzICsgcC0+cHRva3M7Ci0JCQlpZiAocHRva3MgPiAobG9uZylMMlRfUChwLCBwLT5tdHUpKQotCQkJCXB0b2tzID0gKGxvbmcpTDJUX1AocCwgcC0+bXR1KTsKLQkJCXB0b2tzIC09IEwyVF9QKHAsIHNrYi0+bGVuKTsKLQkJfQotCQl0b2tzICs9IHAtPnRva3M7Ci0JCWlmICh0b2tzID4gKGxvbmcpcC0+YnVyc3QpCi0JCQl0b2tzID0gcC0+YnVyc3Q7Ci0JCXRva3MgLT0gTDJUKHAsIHNrYi0+bGVuKTsKLQotCQlpZiAoKHRva3N8cHRva3MpID49IDApIHsKLQkJCXAtPnRfYyA9IG5vdzsKLQkJCXAtPnRva3MgPSB0b2tzOwotCQkJcC0+cHRva3MgPSBwdG9rczsKLQkJCXNwaW5fdW5sb2NrKCZwLT5sb2NrKTsKLQkJCXJldHVybiBwLT5yZXN1bHQ7Ci0JCX0KLQl9Ci0KLQlwLT5xc3RhdHMub3ZlcmxpbWl0cysrOwotCXNwaW5fdW5sb2NrKCZwLT5sb2NrKTsKLQlyZXR1cm4gcC0+YWN0aW9uOwotfQotCi1pbnQgdGNmX3BvbGljZV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y2ZfcG9saWNlICpwKQotewotCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOwotCXN0cnVjdCB0Y19wb2xpY2Ugb3B0OwotCi0Jb3B0LmluZGV4ID0gcC0+aW5kZXg7Ci0Jb3B0LmFjdGlvbiA9IHAtPmFjdGlvbjsKLQlvcHQubXR1ID0gcC0+bXR1OwotCW9wdC5idXJzdCA9IHAtPmJ1cnN0OwotCWlmIChwLT5SX3RhYikKLQkJb3B0LnJhdGUgPSBwLT5SX3RhYi0+cmF0ZTsKLQllbHNlCi0JCW1lbXNldCgmb3B0LnJhdGUsIDAsIHNpemVvZihvcHQucmF0ZSkpOwotCWlmIChwLT5QX3RhYikKLQkJb3B0LnBlYWtyYXRlID0gcC0+UF90YWItPnJhdGU7Ci0JZWxzZQotCQltZW1zZXQoJm9wdC5wZWFrcmF0ZSwgMCwgc2l6ZW9mKG9wdC5wZWFrcmF0ZSkpOwotCVJUQV9QVVQoc2tiLCBUQ0FfUE9MSUNFX1RCRiwgc2l6ZW9mKG9wdCksICZvcHQpOwotCWlmIChwLT5yZXN1bHQpCi0JCVJUQV9QVVQoc2tiLCBUQ0FfUE9MSUNFX1JFU1VMVCwgc2l6ZW9mKGludCksICZwLT5yZXN1bHQpOwotI2lmZGVmIENPTkZJR19ORVRfRVNUSU1BVE9SCi0JaWYgKHAtPmV3bWFfcmF0ZSkKLQkJUlRBX1BVVChza2IsIFRDQV9QT0xJQ0VfQVZSQVRFLCA0LCAmcC0+ZXdtYV9yYXRlKTsKLSNlbmRpZgotCXJldHVybiBza2ItPmxlbjsKLQotcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLWludCB0Y2ZfcG9saWNlX2R1bXBfc3RhdHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjZl9wb2xpY2UgKnApCi17Ci0Jc3RydWN0IGduZXRfZHVtcCBkOwotCQotCWlmIChnbmV0X3N0YXRzX3N0YXJ0X2NvcHlfY29tcGF0KHNrYiwgVENBX1NUQVRTMiwgVENBX1NUQVRTLAotCQkJVENBX1hTVEFUUywgcC0+c3RhdHNfbG9jaywgJmQpIDwgMCkKLQkJZ290byBlcnJvdXQ7Ci0JCi0JaWYgKGduZXRfc3RhdHNfY29weV9iYXNpYygmZCwgJnAtPmJzdGF0cykgPCAwIHx8Ci0jaWZkZWYgQ09ORklHX05FVF9FU1RJTUFUT1IKLQkgICAgZ25ldF9zdGF0c19jb3B5X3JhdGVfZXN0KCZkLCAmcC0+cmF0ZV9lc3QpIDwgMCB8fAotI2VuZGlmCi0JICAgIGduZXRfc3RhdHNfY29weV9xdWV1ZSgmZCwgJnAtPnFzdGF0cykgPCAwKQotCQlnb3RvIGVycm91dDsKLQotCWlmIChnbmV0X3N0YXRzX2ZpbmlzaF9jb3B5KCZkKSA8IDApCi0JCWdvdG8gZXJyb3V0OwotCi0JcmV0dXJuIDA7Ci0KLWVycm91dDoKLQlyZXR1cm4gLTE7Ci19Ci0KLQotRVhQT1JUX1NZTUJPTCh0Y2ZfcG9saWNlKTsKLUVYUE9SVF9TWU1CT0wodGNmX3BvbGljZV9kZXN0cm95KTsKLUVYUE9SVF9TWU1CT0wodGNmX3BvbGljZV9kdW1wKTsKLUVYUE9SVF9TWU1CT0wodGNmX3BvbGljZV9kdW1wX3N0YXRzKTsKLUVYUE9SVF9TWU1CT0wodGNmX3BvbGljZV9oYXNoKTsKLUVYUE9SVF9TWU1CT0wodGNmX3BvbGljZV9odCk7Ci1FWFBPUlRfU1lNQk9MKHRjZl9wb2xpY2VfbG9jYXRlKTsKLUVYUE9SVF9TWU1CT0wodGNmX3BvbGljZV9sb29rdXApOwotRVhQT1JUX1NZTUJPTCh0Y2ZfcG9saWNlX25ld19pbmRleCk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2NicS5jIGIvbmV0L3NjaGVkL3NjaF9jYnEuYwppbmRleCAwOTQ1M2Y5Li42Y2Q4MTcwIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2NicS5jCisrKyBiL25ldC9zY2hlZC9zY2hfY2JxLmMKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCSAgICAoY2wgPSBjYnFfY2xhc3NfbG9va3VwKHEsIHByaW8pKSAhPSBOVUxMKQogCQlyZXR1cm4gY2w7CiAKLQkqcWVyciA9IE5FVF9YTUlUX0RST1A7CisJKnFlcnIgPSBORVRfWE1JVF9CWVBBU1M7CiAJZm9yICg7OykgewogCQlpbnQgcmVzdWx0ID0gMDsKIAkJZGVmbWFwID0gaGVhZC0+ZGVmYXVsdHM7CkBAIC00MTMsNyArNDEzLDcgQEAKIAlxLT5yeF9jbGFzcyA9IGNsOwogI2VuZGlmCiAJaWYgKGNsID09IE5VTEwpIHsKLQkJaWYgKHJldCA9PSBORVRfWE1JVF9EUk9QKQorCQlpZiAocmV0ID09IE5FVF9YTUlUX0JZUEFTUykKIAkJCXNjaC0+cXN0YXRzLmRyb3BzKys7CiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9oZnNjLmMgYi9uZXQvc2NoZWQvc2NoX2hmc2MuYwppbmRleCBjMjY3NjRiLi45MTEzMmY2IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2hmc2MuYworKysgYi9uZXQvc2NoZWQvc2NoX2hmc2MuYwpAQCAtMjA4LDcgKzIwOCw3IEBACiBkbyB7CQkJCQkJCQkJXAogCXN0cnVjdCB0aW1ldmFsIHR2OwkJCQkJCVwKIAlkb19nZXR0aW1lb2ZkYXkoJnR2KTsJCQkJCQlcCi0JKHN0YW1wKSA9IDEwMDAwMDBVTEwgKiB0di50dl9zZWMgKyB0di50dl91c2VjOwkJCVwKKwkoc3RhbXApID0gMVVMTCAqIFVTRUNfUEVSX1NFQyAqIHR2LnR2X3NlYyArIHR2LnR2X3VzZWM7CQlcCiB9IHdoaWxlICgwKQogI2VuZGlmCiAKQEAgLTUwMiw4ICs1MDIsOCBAQAogCXU2NCBkeDsKIAogCWR4ID0gKCh1NjQpZCAqIFBTQ0hFRF9KSUZGSUUyVVMoSFopKTsKLQlkeCArPSAxMDAwMDAwIC0gMTsKLQlkb19kaXYoZHgsIDEwMDAwMDApOworCWR4ICs9IFVTRUNfUEVSX1NFQyAtIDE7CisJZG9fZGl2KGR4LCBVU0VDX1BFUl9TRUMpOwogCXJldHVybiBkeDsKIH0KIApAQCAtNTIzLDcgKzUyMyw3IEBACiB7CiAJdTY0IGQ7CiAKLQlkID0gZHggKiAxMDAwMDAwOworCWQgPSBkeCAqIFVTRUNfUEVSX1NFQzsKIAlkb19kaXYoZCwgUFNDSEVEX0pJRkZJRTJVUyhIWikpOwogCXJldHVybiAodTMyKWQ7CiB9CkBAIC0xMjI3LDcgKzEyMjcsNyBAQAogCQlpZiAoY2wtPmxldmVsID09IDApCiAJCQlyZXR1cm4gY2w7CiAKLQkqcWVyciA9IE5FVF9YTUlUX0RST1A7CisJKnFlcnIgPSBORVRfWE1JVF9CWVBBU1M7CiAJdGNmID0gcS0+cm9vdC5maWx0ZXJfbGlzdDsKIAl3aGlsZSAodGNmICYmIChyZXN1bHQgPSB0Y19jbGFzc2lmeShza2IsIHRjZiwgJnJlcykpID49IDApIHsKICNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKQEAgLTE2NDMsNyArMTY0Myw3IEBACiAKIAljbCA9IGhmc2NfY2xhc3NpZnkoc2tiLCBzY2gsICZlcnIpOwogCWlmIChjbCA9PSBOVUxMKSB7Ci0JCWlmIChlcnIgPT0gTkVUX1hNSVRfRFJPUCkKKwkJaWYgKGVyciA9PSBORVRfWE1JVF9CWVBBU1MpCiAJCQlzY2gtPnFzdGF0cy5kcm9wcysrOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfaHRiLmMgYi9uZXQvc2NoZWQvc2NoX2h0Yi5jCmluZGV4IDU1OGNjMDguLjNlYzk1ZGYgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfaHRiLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9odGIuYwpAQCAtMzIxLDcgKzMyMSw3IEBACiAJaWYgKChjbCA9IGh0Yl9maW5kKHNrYi0+cHJpb3JpdHksc2NoKSkgIT0gTlVMTCAmJiBjbC0+bGV2ZWwgPT0gMCkgCiAJCXJldHVybiBjbDsKIAotCSpxZXJyID0gTkVUX1hNSVRfRFJPUDsKKwkqcWVyciA9IE5FVF9YTUlUX0JZUEFTUzsKIAl0Y2YgPSBxLT5maWx0ZXJfbGlzdDsKIAl3aGlsZSAodGNmICYmIChyZXN1bHQgPSB0Y19jbGFzc2lmeShza2IsIHRjZiwgJnJlcykpID49IDApIHsKICNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKQEAgLTcyNCw3ICs3MjQsNyBAQAogCX0KICNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKICAgICB9IGVsc2UgaWYgKCFjbCkgewotCWlmIChyZXQgPT0gTkVUX1hNSVRfRFJPUCkKKwlpZiAocmV0ID09IE5FVF9YTUlUX0JZUEFTUykKIAkJc2NoLT5xc3RhdHMuZHJvcHMrKzsKIAlrZnJlZV9za2IgKHNrYik7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfcHJpby5jIGIvbmV0L3NjaGVkL3NjaF9wcmlvLmMKaW5kZXggM2FjMGY0OS4uMTY0MWRiMyAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9wcmlvLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9wcmlvLmMKQEAgLTU0LDcgKzU0LDcgQEAKIAl1MzIgYmFuZCA9IHNrYi0+cHJpb3JpdHk7CiAJc3RydWN0IHRjZl9yZXN1bHQgcmVzOwogCi0JKnFlcnIgPSBORVRfWE1JVF9EUk9QOworCSpxZXJyID0gTkVUX1hNSVRfQllQQVNTOwogCWlmIChUQ19IX01BSihza2ItPnByaW9yaXR5KSAhPSBzY2gtPmhhbmRsZSkgewogI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAogCQlzd2l0Y2ggKHRjX2NsYXNzaWZ5KHNrYiwgcS0+ZmlsdGVyX2xpc3QsICZyZXMpKSB7CkBAIC05MSw3ICs5MSw4IEBACiAJcWRpc2MgPSBwcmlvX2NsYXNzaWZ5KHNrYiwgc2NoLCAmcmV0KTsKICNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKIAlpZiAocWRpc2MgPT0gTlVMTCkgewotCQlpZiAocmV0ID09IE5FVF9YTUlUX0RST1ApCisKKwkJaWYgKHJldCA9PSBORVRfWE1JVF9CWVBBU1MpCiAJCQlzY2gtPnFzdGF0cy5kcm9wcysrOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIHJldDsKQEAgLTExOCw3ICsxMTksNyBAQAogCXFkaXNjID0gcHJpb19jbGFzc2lmeShza2IsIHNjaCwgJnJldCk7CiAjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCiAJaWYgKHFkaXNjID09IE5VTEwpIHsKLQkJaWYgKHJldCA9PSBORVRfWE1JVF9EUk9QKQorCQlpZiAocmV0ID09IE5FVF9YTUlUX0JZUEFTUykKIAkJCXNjaC0+cXN0YXRzLmRyb3BzKys7CiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gcmV0OwpAQCAtMjI3LDE0ICsyMjgsMTMgQEAKIAl9CiAJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CiAKLQlmb3IgKGk9MDsgaTw9VENfUFJJT19NQVg7IGkrKykgewotCQlpbnQgYmFuZCA9IHEtPnByaW8yYmFuZFtpXTsKLQkJaWYgKHEtPnF1ZXVlc1tiYW5kXSA9PSAmbm9vcF9xZGlzYykgeworCWZvciAoaT0wOyBpPHEtPmJhbmRzOyBpKyspIHsKKwkJaWYgKHEtPnF1ZXVlc1tpXSA9PSAmbm9vcF9xZGlzYykgewogCQkJc3RydWN0IFFkaXNjICpjaGlsZDsKIAkJCWNoaWxkID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMpOwogCQkJaWYgKGNoaWxkKSB7CiAJCQkJc2NoX3RyZWVfbG9jayhzY2gpOwotCQkJCWNoaWxkID0geGNoZygmcS0+cXVldWVzW2JhbmRdLCBjaGlsZCk7CisJCQkJY2hpbGQgPSB4Y2hnKCZxLT5xdWV1ZXNbaV0sIGNoaWxkKTsKIAogCQkJCWlmIChjaGlsZCAhPSAmbm9vcF9xZGlzYykKIAkJCQkJcWRpc2NfZGVzdHJveShjaGlsZCk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3NmcS5jIGIvbmV0L3NjaGVkL3NjaF9zZnEuYwppbmRleCA4NzM0YmI3Li44NmQ4ZGEwIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX3NmcS5jCisrKyBiL25ldC9zY2hlZC9zY2hfc2ZxLmMKQEAgLTE0NCw2ICsxNDQsOCBAQAogCQlpZiAoIShpcGgtPmZyYWdfb2ZmJmh0b25zKElQX01GfElQX09GRlNFVCkpICYmCiAJCSAgICAoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCB8fAogCQkgICAgIGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFAgfHwKKwkJICAgICBpcGgtPnByb3RvY29sID09IElQUFJPVE9fU0NUUCB8fAorCQkgICAgIGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19EQ0NQIHx8CiAJCSAgICAgaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX0VTUCkpCiAJCQloMiBePSAqKCgodTMyKilpcGgpICsgaXBoLT5paGwpOwogCQlicmVhazsKQEAgLTE1NSw2ICsxNTcsOCBAQAogCQloMiA9IGlwaC0+c2FkZHIuczZfYWRkcjMyWzNdXmlwaC0+bmV4dGhkcjsKIAkJaWYgKGlwaC0+bmV4dGhkciA9PSBJUFBST1RPX1RDUCB8fAogCQkgICAgaXBoLT5uZXh0aGRyID09IElQUFJPVE9fVURQIHx8CisJCSAgICBpcGgtPm5leHRoZHIgPT0gSVBQUk9UT19TQ1RQIHx8CisJCSAgICBpcGgtPm5leHRoZHIgPT0gSVBQUk9UT19EQ0NQIHx8CiAJCSAgICBpcGgtPm5leHRoZHIgPT0gSVBQUk9UT19FU1ApCiAJCQloMiBePSAqKHUzMiopJmlwaFsxXTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3RlcWwuYyBiL25ldC9zY2hlZC9zY2hfdGVxbC5jCmluZGV4IGM0YTJhOGMuLjc5YjhlZjMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfdGVxbC5jCisrKyBiL25ldC9zY2hlZC9zY2hfdGVxbC5jCkBAIC0yNzQsNyArMjc0LDcgQEAKIAogc3RhdGljIGludCB0ZXFsX21hc3Rlcl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHRlcWxfbWFzdGVyICptYXN0ZXIgPSAodm9pZCopZGV2LT5wcml2OworCXN0cnVjdCB0ZXFsX21hc3RlciAqbWFzdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgUWRpc2MgKnN0YXJ0LCAqcTsKIAlpbnQgYnVzeTsKIAlpbnQgbm9yZXM7CkBAIC0zNTAsNyArMzUwLDcgQEAKIHN0YXRpYyBpbnQgdGVxbF9tYXN0ZXJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBRZGlzYyAqIHE7Ci0Jc3RydWN0IHRlcWxfbWFzdGVyICptID0gKHZvaWQqKWRldi0+cHJpdjsKKwlzdHJ1Y3QgdGVxbF9tYXN0ZXIgKm0gPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBtdHUgPSAweEZGRkU7CiAJdW5zaWduZWQgZmxhZ3MgPSBJRkZfTk9BUlB8SUZGX01VTFRJQ0FTVDsKIApAQCAtMzk3LDEzICszOTcsMTMgQEAKIAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp0ZXFsX21hc3Rlcl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCB0ZXFsX21hc3RlciAqbSA9ICh2b2lkKilkZXYtPnByaXY7CisJc3RydWN0IHRlcWxfbWFzdGVyICptID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlyZXR1cm4gJm0tPnN0YXRzOwogfQogCiBzdGF0aWMgaW50IHRlcWxfbWFzdGVyX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKIHsKLQlzdHJ1Y3QgdGVxbF9tYXN0ZXIgKm0gPSAodm9pZCopZGV2LT5wcml2OworCXN0cnVjdCB0ZXFsX21hc3RlciAqbSA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IFFkaXNjICpxOwogCiAJaWYgKG5ld19tdHUgPCA2OCkKQEAgLTQyMyw3ICs0MjMsNyBAQAogCiBzdGF0aWMgX19pbml0IHZvaWQgdGVxbF9tYXN0ZXJfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgdGVxbF9tYXN0ZXIgKm1hc3RlciA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgdGVxbF9tYXN0ZXIgKm1hc3RlciA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IFFkaXNjX29wcyAqb3BzID0gJm1hc3Rlci0+cW9wczsKIAogCW1hc3Rlci0+ZGV2CT0gZGV2OwpAQCAtNDc2LDcgKzQ3Niw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCW1hc3RlciA9IGRldi0+cHJpdjsKKwkJbWFzdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCQlzdHJsY3B5KG1hc3Rlci0+cW9wcy5pZCwgZGV2LT5uYW1lLCBJRk5BTVNJWik7CiAJCWVyciA9IHJlZ2lzdGVyX3FkaXNjKCZtYXN0ZXItPnFvcHMpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NpbXBsZS5jIGIvbmV0L3NjaGVkL3NpbXBsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTZhZTRmLi4wMDAwMDAwCi0tLSBhL25ldC9zY2hlZC9zaW1wbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBuZXQvc2NoZWQvc2ltcC5jCVNpbXBsZSBleGFtcGxlIG9mIGFuIGFjdGlvbgotICoKLSAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEF1dGhvcnM6CUphbWFsIEhhZGkgU2FsaW0gKDIwMDUpCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+Ci0jaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgotCi0jZGVmaW5lIFRDQV9BQ1RfU0lNUCAyMgotCi0vKiBYWFg6IEhpZGUgYWxsIHRoZXNlIGNvbW1vbiBlbGVtZW50cyB1bmRlciBzb21lIG1hY3JvIAotICogcHJvYmFibHkKLSovCi0jaW5jbHVkZSA8bGludXgvdGNfYWN0L3RjX2RlZmFjdC5oPgotI2luY2x1ZGUgPG5ldC90Y19hY3QvdGNfZGVmYWN0Lmg+Ci0KLS8qIHVzZSBnZW5lcmljIGhhc2ggdGFibGUgd2l0aCA4IGJ1Y2tldHMgKi8KLSNkZWZpbmUgTVlfVEFCX1NJWkUgICAgIDgKLSNkZWZpbmUgTVlfVEFCX01BU0sgICAgIChNWV9UQUJfU0laRSAtIDEpCi1zdGF0aWMgdTMyIGlkeF9nZW47Ci1zdGF0aWMgc3RydWN0IHRjZl9kZWZhY3QgKnRjZl9zaW1wX2h0W01ZX1RBQl9TSVpFXTsKLXN0YXRpYyBERUZJTkVfUldMT0NLKHNpbXBfbG9jayk7Ci0KLS8qIG92ZXJyaWRlIHRoZSBkZWZhdWx0cyAqLwotI2RlZmluZSB0Y2Zfc3QJCXRjZl9kZWZhY3QKLSNkZWZpbmUgdGNfc3QJCXRjX2RlZmFjdAotI2RlZmluZSB0Y2ZfdF9sb2NrCXNpbXBfbG9jawotI2RlZmluZSB0Y2ZfaHQJCXRjZl9zaW1wX2h0Ci0KLSNkZWZpbmUgQ09ORklHX05FVF9BQ1RfSU5JVCAxCi0jaW5jbHVkZSA8bmV0L3BrdF9hY3QuaD4KLSNpbmNsdWRlIDxuZXQvYWN0X2dlbmVyaWMuaD4KLQotc3RhdGljIGludCB0Y2Zfc2ltcChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpwc2tiOwotCXN0cnVjdCB0Y2ZfZGVmYWN0ICpwID0gUFJJVihhLCBkZWZhY3QpOwotCi0Jc3Bpbl9sb2NrKCZwLT5sb2NrKTsKLQlwLT50bS5sYXN0dXNlID0gamlmZmllczsKLQlwLT5ic3RhdHMuYnl0ZXMgKz0gc2tiLT5sZW47Ci0JcC0+YnN0YXRzLnBhY2tldHMrKzsKLQotCS8qIHByaW50IHBvbGljeSBzdHJpbmcgZm9sbG93ZWQgYnkgXyB0aGVuIHBhY2tldCBjb3VudCAKLQkgKiBFeGFtcGxlIGlmIHRoaXMgd2FzIHRoZSAzcmQgcGFja2V0IGFuZCB0aGUgc3RyaW5nIHdhcyAiaGVsbG8iIAotCSAqIHRoZW4gaXQgd291bGQgbG9vayBsaWtlICJoZWxsb18zIiAod2l0aG91dCBxdW90ZXMpIAotCSAqKi8KLQlwcmludGsoInNpbXBsZTogJXNfJWRcbiIsIChjaGFyICopcC0+ZGVmZGF0YSwgcC0+YnN0YXRzLnBhY2tldHMpOwotCXNwaW5fdW5sb2NrKCZwLT5sb2NrKTsKLQlyZXR1cm4gcC0+YWN0aW9uOwotfQotCi1zdGF0aWMgc3RydWN0IHRjX2FjdGlvbl9vcHMgYWN0X3NpbXBfb3BzID0gewotCS5raW5kID0gInNpbXBsZSIsCi0JLnR5cGUgPSBUQ0FfQUNUX1NJTVAsCi0JLmNhcGFiID0gVENBX0NBUF9OT05FLAotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5hY3QgPSB0Y2Zfc2ltcCwKLQl0Y2FfdXNlX2RlZmF1bHRfb3BzCi19OwotCi1NT0RVTEVfQVVUSE9SKCJKYW1hbCBIYWRpIFNhbGltKDIwMDUpIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlNpbXBsZSBleGFtcGxlIGFjdGlvbiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgaW50IF9faW5pdCBzaW1wX2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JaW50IHJldCA9IHRjZl9yZWdpc3Rlcl9hY3Rpb24oJmFjdF9zaW1wX29wcyk7Ci0JaWYgKCFyZXQpCi0JCXByaW50aygiU2ltcGxlIFRDIGFjdGlvbiBMb2FkZWRcbiIpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzaW1wX2NsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0JdGNmX3VucmVnaXN0ZXJfYWN0aW9uKCZhY3Rfc2ltcF9vcHMpOwotfQotCi1tb2R1bGVfaW5pdChzaW1wX2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KHNpbXBfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvaW5wdXQuYyBiL25ldC9zY3RwL2lucHV0LmMKaW5kZXggMjM4ZjFiZi4uY2I3OGI1MCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvaW5wdXQuYworKysgYi9uZXQvc2N0cC9pbnB1dC5jCkBAIC0yMjUsNiArMjI1LDcgQEAKIAogCWlmICgheGZybV9wb2xpY3lfY2hlY2soc2ssIFhGUk1fUE9MSUNZX0lOLCBza2IsIGZhbWlseSkpCiAJCWdvdG8gZGlzY2FyZF9yZWxlYXNlOworCW5mX3Jlc2V0KHNrYik7CiAKIAlyZXQgPSBza19maWx0ZXIoc2ssIHNrYiwgMSk7CiAJaWYgKHJldCkKQEAgLTI1NiwyMCArMjU3LDI2IEBACiAJICovCiAJc2N0cF9iaF9sb2NrX3NvY2soc2spOwogCisJLyogSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgYXNzb2NpYXRpb24gY291bGQgaGF2ZSBtb3ZlZCB0byBhIGRpZmZlcmVudAorCSAqIHNvY2tldCBpZiBpdCBpcyBwZWVsZWQgb2ZmLiBJZiBzbywgdXBkYXRlIHRoZSBzay4KKwkgKi8gCisJaWYgKHNrICE9IHJjdnItPnNrKSB7CisJCXNjdHBfYmhfbG9ja19zb2NrKHJjdnItPnNrKTsKKwkJc2N0cF9iaF91bmxvY2tfc29jayhzayk7CisJCXNrID0gcmN2ci0+c2s7CisJfQorCiAJaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzaykpCiAJCXNrX2FkZF9iYWNrbG9nKHNrLCBza2IpOwogCWVsc2UKIAkJc2N0cF9iYWNrbG9nX3Jjdihzaywgc2tiKTsKIAotCS8qIFJlbGVhc2UgdGhlIHNvY2sgYW5kIGFueSByZWZlcmVuY2UgY291bnRzIHdlIHRvb2sgaW4gdGhlCi0JICogbG9va3VwIGNhbGxzLgorCS8qIFJlbGVhc2UgdGhlIHNvY2sgYW5kIHRoZSBzb2NrIHJlZiB3ZSB0b29rIGluIHRoZSBsb29rdXAgY2FsbHMuCisJICogVGhlIGFzb2MvZXAgcmVmIHdpbGwgYmUgcmVsZWFzZWQgaW4gc2N0cF9iYWNrbG9nX3Jjdi4KIAkgKi8KIAlzY3RwX2JoX3VubG9ja19zb2NrKHNrKTsKLQlpZiAoYXNvYykKLQkJc2N0cF9hc3NvY2lhdGlvbl9wdXQoYXNvYyk7Ci0JZWxzZQotCQlzY3RwX2VuZHBvaW50X3B1dChlcCk7CiAJc29ja19wdXQoc2spOworCiAJcmV0dXJuIHJldDsKIAogZGlzY2FyZF9pdDoKQEAgLTI5NSwxMiArMzAyLDUwIEBACiBpbnQgc2N0cF9iYWNrbG9nX3JjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rID0gU0NUUF9JTlBVVF9DQihza2IpLT5jaHVuazsKLQlzdHJ1Y3Qgc2N0cF9pbnEgKmlucXVldWUgPSAmY2h1bmstPnJjdnItPmlucXVldWU7CisgCXN0cnVjdCBzY3RwX2lucSAqaW5xdWV1ZSA9IE5VTEw7CisgCXN0cnVjdCBzY3RwX2VwX2NvbW1vbiAqcmN2ciA9IE5VTEw7CiAKLQlzY3RwX2lucV9wdXNoKGlucXVldWUsIGNodW5rKTsKKyAJcmN2ciA9IGNodW5rLT5yY3ZyOworCisJQlVHX1RSQVAocmN2ci0+c2sgPT0gc2spOworCisgCWlmIChyY3ZyLT5kZWFkKSB7CisgCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOworIAl9IGVsc2UgeworIAkJaW5xdWV1ZSA9ICZjaHVuay0+cmN2ci0+aW5xdWV1ZTsKKyAJCXNjdHBfaW5xX3B1c2goaW5xdWV1ZSwgY2h1bmspOworIAl9CisKKwkvKiBSZWxlYXNlIHRoZSBhc29jL2VwIHJlZiB3ZSB0b29rIGluIHRoZSBsb29rdXAgY2FsbHMgaW4gc2N0cF9yY3YuICovIAorIAlpZiAoU0NUUF9FUF9UWVBFX0FTU09DSUFUSU9OID09IHJjdnItPnR5cGUpCisgCQlzY3RwX2Fzc29jaWF0aW9uX3B1dChzY3RwX2Fzc29jKHJjdnIpKTsKKyAJZWxzZQorIAkJc2N0cF9lbmRwb2ludF9wdXQoc2N0cF9lcChyY3ZyKSk7CisgIAogICAgICAgICByZXR1cm4gMDsKIH0KIAordm9pZCBzY3RwX2JhY2tsb2dfbWlncmF0ZShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNzb2MsIAorCQkJICBzdHJ1Y3Qgc29jayAqb2xkc2ssIHN0cnVjdCBzb2NrICpuZXdzaykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKKworCXNrYiA9IG9sZHNrLT5za19iYWNrbG9nLmhlYWQ7CisJb2xkc2stPnNrX2JhY2tsb2cuaGVhZCA9IG9sZHNrLT5za19iYWNrbG9nLnRhaWwgPSBOVUxMOworCXdoaWxlIChza2IgIT0gTlVMTCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dCA9IHNrYi0+bmV4dDsKKworCQljaHVuayA9IFNDVFBfSU5QVVRfQ0Ioc2tiKS0+Y2h1bms7CisJCXNrYi0+bmV4dCA9IE5VTEw7CisJCWlmICgmYXNzb2MtPmJhc2UgPT0gY2h1bmstPnJjdnIpCisJCQlza19hZGRfYmFja2xvZyhuZXdzaywgc2tiKTsKKwkJZWxzZQorCQkJc2tfYWRkX2JhY2tsb2cob2xkc2ssIHNrYik7CisJCXNrYiA9IG5leHQ7CisJfQorfQorCiAvKiBIYW5kbGUgaWNtcCBmcmFnIG5lZWRlZCBlcnJvci4gKi8KIHZvaWQgc2N0cF9pY21wX2ZyYWdfbmVlZGVkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJCQkgICBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnQsIF9fdTMyIHBtdHUpCkBAIC01NDMsMTAgKzU4OCwxNiBAQAogCXNjdHBfZXJyaGRyX3QgKmVycjsKIAogCWNoID0gKHNjdHBfY2h1bmtoZHJfdCAqKSBza2ItPmRhdGE7Ci0JY2hfZW5kID0gKChfX3U4ICopIGNoKSArIFdPUkRfUk9VTkQobnRvaHMoY2gtPmxlbmd0aCkpOwogCiAJLyogU2NhbiB0aHJvdWdoIGFsbCB0aGUgY2h1bmtzIGluIHRoZSBwYWNrZXQuICAqLwotCXdoaWxlIChjaF9lbmQgPiAoX191OCAqKWNoICYmIGNoX2VuZCA8IHNrYi0+dGFpbCkgeworCWRvIHsKKwkJLyogQnJlYWsgb3V0IGlmIGNodW5rIGxlbmd0aCBpcyBsZXNzIHRoZW4gbWluaW1hbC4gKi8KKwkJaWYgKG50b2hzKGNoLT5sZW5ndGgpIDwgc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCkpCisJCQlicmVhazsKKworCQljaF9lbmQgPSAoKF9fdTggKiljaCkgKyBXT1JEX1JPVU5EKG50b2hzKGNoLT5sZW5ndGgpKTsKKwkJaWYgKGNoX2VuZCA+IHNrYi0+dGFpbCkKKwkJCWJyZWFrOwogCiAJCS8qIFJGQyA4LjQsIDIpIElmIHRoZSBPT1RCIHBhY2tldCBjb250YWlucyBhbiBBQk9SVCBjaHVuaywgdGhlCiAJCSAqIHJlY2VpdmVyIE1VU1Qgc2lsZW50bHkgZGlzY2FyZCB0aGUgT09UQiBwYWNrZXQgYW5kIHRha2Ugbm8KQEAgLTU3Nyw4ICs2MjgsNyBAQAogCQl9CiAKIAkJY2ggPSAoc2N0cF9jaHVua2hkcl90ICopIGNoX2VuZDsKLQkgICAgICAgIGNoX2VuZCA9ICgoX191OCAqKSBjaCkgKyBXT1JEX1JPVU5EKG50b2hzKGNoLT5sZW5ndGgpKTsKLQl9CisJfSB3aGlsZSAoY2hfZW5kIDwgc2tiLT50YWlsKTsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9pbnF1ZXVlLmMgYi9uZXQvc2N0cC9pbnF1ZXVlLmMKaW5kZXggMmQzMzkyMi4uMjk3Yjg5NSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvaW5xdWV1ZS5jCisrKyBiL25ldC9zY3RwL2lucXVldWUuYwpAQCAtNzMsOCArNzMsMTAgQEAKIAkvKiBJZiB0aGVyZSBpcyBhIHBhY2tldCB3aGljaCBpcyBjdXJyZW50bHkgYmVpbmcgd29ya2VkIG9uLAogCSAqIGZyZWUgaXQgYXMgd2VsbC4KIAkgKi8KLQlpZiAocXVldWUtPmluX3Byb2dyZXNzKQorCWlmIChxdWV1ZS0+aW5fcHJvZ3Jlc3MpIHsKIAkJc2N0cF9jaHVua19mcmVlKHF1ZXVlLT5pbl9wcm9ncmVzcyk7CisJCXF1ZXVlLT5pbl9wcm9ncmVzcyA9IE5VTEw7CisJfQogCiAJaWYgKHF1ZXVlLT5tYWxsb2NlZCkgewogCQkvKiBEdW1wIHRoZSBtYXN0ZXIgbWVtb3J5IHNlZ21lbnQuICAqLwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvaXB2Ni5jIGIvbmV0L3NjdHAvaXB2Ni5jCmluZGV4IDE1YzA1MTYuLjJlMjY2MTIgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2lwdjYuYworKysgYi9uZXQvc2N0cC9pcHY2LmMKQEAgLTE4MCw4ICsxODAsNyBAQAogCX0KIAogCVNDVFBfREVCVUdfUFJJTlRLKCIlczogc2tiOiVwLCBsZW46JWQsICIKLQkJCSAgInNyYzolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHggIgotCQkJICAiZHN0OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eFxuIiwKKwkJCSAgInNyYzoiIE5JUDZfRk1UICIgZHN0OiIgTklQNl9GTVQgIlxuIiwKIAkJCSAgX19GVU5DVElPTl9fLCBza2IsIHNrYi0+bGVuLAogCQkJICBOSVA2KGZsLmZsNl9zcmMpLCBOSVA2KGZsLmZsNl9kc3QpKTsKIApAQCAtMjA2LDEzICsyMDUsMTMgQEAKIAkJZmwub2lmID0gZGFkZHItPnY2LnNpbjZfc2NvcGVfaWQ7CiAJCiAKLQlTQ1RQX0RFQlVHX1BSSU5USygiJXM6IERTVD0lMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHggIiwKKwlTQ1RQX0RFQlVHX1BSSU5USygiJXM6IERTVD0iIE5JUDZfRk1UICIgIiwKIAkJCSAgX19GVU5DVElPTl9fLCBOSVA2KGZsLmZsNl9kc3QpKTsKIAogCWlmIChzYWRkcikgewogCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X3NyYywgJnNhZGRyLT52Ni5zaW42X2FkZHIpOwogCQlTQ1RQX0RFQlVHX1BSSU5USygKLQkJCSJTUkM9JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4IC0gIiwKKwkJCSJTUkM9IiBOSVA2X0ZNVCAiIC0gIiwKIAkJCU5JUDYoZmwuZmw2X3NyYykpOwogCX0KIApAQCAtMjIxLDggKzIyMCw3IEBACiAJCXN0cnVjdCBydDZfaW5mbyAqcnQ7CiAJCXJ0ID0gKHN0cnVjdCBydDZfaW5mbyAqKWRzdDsKIAkJU0NUUF9ERUJVR19QUklOVEsoCi0JCQkicnQ2X2RzdDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHggIgotCQkJInJ0Nl9zcmM6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4XG4iLAorCQkJInJ0Nl9kc3Q6IiBOSVA2X0ZNVCAiIHJ0Nl9zcmM6IiBOSVA2X0ZNVCAiXG4iLAogCQkJTklQNihydC0+cnQ2aV9kc3QuYWRkciksIE5JUDYocnQtPnJ0Nmlfc3JjLmFkZHIpKTsKIAl9IGVsc2UgewogCQlTQ1RQX0RFQlVHX1BSSU5USygiTk8gUk9VVEVcbiIpOwpAQCAtMjcxLDEzICsyNjksMTIgQEAKIAlfX3U4IGJtYXRjaGxlbjsKIAogCVNDVFBfREVCVUdfUFJJTlRLKCIlczogYXNvYzolcCBkc3Q6JXAgIgotCQkJICAiZGFkZHI6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4ICIsCisJCQkgICJkYWRkcjoiIE5JUDZfRk1UICIgIiwKIAkJCSAgX19GVU5DVElPTl9fLCBhc29jLCBkc3QsIE5JUDYoZGFkZHItPnY2LnNpbjZfYWRkcikpOwogCiAJaWYgKCFhc29jKSB7CiAJCWlwdjZfZ2V0X3NhZGRyKGRzdCwgJmRhZGRyLT52Ni5zaW42X2FkZHIsJnNhZGRyLT52Ni5zaW42X2FkZHIpOwotCQlTQ1RQX0RFQlVHX1BSSU5USygic2FkZHIgZnJvbSBpcHY2X2dldF9zYWRkcjogIgotCQkJCSAgIiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eFxuIiwKKwkJU0NUUF9ERUJVR19QUklOVEsoInNhZGRyIGZyb20gaXB2Nl9nZXRfc2FkZHI6ICIgTklQNl9GTVQgIlxuIiwKIAkJCQkgIE5JUDYoc2FkZHItPnY2LnNpbjZfYWRkcikpOwogCQlyZXR1cm47CiAJfQpAQCAtMzA1LDEzICszMDIsMTEgQEAKIAogCWlmIChiYWRkcikgewogCQltZW1jcHkoc2FkZHIsIGJhZGRyLCBzaXplb2YodW5pb24gc2N0cF9hZGRyKSk7Ci0JCVNDVFBfREVCVUdfUFJJTlRLKCJzYWRkcjogIgotCQkJCSAgIiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eFxuIiwKKwkJU0NUUF9ERUJVR19QUklOVEsoInNhZGRyOiAiIE5JUDZfRk1UICJcbiIsCiAJCQkJICBOSVA2KHNhZGRyLT52Ni5zaW42X2FkZHIpKTsKIAl9IGVsc2UgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhc29jOiVwIENvdWxkIG5vdCBmaW5kIGEgdmFsaWQgc291cmNlICIKLQkJICAgICAgICJhZGRyZXNzIGZvciB0aGUgIgotCQkgICAgICAgImRlc3Q6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4XG4iLAorCQkgICAgICAgImFkZHJlc3MgZm9yIHRoZSBkZXN0OiIgTklQNl9GTVQgIlxuIiwKIAkJICAgICAgIF9fRlVOQ1RJT05fXywgYXNvYywgTklQNihkYWRkci0+djYuc2luNl9hZGRyKSk7CiAJfQogCkBAIC02NzUsOCArNjcwLDcgQEAKIC8qIER1bXAgdGhlIHY2IGFkZHIgdG8gdGhlIHNlcSBmaWxlLiAqLwogc3RhdGljIHZvaWQgc2N0cF92Nl9zZXFfZHVtcF9hZGRyKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIpCiB7Ci0Jc2VxX3ByaW50ZihzZXEsICIlMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHggIiwKLQkJICAgTklQNihhZGRyLT52Ni5zaW42X2FkZHIpKTsKKwlzZXFfcHJpbnRmKHNlcSwgTklQNl9GTVQgIiAiLCBOSVA2KGFkZHItPnY2LnNpbjZfYWRkcikpOwogfQogCiAvKiBJbml0aWFsaXplIGEgUEZfSU5FVDYgc29ja2V0IG1zZ19uYW1lLiAqLwpAQCAtOTA1LDcgKzg5OSw3IEBACiAJLmZsYWdzICAgICAgICAgPSBTQ1RQX1BST1RPU1dfRkxBRywKIH07CiAKLXN0YXRpYyBpbnQgc2N0cDZfcmN2KHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50ICpuaG9mZnApCitzdGF0aWMgaW50IHNjdHA2X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpCiB7CiAJcmV0dXJuIHNjdHBfcmN2KCpwc2tiKSA/IC0xIDogMDsKIH0KZGlmZiAtLWdpdCBhL25ldC9zY3RwL3Byb2MuYyBiL25ldC9zY3RwL3Byb2MuYwppbmRleCA2ZTRkYzI4Li5kNDdhNTJjIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9wcm9jLmMKKysrIGIvbmV0L3NjdHAvcHJvYy5jCkBAIC0xNzYsNyArMTc2LDcgQEAKIAogc3RhdGljIHZvaWQgKiBzY3RwX2Vwc19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQogewotCWlmICgqcG9zID4gc2N0cF9lcF9oYXNoc2l6ZSkKKwlpZiAoKnBvcyA+PSBzY3RwX2VwX2hhc2hzaXplKQogCQlyZXR1cm4gTlVMTDsKIAogCWlmICgqcG9zIDwgMCkKQEAgLTE4NSw4ICsxODUsNiBAQAogCWlmICgqcG9zID09IDApCiAJCXNlcV9wcmludGYoc2VxLCAiIEVORFBUICAgICBTT0NLICAgU1RZIFNTVCBIQktUIExQT1JUICAgVUlEIElOT0RFIExBRERSU1xuIik7CiAKLQkrKypwb3M7Ci0KIAlyZXR1cm4gKHZvaWQgKilwb3M7CiB9CiAKQEAgLTE5OCwxMSArMTk2LDkgQEAKIAogc3RhdGljIHZvaWQgKiBzY3RwX2Vwc19zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiB7Ci0JaWYgKCpwb3MgPiBzY3RwX2VwX2hhc2hzaXplKQorCWlmICgrKypwb3MgPj0gc2N0cF9lcF9oYXNoc2l6ZSkKIAkJcmV0dXJuIE5VTEw7CiAKLQkrKypwb3M7Ci0KIAlyZXR1cm4gcG9zOwogfQogCkBAIC0yMTQsMTkgKzIxMCwxOSBAQAogCXN0cnVjdCBzY3RwX2VwX2NvbW1vbiAqZXBiOwogCXN0cnVjdCBzY3RwX2VuZHBvaW50ICplcDsKIAlzdHJ1Y3Qgc29jayAqc2s7Ci0JaW50ICAgIGhhc2ggPSAqKGludCAqKXY7CisJaW50ICAgIGhhc2ggPSAqKGxvZmZfdCAqKXY7CiAKLQlpZiAoaGFzaCA+IHNjdHBfZXBfaGFzaHNpemUpCisJaWYgKGhhc2ggPj0gc2N0cF9lcF9oYXNoc2l6ZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQloZWFkID0gJnNjdHBfZXBfaGFzaHRhYmxlW2hhc2gtMV07CisJaGVhZCA9ICZzY3RwX2VwX2hhc2h0YWJsZVtoYXNoXTsKIAlzY3RwX2xvY2FsX2JoX2Rpc2FibGUoKTsKIAlyZWFkX2xvY2soJmhlYWQtPmxvY2spOwogCWZvciAoZXBiID0gaGVhZC0+Y2hhaW47IGVwYjsgZXBiID0gZXBiLT5uZXh0KSB7CiAJCWVwID0gc2N0cF9lcChlcGIpOwogCQlzayA9IGVwYi0+c2s7CiAJCXNlcV9wcmludGYoc2VxLCAiJThwICU4cCAlLTNkICUtM2QgJS00ZCAlLTVkICU1ZCAlNWx1ICIsIGVwLCBzaywKLQkJCSAgIHNjdHBfc2soc2spLT50eXBlLCBzay0+c2tfc3RhdGUsIGhhc2gtMSwKKwkJCSAgIHNjdHBfc2soc2spLT50eXBlLCBzay0+c2tfc3RhdGUsIGhhc2gsCiAJCQkgICBlcGItPmJpbmRfYWRkci5wb3J0LAogCQkJICAgc29ja19pX3VpZChzayksIHNvY2tfaV9pbm8oc2spKTsKIApAQCAtMjgzLDcgKzI3OSw3IEBACiAKIHN0YXRpYyB2b2lkICogc2N0cF9hc3NvY3Nfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKIHsKLQlpZiAoKnBvcyA+IHNjdHBfYXNzb2NfaGFzaHNpemUpCisJaWYgKCpwb3MgPj0gc2N0cF9hc3NvY19oYXNoc2l6ZSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAoKnBvcyA8IDApCkBAIC0yOTMsOCArMjg5LDYgQEAKIAkJc2VxX3ByaW50ZihzZXEsICIgQVNTT0MgICAgIFNPQ0sgICBTVFkgU1NUIFNUIEhCS1QgQVNTT0MtSUQgVFhfUVVFVUUgUlhfUVVFVUUgVUlEIElOT0RFIExQT1JUICIKIAkJCQkiUlBPUlQgTEFERFJTIDwtPiBSQUREUlNcbiIpOwogCi0JKysqcG9zOwotCiAJcmV0dXJuICh2b2lkICopcG9zOwogfQogCkBAIC0zMDYsMTEgKzMwMCw5IEBACiAKIHN0YXRpYyB2b2lkICogc2N0cF9hc3NvY3Nfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQogewotCWlmICgqcG9zID4gc2N0cF9hc3NvY19oYXNoc2l6ZSkKKwlpZiAoKysqcG9zID49IHNjdHBfYXNzb2NfaGFzaHNpemUpCiAJCXJldHVybiBOVUxMOwogCi0JKysqcG9zOwotCiAJcmV0dXJuIHBvczsKIH0KIApAQCAtMzIxLDEyICszMTMsMTIgQEAKIAlzdHJ1Y3Qgc2N0cF9lcF9jb21tb24gKmVwYjsKIAlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNzb2M7CiAJc3RydWN0IHNvY2sgKnNrOwotCWludCAgICBoYXNoID0gKihpbnQgKil2OworCWludCAgICBoYXNoID0gKihsb2ZmX3QgKil2OwogCi0JaWYgKGhhc2ggPiBzY3RwX2Fzc29jX2hhc2hzaXplKQorCWlmIChoYXNoID49IHNjdHBfYXNzb2NfaGFzaHNpemUpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaGVhZCA9ICZzY3RwX2Fzc29jX2hhc2h0YWJsZVtoYXNoLTFdOworCWhlYWQgPSAmc2N0cF9hc3NvY19oYXNodGFibGVbaGFzaF07CiAJc2N0cF9sb2NhbF9iaF9kaXNhYmxlKCk7CiAJcmVhZF9sb2NrKCZoZWFkLT5sb2NrKTsKIAlmb3IgKGVwYiA9IGhlYWQtPmNoYWluOyBlcGI7IGVwYiA9IGVwYi0+bmV4dCkgewpAQCAtMzM1LDcgKzMyNyw3IEBACiAJCXNlcV9wcmludGYoc2VxLAogCQkJICAgIiU4cCAlOHAgJS0zZCAlLTNkICUtMmQgJS00ZCAlNGQgJThkICU4ZCAlN2QgJTVsdSAlLTVkICU1ZCAiLAogCQkJICAgYXNzb2MsIHNrLCBzY3RwX3NrKHNrKS0+dHlwZSwgc2stPnNrX3N0YXRlLAotCQkJICAgYXNzb2MtPnN0YXRlLCBoYXNoLTEsIGFzc29jLT5hc3NvY19pZCwKKwkJCSAgIGFzc29jLT5zdGF0ZSwgaGFzaCwgYXNzb2MtPmFzc29jX2lkLAogCQkJICAgKHNrLT5za19yY3ZidWYgLSBhc3NvYy0+cnduZCksCiAJCQkgICBhc3NvYy0+c25kYnVmX3VzZWQsCiAJCQkgICBzb2NrX2lfdWlkKHNrKSwgc29ja19pX2lubyhzayksCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMgYi9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMKaW5kZXggZjk1NzNlYi4uNWUwZGUzYyAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jCisrKyBiL25ldC9zY3RwL3NtX21ha2VfY2h1bmsuYwpAQCAtMTI3NSw3ICsxMjc1LDEyIEBACiAJdW5zaWduZWQgaW50IGtleWxlbjsKIAljaGFyICprZXk7CiAKLQloZWFkZXJzaXplID0gc2l6ZW9mKHNjdHBfcGFyYW1oZHJfdCkgKyBTQ1RQX1NFQ1JFVF9TSVpFOworCS8qIEhlYWRlciBzaXplIGlzIHN0YXRpYyBkYXRhIHByaW9yIHRvIHRoZSBhY3R1YWwgY29va2llLCBpbmNsdWRpbmcKKwkgKiBhbnkgcGFkZGluZy4KKwkgKi8KKwloZWFkZXJzaXplID0gc2l6ZW9mKHNjdHBfcGFyYW1oZHJfdCkgKyAKKwkJICAgICAoc2l6ZW9mKHN0cnVjdCBzY3RwX3NpZ25lZF9jb29raWUpIC0gCisJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9jb29raWUpKTsKIAlib2R5c2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2N0cF9jb29raWUpCiAJCSsgbnRvaHMoaW5pdF9jaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpICsgYWRkcnNfbGVuOwogCkBAIC0xMjg3LDcgKzEyOTIsNyBAQAogCQkJLSAoYm9keXNpemUgJSBTQ1RQX0NPT0tJRV9NVUxUSVBMRSk7CiAJKmNvb2tpZV9sZW4gPSBoZWFkZXJzaXplICsgYm9keXNpemU7CiAKLQlyZXR2YWwgPSAoc2N0cF9jb29raWVfcGFyYW1fdCAqKWttYWxsb2MoKmNvb2tpZV9sZW4sIEdGUF9BVE9NSUMpOworCXJldHZhbCA9IGttYWxsb2MoKmNvb2tpZV9sZW4sIEdGUF9BVE9NSUMpOwogCiAJaWYgKCFyZXR2YWwpIHsKIAkJKmNvb2tpZV9sZW4gPSAwOwpAQCAtMTM1NCw3ICsxMzU5LDcgQEAKIAlzdHJ1Y3Qgc2N0cF9zaWduZWRfY29va2llICpjb29raWU7CiAJc3RydWN0IHNjdHBfY29va2llICpiZWFyX2Nvb2tpZTsKIAlpbnQgaGVhZGVyc2l6ZSwgYm9keXNpemUsIGZpeGVkX3NpemU7Ci0JX191OCBkaWdlc3RbU0NUUF9TSUdOQVRVUkVfU0laRV07CisJX191OCAqZGlnZXN0ID0gZXAtPmRpZ2VzdDsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CiAJdW5zaWduZWQgaW50IGtleWxlbiwgbGVuOwogCWNoYXIgKmtleTsKQEAgLTEzNjIsNyArMTM2NywxMiBAQAogCXN0cnVjdCBza19idWZmICpza2IgPSBjaHVuay0+c2tiOwogCXN0cnVjdCB0aW1ldmFsIHR2OwogCi0JaGVhZGVyc2l6ZSA9IHNpemVvZihzY3RwX2NodW5raGRyX3QpICsgU0NUUF9TRUNSRVRfU0laRTsKKwkvKiBIZWFkZXIgc2l6ZSBpcyBzdGF0aWMgZGF0YSBwcmlvciB0byB0aGUgYWN0dWFsIGNvb2tpZSwgaW5jbHVkaW5nCisJICogYW55IHBhZGRpbmcuCisJICovCisJaGVhZGVyc2l6ZSA9IHNpemVvZihzY3RwX2NodW5raGRyX3QpICsKKwkJICAgICAoc2l6ZW9mKHN0cnVjdCBzY3RwX3NpZ25lZF9jb29raWUpIC0gCisJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9jb29raWUpKTsKIAlib2R5c2l6ZSA9IG50b2hzKGNodW5rLT5jaHVua19oZHItPmxlbmd0aCkgLSBoZWFkZXJzaXplOwogCWZpeGVkX3NpemUgPSBoZWFkZXJzaXplICsgc2l6ZW9mKHN0cnVjdCBzY3RwX2Nvb2tpZSk7CiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYyBiL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYwppbmRleCAyZDdkOGE1Li44ZDFkYzI0IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMKKysrIGIvbmV0L3NjdHAvc21fc2lkZWVmZmVjdC5jCkBAIC0xMjUwLDggKzEyNTAsNyBAQAogCQljYXNlIFNDVFBfQ01EX1RJTUVSX1NUQVJUOgogCQkJdGltZXIgPSAmYXNvYy0+dGltZXJzW2NtZC0+b2JqLnRvXTsKIAkJCXRpbWVvdXQgPSBhc29jLT50aW1lb3V0c1tjbWQtPm9iai50b107Ci0JCQlpZiAoIXRpbWVvdXQpCi0JCQkJQlVHKCk7CisJCQlCVUdfT04oIXRpbWVvdXQpOwogCiAJCQl0aW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0OwogCQkJc2N0cF9hc3NvY2lhdGlvbl9ob2xkKGFzb2MpOwpAQCAtMTMwMSw3ICsxMzAwLDcgQEAKIAkJCQkJIlQxIElOSVQgVGltZW91dCBhZGp1c3RtZW50IgogCQkJCQkiIGluaXRfZXJyX2NvdW50ZXI6ICVkIgogCQkJCQkiIGN5Y2xlOiAlZCIKLQkJCQkJIiB0aW1lb3V0OiAlZFxuIiwKKwkJCQkJIiB0aW1lb3V0OiAlbGRcbiIsCiAJCQkJCWFzb2MtPmluaXRfZXJyX2NvdW50ZXIsCiAJCQkJCWFzb2MtPmluaXRfY3ljbGUsCiAJCQkJCWFzb2MtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9UMV9JTklUXSk7CkBAIC0xMzI5LDcgKzEzMjgsNyBAQAogCQkJU0NUUF9ERUJVR19QUklOVEsoCiAJCQkJIlQxIENPT0tJRSBUaW1lb3V0IGFkanVzdG1lbnQiCiAJCQkJIiBpbml0X2Vycl9jb3VudGVyOiAlZCIKLQkJCQkiIHRpbWVvdXQ6ICVkXG4iLAorCQkJCSIgdGltZW91dDogJWxkXG4iLAogCQkJCWFzb2MtPmluaXRfZXJyX2NvdW50ZXIsCiAJCQkJYXNvYy0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX1QxX0NPT0tJRV0pOwogCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYyBiL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jCmluZGV4IDU1N2E3ZDkuLjcxYzlhOTYgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jCisrKyBiL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jCkBAIC0xMDM2LDE0ICsxMDM2LDE0IEBACiAJCWlmIChmcm9tX2FkZHIuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkgICAgICAgIiVzIGFzc29jaWF0aW9uICVwIGNvdWxkIG5vdCBmaW5kIGFkZHJlc3MgIgotCQkJICAgICAgICIlMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHhcbiIsCisJCQkgICAgICAgTklQNl9GTVQgIlxuIiwKIAkJCSAgICAgICBfX0ZVTkNUSU9OX18sCiAJCQkgICAgICAgYXNvYywKIAkJCSAgICAgICBOSVA2KGZyb21fYWRkci52Ni5zaW42X2FkZHIpKTsKIAkJfSBlbHNlIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSAgICAgICAiJXMgYXNzb2NpYXRpb24gJXAgY291bGQgbm90IGZpbmQgYWRkcmVzcyAiCi0JCQkgICAgICAgIiV1LiV1LiV1LiV1XG4iLAorCQkJICAgICAgIE5JUFFVQURfRk1UICJcbiIsCiAJCQkgICAgICAgX19GVU5DVElPTl9fLAogCQkJICAgICAgIGFzb2MsCiAJCQkgICAgICAgTklQUVVBRChmcm9tX2FkZHIudjQuc2luX2FkZHIuc19hZGRyKSk7CkBAIC0zMDkwLDYgKzMwOTAsOCBAQAogCQkJYnJlYWs7CiAKIAkJY2hfZW5kID0gKChfX3U4ICopY2gpICsgV09SRF9ST1VORChudG9ocyhjaC0+bGVuZ3RoKSk7CisJCWlmIChjaF9lbmQgPiBza2ItPnRhaWwpCisJCQlicmVhazsKIAogCQlpZiAoU0NUUF9DSURfU0hVVERPV05fQUNLID09IGNoLT50eXBlKQogCQkJb290Yl9zaHV0X2FjayA9IDE7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zb2NrZXQuYyBiL25ldC9zY3RwL3NvY2tldC5jCmluZGV4IGZjMDRkMTguLmZiMTgyMWQgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NvY2tldC5jCisrKyBiL25ldC9zY3RwL3NvY2tldC5jCkBAIC02Myw2ICs2Myw3IEBACiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC04NjAsNyArODYxLDcgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkvKiBBbGxvYyBzcGFjZSBmb3IgdGhlIGFkZHJlc3MgYXJyYXkgaW4ga2VybmVsIG1lbW9yeS4gICovCi0Ja2FkZHJzID0gKHN0cnVjdCBzb2NrYWRkciAqKWttYWxsb2MoYWRkcnNfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJa2FkZHJzID0ga21hbGxvYyhhZGRyc19zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIWthZGRycykpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xMTUwLDcgKzExNTEsNyBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCS8qIEFsbG9jIHNwYWNlIGZvciB0aGUgYWRkcmVzcyBhcnJheSBpbiBrZXJuZWwgbWVtb3J5LiAgKi8KLQlrYWRkcnMgPSAoc3RydWN0IHNvY2thZGRyICopa21hbGxvYyhhZGRyc19zaXplLCBHRlBfS0VSTkVMKTsKKwlrYWRkcnMgPSBrbWFsbG9jKGFkZHJzX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseSgha2FkZHJzKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTI5OTQsNyArMjk5NSw3IEBACiAJc3AtPmhiaW50ZXJ2YWwgID0gamlmZmllc190b19tc2VjcyhzY3RwX2hiX2ludGVydmFsKTsKIAlzcC0+cGF0aG1heHJ4dCAgPSBzY3RwX21heF9yZXRyYW5zX3BhdGg7CiAJc3AtPnBhdGhtdHUgICAgID0gMDsgLy8gYWxsb3cgZGVmYXVsdCBkaXNjb3ZlcnkKLQlzcC0+c2Fja2RlbGF5ICAgPSBzY3RwX3NhY2tfdGltZW91dDsKKwlzcC0+c2Fja2RlbGF5ICAgPSBqaWZmaWVzX3RvX21zZWNzKHNjdHBfc2Fja190aW1lb3V0KTsKIAlzcC0+cGFyYW1fZmxhZ3MgPSBTUFBfSEJfRU5BQkxFIHwKIAkgICAgICAgICAgICAgICAgICBTUFBfUE1UVURfRU5BQkxFIHwKIAkgICAgICAgICAgICAgICAgICBTUFBfU0FDS0RFTEFZX0VOQUJMRTsKQEAgLTU2MDEsOCArNTYwMiwxMiBAQAogCSAqLwogCW5ld3NwLT50eXBlID0gdHlwZTsKIAorCXNwaW5fbG9ja19iaCgmb2xkc2stPnNrX2xvY2suc2xvY2spOworCS8qIE1pZ3JhdGUgdGhlIGJhY2tsb2cgZnJvbSBvbGRzayB0byBuZXdzay4gKi8KKwlzY3RwX2JhY2tsb2dfbWlncmF0ZShhc3NvYywgb2xkc2ssIG5ld3NrKTsKIAkvKiBNaWdyYXRlIHRoZSBhc3NvY2lhdGlvbiB0byB0aGUgbmV3IHNvY2tldC4gKi8KIAlzY3RwX2Fzc29jX21pZ3JhdGUoYXNzb2MsIG5ld3NrKTsKKwlzcGluX3VubG9ja19iaCgmb2xkc2stPnNrX2xvY2suc2xvY2spOwogCiAJLyogSWYgdGhlIGFzc29jaWF0aW9uIG9uIHRoZSBuZXdzayBpcyBhbHJlYWR5IGNsb3NlZCBiZWZvcmUgYWNjZXB0KCkKIAkgKiBpcyBjYWxsZWQsIHNldCBSQ1ZfU0hVVERPV04gZmxhZy4KZGlmZiAtLWdpdCBhL25ldC9zY3RwL3N5c2N0bC5jIGIvbmV0L3NjdHAvc3lzY3RsLmMKaW5kZXggZmNkNzA5Ni4uZGM2ZjNmZiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc3lzY3RsLmMKKysrIGIvbmV0L3NjdHAvc3lzY3RsLmMKQEAgLTE1OSwxMiArMTU5LDkgQEAKIAkJLmN0bF9uYW1lCT0gTkVUX1NDVFBfUFJFU0VSVkVfRU5BQkxFLAogCQkucHJvY25hbWUJPSAiY29va2llX3ByZXNlcnZlX2VuYWJsZSIsCiAJCS5kYXRhCQk9ICZzY3RwX2Nvb2tpZV9wcmVzZXJ2ZV9lbmFibGUsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGxvbmcpLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAogCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG91bG9uZ3ZlY19tc19qaWZmaWVzX21pbm1heCwKLQkJLnN0cmF0ZWd5CT0gJnNjdHBfc3lzY3RsX2ppZmZpZXNfbXMsCi0JCS5leHRyYTEgICAgICAgICA9ICZydG9fdGltZXJfbWluLAotCQkuZXh0cmEyICAgICAgICAgPSAmcnRvX3RpbWVyX21heAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKIAl9LAogCXsKIAkJLmN0bF9uYW1lCT0gTkVUX1NDVFBfUlRPX0FMUEhBLApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvdHJhbnNwb3J0LmMgYi9uZXQvc2N0cC90cmFuc3BvcnQuYwppbmRleCA2OGQ3M2UyLi4xNjBmNjJhIDEwMDY0NAotLS0gYS9uZXQvc2N0cC90cmFuc3BvcnQuYworKysgYi9uZXQvc2N0cC90cmFuc3BvcnQuYwpAQCAtMzUwLDcgKzM1MCw3IEBACiAJdHAtPnJ0b19wZW5kaW5nID0gMDsKIAogCVNDVFBfREVCVUdfUFJJTlRLKCIlczogdHJhbnNwb3J0OiAlcCwgcnR0OiAlZCwgc3J0dDogJWQgIgotCQkJICAicnR0dmFyOiAlZCwgcnRvOiAlZFxuIiwgX19GVU5DVElPTl9fLAorCQkJICAicnR0dmFyOiAlZCwgcnRvOiAlbGRcbiIsIF9fRlVOQ1RJT05fXywKIAkJCSAgdHAsIHJ0dCwgdHAtPnNydHQsIHRwLT5ydHR2YXIsIHRwLT5ydG8pOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc29ja2V0LmMgYi9uZXQvc29ja2V0LmMKaW5kZXggMDZmYTIxNy4uYjM4YTI2MyAxMDA2NDQKLS0tIGEvbmV0L3NvY2tldC5jCisrKyBiL25ldC9zb2NrZXQuYwpAQCAtOTkzLDcgKzk5Myw3IEBACiAKIAlpZiAob24pCiAJewotCQlmbmE9KHN0cnVjdCBmYXN5bmNfc3RydWN0ICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGZhc3luY19zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKKwkJZm5hID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZhc3luY19zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKIAkJaWYoZm5hPT1OVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoLmMgYi9uZXQvc3VucnBjL2F1dGguYwppbmRleCA4Yzc3NTYwLi45YWMxYjhjMiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoLmMKQEAgLTk0LDcgKzk0LDcgQEAKIAlzdHJ1Y3QgcnBjX2NyZWRfY2FjaGUgKm5ldzsKIAlpbnQgaTsKIAotCW5ldyA9IChzdHJ1Y3QgcnBjX2NyZWRfY2FjaGUgKilrbWFsbG9jKHNpemVvZigqbmV3KSwgR0ZQX0tFUk5FTCk7CisJbmV3ID0ga21hbGxvYyhzaXplb2YoKm5ldyksIEdGUF9LRVJORUwpOwogCWlmICghbmV3KQogCQlyZXR1cm4gLUVOT01FTTsKIAlmb3IgKGkgPSAwOyBpIDwgUlBDX0NSRURDQUNIRV9OUjsgaSsrKQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jCmluZGV4IGU0YWRhMTUuLjIzNjMyZDggMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMKQEAgLTQyMCw3ICs0MjAsOCBAQAogCQkJZ3NzX21lY2hfcHV0KGdtKTsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JCWlmIChnc3NfaW1wb3J0X3NlY19jb250ZXh0KGJ1ZiwgbGVuLCBnbSwgJnJzY2kubWVjaGN0eCkpIHsKKwkJc3RhdHVzID0gZ3NzX2ltcG9ydF9zZWNfY29udGV4dChidWYsIGxlbiwgZ20sICZyc2NpLm1lY2hjdHgpOworCQlpZiAoc3RhdHVzKSB7CiAJCQlnc3NfbWVjaF9wdXQoZ20pOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTU4Niw2ICs1ODcsMjAgQEAKIH0KIAogc3RhdGljIGludAorZ3NzX3dyaXRlX251bGxfdmVyZihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQoreworCXUzMiAgICAgKnA7CisKKwlzdmNfcHV0dTMyKHJxc3RwLT5ycV9yZXMuaGVhZCwgaHRvbmwoUlBDX0FVVEhfTlVMTCkpOworCXAgPSBycXN0cC0+cnFfcmVzLmhlYWQtPmlvdl9iYXNlICsgcnFzdHAtPnJxX3Jlcy5oZWFkLT5pb3ZfbGVuOworCS8qIGRvbid0IHJlYWxseSBuZWVkIHRvIGNoZWNrIGlmIGhlYWQtPmlvdl9sZW4gPiBQQUdFX1NJWkUgLi4uICovCisJKnArKyA9IDA7CisJaWYgKCF4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCkpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAogZ3NzX3dyaXRlX3ZlcmYoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IGdzc19jdHggKmN0eF9pZCwgdTMyIHNlcSkKIHsKIAl1MzIJCQl4ZHJfc2VxOwpAQCAtNzQxLDYgKzc1NiwyMSBAQAogCXJldHVybiBTVkNfT0s7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50Citnc3Nfd3JpdGVfaW5pdF92ZXJmKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCByc2kgKnJzaXApCit7CisJc3RydWN0IHJzYyAqcnNjaTsKKworCWlmIChyc2lwLT5tYWpvcl9zdGF0dXMgIT0gR1NTX1NfQ09NUExFVEUpCisJCXJldHVybiBnc3Nfd3JpdGVfbnVsbF92ZXJmKHJxc3RwKTsKKwlyc2NpID0gZ3NzX3N2Y19zZWFyY2hieWN0eCgmcnNpcC0+b3V0X2hhbmRsZSk7CisJaWYgKHJzY2kgPT0gTlVMTCkgeworCQlyc2lwLT5tYWpvcl9zdGF0dXMgPSBHU1NfU19OT19DT05URVhUOworCQlyZXR1cm4gZ3NzX3dyaXRlX251bGxfdmVyZihycXN0cCk7CisJfQorCXJldHVybiBnc3Nfd3JpdGVfdmVyZihycXN0cCwgcnNjaS0+bWVjaGN0eCwgR1NTX1NFUV9XSU4pOworfQorCiAvKgogICogQWNjZXB0IGFuIHJwY3NlYyBwYWNrZXQuCiAgKiBJZiBjb250ZXh0IGVzdGFibGlzaG1lbnQsIHB1bnQgdG8gdXNlciBzcGFjZQpAQCAtODc2LDExICs5MDYsNyBAQAogCQljYXNlIC1FTk9FTlQ6CiAJCQlnb3RvIGRyb3A7CiAJCWNhc2UgMDoKLQkJCXJzY2kgPSBnc3Nfc3ZjX3NlYXJjaGJ5Y3R4KCZyc2lwLT5vdXRfaGFuZGxlKTsKLQkJCWlmICghcnNjaSkgewotCQkJCWdvdG8gZHJvcDsKLQkJCX0KLQkJCWlmIChnc3Nfd3JpdGVfdmVyZihycXN0cCwgcnNjaS0+bWVjaGN0eCwgR1NTX1NFUV9XSU4pKQorCQkJaWYgKGdzc193cml0ZV9pbml0X3ZlcmYocnFzdHAsIHJzaXApKQogCQkJCWdvdG8gZHJvcDsKIAkJCWlmIChyZXN2LT5pb3ZfbGVuICsgNCA+IFBBR0VfU0laRSkKIAkJCQlnb3RvIGRyb3A7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfdW5peC5jIGIvbmV0L3N1bnJwYy9hdXRoX3VuaXguYwppbmRleCA4OTBmYjVlLi4xYjNlZDRmIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfdW5peC5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF91bml4LmMKQEAgLTcwLDcgKzcwLDcgQEAKIAlkcHJpbnRrKCJSUEM6ICAgICAgYWxsb2NhdGluZyBVTklYIGNyZWQgZm9yIHVpZCAlZCBnaWQgJWRcbiIsCiAJCQkJYWNyZWQtPnVpZCwgYWNyZWQtPmdpZCk7CiAKLQlpZiAoIShjcmVkID0gKHN0cnVjdCB1bnhfY3JlZCAqKSBrbWFsbG9jKHNpemVvZigqY3JlZCksIEdGUF9LRVJORUwpKSkKKwlpZiAoIShjcmVkID0ga21hbGxvYyhzaXplb2YoKmNyZWQpLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJYXRvbWljX3NldCgmY3JlZC0+dWNfY291bnQsIDEpOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9jYWNoZS5jIGIvbmV0L3N1bnJwYy9jYWNoZS5jCmluZGV4IGY1MDllOTkuLmRjYWEwYzQgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvY2FjaGUuYworKysgYi9uZXQvc3VucnBjL2NhY2hlLmMKQEAgLTU3NSwxMiArNTc1LDExIEBACiAJaWYgKHJwLT5xLmxpc3QubmV4dCA9PSAmY2QtPnF1ZXVlKSB7CiAJCXNwaW5fdW5sb2NrKCZxdWV1ZV9sb2NrKTsKIAkJdXAoJnF1ZXVlX2lvX3NlbSk7Ci0JCWlmIChycC0+b2Zmc2V0KQotCQkJQlVHKCk7CisJCUJVR19PTihycC0+b2Zmc2V0KTsKIAkJcmV0dXJuIDA7CiAJfQogCXJxID0gY29udGFpbmVyX29mKHJwLT5xLmxpc3QubmV4dCwgc3RydWN0IGNhY2hlX3JlcXVlc3QsIHEubGlzdCk7Ci0JaWYgKHJxLT5xLnJlYWRlcikgQlVHKCk7CisJQlVHX09OKHJxLT5xLnJlYWRlcik7CiAJaWYgKHJwLT5vZmZzZXQgPT0gMCkKIAkJcnEtPnJlYWRlcnMrKzsKIAlzcGluX3VubG9jaygmcXVldWVfbG9jayk7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2NsbnQuYyBiL25ldC9zdW5ycGMvY2xudC5jCmluZGV4IDU1MzBhYzguLmQyZjA1NTAgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvY2xudC5jCisrKyBiL25ldC9zdW5ycGMvY2xudC5jCkBAIC0xMTgsNyArMTE4LDcgQEAKIAkJZ290byBvdXRfZXJyOwogCiAJZXJyID0gLUVOT01FTTsKLQljbG50ID0gKHN0cnVjdCBycGNfY2xudCAqKSBrbWFsbG9jKHNpemVvZigqY2xudCksIEdGUF9LRVJORUwpOworCWNsbnQgPSBrbWFsbG9jKHNpemVvZigqY2xudCksIEdGUF9LRVJORUwpOwogCWlmICghY2xudCkKIAkJZ290byBvdXRfZXJyOwogCW1lbXNldChjbG50LCAwLCBzaXplb2YoKmNsbnQpKTsKQEAgLTIyNSw3ICsyMjUsNyBAQAogewogCXN0cnVjdCBycGNfY2xudCAqbmV3OwogCi0JbmV3ID0gKHN0cnVjdCBycGNfY2xudCAqKWttYWxsb2Moc2l6ZW9mKCpuZXcpLCBHRlBfS0VSTkVMKTsKKwluZXcgPSBrbWFsbG9jKHNpemVvZigqbmV3KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuZXcpCiAJCWdvdG8gb3V0X25vX2NsbnQ7CiAJbWVtY3B5KG5ldywgY2xudCwgc2l6ZW9mKCpuZXcpKTsKQEAgLTI2OCw3ICsyNjgsOCBAQAogCQljbG50LT5jbF9vbmVzaG90ID0gMDsKIAkJY2xudC0+Y2xfZGVhZCA9IDA7CiAJCXJwY19raWxsYWxsX3Rhc2tzKGNsbnQpOwotCQlzbGVlcF9vbl90aW1lb3V0KCZkZXN0cm95X3dhaXQsIDEqSFopOworCQl3YWl0X2V2ZW50X3RpbWVvdXQoZGVzdHJveV93YWl0LAorCQkJIWF0b21pY19yZWFkKCZjbG50LT5jbF91c2VycyksIDEqSFopOwogCX0KIAogCWlmIChhdG9taWNfcmVhZCgmY2xudC0+Y2xfdXNlcnMpIDwgMCkgewpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9ycGNfcGlwZS5jIGIvbmV0L3N1bnJwYy9ycGNfcGlwZS5jCmluZGV4IDI0Y2MyM2EuLjk3NjRjODAgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvcnBjX3BpcGUuYworKysgYi9uZXQvc3VucnBjL3JwY19waXBlLmMKQEAgLTY5LDEzICs2OSwxMyBAQAogCXN0cnVjdCBycGNfaW5vZGUgKnJwY2kgPSAoc3RydWN0IHJwY19pbm9kZSAqKWRhdGE7CiAJc3RydWN0IGlub2RlICppbm9kZSA9ICZycGNpLT52ZnNfaW5vZGU7CiAKLQlkb3duKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAlpZiAocnBjaS0+b3BzID09IE5VTEwpCiAJCWdvdG8gb3V0OwogCWlmIChycGNpLT5ucmVhZGVycyA9PSAwICYmICFsaXN0X2VtcHR5KCZycGNpLT5waXBlKSkKIAkJX19ycGNfcHVyZ2VfdXBjYWxsKGlub2RlLCAtRVRJTUVET1VUKTsKIG91dDoKLQl1cCgmaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIH0KIAogaW50CkBAIC04NCw3ICs4NCw3IEBACiAJc3RydWN0IHJwY19pbm9kZSAqcnBjaSA9IFJQQ19JKGlub2RlKTsKIAlpbnQgcmVzID0gLUVQSVBFOwogCi0JZG93bigmaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJaWYgKHJwY2ktPm9wcyA9PSBOVUxMKQogCQlnb3RvIG91dDsKIAlpZiAocnBjaS0+bnJlYWRlcnMpIHsKQEAgLTEwMCw3ICsxMDAsNyBAQAogCQlyZXMgPSAwOwogCX0KIG91dDoKLQl1cCgmaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAl3YWtlX3VwKCZycGNpLT53YWl0cSk7CiAJcmV0dXJuIHJlczsKIH0KQEAgLTExNiw3ICsxMTYsNyBAQAogewogCXN0cnVjdCBycGNfaW5vZGUgKnJwY2kgPSBSUENfSShpbm9kZSk7CiAKLQlkb3duKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAlpZiAocnBjaS0+b3BzICE9IE5VTEwpIHsKIAkJcnBjaS0+bnJlYWRlcnMgPSAwOwogCQlfX3JwY19wdXJnZV9saXN0KHJwY2ksICZycGNpLT5pbl91cGNhbGwsIC1FUElQRSk7CkBAIC0xMjcsNyArMTI3LDcgQEAKIAkJcnBjaS0+b3BzID0gTlVMTDsKIAl9CiAJcnBjX2lub2RlX3NldG93bmVyKGlub2RlLCBOVUxMKTsKLQl1cCgmaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAljYW5jZWxfZGVsYXllZF93b3JrKCZycGNpLT5xdWV1ZV90aW1lb3V0KTsKIAlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogfQpAQCAtMTU0LDcgKzE1NCw3IEBACiAJc3RydWN0IHJwY19pbm9kZSAqcnBjaSA9IFJQQ19JKGlub2RlKTsKIAlpbnQgcmVzID0gLUVOWElPOwogCi0JZG93bigmaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJaWYgKHJwY2ktPm9wcyAhPSBOVUxMKSB7CiAJCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9SRUFEKQogCQkJcnBjaS0+bnJlYWRlcnMgKys7CkBAIC0xNjIsNyArMTYyLDcgQEAKIAkJCXJwY2ktPm53cml0ZXJzICsrOwogCQlyZXMgPSAwOwogCX0KLQl1cCgmaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC0xNzIsNyArMTcyLDcgQEAKIAlzdHJ1Y3QgcnBjX2lub2RlICpycGNpID0gUlBDX0koaW5vZGUpOwogCXN0cnVjdCBycGNfcGlwZV9tc2cgKm1zZzsKIAotCWRvd24oJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCWlmIChycGNpLT5vcHMgPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAJbXNnID0gKHN0cnVjdCBycGNfcGlwZV9tc2cgKilmaWxwLT5wcml2YXRlX2RhdGE7CkBAIC0xOTAsNyArMTkwLDcgQEAKIAlpZiAocnBjaS0+b3BzLT5yZWxlYXNlX3BpcGUpCiAJCXJwY2ktPm9wcy0+cmVsZWFzZV9waXBlKGlub2RlKTsKIG91dDoKLQl1cCgmaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjAyLDcgKzIwMiw3IEBACiAJc3RydWN0IHJwY19waXBlX21zZyAqbXNnOwogCWludCByZXMgPSAwOwogCi0JZG93bigmaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJaWYgKHJwY2ktPm9wcyA9PSBOVUxMKSB7CiAJCXJlcyA9IC1FUElQRTsKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtMjI5LDcgKzIyOSw3IEBACiAJCXJwY2ktPm9wcy0+ZGVzdHJveV9tc2cobXNnKTsKIAl9CiBvdXRfdW5sb2NrOgotCXVwKCZpbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTI0MCwxMSArMjQwLDExIEBACiAJc3RydWN0IHJwY19pbm9kZSAqcnBjaSA9IFJQQ19JKGlub2RlKTsKIAlpbnQgcmVzOwogCi0JZG93bigmaW5vZGUtPmlfc2VtKTsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJcmVzID0gLUVQSVBFOwogCWlmIChycGNpLT5vcHMgIT0gTlVMTCkKIAkJcmVzID0gcnBjaS0+b3BzLT5kb3duY2FsbChmaWxwLCBidWYsIGxlbik7Ci0JdXAoJmlub2RlLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtMzIyLDcgKzMyMiw3IEBACiAKIAlpZiAoIXJldCkgewogCQlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JCWRvd24oJmlub2RlLT5pX3NlbSk7CisJCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAkJY2xudCA9IFJQQ19JKGlub2RlKS0+cHJpdmF0ZTsKIAkJaWYgKGNsbnQpIHsKIAkJCWF0b21pY19pbmMoJmNsbnQtPmNsX3VzZXJzKTsKQEAgLTMzMSw3ICszMzEsNyBAQAogCQkJc2luZ2xlX3JlbGVhc2UoaW5vZGUsIGZpbGUpOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJfQotCQl1cCgmaW5vZGUtPmlfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC00OTEsMTEgKzQ5MSwxMSBAQAogCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgKmR2ZWNbMTBdOwogCWludCBuID0gMDsKIAotCWRvd24oJmRpci0+aV9zZW0pOworCW11dGV4X2xvY2soJmRpci0+aV9tdXRleCk7CiByZXBlYXQ6CiAJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbmV4dCwgJnBhcmVudC0+ZF9zdWJkaXJzKSB7Ci0JCWRlbnRyeSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgZGVudHJ5LCBkX2NoaWxkKTsKKwkJZGVudHJ5ID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBkZW50cnksIGRfdS5kX2NoaWxkKTsKIAkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CiAJCWlmICghZF91bmhhc2hlZChkZW50cnkpKSB7CiAJCQlkZ2V0X2xvY2tlZChkZW50cnkpOwpAQCAtNTE5LDcgKzUxOSw3IEBACiAJCX0gd2hpbGUgKG4pOwogCQlnb3RvIHJlcGVhdDsKIAl9Ci0JdXAoJmRpci0+aV9zZW0pOworCW11dGV4X3VubG9jaygmZGlyLT5pX211dGV4KTsKIH0KIAogc3RhdGljIGludApAQCAtNTMyLDcgKzUzMiw3IEBACiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCWludCBtb2RlLCBpOwogCi0JZG93bigmZGlyLT5pX3NlbSk7CisJbXV0ZXhfbG9jaygmZGlyLT5pX211dGV4KTsKIAlmb3IgKGkgPSBzdGFydDsgaSA8IGVvZjsgaSsrKSB7CiAJCWRlbnRyeSA9IGRfYWxsb2NfbmFtZShwYXJlbnQsIGZpbGVzW2ldLm5hbWUpOwogCQlpZiAoIWRlbnRyeSkKQEAgLTU1MiwxMCArNTUyLDEwIEBACiAJCQlkaXItPmlfbmxpbmsrKzsKIAkJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAJfQotCXVwKCZkaXItPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmRpci0+aV9tdXRleCk7CiAJcmV0dXJuIDA7CiBvdXRfYmFkOgotCXVwKCZkaXItPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmRpci0+aV9tdXRleCk7CiAJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICVzIGZhaWxlZCB0byBwb3B1bGF0ZSBkaXJlY3RvcnkgJXNcbiIsCiAJCQlfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBwYXJlbnQtPmRfbmFtZS5uYW1lKTsKIAlyZXR1cm4gLUVOT01FTTsKQEAgLTYwOSw3ICs2MDksNyBAQAogCWlmICgoZXJyb3IgPSBycGNfbG9va3VwX3BhcmVudChwYXRoLCBuZCkpICE9IDApCiAJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKIAlkaXIgPSBuZC0+ZGVudHJ5LT5kX2lub2RlOwotCWRvd24oJmRpci0+aV9zZW0pOworCW11dGV4X2xvY2soJmRpci0+aV9tdXRleCk7CiAJZGVudHJ5ID0gbG9va3VwX2hhc2gobmQpOwogCWlmIChJU19FUlIoZGVudHJ5KSkKIAkJZ290byBvdXRfZXJyOwpAQCAtNjIwLDcgKzYyMCw3IEBACiAJfQogCXJldHVybiBkZW50cnk7CiBvdXRfZXJyOgotCXVwKCZkaXItPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmRpci0+aV9tdXRleCk7CiAJcnBjX3JlbGVhc2VfcGF0aChuZCk7CiAJcmV0dXJuIGRlbnRyeTsKIH0KQEAgLTY0Niw3ICs2NDYsNyBAQAogCWlmIChlcnJvcikKIAkJZ290byBlcnJfZGVwb3B1bGF0ZTsKIG91dDoKLQl1cCgmZGlyLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZkaXItPmlfbXV0ZXgpOwogCXJwY19yZWxlYXNlX3BhdGgoJm5kKTsKIAlyZXR1cm4gZGVudHJ5OwogZXJyX2RlcG9wdWxhdGU6CkBAIC02NzEsNyArNjcxLDcgQEAKIAlpZiAoKGVycm9yID0gcnBjX2xvb2t1cF9wYXJlbnQocGF0aCwgJm5kKSkgIT0gMCkKIAkJcmV0dXJuIGVycm9yOwogCWRpciA9IG5kLmRlbnRyeS0+ZF9pbm9kZTsKLQlkb3duKCZkaXItPmlfc2VtKTsKKwltdXRleF9sb2NrKCZkaXItPmlfbXV0ZXgpOwogCWRlbnRyeSA9IGxvb2t1cF9oYXNoKCZuZCk7CiAJaWYgKElTX0VSUihkZW50cnkpKSB7CiAJCWVycm9yID0gUFRSX0VSUihkZW50cnkpOwpAQCAtNjgxLDcgKzY4MSw3IEBACiAJZXJyb3IgPSBfX3JwY19ybWRpcihkaXIsIGRlbnRyeSk7CiAJZHB1dChkZW50cnkpOwogb3V0X3JlbGVhc2U6Ci0JdXAoJmRpci0+aV9zZW0pOworCW11dGV4X3VubG9jaygmZGlyLT5pX211dGV4KTsKIAlycGNfcmVsZWFzZV9wYXRoKCZuZCk7CiAJcmV0dXJuIGVycm9yOwogfQpAQCAtNzEwLDcgKzcxMCw3IEBACiAJcnBjaS0+b3BzID0gb3BzOwogCWlub2RlX2Rpcl9ub3RpZnkoZGlyLCBETl9DUkVBVEUpOwogb3V0OgotCXVwKCZkaXItPmlfc2VtKTsKKwltdXRleF91bmxvY2soJmRpci0+aV9tdXRleCk7CiAJcnBjX3JlbGVhc2VfcGF0aCgmbmQpOwogCXJldHVybiBkZW50cnk7CiBlcnJfZHB1dDoKQEAgLTczMiw3ICs3MzIsNyBAQAogCWlmICgoZXJyb3IgPSBycGNfbG9va3VwX3BhcmVudChwYXRoLCAmbmQpKSAhPSAwKQogCQlyZXR1cm4gZXJyb3I7CiAJZGlyID0gbmQuZGVudHJ5LT5kX2lub2RlOwotCWRvd24oJmRpci0+aV9zZW0pOworCW11dGV4X2xvY2soJmRpci0+aV9tdXRleCk7CiAJZGVudHJ5ID0gbG9va3VwX2hhc2goJm5kKTsKIAlpZiAoSVNfRVJSKGRlbnRyeSkpIHsKIAkJZXJyb3IgPSBQVFJfRVJSKGRlbnRyeSk7CkBAIC03NDYsNyArNzQ2LDcgQEAKIAlkcHV0KGRlbnRyeSk7CiAJaW5vZGVfZGlyX25vdGlmeShkaXIsIEROX0RFTEVURSk7CiBvdXRfcmVsZWFzZToKLQl1cCgmZGlyLT5pX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZkaXItPmlfbXV0ZXgpOwogCXJwY19yZWxlYXNlX3BhdGgoJm5kKTsKIAlyZXR1cm4gZXJyb3I7CiB9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Yy5jIGIvbmV0L3N1bnJwYy9zdmMuYwppbmRleCBlNDI5NmM4Li5iMDg0MTllIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Yy5jCisrKyBiL25ldC9zdW5ycGMvc3ZjLmMKQEAgLTMyLDcgKzMyLDcgQEAKIAlpbnQgdmVyczsKIAl1bnNpZ25lZCBpbnQgeGRyc2l6ZTsKIAotCWlmICghKHNlcnYgPSAoc3RydWN0IHN2Y19zZXJ2ICopIGttYWxsb2Moc2l6ZW9mKCpzZXJ2KSwgR0ZQX0tFUk5FTCkpKQorCWlmICghKHNlcnYgPSBrbWFsbG9jKHNpemVvZigqc2VydiksIEdGUF9LRVJORUwpKSkKIAkJcmV0dXJuIE5VTEw7CiAJbWVtc2V0KHNlcnYsIDAsIHNpemVvZigqc2VydikpOwogCXNlcnYtPnN2X25hbWUgICAgICA9IHByb2ctPnBnX25hbWU7CkBAIC0xMjIsOCArMTIyLDcgQEAKIAlycXN0cC0+cnFfYXJndXNlZCA9IDA7CiAJcnFzdHAtPnJxX3Jlc3VzZWQgPSAwOwogCWFyZ2hpID0gMDsKLQlpZiAocGFnZXMgPiBSUENTVkNfTUFYUEFHRVMpCi0JCUJVRygpOworCUJVR19PTihwYWdlcyA+IFJQQ1NWQ19NQVhQQUdFUyk7CiAJd2hpbGUgKHBhZ2VzKSB7CiAJCXN0cnVjdCBwYWdlICpwID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKIAkJaWYgKCFwKQpAQCAtMTY3LDggKzE2Niw4IEBACiAJbWVtc2V0KHJxc3RwLCAwLCBzaXplb2YoKnJxc3RwKSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcnFzdHAtPnJxX3dhaXQpOwogCi0JaWYgKCEocnFzdHAtPnJxX2FyZ3AgPSAodTMyICopIGttYWxsb2Moc2Vydi0+c3ZfeGRyc2l6ZSwgR0ZQX0tFUk5FTCkpCi0JIHx8ICEocnFzdHAtPnJxX3Jlc3AgPSAodTMyICopIGttYWxsb2Moc2Vydi0+c3ZfeGRyc2l6ZSwgR0ZQX0tFUk5FTCkpCisJaWYgKCEocnFzdHAtPnJxX2FyZ3AgPSBrbWFsbG9jKHNlcnYtPnN2X3hkcnNpemUsIEdGUF9LRVJORUwpKQorCSB8fCAhKHJxc3RwLT5ycV9yZXNwID0ga21hbGxvYyhzZXJ2LT5zdl94ZHJzaXplLCBHRlBfS0VSTkVMKSkKIAkgfHwgIXN2Y19pbml0X2J1ZmZlcihycXN0cCwgc2Vydi0+c3ZfYnVmc3opKQogCQlnb3RvIG91dF90aHJlYWQ7CiAKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3Zjc29jay5jIGIvbmV0L3N1bnJwYy9zdmNzb2NrLmMKaW5kZXggZTY3NjEzZS4uNTA1ODA2MiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNzb2NrLmMKKysrIGIvbmV0L3N1bnJwYy9zdmNzb2NrLmMKQEAgLTE1MjcsNiArMTUyNyw3IEBACiAJCWRyLT5oYW5kbGUub3duZXIgPSBycXN0cC0+cnFfc2VydmVyOwogCQlkci0+cHJvdCA9IHJxc3RwLT5ycV9wcm90OwogCQlkci0+YWRkciA9IHJxc3RwLT5ycV9hZGRyOworCQlkci0+ZGFkZHIgPSBycXN0cC0+cnFfZGFkZHI7CiAJCWRyLT5hcmdzbGVuID0gcnFzdHAtPnJxX2FyZy5sZW4gPj4gMjsKIAkJbWVtY3B5KGRyLT5hcmdzLCBycXN0cC0+cnFfYXJnLmhlYWRbMF0uaW92X2Jhc2Utc2tpcCwgZHItPmFyZ3NsZW48PDIpOwogCX0KQEAgLTE1NTIsNiArMTU1Myw3IEBACiAJcnFzdHAtPnJxX2FyZy5sZW4gPSBkci0+YXJnc2xlbjw8MjsKIAlycXN0cC0+cnFfcHJvdCAgICAgICAgPSBkci0+cHJvdDsKIAlycXN0cC0+cnFfYWRkciAgICAgICAgPSBkci0+YWRkcjsKKwlycXN0cC0+cnFfZGFkZHIgICAgICAgPSBkci0+ZGFkZHI7CiAJcmV0dXJuIGRyLT5hcmdzbGVuPDwyOwogfQogCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9LY29uZmlnIGIvbmV0L3RpcGMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODkxY2MwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvS2NvbmZpZwpAQCAtMCwwICsxLDExNyBAQAorIworIyBUSVBDIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudSAiVElQQyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gSU5FVCAmJiBFWFBFUklNRU5UQUwKKworY29uZmlnIFRJUEMKKwl0cmlzdGF0ZSAiVGhlIFRJUEMgUHJvdG9jb2wgKEVYUEVSSU1FTlRBTCkiCisJLS0taGVscC0tLQorCSAgVGhlIFRyYW5zcGFyZW50IEludGVyIFByb2Nlc3MgQ29tbXVuaWNhdGlvbiAoVElQQykgcHJvdG9jb2wgaXMKKwkgIHNwZWNpYWxseSBkZXNpZ25lZCBmb3IgaW50cmEgY2x1c3RlciBjb21tdW5pY2F0aW9uLiBUaGlzIHByb3RvY29sCisJICBvcmlnaW5hdGVzIGZyb20gRXJpY3Nzb24gd2hlcmUgaXQgaGFzIGJlZW4gdXNlZCBpbiBjYXJyaWVyIGdyYWRlCisJICBjbHVzdGVyIGFwcGxpY2F0aW9ucyBmb3IgbWFueSB5ZWFycy4KKwkKKwkgIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IFRJUEMsIHNlZSBodHRwOi8vdGlwYy5zb3VyY2Vmb3JnZS5uZXQuCisKKwkgIFRoaXMgcHJvdG9jb2wgc3VwcG9ydCBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZSAoID0gY29kZSB3aGljaAorCSAgY2FuIGJlIGluc2VydGVkIGluIGFuZCByZW1vdmVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdQorCSAgd2FudCkuIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdGlwYy4gSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdAorCSAgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFRJUENfQURWQU5DRUQKKwlib29sICJUSVBDOiBBZHZhbmNlZCBjb25maWd1cmF0aW9uIgorCWRlcGVuZHMgb24gVElQQworCWRlZmF1bHQgbgorCWhlbHAKKwkgIFNheWluZyBZIGhlcmUgd2lsbCBvcGVuIHNvbWUgYWR2YW5jZWQgY29uZmlndXJhdGlvbgorICAgICAgICAgIGZvciBUSVBDLiBNb3N0IHVzZXJzIGRvIG5vdCBuZWVkIHRvIGJvdGhlciwgc28gaWYKKyAgICAgICAgICB1bnN1cmUsIGp1c3Qgc2F5IE4uCisKK2NvbmZpZyBUSVBDX1pPTkVTCisJaW50ICJNYXhpbXVtIG51bWJlciBvZiB6b25lcyBpbiBuZXR3b3JrIgorCWRlcGVuZHMgb24gVElQQyAmJiBUSVBDX0FEVkFOQ0VECisJZGVmYXVsdCAiMyIKKwloZWxwCisJIE1heCBudW1iZXIgb2Ygem9uZXMgaW5zaWRlIFRJUEMgbmV0d29yay4gTWF4IHN1cHBvcnRlZCB2YWx1ZSAKKyAgICAgICAgIGlzIDI1NSB6b25lcywgbWluaW11bSBpcyAxCisKKwkgRGVmYXVsdCBpcyAzIHpvbmVzIGluIGEgbmV0d29yazsgc2V0dGluZyB0aGlzIHRvIGhpZ2hlcgorCSBhbGxvd3MgbW9yZSB6b25lcyBidXQgbWlnaHQgdXNlIG1vcmUgbWVtb3J5LgorCitjb25maWcgVElQQ19DTFVTVEVSUworCWludCAiTWF4aW11bSBudW1iZXIgb2YgY2x1c3RlcnMgaW4gYSB6b25lIgorCWRlcGVuZHMgb24gVElQQyAmJiBUSVBDX0FEVkFOQ0VECisJZGVmYXVsdCAiMSIKKwloZWxwCisgICAgICAgICAgKioqT25seSAxIChvbmUgY2x1c3RlciBpbiBhIHpvbmUpIGlzIHN1cHBvcnRlZCBieSBjdXJyZW50IGNvZGUuCisgICAgICAgICAgQW55IHZhbHVlIHNldCBoZXJlIHdpbGwgYmUgb3ZlcnJpZGRlbi4qKioKKworICAgICAgICAgIChNYXggbnVtYmVyIG9mIGNsdXN0ZXJzIGluc2lkZSBUSVBDIHpvbmUuIE1heCBzdXBwb3J0ZWQgCisgICAgICAgICAgdmFsdWUgaXMgNDA5NSBjbHVzdGVycywgbWluaW11bSBpcyAxLgorCisJICBEZWZhdWx0IGlzIDE7IHNldHRpbmcgdGhpcyB0byBzbWFsbGVyIHZhbHVlIG1pZ2h0IHNhdmUgCisgICAgICAgICAgc29tZSBtZW1vcnksIHNldHRpbmcgaXQgdG8gaGlnaGVyCisJICBhbGxvd3MgbW9yZSBjbHVzdGVycyBhbmQgbWlnaHQgY29uc3VtZSBtb3JlIG1lbW9yeS4pCisKK2NvbmZpZyBUSVBDX05PREVTCisJaW50ICJNYXhpbXVtIG51bWJlciBvZiBub2RlcyBpbiBjbHVzdGVyIgorCWRlcGVuZHMgb24gVElQQyAmJiBUSVBDX0FEVkFOQ0VECisJZGVmYXVsdCAiMjU1IgorCWhlbHAKKwkgIE1heGltdW0gbnVtYmVyIG9mIG5vZGVzIGluc2lkZSBhIFRJUEMgY2x1c3Rlci4gTWF4aW11bSAKKyAgICAgICAgICBzdXBwb3J0ZWQgdmFsdWUgaXMgMjA0NyBub2RlcywgbWluaW11bSBpcyA4LiAKKworCSAgU2V0dGluZyB0aGlzIHRvIGEgc21hbGxlciB2YWx1ZSBzYXZlcyBzb21lIG1lbW9yeSwgCisJICBzZXR0aW5nIGl0IHRvIGhpZ2hlciBhbGxvd3MgbW9yZSBub2Rlcy4KKworY29uZmlnIFRJUENfU0xBVkVfTk9ERVMKKwlpbnQgIk1heGltdW0gbnVtYmVyIG9mIHNsYXZlIG5vZGVzIGluIGNsdXN0ZXIiCisJZGVwZW5kcyBvbiBUSVBDICYmIFRJUENfQURWQU5DRUQKKwlkZWZhdWx0ICIwIgorCWhlbHAKKyAgICAgICAgICAqKipUaGlzIGNhcGFiaWxpdHkgaXMgbm90IHN1cHBvcnRlZCBieSBjdXJyZW50IGNvZGUuKioqCisJICAKKwkgIE1heGltdW0gbnVtYmVyIG9mIHNsYXZlIG5vZGVzIGluc2lkZSBhIFRJUEMgY2x1c3Rlci4gTWF4aW11bSAKKyAgICAgICAgICBzdXBwb3J0ZWQgdmFsdWUgaXMgMjA0NyBub2RlcywgbWluaW11bSBpcyAwLiAKKworCSAgU2V0dGluZyB0aGlzIHRvIGEgc21hbGxlciB2YWx1ZSBzYXZlcyBzb21lIG1lbW9yeSwgCisJICBzZXR0aW5nIGl0IHRvIGhpZ2hlciBhbGxvd3MgbW9yZSBub2Rlcy4KKworY29uZmlnIFRJUENfUE9SVFMKKwlpbnQgIk1heGltdW0gbnVtYmVyIG9mIHBvcnRzIGluIGEgbm9kZSIKKwlkZXBlbmRzIG9uIFRJUEMgJiYgVElQQ19BRFZBTkNFRAorCWRlZmF1bHQgIjgxOTEiCisJaGVscAorCSAgTWF4aW11bSBudW1iZXIgb2YgcG9ydHMgd2l0aGluIGEgbm9kZS4gTWF4aW11bSAKKyAgICAgICAgICBzdXBwb3J0ZWQgdmFsdWUgaXMgNjQ1MzUgbm9kZXMsIG1pbmltdW0gaXMgMTI3LiAKKworCSAgU2V0dGluZyB0aGlzIHRvIGEgc21hbGxlciB2YWx1ZSBzYXZlcyBzb21lIG1lbW9yeSwgCisJICBzZXR0aW5nIGl0IHRvIGhpZ2hlciBhbGxvd3MgbW9yZSBwb3J0cy4KKworY29uZmlnIFRJUENfTE9HCisJaW50ICJTaXplIG9mIGxvZyBidWZmZXIiCisJZGVwZW5kcyBvbiBUSVBDICYmIFRJUENfQURWQU5DRUQKKwlkZWZhdWx0IDAKKwloZWxwCisgCSAgU2l6ZSAoaW4gYnl0ZXMpIG9mIFRJUEMncyBpbnRlcm5hbCBsb2cgYnVmZmVyLCB3aGljaCByZWNvcmRzIHRoZQorCSAgb2NjdXJyZW5jZSBvZiBzaWduaWZpY2FudCBldmVudHMuICBNYXhpbXVtIHN1cHBvcnRlZCB2YWx1ZQorCSAgaXMgMzI3NjggYnl0ZXMsIG1pbmltdW0gaXMgMC4KKworCSAgVGhlcmUgaXMgbm8gbmVlZCB0byBlbmFibGUgdGhlIGxvZyBidWZmZXIgdW5sZXNzIHRoZSBub2RlIHdpbGwgYmUKKwkgIG1hbmFnZWQgcmVtb3RlbHkgdmlhIFRJUEMuCisKK2NvbmZpZyBUSVBDX0RFQlVHCisJYm9vbCAiRW5hYmxlIGRlYnVnZ2luZyBzdXBwb3J0IgorCWRlcGVuZHMgb24gVElQQworCWRlZmF1bHQgbgorCWhlbHAKKyAJICBUaGlzIHdpbGwgZW5hYmxlIGRlYnVnZ2luZyBvZiBUSVBDLgorCisJICBPbmx5IHNheSBZIGhlcmUgaWYgeW91IGFyZSBoYXZpbmcgdHJvdWJsZSB3aXRoIFRJUEMuICBJdCB3aWxsCisJICBlbmFibGUgdGhlIGRpc3BsYXkgb2YgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBpcyBnb2luZyBvbi4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvTWFrZWZpbGUgYi9uZXQvdGlwYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2ViNzAyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IFRJUEMgbGF5ZXIKKyMKKworb2JqLSQoQ09ORklHX1RJUEMpIDo9IHRpcGMubworCit0aXBjLXkJKz0gYWRkci5vIGJjYXN0Lm8gYmVhcmVyLm8gY29uZmlnLm8gY2x1c3Rlci5vIFwKKwkgICBjb3JlLm8gaGFuZGxlci5vIGxpbmsubyBkaXNjb3Zlci5vIG1zZy5vICBcCisJICAgbmFtZV9kaXN0ci5vICBzdWJzY3IubyBuYW1lX3RhYmxlLm8gbmV0Lm8gIFwKKwkgICBuZXRsaW5rLm8gbm9kZS5vIG5vZGVfc3Vic2NyLm8gcG9ydC5vIHJlZi5vICBcCisJICAgc29ja2V0Lm8gdXNlcl9yZWcubyB6b25lLm8gZGJnLm8gZXRoX21lZGlhLm8KKworIyBFbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvYWRkci5jIGIvbmV0L3RpcGMvYWRkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZTI1ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9hZGRyLmMKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIG5ldC90aXBjL2FkZHIuYzogVElQQyBhZGRyZXNzIHV0aWxpdHkgcm91dGluZXMKKyAqICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJkYmcuaCIKKyNpbmNsdWRlICJhZGRyLmgiCisjaW5jbHVkZSAiem9uZS5oIgorI2luY2x1ZGUgImNsdXN0ZXIuaCIKKyNpbmNsdWRlICJuZXQuaCIKKwordTMyIHRpcGNfZ2V0X2FkZHIodm9pZCkKK3sKKwlyZXR1cm4gdGlwY19vd25fYWRkcjsKK30KKworLyoqCisgKiB0aXBjX2FkZHJfZG9tYWluX3ZhbGlkIC0gdmFsaWRhdGVzIGEgbmV0d29yayBkb21haW4gYWRkcmVzcworICogCisgKiBBY2NlcHRzIDxaLkMuTj4sIDxaLkMuMD4sIDxaLjAuMD4sIGFuZCA8MC4wLjA+LCAKKyAqIHdoZXJlIFosIEMsIGFuZCBOIGFyZSBub24temVybyBhbmQgZG8gbm90IGV4Y2VlZCB0aGUgY29uZmlndXJlZCBsaW1pdHMuCisgKiAKKyAqIFJldHVybnMgMSBpZiBkb21haW4gYWRkcmVzcyBpcyB2YWxpZCwgb3RoZXJ3aXNlIDAKKyAqLworCitpbnQgdGlwY19hZGRyX2RvbWFpbl92YWxpZCh1MzIgYWRkcikKK3sKKwl1MzIgbiA9IHRpcGNfbm9kZShhZGRyKTsKKwl1MzIgYyA9IHRpcGNfY2x1c3RlcihhZGRyKTsKKwl1MzIgeiA9IHRpcGNfem9uZShhZGRyKTsKKwl1MzIgbWF4X25vZGVzID0gdGlwY19tYXhfbm9kZXM7CisKKwlpZiAoaXNfc2xhdmUoYWRkcikpCisJCW1heF9ub2RlcyA9IExPV0VTVF9TTEFWRSArIHRpcGNfbWF4X3NsYXZlczsKKwlpZiAobiA+IG1heF9ub2RlcykKKwkJcmV0dXJuIDA7CisJaWYgKGMgPiB0aXBjX21heF9jbHVzdGVycykKKwkJcmV0dXJuIDA7CisJaWYgKHogPiB0aXBjX21heF96b25lcykKKwkJcmV0dXJuIDA7CisKKwlpZiAobiAmJiAoIXogfHwgIWMpKQorCQlyZXR1cm4gMDsKKwlpZiAoYyAmJiAheikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogdGlwY19hZGRyX25vZGVfdmFsaWQgLSB2YWxpZGF0ZXMgYSBwcm9wb3NlZCBuZXR3b3JrIGFkZHJlc3MgZm9yIHRoaXMgbm9kZQorICogCisgKiBBY2NlcHRzIDxaLkMuTj4sIHdoZXJlIFosIEMsIGFuZCBOIGFyZSBub24temVybyBhbmQgZG8gbm90IGV4Y2VlZCAKKyAqIHRoZSBjb25maWd1cmVkIGxpbWl0cy4KKyAqIAorICogUmV0dXJucyAxIGlmIGFkZHJlc3MgY2FuIGJlIHVzZWQsIG90aGVyd2lzZSAwCisgKi8KKworaW50IHRpcGNfYWRkcl9ub2RlX3ZhbGlkKHUzMiBhZGRyKQoreworCXJldHVybiAodGlwY19hZGRyX2RvbWFpbl92YWxpZChhZGRyKSAmJiB0aXBjX25vZGUoYWRkcikpOworfQorCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9hZGRyLmggYi9uZXQvdGlwYy9hZGRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNmZWJiMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL2FkZHIuaApAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIG5ldC90aXBjL2FkZHIuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIGFkZHJlc3MgdXRpbGl0eSByb3V0aW5lcworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfQUREUl9ICisjZGVmaW5lIF9USVBDX0FERFJfSAorCitzdGF0aWMgaW5saW5lIHUzMiBvd25fbm9kZSh2b2lkKQoreworCXJldHVybiB0aXBjX25vZGUodGlwY19vd25fYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG93bl9jbHVzdGVyKHZvaWQpCit7CisJcmV0dXJuIHRpcGNfY2x1c3Rlcih0aXBjX293bl9hZGRyKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgb3duX3pvbmUodm9pZCkKK3sKKwlyZXR1cm4gdGlwY196b25lKHRpcGNfb3duX2FkZHIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBpbl9vd25fY2x1c3Rlcih1MzIgYWRkcikKK3sKKwlyZXR1cm4gISgoYWRkciBeIHRpcGNfb3duX2FkZHIpID4+IDEyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaW5fb3duX3pvbmUodTMyIGFkZHIpCit7CisJcmV0dXJuICEoKGFkZHIgXiB0aXBjX293bl9hZGRyKSA+PiAyNCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3NsYXZlKHUzMiBhZGRyKQoreworCXJldHVybiBhZGRyICYgMHg4MDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1heV9yb3V0ZSh1MzIgYWRkcikKK3sKKwlyZXR1cm4oYWRkciBeIHRpcGNfb3duX2FkZHIpID4+IDExOworfQorCitzdGF0aWMgaW5saW5lIGludCBpbl9zY29wZSh1MzIgZG9tYWluLCB1MzIgYWRkcikKK3sKKwlpZiAoIWRvbWFpbiB8fCAoZG9tYWluID09IGFkZHIpKQorCQlyZXR1cm4gMTsKKwlpZiAoZG9tYWluID09IChhZGRyICYgMHhmZmZmZjAwMHUpKSAvKiBkb21haW4gPFouQy4wPiAqLworCQlyZXR1cm4gMTsKKwlpZiAoZG9tYWluID09IChhZGRyICYgMHhmZjAwMDAwMHUpKSAvKiBkb21haW4gPFouMC4wPiAqLworCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBhZGRyX3Njb3BlIC0gY29udmVydCBtZXNzYWdlIGxvb2t1cCBkb21haW4gdG8gZXF1aXZhbGVudCAyLWJpdCBzY29wZSB2YWx1ZQorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGFkZHJfc2NvcGUodTMyIGRvbWFpbikKK3sKKwlpZiAobGlrZWx5KCFkb21haW4pKQorCQlyZXR1cm4gVElQQ19aT05FX1NDT1BFOworCWlmICh0aXBjX25vZGUoZG9tYWluKSkKKwkJcmV0dXJuIFRJUENfTk9ERV9TQ09QRTsKKwlpZiAodGlwY19jbHVzdGVyKGRvbWFpbikpCisJCXJldHVybiBUSVBDX0NMVVNURVJfU0NPUEU7CisJcmV0dXJuIFRJUENfWk9ORV9TQ09QRTsKK30KKworLyoqCisgKiBhZGRyX2RvbWFpbiAtIGNvbnZlcnQgMi1iaXQgc2NvcGUgdmFsdWUgdG8gZXF1aXZhbGVudCBtZXNzYWdlIGxvb2t1cCBkb21haW4KKyAqICAKKyAqIE5lZWRlZCB3aGVuIGFkZHJlc3Mgb2YgYSBuYW1lZCBtZXNzYWdlIG11c3QgYmUgbG9va2VkIHVwIGEgc2Vjb25kIHRpbWUgCisgKiBhZnRlciBhIG5ldHdvcmsgaG9wLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGFkZHJfZG9tYWluKGludCBzYykKK3sKKwlpZiAobGlrZWx5KHNjID09IFRJUENfTk9ERV9TQ09QRSkpCisJCXJldHVybiB0aXBjX293bl9hZGRyOworCWlmIChzYyA9PSBUSVBDX0NMVVNURVJfU0NPUEUpCisJCXJldHVybiB0aXBjX2FkZHIodGlwY196b25lKHRpcGNfb3duX2FkZHIpLAorCQkJCSB0aXBjX2NsdXN0ZXIodGlwY19vd25fYWRkciksIDApOworCXJldHVybiB0aXBjX2FkZHIodGlwY196b25lKHRpcGNfb3duX2FkZHIpLCAwLCAwKTsKK30KKworc3RhdGljIGlubGluZSBjaGFyICphZGRyX3N0cmluZ19maWxsKGNoYXIgKnN0cmluZywgdTMyIGFkZHIpCit7CisJc25wcmludGYoc3RyaW5nLCAxNiwgIjwldS4ldS4ldT4iLAorCQkgdGlwY196b25lKGFkZHIpLCB0aXBjX2NsdXN0ZXIoYWRkciksIHRpcGNfbm9kZShhZGRyKSk7CisJcmV0dXJuIHN0cmluZzsKK30KKworaW50IHRpcGNfYWRkcl9kb21haW5fdmFsaWQodTMyKTsKK2ludCB0aXBjX2FkZHJfbm9kZV92YWxpZCh1MzIgYWRkcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvYmNhc3QuYyBiL25ldC90aXBjL2JjYXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdiMDRmMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL2JjYXN0LmMKQEAgLTAsMCArMSw4MDYgQEAKKy8qCisgKiBuZXQvdGlwYy9iY2FzdC5jOiBUSVBDIGJyb2FkY2FzdCBjb2RlCisgKiAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJtc2cuaCIKKyNpbmNsdWRlICJkYmcuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAibmV0LmgiCisjaW5jbHVkZSAibm9kZS5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJhZGRyLmgiCisjaW5jbHVkZSAibm9kZV9zdWJzY3IuaCIKKyNpbmNsdWRlICJuYW1lX2Rpc3RyLmgiCisjaW5jbHVkZSAiYmVhcmVyLmgiCisjaW5jbHVkZSAibmFtZV90YWJsZS5oIgorI2luY2x1ZGUgImJjYXN0LmgiCisKKworI2RlZmluZSBNQVhfUEtUX0RFRkFVTFRfTUNBU1QgMTUwMAkvKiBiY2FzdCBsaW5rIG1heCBwYWNrZXQgc2l6ZSAoZml4ZWQpICovCisKKyNkZWZpbmUgQkNMSU5LX1dJTl9ERUZBVUxUIDIwCQkvKiBiY2FzdCBsaW5rIHdpbmRvdyBzaXplIChkZWZhdWx0KSAqLworCisjZGVmaW5lIEJDTElOS19MT0dfQlVGX1NJWkUgMAorCisvKioKKyAqIHN0cnVjdCBiY2JlYXJlcl9wYWlyIC0gYSBwYWlyIG9mIGJlYXJlcnMgdXNlZCBieSBicm9hZGNhc3QgbGluaworICogQHByaW1hcnk6IHBvaW50ZXIgdG8gcHJpbWFyeSBiZWFyZXIKKyAqIEBzZWNvbmRhcnk6IHBvaW50ZXIgdG8gc2Vjb25kYXJ5IGJlYXJlcgorICogCisgKiBCZWFyZXJzIG11c3QgaGF2ZSBzYW1lIHByaW9yaXR5IGFuZCBzYW1lIHNldCBvZiByZWFjaGFibGUgZGVzdGluYXRpb25zIAorICogdG8gYmUgcGFpcmVkLgorICovCisKK3N0cnVjdCBiY2JlYXJlcl9wYWlyIHsKKwlzdHJ1Y3QgYmVhcmVyICpwcmltYXJ5OworCXN0cnVjdCBiZWFyZXIgKnNlY29uZGFyeTsKK307CisKKy8qKgorICogc3RydWN0IGJjYmVhcmVyIC0gYmVhcmVyIHVzZWQgYnkgYnJvYWRjYXN0IGxpbmsKKyAqIEBiZWFyZXI6IChub24tc3RhbmRhcmQpIGJyb2FkY2FzdCBiZWFyZXIgc3RydWN0dXJlCisgKiBAbWVkaWE6IChub24tc3RhbmRhcmQpIGJyb2FkY2FzdCBtZWRpYSBzdHJ1Y3R1cmUKKyAqIEBicGFpcnM6IGFycmF5IG9mIGJlYXJlciBwYWlycworICogQGJwYWlyc190ZW1wOiBhcnJheSBvZiBiZWFyZXIgcGFpcnMgdXNlZCBkdXJpbmcgY3JlYXRpb24gb2YgImJwYWlycyIKKyAqLworCitzdHJ1Y3QgYmNiZWFyZXIgeworCXN0cnVjdCBiZWFyZXIgYmVhcmVyOworCXN0cnVjdCBtZWRpYSBtZWRpYTsKKwlzdHJ1Y3QgYmNiZWFyZXJfcGFpciBicGFpcnNbTUFYX0JFQVJFUlNdOworCXN0cnVjdCBiY2JlYXJlcl9wYWlyIGJwYWlyc190ZW1wW1RJUENfTUFYX0xJTktfUFJJICsgMV07Cit9OworCisvKioKKyAqIHN0cnVjdCBiY2xpbmsgLSBsaW5rIHVzZWQgZm9yIGJyb2FkY2FzdCBtZXNzYWdlcworICogQGxpbms6IChub24tc3RhbmRhcmQpIGJyb2FkY2FzdCBsaW5rIHN0cnVjdHVyZQorICogQG5vZGU6IChub24tc3RhbmRhcmQpIG5vZGUgc3RydWN0dXJlIHJlcHJlc2VudGluZyBiJ2Nhc3QgbGluaydzIHBlZXIgbm9kZQorICogCisgKiBIYW5kbGVzIHNlcXVlbmNlIG51bWJlcmluZywgZnJhZ21lbnRhdGlvbiwgYnVuZGxpbmcsIGV0Yy4KKyAqLworCitzdHJ1Y3QgYmNsaW5rIHsKKwlzdHJ1Y3QgbGluayBsaW5rOworCXN0cnVjdCBub2RlIG5vZGU7Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgYmNiZWFyZXIgKmJjYmVhcmVyID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgYmNsaW5rICpiY2xpbmsgPSBOVUxMOworc3RhdGljIHN0cnVjdCBsaW5rICpiY2wgPSBOVUxMOworc3RhdGljIHNwaW5sb2NrX3QgYmNfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKworY2hhciB0aXBjX2JjbGlua19uYW1lW10gPSAibXVsdGljYXN0LWxpbmsiOworCisKK3N0YXRpYyBpbmxpbmUgdTMyIGJ1Zl9zZXFubyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXJldHVybiBtc2dfc2Vxbm8oYnVmX21zZyhidWYpKTsKK30gCisKK3N0YXRpYyBpbmxpbmUgdTMyIGJjYnVmX2Fja3Moc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlyZXR1cm4gKHUzMikodW5zaWduZWQgbG9uZylUSVBDX1NLQl9DQihidWYpLT5oYW5kbGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY2J1Zl9zZXRfYWNrcyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCB1MzIgYWNrcykKK3sKKwlUSVBDX1NLQl9DQihidWYpLT5oYW5kbGUgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWFja3M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY2J1Zl9kZWNyX2Fja3Moc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwliY2J1Zl9zZXRfYWNrcyhidWYsIGJjYnVmX2Fja3MoYnVmKSAtIDEpOworfQorCisKKy8qKiAKKyAqIGJjbGlua19zZXRfZ2FwIC0gc2V0IGdhcCBhY2NvcmRpbmcgdG8gY29udGVudHMgb2YgY3VycmVudCBkZWZlcnJlZCBwa3QgcXVldWUKKyAqIAorICogQ2FsbGVkIHdpdGggJ25vZGUnIGxvY2tlZCwgYmNfbG9jayB1bmxvY2tlZAorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY2xpbmtfc2V0X2dhcChzdHJ1Y3Qgbm9kZSAqbl9wdHIpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IG5fcHRyLT5iY2xpbmsuZGVmZXJyZWRfaGVhZDsKKworCW5fcHRyLT5iY2xpbmsuZ2FwX2FmdGVyID0gbl9wdHItPmJjbGluay5nYXBfdG8gPQorCQltb2Qobl9wdHItPmJjbGluay5sYXN0X2luKTsKKwlpZiAodW5saWtlbHkoYnVmICE9IE5VTEwpKQorCQluX3B0ci0+YmNsaW5rLmdhcF90byA9IG1vZChidWZfc2Vxbm8oYnVmKSAtIDEpOworfQorCisvKiogCisgKiBiY2xpbmtfYWNrX2FsbG93ZWQgLSB0ZXN0IGlmIEFDSyBvciBOQUNLIG1lc3NhZ2UgY2FuIGJlIHNlbnQgYXQgdGhpcyBtb21lbnQKKyAqIAorICogVGhpcyBtZWNoYW5pc20gZW5kZWF2b3VycyB0byBwcmV2ZW50IGFsbCBub2RlcyBpbiBuZXR3b3JrIGZyb20gdHJ5aW5nCisgKiB0byBBQ0sgb3IgTkFDSyBhdCB0aGUgc2FtZSB0aW1lLgorICogCisgKiBOb3RlOiBUSVBDIHVzZXMgYSBkaWZmZXJlbnQgdHJpZ2dlciB0byBkaXN0cmlidXRlIEFDS3MgdGhhbiBpdCBkb2VzIHRvCisgKiAgICAgICBkaXN0cmlidXRlIE5BQ0tzLCBidXQgdHJpZXMgdG8gdXNlIHRoZSBzYW1lIHNwYWNpbmcgKGRpdmlkZSBieSAxNikuIAorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGJjbGlua19hY2tfYWxsb3dlZCh1MzIgbikKK3sKKwlyZXR1cm4oKG4gJSBUSVBDX01JTl9MSU5LX1dJTikgPT0gdGlwY19vd25fdGFnKTsKK30KKworCisvKiogCisgKiBiY2xpbmtfcmV0cmFuc21pdF9wa3QgLSByZXRyYW5zbWl0IGJyb2FkY2FzdCBwYWNrZXRzCisgKiBAYWZ0ZXI6IHNlcXVlbmNlIG51bWJlciBvZiBsYXN0IHBhY2tldCB0byAqbm90KiByZXRyYW5zbWl0CisgKiBAdG86IHNlcXVlbmNlIG51bWJlciBvZiBsYXN0IHBhY2tldCB0byByZXRyYW5zbWl0CisgKiAKKyAqIENhbGxlZCB3aXRoICdub2RlJyBsb2NrZWQsIGJjX2xvY2sgdW5sb2NrZWQKKyAqLworCitzdGF0aWMgdm9pZCBiY2xpbmtfcmV0cmFuc21pdF9wa3QodTMyIGFmdGVyLCB1MzIgdG8pCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKworCXNwaW5fbG9ja19iaCgmYmNfbG9jayk7CisJYnVmID0gYmNsLT5maXJzdF9vdXQ7CisJd2hpbGUgKGJ1ZiAmJiBsZXNzX2VxKGJ1Zl9zZXFubyhidWYpLCBhZnRlcikpIHsKKwkJYnVmID0gYnVmLT5uZXh0OyAgICAgICAgICAgICAgICAKKwl9CisJaWYgKGJ1ZiAhPSBOVUxMKQorCQl0aXBjX2xpbmtfcmV0cmFuc21pdChiY2wsIGJ1ZiwgbW9kKHRvIC0gYWZ0ZXIpKTsKKwlzcGluX3VubG9ja19iaCgmYmNfbG9jayk7ICAgICAgICAgICAgICAKK30KKworLyoqIAorICogdGlwY19iY2xpbmtfYWNrbm93bGVkZ2UgLSBoYW5kbGUgYWNrbm93bGVkZ2VtZW50IG9mIGJyb2FkY2FzdCBwYWNrZXRzCisgKiBAbl9wdHI6IG5vZGUgdGhhdCBzZW50IGFja25vd2xlZGdlbWVudCBpbmZvCisgKiBAYWNrZWQ6IGJyb2FkY2FzdCBzZXF1ZW5jZSAjIHRoYXQgaGFzIGJlZW4gYWNrbm93bGVkZ2VkCisgKiAKKyAqIE5vZGUgaXMgbG9ja2VkLCBiY19sb2NrIHVubG9ja2VkLgorICovCisKK3ZvaWQgdGlwY19iY2xpbmtfYWNrbm93bGVkZ2Uoc3RydWN0IG5vZGUgKm5fcHRyLCB1MzIgYWNrZWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKmNyczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dDsKKwl1bnNpZ25lZCBpbnQgcmVsZWFzZWQgPSAwOworCisJaWYgKGxlc3NfZXEoYWNrZWQsIG5fcHRyLT5iY2xpbmsuYWNrZWQpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfYmgoJmJjX2xvY2spOworCisJLyogU2tpcCBvdmVyIHBhY2tldHMgdGhhdCBub2RlIGhhcyBwcmV2aW91c2x5IGFja25vd2xlZGdlZCAqLworCisJY3JzID0gYmNsLT5maXJzdF9vdXQ7CisJd2hpbGUgKGNycyAmJiBsZXNzX2VxKGJ1Zl9zZXFubyhjcnMpLCBuX3B0ci0+YmNsaW5rLmFja2VkKSkgeworCQljcnMgPSBjcnMtPm5leHQ7CisJfQorCisJLyogVXBkYXRlIHBhY2tldHMgdGhhdCBub2RlIGlzIG5vdyBhY2tub3dsZWRnaW5nICovCisKKwl3aGlsZSAoY3JzICYmIGxlc3NfZXEoYnVmX3NlcW5vKGNycyksIGFja2VkKSkgeworCQluZXh0ID0gY3JzLT5uZXh0OworCQliY2J1Zl9kZWNyX2Fja3MoY3JzKTsKKwkJaWYgKGJjYnVmX2Fja3MoY3JzKSA9PSAwKSB7CisJCQliY2wtPmZpcnN0X291dCA9IG5leHQ7CisJCQliY2wtPm91dF9xdWV1ZV9zaXplLS07CisJCQlidWZfZGlzY2FyZChjcnMpOworCQkJcmVsZWFzZWQgPSAxOworCQl9CisJCWNycyA9IG5leHQ7CisJfQorCW5fcHRyLT5iY2xpbmsuYWNrZWQgPSBhY2tlZDsKKworCS8qIFRyeSByZXNvbHZpbmcgYnJvYWRjYXN0IGxpbmsgY29uZ2VzdGlvbiwgaWYgbmVjZXNzYXJ5ICovCisKKwlpZiAodW5saWtlbHkoYmNsLT5uZXh0X291dCkpCisJCXRpcGNfbGlua19wdXNoX3F1ZXVlKGJjbCk7CisJaWYgKHVubGlrZWx5KHJlbGVhc2VkICYmICFsaXN0X2VtcHR5KCZiY2wtPndhaXRpbmdfcG9ydHMpKSkKKwkJdGlwY19saW5rX3dha2V1cF9wb3J0cyhiY2wsIDApOworCXNwaW5fdW5sb2NrX2JoKCZiY19sb2NrKTsKK30KKworLyoqIAorICogYmNsaW5rX3NlbmRfYWNrIC0gdW5pY2FzdCBhbiBBQ0sgbXNnCisgKiAKKyAqIHRpcGNfbmV0X2xvY2sgYW5kIG5vZGUgbG9jayBzZXQKKyAqLworCitzdGF0aWMgdm9pZCBiY2xpbmtfc2VuZF9hY2soc3RydWN0IG5vZGUgKm5fcHRyKQoreworCXN0cnVjdCBsaW5rICpsX3B0ciA9IG5fcHRyLT5hY3RpdmVfbGlua3Nbbl9wdHItPmFkZHIgJiAxXTsKKworCWlmIChsX3B0ciAhPSBOVUxMKQorCQl0aXBjX2xpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIFNUQVRFX01TRywgMCwgMCwgMCwgMCwgMCk7Cit9CisKKy8qKiAKKyAqIGJjbGlua19zZW5kX25hY2stIGJyb2FkY2FzdCBhIE5BQ0sgbXNnCisgKiAKKyAqIHRpcGNfbmV0X2xvY2sgYW5kIG5vZGUgbG9jayBzZXQKKyAqLworCitzdGF0aWMgdm9pZCBiY2xpbmtfc2VuZF9uYWNrKHN0cnVjdCBub2RlICpuX3B0cikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCisJaWYgKCFsZXNzKG5fcHRyLT5iY2xpbmsuZ2FwX2FmdGVyLCBuX3B0ci0+YmNsaW5rLmdhcF90bykpCisJCXJldHVybjsKKworCWJ1ZiA9IGJ1Zl9hY3F1aXJlKElOVF9IX1NJWkUpOworCWlmIChidWYpIHsKKwkJbXNnID0gYnVmX21zZyhidWYpOworCQltc2dfaW5pdChtc2csIEJDQVNUX1BST1RPQ09MLCBTVEFURV9NU0csCisJCQkgVElQQ19PSywgSU5UX0hfU0laRSwgbl9wdHItPmFkZHIpOworCQltc2dfc2V0X21jX25ldGlkKG1zZywgdGlwY19uZXRfaWQpOworCQltc2dfc2V0X2JjYXN0X2Fjayhtc2csIG1vZChuX3B0ci0+YmNsaW5rLmxhc3RfaW4pKTsgCisJCW1zZ19zZXRfYmNnYXBfYWZ0ZXIobXNnLCBuX3B0ci0+YmNsaW5rLmdhcF9hZnRlcik7CisJCW1zZ19zZXRfYmNnYXBfdG8obXNnLCBuX3B0ci0+YmNsaW5rLmdhcF90byk7CisJCW1zZ19zZXRfYmNhc3RfdGFnKG1zZywgdGlwY19vd25fdGFnKTsKKworCQlpZiAodGlwY19iZWFyZXJfc2VuZCgmYmNiZWFyZXItPmJlYXJlciwgYnVmLCAwKSkgeworCQkJYmNsLT5zdGF0cy5zZW50X25hY2tzKys7CisJCQlidWZfZGlzY2FyZChidWYpOworCQl9IGVsc2UgeworCQkJdGlwY19iZWFyZXJfc2NoZWR1bGUoYmNsLT5iX3B0ciwgYmNsKTsKKwkJCWJjbC0+cHJvdG9fbXNnX3F1ZXVlID0gYnVmOworCQkJYmNsLT5zdGF0cy5iZWFyZXJfY29uZ3MrKzsKKwkJfQorCisJCS8qIAorCQkgKiBFbnN1cmUgd2UgZG9lc24ndCBzZW5kIGFub3RoZXIgTkFDSyBtc2cgdG8gdGhlIG5vZGUKKwkJICogdW50aWwgMTYgbW9yZSBkZWZlcnJlZCBtZXNzYWdlcyBhcnJpdmUgZnJvbSBpdAorCQkgKiAoaS5lLiBoZWxwcyBwcmV2ZW50IGFsbCBub2RlcyBmcm9tIE5BQ0snaW5nIGF0IHNhbWUgdGltZSkKKwkJICovCisJCQorCQluX3B0ci0+YmNsaW5rLm5hY2tfc3luYyA9IHRpcGNfb3duX3RhZzsKKwl9Cit9CisKKy8qKiAKKyAqIHRpcGNfYmNsaW5rX2NoZWNrX2dhcCAtIHNlbmQgYSBOQUNLIGlmIGEgc2VxdWVuY2UgZ2FwIGV4aXN0cworICoKKyAqIHRpcGNfbmV0X2xvY2sgYW5kIG5vZGUgbG9jayBzZXQKKyAqLworCit2b2lkIHRpcGNfYmNsaW5rX2NoZWNrX2dhcChzdHJ1Y3Qgbm9kZSAqbl9wdHIsIHUzMiBsYXN0X3NlbnQpCit7CisJaWYgKCFuX3B0ci0+YmNsaW5rLnN1cHBvcnRlZCB8fAorCSAgICBsZXNzX2VxKGxhc3Rfc2VudCwgbW9kKG5fcHRyLT5iY2xpbmsubGFzdF9pbikpKQorCQlyZXR1cm47CisKKwliY2xpbmtfc2V0X2dhcChuX3B0cik7CisJaWYgKG5fcHRyLT5iY2xpbmsuZ2FwX2FmdGVyID09IG5fcHRyLT5iY2xpbmsuZ2FwX3RvKQorCQluX3B0ci0+YmNsaW5rLmdhcF90byA9IGxhc3Rfc2VudDsKKwliY2xpbmtfc2VuZF9uYWNrKG5fcHRyKTsKK30KKworLyoqIAorICogdGlwY19iY2xpbmtfcGVla19uYWNrIC0gcHJvY2VzcyBhIE5BQ0sgbXNnIG1lYW50IGZvciBhbm90aGVyIG5vZGUKKyAqIAorICogT25seSB0aXBjX25ldF9sb2NrIHNldC4KKyAqLworCit2b2lkIHRpcGNfYmNsaW5rX3BlZWtfbmFjayh1MzIgZGVzdCwgdTMyIHNlbmRlcl90YWcsIHUzMiBnYXBfYWZ0ZXIsIHUzMiBnYXBfdG8pCit7CisJc3RydWN0IG5vZGUgKm5fcHRyID0gdGlwY19ub2RlX2ZpbmQoZGVzdCk7CisJdTMyIG15X2FmdGVyLCBteV90bzsKKworCWlmICh1bmxpa2VseSghbl9wdHIgfHwgIXRpcGNfbm9kZV9pc191cChuX3B0cikpKQorCQlyZXR1cm47CisJdGlwY19ub2RlX2xvY2sobl9wdHIpOworCS8qCisJICogTW9kaWZ5IGdhcCB0byBzdXBwcmVzcyB1bm5lY2Vzc2FyeSBOQUNLcyBmcm9tIHRoaXMgbm9kZQorCSAqLworCW15X2FmdGVyID0gbl9wdHItPmJjbGluay5nYXBfYWZ0ZXI7CisJbXlfdG8gPSBuX3B0ci0+YmNsaW5rLmdhcF90bzsKKworCWlmIChsZXNzX2VxKGdhcF9hZnRlciwgbXlfYWZ0ZXIpKSB7CisJCWlmIChsZXNzKG15X2FmdGVyLCBnYXBfdG8pICYmIGxlc3MoZ2FwX3RvLCBteV90bykpCisJCQluX3B0ci0+YmNsaW5rLmdhcF9hZnRlciA9IGdhcF90bzsKKwkJZWxzZSBpZiAobGVzc19lcShteV90bywgZ2FwX3RvKSkKKwkJCW5fcHRyLT5iY2xpbmsuZ2FwX3RvID0gbl9wdHItPmJjbGluay5nYXBfYWZ0ZXI7CisJfSBlbHNlIGlmIChsZXNzX2VxKGdhcF9hZnRlciwgbXlfdG8pKSB7CisJCWlmIChsZXNzX2VxKG15X3RvLCBnYXBfdG8pKQorCQkJbl9wdHItPmJjbGluay5nYXBfdG8gPSBnYXBfYWZ0ZXI7CisJfSBlbHNlIHsKKwkJLyogCisJCSAqIEV4cGFuZCBnYXAgaWYgbWlzc2luZyBidWZzIG5vdCBpbiBkZWZlcnJlZCBxdWV1ZToKKwkJICovCisJCXN0cnVjdCBza19idWZmICpidWYgPSBuX3B0ci0+YmNsaW5rLmRlZmVycmVkX2hlYWQ7CisJCXUzMiBwcmV2ID0gbl9wdHItPmJjbGluay5nYXBfdG87CisKKwkJZm9yICg7IGJ1ZjsgYnVmID0gYnVmLT5uZXh0KSB7CisJCQl1MzIgc2Vxbm8gPSBidWZfc2Vxbm8oYnVmKTsKKworCQkJaWYgKG1vZChzZXFubyAtIHByZXYpICE9IDEpCisJCQkJYnVmID0gTlVMTDsKKwkJCWlmIChzZXFubyA9PSBnYXBfYWZ0ZXIpCisJCQkJYnJlYWs7CisJCQlwcmV2ID0gc2Vxbm87CisJCX0KKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJbl9wdHItPmJjbGluay5nYXBfdG8gPSBnYXBfYWZ0ZXI7CisJfQorCS8qCisJICogU29tZSBub2RlcyBtYXkgc2VuZCBhIGNvbXBsZW1lbnRhcnkgTkFDSyBub3c6CisJICovIAorCWlmIChiY2xpbmtfYWNrX2FsbG93ZWQoc2VuZGVyX3RhZyArIDEpKSB7CisJCWlmIChuX3B0ci0+YmNsaW5rLmdhcF90byAhPSBuX3B0ci0+YmNsaW5rLmdhcF9hZnRlcikgeworCQkJYmNsaW5rX3NlbmRfbmFjayhuX3B0cik7CisJCQliY2xpbmtfc2V0X2dhcChuX3B0cik7CisJCX0KKwl9CisJdGlwY19ub2RlX3VubG9jayhuX3B0cik7Cit9CisKKy8qKgorICogdGlwY19iY2xpbmtfc2VuZF9tc2cgLSBicm9hZGNhc3QgYSBwYWNrZXQgdG8gYWxsIG5vZGVzIGluIGNsdXN0ZXIKKyAqLworCitpbnQgdGlwY19iY2xpbmtfc2VuZF9tc2coc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlpbnQgcmVzOworCisJc3Bpbl9sb2NrX2JoKCZiY19sb2NrKTsKKworCXJlcyA9IHRpcGNfbGlua19zZW5kX2J1ZihiY2wsIGJ1Zik7CisJaWYgKHVubGlrZWx5KHJlcyA9PSAtRUxJTktDT05HKSkKKwkJYnVmX2Rpc2NhcmQoYnVmKTsKKwllbHNlCisJCWJjbC0+c3RhdHMuc2VudF9pbmZvKys7CisKKwlpZiAoYmNsLT5vdXRfcXVldWVfc2l6ZSA+IGJjbC0+c3RhdHMubWF4X3F1ZXVlX3N6KQorCQliY2wtPnN0YXRzLm1heF9xdWV1ZV9zeiA9IGJjbC0+b3V0X3F1ZXVlX3NpemU7CisJYmNsLT5zdGF0cy5xdWV1ZV9zel9jb3VudHMrKzsKKwliY2wtPnN0YXRzLmFjY3VfcXVldWVfc3ogKz0gYmNsLT5vdXRfcXVldWVfc2l6ZTsKKworCXNwaW5fdW5sb2NrX2JoKCZiY19sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIHRpcGNfYmNsaW5rX3JlY3ZfcGt0IC0gcmVjZWl2ZSBhIGJyb2FkY2FzdCBwYWNrZXQsIGFuZCBkZWxpdmVyIHVwd2FyZHMKKyAqIAorICogdGlwY19uZXRfbG9jayBpcyByZWFkX2xvY2tlZCwgbm8gb3RoZXIgbG9ja3Mgc2V0CisgKi8KKwordm9pZCB0aXBjX2JjbGlua19yZWN2X3BrdChzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreyAgICAgICAgCisJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGJ1Zik7CisJc3RydWN0IG5vZGUqIG5vZGUgPSB0aXBjX25vZGVfZmluZChtc2dfcHJldm5vZGUobXNnKSk7CisJdTMyIG5leHRfaW47CisJdTMyIHNlcW5vOworCXN0cnVjdCBza19idWZmICpkZWZlcnJlZDsKKworCW1zZ19kYmcobXNnLCAiPEJDPDw8Iik7CisKKwlpZiAodW5saWtlbHkoIW5vZGUgfHwgIXRpcGNfbm9kZV9pc191cChub2RlKSB8fCAhbm9kZS0+YmNsaW5rLnN1cHBvcnRlZCB8fCAKKwkJICAgICAobXNnX21jX25ldGlkKG1zZykgIT0gdGlwY19uZXRfaWQpKSkgeworCQlidWZfZGlzY2FyZChidWYpOworCQlyZXR1cm47CisJfQorCisJaWYgKHVubGlrZWx5KG1zZ191c2VyKG1zZykgPT0gQkNBU1RfUFJPVE9DT0wpKSB7CisJCW1zZ19kYmcobXNnLCAiPEJDTkFDSzw8PCIpOworCQlpZiAobXNnX2Rlc3Rub2RlKG1zZykgPT0gdGlwY19vd25fYWRkcikgeworCQkJdGlwY19ub2RlX2xvY2sobm9kZSk7CisJCQl0aXBjX2JjbGlua19hY2tub3dsZWRnZShub2RlLCBtc2dfYmNhc3RfYWNrKG1zZykpOworCQkJdGlwY19ub2RlX3VubG9jayhub2RlKTsKKwkJCWJjbC0+c3RhdHMucmVjdl9uYWNrcysrOworCQkJYmNsaW5rX3JldHJhbnNtaXRfcGt0KG1zZ19iY2dhcF9hZnRlcihtc2cpLAorCQkJCQkgICAgICBtc2dfYmNnYXBfdG8obXNnKSk7CisJCX0gZWxzZSB7CisJCQl0aXBjX2JjbGlua19wZWVrX25hY2sobXNnX2Rlc3Rub2RlKG1zZyksCisJCQkJCSBtc2dfYmNhc3RfdGFnKG1zZyksCisJCQkJCSBtc2dfYmNnYXBfYWZ0ZXIobXNnKSwKKwkJCQkJIG1zZ19iY2dhcF90byhtc2cpKTsKKwkJfQorCQlidWZfZGlzY2FyZChidWYpOworCQlyZXR1cm47CisJfQorCisJdGlwY19ub2RlX2xvY2sobm9kZSk7CityZWNlaXZlOgorCWRlZmVycmVkID0gbm9kZS0+YmNsaW5rLmRlZmVycmVkX2hlYWQ7CisJbmV4dF9pbiA9IG1vZChub2RlLT5iY2xpbmsubGFzdF9pbiArIDEpOworCXNlcW5vID0gbXNnX3NlcW5vKG1zZyk7CisKKwlpZiAobGlrZWx5KHNlcW5vID09IG5leHRfaW4pKSB7CisJCWJjbC0+c3RhdHMucmVjdl9pbmZvKys7CisJCW5vZGUtPmJjbGluay5sYXN0X2luKys7CisJCWJjbGlua19zZXRfZ2FwKG5vZGUpOworCQlpZiAodW5saWtlbHkoYmNsaW5rX2Fja19hbGxvd2VkKHNlcW5vKSkpIHsKKwkJCWJjbGlua19zZW5kX2Fjayhub2RlKTsKKwkJCWJjbC0+c3RhdHMuc2VudF9hY2tzKys7CisJCX0KKwkJaWYgKGxpa2VseShtc2dfaXNkYXRhKG1zZykpKSB7CisJCQl0aXBjX25vZGVfdW5sb2NrKG5vZGUpOworCQkJdGlwY19wb3J0X3JlY3ZfbWNhc3QoYnVmLCBOVUxMKTsKKwkJfSBlbHNlIGlmIChtc2dfdXNlcihtc2cpID09IE1TR19CVU5ETEVSKSB7CisJCQliY2wtPnN0YXRzLnJlY3ZfYnVuZGxlcysrOworCQkJYmNsLT5zdGF0cy5yZWN2X2J1bmRsZWQgKz0gbXNnX21zZ2NudChtc2cpOworCQkJdGlwY19ub2RlX3VubG9jayhub2RlKTsKKwkJCXRpcGNfbGlua19yZWN2X2J1bmRsZShidWYpOworCQl9IGVsc2UgaWYgKG1zZ191c2VyKG1zZykgPT0gTVNHX0ZSQUdNRU5URVIpIHsKKwkJCWJjbC0+c3RhdHMucmVjdl9mcmFnbWVudHMrKzsKKwkJCWlmICh0aXBjX2xpbmtfcmVjdl9mcmFnbWVudCgmbm9kZS0+YmNsaW5rLmRlZnJhZ20sCisJCQkJCQkgICAgJmJ1ZiwgJm1zZykpCisJCQkJYmNsLT5zdGF0cy5yZWN2X2ZyYWdtZW50ZWQrKzsKKwkJCXRpcGNfbm9kZV91bmxvY2sobm9kZSk7CisJCQl0aXBjX25ldF9yb3V0ZV9tc2coYnVmKTsKKwkJfSBlbHNlIHsKKwkJCXRpcGNfbm9kZV91bmxvY2sobm9kZSk7CisJCQl0aXBjX25ldF9yb3V0ZV9tc2coYnVmKTsKKwkJfQorCQlpZiAoZGVmZXJyZWQgJiYgKGJ1Zl9zZXFubyhkZWZlcnJlZCkgPT0gbW9kKG5leHRfaW4gKyAxKSkpIHsKKwkJCXRpcGNfbm9kZV9sb2NrKG5vZGUpOworCQkJYnVmID0gZGVmZXJyZWQ7CisJCQltc2cgPSBidWZfbXNnKGJ1Zik7CisJCQlub2RlLT5iY2xpbmsuZGVmZXJyZWRfaGVhZCA9IGRlZmVycmVkLT5uZXh0OworCQkJZ290byByZWNlaXZlOworCQl9CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKGxlc3MobmV4dF9pbiwgc2Vxbm8pKSB7CisJCXUzMiBnYXBfYWZ0ZXIgPSBub2RlLT5iY2xpbmsuZ2FwX2FmdGVyOworCQl1MzIgZ2FwX3RvID0gbm9kZS0+YmNsaW5rLmdhcF90bzsKKworCQlpZiAodGlwY19saW5rX2RlZmVyX3BrdCgmbm9kZS0+YmNsaW5rLmRlZmVycmVkX2hlYWQsCisJCQkJCSZub2RlLT5iY2xpbmsuZGVmZXJyZWRfdGFpbCwKKwkJCQkJYnVmKSkgeworCQkJbm9kZS0+YmNsaW5rLm5hY2tfc3luYysrOworCQkJYmNsLT5zdGF0cy5kZWZlcnJlZF9yZWN2Kys7CisJCQlpZiAoc2Vxbm8gPT0gbW9kKGdhcF9hZnRlciArIDEpKQorCQkJCW5vZGUtPmJjbGluay5nYXBfYWZ0ZXIgPSBzZXFubzsKKwkJCWVsc2UgaWYgKGxlc3MoZ2FwX2FmdGVyLCBzZXFubykgJiYgbGVzcyhzZXFubywgZ2FwX3RvKSkKKwkJCQlub2RlLT5iY2xpbmsuZ2FwX3RvID0gc2Vxbm87CisJCX0KKwkJaWYgKGJjbGlua19hY2tfYWxsb3dlZChub2RlLT5iY2xpbmsubmFja19zeW5jKSkgeworCQkJaWYgKGdhcF90byAhPSBnYXBfYWZ0ZXIpCisJCQkJYmNsaW5rX3NlbmRfbmFjayhub2RlKTsKKwkJCWJjbGlua19zZXRfZ2FwKG5vZGUpOworCQl9CisJfSBlbHNlIHsKKwkJYmNsLT5zdGF0cy5kdXBsaWNhdGVzKys7CisJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJfQorCXRpcGNfbm9kZV91bmxvY2sobm9kZSk7Cit9CisKK3UzMiB0aXBjX2JjbGlua19nZXRfbGFzdF9zZW50KHZvaWQpCit7CisJdTMyIGxhc3Rfc2VudCA9IG1vZChiY2wtPm5leHRfb3V0X25vIC0gMSk7CisKKwlpZiAoYmNsLT5uZXh0X291dCkKKwkJbGFzdF9zZW50ID0gbW9kKGJ1Zl9zZXFubyhiY2wtPm5leHRfb3V0KSAtIDEpOworCXJldHVybiBsYXN0X3NlbnQ7Cit9CisKK3UzMiB0aXBjX2JjbGlua19hY2tzX21pc3Npbmcoc3RydWN0IG5vZGUgKm5fcHRyKQoreworCXJldHVybiAobl9wdHItPmJjbGluay5zdXBwb3J0ZWQgJiYKKwkJKHRpcGNfYmNsaW5rX2dldF9sYXN0X3NlbnQoKSAhPSBuX3B0ci0+YmNsaW5rLmFja2VkKSk7Cit9CisKKworLyoqCisgKiB0aXBjX2JjYmVhcmVyX3NlbmQgLSBzZW5kIGEgcGFja2V0IHRocm91Z2ggdGhlIGJyb2FkY2FzdCBwc2V1ZG8tYmVhcmVyCisgKiAKKyAqIFNlbmQgdGhyb3VnaCBhcyBtYW55IGJlYXJlcnMgYXMgbmVjZXNzYXJ5IHRvIHJlYWNoIGFsbCBub2RlcworICogdGhhdCBzdXBwb3J0IFRJUEMgbXVsdGljYXN0aW5nLgorICogCisgKiBSZXR1cm5zIDAgaWYgcGFja2V0IHNlbnQgc3VjY2Vzc2Z1bGx5LCBub24temVybyBpZiBub3QKKyAqLworCitpbnQgdGlwY19iY2JlYXJlcl9zZW5kKHN0cnVjdCBza19idWZmICpidWYsCisJCSAgICAgICBzdHJ1Y3QgdGlwY19iZWFyZXIgKnVudXNlZDEsCisJCSAgICAgICBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICp1bnVzZWQyKQoreworCXN0YXRpYyBpbnQgc2VuZF9jb3VudCA9IDA7CisKKwlzdHJ1Y3Qgbm9kZV9tYXAgcmVtYWluczsKKwlzdHJ1Y3Qgbm9kZV9tYXAgcmVtYWluc19uZXc7CisJaW50IGJwX2luZGV4OworCWludCBzd2FwX3RpbWU7CisKKwkvKiBQcmVwYXJlIGJ1ZmZlciBmb3IgYnJvYWRjYXN0aW5nIChpZiBmaXJzdCB0aW1lIHRyeWluZyB0byBzZW5kIGl0KSAqLworCisJaWYgKGxpa2VseSghbXNnX25vbl9zZXEoYnVmX21zZyhidWYpKSkpIHsKKwkJc3RydWN0IHRpcGNfbXNnICptc2c7CisKKwkJYXNzZXJ0KHRpcGNfY2x0cl9iY2FzdF9ub2Rlcy5jb3VudCAhPSAwKTsKKwkJYmNidWZfc2V0X2Fja3MoYnVmLCB0aXBjX2NsdHJfYmNhc3Rfbm9kZXMuY291bnQpOworCQltc2cgPSBidWZfbXNnKGJ1Zik7CisJCW1zZ19zZXRfbm9uX3NlcShtc2cpOworCQltc2dfc2V0X21jX25ldGlkKG1zZywgdGlwY19uZXRfaWQpOworCX0KKworCS8qIERldGVybWluZSBpZiBiZWFyZXIgcGFpcnMgc2hvdWxkIGJlIHN3YXBwZWQgZm9sbG93aW5nIHRoaXMgYXR0ZW1wdCAqLworCisJaWYgKChzd2FwX3RpbWUgPSAoKytzZW5kX2NvdW50ID49IDEwKSkpCisJCXNlbmRfY291bnQgPSAwOworCisJLyogU2VuZCBidWZmZXIgb3ZlciBiZWFyZXJzIHVudGlsIGFsbCB0YXJnZXRzIHJlYWNoZWQgKi8KKwkKKwlyZW1haW5zID0gdGlwY19jbHRyX2JjYXN0X25vZGVzOworCisJZm9yIChicF9pbmRleCA9IDA7IGJwX2luZGV4IDwgTUFYX0JFQVJFUlM7IGJwX2luZGV4KyspIHsKKwkJc3RydWN0IGJlYXJlciAqcCA9IGJjYmVhcmVyLT5icGFpcnNbYnBfaW5kZXhdLnByaW1hcnk7CisJCXN0cnVjdCBiZWFyZXIgKnMgPSBiY2JlYXJlci0+YnBhaXJzW2JwX2luZGV4XS5zZWNvbmRhcnk7CisKKwkJaWYgKCFwKQorCQkJYnJlYWs7CS8qIG5vIG1vcmUgYmVhcmVycyB0byB0cnkgKi8KKworCQl0aXBjX25tYXBfZGlmZigmcmVtYWlucywgJnAtPm5vZGVzLCAmcmVtYWluc19uZXcpOworCQlpZiAocmVtYWluc19uZXcuY291bnQgPT0gcmVtYWlucy5jb3VudCkKKwkJCWNvbnRpbnVlOwkvKiBiZWFyZXIgcGFpciBkb2Vzbid0IGFkZCBhbnl0aGluZyAqLworCisJCWlmICghcC0+cHVibC5ibG9ja2VkICYmCisJCSAgICAhcC0+bWVkaWEtPnNlbmRfbXNnKGJ1ZiwgJnAtPnB1YmwsICZwLT5tZWRpYS0+YmNhc3RfYWRkcikpIHsKKwkJCWlmIChzd2FwX3RpbWUgJiYgcyAmJiAhcy0+cHVibC5ibG9ja2VkKQorCQkJCWdvdG8gc3dhcDsKKwkJCWVsc2UKKwkJCQlnb3RvIHVwZGF0ZTsKKwkJfQorCisJCWlmICghcyB8fCBzLT5wdWJsLmJsb2NrZWQgfHwKKwkJICAgIHMtPm1lZGlhLT5zZW5kX21zZyhidWYsICZzLT5wdWJsLCAmcy0+bWVkaWEtPmJjYXN0X2FkZHIpKQorCQkJY29udGludWU7CS8qIHVuYWJsZSB0byBzZW5kIHVzaW5nIGJlYXJlciBwYWlyICovCitzd2FwOgorCQliY2JlYXJlci0+YnBhaXJzW2JwX2luZGV4XS5wcmltYXJ5ID0gczsKKwkJYmNiZWFyZXItPmJwYWlyc1ticF9pbmRleF0uc2Vjb25kYXJ5ID0gcDsKK3VwZGF0ZToKKwkJaWYgKHJlbWFpbnNfbmV3LmNvdW50ID09IDApCisJCQlyZXR1cm4gVElQQ19PSzsKKworCQlyZW1haW5zID0gcmVtYWluc19uZXc7CisJfQorCQorCS8qIFVuYWJsZSB0byByZWFjaCBhbGwgdGFyZ2V0cyAqLworCisJYmNiZWFyZXItPmJlYXJlci5wdWJsLmJsb2NrZWQgPSAxOworCWJjbC0+c3RhdHMuYmVhcmVyX2NvbmdzKys7CisJcmV0dXJuIH5USVBDX09LOworfQorCisvKioKKyAqIHRpcGNfYmNiZWFyZXJfc29ydCAtIGNyZWF0ZSBzZXRzIG9mIGJlYXJlciBwYWlycyB1c2VkIGJ5IGJyb2FkY2FzdCBiZWFyZXIKKyAqLworCit2b2lkIHRpcGNfYmNiZWFyZXJfc29ydCh2b2lkKQoreworCXN0cnVjdCBiY2JlYXJlcl9wYWlyICpicF90ZW1wID0gYmNiZWFyZXItPmJwYWlyc190ZW1wOworCXN0cnVjdCBiY2JlYXJlcl9wYWlyICpicF9jdXJyOworCWludCBiX2luZGV4OworCWludCBwcmk7CisKKwlzcGluX2xvY2tfYmgoJmJjX2xvY2spOworCisJLyogR3JvdXAgYmVhcmVycyBieSBwcmlvcml0eSAoY2FuIGFzc3VtZSBtYXggb2YgdHdvIHBlciBwcmlvcml0eSkgKi8KKworCW1lbXNldChicF90ZW1wLCAwLCBzaXplb2YoYmNiZWFyZXItPmJwYWlyc190ZW1wKSk7CisKKwlmb3IgKGJfaW5kZXggPSAwOyBiX2luZGV4IDwgTUFYX0JFQVJFUlM7IGJfaW5kZXgrKykgeworCQlzdHJ1Y3QgYmVhcmVyICpiID0gJnRpcGNfYmVhcmVyc1tiX2luZGV4XTsKKworCQlpZiAoIWItPmFjdGl2ZSB8fCAhYi0+bm9kZXMuY291bnQpCisJCQljb250aW51ZTsKKworCQlpZiAoIWJwX3RlbXBbYi0+cHJpb3JpdHldLnByaW1hcnkpCisJCQlicF90ZW1wW2ItPnByaW9yaXR5XS5wcmltYXJ5ID0gYjsKKwkJZWxzZQorCQkJYnBfdGVtcFtiLT5wcmlvcml0eV0uc2Vjb25kYXJ5ID0gYjsKKwl9CisKKwkvKiBDcmVhdGUgYXJyYXkgb2YgYmVhcmVyIHBhaXJzIGZvciBicm9hZGNhc3RpbmcgKi8KKworCWJwX2N1cnIgPSBiY2JlYXJlci0+YnBhaXJzOworCW1lbXNldChiY2JlYXJlci0+YnBhaXJzLCAwLCBzaXplb2YoYmNiZWFyZXItPmJwYWlycykpOworCisJZm9yIChwcmkgPSBUSVBDX01BWF9MSU5LX1BSSTsgcHJpID49IDA7IHByaS0tKSB7CisKKwkJaWYgKCFicF90ZW1wW3ByaV0ucHJpbWFyeSkKKwkJCWNvbnRpbnVlOworCisJCWJwX2N1cnItPnByaW1hcnkgPSBicF90ZW1wW3ByaV0ucHJpbWFyeTsKKworCQlpZiAoYnBfdGVtcFtwcmldLnNlY29uZGFyeSkgeworCQkJaWYgKHRpcGNfbm1hcF9lcXVhbCgmYnBfdGVtcFtwcmldLnByaW1hcnktPm5vZGVzLAorCQkJCQkgICAgJmJwX3RlbXBbcHJpXS5zZWNvbmRhcnktPm5vZGVzKSkgeworCQkJCWJwX2N1cnItPnNlY29uZGFyeSA9IGJwX3RlbXBbcHJpXS5zZWNvbmRhcnk7CisJCQl9IGVsc2UgeworCQkJCWJwX2N1cnIrKzsKKwkJCQlicF9jdXJyLT5wcmltYXJ5ID0gYnBfdGVtcFtwcmldLnNlY29uZGFyeTsKKwkJCX0KKwkJfQorCisJCWJwX2N1cnIrKzsKKwl9CisKKwlzcGluX3VubG9ja19iaCgmYmNfbG9jayk7Cit9CisKKy8qKgorICogdGlwY19iY2JlYXJlcl9wdXNoIC0gcmVzb2x2ZSBiZWFyZXIgY29uZ2VzdGlvbgorICogCisgKiBGb3JjZXMgYmNsaW5rIHRvIHB1c2ggb3V0IGFueSB1bnNlbnQgcGFja2V0cywgdW50aWwgYWxsIHBhY2tldHMgYXJlIGdvbmUKKyAqIG9yIGNvbmdlc3Rpb24gcmVvY2N1cnMuCisgKiBObyBsb2NrcyBzZXQgd2hlbiBmdW5jdGlvbiBjYWxsZWQKKyAqLworCit2b2lkIHRpcGNfYmNiZWFyZXJfcHVzaCh2b2lkKQoreworCXN0cnVjdCBiZWFyZXIgKmJfcHRyOworCisJc3Bpbl9sb2NrX2JoKCZiY19sb2NrKTsKKwliX3B0ciA9ICZiY2JlYXJlci0+YmVhcmVyOworCWlmIChiX3B0ci0+cHVibC5ibG9ja2VkKSB7CisJCWJfcHRyLT5wdWJsLmJsb2NrZWQgPSAwOworCQl0aXBjX2JlYXJlcl9sb2NrX3B1c2goYl9wdHIpOworCX0KKwlzcGluX3VubG9ja19iaCgmYmNfbG9jayk7Cit9CisKKworaW50IHRpcGNfYmNsaW5rX3N0YXRzKGNoYXIgKmJ1ZiwgY29uc3QgdTMyIGJ1Zl9zaXplKQoreworCXN0cnVjdCBwcmludF9idWYgcGI7CisKKwlpZiAoIWJjbCkKKwkJcmV0dXJuIDA7CisKKwl0aXBjX3ByaW50YnVmX2luaXQoJnBiLCBidWYsIGJ1Zl9zaXplKTsKKworCXNwaW5fbG9ja19iaCgmYmNfbG9jayk7CisKKwl0aXBjX3ByaW50ZigmcGIsICJMaW5rIDwlcz5cbiIKKwkJICAgICAgICAgIiAgV2luZG93OiV1IHBhY2tldHNcbiIsIAorCQkgICAgYmNsLT5uYW1lLCBiY2wtPnF1ZXVlX2xpbWl0WzBdKTsKKwl0aXBjX3ByaW50ZigmcGIsICIgIFJYIHBhY2tldHM6JXUgZnJhZ21lbnRzOiV1LyV1IGJ1bmRsZXM6JXUvJXVcbiIsIAorCQkgICAgYmNsLT5zdGF0cy5yZWN2X2luZm8sCisJCSAgICBiY2wtPnN0YXRzLnJlY3ZfZnJhZ21lbnRzLAorCQkgICAgYmNsLT5zdGF0cy5yZWN2X2ZyYWdtZW50ZWQsCisJCSAgICBiY2wtPnN0YXRzLnJlY3ZfYnVuZGxlcywKKwkJICAgIGJjbC0+c3RhdHMucmVjdl9idW5kbGVkKTsKKwl0aXBjX3ByaW50ZigmcGIsICIgIFRYIHBhY2tldHM6JXUgZnJhZ21lbnRzOiV1LyV1IGJ1bmRsZXM6JXUvJXVcbiIsIAorCQkgICAgYmNsLT5zdGF0cy5zZW50X2luZm8sCisJCSAgICBiY2wtPnN0YXRzLnNlbnRfZnJhZ21lbnRzLAorCQkgICAgYmNsLT5zdGF0cy5zZW50X2ZyYWdtZW50ZWQsIAorCQkgICAgYmNsLT5zdGF0cy5zZW50X2J1bmRsZXMsCisJCSAgICBiY2wtPnN0YXRzLnNlbnRfYnVuZGxlZCk7CisJdGlwY19wcmludGYoJnBiLCAiICBSWCBuYWtzOiV1IGRlZnM6JXUgZHVwczoldVxuIiwgCisJCSAgICBiY2wtPnN0YXRzLnJlY3ZfbmFja3MsCisJCSAgICBiY2wtPnN0YXRzLmRlZmVycmVkX3JlY3YsIAorCQkgICAgYmNsLT5zdGF0cy5kdXBsaWNhdGVzKTsKKwl0aXBjX3ByaW50ZigmcGIsICIgIFRYIG5ha3M6JXUgYWNrczoldSBkdXBzOiV1XG4iLCAKKwkJICAgIGJjbC0+c3RhdHMuc2VudF9uYWNrcywgCisJCSAgICBiY2wtPnN0YXRzLnNlbnRfYWNrcywgCisJCSAgICBiY2wtPnN0YXRzLnJldHJhbnNtaXR0ZWQpOworCXRpcGNfcHJpbnRmKCZwYiwgIiAgQ29uZ2VzdGlvbiBiZWFyZXI6JXUgbGluazoldSAgU2VuZCBxdWV1ZSBtYXg6JXUgYXZnOiV1XG4iLAorCQkgICAgYmNsLT5zdGF0cy5iZWFyZXJfY29uZ3MsCisJCSAgICBiY2wtPnN0YXRzLmxpbmtfY29uZ3MsCisJCSAgICBiY2wtPnN0YXRzLm1heF9xdWV1ZV9zeiwKKwkJICAgIGJjbC0+c3RhdHMucXVldWVfc3pfY291bnRzCisJCSAgICA/IChiY2wtPnN0YXRzLmFjY3VfcXVldWVfc3ogLyBiY2wtPnN0YXRzLnF1ZXVlX3N6X2NvdW50cykKKwkJICAgIDogMCk7CisKKwlzcGluX3VubG9ja19iaCgmYmNfbG9jayk7CisJcmV0dXJuIHRpcGNfcHJpbnRidWZfdmFsaWRhdGUoJnBiKTsKK30KKworaW50IHRpcGNfYmNsaW5rX3Jlc2V0X3N0YXRzKHZvaWQpCit7CisJaWYgKCFiY2wpCisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisKKwlzcGluX2xvY2tfYmgoJmJjX2xvY2spOworCW1lbXNldCgmYmNsLT5zdGF0cywgMCwgc2l6ZW9mKGJjbC0+c3RhdHMpKTsKKwlzcGluX3VubG9ja19iaCgmYmNfbG9jayk7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKK2ludCB0aXBjX2JjbGlua19zZXRfcXVldWVfbGltaXRzKHUzMiBsaW1pdCkKK3sKKwlpZiAoIWJjbCkKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwlpZiAoKGxpbWl0IDwgVElQQ19NSU5fTElOS19XSU4pIHx8IChsaW1pdCA+IFRJUENfTUFYX0xJTktfV0lOKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfYmgoJmJjX2xvY2spOworCXRpcGNfbGlua19zZXRfcXVldWVfbGltaXRzKGJjbCwgbGltaXQpOworCXNwaW5fdW5sb2NrX2JoKCZiY19sb2NrKTsKKwlyZXR1cm4gVElQQ19PSzsKK30KKworaW50IHRpcGNfYmNsaW5rX2luaXQodm9pZCkKK3sKKwliY2JlYXJlciA9IGttYWxsb2Moc2l6ZW9mKCpiY2JlYXJlciksIEdGUF9BVE9NSUMpOworCWJjbGluayA9IGttYWxsb2Moc2l6ZW9mKCpiY2xpbmspLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWJjYmVhcmVyIHx8ICFiY2xpbmspIHsKKyBub21lbToKKwkgCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBGYWlsZWQgdG8gY3JlYXRlIG11bHRpY2FzdCBsaW5rXG4iKTsKKwkJa2ZyZWUoYmNiZWFyZXIpOworCQliY2JlYXJlciA9IE5VTEw7CisJCWtmcmVlKGJjbGluayk7CisJCWJjbGluayA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChiY2JlYXJlciwgMCwgc2l6ZW9mKHN0cnVjdCBiY2JlYXJlcikpOworCUlOSVRfTElTVF9IRUFEKCZiY2JlYXJlci0+YmVhcmVyLmNvbmdfbGlua3MpOworCWJjYmVhcmVyLT5iZWFyZXIubWVkaWEgPSAmYmNiZWFyZXItPm1lZGlhOworCWJjYmVhcmVyLT5tZWRpYS5zZW5kX21zZyA9IHRpcGNfYmNiZWFyZXJfc2VuZDsKKwlzcHJpbnRmKGJjYmVhcmVyLT5tZWRpYS5uYW1lLCAidGlwYy1tdWx0aWNhc3QiKTsKKworCWJjbCA9ICZiY2xpbmstPmxpbms7CisJbWVtc2V0KGJjbGluaywgMCwgc2l6ZW9mKHN0cnVjdCBiY2xpbmspKTsKKwlJTklUX0xJU1RfSEVBRCgmYmNsLT53YWl0aW5nX3BvcnRzKTsKKwliY2wtPm5leHRfb3V0X25vID0gMTsKKwliY2xpbmstPm5vZGUubG9jayA9ICBTUElOX0xPQ0tfVU5MT0NLRUQ7ICAgICAgICAKKwliY2wtPm93bmVyID0gJmJjbGluay0+bm9kZTsKKyAgICAgICAgYmNsLT5tYXhfcGt0ID0gTUFYX1BLVF9ERUZBVUxUX01DQVNUOworCXRpcGNfbGlua19zZXRfcXVldWVfbGltaXRzKGJjbCwgQkNMSU5LX1dJTl9ERUZBVUxUKTsKKwliY2wtPmJfcHRyID0gJmJjYmVhcmVyLT5iZWFyZXI7CisJYmNsLT5zdGF0ZSA9IFdPUktJTkdfV09SS0lORzsKKwlzcHJpbnRmKGJjbC0+bmFtZSwgdGlwY19iY2xpbmtfbmFtZSk7CisKKwlpZiAoQkNMSU5LX0xPR19CVUZfU0laRSkgeworCQljaGFyICpwYiA9IGttYWxsb2MoQkNMSU5LX0xPR19CVUZfU0laRSwgR0ZQX0FUT01JQyk7CisKKwkJaWYgKCFwYikKKwkJCWdvdG8gbm9tZW07CisJCXRpcGNfcHJpbnRidWZfaW5pdCgmYmNsLT5wcmludF9idWYsIHBiLCBCQ0xJTktfTE9HX0JVRl9TSVpFKTsKKwl9CisKKwlyZXR1cm4gVElQQ19PSzsKK30KKwordm9pZCB0aXBjX2JjbGlua19zdG9wKHZvaWQpCit7CisJc3Bpbl9sb2NrX2JoKCZiY19sb2NrKTsKKwlpZiAoYmNiZWFyZXIpIHsKKwkJdGlwY19saW5rX3N0b3AoYmNsKTsKKwkJaWYgKEJDTElOS19MT0dfQlVGX1NJWkUpCisJCQlrZnJlZShiY2wtPnByaW50X2J1Zi5idWYpOworCQliY2wgPSBOVUxMOworCQlrZnJlZShiY2xpbmspOworCQliY2xpbmsgPSBOVUxMOworCQlrZnJlZShiY2JlYXJlcik7CisJCWJjYmVhcmVyID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmJjX2xvY2spOworfQorCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iY2FzdC5oIGIvbmV0L3RpcGMvYmNhc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTNiZTJhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvYmNhc3QuaApAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIG5ldC90aXBjL2JjYXN0Lmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBicm9hZGNhc3QgY29kZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX0JDQVNUX0gKKyNkZWZpbmUgX1RJUENfQkNBU1RfSAorCisjZGVmaW5lIE1BWF9OT0RFUyA0MDk2CisjZGVmaW5lIFdTSVpFIDMyCisKKy8qKgorICogc3RydWN0IG5vZGVfbWFwIC0gc2V0IG9mIG5vZGUgaWRlbnRpZmllcnMKKyAqIEBjb3VudDogIyBvZiBub2RlcyBpbiBzZXQKKyAqIEBtYXA6IGJpdG1hcCBvZiBub2RlIGlkZW50aWZpZXJzIHRoYXQgYXJlIGluIHRoZSBzZXQKKyAqLworCitzdHJ1Y3Qgbm9kZV9tYXAgeworCXUzMiBjb3VudDsKKwl1MzIgbWFwW01BWF9OT0RFUyAvIFdTSVpFXTsKK307CisKKworI2RlZmluZSBQTFNJWkUgMzIKKworLyoqCisgKiBzdHJ1Y3QgcG9ydF9saXN0IC0gc2V0IG9mIG5vZGUgbG9jYWwgZGVzdGluYXRpb24gcG9ydHMKKyAqIEBjb3VudDogIyBvZiBwb3J0cyBpbiBzZXQgKG9ubHkgdmFsaWQgZm9yIGZpcnN0IGVudHJ5IGluIGxpc3QpCisgKiBAbmV4dDogcG9pbnRlciB0byBuZXh0IGVudHJ5IGluIGxpc3QKKyAqIEBwb3J0czogYXJyYXkgb2YgcG9ydCByZWZlcmVuY2VzCisgKi8KKworc3RydWN0IHBvcnRfbGlzdCB7CisJaW50IGNvdW50OworCXN0cnVjdCBwb3J0X2xpc3QgKm5leHQ7CisJdTMyIHBvcnRzW1BMU0laRV07Cit9OworCisKK3N0cnVjdCBub2RlOworCitleHRlcm4gY2hhciB0aXBjX2JjbGlua19uYW1lW107CisKKworLyoqCisgKiBubWFwX2dldCAtIGRldGVybWluZSBpZiBub2RlIGV4aXN0cyBpbiBhIG5vZGUgbWFwCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgdGlwY19ubWFwX2dldChzdHJ1Y3Qgbm9kZV9tYXAgKm5tX3B0ciwgdTMyIG5vZGUpCit7CisJaW50IG4gPSB0aXBjX25vZGUobm9kZSk7CisJaW50IHcgPSBuIC8gV1NJWkU7CisJaW50IGIgPSBuICUgV1NJWkU7CisKKwlyZXR1cm4gbm1fcHRyLT5tYXBbd10gJiAoMSA8PCBiKTsKK30KKworLyoqCisgKiBubWFwX2FkZCAtIGFkZCBhIG5vZGUgdG8gYSBub2RlIG1hcAorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aXBjX25tYXBfYWRkKHN0cnVjdCBub2RlX21hcCAqbm1fcHRyLCB1MzIgbm9kZSkKK3sKKwlpbnQgbiA9IHRpcGNfbm9kZShub2RlKTsKKwlpbnQgdyA9IG4gLyBXU0laRTsKKwl1MzIgbWFzayA9ICgxIDw8IChuICUgV1NJWkUpKTsKKworCWlmICgobm1fcHRyLT5tYXBbd10gJiBtYXNrKSA9PSAwKSB7CisJCW5tX3B0ci0+Y291bnQrKzsKKwkJbm1fcHRyLT5tYXBbd10gfD0gbWFzazsKKwl9Cit9CisKKy8qKiAKKyAqIG5tYXBfcmVtb3ZlIC0gcmVtb3ZlIGEgbm9kZSBmcm9tIGEgbm9kZSBtYXAKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdGlwY19ubWFwX3JlbW92ZShzdHJ1Y3Qgbm9kZV9tYXAgKm5tX3B0ciwgdTMyIG5vZGUpCit7CisJaW50IG4gPSB0aXBjX25vZGUobm9kZSk7CisJaW50IHcgPSBuIC8gV1NJWkU7CisJdTMyIG1hc2sgPSAoMSA8PCAobiAlIFdTSVpFKSk7CisKKwlpZiAoKG5tX3B0ci0+bWFwW3ddICYgbWFzaykgIT0gMCkgeworCQlubV9wdHItPm1hcFt3XSAmPSB+bWFzazsKKwkJbm1fcHRyLT5jb3VudC0tOworCX0KK30KKworLyoqCisgKiBubWFwX2VxdWFsIC0gdGVzdCBmb3IgZXF1YWxpdHkgb2Ygbm9kZSBtYXBzCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgdGlwY19ubWFwX2VxdWFsKHN0cnVjdCBub2RlX21hcCAqbm1fYSwgc3RydWN0IG5vZGVfbWFwICpubV9iKQoreworCXJldHVybiAhbWVtY21wKG5tX2EsIG5tX2IsIHNpemVvZigqbm1fYSkpOworfQorCisvKioKKyAqIG5tYXBfZGlmZiAtIGZpbmQgZGlmZmVyZW5jZXMgYmV0d2VlbiBub2RlIG1hcHMKKyAqIEBubV9hOiBpbnB1dCBub2RlIG1hcCBBCisgKiBAbm1fYjogaW5wdXQgbm9kZSBtYXAgQgorICogQG5tX2RpZmY6IG91dHB1dCBub2RlIG1hcCBBLUIgKGkuZS4gbm9kZXMgb2YgQSB0aGF0IGFyZSBub3QgaW4gQikKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdGlwY19ubWFwX2RpZmYoc3RydWN0IG5vZGVfbWFwICpubV9hLCBzdHJ1Y3Qgbm9kZV9tYXAgKm5tX2IsCisJCQkJICBzdHJ1Y3Qgbm9kZV9tYXAgKm5tX2RpZmYpCit7CisJaW50IHN0b3AgPSBzaXplb2Yobm1fYS0+bWFwKSAvIHNpemVvZih1MzIpOworCWludCB3OworCWludCBiOworCXUzMiBtYXA7CisKKwltZW1zZXQobm1fZGlmZiwgMCwgc2l6ZW9mKCpubV9kaWZmKSk7CisJZm9yICh3ID0gMDsgdyA8IHN0b3A7IHcrKykgeworCQltYXAgPSBubV9hLT5tYXBbd10gXiAobm1fYS0+bWFwW3ddICYgbm1fYi0+bWFwW3ddKTsKKwkJbm1fZGlmZi0+bWFwW3ddID0gbWFwOworCQlpZiAobWFwICE9IDApIHsKKwkJCWZvciAoYiA9IDAgOyBiIDwgV1NJWkU7IGIrKykgeworCQkJCWlmIChtYXAgJiAoMSA8PCBiKSkKKwkJCQkJbm1fZGlmZi0+Y291bnQrKzsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqCisgKiBwb3J0X2xpc3RfYWRkIC0gYWRkIGEgcG9ydCB0byBhIHBvcnQgbGlzdCwgZW5zdXJpbmcgbm8gZHVwbGljYXRlcworICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aXBjX3BvcnRfbGlzdF9hZGQoc3RydWN0IHBvcnRfbGlzdCAqcGxfcHRyLCB1MzIgcG9ydCkKK3sKKwlzdHJ1Y3QgcG9ydF9saXN0ICppdGVtID0gcGxfcHRyOworCWludCBpOworCWludCBpdGVtX3N6ID0gUExTSVpFOworCWludCBjbnQgPSBwbF9wdHItPmNvdW50OworCisJZm9yICg7IDsgY250IC09IGl0ZW1fc3osIGl0ZW0gPSBpdGVtLT5uZXh0KSB7CisJCWlmIChjbnQgPCBQTFNJWkUpCisJCQlpdGVtX3N6ID0gY250OworCQlmb3IgKGkgPSAwOyBpIDwgaXRlbV9zejsgaSsrKQorCQkJaWYgKGl0ZW0tPnBvcnRzW2ldID09IHBvcnQpCisJCQkJcmV0dXJuOworCQlpZiAoaSA8IFBMU0laRSkgeworCQkJaXRlbS0+cG9ydHNbaV0gPSBwb3J0OworCQkJcGxfcHRyLT5jb3VudCsrOworCQkJcmV0dXJuOworCQl9CisJCWlmICghaXRlbS0+bmV4dCkgeworCQkJaXRlbS0+bmV4dCA9IGttYWxsb2Moc2l6ZW9mKCppdGVtKSwgR0ZQX0FUT01JQyk7CisJCQlpZiAoIWl0ZW0tPm5leHQpIHsKKwkJCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTogbXVsdGljYXN0IGRlc3RpbmF0aW9uIHBvcnQgbGlzdCBpcyBpbmNvbXBsZXRlXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpdGVtLT5uZXh0LT5uZXh0ID0gTlVMTDsKKwkJfQorCX0KK30KKworLyoqCisgKiBwb3J0X2xpc3RfZnJlZSAtIGZyZWUgZHluYW1pY2FsbHkgY3JlYXRlZCBlbnRyaWVzIGluIHBvcnRfbGlzdCBjaGFpbgorICogCisgKiBOb3RlOiBGaXJzdCBpdGVtIGlzIG9uIHN0YWNrLCBzbyBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgcmVsZWFzZWQKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdGlwY19wb3J0X2xpc3RfZnJlZShzdHJ1Y3QgcG9ydF9saXN0ICpwbF9wdHIpCit7CisJc3RydWN0IHBvcnRfbGlzdCAqaXRlbTsKKwlzdHJ1Y3QgcG9ydF9saXN0ICpuZXh0OworCisJZm9yIChpdGVtID0gcGxfcHRyLT5uZXh0OyBpdGVtOyBpdGVtID0gbmV4dCkgeworCQluZXh0ID0gaXRlbS0+bmV4dDsKKwkJa2ZyZWUoaXRlbSk7CisJfQorfQorCisKK2ludCAgdGlwY19iY2xpbmtfaW5pdCh2b2lkKTsKK3ZvaWQgdGlwY19iY2xpbmtfc3RvcCh2b2lkKTsKK3ZvaWQgdGlwY19iY2xpbmtfYWNrbm93bGVkZ2Uoc3RydWN0IG5vZGUgKm5fcHRyLCB1MzIgYWNrZWQpOworaW50ICB0aXBjX2JjbGlua19zZW5kX21zZyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKK3ZvaWQgdGlwY19iY2xpbmtfcmVjdl9wa3Qoc3RydWN0IHNrX2J1ZmYgKmJ1Zik7Cit1MzIgIHRpcGNfYmNsaW5rX2dldF9sYXN0X3NlbnQodm9pZCk7Cit1MzIgIHRpcGNfYmNsaW5rX2Fja3NfbWlzc2luZyhzdHJ1Y3Qgbm9kZSAqbl9wdHIpOwordm9pZCB0aXBjX2JjbGlua19jaGVja19nYXAoc3RydWN0IG5vZGUgKm5fcHRyLCB1MzIgc2Vxbm8pOworaW50ICB0aXBjX2JjbGlua19zdGF0cyhjaGFyICpzdGF0c19idWYsIGNvbnN0IHUzMiBidWZfc2l6ZSk7CitpbnQgIHRpcGNfYmNsaW5rX3Jlc2V0X3N0YXRzKHZvaWQpOworaW50ICB0aXBjX2JjbGlua19zZXRfcXVldWVfbGltaXRzKHUzMiBsaW1pdCk7Cit2b2lkIHRpcGNfYmNiZWFyZXJfc29ydCh2b2lkKTsKK3ZvaWQgdGlwY19iY2JlYXJlcl9wdXNoKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC90aXBjL2JlYXJlci5jIGIvbmV0L3RpcGMvYmVhcmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRkY2IwZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL2JlYXJlci5jCkBAIC0wLDAgKzEsNjk5IEBACisvKgorICogbmV0L3RpcGMvYmVhcmVyLmM6IFRJUEMgYmVhcmVyIGNvZGUKKyAqIAorICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImRiZy5oIgorI2luY2x1ZGUgImJlYXJlci5oIgorI2luY2x1ZGUgImxpbmsuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAiZGlzY292ZXIuaCIKKyNpbmNsdWRlICJiY2FzdC5oIgorCisjZGVmaW5lIE1BWF9BRERSX1NUUiAzMgorCitzdGF0aWMgc3RydWN0IG1lZGlhICptZWRpYV9saXN0ID0gMDsKK3N0YXRpYyB1MzIgbWVkaWFfY291bnQgPSAwOworCitzdHJ1Y3QgYmVhcmVyICp0aXBjX2JlYXJlcnMgPSAwOworCisvKioKKyAqIG1lZGlhX25hbWVfdmFsaWQgLSB2YWxpZGF0ZSBtZWRpYSBuYW1lCisgKiAKKyAqIFJldHVybnMgMSBpZiBtZWRpYSBuYW1lIGlzIHZhbGlkLCBvdGhlcndpc2UgMC4KKyAqLworCitzdGF0aWMgaW50IG1lZGlhX25hbWVfdmFsaWQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1MzIgbGVuOworCisJbGVuID0gc3RybGVuKG5hbWUpOworCWlmICgobGVuICsgMSkgPiBUSVBDX01BWF9NRURJQV9OQU1FKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKHN0cnNwbihuYW1lLCB0aXBjX2FscGhhYmV0KSA9PSBsZW4pOworfQorCisvKioKKyAqIG1lZGlhX2ZpbmQgLSBsb2NhdGVzIHNwZWNpZmllZCBtZWRpYSBvYmplY3QgYnkgbmFtZQorICovCisKK3N0YXRpYyBzdHJ1Y3QgbWVkaWEgKm1lZGlhX2ZpbmQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbWVkaWEgKm1fcHRyOworCXUzMiBpOworCisJZm9yIChpID0gMCwgbV9wdHIgPSBtZWRpYV9saXN0OyBpIDwgbWVkaWFfY291bnQ7IGkrKywgbV9wdHIrKykgeworCQlpZiAoIXN0cmNtcChtX3B0ci0+bmFtZSwgbmFtZSkpCisJCQlyZXR1cm4gbV9wdHI7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHRpcGNfcmVnaXN0ZXJfbWVkaWEgLSByZWdpc3RlciBhIG1lZGlhIHR5cGUKKyAqIAorICogQmVhcmVycyBmb3IgdGhpcyBtZWRpYSB0eXBlIG11c3QgYmUgYWN0aXZhdGVkIHNlcGFyYXRlbHkgYXQgYSBsYXRlciBzdGFnZS4KKyAqLworCitpbnQgIHRpcGNfcmVnaXN0ZXJfbWVkaWEodTMyIG1lZGlhX3R5cGUsCisJCQkgY2hhciAqbmFtZSwgCisJCQkgaW50ICgqZW5hYmxlKShzdHJ1Y3QgdGlwY19iZWFyZXIgKiksIAorCQkJIHZvaWQgKCpkaXNhYmxlKShzdHJ1Y3QgdGlwY19iZWFyZXIgKiksIAorCQkJIGludCAoKnNlbmRfbXNnKShzdHJ1Y3Qgc2tfYnVmZiAqLCAKKwkJCQkJIHN0cnVjdCB0aXBjX2JlYXJlciAqLAorCQkJCQkgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqKSwgCisJCQkgY2hhciAqKCphZGRyMnN0cikoc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYSwKKwkJCQkJICAgY2hhciAqc3RyX2J1ZiwgaW50IHN0cl9zaXplKSwKKwkJCSBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICpiY2FzdF9hZGRyLAorCQkJIGNvbnN0IHUzMiBiZWFyZXJfcHJpb3JpdHksCisJCQkgY29uc3QgdTMyIGxpbmtfdG9sZXJhbmNlLCAgLyogW21zXSAqLworCQkJIGNvbnN0IHUzMiBzZW5kX3dpbmRvd19saW1pdCkKK3sKKwlzdHJ1Y3QgbWVkaWEgKm1fcHRyOworCXUzMiBtZWRpYV9pZDsKKwl1MzIgaTsKKwlpbnQgcmVzID0gLUVJTlZBTDsKKworCXdyaXRlX2xvY2tfYmgoJnRpcGNfbmV0X2xvY2spOworCWlmICghbWVkaWFfbGlzdCkKKwkJZ290byBleGl0OworCisJaWYgKCFtZWRpYV9uYW1lX3ZhbGlkKG5hbWUpKSB7CisJCXdhcm4oIk1lZGlhIHJlZ2lzdHJhdGlvbiBlcnJvcjogaWxsZWdhbCBuYW1lIDwlcz5cbiIsIG5hbWUpOworCQlnb3RvIGV4aXQ7CisJfQorCWlmICghYmNhc3RfYWRkcikgeworCQl3YXJuKCJNZWRpYSByZWdpc3RyYXRpb24gZXJyb3I6IG5vIGJyb2FkY2FzdCBhZGRyZXNzIHN1cHBsaWVkXG4iKTsKKwkJZ290byBleGl0OworCX0KKwlpZiAoKGJlYXJlcl9wcmlvcml0eSA8IFRJUENfTUlOX0xJTktfUFJJKSAmJgorCSAgICAoYmVhcmVyX3ByaW9yaXR5ID4gVElQQ19NQVhfTElOS19QUkkpKSB7CisJCXdhcm4oIk1lZGlhIHJlZ2lzdHJhdGlvbiBlcnJvcjogcHJpb3JpdHkgJXVcbiIsIGJlYXJlcl9wcmlvcml0eSk7CisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKChsaW5rX3RvbGVyYW5jZSA8IFRJUENfTUlOX0xJTktfVE9MKSB8fCAKKwkgICAgKGxpbmtfdG9sZXJhbmNlID4gVElQQ19NQVhfTElOS19UT0wpKSB7CisJCXdhcm4oIk1lZGlhIHJlZ2lzdHJhdGlvbiBlcnJvcjogdG9sZXJhbmNlICV1XG4iLCBsaW5rX3RvbGVyYW5jZSk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwltZWRpYV9pZCA9IG1lZGlhX2NvdW50Kys7CisJaWYgKG1lZGlhX2lkID49IE1BWF9NRURJQSkgeworCQl3YXJuKCJBdHRlbXB0IHRvIHJlZ2lzdGVyIG1vcmUgdGhhbiAldSBtZWRpYVxuIiwgTUFYX01FRElBKTsKKwkJbWVkaWFfY291bnQtLTsKKwkJZ290byBleGl0OworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbWVkaWFfaWQ7IGkrKykgeworCQlpZiAobWVkaWFfbGlzdFtpXS50eXBlX2lkID09IG1lZGlhX3R5cGUpIHsKKwkJCXdhcm4oIkF0dGVtcHQgdG8gcmVnaXN0ZXIgc2Vjb25kIG1lZGlhIHdpdGggdHlwZSAldVxuIiwgCisJCQkgICAgIG1lZGlhX3R5cGUpOworCQkJbWVkaWFfY291bnQtLTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQlpZiAoIXN0cmNtcChuYW1lLCBtZWRpYV9saXN0W2ldLm5hbWUpKSB7CisJCQl3YXJuKCJBdHRlbXB0IHRvIHJlLXJlZ2lzdGVyIG1lZGlhIG5hbWUgPCVzPlxuIiwgbmFtZSk7CisJCQltZWRpYV9jb3VudC0tOworCQkJZ290byBleGl0OworCQl9CisJfQorCisJbV9wdHIgPSAmbWVkaWFfbGlzdFttZWRpYV9pZF07CisJbV9wdHItPnR5cGVfaWQgPSBtZWRpYV90eXBlOworCW1fcHRyLT5zZW5kX21zZyA9IHNlbmRfbXNnOworCW1fcHRyLT5lbmFibGVfYmVhcmVyID0gZW5hYmxlOworCW1fcHRyLT5kaXNhYmxlX2JlYXJlciA9IGRpc2FibGU7CisJbV9wdHItPmFkZHIyc3RyID0gYWRkcjJzdHI7CisJbWVtY3B5KCZtX3B0ci0+YmNhc3RfYWRkciwgYmNhc3RfYWRkciwgc2l6ZW9mKCpiY2FzdF9hZGRyKSk7CisJbV9wdHItPmJjYXN0ID0gMTsKKwlzdHJjcHkobV9wdHItPm5hbWUsIG5hbWUpOworCW1fcHRyLT5wcmlvcml0eSA9IGJlYXJlcl9wcmlvcml0eTsKKwltX3B0ci0+dG9sZXJhbmNlID0gbGlua190b2xlcmFuY2U7CisJbV9wdHItPndpbmRvdyA9IHNlbmRfd2luZG93X2xpbWl0OworCWRiZygiTWVkaWEgPCVzPiByZWdpc3RlcmVkXG4iLCBuYW1lKTsKKwlyZXMgPSAwOworZXhpdDoKKwl3cml0ZV91bmxvY2tfYmgoJnRpcGNfbmV0X2xvY2spOworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogdGlwY19tZWRpYV9hZGRyX3ByaW50ZiAtIHJlY29yZCBtZWRpYSBhZGRyZXNzIGluIHByaW50IGJ1ZmZlcgorICovCisKK3ZvaWQgdGlwY19tZWRpYV9hZGRyX3ByaW50ZihzdHJ1Y3QgcHJpbnRfYnVmICpwYiwgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYSkKK3sKKwlzdHJ1Y3QgbWVkaWEgKm1fcHRyOworCXUzMiBtZWRpYV90eXBlOworCXUzMiBpOworCisJbWVkaWFfdHlwZSA9IG50b2hsKGEtPnR5cGUpOworCWZvciAoaSA9IDAsIG1fcHRyID0gbWVkaWFfbGlzdDsgaSA8IG1lZGlhX2NvdW50OyBpKyssIG1fcHRyKyspIHsKKwkJaWYgKG1fcHRyLT50eXBlX2lkID09IG1lZGlhX3R5cGUpCisJCQlicmVhazsKKwl9CisKKwlpZiAoKGkgPCBtZWRpYV9jb3VudCkgJiYgKG1fcHRyLT5hZGRyMnN0ciAhPSBOVUxMKSkgeworCQljaGFyIGFkZHJfc3RyW01BWF9BRERSX1NUUl07CisKKwkJdGlwY19wcmludGYocGIsICIlcyglcykgIiwgbV9wdHItPm5hbWUsIAorCQkJICAgIG1fcHRyLT5hZGRyMnN0cihhLCBhZGRyX3N0ciwgc2l6ZW9mKGFkZHJfc3RyKSkpOworCX0gZWxzZSB7CisJCXVuY2hhciAqYWRkciA9ICh1bmNoYXIgKikmYS0+ZGV2X2FkZHI7CisKKwkJdGlwY19wcmludGYocGIsICJVTktOT1dOKCV1KToiLCBtZWRpYV90eXBlKTsKKwkJZm9yIChpID0gMDsgaSA8IChzaXplb2YoKmEpIC0gc2l6ZW9mKGEtPnR5cGUpKTsgaSsrKSB7CisJCQl0aXBjX3ByaW50ZihwYiwgIiUwMnggIiwgYWRkcltpXSk7CisJCX0KKwl9Cit9CisKKy8qKgorICogdGlwY19tZWRpYV9nZXRfbmFtZXMgLSByZWNvcmQgbmFtZXMgb2YgcmVnaXN0ZXJlZCBtZWRpYSBpbiBidWZmZXIKKyAqLworCitzdHJ1Y3Qgc2tfYnVmZiAqdGlwY19tZWRpYV9nZXRfbmFtZXModm9pZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXN0cnVjdCBtZWRpYSAqbV9wdHI7CisJaW50IGk7CisKKwlidWYgPSB0aXBjX2NmZ19yZXBseV9hbGxvYyhNQVhfTUVESUEgKiBUTFZfU1BBQ0UoVElQQ19NQVhfTUVESUFfTkFNRSkpOworCWlmICghYnVmKQorCQlyZXR1cm4gTlVMTDsKKworCXJlYWRfbG9ja19iaCgmdGlwY19uZXRfbG9jayk7CisJZm9yIChpID0gMCwgbV9wdHIgPSBtZWRpYV9saXN0OyBpIDwgbWVkaWFfY291bnQ7IGkrKywgbV9wdHIrKykgeworCQl0aXBjX2NmZ19hcHBlbmRfdGx2KGJ1ZiwgVElQQ19UTFZfTUVESUFfTkFNRSwgbV9wdHItPm5hbWUsIAorCQkJCSAgICBzdHJsZW4obV9wdHItPm5hbWUpICsgMSk7CisJfQorCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKKwlyZXR1cm4gYnVmOworfQorCisvKioKKyAqIGJlYXJlcl9uYW1lX3ZhbGlkYXRlIC0gdmFsaWRhdGUgJiAob3B0aW9uYWxseSkgZGVjb25zdHJ1Y3QgYmVhcmVyIG5hbWUKKyAqIEBuYW1lIC0gcHRyIHRvIGJlYXJlciBuYW1lIHN0cmluZworICogQG5hbWVfcGFydHMgLSBwdHIgdG8gYXJlYSBmb3IgYmVhcmVyIG5hbWUgY29tcG9uZW50cyAob3IgTlVMTCBpZiBub3QgbmVlZGVkKQorICogCisgKiBSZXR1cm5zIDEgaWYgYmVhcmVyIG5hbWUgaXMgdmFsaWQsIG90aGVyd2lzZSAwLgorICovCisKK3N0YXRpYyBpbnQgYmVhcmVyX25hbWVfdmFsaWRhdGUoY29uc3QgY2hhciAqbmFtZSwgCisJCQkJc3RydWN0IGJlYXJlcl9uYW1lICpuYW1lX3BhcnRzKQoreworCWNoYXIgbmFtZV9jb3B5W1RJUENfTUFYX0JFQVJFUl9OQU1FXTsKKwljaGFyICptZWRpYV9uYW1lOworCWNoYXIgKmlmX25hbWU7CisJdTMyIG1lZGlhX2xlbjsKKwl1MzIgaWZfbGVuOworCisJLyogY29weSBiZWFyZXIgbmFtZSAmIGVuc3VyZSBsZW5ndGggaXMgT0sgKi8KKworCW5hbWVfY29weVtUSVBDX01BWF9CRUFSRVJfTkFNRSAtIDFdID0gMDsKKwkvKiBuZWVkIGFib3ZlIGluIGNhc2Ugbm9uLVBvc2l4IHN0cm5jcHkoKSBkb2Vzbid0IHBhZCB3aXRoIG51bGxzICovCisJc3RybmNweShuYW1lX2NvcHksIG5hbWUsIFRJUENfTUFYX0JFQVJFUl9OQU1FKTsKKwlpZiAobmFtZV9jb3B5W1RJUENfTUFYX0JFQVJFUl9OQU1FIC0gMV0gIT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBlbnN1cmUgYWxsIGNvbXBvbmVudCBwYXJ0cyBvZiBiZWFyZXIgbmFtZSBhcmUgcHJlc2VudCAqLworCisJbWVkaWFfbmFtZSA9IG5hbWVfY29weTsKKwlpZiAoKGlmX25hbWUgPSBzdHJjaHIobWVkaWFfbmFtZSwgJzonKSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJKihpZl9uYW1lKyspID0gMDsKKwltZWRpYV9sZW4gPSBpZl9uYW1lIC0gbWVkaWFfbmFtZTsKKwlpZl9sZW4gPSBzdHJsZW4oaWZfbmFtZSkgKyAxOworCisJLyogdmFsaWRhdGUgY29tcG9uZW50IHBhcnRzIG9mIGJlYXJlciBuYW1lICovCisKKwlpZiAoKG1lZGlhX2xlbiA8PSAxKSB8fCAobWVkaWFfbGVuID4gVElQQ19NQVhfTUVESUFfTkFNRSkgfHwgCisJICAgIChpZl9sZW4gPD0gMSkgfHwgKGlmX2xlbiA+IFRJUENfTUFYX0lGX05BTUUpIHx8IAorCSAgICAoc3Ryc3BuKG1lZGlhX25hbWUsIHRpcGNfYWxwaGFiZXQpICE9IChtZWRpYV9sZW4gLSAxKSkgfHwKKwkgICAgKHN0cnNwbihpZl9uYW1lLCB0aXBjX2FscGhhYmV0KSAhPSAoaWZfbGVuIC0gMSkpKQorCQlyZXR1cm4gMDsKKworCS8qIHJldHVybiBiZWFyZXIgbmFtZSBjb21wb25lbnRzLCBpZiBuZWNlc3NhcnkgKi8KKworCWlmIChuYW1lX3BhcnRzKSB7CisJCXN0cmNweShuYW1lX3BhcnRzLT5tZWRpYV9uYW1lLCBtZWRpYV9uYW1lKTsKKwkJc3RyY3B5KG5hbWVfcGFydHMtPmlmX25hbWUsIGlmX25hbWUpOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBiZWFyZXJfZmluZCAtIGxvY2F0ZXMgYmVhcmVyIG9iamVjdCB3aXRoIG1hdGNoaW5nIGJlYXJlciBuYW1lCisgKi8KKworc3RhdGljIHN0cnVjdCBiZWFyZXIgKmJlYXJlcl9maW5kKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGJlYXJlciAqYl9wdHI7CisJdTMyIGk7CisKKwlmb3IgKGkgPSAwLCBiX3B0ciA9IHRpcGNfYmVhcmVyczsgaSA8IE1BWF9CRUFSRVJTOyBpKyssIGJfcHRyKyspIHsKKwkJaWYgKGJfcHRyLT5hY3RpdmUgJiYgKCFzdHJjbXAoYl9wdHItPnB1YmwubmFtZSwgbmFtZSkpKQorCQkJcmV0dXJuIGJfcHRyOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB0aXBjX2JlYXJlcl9maW5kX2ludGVyZmFjZSAtIGxvY2F0ZXMgYmVhcmVyIG9iamVjdCB3aXRoIG1hdGNoaW5nIGludGVyZmFjZSBuYW1lCisgKi8KKworc3RydWN0IGJlYXJlciAqdGlwY19iZWFyZXJfZmluZF9pbnRlcmZhY2UoY29uc3QgY2hhciAqaWZfbmFtZSkKK3sKKwlzdHJ1Y3QgYmVhcmVyICpiX3B0cjsKKwljaGFyICpiX2lmX25hbWU7CisJdTMyIGk7CisKKwlmb3IgKGkgPSAwLCBiX3B0ciA9IHRpcGNfYmVhcmVyczsgaSA8IE1BWF9CRUFSRVJTOyBpKyssIGJfcHRyKyspIHsKKwkJaWYgKCFiX3B0ci0+YWN0aXZlKQorCQkJY29udGludWU7CisJCWJfaWZfbmFtZSA9IHN0cmNocihiX3B0ci0+cHVibC5uYW1lLCAnOicpICsgMTsKKwkJaWYgKCFzdHJjbXAoYl9pZl9uYW1lLCBpZl9uYW1lKSkKKwkJCXJldHVybiBiX3B0cjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdGlwY19iZWFyZXJfZ2V0X25hbWVzIC0gcmVjb3JkIG5hbWVzIG9mIGJlYXJlcnMgaW4gYnVmZmVyCisgKi8KKworc3RydWN0IHNrX2J1ZmYgKnRpcGNfYmVhcmVyX2dldF9uYW1lcyh2b2lkKQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IG1lZGlhICptX3B0cjsKKwlzdHJ1Y3QgYmVhcmVyICpiX3B0cjsKKwlpbnQgaSwgajsKKworCWJ1ZiA9IHRpcGNfY2ZnX3JlcGx5X2FsbG9jKE1BWF9CRUFSRVJTICogVExWX1NQQUNFKFRJUENfTUFYX0JFQVJFUl9OQU1FKSk7CisJaWYgKCFidWYpCisJCXJldHVybiBOVUxMOworCisJcmVhZF9sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKKwlmb3IgKGkgPSAwLCBtX3B0ciA9IG1lZGlhX2xpc3Q7IGkgPCBtZWRpYV9jb3VudDsgaSsrLCBtX3B0cisrKSB7CisJCWZvciAoaiA9IDA7IGogPCBNQVhfQkVBUkVSUzsgaisrKSB7CisJCQliX3B0ciA9ICZ0aXBjX2JlYXJlcnNbal07CisJCQlpZiAoYl9wdHItPmFjdGl2ZSAmJiAoYl9wdHItPm1lZGlhID09IG1fcHRyKSkgeworCQkJCXRpcGNfY2ZnX2FwcGVuZF90bHYoYnVmLCBUSVBDX1RMVl9CRUFSRVJfTkFNRSwgCisJCQkJCQkgICAgYl9wdHItPnB1YmwubmFtZSwgCisJCQkJCQkgICAgc3RybGVuKGJfcHRyLT5wdWJsLm5hbWUpICsgMSk7CisJCQl9CisJCX0KKwl9CisJcmVhZF91bmxvY2tfYmgoJnRpcGNfbmV0X2xvY2spOworCXJldHVybiBidWY7Cit9CisKK3ZvaWQgdGlwY19iZWFyZXJfYWRkX2Rlc3Qoc3RydWN0IGJlYXJlciAqYl9wdHIsIHUzMiBkZXN0KQoreworCXRpcGNfbm1hcF9hZGQoJmJfcHRyLT5ub2RlcywgZGVzdCk7CisJdGlwY19kaXNjX3VwZGF0ZV9saW5rX3JlcShiX3B0ci0+bGlua19yZXEpOworCXRpcGNfYmNiZWFyZXJfc29ydCgpOworfQorCit2b2lkIHRpcGNfYmVhcmVyX3JlbW92ZV9kZXN0KHN0cnVjdCBiZWFyZXIgKmJfcHRyLCB1MzIgZGVzdCkKK3sKKwl0aXBjX25tYXBfcmVtb3ZlKCZiX3B0ci0+bm9kZXMsIGRlc3QpOworCXRpcGNfZGlzY191cGRhdGVfbGlua19yZXEoYl9wdHItPmxpbmtfcmVxKTsKKwl0aXBjX2JjYmVhcmVyX3NvcnQoKTsKK30KKworLyoKKyAqIGJlYXJlcl9wdXNoKCk6IFJlc29sdmUgYmVhcmVyIGNvbmdlc3Rpb24uIEZvcmNlIHRoZSB3YWl0aW5nCisgKiBsaW5rcyB0byBwdXNoIG91dCB0aGVpciB1bnNlbnQgcGFja2V0cywgb25lIHBhY2tldCBwZXIgbGluaworICogcGVyIGl0ZXJhdGlvbiwgdW50aWwgYWxsIHBhY2tldHMgYXJlIGdvbmUgb3IgY29uZ2VzdGlvbiByZW9jY3Vycy4KKyAqICd0aXBjX25ldF9sb2NrJyBpcyByZWFkX2xvY2tlZCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCisgKiBiZWFyZXIubG9jayBtdXN0IGJlIHRha2VuIGJlZm9yZSBjYWxsaW5nCisgKiBSZXR1cm5zIGJpbmFyeSB0cnVlKDEpIG9yZSBmYWxzZSgwKQorICovCitzdGF0aWMgaW50IGJlYXJlcl9wdXNoKHN0cnVjdCBiZWFyZXIgKmJfcHRyKQoreworCXUzMiByZXMgPSBUSVBDX09LOworCXN0cnVjdCBsaW5rICpsbiwgKnRsbjsKKworCWlmIChiX3B0ci0+cHVibC5ibG9ja2VkKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmYl9wdHItPmNvbmdfbGlua3MpICYmIChyZXMgIT0gUFVTSF9GQUlMRUQpKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsbiwgdGxuLCAmYl9wdHItPmNvbmdfbGlua3MsIGxpbmtfbGlzdCkgeworCQkJcmVzID0gdGlwY19saW5rX3B1c2hfcGFja2V0KGxuKTsKKwkJCWlmIChyZXMgPT0gUFVTSF9GQUlMRUQpCisJCQkJYnJlYWs7CisJCQlpZiAocmVzID09IFBVU0hfRklOSVNIRUQpCisJCQkJbGlzdF9tb3ZlX3RhaWwoJmxuLT5saW5rX2xpc3QsICZiX3B0ci0+bGlua3MpOworCQl9CisJfQorCXJldHVybiBsaXN0X2VtcHR5KCZiX3B0ci0+Y29uZ19saW5rcyk7Cit9CisKK3ZvaWQgdGlwY19iZWFyZXJfbG9ja19wdXNoKHN0cnVjdCBiZWFyZXIgKmJfcHRyKQoreworCWludCByZXM7CisKKwlzcGluX2xvY2tfYmgoJmJfcHRyLT5wdWJsLmxvY2spOworCXJlcyA9IGJlYXJlcl9wdXNoKGJfcHRyKTsKKwlzcGluX3VubG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7CisJaWYgKHJlcykKKwkJdGlwY19iY2JlYXJlcl9wdXNoKCk7Cit9CisKKworLyoKKyAqIEludGVycnVwdCBlbmFibGluZyBuZXcgcmVxdWVzdHMgYWZ0ZXIgYmVhcmVyIGNvbmdlc3Rpb24gb3IgYmxvY2tpbmc6ICAgIAorICogU2VlIGJlYXJlcl9zZW5kKCkuICAgCisgKi8KK3ZvaWQgdGlwY19jb250aW51ZShzdHJ1Y3QgdGlwY19iZWFyZXIgKnRiX3B0cikKK3sKKwlzdHJ1Y3QgYmVhcmVyICpiX3B0ciA9IChzdHJ1Y3QgYmVhcmVyICopdGJfcHRyOworCisJc3Bpbl9sb2NrX2JoKCZiX3B0ci0+cHVibC5sb2NrKTsKKwliX3B0ci0+Y29udGludWVfY291bnQrKzsKKwlpZiAoIWxpc3RfZW1wdHkoJmJfcHRyLT5jb25nX2xpbmtzKSkKKwkJdGlwY19rX3NpZ25hbCgoSGFuZGxlcil0aXBjX2JlYXJlcl9sb2NrX3B1c2gsICh1bnNpZ25lZCBsb25nKWJfcHRyKTsKKwliX3B0ci0+cHVibC5ibG9ja2VkID0gMDsKKwlzcGluX3VubG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7Cit9CisKKy8qCisgKiBTY2hlZHVsZSBsaW5rIGZvciBzZW5kaW5nIG9mIG1lc3NhZ2VzIGFmdGVyIHRoZSBiZWFyZXIgCisgKiBoYXMgYmVlbiBkZWJsb2NrZWQgYnkgJ2NvbnRpbnVlKCknLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgCisgKiB3aGVuIHNvbWVib2R5IHRyaWVzIHRvIHNlbmQgYSBtZXNzYWdlIHZpYSB0aGlzIGxpbmsgd2hpbGUgCisgKiB0aGUgYmVhcmVyIGlzIGNvbmdlc3RlZC4gJ3RpcGNfbmV0X2xvY2snIGlzIGluIHJlYWRfbG9jayBoZXJlCisgKiBiZWFyZXIubG9jayBpcyBidXN5CisgKi8KKworc3RhdGljIHZvaWQgdGlwY19iZWFyZXJfc2NoZWR1bGVfdW5sb2NrZWQoc3RydWN0IGJlYXJlciAqYl9wdHIsIHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlsaXN0X21vdmVfdGFpbCgmbF9wdHItPmxpbmtfbGlzdCwgJmJfcHRyLT5jb25nX2xpbmtzKTsKK30KKworLyoKKyAqIFNjaGVkdWxlIGxpbmsgZm9yIHNlbmRpbmcgb2YgbWVzc2FnZXMgYWZ0ZXIgdGhlIGJlYXJlciAKKyAqIGhhcyBiZWVuIGRlYmxvY2tlZCBieSAnY29udGludWUoKScuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCAKKyAqIHdoZW4gc29tZWJvZHkgdHJpZXMgdG8gc2VuZCBhIG1lc3NhZ2UgdmlhIHRoaXMgbGluayB3aGlsZSAKKyAqIHRoZSBiZWFyZXIgaXMgY29uZ2VzdGVkLiAndGlwY19uZXRfbG9jaycgaXMgaW4gcmVhZF9sb2NrIGhlcmUsCisgKiBiZWFyZXIubG9jayBpcyBmcmVlCisgKi8KKwordm9pZCB0aXBjX2JlYXJlcl9zY2hlZHVsZShzdHJ1Y3QgYmVhcmVyICpiX3B0ciwgc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXNwaW5fbG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7CisJdGlwY19iZWFyZXJfc2NoZWR1bGVfdW5sb2NrZWQoYl9wdHIsIGxfcHRyKTsKKwlzcGluX3VubG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7Cit9CisKKworLyoKKyAqIHRpcGNfYmVhcmVyX3Jlc29sdmVfY29uZ2VzdGlvbigpOiBDaGVjayBpZiB0aGVyZSBpcyBiZWFyZXIgY29uZ2VzdGlvbiwKKyAqIGFuZCBpZiB0aGVyZSBpcywgdHJ5IHRvIHJlc29sdmUgaXQgYmVmb3JlIHJldHVybmluZy4KKyAqICd0aXBjX25ldF9sb2NrJyBpcyByZWFkX2xvY2tlZCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCisgKi8KK2ludCB0aXBjX2JlYXJlcl9yZXNvbHZlX2Nvbmdlc3Rpb24oc3RydWN0IGJlYXJlciAqYl9wdHIsIHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlpbnQgcmVzID0gMTsKKworCWlmIChsaXN0X2VtcHR5KCZiX3B0ci0+Y29uZ19saW5rcykpCisJCXJldHVybiAxOworCXNwaW5fbG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7CisJaWYgKCFiZWFyZXJfcHVzaChiX3B0cikpIHsKKwkJdGlwY19iZWFyZXJfc2NoZWR1bGVfdW5sb2NrZWQoYl9wdHIsIGxfcHRyKTsKKwkJcmVzID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmJfcHRyLT5wdWJsLmxvY2spOworCXJldHVybiByZXM7Cit9CisKKworLyoqCisgKiB0aXBjX2VuYWJsZV9iZWFyZXIgLSBlbmFibGUgYmVhcmVyIHdpdGggdGhlIGdpdmVuIG5hbWUKKyAqLyAgICAgICAgICAgICAgCisKK2ludCB0aXBjX2VuYWJsZV9iZWFyZXIoY29uc3QgY2hhciAqbmFtZSwgdTMyIGJjYXN0X3Njb3BlLCB1MzIgcHJpb3JpdHkpCit7CisJc3RydWN0IGJlYXJlciAqYl9wdHI7CisJc3RydWN0IG1lZGlhICptX3B0cjsKKwlzdHJ1Y3QgYmVhcmVyX25hbWUgYl9uYW1lOworCWNoYXIgYWRkcl9zdHJpbmdbMTZdOworCXUzMiBiZWFyZXJfaWQ7CisJdTMyIHdpdGhfdGhpc19wcmlvOworCXUzMiBpOworCWludCByZXMgPSAtRUlOVkFMOworCisJaWYgKHRpcGNfbW9kZSAhPSBUSVBDX05FVF9NT0RFKQorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCisJaWYgKCFiZWFyZXJfbmFtZV92YWxpZGF0ZShuYW1lLCAmYl9uYW1lKSB8fAorCSAgICAhdGlwY19hZGRyX2RvbWFpbl92YWxpZChiY2FzdF9zY29wZSkgfHwKKwkgICAgIWluX3Njb3BlKGJjYXN0X3Njb3BlLCB0aXBjX293bl9hZGRyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKHByaW9yaXR5IDwgVElQQ19NSU5fTElOS19QUkkgfHwKKwkgICAgIHByaW9yaXR5ID4gVElQQ19NQVhfTElOS19QUkkpICYmCisJICAgIChwcmlvcml0eSAhPSBUSVBDX01FRElBX0xJTktfUFJJKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3cml0ZV9sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKKwlpZiAoIXRpcGNfYmVhcmVycykKKwkJZ290byBmYWlsZWQ7CisKKwltX3B0ciA9IG1lZGlhX2ZpbmQoYl9uYW1lLm1lZGlhX25hbWUpOworCWlmICghbV9wdHIpIHsKKwkJd2FybigiTm8gbWVkaWEgPCVzPlxuIiwgYl9uYW1lLm1lZGlhX25hbWUpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlpZiAocHJpb3JpdHkgPT0gVElQQ19NRURJQV9MSU5LX1BSSSkKKwkJcHJpb3JpdHkgPSBtX3B0ci0+cHJpb3JpdHk7CisKK3Jlc3RhcnQ6CisJYmVhcmVyX2lkID0gTUFYX0JFQVJFUlM7CisJd2l0aF90aGlzX3ByaW8gPSAxOworCWZvciAoaSA9IE1BWF9CRUFSRVJTOyBpLS0gIT0gMDsgKSB7CisJCWlmICghdGlwY19iZWFyZXJzW2ldLmFjdGl2ZSkgeworCQkJYmVhcmVyX2lkID0gaTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKG5hbWUsIHRpcGNfYmVhcmVyc1tpXS5wdWJsLm5hbWUpKSB7CisJCQl3YXJuKCJCZWFyZXIgPCVzPiBhbHJlYWR5IGVuYWJsZWRcbiIsIG5hbWUpOworCQkJZ290byBmYWlsZWQ7CisJCX0KKwkJaWYgKCh0aXBjX2JlYXJlcnNbaV0ucHJpb3JpdHkgPT0gcHJpb3JpdHkpICYmCisJCSAgICAoKyt3aXRoX3RoaXNfcHJpbyA+IDIpKSB7CisJCQlpZiAocHJpb3JpdHktLSA9PSAwKSB7CisJCQkJd2FybigiVGhpcmQgYmVhcmVyIDwlcz4gd2l0aCBwcmlvcml0eSAldSwgdW5hYmxlIHRvIGxvd2VyIHRvICV1XG4iLAorCQkJCSAgICAgbmFtZSwgcHJpb3JpdHkgKyAxLCBwcmlvcml0eSk7CisJCQkJZ290byBmYWlsZWQ7CisJCQl9CisJCQl3YXJuKCJUaGlyZCBiZWFyZXIgPCVzPiB3aXRoIHByaW9yaXR5ICV1LCBsb3dlcmluZyB0byAldVxuIiwKKwkJCSAgICAgbmFtZSwgcHJpb3JpdHkgKyAxLCBwcmlvcml0eSk7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKwl9CisJaWYgKGJlYXJlcl9pZCA+PSBNQVhfQkVBUkVSUykgeworCQl3YXJuKCJBdHRlbXB0IHRvIGVuYWJsZSBtb3JlIHRoYW4gJWQgYmVhcmVyc1xuIiwgTUFYX0JFQVJFUlMpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwliX3B0ciA9ICZ0aXBjX2JlYXJlcnNbYmVhcmVyX2lkXTsKKwltZW1zZXQoYl9wdHIsIDAsIHNpemVvZihzdHJ1Y3QgYmVhcmVyKSk7CisKKwlzdHJjcHkoYl9wdHItPnB1YmwubmFtZSwgbmFtZSk7CisJcmVzID0gbV9wdHItPmVuYWJsZV9iZWFyZXIoJmJfcHRyLT5wdWJsKTsKKwlpZiAocmVzKSB7CisJCXdhcm4oIkZhaWxlZCB0byBlbmFibGUgYmVhcmVyIDwlcz5cbiIsIG5hbWUpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwliX3B0ci0+aWRlbnRpdHkgPSBiZWFyZXJfaWQ7CisJYl9wdHItPm1lZGlhID0gbV9wdHI7CisJYl9wdHItPm5ldF9wbGFuZSA9IGJlYXJlcl9pZCArICdBJzsKKwliX3B0ci0+YWN0aXZlID0gMTsKKwliX3B0ci0+ZGV0ZWN0X3Njb3BlID0gYmNhc3Rfc2NvcGU7CisJYl9wdHItPnByaW9yaXR5ID0gcHJpb3JpdHk7CisJSU5JVF9MSVNUX0hFQUQoJmJfcHRyLT5jb25nX2xpbmtzKTsKKwlJTklUX0xJU1RfSEVBRCgmYl9wdHItPmxpbmtzKTsKKwlpZiAobV9wdHItPmJjYXN0KSB7CisJCWJfcHRyLT5saW5rX3JlcSA9IHRpcGNfZGlzY19pbml0X2xpbmtfcmVxKGJfcHRyLCAmbV9wdHItPmJjYXN0X2FkZHIsCisJCQkJCQkJICBiY2FzdF9zY29wZSwgMik7CisJfQorCWJfcHRyLT5wdWJsLmxvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CisJd3JpdGVfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKKwlpbmZvKCJFbmFibGVkIGJlYXJlciA8JXM+LCBkaXNjb3ZlcnkgZG9tYWluICVzLCBwcmlvcml0eSAldVxuIiwKKwkgICAgIG5hbWUsIGFkZHJfc3RyaW5nX2ZpbGwoYWRkcl9zdHJpbmcsIGJjYXN0X3Njb3BlKSwgcHJpb3JpdHkpOworCXJldHVybiAwOworZmFpbGVkOgorCXdyaXRlX3VubG9ja19iaCgmdGlwY19uZXRfbG9jayk7CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiB0aXBjX2Jsb2NrX2JlYXJlcigpOiBCbG9jayB0aGUgYmVhcmVyIHdpdGggdGhlIGdpdmVuIG5hbWUsCisgKiAgICAgICAgICAgICAgICAgICAgICBhbmQgcmVzZXQgYWxsIGl0cyBsaW5rcworICovCisKK2ludCB0aXBjX2Jsb2NrX2JlYXJlcihjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBiZWFyZXIgKmJfcHRyID0gMDsKKwlzdHJ1Y3QgbGluayAqbF9wdHI7CisJc3RydWN0IGxpbmsgKnRlbXBfbF9wdHI7CisKKwlpZiAodGlwY19tb2RlICE9IFRJUENfTkVUX01PREUpCisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisKKwlyZWFkX2xvY2tfYmgoJnRpcGNfbmV0X2xvY2spOworCWJfcHRyID0gYmVhcmVyX2ZpbmQobmFtZSk7CisJaWYgKCFiX3B0cikgeworCQl3YXJuKCJBdHRlbXB0IHRvIGJsb2NrIHVua25vd24gYmVhcmVyIDwlcz5cbiIsIG5hbWUpOworCQlyZWFkX3VubG9ja19iaCgmdGlwY19uZXRfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fbG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7CisJYl9wdHItPnB1YmwuYmxvY2tlZCA9IDE7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxfcHRyLCB0ZW1wX2xfcHRyLCAmYl9wdHItPmxpbmtzLCBsaW5rX2xpc3QpIHsKKwkJc3RydWN0IG5vZGUgKm5fcHRyID0gbF9wdHItPm93bmVyOworCisJCXNwaW5fbG9ja19iaCgmbl9wdHItPmxvY2spOworCQl0aXBjX2xpbmtfcmVzZXQobF9wdHIpOworCQlzcGluX3VubG9ja19iaCgmbl9wdHItPmxvY2spOworCX0KKwlzcGluX3VubG9ja19iaCgmYl9wdHItPnB1YmwubG9jayk7CisJcmVhZF91bmxvY2tfYmgoJnRpcGNfbmV0X2xvY2spOworCWluZm8oIkJsb2NrZWQgYmVhcmVyIDwlcz5cbiIsIG5hbWUpOworCXJldHVybiBUSVBDX09LOworfQorCisvKioKKyAqIGJlYXJlcl9kaXNhYmxlIC0KKyAqIAorICogTm90ZTogVGhpcyByb3V0aW5lIGFzc3VtZXMgY2FsbGVyIGhvbGRzIHRpcGNfbmV0X2xvY2suCisgKi8KKworc3RhdGljIGludCBiZWFyZXJfZGlzYWJsZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBiZWFyZXIgKmJfcHRyOworCXN0cnVjdCBsaW5rICpsX3B0cjsKKwlzdHJ1Y3QgbGluayAqdGVtcF9sX3B0cjsKKworCWlmICh0aXBjX21vZGUgIT0gVElQQ19ORVRfTU9ERSkKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKworCWJfcHRyID0gYmVhcmVyX2ZpbmQobmFtZSk7CisJaWYgKCFiX3B0cikgeworCQl3YXJuKCJBdHRlbXB0IHRvIGRpc2FibGUgdW5rbm93biBiZWFyZXIgPCVzPlxuIiwgbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXRpcGNfZGlzY19zdG9wX2xpbmtfcmVxKGJfcHRyLT5saW5rX3JlcSk7CisJc3Bpbl9sb2NrX2JoKCZiX3B0ci0+cHVibC5sb2NrKTsKKwliX3B0ci0+bGlua19yZXEgPSBOVUxMOworCWJfcHRyLT5wdWJsLmJsb2NrZWQgPSAxOworCWlmIChiX3B0ci0+bWVkaWEtPmRpc2FibGVfYmVhcmVyKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZiX3B0ci0+cHVibC5sb2NrKTsKKwkJd3JpdGVfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKKwkJYl9wdHItPm1lZGlhLT5kaXNhYmxlX2JlYXJlcigmYl9wdHItPnB1YmwpOworCQl3cml0ZV9sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKKwkJc3Bpbl9sb2NrX2JoKCZiX3B0ci0+cHVibC5sb2NrKTsKKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxfcHRyLCB0ZW1wX2xfcHRyLCAmYl9wdHItPmxpbmtzLCBsaW5rX2xpc3QpIHsKKwkJdGlwY19saW5rX2RlbGV0ZShsX3B0cik7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZiX3B0ci0+cHVibC5sb2NrKTsKKwlpbmZvKCJEaXNhYmxlZCBiZWFyZXIgPCVzPlxuIiwgbmFtZSk7CisJbWVtc2V0KGJfcHRyLCAwLCBzaXplb2Yoc3RydWN0IGJlYXJlcikpOworCXJldHVybiBUSVBDX09LOworfQorCitpbnQgdGlwY19kaXNhYmxlX2JlYXJlcihjb25zdCBjaGFyICpuYW1lKQoreworCWludCByZXM7CisKKwl3cml0ZV9sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKKwlyZXMgPSBiZWFyZXJfZGlzYWJsZShuYW1lKTsKKwl3cml0ZV91bmxvY2tfYmgoJnRpcGNfbmV0X2xvY2spOworCXJldHVybiByZXM7Cit9CisKKworCitpbnQgdGlwY19iZWFyZXJfaW5pdCh2b2lkKQoreworCWludCByZXM7CisKKwl3cml0ZV9sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKKwl0aXBjX2JlYXJlcnMgPSBrbWFsbG9jKE1BWF9CRUFSRVJTICogc2l6ZW9mKHN0cnVjdCBiZWFyZXIpLCBHRlBfQVRPTUlDKTsKKwltZWRpYV9saXN0ID0ga21hbGxvYyhNQVhfTUVESUEgKiBzaXplb2Yoc3RydWN0IG1lZGlhKSwgR0ZQX0FUT01JQyk7CisJaWYgKHRpcGNfYmVhcmVycyAmJiBtZWRpYV9saXN0KSB7CisJCW1lbXNldCh0aXBjX2JlYXJlcnMsIDAsIE1BWF9CRUFSRVJTICogc2l6ZW9mKHN0cnVjdCBiZWFyZXIpKTsKKwkJbWVtc2V0KG1lZGlhX2xpc3QsIDAsIE1BWF9NRURJQSAqIHNpemVvZihzdHJ1Y3QgbWVkaWEpKTsKKwkJcmVzID0gVElQQ19PSzsKKwl9IGVsc2UgeworCQlrZnJlZSh0aXBjX2JlYXJlcnMpOworCQlrZnJlZShtZWRpYV9saXN0KTsKKwkJdGlwY19iZWFyZXJzID0gMDsKKwkJbWVkaWFfbGlzdCA9IDA7CisJCXJlcyA9IC1FTk9NRU07CisJfQorCXdyaXRlX3VubG9ja19iaCgmdGlwY19uZXRfbG9jayk7CisJcmV0dXJuIHJlczsKK30KKwordm9pZCB0aXBjX2JlYXJlcl9zdG9wKHZvaWQpCit7CisJdTMyIGk7CisKKwlpZiAoIXRpcGNfYmVhcmVycykKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9CRUFSRVJTOyBpKyspIHsKKwkJaWYgKHRpcGNfYmVhcmVyc1tpXS5hY3RpdmUpCisJCQl0aXBjX2JlYXJlcnNbaV0ucHVibC5ibG9ja2VkID0gMTsKKwl9CisJZm9yIChpID0gMDsgaSA8IE1BWF9CRUFSRVJTOyBpKyspIHsKKwkJaWYgKHRpcGNfYmVhcmVyc1tpXS5hY3RpdmUpCisJCQliZWFyZXJfZGlzYWJsZSh0aXBjX2JlYXJlcnNbaV0ucHVibC5uYW1lKTsKKwl9CisJa2ZyZWUodGlwY19iZWFyZXJzKTsKKwlrZnJlZShtZWRpYV9saXN0KTsKKwl0aXBjX2JlYXJlcnMgPSAwOworCW1lZGlhX2xpc3QgPSAwOworCW1lZGlhX2NvdW50ID0gMDsKK30KKworCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iZWFyZXIuaCBiL25ldC90aXBjL2JlYXJlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZTdjMWMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9iZWFyZXIuaApAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIG5ldC90aXBjL2JlYXJlci5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgYmVhcmVyIGNvZGUKKyAqIAorICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfVElQQ19CRUFSRVJfSAorI2RlZmluZSBfVElQQ19CRUFSRVJfSAorCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImJjYXN0LmgiCisKKyNkZWZpbmUgTUFYX0JFQVJFUlMgOAorI2RlZmluZSBNQVhfTUVESUEgNAorCisKKy8qKgorICogc3RydWN0IG1lZGlhIC0gVElQQyBtZWRpYSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gaW50ZXJuYWwgdXNlcnMKKyAqIEBzZW5kX21zZzogcm91dGluZSB3aGljaCBoYW5kbGVzIGJ1ZmZlciB0cmFuc21pc3Npb24KKyAqIEBlbmFibGVfYmVhcmVyOiByb3V0aW5lIHdoaWNoIGVuYWJsZXMgYSBiZWFyZXIKKyAqIEBkaXNhYmxlX2JlYXJlcjogcm91dGluZSB3aGljaCBkaXNhYmxlcyBhIGJlYXJlcgorICogQGFkZHIyc3RyOiByb3V0aW5lIHdoaWNoIGNvbnZlcnRzIGJlYXJlcidzIGFkZHJlc3MgdG8gc3RyaW5nIGZvcm0KKyAqIEBiY2FzdF9hZGRyOiBtZWRpYSBhZGRyZXNzIHVzZWQgaW4gYnJvYWRjYXN0aW5nCisgKiBAYmNhc3Q6IG5vbi16ZXJvIGlmIG1lZGlhIHN1cHBvcnRzIGJyb2FkY2FzdGluZyBbY3VycmVudGx5IG1hbmRhdG9yeV0KKyAqIEBwcmlvcml0eTogZGVmYXVsdCBsaW5rIChhbmQgYmVhcmVyKSBwcmlvcml0eQorICogQHRvbGVyYW5jZTogZGVmYXVsdCB0aW1lIChpbiBtcykgYmVmb3JlIGRlY2xhcmluZyBsaW5rIGZhaWx1cmUKKyAqIEB3aW5kb3c6IGRlZmF1bHQgd2luZG93IChpbiBwYWNrZXRzKSBiZWZvcmUgZGVjbGFyaW5nIGxpbmsgY29uZ2VzdGlvbgorICogQHR5cGVfaWQ6IFRJUEMgbWVkaWEgaWRlbnRpZmllciBbZGVmaW5lZCBpbiB0aXBjX2JlYXJlci5oXQorICogQG5hbWU6IG1lZGlhIG5hbWUKKyAqLworIAorc3RydWN0IG1lZGlhIHsKKwlpbnQgKCpzZW5kX21zZykoc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgCisJCQlzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyLAorCQkJc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqZGVzdCk7CisJaW50ICgqZW5hYmxlX2JlYXJlcikoc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0cik7CisJdm9pZCAoKmRpc2FibGVfYmVhcmVyKShzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyKTsKKwljaGFyICooKmFkZHIyc3RyKShzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphLCAKKwkJCSAgY2hhciAqc3RyX2J1ZiwgaW50IHN0cl9zaXplKTsKKwlzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIGJjYXN0X2FkZHI7CisJaW50IGJjYXN0OworCXUzMiBwcmlvcml0eTsKKwl1MzIgdG9sZXJhbmNlOworCXUzMiB3aW5kb3c7CisJdTMyIHR5cGVfaWQ7CisJY2hhciBuYW1lW1RJUENfTUFYX01FRElBX05BTUVdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgYmVhcmVyIC0gVElQQyBiZWFyZXIgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGludGVybmFsIHVzZXJzCisgKiBAcHVibDogYmVhcmVyIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBwcml2aWxlZ2VkIHVzZXJzCisgKiBAbWVkaWE6IHB0ciB0byBtZWRpYSBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGJlYXJlcgorICogQHByaW9yaXR5OiBkZWZhdWx0IGxpbmsgcHJpb3JpdHkgZm9yIGJlYXJlcgorICogQGRldGVjdF9zY29wZTogbmV0d29yayBhZGRyZXNzIG1hc2sgdXNlZCBkdXJpbmcgYXV0b21hdGljIGxpbmsgY3JlYXRpb24KKyAqIEBpZGVudGl0eTogYXJyYXkgaW5kZXggb2YgdGhpcyBiZWFyZXIgd2l0aGluIFRJUEMgYmVhcmVyIGFycmF5CisgKiBAbGlua19yZXE6IHB0ciB0byAob3B0aW9uYWwpIHN0cnVjdHVyZSBtYWtpbmcgcGVyaW9kaWMgbGluayBzZXR1cCByZXF1ZXN0cworICogQGxpbmtzOiBsaXN0IG9mIG5vbi1jb25nZXN0ZWQgbGlua3MgYXNzb2NpYXRlZCB3aXRoIGJlYXJlcgorICogQGNvbmdfbGlua3M6IGxpc3Qgb2YgY29uZ2VzdGVkIGxpbmtzIGFzc29jaWF0ZWQgd2l0aCBiZWFyZXIKKyAqIEBjb250aW51ZV9jb3VudDogIyBvZiB0aW1lcyBiZWFyZXIgaGFzIHJlc3VtZWQgYWZ0ZXIgY29uZ2VzdGlvbiBvciBibG9ja2luZworICogQGFjdGl2ZTogbm9uLXplcm8gaWYgYmVhcmVyIHN0cnVjdHVyZSBpcyByZXByZXNlbnRzIGEgYmVhcmVyCisgKiBAbmV0X3BsYW5lOiBuZXR3b3JrIHBsYW5lICgnQScgdGhyb3VnaCAnSCcpIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggYmVhcmVyCisgKiBAbm9kZXM6IGluZGljYXRlcyB3aGljaCBub2RlcyBpbiBjbHVzdGVyIGNhbiBiZSByZWFjaGVkIHRocm91Z2ggYmVhcmVyCisgKi8KKyAKK3N0cnVjdCBiZWFyZXIgeworCXN0cnVjdCB0aXBjX2JlYXJlciBwdWJsOworCXN0cnVjdCBtZWRpYSAqbWVkaWE7CisJdTMyIHByaW9yaXR5OworCXUzMiBkZXRlY3Rfc2NvcGU7CisJdTMyIGlkZW50aXR5OworCXN0cnVjdCBsaW5rX3JlcSAqbGlua19yZXE7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNvbmdfbGlua3M7CisJdTMyIGNvbnRpbnVlX2NvdW50OworCWludCBhY3RpdmU7CisJY2hhciBuZXRfcGxhbmU7CisJc3RydWN0IG5vZGVfbWFwIG5vZGVzOworfTsKKworc3RydWN0IGJlYXJlcl9uYW1lIHsKKwljaGFyIG1lZGlhX25hbWVbVElQQ19NQVhfTUVESUFfTkFNRV07CisJY2hhciBpZl9uYW1lW1RJUENfTUFYX0lGX05BTUVdOworfTsKKworc3RydWN0IGxpbms7CisKK2V4dGVybiBzdHJ1Y3QgYmVhcmVyICp0aXBjX2JlYXJlcnM7CisKK3ZvaWQgdGlwY19tZWRpYV9hZGRyX3ByaW50ZihzdHJ1Y3QgcHJpbnRfYnVmICpwYiwgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYSk7CitzdHJ1Y3Qgc2tfYnVmZiAqdGlwY19tZWRpYV9nZXRfbmFtZXModm9pZCk7CisKK3N0cnVjdCBza19idWZmICp0aXBjX2JlYXJlcl9nZXRfbmFtZXModm9pZCk7Cit2b2lkIHRpcGNfYmVhcmVyX2FkZF9kZXN0KHN0cnVjdCBiZWFyZXIgKmJfcHRyLCB1MzIgZGVzdCk7Cit2b2lkIHRpcGNfYmVhcmVyX3JlbW92ZV9kZXN0KHN0cnVjdCBiZWFyZXIgKmJfcHRyLCB1MzIgZGVzdCk7Cit2b2lkIHRpcGNfYmVhcmVyX3NjaGVkdWxlKHN0cnVjdCBiZWFyZXIgKmJfcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpOworc3RydWN0IGJlYXJlciAqdGlwY19iZWFyZXJfZmluZF9pbnRlcmZhY2UoY29uc3QgY2hhciAqaWZfbmFtZSk7CitpbnQgdGlwY19iZWFyZXJfcmVzb2x2ZV9jb25nZXN0aW9uKHN0cnVjdCBiZWFyZXIgKmJfcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpOworaW50IHRpcGNfYmVhcmVyX2luaXQodm9pZCk7Cit2b2lkIHRpcGNfYmVhcmVyX3N0b3Aodm9pZCk7Cit2b2lkIHRpcGNfYmVhcmVyX2xvY2tfcHVzaChzdHJ1Y3QgYmVhcmVyICpiX3B0cik7CisKKworLyoqCisgKiB0aXBjX2JlYXJlcl9zZW5kLSBzZW5kcyBidWZmZXIgdG8gZGVzdGluYXRpb24gb3ZlciBiZWFyZXIgCisgKiAKKyAqIFJldHVybnMgdHJ1ZSAoMSkgaWYgc3VjY2Vzc2Z1bCwgb3IgZmFsc2UgKDApIGlmIHVuYWJsZSB0byBzZW5kCisgKiAKKyAqIElNUE9SVEFOVDoKKyAqIFRoZSBtZWRpYSBzZW5kIHJvdXRpbmUgbXVzdCBub3QgYWx0ZXIgdGhlIGJ1ZmZlciBiZWluZyBwYXNzZWQgaW4KKyAqIGFzIGl0IG1heSBiZSBuZWVkZWQgZm9yIGxhdGVyIHJldHJhbnNtaXNzaW9uIQorICogCisgKiBJZiB0aGUgbWVkaWEgc2VuZCByb3V0aW5lIHJldHVybnMgYSBub24temVybyB2YWx1ZSAoaW5kaWNhdGluZyB0aGF0IAorICogaXQgd2FzIHVuYWJsZSB0byBzZW5kIHRoZSBidWZmZXIpLCBpdCBtdXN0OgorICogICAxKSBtYXJrIHRoZSBiZWFyZXIgYXMgYmxvY2tlZCwKKyAqICAgMikgY2FsbCB0aXBjX2NvbnRpbnVlKCkgb25jZSB0aGUgYmVhcmVyIGlzIGFibGUgdG8gc2VuZCBhZ2Fpbi4KKyAqIE1lZGlhIHR5cGVzIHRoYXQgYXJlIHVuYWJsZSB0byBtZWV0IHRoZXNlIHR3byBjcml0ZXJhIG11c3QgZW5zdXJlIHRoZWlyCisgKiBzZW5kIHJvdXRpbmUgYWx3YXlzIHJldHVybnMgc3VjY2VzcyAtLSBldmVuIGlmIHRoZSBidWZmZXIgd2FzIG5vdCBzZW50IC0tCisgKiBhbmQgbGV0IFRJUEMncyBsaW5rIGNvZGUgZGVhbCB3aXRoIHRoZSB1bmRlbGl2ZXJlZCBtZXNzYWdlLiAKKyAqLworCitzdGF0aWMgaW5saW5lIGludCB0aXBjX2JlYXJlcl9zZW5kKHN0cnVjdCBiZWFyZXIgKmJfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLAorCQkJCSAgIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmRlc3QpCit7CisJcmV0dXJuICFiX3B0ci0+bWVkaWEtPnNlbmRfbXNnKGJ1ZiwgJmJfcHRyLT5wdWJsLCBkZXN0KTsKK30KKworLyoqCisgKiB0aXBjX2JlYXJlcl9jb25nZXN0ZWQgLSBkZXRlcm1pbmVzIGlmIGJlYXJlciBpcyBjdXJyZW50bHkgY29uZ2VzdGVkCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgdGlwY19iZWFyZXJfY29uZ2VzdGVkKHN0cnVjdCBiZWFyZXIgKmJfcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJaWYgKHVubGlrZWx5KGJfcHRyLT5wdWJsLmJsb2NrZWQpKQorCQlyZXR1cm4gMTsKKwlpZiAobGlrZWx5KGxpc3RfZW1wdHkoJmJfcHRyLT5jb25nX2xpbmtzKSkpCisJCXJldHVybiAwOworCXJldHVybiAhdGlwY19iZWFyZXJfcmVzb2x2ZV9jb25nZXN0aW9uKGJfcHRyLCBsX3B0cik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvY2x1c3Rlci5jIGIvbmV0L3RpcGMvY2x1c3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOTc0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9jbHVzdGVyLmMKQEAgLTAsMCArMSw1NzYgQEAKKy8qCisgKiBuZXQvdGlwYy9jbHVzdGVyLmM6IFRJUEMgY2x1c3RlciBtYW5hZ2VtZW50IHJvdXRpbmVzCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAiY2x1c3Rlci5oIgorI2luY2x1ZGUgImFkZHIuaCIKKyNpbmNsdWRlICJub2RlX3N1YnNjci5oIgorI2luY2x1ZGUgImxpbmsuaCIKKyNpbmNsdWRlICJub2RlLmgiCisjaW5jbHVkZSAibmV0LmgiCisjaW5jbHVkZSAibXNnLmgiCisjaW5jbHVkZSAiYmVhcmVyLmgiCisKK3ZvaWQgdGlwY19jbHRyX211bHRpY2FzdChzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHN0cnVjdCBza19idWZmICpidWYsIAorCQkJIHUzMiBsb3dlciwgdTMyIHVwcGVyKTsKK3N0cnVjdCBza19idWZmICp0aXBjX2NsdHJfcHJlcGFyZV9yb3V0aW5nX21zZyh1MzIgZGF0YV9zaXplLCB1MzIgZGVzdCk7CisKK3N0cnVjdCBub2RlICoqdGlwY19sb2NhbF9ub2RlcyA9IDA7CitzdHJ1Y3Qgbm9kZV9tYXAgdGlwY19jbHRyX2JjYXN0X25vZGVzID0gezAsezAsfX07Cit1MzIgdGlwY19oaWdoZXN0X2FsbG93ZWRfc2xhdmUgPSAwOworCitzdHJ1Y3QgY2x1c3RlciAqdGlwY19jbHRyX2NyZWF0ZSh1MzIgYWRkcikKK3sKKwlzdHJ1Y3QgX3pvbmUgKnpfcHRyOworCXN0cnVjdCBjbHVzdGVyICpjX3B0cjsKKwlpbnQgbWF4X25vZGVzOyAKKwlpbnQgYWxsb2M7CisKKwljX3B0ciA9IChzdHJ1Y3QgY2x1c3RlciAqKWttYWxsb2Moc2l6ZW9mKCpjX3B0ciksIEdGUF9BVE9NSUMpOworCWlmIChjX3B0ciA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwltZW1zZXQoY19wdHIsIDAsIHNpemVvZigqY19wdHIpKTsKKworCWNfcHRyLT5hZGRyID0gdGlwY19hZGRyKHRpcGNfem9uZShhZGRyKSwgdGlwY19jbHVzdGVyKGFkZHIpLCAwKTsKKwlpZiAoaW5fb3duX2NsdXN0ZXIoYWRkcikpCisJCW1heF9ub2RlcyA9IExPV0VTVF9TTEFWRSArIHRpcGNfbWF4X3NsYXZlczsKKwllbHNlCisJCW1heF9ub2RlcyA9IHRpcGNfbWF4X25vZGVzICsgMTsKKwlhbGxvYyA9IHNpemVvZih2b2lkICopICogKG1heF9ub2RlcyArIDEpOworCWNfcHRyLT5ub2RlcyA9IChzdHJ1Y3Qgbm9kZSAqKilrbWFsbG9jKGFsbG9jLCBHRlBfQVRPTUlDKTsKKwlpZiAoY19wdHItPm5vZGVzID09IE5VTEwpIHsKKwkJa2ZyZWUoY19wdHIpOworCQlyZXR1cm4gMDsKKwl9CisJbWVtc2V0KGNfcHRyLT5ub2RlcywgMCwgYWxsb2MpOyAgCisJaWYgKGluX293bl9jbHVzdGVyKGFkZHIpKQorCQl0aXBjX2xvY2FsX25vZGVzID0gY19wdHItPm5vZGVzOworCWNfcHRyLT5oaWdoZXN0X3NsYXZlID0gTE9XRVNUX1NMQVZFIC0gMTsKKwljX3B0ci0+aGlnaGVzdF9ub2RlID0gMDsKKwkKKwl6X3B0ciA9IHRpcGNfem9uZV9maW5kKHRpcGNfem9uZShhZGRyKSk7CisJaWYgKHpfcHRyID09IE5VTEwpIHsKKwkJel9wdHIgPSB0aXBjX3pvbmVfY3JlYXRlKGFkZHIpOworCX0KKwlpZiAoel9wdHIgIT0gTlVMTCkgeworCQl0aXBjX3pvbmVfYXR0YWNoX2NsdXN0ZXIoel9wdHIsIGNfcHRyKTsKKwkJY19wdHItPm93bmVyID0gel9wdHI7CisJfQorCWVsc2UgeworCQlrZnJlZShjX3B0cik7CisJCWNfcHRyID0gMDsKKwl9CisKKwlyZXR1cm4gY19wdHI7Cit9CisKK3ZvaWQgdGlwY19jbHRyX2RlbGV0ZShzdHJ1Y3QgY2x1c3RlciAqY19wdHIpCit7CisJdTMyIG5fbnVtOworCisJaWYgKCFjX3B0cikKKwkJcmV0dXJuOworCWZvciAobl9udW0gPSAxOyBuX251bSA8PSBjX3B0ci0+aGlnaGVzdF9ub2RlOyBuX251bSsrKSB7CisJCXRpcGNfbm9kZV9kZWxldGUoY19wdHItPm5vZGVzW25fbnVtXSk7CisJfQorCWZvciAobl9udW0gPSBMT1dFU1RfU0xBVkU7IG5fbnVtIDw9IGNfcHRyLT5oaWdoZXN0X3NsYXZlOyBuX251bSsrKSB7CisJCXRpcGNfbm9kZV9kZWxldGUoY19wdHItPm5vZGVzW25fbnVtXSk7CisJfQorCWtmcmVlKGNfcHRyLT5ub2Rlcyk7CisJa2ZyZWUoY19wdHIpOworfQorCit1MzIgdGlwY19jbHRyX25leHRfbm9kZShzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHUzMiBhZGRyKQoreworCXN0cnVjdCBub2RlICpuX3B0cjsKKwl1MzIgbl9udW0gPSB0aXBjX25vZGUoYWRkcikgKyAxOworCisJaWYgKCFjX3B0cikKKwkJcmV0dXJuIGFkZHI7CisJZm9yICg7IG5fbnVtIDw9IGNfcHRyLT5oaWdoZXN0X25vZGU7IG5fbnVtKyspIHsKKwkJbl9wdHIgPSBjX3B0ci0+bm9kZXNbbl9udW1dOworCQlpZiAobl9wdHIgJiYgdGlwY19ub2RlX2hhc19hY3RpdmVfbGlua3Mobl9wdHIpKQorCQkJcmV0dXJuIG5fcHRyLT5hZGRyOworCX0KKwlmb3IgKG5fbnVtID0gMTsgbl9udW0gPCB0aXBjX25vZGUoYWRkcik7IG5fbnVtKyspIHsKKwkJbl9wdHIgPSBjX3B0ci0+bm9kZXNbbl9udW1dOworCQlpZiAobl9wdHIgJiYgdGlwY19ub2RlX2hhc19hY3RpdmVfbGlua3Mobl9wdHIpKQorCQkJcmV0dXJuIG5fcHRyLT5hZGRyOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCB0aXBjX2NsdHJfYXR0YWNoX25vZGUoc3RydWN0IGNsdXN0ZXIgKmNfcHRyLCBzdHJ1Y3Qgbm9kZSAqbl9wdHIpCit7CisJdTMyIG5fbnVtID0gdGlwY19ub2RlKG5fcHRyLT5hZGRyKTsKKwl1MzIgbWF4X25fbnVtID0gdGlwY19tYXhfbm9kZXM7CisKKwlpZiAoaW5fb3duX2NsdXN0ZXIobl9wdHItPmFkZHIpKQorCQltYXhfbl9udW0gPSB0aXBjX2hpZ2hlc3RfYWxsb3dlZF9zbGF2ZTsKKwlhc3NlcnQobl9udW0gPiAwKTsKKwlhc3NlcnQobl9udW0gPD0gbWF4X25fbnVtKTsKKwlhc3NlcnQoY19wdHItPm5vZGVzW25fbnVtXSA9PSAwKTsKKwljX3B0ci0+bm9kZXNbbl9udW1dID0gbl9wdHI7CisJaWYgKG5fbnVtID4gY19wdHItPmhpZ2hlc3Rfbm9kZSkKKwkJY19wdHItPmhpZ2hlc3Rfbm9kZSA9IG5fbnVtOworfQorCisvKioKKyAqIHRpcGNfY2x0cl9zZWxlY3Rfcm91dGVyIC0gc2VsZWN0IHJvdXRlciB0byBhIGNsdXN0ZXIKKyAqIAorICogVXNlcyBkZXRlcm1pbmlzdGljIGFuZCBmYWlyIGFsZ29yaXRobS4KKyAqLworCit1MzIgdGlwY19jbHRyX3NlbGVjdF9yb3V0ZXIoc3RydWN0IGNsdXN0ZXIgKmNfcHRyLCB1MzIgcmVmKQoreworCXUzMiBuX251bTsKKwl1MzIgdWxpbSA9IGNfcHRyLT5oaWdoZXN0X25vZGU7CisJdTMyIG1hc2s7CisJdTMyIHRzdGFydDsKKworCWFzc2VydCghaW5fb3duX2NsdXN0ZXIoY19wdHItPmFkZHIpKTsKKwlpZiAoIXVsaW0pCisJCXJldHVybiAwOworCisJLyogU3RhcnQgZW50cnkgbXVzdCBiZSByYW5kb20gKi8KKwltYXNrID0gdGlwY19tYXhfbm9kZXM7CisJd2hpbGUgKG1hc2sgPiB1bGltKQorCQltYXNrID4+PSAxOworCXRzdGFydCA9IHJlZiAmIG1hc2s7CisJbl9udW0gPSB0c3RhcnQ7CisKKwkvKiBMb29rdXAgdXB3YXJkcyB3aXRoIHdyYXAtYXJvdW5kICovCisJZG8geworCQlpZiAodGlwY19ub2RlX2lzX3VwKGNfcHRyLT5ub2Rlc1tuX251bV0pKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoKytuX251bSA8PSB1bGltKTsKKwlpZiAobl9udW0gPiB1bGltKSB7CisJCW5fbnVtID0gMTsKKwkJZG8geworCQkJaWYgKHRpcGNfbm9kZV9pc191cChjX3B0ci0+bm9kZXNbbl9udW1dKSkKKwkJCQlicmVhazsKKwkJfSB3aGlsZSAoKytuX251bSA8IHRzdGFydCk7CisJCWlmIChuX251bSA9PSB0c3RhcnQpCisJCQlyZXR1cm4gMDsKKwl9CisJYXNzZXJ0KG5fbnVtIDw9IHVsaW0pOworCXJldHVybiB0aXBjX25vZGVfc2VsZWN0X3JvdXRlcihjX3B0ci0+bm9kZXNbbl9udW1dLCByZWYpOworfQorCisvKioKKyAqIHRpcGNfY2x0cl9zZWxlY3Rfbm9kZSAtIHNlbGVjdCBkZXN0aW5hdGlvbiBub2RlIHdpdGhpbiBhIHJlbW90ZSBjbHVzdGVyCisgKiAKKyAqIFVzZXMgZGV0ZXJtaW5pc3RpYyBhbmQgZmFpciBhbGdvcml0aG0uCisgKi8KKworc3RydWN0IG5vZGUgKnRpcGNfY2x0cl9zZWxlY3Rfbm9kZShzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHUzMiBzZWxlY3RvcikKK3sKKwl1MzIgbl9udW07CisJdTMyIG1hc2sgPSB0aXBjX21heF9ub2RlczsKKwl1MzIgc3RhcnRfZW50cnk7CisKKwlhc3NlcnQoIWluX293bl9jbHVzdGVyKGNfcHRyLT5hZGRyKSk7CisJaWYgKCFjX3B0ci0+aGlnaGVzdF9ub2RlKQorCQlyZXR1cm4gMDsKKworCS8qIFN0YXJ0IGVudHJ5IG11c3QgYmUgcmFuZG9tICovCisJd2hpbGUgKG1hc2sgPiBjX3B0ci0+aGlnaGVzdF9ub2RlKSB7CisJCW1hc2sgPj49IDE7CisJfQorCXN0YXJ0X2VudHJ5ID0gKHNlbGVjdG9yICYgbWFzaykgPyBzZWxlY3RvciAmIG1hc2sgOiAxdTsKKwlhc3NlcnQoc3RhcnRfZW50cnkgPD0gY19wdHItPmhpZ2hlc3Rfbm9kZSk7CisKKwkvKiBMb29rdXAgdXB3YXJkcyB3aXRoIHdyYXAtYXJvdW5kICovCisJZm9yIChuX251bSA9IHN0YXJ0X2VudHJ5OyBuX251bSA8PSBjX3B0ci0+aGlnaGVzdF9ub2RlOyBuX251bSsrKSB7CisJCWlmICh0aXBjX25vZGVfaGFzX2FjdGl2ZV9saW5rcyhjX3B0ci0+bm9kZXNbbl9udW1dKSkKKwkJCXJldHVybiBjX3B0ci0+bm9kZXNbbl9udW1dOworCX0KKwlmb3IgKG5fbnVtID0gMTsgbl9udW0gPCBzdGFydF9lbnRyeTsgbl9udW0rKykgeworCQlpZiAodGlwY19ub2RlX2hhc19hY3RpdmVfbGlua3MoY19wdHItPm5vZGVzW25fbnVtXSkpCisJCQlyZXR1cm4gY19wdHItPm5vZGVzW25fbnVtXTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgICBSb3V0aW5nIHRhYmxlIG1hbmFnZW1lbnQ6IFNlZSBkZXNjcmlwdGlvbiBpbiBub2RlLmMKKyAqLworCitzdHJ1Y3Qgc2tfYnVmZiAqdGlwY19jbHRyX3ByZXBhcmVfcm91dGluZ19tc2codTMyIGRhdGFfc2l6ZSwgdTMyIGRlc3QpCit7CisJdTMyIHNpemUgPSBJTlRfSF9TSVpFICsgZGF0YV9zaXplOworCXN0cnVjdCBza19idWZmICpidWYgPSBidWZfYWNxdWlyZShzaXplKTsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKworCWlmIChidWYpIHsKKwkJbXNnID0gYnVmX21zZyhidWYpOworCQltZW1zZXQoKGNoYXIgKiltc2csIDAsIHNpemUpOworCQltc2dfaW5pdChtc2csIFJPVVRFX0RJU1RSSUJVVE9SLCAwLCBUSVBDX09LLCBJTlRfSF9TSVpFLCBkZXN0KTsKKwl9CisJcmV0dXJuIGJ1ZjsKK30KKwordm9pZCB0aXBjX2NsdHJfYmNhc3RfbmV3X3JvdXRlKHN0cnVjdCBjbHVzdGVyICpjX3B0ciwgdTMyIGRlc3QsCisJCQkgICAgIHUzMiBsb3dlciwgdTMyIHVwcGVyKQoreworCXN0cnVjdCBza19idWZmICpidWYgPSB0aXBjX2NsdHJfcHJlcGFyZV9yb3V0aW5nX21zZygwLCBjX3B0ci0+YWRkcik7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisKKwlpZiAoYnVmKSB7CisJCW1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJbXNnX3NldF9yZW1vdGVfbm9kZShtc2csIGRlc3QpOworCQltc2dfc2V0X3R5cGUobXNnLCBST1VURV9BRERJVElPTik7CisJCXRpcGNfY2x0cl9tdWx0aWNhc3QoY19wdHIsIGJ1ZiwgbG93ZXIsIHVwcGVyKTsKKwl9IGVsc2UgeworCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTogYnJvYWRjYXN0IG9mIG5ldyByb3V0ZSBmYWlsZWRcbiIpOworCX0KK30KKwordm9pZCB0aXBjX2NsdHJfYmNhc3RfbG9zdF9yb3V0ZShzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHUzMiBkZXN0LAorCQkJCXUzMiBsb3dlciwgdTMyIHVwcGVyKQoreworCXN0cnVjdCBza19idWZmICpidWYgPSB0aXBjX2NsdHJfcHJlcGFyZV9yb3V0aW5nX21zZygwLCBjX3B0ci0+YWRkcik7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisKKwlpZiAoYnVmKSB7CisJCW1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJbXNnX3NldF9yZW1vdGVfbm9kZShtc2csIGRlc3QpOworCQltc2dfc2V0X3R5cGUobXNnLCBST1VURV9SRU1PVkFMKTsKKwkJdGlwY19jbHRyX211bHRpY2FzdChjX3B0ciwgYnVmLCBsb3dlciwgdXBwZXIpOworCX0gZWxzZSB7CisJCXdhcm4oIk1lbW9yeSBzcXVlZXplOiBicm9hZGNhc3Qgb2YgbG9zdCByb3V0ZSBmYWlsZWRcbiIpOworCX0KK30KKwordm9pZCB0aXBjX2NsdHJfc2VuZF9zbGF2ZV9yb3V0ZXMoc3RydWN0IGNsdXN0ZXIgKmNfcHRyLCB1MzIgZGVzdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCXUzMiBoaWdoZXN0ID0gY19wdHItPmhpZ2hlc3Rfc2xhdmU7CisJdTMyIG5fbnVtOworCWludCBzZW5kID0gMDsKKworCWFzc2VydCghaXNfc2xhdmUoZGVzdCkpOworCWFzc2VydChpbl9vd25fY2x1c3RlcihkZXN0KSk7CisJYXNzZXJ0KGluX293bl9jbHVzdGVyKGNfcHRyLT5hZGRyKSk7CisJaWYgKGhpZ2hlc3QgPD0gTE9XRVNUX1NMQVZFKQorCQlyZXR1cm47CisJYnVmID0gdGlwY19jbHRyX3ByZXBhcmVfcm91dGluZ19tc2coaGlnaGVzdCAtIExPV0VTVF9TTEFWRSArIDEsCisJCQkJCSAgICBjX3B0ci0+YWRkcik7CisJaWYgKGJ1ZikgeworCQltc2cgPSBidWZfbXNnKGJ1Zik7CisJCW1zZ19zZXRfcmVtb3RlX25vZGUobXNnLCBjX3B0ci0+YWRkcik7CisJCW1zZ19zZXRfdHlwZShtc2csIFNMQVZFX1JPVVRJTkdfVEFCTEUpOworCQlmb3IgKG5fbnVtID0gTE9XRVNUX1NMQVZFOyBuX251bSA8PSBoaWdoZXN0OyBuX251bSsrKSB7CisJCQlpZiAoY19wdHItPm5vZGVzW25fbnVtXSAmJiAKKwkJCSAgICB0aXBjX25vZGVfaGFzX2FjdGl2ZV9saW5rcyhjX3B0ci0+bm9kZXNbbl9udW1dKSkgeworCQkJCXNlbmQgPSAxOworCQkJCW1zZ19zZXRfZGF0YW9jdGV0KG1zZywgbl9udW0pOworCQkJfQorCQl9CisJCWlmIChzZW5kKQorCQkJdGlwY19saW5rX3NlbmQoYnVmLCBkZXN0LCBkZXN0KTsKKwkJZWxzZQorCQkJYnVmX2Rpc2NhcmQoYnVmKTsKKwl9IGVsc2UgeworCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTogYnJvYWRjYXN0IG9mIGxvc3Qgcm91dGUgZmFpbGVkXG4iKTsKKwl9Cit9CisKK3ZvaWQgdGlwY19jbHRyX3NlbmRfZXh0X3JvdXRlcyhzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHUzMiBkZXN0KQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisJdTMyIGhpZ2hlc3QgPSBjX3B0ci0+aGlnaGVzdF9ub2RlOworCXUzMiBuX251bTsKKwlpbnQgc2VuZCA9IDA7CisKKwlpZiAoaW5fb3duX2NsdXN0ZXIoY19wdHItPmFkZHIpKQorCQlyZXR1cm47CisJYXNzZXJ0KCFpc19zbGF2ZShkZXN0KSk7CisJYXNzZXJ0KGluX293bl9jbHVzdGVyKGRlc3QpKTsKKwloaWdoZXN0ID0gY19wdHItPmhpZ2hlc3Rfbm9kZTsKKwlidWYgPSB0aXBjX2NsdHJfcHJlcGFyZV9yb3V0aW5nX21zZyhoaWdoZXN0ICsgMSwgY19wdHItPmFkZHIpOworCWlmIChidWYpIHsKKwkJbXNnID0gYnVmX21zZyhidWYpOworCQltc2dfc2V0X3JlbW90ZV9ub2RlKG1zZywgY19wdHItPmFkZHIpOworCQltc2dfc2V0X3R5cGUobXNnLCBFWFRfUk9VVElOR19UQUJMRSk7CisJCWZvciAobl9udW0gPSAxOyBuX251bSA8PSBoaWdoZXN0OyBuX251bSsrKSB7CisJCQlpZiAoY19wdHItPm5vZGVzW25fbnVtXSAmJiAKKwkJCSAgICB0aXBjX25vZGVfaGFzX2FjdGl2ZV9saW5rcyhjX3B0ci0+bm9kZXNbbl9udW1dKSkgeworCQkJCXNlbmQgPSAxOworCQkJCW1zZ19zZXRfZGF0YW9jdGV0KG1zZywgbl9udW0pOworCQkJfQorCQl9CisJCWlmIChzZW5kKQorCQkJdGlwY19saW5rX3NlbmQoYnVmLCBkZXN0LCBkZXN0KTsKKwkJZWxzZQorCQkJYnVmX2Rpc2NhcmQoYnVmKTsKKwl9IGVsc2UgeworCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTogYnJvYWRjYXN0IG9mIGV4dGVybmFsIHJvdXRlIGZhaWxlZFxuIik7CisJfQorfQorCit2b2lkIHRpcGNfY2x0cl9zZW5kX2xvY2FsX3JvdXRlcyhzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHUzMiBkZXN0KQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisJdTMyIGhpZ2hlc3QgPSBjX3B0ci0+aGlnaGVzdF9ub2RlOworCXUzMiBuX251bTsKKwlpbnQgc2VuZCA9IDA7CisKKwlhc3NlcnQoaXNfc2xhdmUoZGVzdCkpOworCWFzc2VydChpbl9vd25fY2x1c3RlcihjX3B0ci0+YWRkcikpOworCWJ1ZiA9IHRpcGNfY2x0cl9wcmVwYXJlX3JvdXRpbmdfbXNnKGhpZ2hlc3QsIGNfcHRyLT5hZGRyKTsKKwlpZiAoYnVmKSB7CisJCW1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJbXNnX3NldF9yZW1vdGVfbm9kZShtc2csIGNfcHRyLT5hZGRyKTsKKwkJbXNnX3NldF90eXBlKG1zZywgTE9DQUxfUk9VVElOR19UQUJMRSk7CisJCWZvciAobl9udW0gPSAxOyBuX251bSA8PSBoaWdoZXN0OyBuX251bSsrKSB7CisJCQlpZiAoY19wdHItPm5vZGVzW25fbnVtXSAmJiAKKwkJCSAgICB0aXBjX25vZGVfaGFzX2FjdGl2ZV9saW5rcyhjX3B0ci0+bm9kZXNbbl9udW1dKSkgeworCQkJCXNlbmQgPSAxOworCQkJCW1zZ19zZXRfZGF0YW9jdGV0KG1zZywgbl9udW0pOworCQkJfQorCQl9CisJCWlmIChzZW5kKQorCQkJdGlwY19saW5rX3NlbmQoYnVmLCBkZXN0LCBkZXN0KTsKKwkJZWxzZQorCQkJYnVmX2Rpc2NhcmQoYnVmKTsKKwl9IGVsc2UgeworCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTogYnJvYWRjYXN0IG9mIGxvY2FsIHJvdXRlIGZhaWxlZFxuIik7CisJfQorfQorCit2b2lkIHRpcGNfY2x0cl9yZWN2X3JvdXRpbmdfdGFibGUoc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwlzdHJ1Y3QgY2x1c3RlciAqY19wdHI7CisJc3RydWN0IG5vZGUgKm5fcHRyOworCXVuY2hhciAqbm9kZV90YWJsZTsKKwl1MzIgdGFibGVfc2l6ZTsKKwl1MzIgcm91dGVyOworCXUzMiByZW1fbm9kZSA9IG1zZ19yZW1vdGVfbm9kZShtc2cpOworCXUzMiB6X251bTsKKwl1MzIgY19udW07CisJdTMyIG5fbnVtOworCisJY19wdHIgPSB0aXBjX2NsdHJfZmluZChyZW1fbm9kZSk7CisJaWYgKCFjX3B0cikgeworCQljX3B0ciA9IHRpcGNfY2x0cl9jcmVhdGUocmVtX25vZGUpOworCQlpZiAoIWNfcHRyKSB7CisJCQlidWZfZGlzY2FyZChidWYpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJbm9kZV90YWJsZSA9IGJ1Zi0+ZGF0YSArIG1zZ19oZHJfc3oobXNnKTsKKwl0YWJsZV9zaXplID0gbXNnX3NpemUobXNnKSAtIG1zZ19oZHJfc3oobXNnKTsKKwlyb3V0ZXIgPSBtc2dfcHJldm5vZGUobXNnKTsKKwl6X251bSA9IHRpcGNfem9uZShyZW1fbm9kZSk7CisJY19udW0gPSB0aXBjX2NsdXN0ZXIocmVtX25vZGUpOworCisJc3dpdGNoIChtc2dfdHlwZShtc2cpKSB7CisJY2FzZSBMT0NBTF9ST1VUSU5HX1RBQkxFOgorCQlhc3NlcnQoaXNfc2xhdmUodGlwY19vd25fYWRkcikpOworCWNhc2UgRVhUX1JPVVRJTkdfVEFCTEU6CisJCWZvciAobl9udW0gPSAxOyBuX251bSA8IHRhYmxlX3NpemU7IG5fbnVtKyspIHsKKwkJCWlmIChub2RlX3RhYmxlW25fbnVtXSkgeworCQkJCXUzMiBhZGRyID0gdGlwY19hZGRyKHpfbnVtLCBjX251bSwgbl9udW0pOworCQkJCW5fcHRyID0gY19wdHItPm5vZGVzW25fbnVtXTsKKwkJCQlpZiAoIW5fcHRyKSB7CisJCQkJCW5fcHRyID0gdGlwY19ub2RlX2NyZWF0ZShhZGRyKTsKKwkJCQl9CisJCQkJaWYgKG5fcHRyKQorCQkJCQl0aXBjX25vZGVfYWRkX3JvdXRlcihuX3B0ciwgcm91dGVyKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIFNMQVZFX1JPVVRJTkdfVEFCTEU6CisJCWFzc2VydCghaXNfc2xhdmUodGlwY19vd25fYWRkcikpOworCQlhc3NlcnQoaW5fb3duX2NsdXN0ZXIoY19wdHItPmFkZHIpKTsKKwkJZm9yIChuX251bSA9IDE7IG5fbnVtIDwgdGFibGVfc2l6ZTsgbl9udW0rKykgeworCQkJaWYgKG5vZGVfdGFibGVbbl9udW1dKSB7CisJCQkJdTMyIHNsYXZlX251bSA9IG5fbnVtICsgTE9XRVNUX1NMQVZFOworCQkJCXUzMiBhZGRyID0gdGlwY19hZGRyKHpfbnVtLCBjX251bSwgc2xhdmVfbnVtKTsKKwkJCQluX3B0ciA9IGNfcHRyLT5ub2Rlc1tzbGF2ZV9udW1dOworCQkJCWlmICghbl9wdHIpIHsKKwkJCQkJbl9wdHIgPSB0aXBjX25vZGVfY3JlYXRlKGFkZHIpOworCQkJCX0KKwkJCQlpZiAobl9wdHIpCisJCQkJCXRpcGNfbm9kZV9hZGRfcm91dGVyKG5fcHRyLCByb3V0ZXIpOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgUk9VVEVfQURESVRJT046CisJCWlmICghaXNfc2xhdmUodGlwY19vd25fYWRkcikpIHsKKwkJCWFzc2VydCghaW5fb3duX2NsdXN0ZXIoY19wdHItPmFkZHIpCisJCQkgICAgICAgfHwgaXNfc2xhdmUocmVtX25vZGUpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydChpbl9vd25fY2x1c3RlcihjX3B0ci0+YWRkcikKKwkJCSAgICAgICAmJiAhaXNfc2xhdmUocmVtX25vZGUpKTsKKwkJfQorCQluX3B0ciA9IGNfcHRyLT5ub2Rlc1t0aXBjX25vZGUocmVtX25vZGUpXTsKKwkJaWYgKCFuX3B0cikKKwkJCW5fcHRyID0gdGlwY19ub2RlX2NyZWF0ZShyZW1fbm9kZSk7CisJCWlmIChuX3B0cikKKwkJCXRpcGNfbm9kZV9hZGRfcm91dGVyKG5fcHRyLCByb3V0ZXIpOworCQlicmVhazsKKwljYXNlIFJPVVRFX1JFTU9WQUw6CisJCWlmICghaXNfc2xhdmUodGlwY19vd25fYWRkcikpIHsKKwkJCWFzc2VydCghaW5fb3duX2NsdXN0ZXIoY19wdHItPmFkZHIpCisJCQkgICAgICAgfHwgaXNfc2xhdmUocmVtX25vZGUpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydChpbl9vd25fY2x1c3RlcihjX3B0ci0+YWRkcikKKwkJCSAgICAgICAmJiAhaXNfc2xhdmUocmVtX25vZGUpKTsKKwkJfQorCQluX3B0ciA9IGNfcHRyLT5ub2Rlc1t0aXBjX25vZGUocmVtX25vZGUpXTsKKwkJaWYgKG5fcHRyKQorCQkJdGlwY19ub2RlX3JlbW92ZV9yb3V0ZXIobl9wdHIsIHJvdXRlcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFzc2VydCghIklsbGVnYWwgcm91dGluZyBtYW5hZ2VyIG1lc3NhZ2UgcmVjZWl2ZWRcbiIpOworCX0KKwlidWZfZGlzY2FyZChidWYpOworfQorCit2b2lkIHRpcGNfY2x0cl9yZW1vdmVfYXNfcm91dGVyKHN0cnVjdCBjbHVzdGVyICpjX3B0ciwgdTMyIHJvdXRlcikKK3sKKwl1MzIgc3RhcnRfZW50cnk7CisJdTMyIHRzdG9wOworCXUzMiBuX251bTsKKworCWlmIChpc19zbGF2ZShyb3V0ZXIpKQorCQlyZXR1cm47CS8qIFNsYXZlIG5vZGVzIGNhbiBub3QgYmUgcm91dGVycyAqLworCisJaWYgKGluX293bl9jbHVzdGVyKGNfcHRyLT5hZGRyKSkgeworCQlzdGFydF9lbnRyeSA9IExPV0VTVF9TTEFWRTsKKwkJdHN0b3AgPSBjX3B0ci0+aGlnaGVzdF9zbGF2ZTsKKwl9IGVsc2UgeworCQlzdGFydF9lbnRyeSA9IDE7CisJCXRzdG9wID0gY19wdHItPmhpZ2hlc3Rfbm9kZTsKKwl9CisKKwlmb3IgKG5fbnVtID0gc3RhcnRfZW50cnk7IG5fbnVtIDw9IHRzdG9wOyBuX251bSsrKSB7CisJCWlmIChjX3B0ci0+bm9kZXNbbl9udW1dKSB7CisJCQl0aXBjX25vZGVfcmVtb3ZlX3JvdXRlcihjX3B0ci0+bm9kZXNbbl9udW1dLCByb3V0ZXIpOworCQl9CisJfQorfQorCisvKioKKyAqIHRpcGNfY2x0cl9tdWx0aWNhc3QgLSBtdWx0aWNhc3QgbWVzc2FnZSB0byBsb2NhbCBub2RlcyAKKyAqLworCit2b2lkIHRpcGNfY2x0cl9tdWx0aWNhc3Qoc3RydWN0IGNsdXN0ZXIgKmNfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCAKKwkJCSB1MzIgbG93ZXIsIHUzMiB1cHBlcikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmX2NvcHk7CisJc3RydWN0IG5vZGUgKm5fcHRyOworCXUzMiBuX251bTsKKwl1MzIgdHN0b3A7CisKKwlhc3NlcnQobG93ZXIgPD0gdXBwZXIpOworCWFzc2VydCgoKGxvd2VyID49IDEpICYmIChsb3dlciA8PSB0aXBjX21heF9ub2RlcykpIHx8CisJICAgICAgICgobG93ZXIgPj0gTE9XRVNUX1NMQVZFKSAmJiAobG93ZXIgPD0gdGlwY19oaWdoZXN0X2FsbG93ZWRfc2xhdmUpKSk7CisJYXNzZXJ0KCgodXBwZXIgPj0gMSkgJiYgKHVwcGVyIDw9IHRpcGNfbWF4X25vZGVzKSkgfHwKKwkgICAgICAgKCh1cHBlciA+PSBMT1dFU1RfU0xBVkUpICYmICh1cHBlciA8PSB0aXBjX2hpZ2hlc3RfYWxsb3dlZF9zbGF2ZSkpKTsKKwlhc3NlcnQoaW5fb3duX2NsdXN0ZXIoY19wdHItPmFkZHIpKTsKKworCXRzdG9wID0gaXNfc2xhdmUodXBwZXIpID8gY19wdHItPmhpZ2hlc3Rfc2xhdmUgOiBjX3B0ci0+aGlnaGVzdF9ub2RlOworCWlmICh0c3RvcCA+IHVwcGVyKQorCQl0c3RvcCA9IHVwcGVyOworCWZvciAobl9udW0gPSBsb3dlcjsgbl9udW0gPD0gdHN0b3A7IG5fbnVtKyspIHsKKwkJbl9wdHIgPSBjX3B0ci0+bm9kZXNbbl9udW1dOworCQlpZiAobl9wdHIgJiYgdGlwY19ub2RlX2hhc19hY3RpdmVfbGlua3Mobl9wdHIpKSB7CisJCQlidWZfY29weSA9IHNrYl9jb3B5KGJ1ZiwgR0ZQX0FUT01JQyk7CisJCQlpZiAoYnVmX2NvcHkgPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJCW1zZ19zZXRfZGVzdG5vZGUoYnVmX21zZyhidWZfY29weSksIG5fcHRyLT5hZGRyKTsKKwkJCXRpcGNfbGlua19zZW5kKGJ1Zl9jb3B5LCBuX3B0ci0+YWRkciwgbl9wdHItPmFkZHIpOworCQl9CisJfQorCWJ1Zl9kaXNjYXJkKGJ1Zik7Cit9CisKKy8qKgorICogdGlwY19jbHRyX2Jyb2FkY2FzdCAtIGJyb2FkY2FzdCBtZXNzYWdlIHRvIGFsbCBub2RlcyB3aXRoaW4gY2x1c3RlcgorICovCisKK3ZvaWQgdGlwY19jbHRyX2Jyb2FkY2FzdChzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXN0cnVjdCBza19idWZmICpidWZfY29weTsKKwlzdHJ1Y3QgY2x1c3RlciAqY19wdHI7CisJc3RydWN0IG5vZGUgKm5fcHRyOworCXUzMiBuX251bTsKKwl1MzIgdHN0YXJ0OworCXUzMiB0c3RvcDsKKwl1MzIgbm9kZV90eXBlOworCisJaWYgKHRpcGNfbW9kZSA9PSBUSVBDX05FVF9NT0RFKSB7CisJCWNfcHRyID0gdGlwY19jbHRyX2ZpbmQodGlwY19vd25fYWRkcik7CisJCWFzc2VydChpbl9vd25fY2x1c3RlcihjX3B0ci0+YWRkcikpOwkvKiBGb3Igbm93ICovCisKKwkJLyogU2VuZCB0byBzdGFuZGFyZCBub2RlcywgdGhlbiByZXBlYXQgbG9vcCBzZW5kaW5nIHRvIHNsYXZlcyAqLworCQl0c3RhcnQgPSAxOworCQl0c3RvcCA9IGNfcHRyLT5oaWdoZXN0X25vZGU7CisJCWZvciAobm9kZV90eXBlID0gMTsgbm9kZV90eXBlIDw9IDI7IG5vZGVfdHlwZSsrKSB7CisJCQlmb3IgKG5fbnVtID0gdHN0YXJ0OyBuX251bSA8PSB0c3RvcDsgbl9udW0rKykgeworCQkJCW5fcHRyID0gY19wdHItPm5vZGVzW25fbnVtXTsKKwkJCQlpZiAobl9wdHIgJiYgdGlwY19ub2RlX2hhc19hY3RpdmVfbGlua3Mobl9wdHIpKSB7CisJCQkJCWJ1Zl9jb3B5ID0gc2tiX2NvcHkoYnVmLCBHRlBfQVRPTUlDKTsKKwkJCQkJaWYgKGJ1Zl9jb3B5ID09IE5VTEwpCisJCQkJCQlnb3RvIGV4aXQ7CisJCQkJCW1zZ19zZXRfZGVzdG5vZGUoYnVmX21zZyhidWZfY29weSksIAorCQkJCQkJCSBuX3B0ci0+YWRkcik7CisJCQkJCXRpcGNfbGlua19zZW5kKGJ1Zl9jb3B5LCBuX3B0ci0+YWRkciwgCisJCQkJCQkgICAgICAgbl9wdHItPmFkZHIpOworCQkJCX0KKwkJCX0KKwkJCXRzdGFydCA9IExPV0VTVF9TTEFWRTsKKwkJCXRzdG9wID0gY19wdHItPmhpZ2hlc3Rfc2xhdmU7CisJCX0KKwl9CitleGl0OgorCWJ1Zl9kaXNjYXJkKGJ1Zik7Cit9CisKK2ludCB0aXBjX2NsdHJfaW5pdCh2b2lkKQoreworCXRpcGNfaGlnaGVzdF9hbGxvd2VkX3NsYXZlID0gTE9XRVNUX1NMQVZFICsgdGlwY19tYXhfc2xhdmVzOworCXJldHVybiB0aXBjX2NsdHJfY3JlYXRlKHRpcGNfb3duX2FkZHIpID8gVElQQ19PSyA6IC1FTk9NRU07Cit9CisKZGlmZiAtLWdpdCBhL25ldC90aXBjL2NsdXN0ZXIuaCBiL25ldC90aXBjL2NsdXN0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTYzNjQyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvY2x1c3Rlci5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBuZXQvdGlwYy9jbHVzdGVyLmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBjbHVzdGVyIG1hbmFnZW1lbnQgcm91dGluZXMKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfVElQQ19DTFVTVEVSX0gKKyNkZWZpbmUgX1RJUENfQ0xVU1RFUl9ICisKKyNpbmNsdWRlICJhZGRyLmgiCisjaW5jbHVkZSAiem9uZS5oIgorCisjZGVmaW5lIExPV0VTVF9TTEFWRSAgMjA0OHUKKworLyoqCisgKiBzdHJ1Y3QgY2x1c3RlciAtIFRJUEMgY2x1c3RlciBzdHJ1Y3R1cmUKKyAqIEBhZGRyOiBuZXR3b3JrIGFkZHJlc3Mgb2YgY2x1c3RlcgorICogQG93bmVyOiBwb2ludGVyIHRvIHpvbmUgdGhhdCBjbHVzdGVyIGJlbG9uZ3MgdG8KKyAqIEBub2RlczogYXJyYXkgb2YgcG9pbnRlcnMgdG8gYWxsIG5vZGVzIHdpdGhpbiBjbHVzdGVyCisgKiBAaGlnaGVzdF9ub2RlOiBpZCBvZiBoaWdoZXN0IG51bWJlcmVkIG5vZGUgd2l0aGluIGNsdXN0ZXIKKyAqIEBoaWdoZXN0X3NsYXZlOiAodXNlZCBmb3Igc2Vjb25kYXJ5IG5vZGUgc3VwcG9ydCkKKyAqLworIAorc3RydWN0IGNsdXN0ZXIgeworCXUzMiBhZGRyOworCXN0cnVjdCBfem9uZSAqb3duZXI7CisJc3RydWN0IG5vZGUgKipub2RlczsKKwl1MzIgaGlnaGVzdF9ub2RlOworCXUzMiBoaWdoZXN0X3NsYXZlOworfTsKKworCitleHRlcm4gc3RydWN0IG5vZGUgKip0aXBjX2xvY2FsX25vZGVzOworZXh0ZXJuIHUzMiB0aXBjX2hpZ2hlc3RfYWxsb3dlZF9zbGF2ZTsKK2V4dGVybiBzdHJ1Y3Qgbm9kZV9tYXAgdGlwY19jbHRyX2JjYXN0X25vZGVzOworCit2b2lkIHRpcGNfY2x0cl9yZW1vdmVfYXNfcm91dGVyKHN0cnVjdCBjbHVzdGVyICpjX3B0ciwgdTMyIHJvdXRlcik7Cit2b2lkIHRpcGNfY2x0cl9zZW5kX2V4dF9yb3V0ZXMoc3RydWN0IGNsdXN0ZXIgKmNfcHRyLCB1MzIgZGVzdCk7CitzdHJ1Y3Qgbm9kZSAqdGlwY19jbHRyX3NlbGVjdF9ub2RlKHN0cnVjdCBjbHVzdGVyICpjX3B0ciwgdTMyIHNlbGVjdG9yKTsKK3UzMiB0aXBjX2NsdHJfc2VsZWN0X3JvdXRlcihzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHUzMiByZWYpOwordm9pZCB0aXBjX2NsdHJfcmVjdl9yb3V0aW5nX3RhYmxlKHN0cnVjdCBza19idWZmICpidWYpOworc3RydWN0IGNsdXN0ZXIgKnRpcGNfY2x0cl9jcmVhdGUodTMyIGFkZHIpOwordm9pZCB0aXBjX2NsdHJfZGVsZXRlKHN0cnVjdCBjbHVzdGVyICpjX3B0cik7Cit2b2lkIHRpcGNfY2x0cl9hdHRhY2hfbm9kZShzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHN0cnVjdCBub2RlICpuX3B0cik7Cit2b2lkIHRpcGNfY2x0cl9zZW5kX3NsYXZlX3JvdXRlcyhzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHUzMiBkZXN0KTsKK3ZvaWQgdGlwY19jbHRyX2Jyb2FkY2FzdChzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKK2ludCB0aXBjX2NsdHJfaW5pdCh2b2lkKTsKK3UzMiB0aXBjX2NsdHJfbmV4dF9ub2RlKHN0cnVjdCBjbHVzdGVyICpjX3B0ciwgdTMyIGFkZHIpOwordm9pZCB0aXBjX2NsdHJfYmNhc3RfbmV3X3JvdXRlKHN0cnVjdCBjbHVzdGVyICpjX3B0ciwgdTMyIGRlc3QsIHUzMiBsbywgdTMyIGhpKTsKK3ZvaWQgdGlwY19jbHRyX3NlbmRfbG9jYWxfcm91dGVzKHN0cnVjdCBjbHVzdGVyICpjX3B0ciwgdTMyIGRlc3QpOwordm9pZCB0aXBjX2NsdHJfYmNhc3RfbG9zdF9yb3V0ZShzdHJ1Y3QgY2x1c3RlciAqY19wdHIsIHUzMiBkZXN0LCB1MzIgbG8sIHUzMiBoaSk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNsdXN0ZXIgKnRpcGNfY2x0cl9maW5kKHUzMiBhZGRyKQoreworCXN0cnVjdCBfem9uZSAqel9wdHIgPSB0aXBjX3pvbmVfZmluZChhZGRyKTsKKworCWlmICh6X3B0cikKKwkJcmV0dXJuIHpfcHRyLT5jbHVzdGVyc1sxXTsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9jb25maWcuYyBiL25ldC90aXBjL2NvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOGU2NzQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9jb25maWcuYwpAQCAtMCwwICsxLDcxOCBAQAorLyoKKyAqIG5ldC90aXBjL2NvbmZpZy5jOiBUSVBDIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCBjb2RlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJkYmcuaCIKKyNpbmNsdWRlICJiZWFyZXIuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAibGluay5oIgorI2luY2x1ZGUgInpvbmUuaCIKKyNpbmNsdWRlICJhZGRyLmgiCisjaW5jbHVkZSAibmFtZV90YWJsZS5oIgorI2luY2x1ZGUgIm5vZGUuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJkaXNjb3Zlci5oIgorCitzdHJ1Y3Qgc3Vic2NyX2RhdGEgeworCWNoYXIgdXNyX2hhbmRsZVs4XTsKKwl1MzIgZG9tYWluOworCXUzMiBwb3J0X3JlZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN1YmRfbGlzdDsKK307CisKK3N0cnVjdCBtYW5hZ2VyIHsKKwl1MzIgdXNlcl9yZWY7CisJdTMyIHBvcnRfcmVmOworCXUzMiBzdWJzY3JfcmVmOworCXUzMiBsaW5rX3N1YnNjcmlwdGlvbnM7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rX3N1YnNjcmliZXJzOworfTsKKworc3RhdGljIHN0cnVjdCBtYW5hZ2VyIG1uZyA9IHsgMH07CisKK3N0YXRpYyBzcGlubG9ja190IGNvbmZpZ19sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCitzdGF0aWMgY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhOwkvKiByZXF1ZXN0IG1lc3NhZ2UgVExWIGFyZWEgKi8KK3N0YXRpYyBpbnQgcmVxX3Rsdl9zcGFjZTsJCS8qIHJlcXVlc3QgbWVzc2FnZSBUTFYgYXJlYSBzaXplICovCitzdGF0aWMgaW50IHJlcF9oZWFkcm9vbTsJCS8qIHJlcGx5IG1lc3NhZ2UgaGVhZHJvb20gdG8gdXNlICovCisKKwordm9pZCB0aXBjX2NmZ19saW5rX2V2ZW50KHUzMiBhZGRyLCBjaGFyICpuYW1lLCBpbnQgdXApCit7CisJLyogVElQQyBET0VTTidUIEhBTkRMRSBMSU5LIEVWRU5UIFNVQlNDUklQVElPTlMgQVQgVEhFIE1PTUVOVCAqLworfQorCisKK3N0cnVjdCBza19idWZmICp0aXBjX2NmZ19yZXBseV9hbGxvYyhpbnQgcGF5bG9hZF9zaXplKQoreworCXN0cnVjdCBza19idWZmICpidWY7CisKKwlidWYgPSBhbGxvY19za2IocmVwX2hlYWRyb29tICsgcGF5bG9hZF9zaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoYnVmKQorCQlza2JfcmVzZXJ2ZShidWYsIHJlcF9oZWFkcm9vbSk7CisJcmV0dXJuIGJ1ZjsKK30KKworaW50IHRpcGNfY2ZnX2FwcGVuZF90bHYoc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgaW50IHRsdl90eXBlLCAKKwkJCXZvaWQgKnRsdl9kYXRhLCBpbnQgdGx2X2RhdGFfc2l6ZSkKK3sKKwlzdHJ1Y3QgdGx2X2Rlc2MgKnRsdiA9IChzdHJ1Y3QgdGx2X2Rlc2MgKilidWYtPnRhaWw7CisJaW50IG5ld190bHZfc3BhY2UgPSBUTFZfU1BBQ0UodGx2X2RhdGFfc2l6ZSk7CisKKwlpZiAoc2tiX3RhaWxyb29tKGJ1ZikgPCBuZXdfdGx2X3NwYWNlKSB7CisJCWRiZygidGlwY19jZmdfYXBwZW5kX3RsdiB1bmFibGUgdG8gYXBwZW5kIFRMVlxuIik7CisJCXJldHVybiAwOworCX0KKwlza2JfcHV0KGJ1ZiwgbmV3X3Rsdl9zcGFjZSk7CisJdGx2LT50bHZfdHlwZSA9IGh0b25zKHRsdl90eXBlKTsKKwl0bHYtPnRsdl9sZW4gID0gaHRvbnMoVExWX0xFTkdUSCh0bHZfZGF0YV9zaXplKSk7CisJaWYgKHRsdl9kYXRhX3NpemUgJiYgdGx2X2RhdGEpCisJCW1lbWNweShUTFZfREFUQSh0bHYpLCB0bHZfZGF0YSwgdGx2X2RhdGFfc2l6ZSk7CisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBza19idWZmICp0aXBjX2NmZ19yZXBseV91bnNpZ25lZF90eXBlKHUxNiB0bHZfdHlwZSwgdTMyIHZhbHVlKQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJdTMyIHZhbHVlX25ldDsKKworCWJ1ZiA9IHRpcGNfY2ZnX3JlcGx5X2FsbG9jKFRMVl9TUEFDRShzaXplb2YodmFsdWUpKSk7CisJaWYgKGJ1ZikgeworCQl2YWx1ZV9uZXQgPSBodG9ubCh2YWx1ZSk7CisJCXRpcGNfY2ZnX2FwcGVuZF90bHYoYnVmLCB0bHZfdHlwZSwgJnZhbHVlX25ldCwgCisJCQkJICAgIHNpemVvZih2YWx1ZV9uZXQpKTsKKwl9CisJcmV0dXJuIGJ1ZjsKK30KKworc3RydWN0IHNrX2J1ZmYgKnRpcGNfY2ZnX3JlcGx5X3N0cmluZ190eXBlKHUxNiB0bHZfdHlwZSwgY2hhciAqc3RyaW5nKQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJaW50IHN0cmluZ19sZW4gPSBzdHJsZW4oc3RyaW5nKSArIDE7CisKKwlidWYgPSB0aXBjX2NmZ19yZXBseV9hbGxvYyhUTFZfU1BBQ0Uoc3RyaW5nX2xlbikpOworCWlmIChidWYpCisJCXRpcGNfY2ZnX2FwcGVuZF90bHYoYnVmLCB0bHZfdHlwZSwgc3RyaW5nLCBzdHJpbmdfbGVuKTsKKwlyZXR1cm4gYnVmOworfQorCisKKworCisjaWYgMAorCisvKiBOb3cgb2Jzb2xldGUgY29kZSBmb3IgaGFuZGxpbmcgY29tbWFuZHMgbm90IHlldCBpbXBsZW1lbnRlZCB0aGUgbmV3IHdheSAqLworCitpbnQgdGlwY19jZmdfY21kKGNvbnN0IHN0cnVjdCB0aXBjX2NtZF9tc2cgKiBtc2csCisJCSBjaGFyICpkYXRhLAorCQkgdTMyIHN6LAorCQkgdTMyICpyZXRfc2l6ZSwKKwkJIHN0cnVjdCB0aXBjX3BvcnRpZCAqb3JpZykKK3sKKwlpbnQgcnYgPSAtRUlOVkFMOworCXUzMiBjbWQgPSBtc2ctPmNtZDsKKworCSpyZXRfc2l6ZSA9IDA7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRJUENfUkVNT1ZFX0xJTks6CisJY2FzZSBUSVBDX0NNRF9CTE9DS19MSU5LOgorCWNhc2UgVElQQ19DTURfVU5CTE9DS19MSU5LOgorCQlpZiAoIWNmZ19jaGVja19jb25uZWN0aW9uKG9yaWcpKQorCQkJcnYgPSBsaW5rX2NvbnRyb2wobXNnLT5hcmd2LmxpbmtfbmFtZSwgbXNnLT5jbWQsIDApOworCQlicmVhazsKKwljYXNlIFRJUENfRVNUQUJMSVNIOgorCQl7CisJCQlpbnQgY29ubmVjdGVkOworCisJCQl0aXBjX2lzY29ubmVjdGVkKG1uZy5jb25uX3BvcnRfcmVmLCAmY29ubmVjdGVkKTsKKwkJCWlmIChjb25uZWN0ZWQgfHwgIW9yaWcpIHsKKwkJCQlydiA9IFRJUENfRkFJTFVSRTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJ2ID0gdGlwY19jb25uZWN0MnBvcnQobW5nLmNvbm5fcG9ydF9yZWYsIG9yaWcpOworCQkJaWYgKHJ2ID09IFRJUENfT0spCisJCQkJb3JpZyA9IDA7CisJCQlicmVhazsKKwkJfQorCWNhc2UgVElQQ19HRVRfUEVFUl9BRERSRVNTOgorCQkqcmV0X3NpemUgPSBsaW5rX3BlZXJfYWRkcihtc2ctPmFyZ3YubGlua19uYW1lLCBkYXRhLCBzeik7CisJCWJyZWFrOworCWNhc2UgVElQQ19HRVRfUk9VVEVTOgorCQlydiA9IFRJUENfT0s7CisJCWJyZWFrOworCWRlZmF1bHQ6IHt9CisJfQorCWlmICgqcmV0X3NpemUpCisJCXJ2ID0gVElQQ19PSzsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyB2b2lkIGNmZ19jbWRfZXZlbnQoc3RydWN0IHRpcGNfY21kX21zZyAqbXNnLAorCQkJICBjaGFyICpkYXRhLAorCQkJICB1MzIgc3osICAgICAgICAKKwkJCSAgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpvcmlnKQoreworCWludCBydiA9IC1FSU5WQUw7CisJc3RydWN0IHRpcGNfY21kX3Jlc3VsdF9tc2cgcm1zZzsKKwlzdHJ1Y3QgaW92ZWMgbXNnX3NlY3RbMl07CisJaW50ICphcmc7CisKKwltc2ctPmNtZCA9IG50b2hsKG1zZy0+Y21kKTsKKworCWNmZ19wcmVwYXJlX3Jlc19tc2cobXNnLT5jbWQsIG1zZy0+dXNyX2hhbmRsZSwgcnYsICZybXNnLCBtc2dfc2VjdCwgCisJCQkgICAgZGF0YSwgMCk7CisJaWYgKG50b2hsKG1zZy0+bWFnaWMpICE9IFRJUENfTUFHSUMpCisJCWdvdG8gZXhpdDsKKworCXN3aXRjaCAobXNnLT5jbWQpIHsKKwljYXNlIFRJUENfQ1JFQVRFX0xJTks6CisJCWlmICghY2ZnX2NoZWNrX2Nvbm5lY3Rpb24ob3JpZykpCisJCQlydiA9IGRpc2NfY3JlYXRlX2xpbmsoJm1zZy0+YXJndi5jcmVhdGVfbGluayk7CisJCWJyZWFrOworCWNhc2UgVElQQ19MSU5LX1NVQlNDUklCRToKKwkJeworCQkJc3RydWN0IHN1YnNjcl9kYXRhICpzdWI7CisKKwkJCWlmIChtbmcubGlua19zdWJzY3JpcHRpb25zID4gNjQpCisJCQkJYnJlYWs7CisJCQlzdWIgPSAoc3RydWN0IHN1YnNjcl9kYXRhICopa21hbGxvYyhzaXplb2YoKnN1YiksCisJCQkJCQkJICAgIEdGUF9BVE9NSUMpOworCQkJaWYgKHN1YiA9PSBOVUxMKSB7CisJCQkJd2FybigiTWVtb3J5IHNxdWVlemU7IGRyb3BwZWQgcmVtb3RlIGxpbmsgc3Vic2NyaXB0aW9uXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCUlOSVRfTElTVF9IRUFEKCZzdWItPnN1YmRfbGlzdCk7CisJCQl0aXBjX2NyZWF0ZXBvcnQobW5nLnVzZXJfcmVmLAorCQkJCQkodm9pZCAqKXN1YiwKKwkJCQkJVElQQ19ISUdIX0lNUE9SVEFOQ0UsCisJCQkJCTAsCisJCQkJCTAsCisJCQkJCSh0aXBjX2Nvbm5fc2h1dGRvd25fZXZlbnQpY2ZnX2xpbmtzdWJzY3JfY2FuY2VsLAorCQkJCQkwLAorCQkJCQkwLAorCQkJCQkodGlwY19jb25uX21zZ19ldmVudCljZmdfbGlua3N1YnNjcl9jYW5jZWwsCisJCQkJCTAsCisJCQkJCSZzdWItPnBvcnRfcmVmKTsKKwkJCWlmICghc3ViLT5wb3J0X3JlZikgeworCQkJCWtmcmVlKHN1Yik7CisJCQkJYnJlYWs7CisJCQl9CisJCQltZW1jcHkoc3ViLT51c3JfaGFuZGxlLG1zZy0+dXNyX2hhbmRsZSwKKwkJCSAgICAgICBzaXplb2Yoc3ViLT51c3JfaGFuZGxlKSk7CisJCQlzdWItPmRvbWFpbiA9IG1zZy0+YXJndi5kb21haW47CisJCQlsaXN0X2FkZF90YWlsKCZzdWItPnN1YmRfbGlzdCwgJm1uZy5saW5rX3N1YnNjcmliZXJzKTsKKwkJCXRpcGNfY29ubmVjdDJwb3J0KHN1Yi0+cG9ydF9yZWYsIG9yaWcpOworCQkJcm1zZy5yZXR2YWwgPSBUSVBDX09LOworCQkJdGlwY19zZW5kKHN1Yi0+cG9ydF9yZWYsIDJ1LCBtc2dfc2VjdCk7CisJCQltbmcubGlua19zdWJzY3JpcHRpb25zKys7CisJCQlyZXR1cm47CisJCX0KKwlkZWZhdWx0OgorCQlydiA9IHRpcGNfY2ZnX2NtZChtc2csIGRhdGEsIHN6LCAodTMyICopJm1zZ19zZWN0WzFdLmlvdl9sZW4sIG9yaWcpOworCX0KKwlleGl0OgorCXJtc2cucmVzdWx0X2xlbiA9IGh0b25sKG1zZ19zZWN0WzFdLmlvdl9sZW4pOworCXJtc2cucmV0dmFsID0gaHRvbmwocnYpOworCXRpcGNfY2ZnX3Jlc3BvbmQobXNnX3NlY3QsIDJ1LCBvcmlnKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmNmZ19lbmFibGVfYmVhcmVyKHZvaWQpCit7CisJc3RydWN0IHRpcGNfYmVhcmVyX2NvbmZpZyAqYXJnczsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfQkVBUkVSX0NPTkZJRykpCisJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKKworCWFyZ3MgPSAoc3RydWN0IHRpcGNfYmVhcmVyX2NvbmZpZyAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJaWYgKHRpcGNfZW5hYmxlX2JlYXJlcihhcmdzLT5uYW1lLAorCQkJICAgICAgIG50b2hsKGFyZ3MtPmRldGVjdF9zY29wZSksCisJCQkgICAgICAgbnRvaGwoYXJncy0+cHJpb3JpdHkpKSkKKwkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZygidW5hYmxlIHRvIGVuYWJsZSBiZWFyZXIiKTsKKworCXJldHVybiB0aXBjX2NmZ19yZXBseV9ub25lKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX2Rpc2FibGVfYmVhcmVyKHZvaWQpCit7CisJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9CRUFSRVJfTkFNRSkpCisJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKKworCWlmICh0aXBjX2Rpc2FibGVfYmVhcmVyKChjaGFyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKSkpCisJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoInVuYWJsZSB0byBkaXNhYmxlIGJlYXJlciIpOworCisJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpjZmdfc2V0X293bl9hZGRyKHZvaWQpCit7CisJdTMyIGFkZHI7CisKKwlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX05FVF9BRERSKSkKKwkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOworCisJYWRkciA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKKwlhZGRyID0gbnRvaGwoYWRkcik7CisJaWYgKGFkZHIgPT0gdGlwY19vd25fYWRkcikKKwkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKKwlpZiAoIXRpcGNfYWRkcl9ub2RlX3ZhbGlkKGFkZHIpKQorCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX0lOVkFMSURfVkFMVUUKKwkJCQkJCSAgICIgKG5vZGUgYWRkcmVzcykiKTsKKwlpZiAodGlwY19vd25fYWRkcikKKwkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19OT1RfU1VQUE9SVEVECisJCQkJCQkgICAiIChjYW5ub3QgY2hhbmdlIG5vZGUgYWRkcmVzcyBvbmNlIGFzc2lnbmVkKSIpOworCisJc3Bpbl91bmxvY2tfYmgoJmNvbmZpZ19sb2NrKTsKKwl0aXBjX2NvcmVfc3RvcF9uZXQoKTsKKwl0aXBjX293bl9hZGRyID0gYWRkcjsKKwl0aXBjX2NvcmVfc3RhcnRfbmV0KCk7CisJc3Bpbl9sb2NrX2JoKCZjb25maWdfbG9jayk7CisJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpjZmdfc2V0X3JlbW90ZV9tbmcodm9pZCkKK3sKKwl1MzIgdmFsdWU7CisKKwlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX1VOU0lHTkVEKSkKKwkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOworCisJdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJdGlwY19yZW1vdGVfbWFuYWdlbWVudCA9ICh2YWx1ZSAhPSAwKTsKKwlyZXR1cm4gdGlwY19jZmdfcmVwbHlfbm9uZSgpOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmNmZ19zZXRfbWF4X3B1YmxpY2F0aW9ucyh2b2lkKQoreworCXUzMiB2YWx1ZTsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfVU5TSUdORUQpKQorCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisKKwl2YWx1ZSA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKKwl2YWx1ZSA9IG50b2hsKHZhbHVlKTsKKwlpZiAodmFsdWUgIT0gZGVsaW1pdCh2YWx1ZSwgMSwgNjU1MzUpKQorCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX0lOVkFMSURfVkFMVUUKKwkJCQkJCSAgICIgKG1heCBwdWJsaWNhdGlvbnMgbXVzdCBiZSAxLTY1NTM1KSIpOworCXRpcGNfbWF4X3B1YmxpY2F0aW9ucyA9IHZhbHVlOworCXJldHVybiB0aXBjX2NmZ19yZXBseV9ub25lKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3NldF9tYXhfc3Vic2NyaXB0aW9ucyh2b2lkKQoreworCXUzMiB2YWx1ZTsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfVU5TSUdORUQpKQorCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisKKwl2YWx1ZSA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKKwl2YWx1ZSA9IG50b2hsKHZhbHVlKTsKKwlpZiAodmFsdWUgIT0gZGVsaW1pdCh2YWx1ZSwgMSwgNjU1MzUpKQorCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX0lOVkFMSURfVkFMVUUKKwkJCQkJCSAgICIgKG1heCBzdWJzY3JpcHRpb25zIG11c3QgYmUgMS02NTUzNSIpOworCXRpcGNfbWF4X3N1YnNjcmlwdGlvbnMgPSB2YWx1ZTsKKwlyZXR1cm4gdGlwY19jZmdfcmVwbHlfbm9uZSgpOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmNmZ19zZXRfbWF4X3BvcnRzKHZvaWQpCit7CisJaW50IG9yaWdfbW9kZTsKKwl1MzIgdmFsdWU7CisKKwlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX1VOU0lHTkVEKSkKKwkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOworCXZhbHVlID0gKih1MzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpOworCXZhbHVlID0gbnRvaGwodmFsdWUpOworCWlmICh2YWx1ZSAhPSBkZWxpbWl0KHZhbHVlLCAxMjcsIDY1NTM1KSkKKwkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19JTlZBTElEX1ZBTFVFCisJCQkJCQkgICAiIChtYXggcG9ydHMgbXVzdCBiZSAxMjctNjU1MzUpIik7CisKKwlpZiAodmFsdWUgPT0gdGlwY19tYXhfcG9ydHMpCisJCXJldHVybiB0aXBjX2NmZ19yZXBseV9ub25lKCk7CisKKwlpZiAoYXRvbWljX3JlYWQoJnRpcGNfdXNlcl9jb3VudCkgPiAyKQorCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX05PVF9TVVBQT1JURUQKKwkJCQkJCSAgICIgKGNhbm5vdCBjaGFuZ2UgbWF4IHBvcnRzIHdoaWxlIFRJUEMgdXNlcnMgZXhpc3QpIik7CisKKwlzcGluX3VubG9ja19iaCgmY29uZmlnX2xvY2spOworCW9yaWdfbW9kZSA9IHRpcGNfZ2V0X21vZGUoKTsKKwlpZiAob3JpZ19tb2RlID09IFRJUENfTkVUX01PREUpCisJCXRpcGNfY29yZV9zdG9wX25ldCgpOworCXRpcGNfY29yZV9zdG9wKCk7CisJdGlwY19tYXhfcG9ydHMgPSB2YWx1ZTsKKwl0aXBjX2NvcmVfc3RhcnQoKTsKKwlpZiAob3JpZ19tb2RlID09IFRJUENfTkVUX01PREUpCisJCXRpcGNfY29yZV9zdGFydF9uZXQoKTsKKwlzcGluX2xvY2tfYmgoJmNvbmZpZ19sb2NrKTsKKwlyZXR1cm4gdGlwY19jZmdfcmVwbHlfbm9uZSgpOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnNldF9uZXRfbWF4KGludCB2YWx1ZSwgaW50ICpwYXJhbWV0ZXIpCit7CisJaW50IG9yaWdfbW9kZTsKKworCWlmICh2YWx1ZSAhPSAqcGFyYW1ldGVyKSB7CisJCW9yaWdfbW9kZSA9IHRpcGNfZ2V0X21vZGUoKTsKKwkJaWYgKG9yaWdfbW9kZSA9PSBUSVBDX05FVF9NT0RFKQorCQkJdGlwY19jb3JlX3N0b3BfbmV0KCk7CisJCSpwYXJhbWV0ZXIgPSB2YWx1ZTsKKwkJaWYgKG9yaWdfbW9kZSA9PSBUSVBDX05FVF9NT0RFKQorCQkJdGlwY19jb3JlX3N0YXJ0X25ldCgpOworCX0KKworCXJldHVybiB0aXBjX2NmZ19yZXBseV9ub25lKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3NldF9tYXhfem9uZXModm9pZCkKK3sKKwl1MzIgdmFsdWU7CisKKwlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX1VOU0lHTkVEKSkKKwkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOworCXZhbHVlID0gKih1MzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpOworCXZhbHVlID0gbnRvaGwodmFsdWUpOworCWlmICh2YWx1ZSAhPSBkZWxpbWl0KHZhbHVlLCAxLCAyNTUpKQorCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX0lOVkFMSURfVkFMVUUKKwkJCQkJCSAgICIgKG1heCB6b25lcyBtdXN0IGJlIDEtMjU1KSIpOworCXJldHVybiBzZXRfbmV0X21heCh2YWx1ZSwgJnRpcGNfbWF4X3pvbmVzKTsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpjZmdfc2V0X21heF9jbHVzdGVycyh2b2lkKQoreworCXUzMiB2YWx1ZTsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfVU5TSUdORUQpKQorCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisJdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJaWYgKHZhbHVlICE9IDEpCisJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfTk9UX1NVUFBPUlRFRAorCQkJCQkJICAgIiAobWF4IGNsdXN0ZXJzIGZpeGVkIGF0IDEpIik7CisJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpjZmdfc2V0X21heF9ub2Rlcyh2b2lkKQoreworCXUzMiB2YWx1ZTsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfVU5TSUdORUQpKQorCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisJdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJaWYgKHZhbHVlICE9IGRlbGltaXQodmFsdWUsIDgsIDIwNDcpKQorCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX0lOVkFMSURfVkFMVUUKKwkJCQkJCSAgICIgKG1heCBub2RlcyBtdXN0IGJlIDgtMjA0NykiKTsKKwlyZXR1cm4gc2V0X25ldF9tYXgodmFsdWUsICZ0aXBjX21heF9ub2Rlcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqY2ZnX3NldF9tYXhfc2xhdmVzKHZvaWQpCit7CisJdTMyIHZhbHVlOworCisJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9VTlNJR05FRCkpCisJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKKwl2YWx1ZSA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKKwl2YWx1ZSA9IG50b2hsKHZhbHVlKTsKKwlpZiAodmFsdWUgIT0gMCkKKwkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19OT1RfU1VQUE9SVEVECisJCQkJCQkgICAiIChtYXggc2Vjb25kYXJ5IG5vZGVzIGZpeGVkIGF0IDApIik7CisJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpjZmdfc2V0X25ldGlkKHZvaWQpCit7CisJdTMyIHZhbHVlOworCisJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9VTlNJR05FRCkpCisJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKKwl2YWx1ZSA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKKwl2YWx1ZSA9IG50b2hsKHZhbHVlKTsKKwlpZiAodmFsdWUgIT0gZGVsaW1pdCh2YWx1ZSwgMSwgOTk5OSkpCisJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfSU5WQUxJRF9WQUxVRQorCQkJCQkJICAgIiAobmV0d29yayBpZCBtdXN0IGJlIDEtOTk5OSkiKTsKKworCWlmICh0aXBjX293bl9hZGRyKQorCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX05PVF9TVVBQT1JURUQKKwkJCQkJCSAgICIgKGNhbm5vdCBjaGFuZ2UgbmV0d29yayBpZCBvbmNlIHBhcnQgb2YgbmV0d29yaykiKTsKKwkKKwlyZXR1cm4gc2V0X25ldF9tYXgodmFsdWUsICZ0aXBjX25ldF9pZCk7Cit9CisKK3N0cnVjdCBza19idWZmICp0aXBjX2NmZ19kb19jbWQodTMyIG9yaWdfbm9kZSwgdTE2IGNtZCwgY29uc3Qgdm9pZCAqcmVxdWVzdF9hcmVhLAorCQkJCWludCByZXF1ZXN0X3NwYWNlLCBpbnQgcmVwbHlfaGVhZHJvb20pCit7CisJc3RydWN0IHNrX2J1ZmYgKnJlcF90bHZfYnVmOworCisJc3Bpbl9sb2NrX2JoKCZjb25maWdfbG9jayk7CisKKwkvKiBTYXZlIHJlcXVlc3QgYW5kIHJlcGx5IGRldGFpbHMgaW4gYSB3ZWxsLWtub3duIGxvY2F0aW9uICovCisKKwlyZXFfdGx2X2FyZWEgPSByZXF1ZXN0X2FyZWE7CisJcmVxX3Rsdl9zcGFjZSA9IHJlcXVlc3Rfc3BhY2U7CisJcmVwX2hlYWRyb29tID0gcmVwbHlfaGVhZHJvb207CisKKwkvKiBDaGVjayBjb21tYW5kIGF1dGhvcml6YXRpb24gKi8KKworCWlmIChsaWtlbHkob3JpZ19ub2RlID09IHRpcGNfb3duX2FkZHIpKSB7CisJCS8qIGNvbW1hbmQgaXMgcGVybWl0dGVkICovCisJfSBlbHNlIGlmIChjbWQgPj0gMHg4MDAwKSB7CisJCXJlcF90bHZfYnVmID0gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX05PVF9TVVBQT1JURUQKKwkJCQkJCQkgICIgKGNhbm5vdCBiZSBkb25lIHJlbW90ZWx5KSIpOworCQlnb3RvIGV4aXQ7CisJfSBlbHNlIGlmICghdGlwY19yZW1vdGVfbWFuYWdlbWVudCkgeworCQlyZXBfdGx2X2J1ZiA9IHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19OT19SRU1PVEUpOworCQlnb3RvIGV4aXQ7CisJfQorCWVsc2UgaWYgKGNtZCA+PSAweDQwMDApIHsKKwkJdTMyIGRvbWFpbiA9IDA7CisKKwkJaWYgKCh0aXBjX25hbWV0YmxfdHJhbnNsYXRlKFRJUENfWk1fU1JWLCAwLCAmZG9tYWluKSA9PSAwKSB8fAorCQkgICAgKGRvbWFpbiAhPSBvcmlnX25vZGUpKSB7CisJCQlyZXBfdGx2X2J1ZiA9IHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19OT1RfWk9ORV9NU1RSKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0KKworCS8qIENhbGwgYXBwcm9wcmlhdGUgcHJvY2Vzc2luZyByb3V0aW5lICovCisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVElQQ19DTURfTk9PUDoKKwkJcmVwX3Rsdl9idWYgPSB0aXBjX2NmZ19yZXBseV9ub25lKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfR0VUX05PREVTOgorCQlyZXBfdGx2X2J1ZiA9IHRpcGNfbm9kZV9nZXRfbm9kZXMocmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9HRVRfTElOS1M6CisJCXJlcF90bHZfYnVmID0gdGlwY19ub2RlX2dldF9saW5rcyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UpOworCQlicmVhazsKKwljYXNlIFRJUENfQ01EX1NIT1dfTElOS19TVEFUUzoKKwkJcmVwX3Rsdl9idWYgPSB0aXBjX2xpbmtfY21kX3Nob3dfc3RhdHMocmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9SRVNFVF9MSU5LX1NUQVRTOgorCQlyZXBfdGx2X2J1ZiA9IHRpcGNfbGlua19jbWRfcmVzZXRfc3RhdHMocmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9TSE9XX05BTUVfVEFCTEU6CisJCXJlcF90bHZfYnVmID0gdGlwY19uYW1ldGJsX2dldChyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UpOworCQlicmVhazsKKwljYXNlIFRJUENfQ01EX0dFVF9CRUFSRVJfTkFNRVM6CisJCXJlcF90bHZfYnVmID0gdGlwY19iZWFyZXJfZ2V0X25hbWVzKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfR0VUX01FRElBX05BTUVTOgorCQlyZXBfdGx2X2J1ZiA9IHRpcGNfbWVkaWFfZ2V0X25hbWVzKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfU0hPV19QT1JUUzoKKwkJcmVwX3Rsdl9idWYgPSB0aXBjX3BvcnRfZ2V0X3BvcnRzKCk7CisJCWJyZWFrOworI2lmIDAKKwljYXNlIFRJUENfQ01EX1NIT1dfUE9SVF9TVEFUUzoKKwkJcmVwX3Rsdl9idWYgPSBwb3J0X3Nob3dfc3RhdHMocmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9SRVNFVF9QT1JUX1NUQVRTOgorCQlyZXBfdGx2X2J1ZiA9IHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19OT1RfU1VQUE9SVEVEKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIFRJUENfQ01EX1NFVF9MT0dfU0laRToKKwkJcmVwX3Rsdl9idWYgPSB0aXBjX2xvZ19yZXNpemUocmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9EVU1QX0xPRzoKKwkJcmVwX3Rsdl9idWYgPSB0aXBjX2xvZ19kdW1wKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfU0VUX0xJTktfVE9MOgorCWNhc2UgVElQQ19DTURfU0VUX0xJTktfUFJJOgorCWNhc2UgVElQQ19DTURfU0VUX0xJTktfV0lORE9XOgorCQlyZXBfdGx2X2J1ZiA9IHRpcGNfbGlua19jbWRfY29uZmlnKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgY21kKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9FTkFCTEVfQkVBUkVSOgorCQlyZXBfdGx2X2J1ZiA9IGNmZ19lbmFibGVfYmVhcmVyKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfRElTQUJMRV9CRUFSRVI6CisJCXJlcF90bHZfYnVmID0gY2ZnX2Rpc2FibGVfYmVhcmVyKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfU0VUX05PREVfQUREUjoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfc2V0X293bl9hZGRyKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfU0VUX1JFTU9URV9NTkc6CisJCXJlcF90bHZfYnVmID0gY2ZnX3NldF9yZW1vdGVfbW5nKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfU0VUX01BWF9QT1JUUzoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfc2V0X21heF9wb3J0cygpOworCQlicmVhazsKKwljYXNlIFRJUENfQ01EX1NFVF9NQVhfUFVCTDoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfc2V0X21heF9wdWJsaWNhdGlvbnMoKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9TRVRfTUFYX1NVQlNDUjoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfc2V0X21heF9zdWJzY3JpcHRpb25zKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfU0VUX01BWF9aT05FUzoKKwkJcmVwX3Rsdl9idWYgPSBjZmdfc2V0X21heF96b25lcygpOworCQlicmVhazsKKwljYXNlIFRJUENfQ01EX1NFVF9NQVhfQ0xVU1RFUlM6CisJCXJlcF90bHZfYnVmID0gY2ZnX3NldF9tYXhfY2x1c3RlcnMoKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9TRVRfTUFYX05PREVTOgorCQlyZXBfdGx2X2J1ZiA9IGNmZ19zZXRfbWF4X25vZGVzKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfU0VUX01BWF9TTEFWRVM6CisJCXJlcF90bHZfYnVmID0gY2ZnX3NldF9tYXhfc2xhdmVzKCk7CisJCWJyZWFrOworCWNhc2UgVElQQ19DTURfU0VUX05FVElEOgorCQlyZXBfdGx2X2J1ZiA9IGNmZ19zZXRfbmV0aWQoKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9HRVRfUkVNT1RFX01ORzoKKwkJcmVwX3Rsdl9idWYgPSB0aXBjX2NmZ19yZXBseV91bnNpZ25lZCh0aXBjX3JlbW90ZV9tYW5hZ2VtZW50KTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9HRVRfTUFYX1BPUlRTOgorCQlyZXBfdGx2X2J1ZiA9IHRpcGNfY2ZnX3JlcGx5X3Vuc2lnbmVkKHRpcGNfbWF4X3BvcnRzKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9HRVRfTUFYX1BVQkw6CisJCXJlcF90bHZfYnVmID0gdGlwY19jZmdfcmVwbHlfdW5zaWduZWQodGlwY19tYXhfcHVibGljYXRpb25zKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9HRVRfTUFYX1NVQlNDUjoKKwkJcmVwX3Rsdl9idWYgPSB0aXBjX2NmZ19yZXBseV91bnNpZ25lZCh0aXBjX21heF9zdWJzY3JpcHRpb25zKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9HRVRfTUFYX1pPTkVTOgorCQlyZXBfdGx2X2J1ZiA9IHRpcGNfY2ZnX3JlcGx5X3Vuc2lnbmVkKHRpcGNfbWF4X3pvbmVzKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9HRVRfTUFYX0NMVVNURVJTOgorCQlyZXBfdGx2X2J1ZiA9IHRpcGNfY2ZnX3JlcGx5X3Vuc2lnbmVkKHRpcGNfbWF4X2NsdXN0ZXJzKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9HRVRfTUFYX05PREVTOgorCQlyZXBfdGx2X2J1ZiA9IHRpcGNfY2ZnX3JlcGx5X3Vuc2lnbmVkKHRpcGNfbWF4X25vZGVzKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9HRVRfTUFYX1NMQVZFUzoKKwkJcmVwX3Rsdl9idWYgPSB0aXBjX2NmZ19yZXBseV91bnNpZ25lZCh0aXBjX21heF9zbGF2ZXMpOworCQlicmVhazsKKwljYXNlIFRJUENfQ01EX0dFVF9ORVRJRDoKKwkJcmVwX3Rsdl9idWYgPSB0aXBjX2NmZ19yZXBseV91bnNpZ25lZCh0aXBjX25ldF9pZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlcF90bHZfYnVmID0gTlVMTDsKKwkJYnJlYWs7CisJfQorCisJLyogUmV0dXJuIHJlcGx5IGJ1ZmZlciAqLworZXhpdDoKKwlzcGluX3VubG9ja19iaCgmY29uZmlnX2xvY2spOworCXJldHVybiByZXBfdGx2X2J1ZjsKK30KKworc3RhdGljIHZvaWQgY2ZnX25hbWVkX21zZ19ldmVudCh2b2lkICp1c2VyZGF0YSwKKwkJCQl1MzIgcG9ydF9yZWYsCisJCQkJc3RydWN0IHNrX2J1ZmYgKipidWYsCisJCQkJY29uc3QgdW5jaGFyICptc2csCisJCQkJdTMyIHNpemUsCisJCQkJdTMyIGltcG9ydGFuY2UsIAorCQkJCXN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqb3JpZywKKwkJCQlzdHJ1Y3QgdGlwY19uYW1lX3NlcSBjb25zdCAqZGVzdCkKK3sKKwlzdHJ1Y3QgdGlwY19jZmdfbXNnX2hkciAqcmVxX2hkcjsKKwlzdHJ1Y3QgdGlwY19jZmdfbXNnX2hkciAqcmVwX2hkcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmVwX2J1ZjsKKworCS8qIFZhbGlkYXRlIGNvbmZpZ3VyYXRpb24gbWVzc2FnZSBoZWFkZXIgKGlnbm9yZSBpbnZhbGlkIG1lc3NhZ2UpICovCisKKwlyZXFfaGRyID0gKHN0cnVjdCB0aXBjX2NmZ19tc2dfaGRyICopbXNnOworCWlmICgoc2l6ZSA8IHNpemVvZigqcmVxX2hkcikpIHx8CisJICAgIChzaXplICE9IFRDTV9BTElHTihudG9obChyZXFfaGRyLT50Y21fbGVuKSkpIHx8CisJICAgIChudG9ocyhyZXFfaGRyLT50Y21fZmxhZ3MpICE9IFRDTV9GX1JFUVVFU1QpKSB7CisJCXdhcm4oImRpc2NhcmRlZCBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gbWVzc2FnZVxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBHZW5lcmF0ZSByZXBseSBmb3IgcmVxdWVzdCAoaWYgY2FuJ3QsIHJldHVybiByZXF1ZXN0KSAqLworCisJcmVwX2J1ZiA9IHRpcGNfY2ZnX2RvX2NtZChvcmlnLT5ub2RlLAorCQkJCSAgbnRvaHMocmVxX2hkci0+dGNtX3R5cGUpLCAKKwkJCQkgIG1zZyArIHNpemVvZigqcmVxX2hkciksCisJCQkJICBzaXplIC0gc2l6ZW9mKCpyZXFfaGRyKSwKKwkJCQkgIEJVRl9IRUFEUk9PTSArIE1BWF9IX1NJWkUgKyBzaXplb2YoKnJlcF9oZHIpKTsKKwlpZiAocmVwX2J1ZikgeworCQlza2JfcHVzaChyZXBfYnVmLCBzaXplb2YoKnJlcF9oZHIpKTsKKwkJcmVwX2hkciA9IChzdHJ1Y3QgdGlwY19jZmdfbXNnX2hkciAqKXJlcF9idWYtPmRhdGE7CisJCW1lbWNweShyZXBfaGRyLCByZXFfaGRyLCBzaXplb2YoKnJlcF9oZHIpKTsKKwkJcmVwX2hkci0+dGNtX2xlbiA9IGh0b25sKHJlcF9idWYtPmxlbik7CisJCXJlcF9oZHItPnRjbV9mbGFncyAmPSBodG9ucyh+VENNX0ZfUkVRVUVTVCk7CisJfSBlbHNlIHsKKwkJcmVwX2J1ZiA9ICpidWY7CisJCSpidWYgPSBOVUxMOworCX0KKworCS8qIE5FRUQgVE8gQUREIENPREUgVE8gSEFORExFIEZBSUxFRCBTRU5EIChTVUNIIEFTIENPTkdFU1RJT04pICovCisJdGlwY19zZW5kX2J1ZjJwb3J0KHBvcnRfcmVmLCBvcmlnLCByZXBfYnVmLCByZXBfYnVmLT5sZW4pOworfQorCitpbnQgdGlwY19jZmdfaW5pdCh2b2lkKQoreworCXN0cnVjdCB0aXBjX25hbWVfc2VxIHNlcTsKKwlpbnQgcmVzOworCisJbWVtc2V0KCZtbmcsIDAsIHNpemVvZihtbmcpKTsKKwlJTklUX0xJU1RfSEVBRCgmbW5nLmxpbmtfc3Vic2NyaWJlcnMpOworCisJcmVzID0gdGlwY19hdHRhY2goJm1uZy51c2VyX3JlZiwgMCwgMCk7CisJaWYgKHJlcykKKwkJZ290byBmYWlsZWQ7CisKKwlyZXMgPSB0aXBjX2NyZWF0ZXBvcnQobW5nLnVzZXJfcmVmLCAwLCBUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0UsCisJCQkgICAgICBOVUxMLCBOVUxMLCBOVUxMLAorCQkJICAgICAgTlVMTCwgY2ZnX25hbWVkX21zZ19ldmVudCwgTlVMTCwKKwkJCSAgICAgIE5VTEwsICZtbmcucG9ydF9yZWYpOworCWlmIChyZXMpCisJCWdvdG8gZmFpbGVkOworCisJc2VxLnR5cGUgPSBUSVBDX0NGR19TUlY7CisJc2VxLmxvd2VyID0gc2VxLnVwcGVyID0gdGlwY19vd25fYWRkcjsKKwlyZXMgPSB0aXBjX25hbWV0YmxfcHVibGlzaF9yc3YobW5nLnBvcnRfcmVmLCBUSVBDX1pPTkVfU0NPUEUsICZzZXEpOworCWlmIChyZXMpCisJCWdvdG8gZmFpbGVkOworCisJcmV0dXJuIDA7CisKK2ZhaWxlZDoKKwllcnIoIlVuYWJsZSB0byBjcmVhdGUgY29uZmlndXJhdGlvbiBzZXJ2aWNlXG4iKTsKKwl0aXBjX2RldGFjaChtbmcudXNlcl9yZWYpOworCW1uZy51c2VyX3JlZiA9IDA7CisJcmV0dXJuIHJlczsKK30KKwordm9pZCB0aXBjX2NmZ19zdG9wKHZvaWQpCit7CisJaWYgKG1uZy51c2VyX3JlZikgeworCQl0aXBjX2RldGFjaChtbmcudXNlcl9yZWYpOworCQltbmcudXNlcl9yZWYgPSAwOworCX0KK30KZGlmZiAtLWdpdCBhL25ldC90aXBjL2NvbmZpZy5oIGIvbmV0L3RpcGMvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E3MjhmOTUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9jb25maWcuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogbmV0L3RpcGMvY29uZmlnLmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBjb25maWd1cmF0aW9uIHNlcnZpY2UgY29kZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX0NPTkZJR19ICisjZGVmaW5lIF9USVBDX0NPTkZJR19ICisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisKK3N0cnVjdCBza19idWZmICp0aXBjX2NmZ19yZXBseV9hbGxvYyhpbnQgcGF5bG9hZF9zaXplKTsKK2ludCB0aXBjX2NmZ19hcHBlbmRfdGx2KHN0cnVjdCBza19idWZmICpidWYsIGludCB0bHZfdHlwZSwgCisJCQl2b2lkICp0bHZfZGF0YSwgaW50IHRsdl9kYXRhX3NpemUpOworc3RydWN0IHNrX2J1ZmYgKnRpcGNfY2ZnX3JlcGx5X3Vuc2lnbmVkX3R5cGUodTE2IHRsdl90eXBlLCB1MzIgdmFsdWUpOworc3RydWN0IHNrX2J1ZmYgKnRpcGNfY2ZnX3JlcGx5X3N0cmluZ190eXBlKHUxNiB0bHZfdHlwZSwgY2hhciAqc3RyaW5nKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqdGlwY19jZmdfcmVwbHlfbm9uZSh2b2lkKQoreworCXJldHVybiB0aXBjX2NmZ19yZXBseV9hbGxvYygwKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqdGlwY19jZmdfcmVwbHlfdW5zaWduZWQodTMyIHZhbHVlKQoreworCXJldHVybiB0aXBjX2NmZ19yZXBseV91bnNpZ25lZF90eXBlKFRJUENfVExWX1VOU0lHTkVELCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhjaGFyICpzdHJpbmcpCit7CisJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X3N0cmluZ190eXBlKFRJUENfVExWX0VSUk9SX1NUUklORywgc3RyaW5nKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqdGlwY19jZmdfcmVwbHlfdWx0cmFfc3RyaW5nKGNoYXIgKnN0cmluZykKK3sKKwlyZXR1cm4gdGlwY19jZmdfcmVwbHlfc3RyaW5nX3R5cGUoVElQQ19UTFZfVUxUUkFfU1RSSU5HLCBzdHJpbmcpOworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqdGlwY19jZmdfZG9fY21kKHUzMiBvcmlnX25vZGUsIHUxNiBjbWQsIAorCQkJCWNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UsIAorCQkJCWludCBoZWFkcm9vbSk7CisKK3ZvaWQgdGlwY19jZmdfbGlua19ldmVudCh1MzIgYWRkciwgY2hhciAqbmFtZSwgaW50IHVwKTsKK2ludCAgdGlwY19jZmdfaW5pdCh2b2lkKTsKK3ZvaWQgdGlwY19jZmdfc3RvcCh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9jb3JlLmMgYi9uZXQvdGlwYy9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QwYThlZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL2NvcmUuYwpAQCAtMCwwICsxLDI4NCBAQAorLyoKKyAqIG5ldC90aXBjL2NvcmUuYzogVElQQyBtb2R1bGUgY29kZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAiZGJnLmgiCisjaW5jbHVkZSAicmVmLmgiCisjaW5jbHVkZSAibmV0LmgiCisjaW5jbHVkZSAidXNlcl9yZWcuaCIKKyNpbmNsdWRlICJuYW1lX3RhYmxlLmgiCisjaW5jbHVkZSAic3Vic2NyLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisKK2ludCAgdGlwY19ldGhfbWVkaWFfc3RhcnQodm9pZCk7Cit2b2lkIHRpcGNfZXRoX21lZGlhX3N0b3Aodm9pZCk7CitpbnQgIHRpcGNfaGFuZGxlcl9zdGFydCh2b2lkKTsKK3ZvaWQgdGlwY19oYW5kbGVyX3N0b3Aodm9pZCk7CitpbnQgIHRpcGNfc29ja2V0X2luaXQodm9pZCk7Cit2b2lkIHRpcGNfc29ja2V0X3N0b3Aodm9pZCk7CitpbnQgIHRpcGNfbmV0bGlua19zdGFydCh2b2lkKTsKK3ZvaWQgdGlwY19uZXRsaW5rX3N0b3Aodm9pZCk7CisKKyNkZWZpbmUgTU9EX05BTUUgInRpcGNfc3RhcnQ6ICIKKworI2lmbmRlZiBDT05GSUdfVElQQ19aT05FUworI2RlZmluZSBDT05GSUdfVElQQ19aT05FUyAzCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfVElQQ19DTFVTVEVSUworI2RlZmluZSBDT05GSUdfVElQQ19DTFVTVEVSUyAxCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfVElQQ19OT0RFUworI2RlZmluZSBDT05GSUdfVElQQ19OT0RFUyAyNTUKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19USVBDX1NMQVZFX05PREVTCisjZGVmaW5lIENPTkZJR19USVBDX1NMQVZFX05PREVTIDAKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19USVBDX1BPUlRTCisjZGVmaW5lIENPTkZJR19USVBDX1BPUlRTIDgxOTEKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19USVBDX0xPRworI2RlZmluZSBDT05GSUdfVElQQ19MT0cgMAorI2VuZGlmCisKKy8qIGdsb2JhbCB2YXJpYWJsZXMgdXNlZCBieSBtdWx0aXBsZSBzdWItc3lzdGVtcyB3aXRoaW4gVElQQyAqLworCitpbnQgdGlwY19tb2RlID0gVElQQ19OT1RfUlVOTklORzsKK2ludCB0aXBjX3JhbmRvbTsKK2F0b21pY190IHRpcGNfdXNlcl9jb3VudCA9IEFUT01JQ19JTklUKDApOworCitjb25zdCBjaGFyIHRpcGNfYWxwaGFiZXRbXSA9IAorCSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OV8iOworCisvKiBjb25maWd1cmFibGUgVElQQyBwYXJhbWV0ZXJzICovCisKK3UzMiB0aXBjX293bl9hZGRyOworaW50IHRpcGNfbWF4X3pvbmVzOworaW50IHRpcGNfbWF4X2NsdXN0ZXJzOworaW50IHRpcGNfbWF4X25vZGVzOworaW50IHRpcGNfbWF4X3NsYXZlczsKK2ludCB0aXBjX21heF9wb3J0czsKK2ludCB0aXBjX21heF9zdWJzY3JpcHRpb25zOworaW50IHRpcGNfbWF4X3B1YmxpY2F0aW9uczsKK2ludCB0aXBjX25ldF9pZDsKK2ludCB0aXBjX3JlbW90ZV9tYW5hZ2VtZW50OworCisKK2ludCB0aXBjX2dldF9tb2RlKHZvaWQpCit7CisJcmV0dXJuIHRpcGNfbW9kZTsKK30KKworLyoqCisgKiB0aXBjX2NvcmVfc3RvcF9uZXQgLSBzaHV0IGRvd24gVElQQyBuZXR3b3JraW5nIHN1Yi1zeXN0ZW1zCisgKi8KKwordm9pZCB0aXBjX2NvcmVfc3RvcF9uZXQodm9pZCkKK3sKKwl0aXBjX2V0aF9tZWRpYV9zdG9wKCk7CisJdGlwY19uZXRfc3RvcCgpOworfQorCisvKioKKyAqIHN0YXJ0X25ldCAtIHN0YXJ0IFRJUEMgbmV0d29ya2luZyBzdWItc3lzdGVtcworICovCisKK2ludCB0aXBjX2NvcmVfc3RhcnRfbmV0KHZvaWQpCit7CisJaW50IHJlczsKKworCWlmICgocmVzID0gdGlwY19uZXRfc3RhcnQoKSkgfHwKKwkgICAgKHJlcyA9IHRpcGNfZXRoX21lZGlhX3N0YXJ0KCkpKSB7CisJCXRpcGNfY29yZV9zdG9wX25ldCgpOworCX0KKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIHRpcGNfY29yZV9zdG9wIC0gc3dpdGNoIFRJUEMgZnJvbSBTSU5HTEUgTk9ERSB0byBOT1QgUlVOTklORyBtb2RlCisgKi8KKwordm9pZCB0aXBjX2NvcmVfc3RvcCh2b2lkKQoreworCWlmICh0aXBjX21vZGUgIT0gVElQQ19OT0RFX01PREUpCisJCXJldHVybjsKKworCXRpcGNfbW9kZSA9IFRJUENfTk9UX1JVTk5JTkc7CisKKwl0aXBjX25ldGxpbmtfc3RvcCgpOworCXRpcGNfaGFuZGxlcl9zdG9wKCk7CisJdGlwY19jZmdfc3RvcCgpOworCXRpcGNfc3Vic2NyX3N0b3AoKTsKKwl0aXBjX3JlZ19zdG9wKCk7CisJdGlwY19uYW1ldGJsX3N0b3AoKTsKKwl0aXBjX3JlZl90YWJsZV9zdG9wKCk7CisJdGlwY19zb2NrZXRfc3RvcCgpOworfQorCisvKioKKyAqIHRpcGNfY29yZV9zdGFydCAtIHN3aXRjaCBUSVBDIGZyb20gTk9UIFJVTk5JTkcgdG8gU0lOR0xFIE5PREUgbW9kZQorICovCisKK2ludCB0aXBjX2NvcmVfc3RhcnQodm9pZCkKK3sKKwlpbnQgcmVzOworCisJaWYgKHRpcGNfbW9kZSAhPSBUSVBDX05PVF9SVU5OSU5HKQorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCisJZ2V0X3JhbmRvbV9ieXRlcygmdGlwY19yYW5kb20sIHNpemVvZih0aXBjX3JhbmRvbSkpOworCXRpcGNfbW9kZSA9IFRJUENfTk9ERV9NT0RFOworCisJaWYgKChyZXMgPSB0aXBjX2hhbmRsZXJfc3RhcnQoKSkgfHwgCisJICAgIChyZXMgPSB0aXBjX3JlZl90YWJsZV9pbml0KHRpcGNfbWF4X3BvcnRzICsgdGlwY19tYXhfc3Vic2NyaXB0aW9ucywKKwkJCQkgICAgICAgdGlwY19yYW5kb20pKSB8fAorCSAgICAocmVzID0gdGlwY19yZWdfc3RhcnQoKSkgfHwKKwkgICAgKHJlcyA9IHRpcGNfbmFtZXRibF9pbml0KCkpIHx8CisgICAgICAgICAgICAocmVzID0gdGlwY19rX3NpZ25hbCgoSGFuZGxlcil0aXBjX3N1YnNjcl9zdGFydCwgMCkpIHx8CisJICAgIChyZXMgPSB0aXBjX2tfc2lnbmFsKChIYW5kbGVyKXRpcGNfY2ZnX2luaXQsIDApKSB8fCAKKwkgICAgKHJlcyA9IHRpcGNfbmV0bGlua19zdGFydCgpKSB8fAorCSAgICAocmVzID0gdGlwY19zb2NrZXRfaW5pdCgpKSkgeworCQl0aXBjX2NvcmVfc3RvcCgpOworCX0KKwlyZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IHRpcGNfaW5pdCh2b2lkKQoreworCWludCByZXM7CisKKwl0aXBjX2xvZ19yZWluaXQoQ09ORklHX1RJUENfTE9HKTsKKwlpbmZvKCJBY3RpdmF0ZWQgKGNvbXBpbGVkICIgX19EQVRFX18gIiAiIF9fVElNRV9fICIpXG4iKTsKKworCXRpcGNfb3duX2FkZHIgPSAwOworCXRpcGNfcmVtb3RlX21hbmFnZW1lbnQgPSAxOworCXRpcGNfbWF4X3B1YmxpY2F0aW9ucyA9IDEwMDAwOworCXRpcGNfbWF4X3N1YnNjcmlwdGlvbnMgPSAyMDAwOworCXRpcGNfbWF4X3BvcnRzID0gZGVsaW1pdChDT05GSUdfVElQQ19QT1JUUywgMTI3LCA2NTUzNik7CisJdGlwY19tYXhfem9uZXMgPSBkZWxpbWl0KENPTkZJR19USVBDX1pPTkVTLCAxLCA1MTEpOworCXRpcGNfbWF4X2NsdXN0ZXJzID0gZGVsaW1pdChDT05GSUdfVElQQ19DTFVTVEVSUywgMSwgMSk7CisJdGlwY19tYXhfbm9kZXMgPSBkZWxpbWl0KENPTkZJR19USVBDX05PREVTLCA4LCAyMDQ3KTsKKwl0aXBjX21heF9zbGF2ZXMgPSBkZWxpbWl0KENPTkZJR19USVBDX1NMQVZFX05PREVTLCAwLCAyMDQ3KTsKKwl0aXBjX25ldF9pZCA9IDQ3MTE7CisKKwlpZiAoKHJlcyA9IHRpcGNfY29yZV9zdGFydCgpKSkKKwkJZXJyKCJVbmFibGUgdG8gc3RhcnQgaW4gc2luZ2xlIG5vZGUgbW9kZVxuIik7CisJZWxzZQkKKwkJaW5mbygiU3RhcnRlZCBpbiBzaW5nbGUgbm9kZSBtb2RlXG4iKTsKKyAgICAgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRpcGNfZXhpdCh2b2lkKQoreworCXRpcGNfY29yZV9zdG9wX25ldCgpOworCXRpcGNfY29yZV9zdG9wKCk7CisJaW5mbygiRGVhY3RpdmF0ZWRcbiIpOworCXRpcGNfbG9nX3N0b3AoKTsKK30KKworbW9kdWxlX2luaXQodGlwY19pbml0KTsKK21vZHVsZV9leGl0KHRpcGNfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiVElQQzogVHJhbnNwYXJlbnQgSW50ZXIgUHJvY2VzcyBDb21tdW5pY2F0aW9uIik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CisKKy8qIE5hdGl2ZSBUSVBDIEFQSSBmb3Iga2VybmVsLXNwYWNlIGFwcGxpY2F0aW9ucyAoc2VlIHRpcGMuaCkgKi8KKworRVhQT1JUX1NZTUJPTCh0aXBjX2F0dGFjaCk7CitFWFBPUlRfU1lNQk9MKHRpcGNfZGV0YWNoKTsKK0VYUE9SVF9TWU1CT0wodGlwY19nZXRfYWRkcik7CitFWFBPUlRfU1lNQk9MKHRpcGNfZ2V0X21vZGUpOworRVhQT1JUX1NZTUJPTCh0aXBjX2NyZWF0ZXBvcnQpOworRVhQT1JUX1NZTUJPTCh0aXBjX2RlbGV0ZXBvcnQpOworRVhQT1JUX1NZTUJPTCh0aXBjX293bmlkZW50aXR5KTsKK0VYUE9SVF9TWU1CT0wodGlwY19wb3J0aW1wb3J0YW5jZSk7CitFWFBPUlRfU1lNQk9MKHRpcGNfc2V0X3BvcnRpbXBvcnRhbmNlKTsKK0VYUE9SVF9TWU1CT0wodGlwY19wb3J0dW5yZWxpYWJsZSk7CitFWFBPUlRfU1lNQk9MKHRpcGNfc2V0X3BvcnR1bnJlbGlhYmxlKTsKK0VYUE9SVF9TWU1CT0wodGlwY19wb3J0dW5yZXR1cm5hYmxlKTsKK0VYUE9SVF9TWU1CT0wodGlwY19zZXRfcG9ydHVucmV0dXJuYWJsZSk7CitFWFBPUlRfU1lNQk9MKHRpcGNfcHVibGlzaCk7CitFWFBPUlRfU1lNQk9MKHRpcGNfd2l0aGRyYXcpOworRVhQT1JUX1NZTUJPTCh0aXBjX2Nvbm5lY3QycG9ydCk7CitFWFBPUlRfU1lNQk9MKHRpcGNfZGlzY29ubmVjdCk7CitFWFBPUlRfU1lNQk9MKHRpcGNfc2h1dGRvd24pOworRVhQT1JUX1NZTUJPTCh0aXBjX2lzY29ubmVjdGVkKTsKK0VYUE9SVF9TWU1CT0wodGlwY19wZWVyKTsKK0VYUE9SVF9TWU1CT0wodGlwY19yZWZfdmFsaWQpOworRVhQT1JUX1NZTUJPTCh0aXBjX3NlbmQpOworRVhQT1JUX1NZTUJPTCh0aXBjX3NlbmRfYnVmKTsKK0VYUE9SVF9TWU1CT0wodGlwY19zZW5kMm5hbWUpOworRVhQT1JUX1NZTUJPTCh0aXBjX2ZvcndhcmQybmFtZSk7CitFWFBPUlRfU1lNQk9MKHRpcGNfc2VuZF9idWYybmFtZSk7CitFWFBPUlRfU1lNQk9MKHRpcGNfZm9yd2FyZF9idWYybmFtZSk7CitFWFBPUlRfU1lNQk9MKHRpcGNfc2VuZDJwb3J0KTsKK0VYUE9SVF9TWU1CT0wodGlwY19mb3J3YXJkMnBvcnQpOworRVhQT1JUX1NZTUJPTCh0aXBjX3NlbmRfYnVmMnBvcnQpOworRVhQT1JUX1NZTUJPTCh0aXBjX2ZvcndhcmRfYnVmMnBvcnQpOworRVhQT1JUX1NZTUJPTCh0aXBjX211bHRpY2FzdCk7CisvKiBFWFBPUlRfU1lNQk9MKHRpcGNfbXVsdGljYXN0X2J1Zik7IG5vdCBhdmFpbGFibGUgeWV0ICovCitFWFBPUlRfU1lNQk9MKHRpcGNfaXNwdWJsaXNoZWQpOworRVhQT1JUX1NZTUJPTCh0aXBjX2F2YWlsYWJsZV9ub2Rlcyk7CisKKy8qIFRJUEMgQVBJIGZvciBleHRlcm5hbCBiZWFyZXJzIChzZWUgdGlwY19iZWFyZXIuaCkgKi8KKworRVhQT1JUX1NZTUJPTCh0aXBjX2Jsb2NrX2JlYXJlcik7CitFWFBPUlRfU1lNQk9MKHRpcGNfY29udGludWUpOyAKK0VYUE9SVF9TWU1CT0wodGlwY19kaXNhYmxlX2JlYXJlcik7CitFWFBPUlRfU1lNQk9MKHRpcGNfZW5hYmxlX2JlYXJlcik7CitFWFBPUlRfU1lNQk9MKHRpcGNfcmVjdl9tc2cpOworRVhQT1JUX1NZTUJPTCh0aXBjX3JlZ2lzdGVyX21lZGlhKTsgCisKKy8qIFRJUEMgQVBJIGZvciBleHRlcm5hbCBBUElzIChzZWUgdGlwY19wb3J0LmgpICovCisKK0VYUE9SVF9TWU1CT0wodGlwY19jcmVhdGVwb3J0X3Jhdyk7CitFWFBPUlRfU1lNQk9MKHRpcGNfc2V0X21zZ19vcHRpb24pOworRVhQT1JUX1NZTUJPTCh0aXBjX3JlamVjdF9tc2cpOworRVhQT1JUX1NZTUJPTCh0aXBjX3NlbmRfYnVmX2Zhc3QpOworRVhQT1JUX1NZTUJPTCh0aXBjX2Fja25vd2xlZGdlKTsKK0VYUE9SVF9TWU1CT0wodGlwY19nZXRfcG9ydCk7CitFWFBPUlRfU1lNQk9MKHRpcGNfZ2V0X2hhbmRsZSk7CisKZGlmZiAtLWdpdCBhL25ldC90aXBjL2NvcmUuaCBiL25ldC90aXBjL2NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjJlOGIyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvY29yZS5oCkBAIC0wLDAgKzEsMzIxIEBACisvKgorICogbmV0L3RpcGMvY29yZS5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgZ2xvYmFsIGRlY2xhcmF0aW9ucworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX0NPUkVfSAorI2RlZmluZSBfVElQQ19DT1JFX0gKKworI2luY2x1ZGUgPGxpbnV4L3RpcGMuaD4KKyNpbmNsdWRlIDxsaW51eC90aXBjX2NvbmZpZy5oPgorI2luY2x1ZGUgPG5ldC90aXBjL3RpcGNfbXNnLmg+CisjaW5jbHVkZSA8bmV0L3RpcGMvdGlwY19wb3J0Lmg+CisjaW5jbHVkZSA8bmV0L3RpcGMvdGlwY19iZWFyZXIuaD4KKyNpbmNsdWRlIDxuZXQvdGlwYy90aXBjLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vaGFyZGlycS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CQorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKy8qCisgKiBUSVBDIGRlYnVnZ2luZyBjb2RlCisgKi8KKworI2RlZmluZSBhc3NlcnQoaSkgIEJVR19PTighKGkpKQorCitzdHJ1Y3QgdGlwY19tc2c7CitleHRlcm4gc3RydWN0IHByaW50X2J1ZiAqVElQQ19DT05TLCAqVElQQ19MT0c7CitleHRlcm4gc3RydWN0IHByaW50X2J1ZiAqVElQQ19URUUoc3RydWN0IHByaW50X2J1ZiAqLCBzdHJ1Y3QgcHJpbnRfYnVmICopOwordm9pZCB0aXBjX21zZ19wcmludChzdHJ1Y3QgcHJpbnRfYnVmKixzdHJ1Y3QgdGlwY19tc2cgKixjb25zdCBjaGFyKik7Cit2b2lkIHRpcGNfcHJpbnRmKHN0cnVjdCBwcmludF9idWYgKiwgY29uc3QgY2hhciAqZm10LCAuLi4pOwordm9pZCB0aXBjX2R1bXAoc3RydWN0IHByaW50X2J1ZiosY29uc3QgY2hhciAqZm10LCAuLi4pOworCisjaWZkZWYgQ09ORklHX1RJUENfREVCVUcKKworLyoKKyAqIFRJUEMgZGVidWcgc3VwcG9ydCBpbmNsdWRlZDoKKyAqIC0gc3lzdGVtIG1lc3NhZ2VzIGFyZSBwcmludGVkIHRvIFRJUENfT1VUUFVUIHByaW50IGJ1ZmZlcgorICogLSBkZWJ1ZyBtZXNzYWdlcyBhcmUgcHJpbnRlZCB0byBEQkdfT1VUUFVUIHByaW50IGJ1ZmZlcgorICovCisKKyNkZWZpbmUgZXJyKGZtdCwgYXJnLi4uKSAgdGlwY19wcmludGYoVElQQ19PVVRQVVQsIEtFUk5fRVJSICJUSVBDOiAiIGZtdCwgIyMgYXJnKQorI2RlZmluZSB3YXJuKGZtdCwgYXJnLi4uKSB0aXBjX3ByaW50ZihUSVBDX09VVFBVVCwgS0VSTl9XQVJOSU5HICJUSVBDOiAiIGZtdCwgIyMgYXJnKQorI2RlZmluZSBpbmZvKGZtdCwgYXJnLi4uKSB0aXBjX3ByaW50ZihUSVBDX09VVFBVVCwgS0VSTl9OT1RJQ0UgIlRJUEM6ICIgZm10LCAjIyBhcmcpCisKKyNkZWZpbmUgZGJnKGZtdCwgYXJnLi4uKSAgZG8ge2lmIChEQkdfT1VUUFVUKSB0aXBjX3ByaW50ZihEQkdfT1VUUFVULCBmbXQsICMjIGFyZyk7fSB3aGlsZSgwKQorI2RlZmluZSBtc2dfZGJnKG1zZywgdHh0KSBkbyB7aWYgKERCR19PVVRQVVQpIHRpcGNfbXNnX3ByaW50KERCR19PVVRQVVQsIG1zZywgdHh0KTt9IHdoaWxlKDApCisjZGVmaW5lIGR1bXAoZm10LCBhcmcuLi4pIGRvIHtpZiAoREJHX09VVFBVVCkgdGlwY19kdW1wKERCR19PVVRQVVQsIGZtdCwgIyNhcmcpO30gd2hpbGUoMCkKKworCisvKgkKKyAqIEJ5IGRlZmF1bHQsIFRJUENfT1VUUFVUIGlzIGRlZmluZWQgdG8gYmUgc3lzdGVtIGNvbnNvbGUgYW5kIFRJUEMgbG9nIGJ1ZmZlciwKKyAqIHdoaWxlIERCR19PVVRQVVQgaXMgdGhlIG51bGwgcHJpbnQgYnVmZmVyLiAgVGhlc2UgZGVmYXVsdHMgY2FuIGJlIGNoYW5nZWQKKyAqIGhlcmUsIG9yIG9uIGEgcGVyIC5jIGZpbGUgYmFzaXMsIGJ5IHJlZGVmaW5pbmcgdGhlc2Ugc3ltYm9scy4gIFRoZSBmb2xsb3dpbmcKKyAqIHByaW50IGJ1ZmZlciBvcHRpb25zIGFyZSBhdmFpbGFibGU6CisgKgorICogTlVMTAkJCQk6IE91dHB1dCB0byBudWxsIHByaW50IGJ1ZmZlciAoaS5lLiBwcmludCBub3doZXJlKQorICogVElQQ19DT05TCQkJOiBPdXRwdXQgdG8gc3lzdGVtIGNvbnNvbGUKKyAqIFRJUENfTE9HCQkJOiBPdXRwdXQgdG8gVElQQyBsb2cgYnVmZmVyIAorICogJmJ1ZgkJCQk6IE91dHB1dCB0byB1c2VyLWRlZmluZWQgYnVmZmVyIChzdHJ1Y3QgcHJpbnRfYnVmICopCisgKiBUSVBDX1RFRSgmYnVmX2EsJmJ1Zl9iKQk6IE91dHB1dCB0byB0d28gcHJpbnQgYnVmZmVycyAoZWcuIFRJUENfVEVFKFRJUENfQ09OUyxUSVBDX0xPRykgKQorICovCisKKyNpZm5kZWYgVElQQ19PVVRQVVQKKyNkZWZpbmUgVElQQ19PVVRQVVQgVElQQ19URUUoVElQQ19DT05TLFRJUENfTE9HKQorI2VuZGlmCisKKyNpZm5kZWYgREJHX09VVFBVVAorI2RlZmluZSBEQkdfT1VUUFVUIE5VTEwKKyNlbmRpZgorCisjZWxzZQorCisjaWZuZGVmIERCR19PVVRQVVQKKyNkZWZpbmUgREJHX09VVFBVVCBOVUxMCisjZW5kaWYKKworLyoKKyAqIFRJUEMgZGVidWcgc3VwcG9ydCBub3QgaW5jbHVkZWQ6CisgKiAtIHN5c3RlbSBtZXNzYWdlcyBhcmUgcHJpbnRlZCB0byBzeXN0ZW0gY29uc29sZQorICogLSBkZWJ1ZyBtZXNzYWdlcyBhcmUgbm90IHByaW50ZWQKKyAqLworCisjZGVmaW5lIGVycihmbXQsIGFyZy4uLikgIHByaW50ayhLRVJOX0VSUiAiVElQQzogIiBmbXQgLCAjIyBhcmcpCisjZGVmaW5lIGluZm8oZm10LCBhcmcuLi4pIHByaW50ayhLRVJOX0lORk8gIlRJUEM6ICIgZm10ICwgIyMgYXJnKQorI2RlZmluZSB3YXJuKGZtdCwgYXJnLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HICJUSVBDOiAiIGZtdCAsICMjIGFyZykKKworI2RlZmluZSBkYmcoZm10LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBtc2dfZGJnKG1zZyx0eHQpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkdW1wKGZtdCxhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQorCisjZW5kaWYJCQkgIAorCisKKy8qIAorICogVElQQy1zcGVjaWZpYyBlcnJvciBjb2RlcworICovCisKKyNkZWZpbmUgRUxJTktDT05HIEVBR0FJTgkvKiBsaW5rIGNvbmdlc3Rpb24gPD0+IHJlc291cmNlIHVuYXZhaWxhYmxlICovCisKKy8qCisgKiBHbG9iYWwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMKKyAqLworCitleHRlcm4gdTMyIHRpcGNfb3duX2FkZHI7CitleHRlcm4gaW50IHRpcGNfbWF4X3pvbmVzOworZXh0ZXJuIGludCB0aXBjX21heF9jbHVzdGVyczsKK2V4dGVybiBpbnQgdGlwY19tYXhfbm9kZXM7CitleHRlcm4gaW50IHRpcGNfbWF4X3NsYXZlczsKK2V4dGVybiBpbnQgdGlwY19tYXhfcG9ydHM7CitleHRlcm4gaW50IHRpcGNfbWF4X3N1YnNjcmlwdGlvbnM7CitleHRlcm4gaW50IHRpcGNfbWF4X3B1YmxpY2F0aW9uczsKK2V4dGVybiBpbnQgdGlwY19uZXRfaWQ7CitleHRlcm4gaW50IHRpcGNfcmVtb3RlX21hbmFnZW1lbnQ7CisKKy8qCisgKiBPdGhlciBnbG9iYWwgdmFyaWFibGVzCisgKi8KKworZXh0ZXJuIGludCB0aXBjX21vZGU7CitleHRlcm4gaW50IHRpcGNfcmFuZG9tOworZXh0ZXJuIGNvbnN0IGNoYXIgdGlwY19hbHBoYWJldFtdOworZXh0ZXJuIGF0b21pY190IHRpcGNfdXNlcl9jb3VudDsKKworCisvKgorICogUm91dGluZXMgYXZhaWxhYmxlIHRvIHByaXZpbGVnZWQgc3Vic3lzdGVtcworICovCisKK2V4dGVybiBpbnQgIHRpcGNfY29yZV9zdGFydCh2b2lkKTsKK2V4dGVybiB2b2lkIHRpcGNfY29yZV9zdG9wKHZvaWQpOworZXh0ZXJuIGludCAgdGlwY19jb3JlX3N0YXJ0X25ldCh2b2lkKTsKK2V4dGVybiB2b2lkIHRpcGNfY29yZV9zdG9wX25ldCh2b2lkKTsKKworc3RhdGljIGlubGluZSBpbnQgZGVsaW1pdChpbnQgdmFsLCBpbnQgbWluLCBpbnQgbWF4KQoreworCWlmICh2YWwgPiBtYXgpCisJCXJldHVybiBtYXg7CisJaWYgKHZhbCA8IG1pbikKKwkJcmV0dXJuIG1pbjsKKwlyZXR1cm4gdmFsOworfQorCisKKy8qCisgKiBUSVBDIHRpbWVyIGFuZCBzaWduYWwgY29kZQorICovCisKK3R5cGVkZWYgdm9pZCAoKkhhbmRsZXIpICh1bnNpZ25lZCBsb25nKTsKKwordTMyIHRpcGNfa19zaWduYWwoSGFuZGxlciByb3V0aW5lLCB1bnNpZ25lZCBsb25nIGFyZ3VtZW50KTsKKworLyoqCisgKiBrX2luaXRfdGltZXIgLSBpbml0aWFsaXplIGEgdGltZXIKKyAqIEB0aW1lcjogcG9pbnRlciB0byB0aW1lciBzdHJ1Y3R1cmUKKyAqIEByb3V0aW5lOiBwb2ludGVyIHRvIHJvdXRpbmUgdG8gaW52b2tlIHdoZW4gdGltZXIgZXhwaXJlcworICogQGFyZ3VtZW50OiB2YWx1ZSB0byBwYXNzIHRvIHJvdXRpbmUgd2hlbiB0aW1lciBleHBpcmVzCisgKiAKKyAqIFRpbWVyIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSAoYW5kIHRlcm1pbmF0ZWQgd2hlbiBubyBsb25nZXIgbmVlZGVkKS4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQga19pbml0X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwgSGFuZGxlciByb3V0aW5lLCAKKwkJCQl1bnNpZ25lZCBsb25nIGFyZ3VtZW50KQoreworCWRiZygiaW5pdGlhbGl6aW5nIHRpbWVyICVwXG4iLCB0aW1lcik7CisJaW5pdF90aW1lcih0aW1lcik7CisJdGltZXItPmZ1bmN0aW9uID0gcm91dGluZTsKKwl0aW1lci0+ZGF0YSA9IGFyZ3VtZW50OworfQorCisvKioKKyAqIGtfc3RhcnRfdGltZXIgLSBzdGFydCBhIHRpbWVyCisgKiBAdGltZXI6IHBvaW50ZXIgdG8gdGltZXIgc3RydWN0dXJlCisgKiBAbXNlYzogdGltZSB0byBkZWxheSAoaW4gbXMpCisgKiAKKyAqIFNjaGVkdWxlcyBhIHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgdGltZXIgZm9yIGxhdGVyIGV4ZWN1dGlvbi4KKyAqIElmIHRpbWVyIGlzIGFscmVhZHkgcnVubmluZywgdGhlIG5ldyB0aW1lb3V0IG92ZXJyaWRlcyB0aGUgcHJldmlvdXMgcmVxdWVzdC4KKyAqIAorICogVG8gZW5zdXJlIHRoZSB0aW1lciBkb2Vzbid0IGV4cGlyZSBiZWZvcmUgdGhlIHNwZWNpZmllZCBkZWxheSBlbGFwc2VzLAorICogdGhlIGFtb3VudCBvZiBkZWxheSBpcyByb3VuZGVkIHVwIHdoZW4gY29udmVydGluZyB0byB0aGUgamlmZmllcworICogdGhlbiBhbiBhZGRpdGlvbmFsIGppZmZ5IGlzIGFkZGVkIHRvIGFjY291bnQgZm9yIHRoZSBmYWN0IHRoYXQgCisgKiB0aGUgc3RhcnRpbmcgdGltZSBtYXkgYmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgY3VycmVudCBqaWZmeS4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQga19zdGFydF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIsIHVuc2lnbmVkIGxvbmcgbXNlYykKK3sKKwlkYmcoInN0YXJ0aW5nIHRpbWVyICVwIGZvciAldVxuIiwgdGltZXIsIG1zZWMpOworCW1vZF90aW1lcih0aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMobXNlYykgKyAxKTsKK30KKworLyoqCisgKiBrX2NhbmNlbF90aW1lciAtIGNhbmNlbCBhIHRpbWVyCisgKiBAdGltZXI6IHBvaW50ZXIgdG8gdGltZXIgc3RydWN0dXJlCisgKiAKKyAqIENhbmNlbHMgYSBwcmV2aW91c2x5IGluaXRpYWxpemVkIHRpbWVyLiAgCisgKiBDYW4gYmUgY2FsbGVkIHNhZmVseSBldmVuIGlmIHRoZSB0aW1lciBpcyBhbHJlYWR5IGluYWN0aXZlLgorICogCisgKiBXQVJOSU5HOiBNdXN0IG5vdCBiZSBjYWxsZWQgd2hlbiBob2xkaW5nIGxvY2tzIHJlcXVpcmVkIGJ5IHRoZSB0aW1lcidzCisgKiAgICAgICAgICB0aW1lb3V0IHJvdXRpbmUsIG90aGVyd2lzZSBkZWFkbG9jayBjYW4gb2NjdXIgb24gU01QIHN5c3RlbXMhCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGtfY2FuY2VsX3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKwlkYmcoImNhbmNlbGxpbmcgdGltZXIgJXBcbiIsIHRpbWVyKTsKKwlkZWxfdGltZXJfc3luYyh0aW1lcik7Cit9CisKKy8qKgorICoga190ZXJtX3RpbWVyIC0gdGVybWluYXRlIGEgdGltZXIKKyAqIEB0aW1lcjogcG9pbnRlciB0byB0aW1lciBzdHJ1Y3R1cmUKKyAqIAorICogUHJldmVudHMgZnVydGhlciB1c2Ugb2YgYSBwcmV2aW91c2x5IGluaXRpYWxpemVkIHRpbWVyLgorICogCisgKiBXQVJOSU5HOiBDYWxsZXIgbXVzdCBlbnN1cmUgdGltZXIgaXNuJ3QgY3VycmVudGx5IHJ1bm5pbmcuCisgKiAKKyAqIChEbyBub3QgImVuaGFuY2UiIHRoaXMgcm91dGluZSB0byBhdXRvbWF0aWNhbGx5IGNhbmNlbCBhbiBhY3RpdmUgdGltZXIsCisgKiBvdGhlcndpc2UgZGVhZGxvY2sgY2FuIGFyaXNlIHdoZW4gYSB0aW1lb3V0IHJvdXRpbmUgY2FsbHMga190ZXJtX3RpbWVyLikKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQga190ZXJtX3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKwlkYmcoInRlcm1pbmF0aW5nIHRpbWVyICVwXG4iLCB0aW1lcik7Cit9CisKKworLyoKKyAqIFRJUEMgbWVzc2FnZSBidWZmZXIgY29kZQorICoKKyAqIFRJUEMgbWVzc2FnZSBidWZmZXIgaGVhZHJvb20gbGVhdmVzIHJvb20gZm9yIDE0IGJ5dGUgRXRoZXJuZXQgaGVhZGVyLCAKKyAqIHdoaWxlIGVuc3VyaW5nIFRJUEMgaGVhZGVyIGlzIHdvcmQgYWxpZ25lZCBmb3IgcXVpY2tlciBhY2Nlc3MKKyAqLworCisjZGVmaW5lIEJVRl9IRUFEUk9PTSAxNnUgCisKK3N0cnVjdCB0aXBjX3NrYl9jYiB7CisJdm9pZCAqaGFuZGxlOworfTsKKworI2RlZmluZSBUSVBDX1NLQl9DQihfX3NrYikgKChzdHJ1Y3QgdGlwY19za2JfY2IgKikmKChfX3NrYiktPmNiWzBdKSkKKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0aXBjX21zZyAqYnVmX21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc3RydWN0IHRpcGNfbXNnICopc2tiLT5kYXRhOworfQorCisvKioKKyAqIGJ1Zl9hY3F1aXJlIC0gY3JlYXRlcyBhIFRJUEMgbWVzc2FnZSBidWZmZXIKKyAqIEBzaXplOiBtZXNzYWdlIHNpemUgKGluY2x1ZGluZyBUSVBDIGhlYWRlcikKKyAqCisgKiBSZXR1cm5zIGEgbmV3IGJ1ZmZlci4gIFNwYWNlIGlzIHJlc2VydmVkIGZvciBhIGRhdGEgbGluayBoZWFkZXIuCisgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqYnVmX2FjcXVpcmUodTMyIHNpemUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBpbnQgYnVmX3NpemUgPSAoQlVGX0hFQURST09NICsgc2l6ZSArIDMpICYgfjN1OworCisJc2tiID0gYWxsb2Nfc2tiKGJ1Zl9zaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoc2tiKSB7CisJCXNrYl9yZXNlcnZlKHNrYiwgQlVGX0hFQURST09NKTsKKwkJc2tiX3B1dChza2IsIHNpemUpOworCQlza2ItPm5leHQgPSBOVUxMOworCX0KKwlyZXR1cm4gc2tiOworfQorCisvKioKKyAqIGJ1Zl9kaXNjYXJkIC0gZnJlZXMgYSBUSVBDIG1lc3NhZ2UgYnVmZmVyCisgKiBAc2tiOiBtZXNzYWdlIGJ1ZmZlcgorICoKKyAqIEZyZWVzIGEgbmV3IGJ1ZmZlci4gIElmIHBhc3NlZCBOVUxMLCBqdXN0IHJldHVybnMuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGJ1Zl9kaXNjYXJkKHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKGxpa2VseShza2IgIT0gTlVMTCkpCisJCWtmcmVlX3NrYihza2IpOworfQorCisjZW5kaWYJCQkKZGlmZiAtLWdpdCBhL25ldC90aXBjL2RiZy5jIGIvbmV0L3RpcGMvZGJnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY0YmVlZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL2RiZy5jCkBAIC0wLDAgKzEsMzk1IEBACisvKgorICogbmV0L3RpcGMvZGJnLmM6IFRJUEMgcHJpbnQgYnVmZmVyIHJvdXRpbmVzIGZvciBkZWJ1Z2dpZ24KKyAqIAorICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJkYmcuaCIKKworI2RlZmluZSBNQVhfU1RSSU5HIDUxMgorCitzdGF0aWMgY2hhciBwcmludF9zdHJpbmdbTUFYX1NUUklOR107CitzdGF0aWMgc3BpbmxvY2tfdCBwcmludF9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCitzdGF0aWMgc3RydWN0IHByaW50X2J1ZiBjb25zX2J1ZiA9IHsgTlVMTCwgMCwgTlVMTCwgTlVMTCB9Oworc3RydWN0IHByaW50X2J1ZiAqVElQQ19DT05TID0gJmNvbnNfYnVmOworCitzdGF0aWMgc3RydWN0IHByaW50X2J1ZiBsb2dfYnVmID0geyBOVUxMLCAwLCBOVUxMLCBOVUxMIH07CitzdHJ1Y3QgcHJpbnRfYnVmICpUSVBDX0xPRyA9ICZsb2dfYnVmOworCisKKyNkZWZpbmUgRk9STUFUKFBUUixMRU4sRk1UKSBcCit7XAorICAgICAgIHZhX2xpc3QgYXJncztcCisgICAgICAgdmFfc3RhcnQoYXJncywgRk1UKTtcCisgICAgICAgTEVOID0gdnNwcmludGYoUFRSLCBGTVQsIGFyZ3MpO1wKKyAgICAgICB2YV9lbmQoYXJncyk7XAorICAgICAgICooUFRSICsgTEVOKSA9ICdcMCc7XAorfQorCisvKgorICogTG9ja2luZyBwb2xpY3kgd2hlbiB1c2luZyBwcmludCBidWZmZXJzLgorICoKKyAqIDEpIFJvdXRpbmVzIG9mIHRoZSBmb3JtIHByaW50YnVmX1hYWCgpIHJlbHkgb24gdGhlIGNhbGxlciB0byBwcmV2ZW50CisgKiAgICBzaW11bHRhbmVvdXMgdXNlIG9mIHRoZSBwcmludCBidWZmZXIocykgYmVpbmcgbWFuaXB1bGF0ZWQuCisgKiAyKSB0aXBjX3ByaW50ZigpIHVzZXMgJ3ByaW50X2xvY2snIHRvIHByZXZlbnQgc2ltdWx0YW5lb3VzIHVzZSBvZgorICogICAgJ3ByaW50X3N0cmluZycgYW5kIHRvIHByb3RlY3QgaXRzIHByaW50IGJ1ZmZlcihzKS4KKyAqIDMpIFRJUENfVEVFKCkgdXNlcyAncHJpbnRfbG9jaycgdG8gcHJvdGVjdCBpdHMgcHJpbnQgYnVmZmVyKHMpLgorICogNCkgUm91dGluZXMgb2YgdGhlIGZvcm0gbG9nX1hYWCgpIHVzZXMgJ3ByaW50X2xvY2snIHRvIHByb3RlY3QgVElQQ19MT0cuCisgKi8KKworLyoqCisgKiB0aXBjX3ByaW50YnVmX2luaXQgLSBpbml0aWFsaXplIHByaW50IGJ1ZmZlciB0byBlbXB0eQorICovCisKK3ZvaWQgdGlwY19wcmludGJ1Zl9pbml0KHN0cnVjdCBwcmludF9idWYgKnBiLCBjaGFyICpyYXcsIHUzMiBzeikKK3sKKwlpZiAoIXBiIHx8ICFyYXcgfHwgKHN6IDwgKE1BWF9TVFJJTkcgKyAxKSkpCisJCXJldHVybjsKKworCXBiLT5jcnMgPSBwYi0+YnVmID0gcmF3OworCXBiLT5zaXplID0gc3o7CisJcGItPm5leHQgPSAwOworCXBiLT5idWZbMF0gPSAwOworCXBiLT5idWZbc3otMV0gPSB+MDsKK30KKworLyoqCisgKiB0aXBjX3ByaW50YnVmX3Jlc2V0IC0gcmVpbml0aWFsaXplIHByaW50IGJ1ZmZlciB0byBlbXB0eSBzdGF0ZQorICovCisKK3ZvaWQgdGlwY19wcmludGJ1Zl9yZXNldChzdHJ1Y3QgcHJpbnRfYnVmICpwYikKK3sKKwlpZiAocGIgJiYgcGItPmJ1ZikKKwkJdGlwY19wcmludGJ1Zl9pbml0KHBiLCBwYi0+YnVmLCBwYi0+c2l6ZSk7Cit9CisKKy8qKgorICogdGlwY19wcmludGJ1Zl9lbXB0eSAtIHRlc3QgaWYgcHJpbnQgYnVmZmVyIGlzIGluIGVtcHR5IHN0YXRlCisgKi8KKworaW50IHRpcGNfcHJpbnRidWZfZW1wdHkoc3RydWN0IHByaW50X2J1ZiAqcGIpCit7CisJcmV0dXJuICghcGIgfHwgIXBiLT5idWYgfHwgKHBiLT5jcnMgPT0gcGItPmJ1ZikpOworfQorCisvKioKKyAqIHRpcGNfcHJpbnRidWZfdmFsaWRhdGUgLSBjaGVjayBmb3IgcHJpbnQgYnVmZmVyIG92ZXJmbG93CisgKiAKKyAqIFZlcmlmaWVzIHRoYXQgYSBwcmludCBidWZmZXIgaGFzIGNhcHR1cmVkIGFsbCBkYXRhIHdyaXR0ZW4gdG8gaXQuIAorICogSWYgZGF0YSBoYXMgYmVlbiBsb3N0LCBsaW5lYXJpemUgYnVmZmVyIGFuZCBwcmVwZW5kIGFuIGVycm9yIG1lc3NhZ2UKKyAqIAorICogUmV0dXJucyBsZW5ndGggb2YgcHJpbnQgYnVmZmVyIGRhdGEgc3RyaW5nIChpbmNsdWRpbmcgdHJhaWxpbmcgTlVMTCkKKyAqLworCitpbnQgdGlwY19wcmludGJ1Zl92YWxpZGF0ZShzdHJ1Y3QgcHJpbnRfYnVmICpwYikKK3sKKyAgICAgICAgY2hhciAqZXJyID0gIiAgICAgICAgICAgICAqKiogUFJJTlQgQlVGRkVSIFdSQVBQRUQgQVJPVU5EICoqKlxuIjsKKyAgICAgICAgY2hhciAqY3BfYnVmOworICAgICAgICBzdHJ1Y3QgcHJpbnRfYnVmIGNiOworCisJaWYgKCFwYiB8fCAhcGItPmJ1ZikKKwkJcmV0dXJuIDA7CisKKwlpZiAocGItPmJ1ZltwYi0+c2l6ZSAtIDFdID09ICdcMCcpIHsKKyAgICAgICAgICAgICAgICBjcF9idWYgPSBrbWFsbG9jKHBiLT5zaXplLCBHRlBfQVRPTUlDKTsKKyAgICAgICAgICAgICAgICBpZiAoY3BfYnVmICE9IE5VTEwpeworICAgICAgICAgICAgICAgICAgICAgICAgdGlwY19wcmludGJ1Zl9pbml0KCZjYiwgY3BfYnVmLCBwYi0+c2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aXBjX3ByaW50YnVmX21vdmUoJmNiLCBwYik7CisgICAgICAgICAgICAgICAgICAgICAgICB0aXBjX3ByaW50YnVmX21vdmUocGIsICZjYik7CisgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShjcF9idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBiLT5idWYsIGVyciwgc3RybGVuKGVycikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aXBjX3ByaW50YnVmX3Jlc2V0KHBiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpcGNfcHJpbnRmKHBiLCBlcnIpOworICAgICAgICAgICAgICAgIH0KKwl9CisJcmV0dXJuIChwYi0+Y3JzIC0gcGItPmJ1ZiArIDEpOworfQorCisvKioKKyAqIHRpcGNfcHJpbnRidWZfbW92ZSAtIG1vdmUgcHJpbnQgYnVmZmVyIGNvbnRlbnRzIHRvIGFub3RoZXIgcHJpbnQgYnVmZmVyCisgKiAKKyAqIEN1cnJlbnQgY29udGVudHMgb2YgZGVzdGluYXRpb24gcHJpbnQgYnVmZmVyIChpZiBhbnkpIGFyZSBkaXNjYXJkZWQuCisgKiBTb3VyY2UgcHJpbnQgYnVmZmVyIGJlY29tZXMgZW1wdHkgaWYgYSBzdWNjZXNzZnVsIG1vdmUgb2NjdXJzLgorICovCisKK3ZvaWQgdGlwY19wcmludGJ1Zl9tb3ZlKHN0cnVjdCBwcmludF9idWYgKnBiX3RvLCBzdHJ1Y3QgcHJpbnRfYnVmICpwYl9mcm9tKQoreworCWludCBsZW47CisKKwkvKiBIYW5kbGUgdGhlIGNhc2VzIHdoZXJlIGNvbnRlbnRzIGNhbid0IGJlIG1vdmVkICovCisKKwlpZiAoIXBiX3RvIHx8ICFwYl90by0+YnVmKQorCQlyZXR1cm47CisKKwlpZiAoIXBiX2Zyb20gfHwgIXBiX2Zyb20tPmJ1ZikgeworCQl0aXBjX3ByaW50YnVmX3Jlc2V0KHBiX3RvKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwYl90by0+c2l6ZSA8IHBiX2Zyb20tPnNpemUpIHsKKwkJdGlwY19wcmludGJ1Zl9yZXNldChwYl90byk7CisJCXRpcGNfcHJpbnRmKHBiX3RvLCAiKioqIFBSSU5UIEJVRkZFUiBPVkVSRkxPVyAqKioiKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENvcHkgZGF0YSBmcm9tIGNoYXIgYWZ0ZXIgY3Vyc29yIHRvIGVuZCAoaWYgdXNlZCkgKi8KKwlsZW4gPSBwYl9mcm9tLT5idWYgKyBwYl9mcm9tLT5zaXplIC0gcGJfZnJvbS0+Y3JzIC0gMjsKKwlpZiAoKHBiX2Zyb20tPmJ1ZltwYl9mcm9tLT5zaXplLTFdID09IDApICYmIChsZW4gPiAwKSkgeworCQlzdHJjcHkocGJfdG8tPmJ1ZiwgcGJfZnJvbS0+Y3JzICsgMSk7CisJCXBiX3RvLT5jcnMgPSBwYl90by0+YnVmICsgbGVuOworCX0gZWxzZQorCQlwYl90by0+Y3JzID0gcGJfdG8tPmJ1ZjsKKworCS8qIENvcHkgZGF0YSBmcm9tIHN0YXJ0IHRvIGN1cnNvciAoYWx3YXlzKSAqLworCWxlbiA9IHBiX2Zyb20tPmNycyAtIHBiX2Zyb20tPmJ1ZjsKKwlzdHJjcHkocGJfdG8tPmNycywgcGJfZnJvbS0+YnVmKTsKKwlwYl90by0+Y3JzICs9IGxlbjsKKworCXRpcGNfcHJpbnRidWZfcmVzZXQocGJfZnJvbSk7Cit9CisKKy8qKgorICogdGlwY19wcmludGYgLSBhcHBlbmQgZm9ybWF0dGVkIG91dHB1dCB0byBwcmludCBidWZmZXIgY2hhaW4KKyAqLworCit2b2lkIHRpcGNfcHJpbnRmKHN0cnVjdCBwcmludF9idWYgKnBiLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlpbnQgY2hhcnNfdG9fYWRkOworCWludCBjaGFyc19sZWZ0OworCWNoYXIgc2F2ZV9jaGFyOworCXN0cnVjdCBwcmludF9idWYgKnBiX25leHQ7CisKKwlzcGluX2xvY2tfYmgoJnByaW50X2xvY2spOworCUZPUk1BVChwcmludF9zdHJpbmcsIGNoYXJzX3RvX2FkZCwgZm10KTsKKwlpZiAoY2hhcnNfdG9fYWRkID49IE1BWF9TVFJJTkcpCisJCXN0cmNweShwcmludF9zdHJpbmcsICIqKiogU1RSSU5HIFRPTyBMT05HICoqKiIpOworCisJd2hpbGUgKHBiKSB7CisJCWlmIChwYiA9PSBUSVBDX0NPTlMpCisJCQlwcmludGsocHJpbnRfc3RyaW5nKTsKKwkJZWxzZSBpZiAocGItPmJ1ZikgeworCQkJY2hhcnNfbGVmdCA9IHBiLT5idWYgKyBwYi0+c2l6ZSAtIHBiLT5jcnMgLSAxOworCQkJaWYgKGNoYXJzX3RvX2FkZCA8PSBjaGFyc19sZWZ0KSB7CisJCQkJc3RyY3B5KHBiLT5jcnMsIHByaW50X3N0cmluZyk7CisJCQkJcGItPmNycyArPSBjaGFyc190b19hZGQ7CisJCQl9IGVsc2UgeworCQkJCXN0cmNweShwYi0+YnVmLCBwcmludF9zdHJpbmcgKyBjaGFyc19sZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZV9jaGFyID0gcHJpbnRfc3RyaW5nW2NoYXJzX2xlZnRdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9zdHJpbmdbY2hhcnNfbGVmdF0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkocGItPmNycywgcHJpbnRfc3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfc3RyaW5nW2NoYXJzX2xlZnRdID0gc2F2ZV9jaGFyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYi0+Y3JzID0gcGItPmJ1ZiArIGNoYXJzX3RvX2FkZCAtIGNoYXJzX2xlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCQlwYl9uZXh0ID0gcGItPm5leHQ7CisJCXBiLT5uZXh0ID0gMDsKKwkJcGIgPSBwYl9uZXh0OworCX0KKwlzcGluX3VubG9ja19iaCgmcHJpbnRfbG9jayk7Cit9CisKKy8qKgorICogVElQQ19URUUgLSBwZXJmb3JtIG5leHQgb3V0cHV0IG9wZXJhdGlvbiBvbiBib3RoIHByaW50IGJ1ZmZlcnMgIAorICovCisKK3N0cnVjdCBwcmludF9idWYgKlRJUENfVEVFKHN0cnVjdCBwcmludF9idWYgKmIwLCBzdHJ1Y3QgcHJpbnRfYnVmICpiMSkKK3sKKwlzdHJ1Y3QgcHJpbnRfYnVmICpwYiA9IGIwOworCisJaWYgKCFiMCB8fCAoYjAgPT0gYjEpKQorCQlyZXR1cm4gYjE7CisJaWYgKCFiMSkKKwkJcmV0dXJuIGIwOworCisJc3Bpbl9sb2NrX2JoKCZwcmludF9sb2NrKTsKKwl3aGlsZSAocGItPm5leHQpIHsKKwkJaWYgKChwYi0+bmV4dCA9PSBiMSkgfHwgKHBiLT5uZXh0ID09IGIwKSkKKwkJCXBiLT5uZXh0ID0gcGItPm5leHQtPm5leHQ7CisJCWVsc2UKKwkJCXBiID0gcGItPm5leHQ7CisJfQorCXBiLT5uZXh0ID0gYjE7CisJc3Bpbl91bmxvY2tfYmgoJnByaW50X2xvY2spOworCXJldHVybiBiMDsKK30KKworLyoqCisgKiBwcmludF90b19jb25zb2xlIC0gd3JpdGUgc3RyaW5nIG9mIGJ5dGVzIHRvIGNvbnNvbGUgaW4gbXVsdGlwbGUgY2h1bmtzCisgKi8KKworc3RhdGljIHZvaWQgcHJpbnRfdG9fY29uc29sZShjaGFyICpjcnMsIGludCBsZW4pCit7CisJaW50IHJlc3QgPSBsZW47CisKKwl3aGlsZSAocmVzdCA+IDApIHsKKwkJaW50IHN6ID0gcmVzdCA8IE1BWF9TVFJJTkcgPyByZXN0IDogTUFYX1NUUklORzsKKwkJY2hhciBjID0gY3JzW3N6XTsKKworCQljcnNbc3pdID0gMDsKKwkJcHJpbnRrKChjb25zdCBjaGFyICopY3JzKTsKKwkJY3JzW3N6XSA9IGM7CisJCXJlc3QgLT0gc3o7CisJCWNycyArPSBzejsKKwl9Cit9CisKKy8qKgorICogcHJpbnRidWZfZHVtcCAtIHdyaXRlIHByaW50IGJ1ZmZlciBjb250ZW50cyB0byBjb25zb2xlCisgKi8KKworc3RhdGljIHZvaWQgcHJpbnRidWZfZHVtcChzdHJ1Y3QgcHJpbnRfYnVmICpwYikKK3sKKwlpbnQgbGVuOworCisJLyogRHVtcCBwcmludCBidWZmZXIgZnJvbSBjaGFyIGFmdGVyIGN1cnNvciB0byBlbmQgKGlmIHVzZWQpICovCisJbGVuID0gcGItPmJ1ZiArIHBiLT5zaXplIC0gcGItPmNycyAtIDI7CisJaWYgKChwYi0+YnVmW3BiLT5zaXplIC0gMV0gPT0gMCkgJiYgKGxlbiA+IDApKQorCQlwcmludF90b19jb25zb2xlKHBiLT5jcnMgKyAxLCBsZW4pOworCisJLyogRHVtcCBwcmludCBidWZmZXIgZnJvbSBzdGFydCB0byBjdXJzb3IgKGFsd2F5cykgKi8KKwlsZW4gPSBwYi0+Y3JzIC0gcGItPmJ1ZjsKKwlwcmludF90b19jb25zb2xlKHBiLT5idWYsIGxlbik7Cit9CisKKy8qKgorICogdGlwY19kdW1wIC0gZHVtcCBub24tY29uc29sZSBwcmludCBidWZmZXIocykgdG8gY29uc29sZQorICovCisKK3ZvaWQgdGlwY19kdW1wKHN0cnVjdCBwcmludF9idWYgKnBiLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlpbnQgbGVuOworCisJc3Bpbl9sb2NrX2JoKCZwcmludF9sb2NrKTsKKwlGT1JNQVQoVElQQ19DT05TLT5idWYsIGxlbiwgZm10KTsKKwlwcmludGsoVElQQ19DT05TLT5idWYpOworCisJZm9yICg7IHBiOyBwYiA9IHBiLT5uZXh0KSB7CisJCWlmIChwYiA9PSBUSVBDX0NPTlMpCisJCQljb250aW51ZTsKKwkJcHJpbnRrKCJcbi0tLS0gU3RhcnQgb2YgZHVtcCwlcyBsb2cgLS0tLVxuXG4iLCAKKwkJICAgICAgIChwYiA9PSBUSVBDX0xPRykgPyAiZ2xvYmFsIiA6ICJsb2NhbCIpOworCQlwcmludGJ1Zl9kdW1wKHBiKTsKKwkJdGlwY19wcmludGJ1Zl9yZXNldChwYik7CisJCXByaW50aygiXG4tLS0tLS0tLSBFbmQgb2YgZHVtcCAtLS0tLS0tLVxuIik7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZwcmludF9sb2NrKTsKK30KKworLyoqCisgKiB0aXBjX2xvZ19zdG9wIC0gZnJlZSB1cCBUSVBDIGxvZyBwcmludCBidWZmZXIgCisgKi8KKwordm9pZCB0aXBjX2xvZ19zdG9wKHZvaWQpCit7CisJc3Bpbl9sb2NrX2JoKCZwcmludF9sb2NrKTsKKwlpZiAoVElQQ19MT0ctPmJ1ZikgeworCQlrZnJlZShUSVBDX0xPRy0+YnVmKTsKKwkJVElQQ19MT0ctPmJ1ZiA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZwcmludF9sb2NrKTsKK30KKworLyoqCisgKiB0aXBjX2xvZ19yZWluaXQgLSBzZXQgVElQQyBsb2cgcHJpbnQgYnVmZmVyIHRvIHNwZWNpZmllZCBzaXplCisgKi8KKwordm9pZCB0aXBjX2xvZ19yZWluaXQoaW50IGxvZ19zaXplKQoreworCXRpcGNfbG9nX3N0b3AoKTsKKworCWlmIChsb2dfc2l6ZSkgeworCQlpZiAobG9nX3NpemUgPD0gTUFYX1NUUklORykKKwkJCWxvZ19zaXplID0gTUFYX1NUUklORyArIDE7CisJCXNwaW5fbG9ja19iaCgmcHJpbnRfbG9jayk7CisJCXRpcGNfcHJpbnRidWZfaW5pdChUSVBDX0xPRywga21hbGxvYyhsb2dfc2l6ZSwgR0ZQX0FUT01JQyksIGxvZ19zaXplKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnByaW50X2xvY2spOworCX0KK30KKworLyoqCisgKiB0aXBjX2xvZ19yZXNpemUgLSByZWNvbmZpZ3VyZSBzaXplIG9mIFRJUEMgbG9nIGJ1ZmZlcgorICovCisKK3N0cnVjdCBza19idWZmICp0aXBjX2xvZ19yZXNpemUoY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLCBpbnQgcmVxX3Rsdl9zcGFjZSkKK3sKKwl1MzIgdmFsdWU7CisKKwlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX1VOU0lHTkVEKSkKKwkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOworCisJdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJaWYgKHZhbHVlICE9IGRlbGltaXQodmFsdWUsIDAsIDMyNzY4KSkKKwkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19JTlZBTElEX1ZBTFVFCisJCQkJCQkgICAiIChsb2cgc2l6ZSBtdXN0IGJlIDAtMzI3NjgpIik7CisJdGlwY19sb2dfcmVpbml0KHZhbHVlKTsKKwlyZXR1cm4gdGlwY19jZmdfcmVwbHlfbm9uZSgpOworfQorCisvKioKKyAqIHRpcGNfbG9nX2R1bXAgLSBjYXB0dXJlIFRJUEMgbG9nIGJ1ZmZlciBjb250ZW50cyBpbiBjb25maWd1cmF0aW9uIG1lc3NhZ2UKKyAqLworCitzdHJ1Y3Qgc2tfYnVmZiAqdGlwY19sb2dfZHVtcCh2b2lkKQoreworCXN0cnVjdCBza19idWZmICpyZXBseTsKKworCXNwaW5fbG9ja19iaCgmcHJpbnRfbG9jayk7CisJaWYgKCFUSVBDX0xPRy0+YnVmKQorCQlyZXBseSA9IHRpcGNfY2ZnX3JlcGx5X3VsdHJhX3N0cmluZygibG9nIG5vdCBhY3RpdmF0ZWRcbiIpOworCWVsc2UgaWYgKHRpcGNfcHJpbnRidWZfZW1wdHkoVElQQ19MT0cpKQorCQlyZXBseSA9IHRpcGNfY2ZnX3JlcGx5X3VsdHJhX3N0cmluZygibG9nIGlzIGVtcHR5XG4iKTsKKwllbHNlIHsKKwkJc3RydWN0IHRsdl9kZXNjICpyZXBfdGx2OworCQlzdHJ1Y3QgcHJpbnRfYnVmIHBiOworCQlpbnQgc3RyX2xlbjsKKworCQlzdHJfbGVuID0gbWluKFRJUENfTE9HLT5zaXplLCAzMjc2OHUpOworCQlyZXBseSA9IHRpcGNfY2ZnX3JlcGx5X2FsbG9jKFRMVl9TUEFDRShzdHJfbGVuKSk7CisJCWlmIChyZXBseSkgeworCQkJcmVwX3RsdiA9IChzdHJ1Y3QgdGx2X2Rlc2MgKilyZXBseS0+ZGF0YTsKKwkJCXRpcGNfcHJpbnRidWZfaW5pdCgmcGIsIFRMVl9EQVRBKHJlcF90bHYpLCBzdHJfbGVuKTsKKwkJCXRpcGNfcHJpbnRidWZfbW92ZSgmcGIsIFRJUENfTE9HKTsKKwkJCXN0cl9sZW4gPSBzdHJsZW4oVExWX0RBVEEocmVwX3RsdikpICsgMTsKKwkJCXNrYl9wdXQocmVwbHksIFRMVl9TUEFDRShzdHJfbGVuKSk7CisJCQlUTFZfU0VUKHJlcF90bHYsIFRJUENfVExWX1VMVFJBX1NUUklORywgTlVMTCwgc3RyX2xlbik7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJnByaW50X2xvY2spOworCXJldHVybiByZXBseTsKK30KKwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvZGJnLmggYi9uZXQvdGlwYy9kYmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjdmMDUwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvZGJnLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIG5ldC90aXBjL2RiZy5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgcHJpbnQgYnVmZmVyIHJvdXRpbmVzCisgKiAKKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfREJHX0gKKyNkZWZpbmUgX1RJUENfREJHX0gKKworc3RydWN0IHByaW50X2J1ZiB7CisJY2hhciAqYnVmOworCXUzMiBzaXplOworCWNoYXIgKmNyczsKKwlzdHJ1Y3QgcHJpbnRfYnVmICpuZXh0OworfTsKKwordm9pZCB0aXBjX3ByaW50YnVmX2luaXQoc3RydWN0IHByaW50X2J1ZiAqcGIsIGNoYXIgKmJ1ZiwgdTMyIHN6KTsKK3ZvaWQgdGlwY19wcmludGJ1Zl9yZXNldChzdHJ1Y3QgcHJpbnRfYnVmICpwYik7CitpbnQgIHRpcGNfcHJpbnRidWZfZW1wdHkoc3RydWN0IHByaW50X2J1ZiAqcGIpOworaW50ICB0aXBjX3ByaW50YnVmX3ZhbGlkYXRlKHN0cnVjdCBwcmludF9idWYgKnBiKTsKK3ZvaWQgdGlwY19wcmludGJ1Zl9tb3ZlKHN0cnVjdCBwcmludF9idWYgKnBiX3RvLCBzdHJ1Y3QgcHJpbnRfYnVmICpwYl9mcm9tKTsKKwordm9pZCB0aXBjX2xvZ19yZWluaXQoaW50IGxvZ19zaXplKTsKK3ZvaWQgdGlwY19sb2dfc3RvcCh2b2lkKTsKKworc3RydWN0IHNrX2J1ZmYgKnRpcGNfbG9nX3Jlc2l6ZShjb25zdCB2b2lkICpyZXFfdGx2X2FyZWEsIGludCByZXFfdGx2X3NwYWNlKTsKK3N0cnVjdCBza19idWZmICp0aXBjX2xvZ19kdW1wKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC90aXBjL2Rpc2NvdmVyLmMgYi9uZXQvdGlwYy9kaXNjb3Zlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYmE0NjMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9kaXNjb3Zlci5jCkBAIC0wLDAgKzEsMzE4IEBACisvKgorICogbmV0L3RpcGMvZGlzY292ZXIuYworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImRiZy5oIgorI2luY2x1ZGUgImxpbmsuaCIKKyNpbmNsdWRlICJ6b25lLmgiCisjaW5jbHVkZSAiZGlzY292ZXIuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAibmFtZV90YWJsZS5oIgorCisjZGVmaW5lIFRJUENfTElOS19SRVFfSU5JVAkxMjUJLyogbWluIGRlbGF5IGR1cmluZyBiZWFyZXIgc3RhcnQgdXAgKi8KKyNkZWZpbmUgVElQQ19MSU5LX1JFUV9GQVNUCTIwMDAJLyogbm9ybWFsIGRlbGF5IGlmIGJlYXJlciBoYXMgbm8gbGlua3MgKi8KKyNkZWZpbmUgVElQQ19MSU5LX1JFUV9TTE9XCTYwMDAwMAkvKiBub3JtYWwgZGVsYXkgaWYgYmVhcmVyIGhhcyBsaW5rcyAqLworCisjaWYgMAorI2RlZmluZSAgR0VUX05PREVfSU5GTyAgICAgICAgIDMwMAorI2RlZmluZSAgR0VUX05PREVfSU5GT19SRVNVTFQgIDMwMQorI2RlZmluZSAgRk9SV0FSRF9MSU5LX1BST0JFICAgIDMwMgorI2RlZmluZSAgTElOS19SRVFVRVNUX1JFSkVDVEVEIDMwMworI2RlZmluZSAgTElOS19SRVFVRVNUX0FDQ0VQVEVEIDMwNAorI2RlZmluZSAgRFJPUF9MSU5LX1JFUVVFU1QgICAgIDMwNQorI2RlZmluZSAgQ0hFQ0tfTElOS19DT1VOVCAgICAgIDMwNgorI2VuZGlmCisKKy8qIAorICogVE9ETzogTW9zdCBvZiB0aGUgaW50ZXItY2x1c3RlciBzZXR1cCBzdHVmZiBzaG91bGQgYmUKKyAqIHJld3JpdHRlbiwgYW5kIGJlIG1hZGUgY29uZm9ybWFudCB3aXRoIHNwZWNpZmljYXRpb24uCisgKi8gCisKKworLyoqCisgKiBzdHJ1Y3QgbGlua19yZXEgLSBpbmZvcm1hdGlvbiBhYm91dCBhbiBvbmdvaW5nIGxpbmsgc2V0dXAgcmVxdWVzdAorICogQGJlYXJlcjogYmVhcmVyIGlzc3VpbmcgcmVxdWVzdHMKKyAqIEBkZXN0OiBkZXN0aW5hdGlvbiBhZGRyZXNzIGZvciByZXF1ZXN0IG1lc3NhZ2VzCisgKiBAYnVmOiByZXF1ZXN0IG1lc3NhZ2UgdG8gYmUgKHJlcGVhdGVkbHkpIHNlbnQKKyAqIEB0aW1lcjogdGltZXIgZ292ZXJuaW5nIHBlcmlvZCBiZXR3ZWVuIHJlcXVlc3RzCisgKiBAdGltZXJfaW50djogY3VycmVudCBpbnRlcnZhbCBiZXR3ZWVuIHJlcXVlc3RzIChpbiBtcykKKyAqLworc3RydWN0IGxpbmtfcmVxIHsKKwlzdHJ1Y3QgYmVhcmVyICpiZWFyZXI7CisJc3RydWN0IHRpcGNfbWVkaWFfYWRkciBkZXN0OworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJdW5zaWduZWQgaW50IHRpbWVyX2ludHY7Cit9OworCisKKyNpZiAwCitpbnQgZGlzY19jcmVhdGVfbGluayhjb25zdCBzdHJ1Y3QgdGlwY19saW5rX2NyZWF0ZSAqYXJndikgCit7CisJLyogCisJICogQ29kZSBmb3IgaW50ZXIgY2x1c3RlciBsaW5rIHNldHVwIGhlcmUgCisJICovCisJcmV0dXJuIFRJUENfT0s7Cit9CisjZW5kaWYKKworLyoKKyAqIGRpc2NfbG9zdF9saW5rKCk6IEEgbGluayBoYXMgbG9zdCBjb250YWN0CisgKi8KKwordm9pZCB0aXBjX2Rpc2NfbGlua19ldmVudCh1MzIgYWRkciwgY2hhciAqbmFtZSwgaW50IHVwKSAKK3sKKwlpZiAoaW5fb3duX2NsdXN0ZXIoYWRkcikpCisJCXJldHVybjsKKwkvKiAKKwkgKiBDb2RlIGZvciBpbnRlciBjbHVzdGVyIGxpbmsgc2V0dXAgaGVyZSAKKwkgKi8KK30KKworLyoqIAorICogdGlwY19kaXNjX2luaXRfbXNnIC0gaW5pdGlhbGl6ZSBhIGxpbmsgc2V0dXAgbWVzc2FnZQorICogQHR5cGU6IG1lc3NhZ2UgdHlwZSAocmVxdWVzdCBvciByZXNwb25zZSkKKyAqIEByZXFfbGlua3M6IG51bWJlciBvZiBsaW5rcyBhc3NvY2lhdGVkIHdpdGggbWVzc2FnZQorICogQGRlc3RfZG9tYWluOiBuZXR3b3JrIGRvbWFpbiBvZiBub2RlKHMpIHdoaWNoIHNob3VsZCByZXNwb25kIHRvIG1lc3NhZ2UKKyAqIEBiX3B0cjogcHRyIHRvIGJlYXJlciBpc3N1aW5nIG1lc3NhZ2UKKyAqLworCitzdHJ1Y3Qgc2tfYnVmZiAqdGlwY19kaXNjX2luaXRfbXNnKHUzMiB0eXBlLAorCQkJCSAgIHUzMiByZXFfbGlua3MsCisJCQkJICAgdTMyIGRlc3RfZG9tYWluLAorCQkJCSAgIHN0cnVjdCBiZWFyZXIgKmJfcHRyKQoreworCXN0cnVjdCBza19idWZmICpidWYgPSBidWZfYWNxdWlyZShEU0NfSF9TSVpFKTsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKworCWlmIChidWYpIHsKKwkJbXNnID0gYnVmX21zZyhidWYpOworCQltc2dfaW5pdChtc2csIExJTktfQ09ORklHLCB0eXBlLCBUSVBDX09LLCBEU0NfSF9TSVpFLAorCQkJIGRlc3RfZG9tYWluKTsKKwkJbXNnX3NldF9ub25fc2VxKG1zZyk7CisJCW1zZ19zZXRfcmVxX2xpbmtzKG1zZywgcmVxX2xpbmtzKTsKKwkJbXNnX3NldF9kZXN0X2RvbWFpbihtc2csIGRlc3RfZG9tYWluKTsKKwkJbXNnX3NldF9iY19uZXRpZChtc2csIHRpcGNfbmV0X2lkKTsKKwkJbXNnX3NldF9tZWRpYV9hZGRyKG1zZywgJmJfcHRyLT5wdWJsLmFkZHIpOworCX0KKwlyZXR1cm4gYnVmOworfQorCisvKioKKyAqIHRpcGNfZGlzY19yZWN2X21zZyAtIGhhbmRsZSBpbmNvbWluZyBsaW5rIHNldHVwIG1lc3NhZ2UgKHJlcXVlc3Qgb3IgcmVzcG9uc2UpCisgKiBAYnVmOiBidWZmZXIgY29udGFpbmluZyBtZXNzYWdlCisgKi8KKwordm9pZCB0aXBjX2Rpc2NfcmVjdl9tc2coc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlzdHJ1Y3QgYmVhcmVyICpiX3B0ciA9IChzdHJ1Y3QgYmVhcmVyICopVElQQ19TS0JfQ0IoYnVmKS0+aGFuZGxlOworCXN0cnVjdCBsaW5rICpsaW5rOworCXN0cnVjdCB0aXBjX21lZGlhX2FkZHIgbWVkaWFfYWRkcjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwl1MzIgZGVzdCA9IG1zZ19kZXN0X2RvbWFpbihtc2cpOworCXUzMiBvcmlnID0gbXNnX3ByZXZub2RlKG1zZyk7CisJdTMyIG5ldF9pZCA9IG1zZ19iY19uZXRpZChtc2cpOworCXUzMiB0eXBlID0gbXNnX3R5cGUobXNnKTsKKworCW1zZ19nZXRfbWVkaWFfYWRkcihtc2csJm1lZGlhX2FkZHIpOworCW1zZ19kYmcobXNnLCAiUkVDVjoiKTsKKwlidWZfZGlzY2FyZChidWYpOworCisJaWYgKG5ldF9pZCAhPSB0aXBjX25ldF9pZCkKKwkJcmV0dXJuOworCWlmICghdGlwY19hZGRyX2RvbWFpbl92YWxpZChkZXN0KSkKKwkJcmV0dXJuOworCWlmICghdGlwY19hZGRyX25vZGVfdmFsaWQob3JpZykpCisJCXJldHVybjsKKwlpZiAob3JpZyA9PSB0aXBjX293bl9hZGRyKQorCQlyZXR1cm47CisJaWYgKCFpbl9zY29wZShkZXN0LCB0aXBjX293bl9hZGRyKSkKKwkJcmV0dXJuOworCWlmIChpc19zbGF2ZSh0aXBjX293bl9hZGRyKSAmJiBpc19zbGF2ZShvcmlnKSkKKwkJcmV0dXJuOworCWlmIChpc19zbGF2ZShvcmlnKSAmJiAhaW5fb3duX2NsdXN0ZXIob3JpZykpCisJCXJldHVybjsKKwlpZiAoaW5fb3duX2NsdXN0ZXIob3JpZykpIHsKKwkJLyogQWx3YXlzIGFjY2VwdCBsaW5rIGhlcmUgKi8KKwkJc3RydWN0IHNrX2J1ZmYgKnJidWY7CisJCXN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmFkZHI7CisJCXN0cnVjdCBub2RlICpuX3B0ciA9IHRpcGNfbm9kZV9maW5kKG9yaWcpOworCQlpbnQgbGlua191cDsKKwkJZGJnKCIgaW4gb3duIGNsdXN0ZXJcbiIpOworCQlpZiAobl9wdHIgPT0gTlVMTCkgeworCQkJbl9wdHIgPSB0aXBjX25vZGVfY3JlYXRlKG9yaWcpOworCQl9CisJCWlmIChuX3B0ciA9PSBOVUxMKSB7CisJCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgRmFpbGVkIHRvIGNyZWF0ZSBub2RlXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlzcGluX2xvY2tfYmgoJm5fcHRyLT5sb2NrKTsKKwkJbGluayA9IG5fcHRyLT5saW5rc1tiX3B0ci0+aWRlbnRpdHldOworCQlpZiAoIWxpbmspIHsKKwkJCWRiZygiY3JlYXRpbmcgbGlua1xuIik7CisJCQlsaW5rID0gdGlwY19saW5rX2NyZWF0ZShiX3B0ciwgb3JpZywgJm1lZGlhX2FkZHIpOworCQkJaWYgKCFsaW5rKSB7CisJCQkJc3Bpbl91bmxvY2tfYmgoJm5fcHRyLT5sb2NrKTsgICAgICAgICAgICAgICAgCisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWFkZHIgPSAmbGluay0+bWVkaWFfYWRkcjsKKwkJaWYgKG1lbWNtcChhZGRyLCAmbWVkaWFfYWRkciwgc2l6ZW9mKCphZGRyKSkpIHsKKwkJCWNoYXIgYWRkcl9zdHJpbmdbMTZdOworCisJCQl3YXJuKCJOZXcgYmVhcmVyIGFkZHJlc3MgZm9yICVzXG4iLCAKKwkJCSAgICAgYWRkcl9zdHJpbmdfZmlsbChhZGRyX3N0cmluZywgb3JpZykpOworCQkJbWVtY3B5KGFkZHIsICZtZWRpYV9hZGRyLCBzaXplb2YoKmFkZHIpKTsKKwkJCXRpcGNfbGlua19yZXNldChsaW5rKTsgICAgIAorCQl9CisJCWxpbmtfdXAgPSB0aXBjX2xpbmtfaXNfdXAobGluayk7CisJCXNwaW5fdW5sb2NrX2JoKCZuX3B0ci0+bG9jayk7ICAgICAgICAgICAgICAgIAorCQlpZiAoKHR5cGUgPT0gRFNDX1JFU1BfTVNHKSB8fCBsaW5rX3VwKQorCQkJcmV0dXJuOworCQlyYnVmID0gdGlwY19kaXNjX2luaXRfbXNnKERTQ19SRVNQX01TRywgMSwgb3JpZywgYl9wdHIpOworCQlpZiAocmJ1ZiAhPSBOVUxMKSB7CisJCQltc2dfZGJnKGJ1Zl9tc2cocmJ1ZiksIlNFTkQ6Iik7CisJCQliX3B0ci0+bWVkaWEtPnNlbmRfbXNnKHJidWYsICZiX3B0ci0+cHVibCwgJm1lZGlhX2FkZHIpOworCQkJYnVmX2Rpc2NhcmQocmJ1Zik7CisJCX0KKwl9Cit9CisKKy8qKgorICogdGlwY19kaXNjX3N0b3BfbGlua19yZXEgLSBzdG9wIHNlbmRpbmcgcGVyaW9kaWMgbGluayBzZXR1cCByZXF1ZXN0cworICogQHJlcTogcHRyIHRvIGxpbmsgcmVxdWVzdCBzdHJ1Y3R1cmUKKyAqLworCit2b2lkIHRpcGNfZGlzY19zdG9wX2xpbmtfcmVxKHN0cnVjdCBsaW5rX3JlcSAqcmVxKSAKK3sKKwlpZiAoIXJlcSkKKwkJcmV0dXJuOworCQkKKwlrX2NhbmNlbF90aW1lcigmcmVxLT50aW1lcik7CisJa190ZXJtX3RpbWVyKCZyZXEtPnRpbWVyKTsKKwlidWZfZGlzY2FyZChyZXEtPmJ1Zik7CisJa2ZyZWUocmVxKTsKK30gCisKKy8qKgorICogdGlwY19kaXNjX3VwZGF0ZV9saW5rX3JlcSAtIHVwZGF0ZSBmcmVxdWVuY3kgb2YgcGVyaW9kaWMgbGluayBzZXR1cCByZXF1ZXN0cworICogQHJlcTogcHRyIHRvIGxpbmsgcmVxdWVzdCBzdHJ1Y3R1cmUKKyAqLworCit2b2lkIHRpcGNfZGlzY191cGRhdGVfbGlua19yZXEoc3RydWN0IGxpbmtfcmVxICpyZXEpIAoreworCWlmICghcmVxKQorCQlyZXR1cm47CisKKwlpZiAocmVxLT50aW1lcl9pbnR2ID09IFRJUENfTElOS19SRVFfU0xPVykgeworCQlpZiAoIXJlcS0+YmVhcmVyLT5ub2Rlcy5jb3VudCkgeworCQkJcmVxLT50aW1lcl9pbnR2ID0gVElQQ19MSU5LX1JFUV9GQVNUOworCQkJa19zdGFydF90aW1lcigmcmVxLT50aW1lciwgcmVxLT50aW1lcl9pbnR2KTsKKwkJfQorCX0gZWxzZSBpZiAocmVxLT50aW1lcl9pbnR2ID09IFRJUENfTElOS19SRVFfRkFTVCkgeworCQlpZiAocmVxLT5iZWFyZXItPm5vZGVzLmNvdW50KSB7CisJCQlyZXEtPnRpbWVyX2ludHYgPSBUSVBDX0xJTktfUkVRX1NMT1c7CisJCQlrX3N0YXJ0X3RpbWVyKCZyZXEtPnRpbWVyLCByZXEtPnRpbWVyX2ludHYpOworCQl9CisJfSBlbHNlIHsKKwkJLyogbGVhdmUgdGltZXIgImFzIGlzIiBpZiBoYXZlbid0IHlldCByZWFjaGVkIGEgIm5vcm1hbCIgcmF0ZSAqLworCX0KK30gCisKKy8qKgorICogZGlzY190aW1lb3V0IC0gc2VuZCBhIHBlcmlvZGljIGxpbmsgc2V0dXAgcmVxdWVzdAorICogQHJlcTogcHRyIHRvIGxpbmsgcmVxdWVzdCBzdHJ1Y3R1cmUKKyAqIAorICogQ2FsbGVkIHdoZW5ldmVyIGEgbGluayBzZXR1cCByZXF1ZXN0IHRpbWVyIGFzc29jaWF0ZWQgd2l0aCBhIGJlYXJlciBleHBpcmVzLgorICovCisKK3N0YXRpYyB2b2lkIGRpc2NfdGltZW91dChzdHJ1Y3QgbGlua19yZXEgKnJlcSkgCit7CisJc3Bpbl9sb2NrX2JoKCZyZXEtPmJlYXJlci0+cHVibC5sb2NrKTsKKworCXJlcS0+YmVhcmVyLT5tZWRpYS0+c2VuZF9tc2cocmVxLT5idWYsICZyZXEtPmJlYXJlci0+cHVibCwgJnJlcS0+ZGVzdCk7CisKKwlpZiAoKHJlcS0+dGltZXJfaW50diA9PSBUSVBDX0xJTktfUkVRX1NMT1cpIHx8CisJICAgIChyZXEtPnRpbWVyX2ludHYgPT0gVElQQ19MSU5LX1JFUV9GQVNUKSkgeworCQkvKiBsZWF2ZSB0aW1lciBpbnRlcnZhbCAiYXMgaXMiIGlmIGFscmVhZHkgYXQgYSAibm9ybWFsIiByYXRlICovCisJfSBlbHNlIHsKKwkJcmVxLT50aW1lcl9pbnR2ICo9IDI7CisJCWlmIChyZXEtPnRpbWVyX2ludHYgPiBUSVBDX0xJTktfUkVRX1NMT1cpCisJCQlyZXEtPnRpbWVyX2ludHYgPSBUSVBDX0xJTktfUkVRX1NMT1c7CisJCWlmICgocmVxLT50aW1lcl9pbnR2ID09IFRJUENfTElOS19SRVFfRkFTVCkgJiYgCisJCSAgICAocmVxLT5iZWFyZXItPm5vZGVzLmNvdW50KSkKKwkJCXJlcS0+dGltZXJfaW50diA9IFRJUENfTElOS19SRVFfU0xPVzsKKwl9CisJa19zdGFydF90aW1lcigmcmVxLT50aW1lciwgcmVxLT50aW1lcl9pbnR2KTsKKworCXNwaW5fdW5sb2NrX2JoKCZyZXEtPmJlYXJlci0+cHVibC5sb2NrKTsKK30KKworLyoqCisgKiB0aXBjX2Rpc2NfaW5pdF9saW5rX3JlcSAtIHN0YXJ0IHNlbmRpbmcgcGVyaW9kaWMgbGluayBzZXR1cCByZXF1ZXN0cworICogQGJfcHRyOiBwdHIgdG8gYmVhcmVyIGlzc3VpbmcgcmVxdWVzdHMKKyAqIEBkZXN0OiBkZXN0aW5hdGlvbiBhZGRyZXNzIGZvciByZXF1ZXN0IG1lc3NhZ2VzCisgKiBAZGVzdF9kb21haW46IG5ldHdvcmsgZG9tYWluIG9mIG5vZGUocykgd2hpY2ggc2hvdWxkIHJlc3BvbmQgdG8gbWVzc2FnZQorICogQHJlcV9saW5rczogbWF4IG51bWJlciBvZiBkZXNpcmVkIGxpbmtzCisgKiAKKyAqIFJldHVybnMgcG9pbnRlciB0byBsaW5rIHJlcXVlc3Qgc3RydWN0dXJlLCBvciBOVUxMIGlmIHVuYWJsZSB0byBjcmVhdGUuCisgKi8KKworc3RydWN0IGxpbmtfcmVxICp0aXBjX2Rpc2NfaW5pdF9saW5rX3JlcShzdHJ1Y3QgYmVhcmVyICpiX3B0ciwgCisJCQkJCSBjb25zdCBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICpkZXN0LAorCQkJCQkgdTMyIGRlc3RfZG9tYWluLAorCQkJCQkgdTMyIHJlcV9saW5rcykgCit7CisJc3RydWN0IGxpbmtfcmVxICpyZXE7CisKKwlyZXEgPSAoc3RydWN0IGxpbmtfcmVxICopa21hbGxvYyhzaXplb2YoKnJlcSksIEdGUF9BVE9NSUMpOworCWlmICghcmVxKQorCQlyZXR1cm4gTlVMTDsKKworCXJlcS0+YnVmID0gdGlwY19kaXNjX2luaXRfbXNnKERTQ19SRVFfTVNHLCByZXFfbGlua3MsIGRlc3RfZG9tYWluLCBiX3B0cik7CisJaWYgKCFyZXEtPmJ1ZikgeworCQlrZnJlZShyZXEpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1jcHkoJnJlcS0+ZGVzdCwgZGVzdCwgc2l6ZW9mKCpkZXN0KSk7CisJcmVxLT5iZWFyZXIgPSBiX3B0cjsKKwlyZXEtPnRpbWVyX2ludHYgPSBUSVBDX0xJTktfUkVRX0lOSVQ7CisJa19pbml0X3RpbWVyKCZyZXEtPnRpbWVyLCAoSGFuZGxlcilkaXNjX3RpbWVvdXQsICh1bnNpZ25lZCBsb25nKXJlcSk7CisJa19zdGFydF90aW1lcigmcmVxLT50aW1lciwgcmVxLT50aW1lcl9pbnR2KTsKKwlyZXR1cm4gcmVxOworfSAKKwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvZGlzY292ZXIuaCBiL25ldC90aXBjL2Rpc2NvdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1NGZkMQotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL2Rpc2NvdmVyLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIG5ldC90aXBjL2Rpc2NvdmVyLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX0RJU0NPVkVSX0gKKyNkZWZpbmUgX1RJUENfRElTQ09WRVJfSAorCisjaW5jbHVkZSAiY29yZS5oIgorCitzdHJ1Y3QgbGlua19yZXE7CisKK3N0cnVjdCBsaW5rX3JlcSAqdGlwY19kaXNjX2luaXRfbGlua19yZXEoc3RydWN0IGJlYXJlciAqYl9wdHIsIAorCQkJCQkgY29uc3Qgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqZGVzdCwKKwkJCQkJIHUzMiBkZXN0X2RvbWFpbiwKKwkJCQkJIHUzMiByZXFfbGlua3MpOwordm9pZCB0aXBjX2Rpc2NfdXBkYXRlX2xpbmtfcmVxKHN0cnVjdCBsaW5rX3JlcSAqcmVxKTsKK3ZvaWQgdGlwY19kaXNjX3N0b3BfbGlua19yZXEoc3RydWN0IGxpbmtfcmVxICpyZXEpOworCit2b2lkIHRpcGNfZGlzY19yZWN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKKwordm9pZCB0aXBjX2Rpc2NfbGlua19ldmVudCh1MzIgYWRkciwgY2hhciAqbmFtZSwgaW50IHVwKTsKKyNpZiAwCitpbnQgIGRpc2NfY3JlYXRlX2xpbmsoY29uc3Qgc3RydWN0IHRpcGNfbGlua19jcmVhdGUgKmFyZ3YpOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvZXRoX21lZGlhLmMgYi9uZXQvdGlwYy9ldGhfbWVkaWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjhkODNiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvZXRoX21lZGlhLmMKQEAgLTAsMCArMSwyOTcgQEAKKy8qCisgKiBuZXQvdGlwYy9ldGhfbWVkaWEuYzogRXRoZXJuZXQgYmVhcmVyIHN1cHBvcnQgZm9yIFRJUEMKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG5ldC90aXBjL3RpcGMuaD4KKyNpbmNsdWRlIDxuZXQvdGlwYy90aXBjX2JlYXJlci5oPgorI2luY2x1ZGUgPG5ldC90aXBjL3RpcGNfbXNnLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisKKyNkZWZpbmUgTUFYX0VUSF9CRUFSRVJTCQkyCisjZGVmaW5lIEVUSF9MSU5LX1BSSU9SSVRZCVRJUENfREVGX0xJTktfUFJJCisjZGVmaW5lIEVUSF9MSU5LX1RPTEVSQU5DRQlUSVBDX0RFRl9MSU5LX1RPTAorI2RlZmluZSBFVEhfTElOS19XSU5ET1cJCVRJUENfREVGX0xJTktfV0lOCisKKy8qKgorICogc3RydWN0IGV0aF9iZWFyZXIgLSBFdGhlcm5ldCBiZWFyZXIgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBiZWFyZXI6IHB0ciB0byBhc3NvY2lhdGVkICJnZW5lcmljIiBiZWFyZXIgc3RydWN0dXJlCisgKiBAZGV2OiBwdHIgdG8gYXNzb2NpYXRlZCBFdGhlcm5ldCBuZXR3b3JrIGRldmljZQorICogQHRpcGNfcGFja2V0X3R5cGU6IHVzZWQgaW4gYmluZGluZyBUSVBDIHRvIEV0aGVybmV0IGRyaXZlcgorICovCisgCitzdHJ1Y3QgZXRoX2JlYXJlciB7CisJc3RydWN0IHRpcGNfYmVhcmVyICpiZWFyZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcGFja2V0X3R5cGUgdGlwY19wYWNrZXRfdHlwZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXRoX2JlYXJlciBldGhfYmVhcmVyc1tNQVhfRVRIX0JFQVJFUlNdOworc3RhdGljIGludCBldGhfc3RhcnRlZCA9IDA7CitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG5vdGlmaWVyOworCisvKioKKyAqIHNlbmRfbXNnIC0gc2VuZCBhIFRJUEMgbWVzc2FnZSBvdXQgb3ZlciBhbiBFdGhlcm5ldCBpbnRlcmZhY2UgCisgKi8KKworc3RhdGljIGludCBzZW5kX21zZyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCBzdHJ1Y3QgdGlwY19iZWFyZXIgKnRiX3B0ciwgCisJCSAgICBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICpkZXN0KQoreworCXN0cnVjdCBza19idWZmICpjbG9uZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJY2xvbmUgPSBza2JfY2xvbmUoYnVmLCBHRlBfQVRPTUlDKTsKKwlpZiAoY2xvbmUpIHsKKwkJY2xvbmUtPm5oLnJhdyA9IGNsb25lLT5kYXRhOworCQlkZXYgPSAoKHN0cnVjdCBldGhfYmVhcmVyICopKHRiX3B0ci0+dXNyX2hhbmRsZSkpLT5kZXY7CisJCWNsb25lLT5kZXYgPSBkZXY7CisJCWRldi0+aGFyZF9oZWFkZXIoY2xvbmUsIGRldiwgRVRIX1BfVElQQywgCisJCQkJICZkZXN0LT5kZXZfYWRkci5ldGhfYWRkciwKKwkJCQkgZGV2LT5kZXZfYWRkciwgY2xvbmUtPmxlbik7CisJCWRldl9xdWV1ZV94bWl0KGNsb25lKTsKKwl9CisJcmV0dXJuIFRJUENfT0s7Cit9CisKKy8qKgorICogcmVjdl9tc2cgLSBoYW5kbGUgaW5jb21pbmcgVElQQyBtZXNzYWdlIGZyb20gYW4gRXRoZXJuZXQgaW50ZXJmYWNlCisgKiAKKyAqIFJvdXRpbmUgdHJ1bmNhdGVzIGFueSBFdGhlcm5ldCBwYWRkaW5nL0NSQyBhcHBlbmRlZCB0byB0aGUgbWVzc2FnZSwKKyAqIGFuZCBlbnN1cmVzIG1lc3NhZ2Ugc2l6ZSBtYXRjaGVzIGFjdHVhbCBsZW5ndGgKKyAqLworCitzdGF0aWMgaW50IHJlY3ZfbXNnKHN0cnVjdCBza19idWZmICpidWYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIAorCQkgICAgc3RydWN0IHBhY2tldF90eXBlICpwdCwgc3RydWN0IG5ldF9kZXZpY2UgKm9yaWdfZGV2KQoreworCXN0cnVjdCBldGhfYmVhcmVyICplYl9wdHIgPSAoc3RydWN0IGV0aF9iZWFyZXIgKilwdC0+YWZfcGFja2V0X3ByaXY7CisJdTMyIHNpemU7CisKKwlpZiAobGlrZWx5KGViX3B0ci0+YmVhcmVyKSkgeworCQlzaXplID0gbXNnX3NpemUoKHN0cnVjdCB0aXBjX21zZyAqKWJ1Zi0+ZGF0YSk7CisJCXNrYl90cmltKGJ1Ziwgc2l6ZSk7CisJCWlmIChsaWtlbHkoYnVmLT5sZW4gPT0gc2l6ZSkpIHsKKwkJCWJ1Zi0+bmV4dCA9IE5VTEw7CisJCQl0aXBjX3JlY3ZfbXNnKGJ1ZiwgZWJfcHRyLT5iZWFyZXIpOworCQl9IGVsc2UgeworCQkJa2ZyZWVfc2tiKGJ1Zik7CisJCX0KKwl9IGVsc2UgeworCQlrZnJlZV9za2IoYnVmKTsKKwl9CisJcmV0dXJuIFRJUENfT0s7Cit9CisKKy8qKgorICogZW5hYmxlX2JlYXJlciAtIGF0dGFjaCBUSVBDIGJlYXJlciB0byBhbiBFdGhlcm5ldCBpbnRlcmZhY2UgCisgKi8KKworc3RhdGljIGludCBlbmFibGVfYmVhcmVyKHN0cnVjdCB0aXBjX2JlYXJlciAqdGJfcHRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfYmFzZTsKKwlzdHJ1Y3QgZXRoX2JlYXJlciAqZWJfcHRyID0gJmV0aF9iZWFyZXJzWzBdOworCXN0cnVjdCBldGhfYmVhcmVyICpzdG9wID0gJmV0aF9iZWFyZXJzW01BWF9FVEhfQkVBUkVSU107CisJY2hhciAqZHJpdmVyX25hbWUgPSBzdHJjaHIoKGNvbnN0IGNoYXIgKil0Yl9wdHItPm5hbWUsICc6JykgKyAxOworCisJLyogRmluZCBkZXZpY2Ugd2l0aCBzcGVjaWZpZWQgbmFtZSAqLworCisJd2hpbGUgKGRldiAmJiBkZXYtPm5hbWUgJiYKKwkgICAgICAgKG1lbWNtcChkZXYtPm5hbWUsIGRyaXZlcl9uYW1lLCBzdHJsZW4oZGV2LT5uYW1lKSkpKSB7CisJCWRldiA9IGRldi0+bmV4dDsKKwl9CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJLyogRmluZCBFdGhlcm5ldCBiZWFyZXIgZm9yIGRldmljZSAob3IgY3JlYXRlIG9uZSkgKi8KKworCWZvciAoOyhlYl9wdHIgIT0gc3RvcCkgJiYgZWJfcHRyLT5kZXYgJiYgKGViX3B0ci0+ZGV2ICE9IGRldik7IGViX3B0cisrKTsKKwlpZiAoZWJfcHRyID09IHN0b3ApCisJCXJldHVybiAtRURRVU9UOworCWlmICghZWJfcHRyLT5kZXYpIHsKKwkJZWJfcHRyLT5kZXYgPSBkZXY7CisJCWViX3B0ci0+dGlwY19wYWNrZXRfdHlwZS50eXBlID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9USVBDKTsKKwkJZWJfcHRyLT50aXBjX3BhY2tldF90eXBlLmRldiA9IGRldjsKKwkJZWJfcHRyLT50aXBjX3BhY2tldF90eXBlLmZ1bmMgPSByZWN2X21zZzsKKwkJZWJfcHRyLT50aXBjX3BhY2tldF90eXBlLmFmX3BhY2tldF9wcml2ID0gZWJfcHRyOworCQlJTklUX0xJU1RfSEVBRCgmKGViX3B0ci0+dGlwY19wYWNrZXRfdHlwZS5saXN0KSk7CisJCWRldl9ob2xkKGRldik7CisJCWRldl9hZGRfcGFjaygmZWJfcHRyLT50aXBjX3BhY2tldF90eXBlKTsKKwl9CisKKwkvKiBBc3NvY2lhdGUgVElQQyBiZWFyZXIgd2l0aCBFdGhlcm5ldCBiZWFyZXIgKi8KKworCWViX3B0ci0+YmVhcmVyID0gdGJfcHRyOworCXRiX3B0ci0+dXNyX2hhbmRsZSA9ICh2b2lkICopZWJfcHRyOworCXRiX3B0ci0+bXR1ID0gZGV2LT5tdHU7CisJdGJfcHRyLT5ibG9ja2VkID0gMDsgCisJdGJfcHRyLT5hZGRyLnR5cGUgPSBodG9ubChUSVBDX01FRElBX1RZUEVfRVRIKTsKKwltZW1jcHkoJnRiX3B0ci0+YWRkci5kZXZfYWRkciwgJmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBkaXNhYmxlX2JlYXJlciAtIGRldGFjaCBUSVBDIGJlYXJlciBmcm9tIGFuIEV0aGVybmV0IGludGVyZmFjZSAKKyAqCisgKiBXZSByZWFsbHkgc2hvdWxkIGRvIGRldl9yZW1vdmVfcGFjaygpIGhlcmUsIGJ1dCB0aGlzIGZ1bmN0aW9uIGNhbiBub3QgYmUKKyAqIGNhbGxlZCBhdCB0YXNrbGV0IGxldmVsLiA9PiBVc2UgZXRoX2JlYXJlci0+YmVhcmVyIGFzIGEgZmxhZyB0byB0aHJvdyBhd2F5CisgKiBpbmNvbWluZyBidWZmZXJzLCAmIHBvc3Rwb25lIGRldl9yZW1vdmVfcGFjaygpIHRvIGV0aF9tZWRpYV9zdG9wKCkgb24gZXhpdC4KKyAqLworCitzdGF0aWMgdm9pZCBkaXNhYmxlX2JlYXJlcihzdHJ1Y3QgdGlwY19iZWFyZXIgKnRiX3B0cikKK3sKKwkoKHN0cnVjdCBldGhfYmVhcmVyICopdGJfcHRyLT51c3JfaGFuZGxlKS0+YmVhcmVyID0gMDsKK30KKworLyoqCisgKiByZWN2X25vdGlmaWNhdGlvbiAtIGhhbmRsZSBkZXZpY2UgdXBkYXRlcyBmcm9tIE9TCisgKgorICogQ2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgRXRoZXJuZXQgYmVhcmVyIChpZiBhbnkpIGFzc29jaWF0ZWQgd2l0aCB0aGUgCisgKiBzcGVjaWZpZWQgZGV2aWNlLgorICovCisKK3N0YXRpYyBpbnQgcmVjdl9ub3RpZmljYXRpb24oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBldnQsIAorCQkJICAgICB2b2lkICpkdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZHY7CisJc3RydWN0IGV0aF9iZWFyZXIgKmViX3B0ciA9ICZldGhfYmVhcmVyc1swXTsKKwlzdHJ1Y3QgZXRoX2JlYXJlciAqc3RvcCA9ICZldGhfYmVhcmVyc1tNQVhfRVRIX0JFQVJFUlNdOworCisJd2hpbGUgKChlYl9wdHItPmRldiAhPSBkZXYpKSB7CisJCWlmICgrK2ViX3B0ciA9PSBzdG9wKQorCQkJcmV0dXJuIE5PVElGWV9ET05FOwkvKiBjb3VsZG4ndCBmaW5kIGRldmljZSAqLworCX0KKwlpZiAoIWViX3B0ci0+YmVhcmVyKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CQkvKiBiZWFyZXIgaGFkIGJlZW4gZGlzYWJsZWQgKi8KKworICAgICAgICBlYl9wdHItPmJlYXJlci0+bXR1ID0gZGV2LT5tdHU7CisKKwlzd2l0Y2ggKGV2dCkgeworCWNhc2UgTkVUREVWX0NIQU5HRToKKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkKKwkJCXRpcGNfY29udGludWUoZWJfcHRyLT5iZWFyZXIpOworCQllbHNlCisJCQl0aXBjX2Jsb2NrX2JlYXJlcihlYl9wdHItPmJlYXJlci0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgTkVUREVWX1VQOgorCQl0aXBjX2NvbnRpbnVlKGViX3B0ci0+YmVhcmVyKTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfRE9XTjoKKwkJdGlwY19ibG9ja19iZWFyZXIoZWJfcHRyLT5iZWFyZXItPm5hbWUpOworCQlicmVhazsKKwljYXNlIE5FVERFVl9DSEFOR0VNVFU6CisgICAgICAgIGNhc2UgTkVUREVWX0NIQU5HRUFERFI6CisJCXRpcGNfYmxvY2tfYmVhcmVyKGViX3B0ci0+YmVhcmVyLT5uYW1lKTsKKyAgICAgICAgICAgICAgICB0aXBjX2NvbnRpbnVlKGViX3B0ci0+YmVhcmVyKTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfVU5SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBORVRERVZfQ0hBTkdFTkFNRToKKwkJdGlwY19kaXNhYmxlX2JlYXJlcihlYl9wdHItPmJlYXJlci0+bmFtZSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX09LOworfQorCisvKioKKyAqIGV0aF9hZGRyMnN0ciAtIGNvbnZlcnQgRXRoZXJuZXQgYWRkcmVzcyB0byBzdHJpbmcKKyAqLworCitzdGF0aWMgY2hhciAqZXRoX2FkZHIyc3RyKHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEsIGNoYXIgKnN0cl9idWYsIGludCBzdHJfc2l6ZSkKK3sgICAgICAgICAgICAgICAgICAgICAgIAorCXVuY2hhciAqYWRkciA9ICh1bmNoYXIgKikmYS0+ZGV2X2FkZHI7CisKKwlpZiAoc3RyX3NpemUgPCAxOCkKKwkJKnN0cl9idWYgPSAnXDAnOworCWVsc2UKKwkJc3ByaW50ZihzdHJfYnVmLCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorCQkJYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7CisJcmV0dXJuIHN0cl9idWY7Cit9CisKKy8qKgorICogdGlwY19ldGhfbWVkaWFfc3RhcnQgLSBhY3RpdmF0ZSBFdGhlcm5ldCBiZWFyZXIgc3VwcG9ydAorICoKKyAqIFJlZ2lzdGVyIEV0aGVybmV0IG1lZGlhIHR5cGUgd2l0aCBUSVBDIGJlYXJlciBjb2RlLiAgQWxzbyByZWdpc3RlcgorICogd2l0aCBPUyBmb3Igbm90aWZpY2F0aW9ucyBhYm91dCBkZXZpY2Ugc3RhdGUgY2hhbmdlcy4KKyAqLworCitpbnQgdGlwY19ldGhfbWVkaWFfc3RhcnQodm9pZCkKK3sgICAgICAgICAgICAgICAgICAgICAgIAorCXN0cnVjdCB0aXBjX21lZGlhX2FkZHIgYmNhc3RfYWRkcjsKKwlpbnQgcmVzOworCisJaWYgKGV0aF9zdGFydGVkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldCgmYmNhc3RfYWRkciwgMHhmZiwgc2l6ZW9mKGJjYXN0X2FkZHIpKTsKKwltZW1zZXQoZXRoX2JlYXJlcnMsIDAsIHNpemVvZihldGhfYmVhcmVycykpOworCisJcmVzID0gdGlwY19yZWdpc3Rlcl9tZWRpYShUSVBDX01FRElBX1RZUEVfRVRILCAiZXRoIiwKKwkJCQkgIGVuYWJsZV9iZWFyZXIsIGRpc2FibGVfYmVhcmVyLCBzZW5kX21zZywgCisJCQkJICBldGhfYWRkcjJzdHIsICZiY2FzdF9hZGRyLCBFVEhfTElOS19QUklPUklUWSwgCisJCQkJICBFVEhfTElOS19UT0xFUkFOQ0UsIEVUSF9MSU5LX1dJTkRPVyk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKworCW5vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSAmcmVjdl9ub3RpZmljYXRpb247CisJbm90aWZpZXIucHJpb3JpdHkgPSAwOworCXJlcyA9IHJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbm90aWZpZXIpOworCWlmICghcmVzKQorCQlldGhfc3RhcnRlZCA9IDE7CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiB0aXBjX2V0aF9tZWRpYV9zdG9wIC0gZGVhY3RpdmF0ZSBFdGhlcm5ldCBiZWFyZXIgc3VwcG9ydAorICovCisKK3ZvaWQgdGlwY19ldGhfbWVkaWFfc3RvcCh2b2lkKQoreworCWludCBpOworCisJaWYgKCFldGhfc3RhcnRlZCkKKwkJcmV0dXJuOworCisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJm5vdGlmaWVyKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0VUSF9CRUFSRVJTIDsgaSsrKSB7CisJCWlmIChldGhfYmVhcmVyc1tpXS5iZWFyZXIpIHsKKwkJCWV0aF9iZWFyZXJzW2ldLmJlYXJlci0+YmxvY2tlZCA9IDE7CisJCQlldGhfYmVhcmVyc1tpXS5iZWFyZXIgPSAwOworCQl9CisJCWlmIChldGhfYmVhcmVyc1tpXS5kZXYpIHsKKwkJCWRldl9yZW1vdmVfcGFjaygmZXRoX2JlYXJlcnNbaV0udGlwY19wYWNrZXRfdHlwZSk7CisJCQlkZXZfcHV0KGV0aF9iZWFyZXJzW2ldLmRldik7CisJCX0KKwl9CisJbWVtc2V0KCZldGhfYmVhcmVycywgMCwgc2l6ZW9mKGV0aF9iZWFyZXJzKSk7CisJZXRoX3N0YXJ0ZWQgPSAwOworfQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvaGFuZGxlci5jIGIvbmV0L3RpcGMvaGFuZGxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NmY3MGExCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvaGFuZGxlci5jCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogbmV0L3RpcGMvaGFuZGxlci5jOiBUSVBDIHNpZ25hbCBoYW5kbGluZworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29yZS5oIgorCitzdHJ1Y3QgcXVldWVfaXRlbSB7CisJc3RydWN0IGxpc3RfaGVhZCBuZXh0X3NpZ25hbDsKKwl2b2lkICgqaGFuZGxlcikgKHVuc2lnbmVkIGxvbmcpOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKK307CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKnRpcGNfcXVldWVfaXRlbV9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHNpZ25hbF9xdWV1ZV9oZWFkOworc3RhdGljIHNwaW5sb2NrX3QgcWl0ZW1fbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBpbnQgaGFuZGxlcl9lbmFibGVkID0gMDsKKworc3RhdGljIHZvaWQgcHJvY2Vzc19zaWduYWxfcXVldWUodW5zaWduZWQgbG9uZyBkdW1teSk7CisKK3N0YXRpYyBERUNMQVJFX1RBU0tMRVRfRElTQUJMRUQodGlwY190YXNrbGV0LCBwcm9jZXNzX3NpZ25hbF9xdWV1ZSwgMCk7CisKKwordW5zaWduZWQgaW50IHRpcGNfa19zaWduYWwoSGFuZGxlciByb3V0aW5lLCB1bnNpZ25lZCBsb25nIGFyZ3VtZW50KQoreworCXN0cnVjdCBxdWV1ZV9pdGVtICppdGVtOworCisJaWYgKCFoYW5kbGVyX2VuYWJsZWQpIHsKKwkJZXJyKCJTaWduYWwgcmVxdWVzdCBpZ25vcmVkIGJ5IGhhbmRsZXJcbiIpOworCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCX0KKworCXNwaW5fbG9ja19iaCgmcWl0ZW1fbG9jayk7CisJaXRlbSA9IGttZW1fY2FjaGVfYWxsb2ModGlwY19xdWV1ZV9pdGVtX2NhY2hlLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWl0ZW0pIHsKKwkJZXJyKCJTaWduYWwgcXVldWUgb3V0IG9mIG1lbW9yeVxuIik7CisJCXNwaW5fdW5sb2NrX2JoKCZxaXRlbV9sb2NrKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWl0ZW0tPmhhbmRsZXIgPSByb3V0aW5lOworCWl0ZW0tPmRhdGEgPSBhcmd1bWVudDsKKwlsaXN0X2FkZF90YWlsKCZpdGVtLT5uZXh0X3NpZ25hbCwgJnNpZ25hbF9xdWV1ZV9oZWFkKTsKKwlzcGluX3VubG9ja19iaCgmcWl0ZW1fbG9jayk7CisJdGFza2xldF9zY2hlZHVsZSgmdGlwY190YXNrbGV0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19zaWduYWxfcXVldWUodW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwlzdHJ1Y3QgcXVldWVfaXRlbSAqX192b2xhdGlsZV9fIGl0ZW07CisJc3RydWN0IGxpc3RfaGVhZCAqbCwgKm47CisKKwlzcGluX2xvY2tfYmgoJnFpdGVtX2xvY2spOworCWxpc3RfZm9yX2VhY2hfc2FmZShsLCBuLCAmc2lnbmFsX3F1ZXVlX2hlYWQpIHsKKwkJaXRlbSA9IGxpc3RfZW50cnkobCwgc3RydWN0IHF1ZXVlX2l0ZW0sIG5leHRfc2lnbmFsKTsKKwkJbGlzdF9kZWwoJml0ZW0tPm5leHRfc2lnbmFsKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnFpdGVtX2xvY2spOworCQlpdGVtLT5oYW5kbGVyKGl0ZW0tPmRhdGEpOworCQlzcGluX2xvY2tfYmgoJnFpdGVtX2xvY2spOworCQlrbWVtX2NhY2hlX2ZyZWUodGlwY19xdWV1ZV9pdGVtX2NhY2hlLCBpdGVtKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnFpdGVtX2xvY2spOworfQorCitpbnQgdGlwY19oYW5kbGVyX3N0YXJ0KHZvaWQpCit7CisJdGlwY19xdWV1ZV9pdGVtX2NhY2hlID0gCisJCWttZW1fY2FjaGVfY3JlYXRlKCJ0aXBjX3F1ZXVlX2l0ZW1zIiwgc2l6ZW9mKHN0cnVjdCBxdWV1ZV9pdGVtKSwKKwkJCQkgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCwgTlVMTCk7CisJaWYgKCF0aXBjX3F1ZXVlX2l0ZW1fY2FjaGUpCisJCXJldHVybiAtRU5PTUVNOworCisJSU5JVF9MSVNUX0hFQUQoJnNpZ25hbF9xdWV1ZV9oZWFkKTsKKwl0YXNrbGV0X2VuYWJsZSgmdGlwY190YXNrbGV0KTsKKwloYW5kbGVyX2VuYWJsZWQgPSAxOworCXJldHVybiAwOworfQorCit2b2lkIHRpcGNfaGFuZGxlcl9zdG9wKHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbCwgKm47CisJc3RydWN0IHF1ZXVlX2l0ZW0gKml0ZW07IAorCisJaWYgKCFoYW5kbGVyX2VuYWJsZWQpCisJCXJldHVybjsKKworCWhhbmRsZXJfZW5hYmxlZCA9IDA7CisJdGFza2xldF9kaXNhYmxlKCZ0aXBjX3Rhc2tsZXQpOworCXRhc2tsZXRfa2lsbCgmdGlwY190YXNrbGV0KTsKKworCXNwaW5fbG9ja19iaCgmcWl0ZW1fbG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGwsIG4sICZzaWduYWxfcXVldWVfaGVhZCkgeworCQlpdGVtID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgcXVldWVfaXRlbSwgbmV4dF9zaWduYWwpOworCQlsaXN0X2RlbCgmaXRlbS0+bmV4dF9zaWduYWwpOworCQlrbWVtX2NhY2hlX2ZyZWUodGlwY19xdWV1ZV9pdGVtX2NhY2hlLCBpdGVtKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnFpdGVtX2xvY2spOworCisJa21lbV9jYWNoZV9kZXN0cm95KHRpcGNfcXVldWVfaXRlbV9jYWNoZSk7Cit9CisKZGlmZiAtLWdpdCBhL25ldC90aXBjL2xpbmsuYyBiL25ldC90aXBjL2xpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTE4NzJhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvbGluay5jCkBAIC0wLDAgKzEsMzE2NiBAQAorLyoKKyAqIG5ldC90aXBjL2xpbmsuYzogVElQQyBsaW5rIGNvZGUKKyAqIAorICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImRiZy5oIgorI2luY2x1ZGUgImxpbmsuaCIKKyNpbmNsdWRlICJuZXQuaCIKKyNpbmNsdWRlICJub2RlLmgiCisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgImFkZHIuaCIKKyNpbmNsdWRlICJub2RlX3N1YnNjci5oIgorI2luY2x1ZGUgIm5hbWVfZGlzdHIuaCIKKyNpbmNsdWRlICJiZWFyZXIuaCIKKyNpbmNsdWRlICJuYW1lX3RhYmxlLmgiCisjaW5jbHVkZSAiZGlzY292ZXIuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJiY2FzdC5oIgorCisKKy8qIAorICogTGltaXQgZm9yIGRlZmVycmVkIHJlY2VwdGlvbiBxdWV1ZTogCisgKi8KKworI2RlZmluZSBERUZfUVVFVUVfTElNSVQgMjU2dQorCisvKiAKKyAqIExpbmsgc3RhdGUgZXZlbnRzOiAKKyAqLworCisjZGVmaW5lICBTVEFSVElOR19FVlQgICAgODU2Mzg0NzY4CS8qIGxpbmsgcHJvY2Vzc2luZyB0cmlnZ2VyICovCisjZGVmaW5lICBUUkFGRklDX01TR19FVlQgNTYwODE1dQkvKiByeCdkID8/PyAqLworI2RlZmluZSAgVElNRU9VVF9FVlQgICAgIDU2MDgxN3UJLyogbGluayB0aW1lciBleHBpcmVkICovCisKKy8qICAgCisgKiBUaGUgZm9sbG93aW5nIHR3byAnbWVzc2FnZSB0eXBlcycgaXMgcmVhbGx5IGp1c3QgaW1wbGVtZW50YXRpb24gCisgKiBkYXRhIGNvbnZlbmllbnRseSBzdG9yZWQgaW4gdGhlIG1lc3NhZ2UgaGVhZGVyLiAKKyAqIFRoZXkgbXVzdCBub3QgYmUgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBwcm90b2NvbAorICovCisjZGVmaW5lIE9QRU5fTVNHICAgMAorI2RlZmluZSBDTE9TRURfTVNHIDEKKworLyogCisgKiBTdGF0ZSB2YWx1ZSBzdG9yZWQgaW4gJ2V4cF9tc2dfY291bnQnCisgKi8KKworI2RlZmluZSBTVEFSVF9DSEFOR0VPVkVSIDEwMDAwMHUKKworLyoqCisgKiBzdHJ1Y3QgbGlua19uYW1lIC0gZGVjb25zdHJ1Y3RlZCBsaW5rIG5hbWUKKyAqIEBhZGRyX2xvY2FsOiBuZXR3b3JrIGFkZHJlc3Mgb2Ygbm9kZSBhdCB0aGlzIGVuZAorICogQGlmX2xvY2FsOiBuYW1lIG9mIGludGVyZmFjZSBhdCB0aGlzIGVuZAorICogQGFkZHJfcGVlcjogbmV0d29yayBhZGRyZXNzIG9mIG5vZGUgYXQgZmFyIGVuZAorICogQGlmX3BlZXI6IG5hbWUgb2YgaW50ZXJmYWNlIGF0IGZhciBlbmQKKyAqLworCitzdHJ1Y3QgbGlua19uYW1lIHsKKwl1MzIgYWRkcl9sb2NhbDsKKwljaGFyIGlmX2xvY2FsW1RJUENfTUFYX0lGX05BTUVdOworCXUzMiBhZGRyX3BlZXI7CisJY2hhciBpZl9wZWVyW1RJUENfTUFYX0lGX05BTUVdOworfTsKKworI2lmIDAKKworLyogTElOSyBFVkVOVCBDT0RFIElTIE5PVCBTVVBQT1JURUQgQVQgUFJFU0VOVCAqLworCisvKiogCisgKiBzdHJ1Y3QgbGlua19ldmVudCAtIGxpbmsgdXAvZG93biBldmVudCBub3RpZmljYXRpb24KKyAqLworCitzdHJ1Y3QgbGlua19ldmVudCB7CisJdTMyIGFkZHI7CisJaW50IHVwOworCXZvaWQgKCpmY24pKHUzMiwgY2hhciAqLCBpbnQpOworCWNoYXIgbmFtZVtUSVBDX01BWF9MSU5LX05BTUVdOworfTsKKworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGxpbmtfaGFuZGxlX291dF9vZl9zZXFfbXNnKHN0cnVjdCBsaW5rICpsX3B0ciwKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKmJ1Zik7CitzdGF0aWMgdm9pZCBsaW5rX3JlY3ZfcHJvdG9fbXNnKHN0cnVjdCBsaW5rICpsX3B0ciwgc3RydWN0IHNrX2J1ZmYgKmJ1Zik7CitzdGF0aWMgaW50ICBsaW5rX3JlY3ZfY2hhbmdlb3Zlcl9tc2coc3RydWN0IGxpbmsgKipsX3B0ciwgc3RydWN0IHNrX2J1ZmYgKipidWYpOworc3RhdGljIHZvaWQgbGlua19zZXRfc3VwZXJ2aXNpb25fcHJvcHMoc3RydWN0IGxpbmsgKmxfcHRyLCB1MzIgdG9sZXJhbmNlKTsKK3N0YXRpYyBpbnQgIGxpbmtfc2VuZF9zZWN0aW9uc19sb25nKHN0cnVjdCBwb3J0ICpzZW5kZXIsCisJCQkJICAgIHN0cnVjdCBpb3ZlYyBjb25zdCAqbXNnX3NlY3QsCisJCQkJICAgIHUzMiBudW1fc2VjdCwgdTMyIGRlc3Rub2RlKTsKK3N0YXRpYyB2b2lkIGxpbmtfY2hlY2tfZGVmcmFnbV9idWZzKHN0cnVjdCBsaW5rICpsX3B0cik7CitzdGF0aWMgdm9pZCBsaW5rX3N0YXRlX2V2ZW50KHN0cnVjdCBsaW5rICpsX3B0ciwgdTMyIGV2ZW50KTsKK3N0YXRpYyB2b2lkIGxpbmtfcmVzZXRfc3RhdGlzdGljcyhzdHJ1Y3QgbGluayAqbF9wdHIpOworc3RhdGljIHZvaWQgbGlua19wcmludChzdHJ1Y3QgbGluayAqbF9wdHIsIHN0cnVjdCBwcmludF9idWYgKmJ1ZiwgCisJCSAgICAgICBjb25zdCBjaGFyICpzdHIpOworCisvKgorICogRGVidWdnaW5nIGNvZGUgdXNlZCBieSBsaW5rIHJvdXRpbmVzIG9ubHkKKyAqCisgKiBXaGVuIGRlYnVnZ2luZyBsaW5rIHByb2JsZW1zIG9uIGEgc3lzdGVtIHRoYXQgaGFzIG11bHRpcGxlIGxpbmtzLAorICogdGhlIHN0YW5kYXJkIFRJUEMgZGVidWdnaW5nIHJvdXRpbmVzIG1heSBub3QgYmUgdXNlZnVsIHNpbmNlIHRoZXkKKyAqIGFsbG93IHRoZSBvdXRwdXQgZnJvbSBtdWx0aXBsZSBsaW5rcyB0byBiZSBpbnRlcm1peGVkLiAgRm9yIHRoaXMgcmVhc29uCisgKiByb3V0aW5lcyBvZiB0aGUgZm9ybSAiZGJnX2xpbmtfWFhYKCkiIGhhdmUgYmVlbiBjcmVhdGVkIHRoYXQgd2lsbCBjYXB0dXJlCisgKiBkZWJ1ZyBpbmZvIGludG8gYSBsaW5rJ3MgcGVyc29uYWwgcHJpbnQgYnVmZmVyLCB3aGljaCBjYW4gdGhlbiBiZSBkdW1wZWQKKyAqIGludG8gdGhlIFRJUEMgc3lzdGVtIGxvZyAoTE9HKSB1cG9uIHJlcXVlc3QuCisgKgorICogVG8gZW5hYmxlIHBlci1saW5rIGRlYnVnZ2luZywgdXNlIExJTktfTE9HX0JVRl9TSVpFIHRvIHNwZWNpZnkgdGhlIHNpemUKKyAqIG9mIHRoZSBwcmludCBidWZmZXIgdXNlZCBieSBlYWNoIGxpbmsuICBJZiBMSU5LX0xPR19CVUZfU0laRSBpcyBzZXQgdG8gMCwKKyAqIHRoZSBkYmdfbGlua19YWFgoKSByb3V0aW5lcyBzaW1wbHkgc2VuZCB0aGVpciBvdXRwdXQgdG8gdGhlIHN0YW5kYXJkIAorICogZGVidWcgcHJpbnQgYnVmZmVyIChEQkdfT1VUUFVUKSwgaWYgaXQgaGFzIGJlZW4gZGVmaW5lZDsgdGhpcyBjYW4gYmUgdXNlZnVsCisgKiB3aGVuIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgbGluayBpbiB0aGUgc3lzdGVtIGJlaW5nIGRlYnVnZ2VkLgorICoKKyAqIE5vdGVzOgorICogLSBXaGVuIGVuYWJsZWQsIExJTktfTE9HX0JVRl9TSVpFIHNob3VsZCBiZSBzZXQgdG8gYXQgbGVhc3QgMTAwMCAoYnl0ZXMpCisgKiAtICJsX3B0ciIgbXVzdCBiZSB2YWxpZCB3aGVuIHVzaW5nIGRiZ19saW5rX1hYWCgpIG1hY3JvcyAgCisgKi8KKworI2RlZmluZSBMSU5LX0xPR19CVUZfU0laRSAwCisKKyNkZWZpbmUgZGJnX2xpbmsoZm10LCBhcmcuLi4pICBkbyB7aWYgKExJTktfTE9HX0JVRl9TSVpFKSB0aXBjX3ByaW50ZigmbF9wdHItPnByaW50X2J1ZiwgZm10LCAjIyBhcmcpOyB9IHdoaWxlKDApCisjZGVmaW5lIGRiZ19saW5rX21zZyhtc2csIHR4dCkgZG8ge2lmIChMSU5LX0xPR19CVUZfU0laRSkgdGlwY19tc2dfcHJpbnQoJmxfcHRyLT5wcmludF9idWYsIG1zZywgdHh0KTsgfSB3aGlsZSgwKQorI2RlZmluZSBkYmdfbGlua19zdGF0ZSh0eHQpIGRvIHtpZiAoTElOS19MT0dfQlVGX1NJWkUpIGxpbmtfcHJpbnQobF9wdHIsICZsX3B0ci0+cHJpbnRfYnVmLCB0eHQpOyB9IHdoaWxlKDApCisjZGVmaW5lIGRiZ19saW5rX2R1bXAoKSBkbyB7IFwKKwlpZiAoTElOS19MT0dfQlVGX1NJWkUpIHsgXAorCQl0aXBjX3ByaW50ZihMT0csICJcblxuRHVtcGluZyBsaW5rIDwlcz46XG4iLCBsX3B0ci0+bmFtZSk7IFwKKwkJdGlwY19wcmludGJ1Zl9tb3ZlKExPRywgJmxfcHRyLT5wcmludF9idWYpOyBcCisJfSBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGJnX3ByaW50X2xpbmsoc3RydWN0IGxpbmsgKmxfcHRyLCBjb25zdCBjaGFyICpzdHIpCit7CisJaWYgKERCR19PVVRQVVQpCisJCWxpbmtfcHJpbnQobF9wdHIsIERCR19PVVRQVVQsIHN0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkYmdfcHJpbnRfYnVmX2NoYWluKHN0cnVjdCBza19idWZmICpyb290X2J1ZikKK3sKKwlpZiAoREJHX09VVFBVVCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gcm9vdF9idWY7CisKKwkJd2hpbGUgKGJ1ZikgeworCQkJbXNnX2RiZyhidWZfbXNnKGJ1ZiksICJJbiBjaGFpbjogIik7CisJCQlidWYgPSBidWYtPm5leHQ7CisJCX0KKwl9Cit9CisKKy8qCisgKiAgU2ltcGxlIGlubGluZWQgbGluayByb3V0aW5lcworICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGFsaWduKHVuc2lnbmVkIGludCBpKQoreworCXJldHVybiAoaSArIDMpICYgfjN1OworfQorCitzdGF0aWMgaW5saW5lIGludCBsaW5rX3dvcmtpbmdfd29ya2luZyhzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJcmV0dXJuIChsX3B0ci0+c3RhdGUgPT0gV09SS0lOR19XT1JLSU5HKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGlua193b3JraW5nX3Vua25vd24oc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXJldHVybiAobF9wdHItPnN0YXRlID09IFdPUktJTkdfVU5LTk9XTik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxpbmtfcmVzZXRfdW5rbm93bihzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJcmV0dXJuIChsX3B0ci0+c3RhdGUgPT0gUkVTRVRfVU5LTk9XTik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxpbmtfcmVzZXRfcmVzZXQoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXJldHVybiAobF9wdHItPnN0YXRlID09IFJFU0VUX1JFU0VUKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGlua19ibG9ja2VkKHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlyZXR1cm4gKGxfcHRyLT5leHBfbXNnX2NvdW50IHx8IGxfcHRyLT5ibG9ja2VkKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGlua19jb25nZXN0ZWQoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXJldHVybiAobF9wdHItPm91dF9xdWV1ZV9zaXplID49IGxfcHRyLT5xdWV1ZV9saW1pdFswXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGxpbmtfbWF4X3BrdChzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJcmV0dXJuIGxfcHRyLT5tYXhfcGt0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGlua19pbml0X21heF9wa3Qoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXUzMiBtYXhfcGt0OworCQorCW1heF9wa3QgPSAobF9wdHItPmJfcHRyLT5wdWJsLm10dSAmIH4zKTsKKwlpZiAobWF4X3BrdCA+IE1BWF9NU0dfU0laRSkKKwkJbWF4X3BrdCA9IE1BWF9NU0dfU0laRTsKKworICAgICAgICBsX3B0ci0+bWF4X3BrdF90YXJnZXQgPSBtYXhfcGt0OworCWlmIChsX3B0ci0+bWF4X3BrdF90YXJnZXQgPCBNQVhfUEtUX0RFRkFVTFQpCisJCWxfcHRyLT5tYXhfcGt0ID0gbF9wdHItPm1heF9wa3RfdGFyZ2V0OworCWVsc2UgCisJCWxfcHRyLT5tYXhfcGt0ID0gTUFYX1BLVF9ERUZBVUxUOworCisgICAgICAgIGxfcHRyLT5tYXhfcGt0X3Byb2JlcyA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGxpbmtfbmV4dF9zZW50KHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlpZiAobF9wdHItPm5leHRfb3V0KQorCQlyZXR1cm4gbXNnX3NlcW5vKGJ1Zl9tc2cobF9wdHItPm5leHRfb3V0KSk7CisJcmV0dXJuIG1vZChsX3B0ci0+bmV4dF9vdXRfbm8pOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBsaW5rX2xhc3Rfc2VudChzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJcmV0dXJuIG1vZChsaW5rX25leHRfc2VudChsX3B0cikgLSAxKTsKK30KKworLyoKKyAqICBTaW1wbGUgbm9uLWlubGluZWQgbGluayByb3V0aW5lcyAoaS5lLiByZWZlcmVuY2VkIG91dHNpZGUgdGhpcyBmaWxlKQorICovCisKK2ludCB0aXBjX2xpbmtfaXNfdXAoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCWlmICghbF9wdHIpCisJCXJldHVybiAwOworCXJldHVybiAobGlua193b3JraW5nX3dvcmtpbmcobF9wdHIpIHx8IGxpbmtfd29ya2luZ191bmtub3duKGxfcHRyKSk7Cit9CisKK2ludCB0aXBjX2xpbmtfaXNfYWN0aXZlKHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlyZXR1cm4gKChsX3B0ci0+b3duZXItPmFjdGl2ZV9saW5rc1swXSA9PSBsX3B0cikgfHwKKwkJKGxfcHRyLT5vd25lci0+YWN0aXZlX2xpbmtzWzFdID09IGxfcHRyKSk7Cit9CisKKy8qKgorICogbGlua19uYW1lX3ZhbGlkYXRlIC0gdmFsaWRhdGUgJiAob3B0aW9uYWxseSkgZGVjb25zdHJ1Y3QgbGluayBuYW1lCisgKiBAbmFtZSAtIHB0ciB0byBsaW5rIG5hbWUgc3RyaW5nCisgKiBAbmFtZV9wYXJ0cyAtIHB0ciB0byBhcmVhIGZvciBsaW5rIG5hbWUgY29tcG9uZW50cyAob3IgTlVMTCBpZiBub3QgbmVlZGVkKQorICogCisgKiBSZXR1cm5zIDEgaWYgbGluayBuYW1lIGlzIHZhbGlkLCBvdGhlcndpc2UgMC4KKyAqLworCitzdGF0aWMgaW50IGxpbmtfbmFtZV92YWxpZGF0ZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgbGlua19uYW1lICpuYW1lX3BhcnRzKQoreworCWNoYXIgbmFtZV9jb3B5W1RJUENfTUFYX0xJTktfTkFNRV07CisJY2hhciAqYWRkcl9sb2NhbDsKKwljaGFyICppZl9sb2NhbDsKKwljaGFyICphZGRyX3BlZXI7CisJY2hhciAqaWZfcGVlcjsKKwljaGFyIGR1bW15OworCXUzMiB6X2xvY2FsLCBjX2xvY2FsLCBuX2xvY2FsOworCXUzMiB6X3BlZXIsIGNfcGVlciwgbl9wZWVyOworCXUzMiBpZl9sb2NhbF9sZW47CisJdTMyIGlmX3BlZXJfbGVuOworCisJLyogY29weSBsaW5rIG5hbWUgJiBlbnN1cmUgbGVuZ3RoIGlzIE9LICovCisKKwluYW1lX2NvcHlbVElQQ19NQVhfTElOS19OQU1FIC0gMV0gPSAwOworCS8qIG5lZWQgYWJvdmUgaW4gY2FzZSBub24tUG9zaXggc3RybmNweSgpIGRvZXNuJ3QgcGFkIHdpdGggbnVsbHMgKi8KKwlzdHJuY3B5KG5hbWVfY29weSwgbmFtZSwgVElQQ19NQVhfTElOS19OQU1FKTsKKwlpZiAobmFtZV9jb3B5W1RJUENfTUFYX0xJTktfTkFNRSAtIDFdICE9IDApCisJCXJldHVybiAwOworCisJLyogZW5zdXJlIGFsbCBjb21wb25lbnQgcGFydHMgb2YgbGluayBuYW1lIGFyZSBwcmVzZW50ICovCisKKwlhZGRyX2xvY2FsID0gbmFtZV9jb3B5OworCWlmICgoaWZfbG9jYWwgPSBzdHJjaHIoYWRkcl9sb2NhbCwgJzonKSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJKihpZl9sb2NhbCsrKSA9IDA7CisJaWYgKChhZGRyX3BlZXIgPSBzdHJjaHIoaWZfbG9jYWwsICctJykpID09IE5VTEwpCisJCXJldHVybiAwOworCSooYWRkcl9wZWVyKyspID0gMDsKKwlpZl9sb2NhbF9sZW4gPSBhZGRyX3BlZXIgLSBpZl9sb2NhbDsKKwlpZiAoKGlmX3BlZXIgPSBzdHJjaHIoYWRkcl9wZWVyLCAnOicpKSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwkqKGlmX3BlZXIrKykgPSAwOworCWlmX3BlZXJfbGVuID0gc3RybGVuKGlmX3BlZXIpICsgMTsKKworCS8qIHZhbGlkYXRlIGNvbXBvbmVudCBwYXJ0cyBvZiBsaW5rIG5hbWUgKi8KKworCWlmICgoc3NjYW5mKGFkZHJfbG9jYWwsICIldS4ldS4ldSVjIiwKKwkJICAgICZ6X2xvY2FsLCAmY19sb2NhbCwgJm5fbG9jYWwsICZkdW1teSkgIT0gMykgfHwKKwkgICAgKHNzY2FuZihhZGRyX3BlZXIsICIldS4ldS4ldSVjIiwKKwkJICAgICZ6X3BlZXIsICZjX3BlZXIsICZuX3BlZXIsICZkdW1teSkgIT0gMykgfHwKKwkgICAgKHpfbG9jYWwgPiAyNTUpIHx8IChjX2xvY2FsID4gNDA5NSkgfHwgKG5fbG9jYWwgPiA0MDk1KSB8fAorCSAgICAoel9wZWVyICA+IDI1NSkgfHwgKGNfcGVlciAgPiA0MDk1KSB8fCAobl9wZWVyICA+IDQwOTUpIHx8CisJICAgIChpZl9sb2NhbF9sZW4gPD0gMSkgfHwgKGlmX2xvY2FsX2xlbiA+IFRJUENfTUFYX0lGX05BTUUpIHx8IAorCSAgICAoaWZfcGVlcl9sZW4gIDw9IDEpIHx8IChpZl9wZWVyX2xlbiAgPiBUSVBDX01BWF9JRl9OQU1FKSB8fCAKKwkgICAgKHN0cnNwbihpZl9sb2NhbCwgdGlwY19hbHBoYWJldCkgIT0gKGlmX2xvY2FsX2xlbiAtIDEpKSB8fAorCSAgICAoc3Ryc3BuKGlmX3BlZXIsIHRpcGNfYWxwaGFiZXQpICE9IChpZl9wZWVyX2xlbiAtIDEpKSkKKwkJcmV0dXJuIDA7CisKKwkvKiByZXR1cm4gbGluayBuYW1lIGNvbXBvbmVudHMsIGlmIG5lY2Vzc2FyeSAqLworCisJaWYgKG5hbWVfcGFydHMpIHsKKwkJbmFtZV9wYXJ0cy0+YWRkcl9sb2NhbCA9IHRpcGNfYWRkcih6X2xvY2FsLCBjX2xvY2FsLCBuX2xvY2FsKTsKKwkJc3RyY3B5KG5hbWVfcGFydHMtPmlmX2xvY2FsLCBpZl9sb2NhbCk7CisJCW5hbWVfcGFydHMtPmFkZHJfcGVlciA9IHRpcGNfYWRkcih6X3BlZXIsIGNfcGVlciwgbl9wZWVyKTsKKwkJc3RyY3B5KG5hbWVfcGFydHMtPmlmX3BlZXIsIGlmX3BlZXIpOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBsaW5rX3RpbWVvdXQgLSBoYW5kbGUgZXhwaXJhdGlvbiBvZiBsaW5rIHRpbWVyCisgKiBAbF9wdHI6IHBvaW50ZXIgdG8gbGluaworICogCisgKiBUaGlzIHJvdXRpbmUgbXVzdCBub3QgZ3JhYiAidGlwY19uZXRfbG9jayIgdG8gYXZvaWQgYSBwb3RlbnRpYWwgZGVhZGxvY2sgY29uZmxpY3QKKyAqIHdpdGggdGlwY19saW5rX2RlbGV0ZSgpLiAgKFRoZXJlIGlzIG5vIHJpc2sgdGhhdCB0aGUgbm9kZSB3aWxsIGJlIGRlbGV0ZWQgYnkKKyAqIGFub3RoZXIgdGhyZWFkIGJlY2F1c2UgdGlwY19saW5rX2RlbGV0ZSgpIGFsd2F5cyBjYW5jZWxzIHRoZSBsaW5rIHRpbWVyIGJlZm9yZQorICogdGlwY19ub2RlX2RlbGV0ZSgpIGlzIGNhbGxlZC4pCisgKi8KKworc3RhdGljIHZvaWQgbGlua190aW1lb3V0KHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwl0aXBjX25vZGVfbG9jayhsX3B0ci0+b3duZXIpOworCisJLyogdXBkYXRlIGNvdW50ZXJzIHVzZWQgaW4gc3RhdGlzdGljYWwgcHJvZmlsaW5nIG9mIHNlbmQgdHJhZmZpYyAqLworCisJbF9wdHItPnN0YXRzLmFjY3VfcXVldWVfc3ogKz0gbF9wdHItPm91dF9xdWV1ZV9zaXplOworCWxfcHRyLT5zdGF0cy5xdWV1ZV9zel9jb3VudHMrKzsKKworCWlmIChsX3B0ci0+b3V0X3F1ZXVlX3NpemUgPiBsX3B0ci0+c3RhdHMubWF4X3F1ZXVlX3N6KQorCQlsX3B0ci0+c3RhdHMubWF4X3F1ZXVlX3N6ID0gbF9wdHItPm91dF9xdWV1ZV9zaXplOworCisJaWYgKGxfcHRyLT5maXJzdF9vdXQpIHsKKwkJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGxfcHRyLT5maXJzdF9vdXQpOworCQl1MzIgbGVuZ3RoID0gbXNnX3NpemUobXNnKTsKKworCQlpZiAoKG1zZ191c2VyKG1zZykgPT0gTVNHX0ZSQUdNRU5URVIpCisJCSAgICAmJiAobXNnX3R5cGUobXNnKSA9PSBGSVJTVF9GUkFHTUVOVCkpIHsKKwkJCWxlbmd0aCA9IG1zZ19zaXplKG1zZ19nZXRfd3JhcHBlZChtc2cpKTsKKwkJfQorCQlpZiAobGVuZ3RoKSB7CisJCQlsX3B0ci0+c3RhdHMubXNnX2xlbmd0aHNfdG90YWwgKz0gbGVuZ3RoOworCQkJbF9wdHItPnN0YXRzLm1zZ19sZW5ndGhfY291bnRzKys7CisJCQlpZiAobGVuZ3RoIDw9IDY0KQorCQkJCWxfcHRyLT5zdGF0cy5tc2dfbGVuZ3RoX3Byb2ZpbGVbMF0rKzsKKwkJCWVsc2UgaWYgKGxlbmd0aCA8PSAyNTYpCisJCQkJbF9wdHItPnN0YXRzLm1zZ19sZW5ndGhfcHJvZmlsZVsxXSsrOworCQkJZWxzZSBpZiAobGVuZ3RoIDw9IDEwMjQpCisJCQkJbF9wdHItPnN0YXRzLm1zZ19sZW5ndGhfcHJvZmlsZVsyXSsrOworCQkJZWxzZSBpZiAobGVuZ3RoIDw9IDQwOTYpCisJCQkJbF9wdHItPnN0YXRzLm1zZ19sZW5ndGhfcHJvZmlsZVszXSsrOworCQkJZWxzZSBpZiAobGVuZ3RoIDw9IDE2Mzg0KQorCQkJCWxfcHRyLT5zdGF0cy5tc2dfbGVuZ3RoX3Byb2ZpbGVbNF0rKzsKKwkJCWVsc2UgaWYgKGxlbmd0aCA8PSAzMjc2OCkKKwkJCQlsX3B0ci0+c3RhdHMubXNnX2xlbmd0aF9wcm9maWxlWzVdKys7CisJCQllbHNlCisJCQkJbF9wdHItPnN0YXRzLm1zZ19sZW5ndGhfcHJvZmlsZVs2XSsrOworCQl9CisJfQorCisJLyogZG8gYWxsIG90aGVyIGxpbmsgcHJvY2Vzc2luZyBwZXJmb3JtZWQgb24gYSBwZXJpb2RpYyBiYXNpcyAqLworCisJbGlua19jaGVja19kZWZyYWdtX2J1ZnMobF9wdHIpOworCisJbGlua19zdGF0ZV9ldmVudChsX3B0ciwgVElNRU9VVF9FVlQpOworCisJaWYgKGxfcHRyLT5uZXh0X291dCkKKwkJdGlwY19saW5rX3B1c2hfcXVldWUobF9wdHIpOworCisJdGlwY19ub2RlX3VubG9jayhsX3B0ci0+b3duZXIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGlua19zZXRfdGltZXIoc3RydWN0IGxpbmsgKmxfcHRyLCB1MzIgdGltZSkKK3sKKwlrX3N0YXJ0X3RpbWVyKCZsX3B0ci0+dGltZXIsIHRpbWUpOworfQorCisvKioKKyAqIHRpcGNfbGlua19jcmVhdGUgLSBjcmVhdGUgYSBuZXcgbGluaworICogQGJfcHRyOiBwb2ludGVyIHRvIGFzc29jaWF0ZWQgYmVhcmVyCisgKiBAcGVlcjogbmV0d29yayBhZGRyZXNzIG9mIG5vZGUgYXQgb3RoZXIgZW5kIG9mIGxpbmsKKyAqIEBtZWRpYV9hZGRyOiBtZWRpYSBhZGRyZXNzIHRvIHVzZSB3aGVuIHNlbmRpbmcgbWVzc2FnZXMgb3ZlciBsaW5rCisgKiAKKyAqIFJldHVybnMgcG9pbnRlciB0byBsaW5rLgorICovCisKK3N0cnVjdCBsaW5rICp0aXBjX2xpbmtfY3JlYXRlKHN0cnVjdCBiZWFyZXIgKmJfcHRyLCBjb25zdCB1MzIgcGVlciwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKm1lZGlhX2FkZHIpCit7CisJc3RydWN0IGxpbmsgKmxfcHRyOworCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCWNoYXIgKmlmX25hbWU7CisKKwlsX3B0ciA9IChzdHJ1Y3QgbGluayAqKWttYWxsb2Moc2l6ZW9mKCpsX3B0ciksIEdGUF9BVE9NSUMpOworCWlmICghbF9wdHIpIHsKKwkJd2FybigiTWVtb3J5IHNxdWVlemU7IEZhaWxlZCB0byBjcmVhdGUgbGlua1xuIik7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQobF9wdHIsIDAsIHNpemVvZigqbF9wdHIpKTsKKworCWxfcHRyLT5hZGRyID0gcGVlcjsKKwlpZl9uYW1lID0gc3RyY2hyKGJfcHRyLT5wdWJsLm5hbWUsICc6JykgKyAxOworCXNwcmludGYobF9wdHItPm5hbWUsICIldS4ldS4ldTolcy0ldS4ldS4ldToiLAorCQl0aXBjX3pvbmUodGlwY19vd25fYWRkciksIHRpcGNfY2x1c3Rlcih0aXBjX293bl9hZGRyKSwKKwkJdGlwY19ub2RlKHRpcGNfb3duX2FkZHIpLCAKKwkJaWZfbmFtZSwKKwkJdGlwY196b25lKHBlZXIpLCB0aXBjX2NsdXN0ZXIocGVlciksIHRpcGNfbm9kZShwZWVyKSk7CisJCS8qIG5vdGU6IHBlZXIgaS9mIGlzIGFwcGVuZGVkIHRvIGxpbmsgbmFtZSBieSByZXNldC9hY3RpdmF0ZSAqLworCW1lbWNweSgmbF9wdHItPm1lZGlhX2FkZHIsIG1lZGlhX2FkZHIsIHNpemVvZigqbWVkaWFfYWRkcikpOworCWtfaW5pdF90aW1lcigmbF9wdHItPnRpbWVyLCAoSGFuZGxlcilsaW5rX3RpbWVvdXQsICh1bnNpZ25lZCBsb25nKWxfcHRyKTsKKwlsaXN0X2FkZF90YWlsKCZsX3B0ci0+bGlua19saXN0LCAmYl9wdHItPmxpbmtzKTsKKwlsX3B0ci0+Y2hlY2twb2ludCA9IDE7CisJbF9wdHItPmJfcHRyID0gYl9wdHI7CisJbGlua19zZXRfc3VwZXJ2aXNpb25fcHJvcHMobF9wdHIsIGJfcHRyLT5tZWRpYS0+dG9sZXJhbmNlKTsKKwlsX3B0ci0+c3RhdGUgPSBSRVNFVF9VTktOT1dOOworCisJbF9wdHItPnBtc2cgPSAoc3RydWN0IHRpcGNfbXNnICopJmxfcHRyLT5wcm90b19tc2c7CisJbXNnID0gbF9wdHItPnBtc2c7CisJbXNnX2luaXQobXNnLCBMSU5LX1BST1RPQ09MLCBSRVNFVF9NU0csIFRJUENfT0ssIElOVF9IX1NJWkUsIGxfcHRyLT5hZGRyKTsKKwltc2dfc2V0X3NpemUobXNnLCBzaXplb2YobF9wdHItPnByb3RvX21zZykpOworCW1zZ19zZXRfc2Vzc2lvbihtc2csIHRpcGNfcmFuZG9tKTsKKwltc2dfc2V0X2JlYXJlcl9pZChtc2csIGJfcHRyLT5pZGVudGl0eSk7CisJc3RyY3B5KChjaGFyICopbXNnX2RhdGEobXNnKSwgaWZfbmFtZSk7CisKKwlsX3B0ci0+cHJpb3JpdHkgPSBiX3B0ci0+cHJpb3JpdHk7CisJdGlwY19saW5rX3NldF9xdWV1ZV9saW1pdHMobF9wdHIsIGJfcHRyLT5tZWRpYS0+d2luZG93KTsKKworCWxpbmtfaW5pdF9tYXhfcGt0KGxfcHRyKTsKKworCWxfcHRyLT5uZXh0X291dF9ubyA9IDE7CisJSU5JVF9MSVNUX0hFQUQoJmxfcHRyLT53YWl0aW5nX3BvcnRzKTsKKworCWxpbmtfcmVzZXRfc3RhdGlzdGljcyhsX3B0cik7CisKKwlsX3B0ci0+b3duZXIgPSB0aXBjX25vZGVfYXR0YWNoX2xpbmsobF9wdHIpOworCWlmICghbF9wdHItPm93bmVyKSB7CisJCWtmcmVlKGxfcHRyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKExJTktfTE9HX0JVRl9TSVpFKSB7CisJCWNoYXIgKnBiID0ga21hbGxvYyhMSU5LX0xPR19CVUZfU0laRSwgR0ZQX0FUT01JQyk7CisKKwkJaWYgKCFwYikgeworCQkJa2ZyZWUobF9wdHIpOworCQkJd2FybigiTWVtb3J5IHNxdWVlemU7IEZhaWxlZCB0byBjcmVhdGUgbGlua1xuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQl0aXBjX3ByaW50YnVmX2luaXQoJmxfcHRyLT5wcmludF9idWYsIHBiLCBMSU5LX0xPR19CVUZfU0laRSk7CisJfQorCisJdGlwY19rX3NpZ25hbCgoSGFuZGxlcil0aXBjX2xpbmtfc3RhcnQsICh1bnNpZ25lZCBsb25nKWxfcHRyKTsKKworCWRiZygidGlwY19saW5rX2NyZWF0ZSgpOiB0b2xlcmFuY2UgPSAldSxjb250IGludHYgPSAldSwgYWJvcnRfbGltaXQgPSAldVxuIiwKKwkgICAgbF9wdHItPnRvbGVyYW5jZSwgbF9wdHItPmNvbnRpbnVpdHlfaW50ZXJ2YWwsIGxfcHRyLT5hYm9ydF9saW1pdCk7CisJCisJcmV0dXJuIGxfcHRyOworfQorCisvKiogCisgKiB0aXBjX2xpbmtfZGVsZXRlIC0gZGVsZXRlIGEgbGluaworICogQGxfcHRyOiBwb2ludGVyIHRvIGxpbmsKKyAqIAorICogTm90ZTogJ3RpcGNfbmV0X2xvY2snIGlzIHdyaXRlX2xvY2tlZCwgYmVhcmVyIGlzIGxvY2tlZC4KKyAqIFRoaXMgcm91dGluZSBtdXN0IG5vdCBncmFiIHRoZSBub2RlIGxvY2sgdW50aWwgYWZ0ZXIgbGluayB0aW1lciBjYW5jZWxsYXRpb24KKyAqIHRvIGF2b2lkIGEgcG90ZW50aWFsIGRlYWRsb2NrIHNpdHVhdGlvbi4gIAorICovCisKK3ZvaWQgdGlwY19saW5rX2RlbGV0ZShzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJaWYgKCFsX3B0cikgeworCQllcnIoIkF0dGVtcHQgdG8gZGVsZXRlIG5vbi1leGlzdGVudCBsaW5rXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWRiZygidGlwY19saW5rX2RlbGV0ZSgpXG4iKTsKKworCWtfY2FuY2VsX3RpbWVyKCZsX3B0ci0+dGltZXIpOworCQorCXRpcGNfbm9kZV9sb2NrKGxfcHRyLT5vd25lcik7CisJdGlwY19saW5rX3Jlc2V0KGxfcHRyKTsKKwl0aXBjX25vZGVfZGV0YWNoX2xpbmsobF9wdHItPm93bmVyLCBsX3B0cik7CisJdGlwY19saW5rX3N0b3AobF9wdHIpOworCWxpc3RfZGVsX2luaXQoJmxfcHRyLT5saW5rX2xpc3QpOworCWlmIChMSU5LX0xPR19CVUZfU0laRSkKKwkJa2ZyZWUobF9wdHItPnByaW50X2J1Zi5idWYpOworCXRpcGNfbm9kZV91bmxvY2sobF9wdHItPm93bmVyKTsKKwlrX3Rlcm1fdGltZXIoJmxfcHRyLT50aW1lcik7CisJa2ZyZWUobF9wdHIpOworfQorCit2b2lkIHRpcGNfbGlua19zdGFydChzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJZGJnKCJ0aXBjX2xpbmtfc3RhcnQgJXhcbiIsIGxfcHRyKTsKKwlsaW5rX3N0YXRlX2V2ZW50KGxfcHRyLCBTVEFSVElOR19FVlQpOworfQorCisvKioKKyAqIGxpbmtfc2NoZWR1bGVfcG9ydCAtIHNjaGVkdWxlIHBvcnQgZm9yIGRlZmVycmVkIHNlbmRpbmcgCisgKiBAbF9wdHI6IHBvaW50ZXIgdG8gbGluaworICogQG9yaWdwb3J0OiByZWZlcmVuY2UgdG8gc2VuZGluZyBwb3J0CisgKiBAc3o6IGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAqIAorICogU2NoZWR1bGVzIHBvcnQgZm9yIHJlbmV3ZWQgc2VuZGluZyBvZiBtZXNzYWdlcyBhZnRlciBsaW5rIGNvbmdlc3Rpb24gCisgKiBoYXMgYWJhdGVkLgorICovCisKK3N0YXRpYyBpbnQgbGlua19zY2hlZHVsZV9wb3J0KHN0cnVjdCBsaW5rICpsX3B0ciwgdTMyIG9yaWdwb3J0LCB1MzIgc3opCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCisJc3Bpbl9sb2NrX2JoKCZ0aXBjX3BvcnRfbGlzdF9sb2NrKTsKKwlwX3B0ciA9IHRpcGNfcG9ydF9sb2NrKG9yaWdwb3J0KTsKKwlpZiAocF9wdHIpIHsKKwkJaWYgKCFwX3B0ci0+d2FrZXVwKQorCQkJZ290byBleGl0OworCQlpZiAoIWxpc3RfZW1wdHkoJnBfcHRyLT53YWl0X2xpc3QpKQorCQkJZ290byBleGl0OworCQlwX3B0ci0+Y29uZ2VzdGVkX2xpbmsgPSBsX3B0cjsKKwkJcF9wdHItPnB1YmwuY29uZ2VzdGVkID0gMTsKKwkJcF9wdHItPndhaXRpbmdfcGt0cyA9IDEgKyAoKHN6IC0gMSkgLyBsaW5rX21heF9wa3QobF9wdHIpKTsKKwkJbGlzdF9hZGRfdGFpbCgmcF9wdHItPndhaXRfbGlzdCwgJmxfcHRyLT53YWl0aW5nX3BvcnRzKTsKKwkJbF9wdHItPnN0YXRzLmxpbmtfY29uZ3MrKzsKK2V4aXQ6CisJCXRpcGNfcG9ydF91bmxvY2socF9wdHIpOworCX0KKwlzcGluX3VubG9ja19iaCgmdGlwY19wb3J0X2xpc3RfbG9jayk7CisJcmV0dXJuIC1FTElOS0NPTkc7Cit9CisKK3ZvaWQgdGlwY19saW5rX3dha2V1cF9wb3J0cyhzdHJ1Y3QgbGluayAqbF9wdHIsIGludCBhbGwpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCXN0cnVjdCBwb3J0ICp0ZW1wX3BfcHRyOworCWludCB3aW4gPSBsX3B0ci0+cXVldWVfbGltaXRbMF0gLSBsX3B0ci0+b3V0X3F1ZXVlX3NpemU7CisKKwlpZiAoYWxsKQorCQl3aW4gPSAxMDAwMDA7CisJaWYgKHdpbiA8PSAwKQorCQlyZXR1cm47CisJaWYgKCFzcGluX3RyeWxvY2tfYmgoJnRpcGNfcG9ydF9saXN0X2xvY2spKQorCQlyZXR1cm47CisJaWYgKGxpbmtfY29uZ2VzdGVkKGxfcHRyKSkKKwkJZ290byBleGl0OworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwX3B0ciwgdGVtcF9wX3B0ciwgJmxfcHRyLT53YWl0aW5nX3BvcnRzLCAKKwkJCQkgd2FpdF9saXN0KSB7CisJCWlmICh3aW4gPD0gMCkKKwkJCWJyZWFrOworCQlsaXN0X2RlbF9pbml0KCZwX3B0ci0+d2FpdF9saXN0KTsKKwkJcF9wdHItPmNvbmdlc3RlZF9saW5rID0gMDsKKwkJYXNzZXJ0KHBfcHRyLT53YWtldXApOworCQlzcGluX2xvY2tfYmgocF9wdHItPnB1YmwubG9jayk7CisJCXBfcHRyLT5wdWJsLmNvbmdlc3RlZCA9IDA7CisJCXBfcHRyLT53YWtldXAoJnBfcHRyLT5wdWJsKTsKKwkJd2luIC09IHBfcHRyLT53YWl0aW5nX3BrdHM7CisJCXNwaW5fdW5sb2NrX2JoKHBfcHRyLT5wdWJsLmxvY2spOworCX0KKworZXhpdDoKKwlzcGluX3VubG9ja19iaCgmdGlwY19wb3J0X2xpc3RfbG9jayk7Cit9CisKKy8qKiAKKyAqIGxpbmtfcmVsZWFzZV9vdXRxdWV1ZSAtIHB1cmdlIGxpbmsncyBvdXRib3VuZCBtZXNzYWdlIHF1ZXVlCisgKiBAbF9wdHI6IHBvaW50ZXIgdG8gbGluaworICovCisKK3N0YXRpYyB2b2lkIGxpbmtfcmVsZWFzZV9vdXRxdWV1ZShzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGxfcHRyLT5maXJzdF9vdXQ7CisJc3RydWN0IHNrX2J1ZmYgKm5leHQ7CisKKwl3aGlsZSAoYnVmKSB7CisJCW5leHQgPSBidWYtPm5leHQ7CisJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCWJ1ZiA9IG5leHQ7CisJfQorCWxfcHRyLT5maXJzdF9vdXQgPSBOVUxMOworCWxfcHRyLT5vdXRfcXVldWVfc2l6ZSA9IDA7Cit9CisKKy8qKgorICogdGlwY19saW5rX3Jlc2V0X2ZyYWdtZW50cyAtIHB1cmdlIGxpbmsncyBpbmJvdW5kIG1lc3NhZ2UgZnJhZ21lbnRzIHF1ZXVlCisgKiBAbF9wdHI6IHBvaW50ZXIgdG8gbGluaworICovCisKK3ZvaWQgdGlwY19saW5rX3Jlc2V0X2ZyYWdtZW50cyhzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGxfcHRyLT5kZWZyYWdtX2J1ZjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dDsKKworCXdoaWxlIChidWYpIHsKKwkJbmV4dCA9IGJ1Zi0+bmV4dDsKKwkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJYnVmID0gbmV4dDsKKwl9CisJbF9wdHItPmRlZnJhZ21fYnVmID0gTlVMTDsKK30KKworLyoqIAorICogdGlwY19saW5rX3N0b3AgLSBwdXJnZSBhbGwgaW5ib3VuZCBhbmQgb3V0Ym91bmQgbWVzc2FnZXMgYXNzb2NpYXRlZCB3aXRoIGxpbmsKKyAqIEBsX3B0cjogcG9pbnRlciB0byBsaW5rCisgKi8KKwordm9pZCB0aXBjX2xpbmtfc3RvcChzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dDsKKworCWJ1ZiA9IGxfcHRyLT5vbGRlc3RfZGVmZXJyZWRfaW47CisJd2hpbGUgKGJ1ZikgeworCQluZXh0ID0gYnVmLT5uZXh0OworCQlidWZfZGlzY2FyZChidWYpOworCQlidWYgPSBuZXh0OworCX0KKworCWJ1ZiA9IGxfcHRyLT5maXJzdF9vdXQ7CisJd2hpbGUgKGJ1ZikgeworCQluZXh0ID0gYnVmLT5uZXh0OworCQlidWZfZGlzY2FyZChidWYpOworCQlidWYgPSBuZXh0OworCX0KKworCXRpcGNfbGlua19yZXNldF9mcmFnbWVudHMobF9wdHIpOworCisJYnVmX2Rpc2NhcmQobF9wdHItPnByb3RvX21zZ19xdWV1ZSk7CisJbF9wdHItPnByb3RvX21zZ19xdWV1ZSA9IE5VTEw7Cit9CisKKyNpZiAwCisKKy8qIExJTksgRVZFTlQgQ09ERSBJUyBOT1QgU1VQUE9SVEVEIEFUIFBSRVNFTlQgKi8KKworc3RhdGljIHZvaWQgbGlua19yZWN2X2V2ZW50KHN0cnVjdCBsaW5rX2V2ZW50ICpldikKK3sKKwlldi0+ZmNuKGV2LT5hZGRyLCBldi0+bmFtZSwgZXYtPnVwKTsKKwlrZnJlZShldik7Cit9CisKK3N0YXRpYyB2b2lkIGxpbmtfc2VuZF9ldmVudCh2b2lkICgqZmNuKSh1MzIgYSwgY2hhciAqbiwgaW50IHVwKSwKKwkJCSAgICBzdHJ1Y3QgbGluayAqbF9wdHIsIGludCB1cCkKK3sKKwlzdHJ1Y3QgbGlua19ldmVudCAqZXY7CisJCisJZXYgPSBrbWFsbG9jKHNpemVvZigqZXYpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWV2KSB7CisJCXdhcm4oIkxpbmsgZXZlbnQgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKKwkJcmV0dXJuOworCX0KKwlldi0+YWRkciA9IGxfcHRyLT5hZGRyOworCWV2LT51cCA9IHVwOworCWV2LT5mY24gPSBmY247CisJbWVtY3B5KGV2LT5uYW1lLCBsX3B0ci0+bmFtZSwgVElQQ19NQVhfTElOS19OQU1FKTsKKwl0aXBjX2tfc2lnbmFsKChIYW5kbGVyKWxpbmtfcmVjdl9ldmVudCwgKHVuc2lnbmVkIGxvbmcpZXYpOworfQorCisjZWxzZQorCisjZGVmaW5lIGxpbmtfc2VuZF9ldmVudChmY24sIGxfcHRyLCB1cCkgZG8geyB9IHdoaWxlICgwKQorCisjZW5kaWYKKwordm9pZCB0aXBjX2xpbmtfcmVzZXQoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJdTMyIHByZXZfc3RhdGUgPSBsX3B0ci0+c3RhdGU7CisJdTMyIGNoZWNrcG9pbnQgPSBsX3B0ci0+bmV4dF9pbl9ubzsKKwkKKwltc2dfc2V0X3Nlc3Npb24obF9wdHItPnBtc2csIG1zZ19zZXNzaW9uKGxfcHRyLT5wbXNnKSArIDEpOworCisgICAgICAgIC8qIExpbmsgaXMgZG93biwgYWNjZXB0IGFueSBzZXNzaW9uOiAqLworCWxfcHRyLT5wZWVyX3Nlc3Npb24gPSAwOworCisgICAgICAgIC8qIFByZXBhcmUgZm9yIG1heCBwYWNrZXQgc2l6ZSBuZWdvdGlhdGlvbiAqLworCWxpbmtfaW5pdF9tYXhfcGt0KGxfcHRyKTsKKwkKKwlsX3B0ci0+c3RhdGUgPSBSRVNFVF9VTktOT1dOOworCWRiZ19saW5rX3N0YXRlKCJSZXNldHRpbmcgTGlua1xuIik7CisKKwlpZiAoKHByZXZfc3RhdGUgPT0gUkVTRVRfVU5LTk9XTikgfHwgKHByZXZfc3RhdGUgPT0gUkVTRVRfUkVTRVQpKQorCQlyZXR1cm47CisKKwl0aXBjX25vZGVfbGlua19kb3duKGxfcHRyLT5vd25lciwgbF9wdHIpOworCXRpcGNfYmVhcmVyX3JlbW92ZV9kZXN0KGxfcHRyLT5iX3B0ciwgbF9wdHItPmFkZHIpOworI2lmIDAKKwl0aXBjX3ByaW50ZihUSVBDX0NPTlMsICJcblJlc2V0IGxpbmsgPCVzPlxuIiwgbF9wdHItPm5hbWUpOworCWRiZ19saW5rX2R1bXAoKTsKKyNlbmRpZgorCWlmICh0aXBjX25vZGVfaGFzX2FjdGl2ZV9saW5rcyhsX3B0ci0+b3duZXIpICYmCisJICAgIGxfcHRyLT5vd25lci0+cGVybWl0X2NoYW5nZW92ZXIpIHsKKwkJbF9wdHItPnJlc2V0X2NoZWNrcG9pbnQgPSBjaGVja3BvaW50OworCQlsX3B0ci0+ZXhwX21zZ19jb3VudCA9IFNUQVJUX0NIQU5HRU9WRVI7CisJfQorCisJLyogQ2xlYW4gdXAgYWxsIHF1ZXVlczogKi8KKworCWxpbmtfcmVsZWFzZV9vdXRxdWV1ZShsX3B0cik7CisJYnVmX2Rpc2NhcmQobF9wdHItPnByb3RvX21zZ19xdWV1ZSk7CisJbF9wdHItPnByb3RvX21zZ19xdWV1ZSA9IE5VTEw7CisJYnVmID0gbF9wdHItPm9sZGVzdF9kZWZlcnJlZF9pbjsKKwl3aGlsZSAoYnVmKSB7CisJCXN0cnVjdCBza19idWZmICpuZXh0ID0gYnVmLT5uZXh0OworCQlidWZfZGlzY2FyZChidWYpOworCQlidWYgPSBuZXh0OworCX0KKwlpZiAoIWxpc3RfZW1wdHkoJmxfcHRyLT53YWl0aW5nX3BvcnRzKSkKKwkJdGlwY19saW5rX3dha2V1cF9wb3J0cyhsX3B0ciwgMSk7CisKKwlsX3B0ci0+cmV0cmFuc21fcXVldWVfaGVhZCA9IDA7CisJbF9wdHItPnJldHJhbnNtX3F1ZXVlX3NpemUgPSAwOworCWxfcHRyLT5sYXN0X291dCA9IE5VTEw7CisJbF9wdHItPmZpcnN0X291dCA9IE5VTEw7CisJbF9wdHItPm5leHRfb3V0ID0gTlVMTDsKKwlsX3B0ci0+dW5hY2tlZF93aW5kb3cgPSAwOworCWxfcHRyLT5jaGVja3BvaW50ID0gMTsKKwlsX3B0ci0+bmV4dF9vdXRfbm8gPSAxOworCWxfcHRyLT5kZWZlcnJlZF9pbnF1ZXVlX3N6ID0gMDsKKwlsX3B0ci0+b2xkZXN0X2RlZmVycmVkX2luID0gTlVMTDsKKwlsX3B0ci0+bmV3ZXN0X2RlZmVycmVkX2luID0gTlVMTDsKKwlsX3B0ci0+ZnNtX21zZ19jbnQgPSAwOworCWxfcHRyLT5zdGFsZV9jb3VudCA9IDA7CisJbGlua19yZXNldF9zdGF0aXN0aWNzKGxfcHRyKTsKKworCWxpbmtfc2VuZF9ldmVudCh0aXBjX2NmZ19saW5rX2V2ZW50LCBsX3B0ciwgMCk7CisJaWYgKCFpbl9vd25fY2x1c3RlcihsX3B0ci0+YWRkcikpCisJCWxpbmtfc2VuZF9ldmVudCh0aXBjX2Rpc2NfbGlua19ldmVudCwgbF9wdHIsIDApOworfQorCisKK3N0YXRpYyB2b2lkIGxpbmtfYWN0aXZhdGUoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCWxfcHRyLT5uZXh0X2luX25vID0gMTsKKwl0aXBjX25vZGVfbGlua191cChsX3B0ci0+b3duZXIsIGxfcHRyKTsKKwl0aXBjX2JlYXJlcl9hZGRfZGVzdChsX3B0ci0+Yl9wdHIsIGxfcHRyLT5hZGRyKTsKKwlsaW5rX3NlbmRfZXZlbnQodGlwY19jZmdfbGlua19ldmVudCwgbF9wdHIsIDEpOworCWlmICghaW5fb3duX2NsdXN0ZXIobF9wdHItPmFkZHIpKQorCQlsaW5rX3NlbmRfZXZlbnQodGlwY19kaXNjX2xpbmtfZXZlbnQsIGxfcHRyLCAxKTsKK30KKworLyoqCisgKiBsaW5rX3N0YXRlX2V2ZW50IC0gbGluayBmaW5pdGUgc3RhdGUgbWFjaGluZQorICogQGxfcHRyOiBwb2ludGVyIHRvIGxpbmsKKyAqIEBldmVudDogc3RhdGUgbWFjaGluZSBldmVudCB0byBwcm9jZXNzCisgKi8KKworc3RhdGljIHZvaWQgbGlua19zdGF0ZV9ldmVudChzdHJ1Y3QgbGluayAqbF9wdHIsIHVuc2lnbmVkIGV2ZW50KQoreworCXN0cnVjdCBsaW5rICpvdGhlcjsgCisJdTMyIGNvbnRfaW50diA9IGxfcHRyLT5jb250aW51aXR5X2ludGVydmFsOworCisJaWYgKCFsX3B0ci0+c3RhcnRlZCAmJiAoZXZlbnQgIT0gU1RBUlRJTkdfRVZUKSkKKwkJcmV0dXJuOwkJLyogTm90IHlldC4gKi8KKworCWlmIChsaW5rX2Jsb2NrZWQobF9wdHIpKSB7CisJCWlmIChldmVudCA9PSBUSU1FT1VUX0VWVCkgeworCQkJbGlua19zZXRfdGltZXIobF9wdHIsIGNvbnRfaW50dik7CisJCX0KKwkJcmV0dXJuOwkgIC8qIENoYW5nZW92ZXIgZ29pbmcgb24gKi8KKwl9CisJZGJnX2xpbmsoIlNUQVRFX0VWOiA8JXM+ICIsIGxfcHRyLT5uYW1lKTsKKworCXN3aXRjaCAobF9wdHItPnN0YXRlKSB7CisJY2FzZSBXT1JLSU5HX1dPUktJTkc6CisJCWRiZ19saW5rKCJXVy8iKTsKKwkJc3dpdGNoIChldmVudCkgeworCQljYXNlIFRSQUZGSUNfTVNHX0VWVDoKKwkJCWRiZ19saW5rKCJUUkYtIik7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBBQ1RJVkFURV9NU0c6CisJCQlkYmdfbGluaygiQUNUXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFRJTUVPVVRfRVZUOgorCQkJZGJnX2xpbmsoIlRJTSAiKTsKKwkJCWlmIChsX3B0ci0+bmV4dF9pbl9ubyAhPSBsX3B0ci0+Y2hlY2twb2ludCkgeworCQkJCWxfcHRyLT5jaGVja3BvaW50ID0gbF9wdHItPm5leHRfaW5fbm87CisJCQkJaWYgKHRpcGNfYmNsaW5rX2Fja3NfbWlzc2luZyhsX3B0ci0+b3duZXIpKSB7CisJCQkJCXRpcGNfbGlua19zZW5kX3Byb3RvX21zZyhsX3B0ciwgU1RBVEVfTVNHLCAKKwkJCQkJCQkJIDAsIDAsIDAsIDAsIDApOworCQkJCQlsX3B0ci0+ZnNtX21zZ19jbnQrKzsKKwkJCQl9IGVsc2UgaWYgKGxfcHRyLT5tYXhfcGt0IDwgbF9wdHItPm1heF9wa3RfdGFyZ2V0KSB7CisJCQkJCXRpcGNfbGlua19zZW5kX3Byb3RvX21zZyhsX3B0ciwgU1RBVEVfTVNHLCAKKwkJCQkJCQkJIDEsIDAsIDAsIDAsIDApOworCQkJCQlsX3B0ci0+ZnNtX21zZ19jbnQrKzsKKwkJCQl9CisJCQkJbGlua19zZXRfdGltZXIobF9wdHIsIGNvbnRfaW50dik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkYmdfbGluaygiIC0+IFdVXG4iKTsKKwkJCWxfcHRyLT5zdGF0ZSA9IFdPUktJTkdfVU5LTk9XTjsKKwkJCWxfcHRyLT5mc21fbXNnX2NudCA9IDA7CisJCQl0aXBjX2xpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIFNUQVRFX01TRywgMSwgMCwgMCwgMCwgMCk7CisJCQlsX3B0ci0+ZnNtX21zZ19jbnQrKzsKKwkJCWxpbmtfc2V0X3RpbWVyKGxfcHRyLCBjb250X2ludHYgLyA0KTsKKwkJCWJyZWFrOworCQljYXNlIFJFU0VUX01TRzoKKwkJCWRiZ19saW5rKCJSRVMgLT4gUlJcbiIpOworCQkJdGlwY19saW5rX3Jlc2V0KGxfcHRyKTsKKwkJCWxfcHRyLT5zdGF0ZSA9IFJFU0VUX1JFU0VUOworCQkJbF9wdHItPmZzbV9tc2dfY250ID0gMDsKKwkJCXRpcGNfbGlua19zZW5kX3Byb3RvX21zZyhsX3B0ciwgQUNUSVZBVEVfTVNHLCAwLCAwLCAwLCAwLCAwKTsKKwkJCWxfcHRyLT5mc21fbXNnX2NudCsrOworCQkJbGlua19zZXRfdGltZXIobF9wdHIsIGNvbnRfaW50dik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVycigiVW5rbm93biBsaW5rIGV2ZW50ICV1IGluIFdXIHN0YXRlXG4iLCBldmVudCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXT1JLSU5HX1VOS05PV046CisJCWRiZ19saW5rKCJXVS8iKTsKKwkJc3dpdGNoIChldmVudCkgeworCQljYXNlIFRSQUZGSUNfTVNHX0VWVDoKKwkJCWRiZ19saW5rKCJUUkYtIik7CisJCWNhc2UgQUNUSVZBVEVfTVNHOgorCQkJZGJnX2xpbmsoIkFDVCAtPiBXV1xuIik7CisJCQlsX3B0ci0+c3RhdGUgPSBXT1JLSU5HX1dPUktJTkc7CisJCQlsX3B0ci0+ZnNtX21zZ19jbnQgPSAwOworCQkJbGlua19zZXRfdGltZXIobF9wdHIsIGNvbnRfaW50dik7CisJCQlicmVhazsKKwkJY2FzZSBSRVNFVF9NU0c6CisJCQlkYmdfbGluaygiUkVTIC0+IFJSXG4iKTsKKwkJCXRpcGNfbGlua19yZXNldChsX3B0cik7CisJCQlsX3B0ci0+c3RhdGUgPSBSRVNFVF9SRVNFVDsKKwkJCWxfcHRyLT5mc21fbXNnX2NudCA9IDA7CisJCQl0aXBjX2xpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIEFDVElWQVRFX01TRywgMCwgMCwgMCwgMCwgMCk7CisJCQlsX3B0ci0+ZnNtX21zZ19jbnQrKzsKKwkJCWxpbmtfc2V0X3RpbWVyKGxfcHRyLCBjb250X2ludHYpOworCQkJYnJlYWs7CisJCWNhc2UgVElNRU9VVF9FVlQ6CisJCQlkYmdfbGluaygiVElNICIpOworCQkJaWYgKGxfcHRyLT5uZXh0X2luX25vICE9IGxfcHRyLT5jaGVja3BvaW50KSB7CisJCQkJZGJnX2xpbmsoIi0+IFdXIFxuIik7CisJCQkJbF9wdHItPnN0YXRlID0gV09SS0lOR19XT1JLSU5HOworCQkJCWxfcHRyLT5mc21fbXNnX2NudCA9IDA7CisJCQkJbF9wdHItPmNoZWNrcG9pbnQgPSBsX3B0ci0+bmV4dF9pbl9ubzsKKwkJCQlpZiAodGlwY19iY2xpbmtfYWNrc19taXNzaW5nKGxfcHRyLT5vd25lcikpIHsKKwkJCQkJdGlwY19saW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLCBTVEFURV9NU0csCisJCQkJCQkJCSAwLCAwLCAwLCAwLCAwKTsKKwkJCQkJbF9wdHItPmZzbV9tc2dfY250Kys7CisJCQkJfQorCQkJCWxpbmtfc2V0X3RpbWVyKGxfcHRyLCBjb250X2ludHYpOworCQkJfSBlbHNlIGlmIChsX3B0ci0+ZnNtX21zZ19jbnQgPCBsX3B0ci0+YWJvcnRfbGltaXQpIHsKKwkJCQlkYmdfbGluaygiUHJvYmluZyAldS8ldSx0aW1lciA9ICV1IG1zKVxuIiwKKwkJCQkJIGxfcHRyLT5mc21fbXNnX2NudCwgbF9wdHItPmFib3J0X2xpbWl0LAorCQkJCQkgY29udF9pbnR2IC8gNCk7CisJCQkJdGlwY19saW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLCBTVEFURV9NU0csIAorCQkJCQkJCSAxLCAwLCAwLCAwLCAwKTsKKwkJCQlsX3B0ci0+ZnNtX21zZ19jbnQrKzsKKwkJCQlsaW5rX3NldF90aW1lcihsX3B0ciwgY29udF9pbnR2IC8gNCk7CisJCQl9IGVsc2UgewkvKiBMaW5rIGhhcyBmYWlsZWQgKi8KKwkJCQlkYmdfbGluaygiLT4gUlUgKCV1IHByb2JlcyB1bmFuc3dlcmVkKVxuIiwKKwkJCQkJIGxfcHRyLT5mc21fbXNnX2NudCk7CisJCQkJdGlwY19saW5rX3Jlc2V0KGxfcHRyKTsKKwkJCQlsX3B0ci0+c3RhdGUgPSBSRVNFVF9VTktOT1dOOworCQkJCWxfcHRyLT5mc21fbXNnX2NudCA9IDA7CisJCQkJdGlwY19saW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLCBSRVNFVF9NU0csCisJCQkJCQkJIDAsIDAsIDAsIDAsIDApOworCQkJCWxfcHRyLT5mc21fbXNnX2NudCsrOworCQkJCWxpbmtfc2V0X3RpbWVyKGxfcHRyLCBjb250X2ludHYpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnIoIlVua25vd24gbGluayBldmVudCAldSBpbiBXVSBzdGF0ZVxuIiwgZXZlbnQpOworCQl9CisJCWJyZWFrOworCWNhc2UgUkVTRVRfVU5LTk9XTjoKKwkJZGJnX2xpbmsoIlJVLyIpOworCQlzd2l0Y2ggKGV2ZW50KSB7CisJCWNhc2UgVFJBRkZJQ19NU0dfRVZUOgorCQkJZGJnX2xpbmsoIlRSRi1cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgQUNUSVZBVEVfTVNHOgorCQkJb3RoZXIgPSBsX3B0ci0+b3duZXItPmFjdGl2ZV9saW5rc1swXTsKKwkJCWlmIChvdGhlciAmJiBsaW5rX3dvcmtpbmdfdW5rbm93bihvdGhlcikpIHsKKwkJCQlkYmdfbGluaygiQUNUXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRiZ19saW5rKCJBQ1QgLT4gV1dcbiIpOworCQkJbF9wdHItPnN0YXRlID0gV09SS0lOR19XT1JLSU5HOworCQkJbF9wdHItPmZzbV9tc2dfY250ID0gMDsKKwkJCWxpbmtfYWN0aXZhdGUobF9wdHIpOworCQkJdGlwY19saW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLCBTVEFURV9NU0csIDEsIDAsIDAsIDAsIDApOworCQkJbF9wdHItPmZzbV9tc2dfY250Kys7CisJCQlsaW5rX3NldF90aW1lcihsX3B0ciwgY29udF9pbnR2KTsKKwkJCWJyZWFrOworCQljYXNlIFJFU0VUX01TRzoKKwkJCWRiZ19saW5rKCJSRVMgXG4iKTsKKwkJCWRiZ19saW5rKCIgLT4gUlJcbiIpOworCQkJbF9wdHItPnN0YXRlID0gUkVTRVRfUkVTRVQ7CisJCQlsX3B0ci0+ZnNtX21zZ19jbnQgPSAwOworCQkJdGlwY19saW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLCBBQ1RJVkFURV9NU0csIDEsIDAsIDAsIDAsIDApOworCQkJbF9wdHItPmZzbV9tc2dfY250Kys7CisJCQlsaW5rX3NldF90aW1lcihsX3B0ciwgY29udF9pbnR2KTsKKwkJCWJyZWFrOworCQljYXNlIFNUQVJUSU5HX0VWVDoKKwkJCWRiZ19saW5rKCJTVEFSVC0iKTsKKwkJCWxfcHRyLT5zdGFydGVkID0gMTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIFRJTUVPVVRfRVZUOgorCQkJZGJnX2xpbmsoIlRJTSBcbiIpOworCQkJdGlwY19saW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLCBSRVNFVF9NU0csIDAsIDAsIDAsIDAsIDApOworCQkJbF9wdHItPmZzbV9tc2dfY250Kys7CisJCQlsaW5rX3NldF90aW1lcihsX3B0ciwgY29udF9pbnR2KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyKCJVbmtub3duIGxpbmsgZXZlbnQgJXUgaW4gUlUgc3RhdGVcbiIsIGV2ZW50KTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJFU0VUX1JFU0VUOgorCQlkYmdfbGluaygiUlIvICIpOworCQlzd2l0Y2ggKGV2ZW50KSB7CisJCWNhc2UgVFJBRkZJQ19NU0dfRVZUOgorCQkJZGJnX2xpbmsoIlRSRi0iKTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIEFDVElWQVRFX01TRzoKKwkJCW90aGVyID0gbF9wdHItPm93bmVyLT5hY3RpdmVfbGlua3NbMF07CisJCQlpZiAob3RoZXIgJiYgbGlua193b3JraW5nX3Vua25vd24ob3RoZXIpKSB7CisJCQkJZGJnX2xpbmsoIkFDVFxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkYmdfbGluaygiQUNUIC0+IFdXXG4iKTsKKwkJCWxfcHRyLT5zdGF0ZSA9IFdPUktJTkdfV09SS0lORzsKKwkJCWxfcHRyLT5mc21fbXNnX2NudCA9IDA7CisJCQlsaW5rX2FjdGl2YXRlKGxfcHRyKTsKKwkJCXRpcGNfbGlua19zZW5kX3Byb3RvX21zZyhsX3B0ciwgU1RBVEVfTVNHLCAxLCAwLCAwLCAwLCAwKTsKKwkJCWxfcHRyLT5mc21fbXNnX2NudCsrOworCQkJbGlua19zZXRfdGltZXIobF9wdHIsIGNvbnRfaW50dik7CisJCQlicmVhazsKKwkJY2FzZSBSRVNFVF9NU0c6CisJCQlkYmdfbGluaygiUkVTXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFRJTUVPVVRfRVZUOgorCQkJZGJnX2xpbmsoIlRJTVxuIik7CisJCQl0aXBjX2xpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIEFDVElWQVRFX01TRywgMCwgMCwgMCwgMCwgMCk7CisJCQlsX3B0ci0+ZnNtX21zZ19jbnQrKzsKKwkJCWxpbmtfc2V0X3RpbWVyKGxfcHRyLCBjb250X2ludHYpOworCQkJZGJnX2xpbmsoImZzbV9tc2dfY250ICV1XG4iLCBsX3B0ci0+ZnNtX21zZ19jbnQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnIoIlVua25vd24gbGluayBldmVudCAldSBpbiBSUiBzdGF0ZVxuIiwgZXZlbnQpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycigiVW5rbm93biBsaW5rIHN0YXRlICV1LyV1XG4iLCBsX3B0ci0+c3RhdGUsIGV2ZW50KTsKKwl9Cit9CisKKy8qCisgKiBsaW5rX2J1bmRsZV9idWYoKTogQXBwZW5kIGNvbnRlbnRzIG9mIGEgYnVmZmVyIHRvCisgKiB0aGUgdGFpbCBvZiBhbiBleGlzdGluZyBvbmUuIAorICovCisKK3N0YXRpYyBpbnQgbGlua19idW5kbGVfYnVmKHN0cnVjdCBsaW5rICpsX3B0ciwKKwkJCSAgIHN0cnVjdCBza19idWZmICpidW5kbGVyLCAKKwkJCSAgIHN0cnVjdCBza19idWZmICpidWYpCit7CisJc3RydWN0IHRpcGNfbXNnICpidW5kbGVyX21zZyA9IGJ1Zl9tc2coYnVuZGxlcik7CisJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGJ1Zik7CisJdTMyIHNpemUgPSBtc2dfc2l6ZShtc2cpOworCXUzMiB0b19wb3MgPSBhbGlnbihtc2dfc2l6ZShidW5kbGVyX21zZykpOworCXUzMiByZXN0ID0gbGlua19tYXhfcGt0KGxfcHRyKSAtIHRvX3BvczsKKworCWlmIChtc2dfdXNlcihidW5kbGVyX21zZykgIT0gTVNHX0JVTkRMRVIpCisJCXJldHVybiAwOworCWlmIChtc2dfdHlwZShidW5kbGVyX21zZykgIT0gT1BFTl9NU0cpCisJCXJldHVybiAwOworCWlmIChyZXN0IDwgYWxpZ24oc2l6ZSkpCisJCXJldHVybiAwOworCisJc2tiX3B1dChidW5kbGVyLCAodG9fcG9zIC0gbXNnX3NpemUoYnVuZGxlcl9tc2cpKSArIHNpemUpOworCW1lbWNweShidW5kbGVyLT5kYXRhICsgdG9fcG9zLCBidWYtPmRhdGEsIHNpemUpOworCW1zZ19zZXRfc2l6ZShidW5kbGVyX21zZywgdG9fcG9zICsgc2l6ZSk7CisJbXNnX3NldF9tc2djbnQoYnVuZGxlcl9tc2csIG1zZ19tc2djbnQoYnVuZGxlcl9tc2cpICsgMSk7CisJZGJnKCJQYWNrZWQgbXNnICMgJXUoJXUgb2N0ZXRzKSBpbnRvIHBvcyAldSBpbiBidWYoIyV1KVxuIiwKKwkgICAgbXNnX21zZ2NudChidW5kbGVyX21zZyksIHNpemUsIHRvX3BvcywgbXNnX3NlcW5vKGJ1bmRsZXJfbXNnKSk7CisJbXNnX2RiZyhtc2csICJQQUNLRDoiKTsKKwlidWZfZGlzY2FyZChidWYpOworCWxfcHRyLT5zdGF0cy5zZW50X2J1bmRsZWQrKzsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxpbmtfYWRkX3RvX291dHF1ZXVlKHN0cnVjdCBsaW5rICpsX3B0ciwgCisJCQkJCXN0cnVjdCBza19idWZmICpidWYsIAorCQkJCQlzdHJ1Y3QgdGlwY19tc2cgKm1zZykKK3sKKwl1MzIgYWNrID0gbW9kKGxfcHRyLT5uZXh0X2luX25vIC0gMSk7CisJdTMyIHNlcW5vID0gbW9kKGxfcHRyLT5uZXh0X291dF9ubysrKTsKKworCW1zZ19zZXRfd29yZChtc2csIDIsICgoYWNrIDw8IDE2KSB8IHNlcW5vKSk7CisJbXNnX3NldF9iY2FzdF9hY2sobXNnLCBsX3B0ci0+b3duZXItPmJjbGluay5sYXN0X2luKTsKKwlidWYtPm5leHQgPSBOVUxMOworCWlmIChsX3B0ci0+Zmlyc3Rfb3V0KSB7CisJCWxfcHRyLT5sYXN0X291dC0+bmV4dCA9IGJ1ZjsKKwkJbF9wdHItPmxhc3Rfb3V0ID0gYnVmOworCX0gZWxzZQorCQlsX3B0ci0+Zmlyc3Rfb3V0ID0gbF9wdHItPmxhc3Rfb3V0ID0gYnVmOworCWxfcHRyLT5vdXRfcXVldWVfc2l6ZSsrOworfQorCisvKiAKKyAqIHRpcGNfbGlua19zZW5kX2J1ZigpIGlzIHRoZSAnZnVsbCBwYXRoJyBmb3IgbWVzc2FnZXMsIGNhbGxlZCBmcm9tIAorICogaW5zaWRlIFRJUEMgd2hlbiB0aGUgJ2Zhc3QgcGF0aCcgaW4gdGlwY19zZW5kX2J1ZgorICogaGFzIGZhaWxlZCwgYW5kIGZyb20gbGlua19zZW5kKCkKKyAqLworCitpbnQgdGlwY19saW5rX3NlbmRfYnVmKHN0cnVjdCBsaW5rICpsX3B0ciwgc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwl1MzIgc2l6ZSA9IG1zZ19zaXplKG1zZyk7CisJdTMyIGRzeiA9IG1zZ19kYXRhX3N6KG1zZyk7CisJdTMyIHF1ZXVlX3NpemUgPSBsX3B0ci0+b3V0X3F1ZXVlX3NpemU7CisJdTMyIGltcCA9IG1zZ190b3RfaW1wb3J0YW5jZShtc2cpOworCXUzMiBxdWV1ZV9saW1pdCA9IGxfcHRyLT5xdWV1ZV9saW1pdFtpbXBdOworCXUzMiBtYXhfcGFja2V0ID0gbGlua19tYXhfcGt0KGxfcHRyKTsKKworCW1zZ19zZXRfcHJldm5vZGUobXNnLCB0aXBjX293bl9hZGRyKTsJLyogSWYgcm91dGVkIG1lc3NhZ2UgKi8KKworCS8qIE1hdGNoIG1zZyBpbXBvcnRhbmNlIGFnYWluc3QgcXVldWUgbGltaXRzOiAqLworCisJaWYgKHVubGlrZWx5KHF1ZXVlX3NpemUgPj0gcXVldWVfbGltaXQpKSB7CisJCWlmIChpbXAgPD0gVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFKSB7CisJCQlyZXR1cm4gbGlua19zY2hlZHVsZV9wb3J0KGxfcHRyLCBtc2dfb3JpZ3BvcnQobXNnKSwKKwkJCQkJCSAgc2l6ZSk7CisJCX0KKwkJbXNnX2RiZyhtc2csICJUSVBDOiBDb25nZXN0aW9uLCB0aHJvd2luZyBhd2F5XG4iKTsKKwkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJaWYgKGltcCA+IENPTk5fTUFOQUdFUikgeworCQkJd2FybigiUmVzZXR0aW5nIDwlcz4sIHNlbmQgcXVldWUgZnVsbCIsIGxfcHRyLT5uYW1lKTsKKwkJCXRpcGNfbGlua19yZXNldChsX3B0cik7CisJCX0KKwkJcmV0dXJuIGRzejsKKwl9CisKKwkvKiBGcmFnbWVudGF0aW9uIG5lZWRlZCA/ICovCisKKwlpZiAoc2l6ZSA+IG1heF9wYWNrZXQpCisJCXJldHVybiB0aXBjX2xpbmtfc2VuZF9sb25nX2J1ZihsX3B0ciwgYnVmKTsKKworCS8qIFBhY2tldCBjYW4gYmUgcXVldWVkIG9yIHNlbnQ6ICovCisKKwlpZiAocXVldWVfc2l6ZSA+IGxfcHRyLT5zdGF0cy5tYXhfcXVldWVfc3opCisJCWxfcHRyLT5zdGF0cy5tYXhfcXVldWVfc3ogPSBxdWV1ZV9zaXplOworCisJaWYgKGxpa2VseSghdGlwY19iZWFyZXJfY29uZ2VzdGVkKGxfcHRyLT5iX3B0ciwgbF9wdHIpICYmIAorCQkgICAhbGlua19jb25nZXN0ZWQobF9wdHIpKSkgeworCQlsaW5rX2FkZF90b19vdXRxdWV1ZShsX3B0ciwgYnVmLCBtc2cpOworCisJCWlmIChsaWtlbHkodGlwY19iZWFyZXJfc2VuZChsX3B0ci0+Yl9wdHIsIGJ1ZiwgJmxfcHRyLT5tZWRpYV9hZGRyKSkpIHsKKwkJCWxfcHRyLT51bmFja2VkX3dpbmRvdyA9IDA7CisJCX0gZWxzZSB7CisJCQl0aXBjX2JlYXJlcl9zY2hlZHVsZShsX3B0ci0+Yl9wdHIsIGxfcHRyKTsKKwkJCWxfcHRyLT5zdGF0cy5iZWFyZXJfY29uZ3MrKzsKKwkJCWxfcHRyLT5uZXh0X291dCA9IGJ1ZjsKKwkJfQorCQlyZXR1cm4gZHN6OworCX0KKwkvKiBDb25nZXN0aW9uOiBjYW4gbWVzc2FnZSBiZSBidW5kbGVkID86ICovCisKKwlpZiAoKG1zZ191c2VyKG1zZykgIT0gQ0hBTkdFT1ZFUl9QUk9UT0NPTCkgJiYKKwkgICAgKG1zZ191c2VyKG1zZykgIT0gTVNHX0ZSQUdNRU5URVIpKSB7CisKKwkJLyogVHJ5IGFkZGluZyBtZXNzYWdlIHRvIGFuIGV4aXN0aW5nIGJ1bmRsZSAqLworCisJCWlmIChsX3B0ci0+bmV4dF9vdXQgJiYgCisJCSAgICBsaW5rX2J1bmRsZV9idWYobF9wdHIsIGxfcHRyLT5sYXN0X291dCwgYnVmKSkgeworCQkJdGlwY19iZWFyZXJfcmVzb2x2ZV9jb25nZXN0aW9uKGxfcHRyLT5iX3B0ciwgbF9wdHIpOworCQkJcmV0dXJuIGRzejsKKwkJfQorCisJCS8qIFRyeSBjcmVhdGluZyBhIG5ldyBidW5kbGUgKi8KKworCQlpZiAoc2l6ZSA8PSBtYXhfcGFja2V0ICogMiAvIDMpIHsKKwkJCXN0cnVjdCBza19idWZmICpidW5kbGVyID0gYnVmX2FjcXVpcmUobWF4X3BhY2tldCk7CisJCQlzdHJ1Y3QgdGlwY19tc2cgYnVuZGxlcl9oZHI7CisKKwkJCWlmIChidW5kbGVyKSB7CisJCQkJbXNnX2luaXQoJmJ1bmRsZXJfaGRyLCBNU0dfQlVORExFUiwgT1BFTl9NU0csCisJCQkJCSBUSVBDX09LLCBJTlRfSF9TSVpFLCBsX3B0ci0+YWRkcik7CisJCQkJbWVtY3B5KGJ1bmRsZXItPmRhdGEsICh1bmNoYXIgKikmYnVuZGxlcl9oZHIsIAorCQkJCSAgICAgICBJTlRfSF9TSVpFKTsKKwkJCQlza2JfdHJpbShidW5kbGVyLCBJTlRfSF9TSVpFKTsKKwkJCQlsaW5rX2J1bmRsZV9idWYobF9wdHIsIGJ1bmRsZXIsIGJ1Zik7CisJCQkJYnVmID0gYnVuZGxlcjsKKwkJCQltc2cgPSBidWZfbXNnKGJ1Zik7CisJCQkJbF9wdHItPnN0YXRzLnNlbnRfYnVuZGxlcysrOworCQkJfQorCQl9CisJfQorCWlmICghbF9wdHItPm5leHRfb3V0KQorCQlsX3B0ci0+bmV4dF9vdXQgPSBidWY7CisJbGlua19hZGRfdG9fb3V0cXVldWUobF9wdHIsIGJ1ZiwgbXNnKTsKKwl0aXBjX2JlYXJlcl9yZXNvbHZlX2Nvbmdlc3Rpb24obF9wdHItPmJfcHRyLCBsX3B0cik7CisJcmV0dXJuIGRzejsKK30KKworLyogCisgKiB0aXBjX2xpbmtfc2VuZCgpOiBzYW1lIGFzIHRpcGNfbGlua19zZW5kX2J1ZigpLCBidXQgdGhlIGxpbmsgdG8gdXNlIGhhcyAKKyAqIG5vdCBiZWVuIHNlbGVjdGVkIHlldCwgYW5kIHRoZSB0aGUgb3duZXIgbm9kZSBpcyBub3QgbG9ja2VkCisgKiBDYWxsZWQgYnkgVElQQyBpbnRlcm5hbCB1c2VycywgZS5nLiB0aGUgbmFtZSBkaXN0cmlidXRvcgorICovCisKK2ludCB0aXBjX2xpbmtfc2VuZChzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCB1MzIgZGVzdCwgdTMyIHNlbGVjdG9yKQoreworCXN0cnVjdCBsaW5rICpsX3B0cjsKKwlzdHJ1Y3Qgbm9kZSAqbl9wdHI7CisJaW50IHJlcyA9IC1FTElOS0NPTkc7CisKKwlyZWFkX2xvY2tfYmgoJnRpcGNfbmV0X2xvY2spOworCW5fcHRyID0gdGlwY19ub2RlX3NlbGVjdChkZXN0LCBzZWxlY3Rvcik7CisJaWYgKG5fcHRyKSB7CisJCXRpcGNfbm9kZV9sb2NrKG5fcHRyKTsKKwkJbF9wdHIgPSBuX3B0ci0+YWN0aXZlX2xpbmtzW3NlbGVjdG9yICYgMV07CisJCWRiZygidGlwY19saW5rX3NlbmQ6IGZvdW5kIGxpbmsgJXggZm9yIGRlc3QgJXhcbiIsIGxfcHRyLCBkZXN0KTsKKwkJaWYgKGxfcHRyKSB7CisJCQlyZXMgPSB0aXBjX2xpbmtfc2VuZF9idWYobF9wdHIsIGJ1Zik7CisJCX0KKwkJdGlwY19ub2RlX3VubG9jayhuX3B0cik7CisJfSBlbHNlIHsKKwkJZGJnKCJBdHRlbXB0IHRvIHNlbmQgbXNnIHRvIHVua25vd24gbm9kZTpcbiIpOworCQltc2dfZGJnKGJ1Zl9tc2coYnVmKSwiPj4+Iik7CisJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJfQorCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCisvKiAKKyAqIGxpbmtfc2VuZF9idWZfZmFzdDogRW50cnkgZm9yIGRhdGEgbWVzc2FnZXMgd2hlcmUgdGhlIAorICogZGVzdGluYXRpb24gbGluayBpcyBrbm93biBhbmQgdGhlIGhlYWRlciBpcyBjb21wbGV0ZSwKKyAqIGluY2x1c2l2ZSB0b3RhbCBtZXNzYWdlIGxlbmd0aC4gVmVyeSB0aW1lIGNyaXRpY2FsLgorICogTGluayBpcyBsb2NrZWQuIFJldHVybnMgdXNlciBkYXRhIGxlbmd0aC4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBsaW5rX3NlbmRfYnVmX2Zhc3Qoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLAorCQkJCSAgICAgdTMyICp1c2VkX21heF9wa3QpCit7CisJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGJ1Zik7CisJaW50IHJlcyA9IG1zZ19kYXRhX3N6KG1zZyk7CisKKwlpZiAobGlrZWx5KCFsaW5rX2Nvbmdlc3RlZChsX3B0cikpKSB7CisJCWlmIChsaWtlbHkobXNnX3NpemUobXNnKSA8PSBsaW5rX21heF9wa3QobF9wdHIpKSkgeworCQkJaWYgKGxpa2VseShsaXN0X2VtcHR5KCZsX3B0ci0+Yl9wdHItPmNvbmdfbGlua3MpKSkgeworCQkJCWxpbmtfYWRkX3RvX291dHF1ZXVlKGxfcHRyLCBidWYsIG1zZyk7CisJCQkJaWYgKGxpa2VseSh0aXBjX2JlYXJlcl9zZW5kKGxfcHRyLT5iX3B0ciwgYnVmLAorCQkJCQkJCSAgICAmbF9wdHItPm1lZGlhX2FkZHIpKSkgeworCQkJCQlsX3B0ci0+dW5hY2tlZF93aW5kb3cgPSAwOworCQkJCQltc2dfZGJnKG1zZywiU0VOVF9GQVNUOiIpOworCQkJCQlyZXR1cm4gcmVzOworCQkJCX0KKwkJCQlkYmcoImZhaWxlZCBzZW50IGZhc3QuLi5cbiIpOworCQkJCXRpcGNfYmVhcmVyX3NjaGVkdWxlKGxfcHRyLT5iX3B0ciwgbF9wdHIpOworCQkJCWxfcHRyLT5zdGF0cy5iZWFyZXJfY29uZ3MrKzsKKwkJCQlsX3B0ci0+bmV4dF9vdXQgPSBidWY7CisJCQkJcmV0dXJuIHJlczsKKwkJCX0KKwkJfQorCQllbHNlCisJCQkqdXNlZF9tYXhfcGt0ID0gbGlua19tYXhfcGt0KGxfcHRyKTsKKwl9CisJcmV0dXJuIHRpcGNfbGlua19zZW5kX2J1ZihsX3B0ciwgYnVmKTsgIC8qIEFsbCBvdGhlciBjYXNlcyAqLworfQorCisvKiAKKyAqIHRpcGNfc2VuZF9idWZfZmFzdDogRW50cnkgZm9yIGRhdGEgbWVzc2FnZXMgd2hlcmUgdGhlIAorICogZGVzdGluYXRpb24gbm9kZSBpcyBrbm93biBhbmQgdGhlIGhlYWRlciBpcyBjb21wbGV0ZSwKKyAqIGluY2x1c2l2ZSB0b3RhbCBtZXNzYWdlIGxlbmd0aC4KKyAqIFJldHVybnMgdXNlciBkYXRhIGxlbmd0aC4KKyAqLworaW50IHRpcGNfc2VuZF9idWZfZmFzdChzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCB1MzIgZGVzdG5vZGUpCit7CisJc3RydWN0IGxpbmsgKmxfcHRyOworCXN0cnVjdCBub2RlICpuX3B0cjsKKwlpbnQgcmVzOworCXUzMiBzZWxlY3RvciA9IG1zZ19vcmlncG9ydChidWZfbXNnKGJ1ZikpICYgMTsKKwl1MzIgZHVtbXk7CisKKwlpZiAoZGVzdG5vZGUgPT0gdGlwY19vd25fYWRkcikKKwkJcmV0dXJuIHRpcGNfcG9ydF9yZWN2X21zZyhidWYpOworCisJcmVhZF9sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKKwluX3B0ciA9IHRpcGNfbm9kZV9zZWxlY3QoZGVzdG5vZGUsIHNlbGVjdG9yKTsKKwlpZiAobGlrZWx5KG5fcHRyKSkgeworCQl0aXBjX25vZGVfbG9jayhuX3B0cik7CisJCWxfcHRyID0gbl9wdHItPmFjdGl2ZV9saW5rc1tzZWxlY3Rvcl07CisJCWRiZygic2VuZF9mYXN0OiBidWYgJXggc2VsZWN0ZWQgJXgsIGRlc3Rub2RlID0gJXhcbiIsCisJCSAgICBidWYsIGxfcHRyLCBkZXN0bm9kZSk7CisJCWlmIChsaWtlbHkobF9wdHIpKSB7CisJCQlyZXMgPSBsaW5rX3NlbmRfYnVmX2Zhc3QobF9wdHIsIGJ1ZiwgJmR1bW15KTsKKwkJCXRpcGNfbm9kZV91bmxvY2sobl9wdHIpOworCQkJcmVhZF91bmxvY2tfYmgoJnRpcGNfbmV0X2xvY2spOworCQkJcmV0dXJuIHJlczsKKwkJfQorCQl0aXBjX25vZGVfdW5sb2NrKG5fcHRyKTsKKwl9CisJcmVhZF91bmxvY2tfYmgoJnRpcGNfbmV0X2xvY2spOworCXJlcyA9IG1zZ19kYXRhX3N6KGJ1Zl9tc2coYnVmKSk7CisJdGlwY19yZWplY3RfbXNnKGJ1ZiwgVElQQ19FUlJfTk9fTk9ERSk7CisJcmV0dXJuIHJlczsKK30KKworCisvKiAKKyAqIHRpcGNfbGlua19zZW5kX3NlY3Rpb25zX2Zhc3Q6IEVudHJ5IGZvciBtZXNzYWdlcyB3aGVyZSB0aGUgCisgKiBkZXN0aW5hdGlvbiBwcm9jZXNzb3IgaXMga25vd24gYW5kIHRoZSBoZWFkZXIgaXMgY29tcGxldGUsCisgKiBleGNlcHQgZm9yIHRvdGFsIG1lc3NhZ2UgbGVuZ3RoLiAKKyAqIFJldHVybnMgdXNlciBkYXRhIGxlbmd0aCBvciBlcnJuby4KKyAqLworaW50IHRpcGNfbGlua19zZW5kX3NlY3Rpb25zX2Zhc3Qoc3RydWN0IHBvcnQgKnNlbmRlciwgCisJCQkJIHN0cnVjdCBpb3ZlYyBjb25zdCAqbXNnX3NlY3QsCisJCQkJIGNvbnN0IHUzMiBudW1fc2VjdCwgCisJCQkJIHUzMiBkZXN0YWRkcikKK3sKKwlzdHJ1Y3QgdGlwY19tc2cgKmhkciA9ICZzZW5kZXItPnB1YmwucGhkcjsKKwlzdHJ1Y3QgbGluayAqbF9wdHI7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3Qgbm9kZSAqbm9kZTsKKwlpbnQgcmVzOworCXUzMiBzZWxlY3RvciA9IG1zZ19vcmlncG9ydChoZHIpICYgMTsKKworCWFzc2VydChkZXN0YWRkciAhPSB0aXBjX293bl9hZGRyKTsKKworYWdhaW46CisJLyoKKwkgKiBUcnkgYnVpbGRpbmcgbWVzc2FnZSB1c2luZyBwb3J0J3MgbWF4X3BrdCBoaW50LgorCSAqIChNdXN0IG5vdCBob2xkIGFueSBsb2NrcyB3aGlsZSBidWlsZGluZyBtZXNzYWdlLikKKwkgKi8KKworCXJlcyA9IG1zZ19idWlsZChoZHIsIG1zZ19zZWN0LCBudW1fc2VjdCwgc2VuZGVyLT5tYXhfcGt0LAorCQkJIXNlbmRlci0+dXNlcl9wb3J0LCAmYnVmKTsKKworCXJlYWRfbG9ja19iaCgmdGlwY19uZXRfbG9jayk7CisJbm9kZSA9IHRpcGNfbm9kZV9zZWxlY3QoZGVzdGFkZHIsIHNlbGVjdG9yKTsKKwlpZiAobGlrZWx5KG5vZGUpKSB7CisJCXRpcGNfbm9kZV9sb2NrKG5vZGUpOworCQlsX3B0ciA9IG5vZGUtPmFjdGl2ZV9saW5rc1tzZWxlY3Rvcl07CisJCWlmIChsaWtlbHkobF9wdHIpKSB7CisJCQlpZiAobGlrZWx5KGJ1ZikpIHsKKwkJCQlyZXMgPSBsaW5rX3NlbmRfYnVmX2Zhc3QobF9wdHIsIGJ1ZiwKKwkJCQkJCQkgJnNlbmRlci0+bWF4X3BrdCk7CisJCQkJaWYgKHVubGlrZWx5KHJlcyA8IDApKQorCQkJCQlidWZfZGlzY2FyZChidWYpOworZXhpdDoKKwkJCQl0aXBjX25vZGVfdW5sb2NrKG5vZGUpOworCQkJCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKKwkJCQlyZXR1cm4gcmVzOworCQkJfQorCisJCQkvKiBFeGl0IGlmIGJ1aWxkIHJlcXVlc3Qgd2FzIGludmFsaWQgKi8KKworCQkJaWYgKHVubGlrZWx5KHJlcyA8IDApKQorCQkJCWdvdG8gZXhpdDsKKworCQkJLyogRXhpdCBpZiBsaW5rIChvciBiZWFyZXIpIGlzIGNvbmdlc3RlZCAqLworCisJCQlpZiAobGlua19jb25nZXN0ZWQobF9wdHIpIHx8IAorCQkJICAgICFsaXN0X2VtcHR5KCZsX3B0ci0+Yl9wdHItPmNvbmdfbGlua3MpKSB7CisJCQkJcmVzID0gbGlua19zY2hlZHVsZV9wb3J0KGxfcHRyLAorCQkJCQkJCSBzZW5kZXItPnB1YmwucmVmLCByZXMpOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKworCQkJLyogCisJCQkgKiBNZXNzYWdlIHNpemUgZXhjZWVkcyBtYXhfcGt0IGhpbnQ7IHVwZGF0ZSBoaW50LAorCQkJICogdGhlbiByZS10cnkgZmFzdCBwYXRoIG9yIGZyYWdtZW50IHRoZSBtZXNzYWdlCisJCQkgKi8KKworCQkJc2VuZGVyLT5tYXhfcGt0ID0gbGlua19tYXhfcGt0KGxfcHRyKTsKKwkJCXRpcGNfbm9kZV91bmxvY2sobm9kZSk7CisJCQlyZWFkX3VubG9ja19iaCgmdGlwY19uZXRfbG9jayk7CisKKworCQkJaWYgKChtc2dfaGRyX3N6KGhkcikgKyByZXMpIDw9IHNlbmRlci0+bWF4X3BrdCkKKwkJCQlnb3RvIGFnYWluOworCisJCQlyZXR1cm4gbGlua19zZW5kX3NlY3Rpb25zX2xvbmcoc2VuZGVyLCBtc2dfc2VjdCwKKwkJCQkJCSAgICAgICBudW1fc2VjdCwgZGVzdGFkZHIpOworCQl9CisJCXRpcGNfbm9kZV91bmxvY2sobm9kZSk7CisJfQorCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKKworCS8qIENvdWxkbid0IGZpbmQgYSBsaW5rIHRvIHRoZSBkZXN0aW5hdGlvbiBub2RlICovCisKKwlpZiAoYnVmKQorCQlyZXR1cm4gdGlwY19yZWplY3RfbXNnKGJ1ZiwgVElQQ19FUlJfTk9fTk9ERSk7CisJaWYgKHJlcyA+PSAwKQorCQlyZXR1cm4gdGlwY19wb3J0X3JlamVjdF9zZWN0aW9ucyhzZW5kZXIsIGhkciwgbXNnX3NlY3QsIG51bV9zZWN0LAorCQkJCQkJIFRJUENfRVJSX05PX05PREUpOworCXJldHVybiByZXM7Cit9CisKKy8qIAorICogbGlua19zZW5kX3NlY3Rpb25zX2xvbmcoKTogRW50cnkgZm9yIGxvbmcgbWVzc2FnZXMgd2hlcmUgdGhlIAorICogZGVzdGluYXRpb24gbm9kZSBpcyBrbm93biBhbmQgdGhlIGhlYWRlciBpcyBjb21wbGV0ZSwKKyAqIGluY2x1c2l2ZSB0b3RhbCBtZXNzYWdlIGxlbmd0aC4gCisgKiBMaW5rIGFuZCBiZWFyZXIgY29uZ2VzdGlvbiBzdGF0dXMgaGF2ZSBiZWVuIGNoZWNrZWQgdG8gYmUgb2ssCisgKiBhbmQgYXJlIGlnbm9yZWQgaWYgdGhleSBjaGFuZ2UuCisgKgorICogTm90ZSB0aGF0IGZyYWdtZW50cyBkbyBub3QgdXNlIHRoZSBmdWxsIGxpbmsgTVRVIHNvIHRoYXQgdGhleSB3b24ndCBoYXZlCisgKiB0byB1bmRlcmdvIHJlZnJhZ21lbnRhdGlvbiBpZiBsaW5rIGNoYW5nZW92ZXIgY2F1c2VzIHRoZW0gdG8gYmUgc2VudAorICogb3ZlciBhbm90aGVyIGxpbmsgd2l0aCBhbiBhZGRpdGlvbmFsIHR1bm5lbCBoZWFkZXIgYWRkZWQgYXMgcHJlZml4LgorICogKFJlZnJhZ21lbnRhdGlvbiB3aWxsIHN0aWxsIG9jY3VyIGlmIHRoZSBvdGhlciBsaW5rIGhhcyBhIHNtYWxsZXIgTVRVLikKKyAqCisgKiBSZXR1cm5zIHVzZXIgZGF0YSBsZW5ndGggb3IgZXJybm8uCisgKi8KK3N0YXRpYyBpbnQgbGlua19zZW5kX3NlY3Rpb25zX2xvbmcoc3RydWN0IHBvcnQgKnNlbmRlciwKKwkJCQkgICBzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZ19zZWN0LAorCQkJCSAgIHUzMiBudW1fc2VjdCwKKwkJCQkgICB1MzIgZGVzdGFkZHIpCit7CisJc3RydWN0IGxpbmsgKmxfcHRyOworCXN0cnVjdCBub2RlICpub2RlOworCXN0cnVjdCB0aXBjX21zZyAqaGRyID0gJnNlbmRlci0+cHVibC5waGRyOworCXUzMiBkc3ogPSBtc2dfZGF0YV9zeihoZHIpOworCXUzMiBtYXhfcGt0LGZyYWdtX3N6LHJlc3Q7CisJc3RydWN0IHRpcGNfbXNnIGZyYWdtX2hkcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCpidWZfY2hhaW4sKnByZXY7CisJdTMyIGZyYWdtX2NycyxmcmFnbV9yZXN0LGhzeixzZWN0X3Jlc3Q7CisJY29uc3QgdW5jaGFyICpzZWN0X2NyczsKKwlpbnQgY3Vycl9zZWN0OworCXUzMiBmcmFnbV9ubzsKKworYWdhaW46CisJZnJhZ21fbm8gPSAxOworCW1heF9wa3QgPSBzZW5kZXItPm1heF9wa3QgLSBJTlRfSF9TSVpFOyAgCisJCS8qIGxlYXZlIHJvb20gZm9yIHR1bm5lbCBoZWFkZXIgaW4gY2FzZSBvZiBsaW5rIGNoYW5nZW92ZXIgKi8KKwlmcmFnbV9zeiA9IG1heF9wa3QgLSBJTlRfSF9TSVpFOyAKKwkJLyogbGVhdmUgcm9vbSBmb3IgZnJhZ21lbnRhdGlvbiBoZWFkZXIgaW4gZWFjaCBmcmFnbWVudCAqLworCXJlc3QgPSBkc3o7CisJZnJhZ21fY3JzID0gMDsKKwlmcmFnbV9yZXN0ID0gMDsKKwlzZWN0X3Jlc3QgPSAwOworCXNlY3RfY3JzID0gMDsKKwljdXJyX3NlY3QgPSAtMTsKKworCS8qIFByZXBhcmUgcmV1c2FibGUgZnJhZ21lbnQgaGVhZGVyOiAqLworCisJbXNnX2RiZyhoZHIsICI+RlJBR01FTlRJTkc+Iik7CisJbXNnX2luaXQoJmZyYWdtX2hkciwgTVNHX0ZSQUdNRU5URVIsIEZJUlNUX0ZSQUdNRU5ULAorCQkgVElQQ19PSywgSU5UX0hfU0laRSwgbXNnX2Rlc3Rub2RlKGhkcikpOworCW1zZ19zZXRfbGlua19zZWxlY3RvcigmZnJhZ21faGRyLCBzZW5kZXItPnB1YmwucmVmKTsKKwltc2dfc2V0X3NpemUoJmZyYWdtX2hkciwgbWF4X3BrdCk7CisJbXNnX3NldF9mcmFnbV9ubygmZnJhZ21faGRyLCAxKTsKKworCS8qIFByZXBhcmUgaGVhZGVyIG9mIGZpcnN0IGZyYWdtZW50OiAqLworCisJYnVmX2NoYWluID0gYnVmID0gYnVmX2FjcXVpcmUobWF4X3BrdCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCWJ1Zi0+bmV4dCA9IE5VTEw7CisJbWVtY3B5KGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKSZmcmFnbV9oZHIsIElOVF9IX1NJWkUpOworCWhzeiA9IG1zZ19oZHJfc3ooaGRyKTsKKwltZW1jcHkoYnVmLT5kYXRhICsgSU5UX0hfU0laRSwgKHVuY2hhciAqKWhkciwgaHN6KTsKKwltc2dfZGJnKGJ1Zl9tc2coYnVmKSwgIj5CVUlMRD4iKTsKKworCS8qIENob3AgdXAgbWVzc2FnZTogKi8KKworCWZyYWdtX2NycyA9IElOVF9IX1NJWkUgKyBoc3o7CisJZnJhZ21fcmVzdCA9IGZyYWdtX3N6IC0gaHN6OworCisJZG8gewkJLyogRm9yIGFsbCBzZWN0aW9ucyAqLworCQl1MzIgc3o7CisKKwkJaWYgKCFzZWN0X3Jlc3QpIHsKKwkJCXNlY3RfcmVzdCA9IG1zZ19zZWN0WysrY3Vycl9zZWN0XS5pb3ZfbGVuOworCQkJc2VjdF9jcnMgPSAoY29uc3QgdW5jaGFyICopbXNnX3NlY3RbY3Vycl9zZWN0XS5pb3ZfYmFzZTsKKwkJfQorCisJCWlmIChzZWN0X3Jlc3QgPCBmcmFnbV9yZXN0KQorCQkJc3ogPSBzZWN0X3Jlc3Q7CisJCWVsc2UKKwkJCXN6ID0gZnJhZ21fcmVzdDsKKworCQlpZiAobGlrZWx5KCFzZW5kZXItPnVzZXJfcG9ydCkpIHsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihidWYtPmRhdGEgKyBmcmFnbV9jcnMsIHNlY3RfY3JzLCBzeikpIHsKK2Vycm9yOgorCQkJCWZvciAoOyBidWZfY2hhaW47IGJ1Zl9jaGFpbiA9IGJ1ZikgeworCQkJCQlidWYgPSBidWZfY2hhaW4tPm5leHQ7CisJCQkJCWJ1Zl9kaXNjYXJkKGJ1Zl9jaGFpbik7CisJCQkJfQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQl9IGVsc2UKKwkJCW1lbWNweShidWYtPmRhdGEgKyBmcmFnbV9jcnMsIHNlY3RfY3JzLCBzeik7CisKKwkJc2VjdF9jcnMgKz0gc3o7CisJCXNlY3RfcmVzdCAtPSBzejsKKwkJZnJhZ21fY3JzICs9IHN6OworCQlmcmFnbV9yZXN0IC09IHN6OworCQlyZXN0IC09IHN6OworCisJCWlmICghZnJhZ21fcmVzdCAmJiByZXN0KSB7CisKKwkJCS8qIEluaXRpYXRlIG5ldyBmcmFnbWVudDogKi8KKwkJCWlmIChyZXN0IDw9IGZyYWdtX3N6KSB7CisJCQkJZnJhZ21fc3ogPSByZXN0OworCQkJCW1zZ19zZXRfdHlwZSgmZnJhZ21faGRyLExBU1RfRlJBR01FTlQpOworCQkJfSBlbHNlIHsKKwkJCQltc2dfc2V0X3R5cGUoJmZyYWdtX2hkciwgRlJBR01FTlQpOworCQkJfQorCQkJbXNnX3NldF9zaXplKCZmcmFnbV9oZHIsIGZyYWdtX3N6ICsgSU5UX0hfU0laRSk7CisJCQltc2dfc2V0X2ZyYWdtX25vKCZmcmFnbV9oZHIsICsrZnJhZ21fbm8pOworCQkJcHJldiA9IGJ1ZjsKKwkJCWJ1ZiA9IGJ1Zl9hY3F1aXJlKGZyYWdtX3N6ICsgSU5UX0hfU0laRSk7CisJCQlpZiAoIWJ1ZikKKwkJCQlnb3RvIGVycm9yOworCisJCQlidWYtPm5leHQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlwcmV2LT5uZXh0ID0gYnVmOworCQkJbWVtY3B5KGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKSZmcmFnbV9oZHIsIElOVF9IX1NJWkUpOworCQkJZnJhZ21fY3JzID0gSU5UX0hfU0laRTsKKwkJCWZyYWdtX3Jlc3QgPSBmcmFnbV9zejsKKwkJCW1zZ19kYmcoYnVmX21zZyhidWYpLCIgID5CVUlMRD4iKTsKKwkJfQorCX0KKwl3aGlsZSAocmVzdCA+IDApOworCisJLyogCisJICogTm93IHdlIGhhdmUgYSBidWZmZXIgY2hhaW4uIFNlbGVjdCBhIGxpbmsgYW5kIGNoZWNrCisJICogdGhhdCBwYWNrZXQgc2l6ZSBpcyBzdGlsbCBPSworCSAqLworCW5vZGUgPSB0aXBjX25vZGVfc2VsZWN0KGRlc3RhZGRyLCBzZW5kZXItPnB1YmwucmVmICYgMSk7CisJaWYgKGxpa2VseShub2RlKSkgeworCQl0aXBjX25vZGVfbG9jayhub2RlKTsKKwkJbF9wdHIgPSBub2RlLT5hY3RpdmVfbGlua3Nbc2VuZGVyLT5wdWJsLnJlZiAmIDFdOworCQlpZiAoIWxfcHRyKSB7CisJCQl0aXBjX25vZGVfdW5sb2NrKG5vZGUpOworCQkJZ290byByZWplY3Q7CisJCX0KKwkJaWYgKGxpbmtfbWF4X3BrdChsX3B0cikgPCBtYXhfcGt0KSB7CisJCQlzZW5kZXItPm1heF9wa3QgPSBsaW5rX21heF9wa3QobF9wdHIpOworCQkJdGlwY19ub2RlX3VubG9jayhub2RlKTsKKwkJCWZvciAoOyBidWZfY2hhaW47IGJ1Zl9jaGFpbiA9IGJ1ZikgeworCQkJCWJ1ZiA9IGJ1Zl9jaGFpbi0+bmV4dDsKKwkJCQlidWZfZGlzY2FyZChidWZfY2hhaW4pOworCQkJfQorCQkJZ290byBhZ2FpbjsKKwkJfQorCX0gZWxzZSB7CityZWplY3Q6CisJCWZvciAoOyBidWZfY2hhaW47IGJ1Zl9jaGFpbiA9IGJ1ZikgeworCQkJYnVmID0gYnVmX2NoYWluLT5uZXh0OworCQkJYnVmX2Rpc2NhcmQoYnVmX2NoYWluKTsKKwkJfQorCQlyZXR1cm4gdGlwY19wb3J0X3JlamVjdF9zZWN0aW9ucyhzZW5kZXIsIGhkciwgbXNnX3NlY3QsIG51bV9zZWN0LAorCQkJCQkJIFRJUENfRVJSX05PX05PREUpOworCX0KKworCS8qIEFwcGVuZCB3aG9sZSBjaGFpbiB0byBzZW5kIHF1ZXVlOiAqLworCisJYnVmID0gYnVmX2NoYWluOworCWxfcHRyLT5sb25nX21zZ19zZXFfbm8gPSBtb2QobF9wdHItPmxvbmdfbXNnX3NlcV9ubyArIDEpOworCWlmICghbF9wdHItPm5leHRfb3V0KQorCQlsX3B0ci0+bmV4dF9vdXQgPSBidWZfY2hhaW47CisJbF9wdHItPnN0YXRzLnNlbnRfZnJhZ21lbnRlZCsrOworCXdoaWxlIChidWYpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm5leHQgPSBidWYtPm5leHQ7CisJCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOworCisJCWxfcHRyLT5zdGF0cy5zZW50X2ZyYWdtZW50cysrOworCQltc2dfc2V0X2xvbmdfbXNnbm8obXNnLCBsX3B0ci0+bG9uZ19tc2dfc2VxX25vKTsKKwkJbGlua19hZGRfdG9fb3V0cXVldWUobF9wdHIsIGJ1ZiwgbXNnKTsKKwkJbXNnX2RiZyhtc2csICI+QUREPiIpOworCQlidWYgPSBuZXh0OworCX0KKworCS8qIFNlbmQgaXQsIGlmIHBvc3NpYmxlOiAqLworCisJdGlwY19saW5rX3B1c2hfcXVldWUobF9wdHIpOworCXRpcGNfbm9kZV91bmxvY2sobm9kZSk7CisJcmV0dXJuIGRzejsKK30KKworLyogCisgKiB0aXBjX2xpbmtfcHVzaF9wYWNrZXQ6IFB1c2ggb25lIHVuc2VudCBwYWNrZXQgdG8gdGhlIG1lZGlhCisgKi8KK3UzMiB0aXBjX2xpbmtfcHVzaF9wYWNrZXQoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXN0cnVjdCBza19idWZmICpidWYgPSBsX3B0ci0+Zmlyc3Rfb3V0OworCXUzMiByX3Ffc2l6ZSA9IGxfcHRyLT5yZXRyYW5zbV9xdWV1ZV9zaXplOworCXUzMiByX3FfaGVhZCA9IGxfcHRyLT5yZXRyYW5zbV9xdWV1ZV9oZWFkOworCisJLyogU3RlcCB0byBwb3NpdGlvbiB3aGVyZSByZXRyYW5zbWlzc2lvbiBmYWlsZWQsIGlmIGFueSwgICAgKi8KKwkvKiBjb25zaWRlciB0aGF0IGJ1ZmZlcnMgbWF5IGhhdmUgYmVlbiByZWxlYXNlZCBpbiBtZWFudGltZSAqLworCisJaWYgKHJfcV9zaXplICYmIGJ1ZikgeworCQl1MzIgbGFzdCA9IGxlc3Nlcihtb2Qocl9xX2hlYWQgKyByX3Ffc2l6ZSksIAorCQkJCSAgbGlua19sYXN0X3NlbnQobF9wdHIpKTsKKwkJdTMyIGZpcnN0ID0gbXNnX3NlcW5vKGJ1Zl9tc2coYnVmKSk7CisKKwkJd2hpbGUgKGJ1ZiAmJiBsZXNzKGZpcnN0LCByX3FfaGVhZCkpIHsKKwkJCWZpcnN0ID0gbW9kKGZpcnN0ICsgMSk7CisJCQlidWYgPSBidWYtPm5leHQ7CisJCX0KKwkJbF9wdHItPnJldHJhbnNtX3F1ZXVlX2hlYWQgPSByX3FfaGVhZCA9IGZpcnN0OworCQlsX3B0ci0+cmV0cmFuc21fcXVldWVfc2l6ZSA9IHJfcV9zaXplID0gbW9kKGxhc3QgLSBmaXJzdCk7CisJfQorCisJLyogQ29udGludWUgcmV0cmFuc21pc3Npb24gbm93LCBpZiB0aGVyZSBpcyBhbnl0aGluZzogKi8KKworCWlmIChyX3Ffc2l6ZSAmJiBidWYgJiYgIXNrYl9jbG9uZWQoYnVmKSkgeworCQltc2dfc2V0X2FjayhidWZfbXNnKGJ1ZiksIG1vZChsX3B0ci0+bmV4dF9pbl9ubyAtIDEpKTsKKwkJbXNnX3NldF9iY2FzdF9hY2soYnVmX21zZyhidWYpLCBsX3B0ci0+b3duZXItPmJjbGluay5sYXN0X2luKTsgCisJCWlmICh0aXBjX2JlYXJlcl9zZW5kKGxfcHRyLT5iX3B0ciwgYnVmLCAmbF9wdHItPm1lZGlhX2FkZHIpKSB7CisJCQltc2dfZGJnKGJ1Zl9tc2coYnVmKSwgIj5ERUYtUkVUUj4iKTsKKwkJCWxfcHRyLT5yZXRyYW5zbV9xdWV1ZV9oZWFkID0gbW9kKCsrcl9xX2hlYWQpOworCQkJbF9wdHItPnJldHJhbnNtX3F1ZXVlX3NpemUgPSAtLXJfcV9zaXplOworCQkJbF9wdHItPnN0YXRzLnJldHJhbnNtaXR0ZWQrKzsKKwkJCXJldHVybiBUSVBDX09LOworCQl9IGVsc2UgeworCQkJbF9wdHItPnN0YXRzLmJlYXJlcl9jb25ncysrOworCQkJbXNnX2RiZyhidWZfbXNnKGJ1ZiksICJ8PkRFRi1SRVRSPiIpOworCQkJcmV0dXJuIFBVU0hfRkFJTEVEOworCQl9CisJfQorCisJLyogU2VuZCBkZWZlcnJlZCBwcm90b2NvbCBtZXNzYWdlLCBpZiBhbnk6ICovCisKKwlidWYgPSBsX3B0ci0+cHJvdG9fbXNnX3F1ZXVlOworCWlmIChidWYpIHsKKwkJbXNnX3NldF9hY2soYnVmX21zZyhidWYpLCBtb2QobF9wdHItPm5leHRfaW5fbm8gLSAxKSk7CisJCW1zZ19zZXRfYmNhc3RfYWNrKGJ1Zl9tc2coYnVmKSxsX3B0ci0+b3duZXItPmJjbGluay5sYXN0X2luKTsgCisJCWlmICh0aXBjX2JlYXJlcl9zZW5kKGxfcHRyLT5iX3B0ciwgYnVmLCAmbF9wdHItPm1lZGlhX2FkZHIpKSB7CisJCQltc2dfZGJnKGJ1Zl9tc2coYnVmKSwgIj5ERUYtUFJPVD4iKTsKKwkJCWxfcHRyLT51bmFja2VkX3dpbmRvdyA9IDA7CisJCQlidWZfZGlzY2FyZChidWYpOworCQkJbF9wdHItPnByb3RvX21zZ19xdWV1ZSA9IDA7CisJCQlyZXR1cm4gVElQQ19PSzsKKwkJfSBlbHNlIHsKKwkJCW1zZ19kYmcoYnVmX21zZyhidWYpLCAifD5ERUYtUFJPVD4iKTsKKwkJCWxfcHRyLT5zdGF0cy5iZWFyZXJfY29uZ3MrKzsKKwkJCXJldHVybiBQVVNIX0ZBSUxFRDsKKwkJfQorCX0KKworCS8qIFNlbmQgb25lIGRlZmVycmVkIGRhdGEgbWVzc2FnZSwgaWYgc2VuZCB3aW5kb3cgbm90IGZ1bGw6ICovCisKKwlidWYgPSBsX3B0ci0+bmV4dF9vdXQ7CisJaWYgKGJ1ZikgeworCQlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJdTMyIG5leHQgPSBtc2dfc2Vxbm8obXNnKTsKKwkJdTMyIGZpcnN0ID0gbXNnX3NlcW5vKGJ1Zl9tc2cobF9wdHItPmZpcnN0X291dCkpOworCisJCWlmIChtb2QobmV4dCAtIGZpcnN0KSA8IGxfcHRyLT5xdWV1ZV9saW1pdFswXSkgeworCQkJbXNnX3NldF9hY2sobXNnLCBtb2QobF9wdHItPm5leHRfaW5fbm8gLSAxKSk7CisJCQltc2dfc2V0X2JjYXN0X2Fjayhtc2csIGxfcHRyLT5vd25lci0+YmNsaW5rLmxhc3RfaW4pOyAKKwkJCWlmICh0aXBjX2JlYXJlcl9zZW5kKGxfcHRyLT5iX3B0ciwgYnVmLCAmbF9wdHItPm1lZGlhX2FkZHIpKSB7CisJCQkJaWYgKG1zZ191c2VyKG1zZykgPT0gTVNHX0JVTkRMRVIpCisJCQkJCW1zZ19zZXRfdHlwZShtc2csIENMT1NFRF9NU0cpOworCQkJCW1zZ19kYmcobXNnLCAiPlBVU0gtREFUQT4iKTsKKwkJCQlsX3B0ci0+bmV4dF9vdXQgPSBidWYtPm5leHQ7CisJCQkJcmV0dXJuIFRJUENfT0s7CisJCQl9IGVsc2UgeworCQkJCW1zZ19kYmcobXNnLCAifFBVU0gtREFUQXwiKTsKKwkJCQlsX3B0ci0+c3RhdHMuYmVhcmVyX2NvbmdzKys7CisJCQkJcmV0dXJuIFBVU0hfRkFJTEVEOworCQkJfQorCQl9CisJfQorCXJldHVybiBQVVNIX0ZJTklTSEVEOworfQorCisvKgorICogcHVzaF9xdWV1ZSgpOiBwdXNoIG91dCB0aGUgdW5zZW50IG1lc3NhZ2VzIG9mIGEgbGluayB3aGVyZQorICogICAgICAgICAgICAgICBjb25nZXN0aW9uIGhhcyBhYmF0ZWQuIE5vZGUgaXMgbG9ja2VkCisgKi8KK3ZvaWQgdGlwY19saW5rX3B1c2hfcXVldWUoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXUzMiByZXM7CisKKwlpZiAodGlwY19iZWFyZXJfY29uZ2VzdGVkKGxfcHRyLT5iX3B0ciwgbF9wdHIpKQorCQlyZXR1cm47CisKKwlkbyB7CisJCXJlcyA9IHRpcGNfbGlua19wdXNoX3BhY2tldChsX3B0cik7CisJfQorCXdoaWxlIChyZXMgPT0gVElQQ19PSyk7CisJaWYgKHJlcyA9PSBQVVNIX0ZBSUxFRCkKKwkJdGlwY19iZWFyZXJfc2NoZWR1bGUobF9wdHItPmJfcHRyLCBsX3B0cik7Cit9CisKK3ZvaWQgdGlwY19saW5rX3JldHJhbnNtaXQoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCAKKwkJCSAgdTMyIHJldHJhbnNtaXRzKQoreworCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCisJZGJnKCJSZXRyYW5zbWl0dGluZyAldSBpbiBsaW5rICV4XG4iLCByZXRyYW5zbWl0cywgbF9wdHIpOworCisJaWYgKHRpcGNfYmVhcmVyX2Nvbmdlc3RlZChsX3B0ci0+Yl9wdHIsIGxfcHRyKSAmJiBidWYgJiYgIXNrYl9jbG9uZWQoYnVmKSkgeworCQltc2dfZGJnKGJ1Zl9tc2coYnVmKSwgIj5OT19SRVRSLT5CQ09ORz4iKTsKKwkJZGJnX3ByaW50X2xpbmsobF9wdHIsICIgICAiKTsKKwkJbF9wdHItPnJldHJhbnNtX3F1ZXVlX2hlYWQgPSBtc2dfc2Vxbm8oYnVmX21zZyhidWYpKTsKKwkJbF9wdHItPnJldHJhbnNtX3F1ZXVlX3NpemUgPSByZXRyYW5zbWl0czsKKwkJcmV0dXJuOworCX0KKwl3aGlsZSAocmV0cmFuc21pdHMgJiYgKGJ1ZiAhPSBsX3B0ci0+bmV4dF9vdXQpICYmIGJ1ZiAmJiAhc2tiX2Nsb25lZChidWYpKSB7CisJCW1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJbXNnX3NldF9hY2sobXNnLCBtb2QobF9wdHItPm5leHRfaW5fbm8gLSAxKSk7CisJCW1zZ19zZXRfYmNhc3RfYWNrKG1zZywgbF9wdHItPm93bmVyLT5iY2xpbmsubGFzdF9pbik7IAorCQlpZiAodGlwY19iZWFyZXJfc2VuZChsX3B0ci0+Yl9wdHIsIGJ1ZiwgJmxfcHRyLT5tZWRpYV9hZGRyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2F0Y2ggaWYgcmV0cmFuc21pc3Npb25zIGZhaWwgcmVwZWF0ZWRseTogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX3B0ci0+bGFzdF9yZXRyYW5zbWl0dGVkID09IG1zZ19zZXFubyhtc2cpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrK2xfcHRyLT5zdGFsZV9jb3VudCA+IDEwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpcGNfbXNnX3ByaW50KFRJUENfQ09OUywgYnVmX21zZyhidWYpLCAiPlJFVFI+Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbygiLi4uUmV0cmFuc21pdHRlZCAldSB0aW1lc1xuIiwKKwkJCQkJICAgICBsX3B0ci0+c3RhbGVfY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfcHJpbnQobF9wdHIsIFRJUENfQ09OUywgIlJlc2V0dGluZyBMaW5rXG4iKTs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlwY19saW5rX3Jlc2V0KGxfcHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9wdHItPnN0YWxlX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxfcHRyLT5sYXN0X3JldHJhbnNtaXR0ZWQgPSBtc2dfc2Vxbm8obXNnKTsKKworCQkJbXNnX2RiZyhidWZfbXNnKGJ1ZiksICI+UkVUUj4iKTsKKwkJCWJ1ZiA9IGJ1Zi0+bmV4dDsKKwkJCXJldHJhbnNtaXRzLS07CisJCQlsX3B0ci0+c3RhdHMucmV0cmFuc21pdHRlZCsrOworCQl9IGVsc2UgeworCQkJdGlwY19iZWFyZXJfc2NoZWR1bGUobF9wdHItPmJfcHRyLCBsX3B0cik7CisJCQlsX3B0ci0+c3RhdHMuYmVhcmVyX2NvbmdzKys7CisJCQlsX3B0ci0+cmV0cmFuc21fcXVldWVfaGVhZCA9IG1zZ19zZXFubyhidWZfbXNnKGJ1ZikpOworCQkJbF9wdHItPnJldHJhbnNtX3F1ZXVlX3NpemUgPSByZXRyYW5zbWl0czsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlsX3B0ci0+cmV0cmFuc21fcXVldWVfaGVhZCA9IGxfcHRyLT5yZXRyYW5zbV9xdWV1ZV9zaXplID0gMDsKK30KKworLyogCisgKiBsaW5rX3JlY3Zfbm9uX3NlcTogUmVjZWl2ZSBwYWNrZXRzIHdoaWNoIGFyZSBvdXRzaWRlCisgKiAgICAgICAgICAgICAgICAgICAgdGhlIGxpbmsgc2VxdWVuY2UgZmxvdworICovCisKK3N0YXRpYyB2b2lkIGxpbmtfcmVjdl9ub25fc2VxKHN0cnVjdCBza19idWZmICpidWYpCit7CisJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGJ1Zik7CisKKwlpZiAobXNnX3VzZXIobXNnKSA9PSAgTElOS19DT05GSUcpCisJCXRpcGNfZGlzY19yZWN2X21zZyhidWYpOworCWVsc2UKKwkJdGlwY19iY2xpbmtfcmVjdl9wa3QoYnVmKTsKK30KKworLyoqIAorICogbGlua19pbnNlcnRfZGVmZXJyZWRfcXVldWUgLSBpbnNlcnQgZGVmZXJyZWQgbWVzc2FnZXMgYmFjayBpbnRvIHJlY2VpdmUgY2hhaW4KKyAqLworCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmxpbmtfaW5zZXJ0X2RlZmVycmVkX3F1ZXVlKHN0cnVjdCBsaW5rICpsX3B0ciwgCisJCQkJCQkgIHN0cnVjdCBza19idWZmICpidWYpCit7CisJdTMyIHNlcV9ubzsKKworCWlmIChsX3B0ci0+b2xkZXN0X2RlZmVycmVkX2luID09IE5VTEwpCisJCXJldHVybiBidWY7CisKKwlzZXFfbm8gPSBtc2dfc2Vxbm8oYnVmX21zZyhsX3B0ci0+b2xkZXN0X2RlZmVycmVkX2luKSk7CisJaWYgKHNlcV9ubyA9PSBtb2QobF9wdHItPm5leHRfaW5fbm8pKSB7CisJCWxfcHRyLT5uZXdlc3RfZGVmZXJyZWRfaW4tPm5leHQgPSBidWY7CisJCWJ1ZiA9IGxfcHRyLT5vbGRlc3RfZGVmZXJyZWRfaW47CisJCWxfcHRyLT5vbGRlc3RfZGVmZXJyZWRfaW4gPSBOVUxMOworCQlsX3B0ci0+ZGVmZXJyZWRfaW5xdWV1ZV9zeiA9IDA7CisJfQorCXJldHVybiBidWY7Cit9CisKK3ZvaWQgdGlwY19yZWN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqaGVhZCwgc3RydWN0IHRpcGNfYmVhcmVyICp0Yl9wdHIpCit7CisJcmVhZF9sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKKwl3aGlsZSAoaGVhZCkgeworCQlzdHJ1Y3QgYmVhcmVyICpiX3B0cjsKKwkJc3RydWN0IG5vZGUgKm5fcHRyOworCQlzdHJ1Y3QgbGluayAqbF9wdHI7CisJCXN0cnVjdCBza19idWZmICpjcnM7CisJCXN0cnVjdCBza19idWZmICpidWYgPSBoZWFkOworCQlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJdTMyIHNlcV9ubyA9IG1zZ19zZXFubyhtc2cpOworCQl1MzIgYWNrZCA9IG1zZ19hY2sobXNnKTsKKwkJdTMyIHJlbGVhc2VkID0gMDsKKwkJaW50IHR5cGU7CisKKwkJYl9wdHIgPSAoc3RydWN0IGJlYXJlciAqKXRiX3B0cjsKKwkJVElQQ19TS0JfQ0IoYnVmKS0+aGFuZGxlID0gYl9wdHI7CisKKwkJaGVhZCA9IGhlYWQtPm5leHQ7CisJCWlmICh1bmxpa2VseShtc2dfdmVyc2lvbihtc2cpICE9IFRJUENfVkVSU0lPTikpCisJCQlnb3RvIGNvbnQ7CisjaWYgMAorCQlpZiAobXNnX3VzZXIobXNnKSAhPSBMSU5LX1BST1RPQ09MKQorI2VuZGlmCisJCQltc2dfZGJnKG1zZywiPFJFQzwiKTsKKworCQlpZiAodW5saWtlbHkobXNnX25vbl9zZXEobXNnKSkpIHsKKwkJCWxpbmtfcmVjdl9ub25fc2VxKGJ1Zik7CisJCQljb250aW51ZTsKKwkJfQorCQluX3B0ciA9IHRpcGNfbm9kZV9maW5kKG1zZ19wcmV2bm9kZShtc2cpKTsKKwkJaWYgKHVubGlrZWx5KCFuX3B0cikpCisJCQlnb3RvIGNvbnQ7CisKKwkJdGlwY19ub2RlX2xvY2sobl9wdHIpOworCQlsX3B0ciA9IG5fcHRyLT5saW5rc1tiX3B0ci0+aWRlbnRpdHldOworCQlpZiAodW5saWtlbHkoIWxfcHRyKSkgeworCQkJdGlwY19ub2RlX3VubG9jayhuX3B0cik7CisJCQlnb3RvIGNvbnQ7CisJCX0KKwkJLyogCisJCSAqIFJlbGVhc2UgYWNrZWQgbWVzc2FnZXMgCisJCSAqLworCQlpZiAobGVzcyhuX3B0ci0+YmNsaW5rLmFja2VkLCBtc2dfYmNhc3RfYWNrKG1zZykpKSB7CisJCQlpZiAodGlwY19ub2RlX2lzX3VwKG5fcHRyKSAmJiBuX3B0ci0+YmNsaW5rLnN1cHBvcnRlZCkKKwkJCQl0aXBjX2JjbGlua19hY2tub3dsZWRnZShuX3B0ciwgbXNnX2JjYXN0X2Fjayhtc2cpKTsKKwkJfQorCisJCWNycyA9IGxfcHRyLT5maXJzdF9vdXQ7CisJCXdoaWxlICgoY3JzICE9IGxfcHRyLT5uZXh0X291dCkgJiYgCisJCSAgICAgICBsZXNzX2VxKG1zZ19zZXFubyhidWZfbXNnKGNycykpLCBhY2tkKSkgeworCQkJc3RydWN0IHNrX2J1ZmYgKm5leHQgPSBjcnMtPm5leHQ7CisKKwkJCWJ1Zl9kaXNjYXJkKGNycyk7CisJCQljcnMgPSBuZXh0OworCQkJcmVsZWFzZWQrKzsKKwkJfQorCQlpZiAocmVsZWFzZWQpIHsKKwkJCWxfcHRyLT5maXJzdF9vdXQgPSBjcnM7CisJCQlsX3B0ci0+b3V0X3F1ZXVlX3NpemUgLT0gcmVsZWFzZWQ7CisJCX0KKwkJaWYgKHVubGlrZWx5KGxfcHRyLT5uZXh0X291dCkpCisJCQl0aXBjX2xpbmtfcHVzaF9xdWV1ZShsX3B0cik7CisJCWlmICh1bmxpa2VseSghbGlzdF9lbXB0eSgmbF9wdHItPndhaXRpbmdfcG9ydHMpKSkKKwkJCXRpcGNfbGlua193YWtldXBfcG9ydHMobF9wdHIsIDApOworCQlpZiAodW5saWtlbHkoKytsX3B0ci0+dW5hY2tlZF93aW5kb3cgPj0gVElQQ19NSU5fTElOS19XSU4pKSB7CisJCQlsX3B0ci0+c3RhdHMuc2VudF9hY2tzKys7CisJCQl0aXBjX2xpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIFNUQVRFX01TRywgMCwgMCwgMCwgMCwgMCk7CisJCX0KKworcHJvdG9jb2xfY2hlY2s6CisJCWlmIChsaWtlbHkobGlua193b3JraW5nX3dvcmtpbmcobF9wdHIpKSkgeworCQkJaWYgKGxpa2VseShzZXFfbm8gPT0gbW9kKGxfcHRyLT5uZXh0X2luX25vKSkpIHsKKwkJCQlsX3B0ci0+bmV4dF9pbl9ubysrOworCQkJCWlmICh1bmxpa2VseShsX3B0ci0+b2xkZXN0X2RlZmVycmVkX2luKSkKKwkJCQkJaGVhZCA9IGxpbmtfaW5zZXJ0X2RlZmVycmVkX3F1ZXVlKGxfcHRyLAorCQkJCQkJCQkJICBoZWFkKTsKKwkJCQlpZiAobGlrZWx5KG1zZ19pc19kZXN0KG1zZywgdGlwY19vd25fYWRkcikpKSB7CitkZWxpdmVyOgorCQkJCQlpZiAobGlrZWx5KG1zZ19pc2RhdGEobXNnKSkpIHsKKwkJCQkJCXRpcGNfbm9kZV91bmxvY2sobl9wdHIpOworCQkJCQkJdGlwY19wb3J0X3JlY3ZfbXNnKGJ1Zik7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlzd2l0Y2ggKG1zZ191c2VyKG1zZykpIHsKKwkJCQkJY2FzZSBNU0dfQlVORExFUjoKKwkJCQkJCWxfcHRyLT5zdGF0cy5yZWN2X2J1bmRsZXMrKzsKKwkJCQkJCWxfcHRyLT5zdGF0cy5yZWN2X2J1bmRsZWQgKz0gCisJCQkJCQkJbXNnX21zZ2NudChtc2cpOworCQkJCQkJdGlwY19ub2RlX3VubG9jayhuX3B0cik7CisJCQkJCQl0aXBjX2xpbmtfcmVjdl9idW5kbGUoYnVmKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQljYXNlIFJPVVRFX0RJU1RSSUJVVE9SOgorCQkJCQkJdGlwY19ub2RlX3VubG9jayhuX3B0cik7CisJCQkJCQl0aXBjX2NsdHJfcmVjdl9yb3V0aW5nX3RhYmxlKGJ1Zik7CisJCQkJCQljb250aW51ZTsKKwkJCQkJY2FzZSBOQU1FX0RJU1RSSUJVVE9SOgorCQkJCQkJdGlwY19ub2RlX3VubG9jayhuX3B0cik7CisJCQkJCQl0aXBjX25hbWVkX3JlY3YoYnVmKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQljYXNlIENPTk5fTUFOQUdFUjoKKwkJCQkJCXRpcGNfbm9kZV91bmxvY2sobl9wdHIpOworCQkJCQkJdGlwY19wb3J0X3JlY3ZfcHJvdG9fbXNnKGJ1Zik7CisJCQkJCQljb250aW51ZTsKKwkJCQkJY2FzZSBNU0dfRlJBR01FTlRFUjoKKwkJCQkJCWxfcHRyLT5zdGF0cy5yZWN2X2ZyYWdtZW50cysrOworCQkJCQkJaWYgKHRpcGNfbGlua19yZWN2X2ZyYWdtZW50KCZsX3B0ci0+ZGVmcmFnbV9idWYsIAorCQkJCQkJCQkJICAgICZidWYsICZtc2cpKSB7CisJCQkJCQkJbF9wdHItPnN0YXRzLnJlY3ZfZnJhZ21lbnRlZCsrOworCQkJCQkJCWdvdG8gZGVsaXZlcjsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIENIQU5HRU9WRVJfUFJPVE9DT0w6CisJCQkJCQl0eXBlID0gbXNnX3R5cGUobXNnKTsKKwkJCQkJCWlmIChsaW5rX3JlY3ZfY2hhbmdlb3Zlcl9tc2coJmxfcHRyLCAmYnVmKSkgeworCQkJCQkJCW1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJCQkJCQlzZXFfbm8gPSBtc2dfc2Vxbm8obXNnKTsKKwkJCQkJCQlUSVBDX1NLQl9DQihidWYpLT5oYW5kbGUgCisJCQkJCQkJCT0gYl9wdHI7CisJCQkJCQkJaWYgKHR5cGUgPT0gT1JJR0lOQUxfTVNHKQorCQkJCQkJCQlnb3RvIGRlbGl2ZXI7CisJCQkJCQkJZ290byBwcm90b2NvbF9jaGVjazsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCXRpcGNfbm9kZV91bmxvY2sobl9wdHIpOworCQkJCXRpcGNfbmV0X3JvdXRlX21zZyhidWYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbGlua19oYW5kbGVfb3V0X29mX3NlcV9tc2cobF9wdHIsIGJ1Zik7CisJCQloZWFkID0gbGlua19pbnNlcnRfZGVmZXJyZWRfcXVldWUobF9wdHIsIGhlYWQpOworCQkJdGlwY19ub2RlX3VubG9jayhuX3B0cik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChtc2dfdXNlcihtc2cpID09IExJTktfUFJPVE9DT0wpIHsKKwkJCWxpbmtfcmVjdl9wcm90b19tc2cobF9wdHIsIGJ1Zik7CisJCQloZWFkID0gbGlua19pbnNlcnRfZGVmZXJyZWRfcXVldWUobF9wdHIsIGhlYWQpOworCQkJdGlwY19ub2RlX3VubG9jayhuX3B0cik7CisJCQljb250aW51ZTsKKwkJfQorCQltc2dfZGJnKG1zZywiTlNFUTxSRUM8Iik7CisJCWxpbmtfc3RhdGVfZXZlbnQobF9wdHIsIFRSQUZGSUNfTVNHX0VWVCk7CisKKwkJaWYgKGxpbmtfd29ya2luZ193b3JraW5nKGxfcHRyKSkgeworCQkJLyogUmUtaW5zZXJ0IGluIGZyb250IG9mIHF1ZXVlICovCisJCQltc2dfZGJnKG1zZywiUkVDVi1SRUlOUzoiKTsKKwkJCWJ1Zi0+bmV4dCA9IGhlYWQ7CisJCQloZWFkID0gYnVmOworCQkJdGlwY19ub2RlX3VubG9jayhuX3B0cik7CisJCQljb250aW51ZTsKKwkJfQorCQl0aXBjX25vZGVfdW5sb2NrKG5fcHRyKTsKK2NvbnQ6CisJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJfQorCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKK30KKworLyogCisgKiBsaW5rX2RlZmVyX2J1ZigpOiBTb3J0IGEgcmVjZWl2ZWQgb3V0LW9mLXNlcXVlbmNlIHBhY2tldCAKKyAqICAgICAgICAgICAgICAgICAgIGludG8gdGhlIGRlZmVycmVkIHJlY2VwdGlvbiBxdWV1ZS4KKyAqIFJldHVybnMgdGhlIGluY3JlYXNlIG9mIHRoZSBxdWV1ZSBsZW5ndGgsaS5lLiAwIG9yIDEKKyAqLworCit1MzIgdGlwY19saW5rX2RlZmVyX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqKmhlYWQsCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqKnRhaWwsCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXN0cnVjdCBza19idWZmICpwcmV2ID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqY3JzID0gKmhlYWQ7CisJdTMyIHNlcV9ubyA9IG1zZ19zZXFubyhidWZfbXNnKGJ1ZikpOworCisJYnVmLT5uZXh0ID0gTlVMTDsKKworCS8qIEVtcHR5IHF1ZXVlID8gKi8KKwlpZiAoKmhlYWQgPT0gTlVMTCkgeworCQkqaGVhZCA9ICp0YWlsID0gYnVmOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBMYXN0ID8gKi8KKwlpZiAobGVzcyhtc2dfc2Vxbm8oYnVmX21zZygqdGFpbCkpLCBzZXFfbm8pKSB7CisJCSgqdGFpbCktPm5leHQgPSBidWY7CisJCSp0YWlsID0gYnVmOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBTY2FuIHRocm91Z2ggcXVldWUgYW5kIHNvcnQgaXQgaW4gKi8KKwlkbyB7CisJCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhjcnMpOworCisJCWlmIChsZXNzKHNlcV9ubywgbXNnX3NlcW5vKG1zZykpKSB7CisJCQlidWYtPm5leHQgPSBjcnM7CisJCQlpZiAocHJldikKKwkJCQlwcmV2LT5uZXh0ID0gYnVmOworCQkJZWxzZQorCQkJCSpoZWFkID0gYnVmOyAgIAorCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKHNlcV9ubyA9PSBtc2dfc2Vxbm8obXNnKSkgeworCQkJYnJlYWs7CisJCX0KKwkJcHJldiA9IGNyczsKKwkJY3JzID0gY3JzLT5uZXh0OworCX0KKwl3aGlsZSAoY3JzKTsKKworCS8qIE1lc3NhZ2UgaXMgYSBkdXBsaWNhdGUgb2YgYW4gZXhpc3RpbmcgbWVzc2FnZSAqLworCisJYnVmX2Rpc2NhcmQoYnVmKTsKKwlyZXR1cm4gMDsKK30KKworLyoqIAorICogbGlua19oYW5kbGVfb3V0X29mX3NlcV9tc2cgLSBoYW5kbGUgYXJyaXZhbCBvZiBvdXQtb2Ytc2VxdWVuY2UgcGFja2V0CisgKi8KKworc3RhdGljIHZvaWQgbGlua19oYW5kbGVfb3V0X29mX3NlcV9tc2coc3RydWN0IGxpbmsgKmxfcHRyLCAKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwl1MzIgc2VxX25vID0gbXNnX3NlcW5vKGJ1Zl9tc2coYnVmKSk7CisKKwlpZiAobGlrZWx5KG1zZ191c2VyKGJ1Zl9tc2coYnVmKSkgPT0gTElOS19QUk9UT0NPTCkpIHsKKwkJbGlua19yZWN2X3Byb3RvX21zZyhsX3B0ciwgYnVmKTsKKwkJcmV0dXJuOworCX0KKworCWRiZygicnggT09TIG1zZzogc2VxX25vICV1LCBleHBlY3RpbmcgJXUgKCV1KVxuIiwgCisJICAgIHNlcV9ubywgbW9kKGxfcHRyLT5uZXh0X2luX25vKSwgbF9wdHItPm5leHRfaW5fbm8pOworCisJLyogUmVjb3JkIE9PUyBwYWNrZXQgYXJyaXZhbCAoZm9yY2UgbWlzbWF0Y2ggb24gbmV4dCB0aW1lb3V0KSAqLworCisJbF9wdHItPmNoZWNrcG9pbnQtLTsKKworCS8qIAorCSAqIERpc2NhcmQgcGFja2V0IGlmIGEgZHVwbGljYXRlOyBvdGhlcndpc2UgYWRkIGl0IHRvIGRlZmVycmVkIHF1ZXVlCisJICogYW5kIG5vdGlmeSBwZWVyIG9mIGdhcCBhcyBwZXIgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbgorCSAqLworCisJaWYgKGxlc3Moc2VxX25vLCBtb2QobF9wdHItPm5leHRfaW5fbm8pKSkgeworCQlsX3B0ci0+c3RhdHMuZHVwbGljYXRlcysrOworCQlidWZfZGlzY2FyZChidWYpOworCQlyZXR1cm47CisJfQorCisJaWYgKHRpcGNfbGlua19kZWZlcl9wa3QoJmxfcHRyLT5vbGRlc3RfZGVmZXJyZWRfaW4sCisJCQkJJmxfcHRyLT5uZXdlc3RfZGVmZXJyZWRfaW4sIGJ1ZikpIHsKKwkJbF9wdHItPmRlZmVycmVkX2lucXVldWVfc3orKzsKKwkJbF9wdHItPnN0YXRzLmRlZmVycmVkX3JlY3YrKzsKKwkJaWYgKChsX3B0ci0+ZGVmZXJyZWRfaW5xdWV1ZV9zeiAlIDE2KSA9PSAxKQorCQkJdGlwY19saW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLCBTVEFURV9NU0csIDAsIDAsIDAsIDAsIDApOworCX0gZWxzZQorCQlsX3B0ci0+c3RhdHMuZHVwbGljYXRlcysrOworfQorCisvKgorICogU2VuZCBwcm90b2NvbCBtZXNzYWdlIHRvIHRoZSBvdGhlciBlbmRwb2ludC4KKyAqLwordm9pZCB0aXBjX2xpbmtfc2VuZF9wcm90b19tc2coc3RydWN0IGxpbmsgKmxfcHRyLCB1MzIgbXNnX3R5cCwgaW50IHByb2JlX21zZywKKwkJCSAgICAgIHUzMiBnYXAsIHUzMiB0b2xlcmFuY2UsIHUzMiBwcmlvcml0eSwgdTMyIGFja19tdHUpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IDA7CisJc3RydWN0IHRpcGNfbXNnICptc2cgPSBsX3B0ci0+cG1zZzsKKyAgICAgICAgdTMyIG1zZ19zaXplID0gc2l6ZW9mKGxfcHRyLT5wcm90b19tc2cpOworCisJaWYgKGxpbmtfYmxvY2tlZChsX3B0cikpCisJCXJldHVybjsKKwltc2dfc2V0X3R5cGUobXNnLCBtc2dfdHlwKTsKKwltc2dfc2V0X25ldF9wbGFuZShtc2csIGxfcHRyLT5iX3B0ci0+bmV0X3BsYW5lKTsKKwltc2dfc2V0X2JjYXN0X2Fjayhtc2csIG1vZChsX3B0ci0+b3duZXItPmJjbGluay5sYXN0X2luKSk7IAorCW1zZ19zZXRfbGFzdF9iY2FzdChtc2csIHRpcGNfYmNsaW5rX2dldF9sYXN0X3NlbnQoKSk7CisKKwlpZiAobXNnX3R5cCA9PSBTVEFURV9NU0cpIHsKKwkJdTMyIG5leHRfc2VudCA9IG1vZChsX3B0ci0+bmV4dF9vdXRfbm8pOworCisJCWlmICghdGlwY19saW5rX2lzX3VwKGxfcHRyKSkKKwkJCXJldHVybjsKKwkJaWYgKGxfcHRyLT5uZXh0X291dCkKKwkJCW5leHRfc2VudCA9IG1zZ19zZXFubyhidWZfbXNnKGxfcHRyLT5uZXh0X291dCkpOworCQltc2dfc2V0X25leHRfc2VudChtc2csIG5leHRfc2VudCk7CisJCWlmIChsX3B0ci0+b2xkZXN0X2RlZmVycmVkX2luKSB7CisJCQl1MzIgcmVjID0gbXNnX3NlcW5vKGJ1Zl9tc2cobF9wdHItPm9sZGVzdF9kZWZlcnJlZF9pbikpOworCQkJZ2FwID0gbW9kKHJlYyAtIG1vZChsX3B0ci0+bmV4dF9pbl9ubykpOworCQl9CisJCW1zZ19zZXRfc2VxX2dhcChtc2csIGdhcCk7CisJCWlmIChnYXApCisJCQlsX3B0ci0+c3RhdHMuc2VudF9uYWNrcysrOworCQltc2dfc2V0X2xpbmtfdG9sZXJhbmNlKG1zZywgdG9sZXJhbmNlKTsKKwkJbXNnX3NldF9saW5rcHJpbyhtc2csIHByaW9yaXR5KTsKKwkJbXNnX3NldF9tYXhfcGt0KG1zZywgYWNrX210dSk7CisJCW1zZ19zZXRfYWNrKG1zZywgbW9kKGxfcHRyLT5uZXh0X2luX25vIC0gMSkpOworCQltc2dfc2V0X3Byb2JlKG1zZywgcHJvYmVfbXNnICE9IDApOworCQlpZiAocHJvYmVfbXNnKSB7IAorCQkJdTMyIG10dSA9IGxfcHRyLT5tYXhfcGt0OworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG10dSA8IGxfcHRyLT5tYXhfcGt0X3RhcmdldCkgJiYKKwkJCSAgICBsaW5rX3dvcmtpbmdfd29ya2luZyhsX3B0cikgJiYKKwkJCSAgICBsX3B0ci0+ZnNtX21zZ19jbnQpIHsKKwkJCQltc2dfc2l6ZSA9IChtdHUgKyAobF9wdHItPm1heF9wa3RfdGFyZ2V0IC0gbXR1KS8yICsgMikgJiB+MzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfcHRyLT5tYXhfcGt0X3Byb2JlcyA9PSAxMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfcHRyLT5tYXhfcGt0X3RhcmdldCA9IChtc2dfc2l6ZSAtIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfcHRyLT5tYXhfcGt0X3Byb2JlcyA9IDA7CisJCQkJCW1zZ19zaXplID0gKG10dSArIChsX3B0ci0+bWF4X3BrdF90YXJnZXQgLSBtdHUpLzIgKyAyKSAmIH4zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQkJbF9wdHItPm1heF9wa3RfcHJvYmVzKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKwkJCWxfcHRyLT5zdGF0cy5zZW50X3Byb2JlcysrOworICAgICAgICAgICAgICAgIH0KKwkJbF9wdHItPnN0YXRzLnNlbnRfc3RhdGVzKys7CisJfSBlbHNlIHsJCS8qIFJFU0VUX01TRyBvciBBQ1RJVkFURV9NU0cgKi8KKwkJbXNnX3NldF9hY2sobXNnLCBtb2QobF9wdHItPnJlc2V0X2NoZWNrcG9pbnQgLSAxKSk7CisJCW1zZ19zZXRfc2VxX2dhcChtc2csIDApOworCQltc2dfc2V0X25leHRfc2VudChtc2csIDEpOworCQltc2dfc2V0X2xpbmtfdG9sZXJhbmNlKG1zZywgbF9wdHItPnRvbGVyYW5jZSk7CisJCW1zZ19zZXRfbGlua3ByaW8obXNnLCBsX3B0ci0+cHJpb3JpdHkpOworCQltc2dfc2V0X21heF9wa3QobXNnLCBsX3B0ci0+bWF4X3BrdF90YXJnZXQpOworCX0KKworCWlmICh0aXBjX25vZGVfaGFzX3JlZHVuZGFudF9saW5rcyhsX3B0ci0+b3duZXIpKSB7CisJCW1zZ19zZXRfcmVkdW5kYW50X2xpbmsobXNnKTsKKwl9IGVsc2UgeworCQltc2dfY2xlYXJfcmVkdW5kYW50X2xpbmsobXNnKTsKKwl9CisJbXNnX3NldF9saW5rcHJpbyhtc2csIGxfcHRyLT5wcmlvcml0eSk7CisKKwkvKiBFbnN1cmUgc2VxdWVuY2UgbnVtYmVyIHdpbGwgbm90IGZpdCA6ICovCisKKwltc2dfc2V0X3NlcW5vKG1zZywgbW9kKGxfcHRyLT5uZXh0X291dF9ubyArICgweGZmZmYvMikpKTsKKworCS8qIENvbmdlc3Rpb24/ICovCisKKwlpZiAodGlwY19iZWFyZXJfY29uZ2VzdGVkKGxfcHRyLT5iX3B0ciwgbF9wdHIpKSB7CisJCWlmICghbF9wdHItPnByb3RvX21zZ19xdWV1ZSkgeworCQkJbF9wdHItPnByb3RvX21zZ19xdWV1ZSA9CisJCQkJYnVmX2FjcXVpcmUoc2l6ZW9mKGxfcHRyLT5wcm90b19tc2cpKTsKKwkJfQorCQlidWYgPSBsX3B0ci0+cHJvdG9fbXNnX3F1ZXVlOworCQlpZiAoIWJ1ZikKKwkJCXJldHVybjsKKwkJbWVtY3B5KGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKW1zZywgc2l6ZW9mKGxfcHRyLT5wcm90b19tc2cpKTsKKwkJcmV0dXJuOworCX0KKwltc2dfc2V0X3RpbWVzdGFtcChtc2csIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcykpOworCisJLyogTWVzc2FnZSBjYW4gYmUgc2VudCAqLworCisJbXNnX2RiZyhtc2csICI+PiIpOworCisJYnVmID0gYnVmX2FjcXVpcmUobXNnX3NpemUpOworCWlmICghYnVmKQorCQlyZXR1cm47CisKKwltZW1jcHkoYnVmLT5kYXRhLCAodW5jaGFyICopbXNnLCBzaXplb2YobF9wdHItPnByb3RvX21zZykpOworICAgICAgICBtc2dfc2V0X3NpemUoYnVmX21zZyhidWYpLCBtc2dfc2l6ZSk7CisKKwlpZiAodGlwY19iZWFyZXJfc2VuZChsX3B0ci0+Yl9wdHIsIGJ1ZiwgJmxfcHRyLT5tZWRpYV9hZGRyKSkgeworCQlsX3B0ci0+dW5hY2tlZF93aW5kb3cgPSAwOworCQlidWZfZGlzY2FyZChidWYpOworCQlyZXR1cm47CisJfQorCisJLyogTmV3IGNvbmdlc3Rpb24gKi8KKwl0aXBjX2JlYXJlcl9zY2hlZHVsZShsX3B0ci0+Yl9wdHIsIGxfcHRyKTsKKwlsX3B0ci0+cHJvdG9fbXNnX3F1ZXVlID0gYnVmOworCWxfcHRyLT5zdGF0cy5iZWFyZXJfY29uZ3MrKzsKK30KKworLyoKKyAqIFJlY2VpdmUgcHJvdG9jb2wgbWVzc2FnZSA6CisgKiBOb3RlIHRoYXQgbmV0d29yayBwbGFuZSBpZCBwcm9wYWdhdGVzIHRocm91Z2ggdGhlIG5ldHdvcmssIGFuZCBtYXkgCisgKiBjaGFuZ2UgYXQgYW55IHRpbWUuIFRoZSBub2RlIHdpdGggbG93ZXN0IGFkZHJlc3MgcnVsZXMgICAgCisgKi8KKworc3RhdGljIHZvaWQgbGlua19yZWN2X3Byb3RvX21zZyhzdHJ1Y3QgbGluayAqbF9wdHIsIHN0cnVjdCBza19idWZmICpidWYpCit7CisJdTMyIHJlY19nYXAgPSAwOworCXUzMiBtYXhfcGt0X2luZm87CisgICAgICAgIHUzMiBtYXhfcGt0X2FjazsKKwl1MzIgbXNnX3RvbDsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKworCWRiZygiQVQoJXUpOiIsIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcykpOworCW1zZ19kYmcobXNnLCAiPDwiKTsKKwlpZiAobGlua19ibG9ja2VkKGxfcHRyKSkKKwkJZ290byBleGl0OworCisJLyogcmVjb3JkIHVubnVtYmVyZWQgcGFja2V0IGFycml2YWwgKGZvcmNlIG1pc21hdGNoIG9uIG5leHQgdGltZW91dCkgKi8KKworCWxfcHRyLT5jaGVja3BvaW50LS07CisKKwlpZiAobF9wdHItPmJfcHRyLT5uZXRfcGxhbmUgIT0gbXNnX25ldF9wbGFuZShtc2cpKQorCQlpZiAodGlwY19vd25fYWRkciA+IG1zZ19wcmV2bm9kZShtc2cpKQorCQkJbF9wdHItPmJfcHRyLT5uZXRfcGxhbmUgPSBtc2dfbmV0X3BsYW5lKG1zZyk7CisKKwlsX3B0ci0+b3duZXItPnBlcm1pdF9jaGFuZ2VvdmVyID0gbXNnX3JlZHVuZGFudF9saW5rKG1zZyk7CisKKwlzd2l0Y2ggKG1zZ190eXBlKG1zZykpIHsKKwkKKwljYXNlIFJFU0VUX01TRzoKKwkJaWYgKCFsaW5rX3dvcmtpbmdfdW5rbm93bihsX3B0cikgJiYgbF9wdHItPnBlZXJfc2Vzc2lvbikgeworCQkJaWYgKG1zZ19zZXNzaW9uKG1zZykgPT0gbF9wdHItPnBlZXJfc2Vzc2lvbikgeworCQkJCWRiZygiRHVwbGljYXRlIFJFU0VUOiAldTwtPiV1XG4iLAorCQkJCSAgICBtc2dfc2Vzc2lvbihtc2cpLCBsX3B0ci0+cGVlcl9zZXNzaW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJYnJlYWs7IC8qIGR1cGxpY2F0ZTogaWdub3JlICovCisJCQl9CisJCX0KKwkJLyogZmFsbCB0aHJ1JyAqLworCWNhc2UgQUNUSVZBVEVfTVNHOgorCQkvKiBVcGRhdGUgbGluayBzZXR0aW5ncyBhY2NvcmRpbmcgb3RoZXIgZW5kcG9pbnQncyB2YWx1ZXMgKi8KKworCQlzdHJjcHkoKHN0cnJjaHIobF9wdHItPm5hbWUsICc6JykgKyAxKSwgKGNoYXIgKiltc2dfZGF0YShtc2cpKTsKKworCQlpZiAoKG1zZ190b2wgPSBtc2dfbGlua190b2xlcmFuY2UobXNnKSkgJiYKKwkJICAgIChtc2dfdG9sID4gbF9wdHItPnRvbGVyYW5jZSkpCisJCQlsaW5rX3NldF9zdXBlcnZpc2lvbl9wcm9wcyhsX3B0ciwgbXNnX3RvbCk7CisKKwkJaWYgKG1zZ19saW5rcHJpbyhtc2cpID4gbF9wdHItPnByaW9yaXR5KQorCQkJbF9wdHItPnByaW9yaXR5ID0gbXNnX2xpbmtwcmlvKG1zZyk7CisKKwkJbWF4X3BrdF9pbmZvID0gbXNnX21heF9wa3QobXNnKTsKKyAgICAgICAgICAgICAgICBpZiAobWF4X3BrdF9pbmZvKSB7CisJCQlpZiAobWF4X3BrdF9pbmZvIDwgbF9wdHItPm1heF9wa3RfdGFyZ2V0KQorCQkJCWxfcHRyLT5tYXhfcGt0X3RhcmdldCA9IG1heF9wa3RfaW5mbzsKKwkJCWlmIChsX3B0ci0+bWF4X3BrdCA+IGxfcHRyLT5tYXhfcGt0X3RhcmdldCkKKwkJCQlsX3B0ci0+bWF4X3BrdCA9IGxfcHRyLT5tYXhfcGt0X3RhcmdldDsKKwkJfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfcHRyLT5tYXhfcGt0ID0gbF9wdHItPm1heF9wa3RfdGFyZ2V0OworCQl9CisJCWxfcHRyLT5vd25lci0+YmNsaW5rLnN1cHBvcnRlZCA9IChtYXhfcGt0X2luZm8gIT0gMCk7CisKKwkJbGlua19zdGF0ZV9ldmVudChsX3B0ciwgbXNnX3R5cGUobXNnKSk7CisKKwkJbF9wdHItPnBlZXJfc2Vzc2lvbiA9IG1zZ19zZXNzaW9uKG1zZyk7CisJCWxfcHRyLT5wZWVyX2JlYXJlcl9pZCA9IG1zZ19iZWFyZXJfaWQobXNnKTsKKworCQkvKiBTeW5jaHJvbml6ZSBicm9hZGNhc3Qgc2VxdWVuY2UgbnVtYmVycyAqLworCQlpZiAoIXRpcGNfbm9kZV9oYXNfcmVkdW5kYW50X2xpbmtzKGxfcHRyLT5vd25lcikpIHsKKwkJCWxfcHRyLT5vd25lci0+YmNsaW5rLmxhc3RfaW4gPSBtb2QobXNnX2xhc3RfYmNhc3QobXNnKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTVEFURV9NU0c6CisKKwkJaWYgKChtc2dfdG9sID0gbXNnX2xpbmtfdG9sZXJhbmNlKG1zZykpKQorCQkJbGlua19zZXRfc3VwZXJ2aXNpb25fcHJvcHMobF9wdHIsIG1zZ190b2wpOworCQkKKwkJaWYgKG1zZ19saW5rcHJpbyhtc2cpICYmIAorCQkgICAgKG1zZ19saW5rcHJpbyhtc2cpICE9IGxfcHRyLT5wcmlvcml0eSkpIHsKKwkJCXdhcm4oIkNoYW5naW5nIHByaW8gPCVzPjogJXUtPiV1XG4iLAorCQkJICAgICBsX3B0ci0+bmFtZSwgbF9wdHItPnByaW9yaXR5LCBtc2dfbGlua3ByaW8obXNnKSk7CisJCQlsX3B0ci0+cHJpb3JpdHkgPSBtc2dfbGlua3ByaW8obXNnKTsKKwkJCXRpcGNfbGlua19yZXNldChsX3B0cik7IC8qIEVuZm9yY2UgY2hhbmdlIHRvIHRha2UgZWZmZWN0ICovCisJCQlicmVhazsKKwkJfQorCQlsaW5rX3N0YXRlX2V2ZW50KGxfcHRyLCBUUkFGRklDX01TR19FVlQpOworCQlsX3B0ci0+c3RhdHMucmVjdl9zdGF0ZXMrKzsKKwkJaWYgKGxpbmtfcmVzZXRfdW5rbm93bihsX3B0cikpCisJCQlicmVhazsKKworCQlpZiAobGVzc19lcShtb2QobF9wdHItPm5leHRfaW5fbm8pLCBtc2dfbmV4dF9zZW50KG1zZykpKSB7CisJCQlyZWNfZ2FwID0gbW9kKG1zZ19uZXh0X3NlbnQobXNnKSAtIAorCQkJCSAgICAgIG1vZChsX3B0ci0+bmV4dF9pbl9ubykpOworCQl9CisKKwkJbWF4X3BrdF9hY2sgPSBtc2dfbWF4X3BrdChtc2cpOworICAgICAgICAgICAgICAgIGlmIChtYXhfcGt0X2FjayA+IGxfcHRyLT5tYXhfcGt0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkYmcoIkxpbmsgPCVzPiB1cGRhdGVkIE1UVSAldSAtPiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3B0ci0+bmFtZSwgbF9wdHItPm1heF9wa3QsIG1heF9wa3RfYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfcHRyLT5tYXhfcGt0ID0gbWF4X3BrdF9hY2s7CisgICAgICAgICAgICAgICAgICAgICAgICBsX3B0ci0+bWF4X3BrdF9wcm9iZXMgPSAwOworICAgICAgICAgICAgICAgIH0KKworCQltYXhfcGt0X2FjayA9IDA7CisgICAgICAgICAgICAgICAgaWYgKG1zZ19wcm9iZShtc2cpKSB7CisJCQlsX3B0ci0+c3RhdHMucmVjdl9wcm9iZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2dfc2l6ZShtc2cpID4gc2l6ZW9mKGxfcHRyLT5wcm90b19tc2cpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9wa3RfYWNrID0gbXNnX3NpemUobXNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKwkJLyogUHJvdG9jb2wgbWVzc2FnZSBiZWZvcmUgcmV0cmFuc21pdHMsIHJlZHVjZSBsb3NzIHJpc2sgKi8KKworCQl0aXBjX2JjbGlua19jaGVja19nYXAobF9wdHItPm93bmVyLCBtc2dfbGFzdF9iY2FzdChtc2cpKTsKKworCQlpZiAocmVjX2dhcCB8fCAobXNnX3Byb2JlKG1zZykpKSB7CisJCQl0aXBjX2xpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIFNUQVRFX01TRywKKwkJCQkJCSAwLCByZWNfZ2FwLCAwLCAwLCBtYXhfcGt0X2Fjayk7CisJCX0KKwkJaWYgKG1zZ19zZXFfZ2FwKG1zZykpIHsKKwkJCW1zZ19kYmcobXNnLCAiV2l0aCBHYXA6Iik7CisJCQlsX3B0ci0+c3RhdHMucmVjdl9uYWNrcysrOworCQkJdGlwY19saW5rX3JldHJhbnNtaXQobF9wdHIsIGxfcHRyLT5maXJzdF9vdXQsCisJCQkJCSAgICAgbXNnX3NlcV9nYXAobXNnKSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbXNnX2RiZyhidWZfbXNnKGJ1ZiksICI8RElTQ0FSRElORyBVTktOT1dOPCIpOworCX0KK2V4aXQ6CisJYnVmX2Rpc2NhcmQoYnVmKTsKK30KKworCisvKgorICogdGlwY19saW5rX3R1bm5lbCgpOiBTZW5kIG9uZSBtZXNzYWdlIHZpYSBhIGxpbmsgYmVsb25naW5nIHRvIAorICogYW5vdGhlciBiZWFyZXIuIE93bmVyIG5vZGUgaXMgbG9ja2VkLgorICovCit2b2lkIHRpcGNfbGlua190dW5uZWwoc3RydWN0IGxpbmsgKmxfcHRyLCAKKwkJICAgICAgc3RydWN0IHRpcGNfbXNnICp0dW5uZWxfaGRyLCAKKwkJICAgICAgc3RydWN0IHRpcGNfbXNnICAqbXNnLAorCQkgICAgICB1MzIgc2VsZWN0b3IpCit7CisJc3RydWN0IGxpbmsgKnR1bm5lbDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXUzMiBsZW5ndGggPSBtc2dfc2l6ZShtc2cpOworCisJdHVubmVsID0gbF9wdHItPm93bmVyLT5hY3RpdmVfbGlua3Nbc2VsZWN0b3IgJiAxXTsKKwlpZiAoIXRpcGNfbGlua19pc191cCh0dW5uZWwpKQorCQlyZXR1cm47CisJbXNnX3NldF9zaXplKHR1bm5lbF9oZHIsIGxlbmd0aCArIElOVF9IX1NJWkUpOworCWJ1ZiA9IGJ1Zl9hY3F1aXJlKGxlbmd0aCArIElOVF9IX1NJWkUpOworCWlmICghYnVmKQorCQlyZXR1cm47CisJbWVtY3B5KGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKXR1bm5lbF9oZHIsIElOVF9IX1NJWkUpOworCW1lbWNweShidWYtPmRhdGEgKyBJTlRfSF9TSVpFLCAodW5jaGFyICopbXNnLCBsZW5ndGgpOworCWRiZygiJWMtPiVjOiIsIGxfcHRyLT5iX3B0ci0+bmV0X3BsYW5lLCB0dW5uZWwtPmJfcHRyLT5uZXRfcGxhbmUpOworCW1zZ19kYmcoYnVmX21zZyhidWYpLCAiPlNFTkQ+Iik7CisJYXNzZXJ0KHR1bm5lbCk7CisJdGlwY19saW5rX3NlbmRfYnVmKHR1bm5lbCwgYnVmKTsKK30KKworCisKKy8qCisgKiBjaGFuZ2VvdmVyKCk6IFNlbmQgd2hvbGUgbWVzc2FnZSBxdWV1ZSB2aWEgdGhlIHJlbWFpbmluZyBsaW5rCisgKiAgICAgICAgICAgICAgIE93bmVyIG5vZGUgaXMgbG9ja2VkLgorICovCisKK3ZvaWQgdGlwY19saW5rX2NoYW5nZW92ZXIoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXUzMiBtc2djb3VudCA9IGxfcHRyLT5vdXRfcXVldWVfc2l6ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqY3JzID0gbF9wdHItPmZpcnN0X291dDsKKwlzdHJ1Y3QgbGluayAqdHVubmVsID0gbF9wdHItPm93bmVyLT5hY3RpdmVfbGlua3NbMF07CisJaW50IHNwbGl0X2J1bmRsZXMgPSB0aXBjX25vZGVfaGFzX3JlZHVuZGFudF9saW5rcyhsX3B0ci0+b3duZXIpOworCXN0cnVjdCB0aXBjX21zZyB0dW5uZWxfaGRyOworCisJaWYgKCF0dW5uZWwpCisJCXJldHVybjsKKworCWlmICghbF9wdHItPm93bmVyLT5wZXJtaXRfY2hhbmdlb3ZlcikKKwkJcmV0dXJuOworCisJbXNnX2luaXQoJnR1bm5lbF9oZHIsIENIQU5HRU9WRVJfUFJPVE9DT0wsCisJCSBPUklHSU5BTF9NU0csIFRJUENfT0ssIElOVF9IX1NJWkUsIGxfcHRyLT5hZGRyKTsKKwltc2dfc2V0X2JlYXJlcl9pZCgmdHVubmVsX2hkciwgbF9wdHItPnBlZXJfYmVhcmVyX2lkKTsKKwltc2dfc2V0X21zZ2NudCgmdHVubmVsX2hkciwgbXNnY291bnQpOworCWlmICghbF9wdHItPmZpcnN0X291dCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCisJCWFzc2VydCghbXNnY291bnQpOworCQlidWYgPSBidWZfYWNxdWlyZShJTlRfSF9TSVpFKTsKKwkJaWYgKGJ1ZikgeworCQkJbWVtY3B5KGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKSZ0dW5uZWxfaGRyLCBJTlRfSF9TSVpFKTsKKwkJCW1zZ19zZXRfc2l6ZSgmdHVubmVsX2hkciwgSU5UX0hfU0laRSk7CisJCQlkYmcoIiVjLT4lYzoiLCBsX3B0ci0+Yl9wdHItPm5ldF9wbGFuZSwKKwkJCSAgICB0dW5uZWwtPmJfcHRyLT5uZXRfcGxhbmUpOworCQkJbXNnX2RiZygmdHVubmVsX2hkciwgIkVNUFRZPlNFTkQ+Iik7CisJCQl0aXBjX2xpbmtfc2VuZF9idWYodHVubmVsLCBidWYpOworCQl9IGVsc2UgeworCQkJd2FybigiTWVtb3J5IHNxdWVlemU7IGxpbmsgY2hhbmdlb3ZlciBmYWlsZWRcbiIpOworCQl9CisJCXJldHVybjsKKwl9CisJd2hpbGUgKGNycykgeworCQlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coY3JzKTsKKworCQlpZiAoKG1zZ191c2VyKG1zZykgPT0gTVNHX0JVTkRMRVIpICYmIHNwbGl0X2J1bmRsZXMpIHsKKwkJCXUzMiBtc2djb3VudCA9IG1zZ19tc2djbnQobXNnKTsKKwkJCXN0cnVjdCB0aXBjX21zZyAqbSA9IG1zZ19nZXRfd3JhcHBlZChtc2cpOworCQkJdW5jaGFyKiBwb3MgPSAodW5jaGFyKiltOworCisJCQl3aGlsZSAobXNnY291bnQtLSkgeworCQkJCW1zZ19zZXRfc2Vxbm8obSxtc2dfc2Vxbm8obXNnKSk7CisJCQkJdGlwY19saW5rX3R1bm5lbChsX3B0ciwgJnR1bm5lbF9oZHIsIG0sCisJCQkJCQkgbXNnX2xpbmtfc2VsZWN0b3IobSkpOworCQkJCXBvcyArPSBhbGlnbihtc2dfc2l6ZShtKSk7CisJCQkJbSA9IChzdHJ1Y3QgdGlwY19tc2cgKilwb3M7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0aXBjX2xpbmtfdHVubmVsKGxfcHRyLCAmdHVubmVsX2hkciwgbXNnLAorCQkJCQkgbXNnX2xpbmtfc2VsZWN0b3IobXNnKSk7CisJCX0KKwkJY3JzID0gY3JzLT5uZXh0OworCX0KK30KKwordm9pZCB0aXBjX2xpbmtfc2VuZF9kdXBsaWNhdGUoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3QgbGluayAqdHVubmVsKQoreworCXN0cnVjdCBza19idWZmICppdGVyOworCXN0cnVjdCB0aXBjX21zZyB0dW5uZWxfaGRyOworCisJbXNnX2luaXQoJnR1bm5lbF9oZHIsIENIQU5HRU9WRVJfUFJPVE9DT0wsCisJCSBEVVBMSUNBVEVfTVNHLCBUSVBDX09LLCBJTlRfSF9TSVpFLCBsX3B0ci0+YWRkcik7CisJbXNnX3NldF9tc2djbnQoJnR1bm5lbF9oZHIsIGxfcHRyLT5vdXRfcXVldWVfc2l6ZSk7CisJbXNnX3NldF9iZWFyZXJfaWQoJnR1bm5lbF9oZHIsIGxfcHRyLT5wZWVyX2JlYXJlcl9pZCk7CisJaXRlciA9IGxfcHRyLT5maXJzdF9vdXQ7CisJd2hpbGUgKGl0ZXIpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm91dGJ1ZjsKKwkJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGl0ZXIpOworCQl1MzIgbGVuZ3RoID0gbXNnX3NpemUobXNnKTsKKworCQlpZiAobXNnX3VzZXIobXNnKSA9PSBNU0dfQlVORExFUikKKwkJCW1zZ19zZXRfdHlwZShtc2csIENMT1NFRF9NU0cpOworCQltc2dfc2V0X2Fjayhtc2csIG1vZChsX3B0ci0+bmV4dF9pbl9ubyAtIDEpKTsJLyogVXBkYXRlICovCisJCW1zZ19zZXRfYmNhc3RfYWNrKG1zZywgbF9wdHItPm93bmVyLT5iY2xpbmsubGFzdF9pbik7IAorCQltc2dfc2V0X3NpemUoJnR1bm5lbF9oZHIsIGxlbmd0aCArIElOVF9IX1NJWkUpOworCQlvdXRidWYgPSBidWZfYWNxdWlyZShsZW5ndGggKyBJTlRfSF9TSVpFKTsKKwkJaWYgKG91dGJ1ZiA9PSBOVUxMKSB7CisJCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgYnVmZmVyIGR1cGxpY2F0aW9uIGZhaWxlZFxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJbWVtY3B5KG91dGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKSZ0dW5uZWxfaGRyLCBJTlRfSF9TSVpFKTsKKwkJbWVtY3B5KG91dGJ1Zi0+ZGF0YSArIElOVF9IX1NJWkUsIGl0ZXItPmRhdGEsIGxlbmd0aCk7CisJCWRiZygiJWMtPiVjOiIsIGxfcHRyLT5iX3B0ci0+bmV0X3BsYW5lLAorCQkgICAgdHVubmVsLT5iX3B0ci0+bmV0X3BsYW5lKTsKKwkJbXNnX2RiZyhidWZfbXNnKG91dGJ1ZiksICI+U0VORD4iKTsKKwkJdGlwY19saW5rX3NlbmRfYnVmKHR1bm5lbCwgb3V0YnVmKTsKKwkJaWYgKCF0aXBjX2xpbmtfaXNfdXAobF9wdHIpKQorCQkJcmV0dXJuOworCQlpdGVyID0gaXRlci0+bmV4dDsKKwl9Cit9CisKKworCisvKioKKyAqIGJ1Zl9leHRyYWN0IC0gZXh0cmFjdHMgZW1iZWRkZWQgVElQQyBtZXNzYWdlIGZyb20gYW5vdGhlciBtZXNzYWdlCisgKiBAc2tiOiBlbmNhcHN1bGF0aW5nIG1lc3NhZ2UgYnVmZmVyCisgKiBAZnJvbV9wb3M6IG9mZnNldCB0byBleHRyYWN0IGZyb20KKyAqCisgKiBSZXR1cm5zIGEgbmV3IG1lc3NhZ2UgYnVmZmVyIGNvbnRhaW5pbmcgYW4gZW1iZWRkZWQgbWVzc2FnZS4gIFRoZSAKKyAqIGVuY2Fwc3VsYXRpbmcgbWVzc2FnZSBpdHNlbGYgaXMgbGVmdCB1bmNoYW5nZWQuCisgKi8KKworc3RhdGljIHN0cnVjdCBza19idWZmICpidWZfZXh0cmFjdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgZnJvbV9wb3MpCit7CisJc3RydWN0IHRpcGNfbXNnICptc2cgPSAoc3RydWN0IHRpcGNfbXNnICopKHNrYi0+ZGF0YSArIGZyb21fcG9zKTsKKwl1MzIgc2l6ZSA9IG1zZ19zaXplKG1zZyk7CisJc3RydWN0IHNrX2J1ZmYgKmViOworCisJZWIgPSBidWZfYWNxdWlyZShzaXplKTsKKwlpZiAoZWIpCisJCW1lbWNweShlYi0+ZGF0YSwgKHVuY2hhciAqKW1zZywgc2l6ZSk7CisJcmV0dXJuIGViOworfQorCisvKiAKKyAqICBsaW5rX3JlY3ZfY2hhbmdlb3Zlcl9tc2coKTogUmVjZWl2ZSB0dW5uZWxlZCBwYWNrZXQgc2VudAorICogIHZpYSBvdGhlciBsaW5rLiBOb2RlIGlzIGxvY2tlZC4gUmV0dXJuIGV4dHJhY3RlZCBidWZmZXIuCisgKi8KKworc3RhdGljIGludCBsaW5rX3JlY3ZfY2hhbmdlb3Zlcl9tc2coc3RydWN0IGxpbmsgKipsX3B0ciwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKipidWYpCit7CisJc3RydWN0IHNrX2J1ZmYgKnR1bm5lbF9idWYgPSAqYnVmOworCXN0cnVjdCBsaW5rICpkZXN0X2xpbms7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisJc3RydWN0IHRpcGNfbXNnICp0dW5uZWxfbXNnID0gYnVmX21zZyh0dW5uZWxfYnVmKTsKKwl1MzIgbXNnX3R5cCA9IG1zZ190eXBlKHR1bm5lbF9tc2cpOworCXUzMiBtc2dfY291bnQgPSBtc2dfbXNnY250KHR1bm5lbF9tc2cpOworCisJZGVzdF9saW5rID0gKCpsX3B0ciktPm93bmVyLT5saW5rc1ttc2dfYmVhcmVyX2lkKHR1bm5lbF9tc2cpXTsKKwlhc3NlcnQoZGVzdF9saW5rICE9ICpsX3B0cik7CisJaWYgKCFkZXN0X2xpbmspIHsKKwkJbXNnX2RiZyh0dW5uZWxfbXNnLCAiTk9MSU5LLzxSRUM8Iik7CisJCWdvdG8gZXhpdDsKKwl9CisJZGJnKCIlYzwtJWM6IiwgZGVzdF9saW5rLT5iX3B0ci0+bmV0X3BsYW5lLAorCSAgICAoKmxfcHRyKS0+Yl9wdHItPm5ldF9wbGFuZSk7CisJKmxfcHRyID0gZGVzdF9saW5rOworCW1zZyA9IG1zZ19nZXRfd3JhcHBlZCh0dW5uZWxfbXNnKTsKKworCWlmIChtc2dfdHlwID09IERVUExJQ0FURV9NU0cpIHsKKwkJaWYgKGxlc3MobXNnX3NlcW5vKG1zZyksIG1vZChkZXN0X2xpbmstPm5leHRfaW5fbm8pKSkgeworCQkJbXNnX2RiZyh0dW5uZWxfbXNnLCAiRFJPUC88UkVDPCIpOworCQkJZ290byBleGl0OworCQl9CisJCSpidWYgPSBidWZfZXh0cmFjdCh0dW5uZWxfYnVmLElOVF9IX1NJWkUpOworCQlpZiAoKmJ1ZiA9PSBOVUxMKSB7CisJCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgZmFpbGVkIHRvIGV4dHJhY3QgbXNnXG4iKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQltc2dfZGJnKHR1bm5lbF9tc2csICJUTkw8UkVDPCIpOworCQlidWZfZGlzY2FyZCh0dW5uZWxfYnVmKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogRmlyc3Qgb3JpZ2luYWwgbWVzc2FnZSA/OiAqLworCisJaWYgKHRpcGNfbGlua19pc191cChkZXN0X2xpbmspKSB7CisJCW1zZ19kYmcodHVubmVsX21zZywgIlVQL0ZJUlNULzxSRUM8Iik7CisJCXRpcGNfbGlua19yZXNldChkZXN0X2xpbmspOworCQlkZXN0X2xpbmstPmV4cF9tc2dfY291bnQgPSBtc2dfY291bnQ7CisJCWlmICghbXNnX2NvdW50KQorCQkJZ290byBleGl0OworCX0gZWxzZSBpZiAoZGVzdF9saW5rLT5leHBfbXNnX2NvdW50ID09IFNUQVJUX0NIQU5HRU9WRVIpIHsKKwkJbXNnX2RiZyh0dW5uZWxfbXNnLCAiQkxLL0ZJUlNULzxSRUM8Iik7CisJCWRlc3RfbGluay0+ZXhwX21zZ19jb3VudCA9IG1zZ19jb3VudDsKKwkJaWYgKCFtc2dfY291bnQpCisJCQlnb3RvIGV4aXQ7CisJfQorCisJLyogUmVjZWl2ZSBvcmlnaW5hbCBtZXNzYWdlICovCisKKwlpZiAoZGVzdF9saW5rLT5leHBfbXNnX2NvdW50ID09IDApIHsKKwkJbXNnX2RiZyh0dW5uZWxfbXNnLCAiT1ZFUkRVRS9EUk9QLzxSRUM8Iik7CisJCWRiZ19wcmludF9saW5rKGRlc3RfbGluaywgIkxJTks6Iik7CisJCWdvdG8gZXhpdDsKKwl9CisJZGVzdF9saW5rLT5leHBfbXNnX2NvdW50LS07CisJaWYgKGxlc3MobXNnX3NlcW5vKG1zZyksIGRlc3RfbGluay0+cmVzZXRfY2hlY2twb2ludCkpIHsKKwkJbXNnX2RiZyh0dW5uZWxfbXNnLCAiRFJPUC9EVVBMLzxSRUM8Iik7CisJCWdvdG8gZXhpdDsKKwl9IGVsc2UgeworCQkqYnVmID0gYnVmX2V4dHJhY3QodHVubmVsX2J1ZiwgSU5UX0hfU0laRSk7CisJCWlmICgqYnVmICE9IE5VTEwpIHsKKwkJCW1zZ19kYmcodHVubmVsX21zZywgIlROTDxSRUM8Iik7CisJCQlidWZfZGlzY2FyZCh0dW5uZWxfYnVmKTsKKwkJCXJldHVybiAxOworCQl9IGVsc2UgeworCQkJd2FybigiTWVtb3J5IHNxdWVlemU7IGRyb3BwZWQgaW5jb21pbmcgbXNnXG4iKTsKKwkJfQorCX0KK2V4aXQ6CisJKmJ1ZiA9IDA7CisJYnVmX2Rpc2NhcmQodHVubmVsX2J1Zik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgQnVuZGxlciBmdW5jdGlvbmFsaXR5OgorICovCit2b2lkIHRpcGNfbGlua19yZWN2X2J1bmRsZShzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXUzMiBtc2djb3VudCA9IG1zZ19tc2djbnQoYnVmX21zZyhidWYpKTsKKwl1MzIgcG9zID0gSU5UX0hfU0laRTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqb2J1ZjsKKworCW1zZ19kYmcoYnVmX21zZyhidWYpLCAiPEJOREw8OiAiKTsKKwl3aGlsZSAobXNnY291bnQtLSkgeworCQlvYnVmID0gYnVmX2V4dHJhY3QoYnVmLCBwb3MpOworCQlpZiAob2J1ZiA9PSBOVUxMKSB7CisJCQljaGFyIGFkZHJfc3RyaW5nWzE2XTsKKworCQkJd2FybigiQnVmZmVyIGFsbG9jYXRpb24gZmFpbHVyZTtcbiIpOworCQkJd2FybigiICBpbmNvbWluZyBtZXNzYWdlKHMpIGZyb20gJXMgbG9zdFxuIiwKKwkJCSAgICAgYWRkcl9zdHJpbmdfZmlsbChhZGRyX3N0cmluZywgCisJCQkJCSAgICAgIG1zZ19vcmlnbm9kZShidWZfbXNnKGJ1ZikpKSk7CisJCQlyZXR1cm47CisJCX07CisJCXBvcyArPSBhbGlnbihtc2dfc2l6ZShidWZfbXNnKG9idWYpKSk7CisJCW1zZ19kYmcoYnVmX21zZyhvYnVmKSwgIiAgICAgLyIpOworCQl0aXBjX25ldF9yb3V0ZV9tc2cob2J1Zik7CisJfQorCWJ1Zl9kaXNjYXJkKGJ1Zik7Cit9CisKKy8qCisgKiAgRnJhZ21lbnRhdGlvbi9kZWZyYWdtZW50YXRpb246CisgKi8KKworCisvKiAKKyAqIHRpcGNfbGlua19zZW5kX2xvbmdfYnVmOiBFbnRyeSBmb3IgYnVmZmVycyBuZWVkaW5nIGZyYWdtZW50YXRpb24uCisgKiBUaGUgYnVmZmVyIGlzIGNvbXBsZXRlLCBpbmNsdXNpdmUgdG90YWwgbWVzc2FnZSBsZW5ndGguIAorICogUmV0dXJucyB1c2VyIGRhdGEgbGVuZ3RoLgorICovCitpbnQgdGlwY19saW5rX3NlbmRfbG9uZ19idWYoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXN0cnVjdCB0aXBjX21zZyAqaW5tc2cgPSBidWZfbXNnKGJ1Zik7CisJc3RydWN0IHRpcGNfbXNnIGZyYWdtX2hkcjsKKwl1MzIgaW5zaXplID0gbXNnX3NpemUoaW5tc2cpOworCXUzMiBkc3ogPSBtc2dfZGF0YV9zeihpbm1zZyk7CisJdW5jaGFyICpjcnMgPSBidWYtPmRhdGE7CisJdTMyIHJlc3QgPSBpbnNpemU7CisJdTMyIHBhY2tfc3ogPSBsaW5rX21heF9wa3QobF9wdHIpOworCXUzMiBmcmFnbV9zeiA9IHBhY2tfc3ogLSBJTlRfSF9TSVpFOworCXUzMiBmcmFnbV9ubyA9IDE7CisJdTMyIGRlc3RhZGRyID0gbXNnX2Rlc3Rub2RlKGlubXNnKTsKKworCWlmIChtc2dfc2hvcnQoaW5tc2cpKQorCQlkZXN0YWRkciA9IGxfcHRyLT5hZGRyOworCisJaWYgKG1zZ19yb3V0ZWQoaW5tc2cpKQorCQltc2dfc2V0X3ByZXZub2RlKGlubXNnLCB0aXBjX293bl9hZGRyKTsKKworCS8qIFByZXBhcmUgcmV1c2FibGUgZnJhZ21lbnQgaGVhZGVyOiAqLworCisJbXNnX2luaXQoJmZyYWdtX2hkciwgTVNHX0ZSQUdNRU5URVIsIEZJUlNUX0ZSQUdNRU5ULAorCQkgVElQQ19PSywgSU5UX0hfU0laRSwgZGVzdGFkZHIpOworCW1zZ19zZXRfbGlua19zZWxlY3RvcigmZnJhZ21faGRyLCBtc2dfbGlua19zZWxlY3Rvcihpbm1zZykpOworCW1zZ19zZXRfbG9uZ19tc2dubygmZnJhZ21faGRyLCBtb2QobF9wdHItPmxvbmdfbXNnX3NlcV9ubysrKSk7CisJbXNnX3NldF9mcmFnbV9ubygmZnJhZ21faGRyLCBmcmFnbV9ubyk7CisJbF9wdHItPnN0YXRzLnNlbnRfZnJhZ21lbnRlZCsrOworCisJLyogQ2hvcCB1cCBtZXNzYWdlOiAqLworCisJd2hpbGUgKHJlc3QgPiAwKSB7CisJCXN0cnVjdCBza19idWZmICpmcmFnbTsKKworCQlpZiAocmVzdCA8PSBmcmFnbV9zeikgeworCQkJZnJhZ21fc3ogPSByZXN0OworCQkJbXNnX3NldF90eXBlKCZmcmFnbV9oZHIsIExBU1RfRlJBR01FTlQpOworCQl9CisJCWZyYWdtID0gYnVmX2FjcXVpcmUoZnJhZ21fc3ogKyBJTlRfSF9TSVpFKTsKKwkJaWYgKGZyYWdtID09IE5VTEwpIHsKKwkJCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBmYWlsZWQgdG8gZnJhZ21lbnQgbXNnXG4iKTsKKwkJCWRzeiA9IC1FTk9NRU07CisJCQlnb3RvIGV4aXQ7CisJCX0KKwkJbXNnX3NldF9zaXplKCZmcmFnbV9oZHIsIGZyYWdtX3N6ICsgSU5UX0hfU0laRSk7CisJCW1lbWNweShmcmFnbS0+ZGF0YSwgKHVuY2hhciAqKSZmcmFnbV9oZHIsIElOVF9IX1NJWkUpOworCQltZW1jcHkoZnJhZ20tPmRhdGEgKyBJTlRfSF9TSVpFLCBjcnMsIGZyYWdtX3N6KTsKKworCQkvKiAgU2VuZCBxdWV1ZWQgbWVzc2FnZXMgZmlyc3QsIGlmIGFueTogKi8KKworCQlsX3B0ci0+c3RhdHMuc2VudF9mcmFnbWVudHMrKzsKKwkJdGlwY19saW5rX3NlbmRfYnVmKGxfcHRyLCBmcmFnbSk7CisJCWlmICghdGlwY19saW5rX2lzX3VwKGxfcHRyKSkKKwkJCXJldHVybiBkc3o7CisJCW1zZ19zZXRfZnJhZ21fbm8oJmZyYWdtX2hkciwgKytmcmFnbV9ubyk7CisJCXJlc3QgLT0gZnJhZ21fc3o7CisJCWNycyArPSBmcmFnbV9zejsKKwkJbXNnX3NldF90eXBlKCZmcmFnbV9oZHIsIEZSQUdNRU5UKTsKKwl9CitleGl0OgorCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJcmV0dXJuIGRzejsKK30KKworLyogCisgKiBBIHBlbmRpbmcgbWVzc2FnZSBiZWluZyByZS1hc3NlbWJsZWQgbXVzdCBzdG9yZSBjZXJ0YWluIHZhbHVlcyAKKyAqIHRvIGhhbmRsZSBzdWJzZXF1ZW50IGZyYWdtZW50cyBjb3JyZWN0bHkuIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIAorICogaGVscCBzdG9yaW5nIHRoZXNlIHZhbHVlcyBpbiB1bnVzZWQsIGF2YWlsYWJsZSBmaWVsZHMgaW4gdGhlCisgKiBwZW5kaW5nIG1lc3NhZ2UuIFRoaXMgbWFrZXMgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiB1bmVjZXNzYXJ5LgorICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIGdldF9sb25nX21zZ19zZXFubyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXJldHVybiBtc2dfc2Vxbm8oYnVmX21zZyhidWYpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9sb25nX21zZ19zZXFubyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCB1MzIgc2Vxbm8pCit7CisJbXNnX3NldF9zZXFubyhidWZfbXNnKGJ1ZiksIHNlcW5vKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgZ2V0X2ZyYWdtX3NpemUoc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlyZXR1cm4gbXNnX2FjayhidWZfbXNnKGJ1ZikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2ZyYWdtX3NpemUoc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgdTMyIHN6KQoreworCW1zZ19zZXRfYWNrKGJ1Zl9tc2coYnVmKSwgc3opOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBnZXRfZXhwZWN0ZWRfZnJhZ3Moc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlyZXR1cm4gbXNnX2JjYXN0X2FjayhidWZfbXNnKGJ1ZikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2V4cGVjdGVkX2ZyYWdzKHN0cnVjdCBza19idWZmICpidWYsIHUzMiBleHApCit7CisJbXNnX3NldF9iY2FzdF9hY2soYnVmX21zZyhidWYpLCBleHApOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBnZXRfdGltZXJfY250KHN0cnVjdCBza19idWZmICpidWYpCit7CisJcmV0dXJuIG1zZ19yZXJvdXRlX2NudChidWZfbXNnKGJ1ZikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5jcl90aW1lcl9jbnQoc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwltc2dfaW5jcl9yZXJvdXRlX2NudChidWZfbXNnKGJ1ZikpOworfQorCisvKiAKKyAqIHRpcGNfbGlua19yZWN2X2ZyYWdtZW50KCk6IENhbGxlZCB3aXRoIG5vZGUgbG9jayBvbi4gUmV0dXJucyAKKyAqIHRoZSByZWFzc2VtYmxlZCBidWZmZXIgaWYgbWVzc2FnZSBpcyBjb21wbGV0ZS4KKyAqLworaW50IHRpcGNfbGlua19yZWN2X2ZyYWdtZW50KHN0cnVjdCBza19idWZmICoqcGVuZGluZywgc3RydWN0IHNrX2J1ZmYgKipmYiwgCisJCQkgICAgc3RydWN0IHRpcGNfbXNnICoqbSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcHJldiA9IDA7CisJc3RydWN0IHNrX2J1ZmYgKmZidWYgPSAqZmI7CisJc3RydWN0IHRpcGNfbXNnICpmcmFnbSA9IGJ1Zl9tc2coZmJ1Zik7CisJc3RydWN0IHNrX2J1ZmYgKnBidWYgPSAqcGVuZGluZzsKKwl1MzIgbG9uZ19tc2dfc2VxX25vID0gbXNnX2xvbmdfbXNnbm8oZnJhZ20pOworCisJKmZiID0gMDsKKwltc2dfZGJnKGZyYWdtLCJGUkc8UkVDPCIpOworCisJLyogSXMgdGhlcmUgYW4gaW5jb21wbGV0ZSBtZXNzYWdlIHdhaXRpbmcgZm9yIHRoaXMgZnJhZ21lbnQ/ICovCisKKwl3aGlsZSAocGJ1ZiAmJiAoKG1zZ19zZXFubyhidWZfbXNnKHBidWYpKSAhPSBsb25nX21zZ19zZXFfbm8pCisJCQl8fCAobXNnX29yaWdub2RlKGZyYWdtKSAhPSBtc2dfb3JpZ25vZGUoYnVmX21zZyhwYnVmKSkpKSkgeworCQlwcmV2ID0gcGJ1ZjsKKwkJcGJ1ZiA9IHBidWYtPm5leHQ7CisJfQorCisJaWYgKCFwYnVmICYmIChtc2dfdHlwZShmcmFnbSkgPT0gRklSU1RfRlJBR01FTlQpKSB7CisJCXN0cnVjdCB0aXBjX21zZyAqaW1zZyA9IChzdHJ1Y3QgdGlwY19tc2cgKiltc2dfZGF0YShmcmFnbSk7CisJCXUzMiBtc2dfc3ogPSBtc2dfc2l6ZShpbXNnKTsKKwkJdTMyIGZyYWdtX3N6ID0gbXNnX2RhdGFfc3ooZnJhZ20pOworCQl1MzIgZXhwX2ZyYWdtX2NudCA9IG1zZ19zei9mcmFnbV9zeiArICEhKG1zZ19zeiAlIGZyYWdtX3N6KTsKKwkJdTMyIG1heCA9ICBUSVBDX01BWF9VU0VSX01TR19TSVpFICsgTE9OR19IX1NJWkU7CisJCWlmIChtc2dfdHlwZShpbXNnKSA9PSBUSVBDX01DQVNUX01TRykKKwkJCW1heCA9IFRJUENfTUFYX1VTRVJfTVNHX1NJWkUgKyBNQ0FTVF9IX1NJWkU7CisJCWlmIChtc2dfc2l6ZShpbXNnKSA+IG1heCkgeworCQkJbXNnX2RiZyhmcmFnbSwiPFJFQzxPdmVyc2l6ZWQ6ICIpOworCQkJYnVmX2Rpc2NhcmQoZmJ1Zik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwYnVmID0gYnVmX2FjcXVpcmUobXNnX3NpemUoaW1zZykpOworCQlpZiAocGJ1ZiAhPSBOVUxMKSB7CisJCQlwYnVmLT5uZXh0ID0gKnBlbmRpbmc7CisJCQkqcGVuZGluZyA9IHBidWY7CisJCQltZW1jcHkocGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKWltc2csIG1zZ19kYXRhX3N6KGZyYWdtKSk7CisKKwkJCS8qICBQcmVwYXJlIGJ1ZmZlciBmb3Igc3Vic2VxdWVudCBmcmFnbWVudHMuICovCisKKwkJCXNldF9sb25nX21zZ19zZXFubyhwYnVmLCBsb25nX21zZ19zZXFfbm8pOyAKKwkJCXNldF9mcmFnbV9zaXplKHBidWYsZnJhZ21fc3opOyAKKwkJCXNldF9leHBlY3RlZF9mcmFncyhwYnVmLGV4cF9mcmFnbV9jbnQgLSAxKTsgCisJCX0gZWxzZSB7CisJCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgZ290IG5vIGRlZnJhZ21lbnRpbmcgYnVmZmVyXG4iKTsKKwkJfQorCQlidWZfZGlzY2FyZChmYnVmKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChwYnVmICYmIChtc2dfdHlwZShmcmFnbSkgIT0gRklSU1RfRlJBR01FTlQpKSB7CisJCXUzMiBkc3ogPSBtc2dfZGF0YV9zeihmcmFnbSk7CisJCXUzMiBmc3ogPSBnZXRfZnJhZ21fc2l6ZShwYnVmKTsKKwkJdTMyIGNycyA9ICgobXNnX2ZyYWdtX25vKGZyYWdtKSAtIDEpICogZnN6KTsKKwkJdTMyIGV4cF9mcmFncyA9IGdldF9leHBlY3RlZF9mcmFncyhwYnVmKSAtIDE7CisJCW1lbWNweShwYnVmLT5kYXRhICsgY3JzLCBtc2dfZGF0YShmcmFnbSksIGRzeik7CisJCWJ1Zl9kaXNjYXJkKGZidWYpOworCisJCS8qIElzIG1lc3NhZ2UgY29tcGxldGU/ICovCisKKwkJaWYgKGV4cF9mcmFncyA9PSAwKSB7CisJCQlpZiAocHJldikKKwkJCQlwcmV2LT5uZXh0ID0gcGJ1Zi0+bmV4dDsKKwkJCWVsc2UKKwkJCQkqcGVuZGluZyA9IHBidWYtPm5leHQ7CisJCQltc2dfcmVzZXRfcmVyb3V0ZV9jbnQoYnVmX21zZyhwYnVmKSk7CisJCQkqZmIgPSBwYnVmOworCQkJKm0gPSBidWZfbXNnKHBidWYpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJc2V0X2V4cGVjdGVkX2ZyYWdzKHBidWYsZXhwX2ZyYWdzKTsgICAgIAorCQlyZXR1cm4gMDsKKwl9CisJZGJnKCIgRGlzY2FyZGluZyBvcnBoYW4gZnJhZ21lbnQgJXhcbiIsZmJ1Zik7CisJbXNnX2RiZyhmcmFnbSwiT1JQSEFOOiIpOworCWRiZygiUGVuZGluZyBsb25nIGJ1ZmZlcnM6XG4iKTsKKwlkYmdfcHJpbnRfYnVmX2NoYWluKCpwZW5kaW5nKTsKKwlidWZfZGlzY2FyZChmYnVmKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBsaW5rX2NoZWNrX2RlZnJhZ21fYnVmcyAtIGZsdXNoIHN0YWxlIGluY29taW5nIG1lc3NhZ2UgZnJhZ21lbnRzCisgKiBAbF9wdHI6IHBvaW50ZXIgdG8gbGluaworICovCisKK3N0YXRpYyB2b2lkIGxpbmtfY2hlY2tfZGVmcmFnbV9idWZzKHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcHJldiA9IDA7CisJc3RydWN0IHNrX2J1ZmYgKm5leHQgPSAwOworCXN0cnVjdCBza19idWZmICpidWYgPSBsX3B0ci0+ZGVmcmFnbV9idWY7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCWlmICghbGlua193b3JraW5nX3dvcmtpbmcobF9wdHIpKQorCQlyZXR1cm47CisJd2hpbGUgKGJ1ZikgeworCQl1MzIgY250ID0gZ2V0X3RpbWVyX2NudChidWYpOworCisJCW5leHQgPSBidWYtPm5leHQ7CisJCWlmIChjbnQgPCA0KSB7CisJCQlpbmNyX3RpbWVyX2NudChidWYpOworCQkJcHJldiA9IGJ1ZjsKKwkJfSBlbHNlIHsKKwkJCWRiZygiIERpc2NhcmRpbmcgaW5jb21wbGV0ZSBsb25nIGJ1ZmZlclxuIik7CisJCQltc2dfZGJnKGJ1Zl9tc2coYnVmKSwgIkxPTkc6Iik7CisJCQlkYmdfcHJpbnRfbGluayhsX3B0ciwgImN1cnI6Iik7CisJCQlkYmcoIlBlbmRpbmcgbG9uZyBidWZmZXJzOlxuIik7CisJCQlkYmdfcHJpbnRfYnVmX2NoYWluKGxfcHRyLT5kZWZyYWdtX2J1Zik7CisJCQlpZiAocHJldikKKwkJCQlwcmV2LT5uZXh0ID0gYnVmLT5uZXh0OworCQkJZWxzZQorCQkJCWxfcHRyLT5kZWZyYWdtX2J1ZiA9IGJ1Zi0+bmV4dDsKKwkJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCX0KKwkJYnVmID0gbmV4dDsKKwl9Cit9CisKKworCitzdGF0aWMgdm9pZCBsaW5rX3NldF9zdXBlcnZpc2lvbl9wcm9wcyhzdHJ1Y3QgbGluayAqbF9wdHIsIHUzMiB0b2xlcmFuY2UpCit7CisJbF9wdHItPnRvbGVyYW5jZSA9IHRvbGVyYW5jZTsKKwlsX3B0ci0+Y29udGludWl0eV9pbnRlcnZhbCA9CisJCSgodG9sZXJhbmNlIC8gNCkgPiA1MDApID8gNTAwIDogdG9sZXJhbmNlIC8gNDsKKwlsX3B0ci0+YWJvcnRfbGltaXQgPSB0b2xlcmFuY2UgLyAobF9wdHItPmNvbnRpbnVpdHlfaW50ZXJ2YWwgLyA0KTsKK30KKworCit2b2lkIHRpcGNfbGlua19zZXRfcXVldWVfbGltaXRzKHN0cnVjdCBsaW5rICpsX3B0ciwgdTMyIHdpbmRvdykKK3sKKwkvKiBEYXRhIG1lc3NhZ2VzIGZyb20gdGhpcyBub2RlLCBpbmNsdXNpdmUgRklSU1RfRlJBR00gKi8KKwlsX3B0ci0+cXVldWVfbGltaXRbREFUQV9MT1ddID0gd2luZG93OworCWxfcHRyLT5xdWV1ZV9saW1pdFtEQVRBX01FRElVTV0gPSAod2luZG93IC8gMykgKiA0OworCWxfcHRyLT5xdWV1ZV9saW1pdFtEQVRBX0hJR0hdID0gKHdpbmRvdyAvIDMpICogNTsKKwlsX3B0ci0+cXVldWVfbGltaXRbREFUQV9DUklUSUNBTF0gPSAod2luZG93IC8gMykgKiA2OworCS8qIFRyYW5zaXRpbmcgZGF0YSBtZXNzYWdlcyxpbmNsdXNpdmUgRklSU1RfRlJBR00gKi8KKwlsX3B0ci0+cXVldWVfbGltaXRbREFUQV9MT1cgKyA0XSA9IDMwMDsKKwlsX3B0ci0+cXVldWVfbGltaXRbREFUQV9NRURJVU0gKyA0XSA9IDYwMDsKKwlsX3B0ci0+cXVldWVfbGltaXRbREFUQV9ISUdIICsgNF0gPSA5MDA7CisJbF9wdHItPnF1ZXVlX2xpbWl0W0RBVEFfQ1JJVElDQUwgKyA0XSA9IDEyMDA7CisJbF9wdHItPnF1ZXVlX2xpbWl0W0NPTk5fTUFOQUdFUl0gPSAxMjAwOworCWxfcHRyLT5xdWV1ZV9saW1pdFtST1VURV9ESVNUUklCVVRPUl0gPSAxMjAwOworCWxfcHRyLT5xdWV1ZV9saW1pdFtDSEFOR0VPVkVSX1BST1RPQ09MXSA9IDI1MDA7CisJbF9wdHItPnF1ZXVlX2xpbWl0W05BTUVfRElTVFJJQlVUT1JdID0gMzAwMDsKKwkvKiBGUkFHTUVOVCBhbmQgTEFTVF9GUkFHTUVOVCBwYWNrZXRzICovCisJbF9wdHItPnF1ZXVlX2xpbWl0W01TR19GUkFHTUVOVEVSXSA9IDQwMDA7Cit9CisKKy8qKgorICogbGlua19maW5kX2xpbmsgLSBsb2NhdGUgbGluayBieSBuYW1lCisgKiBAbmFtZSAtIHB0ciB0byBsaW5rIG5hbWUgc3RyaW5nCisgKiBAbm9kZSAtIHB0ciB0byBhcmVhIHRvIGJlIGZpbGxlZCB3aXRoIHB0ciB0byBhc3NvY2lhdGVkIG5vZGUKKyAqIAorICogQ2FsbGVyIG11c3QgaG9sZCAndGlwY19uZXRfbG9jaycgdG8gZW5zdXJlIG5vZGUgYW5kIGJlYXJlciBhcmUgbm90IGRlbGV0ZWQ7CisgKiB0aGlzIGFsc28gcHJldmVudHMgbGluayBkZWxldGlvbi4KKyAqIAorICogUmV0dXJucyBwb2ludGVyIHRvIGxpbmsgKG9yIDAgaWYgaW52YWxpZCBsaW5rIG5hbWUpLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgbGluayAqbGlua19maW5kX2xpbmsoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG5vZGUgKipub2RlKQoreworCXN0cnVjdCBsaW5rX25hbWUgbGlua19uYW1lX3BhcnRzOworCXN0cnVjdCBiZWFyZXIgKmJfcHRyOworCXN0cnVjdCBsaW5rICpsX3B0cjsgCisKKwlpZiAoIWxpbmtfbmFtZV92YWxpZGF0ZShuYW1lLCAmbGlua19uYW1lX3BhcnRzKSkKKwkJcmV0dXJuIDA7CisKKwliX3B0ciA9IHRpcGNfYmVhcmVyX2ZpbmRfaW50ZXJmYWNlKGxpbmtfbmFtZV9wYXJ0cy5pZl9sb2NhbCk7CisJaWYgKCFiX3B0cikKKwkJcmV0dXJuIDA7CisKKwkqbm9kZSA9IHRpcGNfbm9kZV9maW5kKGxpbmtfbmFtZV9wYXJ0cy5hZGRyX3BlZXIpOyAKKwlpZiAoISpub2RlKQorCQlyZXR1cm4gMDsKKworCWxfcHRyID0gKCpub2RlKS0+bGlua3NbYl9wdHItPmlkZW50aXR5XTsKKwlpZiAoIWxfcHRyIHx8IHN0cmNtcChsX3B0ci0+bmFtZSwgbmFtZSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIGxfcHRyOworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqdGlwY19saW5rX2NtZF9jb25maWcoY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLCBpbnQgcmVxX3Rsdl9zcGFjZSwgCisJCQkJICAgICB1MTYgY21kKQoreworCXN0cnVjdCB0aXBjX2xpbmtfY29uZmlnICphcmdzOworICAgICAgICB1MzIgbmV3X3ZhbHVlOworCXN0cnVjdCBsaW5rICpsX3B0cjsKKwlzdHJ1Y3Qgbm9kZSAqbm9kZTsKKyAgICAgICAgaW50IHJlczsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfTElOS19DT05GSUcpKQorCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisKKwlhcmdzID0gKHN0cnVjdCB0aXBjX2xpbmtfY29uZmlnICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKKwluZXdfdmFsdWUgPSBudG9obChhcmdzLT52YWx1ZSk7CisKKwlpZiAoIXN0cmNtcChhcmdzLT5uYW1lLCB0aXBjX2JjbGlua19uYW1lKSkgeworCQlpZiAoKGNtZCA9PSBUSVBDX0NNRF9TRVRfTElOS19XSU5ET1cpICYmCisJCSAgICAodGlwY19iY2xpbmtfc2V0X3F1ZXVlX2xpbWl0cyhuZXdfdmFsdWUpID09IDApKQorCQkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKKwkgICAgICAgCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfTk9UX1NVUFBPUlRFRAorCQkJCQkJICAgIiAoY2Fubm90IGNoYW5nZSBzZXR0aW5nIG9uIGJyb2FkY2FzdCBsaW5rKSIpOworCX0KKworCXJlYWRfbG9ja19iaCgmdGlwY19uZXRfbG9jayk7CisJbF9wdHIgPSBsaW5rX2ZpbmRfbGluayhhcmdzLT5uYW1lLCAmbm9kZSk7IAorCWlmICghbF9wdHIpIHsKKwkJcmVhZF91bmxvY2tfYmgoJnRpcGNfbmV0X2xvY2spOworCSAgICAgICAJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZygibGluayBub3QgZm91bmQiKTsKKwl9CisKKwl0aXBjX25vZGVfbG9jayhub2RlKTsKKwlyZXMgPSAtRUlOVkFMOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUSVBDX0NNRF9TRVRfTElOS19UT0w6IAorCQlpZiAoKG5ld192YWx1ZSA+PSBUSVBDX01JTl9MSU5LX1RPTCkgJiYgCisJCSAgICAobmV3X3ZhbHVlIDw9IFRJUENfTUFYX0xJTktfVE9MKSkgeworCQkJbGlua19zZXRfc3VwZXJ2aXNpb25fcHJvcHMobF9wdHIsIG5ld192YWx1ZSk7CisJCQl0aXBjX2xpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIFNUQVRFX01TRywgCisJCQkJCQkgMCwgMCwgbmV3X3ZhbHVlLCAwLCAwKTsKKwkJCXJlcyA9IFRJUENfT0s7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9TRVRfTElOS19QUkk6IAorCQlpZiAoKG5ld192YWx1ZSA+PSBUSVBDX01JTl9MSU5LX1BSSSkgJiYKKwkJICAgIChuZXdfdmFsdWUgPD0gVElQQ19NQVhfTElOS19QUkkpKSB7CisJCQlsX3B0ci0+cHJpb3JpdHkgPSBuZXdfdmFsdWU7CisJCQl0aXBjX2xpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIFNUQVRFX01TRywgCisJCQkJCQkgMCwgMCwgMCwgbmV3X3ZhbHVlLCAwKTsKKwkJCXJlcyA9IFRJUENfT0s7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NNRF9TRVRfTElOS19XSU5ET1c6IAorCQlpZiAoKG5ld192YWx1ZSA+PSBUSVBDX01JTl9MSU5LX1dJTikgJiYgCisJCSAgICAobmV3X3ZhbHVlIDw9IFRJUENfTUFYX0xJTktfV0lOKSkgeworCQkJdGlwY19saW5rX3NldF9xdWV1ZV9saW1pdHMobF9wdHIsIG5ld192YWx1ZSk7CisJCQlyZXMgPSBUSVBDX09LOworCQl9CisJCWJyZWFrOworCX0KKwl0aXBjX25vZGVfdW5sb2NrKG5vZGUpOworCisJcmVhZF91bmxvY2tfYmgoJnRpcGNfbmV0X2xvY2spOworCWlmIChyZXMpCisJICAgICAgIAlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKCJjYW5ub3QgY2hhbmdlIGxpbmsgc2V0dGluZyIpOworCisJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKK30KKworLyoqCisgKiBsaW5rX3Jlc2V0X3N0YXRpc3RpY3MgLSByZXNldCBsaW5rIHN0YXRpc3RpY3MKKyAqIEBsX3B0cjogcG9pbnRlciB0byBsaW5rCisgKi8KKworc3RhdGljIHZvaWQgbGlua19yZXNldF9zdGF0aXN0aWNzKHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwltZW1zZXQoJmxfcHRyLT5zdGF0cywgMCwgc2l6ZW9mKGxfcHRyLT5zdGF0cykpOworCWxfcHRyLT5zdGF0cy5zZW50X2luZm8gPSBsX3B0ci0+bmV4dF9vdXRfbm87CisJbF9wdHItPnN0YXRzLnJlY3ZfaW5mbyA9IGxfcHRyLT5uZXh0X2luX25vOworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqdGlwY19saW5rX2NtZF9yZXNldF9zdGF0cyhjb25zdCB2b2lkICpyZXFfdGx2X2FyZWEsIGludCByZXFfdGx2X3NwYWNlKQoreworCWNoYXIgKmxpbmtfbmFtZTsKKwlzdHJ1Y3QgbGluayAqbF9wdHI7IAorCXN0cnVjdCBub2RlICpub2RlOworCisJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9MSU5LX05BTUUpKQorCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisKKwlsaW5rX25hbWUgPSAoY2hhciAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJaWYgKCFzdHJjbXAobGlua19uYW1lLCB0aXBjX2JjbGlua19uYW1lKSkgeworCQlpZiAodGlwY19iY2xpbmtfcmVzZXRfc3RhdHMoKSkKKwkJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoImxpbmsgbm90IGZvdW5kIik7CisJCXJldHVybiB0aXBjX2NmZ19yZXBseV9ub25lKCk7CisJfQorCisJcmVhZF9sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKKwlsX3B0ciA9IGxpbmtfZmluZF9saW5rKGxpbmtfbmFtZSwgJm5vZGUpOyAKKwlpZiAoIWxfcHRyKSB7CisJCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKKwkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZygibGluayBub3QgZm91bmQiKTsKKwl9CisKKwl0aXBjX25vZGVfbG9jayhub2RlKTsKKwlsaW5rX3Jlc2V0X3N0YXRpc3RpY3MobF9wdHIpOworCXRpcGNfbm9kZV91bmxvY2sobm9kZSk7CisJcmVhZF91bmxvY2tfYmgoJnRpcGNfbmV0X2xvY2spOworCXJldHVybiB0aXBjX2NmZ19yZXBseV9ub25lKCk7Cit9CisKKy8qKgorICogcGVyY2VudCAtIGNvbnZlcnQgY291bnQgdG8gYSBwZXJjZW50YWdlIG9mIHRvdGFsIChyb3VuZGluZyB1cCBvciBkb3duKQorICovCisKK3N0YXRpYyB1MzIgcGVyY2VudCh1MzIgY291bnQsIHUzMiB0b3RhbCkKK3sKKwlyZXR1cm4gKGNvdW50ICogMTAwICsgKHRvdGFsIC8gMikpIC8gdG90YWw7Cit9CisKKy8qKgorICogdGlwY19saW5rX3N0YXRzIC0gcHJpbnQgbGluayBzdGF0aXN0aWNzCisgKiBAbmFtZTogbGluayBuYW1lCisgKiBAYnVmOiBwcmludCBidWZmZXIgYXJlYQorICogQGJ1Zl9zaXplOiBzaXplIG9mIHByaW50IGJ1ZmZlciBhcmVhCisgKiAKKyAqIFJldHVybnMgbGVuZ3RoIG9mIHByaW50IGJ1ZmZlciBkYXRhIHN0cmluZyAob3IgMCBpZiBlcnJvcikKKyAqLworCitzdGF0aWMgaW50IHRpcGNfbGlua19zdGF0cyhjb25zdCBjaGFyICpuYW1lLCBjaGFyICpidWYsIGNvbnN0IHUzMiBidWZfc2l6ZSkKK3sKKwlzdHJ1Y3QgcHJpbnRfYnVmIHBiOworCXN0cnVjdCBsaW5rICpsX3B0cjsgCisJc3RydWN0IG5vZGUgKm5vZGU7CisJY2hhciAqc3RhdHVzOworCXUzMiBwcm9maWxlX3RvdGFsID0gMDsKKworCWlmICghc3RyY21wKG5hbWUsIHRpcGNfYmNsaW5rX25hbWUpKQorCQlyZXR1cm4gdGlwY19iY2xpbmtfc3RhdHMoYnVmLCBidWZfc2l6ZSk7CisKKwl0aXBjX3ByaW50YnVmX2luaXQoJnBiLCBidWYsIGJ1Zl9zaXplKTsKKworCXJlYWRfbG9ja19iaCgmdGlwY19uZXRfbG9jayk7CisJbF9wdHIgPSBsaW5rX2ZpbmRfbGluayhuYW1lLCAmbm9kZSk7IAorCWlmICghbF9wdHIpIHsKKwkJcmVhZF91bmxvY2tfYmgoJnRpcGNfbmV0X2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisJdGlwY19ub2RlX2xvY2sobm9kZSk7CisKKwlpZiAodGlwY19saW5rX2lzX2FjdGl2ZShsX3B0cikpCisJCXN0YXR1cyA9ICJBQ1RJVkUiOworCWVsc2UgaWYgKHRpcGNfbGlua19pc191cChsX3B0cikpCisJCXN0YXR1cyA9ICJTVEFOREJZIjsKKwllbHNlCisJCXN0YXR1cyA9ICJERUZVTkNUIjsKKwl0aXBjX3ByaW50ZigmcGIsICJMaW5rIDwlcz5cbiIKKwkJICAgICAgICAgIiAgJXMgIE1UVToldSAgUHJpb3JpdHk6JXUgIFRvbGVyYW5jZToldSBtcyIKKwkJICAgICAgICAgIiAgV2luZG93OiV1IHBhY2tldHNcbiIsIAorCQkgICAgbF9wdHItPm5hbWUsIHN0YXR1cywgbGlua19tYXhfcGt0KGxfcHRyKSwgCisJCSAgICBsX3B0ci0+cHJpb3JpdHksIGxfcHRyLT50b2xlcmFuY2UsIGxfcHRyLT5xdWV1ZV9saW1pdFswXSk7CisJdGlwY19wcmludGYoJnBiLCAiICBSWCBwYWNrZXRzOiV1IGZyYWdtZW50czoldS8ldSBidW5kbGVzOiV1LyV1XG4iLCAKKwkJICAgIGxfcHRyLT5uZXh0X2luX25vIC0gbF9wdHItPnN0YXRzLnJlY3ZfaW5mbywKKwkJICAgIGxfcHRyLT5zdGF0cy5yZWN2X2ZyYWdtZW50cywKKwkJICAgIGxfcHRyLT5zdGF0cy5yZWN2X2ZyYWdtZW50ZWQsCisJCSAgICBsX3B0ci0+c3RhdHMucmVjdl9idW5kbGVzLAorCQkgICAgbF9wdHItPnN0YXRzLnJlY3ZfYnVuZGxlZCk7CisJdGlwY19wcmludGYoJnBiLCAiICBUWCBwYWNrZXRzOiV1IGZyYWdtZW50czoldS8ldSBidW5kbGVzOiV1LyV1XG4iLCAKKwkJICAgIGxfcHRyLT5uZXh0X291dF9ubyAtIGxfcHRyLT5zdGF0cy5zZW50X2luZm8sCisJCSAgICBsX3B0ci0+c3RhdHMuc2VudF9mcmFnbWVudHMsCisJCSAgICBsX3B0ci0+c3RhdHMuc2VudF9mcmFnbWVudGVkLCAKKwkJICAgIGxfcHRyLT5zdGF0cy5zZW50X2J1bmRsZXMsCisJCSAgICBsX3B0ci0+c3RhdHMuc2VudF9idW5kbGVkKTsKKwlwcm9maWxlX3RvdGFsID0gbF9wdHItPnN0YXRzLm1zZ19sZW5ndGhfY291bnRzOworCWlmICghcHJvZmlsZV90b3RhbCkKKwkJcHJvZmlsZV90b3RhbCA9IDE7CisJdGlwY19wcmludGYoJnBiLCAiICBUWCBwcm9maWxlIHNhbXBsZToldSBwYWNrZXRzICBhdmVyYWdlOiV1IG9jdGV0c1xuIgorCQkgICAgICAgICAiICAwLTY0OiV1JSUgLTI1NjoldSUlIC0xMDI0OiV1JSUgLTQwOTY6JXUlJSAiCisJCSAgICAgICAgICItMTYzNTQ6JXUlJSAtMzI3Njg6JXUlJSAtNjYwMDA6JXUlJVxuIiwKKwkJICAgIGxfcHRyLT5zdGF0cy5tc2dfbGVuZ3RoX2NvdW50cywKKwkJICAgIGxfcHRyLT5zdGF0cy5tc2dfbGVuZ3Roc190b3RhbCAvIHByb2ZpbGVfdG90YWwsCisJCSAgICBwZXJjZW50KGxfcHRyLT5zdGF0cy5tc2dfbGVuZ3RoX3Byb2ZpbGVbMF0sIHByb2ZpbGVfdG90YWwpLAorCQkgICAgcGVyY2VudChsX3B0ci0+c3RhdHMubXNnX2xlbmd0aF9wcm9maWxlWzFdLCBwcm9maWxlX3RvdGFsKSwKKwkJICAgIHBlcmNlbnQobF9wdHItPnN0YXRzLm1zZ19sZW5ndGhfcHJvZmlsZVsyXSwgcHJvZmlsZV90b3RhbCksCisJCSAgICBwZXJjZW50KGxfcHRyLT5zdGF0cy5tc2dfbGVuZ3RoX3Byb2ZpbGVbM10sIHByb2ZpbGVfdG90YWwpLAorCQkgICAgcGVyY2VudChsX3B0ci0+c3RhdHMubXNnX2xlbmd0aF9wcm9maWxlWzRdLCBwcm9maWxlX3RvdGFsKSwKKwkJICAgIHBlcmNlbnQobF9wdHItPnN0YXRzLm1zZ19sZW5ndGhfcHJvZmlsZVs1XSwgcHJvZmlsZV90b3RhbCksCisJCSAgICBwZXJjZW50KGxfcHRyLT5zdGF0cy5tc2dfbGVuZ3RoX3Byb2ZpbGVbNl0sIHByb2ZpbGVfdG90YWwpKTsKKwl0aXBjX3ByaW50ZigmcGIsICIgIFJYIHN0YXRlczoldSBwcm9iZXM6JXUgbmFrczoldSBkZWZzOiV1IGR1cHM6JXVcbiIsIAorCQkgICAgbF9wdHItPnN0YXRzLnJlY3Zfc3RhdGVzLAorCQkgICAgbF9wdHItPnN0YXRzLnJlY3ZfcHJvYmVzLAorCQkgICAgbF9wdHItPnN0YXRzLnJlY3ZfbmFja3MsCisJCSAgICBsX3B0ci0+c3RhdHMuZGVmZXJyZWRfcmVjdiwgCisJCSAgICBsX3B0ci0+c3RhdHMuZHVwbGljYXRlcyk7CisJdGlwY19wcmludGYoJnBiLCAiICBUWCBzdGF0ZXM6JXUgcHJvYmVzOiV1IG5ha3M6JXUgYWNrczoldSBkdXBzOiV1XG4iLCAKKwkJICAgIGxfcHRyLT5zdGF0cy5zZW50X3N0YXRlcywgCisJCSAgICBsX3B0ci0+c3RhdHMuc2VudF9wcm9iZXMsIAorCQkgICAgbF9wdHItPnN0YXRzLnNlbnRfbmFja3MsIAorCQkgICAgbF9wdHItPnN0YXRzLnNlbnRfYWNrcywgCisJCSAgICBsX3B0ci0+c3RhdHMucmV0cmFuc21pdHRlZCk7CisJdGlwY19wcmludGYoJnBiLCAiICBDb25nZXN0aW9uIGJlYXJlcjoldSBsaW5rOiV1ICBTZW5kIHF1ZXVlIG1heDoldSBhdmc6JXVcbiIsCisJCSAgICBsX3B0ci0+c3RhdHMuYmVhcmVyX2NvbmdzLAorCQkgICAgbF9wdHItPnN0YXRzLmxpbmtfY29uZ3MsIAorCQkgICAgbF9wdHItPnN0YXRzLm1heF9xdWV1ZV9zeiwKKwkJICAgIGxfcHRyLT5zdGF0cy5xdWV1ZV9zel9jb3VudHMKKwkJICAgID8gKGxfcHRyLT5zdGF0cy5hY2N1X3F1ZXVlX3N6IC8gbF9wdHItPnN0YXRzLnF1ZXVlX3N6X2NvdW50cykKKwkJICAgIDogMCk7CisKKwl0aXBjX25vZGVfdW5sb2NrKG5vZGUpOworCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKKwlyZXR1cm4gdGlwY19wcmludGJ1Zl92YWxpZGF0ZSgmcGIpOworfQorCisjZGVmaW5lIE1BWF9MSU5LX1NUQVRTX0lORk8gMjAwMAorCitzdHJ1Y3Qgc2tfYnVmZiAqdGlwY19saW5rX2NtZF9zaG93X3N0YXRzKGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3QgdGx2X2Rlc2MgKnJlcF90bHY7CisJaW50IHN0cl9sZW47CisKKwlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX0xJTktfTkFNRSkpCisJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKKworCWJ1ZiA9IHRpcGNfY2ZnX3JlcGx5X2FsbG9jKFRMVl9TUEFDRShNQVhfTElOS19TVEFUU19JTkZPKSk7CisJaWYgKCFidWYpCisJCXJldHVybiBOVUxMOworCisJcmVwX3RsdiA9IChzdHJ1Y3QgdGx2X2Rlc2MgKilidWYtPmRhdGE7CisKKwlzdHJfbGVuID0gdGlwY19saW5rX3N0YXRzKChjaGFyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKSwKKwkJCQkgIChjaGFyICopVExWX0RBVEEocmVwX3RsdiksIE1BWF9MSU5LX1NUQVRTX0lORk8pOworCWlmICghc3RyX2xlbikgeworCQlidWZfZGlzY2FyZChidWYpOworCSAgICAgICAJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZygibGluayBub3QgZm91bmQiKTsKKwl9CisKKwlza2JfcHV0KGJ1ZiwgVExWX1NQQUNFKHN0cl9sZW4pKTsKKwlUTFZfU0VUKHJlcF90bHYsIFRJUENfVExWX1VMVFJBX1NUUklORywgTlVMTCwgc3RyX2xlbik7CisKKwlyZXR1cm4gYnVmOworfQorCisjaWYgMAoraW50IGxpbmtfY29udHJvbChjb25zdCBjaGFyICpuYW1lLCB1MzIgb3AsIHUzMiB2YWwpCit7CisJaW50IHJlcyA9IC1FSU5WQUw7CisJc3RydWN0IGxpbmsgKmxfcHRyOworCXUzMiBiZWFyZXJfaWQ7CisJc3RydWN0IG5vZGUgKiBub2RlOworCXUzMiBhOworCisJYSA9IGxpbmtfbmFtZTJhZGRyKG5hbWUsICZiZWFyZXJfaWQpOworCXJlYWRfbG9ja19iaCgmdGlwY19uZXRfbG9jayk7CisJbm9kZSA9IHRpcGNfbm9kZV9maW5kKGEpOworCWlmIChub2RlKSB7CisJCXRpcGNfbm9kZV9sb2NrKG5vZGUpOworCQlsX3B0ciA9IG5vZGUtPmxpbmtzW2JlYXJlcl9pZF07CisJCWlmIChsX3B0cikgeworCQkJaWYgKG9wID09IFRJUENfUkVNT1ZFX0xJTkspIHsKKwkJCQlzdHJ1Y3QgYmVhcmVyICpiX3B0ciA9IGxfcHRyLT5iX3B0cjsKKwkJCQlzcGluX2xvY2tfYmgoJmJfcHRyLT5wdWJsLmxvY2spOworCQkJCXRpcGNfbGlua19kZWxldGUobF9wdHIpOworCQkJCXNwaW5fdW5sb2NrX2JoKCZiX3B0ci0+cHVibC5sb2NrKTsKKwkJCX0KKwkJCWlmIChvcCA9PSBUSVBDX0NNRF9CTE9DS19MSU5LKSB7CisJCQkJdGlwY19saW5rX3Jlc2V0KGxfcHRyKTsKKwkJCQlsX3B0ci0+YmxvY2tlZCA9IDE7CisJCQl9CisJCQlpZiAob3AgPT0gVElQQ19DTURfVU5CTE9DS19MSU5LKSB7CisJCQkJbF9wdHItPmJsb2NrZWQgPSAwOworCQkJfQorCQkJcmVzID0gVElQQ19PSzsKKwkJfQorCQl0aXBjX25vZGVfdW5sb2NrKG5vZGUpOworCX0KKwlyZWFkX3VubG9ja19iaCgmdGlwY19uZXRfbG9jayk7CisJcmV0dXJuIHJlczsKK30KKyNlbmRpZgorCisvKioKKyAqIHRpcGNfbGlua19nZXRfbWF4X3BrdCAtIGdldCBtYXhpbXVtIHBhY2tldCBzaXplIHRvIHVzZSB3aGVuIHNlbmRpbmcgdG8gZGVzdGluYXRpb24KKyAqIEBkZXN0OiBuZXR3b3JrIGFkZHJlc3Mgb2YgZGVzdGluYXRpb24gbm9kZQorICogQHNlbGVjdG9yOiB1c2VkIHRvIHNlbGVjdCBmcm9tIHNldCBvZiBhY3RpdmUgbGlua3MKKyAqIAorICogSWYgbm8gYWN0aXZlIGxpbmsgY2FuIGJlIGZvdW5kLCB1c2VzIGRlZmF1bHQgbWF4aW11bSBwYWNrZXQgc2l6ZS4KKyAqLworCit1MzIgdGlwY19saW5rX2dldF9tYXhfcGt0KHUzMiBkZXN0LCB1MzIgc2VsZWN0b3IpCit7CisJc3RydWN0IG5vZGUgKm5fcHRyOworCXN0cnVjdCBsaW5rICpsX3B0cjsKKwl1MzIgcmVzID0gTUFYX1BLVF9ERUZBVUxUOworCQorCWlmIChkZXN0ID09IHRpcGNfb3duX2FkZHIpCisJCXJldHVybiBNQVhfTVNHX1NJWkU7CisKKwlyZWFkX2xvY2tfYmgoJnRpcGNfbmV0X2xvY2spOyAgICAgICAgCisJbl9wdHIgPSB0aXBjX25vZGVfc2VsZWN0KGRlc3QsIHNlbGVjdG9yKTsKKwlpZiAobl9wdHIpIHsKKwkJdGlwY19ub2RlX2xvY2sobl9wdHIpOworCQlsX3B0ciA9IG5fcHRyLT5hY3RpdmVfbGlua3Nbc2VsZWN0b3IgJiAxXTsKKwkJaWYgKGxfcHRyKQorCQkJcmVzID0gbGlua19tYXhfcGt0KGxfcHRyKTsKKwkJdGlwY19ub2RlX3VubG9jayhuX3B0cik7CisJfQorCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsgICAgICAgCisJcmV0dXJuIHJlczsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIGxpbmtfZHVtcF9yZWNfcXVldWUoc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXN0cnVjdCBza19idWZmICpjcnM7CisKKwlpZiAoIWxfcHRyLT5vbGRlc3RfZGVmZXJyZWRfaW4pIHsKKwkJaW5mbygiUmVjZXB0aW9uIHF1ZXVlIGVtcHR5XG4iKTsKKwkJcmV0dXJuOworCX0KKwlpbmZvKCJDb250ZW50cyBvZiBSZWNlcHRpb24gcXVldWU6XG4iKTsKKwljcnMgPSBsX3B0ci0+b2xkZXN0X2RlZmVycmVkX2luOworCXdoaWxlIChjcnMpIHsKKwkJaWYgKGNycy0+ZGF0YSA9PSAodm9pZCAqKTB4MDAwMGEzYTMpIHsKKwkJCWluZm8oImJ1ZmZlciAleCBpbnZhbGlkXG4iLCBjcnMpOworCQkJcmV0dXJuOworCQl9CisJCW1zZ19kYmcoYnVmX21zZyhjcnMpLCAiSW4gcmVjIHF1ZXVlOiBcbiIpOworCQljcnMgPSBjcnMtPm5leHQ7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGxpbmtfZHVtcF9zZW5kX3F1ZXVlKHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlpZiAobF9wdHItPm5leHRfb3V0KSB7CisJCWluZm8oIlxuQ29udGVudHMgb2YgdW5zZW50IHF1ZXVlOlxuIik7CisJCWRiZ19wcmludF9idWZfY2hhaW4obF9wdHItPm5leHRfb3V0KTsKKwl9CisJaW5mbygiXG5Db250ZW50cyBvZiBzZW5kIHF1ZXVlOlxuIik7CisJaWYgKGxfcHRyLT5maXJzdF9vdXQpIHsKKwkJZGJnX3ByaW50X2J1Zl9jaGFpbihsX3B0ci0+Zmlyc3Rfb3V0KTsKKwl9CisJaW5mbygiRW1wdHkgc2VuZCBxdWV1ZVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGxpbmtfcHJpbnQoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3QgcHJpbnRfYnVmICpidWYsCisJCSAgICAgICBjb25zdCBjaGFyICpzdHIpCit7CisJdGlwY19wcmludGYoYnVmLCBzdHIpOworCWlmIChsaW5rX3Jlc2V0X3Jlc2V0KGxfcHRyKSB8fCBsaW5rX3Jlc2V0X3Vua25vd24obF9wdHIpKQorCQlyZXR1cm47CisJdGlwY19wcmludGYoYnVmLCAiTGluayAleDwlcz46IiwKKwkJICAgIGxfcHRyLT5hZGRyLCBsX3B0ci0+Yl9wdHItPnB1YmwubmFtZSk7CisJdGlwY19wcmludGYoYnVmLCAiOiBOWE8oJXUpOiIsIG1vZChsX3B0ci0+bmV4dF9vdXRfbm8pKTsKKwl0aXBjX3ByaW50ZihidWYsICJOWEkoJXUpOiIsIG1vZChsX3B0ci0+bmV4dF9pbl9ubykpOworCXRpcGNfcHJpbnRmKGJ1ZiwgIlNRVUUiKTsKKwlpZiAobF9wdHItPmZpcnN0X291dCkgeworCQl0aXBjX3ByaW50ZihidWYsICJbJXUuLiIsIG1zZ19zZXFubyhidWZfbXNnKGxfcHRyLT5maXJzdF9vdXQpKSk7CisJCWlmIChsX3B0ci0+bmV4dF9vdXQpCisJCQl0aXBjX3ByaW50ZihidWYsICIldS4uIiwKKwkJCQkgICAgbXNnX3NlcW5vKGJ1Zl9tc2cobF9wdHItPm5leHRfb3V0KSkpOworCQl0aXBjX3ByaW50ZihidWYsICIldV0iLAorCQkJICAgIG1zZ19zZXFubyhidWZfbXNnCisJCQkJICAgICAgKGxfcHRyLT5sYXN0X291dCkpLCBsX3B0ci0+b3V0X3F1ZXVlX3NpemUpOworCQlpZiAoKG1vZChtc2dfc2Vxbm8oYnVmX21zZyhsX3B0ci0+bGFzdF9vdXQpKSAtIAorCQkJIG1zZ19zZXFubyhidWZfbXNnKGxfcHRyLT5maXJzdF9vdXQpKSkgCisJCSAgICAgIT0gKGxfcHRyLT5vdXRfcXVldWVfc2l6ZSAtIDEpKQorCQkgICAgfHwgKGxfcHRyLT5sYXN0X291dC0+bmV4dCAhPSAwKSkgeworCQkJdGlwY19wcmludGYoYnVmLCAiXG5TZW5kIHF1ZXVlIGluY29uc2lzdGVuY3lcbiIpOworCQkJdGlwY19wcmludGYoYnVmLCAiZmlyc3Rfb3V0PSAleCAiLCBsX3B0ci0+Zmlyc3Rfb3V0KTsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIm5leHRfb3V0PSAleCAiLCBsX3B0ci0+bmV4dF9vdXQpOworCQkJdGlwY19wcmludGYoYnVmLCAibGFzdF9vdXQ9ICV4ICIsIGxfcHRyLT5sYXN0X291dCk7CisJCQlsaW5rX2R1bXBfc2VuZF9xdWV1ZShsX3B0cik7CisJCX0KKwl9IGVsc2UKKwkJdGlwY19wcmludGYoYnVmLCAiW10iKTsKKwl0aXBjX3ByaW50ZihidWYsICJTUVNJWigldSkiLCBsX3B0ci0+b3V0X3F1ZXVlX3NpemUpOworCWlmIChsX3B0ci0+b2xkZXN0X2RlZmVycmVkX2luKSB7CisJCXUzMiBvID0gbXNnX3NlcW5vKGJ1Zl9tc2cobF9wdHItPm9sZGVzdF9kZWZlcnJlZF9pbikpOworCQl1MzIgbiA9IG1zZ19zZXFubyhidWZfbXNnKGxfcHRyLT5uZXdlc3RfZGVmZXJyZWRfaW4pKTsKKwkJdGlwY19wcmludGYoYnVmLCAiOlJRVUVbJXUuLiV1XSIsIG8sIG4pOworCQlpZiAobF9wdHItPmRlZmVycmVkX2lucXVldWVfc3ogIT0gbW9kKChuICsgMSkgLSBvKSkgeworCQkJdGlwY19wcmludGYoYnVmLCAiOlJRU0laKCV1KSIsCisJCQkJICAgIGxfcHRyLT5kZWZlcnJlZF9pbnF1ZXVlX3N6KTsKKwkJfQorCX0KKwlpZiAobGlua193b3JraW5nX3Vua25vd24obF9wdHIpKQorCQl0aXBjX3ByaW50ZihidWYsICI6V1UiKTsKKwlpZiAobGlua19yZXNldF9yZXNldChsX3B0cikpCisJCXRpcGNfcHJpbnRmKGJ1ZiwgIjpSUiIpOworCWlmIChsaW5rX3Jlc2V0X3Vua25vd24obF9wdHIpKQorCQl0aXBjX3ByaW50ZihidWYsICI6UlUiKTsKKwlpZiAobGlua193b3JraW5nX3dvcmtpbmcobF9wdHIpKQorCQl0aXBjX3ByaW50ZihidWYsICI6V1ciKTsKKwl0aXBjX3ByaW50ZihidWYsICJcbiIpOworfQorCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9saW5rLmggYi9uZXQvdGlwYy9saW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQzYzE1NwotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL2xpbmsuaApAQCAtMCwwICsxLDI5NSBAQAorLyoKKyAqIG5ldC90aXBjL2xpbmsuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIGxpbmsgY29kZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfTElOS19ICisjZGVmaW5lIF9USVBDX0xJTktfSAorCisjaW5jbHVkZSAiZGJnLmgiCisjaW5jbHVkZSAibXNnLmgiCisjaW5jbHVkZSAiYmVhcmVyLmgiCisjaW5jbHVkZSAibm9kZS5oIgorCisjZGVmaW5lIFBVU0hfRkFJTEVEICAgMQorI2RlZmluZSBQVVNIX0ZJTklTSEVEIDIKKworLyogCisgKiBMaW5rIHN0YXRlcyAKKyAqLworCisjZGVmaW5lIFdPUktJTkdfV09SS0lORyA1NjA4MTB1CisjZGVmaW5lIFdPUktJTkdfVU5LTk9XTiA1NjA4MTF1CisjZGVmaW5lIFJFU0VUX1VOS05PV04gICA1NjA4MTJ1CisjZGVmaW5lIFJFU0VUX1JFU0VUICAgICA1NjA4MTN1CisKKy8qIAorICogU3RhcnRpbmcgdmFsdWUgZm9yIG1heGltdW0gcGFja2V0IHNpemUgbmVnb3RpYXRpb24gb24gdW5pY2FzdCBsaW5rcworICogKHVubGVzcyBiZWFyZXIgTVRVIGlzIGxlc3MpCisgKi8KKworI2RlZmluZSBNQVhfUEtUX0RFRkFVTFQgMTUwMAorCisvKioKKyAqIHN0cnVjdCBsaW5rIC0gVElQQyBsaW5rIGRhdGEgc3RydWN0dXJlCisgKiBAYWRkcjogbmV0d29yayBhZGRyZXNzIG9mIGxpbmsncyBwZWVyIG5vZGUKKyAqIEBuYW1lOiBsaW5rIG5hbWUgY2hhcmFjdGVyIHN0cmluZworICogQG1lZGlhX2FkZHI6IG1lZGlhIGFkZHJlc3MgdG8gdXNlIHdoZW4gc2VuZGluZyBtZXNzYWdlcyBvdmVyIGxpbmsKKyAqIEB0aW1lcjogbGluayB0aW1lcgorICogQG93bmVyOiBwb2ludGVyIHRvIHBlZXIgbm9kZQorICogQGxpbmtfbGlzdDogYWRqYWNlbnQgbGlua3MgaW4gYmVhcmVyJ3MgbGlzdCBvZiBsaW5rcworICogQHN0YXJ0ZWQ6IGluZGljYXRlcyBpZiBsaW5rIGhhcyBiZWVuIHN0YXJ0ZWQKKyAqIEBjaGVja3BvaW50OiByZWZlcmVuY2UgcG9pbnQgZm9yIHRyaWdnZXJpbmcgbGluayBjb250aW51aXR5IGNoZWNraW5nCisgKiBAcGVlcl9zZXNzaW9uOiBsaW5rIHNlc3Npb24gIyBiZWluZyB1c2VkIGJ5IHBlZXIgZW5kIG9mIGxpbmsKKyAqIEBwZWVyX2JlYXJlcl9pZDogYmVhcmVyIGlkIHVzZWQgYnkgbGluaydzIHBlZXIgZW5kcG9pbnQKKyAqIEBiX3B0cjogcG9pbnRlciB0byBiZWFyZXIgdXNlZCBieSBsaW5rCisgKiBAdG9sZXJhbmNlOiBtaW5pbXVtIGxpbmsgY29udGludWl0eSBsb3NzIG5lZWRlZCB0byByZXNldCBsaW5rIFtpbiBtc10gCisgKiBAY29udGludWl0eV9pbnRlcnZhbDogbGluayBjb250aW51aXR5IHRlc3RpbmcgaW50ZXJ2YWwgW2luIG1zXQorICogQGFib3J0X2xpbWl0OiAjIG9mIHVuYWNrbm93bGVkZ2VkIGNvbnRpbnVpdHkgcHJvYmVzIG5lZWRlZCB0byByZXNldCBsaW5rCisgKiBAc3RhdGU6IGN1cnJlbnQgc3RhdGUgb2YgbGluayBGU00KKyAqIEBibG9ja2VkOiBpbmRpY2F0ZXMgaWYgbGluayBoYXMgYmVlbiBhZG1pbmlzdHJhdGl2ZWx5IGJsb2NrZWQKKyAqIEBmc21fbXNnX2NudDogIyBvZiBwcm90b2NvbCBtZXNzYWdlcyBsaW5rIEZTTSBoYXMgc2VudCBpbiBjdXJyZW50IHN0YXRlCisgKiBAcHJvdG9fbXNnOiB0ZW1wbGF0ZSBmb3IgY29udHJvbCBtZXNzYWdlcyBnZW5lcmF0ZWQgYnkgbGluaworICogQHBtc2c6IGNvbnZlbmllbmNlIHBvaW50ZXIgdG8gInByb3RvX21zZyIgZmllbGQKKyAqIEBwcmlvcml0eTogY3VycmVudCBsaW5rIHByaW9yaXR5CisgKiBAcXVldWVfbGltaXQ6IG91dGJvdW5kIG1lc3NhZ2UgcXVldWUgY29uZ2VzdGlvbiB0aHJlc2hvbGRzIChpbmRleGVkIGJ5IHVzZXIpCisgKiBAZXhwX21zZ19jb3VudDogIyBvZiB0dW5uZWxsZWQgbWVzc2FnZXMgZXhwZWN0ZWQgZHVyaW5nIGxpbmsgY2hhbmdlb3ZlcgorICogQHJlc2V0X2NoZWNrcG9pbnQ6IHNlcSAjIG9mIGxhc3QgYWNrbm93bGVkZ2VkIG1lc3NhZ2UgYXQgdGltZSBvZiBsaW5rIHJlc2V0CisgKiBAbWF4X3BrdDogY3VycmVudCBtYXhpbXVtIHBhY2tldCBzaXplIGZvciB0aGlzIGxpbmsKKyAqIEBtYXhfcGt0X3RhcmdldDogZGVzaXJlZCBtYXhpbXVtIHBhY2tldCBzaXplIGZvciB0aGlzIGxpbmsKKyAqIEBtYXhfcGt0X3Byb2JlczogIyBvZiBwcm9iZXMgYmFzZWQgb24gY3VycmVudCAobWF4X3BrdCwgbWF4X3BrdF90YXJnZXQpCisgKiBAb3V0X3F1ZXVlX3NpemU6ICMgb2YgbWVzc2FnZXMgaW4gb3V0Ym91bmQgbWVzc2FnZSBxdWV1ZQorICogQGZpcnN0X291dDogcHRyIHRvIGZpcnN0IG91dGJvdW5kIG1lc3NhZ2UgaW4gcXVldWUKKyAqIEBsYXN0X291dDogcHRyIHRvIGxhc3Qgb3V0Ym91bmQgbWVzc2FnZSBpbiBxdWV1ZQorICogQG5leHRfb3V0X25vOiBuZXh0IHNlcXVlbmNlIG51bWJlciB0byB1c2UgZm9yIG91dGJvdW5kIG1lc3NhZ2VzCisgKiBAbGFzdF9yZXRyYW5zbWl0dGVkOiBzZXF1ZW5jZSBudW1iZXIgb2YgbW9zdCByZWNlbnRseSByZXRyYW5zbWl0dGVkIG1lc3NhZ2UKKyAqIEBzdGFsZV9jb3VudDogIyBvZiBpZGVudGljYWwgcmV0cmFuc21pdCByZXF1ZXN0cyBtYWRlIGJ5IHBlZXIKKyAqIEBuZXh0X2luX25vOiBuZXh0IHNlcXVlbmNlIG51bWJlciB0byBleHBlY3QgZm9yIGluYm91bmQgbWVzc2FnZXMKKyAqIEBkZWZlcnJlZF9pbnF1ZXVlX3N6OiAjIG9mIG1lc3NhZ2VzIGluIGluYm91bmQgbWVzc2FnZSBxdWV1ZQorICogQG9sZGVzdF9kZWZlcnJlZF9pbjogcHRyIHRvIGZpcnN0IGluYm91bmQgbWVzc2FnZSBpbiBxdWV1ZQorICogQG5ld2VzdF9kZWZlcnJlZF9pbjogcHRyIHRvIGxhc3QgaW5ib3VuZCBtZXNzYWdlIGluIHF1ZXVlCisgKiBAdW5hY2tlZF93aW5kb3c6ICMgb2YgaW5ib3VuZCBtZXNzYWdlcyByeCdkIHdpdGhvdXQgYWNrJ2luZyBiYWNrIHRvIHBlZXIKKyAqIEBwcm90b19tc2dfcXVldWU6IHB0ciB0byAoc2luZ2xlKSBvdXRib3VuZCBjb250cm9sIG1lc3NhZ2UKKyAqIEByZXRyYW5zbV9xdWV1ZV9zaXplOiBudW1iZXIgb2YgbWVzc2FnZXMgdG8gcmV0cmFuc21pdAorICogQHJldHJhbnNtX3F1ZXVlX2hlYWQ6IHNlcXVlbmNlIG51bWJlciBvZiBmaXJzdCBtZXNzYWdlIHRvIHJldHJhbnNtaXQKKyAqIEBuZXh0X291dDogcHRyIHRvIGZpcnN0IHVuc2VudCBvdXRib3VuZCBtZXNzYWdlIGluIHF1ZXVlCisgKiBAd2FpdGluZ19wb3J0czogbGlua2VkIGxpc3Qgb2YgcG9ydHMgd2FpdGluZyBmb3IgbGluayBjb25nZXN0aW9uIHRvIGFiYXRlCisgKiBAbG9uZ19tc2dfc2VxX25vOiBuZXh0IGlkZW50aWZpZXIgdG8gdXNlIGZvciBvdXRib3VuZCBmcmFnbWVudGVkIG1lc3NhZ2VzCisgKiBAZGVmcmFnbV9idWY6IGxpc3Qgb2YgcGFydGlhbGx5IHJlYXNzZW1ibGVkIGluYm91bmQgbWVzc2FnZSBmcmFnbWVudHMKKyAqIEBzdGF0czogY29sbGVjdHMgc3RhdGlzdGljcyByZWdhcmRpbmcgbGluayBhY3Rpdml0eQorICogQHByaW50X2J1ZjogcHJpbnQgYnVmZmVyIHVzZWQgdG8gbG9nIGxpbmsgYWN0aXZpdHkKKyAqLworIAorc3RydWN0IGxpbmsgeworCXUzMiBhZGRyOworCWNoYXIgbmFtZVtUSVBDX01BWF9MSU5LX05BTUVdOworCXN0cnVjdCB0aXBjX21lZGlhX2FkZHIgbWVkaWFfYWRkcjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwlzdHJ1Y3Qgbm9kZSAqb3duZXI7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rX2xpc3Q7CisKKwkvKiBNYW5hZ2VtZW50IGFuZCBsaW5rIHN1cGVydmlzaW9uIGRhdGEgKi8KKwlpbnQgc3RhcnRlZDsKKwl1MzIgY2hlY2twb2ludDsKKwl1MzIgcGVlcl9zZXNzaW9uOworCXUzMiBwZWVyX2JlYXJlcl9pZDsKKwlzdHJ1Y3QgYmVhcmVyICpiX3B0cjsKKwl1MzIgdG9sZXJhbmNlOworCXUzMiBjb250aW51aXR5X2ludGVydmFsOworCXUzMiBhYm9ydF9saW1pdDsKKwlpbnQgc3RhdGU7CisJaW50IGJsb2NrZWQ7CisJdTMyIGZzbV9tc2dfY250OworCXN0cnVjdCB7CisJCXVuY2hhciBoZHJbSU5UX0hfU0laRV07CisJCXVuY2hhciBib2R5W1RJUENfTUFYX0lGX05BTUVdOworCX0gcHJvdG9fbXNnOworCXN0cnVjdCB0aXBjX21zZyAqcG1zZzsKKwl1MzIgcHJpb3JpdHk7CisJdTMyIHF1ZXVlX2xpbWl0WzE1XTsJLyogcXVldWVfbGltaXRbMF09PXdpbmRvdyBsaW1pdCAqLworCisJLyogQ2hhbmdlb3ZlciAqLworCXUzMiBleHBfbXNnX2NvdW50OworCXUzMiByZXNldF9jaGVja3BvaW50OworCisgICAgICAgIC8qIE1heCBwYWNrZXQgbmVnb3RpYXRpb24gKi8KKyAgICAgICAgdTMyIG1heF9wa3Q7CisgICAgICAgIHUzMiBtYXhfcGt0X3RhcmdldDsKKyAgICAgICAgdTMyIG1heF9wa3RfcHJvYmVzOworCisJLyogU2VuZGluZyAqLworCXUzMiBvdXRfcXVldWVfc2l6ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqZmlyc3Rfb3V0OworCXN0cnVjdCBza19idWZmICpsYXN0X291dDsKKwl1MzIgbmV4dF9vdXRfbm87CisgICAgICAgIHUzMiBsYXN0X3JldHJhbnNtaXR0ZWQ7CisgICAgICAgIHUzMiBzdGFsZV9jb3VudDsKKworCS8qIFJlY2VwdGlvbiAqLworCXUzMiBuZXh0X2luX25vOworCXUzMiBkZWZlcnJlZF9pbnF1ZXVlX3N6OworCXN0cnVjdCBza19idWZmICpvbGRlc3RfZGVmZXJyZWRfaW47CisJc3RydWN0IHNrX2J1ZmYgKm5ld2VzdF9kZWZlcnJlZF9pbjsKKwl1MzIgdW5hY2tlZF93aW5kb3c7CisKKwkvKiBDb25nZXN0aW9uIGhhbmRsaW5nICovCisJc3RydWN0IHNrX2J1ZmYgKnByb3RvX21zZ19xdWV1ZTsKKwl1MzIgcmV0cmFuc21fcXVldWVfc2l6ZTsKKwl1MzIgcmV0cmFuc21fcXVldWVfaGVhZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dF9vdXQ7CisJc3RydWN0IGxpc3RfaGVhZCB3YWl0aW5nX3BvcnRzOworCisJLyogRnJhZ21lbnRhdGlvbi9kZWZyYWdtZW50YXRpb24gKi8KKwl1MzIgbG9uZ19tc2dfc2VxX25vOworCXN0cnVjdCBza19idWZmICpkZWZyYWdtX2J1ZjsKKworICAgICAgICAvKiBTdGF0aXN0aWNzICovCisJc3RydWN0IHsKKwkJdTMyIHNlbnRfaW5mbzsJCS8qIHVzZWQgaW4gY291bnRpbmcgIyBzZW50IHBhY2tldHMgKi8KKwkJdTMyIHJlY3ZfaW5mbzsJCS8qIHVzZWQgaW4gY291bnRpbmcgIyByZWN2J2QgcGFja2V0cyAqLworCQl1MzIgc2VudF9zdGF0ZXM7CisJCXUzMiByZWN2X3N0YXRlczsKKwkJdTMyIHNlbnRfcHJvYmVzOworCQl1MzIgcmVjdl9wcm9iZXM7CisJCXUzMiBzZW50X25hY2tzOworCQl1MzIgcmVjdl9uYWNrczsKKwkJdTMyIHNlbnRfYWNrczsKKwkJdTMyIHNlbnRfYnVuZGxlZDsKKwkJdTMyIHNlbnRfYnVuZGxlczsKKwkJdTMyIHJlY3ZfYnVuZGxlZDsKKwkJdTMyIHJlY3ZfYnVuZGxlczsKKwkJdTMyIHJldHJhbnNtaXR0ZWQ7CisJCXUzMiBzZW50X2ZyYWdtZW50ZWQ7CisJCXUzMiBzZW50X2ZyYWdtZW50czsKKwkJdTMyIHJlY3ZfZnJhZ21lbnRlZDsKKwkJdTMyIHJlY3ZfZnJhZ21lbnRzOworCQl1MzIgbGlua19jb25nczsJCS8qICMgcG9ydCBzZW5kcyBibG9ja2VkIGJ5IGNvbmdlc3Rpb24gKi8KKwkJdTMyIGJlYXJlcl9jb25nczsKKwkJdTMyIGRlZmVycmVkX3JlY3Y7CisJCXUzMiBkdXBsaWNhdGVzOworCisJCS8qIGZvciBzdGF0aXN0aWNhbCBwcm9maWxpbmcgb2Ygc2VuZCBxdWV1ZSBzaXplICovCisKKwkJdTMyIG1heF9xdWV1ZV9zejsKKwkJdTMyIGFjY3VfcXVldWVfc3o7CisJCXUzMiBxdWV1ZV9zel9jb3VudHM7CisKKwkJLyogZm9yIHN0YXRpc3RpY2FsIHByb2ZpbGluZyBvZiBtZXNzYWdlIGxlbmd0aHMgKi8KKworCQl1MzIgbXNnX2xlbmd0aF9jb3VudHM7CisJCXUzMiBtc2dfbGVuZ3Roc190b3RhbDsKKwkJdTMyIG1zZ19sZW5ndGhfcHJvZmlsZVs3XTsKKyNpZiAwCisJCXUzMiBzZW50X3R1bm5lbGVkOworCQl1MzIgcmVjdl90dW5uZWxlZDsKKyNlbmRpZgorCX0gc3RhdHM7CisKKwlzdHJ1Y3QgcHJpbnRfYnVmIHByaW50X2J1ZjsKK307CisKK3N0cnVjdCBwb3J0OworCitzdHJ1Y3QgbGluayAqdGlwY19saW5rX2NyZWF0ZShzdHJ1Y3QgYmVhcmVyICpiX3B0ciwgY29uc3QgdTMyIHBlZXIsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICptZWRpYV9hZGRyKTsKK3ZvaWQgdGlwY19saW5rX2RlbGV0ZShzdHJ1Y3QgbGluayAqbF9wdHIpOwordm9pZCB0aXBjX2xpbmtfY2hhbmdlb3ZlcihzdHJ1Y3QgbGluayAqbF9wdHIpOwordm9pZCB0aXBjX2xpbmtfc2VuZF9kdXBsaWNhdGUoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3QgbGluayAqZGVzdCk7Cit2b2lkIHRpcGNfbGlua19yZXNldF9mcmFnbWVudHMoc3RydWN0IGxpbmsgKmxfcHRyKTsKK2ludCB0aXBjX2xpbmtfaXNfdXAoc3RydWN0IGxpbmsgKmxfcHRyKTsKK2ludCB0aXBjX2xpbmtfaXNfYWN0aXZlKHN0cnVjdCBsaW5rICpsX3B0cik7Cit2b2lkIHRpcGNfbGlua19zdGFydChzdHJ1Y3QgbGluayAqbF9wdHIpOwordTMyIHRpcGNfbGlua19wdXNoX3BhY2tldChzdHJ1Y3QgbGluayAqbF9wdHIpOwordm9pZCB0aXBjX2xpbmtfc3RvcChzdHJ1Y3QgbGluayAqbF9wdHIpOworc3RydWN0IHNrX2J1ZmYgKnRpcGNfbGlua19jbWRfY29uZmlnKGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UsIHUxNiBjbWQpOworc3RydWN0IHNrX2J1ZmYgKnRpcGNfbGlua19jbWRfc2hvd19zdGF0cyhjb25zdCB2b2lkICpyZXFfdGx2X2FyZWEsIGludCByZXFfdGx2X3NwYWNlKTsKK3N0cnVjdCBza19idWZmICp0aXBjX2xpbmtfY21kX3Jlc2V0X3N0YXRzKGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UpOwordm9pZCB0aXBjX2xpbmtfcmVzZXQoc3RydWN0IGxpbmsgKmxfcHRyKTsKK2ludCB0aXBjX2xpbmtfc2VuZChzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCB1MzIgZGVzdCwgdTMyIHNlbGVjdG9yKTsKK2ludCB0aXBjX2xpbmtfc2VuZF9idWYoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKK3UzMiB0aXBjX2xpbmtfZ2V0X21heF9wa3QodTMyIGRlc3QsdTMyIHNlbGVjdG9yKTsKK2ludCB0aXBjX2xpbmtfc2VuZF9zZWN0aW9uc19mYXN0KHN0cnVjdCBwb3J0KiBzZW5kZXIsIAorCQkJCSBzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZ19zZWN0LAorCQkJCSBjb25zdCB1MzIgbnVtX3NlY3QsIAorCQkJCSB1MzIgZGVzdG5vZGUpOworaW50IHRpcGNfbGlua19zZW5kX2xvbmdfYnVmKHN0cnVjdCBsaW5rICpsX3B0ciwgc3RydWN0IHNrX2J1ZmYgKmJ1Zik7Cit2b2lkIHRpcGNfbGlua190dW5uZWwoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3QgdGlwY19tc2cgKnRubF9oZHIsCisJCSAgICAgIHN0cnVjdCB0aXBjX21zZyAqbXNnLCB1MzIgc2VsZWN0b3IpOwordm9pZCB0aXBjX2xpbmtfcmVjdl9idW5kbGUoc3RydWN0IHNrX2J1ZmYgKmJ1Zik7CitpbnQgIHRpcGNfbGlua19yZWN2X2ZyYWdtZW50KHN0cnVjdCBza19idWZmICoqcGVuZGluZywKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKipmYiwKKwkJCSAgICAgc3RydWN0IHRpcGNfbXNnICoqbXNnKTsKK3ZvaWQgdGlwY19saW5rX3NlbmRfcHJvdG9fbXNnKHN0cnVjdCBsaW5rICpsX3B0ciwgdTMyIG1zZ190eXAsIGludCBwcm9iLCB1MzIgZ2FwLCAKKwkJCSAgICAgIHUzMiB0b2xlcmFuY2UsIHUzMiBwcmlvcml0eSwgdTMyIGFja2VkX210dSk7Cit2b2lkIHRpcGNfbGlua19wdXNoX3F1ZXVlKHN0cnVjdCBsaW5rICpsX3B0cik7Cit1MzIgdGlwY19saW5rX2RlZmVyX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqKmhlYWQsIHN0cnVjdCBza19idWZmICoqdGFpbCwKKwkJICAgc3RydWN0IHNrX2J1ZmYgKmJ1Zik7Cit2b2lkIHRpcGNfbGlua193YWtldXBfcG9ydHMoc3RydWN0IGxpbmsgKmxfcHRyLCBpbnQgYWxsKTsKK3ZvaWQgdGlwY19saW5rX3NldF9xdWV1ZV9saW1pdHMoc3RydWN0IGxpbmsgKmxfcHRyLCB1MzIgd2luZG93KTsKK3ZvaWQgdGlwY19saW5rX3JldHJhbnNtaXQoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqc3RhcnQsIHUzMiByZXRyYW5zbWl0cyk7CisKKy8qCisgKiBMaW5rIHNlcXVlbmNlIG51bWJlciBtYW5pcHVsYXRpb24gcm91dGluZXMgKHVzZXMgbW9kdWxvIDIqKjE2IGFyaXRobWV0aWMpCisgKi8KKworc3RhdGljIGlubGluZSB1MzIgbW9kKHUzMiB4KQoreworCXJldHVybiB4ICYgMHhmZmZmdTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYmV0d2Vlbih1MzIgbG93ZXIsIHUzMiB1cHBlciwgdTMyIG4pCit7CisJaWYgKChsb3dlciA8IG4pICYmIChuIDwgdXBwZXIpKQorCQlyZXR1cm4gMTsKKwlpZiAoKHVwcGVyIDwgbG93ZXIpICYmICgobiA+IGxvd2VyKSB8fCAobiA8IHVwcGVyKSkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBsZXNzX2VxKHUzMiBsZWZ0LCB1MzIgcmlnaHQpCit7CisJcmV0dXJuIChtb2QocmlnaHQgLSBsZWZ0KSA8IDMyNzY4dSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxlc3ModTMyIGxlZnQsIHUzMiByaWdodCkKK3sKKwlyZXR1cm4gKGxlc3NfZXEobGVmdCwgcmlnaHQpICYmIChtb2QocmlnaHQpICE9IG1vZChsZWZ0KSkpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBsZXNzZXIodTMyIGxlZnQsIHUzMiByaWdodCkKK3sKKwlyZXR1cm4gbGVzc19lcShsZWZ0LCByaWdodCkgPyBsZWZ0IDogcmlnaHQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbXNnLmMgYi9uZXQvdGlwYy9tc2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmQzNDVhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvbXNnLmMKQEAgLTAsMCArMSwzMjMgQEAKKy8qCisgKiBuZXQvdGlwYy9tc2cuYzogVElQQyBtZXNzYWdlIGhlYWRlciByb3V0aW5lcworICogICAgIAorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJhZGRyLmgiCisjaW5jbHVkZSAiZGJnLmgiCisjaW5jbHVkZSAibXNnLmgiCisjaW5jbHVkZSAiYmVhcmVyLmgiCisKKwordm9pZCB0aXBjX21zZ19wcmludChzdHJ1Y3QgcHJpbnRfYnVmICpidWYsIHN0cnVjdCB0aXBjX21zZyAqbXNnLCBjb25zdCBjaGFyICpzdHIpCit7CisJdTMyIHVzciA9IG1zZ191c2VyKG1zZyk7CisJdGlwY19wcmludGYoYnVmLCBzdHIpOworCisJc3dpdGNoICh1c3IpIHsKKwljYXNlIE1TR19CVU5ETEVSOgorCQl0aXBjX3ByaW50ZihidWYsICJCTkRMOjoiKTsKKwkJdGlwY19wcmludGYoYnVmLCAiTVNHUygldSk6IiwgbXNnX21zZ2NudChtc2cpKTsKKwkJYnJlYWs7CisJY2FzZSBCQ0FTVF9QUk9UT0NPTDoKKwkJdGlwY19wcmludGYoYnVmLCAiQkNBU1RQOjoiKTsKKwkJYnJlYWs7CisJY2FzZSBNU0dfRlJBR01FTlRFUjoKKwkJdGlwY19wcmludGYoYnVmLCAiRlJBR006OiIpOworCQlzd2l0Y2ggKG1zZ190eXBlKG1zZykpIHsKKwkJY2FzZSBGSVJTVF9GUkFHTUVOVDoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIkZJUlNUOiIpOworCQkJYnJlYWs7CisJCWNhc2UgRlJBR01FTlQ6CisJCQl0aXBjX3ByaW50ZihidWYsICJCT0RZOiIpOworCQkJYnJlYWs7CisJCWNhc2UgTEFTVF9GUkFHTUVOVDoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIkxBU1Q6Iik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlVOS05PV046JXgiLG1zZ190eXBlKG1zZykpOworCisJCX0KKwkJdGlwY19wcmludGYoYnVmLCAiTk8oJXUvJXUpOiIsbXNnX2xvbmdfbXNnbm8obXNnKSwKKwkJCSAgICBtc2dfZnJhZ21fbm8obXNnKSk7CisJCWJyZWFrOworCWNhc2UgREFUQV9MT1c6CisJY2FzZSBEQVRBX01FRElVTToKKwljYXNlIERBVEFfSElHSDoKKwljYXNlIERBVEFfQ1JJVElDQUw6CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIkRBVCV1OiIsIG1zZ191c2VyKG1zZykpOworCQlpZiAobXNnX3Nob3J0KG1zZykpIHsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIkNPTjoiKTsKKwkJCWJyZWFrOworCQl9CisJCXN3aXRjaCAobXNnX3R5cGUobXNnKSkgeworCQljYXNlIFRJUENfQ09OTl9NU0c6CisJCQl0aXBjX3ByaW50ZihidWYsICJDT046Iik7CisJCQlicmVhazsKKwkJY2FzZSBUSVBDX01DQVNUX01TRzoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIk1DU1Q6Iik7CisJCQlicmVhazsKKwkJY2FzZSBUSVBDX05BTUVEX01TRzoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIk5BTToiKTsKKwkJCWJyZWFrOworCQljYXNlIFRJUENfRElSRUNUX01TRzoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIkRJUjoiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdGlwY19wcmludGYoYnVmLCAiVU5LTk9XTiBUWVBFICV1Iixtc2dfdHlwZShtc2cpKTsKKwkJfQorCQlpZiAobXNnX3JvdXRlZChtc2cpICYmICFtc2dfbm9uX3NlcShtc2cpKQorCQkJdGlwY19wcmludGYoYnVmLCAiUk9VVDoiKTsKKwkJaWYgKG1zZ19yZXJvdXRlX2NudChtc2cpKQorCQkJdGlwY19wcmludGYoYnVmLCAiUkVST1VURUQoJXUpOiIsCisJCQkJICAgIG1zZ19yZXJvdXRlX2NudChtc2cpKTsKKwkJYnJlYWs7CisJY2FzZSBOQU1FX0RJU1RSSUJVVE9SOgorCQl0aXBjX3ByaW50ZihidWYsICJOTUQ6OiIpOworCQlzd2l0Y2ggKG1zZ190eXBlKG1zZykpIHsKKwkJY2FzZSBQVUJMSUNBVElPTjoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlBVQkwoJXUpOiIsIChtc2dfc2l6ZShtc2cpIC0gbXNnX2hkcl9zeihtc2cpKSAvIDIwKTsJLyogSXRlbXMgKi8KKwkJCWJyZWFrOworCQljYXNlIFdJVEhEUkFXQUw6CisJCQl0aXBjX3ByaW50ZihidWYsICJXRFJXOiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0aXBjX3ByaW50ZihidWYsICJVTktOT1dOOiV4Iixtc2dfdHlwZShtc2cpKTsKKwkJfQorCQlpZiAobXNnX3JvdXRlZChtc2cpKQorCQkJdGlwY19wcmludGYoYnVmLCAiUk9VVDoiKTsKKwkJaWYgKG1zZ19yZXJvdXRlX2NudChtc2cpKQorCQkJdGlwY19wcmludGYoYnVmLCAiUkVST1VURUQoJXUpOiIsCisJCQkJICAgIG1zZ19yZXJvdXRlX2NudChtc2cpKTsKKwkJYnJlYWs7CisJY2FzZSBDT05OX01BTkFHRVI6CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIkNPTk5fTU5HOiIpOworCQlzd2l0Y2ggKG1zZ190eXBlKG1zZykpIHsKKwkJY2FzZSBDT05OX1BST0JFOgorCQkJdGlwY19wcmludGYoYnVmLCAiUFJPQkU6Iik7CisJCQlicmVhazsKKwkJY2FzZSBDT05OX1BST0JFX1JFUExZOgorCQkJdGlwY19wcmludGYoYnVmLCAiUFJPQkVfUkVQTFk6Iik7CisJCQlicmVhazsKKwkJY2FzZSBDT05OX0FDSzoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIkNPTk5fQUNLOiIpOworCQkJdGlwY19wcmludGYoYnVmLCAiQUNLKCV1KToiLG1zZ19tc2djbnQobXNnKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlVOS05PV04gVFlQRToleCIsbXNnX3R5cGUobXNnKSk7CisJCX0KKwkJaWYgKG1zZ19yb3V0ZWQobXNnKSkKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlJPVVQ6Iik7CisJCWlmIChtc2dfcmVyb3V0ZV9jbnQobXNnKSkKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlJFUk9VVEVEKCV1KToiLG1zZ19yZXJvdXRlX2NudChtc2cpKTsKKwkJYnJlYWs7CisJY2FzZSBMSU5LX1BST1RPQ09MOgorCQl0aXBjX3ByaW50ZihidWYsICJQUk9UOlRJTSgldSk6Iixtc2dfdGltZXN0YW1wKG1zZykpOworCQlzd2l0Y2ggKG1zZ190eXBlKG1zZykpIHsKKwkJY2FzZSBTVEFURV9NU0c6CisJCQl0aXBjX3ByaW50ZihidWYsICJTVEFURToiKTsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIiVzOiIsbXNnX3Byb2JlKG1zZykgPyAiUFJCIiA6IiIpOworCQkJdGlwY19wcmludGYoYnVmLCAiTlhTKCV1KToiLG1zZ19uZXh0X3NlbnQobXNnKSk7CisJCQl0aXBjX3ByaW50ZihidWYsICJHQVAoJXUpOiIsbXNnX3NlcV9nYXAobXNnKSk7CisJCQl0aXBjX3ByaW50ZihidWYsICJMU1RCQygldSk6Iixtc2dfbGFzdF9iY2FzdChtc2cpKTsKKwkJCWJyZWFrOworCQljYXNlIFJFU0VUX01TRzoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlJFU0VUOiIpOworCQkJaWYgKG1zZ19zaXplKG1zZykgIT0gbXNnX2hkcl9zeihtc2cpKQorCQkJCXRpcGNfcHJpbnRmKGJ1ZiwgIkJFQVI6JXM6Iixtc2dfZGF0YShtc2cpKTsKKwkJCWJyZWFrOworCQljYXNlIEFDVElWQVRFX01TRzoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIkFDVElWQVRFOiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0aXBjX3ByaW50ZihidWYsICJVTktOT1dOIFRZUEU6JXgiLG1zZ190eXBlKG1zZykpOworCQl9CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIlBMQU5FKCVjKToiLG1zZ19uZXRfcGxhbmUobXNnKSk7CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIlNFU1MoJXUpOiIsbXNnX3Nlc3Npb24obXNnKSk7CisJCWJyZWFrOworCWNhc2UgQ0hBTkdFT1ZFUl9QUk9UT0NPTDoKKwkJdGlwY19wcmludGYoYnVmLCAiVFVOTDoiKTsKKwkJc3dpdGNoIChtc2dfdHlwZShtc2cpKSB7CisJCWNhc2UgRFVQTElDQVRFX01TRzoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIkRVUEw6Iik7CisJCQlicmVhazsKKwkJY2FzZSBPUklHSU5BTF9NU0c6CisJCQl0aXBjX3ByaW50ZihidWYsICJPUklHOiIpOworCQkJdGlwY19wcmludGYoYnVmLCAiRVhQKCV1KSIsbXNnX21zZ2NudChtc2cpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdGlwY19wcmludGYoYnVmLCAiVU5LTk9XTiBUWVBFOiV4Iixtc2dfdHlwZShtc2cpKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJPVVRFX0RJU1RSSUJVVE9SOgorCQl0aXBjX3ByaW50ZihidWYsICJST1VUSU5HX01ORzoiKTsKKwkJc3dpdGNoIChtc2dfdHlwZShtc2cpKSB7CisJCWNhc2UgRVhUX1JPVVRJTkdfVEFCTEU6CisJCQl0aXBjX3ByaW50ZihidWYsICJFWFRfVEJMOiIpOworCQkJdGlwY19wcmludGYoYnVmLCAiVE86JXg6Iixtc2dfcmVtb3RlX25vZGUobXNnKSk7CisJCQlicmVhazsKKwkJY2FzZSBMT0NBTF9ST1VUSU5HX1RBQkxFOgorCQkJdGlwY19wcmludGYoYnVmLCAiTE9DQUxfVEJMOiIpOworCQkJdGlwY19wcmludGYoYnVmLCAiVE86JXg6Iixtc2dfcmVtb3RlX25vZGUobXNnKSk7CisJCQlicmVhazsKKwkJY2FzZSBTTEFWRV9ST1VUSU5HX1RBQkxFOgorCQkJdGlwY19wcmludGYoYnVmLCAiRFBfVEJMOiIpOworCQkJdGlwY19wcmludGYoYnVmLCAiVE86JXg6Iixtc2dfcmVtb3RlX25vZGUobXNnKSk7CisJCQlicmVhazsKKwkJY2FzZSBST1VURV9BRERJVElPTjoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIkFERDoiKTsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlRPOiV4OiIsbXNnX3JlbW90ZV9ub2RlKG1zZykpOworCQkJYnJlYWs7CisJCWNhc2UgUk9VVEVfUkVNT1ZBTDoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlJFTU9WRToiKTsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlRPOiV4OiIsbXNnX3JlbW90ZV9ub2RlKG1zZykpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0aXBjX3ByaW50ZihidWYsICJVTktOT1dOIFRZUEU6JXgiLG1zZ190eXBlKG1zZykpOworCQl9CisJCWJyZWFrOworCWNhc2UgTElOS19DT05GSUc6CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIkNGRzoiKTsKKwkJc3dpdGNoIChtc2dfdHlwZShtc2cpKSB7CisJCWNhc2UgRFNDX1JFUV9NU0c6CisJCQl0aXBjX3ByaW50ZihidWYsICJEU0NfUkVROiIpOworCQkJYnJlYWs7CisJCWNhc2UgRFNDX1JFU1BfTVNHOgorCQkJdGlwY19wcmludGYoYnVmLCAiRFNDX1JFU1A6Iik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlVOS05PV04gVFlQRToleDoiLG1zZ190eXBlKG1zZykpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdGlwY19wcmludGYoYnVmLCAiVU5LTk9XTiBVU0VSOiIpOworCX0KKworCXN3aXRjaCAodXNyKSB7CisJY2FzZSBDT05OX01BTkFHRVI6CisJY2FzZSBOQU1FX0RJU1RSSUJVVE9SOgorCWNhc2UgREFUQV9MT1c6CisJY2FzZSBEQVRBX01FRElVTToKKwljYXNlIERBVEFfSElHSDoKKwljYXNlIERBVEFfQ1JJVElDQUw6CisJCWlmIChtc2dfc2hvcnQobXNnKSkKKwkJCWJyZWFrOwkvKiBObyBlcnJvciAqLworCQlzd2l0Y2ggKG1zZ19lcnJjb2RlKG1zZykpIHsKKwkJY2FzZSBUSVBDX09LOgorCQkJYnJlYWs7CisJCWNhc2UgVElQQ19FUlJfTk9fTkFNRToKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIk5PX05BTUU6Iik7CisJCQlicmVhazsKKwkJY2FzZSBUSVBDX0VSUl9OT19QT1JUOgorCQkJdGlwY19wcmludGYoYnVmLCAiTk9fUE9SVDoiKTsKKwkJCWJyZWFrOworCQljYXNlIFRJUENfRVJSX05PX05PREU6CisJCQl0aXBjX3ByaW50ZihidWYsICJOT19QUk9DOiIpOworCQkJYnJlYWs7CisJCWNhc2UgVElQQ19FUlJfT1ZFUkxPQUQ6CisJCQl0aXBjX3ByaW50ZihidWYsICJPVkVSTE9BRDoiKTsKKwkJCWJyZWFrOworCQljYXNlIFRJUENfQ09OTl9TSFVURE9XTjoKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIlNIVVRET1dOOiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0aXBjX3ByaW50ZihidWYsICJVTktOT1dOIEVSUk9SKCV4KToiLAorCQkJCSAgICBtc2dfZXJyY29kZShtc2cpKTsKKwkJfQorCWRlZmF1bHQ6e30KKwl9CisKKwl0aXBjX3ByaW50ZihidWYsICJIWigldSk6IiwgbXNnX2hkcl9zeihtc2cpKTsKKwl0aXBjX3ByaW50ZihidWYsICJTWigldSk6IiwgbXNnX3NpemUobXNnKSk7CisJdGlwY19wcmludGYoYnVmLCAiU1FOTygldSk6IiwgbXNnX3NlcW5vKG1zZykpOworCisJaWYgKG1zZ19ub25fc2VxKG1zZykpCisJCXRpcGNfcHJpbnRmKGJ1ZiwgIk5PU0VROiIpOworCWVsc2UgeworCQl0aXBjX3ByaW50ZihidWYsICJBQ0soJXUpOiIsIG1zZ19hY2sobXNnKSk7CisJfQorCXRpcGNfcHJpbnRmKGJ1ZiwgIkJBQ0soJXUpOiIsIG1zZ19iY2FzdF9hY2sobXNnKSk7CisJdGlwY19wcmludGYoYnVmLCAiUFJORCgleCkiLCBtc2dfcHJldm5vZGUobXNnKSk7CisKKwlpZiAobXNnX2lzZGF0YShtc2cpKSB7CisJCWlmIChtc2dfbmFtZWQobXNnKSkgeworCQkJdGlwY19wcmludGYoYnVmLCAiTlRZUCgldSk6IiwgbXNnX25hbWV0eXBlKG1zZykpOworCQkJdGlwY19wcmludGYoYnVmLCAiTklOU1QoJXUpIiwgbXNnX25hbWVpbnN0KG1zZykpOworCQl9CisJfQorCisJaWYgKCh1c3IgIT0gTElOS19QUk9UT0NPTCkgJiYgKHVzciAhPSBMSU5LX0NPTkZJRykgJiYKKwkgICAgKHVzciAhPSBNU0dfQlVORExFUikpIHsKKwkJaWYgKCFtc2dfc2hvcnQobXNnKSkgeworCQkJdGlwY19wcmludGYoYnVmLCAiOk9SSUcoJXg6JXUpOiIsCisJCQkJICAgIG1zZ19vcmlnbm9kZShtc2cpLCBtc2dfb3JpZ3BvcnQobXNnKSk7CisJCQl0aXBjX3ByaW50ZihidWYsICI6REVTVCgleDoldSk6IiwKKwkJCQkgICAgbXNnX2Rlc3Rub2RlKG1zZyksIG1zZ19kZXN0cG9ydChtc2cpKTsKKwkJfSBlbHNlIHsKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIjpPUFJUKCV1KToiLCBtc2dfb3JpZ3BvcnQobXNnKSk7CisJCQl0aXBjX3ByaW50ZihidWYsICI6RFBSVCgldSk6IiwgbXNnX2Rlc3Rwb3J0KG1zZykpOworCQl9CisJCWlmIChtc2dfcm91dGVkKG1zZykgJiYgIW1zZ19ub25fc2VxKG1zZykpCisJCQl0aXBjX3ByaW50ZihidWYsICI6VFNFUU4oJXUpIiwgbXNnX3RyYW5zcF9zZXFubyhtc2cpKTsKKwl9CisJaWYgKG1zZ191c2VyKG1zZykgPT0gTkFNRV9ESVNUUklCVVRPUikgeworCQl0aXBjX3ByaW50ZihidWYsICI6T05PRCgleCk6IiwgbXNnX29yaWdub2RlKG1zZykpOworCQl0aXBjX3ByaW50ZihidWYsICI6RE5PRCgleCk6IiwgbXNnX2Rlc3Rub2RlKG1zZykpOworCQlpZiAobXNnX3JvdXRlZChtc2cpKSB7CisJCQl0aXBjX3ByaW50ZihidWYsICI6Q1NFUU4oJXUpIiwgbXNnX3RyYW5zcF9zZXFubyhtc2cpKTsKKwkJfQorCX0KKworCWlmIChtc2dfdXNlcihtc2cpID09ICBMSU5LX0NPTkZJRykgeworCQl1MzIqIHJhdyA9ICh1MzIqKW1zZzsKKwkJc3RydWN0IHRpcGNfbWVkaWFfYWRkciogb3JpZyA9IChzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyKikmcmF3WzVdOworCQl0aXBjX3ByaW50ZihidWYsICI6UkVRTCgldSk6IiwgbXNnX3JlcV9saW5rcyhtc2cpKTsKKwkJdGlwY19wcmludGYoYnVmLCAiOkRET00oJXgpOiIsIG1zZ19kZXN0X2RvbWFpbihtc2cpKTsKKwkJdGlwY19wcmludGYoYnVmLCAiOk5FVElEKCV1KToiLCBtc2dfYmNfbmV0aWQobXNnKSk7CisJCXRpcGNfbWVkaWFfYWRkcl9wcmludGYoYnVmLCBvcmlnKTsKKwl9CisJaWYgKG1zZ191c2VyKG1zZykgPT0gQkNBU1RfUFJPVE9DT0wpIHsKKwkJdGlwY19wcmludGYoYnVmLCAiQkNOQUNLOkFGVEVSKCV1KToiLCBtc2dfYmNnYXBfYWZ0ZXIobXNnKSk7CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIlRPKCV1KToiLCBtc2dfYmNnYXBfdG8obXNnKSk7CisJfQorCXRpcGNfcHJpbnRmKGJ1ZiwgIlxuIik7CisJaWYgKCh1c3IgPT0gQ0hBTkdFT1ZFUl9QUk9UT0NPTCkgJiYgKG1zZ19tc2djbnQobXNnKSkpIHsKKwkJdGlwY19tc2dfcHJpbnQoYnVmLG1zZ19nZXRfd3JhcHBlZChtc2cpLCIgICAgICAvIik7CisJfQorCWlmICgodXNyID09IE1TR19GUkFHTUVOVEVSKSAmJiAobXNnX3R5cGUobXNnKSA9PSBGSVJTVF9GUkFHTUVOVCkpIHsKKwkJdGlwY19tc2dfcHJpbnQoYnVmLG1zZ19nZXRfd3JhcHBlZChtc2cpLCIgICAgICAvIik7CisJfQorfQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbXNnLmggYi9uZXQvdGlwYy9tc2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njk5YWFmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvbXNnLmgKQEAgLTAsMCArMSw4MTggQEAKKy8qCisgKiBuZXQvdGlwYy9tc2cuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIG1lc3NhZ2UgaGVhZGVyIHJvdXRpbmVzCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfTVNHX0gKKyNkZWZpbmUgX1RJUENfTVNHX0gKKworI2luY2x1ZGUgImNvcmUuaCIKKworI2RlZmluZSBUSVBDX1ZFUlNJT04gICAgICAgICAgICAgIDIKKyNkZWZpbmUgREFUQV9MT1cgICAgICAgICAgICAgICAgICBUSVBDX0xPV19JTVBPUlRBTkNFCisjZGVmaW5lIERBVEFfTUVESVVNICAgICAgICAgICAgICAgVElQQ19NRURJVU1fSU1QT1JUQU5DRQorI2RlZmluZSBEQVRBX0hJR0ggICAgICAgICAgICAgICAgIFRJUENfSElHSF9JTVBPUlRBTkNFCisjZGVmaW5lIERBVEFfQ1JJVElDQUwgICAgICAgICAgICAgVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFCisjZGVmaW5lIFNIT1JUX0hfU0laRSAgICAgICAgICAgICAgMjQJLyogQ29ubmVjdGVkLGluIGNsdXN0ZXIgKi8KKyNkZWZpbmUgRElSX01TR19IX1NJWkUgICAgICAgICAgICAzMgkvKiBEaXJlY3RseSBhZGRyZXNzZWQgbWVzc2FnZXMgKi8KKyNkZWZpbmUgQ09OTl9NU0dfSF9TSVpFICAgICAgICAgICAzNgkvKiBSb3V0ZWQgY29ubmVjdGVkIG1zZ3MqLworI2RlZmluZSBMT05HX0hfU0laRSAgICAgICAgICAgICAgIDQwCS8qIE5hbWVkIE1lc3NhZ2VzICovCisjZGVmaW5lIE1DQVNUX0hfU0laRSAgICAgICAgICAgICAgNDQJLyogTXVsdGljYXN0IG1lc3NhZ2VzICovCisjZGVmaW5lIE1BWF9IX1NJWkUgICAgICAgICAgICAgICAgNjAJLyogSW5jbHVzaXZlIGZ1bGwgb3B0aW9ucyAqLworI2RlZmluZSBNQVhfTVNHX1NJWkUgKE1BWF9IX1NJWkUgKyBUSVBDX01BWF9VU0VSX01TR19TSVpFKQorI2RlZmluZSBMSU5LX0NPTkZJRyAgICAgICAgICAgICAgIDEzCisKKworLyoKKwkJVElQQyB1c2VyIGRhdGEgbWVzc2FnZSBoZWFkZXIgZm9ybWF0LCB2ZXJzaW9uIDIKKwkJCisJLSBGdW5kYW1lbnRhbCBkZWZpbml0aW9ucyBhdmFpbGFibGUgdG8gcHJpdmlsZWdlZCBUSVBDIHVzZXJzCisJICBhcmUgbG9jYXRlZCBpbiB0aXBjX21zZy5oLgorCS0gUmVtYWluaW5nIGRlZmluaXRpb25zIGF2YWlsYWJsZSB0byBUSVBDIGludGVybmFsIHVzZXJzIGFwcGVhciBiZWxvdy4gCisqLworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3dvcmQoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgdywgdTMyIHZhbCkKK3sKKwltLT5oZHJbd10gPSBodG9ubCh2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9iaXRzKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIHcsCisJCQkJdTMyIHBvcywgdTMyIG1hc2ssIHUzMiB2YWwpCit7CisJdTMyIHdvcmQgPSBtc2dfd29yZChtLHcpICYgfihtYXNrIDw8IHBvcyk7CisJbXNnX3NldF93b3JkKG0sIHcsICh3b3JkIHw9ICh2YWwgPDwgcG9zKSkpOworfQorCisvKiAKKyAqIFdvcmQgMAorICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ192ZXJzaW9uKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgMCwgMjksIDcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF92ZXJzaW9uKHN0cnVjdCB0aXBjX21zZyAqbSkgCit7CisJbXNnX3NldF9iaXRzKG0sIDAsIDI5LCAweGYsIFRJUENfVkVSU0lPTik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ191c2VyKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgMCwgMjUsIDB4Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19pc2RhdGEoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiAobXNnX3VzZXIobSkgPD0gREFUQV9DUklUSUNBTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3VzZXIoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikgCit7CisJbXNnX3NldF9iaXRzKG0sIDAsIDI1LCAweGYsIG4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9pbXBvcnRhbmNlKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIGkpIAoreworCW1zZ19zZXRfdXNlcihtLCBpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfaGRyX3N6KHN0cnVjdCB0aXBjX21zZyAqbSx1MzIgbikgCit7CisJbXNnX3NldF9iaXRzKG0sIDAsIDIxLCAweGYsIG4+PjIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBtc2dfbm9uX3NlcShzdHJ1Y3QgdGlwY19tc2cgKm0pIAoreworCXJldHVybiBtc2dfYml0cyhtLCAwLCAyMCwgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X25vbl9zZXEoc3RydWN0IHRpcGNfbXNnICptKSAKK3sKKwltc2dfc2V0X2JpdHMobSwgMCwgMjAsIDEsIDEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBtc2dfZGVzdF9kcm9wcGFibGUoc3RydWN0IHRpcGNfbXNnICptKSAKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgMCwgMTksIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9kZXN0X2Ryb3BwYWJsZShzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBkKSAKK3sKKwltc2dfc2V0X2JpdHMobSwgMCwgMTksIDEsIGQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBtc2dfc3JjX2Ryb3BwYWJsZShzdHJ1Y3QgdGlwY19tc2cgKm0pIAoreworCXJldHVybiBtc2dfYml0cyhtLCAwLCAxOCwgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3NyY19kcm9wcGFibGUoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgZCkgCit7CisJbXNnX3NldF9iaXRzKG0sIDAsIDE4LCAxLCBkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfc2l6ZShzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBzeikKK3sKKwltLT5oZHJbMF0gPSBodG9ubCgobXNnX3dvcmQobSwgMCkgJiB+MHgxZmZmZikgfCBzeik7Cit9CisKKworLyogCisgKiBXb3JkIDEKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF90eXBlKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pIAoreworCW1zZ19zZXRfYml0cyhtLCAxLCAyOSwgMHg3LCBuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfZXJyY29kZShzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBlcnIpIAoreworCW1zZ19zZXRfYml0cyhtLCAxLCAyNSwgMHhmLCBlcnIpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfcmVyb3V0ZV9jbnQoc3RydWN0IHRpcGNfbXNnICptKSAKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgMSwgMjEsIDB4Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfaW5jcl9yZXJvdXRlX2NudChzdHJ1Y3QgdGlwY19tc2cgKm0pIAoreworCW1zZ19zZXRfYml0cyhtLCAxLCAyMSwgMHhmLCBtc2dfcmVyb3V0ZV9jbnQobSkgKyAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19yZXNldF9yZXJvdXRlX2NudChzdHJ1Y3QgdGlwY19tc2cgKm0pIAoreworCW1zZ19zZXRfYml0cyhtLCAxLCAyMSwgMHhmLCAwKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2xvb2t1cF9zY29wZShzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDEsIDE5LCAweDMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9sb29rdXBfc2NvcGUoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikgCit7CisJbXNnX3NldF9iaXRzKG0sIDEsIDE5LCAweDMsIG4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9vcHRpb25zKHN0cnVjdCB0aXBjX21zZyAqbSwgY29uc3QgY2hhciAqb3B0LCB1MzIgc3opIAoreworCXUzMiBoc3ogPSBtc2dfaGRyX3N6KG0pOworCWNoYXIgKnRvID0gKGNoYXIgKikmbS0+aGRyW2hzei80XTsKKworCWlmICgoaHN6IDwgRElSX01TR19IX1NJWkUpIHx8ICgoaHN6ICsgc3opID4gTUFYX0hfU0laRSkpCisJCXJldHVybjsKKwltc2dfc2V0X2JpdHMobSwgMSwgMTYsIDB4NywgKGhzeiAtIDI4KS80KTsKKwltc2dfc2V0X2hkcl9zeihtLCBoc3ogKyBzeik7CisJbWVtY3B5KHRvLCBvcHQsIHN6KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2JjYXN0X2FjayhzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDEsIDAsIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X2JjYXN0X2FjayhzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKSAKK3sKKwltc2dfc2V0X2JpdHMobSwgMSwgMCwgMHhmZmZmLCBuKTsKK30KKworCisvKiAKKyAqIFdvcmQgMgorICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19hY2soc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCAyLCAxNiwgMHhmZmZmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfYWNrKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pIAoreworCW1zZ19zZXRfYml0cyhtLCAyLCAxNiwgMHhmZmZmLCBuKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX3NlcW5vKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgMiwgMCwgMHhmZmZmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfc2Vxbm8oc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikgCit7CisJbXNnX3NldF9iaXRzKG0sIDIsIDAsIDB4ZmZmZiwgbik7Cit9CisKKworLyogCisgKiBXb3JkcyAzLTEwCisgKi8KKworCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9wcmV2bm9kZShzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBhKSAKK3sKKwltc2dfc2V0X3dvcmQobSwgMywgYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X29yaWdwb3J0KHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIHApIAoreworCW1zZ19zZXRfd29yZChtLCA0LCBwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfZGVzdHBvcnQoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgcCkgCit7CisJbXNnX3NldF93b3JkKG0sIDUsIHApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9tY19uZXRpZChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBwKSAKK3sKKwltc2dfc2V0X3dvcmQobSwgNSwgcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X29yaWdub2RlKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIGEpIAoreworCW1zZ19zZXRfd29yZChtLCA2LCBhKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfZGVzdG5vZGUoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgYSkgCit7CisJbXNnX3NldF93b3JkKG0sIDcsIGEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBtc2dfaXNfZGVzdChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBkKSAKK3sKKwlyZXR1cm4obXNnX3Nob3J0KG0pIHx8IChtc2dfZGVzdG5vZGUobSkgPT0gZCkpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfcm91dGVkKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlpZiAobGlrZWx5KG1zZ19zaG9ydChtKSkpCisJCXJldHVybiAwOworCXJldHVybihtc2dfZGVzdG5vZGUobSkgXiBtc2dfb3JpZ25vZGUobSkpID4+IDExOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9uYW1ldHlwZShzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKSAKK3sKKwltc2dfc2V0X3dvcmQobSwgOCwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ190cmFuc3Bfc2Vxbm8oc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfd29yZChtLCA4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfdGltZXN0YW1wKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pCit7CisJbXNnX3NldF93b3JkKG0sIDgsIG4pOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfdGltZXN0YW1wKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX3dvcmQobSwgOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3RyYW5zcF9zZXFubyhzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKQoreworCW1zZ19zZXRfd29yZChtLCA4LCBuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbmFtZWxvd2VyKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pIAoreworCW1zZ19zZXRfd29yZChtLCA5LCBuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbmFtZWluc3Qoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikgCit7CisJbXNnX3NldF9uYW1lbG93ZXIobSwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X25hbWV1cHBlcihzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKSAKK3sKKwltc2dfc2V0X3dvcmQobSwgMTAsIG4pOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0aXBjX21zZyAqbXNnX2dldF93cmFwcGVkKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gKHN0cnVjdCB0aXBjX21zZyAqKW1zZ19kYXRhKG0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX2V4cGFuZChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBkZXN0bm9kZSkgCit7CisJaWYgKCFtc2dfc2hvcnQobSkpCisJCXJldHVybjsKKwltc2dfc2V0X2hkcl9zeihtLCBMT05HX0hfU0laRSk7CisJbXNnX3NldF9vcmlnbm9kZShtLCBtc2dfcHJldm5vZGUobSkpOworCW1zZ19zZXRfZGVzdG5vZGUobSwgZGVzdG5vZGUpOworCW1lbXNldCgmbS0+aGRyWzhdLCAwLCAxMik7Cit9CisKKworCisvKgorCQlUSVBDIGludGVybmFsIG1lc3NhZ2UgaGVhZGVyIGZvcm1hdCwgdmVyc2lvbiAyCisKKyAgICAgICAxIDAgOSA4IDcgNiA1IDR8MyAyIDEgMCA5IDggNyA2fDUgNCAzIDIgMSAwIDkgOHw3IDYgNSA0IDMgMiAxIDAgCisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgdzA6fHZlcnMgfG1zZyB1c3J8aGRyIHN6IHxufHJlc3J2fCAgICAgICAgICAgIHBhY2tldCBzaXplICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB3MTp8bSB0eXB8cnN2PTB8ICAgc2VxdWVuY2UgZ2FwICAgIHwgICAgICAgYnJvYWRjYXN0IGFjayBubyAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHcyOnwgbGluayBsZXZlbCBhY2sgbm8vYmNfZ2FwX2Zyb20gfCAgICAgc2VxIG5vIC8gYmNhc3RfZ2FwX3RvICAgICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgdzM6fCAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMgbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB3NDp8ICBuZXh0IHNlbnQgYnJvYWRjYXN0L2ZyYWdtIG5vIHwgbmV4dCBzZW50IHBrdC8gZnJhZ20gbXNnIG5vICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHc1OnwgICAgICAgICAgc2Vzc2lvbiBubyAgICAgICAgICAgfHJzdj0wfHJ8YmVyaWR8bGluayBwcmlvfG5ldHBsfHB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgdzY6fCAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hdGluZyBub2RlICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB3Nzp8ICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIG5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHc4OnwgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0IHNlcXVlbmNlIG51bWJlciAgICAgICAgICAgICAgICAgICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgdzk6fCAgIG1zZyBjb3VudCAvIGJjYXN0IHRhZyAgICAgICB8ICAgICAgIGxpbmsgdG9sZXJhbmNlICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICBcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgLyAgICAgICAgICAgICAgICAgICAgIFVzZXIgU3BlY2lmaWMgRGF0YSAgICAgICAgICAgICAgICAgICAgICAgIC8KKyAgICAgIFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCisgICAgICBOQjogQ09OTl9NQU5BR0VSIHVzZSBkYXRhIG1lc3NhZ2UgZm9ybWF0LiBMSU5LX0NPTkZJRyBoYXMgb3duIGZvcm1hdC4KKyovICAgCisKKy8qIAorICogSW50ZXJuYWwgdXNlcnMKKyAqLworCisjZGVmaW5lICBCQ0FTVF9QUk9UT0NPTCAgICAgICA1CisjZGVmaW5lICBNU0dfQlVORExFUiAgICAgICAgICA2CisjZGVmaW5lICBMSU5LX1BST1RPQ09MICAgICAgICA3CisjZGVmaW5lICBDT05OX01BTkFHRVIgICAgICAgICA4CisjZGVmaW5lICBST1VURV9ESVNUUklCVVRPUiAgICA5CisjZGVmaW5lICBDSEFOR0VPVkVSX1BST1RPQ09MICAxMAorI2RlZmluZSAgTkFNRV9ESVNUUklCVVRPUiAgICAgMTEKKyNkZWZpbmUgIE1TR19GUkFHTUVOVEVSICAgICAgIDEyCisjZGVmaW5lICBMSU5LX0NPTkZJRyAgICAgICAgICAxMworI2RlZmluZSAgSU5UX0hfU0laRSAgICAgICAgICAgNDAKKyNkZWZpbmUgIERTQ19IX1NJWkUgICAgICAgICAgIDQwCisKKy8qIAorICogIENvbm5lY3Rpb24gbWFuYWdlbWVudCBwcm90b2NvbCBtZXNzYWdlcworICovCisKKyNkZWZpbmUgQ09OTl9QUk9CRSAgICAgICAgMAorI2RlZmluZSBDT05OX1BST0JFX1JFUExZICAxCisjZGVmaW5lIENPTk5fQUNLICAgICAgICAgIDIKKworLyogCisgKiBOYW1lIGRpc3RyaWJ1dG9yIG1lc3NhZ2VzCisgKi8KKworI2RlZmluZSBQVUJMSUNBVElPTiAgICAgICAwCisjZGVmaW5lIFdJVEhEUkFXQUwgICAgICAgIDEKKworCisvKiAKKyAqIFdvcmQgMQorICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19zZXFfZ2FwKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgMSwgMTYsIDB4ZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9zZXFfZ2FwKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pCit7CisJbXNnX3NldF9iaXRzKG0sIDEsIDE2LCAweGZmLCBuKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX3JlcV9saW5rcyhzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDEsIDE2LCAweGZmZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3JlcV9saW5rcyhzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKSAKK3sKKwltc2dfc2V0X2JpdHMobSwgMSwgMTYsIDB4ZmZmLCBuKTsKK30KKworCisvKiAKKyAqIFdvcmQgMgorICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19kZXN0X2RvbWFpbihzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ193b3JkKG0sIDIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9kZXN0X2RvbWFpbihzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKSAKK3sKKwltc2dfc2V0X3dvcmQobSwgMiwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19iY2dhcF9hZnRlcihzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDIsIDE2LCAweGZmZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9iY2dhcF9hZnRlcihzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKQoreworCW1zZ19zZXRfYml0cyhtLCAyLCAxNiwgMHhmZmZmLCBuKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2JjZ2FwX3RvKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgMiwgMCwgMHhmZmZmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfYmNnYXBfdG8oc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikgCit7CisJbXNnX3NldF9iaXRzKG0sIDIsIDAsIDB4ZmZmZiwgbik7Cit9CisKKworLyogCisgKiBXb3JkIDQKKyAqLworCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfbGFzdF9iY2FzdChzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDQsIDE2LCAweGZmZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9sYXN0X2JjYXN0KHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pCit7CisJbXNnX3NldF9iaXRzKG0sIDQsIDE2LCAweGZmZmYsIG4pOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19mcmFnbV9ubyhzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDQsIDE2LCAweGZmZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9mcmFnbV9ubyhzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKQoreworCW1zZ19zZXRfYml0cyhtLCA0LCAxNiwgMHhmZmZmLCBuKTsKK30KKworCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfbmV4dF9zZW50KHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgNCwgMCwgMHhmZmZmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbmV4dF9zZW50KHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pCit7CisJbXNnX3NldF9iaXRzKG0sIDQsIDAsIDB4ZmZmZiwgbik7Cit9CisKKworc3RhdGljIGlubGluZSB1MzIgbXNnX2xvbmdfbXNnbm8oc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCA0LCAwLCAweGZmZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9sb25nX21zZ25vKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pCit7CisJbXNnX3NldF9iaXRzKG0sIDQsIDAsIDB4ZmZmZiwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19iY19uZXRpZChzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ193b3JkKG0sIDQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9iY19uZXRpZChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBpZCkKK3sKKwltc2dfc2V0X3dvcmQobSwgNCwgaWQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfbGlua19zZWxlY3RvcihzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDQsIDAsIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9saW5rX3NlbGVjdG9yKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pCit7CisJbXNnX3NldF9iaXRzKG0sIDQsIDAsIDEsIChuICYgMSkpOworfQorCisvKiAKKyAqIFdvcmQgNQorICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19zZXNzaW9uKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgNSwgMTYsIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X3Nlc3Npb24oc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikKK3sKKwltc2dfc2V0X2JpdHMobSwgNSwgMTYsIDB4ZmZmZiwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19wcm9iZShzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDUsIDAsIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9wcm9iZShzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiB2YWwpCit7CisJbXNnX3NldF9iaXRzKG0sIDUsIDAsIDEsICh2YWwgJiAxKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciBtc2dfbmV0X3BsYW5lKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgNSwgMSwgNykgKyAnQSc7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X25ldF9wbGFuZShzdHJ1Y3QgdGlwY19tc2cgKm0sIGNoYXIgbikKK3sKKwltc2dfc2V0X2JpdHMobSwgNSwgMSwgNywgKG4gLSAnQScpKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2xpbmtwcmlvKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgNSwgNCwgMHgxZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X2xpbmtwcmlvKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pCit7CisJbXNnX3NldF9iaXRzKG0sIDUsIDQsIDB4MWYsIG4pOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfYmVhcmVyX2lkKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgNSwgOSwgMHg3KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfYmVhcmVyX2lkKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pCit7CisJbXNnX3NldF9iaXRzKG0sIDUsIDksIDB4Nywgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19yZWR1bmRhbnRfbGluayhzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDUsIDEyLCAweDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9yZWR1bmRhbnRfbGluayhzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJbXNnX3NldF9iaXRzKG0sIDUsIDEyLCAweDEsIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX2NsZWFyX3JlZHVuZGFudF9saW5rKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwltc2dfc2V0X2JpdHMobSwgNSwgMTIsIDB4MSwgMCk7Cit9CisKKworLyogCisgKiBXb3JkIDkKKyAqLworCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfbXNnY250KHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgOSwgMTYsIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X21zZ2NudChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKQoreworCW1zZ19zZXRfYml0cyhtLCA5LCAxNiwgMHhmZmZmLCBuKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2JjYXN0X3RhZyhzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDksIDE2LCAweGZmZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9iY2FzdF90YWcoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikKK3sKKwltc2dfc2V0X2JpdHMobSwgOSwgMTYsIDB4ZmZmZiwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19tYXhfcGt0KHN0cnVjdCB0aXBjX21zZyAqbSkgCit7CisJcmV0dXJuIChtc2dfYml0cyhtLCA5LCAxNiwgMHhmZmZmKSAqIDQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9tYXhfcGt0KHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pIAoreworCW1zZ19zZXRfYml0cyhtLCA5LCAxNiwgMHhmZmZmLCAobiAvIDQpKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2xpbmtfdG9sZXJhbmNlKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgOSwgMCwgMHhmZmZmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbGlua190b2xlcmFuY2Uoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikKK3sKKwltc2dfc2V0X2JpdHMobSwgOSwgMCwgMHhmZmZmLCBuKTsKK30KKworLyogCisgKiBSb3V0aW5nIHRhYmxlIG1lc3NhZ2UgZGF0YQorICovCisKKworc3RhdGljIGlubGluZSB1MzIgbXNnX3JlbW90ZV9ub2RlKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX3dvcmQobSwgbXNnX2hkcl9zeihtKS80KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfcmVtb3RlX25vZGUoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgYSkKK3sKKwltc2dfc2V0X3dvcmQobSwgbXNnX2hkcl9zeihtKS80LCBhKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXNnX2RhdGFvY3RldChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBwb3MpCit7CisJcmV0dXJuKG1zZ19kYXRhKG0pW3BvcyArIDRdICE9IDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9kYXRhb2N0ZXQoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgcG9zKQoreworCW1zZ19kYXRhKG0pW3BvcyArIDRdID0gMTsKK30KKworLyogCisgKiBTZWdtZW50YXRpb24gbWVzc2FnZSB0eXBlcworICovCisKKyNkZWZpbmUgRklSU1RfRlJBR01FTlQgICAgIDAKKyNkZWZpbmUgRlJBR01FTlQgICAgICAgICAgIDEKKyNkZWZpbmUgTEFTVF9GUkFHTUVOVCAgICAgIDIKKworLyogCisgKiBMaW5rIG1hbmFnZW1lbnQgcHJvdG9jb2wgbWVzc2FnZSB0eXBlcworICovCisKKyNkZWZpbmUgU1RBVEVfTVNHICAgICAgIDAKKyNkZWZpbmUgUkVTRVRfTVNHICAgICAgIDEKKyNkZWZpbmUgQUNUSVZBVEVfTVNHICAgIDIKKworLyogCisgKiBDaGFuZ2VvdmVyIHR1bm5lbCBtZXNzYWdlIHR5cGVzCisgKi8KKyNkZWZpbmUgRFVQTElDQVRFX01TRyAgICAwCisjZGVmaW5lIE9SSUdJTkFMX01TRyAgICAgMQorCisvKiAKKyAqIFJvdXRpbmcgdGFibGUgbWVzc2FnZSB0eXBlcworICovCisjZGVmaW5lIEVYVF9ST1VUSU5HX1RBQkxFICAgIDAKKyNkZWZpbmUgTE9DQUxfUk9VVElOR19UQUJMRSAgMQorI2RlZmluZSBTTEFWRV9ST1VUSU5HX1RBQkxFICAyCisjZGVmaW5lIFJPVVRFX0FERElUSU9OICAgICAgIDMKKyNkZWZpbmUgUk9VVEVfUkVNT1ZBTCAgICAgICAgNAorCisvKiAKKyAqIENvbmZpZyBwcm90b2NvbCBtZXNzYWdlIHR5cGVzCisgKi8KKworI2RlZmluZSBEU0NfUkVRX01TRyAgICAgICAgICAwCisjZGVmaW5lIERTQ19SRVNQX01TRyAgICAgICAgIDEKKworc3RhdGljIGlubGluZSB1MzIgbXNnX3RvdF9pbXBvcnRhbmNlKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlpZiAobGlrZWx5KG1zZ19pc2RhdGEobSkpKSB7CisJCWlmIChsaWtlbHkobXNnX29yaWdub2RlKG0pID09IHRpcGNfb3duX2FkZHIpKQorCQkJcmV0dXJuIG1zZ19pbXBvcnRhbmNlKG0pOworCQlyZXR1cm4gbXNnX2ltcG9ydGFuY2UobSkgKyA0OworCX0KKwlpZiAoKG1zZ191c2VyKG0pID09IE1TR19GUkFHTUVOVEVSKSAgJiYKKwkgICAgKG1zZ190eXBlKG0pID09IEZJUlNUX0ZSQUdNRU5UKSkKKwkJcmV0dXJuIG1zZ19pbXBvcnRhbmNlKG1zZ19nZXRfd3JhcHBlZChtKSk7CisJcmV0dXJuIG1zZ19pbXBvcnRhbmNlKG0pOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfaW5pdChzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiB1c2VyLCB1MzIgdHlwZSwgCisJCQkgICAgdTMyIGVyciwgdTMyIGhzaXplLCB1MzIgZGVzdG5vZGUpCit7CisJbWVtc2V0KG0sIDAsIGhzaXplKTsKKwltc2dfc2V0X3ZlcnNpb24obSk7CisJbXNnX3NldF91c2VyKG0sIHVzZXIpOworCW1zZ19zZXRfaGRyX3N6KG0sIGhzaXplKTsKKwltc2dfc2V0X3NpemUobSwgaHNpemUpOworCW1zZ19zZXRfcHJldm5vZGUobSwgdGlwY19vd25fYWRkcik7CisJbXNnX3NldF90eXBlKG0sIHR5cGUpOworCW1zZ19zZXRfZXJyY29kZShtLCBlcnIpOworCWlmICghbXNnX3Nob3J0KG0pKSB7CisJCW1zZ19zZXRfb3JpZ25vZGUobSwgdGlwY19vd25fYWRkcik7CisJCW1zZ19zZXRfZGVzdG5vZGUobSwgZGVzdG5vZGUpOworCX0KK30KKworLyoqIAorICogbXNnX2NhbGNfZGF0YV9zaXplIC0gZGV0ZXJtaW5lIHRvdGFsIGRhdGEgc2l6ZSBmb3IgbWVzc2FnZQorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IG1zZ19jYWxjX2RhdGFfc2l6ZShzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZ19zZWN0LCB1MzIgbnVtX3NlY3QpCit7CisJaW50IGRzeiA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3NlY3Q7IGkrKykKKwkJZHN6ICs9IG1zZ19zZWN0W2ldLmlvdl9sZW47CisJcmV0dXJuIGRzejsKK30KKworLyoqIAorICogbXNnX2J1aWxkIC0gY3JlYXRlIG1lc3NhZ2UgdXNpbmcgc3BlY2lmaWVkIGhlYWRlciBhbmQgZGF0YQorICogCisgKiBOb3RlOiBDYWxsZXIgbXVzdCBub3QgaG9sZCBhbnkgbG9ja3MgaW4gY2FzZSBjb3B5X2Zyb21fdXNlcigpIGlzIGludGVycnVwdGVkIQorICogCisgKiBSZXR1cm5zIG1lc3NhZ2UgZGF0YSBzaXplIG9yIGVycm5vCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgbXNnX2J1aWxkKHN0cnVjdCB0aXBjX21zZyAqaGRyLCAKKwkJCSAgICBzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZ19zZWN0LCB1MzIgbnVtX3NlY3QsCisJCQkgICAgaW50IG1heF9zaXplLCBpbnQgdXNybWVtLCBzdHJ1Y3Qgc2tfYnVmZioqIGJ1ZikKK3sKKwlpbnQgZHN6LCBzeiwgaHN6LCBwb3MsIHJlcywgY250OworCisJZHN6ID0gbXNnX2NhbGNfZGF0YV9zaXplKG1zZ19zZWN0LCBudW1fc2VjdCk7CisJaWYgKHVubGlrZWx5KGRzeiA+IFRJUENfTUFYX1VTRVJfTVNHX1NJWkUpKSB7CisJCSpidWYgPSBOVUxMOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwb3MgPSBoc3ogPSBtc2dfaGRyX3N6KGhkcik7CisJc3ogPSBoc3ogKyBkc3o7CisJbXNnX3NldF9zaXplKGhkciwgc3opOworCWlmICh1bmxpa2VseShzeiA+IG1heF9zaXplKSkgeworCQkqYnVmID0gTlVMTDsKKwkJcmV0dXJuIGRzejsKKwl9CisKKwkqYnVmID0gYnVmX2FjcXVpcmUoc3opOworCWlmICghKCpidWYpKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1jcHkoKCpidWYpLT5kYXRhLCAodW5jaGFyICopaGRyLCBoc3opOworCWZvciAocmVzID0gMSwgY250ID0gMDsgcmVzICYmIChjbnQgPCBudW1fc2VjdCk7IGNudCsrKSB7CisJCWlmIChsaWtlbHkodXNybWVtKSkKKwkJCXJlcyA9ICFjb3B5X2Zyb21fdXNlcigoKmJ1ZiktPmRhdGEgKyBwb3MsIAorCQkJCQkgICAgICBtc2dfc2VjdFtjbnRdLmlvdl9iYXNlLCAKKwkJCQkJICAgICAgbXNnX3NlY3RbY250XS5pb3ZfbGVuKTsKKwkJZWxzZQorCQkJbWVtY3B5KCgqYnVmKS0+ZGF0YSArIHBvcywgbXNnX3NlY3RbY250XS5pb3ZfYmFzZSwgCisJCQkgICAgICAgbXNnX3NlY3RbY250XS5pb3ZfbGVuKTsKKwkJcG9zICs9IG1zZ19zZWN0W2NudF0uaW92X2xlbjsKKwl9CisJaWYgKGxpa2VseShyZXMpKQorCQlyZXR1cm4gZHN6OworCisJYnVmX2Rpc2NhcmQoKmJ1Zik7CisJKmJ1ZiA9IE5VTEw7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X21lZGlhX2FkZHIoc3RydWN0IHRpcGNfbXNnICptLCBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphKQoreworCW1lbWNweSgmKChpbnQgKiltKVs1XSwgYSwgc2l6ZW9mKCphKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dfZ2V0X21lZGlhX2FkZHIoc3RydWN0IHRpcGNfbXNnICptLCBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphKQoreworCW1lbWNweShhLCAmKChpbnQqKW0pWzVdLCBzaXplb2YoKmEpKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9uYW1lX2Rpc3RyLmMgYi9uZXQvdGlwYy9uYW1lX2Rpc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMwZjkwOQotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL25hbWVfZGlzdHIuYwpAQCAtMCwwICsxLDMwOSBAQAorLyoKKyAqIG5ldC90aXBjL25hbWVfZGlzdHIuYzogVElQQyBuYW1lIGRpc3RyaWJ1dGlvbiBjb2RlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAiY2x1c3Rlci5oIgorI2luY2x1ZGUgImRiZy5oIgorI2luY2x1ZGUgImxpbmsuaCIKKyNpbmNsdWRlICJtc2cuaCIKKyNpbmNsdWRlICJuYW1lX2Rpc3RyLmgiCisKKyN1bmRlZiAgREJHX09VVFBVVAorI2RlZmluZSBEQkdfT1VUUFVUIE5VTEwKKworI2RlZmluZSBJVEVNX1NJWkUgc2l6ZW9mKHN0cnVjdCBkaXN0cl9pdGVtKQorCisvKioKKyAqIHN0cnVjdCBkaXN0cl9pdGVtIC0gcHVibGljYXRpb24gaW5mbyBkaXN0cmlidXRlZCB0byBvdGhlciBub2RlcworICogQHR5cGU6IG5hbWUgc2VxdWVuY2UgdHlwZQorICogQGxvd2VyOiBuYW1lIHNlcXVlbmNlIGxvd2VyIGJvdW5kCisgKiBAdXBwZXI6IG5hbWUgc2VxdWVuY2UgdXBwZXIgYm91bmQKKyAqIEByZWY6IHB1Ymxpc2hpbmcgcG9ydCByZWZlcmVuY2UKKyAqIEBrZXk6IHB1YmxpY2F0aW9uIGtleQorICogCisgKiA9PT0+IEFsbCBmaWVsZHMgYXJlIHN0b3JlZCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuIDw9PT0KKyAqIAorICogRmlyc3QgMyBmaWVsZHMgaWRlbnRpZnkgKG5hbWUgb3IpIG5hbWUgc2VxdWVuY2UgYmVpbmcgcHVibGlzaGVkLgorICogUmVmZXJlbmNlIGZpZWxkIHVuaXF1ZWx5IGlkZW50aWZpZXMgcG9ydCB0aGF0IHB1Ymxpc2hlZCBuYW1lIHNlcXVlbmNlLgorICogS2V5IGZpZWxkIHVuaXF1ZWx5IGlkZW50aWZpZXMgcHVibGljYXRpb24sIGluIHRoZSBldmVudCBhIHBvcnQgaGFzCisgKiBtdWx0aXBsZSBwdWJsaWNhdGlvbnMgb2YgdGhlIHNhbWUgbmFtZSBzZXF1ZW5jZS4KKyAqIAorICogTm90ZTogVGhlcmUgaXMgbm8gZmllbGQgdGhhdCBpZGVudGlmaWVzIHRoZSBwdWJsaXNoaW5nIG5vZGUgYmVjYXVzZSBpdCBpcyAKKyAqIHRoZSBzYW1lIGZvciBhbGwgaXRlbXMgY29udGFpbmVkIHdpdGhpbiBhIHB1YmxpY2F0aW9uIG1lc3NhZ2UuCisgKi8KKworc3RydWN0IGRpc3RyX2l0ZW0geworCXUzMiB0eXBlOworCXUzMiBsb3dlcjsKKwl1MzIgdXBwZXI7CisJdTMyIHJlZjsKKwl1MzIga2V5OworfTsKKworLyoqCisgKiBMaXN0IG9mIGV4dGVybmFsbHkgdmlzaWJsZSBwdWJsaWNhdGlvbnMgYnkgdGhpcyBub2RlIC0tIAorICogdGhhdCBpcywgYWxsIHB1YmxpY2F0aW9ucyBoYXZpbmcgc2NvcGUgPiBUSVBDX05PREVfU0NPUEUuCisgKi8KKworc3RhdGljIExJU1RfSEVBRChwdWJsX3Jvb3QpOworc3RhdGljIHUzMiBwdWJsX2NudCA9IDA7CQkKKworLyoqCisgKiBwdWJsX3RvX2l0ZW0gLSBhZGQgcHVibGljYXRpb24gaW5mbyB0byBhIHB1YmxpY2F0aW9uIG1lc3NhZ2UKKyAqLworCitzdGF0aWMgdm9pZCBwdWJsX3RvX2l0ZW0oc3RydWN0IGRpc3RyX2l0ZW0gKmksIHN0cnVjdCBwdWJsaWNhdGlvbiAqcCkKK3sKKwlpLT50eXBlID0gaHRvbmwocC0+dHlwZSk7CisJaS0+bG93ZXIgPSBodG9ubChwLT5sb3dlcik7CisJaS0+dXBwZXIgPSBodG9ubChwLT51cHBlcik7CisJaS0+cmVmID0gaHRvbmwocC0+cmVmKTsKKwlpLT5rZXkgPSBodG9ubChwLT5rZXkpOworCWRiZygicHVibF90b19pdGVtOiAldSwgJXUsICV1XG4iLCBwLT50eXBlLCBwLT5sb3dlciwgcC0+dXBwZXIpOworfQorCisvKioKKyAqIG5hbWVkX3ByZXBhcmVfYnVmIC0gYWxsb2NhdGUgJiBpbml0aWFsaXplIGEgcHVibGljYXRpb24gbWVzc2FnZQorICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqbmFtZWRfcHJlcGFyZV9idWYodTMyIHR5cGUsIHUzMiBzaXplLCB1MzIgZGVzdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gYnVmX2FjcXVpcmUoTE9OR19IX1NJWkUgKyBzaXplKTsgIAorCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCisJaWYgKGJ1ZiAhPSBOVUxMKSB7CisJCW1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJbXNnX2luaXQobXNnLCBOQU1FX0RJU1RSSUJVVE9SLCB0eXBlLCBUSVBDX09LLCAKKwkJCSBMT05HX0hfU0laRSwgZGVzdCk7CisJCW1zZ19zZXRfc2l6ZShtc2csIExPTkdfSF9TSVpFICsgc2l6ZSk7CisJfQorCXJldHVybiBidWY7Cit9CisKKy8qKgorICogdGlwY19uYW1lZF9wdWJsaXNoIC0gdGVsbCBvdGhlciBub2RlcyBhYm91dCBhIG5ldyBwdWJsaWNhdGlvbiBieSB0aGlzIG5vZGUKKyAqLworCit2b2lkIHRpcGNfbmFtZWRfcHVibGlzaChzdHJ1Y3QgcHVibGljYXRpb24gKnB1YmwpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3QgZGlzdHJfaXRlbSAqaXRlbTsKKworCWxpc3RfYWRkKCZwdWJsLT5sb2NhbF9saXN0LCAmcHVibF9yb290KTsKKwlwdWJsX2NudCsrOworCisJYnVmID0gbmFtZWRfcHJlcGFyZV9idWYoUFVCTElDQVRJT04sIElURU1fU0laRSwgMCk7CisJaWYgKCFidWYpIHsKKwkJd2FybigiTWVtb3J5IHNxdWVlemU7IGZhaWxlZCB0byBkaXN0cmlidXRlIHB1YmxpY2F0aW9uXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWl0ZW0gPSAoc3RydWN0IGRpc3RyX2l0ZW0gKiltc2dfZGF0YShidWZfbXNnKGJ1ZikpOworCXB1YmxfdG9faXRlbShpdGVtLCBwdWJsKTsKKwlkYmcoInRpcGNfbmFtZWRfd2l0aGRyYXc6IGJyb2FkY2FzdGluZyBwdWJsaXNoIG1zZ1xuIik7CisJdGlwY19jbHRyX2Jyb2FkY2FzdChidWYpOworfQorCisvKioKKyAqIHRpcGNfbmFtZWRfd2l0aGRyYXcgLSB0ZWxsIG90aGVyIG5vZGVzIGFib3V0IGEgd2l0aGRyYXduIHB1YmxpY2F0aW9uIGJ5IHRoaXMgbm9kZQorICovCisKK3ZvaWQgdGlwY19uYW1lZF93aXRoZHJhdyhzdHJ1Y3QgcHVibGljYXRpb24gKnB1YmwpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3QgZGlzdHJfaXRlbSAqaXRlbTsKKworCWxpc3RfZGVsKCZwdWJsLT5sb2NhbF9saXN0KTsKKwlwdWJsX2NudC0tOworCisJYnVmID0gbmFtZWRfcHJlcGFyZV9idWYoV0lUSERSQVdBTCwgSVRFTV9TSVpFLCAwKTsKKwlpZiAoIWJ1ZikgeworCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgZmFpbGVkIHRvIGRpc3RyaWJ1dGUgd2l0aGRyYXdhbFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpdGVtID0gKHN0cnVjdCBkaXN0cl9pdGVtICopbXNnX2RhdGEoYnVmX21zZyhidWYpKTsKKwlwdWJsX3RvX2l0ZW0oaXRlbSwgcHVibCk7CisJZGJnKCJ0aXBjX25hbWVkX3dpdGhkcmF3OiBicm9hZGNhc3Rpbmcgd2l0aGRyYXcgbXNnXG4iKTsKKwl0aXBjX2NsdHJfYnJvYWRjYXN0KGJ1Zik7Cit9CisKKy8qKgorICogdGlwY19uYW1lZF9ub2RlX3VwIC0gdGVsbCBzcGVjaWZpZWQgbm9kZSBhYm91dCBhbGwgcHVibGljYXRpb25zIGJ5IHRoaXMgbm9kZQorICovCisKK3ZvaWQgdGlwY19uYW1lZF9ub2RlX3VwKHVuc2lnbmVkIGxvbmcgbm9kZSkKK3sKKwlzdHJ1Y3QgcHVibGljYXRpb24gKnB1Ymw7CisJc3RydWN0IGRpc3RyX2l0ZW0gKml0ZW0gPSAwOworCXN0cnVjdCBza19idWZmICpidWYgPSAwOworCXUzMiBsZWZ0ID0gMDsKKwl1MzIgcmVzdDsKKwl1MzIgbWF4X2l0ZW1fYnVmOworCisJYXNzZXJ0KGluX293bl9jbHVzdGVyKG5vZGUpKTsKKwlyZWFkX2xvY2tfYmgoJnRpcGNfbmFtZXRibF9sb2NrKTsgCisJbWF4X2l0ZW1fYnVmID0gVElQQ19NQVhfVVNFUl9NU0dfU0laRSAvIElURU1fU0laRTsKKwltYXhfaXRlbV9idWYgKj0gSVRFTV9TSVpFOworCXJlc3QgPSBwdWJsX2NudCAqIElURU1fU0laRTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocHVibCwgJnB1Ymxfcm9vdCwgbG9jYWxfbGlzdCkgeworCQlpZiAoIWJ1ZikgeworCQkJbGVmdCA9IChyZXN0IDw9IG1heF9pdGVtX2J1ZikgPyByZXN0IDogbWF4X2l0ZW1fYnVmOworCQkJcmVzdCAtPSBsZWZ0OworCQkJYnVmID0gbmFtZWRfcHJlcGFyZV9idWYoUFVCTElDQVRJT04sIGxlZnQsIG5vZGUpOyAgICAgICAKKwkJCWlmIChidWYgPT0gTlVMTCkgeworCQkJCXdhcm4oIk1lbW9yeSBTcXVlZXplOyBjb3VsZCBub3Qgc2VuZCBwdWJsaWNhdGlvblxuIik7CisJCQkJZ290byBleGl0OworCQkJfQorCQkJaXRlbSA9IChzdHJ1Y3QgZGlzdHJfaXRlbSAqKW1zZ19kYXRhKGJ1Zl9tc2coYnVmKSk7CisJCX0KKwkJcHVibF90b19pdGVtKGl0ZW0sIHB1YmwpOworCQlpdGVtKys7CisJCWxlZnQgLT0gSVRFTV9TSVpFOworCQlpZiAoIWxlZnQpIHsKKwkJCW1zZ19zZXRfbGlua19zZWxlY3RvcihidWZfbXNnKGJ1ZiksIG5vZGUpOworCQkJZGJnKCJ0aXBjX25hbWVkX25vZGVfdXA6IHNlbmRpbmcgcHVibGlzaCBtc2cgdG8gIgorCQkJICAgICI8JXUuJXUuJXU+XG4iLCB0aXBjX3pvbmUobm9kZSksIAorCQkJICAgIHRpcGNfY2x1c3Rlcihub2RlKSwgdGlwY19ub2RlKG5vZGUpKTsKKwkJCXRpcGNfbGlua19zZW5kKGJ1Ziwgbm9kZSwgbm9kZSk7CisJCQlidWYgPSAwOworCQl9CisJfQorZXhpdDoKKwlyZWFkX3VubG9ja19iaCgmdGlwY19uYW1ldGJsX2xvY2spOyAKK30KKworLyoqCisgKiBub2RlX2lzX2Rvd24gLSByZW1vdmUgcHVibGljYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgZmFpbGVkIG5vZGUKKyAqIAorICogSW52b2tlZCBmb3IgZWFjaCBwdWJsaWNhdGlvbiBpc3N1ZWQgYnkgYSBuZXdseSBmYWlsZWQgbm9kZS4gIAorICogUmVtb3ZlcyBwdWJsaWNhdGlvbiBzdHJ1Y3R1cmUgZnJvbSBuYW1lIHRhYmxlICYgZGVsZXRlcyBpdC4KKyAqIEluIHJhcmUgY2FzZXMgdGhlIGxpbmsgbWF5IGhhdmUgY29tZSBiYWNrIHVwIGFnYWluIHdoZW4gdGhpcworICogZnVuY3Rpb24gaXMgY2FsbGVkLCBhbmQgd2UgaGF2ZSB0d28gaXRlbXMgcmVwcmVzZW50aW5nIHRoZSBzYW1lCisgKiBwdWJsaWNhdGlvbi4gTnVkZ2UgdGhpcyBpdGVtJ3Mga2V5IHRvIGRpc3Rpbmd1aXNoIGl0IGZyb20gdGhlIG90aGVyLgorICogKE5vdGU6IFB1YmxpY2F0aW9uJ3Mgbm9kZSBzdWJzY3JpcHRpb24gaXMgYWxyZWFkeSB1bnN1YnNjcmliZWQuKQorICovCisKK3N0YXRpYyB2b2lkIG5vZGVfaXNfZG93bihzdHJ1Y3QgcHVibGljYXRpb24gKnB1YmwpCit7CisJc3RydWN0IHB1YmxpY2F0aW9uICpwOworICAgICAgICB3cml0ZV9sb2NrX2JoKCZ0aXBjX25hbWV0YmxfbG9jayk7CisJZGJnKCJub2RlX2lzX2Rvd246IHdpdGhkcmF3aW5nICV1LCAldSwgJXVcbiIsIAorCSAgICBwdWJsLT50eXBlLCBwdWJsLT5sb3dlciwgcHVibC0+dXBwZXIpOworICAgICAgICBwdWJsLT5rZXkgKz0gMTIyMjM0NTsKKwlwID0gdGlwY19uYW1ldGJsX3JlbW92ZV9wdWJsKHB1YmwtPnR5cGUsIHB1YmwtPmxvd2VyLCAKKwkJCQkgICAgIHB1YmwtPm5vZGUsIHB1YmwtPnJlZiwgcHVibC0+a2V5KTsKKyAgICAgICAgYXNzZXJ0KHAgPT0gcHVibCk7CisJd3JpdGVfdW5sb2NrX2JoKCZ0aXBjX25hbWV0YmxfbG9jayk7CisJaWYgKHB1YmwpCisJCWtmcmVlKHB1YmwpOworfQorCisvKioKKyAqIHRpcGNfbmFtZWRfcmVjdiAtIHByb2Nlc3MgbmFtZSB0YWJsZSB1cGRhdGUgbWVzc2FnZSBzZW50IGJ5IGFub3RoZXIgbm9kZQorICovCisKK3ZvaWQgdGlwY19uYW1lZF9yZWN2KHN0cnVjdCBza19idWZmICpidWYpCit7CisJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsOworCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOworCXN0cnVjdCBkaXN0cl9pdGVtICppdGVtID0gKHN0cnVjdCBkaXN0cl9pdGVtICopbXNnX2RhdGEobXNnKTsKKwl1MzIgY291bnQgPSBtc2dfZGF0YV9zeihtc2cpIC8gSVRFTV9TSVpFOworCisJd3JpdGVfbG9ja19iaCgmdGlwY19uYW1ldGJsX2xvY2spOyAKKwl3aGlsZSAoY291bnQtLSkgeworCQlpZiAobXNnX3R5cGUobXNnKSA9PSBQVUJMSUNBVElPTikgeworCQkJZGJnKCJ0aXBjX25hbWVkX3JlY3Y6IGdvdCBwdWJsaWNhdGlvbiBmb3IgJXUsICV1LCAldVxuIiwgCisJCQkgICAgbnRvaGwoaXRlbS0+dHlwZSksIG50b2hsKGl0ZW0tPmxvd2VyKSwKKwkJCSAgICBudG9obChpdGVtLT51cHBlcikpOworCQkJcHVibCA9IHRpcGNfbmFtZXRibF9pbnNlcnRfcHVibChudG9obChpdGVtLT50eXBlKSwgCisJCQkJCQkJbnRvaGwoaXRlbS0+bG93ZXIpLAorCQkJCQkJCW50b2hsKGl0ZW0tPnVwcGVyKSwKKwkJCQkJCQlUSVBDX0NMVVNURVJfU0NPUEUsCisJCQkJCQkJbXNnX29yaWdub2RlKG1zZyksIAorCQkJCQkJCW50b2hsKGl0ZW0tPnJlZiksCisJCQkJCQkJbnRvaGwoaXRlbS0+a2V5KSk7CisJCQlpZiAocHVibCkgeworCQkJCXRpcGNfbm9kZXN1Yl9zdWJzY3JpYmUoJnB1YmwtPnN1YnNjciwgCisJCQkJCQkgICAgICAgbXNnX29yaWdub2RlKG1zZyksIAorCQkJCQkJICAgICAgIHB1YmwsCisJCQkJCQkgICAgICAgKG5ldF9ldl9oYW5kbGVyKW5vZGVfaXNfZG93bik7CisJCQl9CisJCX0gZWxzZSBpZiAobXNnX3R5cGUobXNnKSA9PSBXSVRIRFJBV0FMKSB7CisJCQlkYmcoInRpcGNfbmFtZWRfcmVjdjogZ290IHdpdGhkcmF3bCBmb3IgJXUsICV1LCAldVxuIiwgCisJCQkgICAgbnRvaGwoaXRlbS0+dHlwZSksIG50b2hsKGl0ZW0tPmxvd2VyKSwKKwkJCSAgICBudG9obChpdGVtLT51cHBlcikpOworCQkJcHVibCA9IHRpcGNfbmFtZXRibF9yZW1vdmVfcHVibChudG9obChpdGVtLT50eXBlKSwKKwkJCQkJCQludG9obChpdGVtLT5sb3dlciksCisJCQkJCQkJbXNnX29yaWdub2RlKG1zZyksCisJCQkJCQkJbnRvaGwoaXRlbS0+cmVmKSwKKwkJCQkJCQludG9obChpdGVtLT5rZXkpKTsKKworCQkJaWYgKHB1YmwpIHsKKwkJCQl0aXBjX25vZGVzdWJfdW5zdWJzY3JpYmUoJnB1YmwtPnN1YnNjcik7CisgICAgICAgIAkJCWtmcmVlKHB1YmwpOworCQkJfQorCQl9IGVsc2UgeworCQkJd2FybigidGlwY19uYW1lZF9yZWN2OiB1bmtub3duIG1zZ1xuIik7CisJCX0KKwkJaXRlbSsrOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJnRpcGNfbmFtZXRibF9sb2NrKTsgCisJYnVmX2Rpc2NhcmQoYnVmKTsKK30KKworLyoqCisgKiB0aXBjX25hbWVkX3JlaW5pdCAtIHJlLWluaXRpYWxpemUgbG9jYWwgcHVibGljYXRpb24gbGlzdAorICogCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW5ldmVyIFRJUEMgbmV0d29ya2luZyBpcyAocmUpZW5hYmxlZC4KKyAqIEFsbCBleGlzdGluZyBwdWJsaWNhdGlvbnMgYnkgdGhpcyBub2RlIHRoYXQgaGF2ZSAiY2x1c3RlciIgb3IgInpvbmUiIHNjb3BlCisgKiBhcmUgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBub2RlJ3MgY3VycmVudCBuZXR3b3JrIGFkZHJlc3MuCisgKiAoSWYgdGhlIG5vZGUncyBhZGRyZXNzIGlzIHVuY2hhbmdlZCwgdGhlIHVwZGF0ZSBsb29wIHRlcm1pbmF0ZXMgaW1tZWRpYXRlbHkuKQorICovCisKK3ZvaWQgdGlwY19uYW1lZF9yZWluaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHVibGljYXRpb24gKnB1Ymw7CisKKwl3cml0ZV9sb2NrX2JoKCZ0aXBjX25hbWV0YmxfbG9jayk7IAorCWxpc3RfZm9yX2VhY2hfZW50cnkocHVibCwgJnB1Ymxfcm9vdCwgbG9jYWxfbGlzdCkgeworCQlpZiAocHVibC0+bm9kZSA9PSB0aXBjX293bl9hZGRyKQorCQkJYnJlYWs7CisJCXB1YmwtPm5vZGUgPSB0aXBjX293bl9hZGRyOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJnRpcGNfbmFtZXRibF9sb2NrKTsgCit9CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9uYW1lX2Rpc3RyLmggYi9uZXQvdGlwYy9uYW1lX2Rpc3RyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzZGEwMQotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL25hbWVfZGlzdHIuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogbmV0L3RpcGMvbmFtZV9kaXN0ci5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgbmFtZSBkaXN0cmlidXRpb24gY29kZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX05BTUVfRElTVFJfSAorI2RlZmluZSBfVElQQ19OQU1FX0RJU1RSX0gKKworI2luY2x1ZGUgIm5hbWVfdGFibGUuaCIKKwordm9pZCB0aXBjX25hbWVkX3B1Ymxpc2goc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsKTsKK3ZvaWQgdGlwY19uYW1lZF93aXRoZHJhdyhzdHJ1Y3QgcHVibGljYXRpb24gKnB1YmwpOwordm9pZCB0aXBjX25hbWVkX25vZGVfdXAodW5zaWduZWQgbG9uZyBub2RlKTsKK3ZvaWQgdGlwY19uYW1lZF9yZWN2KHN0cnVjdCBza19idWZmICpidWYpOwordm9pZCB0aXBjX25hbWVkX3JlaW5pdCh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9uYW1lX3RhYmxlLmMgYi9uZXQvdGlwYy9uYW1lX3RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y0YjIzYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL25hbWVfdGFibGUuYwpAQCAtMCwwICsxLDEwNzkgQEAKKy8qCisgKiBuZXQvdGlwYy9uYW1lX3RhYmxlLmM6IFRJUEMgbmFtZSB0YWJsZSBjb2RlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJkYmcuaCIKKyNpbmNsdWRlICJuYW1lX3RhYmxlLmgiCisjaW5jbHVkZSAibmFtZV9kaXN0ci5oIgorI2luY2x1ZGUgImFkZHIuaCIKKyNpbmNsdWRlICJub2RlX3N1YnNjci5oIgorI2luY2x1ZGUgInN1YnNjci5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJjbHVzdGVyLmgiCisjaW5jbHVkZSAiYmNhc3QuaCIKKworaW50IHRpcGNfbmFtZXRibF9zaXplID0gMTAyNDsJCS8qIG11c3QgYmUgYSBwb3dlciBvZiAyICovCisKKy8qKgorICogc3RydWN0IHN1Yl9zZXEgLSBjb250YWluZXIgZm9yIGFsbCBwdWJsaXNoZWQgaW5zdGFuY2VzIG9mIGEgbmFtZSBzZXF1ZW5jZQorICogQGxvd2VyOiBuYW1lIHNlcXVlbmNlIGxvd2VyIGJvdW5kCisgKiBAdXBwZXI6IG5hbWUgc2VxdWVuY2UgdXBwZXIgYm91bmQKKyAqIEBub2RlX2xpc3Q6IGNpcmN1bGFyIGxpc3Qgb2YgbWF0Y2hpbmcgcHVibGljYXRpb25zIHdpdGggPj0gbm9kZSBzY29wZQorICogQGNsdXN0ZXJfbGlzdDogY2lyY3VsYXIgbGlzdCBvZiBtYXRjaGluZyBwdWJsaWNhdGlvbnMgd2l0aCA+PSBjbHVzdGVyIHNjb3BlCisgKiBAem9uZV9saXN0OiBjaXJjdWxhciBsaXN0IG9mIG1hdGNoaW5nIHB1YmxpY2F0aW9ucyB3aXRoID49IHpvbmUgc2NvcGUKKyAqLworCitzdHJ1Y3Qgc3ViX3NlcSB7CisJdTMyIGxvd2VyOworCXUzMiB1cHBlcjsKKwlzdHJ1Y3QgcHVibGljYXRpb24gKm5vZGVfbGlzdDsKKwlzdHJ1Y3QgcHVibGljYXRpb24gKmNsdXN0ZXJfbGlzdDsKKwlzdHJ1Y3QgcHVibGljYXRpb24gKnpvbmVfbGlzdDsKK307CisKKy8qKiAKKyAqIHN0cnVjdCBuYW1lX3NlcSAtIGNvbnRhaW5lciBmb3IgYWxsIHB1Ymxpc2hlZCBpbnN0YW5jZXMgb2YgYSBuYW1lIHR5cGUKKyAqIEB0eXBlOiAzMiBiaXQgJ3R5cGUnIHZhbHVlIGZvciBuYW1lIHNlcXVlbmNlCisgKiBAc3NlcTogcG9pbnRlciB0byBkeW5hbWljYWxseS1zaXplZCBhcnJheSBvZiBzdWItc2VxdWVuY2VzIG9mIHRoaXMgJ3R5cGUnOworICogICAgICAgIHN1Yi1zZXF1ZW5jZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIKKyAqIEBhbGxvYzogbnVtYmVyIG9mIHN1Yi1zZXF1ZW5jZXMgY3VycmVudGx5IGluIGFycmF5CisgKiBAZmlyc3RfZnJlZTogdXBwZXIgYm91bmQgb2YgaGlnaGVzdCBzdWItc2VxdWVuY2UgKyAxCisgKiBAbnNfbGlzdDogbGlua3MgdG8gYWRqYWNlbnQgbmFtZSBzZXF1ZW5jZXMgaW4gaGFzaCBjaGFpbgorICogQHN1YnNjcmlwdGlvbnM6IGxpc3Qgb2Ygc3Vic2NyaXB0aW9ucyBmb3IgdGhpcyAndHlwZScKKyAqIEBsb2NrOiBzcGlubG9jayBjb250cm9sbGluZyBhY2Nlc3MgdG8gbmFtZSBzZXF1ZW5jZSBzdHJ1Y3R1cmUKKyAqLworCitzdHJ1Y3QgbmFtZV9zZXEgeworCXUzMiB0eXBlOworCXN0cnVjdCBzdWJfc2VxICpzc2VxczsKKwl1MzIgYWxsb2M7CisJdTMyIGZpcnN0X2ZyZWU7CisJc3RydWN0IGhsaXN0X25vZGUgbnNfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN1YnNjcmlwdGlvbnM7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworLyoqCisgKiBzdHJ1Y3QgbmFtZV90YWJsZSAtIHRhYmxlIGNvbnRhaW5pbmcgYWxsIGV4aXN0aW5nIHBvcnQgbmFtZSBwdWJsaWNhdGlvbnMKKyAqIEB0eXBlczogcG9pbnRlciB0byBmaXhlZC1zaXplZCBhcnJheSBvZiBuYW1lIHNlcXVlbmNlIGxpc3RzLCAKKyAqICAgICAgICAgYWNjZXNzZWQgdmlhIGhhc2hpbmcgb24gJ3R5cGUnOyBuYW1lIHNlcXVlbmNlIGxpc3RzIGFyZSAqbm90KiBzb3J0ZWQKKyAqIEBsb2NhbF9wdWJsX2NvdW50OiBudW1iZXIgb2YgcHVibGljYXRpb25zIGlzc3VlZCBieSB0aGlzIG5vZGUKKyAqLworCitzdHJ1Y3QgbmFtZV90YWJsZSB7CisJc3RydWN0IGhsaXN0X2hlYWQgKnR5cGVzOworCXUzMiBsb2NhbF9wdWJsX2NvdW50OworfTsKKworc3RhdGljIHN0cnVjdCBuYW1lX3RhYmxlIHRhYmxlID0geyBOVUxMIH0gOworc3RhdGljIGF0b21pY190IHJzdl9wdWJsX29rID0gQVRPTUlDX0lOSVQoMCk7Cityd2xvY2tfdCB0aXBjX25hbWV0YmxfbG9jayA9IFJXX0xPQ0tfVU5MT0NLRUQ7CisKKworc3RhdGljIGlubGluZSBpbnQgaGFzaChpbnQgeCkKK3sKKwlyZXR1cm4oeCAmICh0aXBjX25hbWV0Ymxfc2l6ZSAtIDEpKTsKK30KKworLyoqCisgKiBwdWJsX2NyZWF0ZSAtIGNyZWF0ZSBhIHB1YmxpY2F0aW9uIHN0cnVjdHVyZQorICovCisKK3N0YXRpYyBzdHJ1Y3QgcHVibGljYXRpb24gKnB1YmxfY3JlYXRlKHUzMiB0eXBlLCB1MzIgbG93ZXIsIHUzMiB1cHBlciwgCisJCQkJICAgICAgIHUzMiBzY29wZSwgdTMyIG5vZGUsIHUzMiBwb3J0X3JlZiwgICAKKwkJCQkgICAgICAgdTMyIGtleSkKK3sKKwlzdHJ1Y3QgcHVibGljYXRpb24gKnB1YmwgPQorCQkoc3RydWN0IHB1YmxpY2F0aW9uICopa21hbGxvYyhzaXplb2YoKnB1YmwpLCBHRlBfQVRPTUlDKTsKKwlpZiAocHVibCA9PSBOVUxMKSB7CisJCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBmYWlsZWQgdG8gY3JlYXRlIHB1YmxpY2F0aW9uXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWVtc2V0KHB1YmwsIDAsIHNpemVvZigqcHVibCkpOworCXB1YmwtPnR5cGUgPSB0eXBlOworCXB1YmwtPmxvd2VyID0gbG93ZXI7CisJcHVibC0+dXBwZXIgPSB1cHBlcjsKKwlwdWJsLT5zY29wZSA9IHNjb3BlOworCXB1YmwtPm5vZGUgPSBub2RlOworCXB1YmwtPnJlZiA9IHBvcnRfcmVmOworCXB1YmwtPmtleSA9IGtleTsKKwlJTklUX0xJU1RfSEVBRCgmcHVibC0+bG9jYWxfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnB1YmwtPnBwb3J0X2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZwdWJsLT5zdWJzY3Iubm9kZXN1Yl9saXN0KTsKKwlyZXR1cm4gcHVibDsKK30KKworLyoqCisgKiB0aXBjX3N1YnNlcV9hbGxvYyAtIGFsbG9jYXRlIGEgc3BlY2lmaWVkIG51bWJlciBvZiBzdWItc2VxdWVuY2Ugc3RydWN0dXJlcworICovCisKK3N0cnVjdCBzdWJfc2VxICp0aXBjX3N1YnNlcV9hbGxvYyh1MzIgY250KQoreworCXUzMiBzeiA9IGNudCAqIHNpemVvZihzdHJ1Y3Qgc3ViX3NlcSk7CisJc3RydWN0IHN1Yl9zZXEgKnNzZXEgPSAoc3RydWN0IHN1Yl9zZXEgKilrbWFsbG9jKHN6LCBHRlBfQVRPTUlDKTsKKworCWlmIChzc2VxKQorCQltZW1zZXQoc3NlcSwgMCwgc3opOworCXJldHVybiBzc2VxOworfQorCisvKioKKyAqIHRpcGNfbmFtZXNlcV9jcmVhdGUgLSBjcmVhdGUgYSBuYW1lIHNlcXVlbmNlIHN0cnVjdHVyZSBmb3IgdGhlIHNwZWNpZmllZCAndHlwZScKKyAqIAorICogQWxsb2NhdGVzIGEgc2luZ2xlIHN1Yi1zZXF1ZW5jZSBzdHJ1Y3R1cmUgYW5kIHNldHMgaXQgdG8gYWxsIDAncy4KKyAqLworCitzdHJ1Y3QgbmFtZV9zZXEgKnRpcGNfbmFtZXNlcV9jcmVhdGUodTMyIHR5cGUsIHN0cnVjdCBobGlzdF9oZWFkICpzZXFfaGVhZCkKK3sKKwlzdHJ1Y3QgbmFtZV9zZXEgKm5zZXEgPSAKKwkJKHN0cnVjdCBuYW1lX3NlcSAqKWttYWxsb2Moc2l6ZW9mKCpuc2VxKSwgR0ZQX0FUT01JQyk7CisJc3RydWN0IHN1Yl9zZXEgKnNzZXEgPSB0aXBjX3N1YnNlcV9hbGxvYygxKTsKKworCWlmICghbnNlcSB8fCAhc3NlcSkgeworCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgZmFpbGVkIHRvIGNyZWF0ZSBuYW1lIHNlcXVlbmNlXG4iKTsKKwkJa2ZyZWUobnNlcSk7CisJCWtmcmVlKHNzZXEpOworCQlyZXR1cm4gMDsKKwl9CisKKwltZW1zZXQobnNlcSwgMCwgc2l6ZW9mKCpuc2VxKSk7CisJbnNlcS0+bG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKwluc2VxLT50eXBlID0gdHlwZTsKKwluc2VxLT5zc2VxcyA9IHNzZXE7CisJZGJnKCJ0aXBjX25hbWVzZXFfY3JlYXRlKCkgbnNlcSA9ICV4IHR5cGUgJXUsIHNzc2VxcyAleCwgZmY6ICV1XG4iLAorCSAgICBuc2VxLCB0eXBlLCBuc2VxLT5zc2VxcywgbnNlcS0+Zmlyc3RfZnJlZSk7CisJbnNlcS0+YWxsb2MgPSAxOworCUlOSVRfSExJU1RfTk9ERSgmbnNlcS0+bnNfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJm5zZXEtPnN1YnNjcmlwdGlvbnMpOworCWhsaXN0X2FkZF9oZWFkKCZuc2VxLT5uc19saXN0LCBzZXFfaGVhZCk7CisJcmV0dXJuIG5zZXE7Cit9CisKKy8qKgorICogbmFtZXNlcV9maW5kX3N1YnNlcSAtIGZpbmQgc3ViLXNlcXVlbmNlIChpZiBhbnkpIG1hdGNoaW5nIGEgbmFtZSBpbnN0YW5jZQorICogIAorICogVmVyeSB0aW1lLWNyaXRpY2FsLCBzbyBiaW5hcnkgc2VhcmNoZXMgdGhyb3VnaCBzdWItc2VxdWVuY2UgYXJyYXkuCisgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3ViX3NlcSAqbmFtZXNlcV9maW5kX3N1YnNlcShzdHJ1Y3QgbmFtZV9zZXEgKm5zZXEsIAorCQkJCQkJICB1MzIgaW5zdGFuY2UpCit7CisJc3RydWN0IHN1Yl9zZXEgKnNzZXFzID0gbnNlcS0+c3NlcXM7CisJaW50IGxvdyA9IDA7CisJaW50IGhpZ2ggPSBuc2VxLT5maXJzdF9mcmVlIC0gMTsKKwlpbnQgbWlkOworCisJd2hpbGUgKGxvdyA8PSBoaWdoKSB7CisJCW1pZCA9IChsb3cgKyBoaWdoKSAvIDI7CisJCWlmIChpbnN0YW5jZSA8IHNzZXFzW21pZF0ubG93ZXIpCisJCQloaWdoID0gbWlkIC0gMTsKKwkJZWxzZSBpZiAoaW5zdGFuY2UgPiBzc2Vxc1ttaWRdLnVwcGVyKQorCQkJbG93ID0gbWlkICsgMTsKKwkJZWxzZQorCQkJcmV0dXJuICZzc2Vxc1ttaWRdOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBuYW1lc2VxX2xvY2F0ZV9zdWJzZXEgLSBkZXRlcm1pbmUgcG9zaXRpb24gb2YgbmFtZSBpbnN0YW5jZSBpbiBzdWItc2VxdWVuY2UKKyAqIAorICogUmV0dXJucyBpbmRleCBpbiBzdWItc2VxdWVuY2UgYXJyYXkgb2YgdGhlIGVudHJ5IHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZAorICogaW5zdGFuY2UgdmFsdWU7IGlmIG5vIGVudHJ5IGNvbnRhaW5zIHRoYXQgdmFsdWUsIHJldHVybnMgdGhlIHBvc2l0aW9uCisgKiB3aGVyZSBhIG5ldyBlbnRyeSBmb3IgaXQgd291bGQgYmUgaW5zZXJ0ZWQgaW4gdGhlIGFycmF5LgorICoKKyAqIE5vdGU6IFNpbWlsYXIgdG8gYmluYXJ5IHNlYXJjaCBjb2RlIGZvciBsb2NhdGluZyBhIHN1Yi1zZXF1ZW5jZS4KKyAqLworCitzdGF0aWMgdTMyIG5hbWVzZXFfbG9jYXRlX3N1YnNlcShzdHJ1Y3QgbmFtZV9zZXEgKm5zZXEsIHUzMiBpbnN0YW5jZSkKK3sKKwlzdHJ1Y3Qgc3ViX3NlcSAqc3NlcXMgPSBuc2VxLT5zc2VxczsKKwlpbnQgbG93ID0gMDsKKwlpbnQgaGlnaCA9IG5zZXEtPmZpcnN0X2ZyZWUgLSAxOworCWludCBtaWQ7CisKKwl3aGlsZSAobG93IDw9IGhpZ2gpIHsKKwkJbWlkID0gKGxvdyArIGhpZ2gpIC8gMjsKKwkJaWYgKGluc3RhbmNlIDwgc3NlcXNbbWlkXS5sb3dlcikKKwkJCWhpZ2ggPSBtaWQgLSAxOworCQllbHNlIGlmIChpbnN0YW5jZSA+IHNzZXFzW21pZF0udXBwZXIpCisJCQlsb3cgPSBtaWQgKyAxOworCQllbHNlCisJCQlyZXR1cm4gbWlkOworCX0KKwlyZXR1cm4gbG93OworfQorCisvKioKKyAqIHRpcGNfbmFtZXNlcV9pbnNlcnRfcHVibCAtIAorICovCisKK3N0cnVjdCBwdWJsaWNhdGlvbiAqdGlwY19uYW1lc2VxX2luc2VydF9wdWJsKHN0cnVjdCBuYW1lX3NlcSAqbnNlcSwKKwkJCQkJdTMyIHR5cGUsIHUzMiBsb3dlciwgdTMyIHVwcGVyLAorCQkJCQl1MzIgc2NvcGUsIHUzMiBub2RlLCB1MzIgcG9ydCwgdTMyIGtleSkKK3sKKwlzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzOworCXN0cnVjdCBzdWJzY3JpcHRpb24gKnN0OworCXN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibDsKKwlzdHJ1Y3Qgc3ViX3NlcSAqc3NlcTsKKwlpbnQgY3JlYXRlZF9zdWJzZXEgPSAwOworCisJYXNzZXJ0KG5zZXEtPmZpcnN0X2ZyZWUgPD0gbnNlcS0+YWxsb2MpOworCXNzZXEgPSBuYW1lc2VxX2ZpbmRfc3Vic2VxKG5zZXEsIGxvd2VyKTsKKwlkYmcoIm5hbWVzZXFfaW5zOiBmb3Igc2VxICV4LDwldSwldT4sIGZvdW5kIHNzZXEgJXhcbiIsCisJICAgIG5zZXEsIHR5cGUsIGxvd2VyLCBzc2VxKTsKKwlpZiAoc3NlcSkgeworCisJCS8qIExvd2VyIGVuZCBvdmVybGFwcyBleGlzdGluZyBlbnRyeSA9PiBuZWVkIGFuIGV4YWN0IG1hdGNoICovCisKKwkJaWYgKChzc2VxLT5sb3dlciAhPSBsb3dlcikgfHwgKHNzZXEtPnVwcGVyICE9IHVwcGVyKSkgeworCQkJd2FybigiT3ZlcmxhcHBpbmcgcHVibCA8JXUsJXUsJXU+XG4iLCB0eXBlLCBsb3dlciwgdXBwZXIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQl1MzIgaW5zcG9zOworCQlzdHJ1Y3Qgc3ViX3NlcSAqZnJlZXNzZXE7CisKKwkJLyogRmluZCB3aGVyZSBsb3dlciBlbmQgc2hvdWxkIGJlIGluc2VydGVkICovCisKKwkJaW5zcG9zID0gbmFtZXNlcV9sb2NhdGVfc3Vic2VxKG5zZXEsIGxvd2VyKTsKKworCQkvKiBGYWlsIGlmIHVwcGVyIGVuZCBvdmVybGFwcyBpbnRvIGFuIGV4aXN0aW5nIGVudHJ5ICovCisKKwkJaWYgKChpbnNwb3MgPCBuc2VxLT5maXJzdF9mcmVlKSAmJgorCQkgICAgKHVwcGVyID49IG5zZXEtPnNzZXFzW2luc3Bvc10ubG93ZXIpKSB7CisJCQl3YXJuKCJPdmVybGFwcGluZyBwdWJsIDwldSwldSwldT5cbiIsIHR5cGUsIGxvd2VyLCB1cHBlcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIEVuc3VyZSB0aGVyZSBpcyBzcGFjZSBmb3IgbmV3IHN1Yi1zZXF1ZW5jZSAqLworCisJCWlmIChuc2VxLT5maXJzdF9mcmVlID09IG5zZXEtPmFsbG9jKSB7CisJCQlzdHJ1Y3Qgc3ViX3NlcSAqc3NlcXMgPSBuc2VxLT5zc2VxczsKKwkJCW5zZXEtPnNzZXFzID0gdGlwY19zdWJzZXFfYWxsb2MobnNlcS0+YWxsb2MgKiAyKTsKKwkJCWlmIChuc2VxLT5zc2VxcyAhPSBOVUxMKSB7CisJCQkJbWVtY3B5KG5zZXEtPnNzZXFzLCBzc2VxcywKKwkJCQkgICAgICAgbnNlcS0+YWxsb2MgKiBzaXplb2YgKHN0cnVjdCBzdWJfc2VxKSk7CisJCQkJa2ZyZWUoc3NlcXMpOworCQkJCWRiZygiQWxsb2NhdGVkICV1IHNzZXFzXG4iLCBuc2VxLT5hbGxvYyk7CisJCQkJbnNlcS0+YWxsb2MgKj0gMjsKKwkJCX0gZWxzZSB7CisJCQkJd2FybigiTWVtb3J5IHNxdWVlemU7IGZhaWxlZCB0byBjcmVhdGUgc3ViLXNlcXVlbmNlXG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlkYmcoIkhhdmUgJXUgc3NlcXMgZm9yIHR5cGUgJXVcbiIsIG5zZXEtPmFsbG9jLCB0eXBlKTsKKworCQkvKiBJbnNlcnQgbmV3IHN1Yi1zZXF1ZW5jZSAqLworCisJCWRiZygiaW5zIGluIHBvcyAldSwgZmYgPSAldVxuIiwgaW5zcG9zLCBuc2VxLT5maXJzdF9mcmVlKTsKKwkJc3NlcSA9ICZuc2VxLT5zc2Vxc1tpbnNwb3NdOworCQlmcmVlc3NlcSA9ICZuc2VxLT5zc2Vxc1tuc2VxLT5maXJzdF9mcmVlXTsKKwkJbWVtbW92ZShzc2VxICsgMSwgc3NlcSwgKGZyZWVzc2VxIC0gc3NlcSkgKiBzaXplb2YgKCpzc2VxKSk7CisJCW1lbXNldChzc2VxLCAwLCBzaXplb2YgKCpzc2VxKSk7CisJCW5zZXEtPmZpcnN0X2ZyZWUrKzsKKwkJc3NlcS0+bG93ZXIgPSBsb3dlcjsKKwkJc3NlcS0+dXBwZXIgPSB1cHBlcjsKKwkJY3JlYXRlZF9zdWJzZXEgPSAxOworCX0KKwlkYmcoImluc2VydGluZyAoJXUgJXUgJXUpIGZyb20gJXg6JXUgaW50byBzc2VxICV4KCV1LCV1KSBvZiBzZXEgJXhcbiIsCisJICAgIHR5cGUsIGxvd2VyLCB1cHBlciwgbm9kZSwgcG9ydCwgc3NlcSwKKwkgICAgc3NlcS0+bG93ZXIsIHNzZXEtPnVwcGVyLCBuc2VxKTsKKworCS8qIEluc2VydCBhIHB1YmxpY2F0aW9uOiAqLworCisJcHVibCA9IHB1YmxfY3JlYXRlKHR5cGUsIGxvd2VyLCB1cHBlciwgc2NvcGUsIG5vZGUsIHBvcnQsIGtleSk7CisJaWYgKCFwdWJsKQorCQlyZXR1cm4gMDsKKwlkYmcoImluc2VydGluZyBwdWJsICV4LCBub2RlPSV4IHB1YmwtPm5vZGU9JXgsIHN1YnNjci0+bm9kZT0leFxuIiwKKwkgICAgcHVibCwgbm9kZSwgcHVibC0+bm9kZSwgcHVibC0+c3Vic2NyLm5vZGUpOworCisJaWYgKCFzc2VxLT56b25lX2xpc3QpCisJCXNzZXEtPnpvbmVfbGlzdCA9IHB1YmwtPnpvbmVfbGlzdF9uZXh0ID0gcHVibDsKKwllbHNlIHsKKwkJcHVibC0+em9uZV9saXN0X25leHQgPSBzc2VxLT56b25lX2xpc3QtPnpvbmVfbGlzdF9uZXh0OworCQlzc2VxLT56b25lX2xpc3QtPnpvbmVfbGlzdF9uZXh0ID0gcHVibDsKKwl9CisKKwlpZiAoaW5fb3duX2NsdXN0ZXIobm9kZSkpIHsKKwkJaWYgKCFzc2VxLT5jbHVzdGVyX2xpc3QpCisJCQlzc2VxLT5jbHVzdGVyX2xpc3QgPSBwdWJsLT5jbHVzdGVyX2xpc3RfbmV4dCA9IHB1Ymw7CisJCWVsc2UgeworCQkJcHVibC0+Y2x1c3Rlcl9saXN0X25leHQgPQorCQkJc3NlcS0+Y2x1c3Rlcl9saXN0LT5jbHVzdGVyX2xpc3RfbmV4dDsKKwkJCXNzZXEtPmNsdXN0ZXJfbGlzdC0+Y2x1c3Rlcl9saXN0X25leHQgPSBwdWJsOworCQl9CisJfQorCisJaWYgKG5vZGUgPT0gdGlwY19vd25fYWRkcikgeworCQlpZiAoIXNzZXEtPm5vZGVfbGlzdCkKKwkJCXNzZXEtPm5vZGVfbGlzdCA9IHB1YmwtPm5vZGVfbGlzdF9uZXh0ID0gcHVibDsKKwkJZWxzZSB7CisJCQlwdWJsLT5ub2RlX2xpc3RfbmV4dCA9IHNzZXEtPm5vZGVfbGlzdC0+bm9kZV9saXN0X25leHQ7CisJCQlzc2VxLT5ub2RlX2xpc3QtPm5vZGVfbGlzdF9uZXh0ID0gcHVibDsKKwkJfQorCX0KKworCS8qIAorCSAqIEFueSBzdWJzY3JpcHRpb25zIHdhaXRpbmcgZm9yIG5vdGlmaWNhdGlvbj8gCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHMsIHN0LCAmbnNlcS0+c3Vic2NyaXB0aW9ucywgbmFtZXNlcV9saXN0KSB7CisJCWRiZygiY2FsbGluZyByZXBvcnRfb3ZlcmxhcCgpXG4iKTsKKwkJdGlwY19zdWJzY3JfcmVwb3J0X292ZXJsYXAocywKKwkJCQkJICAgcHVibC0+bG93ZXIsCisJCQkJCSAgIHB1YmwtPnVwcGVyLAorCQkJCQkgICBUSVBDX1BVQkxJU0hFRCwKKwkJCQkJICAgcHVibC0+cmVmLCAKKwkJCQkJICAgcHVibC0+bm9kZSwKKwkJCQkJICAgY3JlYXRlZF9zdWJzZXEpOworCX0KKwlyZXR1cm4gcHVibDsKK30KKworLyoqCisgKiB0aXBjX25hbWVzZXFfcmVtb3ZlX3B1YmwgLQorICovCisKK3N0cnVjdCBwdWJsaWNhdGlvbiAqdGlwY19uYW1lc2VxX3JlbW92ZV9wdWJsKHN0cnVjdCBuYW1lX3NlcSAqbnNlcSwgdTMyIGluc3QsCisJCQkJCSAgICAgdTMyIG5vZGUsIHUzMiByZWYsIHUzMiBrZXkpCit7CisJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsOworCXN0cnVjdCBwdWJsaWNhdGlvbiAqcHJldjsKKwlzdHJ1Y3Qgc3ViX3NlcSAqc3NlcSA9IG5hbWVzZXFfZmluZF9zdWJzZXEobnNlcSwgaW5zdCk7CisJc3RydWN0IHN1Yl9zZXEgKmZyZWU7CisJc3RydWN0IHN1YnNjcmlwdGlvbiAqcywgKnN0OworCWludCByZW1vdmVkX3N1YnNlcSA9IDA7CisKKwlhc3NlcnQobnNlcSk7CisKKwlpZiAoIXNzZXEpIHsKKwkJaW50IGk7CisKKwkJd2FybigiV2l0aGRyYXcgdW5rbm93biA8JXUsJXU+P1xuIiwgbnNlcS0+dHlwZSwgaW5zdCk7CisJCWFzc2VydChuc2VxLT5zc2Vxcyk7CisJCWRiZygiRHVtcGluZyBzdWJzZXFzICV4IGZvciAleCwgYWxsb2MgPSAldSxmZj0ldVxuIiwKKwkJICAgIG5zZXEtPnNzZXFzLCBuc2VxLCBuc2VxLT5hbGxvYywgCisJCSAgICBuc2VxLT5maXJzdF9mcmVlKTsKKwkJZm9yIChpID0gMDsgaSA8IG5zZXEtPmZpcnN0X2ZyZWU7IGkrKykgeworCQkJZGJnKCJTdWJzZXEgJXUoJXgpOiBsb3dlciA9ICV1LHVwcGVyID0gJXVcbiIsCisJCQkgICAgaSwgJm5zZXEtPnNzZXFzW2ldLCBuc2VxLT5zc2Vxc1tpXS5sb3dlciwKKwkJCSAgICBuc2VxLT5zc2Vxc1tpXS51cHBlcik7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWRiZygibmFtZXNlcV9yZW1vdmU6IHNlcTogJXgsIHNzZXEgJXgsIDwldSwldT4ga2V5ICV1XG4iLAorCSAgICBuc2VxLCBzc2VxLCBuc2VxLT50eXBlLCBpbnN0LCBrZXkpOworCisJcHJldiA9IHNzZXEtPnpvbmVfbGlzdDsKKwlwdWJsID0gc3NlcS0+em9uZV9saXN0LT56b25lX2xpc3RfbmV4dDsKKwl3aGlsZSAoKHB1YmwtPmtleSAhPSBrZXkpIHx8IChwdWJsLT5yZWYgIT0gcmVmKSB8fCAKKwkgICAgICAgKHB1YmwtPm5vZGUgJiYgKHB1YmwtPm5vZGUgIT0gbm9kZSkpKSB7CisJCXByZXYgPSBwdWJsOworCQlwdWJsID0gcHVibC0+em9uZV9saXN0X25leHQ7CisJCWFzc2VydChwcmV2ICE9IHNzZXEtPnpvbmVfbGlzdCk7CisJfQorCWlmIChwdWJsICE9IHNzZXEtPnpvbmVfbGlzdCkKKwkJcHJldi0+em9uZV9saXN0X25leHQgPSBwdWJsLT56b25lX2xpc3RfbmV4dDsKKwllbHNlIGlmIChwdWJsLT56b25lX2xpc3RfbmV4dCAhPSBwdWJsKSB7CisJCXByZXYtPnpvbmVfbGlzdF9uZXh0ID0gcHVibC0+em9uZV9saXN0X25leHQ7CisJCXNzZXEtPnpvbmVfbGlzdCA9IHB1YmwtPnpvbmVfbGlzdF9uZXh0OworCX0gZWxzZSB7CisJCXNzZXEtPnpvbmVfbGlzdCA9IDA7CisJfQorCisJaWYgKGluX293bl9jbHVzdGVyKG5vZGUpKSB7CisJCXByZXYgPSBzc2VxLT5jbHVzdGVyX2xpc3Q7CisJCXB1YmwgPSBzc2VxLT5jbHVzdGVyX2xpc3QtPmNsdXN0ZXJfbGlzdF9uZXh0OworCQl3aGlsZSAoKHB1YmwtPmtleSAhPSBrZXkpIHx8IChwdWJsLT5yZWYgIT0gcmVmKSB8fCAKKwkJICAgICAgIChwdWJsLT5ub2RlICYmIChwdWJsLT5ub2RlICE9IG5vZGUpKSkgeworCQkJcHJldiA9IHB1Ymw7CisJCQlwdWJsID0gcHVibC0+Y2x1c3Rlcl9saXN0X25leHQ7CisJCQlhc3NlcnQocHJldiAhPSBzc2VxLT5jbHVzdGVyX2xpc3QpOworCQl9CisJCWlmIChwdWJsICE9IHNzZXEtPmNsdXN0ZXJfbGlzdCkKKwkJCXByZXYtPmNsdXN0ZXJfbGlzdF9uZXh0ID0gcHVibC0+Y2x1c3Rlcl9saXN0X25leHQ7CisJCWVsc2UgaWYgKHB1YmwtPmNsdXN0ZXJfbGlzdF9uZXh0ICE9IHB1YmwpIHsKKwkJCXByZXYtPmNsdXN0ZXJfbGlzdF9uZXh0ID0gcHVibC0+Y2x1c3Rlcl9saXN0X25leHQ7CisJCQlzc2VxLT5jbHVzdGVyX2xpc3QgPSBwdWJsLT5jbHVzdGVyX2xpc3RfbmV4dDsKKwkJfSBlbHNlIHsKKwkJCXNzZXEtPmNsdXN0ZXJfbGlzdCA9IDA7CisJCX0KKwl9CisKKwlpZiAobm9kZSA9PSB0aXBjX293bl9hZGRyKSB7CisJCXByZXYgPSBzc2VxLT5ub2RlX2xpc3Q7CisJCXB1YmwgPSBzc2VxLT5ub2RlX2xpc3QtPm5vZGVfbGlzdF9uZXh0OworCQl3aGlsZSAoKHB1YmwtPmtleSAhPSBrZXkpIHx8IChwdWJsLT5yZWYgIT0gcmVmKSB8fCAKKwkJICAgICAgIChwdWJsLT5ub2RlICYmIChwdWJsLT5ub2RlICE9IG5vZGUpKSkgeworCQkJcHJldiA9IHB1Ymw7CisJCQlwdWJsID0gcHVibC0+bm9kZV9saXN0X25leHQ7CisJCQlhc3NlcnQocHJldiAhPSBzc2VxLT5ub2RlX2xpc3QpOworCQl9CisJCWlmIChwdWJsICE9IHNzZXEtPm5vZGVfbGlzdCkKKwkJCXByZXYtPm5vZGVfbGlzdF9uZXh0ID0gcHVibC0+bm9kZV9saXN0X25leHQ7CisJCWVsc2UgaWYgKHB1YmwtPm5vZGVfbGlzdF9uZXh0ICE9IHB1YmwpIHsKKwkJCXByZXYtPm5vZGVfbGlzdF9uZXh0ID0gcHVibC0+bm9kZV9saXN0X25leHQ7CisJCQlzc2VxLT5ub2RlX2xpc3QgPSBwdWJsLT5ub2RlX2xpc3RfbmV4dDsKKwkJfSBlbHNlIHsKKwkJCXNzZXEtPm5vZGVfbGlzdCA9IDA7CisJCX0KKwl9CisJYXNzZXJ0KCFwdWJsLT5ub2RlIHx8IChwdWJsLT5ub2RlID09IG5vZGUpKTsKKwlhc3NlcnQocHVibC0+cmVmID09IHJlZik7CisJYXNzZXJ0KHB1YmwtPmtleSA9PSBrZXkpOworCisJLyogCisJICogQ29udHJhY3Qgc3Vic2VxIGxpc3QgaWYgbm8gbW9yZSBwdWJsaWNhdGlvbnM6CisJICovCisJaWYgKCFzc2VxLT5ub2RlX2xpc3QgJiYgIXNzZXEtPmNsdXN0ZXJfbGlzdCAmJiAhc3NlcS0+em9uZV9saXN0KSB7CisJCWZyZWUgPSAmbnNlcS0+c3NlcXNbbnNlcS0+Zmlyc3RfZnJlZS0tXTsKKwkJbWVtbW92ZShzc2VxLCBzc2VxICsgMSwgKGZyZWUgLSAoc3NlcSArIDEpKSAqIHNpemVvZiAoKnNzZXEpKTsKKwkJcmVtb3ZlZF9zdWJzZXEgPSAxOworCX0KKworCS8qIAorCSAqIEFueSBzdWJzY3JpcHRpb25zIHdhaXRpbmcgPyAKKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocywgc3QsICZuc2VxLT5zdWJzY3JpcHRpb25zLCBuYW1lc2VxX2xpc3QpIHsKKwkJdGlwY19zdWJzY3JfcmVwb3J0X292ZXJsYXAocywKKwkJCQkJICAgcHVibC0+bG93ZXIsCisJCQkJCSAgIHB1YmwtPnVwcGVyLAorCQkJCQkgICBUSVBDX1dJVEhEUkFXTiwgCisJCQkJCSAgIHB1YmwtPnJlZiwgCisJCQkJCSAgIHB1YmwtPm5vZGUsCisJCQkJCSAgIHJlbW92ZWRfc3Vic2VxKTsKKwl9CisJcmV0dXJuIHB1Ymw7Cit9CisKKy8qKgorICogdGlwY19uYW1lc2VxX3N1YnNjcmliZTogYXR0YWNoIGEgc3Vic2NyaXB0aW9uLCBhbmQgaXNzdWUKKyAqIHRoZSBwcmVzY3JpYmVkIG51bWJlciBvZiBldmVudHMgaWYgdGhlcmUgaXMgYW55IHN1Yi0KKyAqIHNlcXVlbmNlIG92ZXJsYXBwaW5nIHdpdGggdGhlIHJlcXVlc3RlZCBzZXF1ZW5jZQorICovCisKK3ZvaWQgdGlwY19uYW1lc2VxX3N1YnNjcmliZShzdHJ1Y3QgbmFtZV9zZXEgKm5zZXEsIHN0cnVjdCBzdWJzY3JpcHRpb24gKnMpCit7CisJc3RydWN0IHN1Yl9zZXEgKnNzZXEgPSBuc2VxLT5zc2VxczsKKworCWxpc3RfYWRkKCZzLT5uYW1lc2VxX2xpc3QsICZuc2VxLT5zdWJzY3JpcHRpb25zKTsKKworCWlmICghc3NlcSkKKwkJcmV0dXJuOworCisJd2hpbGUgKHNzZXEgIT0gJm5zZXEtPnNzZXFzW25zZXEtPmZpcnN0X2ZyZWVdKSB7CisJCXN0cnVjdCBwdWJsaWNhdGlvbiAqemwgPSBzc2VxLT56b25lX2xpc3Q7CisJCWlmICh6bCAmJiB0aXBjX3N1YnNjcl9vdmVybGFwKHMsc3NlcS0+bG93ZXIsc3NlcS0+dXBwZXIpKSB7CisJCQlzdHJ1Y3QgcHVibGljYXRpb24gKmNycyA9IHpsOworCQkJaW50IG11c3RfcmVwb3J0ID0gMTsKKworCQkJZG8geworCQkJCXRpcGNfc3Vic2NyX3JlcG9ydF9vdmVybGFwKHMsIAorCQkJCQkJCSAgIHNzZXEtPmxvd2VyLCAKKwkJCQkJCQkgICBzc2VxLT51cHBlciwKKwkJCQkJCQkgICBUSVBDX1BVQkxJU0hFRCwKKwkJCQkJCQkgICBjcnMtPnJlZiwKKwkJCQkJCQkgICBjcnMtPm5vZGUsCisJCQkJCQkJICAgbXVzdF9yZXBvcnQpOworCQkJCW11c3RfcmVwb3J0ID0gMDsKKwkJCQljcnMgPSBjcnMtPnpvbmVfbGlzdF9uZXh0OworCQkJfSB3aGlsZSAoY3JzICE9IHpsKTsKKwkJfQorCQlzc2VxKys7CisJfQorfQorCitzdGF0aWMgc3RydWN0IG5hbWVfc2VxICpuYW1ldGJsX2ZpbmRfc2VxKHUzMiB0eXBlKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpzZXFfaGVhZDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqc2VxX25vZGU7CisJc3RydWN0IG5hbWVfc2VxICpuczsKKworCWRiZygiZmluZF9zZXEgJXUsKCV1LDB4JXgpIHRhYmxlID0gJXAsIGhhc2hbdHlwZV0gPSAldVxuIiwKKwkgICAgdHlwZSwgbnRvaGwodHlwZSksIHR5cGUsIHRhYmxlLnR5cGVzLCBoYXNoKHR5cGUpKTsKKworCXNlcV9oZWFkID0gJnRhYmxlLnR5cGVzW2hhc2godHlwZSldOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KG5zLCBzZXFfbm9kZSwgc2VxX2hlYWQsIG5zX2xpc3QpIHsKKwkJaWYgKG5zLT50eXBlID09IHR5cGUpIHsKKwkJCWRiZygiZm91bmQgJXhcbiIsIG5zKTsKKwkJCXJldHVybiBuczsKKwkJfQorCX0KKworCXJldHVybiAwOworfTsKKworc3RydWN0IHB1YmxpY2F0aW9uICp0aXBjX25hbWV0YmxfaW5zZXJ0X3B1YmwodTMyIHR5cGUsIHUzMiBsb3dlciwgdTMyIHVwcGVyLAorCQkJCQkgICAgIHUzMiBzY29wZSwgdTMyIG5vZGUsIHUzMiBwb3J0LCB1MzIga2V5KQoreworCXN0cnVjdCBuYW1lX3NlcSAqc2VxID0gbmFtZXRibF9maW5kX3NlcSh0eXBlKTsKKworCWRiZygiaW5zX3B1Ymw6IDwldSwleCwleD4gZm91bmQgJXhcbiIsIHR5cGUsIGxvd2VyLCB1cHBlciwgc2VxKTsKKwlpZiAobG93ZXIgPiB1cHBlcikgeworCQl3YXJuKCJGYWlsZWQgdG8gcHVibGlzaCBpbGxlZ2FsIDwldSwldSwldT5cbiIsCisJCSAgICAgdHlwZSwgbG93ZXIsIHVwcGVyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZGJnKCJQdWJsaXNoaW5nIDwldSwldSwldT4gZnJvbSAleFxuIiwgdHlwZSwgbG93ZXIsIHVwcGVyLCBub2RlKTsKKwlpZiAoIXNlcSkgeworCQlzZXEgPSB0aXBjX25hbWVzZXFfY3JlYXRlKHR5cGUsICZ0YWJsZS50eXBlc1toYXNoKHR5cGUpXSk7CisJCWRiZygidGlwY19uYW1ldGJsX2luc2VydF9wdWJsOiBjcmVhdGVkICV4XG4iLCBzZXEpOworCX0KKwlpZiAoIXNlcSkKKwkJcmV0dXJuIDA7CisKKwlhc3NlcnQoc2VxLT50eXBlID09IHR5cGUpOworCXJldHVybiB0aXBjX25hbWVzZXFfaW5zZXJ0X3B1Ymwoc2VxLCB0eXBlLCBsb3dlciwgdXBwZXIsCisJCQkJCXNjb3BlLCBub2RlLCBwb3J0LCBrZXkpOworfQorCitzdHJ1Y3QgcHVibGljYXRpb24gKnRpcGNfbmFtZXRibF9yZW1vdmVfcHVibCh1MzIgdHlwZSwgdTMyIGxvd2VyLCAKKwkJCQkJICAgICB1MzIgbm9kZSwgdTMyIHJlZiwgdTMyIGtleSkKK3sKKwlzdHJ1Y3QgcHVibGljYXRpb24gKnB1Ymw7CisJc3RydWN0IG5hbWVfc2VxICpzZXEgPSBuYW1ldGJsX2ZpbmRfc2VxKHR5cGUpOworCisJaWYgKCFzZXEpCisJCXJldHVybiAwOworCisJZGJnKCJXaXRoZHJhd2luZyA8JXUsJXU+IGZyb20gJXhcbiIsIHR5cGUsIGxvd2VyLCBub2RlKTsKKwlwdWJsID0gdGlwY19uYW1lc2VxX3JlbW92ZV9wdWJsKHNlcSwgbG93ZXIsIG5vZGUsIHJlZiwga2V5KTsKKworCWlmICghc2VxLT5maXJzdF9mcmVlICYmIGxpc3RfZW1wdHkoJnNlcS0+c3Vic2NyaXB0aW9ucykpIHsKKwkJaGxpc3RfZGVsX2luaXQoJnNlcS0+bnNfbGlzdCk7CisJCWtmcmVlKHNlcS0+c3NlcXMpOworCQlrZnJlZShzZXEpOworCX0KKwlyZXR1cm4gcHVibDsKK30KKworLyoKKyAqIHRpcGNfbmFtZXRibF90cmFuc2xhdGUoKTogVHJhbnNsYXRlIHRpcGNfbmFtZSAtPiB0aXBjX3BvcnRpZC4KKyAqICAgICAgICAgICAgICAgICAgICAgIFZlcnkgdGltZS1jcml0aWNhbC4KKyAqCisgKiBOb3RlOiBvbiBlbnRyeSAnZGVzdG5vZGUnIGlzIHRoZSBzZWFyY2ggZG9tYWluIHVzZWQgZHVyaW5nIHRyYW5zbGF0aW9uOworICogICAgICAgb24gZXhpdCBpdCBwYXNzZXMgYmFjayB0aGUgbm9kZSBhZGRyZXNzIG9mIHRoZSBtYXRjaGluZyBwb3J0IChpZiBhbnkpCisgKi8KKwordTMyIHRpcGNfbmFtZXRibF90cmFuc2xhdGUodTMyIHR5cGUsIHUzMiBpbnN0YW5jZSwgdTMyICpkZXN0bm9kZSkKK3sKKwlzdHJ1Y3Qgc3ViX3NlcSAqc3NlcTsKKwlzdHJ1Y3QgcHVibGljYXRpb24gKnB1YmwgPSAwOworCXN0cnVjdCBuYW1lX3NlcSAqc2VxOworCXUzMiByZWY7CisKKwlpZiAoIWluX3Njb3BlKCpkZXN0bm9kZSwgdGlwY19vd25fYWRkcikpCisJCXJldHVybiAwOworCisJcmVhZF9sb2NrX2JoKCZ0aXBjX25hbWV0YmxfbG9jayk7CisJc2VxID0gbmFtZXRibF9maW5kX3NlcSh0eXBlKTsKKwlpZiAodW5saWtlbHkoIXNlcSkpCisJCWdvdG8gbm90X2ZvdW5kOworCXNzZXEgPSBuYW1lc2VxX2ZpbmRfc3Vic2VxKHNlcSwgaW5zdGFuY2UpOworCWlmICh1bmxpa2VseSghc3NlcSkpCisJCWdvdG8gbm90X2ZvdW5kOworCXNwaW5fbG9ja19iaCgmc2VxLT5sb2NrKTsKKworCS8qIENsb3Nlc3QtRmlyc3QgQWxnb3JpdGhtOiAqLworCWlmIChsaWtlbHkoISpkZXN0bm9kZSkpIHsKKwkJcHVibCA9IHNzZXEtPm5vZGVfbGlzdDsKKwkJaWYgKHB1YmwpIHsKKwkJCXNzZXEtPm5vZGVfbGlzdCA9IHB1YmwtPm5vZGVfbGlzdF9uZXh0OworZm91bmQ6CisJCQlyZWYgPSBwdWJsLT5yZWY7CisJCQkqZGVzdG5vZGUgPSBwdWJsLT5ub2RlOworCQkJc3Bpbl91bmxvY2tfYmgoJnNlcS0+bG9jayk7CisJCQlyZWFkX3VubG9ja19iaCgmdGlwY19uYW1ldGJsX2xvY2spOworCQkJcmV0dXJuIHJlZjsKKwkJfQorCQlwdWJsID0gc3NlcS0+Y2x1c3Rlcl9saXN0OworCQlpZiAocHVibCkgeworCQkJc3NlcS0+Y2x1c3Rlcl9saXN0ID0gcHVibC0+Y2x1c3Rlcl9saXN0X25leHQ7CisJCQlnb3RvIGZvdW5kOworCQl9CisJCXB1YmwgPSBzc2VxLT56b25lX2xpc3Q7CisJCWlmIChwdWJsKSB7CisJCQlzc2VxLT56b25lX2xpc3QgPSBwdWJsLT56b25lX2xpc3RfbmV4dDsKKwkJCWdvdG8gZm91bmQ7CisJCX0KKwl9CisKKwkvKiBSb3VuZC1Sb2JpbiBBbGdvcml0aG06ICovCisJZWxzZSBpZiAoKmRlc3Rub2RlID09IHRpcGNfb3duX2FkZHIpIHsKKwkJcHVibCA9IHNzZXEtPm5vZGVfbGlzdDsKKwkJaWYgKHB1YmwpIHsKKwkJCXNzZXEtPm5vZGVfbGlzdCA9IHB1YmwtPm5vZGVfbGlzdF9uZXh0OworCQkJZ290byBmb3VuZDsKKwkJfQorCX0gZWxzZSBpZiAoaW5fb3duX2NsdXN0ZXIoKmRlc3Rub2RlKSkgeworCQlwdWJsID0gc3NlcS0+Y2x1c3Rlcl9saXN0OworCQlpZiAocHVibCkgeworCQkJc3NlcS0+Y2x1c3Rlcl9saXN0ID0gcHVibC0+Y2x1c3Rlcl9saXN0X25leHQ7CisJCQlnb3RvIGZvdW5kOworCQl9CisJfSBlbHNlIHsKKwkJcHVibCA9IHNzZXEtPnpvbmVfbGlzdDsKKwkJaWYgKHB1YmwpIHsKKwkJCXNzZXEtPnpvbmVfbGlzdCA9IHB1YmwtPnpvbmVfbGlzdF9uZXh0OworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmc2VxLT5sb2NrKTsKK25vdF9mb3VuZDoKKwkqZGVzdG5vZGUgPSAwOworCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25hbWV0YmxfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdGlwY19uYW1ldGJsX21jX3RyYW5zbGF0ZSAtIGZpbmQgbXVsdGljYXN0IGRlc3RpbmF0aW9ucworICogCisgKiBDcmVhdGVzIGxpc3Qgb2YgYWxsIGxvY2FsIHBvcnRzIHRoYXQgb3ZlcmxhcCB0aGUgZ2l2ZW4gbXVsdGljYXN0IGFkZHJlc3M7CisgKiBhbHNvIGRldGVybWluZXMgaWYgYW55IG9mZi1ub2RlIHBvcnRzIG92ZXJsYXAuCisgKgorICogTm90ZTogUHVibGljYXRpb25zIHdpdGggYSBzY29wZSBuYXJyb3dlciB0aGFuICdsaW1pdCcgYXJlIGlnbm9yZWQuCisgKiAoaS5lLiBsb2NhbCBub2RlLXNjb3BlIHB1YmxpY2F0aW9ucyBtdXN0bid0IHJlY2VpdmUgbWVzc2FnZXMgYXJyaXZpbmcKKyAqIGZyb20gYW5vdGhlciBub2RlLCBldmVuIGlmIHRoZSBtdWx0Y2FzdCBsaW5rIGJyb3VnaHQgaXQgaGVyZSkKKyAqIAorICogUmV0dXJucyBub24temVybyBpZiBhbnkgb2ZmLW5vZGUgcG9ydHMgb3ZlcmxhcAorICovCisKK2ludCB0aXBjX25hbWV0YmxfbWNfdHJhbnNsYXRlKHUzMiB0eXBlLCB1MzIgbG93ZXIsIHUzMiB1cHBlciwgdTMyIGxpbWl0LAorCQkJICAgICAgc3RydWN0IHBvcnRfbGlzdCAqZHBvcnRzKQoreworCXN0cnVjdCBuYW1lX3NlcSAqc2VxOworCXN0cnVjdCBzdWJfc2VxICpzc2VxOworCXN0cnVjdCBzdWJfc2VxICpzc2VxX3N0b3A7CisJaW50IHJlcyA9IDA7CisKKwlyZWFkX2xvY2tfYmgoJnRpcGNfbmFtZXRibF9sb2NrKTsKKwlzZXEgPSBuYW1ldGJsX2ZpbmRfc2VxKHR5cGUpOworCWlmICghc2VxKQorCQlnb3RvIGV4aXQ7CisKKwlzcGluX2xvY2tfYmgoJnNlcS0+bG9jayk7CisKKwlzc2VxID0gc2VxLT5zc2VxcyArIG5hbWVzZXFfbG9jYXRlX3N1YnNlcShzZXEsIGxvd2VyKTsKKwlzc2VxX3N0b3AgPSBzZXEtPnNzZXFzICsgc2VxLT5maXJzdF9mcmVlOworCWZvciAoOyBzc2VxICE9IHNzZXFfc3RvcDsgc3NlcSsrKSB7CisJCXN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibDsKKworCQlpZiAoc3NlcS0+bG93ZXIgPiB1cHBlcikKKwkJCWJyZWFrOworCQlwdWJsID0gc3NlcS0+Y2x1c3Rlcl9saXN0OworCQlpZiAocHVibCAmJiAocHVibC0+c2NvcGUgPD0gbGltaXQpKQorCQkJZG8geworCQkJCWlmIChwdWJsLT5ub2RlID09IHRpcGNfb3duX2FkZHIpCisJCQkJCXRpcGNfcG9ydF9saXN0X2FkZChkcG9ydHMsIHB1YmwtPnJlZik7CisJCQkJZWxzZQorCQkJCQlyZXMgPSAxOworCQkJCXB1YmwgPSBwdWJsLT5jbHVzdGVyX2xpc3RfbmV4dDsKKwkJCX0gd2hpbGUgKHB1YmwgIT0gc3NlcS0+Y2x1c3Rlcl9saXN0KTsKKwl9CisKKwlzcGluX3VubG9ja19iaCgmc2VxLT5sb2NrKTsKK2V4aXQ6CisJcmVhZF91bmxvY2tfYmgoJnRpcGNfbmFtZXRibF9sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIHRpcGNfbmFtZXRibF9wdWJsaXNoX3JzdiAtIHB1Ymxpc2ggcG9ydCBuYW1lIHVzaW5nIGEgcmVzZXJ2ZWQgbmFtZSB0eXBlCisgKi8KKworaW50IHRpcGNfbmFtZXRibF9wdWJsaXNoX3Jzdih1MzIgcmVmLCB1bnNpZ25lZCBpbnQgc2NvcGUsIAorCQkJc3RydWN0IHRpcGNfbmFtZV9zZXEgY29uc3QgKnNlcSkKK3sKKwlpbnQgcmVzOworCisJYXRvbWljX2luYygmcnN2X3B1Ymxfb2spOworCXJlcyA9IHRpcGNfcHVibGlzaChyZWYsIHNjb3BlLCBzZXEpOworCWF0b21pY19kZWMoJnJzdl9wdWJsX29rKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIHRpcGNfbmFtZXRibF9wdWJsaXNoIC0gYWRkIG5hbWUgcHVibGljYXRpb24gdG8gbmV0d29yayBuYW1lIHRhYmxlcworICovCisKK3N0cnVjdCBwdWJsaWNhdGlvbiAqdGlwY19uYW1ldGJsX3B1Ymxpc2godTMyIHR5cGUsIHUzMiBsb3dlciwgdTMyIHVwcGVyLCAKKwkJCQkgICAgdTMyIHNjb3BlLCB1MzIgcG9ydF9yZWYsIHUzMiBrZXkpCit7CisJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsOworCisJaWYgKHRhYmxlLmxvY2FsX3B1YmxfY291bnQgPj0gdGlwY19tYXhfcHVibGljYXRpb25zKSB7CisJCXdhcm4oIkZhaWxlZCBwdWJsaXNoOiBtYXggJXUgbG9jYWwgcHVibGljYXRpb25cbiIsIAorCQkgICAgIHRpcGNfbWF4X3B1YmxpY2F0aW9ucyk7CisJCXJldHVybiAwOworCX0KKwlpZiAoKHR5cGUgPCBUSVBDX1JFU0VSVkVEX1RZUEVTKSAmJiAhYXRvbWljX3JlYWQoJnJzdl9wdWJsX29rKSkgeworCQl3YXJuKCJGYWlsZWQgdG8gcHVibGlzaCByZXNlcnZlZCBuYW1lIDwldSwldSwldT5cbiIsCisJCSAgICAgdHlwZSwgbG93ZXIsIHVwcGVyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJd3JpdGVfbG9ja19iaCgmdGlwY19uYW1ldGJsX2xvY2spOworCXRhYmxlLmxvY2FsX3B1YmxfY291bnQrKzsKKwlwdWJsID0gdGlwY19uYW1ldGJsX2luc2VydF9wdWJsKHR5cGUsIGxvd2VyLCB1cHBlciwgc2NvcGUsCisJCQkJICAgdGlwY19vd25fYWRkciwgcG9ydF9yZWYsIGtleSk7CisJaWYgKHB1YmwgJiYgKHNjb3BlICE9IFRJUENfTk9ERV9TQ09QRSkpIHsKKwkJdGlwY19uYW1lZF9wdWJsaXNoKHB1YmwpOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJnRpcGNfbmFtZXRibF9sb2NrKTsKKwlyZXR1cm4gcHVibDsKK30KKworLyoqCisgKiB0aXBjX25hbWV0Ymxfd2l0aGRyYXcgLSB3aXRoZHJhdyBuYW1lIHB1YmxpY2F0aW9uIGZyb20gbmV0d29yayBuYW1lIHRhYmxlcworICovCisKK2ludCB0aXBjX25hbWV0Ymxfd2l0aGRyYXcodTMyIHR5cGUsIHUzMiBsb3dlciwgdTMyIHJlZiwgdTMyIGtleSkKK3sKKwlzdHJ1Y3QgcHVibGljYXRpb24gKnB1Ymw7CisKKwlkYmcoInRpcGNfbmFtZXRibF93aXRoZHJhdzo8JWQsJWQsJWQ+XG4iLCB0eXBlLCBsb3dlciwga2V5KTsKKwl3cml0ZV9sb2NrX2JoKCZ0aXBjX25hbWV0YmxfbG9jayk7CisJcHVibCA9IHRpcGNfbmFtZXRibF9yZW1vdmVfcHVibCh0eXBlLCBsb3dlciwgdGlwY19vd25fYWRkciwgcmVmLCBrZXkpOworCWlmIChwdWJsKSB7CisJCXRhYmxlLmxvY2FsX3B1YmxfY291bnQtLTsKKwkJaWYgKHB1YmwtPnNjb3BlICE9IFRJUENfTk9ERV9TQ09QRSkKKwkJCXRpcGNfbmFtZWRfd2l0aGRyYXcocHVibCk7CisJCXdyaXRlX3VubG9ja19iaCgmdGlwY19uYW1ldGJsX2xvY2spOworCQlsaXN0X2RlbF9pbml0KCZwdWJsLT5wcG9ydF9saXN0KTsKKwkJa2ZyZWUocHVibCk7CisJCXJldHVybiAxOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJnRpcGNfbmFtZXRibF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB0aXBjX25hbWV0Ymxfc3Vic2NyaWJlIC0gYWRkIGEgc3Vic2NyaXB0aW9uIG9iamVjdCB0byB0aGUgbmFtZSB0YWJsZQorICovCisKK3ZvaWQKK3RpcGNfbmFtZXRibF9zdWJzY3JpYmUoc3RydWN0IHN1YnNjcmlwdGlvbiAqcykKK3sKKwl1MzIgdHlwZSA9IHMtPnNlcS50eXBlOworCXN0cnVjdCBuYW1lX3NlcSAqc2VxOworCisgICAgICAgIHdyaXRlX2xvY2tfYmgoJnRpcGNfbmFtZXRibF9sb2NrKTsKKwlzZXEgPSBuYW1ldGJsX2ZpbmRfc2VxKHR5cGUpOworCWlmICghc2VxKSB7CisJCXNlcSA9IHRpcGNfbmFtZXNlcV9jcmVhdGUodHlwZSwgJnRhYmxlLnR5cGVzW2hhc2godHlwZSldKTsKKwl9CisgICAgICAgIGlmIChzZXEpeworICAgICAgICAgICAgICAgIHNwaW5fbG9ja19iaCgmc2VxLT5sb2NrKTsKKyAgICAgICAgICAgICAgICBkYmcoInRpcGNfbmFtZXRibF9zdWJzY3JpYmU6Zm91bmQgJXggZm9yIDwldSwldSwldT5cbiIsCisgICAgICAgICAgICAgICAgICAgIHNlcSwgdHlwZSwgcy0+c2VxLmxvd2VyLCBzLT5zZXEudXBwZXIpOworICAgICAgICAgICAgICAgIGFzc2VydChzZXEtPnR5cGUgPT0gdHlwZSk7CisgICAgICAgICAgICAgICAgdGlwY19uYW1lc2VxX3N1YnNjcmliZShzZXEsIHMpOworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2JoKCZzZXEtPmxvY2spOworICAgICAgICB9CisgICAgICAgIHdyaXRlX3VubG9ja19iaCgmdGlwY19uYW1ldGJsX2xvY2spOworfQorCisvKioKKyAqIHRpcGNfbmFtZXRibF91bnN1YnNjcmliZSAtIHJlbW92ZSBhIHN1YnNjcmlwdGlvbiBvYmplY3QgZnJvbSBuYW1lIHRhYmxlCisgKi8KKwordm9pZAordGlwY19uYW1ldGJsX3Vuc3Vic2NyaWJlKHN0cnVjdCBzdWJzY3JpcHRpb24gKnMpCit7CisJc3RydWN0IG5hbWVfc2VxICpzZXE7CisKKyAgICAgICAgd3JpdGVfbG9ja19iaCgmdGlwY19uYW1ldGJsX2xvY2spOworICAgICAgICBzZXEgPSBuYW1ldGJsX2ZpbmRfc2VxKHMtPnNlcS50eXBlKTsKKwlpZiAoc2VxICE9IE5VTEwpeworICAgICAgICAgICAgICAgIHNwaW5fbG9ja19iaCgmc2VxLT5sb2NrKTsKKyAgICAgICAgICAgICAgICBsaXN0X2RlbF9pbml0KCZzLT5uYW1lc2VxX2xpc3QpOworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2JoKCZzZXEtPmxvY2spOworICAgICAgICAgICAgICAgIGlmICgoc2VxLT5maXJzdF9mcmVlID09IDApICYmIGxpc3RfZW1wdHkoJnNlcS0+c3Vic2NyaXB0aW9ucykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhsaXN0X2RlbF9pbml0KCZzZXEtPm5zX2xpc3QpOworICAgICAgICAgICAgICAgICAgICAgICAga2ZyZWUoc2VxLT5zc2Vxcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShzZXEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3cml0ZV91bmxvY2tfYmgoJnRpcGNfbmFtZXRibF9sb2NrKTsKK30KKworCisvKioKKyAqIHN1YnNlcV9saXN0OiBwcmludCBzcGVjaWZpZWQgc3ViLXNlcXVlbmNlIGNvbnRlbnRzIGludG8gdGhlIGdpdmVuIGJ1ZmZlcgorICovCisKK3N0YXRpYyB2b2lkIHN1YnNlcV9saXN0KHN0cnVjdCBzdWJfc2VxICpzc2VxLCBzdHJ1Y3QgcHJpbnRfYnVmICpidWYsIHUzMiBkZXB0aCwKKwkJCXUzMiBpbmRleCkKK3sKKwljaGFyIHBvcnRJZFN0clsyN107CisJY2hhciAqc2NvcGVTdHI7CisJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsID0gc3NlcS0+em9uZV9saXN0OworCisJdGlwY19wcmludGYoYnVmLCAiJS0xMHUgJS0xMHUgIiwgc3NlcS0+bG93ZXIsIHNzZXEtPnVwcGVyKTsKKworCWlmIChkZXB0aCA9PSAyIHx8ICFwdWJsKSB7CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIlxuIik7CisJCXJldHVybjsKKwl9CisKKwlkbyB7CisJCXNwcmludGYgKHBvcnRJZFN0ciwgIjwldS4ldS4ldToldT4iLAorCQkJIHRpcGNfem9uZShwdWJsLT5ub2RlKSwgdGlwY19jbHVzdGVyKHB1YmwtPm5vZGUpLAorCQkJIHRpcGNfbm9kZShwdWJsLT5ub2RlKSwgcHVibC0+cmVmKTsKKwkJdGlwY19wcmludGYoYnVmLCAiJS0yNnMgIiwgcG9ydElkU3RyKTsKKwkJaWYgKGRlcHRoID4gMykgeworCQkJaWYgKHB1YmwtPm5vZGUgIT0gdGlwY19vd25fYWRkcikKKwkJCQlzY29wZVN0ciA9ICIiOworCQkJZWxzZSBpZiAocHVibC0+c2NvcGUgPT0gVElQQ19OT0RFX1NDT1BFKQorCQkJCXNjb3BlU3RyID0gIm5vZGUiOworCQkJZWxzZSBpZiAocHVibC0+c2NvcGUgPT0gVElQQ19DTFVTVEVSX1NDT1BFKQorCQkJCXNjb3BlU3RyID0gImNsdXN0ZXIiOworCQkJZWxzZQorCQkJCXNjb3BlU3RyID0gInpvbmUiOworCQkJdGlwY19wcmludGYoYnVmLCAiJS0xMHUgJXMiLCBwdWJsLT5rZXksIHNjb3BlU3RyKTsKKwkJfQorCisJCXB1YmwgPSBwdWJsLT56b25lX2xpc3RfbmV4dDsKKwkJaWYgKHB1YmwgPT0gc3NlcS0+em9uZV9saXN0KQorCQkJYnJlYWs7CisKKwkJdGlwY19wcmludGYoYnVmLCAiXG4lMzNzIiwgIiAiKTsKKwl9IHdoaWxlICgxKTsKKworCXRpcGNfcHJpbnRmKGJ1ZiwgIlxuIik7Cit9CisKKy8qKgorICogbmFtZXNlcV9saXN0OiBwcmludCBzcGVjaWZpZWQgbmFtZSBzZXF1ZW5jZSBjb250ZW50cyBpbnRvIHRoZSBnaXZlbiBidWZmZXIKKyAqLworCitzdGF0aWMgdm9pZCBuYW1lc2VxX2xpc3Qoc3RydWN0IG5hbWVfc2VxICpzZXEsIHN0cnVjdCBwcmludF9idWYgKmJ1ZiwgdTMyIGRlcHRoLAorCQkJIHUzMiB0eXBlLCB1MzIgbG93Ym91bmQsIHUzMiB1cGJvdW5kLCB1MzIgaW5kZXgpCit7CisJc3RydWN0IHN1Yl9zZXEgKnNzZXE7CisJY2hhciB0eXBlYXJlYVsxMV07CisKKwlzcHJpbnRmKHR5cGVhcmVhLCAiJS0xMHUiLCBzZXEtPnR5cGUpOworCisJaWYgKGRlcHRoID09IDEpIHsKKwkJdGlwY19wcmludGYoYnVmLCAiJXNcbiIsIHR5cGVhcmVhKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoc3NlcSA9IHNlcS0+c3NlcXM7IHNzZXEgIT0gJnNlcS0+c3NlcXNbc2VxLT5maXJzdF9mcmVlXTsgc3NlcSsrKSB7CisJCWlmICgobG93Ym91bmQgPD0gc3NlcS0+dXBwZXIpICYmICh1cGJvdW5kID49IHNzZXEtPmxvd2VyKSkgeworCQkJdGlwY19wcmludGYoYnVmLCAiJXMgIiwgdHlwZWFyZWEpOworCQkJc3Vic2VxX2xpc3Qoc3NlcSwgYnVmLCBkZXB0aCwgaW5kZXgpOworCQkJc3ByaW50Zih0eXBlYXJlYSwgIiUxMHMiLCAiICIpOworCQl9CisJfQorfQorCisvKioKKyAqIG5hbWV0YmxfaGVhZGVyIC0gcHJpbnQgbmFtZSB0YWJsZSBoZWFkZXIgaW50byB0aGUgZ2l2ZW4gYnVmZmVyCisgKi8KKworc3RhdGljIHZvaWQgbmFtZXRibF9oZWFkZXIoc3RydWN0IHByaW50X2J1ZiAqYnVmLCB1MzIgZGVwdGgpCit7CisJdGlwY19wcmludGYoYnVmLCAiVHlwZSAgICAgICAiKTsKKworCWlmIChkZXB0aCA+IDEpCisJCXRpcGNfcHJpbnRmKGJ1ZiwgIkxvd2VyICAgICAgVXBwZXIgICAgICAiKTsKKwlpZiAoZGVwdGggPiAyKQorCQl0aXBjX3ByaW50ZihidWYsICJQb3J0IElkZW50aXR5ICAgICAgICAgICAgICAiKTsKKwlpZiAoZGVwdGggPiAzKQorCQl0aXBjX3ByaW50ZihidWYsICJQdWJsaWNhdGlvbiIpOworCisJdGlwY19wcmludGYoYnVmLCAiXG4tLS0tLS0tLS0tLSIpOworCisJaWYgKGRlcHRoID4gMSkKKwkJdGlwY19wcmludGYoYnVmLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tICIpOworCWlmIChkZXB0aCA+IDIpCisJCXRpcGNfcHJpbnRmKGJ1ZiwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICIpOworCWlmIChkZXB0aCA+IDMpCisJCXRpcGNfcHJpbnRmKGJ1ZiwgIi0tLS0tLS0tLS0tLS0tLS0tLSIpOworCisJdGlwY19wcmludGYoYnVmLCAiXG4iKTsKK30KKworLyoqCisgKiBuYW1ldGJsX2xpc3QgLSBwcmludCBzcGVjaWZpZWQgbmFtZSB0YWJsZSBjb250ZW50cyBpbnRvIHRoZSBnaXZlbiBidWZmZXIKKyAqLworCitzdGF0aWMgdm9pZCBuYW1ldGJsX2xpc3Qoc3RydWN0IHByaW50X2J1ZiAqYnVmLCB1MzIgZGVwdGhfaW5mbywgCisJCQkgdTMyIHR5cGUsIHUzMiBsb3dib3VuZCwgdTMyIHVwYm91bmQpCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKnNlcV9oZWFkOworCXN0cnVjdCBobGlzdF9ub2RlICpzZXFfbm9kZTsKKwlzdHJ1Y3QgbmFtZV9zZXEgKnNlcTsKKwlpbnQgYWxsX3R5cGVzOworCXUzMiBkZXB0aDsKKwl1MzIgaTsKKworCWFsbF90eXBlcyA9IChkZXB0aF9pbmZvICYgVElQQ19OVFFfQUxMVFlQRVMpOworCWRlcHRoID0gKGRlcHRoX2luZm8gJiB+VElQQ19OVFFfQUxMVFlQRVMpOworCisJaWYgKGRlcHRoID09IDApCisJCXJldHVybjsKKworCWlmIChhbGxfdHlwZXMpIHsKKwkJLyogZGlzcGxheSBhbGwgZW50cmllcyBpbiBuYW1lIHRhYmxlIHRvIHNwZWNpZmllZCBkZXB0aCAqLworCQluYW1ldGJsX2hlYWRlcihidWYsIGRlcHRoKTsKKwkJbG93Ym91bmQgPSAwOworCQl1cGJvdW5kID0gfjA7CisJCWZvciAoaSA9IDA7IGkgPCB0aXBjX25hbWV0Ymxfc2l6ZTsgaSsrKSB7CisJCQlzZXFfaGVhZCA9ICZ0YWJsZS50eXBlc1tpXTsKKwkJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlcSwgc2VxX25vZGUsIHNlcV9oZWFkLCBuc19saXN0KSB7CisJCQkJbmFtZXNlcV9saXN0KHNlcSwgYnVmLCBkZXB0aCwgc2VxLT50eXBlLCAKKwkJCQkJICAgICBsb3dib3VuZCwgdXBib3VuZCwgaSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBkaXNwbGF5IG9ubHkgdGhlIHNlcXVlbmNlIHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHR5cGUgKi8KKwkJaWYgKHVwYm91bmQgPCBsb3dib3VuZCkgeworCQkJdGlwY19wcmludGYoYnVmLCAiaW52YWxpZCBuYW1lIHNlcXVlbmNlIHNwZWNpZmllZFxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJbmFtZXRibF9oZWFkZXIoYnVmLCBkZXB0aCk7CisJCWkgPSBoYXNoKHR5cGUpOworCQlzZXFfaGVhZCA9ICZ0YWJsZS50eXBlc1tpXTsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnkoc2VxLCBzZXFfbm9kZSwgc2VxX2hlYWQsIG5zX2xpc3QpIHsKKwkJCWlmIChzZXEtPnR5cGUgPT0gdHlwZSkgeworCQkJCW5hbWVzZXFfbGlzdChzZXEsIGJ1ZiwgZGVwdGgsIHR5cGUsIAorCQkJCQkgICAgIGxvd2JvdW5kLCB1cGJvdW5kLCBpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKwordm9pZCB0aXBjX25hbWV0YmxfcHJpbnQoc3RydWN0IHByaW50X2J1ZiAqYnVmLCBjb25zdCBjaGFyICpzdHIpCit7CisJdGlwY19wcmludGYoYnVmLCBzdHIpOworCXJlYWRfbG9ja19iaCgmdGlwY19uYW1ldGJsX2xvY2spOworCW5hbWV0YmxfbGlzdChidWYsIDAsIDAsIDAsIDApOworCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25hbWV0YmxfbG9jayk7Cit9CisKKyNkZWZpbmUgTUFYX05BTUVfVEJMX1FVRVJZIDMyNzY4CisKK3N0cnVjdCBza19idWZmICp0aXBjX25hbWV0YmxfZ2V0KGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3QgdGlwY19uYW1lX3RhYmxlX3F1ZXJ5ICphcmd2OworCXN0cnVjdCB0bHZfZGVzYyAqcmVwX3RsdjsKKwlzdHJ1Y3QgcHJpbnRfYnVmIGI7CisJaW50IHN0cl9sZW47CisKKwlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX05BTUVfVEJMX1FVRVJZKSkKKwkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOworCisJYnVmID0gdGlwY19jZmdfcmVwbHlfYWxsb2MoVExWX1NQQUNFKE1BWF9OQU1FX1RCTF9RVUVSWSkpOworCWlmICghYnVmKQorCQlyZXR1cm4gTlVMTDsKKworCXJlcF90bHYgPSAoc3RydWN0IHRsdl9kZXNjICopYnVmLT5kYXRhOworCXRpcGNfcHJpbnRidWZfaW5pdCgmYiwgVExWX0RBVEEocmVwX3RsdiksIE1BWF9OQU1FX1RCTF9RVUVSWSk7CisJYXJndiA9IChzdHJ1Y3QgdGlwY19uYW1lX3RhYmxlX3F1ZXJ5ICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKKwlyZWFkX2xvY2tfYmgoJnRpcGNfbmFtZXRibF9sb2NrKTsKKwluYW1ldGJsX2xpc3QoJmIsIG50b2hsKGFyZ3YtPmRlcHRoKSwgbnRvaGwoYXJndi0+dHlwZSksIAorCQkgICAgIG50b2hsKGFyZ3YtPmxvd2JvdW5kKSwgbnRvaGwoYXJndi0+dXBib3VuZCkpOworCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25hbWV0YmxfbG9jayk7CisJc3RyX2xlbiA9IHRpcGNfcHJpbnRidWZfdmFsaWRhdGUoJmIpOworCisJc2tiX3B1dChidWYsIFRMVl9TUEFDRShzdHJfbGVuKSk7CisJVExWX1NFVChyZXBfdGx2LCBUSVBDX1RMVl9VTFRSQV9TVFJJTkcsIE5VTEwsIHN0cl9sZW4pOworCisJcmV0dXJuIGJ1ZjsKK30KKwordm9pZCB0aXBjX25hbWV0YmxfZHVtcCh2b2lkKQoreworCW5hbWV0YmxfbGlzdChUSVBDX0NPTlMsIDAsIDAsIDAsIDApOworfQorCitpbnQgdGlwY19uYW1ldGJsX2luaXQodm9pZCkKK3sKKwlpbnQgYXJyYXlfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaGxpc3RfaGVhZCkgKiB0aXBjX25hbWV0Ymxfc2l6ZTsKKworCXRhYmxlLnR5cGVzID0gKHN0cnVjdCBobGlzdF9oZWFkICopa21hbGxvYyhhcnJheV9zaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXRhYmxlLnR5cGVzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdyaXRlX2xvY2tfYmgoJnRpcGNfbmFtZXRibF9sb2NrKTsKKwltZW1zZXQodGFibGUudHlwZXMsIDAsIGFycmF5X3NpemUpOworCXRhYmxlLmxvY2FsX3B1YmxfY291bnQgPSAwOworCXdyaXRlX3VubG9ja19iaCgmdGlwY19uYW1ldGJsX2xvY2spOworCXJldHVybiAwOworfQorCit2b2lkIHRpcGNfbmFtZXRibF9zdG9wKHZvaWQpCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKnNlcV9oZWFkOworCXN0cnVjdCBobGlzdF9ub2RlICpzZXFfbm9kZTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdG1wOworCXN0cnVjdCBuYW1lX3NlcSAqc2VxOworCXUzMiBpOworCisJaWYgKCF0YWJsZS50eXBlcykKKwkJcmV0dXJuOworCisJd3JpdGVfbG9ja19iaCgmdGlwY19uYW1ldGJsX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCB0aXBjX25hbWV0Ymxfc2l6ZTsgaSsrKSB7CisJCXNlcV9oZWFkID0gJnRhYmxlLnR5cGVzW2ldOworCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNlcSwgc2VxX25vZGUsIHRtcCwgc2VxX2hlYWQsIG5zX2xpc3QpIHsKKwkJCXN0cnVjdCBzdWJfc2VxICpzc2VxID0gc2VxLT5zc2VxczsKKworCQkJZm9yICg7IHNzZXEgIT0gJnNlcS0+c3NlcXNbc2VxLT5maXJzdF9mcmVlXTsgc3NlcSsrKSB7CisJCQkJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsID0gc3NlcS0+em9uZV9saXN0OworCQkJCWFzc2VydChwdWJsKTsKKwkJCQlkbyB7CisJCQkJCXN0cnVjdCBwdWJsaWNhdGlvbiAqbmV4dCA9CisJCQkJCQlwdWJsLT56b25lX2xpc3RfbmV4dDsKKwkJCQkJa2ZyZWUocHVibCk7CisJCQkJCXB1YmwgPSBuZXh0OworCQkJCX0KKwkJCQl3aGlsZSAocHVibCAhPSBzc2VxLT56b25lX2xpc3QpOworCQkJfQorCQl9CisJfQorCWtmcmVlKHRhYmxlLnR5cGVzKTsKKwl0YWJsZS50eXBlcyA9IE5VTEw7CisJd3JpdGVfdW5sb2NrX2JoKCZ0aXBjX25hbWV0YmxfbG9jayk7Cit9CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9uYW1lX3RhYmxlLmggYi9uZXQvdGlwYy9uYW1lX3RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThhM2Q3MQotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL25hbWVfdGFibGUuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIG5ldC90aXBjL25hbWVfdGFibGUuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIG5hbWUgdGFibGUgY29kZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfTkFNRV9UQUJMRV9ICisjZGVmaW5lIF9USVBDX05BTUVfVEFCTEVfSAorCisjaW5jbHVkZSAibm9kZV9zdWJzY3IuaCIKKworc3RydWN0IHN1YnNjcmlwdGlvbjsKK3N0cnVjdCBwb3J0X2xpc3Q7CisKKy8qCisgKiBUSVBDIG5hbWUgdHlwZXMgcmVzZXJ2ZWQgZm9yIGludGVybmFsIFRJUEMgdXNlIChib3RoIGN1cnJlbnQgYW5kIHBsYW5uZWQpCisgKi8KKworI2RlZmluZSBUSVBDX1pNX1NSViAzICAJCS8qIHpvbmUgbWFzdGVyIHNlcnZpY2UgbmFtZSB0eXBlICovCisKKworLyoqCisgKiBzdHJ1Y3QgcHVibGljYXRpb24gLSBpbmZvIGFib3V0IGEgcHVibGlzaGVkIChuYW1lIG9yKSBuYW1lIHNlcXVlbmNlCisgKiBAdHlwZTogbmFtZSBzZXF1ZW5jZSB0eXBlCisgKiBAbG93ZXI6IG5hbWUgc2VxdWVuY2UgbG93ZXIgYm91bmQKKyAqIEB1cHBlcjogbmFtZSBzZXF1ZW5jZSB1cHBlciBib3VuZAorICogQHNjb3BlOiBzY29wZSBvZiBwdWJsaWNhdGlvbgorICogQG5vZGU6IG5ldHdvcmsgYWRkcmVzcyBvZiBwdWJsaXNoaW5nIHBvcnQncyBub2RlCisgKiBAcmVmOiBwdWJsaXNoaW5nIHBvcnQKKyAqIEBrZXk6IHB1YmxpY2F0aW9uIGtleQorICogQHN1YnNjcjogc3Vic2NyaXB0aW9uIHRvICJub2RlIGRvd24iIGV2ZW50IChmb3Igb2ZmLW5vZGUgcHVibGljYXRpb25zIG9ubHkpCisgKiBAbG9jYWxfbGlzdDogYWRqYWNlbnQgZW50cmllcyBpbiBsaXN0IG9mIHB1YmxpY2F0aW9ucyBtYWRlIGJ5IHRoaXMgbm9kZQorICogQHBwb3J0X2xpc3Q6IGFkamFjZW50IGVudHJpZXMgaW4gbGlzdCBvZiBwdWJsaWNhdGlvbnMgbWFkZSBieSB0aGlzIHBvcnQKKyAqIEBub2RlX2xpc3Q6IG5leHQgbWF0Y2hpbmcgbmFtZSBzZXEgcHVibGljYXRpb24gd2l0aCA+PSBub2RlIHNjb3BlCisgKiBAY2x1c3Rlcl9saXN0OiBuZXh0IG1hdGNoaW5nIG5hbWUgc2VxIHB1YmxpY2F0aW9uIHdpdGggPj0gY2x1c3RlciBzY29wZQorICogQHpvbmVfbGlzdDogbmV4dCBtYXRjaGluZyBuYW1lIHNlcSBwdWJsaWNhdGlvbiB3aXRoID49IHpvbmUgc2NvcGUKKyAqIAorICogTm90ZSB0aGF0IHRoZSBub2RlIGxpc3QsIGNsdXN0ZXIgbGlzdCwgYW5kIHpvbmUgbGlzdCBhcmUgY2lyY3VsYXIgbGlzdHMuCisgKi8KKworc3RydWN0IHB1YmxpY2F0aW9uIHsKKwl1MzIgdHlwZTsKKwl1MzIgbG93ZXI7CisJdTMyIHVwcGVyOworCXUzMiBzY29wZTsKKwl1MzIgbm9kZTsKKwl1MzIgcmVmOworCXUzMiBrZXk7CisJc3RydWN0IG5vZGVfc3Vic2NyIHN1YnNjcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxvY2FsX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBwcG9ydF9saXN0OworCXN0cnVjdCBwdWJsaWNhdGlvbiAqbm9kZV9saXN0X25leHQ7CisJc3RydWN0IHB1YmxpY2F0aW9uICpjbHVzdGVyX2xpc3RfbmV4dDsKKwlzdHJ1Y3QgcHVibGljYXRpb24gKnpvbmVfbGlzdF9uZXh0OworfTsKKworCitleHRlcm4gcndsb2NrX3QgdGlwY19uYW1ldGJsX2xvY2s7CisKK3N0cnVjdCBza19idWZmICp0aXBjX25hbWV0YmxfZ2V0KGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UpOwordTMyIHRpcGNfbmFtZXRibF90cmFuc2xhdGUodTMyIHR5cGUsIHUzMiBpbnN0YW5jZSwgdTMyICpub2RlKTsKK2ludCB0aXBjX25hbWV0YmxfbWNfdHJhbnNsYXRlKHUzMiB0eXBlLCB1MzIgbG93ZXIsIHUzMiB1cHBlciwgdTMyIGxpbWl0LCAKKwkJCSBzdHJ1Y3QgcG9ydF9saXN0ICpkcG9ydHMpOworaW50IHRpcGNfbmFtZXRibF9wdWJsaXNoX3Jzdih1MzIgcmVmLCB1bnNpZ25lZCBpbnQgc2NvcGUsIAorCQkJc3RydWN0IHRpcGNfbmFtZV9zZXEgY29uc3QgKnNlcSk7CitzdHJ1Y3QgcHVibGljYXRpb24gKnRpcGNfbmFtZXRibF9wdWJsaXNoKHUzMiB0eXBlLCB1MzIgbG93ZXIsIHUzMiB1cHBlciwKKwkJCQkgICAgdTMyIHNjb3BlLCB1MzIgcG9ydF9yZWYsIHUzMiBrZXkpOworaW50IHRpcGNfbmFtZXRibF93aXRoZHJhdyh1MzIgdHlwZSwgdTMyIGxvd2VyLCB1MzIgcmVmLCB1MzIga2V5KTsKK3N0cnVjdCBwdWJsaWNhdGlvbiAqdGlwY19uYW1ldGJsX2luc2VydF9wdWJsKHUzMiB0eXBlLCB1MzIgbG93ZXIsIHUzMiB1cHBlciwKKwkJCQkJdTMyIHNjb3BlLCB1MzIgbm9kZSwgdTMyIHJlZiwgdTMyIGtleSk7CitzdHJ1Y3QgcHVibGljYXRpb24gKnRpcGNfbmFtZXRibF9yZW1vdmVfcHVibCh1MzIgdHlwZSwgdTMyIGxvd2VyLCAKKwkJCQkJdTMyIG5vZGUsIHUzMiByZWYsIHUzMiBrZXkpOwordm9pZCB0aXBjX25hbWV0Ymxfc3Vic2NyaWJlKHN0cnVjdCBzdWJzY3JpcHRpb24gKnMpOwordm9pZCB0aXBjX25hbWV0YmxfdW5zdWJzY3JpYmUoc3RydWN0IHN1YnNjcmlwdGlvbiAqcyk7CitpbnQgdGlwY19uYW1ldGJsX2luaXQodm9pZCk7Cit2b2lkIHRpcGNfbmFtZXRibF9zdG9wKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC90aXBjL25ldC5jIGIvbmV0L3RpcGMvbmV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0ODkxYQotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL25ldC5jCkBAIC0wLDAgKzEsMzExIEBACisvKgorICogbmV0L3RpcGMvbmV0LmM6IFRJUEMgbmV0d29yayByb3V0aW5nIGNvZGUKKyAqIAorICogQ29weXJpZ2h0IChjKSAxOTk1LTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJiZWFyZXIuaCIKKyNpbmNsdWRlICJuZXQuaCIKKyNpbmNsdWRlICJ6b25lLmgiCisjaW5jbHVkZSAiYWRkci5oIgorI2luY2x1ZGUgIm5hbWVfdGFibGUuaCIKKyNpbmNsdWRlICJuYW1lX2Rpc3RyLmgiCisjaW5jbHVkZSAic3Vic2NyLmgiCisjaW5jbHVkZSAibGluay5oIgorI2luY2x1ZGUgIm1zZy5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJiY2FzdC5oIgorI2luY2x1ZGUgImRpc2NvdmVyLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKy8qIAorICogVGhlIFRJUEMgbG9ja2luZyBwb2xpY3kgaXMgZGVzaWduZWQgdG8gZW5zdXJlIGEgdmVyeSBmaW5lIGxvY2tpbmcKKyAqIGdyYW51bGFyaXR5LCBwZXJtaXR0aW5nIGNvbXBsZXRlIHBhcmFsbGVsIGFjY2VzcyB0byBpbmRpdmlkdWFsCisgKiBwb3J0IGFuZCBub2RlL2xpbmsgaW5zdGFuY2VzLiBUaGUgY29kZSBjb25zaXN0cyBvZiB0aHJlZSBtYWpvciAKKyAqIGxvY2tpbmcgZG9tYWlucywgZWFjaCBwcm90ZWN0ZWQgd2l0aCB0aGVpciBvd24gZGlzanVuY3Qgc2V0IG9mIGxvY2tzLgorICoKKyAqIDE6IFRoZSByb3V0aW5nIGhpZXJhcmNoeS4KKyAqICAgIENvbXByaXNlcyB0aGUgc3RydWN0dXJlcyAnem9uZScsICdjbHVzdGVyJywgJ25vZGUnLCAnbGluaycgCisgKiAgICBhbmQgJ2JlYXJlcicuIFRoZSB3aG9sZSBoaWVyYXJjaHkgaXMgcHJvdGVjdGVkIGJ5IGEgYmlnIAorICogICAgcmVhZC93cml0ZSBsb2NrLCB0aXBjX25ldF9sb2NrLCB0byBlbnNzdXJlIHRoYXQgbm90aGluZyBpcyBhZGRlZCAKKyAqICAgIG9yIHJlbW92ZWQgd2hpbGUgY29kZSBpcyBhY2Nlc3NpbmcgYW55IG9mIHRoZXNlIHN0cnVjdHVyZXMuIAorICogICAgVGhpcyBsYXllciBtdXN0IG5vdCBiZSBjYWxsZWQgZnJvbSB0aGUgdHdvIG90aGVycyB3aGlsZSB0aGV5IAorICogICAgaG9sZCBhbnkgb2YgdGhlaXIgb3duIGxvY2tzLgorICogICAgTmVpdGhlciBtdXN0IGl0IGl0c2VsZiBkbyBhbnkgdXBjYWxscyB0byB0aGUgb3RoZXIgdHdvIGJlZm9yZQorICogICAgaXQgaGFzIHJlbGVhc2VkIHRpcGNfbmV0X2xvY2sgYW5kIG90aGVyIHByb3RlY3RpdmUgbG9ja3MuCisgKgorICogICBXaXRoaW4gdGhlIHRpcGNfbmV0X2xvY2sgZG9tYWluIHRoZXJlIGFyZSB0d28gc3ViLWRvbWFpbnM7J25vZGUnIGFuZCAKKyAqICAgJ2JlYXJlcicsIHdoZXJlIGxvY2FsIHdyaXRlIG9wZXJhdGlvbnMgYXJlIHBlcm1pdHRlZCwKKyAqICAgcHJvdmlkZWQgdGhhdCB0aG9zZSBhcmUgcHJvdGVjdGVkIGJ5IGluZGl2aWR1YWwgc3Bpbl9sb2NrcworICogICBwZXIgaW5zdGFuY2UuIENvZGUgaG9sZGluZyB0aXBjX25ldF9sb2NrKHJlYWQpIGFuZCBhIG5vZGUgc3Bpbl9sb2NrIAorICogICBpcyBwZXJtaXR0ZWQgdG8gcG9rZSBhcm91bmQgaW4gYm90aCB0aGUgbm9kZSBpdHNlbGYgYW5kIGl0cworICogICBzdWJvcmRpbmF0ZSBsaW5rcy4gSS5lLCBpdCBjYW4gdXBkYXRlIGxpbmsgY291bnRlcnMgYW5kIHF1ZXVlcywgCisgKiAgIGNoYW5nZSBsaW5rIHN0YXRlLCBzZW5kIHByb3RvY29sIG1lc3NhZ2VzLCBhbmQgYWx0ZXIgdGhlIAorICogICAiYWN0aXZlX2xpbmtzIiBhcnJheSBpbiB0aGUgbm9kZTsgYnV0IGl0IGNhbiBfbm90XyByZW1vdmUgYSBsaW5rIAorICogICBvciBhIG5vZGUgZnJvbSB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUuCisgKiAgIENvcnJlc3BvbmRpbmdseSwgaW5kaXZpZHVhbCBiZWFyZXJzIG1heSBjaGFuZ2Ugc3RhdHVzIHdpdGhpbiBhIAorICogICB0aXBjX25ldF9sb2NrKHJlYWQpLCBwcm90ZWN0ZWQgYnkgYW4gaW5kaXZpZHVhbCBzcGluX2xvY2sgYmVyIGJlYXJlciAKKyAqICAgaW5zdGFuY2UsIGJ1dCBpdCBuZWVkcyB0aXBjX25ldF9sb2NrKHdyaXRlKSB0byByZW1vdmUvYWRkIGFueSBiZWFyZXJzLgorICogICAgIAorICoKKyAqICAyOiBUaGUgdHJhbnNwb3J0IGxldmVsIG9mIHRoZSBwcm90b2NvbC4gCisgKiAgICAgVGhpcyBjb25zaXN0cyBvZiB0aGUgc3RydWN0dXJlcyBwb3J0LCAoYW5kIGl0cyB1c2VyIGxldmVsIAorICogICAgIHJlcHJlc2VudGF0aW9ucywgc3VjaCBhcyB1c2VyX3BvcnQgYW5kIHRpcGNfc29jayksIHJlZmVyZW5jZSBhbmQgCisgKiAgICAgdGlwY191c2VyIChwb3J0LmMsIHJlZy5jLCBzb2NrZXQuYykuIAorICoKKyAqICAgICBUaGlzIGxheWVyIGhhcyBmb3VyIGRpZmZlcmVudCBsb2NrczoKKyAqICAgICAtIFRoZSB0aXBjX3BvcnQgc3Bpbl9sb2NrLiBUaGlzIGlzIHByb3RlY3RpbmcgZWFjaCBwb3J0IGluc3RhbmNlCisgKiAgICAgICBmcm9tIHBhcmFsbGVsIGRhdGEgYWNjZXNzIGFuZCByZW1vdmFsLiBTaW5jZSB3ZSBjYW4gbm90IHBsYWNlIAorICogICAgICAgdGhpcyBsb2NrIGluIHRoZSBwb3J0IGl0c2VsZiwgaXQgaGFzIGJlZW4gcGxhY2VkIGluIHRoZSAKKyAqICAgICAgIGNvcnJlc3BvbmRpbmcgcmVmZXJlbmNlIHRhYmxlIGVudHJ5LCB3aGljaCBoYXMgdGhlIHNhbWUgbGlmZQorICogICAgICAgY3ljbGUgYXMgdGhlIG1vZHVsZS4gVGhpcyBlbnRyeSBpcyBkaWZmaWN1bHQgdG8gYWNjZXNzIGZyb20gCisgKiAgICAgICBvdXRzaWRlIHRoZSBUSVBDIGNvcmUsIGhvd2V2ZXIsIHNvIGEgcG9pbnRlciB0byB0aGUgbG9jayBoYXMgCisgKiAgICAgICBiZWVuIGFkZGVkIGluIHRoZSBwb3J0IGluc3RhbmNlLCAtdG8gYmUgdXNlZCBmb3IgdW5sb2NraW5nIAorICogICAgICAgb25seS4KKyAqICAgICAtIEEgcmVhZC93cml0ZSBsb2NrIHRvIHByb3RlY3QgdGhlIHJlZmVyZW5jZSB0YWJsZSBpdHNlbGYgKHRlZy5jKS4gCisgKiAgICAgICAoTm9ib2R5IGlzIHVzaW5nIHJlYWQtb25seSBhY2Nlc3MgdG8gdGhpcywgc28gaXQgY2FuIGp1c3QgYXMgCisgKiAgICAgICB3ZWxsIGJlIGNoYW5nZWQgdG8gYSBzcGluX2xvY2spCisgKiAgICAgLSBBIHNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSByZWdpc3RyeSBvZiBrZXJuZWwvZHJpdmVyIHVzZXJzIChyZWcuYykKKyAqICAgICAtIEEgZ2xvYmFsIHNwaW5fbG9jayAodGlwY19wb3J0X2xvY2spLCB3aGljaCBvbmx5IHRhc2sgaXMgdG8gZW5zdXJlIAorICogICAgICAgY29uc2lzdGVuY3kgd2hlcmUgbW9yZSB0aGFuIG9uZSBwb3J0IGlzIGludm9sdmVkIGluIGFuIG9wZXJhdGlvbiwKKyAqICAgICAgIGkuZS4sIHdoZSBhIHBvcnQgaXMgcGFydCBvZiBhIGxpbmtlZCBsaXN0IG9mIHBvcnRzLgorICogICAgICAgVGhlcmUgYXJlIHR3byBzdWNoIGxpc3RzOyAncG9ydF9saXN0Jywgd2hpY2ggaXMgdXNlZCBmb3IgbWFuYWdlbWVudCwKKyAqICAgICAgIGFuZCAnd2FpdF9saXN0Jywgd2hpY2ggaXMgdXNlZCB0byBxdWV1ZSBwb3J0cyBkdXJpbmcgY29uZ2VzdGlvbi4KKyAqICAgICAKKyAqICAzOiBUaGUgbmFtZSB0YWJsZSAobmFtZV90YWJsZS5jLCBuYW1lX2Rpc3RyLmMsIHN1YnNjcmlwdGlvbi5jKQorICogICAgIC0gVGhlcmUgaXMgb25lIGJpZyByZWFkL3dyaXRlLWxvY2sgKHRpcGNfbmFtZXRibF9sb2NrKSBwcm90ZWN0aW5nIHRoZSAKKyAqICAgICAgIG92ZXJhbGwgbmFtZSB0YWJsZSBzdHJ1Y3R1cmUuIE5vdGhpbmcgbXVzdCBiZSBhZGRlZC9yZW1vdmVkIHRvIAorICogICAgICAgdGhpcyBzdHJ1Y3R1cmUgd2l0aG91dCBob2xkaW5nIHdyaXRlIGFjY2VzcyB0byBpdC4KKyAqICAgICAtIFRoZXJlIGlzIG9uZSBsb2NhbCBzcGluX2xvY2sgcGVyIHN1Yl9zZXF1ZW5jZSwgd2hpY2ggY2FuIGJlIHNlZW4KKyAqICAgICAgIGFzIGEgc3ViLWRvbWFpbiB0byB0aGUgdGlwY19uYW1ldGJsX2xvY2sgZG9tYWluLiBJdCBpcyB1c2VkIG9ubHkKKyAqICAgICAgIGZvciB0cmFuc2xhdGlvbiBvcGVyYXRpb25zLCBhbmQgaXMgbmVlZGVkIGJlY2F1c2UgYSB0cmFuc2xhdGlvbgorICogICAgICAgc3RlcHMgdGhlIHJvb3Qgb2YgdGhlICdwdWJsaWNhdGlvbicgbGlua2VkIGxpc3QgYmV0d2VlbiBlYWNoIGxvb2t1cC4KKyAqICAgICAgIFRoaXMgaXMgYWx3YXlzIHVzZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhIHRpcGNfbmFtZXRibF9sb2NrKHJlYWQpLgorICogICAgIC0gQSBsb2NhbCBzcGluX2xvY2sgcHJvdGVjdGluZyB0aGUgcXVldWUgb2Ygc3Vic2NyaWJlciBldmVudHMuCisqLworCityd2xvY2tfdCB0aXBjX25ldF9sb2NrID0gUldfTE9DS19VTkxPQ0tFRDsKK3N0cnVjdCBuZXR3b3JrIHRpcGNfbmV0ID0geyAwIH07CisKK3N0cnVjdCBub2RlICp0aXBjX25ldF9zZWxlY3RfcmVtb3RlX25vZGUodTMyIGFkZHIsIHUzMiByZWYpIAoreworCXJldHVybiB0aXBjX3pvbmVfc2VsZWN0X3JlbW90ZV9ub2RlKHRpcGNfbmV0LnpvbmVzW3RpcGNfem9uZShhZGRyKV0sIGFkZHIsIHJlZik7Cit9CisKK3UzMiB0aXBjX25ldF9zZWxlY3Rfcm91dGVyKHUzMiBhZGRyLCB1MzIgcmVmKQoreworCXJldHVybiB0aXBjX3pvbmVfc2VsZWN0X3JvdXRlcih0aXBjX25ldC56b25lc1t0aXBjX3pvbmUoYWRkcildLCBhZGRyLCByZWYpOworfQorCisKK3UzMiB0aXBjX25ldF9uZXh0X25vZGUodTMyIGEpCit7CisJaWYgKHRpcGNfbmV0LnpvbmVzW3RpcGNfem9uZShhKV0pCisJCXJldHVybiB0aXBjX3pvbmVfbmV4dF9ub2RlKGEpOworCXJldHVybiAwOworfQorCit2b2lkIHRpcGNfbmV0X3JlbW92ZV9hc19yb3V0ZXIodTMyIHJvdXRlcikKK3sKKwl1MzIgel9udW07CisKKwlmb3IgKHpfbnVtID0gMTsgel9udW0gPD0gdGlwY19tYXhfem9uZXM7IHpfbnVtKyspIHsKKwkJaWYgKCF0aXBjX25ldC56b25lc1t6X251bV0pCisJCQljb250aW51ZTsKKwkJdGlwY196b25lX3JlbW92ZV9hc19yb3V0ZXIodGlwY19uZXQuem9uZXNbel9udW1dLCByb3V0ZXIpOworCX0KK30KKwordm9pZCB0aXBjX25ldF9zZW5kX2V4dGVybmFsX3JvdXRlcyh1MzIgZGVzdCkKK3sKKwl1MzIgel9udW07CisKKwlmb3IgKHpfbnVtID0gMTsgel9udW0gPD0gdGlwY19tYXhfem9uZXM7IHpfbnVtKyspIHsKKwkJaWYgKHRpcGNfbmV0LnpvbmVzW3pfbnVtXSkKKwkJCXRpcGNfem9uZV9zZW5kX2V4dGVybmFsX3JvdXRlcyh0aXBjX25ldC56b25lc1t6X251bV0sIGRlc3QpOworCX0KK30KKworc3RhdGljIGludCBuZXRfaW5pdCh2b2lkKQoreworCXUzMiBzeiA9IHNpemVvZihzdHJ1Y3QgX3pvbmUgKikgKiAodGlwY19tYXhfem9uZXMgKyAxKTsKKworCW1lbXNldCgmdGlwY19uZXQsIDAsIHNpemVvZih0aXBjX25ldCkpOworCXRpcGNfbmV0LnpvbmVzID0gKHN0cnVjdCBfem9uZSAqKilrbWFsbG9jKHN6LCBHRlBfQVRPTUlDKTsKKwlpZiAoIXRpcGNfbmV0LnpvbmVzKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQodGlwY19uZXQuem9uZXMsIDAsIHN6KTsKKwlyZXR1cm4gVElQQ19PSzsKK30KKworc3RhdGljIHZvaWQgbmV0X3N0b3Aodm9pZCkKK3sKKwl1MzIgel9udW07CisKKwlpZiAoIXRpcGNfbmV0LnpvbmVzKQorCQlyZXR1cm47CisKKwlmb3IgKHpfbnVtID0gMTsgel9udW0gPD0gdGlwY19tYXhfem9uZXM7IHpfbnVtKyspIHsKKwkJdGlwY196b25lX2RlbGV0ZSh0aXBjX25ldC56b25lc1t6X251bV0pOworCX0KKwlrZnJlZSh0aXBjX25ldC56b25lcyk7CisJdGlwY19uZXQuem9uZXMgPSAwOworfQorCitzdGF0aWMgdm9pZCBuZXRfcm91dGVfbmFtZWRfbXNnKHN0cnVjdCBza19idWZmICpidWYpCit7CisJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGJ1Zik7CisJdTMyIGRub2RlOworCXUzMiBkcG9ydDsKKworCWlmICghbXNnX25hbWVkKG1zZykpIHsKKwkJbXNnX2RiZyhtc2csICJ0aXBjX25ldC0+ZHJvcF9uYW06Iik7CisJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCXJldHVybjsKKwl9CisKKwlkbm9kZSA9IGFkZHJfZG9tYWluKG1zZ19sb29rdXBfc2NvcGUobXNnKSk7CisJZHBvcnQgPSB0aXBjX25hbWV0YmxfdHJhbnNsYXRlKG1zZ19uYW1ldHlwZShtc2cpLCBtc2dfbmFtZWluc3QobXNnKSwgJmRub2RlKTsKKwlkYmcoInRpcGNfbmV0LT5sb29rdXA8JXUsJXU+LT48JXUsJXg+XG4iLAorCSAgICBtc2dfbmFtZXR5cGUobXNnKSwgbXNnX25hbWVpbnN0KG1zZyksIGRwb3J0LCBkbm9kZSk7CisJaWYgKGRwb3J0KSB7CisJCW1zZ19zZXRfZGVzdG5vZGUobXNnLCBkbm9kZSk7CisJCW1zZ19zZXRfZGVzdHBvcnQobXNnLCBkcG9ydCk7CisJCXRpcGNfbmV0X3JvdXRlX21zZyhidWYpOworCQlyZXR1cm47CisJfQorCW1zZ19kYmcobXNnLCAidGlwY19uZXQtPnJlajpOTyBOQU1FOiAiKTsKKwl0aXBjX3JlamVjdF9tc2coYnVmLCBUSVBDX0VSUl9OT19OQU1FKTsKK30KKwordm9pZCB0aXBjX25ldF9yb3V0ZV9tc2coc3RydWN0IHNrX2J1ZmYgKmJ1ZikKK3sKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwl1MzIgZG5vZGU7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCW1zZyA9IGJ1Zl9tc2coYnVmKTsKKworCW1zZ19pbmNyX3Jlcm91dGVfY250KG1zZyk7CisJaWYgKG1zZ19yZXJvdXRlX2NudChtc2cpID4gNikgeworCQlpZiAobXNnX2VycmNvZGUobXNnKSkgeworCQkJbXNnX2RiZyhtc2csICJORVQ+RElTQz46Iik7CisJCQlidWZfZGlzY2FyZChidWYpOworCQl9IGVsc2UgeworCQkJbXNnX2RiZyhtc2csICJORVQ+UkVKPjoiKTsKKwkJCXRpcGNfcmVqZWN0X21zZyhidWYsIG1zZ19kZXN0cG9ydChtc2cpID8gCisJCQkJCVRJUENfRVJSX05PX1BPUlQgOiBUSVBDX0VSUl9OT19OQU1FKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJbXNnX2RiZyhtc2csICJ0aXBjX25ldC0+cm91dDogIik7CisKKwkvKiBIYW5kbGUgbWVzc2FnZSBmb3IgdGhpcyBub2RlICovCisJZG5vZGUgPSBtc2dfc2hvcnQobXNnKSA/IHRpcGNfb3duX2FkZHIgOiBtc2dfZGVzdG5vZGUobXNnKTsKKwlpZiAoaW5fc2NvcGUoZG5vZGUsIHRpcGNfb3duX2FkZHIpKSB7CisJCWlmIChtc2dfaXNkYXRhKG1zZykpIHsKKwkJCWlmIChtc2dfbWNhc3QobXNnKSkgCisJCQkJdGlwY19wb3J0X3JlY3ZfbWNhc3QoYnVmLCBOVUxMKTsKKwkJCWVsc2UgaWYgKG1zZ19kZXN0cG9ydChtc2cpKQorCQkJCXRpcGNfcG9ydF9yZWN2X21zZyhidWYpOworCQkJZWxzZQorCQkJCW5ldF9yb3V0ZV9uYW1lZF9tc2coYnVmKTsKKwkJCXJldHVybjsKKwkJfQorCQlzd2l0Y2ggKG1zZ191c2VyKG1zZykpIHsKKwkJY2FzZSBST1VURV9ESVNUUklCVVRPUjoKKwkJCXRpcGNfY2x0cl9yZWN2X3JvdXRpbmdfdGFibGUoYnVmKTsKKwkJCWJyZWFrOworCQljYXNlIE5BTUVfRElTVFJJQlVUT1I6CisJCQl0aXBjX25hbWVkX3JlY3YoYnVmKTsKKwkJCWJyZWFrOworCQljYXNlIENPTk5fTUFOQUdFUjoKKwkJCXRpcGNfcG9ydF9yZWN2X3Byb3RvX21zZyhidWYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQltc2dfZGJnKG1zZywiRFJPUC9ORVQvPFJFQzwiKTsKKwkJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIEhhbmRsZSBtZXNzYWdlIGZvciBhbm90aGVyIG5vZGUgKi8KKwltc2dfZGJnKG1zZywgIk5FVD5TRU5EPjogIik7CisJdGlwY19saW5rX3NlbmQoYnVmLCBkbm9kZSwgbXNnX2xpbmtfc2VsZWN0b3IobXNnKSk7Cit9CisKK2ludCB0aXBjX25ldF9zdGFydCh2b2lkKQoreworCWNoYXIgYWRkcl9zdHJpbmdbMTZdOworCWludCByZXM7CisKKwlpZiAodGlwY19tb2RlICE9IFRJUENfTk9ERV9NT0RFKQorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCisJdGlwY19tb2RlID0gVElQQ19ORVRfTU9ERTsKKwl0aXBjX25hbWVkX3JlaW5pdCgpOworCXRpcGNfcG9ydF9yZWluaXQoKTsKKworCWlmICgocmVzID0gdGlwY19iZWFyZXJfaW5pdCgpKSB8fAorCSAgICAocmVzID0gbmV0X2luaXQoKSkgfHwKKwkgICAgKHJlcyA9IHRpcGNfY2x0cl9pbml0KCkpIHx8CisJICAgIChyZXMgPSB0aXBjX2JjbGlua19pbml0KCkpKSB7CisJCXJldHVybiByZXM7CisJfQorICAgICAgICB0aXBjX3N1YnNjcl9zdG9wKCk7CisJdGlwY19jZmdfc3RvcCgpOworCXRpcGNfa19zaWduYWwoKEhhbmRsZXIpdGlwY19zdWJzY3Jfc3RhcnQsIDApOworCXRpcGNfa19zaWduYWwoKEhhbmRsZXIpdGlwY19jZmdfaW5pdCwgMCk7CisJaW5mbygiU3RhcnRlZCBpbiBuZXR3b3JrIG1vZGVcbiIpOworCWluZm8oIk93biBub2RlIGFkZHJlc3MgJXMsIG5ldHdvcmsgaWRlbnRpdHkgJXVcbiIsCisJICAgICBhZGRyX3N0cmluZ19maWxsKGFkZHJfc3RyaW5nLCB0aXBjX293bl9hZGRyKSwgdGlwY19uZXRfaWQpOworCXJldHVybiBUSVBDX09LOworfQorCit2b2lkIHRpcGNfbmV0X3N0b3Aodm9pZCkKK3sKKwlpZiAodGlwY19tb2RlICE9IFRJUENfTkVUX01PREUpCisJCXJldHVybjsKKyAgICAgICAgd3JpdGVfbG9ja19iaCgmdGlwY19uZXRfbG9jayk7CisJdGlwY19iZWFyZXJfc3RvcCgpOworCXRpcGNfbW9kZSA9IFRJUENfTk9ERV9NT0RFOworCXRpcGNfYmNsaW5rX3N0b3AoKTsKKwluZXRfc3RvcCgpOworICAgICAgICB3cml0ZV91bmxvY2tfYmgoJnRpcGNfbmV0X2xvY2spOworCWluZm8oIkxlZnQgbmV0d29yayBtb2RlIFxuIik7Cit9CisKZGlmZiAtLWdpdCBhL25ldC90aXBjL25ldC5oIGIvbmV0L3RpcGMvbmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNlMGI4NQotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL25ldC5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBuZXQvdGlwYy9uZXQuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIG5ldHdvcmsgcm91dGluZyBjb2RlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMTk5NS0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfTkVUX0gKKyNkZWZpbmUgX1RJUENfTkVUX0gKKworc3RydWN0IF96b25lOworCisvKioKKyAqIHN0cnVjdCBuZXR3b3JrIC0gVElQQyBuZXR3b3JrIHN0cnVjdHVyZQorICogQHpvbmVzOiBhcnJheSBvZiBwb2ludGVycyB0byBhbGwgem9uZXMgd2l0aGluIG5ldHdvcmsKKyAqLworIAorc3RydWN0IG5ldHdvcmsgeworCXN0cnVjdCBfem9uZSAqKnpvbmVzOworfTsKKworCitleHRlcm4gc3RydWN0IG5ldHdvcmsgdGlwY19uZXQ7CitleHRlcm4gcndsb2NrX3QgdGlwY19uZXRfbG9jazsKKwordm9pZCB0aXBjX25ldF9yZW1vdmVfYXNfcm91dGVyKHUzMiByb3V0ZXIpOwordm9pZCB0aXBjX25ldF9zZW5kX2V4dGVybmFsX3JvdXRlcyh1MzIgZGVzdCk7Cit2b2lkIHRpcGNfbmV0X3JvdXRlX21zZyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKK3N0cnVjdCBub2RlICp0aXBjX25ldF9zZWxlY3RfcmVtb3RlX25vZGUodTMyIGFkZHIsIHUzMiByZWYpOwordTMyIHRpcGNfbmV0X3NlbGVjdF9yb3V0ZXIodTMyIGFkZHIsIHUzMiByZWYpOworCitpbnQgdGlwY19uZXRfc3RhcnQodm9pZCk7Cit2b2lkIHRpcGNfbmV0X3N0b3Aodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbmV0bGluay5jIGIvbmV0L3RpcGMvbmV0bGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMWJiNGQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9uZXRsaW5rLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBuZXQvdGlwYy9uZXRsaW5rLmM6IFRJUEMgY29uZmlndXJhdGlvbiBoYW5kbGluZworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KKworc3RhdGljIGludCBoYW5kbGVfY21kKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IHNrX2J1ZmYgKnJlcF9idWY7CisJc3RydWN0IG5sbXNnaGRyICpyZXBfbmxoOworCXN0cnVjdCBubG1zZ2hkciAqcmVxX25saCA9IGluZm8tPm5saGRyOworCXN0cnVjdCB0aXBjX2dlbmxtc2doZHIgKnJlcV91c2VyaGRyID0gaW5mby0+dXNlcmhkcjsKKwlpbnQgaGRyX3NwYWNlID0gTkxNU0dfU1BBQ0UoR0VOTF9IRFJMRU4gKyBUSVBDX0dFTkxfSERSTEVOKTsKKworCWlmICgocmVxX3VzZXJoZHItPmNtZCAmIDB4QzAwMCkgJiYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSkKKwkJcmVwX2J1ZiA9IHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19OT1RfTkVUX0FETUlOKTsKKwllbHNlCisJCXJlcF9idWYgPSB0aXBjX2NmZ19kb19jbWQocmVxX3VzZXJoZHItPmRlc3QsCisJCQkJCSAgcmVxX3VzZXJoZHItPmNtZCwKKwkJCQkJICBOTE1TR19EQVRBKHJlcV9ubGgpICsgR0VOTF9IRFJMRU4gKyBUSVBDX0dFTkxfSERSTEVOLAorCQkJCQkgIE5MTVNHX1BBWUxPQUQocmVxX25saCwgR0VOTF9IRFJMRU4gKyBUSVBDX0dFTkxfSERSTEVOKSwKKwkJCQkJICBoZHJfc3BhY2UpOworCisJaWYgKHJlcF9idWYpIHsKKwkJc2tiX3B1c2gocmVwX2J1ZiwgaGRyX3NwYWNlKTsKKwkJcmVwX25saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilyZXBfYnVmLT5kYXRhOworCQltZW1jcHkocmVwX25saCwgcmVxX25saCwgaGRyX3NwYWNlKTsKKwkJcmVwX25saC0+bmxtc2dfbGVuID0gcmVwX2J1Zi0+bGVuOworCQlnZW5sbXNnX3VuaWNhc3QocmVwX2J1ZiwgcmVxX25saC0+bmxtc2dfcGlkKTsKKwl9CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2VubF9mYW1pbHkgZmFtaWx5ID0geworICAgICAgICAuaWQJCT0gR0VOTF9JRF9HRU5FUkFURSwKKyAgICAgICAgLm5hbWUJCT0gVElQQ19HRU5MX05BTUUsCisgICAgICAgIC52ZXJzaW9uCT0gVElQQ19HRU5MX1ZFUlNJT04sCisgICAgICAgIC5oZHJzaXplCT0gVElQQ19HRU5MX0hEUkxFTiwKKyAgICAgICAgLm1heGF0dHIJPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBnZW5sX29wcyBvcHMgPSB7CisJLmNtZAkJPSBUSVBDX0dFTkxfQ01ELAorCS5kb2l0CQk9IGhhbmRsZV9jbWQsCit9OworCitzdGF0aWMgaW50IGZhbWlseV9yZWdpc3RlcmVkID0gMDsKKworaW50IHRpcGNfbmV0bGlua19zdGFydCh2b2lkKQoreworCisKKwlpZiAoZ2VubF9yZWdpc3Rlcl9mYW1pbHkoJmZhbWlseSkpCisJCWdvdG8gZXJyOworCisJZmFtaWx5X3JlZ2lzdGVyZWQgPSAxOworCisJaWYgKGdlbmxfcmVnaXN0ZXJfb3BzKCZmYW1pbHksICZvcHMpKQorCQlnb3RvIGVycl91bnJlZ2lzdGVyOworCisgICAgICAgIHJldHVybiAwOworCisgZXJyX3VucmVnaXN0ZXI6CisJZ2VubF91bnJlZ2lzdGVyX2ZhbWlseSgmZmFtaWx5KTsKKwlmYW1pbHlfcmVnaXN0ZXJlZCA9IDA7CisgZXJyOgorCWVycigiRmFpbGVkIHRvIHJlZ2lzdGVyIG5ldGxpbmsgaW50ZXJmYWNlXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKwordm9pZCB0aXBjX25ldGxpbmtfc3RvcCh2b2lkKQoreworCWlmIChmYW1pbHlfcmVnaXN0ZXJlZCkgeworCQlnZW5sX3VucmVnaXN0ZXJfZmFtaWx5KCZmYW1pbHkpOworCQlmYW1pbHlfcmVnaXN0ZXJlZCA9IDA7CisJfQorfQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbm9kZS5jIGIvbmV0L3RpcGMvbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNjUwMTAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9ub2RlLmMKQEAgLTAsMCArMSw2NzggQEAKKy8qCisgKiBuZXQvdGlwYy9ub2RlLmM6IFRJUEMgbm9kZSBtYW5hZ2VtZW50IHJvdXRpbmVzCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibm9kZS5oIgorI2luY2x1ZGUgImNsdXN0ZXIuaCIKKyNpbmNsdWRlICJuZXQuaCIKKyNpbmNsdWRlICJhZGRyLmgiCisjaW5jbHVkZSAibm9kZV9zdWJzY3IuaCIKKyNpbmNsdWRlICJsaW5rLmgiCisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgImJlYXJlci5oIgorI2luY2x1ZGUgIm5hbWVfZGlzdHIuaCIKKwordm9pZCBub2RlX3ByaW50KHN0cnVjdCBwcmludF9idWYgKmJ1Ziwgc3RydWN0IG5vZGUgKm5fcHRyLCBjaGFyICpzdHIpOworc3RhdGljIHZvaWQgbm9kZV9sb3N0X2NvbnRhY3Qoc3RydWN0IG5vZGUgKm5fcHRyKTsKK3N0YXRpYyB2b2lkIG5vZGVfZXN0YWJsaXNoZWRfY29udGFjdChzdHJ1Y3Qgbm9kZSAqbl9wdHIpOworCitzdHJ1Y3Qgbm9kZSAqdGlwY19ub2RlcyA9IE5VTEw7CS8qIHNvcnRlZCBsaXN0IG9mIG5vZGVzIHdpdGhpbiBjbHVzdGVyICovCisKK3UzMiB0aXBjX293bl90YWcgPSAwOworCitzdHJ1Y3Qgbm9kZSAqdGlwY19ub2RlX2NyZWF0ZSh1MzIgYWRkcikKK3sKKwlzdHJ1Y3QgY2x1c3RlciAqY19wdHI7CisJc3RydWN0IG5vZGUgKm5fcHRyOworICAgICAgICBzdHJ1Y3Qgbm9kZSAqKmN1cnJfbm9kZTsKKworCW5fcHRyID0ga21hbGxvYyhzaXplb2YoKm5fcHRyKSxHRlBfQVRPTUlDKTsKKyAgICAgICAgaWYgKG5fcHRyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQobl9wdHIsIDAsIHNpemVvZigqbl9wdHIpKTsKKyAgICAgICAgICAgICAgICBuX3B0ci0+YWRkciA9IGFkZHI7CisgICAgICAgICAgICAgICAgbl9wdHItPmxvY2sgPSAgU1BJTl9MT0NLX1VOTE9DS0VEOwkKKyAgICAgICAgICAgICAgICBJTklUX0xJU1RfSEVBRCgmbl9wdHItPm5zdWIpOworCQorCQljX3B0ciA9IHRpcGNfY2x0cl9maW5kKGFkZHIpOworICAgICAgICAgICAgICAgIGlmIChjX3B0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgY19wdHIgPSB0aXBjX2NsdHJfY3JlYXRlKGFkZHIpOworICAgICAgICAgICAgICAgIGlmIChjX3B0ciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuX3B0ci0+b3duZXIgPSBjX3B0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpcGNfY2x0cl9hdHRhY2hfbm9kZShjX3B0ciwgbl9wdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgbl9wdHItPmxhc3Rfcm91dGVyID0gLTE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc2VydCBub2RlIGludG8gb3JkZXJlZCBsaXN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGN1cnJfbm9kZSA9ICZ0aXBjX25vZGVzOyAqY3Vycl9ub2RlOyAKKwkJCSAgICAgY3Vycl9ub2RlID0gJigqY3Vycl9ub2RlKS0+bmV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkciA8ICgqY3Vycl9ub2RlKS0+YWRkcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fcHRyLT5uZXh0ID0gKmN1cnJfbm9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgKCpjdXJyX25vZGUpID0gbl9wdHI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKG5fcHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5fcHRyID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKwlyZXR1cm4gbl9wdHI7Cit9CisKK3ZvaWQgdGlwY19ub2RlX2RlbGV0ZShzdHJ1Y3Qgbm9kZSAqbl9wdHIpCit7CisJaWYgKCFuX3B0cikKKwkJcmV0dXJuOworCisjaWYgMAorCS8qIE5vdCBuZWVkZWQgYmVjYXVzZSBsaW5rcyBhcmUgYWxyZWFkeSBkZWxldGVkIHZpYSB0aXBjX2JlYXJlcl9zdG9wKCkgKi8KKworCXUzMiBsX251bTsKKworCWZvciAobF9udW0gPSAwOyBsX251bSA8IE1BWF9CRUFSRVJTOyBsX251bSsrKSB7CisJCWxpbmtfZGVsZXRlKG5fcHRyLT5saW5rc1tsX251bV0pOworCX0KKyNlbmRpZgorCisJZGJnKCJub2RlICV4IGRlbGV0ZWRcbiIsIG5fcHRyLT5hZGRyKTsKKwlrZnJlZShuX3B0cik7Cit9CisKKworLyoqCisgKiB0aXBjX25vZGVfbGlua191cCAtIGhhbmRsZSBhZGRpdGlvbiBvZiBsaW5rCisgKiAKKyAqIExpbmsgYmVjb21lcyBhY3RpdmUgKGFsb25lIG9yIHNoYXJlZCkgb3Igc3RhbmRieSwgZGVwZW5kaW5nIG9uIGl0cyBwcmlvcml0eS4KKyAqLworCit2b2lkIHRpcGNfbm9kZV9saW5rX3VwKHN0cnVjdCBub2RlICpuX3B0ciwgc3RydWN0IGxpbmsgKmxfcHRyKQoreworCXN0cnVjdCBsaW5rICoqYWN0aXZlID0gJm5fcHRyLT5hY3RpdmVfbGlua3NbMF07CisKKwlpbmZvKCJFc3RhYmxpc2hlZCBsaW5rIDwlcz4gb24gbmV0d29yayBwbGFuZSAlY1xuIiwKKwkgICAgIGxfcHRyLT5uYW1lLCBsX3B0ci0+Yl9wdHItPm5ldF9wbGFuZSk7CisJCisJaWYgKCFhY3RpdmVbMF0pIHsKKwkJZGJnKCIgbGluayAleCBpbnRvICV4LyV4XG4iLCBsX3B0ciwgJmFjdGl2ZVswXSwgJmFjdGl2ZVsxXSk7CisJCWFjdGl2ZVswXSA9IGFjdGl2ZVsxXSA9IGxfcHRyOworCQlub2RlX2VzdGFibGlzaGVkX2NvbnRhY3Qobl9wdHIpOworCQlyZXR1cm47CisJfQorCWlmIChsX3B0ci0+cHJpb3JpdHkgPCBhY3RpdmVbMF0tPnByaW9yaXR5KSB7IAorCQlpbmZvKCJMaW5rIGlzIHN0YW5kYnlcbiIpOworCQlyZXR1cm47CisJfQorCXRpcGNfbGlua19zZW5kX2R1cGxpY2F0ZShhY3RpdmVbMF0sIGxfcHRyKTsKKwlpZiAobF9wdHItPnByaW9yaXR5ID09IGFjdGl2ZVswXS0+cHJpb3JpdHkpIHsgCisJCWFjdGl2ZVswXSA9IGxfcHRyOworCQlyZXR1cm47CisJfQorCWluZm8oIkxpbmsgPCVzPiBvbiBuZXR3b3JrIHBsYW5lICVjIGJlY29tZXMgc3RhbmRieVxuIiwKKwkgICAgIGFjdGl2ZVswXS0+bmFtZSwgYWN0aXZlWzBdLT5iX3B0ci0+bmV0X3BsYW5lKTsKKwlhY3RpdmVbMF0gPSBhY3RpdmVbMV0gPSBsX3B0cjsKK30KKworLyoqCisgKiBub2RlX3NlbGVjdF9hY3RpdmVfbGlua3MgLSBzZWxlY3QgYWN0aXZlIGxpbmsKKyAqLworCitzdGF0aWMgdm9pZCBub2RlX3NlbGVjdF9hY3RpdmVfbGlua3Moc3RydWN0IG5vZGUgKm5fcHRyKQoreworCXN0cnVjdCBsaW5rICoqYWN0aXZlID0gJm5fcHRyLT5hY3RpdmVfbGlua3NbMF07CisJdTMyIGk7CisJdTMyIGhpZ2hlc3RfcHJpbyA9IDA7CisKKyAgICAgICAgYWN0aXZlWzBdID0gYWN0aXZlWzFdID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQkVBUkVSUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IGxpbmsgKmxfcHRyID0gbl9wdHItPmxpbmtzW2ldOworCisJCWlmICghbF9wdHIgfHwgIXRpcGNfbGlua19pc191cChsX3B0cikgfHwKKwkJICAgIChsX3B0ci0+cHJpb3JpdHkgPCBoaWdoZXN0X3ByaW8pKQorCQkJY29udGludWU7CisKKwkJaWYgKGxfcHRyLT5wcmlvcml0eSA+IGhpZ2hlc3RfcHJpbykgeworICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGVzdF9wcmlvID0gbF9wdHItPnByaW9yaXR5OworCQkJYWN0aXZlWzBdID0gYWN0aXZlWzFdID0gbF9wdHI7CisJCX0gZWxzZSB7CisJCQlhY3RpdmVbMV0gPSBsX3B0cjsKKwkJfQorCX0KK30KKworLyoqCisgKiB0aXBjX25vZGVfbGlua19kb3duIC0gaGFuZGxlIGxvc3Mgb2YgbGluaworICovCisKK3ZvaWQgdGlwY19ub2RlX2xpbmtfZG93bihzdHJ1Y3Qgbm9kZSAqbl9wdHIsIHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlzdHJ1Y3QgbGluayAqKmFjdGl2ZTsKKworCWlmICghdGlwY19saW5rX2lzX2FjdGl2ZShsX3B0cikpIHsKKwkJaW5mbygiTG9zdCBzdGFuZGJ5IGxpbmsgPCVzPiBvbiBuZXR3b3JrIHBsYW5lICVjXG4iLAorCQkgICAgIGxfcHRyLT5uYW1lLCBsX3B0ci0+Yl9wdHItPm5ldF9wbGFuZSk7CisJCXJldHVybjsKKwl9CisJaW5mbygiTG9zdCBsaW5rIDwlcz4gb24gbmV0d29yayBwbGFuZSAlY1xuIiwKKwkJbF9wdHItPm5hbWUsIGxfcHRyLT5iX3B0ci0+bmV0X3BsYW5lKTsKKworCWFjdGl2ZSA9ICZuX3B0ci0+YWN0aXZlX2xpbmtzWzBdOworCWlmIChhY3RpdmVbMF0gPT0gbF9wdHIpCisJCWFjdGl2ZVswXSA9IGFjdGl2ZVsxXTsKKwlpZiAoYWN0aXZlWzFdID09IGxfcHRyKQorCQlhY3RpdmVbMV0gPSBhY3RpdmVbMF07CisJaWYgKGFjdGl2ZVswXSA9PSBsX3B0cikKKwkJbm9kZV9zZWxlY3RfYWN0aXZlX2xpbmtzKG5fcHRyKTsKKwlpZiAodGlwY19ub2RlX2lzX3VwKG5fcHRyKSkgCisJCXRpcGNfbGlua19jaGFuZ2VvdmVyKGxfcHRyKTsKKwllbHNlIAorCQlub2RlX2xvc3RfY29udGFjdChuX3B0cik7Cit9CisKK2ludCB0aXBjX25vZGVfaGFzX2FjdGl2ZV9saW5rcyhzdHJ1Y3Qgbm9kZSAqbl9wdHIpCit7CisJcmV0dXJuIChuX3B0ciAmJiAKKwkJKChuX3B0ci0+YWN0aXZlX2xpbmtzWzBdKSB8fCAobl9wdHItPmFjdGl2ZV9saW5rc1sxXSkpKTsKK30KKworaW50IHRpcGNfbm9kZV9oYXNfcmVkdW5kYW50X2xpbmtzKHN0cnVjdCBub2RlICpuX3B0cikKK3sKKwlyZXR1cm4gKHRpcGNfbm9kZV9oYXNfYWN0aXZlX2xpbmtzKG5fcHRyKSAmJgorCQkobl9wdHItPmFjdGl2ZV9saW5rc1swXSAhPSBuX3B0ci0+YWN0aXZlX2xpbmtzWzFdKSk7Cit9CisKK2ludCB0aXBjX25vZGVfaGFzX2FjdGl2ZV9yb3V0ZXMoc3RydWN0IG5vZGUgKm5fcHRyKQoreworCXJldHVybiAobl9wdHIgJiYgKG5fcHRyLT5sYXN0X3JvdXRlciA+PSAwKSk7Cit9CisKK2ludCB0aXBjX25vZGVfaXNfdXAoc3RydWN0IG5vZGUgKm5fcHRyKQoreworCXJldHVybiAodGlwY19ub2RlX2hhc19hY3RpdmVfbGlua3Mobl9wdHIpIHx8IHRpcGNfbm9kZV9oYXNfYWN0aXZlX3JvdXRlcyhuX3B0cikpOworfQorCitzdHJ1Y3Qgbm9kZSAqdGlwY19ub2RlX2F0dGFjaF9saW5rKHN0cnVjdCBsaW5rICpsX3B0cikKK3sKKwlzdHJ1Y3Qgbm9kZSAqbl9wdHIgPSB0aXBjX25vZGVfZmluZChsX3B0ci0+YWRkcik7CisKKwlpZiAoIW5fcHRyKQorCQluX3B0ciA9IHRpcGNfbm9kZV9jcmVhdGUobF9wdHItPmFkZHIpOworICAgICAgICBpZiAobl9wdHIpIHsKKwkJdTMyIGJlYXJlcl9pZCA9IGxfcHRyLT5iX3B0ci0+aWRlbnRpdHk7CisJCWNoYXIgYWRkcl9zdHJpbmdbMTZdOworCisgICAgICAgICAgICAgICAgYXNzZXJ0KGJlYXJlcl9pZCA8IE1BWF9CRUFSRVJTKTsKKyAgICAgICAgICAgICAgICBpZiAobl9wdHItPmxpbmtfY250ID49IDIpIHsKKwkJCWNoYXIgYWRkcl9zdHJpbmdbMTZdOworCisgICAgICAgICAgICAgICAgICAgICAgICBlcnIoIkF0dGVtcHQgdG8gY3JlYXRlIHRoaXJkIGxpbmsgdG8gJXNcbiIsCisJCQkgICAgYWRkcl9zdHJpbmdfZmlsbChhZGRyX3N0cmluZywgbl9wdHItPmFkZHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghbl9wdHItPmxpbmtzW2JlYXJlcl9pZF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5fcHRyLT5saW5rc1tiZWFyZXJfaWRdID0gbF9wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICB0aXBjX25ldC56b25lc1t0aXBjX3pvbmUobF9wdHItPmFkZHIpXS0+bGlua3MrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5fcHRyLT5saW5rX2NudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5fcHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIoIkF0dGVtcHQgdG8gZXN0YWJsaXNoIHNlY29uZCBsaW5rIG9uIDwlcz4gdG8gPCVzPiBcbiIsCisgICAgICAgICAgICAgICAgICAgIGxfcHRyLT5iX3B0ci0+cHVibC5uYW1lLCAKKwkJICAgIGFkZHJfc3RyaW5nX2ZpbGwoYWRkcl9zdHJpbmcsIGxfcHRyLT5hZGRyKSk7CisgICAgICAgIH0KKwlyZXR1cm4gMDsKK30KKwordm9pZCB0aXBjX25vZGVfZGV0YWNoX2xpbmsoc3RydWN0IG5vZGUgKm5fcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpCit7CisJbl9wdHItPmxpbmtzW2xfcHRyLT5iX3B0ci0+aWRlbnRpdHldID0gMDsKKwl0aXBjX25ldC56b25lc1t0aXBjX3pvbmUobF9wdHItPmFkZHIpXS0+bGlua3MtLTsKKwluX3B0ci0+bGlua19jbnQtLTsKK30KKworLyoKKyAqIFJvdXRpbmcgdGFibGUgbWFuYWdlbWVudCAtIGZpdmUgY2FzZXMgdG8gaGFuZGxlOgorICoKKyAqIDE6IEEgbGluayB0b3dhcmRzIGEgem9uZS9jbHVzdGVyIGV4dGVybmFsIG5vZGUgY29tZXMgdXAuCisgKiAgICA9PiBTZW5kIGEgbXVsdGljYXN0IG1lc3NhZ2UgdXBkYXRpbmcgcm91dGluZyB0YWJsZXMgb2YgYWxsIAorICogICAgc3lzdGVtIG5vZGVzIHdpdGhpbiBvd24gY2x1c3RlciB0aGF0IHRoZSBuZXcgZGVzdGluYXRpb24gCisgKiAgICBjYW4gYmUgcmVhY2hlZCB2aWEgdGhpcyBub2RlLiAKKyAqICAgIChub2RlLmVzdGFibGlzaGVkQ29udGFjdCgpPT5jbHVzdGVyLm11bHRpY2FzdE5ld1JvdXRlKCkpCisgKgorICogMjogQSBsaW5rIHRvd2FyZHMgYSBzbGF2ZSBub2RlIGNvbWVzIHVwLgorICogICAgPT4gU2VuZCBhIG11bHRpY2FzdCBtZXNzYWdlIHVwZGF0aW5nIHJvdXRpbmcgdGFibGVzIG9mIGFsbCAKKyAqICAgIHN5c3RlbSBub2RlcyB3aXRoaW4gb3duIGNsdXN0ZXIgdGhhdCB0aGUgbmV3IGRlc3RpbmF0aW9uIAorICogICAgY2FuIGJlIHJlYWNoZWQgdmlhIHRoaXMgbm9kZS4gCisgKiAgICAobm9kZS5lc3RhYmxpc2hlZENvbnRhY3QoKT0+Y2x1c3Rlci5tdWx0aWNhc3ROZXdSb3V0ZSgpKQorICogICAgPT4gU2VuZCBhICBtZXNzYWdlIHRvIHRoZSBzbGF2ZSBub2RlIGFib3V0IGV4aXN0ZW5jZSAKKyAqICAgIG9mIGFsbCBzeXN0ZW0gbm9kZXMgd2l0aGluIGNsdXN0ZXI6CisgKiAgICAobm9kZS5lc3RhYmxpc2hlZENvbnRhY3QoKT0+Y2x1c3Rlci5zZW5kTG9jYWxSb3V0ZXMoKSkKKyAqCisgKiAzOiBBIG5ldyBjbHVzdGVyIGxvY2FsIHN5c3RlbSBub2RlIGJlY29tZXMgYXZhaWxhYmxlLgorICogICAgPT4gU2VuZCBtZXNzYWdlKHMpIHRvIHRoaXMgcGFydGljdWxhciBub2RlIGNvbnRhaW5pbmcKKyAqICAgIGluZm9ybWF0aW9uIGFib3V0IGFsbCBjbHVzdGVyIGV4dGVybmFsIGFuZCBzbGF2ZQorICogICAgIG5vZGVzIHdoaWNoIGNhbiBiZSByZWFjaGVkIHZpYSB0aGlzIG5vZGUuCisgKiAgICAobm9kZS5lc3RhYmxpc2hlZENvbnRhY3QoKT09Pm5ldHdvcmsuc2VuZEV4dGVybmFsUm91dGVzKCkpCisgKiAgICAobm9kZS5lc3RhYmxpc2hlZENvbnRhY3QoKT09Pm5ldHdvcmsuc2VuZFNsYXZlUm91dGVzKCkpCisgKiAgICA9PiBTZW5kIG1lc3NhZ2VzIHRvIGFsbCBkaXJlY3RseSBjb25uZWN0ZWQgc2xhdmUgbm9kZXMgCisgKiAgICBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGlzdGVuY2Ugb2YgdGhlIG5ldyBub2RlCisgKiAgICAobm9kZS5lc3RhYmxpc2hlZENvbnRhY3QoKT0+Y2x1c3Rlci5tdWx0aWNhc3ROZXdSb3V0ZSgpKQorICogICAgCisgKiA0OiBUaGUgbGluayB0b3dhcmRzIGEgem9uZS9jbHVzdGVyIGV4dGVybmFsIG5vZGUgb3Igc2xhdmUKKyAqICAgIG5vZGUgZ29lcyBkb3duLgorICogICAgPT4gU2VuZCBhIG11bHRjYXN0IG1lc3NhZ2UgdXBkYXRpbmcgcm91dGluZyB0YWJsZXMgb2YgYWxsIAorICogICAgbm9kZXMgd2l0aGluIGNsdXN0ZXIgdGhhdCB0aGUgbmV3IGRlc3RpbmF0aW9uIGNhbiBub3QgYW55CisgKiAgICBsb25nZXIgYmUgcmVhY2hlZCB2aWEgdGhpcyBub2RlLgorICogICAgKG5vZGUubG9zdEFsbExpbmtzKCk9PmNsdXN0ZXIuYmNhc3RMb3N0Um91dGUoKSkKKyAqCisgKiA1OiBBIGNsdXN0ZXIgbG9jYWwgc3lzdGVtIG5vZGUgYmVjb21lcyB1bmF2YWlsYWJsZS4KKyAqICAgID0+IFJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byB0aGlzIG5vZGUgZnJvbSB0aGUgbG9jYWwKKyAqICAgIHJvdXRpbmcgdGFibGVzLiBOb3RlOiBUaGlzIGlzIGEgY29tcGxldGVseSBub2RlCisgKiAgICBsb2NhbCBvcGVyYXRpb24uCisgKiAgICAobm9kZS5sb3N0QWxsTGlua3MoKT0+bmV0d29yay5yZW1vdmVBc1JvdXRlcigpKQorICogICAgPT4gU2VuZCBtZXNzYWdlcyB0byBhbGwgZGlyZWN0bHkgY29ubmVjdGVkIHNsYXZlIG5vZGVzIAorICogICAgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCBsb3NzIG9mIHRoZSBub2RlCisgKiAgICAobm9kZS5lc3RhYmxpc2hlZENvbnRhY3QoKT0+Y2x1c3Rlci5tdWx0aWNhc3RMb3N0Um91dGUoKSkKKyAqCisgKi8KKworc3RhdGljIHZvaWQgbm9kZV9lc3RhYmxpc2hlZF9jb250YWN0KHN0cnVjdCBub2RlICpuX3B0cikKK3sKKwlzdHJ1Y3QgY2x1c3RlciAqY19wdHI7CisKKwlkYmcoIm5vZGVfZXN0YWJsaXNoZWRfY29udGFjdDotPiAleFxuIiwgbl9wdHItPmFkZHIpOworCWlmICghdGlwY19ub2RlX2hhc19hY3RpdmVfcm91dGVzKG5fcHRyKSkgeyAKKwkJdGlwY19rX3NpZ25hbCgoSGFuZGxlcil0aXBjX25hbWVkX25vZGVfdXAsIG5fcHRyLT5hZGRyKTsKKwl9CisKKyAgICAgICAgLyogU3luY3Jvbml6ZSBicm9hZGNhc3QgYWNrcyAqLworICAgICAgICBuX3B0ci0+YmNsaW5rLmFja2VkID0gdGlwY19iY2xpbmtfZ2V0X2xhc3Rfc2VudCgpOworCisJaWYgKGlzX3NsYXZlKHRpcGNfb3duX2FkZHIpKQorCQlyZXR1cm47CisJaWYgKCFpbl9vd25fY2x1c3RlcihuX3B0ci0+YWRkcikpIHsKKwkJLyogVXNhZ2UgY2FzZSAxIChzZWUgYWJvdmUpICovCisJCWNfcHRyID0gdGlwY19jbHRyX2ZpbmQodGlwY19vd25fYWRkcik7CisJCWlmICghY19wdHIpCisJCQljX3B0ciA9IHRpcGNfY2x0cl9jcmVhdGUodGlwY19vd25fYWRkcik7CisgICAgICAgICAgICAgICAgaWYgKGNfcHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgdGlwY19jbHRyX2JjYXN0X25ld19yb3V0ZShjX3B0ciwgbl9wdHItPmFkZHIsIDEsIAorCQkJCQkJICB0aXBjX21heF9ub2Rlcyk7CisJCXJldHVybjsKKwl9IAorCisJY19wdHIgPSBuX3B0ci0+b3duZXI7CisJaWYgKGlzX3NsYXZlKG5fcHRyLT5hZGRyKSkgeworCQkvKiBVc2FnZSBjYXNlIDIgKHNlZSBhYm92ZSkgKi8KKwkJdGlwY19jbHRyX2JjYXN0X25ld19yb3V0ZShjX3B0ciwgbl9wdHItPmFkZHIsIDEsIHRpcGNfbWF4X25vZGVzKTsKKwkJdGlwY19jbHRyX3NlbmRfbG9jYWxfcm91dGVzKGNfcHRyLCBuX3B0ci0+YWRkcik7CisJCXJldHVybjsKKwl9CisKKwlpZiAobl9wdHItPmJjbGluay5zdXBwb3J0ZWQpIHsKKwkJdGlwY19ubWFwX2FkZCgmdGlwY19jbHRyX2JjYXN0X25vZGVzLCBuX3B0ci0+YWRkcik7CisJCWlmIChuX3B0ci0+YWRkciA8IHRpcGNfb3duX2FkZHIpCisJCQl0aXBjX293bl90YWcrKzsKKwl9CisKKwkvKiBDYXNlIDMgKHNlZSBhYm92ZSkgKi8KKwl0aXBjX25ldF9zZW5kX2V4dGVybmFsX3JvdXRlcyhuX3B0ci0+YWRkcik7CisJdGlwY19jbHRyX3NlbmRfc2xhdmVfcm91dGVzKGNfcHRyLCBuX3B0ci0+YWRkcik7CisJdGlwY19jbHRyX2JjYXN0X25ld19yb3V0ZShjX3B0ciwgbl9wdHItPmFkZHIsIExPV0VTVF9TTEFWRSwKKwkJCQkgIHRpcGNfaGlnaGVzdF9hbGxvd2VkX3NsYXZlKTsKK30KKworc3RhdGljIHZvaWQgbm9kZV9sb3N0X2NvbnRhY3Qoc3RydWN0IG5vZGUgKm5fcHRyKQoreworCXN0cnVjdCBjbHVzdGVyICpjX3B0cjsKKwlzdHJ1Y3Qgbm9kZV9zdWJzY3IgKm5zLCAqdG5zOworCWNoYXIgYWRkcl9zdHJpbmdbMTZdOworCXUzMiBpOworCisgICAgICAgIC8qIENsZWFuIHVwIGJyb2FkY2FzdCByZWNlcHRpb24gcmVtYWlucyAqLworICAgICAgICBuX3B0ci0+YmNsaW5rLmdhcF9hZnRlciA9IG5fcHRyLT5iY2xpbmsuZ2FwX3RvID0gMDsKKyAgICAgICAgd2hpbGUgKG5fcHRyLT5iY2xpbmsuZGVmZXJyZWRfaGVhZCkgeworICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmKiBidWYgPSBuX3B0ci0+YmNsaW5rLmRlZmVycmVkX2hlYWQ7CisgICAgICAgICAgICAgICAgbl9wdHItPmJjbGluay5kZWZlcnJlZF9oZWFkID0gYnVmLT5uZXh0OworICAgICAgICAgICAgICAgIGJ1Zl9kaXNjYXJkKGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5fcHRyLT5iY2xpbmsuZGVmcmFnbSkgeworICAgICAgICAgICAgICAgIGJ1Zl9kaXNjYXJkKG5fcHRyLT5iY2xpbmsuZGVmcmFnbSk7ICAKKyAgICAgICAgICAgICAgICBuX3B0ci0+YmNsaW5rLmRlZnJhZ20gPSBOVUxMOworICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgIGlmIChpbl9vd25fY2x1c3RlcihuX3B0ci0+YWRkcikgJiYgbl9wdHItPmJjbGluay5zdXBwb3J0ZWQpIHsgCisgICAgICAgICAgICAgICAgdGlwY19iY2xpbmtfYWNrbm93bGVkZ2Uobl9wdHIsIG1vZChuX3B0ci0+YmNsaW5rLmFja2VkICsgMTAwMDApKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFVwZGF0ZSByb3V0aW5nIHRhYmxlcyAqLworCWlmIChpc19zbGF2ZSh0aXBjX293bl9hZGRyKSkgeworCQl0aXBjX25ldF9yZW1vdmVfYXNfcm91dGVyKG5fcHRyLT5hZGRyKTsKKwl9IGVsc2UgeworCQlpZiAoIWluX293bl9jbHVzdGVyKG5fcHRyLT5hZGRyKSkgeyAKKwkJCS8qIENhc2UgNCAoc2VlIGFib3ZlKSAqLworCQkJY19wdHIgPSB0aXBjX2NsdHJfZmluZCh0aXBjX293bl9hZGRyKTsKKwkJCXRpcGNfY2x0cl9iY2FzdF9sb3N0X3JvdXRlKGNfcHRyLCBuX3B0ci0+YWRkciwgMSwKKwkJCQkJCSAgIHRpcGNfbWF4X25vZGVzKTsKKwkJfSBlbHNlIHsKKwkJCS8qIENhc2UgNSAoc2VlIGFib3ZlKSAqLworCQkJY19wdHIgPSB0aXBjX2NsdHJfZmluZChuX3B0ci0+YWRkcik7CisJCQlpZiAoaXNfc2xhdmUobl9wdHItPmFkZHIpKSB7CisJCQkJdGlwY19jbHRyX2JjYXN0X2xvc3Rfcm91dGUoY19wdHIsIG5fcHRyLT5hZGRyLCAxLAorCQkJCQkJCSAgIHRpcGNfbWF4X25vZGVzKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKG5fcHRyLT5iY2xpbmsuc3VwcG9ydGVkKSB7CisJCQkJCXRpcGNfbm1hcF9yZW1vdmUoJnRpcGNfY2x0cl9iY2FzdF9ub2RlcywgCisJCQkJCQkJIG5fcHRyLT5hZGRyKTsKKwkJCQkJaWYgKG5fcHRyLT5hZGRyIDwgdGlwY19vd25fYWRkcikKKwkJCQkJCXRpcGNfb3duX3RhZy0tOworCQkJCX0KKwkJCQl0aXBjX25ldF9yZW1vdmVfYXNfcm91dGVyKG5fcHRyLT5hZGRyKTsKKwkJCQl0aXBjX2NsdHJfYmNhc3RfbG9zdF9yb3V0ZShjX3B0ciwgbl9wdHItPmFkZHIsCisJCQkJCQkJICAgTE9XRVNUX1NMQVZFLAorCQkJCQkJCSAgIHRpcGNfaGlnaGVzdF9hbGxvd2VkX3NsYXZlKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAodGlwY19ub2RlX2hhc19hY3RpdmVfcm91dGVzKG5fcHRyKSkKKwkJcmV0dXJuOworCisJaW5mbygiTG9zdCBjb250YWN0IHdpdGggJXNcbiIsIAorCSAgICAgYWRkcl9zdHJpbmdfZmlsbChhZGRyX3N0cmluZywgbl9wdHItPmFkZHIpKTsKKworCS8qIEFib3J0IGxpbmsgY2hhbmdlb3ZlciAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfQkVBUkVSUzsgaSsrKSB7CisJCXN0cnVjdCBsaW5rICpsX3B0ciA9IG5fcHRyLT5saW5rc1tpXTsKKwkJaWYgKCFsX3B0cikgCisJCQljb250aW51ZTsKKwkJbF9wdHItPnJlc2V0X2NoZWNrcG9pbnQgPSBsX3B0ci0+bmV4dF9pbl9ubzsKKwkJbF9wdHItPmV4cF9tc2dfY291bnQgPSAwOworCQl0aXBjX2xpbmtfcmVzZXRfZnJhZ21lbnRzKGxfcHRyKTsKKwl9CisKKwkvKiBOb3RpZnkgc3Vic2NyaWJlcnMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobnMsIHRucywgJm5fcHRyLT5uc3ViLCBub2Rlc3ViX2xpc3QpIHsKKyAgICAgICAgICAgICAgICBucy0+bm9kZSA9IDA7CisJCWxpc3RfZGVsX2luaXQoJm5zLT5ub2Rlc3ViX2xpc3QpOworCQl0aXBjX2tfc2lnbmFsKChIYW5kbGVyKW5zLT5oYW5kbGVfbm9kZV9kb3duLAorCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpbnMtPnVzcl9oYW5kbGUpOworCX0KK30KKworLyoqCisgKiB0aXBjX25vZGVfc2VsZWN0X25leHRfaG9wIC0gZmluZCB0aGUgbmV4dC1ob3Agbm9kZSBmb3IgYSBtZXNzYWdlCisgKiAKKyAqIENhbGxlZCBieSB3aGVuIGNsdXN0ZXIgbG9jYWwgbG9va3VwIGhhcyBmYWlsZWQuCisgKi8KKworc3RydWN0IG5vZGUgKnRpcGNfbm9kZV9zZWxlY3RfbmV4dF9ob3AodTMyIGFkZHIsIHUzMiBzZWxlY3RvcikKK3sKKwlzdHJ1Y3Qgbm9kZSAqbl9wdHI7CisJdTMyIHJvdXRlcl9hZGRyOworCisgICAgICAgIGlmICghdGlwY19hZGRyX2RvbWFpbl92YWxpZChhZGRyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworCS8qIExvb2sgZm9yIGRpcmVjdCBsaW5rIHRvIGRlc3RpbmF0aW9uIHByb2Nlc3Nzb3IgKi8KKwluX3B0ciA9IHRpcGNfbm9kZV9maW5kKGFkZHIpOworCWlmIChuX3B0ciAmJiB0aXBjX25vZGVfaGFzX2FjdGl2ZV9saW5rcyhuX3B0cikpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5fcHRyOworCisJLyogQ2x1c3RlciBsb2NhbCBzeXN0ZW0gbm9kZXMgKm11c3QqIGhhdmUgZGlyZWN0IGxpbmtzICovCisJaWYgKCFpc19zbGF2ZShhZGRyKSAmJiBpbl9vd25fY2x1c3RlcihhZGRyKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBMb29rIGZvciBjbHVzdGVyIGxvY2FsIHJvdXRlciB3aXRoIGRpcmVjdCBsaW5rIHRvIG5vZGUgKi8KKwlyb3V0ZXJfYWRkciA9IHRpcGNfbm9kZV9zZWxlY3Rfcm91dGVyKG5fcHRyLCBzZWxlY3Rvcik7CisJaWYgKHJvdXRlcl9hZGRyKSAKKyAgICAgICAgICAgICAgICByZXR1cm4gdGlwY19ub2RlX3NlbGVjdChyb3V0ZXJfYWRkciwgc2VsZWN0b3IpOworCisJLyogU2xhdmUgbm9kZXMgY2FuIG9ubHkgYmUgYWNjZXNzZWQgd2l0aGluIG93biBjbHVzdGVyIHZpYSBhIAorCSAgIGtub3duIHJvdXRlciB3aXRoIGRpcmVjdCBsaW5rIC0tIGlmIG5vIHJvdXRlciB3YXMgZm91bmQsZ2l2ZSB1cCAqLworCWlmIChpc19zbGF2ZShhZGRyKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBJbnRlciB6b25lL2NsdXN0ZXIgLS0gZmluZCBhbnkgZGlyZWN0IGxpbmsgdG8gcmVtb3RlIGNsdXN0ZXIgKi8KKwlhZGRyID0gdGlwY19hZGRyKHRpcGNfem9uZShhZGRyKSwgdGlwY19jbHVzdGVyKGFkZHIpLCAwKTsKKwluX3B0ciA9IHRpcGNfbmV0X3NlbGVjdF9yZW1vdGVfbm9kZShhZGRyLCBzZWxlY3Rvcik7CisJaWYgKG5fcHRyICYmIHRpcGNfbm9kZV9oYXNfYWN0aXZlX2xpbmtzKG5fcHRyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbl9wdHI7CisKKwkvKiBMYXN0IHJlc29ydCAtLSBsb29rIGZvciBhbnkgcm91dGVyIHRvIGFueXdoZXJlIGluIHJlbW90ZSB6b25lICovCisJcm91dGVyX2FkZHIgPSAgdGlwY19uZXRfc2VsZWN0X3JvdXRlcihhZGRyLCBzZWxlY3Rvcik7CisJaWYgKHJvdXRlcl9hZGRyKSAKKyAgICAgICAgICAgICAgICByZXR1cm4gdGlwY19ub2RlX3NlbGVjdChyb3V0ZXJfYWRkciwgc2VsZWN0b3IpOworCisgICAgICAgIHJldHVybiAwOworfQorCisvKioKKyAqIHRpcGNfbm9kZV9zZWxlY3Rfcm91dGVyIC0gc2VsZWN0IHJvdXRlciB0byByZWFjaCBzcGVjaWZpZWQgbm9kZQorICogCisgKiBVc2VzIGEgZGV0ZXJtaW5pc3RpYyBhbmQgZmFpciBhbGdvcml0aG0gZm9yIHNlbGVjdGluZyByb3V0ZXIgbm9kZS4gCisgKi8KKwordTMyIHRpcGNfbm9kZV9zZWxlY3Rfcm91dGVyKHN0cnVjdCBub2RlICpuX3B0ciwgdTMyIHJlZikKK3sKKwl1MzIgdWxpbTsKKwl1MzIgbWFzazsKKwl1MzIgc3RhcnQ7CisJdTMyIHI7CisKKyAgICAgICAgaWYgKCFuX3B0cikKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworCWlmIChuX3B0ci0+bGFzdF9yb3V0ZXIgPCAwKQorCQlyZXR1cm4gMDsKKwl1bGltID0gKChuX3B0ci0+bGFzdF9yb3V0ZXIgKyAxKSAqIDMyKSAtIDE7CisKKwkvKiBTdGFydCBlbnRyeSBtdXN0IGJlIHJhbmRvbSAqLworCW1hc2sgPSB0aXBjX21heF9ub2RlczsKKwl3aGlsZSAobWFzayA+IHVsaW0pCisJCW1hc2sgPj49IDE7CisJc3RhcnQgPSByZWYgJiBtYXNrOworCXIgPSBzdGFydDsKKworCS8qIExvb2t1cCB1cHdhcmRzIHdpdGggd3JhcC1hcm91bmQgKi8KKwlkbyB7CisJCWlmICgoKG5fcHRyLT5yb3V0ZXJzW3IgLyAzMl0pID4+IChyICUgMzIpKSAmIDEpCisJCQlicmVhazsKKwl9IHdoaWxlICgrK3IgPD0gdWxpbSk7CisJaWYgKHIgPiB1bGltKSB7CisJCXIgPSAxOworCQlkbyB7CisJCQlpZiAoKChuX3B0ci0+cm91dGVyc1tyIC8gMzJdKSA+PiAociAlIDMyKSkgJiAxKQorCQkJCWJyZWFrOworCQl9IHdoaWxlICgrK3IgPCBzdGFydCk7CisJCWFzc2VydChyICE9IHN0YXJ0KTsKKwl9CisJYXNzZXJ0KHIgJiYgKHIgPD0gdWxpbSkpOworCXJldHVybiB0aXBjX2FkZHIob3duX3pvbmUoKSwgb3duX2NsdXN0ZXIoKSwgcik7Cit9CisKK3ZvaWQgdGlwY19ub2RlX2FkZF9yb3V0ZXIoc3RydWN0IG5vZGUgKm5fcHRyLCB1MzIgcm91dGVyKQoreworCXUzMiByX251bSA9IHRpcGNfbm9kZShyb3V0ZXIpOworCisJbl9wdHItPnJvdXRlcnNbcl9udW0gLyAzMl0gPSAKKwkJKCgxIDw8IChyX251bSAlIDMyKSkgfCBuX3B0ci0+cm91dGVyc1tyX251bSAvIDMyXSk7CisJbl9wdHItPmxhc3Rfcm91dGVyID0gdGlwY19tYXhfbm9kZXMgLyAzMjsKKwl3aGlsZSAoKC0tbl9wdHItPmxhc3Rfcm91dGVyID49IDApICYmIAorCSAgICAgICAhbl9wdHItPnJvdXRlcnNbbl9wdHItPmxhc3Rfcm91dGVyXSk7Cit9CisKK3ZvaWQgdGlwY19ub2RlX3JlbW92ZV9yb3V0ZXIoc3RydWN0IG5vZGUgKm5fcHRyLCB1MzIgcm91dGVyKQoreworCXUzMiByX251bSA9IHRpcGNfbm9kZShyb3V0ZXIpOworCisJaWYgKG5fcHRyLT5sYXN0X3JvdXRlciA8IDApCisJCXJldHVybjsJCS8qIE5vIHJvdXRlcyAqLworCisJbl9wdHItPnJvdXRlcnNbcl9udW0gLyAzMl0gPQorCQkoKH4oMSA8PCAocl9udW0gJSAzMikpKSAmIChuX3B0ci0+cm91dGVyc1tyX251bSAvIDMyXSkpOworCW5fcHRyLT5sYXN0X3JvdXRlciA9IHRpcGNfbWF4X25vZGVzIC8gMzI7CisJd2hpbGUgKCgtLW5fcHRyLT5sYXN0X3JvdXRlciA+PSAwKSAmJiAKKwkgICAgICAgIW5fcHRyLT5yb3V0ZXJzW25fcHRyLT5sYXN0X3JvdXRlcl0pOworCisJaWYgKCF0aXBjX25vZGVfaXNfdXAobl9wdHIpKQorCQlub2RlX2xvc3RfY29udGFjdChuX3B0cik7Cit9CisKKyNpZiAwCit2b2lkIG5vZGVfcHJpbnQoc3RydWN0IHByaW50X2J1ZiAqYnVmLCBzdHJ1Y3Qgbm9kZSAqbl9wdHIsIGNoYXIgKnN0cikKK3sKKwl1MzIgaTsKKworCXRpcGNfcHJpbnRmKGJ1ZiwgIlxuXG4lcyIsIHN0cik7CisJZm9yIChpID0gMDsgaSA8IE1BWF9CRUFSRVJTOyBpKyspIHsKKwkJaWYgKCFuX3B0ci0+bGlua3NbaV0pIAorCQkJY29udGludWU7CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIkxpbmtzWyV1XTogJXgsICIsIGksIG5fcHRyLT5saW5rc1tpXSk7CisJfQorCXRpcGNfcHJpbnRmKGJ1ZiwgIkFjdGl2ZSBsaW5rczogWyV4LCV4XVxuIiwKKwkJICAgIG5fcHRyLT5hY3RpdmVfbGlua3NbMF0sIG5fcHRyLT5hY3RpdmVfbGlua3NbMV0pOworfQorI2VuZGlmCisKK3UzMiB0aXBjX2F2YWlsYWJsZV9ub2Rlcyhjb25zdCB1MzIgZG9tYWluKQoreworCXN0cnVjdCBub2RlICpuX3B0cjsKKwl1MzIgY250ID0gMDsKKworCWZvciAobl9wdHIgPSB0aXBjX25vZGVzOyBuX3B0cjsgbl9wdHIgPSBuX3B0ci0+bmV4dCkgeworCQlpZiAoIWluX3Njb3BlKGRvbWFpbiwgbl9wdHItPmFkZHIpKQorCQkJY29udGludWU7CisJCWlmICh0aXBjX25vZGVfaXNfdXAobl9wdHIpKQorCQkJY250Kys7CisJfQorCXJldHVybiBjbnQ7Cit9CisKK3N0cnVjdCBza19idWZmICp0aXBjX25vZGVfZ2V0X25vZGVzKGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UpCit7CisJdTMyIGRvbWFpbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXN0cnVjdCBub2RlICpuX3B0cjsKKyAgICAgICAgc3RydWN0IHRpcGNfbm9kZV9pbmZvIG5vZGVfaW5mbzsKKworCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfTkVUX0FERFIpKQorCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisKKwlkb21haW4gPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJZG9tYWluID0gbnRvaGwoZG9tYWluKTsKKwlpZiAoIXRpcGNfYWRkcl9kb21haW5fdmFsaWQoZG9tYWluKSkKKwkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19JTlZBTElEX1ZBTFVFCisJCQkJCQkgICAiIChuZXR3b3JrIGFkZHJlc3MpIik7CisKKyAgICAgICAgaWYgKCF0aXBjX25vZGVzKQorICAgICAgICAgICAgICAgIHJldHVybiB0aXBjX2NmZ19yZXBseV9ub25lKCk7CisKKwkvKiBGb3Igbm93LCBnZXQgc3BhY2UgZm9yIGFsbCBvdGhlciBub2RlcyAKKwkgICAod2lsbCBuZWVkIHRvIG1vZGlmeSB0aGlzIHdoZW4gc2xhdmUgbm9kZXMgYXJlIHN1cHBvcnRlZCAqLworCisJYnVmID0gdGlwY19jZmdfcmVwbHlfYWxsb2MoVExWX1NQQUNFKHNpemVvZihub2RlX2luZm8pKSAqCisJCQkJICAgKHRpcGNfbWF4X25vZGVzIC0gMSkpOworCWlmICghYnVmKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIEFkZCBUTFZzIGZvciBhbGwgbm9kZXMgaW4gc2NvcGUgKi8KKworCWZvciAobl9wdHIgPSB0aXBjX25vZGVzOyBuX3B0cjsgbl9wdHIgPSBuX3B0ci0+bmV4dCkgeworCQlpZiAoIWluX3Njb3BlKGRvbWFpbiwgbl9wdHItPmFkZHIpKQorCQkJY29udGludWU7CisgICAgICAgICAgICAgICAgbm9kZV9pbmZvLmFkZHIgPSBodG9ubChuX3B0ci0+YWRkcik7CisgICAgICAgICAgICAgICAgbm9kZV9pbmZvLnVwID0gaHRvbmwodGlwY19ub2RlX2lzX3VwKG5fcHRyKSk7CisJCXRpcGNfY2ZnX2FwcGVuZF90bHYoYnVmLCBUSVBDX1RMVl9OT0RFX0lORk8sIAorCQkJCSAgICAmbm9kZV9pbmZvLCBzaXplb2Yobm9kZV9pbmZvKSk7CisJfQorCisJcmV0dXJuIGJ1ZjsKK30KKworc3RydWN0IHNrX2J1ZmYgKnRpcGNfbm9kZV9nZXRfbGlua3MoY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLCBpbnQgcmVxX3Rsdl9zcGFjZSkKK3sKKwl1MzIgZG9tYWluOworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IG5vZGUgKm5fcHRyOworICAgICAgICBzdHJ1Y3QgdGlwY19saW5rX2luZm8gbGlua19pbmZvOworCisJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9ORVRfQUREUikpCisJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKKworCWRvbWFpbiA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKKwlkb21haW4gPSBudG9obChkb21haW4pOworCWlmICghdGlwY19hZGRyX2RvbWFpbl92YWxpZChkb21haW4pKQorCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX0lOVkFMSURfVkFMVUUKKwkJCQkJCSAgICIgKG5ldHdvcmsgYWRkcmVzcykiKTsKKworICAgICAgICBpZiAoIXRpcGNfbm9kZXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKKworCS8qIEZvciBub3csIGdldCBzcGFjZSBmb3IgMiBsaW5rcyB0byBhbGwgb3RoZXIgbm9kZXMgKyBiY2FzdCBsaW5rIAorCSAgICh3aWxsIG5lZWQgdG8gbW9kaWZ5IHRoaXMgd2hlbiBzbGF2ZSBub2RlcyBhcmUgc3VwcG9ydGVkICovCisKKwlidWYgPSB0aXBjX2NmZ19yZXBseV9hbGxvYyhUTFZfU1BBQ0Uoc2l6ZW9mKGxpbmtfaW5mbykpICoKKwkJCQkgICAoMiAqICh0aXBjX21heF9ub2RlcyAtIDEpICsgMSkpOworCWlmICghYnVmKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIEFkZCBUTFYgZm9yIGJyb2FkY2FzdCBsaW5rICovCisKKyAgICAgICAgbGlua19pbmZvLmRlc3QgPSB0aXBjX293bl9hZGRyICYgMHhmZmZmZjAwOworCWxpbmtfaW5mby5kZXN0ID0gaHRvbmwobGlua19pbmZvLmRlc3QpOworICAgICAgICBsaW5rX2luZm8udXAgPSBodG9ubCgxKTsKKyAgICAgICAgc3ByaW50ZihsaW5rX2luZm8uc3RyLCB0aXBjX2JjbGlua19uYW1lKTsKKwl0aXBjX2NmZ19hcHBlbmRfdGx2KGJ1ZiwgVElQQ19UTFZfTElOS19JTkZPLCAmbGlua19pbmZvLCBzaXplb2YobGlua19pbmZvKSk7CisKKwkvKiBBZGQgVExWcyBmb3IgYW55IG90aGVyIGxpbmtzIGluIHNjb3BlICovCisKKwlmb3IgKG5fcHRyID0gdGlwY19ub2Rlczsgbl9wdHI7IG5fcHRyID0gbl9wdHItPm5leHQpIHsKKyAgICAgICAgICAgICAgICB1MzIgaTsKKworCQlpZiAoIWluX3Njb3BlKGRvbWFpbiwgbl9wdHItPmFkZHIpKQorCQkJY29udGludWU7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9CRUFSRVJTOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbl9wdHItPmxpbmtzW2ldKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5rX2luZm8uZGVzdCA9IGh0b25sKG5fcHRyLT5hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfaW5mby51cCA9IGh0b25sKHRpcGNfbGlua19pc191cChuX3B0ci0+bGlua3NbaV0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweShsaW5rX2luZm8uc3RyLCBuX3B0ci0+bGlua3NbaV0tPm5hbWUpOworCQkJdGlwY19jZmdfYXBwZW5kX3RsdihidWYsIFRJUENfVExWX0xJTktfSU5GTywgCisJCQkJCSAgICAmbGlua19pbmZvLCBzaXplb2YobGlua19pbmZvKSk7CisgICAgICAgICAgICAgICAgfQorCX0KKworCXJldHVybiBidWY7Cit9CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9ub2RlLmggYi9uZXQvdGlwYy9ub2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmN2FlNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL25vZGUuaApAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIG5ldC90aXBjL25vZGUuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIG5vZGUgbWFuYWdlbWVudCByb3V0aW5lcworICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX05PREVfSAorI2RlZmluZSBfVElQQ19OT0RFX0gKKworI2luY2x1ZGUgIm5vZGVfc3Vic2NyLmgiCisjaW5jbHVkZSAiYWRkci5oIgorI2luY2x1ZGUgImNsdXN0ZXIuaCIKKyNpbmNsdWRlICJiZWFyZXIuaCIKKworLyoqCisgKiBzdHJ1Y3Qgbm9kZSAtIFRJUEMgbm9kZSBzdHJ1Y3R1cmUKKyAqIEBhZGRyOiBuZXR3b3JrIGFkZHJlc3Mgb2Ygbm9kZQorICogQGxvY2s6IHNwaW5sb2NrIGdvdmVybmluZyBhY2Nlc3MgdG8gc3RydWN0dXJlCisgKiBAb3duZXI6IHBvaW50ZXIgdG8gY2x1c3RlciB0aGF0IG5vZGUgYmVsb25ncyB0bworICogQG5leHQ6IHBvaW50ZXIgdG8gbmV4dCBub2RlIGluIHNvcnRlZCBsaXN0IG9mIGNsdXN0ZXIncyBub2RlcworICogQG5zdWI6IGxpc3Qgb2YgIm5vZGUgZG93biIgc3Vic2NyaXB0aW9ucyBtb25pdG9yaW5nIG5vZGUKKyAqIEBhY3RpdmVfbGlua3M6IHBvaW50ZXJzIHRvIGFjdGl2ZSBsaW5rcyB0byBub2RlCisgKiBAbGlua3M6IHBvaW50ZXJzIHRvIGFsbCBsaW5rcyB0byBub2RlCisgKiBAbGlua19jbnQ6IG51bWJlciBvZiBsaW5rcyB0byBub2RlCisgKiBAcGVybWl0X2NoYW5nZW92ZXI6IG5vbi16ZXJvIGlmIG5vZGUgaGFzIHJlZHVuZGFudCBsaW5rcyB0byB0aGlzIHN5c3RlbQorICogQHJvdXRlcnM6IGJpdG1hcCAodXNlZCBmb3IgbXVsdGljbHVzdGVyIGNvbW11bmljYXRpb24pCisgKiBAbGFzdF9yb3V0ZXI6ICh1c2VkIGZvciBtdWx0aWNsdXN0ZXIgY29tbXVuaWNhdGlvbikKKyAqIEBiY2xpbms6IGJyb2FkY2FzdC1yZWxhdGVkIGluZm8KKyAqICAgIEBzdXBwb3J0ZWQ6IG5vbi16ZXJvIGlmIG5vZGUgc3VwcG9ydHMgVElQQyBiJ2Nhc3QgY2FwYWJpbGl0eQorICogICAgQGFja2VkOiBzZXF1ZW5jZSAjIG9mIGxhc3Qgb3V0Ym91bmQgYidjYXN0IG1lc3NhZ2UgYWNrbm93bGVkZ2VkIGJ5IG5vZGUKKyAqICAgIEBsYXN0X2luOiBzZXF1ZW5jZSAjIG9mIGxhc3QgaW4tc2VxdWVuY2UgYidjYXN0IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBub2RlCisgKiAgICBAZ2FwX2FmdGVyOiBzZXF1ZW5jZSAjIG9mIGxhc3QgbWVzc2FnZSBub3QgcmVxdWlyaW5nIGEgTkFLIHJlcXVlc3QKKyAqICAgIEBnYXBfdG86IHNlcXVlbmNlICMgb2YgbGFzdCBtZXNzYWdlIHJlcXVpcmluZyBhIE5BSyByZXF1ZXN0CisgKiAgICBAbmFja19zeW5jOiBjb3VudGVyIHRoYXQgZGV0ZXJtaW5lcyB3aGVuIE5BSyByZXF1ZXN0cyBzaG91bGQgYmUgc2VudAorICogICAgQGRlZmVycmVkX2hlYWQ6IG9sZGVzdCBPT1MgYidjYXN0IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBub2RlCisgKiAgICBAZGVmZXJyZWRfdGFpbDogbmV3ZXN0IE9PUyBiJ2Nhc3QgbWVzc2FnZSByZWNlaXZlZCBmcm9tIG5vZGUKKyAqICAgIEBkZWZyYWdtOiBsaXN0IG9mIHBhcnRpYWxseSByZWFzc2VtYmxlZCBiJ2Nhc3QgbWVzc2FnZSBmcmFnbWVudHMgZnJvbSBub2RlCisgKi8KKyAKK3N0cnVjdCBub2RlIHsKKwl1MzIgYWRkcjsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IGNsdXN0ZXIgKm93bmVyOworCXN0cnVjdCBub2RlICpuZXh0OworCXN0cnVjdCBsaXN0X2hlYWQgbnN1YjsKKwlzdHJ1Y3QgbGluayAqYWN0aXZlX2xpbmtzWzJdOworCXN0cnVjdCBsaW5rICpsaW5rc1tNQVhfQkVBUkVSU107CisJaW50IGxpbmtfY250OworCWludCBwZXJtaXRfY2hhbmdlb3ZlcjsKKwl1MzIgcm91dGVyc1s1MTIvMzJdOworCWludCBsYXN0X3JvdXRlcjsKKwlzdHJ1Y3QgeworCQlpbnQgc3VwcG9ydGVkOworCQl1MzIgYWNrZWQ7CisJCXUzMiBsYXN0X2luOworCQl1MzIgZ2FwX2FmdGVyOyAKKwkJdTMyIGdhcF90bzsgCisJCXUzMiBuYWNrX3N5bmM7CisJCXN0cnVjdCBza19idWZmICpkZWZlcnJlZF9oZWFkOworCQlzdHJ1Y3Qgc2tfYnVmZiAqZGVmZXJyZWRfdGFpbDsKKwkJc3RydWN0IHNrX2J1ZmYgKmRlZnJhZ207CisJfSBiY2xpbms7Cit9OworCitleHRlcm4gc3RydWN0IG5vZGUgKnRpcGNfbm9kZXM7CitleHRlcm4gdTMyIHRpcGNfb3duX3RhZzsKKworc3RydWN0IG5vZGUgKnRpcGNfbm9kZV9jcmVhdGUodTMyIGFkZHIpOwordm9pZCB0aXBjX25vZGVfZGVsZXRlKHN0cnVjdCBub2RlICpuX3B0cik7CitzdHJ1Y3Qgbm9kZSAqdGlwY19ub2RlX2F0dGFjaF9saW5rKHN0cnVjdCBsaW5rICpsX3B0cik7Cit2b2lkIHRpcGNfbm9kZV9kZXRhY2hfbGluayhzdHJ1Y3Qgbm9kZSAqbl9wdHIsIHN0cnVjdCBsaW5rICpsX3B0cik7Cit2b2lkIHRpcGNfbm9kZV9saW5rX2Rvd24oc3RydWN0IG5vZGUgKm5fcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpOwordm9pZCB0aXBjX25vZGVfbGlua191cChzdHJ1Y3Qgbm9kZSAqbl9wdHIsIHN0cnVjdCBsaW5rICpsX3B0cik7CitpbnQgdGlwY19ub2RlX2hhc19hY3RpdmVfbGlua3Moc3RydWN0IG5vZGUgKm5fcHRyKTsKK2ludCB0aXBjX25vZGVfaGFzX3JlZHVuZGFudF9saW5rcyhzdHJ1Y3Qgbm9kZSAqbl9wdHIpOwordTMyIHRpcGNfbm9kZV9zZWxlY3Rfcm91dGVyKHN0cnVjdCBub2RlICpuX3B0ciwgdTMyIHJlZik7CitzdHJ1Y3Qgbm9kZSAqdGlwY19ub2RlX3NlbGVjdF9uZXh0X2hvcCh1MzIgYWRkciwgdTMyIHNlbGVjdG9yKTsKK2ludCB0aXBjX25vZGVfaXNfdXAoc3RydWN0IG5vZGUgKm5fcHRyKTsKK3ZvaWQgdGlwY19ub2RlX2FkZF9yb3V0ZXIoc3RydWN0IG5vZGUgKm5fcHRyLCB1MzIgcm91dGVyKTsKK3ZvaWQgdGlwY19ub2RlX3JlbW92ZV9yb3V0ZXIoc3RydWN0IG5vZGUgKm5fcHRyLCB1MzIgcm91dGVyKTsKK3N0cnVjdCBza19idWZmICp0aXBjX25vZGVfZ2V0X2xpbmtzKGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UpOworc3RydWN0IHNrX2J1ZmYgKnRpcGNfbm9kZV9nZXRfbm9kZXMoY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLCBpbnQgcmVxX3Rsdl9zcGFjZSk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5vZGUgKnRpcGNfbm9kZV9maW5kKHUzMiBhZGRyKQoreworCWlmIChsaWtlbHkoaW5fb3duX2NsdXN0ZXIoYWRkcikpKQorCQlyZXR1cm4gdGlwY19sb2NhbF9ub2Rlc1t0aXBjX25vZGUoYWRkcildOworCWVsc2UgaWYgKHRpcGNfYWRkcl9kb21haW5fdmFsaWQoYWRkcikpIHsKKwkJc3RydWN0IGNsdXN0ZXIgKmNfcHRyID0gdGlwY19jbHRyX2ZpbmQoYWRkcik7CisKKwkJaWYgKGNfcHRyKQorCQkJcmV0dXJuIGNfcHRyLT5ub2Rlc1t0aXBjX25vZGUoYWRkcildOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgbm9kZSAqdGlwY19ub2RlX3NlbGVjdCh1MzIgYWRkciwgdTMyIHNlbGVjdG9yKQoreworCWlmIChsaWtlbHkoaW5fb3duX2NsdXN0ZXIoYWRkcikpKQorCQlyZXR1cm4gdGlwY19sb2NhbF9ub2Rlc1t0aXBjX25vZGUoYWRkcildOworCXJldHVybiB0aXBjX25vZGVfc2VsZWN0X25leHRfaG9wKGFkZHIsIHNlbGVjdG9yKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRpcGNfbm9kZV9sb2NrKHN0cnVjdCBub2RlICpuX3B0cikKK3sKKwlzcGluX2xvY2tfYmgoJm5fcHRyLT5sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRpcGNfbm9kZV91bmxvY2soc3RydWN0IG5vZGUgKm5fcHRyKQoreworCXNwaW5fdW5sb2NrX2JoKCZuX3B0ci0+bG9jayk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbm9kZV9zdWJzY3IuYyBiL25ldC90aXBjL25vZGVfc3Vic2NyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlZWExMgotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL25vZGVfc3Vic2NyLmMKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIG5ldC90aXBjL25vZGVfc3Vic2NyLmM6IFRJUEMgIm5vZGUgZG93biIgc3Vic2NyaXB0aW9uIGhhbmRsaW5nCisgKiAKKyAqIENvcHlyaWdodCAoYykgMTk5NS0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAiZGJnLmgiCisjaW5jbHVkZSAibm9kZV9zdWJzY3IuaCIKKyNpbmNsdWRlICJub2RlLmgiCisjaW5jbHVkZSAiYWRkci5oIgorCisvKioKKyAqIHRpcGNfbm9kZXN1Yl9zdWJzY3JpYmUgLSBjcmVhdGUgIm5vZGUgZG93biIgc3Vic2NyaXB0aW9uIGZvciBzcGVjaWZpZWQgbm9kZQorICovCisKK3ZvaWQgdGlwY19ub2Rlc3ViX3N1YnNjcmliZShzdHJ1Y3Qgbm9kZV9zdWJzY3IgKm5vZGVfc3ViLCB1MzIgYWRkciwgCisJCSAgICAgICB2b2lkICp1c3JfaGFuZGxlLCBuZXRfZXZfaGFuZGxlciBoYW5kbGVfZG93bikKK3sKKwlub2RlX3N1Yi0+bm9kZSA9IDA7CisJaWYgKGFkZHIgPT0gdGlwY19vd25fYWRkcikKKwkJcmV0dXJuOworCWlmICghdGlwY19hZGRyX25vZGVfdmFsaWQoYWRkcikpIHsKKwkJd2Fybigibm9kZV9zdWJzY3Igd2l0aCBpbGxlZ2FsICV4XG4iLCBhZGRyKTsKKwkJcmV0dXJuOworCX0KKworCW5vZGVfc3ViLT5oYW5kbGVfbm9kZV9kb3duID0gaGFuZGxlX2Rvd247CisJbm9kZV9zdWItPnVzcl9oYW5kbGUgPSB1c3JfaGFuZGxlOworCW5vZGVfc3ViLT5ub2RlID0gdGlwY19ub2RlX2ZpbmQoYWRkcik7CisJYXNzZXJ0KG5vZGVfc3ViLT5ub2RlKTsKKwl0aXBjX25vZGVfbG9jayhub2RlX3N1Yi0+bm9kZSk7CisJbGlzdF9hZGRfdGFpbCgmbm9kZV9zdWItPm5vZGVzdWJfbGlzdCwgJm5vZGVfc3ViLT5ub2RlLT5uc3ViKTsKKwl0aXBjX25vZGVfdW5sb2NrKG5vZGVfc3ViLT5ub2RlKTsKK30KKworLyoqCisgKiB0aXBjX25vZGVzdWJfdW5zdWJzY3JpYmUgLSBjYW5jZWwgIm5vZGUgZG93biIgc3Vic2NyaXB0aW9uIChpZiBhbnkpCisgKi8KKwordm9pZCB0aXBjX25vZGVzdWJfdW5zdWJzY3JpYmUoc3RydWN0IG5vZGVfc3Vic2NyICpub2RlX3N1YikKK3sKKwlpZiAoIW5vZGVfc3ViLT5ub2RlKQorCQlyZXR1cm47CisKKwl0aXBjX25vZGVfbG9jayhub2RlX3N1Yi0+bm9kZSk7CisJbGlzdF9kZWxfaW5pdCgmbm9kZV9zdWItPm5vZGVzdWJfbGlzdCk7CisJdGlwY19ub2RlX3VubG9jayhub2RlX3N1Yi0+bm9kZSk7Cit9CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9ub2RlX3N1YnNjci5oIGIvbmV0L3RpcGMvbm9kZV9zdWJzY3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTc1MWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvbm9kZV9zdWJzY3IuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogbmV0L3RpcGMvbm9kZV9zdWJzY3IuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDICJub2RlIGRvd24iIHN1YnNjcmlwdGlvbiBoYW5kbGluZworICogCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX05PREVfU1VCU0NSX0gKKyNkZWZpbmUgX1RJUENfTk9ERV9TVUJTQ1JfSAorCisjaW5jbHVkZSAiYWRkci5oIgorCit0eXBlZGVmIHZvaWQgKCpuZXRfZXZfaGFuZGxlcikgKHZvaWQgKnVzcl9oYW5kbGUpOworCisvKioKKyAqIHN0cnVjdCBub2RlX3N1YnNjciAtICJub2RlIGRvd24iIHN1YnNjcmlwdGlvbiBlbnRyeQorICogQG5vZGU6IHB0ciB0byBub2RlIHN0cnVjdHVyZSBvZiBpbnRlcmVzdCAob3IgTlVMTCwgaWYgbm9uZSkKKyAqIEBoYW5kbGVfbm9kZV9kb3duOiByb3V0aW5lIHRvIGludm9rZSB3aGVuIG5vZGUgZmFpbHMKKyAqIEB1c3JfaGFuZGxlOiBhcmd1bWVudCB0byBwYXNzIHRvIHJvdXRpbmUgd2hlbiBub2RlIGZhaWxzCisgKiBAbm9kZXN1Yl9saXN0OiBhZGphY2VudCBlbnRyaWVzIGluIGxpc3Qgb2Ygc3Vic2NyaXB0aW9ucyBmb3IgdGhlIG5vZGUKKyAqLworCitzdHJ1Y3Qgbm9kZV9zdWJzY3IgeworCXN0cnVjdCBub2RlICpub2RlOworCW5ldF9ldl9oYW5kbGVyIGhhbmRsZV9ub2RlX2Rvd247CisJdm9pZCAqdXNyX2hhbmRsZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGVzdWJfbGlzdDsKK307CisKK3ZvaWQgdGlwY19ub2Rlc3ViX3N1YnNjcmliZShzdHJ1Y3Qgbm9kZV9zdWJzY3IgKm5vZGVfc3ViLCB1MzIgYWRkciwKKwkJCSAgICB2b2lkICp1c3JfaGFuZGxlLCBuZXRfZXZfaGFuZGxlciBoYW5kbGVfZG93bik7Cit2b2lkIHRpcGNfbm9kZXN1Yl91bnN1YnNjcmliZShzdHJ1Y3Qgbm9kZV9zdWJzY3IgKm5vZGVfc3ViKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9wb3J0LmMgYi9uZXQvdGlwYy9wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJhYWU1MgotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL3BvcnQuYwpAQCAtMCwwICsxLDE3MDggQEAKKy8qCisgKiBuZXQvdGlwYy9wb3J0LmM6IFRJUEMgcG9ydCBjb2RlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMTk5Mi0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJkYmcuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAiYWRkci5oIgorI2luY2x1ZGUgImxpbmsuaCIKKyNpbmNsdWRlICJub2RlLmgiCisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgIm5hbWVfdGFibGUuaCIKKyNpbmNsdWRlICJ1c2VyX3JlZy5oIgorI2luY2x1ZGUgIm1zZy5oIgorI2luY2x1ZGUgImJjYXN0LmgiCisKKy8qIENvbm5lY3Rpb24gbWFuYWdlbWVudDogKi8KKyNkZWZpbmUgUFJPQklOR19JTlRFUlZBTCAzNjAwMDAwCS8qIFttc10gPT4gMSBoICovCisjZGVmaW5lIENPTkZJUk1FRCAwCisjZGVmaW5lIFBST0JJTkcgMQorCisjZGVmaW5lIE1BWF9SRUpFQ1RfU0laRSAxMDI0CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqbXNnX3F1ZXVlX2hlYWQgPSAwOworc3RhdGljIHN0cnVjdCBza19idWZmICptc2dfcXVldWVfdGFpbCA9IDA7CisKK3NwaW5sb2NrX3QgdGlwY19wb3J0X2xpc3RfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBzcGlubG9ja190IHF1ZXVlX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CisKK3N0YXRpYyBMSVNUX0hFQUQocG9ydHMpOworc3RhdGljIHZvaWQgcG9ydF9oYW5kbGVfbm9kZV9kb3duKHVuc2lnbmVkIGxvbmcgcmVmKTsKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiogcG9ydF9idWlsZF9zZWxmX2Fib3J0X21zZyhzdHJ1Y3QgcG9ydCAqLHUzMiBlcnIpOworc3RhdGljIHN0cnVjdCBza19idWZmKiBwb3J0X2J1aWxkX3BlZXJfYWJvcnRfbXNnKHN0cnVjdCBwb3J0ICosdTMyIGVycik7CitzdGF0aWMgdm9pZCBwb3J0X3RpbWVvdXQodW5zaWduZWQgbG9uZyByZWYpOworCisKK3N0YXRpYyBpbmxpbmUgdTMyIHBvcnRfcGVlcm5vZGUoc3RydWN0IHBvcnQgKnBfcHRyKQoreworCXJldHVybiBtc2dfZGVzdG5vZGUoJnBfcHRyLT5wdWJsLnBoZHIpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBwb3J0X3BlZXJwb3J0KHN0cnVjdCBwb3J0ICpwX3B0cikKK3sKKwlyZXR1cm4gbXNnX2Rlc3Rwb3J0KCZwX3B0ci0+cHVibC5waGRyKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgcG9ydF9vdXRfc2Vxbm8oc3RydWN0IHBvcnQgKnBfcHRyKQoreworCXJldHVybiBtc2dfdHJhbnNwX3NlcW5vKCZwX3B0ci0+cHVibC5waGRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBvcnRfc2V0X291dF9zZXFubyhzdHJ1Y3QgcG9ydCAqcF9wdHIsIHUzMiBzZXFubykgCit7CisJbXNnX3NldF90cmFuc3Bfc2Vxbm8oJnBfcHRyLT5wdWJsLnBoZHIsc2Vxbm8pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcG9ydF9pbmNyX291dF9zZXFubyhzdHJ1Y3QgcG9ydCAqcF9wdHIpCit7CisJc3RydWN0IHRpcGNfbXNnICptID0gJnBfcHRyLT5wdWJsLnBoZHI7CisKKwlpZiAobGlrZWx5KCFtc2dfcm91dGVkKG0pKSkKKwkJcmV0dXJuOworCW1zZ19zZXRfdHJhbnNwX3NlcW5vKG0sIChtc2dfdHJhbnNwX3NlcW5vKG0pICsgMSkpOworfQorCisvKioKKyAqIHRpcGNfbXVsdGljYXN0IC0gc2VuZCBhIG11bHRpY2FzdCBtZXNzYWdlIHRvIGxvY2FsIGFuZCByZW1vdGUgZGVzdGluYXRpb25zCisgKi8KKworaW50IHRpcGNfbXVsdGljYXN0KHUzMiByZWYsIHN0cnVjdCB0aXBjX25hbWVfc2VxIGNvbnN0ICpzZXEsIHUzMiBkb21haW4sCisJCSAgIHUzMiBudW1fc2VjdCwgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCkKK3sKKwlzdHJ1Y3QgdGlwY19tc2cgKmhkcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXN0cnVjdCBza19idWZmICppYnVmID0gTlVMTDsKKwlzdHJ1Y3QgcG9ydF9saXN0IGRwb3J0cyA9IHswLCBOVUxMLCB9OworCXN0cnVjdCBwb3J0ICpvcG9ydCA9IHRpcGNfcG9ydF9kZXJlZihyZWYpOworCWludCBleHRfdGFyZ2V0czsKKwlpbnQgcmVzOworCisJaWYgKHVubGlrZWx5KCFvcG9ydCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ3JlYXRlIG11bHRpY2FzdCBtZXNzYWdlICovCisKKwloZHIgPSAmb3BvcnQtPnB1YmwucGhkcjsKKwltc2dfc2V0X3R5cGUoaGRyLCBUSVBDX01DQVNUX01TRyk7CisJbXNnX3NldF9uYW1ldHlwZShoZHIsIHNlcS0+dHlwZSk7CisJbXNnX3NldF9uYW1lbG93ZXIoaGRyLCBzZXEtPmxvd2VyKTsKKwltc2dfc2V0X25hbWV1cHBlcihoZHIsIHNlcS0+dXBwZXIpOworCW1zZ19zZXRfaGRyX3N6KGhkciwgTUNBU1RfSF9TSVpFKTsKKwlyZXMgPSBtc2dfYnVpbGQoaGRyLCBtc2dfc2VjdCwgbnVtX3NlY3QsIE1BWF9NU0dfU0laRSwKKwkJCSFvcG9ydC0+dXNlcl9wb3J0LCAmYnVmKTsKKwlpZiAodW5saWtlbHkoIWJ1ZikpCisJCXJldHVybiByZXM7CisKKwkvKiBGaWd1cmUgb3V0IHdoZXJlIHRvIHNlbmQgbXVsdGljYXN0IG1lc3NhZ2UgKi8KKworCWV4dF90YXJnZXRzID0gdGlwY19uYW1ldGJsX21jX3RyYW5zbGF0ZShzZXEtPnR5cGUsIHNlcS0+bG93ZXIsIHNlcS0+dXBwZXIsCisJCQkJCQlUSVBDX05PREVfU0NPUEUsICZkcG9ydHMpOworCQorCS8qIFNlbmQgbWVzc2FnZSB0byBkZXN0aW5hdGlvbnMgKGR1cGxpY2F0ZSBpdCBvbmx5IGlmIG5lY2Vzc2FyeSkgKi8gCisKKwlpZiAoZXh0X3RhcmdldHMpIHsKKwkJaWYgKGRwb3J0cy5jb3VudCAhPSAwKSB7CisJCQlpYnVmID0gc2tiX2NvcHkoYnVmLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChpYnVmID09IE5VTEwpIHsKKwkJCQl0aXBjX3BvcnRfbGlzdF9mcmVlKCZkcG9ydHMpOworCQkJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCX0KKwkJcmVzID0gdGlwY19iY2xpbmtfc2VuZF9tc2coYnVmKTsKKwkJaWYgKChyZXMgPCAwKSAmJiAoZHBvcnRzLmNvdW50ICE9IDApKSB7CisJCQlidWZfZGlzY2FyZChpYnVmKTsKKwkJfQorCX0gZWxzZSB7CisJCWlidWYgPSBidWY7CisJfQorCisJaWYgKHJlcyA+PSAwKSB7CisJCWlmIChpYnVmKQorCQkJdGlwY19wb3J0X3JlY3ZfbWNhc3QoaWJ1ZiwgJmRwb3J0cyk7CisJfSBlbHNlIHsKKwkJdGlwY19wb3J0X2xpc3RfZnJlZSgmZHBvcnRzKTsKKwl9CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiB0aXBjX3BvcnRfcmVjdl9tY2FzdCAtIGRlbGl2ZXIgbXVsdGljYXN0IG1lc3NhZ2UgdG8gYWxsIGRlc3RpbmF0aW9uIHBvcnRzCisgKiAKKyAqIElmIHRoZXJlIGlzIG5vIHBvcnQgbGlzdCwgcGVyZm9ybSBhIGxvb2t1cCB0byBjcmVhdGUgb25lCisgKi8KKwordm9pZCB0aXBjX3BvcnRfcmVjdl9tY2FzdChzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCBzdHJ1Y3QgcG9ydF9saXN0ICpkcCkKK3sKKwlzdHJ1Y3QgdGlwY19tc2cqIG1zZzsKKwlzdHJ1Y3QgcG9ydF9saXN0IGRwb3J0cyA9IHswLCBOVUxMLCB9OworCXN0cnVjdCBwb3J0X2xpc3QgKml0ZW0gPSBkcDsKKwlpbnQgY250ID0gMDsKKworCWFzc2VydChidWYpOworCW1zZyA9IGJ1Zl9tc2coYnVmKTsKKworCS8qIENyZWF0ZSBkZXN0aW5hdGlvbiBwb3J0IGxpc3QsIGlmIG9uZSB3YXNuJ3Qgc3VwcGxpZWQgKi8KKworCWlmIChkcCA9PSBOVUxMKSB7CisJCXRpcGNfbmFtZXRibF9tY190cmFuc2xhdGUobXNnX25hbWV0eXBlKG1zZyksCisJCQkJICAgICBtc2dfbmFtZWxvd2VyKG1zZyksCisJCQkJICAgICBtc2dfbmFtZXVwcGVyKG1zZyksCisJCQkJICAgICBUSVBDX0NMVVNURVJfU0NPUEUsCisJCQkJICAgICAmZHBvcnRzKTsKKwkJaXRlbSA9IGRwID0gJmRwb3J0czsKKwl9CisKKwkvKiBEZWxpdmVyIGEgY29weSBvZiBtZXNzYWdlIHRvIGVhY2ggZGVzdGluYXRpb24gcG9ydCAqLworCisJaWYgKGRwLT5jb3VudCAhPSAwKSB7CisJCWlmIChkcC0+Y291bnQgPT0gMSkgeworCQkJbXNnX3NldF9kZXN0cG9ydChtc2csIGRwLT5wb3J0c1swXSk7CisJCQl0aXBjX3BvcnRfcmVjdl9tc2coYnVmKTsKKwkJCXRpcGNfcG9ydF9saXN0X2ZyZWUoZHApOworCQkJcmV0dXJuOworCQl9CisJCWZvciAoOyBjbnQgPCBkcC0+Y291bnQ7IGNudCsrKSB7CisJCQlpbnQgaW5kZXggPSBjbnQgJSBQTFNJWkU7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqYiA9IHNrYl9jbG9uZShidWYsIEdGUF9BVE9NSUMpOworCisJCQlpZiAoYiA9PSBOVUxMKSB7CisJCQkJd2FybigiQnVmZmVyIGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CisJCQkJbXNnX2RiZyhtc2csICJMT1NUOiIpOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKwkJCWlmICgoaW5kZXggPT0gMCkgJiYgKGNudCAhPSAwKSkgeworCQkJCWl0ZW0gPSBpdGVtLT5uZXh0OworCQkJfQorCQkJbXNnX3NldF9kZXN0cG9ydChidWZfbXNnKGIpLGl0ZW0tPnBvcnRzW2luZGV4XSk7CisJCQl0aXBjX3BvcnRfcmVjdl9tc2coYik7CisJCX0KKwl9CitleGl0OgorCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJdGlwY19wb3J0X2xpc3RfZnJlZShkcCk7Cit9CisKKy8qKgorICogdGlwY19jcmVhdGVwb3J0X3JhdyAtIGNyZWF0ZSBhIG5hdGl2ZSBUSVBDIHBvcnQKKyAqIAorICogUmV0dXJucyBsb2NhbCBwb3J0IHJlZmVyZW5jZQorICovCisKK3UzMiB0aXBjX2NyZWF0ZXBvcnRfcmF3KHZvaWQgKnVzcl9oYW5kbGUsCisJCQl1MzIgKCpkaXNwYXRjaGVyKShzdHJ1Y3QgdGlwY19wb3J0ICosIHN0cnVjdCBza19idWZmICopLAorCQkJdm9pZCAoKndha2V1cCkoc3RydWN0IHRpcGNfcG9ydCAqKSwKKwkJCWNvbnN0IHUzMiBpbXBvcnRhbmNlKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwl1MzIgcmVmOworCisJcF9wdHIgPSBrbWFsbG9jKHNpemVvZigqcF9wdHIpLCBHRlBfQVRPTUlDKTsKKwlpZiAocF9wdHIgPT0gTlVMTCkgeworCQl3YXJuKCJNZW1vcnkgc3F1ZWV6ZTsgZmFpbGVkIHRvIGNyZWF0ZSBwb3J0XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCW1lbXNldChwX3B0ciwgMCwgc2l6ZW9mKCpwX3B0cikpOworCXJlZiA9IHRpcGNfcmVmX2FjcXVpcmUocF9wdHIsICZwX3B0ci0+cHVibC5sb2NrKTsKKwlpZiAoIXJlZikgeworCQl3YXJuKCJSZWZlcmVuY2UgVGFibGUgRXhoYXVzdGVkXG4iKTsKKwkJa2ZyZWUocF9wdHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl0aXBjX3BvcnRfbG9jayhyZWYpOworCXBfcHRyLT5wdWJsLnJlZiA9IHJlZjsKKwltc2cgPSAmcF9wdHItPnB1YmwucGhkcjsKKwltc2dfaW5pdChtc2csIERBVEFfTE9XLCBUSVBDX05BTUVEX01TRywgVElQQ19PSywgTE9OR19IX1NJWkUsIDApOworCW1zZ19zZXRfb3JpZ25vZGUobXNnLCB0aXBjX293bl9hZGRyKTsKKwltc2dfc2V0X3ByZXZub2RlKG1zZywgdGlwY19vd25fYWRkcik7CisJbXNnX3NldF9vcmlncG9ydChtc2csIHJlZik7CisJbXNnX3NldF9pbXBvcnRhbmNlKG1zZyxpbXBvcnRhbmNlKTsKKwlwX3B0ci0+bGFzdF9pbl9zZXFubyA9IDQxOworCXBfcHRyLT5zZW50ID0gMTsKKwlwX3B0ci0+cHVibC51c3JfaGFuZGxlID0gdXNyX2hhbmRsZTsKKwlJTklUX0xJU1RfSEVBRCgmcF9wdHItPndhaXRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnBfcHRyLT5zdWJzY3JpcHRpb24ubm9kZXN1Yl9saXN0KTsKKwlwX3B0ci0+Y29uZ2VzdGVkX2xpbmsgPSAwOworCXBfcHRyLT5tYXhfcGt0ID0gTUFYX1BLVF9ERUZBVUxUOworCXBfcHRyLT5kaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjsKKwlwX3B0ci0+d2FrZXVwID0gd2FrZXVwOworCXBfcHRyLT51c2VyX3BvcnQgPSAwOworCWtfaW5pdF90aW1lcigmcF9wdHItPnRpbWVyLCAoSGFuZGxlcilwb3J0X3RpbWVvdXQsIHJlZik7CisJc3Bpbl9sb2NrX2JoKCZ0aXBjX3BvcnRfbGlzdF9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmcF9wdHItPnB1YmxpY2F0aW9ucyk7CisJSU5JVF9MSVNUX0hFQUQoJnBfcHRyLT5wb3J0X2xpc3QpOworCWxpc3RfYWRkX3RhaWwoJnBfcHRyLT5wb3J0X2xpc3QsICZwb3J0cyk7CisJc3Bpbl91bmxvY2tfYmgoJnRpcGNfcG9ydF9saXN0X2xvY2spOworCXRpcGNfcG9ydF91bmxvY2socF9wdHIpOworCXJldHVybiByZWY7Cit9CisKK2ludCB0aXBjX2RlbGV0ZXBvcnQodTMyIHJlZikKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IDA7CisKKwl0aXBjX3dpdGhkcmF3KHJlZiwgMCwgMCk7CisJcF9wdHIgPSB0aXBjX3BvcnRfbG9jayhyZWYpOworCWlmICghcF9wdHIpIAorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRpcGNfcmVmX2Rpc2NhcmQocmVmKTsKKwl0aXBjX3BvcnRfdW5sb2NrKHBfcHRyKTsKKworCWtfY2FuY2VsX3RpbWVyKCZwX3B0ci0+dGltZXIpOworCWlmIChwX3B0ci0+cHVibC5jb25uZWN0ZWQpIHsKKwkJYnVmID0gcG9ydF9idWlsZF9wZWVyX2Fib3J0X21zZyhwX3B0ciwgVElQQ19FUlJfTk9fUE9SVCk7CisJCXRpcGNfbm9kZXN1Yl91bnN1YnNjcmliZSgmcF9wdHItPnN1YnNjcmlwdGlvbik7CisJfQorCWlmIChwX3B0ci0+dXNlcl9wb3J0KSB7CisJCXRpcGNfcmVnX3JlbW92ZV9wb3J0KHBfcHRyLT51c2VyX3BvcnQpOworCQlrZnJlZShwX3B0ci0+dXNlcl9wb3J0KTsKKwl9CisKKwlzcGluX2xvY2tfYmgoJnRpcGNfcG9ydF9saXN0X2xvY2spOworCWxpc3RfZGVsKCZwX3B0ci0+cG9ydF9saXN0KTsKKwlsaXN0X2RlbCgmcF9wdHItPndhaXRfbGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJnRpcGNfcG9ydF9saXN0X2xvY2spOworCWtfdGVybV90aW1lcigmcF9wdHItPnRpbWVyKTsKKwlrZnJlZShwX3B0cik7CisJZGJnKCJEZWxldGVkIHBvcnQgJXVcbiIsIHJlZik7CisJdGlwY19uZXRfcm91dGVfbXNnKGJ1Zik7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKKy8qKgorICogdGlwY19nZXRfcG9ydCgpIC0gcmV0dXJuIHBvcnQgYXNzb2NpYXRlZCB3aXRoICdyZWYnCisgKiAKKyAqIE5vdGU6IFBvcnQgaXMgbm90IGxvY2tlZC4KKyAqLworCitzdHJ1Y3QgdGlwY19wb3J0ICp0aXBjX2dldF9wb3J0KGNvbnN0IHUzMiByZWYpCit7CisJcmV0dXJuIChzdHJ1Y3QgdGlwY19wb3J0ICopdGlwY19yZWZfZGVyZWYocmVmKTsKK30KKworLyoqCisgKiB0aXBjX2dldF9oYW5kbGUgLSByZXR1cm4gdXNlciBoYW5kbGUgYXNzb2NpYXRlZCB0byBwb3J0ICdyZWYnCisgKi8KKwordm9pZCAqdGlwY19nZXRfaGFuZGxlKGNvbnN0IHUzMiByZWYpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCXZvaWQgKiBoYW5kbGU7CisKKwlwX3B0ciA9IHRpcGNfcG9ydF9sb2NrKHJlZik7CisJaWYgKCFwX3B0cikKKwkJcmV0dXJuIDA7CisJaGFuZGxlID0gcF9wdHItPnB1YmwudXNyX2hhbmRsZTsKKwl0aXBjX3BvcnRfdW5sb2NrKHBfcHRyKTsKKwlyZXR1cm4gaGFuZGxlOworfQorCitzdGF0aWMgaW5saW5lIGludCBwb3J0X3VucmVsaWFibGUoc3RydWN0IHBvcnQgKnBfcHRyKQoreworCXJldHVybiBtc2dfc3JjX2Ryb3BwYWJsZSgmcF9wdHItPnB1YmwucGhkcik7Cit9CisKK2ludCB0aXBjX3BvcnR1bnJlbGlhYmxlKHUzMiByZWYsIHVuc2lnbmVkIGludCAqaXN1bnJlbGlhYmxlKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwkKKwlwX3B0ciA9IHRpcGNfcG9ydF9sb2NrKHJlZik7CisJaWYgKCFwX3B0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJKmlzdW5yZWxpYWJsZSA9IHBvcnRfdW5yZWxpYWJsZShwX3B0cik7CisJc3Bpbl91bmxvY2tfYmgocF9wdHItPnB1YmwubG9jayk7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKK2ludCB0aXBjX3NldF9wb3J0dW5yZWxpYWJsZSh1MzIgcmVmLCB1bnNpZ25lZCBpbnQgaXN1bnJlbGlhYmxlKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwkKKwlwX3B0ciA9IHRpcGNfcG9ydF9sb2NrKHJlZik7CisJaWYgKCFwX3B0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXNnX3NldF9zcmNfZHJvcHBhYmxlKCZwX3B0ci0+cHVibC5waGRyLCAoaXN1bnJlbGlhYmxlICE9IDApKTsKKwl0aXBjX3BvcnRfdW5sb2NrKHBfcHRyKTsKKwlyZXR1cm4gVElQQ19PSzsKK30KKworc3RhdGljIGlubGluZSBpbnQgcG9ydF91bnJldHVybmFibGUoc3RydWN0IHBvcnQgKnBfcHRyKQoreworCXJldHVybiBtc2dfZGVzdF9kcm9wcGFibGUoJnBfcHRyLT5wdWJsLnBoZHIpOworfQorCitpbnQgdGlwY19wb3J0dW5yZXR1cm5hYmxlKHUzMiByZWYsIHVuc2lnbmVkIGludCAqaXN1bnJlamVjdGFibGUpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCQorCXBfcHRyID0gdGlwY19wb3J0X2xvY2socmVmKTsKKwlpZiAoIXBfcHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkqaXN1bnJlamVjdGFibGUgPSBwb3J0X3VucmV0dXJuYWJsZShwX3B0cik7CisJc3Bpbl91bmxvY2tfYmgocF9wdHItPnB1YmwubG9jayk7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKK2ludCB0aXBjX3NldF9wb3J0dW5yZXR1cm5hYmxlKHUzMiByZWYsIHVuc2lnbmVkIGludCBpc3VucmVqZWN0YWJsZSkKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJCisJcF9wdHIgPSB0aXBjX3BvcnRfbG9jayhyZWYpOworCWlmICghcF9wdHIpCisJCXJldHVybiAtRUlOVkFMOworCW1zZ19zZXRfZGVzdF9kcm9wcGFibGUoJnBfcHRyLT5wdWJsLnBoZHIsIChpc3VucmVqZWN0YWJsZSAhPSAwKSk7CisJdGlwY19wb3J0X3VubG9jayhwX3B0cik7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKKy8qIAorICogcG9ydF9idWlsZF9wcm90b19tc2coKTogYnVpbGQgYSBwb3J0IGxldmVsIHByb3RvY29sIAorICogb3IgYSBjb25uZWN0aW9uIGFib3J0aW9uIG1lc3NhZ2UuIENhbGxlZCB3aXRoIAorICogdGlwY19wb3J0IGxvY2sgb24uCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqcG9ydF9idWlsZF9wcm90b19tc2codTMyIGRlc3Rwb3J0LCB1MzIgZGVzdG5vZGUsCisJCQkJCSAgICB1MzIgb3JpZ3BvcnQsIHUzMiBvcmlnbm9kZSwKKwkJCQkJICAgIHUzMiB1c3IsIHUzMiB0eXBlLCB1MzIgZXJyLCAKKwkJCQkJICAgIHUzMiBzZXFubywgdTMyIGFjaykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCQorCWJ1ZiA9IGJ1Zl9hY3F1aXJlKExPTkdfSF9TSVpFKTsKKwlpZiAoYnVmKSB7CisJCW1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJbXNnX2luaXQobXNnLCB1c3IsIHR5cGUsIGVyciwgTE9OR19IX1NJWkUsIGRlc3Rub2RlKTsKKwkJbXNnX3NldF9kZXN0cG9ydChtc2csIGRlc3Rwb3J0KTsKKwkJbXNnX3NldF9vcmlncG9ydChtc2csIG9yaWdwb3J0KTsKKwkJbXNnX3NldF9kZXN0bm9kZShtc2csIGRlc3Rub2RlKTsKKwkJbXNnX3NldF9vcmlnbm9kZShtc2csIG9yaWdub2RlKTsKKwkJbXNnX3NldF90cmFuc3Bfc2Vxbm8obXNnLCBzZXFubyk7CisJCW1zZ19zZXRfbXNnY250KG1zZywgYWNrKTsKKwkJbXNnX2RiZyhtc2csICJQT1JUPlNFTkQ+OiIpOworCX0KKwlyZXR1cm4gYnVmOworfQorCitpbnQgdGlwY19zZXRfbXNnX29wdGlvbihzdHJ1Y3QgdGlwY19wb3J0ICp0cF9wdHIsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgdTMyIHN6KQoreworCW1zZ19leHBhbmQoJnRwX3B0ci0+cGhkciwgbXNnX2Rlc3Rub2RlKCZ0cF9wdHItPnBoZHIpKTsKKwltc2dfc2V0X29wdGlvbnMoJnRwX3B0ci0+cGhkciwgb3B0LCBzeik7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKK2ludCB0aXBjX3JlamVjdF9tc2coc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgdTMyIGVycikKK3sKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmJ1ZjsKKwlzdHJ1Y3QgdGlwY19tc2cgKnJtc2c7CisJaW50IGhkcl9zejsKKwl1MzIgaW1wID0gbXNnX2ltcG9ydGFuY2UobXNnKTsKKwl1MzIgZGF0YV9zeiA9IG1zZ19kYXRhX3N6KG1zZyk7CisKKwlpZiAoZGF0YV9zeiA+IE1BWF9SRUpFQ1RfU0laRSkKKwkJZGF0YV9zeiA9IE1BWF9SRUpFQ1RfU0laRTsKKwlpZiAobXNnX2Nvbm5lY3RlZChtc2cpICYmIChpbXAgPCBUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0UpKQorCQlpbXArKzsKKwltc2dfZGJnKG1zZywgInBvcnQtPnJlajogIik7CisKKwkvKiBkaXNjYXJkIHJlamVjdGVkIG1lc3NhZ2UgaWYgaXQgc2hvdWxkbid0IGJlIHJldHVybmVkIHRvIHNlbmRlciAqLworCWlmIChtc2dfZXJyY29kZShtc2cpIHx8IG1zZ19kZXN0X2Ryb3BwYWJsZShtc2cpKSB7CisJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCXJldHVybiBkYXRhX3N6OworCX0KKworCS8qIGNvbnN0cnVjdCByZWplY3RlZCBtZXNzYWdlICovCisJaWYgKG1zZ19tY2FzdChtc2cpKQorCQloZHJfc3ogPSBNQ0FTVF9IX1NJWkU7CisJZWxzZQorCQloZHJfc3ogPSBMT05HX0hfU0laRTsKKwlyYnVmID0gYnVmX2FjcXVpcmUoZGF0YV9zeiArIGhkcl9zeik7CisJaWYgKHJidWYgPT0gTlVMTCkgeworCQlidWZfZGlzY2FyZChidWYpOworCQlyZXR1cm4gZGF0YV9zejsKKwl9CisJcm1zZyA9IGJ1Zl9tc2cocmJ1Zik7CisJbXNnX2luaXQocm1zZywgaW1wLCBtc2dfdHlwZShtc2cpLCBlcnIsIGhkcl9zeiwgbXNnX29yaWdub2RlKG1zZykpOworCW1zZ19zZXRfZGVzdHBvcnQocm1zZywgbXNnX29yaWdwb3J0KG1zZykpOworCW1zZ19zZXRfcHJldm5vZGUocm1zZywgdGlwY19vd25fYWRkcik7CisJbXNnX3NldF9vcmlncG9ydChybXNnLCBtc2dfZGVzdHBvcnQobXNnKSk7CisJaWYgKG1zZ19zaG9ydChtc2cpKQorCQltc2dfc2V0X29yaWdub2RlKHJtc2csIHRpcGNfb3duX2FkZHIpOworCWVsc2UKKwkJbXNnX3NldF9vcmlnbm9kZShybXNnLCBtc2dfZGVzdG5vZGUobXNnKSk7CisJbXNnX3NldF9zaXplKHJtc2csIGRhdGFfc3ogKyBoZHJfc3opOyAKKwltc2dfc2V0X25hbWV0eXBlKHJtc2csIG1zZ19uYW1ldHlwZShtc2cpKTsKKwltc2dfc2V0X25hbWVpbnN0KHJtc2csIG1zZ19uYW1laW5zdChtc2cpKTsKKwltZW1jcHkocmJ1Zi0+ZGF0YSArIGhkcl9zeiwgbXNnX2RhdGEobXNnKSwgZGF0YV9zeik7CisKKwkvKiBzZW5kIHNlbGYtYWJvcnQgbWVzc2FnZSB3aGVuIHJlamVjdGluZyBvbiBhIGNvbm5lY3RlZCBwb3J0ICovCisJaWYgKG1zZ19jb25uZWN0ZWQobXNnKSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqYWJ1ZiA9IDA7CisJCXN0cnVjdCBwb3J0ICpwX3B0ciA9IHRpcGNfcG9ydF9sb2NrKG1zZ19kZXN0cG9ydChtc2cpKTsKKworCQlpZiAocF9wdHIpIHsKKwkJCWlmIChwX3B0ci0+cHVibC5jb25uZWN0ZWQpCisJCQkJYWJ1ZiA9IHBvcnRfYnVpbGRfc2VsZl9hYm9ydF9tc2cocF9wdHIsIGVycik7CisJCQl0aXBjX3BvcnRfdW5sb2NrKHBfcHRyKTsKKwkJfQorCQl0aXBjX25ldF9yb3V0ZV9tc2coYWJ1Zik7CisJfQorCisJLyogc2VuZCByZWplY3RlZCBtZXNzYWdlICovCisJYnVmX2Rpc2NhcmQoYnVmKTsKKwl0aXBjX25ldF9yb3V0ZV9tc2cocmJ1Zik7CisJcmV0dXJuIGRhdGFfc3o7Cit9CisKK2ludCB0aXBjX3BvcnRfcmVqZWN0X3NlY3Rpb25zKHN0cnVjdCBwb3J0ICpwX3B0ciwgc3RydWN0IHRpcGNfbXNnICpoZHIsCisJCQkgICAgICBzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZ19zZWN0LCB1MzIgbnVtX3NlY3QsCisJCQkgICAgICBpbnQgZXJyKQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJaW50IHJlczsKKworCXJlcyA9IG1zZ19idWlsZChoZHIsIG1zZ19zZWN0LCBudW1fc2VjdCwgTUFYX01TR19TSVpFLCAKKwkJCSFwX3B0ci0+dXNlcl9wb3J0LCAmYnVmKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIHJlczsKKworCXJldHVybiB0aXBjX3JlamVjdF9tc2coYnVmLCBlcnIpOworfQorCitzdGF0aWMgdm9pZCBwb3J0X3RpbWVvdXQodW5zaWduZWQgbG9uZyByZWYpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyID0gdGlwY19wb3J0X2xvY2socmVmKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gMDsKKworCWlmICghcF9wdHIgfHwgIXBfcHRyLT5wdWJsLmNvbm5lY3RlZCkKKwkJcmV0dXJuOworCisJLyogTGFzdCBwcm9iZSBhbnN3ZXJlZCA/ICovCisJaWYgKHBfcHRyLT5wcm9iaW5nX3N0YXRlID09IFBST0JJTkcpIHsKKwkJYnVmID0gcG9ydF9idWlsZF9zZWxmX2Fib3J0X21zZyhwX3B0ciwgVElQQ19FUlJfTk9fUE9SVCk7CisJfSBlbHNlIHsKKwkJYnVmID0gcG9ydF9idWlsZF9wcm90b19tc2cocG9ydF9wZWVycG9ydChwX3B0ciksCisJCQkJCSAgIHBvcnRfcGVlcm5vZGUocF9wdHIpLAorCQkJCQkgICBwX3B0ci0+cHVibC5yZWYsCisJCQkJCSAgIHRpcGNfb3duX2FkZHIsCisJCQkJCSAgIENPTk5fTUFOQUdFUiwKKwkJCQkJICAgQ09OTl9QUk9CRSwKKwkJCQkJICAgVElQQ19PSywgCisJCQkJCSAgIHBvcnRfb3V0X3NlcW5vKHBfcHRyKSwKKwkJCQkJICAgMCk7CisJCXBvcnRfaW5jcl9vdXRfc2Vxbm8ocF9wdHIpOworCQlwX3B0ci0+cHJvYmluZ19zdGF0ZSA9IFBST0JJTkc7CisJCWtfc3RhcnRfdGltZXIoJnBfcHRyLT50aW1lciwgcF9wdHItPnByb2JpbmdfaW50ZXJ2YWwpOworCX0KKwl0aXBjX3BvcnRfdW5sb2NrKHBfcHRyKTsKKwl0aXBjX25ldF9yb3V0ZV9tc2coYnVmKTsKK30KKworCitzdGF0aWMgdm9pZCBwb3J0X2hhbmRsZV9ub2RlX2Rvd24odW5zaWduZWQgbG9uZyByZWYpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyID0gdGlwY19wb3J0X2xvY2socmVmKTsKKwlzdHJ1Y3Qgc2tfYnVmZiogYnVmID0gMDsKKworCWlmICghcF9wdHIpCisJCXJldHVybjsKKwlidWYgPSBwb3J0X2J1aWxkX3NlbGZfYWJvcnRfbXNnKHBfcHRyLCBUSVBDX0VSUl9OT19OT0RFKTsKKwl0aXBjX3BvcnRfdW5sb2NrKHBfcHRyKTsKKwl0aXBjX25ldF9yb3V0ZV9tc2coYnVmKTsKK30KKworCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnBvcnRfYnVpbGRfc2VsZl9hYm9ydF9tc2coc3RydWN0IHBvcnQgKnBfcHRyLCB1MzIgZXJyKQoreworCXUzMiBpbXAgPSBtc2dfaW1wb3J0YW5jZSgmcF9wdHItPnB1YmwucGhkcik7CisKKwlpZiAoIXBfcHRyLT5wdWJsLmNvbm5lY3RlZCkKKwkJcmV0dXJuIDA7CisJaWYgKGltcCA8IFRJUENfQ1JJVElDQUxfSU1QT1JUQU5DRSkKKwkJaW1wKys7CisJcmV0dXJuIHBvcnRfYnVpbGRfcHJvdG9fbXNnKHBfcHRyLT5wdWJsLnJlZiwKKwkJCQkgICAgdGlwY19vd25fYWRkciwKKwkJCQkgICAgcG9ydF9wZWVycG9ydChwX3B0ciksCisJCQkJICAgIHBvcnRfcGVlcm5vZGUocF9wdHIpLAorCQkJCSAgICBpbXAsCisJCQkJICAgIFRJUENfQ09OTl9NU0csCisJCQkJICAgIGVyciwgCisJCQkJICAgIHBfcHRyLT5sYXN0X2luX3NlcW5vICsgMSwKKwkJCQkgICAgMCk7Cit9CisKKworc3RhdGljIHN0cnVjdCBza19idWZmICpwb3J0X2J1aWxkX3BlZXJfYWJvcnRfbXNnKHN0cnVjdCBwb3J0ICpwX3B0ciwgdTMyIGVycikKK3sKKwl1MzIgaW1wID0gbXNnX2ltcG9ydGFuY2UoJnBfcHRyLT5wdWJsLnBoZHIpOworCisJaWYgKCFwX3B0ci0+cHVibC5jb25uZWN0ZWQpCisJCXJldHVybiAwOworCWlmIChpbXAgPCBUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0UpCisJCWltcCsrOworCXJldHVybiBwb3J0X2J1aWxkX3Byb3RvX21zZyhwb3J0X3BlZXJwb3J0KHBfcHRyKSwKKwkJCQkgICAgcG9ydF9wZWVybm9kZShwX3B0ciksCisJCQkJICAgIHBfcHRyLT5wdWJsLnJlZiwKKwkJCQkgICAgdGlwY19vd25fYWRkciwKKwkJCQkgICAgaW1wLAorCQkJCSAgICBUSVBDX0NPTk5fTVNHLAorCQkJCSAgICBlcnIsIAorCQkJCSAgICBwb3J0X291dF9zZXFubyhwX3B0ciksCisJCQkJICAgIDApOworfQorCit2b2lkIHRpcGNfcG9ydF9yZWN2X3Byb3RvX21zZyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOworCXN0cnVjdCBwb3J0ICpwX3B0ciA9IHRpcGNfcG9ydF9sb2NrKG1zZ19kZXN0cG9ydChtc2cpKTsKKwl1MzIgZXJyID0gVElQQ19PSzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcl9idWYgPSAwOworCXN0cnVjdCBza19idWZmICphYm9ydF9idWYgPSAwOworCisJbXNnX2RiZyhtc2csICJQT1JUPFJFQ1Y8OiIpOworCisJaWYgKCFwX3B0cikgeworCQllcnIgPSBUSVBDX0VSUl9OT19QT1JUOworCX0gZWxzZSBpZiAocF9wdHItPnB1YmwuY29ubmVjdGVkKSB7CisJCWlmIChwb3J0X3BlZXJub2RlKHBfcHRyKSAhPSBtc2dfb3JpZ25vZGUobXNnKSkKKwkJCWVyciA9IFRJUENfRVJSX05PX1BPUlQ7CisJCWlmIChwb3J0X3BlZXJwb3J0KHBfcHRyKSAhPSBtc2dfb3JpZ3BvcnQobXNnKSkKKwkJCWVyciA9IFRJUENfRVJSX05PX1BPUlQ7CisJCWlmICghZXJyICYmIG1zZ19yb3V0ZWQobXNnKSkgeworCQkJdTMyIHNlcW5vID0gbXNnX3RyYW5zcF9zZXFubyhtc2cpOworCQkJdTMyIG15bm8gPSAgKytwX3B0ci0+bGFzdF9pbl9zZXFubzsKKwkJCWlmIChzZXFubyAhPSBteW5vKSB7CisJCQkJZXJyID0gVElQQ19FUlJfTk9fUE9SVDsKKwkJCQlhYm9ydF9idWYgPSBwb3J0X2J1aWxkX3NlbGZfYWJvcnRfbXNnKHBfcHRyLCBlcnIpOworCQkJfQorCQl9CisJCWlmIChtc2dfdHlwZShtc2cpID09IENPTk5fQUNLKSB7CisJCQlpbnQgd2FrZXVwID0gdGlwY19wb3J0X2Nvbmdlc3RlZChwX3B0cikgJiYgCisJCQkJICAgICBwX3B0ci0+cHVibC5jb25nZXN0ZWQgJiYKKwkJCQkgICAgIHBfcHRyLT53YWtldXA7CisJCQlwX3B0ci0+YWNrZWQgKz0gbXNnX21zZ2NudChtc2cpOworCQkJaWYgKHRpcGNfcG9ydF9jb25nZXN0ZWQocF9wdHIpKQorCQkJCWdvdG8gZXhpdDsKKwkJCXBfcHRyLT5wdWJsLmNvbmdlc3RlZCA9IDA7CisJCQlpZiAoIXdha2V1cCkKKwkJCQlnb3RvIGV4aXQ7CisJCQlwX3B0ci0+d2FrZXVwKCZwX3B0ci0+cHVibCk7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwl9IGVsc2UgaWYgKHBfcHRyLT5wdWJsLnB1Ymxpc2hlZCkgeworCQllcnIgPSBUSVBDX0VSUl9OT19QT1JUOworCX0KKwlpZiAoZXJyKSB7CisJCXJfYnVmID0gcG9ydF9idWlsZF9wcm90b19tc2cobXNnX29yaWdwb3J0KG1zZyksCisJCQkJCSAgICAgbXNnX29yaWdub2RlKG1zZyksIAorCQkJCQkgICAgIG1zZ19kZXN0cG9ydChtc2cpLCAKKwkJCQkJICAgICB0aXBjX293bl9hZGRyLAorCQkJCQkgICAgIERBVEFfSElHSCwKKwkJCQkJICAgICBUSVBDX0NPTk5fTVNHLAorCQkJCQkgICAgIGVyciwKKwkJCQkJICAgICAwLAorCQkJCQkgICAgIDApOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogQWxsIGlzIGZpbmUgKi8KKwlpZiAobXNnX3R5cGUobXNnKSA9PSBDT05OX1BST0JFKSB7CisJCXJfYnVmID0gcG9ydF9idWlsZF9wcm90b19tc2cobXNnX29yaWdwb3J0KG1zZyksIAorCQkJCQkgICAgIG1zZ19vcmlnbm9kZShtc2cpLCAKKwkJCQkJICAgICBtc2dfZGVzdHBvcnQobXNnKSwgCisJCQkJCSAgICAgdGlwY19vd25fYWRkciwgCisJCQkJCSAgICAgQ09OTl9NQU5BR0VSLAorCQkJCQkgICAgIENPTk5fUFJPQkVfUkVQTFksCisJCQkJCSAgICAgVElQQ19PSywKKwkJCQkJICAgICBwb3J0X291dF9zZXFubyhwX3B0ciksCisJCQkJCSAgICAgMCk7CisJfQorCXBfcHRyLT5wcm9iaW5nX3N0YXRlID0gQ09ORklSTUVEOworCXBvcnRfaW5jcl9vdXRfc2Vxbm8ocF9wdHIpOworZXhpdDoKKwlpZiAocF9wdHIpCisJCXRpcGNfcG9ydF91bmxvY2socF9wdHIpOworCXRpcGNfbmV0X3JvdXRlX21zZyhyX2J1Zik7CisJdGlwY19uZXRfcm91dGVfbXNnKGFib3J0X2J1Zik7CisJYnVmX2Rpc2NhcmQoYnVmKTsKK30KKworc3RhdGljIHZvaWQgcG9ydF9wcmludChzdHJ1Y3QgcG9ydCAqcF9wdHIsIHN0cnVjdCBwcmludF9idWYgKmJ1ZiwgaW50IGZ1bGxfaWQpCit7CisgICAgICAgIHN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibDsKKworCWlmIChmdWxsX2lkKQorCQl0aXBjX3ByaW50ZihidWYsICI8JXUuJXUuJXU6JXU+OiIsIAorCQkJICAgIHRpcGNfem9uZSh0aXBjX293bl9hZGRyKSwgdGlwY19jbHVzdGVyKHRpcGNfb3duX2FkZHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpcGNfbm9kZSh0aXBjX293bl9hZGRyKSwgcF9wdHItPnB1YmwucmVmKTsKKwllbHNlCisJCXRpcGNfcHJpbnRmKGJ1ZiwgIiUtMTB1OiIsIHBfcHRyLT5wdWJsLnJlZik7CisKKyAgICAgICAgaWYgKHBfcHRyLT5wdWJsLmNvbm5lY3RlZCkgeworICAgICAgICAgICAgICAgIHUzMiBkcG9ydCA9IHBvcnRfcGVlcnBvcnQocF9wdHIpOworICAgICAgICAgICAgICAgIHUzMiBkZXN0bm9kZSA9IHBvcnRfcGVlcm5vZGUocF9wdHIpOworCisgICAgICAgICAgICAgICAgdGlwY19wcmludGYoYnVmLCAiIGNvbm5lY3RlZCB0byA8JXUuJXUuJXU6JXU+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXBjX3pvbmUoZGVzdG5vZGUpLCB0aXBjX2NsdXN0ZXIoZGVzdG5vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpcGNfbm9kZShkZXN0bm9kZSksIGRwb3J0KTsKKyAgICAgICAgICAgICAgICBpZiAocF9wdHItPnB1YmwuY29ubl90eXBlICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICB0aXBjX3ByaW50ZihidWYsICIgdmlhIHsldSwldX0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wdHItPnB1YmwuY29ubl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wdHItPnB1YmwuY29ubl9pbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocF9wdHItPnB1YmwucHVibGlzaGVkKSB7CisgICAgICAgICAgICAgICAgdGlwY19wcmludGYoYnVmLCAiIGJvdW5kIHRvIik7CisgICAgICAgICAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeShwdWJsLCAmcF9wdHItPnB1YmxpY2F0aW9ucywgcHBvcnRfbGlzdCkgeworCQkJaWYgKHB1YmwtPmxvd2VyID09IHB1YmwtPnVwcGVyKQorCQkJCXRpcGNfcHJpbnRmKGJ1ZiwgIiB7JXUsJXV9IiwgcHVibC0+dHlwZSwKKwkJCQkJICAgIHB1YmwtPmxvd2VyKTsKKwkJCWVsc2UKKwkJCQl0aXBjX3ByaW50ZihidWYsICIgeyV1LCV1LCV1fSIsIHB1YmwtPnR5cGUsIAorCQkJCQkgICAgcHVibC0+bG93ZXIsIHB1YmwtPnVwcGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGlwY19wcmludGYoYnVmLCAiXG4iKTsKK30KKworI2RlZmluZSBNQVhfUE9SVF9RVUVSWSAzMjc2OAorCitzdHJ1Y3Qgc2tfYnVmZiAqdGlwY19wb3J0X2dldF9wb3J0cyh2b2lkKQoreworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IHRsdl9kZXNjICpyZXBfdGx2OworCXN0cnVjdCBwcmludF9idWYgcGI7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCWludCBzdHJfbGVuOworCisJYnVmID0gdGlwY19jZmdfcmVwbHlfYWxsb2MoVExWX1NQQUNFKE1BWF9QT1JUX1FVRVJZKSk7CisJaWYgKCFidWYpCisJCXJldHVybiBOVUxMOworCXJlcF90bHYgPSAoc3RydWN0IHRsdl9kZXNjICopYnVmLT5kYXRhOworCisJdGlwY19wcmludGJ1Zl9pbml0KCZwYiwgVExWX0RBVEEocmVwX3RsdiksIE1BWF9QT1JUX1FVRVJZKTsKKwlzcGluX2xvY2tfYmgoJnRpcGNfcG9ydF9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocF9wdHIsICZwb3J0cywgcG9ydF9saXN0KSB7CisJCXNwaW5fbG9ja19iaChwX3B0ci0+cHVibC5sb2NrKTsKKwkJcG9ydF9wcmludChwX3B0ciwgJnBiLCAwKTsKKwkJc3Bpbl91bmxvY2tfYmgocF9wdHItPnB1YmwubG9jayk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZ0aXBjX3BvcnRfbGlzdF9sb2NrKTsKKwlzdHJfbGVuID0gdGlwY19wcmludGJ1Zl92YWxpZGF0ZSgmcGIpOworCisJc2tiX3B1dChidWYsIFRMVl9TUEFDRShzdHJfbGVuKSk7CisJVExWX1NFVChyZXBfdGx2LCBUSVBDX1RMVl9VTFRSQV9TVFJJTkcsIE5VTEwsIHN0cl9sZW4pOworCisJcmV0dXJuIGJ1ZjsKK30KKworI2lmIDAKKworI2RlZmluZSBNQVhfUE9SVF9TVEFUUyAyMDAwCisKK3N0cnVjdCBza19idWZmICpwb3J0X3Nob3dfc3RhdHMoY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLCBpbnQgcmVxX3Rsdl9zcGFjZSkKK3sKKwl1MzIgcmVmOworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCXN0cnVjdCB0bHZfZGVzYyAqcmVwX3RsdjsKKwlzdHJ1Y3QgcHJpbnRfYnVmIHBiOworCWludCBzdHJfbGVuOworCisJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9QT1JUX1JFRikpCisJCXJldHVybiBjZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7CisKKwlyZWYgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CisJcmVmID0gbnRvaGwocmVmKTsKKworCXBfcHRyID0gdGlwY19wb3J0X2xvY2socmVmKTsKKwlpZiAoIXBfcHRyKQorCQlyZXR1cm4gY2ZnX3JlcGx5X2Vycm9yX3N0cmluZygicG9ydCBub3QgZm91bmQiKTsKKworCWJ1ZiA9IHRpcGNfY2ZnX3JlcGx5X2FsbG9jKFRMVl9TUEFDRShNQVhfUE9SVF9TVEFUUykpOworCWlmICghYnVmKSB7CisJCXRpcGNfcG9ydF91bmxvY2socF9wdHIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmVwX3RsdiA9IChzdHJ1Y3QgdGx2X2Rlc2MgKilidWYtPmRhdGE7CisKKwl0aXBjX3ByaW50YnVmX2luaXQoJnBiLCBUTFZfREFUQShyZXBfdGx2KSwgTUFYX1BPUlRfU1RBVFMpOworCXBvcnRfcHJpbnQocF9wdHIsICZwYiwgMSk7CisJLyogTkVFRCBUTyBGSUxMIElOIEFERElUSU9OQUwgUE9SVCBTVEFUSVNUSUNTIEhFUkUgKi8KKwl0aXBjX3BvcnRfdW5sb2NrKHBfcHRyKTsKKwlzdHJfbGVuID0gdGlwY19wcmludGJ1Zl92YWxpZGF0ZSgmcGIpOworCisJc2tiX3B1dChidWYsIFRMVl9TUEFDRShzdHJfbGVuKSk7CisJVExWX1NFVChyZXBfdGx2LCBUSVBDX1RMVl9VTFRSQV9TVFJJTkcsIE5VTEwsIHN0cl9sZW4pOworCisJcmV0dXJuIGJ1ZjsKK30KKworI2VuZGlmCisKK3ZvaWQgdGlwY19wb3J0X3JlaW5pdCh2b2lkKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKworCXNwaW5fbG9ja19iaCgmdGlwY19wb3J0X2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwX3B0ciwgJnBvcnRzLCBwb3J0X2xpc3QpIHsKKwkJbXNnID0gJnBfcHRyLT5wdWJsLnBoZHI7CisJCWlmIChtc2dfb3JpZ25vZGUobXNnKSA9PSB0aXBjX293bl9hZGRyKQorCQkJYnJlYWs7CisJCW1zZ19zZXRfb3JpZ25vZGUobXNnLCB0aXBjX293bl9hZGRyKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnRpcGNfcG9ydF9saXN0X2xvY2spOworfQorCisKKy8qCisgKiAgcG9ydF9kaXNwYXRjaGVyX3NpZ2goKTogU2lnbmFsIGhhbmRsZXIgZm9yIG1lc3NhZ2VzIGRlc3RpbmF0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgdGlwY19wb3J0IGludGVyZmFjZS4KKyAqLworCitzdGF0aWMgdm9pZCBwb3J0X2Rpc3BhdGNoZXJfc2lnaCh2b2lkICpkdW1teSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCisJc3Bpbl9sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwlidWYgPSBtc2dfcXVldWVfaGVhZDsKKwltc2dfcXVldWVfaGVhZCA9IDA7CisJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOworCisJd2hpbGUgKGJ1ZikgeworCQlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJCXN0cnVjdCB1c2VyX3BvcnQgKnVwX3B0cjsKKwkJc3RydWN0IHRpcGNfcG9ydGlkIG9yaWc7CisJCXN0cnVjdCB0aXBjX25hbWVfc2VxIGRzZXE7CisJCXZvaWQgKnVzcl9oYW5kbGU7CisJCWludCBjb25uZWN0ZWQ7CisJCWludCBwdWJsaXNoZWQ7CisKKwkJc3RydWN0IHNrX2J1ZmYgKm5leHQgPSBidWYtPm5leHQ7CisJCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOworCQl1MzIgZHJlZiA9IG1zZ19kZXN0cG9ydChtc2cpOworCQkKKwkJcF9wdHIgPSB0aXBjX3BvcnRfbG9jayhkcmVmKTsKKwkJaWYgKCFwX3B0cikgeworCQkJLyogUG9ydCBkZWxldGVkIHdoaWxlIG1zZyBpbiBxdWV1ZSAqLworCQkJdGlwY19yZWplY3RfbXNnKGJ1ZiwgVElQQ19FUlJfTk9fUE9SVCk7CisJCQlidWYgPSBuZXh0OworCQkJY29udGludWU7CisJCX0KKwkJb3JpZy5yZWYgPSBtc2dfb3JpZ3BvcnQobXNnKTsKKwkJb3JpZy5ub2RlID0gbXNnX29yaWdub2RlKG1zZyk7CisJCXVwX3B0ciA9IHBfcHRyLT51c2VyX3BvcnQ7CisJCXVzcl9oYW5kbGUgPSB1cF9wdHItPnVzcl9oYW5kbGU7CisJCWNvbm5lY3RlZCA9IHBfcHRyLT5wdWJsLmNvbm5lY3RlZDsKKwkJcHVibGlzaGVkID0gcF9wdHItPnB1YmwucHVibGlzaGVkOworCisJCWlmICh1bmxpa2VseShtc2dfZXJyY29kZShtc2cpKSkKKwkJCWdvdG8gZXJyOworCisJCXN3aXRjaCAobXNnX3R5cGUobXNnKSkgeworCQkKKwkJY2FzZSBUSVBDX0NPTk5fTVNHOnsKKwkJCQl0aXBjX2Nvbm5fbXNnX2V2ZW50IGNiID0gdXBfcHRyLT5jb25uX21zZ19jYjsKKwkJCQl1MzIgcGVlcl9wb3J0ID0gcG9ydF9wZWVycG9ydChwX3B0cik7CisJCQkJdTMyIHBlZXJfbm9kZSA9IHBvcnRfcGVlcm5vZGUocF9wdHIpOworCisJCQkJc3Bpbl91bmxvY2tfYmgocF9wdHItPnB1YmwubG9jayk7CisJCQkJaWYgKHVubGlrZWx5KCFjb25uZWN0ZWQpKSB7CisJCQkJCWlmICh1bmxpa2VseShwdWJsaXNoZWQpKQorCQkJCQkJZ290byByZWplY3Q7CisJCQkJCXRpcGNfY29ubmVjdDJwb3J0KGRyZWYsJm9yaWcpOworCQkJCX0KKwkJCQlpZiAodW5saWtlbHkobXNnX29yaWdwb3J0KG1zZykgIT0gcGVlcl9wb3J0KSkKKwkJCQkJZ290byByZWplY3Q7CisJCQkJaWYgKHVubGlrZWx5KG1zZ19vcmlnbm9kZShtc2cpICE9IHBlZXJfbm9kZSkpCisJCQkJCWdvdG8gcmVqZWN0OworCQkJCWlmICh1bmxpa2VseSghY2IpKQorCQkJCQlnb3RvIHJlamVjdDsKKwkJCQlpZiAodW5saWtlbHkoKytwX3B0ci0+cHVibC5jb25uX3VuYWNrZWQgPj0gCisJCQkJCSAgICAgVElQQ19GTE9XX0NPTlRST0xfV0lOKSkKKwkJCQkJdGlwY19hY2tub3dsZWRnZShkcmVmLCAKKwkJCQkJCQkgcF9wdHItPnB1YmwuY29ubl91bmFja2VkKTsKKwkJCQlza2JfcHVsbChidWYsIG1zZ19oZHJfc3oobXNnKSk7CisJCQkJY2IodXNyX2hhbmRsZSwgZHJlZiwgJmJ1ZiwgbXNnX2RhdGEobXNnKSwKKwkJCQkgICBtc2dfZGF0YV9zeihtc2cpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBUSVBDX0RJUkVDVF9NU0c6eworCQkJCXRpcGNfbXNnX2V2ZW50IGNiID0gdXBfcHRyLT5tc2dfY2I7CisKKwkJCQlzcGluX3VubG9ja19iaChwX3B0ci0+cHVibC5sb2NrKTsKKwkJCQlpZiAodW5saWtlbHkoY29ubmVjdGVkKSkKKwkJCQkJZ290byByZWplY3Q7CisJCQkJaWYgKHVubGlrZWx5KCFjYikpCisJCQkJCWdvdG8gcmVqZWN0OworCQkJCXNrYl9wdWxsKGJ1ZiwgbXNnX2hkcl9zeihtc2cpKTsKKwkJCQljYih1c3JfaGFuZGxlLCBkcmVmLCAmYnVmLCBtc2dfZGF0YShtc2cpLCAKKwkJCQkgICBtc2dfZGF0YV9zeihtc2cpLCBtc2dfaW1wb3J0YW5jZShtc2cpLAorCQkJCSAgICZvcmlnKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBUSVBDX05BTUVEX01TRzp7CisJCQkJdGlwY19uYW1lZF9tc2dfZXZlbnQgY2IgPSB1cF9wdHItPm5hbWVkX21zZ19jYjsKKworCQkJCXNwaW5fdW5sb2NrX2JoKHBfcHRyLT5wdWJsLmxvY2spOworCQkJCWlmICh1bmxpa2VseShjb25uZWN0ZWQpKQorCQkJCQlnb3RvIHJlamVjdDsKKwkJCQlpZiAodW5saWtlbHkoIWNiKSkKKwkJCQkJZ290byByZWplY3Q7CisJCQkJaWYgKHVubGlrZWx5KCFwdWJsaXNoZWQpKQorCQkJCQlnb3RvIHJlamVjdDsKKwkJCQlkc2VxLnR5cGUgPSAgbXNnX25hbWV0eXBlKG1zZyk7CisJCQkJZHNlcS5sb3dlciA9IG1zZ19uYW1laW5zdChtc2cpOworCQkJCWRzZXEudXBwZXIgPSBkc2VxLmxvd2VyOworCQkJCXNrYl9wdWxsKGJ1ZiwgbXNnX2hkcl9zeihtc2cpKTsKKwkJCQljYih1c3JfaGFuZGxlLCBkcmVmLCAmYnVmLCBtc2dfZGF0YShtc2cpLCAKKwkJCQkgICBtc2dfZGF0YV9zeihtc2cpLCBtc2dfaW1wb3J0YW5jZShtc2cpLAorCQkJCSAgICZvcmlnLCAmZHNlcSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGJ1ZikKKwkJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCWJ1ZiA9IG5leHQ7CisJCWNvbnRpbnVlOworZXJyOgorCQlzd2l0Y2ggKG1zZ190eXBlKG1zZykpIHsKKwkJCisJCWNhc2UgVElQQ19DT05OX01TRzp7CisJCQkJdGlwY19jb25uX3NodXRkb3duX2V2ZW50IGNiID0gCisJCQkJCXVwX3B0ci0+Y29ubl9lcnJfY2I7CisJCQkJdTMyIHBlZXJfcG9ydCA9IHBvcnRfcGVlcnBvcnQocF9wdHIpOworCQkJCXUzMiBwZWVyX25vZGUgPSBwb3J0X3BlZXJub2RlKHBfcHRyKTsKKworCQkJCXNwaW5fdW5sb2NrX2JoKHBfcHRyLT5wdWJsLmxvY2spOworCQkJCWlmICghY29ubmVjdGVkIHx8ICFjYikKKwkJCQkJYnJlYWs7CisJCQkJaWYgKG1zZ19vcmlncG9ydChtc2cpICE9IHBlZXJfcG9ydCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKG1zZ19vcmlnbm9kZShtc2cpICE9IHBlZXJfbm9kZSkKKwkJCQkJYnJlYWs7CisJCQkJdGlwY19kaXNjb25uZWN0KGRyZWYpOworCQkJCXNrYl9wdWxsKGJ1ZiwgbXNnX2hkcl9zeihtc2cpKTsKKwkJCQljYih1c3JfaGFuZGxlLCBkcmVmLCAmYnVmLCBtc2dfZGF0YShtc2cpLAorCQkJCSAgIG1zZ19kYXRhX3N6KG1zZyksIG1zZ19lcnJjb2RlKG1zZykpOworCQkJCWJyZWFrOworCQkJfQorCQljYXNlIFRJUENfRElSRUNUX01TRzp7CisJCQkJdGlwY19tc2dfZXJyX2V2ZW50IGNiID0gdXBfcHRyLT5lcnJfY2I7CisKKwkJCQlzcGluX3VubG9ja19iaChwX3B0ci0+cHVibC5sb2NrKTsKKwkJCQlpZiAoY29ubmVjdGVkIHx8ICFjYikKKwkJCQkJYnJlYWs7CisJCQkJc2tiX3B1bGwoYnVmLCBtc2dfaGRyX3N6KG1zZykpOworCQkJCWNiKHVzcl9oYW5kbGUsIGRyZWYsICZidWYsIG1zZ19kYXRhKG1zZyksCisJCQkJICAgbXNnX2RhdGFfc3oobXNnKSwgbXNnX2VycmNvZGUobXNnKSwgJm9yaWcpOworCQkJCWJyZWFrOworCQkJfQorCQljYXNlIFRJUENfTkFNRURfTVNHOnsKKwkJCQl0aXBjX25hbWVkX21zZ19lcnJfZXZlbnQgY2IgPSAKKwkJCQkJdXBfcHRyLT5uYW1lZF9lcnJfY2I7CisKKwkJCQlzcGluX3VubG9ja19iaChwX3B0ci0+cHVibC5sb2NrKTsKKwkJCQlpZiAoY29ubmVjdGVkIHx8ICFjYikKKwkJCQkJYnJlYWs7CisJCQkJZHNlcS50eXBlID0gIG1zZ19uYW1ldHlwZShtc2cpOworCQkJCWRzZXEubG93ZXIgPSBtc2dfbmFtZWluc3QobXNnKTsKKwkJCQlkc2VxLnVwcGVyID0gZHNlcS5sb3dlcjsKKwkJCQlza2JfcHVsbChidWYsIG1zZ19oZHJfc3oobXNnKSk7CisJCQkJY2IodXNyX2hhbmRsZSwgZHJlZiwgJmJ1ZiwgbXNnX2RhdGEobXNnKSwgCisJCQkJICAgbXNnX2RhdGFfc3oobXNnKSwgbXNnX2VycmNvZGUobXNnKSwgJmRzZXEpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChidWYpCisJCQlidWZfZGlzY2FyZChidWYpOworCQlidWYgPSBuZXh0OworCQljb250aW51ZTsKK3JlamVjdDoKKwkJdGlwY19yZWplY3RfbXNnKGJ1ZiwgVElQQ19FUlJfTk9fUE9SVCk7CisJCWJ1ZiA9IG5leHQ7CisJfQorfQorCisvKgorICogIHBvcnRfZGlzcGF0Y2hlcigpOiBEaXNwYXRjaGVyIGZvciBtZXNzYWdlcyBkZXN0aW5hdGVkCisgKiAgdG8gdGhlIHRpcGNfcG9ydCBpbnRlcmZhY2UuIENhbGxlZCB3aXRoIHBvcnQgbG9ja2VkLgorICovCisKK3N0YXRpYyB1MzIgcG9ydF9kaXNwYXRjaGVyKHN0cnVjdCB0aXBjX3BvcnQgKmR1bW15LCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCWJ1Zi0+bmV4dCA9IE5VTEw7CisJc3Bpbl9sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwlpZiAobXNnX3F1ZXVlX2hlYWQpIHsKKwkJbXNnX3F1ZXVlX3RhaWwtPm5leHQgPSBidWY7CisJCW1zZ19xdWV1ZV90YWlsID0gYnVmOworCX0gZWxzZSB7CisJCW1zZ19xdWV1ZV90YWlsID0gbXNnX3F1ZXVlX2hlYWQgPSBidWY7CisJCXRpcGNfa19zaWduYWwoKEhhbmRsZXIpcG9ydF9kaXNwYXRjaGVyX3NpZ2gsIDApOworCX0KKwlzcGluX3VubG9ja19iaCgmcXVldWVfbG9jayk7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKKy8qIAorICogV2FrZSB1cCBwb3J0IGFmdGVyIGNvbmdlc3Rpb246IENhbGxlZCB3aXRoIHBvcnQgbG9ja2VkLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICovCisKK3N0YXRpYyB2b2lkIHBvcnRfd2FrZXVwX3NoKHVuc2lnbmVkIGxvbmcgcmVmKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlzdHJ1Y3QgdXNlcl9wb3J0ICp1cF9wdHI7CisJdGlwY19jb250aW51ZV9ldmVudCBjYiA9IDA7CisJdm9pZCAqdWggPSAwOworCisJcF9wdHIgPSB0aXBjX3BvcnRfbG9jayhyZWYpOworCWlmIChwX3B0cikgeworCQl1cF9wdHIgPSBwX3B0ci0+dXNlcl9wb3J0OworCQlpZiAodXBfcHRyKSB7CisJCQljYiA9IHVwX3B0ci0+Y29udGludWVfZXZlbnRfY2I7CisJCQl1aCA9IHVwX3B0ci0+dXNyX2hhbmRsZTsKKwkJfQorCQl0aXBjX3BvcnRfdW5sb2NrKHBfcHRyKTsKKwl9CisJaWYgKGNiKQorCQljYih1aCwgcmVmKTsKK30KKworCitzdGF0aWMgdm9pZCBwb3J0X3dha2V1cChzdHJ1Y3QgdGlwY19wb3J0ICpwX3B0cikKK3sKKwl0aXBjX2tfc2lnbmFsKChIYW5kbGVyKXBvcnRfd2FrZXVwX3NoLCBwX3B0ci0+cmVmKTsKK30KKwordm9pZCB0aXBjX2Fja25vd2xlZGdlKHUzMiByZWYsIHUzMiBhY2spCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCXN0cnVjdCBza19idWZmICpidWYgPSAwOworCisJcF9wdHIgPSB0aXBjX3BvcnRfbG9jayhyZWYpOworCWlmICghcF9wdHIpCisJCXJldHVybjsKKwlpZiAocF9wdHItPnB1YmwuY29ubmVjdGVkKSB7CisJCXBfcHRyLT5wdWJsLmNvbm5fdW5hY2tlZCAtPSBhY2s7CisJCWJ1ZiA9IHBvcnRfYnVpbGRfcHJvdG9fbXNnKHBvcnRfcGVlcnBvcnQocF9wdHIpLAorCQkJCQkgICBwb3J0X3BlZXJub2RlKHBfcHRyKSwKKwkJCQkJICAgcmVmLAorCQkJCQkgICB0aXBjX293bl9hZGRyLAorCQkJCQkgICBDT05OX01BTkFHRVIsCisJCQkJCSAgIENPTk5fQUNLLAorCQkJCQkgICBUSVBDX09LLCAKKwkJCQkJICAgcG9ydF9vdXRfc2Vxbm8ocF9wdHIpLAorCQkJCQkgICBhY2spOworCX0KKwl0aXBjX3BvcnRfdW5sb2NrKHBfcHRyKTsKKwl0aXBjX25ldF9yb3V0ZV9tc2coYnVmKTsKK30KKworLyoKKyAqIHRpcGNfY3JlYXRlcG9ydCgpOiB1c2VyIGxldmVsIGNhbGwuIFdpbGwgYWRkIHBvcnQgdG8KKyAqICAgICAgICAgICAgICAgICAgICByZWdpc3RyeSBpZiBub24temVybyB1c2VyX3JlZi4KKyAqLworCitpbnQgdGlwY19jcmVhdGVwb3J0KHUzMiB1c2VyX3JlZiwgCisJCSAgICB2b2lkICp1c3JfaGFuZGxlLCAKKwkJICAgIHVuc2lnbmVkIGludCBpbXBvcnRhbmNlLCAKKwkJICAgIHRpcGNfbXNnX2Vycl9ldmVudCBlcnJvcl9jYiwgCisJCSAgICB0aXBjX25hbWVkX21zZ19lcnJfZXZlbnQgbmFtZWRfZXJyb3JfY2IsIAorCQkgICAgdGlwY19jb25uX3NodXRkb3duX2V2ZW50IGNvbm5fZXJyb3JfY2IsIAorCQkgICAgdGlwY19tc2dfZXZlbnQgbXNnX2NiLCAKKwkJICAgIHRpcGNfbmFtZWRfbXNnX2V2ZW50IG5hbWVkX21zZ19jYiwgCisJCSAgICB0aXBjX2Nvbm5fbXNnX2V2ZW50IGNvbm5fbXNnX2NiLCAKKwkJICAgIHRpcGNfY29udGludWVfZXZlbnQgY29udGludWVfZXZlbnRfY2IsLyogTWF5IGJlIHplcm8gKi8KKwkJICAgIHUzMiAqcG9ydHJlZikKK3sKKwlzdHJ1Y3QgdXNlcl9wb3J0ICp1cF9wdHI7CisJc3RydWN0IHBvcnQgKnBfcHRyOyAKKwl1MzIgcmVmOworCisJdXBfcHRyID0gKHN0cnVjdCB1c2VyX3BvcnQgKilrbWFsbG9jKHNpemVvZigqdXBfcHRyKSwgR0ZQX0FUT01JQyk7CisJaWYgKHVwX3B0ciA9PSBOVUxMKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZWYgPSB0aXBjX2NyZWF0ZXBvcnRfcmF3KDAsIHBvcnRfZGlzcGF0Y2hlciwgcG9ydF93YWtldXAsIGltcG9ydGFuY2UpOworCXBfcHRyID0gdGlwY19wb3J0X2xvY2socmVmKTsKKwlpZiAoIXBfcHRyKSB7CisJCWtmcmVlKHVwX3B0cik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBfcHRyLT51c2VyX3BvcnQgPSB1cF9wdHI7CisJdXBfcHRyLT51c2VyX3JlZiA9IHVzZXJfcmVmOworCXVwX3B0ci0+dXNyX2hhbmRsZSA9IHVzcl9oYW5kbGU7CisJdXBfcHRyLT5yZWYgPSBwX3B0ci0+cHVibC5yZWY7CisJdXBfcHRyLT5lcnJfY2IgPSBlcnJvcl9jYjsKKwl1cF9wdHItPm5hbWVkX2Vycl9jYiA9IG5hbWVkX2Vycm9yX2NiOworCXVwX3B0ci0+Y29ubl9lcnJfY2IgPSBjb25uX2Vycm9yX2NiOworCXVwX3B0ci0+bXNnX2NiID0gbXNnX2NiOworCXVwX3B0ci0+bmFtZWRfbXNnX2NiID0gbmFtZWRfbXNnX2NiOworCXVwX3B0ci0+Y29ubl9tc2dfY2IgPSBjb25uX21zZ19jYjsKKwl1cF9wdHItPmNvbnRpbnVlX2V2ZW50X2NiID0gY29udGludWVfZXZlbnRfY2I7CisJSU5JVF9MSVNUX0hFQUQoJnVwX3B0ci0+dXBvcnRfbGlzdCk7CisJdGlwY19yZWdfYWRkX3BvcnQodXBfcHRyKTsKKwkqcG9ydHJlZiA9IHBfcHRyLT5wdWJsLnJlZjsKKwlkYmcoIiB0aXBjX2NyZWF0ZXBvcnQ6ICV4IHdpdGggcmVmICV1XG4iLCBwX3B0ciwgcF9wdHItPnB1YmwucmVmKTsgICAgICAgIAorCXRpcGNfcG9ydF91bmxvY2socF9wdHIpOworCXJldHVybiBUSVBDX09LOworfQorCitpbnQgdGlwY19vd25pZGVudGl0eSh1MzIgcmVmLCBzdHJ1Y3QgdGlwY19wb3J0aWQgKmlkKQoreworCWlkLT5yZWYgPSByZWY7CisJaWQtPm5vZGUgPSB0aXBjX293bl9hZGRyOworCXJldHVybiBUSVBDX09LOworfQorCitpbnQgdGlwY19wb3J0aW1wb3J0YW5jZSh1MzIgcmVmLCB1bnNpZ25lZCBpbnQgKmltcG9ydGFuY2UpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCQorCXBfcHRyID0gdGlwY19wb3J0X2xvY2socmVmKTsKKwlpZiAoIXBfcHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkqaW1wb3J0YW5jZSA9ICh1bnNpZ25lZCBpbnQpbXNnX2ltcG9ydGFuY2UoJnBfcHRyLT5wdWJsLnBoZHIpOworCXNwaW5fdW5sb2NrX2JoKHBfcHRyLT5wdWJsLmxvY2spOworCXJldHVybiBUSVBDX09LOworfQorCitpbnQgdGlwY19zZXRfcG9ydGltcG9ydGFuY2UodTMyIHJlZiwgdW5zaWduZWQgaW50IGltcCkKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisKKwlpZiAoaW1wID4gVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBfcHRyID0gdGlwY19wb3J0X2xvY2socmVmKTsKKwlpZiAoIXBfcHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltc2dfc2V0X2ltcG9ydGFuY2UoJnBfcHRyLT5wdWJsLnBoZHIsICh1MzIpaW1wKTsKKwlzcGluX3VubG9ja19iaChwX3B0ci0+cHVibC5sb2NrKTsKKwlyZXR1cm4gVElQQ19PSzsKK30KKworCitpbnQgdGlwY19wdWJsaXNoKHUzMiByZWYsIHVuc2lnbmVkIGludCBzY29wZSwgc3RydWN0IHRpcGNfbmFtZV9zZXEgY29uc3QgKnNlcSkKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsOworCXUzMiBrZXk7CisJaW50IHJlcyA9IC1FSU5WQUw7CisKKwlwX3B0ciA9IHRpcGNfcG9ydF9sb2NrKHJlZik7CisJZGJnKCJ0aXBjX3B1YmwgJXUsIHBfcHRyID0gJXgsIGNvbm4gPSAleCwgc2NvcGUgPSAleCwgIgorCSAgICAibG93ZXIgPSAldSwgdXBwZXIgPSAldVxuIiwKKwkgICAgcmVmLCBwX3B0ciwgcF9wdHItPnB1YmwuY29ubmVjdGVkLCBzY29wZSwgc2VxLT5sb3dlciwgc2VxLT51cHBlcik7CisJaWYgKCFwX3B0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBfcHRyLT5wdWJsLmNvbm5lY3RlZCkKKwkJZ290byBleGl0OworCWlmIChzZXEtPmxvd2VyID4gc2VxLT51cHBlcikKKwkJZ290byBleGl0OworCWlmICgoc2NvcGUgPCBUSVBDX1pPTkVfU0NPUEUpIHx8IChzY29wZSA+IFRJUENfTk9ERV9TQ09QRSkpCisJCWdvdG8gZXhpdDsKKwlrZXkgPSByZWYgKyBwX3B0ci0+cHViX2NvdW50ICsgMTsKKwlpZiAoa2V5ID09IHJlZikgeworCQlyZXMgPSAtRUFERFJJTlVTRTsKKwkJZ290byBleGl0OworCX0KKwlwdWJsID0gdGlwY19uYW1ldGJsX3B1Ymxpc2goc2VxLT50eXBlLCBzZXEtPmxvd2VyLCBzZXEtPnVwcGVyLAorCQkJCSAgICBzY29wZSwgcF9wdHItPnB1YmwucmVmLCBrZXkpOworCWlmIChwdWJsKSB7CisJCWxpc3RfYWRkKCZwdWJsLT5wcG9ydF9saXN0LCAmcF9wdHItPnB1YmxpY2F0aW9ucyk7CisJCXBfcHRyLT5wdWJfY291bnQrKzsKKwkJcF9wdHItPnB1YmwucHVibGlzaGVkID0gMTsKKwkJcmVzID0gVElQQ19PSzsKKwl9CitleGl0OgorCXRpcGNfcG9ydF91bmxvY2socF9wdHIpOworCXJldHVybiByZXM7Cit9CisKK2ludCB0aXBjX3dpdGhkcmF3KHUzMiByZWYsIHVuc2lnbmVkIGludCBzY29wZSwgc3RydWN0IHRpcGNfbmFtZV9zZXEgY29uc3QgKnNlcSkKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsOworCXN0cnVjdCBwdWJsaWNhdGlvbiAqdHB1Ymw7CisJaW50IHJlcyA9IC1FSU5WQUw7CisJCisJcF9wdHIgPSB0aXBjX3BvcnRfbG9jayhyZWYpOworCWlmICghcF9wdHIpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghcF9wdHItPnB1YmwucHVibGlzaGVkKQorCQlnb3RvIGV4aXQ7CisJaWYgKCFzZXEpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB1YmwsIHRwdWJsLCAKKwkJCQkJICZwX3B0ci0+cHVibGljYXRpb25zLCBwcG9ydF9saXN0KSB7CisJCQl0aXBjX25hbWV0Ymxfd2l0aGRyYXcocHVibC0+dHlwZSwgcHVibC0+bG93ZXIsIAorCQkJCQkgICAgICBwdWJsLT5yZWYsIHB1YmwtPmtleSk7CisJCX0KKwkJcmVzID0gVElQQ19PSzsKKwl9IGVsc2UgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHVibCwgdHB1YmwsIAorCQkJCQkgJnBfcHRyLT5wdWJsaWNhdGlvbnMsIHBwb3J0X2xpc3QpIHsKKwkJCWlmIChwdWJsLT5zY29wZSAhPSBzY29wZSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChwdWJsLT50eXBlICE9IHNlcS0+dHlwZSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChwdWJsLT5sb3dlciAhPSBzZXEtPmxvd2VyKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHB1YmwtPnVwcGVyICE9IHNlcS0+dXBwZXIpCisJCQkJYnJlYWs7CisJCQl0aXBjX25hbWV0Ymxfd2l0aGRyYXcocHVibC0+dHlwZSwgcHVibC0+bG93ZXIsIAorCQkJCQkgICAgICBwdWJsLT5yZWYsIHB1YmwtPmtleSk7CisJCQlyZXMgPSBUSVBDX09LOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGxpc3RfZW1wdHkoJnBfcHRyLT5wdWJsaWNhdGlvbnMpKQorCQlwX3B0ci0+cHVibC5wdWJsaXNoZWQgPSAwOworZXhpdDoKKwl0aXBjX3BvcnRfdW5sb2NrKHBfcHRyKTsKKwlyZXR1cm4gcmVzOworfQorCitpbnQgdGlwY19jb25uZWN0MnBvcnQodTMyIHJlZiwgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpwZWVyKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwlpbnQgcmVzID0gLUVJTlZBTDsKKworCXBfcHRyID0gdGlwY19wb3J0X2xvY2socmVmKTsKKwlpZiAoIXBfcHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocF9wdHItPnB1YmwucHVibGlzaGVkIHx8IHBfcHRyLT5wdWJsLmNvbm5lY3RlZCkKKwkJZ290byBleGl0OworCWlmICghcGVlci0+cmVmKQorCQlnb3RvIGV4aXQ7CisKKwltc2cgPSAmcF9wdHItPnB1YmwucGhkcjsKKwltc2dfc2V0X2Rlc3Rub2RlKG1zZywgcGVlci0+bm9kZSk7CisJbXNnX3NldF9kZXN0cG9ydChtc2csIHBlZXItPnJlZik7CisJbXNnX3NldF9vcmlnbm9kZShtc2csIHRpcGNfb3duX2FkZHIpOworCW1zZ19zZXRfb3JpZ3BvcnQobXNnLCBwX3B0ci0+cHVibC5yZWYpOworCW1zZ19zZXRfdHJhbnNwX3NlcW5vKG1zZywgNDIpOworCW1zZ19zZXRfdHlwZShtc2csIFRJUENfQ09OTl9NU0cpOworCWlmICghbWF5X3JvdXRlKHBlZXItPm5vZGUpKQorCQltc2dfc2V0X2hkcl9zeihtc2csIFNIT1JUX0hfU0laRSk7CisJZWxzZQorCQltc2dfc2V0X2hkcl9zeihtc2csIExPTkdfSF9TSVpFKTsKKworCXBfcHRyLT5wcm9iaW5nX2ludGVydmFsID0gUFJPQklOR19JTlRFUlZBTDsKKwlwX3B0ci0+cHJvYmluZ19zdGF0ZSA9IENPTkZJUk1FRDsKKwlwX3B0ci0+cHVibC5jb25uZWN0ZWQgPSAxOworCWtfc3RhcnRfdGltZXIoJnBfcHRyLT50aW1lciwgcF9wdHItPnByb2JpbmdfaW50ZXJ2YWwpOworCisJdGlwY19ub2Rlc3ViX3N1YnNjcmliZSgmcF9wdHItPnN1YnNjcmlwdGlvbixwZWVyLT5ub2RlLAorCQkJICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXJlZiwKKwkJCSAgKG5ldF9ldl9oYW5kbGVyKXBvcnRfaGFuZGxlX25vZGVfZG93bik7CisJcmVzID0gVElQQ19PSzsKK2V4aXQ6CisJdGlwY19wb3J0X3VubG9jayhwX3B0cik7CisJcF9wdHItPm1heF9wa3QgPSB0aXBjX2xpbmtfZ2V0X21heF9wa3QocGVlci0+bm9kZSwgcmVmKTsKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogdGlwY19kaXNjb25uZWN0KCk6IERpc2Nvbm5lY3QgcG9ydCBmb3JtIHBlZXIuCisgKiAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIG5vZGUgbG9jYWwgb3BlcmF0aW9uLgorICovCisKK2ludCB0aXBjX2Rpc2Nvbm5lY3QodTMyIHJlZikKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJaW50IHJlcyA9IC1FTk9UQ09OTjsKKworCXBfcHRyID0gdGlwY19wb3J0X2xvY2socmVmKTsKKwlpZiAoIXBfcHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocF9wdHItPnB1YmwuY29ubmVjdGVkKSB7CisJCXBfcHRyLT5wdWJsLmNvbm5lY3RlZCA9IDA7CisJCS8qIGxldCB0aW1lciBleHBpcmUgb24gaXQncyBvd24gdG8gYXZvaWQgZGVhZGxvY2shICovCisJCXRpcGNfbm9kZXN1Yl91bnN1YnNjcmliZSgmcF9wdHItPnN1YnNjcmlwdGlvbik7CisJCXJlcyA9IFRJUENfT0s7CisJfQorCXRpcGNfcG9ydF91bmxvY2socF9wdHIpOworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiB0aXBjX3NodXRkb3duKCk6IFNlbmQgYSBTSFVURE9XTiBtc2cgdG8gcGVlciBhbmQgZGlzY29ubmVjdAorICovCitpbnQgdGlwY19zaHV0ZG93bih1MzIgcmVmKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gMDsKKworCXBfcHRyID0gdGlwY19wb3J0X2xvY2socmVmKTsKKwlpZiAoIXBfcHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwX3B0ci0+cHVibC5jb25uZWN0ZWQpIHsKKwkJdTMyIGltcCA9IG1zZ19pbXBvcnRhbmNlKCZwX3B0ci0+cHVibC5waGRyKTsKKwkJaWYgKGltcCA8IFRJUENfQ1JJVElDQUxfSU1QT1JUQU5DRSkKKwkJCWltcCsrOworCQlidWYgPSBwb3J0X2J1aWxkX3Byb3RvX21zZyhwb3J0X3BlZXJwb3J0KHBfcHRyKSwKKwkJCQkJICAgcG9ydF9wZWVybm9kZShwX3B0ciksCisJCQkJCSAgIHJlZiwKKwkJCQkJICAgdGlwY19vd25fYWRkciwKKwkJCQkJICAgaW1wLAorCQkJCQkgICBUSVBDX0NPTk5fTVNHLAorCQkJCQkgICBUSVBDX0NPTk5fU0hVVERPV04sIAorCQkJCQkgICBwb3J0X291dF9zZXFubyhwX3B0ciksCisJCQkJCSAgIDApOworCX0KKwl0aXBjX3BvcnRfdW5sb2NrKHBfcHRyKTsKKwl0aXBjX25ldF9yb3V0ZV9tc2coYnVmKTsKKwlyZXR1cm4gdGlwY19kaXNjb25uZWN0KHJlZik7Cit9CisKK2ludCB0aXBjX2lzY29ubmVjdGVkKHUzMiByZWYsIGludCAqaXNjb25uZWN0ZWQpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCQorCXBfcHRyID0gdGlwY19wb3J0X2xvY2socmVmKTsKKwlpZiAoIXBfcHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkqaXNjb25uZWN0ZWQgPSBwX3B0ci0+cHVibC5jb25uZWN0ZWQ7CisJdGlwY19wb3J0X3VubG9jayhwX3B0cik7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKK2ludCB0aXBjX3BlZXIodTMyIHJlZiwgc3RydWN0IHRpcGNfcG9ydGlkICpwZWVyKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlpbnQgcmVzOworCSAKKwlwX3B0ciA9IHRpcGNfcG9ydF9sb2NrKHJlZik7CisJaWYgKCFwX3B0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBfcHRyLT5wdWJsLmNvbm5lY3RlZCkgeworCQlwZWVyLT5yZWYgPSBwb3J0X3BlZXJwb3J0KHBfcHRyKTsKKwkJcGVlci0+bm9kZSA9IHBvcnRfcGVlcm5vZGUocF9wdHIpOworCQlyZXMgPSBUSVBDX09LOworCX0gZWxzZQorCQlyZXMgPSAtRU5PVENPTk47CisJdGlwY19wb3J0X3VubG9jayhwX3B0cik7CisJcmV0dXJuIHJlczsKK30KKworaW50IHRpcGNfcmVmX3ZhbGlkKHUzMiByZWYpCit7CisJLyogV29ya3MgaXJyZXNwZWN0aXZlIG9mIHR5cGUgKi8KKwlyZXR1cm4gISF0aXBjX3JlZl9kZXJlZihyZWYpOworfQorCisKKy8qCisgKiAgdGlwY19wb3J0X3JlY3Zfc2VjdGlvbnMoKTogQ29uY2F0ZW5hdGUgYW5kIGRlbGl2ZXIgc2VjdGlvbmVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgZm9yIHRoaXMgbm9kZS4KKyAqLworCitpbnQgdGlwY19wb3J0X3JlY3Zfc2VjdGlvbnMoc3RydWN0IHBvcnQgKnNlbmRlciwgdW5zaWduZWQgaW50IG51bV9zZWN0LAorCQkgICAgICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCWludCByZXM7CisJIAorCXJlcyA9IG1zZ19idWlsZCgmc2VuZGVyLT5wdWJsLnBoZHIsIG1zZ19zZWN0LCBudW1fc2VjdCwKKwkJCU1BWF9NU0dfU0laRSwgIXNlbmRlci0+dXNlcl9wb3J0LCAmYnVmKTsKKwlpZiAobGlrZWx5KGJ1ZikpCisJCXRpcGNfcG9ydF9yZWN2X21zZyhidWYpOworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogdGlwY19zZW5kIC0gc2VuZCBtZXNzYWdlIHNlY3Rpb25zIG9uIGNvbm5lY3Rpb24KKyAqLworCitpbnQgdGlwY19zZW5kKHUzMiByZWYsIHVuc2lnbmVkIGludCBudW1fc2VjdCwgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCkKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJdTMyIGRlc3Rub2RlOworCWludCByZXM7CisKKwlwX3B0ciA9IHRpcGNfcG9ydF9kZXJlZihyZWYpOworCWlmICghcF9wdHIgfHwgIXBfcHRyLT5wdWJsLmNvbm5lY3RlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwX3B0ci0+cHVibC5jb25nZXN0ZWQgPSAxOworCWlmICghdGlwY19wb3J0X2Nvbmdlc3RlZChwX3B0cikpIHsKKwkJZGVzdG5vZGUgPSBwb3J0X3BlZXJub2RlKHBfcHRyKTsKKwkJaWYgKGxpa2VseShkZXN0bm9kZSAhPSB0aXBjX293bl9hZGRyKSkKKwkJCXJlcyA9IHRpcGNfbGlua19zZW5kX3NlY3Rpb25zX2Zhc3QocF9wdHIsIG1zZ19zZWN0LCBudW1fc2VjdCwKKwkJCQkJCQkgICBkZXN0bm9kZSk7CisJCWVsc2UKKwkJCXJlcyA9IHRpcGNfcG9ydF9yZWN2X3NlY3Rpb25zKHBfcHRyLCBudW1fc2VjdCwgbXNnX3NlY3QpOworCisJCWlmIChsaWtlbHkocmVzICE9IC1FTElOS0NPTkcpKSB7CisJCQlwb3J0X2luY3Jfb3V0X3NlcW5vKHBfcHRyKTsKKwkJCXBfcHRyLT5wdWJsLmNvbmdlc3RlZCA9IDA7CisJCQlwX3B0ci0+c2VudCsrOworCQkJcmV0dXJuIHJlczsKKwkJfQorCX0KKwlpZiAocG9ydF91bnJlbGlhYmxlKHBfcHRyKSkgeworCQlwX3B0ci0+cHVibC5jb25nZXN0ZWQgPSAwOworCQkvKiBKdXN0IGNhbGN1bGF0ZSBtc2cgbGVuZ3RoIGFuZCByZXR1cm4gKi8KKwkJcmV0dXJuIG1zZ19jYWxjX2RhdGFfc2l6ZShtc2dfc2VjdCwgbnVtX3NlY3QpOworCX0KKwlyZXR1cm4gLUVMSU5LQ09ORzsKK30KKworLyoqIAorICogdGlwY19zZW5kX2J1ZiAtIHNlbmQgbWVzc2FnZSBidWZmZXIgb24gY29ubmVjdGlvbgorICovCisKK2ludCB0aXBjX3NlbmRfYnVmKHUzMiByZWYsIHN0cnVjdCBza19idWZmICpidWYsIHVuc2lnbmVkIGludCBkc3opCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCXUzMiBkZXN0bm9kZTsKKwl1MzIgaHN6OworCXUzMiBzejsKKwl1MzIgcmVzOworCSAKKwlwX3B0ciA9IHRpcGNfcG9ydF9kZXJlZihyZWYpOworCWlmICghcF9wdHIgfHwgIXBfcHRyLT5wdWJsLmNvbm5lY3RlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltc2cgPSAmcF9wdHItPnB1YmwucGhkcjsKKwloc3ogPSBtc2dfaGRyX3N6KG1zZyk7CisJc3ogPSBoc3ogKyBkc3o7CisJbXNnX3NldF9zaXplKG1zZywgc3opOworCWlmIChza2JfY293KGJ1ZiwgaHN6KSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlza2JfcHVzaChidWYsIGhzeik7CisJbWVtY3B5KGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKW1zZywgaHN6KTsKKwlkZXN0bm9kZSA9IG1zZ19kZXN0bm9kZShtc2cpOworCXBfcHRyLT5wdWJsLmNvbmdlc3RlZCA9IDE7CisJaWYgKCF0aXBjX3BvcnRfY29uZ2VzdGVkKHBfcHRyKSkgeworCQlpZiAobGlrZWx5KGRlc3Rub2RlICE9IHRpcGNfb3duX2FkZHIpKQorCQkJcmVzID0gdGlwY19zZW5kX2J1Zl9mYXN0KGJ1ZiwgZGVzdG5vZGUpOworCQllbHNlIHsKKwkJCXRpcGNfcG9ydF9yZWN2X21zZyhidWYpOworCQkJcmVzID0gc3o7CisJCX0KKwkJaWYgKGxpa2VseShyZXMgIT0gLUVMSU5LQ09ORykpIHsKKwkJCXBvcnRfaW5jcl9vdXRfc2Vxbm8ocF9wdHIpOworCQkJcF9wdHItPnNlbnQrKzsKKwkJCXBfcHRyLT5wdWJsLmNvbmdlc3RlZCA9IDA7CisJCQlyZXR1cm4gcmVzOworCQl9CisJfQorCWlmIChwb3J0X3VucmVsaWFibGUocF9wdHIpKSB7CisJCXBfcHRyLT5wdWJsLmNvbmdlc3RlZCA9IDA7CisJCXJldHVybiBkc3o7CisJfQorCXJldHVybiAtRUxJTktDT05HOworfQorCisvKioKKyAqIHRpcGNfZm9yd2FyZDJuYW1lIC0gZm9yd2FyZCBtZXNzYWdlIHNlY3Rpb25zIHRvIHBvcnQgbmFtZQorICovCisKK2ludCB0aXBjX2ZvcndhcmQybmFtZSh1MzIgcmVmLCAKKwkJICAgICAgc3RydWN0IHRpcGNfbmFtZSBjb25zdCAqbmFtZSwgCisJCSAgICAgIHUzMiBkb21haW4sCisJCSAgICAgIHUzMiBudW1fc2VjdCwgCisJCSAgICAgIHN0cnVjdCBpb3ZlYyBjb25zdCAqbXNnX3NlY3QsCisJCSAgICAgIHN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqb3JpZywgCisJCSAgICAgIHVuc2lnbmVkIGludCBpbXBvcnRhbmNlKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwl1MzIgZGVzdG5vZGUgPSBkb21haW47CisJdTMyIGRlc3Rwb3J0ID0gMDsKKwlpbnQgcmVzOworCisJcF9wdHIgPSB0aXBjX3BvcnRfZGVyZWYocmVmKTsKKwlpZiAoIXBfcHRyIHx8IHBfcHRyLT5wdWJsLmNvbm5lY3RlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltc2cgPSAmcF9wdHItPnB1YmwucGhkcjsKKwltc2dfc2V0X3R5cGUobXNnLCBUSVBDX05BTUVEX01TRyk7CisJbXNnX3NldF9vcmlnbm9kZShtc2csIG9yaWctPm5vZGUpOworCW1zZ19zZXRfb3JpZ3BvcnQobXNnLCBvcmlnLT5yZWYpOworCW1zZ19zZXRfaGRyX3N6KG1zZywgTE9OR19IX1NJWkUpOworCW1zZ19zZXRfbmFtZXR5cGUobXNnLCBuYW1lLT50eXBlKTsKKwltc2dfc2V0X25hbWVpbnN0KG1zZywgbmFtZS0+aW5zdGFuY2UpOworCW1zZ19zZXRfbG9va3VwX3Njb3BlKG1zZywgYWRkcl9zY29wZShkb21haW4pKTsKKwlpZiAoaW1wb3J0YW5jZSA8PSBUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0UpCisJCW1zZ19zZXRfaW1wb3J0YW5jZShtc2csaW1wb3J0YW5jZSk7CisJZGVzdHBvcnQgPSB0aXBjX25hbWV0YmxfdHJhbnNsYXRlKG5hbWUtPnR5cGUsIG5hbWUtPmluc3RhbmNlLCAmZGVzdG5vZGUpOworCW1zZ19zZXRfZGVzdG5vZGUobXNnLCBkZXN0bm9kZSk7CisJbXNnX3NldF9kZXN0cG9ydChtc2csIGRlc3Rwb3J0KTsKKworCWlmIChsaWtlbHkoZGVzdHBvcnQgfHwgZGVzdG5vZGUpKSB7CisJCXBfcHRyLT5zZW50Kys7CisJCWlmIChsaWtlbHkoZGVzdG5vZGUgPT0gdGlwY19vd25fYWRkcikpCisJCQlyZXR1cm4gdGlwY19wb3J0X3JlY3Zfc2VjdGlvbnMocF9wdHIsIG51bV9zZWN0LCBtc2dfc2VjdCk7CisJCXJlcyA9IHRpcGNfbGlua19zZW5kX3NlY3Rpb25zX2Zhc3QocF9wdHIsIG1zZ19zZWN0LCBudW1fc2VjdCwgCisJCQkJCQkgICBkZXN0bm9kZSk7CisJCWlmIChsaWtlbHkocmVzICE9IC1FTElOS0NPTkcpKQorCQkJcmV0dXJuIHJlczsKKwkJaWYgKHBvcnRfdW5yZWxpYWJsZShwX3B0cikpIHsKKwkJCS8qIEp1c3QgY2FsY3VsYXRlIG1zZyBsZW5ndGggYW5kIHJldHVybiAqLworCQkJcmV0dXJuIG1zZ19jYWxjX2RhdGFfc2l6ZShtc2dfc2VjdCwgbnVtX3NlY3QpOworCQl9CisJCXJldHVybiAtRUxJTktDT05HOworCX0KKwlyZXR1cm4gdGlwY19wb3J0X3JlamVjdF9zZWN0aW9ucyhwX3B0ciwgbXNnLCBtc2dfc2VjdCwgbnVtX3NlY3QsIAorCQkJCQkgVElQQ19FUlJfTk9fTkFNRSk7Cit9CisKKy8qKgorICogdGlwY19zZW5kMm5hbWUgLSBzZW5kIG1lc3NhZ2Ugc2VjdGlvbnMgdG8gcG9ydCBuYW1lCisgKi8KKworaW50IHRpcGNfc2VuZDJuYW1lKHUzMiByZWYsIAorCQkgICBzdHJ1Y3QgdGlwY19uYW1lIGNvbnN0ICpuYW1lLAorCQkgICB1bnNpZ25lZCBpbnQgZG9tYWluLCAKKwkJICAgdW5zaWduZWQgaW50IG51bV9zZWN0LCAKKwkJICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCkKK3sKKwlzdHJ1Y3QgdGlwY19wb3J0aWQgb3JpZzsKKworCW9yaWcucmVmID0gcmVmOworCW9yaWcubm9kZSA9IHRpcGNfb3duX2FkZHI7CisJcmV0dXJuIHRpcGNfZm9yd2FyZDJuYW1lKHJlZiwgbmFtZSwgZG9tYWluLCBudW1fc2VjdCwgbXNnX3NlY3QsICZvcmlnLAorCQkJCSBUSVBDX1BPUlRfSU1QT1JUQU5DRSk7Cit9CisKKy8qKiAKKyAqIHRpcGNfZm9yd2FyZF9idWYybmFtZSAtIGZvcndhcmQgbWVzc2FnZSBidWZmZXIgdG8gcG9ydCBuYW1lCisgKi8KKworaW50IHRpcGNfZm9yd2FyZF9idWYybmFtZSh1MzIgcmVmLAorCQkJICBzdHJ1Y3QgdGlwY19uYW1lIGNvbnN0ICpuYW1lLAorCQkJICB1MzIgZG9tYWluLAorCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLAorCQkJICB1bnNpZ25lZCBpbnQgZHN6LAorCQkJICBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKm9yaWcsCisJCQkgIHVuc2lnbmVkIGludCBpbXBvcnRhbmNlKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwl1MzIgZGVzdG5vZGUgPSBkb21haW47CisJdTMyIGRlc3Rwb3J0ID0gMDsKKwlpbnQgcmVzOworCisJcF9wdHIgPSAoc3RydWN0IHBvcnQgKil0aXBjX3JlZl9kZXJlZihyZWYpOworCWlmICghcF9wdHIgfHwgcF9wdHItPnB1YmwuY29ubmVjdGVkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1zZyA9ICZwX3B0ci0+cHVibC5waGRyOworCWlmIChpbXBvcnRhbmNlIDw9IFRJUENfQ1JJVElDQUxfSU1QT1JUQU5DRSkKKwkJbXNnX3NldF9pbXBvcnRhbmNlKG1zZywgaW1wb3J0YW5jZSk7CisJbXNnX3NldF90eXBlKG1zZywgVElQQ19OQU1FRF9NU0cpOworCW1zZ19zZXRfb3JpZ25vZGUobXNnLCBvcmlnLT5ub2RlKTsKKwltc2dfc2V0X29yaWdwb3J0KG1zZywgb3JpZy0+cmVmKTsKKwltc2dfc2V0X25hbWV0eXBlKG1zZywgbmFtZS0+dHlwZSk7CisJbXNnX3NldF9uYW1laW5zdChtc2csIG5hbWUtPmluc3RhbmNlKTsKKwltc2dfc2V0X2xvb2t1cF9zY29wZShtc2csIGFkZHJfc2NvcGUoZG9tYWluKSk7CisJbXNnX3NldF9oZHJfc3oobXNnLCBMT05HX0hfU0laRSk7CisJbXNnX3NldF9zaXplKG1zZywgTE9OR19IX1NJWkUgKyBkc3opOworCWRlc3Rwb3J0ID0gdGlwY19uYW1ldGJsX3RyYW5zbGF0ZShuYW1lLT50eXBlLCBuYW1lLT5pbnN0YW5jZSwgJmRlc3Rub2RlKTsKKwltc2dfc2V0X2Rlc3Rub2RlKG1zZywgZGVzdG5vZGUpOworCW1zZ19zZXRfZGVzdHBvcnQobXNnLCBkZXN0cG9ydCk7CisJbXNnX2RiZyhtc2csICJmb3J3Mm5hbWUgPT0+ICIpOworCWlmIChza2JfY293KGJ1ZiwgTE9OR19IX1NJWkUpKQorCQlyZXR1cm4gLUVOT01FTTsKKwlza2JfcHVzaChidWYsIExPTkdfSF9TSVpFKTsKKwltZW1jcHkoYnVmLT5kYXRhLCAodW5jaGFyICopbXNnLCBMT05HX0hfU0laRSk7CisJbXNnX2RiZyhidWZfbXNnKGJ1ZiksIlBSRVA6Iik7CisJaWYgKGxpa2VseShkZXN0cG9ydCB8fCBkZXN0bm9kZSkpIHsKKwkJcF9wdHItPnNlbnQrKzsKKwkJaWYgKGRlc3Rub2RlID09IHRpcGNfb3duX2FkZHIpCisJCQlyZXR1cm4gdGlwY19wb3J0X3JlY3ZfbXNnKGJ1Zik7CisJCXJlcyA9IHRpcGNfc2VuZF9idWZfZmFzdChidWYsIGRlc3Rub2RlKTsKKwkJaWYgKGxpa2VseShyZXMgIT0gLUVMSU5LQ09ORykpCisJCQlyZXR1cm4gcmVzOworCQlpZiAocG9ydF91bnJlbGlhYmxlKHBfcHRyKSkKKwkJCXJldHVybiBkc3o7CisJCXJldHVybiAtRUxJTktDT05HOworCX0KKwlyZXR1cm4gdGlwY19yZWplY3RfbXNnKGJ1ZiwgVElQQ19FUlJfTk9fTkFNRSk7Cit9CisKKy8qKiAKKyAqIHRpcGNfc2VuZF9idWYybmFtZSAtIHNlbmQgbWVzc2FnZSBidWZmZXIgdG8gcG9ydCBuYW1lCisgKi8KKworaW50IHRpcGNfc2VuZF9idWYybmFtZSh1MzIgcmVmLCAKKwkJICAgICAgIHN0cnVjdCB0aXBjX25hbWUgY29uc3QgKmRlc3QsIAorCQkgICAgICAgdTMyIGRvbWFpbiwKKwkJICAgICAgIHN0cnVjdCBza19idWZmICpidWYsIAorCQkgICAgICAgdW5zaWduZWQgaW50IGRzeikKK3sKKwlzdHJ1Y3QgdGlwY19wb3J0aWQgb3JpZzsKKworCW9yaWcucmVmID0gcmVmOworCW9yaWcubm9kZSA9IHRpcGNfb3duX2FkZHI7CisJcmV0dXJuIHRpcGNfZm9yd2FyZF9idWYybmFtZShyZWYsIGRlc3QsIGRvbWFpbiwgYnVmLCBkc3osICZvcmlnLAorCQkJCSAgICAgVElQQ19QT1JUX0lNUE9SVEFOQ0UpOworfQorCisvKiogCisgKiB0aXBjX2ZvcndhcmQycG9ydCAtIGZvcndhcmQgbWVzc2FnZSBzZWN0aW9ucyB0byBwb3J0IGlkZW50aXR5CisgKi8KKworaW50IHRpcGNfZm9yd2FyZDJwb3J0KHUzMiByZWYsCisJCSAgICAgIHN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqZGVzdCwKKwkJICAgICAgdW5zaWduZWQgaW50IG51bV9zZWN0LCAKKwkJICAgICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCwKKwkJICAgICAgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpvcmlnLCAKKwkJICAgICAgdW5zaWduZWQgaW50IGltcG9ydGFuY2UpCit7CisJc3RydWN0IHBvcnQgKnBfcHRyOworCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCWludCByZXM7CisKKwlwX3B0ciA9IHRpcGNfcG9ydF9kZXJlZihyZWYpOworCWlmICghcF9wdHIgfHwgcF9wdHItPnB1YmwuY29ubmVjdGVkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1zZyA9ICZwX3B0ci0+cHVibC5waGRyOworCW1zZ19zZXRfdHlwZShtc2csIFRJUENfRElSRUNUX01TRyk7CisJbXNnX3NldF9vcmlnbm9kZShtc2csIG9yaWctPm5vZGUpOworCW1zZ19zZXRfb3JpZ3BvcnQobXNnLCBvcmlnLT5yZWYpOworCW1zZ19zZXRfZGVzdG5vZGUobXNnLCBkZXN0LT5ub2RlKTsKKwltc2dfc2V0X2Rlc3Rwb3J0KG1zZywgZGVzdC0+cmVmKTsKKwltc2dfc2V0X2hkcl9zeihtc2csIERJUl9NU0dfSF9TSVpFKTsKKwlpZiAoaW1wb3J0YW5jZSA8PSBUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0UpCisJCW1zZ19zZXRfaW1wb3J0YW5jZShtc2csIGltcG9ydGFuY2UpOworCXBfcHRyLT5zZW50Kys7CisJaWYgKGRlc3QtPm5vZGUgPT0gdGlwY19vd25fYWRkcikKKwkJcmV0dXJuIHRpcGNfcG9ydF9yZWN2X3NlY3Rpb25zKHBfcHRyLCBudW1fc2VjdCwgbXNnX3NlY3QpOworCXJlcyA9IHRpcGNfbGlua19zZW5kX3NlY3Rpb25zX2Zhc3QocF9wdHIsIG1zZ19zZWN0LCBudW1fc2VjdCwgZGVzdC0+bm9kZSk7CisJaWYgKGxpa2VseShyZXMgIT0gLUVMSU5LQ09ORykpCisJCXJldHVybiByZXM7CisJaWYgKHBvcnRfdW5yZWxpYWJsZShwX3B0cikpIHsKKwkJLyogSnVzdCBjYWxjdWxhdGUgbXNnIGxlbmd0aCBhbmQgcmV0dXJuICovCisJCXJldHVybiBtc2dfY2FsY19kYXRhX3NpemUobXNnX3NlY3QsIG51bV9zZWN0KTsKKwl9CisJcmV0dXJuIC1FTElOS0NPTkc7Cit9CisKKy8qKiAKKyAqIHRpcGNfc2VuZDJwb3J0IC0gc2VuZCBtZXNzYWdlIHNlY3Rpb25zIHRvIHBvcnQgaWRlbnRpdHkgCisgKi8KKworaW50IHRpcGNfc2VuZDJwb3J0KHUzMiByZWYsIAorCQkgICBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKmRlc3QsCisJCSAgIHVuc2lnbmVkIGludCBudW1fc2VjdCwgCisJCSAgIHN0cnVjdCBpb3ZlYyBjb25zdCAqbXNnX3NlY3QpCit7CisJc3RydWN0IHRpcGNfcG9ydGlkIG9yaWc7CisKKwlvcmlnLnJlZiA9IHJlZjsKKwlvcmlnLm5vZGUgPSB0aXBjX293bl9hZGRyOworCXJldHVybiB0aXBjX2ZvcndhcmQycG9ydChyZWYsIGRlc3QsIG51bV9zZWN0LCBtc2dfc2VjdCwgJm9yaWcsIAorCQkJCSBUSVBDX1BPUlRfSU1QT1JUQU5DRSk7Cit9CisKKy8qKiAKKyAqIHRpcGNfZm9yd2FyZF9idWYycG9ydCAtIGZvcndhcmQgbWVzc2FnZSBidWZmZXIgdG8gcG9ydCBpZGVudGl0eQorICovCitpbnQgdGlwY19mb3J3YXJkX2J1ZjJwb3J0KHUzMiByZWYsCisJCQkgIHN0cnVjdCB0aXBjX3BvcnRpZCBjb25zdCAqZGVzdCwKKwkJCSAgc3RydWN0IHNrX2J1ZmYgKmJ1ZiwKKwkJCSAgdW5zaWduZWQgaW50IGRzeiwKKwkJCSAgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpvcmlnLAorCQkJICB1bnNpZ25lZCBpbnQgaW1wb3J0YW5jZSkKK3sKKwlzdHJ1Y3QgcG9ydCAqcF9wdHI7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisJaW50IHJlczsKKworCXBfcHRyID0gKHN0cnVjdCBwb3J0ICopdGlwY19yZWZfZGVyZWYocmVmKTsKKwlpZiAoIXBfcHRyIHx8IHBfcHRyLT5wdWJsLmNvbm5lY3RlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltc2cgPSAmcF9wdHItPnB1YmwucGhkcjsKKwltc2dfc2V0X3R5cGUobXNnLCBUSVBDX0RJUkVDVF9NU0cpOworCW1zZ19zZXRfb3JpZ25vZGUobXNnLCBvcmlnLT5ub2RlKTsKKwltc2dfc2V0X29yaWdwb3J0KG1zZywgb3JpZy0+cmVmKTsKKwltc2dfc2V0X2Rlc3Rub2RlKG1zZywgZGVzdC0+bm9kZSk7CisJbXNnX3NldF9kZXN0cG9ydChtc2csIGRlc3QtPnJlZik7CisJbXNnX3NldF9oZHJfc3oobXNnLCBESVJfTVNHX0hfU0laRSk7CisJaWYgKGltcG9ydGFuY2UgPD0gVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFKQorCQltc2dfc2V0X2ltcG9ydGFuY2UobXNnLCBpbXBvcnRhbmNlKTsKKwltc2dfc2V0X3NpemUobXNnLCBESVJfTVNHX0hfU0laRSArIGRzeik7CisJaWYgKHNrYl9jb3coYnVmLCBESVJfTVNHX0hfU0laRSkpCisJCXJldHVybiAtRU5PTUVNOworCisJc2tiX3B1c2goYnVmLCBESVJfTVNHX0hfU0laRSk7CisJbWVtY3B5KGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKW1zZywgRElSX01TR19IX1NJWkUpOworCW1zZ19kYmcobXNnLCAiYnVmMnBvcnQ6ICIpOworCXBfcHRyLT5zZW50Kys7CisJaWYgKGRlc3QtPm5vZGUgPT0gdGlwY19vd25fYWRkcikKKwkJcmV0dXJuIHRpcGNfcG9ydF9yZWN2X21zZyhidWYpOworCXJlcyA9IHRpcGNfc2VuZF9idWZfZmFzdChidWYsIGRlc3QtPm5vZGUpOworCWlmIChsaWtlbHkocmVzICE9IC1FTElOS0NPTkcpKQorCQlyZXR1cm4gcmVzOworCWlmIChwb3J0X3VucmVsaWFibGUocF9wdHIpKQorCQlyZXR1cm4gZHN6OworCXJldHVybiAtRUxJTktDT05HOworfQorCisvKiogCisgKiB0aXBjX3NlbmRfYnVmMnBvcnQgLSBzZW5kIG1lc3NhZ2UgYnVmZmVyIHRvIHBvcnQgaWRlbnRpdHkKKyAqLworCitpbnQgdGlwY19zZW5kX2J1ZjJwb3J0KHUzMiByZWYsIAorCQkgICAgICAgc3RydWN0IHRpcGNfcG9ydGlkIGNvbnN0ICpkZXN0LAorCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgCisJCSAgICAgICB1bnNpZ25lZCBpbnQgZHN6KQoreworCXN0cnVjdCB0aXBjX3BvcnRpZCBvcmlnOworCisJb3JpZy5yZWYgPSByZWY7CisJb3JpZy5ub2RlID0gdGlwY19vd25fYWRkcjsKKwlyZXR1cm4gdGlwY19mb3J3YXJkX2J1ZjJwb3J0KHJlZiwgZGVzdCwgYnVmLCBkc3osICZvcmlnLCAKKwkJCQkgICAgIFRJUENfUE9SVF9JTVBPUlRBTkNFKTsKK30KKwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvcG9ydC5oIGIvbmV0L3RpcGMvcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOWYxMDAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9wb3J0LmgKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBuZXQvdGlwYy9wb3J0Lmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBwb3J0IGNvZGUKKyAqIAorICogQ29weXJpZ2h0IChjKSAxOTk0LTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9USVBDX1BPUlRfSAorI2RlZmluZSBfVElQQ19QT1JUX0gKKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJyZWYuaCIKKyNpbmNsdWRlICJuZXQuaCIKKyNpbmNsdWRlICJtc2cuaCIKKyNpbmNsdWRlICJkYmcuaCIKKyNpbmNsdWRlICJub2RlX3N1YnNjci5oIgorCisvKioKKyAqIHN0cnVjdCB1c2VyX3BvcnQgLSBUSVBDIHVzZXIgcG9ydCAodXNlZCB3aXRoIG5hdGl2ZSBBUEkpCisgKiBAdXNlcl9yZWY6IGlkIG9mIHVzZXIgd2hvIGNyZWF0ZWQgdXNlciBwb3J0CisgKiBAdXNyX2hhbmRsZTogdXNlci1zcGVjaWZpZWQgZmllbGQKKyAqIEByZWY6IG9iamVjdCByZWZlcmVuY2UgdG8gYXNzb2NpYXRlZCBUSVBDIHBvcnQKKyAqIDx2YXJpb3VzIGNhbGxiYWNrIHJvdXRpbmVzPgorICogQHVwb3J0X2xpc3Q6IGFkamFjZW50IHVzZXIgcG9ydHMgaW4gbGlzdCBvZiBwb3J0cyBoZWxkIGJ5IHVzZXIKKyAqLworIAorc3RydWN0IHVzZXJfcG9ydCB7CisJdTMyIHVzZXJfcmVmOworCXZvaWQgKnVzcl9oYW5kbGU7IAorCXUzMiByZWY7CisJdGlwY19tc2dfZXJyX2V2ZW50IGVycl9jYjsgCisJdGlwY19uYW1lZF9tc2dfZXJyX2V2ZW50IG5hbWVkX2Vycl9jYjsgCisJdGlwY19jb25uX3NodXRkb3duX2V2ZW50IGNvbm5fZXJyX2NiOyAKKwl0aXBjX21zZ19ldmVudCBtc2dfY2I7IAorCXRpcGNfbmFtZWRfbXNnX2V2ZW50IG5hbWVkX21zZ19jYjsgCisJdGlwY19jb25uX21zZ19ldmVudCBjb25uX21zZ19jYjsgCisJdGlwY19jb250aW51ZV9ldmVudCBjb250aW51ZV9ldmVudF9jYjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHVwb3J0X2xpc3Q7Cit9OworCisvKioKKyAqIHN0cnVjdCBwb3J0IC0gVElQQyBwb3J0IHN0cnVjdHVyZQorICogQHB1Ymw6IFRJUEMgcG9ydCBpbmZvIGF2YWlsYWJsZSB0byBwcml2aWxlZ2VkIHVzZXJzCisgKiBAcG9ydF9saXN0OiBhZGphY2VudCBwb3J0cyBpbiBUSVBDJ3MgZ2xvYmFsIGxpc3Qgb2YgcG9ydHMKKyAqIEBkaXNwYXRjaGVyOiBwdHIgdG8gcm91dGluZSB3aGljaCBoYW5kbGVzIHJlY2VpdmVkIG1lc3NhZ2VzCisgKiBAd2FrZXVwOiBwdHIgdG8gcm91dGluZSB0byBjYWxsIHdoZW4gcG9ydCBpcyBubyBsb25nZXIgY29uZ2VzdGVkCisgKiBAdXNlcl9wb3J0OiBwdHIgdG8gdXNlciBwb3J0IGFzc29jaWF0ZWQgd2l0aCBwb3J0IChpZiBhbnkpCisgKiBAd2FpdF9saXN0OiBhZGphY2VudCBwb3J0cyBpbiBsaXN0IG9mIHBvcnRzIHdhaXRpbmcgb24gbGluayBjb25nZXN0aW9uCisgKiBAY29uZ2VzdGVkX2xpbms6IHB0ciB0byBjb25nZXN0ZWQgbGluayBwb3J0IGlzIHdhaXRpbmcgb24KKyAqIEB3YWl0aW5nX3BrdHM6CisgKiBAc2VudDoKKyAqIEBhY2tlZDoKKyAqIEBwdWJsaWNhdGlvbnM6IGxpc3Qgb2YgcHVibGljYXRpb25zIGZvciBwb3J0CisgKiBAcHViX2NvdW50OiB0b3RhbCAjIG9mIHB1YmxpY2F0aW9ucyBwb3J0IGhhcyBtYWRlIGR1cmluZyBpdHMgbGlmZXRpbWUKKyAqIEBtYXhfcGt0OiBtYXhpbXVtIHBhY2tldCBzaXplICJoaW50IiB1c2VkIHdoZW4gYnVpbGRpbmcgbWVzc2FnZXMgc2VudCBieSBwb3J0CisgKiBAcHJvYmluZ19zdGF0ZToKKyAqIEBwcm9iaW5nX2ludGVydmFsOgorICogQGxhc3RfaW5fc2Vxbm86CisgKiBAdGltZXJfcmVmOgorICogQHN1YnNjcmlwdGlvbjogIm5vZGUgZG93biIgc3Vic2NyaXB0aW9uIHVzZWQgdG8gdGVybWluYXRlIGZhaWxlZCBjb25uZWN0aW9ucworICovCisKK3N0cnVjdCBwb3J0IHsKKwlzdHJ1Y3QgdGlwY19wb3J0IHB1Ymw7CisJc3RydWN0IGxpc3RfaGVhZCBwb3J0X2xpc3Q7CisJdTMyICgqZGlzcGF0Y2hlcikoc3RydWN0IHRpcGNfcG9ydCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKKwl2b2lkICgqd2FrZXVwKShzdHJ1Y3QgdGlwY19wb3J0ICopOworCXN0cnVjdCB1c2VyX3BvcnQgKnVzZXJfcG9ydDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHdhaXRfbGlzdDsKKwlzdHJ1Y3QgbGluayAqY29uZ2VzdGVkX2xpbms7CisJdTMyIHdhaXRpbmdfcGt0czsKKwl1MzIgc2VudDsKKwl1MzIgYWNrZWQ7CisJc3RydWN0IGxpc3RfaGVhZCBwdWJsaWNhdGlvbnM7CisJdTMyIHB1Yl9jb3VudDsKKwl1MzIgbWF4X3BrdDsKKwl1MzIgcHJvYmluZ19zdGF0ZTsKKwl1MzIgcHJvYmluZ19pbnRlcnZhbDsKKwl1MzIgbGFzdF9pbl9zZXFubzsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwlzdHJ1Y3Qgbm9kZV9zdWJzY3Igc3Vic2NyaXB0aW9uOworfTsKKworZXh0ZXJuIHNwaW5sb2NrX3QgdGlwY19wb3J0X2xpc3RfbG9jazsKK3N0cnVjdCBwb3J0X2xpc3Q7CisKK2ludCB0aXBjX3BvcnRfcmVjdl9zZWN0aW9ucyhzdHJ1Y3QgcG9ydCAqcF9wdHIsIHUzMiBudW1fc2VjdCwgCisJCQkgICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCk7CitpbnQgdGlwY19wb3J0X3JlamVjdF9zZWN0aW9ucyhzdHJ1Y3QgcG9ydCAqcF9wdHIsIHN0cnVjdCB0aXBjX21zZyAqaGRyLAorCQkJICAgICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCwgdTMyIG51bV9zZWN0LAorCQkJICAgICAgaW50IGVycik7CitzdHJ1Y3Qgc2tfYnVmZiAqdGlwY19wb3J0X2dldF9wb3J0cyh2b2lkKTsKK3N0cnVjdCBza19idWZmICpwb3J0X3Nob3dfc3RhdHMoY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLCBpbnQgcmVxX3Rsdl9zcGFjZSk7Cit2b2lkIHRpcGNfcG9ydF9yZWN2X3Byb3RvX21zZyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKK3ZvaWQgdGlwY19wb3J0X3JlY3ZfbWNhc3Qoc3RydWN0IHNrX2J1ZmYgKmJ1Ziwgc3RydWN0IHBvcnRfbGlzdCAqZHApOwordm9pZCB0aXBjX3BvcnRfcmVpbml0KHZvaWQpOworCisvKioKKyAqIHRpcGNfcG9ydF9sb2NrIC0gbG9jayBwb3J0IGluc3RhbmNlIHJlZmVycmVkIHRvIGFuZCByZXR1cm4gaXRzIHBvaW50ZXIKKyAqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwb3J0ICp0aXBjX3BvcnRfbG9jayh1MzIgcmVmKQoreworCXJldHVybiAoc3RydWN0IHBvcnQgKil0aXBjX3JlZl9sb2NrKHJlZik7Cit9CisKKy8qKiAKKyAqIHRpcGNfcG9ydF91bmxvY2sgLSB1bmxvY2sgYSBwb3J0IGluc3RhbmNlCisgKiAKKyAqIENhbiB1c2UgcG9pbnRlciBpbnN0ZWFkIG9mIHRpcGNfcmVmX3VubG9jaygpIHNpbmNlIHBvcnQgaXMgYWxyZWFkeSBsb2NrZWQuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHRpcGNfcG9ydF91bmxvY2soc3RydWN0IHBvcnQgKnBfcHRyKQoreworCXNwaW5fdW5sb2NrX2JoKHBfcHRyLT5wdWJsLmxvY2spOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwb3J0KiB0aXBjX3BvcnRfZGVyZWYodTMyIHJlZikKK3sKKwlyZXR1cm4gKHN0cnVjdCBwb3J0ICopdGlwY19yZWZfZGVyZWYocmVmKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgdGlwY19wZWVyX3BvcnQoc3RydWN0IHBvcnQgKnBfcHRyKQoreworCXJldHVybiBtc2dfZGVzdHBvcnQoJnBfcHRyLT5wdWJsLnBoZHIpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiB0aXBjX3BlZXJfbm9kZShzdHJ1Y3QgcG9ydCAqcF9wdHIpCit7CisJcmV0dXJuIG1zZ19kZXN0bm9kZSgmcF9wdHItPnB1YmwucGhkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRpcGNfcG9ydF9jb25nZXN0ZWQoc3RydWN0IHBvcnQgKnBfcHRyKQoreworCXJldHVybigocF9wdHItPnNlbnQgLSBwX3B0ci0+YWNrZWQpID49IChUSVBDX0ZMT1dfQ09OVFJPTF9XSU4gKiAyKSk7Cit9CisKKy8qKiAKKyAqIHRpcGNfcG9ydF9yZWN2X21zZyAtIHJlY2VpdmUgbWVzc2FnZSBmcm9tIGxvd2VyIGxheWVyIGFuZCBkZWxpdmVyIHRvIHBvcnQgdXNlcgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHRpcGNfcG9ydF9yZWN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXN0cnVjdCBwb3J0ICpwX3B0cjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwl1MzIgZGVzdHBvcnQgPSBtc2dfZGVzdHBvcnQobXNnKTsKKwl1MzIgZHN6ID0gbXNnX2RhdGFfc3oobXNnKTsKKwl1MzIgZXJyOworCQorCS8qIGZvcndhcmQgdW5yZXNvbHZlZCBuYW1lZCBtZXNzYWdlICovCisJaWYgKHVubGlrZWx5KCFkZXN0cG9ydCkpIHsKKwkJdGlwY19uZXRfcm91dGVfbXNnKGJ1Zik7CisJCXJldHVybiBkc3o7CisJfQorCisJLyogdmFsaWRhdGUgZGVzdGluYXRpb24gJiBwYXNzIHRvIHBvcnQsIG90aGVyd2lzZSByZWplY3QgbWVzc2FnZSAqLworCXBfcHRyID0gdGlwY19wb3J0X2xvY2soZGVzdHBvcnQpOworCWlmIChsaWtlbHkocF9wdHIpKSB7CisJCWlmIChsaWtlbHkocF9wdHItPnB1YmwuY29ubmVjdGVkKSkgeworCQkJaWYgKCh1bmxpa2VseShtc2dfb3JpZ3BvcnQobXNnKSAhPSB0aXBjX3BlZXJfcG9ydChwX3B0cikpKSB8fAorCQkJICAgICh1bmxpa2VseShtc2dfb3JpZ25vZGUobXNnKSAhPSB0aXBjX3BlZXJfbm9kZShwX3B0cikpKSB8fAorCQkJICAgICh1bmxpa2VseSghbXNnX2Nvbm5lY3RlZChtc2cpKSkpIHsKKwkJCQllcnIgPSBUSVBDX0VSUl9OT19QT1JUOworCQkJCXRpcGNfcG9ydF91bmxvY2socF9wdHIpOworCQkJCWdvdG8gcmVqZWN0OworCQkJfQorCQl9CisJCWVyciA9IHBfcHRyLT5kaXNwYXRjaGVyKCZwX3B0ci0+cHVibCwgYnVmKTsKKwkJdGlwY19wb3J0X3VubG9jayhwX3B0cik7CisJCWlmIChsaWtlbHkoIWVycikpCisJCQlyZXR1cm4gZHN6OworCX0gZWxzZSB7CisJCWVyciA9IFRJUENfRVJSX05PX1BPUlQ7CisJfQorcmVqZWN0OgorCWRiZygicG9ydC0+cmVqZWN0aW5nLCBlcnIgPSAleC4uXG4iLGVycik7CisJcmV0dXJuIHRpcGNfcmVqZWN0X21zZyhidWYsIGVycik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvcmVmLmMgYi9uZXQvdGlwYy9yZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTEzYzJkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvcmVmLmMKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBuZXQvdGlwYy9yZWYuYzogVElQQyBvYmplY3QgcmVnaXN0cnkgY29kZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAicmVmLmgiCisjaW5jbHVkZSAicG9ydC5oIgorI2luY2x1ZGUgInN1YnNjci5oIgorI2luY2x1ZGUgIm5hbWVfZGlzdHIuaCIKKyNpbmNsdWRlICJuYW1lX3RhYmxlLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiZGlzY292ZXIuaCIKKyNpbmNsdWRlICJiZWFyZXIuaCIKKyNpbmNsdWRlICJub2RlLmgiCisjaW5jbHVkZSAiYmNhc3QuaCIKKworLyoKKyAqIE9iamVjdCByZWZlcmVuY2UgdGFibGUgY29uc2lzdHMgb2YgMioqTiBlbnRyaWVzLgorICoKKyAqIEEgdXNlZCBlbnRyeSBoYXMgb2JqZWN0IHB0ciAhPSAwLCByZWZlcmVuY2UgPT0gWFhYWHxvd24gaW5kZXgKKyAqCQkJCSAgICAgKFhYWFggY2hhbmdlcyBlYWNoIHRpbWUgZW50cnkgaXMgYWNxdWlyZWQpIAorICogQSBmcmVlIGVudHJ5IGhhcyBvYmplY3QgcHRyID09IDAsIHJlZmVyZW5jZSA9PSBZWVlZfG5leHQgZnJlZSBpbmRleAorICoJCQkJICAgICAoWVlZWSBpcyBvbmUgbW9yZSB0aGFuIGxhc3QgdXNlZCBYWFhYKQorICoKKyAqIEZyZWUgbGlzdCBpcyBpbml0aWFsbHkgY2hhaW5lZCBmcm9tIGVudHJ5ICgyKipOKS0xIHRvIGVudHJ5IDEuIAorICogRW50cnkgMCBpcyBub3QgdXNlZCB0byBhbGxvdyBpbmRleCAwIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgdGhlIGZyZWUgbGlzdC4KKyAqCisgKiBOb3RlOiBBbnkgYWNjaWRlbnRhbCByZWZlcmVuY2Ugb2YgdGhlIGZvcm0gWFhYWHwwLS0wIHdvbid0IG1hdGNoIGVudHJ5IDAKKyAqIGJlY2F1c2UgZW50cnkgMCdzIHJlZmVyZW5jZSBmaWVsZCBoYXMgdGhlIGZvcm0gWFhYWHwxLS0xLgorICovCisKK3N0cnVjdCByZWZfdGFibGUgdGlwY19yZWZfdGFibGUgPSB7IDAgfTsKKworc3RhdGljIHJ3bG9ja190IHJlZl90YWJsZV9sb2NrID0gUldfTE9DS19VTkxPQ0tFRDsKKworLyoqCisgKiB0aXBjX3JlZl90YWJsZV9pbml0IC0gY3JlYXRlIHJlZmVyZW5jZSB0YWJsZSBmb3Igb2JqZWN0cworICovCisKK2ludCB0aXBjX3JlZl90YWJsZV9pbml0KHUzMiByZXF1ZXN0ZWRfc2l6ZSwgdTMyIHN0YXJ0KQoreworCXN0cnVjdCByZWZlcmVuY2UgKnRhYmxlOworCXUzMiBzeiA9IDEgPDwgNDsKKwl1MzIgaW5kZXhfbWFzazsKKwlpbnQgaTsKKworCXdoaWxlIChzeiA8IHJlcXVlc3RlZF9zaXplKSB7CisJCXN6IDw8PSAxOworCX0KKwl0YWJsZSA9IChzdHJ1Y3QgcmVmZXJlbmNlICopdm1hbGxvYyhzeiAqIHNpemVvZihzdHJ1Y3QgcmVmZXJlbmNlKSk7CisJaWYgKHRhYmxlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJd3JpdGVfbG9ja19iaCgmcmVmX3RhYmxlX2xvY2spOworCWluZGV4X21hc2sgPSBzeiAtIDE7CisJZm9yIChpID0gc3ogLSAxOyBpID49IDA7IGktLSkgeworCQl0YWJsZVtpXS5vYmplY3QgPSAwOworCQl0YWJsZVtpXS5sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCQl0YWJsZVtpXS5kYXRhLm5leHRfcGx1c191cHBlciA9IChzdGFydCAmIH5pbmRleF9tYXNrKSArIGkgLSAxOworCX0KKwl0aXBjX3JlZl90YWJsZS5lbnRyaWVzID0gdGFibGU7CisJdGlwY19yZWZfdGFibGUuaW5kZXhfbWFzayA9IGluZGV4X21hc2s7CisJdGlwY19yZWZfdGFibGUuZmlyc3RfZnJlZSA9IHN6IC0gMTsKKwl0aXBjX3JlZl90YWJsZS5sYXN0X2ZyZWUgPSAxOworCXdyaXRlX3VubG9ja19iaCgmcmVmX3RhYmxlX2xvY2spOworCXJldHVybiBUSVBDX09LOworfQorCisvKioKKyAqIHRpcGNfcmVmX3RhYmxlX3N0b3AgLSBkZXN0cm95IHJlZmVyZW5jZSB0YWJsZSBmb3Igb2JqZWN0cworICovCisKK3ZvaWQgdGlwY19yZWZfdGFibGVfc3RvcCh2b2lkKQoreworCWlmICghdGlwY19yZWZfdGFibGUuZW50cmllcykKKwkJcmV0dXJuOworCisJdmZyZWUodGlwY19yZWZfdGFibGUuZW50cmllcyk7CisJdGlwY19yZWZfdGFibGUuZW50cmllcyA9IDA7Cit9CisKKy8qKgorICogdGlwY19yZWZfYWNxdWlyZSAtIGNyZWF0ZSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0CisgKiAKKyAqIFJldHVybiBhIHVuaXF1ZSByZWZlcmVuY2UgdmFsdWUgd2hpY2ggY2FuIGJlIHRyYW5zbGF0ZWQgYmFjayB0byB0aGUgcG9pbnRlcgorICogJ29iamVjdCcgYXQgYSBsYXRlciB0aW1lLiAgQWxzbywgcGFzcyBiYWNrIGEgcG9pbnRlciB0byB0aGUgbG9jayBwcm90ZWN0aW5nIAorICogdGhlIG9iamVjdCwgYnV0IHdpdGhvdXQgbG9ja2luZyBpdC4KKyAqLworCit1MzIgdGlwY19yZWZfYWNxdWlyZSh2b2lkICpvYmplY3QsIHNwaW5sb2NrX3QgKipsb2NrKQoreworCXN0cnVjdCByZWZlcmVuY2UgKmVudHJ5OworCXUzMiBpbmRleDsKKwl1MzIgaW5kZXhfbWFzazsKKwl1MzIgbmV4dF9wbHVzX3VwcGVyOworCXUzMiByZWZlcmVuY2UgPSAwOworCisJYXNzZXJ0KHRpcGNfcmVmX3RhYmxlLmVudHJpZXMgJiYgb2JqZWN0KTsKKworCXdyaXRlX2xvY2tfYmgoJnJlZl90YWJsZV9sb2NrKTsKKwlpZiAodGlwY19yZWZfdGFibGUuZmlyc3RfZnJlZSkgeworCQlpbmRleCA9IHRpcGNfcmVmX3RhYmxlLmZpcnN0X2ZyZWU7CisJCWVudHJ5ID0gJih0aXBjX3JlZl90YWJsZS5lbnRyaWVzW2luZGV4XSk7CisJCWluZGV4X21hc2sgPSB0aXBjX3JlZl90YWJsZS5pbmRleF9tYXNrOworCQkvKiB0YWtlIGxvY2sgaW4gY2FzZSBhIHByZXZpb3VzIHVzZXIgb2YgZW50cnkgc3RpbGwgaG9sZHMgaXQgKi8gCisJCXNwaW5fbG9ja19iaCgmZW50cnktPmxvY2spOyAgCisJCW5leHRfcGx1c191cHBlciA9IGVudHJ5LT5kYXRhLm5leHRfcGx1c191cHBlcjsKKwkJdGlwY19yZWZfdGFibGUuZmlyc3RfZnJlZSA9IG5leHRfcGx1c191cHBlciAmIGluZGV4X21hc2s7CisJCXJlZmVyZW5jZSA9IChuZXh0X3BsdXNfdXBwZXIgJiB+aW5kZXhfbWFzaykgKyBpbmRleDsKKwkJZW50cnktPmRhdGEucmVmZXJlbmNlID0gcmVmZXJlbmNlOworCQllbnRyeS0+b2JqZWN0ID0gb2JqZWN0OworICAgICAgICAgICAgICAgIGlmIChsb2NrICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAqbG9jayA9ICZlbnRyeS0+bG9jazsKKwkJc3Bpbl91bmxvY2tfYmgoJmVudHJ5LT5sb2NrKTsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZyZWZfdGFibGVfbG9jayk7CisJcmV0dXJuIHJlZmVyZW5jZTsKK30KKworLyoqCisgKiB0aXBjX3JlZl9kaXNjYXJkIC0gaW52YWxpZGF0ZSByZWZlcmVuY2VzIHRvIGFuIG9iamVjdAorICogCisgKiBEaXNhbGxvdyBmdXR1cmUgcmVmZXJlbmNlcyB0byBhbiBvYmplY3QgYW5kIGZyZWUgdXAgdGhlIGVudHJ5IGZvciByZS11c2UuCisgKiBOb3RlOiBUaGUgZW50cnkncyBzcGluX2xvY2sgbWF5IHN0aWxsIGJlIGJ1c3kgYWZ0ZXIgZGlzY2FyZAorICovCisKK3ZvaWQgdGlwY19yZWZfZGlzY2FyZCh1MzIgcmVmKQoreworCXN0cnVjdCByZWZlcmVuY2UgKmVudHJ5OworCXUzMiBpbmRleDsgCisJdTMyIGluZGV4X21hc2s7CisKKwlhc3NlcnQodGlwY19yZWZfdGFibGUuZW50cmllcyk7CisJYXNzZXJ0KHJlZiAhPSAwKTsKKworCXdyaXRlX2xvY2tfYmgoJnJlZl90YWJsZV9sb2NrKTsKKwlpbmRleF9tYXNrID0gdGlwY19yZWZfdGFibGUuaW5kZXhfbWFzazsKKwlpbmRleCA9IHJlZiAmIGluZGV4X21hc2s7CisJZW50cnkgPSAmKHRpcGNfcmVmX3RhYmxlLmVudHJpZXNbaW5kZXhdKTsKKwlhc3NlcnQoZW50cnktPm9iamVjdCAhPSAwKTsKKwlhc3NlcnQoZW50cnktPmRhdGEucmVmZXJlbmNlID09IHJlZik7CisKKwkvKiBtYXJrIGVudHJ5IGFzIHVudXNlZCAqLworCWVudHJ5LT5vYmplY3QgPSAwOworCWlmICh0aXBjX3JlZl90YWJsZS5maXJzdF9mcmVlID09IDApCisJCXRpcGNfcmVmX3RhYmxlLmZpcnN0X2ZyZWUgPSBpbmRleDsKKwllbHNlCisJCS8qIG5leHRfcGx1c191cHBlciBpcyBhbHdheXMgWFhYWHwwLS0wIGZvciBsYXN0IGZyZWUgZW50cnkgKi8KKwkJdGlwY19yZWZfdGFibGUuZW50cmllc1t0aXBjX3JlZl90YWJsZS5sYXN0X2ZyZWVdLmRhdGEubmV4dF9wbHVzX3VwcGVyIAorCQkJfD0gaW5kZXg7CisJdGlwY19yZWZfdGFibGUubGFzdF9mcmVlID0gaW5kZXg7CisKKwkvKiBpbmNyZW1lbnQgdXBwZXIgYml0cyBvZiBlbnRyeSB0byBpbnZhbGlkYXRlIHN1YnNlcXVlbnQgcmVmZXJlbmNlcyAqLworCWVudHJ5LT5kYXRhLm5leHRfcGx1c191cHBlciA9IChyZWYgJiB+aW5kZXhfbWFzaykgKyAoaW5kZXhfbWFzayArIDEpOworCXdyaXRlX3VubG9ja19iaCgmcmVmX3RhYmxlX2xvY2spOworfQorCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9yZWYuaCBiL25ldC90aXBjL3JlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOGY5ZjQwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvcmVmLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBuZXQvdGlwYy9yZWYuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIG9iamVjdCByZWdpc3RyeSBjb2RlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMTk5MS0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfUkVGX0gKKyNkZWZpbmUgX1RJUENfUkVGX0gKKworLyoqCisgKiBzdHJ1Y3QgcmVmZXJlbmNlIC0gVElQQyBvYmplY3QgcmVmZXJlbmNlIGVudHJ5CisgKiBAb2JqZWN0OiBwb2ludGVyIHRvIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggcmVmZXJlbmNlIGVudHJ5CisgKiBAbG9jazogc3BpbmxvY2sgY29udHJvbGxpbmcgYWNjZXNzIHRvIG9iamVjdAorICogQGRhdGE6IHJlZmVyZW5jZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggb2JqZWN0IChvciBsaW5rIHRvIG5leHQgdW51c2VkIGVudHJ5KQorICovCisgCitzdHJ1Y3QgcmVmZXJlbmNlIHsKKwl2b2lkICpvYmplY3Q7CisJc3BpbmxvY2tfdCBsb2NrOworCXVuaW9uIHsKKwkJdTMyIG5leHRfcGx1c191cHBlcjsKKwkJdTMyIHJlZmVyZW5jZTsKKwl9IGRhdGE7Cit9OworCisvKioKKyAqIHN0cnVjdCB0aXBjX3JlZl90YWJsZSAtIHRhYmxlIG9mIFRJUEMgb2JqZWN0IHJlZmVyZW5jZSBlbnRyaWVzCisgKiBAZW50cmllczogcG9pbnRlciB0byBhcnJheSBvZiByZWZlcmVuY2UgZW50cmllcworICogQGluZGV4X21hc2s6IGJpdG1hc2sgZm9yIGFycmF5IGluZGV4IHBvcnRpb24gb2YgcmVmZXJlbmNlIHZhbHVlcworICogQGZpcnN0X2ZyZWU6IGFycmF5IGluZGV4IG9mIGZpcnN0IHVudXNlZCBvYmplY3QgcmVmZXJlbmNlIGVudHJ5CisgKiBAbGFzdF9mcmVlOiBhcnJheSBpbmRleCBvZiBsYXN0IHVudXNlZCBvYmplY3QgcmVmZXJlbmNlIGVudHJ5CisgKi8KKworc3RydWN0IHJlZl90YWJsZSB7CisJc3RydWN0IHJlZmVyZW5jZSAqZW50cmllczsKKwl1MzIgaW5kZXhfbWFzazsKKwl1MzIgZmlyc3RfZnJlZTsKKwl1MzIgbGFzdF9mcmVlOworfTsKKworZXh0ZXJuIHN0cnVjdCByZWZfdGFibGUgdGlwY19yZWZfdGFibGU7CisKK2ludCB0aXBjX3JlZl90YWJsZV9pbml0KHUzMiByZXF1ZXN0ZWRfc2l6ZSwgdTMyIHN0YXJ0KTsKK3ZvaWQgdGlwY19yZWZfdGFibGVfc3RvcCh2b2lkKTsKKwordTMyIHRpcGNfcmVmX2FjcXVpcmUodm9pZCAqb2JqZWN0LCBzcGlubG9ja190ICoqbG9jayk7Cit2b2lkIHRpcGNfcmVmX2Rpc2NhcmQodTMyIHJlZik7CisKKworLyoqCisgKiB0aXBjX3JlZl9sb2NrIC0gbG9jayByZWZlcmVuY2VkIG9iamVjdCBhbmQgcmV0dXJuIHBvaW50ZXIgdG8gaXQKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgKnRpcGNfcmVmX2xvY2sodTMyIHJlZikKK3sKKwlpZiAobGlrZWx5KHRpcGNfcmVmX3RhYmxlLmVudHJpZXMpKSB7CisJCXN0cnVjdCByZWZlcmVuY2UgKnIgPQorCQkJJnRpcGNfcmVmX3RhYmxlLmVudHJpZXNbcmVmICYgdGlwY19yZWZfdGFibGUuaW5kZXhfbWFza107CisKKwkJc3Bpbl9sb2NrX2JoKCZyLT5sb2NrKTsKKwkJaWYgKGxpa2VseShyLT5kYXRhLnJlZmVyZW5jZSA9PSByZWYpKQorCQkJcmV0dXJuIHItPm9iamVjdDsKKwkJc3Bpbl91bmxvY2tfYmgoJnItPmxvY2spOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB0aXBjX3JlZl91bmxvY2sgLSB1bmxvY2sgcmVmZXJlbmNlZCBvYmplY3QgCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHRpcGNfcmVmX3VubG9jayh1MzIgcmVmKQoreworCWlmIChsaWtlbHkodGlwY19yZWZfdGFibGUuZW50cmllcykpIHsKKwkJc3RydWN0IHJlZmVyZW5jZSAqciA9CisJCQkmdGlwY19yZWZfdGFibGUuZW50cmllc1tyZWYgJiB0aXBjX3JlZl90YWJsZS5pbmRleF9tYXNrXTsKKworCQlpZiAobGlrZWx5KHItPmRhdGEucmVmZXJlbmNlID09IHJlZikpCisJCQlzcGluX3VubG9ja19iaCgmci0+bG9jayk7CisJCWVsc2UKKwkJCWVycigidGlwY19yZWZfdW5sb2NrKCkgaW52b2tlZCB1c2luZyBvYnNvbGV0ZSByZWZlcmVuY2VcbiIpOworCX0KK30KKworLyoqCisgKiB0aXBjX3JlZl9kZXJlZiAtIHJldHVybiBwb2ludGVyIHJlZmVyZW5jZWQgb2JqZWN0ICh3aXRob3V0IGxvY2tpbmcgaXQpCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkICp0aXBjX3JlZl9kZXJlZih1MzIgcmVmKQoreworCWlmIChsaWtlbHkodGlwY19yZWZfdGFibGUuZW50cmllcykpIHsKKwkJc3RydWN0IHJlZmVyZW5jZSAqciA9IAorCQkJJnRpcGNfcmVmX3RhYmxlLmVudHJpZXNbcmVmICYgdGlwY19yZWZfdGFibGUuaW5kZXhfbWFza107CisKKwkJaWYgKGxpa2VseShyLT5kYXRhLnJlZmVyZW5jZSA9PSByZWYpKQorCQkJcmV0dXJuIHItPm9iamVjdDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvc29ja2V0LmMgYi9uZXQvdGlwYy9zb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzI1M2JmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvc29ja2V0LmMKQEAgLTAsMCArMSwxNzI0IEBACisvKgorICogbmV0L3RpcGMvc29ja2V0LmM6IFRJUEMgc29ja2V0IEFQSQorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgPGxpbnV4L3RpcGMuaD4KKyNpbmNsdWRlIDxsaW51eC90aXBjX2NvbmZpZy5oPgorI2luY2x1ZGUgPG5ldC90aXBjL3RpcGNfbXNnLmg+CisjaW5jbHVkZSA8bmV0L3RpcGMvdGlwY19wb3J0Lmg+CisKKyNpbmNsdWRlICJjb3JlLmgiCisKKyNkZWZpbmUgU1NfTElTVEVOSU5HCS0xCS8qIHNvY2tldCBpcyBsaXN0ZW5pbmcgKi8KKyNkZWZpbmUgU1NfUkVBRFkJLTIJLyogc29ja2V0IGlzIGNvbm5lY3Rpb25sZXNzICovCisKKyNkZWZpbmUgT1ZFUkxPQURfTElNSVRfQkFTRSAgICA1MDAwCisKK3N0cnVjdCB0aXBjX3NvY2sgeworCXN0cnVjdCBzb2NrIHNrOworCXN0cnVjdCB0aXBjX3BvcnQgKnA7CisJc3RydWN0IHNlbWFwaG9yZSBzZW07Cit9OworCisjZGVmaW5lIHRpcGNfc2soc2spICgoc3RydWN0IHRpcGNfc29jayopc2spCisKK3N0YXRpYyB1MzIgZGlzcGF0Y2goc3RydWN0IHRpcGNfcG9ydCAqdHBvcnQsIHN0cnVjdCBza19idWZmICpidWYpOworc3RhdGljIHZvaWQgd2FrZXVwZGlzcGF0Y2goc3RydWN0IHRpcGNfcG9ydCAqdHBvcnQpOworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBwYWNrZXRfb3BzOworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgc3RyZWFtX29wczsKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIG1zZ19vcHM7CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG8gdGlwY19wcm90bzsKKworc3RhdGljIGludCBzb2NrZXRzX2VuYWJsZWQgPSAwOworCitzdGF0aWMgYXRvbWljX3QgdGlwY19xdWV1ZV9zaXplID0gQVRPTUlDX0lOSVQoMCk7CisKKworLyogCisgKiBzb2NrX2xvY2soKTogTG9jayBhIHBvcnQvc29ja2V0IHBhaXIuIGxvY2tfc29jaygpIGNhbiAKKyAqIG5vdCBiZSB1c2VkIGhlcmUsIHNpbmNlIHRoZSBzYW1lIGxvY2sgbXVzdCBwcm90ZWN0IHBvcnRzIAorICogd2l0aCBub24tc29ja2V0IGludGVyZmFjZXMuCisgKiBTZWUgbmV0LmMgZm9yIGRlc2NyaXB0aW9uIG9mIGxvY2tpbmcgcG9saWN5LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc29ja19sb2NrKHN0cnVjdCB0aXBjX3NvY2sqIHRzb2NrKQoreworICAgICAgICBzcGluX2xvY2tfYmgodHNvY2stPnAtPmxvY2spOyAgICAgICAKK30KKworLyogCisgKiBzb2NrX3VubG9jaygpOiBVbmxvY2sgYSBwb3J0L3NvY2tldCBwYWlyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzb2NrX3VubG9jayhzdHJ1Y3QgdGlwY19zb2NrKiB0c29jaykKK3sKKyAgICAgICAgc3Bpbl91bmxvY2tfYmgodHNvY2stPnAtPmxvY2spOworfQorCisvKioKKyAqIHBvbGxtYXNrIC0gZGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNldCBvZiBwb2xsKCkgZXZlbnRzIGZvciBhIHNvY2tldAorICogQHNvY2s6IHNvY2tldCBzdHJ1Y3R1cmUKKyAqIAorICogVElQQyBzZXRzIHRoZSByZXR1cm5lZCBldmVudHMgYXMgZm9sbG93czoKKyAqIGEpIFBPTExSRE5PUk0gYW5kIFBPTExJTiBhcmUgc2V0IGlmIHRoZSBzb2NrZXQncyByZWNlaXZlIHF1ZXVlIGlzIG5vbi1lbXB0eQorICogICAgb3IgaWYgYSBjb25uZWN0aW9uLW9yaWVudGVkIHNvY2tldCBpcyBkb2VzIG5vdCBoYXZlIGFuIGFjdGl2ZSBjb25uZWN0aW9uCisgKiAgICAoaS5lLiBhIHJlYWQgb3BlcmF0aW9uIHdpbGwgbm90IGJsb2NrKS4KKyAqIGIpIFBPTExPVVQgaXMgc2V0IGV4Y2VwdCB3aGVuIGEgc29ja2V0J3MgY29ubmVjdGlvbiBoYXMgYmVlbiB0ZXJtaW5hdGVkCisgKiAgICAoaS5lLiBhIHdyaXRlIG9wZXJhdGlvbiB3aWxsIG5vdCBibG9jaykuCisgKiBjKSBQT0xMSFVQIGlzIHNldCB3aGVuIGEgc29ja2V0J3MgY29ubmVjdGlvbiBoYXMgYmVlbiB0ZXJtaW5hdGVkLgorICoKKyAqIElNUE9SVEFOVDogVGhlIGZhY3QgdGhhdCBhIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9uIHdpbGwgbm90IGJsb2NrIGRvZXMgTk9UCisgKiBpbXBseSB0aGF0IHRoZSBvcGVyYXRpb24gd2lsbCBzdWNjZWVkIQorICogCisgKiBSZXR1cm5zIHBvbGxtYXNrIHZhbHVlCisgKi8KKworc3RhdGljIGlubGluZSB1MzIgcG9sbG1hc2soc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwl1MzIgbWFzazsKKworCWlmICgoc2tiX3F1ZXVlX2xlbigmc29jay0+c2stPnNrX3JlY2VpdmVfcXVldWUpICE9IDApIHx8CisJICAgIChzb2NrLT5zdGF0ZSA9PSBTU19VTkNPTk5FQ1RFRCkgfHwKKwkgICAgKHNvY2stPnN0YXRlID09IFNTX0RJU0NPTk5FQ1RJTkcpKQorCQltYXNrID0gKFBPTExSRE5PUk0gfCBQT0xMSU4pOworCWVsc2UKKwkJbWFzayA9IDA7CisKKwlpZiAoc29jay0+c3RhdGUgPT0gU1NfRElTQ09OTkVDVElORykgCisJCW1hc2sgfD0gUE9MTEhVUDsKKwllbHNlCisJCW1hc2sgfD0gUE9MTE9VVDsKKworCXJldHVybiBtYXNrOworfQorCisKKy8qKgorICogYWR2YW5jZV9xdWV1ZSAtIGRpc2NhcmQgZmlyc3QgYnVmZmVyIGluIHF1ZXVlCisgKiBAdHNvY2s6IFRJUEMgc29ja2V0CisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGFkdmFuY2VfcXVldWUoc3RydWN0IHRpcGNfc29jayAqdHNvY2spCit7CisgICAgICAgIHNvY2tfbG9jayh0c29jayk7CisJYnVmX2Rpc2NhcmQoc2tiX2RlcXVldWUoJnRzb2NrLT5zay5za19yZWNlaXZlX3F1ZXVlKSk7CisgICAgICAgIHNvY2tfdW5sb2NrKHRzb2NrKTsKKwlhdG9taWNfZGVjKCZ0aXBjX3F1ZXVlX3NpemUpOworfQorCisvKioKKyAqIHRpcGNfY3JlYXRlIC0gY3JlYXRlIGEgVElQQyBzb2NrZXQKKyAqIEBzb2NrOiBwcmUtYWxsb2NhdGVkIHNvY2tldCBzdHJ1Y3R1cmUKKyAqIEBwcm90b2NvbDogcHJvdG9jb2wgaW5kaWNhdG9yIChtdXN0IGJlIDApCisgKiAKKyAqIFRoaXMgcm91dGluZSBjcmVhdGVzIGFuZCBhdHRhY2hlcyBhICdzdHJ1Y3Qgc29jaycgdG8gdGhlICdzdHJ1Y3Qgc29ja2V0JywKKyAqIHRoZW4gY3JlYXRlIGFuZCBhdHRhY2hlcyBhIFRJUEMgcG9ydCB0byB0aGUgJ3N0cnVjdCBzb2NrJyBwYXJ0LgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCB0aXBjX2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG9jb2wpCit7CisJc3RydWN0IHRpcGNfc29jayAqdHNvY2s7CisJc3RydWN0IHRpcGNfcG9ydCAqcG9ydDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisgICAgICAgIHUzMiByZWY7CisKKwlpZiAoKHNvY2stPnR5cGUgIT0gU09DS19TVFJFQU0pICYmIAorCSAgICAoc29jay0+dHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCkgJiYKKwkgICAgKHNvY2stPnR5cGUgIT0gU09DS19ER1JBTSkgJiYKKwkgICAgKHNvY2stPnR5cGUgIT0gU09DS19SRE0pKQorCQlyZXR1cm4gLUVQUk9UT1RZUEU7CisKKwlpZiAodW5saWtlbHkocHJvdG9jb2wgIT0gMCkpCisJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCisJcmVmID0gdGlwY19jcmVhdGVwb3J0X3JhdygwLCAmZGlzcGF0Y2gsICZ3YWtldXBkaXNwYXRjaCwgVElQQ19MT1dfSU1QT1JUQU5DRSk7CisJaWYgKHVubGlrZWx5KCFyZWYpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisKKwlzd2l0Y2ggKHNvY2stPnR5cGUpIHsKKwljYXNlIFNPQ0tfU1RSRUFNOgorCQlzb2NrLT5vcHMgPSAmc3RyZWFtX29wczsKKwkJYnJlYWs7CisJY2FzZSBTT0NLX1NFUVBBQ0tFVDoKKwkJc29jay0+b3BzID0gJnBhY2tldF9vcHM7CisJCWJyZWFrOworCWNhc2UgU09DS19ER1JBTToKKwkJdGlwY19zZXRfcG9ydHVucmVsaWFibGUocmVmLCAxKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBTT0NLX1JETToKKwkJdGlwY19zZXRfcG9ydHVucmV0dXJuYWJsZShyZWYsIDEpOworCQlzb2NrLT5vcHMgPSAmbXNnX29wczsKKwkJc29jay0+c3RhdGUgPSBTU19SRUFEWTsKKwkJYnJlYWs7CisJfQorCisJc2sgPSBza19hbGxvYyhBRl9USVBDLCBHRlBfS0VSTkVMLCAmdGlwY19wcm90bywgMSk7CisJaWYgKCFzaykgeworCQl0aXBjX2RlbGV0ZXBvcnQocmVmKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc29ja19pbml0X2RhdGEoc29jaywgc2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoc2stPnNrX3NsZWVwKTsKKwlzay0+c2tfcmN2dGltZW8gPSA4ICogSFo7ICAgLyogZGVmYXVsdCBjb25uZWN0IHRpbWVvdXQgPSA4cyAqLworCisJdHNvY2sgPSB0aXBjX3NrKHNrKTsKKwlwb3J0ID0gdGlwY19nZXRfcG9ydChyZWYpOworCisJdHNvY2stPnAgPSBwb3J0OworCXBvcnQtPnVzcl9oYW5kbGUgPSB0c29jazsKKworCWluaXRfTVVURVgoJnRzb2NrLT5zZW0pOworCisJZGJnKCJzb2NrX2NyZWF0ZTogJXhcbiIsdHNvY2spOworCisJYXRvbWljX2luYygmdGlwY191c2VyX2NvdW50KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHJlbGVhc2UgLSBkZXN0cm95IGEgVElQQyBzb2NrZXQKKyAqIEBzb2NrOiBzb2NrZXQgdG8gZGVzdHJveQorICoKKyAqIFRoaXMgcm91dGluZSBjbGVhbnMgdXAgYW55IG1lc3NhZ2VzIHRoYXQgYXJlIHN0aWxsIHF1ZXVlZCBvbiB0aGUgc29ja2V0LgorICogRm9yIERHUkFNIGFuZCBSRE0gc29ja2V0IHR5cGVzLCBhbGwgcXVldWVkIG1lc3NhZ2VzIGFyZSByZWplY3RlZC4KKyAqIEZvciBTRVFQQUNLRVQgYW5kIFNUUkVBTSBzb2NrZXQgdHlwZXMsIHRoZSBmaXJzdCBtZXNzYWdlIGlzIHJlamVjdGVkCisgKiBhbmQgYW55IG90aGVycyBhcmUgZGlzY2FyZGVkLiAgKElmIHRoZSBmaXJzdCBtZXNzYWdlIG9uIGEgU1RSRUFNIHNvY2tldAorICogaXMgcGFydGlhbGx5LXJlYWQsIGl0IGlzIGRpc2NhcmRlZCBhbmQgdGhlIG5leHQgb25lIGlzIHJlamVjdGVkIGluc3RlYWQuKQorICogCisgKiBOT1RFOiBSZWplY3RlZCBtZXNzYWdlcyBhcmUgbm90IG5lY2Vzc2FyaWx5IHJldHVybmVkIHRvIHRoZSBzZW5kZXIhICBUaGV5CisgKiBhcmUgcmV0dXJuZWQgb3IgZGlzY2FyZGVkIGFjY29yZGluZyB0byB0aGUgImRlc3RpbmF0aW9uIGRyb3BwYWJsZSIgc2V0dGluZworICogc3BlY2lmaWVkIGZvciB0aGUgbWVzc2FnZSBieSB0aGUgc2VuZGVyLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvdGhlcndpc2UKKyAqLworCitzdGF0aWMgaW50IHJlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3QgdGlwY19zb2NrICp0c29jayA9IHRpcGNfc2soc29jay0+c2spOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCByZXMgPSBUSVBDX09LOworCXN0cnVjdCBza19idWZmICpidWY7CisKKyAgICAgICAgZGJnKCJzb2NrX2RlbGV0ZTogJXhcbiIsdHNvY2spOworCWlmICghdHNvY2spCisJCXJldHVybiAwOworCWRvd25faW50ZXJydXB0aWJsZSgmdHNvY2stPnNlbSk7CisJaWYgKCFzb2NrLT5zaykgeworCQl1cCgmdHNvY2stPnNlbSk7CisJCXJldHVybiAwOworCX0KKwkKKwkvKiBSZWplY3QgdW5yZWNlaXZlZCBtZXNzYWdlcywgdW5sZXNzIG5vIGxvbmdlciBjb25uZWN0ZWQgKi8KKworCXdoaWxlIChzb2NrLT5zdGF0ZSAhPSBTU19ESVNDT05ORUNUSU5HKSB7CisJCXNvY2tfbG9jayh0c29jayk7CisJCWJ1ZiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJCWlmICghYnVmKQorCQkJdHNvY2stPnAtPnVzcl9oYW5kbGUgPSAwOworCQlzb2NrX3VubG9jayh0c29jayk7CisJCWlmICghYnVmKQorCQkJYnJlYWs7CisJCWlmIChUSVBDX1NLQl9DQihidWYpLT5oYW5kbGUgIT0gbXNnX2RhdGEoYnVmX21zZyhidWYpKSkKKwkJCWJ1Zl9kaXNjYXJkKGJ1Zik7CisJCWVsc2UKKwkJCXRpcGNfcmVqZWN0X21zZyhidWYsIFRJUENfRVJSX05PX1BPUlQpOworCQlhdG9taWNfZGVjKCZ0aXBjX3F1ZXVlX3NpemUpOworCX0KKworCS8qIERlbGV0ZSBUSVBDIHBvcnQgKi8KKworCXJlcyA9IHRpcGNfZGVsZXRlcG9ydCh0c29jay0+cC0+cmVmKTsKKwlzb2NrLT5zayA9IE5VTEw7CisKKwkvKiBEaXNjYXJkIGFueSByZW1haW5pbmcgbWVzc2FnZXMgKi8KKworCXdoaWxlICgoYnVmID0gc2tiX2RlcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkpIHsKKwkJYnVmX2Rpc2NhcmQoYnVmKTsKKwkJYXRvbWljX2RlYygmdGlwY19xdWV1ZV9zaXplKTsKKwl9CisKKwl1cCgmdHNvY2stPnNlbSk7CisKKwlzb2NrX3B1dChzayk7CisKKyAgICAgICAgYXRvbWljX2RlYygmdGlwY191c2VyX2NvdW50KTsKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIGJpbmQgLSBhc3NvY2lhdGUgb3IgZGlzYXNzb2NhdGUgVElQQyBuYW1lKHMpIHdpdGggYSBzb2NrZXQKKyAqIEBzb2NrOiBzb2NrZXQgc3RydWN0dXJlCisgKiBAdWFkZHI6IHNvY2tldCBhZGRyZXNzIGRlc2NyaWJpbmcgbmFtZShzKSBhbmQgZGVzaXJlZCBvcGVyYXRpb24KKyAqIEB1YWRkcl9sZW46IHNpemUgb2Ygc29ja2V0IGFkZHJlc3MgZGF0YSBzdHJ1Y3R1cmUKKyAqIAorICogTmFtZSBhbmQgbmFtZSBzZXF1ZW5jZSBiaW5kaW5nIGlzIGluZGljYXRlZCB1c2luZyBhIHBvc2l0aXZlIHNjb3BlIHZhbHVlOworICogYSBuZWdhdGl2ZSBzY29wZSB2YWx1ZSB1bmJpbmRzIHRoZSBzcGVjaWZpZWQgbmFtZS4gIFNwZWNpZnlpbmcgbm8gbmFtZQorICogKGkuZS4gYSBzb2NrZXQgYWRkcmVzcyBsZW5ndGggb2YgMCkgdW5iaW5kcyBhbGwgbmFtZXMgZnJvbSB0aGUgc29ja2V0LgorICogCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb3RoZXJ3aXNlCisgKi8KKworc3RhdGljIGludCBiaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsIGludCB1YWRkcl9sZW4pCit7CisJc3RydWN0IHRpcGNfc29jayAqdHNvY2sgPSB0aXBjX3NrKHNvY2stPnNrKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqKXVhZGRyOworCWludCByZXM7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ0c29jay0+c2VtKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkKKwlpZiAodW5saWtlbHkoIXVhZGRyX2xlbikpIHsKKwkJcmVzID0gdGlwY193aXRoZHJhdyh0c29jay0+cC0+cmVmLCAwLCAwKTsKKwkJZ290byBleGl0OworCX0KKworCWlmICh1YWRkcl9sZW4gPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3RpcGMpKSB7CisJCXJlcyA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoYWRkci0+ZmFtaWx5ICE9IEFGX1RJUEMpIHsKKwkJcmVzID0gLUVBRk5PU1VQUE9SVDsKKwkJZ290byBleGl0OworCX0KKwlpZiAoYWRkci0+YWRkcnR5cGUgPT0gVElQQ19BRERSX05BTUUpCisJCWFkZHItPmFkZHIubmFtZXNlcS51cHBlciA9IGFkZHItPmFkZHIubmFtZXNlcS5sb3dlcjsKKwllbHNlIGlmIChhZGRyLT5hZGRydHlwZSAhPSBUSVBDX0FERFJfTkFNRVNFUSkgeworCQlyZXMgPSAtRUFGTk9TVVBQT1JUOworCQlnb3RvIGV4aXQ7CisJfQorICAgICAgICAKKyAgICAgICAJaWYgKGFkZHItPnNjb3BlID4gMCkKKwkJcmVzID0gdGlwY19wdWJsaXNoKHRzb2NrLT5wLT5yZWYsIGFkZHItPnNjb3BlLAorCQkJCSAgICZhZGRyLT5hZGRyLm5hbWVzZXEpOworCWVsc2UKKwkJcmVzID0gdGlwY193aXRoZHJhdyh0c29jay0+cC0+cmVmLCAtYWRkci0+c2NvcGUsCisJCQkJICAgICZhZGRyLT5hZGRyLm5hbWVzZXEpOworZXhpdDoKKwl1cCgmdHNvY2stPnNlbSk7CisJcmV0dXJuIHJlczsKK30KKworLyoqIAorICogZ2V0X25hbWUgLSBnZXQgcG9ydCBJRCBvZiBzb2NrZXQgb3IgcGVlciBzb2NrZXQKKyAqIEBzb2NrOiBzb2NrZXQgc3RydWN0dXJlCisgKiBAdWFkZHI6IGFyZWEgZm9yIHJldHVybmVkIHNvY2tldCBhZGRyZXNzCisgKiBAdWFkZHJfbGVuOiBhcmVhIGZvciByZXR1cm5lZCBsZW5ndGggb2Ygc29ja2V0IGFkZHJlc3MKKyAqIEBwZWVyOiAwIHRvIG9idGFpbiBzb2NrZXQgbmFtZSwgMSB0byBvYnRhaW4gcGVlciBzb2NrZXQgbmFtZQorICogCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb3RoZXJ3aXNlCisgKi8KKworc3RhdGljIGludCBnZXRfbmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLCAKKwkJICAgIGludCAqdWFkZHJfbGVuLCBpbnQgcGVlcikKK3sKKwlzdHJ1Y3QgdGlwY19zb2NrICp0c29jayA9IHRpcGNfc2soc29jay0+c2spOworCXN0cnVjdCBzb2NrYWRkcl90aXBjICphZGRyID0gKHN0cnVjdCBzb2NrYWRkcl90aXBjICopdWFkZHI7CisJdTMyIHJlczsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnRzb2NrLT5zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJKnVhZGRyX2xlbiA9IHNpemVvZigqYWRkcik7CisJYWRkci0+YWRkcnR5cGUgPSBUSVBDX0FERFJfSUQ7CisJYWRkci0+ZmFtaWx5ID0gQUZfVElQQzsKKwlhZGRyLT5zY29wZSA9IDA7CisJaWYgKHBlZXIpCisJCXJlcyA9IHRpcGNfcGVlcih0c29jay0+cC0+cmVmLCAmYWRkci0+YWRkci5pZCk7CisJZWxzZQorCQlyZXMgPSB0aXBjX293bmlkZW50aXR5KHRzb2NrLT5wLT5yZWYsICZhZGRyLT5hZGRyLmlkKTsKKwlhZGRyLT5hZGRyLm5hbWUuZG9tYWluID0gMDsKKworCXVwKCZ0c29jay0+c2VtKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIHBvbGwgLSByZWFkIGFuZCBwb3NzaWJseSBibG9jayBvbiBwb2xsbWFzaworICogQGZpbGU6IGZpbGUgc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc29ja2V0CisgKiBAc29jazogc29ja2V0IGZvciB3aGljaCB0byBjYWxjdWxhdGUgdGhlIHBvbGwgYml0cworICogQHdhaXQ6ID8/PworICoKKyAqIFJldHVybnMgdGhlIHBvbGxtYXNrCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBwb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCAKKwkJCSBwb2xsX3RhYmxlICp3YWl0KQoreworCXBvbGxfd2FpdChmaWxlLCBzb2NrLT5zay0+c2tfc2xlZXAsIHdhaXQpOworCS8qIE5FRUQgTE9DSyBIRVJFPyAqLworCXJldHVybiBwb2xsbWFzayhzb2NrKTsKK30KKworLyoqIAorICogZGVzdF9uYW1lX2NoZWNrIC0gdmVyaWZ5IHVzZXIgaXMgcGVybWl0dGVkIHRvIHNlbmQgdG8gc3BlY2lmaWVkIHBvcnQgbmFtZQorICogQGRlc3Q6IGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqIEBtOiBkZXNjcmlwdG9yIGZvciBtZXNzYWdlIHRvIGJlIHNlbnQKKyAqIAorICogUHJldmVudHMgcmVzdHJpY3RlZCBjb25maWd1cmF0aW9uIGNvbW1hbmRzIGZyb20gYmVpbmcgaXNzdWVkIGJ5CisgKiB1bmF1dGhvcml6ZWQgdXNlcnMuCisgKiAKKyAqIFJldHVybnMgMCBpZiBwZXJtaXNzaW9uIGlzIGdyYW50ZWQsIG90aGVyd2lzZSBlcnJubworICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGRlc3RfbmFtZV9jaGVjayhzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqZGVzdCwgc3RydWN0IG1zZ2hkciAqbSkKK3sKKwlzdHJ1Y3QgdGlwY19jZmdfbXNnX2hkciBoZHI7CisKKyAgICAgICAgaWYgKGxpa2VseShkZXN0LT5hZGRyLm5hbWUubmFtZS50eXBlID49IFRJUENfUkVTRVJWRURfVFlQRVMpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAobGlrZWx5KGRlc3QtPmFkZHIubmFtZS5uYW1lLnR5cGUgPT0gVElQQ19UT1BfU1JWKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAobGlrZWx5KGRlc3QtPmFkZHIubmFtZS5uYW1lLnR5cGUgIT0gVElQQ19DRkdfU1JWKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVBQ0NFUzsKKworICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJmhkciwgbS0+bXNnX2lvdlswXS5pb3ZfYmFzZSwgc2l6ZW9mKGhkcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoKG50b2hzKGhkci50Y21fdHlwZSkgJiAweEMwMDApICYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisgICAgICAgIAorCXJldHVybiAwOworfQorCisvKioKKyAqIHNlbmRfbXNnIC0gc2VuZCBtZXNzYWdlIGluIGNvbm5lY3Rpb25sZXNzIG1hbm5lcgorICogQGlvY2I6ICh1bnVzZWQpCisgKiBAc29jazogc29ja2V0IHN0cnVjdHVyZQorICogQG06IG1lc3NhZ2UgdG8gc2VuZAorICogQHRvdGFsX2xlbjogKHVudXNlZCkKKyAqIAorICogTWVzc2FnZSBtdXN0IGhhdmUgYW4gZGVzdGluYXRpb24gc3BlY2lmaWVkIGV4cGxpY2l0bHkuCisgKiBVc2VkIGZvciBTT0NLX1JETSBhbmQgU09DS19ER1JBTSBtZXNzYWdlcywgCisgKiBhbmQgZm9yICdTWU4nIG1lc3NhZ2VzIG9uIFNPQ0tfU0VRUEFDS0VUIGFuZCBTT0NLX1NUUkVBTSBjb25uZWN0aW9ucy4KKyAqIChOb3RlOiAnU1lOKycgaXMgcHJvaGliaXRlZCBvbiBTT0NLX1NUUkVBTS4pCisgKiAKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBzZW50IG9uIHN1Y2Nlc3MsIG9yIGVycm5vIG90aGVyd2lzZQorICovCisKK3N0YXRpYyBpbnQgc2VuZF9tc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkgICAgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IHRvdGFsX2xlbikKK3sKKwlzdHJ1Y3QgdGlwY19zb2NrICp0c29jayA9IHRpcGNfc2soc29jay0+c2spOworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqZGVzdCA9IChzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqKW0tPm1zZ19uYW1lOworCXN0cnVjdCBza19idWZmICpidWY7CisJaW50IG5lZWRzX2Nvbm47CisJaW50IHJlcyA9IC1FSU5WQUw7CisKKwlpZiAodW5saWtlbHkoIWRlc3QpKQorCQlyZXR1cm4gLUVERVNUQUREUlJFUTsKKwlpZiAodW5saWtlbHkoZGVzdC0+ZmFtaWx5ICE9IEFGX1RJUEMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW5lZWRzX2Nvbm4gPSAoc29jay0+c3RhdGUgIT0gU1NfUkVBRFkpOworCWlmICh1bmxpa2VseShuZWVkc19jb25uKSkgeworCQlpZiAoc29jay0+c3RhdGUgPT0gU1NfTElTVEVOSU5HKQorCQkJcmV0dXJuIC1FUElQRTsKKwkJaWYgKHNvY2stPnN0YXRlICE9IFNTX1VOQ09OTkVDVEVEKQorCQkJcmV0dXJuIC1FSVNDT05OOworCQlpZiAoKHRzb2NrLT5wLT5wdWJsaXNoZWQpIHx8CisJCSAgICAoKHNvY2stPnR5cGUgPT0gU09DS19TVFJFQU0pICYmICh0b3RhbF9sZW4gIT0gMCkpKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnRzb2NrLT5zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJaWYgKG5lZWRzX2Nvbm4pIHsKKworCQkvKiBBYm9ydCBhbnkgcGVuZGluZyBjb25uZWN0aW9uIGF0dGVtcHRzICh2ZXJ5IHVubGlrZWx5KSAqLworCisJCXdoaWxlICgoYnVmID0gc2tiX2RlcXVldWUoJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSkpIHsKKwkJCXRpcGNfcmVqZWN0X21zZyhidWYsIFRJUENfRVJSX05PX1BPUlQpOworCQkJYXRvbWljX2RlYygmdGlwY19xdWV1ZV9zaXplKTsKKwkJfQorCisJCXNvY2stPnN0YXRlID0gU1NfQ09OTkVDVElORzsKKwl9CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmIChkZXN0LT5hZGRydHlwZSA9PSBUSVBDX0FERFJfTkFNRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyZXMgPSBkZXN0X25hbWVfY2hlY2soZGVzdCwgbSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSB0aXBjX3NlbmQybmFtZSh0c29jay0+cC0+cmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc3QtPmFkZHIubmFtZS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdC0+YWRkci5uYW1lLmRvbWFpbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5tc2dfaW92bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+bXNnX2lvdik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlc3QtPmFkZHJ0eXBlID09IFRJUENfQUREUl9JRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gdGlwY19zZW5kMnBvcnQodHNvY2stPnAtPnJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXN0LT5hZGRyLmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+bXNnX2lvdmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPm1zZ19pb3YpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXN0LT5hZGRydHlwZSA9PSBUSVBDX0FERFJfTUNBU1QpIHsKKwkJCWlmIChuZWVkc19jb25uKSB7CisJCQkJcmVzID0gLUVPUE5PVFNVUFA7CisJCQkJZ290byBleGl0OworCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyZXMgPSBkZXN0X25hbWVfY2hlY2soZGVzdCwgbSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSB0aXBjX211bHRpY2FzdCh0c29jay0+cC0+cmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc3QtPmFkZHIubmFtZXNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5tc2dfaW92bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+bXNnX2lvdik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsaWtlbHkocmVzICE9IC1FTElOS0NPTkcpKSB7CitleGl0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICB1cCgmdHNvY2stPnNlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKwkJaWYgKG0tPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCkgeworCQkJcmVzID0gLUVXT1VMREJMT0NLOworCQkJZ290byBleGl0OworCQl9CisgICAgICAgICAgICAgICAgaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgqc29jay0+c2stPnNrX3NsZWVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXRzb2NrLT5wLT5jb25nZXN0ZWQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IC1FUkVTVEFSVFNZUzsKKyAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoMSk7Cit9CisKKy8qKiAKKyAqIHNlbmRfcGFja2V0IC0gc2VuZCBhIGNvbm5lY3Rpb24tb3JpZW50ZWQgbWVzc2FnZQorICogQGlvY2I6ICh1bnVzZWQpCisgKiBAc29jazogc29ja2V0IHN0cnVjdHVyZQorICogQG06IG1lc3NhZ2UgdG8gc2VuZAorICogQHRvdGFsX2xlbjogKHVudXNlZCkKKyAqIAorICogVXNlZCBmb3IgU09DS19TRVFQQUNLRVQgbWVzc2FnZXMgYW5kIFNPQ0tfU1RSRUFNIGRhdGEuCisgKiAKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBzZW50IG9uIHN1Y2Nlc3MsIG9yIGVycm5vIG90aGVyd2lzZQorICovCisKK3N0YXRpYyBpbnQgc2VuZF9wYWNrZXQoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkgICAgICAgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IHRvdGFsX2xlbikKK3sKKwlzdHJ1Y3QgdGlwY19zb2NrICp0c29jayA9IHRpcGNfc2soc29jay0+c2spOworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqZGVzdCA9IChzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqKW0tPm1zZ19uYW1lOworCWludCByZXM7CisKKwkvKiBIYW5kbGUgaW1wbGllZCBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQgKi8KKworCWlmICh1bmxpa2VseShkZXN0KSkKKwkJcmV0dXJuIHNlbmRfbXNnKGlvY2IsIHNvY2ssIG0sIHRvdGFsX2xlbik7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ0c29jay0+c2VtKSkgeworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHVubGlrZWx5KHNvY2stPnN0YXRlICE9IFNTX0NPTk5FQ1RFRCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc29jay0+c3RhdGUgPT0gU1NfRElTQ09OTkVDVElORykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IC1FUElQRTsgICAKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSAtRU5PVENPTk47CisgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHJlcyA9IHRpcGNfc2VuZCh0c29jay0+cC0+cmVmLCBtLT5tc2dfaW92bGVuLCBtLT5tc2dfaW92KTsKKyAgICAgICAgICAgICAgICBpZiAobGlrZWx5KHJlcyAhPSAtRUxJTktDT05HKSkgeworZXhpdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ0c29jay0+c2VtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorCQlpZiAobS0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlUKSB7CisJCQlyZXMgPSAtRVdPVUxEQkxPQ0s7CisJCQlnb3RvIGV4aXQ7CisJCX0KKyAgICAgICAgICAgICAgICBpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKCpzb2NrLT5zay0+c2tfc2xlZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdHNvY2stPnAtPmNvbmdlc3RlZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gLUVSRVNUQVJUU1lTOworICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICgxKTsKK30KKworLyoqIAorICogc2VuZF9zdHJlYW0gLSBzZW5kIHN0cmVhbS1vcmllbnRlZCBkYXRhCisgKiBAaW9jYjogKHVudXNlZCkKKyAqIEBzb2NrOiBzb2NrZXQgc3RydWN0dXJlCisgKiBAbTogZGF0YSB0byBzZW5kCisgKiBAdG90YWxfbGVuOiB0b3RhbCBsZW5ndGggb2YgZGF0YSB0byBiZSBzZW50CisgKiAKKyAqIFVzZWQgZm9yIFNPQ0tfU1RSRUFNIGRhdGEuCisgKiAKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBzZW50IG9uIHN1Y2Nlc3MsIG9yIGVycm5vIG90aGVyd2lzZQorICovCisKKworc3RhdGljIGludCBzZW5kX3N0cmVhbShzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCSAgICAgICBzdHJ1Y3QgbXNnaGRyICptLCBzaXplX3QgdG90YWxfbGVuKQoreworCXN0cnVjdCBtc2doZHIgbXlfbXNnOworCXN0cnVjdCBpb3ZlYyBteV9pb3Y7CisJc3RydWN0IGlvdmVjICpjdXJyX2lvdjsKKwlpbnQgY3Vycl9pb3ZsZW47CisJY2hhciBfX3VzZXIgKmN1cnJfc3RhcnQ7CisJaW50IGN1cnJfbGVmdDsKKwlpbnQgYnl0ZXNfdG9fc2VuZDsKKwlpbnQgcmVzOworCQorCWlmIChsaWtlbHkodG90YWxfbGVuIDw9IFRJUENfTUFYX1VTRVJfTVNHX1NJWkUpKQorCQlyZXR1cm4gc2VuZF9wYWNrZXQoaW9jYiwgc29jaywgbSwgdG90YWxfbGVuKTsKKworCS8qIENhbiBvbmx5IHNlbmQgbGFyZ2UgZGF0YSBzdHJlYW1zIGlmIGFscmVhZHkgY29ubmVjdGVkICovCisKKyAgICAgICAgaWYgKHVubGlrZWx5KHNvY2stPnN0YXRlICE9IFNTX0NPTk5FQ1RFRCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc29jay0+c3RhdGUgPT0gU1NfRElTQ09OTkVDVElORykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRVBJUEU7ICAgCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9UQ09OTjsKKyAgICAgICAgfQorCisJLyogCisJICogU2VuZCBlYWNoIGlvdmVjIGVudHJ5IHVzaW5nIG9uZSBvciBtb3JlIG1lc3NhZ2VzCisJICoKKwkgKiBOb3RlOiBUaGlzIGFsZ29yaXRobSBpcyBnb29kIGZvciB0aGUgbW9zdCBsaWtlbHkgY2FzZSAKKwkgKiAoaS5lLiBvbmUgbGFyZ2UgaW92ZWMgZW50cnkpLCBidXQgY291bGQgYmUgaW1wcm92ZWQgdG8gcGFzcyBzZXRzCisJICogb2Ygc21hbGwgaW92ZWMgZW50cmllcyBpbnRvIHNlbmRfcGFja2V0KCkuCisJICovCisKKwlteV9tc2cgPSAqbTsKKwljdXJyX2lvdiA9IG15X21zZy5tc2dfaW92OworCWN1cnJfaW92bGVuID0gbXlfbXNnLm1zZ19pb3ZsZW47CisJbXlfbXNnLm1zZ19pb3YgPSAmbXlfaW92OworCW15X21zZy5tc2dfaW92bGVuID0gMTsKKworCXdoaWxlIChjdXJyX2lvdmxlbi0tKSB7CisJCWN1cnJfc3RhcnQgPSBjdXJyX2lvdi0+aW92X2Jhc2U7CisJCWN1cnJfbGVmdCA9IGN1cnJfaW92LT5pb3ZfbGVuOworCisJCXdoaWxlIChjdXJyX2xlZnQpIHsKKwkJCWJ5dGVzX3RvX3NlbmQgPSAoY3Vycl9sZWZ0IDwgVElQQ19NQVhfVVNFUl9NU0dfU0laRSkKKwkJCQk/IGN1cnJfbGVmdCA6IFRJUENfTUFYX1VTRVJfTVNHX1NJWkU7CisJCQlteV9pb3YuaW92X2Jhc2UgPSBjdXJyX3N0YXJ0OworCQkJbXlfaW92Lmlvdl9sZW4gPSBieXRlc190b19zZW5kOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyZXMgPSBzZW5kX3BhY2tldChpb2NiLCBzb2NrLCAmbXlfbXNnLCAwKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworCQkJY3Vycl9sZWZ0IC09IGJ5dGVzX3RvX3NlbmQ7CisJCQljdXJyX3N0YXJ0ICs9IGJ5dGVzX3RvX3NlbmQ7CisJCX0KKworCQljdXJyX2lvdisrOworCX0KKworCXJldHVybiB0b3RhbF9sZW47Cit9CisKKy8qKgorICogYXV0b19jb25uZWN0IC0gY29tcGxldGUgY29ubmVjdGlvbiBzZXR1cCB0byBhIHJlbW90ZSBwb3J0CisgKiBAc29jazogc29ja2V0IHN0cnVjdHVyZQorICogQHRzb2NrOiBUSVBDLXNwZWNpZmljIHNvY2tldCBzdHJ1Y3R1cmUKKyAqIEBtc2c6IHBlZXIncyByZXNwb25zZSBtZXNzYWdlCisgKiAKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvdGhlcndpc2UKKyAqLworCitzdGF0aWMgaW50IGF1dG9fY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgdGlwY19zb2NrICp0c29jaywgCisJCQlzdHJ1Y3QgdGlwY19tc2cgKm1zZykKK3sKKwlzdHJ1Y3QgdGlwY19wb3J0aWQgcGVlcjsKKworCWlmIChtc2dfZXJyY29kZShtc2cpKSB7CisJCXNvY2stPnN0YXRlID0gU1NfRElTQ09OTkVDVElORzsKKwkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CisJfQorCisJcGVlci5yZWYgPSBtc2dfb3JpZ3BvcnQobXNnKTsKKwlwZWVyLm5vZGUgPSBtc2dfb3JpZ25vZGUobXNnKTsKKwl0aXBjX2Nvbm5lY3QycG9ydCh0c29jay0+cC0+cmVmLCAmcGVlcik7CisJdGlwY19zZXRfcG9ydGltcG9ydGFuY2UodHNvY2stPnAtPnJlZiwgbXNnX2ltcG9ydGFuY2UobXNnKSk7CisJc29jay0+c3RhdGUgPSBTU19DT05ORUNURUQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc2V0X29yaWdfYWRkciAtIGNhcHR1cmUgc2VuZGVyJ3MgYWRkcmVzcyBmb3IgcmVjZWl2ZWQgbWVzc2FnZQorICogQG06IGRlc2NyaXB0b3IgZm9yIG1lc3NhZ2UgaW5mbworICogQG1zZzogcmVjZWl2ZWQgbWVzc2FnZSBoZWFkZXIKKyAqIAorICogTm90ZTogQWRkcmVzcyBpcyBub3QgY2FwdHVyZWQgaWYgbm90IHJlcXVlc3RlZCBieSByZWNlaXZlci4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X29yaWdfYWRkcihzdHJ1Y3QgbXNnaGRyICptLCBzdHJ1Y3QgdGlwY19tc2cgKm1zZykKK3sKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX3RpcGMgKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyX3RpcGMgKiltLT5tc2dfbmFtZTsKKworICAgICAgICBpZiAoYWRkcikgeworCQlhZGRyLT5mYW1pbHkgPSBBRl9USVBDOworCQlhZGRyLT5hZGRydHlwZSA9IFRJUENfQUREUl9JRDsKKwkJYWRkci0+YWRkci5pZC5yZWYgPSBtc2dfb3JpZ3BvcnQobXNnKTsKKwkJYWRkci0+YWRkci5pZC5ub2RlID0gbXNnX29yaWdub2RlKG1zZyk7CisJCWFkZHItPmFkZHIubmFtZS5kb21haW4gPSAwOyAgIAkvKiBjb3VsZCBsZWF2ZSB1bmluaXRpYWxpemVkICovCisJCWFkZHItPnNjb3BlID0gMDsgICAJCS8qIGNvdWxkIGxlYXZlIHVuaW5pdGlhbGl6ZWQgKi8KKwkJbS0+bXNnX25hbWVsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3RpcGMpOworCX0KK30KKworLyoqCisgKiBhbmNfZGF0YV9yZWN2IC0gb3B0aW9uYWxseSBjYXB0dXJlIGFuY2lsbGFyeSBkYXRhIGZvciByZWNlaXZlZCBtZXNzYWdlIAorICogQG06IGRlc2NyaXB0b3IgZm9yIG1lc3NhZ2UgaW5mbworICogQG1zZzogcmVjZWl2ZWQgbWVzc2FnZSBoZWFkZXIKKyAqIEB0cG9ydDogVElQQyBwb3J0IGFzc29jaWF0ZWQgd2l0aCBtZXNzYWdlCisgKiAKKyAqIE5vdGU6IEFuY2lsbGFyeSBkYXRhIGlzIG5vdCBjYXB0dXJlZCBpZiBub3QgcmVxdWVzdGVkIGJ5IHJlY2VpdmVyLgorICogCisgKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGVycm5vCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgYW5jX2RhdGFfcmVjdihzdHJ1Y3QgbXNnaGRyICptLCBzdHJ1Y3QgdGlwY19tc2cgKm1zZywgCisJCQkJc3RydWN0IHRpcGNfcG9ydCAqdHBvcnQpCit7CisJdTMyIGFuY19kYXRhWzNdOworCXUzMiBlcnI7CisJdTMyIGRlc3RfdHlwZTsKKwlpbnQgcmVzOworCisJaWYgKGxpa2VseShtLT5tc2dfY29udHJvbGxlbiA9PSAwKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBPcHRpb25hbGx5IGNhcHR1cmUgZXJyb3JlZCBtZXNzYWdlIG9iamVjdChzKSAqLworCisJZXJyID0gbXNnID8gbXNnX2VycmNvZGUobXNnKSA6IDA7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJYW5jX2RhdGFbMF0gPSBlcnI7CisJCWFuY19kYXRhWzFdID0gbXNnX2RhdGFfc3oobXNnKTsKKwkJaWYgKChyZXMgPSBwdXRfY21zZyhtLCBTT0xfU09DS0VULCBUSVBDX0VSUklORk8sIDgsIGFuY19kYXRhKSkpCisJCQlyZXR1cm4gcmVzOworCQlpZiAoYW5jX2RhdGFbMV0gJiYKKwkJICAgIChyZXMgPSBwdXRfY21zZyhtLCBTT0xfU09DS0VULCBUSVBDX1JFVERBVEEsIGFuY19kYXRhWzFdLCAKKwkJCQkgICAgbXNnX2RhdGEobXNnKSkpKQorCQkJcmV0dXJuIHJlczsKKwl9CisKKwkvKiBPcHRpb25hbGx5IGNhcHR1cmUgbWVzc2FnZSBkZXN0aW5hdGlvbiBvYmplY3QgKi8KKworCWRlc3RfdHlwZSA9IG1zZyA/IG1zZ190eXBlKG1zZykgOiBUSVBDX0RJUkVDVF9NU0c7CisJc3dpdGNoIChkZXN0X3R5cGUpIHsKKwljYXNlIFRJUENfTkFNRURfTVNHOgorCQlhbmNfZGF0YVswXSA9IG1zZ19uYW1ldHlwZShtc2cpOworCQlhbmNfZGF0YVsxXSA9IG1zZ19uYW1lbG93ZXIobXNnKTsKKwkJYW5jX2RhdGFbMl0gPSBtc2dfbmFtZWxvd2VyKG1zZyk7CisJCWJyZWFrOworCWNhc2UgVElQQ19NQ0FTVF9NU0c6CisJCWFuY19kYXRhWzBdID0gbXNnX25hbWV0eXBlKG1zZyk7CisJCWFuY19kYXRhWzFdID0gbXNnX25hbWVsb3dlcihtc2cpOworCQlhbmNfZGF0YVsyXSA9IG1zZ19uYW1ldXBwZXIobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NPTk5fTVNHOgorCQlhbmNfZGF0YVswXSA9IHRwb3J0LT5jb25uX3R5cGU7CisJCWFuY19kYXRhWzFdID0gdHBvcnQtPmNvbm5faW5zdGFuY2U7CisJCWFuY19kYXRhWzJdID0gdHBvcnQtPmNvbm5faW5zdGFuY2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFuY19kYXRhWzBdID0gMDsKKwl9CisJaWYgKGFuY19kYXRhWzBdICYmCisJICAgIChyZXMgPSBwdXRfY21zZyhtLCBTT0xfU09DS0VULCBUSVBDX0RFU1ROQU1FLCAxMiwgYW5jX2RhdGEpKSkKKwkJcmV0dXJuIHJlczsKKworCXJldHVybiAwOworfQorCisvKiogCisgKiByZWN2X21zZyAtIHJlY2VpdmUgcGFja2V0LW9yaWVudGVkIG1lc3NhZ2UKKyAqIEBpb2NiOiAodW51c2VkKQorICogQG06IGRlc2NyaXB0b3IgZm9yIG1lc3NhZ2UgaW5mbworICogQGJ1Zl9sZW46IHRvdGFsIHNpemUgb2YgdXNlciBidWZmZXIgYXJlYQorICogQGZsYWdzOiByZWNlaXZlIGZsYWdzCisgKiAKKyAqIFVzZWQgZm9yIFNPQ0tfREdSQU0sIFNPQ0tfUkRNLCBhbmQgU09DS19TRVFQQUNLRVQgbWVzc2FnZXMuCisgKiBJZiB0aGUgY29tcGxldGUgbWVzc2FnZSBkb2Vzbid0IGZpdCBpbiB1c2VyIGFyZWEsIHRydW5jYXRlIGl0LgorICoKKyAqIFJldHVybnMgc2l6ZSBvZiByZXR1cm5lZCBtZXNzYWdlIGRhdGEsIGVycm5vIG90aGVyd2lzZQorICovCisKK3N0YXRpYyBpbnQgcmVjdl9tc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkgICAgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IGJ1Zl9sZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgdGlwY19zb2NrICp0c29jayA9IHRpcGNfc2soc29jay0+c2spOworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisJdW5zaWduZWQgaW50IHFfbGVuOworCXVuc2lnbmVkIGludCBzejsKKwl1MzIgZXJyOworCWludCByZXM7CisKKwkvKiBDdXJyZW50bHkgZG9lc24ndCBzdXBwb3J0IHJlY2VpdmluZyBpbnRvIG11bHRpcGxlIGlvdmVjIGVudHJpZXMgKi8KKworCWlmIChtLT5tc2dfaW92bGVuICE9IDEpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIENhdGNoIGludmFsaWQgcmVjZWl2ZSBhdHRlbXB0cyAqLworCisJaWYgKHVubGlrZWx5KCFidWZfbGVuKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc29jay0+dHlwZSA9PSBTT0NLX1NFUVBBQ0tFVCkgeworCQlpZiAodW5saWtlbHkoc29jay0+c3RhdGUgPT0gU1NfVU5DT05ORUNURUQpKQorCQkJcmV0dXJuIC1FTk9UQ09OTjsKKwkJaWYgKHVubGlrZWx5KChzb2NrLT5zdGF0ZSA9PSBTU19ESVNDT05ORUNUSU5HKSAmJiAKKwkJCSAgICAgKHNrYl9xdWV1ZV9sZW4oJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSA9PSAwKSkpCisJCSAgICAgICAJcmV0dXJuIC1FTk9UQ09OTjsKKwl9CisKKwkvKiBMb29rIGZvciBhIG1lc3NhZ2UgaW4gcmVjZWl2ZSBxdWV1ZTsgd2FpdCBpZiBuZWNlc3NhcnkgKi8KKworCWlmICh1bmxpa2VseShkb3duX2ludGVycnVwdGlibGUoJnRzb2NrLT5zZW0pKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworcmVzdGFydDoKKwlpZiAodW5saWtlbHkoKHNrYl9xdWV1ZV9sZW4oJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSA9PSAwKSAmJgorCQkgICAgIChmbGFncyAmIE1TR19ET05UV0FJVCkpKSB7CisJCXJlcyA9IC1FV09VTERCTE9DSzsKKwkJZ290byBleGl0OworCX0KKworCWlmICgocmVzID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAorCQkqc29jay0+c2stPnNrX3NsZWVwLCAKKwkJKChxX2xlbiA9IHNrYl9xdWV1ZV9sZW4oJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSkgfHwKKwkJIChzb2NrLT5zdGF0ZSA9PSBTU19ESVNDT05ORUNUSU5HKSkpICkpIHsKKwkJZ290byBleGl0OworCX0KKworCS8qIENhdGNoIGF0dGVtcHQgdG8gcmVjZWl2ZSBvbiBhbiBhbHJlYWR5IHRlcm1pbmF0ZWQgY29ubmVjdGlvbiAqLworCS8qIFtUSElTIENIRUNLIE1BWSBPVkVSTEFQIFdJVEggQU4gRUFSTElFUiBDSEVDS10gKi8KKworCWlmICghcV9sZW4pIHsKKwkJcmVzID0gLUVOT1RDT05OOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogR2V0IGFjY2VzcyB0byBmaXJzdCBtZXNzYWdlIGluIHJlY2VpdmUgcXVldWUgKi8KKworCWJ1ZiA9IHNrYl9wZWVrKCZzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJbXNnID0gYnVmX21zZyhidWYpOworCXN6ID0gbXNnX2RhdGFfc3oobXNnKTsKKwllcnIgPSBtc2dfZXJyY29kZShtc2cpOworCisJLyogQ29tcGxldGUgY29ubmVjdGlvbiBzZXR1cCBmb3IgYW4gaW1wbGllZCBjb25uZWN0ICovCisKKwlpZiAodW5saWtlbHkoc29jay0+c3RhdGUgPT0gU1NfQ09OTkVDVElORykpIHsKKwkJaWYgKChyZXMgPSBhdXRvX2Nvbm5lY3Qoc29jaywgdHNvY2ssIG1zZykpKQorCQkJZ290byBleGl0OworCX0KKworCS8qIERpc2NhcmQgYW4gZW1wdHkgbm9uLWVycm9yZWQgbWVzc2FnZSAmIHRyeSBhZ2FpbiAqLworCisJaWYgKCghc3opICYmICghZXJyKSkgeworCQlhZHZhbmNlX3F1ZXVlKHRzb2NrKTsKKwkJZ290byByZXN0YXJ0OworCX0KKworCS8qIENhcHR1cmUgc2VuZGVyJ3MgYWRkcmVzcyAob3B0aW9uYWwpICovCisKKwlzZXRfb3JpZ19hZGRyKG0sIG1zZyk7CisKKwkvKiBDYXB0dXJlIGFuY2lsbGFyeSBkYXRhIChvcHRpb25hbCkgKi8KKworCWlmICgocmVzID0gYW5jX2RhdGFfcmVjdihtLCBtc2csIHRzb2NrLT5wKSkpCisJCWdvdG8gZXhpdDsKKworCS8qIENhcHR1cmUgbWVzc2FnZSBkYXRhIChpZiB2YWxpZCkgJiBjb21wdXRlIHJldHVybiB2YWx1ZSAoYWx3YXlzKSAqLworCQorCWlmICghZXJyKSB7CisJCWlmICh1bmxpa2VseShidWZfbGVuIDwgc3opKSB7CisJCQlzeiA9IGJ1Zl9sZW47CisJCQltLT5tc2dfZmxhZ3MgfD0gTVNHX1RSVU5DOworCQl9CisJCWlmICh1bmxpa2VseShjb3B5X3RvX3VzZXIobS0+bXNnX2lvdi0+aW92X2Jhc2UsIG1zZ19kYXRhKG1zZyksCisJCQkJCSAgc3opKSkgeworCQkJcmVzID0gLUVGQVVMVDsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQlyZXMgPSBzejsKKwl9IGVsc2UgeworCQlpZiAoKHNvY2stPnN0YXRlID09IFNTX1JFQURZKSB8fAorCQkgICAgKChlcnIgPT0gVElQQ19DT05OX1NIVVRET1dOKSB8fCBtLT5tc2dfY29udHJvbCkpCisJCQlyZXMgPSAwOworCQllbHNlCisJCQlyZXMgPSAtRUNPTk5SRVNFVDsKKwl9CisKKwkvKiBDb25zdW1lIHJlY2VpdmVkIG1lc3NhZ2UgKG9wdGlvbmFsKSAqLworCisJaWYgKGxpa2VseSghKGZsYWdzICYgTVNHX1BFRUspKSkgeworICAgICAgICAgICAgICAgIGlmICh1bmxpa2VseSgrK3Rzb2NrLT5wLT5jb25uX3VuYWNrZWQgPj0gVElQQ19GTE9XX0NPTlRST0xfV0lOKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpcGNfYWNrbm93bGVkZ2UodHNvY2stPnAtPnJlZiwgdHNvY2stPnAtPmNvbm5fdW5hY2tlZCk7CisJCWFkdmFuY2VfcXVldWUodHNvY2spOworICAgICAgICB9CitleGl0OgorCXVwKCZ0c29jay0+c2VtKTsKKwlyZXR1cm4gcmVzOworfQorCisvKiogCisgKiByZWN2X3N0cmVhbSAtIHJlY2VpdmUgc3RyZWFtLW9yaWVudGVkIGRhdGEKKyAqIEBpb2NiOiAodW51c2VkKQorICogQG06IGRlc2NyaXB0b3IgZm9yIG1lc3NhZ2UgaW5mbworICogQGJ1Zl9sZW46IHRvdGFsIHNpemUgb2YgdXNlciBidWZmZXIgYXJlYQorICogQGZsYWdzOiByZWNlaXZlIGZsYWdzCisgKiAKKyAqIFVzZWQgZm9yIFNPQ0tfU1RSRUFNIG1lc3NhZ2VzIG9ubHkuICBJZiBub3QgZW5vdWdoIGRhdGEgaXMgYXZhaWxhYmxlIAorICogd2lsbCBvcHRpb25hbGx5IHdhaXQgZm9yIG1vcmU7IG5ldmVyIHRydW5jYXRlcyBkYXRhLgorICoKKyAqIFJldHVybnMgc2l6ZSBvZiByZXR1cm5lZCBtZXNzYWdlIGRhdGEsIGVycm5vIG90aGVyd2lzZQorICovCisKK3N0YXRpYyBpbnQgcmVjdl9zdHJlYW0oc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkgICAgICAgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IGJ1Zl9sZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgdGlwY19zb2NrICp0c29jayA9IHRpcGNfc2soc29jay0+c2spOworCXN0cnVjdCBza19idWZmICpidWY7CisJc3RydWN0IHRpcGNfbXNnICptc2c7CisJdW5zaWduZWQgaW50IHFfbGVuOworCXVuc2lnbmVkIGludCBzejsKKwlpbnQgc3pfdG9fY29weTsKKwlpbnQgc3pfY29waWVkID0gMDsKKwlpbnQgbmVlZGVkOworCWNoYXIgKmNycyA9IG0tPm1zZ19pb3YtPmlvdl9iYXNlOworCXVuc2lnbmVkIGNoYXIgKmJ1Zl9jcnM7CisJdTMyIGVycjsKKwlpbnQgcmVzOworCisJLyogQ3VycmVudGx5IGRvZXNuJ3Qgc3VwcG9ydCByZWNlaXZpbmcgaW50byBtdWx0aXBsZSBpb3ZlYyBlbnRyaWVzICovCisKKwlpZiAobS0+bXNnX2lvdmxlbiAhPSAxKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkvKiBDYXRjaCBpbnZhbGlkIHJlY2VpdmUgYXR0ZW1wdHMgKi8KKworCWlmICh1bmxpa2VseSghYnVmX2xlbikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHVubGlrZWx5KHNvY2stPnN0YXRlID09IFNTX0RJU0NPTk5FQ1RJTkcpKSB7CisJCWlmIChza2JfcXVldWVfbGVuKCZzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSkgPT0gMCkKKwkJCXJldHVybiAtRU5PVENPTk47CisJfSBlbHNlIGlmICh1bmxpa2VseShzb2NrLT5zdGF0ZSAhPSBTU19DT05ORUNURUQpKQorCQlyZXR1cm4gLUVOT1RDT05OOworCisJLyogTG9vayBmb3IgYSBtZXNzYWdlIGluIHJlY2VpdmUgcXVldWU7IHdhaXQgaWYgbmVjZXNzYXJ5ICovCisKKwlpZiAodW5saWtlbHkoZG93bl9pbnRlcnJ1cHRpYmxlKCZ0c29jay0+c2VtKSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKK3Jlc3RhcnQ6CisJaWYgKHVubGlrZWx5KChza2JfcXVldWVfbGVuKCZzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSkgPT0gMCkgJiYKKwkJICAgICAoZmxhZ3MgJiBNU0dfRE9OVFdBSVQpKSkgeworCQlyZXMgPSAoc3pfY29waWVkID09IDApID8gLUVXT1VMREJMT0NLIDogMDsKKwkJZ290byBleGl0OworCX0KKworCWlmICgocmVzID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAorCQkqc29jay0+c2stPnNrX3NsZWVwLCAKKwkJKChxX2xlbiA9IHNrYl9xdWV1ZV9sZW4oJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSkgfHwKKwkJIChzb2NrLT5zdGF0ZSA9PSBTU19ESVNDT05ORUNUSU5HKSkpICkpIHsKKwkJZ290byBleGl0OworCX0KKworCS8qIENhdGNoIGF0dGVtcHQgdG8gcmVjZWl2ZSBvbiBhbiBhbHJlYWR5IHRlcm1pbmF0ZWQgY29ubmVjdGlvbiAqLworCS8qIFtUSElTIENIRUNLIE1BWSBPVkVSTEFQIFdJVEggQU4gRUFSTElFUiBDSEVDS10gKi8KKworCWlmICghcV9sZW4pIHsKKwkJcmVzID0gLUVOT1RDT05OOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogR2V0IGFjY2VzcyB0byBmaXJzdCBtZXNzYWdlIGluIHJlY2VpdmUgcXVldWUgKi8KKworCWJ1ZiA9IHNrYl9wZWVrKCZzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJbXNnID0gYnVmX21zZyhidWYpOworCXN6ID0gbXNnX2RhdGFfc3oobXNnKTsKKwllcnIgPSBtc2dfZXJyY29kZShtc2cpOworCisJLyogRGlzY2FyZCBhbiBlbXB0eSBub24tZXJyb3JlZCBtZXNzYWdlICYgdHJ5IGFnYWluICovCisKKwlpZiAoKCFzeikgJiYgKCFlcnIpKSB7CisJCWFkdmFuY2VfcXVldWUodHNvY2spOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJLyogT3B0aW9uYWxseSBjYXB0dXJlIHNlbmRlcidzIGFkZHJlc3MgJiBhbmNpbGxhcnkgZGF0YSBvZiBmaXJzdCBtc2cgKi8KKworCWlmIChzel9jb3BpZWQgPT0gMCkgeworCQlzZXRfb3JpZ19hZGRyKG0sIG1zZyk7CisJCWlmICgocmVzID0gYW5jX2RhdGFfcmVjdihtLCBtc2csIHRzb2NrLT5wKSkpCisJCQlnb3RvIGV4aXQ7CisJfQorCisJLyogQ2FwdHVyZSBtZXNzYWdlIGRhdGEgKGlmIHZhbGlkKSAmIGNvbXB1dGUgcmV0dXJuIHZhbHVlIChhbHdheXMpICovCisJCisJaWYgKCFlcnIpIHsKKwkJYnVmX2NycyA9ICh1bnNpZ25lZCBjaGFyICopKFRJUENfU0tCX0NCKGJ1ZiktPmhhbmRsZSk7CisJCXN6ID0gYnVmLT50YWlsIC0gYnVmX2NyczsKKworCQluZWVkZWQgPSAoYnVmX2xlbiAtIHN6X2NvcGllZCk7CisJCXN6X3RvX2NvcHkgPSAoc3ogPD0gbmVlZGVkKSA/IHN6IDogbmVlZGVkOworCQlpZiAodW5saWtlbHkoY29weV90b191c2VyKGNycywgYnVmX2Nycywgc3pfdG9fY29weSkpKSB7CisJCQlyZXMgPSAtRUZBVUxUOworCQkJZ290byBleGl0OworCQl9CisJCXN6X2NvcGllZCArPSBzel90b19jb3B5OworCisJCWlmIChzel90b19jb3B5IDwgc3opIHsKKwkJCWlmICghKGZsYWdzICYgTVNHX1BFRUspKQorCQkJCVRJUENfU0tCX0NCKGJ1ZiktPmhhbmRsZSA9IGJ1Zl9jcnMgKyBzel90b19jb3B5OworCQkJZ290byBleGl0OworCQl9CisKKwkJY3JzICs9IHN6X3RvX2NvcHk7CisJfSBlbHNlIHsKKwkJaWYgKHN6X2NvcGllZCAhPSAwKQorCQkJZ290byBleGl0OyAvKiBjYW4ndCBhZGQgZXJyb3IgbXNnIHRvIHZhbGlkIGRhdGEgKi8KKworCQlpZiAoKGVyciA9PSBUSVBDX0NPTk5fU0hVVERPV04pIHx8IG0tPm1zZ19jb250cm9sKQorCQkJcmVzID0gMDsKKwkJZWxzZQorCQkJcmVzID0gLUVDT05OUkVTRVQ7CisJfQorCisJLyogQ29uc3VtZSByZWNlaXZlZCBtZXNzYWdlIChvcHRpb25hbCkgKi8KKworCWlmIChsaWtlbHkoIShmbGFncyAmIE1TR19QRUVLKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAodW5saWtlbHkoKyt0c29jay0+cC0+Y29ubl91bmFja2VkID49IFRJUENfRkxPV19DT05UUk9MX1dJTikpCisgICAgICAgICAgICAgICAgICAgICAgICB0aXBjX2Fja25vd2xlZGdlKHRzb2NrLT5wLT5yZWYsIHRzb2NrLT5wLT5jb25uX3VuYWNrZWQpOworCQlhZHZhbmNlX3F1ZXVlKHRzb2NrKTsKKyAgICAgICAgfQorCisJLyogTG9vcCBhcm91bmQgaWYgbW9yZSBkYXRhIGlzIHJlcXVpcmVkICovCisKKwlpZiAoKHN6X2NvcGllZCA8IGJ1Zl9sZW4pICAgIC8qIGRpZG4ndCBnZXQgYWxsIHJlcXVlc3RlZCBkYXRhICovIAorCSAgICAmJiAoZmxhZ3MgJiBNU0dfV0FJVEFMTCkgLyogLi4uIGFuZCBuZWVkIHRvIHdhaXQgZm9yIG1vcmUgKi8KKwkgICAgJiYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpIC8qIC4uLiBhbmQgYXJlbid0IGp1c3QgcGVla2luZyBhdCBkYXRhICovCisJICAgICYmICghZXJyKSAgICAgICAgICAgICAgICAvKiAuLi4gYW5kIGhhdmVuJ3QgcmVhY2hlZCBhIEZJTiAqLworCSAgICApCisJCWdvdG8gcmVzdGFydDsKKworZXhpdDoKKwl1cCgmdHNvY2stPnNlbSk7CisJcmV0dXJuIHJlcyA/IHJlcyA6IHN6X2NvcGllZDsKK30KKworLyoqCisgKiBxdWV1ZV9vdmVybG9hZGVkIC0gdGVzdCBpZiBxdWV1ZSBvdmVybG9hZCBjb25kaXRpb24gZXhpc3RzCisgKiBAcXVldWVfc2l6ZTogY3VycmVudCBzaXplIG9mIHF1ZXVlCisgKiBAYmFzZTogbm9taW5hbCBtYXhpbXVtIHNpemUgb2YgcXVldWUKKyAqIEBtc2c6IG1lc3NhZ2UgdG8gYmUgYWRkZWQgdG8gcXVldWUKKyAqIAorICogUmV0dXJucyAxIGlmIHF1ZXVlIGlzIGN1cnJlbnRseSBvdmVybG9hZGVkLCAwIG90aGVyd2lzZQorICovCisKK3N0YXRpYyBpbnQgcXVldWVfb3ZlcmxvYWRlZCh1MzIgcXVldWVfc2l6ZSwgdTMyIGJhc2UsIHN0cnVjdCB0aXBjX21zZyAqbXNnKQoreworCXUzMiB0aHJlc2hvbGQ7CisJdTMyIGltcCA9IG1zZ19pbXBvcnRhbmNlKG1zZyk7CisKKwlpZiAoaW1wID09IFRJUENfTE9XX0lNUE9SVEFOQ0UpCisJCXRocmVzaG9sZCA9IGJhc2U7CisJZWxzZSBpZiAoaW1wID09IFRJUENfTUVESVVNX0lNUE9SVEFOQ0UpCisJCXRocmVzaG9sZCA9IGJhc2UgKiAyOworCWVsc2UgaWYgKGltcCA9PSBUSVBDX0hJR0hfSU1QT1JUQU5DRSkKKwkJdGhyZXNob2xkID0gYmFzZSAqIDEwMDsKKwllbHNlCisJCXJldHVybiAwOworCisJaWYgKG1zZ19jb25uZWN0ZWQobXNnKSkKKwkJdGhyZXNob2xkICo9IDQ7CisKKwlyZXR1cm4gKHF1ZXVlX3NpemUgPiB0aHJlc2hvbGQpOworfQorCisvKiogCisgKiBhc3luY19kaXNjb25uZWN0IC0gd3JhcHBlciBmdW5jdGlvbiB1c2VkIHRvIGRpc2Nvbm5lY3QgcG9ydAorICogQHBvcnRyZWY6IFRJUEMgcG9ydCByZWZlcmVuY2UgKHBhc3NlZCBhcyBwb2ludGVyLXNpemVkIHZhbHVlKQorICovCisKK3N0YXRpYyB2b2lkIGFzeW5jX2Rpc2Nvbm5lY3QodW5zaWduZWQgbG9uZyBwb3J0cmVmKQoreworCXRpcGNfZGlzY29ubmVjdCgodTMyKXBvcnRyZWYpOworfQorCisvKiogCisgKiBkaXNwYXRjaCAtIGhhbmRsZSBhcnJpdmluZyBtZXNzYWdlCisgKiBAdHBvcnQ6IFRJUEMgcG9ydCB0aGF0IHJlY2VpdmVkIG1lc3NhZ2UKKyAqIEBidWY6IG1lc3NhZ2UKKyAqIAorICogQ2FsbGVkIHdpdGggcG9ydCBsb2NrZWQuICBNdXN0IG5vdCB0YWtlIHNvY2tldCBsb2NrIHRvIGF2b2lkIGRlYWRsb2NrIHJpc2suCisgKiAKKyAqIFJldHVybnMgVElQQyBlcnJvciBzdGF0dXMgY29kZSAoVElQQ19PSyBpZiBtZXNzYWdlIGlzIG5vdCB0byBiZSByZWplY3RlZCkKKyAqLworCitzdGF0aWMgdTMyIGRpc3BhdGNoKHN0cnVjdCB0aXBjX3BvcnQgKnRwb3J0LCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoreworCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOworCXN0cnVjdCB0aXBjX3NvY2sgKnRzb2NrID0gKHN0cnVjdCB0aXBjX3NvY2sgKil0cG9ydC0+dXNyX2hhbmRsZTsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCXUzMiByZWN2X3FfbGVuOworCisJLyogUmVqZWN0IG1lc3NhZ2UgaWYgc29ja2V0IGlzIGNsb3NpbmcgKi8KKworCWlmICghdHNvY2spCisJCXJldHVybiBUSVBDX0VSUl9OT19QT1JUOworCisJLyogUmVqZWN0IG1lc3NhZ2UgaWYgaXQgaXMgd3Jvbmcgc29ydCBvZiBtZXNzYWdlIGZvciBzb2NrZXQgKi8KKworCS8qCisJICogV09VTEQgSVQgQkUgQkVUVEVSIFRPIEpVU1QgRElTQ0FSRCBUSEVTRSBNRVNTQUdFUyBJTlNURUFEPworCSAqICJOTyBQT1JUIiBJU04nVCBSRUFMTFkgVEhFIFJJR0hUIEVSUk9SIENPREUsIEFORCBUSEVSRSBNQVkKKwkgKiBCRSBTRUNVUklUWSBJTVBMSUNBVElPTlMgSU5IRVJFTlQgSU4gUkVKRUNUSU5HIElOVkFMSUQgVFJBRkZJQworCSAqLworCXNvY2sgPSB0c29jay0+c2suc2tfc29ja2V0OworCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19SRUFEWSkgeworCQlpZiAobXNnX2Nvbm5lY3RlZChtc2cpKSB7CisJCQltc2dfZGJnKG1zZywgImRpc3BhdGNoIGZpbHRlciAxXG4iKTsKKwkJCXJldHVybiBUSVBDX0VSUl9OT19QT1JUOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKG1zZ19tY2FzdChtc2cpKSB7CisJCQltc2dfZGJnKG1zZywgImRpc3BhdGNoIGZpbHRlciAyXG4iKTsKKwkJCXJldHVybiBUSVBDX0VSUl9OT19QT1JUOworCQl9CisJCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19DT05ORUNURUQpIHsKKwkJCWlmICghbXNnX2Nvbm5lY3RlZChtc2cpKSB7CisJCQkJbXNnX2RiZyhtc2csICJkaXNwYXRjaCBmaWx0ZXIgM1xuIik7CisJCQkJcmV0dXJuIFRJUENfRVJSX05PX1BPUlQ7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoc29jay0+c3RhdGUgPT0gU1NfQ09OTkVDVElORykgeworCQkJaWYgKCFtc2dfY29ubmVjdGVkKG1zZykgJiYgKG1zZ19lcnJjb2RlKG1zZykgPT0gMCkpIHsKKwkJCQltc2dfZGJnKG1zZywgImRpc3BhdGNoIGZpbHRlciA0XG4iKTsKKwkJCQlyZXR1cm4gVElQQ19FUlJfTk9fUE9SVDsKKwkJCX0KKwkJfSAKKwkJZWxzZSBpZiAoc29jay0+c3RhdGUgPT0gU1NfTElTVEVOSU5HKSB7CisJCQlpZiAobXNnX2Nvbm5lY3RlZChtc2cpIHx8IG1zZ19lcnJjb2RlKG1zZykpIHsKKwkJCQltc2dfZGJnKG1zZywgImRpc3BhdGNoIGZpbHRlciA1XG4iKTsKKwkJCQlyZXR1cm4gVElQQ19FUlJfTk9fUE9SVDsKKwkJCX0KKwkJfSAKKwkJZWxzZSBpZiAoc29jay0+c3RhdGUgPT0gU1NfRElTQ09OTkVDVElORykgeworCQkJbXNnX2RiZyhtc2csICJkaXNwYXRjaCBmaWx0ZXIgNlxuIik7CisJCQlyZXR1cm4gVElQQ19FUlJfTk9fUE9SVDsKKwkJfQorCQllbHNlIC8qIChzb2NrLT5zdGF0ZSA9PSBTU19VTkNPTk5FQ1RFRCkgKi8geworCQkJaWYgKG1zZ19jb25uZWN0ZWQobXNnKSB8fCBtc2dfZXJyY29kZShtc2cpKSB7CisJCQkJbXNnX2RiZyhtc2csICJkaXNwYXRjaCBmaWx0ZXIgN1xuIik7CisJCQkJcmV0dXJuIFRJUENfRVJSX05PX1BPUlQ7CisJCQl9CisJCX0KKwl9CisKKwkvKiBSZWplY3QgbWVzc2FnZSBpZiB0aGVyZSBpc24ndCByb29tIHRvIHF1ZXVlIGl0ICovCisKKwlpZiAodW5saWtlbHkoKHUzMilhdG9taWNfcmVhZCgmdGlwY19xdWV1ZV9zaXplKSA+IAorCQkgICAgIE9WRVJMT0FEX0xJTUlUX0JBU0UpKSB7CisJCWlmIChxdWV1ZV9vdmVybG9hZGVkKGF0b21pY19yZWFkKCZ0aXBjX3F1ZXVlX3NpemUpLCAKKwkJCQkgICAgIE9WRVJMT0FEX0xJTUlUX0JBU0UsIG1zZykpCisJCQlyZXR1cm4gVElQQ19FUlJfT1ZFUkxPQUQ7CisgICAgICAgIH0KKwlyZWN2X3FfbGVuID0gc2tiX3F1ZXVlX2xlbigmdHNvY2stPnNrLnNrX3JlY2VpdmVfcXVldWUpOworCWlmICh1bmxpa2VseShyZWN2X3FfbGVuID4gKE9WRVJMT0FEX0xJTUlUX0JBU0UgLyAyKSkpIHsKKwkJaWYgKHF1ZXVlX292ZXJsb2FkZWQocmVjdl9xX2xlbiwgCisJCQkJICAgICBPVkVSTE9BRF9MSU1JVF9CQVNFIC8gMiwgbXNnKSkgCisJCQlyZXR1cm4gVElQQ19FUlJfT1ZFUkxPQUQ7CisgICAgICAgIH0KKworCS8qIEluaXRpYXRlIGNvbm5lY3Rpb24gdGVybWluYXRpb24gZm9yIGFuIGluY29taW5nICdGSU4nICovCisKKwlpZiAodW5saWtlbHkobXNnX2VycmNvZGUobXNnKSAmJiAoc29jay0+c3RhdGUgPT0gU1NfQ09OTkVDVEVEKSkpIHsKKwkJc29jay0+c3RhdGUgPSBTU19ESVNDT05ORUNUSU5HOworCQkvKiBOb3RlOiBVc2Ugc2lnbmFsIHNpbmNlIHBvcnQgbG9jayBpcyBhbHJlYWR5IHRha2VuISAqLworCQl0aXBjX2tfc2lnbmFsKChIYW5kbGVyKWFzeW5jX2Rpc2Nvbm5lY3QsIHRwb3J0LT5yZWYpOworCX0KKworCS8qIEVucXVldWUgbWVzc2FnZSAoZmluYWxseSEpICovCisKKwltc2dfZGJnKG1zZywiPERJU1A8OiAiKTsKKwlUSVBDX1NLQl9DQihidWYpLT5oYW5kbGUgPSBtc2dfZGF0YShtc2cpOworCWF0b21pY19pbmMoJnRpcGNfcXVldWVfc2l6ZSk7CisJc2tiX3F1ZXVlX3RhaWwoJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlLCBidWYpOworCisgICAgICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZShzb2NrLT5zay0+c2tfc2xlZXApOworCXJldHVybiBUSVBDX09LOworfQorCisvKiogCisgKiB3YWtldXBkaXNwYXRjaCAtIHdha2UgdXAgcG9ydCBhZnRlciBjb25nZXN0aW9uCisgKiBAdHBvcnQ6IHBvcnQgdG8gd2FrZXVwCisgKiAKKyAqIENhbGxlZCB3aXRoIHBvcnQgbG9jayBvbi4KKyAqLworCitzdGF0aWMgdm9pZCB3YWtldXBkaXNwYXRjaChzdHJ1Y3QgdGlwY19wb3J0ICp0cG9ydCkKK3sKKwlzdHJ1Y3QgdGlwY19zb2NrICp0c29jayA9IChzdHJ1Y3QgdGlwY19zb2NrICopdHBvcnQtPnVzcl9oYW5kbGU7CisKKyAgICAgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHRzb2NrLT5zay5za19zbGVlcCk7Cit9CisKKy8qKgorICogY29ubmVjdCAtIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gYW5vdGhlciBUSVBDIHBvcnQKKyAqIEBzb2NrOiBzb2NrZXQgc3RydWN0dXJlCisgKiBAZGVzdDogc29ja2V0IGFkZHJlc3MgZm9yIGRlc3RpbmF0aW9uIHBvcnQKKyAqIEBkZXN0bGVuOiBzaXplIG9mIHNvY2tldCBhZGRyZXNzIGRhdGEgc3RydWN0dXJlCisgKiBAZmxhZ3M6ICh1bnVzZWQpCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG90aGVyd2lzZQorICovCisKK3N0YXRpYyBpbnQgY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmRlc3QsIGludCBkZXN0bGVuLCAKKwkJICAgaW50IGZsYWdzKQoreworICAgc3RydWN0IHRpcGNfc29jayAqdHNvY2sgPSB0aXBjX3NrKHNvY2stPnNrKTsKKyAgIHN0cnVjdCBzb2NrYWRkcl90aXBjICpkc3QgPSAoc3RydWN0IHNvY2thZGRyX3RpcGMgKilkZXN0OworICAgc3RydWN0IG1zZ2hkciBtID0gezAsfTsKKyAgIHN0cnVjdCBza19idWZmICpidWY7CisgICBzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKyAgIGludCByZXM7CisKKyAgIC8qIEZvciBub3csIFRJUEMgZG9lcyBub3QgYWxsb3cgdXNlIG9mIGNvbm5lY3QoKSB3aXRoIERHUkFNIG9yIFJETSB0eXBlcyAqLworCisgICBpZiAoc29jay0+c3RhdGUgPT0gU1NfUkVBRFkpCisJICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCisgICAvKiBNT1ZFIFRIRSBSRVNUIE9GIFRISVMgRVJST1IgQ0hFQ0tJTkcgVE8gc2VuZF9tc2coKT8gKi8KKyAgIGlmIChzb2NrLT5zdGF0ZSA9PSBTU19MSVNURU5JTkcpCisJICAgcmV0dXJuIC1FT1BOT1RTVVBQOworICAgaWYgKHNvY2stPnN0YXRlID09IFNTX0NPTk5FQ1RJTkcpCisJICAgcmV0dXJuIC1FQUxSRUFEWTsKKyAgIGlmIChzb2NrLT5zdGF0ZSAhPSBTU19VTkNPTk5FQ1RFRCkKKyAgICAgICAgICAgcmV0dXJuIC1FSVNDT05OOworCisgICBpZiAoKGRzdC0+ZmFtaWx5ICE9IEFGX1RJUEMpIHx8CisgICAgICAgKChkc3QtPmFkZHJ0eXBlICE9IFRJUENfQUREUl9OQU1FKSAmJiAoZHN0LT5hZGRydHlwZSAhPSBUSVBDX0FERFJfSUQpKSkKKyAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgIC8qIFNlbmQgYSAnU1lOLScgdG8gZGVzdGluYXRpb24gKi8KKworICAgbS5tc2dfbmFtZSA9IGRlc3Q7CisgICBpZiAoKHJlcyA9IHNlbmRfbXNnKDAsIHNvY2ssICZtLCAwKSkgPCAwKSB7CisJICAgc29jay0+c3RhdGUgPSBTU19ESVNDT05ORUNUSU5HOworCSAgIHJldHVybiByZXM7CisgICB9CisKKyAgIGlmIChkb3duX2ludGVycnVwdGlibGUoJnRzb2NrLT5zZW0pKSAKKyAgICAgICAgICAgcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkKKyAgIC8qIFdhaXQgZm9yIGRlc3RpbmF0aW9uJ3MgJ0FDSycgcmVzcG9uc2UgKi8KKworICAgcmVzID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoKnNvY2stPnNrLT5za19zbGVlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYl9xdWV1ZV9sZW4oJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSwKKwkJCQkJICBzb2NrLT5zay0+c2tfcmN2dGltZW8pOworICAgYnVmID0gc2tiX3BlZWsoJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKyAgIGlmIChyZXMgPiAwKSB7CisJICAgbXNnID0gYnVmX21zZyhidWYpOworICAgICAgICAgICByZXMgPSBhdXRvX2Nvbm5lY3Qoc29jaywgdHNvY2ssIG1zZyk7CisgICAgICAgICAgIGlmICghcmVzKSB7CisJCSAgIGlmIChkc3QtPmFkZHJ0eXBlID09IFRJUENfQUREUl9OQU1FKSB7CisJCQkgICB0c29jay0+cC0+Y29ubl90eXBlID0gZHN0LT5hZGRyLm5hbWUubmFtZS50eXBlOworCQkJICAgdHNvY2stPnAtPmNvbm5faW5zdGFuY2UgPSBkc3QtPmFkZHIubmFtZS5uYW1lLmluc3RhbmNlOworCQkgICB9CisJCSAgIGlmICghbXNnX2RhdGFfc3oobXNnKSkKKwkJCSAgIGFkdmFuY2VfcXVldWUodHNvY2spOworCSAgIH0KKyAgIH0gZWxzZSB7CisJICAgaWYgKHJlcyA9PSAwKSB7CisJCSAgIHJlcyA9IC1FVElNRURPVVQ7CisJICAgfSBlbHNlCisJICAgICAgICAgICB7IC8qIGxlYXZlICJyZXMiIHVuY2hhbmdlZCAqLyB9CisJICAgc29jay0+c3RhdGUgPSBTU19ESVNDT05ORUNUSU5HOworICAgfQorCisgICB1cCgmdHNvY2stPnNlbSk7CisgICByZXR1cm4gcmVzOworfQorCisvKiogCisgKiBsaXN0ZW4gLSBhbGxvdyBzb2NrZXQgdG8gbGlzdGVuIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucworICogQHNvY2s6IHNvY2tldCBzdHJ1Y3R1cmUKKyAqIEBsZW46ICh1bnVzZWQpCisgKiAKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvdGhlcndpc2UKKyAqLworCitzdGF0aWMgaW50IGxpc3RlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGVuKQoreworCS8qIFJFUVVJUkVTIFNPQ0tFVCBMT0NLSU5HIE9GIFNPTUUgU09SVD8gKi8KKworCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19SRUFEWSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmIChzb2NrLT5zdGF0ZSAhPSBTU19VTkNPTk5FQ1RFRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc29jay0+c3RhdGUgPSBTU19MSVNURU5JTkc7CisgICAgICAgIHJldHVybiAwOworfQorCisvKiogCisgKiBhY2NlcHQgLSB3YWl0IGZvciBjb25uZWN0aW9uIHJlcXVlc3QKKyAqIEBzb2NrOiBsaXN0ZW5pbmcgc29ja2V0CisgKiBAbmV3c29jazogbmV3IHNvY2tldCB0aGF0IGlzIHRvIGJlIGNvbm5lY3RlZAorICogQGZsYWdzOiBmaWxlLXJlbGF0ZWQgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIHNvY2tldAorICogCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb3RoZXJ3aXNlCisgKi8KKworc3RhdGljIGludCBhY2NlcHQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2tldCAqbmV3c29jaywgaW50IGZsYWdzKQoreworCXN0cnVjdCB0aXBjX3NvY2sgKnRzb2NrID0gdGlwY19zayhzb2NrLT5zayk7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlpbnQgcmVzID0gLUVGQVVMVDsKKworCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19SRUFEWSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmIChzb2NrLT5zdGF0ZSAhPSBTU19MSVNURU5JTkcpCisJCXJldHVybiAtRUlOVkFMOworCQorCWlmICh1bmxpa2VseSgoc2tiX3F1ZXVlX2xlbigmc29jay0+c2stPnNrX3JlY2VpdmVfcXVldWUpID09IDApICYmIAorCQkgICAgIChmbGFncyAmIE9fTk9OQkxPQ0spKSkKKwkJcmV0dXJuIC1FV09VTERCTE9DSzsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnRzb2NrLT5zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgqc29jay0+c2stPnNrX3NsZWVwLCAKKwkJCQkgICAgIHNrYl9xdWV1ZV9sZW4oJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSkpIHsKKwkJcmVzID0gLUVSRVNUQVJUU1lTOworCQlnb3RvIGV4aXQ7CisJfQorCWJ1ZiA9IHNrYl9wZWVrKCZzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisKKwlyZXMgPSB0aXBjX2NyZWF0ZShuZXdzb2NrLCAwKTsKKwlpZiAoIXJlcykgeworCQlzdHJ1Y3QgdGlwY19zb2NrICpuZXdfdHNvY2sgPSB0aXBjX3NrKG5ld3NvY2stPnNrKTsKKwkJc3RydWN0IHRpcGNfcG9ydGlkIGlkOworCQlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJdTMyIG5ld19yZWYgPSBuZXdfdHNvY2stPnAtPnJlZjsKKworCQlpZC5yZWYgPSBtc2dfb3JpZ3BvcnQobXNnKTsKKwkJaWQubm9kZSA9IG1zZ19vcmlnbm9kZShtc2cpOworCQl0aXBjX2Nvbm5lY3QycG9ydChuZXdfcmVmLCAmaWQpOworCQluZXdzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKworCQl0aXBjX3NldF9wb3J0aW1wb3J0YW5jZShuZXdfcmVmLCBtc2dfaW1wb3J0YW5jZShtc2cpKTsKKwkJaWYgKG1zZ19uYW1lZChtc2cpKSB7CisJCQluZXdfdHNvY2stPnAtPmNvbm5fdHlwZSA9IG1zZ19uYW1ldHlwZShtc2cpOworCQkJbmV3X3Rzb2NrLT5wLT5jb25uX2luc3RhbmNlID0gbXNnX25hbWVpbnN0KG1zZyk7CisJCX0KKworICAgICAgICAgICAgICAgLyogCisJCSAqIFJlc3BvbmQgdG8gJ1NZTi0nIGJ5IGRpc2NhcmRpbmcgaXQgJiByZXR1cm5pbmcgJ0FDSyctLgorCQkgKiBSZXNwb25kIHRvICdTWU4rJyBieSBxdWV1aW5nIGl0IG9uIG5ldyBzb2NrZXQuCisJCSAqLworCisJCW1zZ19kYmcobXNnLCI8QUNDPDogIik7CisgICAgICAgICAgICAgICAgaWYgKCFtc2dfZGF0YV9zeihtc2cpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXNnaGRyIG0gPSB7MCx9OworCisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX3BhY2tldCgwLCBuZXdzb2NrLCAmbSwgMCk7ICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlX3F1ZXVlKHRzb2NrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJc29ja19sb2NrKHRzb2NrKTsKKwkJCXNrYl9kZXF1ZXVlKCZzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJCQlzb2NrX3VubG9jayh0c29jayk7CisJCQlza2JfcXVldWVfaGVhZCgmbmV3c29jay0+c2stPnNrX3JlY2VpdmVfcXVldWUsIGJ1Zik7CisJCX0KKwl9CitleGl0OgorCXVwKCZ0c29jay0+c2VtKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIHNodXRkb3duIC0gc2h1dGRvd24gc29ja2V0IGNvbm5lY3Rpb24KKyAqIEBzb2NrOiBzb2NrZXQgc3RydWN0dXJlCisgKiBAaG93OiBkaXJlY3Rpb24gdG8gY2xvc2UgKGFsd2F5cyB0cmVhdGVkIGFzIHJlYWQgKyB3cml0ZSkKKyAqCisgKiBUZXJtaW5hdGVzIGNvbm5lY3Rpb24gKGlmIG5lY2Vzc2FyeSksIHRoZW4gcHVyZ2VzIHNvY2tldCdzIHJlY2VpdmUgcXVldWUuCisgKiAKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvdGhlcndpc2UKKyAqLworCitzdGF0aWMgaW50IHNodXRkb3duKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBob3cpCit7CisJc3RydWN0IHRpcGNfc29jayogdHNvY2sgPSB0aXBjX3NrKHNvY2stPnNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOworCWludCByZXM7CisKKwkvKiBDb3VsZCByZXR1cm4gLUVJTlZBTCBmb3IgYW4gaW52YWxpZCAiaG93IiwgYnV0IHdoeSBib3RoZXI/ICovCisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ0c29jay0+c2VtKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCXNvY2tfbG9jayh0c29jayk7CisKKwlzd2l0Y2ggKHNvY2stPnN0YXRlKSB7CisJY2FzZSBTU19DT05ORUNURUQ6CisKKwkJLyogU2VuZCAnRklOKycgb3IgJ0ZJTi0nIG1lc3NhZ2UgdG8gcGVlciAqLworCisJCXNvY2tfdW5sb2NrKHRzb2NrKTsKK3Jlc3RhcnQ6CisJCWlmICgoYnVmID0gc2tiX2RlcXVldWUoJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSkpIHsKKwkJCWF0b21pY19kZWMoJnRpcGNfcXVldWVfc2l6ZSk7CisJCQlpZiAoVElQQ19TS0JfQ0IoYnVmKS0+aGFuZGxlICE9IG1zZ19kYXRhKGJ1Zl9tc2coYnVmKSkpIHsKKwkJCQlidWZfZGlzY2FyZChidWYpOworCQkJCWdvdG8gcmVzdGFydDsKKwkJCX0KKwkJCXRpcGNfcmVqZWN0X21zZyhidWYsIFRJUENfQ09OTl9TSFVURE9XTik7CisJCX0KKwkJZWxzZSB7CisJCQl0aXBjX3NodXRkb3duKHRzb2NrLT5wLT5yZWYpOworCQl9CisJCXNvY2tfbG9jayh0c29jayk7CisKKwkJLyogZmFsbCB0aHJvdWdoICovCisKKwljYXNlIFNTX0RJU0NPTk5FQ1RJTkc6CisKKwkJLyogRGlzY2FyZCBhbnkgdW5yZWNlaXZlZCBtZXNzYWdlcyAqLworCisJCXdoaWxlICgoYnVmID0gc2tiX2RlcXVldWUoJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSkpIHsKKwkJCWF0b21pY19kZWMoJnRpcGNfcXVldWVfc2l6ZSk7CisJCQlidWZfZGlzY2FyZChidWYpOworCQl9CisJCXRzb2NrLT5wLT5jb25uX3VuYWNrZWQgPSAwOworCisJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJY2FzZSBTU19DT05ORUNUSU5HOgorCQlzb2NrLT5zdGF0ZSA9IFNTX0RJU0NPTk5FQ1RJTkc7CisJCXJlcyA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmVzID0gLUVOT1RDT05OOworCX0KKworCXNvY2tfdW5sb2NrKHRzb2NrKTsKKworCXVwKCZ0c29jay0+c2VtKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIHNldHNvY2tvcHQgLSBzZXQgc29ja2V0IG9wdGlvbgorICogQHNvY2s6IHNvY2tldCBzdHJ1Y3R1cmUKKyAqIEBsdmw6IG9wdGlvbiBsZXZlbAorICogQG9wdDogb3B0aW9uIGlkZW50aWZpZXIKKyAqIEBvdjogcG9pbnRlciB0byBuZXcgb3B0aW9uIHZhbHVlCisgKiBAb2w6IGxlbmd0aCBvZiBvcHRpb24gdmFsdWUKKyAqIAorICogRm9yIHN0cmVhbSBzb2NrZXRzIG9ubHksIGFjY2VwdHMgYW5kIGlnbm9yZXMgYWxsIElQUFJPVE9fVENQIG9wdGlvbnMgCisgKiAodG8gZWFzZSBjb21wYXRpYmlsaXR5KS4KKyAqIAorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG90aGVyd2lzZQorICovCisKK3N0YXRpYyBpbnQgc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbHZsLCBpbnQgb3B0LCBjaGFyICpvdiwgaW50IG9sKQoreworCXN0cnVjdCB0aXBjX3NvY2sgKnRzb2NrID0gdGlwY19zayhzb2NrLT5zayk7CisJdTMyIHZhbHVlOworCWludCByZXM7CisKKyAgICAgICAgaWYgKChsdmwgPT0gSVBQUk9UT19UQ1ApICYmIChzb2NrLT50eXBlID09IFNPQ0tfU1RSRUFNKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwlpZiAobHZsICE9IFNPTF9USVBDKQorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCWlmIChvbCA8IHNpemVvZih2YWx1ZSkpCisJCXJldHVybiAtRUlOVkFMOworICAgICAgICBpZiAoKHJlcyA9IGdldF91c2VyKHZhbHVlLCAodTMyICopb3YpKSkKKwkJcmV0dXJuIHJlczsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnRzb2NrLT5zZW0pKSAKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkKKwlzd2l0Y2ggKG9wdCkgeworCWNhc2UgVElQQ19JTVBPUlRBTkNFOgorCQlyZXMgPSB0aXBjX3NldF9wb3J0aW1wb3J0YW5jZSh0c29jay0+cC0+cmVmLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVElQQ19TUkNfRFJPUFBBQkxFOgorCQlpZiAoc29jay0+dHlwZSAhPSBTT0NLX1NUUkVBTSkKKwkJCXJlcyA9IHRpcGNfc2V0X3BvcnR1bnJlbGlhYmxlKHRzb2NrLT5wLT5yZWYsIHZhbHVlKTsKKwkJZWxzZSAKKwkJCXJlcyA9IC1FTk9QUk9UT09QVDsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0RFU1RfRFJPUFBBQkxFOgorCQlyZXMgPSB0aXBjX3NldF9wb3J0dW5yZXR1cm5hYmxlKHRzb2NrLT5wLT5yZWYsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NPTk5fVElNRU9VVDoKKwkJc29jay0+c2stPnNrX3JjdnRpbWVvID0gKHZhbHVlICogSFogLyAxMDAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVzID0gLUVJTlZBTDsKKwl9CisKKwl1cCgmdHNvY2stPnNlbSk7CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBnZXRzb2Nrb3B0IC0gZ2V0IHNvY2tldCBvcHRpb24KKyAqIEBzb2NrOiBzb2NrZXQgc3RydWN0dXJlCisgKiBAbHZsOiBvcHRpb24gbGV2ZWwKKyAqIEBvcHQ6IG9wdGlvbiBpZGVudGlmaWVyCisgKiBAb3Y6IHJlY2VwdGFjbGUgZm9yIG9wdGlvbiB2YWx1ZQorICogQG9sOiByZWNlcHRhY2xlIGZvciBsZW5ndGggb2Ygb3B0aW9uIHZhbHVlCisgKiAKKyAqIEZvciBzdHJlYW0gc29ja2V0cyBvbmx5LCByZXR1cm5zIDAgbGVuZ3RoIHJlc3VsdCBmb3IgYWxsIElQUFJPVE9fVENQIG9wdGlvbnMgCisgKiAodG8gZWFzZSBjb21wYXRpYmlsaXR5KS4KKyAqIAorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG90aGVyd2lzZQorICovCisKK3N0YXRpYyBpbnQgZ2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbHZsLCBpbnQgb3B0LCBjaGFyICpvdiwgaW50ICpvbCkKK3sKKwlzdHJ1Y3QgdGlwY19zb2NrICp0c29jayA9IHRpcGNfc2soc29jay0+c2spOworICAgICAgICBpbnQgbGVuOworCXUzMiB2YWx1ZTsKKyAgICAgICAgaW50IHJlczsKKworICAgICAgICBpZiAoKGx2bCA9PSBJUFBST1RPX1RDUCkgJiYgKHNvY2stPnR5cGUgPT0gU09DS19TVFJFQU0pKQorICAgICAgICAgICAgICAgIHJldHVybiBwdXRfdXNlcigwLCBvbCk7CisJaWYgKGx2bCAhPSBTT0xfVElQQykKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKyAgICAgICAgaWYgKChyZXMgPSBnZXRfdXNlcihsZW4sIG9sKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnRzb2NrLT5zZW0pKSAKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCXN3aXRjaCAob3B0KSB7CisJY2FzZSBUSVBDX0lNUE9SVEFOQ0U6CisJCXJlcyA9IHRpcGNfcG9ydGltcG9ydGFuY2UodHNvY2stPnAtPnJlZiwgJnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX1NSQ19EUk9QUEFCTEU6CisJCXJlcyA9IHRpcGNfcG9ydHVucmVsaWFibGUodHNvY2stPnAtPnJlZiwgJnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0RFU1RfRFJPUFBBQkxFOgorCQlyZXMgPSB0aXBjX3BvcnR1bnJldHVybmFibGUodHNvY2stPnAtPnJlZiwgJnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBUSVBDX0NPTk5fVElNRU9VVDoKKwkJdmFsdWUgPSAoc29jay0+c2stPnNrX3JjdnRpbWVvICogMTAwMCkgLyBIWjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVzID0gLUVJTlZBTDsKKwl9CisKKwlpZiAocmVzKSB7CisJCS8qICJnZXQiIGZhaWxlZCAqLworCX0KKwllbHNlIGlmIChsZW4gPCBzaXplb2YodmFsdWUpKSB7CisJCXJlcyA9IC1FSU5WQUw7CisJfQorCWVsc2UgaWYgKChyZXMgPSBjb3B5X3RvX3VzZXIob3YsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSkpKSB7CisJCS8qIGNvdWxkbid0IHJldHVybiB2YWx1ZSAqLworCX0KKwllbHNlIHsKKwkJcmVzID0gcHV0X3VzZXIoc2l6ZW9mKHZhbHVlKSwgb2wpOworCX0KKworICAgICAgICB1cCgmdHNvY2stPnNlbSk7CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBQbGFjZWhvbGRlcnMgZm9yIG5vbi1pbXBsZW1lbnRlZCBmdW5jdGlvbmFsaXR5CisgKiAKKyAqIFJldHVybnMgZXJyb3IgY29kZSAoUE9TSVgtY29tcGxpYW50IHdoZXJlIGRlZmluZWQpCisgKi8KKworc3RhdGljIGludCBpb2N0bChzdHJ1Y3Qgc29ja2V0ICpzLCB1MzIgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgbm9fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHNvY2tldCAqc29jaywKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cit9CitzdGF0aWMgc3NpemVfdCBub19zZW5kcGFnZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IG5vX3NrcGFpcihzdHJ1Y3Qgc29ja2V0ICpzMSwgc3RydWN0IHNvY2tldCAqczIpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisvKioKKyAqIFByb3RvY29sIHN3aXRjaGVzIGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBUSVBDIHNvY2tldHMKKyAqLworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBtc2dfb3BzID0geworCS5vd25lciAJCT0gVEhJU19NT0RVTEUsCisJLmZhbWlseQkJPSBBRl9USVBDLAorCS5yZWxlYXNlCT0gcmVsZWFzZSwKKwkuYmluZAkJPSBiaW5kLAorCS5jb25uZWN0CT0gY29ubmVjdCwKKwkuc29ja2V0cGFpcgk9IG5vX3NrcGFpciwKKwkuYWNjZXB0CQk9IGFjY2VwdCwKKwkuZ2V0bmFtZQk9IGdldF9uYW1lLAorCS5wb2xsCQk9IHBvbGwsCisJLmlvY3RsCQk9IGlvY3RsLAorCS5saXN0ZW4JCT0gbGlzdGVuLAorCS5zaHV0ZG93bgk9IHNodXRkb3duLAorCS5zZXRzb2Nrb3B0CT0gc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAk9IGdldHNvY2tvcHQsCisJLnNlbmRtc2cJPSBzZW5kX21zZywKKwkucmVjdm1zZwk9IHJlY3ZfbXNnLAorICAgICAgICAubW1hcAkJPSBub19tbWFwLAorICAgICAgICAuc2VuZHBhZ2UJPSBub19zZW5kcGFnZQorfTsKKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgcGFja2V0X29wcyA9IHsKKwkub3duZXIgCQk9IFRISVNfTU9EVUxFLAorCS5mYW1pbHkJCT0gQUZfVElQQywKKwkucmVsZWFzZQk9IHJlbGVhc2UsCisJLmJpbmQJCT0gYmluZCwKKwkuY29ubmVjdAk9IGNvbm5lY3QsCisJLnNvY2tldHBhaXIJPSBub19za3BhaXIsCisJLmFjY2VwdAkJPSBhY2NlcHQsCisJLmdldG5hbWUJPSBnZXRfbmFtZSwKKwkucG9sbAkJPSBwb2xsLAorCS5pb2N0bAkJPSBpb2N0bCwKKwkubGlzdGVuCQk9IGxpc3RlbiwKKwkuc2h1dGRvd24JPSBzaHV0ZG93biwKKwkuc2V0c29ja29wdAk9IHNldHNvY2tvcHQsCisJLmdldHNvY2tvcHQJPSBnZXRzb2Nrb3B0LAorCS5zZW5kbXNnCT0gc2VuZF9wYWNrZXQsCisJLnJlY3Ztc2cJPSByZWN2X21zZywKKyAgICAgICAgLm1tYXAJCT0gbm9fbW1hcCwKKyAgICAgICAgLnNlbmRwYWdlCT0gbm9fc2VuZHBhZ2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIHN0cmVhbV9vcHMgPSB7CisJLm93bmVyIAkJPSBUSElTX01PRFVMRSwKKwkuZmFtaWx5CQk9IEFGX1RJUEMsCisJLnJlbGVhc2UJPSByZWxlYXNlLAorCS5iaW5kCQk9IGJpbmQsCisJLmNvbm5lY3QJPSBjb25uZWN0LAorCS5zb2NrZXRwYWlyCT0gbm9fc2twYWlyLAorCS5hY2NlcHQJCT0gYWNjZXB0LAorCS5nZXRuYW1lCT0gZ2V0X25hbWUsCisJLnBvbGwJCT0gcG9sbCwKKwkuaW9jdGwJCT0gaW9jdGwsCisJLmxpc3RlbgkJPSBsaXN0ZW4sCisJLnNodXRkb3duCT0gc2h1dGRvd24sCisJLnNldHNvY2tvcHQJPSBzZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0CT0gZ2V0c29ja29wdCwKKwkuc2VuZG1zZwk9IHNlbmRfc3RyZWFtLAorCS5yZWN2bXNnCT0gcmVjdl9zdHJlYW0sCisgICAgICAgIC5tbWFwCQk9IG5vX21tYXAsCisgICAgICAgIC5zZW5kcGFnZQk9IG5vX3NlbmRwYWdlCit9OworCitzdGF0aWMgc3RydWN0IG5ldF9wcm90b19mYW1pbHkgdGlwY19mYW1pbHlfb3BzID0geworCS5vd25lciAJCT0gVEhJU19NT0RVTEUsCisJLmZhbWlseQkJPSBBRl9USVBDLAorCS5jcmVhdGUJCT0gdGlwY19jcmVhdGUKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG8gdGlwY19wcm90byA9IHsKKwkubmFtZQkJPSAiVElQQyIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vYmpfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgdGlwY19zb2NrKQorfTsKKworLyoqCisgKiB0aXBjX3NvY2tldF9pbml0IC0gaW5pdGlhbGl6ZSBUSVBDIHNvY2tldCBpbnRlcmZhY2UKKyAqIAorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG90aGVyd2lzZQorICovCitpbnQgdGlwY19zb2NrZXRfaW5pdCh2b2lkKQoreworCWludCByZXM7CisKKyAgICAgICAgcmVzID0gcHJvdG9fcmVnaXN0ZXIoJnRpcGNfcHJvdG8sIDEpOworCWlmIChyZXMpIHsKKwkJZXJyKCJGYWlsZWQgdG8gcmVnaXN0ZXIgVElQQyBwcm90b2NvbCB0eXBlXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmVzID0gc29ja19yZWdpc3RlcigmdGlwY19mYW1pbHlfb3BzKTsKKwlpZiAocmVzKSB7CisJCWVycigiRmFpbGVkIHRvIHJlZ2lzdGVyIFRJUEMgc29ja2V0IHR5cGVcbiIpOworCQlwcm90b191bnJlZ2lzdGVyKCZ0aXBjX3Byb3RvKTsKKwkJZ290byBvdXQ7CisJfQorCisJc29ja2V0c19lbmFibGVkID0gMTsKKyBvdXQ6CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiB0aXBjX3NvY2tldF9zdG9wIC0gc3RvcCBUSVBDIHNvY2tldCBpbnRlcmZhY2UKKyAqLwordm9pZCB0aXBjX3NvY2tldF9zdG9wKHZvaWQpCit7CisJaWYgKCFzb2NrZXRzX2VuYWJsZWQpCisJCXJldHVybjsKKworCXNvY2tldHNfZW5hYmxlZCA9IDA7CisJc29ja191bnJlZ2lzdGVyKHRpcGNfZmFtaWx5X29wcy5mYW1pbHkpOworCXByb3RvX3VucmVnaXN0ZXIoJnRpcGNfcHJvdG8pOworfQorCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9zdWJzY3IuYyBiL25ldC90aXBjL3N1YnNjci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZjM4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy9zdWJzY3IuYwpAQCAtMCwwICsxLDUyNyBAQAorLyoKKyAqIG5ldC90aXBjL3N1YnNjci5jOiBUSVBDIHN1YnNjcmlwdGlvbiBzZXJ2aWNlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAiZGJnLmgiCisjaW5jbHVkZSAic3Vic2NyLmgiCisjaW5jbHVkZSAibmFtZV90YWJsZS5oIgorI2luY2x1ZGUgInJlZi5oIgorCisvKioKKyAqIHN0cnVjdCBzdWJzY3JpYmVyIC0gVElQQyBuZXR3b3JrIHRvcG9sb2d5IHN1YnNjcmliZXIKKyAqIEByZWY6IG9iamVjdCByZWZlcmVuY2UgdG8gc3Vic2NyaWJlciBvYmplY3QgaXRzZWxmCisgKiBAbG9jazogcG9pbnRlciB0byBzcGlubG9jayBjb250cm9sbGluZyBhY2Nlc3MgdG8gc3Vic2NyaWJlciBvYmplY3QKKyAqIEBzdWJzY3JpYmVyX2xpc3Q6IGFkamFjZW50IHN1YnNjcmliZXJzIGluIHRvcC4gc2VydmVyJ3MgbGlzdCBvZiBzdWJzY3JpYmVycworICogQHN1YnNjcmlwdGlvbl9saXN0OiBsaXN0IG9mIHN1YnNjcmlwdGlvbiBvYmplY3RzIGZvciB0aGlzIHN1YnNjcmliZXIKKyAqIEBwb3J0X3JlZjogb2JqZWN0IHJlZmVyZW5jZSB0byBwb3J0IHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBzdWJzY3JpYmVyCisgKiBAc3dhcDogaW5kaWNhdGVzIGlmIHN1YnNjcmliZXIgdXNlcyBvcHBvc2l0ZSBlbmRpYW5uZXNzIGluIGl0cyBtZXNzYWdlcworICovCisgCitzdHJ1Y3Qgc3Vic2NyaWJlciB7CisJdTMyIHJlZjsKKyAgICAgICAgc3BpbmxvY2tfdCAqbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN1YnNjcmliZXJfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN1YnNjcmlwdGlvbl9saXN0OworCXUzMiBwb3J0X3JlZjsKKwlpbnQgc3dhcDsKK307CisKKy8qKgorICogc3RydWN0IHRvcF9zcnYgLSBUSVBDIG5ldHdvcmsgdG9wb2xvZ3kgc3Vic2NyaXB0aW9uIHNlcnZpY2UKKyAqIEB1c2VyX3JlZjogVElQQyB1c2VyaWQgb2Ygc3Vic2NyaXB0aW9uIHNlcnZpY2UKKyAqIEBzZXR1cF9wb3J0OiByZWZlcmVuY2UgdG8gVElQQyBwb3J0IHRoYXQgaGFuZGxlcyBzdWJzY3JpcHRpb24gcmVxdWVzdHMKKyAqIEBzdWJzY3JpcHRpb25fY291bnQ6IG51bWJlciBvZiBhY3RpdmUgc3Vic2NyaXB0aW9ucyAobm90IHN1YnNjcmliZXJzISkKKyAqIEBzdWJzY3JpYmVyX2xpc3Q6IGxpc3Qgb2YgcG9ydHMgc3Vic2NyaWJpbmcgdG8gc2VydmljZQorICogQGxvY2s6IHNwaW5sb2NrIGdvdmVyaW5nIGFjY2VzcyB0byBzdWJzY3JpYmVyIGxpc3QKKyAqLworCitzdHJ1Y3QgdG9wX3NydiB7CisJdTMyIHVzZXJfcmVmOworCXUzMiBzZXR1cF9wb3J0OworCWF0b21pY190IHN1YnNjcmlwdGlvbl9jb3VudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN1YnNjcmliZXJfbGlzdDsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCitzdGF0aWMgc3RydWN0IHRvcF9zcnYgdG9wc3J2ID0geyAwIH07CisKKy8qKgorICogaHRvaGwgLSBjb252ZXJ0IHZhbHVlIHRvIGVuZGlhbm5lc3MgdXNlZCBieSBkZXN0aW5hdGlvbgorICogQGluOiB2YWx1ZSB0byBjb252ZXJ0CisgKiBAc3dhcDogbm9uLXplcm8gaWYgZW5kaWFubmVzcyBtdXN0IGJlIHJldmVyc2VkCisgKiAKKyAqIFJldHVybnMgY29udmVydGVkIHZhbHVlCisgKi8KKworc3RhdGljIGlubGluZSB1MzIgaHRvaGwodTMyIGluLCBpbnQgc3dhcCkKK3sKKwljaGFyICpjID0gKGNoYXIgKikmaW47CisKKwlyZXR1cm4gc3dhcCA/ICgoY1szXSA8PCAzKSArIChjWzJdIDw8IDIpICsgKGNbMV0gPDwgMSkgKyBjWzBdKSA6IGluOworfQorCisvKioKKyAqIHN1YnNjcl9zZW5kX2V2ZW50IC0gc2VuZCBhIG1lc3NhZ2UgY29udGFpbmluZyBhIHRpcGNfZXZlbnQgdG8gdGhlIHN1YnNjcmliZXIKKyAqLworCitzdGF0aWMgdm9pZCBzdWJzY3Jfc2VuZF9ldmVudChzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzdWIsIAorCQkJICAgICAgdTMyIGZvdW5kX2xvd2VyLCAKKwkJCSAgICAgIHUzMiBmb3VuZF91cHBlciwKKwkJCSAgICAgIHUzMiBldmVudCwgCisJCQkgICAgICB1MzIgcG9ydF9yZWYsIAorCQkJICAgICAgdTMyIG5vZGUpCit7CisJc3RydWN0IGlvdmVjIG1zZ19zZWN0OworCisJbXNnX3NlY3QuaW92X2Jhc2UgPSAodm9pZCAqKSZzdWItPmV2dDsKKwltc2dfc2VjdC5pb3ZfbGVuID0gc2l6ZW9mKHN0cnVjdCB0aXBjX2V2ZW50KTsKKworCXN1Yi0+ZXZ0LmV2ZW50ID0gaHRvaGwoZXZlbnQsIHN1Yi0+b3duZXItPnN3YXApOworCXN1Yi0+ZXZ0LmZvdW5kX2xvd2VyID0gaHRvaGwoZm91bmRfbG93ZXIsIHN1Yi0+b3duZXItPnN3YXApOworCXN1Yi0+ZXZ0LmZvdW5kX3VwcGVyID0gaHRvaGwoZm91bmRfdXBwZXIsIHN1Yi0+b3duZXItPnN3YXApOworCXN1Yi0+ZXZ0LnBvcnQucmVmID0gaHRvaGwocG9ydF9yZWYsIHN1Yi0+b3duZXItPnN3YXApOworCXN1Yi0+ZXZ0LnBvcnQubm9kZSA9IGh0b2hsKG5vZGUsIHN1Yi0+b3duZXItPnN3YXApOworCXRpcGNfc2VuZChzdWItPm93bmVyLT5wb3J0X3JlZiwgMSwgJm1zZ19zZWN0KTsKK30KKworLyoqCisgKiB0aXBjX3N1YnNjcl9vdmVybGFwIC0gdGVzdCBmb3Igc3Vic2NyaXB0aW9uIG92ZXJsYXAgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzCisgKgorICogUmV0dXJucyAxIGlmIHRoZXJlIGlzIG92ZXJsYXAsIG90aGVyd2lzZSAwLgorICovCisKK2ludCB0aXBjX3N1YnNjcl9vdmVybGFwKHN0cnVjdCBzdWJzY3JpcHRpb24gKnN1YiwgCisJCQl1MzIgZm91bmRfbG93ZXIsIAorCQkJdTMyIGZvdW5kX3VwcGVyKQorCit7CisJaWYgKGZvdW5kX2xvd2VyIDwgc3ViLT5zZXEubG93ZXIpCisJCWZvdW5kX2xvd2VyID0gc3ViLT5zZXEubG93ZXI7CisJaWYgKGZvdW5kX3VwcGVyID4gc3ViLT5zZXEudXBwZXIpCisJCWZvdW5kX3VwcGVyID0gc3ViLT5zZXEudXBwZXI7CisJaWYgKGZvdW5kX2xvd2VyID4gZm91bmRfdXBwZXIpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKioKKyAqIHRpcGNfc3Vic2NyX3JlcG9ydF9vdmVybGFwIC0gaXNzdWUgZXZlbnQgaWYgdGhlcmUgaXMgc3Vic2NyaXB0aW9uIG92ZXJsYXAKKyAqIAorICogUHJvdGVjdGVkIGJ5IG5hbWVzZXEubG9jayBpbiBuYW1lX3RhYmxlLmMKKyAqLworCit2b2lkIHRpcGNfc3Vic2NyX3JlcG9ydF9vdmVybGFwKHN0cnVjdCBzdWJzY3JpcHRpb24gKnN1YiwgCisJCQkJdTMyIGZvdW5kX2xvd2VyLCAKKwkJCQl1MzIgZm91bmRfdXBwZXIsCisJCQkJdTMyIGV2ZW50LCAKKwkJCQl1MzIgcG9ydF9yZWYsIAorCQkJCXUzMiBub2RlLAorCQkJCWludCBtdXN0KQoreworCWRiZygiUmVwIG92ZXJsYXAgJXU6JXUsJXU8LT4ldSwldVxuIiwgc3ViLT5zZXEudHlwZSwgc3ViLT5zZXEubG93ZXIsCisJICAgIHN1Yi0+c2VxLnVwcGVyLCBmb3VuZF9sb3dlciwgZm91bmRfdXBwZXIpOworCWlmICghdGlwY19zdWJzY3Jfb3ZlcmxhcChzdWIsIGZvdW5kX2xvd2VyLCBmb3VuZF91cHBlcikpCisJCXJldHVybjsKKwlpZiAoIW11c3QgJiYgKHN1Yi0+ZmlsdGVyICE9IFRJUENfU1VCX1BPUlRTKSkKKwkJcmV0dXJuOworCXN1YnNjcl9zZW5kX2V2ZW50KHN1YiwgZm91bmRfbG93ZXIsIGZvdW5kX3VwcGVyLCBldmVudCwgcG9ydF9yZWYsIG5vZGUpOworfQorCisvKioKKyAqIHN1YnNjcl90aW1lb3V0IC0gc3Vic2NyaXB0aW9uIHRpbWVvdXQgaGFzIG9jY3VycmVkCisgKi8KKworc3RhdGljIHZvaWQgc3Vic2NyX3RpbWVvdXQoc3RydWN0IHN1YnNjcmlwdGlvbiAqc3ViKQoreworCXN0cnVjdCBzdWJzY3JpYmVyICpzdWJzY3JpYmVyOworCXUzMiBzdWJzY3JpYmVyX3JlZjsKKworCS8qIFZhbGlkYXRlIHN1YnNjcmliZXIgcmVmZXJlbmNlIChpbiBjYXNlIHN1YnNjcmliZXIgaXMgdGVybWluYXRpbmcpICovCisKKwlzdWJzY3JpYmVyX3JlZiA9IHN1Yi0+b3duZXItPnJlZjsKKwlzdWJzY3JpYmVyID0gKHN0cnVjdCBzdWJzY3JpYmVyICopdGlwY19yZWZfbG9jayhzdWJzY3JpYmVyX3JlZik7CisJaWYgKHN1YnNjcmliZXIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogVW5saW5rIHN1YnNjcmlwdGlvbiBmcm9tIG5hbWUgdGFibGUgKi8KKworCXRpcGNfbmFtZXRibF91bnN1YnNjcmliZShzdWIpOworCisJLyogTm90aWZ5IHN1YnNjcmliZXIgb2YgdGltZW91dCwgdGhlbiB1bmxpbmsgc3Vic2NyaXB0aW9uICovCisKKwlzdWJzY3Jfc2VuZF9ldmVudChzdWIsIAorCQkJICBzdWItPmV2dC5zLnNlcS5sb3dlciwgCisJCQkgIHN1Yi0+ZXZ0LnMuc2VxLnVwcGVyLAorCQkJICBUSVBDX1NVQlNDUl9USU1FT1VULCAKKwkJCSAgMCwgCisJCQkgIDApOworCWxpc3RfZGVsKCZzdWItPnN1YnNjcmlwdGlvbl9saXN0KTsKKworCS8qIE5vdyBkZXN0cm95IHN1YnNjcmlwdGlvbiAqLworCisJdGlwY19yZWZfdW5sb2NrKHN1YnNjcmliZXJfcmVmKTsKKwlrX3Rlcm1fdGltZXIoJnN1Yi0+dGltZXIpOworCWtmcmVlKHN1Yik7CisJYXRvbWljX2RlYygmdG9wc3J2LnN1YnNjcmlwdGlvbl9jb3VudCk7Cit9CisKKy8qKgorICogc3Vic2NyX3Rlcm1pbmF0ZSAtIHRlcm1pbmF0ZSBjb21tdW5pY2F0aW9uIHdpdGggYSBzdWJzY3JpYmVyCisgKiAKKyAqIENhbGxlZCB3aXRoIHN1YnNjcmliZXIgbG9ja2VkLiAgUm91dGluZSBtdXN0IHRlbXBvcmFyaWx5IHJlbGVhc2UgdGhpcyBsb2NrCisgKiB0byBlbmFibGUgc3Vic2NyaXB0aW9uIHRpbWVvdXQgcm91dGluZShzKSB0byBmaW5pc2ggd2l0aG91dCBkZWFkbG9ja2luZzsgCisgKiB0aGUgbG9jayBpcyB0aGVuIHJlY2xhaW1lZCB0byBhbGxvdyBjYWxsZXIgdG8gcmVsZWFzZSBpdCB1cG9uIHJldHVybi4KKyAqIChUaGlzIHNob3VsZCB3b3JrIGV2ZW4gaW4gdGhlIHVubGlrZWx5IGV2ZW50IHNvbWUgb3RoZXIgdGhyZWFkIGNyZWF0ZXMgCisgKiBhIG5ldyBvYmplY3QgcmVmZXJlbmNlIGluIHRoZSBpbnRlcmltIHRoYXQgdXNlcyB0aGlzIGxvY2s7IHRoaXMgcm91dGluZSB3aWxsCisgKiBzaW1wbHkgd2FpdCBmb3IgaXQgdG8gYmUgcmVsZWFzZWQsIHRoZW4gY2xhaW0gaXQuKQorICovCisKK3N0YXRpYyB2b2lkIHN1YnNjcl90ZXJtaW5hdGUoc3RydWN0IHN1YnNjcmliZXIgKnN1YnNjcmliZXIpCit7CisJc3RydWN0IHN1YnNjcmlwdGlvbiAqc3ViOworCXN0cnVjdCBzdWJzY3JpcHRpb24gKnN1Yl90ZW1wOworCisJLyogSW52YWxpZGF0ZSBzdWJzY3JpYmVyIHJlZmVyZW5jZSAqLworCisJdGlwY19yZWZfZGlzY2FyZChzdWJzY3JpYmVyLT5yZWYpOworCXNwaW5fdW5sb2NrX2JoKHN1YnNjcmliZXItPmxvY2spOworCisJLyogRGVzdHJveSBhbnkgZXhpc3Rpbmcgc3Vic2NyaXB0aW9ucyBmb3Igc3Vic2NyaWJlciAqLworCQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzdWIsIHN1Yl90ZW1wLCAmc3Vic2NyaWJlci0+c3Vic2NyaXB0aW9uX2xpc3QsCisJCQkJIHN1YnNjcmlwdGlvbl9saXN0KSB7CisJCWlmIChzdWItPnRpbWVvdXQgIT0gVElQQ19XQUlUX0ZPUkVWRVIpIHsKKwkJCWtfY2FuY2VsX3RpbWVyKCZzdWItPnRpbWVyKTsKKwkJCWtfdGVybV90aW1lcigmc3ViLT50aW1lcik7CisJCX0KKwkJdGlwY19uYW1ldGJsX3Vuc3Vic2NyaWJlKHN1Yik7CisJCWxpc3RfZGVsKCZzdWItPnN1YnNjcmlwdGlvbl9saXN0KTsKKwkJZGJnKCJUZXJtOiBSZW1vdmVkIHN1YiAldSwldSwldSBmcm9tIHN1YnNjcmliZXIgJXggbGlzdFxuIiwKKwkJICAgIHN1Yi0+c2VxLnR5cGUsIHN1Yi0+c2VxLmxvd2VyLCBzdWItPnNlcS51cHBlciwgc3Vic2NyaWJlcik7CisJCWtmcmVlKHN1Yik7CisJCWF0b21pY19kZWMoJnRvcHNydi5zdWJzY3JpcHRpb25fY291bnQpOworCX0KKworCS8qIFNldmVyIGNvbm5lY3Rpb24gdG8gc3Vic2NyaWJlciAqLworCisJdGlwY19zaHV0ZG93bihzdWJzY3JpYmVyLT5wb3J0X3JlZik7CisJdGlwY19kZWxldGVwb3J0KHN1YnNjcmliZXItPnBvcnRfcmVmKTsKKworCS8qIFJlbW92ZSBzdWJzY3JpYmVyIGZyb20gdG9wb2xvZ3kgc2VydmVyJ3Mgc3Vic2NyaWJlciBsaXN0ICovCisKKwlzcGluX2xvY2tfYmgoJnRvcHNydi5sb2NrKTsKKwlsaXN0X2RlbCgmc3Vic2NyaWJlci0+c3Vic2NyaWJlcl9saXN0KTsKKwlzcGluX3VubG9ja19iaCgmdG9wc3J2LmxvY2spOworCisJLyogTm93IGRlc3Ryb3kgc3Vic2NyaWJlciAqLworCisJc3Bpbl9sb2NrX2JoKHN1YnNjcmliZXItPmxvY2spOworCWtmcmVlKHN1YnNjcmliZXIpOworfQorCisvKioKKyAqIHN1YnNjcl9zdWJzY3JpYmUgLSBjcmVhdGUgc3Vic2NyaXB0aW9uIGZvciBzdWJzY3JpYmVyCisgKiAKKyAqIENhbGxlZCB3aXRoIHN1YnNjcmliZXIgbG9ja2VkCisgKi8KKworc3RhdGljIHZvaWQgc3Vic2NyX3N1YnNjcmliZShzdHJ1Y3QgdGlwY19zdWJzY3IgKnMsCisJCQkgICAgIHN0cnVjdCBzdWJzY3JpYmVyICpzdWJzY3JpYmVyKQoreworCXN0cnVjdCBzdWJzY3JpcHRpb24gKnN1YjsKKworCS8qIFJlZnVzZSBzdWJzY3JpcHRpb24gaWYgZ2xvYmFsIGxpbWl0IGV4Y2VlZGVkICovCisKKwlpZiAoYXRvbWljX3JlYWQoJnRvcHNydi5zdWJzY3JpcHRpb25fY291bnQpID49IHRpcGNfbWF4X3N1YnNjcmlwdGlvbnMpIHsKKwkJd2FybigiRmFpbGVkOiBtYXggJXUgc3Vic2NyaXB0aW9uc1xuIiwgdGlwY19tYXhfc3Vic2NyaXB0aW9ucyk7CisJCXN1YnNjcl90ZXJtaW5hdGUoc3Vic2NyaWJlcik7CisJCXJldHVybjsKKwl9CisKKwkvKiBBbGxvY2F0ZSBzdWJzY3JpcHRpb24gb2JqZWN0ICovCisKKwlzdWIgPSBrbWFsbG9jKHNpemVvZigqc3ViKSwgR0ZQX0FUT01JQyk7CisJaWYgKHN1YiA9PSBOVUxMKSB7CisJCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBpZ25vcmluZyBzdWJzY3JpcHRpb25cbiIpOworCQlzdWJzY3JfdGVybWluYXRlKHN1YnNjcmliZXIpOworCQlyZXR1cm47CisJfQorCisJLyogRGV0ZXJtaW5lL3VwZGF0ZSBzdWJzY3JpYmVyJ3MgZW5kaWFubmVzcyAqLworCisJaWYgKChzLT5maWx0ZXIgPT0gVElQQ19TVUJfUE9SVFMpIHx8IChzLT5maWx0ZXIgPT0gVElQQ19TVUJfU0VSVklDRSkpCisJCXN1YnNjcmliZXItPnN3YXAgPSAwOworCWVsc2UKKwkJc3Vic2NyaWJlci0+c3dhcCA9IDE7CisKKwkvKiBJbml0aWFsaXplIHN1YnNjcmlwdGlvbiBvYmplY3QgKi8KKworCW1lbXNldChzdWIsIDAsIHNpemVvZigqc3ViKSk7CisJc3ViLT5zZXEudHlwZSA9IGh0b2hsKHMtPnNlcS50eXBlLCBzdWJzY3JpYmVyLT5zd2FwKTsKKwlzdWItPnNlcS5sb3dlciA9IGh0b2hsKHMtPnNlcS5sb3dlciwgc3Vic2NyaWJlci0+c3dhcCk7CisJc3ViLT5zZXEudXBwZXIgPSBodG9obChzLT5zZXEudXBwZXIsIHN1YnNjcmliZXItPnN3YXApOworCXN1Yi0+dGltZW91dCA9IGh0b2hsKHMtPnRpbWVvdXQsIHN1YnNjcmliZXItPnN3YXApOworCXN1Yi0+ZmlsdGVyID0gaHRvaGwocy0+ZmlsdGVyLCBzdWJzY3JpYmVyLT5zd2FwKTsKKwlpZiAoKCgoc3ViLT5maWx0ZXIgIT0gVElQQ19TVUJfUE9SVFMpIAorCSAgICAgICYmIChzdWItPmZpbHRlciAhPSBUSVBDX1NVQl9TRVJWSUNFKSkpCisJICAgIHx8IChzdWItPnNlcS5sb3dlciA+IHN1Yi0+c2VxLnVwcGVyKSkgeworCQl3YXJuKCJSZWplY3RpbmcgaWxsZWdhbCBzdWJzY3JpcHRpb24gJXUsJXUsJXVcbiIsCisJCSAgICAgc3ViLT5zZXEudHlwZSwgc3ViLT5zZXEubG93ZXIsIHN1Yi0+c2VxLnVwcGVyKTsKKwkJa2ZyZWUoc3ViKTsKKwkJc3Vic2NyX3Rlcm1pbmF0ZShzdWJzY3JpYmVyKTsKKwkJcmV0dXJuOworCX0KKwltZW1jcHkoJnN1Yi0+ZXZ0LnMsIHMsIHNpemVvZihzdHJ1Y3QgdGlwY19zdWJzY3IpKTsKKwlJTklUX0xJU1RfSEVBRCgmc3ViLT5zdWJzY3JpcHRpb25fbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnN1Yi0+bmFtZXNlcV9saXN0KTsKKwlsaXN0X2FkZCgmc3ViLT5zdWJzY3JpcHRpb25fbGlzdCwgJnN1YnNjcmliZXItPnN1YnNjcmlwdGlvbl9saXN0KTsKKwlhdG9taWNfaW5jKCZ0b3BzcnYuc3Vic2NyaXB0aW9uX2NvdW50KTsKKwlpZiAoc3ViLT50aW1lb3V0ICE9IFRJUENfV0FJVF9GT1JFVkVSKSB7CisJCWtfaW5pdF90aW1lcigmc3ViLT50aW1lciwKKwkJCSAgICAgKEhhbmRsZXIpc3Vic2NyX3RpbWVvdXQsICh1bnNpZ25lZCBsb25nKXN1Yik7CisJCWtfc3RhcnRfdGltZXIoJnN1Yi0+dGltZXIsIHN1Yi0+dGltZW91dCk7CisJfQorCXN1Yi0+b3duZXIgPSBzdWJzY3JpYmVyOworCXRpcGNfbmFtZXRibF9zdWJzY3JpYmUoc3ViKTsKK30KKworLyoqCisgKiBzdWJzY3JfY29ubl9zaHV0ZG93bl9ldmVudCAtIGhhbmRsZSB0ZXJtaW5hdGlvbiByZXF1ZXN0IGZyb20gc3Vic2NyaWJlcgorICovCisKK3N0YXRpYyB2b2lkIHN1YnNjcl9jb25uX3NodXRkb3duX2V2ZW50KHZvaWQgKnVzcl9oYW5kbGUsCisJCQkJICAgICAgIHUzMiBwb3J0cmVmLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKmJ1ZiwKKwkJCQkgICAgICAgdW5zaWduZWQgY2hhciBjb25zdCAqZGF0YSwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHNpemUsCisJCQkJICAgICAgIGludCByZWFzb24pCit7CisJc3RydWN0IHN1YnNjcmliZXIgKnN1YnNjcmliZXI7CisJc3BpbmxvY2tfdCAqc3Vic2NyaWJlcl9sb2NrOworCisJc3Vic2NyaWJlciA9IHRpcGNfcmVmX2xvY2soKHUzMikodW5zaWduZWQgbG9uZyl1c3JfaGFuZGxlKTsKKwlpZiAoc3Vic2NyaWJlciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlzdWJzY3JpYmVyX2xvY2sgPSBzdWJzY3JpYmVyLT5sb2NrOworCXN1YnNjcl90ZXJtaW5hdGUoc3Vic2NyaWJlcik7CisJc3Bpbl91bmxvY2tfYmgoc3Vic2NyaWJlcl9sb2NrKTsKK30KKworLyoqCisgKiBzdWJzY3JfY29ubl9tc2dfZXZlbnQgLSBoYW5kbGUgbmV3IHN1YnNjcmlwdGlvbiByZXF1ZXN0IGZyb20gc3Vic2NyaWJlcgorICovCisKK3N0YXRpYyB2b2lkIHN1YnNjcl9jb25uX21zZ19ldmVudCh2b2lkICp1c3JfaGFuZGxlLAorCQkJCSAgdTMyIHBvcnRfcmVmLAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKipidWYsCisJCQkJICBjb25zdCB1bmNoYXIgKmRhdGEsCisJCQkJICB1MzIgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc3Vic2NyaWJlciAqc3Vic2NyaWJlcjsKKwlzcGlubG9ja190ICpzdWJzY3JpYmVyX2xvY2s7CisKKwlzdWJzY3JpYmVyID0gdGlwY19yZWZfbG9jaygodTMyKSh1bnNpZ25lZCBsb25nKXVzcl9oYW5kbGUpOworCWlmIChzdWJzY3JpYmVyID09IE5VTEwpCisJCXJldHVybjsKKworCXN1YnNjcmliZXJfbG9jayA9IHN1YnNjcmliZXItPmxvY2s7CisJaWYgKHNpemUgIT0gc2l6ZW9mKHN0cnVjdCB0aXBjX3N1YnNjcikpCisJCXN1YnNjcl90ZXJtaW5hdGUoc3Vic2NyaWJlcik7CisJZWxzZQorCQlzdWJzY3Jfc3Vic2NyaWJlKChzdHJ1Y3QgdGlwY19zdWJzY3IgKilkYXRhLCBzdWJzY3JpYmVyKTsKKwkKKwlzcGluX3VubG9ja19iaChzdWJzY3JpYmVyX2xvY2spOworfQorCisvKioKKyAqIHN1YnNjcl9uYW1lZF9tc2dfZXZlbnQgLSBoYW5kbGUgcmVxdWVzdCB0byBlc3RhYmxpc2ggYSBuZXcgc3Vic2NyaWJlcgorICovCisKK3N0YXRpYyB2b2lkIHN1YnNjcl9uYW1lZF9tc2dfZXZlbnQodm9pZCAqdXNyX2hhbmRsZSwKKwkJCQkgICB1MzIgcG9ydF9yZWYsCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKipidWYsCisJCQkJICAgY29uc3QgdW5jaGFyICpkYXRhLAorCQkJCSAgIHUzMiBzaXplLAorCQkJCSAgIHUzMiBpbXBvcnRhbmNlLCAKKwkJCQkgICBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKm9yaWcsCisJCQkJICAgc3RydWN0IHRpcGNfbmFtZV9zZXEgY29uc3QgKmRlc3QpCit7CisJc3RydWN0IHN1YnNjcmliZXIgKnN1YnNjcmliZXI7CisJc3RydWN0IGlvdmVjIG1zZ19zZWN0ID0gezAsIDB9OworCXNwaW5sb2NrX3QgKnN1YnNjcmliZXJfbG9jazsKKworCWRiZygic3Vic2NyX25hbWVkX21zZ19ldmVudDogb3JpZyA9ICV4IG93biA9ICV4LFxuIiwKKwkgICAgb3JpZy0+bm9kZSwgdGlwY19vd25fYWRkcik7CisJaWYgKHNpemUgJiYgKHNpemUgIT0gc2l6ZW9mKHN0cnVjdCB0aXBjX3N1YnNjcikpKSB7CisJCXdhcm4oIlJlY2VpdmVkIHRpcGNfc3Vic2NyIG9mIGludmFsaWQgc2l6ZVxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBDcmVhdGUgc3Vic2NyaWJlciBvYmplY3QgKi8KKworCXN1YnNjcmliZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3Vic2NyaWJlciksIEdGUF9BVE9NSUMpOworCWlmIChzdWJzY3JpYmVyID09IE5VTEwpIHsKKwkJd2FybigiTWVtb3J5IHNxdWVlemU7IGlnbm9yaW5nIHN1YnNjcmliZXIgc2V0dXBcbiIpOworCQlyZXR1cm47CisJfQorCW1lbXNldChzdWJzY3JpYmVyLCAwLCBzaXplb2Yoc3RydWN0IHN1YnNjcmliZXIpKTsKKwlJTklUX0xJU1RfSEVBRCgmc3Vic2NyaWJlci0+c3Vic2NyaXB0aW9uX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZzdWJzY3JpYmVyLT5zdWJzY3JpYmVyX2xpc3QpOworCXN1YnNjcmliZXItPnJlZiA9IHRpcGNfcmVmX2FjcXVpcmUoc3Vic2NyaWJlciwgJnN1YnNjcmliZXItPmxvY2spOworCWlmIChzdWJzY3JpYmVyLT5yZWYgPT0gMCkgeworCQl3YXJuKCJGYWlsZWQgdG8gYWNxdWlyZSBzdWJzY3JpYmVyIHJlZmVyZW5jZVxuIik7CisJCWtmcmVlKHN1YnNjcmliZXIpOworCQlyZXR1cm47CisJfQorCisJLyogRXN0YWJsaXNoIGEgY29ubmVjdGlvbiB0byBzdWJzY3JpYmVyICovCisKKwl0aXBjX2NyZWF0ZXBvcnQodG9wc3J2LnVzZXJfcmVmLAorCQkJKHZvaWQgKikodW5zaWduZWQgbG9uZylzdWJzY3JpYmVyLT5yZWYsCisJCQlpbXBvcnRhbmNlLAorCQkJMCwKKwkJCTAsCisJCQlzdWJzY3JfY29ubl9zaHV0ZG93bl9ldmVudCwKKwkJCTAsCisJCQkwLAorCQkJc3Vic2NyX2Nvbm5fbXNnX2V2ZW50LAorCQkJMCwKKwkJCSZzdWJzY3JpYmVyLT5wb3J0X3JlZik7CisJaWYgKHN1YnNjcmliZXItPnBvcnRfcmVmID09IDApIHsKKwkJd2FybigiTWVtb3J5IHNxdWVlemU7IGZhaWxlZCB0byBjcmVhdGUgc3Vic2NyaXB0aW9uIHBvcnRcbiIpOworCQl0aXBjX3JlZl9kaXNjYXJkKHN1YnNjcmliZXItPnJlZik7CisJCWtmcmVlKHN1YnNjcmliZXIpOworCQlyZXR1cm47CisJfQorCXRpcGNfY29ubmVjdDJwb3J0KHN1YnNjcmliZXItPnBvcnRfcmVmLCBvcmlnKTsKKworCisJLyogQWRkIHN1YnNjcmliZXIgdG8gdG9wb2xvZ3kgc2VydmVyJ3Mgc3Vic2NyaWJlciBsaXN0ICovCisKKwl0aXBjX3JlZl9sb2NrKHN1YnNjcmliZXItPnJlZik7CisJc3Bpbl9sb2NrX2JoKCZ0b3BzcnYubG9jayk7CisJbGlzdF9hZGQoJnN1YnNjcmliZXItPnN1YnNjcmliZXJfbGlzdCwgJnRvcHNydi5zdWJzY3JpYmVyX2xpc3QpOworCXNwaW5fdW5sb2NrX2JoKCZ0b3BzcnYubG9jayk7CisKKwkvKgorCSAqIFN1YnNjcmliZSBub3cgaWYgbWVzc2FnZSBjb250YWlucyBhIHN1YnNjcmlwdGlvbiwKKwkgKiBvdGhlcndpc2Ugc2VuZCBhbiBlbXB0eSByZXNwb25zZSB0byBjb21wbGV0ZSBjb25uZWN0aW9uIGhhbmRzaGFraW5nCisJICovCisKKwlzdWJzY3JpYmVyX2xvY2sgPSBzdWJzY3JpYmVyLT5sb2NrOworCWlmIChzaXplKQorCQlzdWJzY3Jfc3Vic2NyaWJlKChzdHJ1Y3QgdGlwY19zdWJzY3IgKilkYXRhLCBzdWJzY3JpYmVyKTsKKwllbHNlCisJCXRpcGNfc2VuZChzdWJzY3JpYmVyLT5wb3J0X3JlZiwgMSwgJm1zZ19zZWN0KTsKKworCXNwaW5fdW5sb2NrX2JoKHN1YnNjcmliZXJfbG9jayk7Cit9CisKK2ludCB0aXBjX3N1YnNjcl9zdGFydCh2b2lkKQoreworCXN0cnVjdCB0aXBjX25hbWVfc2VxIHNlcSA9IHtUSVBDX1RPUF9TUlYsIFRJUENfVE9QX1NSViwgVElQQ19UT1BfU1JWfTsKKwlpbnQgcmVzID0gLTE7CisKKwltZW1zZXQoJnRvcHNydiwgMCwgc2l6ZW9mICh0b3BzcnYpKTsKKwl0b3BzcnYubG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKwlJTklUX0xJU1RfSEVBRCgmdG9wc3J2LnN1YnNjcmliZXJfbGlzdCk7CisKKwlzcGluX2xvY2tfYmgoJnRvcHNydi5sb2NrKTsKKwlyZXMgPSB0aXBjX2F0dGFjaCgmdG9wc3J2LnVzZXJfcmVmLCAwLCAwKTsKKwlpZiAocmVzKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZ0b3BzcnYubG9jayk7CisJCXJldHVybiByZXM7CisJfQorCisgCXJlcyA9IHRpcGNfY3JlYXRlcG9ydCh0b3BzcnYudXNlcl9yZWYsCisgCQkJICAgICAgMCwKKyAJCQkgICAgICBUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0UsCisgCQkJICAgICAgMCwKKyAJCQkgICAgICAwLAorIAkJCSAgICAgIDAsCisgCQkJICAgICAgMCwKKyAJCQkgICAgICBzdWJzY3JfbmFtZWRfbXNnX2V2ZW50LAorIAkJCSAgICAgIDAsCisgCQkJICAgICAgMCwKKyAJCQkgICAgICAmdG9wc3J2LnNldHVwX3BvcnQpOworIAlpZiAocmVzKQorCQlnb3RvIGZhaWxlZDsKKworIAlyZXMgPSB0aXBjX25hbWV0YmxfcHVibGlzaF9yc3YodG9wc3J2LnNldHVwX3BvcnQsIFRJUENfTk9ERV9TQ09QRSwgJnNlcSk7CisgCWlmIChyZXMpCisJCWdvdG8gZmFpbGVkOworCisJc3Bpbl91bmxvY2tfYmgoJnRvcHNydi5sb2NrKTsKKwlyZXR1cm4gMDsKKworZmFpbGVkOgorCWVycigiRmFpbGVkIHRvIGNyZWF0ZSBzdWJzY3JpcHRpb24gc2VydmljZVxuIik7CisJdGlwY19kZXRhY2godG9wc3J2LnVzZXJfcmVmKTsKKwl0b3BzcnYudXNlcl9yZWYgPSAwOworCXNwaW5fdW5sb2NrX2JoKCZ0b3BzcnYubG9jayk7CisJcmV0dXJuIHJlczsKK30KKwordm9pZCB0aXBjX3N1YnNjcl9zdG9wKHZvaWQpCit7CisJc3RydWN0IHN1YnNjcmliZXIgKnN1YnNjcmliZXI7CisJc3RydWN0IHN1YnNjcmliZXIgKnN1YnNjcmliZXJfdGVtcDsKKwlzcGlubG9ja190ICpzdWJzY3JpYmVyX2xvY2s7CisKKwlpZiAodG9wc3J2LnVzZXJfcmVmKSB7CisJCXRpcGNfZGVsZXRlcG9ydCh0b3BzcnYuc2V0dXBfcG9ydCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzdWJzY3JpYmVyLCBzdWJzY3JpYmVyX3RlbXAsIAorCQkJCQkgJnRvcHNydi5zdWJzY3JpYmVyX2xpc3QsCisJCQkJCSBzdWJzY3JpYmVyX2xpc3QpIHsKKwkJCXRpcGNfcmVmX2xvY2soc3Vic2NyaWJlci0+cmVmKTsKKwkJCXN1YnNjcmliZXJfbG9jayA9IHN1YnNjcmliZXItPmxvY2s7CisJCQlzdWJzY3JfdGVybWluYXRlKHN1YnNjcmliZXIpOworCQkJc3Bpbl91bmxvY2tfYmgoc3Vic2NyaWJlcl9sb2NrKTsKKwkJfQorCQl0aXBjX2RldGFjaCh0b3BzcnYudXNlcl9yZWYpOworCQl0b3BzcnYudXNlcl9yZWYgPSAwOworCX0KK30KKworCitpbnQgdGlwY19pc3B1Ymxpc2hlZChzdHJ1Y3QgdGlwY19uYW1lIGNvbnN0ICpuYW1lKQoreworCXUzMiBkb21haW4gPSAwOworCisJcmV0dXJuKHRpcGNfbmFtZXRibF90cmFuc2xhdGUobmFtZS0+dHlwZSwgbmFtZS0+aW5zdGFuY2UsJmRvbWFpbikgIT0gMCk7Cit9CisKZGlmZiAtLWdpdCBhL25ldC90aXBjL3N1YnNjci5oIGIvbmV0L3RpcGMvc3Vic2NyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU1MDkwNAotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL3N1YnNjci5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBuZXQvdGlwYy9zdWJzY3IuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIHN1YnNjcmlwdGlvbiBzZXJ2aWNlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfU1VCU0NSX0gKKyNkZWZpbmUgX1RJUENfU1VCU0NSX0gKKworLyoqCisgKiBzdHJ1Y3Qgc3Vic2NyaXB0aW9uIC0gVElQQyBuZXR3b3JrIHRvcG9sb2d5IHN1YnNjcmlwdGlvbiBvYmplY3QKKyAqIEBzZXE6IG5hbWUgc2VxdWVuY2UgYXNzb2NpYXRlZCB3aXRoIHN1YnNjcmlwdGlvbgorICogQHRpbWVvdXQ6IGR1cmF0aW9uIG9mIHN1YnNjcmlwdGlvbiAoaW4gbXMpCisgKiBAZmlsdGVyOiBldmVudCBmaWx0ZXJpbmcgdG8gYmUgZG9uZSBmb3Igc3Vic2NyaXB0aW9uCisgKiBAZXZ0OiB0ZW1wbGF0ZSBmb3IgZXZlbnRzIGdlbmVyYXRlZCBieSBzdWJzY3JpcHRpb24KKyAqIEBzdWJzY3JpcHRpb25fbGlzdDogYWRqYWNlbnQgc3Vic2NyaXB0aW9ucyBpbiBzdWJzY3JpYmVyJ3Mgc3Vic2NyaXB0aW9uIGxpc3QKKyAqIEBuYW1lc2VxX2xpc3Q6IGFkamFjZW50IHN1YnNjcmlwdGlvbnMgaW4gbmFtZSBzZXF1ZW5jZSdzIHN1YnNjcmlwdGlvbiBsaXN0CisgKiBAdGltZXJfcmVmOiByZWZlcmVuY2UgdG8gdGltZXIgZ292ZXJuaW5nIHN1YnNjcmlwdGlvbiBkdXJhdGlvbiAobWF5IGJlIE5VTEwpCisgKiBAb3duZXI6IHBvaW50ZXIgdG8gc3Vic2NyaWJlciBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3Vic2NyaXB0aW9uCisgKi8KKyAKK3N0cnVjdCBzdWJzY3JpcHRpb24geworCXN0cnVjdCB0aXBjX25hbWVfc2VxIHNlcTsKKwl1MzIgdGltZW91dDsKKwl1MzIgZmlsdGVyOworCXN0cnVjdCB0aXBjX2V2ZW50IGV2dDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN1YnNjcmlwdGlvbl9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgbmFtZXNlcV9saXN0OworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCXN0cnVjdCBzdWJzY3JpYmVyICpvd25lcjsKK307CisKK2ludCB0aXBjX3N1YnNjcl9vdmVybGFwKHN0cnVjdCBzdWJzY3JpcHRpb24gKiBzdWIsIAorCQkJdTMyIGZvdW5kX2xvd2VyLCAKKwkJCXUzMiBmb3VuZF91cHBlcik7CisKK3ZvaWQgdGlwY19zdWJzY3JfcmVwb3J0X292ZXJsYXAoc3RydWN0IHN1YnNjcmlwdGlvbiAqIHN1YiwgCisJCQkJdTMyIGZvdW5kX2xvd2VyLCAKKwkJCQl1MzIgZm91bmRfdXBwZXIsCisJCQkJdTMyIGV2ZW50LCAKKwkJCQl1MzIgcG9ydF9yZWYsIAorCQkJCXUzMiBub2RlLAorCQkJCWludCBtdXN0X3JlcG9ydCk7CisKK2ludCB0aXBjX3N1YnNjcl9zdGFydCh2b2lkKTsKKwordm9pZCB0aXBjX3N1YnNjcl9zdG9wKHZvaWQpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvdXNlcl9yZWcuYyBiL25ldC90aXBjL3VzZXJfcmVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2MjAwZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL3VzZXJfcmVnLmMKQEAgLTAsMCArMSwyNjUgQEAKKy8qCisgKiBuZXQvdGlwYy91c2VyX3JlZy5jOiBUSVBDIHVzZXIgcmVnaXN0cnkgY29kZQorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAidXNlcl9yZWcuaCIKKworLyoKKyAqIFRJUEMgdXNlciByZWdpc3RyeSBrZWVwcyB0cmFjayBvZiB1c2VycyBvZiB0aGUgdGlwY19wb3J0IGludGVyZmFjZS4KKyAqCisgKiBUaGUgcmVnaXN0cnkgdXRpbGl6ZXMgYW4gYXJyYXkgb2YgIlRJUEMgdXNlciIgZW50cmllczsgCisgKiBhIHVzZXIncyBJRCBpcyB0aGUgaW5kZXggb2YgdGhlaXIgYXNzb2NpYXRlZCBhcnJheSBlbnRyeS4KKyAqIEFycmF5IGVudHJ5IDAgaXMgbm90IHVzZWQsIHNvIHVzZXJpZCAwIGlzIG5vdCB2YWxpZDsKKyAqIFRJUEMgc29tZXRpbWVzIHVzZXMgdGhpcyB2YWx1ZSB0byBkZW5vdGUgYW4gYW5vbnltb3VzIHVzZXIuCisgKiBUaGUgbGlzdCBvZiBmcmVlIGVudHJpZXMgaXMgaW5pdGlhbGx5IGNoYWluZWQgZnJvbSBsYXN0IGVudHJ5IHRvIGVudHJ5IDEuCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgdGlwY191c2VyIC0gcmVnaXN0ZXJlZCBUSVBDIHVzZXIgaW5mbworICogQG5leHQ6IGluZGV4IG9mIG5leHQgZnJlZSByZWdpc3RyeSBlbnRyeSAob3IgLTEgZm9yIGFuIGFsbG9jYXRlZCBlbnRyeSkKKyAqIEBjYWxsYmFjazogcHRyIHRvIHJvdXRpbmUgdG8gY2FsbCB3aGVuIFRJUEMgbW9kZSBjaGFuZ2VzIChOVUxMIGlmIG5vbmUpCisgKiBAdXNyX2hhbmRsZTogdXNlci1kZWZpbmVkIHZhbHVlIHBhc3NlZCB0byBjYWxsYmFjayByb3V0aW5lIAorICogQHBvcnRzOiBsaXN0IG9mIHVzZXIgcG9ydHMgb3duZWQgYnkgdGhlIHVzZXIKKyAqLworCitzdHJ1Y3QgdGlwY191c2VyIHsKKwlpbnQgbmV4dDsKKwl0aXBjX21vZGVfZXZlbnQgY2FsbGJhY2s7CisJdm9pZCAqdXNyX2hhbmRsZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHBvcnRzOworfTsKKworI2RlZmluZSBNQVhfVVNFUklEIDY0CisjZGVmaW5lIFVTRVJfTElTVF9TSVpFICgoTUFYX1VTRVJJRCArIDEpICogc2l6ZW9mKHN0cnVjdCB0aXBjX3VzZXIpKQorCitzdGF0aWMgc3RydWN0IHRpcGNfdXNlciAqdXNlcnMgPSAwOworc3RhdGljIHUzMiBuZXh0X2ZyZWVfdXNlciA9IE1BWF9VU0VSSUQgKyAxOworc3RhdGljIHNwaW5sb2NrX3QgcmVnX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CisKKy8qKgorICogcmVnX2luaXQgLSBjcmVhdGUgVElQQyB1c2VyIHJlZ2lzdHJ5IChidXQgZG9uJ3QgYWN0aXZhdGUgaXQpCisgKiAKKyAqIElmIHJlZ2lzdHJ5IGhhcyBiZWVuIHByZS1pbml0aWFsaXplZCBpdCBpcyBsZWZ0ICJhcyBpcyIuCisgKiBOT1RFOiBUaGlzIHJvdXRpbmUgbWF5IGJlIGNhbGxlZCB3aGVuIFRJUEMgaXMgaW5hY3RpdmUuCisgKi8KKworc3RhdGljIGludCByZWdfaW5pdCh2b2lkKQoreworCXUzMiBpOworCQorCXNwaW5fbG9ja19iaCgmcmVnX2xvY2spOworCWlmICghdXNlcnMpIHsKKwkJdXNlcnMgPSAoc3RydWN0IHRpcGNfdXNlciAqKWttYWxsb2MoVVNFUl9MSVNUX1NJWkUsIEdGUF9BVE9NSUMpOworCQlpZiAodXNlcnMpIHsKKwkJCW1lbXNldCh1c2VycywgMCwgVVNFUl9MSVNUX1NJWkUpOworCQkJZm9yIChpID0gMTsgaSA8PSBNQVhfVVNFUklEOyBpKyspIHsKKwkJCQl1c2Vyc1tpXS5uZXh0ID0gaSAtIDE7CisJCQl9CisJCQluZXh0X2ZyZWVfdXNlciA9IE1BWF9VU0VSSUQ7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJnJlZ19sb2NrKTsKKwlyZXR1cm4gdXNlcnMgPyBUSVBDX09LIDogLUVOT01FTTsKK30KKworLyoqCisgKiByZWdfY2FsbGJhY2sgLSBpbmZvcm0gVElQQyB1c2VyIGFib3V0IGN1cnJlbnQgb3BlcmF0aW5nIG1vZGUKKyAqLworCitzdGF0aWMgdm9pZCByZWdfY2FsbGJhY2soc3RydWN0IHRpcGNfdXNlciAqdXNlcl9wdHIpCit7CisJdGlwY19tb2RlX2V2ZW50IGNiOworCXZvaWQgKmFyZzsKKworCXNwaW5fbG9ja19iaCgmcmVnX2xvY2spOworCWNiID0gdXNlcl9wdHItPmNhbGxiYWNrOworCWFyZyA9IHVzZXJfcHRyLT51c3JfaGFuZGxlOworCXNwaW5fdW5sb2NrX2JoKCZyZWdfbG9jayk7CisKKwlpZiAoY2IpCisJCWNiKGFyZywgdGlwY19tb2RlLCB0aXBjX293bl9hZGRyKTsKK30KKworLyoqCisgKiB0aXBjX3JlZ19zdGFydCAtIGFjdGl2YXRlIFRJUEMgdXNlciByZWdpc3RyeQorICovCisKK2ludCB0aXBjX3JlZ19zdGFydCh2b2lkKQoreworCXUzMiB1OworCWludCByZXM7CisKKwlpZiAoKHJlcyA9IHJlZ19pbml0KCkpKQorCQlyZXR1cm4gcmVzOworCisJZm9yICh1ID0gMTsgdSA8PSBNQVhfVVNFUklEOyB1KyspIHsKKwkJaWYgKHVzZXJzW3VdLmNhbGxiYWNrKQorCQkJdGlwY19rX3NpZ25hbCgoSGFuZGxlcilyZWdfY2FsbGJhY2ssCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpJnVzZXJzW3VdKTsKKwl9CisJcmV0dXJuIFRJUENfT0s7Cit9CisKKy8qKgorICogdGlwY19yZWdfc3RvcCAtIHNodXQgZG93biAmIGRlbGV0ZSBUSVBDIHVzZXIgcmVnaXN0cnkKKyAqLworCit2b2lkIHRpcGNfcmVnX3N0b3Aodm9pZCkKK3sgICAgICAgICAgICAgICAKKwlpbnQgaWQ7CisKKwlpZiAoIXVzZXJzKQorCQlyZXR1cm47CisKKwlmb3IgKGlkID0gMTsgaWQgPD0gTUFYX1VTRVJJRDsgaWQrKykgeworCQlpZiAodXNlcnNbaWRdLmNhbGxiYWNrKQorCQkJcmVnX2NhbGxiYWNrKCZ1c2Vyc1tpZF0pOworCX0KKwlrZnJlZSh1c2Vycyk7CisJdXNlcnMgPSAwOworfQorCisvKioKKyAqIHRpcGNfYXR0YWNoIC0gcmVnaXN0ZXIgYSBUSVBDIHVzZXIKKyAqCisgKiBOT1RFOiBUaGlzIHJvdXRpbmUgbWF5IGJlIGNhbGxlZCB3aGVuIFRJUEMgaXMgaW5hY3RpdmUuCisgKi8KKworaW50IHRpcGNfYXR0YWNoKHUzMiAqdXNlcmlkLCB0aXBjX21vZGVfZXZlbnQgY2IsIHZvaWQgKnVzcl9oYW5kbGUpCit7CisJc3RydWN0IHRpcGNfdXNlciAqdXNlcl9wdHI7CisKKwlpZiAoKHRpcGNfbW9kZSA9PSBUSVBDX05PVF9SVU5OSU5HKSAmJiAhY2IpCisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJaWYgKCF1c2VycykKKwkJcmVnX2luaXQoKTsKKworCXNwaW5fbG9ja19iaCgmcmVnX2xvY2spOworCWlmICghbmV4dF9mcmVlX3VzZXIpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJnJlZ19sb2NrKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJdXNlcl9wdHIgPSAmdXNlcnNbbmV4dF9mcmVlX3VzZXJdOworCSp1c2VyaWQgPSBuZXh0X2ZyZWVfdXNlcjsKKwluZXh0X2ZyZWVfdXNlciA9IHVzZXJfcHRyLT5uZXh0OworCXVzZXJfcHRyLT5uZXh0ID0gLTE7IAorCXNwaW5fdW5sb2NrX2JoKCZyZWdfbG9jayk7CisKKwl1c2VyX3B0ci0+Y2FsbGJhY2sgPSBjYjsKKwl1c2VyX3B0ci0+dXNyX2hhbmRsZSA9IHVzcl9oYW5kbGU7CisJSU5JVF9MSVNUX0hFQUQoJnVzZXJfcHRyLT5wb3J0cyk7CisJYXRvbWljX2luYygmdGlwY191c2VyX2NvdW50KTsKKwkKKwlpZiAoY2IgJiYgKHRpcGNfbW9kZSAhPSBUSVBDX05PVF9SVU5OSU5HKSkKKwkJdGlwY19rX3NpZ25hbCgoSGFuZGxlcilyZWdfY2FsbGJhY2ssICh1bnNpZ25lZCBsb25nKXVzZXJfcHRyKTsKKwlyZXR1cm4gVElQQ19PSzsKK30KKworLyoqCisgKiB0aXBjX2RldGFjaCAtIGRlcmVnaXN0ZXIgYSBUSVBDIHVzZXIKKyAqLworCit2b2lkIHRpcGNfZGV0YWNoKHUzMiB1c2VyaWQpCit7CisJc3RydWN0IHRpcGNfdXNlciAqdXNlcl9wdHI7CisJc3RydWN0IGxpc3RfaGVhZCBwb3J0c190ZW1wOworCXN0cnVjdCB1c2VyX3BvcnQgKnVwX3B0ciwgKnRlbXBfdXBfcHRyOworCisJaWYgKCh1c2VyaWQgPT0gMCkgfHwgKHVzZXJpZCA+IE1BWF9VU0VSSUQpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfYmgoJnJlZ19sb2NrKTsKKwlpZiAoKCF1c2VycykgfHwgKHVzZXJzW3VzZXJpZF0ubmV4dCA+PSAwKSkgeworCQlzcGluX3VubG9ja19iaCgmcmVnX2xvY2spOworCQlyZXR1cm47CisJfQorCisJdXNlcl9wdHIgPSAmdXNlcnNbdXNlcmlkXTsKKyAgICAgICAgdXNlcl9wdHItPmNhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICAgIAorCUlOSVRfTElTVF9IRUFEKCZwb3J0c190ZW1wKTsKKyAgICAgICAgbGlzdF9zcGxpY2UoJnVzZXJfcHRyLT5wb3J0cywgJnBvcnRzX3RlbXApOworCXVzZXJfcHRyLT5uZXh0ID0gbmV4dF9mcmVlX3VzZXI7CisJbmV4dF9mcmVlX3VzZXIgPSB1c2VyaWQ7CisJc3Bpbl91bmxvY2tfYmgoJnJlZ19sb2NrKTsKKworCWF0b21pY19kZWMoJnRpcGNfdXNlcl9jb3VudCk7CisKKyAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHVwX3B0ciwgdGVtcF91cF9wdHIsICZwb3J0c190ZW1wLCB1cG9ydF9saXN0KSB7CisJCXRpcGNfZGVsZXRlcG9ydCh1cF9wdHItPnJlZik7CisJfQorfQorCisvKioKKyAqIHRpcGNfcmVnX2FkZF9wb3J0IC0gcmVnaXN0ZXIgYSB1c2VyJ3MgZHJpdmVyIHBvcnQKKyAqLworCitpbnQgdGlwY19yZWdfYWRkX3BvcnQoc3RydWN0IHVzZXJfcG9ydCAqdXBfcHRyKQoreworCXN0cnVjdCB0aXBjX3VzZXIgKnVzZXJfcHRyOworCisJaWYgKHVwX3B0ci0+dXNlcl9yZWYgPT0gMCkKKwkJcmV0dXJuIFRJUENfT0s7CisJaWYgKHVwX3B0ci0+dXNlcl9yZWYgPiBNQVhfVVNFUklEKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoKHRpcGNfbW9kZSA9PSBUSVBDX05PVF9SVU5OSU5HKSB8fCAhdXNlcnMgKQorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCisJc3Bpbl9sb2NrX2JoKCZyZWdfbG9jayk7CisJdXNlcl9wdHIgPSAmdXNlcnNbdXBfcHRyLT51c2VyX3JlZl07CisJbGlzdF9hZGQoJnVwX3B0ci0+dXBvcnRfbGlzdCwgJnVzZXJfcHRyLT5wb3J0cyk7CisJc3Bpbl91bmxvY2tfYmgoJnJlZ19sb2NrKTsKKwlyZXR1cm4gVElQQ19PSzsKK30KKworLyoqCisgKiB0aXBjX3JlZ19yZW1vdmVfcG9ydCAtIGRlcmVnaXN0ZXIgYSB1c2VyJ3MgZHJpdmVyIHBvcnQKKyAqLworCitpbnQgdGlwY19yZWdfcmVtb3ZlX3BvcnQoc3RydWN0IHVzZXJfcG9ydCAqdXBfcHRyKQoreworCWlmICh1cF9wdHItPnVzZXJfcmVmID09IDApCisJCXJldHVybiBUSVBDX09LOworCWlmICh1cF9wdHItPnVzZXJfcmVmID4gTUFYX1VTRVJJRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCF1c2VycyApCisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisKKwlzcGluX2xvY2tfYmgoJnJlZ19sb2NrKTsKKwlsaXN0X2RlbF9pbml0KCZ1cF9wdHItPnVwb3J0X2xpc3QpOworCXNwaW5fdW5sb2NrX2JoKCZyZWdfbG9jayk7CisJcmV0dXJuIFRJUENfT0s7Cit9CisKZGlmZiAtLWdpdCBhL25ldC90aXBjL3VzZXJfcmVnLmggYi9uZXQvdGlwYy91c2VyX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZTg4NzkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy91c2VyX3JlZy5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBuZXQvdGlwYy91c2VyX3JlZy5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgdXNlciByZWdpc3RyeSBjb2RlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfVVNFUl9SRUdfSAorI2RlZmluZSBfVElQQ19VU0VSX1JFR19ICisKKyNpbmNsdWRlICJwb3J0LmgiCisKK2ludCB0aXBjX3JlZ19zdGFydCh2b2lkKTsKK3ZvaWQgdGlwY19yZWdfc3RvcCh2b2lkKTsKKworaW50IHRpcGNfcmVnX2FkZF9wb3J0KHN0cnVjdCB1c2VyX3BvcnQgKnVwX3B0cik7CitpbnQgdGlwY19yZWdfcmVtb3ZlX3BvcnQoc3RydWN0IHVzZXJfcG9ydCAqdXBfcHRyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy96b25lLmMgYi9uZXQvdGlwYy96b25lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MxMWY3ZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL3pvbmUuYwpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIG5ldC90aXBjL3pvbmUuYzogVElQQyB6b25lIG1hbmFnZW1lbnQgcm91dGluZXMKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJ6b25lLmgiCisjaW5jbHVkZSAibmV0LmgiCisjaW5jbHVkZSAiYWRkci5oIgorI2luY2x1ZGUgIm5vZGVfc3Vic2NyLmgiCisjaW5jbHVkZSAiY2x1c3Rlci5oIgorI2luY2x1ZGUgIm5vZGUuaCIKKworc3RydWN0IF96b25lICp0aXBjX3pvbmVfY3JlYXRlKHUzMiBhZGRyKQoreworCXN0cnVjdCBfem9uZSAqel9wdHIgPSAwOworCXUzMiB6X251bTsKKworCWlmICghdGlwY19hZGRyX2RvbWFpbl92YWxpZChhZGRyKSkKKwkJcmV0dXJuIDA7CisKKwl6X3B0ciA9IChzdHJ1Y3QgX3pvbmUgKilrbWFsbG9jKHNpemVvZigqel9wdHIpLCBHRlBfQVRPTUlDKTsKKwlpZiAoel9wdHIgIT0gTlVMTCkgeworCQltZW1zZXQoel9wdHIsIDAsIHNpemVvZigqel9wdHIpKTsKKwkJel9udW0gPSB0aXBjX3pvbmUoYWRkcik7CisJCXpfcHRyLT5hZGRyID0gdGlwY19hZGRyKHpfbnVtLCAwLCAwKTsKKwkJdGlwY19uZXQuem9uZXNbel9udW1dID0gel9wdHI7CisJfQorCXJldHVybiB6X3B0cjsKK30KKwordm9pZCB0aXBjX3pvbmVfZGVsZXRlKHN0cnVjdCBfem9uZSAqel9wdHIpCit7CisJdTMyIGNfbnVtOworCisJaWYgKCF6X3B0cikKKwkJcmV0dXJuOworCWZvciAoY19udW0gPSAxOyBjX251bSA8PSB0aXBjX21heF9jbHVzdGVyczsgY19udW0rKykgeworCQl0aXBjX2NsdHJfZGVsZXRlKHpfcHRyLT5jbHVzdGVyc1tjX251bV0pOworCX0KKwlrZnJlZSh6X3B0cik7Cit9CisKK3ZvaWQgdGlwY196b25lX2F0dGFjaF9jbHVzdGVyKHN0cnVjdCBfem9uZSAqel9wdHIsIHN0cnVjdCBjbHVzdGVyICpjX3B0cikKK3sKKwl1MzIgY19udW0gPSB0aXBjX2NsdXN0ZXIoY19wdHItPmFkZHIpOworCisJYXNzZXJ0KGNfcHRyLT5hZGRyKTsKKwlhc3NlcnQoY19udW0gPD0gdGlwY19tYXhfY2x1c3RlcnMpOworCWFzc2VydCh6X3B0ci0+Y2x1c3RlcnNbY19udW1dID09IDApOworCXpfcHRyLT5jbHVzdGVyc1tjX251bV0gPSBjX3B0cjsKK30KKwordm9pZCB0aXBjX3pvbmVfcmVtb3ZlX2FzX3JvdXRlcihzdHJ1Y3QgX3pvbmUgKnpfcHRyLCB1MzIgcm91dGVyKQoreworCXUzMiBjX251bTsKKworCWZvciAoY19udW0gPSAxOyBjX251bSA8PSB0aXBjX21heF9jbHVzdGVyczsgY19udW0rKykgeworCQlpZiAoel9wdHItPmNsdXN0ZXJzW2NfbnVtXSkgeworCQkJdGlwY19jbHRyX3JlbW92ZV9hc19yb3V0ZXIoel9wdHItPmNsdXN0ZXJzW2NfbnVtXSwgCisJCQkJCQkgICByb3V0ZXIpOworCQl9CisJfQorfQorCit2b2lkIHRpcGNfem9uZV9zZW5kX2V4dGVybmFsX3JvdXRlcyhzdHJ1Y3QgX3pvbmUgKnpfcHRyLCB1MzIgZGVzdCkKK3sKKwl1MzIgY19udW07CisKKwlmb3IgKGNfbnVtID0gMTsgY19udW0gPD0gdGlwY19tYXhfY2x1c3RlcnM7IGNfbnVtKyspIHsKKwkJaWYgKHpfcHRyLT5jbHVzdGVyc1tjX251bV0pIHsKKwkJCWlmIChpbl9vd25fY2x1c3Rlcih6X3B0ci0+YWRkcikpCisJCQkJY29udGludWU7CisJCQl0aXBjX2NsdHJfc2VuZF9leHRfcm91dGVzKHpfcHRyLT5jbHVzdGVyc1tjX251bV0sIGRlc3QpOworCQl9CisJfQorfQorCitzdHJ1Y3Qgbm9kZSAqdGlwY196b25lX3NlbGVjdF9yZW1vdGVfbm9kZShzdHJ1Y3QgX3pvbmUgKnpfcHRyLCB1MzIgYWRkciwgdTMyIHJlZikKK3sKKwlzdHJ1Y3QgY2x1c3RlciAqY19wdHI7CisJc3RydWN0IG5vZGUgKm5fcHRyOworCXUzMiBjX251bTsKKworCWlmICghel9wdHIpCisJCXJldHVybiAwOworCWNfcHRyID0gel9wdHItPmNsdXN0ZXJzW3RpcGNfY2x1c3RlcihhZGRyKV07CisJaWYgKCFjX3B0cikKKwkJcmV0dXJuIDA7CisJbl9wdHIgPSB0aXBjX2NsdHJfc2VsZWN0X25vZGUoY19wdHIsIHJlZik7CisJaWYgKG5fcHRyKQorCQlyZXR1cm4gbl9wdHI7CisKKwkvKiBMaW5rcyB0byBhbnkgb3RoZXIgY2x1c3RlcnMgd2l0aGluIHRoaXMgem9uZSA/ICovCisJZm9yIChjX251bSA9IDE7IGNfbnVtIDw9IHRpcGNfbWF4X2NsdXN0ZXJzOyBjX251bSsrKSB7CisJCWNfcHRyID0gel9wdHItPmNsdXN0ZXJzW2NfbnVtXTsKKwkJaWYgKCFjX3B0cikKKwkJCXJldHVybiAwOworCQluX3B0ciA9IHRpcGNfY2x0cl9zZWxlY3Rfbm9kZShjX3B0ciwgcmVmKTsKKwkJaWYgKG5fcHRyKQorCQkJcmV0dXJuIG5fcHRyOworCX0KKwlyZXR1cm4gMDsKK30KKwordTMyIHRpcGNfem9uZV9zZWxlY3Rfcm91dGVyKHN0cnVjdCBfem9uZSAqel9wdHIsIHUzMiBhZGRyLCB1MzIgcmVmKQoreworCXN0cnVjdCBjbHVzdGVyICpjX3B0cjsKKwl1MzIgY19udW07CisJdTMyIHJvdXRlcjsKKworCWlmICghel9wdHIpCisJCXJldHVybiAwOworCWNfcHRyID0gel9wdHItPmNsdXN0ZXJzW3RpcGNfY2x1c3RlcihhZGRyKV07CisJcm91dGVyID0gY19wdHIgPyB0aXBjX2NsdHJfc2VsZWN0X3JvdXRlcihjX3B0ciwgcmVmKSA6IDA7CisJaWYgKHJvdXRlcikKKwkJcmV0dXJuIHJvdXRlcjsKKworCS8qIExpbmtzIHRvIGFueSBvdGhlciBjbHVzdGVycyB3aXRoaW4gdGhlIHpvbmU/ICovCisJZm9yIChjX251bSA9IDE7IGNfbnVtIDw9IHRpcGNfbWF4X2NsdXN0ZXJzOyBjX251bSsrKSB7CisJCWNfcHRyID0gel9wdHItPmNsdXN0ZXJzW2NfbnVtXTsKKwkJcm91dGVyID0gY19wdHIgPyB0aXBjX2NsdHJfc2VsZWN0X3JvdXRlcihjX3B0ciwgcmVmKSA6IDA7CisJCWlmIChyb3V0ZXIpCisJCQlyZXR1cm4gcm91dGVyOworCX0KKwlyZXR1cm4gMDsKK30KKworCit1MzIgdGlwY196b25lX25leHRfbm9kZSh1MzIgYWRkcikKK3sKKwlzdHJ1Y3QgY2x1c3RlciAqY19wdHIgPSB0aXBjX2NsdHJfZmluZChhZGRyKTsKKworCWlmIChjX3B0cikKKwkJcmV0dXJuIHRpcGNfY2x0cl9uZXh0X25vZGUoY19wdHIsIGFkZHIpOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9uZXQvdGlwYy96b25lLmggYi9uZXQvdGlwYy96b25lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY3OTk5YwotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL3pvbmUuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogbmV0L3RpcGMvem9uZS5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgem9uZSBtYW5hZ2VtZW50IHJvdXRpbmVzCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1RJUENfWk9ORV9ICisjZGVmaW5lIF9USVBDX1pPTkVfSAorCisjaW5jbHVkZSAibm9kZV9zdWJzY3IuaCIKKyNpbmNsdWRlICJuZXQuaCIKKworCisvKioKKyAqIHN0cnVjdCBfem9uZSAtIFRJUEMgem9uZSBzdHJ1Y3R1cmUKKyAqIEBhZGRyOiBuZXR3b3JrIGFkZHJlc3Mgb2Ygem9uZQorICogQGNsdXN0ZXJzOiBhcnJheSBvZiBwb2ludGVycyB0byBhbGwgY2x1c3RlcnMgd2l0aGluIHpvbmUKKyAqIEBsaW5rczogKHVzZWQgZm9yIGludGVyLXpvbmUgY29tbXVuaWNhdGlvbikKKyAqLworIAorc3RydWN0IF96b25lIHsKKwl1MzIgYWRkcjsKKwlzdHJ1Y3QgY2x1c3RlciAqY2x1c3RlcnNbMl07IC8qIGN1cnJlbnRseSBsaW1pdGVkIHRvIGp1c3QgMSBjbHVzdGVyICovCisJdTMyIGxpbmtzOworfTsKKworc3RydWN0IG5vZGUgKnRpcGNfem9uZV9zZWxlY3RfcmVtb3RlX25vZGUoc3RydWN0IF96b25lICp6X3B0ciwgdTMyIGFkZHIsIHUzMiByZWYpOwordTMyIHRpcGNfem9uZV9zZWxlY3Rfcm91dGVyKHN0cnVjdCBfem9uZSAqel9wdHIsIHUzMiBhZGRyLCB1MzIgcmVmKTsKK3ZvaWQgdGlwY196b25lX3JlbW92ZV9hc19yb3V0ZXIoc3RydWN0IF96b25lICp6X3B0ciwgdTMyIHJvdXRlcik7Cit2b2lkIHRpcGNfem9uZV9zZW5kX2V4dGVybmFsX3JvdXRlcyhzdHJ1Y3QgX3pvbmUgKnpfcHRyLCB1MzIgZGVzdCk7CitzdHJ1Y3QgX3pvbmUgKnRpcGNfem9uZV9jcmVhdGUodTMyIGFkZHIpOwordm9pZCB0aXBjX3pvbmVfZGVsZXRlKHN0cnVjdCBfem9uZSAqel9wdHIpOwordm9pZCB0aXBjX3pvbmVfYXR0YWNoX2NsdXN0ZXIoc3RydWN0IF96b25lICp6X3B0ciwgc3RydWN0IGNsdXN0ZXIgKmNfcHRyKTsKK3UzMiB0aXBjX3pvbmVfbmV4dF9ub2RlKHUzMiBhZGRyKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgX3pvbmUgKnRpcGNfem9uZV9maW5kKHUzMiBhZGRyKQoreworCXJldHVybiB0aXBjX25ldC56b25lc1t0aXBjX3pvbmUoYWRkcildOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC91bml4L2FmX3VuaXguYyBiL25ldC91bml4L2FmX3VuaXguYwppbmRleCA1ZjZhZTc5Li4xYjU5ODliIDEwMDY0NAotLS0gYS9uZXQvdW5peC9hZl91bml4LmMKKysrIGIvbmV0L3VuaXgvYWZfdW5peC5jCkBAIC03ODQsNyArNzg0LDcgQEAKIAkJZXJyID0gdmZzX21rbm9kKG5kLmRlbnRyeS0+ZF9pbm9kZSwgZGVudHJ5LCBtb2RlLCAwKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0X21rbm9kX2RwdXQ7Ci0JCXVwKCZuZC5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZuZC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCQlkcHV0KG5kLmRlbnRyeSk7CiAJCW5kLmRlbnRyeSA9IGRlbnRyeTsKIApAQCAtODIzLDcgKzgyMyw3IEBACiBvdXRfbWtub2RfZHB1dDoKIAlkcHV0KGRlbnRyeSk7CiBvdXRfbWtub2RfdW5sb2NrOgotCXVwKCZuZC5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwltdXRleF91bmxvY2soJm5kLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJcGF0aF9yZWxlYXNlKCZuZCk7CiBvdXRfbWtub2RfcGFyZW50OgogCWlmIChlcnI9PS1FRVhJU1QpCmRpZmYgLS1naXQgYS9uZXQvd2Fucm91dGVyL2FmX3dhbnBpcGUuYyBiL25ldC93YW5yb3V0ZXIvYWZfd2FucGlwZS5jCmluZGV4IDdhNDNhZTQuLjhiOWJmNGEgMTAwNjQ0Ci0tLSBhL25ldC93YW5yb3V0ZXIvYWZfd2FucGlwZS5jCisrKyBiL25ldC93YW5yb3V0ZXIvYWZfd2FucGlwZS5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW4uaD4KZGlmZiAtLWdpdCBhL25ldC93YW5yb3V0ZXIvd2FubWFpbi5jIGIvbmV0L3dhbnJvdXRlci93YW5tYWluLmMKaW5kZXggYmNmN2IzZi4uYzM0ODMzZCAxMDA2NDQKLS0tIGEvbmV0L3dhbnJvdXRlci93YW5tYWluLmMKKysrIGIvbmV0L3dhbnJvdXRlci93YW5tYWluLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgkvKiBvZmZzZXRvZigpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CS8qIHJldHVybiBjb2RlcyAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KZGlmZiAtLWdpdCBhL25ldC94MjUvYWZfeDI1LmMgYi9uZXQveDI1L2FmX3gyNS5jCmluZGV4IGJmYWJhZjkuLjcyYjZmZjMgMTAwNjQ0Ci0tLSBhL25ldC94MjUvYWZfeDI1LmMKKysrIGIvbmV0L3gyNS9hZl94MjUuYwpAQCAtMzcsNiArMzcsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fYWxnby5jIGIvbmV0L3hmcm0veGZybV9hbGdvLmMKaW5kZXggMmY0NTMxZi4uNmVkMzMwMiAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9hbGdvLmMKKysrIGIvbmV0L3hmcm0veGZybV9hbGdvLmMKQEAgLTU0MCw4ICs1NDAsNyBAQAogCQkJc3RhcnQgPSBlbmQ7CiAJCX0KIAl9Ci0JaWYgKGxlbikKLQkJQlVHKCk7CisJQlVHX09OKGxlbik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChza2JfaWN2X3dhbGspOwogCkBAIC02MTAsOCArNjA5LDcgQEAKIAkJCXN0YXJ0ID0gZW5kOwogCQl9CiAJfQotCWlmIChsZW4pCi0JCUJVRygpOworCUJVR19PTihsZW4pOwogCXJldHVybiBlbHQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChza2JfdG9fc2d2ZWMpOwpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9wb2xpY3kuYyBiL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKaW5kZXggNjRhNDQ3My4uMDc3YmJmOSAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9wb2xpY3kuYworKysgYi9uZXQveGZybS94ZnJtX3BvbGljeS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZXQveGZybS5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgpAQCAtMjQ3LDExICsyNDgsOSBAQAogCiB2b2lkIF9feGZybV9wb2xpY3lfZGVzdHJveShzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbGljeSkKIHsKLQlpZiAoIXBvbGljeS0+ZGVhZCkKLQkJQlVHKCk7CisJQlVHX09OKCFwb2xpY3ktPmRlYWQpOwogCi0JaWYgKHBvbGljeS0+YnVuZGxlcykKLQkJQlVHKCk7CisJQlVHX09OKHBvbGljeS0+YnVuZGxlcyk7CiAKIAlpZiAoZGVsX3RpbWVyKCZwb2xpY3ktPnRpbWVyKSkKIAkJQlVHKCk7CkBAIC05NTEsOCArOTUwLDggQEAKIAlyZXR1cm4gc3RhcnQ7CiB9CiAKLXN0YXRpYyBpbnQKLV9kZWNvZGVfc2Vzc2lvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZmxvd2kgKmZsLCB1bnNpZ25lZCBzaG9ydCBmYW1pbHkpCitpbnQKK3hmcm1fZGVjb2RlX3Nlc3Npb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGZsb3dpICpmbCwgdW5zaWduZWQgc2hvcnQgZmFtaWx5KQogewogCXN0cnVjdCB4ZnJtX3BvbGljeV9hZmluZm8gKmFmaW5mbyA9IHhmcm1fcG9saWN5X2dldF9hZmluZm8oZmFtaWx5KTsKIApAQCAtOTYzLDYgKzk2Miw3IEBACiAJeGZybV9wb2xpY3lfcHV0X2FmaW5mbyhhZmluZm8pOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTCh4ZnJtX2RlY29kZV9zZXNzaW9uKTsKIAogc3RhdGljIGlubGluZSBpbnQgc2VjcGF0aF9oYXNfdHVubmVsKHN0cnVjdCBzZWNfcGF0aCAqc3AsIGludCBrKQogewpAQCAtOTgyLDggKzk4Miw5IEBACiAJdTggZmxfZGlyID0gcG9saWN5X3RvX2Zsb3dfZGlyKGRpcik7CiAJdTMyIHNrX3NpZDsKIAotCWlmIChfZGVjb2RlX3Nlc3Npb24oc2tiLCAmZmwsIGZhbWlseSkgPCAwKQorCWlmICh4ZnJtX2RlY29kZV9zZXNzaW9uKHNrYiwgJmZsLCBmYW1pbHkpIDwgMCkKIAkJcmV0dXJuIDA7CisJbmZfbmF0X2RlY29kZV9zZXNzaW9uKHNrYiwgJmZsLCBmYW1pbHkpOwogCiAJc2tfc2lkID0gc2VjdXJpdHlfc2tfc2lkKHNrLCAmZmwsIGZsX2Rpcik7CiAKQEAgLTEwNTUsNyArMTA1Niw3IEBACiB7CiAJc3RydWN0IGZsb3dpIGZsOwogCi0JaWYgKF9kZWNvZGVfc2Vzc2lvbihza2IsICZmbCwgZmFtaWx5KSA8IDApCisJaWYgKHhmcm1fZGVjb2RlX3Nlc3Npb24oc2tiLCAmZmwsIGZhbWlseSkgPCAwKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiB4ZnJtX2xvb2t1cCgmc2tiLT5kc3QsICZmbCwgTlVMTCwgMCkgPT0gMDsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUgYi9zY3JpcHRzL0tidWlsZC5pbmNsdWRlCmluZGV4IGRiM2M3MDguLjAxNjhkNmMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUKKysrIGIvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQpAQCAtMyw2ICszLDcgQEAKIAogIyBDb252aW5pZW50IHZhcmlhYmxlcwogY29tbWEgICA6PSAsCitzcXVvdGUgIDo9ICcKIGVtcHR5ICAgOj0KIHNwYWNlICAgOj0gJChlbXB0eSkgJChlbXB0eSkKIApAQCAtMTIsNiArMTMsMTAgQEAKIGRlcGZpbGUgPSAkKHN1YnN0ICQoY29tbWEpLF8sJChARCkvLiQoQEYpLmQpCiAKICMjIworIyBFc2NhcGUgc2luZ2xlIHF1b3RlIGZvciB1c2UgaW4gZWNobyBzdGF0ZW1lbnRzCitlc2NzcSA9ICQoc3Vic3QgJChzcXVvdGUpLCdcJChzcXVvdGUpJywkMSkKKworIyMjCiAjIGZpbGVjaGsgaXMgdXNlZCB0byBjaGVjayBpZiB0aGUgY29udGVudCBvZiBhIGdlbmVyYXRlZCBmaWxlIGlzIHVwZGF0ZWQuCiAjIFNhbXBsZSB1c2FnZToKICMgZGVmaW5lIGZpbGVjaGtfc2FtcGxlCkBAIC00Nyw3ICs1Miw3IEBACiAKICMgSWYgcXVpZXQgaXMgc2V0LCBvbmx5IHByaW50IHNob3J0IHZlcnNpb24gb2YgY29tbWFuZAogY21kID0gQCQoaWYgJCgkKHF1aWV0KWNtZF8kKDEpKSxcCi0gICAgICBlY2hvICcgICQoc3Vic3QgJywnXCcnLCQoJChxdWlldCljbWRfJCgxKSkpJyAmJikgJChjbWRfJCgxKSkKKyAgICAgIGVjaG8gJyAgJChjYWxsIGVzY3NxLCQoJChxdWlldCljbWRfJCgxKSkpJyAmJikgJChjbWRfJCgxKSkKIAogIyBBZGQgJChvYmopLyBmb3IgcGF0aHMgdGhhdCBpcyBub3QgYWJzb2x1dGUKIG9iamVjdGlmeSA9ICQoZm9yZWFjaCBvLCQoMSksJChpZiAkKGZpbHRlciAvJSwkKG8pKSwkKG8pLCQob2JqKS8kKG8pKSkKQEAgLTY4LDcgKzczLDcgQEAKIAogIyBlY2hvIGNvbW1hbmQuIFNob3J0IHZlcnNpb24gaXMgJChxdWlldCkgZXF1YWxzIHF1aWV0LCBvdGhlcndpc2UgZnVsbCBjb21tYW5kCiBlY2hvLWNtZCA9ICQoaWYgJCgkKHF1aWV0KWNtZF8kKDEpKSwgXAotCWVjaG8gJyAgJChzdWJzdCAnLCdcJycsJCgkKHF1aWV0KWNtZF8kKDEpKSknOykKKwllY2hvICcgICQoY2FsbCBlc2NzcSwkKCQocXVpZXQpY21kXyQoMSkpKSc7KQogCiAjIGZ1bmN0aW9uIHRvIG9ubHkgZXhlY3V0ZSB0aGUgcGFzc2VkIGNvbW1hbmQgaWYgbmVjZXNzYXJ5CiAjID4nPCBzdWJzdGl0dXRpb24gaXMgZm9yIGVjaG8gdG8gd29yaywgPiQ8IHN1YnN0aXR1dGlvbiB0byBwcmVzZXJ2ZSAkIHdoZW4gcmVsb2FkaW5nIC5jbWQgZmlsZQpAQCAtNzgsNyArODMsNyBAQAogCUBzZXQgLWU7IFwKIAkkKGVjaG8tY21kKSBcCiAJJChjbWRfJCgxKSk7IFwKLQllY2hvICdjbWRfJEAgOj0gJChzdWJzdCAkJCwkJCQkLCQoc3Vic3QgJywnXCcnLCQoY21kXyQoMSkpKSknID4gJChARCkvLiQoQEYpLmNtZCkKKwllY2hvICdjbWRfJEAgOj0gJChzdWJzdCAkJCwkJCQkLCQoY2FsbCBlc2NzcSwkKGNtZF8kKDEpKSkpJyA+ICQoQEQpLy4kKEBGKS5jbWQpCiAKICMgZXhlY3V0ZSB0aGUgY29tbWFuZCBhbmQgYWxzbyBwb3N0cHJvY2VzcyBnZW5lcmF0ZWQgLmQgZGVwZW5kZW5jaWVzCiAjIGZpbGUKQEAgLTg3LDcgKzkyLDcgQEAKIAlAc2V0IC1lOyBcCiAJJChlY2hvLWNtZCkgXAogCSQoY21kXyQoMSkpOyBcCi0Jc2NyaXB0cy9iYXNpYy9maXhkZXAgJChkZXBmaWxlKSAkQCAnJChzdWJzdCAkJCwkJCQkLCQoc3Vic3QgJywnXCcnLCQoY21kXyQoMSkpKSknID4gJChARCkvLiQoQEYpLnRtcDsgXAorCXNjcmlwdHMvYmFzaWMvZml4ZGVwICQoZGVwZmlsZSkgJEAgJyQoc3Vic3QgJCQsJCQkJCwkKGNhbGwgZXNjc3EsJChjbWRfJCgxKSkpKScgPiAkKEBEKS8uJChARikudG1wOyBcCiAJcm0gLWYgJChkZXBmaWxlKTsgXAogCW12IC1mICQoQEQpLy4kKEBGKS50bXAgJChARCkvLiQoQEYpLmNtZCkKIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5idWlsZCBiL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQKaW5kZXggNTA2ZTNmMy4uYzMzZTYyYiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5idWlsZAorKysgYi9zY3JpcHRzL01ha2VmaWxlLmJ1aWxkCkBAIC0xNzksMTAgKzE3OSwxMCBAQAogZGVmaW5lIHJ1bGVfY2Nfb19jCiAJJChpZiAkKCQocXVpZXQpY21kX2NoZWNrc3JjKSxlY2hvICcgICQoJChxdWlldCljbWRfY2hlY2tzcmMpJzspICAgXAogCSQoY21kX2NoZWNrc3JjKQkJCQkJCQkgIFwKLQkkKGlmICQoJChxdWlldCljbWRfY2Nfb19jKSxlY2hvICcgICQoc3Vic3QgJywnXCcnLCQoJChxdWlldCljbWRfY2Nfb19jKSknOykgIFwKKwkkKGlmICQoJChxdWlldCljbWRfY2Nfb19jKSxlY2hvICcgICQoY2FsbCBlc2NzcSwkKCQocXVpZXQpY21kX2NjX29fYykpJzspICBcCiAJJChjbWRfY2Nfb19jKTsJCQkJCQkJICBcCiAJJChjbWRfbW9kdmVyc2lvbnMpCQkJCQkJICBcCi0Jc2NyaXB0cy9iYXNpYy9maXhkZXAgJChkZXBmaWxlKSAkQCAnJChzdWJzdCAnLCdcJycsJChjbWRfY2Nfb19jKSknID4gJChARCkvLiQoQEYpLnRtcDsgIFwKKwlzY3JpcHRzL2Jhc2ljL2ZpeGRlcCAkKGRlcGZpbGUpICRAICckKGNhbGwgZXNjc3EsJChjbWRfY2Nfb19jKSknID4gJChARCkvLiQoQEYpLnRtcDsgIFwKIAlybSAtZiAkKGRlcGZpbGUpOwkJCQkJCSAgXAogCW12IC1mICQoQEQpLy4kKEBGKS50bXAgJChARCkvLiQoQEYpLmNtZAogZW5kZWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUubW9kcG9zdCBiL3NjcmlwdHMvTWFrZWZpbGUubW9kcG9zdAppbmRleCAwYzRmM2E5Li5iZjk2YTYxIDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5tb2Rwb3N0CkBAIC0zMCw3ICszMCw3IEBACiAjICAgICAtIFNlZSBpbmNsdWRlL2xpbnV4L21vZHVsZS5oIGZvciBtb3JlIGRldGFpbHMKIAogIyBTdGVwIDQgaXMgc29sZWx5IHVzZWQgdG8gYWxsb3cgbW9kdWxlIHZlcnNpb25pbmcgaW4gZXh0ZXJuYWwgbW9kdWxlcywKLSMgd2hlcmUgdGhlIENSQyBvZiBlYWNoIG1vZHVsZSBpcyByZXRyZWl2ZWQgZnJvbSB0aGUgTW9kdWxlLnN5bWVycyBmaWxlLgorIyB3aGVyZSB0aGUgQ1JDIG9mIGVhY2ggbW9kdWxlIGlzIHJldHJpZXZlZCBmcm9tIHRoZSBNb2R1bGUuc3ltZXJzIGZpbGUuCiAKIC5QSE9OWTogX21vZHBvc3QKIF9tb2Rwb3N0OiBfX21vZHBvc3QKZGlmZiAtLWdpdCBhL3NjcmlwdHMvYmxvYXQtby1tZXRlciBiL3NjcmlwdHMvYmxvYXQtby1tZXRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWYyMWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9ibG9hdC1vLW1ldGVyCkBAIC0wLDAgKzEsNTggQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDA0IE1hdHQgTWFja2FsbCA8bXBtQHNlbGVuaWMuY29tPgorIworIyBpbnNwaXJlZCBieSBwZXJsIEJsb2F0LU8tTWV0ZXIgKGMpIDE5OTcgYnkgQW5kaSBLbGVlbgorIworIyBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKK2ltcG9ydCBzeXMsIG9zLCByZQorCitpZiBsZW4oc3lzLmFyZ3YpICE9IDM6CisgICAgc3lzLnN0ZGVyci53cml0ZSgidXNhZ2U6ICVzIGZpbGUxIGZpbGUyXG4iICUgc3lzLmFyZ3ZbMF0pCisgICAgc3lzLmV4aXQoLTEpCisKK2RlZiBnZXRzaXplcyhmaWxlKToKKyAgICBzeW0gPSB7fQorICAgIGZvciBsIGluIG9zLnBvcGVuKCJubSAtLXNpemUtc29ydCAiICsgZmlsZSkucmVhZGxpbmVzKCk6CisgICAgICAgIHNpemUsIHR5cGUsIG5hbWUgPSBsWzotMV0uc3BsaXQoKQorICAgICAgICBpZiB0eXBlIGluICJ0VGREYkIiOgorICAgICAgICAgICAgc3ltW25hbWVdID0gaW50KHNpemUsIDE2KQorICAgIHJldHVybiBzeW0KKworb2xkID0gZ2V0c2l6ZXMoc3lzLmFyZ3ZbMV0pCituZXcgPSBnZXRzaXplcyhzeXMuYXJndlsyXSkKK2dyb3csIHNocmluaywgYWRkLCByZW1vdmUsIHVwLCBkb3duID0gMCwgMCwgMCwgMCwgMCwgMAorZGVsdGEsIGNvbW1vbiA9IFtdLCB7fQorCitmb3IgYSBpbiBvbGQ6CisgICAgaWYgYSBpbiBuZXc6CisgICAgICAgIGNvbW1vblthXSA9IDEKKworZm9yIG5hbWUgaW4gb2xkOgorICAgIGlmIG5hbWUgbm90IGluIGNvbW1vbjoKKyAgICAgICAgcmVtb3ZlICs9IDEKKyAgICAgICAgZG93biArPSBvbGRbbmFtZV0KKyAgICAgICAgZGVsdGEuYXBwZW5kKCgtb2xkW25hbWVdLCBuYW1lKSkKKworZm9yIG5hbWUgaW4gbmV3OgorICAgIGlmIG5hbWUgbm90IGluIGNvbW1vbjoKKyAgICAgICAgYWRkICs9IDEKKyAgICAgICAgdXAgKz0gbmV3W25hbWVdCisgICAgICAgIGRlbHRhLmFwcGVuZCgobmV3W25hbWVdLCBuYW1lKSkKKworZm9yIG5hbWUgaW4gY29tbW9uOgorICAgICAgICBkID0gbmV3LmdldChuYW1lLCAwKSAtIG9sZC5nZXQobmFtZSwgMCkKKyAgICAgICAgaWYgZD4wOiBncm93LCB1cCA9IGdyb3crMSwgdXArZAorICAgICAgICBpZiBkPDA6IHNocmluaywgZG93biA9IHNocmluaysxLCBkb3duLWQKKyAgICAgICAgZGVsdGEuYXBwZW5kKChkLCBuYW1lKSkKKworZGVsdGEuc29ydCgpCitkZWx0YS5yZXZlcnNlKCkKKworcHJpbnQgImFkZC9yZW1vdmU6ICVzLyVzIGdyb3cvc2hyaW5rOiAlcy8lcyB1cC9kb3duOiAlcy8lcyAoJXMpIiAlIFwKKyAgICAgIChhZGQsIHJlbW92ZSwgZ3Jvdywgc2hyaW5rLCB1cCwgLWRvd24sIHVwLWRvd24pCitwcmludCAiJS00MHMgJTdzICU3cyAlKzdzIiAlICgiZnVuY3Rpb24iLCAib2xkIiwgIm5ldyIsICJkZWx0YSIpCitmb3IgZCwgbiBpbiBkZWx0YToKKyAgICBpZiBkOiBwcmludCAiJS00MHMgJTdzICU3cyAlKzdkIiAlIChuLCBvbGQuZ2V0KG4sIi0iKSwgbmV3LmdldChuLCItIiksIGQpCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvY29uZi5jIGIvc2NyaXB0cy9rY29uZmlnL2NvbmYuYwppbmRleCA4YmE1ZDI5Li4xMGVlYWU1IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvY29uZi5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKQEAgLTYzLDYgKzYzLDIwIEBACiAJfQogfQogCitzdGF0aWMgY2hhciAqZmdldHNfY2hlY2tfc3RyZWFtKGNoYXIgKnMsIGludCBzaXplLCBGSUxFICpzdHJlYW0pCit7CisJY2hhciAqcmV0ID0gZmdldHMocywgc2l6ZSwgc3RyZWFtKTsKKworCWlmIChyZXQgPT0gTlVMTCAmJiBmZW9mKHN0cmVhbSkpIHsKKwkJcHJpbnRmKF8oImFib3J0ZWQhXG5cbiIpKTsKKwkJcHJpbnRmKF8oIkNvbnNvbGUgaW5wdXQgaXMgY2xvc2VkLiAiKSk7CisJCXByaW50ZihfKCJSdW4gJ21ha2Ugb2xkY29uZmlnJyB0byB1cGRhdGUgY29uZmlndXJhdGlvbi5cblxuIikpOworCQlleGl0KDEpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyB2b2lkIGNvbmZfYXNrdmFsdWUoc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpkZWYpCiB7CiAJZW51bSBzeW1ib2xfdHlwZSB0eXBlID0gc3ltX2dldF90eXBlKHN5bSk7CkBAIC0xMDAsNyArMTE0LDcgQEAKIAkJY2hlY2tfc3RkaW4oKTsKIAljYXNlIGFza19hbGw6CiAJCWZmbHVzaChzdGRvdXQpOwotCQlmZ2V0cyhsaW5lLCAxMjgsIHN0ZGluKTsKKwkJZmdldHNfY2hlY2tfc3RyZWFtKGxpbmUsIDEyOCwgc3RkaW4pOwogCQlyZXR1cm47CiAJY2FzZSBzZXRfZGVmYXVsdDoKIAkJcHJpbnRmKCIlc1xuIiwgZGVmKTsKQEAgLTM1Niw3ICszNzAsNyBAQAogCQkJY2hlY2tfc3RkaW4oKTsKIAkJY2FzZSBhc2tfYWxsOgogCQkJZmZsdXNoKHN0ZG91dCk7Ci0JCQlmZ2V0cyhsaW5lLCAxMjgsIHN0ZGluKTsKKwkJCWZnZXRzX2NoZWNrX3N0cmVhbShsaW5lLCAxMjgsIHN0ZGluKTsKIAkJCXN0cmlwKGxpbmUpOwogCQkJaWYgKGxpbmVbMF0gPT0gJz8nKSB7CiAJCQkJcHJpbnRmKCJcbiVzXG4iLCBtZW51LT5zeW0tPmhlbHAgPwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMgYi9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYwppbmRleCBjY2Q0NTEzLi5iMGNiYmUyIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYworKysgYi9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYwpAQCAtMzc1LDcgKzM3NSw3IEBACiAJCWlmICghb3V0X2gpCiAJCQlyZXR1cm4gMTsKIAl9Ci0Jc3ltID0gc3ltX2xvb2t1cCgiS0VSTkVMUkVMRUFTRSIsIDApOworCXN5bSA9IHN5bV9sb29rdXAoIktFUk5FTFZFUlNJT04iLCAwKTsKIAlzeW1fY2FsY192YWx1ZShzeW0pOwogCXRpbWUoJm5vdyk7CiAJZW52ID0gZ2V0ZW52KCJLQ09ORklHX05PVElNRVNUQU1QIik7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvZ2NvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9nY29uZi5jCmluZGV4IDlmNWFhYmQuLjY2NWJkNTMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9nY29uZi5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9nY29uZi5jCkBAIC0yNzYsNyArMjc2LDcgQEAKIAkJCQkJICBOVUxMKTsKIAogCXNwcmludGYodGl0bGUsIF8oIkxpbnV4IEtlcm5lbCB2JXMgQ29uZmlndXJhdGlvbiIpLAotCQlnZXRlbnYoIktFUk5FTFJFTEVBU0UiKSk7CisJCWdldGVudigiS0VSTkVMVkVSU0lPTiIpKTsKIAlndGtfd2luZG93X3NldF90aXRsZShHVEtfV0lORE9XKG1haW5fd25kKSwgdGl0bGUpOwogCiAJZ3RrX3dpZGdldF9zaG93KG1haW5fd25kKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9NYWtlZmlsZSBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9NYWtlZmlsZQppbmRleCBhNDVhMTNmLi5mYWUzZTI5IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvTWFrZWZpbGUKKysrIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL01ha2VmaWxlCkBAIC0xLDQyICsxLDE4IEBACi1IT1NUX0VYVFJBQ0ZMQUdTIDo9IC1ETE9DQUxFIAotaWZlcSAoJChzaGVsbCB1bmFtZSksU3VuT1MpCi1IT1NUX0xPQURMSUJFUyAgIDo9IC1sY3Vyc2VzCi1lbHNlCi1IT1NUX0xPQURMSUJFUyAgIDo9IC1sbmN1cnNlcwotZW5kaWYKKyMgTWFrZWZpbGUgdG8gYnVpbGQgbHhkaWFsb2cgcGFja2FnZQorIwogCi1pZmVxICgvdXNyL2luY2x1ZGUvbmN1cnNlcy9uY3Vyc2VzLmgsICQod2lsZGNhcmQgL3Vzci9pbmNsdWRlL25jdXJzZXMvbmN1cnNlcy5oKSkKLSAgICAgICAgSE9TVF9FWFRSQUNGTEFHUyArPSAtSS91c3IvaW5jbHVkZS9uY3Vyc2VzIC1EQ1VSU0VTX0xPQz0iPG5jdXJzZXMuaD4iCi1lbHNlCi1pZmVxICgvdXNyL2luY2x1ZGUvbmN1cnNlcy9jdXJzZXMuaCwgJCh3aWxkY2FyZCAvdXNyL2luY2x1ZGUvbmN1cnNlcy9jdXJzZXMuaCkpCi0gICAgICAgIEhPU1RfRVhUUkFDRkxBR1MgKz0gLUkvdXNyL2luY2x1ZGUvbmN1cnNlcyAtRENVUlNFU19MT0M9IjxuY3Vyc2VzL2N1cnNlcy5oPiIKLWVsc2UKLWlmZXEgKC91c3IvaW5jbHVkZS9uY3Vyc2VzLmgsICQod2lsZGNhcmQgL3Vzci9pbmNsdWRlL25jdXJzZXMuaCkpCi0gICAgICAgIEhPU1RfRVhUUkFDRkxBR1MgKz0gLURDVVJTRVNfTE9DPSI8bmN1cnNlcy5oPiIKLWVsc2UKLQlIT1NUX0VYVFJBQ0ZMQUdTICs9IC1EQ1VSU0VTX0xPQz0iPGN1cnNlcy5oPiIKLWVuZGlmCi1lbmRpZgotZW5kaWYKK2NoZWNrLWx4ZGlhbG9nICA6PSAkKHNyY3RyZWUpLyQoc3JjKS9jaGVjay1seGRpYWxvZy5zaAorSE9TVF9FWFRSQUNGTEFHUzo9ICQoc2hlbGwgJChDT05GSUdfU0hFTEwpICQoY2hlY2stbHhkaWFsb2cpIC1jY2ZsYWdzKQorSE9TVF9MT0FETElCRVMgIDo9ICQoc2hlbGwgJChDT05GSUdfU0hFTEwpICQoY2hlY2stbHhkaWFsb2cpIC1sZGZsYWdzICQoSE9TVENDKSkKKyAKK0hPU1RfRVhUUkFDRkxBR1MgKz0gLURMT0NBTEUgCisKKy5QSE9OWTogZG9jaGVja2x4ZGlhbG9nCiskKG9iaikvZG9jaGVja2x4ZGlhbG9nOgorCSQoUSkkKENPTkZJR19TSEVMTCkgJChjaGVjay1seGRpYWxvZykgLWNoZWNrICQoSE9TVENDKSAkKEhPU1RfTE9BRExJQkVTKQogCiBob3N0cHJvZ3MteQk6PSBseGRpYWxvZwotYWx3YXlzCQk6PSBuY3Vyc2VzICQoaG9zdHByb2dzLXkpCithbHdheXMJCTo9ICQoaG9zdHByb2dzLXkpIGRvY2hlY2tseGRpYWxvZwogCiBseGRpYWxvZy1vYmpzIDo9IGNoZWNrbGlzdC5vIG1lbnVib3gubyB0ZXh0Ym94Lm8geWVzbm8ubyBpbnB1dGJveC5vIFwKIAkJIHV0aWwubyBseGRpYWxvZy5vIG1zZ2JveC5vCi0KLS5QSE9OWTogJChvYmopL25jdXJzZXMKLSQob2JqKS9uY3Vyc2VzOgotCUBlY2hvICJtYWluKCkge30iID4gbHh0ZW1wLmMKLQlAaWYgJChIT1NUQ0MpIGx4dGVtcC5jICAkKEhPU1RfTE9BRExJQkVTKTsgdGhlbiBcCi0JCXJtIC1mIGx4dGVtcC5jIGEub3V0OyBcCi0JZWxzZSBcCi0JCXJtIC1mIGx4dGVtcC5jOyBcCi0JCWVjaG8gLWUgIlwwMDciIDtcCi0JCWVjaG8gIj4+IFVuYWJsZSB0byBmaW5kIHRoZSBOY3Vyc2VzIGxpYnJhcmllcy4iIDtcCi0JCWVjaG8gIj4+IiA7XAotCQllY2hvICI+PiBZb3UgbXVzdCBpbnN0YWxsIG5jdXJzZXMtZGV2ZWwgaW4gb3JkZXIiIDtcCi0JCWVjaG8gIj4+IHRvIHVzZSAnbWFrZSBtZW51Y29uZmlnJyIgO1wKLQkJZWNobyA7XAotCQlleGl0IDEgO1wKLQlmaQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2NoZWNrLWx4ZGlhbG9nLnNoIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2NoZWNrLWx4ZGlhbG9nLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0OGUzNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvY2hlY2stbHhkaWFsb2cuc2gKQEAgLTAsMCArMSw4MCBAQAorIyEvYmluL3NoCisjIENoZWNrIG5jdXJzZXMgY29tcGF0aWJpbGl0eQorCisjIFdoYXQgbGlicmFyeSB0byBsaW5rCitsZGZsYWdzKCkKK3sKKwllY2hvICJtYWluKCkge30iIHwgJGNjIC1sbmN1cnNlc3cgLXhjIC0gLW8gL2Rldi9udWxsIDI+IC9kZXYvbnVsbAorCWlmIFsgJD8gLWVxIDAgXTsgdGhlbgorCQllY2hvICctbG5jdXJzZXN3JworCQlleGl0CisJZmkKKwllY2hvICJtYWluKCkge30iIHwgJGNjIC1sbmN1cnNlcyAteGMgLSAtbyAvZGV2L251bGwgMj4gL2Rldi9udWxsCisJaWYgWyAkPyAtZXEgMCBdOyB0aGVuCisJCWVjaG8gJy1sbmN1cnNlcycKKwkJZXhpdAorCWZpCisJZWNobyAibWFpbigpIHt9IiB8ICRjYyAtbGN1cnNlcyAteGMgLSAtbyAvZGV2L251bGwgMj4gL2Rldi9udWxsCisJaWYgWyAkPyAtZXEgMCBdOyB0aGVuCisJCWVjaG8gJy1sY3Vyc2VzJworCQlleGl0CisJZmkKKwlleGl0IDEKK30KKworIyBXaGVyZSBpcyBuY3Vyc2VzLmg/CitjY2ZsYWdzKCkKK3sKKwlpZiBbIC1mIC91c3IvaW5jbHVkZS9uY3Vyc2VzL25jdXJzZXMuaCBdOyB0aGVuCisJCWVjaG8gJy1JL3Vzci9pbmNsdWRlL25jdXJzZXMgLURDVVJTRVNfTE9DPSI8bmN1cnNlcy5oPiInCisJZWxpZiBbIC1mIC91c3IvaW5jbHVkZS9uY3Vyc2VzL2N1cnNlcy5oIF07IHRoZW4KKwkJZWNobyAnLUkvdXNyL2luY2x1ZGUvbmN1cnNlcyAtRENVUlNFU19MT0M9IjxuY3Vyc2VzL2N1cnNlcy5oPiInCisJZWxpZiBbIC1mIC91c3IvaW5jbHVkZS9uY3Vyc2VzLmggXTsgdGhlbgorCQllY2hvICctRENVUlNFU19MT0M9IjxuY3Vyc2VzLmg+IicKKwllbHNlCisJCWVjaG8gJy1EQ1VSU0VTX0xPQz0iPGN1cnNlcy5oPiInCisJZmkKK30KKworY29tcGlsZXI9IiIKKyMgQ2hlY2sgaWYgd2UgY2FuIGxpbmsgdG8gbmN1cnNlcworY2hlY2soKSB7CisJZWNobyAibWFpbigpIHt9IiB8ICRjYyAteGMgLSAtbyAvZGV2L251bGwgMj4gL2Rldi9udWxsCisJaWYgWyAkPyAhPSAwIF07IHRoZW4KKwkJZWNobyAiICoqKiBVbmFibGUgdG8gZmluZCB0aGUgbmN1cnNlcyBsaWJyYXJpZXMuIiAgICAgICAgICAxPiYyCisJCWVjaG8gIiAqKiogbWFrZSBtZW51Y29uZmlnIHJlcXVpcmUgdGhlIG5jdXJzZXMgbGlicmFyaWVzIiAgMT4mMgorCQllY2hvICIgKioqICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE+JjIKKwkJZWNobyAiICoqKiBJbnN0YWxsIG5jdXJzZXMgKG5jdXJzZXMtZGV2ZWwpIGFuZCB0cnkgYWdhaW4iICAxPiYyCisJCWVjaG8gIiAqKiogIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT4mMgorCQlleGl0IDEKKwlmaQorfQorCit1c2FnZSgpIHsKKwlwcmludGYgIlVzYWdlOiAkMCBbLWNoZWNrIGNvbXBpbGVyIG9wdGlvbnN8LWhlYWRlcnwtbGlicmFyeV1cbiIKK30KKworaWYgWyAkIyA9PSAwIF07IHRoZW4KKwl1c2FnZQorCWV4aXQgMQorZmkKKworY2FzZSAiJDEiIGluCisJIi1jaGVjayIpCisJCXNoaWZ0CisJCWNjPSIkQCIKKwkJY2hlY2sKKwkJOzsKKwkiLWNjZmxhZ3MiKQorCQljY2ZsYWdzCisJCTs7CisJIi1sZGZsYWdzIikKKwkJc2hpZnQKKwkJY2M9IiRAIgorCQlsZGZsYWdzCisJCTs7CisJIioiKQorCQl1c2FnZQorCQlleGl0IDEKKwkJOzsKK2VzYWMKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jIGIvc2NyaXB0cy9rY29uZmlnL21jb25mLmMKaW5kZXggZDYzZDdmYi4uN2Y5NzMxOSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL21jb25mLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL21jb25mLmMKQEAgLTEwNTEsNyArMTA1MSw3IEBACiAJY29uZl9wYXJzZShhdlsxXSk7CiAJY29uZl9yZWFkKE5VTEwpOwogCi0Jc3ltID0gc3ltX2xvb2t1cCgiS0VSTkVMUkVMRUFTRSIsIDApOworCXN5bSA9IHN5bV9sb29rdXAoIktFUk5FTFZFUlNJT04iLCAwKTsKIAlzeW1fY2FsY192YWx1ZShzeW0pOwogCXNwcmludGYobWVudV9iYWNrdGl0bGUsIF8oIkxpbnV4IEtlcm5lbCB2JXMgQ29uZmlndXJhdGlvbiIpLAogCQlzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9xY29uZi5oIGIvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmgKaW5kZXggN2MwMzkyNy4uZTUyZjNlOSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmgKKysrIGIvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmgKQEAgLTIyLDggKzIyLDggQEAKIAogI2lmIFFUX1ZFUlNJT04gPj0gMzAwCiAJdm9pZCByZWFkTGlzdFNldHRpbmdzKCk7Ci0JUVZhbHVlTGlzdDxpbnQ+IENvbmZpZ1NldHRpbmdzOjpyZWFkU2l6ZXMoY29uc3QgUVN0cmluZyYga2V5LCBib29sICpvayk7Ci0JYm9vbCBDb25maWdTZXR0aW5nczo6d3JpdGVTaXplcyhjb25zdCBRU3RyaW5nJiBrZXksIGNvbnN0IFFWYWx1ZUxpc3Q8aW50PiYgdmFsdWUpOworCVFWYWx1ZUxpc3Q8aW50PiByZWFkU2l6ZXMoY29uc3QgUVN0cmluZyYga2V5LCBib29sICpvayk7CisJYm9vbCB3cml0ZVNpemVzKGNvbnN0IFFTdHJpbmcmIGtleSwgY29uc3QgUVZhbHVlTGlzdDxpbnQ+JiB2YWx1ZSk7CiAjZW5kaWYKIAogCWJvb2wgc2hvd0FsbDsKQEAgLTEyNCw3ICsxMjQsNyBAQAogCXZvaWQgc2V0UGFyZW50TWVudSh2b2lkKTsKIAogCXRlbXBsYXRlIDxjbGFzcyBQPgotCXZvaWQgQ29uZmlnTGlzdDo6dXBkYXRlTWVudUxpc3QoUCosIHN0cnVjdCBtZW51Kik7CisJdm9pZCB1cGRhdGVNZW51TGlzdChQKiwgc3RydWN0IG1lbnUqKTsKIAogCWJvb2wgdXBkYXRlQWxsOwogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvc3ltYm9sLmMgYi9zY3JpcHRzL2tjb25maWcvc3ltYm9sLmMKaW5kZXggNjljMjU0OS4uM2Q3ODc3YSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3N5bWJvbC5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYwpAQCAtNjEsMTAgKzYxLDEwIEBACiAJaWYgKHApCiAJCXN5bV9hZGRfZGVmYXVsdChzeW0sIHApOwogCi0Jc3ltID0gc3ltX2xvb2t1cCgiS0VSTkVMUkVMRUFTRSIsIDApOworCXN5bSA9IHN5bV9sb29rdXAoIktFUk5FTFZFUlNJT04iLCAwKTsKIAlzeW0tPnR5cGUgPSBTX1NUUklORzsKIAlzeW0tPmZsYWdzIHw9IFNZTUJPTF9BVVRPOwotCXAgPSBnZXRlbnYoIktFUk5FTFJFTEVBU0UiKTsKKwlwID0gZ2V0ZW52KCJLRVJORUxWRVJTSU9OIik7CiAJaWYgKHApCiAJCXN5bV9hZGRfZGVmYXVsdChzeW0sIHApOwogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tlcm5lbC1kb2MgYi9zY3JpcHRzL2tlcm5lbC1kb2MKaW5kZXggMmY0NWZkMi4uOWZkNWY1YiAxMDA3NTUKLS0tIGEvc2NyaXB0cy9rZXJuZWwtZG9jCisrKyBiL3NjcmlwdHMva2VybmVsLWRvYwpAQCAtMTQwNSw2ICsxNDA1LDcgQEAKICAgICBteSAkdHlwZTsKICAgICBteSAkcGFyYW07CiAKKyAgICAjIHRlbXBvcmFyaWx5IHJlcGxhY2UgY29tbWFzIGluc2lkZSBmdW5jdGlvbiBwb2ludGVyIGRlZmluaXRpb24KICAgICB3aGlsZSAoJGFyZ3MgPX4gLyhcKFteXCksXSspLC8pIHsKICAgICAgICAgJGFyZ3MgPX4gcy8oXChbXlwpLF0rKSwvJDEjL2c7CiAgICAgfQpAQCAtMTQ2NSwxMSArMTQ2NiwxMCBAQAogCW15ICRwYXJhbV9uYW1lID0gJHBhcmFtOwogCSRwYXJhbV9uYW1lID1+IHMvXFsuKi8vOwogCi0JaWYgKCR0eXBlIGVxICIiICYmICRwYXJhbSBlcSAiLi4uIikKKwlpZiAoJHR5cGUgZXEgIiIgJiYgJHBhcmFtID1+IC9cLlwuXC4kLykKIAl7CiAJICAgICR0eXBlPSIiOwotCSAgICAkcGFyYW09Ii4uLiI7Ci0JICAgICRwYXJhbWV0ZXJkZXNjc3siLi4uIn0gPSAidmFyaWFibGUgYXJndW1lbnRzIjsKKwkgICAgJHBhcmFtZXRlcmRlc2NzeyRwYXJhbX0gPSAidmFyaWFibGUgYXJndW1lbnRzIjsKIAl9CiAJZWxzaWYgKCR0eXBlIGVxICIiICYmICgkcGFyYW0gZXEgIiIgb3IgJHBhcmFtIGVxICJ2b2lkIikpCiAJewpAQCAtMTQ3Nyw3ICsxNDc3LDExIEBACiAJICAgICRwYXJhbT0idm9pZCI7CiAJICAgICRwYXJhbWV0ZXJkZXNjc3t2b2lkfSA9ICJubyBhcmd1bWVudHMiOwogCX0KLQlpZiAoZGVmaW5lZCAkdHlwZSAmJiAkdHlwZSAmJiAhZGVmaW5lZCAkcGFyYW1ldGVyZGVzY3N7JHBhcmFtX25hbWV9KSB7CisJIyB3YXJuIGlmIHBhcmFtZXRlciBoYXMgbm8gZGVzY3JpcHRpb24KKwkjIChidXQgaWdub3JlIG9uZXMgc3RhcnRpbmcgd2l0aCAjIGFzIHRoZXNlIGFyZSBubyBwYXJhbWV0ZXJzCisJIyBidXQgaW5saW5lIHByZXByb2Nlc3NvciBzdGF0ZW1lbnRzCisJaWYgKCFkZWZpbmVkICRwYXJhbWV0ZXJkZXNjc3skcGFyYW1fbmFtZX0gJiYgJHBhcmFtX25hbWUgIX4gL14jLykgeworCiAJICAgICRwYXJhbWV0ZXJkZXNjc3skcGFyYW1fbmFtZX0gPSAkdW5kZXNjcmliZWQ7CiAKIAkgICAgaWYgKCgkdHlwZSBlcSAnZnVuY3Rpb24nKSB8fCAoJHR5cGUgZXEgJ2VudW0nKSkgewpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ta3N5c21hcCBiL3NjcmlwdHMvbWtzeXNtYXAKaW5kZXggYTY0MzBlMC4uNDM5MGZhYiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9ta3N5c21hcAorKysgYi9zY3JpcHRzL21rc3lzbWFwCkBAIC0xLDcgKzEsNyBAQAogIyEvYmluL3NoIC14CiAjIEJhc2VkIG9uIHRoZSB2bWxpbnV4IGZpbGUgY3JlYXRlIHRoZSBTeXN0ZW0ubWFwIGZpbGUKICMgU3lzdGVtLm1hcCBpcyB1c2VkIGJ5IG1vZHVsZS1pbml0IHRvb2xzIGFuZCBzb21lIGRlYnVnZ2luZwotIyB0b29scyB0byByZXRyZWl2ZSB0aGUgYWN0dWFsIGFkZHJlc3NlcyBvZiBzeW1ib2xzIGluIHRoZSBrZXJuZWwuCisjIHRvb2xzIHRvIHJldHJpZXZlIHRoZSBhY3R1YWwgYWRkcmVzc2VzIG9mIHN5bWJvbHMgaW4gdGhlIGtlcm5lbC4KICMKICMgVXNhZ2UKICMgbWtzeXNtYXAgdm1saW51eCBTeXN0ZW0ubWFwCmRpZmYgLS1naXQgYS9zY3JpcHRzL21vZC9maWxlMmFsaWFzLmMgYi9zY3JpcHRzL21vZC9maWxlMmFsaWFzLmMKaW5kZXggZTBlZWRmZi4uYmU5N2NhZiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jCisrKyBiL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYwpAQCAtNDE3LDcgKzQxNyw3IEBACiAJCWRvX2lucHV0KGFsaWFzLCBpZC0+c25kYml0LCAwLCBTTkRfTUFYKTsKIAlzcHJpbnRmKGFsaWFzICsgc3RybGVuKGFsaWFzKSwgImYqIik7CiAJaWYgKGlkLT5mbGFncyZJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfRkZCSVQpCi0JCWRvX2lucHV0KGFsaWFzLCBpZC0+ZmZiaXQsIDAsIFNORF9NQVgpOworCQlkb19pbnB1dChhbGlhcywgaWQtPmZmYml0LCAwLCBGRl9NQVgpOwogCXNwcmludGYoYWxpYXMgKyBzdHJsZW4oYWxpYXMpLCAidyoiKTsKIAlpZiAoaWQtPmZsYWdzJklOUFVUX0RFVklDRV9JRF9NQVRDSF9TV0JJVCkKIAkJZG9faW5wdXQoYWxpYXMsIGlkLT5zd2JpdCwgMCwgU1dfTUFYKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcmVmZXJlbmNlX2Rpc2NhcmRlZC5wbCBiL3NjcmlwdHMvcmVmZXJlbmNlX2Rpc2NhcmRlZC5wbAppbmRleCBjMmQ1NDE0Li40ZWU2YWIyIDEwMDY0NAotLS0gYS9zY3JpcHRzL3JlZmVyZW5jZV9kaXNjYXJkZWQucGwKKysrIGIvc2NyaXB0cy9yZWZlcmVuY2VfZGlzY2FyZGVkLnBsCkBAIC03MSw2ICs3MSwxMSBAQAogIyBwcmludGYoImlnbm9yaW5nICVkIGNvbmdsb21lcmF0ZShzKVxuIiwgJGlnbm9yZSk7CiAKICMgcHJpbnRmKCJTY2FubmluZyBvYmplY3RzXG4iKTsKKworIyBLZWl0aCBPd25lcyA8a2Fvc0BzZ2kuY29tPiBjb21tZW50ZWQ6CisjIEZvciBvdXIgZnV0dXJlIHtpbn1zYW5pdHksIGFkZCBhIGNvbW1lbnQgdGhhdCB0aGlzIGlzIHRoZSBwcGMgLm9wZAorIyBzZWN0aW9uLCBub3QgdGhlIGlhNjQgLm9wZCBzZWN0aW9uLgorIyBpYTY0IC5vcGQgc2hvdWxkIG5vdCBwb2ludCB0byBkaXNjYXJkZWQgc2VjdGlvbnMuCiAkZXJyb3Jjb3VudCA9IDA7CiBmb3JlYWNoICRvYmplY3QgKGtleXMoJW9iamVjdCkpIHsKIAlteSAkZnJvbTsKQEAgLTg4LDYgKzkzLDcgQEAKIAkJICAgICgkZnJvbSAhfiAvXC50ZXh0XC5leGl0JC8gJiYKIAkJICAgICAkZnJvbSAhfiAvXC5leGl0XC50ZXh0JC8gJiYKIAkJICAgICAkZnJvbSAhfiAvXC5kYXRhXC5leGl0JC8gJiYKKwkJICAgICAkZnJvbSAhfiAvXC5vcGQkLyAmJgogCQkgICAgICRmcm9tICF+IC9cLmV4aXRcLmRhdGEkLyAmJgogCQkgICAgICRmcm9tICF+IC9cLmFsdGluc3RydWN0aW9ucyQvICYmCiAJCSAgICAgJGZyb20gIX4gL1wucGRyJC8gJiYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvc2V0bG9jYWx2ZXJzaW9uIGIvc2NyaXB0cy9zZXRsb2NhbHZlcnNpb24KaW5kZXggZjU0ZGFjOC4uOWEyMzgyNSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9zZXRsb2NhbHZlcnNpb24KKysrIGIvc2NyaXB0cy9zZXRsb2NhbHZlcnNpb24KQEAgLTE3LDYgKzE3LDYgQEAKIAogCSMgQXJlIHRoZXJlIHVuY29tbWl0dGVkIGNoYW5nZXM/CiAJaWYgZ2l0IGRpZmYtZmlsZXMgfCByZWFkIGR1bW15OyB0aGVuCi0JCXByaW50ZiAnJXMnIC1naXRfZGlydHkKKwkJcHJpbnRmICclcycgLWRpcnR5CiAJZmkKIGZpCmRpZmYgLS1naXQgYS9zZWN1cml0eS9jb21tb25jYXAuYyBiL3NlY3VyaXR5L2NvbW1vbmNhcC5jCmluZGV4IDA0YzEyZjUuLjhhNmUwOTcgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2NvbW1vbmNhcC5jCisrKyBiL3NlY3VyaXR5L2NvbW1vbmNhcC5jCkBAIC03LDYgKzcsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2R1bW15LmMgYi9zZWN1cml0eS9kdW1teS5jCmluZGV4IGExNWM1NDcuLmYxYTViZDkgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2R1bW15LmMKKysrIGIvc2VjdXJpdHkvZHVtbXkuYwpAQCAtMTQsNiArMTQsNyBAQAogCiAjdW5kZWYgREVCVUcKIAorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2lub2RlLmMgYi9zZWN1cml0eS9pbm9kZS5jCmluZGV4IGE1OTY0NTAuLjBmNzdiMDIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2lub2RlLmMKKysrIGIvc2VjdXJpdHkvaW5vZGUuYwpAQCAtMTcyLDcgKzE3Miw3IEBACiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCWRvd24oJnBhcmVudC0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJKmRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKG5hbWUsIHBhcmVudCwgc3RybGVuKG5hbWUpKTsKIAlpZiAoIUlTX0VSUihkZW50cnkpKSB7CiAJCWlmICgobW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUikKQEAgLTE4MSw3ICsxODEsNyBAQAogCQkJZXJyb3IgPSBjcmVhdGUocGFyZW50LT5kX2lub2RlLCAqZGVudHJ5LCBtb2RlKTsKIAl9IGVsc2UKIAkJZXJyb3IgPSBQVFJfRVJSKGRlbnRyeSk7Ci0JdXAoJnBhcmVudC0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKIAogCXJldHVybiBlcnJvcjsKIH0KQEAgLTMwMiw3ICszMDIsNyBAQAogCWlmICghcGFyZW50IHx8ICFwYXJlbnQtPmRfaW5vZGUpCiAJCXJldHVybjsKIAotCWRvd24oJnBhcmVudC0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X2xvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJaWYgKHBvc2l0aXZlKGRlbnRyeSkpIHsKIAkJaWYgKGRlbnRyeS0+ZF9pbm9kZSkgewogCQkJaWYgKFNfSVNESVIoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQpAQCAtMzEyLDcgKzMxMiw3IEBACiAJCQlkcHV0KGRlbnRyeSk7CiAJCX0KIAl9Ci0JdXAoJnBhcmVudC0+ZF9pbm9kZS0+aV9zZW0pOworCW11dGV4X3VubG9jaygmcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKIAlzaW1wbGVfcmVsZWFzZV9mcygmbW91bnQsICZtb3VudF9jb3VudCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzZWN1cml0eWZzX3JlbW92ZSk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL2NvbXBhdC5jIGIvc2VjdXJpdHkva2V5cy9jb21wYXQuYwppbmRleCAzMzAzNjczLi5iY2RiMjg1IDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL2NvbXBhdC5jCisrKyBiL3NlY3VyaXR5L2tleXMvY29tcGF0LmMKQEAgLTc0LDYgKzc0LDEyIEBACiAJY2FzZSBLRVlDVExfU0VUX1JFUUtFWV9LRVlSSU5HOgogCQlyZXR1cm4ga2V5Y3RsX3NldF9yZXFrZXlfa2V5cmluZyhhcmcyKTsKIAorCWNhc2UgS0VZQ1RMX1NFVF9USU1FT1VUOgorCQlyZXR1cm4ga2V5Y3RsX3NldF90aW1lb3V0KGFyZzIsIGFyZzMpOworCisJY2FzZSBLRVlDVExfQVNTVU1FX0FVVEhPUklUWToKKwkJcmV0dXJuIGtleWN0bF9hc3N1bWVfYXV0aG9yaXR5KGFyZzIpOworCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvaW50ZXJuYWwuaCBiL3NlY3VyaXR5L2tleXMvaW50ZXJuYWwuaAppbmRleCAzOWNiYTk3Li5lMDY2ZTYwIDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL2ludGVybmFsLmgKKysrIGIvc2VjdXJpdHkva2V5cy9pbnRlcm5hbC5oCkBAIC0xMDcsMTIgKzEwNywxMyBAQAogc3RydWN0IHJlcXVlc3Rfa2V5X2F1dGggewogCXN0cnVjdCBrZXkJCSp0YXJnZXRfa2V5OwogCXN0cnVjdCB0YXNrX3N0cnVjdAkqY29udGV4dDsKKwljb25zdCBjaGFyCQkqY2FsbG91dF9pbmZvOwogCXBpZF90CQkJcGlkOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBrZXlfdHlwZSBrZXlfdHlwZV9yZXF1ZXN0X2tleV9hdXRoOwogZXh0ZXJuIHN0cnVjdCBrZXkgKnJlcXVlc3Rfa2V5X2F1dGhfbmV3KHN0cnVjdCBrZXkgKnRhcmdldCwKLQkJCQkJc3RydWN0IGtleSAqKl9ya2FrZXkpOworCQkJCQljb25zdCBjaGFyICpjYWxsb3V0X2luZm8pOwogCiBleHRlcm4gc3RydWN0IGtleSAqa2V5X2dldF9pbnN0YW50aWF0aW9uX2F1dGhrZXkoa2V5X3NlcmlhbF90IHRhcmdldF9pZCk7CiAKQEAgLTEzNiw2ICsxMzcsOCBAQAogCQkJCSAgIHNpemVfdCwga2V5X3NlcmlhbF90KTsKIGV4dGVybiBsb25nIGtleWN0bF9uZWdhdGVfa2V5KGtleV9zZXJpYWxfdCwgdW5zaWduZWQsIGtleV9zZXJpYWxfdCk7CiBleHRlcm4gbG9uZyBrZXljdGxfc2V0X3JlcWtleV9rZXlyaW5nKGludCk7CitleHRlcm4gbG9uZyBrZXljdGxfc2V0X3RpbWVvdXQoa2V5X3NlcmlhbF90LCB1bnNpZ25lZCk7CitleHRlcm4gbG9uZyBrZXljdGxfYXNzdW1lX2F1dGhvcml0eShrZXlfc2VyaWFsX3QpOwogCiAKIC8qCmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL2tleWN0bC5jIGIvc2VjdXJpdHkva2V5cy9rZXljdGwuYwppbmRleCBiN2E0NjhmLi45MGRiNWM3IDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL2tleWN0bC5jCisrKyBiL3NlY3VyaXR5L2tleXMva2V5Y3RsLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L2tleWN0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKQEAgLTgzNCw2ICs4MzUsMTcgQEAKIAlpZiAocGxlbiA+IDMyNzY3KQogCQlnb3RvIGVycm9yOwogCisJLyogdGhlIGFwcHJvcHJpYXRlIGluc3RhbnRpYXRpb24gYXV0aG9yaXNhdGlvbiBrZXkgbXVzdCBoYXZlIGJlZW4KKwkgKiBhc3N1bWVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgKi8KKwlyZXQgPSAtRVBFUk07CisJaW5zdGtleSA9IGN1cnJlbnQtPnJlcXVlc3Rfa2V5X2F1dGg7CisJaWYgKCFpbnN0a2V5KQorCQlnb3RvIGVycm9yOworCisJcmthID0gaW5zdGtleS0+cGF5bG9hZC5kYXRhOworCWlmIChya2EtPnRhcmdldF9rZXktPnNlcmlhbCAhPSBpZCkKKwkJZ290byBlcnJvcjsKKwogCS8qIHB1bGwgdGhlIHBheWxvYWQgaW4gaWYgb25lIHdhcyBzdXBwbGllZCAqLwogCXBheWxvYWQgPSBOVUxMOwogCkBAIC04NDgsMTUgKzg2MCw2IEBACiAJCQlnb3RvIGVycm9yMjsKIAl9CiAKLQkvKiBmaW5kIHRoZSBpbnN0YW50aWF0aW9uIGF1dGhvcmlzYXRpb24ga2V5ICovCi0JaW5zdGtleSA9IGtleV9nZXRfaW5zdGFudGlhdGlvbl9hdXRoa2V5KGlkKTsKLQlpZiAoSVNfRVJSKGluc3RrZXkpKSB7Ci0JCXJldCA9IFBUUl9FUlIoaW5zdGtleSk7Ci0JCWdvdG8gZXJyb3IyOwotCX0KLQotCXJrYSA9IGluc3RrZXktPnBheWxvYWQuZGF0YTsKLQogCS8qIGZpbmQgdGhlIGRlc3RpbmF0aW9uIGtleXJpbmcgYW1vbmdzdCB0aG9zZSBiZWxvbmdpbmcgdG8gdGhlCiAJICogcmVxdWVzdGluZyB0YXNrICovCiAJa2V5cmluZ19yZWYgPSBOVUxMOwpAQCAtODY1LDcgKzg2OCw3IEBACiAJCQkJCSAgICAgIEtFWV9XUklURSk7CiAJCWlmIChJU19FUlIoa2V5cmluZ19yZWYpKSB7CiAJCQlyZXQgPSBQVFJfRVJSKGtleXJpbmdfcmVmKTsKLQkJCWdvdG8gZXJyb3IzOworCQkJZ290byBlcnJvcjI7CiAJCX0KIAl9CiAKQEAgLTg3NCwxMSArODc3LDE3IEBACiAJCQkJICAgICAgIGtleV9yZWZfdG9fcHRyKGtleXJpbmdfcmVmKSwgaW5zdGtleSk7CiAKIAlrZXlfcmVmX3B1dChrZXlyaW5nX3JlZik7Ci0gZXJyb3IzOgotCWtleV9wdXQoaW5zdGtleSk7Ci0gZXJyb3IyOgorCisJLyogZGlzY2FyZCB0aGUgYXNzdW1lZCBhdXRob3JpdHkgaWYgaXQncyBqdXN0IGJlZW4gZGlzYWJsZWQgYnkKKwkgKiBpbnN0YW50aWF0aW9uIG9mIHRoZSBrZXkgKi8KKwlpZiAocmV0ID09IDApIHsKKwkJa2V5X3B1dChjdXJyZW50LT5yZXF1ZXN0X2tleV9hdXRoKTsKKwkJY3VycmVudC0+cmVxdWVzdF9rZXlfYXV0aCA9IE5VTEw7CisJfQorCitlcnJvcjI6CiAJa2ZyZWUocGF5bG9hZCk7Ci0gZXJyb3I6CitlcnJvcjoKIAlyZXR1cm4gcmV0OwogCiB9IC8qIGVuZCBrZXljdGxfaW5zdGFudGlhdGVfa2V5KCkgKi8KQEAgLTg5NSwxNCArOTA0LDE2IEBACiAJa2V5X3JlZl90IGtleXJpbmdfcmVmOwogCWxvbmcgcmV0OwogCi0JLyogZmluZCB0aGUgaW5zdGFudGlhdGlvbiBhdXRob3Jpc2F0aW9uIGtleSAqLwotCWluc3RrZXkgPSBrZXlfZ2V0X2luc3RhbnRpYXRpb25fYXV0aGtleShpZCk7Ci0JaWYgKElTX0VSUihpbnN0a2V5KSkgewotCQlyZXQgPSBQVFJfRVJSKGluc3RrZXkpOworCS8qIHRoZSBhcHByb3ByaWF0ZSBpbnN0YW50aWF0aW9uIGF1dGhvcmlzYXRpb24ga2V5IG11c3QgaGF2ZSBiZWVuCisJICogYXNzdW1lZCBiZWZvcmUgY2FsbGluZyB0aGlzICovCisJcmV0ID0gLUVQRVJNOworCWluc3RrZXkgPSBjdXJyZW50LT5yZXF1ZXN0X2tleV9hdXRoOworCWlmICghaW5zdGtleSkKIAkJZ290byBlcnJvcjsKLQl9CiAKIAlya2EgPSBpbnN0a2V5LT5wYXlsb2FkLmRhdGE7CisJaWYgKHJrYS0+dGFyZ2V0X2tleS0+c2VyaWFsICE9IGlkKQorCQlnb3RvIGVycm9yOwogCiAJLyogZmluZCB0aGUgZGVzdGluYXRpb24ga2V5cmluZyBpZiBwcmVzZW50ICh3aGljaCBtdXN0IGFsc28gYmUKIAkgKiB3cml0YWJsZSkgKi8KQEAgLTkxMSw3ICs5MjIsNyBAQAogCQlrZXlyaW5nX3JlZiA9IGxvb2t1cF91c2VyX2tleShOVUxMLCByaW5naWQsIDEsIDAsIEtFWV9XUklURSk7CiAJCWlmIChJU19FUlIoa2V5cmluZ19yZWYpKSB7CiAJCQlyZXQgPSBQVFJfRVJSKGtleXJpbmdfcmVmKTsKLQkJCWdvdG8gZXJyb3IyOworCQkJZ290byBlcnJvcjsKIAkJfQogCX0KIApAQCAtOTIwLDkgKzkzMSwxNSBAQAogCQkJCSAga2V5X3JlZl90b19wdHIoa2V5cmluZ19yZWYpLCBpbnN0a2V5KTsKIAogCWtleV9yZWZfcHV0KGtleXJpbmdfcmVmKTsKLSBlcnJvcjI6Ci0Ja2V5X3B1dChpbnN0a2V5KTsKLSBlcnJvcjoKKworCS8qIGRpc2NhcmQgdGhlIGFzc3VtZWQgYXV0aG9yaXR5IGlmIGl0J3MganVzdCBiZWVuIGRpc2FibGVkIGJ5CisJICogaW5zdGFudGlhdGlvbiBvZiB0aGUga2V5ICovCisJaWYgKHJldCA9PSAwKSB7CisJCWtleV9wdXQoY3VycmVudC0+cmVxdWVzdF9rZXlfYXV0aCk7CisJCWN1cnJlbnQtPnJlcXVlc3Rfa2V5X2F1dGggPSBOVUxMOworCX0KKworZXJyb3I6CiAJcmV0dXJuIHJldDsKIAogfSAvKiBlbmQga2V5Y3RsX25lZ2F0ZV9rZXkoKSAqLwpAQCAtOTY3LDYgKzk4NCw4OCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgorICogc2V0IG9yIGNsZWFyIHRoZSB0aW1lb3V0IGZvciBhIGtleQorICovCitsb25nIGtleWN0bF9zZXRfdGltZW91dChrZXlfc2VyaWFsX3QgaWQsIHVuc2lnbmVkIHRpbWVvdXQpCit7CisJc3RydWN0IHRpbWVzcGVjIG5vdzsKKwlzdHJ1Y3Qga2V5ICprZXk7CisJa2V5X3JlZl90IGtleV9yZWY7CisJdGltZV90IGV4cGlyeTsKKwlsb25nIHJldDsKKworCWtleV9yZWYgPSBsb29rdXBfdXNlcl9rZXkoTlVMTCwgaWQsIDEsIDEsIEtFWV9TRVRBVFRSKTsKKwlpZiAoSVNfRVJSKGtleV9yZWYpKSB7CisJCXJldCA9IFBUUl9FUlIoa2V5X3JlZik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJa2V5ID0ga2V5X3JlZl90b19wdHIoa2V5X3JlZik7CisKKwkvKiBtYWtlIHRoZSBjaGFuZ2VzIHdpdGggdGhlIGxvY2tzIGhlbGQgdG8gcHJldmVudCByYWNlcyAqLworCWRvd25fd3JpdGUoJmtleS0+c2VtKTsKKworCWV4cGlyeSA9IDA7CisJaWYgKHRpbWVvdXQgPiAwKSB7CisJCW5vdyA9IGN1cnJlbnRfa2VybmVsX3RpbWUoKTsKKwkJZXhwaXJ5ID0gbm93LnR2X3NlYyArIHRpbWVvdXQ7CisJfQorCisJa2V5LT5leHBpcnkgPSBleHBpcnk7CisKKwl1cF93cml0ZSgma2V5LT5zZW0pOworCWtleV9wdXQoa2V5KTsKKworCXJldCA9IDA7CitlcnJvcjoKKwlyZXR1cm4gcmV0OworCit9IC8qIGVuZCBrZXljdGxfc2V0X3RpbWVvdXQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogYXNzdW1lIHRoZSBhdXRob3JpdHkgdG8gaW5zdGFudGlhdGUgdGhlIHNwZWNpZmllZCBrZXkKKyAqLworbG9uZyBrZXljdGxfYXNzdW1lX2F1dGhvcml0eShrZXlfc2VyaWFsX3QgaWQpCit7CisJc3RydWN0IGtleSAqYXV0aGtleTsKKwlsb25nIHJldDsKKworCS8qIHNwZWNpYWwga2V5IElEcyBhcmVuJ3QgcGVybWl0dGVkICovCisJcmV0ID0gLUVJTlZBTDsKKwlpZiAoaWQgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogd2UgZGl2ZXN0IG91cnNlbHZlcyBvZiBhdXRob3JpdHkgaWYgZ2l2ZW4gYW4gSUQgb2YgMCAqLworCWlmIChpZCA9PSAwKSB7CisJCWtleV9wdXQoY3VycmVudC0+cmVxdWVzdF9rZXlfYXV0aCk7CisJCWN1cnJlbnQtPnJlcXVlc3Rfa2V5X2F1dGggPSBOVUxMOworCQlyZXQgPSAwOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIGF0dGVtcHQgdG8gYXNzdW1lIHRoZSBhdXRob3JpdHkgdGVtcG9yYXJpbHkgZ3JhbnRlZCB0byB1cyB3aGlsc3Qgd2UKKwkgKiBpbnN0YW50aWF0ZSB0aGUgc3BlY2lmaWVkIGtleQorCSAqIC0gdGhlIGF1dGhvcmlzYXRpb24ga2V5IG11c3QgYmUgaW4gdGhlIGN1cnJlbnQgdGFzaydzIGtleXJpbmdzCisJICogICBzb21ld2hlcmUKKwkgKi8KKwlhdXRoa2V5ID0ga2V5X2dldF9pbnN0YW50aWF0aW9uX2F1dGhrZXkoaWQpOworCWlmIChJU19FUlIoYXV0aGtleSkpIHsKKwkJcmV0ID0gUFRSX0VSUihhdXRoa2V5KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlrZXlfcHV0KGN1cnJlbnQtPnJlcXVlc3Rfa2V5X2F1dGgpOworCWN1cnJlbnQtPnJlcXVlc3Rfa2V5X2F1dGggPSBhdXRoa2V5OworCXJldCA9IGF1dGhrZXktPnNlcmlhbDsKKworZXJyb3I6CisJcmV0dXJuIHJldDsKKworfSAvKiBlbmQga2V5Y3RsX2Fzc3VtZV9hdXRob3JpdHkoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgogICogdGhlIGtleSBjb250cm9sIHN5c3RlbSBjYWxsCiAgKi8KIGFzbWxpbmthZ2UgbG9uZyBzeXNfa2V5Y3RsKGludCBvcHRpb24sIHVuc2lnbmVkIGxvbmcgYXJnMiwgdW5zaWduZWQgbG9uZyBhcmczLApAQCAtMTAzOCw2ICsxMTM3LDEzIEBACiAJY2FzZSBLRVlDVExfU0VUX1JFUUtFWV9LRVlSSU5HOgogCQlyZXR1cm4ga2V5Y3RsX3NldF9yZXFrZXlfa2V5cmluZyhhcmcyKTsKIAorCWNhc2UgS0VZQ1RMX1NFVF9USU1FT1VUOgorCQlyZXR1cm4ga2V5Y3RsX3NldF90aW1lb3V0KChrZXlfc2VyaWFsX3QpIGFyZzIsCisJCQkJCSAgKHVuc2lnbmVkKSBhcmczKTsKKworCWNhc2UgS0VZQ1RMX0FTU1VNRV9BVVRIT1JJVFk6CisJCXJldHVybiBrZXljdGxfYXNzdW1lX2F1dGhvcml0eSgoa2V5X3NlcmlhbF90KSBhcmcyKTsKKwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL2tleXJpbmcuYyBiL3NlY3VyaXR5L2tleXMva2V5cmluZy5jCmluZGV4IDVkMjJjMDMuLmQ2NWExODAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMva2V5cmluZy5jCisrKyBiL3NlY3VyaXR5L2tleXMva2V5cmluZy5jCkBAIC00ODEsNTEgKzQ4MSw2IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCi0gKiBzZWFyY2ggZm9yIGFuIGluc3RhbnRpYXRpb24gYXV0aG9yaXNhdGlvbiBrZXkgbWF0Y2hpbmcgYSB0YXJnZXQga2V5Ci0gKiAtIHRoZSBSQ1UgcmVhZCBsb2NrIG11c3QgYmUgaGVsZCBieSB0aGUgY2FsbGVyCi0gKiAtIGEgdGFyZ2V0X2lkIG9mIHplcm8gc3BlY2lmaWVzIGFueSB2YWxpZCB0b2tlbgotICovCi1zdHJ1Y3Qga2V5ICprZXlyaW5nX3NlYXJjaF9pbnN0a2V5KHN0cnVjdCBrZXkgKmtleXJpbmcsCi0JCQkJICAga2V5X3NlcmlhbF90IHRhcmdldF9pZCkKLXsKLQlzdHJ1Y3QgcmVxdWVzdF9rZXlfYXV0aCAqcmthOwotCXN0cnVjdCBrZXlyaW5nX2xpc3QgKmtsaXN0OwotCXN0cnVjdCBrZXkgKmluc3RrZXk7Ci0JaW50IGxvb3A7Ci0KLQlrbGlzdCA9IHJjdV9kZXJlZmVyZW5jZShrZXlyaW5nLT5wYXlsb2FkLnN1YnNjcmlwdGlvbnMpOwotCWlmIChrbGlzdCkgewotCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwga2xpc3QtPm5rZXlzOyBsb29wKyspIHsKLQkJCWluc3RrZXkgPSBrbGlzdC0+a2V5c1tsb29wXTsKLQotCQkJaWYgKGluc3RrZXktPnR5cGUgIT0gJmtleV90eXBlX3JlcXVlc3Rfa2V5X2F1dGgpCi0JCQkJY29udGludWU7Ci0KLQkJCXJrYSA9IGluc3RrZXktPnBheWxvYWQuZGF0YTsKLQkJCWlmICh0YXJnZXRfaWQgJiYgcmthLT50YXJnZXRfa2V5LT5zZXJpYWwgIT0gdGFyZ2V0X2lkKQotCQkJCWNvbnRpbnVlOwotCi0JCQkvKiB0aGUgYXV0aCBrZXkgaXMgcmV2b2tlZCBkdXJpbmcgaW5zdGFudGlhdGlvbiAqLwotCQkJaWYgKCF0ZXN0X2JpdChLRVlfRkxBR19SRVZPS0VELCAmaW5zdGtleS0+ZmxhZ3MpKQotCQkJCWdvdG8gZm91bmQ7Ci0KLQkJCWluc3RrZXkgPSBFUlJfUFRSKC1FS0VZUkVWT0tFRCk7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JfQotCi0JaW5zdGtleSA9IEVSUl9QVFIoLUVBQ0NFUyk7Ci0JZ290byBlcnJvcjsKLQotZm91bmQ6Ci0JYXRvbWljX2luYygmaW5zdGtleS0+dXNhZ2UpOwotZXJyb3I6Ci0JcmV0dXJuIGluc3RrZXk7Ci0KLX0gLyogZW5kIGtleXJpbmdfc2VhcmNoX2luc3RrZXkoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgogICogZmluZCBhIGtleXJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKICAqIC0gYWxsIG5hbWVkIGtleXJpbmdzIGFyZSBzZWFyY2hlZAogICogLSBvbmx5IGZpbmQga2V5cmluZ3Mgd2l0aCBzZWFyY2ggcGVybWlzc2lvbiBmb3IgdGhlIHByb2Nlc3MKQEAgLTY4NCwxNSArNjM5LDMxIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCisgKiBkaXNwb3NlIG9mIGEga2V5cmluZyBsaXN0IGFmdGVyIHRoZSBSQ1UgZ3JhY2UgcGVyaW9kLCBmcmVlaW5nIHRoZSB1bmxpbmtlZAorICoga2V5CisgKi8KK3N0YXRpYyB2b2lkIGtleXJpbmdfdW5saW5rX3JjdV9kaXNwb3NhbChzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKK3sKKwlzdHJ1Y3Qga2V5cmluZ19saXN0ICprbGlzdCA9CisJCWNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBrZXlyaW5nX2xpc3QsIHJjdSk7CisKKwlrZXlfcHV0KGtsaXN0LT5rZXlzW2tsaXN0LT5kZWxrZXldKTsKKwlrZnJlZShrbGlzdCk7CisKK30gLyogZW5kIGtleXJpbmdfdW5saW5rX3JjdV9kaXNwb3NhbCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCiAgKiBsaW5rIGEga2V5IGludG8gdG8gYSBrZXlyaW5nCiAgKiAtIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGtleXJpbmcncyBzZW1hcGhvcmUgd3JpdGUtbG9ja2VkCisgKiAtIGRpc2NhcmQgYWxyZWFkeSBleHRhbnQgbGluayB0byBtYXRjaGluZyBrZXkgaWYgdGhlcmUgaXMgb25lCiAgKi8KIGludCBfX2tleV9saW5rKHN0cnVjdCBrZXkgKmtleXJpbmcsIHN0cnVjdCBrZXkgKmtleSkKIHsKIAlzdHJ1Y3Qga2V5cmluZ19saXN0ICprbGlzdCwgKm5rbGlzdDsKIAl1bnNpZ25lZCBtYXg7CiAJc2l6ZV90IHNpemU7Ci0JaW50IHJldDsKKwlpbnQgbG9vcCwgcmV0OwogCiAJcmV0ID0gLUVLRVlSRVZPS0VEOwogCWlmICh0ZXN0X2JpdChLRVlfRkxBR19SRVZPS0VELCAma2V5cmluZy0+ZmxhZ3MpKQpAQCAtNzE0LDYgKzY4NSw0OCBAQAogCQkJZ290byBlcnJvcjI7CiAJfQogCisJLyogc2VlIGlmIHRoZXJlJ3MgYSBtYXRjaGluZyBrZXkgd2UgY2FuIGRpc3BsYWNlICovCisJa2xpc3QgPSBrZXlyaW5nLT5wYXlsb2FkLnN1YnNjcmlwdGlvbnM7CisKKwlpZiAoa2xpc3QgJiYga2xpc3QtPm5rZXlzID4gMCkgeworCQlzdHJ1Y3Qga2V5X3R5cGUgKnR5cGUgPSBrZXktPnR5cGU7CisKKwkJZm9yIChsb29wID0ga2xpc3QtPm5rZXlzIC0gMTsgbG9vcCA+PSAwOyBsb29wLS0pIHsKKwkJCWlmIChrbGlzdC0+a2V5c1tsb29wXS0+dHlwZSA9PSB0eXBlICYmCisJCQkgICAgc3RyY21wKGtsaXN0LT5rZXlzW2xvb3BdLT5kZXNjcmlwdGlvbiwKKwkJCQkgICBrZXktPmRlc2NyaXB0aW9uKSA9PSAwCisJCQkgICAgKSB7CisJCQkJLyogZm91bmQgYSBtYXRjaCAtIHJlcGxhY2Ugd2l0aCBuZXcga2V5ICovCisJCQkJc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga2V5ICopICoga2xpc3QtPm1heGtleXM7CisJCQkJc2l6ZSArPSBzaXplb2YoKmtsaXN0KTsKKwkJCQlCVUdfT04oc2l6ZSA+IFBBR0VfU0laRSk7CisKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCW5rbGlzdCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKCFua2xpc3QpCisJCQkJCWdvdG8gZXJyb3IyOworCisJCQkJbWVtY3B5KG5rbGlzdCwga2xpc3QsIHNpemUpOworCisJCQkJLyogcmVwbGFjZSBtYXRjaGVkIGtleSAqLworCQkJCWF0b21pY19pbmMoJmtleS0+dXNhZ2UpOworCQkJCW5rbGlzdC0+a2V5c1tsb29wXSA9IGtleTsKKworCQkJCXJjdV9hc3NpZ25fcG9pbnRlcigKKwkJCQkJa2V5cmluZy0+cGF5bG9hZC5zdWJzY3JpcHRpb25zLAorCQkJCQlua2xpc3QpOworCisJCQkJLyogZGlzcG9zZSBvZiB0aGUgb2xkIGtleXJpbmcgbGlzdCBhbmQgdGhlCisJCQkJICogZGlzcGxhY2VkIGtleSAqLworCQkJCWtsaXN0LT5kZWxrZXkgPSBsb29wOworCQkJCWNhbGxfcmN1KCZrbGlzdC0+cmN1LAorCQkJCQkga2V5cmluZ191bmxpbmtfcmN1X2Rpc3Bvc2FsKTsKKworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfQorCX0KKwogCS8qIGNoZWNrIHRoYXQgd2UgYXJlbid0IGdvaW5nIHRvIG92ZXJydW4gdGhlIHVzZXIncyBxdW90YSAqLwogCXJldCA9IGtleV9wYXlsb2FkX3Jlc2VydmUoa2V5cmluZywKIAkJCQkgIGtleXJpbmctPmRhdGFsZW4gKyBLRVlRVU9UQV9MSU5LX0JZVEVTKTsKQEAgLTczMCw4ICs3NDMsNiBAQAogCQlzbXBfd21iKCk7CiAJCWtsaXN0LT5ua2V5cysrOwogCQlzbXBfd21iKCk7Ci0KLQkJcmV0ID0gMDsKIAl9CiAJZWxzZSB7CiAJCS8qIGdyb3cgdGhlIGtleSBsaXN0ICovCkBAIC03NjksMTYgKzc4MCwxNiBAQAogCQkvKiBkaXNwb3NlIG9mIHRoZSBvbGQga2V5cmluZyBsaXN0ICovCiAJCWlmIChrbGlzdCkKIAkJCWNhbGxfcmN1KCZrbGlzdC0+cmN1LCBrZXlyaW5nX2xpbmtfcmN1X2Rpc3Bvc2FsKTsKLQotCQlyZXQgPSAwOwogCX0KIAotIGVycm9yMjoKK2RvbmU6CisJcmV0ID0gMDsKK2Vycm9yMjoKIAl1cF93cml0ZSgma2V5cmluZ19zZXJpYWxpc2VfbGlua19zZW0pOwotIGVycm9yOgorZXJyb3I6CiAJcmV0dXJuIHJldDsKIAotIGVycm9yMzoKK2Vycm9yMzoKIAkvKiB1bmRvIHRoZSBxdW90YSBjaGFuZ2VzICovCiAJa2V5X3BheWxvYWRfcmVzZXJ2ZShrZXlyaW5nLAogCQkJICAgIGtleXJpbmctPmRhdGFsZW4gLSBLRVlRVU9UQV9MSU5LX0JZVEVTKTsKQEAgLTgwOSwyMSArODIwLDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIGRpc3Bvc2Ugb2YgYSBrZXlyaW5nIGxpc3QgYWZ0ZXIgdGhlIFJDVSBncmFjZSBwZXJpb2QsIGZyZWVpbmcgdGhlIHVubGlua2VkCi0gKiBrZXkKLSAqLwotc3RhdGljIHZvaWQga2V5cmluZ191bmxpbmtfcmN1X2Rpc3Bvc2FsKHN0cnVjdCByY3VfaGVhZCAqcmN1KQotewotCXN0cnVjdCBrZXlyaW5nX2xpc3QgKmtsaXN0ID0KLQkJY29udGFpbmVyX29mKHJjdSwgc3RydWN0IGtleXJpbmdfbGlzdCwgcmN1KTsKLQotCWtleV9wdXQoa2xpc3QtPmtleXNba2xpc3QtPmRlbGtleV0pOwotCWtmcmVlKGtsaXN0KTsKLQotfSAvKiBlbmQga2V5cmluZ191bmxpbmtfcmN1X2Rpc3Bvc2FsKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKICAqIHVubGluayB0aGUgZmlyc3QgbGluayB0byBhIGtleSBmcm9tIGEga2V5cmluZwogICovCiBpbnQga2V5X3VubGluayhzdHJ1Y3Qga2V5ICprZXlyaW5nLCBzdHJ1Y3Qga2V5ICprZXkpCmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL3Blcm1pc3Npb24uYyBiL3NlY3VyaXR5L2tleXMvcGVybWlzc2lvbi5jCmluZGV4IGU3ZjU3OWMuLjNiNDFmOWIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMvcGVybWlzc2lvbi5jCisrKyBiL3NlY3VyaXR5L2tleXMvcGVybWlzc2lvbi5jCkBAIC03MywzICs3MywzNSBAQAogfSAvKiBlbmQga2V5X3Rhc2tfcGVybWlzc2lvbigpICovCiAKIEVYUE9SVF9TWU1CT0woa2V5X3Rhc2tfcGVybWlzc2lvbik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiB2YWxpZGF0ZSBhIGtleQorICovCitpbnQga2V5X3ZhbGlkYXRlKHN0cnVjdCBrZXkgKmtleSkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgbm93OworCWludCByZXQgPSAwOworCisJaWYgKGtleSkgeworCQkvKiBjaGVjayBpdCdzIHN0aWxsIGFjY2Vzc2libGUgKi8KKwkJcmV0ID0gLUVLRVlSRVZPS0VEOworCQlpZiAodGVzdF9iaXQoS0VZX0ZMQUdfUkVWT0tFRCwgJmtleS0+ZmxhZ3MpIHx8CisJCSAgICB0ZXN0X2JpdChLRVlfRkxBR19ERUFELCAma2V5LT5mbGFncykpCisJCQlnb3RvIGVycm9yOworCisJCS8qIGNoZWNrIGl0IGhhc24ndCBleHBpcmVkICovCisJCXJldCA9IDA7CisJCWlmIChrZXktPmV4cGlyeSkgeworCQkJbm93ID0gY3VycmVudF9rZXJuZWxfdGltZSgpOworCQkJaWYgKG5vdy50dl9zZWMgPj0ga2V5LT5leHBpcnkpCisJCQkJcmV0ID0gLUVLRVlFWFBJUkVEOworCQl9CisJfQorCisgZXJyb3I6CisJcmV0dXJuIHJldDsKKworfSAvKiBlbmQga2V5X3ZhbGlkYXRlKCkgKi8KKworRVhQT1JUX1NZTUJPTChrZXlfdmFsaWRhdGUpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9wcm9jZXNzX2tleXMuYyBiL3NlY3VyaXR5L2tleXMvcHJvY2Vzc19rZXlzLmMKaW5kZXggNTY2YjFjYy4uNzRjYjc5ZSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkva2V5cy9wcm9jZXNzX2tleXMuYworKysgYi9zZWN1cml0eS9rZXlzL3Byb2Nlc3Nfa2V5cy5jCkBAIC0yNzAsOSArMjcwLDE0IEBACiBpbnQgY29weV9rZXlzKHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewogCWtleV9jaGVjayh0c2stPnRocmVhZF9rZXlyaW5nKTsKKwlrZXlfY2hlY2sodHNrLT5yZXF1ZXN0X2tleV9hdXRoKTsKIAogCS8qIG5vIHRocmVhZCBrZXlyaW5nIHlldCAqLwogCXRzay0+dGhyZWFkX2tleXJpbmcgPSBOVUxMOworCisJLyogY29weSB0aGUgcmVxdWVzdF9rZXkoKSBhdXRob3Jpc2F0aW9uIGZvciB0aGlzIHRocmVhZCAqLworCWtleV9nZXQodHNrLT5yZXF1ZXN0X2tleV9hdXRoKTsKKwogCXJldHVybiAwOwogCiB9IC8qIGVuZCBjb3B5X2tleXMoKSAqLwpAQCAtMjkwLDExICsyOTUsMTIgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIGRpc3Bvc2Ugb2Yga2V5cyB1cG9uIHRocmVhZCBleGl0CisgKiBkaXNwb3NlIG9mIHBlci10aHJlYWQga2V5cyB1cG9uIHRocmVhZCBleGl0CiAgKi8KIHZvaWQgZXhpdF9rZXlzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewogCWtleV9wdXQodHNrLT50aHJlYWRfa2V5cmluZyk7CisJa2V5X3B1dCh0c2stPnJlcXVlc3Rfa2V5X2F1dGgpOwogCiB9IC8qIGVuZCBleGl0X2tleXMoKSAqLwogCkBAIC0zODIsNyArMzg4LDcgQEAKIAkJCQkgIHN0cnVjdCB0YXNrX3N0cnVjdCAqY29udGV4dCkKIHsKIAlzdHJ1Y3QgcmVxdWVzdF9rZXlfYXV0aCAqcmthOwotCWtleV9yZWZfdCBrZXlfcmVmLCByZXQsIGVyciwgaW5zdGtleV9yZWY7CisJa2V5X3JlZl90IGtleV9yZWYsIHJldCwgZXJyOwogCiAJLyogd2Ugd2FudCB0byByZXR1cm4gLUVBR0FJTiBvciAtRU5PS0VZIGlmIGFueSBvZiB0aGUga2V5cmluZ3Mgd2VyZQogCSAqIHNlYXJjaGFibGUsIGJ1dCB3ZSBmYWlsZWQgdG8gZmluZCBhIGtleSBvciB3ZSBmb3VuZCBhIG5lZ2F0aXZlIGtleTsKQEAgLTQ2MSw0NCArNDY3LDYgQEAKIAkJCWVyciA9IGtleV9yZWY7CiAJCQlicmVhazsKIAkJfQotCi0JCS8qIGlmIHRoaXMgcHJvY2VzcyBoYXMgYSBzZXNzaW9uIGtleXJpbmcgYW5kIHRoYXQgaGFzIGFuCi0JCSAqIGluc3RhbnRpYXRpb24gYXV0aG9yaXNhdGlvbiBrZXkgaW4gdGhlIGJvdHRvbSBsZXZlbCwgdGhlbiB3ZQotCQkgKiBhbHNvIHNlYXJjaCB0aGUga2V5cmluZ3Mgb2YgdGhlIHByb2Nlc3MgbWVudGlvbmVkIHRoZXJlICovCi0JCWlmIChjb250ZXh0ICE9IGN1cnJlbnQpCi0JCQlnb3RvIG5vX2tleTsKLQotCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCWluc3RrZXlfcmVmID0gX19rZXlyaW5nX3NlYXJjaF9vbmUoCi0JCQltYWtlX2tleV9yZWYocmN1X2RlcmVmZXJlbmNlKAotCQkJCQkgICAgIGNvbnRleHQtPnNpZ25hbC0+c2Vzc2lvbl9rZXlyaW5nKSwKLQkJCQkgICAgIDEpLAotCQkJJmtleV90eXBlX3JlcXVlc3Rfa2V5X2F1dGgsIE5VTEwsIDApOwotCQlyY3VfcmVhZF91bmxvY2soKTsKLQotCQlpZiAoSVNfRVJSKGluc3RrZXlfcmVmKSkKLQkJCWdvdG8gbm9fa2V5OwotCi0JCXJrYSA9IGtleV9yZWZfdG9fcHRyKGluc3RrZXlfcmVmKS0+cGF5bG9hZC5kYXRhOwotCi0JCWtleV9yZWYgPSBzZWFyY2hfcHJvY2Vzc19rZXlyaW5ncyh0eXBlLCBkZXNjcmlwdGlvbiwgbWF0Y2gsCi0JCQkJCQkgIHJrYS0+Y29udGV4dCk7Ci0JCWtleV9yZWZfcHV0KGluc3RrZXlfcmVmKTsKLQotCQlpZiAoIUlTX0VSUihrZXlfcmVmKSkKLQkJCWdvdG8gZm91bmQ7Ci0KLQkJc3dpdGNoIChQVFJfRVJSKGtleV9yZWYpKSB7Ci0JCWNhc2UgLUVBR0FJTjogLyogbm8ga2V5ICovCi0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQljYXNlIC1FTk9LRVk6IC8qIG5lZ2F0aXZlIGtleSAqLwotCQkJcmV0ID0ga2V5X3JlZjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZXJyID0ga2V5X3JlZjsKLQkJCWJyZWFrOwotCQl9CiAJfQogCS8qIG9yIHNlYXJjaCB0aGUgdXNlci1zZXNzaW9uIGtleXJpbmcgKi8KIAllbHNlIHsKQEAgLTUyMSw4ICs0ODksMzYgQEAKIAkJfQogCX0KIAorCS8qIGlmIHRoaXMgcHJvY2VzcyBoYXMgYW4gaW5zdGFudGlhdGlvbiBhdXRob3Jpc2F0aW9uIGtleSwgdGhlbiB3ZSBhbHNvCisJICogc2VhcmNoIHRoZSBrZXlyaW5ncyBvZiB0aGUgcHJvY2VzcyBtZW50aW9uZWQgdGhlcmUKKwkgKiAtIHdlIGRvbid0IHBlcm1pdCBhY2Nlc3MgdG8gcmVxdWVzdF9rZXkgYXV0aCBrZXlzIHZpYSB0aGlzIG1ldGhvZAorCSAqLworCWlmIChjb250ZXh0LT5yZXF1ZXN0X2tleV9hdXRoICYmCisJICAgIGNvbnRleHQgPT0gY3VycmVudCAmJgorCSAgICB0eXBlICE9ICZrZXlfdHlwZV9yZXF1ZXN0X2tleV9hdXRoICYmCisJICAgIGtleV92YWxpZGF0ZShjb250ZXh0LT5yZXF1ZXN0X2tleV9hdXRoKSA9PSAwCisJICAgICkgeworCQlya2EgPSBjb250ZXh0LT5yZXF1ZXN0X2tleV9hdXRoLT5wYXlsb2FkLmRhdGE7CiAKLW5vX2tleToKKwkJa2V5X3JlZiA9IHNlYXJjaF9wcm9jZXNzX2tleXJpbmdzKHR5cGUsIGRlc2NyaXB0aW9uLCBtYXRjaCwKKwkJCQkJCSAgcmthLT5jb250ZXh0KTsKKworCQlpZiAoIUlTX0VSUihrZXlfcmVmKSkKKwkJCWdvdG8gZm91bmQ7CisKKwkJc3dpdGNoIChQVFJfRVJSKGtleV9yZWYpKSB7CisJCWNhc2UgLUVBR0FJTjogLyogbm8ga2V5ICovCisJCQlpZiAocmV0KQorCQkJCWJyZWFrOworCQljYXNlIC1FTk9LRVk6IC8qIG5lZ2F0aXZlIGtleSAqLworCQkJcmV0ID0ga2V5X3JlZjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyID0ga2V5X3JlZjsKKwkJCWJyZWFrOworCQl9CisJfQorCiAJLyogbm8ga2V5IC0gZGVjaWRlIG9uIHRoZSBlcnJvciB3ZSdyZSBnb2luZyB0byBnbyBmb3IgKi8KIAlrZXlfcmVmID0gcmV0ID8gcmV0IDogZXJyOwogCkBAIC02MjgsNiArNjI0LDE1IEBACiAJCWtleSA9IEVSUl9QVFIoLUVJTlZBTCk7CiAJCWdvdG8gZXJyb3I7CiAKKwljYXNlIEtFWV9TUEVDX1JFUUtFWV9BVVRIX0tFWToKKwkJa2V5ID0gY29udGV4dC0+cmVxdWVzdF9rZXlfYXV0aDsKKwkJaWYgKCFrZXkpCisJCQlnb3RvIGVycm9yOworCisJCWF0b21pY19pbmMoJmtleS0+dXNhZ2UpOworCQlrZXlfcmVmID0gbWFrZV9rZXlfcmVmKGtleSwgMSk7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJa2V5X3JlZiA9IEVSUl9QVFIoLUVJTlZBTCk7CiAJCWlmIChpZCA8IDEpCmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5LmMgYi9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5LmMKaW5kZXggNWNjNGJiYS4uZjAzMGEwYyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkva2V5cy9yZXF1ZXN0X2tleS5jCisrKyBiL3NlY3VyaXR5L2tleXMvcmVxdWVzdF9rZXkuYwpAQCAtMjksMjggKzI5LDM2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogcmVxdWVzdCB1c2Vyc3BhY2UgZmluaXNoIHRoZSBjb25zdHJ1Y3Rpb24gb2YgYSBrZXkKLSAqIC0gZXhlY3V0ZSAiL3NiaW4vcmVxdWVzdC1rZXkgPG9wPiA8a2V5PiA8dWlkPiA8Z2lkPiA8a2V5cmluZz4gPGtleXJpbmc+IDxrZXlyaW5nPiA8aW5mbz4iCisgKiAtIGV4ZWN1dGUgIi9zYmluL3JlcXVlc3Qta2V5IDxvcD4gPGtleT4gPHVpZD4gPGdpZD4gPGtleXJpbmc+IDxrZXlyaW5nPiA8a2V5cmluZz4iCiAgKi8KLXN0YXRpYyBpbnQgY2FsbF9yZXF1ZXN0X2tleShzdHJ1Y3Qga2V5ICprZXksCi0JCQkgICAgY29uc3QgY2hhciAqb3AsCi0JCQkgICAgY29uc3QgY2hhciAqY2FsbG91dF9pbmZvKQorc3RhdGljIGludCBjYWxsX3NiaW5fcmVxdWVzdF9rZXkoc3RydWN0IGtleSAqa2V5LAorCQkJCSBzdHJ1Y3Qga2V5ICphdXRoa2V5LAorCQkJCSBjb25zdCBjaGFyICpvcCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAJa2V5X3NlcmlhbF90IHBya2V5LCBzc2tleTsKLQlzdHJ1Y3Qga2V5ICpzZXNzaW9uX2tleXJpbmcsICpya2FrZXk7Ci0JY2hhciAqYXJndlsxMF0sICplbnZwWzNdLCB1aWRfc3RyWzEyXSwgZ2lkX3N0clsxMl07CisJc3RydWN0IGtleSAqa2V5cmluZzsKKwljaGFyICphcmd2WzldLCAqZW52cFszXSwgdWlkX3N0clsxMl0sIGdpZF9zdHJbMTJdOwogCWNoYXIga2V5X3N0clsxMl0sIGtleXJpbmdfc3RyWzNdWzEyXTsKKwljaGFyIGRlc2NbMjBdOwogCWludCByZXQsIGk7CiAKLQlrZW50ZXIoInslZH0sJXMsJXMiLCBrZXktPnNlcmlhbCwgb3AsIGNhbGxvdXRfaW5mbyk7CisJa2VudGVyKCJ7JWR9LHslZH0sJXMiLCBrZXktPnNlcmlhbCwgYXV0aGtleS0+c2VyaWFsLCBvcCk7CiAKLQkvKiBnZW5lcmF0ZSBhIG5ldyBzZXNzaW9uIGtleXJpbmcgd2l0aCBhbiBhdXRoIGtleSBpbiBpdCAqLwotCXNlc3Npb25fa2V5cmluZyA9IHJlcXVlc3Rfa2V5X2F1dGhfbmV3KGtleSwgJnJrYWtleSk7Ci0JaWYgKElTX0VSUihzZXNzaW9uX2tleXJpbmcpKSB7Ci0JCXJldCA9IFBUUl9FUlIoc2Vzc2lvbl9rZXlyaW5nKTsKLQkJZ290byBlcnJvcjsKKwkvKiBhbGxvY2F0ZSBhIG5ldyBzZXNzaW9uIGtleXJpbmcgKi8KKwlzcHJpbnRmKGRlc2MsICJfcmVxLiV1Iiwga2V5LT5zZXJpYWwpOworCisJa2V5cmluZyA9IGtleXJpbmdfYWxsb2MoZGVzYywgY3VycmVudC0+ZnN1aWQsIGN1cnJlbnQtPmZzZ2lkLCAxLCBOVUxMKTsKKwlpZiAoSVNfRVJSKGtleXJpbmcpKSB7CisJCXJldCA9IFBUUl9FUlIoa2V5cmluZyk7CisJCWdvdG8gZXJyb3JfYWxsb2M7CiAJfQogCisJLyogYXR0YWNoIHRoZSBhdXRoIGtleSB0byB0aGUgc2Vzc2lvbiBrZXlyaW5nICovCisJcmV0ID0gX19rZXlfbGluayhrZXlyaW5nLCBhdXRoa2V5KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9saW5rOworCiAJLyogcmVjb3JkIHRoZSBVSUQgYW5kIEdJRCAqLwogCXNwcmludGYodWlkX3N0ciwgIiVkIiwgY3VycmVudC0+ZnN1aWQpOwogCXNwcmludGYoZ2lkX3N0ciwgIiVkIiwgY3VycmVudC0+ZnNnaWQpOwpAQCAtOTUsMjIgKzEwMywxOSBAQAogCWFyZ3ZbaSsrXSA9IGtleXJpbmdfc3RyWzBdOwogCWFyZ3ZbaSsrXSA9IGtleXJpbmdfc3RyWzFdOwogCWFyZ3ZbaSsrXSA9IGtleXJpbmdfc3RyWzJdOwotCWFyZ3ZbaSsrXSA9IChjaGFyICopIGNhbGxvdXRfaW5mbzsKIAlhcmd2W2ldID0gTlVMTDsKIAogCS8qIGRvIGl0ICovCi0JcmV0ID0gY2FsbF91c2VybW9kZWhlbHBlcl9rZXlzKGFyZ3ZbMF0sIGFyZ3YsIGVudnAsIHNlc3Npb25fa2V5cmluZywgMSk7CisJcmV0ID0gY2FsbF91c2VybW9kZWhlbHBlcl9rZXlzKGFyZ3ZbMF0sIGFyZ3YsIGVudnAsIGtleXJpbmcsIDEpOwogCi0JLyogZGlzcG9zZSBvZiB0aGUgc3BlY2lhbCBrZXlzICovCi0Ja2V5X3Jldm9rZShya2FrZXkpOwotCWtleV9wdXQocmtha2V5KTsKLQlrZXlfcHV0KHNlc3Npb25fa2V5cmluZyk7CitlcnJvcl9saW5rOgorCWtleV9wdXQoa2V5cmluZyk7CiAKLSBlcnJvcjoKK2Vycm9yX2FsbG9jOgogCWtsZWF2ZSgiID0gJWQiLCByZXQpOwogCXJldHVybiByZXQ7CiAKLX0gLyogZW5kIGNhbGxfcmVxdWVzdF9rZXkoKSAqLworfSAvKiBlbmQgY2FsbF9zYmluX3JlcXVlc3Rfa2V5KCkgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKQEAgLTEyMiw5ICsxMjcsMTAgQEAKIAkJCQkJICAgICAgY29uc3QgY2hhciAqZGVzY3JpcHRpb24sCiAJCQkJCSAgICAgIGNvbnN0IGNoYXIgKmNhbGxvdXRfaW5mbykKIHsKKwlyZXF1ZXN0X2tleV9hY3Rvcl90IGFjdG9yOwogCXN0cnVjdCBrZXlfY29uc3RydWN0aW9uIGNvbnM7CiAJc3RydWN0IHRpbWVzcGVjIG5vdzsKLQlzdHJ1Y3Qga2V5ICprZXk7CisJc3RydWN0IGtleSAqa2V5LCAqYXV0aGtleTsKIAlpbnQgcmV0LCBuZWdhdGVkOwogCiAJa2VudGVyKCIlcywlcywlcyIsIHR5cGUtPm5hbWUsIGRlc2NyaXB0aW9uLCBjYWxsb3V0X2luZm8pOwpAQCAtMTQzLDggKzE0OSwxOSBAQAogCS8qIHdlIGRyb3AgdGhlIGNvbnN0cnVjdGlvbiBzZW0gaGVyZSBvbiBiZWhhbGYgb2YgdGhlIGNhbGxlciAqLwogCXVwX3dyaXRlKCZrZXlfY29uc3RydWN0aW9uX3NlbSk7CiAKKwkvKiBhbGxvY2F0ZSBhbiBhdXRob3Jpc2F0aW9uIGtleSAqLworCWF1dGhrZXkgPSByZXF1ZXN0X2tleV9hdXRoX25ldyhrZXksIGNhbGxvdXRfaW5mbyk7CisJaWYgKElTX0VSUihhdXRoa2V5KSkgeworCQlyZXQgPSBQVFJfRVJSKGF1dGhrZXkpOworCQlhdXRoa2V5ID0gTlVMTDsKKwkJZ290byBhbGxvY19hdXRoa2V5X2ZhaWxlZDsKKwl9CisKIAkvKiBtYWtlIHRoZSBjYWxsICovCi0JcmV0ID0gY2FsbF9yZXF1ZXN0X2tleShrZXksICJjcmVhdGUiLCBjYWxsb3V0X2luZm8pOworCWFjdG9yID0gY2FsbF9zYmluX3JlcXVlc3Rfa2V5OworCWlmICh0eXBlLT5yZXF1ZXN0X2tleSkKKwkJYWN0b3IgPSB0eXBlLT5yZXF1ZXN0X2tleTsKKwlyZXQgPSBhY3RvcihrZXksIGF1dGhrZXksICJjcmVhdGUiKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byByZXF1ZXN0X2ZhaWxlZDsKIApAQCAtMTUzLDIyICsxNzAsMjkgQEAKIAlpZiAoIXRlc3RfYml0KEtFWV9GTEFHX0lOU1RBTlRJQVRFRCwgJmtleS0+ZmxhZ3MpKQogCQlnb3RvIHJlcXVlc3RfZmFpbGVkOwogCisJa2V5X3Jldm9rZShhdXRoa2V5KTsKKwlrZXlfcHV0KGF1dGhrZXkpOworCiAJZG93bl93cml0ZSgma2V5X2NvbnN0cnVjdGlvbl9zZW0pOwogCWxpc3RfZGVsKCZjb25zLmxpbmspOwogCXVwX3dyaXRlKCZrZXlfY29uc3RydWN0aW9uX3NlbSk7CiAKIAkvKiBhbHNvIGdpdmUgYW4gZXJyb3IgaWYgdGhlIGtleSB3YXMgbmVnYXRpdmVseSBpbnN0YW50aWF0ZWQgKi8KLSBjaGVja19ub3RfbmVnYXRpdmU6CitjaGVja19ub3RfbmVnYXRpdmU6CiAJaWYgKHRlc3RfYml0KEtFWV9GTEFHX05FR0FUSVZFLCAma2V5LT5mbGFncykpIHsKIAkJa2V5X3B1dChrZXkpOwogCQlrZXkgPSBFUlJfUFRSKC1FTk9LRVkpOwogCX0KIAotIG91dDoKK291dDoKIAlrbGVhdmUoIiA9ICVwIiwga2V5KTsKIAlyZXR1cm4ga2V5OwogCi0gcmVxdWVzdF9mYWlsZWQ6CityZXF1ZXN0X2ZhaWxlZDoKKwlrZXlfcmV2b2tlKGF1dGhrZXkpOworCWtleV9wdXQoYXV0aGtleSk7CisKK2FsbG9jX2F1dGhrZXlfZmFpbGVkOgogCS8qIGl0IHdhc24ndCBpbnN0YW50aWF0ZWQKIAkgKiAtIHJlbW92ZSBmcm9tIGNvbnN0cnVjdGlvbiBxdWV1ZQogCSAqIC0gbWFyayB0aGUga2V5IGFzIGRlYWQKQEAgLTIxNyw3ICsyNDEsNyBAQAogCWtleSA9IEVSUl9QVFIocmV0KTsKIAlnb3RvIG91dDsKIAotIGFsbG9jX2ZhaWxlZDoKK2FsbG9jX2ZhaWxlZDoKIAl1cF93cml0ZSgma2V5X2NvbnN0cnVjdGlvbl9zZW0pOwogCWdvdG8gb3V0OwogCkBAIC00NjQsMzUgKzQ4OCwzIEBACiB9IC8qIGVuZCByZXF1ZXN0X2tleSgpICovCiAKIEVYUE9SVF9TWU1CT0wocmVxdWVzdF9rZXkpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogdmFsaWRhdGUgYSBrZXkKLSAqLwotaW50IGtleV92YWxpZGF0ZShzdHJ1Y3Qga2V5ICprZXkpCi17Ci0Jc3RydWN0IHRpbWVzcGVjIG5vdzsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChrZXkpIHsKLQkJLyogY2hlY2sgaXQncyBzdGlsbCBhY2Nlc3NpYmxlICovCi0JCXJldCA9IC1FS0VZUkVWT0tFRDsKLQkJaWYgKHRlc3RfYml0KEtFWV9GTEFHX1JFVk9LRUQsICZrZXktPmZsYWdzKSB8fAotCQkgICAgdGVzdF9iaXQoS0VZX0ZMQUdfREVBRCwgJmtleS0+ZmxhZ3MpKQotCQkJZ290byBlcnJvcjsKLQotCQkvKiBjaGVjayBpdCBoYXNuJ3QgZXhwaXJlZCAqLwotCQlyZXQgPSAwOwotCQlpZiAoa2V5LT5leHBpcnkpIHsKLQkJCW5vdyA9IGN1cnJlbnRfa2VybmVsX3RpbWUoKTsKLQkJCWlmIChub3cudHZfc2VjID49IGtleS0+ZXhwaXJ5KQotCQkJCXJldCA9IC1FS0VZRVhQSVJFRDsKLQkJfQotCX0KLQotIGVycm9yOgotCXJldHVybiByZXQ7Ci0KLX0gLyogZW5kIGtleV92YWxpZGF0ZSgpICovCi0KLUVYUE9SVF9TWU1CT0woa2V5X3ZhbGlkYXRlKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvcmVxdWVzdF9rZXlfYXV0aC5jIGIvc2VjdXJpdHkva2V5cy9yZXF1ZXN0X2tleV9hdXRoLmMKaW5kZXggYThlNDA2OS4uY2NlNmJhNiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkva2V5cy9yZXF1ZXN0X2tleV9hdXRoLmMKKysrIGIvc2VjdXJpdHkva2V5cy9yZXF1ZXN0X2tleV9hdXRoLmMKQEAgLTE1LDExICsxNSwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKIHN0YXRpYyBpbnQgcmVxdWVzdF9rZXlfYXV0aF9pbnN0YW50aWF0ZShzdHJ1Y3Qga2V5ICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKIHN0YXRpYyB2b2lkIHJlcXVlc3Rfa2V5X2F1dGhfZGVzY3JpYmUoY29uc3Qgc3RydWN0IGtleSAqLCBzdHJ1Y3Qgc2VxX2ZpbGUgKik7CiBzdGF0aWMgdm9pZCByZXF1ZXN0X2tleV9hdXRoX2Rlc3Ryb3koc3RydWN0IGtleSAqKTsKK3N0YXRpYyBsb25nIHJlcXVlc3Rfa2V5X2F1dGhfcmVhZChjb25zdCBzdHJ1Y3Qga2V5ICosIGNoYXIgX191c2VyICosIHNpemVfdCk7CiAKIC8qCiAgKiB0aGUgcmVxdWVzdC1rZXkgYXV0aG9yaXNhdGlvbiBrZXkgdHlwZSBkZWZpbml0aW9uCkBAIC0zMCw1MSArMzIsMjUgQEAKIAkuaW5zdGFudGlhdGUJPSByZXF1ZXN0X2tleV9hdXRoX2luc3RhbnRpYXRlLAogCS5kZXNjcmliZQk9IHJlcXVlc3Rfa2V5X2F1dGhfZGVzY3JpYmUsCiAJLmRlc3Ryb3kJPSByZXF1ZXN0X2tleV9hdXRoX2Rlc3Ryb3ksCisJLnJlYWQJCT0gcmVxdWVzdF9rZXlfYXV0aF9yZWFkLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIGluc3RhbnRpYXRlIGEgcmVxdWVzdC1rZXkgYXV0aG9yaXNhdGlvbiByZWNvcmQKKyAqIGluc3RhbnRpYXRlIGEgcmVxdWVzdC1rZXkgYXV0aG9yaXNhdGlvbiBrZXkKICAqLwogc3RhdGljIGludCByZXF1ZXN0X2tleV9hdXRoX2luc3RhbnRpYXRlKHN0cnVjdCBrZXkgKmtleSwKIAkJCQkJY29uc3Qgdm9pZCAqZGF0YSwKIAkJCQkJc2l6ZV90IGRhdGFsZW4pCiB7Ci0Jc3RydWN0IHJlcXVlc3Rfa2V5X2F1dGggKnJrYSwgKmlya2E7Ci0Jc3RydWN0IGtleSAqaW5zdGtleTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gLUVOT01FTTsKLQlya2EgPSBrbWFsbG9jKHNpemVvZigqcmthKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHJrYSkgewotCQkvKiBzZWUgaWYgdGhlIGNhbGxpbmcgcHJvY2VzcyBpcyBhbHJlYWR5IHNlcnZpY2luZyB0aGUga2V5Ci0JCSAqIHJlcXVlc3Qgb2YgYW5vdGhlciBwcm9jZXNzICovCi0JCWluc3RrZXkgPSBrZXlfZ2V0X2luc3RhbnRpYXRpb25fYXV0aGtleSgwKTsKLQkJaWYgKCFJU19FUlIoaW5zdGtleSkpIHsKLQkJCS8qIGl0IGlzIC0gdXNlIHRoYXQgaW5zdGFudGlhdGlvbiBjb250ZXh0IGhlcmUgdG9vICovCi0JCQlpcmthID0gaW5zdGtleS0+cGF5bG9hZC5kYXRhOwotCQkJcmthLT5jb250ZXh0ID0gaXJrYS0+Y29udGV4dDsKLQkJCXJrYS0+cGlkID0gaXJrYS0+cGlkOwotCQkJa2V5X3B1dChpbnN0a2V5KTsKLQkJfQotCQllbHNlIHsKLQkJCS8qIGl0IGlzbid0IC0gdXNlIHRoaXMgcHJvY2VzcyBhcyB0aGUgY29udGV4dCAqLwotCQkJcmthLT5jb250ZXh0ID0gY3VycmVudDsKLQkJCXJrYS0+cGlkID0gY3VycmVudC0+cGlkOwotCQl9Ci0KLQkJcmthLT50YXJnZXRfa2V5ID0ga2V5X2dldCgoc3RydWN0IGtleSAqKSBkYXRhKTsKLQkJa2V5LT5wYXlsb2FkLmRhdGEgPSBya2E7Ci0JCXJldCA9IDA7Ci0JfQotCi0JcmV0dXJuIHJldDsKKwlrZXktPnBheWxvYWQuZGF0YSA9IChzdHJ1Y3QgcmVxdWVzdF9rZXlfYXV0aCAqKSBkYXRhOworCXJldHVybiAwOwogCiB9IC8qIGVuZCByZXF1ZXN0X2tleV9hdXRoX2luc3RhbnRpYXRlKCkgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqCisgKiByZWFkaW5nIGEgcmVxdWVzdC1rZXkgYXV0aG9yaXNhdGlvbiBrZXkgcmV0cmlldmVzIHRoZSBjYWxsb3V0IGluZm9ybWF0aW9uCiAgKi8KIHN0YXRpYyB2b2lkIHJlcXVlc3Rfa2V5X2F1dGhfZGVzY3JpYmUoY29uc3Qgc3RydWN0IGtleSAqa2V5LAogCQkJCSAgICAgIHN0cnVjdCBzZXFfZmlsZSAqbSkKQEAgLTgzLDEyICs1OSw0MCBAQAogCiAJc2VxX3B1dHMobSwgImtleToiKTsKIAlzZXFfcHV0cyhtLCBrZXktPmRlc2NyaXB0aW9uKTsKLQlzZXFfcHJpbnRmKG0sICIgcGlkOiVkIiwgcmthLT5waWQpOworCXNlcV9wcmludGYobSwgIiBwaWQ6JWQgY2k6JXp1IiwgcmthLT5waWQsIHN0cmxlbihya2EtPmNhbGxvdXRfaW5mbykpOwogCiB9IC8qIGVuZCByZXF1ZXN0X2tleV9hdXRoX2Rlc2NyaWJlKCkgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKKyAqIHJlYWQgdGhlIGNhbGxvdXRfaW5mbyBkYXRhCisgKiAtIHRoZSBrZXkncyBzZW1hcGhvcmUgaXMgcmVhZC1sb2NrZWQKKyAqLworc3RhdGljIGxvbmcgcmVxdWVzdF9rZXlfYXV0aF9yZWFkKGNvbnN0IHN0cnVjdCBrZXkgKmtleSwKKwkJCQkgIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBidWZsZW4pCit7CisJc3RydWN0IHJlcXVlc3Rfa2V5X2F1dGggKnJrYSA9IGtleS0+cGF5bG9hZC5kYXRhOworCXNpemVfdCBkYXRhbGVuOworCWxvbmcgcmV0OworCisJZGF0YWxlbiA9IHN0cmxlbihya2EtPmNhbGxvdXRfaW5mbyk7CisJcmV0ID0gZGF0YWxlbjsKKworCS8qIHdlIGNhbiByZXR1cm4gdGhlIGRhdGEgYXMgaXMgKi8KKwlpZiAoYnVmZmVyICYmIGJ1ZmxlbiA+IDApIHsKKwkJaWYgKGJ1ZmxlbiA+IGRhdGFsZW4pCisJCQlidWZsZW4gPSBkYXRhbGVuOworCisJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBya2EtPmNhbGxvdXRfaW5mbywgYnVmbGVuKSAhPSAwKQorCQkJcmV0ID0gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gcmV0OworCit9IC8qIGVuZCByZXF1ZXN0X2tleV9hdXRoX3JlYWQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgogICogZGVzdHJveSBhbiBpbnN0YW50aWF0aW9uIGF1dGhvcmlzYXRpb24gdG9rZW4ga2V5CiAgKi8KIHN0YXRpYyB2b2lkIHJlcXVlc3Rfa2V5X2F1dGhfZGVzdHJveShzdHJ1Y3Qga2V5ICprZXkpCkBAIC0xMDQsNTYgKzEwOCw4OSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgotICogY3JlYXRlIGEgc2Vzc2lvbiBrZXlyaW5nIHRvIGJlIGZvciB0aGUgaW52b2thdGlvbiBvZiAvc2Jpbi9yZXF1ZXN0LWtleSBhbmQKLSAqIHN0aWNrIGFuIGF1dGhvcmlzYXRpb24gdG9rZW4gaW4gaXQKKyAqIGNyZWF0ZSBhbiBhdXRob3Jpc2F0aW9uIHRva2VuIGZvciAvc2Jpbi9yZXF1ZXN0LWtleSBvciB3aG9ldmVyIHRvIGdhaW4KKyAqIGFjY2VzcyB0byB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgZGF0YQogICovCi1zdHJ1Y3Qga2V5ICpyZXF1ZXN0X2tleV9hdXRoX25ldyhzdHJ1Y3Qga2V5ICp0YXJnZXQsIHN0cnVjdCBrZXkgKipfcmtha2V5KQorc3RydWN0IGtleSAqcmVxdWVzdF9rZXlfYXV0aF9uZXcoc3RydWN0IGtleSAqdGFyZ2V0LCBjb25zdCBjaGFyICpjYWxsb3V0X2luZm8pCiB7Ci0Jc3RydWN0IGtleSAqa2V5cmluZywgKnJrYWtleSA9IE5VTEw7CisJc3RydWN0IHJlcXVlc3Rfa2V5X2F1dGggKnJrYSwgKmlya2E7CisJc3RydWN0IGtleSAqYXV0aGtleSA9IE5VTEw7CiAJY2hhciBkZXNjWzIwXTsKIAlpbnQgcmV0OwogCiAJa2VudGVyKCIlZCwiLCB0YXJnZXQtPnNlcmlhbCk7CiAKLQkvKiBhbGxvY2F0ZSBhIG5ldyBzZXNzaW9uIGtleXJpbmcgKi8KLQlzcHJpbnRmKGRlc2MsICJfcmVxLiV1IiwgdGFyZ2V0LT5zZXJpYWwpOwotCi0Ja2V5cmluZyA9IGtleXJpbmdfYWxsb2MoZGVzYywgY3VycmVudC0+ZnN1aWQsIGN1cnJlbnQtPmZzZ2lkLCAxLCBOVUxMKTsKLQlpZiAoSVNfRVJSKGtleXJpbmcpKSB7Ci0JCWtsZWF2ZSgiPSAlbGQiLCBQVFJfRVJSKGtleXJpbmcpKTsKLQkJcmV0dXJuIGtleXJpbmc7CisJLyogYWxsb2NhdGUgYSBhdXRoIHJlY29yZCAqLworCXJrYSA9IGttYWxsb2Moc2l6ZW9mKCpya2EpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJrYSkgeworCQlrbGVhdmUoIiA9IC1FTk9NRU0iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCisJLyogc2VlIGlmIHRoZSBjYWxsaW5nIHByb2Nlc3MgaXMgYWxyZWFkeSBzZXJ2aWNpbmcgdGhlIGtleSByZXF1ZXN0IG9mCisJICogYW5vdGhlciBwcm9jZXNzICovCisJaWYgKGN1cnJlbnQtPnJlcXVlc3Rfa2V5X2F1dGgpIHsKKwkJLyogaXQgaXMgLSB1c2UgdGhhdCBpbnN0YW50aWF0aW9uIGNvbnRleHQgaGVyZSB0b28gKi8KKwkJaXJrYSA9IGN1cnJlbnQtPnJlcXVlc3Rfa2V5X2F1dGgtPnBheWxvYWQuZGF0YTsKKwkJcmthLT5jb250ZXh0ID0gaXJrYS0+Y29udGV4dDsKKwkJcmthLT5waWQgPSBpcmthLT5waWQ7CisJfQorCWVsc2UgeworCQkvKiBpdCBpc24ndCAtIHVzZSB0aGlzIHByb2Nlc3MgYXMgdGhlIGNvbnRleHQgKi8KKwkJcmthLT5jb250ZXh0ID0gY3VycmVudDsKKwkJcmthLT5waWQgPSBjdXJyZW50LT5waWQ7CisJfQorCisJcmthLT50YXJnZXRfa2V5ID0ga2V5X2dldCh0YXJnZXQpOworCXJrYS0+Y2FsbG91dF9pbmZvID0gY2FsbG91dF9pbmZvOworCiAJLyogYWxsb2NhdGUgdGhlIGF1dGgga2V5ICovCiAJc3ByaW50ZihkZXNjLCAiJXgiLCB0YXJnZXQtPnNlcmlhbCk7CiAKLQlya2FrZXkgPSBrZXlfYWxsb2MoJmtleV90eXBlX3JlcXVlc3Rfa2V5X2F1dGgsIGRlc2MsCi0JCQkgICBjdXJyZW50LT5mc3VpZCwgY3VycmVudC0+ZnNnaWQsCi0JCQkgICBLRVlfUE9TX1ZJRVcgfCBLRVlfVVNSX1ZJRVcsIDEpOwotCWlmIChJU19FUlIocmtha2V5KSkgewotCQlrZXlfcHV0KGtleXJpbmcpOwotCQlrbGVhdmUoIj0gJWxkIiwgUFRSX0VSUihya2FrZXkpKTsKLQkJcmV0dXJuIHJrYWtleTsKKwlhdXRoa2V5ID0ga2V5X2FsbG9jKCZrZXlfdHlwZV9yZXF1ZXN0X2tleV9hdXRoLCBkZXNjLAorCQkJICAgIGN1cnJlbnQtPmZzdWlkLCBjdXJyZW50LT5mc2dpZCwKKwkJCSAgICBLRVlfUE9TX1ZJRVcgfCBLRVlfUE9TX1JFQUQgfCBLRVlfUE9TX1NFQVJDSCB8CisJCQkgICAgS0VZX1VTUl9WSUVXLCAxKTsKKwlpZiAoSVNfRVJSKGF1dGhrZXkpKSB7CisJCXJldCA9IFBUUl9FUlIoYXV0aGtleSk7CisJCWdvdG8gZXJyb3JfYWxsb2M7CiAJfQogCiAJLyogY29uc3RydWN0IGFuZCBhdHRhY2ggdG8gdGhlIGtleXJpbmcgKi8KLQlyZXQgPSBrZXlfaW5zdGFudGlhdGVfYW5kX2xpbmsocmtha2V5LCB0YXJnZXQsIDAsIGtleXJpbmcsIE5VTEwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWtleV9yZXZva2Uocmtha2V5KTsKLQkJa2V5X3B1dChya2FrZXkpOwotCQlrZXlfcHV0KGtleXJpbmcpOwotCQlrbGVhdmUoIj0gJWQiLCByZXQpOwotCQlyZXR1cm4gRVJSX1BUUihyZXQpOwotCX0KKwlyZXQgPSBrZXlfaW5zdGFudGlhdGVfYW5kX2xpbmsoYXV0aGtleSwgcmthLCAwLCBOVUxMLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9pbnN0OwogCi0JKl9ya2FrZXkgPSBya2FrZXk7Ci0Ja2xlYXZlKCIgPSB7JWR9ICh7JWR9KSIsIGtleXJpbmctPnNlcmlhbCwgcmtha2V5LT5zZXJpYWwpOwotCXJldHVybiBrZXlyaW5nOworCWtsZWF2ZSgiID0geyVkfSkiLCBhdXRoa2V5LT5zZXJpYWwpOworCXJldHVybiBhdXRoa2V5OworCitlcnJvcl9pbnN0OgorCWtleV9yZXZva2UoYXV0aGtleSk7CisJa2V5X3B1dChhdXRoa2V5KTsKK2Vycm9yX2FsbG9jOgorCWtleV9wdXQocmthLT50YXJnZXRfa2V5KTsKKwlrZnJlZShya2EpOworCWtsZWF2ZSgiPSAlZCIsIHJldCk7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAogfSAvKiBlbmQgcmVxdWVzdF9rZXlfYXV0aF9uZXcoKSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgorICogc2VlIGlmIGFuIGF1dGhvcmlzYXRpb24ga2V5IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIga2V5CisgKi8KK3N0YXRpYyBpbnQga2V5X2dldF9pbnN0YW50aWF0aW9uX2F1dGhrZXlfbWF0Y2goY29uc3Qgc3RydWN0IGtleSAqa2V5LAorCQkJCQkgICAgICAgY29uc3Qgdm9pZCAqX2lkKQoreworCXN0cnVjdCByZXF1ZXN0X2tleV9hdXRoICpya2EgPSBrZXktPnBheWxvYWQuZGF0YTsKKwlrZXlfc2VyaWFsX3QgaWQgPSAoa2V5X3NlcmlhbF90KSh1bnNpZ25lZCBsb25nKSBfaWQ7CisKKwlyZXR1cm4gcmthLT50YXJnZXRfa2V5LT5zZXJpYWwgPT0gaWQ7CisKK30gLyogZW5kIGtleV9nZXRfaW5zdGFudGlhdGlvbl9hdXRoa2V5X21hdGNoKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKICAqIGdldCB0aGUgYXV0aG9yaXNhdGlvbiBrZXkgZm9yIGluc3RhbnRpYXRpb24gb2YgYSBzcGVjaWZpYyBrZXkgaWYgYXR0YWNoZWQgdG8KICAqIHRoZSBjdXJyZW50IHByb2Nlc3MncyBrZXlyaW5ncwogICogLSB0aGlzIGtleSBpcyBpbnNlcnRlZCBpbnRvIGEga2V5cmluZyBhbmQgdGhhdCBpcyBzZXQgYXMgL3NiaW4vcmVxdWVzdC1rZXkncwpAQCAtMTYyLDIyICsxOTksMjcgQEAKICAqLwogc3RydWN0IGtleSAqa2V5X2dldF9pbnN0YW50aWF0aW9uX2F1dGhrZXkoa2V5X3NlcmlhbF90IHRhcmdldF9pZCkKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7Ci0Jc3RydWN0IGtleSAqaW5zdGtleTsKKwlzdHJ1Y3Qga2V5ICphdXRoa2V5OworCWtleV9yZWZfdCBhdXRoa2V5X3JlZjsKIAotCS8qIHdlIG11c3QgaGF2ZSBvdXIgb3duIHBlcnNvbmFsIHNlc3Npb24ga2V5cmluZyAqLwotCWlmICghdHNrLT5zaWduYWwtPnNlc3Npb25fa2V5cmluZykKLQkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisJYXV0aGtleV9yZWYgPSBzZWFyY2hfcHJvY2Vzc19rZXlyaW5ncygKKwkJJmtleV90eXBlX3JlcXVlc3Rfa2V5X2F1dGgsCisJCSh2b2lkICopICh1bnNpZ25lZCBsb25nKSB0YXJnZXRfaWQsCisJCWtleV9nZXRfaW5zdGFudGlhdGlvbl9hdXRoa2V5X21hdGNoLAorCQljdXJyZW50KTsKIAotCS8qIGFuZCBpdCBtdXN0IGNvbnRhaW4gYSBzdWl0YWJsZSByZXF1ZXN0IGF1dGhvcmlzYXRpb24ga2V5Ci0JICogLSBsb2NrIFJDVSBhZ2FpbnN0IHNlc3Npb24ga2V5cmluZyBjaGFuZ2luZwotCSAqLwotCXJjdV9yZWFkX2xvY2soKTsKKwlpZiAoSVNfRVJSKGF1dGhrZXlfcmVmKSkgeworCQlhdXRoa2V5ID0gRVJSX1BUUihQVFJfRVJSKGF1dGhrZXlfcmVmKSk7CisJCWdvdG8gZXJyb3I7CisJfQogCi0JaW5zdGtleSA9IGtleXJpbmdfc2VhcmNoX2luc3RrZXkoCi0JCXJjdV9kZXJlZmVyZW5jZSh0c2stPnNpZ25hbC0+c2Vzc2lvbl9rZXlyaW5nKSwgdGFyZ2V0X2lkKTsKKwlhdXRoa2V5ID0ga2V5X3JlZl90b19wdHIoYXV0aGtleV9yZWYpOworCWlmICh0ZXN0X2JpdChLRVlfRkxBR19SRVZPS0VELCAmYXV0aGtleS0+ZmxhZ3MpKSB7CisJCWtleV9wdXQoYXV0aGtleSk7CisJCWF1dGhrZXkgPSBFUlJfUFRSKC1FS0VZUkVWT0tFRCk7CisJfQogCi0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0JcmV0dXJuIGluc3RrZXk7CitlcnJvcjoKKwlyZXR1cm4gYXV0aGtleTsKIAogfSAvKiBlbmQga2V5X2dldF9pbnN0YW50aWF0aW9uX2F1dGhrZXkoKSAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VjdXJpdHkuYyBiL3NlY3VyaXR5L3NlY3VyaXR5LmMKaW5kZXggZWQ1ZmI4MC4uZjY5M2UxZiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VjdXJpdHkuYworKysgYi9zZWN1cml0eS9zZWN1cml0eS5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9hdmMuYyBiL3NlY3VyaXR5L3NlbGludXgvYXZjLmMKaW5kZXggMTJlNGZiNy4uNTNkNmM3YiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9hdmMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L2F2Yy5jCkBAIC00OTQsOCArNDk0LDcgQEAKIAkJCQkgICAgICAgY2hhciAqbmFtZTEsIGNoYXIgKm5hbWUyKQogewogCWlmICghaXB2Nl9hZGRyX2FueShhZGRyKSkKLQkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiAlcz0lMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6IgotCQkJCSAiJTA0eDolMDR4OiUwNHgiLCBuYW1lMSwgTklQNigqYWRkcikpOworCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiICVzPSIgTklQNl9GTVQsIG5hbWUxLCBOSVA2KCphZGRyKSk7CiAJaWYgKHBvcnQpCiAJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgJXM9JWQiLCBuYW1lMiwgbnRvaHMocG9ydCkpOwogfQpAQCAtNTA0LDcgKzUwMyw3IEBACiAJCQkJICAgICAgIF9fYmUxNiBwb3J0LCBjaGFyICpuYW1lMSwgY2hhciAqbmFtZTIpCiB7CiAJaWYgKGFkZHIpCi0JCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgJXM9JWQuJWQuJWQuJWQiLCBuYW1lMSwgTklQUVVBRChhZGRyKSk7CisJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgJXM9IiBOSVBRVUFEX0ZNVCwgbmFtZTEsIE5JUFFVQUQoYWRkcikpOwogCWlmIChwb3J0KQogCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiICVzPSVkIiwgbmFtZTIsIG50b2hzKHBvcnQpKTsKIH0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwppbmRleCAzZDQ5NmVhLi5iOWY4ZDk3IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCkBAIC0xMDE5LDcgKzEwMTksNyBAQAogICAgaGFzIHRoZSBzYW1lIFNJRCBhcyB0aGUgcHJvY2Vzcy4gIElmIGF2IGlzIHplcm8sIHRoZW4KICAgIGFjY2VzcyB0byB0aGUgZmlsZSBpcyBub3QgY2hlY2tlZCwgZS5nLiBmb3IgY2FzZXMKICAgIHdoZXJlIG9ubHkgdGhlIGRlc2NyaXB0b3IgaXMgYWZmZWN0ZWQgbGlrZSBzZWVrLiAqLwotc3RhdGljIGlubGluZSBpbnQgZmlsZV9oYXNfcGVybShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKK3N0YXRpYyBpbnQgZmlsZV9oYXNfcGVybShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKIAkJCQlzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCQl1MzIgYXYpCiB7CkBAIC0xNjYzLDcgKzE2NjMsNyBAQAogCQkJCQkJY29udGludWU7CiAJCQkJCX0KIAkJCQkJaWYgKGRldm51bGwpIHsKLQkJCQkJCXJjdXJlZl9pbmMoJmRldm51bGwtPmZfY291bnQpOworCQkJCQkJZ2V0X2ZpbGUoZGV2bnVsbCk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlkZXZudWxsID0gZGVudHJ5X29wZW4oZGdldChzZWxpbnV4X251bGwpLCBtbnRnZXQoc2VsaW51eGZzX21vdW50KSwgT19SRFdSKTsKIAkJCQkJCWlmICghZGV2bnVsbCkgewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYyBiL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMKaW5kZXggZTU5ZGE2My4uYjVmYTAyZCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jCkBAIC04ODksNyArODg5LDcgQEAKIAlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKIAlub2RlID0gZGUtPmRfc3ViZGlycy5uZXh0OwogCXdoaWxlIChub2RlICE9ICZkZS0+ZF9zdWJkaXJzKSB7Ci0JCXN0cnVjdCBkZW50cnkgKmQgPSBsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBkZW50cnksIGRfY2hpbGQpOworCQlzdHJ1Y3QgZGVudHJ5ICpkID0gbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgZGVudHJ5LCBkX3UuZF9jaGlsZCk7CiAJCWxpc3RfZGVsX2luaXQobm9kZSk7CiAKIAkJaWYgKGQtPmRfaW5vZGUpIHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYyBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYwppbmRleCA0NGViNGQ3Li44YTc2NDkyIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jCkBAIC0xNzEyLDExICsxNzEyLDExIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCSpuYW1lcyA9IChjaGFyKiopa2NhbGxvYygqbGVuLCBzaXplb2YoY2hhciopLCBHRlBfQVRPTUlDKTsKKyAgICAgICAqbmFtZXMgPSBrY2FsbG9jKCpsZW4sIHNpemVvZihjaGFyKiksIEdGUF9BVE9NSUMpOwogCWlmICghKm5hbWVzKQogCQlnb3RvIGVycjsKIAotCSp2YWx1ZXMgPSAoaW50KilrY2FsbG9jKCpsZW4sIHNpemVvZihpbnQpLCBHRlBfQVRPTUlDKTsKKyAgICAgICAqdmFsdWVzID0ga2NhbGxvYygqbGVuLCBzaXplb2YoaW50KSwgR0ZQX0FUT01JQyk7CiAJaWYgKCEqdmFsdWVzKQogCQlnb3RvIGVycjsKIApAQCAtMTcyNCw3ICsxNzI0LDcgQEAKIAkJc2l6ZV90IG5hbWVfbGVuOwogCQkoKnZhbHVlcylbaV0gPSBwb2xpY3lkYi5ib29sX3ZhbF90b19zdHJ1Y3RbaV0tPnN0YXRlOwogCQluYW1lX2xlbiA9IHN0cmxlbihwb2xpY3lkYi5wX2Jvb2xfdmFsX3RvX25hbWVbaV0pICsgMTsKLQkJKCpuYW1lcylbaV0gPSAoY2hhciopa21hbGxvYyhzaXplb2YoY2hhcikgKiBuYW1lX2xlbiwgR0ZQX0FUT01JQyk7CisgICAgICAgICAgICAgICAoKm5hbWVzKVtpXSA9IGttYWxsb2Moc2l6ZW9mKGNoYXIpICogbmFtZV9sZW4sIEdGUF9BVE9NSUMpOwogCQlpZiAoISgqbmFtZXMpW2ldKQogCQkJZ290byBlcnI7CiAJCXN0cm5jcHkoKCpuYW1lcylbaV0sIHBvbGljeWRiLnBfYm9vbF92YWxfdG9fbmFtZVtpXSwgbmFtZV9sZW4pOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC94ZnJtLmMgYi9zZWN1cml0eS9zZWxpbnV4L3hmcm0uYwppbmRleCA1Yjc3NzY1Li5iMmFmN2NhIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3hmcm0uYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3hmcm0uYwpAQCAtMTQ2LDcgKzE0Niw3IEBACiAJcmV0dXJuIHJjOwogCiBvdXQ6Ci0JKmN0eHAgPSAwOworCSpjdHhwID0gTlVMTDsKIAlrZnJlZShjdHgpOwogCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL2FybS9hYWNpLmMgYi9zb3VuZC9hcm0vYWFjaS5jCmluZGV4IDVlOWE4MWEuLjU0MTQ3YzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FybS9hYWNpLmMKKysrIGIvc291bmQvYXJtL2FhY2kuYwpAQCAtMTcsMTEgKzE3LDExIEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hbWJhLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL29zcy9wY21fb3NzLmMgYi9zb3VuZC9jb3JlL29zcy9wY21fb3NzLmMKaW5kZXggMTZkZjEyNC4uN2ZkMDcyMyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9vc3MvcGNtX29zcy5jCisrKyBiL3NvdW5kL2NvcmUvb3NzL3BjbV9vc3MuYwpAQCAtMjEzNSw5ICsyMTM1LDcgQEAKIAlzdWJzdHJlYW0gPSBwY21fb3NzX2ZpbGUtPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS107CiAJaWYgKHN1YnN0cmVhbSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOWElPOwotCXVwKCZmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOwogCXJlc3VsdCA9IHNuZF9wY21fb3NzX3dyaXRlMShzdWJzdHJlYW0sIGJ1ZiwgY291bnQpOwotCWRvd24oJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CiAjaWZkZWYgT1NTX0RFQlVHCiAJcHJpbnRrKCJwY21fb3NzOiB3cml0ZSAlbGkgYnl0ZXMgKHdyb3RlICVsaSBieXRlcylcbiIsIChsb25nKWNvdW50LCAobG9uZylyZXN1bHQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfbWVtb3J5LmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfbWVtb3J5LmMKaW5kZXggOWVlNmMxNy4uNDBiNGY2NyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX21lbW9yeS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9tZW1vcnkuYwpAQCAtMzIsMTAgKzMyLDYgQEAKICNpbmNsdWRlICJzZXFfaW5mby5oIgogI2luY2x1ZGUgInNlcV9sb2NrLmgiCiAKLS8qIHNlbWFwaG9yZSBpbiBzdHJ1Y3QgZmlsZSByZWNvcmQgKi8KLSNkZWZpbmUgc2VtYXBob3JlX29mKGZwKQkoKGZwKS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2VtKQotCi0KIHN0YXRpYyBpbmxpbmUgaW50IHNuZF9zZXFfcG9vbF9hdmFpbGFibGUoc3RydWN0IHNuZF9zZXFfcG9vbCAqcG9vbCkKIHsKIAlyZXR1cm4gcG9vbC0+dG90YWxfZWxlbWVudHMgLSBhdG9taWNfcmVhZCgmcG9vbC0+Y291bnRlcik7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udF9zeW50aC5jIGIvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnRfc3ludGguYwppbmRleCA2NzlkMGFlLi5lZDgxZWVjIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udF9zeW50aC5jCisrKyBiL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250X3N5bnRoLmMKQEAgLTExNSwxOCArMTE1LDExIEBACiAKICNpZmRlZiBXRl9ERUJVRwogCi0jaWYgZGVmaW5lZChORVdfTUFDUk9fVkFSQVJHUykgfHwgX19HTlVDX18gPj0gMwogI2RlZmluZSBEUFJJTlQoY29uZCwgLi4uKSBcCiAgICAgICAgaWYgKChkZXYtPmRlYnVnICYgKGNvbmQpKSA9PSAoY29uZCkpIHsgXAogCSAgICAgc25kX3ByaW50ayAoX19WQV9BUkdTX18pOyBcCiAgICAgICAgfQogI2Vsc2UKLSNkZWZpbmUgRFBSSU5UKGNvbmQsIGFyZ3MuLi4pIFwKLSAgICAgICBpZiAoKGRldi0+ZGVidWcgJiAoY29uZCkpID09IChjb25kKSkgeyBcCi0JICAgICBzbmRfcHJpbnRrIChhcmdzKTsgXAotICAgICAgIH0KLSNlbmRpZgotI2Vsc2UKICNkZWZpbmUgRFBSSU5UKGNvbmQsIGFyZ3MuLi4pCiAjZW5kaWYgLyogV0ZfREVCVUcgKi8KIApkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FkMTg4OS5jIGIvc291bmQvb3NzL2FkMTg4OS5jCmluZGV4IDJjZmQyMTQuLmEwZDczZjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9hZDE4ODkuYworKysgYi9zb3VuZC9vc3MvYWQxODg5LmMKQEAgLTEwODksNyArMTA4OSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGFkMTg4OV9pbml0X21vZHVsZSh2b2lkKQogewotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmFkMTg4OV9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhZDE4ODlfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgYWQxODg5X2V4aXRfbW9kdWxlKHZvaWQpCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYnRhdWRpby5jIGIvc291bmQvb3NzL2J0YXVkaW8uYwppbmRleCBhODUwOTNmLi40MDA3YTU2OCAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2J0YXVkaW8uYworKysgYi9zb3VuZC9vc3MvYnRhdWRpby5jCkBAIC0xMTAxLDcgKzExMDEsNyBAQAogCSAgICAgICBkaWdpdGFsID8gImRpZ2l0YWwiIDogIiIsCiAJICAgICAgIGFuYWxvZyAmJiBkaWdpdGFsID8gIisiIDogIiIsCiAJICAgICAgIGFuYWxvZyA/ICJhbmFsb2ciIDogIiIpOwotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmJ0YXVkaW9fcGNpX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJ0YXVkaW9fcGNpX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIGJ0YXVkaW9fY2xlYW51cF9tb2R1bGUodm9pZCkKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9jbXBjaS5jIGIvc291bmQvb3NzL2NtcGNpLmMKaW5kZXggNzRkY2NhNy4uN2NmYmIwOCAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2NtcGNpLmMKKysrIGIvc291bmQvb3NzL2NtcGNpLmMKQEAgLTMzNjYsNyArMzM2Niw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2NtcGNpKHZvaWQpCiB7CiAJcHJpbnRrKEtFUk5fSU5GTyAiY21wY2k6IHZlcnNpb24gJFJldmlzaW9uOiA2LjgyICQgdGltZSAiIF9fVElNRV9fICIgIiBfX0RBVEVfXyAiXG4iKTsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZjbV9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZjbV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9jbXBjaSh2b2lkKQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDI4MS9jczQyODFtLmMgYi9zb3VuZC9vc3MvY3M0MjgxL2NzNDI4MW0uYwppbmRleCA0NmRkNDFkLi4wNzIwMzY1IDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvY3M0MjgxL2NzNDI4MW0uYworKysgYi9zb3VuZC9vc3MvY3M0MjgxL2NzNDI4MW0uYwpAQCAtNDQ2MSw3ICs0NDYxLDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICJjczQyODE6IHZlcnNpb24gdiVkLiUwMmQuJWQgdGltZSAiIF9fVElNRV9fICIgIgogCSAgICAgICBfX0RBVEVfXyAiXG4iLCBDUzQyODFfTUFKT1JfVkVSU0lPTiwgQ1M0MjgxX01JTk9SX1ZFUlNJT04sCiAJICAgICAgIENTNDI4MV9BUkNIKTsKLQlydG4gPSBwY2lfbW9kdWxlX2luaXQoJmNzNDI4MV9wY2lfZHJpdmVyKTsKKwlydG4gPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZjczQyODFfcGNpX2RyaXZlcik7CiAKIAlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0ZVTkNUSU9OLCAyLAogCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI4MTogY3M0MjgxX2luaXRfbW9kdWxlKCktICglZClcbiIscnRuKSk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvY3M0Nnh4LmMgYi9zb3VuZC9vc3MvY3M0Nnh4LmMKaW5kZXggMGRhNGQ5My4uNThlMjVjOCAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2NzNDZ4eC5jCisrKyBiL3NvdW5kL29zcy9jczQ2eHguYwpAQCAtNTY5MCw3ICs1NjkwLDcgQEAKIAlpbnQgcnRuID0gMDsKIAlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0ZVTkNUSU9OLCAyLCBwcmludGsoS0VSTl9JTkZPIAogCQkiY3M0Nnh4OiBjczQ2eHhfaW5pdF9tb2R1bGUoKSsgXG4iKSk7Ci0JcnRuID0gcGNpX21vZHVsZV9pbml0KCZjczQ2eHhfcGNpX2RyaXZlcik7CisJcnRuID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY3M0Nnh4X3BjaV9kcml2ZXIpOwogCiAJaWYocnRuID09IC1FTk9ERVYpCiAJewpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kLmggYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmQuaAppbmRleCAyMjIwMTRjYWYuLmExYjBiOTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZC5oCisrKyBiL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZC5oCkBAIC0yNzAsNyArMjcwLDYgQEAKICNkZWZpbmUgU1dfSU5QVVRfVk9MVU1FX1NDQUxFCTQKICNkZWZpbmUgU1dfSU5QVVRfVk9MVU1FX0RFRkFVTFQJKDEyOCAvIFNXX0lOUFVUX1ZPTFVNRV9TQ0FMRSkKIAotZXh0ZXJuIGludCBleHBhbmRfYmFsOwkvKiBCYWxhbmNlIGZhY3RvciBmb3IgZXhwYW5kaW5nIChub3Qgdm9sdW1lISkgKi8KIGV4dGVybiBpbnQgZXhwYW5kX3JlYWRfYmFsOwkvKiBCYWxhbmNlIGZhY3RvciBmb3IgcmVhZGluZyAqLwogZXh0ZXJuIHVpbnQgc29mdHdhcmVfaW5wdXRfdm9sdW1lOyAvKiBzb2Z0d2FyZSBpbXBsZW1lbnRlZCByZWNvcmRpbmcgdm9sdW1lISAqLwogCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfYXRhcmkuYyBiL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9hdGFyaS5jCmluZGV4IDU5ZWI1M2YuLmRjMzEzNzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9hdGFyaS5jCisrKyBiL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9hdGFyaS5jCkBAIC02Nyw0NiArNjcsNDYgQEAKICAqICsrZ2VlcnQ6IHNwbGl0IGluIGV2ZW4gbW9yZSBmdW5jdGlvbnMgKG9uZSBwZXIgZm9ybWF0KQogICovCiAKLXN0YXRpYyBzc2l6ZV90IGF0YV9jdF9sYXcoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYXRhX2N0X2xhdyhjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAogCQkJICBzc2l6ZV90IGZyYW1lTGVmdCk7Ci1zdGF0aWMgc3NpemVfdCBhdGFfY3RfczgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYXRhX2N0X3M4KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSBzc2l6ZV90IGZyYW1lTGVmdCk7Ci1zdGF0aWMgc3NpemVfdCBhdGFfY3RfdTgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYXRhX2N0X3U4KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSBzc2l6ZV90IGZyYW1lTGVmdCk7Ci1zdGF0aWMgc3NpemVfdCBhdGFfY3RfczE2YmUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYXRhX2N0X3MxNmJlKGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCk7Ci1zdGF0aWMgc3NpemVfdCBhdGFfY3RfdTE2YmUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYXRhX2N0X3UxNmJlKGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCk7Ci1zdGF0aWMgc3NpemVfdCBhdGFfY3RfczE2bGUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYXRhX2N0X3MxNmxlKGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCk7Ci1zdGF0aWMgc3NpemVfdCBhdGFfY3RfdTE2bGUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYXRhX2N0X3UxNmxlKGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCk7Ci1zdGF0aWMgc3NpemVfdCBhdGFfY3R4X2xhdyhjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBhdGFfY3R4X2xhdyhjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KTsKLXN0YXRpYyBzc2l6ZV90IGF0YV9jdHhfczgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYXRhX2N0eF9zOChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAogCQkJICBzc2l6ZV90IGZyYW1lTGVmdCk7Ci1zdGF0aWMgc3NpemVfdCBhdGFfY3R4X3U4KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdHhfdTgoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKIAkJCSAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgc3NpemVfdCBmcmFtZUxlZnQpOwotc3RhdGljIHNzaXplX3QgYXRhX2N0eF9zMTZiZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBhdGFfY3R4X3MxNmJlKGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICAgIHNzaXplX3QgZnJhbWVMZWZ0KTsKLXN0YXRpYyBzc2l6ZV90IGF0YV9jdHhfdTE2YmUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYXRhX2N0eF91MTZiZShjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAogCQkJICAgICBzc2l6ZV90IGZyYW1lTGVmdCk7Ci1zdGF0aWMgc3NpemVfdCBhdGFfY3R4X3MxNmxlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdHhfczE2bGUoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKIAkJCSAgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgICAgc3NpemVfdCBmcmFtZUxlZnQpOwotc3RhdGljIHNzaXplX3QgYXRhX2N0eF91MTZsZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBhdGFfY3R4X3UxNmxlKGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICAgIHNzaXplX3QgZnJhbWVMZWZ0KTsKIApAQCAtMTUxLDcgKzE1MSw3IEBACiAvKioqIFRyYW5zbGF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAotc3RhdGljIHNzaXplX3QgYXRhX2N0X2xhdyhjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBhdGFfY3RfbGF3KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgIHNzaXplX3QgZnJhbWVMZWZ0KQogewpAQCAtMTc2LDcgKzE3Niw3IEBACiB9CiAKIAotc3RhdGljIHNzaXplX3QgYXRhX2N0X3M4KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdF9zOChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgc3NpemVfdCBmcmFtZUxlZnQpCiB7CkBAIC0xOTQsNyArMTk0LDcgQEAKIH0KIAogCi1zdGF0aWMgc3NpemVfdCBhdGFfY3RfdTgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYXRhX2N0X3U4KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSBzc2l6ZV90IGZyYW1lTGVmdCkKIHsKQEAgLTIxNyw4ICsyMTcsOSBAQAogCQl1c2VkID0gY291bnQqMjsKIAkJd2hpbGUgKGNvdW50ID4gMCkgewogCQkJdV9zaG9ydCBkYXRhOwotCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9zaG9ydCAqKXVzZXJQdHIpKyspKQorCQkJaWYgKGdldF91c2VyKGRhdGEsICh1X3Nob3J0IF9fdXNlciAqKXVzZXJQdHIpKQogCQkJCXJldHVybiAtRUZBVUxUOworCQkJdXNlclB0ciArPSAyOwogCQkJKnArKyA9IGRhdGEgXiAweDgwODA7CiAJCQljb3VudC0tOwogCQl9CkBAIC0yMjgsNyArMjI5LDcgQEAKIH0KIAogCi1zdGF0aWMgc3NpemVfdCBhdGFfY3RfczE2YmUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYXRhX2N0X3MxNmJlKGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCkKIHsKQEAgLTI0MCw4ICsyNDEsOSBAQAogCQl1c2VkID0gY291bnQqMjsKIAkJd2hpbGUgKGNvdW50ID4gMCkgewogCQkJdV9zaG9ydCBkYXRhOwotCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9zaG9ydCAqKXVzZXJQdHIpKyspKQorCQkJaWYgKGdldF91c2VyKGRhdGEsICh1X3Nob3J0IF9fdXNlciAqKXVzZXJQdHIpKQogCQkJCXJldHVybiAtRUZBVUxUOworCQkJdXNlclB0ciArPSAyOwogCQkJKnArKyA9IGRhdGE7CiAJCQkqcCsrID0gZGF0YTsKIAkJCWNvdW50LS07CkBAIC0yNTksNyArMjYxLDcgQEAKIH0KIAogCi1zdGF0aWMgc3NpemVfdCBhdGFfY3RfdTE2YmUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYXRhX2N0X3UxNmJlKGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCkKIHsKQEAgLTI3MSw4ICsyNzMsOSBAQAogCQl1c2VkID0gY291bnQqMjsKIAkJd2hpbGUgKGNvdW50ID4gMCkgewogCQkJdV9zaG9ydCBkYXRhOwotCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9zaG9ydCAqKXVzZXJQdHIpKyspKQorCQkJaWYgKGdldF91c2VyKGRhdGEsICh1X3Nob3J0IF9fdXNlciAqKXVzZXJQdHIpKQogCQkJCXJldHVybiAtRUZBVUxUOworCQkJdXNlclB0ciArPSAyOwogCQkJZGF0YSBePSAweDgwMDA7CiAJCQkqcCsrID0gZGF0YTsKIAkJCSpwKysgPSBkYXRhOwpAQCAtMjg0LDkgKzI4NywxMCBAQAogCQljb3VudCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHVzZXJDb3VudCwgZnJhbWVMZWZ0KT4+MjsKIAkJdXNlZCA9IGNvdW50KjQ7CiAJCXdoaWxlIChjb3VudCA+IDApIHsKLQkJCXVfbG9uZyBkYXRhOwotCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9pbnQgKil1c2VyUHRyKSsrKSkKKwkJCXVfaW50IGRhdGE7CisJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKHVfaW50IF9fdXNlciAqKXVzZXJQdHIpKQogCQkJCXJldHVybiAtRUZBVUxUOworCQkJdXNlclB0ciArPSA0OwogCQkJKnArKyA9IGRhdGEgXiAweDgwMDA4MDAwOwogCQkJY291bnQtLTsKIAkJfQpAQCAtMjk2LDcgKzMwMCw3IEBACiB9CiAKIAotc3RhdGljIHNzaXplX3QgYXRhX2N0X3MxNmxlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdF9zMTZsZShjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpCiB7CkBAIC0zMDksOCArMzEzLDkgQEAKIAkJdXNlZCA9IGNvdW50KjI7CiAJCXdoaWxlIChjb3VudCA+IDApIHsKIAkJCXVfc2hvcnQgZGF0YTsKLQkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfc2hvcnQgKil1c2VyUHRyKSsrKSkKKwkJCWlmIChnZXRfdXNlcihkYXRhLCAodV9zaG9ydCBfX3VzZXIgKil1c2VyUHRyKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXVzZXJQdHIgKz0gMjsKIAkJCWRhdGEgPSBsZTJiZTE2KGRhdGEpOwogCQkJKnArKyA9IGRhdGE7CiAJCQkqcCsrID0gZGF0YTsKQEAgLTMyMyw4ICszMjgsOSBAQAogCQl1c2VkID0gY291bnQqNDsKIAkJd2hpbGUgKGNvdW50ID4gMCkgewogCQkJdV9sb25nIGRhdGE7Ci0JCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X2ludCAqKXVzZXJQdHIpKyspKQorCQkJaWYgKGdldF91c2VyKGRhdGEsICh1X2ludCBfX3VzZXIgKil1c2VyUHRyKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXVzZXJQdHIgKz0gNDsKIAkJCWRhdGEgPSBsZTJiZTE2ZGJsKGRhdGEpOwogCQkJKnArKyA9IGRhdGE7CiAJCQljb3VudC0tOwpAQCAtMzM1LDcgKzM0MSw3IEBACiB9CiAKIAotc3RhdGljIHNzaXplX3QgYXRhX2N0X3UxNmxlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdF91MTZsZShjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpCiB7CkBAIC0zNDgsOCArMzU0LDkgQEAKIAkJdXNlZCA9IGNvdW50KjI7CiAJCXdoaWxlIChjb3VudCA+IDApIHsKIAkJCXVfc2hvcnQgZGF0YTsKLQkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfc2hvcnQgKil1c2VyUHRyKSsrKSkKKwkJCWlmIChnZXRfdXNlcihkYXRhLCAodV9zaG9ydCBfX3VzZXIgKil1c2VyUHRyKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXVzZXJQdHIgKz0gMjsKIAkJCWRhdGEgPSBsZTJiZTE2KGRhdGEpIF4gMHg4MDAwOwogCQkJKnArKyA9IGRhdGE7CiAJCQkqcCsrID0gZGF0YTsKQEAgLTM2MSw4ICszNjgsOSBAQAogCQl1c2VkID0gY291bnQ7CiAJCXdoaWxlIChjb3VudCA+IDApIHsKIAkJCXVfbG9uZyBkYXRhOwotCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9pbnQgKil1c2VyUHRyKSsrKSkKKwkJCWlmIChnZXRfdXNlcihkYXRhLCAodV9pbnQgX191c2VyICopdXNlclB0cikpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl1c2VyUHRyICs9IDQ7CiAJCQlkYXRhID0gbGUyYmUxNmRibChkYXRhKSBeIDB4ODAwMDgwMDA7CiAJCQkqcCsrID0gZGF0YTsKIAkJCWNvdW50LS07CkBAIC0zNzMsNyArMzgxLDcgQEAKIH0KIAogCi1zdGF0aWMgc3NpemVfdCBhdGFfY3R4X2xhdyhjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBhdGFfY3R4X2xhdyhjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQogewpAQCAtNDM1LDcgKzQ0Myw3IEBACiB9CiAKIAotc3RhdGljIHNzaXplX3QgYXRhX2N0eF9zOChjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBhdGFfY3R4X3M4KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgIHNzaXplX3QgZnJhbWVMZWZ0KQogewpAQCAtNDcwLDggKzQ3OCw5IEBACiAJCQlpZiAoYmFsIDwgMCkgewogCQkJCWlmICh1c2VyQ291bnQgPCAyKQogCQkJCQlicmVhazsKLQkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X3Nob3J0ICopdXNlclB0cikrKykpCisJCQkJaWYgKGdldF91c2VyKGRhdGEsICh1X3Nob3J0IF9fdXNlciAqKXVzZXJQdHIpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl1c2VyUHRyICs9IDI7CiAJCQkJdXNlckNvdW50IC09IDI7CiAJCQkJYmFsICs9IGhTcGVlZDsKIAkJCX0KQEAgLTQ4OCw3ICs0OTcsNyBAQAogfQogCiAKLXN0YXRpYyBzc2l6ZV90IGF0YV9jdHhfdTgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYXRhX2N0eF91OChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAogCQkJICBzc2l6ZV90IGZyYW1lTGVmdCkKIHsKQEAgLTUyNCw4ICs1MzMsOSBAQAogCQkJaWYgKGJhbCA8IDApIHsKIAkJCQlpZiAodXNlckNvdW50IDwgMikKIAkJCQkJYnJlYWs7Ci0JCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9zaG9ydCAqKXVzZXJQdHIpKyspKQorCQkJCWlmIChnZXRfdXNlcihkYXRhLCAodV9zaG9ydCBfX3VzZXIgKil1c2VyUHRyKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJdXNlclB0ciArPSAyOwogCQkJCWRhdGEgXj0gMHg4MDgwOwogCQkJCXVzZXJDb3VudCAtPSAyOwogCQkJCWJhbCArPSBoU3BlZWQ7CkBAIC01NDMsNyArNTUzLDcgQEAKIH0KIAogCi1zdGF0aWMgc3NpemVfdCBhdGFfY3R4X3MxNmJlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdHhfczE2YmUoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKIAkJCSAgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgICAgc3NpemVfdCBmcmFtZUxlZnQpCiB7CkBAIC01NjEsOCArNTcxLDkgQEAKIAkJCWlmIChiYWwgPCAwKSB7CiAJCQkJaWYgKHVzZXJDb3VudCA8IDIpCiAJCQkJCWJyZWFrOwotCQkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfc2hvcnQgKil1c2VyUHRyKSsrKSkKKwkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKHVfc2hvcnQgX191c2VyICopdXNlclB0cikpCiAJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXVzZXJQdHIgKz0gMjsKIAkJCQl1c2VyQ291bnQgLT0gMjsKIAkJCQliYWwgKz0gaFNwZWVkOwogCQkJfQpAQCAtNTc5LDggKzU5MCw5IEBACiAJCQlpZiAoYmFsIDwgMCkgewogCQkJCWlmICh1c2VyQ291bnQgPCA0KQogCQkJCQlicmVhazsKLQkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X2ludCAqKXVzZXJQdHIpKyspKQorCQkJCWlmIChnZXRfdXNlcihkYXRhLCAodV9pbnQgX191c2VyICopdXNlclB0cikpCiAJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXVzZXJQdHIgKz0gNDsKIAkJCQl1c2VyQ291bnQgLT0gNDsKIAkJCQliYWwgKz0gaFNwZWVkOwogCQkJfQpAQCAtNTk3LDcgKzYwOSw3IEBACiB9CiAKIAotc3RhdGljIHNzaXplX3QgYXRhX2N0eF91MTZiZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBhdGFfY3R4X3UxNmJlKGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICAgIHNzaXplX3QgZnJhbWVMZWZ0KQogewpAQCAtNjE1LDggKzYyNyw5IEBACiAJCQlpZiAoYmFsIDwgMCkgewogCQkJCWlmICh1c2VyQ291bnQgPCAyKQogCQkJCQlicmVhazsKLQkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X3Nob3J0ICopdXNlclB0cikrKykpCisJCQkJaWYgKGdldF91c2VyKGRhdGEsICh1X3Nob3J0IF9fdXNlciAqKXVzZXJQdHIpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl1c2VyUHRyICs9IDI7CiAJCQkJZGF0YSBePSAweDgwMDA7CiAJCQkJdXNlckNvdW50IC09IDI7CiAJCQkJYmFsICs9IGhTcGVlZDsKQEAgLTYzNCw4ICs2NDcsOSBAQAogCQkJaWYgKGJhbCA8IDApIHsKIAkJCQlpZiAodXNlckNvdW50IDwgNCkKIAkJCQkJYnJlYWs7Ci0JCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9pbnQgKil1c2VyUHRyKSsrKSkKKwkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKHVfaW50IF9fdXNlciAqKXVzZXJQdHIpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl1c2VyUHRyICs9IDQ7CiAJCQkJZGF0YSBePSAweDgwMDA4MDAwOwogCQkJCXVzZXJDb3VudCAtPSA0OwogCQkJCWJhbCArPSBoU3BlZWQ7CkBAIC02NTMsNyArNjY3LDcgQEAKIH0KIAogCi1zdGF0aWMgc3NpemVfdCBhdGFfY3R4X3MxNmxlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdHhfczE2bGUoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKIAkJCSAgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgICAgc3NpemVfdCBmcmFtZUxlZnQpCiB7CkBAIC02NzEsOCArNjg1LDkgQEAKIAkJCWlmIChiYWwgPCAwKSB7CiAJCQkJaWYgKHVzZXJDb3VudCA8IDIpCiAJCQkJCWJyZWFrOwotCQkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfc2hvcnQgKil1c2VyUHRyKSsrKSkKKwkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKHVfc2hvcnQgX191c2VyICopdXNlclB0cikpCiAJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXVzZXJQdHIgKz0gMjsKIAkJCQlkYXRhID0gbGUyYmUxNihkYXRhKTsKIAkJCQl1c2VyQ291bnQgLT0gMjsKIAkJCQliYWwgKz0gaFNwZWVkOwpAQCAtNjkwLDggKzcwNSw5IEBACiAJCQlpZiAoYmFsIDwgMCkgewogCQkJCWlmICh1c2VyQ291bnQgPCA0KQogCQkJCQlicmVhazsKLQkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X2ludCAqKXVzZXJQdHIpKyspKQorCQkJCWlmIChnZXRfdXNlcihkYXRhLCAodV9pbnQgX191c2VyICopdXNlclB0cikpCiAJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXVzZXJQdHIgKz0gNDsKIAkJCQlkYXRhID0gbGUyYmUxNmRibChkYXRhKTsKIAkJCQl1c2VyQ291bnQgLT0gNDsKIAkJCQliYWwgKz0gaFNwZWVkOwpAQCAtNzA5LDcgKzcyNSw3IEBACiB9CiAKIAotc3RhdGljIHNzaXplX3QgYXRhX2N0eF91MTZsZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBhdGFfY3R4X3UxNmxlKGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICAgIHNzaXplX3QgZnJhbWVMZWZ0KQogewpAQCAtNzI3LDggKzc0Myw5IEBACiAJCQlpZiAoYmFsIDwgMCkgewogCQkJCWlmICh1c2VyQ291bnQgPCAyKQogCQkJCQlicmVhazsKLQkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X3Nob3J0ICopdXNlclB0cikrKykpCisJCQkJaWYgKGdldF91c2VyKGRhdGEsICh1X3Nob3J0IF9fdXNlciAqKXVzZXJQdHIpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl1c2VyUHRyICs9IDI7CiAJCQkJZGF0YSA9IGxlMmJlMTYoZGF0YSkgXiAweDgwMDA7CiAJCQkJdXNlckNvdW50IC09IDI7CiAJCQkJYmFsICs9IGhTcGVlZDsKQEAgLTc0Niw4ICs3NjMsOSBAQAogCQkJaWYgKGJhbCA8IDApIHsKIAkJCQlpZiAodXNlckNvdW50IDwgNCkKIAkJCQkJYnJlYWs7Ci0JCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9pbnQgKil1c2VyUHRyKSsrKSkKKwkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKHVfaW50IF9fdXNlciAqKXVzZXJQdHIpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl1c2VyUHRyICs9IDQ7CiAJCQkJZGF0YSA9IGxlMmJlMTZkYmwoZGF0YSkgXiAweDgwMDA4MDAwOwogCQkJCXVzZXJDb3VudCAtPSA0OwogCQkJCWJhbCArPSBoU3BlZWQ7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfYXdhY3MuYyBiL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9hd2Fjcy5jCmluZGV4IGNlYmQ4ODEuLjc0Zjk3NTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9hd2Fjcy5jCisrKyBiL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9hd2Fjcy5jCkBAIC0xMjUsNiArMTI1LDcgQEAKIHN0YXRpYyBpbnQgYXdhY3Nfc3ViZnJhbWU7CiBzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlKiBhd2Fjc19ub2RlOwogc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSogaTJzX25vZGU7CitzdGF0aWMgc3RydWN0IHJlc291cmNlIGF3YWNzX3JzcmNbM107CiAKIHN0YXRpYyBjaGFyIGF3YWNzX25hbWVbNjRdOwogc3RhdGljIGludCBhd2Fjc19yZXZpc2lvbjsKQEAgLTY2Nyw5ICs2NjgsMTIgQEAKIAlpb3VubWFwKGF3YWNzX3R4ZG1hKTsKIAlpb3VubWFwKGF3YWNzX3J4ZG1hKTsKIAotCXJlbGVhc2VfT0ZfcmVzb3VyY2UoYXdhY3Nfbm9kZSwgMCk7Ci0JcmVsZWFzZV9PRl9yZXNvdXJjZShhd2Fjc19ub2RlLCAxKTsKLQlyZWxlYXNlX09GX3Jlc291cmNlKGF3YWNzX25vZGUsIDIpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihhd2Fjc19yc3JjWzBdLnN0YXJ0LAorCQkJICAgYXdhY3NfcnNyY1swXS5lbmQgLSBhd2Fjc19yc3JjWzBdLnN0YXJ0ICsgMSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGF3YWNzX3JzcmNbMV0uc3RhcnQsCisJCQkgICBhd2Fjc19yc3JjWzFdLmVuZCAtIGF3YWNzX3JzcmNbMV0uc3RhcnQgKyAxKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oYXdhY3NfcnNyY1syXS5zdGFydCwKKwkJCSAgIGF3YWNzX3JzcmNbMl0uZW5kIC0gYXdhY3NfcnNyY1syXS5zdGFydCArIDEpOwogCiAJa2ZyZWUoYXdhY3NfdHhfY21kX3NwYWNlKTsKIAlrZnJlZShhd2Fjc19yeF9jbWRfc3BhY2UpOwpAQCAtMjg2Myw0NiArMjg2Nyw1OCBAQAogCSAqIG90aGVyIGluZm8gaWYgbmVjZXNzYXJ5IChlYXJseSBBV0FDUyB3ZSB3YW50IHRvIHJlYWQgY2hpcCBpZHMpCiAJICovCiAKLQlpZiAoaW8tPm5fYWRkcnMgPCAzIHx8IGlvLT5uX2ludHJzIDwgMykgeworCWlmIChvZl9nZXRfYWRkcmVzcyhpbywgMiwgTlVMTCwgTlVMTCkgPT0gTlVMTCB8fCBpby0+bl9pbnRycyA8IDMpIHsKIAkJLyogT0sgLSBtYXliZSB3ZSBuZWVkIHRvIHVzZSB0aGUgJ2F3YWNzJyBub2RlIChvbiBlYXJsaWVyCiAJCSAqIG1hY2hpbmVzKS4KLQkJKi8KKwkJICovCiAJCWlmIChhd2Fjc19ub2RlKSB7CiAJCQlpbyA9IGF3YWNzX25vZGUgOwotCQkJaWYgKGlvLT5uX2FkZHJzIDwgMyB8fCBpby0+bl9pbnRycyA8IDMpIHsKLQkJCQlwcmludGsoImRtYXNvdW5kX3BtYWM6IGNhbid0IHVzZSAlcyIKLQkJCQkJIiAoJWQgYWRkcnMsICVkIGludHJzKVxuIiwKLQkJICAgICAgCQkgaW8tPmZ1bGxfbmFtZSwgaW8tPm5fYWRkcnMsIGlvLT5uX2ludHJzKTsKKwkJCWlmIChvZl9nZXRfYWRkcmVzcyhpbywgMiwgTlVMTCwgTlVMTCkgPT0gTlVMTCB8fAorCQkJICAgIGlvLT5uX2ludHJzIDwgMykgeworCQkJCXByaW50aygiZG1hc291bmRfcG1hYzogY2FuJ3QgdXNlICVzXG4iLAorCQkJCSAgICAgICBpby0+ZnVsbF9uYW1lKTsKIAkJCQlyZXR1cm4gLUVOT0RFVjsKIAkJCX0KLQkJfSBlbHNlIHsKLQkJCXByaW50aygiZG1hc291bmRfcG1hYzogY2FuJ3QgdXNlICVzICglZCBhZGRycywgJWQgaW50cnMpXG4iLAotCQkgCSAgICAgIGlvLT5mdWxsX25hbWUsIGlvLT5uX2FkZHJzLCBpby0+bl9pbnRycyk7Ci0JCX0KKwkJfSBlbHNlCisJCQlwcmludGsoImRtYXNvdW5kX3BtYWM6IGNhbid0IHVzZSAlc1xuIiwgaW8tPmZ1bGxfbmFtZSk7CiAJfQogCi0JaWYgKCFyZXF1ZXN0X09GX3Jlc291cmNlKGlvLCAwLCBOVUxMKSkgeworCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKGlvLCAwLCAmYXdhY3NfcnNyY1swXSkgfHwKKwkgICAgcmVxdWVzdF9tZW1fcmVnaW9uKGF3YWNzX3JzcmNbMF0uc3RhcnQsCisJCQkgICAgICAgYXdhY3NfcnNyY1swXS5lbmQgLSBhd2Fjc19yc3JjWzBdLnN0YXJ0ICsgMSwKKwkJCSAgICAgICAiIChJTykiKSA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZG1hc291bmQ6IGNhbid0IHJlcXVlc3QgSU8gcmVzb3VyY2UgIVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQlpZiAoIXJlcXVlc3RfT0ZfcmVzb3VyY2UoaW8sIDEsICIgKHR4IGRtYSkiKSkgewotCQlyZWxlYXNlX09GX3Jlc291cmNlKGlvLCAwKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJkbWFzb3VuZDogY2FuJ3QgcmVxdWVzdCBUWCBETUEgcmVzb3VyY2UgIVxuIik7CisJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoaW8sIDEsICZhd2Fjc19yc3JjWzFdKSB8fAorCSAgICByZXF1ZXN0X21lbV9yZWdpb24oYXdhY3NfcnNyY1sxXS5zdGFydCwKKwkJCSAgICAgICBhd2Fjc19yc3JjWzFdLmVuZCAtIGF3YWNzX3JzcmNbMV0uc3RhcnQgKyAxLAorCQkJICAgICAgICIgKHR4IGRtYSkiKSA9PSBOVUxMKSB7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihhd2Fjc19yc3JjWzBdLnN0YXJ0LAorCQkJCSAgIGF3YWNzX3JzcmNbMF0uZW5kIC0gYXdhY3NfcnNyY1swXS5zdGFydCArIDEpOworCQlwcmludGsoS0VSTl9FUlIgImRtYXNvdW5kOiBjYW4ndCByZXF1ZXN0IFR4IERNQSByZXNvdXJjZSAhXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCi0JaWYgKCFyZXF1ZXN0X09GX3Jlc291cmNlKGlvLCAyLCAiIChyeCBkbWEpIikpIHsKLQkJcmVsZWFzZV9PRl9yZXNvdXJjZShpbywgMCk7Ci0JCXJlbGVhc2VfT0ZfcmVzb3VyY2UoaW8sIDEpOwotCQlwcmludGsoS0VSTl9FUlIgImRtYXNvdW5kOiBjYW4ndCByZXF1ZXN0IFJYIERNQSByZXNvdXJjZSAhXG4iKTsKKwlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShpbywgMiwgJmF3YWNzX3JzcmNbMl0pIHx8CisJICAgIHJlcXVlc3RfbWVtX3JlZ2lvbihhd2Fjc19yc3JjWzJdLnN0YXJ0LAorCQkJICAgICAgIGF3YWNzX3JzcmNbMl0uZW5kIC0gYXdhY3NfcnNyY1syXS5zdGFydCArIDEsCisJCQkgICAgICAgIiAocnggZG1hKSIpID09IE5VTEwpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGF3YWNzX3JzcmNbMF0uc3RhcnQsCisJCQkJICAgYXdhY3NfcnNyY1swXS5lbmQgLSBhd2Fjc19yc3JjWzBdLnN0YXJ0ICsgMSk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihhd2Fjc19yc3JjWzFdLnN0YXJ0LAorCQkJCSAgIGF3YWNzX3JzcmNbMV0uZW5kIC0gYXdhY3NfcnNyY1sxXS5zdGFydCArIDEpOworCQlwcmludGsoS0VSTl9FUlIgImRtYXNvdW5kOiBjYW4ndCByZXF1ZXN0IFJ4IERNQSByZXNvdXJjZSAhXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJYXdhY3NfYmVlcF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKIAlpZiAoIWF3YWNzX2JlZXBfZGV2KSB7Ci0JCXJlbGVhc2VfT0ZfcmVzb3VyY2UoaW8sIDApOwotCQlyZWxlYXNlX09GX3Jlc291cmNlKGlvLCAxKTsKLQkJcmVsZWFzZV9PRl9yZXNvdXJjZShpbywgMik7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihhd2Fjc19yc3JjWzBdLnN0YXJ0LAorCQkJCSAgIGF3YWNzX3JzcmNbMF0uZW5kIC0gYXdhY3NfcnNyY1swXS5zdGFydCArIDEpOworCQlyZWxlYXNlX21lbV9yZWdpb24oYXdhY3NfcnNyY1sxXS5zdGFydCwKKwkJCQkgICBhd2Fjc19yc3JjWzFdLmVuZCAtIGF3YWNzX3JzcmNbMV0uc3RhcnQgKyAxKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGF3YWNzX3JzcmNbMl0uc3RhcnQsCisJCQkJICAgYXdhY3NfcnNyY1syXS5lbmQgLSBhd2Fjc19yc3JjWzJdLnN0YXJ0ICsgMSk7CiAJCXByaW50ayhLRVJOX0VSUiAiZG1hc291bmQ6IGNhbid0IGFsbG9jYXRlIGlucHV0IGRldmljZSAhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjkxNiwxMSArMjkzMiwxMSBAQAogCiAJLyogYWxsIE9GIHZlcnNpb25zIEkndmUgc2VlbiB1c2UgdGhpcyB2YWx1ZSAqLwogCWlmIChpMnNfbm9kZSkKLQkJaTJzID0gaW9yZW1hcChpby0+YWRkcnNbMF0uYWRkcmVzcywgMHgxMDAwKTsKKwkJaTJzID0gaW9yZW1hcChhd2Fjc19yc3JjWzBdLnN0YXJ0LCAweDEwMDApOwogCWVsc2UKLQkJYXdhY3MgPSBpb3JlbWFwKGlvLT5hZGRyc1swXS5hZGRyZXNzLCAweDEwMDApOwotCWF3YWNzX3R4ZG1hID0gaW9yZW1hcChpby0+YWRkcnNbMV0uYWRkcmVzcywgMHgxMDApOwotCWF3YWNzX3J4ZG1hID0gaW9yZW1hcChpby0+YWRkcnNbMl0uYWRkcmVzcywgMHgxMDApOworCQlhd2FjcyA9IGlvcmVtYXAoYXdhY3NfcnNyY1swXS5zdGFydCwgMHgxMDAwKTsKKwlhd2Fjc190eGRtYSA9IGlvcmVtYXAoYXdhY3NfcnNyY1sxXS5zdGFydCwgMHgxMDApOworCWF3YWNzX3J4ZG1hID0gaW9yZW1hcChhd2Fjc19yc3JjWzJdLnN0YXJ0LCAweDEwMCk7CiAKIAkvKiBmaXJzdCBvZiBhbGwgbWFrZSBzdXJlIHRoYXQgdGhlIGNoaXAgaXMgcG93ZXJlZCB1cC4uLi4qLwogCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1NPVU5EX0NISVBfRU5BQkxFLCBpbywgMCwgMSk7CkBAIC0zMDgzLDkgKzMwOTksMTAgQEAKIAkJc3RydWN0IGRldmljZV9ub2RlKiBtaW87CiAJCW1hY2lvX2Jhc2UgPSBOVUxMOwogCQlmb3IgKG1pbyA9IGlvLT5wYXJlbnQ7IG1pbzsgbWlvID0gbWlvLT5wYXJlbnQpIHsKLQkJCWlmIChzdHJjbXAobWlvLT5uYW1lLCAibWFjLWlvIikgPT0gMAotCQkJICAgICYmIG1pby0+bl9hZGRycyA+IDApIHsKLQkJCQltYWNpb19iYXNlID0gaW9yZW1hcChtaW8tPmFkZHJzWzBdLmFkZHJlc3MsIDB4NDApOworCQkJaWYgKHN0cmNtcChtaW8tPm5hbWUsICJtYWMtaW8iKSA9PSAwKSB7CisJCQkJc3RydWN0IHJlc291cmNlIHI7CisJCQkJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobWlvLCAwLCAmcikgPT0gMCkKKwkJCQkJbWFjaW9fYmFzZSA9IGlvcmVtYXAoci5zdGFydCwgMHg0MCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9wYXVsYS5jIGIvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX3BhdWxhLmMKaW5kZXggZDU5ZjYwYi4uNDk0MDcwYSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX3BhdWxhLmMKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX3BhdWxhLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNkZWZpbmUgRE1BU09VTkRfUEFVTEFfUkVWSVNJT04gMAogI2RlZmluZSBETUFTT1VORF9QQVVMQV9FRElUSU9OIDQKIAorI2RlZmluZSBjdXN0b20gYW1pZ2FfY3VzdG9tCiAgICAvKgogICAgICoJVGhlIG1pbmltdW0gcGVyaW9kIGZvciBhdWRpbyBkZXBlbmRzIG9uIGh0b3RhbCAoZm9yIE9DUy9FQ1MvQUdBKQogICAgICoJKEltcG9ydGVkIGZyb20gYXJjaC9tNjhrL2FtaWdhL2FtaXNvdW5kLmMpCkBAIC0xNTYsNyArMTU3LDcgQEAKICAgICAgKiAgTmF0aXZlIGZvcm1hdAogICAgICAqLwogCi1zdGF0aWMgc3NpemVfdCBhbWlfY3RfczgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgYW1pX2N0X3M4KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwgc3NpemVfdCBmcmFtZUxlZnQpCiB7CiAJc3NpemVfdCBjb3VudCwgdXNlZDsKQEAgLTE4OSw3ICsxOTAsNyBAQAogICAgICAqLwogCiAjZGVmaW5lIEdFTkVSQVRFX0FNSV9DVDgoZnVuY25hbWUsIGNvbnZzYW1wbGUpCQkJCVwKLXN0YXRpYyBzc2l6ZV90IGZ1bmNuYW1lKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwJXAorc3RhdGljIHNzaXplX3QgZnVuY25hbWUoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwJXAogCQkJdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwJCVwKIAkJCXNzaXplX3QgZnJhbWVMZWZ0KQkJCQlcCiB7CQkJCQkJCQkJXApAQCAtMjQwLDEwICsyNDEsMTEgQEAKICAgICAgKi8KIAogI2RlZmluZSBHRU5FUkFURV9BTUlfQ1RfMTYoZnVuY25hbWUsIGNvbnZzYW1wbGUpCQkJXAotc3RhdGljIHNzaXplX3QgZnVuY25hbWUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAlcCitzdGF0aWMgc3NpemVfdCBmdW5jbmFtZShjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAlcCiAJCQl1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAkJXAogCQkJc3NpemVfdCBmcmFtZUxlZnQpCQkJCVwKIHsJCQkJCQkJCQlcCisJY29uc3QgdV9zaG9ydCBfX3VzZXIgKnB0ciA9IChjb25zdCB1X3Nob3J0IF9fdXNlciAqKXVzZXJQdHI7CVwKIAlzc2l6ZV90IGNvdW50LCB1c2VkOwkJCQkJCVwKIAl1X3Nob3J0IGRhdGE7CQkJCQkJCVwKIAkJCQkJCQkJCVwKQEAgLTI1Myw3ICsyNTUsNyBAQAogCQljb3VudCA9IG1pbl90KHNpemVfdCwgdXNlckNvdW50LCBmcmFtZUxlZnQpPj4xICYgfjE7CVwKIAkJdXNlZCA9IGNvdW50KjI7CQkJCQkJXAogCQl3aGlsZSAoY291bnQgPiAwKSB7CQkJCQlcCi0JCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X3Nob3J0ICopdXNlclB0cikrKykpCVwKKwkJCWlmIChnZXRfdXNlcihkYXRhLCBwdHIrKykpCQkJXAogCQkJCXJldHVybiAtRUZBVUxUOwkJCQlcCiAJCQlkYXRhID0gY29udnNhbXBsZShkYXRhKTsJCQlcCiAJCQkqaGlnaCsrID0gZGF0YT4+ODsJCQkJXApAQCAtMjY4LDEyICsyNzAsMTIgQEAKIAkJY291bnQgPSBtaW5fdChzaXplX3QsIHVzZXJDb3VudCwgZnJhbWVMZWZ0KT4+MiAmIH4xOwlcCiAJCXVzZWQgPSBjb3VudCo0OwkJCQkJCVwKIAkJd2hpbGUgKGNvdW50ID4gMCkgewkJCQkJXAotCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9zaG9ydCAqKXVzZXJQdHIpKyspKQlcCisJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgcHRyKyspKQkJCVwKIAkJCQlyZXR1cm4gLUVGQVVMVDsJCQkJXAogCQkJZGF0YSA9IGNvbnZzYW1wbGUoZGF0YSk7CQkJXAogCQkJKmxlZnRoKysgPSBkYXRhPj44OwkJCQlcCiAJCQkqbGVmdGwrKyA9IChkYXRhPj4yKSAmIDB4M2Y7CQkJXAotCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9zaG9ydCAqKXVzZXJQdHIpKyspKQlcCisJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgcHRyKyspKQkJCVwKIAkJCQlyZXR1cm4gLUVGQVVMVDsJCQkJXAogCQkJZGF0YSA9IGNvbnZzYW1wbGUoZGF0YSk7CQkJXAogCQkJKnJpZ2h0aCsrID0gZGF0YT4+ODsJCQkJXApkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX3E0MC5jIGIvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX3E0MC5jCmluZGV4IDFkZGFhNjIuLmUyMDgxZjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9xNDAuYworKysgYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfcTQwLmMKQEAgLTU4LDcgKzU4LDcgQEAKIAogCiAvKiB1c2VyQ291bnQsIGZyYW1lVXNlZCwgZnJhbWVMZWZ0ID09IGJ5dGUgY291bnRzICovCi1zdGF0aWMgc3NpemVfdCBxNDBfY3RfbGF3KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IHE0MF9jdF9sYXcoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKIAkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICBzc2l6ZV90IGZyYW1lTGVmdCkKIHsKQEAgLTc5LDcgKzc5LDcgQEAKIH0KIAogCi1zdGF0aWMgc3NpemVfdCBxNDBfY3RfczgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgcTQwX2N0X3M4KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgIHNzaXplX3QgZnJhbWVMZWZ0KQogewpAQCAtOTgsNyArOTgsNyBAQAogCXJldHVybiB1c2VkOwogfQogCi1zdGF0aWMgc3NpemVfdCBxNDBfY3RfdTgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgcTQwX2N0X3U4KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCiAJCQkgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgIHNzaXplX3QgZnJhbWVMZWZ0KQogewpAQCAtMTE0LDcgKzExNCw3IEBACiAKIAogLyogYSBiaXQgdG9vIGNvbXBsaWNhdGVkIHRvIG9wdGltaXNlIHJpZ2h0IG5vdyAuLiovCi1zdGF0aWMgc3NpemVfdCBxNDBfY3R4X2xhdyhjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBxNDBfY3R4X2xhdyhjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpCiB7CkBAIC0xNTIsNyArMTUyLDcgQEAKIH0KIAogCi1zdGF0aWMgc3NpemVfdCBxNDBfY3R4X3M4KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IHE0MF9jdHhfczgoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKIAkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICBzc2l6ZV90IGZyYW1lTGVmdCkKIHsKQEAgLTE4OSw3ICsxODksNyBAQAogfQogCiAKLXN0YXRpYyBzc2l6ZV90IHE0MF9jdHhfdTgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgcTQwX2N0eF91OChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQogewpAQCAtMjI0LDcgKzIyNCw3IEBACiB9CiAKIC8qIGNvbXByZXNzaW5nIHZlcnNpb25zICovCi1zdGF0aWMgc3NpemVfdCBxNDBfY3RjX2xhdyhjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCitzdGF0aWMgc3NpemVfdCBxNDBfY3RjX2xhdyhjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpCiB7CkBAIC0yNjUsNyArMjY1LDcgQEAKIH0KIAogCi1zdGF0aWMgc3NpemVfdCBxNDBfY3RjX3M4KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKK3N0YXRpYyBzc2l6ZV90IHE0MF9jdGNfczgoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKIAkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCiAJCQkgICBzc2l6ZV90IGZyYW1lTGVmdCkKIHsKQEAgLTMwNCw3ICszMDQsNyBAQAogfQogCiAKLXN0YXRpYyBzc2l6ZV90IHE0MF9jdGNfdTgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorc3RhdGljIHNzaXplX3QgcTQwX2N0Y191OChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAogCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKIAkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQogewpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL3RyYW5zXzE2LmMgYi9zb3VuZC9vc3MvZG1hc291bmQvdHJhbnNfMTYuYwppbmRleCAyMzU2MmU5Li5jYTk3M2FjIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvZG1hc291bmQvdHJhbnNfMTYuYworKysgYi9zb3VuZC9vc3MvZG1hc291bmQvdHJhbnNfMTYuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSAiZG1hc291bmQuaCIKIAorZXh0ZXJuIGludCBleHBhbmRfYmFsOwkvKiBCYWxhbmNlIGZhY3RvciBmb3IgZXhwYW5kaW5nIChub3Qgdm9sdW1lISkgKi8KIHN0YXRpYyBzaG9ydCBkbWFzb3VuZF9hbGF3MmRtYTE2W10gOwogc3RhdGljIHNob3J0IGRtYXNvdW5kX3VsYXcyZG1hMTZbXSA7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL21haW4uYyBiL3NvdW5kL29zcy9lbXUxMGsxL21haW4uYwppbmRleCA5YjkwNWJhLi4yMzI0MWNiIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9tYWluLmMKKysrIGIvc291bmQvb3NzL2VtdTEwazEvbWFpbi5jCkBAIC0xNDI4LDcgKzE0MjgsNyBAQAogewogCXByaW50ayhLRVJOX0lORk8gIkNyZWF0aXZlIEVNVTEwSzEgUENJIEF1ZGlvIERyaXZlciwgdmVyc2lvbiAiIERSSVZFUl9WRVJTSU9OICIsICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiIpOwogCi0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZW11MTBrMV9wY2lfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZW11MTBrMV9wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGVtdTEwazFfY2xlYW51cF9tb2R1bGUodm9pZCkKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lczEzNzAuYyBiL3NvdW5kL29zcy9lczEzNzAuYwppbmRleCA4NTM4MDg1Li5hZTU1YzUzIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvZXMxMzcwLmMKKysrIGIvc291bmQvb3NzL2VzMTM3MC5jCkBAIC0yNzc5LDcgKzI3NzksNyBAQAogc3RhdGljIGludCBfX2luaXQgaW5pdF9lczEzNzAodm9pZCkKIHsKIAlwcmludGsoS0VSTl9JTkZPICJlczEzNzA6IHZlcnNpb24gdjAuMzggdGltZSAiIF9fVElNRV9fICIgIiBfX0RBVEVfXyAiXG4iKTsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZlczEzNzBfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZXMxMzcwX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2VzMTM3MCh2b2lkKQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VzMTM3MS5jIGIvc291bmQvb3NzL2VzMTM3MS5jCmluZGV4IDEyYTU2ZDUuLjVjNjk3ZjE2IDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvZXMxMzcxLmMKKysrIGIvc291bmQvb3NzL2VzMTM3MS5jCkBAIC0zMDkwLDcgKzMwOTAsNyBAQAogc3RhdGljIGludCBfX2luaXQgaW5pdF9lczEzNzEodm9pZCkKIHsKIAlwcmludGsoS0VSTl9JTkZPIFBGWCAidmVyc2lvbiB2MC4zMiB0aW1lICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiIpOwotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmVzMTM3MV9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZlczEzNzFfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfZXMxMzcxKHZvaWQpCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZXNzc29sbzEuYyBiL3NvdW5kL29zcy9lc3Nzb2xvMS5jCmluZGV4IGE0ZWNhYjJmLi44NDliNTlmIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvZXNzc29sbzEuYworKysgYi9zb3VuZC9vc3MvZXNzc29sbzEuYwpAQCAtNTE1LDcgKzUxNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHByb2dfZG1hYnVmX2RhYyhzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMpCitzdGF0aWMgaW50IHByb2dfZG1hYnVmX2RhYyhzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMpCiB7CiAJdW5zaWduZWQgbG9uZyB2YTsKIAlpbnQgYzsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9oYXJtb255LmMgYi9zb3VuZC9vc3MvaGFybW9ueS5jCmluZGV4IGJlZTlkMzQuLjU5MTY4M2MgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9oYXJtb255LmMKKysrIGIvc291bmQvb3NzL2hhcm1vbnkuYwpAQCAtMTIzNiw3ICsxMjM2LDcgQEAKIAl9CiAKIAkvKiBTZXQgdGhlIEhQQSBvZiBoYXJtb255ICovCi0JaGFybW9ueS5ocGEgPSAoc3RydWN0IGhhcm1vbnlfaHBhICopZGV2LT5ocGE7CisJaGFybW9ueS5ocGEgPSAoc3RydWN0IGhhcm1vbnlfaHBhICopZGV2LT5ocGEuc3RhcnQ7CiAJaGFybW9ueS5kZXYgPSBkZXY7CiAKIAkvKiBHcmFiIHRoZSBJRCBhbmQgcmV2aXNpb24gZnJvbSB0aGUgZGV2aWNlICovCkBAIC0xMjUwLDcgKzEyNTAsNyBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyAiTGFzaSBIYXJtb255IEF1ZGlvIGRyaXZlciAiIEhBUk1PTllfVkVSU0lPTiAiLCAiCiAJCQkiaC93IGlkICVpLCByZXYuICVpIGF0IDB4JWx4LCBJUlEgJWlcbiIsCi0JCQlpZCwgcmV2LCBkZXYtPmhwYSwgaGFybW9ueS5kZXYtPmlycSk7CisJCQlpZCwgcmV2LCBkZXYtPmhwYS5zdGFydCwgaGFybW9ueS5kZXYtPmlycSk7CiAJCiAJLyogTWFrZSBzdXJlIHRoZSBjb250cm9sIGJpdCBpc24ndCBzZXQsIGFsdGhvdWdoIEkgZG9uJ3QgdGhpbmsgaXQgCiAJICAgZXZlciBpcy4gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9pODEwX2F1ZGlvLmMgYi9zb3VuZC9vc3MvaTgxMF9hdWRpby5jCmluZGV4IGI5YTY0MGYuLmFiYzI0MmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9pODEwX2F1ZGlvLmMKKysrIGIvc291bmQvb3NzL2k4MTBfYXVkaW8uYwpAQCAtMzEyLDcgKzMxMiw4IEBACiAJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIElOVEVMSUNINH0sCiAJe1BDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8xOCwKIAkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgSU5URUxJQ0g0fSwKLQorCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgIFBDSV9ERVZJQ0VfSURfTlZJRElBX0NLODA0X0FVRElPLAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBOVklESUFfTkZPUkNFfSwKIAl7MCx9CiB9OwogCkBAIC0zMzU5LDEyICszMzYwLDYgQEAKIAkJZ290byBvdXRfcmVnaW9uMjsKIAl9CiAKLQlpZiAocmVxdWVzdF9pcnEoY2FyZC0+aXJxLCAmaTgxMF9pbnRlcnJ1cHQsIFNBX1NISVJRLAotCQkJY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXSwgY2FyZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpODEwX2F1ZGlvOiB1bmFibGUgdG8gYWxsb2NhdGUgaXJxICVkXG4iLCBjYXJkLT5pcnEpOwotCQlnb3RvIG91dF9waW87Ci0JfQotCiAJaWYgKGNhcmQtPnVzZV9tbWlvKSB7CiAJCWlmIChyZXF1ZXN0X21lbV9yZWdpb24oY2FyZC0+YWM5N2Jhc2VfbW1pb19waHlzLCA1MTIsICJpY2hfYXVkaW8gTU1CQVIiKSkgewogCQkJaWYgKChjYXJkLT5hYzk3YmFzZV9tbWlvID0gaW9yZW1hcChjYXJkLT5hYzk3YmFzZV9tbWlvX3BoeXMsIDUxMikpKSB7IC8qQEZJWE1FIGNhbiBpb3JlbWFwIGZhaWw/IGRvbid0IGtub3cgKGpzYXcpICovCkBAIC0zMzk1LDEwICszMzkwLDggQEAKIAl9CiAKIAkvKiBpbml0aWFsaXplIEFDOTcgY29kZWMgYW5kIHJlZ2lzdGVyIC9kZXYvbWl4ZXIgKi8KLQlpZiAoaTgxMF9hYzk3X2luaXQoY2FyZCkgPD0gMCkgewotCQlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOworCWlmIChpODEwX2FjOTdfaW5pdChjYXJkKSA8PSAwKQogCQlnb3RvIG91dF9pb3NwYWNlOwotCX0KIAlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgY2FyZCk7CiAKIAlpZihjbG9ja2luZyA9PSAwKSB7CkBAIC0zNDEwLDcgKzM0MDMsNiBAQAogCWlmICgoY2FyZC0+ZGV2X2F1ZGlvID0gcmVnaXN0ZXJfc291bmRfZHNwKCZpODEwX2F1ZGlvX2ZvcHMsIC0xKSkgPCAwKSB7CiAJCWludCBpOwogCQlwcmludGsoS0VSTl9FUlIgImk4MTBfYXVkaW86IGNvdWxkbid0IHJlZ2lzdGVyIERTUCBkZXZpY2UhXG4iKTsKLQkJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKIAkJZm9yIChpID0gMDsgaSA8IE5SX0FDOTc7IGkrKykKIAkJaWYgKGNhcmQtPmFjOTdfY29kZWNbaV0gIT0gTlVMTCkgewogCQkJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihjYXJkLT5hYzk3X2NvZGVjW2ldLT5kZXZfbWl4ZXIpOwpAQCAtMzQxOSw2ICszNDExLDEzIEBACiAJCWdvdG8gb3V0X2lvc3BhY2U7CiAJfQogCisJaWYgKHJlcXVlc3RfaXJxKGNhcmQtPmlycSwgJmk4MTBfaW50ZXJydXB0LCBTQV9TSElSUSwKKwkJCWNhcmRfbmFtZXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0sIGNhcmQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaTgxMF9hdWRpbzogdW5hYmxlIHRvIGFsbG9jYXRlIGlycSAlZFxuIiwgY2FyZC0+aXJxKTsKKwkJZ290byBvdXRfaW9zcGFjZTsKKwl9CisKKwogIAljYXJkLT5pbml0aWFsaXppbmcgPSAwOwogCXJldHVybiAwOwogCkBAIC0zNDI5LDcgKzM0MjgsNiBAQAogCQlyZWxlYXNlX21lbV9yZWdpb24oY2FyZC0+YWM5N2Jhc2VfbW1pb19waHlzLCA1MTIpOwogCQlyZWxlYXNlX21lbV9yZWdpb24oY2FyZC0+aW9iYXNlX21taW9fcGh5cywgMjU2KTsKIAl9Ci1vdXRfcGlvOgkKIAlyZWxlYXNlX3JlZ2lvbihjYXJkLT5hYzk3YmFzZSwgMjU2KTsKIG91dF9yZWdpb24yOgogCXJlbGVhc2VfcmVnaW9uKGNhcmQtPmlvYmFzZSwgNjQpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2l0ZTgxNzIuYyBiL3NvdW5kL29zcy9pdGU4MTcyLmMKaW5kZXggMjZlNTk0NC4uOGZkMmY5YSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2l0ZTgxNzIuYworKysgYi9zb3VuZC9vc3MvaXRlODE3Mi5jCkBAIC0yMjA2LDcgKzIyMDYsNyBAQAogc3RhdGljIGludCBfX2luaXQgaW5pdF9pdDgxNzIodm9pZCkKIHsKIAlpbmZvKCJ2ZXJzaW9uIHYwLjUgdGltZSAiIF9fVElNRV9fICIgIiBfX0RBVEVfXyk7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmaXQ4MTcyX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJml0ODE3Ml9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9pdDgxNzIodm9pZCkKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9rYWhsdWEuYyBiL3NvdW5kL29zcy9rYWhsdWEuYwppbmRleCA4MDhjNWVmLi4yODM1YTdjIDEwMDY0NAotLS0gYS9zb3VuZC9vc3Mva2FobHVhLmMKKysrIGIvc291bmQvb3NzL2thaGx1YS5jCkBAIC0yMTgsNyArMjE4LDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IGthaGx1YV9pbml0X21vZHVsZSh2b2lkKQogewogCXByaW50ayhLRVJOX0lORk8gIkN5cml4IEthaGx1YSBWU0ExIFhwcmVzc0F1ZGlvIHN1cHBvcnQgKGMpIENvcHlyaWdodCAyMDAzIFJlZCBIYXQgSW5jXG4iKTsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZrYWhsdWFfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigma2FobHVhX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBrYWhsdWFfY2xlYW51cF9tb2R1bGUodm9pZCkKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9tYWVzdHJvLmMgYi9zb3VuZC9vc3MvbWFlc3Ryby5jCmluZGV4IGY5YWM1YjEuLmQ0YjU2OWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9tYWVzdHJvLmMKKysrIGIvc291bmQvb3NzL21hZXN0cm8uYwpAQCAtMzYyNCw3ICszNjI0LDcgQEAKIHsKIAlpbnQgcmM7CiAKLQlyYyA9IHBjaV9tb2R1bGVfaW5pdCgmbWFlc3Ryb19wY2lfZHJpdmVyKTsKKwlyYyA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJm1hZXN0cm9fcGNpX2RyaXZlcik7CiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwogCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvbmVjX3ZyYzU0NzcuYyBiL3NvdW5kL29zcy9uZWNfdnJjNTQ3Ny5jCmluZGV4IDlhYzRiZjcuLmZiYjkxNzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9uZWNfdnJjNTQ3Ny5jCisrKyBiL3NvdW5kL29zcy9uZWNfdnJjNTQ3Ny5jCkBAIC0yMDQ1LDcgKzIwNDUsNyBAQAogc3RhdGljIGludCBfX2luaXQgaW5pdF92cmM1NDc3X2FjOTcodm9pZCkKIHsKIAlwcmludGsoIlZyYzU0NzcgQUM5NyBkcml2ZXI6IHZlcnNpb24gdjAuMiB0aW1lICIgX19USU1FX18gIiAiIF9fREFURV9fICIgYnkgSnVuIFN1blxuIik7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmdnJjNTQ3N19hYzk3X2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnZyYzU0NzdfYWM5N19kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF92cmM1NDc3X2FjOTcodm9pZCkKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9ubTI1Nl9hdWRpby5jIGIvc291bmQvb3NzL25tMjU2X2F1ZGlvLmMKaW5kZXggNDJkOGYwNS4uN2RlMDc5YiAxMDA2NDQKLS0tIGEvc291bmQvb3NzL25tMjU2X2F1ZGlvLmMKKysrIGIvc291bmQvb3NzL25tMjU2X2F1ZGlvLmMKQEAgLTE2NDQsNyArMTY0NCw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBkb19pbml0X25tMjU2KHZvaWQpCiB7CiAgICAgcHJpbnRrIChLRVJOX0lORk8gIk5lb01hZ2ljIDI1NkFWLzI1NlpYIGF1ZGlvIGRyaXZlciwgdmVyc2lvbiAxLjFwXG4iKTsKLSAgICByZXR1cm4gcGNpX21vZHVsZV9pbml0KCZubTI1Nl9wY2lfZHJpdmVyKTsKKyAgICByZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmbm0yNTZfcGNpX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX25tMjU2ICh2b2lkKQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL29wbDNzYTIuYyBiL3NvdW5kL29zcy9vcGwzc2EyLmMKaW5kZXggNWNlY2RiYy4uMGUxNjFjNiAxMDA2NDQKLS0tIGEvc291bmQvb3NzL29wbDNzYTIuYworKysgYi9zb3VuZC9vc3Mvb3BsM3NhMi5jCkBAIC01MzAsNyArNTMwLDcgQEAKIAlpZiAoaHdfY29uZmlnLT5zbG90c1swXSAhPSAtMSkgewogCQkvKiBEaWQgdGhlIE1TUyBkcml2ZXIgaW5zdGFsbD8gKi8KIAkJaWYobnVtX21peGVycyA9PSAoaW5pdGlhbF9taXhlcnMgKyAxKSkgewotCQkJLyogVGhlIE1TUyBtaXhlciBpcyBpbnN0YWxsZWQsIHJlcm91dGUgbWl4ZXJzIGFwcHJvcGlhdGVseSAqLworCQkJLyogVGhlIE1TUyBtaXhlciBpcyBpbnN0YWxsZWQsIHJlcm91dGUgbWl4ZXJzIGFwcHJvcHJpYXRlbHkgKi8KIAkJCUFEMTg0OF9SRVJPVVRFKFNPVU5EX01JWEVSX0xJTkUxLCBTT1VORF9NSVhFUl9DRCk7CiAJCQlBRDE4NDhfUkVST1VURShTT1VORF9NSVhFUl9MSU5FMiwgU09VTkRfTUlYRVJfU1lOVEgpOwogCQkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfTElORTMsIFNPVU5EX01JWEVSX0xJTkUpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3JtZTk2eHguYyBiL3NvdW5kL29zcy9ybWU5Nnh4LmMKaW5kZXggMzE4ZGM1MS4uZmFhMGI3OSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3JtZTk2eHguYworKysgYi9zb3VuZC9vc3Mvcm1lOTZ4eC5jCkBAIC0xMDk1LDcgKzEwOTUsNyBAQAogCWRldmljZXMgPSAoKGRldmljZXMtMSkgJiBSTUU5Nnh4X01BU0tfREVWUykgKyAxOwogCXByaW50ayhLRVJOX0lORk8gUk1FX01FU1MiIHJlc2VydmluZyAlZCBkc3AgZGV2aWNlKHMpXG4iLGRldmljZXMpOwogICAgICAgICBudW1jYXJkcyA9IDA7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcm1lOTZ4eF9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZybWU5Nnh4X2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX3JtZTk2eHgodm9pZCkKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zb25pY3ZpYmVzLmMgYi9zb3VuZC9vc3Mvc29uaWN2aWJlcy5jCmluZGV4IDE3ZDBlNDYuLjcxYjA1ZTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9zb25pY3ZpYmVzLmMKKysrIGIvc291bmQvb3NzL3NvbmljdmliZXMuYwpAQCAtMjc2NSw3ICsyNzY1LDcgQEAKIAlpZiAoISh3YXZldGFibGVfbWVtID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCAyMC1QQUdFX1NISUZUKSkpCiAJCXByaW50ayhLRVJOX0lORk8gInN2OiBjYW5ub3QgYWxsb2NhdGUgMU1CIG9mIGNvbnRpZ3VvdXMgbm9ucGFnZWFibGUgbWVtb3J5IGZvciB3YXZldGFibGUgZGF0YVxuIik7CiAjZW5kaWYKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZzdl9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZzdl9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9zb25pY3ZpYmVzKHZvaWQpCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvdHJpZGVudC5jIGIvc291bmQvb3NzL3RyaWRlbnQuYwppbmRleCA1ZjBhZDZiLi5hMjFjNjYzIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvdHJpZGVudC5jCisrKyBiL3NvdW5kL29zcy90cmlkZW50LmMKQEAgLTI3OCwxNiArMjc4LDE0IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgdHJpZGVudF9wY2lfdGJsW10gPSB7Ci0Je1BDSV9WRU5ET1JfSURfVFJJREVOVCwgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9EWCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgVFJJREVOVF80RF9EWH0sCi0Je1BDSV9WRU5ET1JfSURfVFJJREVOVCwgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgVFJJREVOVF80RF9OWH0sCi0Je1BDSV9WRU5ET1JfSURfU0ksIFBDSV9ERVZJQ0VfSURfU0lfNzAxOCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgU0lTXzcwMTh9LAotCXtQQ0lfVkVORE9SX0lEX0FMSSwgUENJX0RFVklDRV9JRF9BTElfNTQ1MSwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQUxJXzU0NTF9LAotCXtQQ0lfVkVORE9SX0lEX0lOVEVSRywgUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MCwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ1lCRVI1MDUwfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1RSSURFTlQsIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFgpLAorCQlQQ0lfQ0xBU1NfTVVMVElNRURJQV9BVURJTyA8PCA4LCAweGZmZmYwMCwgVFJJREVOVF80RF9EWH0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9UUklERU5ULCBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YKSwKKwkJMCwgMCwgVFJJREVOVF80RF9OWH0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TSSwgUENJX0RFVklDRV9JRF9TSV83MDE4KSwgMCwgMCwgU0lTXzcwMTh9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQUxJLCBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSwgMCwgMCwgQUxJXzU0NTF9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URVJHLCBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwKSwKKwkJMCwgMCwgQ1lCRVI1MDUwfSwKIAl7MCx9CiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MveW1mcGNpLmMgYi9zb3VuZC9vc3MveW1mcGNpLmMKaW5kZXggOGRhZTU5Yi4uZjhiZDcyZSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3ltZnBjaS5jCisrKyBiL3NvdW5kL29zcy95bWZwY2kuYwpAQCAtMjY4MCw3ICsyNjgwLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgeW1mX2luaXRfbW9kdWxlKHZvaWQpCiB7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmeW1mcGNpX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnltZnBjaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgeW1mX2NsZWFudXBfbW9kdWxlICh2b2lkKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvLmMgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW8uYwppbmRleCAyMDJjN2NmLi5mMzZlZGU4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW8uYworKysgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW8uYwpAQCAtMzg1LDcgKzM4NSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF9jczU1MzVhdWRpb19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGFsc2FfY2FyZF9jczU1MzVhdWRpb19leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVmeC5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11ZnguYwppbmRleCAxYTkwMzM5Li41MDk4MzcyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVmeC5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdWZ4LmMKQEAgLTI3LDYgKzI3LDcgQEAKIAogI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZXMxOTY4LmMgYi9zb3VuZC9wY2kvZXMxOTY4LmMKaW5kZXggOWZmYjYwMC4uMzc0N2E0MyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VzMTk2OC5jCisrKyBiL3NvdW5kL3BjaS9lczE5NjguYwpAQCAtNzI3LDcgKzcyNyw3IEBACiAJYXB1X2RhdGFfc2V0KGNoaXAsIGRhdGEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYXB1X3NldF9yZWdpc3RlcihzdHJ1Y3QgZXMxOTY4ICpjaGlwLCB1MTYgY2hhbm5lbCwgdTggcmVnLCB1MTYgZGF0YSkKK3N0YXRpYyB2b2lkIGFwdV9zZXRfcmVnaXN0ZXIoc3RydWN0IGVzMTk2OCAqY2hpcCwgdTE2IGNoYW5uZWwsIHU4IHJlZywgdTE2IGRhdGEpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKQEAgLTc0Myw3ICs3NDMsNyBAQAogCXJldHVybiBfX21hZXN0cm9fcmVhZChjaGlwLCBJRFIwX0RBVEFfUE9SVCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTE2IGFwdV9nZXRfcmVnaXN0ZXIoc3RydWN0IGVzMTk2OCAqY2hpcCwgdTE2IGNoYW5uZWwsIHU4IHJlZykKK3N0YXRpYyB1MTYgYXB1X2dldF9yZWdpc3RlcihzdHJ1Y3QgZXMxOTY4ICpjaGlwLCB1MTYgY2hhbm5lbCwgdTggcmVnKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTE2IHY7CmRpZmYgLS1naXQgYS9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZl9wY20uYyBiL3NvdW5kL3BjbWNpYS9wZGF1ZGlvY2YvcGRhdWRpb2NmX3BjbS5jCmluZGV4IDA5Y2IyNTAuLjk2MmU2ZDUyIDEwMDY0NAotLS0gYS9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZl9wY20uYworKysgYi9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZl9wY20uYwpAQCAtMjA5LDcgKzIwOSw3IEBACiAJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6CiAJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zQkU6CiAJCWNoaXAtPnBjbV9zYW1wbGUgPSAzOwotCQkvKiBmYWxsIHRyb3VnaCAqLworCQkvKiBmYWxsIHRocm91Z2ggKi8KIAlkZWZhdWx0OiAvKiAyNC1iaXQgKi8KIAkJYXZhbCA9IEFLNDExN19ESUZfMjRSOwogCQljaGlwLT5wY21fZnJhbWUgPSAzOwpkaWZmIC0tZ2l0IGEvc291bmQvcHBjL3BtYWMuYyBiL3NvdW5kL3BwYy9wbWFjLmMKaW5kZXggOWIyYjAwZi4uYTY0MmU0YyAxMDA2NDQKLS0tIGEvc291bmQvcHBjL3BtYWMuYworKysgYi9zb3VuZC9wcGMvcG1hYy5jCkBAIC04MDMsMjEgKzgwMywxNyBAQAogCQlpb3VubWFwKGNoaXAtPnBsYXliYWNrLmRtYSk7CiAJaWYgKGNoaXAtPmNhcHR1cmUuZG1hKQogCQlpb3VubWFwKGNoaXAtPmNhcHR1cmUuZG1hKTsKLSNpZm5kZWYgQ09ORklHX1BQQzY0CisKIAlpZiAoY2hpcC0+bm9kZSkgewogCQlpbnQgaTsKLQogCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCQlpZiAoY2hpcC0+b2ZfcmVxdWVzdGVkICYgKDEgPDwgaSkpIHsKLQkJCQlpZiAoY2hpcC0+aXNfazIpCi0JCQkJCXJlbGVhc2VfT0ZfcmVzb3VyY2UoY2hpcC0+bm9kZS0+cGFyZW50LAotCQkJCQkJCSAgICBpKTsKLQkJCQllbHNlCi0JCQkJCXJlbGVhc2VfT0ZfcmVzb3VyY2UoY2hpcC0+bm9kZSwgaSk7Ci0JCQl9CisJCQlpZiAoY2hpcC0+cmVxdWVzdGVkICYgKDEgPDwgaSkpCisJCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGNoaXAtPnJzcmNbaV0uc3RhcnQsCisJCQkJCQkgICBjaGlwLT5yc3JjW2ldLmVuZCAtCisJCQkJCQkgICBjaGlwLT5yc3JjW2ldLnN0YXJ0ICsgMSk7CiAJCX0KIAl9Ci0jZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCisKIAlpZiAoY2hpcC0+cGRldikKIAkJcGNpX2Rldl9wdXQoY2hpcC0+cGRldik7CiAJa2ZyZWUoY2hpcCk7CkBAIC05OTEsNiArOTg3LDExIEBACiAJCQljaGlwLT5jYW5fYnl0ZV9zd2FwID0gMDsgLyogRklYTUU6IGNoZWNrIHRoaXMgKi8KIAkJCWNoaXAtPmNvbnRyb2xfbWFzayA9IE1BU0tfSUVQQyB8IDB4MTE7LyogZGlzYWJsZSBJRUUgKi8KIAkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJzbmQ6IFVua25vd24gbGF5b3V0IElEIDB4JXhcbiIsCisJCQkgICAgICAgbGF5b3V0X2lkKTsKKwkJCXJldHVybiAtRU5PREVWOworCiAJCX0KIAl9CiAJcHJvcCA9ICh1bnNpZ25lZCBpbnQgKilnZXRfcHJvcGVydHkoc291bmQsICJkZXZpY2UtaWQiLCBOVUxMKTsKQEAgLTExNzUsNDYgKzExNzYsNjkgQEAKIAl9CiAKIAlucCA9IGNoaXAtPm5vZGU7CisJY2hpcC0+cmVxdWVzdGVkID0gMDsKIAlpZiAoY2hpcC0+aXNfazIpIHsKLQkJaWYgKG5wLT5wYXJlbnQtPm5fYWRkcnMgPCAyIHx8IG5wLT5uX2ludHJzIDwgMykgeworCQlzdGF0aWMgY2hhciAqcm5hbWVzW10gPSB7CisJCQkiU291bmQgQ29udHJvbCIsICJTb3VuZCBETUEiIH07CisJCWlmIChucC0+bl9pbnRycyA8IDMpIHsKIAkJCWVyciA9IC1FTk9ERVY7CiAJCQlnb3RvIF9fZXJyb3I7CiAJCX0KLQkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotI2lmbmRlZiBDT05GSUdfUFBDNjQKLQkJCXN0YXRpYyBjaGFyICpuYW1lWzJdID0geyAiLSBDb250cm9sIiwgIi0gRE1BIiB9OwotCQkJaWYgKCEgcmVxdWVzdF9PRl9yZXNvdXJjZShucC0+cGFyZW50LCBpLCBuYW1lW2ldKSkgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInBtYWM6IGNhbid0IHJlcXVlc3QgcmVzb3VyY2UgJWQhXG4iLCBpKTsKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkgKyspIHsKKwkJCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLT5wYXJlbnQsIGksCisJCQkJCQkgICAmY2hpcC0+cnNyY1tpXSkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgInNuZDogY2FuJ3QgdHJhbnNsYXRlIHJzcmMgIgorCQkJCSAgICAgICAiICVkICglcylcbiIsIGksIHJuYW1lc1tpXSk7CiAJCQkJZXJyID0gLUVOT0RFVjsKIAkJCQlnb3RvIF9fZXJyb3I7CiAJCQl9Ci0JCQljaGlwLT5vZl9yZXF1ZXN0ZWQgfD0gKDEgPDwgaSk7Ci0jZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCi0JCQljdHJsX2FkZHIgPSBucC0+cGFyZW50LT5hZGRyc1swXS5hZGRyZXNzOwotCQkJdHhkbWFfYWRkciA9IG5wLT5wYXJlbnQtPmFkZHJzWzFdLmFkZHJlc3M7Ci0JCQlyeGRtYV9hZGRyID0gdHhkbWFfYWRkciArIDB4MTAwOworCQkJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihjaGlwLT5yc3JjW2ldLnN0YXJ0LAorCQkJCQkgICAgICAgY2hpcC0+cnNyY1tpXS5lbmQgLQorCQkJCQkgICAgICAgY2hpcC0+cnNyY1tpXS5zdGFydCArIDEsCisJCQkJCSAgICAgICBybmFtZXNbaV0pID09IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgInNuZDogY2FuJ3QgcmVxdWVzdCByc3JjICIKKwkJCQkgICAgICAgIiAlZCAoJXM6IDB4JTA4bHg6JTA4bHgpXG4iLAorCQkJCSAgICAgICBpLCBybmFtZXNbaV0sIGNoaXAtPnJzcmNbaV0uc3RhcnQsCisJCQkJICAgICAgIGNoaXAtPnJzcmNbaV0uZW5kKTsKKwkJCQllcnIgPSAtRU5PREVWOworCQkJCWdvdG8gX19lcnJvcjsKKwkJCX0KKwkJCWNoaXAtPnJlcXVlc3RlZCB8PSAoMSA8PCBpKTsKIAkJfQotCisJCWN0cmxfYWRkciA9IGNoaXAtPnJzcmNbMF0uc3RhcnQ7CisJCXR4ZG1hX2FkZHIgPSBjaGlwLT5yc3JjWzFdLnN0YXJ0OworCQlyeGRtYV9hZGRyID0gdHhkbWFfYWRkciArIDB4MTAwOwogCX0gZWxzZSB7Ci0JCWlmIChucC0+bl9hZGRycyA8IDMgfHwgbnAtPm5faW50cnMgPCAzKSB7CisJCXN0YXRpYyBjaGFyICpybmFtZXNbXSA9IHsKKwkJCSJTb3VuZCBDb250cm9sIiwgIlNvdW5kIFR4IERNQSIsICJTb3VuZCBSeCBETUEiIH07CisJCWlmIChucC0+bl9pbnRycyA8IDMpIHsKIAkJCWVyciA9IC1FTk9ERVY7CiAJCQlnb3RvIF9fZXJyb3I7CiAJCX0KLQotCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0jaWZuZGVmIENPTkZJR19QUEM2NAotCQkJc3RhdGljIGNoYXIgKm5hbWVbM10gPSB7ICItIENvbnRyb2wiLCAiLSBUeCBETUEiLCAiLSBSeCBETUEiIH07Ci0JCQlpZiAoISByZXF1ZXN0X09GX3Jlc291cmNlKG5wLCBpLCBuYW1lW2ldKSkgewotCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgInBtYWM6IGNhbid0IHJlcXVlc3QgcmVzb3VyY2UgJWQhXG4iLCBpKTsKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkgKyspIHsKKwkJCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLT5wYXJlbnQsIGksCisJCQkJCQkgICAmY2hpcC0+cnNyY1tpXSkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgInNuZDogY2FuJ3QgdHJhbnNsYXRlIHJzcmMgIgorCQkJCSAgICAgICAiICVkICglcylcbiIsIGksIHJuYW1lc1tpXSk7CiAJCQkJZXJyID0gLUVOT0RFVjsKIAkJCQlnb3RvIF9fZXJyb3I7CiAJCQl9Ci0JCQljaGlwLT5vZl9yZXF1ZXN0ZWQgfD0gKDEgPDwgaSk7Ci0jZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCi0JCQljdHJsX2FkZHIgPSBucC0+YWRkcnNbMF0uYWRkcmVzczsKLQkJCXR4ZG1hX2FkZHIgPSBucC0+YWRkcnNbMV0uYWRkcmVzczsKLQkJCXJ4ZG1hX2FkZHIgPSBucC0+YWRkcnNbMl0uYWRkcmVzczsKKwkJCWlmIChyZXF1ZXN0X21lbV9yZWdpb24oY2hpcC0+cnNyY1tpXS5zdGFydCwKKwkJCQkJICAgICAgIGNoaXAtPnJzcmNbaV0uZW5kIC0KKwkJCQkJICAgICAgIGNoaXAtPnJzcmNbaV0uc3RhcnQgKyAxLAorCQkJCQkgICAgICAgcm5hbWVzW2ldKSA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJzbmQ6IGNhbid0IHJlcXVlc3QgcnNyYyAiCisJCQkJICAgICAgICIgJWQgKCVzOiAweCUwOGx4OiUwOGx4KVxuIiwKKwkJCQkgICAgICAgaSwgcm5hbWVzW2ldLCBjaGlwLT5yc3JjW2ldLnN0YXJ0LAorCQkJCSAgICAgICBjaGlwLT5yc3JjW2ldLmVuZCk7CisJCQkJZXJyID0gLUVOT0RFVjsKKwkJCQlnb3RvIF9fZXJyb3I7CisJCQl9CisJCQljaGlwLT5yZXF1ZXN0ZWQgfD0gKDEgPDwgaSk7CiAJCX0KKwkJY3RybF9hZGRyID0gY2hpcC0+cnNyY1swXS5zdGFydDsKKwkJdHhkbWFfYWRkciA9IGNoaXAtPnJzcmNbMV0uc3RhcnQ7CisJCXJ4ZG1hX2FkZHIgPSBjaGlwLT5yc3JjWzJdLnN0YXJ0OwogCX0KIAogCWNoaXAtPmF3YWNzID0gaW9yZW1hcChjdHJsX2FkZHIsIDB4MTAwMCk7CkBAIC0xMjY2LDkgKzEyOTAsMTEgQEAKIAl9IGVsc2UgaWYgKGNoaXAtPmlzX3Bib29rX0czKSB7CiAJCXN0cnVjdCBkZXZpY2Vfbm9kZSogbWlvOwogCQlmb3IgKG1pbyA9IGNoaXAtPm5vZGUtPnBhcmVudDsgbWlvOyBtaW8gPSBtaW8tPnBhcmVudCkgewotCQkJaWYgKHN0cmNtcChtaW8tPm5hbWUsICJtYWMtaW8iKSA9PSAwCi0JCQkgICAgJiYgbWlvLT5uX2FkZHJzID4gMCkgewotCQkJCWNoaXAtPm1hY2lvX2Jhc2UgPSBpb3JlbWFwKG1pby0+YWRkcnNbMF0uYWRkcmVzcywgMHg0MCk7CisJCQlpZiAoc3RyY21wKG1pby0+bmFtZSwgIm1hYy1pbyIpID09IDApIHsKKwkJCQlzdHJ1Y3QgcmVzb3VyY2UgcjsKKwkJCQlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShtaW8sIDAsICZyKSA9PSAwKQorCQkJCQljaGlwLT5tYWNpb19iYXNlID0KKwkJCQkJCWlvcmVtYXAoci5zdGFydCwgMHg0MCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy9wbWFjLmggYi9zb3VuZC9wcGMvcG1hYy5oCmluZGV4IDA4NmRhN2EuLjNhOWJkNGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BwYy9wbWFjLmgKKysrIGIvc291bmQvcHBjL3BtYWMuaApAQCAtMTEzLDcgKzExMyw4IEBACiAJdW5zaWduZWQgaW50IGluaXRpYWxpemVkIDogMTsKIAl1bnNpZ25lZCBpbnQgZmVhdHVyZV9pc19zZXQgOiAxOwogCi0JdW5zaWduZWQgaW50IG9mX3JlcXVlc3RlZDsKKwl1bnNpZ25lZCBpbnQgcmVxdWVzdGVkOworCXN0cnVjdCByZXNvdXJjZSByc3JjWzNdOwogCiAJaW50IG51bV9mcmVxczsKIAlpbnQgKmZyZXFfdGFibGU7CmRpZmYgLS1naXQgYS9zb3VuZC9zcGFyYy9jczQyMzEuYyBiL3NvdW5kL3NwYXJjL2NzNDIzMS5jCmluZGV4IGU5MDg2ZTkuLmZkNjU0MzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NwYXJjL2NzNDIzMS5jCisrKyBiL3NvdW5kL3NwYXJjL2NzNDIzMS5jCkBAIC02OSwxMyArNjksMTQgQEAKIH07CiAjZW5kaWYKIAorc3RydWN0IHNuZF9jczQyMzE7CiBzdHJ1Y3QgY3M0MjMxX2RtYV9jb250cm9sIHsKICAgICAgICAgdm9pZAkJKCpwcmVwYXJlKShzdHJ1Y3QgY3M0MjMxX2RtYV9jb250cm9sICpkbWFfY29udCwgaW50IGRpcik7CiAgICAgICAgIHZvaWQJCSgqZW5hYmxlKShzdHJ1Y3QgY3M0MjMxX2RtYV9jb250cm9sICpkbWFfY29udCwgaW50IG9uKTsKICAgICAgICAgaW50CQkoKnJlcXVlc3QpKHN0cnVjdCBjczQyMzFfZG1hX2NvbnRyb2wgKmRtYV9jb250LCBkbWFfYWRkcl90IGJ1c19hZGRyLCBzaXplX3QgbGVuKTsKICAgICAgICAgdW5zaWduZWQgaW50CSgqYWRkcmVzcykoc3RydWN0IGNzNDIzMV9kbWFfY29udHJvbCAqZG1hX2NvbnQpOwogICAgICAgICB2b2lkCQkoKnJlc2V0KShzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCk7IAotICAgICAgICB2b2lkCQkoKnByZWFsbG9jYXRlKShzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCwgc3RydWN0IHNuZF9zbmRfcGNtICpwY20pOyAKKyAgICAgICAgdm9pZAkJKCpwcmVhbGxvY2F0ZSkoc3RydWN0IHNuZF9jczQyMzEgKmNoaXAsIHN0cnVjdCBzbmRfcGNtICpwY20pOyAKICNpZmRlZiBFQlVTX1NVUFBPUlQKIAlzdHJ1Y3QJCWVidXNfZG1hX2luZm8JZWJ1c19pbmZvOwogI2VuZGlmCg==